[vistrails] 01/06: 2.1.1 upstream

Alastair McKinstry mckinstry at moszumanska.debian.org
Mon Jun 8 14:37:02 UTC 2015


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch master
in repository vistrails.

commit 395f559afbceba550813e58565b12f2fa2a81204
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Mon Jun 8 14:03:01 2015 +0100

    2.1.1 upstream
---
 LICENSE                                            |     27 +
 README.md                                          |     10 +
 RELEASE                                            |   2128 +
 contrib/NumSciPy/Array.py                          |    250 +
 contrib/NumSciPy/ArrayAccess.py                    |    342 +
 contrib/NumSciPy/ArrayConvert.py                   |    151 +
 contrib/NumSciPy/ArrayIO.py                        |    364 +
 contrib/NumSciPy/ArrayInterpolate.py               |    152 +
 contrib/NumSciPy/ArrayOperations.py                |    632 +
 contrib/NumSciPy/ArrayPlot.py                      |    638 +
 contrib/NumSciPy/ArrayUtilities.py                 |    254 +
 contrib/NumSciPy/DSP.py                            |    369 +
 contrib/NumSciPy/EnsembleOrdering.py               |    297 +
 contrib/NumSciPy/Filters.py                        |    185 +
 contrib/NumSciPy/Imaging.py                        |    193 +
 contrib/NumSciPy/Matrix.py                         |    107 +
 contrib/NumSciPy/MatrixUtilities.py                |     93 +
 contrib/NumSciPy/Stockwell.py                      |    763 +
 contrib/NumSciPy/__init__.py                       |    276 +
 contrib/NumSciPy/smt.py                            |     40 +
 contrib/ParaView/PVBase.py                         |     53 +
 contrib/ParaView/__init__.py                       |     22 +
 contrib/ParaView/configuration.py                  |      7 +
 contrib/ParaView/contour.vt                        |    Bin 0 -> 463580 bytes
 contrib/ParaView/init.py                           |    185 +
 contrib/ParaView/pv.vt                             |    Bin 0 -> 30902 bytes
 contrib/ParaView/pvcell.py                         |     83 +
 contrib/ParaView/pvconfig.py                       |     89 +
 contrib/SCIRun/__init__.py                         |   9001 ++
 contrib/SCIRun/cm2viewcell.py                      |    285 +
 contrib/SCIRun/renderbase.py                       |     10 +
 contrib/SCIRun/viewercell.py                       |    289 +
 contrib/SciPy/DSP.py                               |    150 +
 contrib/SciPy/Filters.py                           |    118 +
 contrib/SciPy/MatlabReader.py                      |     51 +
 contrib/SciPy/Matrix.py                            |    121 +
 contrib/SciPy/MatrixConvert.py                     |    150 +
 contrib/SciPy/MatrixInfo.py                        |     45 +
 contrib/SciPy/MatrixOperations.py                  |    139 +
 contrib/SciPy/SciPy.py                             |     36 +
 contrib/SciPy/__init__.py                          |    226 +
 contrib/TetGenBridge/CreateTestSurf.py             |    102 +
 contrib/TetGenBridge/Makefile                      |     19 +
 contrib/TetGenBridge/TetGen.py                     |    313 +
 contrib/TetGenBridge/__init__.py                   |     90 +
 contrib/TetGenBridge/pill.nodes                    |    150 +
 contrib/TetGenBridge/pill.tri                      |    295 +
 contrib/TetGenBridge/tetgen.i                      |    284 +
 contrib/cdat/NOTES                                 |     17 +
 contrib/cdat/__init__.py                           |  10094 ++
 contrib/cdat/cdat.sip                              |     36 +
 contrib/cdat/cdat.vt                               |    Bin 0 -> 2948 bytes
 contrib/cdat/cdat_cell.py                          |    291 +
 contrib/cdat/cdat_window.py                        |   2356 +
 contrib/cdat/configure.py                          |     72 +
 contrib/cdat/graphics_method_controller.py         |   1624 +
 contrib/cdat/gui_controller.py                     |    350 +
 contrib/cdat/pyqtscripting.sbf                     |      3 +
 contrib/cdat/quickplot.py                          |     50 +
 contrib/cdat/scripts/cdat_domain.py                |    289 +
 contrib/cdat/scripts/cdatwindow_init_inc.py        |     85 +
 contrib/cdat/scripts/gen_init.py                   |    267 +
 contrib/cdat/scripts/init_inc.py                   |     49 +
 contrib/cdat/scripts/old_cdat_init.py              |    447 +
 contrib/cdat/scripts/parse_cdat_xml_file.py        |    165 +
 contrib/cdat/scripts/xml/canvas.xml                |   2747 +
 contrib/cdat/scripts/xml/cdms2.xml                 |     26 +
 contrib/cdat/scripts/xml/cdmsFile.xml              |     23 +
 contrib/edu_utah_sci_cscheid_macet/MANIFEST        |      1 +
 contrib/edu_utah_sci_cscheid_macet/__init__.py     |    125 +
 contrib/edu_utah_sci_cscheid_metro/MANIFEST        |      2 +
 contrib/edu_utah_sci_cscheid_metro/__init__.py     |    158 +
 contrib/edu_utah_sci_cscheid_teem/__init__.py      |    909 +
 contrib/edu_utah_sci_cscheid_teem/examples.vt      |    Bin 0 -> 52295 bytes
 .../edu_utah_sci_eranders_proteindatabank/PDB.py   |    144 +
 .../__init__.py                                    |     68 +
 contrib/edu_utah_sci_vgc_afront/MANIFEST           |      1 +
 contrib/edu_utah_sci_vgc_afront/__init__.py        |    143 +
 contrib/itk/FeatureExtractionFilters.py            |    208 +
 contrib/itk/GradientFilters.py                     |     84 +
 contrib/itk/ITK.py                                 |    166 +
 contrib/itk/Image.py                               |     64 +
 contrib/itk/ImageReader.py                         |    169 +
 contrib/itk/IntensityFilters.py                    |    343 +
 contrib/itk/NeighborhoodFilters.py                 |    210 +
 contrib/itk/PixelType.py                           |     71 +
 contrib/itk/SegmentationFilters.py                 |    319 +
 contrib/itk/SelectionFilters.py                    |    231 +
 contrib/itk/SmoothingFilters.py                    |    558 +
 contrib/itk/ThresholdFilters.py                    |    110 +
 contrib/itk/__init__.py                            |    179 +
 contrib/itk/filter_generator.py                    |    170 +
 contrib/itk/itk_test_example.py                    |     42 +
 contrib/meshutils.py                               |    104 +
 contrib/mobile/__init__.py                         |    365 +
 contrib/pc3/__init__.py                            |    420 +
 contrib/pc3/info/__init__.py                       |      1 +
 contrib/pc3/info/ipaw/__init__.py                  |      1 +
 contrib/pc3/info/ipaw/pc3/LoadAppLogic.py          |    441 +
 contrib/pc3/info/ipaw/pc3/LoadConstants.py         |     19 +
 contrib/pc3/info/ipaw/pc3/LoadSql.py               |    147 +
 contrib/pc3/info/ipaw/pc3/LoadWorkflow.py          |    112 +
 contrib/pc3/info/ipaw/pc3/__init__.py              |      1 +
 contrib/pc3/workflow.vt                            |    Bin 0 -> 8944 bytes
 contrib/pc3/workflow_ifs.vt                        |    Bin 0 -> 23612 bytes
 contrib/pc3/workflow_log.xml                       |     74 +
 contrib/pc3/workflow_log_err.xml                   |     49 +
 contrib/pc3/workflow_opm.xml                       |   1379 +
 contrib/pc3/workflow_opm_err.xml                   |    756 +
 contrib/pc3/workflow_reg.xml                       |    330 +
 contrib/pc3/workflow_vt.xml                        |   1153 +
 contrib/pc3/workflow_wf.xml                        |    169 +
 contrib/poissonrecon.py                            |    101 +
 contrib/provenance/__init__.py                     |    274 +
 contrib/provenance2/__init__.py                    |    366 +
 contrib/sahm/ColorBreaks.csv                       |     18 +
 contrib/sahm/Images/BinMap.png                     |    Bin 0 -> 2627 bytes
 contrib/sahm/Images/BlackPoints.png                |    Bin 0 -> 11389 bytes
 contrib/sahm/Images/GreenPoints.png                |    Bin 0 -> 16370 bytes
 contrib/sahm/Images/MesMap.png                     |    Bin 0 -> 47294 bytes
 contrib/sahm/Images/ModMap.png                     |    Bin 0 -> 23896 bytes
 contrib/sahm/Images/ProbMap.png                    |    Bin 0 -> 377 bytes
 contrib/sahm/Images/RedPoints.png                  |    Bin 0 -> 17243 bytes
 contrib/sahm/Images/ResMap.png                     |    Bin 0 -> 7869 bytes
 contrib/sahm/Images/icons.pptx                     |    Bin 0 -> 79659 bytes
 contrib/sahm/SahmOutputViewer.py                   |    494 +
 contrib/sahm/SahmSpatialOutputViewer.py            |    483 +
 contrib/sahm/SahmSpatialViewerCell.py              |     89 +
 contrib/sahm/SahmViewerCell.py                     |     72 +
 contrib/sahm/SelectPredictorsLayers.py             |    428 +
 contrib/sahm/__init__.py                           |     14 +
 contrib/sahm/enum_modules.py                       |     11 +
 contrib/sahm/enum_widget.py                        |     44 +
 contrib/sahm/init.py                               |   1788 +
 contrib/sahm/layers.csv                            |    820 +
 contrib/sahm/layers.exampledata.csv                |      6 +
 contrib/sahm/maxent.csv                            |     33 +
 contrib/sahm/pySAHM/FieldDataQuery.py              |    385 +
 contrib/sahm/pySAHM/MDSBuilder.py                  |    473 +
 contrib/sahm/pySAHM/MaxentRunner.py                |    319 +
 contrib/sahm/pySAHM/PARC.py                        |    776 +
 contrib/sahm/pySAHM/RasterFormatConverter.py       |    204 +
 .../sahm/pySAHM/Resources/Docs/SAHM User Help.docx |    Bin 0 -> 907362 bytes
 .../sahm/pySAHM/Resources/R_Modules/AppendOut.r    |    170 +
 .../pySAHM/Resources/R_Modules/CompileOutput.r     |     12 +
 .../Resources/R_Modules/CrossValidationSplit.r     |     99 +
 .../sahm/pySAHM/Resources/R_Modules/EvalStats.r    |     25 +
 .../Resources/R_Modules/EvalStatsHelperFcts.r      |    122 +
 .../pySAHM/Resources/R_Modules/EvaluationStats.r   |    436 +
 .../pySAHM/Resources/R_Modules/FIT_BRT_pluggable.r |   2505 +
 .../pySAHM/Resources/R_Modules/FIT_GLM_pluggable.r |    775 +
 .../Resources/R_Modules/FIT_MARS_pluggable.r       |   1697 +
 .../pySAHM/Resources/R_Modules/FIT_RF_pluggable.r  |    649 +
 .../sahm/pySAHM/Resources/R_Modules/FunctionCall.r |     87 +
 .../pySAHM/Resources/R_Modules/LoadRequiredCode.r  |     16 +
 .../sahm/pySAHM/Resources/R_Modules/PairsExplore.r |    435 +
 .../pySAHM/Resources/R_Modules/PairsExplore2.r     |    430 +
 .../sahm/pySAHM/Resources/R_Modules/Pred.Surface.r |     54 +
 .../sahm/pySAHM/Resources/R_Modules/PredictModel.r |    331 +
 .../pySAHM/Resources/R_Modules/ResidualImage.r     |     42 +
 .../sahm/pySAHM/Resources/R_Modules/RunMaxEnt.jar  |    Bin 0 -> 9304308 bytes
 .../pySAHM/Resources/R_Modules/TestTrainRocPlot.r  |    372 +
 .../pySAHM/Resources/R_Modules/TestTrainSplit.r    |    188 +
 .../Resources/R_Modules/Testing/CallPairsPlot.r    |    114 +
 .../pySAHM/Resources/R_Modules/Testing/Debugging.r |    173 +
 .../pySAHM/Resources/R_Modules/Testing/Dickessel.r |    231 +
 .../Resources/R_Modules/Testing/QuickDebug.r       |     75 +
 .../R_Modules/Testing/RunTestTrainSplit.r          |    171 +
 .../pySAHM/Resources/R_Modules/Testing/RunTests.r  |    173 +
 .../Resources/R_Modules/Testing/SyntheticData.r    |     78 +
 .../R_Modules/Testing/TestCountModelRuns.r         |    186 +
 .../Resources/R_Modules/Testing/TestFunction2.r    |     23 +
 .../R_Modules/Testing/TestModelRuns (2).r          |    148 +
 .../Resources/R_Modules/Testing/TestModelRuns.r    |    174 +
 .../R_Modules/Testing/TestingRandomForest.r        |     17 +
 .../pySAHM/Resources/R_Modules/Testing/unit.test.r |     49 +
 .../sahm/pySAHM/Resources/R_Modules/check.libs.r   |     16 +
 contrib/sahm/pySAHM/Resources/R_Modules/make.auc.r |    136 +
 .../sahm/pySAHM/Resources/R_Modules/modalDialog.R  |     46 +
 .../sahm/pySAHM/Resources/R_Modules/proc.tiff.r    |    212 +
 contrib/sahm/pySAHM/Resources/R_Modules/read.ma.r  |    209 +
 .../sahm/pySAHM/Resources/R_Modules/read.maNew.r   |    224 +
 .../pySAHM/Resources/R_Modules/tmp_ThrowsError.r   |      1 +
 contrib/sahm/pySAHM/__init__.py                    |      0
 contrib/sahm/pySAHM/singlePARC.py                  |     71 +
 contrib/sahm/pySAHM/singleRasterFormatConverter.py |     73 +
 contrib/sahm/pySAHM/utilities.py                   |    261 +
 contrib/sahm/utils.py                              |    481 +
 contrib/sahm/widgets.py                            |    369 +
 contrib/stem/__init__.py                           |      6 +
 contrib/stem/code/STEM_Globals.R                   |    236 +
 contrib/stem/code/STEM_Globals.R.bkup              |    236 +
 contrib/stem/code/STEM_ModelFitting.R              |    201 +
 contrib/stem/code/STEM_erd.srd.data.subsetting.R   |    273 +
 contrib/stem/code/STEM_st.matrix.cv.average.R      |     95 +
 contrib/stem/code/predict.eBird.ST.matrix.R        |    200 +
 contrib/stem/code/stem.library.A.R                 |   2088 +
 contrib/stem/code/stem.library.B.R                 |   2124 +
 contrib/stem/code/stem.library.ST.R                |   2430 +
 contrib/stem/current.vt                            |    Bin 0 -> 83005 bytes
 contrib/stem/init.py                               |    646 +
 contrib/stem/mycurrent.vt                          |    Bin 0 -> 2882381 bytes
 contrib/stem/mycurrent2.vt                         |    Bin 0 -> 964975 bytes
 contrib/titan/__init__.py                          |     59 +
 contrib/titan/base_module.py                       |    203 +
 contrib/titan/class_tree.py                        |    268 +
 contrib/titan/fix_classes.py                       |     51 +
 contrib/titan/hasher.py                            |     36 +
 contrib/titan/init.py                              |   1132 +
 contrib/titan/inspectors.py                        |    232 +
 contrib/titan/offscreen.py                         |     62 +
 contrib/titan/tf_widget.py                         |    575 +
 contrib/titan/vtk_parser.py                        |    528 +
 contrib/titan/vtkcell.py                           |   1094 +
 contrib/titan/vtkcell_rc.py                        |    793 +
 contrib/titan/vtkhandler.py                        |    292 +
 contrib/titan/vtkviewcell.py                       |   1032 +
 contrib/trimesh2.py                                |    123 +
 contrib/vtksnl/__init__.py                         |     53 +
 contrib/vtksnl/base_module.py                      |    203 +
 contrib/vtksnl/class_tree.py                       |    268 +
 contrib/vtksnl/fix_classes.py                      |     51 +
 contrib/vtksnl/hasher.py                           |     36 +
 contrib/vtksnl/init.py                             |   1073 +
 contrib/vtksnl/inspectors.py                       |    231 +
 contrib/vtksnl/offscreen.py                        |     62 +
 contrib/vtksnl/tf_widget.py                        |    575 +
 contrib/vtksnl/vtk_parser.py                       |    514 +
 contrib/vtksnl/vtkcell.py                          |   1094 +
 contrib/vtksnl/vtkcell_rc.py                       |    793 +
 contrib/vtksnl/vtkhandler.py                       |    291 +
 contrib/vtksnl/vtkviewcell.py                      |   1032 +
 data/1n25.pdb                                      |   6334 +
 data/carotid.vtk                                   | 111734 ++++++++++++++++++
 data/gktbhFA.vtk                                   |    Bin 0 -> 864115 bytes
 data/gktbhL123.vtk                                 |    Bin 0 -> 864137 bytes
 data/head.120.vtk                                  |  91541 ++++++++++++++
 data/pdb.pdb                                       |   3025 +
 data/spx.vtk                                       |  31678 +++++
 data/torus.vtk                                     |  22046 ++++
 data/vslice_circ1.bp                               |    102 +
 doc/coding_conventions.txt                         |    149 +
 doc/custom_constants.txt                           |    118 +
 doc/dist/build_from_source_mac.txt                 |     62 +
 doc/dist/build_from_source_windows.txt             |    123 +
 doc/dist/instructions.txt                          |    188 +
 doc/dist/setup_build_system_mac.txt                |     55 +
 doc/dist/setup_build_system_windows.txt            |     61 +
 doc/module_registry.txt                            |     14 +
 doc/package_system.txt                             |     99 +
 doc/parameter_exploration.txt                      |     57 +
 doc/pep-0008.txt                                   |   1009 +
 doc/pep-0257.txt                                   |    328 +
 doc/signal_mess.txt                                |     49 +
 doc/source_tree_overview.tex                       |    102 +
 doc/usersguide/Makefile                            |     89 +
 doc/usersguide/_static/mystyle.css                 |      5 +
 doc/usersguide/analogies.rst                       |    142 +
 doc/usersguide/batch.rst                           |    381 +
 doc/usersguide/cfassistant.rst                     |    145 +
 doc/usersguide/cltools.rst                         |    264 +
 doc/usersguide/conf.py                             |    208 +
 doc/usersguide/controlflow.rst                     |    593 +
 doc/usersguide/controlflowdev.rst                  |    197 +
 doc/usersguide/creating.rst                        |    331 +
 doc/usersguide/database.rst                        |    176 +
 doc/usersguide/developer.rst                       |     16 +
 doc/usersguide/example.rst                         |     58 +
 doc/usersguide/example_guide.rst                   |    229 +
 doc/usersguide/example_itk.rst                     |    293 +
 doc/usersguide/example_webservices.rst             |    185 +
 doc/usersguide/figures/CLTools/import.png          |    Bin 0 -> 101160 bytes
 doc/usersguide/figures/CLTools/inputoutputfile.png |    Bin 0 -> 58710 bytes
 doc/usersguide/figures/CLTools/inputoutputport.png |    Bin 0 -> 50731 bytes
 doc/usersguide/figures/CLTools/visibility.png      |    Bin 0 -> 25008 bytes
 doc/usersguide/figures/CLTools/wizard.png          |    Bin 0 -> 122607 bytes
 doc/usersguide/figures/analogies/analogy_diff.png  |    Bin 0 -> 75869 bytes
 doc/usersguide/figures/analogies/analogy_dnd1.png  |    Bin 0 -> 88977 bytes
 doc/usersguide/figures/analogies/analogy_dnd2.png  |    Bin 0 -> 91080 bytes
 doc/usersguide/figures/analogies/analogy_menu.png  |    Bin 0 -> 30392 bytes
 doc/usersguide/figures/analogies/analogy_setup.png |    Bin 0 -> 55030 bytes
 .../figures/analogies/analogy_setup2.png           |    Bin 0 -> 81390 bytes
 .../figures/analogies/analogy_spreadsheet1.png     |    Bin 0 -> 49736 bytes
 .../figures/analogies/analogy_spreadsheet2.png     |    Bin 0 -> 66103 bytes
 doc/usersguide/figures/batch/create_alias.png      |    Bin 0 -> 24221 bytes
 doc/usersguide/figures/batch/offscreen_output.png  |    Bin 0 -> 16502 bytes
 .../figures/batch/offscreen_version_tree.png       |    Bin 0 -> 77506 bytes
 doc/usersguide/figures/cfassistant/assistant.png   |    Bin 0 -> 165201 bytes
 doc/usersguide/figures/cfassistant/enable_port.png |    Bin 0 -> 12718 bytes
 doc/usersguide/figures/cfassistant/pipeline.png    |    Bin 0 -> 10343 bytes
 doc/usersguide/figures/cfassistant/port_select.png |    Bin 0 -> 32775 bytes
 .../figures/cfassistant/port_select2.png           |    Bin 0 -> 62500 bytes
 doc/usersguide/figures/cfassistant/results.png     |    Bin 0 -> 21972 bytes
 .../figures/controlflow/AreaFilter_Workflow.png    |    Bin 0 -> 150113 bytes
 .../figures/controlflow/CalculateArea.png          |    Bin 0 -> 48087 bytes
 doc/usersguide/figures/controlflow/If_Example.png  |    Bin 0 -> 31828 bytes
 doc/usersguide/figures/controlflow/If_Group.png    |    Bin 0 -> 27096 bytes
 .../figures/controlflow/If_Spreadsheet_False.png   |    Bin 0 -> 11620 bytes
 .../figures/controlflow/If_Spreadsheet_True.png    |    Bin 0 -> 152890 bytes
 doc/usersguide/figures/controlflow/If_Workflow.png |    Bin 0 -> 30802 bytes
 .../figures/controlflow/If_Workflow_Group.png      |    Bin 0 -> 23708 bytes
 .../controlflow/MapAndFilter_Spreadsheet.png       |    Bin 0 -> 131263 bytes
 .../figures/controlflow/MapAndFilter_Workflow.png  |    Bin 0 -> 40986 bytes
 .../figures/controlflow/Map_Spreadsheet.png        |    Bin 0 -> 139064 bytes
 .../figures/controlflow/Map_Workflow.png           |    Bin 0 -> 40521 bytes
 .../figures/controlflow/Sum_Workflow.png           |    Bin 0 -> 146184 bytes
 doc/usersguide/figures/controlflow/andor.png       |    Bin 0 -> 22110 bytes
 doc/usersguide/figures/controlflow/gcd-grouped.png |    Bin 0 -> 25876 bytes
 doc/usersguide/figures/controlflow/gcd.png         |    Bin 0 -> 68010 bytes
 doc/usersguide/figures/creating/add_cylinder.png   |    Bin 0 -> 9341 bytes
 .../figures/creating/automatic_conversion.png      |    Bin 0 -> 12365 bytes
 .../creating/change_parameter_interface1.png       |    Bin 0 -> 32381 bytes
 .../creating/change_parameter_interface2.png       |    Bin 0 -> 32612 bytes
 doc/usersguide/figures/creating/cylinder1.png      |    Bin 0 -> 25247 bytes
 doc/usersguide/figures/creating/cylinder2.png      |    Bin 0 -> 38733 bytes
 .../cylinder_not_connected_but_quadric_deleted.png |    Bin 0 -> 6916 bytes
 doc/usersguide/figures/creating/delete_quadric.png |    Bin 0 -> 7982 bytes
 doc/usersguide/figures/creating/disconnect.png     |    Bin 0 -> 9778 bytes
 doc/usersguide/figures/creating/enabling_ports.png |    Bin 0 -> 41718 bytes
 doc/usersguide/figures/creating/globalassign.png   |    Bin 0 -> 9490 bytes
 doc/usersguide/figures/creating/globalcreate.png   |    Bin 0 -> 5905 bytes
 .../figures/creating/module_configuration.png      |    Bin 0 -> 14125 bytes
 .../creating/pipeline_screenshot_labeled.png       |    Bin 0 -> 248809 bytes
 .../creating/python_source_configuration.png       |    Bin 0 -> 37885 bytes
 .../figures/creating/python_source_instance.png    |    Bin 0 -> 52698 bytes
 .../figures/creating/python_source_module.png      |    Bin 0 -> 11479 bytes
 .../figures/creating/standard_output_module.png    |    Bin 0 -> 10689 bytes
 doc/usersguide/figures/database/create_dialog.png  |    Bin 0 -> 54504 bytes
 doc/usersguide/figures/database/open_dialog.png    |    Bin 0 -> 58212 bytes
 doc/usersguide/figures/database/save_dialog.png    |    Bin 0 -> 66250 bytes
 doc/usersguide/figures/example_itk/filtertypes.png |    Bin 0 -> 13621 bytes
 .../figures/example_itk/itk_slicingpipe.png        |    Bin 0 -> 245176 bytes
 .../figures/example_itk/package_structure.png      |    Bin 0 -> 8631 bytes
 doc/usersguide/figures/example_itk/pixeltypes.png  |    Bin 0 -> 9021 bytes
 .../figures/example_webservices/modules_list.png   |    Bin 0 -> 51686 bytes
 .../figures/example_webservices/only_modules.png   |    Bin 0 -> 26895 bytes
 .../figures/example_webservices/pythonsource.png   |    Bin 0 -> 83521 bytes
 .../example_webservices/version_tree_modules.png   |    Bin 0 -> 30732 bytes
 .../example_webservices/webservices_webform.png    |    Bin 0 -> 44983 bytes
 .../webservices_webform_result.png                 |    Bin 0 -> 77906 bytes
 .../figures/example_webservices/ws_preferences.png |    Bin 0 -> 188786 bytes
 .../figures/example_webservices/ws_spreadsheet.png |    Bin 0 -> 29912 bytes
 doc/usersguide/figures/getting_started/builder.png |    Bin 0 -> 164007 bytes
 .../getting_started/mac_post_uncompress_window.png |    Bin 0 -> 63085 bytes
 .../figures/getting_started/panel_buttons.png      |    Bin 0 -> 1772 bytes
 .../figures/getting_started/spreadsheet.png        |    Bin 0 -> 42549 bytes
 doc/usersguide/figures/getting_started/toolbar.png |    Bin 0 -> 28094 bytes
 .../windows_installation_wizard.png                |    Bin 0 -> 22003 bytes
 doc/usersguide/figures/grouping/grouping1.png      |    Bin 0 -> 50745 bytes
 doc/usersguide/figures/grouping/grouping2.png      |    Bin 0 -> 39627 bytes
 doc/usersguide/figures/grouping/grouping4.png      |    Bin 0 -> 41434 bytes
 doc/usersguide/figures/grouping/subworkflow.png    |    Bin 0 -> 234586 bytes
 .../figures/grouping/subworkflow_upgrade.png       |    Bin 0 -> 23709 bytes
 doc/usersguide/figures/latex/embedding.png         |    Bin 0 -> 92987 bytes
 doc/usersguide/figures/mashups/aliasconfig.png     |    Bin 0 -> 47347 bytes
 doc/usersguide/figures/mashups/background.png      |    Bin 0 -> 33480 bytes
 doc/usersguide/figures/mashups/mashupcomp.png      |    Bin 0 -> 116133 bytes
 doc/usersguide/figures/mashups/opacityalias.png    |    Bin 0 -> 50043 bytes
 doc/usersguide/figures/mashups/righttab.png        |    Bin 0 -> 60344 bytes
 doc/usersguide/figures/merging/postmerge.png       |    Bin 0 -> 55002 bytes
 doc/usersguide/figures/merging/premerge.png        |    Bin 0 -> 96138 bytes
 .../figures/packages/CustomColorShape1.png         |    Bin 0 -> 24759 bytes
 .../figures/packages/CustomColorShape2.png         |    Bin 0 -> 37161 bytes
 .../figures/packages/CustomColorShape3.png         |    Bin 0 -> 21399 bytes
 .../packages/afront_configuration_window.png       |    Bin 0 -> 21483 bytes
 .../figures/packages/after_enabled_package.png     |    Bin 0 -> 76559 bytes
 .../figures/packages/custom_documentation.png      |    Bin 0 -> 33260 bytes
 doc/usersguide/figures/packages/enable_package.png |    Bin 0 -> 31670 bytes
 doc/usersguide/figures/packages/package_menu.png   |    Bin 0 -> 23882 bytes
 .../figures/packages/pythoncalc_workflow.png       |    Bin 0 -> 158993 bytes
 .../parameter_exploration/annotated_pipeline.png   |    Bin 0 -> 51875 bytes
 .../parameter_exploration/direction_button_no.png  |    Bin 0 -> 1002 bytes
 .../direction_button_time.png                      |    Bin 0 -> 1131 bytes
 .../parameter_exploration/direction_button_x.png   |    Bin 0 -> 876 bytes
 .../parameter_exploration/direction_button_y.png   |    Bin 0 -> 890 bytes
 .../parameter_exploration/direction_button_z.png   |    Bin 0 -> 1154 bytes
 .../figures/parameter_exploration/fig6_1.png       |    Bin 0 -> 130189 bytes
 .../figures/parameter_exploration/fig6_10.png      |    Bin 0 -> 168190 bytes
 .../figures/parameter_exploration/fig6_11.png      |    Bin 0 -> 9511 bytes
 .../figures/parameter_exploration/fig6_12.png      |    Bin 0 -> 123067 bytes
 .../figures/parameter_exploration/fig6_2.png       |    Bin 0 -> 53801 bytes
 .../figures/parameter_exploration/fig6_3.png       |    Bin 0 -> 142449 bytes
 .../figures/parameter_exploration/fig6_4.png       |    Bin 0 -> 28751 bytes
 .../figures/parameter_exploration/fig6_5.png       |    Bin 0 -> 28233 bytes
 .../figures/parameter_exploration/fig6_6.png       |    Bin 0 -> 10115 bytes
 .../figures/parameter_exploration/fig6_7.png       |    Bin 0 -> 214029 bytes
 .../figures/parameter_exploration/fig6_8.png       |    Bin 0 -> 384013 bytes
 .../figures/parameter_exploration/fig6_9.png       |    Bin 0 -> 14197 bytes
 .../figures/parameter_exploration/list_edit.png    |    Bin 0 -> 11095 bytes
 .../figures/parameter_exploration/popup_menu.png   |    Bin 0 -> 4511 bytes
 .../figures/parameter_exploration/set_methods.png  |    Bin 0 -> 6678 bytes
 .../parameter_exploration/user_func_edit.png       |    Bin 0 -> 11309 bytes
 .../figures/parameter_exploration/virtual_cell.png |    Bin 0 -> 3508 bytes
 .../parameter_exploration/vtkImageResample.png     |    Bin 0 -> 54843 bytes
 doc/usersguide/figures/persistence/base.png        |    Bin 0 -> 26960 bytes
 doc/usersguide/figures/persistence/input.png       |    Bin 0 -> 10234 bytes
 .../figures/persistence/intermediate.png           |    Bin 0 -> 35945 bytes
 doc/usersguide/figures/persistence/output.png      |    Bin 0 -> 31794 bytes
 doc/usersguide/figures/persistence/reference.png   |    Bin 0 -> 84948 bytes
 doc/usersguide/figures/persistence/versions.png    |    Bin 0 -> 42233 bytes
 doc/usersguide/figures/provenance/browser.png      |    Bin 0 -> 229342 bytes
 doc/usersguide/figures/querying/query.png          |    Bin 0 -> 81505 bytes
 doc/usersguide/figures/querying/query2.png         |    Bin 0 -> 47426 bytes
 doc/usersguide/figures/querying/query3.png         |    Bin 0 -> 26372 bytes
 doc/usersguide/figures/querying/query4.png         |    Bin 0 -> 8323 bytes
 doc/usersguide/figures/querying/query_vtkActor.png |    Bin 0 -> 55323 bytes
 .../figures/querying/query_vtkActor90.png          |    Bin 0 -> 49397 bytes
 .../figures/querying/search_or_refine.png          |    Bin 0 -> 11660 bytes
 doc/usersguide/figures/querying/textquery.png      |    Bin 0 -> 49584 bytes
 .../figures/querying/workspace_results.png         |    Bin 0 -> 21268 bytes
 doc/usersguide/figures/spreadsheet/cell_states.png |    Bin 0 -> 232189 bytes
 .../figures/spreadsheet/editing_mode.png           |    Bin 0 -> 343075 bytes
 doc/usersguide/figures/spreadsheet/spreadsheet.png |    Bin 0 -> 528377 bytes
 .../spreadsheet/spreadsheet_cell_control.png       |    Bin 0 -> 192558 bytes
 .../spreadsheet/spreadsheet_editing_mode.png       |    Bin 0 -> 233535 bytes
 .../spreadsheet/spreadsheet_editing_mode_move.png  |    Bin 0 -> 254908 bytes
 .../figures/spreadsheet/spreadsheet_sync.png       |    Bin 0 -> 374970 bytes
 doc/usersguide/figures/tabledata/pipeline.png      |    Bin 0 -> 18432 bytes
 doc/usersguide/figures/tabledata/results.png       |    Bin 0 -> 121460 bytes
 doc/usersguide/figures/version_tree/collapsed.png  |    Bin 0 -> 109626 bytes
 .../figures/version_tree/collapsed_expanded.png    |    Bin 0 -> 147879 bytes
 .../figures/version_tree/creating_versions.png     |    Bin 0 -> 153710 bytes
 .../figures/version_tree/creating_versions_A.png   |    Bin 0 -> 99168 bytes
 .../figures/version_tree/creating_versions_B.png   |    Bin 0 -> 113628 bytes
 .../figures/version_tree/creating_versions_C.png   |    Bin 0 -> 113910 bytes
 doc/usersguide/figures/version_tree/expanded.png   |    Bin 0 -> 117253 bytes
 .../history_view_screenshot_labeled.png            |    Bin 0 -> 115446 bytes
 .../figures/version_tree/raw_pipeline.png          |    Bin 0 -> 23788 bytes
 .../figures/version_tree/visual_diff.png           |    Bin 0 -> 84039 bytes
 doc/usersguide/getting_started.rst                 |    412 +
 doc/usersguide/groups.rst                          |    108 +
 doc/usersguide/index.rst                           |     20 +
 doc/usersguide/intro.rst                           |      9 +
 doc/usersguide/intro2.rst                          |     85 +
 doc/usersguide/latex.rst                           |    260 +
 doc/usersguide/log.rst                             |     35 +
 doc/usersguide/make.bat                            |    113 +
 doc/usersguide/mashups.rst                         |    116 +
 doc/usersguide/merging.rst                         |     37 +
 doc/usersguide/packages.rst                        |   1177 +
 doc/usersguide/parallelflow.rst                    |     71 +
 doc/usersguide/parallelization.rst                 |     56 +
 doc/usersguide/parameter_exploration.rst           |    315 +
 doc/usersguide/persistence.rst                     |    165 +
 doc/usersguide/preface.rst                         |     45 +
 doc/usersguide/preliminary.rst                     |      4 +
 doc/usersguide/provenance.rst                      |     14 +
 doc/usersguide/pythoncalc.rst                      |    208 +
 doc/usersguide/querying.rst                        |    230 +
 doc/usersguide/spreadsheet.rst                     |    248 +
 doc/usersguide/tabledata.rst                       |     60 +
 doc/usersguide/version_tree.rst                    |    173 +
 doc/usersguide/vistrails_server.rst                |    124 +
 doc/usersguide/vtl/README                          |     21 +
 doc/usersguide/vtl/bikes.vtl                       |      1 +
 doc/usersguide/vtl/brain_vistrail.vtl              |      1 +
 doc/usersguide/vtl/cfassistant1.vtl                |      1 +
 doc/usersguide/vtl/cfassistant2.vtl                |      1 +
 doc/usersguide/vtl/global_variables1.vtl           |      1 +
 doc/usersguide/vtl/lung.vtl                        |      1 +
 doc/usersguide/vtl/mashups1.vtl                    |      1 +
 doc/usersguide/vtl/offscreen.vtl                   |      1 +
 doc/usersguide/vtl/pe1.vtl                         |      1 +
 doc/usersguide/vtl/pe2.vtl                         |      1 +
 doc/usersguide/vtl/pe3.vtl                         |      1 +
 doc/usersguide/vtl/pe4.vtl                         |      1 +
 doc/usersguide/vtl/protein_visualization.vtl       |      1 +
 doc/usersguide/vtl/spx.vtl                         |      1 +
 doc/usersguide/vtl/terminator.vtl                  |      1 +
 doc/usersguide/vtl/triangle_area.vtl               |      1 +
 doc/usersguide/vtl/vtk.vtl                         |      1 +
 doc/usersguide/vtl/vtk_book_3rd_p189.vtl           |      1 +
 doc/usersguide/vtl/vtk_http.vtl                    |      1 +
 doc/vistrails.xsd                                  |    127 +
 examples/EMBOSS_webservices.vt                     |    Bin 0 -> 224479 bytes
 examples/KEGGPathway.vt                            |    Bin 0 -> 57244 bytes
 examples/KEGG_SearchEntities_webservice.vt         |    Bin 0 -> 98916 bytes
 examples/KEGG_webservices.vt                       |    Bin 0 -> 11819 bytes
 examples/XSLTSample.xsl                            |     28 +
 examples/afront.xml                                |    803 +
 examples/bikes.vt                                  |    Bin 0 -> 5546 bytes
 examples/brain_vistrail.vt                         |    Bin 0 -> 192878 bytes
 examples/chebi_webservice.vt                       |    Bin 0 -> 62684 bytes
 examples/corie.xml                                 |   9009 ++
 examples/gcd.xml                                   |   1785 +
 examples/head.vt                                   |    Bin 0 -> 141372 bytes
 examples/infovis.vt                                |    Bin 0 -> 317911 bytes
 examples/lung.vt                                   |    Bin 0 -> 97255 bytes
 examples/matplotlib/Acorr_ex8.vt                   |    Bin 0 -> 30394 bytes
 examples/matplotlib/Arrow_ex9.vt                   |    Bin 0 -> 38170 bytes
 examples/matplotlib/Psd.vt                         |    Bin 0 -> 32554 bytes
 examples/matplotlib/ReadMe.txt                     |     23 +
 examples/matplotlib/annotate.vt                    |    Bin 0 -> 32689 bytes
 examples/matplotlib/axhspan_ex5.vt                 |    Bin 0 -> 42605 bytes
 examples/matplotlib/bar_ex1.vt                     |    Bin 0 -> 23030 bytes
 examples/matplotlib/cohere.vt                      |    Bin 0 -> 66159 bytes
 examples/matplotlib/contour.vt                     |    Bin 0 -> 50196 bytes
 examples/matplotlib/contourf.vt                    |    Bin 0 -> 38198 bytes
 examples/matplotlib/hist_ex1.vt                    |    Bin 0 -> 18911 bytes
 examples/matplotlib/line2d_ex4.vt                  |    Bin 0 -> 33181 bytes
 examples/matplotlib/line2d_ex7.vt                  |    Bin 0 -> 24972 bytes
 examples/matplotlib/lineplot_ex3.vt                |    Bin 0 -> 15631 bytes
 examples/matplotlib/pcolor.vt                      |    Bin 0 -> 91625 bytes
 examples/matplotlib/pie_ex1.vt                     |    Bin 0 -> 6486 bytes
 examples/matplotlib/polar_ex10.vt                  |    Bin 0 -> 102236 bytes
 examples/matplotlib/scatter.vt                     |    Bin 0 -> 38687 bytes
 examples/matplotlib/semilog.vt                     |    Bin 0 -> 57219 bytes
 examples/mummy.xml                                 |    552 +
 examples/noaa_webservices.vt                       |    Bin 0 -> 164260 bytes
 examples/offscreen.vt                              |    Bin 0 -> 38447 bytes
 examples/plot.vt                                   |    Bin 0 -> 22797 bytes
 examples/primes.xml                                |   2357 +
 examples/protein_visualization.vt                  |    Bin 0 -> 47099 bytes
 examples/r_stats.vt                                |    Bin 0 -> 28774 bytes
 examples/scripting/README                          |     11 +
 examples/scripting/brain_from_script.vt            |    Bin 0 -> 5069 bytes
 examples/scripting/brain_script.py                 |    110 +
 examples/scripting/combined_script.py              |    215 +
 examples/scripting/vtk_book_3rd_p189_script.py     |    114 +
 examples/spx.vt                                    |    Bin 0 -> 35614 bytes
 examples/structure_or_id_webservice.vt             |    Bin 0 -> 24628 bytes
 examples/terminator.vt                             |    Bin 0 -> 678956 bytes
 examples/triangle_area.vt                          |    Bin 0 -> 71991 bytes
 examples/usersguide/cfassistant.vt                 |    Bin 0 -> 32336 bytes
 examples/usersguide/global_variables.vt            |    Bin 0 -> 53098 bytes
 examples/usersguide/mashups.vt                     |    Bin 0 -> 540420 bytes
 examples/usersguide/parameter_exploration.vt       |    Bin 0 -> 43687 bytes
 examples/vtk.vt                                    |    Bin 0 -> 113930 bytes
 examples/vtk_book_3rd_p189.vt                      |    Bin 0 -> 21858 bytes
 examples/vtk_book_3rd_p193.vt                      |    Bin 0 -> 21068 bytes
 examples/vtk_examples/Annotation/TestText.py       |     56 +
 examples/vtk_examples/Annotation/TestText.vt       |    Bin 0 -> 53644 bytes
 examples/vtk_examples/Annotation/cubeAxes.py       |    118 +
 examples/vtk_examples/Annotation/cubeAxes.vt       |    Bin 0 -> 36339 bytes
 examples/vtk_examples/Annotation/textOrigin.py     |     52 +
 examples/vtk_examples/Annotation/textOrigin.vt     |    Bin 0 -> 48149 bytes
 examples/vtk_examples/Annotation/xyPlot.py         |    195 +
 examples/vtk_examples/Annotation/xyPlot.vt         |    Bin 0 -> 7438 bytes
 examples/vtk_examples/DataManipulation/Arrays.py   |     89 +
 examples/vtk_examples/DataManipulation/Arrays.vt   |    Bin 0 -> 23209 bytes
 .../vtk_examples/DataManipulation/BuildUGrid.py    |    386 +
 .../vtk_examples/DataManipulation/BuildUGrid.vt    |    Bin 0 -> 64924 bytes
 .../vtk_examples/DataManipulation/CreateStrip.py   |     59 +
 .../vtk_examples/DataManipulation/CreateStrip.vt   |    Bin 0 -> 10998 bytes
 examples/vtk_examples/DataManipulation/marching.py |    215 +
 examples/vtk_examples/DataManipulation/marching.vt |    Bin 0 -> 31211 bytes
 .../DataManipulation/pointToCellData.py            |     99 +
 .../DataManipulation/pointToCellData.vt            |    Bin 0 -> 3699 bytes
 examples/vtk_examples/GUI/ImplicitPlaneWidget.py   |     80 +
 examples/vtk_examples/GUI/ImplicitPlaneWidget.vt   |    Bin 0 -> 42240 bytes
 examples/vtk_examples/GUI/ProbeWithPointWidget.py  |    102 +
 examples/vtk_examples/GUI/ProbeWithPointWidget.vt  |    Bin 0 -> 33135 bytes
 .../vtk_examples/GUI/ProbingWithPlaneWidget.py     |     88 +
 .../vtk_examples/GUI/ProbingWithPlaneWidget.vt     |    Bin 0 -> 17271 bytes
 .../vtk_examples/GUI/StreamlinesWithLineWidget.py  |    139 +
 .../vtk_examples/GUI/StreamlinesWithLineWidget.vt  |    Bin 0 -> 5163 bytes
 .../vtk_examples/GUI/TransformWithBoxWidget.py     |     65 +
 .../vtk_examples/GUI/TransformWithBoxWidget.vt     |    Bin 0 -> 22673 bytes
 .../vtk_examples/GUI/VolumeRenderWithBoxWidget.py  |    127 +
 .../vtk_examples/GUI/VolumeRenderWithBoxWidget.vt  |    Bin 0 -> 44799 bytes
 examples/vtk_examples/IO/flamingo.py               |     56 +
 examples/vtk_examples/IO/flamingo.vt               |    Bin 0 -> 1187 bytes
 examples/vtk_examples/IO/stl.py                    |     42 +
 examples/vtk_examples/IO/stl.vt                    |    Bin 0 -> 1699 bytes
 .../vtk_examples/ImageProcessing/Contours2D.py     |     75 +
 .../vtk_examples/ImageProcessing/Contours2D.vt     |    Bin 0 -> 2638 bytes
 examples/vtk_examples/Medical/Medical1.py          |     93 +
 examples/vtk_examples/Medical/Medical1.vt          |    Bin 0 -> 2587 bytes
 examples/vtk_examples/Medical/Medical2.py          |    119 +
 examples/vtk_examples/Medical/Medical2.vt          |    Bin 0 -> 3496 bytes
 examples/vtk_examples/Medical/Medical3.py          |    196 +
 examples/vtk_examples/Medical/Medical3.vt          |    Bin 0 -> 13974 bytes
 examples/vtk_examples/Modelling/PerlinTerrain.py   |     67 +
 examples/vtk_examples/Modelling/PerlinTerrain.vt   |    Bin 0 -> 29271 bytes
 .../vtk_examples/Modelling/constrainedDelaunay.py  |    150 +
 .../vtk_examples/Modelling/constrainedDelaunay.vt  |    Bin 0 -> 21576 bytes
 examples/vtk_examples/Modelling/faultLines.py      |     71 +
 examples/vtk_examples/Modelling/faultLines.vt      |    Bin 0 -> 7990 bytes
 examples/vtk_examples/Modelling/hello.py           |     64 +
 examples/vtk_examples/Modelling/hello.vt           |    Bin 0 -> 2935 bytes
 examples/vtk_examples/Modelling/iceCream.py        |     95 +
 examples/vtk_examples/Modelling/iceCream.vt        |    Bin 0 -> 22085 bytes
 examples/vtk_examples/Rendering/CADPart.py         |     57 +
 examples/vtk_examples/Rendering/CADPart.vt         |    Bin 0 -> 1932 bytes
 examples/vtk_examples/Rendering/Cylinder.py        |     56 +
 examples/vtk_examples/Rendering/Cylinder.vt        |    Bin 0 -> 1636 bytes
 examples/vtk_examples/Rendering/FilterCADPart.py   |     66 +
 examples/vtk_examples/Rendering/FilterCADPart.vt   |    Bin 0 -> 2053 bytes
 examples/vtk_examples/Rendering/TPlane.py          |     47 +
 examples/vtk_examples/Rendering/TPlane.vt          |    Bin 0 -> 1942 bytes
 examples/vtk_examples/Rendering/assembly.py        |     83 +
 examples/vtk_examples/Rendering/assembly.vt        |    Bin 0 -> 3422 bytes
 examples/vtk_examples/Rendering/rainbow.py         |     93 +
 examples/vtk_examples/Rendering/rainbow.vt         |    Bin 0 -> 7840 bytes
 examples/vtk_examples/Tutorial/Step1/Cone.py       |     72 +
 examples/vtk_examples/Tutorial/Step1/Cone.vt       |    Bin 0 -> 1333 bytes
 examples/vtk_examples/Tutorial/Step2/Cone2.py      |     58 +
 examples/vtk_examples/Tutorial/Step2/Cone2.vt      |    Bin 0 -> 1343 bytes
 examples/vtk_examples/Tutorial/Step3/Cone3.py      |     83 +
 examples/vtk_examples/Tutorial/Step3/Cone3.vt      |    Bin 0 -> 1797 bytes
 examples/vtk_examples/Tutorial/Step4/Cone4.py      |     93 +
 examples/vtk_examples/Tutorial/Step4/Cone4.vt      |    Bin 0 -> 2006 bytes
 examples/vtk_examples/Tutorial/Step5/Cone5.py      |     93 +
 examples/vtk_examples/Tutorial/Step5/Cone5.vt      |    Bin 0 -> 1453 bytes
 examples/vtk_examples/Tutorial/Step6/Cone6.py      |    117 +
 examples/vtk_examples/Tutorial/Step6/Cone6.vt      |    Bin 0 -> 1933 bytes
 .../VisualizationAlgorithms/BandContourTerrain.py  |    149 +
 .../VisualizationAlgorithms/BandContourTerrain.vt  |    Bin 0 -> 13581 bytes
 .../VisualizationAlgorithms/ClipCow.py             |    120 +
 .../VisualizationAlgorithms/ClipCow.vt             |    Bin 0 -> 3858 bytes
 .../VisualizationAlgorithms/ColorIsosurface.py     |     77 +
 .../VisualizationAlgorithms/ColorIsosurface.vt     |    Bin 0 -> 79689 bytes
 .../VisualizationAlgorithms/CutCombustor.py        |     79 +
 .../VisualizationAlgorithms/CutCombustor.vt        |    Bin 0 -> 3835 bytes
 .../VisualizationAlgorithms/ExtractGeometry.py     |     73 +
 .../VisualizationAlgorithms/ExtractGeometry.vt     |    Bin 0 -> 3010 bytes
 .../VisualizationAlgorithms/ExtractUGrid.py        |     92 +
 .../VisualizationAlgorithms/ExtractUGrid.vt        |    Bin 0 -> 3348 bytes
 .../GenerateTextureCoords.py                       |     65 +
 .../GenerateTextureCoords.vt                       |    Bin 0 -> 2122 bytes
 .../VisualizationAlgorithms/SubsampleGrid.py       |     67 +
 .../VisualizationAlgorithms/SubsampleGrid.vt       |    Bin 0 -> 2977 bytes
 .../VisualizationAlgorithms/TextureThreshold.py    |    136 +
 .../VisualizationAlgorithms/TextureThreshold.vt    |    Bin 0 -> 5963 bytes
 .../VisualizationAlgorithms/VisQuad.py             |     59 +
 .../VisualizationAlgorithms/VisQuad.vt             |    Bin 0 -> 2173 bytes
 .../VisualizationAlgorithms/imageWarp.py           |     58 +
 .../VisualizationAlgorithms/imageWarp.vt           |    Bin 0 -> 2310 bytes
 .../VisualizationAlgorithms/officeTube.py          |    312 +
 .../VisualizationAlgorithms/officeTube.vt          |    Bin 0 -> 35362 bytes
 .../VisualizationAlgorithms/officeTubes.py         |    320 +
 .../VisualizationAlgorithms/officeTubes.vt         |    Bin 0 -> 35666 bytes
 .../VisualizationAlgorithms/probeComb.py           |    123 +
 .../VisualizationAlgorithms/probeComb.vt           |    Bin 0 -> 30837 bytes
 .../VisualizationAlgorithms/smoothFran.py          |     55 +
 .../VisualizationAlgorithms/smoothFran.vt          |    Bin 0 -> 2500 bytes
 .../vtk_examples/VisualizationAlgorithms/spikeF.py |     82 +
 .../vtk_examples/VisualizationAlgorithms/spikeF.vt |    Bin 0 -> 2970 bytes
 .../VisualizationAlgorithms/streamSurface.py       |     81 +
 .../VisualizationAlgorithms/streamSurface.vt       |    Bin 0 -> 3386 bytes
 .../VisualizationAlgorithms/warpComb.py            |     91 +
 .../VisualizationAlgorithms/warpComb.vt            |    Bin 0 -> 3848 bytes
 .../VolumeRendering/PseudoVolumeRendering.py       |    122 +
 .../VolumeRendering/PseudoVolumeRendering.vt       |    Bin 0 -> 4686 bytes
 .../vtk_examples/VolumeRendering/SimpleRayCast.py  |     66 +
 .../vtk_examples/VolumeRendering/SimpleRayCast.vt  |    Bin 0 -> 2471 bytes
 .../VolumeRendering/SimpleTextureMap2D.py          |     60 +
 .../VolumeRendering/SimpleTextureMap2D.vt          |    Bin 0 -> 2241 bytes
 examples/vtk_http.vt                               |    Bin 0 -> 20730 bytes
 extensions/http/README                             |     11 +
 extensions/http/config.php.sample                  |     82 +
 extensions/http/get_db_vistrail_list.php           |     82 +
 extensions/http/get_vt_xml.php                     |     89 +
 extensions/http/get_wf_pdf.php                     |    137 +
 extensions/http/get_wf_xml.php                     |    118 +
 extensions/http/run_vistrails.php                  |    270 +
 extensions/latex/Makefile                          |     16 +
 extensions/latex/README                            |     91 +
 extensions/latex/crowdlabs.sty                     |    105 +
 extensions/latex/example.pdf                       |    Bin 0 -> 459771 bytes
 extensions/latex/example.tex                       |    246 +
 extensions/latex/example2.bib                      |   3654 +
 extensions/latex/example2.pdf                      |    Bin 0 -> 1169718 bytes
 extensions/latex/example2.tex                      |    218 +
 extensions/latex/fig1.png                          |    Bin 0 -> 863965 bytes
 extensions/latex/fig2.png                          |    Bin 0 -> 152066 bytes
 extensions/latex/find.cmd                          |     59 +
 extensions/latex/head.pdf                          |    Bin 0 -> 133722 bytes
 extensions/latex/head.tex                          |    143 +
 extensions/latex/head.vt                           |    Bin 0 -> 245975 bytes
 extensions/latex/includecrowdlabs.py               |    434 +
 extensions/latex/includevistrail.py                |   1503 +
 extensions/latex/vistrails.sty                     |    187 +
 extensions/mediawiki/README                        |     18 +
 extensions/mediawiki/download.php                  |    138 +
 extensions/mediawiki/functions.php                 |     81 +
 extensions/mediawiki/vistrailsExtension.php        |    271 +
 scripts/build_usersguide.py                        |    169 +
 scripts/convert_files/convert_files.sh             |     57 +
 scripts/convert_files/fix_file.py                  |     53 +
 scripts/create_release_wiki_table.py               |     90 +
 scripts/create_server_media_dir_structure.py       |     99 +
 scripts/db_utils.py                                |    114 +
 scripts/delete_from_db.py                          |     57 +
 scripts/diff_package.py                            |    101 +
 scripts/extract.py                                 |     58 +
 scripts/force_start_vistrails.py                   |     64 +
 scripts/force_start_vistrails_nonohup.py           |     64 +
 scripts/gen_vtk_examples/README                    |     67 +
 scripts/gen_vtk_examples/check_diffs.py            |     78 +
 scripts/gen_vtk_examples/colors.py                 |    251 +
 scripts/gen_vtk_examples/convert_to_vt.py          |     98 +
 scripts/gen_vtk_examples/copy_vtk_examples.py      |     99 +
 scripts/gen_vtk_examples/examples_list.txt         |     83 +
 scripts/gen_vtk_examples/gen_vtk_examples.py       |     50 +
 scripts/gen_vtk_examples/get_vtk_examples.py       |     80 +
 scripts/gen_vtk_examples/vtk_imposter.py           |    106 +
 scripts/gen_vtk_examples/vtk_to_vt.py              |   1117 +
 scripts/mac_update_bin.sh                          |     88 +
 scripts/merge_vistrails.py                         |     66 +
 scripts/module_appearance/main.py                  |    280 +
 scripts/module_appearance/module_appearance.py     |    109 +
 scripts/module_appearance/module_appearance.ui     |    104 +
 scripts/opm/opm2dot.py                             |    185 +
 scripts/release_notes.py                           |    326 +
 scripts/restart-vistrails-server.sh                |     40 +
 scripts/run_vistrails_batch_xvfb.sh                |     83 +
 scripts/sql_delete.py                              |     80 +
 scripts/sql_to_xml.py                              |     55 +
 scripts/start_vistrails.sh                         |     82 +
 scripts/start_vistrails_xvfb.sh                    |    109 +
 scripts/system_info.py                             |     86 +
 scripts/unzip_vistrail.sh                          |     42 +
 scripts/update_copyright_year.py                   |     73 +
 scripts/update_db.py                               |    115 +
 scripts/update_email_contact.py                    |     37 +
 scripts/update_hash.py                             |     30 +
 scripts/update_to_mod_bsd_license.py               |    292 +
 scripts/update_vistrails_command.py                |     63 +
 scripts/watch_vistrail_servers.py                  |    167 +
 scripts/win_update_bin.sh                          |     62 +
 vistrails/__init__.py                              |     37 +
 vistrails/api/__init__.py                          |    378 +
 vistrails/core/__init__.py                         |     41 +
 vistrails/core/analogy/__init__.py                 |    456 +
 vistrails/core/analogy/eigen.py                    |    566 +
 vistrails/core/analogy/pipeline_utils.py           |     66 +
 vistrails/core/api.py                              |    572 +
 vistrails/core/application.py                      |    833 +
 vistrails/core/bundles/__init__.py                 |     40 +
 vistrails/core/bundles/installbundle.py            |     44 +
 vistrails/core/bundles/pyimport.py                 |     92 +
 vistrails/core/cache/__init__.py                   |     35 +
 vistrails/core/cache/hasher.py                     |    130 +
 vistrails/core/cache/utils.py                      |     51 +
 vistrails/core/collection/__init__.py              |    391 +
 vistrails/core/collection/entity.py                |    119 +
 vistrails/core/collection/mashup.py                |    109 +
 vistrails/core/collection/parameter_exploration.py |    100 +
 vistrails/core/collection/schema.sql               |     37 +
 vistrails/core/collection/search.py                |    670 +
 vistrails/core/collection/test.db                  |    Bin 0 -> 172032 bytes
 vistrails/core/collection/thumbnail.py             |     72 +
 vistrails/core/collection/vistrail.py              |    526 +
 vistrails/core/collection/workflow.py              |    109 +
 vistrails/core/collection/workflow_exec.py         |     70 +
 vistrails/core/command_line.py                     |    101 +
 vistrails/core/common.py                           |     43 +
 vistrails/core/configuration.py                    |    358 +
 vistrails/core/console_mode.py                     |    395 +
 vistrails/core/data_structures/__init__.py         |     44 +
 vistrails/core/data_structures/bijectivedict.py    |    123 +
 vistrails/core/data_structures/graph.py            |   1135 +
 vistrails/core/data_structures/point.py            |    199 +
 vistrails/core/data_structures/queue.py            |    232 +
 vistrails/core/data_structures/rect.py             |    148 +
 vistrails/core/data_structures/stack.py            |    103 +
 vistrails/core/db/__init__.py                      |     35 +
 vistrails/core/db/action.py                        |     76 +
 vistrails/core/db/io.py                            |    226 +
 vistrails/core/db/locator.py                       |    760 +
 vistrails/core/debug.py                            |    314 +
 vistrails/core/external_connection.py              |    350 +
 vistrails/core/inspector.py                        |    247 +
 vistrails/core/interpreter/__init__.py             |     35 +
 vistrails/core/interpreter/base.py                 |    240 +
 vistrails/core/interpreter/cached.py               |    834 +
 vistrails/core/interpreter/default.py              |     82 +
 vistrails/core/interpreter/noncached.py            |     69 +
 vistrails/core/interpreter/utils.py                |     42 +
 vistrails/core/keychain.py                         |    276 +
 vistrails/core/layout/__init__.py                  |     35 +
 vistrails/core/layout/tree_layout.py               |    459 +
 vistrails/core/layout/version_tree_layout.py       |    203 +
 vistrails/core/layout/workflow_layout.py           |    774 +
 vistrails/core/log/__init__.py                     |     35 +
 vistrails/core/log/controller.py                   |    362 +
 vistrails/core/log/group_exec.py                   |    104 +
 vistrails/core/log/log.py                          |    103 +
 vistrails/core/log/loop_exec.py                    |     88 +
 vistrails/core/log/machine.py                      |    104 +
 vistrails/core/log/module_exec.py                  |     97 +
 vistrails/core/log/opm_graph.py                    |     88 +
 vistrails/core/log/prov_document.py                |     85 +
 vistrails/core/log/workflow_exec.py                |    106 +
 vistrails/core/mashup/__init__.py                  |    130 +
 vistrails/core/mashup/action.py                    |    194 +
 vistrails/core/mashup/action_annotation.py         |    176 +
 vistrails/core/mashup/alias.py                     |    164 +
 vistrails/core/mashup/component.py                 |    325 +
 vistrails/core/mashup/controller.py                |    346 +
 vistrails/core/mashup/mashup.py                    |    324 +
 vistrails/core/mashup/mashup_trail.py              |    271 +
 vistrails/core/modules/__init__.py                 |     35 +
 vistrails/core/modules/abstraction.py              |    180 +
 vistrails/core/modules/basic_modules.py            |   1710 +
 vistrails/core/modules/constant_configuration.py   |     44 +
 vistrails/core/modules/module_configure.py         |     44 +
 vistrails/core/modules/module_descriptor.py        |    404 +
 vistrails/core/modules/module_registry.py          |   2001 +
 vistrails/core/modules/module_utils.py             |    167 +
 vistrails/core/modules/package.py                  |    765 +
 vistrails/core/modules/paramexplore.py             |    250 +
 vistrails/core/modules/python_source_configure.py  |     44 +
 vistrails/core/modules/query_configuration.py      |     44 +
 vistrails/core/modules/source_configure.py         |     44 +
 vistrails/core/modules/sub_module.py               |    496 +
 vistrails/core/modules/tuple_configuration.py      |     44 +
 vistrails/core/modules/utils.py                    |    228 +
 vistrails/core/modules/vistrails_module.py         |    752 +
 vistrails/core/packagemanager.py                   |    932 +
 vistrails/core/packagerepository.py                |    187 +
 vistrails/core/param_explore.py                    |    263 +
 vistrails/core/paramexplore/__init__.py            |     35 +
 vistrails/core/paramexplore/function.py            |    201 +
 vistrails/core/paramexplore/param.py               |    170 +
 vistrails/core/paramexplore/paramexplore.py        |    325 +
 vistrails/core/publishing/__init__.py              |     35 +
 vistrails/core/publishing/parse_latex.py           |    170 +
 vistrails/core/query/__init__.py                   |    565 +
 vistrails/core/query/combined.py                   |     81 +
 vistrails/core/query/multiple.py                   |     78 +
 vistrails/core/query/version.py                    |    695 +
 vistrails/core/query/visual.py                     |    239 +
 vistrails/core/recent_vistrails.py                 |    111 +
 vistrails/core/repository/__init__.py              |     36 +
 vistrails/core/repository/poster/__init__.py       |     67 +
 vistrails/core/repository/poster/encode.py         |    469 +
 vistrails/core/repository/poster/streaminghttp.py  |    255 +
 vistrails/core/requirements.py                     |     94 +
 vistrails/core/resources/default_vistrails_startup |    204 +
 .../core/resources/default_vistrails_startup_xml   |     70 +
 vistrails/core/resources/spawned_startup_xml       |     42 +
 vistrails/core/startup.py                          |    598 +
 vistrails/core/system/__init__.py                  |    453 +
 vistrails/core/system/linux.py                     |    208 +
 vistrails/core/system/mac_site.py                  |     95 +
 vistrails/core/system/osx.py                       |    290 +
 vistrails/core/system/unix.py                      |    125 +
 vistrails/core/system/windows.py                   |    250 +
 vistrails/core/theme.py                            |    118 +
 vistrails/core/thumbnails.py                       |    291 +
 vistrails/core/upgradeworkflow.py                  |    578 +
 vistrails/core/utils/__init__.py                   |    644 +
 vistrails/core/utils/color.py                      |    452 +
 vistrails/core/utils/enum.py                       |    142 +
 vistrails/core/utils/expression.py                 |     82 +
 vistrails/core/utils/gcutils.py                    |     73 +
 vistrails/core/utils/lockmethod.py                 |     99 +
 vistrails/core/utils/timemethod.py                 |     57 +
 vistrails/core/utils/tracemethod.py                |    176 +
 vistrails/core/utils/uxml.py                       |    246 +
 vistrails/core/vistrail/__init__.py                |     35 +
 vistrails/core/vistrail/abstraction.py             |    198 +
 vistrails/core/vistrail/action.py                  |    280 +
 vistrails/core/vistrail/action_annotation.py       |    144 +
 vistrails/core/vistrail/annotation.py              |    136 +
 vistrails/core/vistrail/connection.py              |    408 +
 vistrails/core/vistrail/controller.py              |   3891 +
 vistrails/core/vistrail/group.py                   |    344 +
 vistrails/core/vistrail/location.py                |    199 +
 vistrails/core/vistrail/module.py                  |    526 +
 vistrails/core/vistrail/module_function.py         |    300 +
 vistrails/core/vistrail/module_param.py            |    403 +
 vistrails/core/vistrail/operation.py               |    413 +
 vistrails/core/vistrail/pipeline.py                |   1698 +
 vistrails/core/vistrail/plugin_data.py             |    101 +
 vistrails/core/vistrail/port.py                    |    303 +
 vistrails/core/vistrail/port_spec.py               |    522 +
 vistrails/core/vistrail/port_spec_item.py          |    219 +
 vistrails/core/vistrail/tag.py                     |    121 +
 vistrails/core/vistrail/vistrail.py                |   1382 +
 vistrails/core/vistrail/vistrailvariable.py        |    135 +
 vistrails/db/__init__.py                           |     45 +
 vistrails/db/bin/README                            |     27 +
 vistrails/db/bin/__init__.py                       |     36 +
 vistrails/db/bin/auto_gen_objects.py               |    417 +
 vistrails/db/bin/generate.py                       |    382 +
 vistrails/db/bin/parser.py                         |    130 +
 vistrails/db/bin/sql_gen_objects.py                |    242 +
 vistrails/db/bin/templates/domain.py.mako          |    504 +
 vistrails/db/bin/templates/sql.py.mako             |    306 +
 vistrails/db/bin/templates/sql_delete.sql.mako     |     42 +
 vistrails/db/bin/templates/sql_schema.sql.mako     |     77 +
 vistrails/db/bin/templates/xml.py.mako             |    228 +
 vistrails/db/bin/templates/xml_schema.xsd.mako     |    103 +
 vistrails/db/bin/xml_gen_objects.py                |    208 +
 vistrails/db/domain/__init__.py                    |     35 +
 vistrails/db/persistence/__init__.py               |     35 +
 vistrails/db/services/__init__.py                  |     36 +
 vistrails/db/services/abstraction.py               |     57 +
 vistrails/db/services/action.py                    |    174 +
 vistrails/db/services/action_chain.py              |    128 +
 vistrails/db/services/io.py                        |   1905 +
 vistrails/db/services/locator.py                   |   1235 +
 vistrails/db/services/log.py                       |     45 +
 vistrails/db/services/opm.py                       |    780 +
 vistrails/db/services/prov.py                      |    585 +
 vistrails/db/services/query.py                     |    262 +
 vistrails/db/services/registry.py                  |     48 +
 vistrails/db/services/vistrail.py                  |   1354 +
 vistrails/db/services/workflow.py                  |     42 +
 vistrails/db/specs/all.xml                         |   3823 +
 vistrails/db/tests/__init__.py                     |     35 +
 vistrails/db/tests/setup_db_tables.py              |     65 +
 vistrails/db/tests/sql_to_xml.py                   |     69 +
 vistrails/db/tests/xml_to_sql.py                   |     69 +
 vistrails/db/versions/__init__.py                  |    165 +
 vistrails/db/versions/v0_3_0/__init__.py           |     36 +
 vistrails/db/versions/v0_3_0/domain/__init__.py    |     36 +
 vistrails/db/versions/v0_3_0/domain/auto_gen.py    |    876 +
 .../db/versions/v0_3_0/persistence/__init__.py     |     53 +
 .../db/versions/v0_3_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_3_0/persistence/xml/auto_gen.py |    638 +
 vistrails/db/versions/v0_3_0/persistence/xml/io.py |     95 +
 .../db/versions/v0_3_0/persistence/xml/xml_dao.py  |     77 +
 .../db/versions/v0_3_0/schemas/xml/vistrail.xsd    |    161 +
 vistrails/db/versions/v0_3_0/specs/action.xml      |    101 +
 .../db/versions/v0_3_0/specs/addConnection.xml     |     68 +
 vistrails/db/versions/v0_3_0/specs/addModule.xml   |     60 +
 .../db/versions/v0_3_0/specs/addModulePort.xml     |     56 +
 .../db/versions/v0_3_0/specs/changeAnnotation.xml  |     52 +
 .../db/versions/v0_3_0/specs/changeParameter.xml   |     72 +
 .../db/versions/v0_3_0/specs/deleteAnnotation.xml  |     48 +
 .../db/versions/v0_3_0/specs/deleteConnection.xml  |     44 +
 .../db/versions/v0_3_0/specs/deleteFunction.xml    |     48 +
 .../db/versions/v0_3_0/specs/deleteModule.xml      |     44 +
 .../db/versions/v0_3_0/specs/deleteModulePort.xml  |     52 +
 vistrails/db/versions/v0_3_0/specs/moveModule.xml  |     52 +
 vistrails/db/versions/v0_3_0/specs/tag.xml         |     48 +
 vistrails/db/versions/v0_3_0/specs/vistrail.xml    |     52 +
 vistrails/db/versions/v0_3_1/__init__.py           |     36 +
 vistrails/db/versions/v0_3_1/domain/__init__.py    |     35 +
 .../db/versions/v0_3_1/persistence/__init__.py     |     35 +
 .../db/versions/v0_3_1/schemas/xml/vistrail.xsd    |    161 +
 vistrails/db/versions/v0_3_1/specs/action.xml      |    101 +
 .../db/versions/v0_3_1/specs/addConnection.xml     |     68 +
 vistrails/db/versions/v0_3_1/specs/addModule.xml   |     60 +
 .../db/versions/v0_3_1/specs/addModulePort.xml     |     56 +
 .../db/versions/v0_3_1/specs/changeAnnotation.xml  |     52 +
 .../db/versions/v0_3_1/specs/changeParameter.xml   |     72 +
 .../db/versions/v0_3_1/specs/deleteAnnotation.xml  |     48 +
 .../db/versions/v0_3_1/specs/deleteConnection.xml  |     44 +
 .../db/versions/v0_3_1/specs/deleteFunction.xml    |     48 +
 .../db/versions/v0_3_1/specs/deleteModule.xml      |     44 +
 .../db/versions/v0_3_1/specs/deleteModulePort.xml  |     52 +
 vistrails/db/versions/v0_3_1/specs/moveModule.xml  |     52 +
 vistrails/db/versions/v0_3_1/specs/tag.xml         |     48 +
 vistrails/db/versions/v0_3_1/specs/vistrail.xml    |     52 +
 vistrails/db/versions/v0_3_1/translate/__init__.py |     36 +
 vistrails/db/versions/v0_3_1/translate/v0_3_0.py   |     47 +
 vistrails/db/versions/v0_5_0/__init__.py           |     36 +
 vistrails/db/versions/v0_5_0/domain/__init__.py    |     38 +
 vistrails/db/versions/v0_5_0/domain/auto_gen.py    |   2696 +
 vistrails/db/versions/v0_5_0/domain/id_scope.py    |     65 +
 vistrails/db/versions/v0_5_0/domain/vistrail.py    |     43 +
 vistrails/db/versions/v0_5_0/domain/workflow.py    |    116 +
 .../db/versions/v0_5_0/persistence/__init__.py     |     55 +
 .../db/versions/v0_5_0/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_5_0/persistence/sql/auto_gen.py |   2228 +
 .../db/versions/v0_5_0/persistence/sql/sql_dao.py  |    141 +
 .../db/versions/v0_5_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_5_0/persistence/xml/auto_gen.py |   1266 +
 vistrails/db/versions/v0_5_0/persistence/xml/io.py |     95 +
 .../db/versions/v0_5_0/persistence/xml/xml_dao.py  |     77 +
 .../db/versions/v0_5_0/schemas/sql/vistrails.sql   |    236 +
 .../versions/v0_5_0/schemas/sql/vistrails_drop.sql |     38 +
 vistrails/db/versions/v0_5_0/schemas/xml/log.xsd   |    102 +
 .../db/versions/v0_5_0/schemas/xml/vistrail.xsd    |    213 +
 .../db/versions/v0_5_0/schemas/xml/workflow.xsd    |    131 +
 vistrails/db/versions/v0_5_0/specs/action.xml      |    104 +
 vistrails/db/versions/v0_5_0/specs/add.xml         |    107 +
 vistrails/db/versions/v0_5_0/specs/annotation.xml  |     89 +
 vistrails/db/versions/v0_5_0/specs/change.xml      |    112 +
 vistrails/db/versions/v0_5_0/specs/connection.xml  |     86 +
 vistrails/db/versions/v0_5_0/specs/delete.xml      |     77 +
 vistrails/db/versions/v0_5_0/specs/execRec.xml     |     81 +
 vistrails/db/versions/v0_5_0/specs/function.xml    |     83 +
 vistrails/db/versions/v0_5_0/specs/location.xml    |     80 +
 vistrails/db/versions/v0_5_0/specs/log.xml         |     60 +
 vistrails/db/versions/v0_5_0/specs/machine.xml     |     82 +
 vistrails/db/versions/v0_5_0/specs/macro.xml       |     72 +
 vistrails/db/versions/v0_5_0/specs/module.xml      |     95 +
 vistrails/db/versions/v0_5_0/specs/other.xml       |     79 +
 vistrails/db/versions/v0_5_0/specs/parameter.xml   |     94 +
 vistrails/db/versions/v0_5_0/specs/port.xml        |     90 +
 vistrails/db/versions/v0_5_0/specs/portSpec.xml    |     84 +
 vistrails/db/versions/v0_5_0/specs/session.xml     |     91 +
 vistrails/db/versions/v0_5_0/specs/tag.xml         |     61 +
 vistrails/db/versions/v0_5_0/specs/vistrail.xml    |     80 +
 vistrails/db/versions/v0_5_0/specs/wfExec.xml      |     86 +
 vistrails/db/versions/v0_5_0/specs/workflow.xml    |     74 +
 vistrails/db/versions/v0_5_0/translate/__init__.py |     36 +
 vistrails/db/versions/v0_5_0/translate/v0_3_1.py   |    754 +
 vistrails/db/versions/v0_6_0/__init__.py           |     36 +
 vistrails/db/versions/v0_6_0/domain/__init__.py    |     38 +
 vistrails/db/versions/v0_6_0/domain/auto_gen.py    |   3284 +
 vistrails/db/versions/v0_6_0/domain/id_scope.py    |     65 +
 vistrails/db/versions/v0_6_0/domain/vistrail.py    |     43 +
 vistrails/db/versions/v0_6_0/domain/workflow.py    |    116 +
 .../db/versions/v0_6_0/persistence/__init__.py     |     55 +
 .../db/versions/v0_6_0/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_6_0/persistence/sql/auto_gen.py |   4069 +
 .../db/versions/v0_6_0/persistence/sql/sql_dao.py  |    141 +
 .../db/versions/v0_6_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_6_0/persistence/xml/auto_gen.py |   1749 +
 vistrails/db/versions/v0_6_0/persistence/xml/io.py |     95 +
 .../db/versions/v0_6_0/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_6_0/schemas/sql/vistrails.sql   |    242 +
 .../versions/v0_6_0/schemas/sql/vistrails_drop.sql |     37 +
 .../db/versions/v0_6_0/schemas/xml/vistrail.xsd    |    227 +
 vistrails/db/versions/v0_6_0/specs/abstraction.xml |     65 +
 .../db/versions/v0_6_0/specs/abstractionRef.xml    |     78 +
 vistrails/db/versions/v0_6_0/specs/action.xml      |    100 +
 vistrails/db/versions/v0_6_0/specs/add.xml         |    110 +
 vistrails/db/versions/v0_6_0/specs/annotation.xml  |     93 +
 vistrails/db/versions/v0_6_0/specs/change.xml      |    115 +
 vistrails/db/versions/v0_6_0/specs/connection.xml  |     74 +
 vistrails/db/versions/v0_6_0/specs/delete.xml      |     77 +
 vistrails/db/versions/v0_6_0/specs/function.xml    |     83 +
 vistrails/db/versions/v0_6_0/specs/location.xml    |     80 +
 vistrails/db/versions/v0_6_0/specs/log.xml         |     62 +
 vistrails/db/versions/v0_6_0/specs/machine.xml     |     85 +
 vistrails/db/versions/v0_6_0/specs/module.xml      |    107 +
 vistrails/db/versions/v0_6_0/specs/module_exec.xml |     86 +
 vistrails/db/versions/v0_6_0/specs/other.xml       |     79 +
 vistrails/db/versions/v0_6_0/specs/parameter.xml   |     94 +
 vistrails/db/versions/v0_6_0/specs/port.xml        |     90 +
 vistrails/db/versions/v0_6_0/specs/portSpec.xml    |     84 +
 vistrails/db/versions/v0_6_0/specs/tag.xml         |     71 +
 vistrails/db/versions/v0_6_0/specs/vistrail.xml    |     81 +
 vistrails/db/versions/v0_6_0/specs/workflow.xml    |     79 +
 .../db/versions/v0_6_0/specs/workflow_exec.xml     |    106 +
 vistrails/db/versions/v0_6_0/translate/__init__.py |     36 +
 vistrails/db/versions/v0_6_0/translate/v0_3_1.py   |    716 +
 vistrails/db/versions/v0_6_0/translate/v0_5_0.py   |    121 +
 vistrails/db/versions/v0_7_0/__init__.py           |     36 +
 vistrails/db/versions/v0_7_0/domain/__init__.py    |     40 +
 vistrails/db/versions/v0_7_0/domain/abstraction.py |     54 +
 vistrails/db/versions/v0_7_0/domain/auto_gen.py    |   4137 +
 vistrails/db/versions/v0_7_0/domain/id_scope.py    |     76 +
 vistrails/db/versions/v0_7_0/domain/vistrail.py    |     46 +
 vistrails/db/versions/v0_7_0/domain/workflow.py    |    122 +
 .../db/versions/v0_7_0/persistence/__init__.py     |     55 +
 .../db/versions/v0_7_0/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_7_0/persistence/sql/auto_gen.py |   4104 +
 .../db/versions/v0_7_0/persistence/sql/sql_dao.py  |    141 +
 .../db/versions/v0_7_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_7_0/persistence/xml/auto_gen.py |   1778 +
 vistrails/db/versions/v0_7_0/persistence/xml/io.py |     95 +
 .../db/versions/v0_7_0/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_7_0/schemas/sql/vistrails.sql   |    246 +
 .../versions/v0_7_0/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_7_0/schemas/xml/vistrail.xsd    |    234 +
 vistrails/db/versions/v0_7_0/specs/abstraction.xml |     65 +
 .../db/versions/v0_7_0/specs/abstractionRef.xml    |     82 +
 vistrails/db/versions/v0_7_0/specs/action.xml      |    110 +
 vistrails/db/versions/v0_7_0/specs/add.xml         |    111 +
 vistrails/db/versions/v0_7_0/specs/annotation.xml  |     93 +
 vistrails/db/versions/v0_7_0/specs/change.xml      |    116 +
 vistrails/db/versions/v0_7_0/specs/connection.xml  |     74 +
 vistrails/db/versions/v0_7_0/specs/delete.xml      |     78 +
 vistrails/db/versions/v0_7_0/specs/function.xml    |     83 +
 vistrails/db/versions/v0_7_0/specs/location.xml    |     83 +
 vistrails/db/versions/v0_7_0/specs/log.xml         |     62 +
 vistrails/db/versions/v0_7_0/specs/machine.xml     |     85 +
 vistrails/db/versions/v0_7_0/specs/module.xml      |    112 +
 vistrails/db/versions/v0_7_0/specs/module_exec.xml |     86 +
 vistrails/db/versions/v0_7_0/specs/other.xml       |     79 +
 vistrails/db/versions/v0_7_0/specs/parameter.xml   |     94 +
 vistrails/db/versions/v0_7_0/specs/port.xml        |     95 +
 vistrails/db/versions/v0_7_0/specs/portSpec.xml    |     84 +
 vistrails/db/versions/v0_7_0/specs/tag.xml         |     71 +
 vistrails/db/versions/v0_7_0/specs/vistrail.xml    |     81 +
 vistrails/db/versions/v0_7_0/specs/workflow.xml    |     79 +
 .../db/versions/v0_7_0/specs/workflow_exec.xml     |    106 +
 vistrails/db/versions/v0_7_0/translate/__init__.py |     36 +
 vistrails/db/versions/v0_7_0/translate/v0_6_0.py   |    218 +
 vistrails/db/versions/v0_8_0/__init__.py           |     36 +
 vistrails/db/versions/v0_8_0/domain/__init__.py    |     40 +
 vistrails/db/versions/v0_8_0/domain/abstraction.py |     54 +
 vistrails/db/versions/v0_8_0/domain/auto_gen.py    |   4209 +
 vistrails/db/versions/v0_8_0/domain/id_scope.py    |     76 +
 vistrails/db/versions/v0_8_0/domain/vistrail.py    |     48 +
 vistrails/db/versions/v0_8_0/domain/workflow.py    |    126 +
 .../db/versions/v0_8_0/persistence/__init__.py     |     92 +
 .../db/versions/v0_8_0/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_8_0/persistence/sql/auto_gen.py |   2332 +
 .../db/versions/v0_8_0/persistence/sql/sql_dao.py  |    165 +
 .../db/versions/v0_8_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_8_0/persistence/xml/auto_gen.py |   1531 +
 .../db/versions/v0_8_0/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_8_0/schemas/sql/vistrails.sql   |    249 +
 .../versions/v0_8_0/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_8_0/schemas/xml/vistrail.xsd    |    237 +
 vistrails/db/versions/v0_8_0/specs/abstraction.xml |     65 +
 .../db/versions/v0_8_0/specs/abstractionRef.xml    |    100 +
 vistrails/db/versions/v0_8_0/specs/action.xml      |    110 +
 vistrails/db/versions/v0_8_0/specs/add.xml         |    111 +
 vistrails/db/versions/v0_8_0/specs/annotation.xml  |     97 +
 vistrails/db/versions/v0_8_0/specs/change.xml      |    116 +
 vistrails/db/versions/v0_8_0/specs/connection.xml  |     74 +
 vistrails/db/versions/v0_8_0/specs/delete.xml      |     78 +
 vistrails/db/versions/v0_8_0/specs/function.xml    |     86 +
 vistrails/db/versions/v0_8_0/specs/location.xml    |     83 +
 vistrails/db/versions/v0_8_0/specs/log.xml         |     62 +
 vistrails/db/versions/v0_8_0/specs/machine.xml     |     85 +
 vistrails/db/versions/v0_8_0/specs/module.xml      |    107 +
 vistrails/db/versions/v0_8_0/specs/module_exec.xml |     86 +
 vistrails/db/versions/v0_8_0/specs/other.xml       |     79 +
 vistrails/db/versions/v0_8_0/specs/parameter.xml   |     94 +
 vistrails/db/versions/v0_8_0/specs/port.xml        |     95 +
 vistrails/db/versions/v0_8_0/specs/portSpec.xml    |     84 +
 vistrails/db/versions/v0_8_0/specs/tag.xml         |     71 +
 vistrails/db/versions/v0_8_0/specs/vistrail.xml    |     85 +
 vistrails/db/versions/v0_8_0/specs/workflow.xml    |     80 +
 .../db/versions/v0_8_0/specs/workflow_exec.xml     |    106 +
 vistrails/db/versions/v0_8_0/translate/__init__.py |     36 +
 vistrails/db/versions/v0_8_0/translate/v0_7_0.py   |    128 +
 vistrails/db/versions/v0_8_1/__init__.py           |     36 +
 vistrails/db/versions/v0_8_1/domain/__init__.py    |     35 +
 .../db/versions/v0_8_1/persistence/__init__.py     |     35 +
 .../db/versions/v0_8_1/schemas/sql/vistrails.sql   |    249 +
 .../versions/v0_8_1/schemas/sql/vistrails.sql.bkp  |    248 +
 .../versions/v0_8_1/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_8_1/schemas/xml/vistrail.xsd    |    237 +
 vistrails/db/versions/v0_8_1/specs/abstraction.xml |     65 +
 .../db/versions/v0_8_1/specs/abstractionRef.xml    |    100 +
 vistrails/db/versions/v0_8_1/specs/action.xml      |    110 +
 vistrails/db/versions/v0_8_1/specs/add.xml         |    111 +
 vistrails/db/versions/v0_8_1/specs/annotation.xml  |     97 +
 vistrails/db/versions/v0_8_1/specs/change.xml      |    116 +
 vistrails/db/versions/v0_8_1/specs/connection.xml  |     74 +
 vistrails/db/versions/v0_8_1/specs/delete.xml      |     78 +
 vistrails/db/versions/v0_8_1/specs/function.xml    |     86 +
 vistrails/db/versions/v0_8_1/specs/location.xml    |     83 +
 vistrails/db/versions/v0_8_1/specs/log.xml         |     62 +
 vistrails/db/versions/v0_8_1/specs/machine.xml     |     85 +
 vistrails/db/versions/v0_8_1/specs/module.xml      |    107 +
 vistrails/db/versions/v0_8_1/specs/module_exec.xml |     86 +
 vistrails/db/versions/v0_8_1/specs/other.xml       |     79 +
 vistrails/db/versions/v0_8_1/specs/parameter.xml   |     94 +
 vistrails/db/versions/v0_8_1/specs/port.xml        |     95 +
 vistrails/db/versions/v0_8_1/specs/portSpec.xml    |     84 +
 vistrails/db/versions/v0_8_1/specs/tag.xml         |     71 +
 vistrails/db/versions/v0_8_1/specs/vistrail.xml    |     85 +
 vistrails/db/versions/v0_8_1/specs/workflow.xml    |     80 +
 .../db/versions/v0_8_1/specs/workflow_exec.xml     |    106 +
 vistrails/db/versions/v0_8_1/translate/__init__.py |     36 +
 vistrails/db/versions/v0_8_1/translate/v0_8_0.py   |     84 +
 vistrails/db/versions/v0_9_0/__init__.py           |     36 +
 vistrails/db/versions/v0_9_0/domain/__init__.py    |     41 +
 vistrails/db/versions/v0_9_0/domain/abstraction.py |     55 +
 vistrails/db/versions/v0_9_0/domain/auto_gen.py    |   4458 +
 vistrails/db/versions/v0_9_0/domain/id_scope.py    |     76 +
 vistrails/db/versions/v0_9_0/domain/log.py         |     55 +
 vistrails/db/versions/v0_9_0/domain/vistrail.py    |     64 +
 vistrails/db/versions/v0_9_0/domain/workflow.py    |    155 +
 .../db/versions/v0_9_0/persistence/__init__.py     |     98 +
 .../db/versions/v0_9_0/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_9_0/persistence/sql/auto_gen.py |   2525 +
 .../db/versions/v0_9_0/persistence/sql/sql_dao.py  |    165 +
 .../db/versions/v0_9_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_9_0/persistence/xml/auto_gen.py |   1584 +
 .../db/versions/v0_9_0/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_9_0/schemas/sql/vistrails.sql   |    281 +
 .../versions/v0_9_0/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_9_0/schemas/xml/vistrail.xsd    |    238 +
 vistrails/db/versions/v0_9_0/specs/abstraction.xml |     69 +
 .../db/versions/v0_9_0/specs/abstractionRef.xml    |    106 +
 vistrails/db/versions/v0_9_0/specs/action.xml      |    113 +
 vistrails/db/versions/v0_9_0/specs/add.xml         |    114 +
 vistrails/db/versions/v0_9_0/specs/annotation.xml  |    100 +
 vistrails/db/versions/v0_9_0/specs/change.xml      |    119 +
 vistrails/db/versions/v0_9_0/specs/connection.xml  |     77 +
 vistrails/db/versions/v0_9_0/specs/delete.xml      |     81 +
 vistrails/db/versions/v0_9_0/specs/function.xml    |     89 +
 vistrails/db/versions/v0_9_0/specs/location.xml    |     86 +
 vistrails/db/versions/v0_9_0/specs/log.xml         |     80 +
 vistrails/db/versions/v0_9_0/specs/machine.xml     |     90 +
 vistrails/db/versions/v0_9_0/specs/module.xml      |    115 +
 vistrails/db/versions/v0_9_0/specs/module_exec.xml |    109 +
 vistrails/db/versions/v0_9_0/specs/other.xml       |     82 +
 vistrails/db/versions/v0_9_0/specs/parameter.xml   |     97 +
 vistrails/db/versions/v0_9_0/specs/port.xml        |     98 +
 vistrails/db/versions/v0_9_0/specs/portSpec.xml    |     87 +
 vistrails/db/versions/v0_9_0/specs/tag.xml         |     75 +
 vistrails/db/versions/v0_9_0/specs/vistrail.xml    |     89 +
 vistrails/db/versions/v0_9_0/specs/workflow.xml    |     98 +
 .../db/versions/v0_9_0/specs/workflow_exec.xml     |    109 +
 vistrails/db/versions/v0_9_0/translate/__init__.py |     36 +
 vistrails/db/versions/v0_9_0/translate/v0_8_1.py   |    135 +
 vistrails/db/versions/v0_9_1/__init__.py           |     36 +
 vistrails/db/versions/v0_9_1/domain/__init__.py    |     41 +
 vistrails/db/versions/v0_9_1/domain/abstraction.py |     55 +
 vistrails/db/versions/v0_9_1/domain/auto_gen.py    |   4809 +
 vistrails/db/versions/v0_9_1/domain/id_scope.py    |     85 +
 vistrails/db/versions/v0_9_1/domain/log.py         |     55 +
 vistrails/db/versions/v0_9_1/domain/vistrail.py    |     66 +
 vistrails/db/versions/v0_9_1/domain/workflow.py    |    158 +
 .../db/versions/v0_9_1/persistence/__init__.py     |     95 +
 .../db/versions/v0_9_1/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_9_1/persistence/sql/auto_gen.py |   2693 +
 .../db/versions/v0_9_1/persistence/sql/sql_dao.py  |    165 +
 .../db/versions/v0_9_1/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_9_1/persistence/xml/auto_gen.py |   1707 +
 .../db/versions/v0_9_1/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_9_1/schemas/sql/vistrails.sql   |    298 +
 .../versions/v0_9_1/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_9_1/schemas/xml/vistrail.xsd    |    277 +
 .../db/versions/v0_9_1/schemas/xml/vtlink.xsd      |     52 +
 vistrails/db/versions/v0_9_1/specs/abstraction.xml |     69 +
 .../db/versions/v0_9_1/specs/abstractionRef.xml    |    106 +
 vistrails/db/versions/v0_9_1/specs/action.xml      |    113 +
 vistrails/db/versions/v0_9_1/specs/add.xml         |    117 +
 vistrails/db/versions/v0_9_1/specs/annotation.xml  |    104 +
 vistrails/db/versions/v0_9_1/specs/change.xml      |    122 +
 vistrails/db/versions/v0_9_1/specs/connection.xml  |     77 +
 vistrails/db/versions/v0_9_1/specs/delete.xml      |     81 +
 vistrails/db/versions/v0_9_1/specs/function.xml    |     92 +
 vistrails/db/versions/v0_9_1/specs/group.xml       |    120 +
 vistrails/db/versions/v0_9_1/specs/location.xml    |     89 +
 vistrails/db/versions/v0_9_1/specs/log.xml         |     80 +
 vistrails/db/versions/v0_9_1/specs/machine.xml     |     90 +
 vistrails/db/versions/v0_9_1/specs/module.xml      |    120 +
 vistrails/db/versions/v0_9_1/specs/module_exec.xml |    109 +
 vistrails/db/versions/v0_9_1/specs/other.xml       |     82 +
 vistrails/db/versions/v0_9_1/specs/parameter.xml   |     97 +
 vistrails/db/versions/v0_9_1/specs/port.xml        |     98 +
 vistrails/db/versions/v0_9_1/specs/portSpec.xml    |     87 +
 vistrails/db/versions/v0_9_1/specs/tag.xml         |     75 +
 vistrails/db/versions/v0_9_1/specs/vistrail.xml    |     89 +
 vistrails/db/versions/v0_9_1/specs/workflow.xml    |    113 +
 .../db/versions/v0_9_1/specs/workflow_exec.xml     |    109 +
 vistrails/db/versions/v0_9_1/translate/__init__.py |     36 +
 vistrails/db/versions/v0_9_1/translate/v0_9_0.py   |    142 +
 vistrails/db/versions/v0_9_2/__init__.py           |     36 +
 vistrails/db/versions/v0_9_2/domain/__init__.py    |     35 +
 .../db/versions/v0_9_2/persistence/__init__.py     |     35 +
 vistrails/db/versions/v0_9_2/translate/__init__.py |     36 +
 vistrails/db/versions/v0_9_2/translate/v0_9_1.py   |     48 +
 vistrails/db/versions/v0_9_3/__init__.py           |     36 +
 vistrails/db/versions/v0_9_3/domain/__init__.py    |     41 +
 vistrails/db/versions/v0_9_3/domain/abstraction.py |     55 +
 vistrails/db/versions/v0_9_3/domain/auto_gen.py    |   6369 +
 vistrails/db/versions/v0_9_3/domain/id_scope.py    |     85 +
 vistrails/db/versions/v0_9_3/domain/log.py         |     68 +
 vistrails/db/versions/v0_9_3/domain/vistrail.py    |    127 +
 vistrails/db/versions/v0_9_3/domain/workflow.py    |    170 +
 .../db/versions/v0_9_3/persistence/__init__.py     |    204 +
 .../db/versions/v0_9_3/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_9_3/persistence/sql/auto_gen.py |   2811 +
 .../db/versions/v0_9_3/persistence/sql/sql_dao.py  |    183 +
 .../db/versions/v0_9_3/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_9_3/persistence/xml/auto_gen.py |   1774 +
 .../db/versions/v0_9_3/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_9_3/schemas/sql/vistrails.sql   |    311 +
 .../versions/v0_9_3/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_9_3/schemas/xml/vistrail.xsd    |    285 +
 vistrails/db/versions/v0_9_3/specs/all.xml         |   1652 +
 vistrails/db/versions/v0_9_3/translate/__init__.py |     36 +
 vistrails/db/versions/v0_9_3/translate/v0_9_1.py   |     86 +
 vistrails/db/versions/v0_9_3/translate/v0_9_2.py   |    155 +
 vistrails/db/versions/v0_9_3/translate/v0_9_4.py   |    113 +
 vistrails/db/versions/v0_9_4/__init__.py           |     36 +
 vistrails/db/versions/v0_9_4/domain/__init__.py    |     40 +
 vistrails/db/versions/v0_9_4/domain/auto_gen.py    |   5971 +
 vistrails/db/versions/v0_9_4/domain/id_scope.py    |     85 +
 vistrails/db/versions/v0_9_4/domain/log.py         |     69 +
 vistrails/db/versions/v0_9_4/domain/vistrail.py    |    127 +
 vistrails/db/versions/v0_9_4/domain/workflow.py    |    172 +
 .../db/versions/v0_9_4/persistence/__init__.py     |    204 +
 .../db/versions/v0_9_4/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_9_4/persistence/sql/auto_gen.py |   2712 +
 .../db/versions/v0_9_4/persistence/sql/sql_dao.py  |    183 +
 .../db/versions/v0_9_4/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_9_4/persistence/xml/auto_gen.py |   1703 +
 .../db/versions/v0_9_4/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_9_4/schemas/sql/vistrails.sql   |    305 +
 .../versions/v0_9_4/schemas/sql/vistrails_drop.sql |     38 +
 .../db/versions/v0_9_4/schemas/xml/vistrail.xsd    |    276 +
 vistrails/db/versions/v0_9_4/specs/all.xml         |   1601 +
 vistrails/db/versions/v0_9_4/translate/__init__.py |     36 +
 vistrails/db/versions/v0_9_4/translate/v0_9_3.py   |    117 +
 vistrails/db/versions/v0_9_4/translate/v0_9_5.py   |     87 +
 vistrails/db/versions/v0_9_5/__init__.py           |     36 +
 vistrails/db/versions/v0_9_5/domain/__init__.py    |     41 +
 vistrails/db/versions/v0_9_5/domain/auto_gen.py    |   7786 ++
 vistrails/db/versions/v0_9_5/domain/id_scope.py    |     85 +
 vistrails/db/versions/v0_9_5/domain/log.py         |     69 +
 vistrails/db/versions/v0_9_5/domain/registry.py    |     61 +
 vistrails/db/versions/v0_9_5/domain/vistrail.py    |    127 +
 vistrails/db/versions/v0_9_5/domain/workflow.py    |    172 +
 .../db/versions/v0_9_5/persistence/__init__.py     |    230 +
 .../db/versions/v0_9_5/persistence/sql/__init__.py |     36 +
 .../db/versions/v0_9_5/persistence/sql/auto_gen.py |   3340 +
 .../db/versions/v0_9_5/persistence/sql/sql_dao.py  |    183 +
 .../db/versions/v0_9_5/persistence/xml/__init__.py |     36 +
 .../db/versions/v0_9_5/persistence/xml/auto_gen.py |   2117 +
 .../db/versions/v0_9_5/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v0_9_5/schemas/sql/vistrails.sql   |    373 +
 .../versions/v0_9_5/schemas/sql/vistrails_drop.sql |     40 +
 .../db/versions/v0_9_5/schemas/xml/vistrail.xsd    |    278 +
 vistrails/db/versions/v0_9_5/specs/all.xml         |   2017 +
 vistrails/db/versions/v0_9_5/translate/__init__.py |     36 +
 vistrails/db/versions/v0_9_5/translate/v0_9_4.py   |     99 +
 vistrails/db/versions/v0_9_5/translate/v1_0_0.py   |    113 +
 vistrails/db/versions/v1_0_0/__init__.py           |     36 +
 vistrails/db/versions/v1_0_0/domain/__init__.py    |     41 +
 vistrails/db/versions/v1_0_0/domain/auto_gen.py    |  11387 ++
 vistrails/db/versions/v1_0_0/domain/id_scope.py    |     85 +
 vistrails/db/versions/v1_0_0/domain/log.py         |     72 +
 vistrails/db/versions/v1_0_0/domain/registry.py    |     63 +
 vistrails/db/versions/v1_0_0/domain/vistrail.py    |    127 +
 vistrails/db/versions/v1_0_0/domain/workflow.py    |    172 +
 .../db/versions/v1_0_0/persistence/__init__.py     |    248 +
 .../db/versions/v1_0_0/persistence/sql/__init__.py |     36 +
 .../db/versions/v1_0_0/persistence/sql/auto_gen.py |   3332 +
 .../db/versions/v1_0_0/persistence/sql/sql_dao.py  |    183 +
 .../db/versions/v1_0_0/persistence/xml/__init__.py |     36 +
 .../db/versions/v1_0_0/persistence/xml/auto_gen.py |   3833 +
 .../db/versions/v1_0_0/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v1_0_0/schemas/sql/vistrails.sql   |    372 +
 .../versions/v1_0_0/schemas/sql/vistrails_drop.sql |     40 +
 .../db/versions/v1_0_0/schemas/xml/vistrail.xsd    |    278 +
 vistrails/db/versions/v1_0_0/specs/all.xml         |   2684 +
 vistrails/db/versions/v1_0_0/translate/__init__.py |     36 +
 vistrails/db/versions/v1_0_0/translate/v0_9_5.py   |     95 +
 vistrails/db/versions/v1_0_0/translate/v1_0_1.py   |     65 +
 vistrails/db/versions/v1_0_1/__init__.py           |     36 +
 vistrails/db/versions/v1_0_1/domain/__init__.py    |     41 +
 vistrails/db/versions/v1_0_1/domain/auto_gen.py    |  11447 ++
 vistrails/db/versions/v1_0_1/domain/id_scope.py    |     85 +
 vistrails/db/versions/v1_0_1/domain/log.py         |     72 +
 vistrails/db/versions/v1_0_1/domain/registry.py    |     63 +
 vistrails/db/versions/v1_0_1/domain/vistrail.py    |    203 +
 vistrails/db/versions/v1_0_1/domain/workflow.py    |    172 +
 .../db/versions/v1_0_1/persistence/__init__.py     |    248 +
 .../db/versions/v1_0_1/persistence/sql/__init__.py |     36 +
 .../db/versions/v1_0_1/persistence/sql/auto_gen.py |   3344 +
 .../db/versions/v1_0_1/persistence/sql/sql_dao.py  |    183 +
 .../db/versions/v1_0_1/persistence/xml/__init__.py |     36 +
 .../db/versions/v1_0_1/persistence/xml/auto_gen.py |   3845 +
 .../db/versions/v1_0_1/persistence/xml/xml_dao.py  |     80 +
 .../db/versions/v1_0_1/schemas/sql/vistrails.sql   |    382 +
 .../versions/v1_0_1/schemas/sql/vistrails_drop.sql |     42 +
 .../db/versions/v1_0_1/schemas/xml/vistrail.xsd    |    280 +
 .../db/versions/v1_0_1/schemas/xml/vtlink.xsd      |     55 +
 vistrails/db/versions/v1_0_1/specs/all.xml         |   2699 +
 vistrails/db/versions/v1_0_1/translate/__init__.py |     36 +
 vistrails/db/versions/v1_0_1/translate/v1_0_0.py   |     80 +
 vistrails/db/versions/v1_0_1/translate/v1_0_2.py   |    193 +
 vistrails/db/versions/v1_0_2/__init__.py           |     36 +
 vistrails/db/versions/v1_0_2/domain/__init__.py    |     41 +
 vistrails/db/versions/v1_0_2/domain/auto_gen.py    |  11719 ++
 vistrails/db/versions/v1_0_2/domain/id_scope.py    |     85 +
 vistrails/db/versions/v1_0_2/domain/log.py         |     72 +
 vistrails/db/versions/v1_0_2/domain/registry.py    |     63 +
 vistrails/db/versions/v1_0_2/domain/vistrail.py    |    216 +
 vistrails/db/versions/v1_0_2/domain/workflow.py    |    172 +
 .../db/versions/v1_0_2/persistence/__init__.py     |    473 +
 .../db/versions/v1_0_2/persistence/sql/__init__.py |     36 +
 .../db/versions/v1_0_2/persistence/sql/auto_gen.py |   5804 +
 .../db/versions/v1_0_2/persistence/sql/sql_dao.py  |    259 +
 .../db/versions/v1_0_2/persistence/xml/__init__.py |     36 +
 .../db/versions/v1_0_2/persistence/xml/auto_gen.py |   3902 +
 .../db/versions/v1_0_2/persistence/xml/xml_dao.py  |     86 +
 .../db/versions/v1_0_2/schemas/sql/vistrails.sql   |    390 +
 .../versions/v1_0_2/schemas/sql/vistrails_drop.sql |     42 +
 vistrails/db/versions/v1_0_2/schemas/xml/log.xsd   |    146 +
 .../db/versions/v1_0_2/schemas/xml/vistrail.xsd    |    287 +
 .../db/versions/v1_0_2/schemas/xml/vtlink.xsd      |     69 +
 .../db/versions/v1_0_2/schemas/xml/workflow.xsd    |    185 +
 vistrails/db/versions/v1_0_2/specs/all.xml         |   2746 +
 vistrails/db/versions/v1_0_2/translate/__init__.py |     36 +
 vistrails/db/versions/v1_0_2/translate/v1_0_1.py   |    145 +
 vistrails/db/versions/v1_0_2/translate/v1_0_3.py   |    207 +
 vistrails/db/versions/v1_0_3/__init__.py           |     36 +
 vistrails/db/versions/v1_0_3/domain/__init__.py    |     41 +
 vistrails/db/versions/v1_0_3/domain/auto_gen.py    |  16928 +++
 vistrails/db/versions/v1_0_3/domain/id_scope.py    |     85 +
 vistrails/db/versions/v1_0_3/domain/log.py         |     72 +
 vistrails/db/versions/v1_0_3/domain/registry.py    |     63 +
 vistrails/db/versions/v1_0_3/domain/vistrail.py    |    220 +
 vistrails/db/versions/v1_0_3/domain/workflow.py    |    172 +
 .../db/versions/v1_0_3/persistence/__init__.py     |    472 +
 .../db/versions/v1_0_3/persistence/sql/__init__.py |     36 +
 .../db/versions/v1_0_3/persistence/sql/auto_gen.py |   7984 ++
 .../db/versions/v1_0_3/persistence/sql/sql_dao.py  |    259 +
 .../db/versions/v1_0_3/persistence/xml/__init__.py |     36 +
 .../db/versions/v1_0_3/persistence/xml/auto_gen.py |   5822 +
 .../db/versions/v1_0_3/persistence/xml/xml_dao.py  |     89 +
 .../db/versions/v1_0_3/schemas/sql/vistrails.sql   |    528 +
 .../versions/v1_0_3/schemas/sql/vistrails_drop.sql |     42 +
 vistrails/db/versions/v1_0_3/schemas/xml/log.xsd   |    146 +
 .../db/versions/v1_0_3/schemas/xml/vistrail.xsd    |    347 +
 .../db/versions/v1_0_3/schemas/xml/vtlink.xsd      |     69 +
 .../db/versions/v1_0_3/schemas/xml/workflow.xsd    |    200 +
 vistrails/db/versions/v1_0_3/specs/all.xml         |   3823 +
 vistrails/db/versions/v1_0_3/translate/__init__.py |     36 +
 vistrails/db/versions/v1_0_3/translate/v1_0_2.py   |    342 +
 vistrails/gui/__init__.py                          |     35 +
 vistrails/gui/application.py                       |    853 +
 vistrails/gui/application_server.py                |   2229 +
 vistrails/gui/base_view.py                         |    114 +
 vistrails/gui/bundles/__init__.py                  |     35 +
 vistrails/gui/bundles/installbundle.py             |    270 +
 vistrails/gui/bundles/linux_debian_install.py      |    255 +
 vistrails/gui/bundles/linux_fedora_install.py      |    198 +
 vistrails/gui/bundles/utils.py                     |    150 +
 vistrails/gui/collection/__init__.py               |     36 +
 vistrails/gui/collection/explorer.py               |    758 +
 vistrails/gui/collection/vis_log.py                |    582 +
 vistrails/gui/collection/workspace.py              |   1631 +
 vistrails/gui/common_widgets.py                    |    833 +
 vistrails/gui/configuration.py                     |    979 +
 vistrails/gui/controlflow_assist.py                |    325 +
 vistrails/gui/debug.py                             |    375 +
 vistrails/gui/debugger.py                          |    247 +
 vistrails/gui/extras/__init__.py                   |     35 +
 vistrails/gui/extras/core/__init__.py              |     36 +
 vistrails/gui/extras/core/db/__init__.py           |     36 +
 vistrails/gui/extras/core/db/locator.py            |    221 +
 vistrails/gui/graphics_view.py                     |    850 +
 vistrails/gui/job_monitor.py                       |    387 +
 vistrails/gui/mashups/__init__.py                  |     36 +
 vistrails/gui/mashups/alias_inspector.py           |    759 +
 vistrails/gui/mashups/alias_list.py                |    352 +
 vistrails/gui/mashups/alias_parameter_view.py      |    389 +
 vistrails/gui/mashups/controller.py                |     87 +
 vistrails/gui/mashups/mashup_app.py                |    624 +
 vistrails/gui/mashups/mashup_view.py               |    401 +
 vistrails/gui/mashups/mashups_inspector.py         |    408 +
 vistrails/gui/mashups/mashups_manager.py           |    450 +
 vistrails/gui/mashups/mashups_widgets.py           |    387 +
 vistrails/gui/merge_gui.py                         |    322 +
 vistrails/gui/module_annotation.py                 |    295 +
 vistrails/gui/module_configuration.py              |    193 +
 vistrails/gui/module_documentation.py              |    113 +
 vistrails/gui/module_info.py                       |    211 +
 vistrails/gui/module_palette.py                    |    544 +
 vistrails/gui/modules/__init__.py                  |     63 +
 vistrails/gui/modules/constant_configuration.py    |    775 +
 vistrails/gui/modules/list_configuration.py        |    132 +
 vistrails/gui/modules/module_configure.py          |    272 +
 vistrails/gui/modules/paramexplore.py              |    798 +
 vistrails/gui/modules/python_source_configure.py   |    244 +
 vistrails/gui/modules/query_configuration.py       |    146 +
 vistrails/gui/modules/resources/__init__.py        |     35 +
 vistrails/gui/modules/resources/colorconfig_rc.py  |   1850 +
 vistrails/gui/modules/source_configure.py          |    413 +
 vistrails/gui/modules/string_configure.py          |    154 +
 vistrails/gui/modules/tuple_configuration.py       |    578 +
 vistrails/gui/open_db_window.py                    |    775 +
 vistrails/gui/paramexplore/__init__.py             |     36 +
 vistrails/gui/paramexplore/param_view.py           |    410 +
 vistrails/gui/paramexplore/pe_inspector.py         |    291 +
 vistrails/gui/paramexplore/pe_pipeline.py          |    131 +
 vistrails/gui/paramexplore/pe_tab.py               |    337 +
 vistrails/gui/paramexplore/pe_table.py             |   1015 +
 vistrails/gui/paramexplore/pe_view.py              |    135 +
 vistrails/gui/paramexplore/virtual_cell.py         |    673 +
 vistrails/gui/pipeline_view.py                     |   3405 +
 vistrails/gui/pipeline_view_select.py              |    186 +
 vistrails/gui/port_documentation.py                |     89 +
 vistrails/gui/ports_pane.py                        |    613 +
 vistrails/gui/preferences.py                       |    696 +
 vistrails/gui/publishing.py                        |    857 +
 vistrails/gui/qt.py                                |    220 +
 vistrails/gui/query_view.py                        |    595 +
 vistrails/gui/repository.py                        |    766 +
 vistrails/gui/requirements.py                      |     61 +
 vistrails/gui/resources/__init__.py                |     35 +
 vistrails/gui/resources/images/alias.png           |    Bin 0 -> 3658 bytes
 vistrails/gui/resources/images/analogy.png         |    Bin 0 -> 1596 bytes
 vistrails/gui/resources/images/appointment-new.png |    Bin 0 -> 2399 bytes
 vistrails/gui/resources/images/automatch.png       |    Bin 0 -> 1538 bytes
 vistrails/gui/resources/images/bookmarks.png       |    Bin 0 -> 3113 bytes
 vistrails/gui/resources/images/camera.png          |    Bin 0 -> 1974 bytes
 vistrails/gui/resources/images/camera_mount.png    |    Bin 0 -> 2447 bytes
 vistrails/gui/resources/images/close_hand.png      |    Bin 0 -> 2916 bytes
 vistrails/gui/resources/images/closeview.png       |    Bin 0 -> 406 bytes
 vistrails/gui/resources/images/collapse_all.png    |    Bin 0 -> 1567 bytes
 vistrails/gui/resources/images/column.png          |    Bin 0 -> 1791 bytes
 vistrails/gui/resources/images/connection.png      |    Bin 0 -> 4028 bytes
 vistrails/gui/resources/images/console.png         |    Bin 0 -> 2136 bytes
 vistrails/gui/resources/images/copy.png            |    Bin 0 -> 1207 bytes
 vistrails/gui/resources/images/database.png        |    Bin 0 -> 4328 bytes
 vistrails/gui/resources/images/detach.png          |    Bin 0 -> 2979 bytes
 vistrails/gui/resources/images/detach_on.png       |    Bin 0 -> 2982 bytes
 vistrails/gui/resources/images/disclaimer.png      |    Bin 0 -> 265001 bytes
 vistrails/gui/resources/images/dock_view.png       |    Bin 0 -> 4291 bytes
 vistrails/gui/resources/images/dockback.png        |    Bin 0 -> 1301 bytes
 vistrails/gui/resources/images/down.png            |    Bin 0 -> 945 bytes
 vistrails/gui/resources/images/dragging.png        |    Bin 0 -> 1658 bytes
 vistrails/gui/resources/images/edit.png            |    Bin 0 -> 2766 bytes
 vistrails/gui/resources/images/edit_add.png        |    Bin 0 -> 780 bytes
 vistrails/gui/resources/images/editcopy.png        |    Bin 0 -> 1329 bytes
 vistrails/gui/resources/images/editdelete.png      |    Bin 0 -> 1805 bytes
 vistrails/gui/resources/images/edittrash.png       |    Bin 0 -> 1577 bytes
 .../gui/resources/images/emblem-important.png      |    Bin 0 -> 1582 bytes
 vistrails/gui/resources/images/execute.png         |    Bin 0 -> 2513 bytes
 vistrails/gui/resources/images/execute_explore.png |    Bin 0 -> 2675 bytes
 .../gui/resources/images/execute_pipeline.png      |    Bin 0 -> 2129 bytes
 vistrails/gui/resources/images/expand_all.png      |    Bin 0 -> 1604 bytes
 vistrails/gui/resources/images/explore.png         |    Bin 0 -> 1994 bytes
 vistrails/gui/resources/images/export.png          |    Bin 0 -> 1413 bytes
 vistrails/gui/resources/images/eye.png             |    Bin 0 -> 3469 bytes
 vistrails/gui/resources/images/eye_gray.png        |    Bin 0 -> 3558 bytes
 vistrails/gui/resources/images/file.png            |    Bin 0 -> 873 bytes
 vistrails/gui/resources/images/full_tree.png       |    Bin 0 -> 3310 bytes
 vistrails/gui/resources/images/history.png         |    Bin 0 -> 830 bytes
 vistrails/gui/resources/images/hor_view.png        |    Bin 0 -> 1255 bytes
 vistrails/gui/resources/images/import.png          |    Bin 0 -> 1426 bytes
 vistrails/gui/resources/images/info.png            |    Bin 0 -> 1137 bytes
 vistrails/gui/resources/images/left.png            |    Bin 0 -> 3095 bytes
 vistrails/gui/resources/images/lightcheck.png      |    Bin 0 -> 1371 bytes
 vistrails/gui/resources/images/list_view.png       |    Bin 0 -> 1251 bytes
 vistrails/gui/resources/images/mac/closetab.png    |    Bin 0 -> 516 bytes
 vistrails/gui/resources/images/macro.png           |    Bin 0 -> 1495 bytes
 vistrails/gui/resources/images/macro_info.png      |    Bin 0 -> 1843 bytes
 vistrails/gui/resources/images/macro_new.png       |    Bin 0 -> 1866 bytes
 vistrails/gui/resources/images/macro_pause.png     |    Bin 0 -> 1814 bytes
 vistrails/gui/resources/images/macro_play.png      |    Bin 0 -> 1874 bytes
 vistrails/gui/resources/images/macro_stop.png      |    Bin 0 -> 1769 bytes
 vistrails/gui/resources/images/macro_view.png      |    Bin 0 -> 2260 bytes
 vistrails/gui/resources/images/make_kdevelop.png   |    Bin 0 -> 2128 bytes
 vistrails/gui/resources/images/mashup_create.png   |    Bin 0 -> 2935 bytes
 vistrails/gui/resources/images/mashup_execute.png  |    Bin 0 -> 2955 bytes
 vistrails/gui/resources/images/match_by_sig.png    |    Bin 0 -> 1538 bytes
 vistrails/gui/resources/images/minus.png           |    Bin 0 -> 75 bytes
 .../gui/resources/images/multiline_string_icon.png |    Bin 0 -> 511 bytes
 vistrails/gui/resources/images/new_vistrail.png    |    Bin 0 -> 3291 bytes
 vistrails/gui/resources/images/noatunloopsong.png  |    Bin 0 -> 2372 bytes
 vistrails/gui/resources/images/open_hand.png       |    Bin 0 -> 2948 bytes
 vistrails/gui/resources/images/open_vistrail.png   |    Bin 0 -> 3711 bytes
 vistrails/gui/resources/images/openfromdb.png      |    Bin 0 -> 4712 bytes
 vistrails/gui/resources/images/pan_icon.png        |    Bin 0 -> 3377 bytes
 vistrails/gui/resources/images/perform_pe.png      |    Bin 0 -> 2342 bytes
 vistrails/gui/resources/images/pinned.png          |    Bin 0 -> 3845 bytes
 vistrails/gui/resources/images/pipeline.png        |    Bin 0 -> 4381 bytes
 vistrails/gui/resources/images/pipeline_bg.png     |    Bin 0 -> 8647 bytes
 vistrails/gui/resources/images/player_eject.png    |    Bin 0 -> 1509 bytes
 vistrails/gui/resources/images/player_pause.png    |    Bin 0 -> 1201 bytes
 vistrails/gui/resources/images/player_play.png     |    Bin 0 -> 1614 bytes
 vistrails/gui/resources/images/plus.png            |    Bin 0 -> 82 bytes
 vistrails/gui/resources/images/query_bg.png        |    Bin 0 -> 23191 bytes
 vistrails/gui/resources/images/redo.png            |    Bin 0 -> 2173 bytes
 vistrails/gui/resources/images/reload.png          |    Bin 0 -> 5858 bytes
 vistrails/gui/resources/images/remove_param.png    |    Bin 0 -> 13957 bytes
 vistrails/gui/resources/images/right.png           |    Bin 0 -> 3311 bytes
 vistrails/gui/resources/images/row.png             |    Bin 0 -> 1767 bytes
 vistrails/gui/resources/images/save_vistrail.png   |    Bin 0 -> 2644 bytes
 vistrails/gui/resources/images/search.png          |    Bin 0 -> 1970 bytes
 vistrails/gui/resources/images/search_database.png |    Bin 0 -> 4728 bytes
 vistrails/gui/resources/images/select_icon.png     |    Bin 0 -> 2950 bytes
 vistrails/gui/resources/images/sheet.png           |    Bin 0 -> 4893 bytes
 vistrails/gui/resources/images/show_legends.png    |    Bin 0 -> 1979 bytes
 vistrails/gui/resources/images/show_params.png     |    Bin 0 -> 943 bytes
 vistrails/gui/resources/images/skip.png            |    Bin 0 -> 2509 bytes
 vistrails/gui/resources/images/tabbed_view.png     |    Bin 0 -> 1301 bytes
 vistrails/gui/resources/images/time.png            |    Bin 0 -> 2820 bytes
 vistrails/gui/resources/images/tree_view.png       |    Bin 0 -> 1323 bytes
 vistrails/gui/resources/images/undo.png            |    Bin 0 -> 2208 bytes
 vistrails/gui/resources/images/unpinned.png        |    Bin 0 -> 3892 bytes
 vistrails/gui/resources/images/up.png              |    Bin 0 -> 933 bytes
 vistrails/gui/resources/images/ver_view.png        |    Bin 0 -> 1245 bytes
 vistrails/gui/resources/images/version_bg.png      |    Bin 0 -> 8065 bytes
 vistrails/gui/resources/images/view-refresh.png    |    Bin 0 -> 2024 bytes
 vistrails/gui/resources/images/view_fullscreen.png |    Bin 0 -> 1911 bytes
 vistrails/gui/resources/images/vistrails_icon.png  |    Bin 0 -> 15938 bytes
 .../gui/resources/images/vistrails_icon_small.ico  |    Bin 0 -> 9662 bytes
 .../gui/resources/images/vistrails_icon_small.png  |    Bin 0 -> 6487 bytes
 .../gui/resources/images/vistrails_splash.png      |    Bin 0 -> 160717 bytes
 vistrails/gui/resources/images/visual_query.png    |    Bin 0 -> 3189 bytes
 vistrails/gui/resources/images/zoom.png            |    Bin 0 -> 2968 bytes
 vistrails/gui/resources/images/zoom_arrow_icon.png |    Bin 0 -> 1774 bytes
 vistrails/gui/resources/images/zoom_icon.png       |    Bin 0 -> 4424 bytes
 vistrails/gui/resources/macroicons.qrc             |     17 +
 vistrails/gui/resources/macroicons_rc.py           |   1404 +
 vistrails/gui/resources/vistrails-mime.xml         |     11 +
 vistrails/gui/shell.py                             |    965 +
 vistrails/gui/theme.py                             |    750 +
 vistrails/gui/utils.py                             |    243 +
 vistrails/gui/variable_dropbox.py                  |    510 +
 vistrails/gui/version_prop.py                      |    817 +
 vistrails/gui/version_view.py                      |   1299 +
 vistrails/gui/view_manager.py                      |    903 +
 vistrails/gui/vis_diff.py                          |   1277 +
 vistrails/gui/vistrail_controller.py               |   1558 +
 vistrails/gui/vistrail_variables.py                |     65 +
 vistrails/gui/vistrail_view.py                     |   1295 +
 vistrails/gui/vistrails_palette.py                 |    122 +
 vistrails/gui/vistrails_window.py                  |   2695 +
 vistrails/index/__core.py                          |    143 +
 vistrails/index/__init__.py                        |     35 +
 vistrails/index/indexworkflow.py                   |    226 +
 vistrails/index/spec_io.py                         |    137 +
 vistrails/index/vistrailanalyzer.py                |    116 +
 vistrails/packages/CLTools/README                  |     73 +
 vistrails/packages/CLTools/__init__.py             |     41 +
 vistrails/packages/CLTools/icons/document-new.png  |    Bin 0 -> 692 bytes
 vistrails/packages/CLTools/icons/document-open.png |    Bin 0 -> 919 bytes
 .../packages/CLTools/icons/document-save-as.png    |    Bin 0 -> 1097 bytes
 vistrails/packages/CLTools/icons/document-save.png |    Bin 0 -> 1150 bytes
 vistrails/packages/CLTools/icons/go-down.png       |    Bin 0 -> 874 bytes
 vistrails/packages/CLTools/icons/go-up.png         |    Bin 0 -> 877 bytes
 vistrails/packages/CLTools/icons/list-add.png      |    Bin 0 -> 386 bytes
 vistrails/packages/CLTools/icons/list-remove.png   |    Bin 0 -> 252 bytes
 vistrails/packages/CLTools/icons/view-refresh.png  |    Bin 0 -> 1364 bytes
 vistrails/packages/CLTools/identifiers.py          |      4 +
 vistrails/packages/CLTools/init.py                 |    563 +
 .../CLTools/test_files/intern_cltools_1.clt        |     78 +
 .../CLTools/test_files/intern_cltools_2.clt        |     81 +
 .../packages/CLTools/test_files/test_1.cltest      |      2 +
 .../packages/CLTools/test_files/test_script_1.py   |     42 +
 vistrails/packages/CLTools/wizard.py               |   1163 +
 vistrails/packages/HTTP/__init__.py                |     46 +
 vistrails/packages/HTTP/http_directory.py          |    175 +
 vistrails/packages/HTTP/init.py                    |    539 +
 vistrails/packages/ImageMagick/__init__.py         |     48 +
 vistrails/packages/ImageMagick/init.py             |    280 +
 vistrails/packages/JobSubmission/__init__.py       |     34 +
 .../packages/JobSubmission/common_definitions.py   |     51 +
 vistrails/packages/JobSubmission/init.py           |    315 +
 vistrails/packages/JobSubmission/machine.py        |     31 +
 vistrails/packages/SUDSWebServices/__init__.py     |     72 +
 vistrails/packages/SUDSWebServices/init.py         |    874 +
 vistrails/packages/__init__.py                     |     36 +
 vistrails/packages/analytics/__init__.py           |     39 +
 vistrails/packages/analytics/counts.vt             |    Bin 0 -> 14895 bytes
 vistrails/packages/analytics/executedWorkflows.vt  |    Bin 0 -> 22837 bytes
 vistrails/packages/analytics/init.py               |    180 +
 vistrails/packages/analytics/times.vt              |    Bin 0 -> 55862 bytes
 vistrails/packages/controlflow/__init__.py         |     39 +
 vistrails/packages/controlflow/conditional.py      |    119 +
 vistrails/packages/controlflow/fold.py             |    308 +
 vistrails/packages/controlflow/init.py             |    214 +
 vistrails/packages/controlflow/looping.py          |    241 +
 vistrails/packages/controlflow/order.py            |     62 +
 vistrails/packages/controlflow/products.py         |    135 +
 vistrails/packages/controlflow/utils.py            |    116 +
 vistrails/packages/dialogs/__init__.py             |     41 +
 vistrails/packages/dialogs/init.py                 |    110 +
 vistrails/packages/matplotlib/README               |     94 +
 vistrails/packages/matplotlib/__init__.py          |     63 +
 vistrails/packages/matplotlib/artists.py           |   3800 +
 .../packages/matplotlib/artists_template.py.mako   |    170 +
 vistrails/packages/matplotlib/bases.py             |    291 +
 vistrails/packages/matplotlib/diff.py              |    354 +
 vistrails/packages/matplotlib/figure_cell.py       |    294 +
 vistrails/packages/matplotlib/generate.py          |     29 +
 vistrails/packages/matplotlib/identifiers.py       |     46 +
 vistrails/packages/matplotlib/init.py              |    269 +
 vistrails/packages/matplotlib/mixins.py            |     62 +
 vistrails/packages/matplotlib/mpl_artists.xml      |   1935 +
 vistrails/packages/matplotlib/mpl_artists_diff.xml |     36 +
 vistrails/packages/matplotlib/mpl_artists_raw.xml  |   1935 +
 vistrails/packages/matplotlib/mpl_plots.xml        |   3277 +
 vistrails/packages/matplotlib/mpl_plots_diff.xml   |   1113 +
 vistrails/packages/matplotlib/mpl_plots_raw.xml    |   3154 +
 vistrails/packages/matplotlib/object.py            |     20 +
 vistrails/packages/matplotlib/parse.py             |   1001 +
 vistrails/packages/matplotlib/plots.py             |   5482 +
 .../packages/matplotlib/plots_template.py.mako     |    210 +
 vistrails/packages/matplotlib/specs.py             |    753 +
 vistrails/packages/matplotlib/update.py            |     78 +
 vistrails/packages/matplotlib/widgets.py           |     49 +
 vistrails/packages/parallelflow/__init__.py        |      3 +
 vistrails/packages/parallelflow/api.py             |    116 +
 vistrails/packages/parallelflow/engine_manager.py  |    491 +
 vistrails/packages/parallelflow/init.py            |     36 +
 vistrails/packages/parallelflow/map.py             |    581 +
 vistrails/packages/persistence/__init__.py         |     44 +
 vistrails/packages/persistence/compute_hash.py     |     82 +
 vistrails/packages/persistence/db_utils.py         |    171 +
 vistrails/packages/persistence/find_files.py       |    113 +
 vistrails/packages/persistence/find_workflows.py   |    132 +
 vistrails/packages/persistence/identifiers.py      |     40 +
 vistrails/packages/persistence/init.py             |    682 +
 vistrails/packages/persistence/repo.py             |    272 +
 vistrails/packages/persistence/schema.sql          |     37 +
 vistrails/packages/persistence/widgets.py          |   1184 +
 vistrails/packages/pipelineEdit/__init__.py        |     42 +
 vistrails/packages/pipelineEdit/init.py            |    153 +
 vistrails/packages/pythonCalc/__init__.py          |     47 +
 vistrails/packages/pythonCalc/init.py              |    127 +
 vistrails/packages/pythonCalcQt/__init__.py        |     51 +
 vistrails/packages/pythonCalcQt/init.py            |    139 +
 vistrails/packages/qgis/__init__.py                |     48 +
 vistrails/packages/qgis/init.py                    |    172 +
 vistrails/packages/rpy/README                      |     11 +
 vistrails/packages/rpy/__init__.py                 |     39 +
 vistrails/packages/rpy/init.py                     |    482 +
 vistrails/packages/rpy/widgets.py                  |     46 +
 vistrails/packages/spreadsheet/__init__.py         |     39 +
 vistrails/packages/spreadsheet/analogy_api.py      |    133 +
 vistrails/packages/spreadsheet/basic_widgets.py    |    267 +
 vistrails/packages/spreadsheet/cell_rc.py          |   3259 +
 vistrails/packages/spreadsheet/celltoolbar_rc.py   |    677 +
 vistrails/packages/spreadsheet/identifiers.py      |     39 +
 vistrails/packages/spreadsheet/init.py             |    153 +
 vistrails/packages/spreadsheet/spreadsheet_base.py |    316 +
 vistrails/packages/spreadsheet/spreadsheet_cell.py |   1179 +
 .../packages/spreadsheet/spreadsheet_config.py     |     39 +
 .../packages/spreadsheet/spreadsheet_controller.py |    129 +
 .../packages/spreadsheet/spreadsheet_event.py      |     97 +
 .../packages/spreadsheet/spreadsheet_execute.py    |    207 +
 .../packages/spreadsheet/spreadsheet_helpers.py    |    294 +
 vistrails/packages/spreadsheet/spreadsheet_rc.py   |   1872 +
 .../packages/spreadsheet/spreadsheet_registry.py   |    104 +
 .../packages/spreadsheet/spreadsheet_sheet.py      |    531 +
 vistrails/packages/spreadsheet/spreadsheet_tab.py  |   1203 +
 .../spreadsheet/spreadsheet_tabcontroller.py       |    822 +
 .../packages/spreadsheet/spreadsheet_window.py     |    668 +
 vistrails/packages/spreadsheet/widgets/__init__.py |     36 +
 .../spreadsheet/widgets/iebrowser/__init__.py      |     59 +
 .../spreadsheet/widgets/iebrowser/iecell.py        |    110 +
 .../spreadsheet/widgets/imageviewer/__init__.py    |     58 +
 .../spreadsheet/widgets/imageviewer/imageviewer.py |    371 +
 .../widgets/imageviewer/imageviewer_rc.py          |    557 +
 .../spreadsheet/widgets/richtext/__init__.py       |     66 +
 .../spreadsheet/widgets/richtext/richtext.py       |    143 +
 .../packages/spreadsheet/widgets/svg/__init__.py   |     61 +
 vistrails/packages/spreadsheet/widgets/svg/svg.py  |    194 +
 .../spreadsheet/widgets/webview/__init__.py        |     59 +
 .../spreadsheet/widgets/webview/webview.py         |    110 +
 vistrails/packages/sql/__init__.py                 |     47 +
 vistrails/packages/sql/init.py                     |    225 +
 vistrails/packages/tabledata/__init__.py           |     29 +
 vistrails/packages/tabledata/common.py             |     64 +
 vistrails/packages/tabledata/convert/__init__.py   |      6 +
 .../packages/tabledata/convert/convert_dates.py    |    580 +
 vistrails/packages/tabledata/identifiers.py        |      3 +
 vistrails/packages/tabledata/init.py               |     17 +
 vistrails/packages/tabledata/read/__init__.py      |      7 +
 vistrails/packages/tabledata/read/read_csv.py      |    241 +
 vistrails/packages/tabledata/read/read_numpy.py    |    136 +
 vistrails/packages/tabledata/test_files/random.dat |    Bin 0 -> 24 bytes
 vistrails/packages/tabledata/test_files/random.npy |    Bin 0 -> 104 bytes
 vistrails/packages/tabledata/test_files/test.csv   |      4 +
 vistrails/packages/tabledata/viewer.py             |     55 +
 vistrails/packages/vtk/__init__.py                 |     61 +
 vistrails/packages/vtk/base_module.py              |    272 +
 vistrails/packages/vtk/class_tree.py               |    303 +
 vistrails/packages/vtk/fix_classes.py              |     67 +
 vistrails/packages/vtk/hasher.py                   |     49 +
 vistrails/packages/vtk/identifiers.py              |     38 +
 vistrails/packages/vtk/init.py                     |   1383 +
 vistrails/packages/vtk/inspectors.py               |    244 +
 vistrails/packages/vtk/offscreen.py                |     87 +
 vistrails/packages/vtk/tf_widget.py                |    736 +
 vistrails/packages/vtk/vtk_parser.py               |    548 +
 vistrails/packages/vtk/vtkcell.py                  |   1146 +
 vistrails/packages/vtk/vtkcell_rc.py               |    198 +
 vistrails/packages/vtk/vtkhandler.py               |    220 +
 vistrails/packages/vtk/vtkviewcell.py              |   1045 +
 vistrails/packages/vtlcreator/__init__.py          |     41 +
 vistrails/packages/vtlcreator/init.py              |    176 +
 vistrails/packages/webServices/__init__.py         |     79 +
 .../packages/webServices/enumeration_widget.py     |    115 +
 vistrails/packages/webServices/init.py             |   1527 +
 vistrails/run.py                                   |    147 +
 vistrails/stop_vistrails_server.py                 |     57 +
 vistrails/tests/__init__.py                        |     50 +
 vistrails/tests/resources/__init__.py              |     36 +
 vistrails/tests/resources/console_mode_test.py     |    101 +
 vistrails/tests/resources/dummy.xml                |    164 +
 vistrails/tests/resources/dummy_broken.xml         |    165 +
 vistrails/tests/resources/dummy_new.vt             |    Bin 0 -> 2673 bytes
 vistrails/tests/resources/dummy_new.xml            |    342 +
 vistrails/tests/resources/dynamic_module_error.xml |     42 +
 vistrails/tests/resources/empty_bookmarks.xml      |     36 +
 vistrails/tests/resources/import_pkg/__init__.py   |      0
 .../import_pkg/test_import_pkg/__init__.py         |      8 +
 .../resources/import_pkg/test_import_pkg/init.py   |      1 +
 .../import_pkg/test_import_pkg/module1.py          |      2 +
 .../import_pkg/test_import_pkg/module2.py          |      2 +
 .../tests/resources/import_targets/__init__.py     |      5 +
 vistrails/tests/resources/import_targets/test1.py  |      7 +
 vistrails/tests/resources/import_targets/test2.py  |      0
 vistrails/tests/resources/import_targets/test3.py  |      0
 vistrails/tests/resources/import_targets/test4.py  |      0
 vistrails/tests/resources/import_targets/test5.py  |      0
 vistrails/tests/resources/import_targets/test6.py  |      0
 vistrails/tests/resources/paramexp-1.0.2.vt        |    Bin 0 -> 115626 bytes
 vistrails/tests/resources/paramexp-1.0.3.vt        |    Bin 0 -> 115266 bytes
 vistrails/tests/resources/pythonsource.xml         |    288 +
 vistrails/tests/resources/spx_loop.vt              |    Bin 0 -> 45577 bytes
 vistrails/tests/resources/terminator.vt            |    Bin 0 -> 36502 bytes
 vistrails/tests/resources/test_abstraction.xml     |    227 +
 vistrails/tests/resources/test_alias.xml           |    178 +
 vistrails/tests/resources/test_archive.zip         |    Bin 0 -> 459 bytes
 vistrails/tests/resources/test_change_vistrail.xml |    386 +
 vistrails/tests/resources/test_ticket_73.xml       |     46 +
 vistrails/tests/resources/triangle_count.vt        |    Bin 0 -> 7418 bytes
 vistrails/tests/resources/visvar-1.0.2.vt          |    Bin 0 -> 114074 bytes
 vistrails/tests/resources/visvar-1.0.3.vt          |    Bin 0 -> 114055 bytes
 vistrails/tests/resources/vtk.xml                  |   3840 +
 .../resources/vtkfiles/vtk_quadric_writer_test.vtk |   9001 ++
 vistrails/tests/run_on_mac.sh                      |     25 +
 vistrails/tests/runtestsuite.py                    |    484 +
 vistrails/tests/utils.py                           |    212 +
 vistrails/vistrails_server.py                      |     77 +
 1804 files changed, 822902 insertions(+)

diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ac86225
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+VisTrails is distributed under the "Modified BSD License".
+
+Copyright (C) 2011-2014, NYU-Poly.
+Copyright (C) 2006-2011, University of Utah.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..339e3e5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,10 @@
+Homepage: <http://www.vistrails.org>
+
+VisTrails is an open-source data analysis and visualization tool. It provides a comprehensive provenance infrastructure that maintains detailed history information about the steps followed and data derived in the course of an exploratory task: VisTrails maintains provenance of data products, of the computational processes that derive these products and their executions.
+
+For more information, take a look at the [documentation](http://www.vistrails.org/index.php/Documentation), the [users guide](http://www.vistrails.org/usersguide/v2.0/html/), or our [publications](http://www.vistrails.org/index.php/Publications,_Tutorials_and_Presentations).
+
+Binary releases are available on our [download](http://www.vistrails.org/index.php/Downloads) page. To report bugs, please use the github [issue](https://github.com/VisTrails/VisTrails/issues) tracker, after checking our [FAQ](http://www.vistrails.org/index.php/FAQ)
+ for known issues.
+
+Who we are: <http://www.vistrails.org/index.php/People>
diff --git a/RELEASE b/RELEASE
new file mode 100644
index 0000000..fa4f501
--- /dev/null
+++ b/RELEASE
@@ -0,0 +1,2128 @@
+RELEASE NOTES
+-------------
+Release Name: v2.1.1 build 90975fc00211 from v2.1 branch
+
+Bug fixes: 
+ - Ticket 816: Saved vistrail doesn't appear in 'my vistrails' (784414a617d2)
+ - Ticket 814: Parameter Exploration Broken (13da70d0b35f)
+ - Ticket Fix font issue for OS X 10.9. (22c0f0cca937)
+ - Fixes early gui import in application_server (3b2f6186cea9)
+
+From Release: v2.1 build 179c82045907 from v2.1 branch
+
+Enhancements: 
+ - Ticket 292: Add XSL support to RichTextCell (ae0126167aa8)
+ - Set file associations on Linux (579d702aaab9)
+
+Bug fixes: 
+ - Ticket 610: Exporting to the database should update locator (e6c3203a2710)
+ - Ticket 809: Suspending module attached to more than one sink kills workflow execution (3b791e47c453)
+ - Save button is not disabled when file is saved (d0dc3525f334)
+ - Items in workspace were sometimes shown incorrectly (d0dc3525f334)
+ - Context Menus in workspace were missing (d0dc3525f334)
+ - Read only string widget had multi-line button (9117e5bb367e)
+ - Opening configuration window with unsaved changes fails (fa3c1335580f)
+ - Infinite loop when changing string in Mashup App (2ee81b444300)
+ - Ticket 802: Can't exit VisTrails (da5c18a8b550)
+ - Ticket 796: [JobSubmssion] Issue when resuming job from unsaved vistrail after quitting (cc3d342688fb)
+ - Temporary files for untitled locators did not work correctly (3d9df4ab5ea2)
+ - Autosave prompts when vistrail is already open (cfc06bbc1c2c)
+ - Added LinuxMint as a supported Ubuntu variant (145c4c3c16ec)
+ - Ticket 581: Latex extension: clicking on a figure on the PDF file (on acrobat) gives an error (f1a581b11929)
+ - Publishing widget did not show unsaved vistrails correctly (0a4f49d7b081)
+ - Ticket 712: Useful messages when loading abstractions (07745fca0e99)
+ - Ticket 670: Traceback in configuration window (073b57d3bfca)
+ - Ticket 709: Recursing on abstractions tracebacks (5b850844b735)
+ - Ticket 776: 'Open in New Window' feature (71147be4b5ef)
+ - Ticket 794: Exits with 'cannot connect to X server' when starting core application (3c94ccc0ac9a)
+ - Fixed DBLocator equality method (e6c3203a2710)
+ - Ticket 771: Export to DB hangs if schema is not present (c102cb8f72c8)
+ - Ticket 787: Mac color chooser locks keyboard (628fb3e773fc)
+ - Ticket 740: Double-clicking a workflow in the workspace collapses the tree (3775961debd4)
+ - Ticket 738: Double-clicking a workflow in the workspace does not select it in the history view (3775961debd4)
+ - Ticket 723: Changing view fails on Fedora (ee7b4652e845)
+ - Ticket 722: Pipeline validation doesn't check for invalid functions (47d9c6de3e45)
+ - Ticket 277: Don't always receive "enable package" dialog (802fd0de0a7e)
+ - Ticket 415: Version tree refresh after API calls (0a2f6a59d6a7)
+ - Ticket 730: help() not available warning in Mac 2.1 binary (a946e4da59c1)
+ - Ticket 683: Packages should honor -S flag (9e5b83351d2f)
+ - Ticket 649: Batch mode doesn't allow a vt without a version (b5b65892aa10)
+ - Ticket 611: Mashups relational support missing (6bf5b2b02e48)
+ - Ticket 759: QLineEdit.setPlaceholderText does not exist in Qt 4.6.3 (a57fbba44e6e)
+ - Added progress reporting to Map module (0666e24d35f5)
+ - Cannot abort execution while a vtkAlgorithm is running (6b86705c0e59)
+ - Debian install script was used on Fedora (4acca49bcf74)
+ - Ticket 751: Display history view when opening vistrail with tagged versions (f2b053cee1aa)
+ - Spreadsheet history file path was set incorrectly (1789513a3afd)
+ - Fixes slot bug in PyQt 4.7.3 (17230667d58e)
+
+From Release: v2.1 beta2 build 99faabb791a0 from v2.1 branch
+
+Bug fixes: 
+ - Ticket #735: Windows dulwich install via pip fails (14d362a695df)
+ - Ticket #718: persistence can't handle directories (2a668a6e9881)
+ - Fix issue with persistent paths in Windows (2a668a6e9881)
+ - Ticket #728: Upgrading vistrail with disabled package (b28c85b718ac)
+ - Fix issue with subworkflows using disabled packages (b28c85b718ac)
+ - Fix issue with staging persistent directories (6cddde545965)
+ - Fixed module upgrades not working with dynamic packages (bf997c6bb0c6)
+ - Fix issue with transfer function widget (11213143752c)
+ - Rewrites error-prone code for GitRepo#add_commit() (c1d2f60cc10d)
+ - Persistence sets up a Git username if none is set (f37129976ba5)
+ - Fixes default values on optional Boolean ports (34365eb22800)
+ - Ticket #705: zip.exe not found in Windows binary (69a16e3c5b84)
+ - Ticket #700: Upgrades with package identifier changes fail (32f934bef698)
+ - Ticket #716: The new IPython console does not receive console output (96d65c1d0e80)
+ - Ticket #699: Base classes for parameter config widgets do not enforce defaults (6e1a5624b2ae)
+ - Fix BooleanWidget default handling (6e1a5624b2ae)
+ - Fixed tricky upgrade bug (1385b1d04f4b)
+ - Ticket #626: Passing parameters to single instance still opens second instance of VisTrails (334c743f3c33)
+ - Fix issue with package identifier changes and upgrades (32f934bef698)
+ - run.py/fix_paths was broken (16aeafb32399)
+ - Looping over a failing PythonSource caused logger to fail (2b5ff8105562)
+ - Fixes line-endings for TestUnzip (05a41335f050)
+ - Disables deleting from the persistence store (3c816e2734b8)
+ - Adds tests for type-checking, using PythonSources (3f0c602b003a)
+ - Disables type-checking for InputPort modules (4cdad5f113df)
+ - module_info now shows a module's id (0c504fe06615)
+ - Limits copy and paste in module_info (b99c674c8494)
+ - Detects cycles when computing pipeline signature (3a0fe0b5a880)
+ - Adds some more checks for persistent path type (846631436bd0)
+ - Raises a ModuleError if persisting an empty dir (d3d8b2193b5f)
+ - Makes type-checking optional (30659a8b6525)
+ - Fixes adding a directory to persistence (0c26c5b68ee6)
+ - While requires *or* ConditionPort or MaxIterations (bdcd04e3366c)
+ - Fixes a package_dependencies() crashing VisTrails (3263be2d2a52)
+ - Lets PythonSource use the default source (7684997bd888)
+ - PythonSource configuration dialog now uses default (3dff503ce8ce)
+ - Fixes StringWidget not showing default correctly (49d9dbd161f0)
+ - Restores read-only mode removed by previous merge (4bdf4705a669)
+ - Removes most of the persistence_exp package (90c70ee525e6)
+ - Fixes matplotlib not able to reuse cells (243ae02dd499)
+ - Makes UntitledLocator inherit CoreLocator (fc863650a893)
+ - Fixes looping modules (34d3029f3419)
+ - Minor changes to persistence code (96a605e0ca3f)
+ - Adds back PersistentPath#git_command() (295f9ade09cf)
+ - Fixes an issue with fix_dates() (3ad431172b47)
+ - More fixes to found_another_instance_running() (916cdeb23f6f)
+ - Makes fix_dates static in PersistentRefModel (56dec62ea2aa)
+ - Fixes persistence view (1bbb9bfb5f45)
+ - Adds tests for Unzip and UnzipDirectory (22c9d361b78b)
+ - Makes HTTPFile cacheable again (5bc3619d5cba)
+ - Fixes running the CLTools wizard standalone (77bf72286a8c)
+ - Fixes CLTools test on Windows releases (c503e4df5cf9)
+ - Fixes UnicodeDecodeErrors in DebugView (5ce4fd3515d7)
+ - Adds an UnzipDirectory module (634e6415a62e)
+ - Fixes Unzip code (10a2a3753185)
+ - Fixes runtestsuite.py ignoring *system* (b1210c5dc5c7)
+ - ImageMagick fixes (b0994f0e5684)
+ - Cleans disabled packages from cache (51a4cf021a31)
+ - Removes QPackagesWidget#erase_cache attribute (2919064fcce2)
+ - Don't expand the module palette on package load (890b6796e4a2)
+ - Re-enables type checking after all (ec6539366bbd)
+ - Fixes optional tabledata->spreadsheet dependency (511ab651ad93)
+ - Makes numpy arrays valid Lists (6425d8d7a286)
+ - Merge branch 'optimize-module' into 'master' (906a6edf8e73)
+ - Minor fixes to installers (ba9550bb44f2)
+ - Moves rgb2hsv and hsv2rgb out of paramexplore (f00a710f2424)
+ - PythonSource now sets unconnected output ports (75f4d085c57f)
+ - Adds a Delay port on the While module (07087da25339)
+ - Renames 'optimization.py' to 'looping.py' (b4b2183e3bab)
+ - Renames Optimize to While, inverts condition (0a07b43c7a2f)
+ - Adds state output/input ports (e6f57d0f4999)
+ - Adds the Optimize module to ControlFlow (ea4ebd43293c)
+ - ExecuteInOrder now uses the ControlFlow style (3d286c21a17d)
+ - Adds a Delay port on the While module (2b2648c08820)
+ - Makes log-related flags not fold-specific (954c984cca31)
+
+From Release: v2.1 beta build 16ae99d82468 from v2.1 branch
+
+Enhancements: 
+
+ - Ticket #695: Parameter explorations should be migrated through upgrades if possible (29f072af3087)
+ - Start migrating parameter explorations through upgrades (29f072af3087)
+ - Ticket #690: PythonSource Port Type Completion Requires "Enter" (f19e8a6e222a)
+ - Display version id in version properties (6eb10d9e3bcf)
+ - Static mashup animations (d40c74b42abb)
+ - Animation support for Mashups (cc578f2009a7)
+ - pip should now work on all platforms where it is available (b90fdba57189)
+ - Added graphical sudo for OSX (b90fdba57189)
+ - Added IPython Console (57f54943a73d)
+ - Use PyQt API version 2 (5229204a2dce)
+ - Multi-line editor for String modules (ff7d78aa76e4)
+ - Progress Dialog for workflow execution (459f3d003393)
+ - Improve interaction between pipeline views and controller. (a3bcdf6cc7a2)
+ - Improve API (aa1dbcc5f34d)
+ - Add more robust tracking of untitled vistrails. (913ed56d9445)
+ - Add matplotlib upgrades and integrate new pkg with new identifier scehme. (79bcb5673781)
+ - Support package identifier changes. (f77b92758c07)
+ - Build up the API and refactor core application methods (de9cea46a623)
+ - More updates to matplotlib package (44dff52c4da2)
+ - Add port spec translation from schema 1.0.3 to 1.0.2 (616a1090bf4b)
+ - Incremental/Online Layout  (80cb92674de6)
+ - Spreadsheet: "Find Version" and "Save Camera" now works for unsaved, closed, and "saved as" vistrails (24243fd207fc)
+ - DB support for Mashups (4e8da08d81b1)
+ - Support backward comaptibility for packages that have not been updated to use the "vistrails." prefix when importing. (6ca1d510a773)
+ - Updated persistence package to use dulwich, a pure python implementation of git (263b6f339e50)
+ - PROV document can now be exported using the command line (script) (5f0b04c049e5)
+ - Ticket #604: Add vistrail variable support to parameter exploration (04496edc9bfd)
+ - Added PROV entities for input and output data (ae52faaadfa9)
+ - Using Dublin Core metadata for PROV document (PROV exporter) (652099fe855d)
+ - New version of the PROV exporter (03a0a2785e89)
+ - First version of PROV exporter (9d32409c7118)
+ - Serializable mixin class for modules (895fab7db230)
+ - User does not need to create IPython controller manually anymore (ba7edbc30ca4)
+ - Added support for SSH IPython engines in parallel flow (1a56f69a18e6)
+ - IPython controller is stopped when closing VisTrails or disabling the package (704658297b0f)
+ - Ongoing work on the exporter for the PROV model (704658297b0f)
+ - IPython controller and engines are now started from VisTrails (4ec53425ca92)
+ - Added information about the machine from each IPython engine (8a361420a384)
+ - Map (parallel flow) can execute an outer subworkflow in IPython engines (949f9edb24df)
+ - First version of package 'parallel flow' (ac162d9e7ccb)
+ - Module / Group executions from the IPython engines are added to the provenance (518b3a4b1129)
+ - Added some modifications in the code to allow the execution of workflow in IPython engines (d89b7f9861ee)
+ - Forward error messages when connecting to other instance (0ad89de1cb2a)
+ - Add uniform method for building descriptor, port_spec strings (9633bb6c1365)
+ - Allow selected portions of the workflow to be relaid out (6f558cc3e697)
+ - Add option to nicely layout workflows automatically (15ff124c6652)
+ - runtestsuite now returns 0 for passed test runs (5d44f2879811)
+ - Ticket #606: Copy parameter explorations between workflows (b8a25bc9bac8)
+ - Updates to parameter explorations (696b83875d73)
+ - Ticket #603: Parameter Exploration from command line (d5f554fa40e0)
+ - Ticket #545: Make unset parameters accessible from the Parameter Exploration view (7b5cbe95bbf3)
+ - Ticket #547: Migrate parameter exploration persistence to schema and controller (7b5cbe95bbf3)
+ - Unset parameters can be used in parameter explorations (7b5cbe95bbf3)
+ - New schema for parameter explorations (7b5cbe95bbf3)
+ - Parameter explorations can be named (7b5cbe95bbf3)
+ - Parameter explorations are visible in the workspace (7b5cbe95bbf3)
+ - Parameter explorations can be accessed without the gui (7b5cbe95bbf3)
+ - Improve exception message for invalid port specification (c01407d42d7c)
+ - Improve error messages during package loading (2ea29738dd9b)
+ - API: VisTrailsAPI.execute() now accepts the same parameters in core VistrailController.execute_current_workflow() (012a7e828338)
+ - LaTex Extension: Added support for relative .vtl links in pdf and relative filenames in .vtl files (2329f7e6eb10)
+ - AutoConnect: when dragging a new module into a workflow, try to connect it (5d6475919bb3)
+ - Allow port_and_port_spec_match to match two port specs (e068f2a835e2)
+ - Ticket #555: Move package-specific missing package handlers (42131938cd0f)
+ - Support enumerations for parameters (571a24363dda)
+ - Add gui support for different port shapes (9f7e54780c7b)
+ - Show when ports are set by darkening the port (9f7e54780c7b)
+ - Add visual cues for the number of connections set/needed/allowed (9f7e54780c7b)
+ - Added port docstrings to the VTK package (49aa19ba2ce3)
+ - Updated port documentation (befd489265d2)
+ - Add schema support for max/min connections for ports (befd489265d2)
+ - Native schema for Vistrail Variables (201b489e1c26)
+ - Add load_package method to API (abbc89ef42dc)
+ - Add load_workflow method to api (5786189661b2)
+ - Automatically install PyQt4 on Fedora Linux (b11e69aafe2e)
+
+Bug fixes: 
+ - Fixed spreadsheet capturing keys in other windows (aad252798fe6)
+ - Fix issues with completions in port tables (f19e8a6e222a)
+ - Ticket #692: Parameter exploration schema logic invalid (44a29f0422b8)
+ - Fix translation bugs between schema versions. (6643e4dd610d)
+ - Ticket #693: Issue with PortSpecItem ids (16413b49c806)
+ - Fix ids on PortSpecItems (16413b49c806)
+ - Ticket #691: Executing a parameter exploration without the spreadsheet fails (48ccd5a64f54)
+ - Ticket #689: Mashups preview broken (3ea331e01abc)
+ - Refactor get_pipeline_name calls and remove substring hacks (3d8a9c875288)
+ - Fix QChar issue with parameter exploration (e07da85567a6)
+ - Fixed invalid current_view causing setCurrentWidget to fail (c93061c00bcb)
+ - Job Monitor: Could not run more than one job job in the same vistrail (609f09df5ce4)
+ - Job Monitor: Could not delete job other than current pipeline (609f09df5ce4)
+ - Job Monitor: Job for current pipeline was not stored on shutdown (609f09df5ce4)
+ - Looping over a failing PythonSource caused logger to fail (3bdf9620dd00)
+ - Ticket #678: Relational DB support for schema v1.0.3 broken (d54eb24cba1f)
+ - Fix issues with PortSpecItem (d54eb24cba1f)
+ - Ticket #680: Package configuration broken (20ba5b110fae)
+ - Fix broken clipboard check for paste (a6d1cc7c840c)
+ - Use codepath when identifier is not enabled when warning for old style imports (6a7f4a99a0c7)
+ - Disabling a package did not select it in the Available Packages list (8f50dcf2d941)
+ - Fixed vistrails->crowdlabs in latex/example2.tex (a95605ef12ab)
+ - Module: controller was not set in default moduleInfo (7360a90e23cd)
+ - Ticket #675: save_from_gui() is broken (482624c80e2e)
+ - Fix issue with saving untitled vistrails (482624c80e2e)
+ - Fix typo in application's convert_version (1866ec46e5ec)
+ - Logging fails when Group executed by Map fails (fcb6d4b1b637)
+ - VisTrails Server: fixed generating a pdf from a vistrail tree  (0a3d02e92b48)
+ - Ticket #668: Commit 6cf6920 broke API tests (76887e74224e)
+ - open_many_from_db should not be used with pre 1.0.2 schemas (e2b247f2c588)
+ - Updated latex example files to use crowdlabs instead of vistrails.org (0314ecf38606)
+ - Fixed generating an image of workflow graph from the command line (3f40090c5e12)
+ - Images in thumbnails are now sorted by cell location (498081d7cdc5)
+ - Errors in package dependencies method caused VisTrails to fail on startup (1adc3d25bf73)
+ - Fix issue with intermediate persistent files not being found in the store when a uuid is already assigned. (72c89f5aa6ca)
+ - Fix earlier noted issue with importing the registry in create_instance_of_type (78df1961b099)
+ - Fix some issues with Windows paths and locators. (2e2c35df7dcf)
+ - Ticket #662: VistrailController constructor does not set _current_full_graph (a3bcdf6cc7a2)
+ - Push controller constructor calls through set_vistrail (a3bcdf6cc7a2)
+ - Don't generate an error when a user attempts to drag a module into a non-pipeline view (f7abe1fd73b9)
+ - Ticket #664: Debug Message Fails with AssertionError (5008bf52a105)
+ - Ticket #661: Controller's current_version=-1 causes issues (c69b430e1701)
+ - Fix issue with inconsistencies when current_version=-1 (c69b430e1701)
+ - Ticket #590: Packages are not updated when userpackages dir is modified (88480456e2cf)
+ - Fixed bug in matplotlib cell resizing (bbe9a6078797)
+ - Vistrail Variable list was changing while being iterated over (99e60cf4dccf)
+ - Saving log to prevoius version failed (d56da92fa406)
+ - Fixed update_db script to work with master (04968e309d94)
+ - Allow reading different versions of subworkflows from DB (c5a33a0b8ead)
+ - Fixed loading wrong abstraction DB version (06a06be04889)
+ - Fixed trying to write empty workflow list to DB (06a06be04889)
+ - PipelineView: Execution exceptions were not caught which caused jobView to lock up execution (3b460bdb7c95)
+ - Mashups: controller_changed caused widget to be redrawn even when the controller did not change (801c3b8e58a8)
+ - Ticket #656: Control Flow Wizard is broken (95275d116c24)
+ - Fixed deleting mashup alias using Del/Backspace key (1d68ccf02f81)
+ - color picker widget gets orphaned in the alias inspector (1d68ccf02f81)
+ - Fixed bug on PROV exporter (f7675297ad23)
+ - Fix issue with Mac binary and the vistrails.py sys.path changes (09840f6c815b)
+ - Save log to xml action was not enabled in menu (dbc83ce34917)
+ - Ticket #641: PersistentInputFile not recognizing changes in the file contents (4f85d3d25ab9)
+ - Fix issue where file changes were not being recognized (4f85d3d25ab9)
+ - Ticket #639: Package details are not updated when a disabled package is selected in preferences panel (a251d6fe54a0)
+ - Execution of workflows in IPython engines (ba7edbc30ca4)
+ - Groups and Subworkflows can now have their execution log annotated (d89b7f9861ee)
+ - Ticket #635: Error translating from schema 1.0.2 to 1.0.3 (5fbdbe702dcb)
+ - Fix issue with whitespace between port spec items (816094bc7d64)
+ - Ticket #577: Publish window always shows grayed out snippet (fc9c5e5e11ce)
+ - Ticket #633: Automatic package download is not working on master (bce780145a5c)
+ - Ticket #626: Passing parameters to single instance still opens second instance of VisTrails (0ad89de1cb2a)
+ - CLTools: Modules were not reloaded after reloading scripts (283f8b57166b)
+ - CLTools: "env" option was not reset in wizard when loading other tool (283f8b57166b)
+ - Server mashup request need to use db user with write access (81c51908662c)
+ - MissingPackageVersion exceptions need to be tied to specific modules (5d13c3e8292b)
+ - Ticket #629: Issue with namespace (63a696d66c3b)
+ - Fixed issue with reloading packages with namespaces (63a696d66c3b)
+ - Allow only a single MissingPackage exception to be included in an InvalidPipeline container exception (a1401ec6afbb)
+ - Fixed typo with ghosted pen color (a0bdae3f8c4a)
+ - Ticket #627: Duplicate enable package messages (fb21c5c5e4b0)
+ - Fix errors in parameter exploration when viewing invalid pipelines (fb21c5c5e4b0)
+ - Do not emit errors from the query view when the selected version changes (9e1eb696ce67)
+ - Ticket #617: Hard import from the v1_0_0 schema in opm.py makes it fail with other schemas (1c7b21fab942)
+ - Fix OPM import (1c7b21fab942)
+ - Windows: Saving vistrail zip xml fails when zip.exe cannot be located (d80fbb746549)
+ - Ticket #624: unix /bin/ls check fails on fedora 17 (bcd044c4ff75)
+ - runtestsuite.py should not care about empty string arguments (f417c703c364)
+ - Fixed typo in parse/update for parameter types introduced in recent commit (133102abe14f)
+ - #623 (133102abe14f)
+ - Fixed issue with connecting tuple ports in the API (5eddcc1a9e47)
+ - Ticket #621: Hidden ports that are used in connections are not set to visible (e40295454a40)
+ - Fixed visibility of a connected port in ports panel (e40295454a40)
+ - Fixed issue when connecting modules (2811ba5d4ff3)
+ -  Fixed documentation file of CLTools that was causing a failure when building the pdf version of the usersguide  (a0c19535e7d6)
+ - Ticket #618: Open Workflow from DB missing in file menu (61619a425285)
+ - Ticket #614: test_abtraction_create fails in test suite (6885385a769d)
+ - Preferences sometimes tried to set up a removed package (5d44f2879811)
+ - SplashScreen was never deleted (5d44f2879811)
+ - Ticket #613: triangle_area.vt fails on the map operator (ad4b579121c2)
+ - Fix bug with obtaining port spec signature (ad4b579121c2)
+ - Ticket #612: User-defined parameter exploration editor is problematic (7512a2d05434)
+ - Fix issue with modified group signatures (b542543e1332)
+ - is_running_gui missing in VistrailsServerSingleton (557586218e5a)
+ - Fixed issue where OPM export could not resolve ports in parent modules (d084c5742ffb)
+ - SUDSWebServices did not handle empty configurations correctly (0cfe904c59f4)
+ - Ticket #583: CLTools: sometimes a module called CLTools is displayed (f2d755b24f53)
+ - Empty packages could not be reloaded (f2d755b24f53)
+ - PortSpecItem schema did not work on MySQL (b7556465275b)
+ - Parameter Explorations were not being converted correctly from 1.0.2 (b7556465275b)
+ - Parameter Explorations were not being loaded from database correctly (b7556465275b)
+ - Saving a Vistrail failed when package manager was not available (b7556465275b)
+ - Ticket #601: Connection port compatibility should be checked at a lower-level (f984fd5087c0)
+ - Check port compatibility at controller level (f984fd5087c0)
+ - Ticket #602: core api does not work in console (1d965a2cf952)
+ - Add missing methods to GUI application (1d965a2cf952)
+ - Ticket #599: Missing defaults cause exception when adding a function (a98e0a7962c8)
+ - Ticket #594: Defaulted booleans added twice (ef684f869d62)
+ - Fix duplicate boolean values when using defaults (ef684f869d62)
+ - Update color of cached modules correctly and reset colors on re-execute (48981ae5cfbe)
+ - Do not set module color back to active after it has been run (4f55071bb133)
+ - Ticket #591: User-decorated modules do not change color during execution (86fe5d0ad9a1)
+ - Module status brushes are checked first when setting the color of a module (86fe5d0ad9a1)
+ - Ticket #592: Dragging a Group module into a pipeline causes an invalid pipeline error (bb2f60099e4c)
+ - Guard against empty group modules (bb2f60099e4c)
+ - Spreadsheet package: Checking if the GUI is running before trying to initialize the package. (c9d20070140c)
+ - Catch exceptions when selecting invalid modules (3c3a6755adfa)
+ - Ticket #586: Selecting an invalid module raises exceptions (cb6c5b161c57)
+ - enabling/disabling package did not invalidate pipeline (1a280b63a745)
+ - Ticket #585: Failed reloading of a package does not invalidate modules (057f031ee4c3)
+ - Fixed issue where modules were not marked as invalid before validation (057f031ee4c3)
+ - Ticket #584: Enabling a package adds it to the enabled package list even if there are errors (11125174c7ff)
+ - Fix issues with package list in preferences (11125174c7ff)
+ - Unselect port on mouseReleaseEvent (56f2d9aedf37)
+ - SUDSWebServices: Offline Mode by storing WSDL in .vt file was not portable (eba546527401)
+ - SUDSWebServices: Typo in handle_missing_module caused packages with wrong names (eba546527401)
+ - Ticket #575: Vistrail variables panel has an overdraw problem (52c864c3ddb2)
+ - Ticket #576: Analogies are only displayed if we change the focus out of VisTrails to another application and back (8c023062c639)
+ - Ticket #539: Standard Module Configuration Widget asks to save when two ports are enabled (c9d5d03962b2)
+ - Configuration widgets will prompt to save only when the current module change, making it easier to copy text from another application (c9d5d03962b2)
+ - Ticket #569: Connected icon in Module Information does not disappear after removing connection (11e93fd142cb)
+ - Loading an image from workflow graph or a version tree was not working in the command line (2329f7e6eb10)
+ - Workflow results that used a VTKCell were consisting of a black screen when running in batch mode (49adb4fd6b5d)
+ - Ticket #487: isosurface script version of terminator.vt causes vistrails to crash (76de9f741635)
+ - Ticket #540: Vistrail is not always marked as changed when containing a vistrail variable (49cb21769a83)
+ - Ticket #563: Temporary connection does not appear second time you create the same connection (3bd812f9cd6c)
+ - Fix issue with temporary connection disappearing (3bd812f9cd6c)
+ - Ticket #546: Selecting a version selects the text box instead of the version ellipse (a19863118684)
+ - Ticket #550: Workspace state_changed is slow (bd734eb57838)
+ - Ticket #553: Suspended module does not execute on second run even when notcacheable (8eb9f8d11575)
+ - Parameter Exploration only worked on parameters from the Basic Modules package (75cca6574d0e)
+ - Fixed minor issue with PortSpec shape and docstring attrs (aebf4f84b052)
+ - Ticket #418: The database schema should use larger data types (75c7c6c89fdf)
+ - Bug in translation from 1.0.3 to 1.0.2 (75c7c6c89fdf)
+ - Fix issue with configure item grabbing mouse. (479a29491abc)
+ - Removed capitalized methods from ports in VTK (49aa19ba2ce3)
+ - Parameter Exploration: Changed call to update the progress bar to be thread safe (b9942f416fe1)
+ -  Mediawiki extension: fixed undefined variable  (d3d68b1c53ab)
+ - WorkflowExecution.completed were set to False in the vis_log, it should be an int. (50a2a68e177a)
+ - DBVistrail.hash*Annotation() fails when annotation values are ints (3d7f1b9cc078)
+ - Fixed path_to_figures and get_wf_graph_ calls in application_server (6df2c53cc880)
+ - Do not import VTKCell unless we have the spreadsheet (a8b7c8345ee9)
+ - HTTP Package now respects alternate dotVistrails setting (88b53249d96d)
+ - The create analogy button is too small (65be8388e906)
+ - "Show raw pipeline" and "construct from root" commands should switch to the pipeline view (dc2deb9ed6e0)
+ - Fix command_line argv dependency (5786189661b2)
+ - Mashups: slider and numericstepper widgets are only displayed for numeric aliases (3b8c4f954bce)
+ - Mashups: Validating Min Max and Step edit boxes so they accept only numbers (3b8c4f954bce) 
+ 
+From release: v2.0.2 build 3813fdd2573b from v2.0 branch
+
+Enhancements: 
+ - Added animation support to matplotlib/pylab (38fb971b6305)
+ - Job Monitor Improvements (af8f43039c94)
+ - Job Monitoring Tool View (3c43a8c5b3b7)
+ - Add support for customizing which packages are (not) reloaded (91e18f8749a0)
+ - Testing: Validate Workflows by comparing old and new thumbnails (401588f3bfdb)
+ - Added saving/loading SubWorkflows to/from the DB as part of a vistrail bundle (0704f03b2011)
+ - Ticket #628: Set the path to the vistrails tmp dir (f07b3223d16d)
+
+Bug fixes: 
+ - Saving log to previous version failed (e66941c40e22)
+ - Opened vistrails were not selected (14415ac3c709)
+ - parallelflow: Do not deepcopy module dict (e66a6a3713ec)
+ - Fixed matplotlib spreadsheet cell resizing issue. (45f803f0763c)
+ - API: return result after execution (aec0ed019ac5)
+ - Job Monitor icons were set incorrectly (d5e332c4e410)
+ - Job Monitor did not delete job when vistrail was closed (d5e332c4e410)
+ - Workspace: Sometimes selecting an open vistrail does not select it (e1f57079d0fd)
+ - Ticket #651: Function remap upgrade operations performed in incorrect order (6aaa72017fa8)
+ - Fix ordering in function remap (6aaa72017fa8)
+ - Ticket #648: 'OutputPort' object has no attribute 'module_exec' (c9847fc14bb9)
+ - Ticket #647: ModuleSuspended does not work inside Groups (c9847fc14bb9)
+ - Ticket #645: Document py_import in dev guide (bf9a58708fa2)
+ - Ticket #646: Reloading packages fails in some cases (91e18f8749a0)
+ - Fix issues with package reloading (91e18f8749a0)
+ - Fixed broken mimetypes on Windows (9aa51dd35301)
+ - Ticket #643: cannot open workflow triangle_area.vt (67726aceba3b)
+ - Ticket #625: Improve crowdLabs upload interface (7389abac0902)
+ - Added DB version map 1.0.2->1.0.3 needed when downgrading the log (172301ad3858)
+ - Saving abstractions do DB was missing version translation (45ebc5afa303)
+ - Removed faulty import DBProvModel (6727b6ee2fe8)
+ - Ticket #619: Create Analogy does not work on spreadsheet (39df0813e11c)
+ - Fix issue with analogy api in the spreadsheet (39df0813e11c)
+ - Ticket #638: Re-execution of SubWorkflow is missing parameters (294574341168)
+ - Fix issue with subworkflow caching (294574341168)
+ - Ticket #634: Package Documentation says port sigstring can contain spaces (dfc9db1f4dc5)
+
+From Release: v2.0.1 build 5e35e2b83b90 from v2.0 branch
+
+Enhancements:
+ - ALPS package: Updated to version 2.1.1 (4741aa04a9d7) 
+ - Support import of schema v1.0.3 (94bb430fa0f0)
+ - CLTools: Preview command line arguments and module ports (6c737e297a60)
+ - CLTools: Reload modules from the wizard (6c737e297a60)
+ - CLTools: Add env port using wizard (6c737e297a60)
+ - CLTools: Extended documentation (6c737e297a60)
+ - CLTools: Ability to specify fixed environment variables for modules (6ece9152e511)
+ - CLTools: Write changes in environment variables to execution log (6ece9152e511)
+ - Added server function for seeing and enabling/disabling packages (1b7ad7717b31)
+ - CLTools: Ability to set working directory (cbf02c561ccd)
+ - CLTools: New arg type inputoutput that enables files be used as both input and output (692e3ce05961)
+ - CLTools: You can now specify file endings for output files using the suffix option (692e3ce05961)
+ - Ticket #582: CLTools: should support other types (c3b49457c3a5)
+ - Added single instance check as a configuration option and a command line option (4032ca504171)
+ - Improved exception message for invalid port specification (431802313d43)
+ - Improved error messages during package loading (4175f8c09b4d)
+
+Bug fixes: 
+ - Added the missing v1_0_3 directory for schema v1_0_3 support from master branch (916cf9162df8)
+ - FileHooks for DBVistrail types should be skipped (94bb430fa0f0)
+ - Check if package has been removed before setting package information (94bb430fa0f0)
+ - CLTools: Modules were not reloaded after reloading scripts (6c737e297a60)
+ - CLTools: "env" option was not reset in wizard when loading other tool (6c737e297a60)
+ - Server mashup request need to use db user with write access (af73f32d44c0)
+ - get_vt_graph_png was broken (af73f32d44c0)
+ - Ticket #617: Hard import from the v1_0_0 schema in opm.py makes it fail with other schemas (2fefff447711)
+ - Fix OPM import (2fefff447711)
+ - Windows: Saving vistrail zip xml fails when zip.exe cannot be located (32bd4aa03c3b)
+ - Ticket #624: unix /bin/ls check fails on fedora 17 (ee2cd7d1f6c3)
+ - Ticket #621: Hidden ports that are used in connections are not set to visible (4cb7b1758bac)
+ - Fixed visibility of a connected port in ports panel (4cb7b1758bac)
+ -  Fixed documentation file of CLTools that was causing a failure when
+building the pdf version of the usersguide  (3899208009dd)
+ - is_running_gui missing in VistrailsServerSingleton (272006002712)
+ - Ticket #618: Open Workflow from DB missing in file menu (8e413fc8f504)
+ - Ticket #614: test_abtraction_create fails in test suite (2315d8e92026)
+ - Ticket #583: CLTools: sometimes a module called CLTools is displayed (11107c05a73a)
+ - Empty packages could not be reloaded (11107c05a73a)
+ - Ticket #612: User-defined parameter exploration editor is problematic (deab533c7302)
+ - Fix issue with modified group signatures (cd8e2467903b)
+ - Ticket #464: VTK Package does not support VTK 5.10 release (65462fd17800)
+ - Fixed issue where OPM export could not resolve ports in parent modules (cdc1a53bf496)
+ - Fixed issue where modifying a defaulted parameter caused a second copy of the parameter to be added (d6924b42d821)
+ - Ticket #602: core api does not work in console (ac85e1935819)
+ - Add missing methods to GUI application (ac85e1935819)
+ - Ticket #594: Defaulted booleans added twice (e90af069e58a) (d6924b42d821)
+ - Fix duplicate boolean values when using defaults (e90af069e58a)
+ - Update color of cached modules correctly and reset colors on re-execute (421ef3182f7b)
+ - Do not set module color back to active after it has been run (1f6ea4ff45e3)
+ - Ticket #591: User-decorated modules do not change color during execution (c53334a5e412)
+ - Module status brushes are checked first when setting the color of a module (c53334a5e412)
+ - Ticket #592: Dragging a Group module into a pipeline causes an invalid pipeline error (cd8b62b219a6)
+ - Guard against empty group modules (cd8b62b219a6)
+ - Spreadsheet package: Checking if the GUI is running before trying to initialize the package. (a71954b1639a)
+ - Ticket #586: Selecting an invalid module raises exceptions (225f057294dd)
+ - Catch exceptions when selecting invalid modules (225f057294dd)
+ - enabling/disabling package did not invalidate pipeline (a363ed3f0151)
+ - Ticket #585: Failed reloading of a package does not invalidate modules (46a6204cbab4)
+ - Fixed issue where modules were not marked as invalid before validation (46a6204cbab4)
+ - Ticket #584: Enabling a package adds it to the enabled package list even if there are errors (0593aad10533)
+ - Fix issues with package list in preferences (0593aad10533)
+ - SUDSWebServices: Offline Mode by storing WSDL in .vt file was not portable (6fa03241e9c6)
+ - SUDSWebServices: Typo in handle_missing_module caused packages with wrong names (6fa03241e9c6)
+
+From Release: v2.0 build 240bcab5bbcd from v2.0 branch
+
+Enhancements: 
+ - Ticket #424: SUDSWebServices should store the WSDL spec in the .vt file to enable upgrades (88f616a741de)
+ - Packages can store files in .vt zip files (88f616a741de)
+ - .vt files using SUDS Web Services can now be edited offline (88f616a741de)
+ - CLTools: package menu option for reloading all scripts (3c83b7101bc0)
+ - CLTools: added Open Wizard to package menu (1f19d0a7339a)
+ - Added CLToolsWizard.command file to Mac Binary (99adfd823a2d)
+ - Ticket #430: use of absolute file names can be problematic in vtl files (2b731d8d5043)
+ - LaTex Extension: Added support for relative .vtl links in pdf and relative filenames 
+   in .vtl files (2b731d8d5043)
+ - Package requirement for the job submission package (77f3f1761f92)
+ - Ticket #519: Executions in Version View that fail should change to pipeline (cea08c6e25d9)
+ - Switch to pipeline view if an execution fails (cea08c6e25d9)
+ - Ticket #557: Password dialog (f9739db121c4)
+ - Ticket #559: Persistent modules do not work in groups (4ef2b8639b6d)
+ - Allow modules in subpipelines to be cached (4ef2b8639b6d)
+ - Added alps package to VisTrails 64-bit Windows Binary  (519d862a63f5)
+
+Bug fixes: 
+ - Ticket #575: Vistrail variables panel has an overdraw 
+   problem (c4171c8aab63) (09815c35efb8) (7ca53292670a) (07fdeb8602a7) (45a4818a0b5c)
+ - Ticket #404: Overriding a port via add_*_port does not work (47e72744ede1)
+ - Ensure add_*_port can override ports in superclass port lists (47e72744ede1)
+ - Ticket #523: Default values for parameters not showing (e3f1b1a3253f)
+ - Add default support back in (e3f1b1a3253f)
+ - Fixed spelling in repository.py (6c2259e84214)
+ - SUDSWebServices: Wrong indentation caused vistrail save to fail (5497e50c727f)
+ - Ticket #576: Analogies are only displayed if we change the focus out of VisTrails to 
+   another application and back (d782197a1cab)
+ - Fix issue with redrawing the tree after analogies (d782197a1cab)
+ - Running instance was not accepting parameters from another instance (63b58b8416d0)
+ - Ticket #464: VTK Package does not support VTK 5.10 release (3e3700900ad0)
+ - Ticket #445: mashup previews is not always shown in the main window (9111971ce8c6)
+ - Now persistent cache works after one execution (87e8ff129b88)
+ - Ticket #573: Opened vistrail fail when reloading dependent package (b1ff731d904a)
+ - SUDSWebServices: Failed Web Services could not be removed (b1ff731d904a)
+ - Execution button may hang when execution fails (b1ff731d904a)
+ - Ticket #571: Vistrail variables cannot be used in more than one workflow (02f2acee1727)
+ - Fix issue when setting a vistrail variable on multiple modules (02f2acee1727)
+ - Ticket #574: Cannot add variable to empty detached Vistrail Variables window (4ae4f3d9c582)
+ - Fixed issue with creating vistrail variables in an undocked panel (4ae4f3d9c582)
+ - Ticket #539: Standard Module Configuration Widget asks to save when two ports are 
+   enabled (154525da1047)
+ - Ticket #521: Annoying PythonSource behavior (154525da1047)
+ - Configuration widgets will prompt to save only when the current
+   module change, making it easier to copy text from another application (154525da1047)
+ - QVistrailsWindow.get_current_view() was returning the wrong view sometimes (154525da1047)
+ - CLTools: IOErrors when executing process (d810075f00a6)
+ - Fix issue with analogies that also require upgrades (215ceae6ef1f)
+ - Fix typo (50da981b6938)
+ - Fix issue with remove vistrail variable modules and connections (c3183771c5ea)
+ - Ticket #569: Connected icon in Module Information does not disappear after removing
+   connection (9a68ec624c9d)
+ - Fix issue with connected indicator for ports (9a68ec624c9d)
+ - Eliminate duplicate warnings (f6020fa412bb)
+ - Use lil_matrix for analogies (f6020fa412bb)
+ - Modify logic of analogy usage to use current selected version (f6020fa412bb)
+ - Ticket #419: Analogies fail on new terminator.vt (83c7735b0d28)
+ - Change analogies to use a suitable default alpha value (83c7735b0d28)
+ - Ticket #567: CLTools has issues reading man pages on Mac OS X (cdb5368df6fc)
+ - Ticket #370: dataDirectory setting not used (73fe930b49ff)
+ - Loading an image from workflow graph or a version tree was not
+   working in the command line (2b731d8d5043)
+ - Workflow results that used a VTKCell were consisting of a black
+   screen when running in batch mode (80d55defb140)
+ - Ticket #551: Cannot access messages window when preferences window is open (cc8fa8e6ad8a)
+ - Ticket #487: isosurface script version of terminator.vt causes vistrails to 
+   crash (02caf56e6c0e)
+ - Ticket #564: Invalid view warning (3b2062c17cb0)
+ - Ticket #552: No visual clue when ubuntu package finishes installing (2f78b1b1d749)
+ - Ticket #540: Vistrail is not always marked as changed when containing a vistrail 
+   variable (7acddff31ff1)
+ - Ticket #566: QPixmap scaled error message (c6842a9fa320)
+ - Fixed QPixmap scaled issue (c6842a9fa320)
+ - Ticket #517: Undo menu item not working (a7b574defe31)
+ - Fix undo/redo in pipeline view (a7b574defe31)
+ - Fix issue with executions of untagged versions (36c1a73a46ae)
+ - Ticket #560: Workspace has very inefficient updates (51a4e7982bb7)
+ - Workspace: made loading mashups more efficient (51a4e7982bb7)
+ - Ticket #562: "Save as" replaces items from workspace (d8fa58ccd9c0)
+ - Ticket #560: Workspace has very inefficient updates (3dfac92ab688)
+ - Partial fix to make workspace more efficient (3dfac92ab688)
+ - Ticket #565: Version labels in query results are not gray (22e9920d1ea0)
+ - Fix colors in query results view (22e9920d1ea0)
+ - Ticket #504: The Query's refine option doesn't do anything (1fce254de2c5)
+ - Reenable refined version tree in the query view (1fce254de2c5)
+ - Ticket #532: Edit Package Abstraction Error (7c03b6999125)
+ - Fixed issue with error message for editing package subworkflows (7c03b6999125)
+ - Ticket #541: Crash when detaching ModuleInformation dockwidget on Mac (72c7afc3a95e)
+ - Fix crash on undocking module info palette on Mac OS X (72c7afc3a95e)
+ - Ticket #546: Selecting a version selects the text box instead of the version 
+   ellipse (5a7df50dd899)
+ - Make version tree selection more intuitive (5a7df50dd899)
+ - Ticket #538: Pipeline Connection Drawing? (ed11bdfffa54)
+ - Fix connection drawing issue on Mac (ed11bdfffa54)
+ - Ticket #558: Group signatures cannot be based only on interface (4ef2b8639b6d)
+ - Fix issue with caching group modules (4ef2b8639b6d)
+ - Fix initial layout of matplotlib cells (3a8d5c7c3d62)
+ - Decreased level of debug message when removing elements from Thumbnails cache (18531d5fb280)
+ - Ticket #534: Mashups hang with auto-update on (1472b6ba7f32)
+ - Ticket #550: Workspace state_changed is slow (1ed823ecbb96) (b75607ea9271)
+ - Ticket #556: Path to zip.exe not set correctly (d0389bec6df6)
+ - Fix logic in identifier checks in package manager (1882ed36cd76)
+ - Ticket #554: Port labels not displayed (a9454abc238a)
+ - Add missing port labels to ports panel (a9454abc238a)
+ - Ticket #553: Suspended module does not execute on second run even when 
+   notcacheable (3e22759385d3)
+ - Ticket #549: update_db.py script does not work (fb5ad0eb480a)
+ - Parameter Exploration only worked on parameters from the Basic Modules 
+   package (99969b93ece2)
+ - Autoloading a SUDS Web Service no longer produce error messages (c079bd9c52db)
+ - Ticket #513: Add detachHistoryView back (08bec17e40e6)
+ - Ticket #543: Changes to persistence module configuration doesn't work (d03382c67e1d)
+ - Fix issue where reconfiguring persistent modules caused unexpected behavior. (d03382c67e1d)
+ - Show error message when trying to open a vistrail with a newer schema version (32f47804b6c7)
+ - db_log_filename was not unset correctly for db cache (8fccb74ecab3)
+ - Ticket #531: Export To Stable Version menu does not work (1b742a9f70cc)
+ - Export to DB did not work (1b742a9f70cc)
+ - Reloading a vistrail from the database gave it the name "None" (1b742a9f70cc)
+
+From Release: v2.0-beta build 716501f8b2fd from v2.0 branch
+
+Enhancements: 
+ - Mashup View: Added float slider (b5d481049666)
+ - New module execution state suspended added (cb47d3fc66b7)
+
+Bug fixes: 
+ - Parameter Exploration: Changed call to update the progress bar to be 
+   thread safe (716501f8b2fd)
+ - Fixed bug in iceCream.vt example (929ddcaa504a)
+ - MySQLdb was not being shipped correctly in Mac binary (e50f1c91b3e8)
+ - Mashup View: integer slider did not set step size correctly (b5d481049666)
+ - Cached interpreter failed when handling wrong input type (b5d481049666)
+ - Mashup View: failure when handling errors in execution that does not use the spreadsheet (b5d481049666)
+ - Fixed qt.conf problem in installer script files on Windows. (a01fabd12456)
+ - Fixed arguments of get_wf_graph_png rpc call (7cc451bdb606)
+ - updateUpstream* failed when modules did not contain the suspended attribute (256f4b4dd8a5)
+ - Mediawiki extension: fixed undefined variable  (334083cc69e1)
+ - WorkflowExecution.completed were set to False in the vis_log, it
+ should be an int. (cb47d3fc66b7)
+
+
+From Release: v2.0-beta build 10836452c19a from v2.0 branch
+
+Bug fixes: 
+ - Fix issue with deleting modules and connections (10836452c19a)
+ - VTK package: fix problem when upgrading vtkCellArray.InsertNextCell input port (e29a873af4a1)
+ - Ticket #525: The create analogy button is too small (bf61e06b0a50)
+ - Ticket #526: "Show raw pipeline" and "construct from root" commands should switch to the pipeline view (3ada5972d872)
+
+From Release: v2.0-beta build b074d3a4eb44 from v2.0 branch
+
+Enhancements: 
+ - Added VisTrails Server documentation (611f2082f98d)
+ - Add more functionality to core.api (26c775f0a7bb)
+ - Ticket #518: Need to fix VTK ports with no parameters (9a985c40f6a2)
+ - Add separate workflow and log xml schemas (04cb36cc5305)
+ - Added support to hardcode necessary packages on startup (834e28f7cfa4)
+ - CLTools: Added enviroment variable and default directory support (5a6e1b0daba3) (7c9a113040c2)
+ - Add operation ids to messages about illegal operations (087b235e32de)
+ - Remove most PyQt4/gui dependencies in core functionality (e6ada340cc15)
+ - Ticket #55: Spreadsheet should have more shortcut icons (5f4db41dc8f2) (127037be178f)
+ - Ticket #284: Capturing Module Errors (60c055eff8f5)
+ - Display module toolTip errors in module stack trace dialog (60c055eff8f5)
+ - Wizard for CLTools - gui for wrapper creation (a7a1db436fd0)
+ - Added support for html and mediawiki extensions to
+access a remote vistrails server  (dd7456507ab4)
+
+Bug fixes: 
+ - Mashups: editing an alias' values list had no effect (c485a7433dde)
+ - Mashups: slider and numericstepper widgets are only displayed for 
+   numeric aliases (c485a7433dde)
+ - Mashups: Validating Min Max and Step edit boxes so they accept only 
+   numbers (c485a7433dde)
+ - Accessing Module Annotate from context menu did not work (ac100b566d84)
+ - Fixed problem where unrequested vistrail temporary files were being created during test suite (445e2b68d9e6) (1a539cad8a9a)
+ - Fix issue with alternate .vistrails directory and its subdirectories (7d26c36ef77a)
+ - Fixed MissingRequirement path and ubuntu detection (11dd911b66a3)
+ - Ticket #528: Install bundle fails with the new core_no_gui changes (87f9e83772ea)
+ - Rendering version and workflow view in server failed because of new gui in 2.0 (e149aa955dd5)
+ - save_many_to_db failed when list of objects were empty (ed257eb2d523)
+ - Vistrail server need to initialize theme after core_no_gui changes (c4d2809d9a09)
+ - Fixed server mode after merge with core_no_gui (4c2cad40c30f)
+ - Ticket #522: remove_connection failure (cc038a500e3c)
+ - Fix for remove_connection issues (cc038a500e3c)
+ - Fixed issues with tabbing in the python editor (c046c86bf0af)
+ - Fixed issue with vtkInteractionHandler which was not updated when the Save/Revert changes were made to source widgets (8abbfb8a51e9)
+ - Allow zero-parameter functions to be set from ports panel (9a985c40f6a2)
+ - Fixed issue with forced versions on modules (4ae602caa09e)
+ - Fix issue with merging thumbnails (5bcaa7e75c6d)
+ - Fixed typo in core.application's register_notification (42c7ae6b0e25)
+ - Argument error caused gui/vistrail_controller test to fail (e447e02b37ca)
+ - CHEBI wsdl changed (a7f1ab43159d) (6e00beb17ce6)
+ - Removed matplotlib backend selection warning (23a6e3a89001)
+ - Dragging a version directly on a spreadsheet cell was not executing 
+   the workflow (3395a01a2139) (66d49a064e59)
+ - Fixed unable to display jpeg images in the spreadsheet
+due to a wrong Qt plugins configuration (a6a1950024a7) (333456765278)
+ - Display more meaningful error when persistent inputs do not exist in a repository (1c905da96eb1)
+ - Fix issue in ModuleDescriptor.expand_descriptor_string (7b973b4a4aeb) (35f1feb4d853)
+ - Add icons to CLTools so that they not only work on X11 (a6a08bc1dd4e) (69110931c4e3)
+ - SourceConfigurationWidget silently fails when code contains 
+   non-ascii characters (0c020878edf3) (768fc8ed4df5)
+ - MultiHeads configuration was not working on 2.0  (669957620bdc) (07e9672e6186)
+ - Ticket #513: Add detachHistoryView back (f238870a17fe) (38a3b95d1b5d)
+ - Added back detachHistoryView option (f238870a17fe) (38a3b95d1b5d)
+ - Removed configuration options that are only used in non-interactive mode 
+   from Expert Configuration (bb0046fe6f49)
+ - Ticket #515: opening a specific version from the command line does 
+   not work (20ab44a5a4ce) (468fe95d351f)
+ - Fixed opening a specific version from the command line (20ab44a5a4ce) (468fe95d351f)
+ - Ticket #512: Add how to create alias to users guide (83e49a3d487b) 
+   (d56e02d30133) (a6249193e674) (f5b881191441)
+ - Ticket #421: db version import error handling (a6eb8ae65052) (6ac6c0abec6e)
+ - Detect between when a db version is missing and when it contains 
+   an error (a6eb8ae65052) (6ac6c0abec6e)
+ - Ticket #391: Module colors in Visual Diff are wrong after upgrades (6b16033351a9) (c28166f2110b)
+ - diff view did not use correct brush for non-upgraded modules (6b16033351a9) (c28166f2110b)
+ - autosave feature caused "new file" action to fail (9b19a0fc5193) (6c49e4329b8a)
+ - Ticket #511: "export workflow as xml" adds extension as "..xml" (two dots) if 
+   not explicitly specified (39d605e721e5) (fb2061eec506)
+ - get_save_file_locator_from_gui was adding two dots (39d605e721e5) (fb2061eec506)
+ - SpreadSheet: prompt the user to save unsaved vistrails before trying 
+   to save a spreadsheet (d296dae6e508) (5e29113d0694)
+ - Ubuntu Unity did not restore menu bar after being closed (3d702340c1fa) (719ad4dd22b5)
+ - Param Exploration User-defined function did not work because of new python 
+   editor interface (8354a9340944) (0f62ec4023c7)
+ - Ticket #510: The Spreadsheet can't open/save spreadsheets (9259d3b8d619) (ae73b7e48971)
+ - Ticket #194: Copy and paste duplicates aliases (7419092665c4) (27ee5e68a7e3)
+ - Ticket #480: Executions button doesn't work (c6a9a6ac15cf)
+ - Ticket #500: Double-clicking the Execute button causes VisTrails to Hang (e024a352c6ce)
+ - Double clicking execute button no longer hangs vistrails (e024a352c6ce)
+ - Ticket #508: Add port documentation back to ports panel (01f189a1a184)
+ - Ticket #505: Version notes are not always visible after an upgrade (d16b3c834c47)
+ - Issue correct version_selected signal after upgrades (d16b3c834c47)
+ - Ticket #502: change_selected_version causes key error in adjacency_list (25104a599816)
+ - Ticket #472: parameters in parameter exploration are reset if not executed (d07bcbd5104b)
+ - Parameter exploration with Color Constant was not working (b0e0da8cc61b)
+ - Ticket #462: Ungrab mouse error after editing subworkflow (2ffac0767f88)
+ - Ticket #432: Problem with labeling groups (2ffac0767f88)
+ - Allowing opening vistrail files that contain mashups. Mashups will be ignored (7d568fec386f)
+ - Ticket #454: Can't interact with TransferFunction widget using Qt 4.7.* (f897a8e68285)
+ - Fixed header placement in xml files that were causing tests to fail (a76060081c31)
+
+
+From Release: v2.0-alpha build c4e3600b6481 from v2.0 branch
+
+Enhancements: 
+ - Wizard for CLTools - gui for wrapper creation (de5fbcd6144a)
+
+Bug fixes: 
+ - Ticket #508: Add port documentation back to ports panel (d83b2637f5b5)
+ - Ticket #502: change_selected_version causes key error in adjacency_list (815d38ff608a)
+ - Ticket #472: parameters in parameter exploration are reset if not executed (829303e1efeb)
+ - Parameter exploration with Color Constant was not working
+ (ecfbedcd4406)
+
+From Release: v2.0-alpha build c4e3600b6481 from v2.0 branch
+
+Enhancements: 
+ - Wizard for CLTools - gui for wrapper creation (de5fbcd6144a)
+
+Bug fixes: 
+ - Ticket #508: Add port documentation back to ports panel (d83b2637f5b5)
+ - Ticket #502: change_selected_version causes key error in adjacency_list (815d38ff608a)
+ - Ticket #472: parameters in parameter exploration are reset if not executed (829303e1efeb)
+ - Parameter exploration with Color Constant was not working
+ (ecfbedcd4406)
+
+
+From Release: v2.0-alpha build 1b88c3949efd from v2.0 branch
+
+Enhancements: 
+ - VisTrails now requires Python 2.7.*, Qt 4.7.*, sip 4.12.2 and PyQt4 4.8.4 to run 
+ - Reworked VisTrails interface. Added Workspace palette where user's vistrails
+   are kept. Users can open multiple pipelines in different tabs that are 
+   detachable.
+ - In addition to Pipeline, History, Query and Exploration Views, new views were
+   added, including Provenance and Mashup views. The Provenance view displays the
+   execution logs of a vistrail. The Mashup view allows creating simple 
+   applications based on workflows by exposing only the relevant parameters. 
+   See the VisTrails manual for detailed instructions.
+ - Merged the "Methods" and the "Set Methods" panel into an improved 
+   "Module Information" Palette. Now port visibility, connectedness, and 
+   parameters are shown in a single display. Thus, for module types without 
+   special configuration widgets, there is no need for a separate configuration 
+   window.
+ - CLTools - package for wrapping command line tools (3ac68958d3db)
+ - Expand search results to include all open vistrails (b2a069e38956)
+ - Opening exported mashups using Open menu will execute them automatically (48cefab0a019)
+ - Added support for exporting a mashup to a .vtl file. To export a mashup, just 
+   click the "Export" button in the mashups inspector. Double-clicking the .vtl 
+   file will execute the mashup in VisTrails (09203c1e12b8)
+ - Show parameters for invalid modules (7078566f7b89)
+ - Changed "Keep" button to "Tag" in the Mashups View (5ed3637c2d6f)
+ - Open subworkflow from module palette (c48a11df430f)
+ - Executions in provenance view are now given names based on the 
+   "tagname + n" naming scheme (31a4a94cf967)
+ - Update executions in workspace when they are created (8b7b85229c64)
+ - Make pipeline current when selected in provenance explorer (49e93f5f789d)
+ - Remove gui dependencies for core.modules widgets (1b8487908620)
+ - Improved default query support (b9fed84af41a)
+ - Added color difference support for queries (b9fed84af41a)
+ - Mashups: made keeping the camera across updates as an option (1642d3573f62)
+ - Add extensible query support (0df170d3335d) (5d776c28b7e2)
+ - Workspace now updates Workflows and Mashups as they are created (429ceb313408)
+ - Expand Workflows/Mashups items by default (429ceb313408)
+ - Ticket #479: Dropdown boxes have white text (677a0b750762)
+ - Added support for html and mediawiki extensions to access a 
+   remote vistrails server  (2eba04217a99)
+ - Displaying mashups in workspace. Double-clicking a mashup will show 
+   version tree, select corresponding version and execute the mashup. (3df2af8d8cb2)
+ - Added support for multiple PythonSource configuration windows. Read-only 
+   windows can be detached from the main module onfiguration window. (372c0143f6b6)
+ - Remove workspace entry when selected file has been deleted (8bdd77c78fe2)
+ - Workspace can show workflows in a tree view (c715b4a84a38)
+ - Added a Control Flow Assistant (f05f014bc778)
+ - Added Vistrail Variables support, so that modules deriving from Constant can 
+   be used to create re-usable variables (a83402e0c218)
+ - Added support for cross-vistrail diffs (c300063531e8)
+ - Perform visual diff from workspace by dragging pipelines together (dd83c3f08cea)
+ - Simplify visual diff and improve parameter changes display (65849c433682)
+ - Search results show up in workspace window (f3a763972866)
+ - Improve query handling (e4b0722b1d70)
+ - Added support for opening a vistrail in a separate window (f502431ae11b)
+ - Added Expand All and Collapse All buttons to Module Palette (264410835b7)
+ - Added annotations to WorkflowExec in v1.0.2 schema (0ade1076517b)
+ - Provenance browser now shows status icon in list (fc112c4c1079)
+ - Autosort module palette (de80a5b0fb1c)
+ - Added merge by dragging vistrail to vistrail (6bb73281842a)
+ - Executable paper editing (3a96ea787a82)
+ - PythonSource editor will now indent newline to previous line (e221d10351d1)
+ - Improved PythonEditor class using QScintilla2 (d737455457db)
+ - PythonSource editor will now indent newline to previous line (d1e5d63bd715)
+ - Enhanced query capabilities (0e5f60ce0d91)
+ - Added support for interpreter to execute a pipeline with an extra list
+   of parameter values. Updating VistrailController calls to also accept
+   the new list (db6e4611305)
+ - persistence package now hides file references instead of deleting them (ae3d19282ef4)
+ - Added versioning for SUDS Web Services using content hash (47279d4246bf)
+ - Improved PythonEditor class using QScintilla2 (5ed5953f57b9)
+ - ParaView package: Added ScalarBarWidgetRepresentation to Rendering
+  namespace in modules list.  (7429a1be15cf)
+ - Add better provenance information for persistent entities (22964cfeb53b)
+ - New manager for persistent store (f0dafc611fd0)
+ - Improved efficiency of vtk workflow upgrades (3736cc9ef269)
+ - LaTex extension: Added an example for embedding local files (be50aeab59ca)
+ - Group SQL statements to enable faster DB communication (b520f1c847c8)
+ - ParaView package: Added server configuration window options to
+package configuration and loading initial values from there. Also added
+option to start paraview server when the package is initialized.  (9023c13aa76b)
+ - Ticket #408: Allow opening multiple PythonSource Editors (73e72b8419a8)
+ - Ticket #411: Support temporary directories in the FilePool (7eb29d2ba0fb)
+ - Initial version of a GIS package that uses QGIS (4cd7cc6df8db)
+
+Bug fixes: 
+ - VTK Package: Call to ResetCamera() in vtkRenderer was producing wrong 
+   results (d5789e5a560b)
+ - Ticket #499: Issue with BaseView.layout (9dc74870fde7)
+ - Fix issue where 'layout' was an overloaded field name (9dc74870fde7)
+ - Ticket #494: Tuple configuration is confusing and causes configuration errors (30bc134d5cdb)
+ - Ticket #498: Need to update code to show parameters for invalid modules (8da733c07199)
+ - Enable showing invalid function and show parameters in separate fields (8da733c07199)
+ - Updated version of suds python library on both Windows and Mac binary.
+ - Ticket #488: configuring webservices breaks vistrails (090a45a95f19)
+ - Ticket #456: Cannot copy/paste in detached pipelines/vistrails (970ec4ecfb42)
+ - Ignoring action updates when the view does not have the actions (970ec4ecfb42)
+ - Make provenance view read-only (9774b9e2928e)
+ - .vtl files marked to be executed when opening were not executed (09203c1e12b8)
+ - Ticket #496: Showing/hiding module ports resets module position (c073ff4bf200)
+ - Keep module position when changing visibility of ports (c073ff4bf200)
+ - Ticket #488: configuring webservices breaks vistrails (b8a935d8bbae)
+ - Ticket #495: vtkCellArray won't allow multiple points through 
+   InsertCellPoint (0dcbf136aeb8)
+ - Fixed issue with ports that may have multiple functions associated with 
+   them (e.g. in the vtk package) (0dcbf136aeb8)
+ - Ticket 481: Optional Output Ports collapse to non-Optional ones (7463f214023b)
+ - Fixed the issue of being unable to activate windows under Mac OS X 
+   Lion. (7463f214023b)
+ - Mashups: Fixed bug introduced when removing gui
+   dependencies for core.modules widgets (76a998022666)
+ - Ticket #492: Upgrade error: signatures differ (5a70996965f8)
+ - Add upgrade for PythonSource to fix issue with 'self' port (5a70996965f8)
+ - Fixed messages during upgrades so that upgrade info is not flagged as 
+   a warning (8714561fed05)
+ - Mashups: creating aliases in mashup view was not updating the alias 
+   table (770f755d089d)
+ - Ticket #491: Opening a .vtl will always create a new file (3a25858be1ac)
+ - Opening vtl files: igonring showSpreadsheetOnly if execute is false (3a25858be1ac)
+ - Starting VisTrails by double-clicking a vistrail file was
+   not zooming the current pipeline view (3a25858be1ac)
+ - Can now delete from workspace using backspace key (d3f7af2868b0)
+ - Remove vistrail from workspace if removed from disk (044a841b97e9)
+ - view.is_abstraction logic fixed (044a841b97e9)
+ - sql package was not using new gui.modules.source_configure (1714703fb145)
+ - Updated VTK, Persistence and Matplolib packages to use 
+   gui.modules import (f953ce4d25e4)
+ - get_current_view bug caused double-clicking a vistrail to fail (00b264c0920b)
+ - Ticket #489: VisTrails 2.0 can't open .vtl files anymore (2d450422c25b)
+ - opening .vtl files fails (2d450422c25b)
+ - Ticket #460: Subworkflow port naming errors after editing (687becdff050)
+ - Fixed issue where subworkflow edits could result in one-to-many 
+   port mappings. (687becdff050)
+ - Fixed issues with multiple versions of subworkflows appearing in the 
+   module palette (186d5c06a788)
+ - Do not store subworkflows in "recent files" or "My Vistrails" (17aebdbd32fa)
+ - workspace.item_selected had invalid setSelected call (3effd7a1385b)
+ - Fixed 2 detach view bugs (3f5159f5b49f)
+ - Ticket #468: Diff tab should have all modes except pipeline 
+   disabled (4f691ba6ed23) (139ec1d18b22)
+ - Fixed an issue when loading a vistrail that references different versions 
+   of a subworkflow that share common ancestors (4b34089abb09)
+ - Ticket #486: query execution and parameter problems (323f12916d09) 
+   (0262b0410051) (d9fbb412a9b5)
+ - Added ability to open workflows from query results (323f12916d09)
+ - Ticket #484: subworkflow save causes window to change (bc100442dfe4)
+ - Fixed issues with executing queries (0262b0410051)
+ - Fixed issue where numeric comparisons were being done as 
+   string compares (d9fbb412a9b5)
+ - Fixed issue where substring queries were backward (d9fbb412a9b5)
+ - Fix an issue with copy/paste to query view (b9fed84af41a)
+ - Fix issue with package subworkflows and namespaces (87c7c61f1c9e)
+ - Ticket #476: numeric stepper has wrong default value, in some cases 
+   (1642d3573f62) (a08e8dc0f9c2)
+ - Ticket #485: Random Mashups Window (917b1d8b83c5)
+ - Allow return to original query in interface (0df170d3335d)
+ - Allow parameters to be set in queries (0df170d3335d)
+ - Allow return to original query in interface (5d776c28b7e2)
+ - Allow parameters to be set in queries (5d776c28b7e2)
+ - Ticket #478: Mashups updating issues (e5913008d81c)
+ - Mashups: Display Widget section was not updated when
+   switching aliases (e5913008d81c)
+ - Mashups: Mashup inspector was not updated when switching
+   vistrails using the workspace in Mashups View (e5913008d81c)
+ - Mashups: Mashup Pipeline Palette was not being updated when
+   switching mashups using the Mashup List Panel (e5913008d81c)
+ - Ticket #483: Index error when recovering a vistrail (8589b301ba13)
+ - Fixed issues with upgraded subworkflows (9c4dfcbef423)
+ - Ticket #475: Changing the background color fails in Mashup mode (31670c3e66f2)
+ - Ticket #477: opening mashup from workspace doesn't show exposed 
+   parameters (429ceb313408)
+ - Sometimes closing a vistrail while closing VisTrails fails (429ceb313408)
+ - Double clicking a vistrail in file browser fails because of 
+   _first_view bug (263f1947cf2c)
+ - vtkhandler did not handle new PythonEditor correctly (aa3511259f10)
+ - Ticket #443: ports are not added through Module Configuration 
+   and annoying confirmation (01ed7a6566b3)
+ - Ticket #473: Cannot execute from history view immediately after 
+   opening vistrail (e0ba2e97d058)
+ - Ticket #472: parameters in parameter exploration are reset if 
+   not executed (63c55f11f03d)
+ - Ticket #474: Error quitting when spreadsheet is visible (afe4512b1ca9) 
+   (107b24e904ea)
+ - Ticket #470: copy doesn't copy to the correct cell (c44347501d5a)
+ - Fixed issue with cell locations in spreadsheet editing mode (c44347501d5a)
+ - Ticket #471: visual diff window is missing the create analogy 
+   button (14a24ea42b15)
+ - Ticket #469: locate version in editing mode selects history but shows 
+   pipeline (080a2dc8b820)
+ - Opening xml vistrail from workspace showed open file dialog (069db5448e8e)
+ - Module documentation in module palette not working (647613ad637e)
+ - Ticket #467: A file is changed when test suit is run (37e0ab607139)
+ - Ticket #466: history mode selected and pipeline view shows up after 
+   merging 2 trees (e22fe0a4f8b0)
+ - Ticket #459: the explore tab draws upside down (542e2cda8845)
+ - Outdated inspector.annotated_modules value caused explorer tab to be 
+   drawn upside down on Mac (542e2cda8845)
+ - Ticket #446: subworkflow editing only good for one save (2ab6a92c2084)
+   (85b50d980ab1)
+ - Fixes to subworkflow upgrades and save as (2ab6a92c2084)
+ - Changes to subworkflow identification (85b50d980ab1)
+ - Ticket #465: Open Recent menu does not contain saved vistrails (a484b18b3eed)
+ - Update recent files list also when vistrail is saved (a484b18b3eed)
+ - Ticket #463: Current version not selected on open (154e9b2e8eaa)
+ - Select latest version when opening a vistrail (154e9b2e8eaa)
+ - Ticket #462: Ungrab mouse error after editing subworkflow (6aaa6bd2b526)
+ - Ticket #432: Problem with labeling groups (6aaa6bd2b526)
+ - Ticket #461: Initial history view for first vistrail is not zoomed to 
+   fit (b3d8909ac0ed)
+ - Fix zoom to fit for initial vistrail (b3d8909ac0ed)
+ - Ticket #434: Can't remove tags of versions that were 
+   upgraded (v2.0) (47636de1ec66)
+ - Fix issue where raw pipeline and construct from root were not 
+   working (47636de1ec66)
+ - Enabled Embed version by default when selecting Publish > To Paper (8bf5e737a2c2)
+ - Ticket #456: Cannot copy/paste in detached pipelines/vistrails (0cb6ef7650af)
+ - Fixed issues with spreadsheet editing for copies and analogies (d2d4bae51a6d)
+ - Enabled Edit Configuration and Show Documentation from a module's
+   context menu  (00dcb21d22a6)
+ - File > Export > PDF was not working  (fce8cc569c14)
+ - Ticket #455: Module Information Tab stretches unnaturally when package 
+   has a long name (2d07662227fd)
+ - module information stretches unnaturally (2d07662227fd)
+ - Ticket #457: PythonSource ports are not updated when configuration window 
+   is saved (f6e151300476)
+ - Ticket #456: Cannot copy/paste in detached pipelines/vistrails (f9470d9fa04a)
+ - Removed missing web service (028fc4e03c62)
+ - Fixed header placement in xml files that were causing tests to fail (4db41b9e2e75)
+ - Workspace fixes for saving empty vistrail and closing detached 
+   vistrail (1f798a7a0c84)
+ - Ticket #454: Can't interact with TransferFunction widget using 
+   Qt 4.7.* (ea7e21dc9e01)
+ - Ticket #453: Workspace indexing error in tree mode (f8b17ab82b9b)
+ - Skip workspace make_tree when no window exist (f8b17ab82b9b)
+ - Ticket #450: Indexing failures need to be more graceful (f76532828242)
+ - Better error handling when indexing workflow (f76532828242)
+ - Ticket #452: Visual Diff Parameter Changes not detected (65849c433682)
+ - If the clipboard contained utf-8 characters, VisTrails would raise
+ an error (d7cecf541ced)
+ - QPipelineScene.addModule were calling addItem twice (d77e833f431f)
+ - Dropping vistrails variable created error (8c0b0e921201)
+ - Fixed export/import menu options (8d68b5b56ff3)
+ - Fixed parameter exploration in v2.0 (8485390429b1)
+ - Parameter exploration was not saving color parameters when they
+were being interpolated (8485390429b1)
+ - Fixed 'Diff properities' label typo (8a88bd21895a)
+ - Removed close button from Vistrails Messages view (2581ea446bad)
+ - Ticket #441: vistrail browser is not being updated (d892cd18e5b8)
+ - Correctly update collection on load/save (d892cd18e5b8)
+ - Show project selector (d892cd18e5b8)
+ - Sort default project by name (d892cd18e5b8)
+ - Ticket #435: diff result is not properly sized/centered (96c4adaa2a1a)
+ - Show executions for the current session as well (fc112c4c1079)
+ - Workspace threw exception when closing vistrails (47ae1c3c4428)
+ - Fixed crash when running VisTrails 64-bit on Windows with more than 4GB 
+   of RAM (71b4bfc41a6d)
+ - 2 bugfixes to the vistrail merge code (4f05a96bcc2c)
+ - open merged vistrail in new tab and other fixes (556804ba40c4)
+ - builder_window was stealing ctrl-z/ctrl-y from PythonSource (e221d10351d1)
+ - Made new PythonEditor use correct font (2579b6f662ca)
+ - removed self reference in static method in persistence package (12e57882a72b)
+ - open merged vistrail in new tab and other fixes (971228751494)
+ - Fix menubar issue on non-Mac platforms (9d5e66156935)
+ - persistence package did not show dates correctly (357f3a55aaf5)
+ - Spreadsheet package: Fixed a typo on the usage of issubclass() which prevented
+   subclassed sheets to be used by the spreadsheet (8bcd8ac86cd4)
+ - SUDSWebServices wsdl caching in Windows need to use pickle 
+   protocol=0 (4ca71139f604)
+ - SUDSWebService wsdl hash did not use the correct wsdl string (4ca71139f604)
+ - Fix issue with caching and persistent files (f56f14061d3f)
+ - ParaView package: Fixed example pipeline where it should display
+   both a box and a sphere.  (7429a1be15cf)
+ - VTK Package: Fixed bug when drawing TransferFunction widget (daaacfcedfca)
+ - Handle unnamed data when writing from manager (22964cfeb53b)
+ -  Fixed infovis example  (7d6a0dace8ca)
+ -  Fixed NOAA Web services example. NOAA had changed the urls
+for their services  (7d6a0dace8ca)
+ - Do not import MySQLdb directly in sql_dao (b1d1809c0d57)
+ - Ticket #420: VisTrails fails to install package dependencies on Ubuntu (35cd1cceeded)
+ - debug imports cause ubuntu package install to fail (35cd1cceeded)
+ - Ticket #416: The log is not copied when saving a vistrail from database to disk (1af107087fbe)
+ - Include log when copying vistrail from DB (1af107087fbe)
+ - LaTex extension: When generating LaTex command using the Embed panel,
+ make sure to enclose tag between {} so symbols are escaped. (be50aeab59ca)
+ - LaTex extension: Fixed problem when passing envrionment variables
+using \vistrailsenv{} (be50aeab59ca)
+ - Ticket #417: Database INSERT statements are not protected from overflowing (b520f1c847c8)
+ - Overflow checking for SQL datatypes (b520f1c847c8)
+ - Changed memory size to be computed in megabytes instead of bytes
+to avoid large numbers (4d21156d99f5)
+ - Ticket #414: Focus out event on Tag version edit box generates an unnecessary 
+   vistrail change event (6dc3154542ba)
+ - Media wiki extension: casting returned version of a given tag to
+string before using it (6dc3154542ba)
+ - Ticket #412: Parameter exploration on File parameters fails (e54b74bb9412)
+ - Fix parameter explorations on File parameters (e54b74bb9412)
+ - Added ability to create temporary directories in the FilePool (7eb29d2ba0fb)
+ - LaTex extension: added support to work on Windows with MikTex (2bdfb94be496)
+ - LaTex extension: changed behavior of passing environment variables -
+passed variables will not replace existing ones, they will be inserted at the
+beginning (2bdfb94be496)
+ -  Removed warning when copying thumbnails fail because the files are the
+same (2bdfb94be496)
+ -  New log file was not being created on Windows when the version was
+upgraded  (2bdfb94be496)
+ - Ticket #410: Encode VTK changes as upgrades (fa2e48cedf06)
+ - Attempt to implement VTK upgrades (fa2e48cedf06)
+ - Ticket #409: Problem in workflow upgrade (5d57b4ce54b3)
+ - Fix issue with upgrading modules with null functions (no parameters) (5d57b4ce54b3)
+ - Ticket #407: Aliases in a workflow disappear after upgrade (843603916a48)
+ - Preserve aliases during upgrades (843603916a48)
+ - Replaced more GUI code that would work only on recent versions of Qt/PyQt4 (7cfcb98320ee)
+ - Replaced code that would work only on recent versions of PyQt4 (e5ca41c3fab7)
+ - Enabled with_statement for python2.5 (3ec5bdd47c3e)
+
+
+From Release: v1.7 build 325bfe1b517d from v1.7 branch
+
+Enhancements:
+ - VisTrails is now distributed under the "Modified BSD License"
+ - VisTrails binaries are now shipped with python 2.7.1, Qt 4.7.2, sip 4.12.2, 
+   PyQt4 4.8.4, vtk 5.6.1, numpy 1.5.1, scipy 0.9.0 and matplotlib 1.0.1. 
+Bug fixes:
+ - Importing basic_modules.py leads to import loop (325bfe1b517d)
+ - VTK Package: Fixed bug when drawing TransferFunction widget (7722fc6727aa)
+
+From Release: v1.6.2 build af4a69ad566a from v1.6 branch
+
+Enhancements: 
+ - Adding pdf version of Usersguide to binaries.  (60cec4e6d858)
+ - Improved efficiency of vtk workflow upgrades (501a552cd722)
+ - LaTex extension: Added an example for embedding local files (f5976c82826f)
+
+Bug fixes: 
+ - Fixed infovis example  (bd810b67daaf)
+ - Fixed NOAA Web services example. NOAA had changed the urls
+for their services  (bd810b67daaf)
+ - Added matplotlib mplot3d toolkit to Mac binary (5054da25e2e8)
+ - Ticket #410: Encode VTK changes as upgrades (aeaa56469120)
+ - Attempt to implement VTK upgrades (aeaa56469120)
+ - Ticket #420: VisTrails fails to install package dependencies on Ubuntu (5180336d429d)
+ - debug imports cause ubuntu package install to fail (5180336d429d)
+ - LaTex extension: When generating LaTex command using the Embed panel,
+ make sure to enclose tag between {} so symbols are escaped. (f5976c82826f)
+ - LaTex extension: Fixed problem when passing envrionment variables
+using \vistrailsenv{} (f5976c82826f)
+ - Changed memory size to be computed in megabytes instead of bytes
+to avoid large numbers (5f57a040c97c)
+ - Ticket #414: Focus out event on Tag version edit box generates an unnecessary vistrail change event (460836e2206e)
+ - Media wiki extension: casting returned version of a given tag to
+string before using it (460836e2206e)
+ - Ticket #412: Parameter exploration on File parameters fails (7630f10fb73c)
+ - Fix parameter explorations on File parameters (7630f10fb73c)
+ - LaTex extension: added support to work on Windows with MikTex (36322a953de2)
+ - LaTex extension: changed behavior of passing environment variables -
+passed variables will not replace existing ones, they will be inserted at the
+beginning (36322a953de2)
+ -  Removed warning when copying thumbnails fail because the files are the
+same (36322a953de2)
+ -  New log file was not being created on Windows when the version was
+upgraded  (36322a953de2)
+ - Ticket #409: Problem in workflow upgrade (040f46c2f980)
+ - Fix issue with upgrading modules with null functions (no parameters) (040f46c2f980)
+ - Ticket #407: Aliases in a workflow disappear after upgrade (5575069d2727)
+ - Preserve aliases during upgrades (5575069d2727)
+ - Replaced more GUI code that would work only on recent versions of Qt/PyQt4 (2704aa1fe222)
+ - Replaced code that would work only on recent versions of PyQt4 (50ead740f6de)
+ - Enabled with_statement for python2.5 (bec2a6498965)
+
+
+From Release: v1.6.1 build ba9616b413d2 from v1.6 branch
+
+Bug fixes: 
+ - Ticket #406: Builder Window menu inconsistencies (fd46220842bf)
+ - Added support for executing workflows even if VisTrails is already
+running (useful for Latex extension) (16c1d253a63a)
+ - Added single instance limitation per user/machine instead of per
+machine. Now multiple users logged to the same system can execute their
+version of VisTrails (16c1d253a63a)
+ - VisTrails was ignoring batch mode input parameters if already running
+ (16c1d253a63a)
+ - Latex and Wiki extensions: all options can now be set from the builder. (16c1d253a63a)
+ - Ticket #405: VisTrails is not downloading unavailable packages if they are present in the packages repository (77cadf0fb8a1)
+ - VisTrails batch mode: Separated generation of the workflow graph from execution of the workflow. Added support for generating the history tree graph (77cadf0fb8a1)
+ - When generating a workflow graph VisTrails would sometimes generate a line in the borders (77cadf0fb8a1)
+ - When testing a database connection with a password=None VisTrails would crash without catching the exception (77cadf0fb8a1)
+ - When opening a vistrail from a vtl, VisTrails was ignoring the version that should be open and always opening the most recent one (77cadf0fb8a1)
+ - Latex extension: added support for running vistrails locally (15255a96e4e0)
+ - Latex extension: added support for embedding workflow and/or
+including full tree when generating vtl requests (15255a96e4e0)
+ - Wiki extension: workflows were not being embedded in .vtl file (5348cad089ba)
+ - Added title to console and debugger toolbars (b2e3bda06f62)
+ - Better error handling for duplicate module identifiers in packages (579520227409) (d5df9421d0c1)
+ - Fixed an issue where the FilePool's local copy mechanism failed in Windows (7b398b211212) (254bce86348e)
+
+
+From Release: v1.6 build e9f97c5908ac from v1.6 branch
+
+Enhancements:
+ - Added prompt for password for database access in batch mode (06c4b63434a7)
+ - Please notice that the parameter separator in the command line changed again from 
+  '&&' to '$&$' so it's consistent with the server version. (35ad76515a97)
+ - VisTrails now has "Check for Updates" option in Help drop-down (b80862d8a39f)
+ - Show port_spec.sigstring in PortMismatch error message for more
+   detailed debugging (c28dad738abc)
+ - Turn off popup messages if messages window is open (62aeb9371235)
+ - add/delete Web Services from module palette for SUDSWebServices package (2e381a4394ed)
+ - Package-level context menus in the module palette (2e381a4394ed)
+ - Add preference for migrating tags and notes on upgrades (41177e74e687)
+ - Add stack trace to exception details for unexpected exceptions during 
+   change_selected_version (fd3840df3c6b)
+ - Added new class Chdir to prevent users from triggering side-effects by accident 
+   when using os.chdir() (4aa722db61d1)
+ - Added Open Recent to File menu (it works for vistrails in the file system or in 
+   the database. The maximum number of files in the list can be configured from Advanced 
+   Preferences Tab (search for maxRecentVistrails) (4aa722db61d1)
+ - Configuration object now supports bound methods as subscribers (4aa722db61d1)
+ - Debug messages now have a "details" attribute (f2911a6a6000)
+ - Buttons for filtering VisTrails messages (ebc728d49db3)
+ - Colors of message types added to theme file (ebc728d49db3)
+ - Improved log messages in the server log to also indicate the instance of the server that 
+   is logging the messages (762902e79b7a)
+ - Improved handling of log messages (037568dc5960)
+ - Changed all examples using relative paths to datasets to use HTTPFile (403205442fd7)
+ - Updated head.vt and terminator.vt example to use TransferFunction widget (403205442fd7)
+ - Maintain suffixes on persistent files and directories (e9b5e906e069)
+ - Improved debug messages (9dcd1a5a2ea8)
+ - Ticket #390: Add support to Latex extension to download workflows at compilation 
+   time (90ef6cee20a9)
+ - Improved error handling in vistrails.packages (a44800a88083)
+ - Improved debugging messages for vistrails.gui (25b718347ef0)
+ - Improved error handling in vistrails.core (2e095f36dc90)
+ - Debug library updated (41e3778d507e)
+ - Web Services package is now deprecated. Showing a warning message when the WebServices 
+   package is loaded. Message will be shown only once. (9996bba52dd1)
+ - Ticket #375: Add GUI support for synchronizing vistrails (4efb09fbe5bd)
+ - Merge 2 Vistrails from within VisTrails (4efb09fbe5bd)
+ - Detect changes to directories so the cache can be invalidated when they change (3058d55966f2)
+ - New Web Services package that uses SUDS library (0d1d3efb99da)
+ - Add pinch gesture support to graphics views (3d01e549f849)
+ - ParaView package: Converted to new VisTrails package format (65453bd92aa5)
+ - Updated php scripts to work with Latex extension's new features (2b53ad32a374)
+ - VisTrails server: added new function to return version tree as pdf  (2b53ad32a374)
+ - Created a separate php file to store the server configuration (8d15fdbe8e1d)
+ - Added support for running crowdlabs and vistrails server on separate machines 
+   (still testing) (064304a99993)
+ - Ticket #382: Improvements to Latex extension (3123297d6a1b)
+ - LaTex extension: VisTrails can now embed a workflow graph or a history tree in 
+   LaTex pdf (3123297d6a1b)
+ - LaTex extension: Caching latex instructions and images for embedding images in case python 
+   is not available (3123297d6a1b)
+ - Ticket #381: Split HTTPFile.compute() method to download the file in a separate 
+   function (62d25dca3f3a)
+ - Add MplScatterplot and MplHistogram modules to pylab (4af6514c20d4)
+ - Ticket #295: Add Debug .command to Mac distribution (e835d69d8426)
+ - Added git executable to windows repository. It will be included in future windows 
+   binaries for persistence package  (8d9931bbbe04)
+ - Updated version of the rpy package (c895125216cb)
+ - Migrating new persistence package from persistence_exp to persistence (5b6418233dea)
+ - Added methods to expand shortcut string representations for module descriptors and port 
+   specs (5b6418233dea)
+ - Added support for shortcuts to remap modules/ports for upgrades (5b6418233dea)
+ - Use List for controlflow now instead of ListOfSElements (74f30460d3fe)
+ - Highlight invalidate port specs (74f30460d3fe)
+ - Improved support for work with the filesystem. Added DirectorySink module,
+    changed FileSink module to use 'overwrite'
+    instead of 'overrideFile', added support for getting the contents of a
+    directory, created a new OutputPath constant with a save-style widget
+    to select the output path, replaces OutputName on the FileSink module.
+    Added updgrade code to translate old FileSink module to new version.
+    Changed version of basic_modules and abstraction to static string
+    '1.6'. (fb30dca8a15d)
+ - HTTPFile now supports proxies. (3799edddbb62)
+
+Bug fixes:
+ - Fix issue with console mode and unit tests (a4d544eec673)
+ - Ticket #361: Cannot configure output cell layout for cells in groups in parameter 
+   explorations (5807414236ba)
+ - Enable all spreadsheet cells for parameter exploration, even if they are embedded in 
+   groups or subworkflows (5807414236ba)
+ - Ticket #399: Exception thrown when loading parameter exploration tab with no existing 
+   exploration (4366e52c39cf)
+ - Fixed exception when loading parameter exploration tab for a workflow with no saved 
+   explorations (4366e52c39cf)
+ - Ticket #154: vistrails should check for a new version being available and tell the 
+   user to download it (b80862d8a39f)
+ - Ticket #398: Failure opening vtl files (filename issue) (c52ba7adc5f8)
+ - Matplotlib package: if hide toolbar parameter is set after the source
+   and there isn't an extra line at the end, the MplPlot would fail  (c52ba7adc5f8)
+ - Ticket #398: Failure opening vtl files (filename issue) (cdfa0c97493d)
+ - Added escaping to filename in unzip commandline call (cdfa0c97493d)
+ - Fixed issue where it was not possible to ungroup a subpipeline that had an InputPort
+   connected directly to an OutputPort (e1ea9b437507)
+ - Fixed problem where controlflow package would raise duplicate errors (4351b3f0102f)
+ - Fixed issue with groups and input values that evaluate to False (6fc007c0535d)
+ - Fixed ordering of PortMismatch parameters in ensure_port_specs (c28dad738abc)
+ - Fixed bug introduced on Windows platforms when changed os.chdir() calls by 
+   core.utils.Chdir (0a2b8a0d50d8)
+ - Enable the Linux theme for 'Linux' system types (57dfb4a85e7a)
+ - added deletion of namespaces in module palette (2e381a4394ed)
+ - Add ability to migrate tags when upgrades are not delayed (9c49285269ca)
+ - Message filter colors does not show in linux (ee8906c91039)
+ - Ticket #397: Save execution log when in console mode (2dae96a8f004) (1afa51d895e9)
+ - Update version tree when adding delayed actions (d1dbf3005499)
+ - Subworkflows from packages that need upgrades are now moved to local.abstractions 
+   in the registry and picked up for workflow upgrades (04476a172f61)
+ - Fixed issue with spreadsheet and grouped spreadsheet cells (fd3840df3c6b)
+ - Replaced svn command with git command to get current commit (if present) (4aa722db61d1)
+ - Flush delayed actions (including upgrades) to fix issues with delayed upgrades and 
+   grouping upgraded workflows (79dd982e6cef)
+ - VisTrails Server: Applied fix to caching of history tree images when
+   generated as pdfs (fc0ab9f1626d)
+ - VisTrails Server: fixed problem in caching of history tree images (4862e1f7d18a)
+ - Ignoring mouse gestures when Qt version is < 4.6 (4862e1f7d18a)
+ - Ticket #394: VisTrails server is not detecting updates in vistrails loaded 
+   from the database (762902e79b7a)
+ - Restoring extensions/http/run_vistrails.php to version before merge (762902e79b7a)
+ - VisTrails server was ignoring the build_always variable if it
+   found cached images (762902e79b7a)
+ - Using port to identify the instance of the server instead of virtual
+   display in script that starts vistrails server using Xvfb (762902e79b7a)
+ - Ticket #393: Latex extension doesn't handle workflow exec. errors properly (16f522c459c5)
+ - Latex extension: Making sure to convert line breaks into \MessageBreak
+   Latex commands before displaying error messages. (16f522c459c5)
+ - Forwarding force build to server so the server can also bypass
+   caching (47a1105664a0)
+ - Ticket #392: Refactor php extensions caching logic used for wf executions (3125e0eb8e81)
+ - Updated mediawiki extension to work with crowdlabs server  (3125e0eb8e81)
+ - Added workaround for RotateFileHandler problem on Windows when some
+   packages start child processes during workflow execution (e5afc47797cb)
+ - Fixed issue where named intermediate persistent files/directories were not 
+   reused correctly (df3deb58a18c)
+ - Fixed git hash retrieval for persisted directories (df3deb58a18c)
+ - Pasted text in VisTrails shell was being ignored (c48e67f02ae8)
+ - Giving focus to VisTrails shell when showing it (c48e67f02ae8)
+ - Added 'VisTrails messages' button and fixed 'VisTrails debugger' button (b401b2498c74)
+ - Don't mask AttributeErrors when materializing pipelines (b5c3650e5ca6)
+ - Add upgrade path for old InputPort and OutputPort modules (8abfff56592c)
+ - Fixed an issue with groups and upgrades (720d93c8e3be)
+ - VisTrails shell was not using fixed-width font  (b521e096f879)
+ - Latex extension: delaying check for a valid url so we can include
+   cached images if there's no Internet connection (79296270cc86)
+ - Batch mode: On Windows, VisTrails was not executing workflows
+   when an absolute path to a vt file was given (81812ac04e85)
+ - Minor error fixes (45b53eef1c53)
+ - Ticket #386: Moving modules after an upgrade generates invalid actions with 
+   delayed upgrades (ad9e029035f7)
+ - With delayed upgrades, moving modules after an upgrade now generates actions 
+   in the correct order (ad9e029035f7)
+ - Ticket #385: Workflow instantiation fails when doing on-demand package loading (aff3408c7a51)
+ - Fix issue with on-demand package loading leaving workflows as invalid (aff3408c7a51)
+ - Casting DBLocator names to string as they can store None sometimes (9996bba52dd1)
+ - Ticket #384: Deleting version edits version tag if delete is canceled (cc05bc9e80e5)
+ - Don't delete tag text when attempting to prune (cc05bc9e80e5)
+ - Expanding port specs deals with differences between descriptor and port signatures (c5763a437606)
+ - UpgradeWorkflowError tries to trim None-value (93b3be3d2a50)
+ - Ticket #383: Unversioned modules are not upgraded (4b3fa72869f0)
+ - If a module has no version, force it to be upgraded (4b3fa72869f0)
+ - Ticket #302: Moved modules action generated when nothing changed (3e59defe4685)
+ - Fixed logic so moved modules are properly detected and positions updated. (3e59defe4685)
+ - ParaView package: Removed hardcoded path to pvserver and mpiexec
+and using configuration object for that (accessible through Menu
+Preferences -> Module Packages) (65453bd92aa5)
+ - ParaView package: Updated pv.vt example to work with current version
+of the package (65453bd92aa5)
+ - Fixed bug in some php scripts when only the tag is passed instead of
+a version number  (2b53ad32a374)
+ - Updated all php scripts in extensions/http to work with
+the current version of crowdlabs vistrails server (only local
+setup currently supported) (8d15fdbe8e1d)
+ - Fixed bug where server method get_wf_graph_png would sometimes
+fail (064304a99993)
+ - Fixed bug where although DBLocators were being cached, the 
+   connections were not  (b07c22d9e93d)
+ - Ticket #359: When using VTKRenderOffscreen module VisTrails crashes (48e477f4c1d9)
+ - VTK Package doesnt work with VTK version 5.7.0 (ba5e0bdbbb16)
+ - Fixed issue with query-by-example where parameters couldn't be updated (741b1c0d7737)
+ - Error using breakpoint due to new stack trace (d4f31af05a05)
+ - LaTex extension: removed hardcoded url for downloading vt files
+upon clicking on the images in the generated pdf. It can now be set using
+the \vistrailsdownload in the latex file (3123297d6a1b)
+ - HTTP package was not handling exceptions correctly (62d25dca3f3a)
+ - Ticket #380: HTTPFile corrupts binary files on Windows (0a5ec2007878)
+ - Color Constant: Initializing Color widget with default white
+color using RGB constructor instead of QtCore.Qt.White. We assume the
+color is always a QColor object and sometimes a GlobalColor object
+was being found (8565a276a353)
+ - Persistence Package: Added code to find tar executable similar
+to the way the path to git is set up (4a2494c09ef4)
+ - Persistence Package: adapted use of tar command to work
+on Windows (430e29bcaf2e)
+ - Windows binary: Including the gnu version of tar instead
+of the one that comes with git (430e29bcaf2e)
+ - Set MplFigureCell to fill spreadsheet cell (4af6514c20d4)
+ - Ticket #302: Moved modules action generated when nothing changed (8f60ea9a4737)
+ - Dangling move actions are displayed immediately after switching versions (8f60ea9a4737)
+ - Ticket #331: ImportError when trying to import userpackages (bc27cdc4b171)
+ - "import userpackages" fixed by reordering init steps (bc27cdc4b171)
+ - Ticket #293: Shell copy & paste on Mac doesn't work (694c0a43fbda)
+ - Use git ls-files instead of cat-file to retrive hash so that we don't have issues with Windows reading from stdin (1b190225cce9)
+ - Persistence package: fixed problem where persistent files
+couldn't be found on Windows (df8a7c2ef7d1)
+ - Ticket #369: picture-in-picture setting is confused when a new vistrail is opened (7ea68b3e863f)
+ - Check PIP preference when opening vistrails (7ea68b3e863f)
+ - Allow semi-translation from abstractionRef to abstraction so
+old workflows (version <= 0.9.3) with subworkflows can be opened (50b9ce2b28fc)
+ -  Spreadsheet: fixed 'RuntimeError: underlying C/C++ object has
+been deleted' problem during EventFilter on Windows  (93884b6a47c0)
+ -  VTK Package: Fixed rendering context problem when embedding VTKCell in VisMashup on Linux (93884b6a47c0)
+ -  PathChooserToolButton was not emitting proper signals necessary for
+VisMashup (93884b6a47c0)
+ -  Persistence package: Fixed load package error on Windows (4ee8f244fc79)
+ - Change persistence package to use correct identifier for gui widgets (9dd3ad8e0b08)
+ - Ticket #378: Workflow execution log contains duplicate entries (6d65daec6089)
+ - Fixed logging so that executions are not duplicated when saving more than once per session (6d65daec6089)
+ - Ticket #377: Exporting to OPM XML fails (3ee1cc842182)
+ - Fixed OPM output capability to work with latest object layout (3ee1cc842182)
+ - Update sql package to use List instead of ListOfElements (4b08dd9018db)
+ - Fix typo with get_package_by_name (74f30460d3fe)
+ - keep selected modules after scene redraw (bb5e4e6e1f45)
+ - Optional input ports now don't show up as output ports (bb5e4e6e1f45)
+ - Ticket #376: execute_cmdline broken (bbbcf19704b8)
+ - Fixed copyright year in background image from About box (bcd3346d8865)
+ - Web Services package: fixed bug in certain Complex Types (60128ff3a89a)
+ - Ticket #374: Web service package can't be reloaded (38976729a2a9)
+ - Fixed an issue with package reloading where modules imported using the "from" syntax were not added to the imported list (38976729a2a9)
+ - HTTPFile: Fixed error when parsing the date from the file's header. (3799edddbb62)
+
+From Release: v1.5.1 build 1863
+
+Enhancements: 
+ - branching is now supported when uploading to web repositories (r1853)
+ - Added ParaView package (r1850)
+ - Added Titan package (r1847)
+Bug fixes: 
+ - Ticket #368: Spreadsheet: export as single image does not work (r1861)
+ - Fixed bug where RichTextCell was not displayed when running on 
+   server mode (r1857)
+ - Fixed bug with thumbnails and RichTextCell (r1856)
+ - Making sure to use only image files when generating thumbnails (r1856)
+ - Fixed web repository commit bug where updated vistrail files where not 
+   successfully loaded into VisTrails after being downloaded (r1853)
+ - web repository vt id annotation is now being saved (r1853)
+ - web repository cookie is now nullified if the web repository url 
+   changes (r1853)
+ - VisTrails Batch mode: Changing parameter separator from '&' to '&&' so 
+   urls with query urls work (r1846)
+ - Added procedure to WIndows installer script to remove VC Redist files 
+   left behind (r1846)
+ - log file names are now updated according to VisTrails version (r1845)
+ - Ticket #366: VTK overloaded ports from old vistrail files are not being shown in the GUI (r1842)
+ - Fix translation of head example from old version (r1842)
+ - Ticket #367: Different port signatures when upgrading a workflow (r1841)
+ - Translate old parameter type serialization to match port/portSpecs (r1841)
+ - Ticket #364: actionAnnotation breaks view->show all (r1840)
+ - Fix issue with annotations that have the same key/value pairs (r1840)
+ - Ticket #363: Enabling the Web services package on-the-fly is broken (r1839)
+ - Spreadsheet package: SingleCellSheetReference could not be used (r1839)
+ - On Mac, the eventFilter was not being removed when finalizing 
+   Vistrails and sometimes delayed events could not be processed  (r1839)
+ - ImageViewerCell: Disabling the zoom slider when playing 
+   animation (r1838)
+ - Ticket #362: ImageViewerCell Animation Icons Are Not Displayed (r1837)
+ - repository_vt_id now represents the crowdlabs vistrail object id instead 
+   of the vistrails db id (r1834)
+ - when merging a vistrail with one on the web repository, a check is made 
+   to see if that vistrail still exists (r1834)
+
+From Release: v1.5 build 1832
+
+Enhancements: 
+ - Upgraded libraries: VTK 5.6, Qt 4.6.3, python 2.6
+ - Adding extension files to release
+ - Add support for calling binaries in Mac bundles (r1813)
+ - New methods for cmdline execution (r1813)
+ - Better configuration for persistence package (r1813)
+ - Added scripts for manipulating the database (r1809)
+ - User may now designate permissions when uploading vistrail to web repository (r1806)
+ - More informative upload dialog that lists incompatibilities between 
+   vistrail files and web repository, including PythonSource module checks (r1806)
+ - Merges with web repository now updates local vistrail version (r1806)
+ - Changed VisTrails version to 1.5 (r1805)
+ - Files produced by FileSync modules are publishable by default.
+   Use publishFile boolean to avoid publishing the files.  (r1805)
+ - Server mode: added support for executing workflows and returning 
+   results as pdf files (r1804)
+ - Latex Extension: added support for embedding pdf files. See README file
+   in extensions/latex for help (r1804)
+ - Ticket #317: Add support to the spreadsheet cells also generate PDF files (r1801)
+ - Spreasheet Package: Added global configuration for controlling 
+   the file type (PNG or PDF) when dumping cells (console mode). This can be set 
+in the Spreadsheet configuration panel or as a 
+command line option (use --pdf or -p 
+for dumping files in pdf). (r1801)
+ - Added support for merging vistrails on the server side (r1798)
+ - Added support to draw workflow graphs (as png and pdf) and 
+history trees (as png) (r1798)
+ - VTK Package: Added the ability to use the Transfer Funtion widget to
+create color mappings (vtkColorTransferFunction) not necessarily in 
+volume property.  (r1796)
+ - Changed version of VTK Package to 0.9.2 (r1796)
+ - Added two new output ports to vtkScaledTransferFunction: vtkPiecewiseFunction and vtkColorTransferFunction (r1796)
+ - Handle upgrade and prune annotations during merge (r1792)
+ - Added gui code for the interactive vistrails merge (r1791)
+ - Interactive interface for merging two vistrails (r1789)
+ - Make actions immutable by moving mutable attributes to a higher level (r1786)
+ - Try to fix as many errors as possible in an upgrade, even if all cannot be fixed (r1777)
+ - Merging action annotations (r1771)
+ - Methods for hashing tags and annotations (r1769)
+ - Merging of vistrails files for crowdlabs. (r1762)
+ - Preferences for upgrades (r1761)
+ - Allow delaying persistence of upgrades until changes (r1761)
+ - PRELIMINARY upgrade support (r1755)
+ - view pipelines without having the packages (r1755)
+ - view invalid pipelines (r1755)
+ - improved pipeline validation (r1755)
+ - Add method to allow updates of a single port rather than all ports as updateUpstream provides (r1753)
+ - Dump non-ModuleError exceptions to the console (r1753)
+ - Improved string formating of nested InvalidPipeline exceptions (r1752)
+ - Allow QSearchBox to do non-incremental searching (r1751)
+ - Improved version selection handling (r1744)
+ - Server Mode: added support for multithreading (r1741)
+ - Decoupled the directory where the spreadsheet will dump cells from the configuration. spreadsheetDumpCells configuration is now deprecated. Now this setting can be configured in a per workflow fashion  (r1741)
+ - Added support for extra information to be passed along workflow executions. The spreadsheet now uses this mechanism instead of a global configuration for dumping cells (r1741)
+ - inital version of a VisTrails R package using rpy2 (r1723)
+ - easier namespace designation using _modules (r1722)
+ - easier constant extensibility and customization (r1721)
+ - improved List module (r1721)
+ - new Dictionary module (r1721)
+ - new SourceConfigurationWidget to make creating source configuration widget easier (r1720)
+
+Bug fixes: 
+ - Sometimes matplotlib plots were not refreshed in the spreadsheet (r1828)
+ - Fixed the flickering issues of VTKCell on Windows (r1825)
+ - Updated Web services code to work with HTTP package chages (r1824)
+ - Fixed Python Wrapping issue with VTK 5.7.0 (r1818)
+ - Minor UI fixes to web repository dialog (r1817)
+ - web repository dialog now links to correct vistrail id on the web repository (r1817)
+ - Upon upload to web repository, an repository identification annotation is added automatically (r1817)
+ - Fixes for merging vistrails in server mode. (r1816)
+ - low-level merge code now allows passthrough gui references
+instead of importing them (r1812)
+ - Fix issue where annotation ids weren't properly assigned (r1809)
+ - Merging thumbnails (r1808)
+ - Fixed issue where database was saving parent id/type pairs as NULL (r1807)
+ - Fixed issue where deleted annotations were not translated to previous version (r1807)
+ - Fixed issue where deleted annotations could not be mapped back to previous schemas (r1807)
+ - Fixed issue where annotations were not set with the correct db flags (r1807)
+ -  Generating the pdf of the workflow in console mode was not 
+working.  (r1805)
+ - Fixed bug in script that starts VisTrails in server mode using Xvfb (r1804)
+ - Spreadsheet package: corrected paper size of generated pdfs (r1803)
+ - Fixed Vistrail merge casting bugs (r1802)
+ -  Spreadsheet Package: Standard non-image type cells now correctly dump
+contents to file.  (r1801)
+ - Vistrail merge did not copy thumbnails (r1800)
+ - Fix issue with reading and writing the boolean parameters during persistence configuration (r1799)
+ - Fix issue when writing metadata of managed files (r1799)
+ - Ticket #358: HTTPFile header-based caching is broken (r1797)
+ - HTTPFile.is_cacheable is now implemented, and is aware of server headers. (r1797)
+ - Ticket #353: Import workflow doesn't set id scope correctly (r1790)
+ - update id scope after importing a workflow (r1790)
+ - Fix for older log files that have incorrectly moduleExec elements (r1788)
+ - Checking whether XML element is not None before trying to evaluate it as text (r1787)
+ - Fixed port spec naming in new persistence package (r1783)
+ - Fixed issue where always creating a new reference didn't generate an id (r1783)
+ - When pruning a node, make sure that node is removed from the version tree display (r1782)
+ - Fixed issue with re-saving to the database with groups (r1781)
+ - Fixed issue with upgrading groups and database persistence (r1781)
+ - References to thumbnaisl were being shared across 
+different vistrails (r1780)
+ - Existing thumbnails were not being replaced by new ones (r1780)
+ - Don't automatically switch to pruned upgrade nodes (r1779)
+ - Ticket #357: Error after saving as [Errno 2] (r1778)
+ - Fixed issue with trying to upgrade groups introduced by upgrading port specs (r1777)
+ - Fix issues where pipelines are not validated after certain actions like copy-paste (r1776)
+ - Merging of vistrails did not work (r1775)
+ - Band-aid for analogies to make analogies with groups or abstractions a bit more robust (r1774)
+ - Fix error with handle_invalid_pipeline and subworkflows (r1773)
+ - Fix bugs in displaying missing dependencies in preferences (r1772)
+ - Pass module information through group to contained modules (r1770)
+ - Fix issue with upgrading module functions for user-defined ports (r1768)
+ - Fix issue with upgrading modules that have user-added ports (r1767)
+ - Change call to fix missing modules to the correct method (r1767)
+ - Merging of vistrails files for crowdlabs. (r1766)
+ - Fix issue with analogies where obselete method was being called (r1764)
+ - Fixed issue where automatic upgrades fail because a port is said to not be found even though the port does exist (r1763)
+ - Fixed issue with upgrading groups (r1761)
+ - Ticket #356: Action copy doesn't remap previous id (r1757)
+ - Pass simplify argument through in create_action_from_ops (r1756)
+ - Fixed issue with versions_increasing computation (r1752)
+ - Ticket #354: Package reloading raises duplicate package error (r1750)
+ - Fix issue with renabling packages where a signal was issued twice (r1750)
+ - VisTrails Server: the vistrail version was not being included in the .vt file generated by the server (r1746)
+ - fixed ModuleRegistry.auto_add_subworkflow so that it accepts the correct (filename, dict) format. (r1745)
+ - Server mode: Added a global variables to store information for accessing the database (r1743)
+ - Fixed a bug in the RequestHandler.get_wf_vt_zip() function. (r1742)
+ - The notes field in the History View now only supports plain text (r1741)
+ - Fixed issue where module label changes were not recognized correctly and raised an exception (r1740)
+ - Don't require a Module to a be of type __builtin__.type to
+allow boost:python, etc. classes (r1739)
+ - Differentiate between init.py not existing and init.py having ImportErrors (r1719)
+ - Ticket #346: Module Parameter Types Serialized Incorrectly (r1718)
+ - Update module parameter type serialization when containing namespaces to match port specs and ports (r1718)
+
+From Release: v1.4.2 build 1716
+
+Enhancements: 
+ - Ticket #290: Reload packages without restating VisTrails (r1714)
+ - Package reloading support should now be fully functional (r1714)
+ - Enabling access to a Web package repository. (r1712)
+ - Started adding support for Qt4.6.x (r1711)
+ - Package vtlcreator: Exposing the function to create the contents
+of a .vtl file as a static method, so it can be called from other
+packages  (r1709)
+ - Added support for embedding workflows when using the Web extensions (r1709)
+ - VisTrails Server: Added support for creating a .vt file for a given
+vistrail/workflow on the DB so it can be embedded on a .vtl file (r1709)
+ - New module, RepoSync, has been added to the HTTP package, which enables data files to be synced with an online repository (crowdLabs) (r1708)
+ - Added basic online web repository (crowdLabs) user authentication dialog (r1707)
+ - Added ability to upload VisTrail files to online web repository (crowdLabs) (r1707)
+ - Improved package reloading support (r1703)
+ - Added helper methods, get_inputPort_modules and get_outputPort_modules, to get modules that connect to a given input port or output port (r1701)
+ - Added helper method, connections_to_module, that returns a list of all modules that connect into a given module (r1701)
+ - Ticket #290: Reload packages without restating VisTrails (r1697)
+ - Enable package reloading without the need to restart VisTrails. (r1697)
+ - SQL package also connects to a PostgreSQL database server (r1696)
+ - SQL package: added cacheResults parameter to SQLSource (r1696)
+ - SQL package also handles connection timeouts (r1696)
+
+Bug fixes: 
+ - Package menu items (on the toolbar) are now properly removed when the package is disabled (r1714)
+ - Package lists can now be traversed with the keyboard (r1714)
+ - Fixed bug that when enabling a package dynamically sometimes VisTrails 
+would say that it failed but if you just selected the version node again the 
+pipeline would be loaded without problems (r1711)
+ - MAC and Qt4.6: VisTrails would fail to start when using MacBrushMetalStyle (r1711)
+ - Mac and Qt4.6: There was not text anti-aliasing in modules and version
+nodes (r1711)
+ - Qt4.6: Moving a module in the pipeline view would not move the 
+connections attached to it (r1711)
+ - Qt4.6: Legend Window in Visual Diff would not properly display the
+colors (r1711)
+ - Fixed a bug with opening .vtl files that embedded workflows (r1709)
+ - Package vtlcreator: Fixed a bug that the version of the embedded
+vistrail was not being set (r1709)
+ - Fixed the Capitalization error in the VisTrails App Bundle name (r1709)
+ - Properly track all modules in the hierarchy of a module loaded by a package for correct packing reloading (r1706)
+ - Made reset query work immediately for the version search box (r1705)
+ - Stop creating empty actions (r1704)
+ - DBLocator: Removing object name from XML serialization. 
+This was causing inconsistencies with caching locators because we don't
+know the name of the object before we load it  (r1702)
+ - Ticket #345: db connection edit bug (r1700)
+ - DBLocator: Serializing also db connection user so current 
+permissions are not overriden by the cached version (r1700)
+ - Ticket #344: Ungroup failing (r1699)
+ - Ensure correct modules after ungrouping (r1699)
+ - Ticket #342: Method responses return None in Web Services Package (r1698)
+ - Complex types were ignoring the new 'self' input port when 
+unwrapping contents (r1698)
+ - Ticket #341: On Ubuntu, VisTrails doesn't try to install MySQLdb (if not present) when accessing the database (r1695)
+ - Move Vistrail import into load_vistrail method to avoid
+circular imports. (r1694)
+
+From Release: v1.4.1 build 1693
+
+Enhancements: 
+ - Code cleanup: removed unnecessary imports in a few files (r1687)
+
+Bug fixes: 
+ - Using VisTrails as a library: added more imports to
+ init_for_library.py file (r1687)
+ - In the pipeline view, if you changed a module (moving it, for
+ example) and deselected the current node in the PIP view, VisTrails
+ would throw an error (r1687)
+ - Ticket #338: The DB Connection Setup Dialog opens twice (r1686)
+ - Package Web Services: expanded simple types map to include all
+ simple types defined in http://www.w3.org/2001/XMLSchema (r1685)
+ - Ticket #337: Web Services package fails to load a wsdl (r1684)
+ - Web Services package: Expanded simple types map to include missing types (r1684)
+ - Upgraded ZSI library in the binary releases to use trunk r1495
+ - Ticket #336: VisTrails fails when opening files with an older schema (r1683)
+ - Fix upgrades when module's version does not exist. (r1683)
+ 
+
+From Release: v1.4 build 1682
+
+Enhancements: 
+ - EXPERIMENTAL: Packages can handle workflow upgrade requests. Still very much 
+work-in-progress. If you want to enable this, set 'automaticallyUpgradeWorkflows' 
+to True in the Expert Configuration tab in the Preferences menu.   (r1665)
+ - Module Packages tab in Preferences menu now shows package version. (r1665)
+ - Initial revision of a sql scripting package (r1664)
+ - Improve error messages when sql statements fail (r1660)
+ - Ticket #318: Add support for generating a .vtl file within a workflow (r1657)
+ - Allow persistence package to search for persistent entities
+in multiple stores (r1654)
+ - Added script that generates nightly source releases. (r1648)
+ - Better delete buttons on the parameters. (r1646)
+ - Add data provenance support for persistent files. (r1644)
+ - Removed "Tag" entry in the method palette (r1643)
+ - Ticket #276: Make method deletion more visible (r1642)
+ - Ticket #287: Allow parameters to be named (r1642)
+ - Ticket #291: Allow functions to be populated with default values (r1642)
+ - Can delete functions/methods by clicking the check box next to the name (r1642)
+ - Can define default values for parameters (r1642)
+ - Can define labels for parameters (r1642)
+ - Added script for (re)starting vistrails in server mode with Xvfb.
+ - Visual Diff now shows matches in white; modules shared by history are colored
+gray while modules shared by matching are colored white. (r1634)
+ - Added better default descriptions to version tree. (r1634)
+ - Enabled the 'SetInputArrayToProcess' method of vtkAlgorithm class to use 
+for the InfoVis package. This port was disallowed earlier for some reason, so 
+we have to watch if this will cause any issue. (r1632)
+ - Added support for storing logs and thumbnails on the database. (r1625)
+ - Add a new module that allows the user to control the order of execution of 
+two sinks. (r1618)
+ - Use the module descriptor to do hashing instead of the module since the 
+descriptor used may be a different version. (r1615)
+ - Fix so core and gui controllers both use the same change_selected_version 
+logic. (r1614)
+ - Streamline error handling for workflow materialization. (r1614)
+ - Added Path and Directory constants and updated File constant
+along with configuration widgets. (r1611)
+ - Updated persistence package to support persistent directories
+and compression. (r1611)
+ - Initial version of a persistence package that aims to cache
+files across VisTrails sessions. (r1598)
+ - Adds support for viewing web documents in a WebViewCell using
+Qt's QWebView which is based on WebKit (r1596)
+ - Moved the controlflow package from packages to vistrails/packages. (r1588)
+ - Moved doc folder to root. (r1581)
+ - First version of source tree documentation. (r1580)
+ - Added the InfoVis example using the new VTKViewCell. (r1564)
+ - Enable more intuitive command-line interactions with
+pipelines (r1563)
+ - Added VTKViewCell for displaying vtkRenderView compatible with the current VTK trunk. Just connect vtkRenderView to VTKViewCell. First attempt, only tested on Linux. (r1562)
+
+Bug fixes: 
+ - Ticket #334: Programmatic change_parameter problem (r1679)
+ - Add translation to new ids back after input/output remap. (r1663)
+ - Ticket #328: Backslashes in SQL Problem (r1662)
+ - Use prepared statements for the relational database
+persistence. (r1662)
+ - Ticket #330: Ungroup and save to db fails (r1661)
+ - Make sure that new objects are saved to the database. (r1661)
+ - Ticket #328: Backslashes in SQL Problem (r1660)
+ - Added prepared statement support for db version 1.0.1 (r1660)
+ - Ticket #329: Analogy port remap needs to check input/output remaps (r1659)
+ - Check the correct remap when changing ports. (r1659)
+ - Check for __init__.py in userpackages on startup. (r1656)
+ - Improve feedback for undo/redo (r1655)
+ - Ticket #327: Bug in exporting registry to DB (r1653)
+ - Removed global setting on package ids from sql spec. (r1653)
+ - Fixed exporting Log, Workflow and Registry to XML (r1652)
+ - Fixed exporting Log and Workflow to DB (r1652)
+ - tag "tag" was being ignored when "version" was empty in .vtl file (r1651)
+ - Copying DBLog objects was not working (r1650) 
+ - DBVistrail.do_copy doesn't fail when log is None (r1649)
+ - Add copy methods to enhanced DBVistrail (r1645)
+ - Don't disable entire vistrails when they contain **unused**
+invalid port specs (r1641)
+ - Ticket #323: Subworkflows with version mismatches in underlying pipelines don't fail gracefully (r1640)
+ - Subworkflows that fail to load fail gracefully and print the
+exception (r1640)
+ - Ticket #321: Save As... doesn't save log (r1639)
+ - Save As and Export now save log data from files to files or
+files to db. (r1639)
+ - Ticket #259: Undo not available (r1636)
+ - Undo and redo are now available when the should be. (r1636)
+ - Execute Version Difference menu item is enabled at the correct
+times and functions correctly. (r1636)
+ - Ticket #326: Visual difference not considering namespace (r1634)
+ - Modules from different packages or namespaces no longer
+match (r1634)
+ - Groups try to match on their tag during heuristic
+matches (r1634)
+ - Ticket #325: DB version translation loses deleted entities (r1633)
+ - Translating to different database versions now transfers
+deleted entites from the old object to new object. (r1633)
+ -  wiki vistrails tags containing "tag" attributes were not executed on the wiki  (r1627)
+ - Ticket #320: Version Tree Display Inconsistent Across Serializations (r1617)
+ - Fix to make version tree layout consistent across
+serializations. (r1617)
+ - Ticket #319: Database copy/pastes saves not working correctly (r1616)
+ - Version updates now update the id scope to avoid strange
+errors when using VisTrails with an older database schema. (r1616)
+ - Copy and paste operations reset the id of a group's pipeline
+to None in order to allow the database to assign the correct
+id. (r1616)
+ - Unserialization now sets the unserialized object's is_new flag
+to True instead of allowing it to default to False. (r1616)
+ - Add version support into module signatures so that persistent
+files will be recomputed when upstream modules are updated. (r1615)
+ - Analogies now replace annotations of the same key and
+parameter values instead of adding new copies. (r1614)
+ - Bring unit tests up-to-date. (r1614)
+ - Ensure that debug messages are written in core controller. (r1614)
+ - Make code that adds parameters after executions work again. (r1614)
+ - core.system.executable_in_path now checks the correct error code from core.system.execute_cmdline() (r1613)
+ - Ticket #314: Visual Diff Broken when PythonSource loses/gains a connection (r1612)
+ - Fix issue with dynamic modules and the visual diff when ports
+have been re-typed. (r1612)
+ - Update documentation on create_action. (r1611)
+ - Ticket #311: Method palette doesn't obey port overloading (r1610)
+ - Ensure that ports are only displayed once in method palette
+and obey port overriding. (r1610)
+ - Ticket #309: Subworkflows crash on package version mismatch (r1607)
+ - Run ensure_modules, ensure_connection_specs on subworkflows
+during loading to try to avoid package version mismatch
+errors. (r1607)
+ - Ticket #308: Analogies fail on changed location (r1606)
+ - Fix bug with analogies where module's locations were added
+instead of changed causing problems when that module was
+deleted. (r1606)
+ - Fixed issue with deletes in sql persistence for versions 0.9.5
+and 1.0.0 (r1603)
+ - Ticket #307: Error messages when executing a workflow more than once (r1602)
+ - This fixes bug where error messages would be printed to the terminal when executing a pipeline with cached modules more than once (r1602)
+ - Fixed a typo in create_port, we don't need to call the vistrails_port
+object that was created. (r1601)
+ - Fixes some of the shell interaction methods. (r1600)
+ - Remove ternary operator for python 2.4 compatibility (r1599)
+ - Ticket #305: vistrails.sql script in schema v1.0.0 is broken (r1595)
+ - Fixed issues with versions 0.9.5 and 1.0.0 of the relational schema. (r1595)
+ - Ticket #304: VisTrails does not check if the connection to the database is still alive before performing an sql command (r1594)
+ -  This fixes bug where the MySQL has gone away error would show up when connected to a database and VisTrails was not being used for a while (r1594)
+ - Ticket #303: Thumbnail error when saving a vistrail (r1593)
+ -  Fixes bug that prevented a vistrail to be saved because of an error related with thumbnails. (r1593)
+ - Ticket #301: Double-clicking .vt and .vtl files does not cause them to be open by an already running VisTrails (Mac only) (r1592)
+ - Moving condition check to the right place so FileOpen events are captured correctly on a Mac (r1592)
+ - Ticket #299: Delete ops in analogies broken (r1591)
+ - Add some checks to make analogies better behaved. (r1591)
+ - Ticket #300: Null actions being added to the tree (r1590)
+ - Parameter selections don't generate null actions. (r1590)
+ - Ticket #297: MissingPort exception not raised (r1589)
+ - Fixes bug where user is never notified if a module on the
+registry is missing the requested port. (r1589)
+ - Updated VisTrails Server code in the trunk to be consistent with the server 
+running in vistrails.sci.utah.edu (r1583)
+ - Fixed small bug that prevented load a vistrail from the database 
+using the GUI. (r1582)
+ - Partial fix to deprecation messages. Not closing the ticket because it's 
+not fixed on Windows. (r1576)
+ - Ticket #283: Fold Type Mismatch Error (r1575)
+ - Fix the type mismatch error message. (r1575)
+ - Update current list of ignored classes in vtk package. (r1573)
+ - Ticket #279: Analogies broken with namespaces (r1572)
+ - Use module's _get_module_descriptor call to get the descriptor to fix
+namespace issues with analogies. (r1572)
+ - Fixes a bug that shouldn't currently be exposed to an end-user.
+Specifically, the registry's udpate_id_scope method didn't add 1 to
+the begin id. (r1571)
+ - Fixed the pipeline execution mechanism in the spreadsheet that didn't work
+with the new interpreter interface. (r1567)
+
+From release v1.3 build 1561
+
+Bug Fixes:
+ - Fixed bug that was preventing files from being saved on Windows
+
+
+From release: v1.3 build 1559
+
+Changes:
+ - Schema upgrade. Current version: 1.0.0.
+ - Updated VTK libs to use 5.4.2 release
+ - Removes conditional expression constructs, so that code runs on Python < 2.5.
+ - Including Gridfields python module
+ - Using only application single instance behavior if Qt 4.4 or later is 
+   available
+ - Added support for SubWorkflows (with no database support yet)
+ - Added a Control Flow Package (see user's guide to see how to use it) and 
+   related example files
+ - Added support for basic package repository
+ - Introduced a major reorg of the registry and related classes.  Specifically, 
+   it adds serialization capabilities, and unifies the 
+   core.modules.module_registry.PortSpec and
+   core.vistrail.port_spec.PortSpec classes.  In addition, all configuration and
+   drawing is done using PortSpecs (not Ports). It also includes revisions to 
+   the PythonSource, and Tuple configuration dialogs, and adds controller code 
+   to better support resulting updates. You can serialize the registry via the 
+   "File -> Export -> Registry To ..." menu items.
+ - Added support for "registry quickstart" which allows VisTrails to boot 
+   significantly faster.  It also further changes registry behavior to allow 
+   VisTrails to function without having access to the actual python modules 
+   behind the ModuleDescriptors.  Everything can be done by tracing the 
+   descriptor hierarchy instead of the mro, but we still use the mro when we 
+   have it.  Try the quickstart by starting VisTrails normally and selecting 
+   "File -> Export -> Registry To XML..." and saving the resulting file. 
+   Then restart VisTrails with the -q flag followed by the registry file: 
+   (ie "./vistrails -q <registry_filename>")
+ - Use solid colors instead of textured backgrounds on graphics views, 
+   since Qt (or pyqt) redraws much slower when these are enabled.
+ - Improved layout of modules in visual diff and analogy
+ - Added support for displaying thumbnails below the notes panel and/or as a
+   version node tooltip. See Thumbnails Preference tab for changing specific
+   options
+ - Improved menu File organization
+ - Added translate* methods for versions 0.9.3 and up, and updated code to use 
+   them.  This should ensure that xml vistrails, workflows, logs, and 
+   registries, can be updated when schemas change.  The idea is that you open a
+   vistrail, and if it is not in the current schema, it is translated to the 
+   current schema, no matter if you're using an xml-based file or relational
+   database.  When saving the vistrail, the db code will attempt to translate 
+   the vistrail to the schema of the database (even if it is an older version) 
+   before saving.  For xml-based files, you may optionally specify to save the 
+   file as an older version.  Currently, you are only able to translate back 
+   to 0.9.3 (See menu "File -> Export -> Stable Version").
+ - Added initial support for workflow debugging
+ - Added the progress functionality allowing modules to show their progress 
+   during the compute() by calling self.logging.update_progress(self, progress).
+ - The VisTrails Console is now a dockable window. Also fixed a long-standing 
+   bug that hitting enter when cursor is not at EOL will carry garbage to next 
+   line. Fixed also a bug where if user types fast enough in the shell, the 
+   input fails.
+ - Added support for constants to generate custom hashes. The main current 
+   usecase is File constants, which hash against filename and last-modified 
+   times. The biggest consequence is that pipelines that use File objects will 
+   now be smarter when it comes to files that change upstream, reducing the 
+   number of times one has to clear the cache.
+ - Improved the initialization of packages: if package fails during call to 
+   initialize(), we report failure, disable the package, and continue 
+   initialization. This allows startup process to continue. Also in preferences 
+   pane, when package fails to load, we now display the error message; 
+   previously, it just said "error". (There's still the problem of reporting 
+   packages that load ok but fail to initialize)
+ - Changed view behavior so that the initial pipeline view upon opening a 
+   vistrail is reset.
+ - Added support for importing workflows that have been saved as xml.
+ - Added a function to change parameters from the api along with a function to 
+   find modules by name (and package/namespace if specified). Note that the 
+   param_list in change_parameter requires a list of strings---the serialized 
+   representations of the parameters!
+ - Updated the gen_vtk_examples scripts to create better pipeline 
+   specifications.
+ - Added pc3 package for the Third Provenance Challenge.
+ - VTK package:
+   + Added support for Picking in a VisTrails cell. By default, the 
+     vtkRenderWindow contains a picker. The 'p' key activates the pick test in 
+     the render window.  A new vtkPicker can be attached to the VTKCell to 
+     modify the picking behavior according to the mechanism provided by VTK.
+   + All VTK Filters are registered to show their progress while executing
+   + Added support of InfoVis to VTKCell. Notice that the saving camera feature 
+     does not working with InfoVis (because there are no direct SetCamera port 
+     for InfoVis classes).
+   + Added support for changing the backgorund color of a vtkRenderer using 
+     color widget
+ - Spreadsheet:
+   + Added exporting images and echo mode feature
+     
+Bug Fixes:
+ - Fixed bug where queries with multiple sources would fail in query by example
+ - Spreadsheet:
+   + Jpg/gif/png images can be correctly displayed on the spreadsheet
+   + Fixed many interaction bugs
+   + temp files were not being correctly removed
+ - VTK state changes with statically overloaded parameters are now handled 
+   correctly. Typical example is vtkTreeMapView::SetLayoutStrategy
+ - Fixes a  bug where the configuration wouldn't be setup properly for a new 
+   .vistrails directory.
+ - Fixed plot.vt example to work with matplotlib version >= 0.98.5.2
+ - Catch exceptions when writing file to raise dialog box if there is an error.  
+   This fixes bug that nothing was being shown to the user in case of a bad 
+   write (ie, file permissions insufficient).
+ - Fixed PythonSource syntax highlighter error and (yes!) there's a line number 
+   for debugging now.
+ - Fixed startup "bug" when package with dependencies fails to load
+ - Copy/paste is relative to the current canvas
+ - Shipping the GPL License in the distributions
+ - ImageMagick package:
+   + Added CombineRGBA class, configuration object, and fixed GaussianBlur bug
+   + Removed requirement check that prevented the package from loading if
+     ImageMagick was not found in the path  
+ - Bug fixes in Windows installer: 
+   + Installer always creates desktop shortcut and uninstaller did not remove 
+     all pyc files
+ - Other minor fixes
+ 
+From Release v1.2.1 build 1336
+Changes:
+ - Schema upgrade. Current version: 0.9.3. If you keep vt files in a database,
+   you have to upgrade the database as well
+ - VisTrails now requires Qt 4.4 or later to run
+ - Adopted application single instance behavior (only one version of the
+   VisTrails application can be executing).
+ - Added Interactive expansion and collapsing in the version tree: the three
+   lines on edges in the version tree that used to represent multple
+   versions has been replaced by a plus symbol. Clicking this symbol
+   expands the link to show all the versions in betweeen (though this may
+   change to only a limited number later).  A minus sign appears on the
+   top of a list of untagged, non-branching, non-selected versions that
+   will collapse that list.
+ - Added descriptions to the version tree.  They show up in place of
+   a tag if one hasn't been set, but with a thinner italicized font.
+   Double-clicking on the node allows it to be changed and turned into a tag.
+   Showing a description for each action that is now displayed in the
+   properties overlay. This description is still very simple (eg.,
+   Added module), though in the future it might make sense to save off
+    more detailed descriptions for each action in the db (eg., Added
+    vtkRenderer module)
+ - Added new items to the View Menu to show and hide branches and nodes
+ - Restored the "Clear Recent Searches" in the search box in the version
+   properties
+ - Added command line options to execute workflows and show only 
+   the spreadsheet when opening
+ - Logging information is now stored in .vt file
+ 
+ Bug fixes:
+ - Copying and Pasting dynamic modules, such as PythonSource threw an error
+ - File version was not set correctly
+ - Fixed a bug in analogies that sometimes corrupted vistrails files.
+ - Fixed some bugs and annoying behavior with autosave.  A dialog
+   now prompts the user if they want to load autosaved data.  This
+   dialog appears when opening a file or starting up vistrails.
+   Autosave data no longer is loaded when the user creates a new
+   vistrail by pressing the new button.
+ - Dragging versions to the spreadsheet is working again
+ - Dragging a spreadsheet tab created a window that couldn't be closed
+   or put back. A floating sheet can be docked back by simply closing it or
+   dragging it back the spreadsheet tab bar (if exists) or just the window
+   itself.
+ - There was no obvious way to exit full screen mode in spreadsheet. The
+   fullscreen mode can be closed either by:
+    * Pressing 'ESC', 'Ctrl-F', 'F11' or 'Alt-Enter'
+    * Right click on the fullscreen mode and unselect 'Fullscreen'
+  - Border color of selected cells in the spreadsheet is now consistent
+ 
+From Release: v1.2 build 1263
+Changes:
+ - Version tags can be edited directly by double-clicking the tree nodes
+ - Added basic support for package management on Fedora Core through YUM
+ - Added compatibility with Qt4.4
+ - Added support for dynamic addition of modules in packages
+ - Pipeline, Query and History views are now reset with Ctrl+R 
+  (Command+R, on a Mac) so that it does not interfere with version text
+  items 
+ - Add a transparent overlay to the version viewer that shows the 
+   selected version's properties.  By default this is turned off, but 
+   can be enabled under the view menu.
+ - Added standalone functions that help third-party applications that 
+   need an API into VisTrails, located on vistrails/api directory.
+ - Improvements in the command-line for both non-interactive and interactive mode:
+   + Added support for executing more than one workflow at a time
+   + Included support for opening a vistrails from the database
+     Now a version (tag or id) can be specified in the command-line
+     together with the filename (or vistrails id when opening from the 
+     database). 
+ - Added support for opening special vistrails files (.vtl files) on 
+   the web (wiki integration)
+ - WebServices package: added support for loading wsdl urls automatically
+   when opening a pipeline using them
+
+
+Bug fixes:
+ - Improved handling of faulty packages
+ - Vistrails having groups with annotations or functions did not open
+   correctly
+ - Query display didn't ghost module fill
+ - Query execution and reset didn't update pipeline view
+ - Connection line was drawn twice in query canvas
+ - Editing parameters in query mode was cumbersome because of 
+   bad focus management
+ - Fixed database support to pipelines with groups
+ - Fixed "Add Database" dialog confusing behavior
+ - Fixed a long-standing bug on PythonCalc where ModuleError was 
+   being called without the self parameter
+ - HTTP Package: slightly better error handling with malformed URLs
+ - Improved general GUI performance when changing versions, including
+   Undo/Redo
+ - Removed obsolete command-line options
+ - Refine in the search box was not working
+ - Spreadsheet: Saving a spreadsheet also included cleared cells.
+
+
+From release: v1.1 build 1143
+
+Changes:
+ - Added "Set Module Label" feature (through the configuration pop-up
+    menu of the GUI)
+ - Improved error messages
+ - Added vistrails files for many of the vtk examples
+ - Added support for packages to create menus in the builder window
+   (see spreadsheet package for an example)
+ - Modules and input ports can be automatically registered by 
+   setting per-module _input_ports and _output_ports fields and 
+   per-package _modules field (see teem package at www.vistrails.org)
+ - Removed graphviz dependency
+ - Ability to export workflow and history views to PDF
+ - In WevServices Package: Improved support to web services using
+   complex types 
+ - Added a BooleanWidget, so Booleans are now given by a checkbox 
+ - In VTK Package: 
+   + Added Transfer Function Widget
+   + Added dataset inspectors, special vtk modules that allow users
+     to easily query bounds and scalar range of an object.
+   + Added support for vtkTIFFReader to allow volumetric (slice-based)
+     reads.
+ - Added support for grouping modules in pipelines
+ - Incorporated many optimizations in the code
+ - Added namespace support to packages
+
+Bug fixes:
+ - Fixed analogies
+ - Version tree was not refreshed when analogy was applied on the spreadsheet
+ - Fixed double drawing of module names and version node names on the mac
+ - Added support for running Visual Diff for pipelines with 
+   PythonSources and other modules with a local registry that 
+   have different input and output ports
+ - Changed the behavior of selecting new cell locations on the
+   spreadsheet when it is full (cycling vs. using always the first
+   cell)
+ - Fixed bug where options passed through the command line were
+   written to the startup.xml file
+
+
+From Release v1.0.1 build 1063 
+Changes:
+ - In VTK Package: Exporters now take a VTKCell as input when exporting 
+   the scene
+ 
+Bug fixes:
+ - Caching mechanism: VTK modules didn't take the connections into account 
+   when deciding whether to cache or not. This is related with the error
+   message "function expects 1 argument, got 0 instead".
+ - Fixed Parameter Exploration bugs where parameter widgets did not update 
+   correctly when changes are made to the pipeline.
+
+
+From Release 1.0 build 1024
+Changes:
+ - Added a preference option to enable/disable Brushed Metal Style on Mac
+ 
+Bug fixes:
+ - Opening/Saving a .vt file on a path with spaces was not working on Unix 
+   systems
+ - Creating/Applying analogies  on the spreadsheet
+ - Opening/Saving spreadsheets
+
+Release Name: v1.0 rev954
+
+Changes:
+ - Added module VTKRenderOffscreen to vtk package
+
+Bug fixes:
+ - Version tags couldn't be reused
+ - Some vtk writers couldn't be dragged to the pipeline canvas
+ - Vistrails crashed when trying to copy and paste something other than
+   a serialized pipeline
+ - Modules lose focus when dragging to the pipeline canvas
+ - Modules downstream of a error module were green (as if they were executed)
+ - Select All button on the spreadsheet was not working
+ - Creating a version from the spreadsheet didn't work
+ - Tags weren't deleted when pruning the tree 
+ - Booleans weren't supported in parameter exploration
+ - Fixed double-clicking on a vt file when opening vistrails on Windows
+
+From Release rev921:
+
+Changes:
+ - Interface was improved and it is now more consistent
+ - General configuration and package management accessible through menu Edit->Preferences
+ - Using a more efficient file format (*.vt)
+ - Auto saving feature 
+
diff --git a/contrib/NumSciPy/Array.py b/contrib/NumSciPy/Array.py
new file mode 100644
index 0000000..f9ef1a1
--- /dev/null
+++ b/contrib/NumSciPy/Array.py
@@ -0,0 +1,250 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+import numpy
+
+class ArrayModule(object):
+    my_namespace = 'numpy|array'
+
+class NDArray(Module, ArrayModule):
+    """ Container class for the numpy.ndarray class """
+    def __init__(self):
+        Module.__init__(self)
+        self.array = None
+        self.names = {}
+        self.general_name = None
+        self.domain = ''
+        self.range = ''
+        
+    def get_shape(self):
+	return self.array.shape
+
+    # Array Operation 
+    def reshape(self, shape):
+	self.array.shape = shape
+        
+    # Array Access
+    def get_reals(self):
+	return self.array.real
+
+    # Array Access
+    def get_imaginary(self):
+	return self.array.imag
+
+    # Array Access
+    def get_max(self):
+	return self.array.max()
+
+    # Array Access
+    def get_mean(self, axis=None):
+	return self.array.mean(axis=axis)
+
+    # Array Access
+    def get_min(self):
+	return self.array.min()
+
+    # Array Operation 
+    def cumulative_sum(self):
+	return self.array.cumsum()
+
+    # Array Access
+    def get_arg_min(self):
+	return self.array.argmin()
+
+    # Array Access
+    def get_arg_max(self):
+	return self.array.argmax()
+
+    # Array Access
+    def get_diagonal(self):
+	return self.array.diagonal()
+
+    # Array Naming
+    def get_name(self, row):
+        if self.names.has_key(row):
+            return self.names[row]
+        else:
+            return None
+
+    # Array Naming
+    def get_general_name(self):
+        return self.general_name
+    
+    # Array Naming
+    def set_name(self, name, index=False):
+        self.general_name = name
+        for i in range(self.array.shape[0]):
+            if index:
+                self.names[i] = name + " " + str(i+1)
+            else:
+                self.names[i] = name + " " + str(i)
+
+    # Array Naming
+    def set_row_name(self, name, row):
+        self.names[row] = name
+
+    # Array Naming
+    def clear_names(self):
+        self.general_name = None
+        self.names = {}
+
+    # Array Naming
+    def get_domain_name(self):
+        return self.domain
+
+    # Array Naming
+    def get_range_name(self):
+        return self.range
+    
+    # Array Naming
+    def set_domain_name(self, name):
+        self.domain = name
+
+    # Array Naming
+    def set_range_name(self, name):
+        self.range = name
+
+    # Array Naming
+    def clear_domain_name(self):
+        self.domain = ''
+
+    # Array Naming
+    def clear_range_name(self):
+        self.range = ''
+        
+    # Array Operation 
+    def sort_array(self, axis=-1, kind='quicksort', order=None):
+	return self.array.argsort(axis, kind, order)
+
+    # Array Access
+    def get_array_as_type(self, t):
+	return self.array.astype(t)
+
+    # Array Operation 
+    def swap_bytes(self, view=False):
+	return self.array.byteswap(view)
+
+    # Array Access
+    def get_conjugate(self):
+	return self.array.conjugate().copy()
+
+    # Array Operation 
+    def cumulative_product(self):
+	return self.array.cumprod()
+
+    # Array Convert
+    def dump_to_file(self, fn):
+	self.array.dump(fn)
+
+    # Array Convert
+    def dump_to_string(self):
+	return self.array.dumps()
+
+    # Array Operation 
+    def fill_array(self, val=0.):
+	self.array.fill(val)
+
+    # Array Access
+    def get_flattened(self):
+	return self.array.flatten()
+
+    # Array Access
+    def get_field(self, dtype, offset):
+	return self.array.getfield(dtype, offset)
+
+    # Array Access
+    def get_item(self):
+	return self.array.item()
+
+    # Array Access
+    def get_mem_size(self):
+	return self.array.nbytes
+
+    # Array Access
+    def get_num_dims(self):
+	return self.array.ndim
+
+    # Array Access
+    def get_nonzero_indices(self):
+	return self.array.nonzero()
+
+    # Array Operation 
+    def put(self, indices, values, mode):
+	self.array.put(indices, values, mode)
+
+    # Array Operation 
+    def ravel(self):
+	return self.array.ravel()
+
+    # Array Operation 
+    def resize(self, newshape, refcheck=True, order=False):
+	return numpy.resize(self.array, newshape, refcheck=refcheck, order=order)
+
+    # Array Operation 
+    def round(self, precision=0, out=None):
+	return self.array.round(precision, out)
+
+    # Array Operation 
+    def set_field(self, val, dtype, offset):
+	self.array.set_field(val, dtype, offset)
+
+    # Array Access
+    def get_num_elements(self):
+	return self.array.size
+
+    # Array Operation 
+    def squeeze(self):
+	return self.array.squeeze()
+
+    # Array Operation 
+    def get_standard_deviation(self, axis=None, dtype=None, out=None):
+	return self.array.std(axis, dtype, out)
+
+    # Array Operation 
+    def get_sum(self):
+	return self.array.sum()
+
+    # Array Operation 
+    def swap_axes(self, axis1, axis2):
+	return self.array.swapaxes(axis1, axis2)
+
+    # Array Convert
+    def tofile(self, file, sep, format="%s"):
+	self.array.tofile(file, sep, format)
+
+    # Array Convert 
+    def tolist(self):
+	return self.array.tolist()
+
+    # Array Convert
+    def tostring(self, order='C'):
+	return self.array.tostring(order)
+
+    # Array Operation 
+    def get_trace(self, offset, axis1, axis2, dtype=None, out=None):
+	return self.array.trace(offset, axis1, axis2, dtype, out)
+
+    # Array Access
+    def get_transpose(self):
+	return self.array.transpose()
+
+    # Array Operation 
+    def get_variance(self, axis=None, dtype=None, out=None):
+	return self.array.var(axis, dtype, out)
+
+    # Helper function for assignment
+    def get_array(self):
+        return self.array
+
+    # Helper function for assignment
+    def set_array(self, a):
+        self.array = a
+
+    # Array Access
+    def get_row_range(self, start, to):
+        return self.array[start:to+1,:]
+
+    # Array Access
+    def get_col_range(self, start, to):
+        return self.array[:, start:to+1]
diff --git a/contrib/NumSciPy/ArrayAccess.py b/contrib/NumSciPy/ArrayAccess.py
new file mode 100644
index 0000000..70d9e29
--- /dev/null
+++ b/contrib/NumSciPy/ArrayAccess.py
@@ -0,0 +1,342 @@
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+import numpy
+from Array import *
+
+class ArrayAccess(object):
+    my_namespace = "numpy|array|access"
+
+class GetShape(Module, ArrayAccess):
+    """ Get the size of each dimension of an N-dimensional array"""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        sh = a.get_shape()
+        dims = len(sh)
+        for i in xrange(dims):
+            pname = "dim" + str(i)
+            self.setResult(pname, sh[i])
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Array Shape", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "dim0", (basic.Integer, 'Dim 0 Size'))
+        reg.add_output_port(cls, "dim1", (basic.Integer, 'Dim 1 Size'))
+        reg.add_output_port(cls, "dim2", (basic.Integer, 'Dim 2 Size'))
+        reg.add_output_port(cls, "dim3", (basic.Integer, 'Dim 3 Size'), True)
+        reg.add_output_port(cls, "dim4", (basic.Integer, 'Dim 4 Size'), True)
+        reg.add_output_port(cls, "dim5", (basic.Integer, 'Dim 5 Size'), True)
+        reg.add_output_port(cls, "dim6", (basic.Integer, 'Dim 6 Size'), True)
+        reg.add_output_port(cls, "dim7", (basic.Integer, 'Dim 7 Size'), True)
+
+class GetReals(Module, ArrayAccess):
+    """ Get the real component of a complex array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        b = a.get_reals()
+        out = NDArray()
+        out.set_array(b)
+        self.setResult("Real Component", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Reals", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Real Component", (NDArray, 'Real Components'))
+    
+
+class GetImaginaries(Module, ArrayAccess):
+    """ Get the imaginary component of a complex array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        b = a.get_imaginary()
+        out = NDArray()
+        out.set_array(b)
+        self.setResult("Im Component", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Imaginaries", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Im Component", (NDArray, 'Imaginary Components'))
+
+class GetMax(Module, ArrayAccess):
+    """ Get the maximal value from an array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Max", float(a.get_max()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Max", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Max", (basic.Float, 'Max Value'))
+
+class GetMean(Module, ArrayAccess):
+    """ Get the mean value of an array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        axis = self.forceGetInputFromPort("Axis")
+        out = NDArray()
+        out.set_array(numpy.array(a.get_mean(axis)))
+        self.setResult("Mean", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Mean", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Axis", (basic.Integer, 'Axis'), True)
+        reg.add_output_port(cls, "Mean", (NDArray, 'Mean Value'))
+
+class GetMin(Module, ArrayAccess):
+    """ Get the smallest value in an array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Min", float(a.get_min()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Min", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Min", (basic.Float, 'Min Value'))
+
+class GetDiagonal(Module, ArrayAccess):
+    """ Get an array representing the values on the diagonal of the input array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        out = NDArray()
+        out.set_array(a.get_diagonal())
+        self.setResult("Diagonal", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Diagonal", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Diagonal", (NDArray, 'Diagonal Elements'))
+
+class GetArrayAsType(Module, ArrayAccess):
+    """ Cast the array to the given type """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        t = self.getInputFromPort("Type")
+        t.setValue("0")
+        out = NDArray()
+        out.set_array(a.get_array_as_type(type(t.value)))
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Cast Array", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Type", (basic.Constant, 'Cast To Type'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Array'))
+
+class GetConjugate(Module, ArrayAccess):
+    """ Get the complex conjugate of the input array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        out = NDArray()
+        out.set_array(a.get_conjugate())
+        self.setResult("Conjugate", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Conjugate", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Conjugate", (NDArray, 'Complex Conjugate'))
+
+class GetFlattenedArray(Module, ArrayAccess):
+    """ Get a flattened representation of the input array"""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        out = NDArray()
+        out.set_array(a.get_flattened())
+        self.setResult("Flat Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Flattened Array", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Flat Array", (NDArray, 'Output Vector'))
+
+class GetField(Module, ArrayAccess):
+    """ Get a field from an array given the output datatype and offset into the array"""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        dt = self.getInputFromPort("DType")
+        dt.setValue("0")
+        o = self.getInputFromPort("Offset")
+        out = NDArray()
+        out.set_array(a.get_field(type(dt.value), o))
+        self.setResult("Field", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Field", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "DType", (basic.Constant, 'Output Type'))
+        reg.add_input_port(cls, "Offset", (basic.Integer, 'Offset'))
+        reg.add_output_port(cls, "Field", (NDArray, 'Output Field'))
+
+class ToScalar(Module, ArrayAccess):
+    """ Return an array of size 1 to a scalar """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Item", float(a.get_item()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="To Scalar", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Item", (basic.Float, 'Item'))
+
+class GetMemoryFootprint(Module, ArrayAccess):
+    """ Return the amount of system memory consumed by the array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Size", int(a.get_mem_size()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Memory Size", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'InputArray'))
+        reg.add_output_port(cls, "Size", (basic.Integer, 'Memory Size'))
+
+class GetArrayRank(Module, ArrayAccess):
+    """ Get the rank of the array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Rank", int(a.get_num_dims()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Array Rank", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Rank", (basic.Integer, 'Array Rank'))
+
+class GetNonZeroEntries(Module, ArrayAccess):
+    """ Get an array consisting of the indices to all non-zero entries of the input array."""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        out = NDArray()
+        out.set_array(a.get_nonzero_indices())
+        self.setResult("Entries", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Non-Zero Entries", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Entreis", (NDArray, 'Output Array'))
+
+class GetArraySize(Module, ArrayAccess):
+    """ Get the number of entries in an array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Size", a.get_num_elements())
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Array Size", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Size", (basic.Integer, 'Number of Elements'))
+
+class GetTranspose(Module, ArrayAccess):
+    """ Get the transpose of the array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        out = NDArray()
+        out.set_array(a.get_transpose())
+        self.setResult("Transpose", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Get Transpose", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Transpose", (NDArray, 'Transposed Array'))
+
+class GetRowRange(Module, ArrayAccess):
+    """ Get a set of rows from the input array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        s = self.getInputFromPort("Start")
+        e = self.getInputFromPort("End")
+        out = NDArray()
+        if self.forceGetInputFromPort("One Indexed"):
+            s = s-1
+            e = e-1
+
+        out.set_array(a.get_row_range(s, e))
+        new_index = 0
+        for i in range(s,e+1):
+            out.set_row_name(a.get_name(i), new_index)
+            new_index += 1
+
+        out.set_domain_name(a.get_domain_name())
+        out.set_range_name(a.get_range_name())
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Start", (basic.Integer, 'Start Index'))
+        reg.add_input_port(cls, "End", (basic.Integer, 'End Index'))
+        reg.add_input_port(cls, "One Indexed", (basic.Boolean, 'One Indexed'), True)
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+
+class GetRows(Module, ArrayAccess):
+    """ Get a set of rows from the input array defined by a list of indexes """
+    def compute(self):
+        l = self.forceGetInputFromPort("Index List")
+        if l == None:
+            l = self.forceGetInputListFromPort("Indexes")
+
+        if l == None or len(l) == 0:
+            raise ModuleError("No indexes provided")
+
+        l.sort()
+        inp = self.getInputFromPort("Array")
+        in_ar = inp.get_array()
+        out_ar = in_ar[l[0],::]
+        for i in range(1,len(l)):
+            out_ar = numpy.vstack((out_ar,in_ar[i,::]))
+
+        out = NDArray()
+        for i in range(out_ar.shape[0]):
+            out.set_row_name(inp.get_row_name(l[i]), i)
+            
+        out.set_array(out_ar)
+        out_order = NDArray()
+        out_order.set_array(numpy.array(l))
+        self.setResult("Output Array", out)
+        self.setResult("Output Order", out_order)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Indexes", (basic.Integer, 'Index'))
+        reg.add_input_port(cls, "Index List", (basic.List, 'Index List'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        reg.add_output_port(cls, "Output Order", (NDArray, 'Output Ordering'))
+
+class GetColumnRange(Module, ArrayAccess):
+    """ Get a set of columns from the input array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        s = self.getInputFromPort("Start")
+        e = self.getInputFromPort("End")
+        out = NDArray()
+        out.set_array(a.get_col_range(s, e-1))
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Start", (basic.Integer, 'Start Index'))
+        reg.add_input_port(cls, "End", (basic.Integer, 'End Index'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
diff --git a/contrib/NumSciPy/ArrayConvert.py b/contrib/NumSciPy/ArrayConvert.py
new file mode 100644
index 0000000..067c774
--- /dev/null
+++ b/contrib/NumSciPy/ArrayConvert.py
@@ -0,0 +1,151 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from scipy import sparse
+from Array import *
+from Matrix import *
+
+class ArrayConvertModule(object):
+    my_namespace = 'numpy|array|convert'
+
+class ArrayDumpToFile(ArrayConvertModule, Module):
+    """ Pickle the input array and dump it to the specified file.  This
+    array can then be read in via pickle.load or numpy.load """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        fn = self.getInputFromPort("Filename")
+        a.dump_to_file(fn)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="ArrayToPickledFile", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+
+class ArrayDumpToString(ArrayConvertModule, Module):
+    """ Pickle the input array and dump it to a string.  This array
+    can then be read in via pickle.loads or numpy.loads """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Output String", a.dump_to_string())
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="ArrayToPickledString", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Output String", (basic.String, 'Output String'))
+
+class ArrayToFile(ArrayConvertModule, Module):
+    """ Write the data to a file.  If a separator char is given, the file
+    will be written in ASCII with the given char acting as a delimiter.  If
+    no separator is given, the file is written in Binary.  The array
+    is always written in row-major format regardless of the order of the
+    input array. """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        fn = self.getInputFromPort("Filename")
+        sep = ""
+        if self.hasInputFromPort("Separator"):
+            sep = self.getInputFromPort("Separator")
+        a.tofile(fn, sep)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "Separator", (basic.String, 'Separator'), True)
+        
+class ArrayToString(ArrayConvertModule, Module):
+    """ Convert the array to a Python string.  The output string will
+    be represented in row-major form regardless of the ordering of the
+    input array. """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Output String", a.tostring())
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Output String", (basic.String, 'Output String'))
+
+class ArrayToMatrix(ArrayConvertModule, Module):
+    """ Convert the input Numpy Array to a Scipy Matrix.  The input array
+    must be no more than 2-dimensional """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        try:
+            mat = sparse.csc_matrix(a.get_array())
+            out_mat = Matrix()
+            out_mat.set_matrix(mat)
+            self.setResult("Output Matrix", out_mat)
+            
+        except:
+            raise ModuleError("Could not convert input array to matrix")
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Output Matrix", (Matrix, 'Output Matrix'))
+
+class ArrayToVTKImageData(ArrayConvertModule, Module):
+    """ Convert the array to a vtImageData dataset.  This works well for
+    arrays up to (and including) rank 3.  Behavior is undefined for array of
+    rank > 3."""
+    def compute(self):
+        import vtk
+        
+        a = self.getInputFromPort("Array")
+        sh = a.get_shape()
+
+        if len(sh) < 2:
+            sh = tuple([sh[0], 1, 0])
+        if len(sh) < 3:
+            sh = tuple([sh[0], sh[1], 0])
+
+        (num_sigs, num_times, num_freqs) = sh
+        num_pts = a.get_num_elements()
+        vtk_set = core.modules.module_registry.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkStructuredPoints').module()
+        vtk_set.vtkInstance = vtk.vtkImageData()
+        vtk_set.vtkInstance.SetDimensions(sh[0], sh[1], sh[2]+1)
+        vtk_set.vtkInstance.SetScalarTypeToFloat()
+        scalars = vtk.vtkFloatArray()
+
+        ar = a.get_array()
+        for ar_x in xrange(sh[0]):
+            for ar_y in xrange(sh[1]):
+                if sh[2] == 0:
+                    val = ar[ar_x, ar_y]
+                    vtk_set.vtkInstance.SetScalarComponentFromFloat(ar_x, ar_y, 0, 0, val)
+                else:
+                    
+                    for ar_z in xrange(sh[2]):
+                        val = ar[ar_x, ar_y, ar_z]
+                        vtk_set.vtkInstance.SetScalarComponentFromFloat(ar_x, ar_y, ar_z, 0, val)
+
+        if self.hasInputFromPort("SpacingX"):
+            x = self.getInputFromPort("SpacingX")
+        else:
+            x = 1.0
+        if self.hasInputFromPort("SpacingY"):
+            y = self.getInputFromPort("SpacingY")
+        else:
+            y = 1.0
+        if self.hasInputFromPort("SpacingZ"):
+            z = self.getInputFromPort("SpacingZ")
+        else:
+            z = 1.0
+        vtk_set.vtkInstance.SetSpacing(x,y,z)
+
+        self.setResult("vtkImageData", vtk_set)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array Volume'))
+        reg.add_input_port(cls, "SpacingX", (basic.Float, 'X Spacing'))
+        reg.add_input_port(cls, "SpacingY", (basic.Float, 'Y Spacing'))
+        reg.add_input_port(cls, "SpacingZ", (basic.Float, 'Z Spacing'))
+        reg.add_output_port(cls, "vtkImageData", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkImageData').module))
diff --git a/contrib/NumSciPy/ArrayIO.py b/contrib/NumSciPy/ArrayIO.py
new file mode 100644
index 0000000..554162e
--- /dev/null
+++ b/contrib/NumSciPy/ArrayIO.py
@@ -0,0 +1,364 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import numpy
+import scipy
+import scipy.io
+import pylab
+from Array import *
+from Matrix import *
+
+class ArrayIOModule(object):
+    my_namespace = 'numpy|io'
+
+class NrrdHelper(object):
+    def __init__(self):
+        self.type = {}
+        self.type['float32'] = 'f'
+        self.type['float'] = 'f'
+        self.type['float64'] = 'd'
+        self.type['double'] = 'd'
+        self.type['int'] = 'i'
+        self.type['int16'] = 'i'
+        self.type['long'] = 'l'
+        self.type['int32'] = 'l'
+        self.type['unsigned short'] = 's'
+        self.type['unsigned char'] = 'c'
+
+        self.nrrd_type = {}
+        self.nrrd_type['float'] = 'float'
+        self.nrrd_type['float32'] = 'float'
+        self.nrrd_type['float64'] = 'double'
+        self.nrrd_type['double'] = 'double'
+        self.nrrd_type['int64'] = 'long'
+        self.nrrd_type['long'] = 'long'
+        self.nrrd_type['int32'] = 'int'
+        self.nrrd_type['int16'] = 'short'
+        self.nrrd_type['int8'] = 'uchar'
+        self.nrrd_type['unsigned short'] = 'short'
+
+        self.little_endian = True
+        
+    def num_bytes(self, dtype):
+        if self.type.has_key(dtype):
+            return self.type[dtype]
+        else:
+            print "Cannot find " + dtype + " in type library."
+            print "Assuming float32 for dtype"
+            return 'f'
+
+    def get_nrrd_type(self, data):
+        dt = data.dtype.name
+        if self.nrrd_type.has_key(dt):
+            return self.nrrd_type[dt]
+        else:
+            print "Cannot find " + dt + " in type library."
+            print "Assuming float32 for dtype"
+            return 'float'
+        
+    def read_raw(self, fn, sizes, dtype, little_end=True):
+        try:
+            fid = open(fn, 'rb')
+            dt = self.num_bytes(dtype)
+            ndim = len(sizes)
+            num_el = 1
+            for i in xrange(ndim):
+                num_el *= sizes[i]
+
+            if little_end:
+                dt = '<'+dt
+            else:
+                dt = '>'+dt
+
+            data = numpy.fromfile(fn, dt)
+            fid.close()
+            data.shape = sizes
+            return data
+        except:
+            raise ModuleError("Could not read .raw file!")
+
+    def write_raw(self, fn, data):
+        try:
+            fid = open(fn, 'wb')
+            scipy.io.fwrite(fid, data.size, data)
+            fid.close()
+        except:
+            raise ModuleError("Could not write .raw file!")
+
+    def write_nhdr(self, fn, data):
+        import os
+        l = fn.split('/')
+        name = l[len(l)-1]
+        base = name.split('.')[0]
+        rawname = base + '.raw'
+        rawpath = fn.rstrip(name)
+        rawpath += rawname
+        self.write_raw(rawpath, data)
+        cmd = 'unu make -h -t '
+        cmd += self.get_nrrd_type(data) + ' '
+        cmd += '-e raw -i ' + rawname + ' -s '
+        sh = data.shape
+        ndims = len(sh)
+        for i in xrange(ndims):
+            cmd += str(sh[i]) + ' '
+
+        cmd += '-o ' + fn
+        try:
+            os.system(cmd)
+        except:
+            raise ModuleError("Could not write NHDR file.  Please make sure the Teem and UNU utilities are on your path.")
+        
+    def read_nhdr(self, fn):
+        import os.path
+        try:
+            fid = open(fn, 'r')
+            for line in fid:
+                if line.split(':')[0] == 'type':
+                    self.dtype = line.split(':')[1].strip()
+                if line.split(':')[0] == 'dimension':
+                    self.ndim = int(line.split(':')[1].strip())
+                if line.split(':')[0] == 'sizes':
+                    s = line.split(':')[1].strip().split(' ')
+                    self.sizes = []
+                    for l in s:
+                        self.sizes.append(int(l))
+                if line.split(':')[0] == 'endian':
+                    if line.split(':')[1].strip() == 'little':
+                        self.little_endian = True
+                    else:
+                        self.little_endian = False
+                if line.split(':')[0] == 'data file':
+                    self.fn = line.split(':')[1].strip()
+                if line.split(':')[0] == 'encoding':
+                    self.encoding = line.split(':')[1].strip()
+            fid.close()
+        except:
+            raise ModuleError("Could not read .nhdr file!")
+
+        if self.encoding == 'raw':
+            curpath = os.getcwd()
+            npath = os.path.dirname(fn)
+            os.chdir(npath)
+            data = self.read_raw(self.fn, self.sizes, self.dtype, little_end=self.little_endian)
+            os.chdir(curpath)
+            return data
+
+        raise ModuleError(".nhdr file contains file not in .raw format!")
+
+class ReadPNG(ArrayIOModule, Module):
+    """ Load a .png type image into a Numpy Array. """
+    def compute(self):
+        fn = self.getInputFromPort("Filename")
+        ar = pylab.imread(fn)
+        out = NDArray()
+        out.set_array(ar)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class WritePNG(ArrayIOModule, Module):
+    """ Write a .png type image from a Numpy Array. """
+    def compute(self):
+        fn = self.getInputFromPort("Filename")
+        ar = self.getInputFromPort("Image")
+        minv = self.forceGetInputFromPort("Min")
+        maxv = self.forceGetInputFromPort("Max")
+        if minv == None:
+            minv = 0
+        if maxv == None:
+            maxv = 255
+        da_ar = ar.get_array().squeeze()
+        im = scipy.misc.toimage(da_ar, cmin=minv, cmax=maxv).save(fn)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "Min", (basic.Integer, 'Min Value'))
+        reg.add_input_port(cls, "Max", (basic.Integer, 'Max Value'))
+        reg.add_input_port(cls, "Image", (NDArray, 'Image To Write'))
+
+class ReadRAW(ArrayIOModule, Module):    
+    """ Load a .raw file into a Numpy Array.  The .raw files are
+    assumed to be in the volvis format: http://www.volvis.org """
+    def __init__(self):
+        Module.__init__(self)
+        self.helper = NrrdHelper()
+        
+    def compute(self):
+        fn = self.getInputFromPort("Filename")
+        sizes = self.getInputListFromPort("Sizes")
+        dtype = self.getInputFromPort("DataType")
+        ar = self.helper.read_raw(fn, sizes, dtype)
+        out = NDArray()
+        out.set_array(ar)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "Sizes", (basic.Integer, 'Dimension Sizes'))
+        reg.add_input_port(cls, "DataType", (basic.String, 'Datatype'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class WriteRAW(ArrayIOModule, Module):
+    """ Write a .raw file from a Numpy Array. """
+    def __init__(self):
+        Module.__init__(self)
+        self.helper = NrrdHeler()
+
+    def compute(self):
+        fn = self.getInputFromPort("Filename")
+        ar = self.getInputFromPort("Array").get_array()
+        self.helper.write_raw(fn,ar)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        
+class ReadNHDR(ArrayIOModule, Module):
+    """ Load a .nhdr/.raw pair into a Numpy Array. """
+    def __init__(self):
+        Module.__init__(self)
+        self.helper = NrrdHelper()
+
+    def compute(self):
+        fn = ''
+        if self.hasInputFromPort("File"):
+            fn = self.getInputFromPort("File").name
+        else:
+            fn = self.getInputFromPort("Filename")
+        ar = self.helper.read_nhdr(fn)
+        out = NDArray()
+        out.set_array(ar)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "File", (basic.File, 'File'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        
+class WriteNHDR(ArrayIOModule, Module):
+    """ Write a .nhdr/.raw pair from a Numpy Array """
+    def __init__(self):
+        Module.__init__(self)
+        self.helper = NrrdHelper()
+
+    def compute(self):
+        fn = self.getInputFromPort("Filename")
+        ar = self.getInputFromPort("Array").get_array()
+        self.helper.write_nhdr(fn,ar)
+        self.setResult("Filename Out", fn)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Filename Out", (basic.String, 'Output Filename'))
+
+class ReadStatisticalSummary(ArrayIOModule, Module):
+    """
+    Documentation
+    """
+    def compute(self):
+        fn = ''
+        if self.hasInputFromPort("File"):
+            fn = self.getInputFromPort("File").name
+        else:
+            fn = self.getInputFromPort("Filename")
+
+        if self.forceGetInputFromPort("Allocate Aggregated Array"):
+            alloc_array = True
+        else:
+            alloc_array = False
+
+        fid = open(fn, 'r')
+        dims = fid.readline().strip().split()
+        n_pts = int(dims[0])
+        n_bins = int(dims[1])
+
+        min_ar = numpy.zeros(n_pts)
+        lq_ar = numpy.zeros(n_pts)
+        med_ar = numpy.zeros(n_pts)
+        hq_ar = numpy.zeros(n_pts)
+        max_ar = numpy.zeros(n_pts)
+        mode_ar = numpy.zeros((n_pts, 4))
+        hist_ar = numpy.zeros((n_pts, n_bins))
+        if alloc_array:
+            ag_ar = numpy.zeros((n_pts, 5+4+n_bins))
+        for i in xrange(n_pts):
+            l = fid.readline().strip().split()
+            min_ar[i] = float(l[0])
+            lq_ar[i] = float(l[1])
+            med_ar[i] = float(l[2])
+            hq_ar[i] = float(l[3])
+            max_ar[i] = float(l[4])
+            for j in xrange(4):
+                mode_ar[i, j] = float(l[5+j])
+
+            for b in xrange(n_bins):
+                hist_ar[i, b] = float(l[9+b])
+
+            if alloc_array:
+                vals = numpy.array(l).astype('float')
+                ag_ar[i,:] += vals
+
+        fid.close()
+        
+        min_ar_out = NDArray()
+        min_ar_out.set_array(min_ar)
+        self.setResult("Min Array", min_ar_out)
+        
+        lq_ar_out = NDArray()
+        lq_ar_out.set_array(lq_ar)
+        self.setResult("Lower Quartile Array", lq_ar_out)
+        
+        med_ar_out = NDArray()
+        med_ar_out.set_array(med_ar)
+        self.setResult("Median Array", med_ar_out)
+        
+        hq_ar_out = NDArray()
+        hq_ar_out.set_array(hq_ar)
+        self.setResult("Upper Quartile Array", hq_ar_out)
+        
+        max_ar_out = NDArray()
+        max_ar_out.set_array(max_ar)
+        self.setResult("Max Array", max_ar_out)
+        
+        mode_ar_out = NDArray()
+        mode_ar_out.set_array(mode_ar)
+        self.setResult("Mode Array", mode_ar_out)
+        
+        hist_ar_out = NDArray()
+        hist_ar_out.set_array(hist_ar)
+        self.setResult("Histogram Array", hist_ar_out)
+
+        if alloc_array:
+            ag_ar_out = NDArray()
+            ag_ar_out.set_array(ag_ar)
+            self.setResult("Aggregated Array", ag_ar_out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "File", (basic.File, 'File'))
+        reg.add_input_port(cls, "Allocate Aggregated Array", (basic.Boolean, 'Allocate Extra Space for Aggregated Array'), True)
+        reg.add_output_port(cls, "Min Array", (NDArray, 'Minima Array'))
+        reg.add_output_port(cls, "Lower Quartile Array", (NDArray, 'Lower Quartile Array'))
+        reg.add_output_port(cls, "Median Array", (NDArray, 'Median Array'))
+        reg.add_output_port(cls, "Upper Quartile Array", (NDArray, 'Upper Quartile Array'))
+        reg.add_output_port(cls, "Max Array", (NDArray, 'Maxima Array'))
+        reg.add_output_port(cls, "Mode Array", (NDArray, 'Mode Array'))
+        reg.add_output_port(cls, "Histogram Array", (NDArray, 'Histogram Array'))
+        reg.add_output_port(cls, "Aggregated Array", (NDArray, 'Aggregated Array'), True)
diff --git a/contrib/NumSciPy/ArrayInterpolate.py b/contrib/NumSciPy/ArrayInterpolate.py
new file mode 100644
index 0000000..3200c31
--- /dev/null
+++ b/contrib/NumSciPy/ArrayInterpolate.py
@@ -0,0 +1,152 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import scipy
+import scipy.interpolate
+import scipy.ndimage
+import vtk
+from Array import *
+from Matrix import *
+
+class ArrayInterpModule(object):
+    my_namespace = 'scipy|interpolation'
+    
+class RBFInterpolate(ArrayInterpModule, Module):
+    """ Use radial basis function interpolation to project scalars from
+    one mesh to another.  The input, Source, describes the x,y,z coordinates and
+    values of the points in the form:  [[x,y,z,v]]  The input, Destination,
+    describes the x,y,z coordinates of the points to project onto in the form
+    [[x,y,z]].  Additional (optional) inputs controll the basis function (basis),
+    the smoothing factor (smoothing) and the tuning parameter (epsilon).  Not
+    all parameters are valid for all bases.  The following defaults are applied:
+
+    basis = inverse multiquadric
+    smoothing = 0.0
+    epsilon = 1.0
+    """
+
+    def compute(self):
+        src = self.getInputFromPort("Source").get_array()
+        if src.shape[1] != 4:
+            raise ModuleError("Source array must be in the form [[x,y,z,v]]")
+        
+        dest = self.getInputFromPort("Destination").get_array()
+        if dest.shape[1] != 3:
+            raise ModuleError("Destination array must be in the form [[x,y,z]]")
+        
+        if self.hasInputFromPort("Basis"):
+            self.basis = self.getInputFromPort("Basis")
+        else:
+            self.basis = 'inverse multiquadric'
+
+        if self.hasInputFromPort("Smoothing"):
+            self.smooth = self.getInputFromPort("Smoothing")
+        else:
+            self.smooth = 0.0
+
+        if self.hasInputFromPort("Epsilon"):
+            self.eps = self.getInputFromPort("Epsilon")
+        else:
+            self.eps = 1.0
+
+        rbfi = scipy.interpolate.Rbf(src[:,0], src[:,1], src[:,2], src[:,3], function=self.basis, smooth=self.smooth, epsilon=self.eps)
+
+        val_ar = rbfi(dest[:,0], dest[:,1], dest[:,2])
+
+        out = NDArray()
+        out.set_array(val_ar)
+        self.setResult("Output", out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Source", (NDArray, 'Source Array'))
+        reg.add_input_port(cls, "Destination", (NDArray, 'Destination Array'))
+        reg.add_input_port(cls, "Basis", (basic.String, 'Basis Function'), True)
+        reg.add_input_port(cls, "Smoothing", (basic.Float, 'Smoothing Factor'), True)
+        reg.add_input_port(cls, "Epsilon", (basic.Float, 'Basis Epsilon'), True)
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Scalars'))
+
+class BSplineInterpolate(ArrayInterpModule, Module):
+    """
+    Find the B-Spline representation of an N-dimensional curve.
+    """
+
+    def compute(self):
+        in_ar = self.getInputFromPort("Input").get_array()
+        num_samp = self.forceGetInputFromPort("Interpolant Support")
+        if not num_samp:
+            num_samp = in_ar.shape[0]
+
+        smoothing = self.forceGetInputFromPort("Smoothing")
+        if not smoothing:
+            smoothing = 0.0
+
+        degree = self.forceGetInputFromPort("Degree")
+        if not degree:
+            degree = 3
+
+        (tckvec, u) = scipy.interpolate.splprep(in_ar, s=smoothing, k=degree, nest=-1)
+        (x,y,z) = splev(numpy.linspace(0.,1.,num_samp), tckvec)
+        out_ar = numpy.zeros((x.shape[0], 3))
+        out_ar[:,0] = x
+        out_ar[:,1] = y
+        out_ar[:,2] = z
+
+        out = NDArray()
+        out.set_array(out_ar)
+
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Source Array'))
+        reg.add_input_port(cls, "Smoothing", (basic.Float, 'Smoothing Factor'), True)
+        reg.add_input_port(cls, "Interpolant Support", (basic.Integer, 'Output Samples'), True)
+        reg.add_input_port(cls, "Degree", (basic.Integer, 'Polynomial Degree'), True)
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Scalars'))
+
+class BSplineResample(ArrayInterpModule, Module):
+    """
+    Resample the input array using an order-n bspline
+    """
+    def compute(self):
+        in_ar = self.getInputFromPort("Input").get_array()
+        order = self.forceGetInputFromPort("Order")
+        if order == None:
+            order = 3
+        planes = self.forceGetInputFromPort("Planes")
+        ndim = in_ar.ndim
+        gridshape = self.getInputFromPort("New Shape").values
+
+        out_ar = None
+        if planes:
+            out_ar = []
+            for i in range(in_ar.shape[0]):
+                pl = in_ar[i].squeeze()
+                arshape = pl.shape
+                g = scipy.mgrid[tuple([slice(0, v1-1, complex(0,v2)) for (v1,v2) in zip(arshape, gridshape)])]
+                coords = numpy.array(list(g))
+                out_ar.append(scipy.ndimage.map_coordinates(pl, coords))
+
+            out_ar = numpy.array(out_ar)
+            
+        else:
+            arshape = in_ar.shape
+            g = scipy.mgrid[tuple([slice(0, v1-1, complex(0,v2)) for (v1,v2) in zip(arshape, gridshape)])]
+            coords = numpy.array(list(g))
+            out_ar = scipy.ndimage.map_coordinates(in_ar, coords)
+            
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Source Array'))
+        reg.add_input_port(cls, "Order", (basic.Integer, 'Bspline Order'), True)
+        reg.add_input_port(cls, "New Shape", (basic.Tuple, 'New Array Shape'))
+        reg.add_input_port(cls, "Planes", (basic.Boolean, 'Apply to each plane'), True)
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Scalars'))
diff --git a/contrib/NumSciPy/ArrayOperations.py b/contrib/NumSciPy/ArrayOperations.py
new file mode 100644
index 0000000..d7cf0bc
--- /dev/null
+++ b/contrib/NumSciPy/ArrayOperations.py
@@ -0,0 +1,632 @@
+from core.modules.vistrails_module import Module, ModuleError
+from Array import *
+
+class ArrayOperationModule(object):
+    my_namespace = 'numpy|array|operations'
+
+
+class ArrayReshape(ArrayOperationModule, Module):
+    """ Reshape the input array.  The dimension sizes are presented
+    and used to reshape the array.  Please note that the total number
+    of elements in the array must remain the same before and after
+    reshaping. """
+    def compute(self):
+	a = self.getInputFromPort("Array")
+        dims = self.getInputFromPort("Dims")
+        newdims = []
+	
+	for i in xrange(dims):
+	    pname = "dim" + str(i)
+	    newdims.append(self.getInputFromPort(pname))
+
+        try:
+            a.reshape(tuple(newdims))
+        except:
+            raise ModuleError("Could not assign new shape.  Be sure the number of elements remains constant")
+        
+        self.setResult("Array Output", a.copy())
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="ReshapeArray", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Dims", (basic.Integer, 'New Dimensionality'))
+        reg.add_input_port(cls, "dim0", (basic.Integer, 'Dimension Size'))
+        reg.add_input_port(cls, "dim1", (basic.Integer, 'Dimension Size'))
+        reg.add_input_port(cls, "dim2", (basic.Integer, 'Dimension Size'))
+        reg.add_input_port(cls, "dim3", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim4", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim5", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim6", (basic.Integer, 'Dimension Size'), True)
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+    
+class ArrayCumulativeSum(ArrayOperationModule, Module):
+    """ Get the cumulative sum of a given array.  This is returned as a
+    flattened array of the same size as the input where each element
+    of the array serves as the cumulative sum up until that point."""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        b = a.cumulative_sum()
+        out = NDArray()
+        out.set_array(b)
+        self.setResult("Array Output", out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+
+class ArrayScalarMultiply(ArrayOperationModule, Module):
+    """ Multiply the input array with a given scalar """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        b = self.getInputFromPort("Scalar")
+        out = NDArray()
+        out.set_array(a.get_array() * b)
+        self.setResult("Array Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Scalar", (basic.Float, 'Input Scalar'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+
+class ArraySort(ArrayOperationModule, Module):
+    def __init__(self):
+        Module.__init__(self)
+        self.axis = -1
+        self.kind = 'quicksort'
+        self.order = None
+        
+    """ Sort the input array.  By default, a flattened representation
+    of the input array is used as input to a quicksort.  Optional
+    inputs are the axis in which to sort on and the type of sort to
+    use.
+
+    Sorting algorithms supported:
+         quicksort - best average speed, unstable
+         mergesort - needs additional working memory, stable
+         heapsort  - good worst-case performance, unstable
+    """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Axis"):
+            self.axis = self.getInputFromPort("Axis")
+        if self.hasInputFromPort("Sort"):
+            self.kind = self.getInputFromPort("Sort")
+        if self.hasInputFromPort("Order"):
+            self.order = self.getInputFromPort("Order")
+
+        b = a.sort_array(axis=self.axis, kind=self.kind, order=self.order)
+        out = NDArray()
+        out.set_array(b.copy())
+        self.setResult("Sorted Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Axis", (basic.Integer, 'Axis to sort'), True)
+        reg.add_input_port(cls, "Sort", (basic.String, 'Sort Algorithm'), True)
+        reg.add_input_port(cls, "Order", (basic.Integer, 'Order'),True)
+        reg.add_output_port(cls, "Sorted Array", (NDArray, 'Sorted Array'))
+
+class ArrayCumulativeProduct(ArrayOperationModule, Module):
+    """ Get the cumulative product of a given array.  This is returned as
+    a flattened array of the same size as the input where each element of
+    the array serves as the cumulative product up until that point"""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        b = a.cumulative_product()
+        out = NDArray()
+        out.set_array(b)
+        self.setResult("Array Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+
+class ArrayFill(ArrayOperationModule, Module):
+    """ Fill the input array with the given value. If no value is given
+    it is filled with 0.0"""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Value"):
+            val = self.getInputFromPort("Value")
+        else:
+            val = 0.
+            
+        a.fill_array(val)
+        self.setResult("Array Output", a)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Fill Array", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Value", (basic.Float, 'Value'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+        
+class ArrayResize(ArrayOperationModule, Module):
+    """ Resize the input array.  Unlike the ArrayReshape module,
+    the number of elements of the array need not be conserved.
+    If the shape is larger than the input array size, repeated
+    copies of the input array will be copied to the resized version.
+    If the shape is smaller, the input array will be cropped appropriately.
+    """
+    def compute(self):
+	a = self.getInputFromPort("Array")
+        dims = self.getInputFromPort("Dims")
+        newdims = []
+	
+	for i in xrange(dims):
+	    pname = "dim" + str(i)
+	    newdims.append(self.getInputFromPort(pname))
+
+        try:
+            t = tuple(newdims)
+            b = a.resize(t)
+            out = NDArray()
+            out.set_array(b.copy())
+        except:
+            raise ModuleError("Could not assign new shape.")
+        
+        self.setResult("Array Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Dims", (basic.Integer, 'Output Dimensionality'))
+        reg.add_input_port(cls, "dim0", (basic.Integer, 'Dimension Size'))
+        reg.add_input_port(cls, "dim1", (basic.Integer, 'Dimension Size'))
+        reg.add_input_port(cls, "dim2", (basic.Integer, 'Dimension Size'))
+        reg.add_input_port(cls, "dim3", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim4", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim5", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim6", (basic.Integer, 'Dimension Size'), True)
+        reg.add_input_port(cls, "dim7", (basic.Integer, 'Dimension Size'), True)
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+
+class ArrayExtractRegion(ArrayOperationModule, Module):
+    """ Extract a region from array as specified by the
+    dimension and starting and ending indices """
+    def compute(self):
+        import operator
+        a = self.getInputFromPort("Array")
+        dims = self.getInputFromPort("Dims")
+        a_dims = len(a.get_shape())
+        if dims > a_dims:
+            raise ModuleError("Output Dimensionality larger than Input Dimensionality")
+
+        slices = []
+        for i in xrange(dims):
+            (start, stop) = self.getInputFromPort("dim"+str(i))
+            slices.append(slice(start, stop))
+
+        ar = operator.__getitem__(a.get_array(), tuple(slices))
+        out = NDArray()
+        out.set_array(ar)
+        self.setResult("Array Output", out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        l = [basic.Integer, basic.Integer]
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Dims", (basic.Integer, 'Output Dimensionality'))
+        reg.add_input_port(cls, "dim0", l, True)
+        reg.add_input_port(cls, "dim1", l, True)
+        reg.add_input_port(cls, "dim2", l, True)
+        reg.add_input_port(cls, "dim3", l, True)
+        reg.add_input_port(cls, "dim4", l, True)
+        reg.add_input_port(cls, "dim5", l, True)
+        reg.add_input_port(cls, "dim6", l, True)
+        reg.add_input_port(cls, "dim7", l, True)
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+
+class ArrayRavel(ArrayOperationModule, Module):
+    """ Get a 1D array containing the elements of the input array"""
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        b = NDArray()
+        b.set_array(a.ravel().copy())
+        self.setResult("Array Output", b)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+        
+class ArrayRound(ArrayOperationModule, Module):
+    """ Round each element of the array to the given number of
+    decimal places.  This defaults to 0 resulting in a rounding
+    to integers """
+    def __init__(self):
+        Module.__init__(self)
+        self.decimals = 0
+
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Decimals"):
+            self.decimals = self.getInputFromPort("Decimals")
+
+        out = NDArray()
+        out.set_array(a.round(precision=self.decimals))
+        self.setResult("Array Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Decimals", (basic.Integer, 'Precision'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Output Array'))
+
+class ArrayGetSigma(ArrayOperationModule, Module):
+    """ Return the standard deviation of elements in the array """
+    def __init__(self):
+        Module.__init__(self)
+        self.axis=None
+
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Axis"):
+            self.axis = self.getInputFromPort("Axis")
+
+        out = NDArray()
+        out.set_array(a.get_standard_deviation(self.axis))
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="ArrayStandardDeviation", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Axis", (basic.Integer, 'Axis'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArraySum(ArrayOperationModule, Module):
+    """ Get the sum of all elements in the input array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        self.setResult("Array Sum", float(a.get_sum()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Array Sum", (basic.Float, 'Sum'))
+
+class ArrayElementMultiply(ArrayOperationModule, Module):
+    """ Perform an element-wise multiply on the elements of two arrays """
+    def compute(self):
+        a1 = self.getInputFromPort("Array1")
+        a2 = self.getInputFromPort("Array2")
+        out = NDArray()
+        out.set_array(a1.get_array() * a2.get_array())
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array1", (NDArray, 'Input Array 1'))
+        reg.add_input_port(cls, "Array2", (NDArray, 'Input Array 2'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        
+class ArraySetElement(ArrayOperationModule, Module):
+    """ Set a set of array elements given arrays of values and indices
+
+        Please note that this module creates a copy of the input to operate
+        on to preserve the original array data. """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Scalar Value"):
+            self.v = self.getInputFromPort("Scalar Value")
+        else:
+            self.v = self.getInputFromPort("Value Array")
+
+        if self.hasInputFromPort("Single Index"):
+            self.ind = self.getInputFromPort("Single Index")
+        else:
+            self.ind = self.getInputFromPort("Index Array")
+
+        out_a = a.copy()
+        
+        out_a.put(self.ind, self.v)
+        out = NDArray()
+        out.set_array(out_a)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Scalar Value", (basic.Float, 'Value to Set'))
+        reg.add_input_port(cls, "Value Array", (NDArray, 'Values to Set'))
+        reg.add_input_port(cls, "Single Index", (basic.Integer, 'Index to Set'))
+        reg.add_input_port(cls, "Index Array", (NDArray, 'Indexes to Set'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        
+class ArrayVariance(ArrayOperationModule, Module):
+    """ Calculate the variance of the elements of an array """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Axis"):
+            self.setResult("Variance", float(a.get_variance(axis=self.getInputFromPort("Axis"))))
+        else:
+            self.setResult("Variance", float(a.get_variance()))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Axis", (basic.Integer, 'Axis'))
+        reg.add_output_port(cls, "Variance", (basic.Float, 'Variance'))
+        
+class ArrayTrace(ArrayOperationModule, Module):
+    """ Calculate the trace of the input array.
+
+        The input array must have at least rank 2.  The trace is taken
+        on the diagonal given by the inputs Axis1 and Axis2 using the
+        given Offset.  If these values are not supplied, they default to:
+
+        Axis1 = 0
+        Axis2 = 1
+        Offset = 0
+    """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        if self.hasInputFromPort("Axis1"):
+            self.axis1 = self.getInputFromPort("Axis1")
+        else:
+            self.axis1 = 0
+
+        if self.hasInputFromPort("Axis2"):
+            self.axis2 = self.getInputFromPort("Axis2")
+        else:
+            self.axis2 = 1
+
+        if self.hasInputFromPort("Offset"):
+            self.offset = self.getInputFromPort("Offset")
+        else:
+            self.offset = 0
+
+        self.setResult("Trace", float(a.get_trace(self.offset, self.axis1, self.axis2)))
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Axis1", (basic.Integer, 'Axis 1'))
+        reg.add_input_port(cls, "Axis2", (basic.Integer, 'Axis 2'))
+        reg.add_input_port(cls, "Offset", (basic.Integer, 'Offset'))
+        reg.add_output_port(cls, "Trace", (basic.Float, 'Array Trace'))
+        
+class ArraySwapAxes(ArrayOperationModule, Module):
+    """ Create a new view of the input array with the
+    given axes swapped.
+    """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        a1 = self.getInputFromPort("Axis1")
+        a2 = self.getInputFromPort("Axis2")
+        out = NDArray()
+        out.set_array(a.swap_axes(a1, a2).copy())
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Axis1", (basic.Integer, 'Axis 1'))
+        reg.add_input_port(cls, "Axis2", (basic.Integer, 'Axis 2'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArraySqueeze(ArrayOperationModule, Module):
+    """ Eliminate all length-1 dimensions in the input array. """
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        out = NDArray()
+        out.set_array(a.get_array().squeeze().copy())
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArrayAdd(ArrayOperationModule, Module):
+    """ Add two arrays of the same size and shape """
+    def compute(self):
+        a1 = self.getInputFromPort("Array One").get_array()
+        a2 = self.getInputFromPort("Array Two").get_array()
+
+        if a1.shape != a2.shape:
+            raise ModuleError("Cannot add arrays with different shapes")
+
+        out = NDArray()
+        out.set_array(a1 + a2)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array One", (NDArray, 'Input Array 1'))
+        reg.add_input_port(cls, "Array Two", (NDArray, 'Input Array 2'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArrayScalarAdd(ArrayOperationModule, Module):
+    """ Add two arrays of the same size and shape """
+    def compute(self):
+        a1 = self.getInputFromPort("Array One").get_array()
+        s = self.getInputFromPort("Scalar")
+
+        out = NDArray()
+        out.set_array(a1 + s)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array One", (NDArray, 'Input Array 1'))
+        reg.add_input_port(cls, "Scalar", (basic.Float, 'Scalar'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArrayLog10(ArrayOperationModule, Module):
+    """ Take the base-10 log of each element in the input array """
+    def compute(self):
+        a = self.getInputFromPort("Array").get_array()
+        out = NDArray()
+        out.set_array(numpy.log10(a))
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+    
+class ArrayAtan2(ArrayOperationModule,  Module):
+    """ Calculate the oriented arc-tangent of a vector stored as two arrays.
+    Reals:  Real components of complex vectors
+    Imaginaries:  Imaginary components of complex vectors
+    """
+    def compute(self):
+        r = self.getInputFromPort("Reals").get_array()
+        i = self.getInputFromPort("Imaginaries").get_array()
+        out = NDArray()
+        out.set_array(numpy.arctan2(r,i))
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Reals", (NDArray, 'Real Components'))
+        reg.add_input_port(cls, "Imaginaries", (NDArray, 'Imaginary Components'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArraySqrt(ArrayOperationModule, Module):
+    """ Calculate the element-wise square root of the input array """
+    def compute(self):
+        a = self.getInputFromPort("Input Array").get_array()
+        out = NDArray()
+        out.set_array(numpy.sqrt(a))
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Input Array'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+           
+class ArrayThreshold(ArrayOperationModule, Module):
+    """ Threshold the array keeping only the values above the scalar value, v. """
+    def compute(self):
+        in_ar = self.getInputFromPort("Input Array").get_array()
+        v = self.getInputFromPort("Value")
+        r = self.forceGetInputFromPort("Replacement")
+        if r == None:
+            r = 0.
+        out = NDArray()
+        out.set_array(numpy.where(in_ar > v, in_ar, r))
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Value", (basic.Float, 'Threshold Value'))
+        reg.add_input_port(cls, "Replacement", (basic.Float, 'Replacement Value'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        
+class ArrayWindow(ArrayOperationModule, Module):
+    """ Threshold the array from both above and below, keeping only
+    the values within the window. """
+    def compute(self):
+        in_ar = self.getInputFromPort("Input Array").get_array()
+        lo = self.forceGetInputFromPort("Lower Bound")
+        hi = self.forceGetInputFromPort("Upper Bound")
+        r = self.forceGetInputFromPort("Replacement")
+        if r == None:
+            r = 0.
+        if lo == None:
+            lo = in_ar.min()
+        if hi == None:
+            hi = in_ar.max()
+
+        out = NDArray()
+        o = numpy.where(in_ar >= lo, in_ar, r)
+        o = numpy.where(o <= hi, o, r)
+        out.set_array(o)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Lower Bound", (basic.Float, 'Lower Threshold Value'))
+        reg.add_input_port(cls, "Upper Bound", (basic.Float, 'Upper Threshold Value'))
+        reg.add_input_port(cls, "Replacement", (basic.Float, 'Replacement Value'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ArrayNormalize(ArrayOperationModule, Module):
+    """ Normalize the input array """
+    def compute(self):
+        in_ar = self.getInputFromPort("Input Array").get_array()
+        ar = numpy.zeros(in_ar.shape)
+        if self.forceGetInputFromPort("Planes"):
+            for i in range(in_ar.shape[0]):
+                p = in_ar[i] - in_ar[i].min()
+                ar[i] = p / p.max()
+        else:
+            ar = in_ar - in_ar.min()
+            ar = ar/ar.max()
+            
+        out = NDArray()
+        out.set_array(ar)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "Planes", (basic.Boolean, 'Plane-wise normalization'), True)
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        
+class ArrayName(ArrayOperationModule, Module):
+    """ Assign a name or label to the entries of an array """
+    def compute(self):
+        in_ar = self.getInputFromPort("Input Array")
+        gen_name = self.forceGetInputFromPort("Name")
+        one_index = self.forceGetInputFromPort("One Indexed")
+        if gen_name:
+            in_ar.set_name(gen_name, index=one_index)
+
+        name_list = self.forceGetInputListFromPort("Row Name")
+        if name_list != None:
+            for (i,n) in name_list:
+                in_ar.set_row_name(n, i)
+
+        dname = self.forceGetInputFromPort("Domain Name")
+        if dname:
+            in_ar.set_domain_name(dname)
+
+        rname = self.forceGetInputFromPort("Range Name")
+        if rname:
+            in_ar.set_range_name(rname)
+
+        self.setResult("Output Array", in_ar)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Input Array'))
+        reg.add_input_port(cls, "One Indexed", (basic.Boolean, 'One Indexed'))
+        reg.add_input_port(cls, "Name", (basic.String, 'Array Name'))
+        reg.add_input_port(cls, "Row Name", [basic.Integer, basic.String], True)
+        reg.add_input_port(cls, "Domain Name", (basic.String, 'Domain Label'))
+        reg.add_input_port(cls, "Range Name", (basic.String, 'Range Label'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
diff --git a/contrib/NumSciPy/ArrayPlot.py b/contrib/NumSciPy/ArrayPlot.py
new file mode 100644
index 0000000..ef6e1ae
--- /dev/null
+++ b/contrib/NumSciPy/ArrayPlot.py
@@ -0,0 +1,638 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from core.modules.basic_modules import PythonSource
+from Array import *
+from Matrix import *
+
+import pylab
+import matplotlib
+import urllib
+import random
+
+class ArrayPlot(object):
+    namespace = 'numpy|array|plotting'
+    def get_label(self, ar, i):
+        lab = ar.get_name(i)
+        if lab == None:
+            return 'Array ' + str(i)
+        else:
+            return lab
+            
+    def is_cacheable(self):
+        return False
+
+    def get_color(self, colors, i, randomcolor):
+        if randomcolor:
+            return (random.random(), random.random(), random.random())
+
+        if self.color_dict == None:
+            self.color_dict = {}
+            for (k,r,g,b) in colors:
+                self.color_dict[k] = (r,g,b)
+
+        if self.color_dict.has_key(i):
+            return self.color_dict[i]
+        else:
+            return None
+                
+    def get_marker(self, markers, i):
+        if markers == None:
+            return None
+
+        if self.marker_dict == None:
+            self.marker_dict = {}
+            for (k,m) in markers:
+                self.marker_dict[k] = m
+
+        if self.marker_dict.has_key(i):
+            return self.marker_dict[i]
+        else:
+            return None
+
+    def get_alpha(self, alphas, i):
+        return None
+
+class ArrayImage(ArrayPlot, Module):
+    '''
+    Display the 2D input Data Array as a color-mapped image.
+    Independent control of the aspect ratio, colormap, presence of the
+    colorbar and presented axis values are provided through the
+    appropriate input ports: Aspect Ratio, Colormap, Colorbar,
+    Extents.  To change the colormap being used, it must be one of the
+    pre-made maps provided by matplotlib.cm.  Only 1 2D array can be
+    viewed at a time.
+    '''
+    def compute(self):
+        data = self.getInputFromPort("Data Array")
+        da_ar = data.get_array().squeeze()
+        if da_ar.ndim != 2:
+            raise ModuleError("Input Data Array must have dimension = 2")
+
+        aspect_ratio = self.forceGetInputFromPort("Aspect Ratio")
+        colormap = self.forceGetInputFromPort("Colormap")
+        colorbar = self.forceGetInputFromPort("Colorbar")
+        extents = self.forceGetInputFromPort("Extents")
+
+        # Quickly check the assigned colormap to make sure it's valid
+        if colormap == None:
+            colormap = "jet"
+        if not hasattr(pylab, colormap):
+            colormap = "jet"
+            
+        bg_color = self.forceGetInputFromPort("Background")
+        array_x_t = self.forceGetInputFromPort("Use X Title")
+        array_y_t = self.forceGetInputFromPort("Use Y Title")
+
+        p_title = self.forceGetInputFromPort("Title")
+        x_label = self.forceGetInputFromPort("X Title")
+        y_label = self.forceGetInputFromPort("Y Title")
+        
+        s = urllib.unquote(str(self.forceGetInputFromPort("source", '')))
+
+        s = 'from pylab import *\n' +\
+            'from numpy import *\n' +\
+            'import numpy\n'
+        
+        if bg_color == None:
+            bg_color = 'w'
+
+        if type(bg_color) == type(''):
+            s += 'figure(facecolor=\'' + bg_color + '\')\n'
+        else:
+            s += 'figure(facecolor=' + str(bg_color) + ')\n'
+
+        s += 'imshow(da_ar, interpolation=\'bicubic\''
+        if aspect_ratio != None:
+            s += ', aspect=' + str(aspect_ratio)
+
+        if extents != None:
+            s += ', extent=['+str(extents[0])+','+str(extents[1])+','+str(extents[2])+','+str(extents[3])+']'
+        s += ')\n'
+
+        s += colormap + '()\n'
+
+        if colorbar:
+            s += 'colorbar()\n'
+
+        if array_x_t:
+            s += 'xlabel(\'' + data.get_domain_name() + '\')\n'
+        elif x_label:
+            s += 'xlabel(\'' + x_label + '\')\n'
+
+        if array_y_t:
+            s += 'ylabel(\'' + data.get_range_name() + '\')\n'
+        elif y_label:
+            s += 'ylabel(\'' + y_label + '\')\n'
+
+        if p_title:
+            s += 'title(\'' + p_title + '\')\n'
+
+        exec s
+        self.setResult('source', s)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "source", (basic.String, 'source'), True)
+        reg.add_input_port(cls, "Data Array", (NDArray, 'Array to Plot'))
+        reg.add_input_port(cls, "Aspect Ratio", (basic.Float, 'Aspect Ratio'))
+        reg.add_input_port(cls, "Colormap", (basic.String, 'Colormap'))
+        reg.add_input_port(cls, "Colorbar", (basic.Boolean, 'Show Colorbar'), True)
+        reg.add_input_port(cls, "Extents", [basic.Float, basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Background", [basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Use X Title", (basic.Boolean, 'Apply X-axis Label'))
+        reg.add_input_port(cls, "Use Y Title", (basic.Boolean, 'Apply Y-axis Label'))
+        reg.add_input_port(cls, "Title", (basic.String, 'Figure Title'))
+        reg.add_input_port(cls, "X Title", (basic.String, 'X-axis label'), True)
+        reg.add_input_port(cls, "Y Title", (basic.String, 'Y-axis label'), True)
+        reg.add_output_port(cls, "source", (basic.String, 'source'))
+        
+class Histogram(ArrayPlot, Module):
+    '''
+    Plot a histogram of the data values.  Multiple datasets can be
+    presented by providing multiple connections to the Data Array
+    port.  These data are then differentiated by assigned colors and
+    labels.  By default, 10 bins are used to histogram the data.
+    Additionally, recapturing the PDF of the data is possible by
+    enabling the Normalize option.
+    '''
+    def compute(self):
+        data = self.getInputListFromPort("Data Array")
+        self.label_dict = None
+        self.color_dict = None
+        use_legend = self.forceGetInputFromPort("Legend")
+        randomcolors = self.forceGetInputFromPort("Random Colors")
+        colors = self.forceGetInputListFromPort("Colors")
+        bg_color = self.forceGetInputFromPort("Background")
+        array_x_t = self.forceGetInputFromPort("Use X Title")
+        array_y_t = self.forceGetInputFromPort("Use Y Title")
+        p_title = self.forceGetInputFromPort("Title")
+        x_label = self.forceGetInputFromPort("X Title")
+        nbins = self.forceGetInputFromPort("Bins")
+        if nbins == None:
+            nbins = 10
+        normed = self.forceGetInputFromPort("Normalize")
+        if normed == None:
+            normed = False
+
+        s = urllib.unquote(str(self.forceGetInputFromPort("source", '')))
+        self.source = ''
+
+        s = 'from pylab import *\n' +\
+            'from numpy import *\n' +\
+            'import numpy\n'
+        
+        if bg_color == None:
+            bg_color = 'w'
+
+        if type(bg_color) == type(''):
+            s += 'figure(facecolor=\'' + bg_color + '\')\n'
+        else:
+            s += 'figure(facecolor=' + str(bg_color) + ')\n'
+
+        data_list = []
+        for i in data:
+            data_list.append(i.get_array().squeeze())
+
+        da_ar = None
+        try:
+            da_ar = numpy.array(data_list)
+        except:
+            raise ModuleException("Not all Data Array inputs are the same size!")
+
+        for i in range(da_ar.shape[0]):
+            lab = self.get_label(data[i], i)
+            col = self.get_color(colors, i, randomcolors)
+
+            s += 'hist(da_ar['+str(i)+',:], bins=' + str(nbins)
+            
+            if lab != None:
+                s += ', label=\'' + lab + '\''
+            if col != None:
+                s += ', facecolor=' + str(col)
+
+            s += ', normed='+str(normed)
+            s += ')\n'
+
+        if use_legend:
+            s += 'legend()\n'
+
+        if array_x_t:
+            s += 'xlabel(\'' + data[0].get_domain_name() + '\')\n'
+        elif x_label:
+            s += 'xlabel(\'' + x_label + '\')\n'
+
+        if array_y_t:
+            s += 'ylabel(\'Histogram Value\')\n'
+
+        if p_title:
+            s += 'title(\'' + p_title + '\')\n'
+
+        exec s
+        self.setResult("source", s)        
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "source", (basic.String, 'source'), True)
+        reg.add_input_port(cls, "Data Array", (NDArray, 'Data Array to Plot'))
+        reg.add_input_port(cls, "Legend", (basic.Boolean, 'Use Legend'), True)
+        reg.add_input_port(cls, "Random Colors", (basic.Boolean, 'Assign Random Colors'), True)
+        reg.add_input_port(cls, "Colors", [basic.Integer, basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Background", [basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Use X Title", (basic.Boolean, 'Apply X-axis Label'))
+        reg.add_input_port(cls, "Use Y Title", (basic.Boolean, 'Apply Y-axis Label'))
+        reg.add_input_port(cls, "Title", (basic.String, 'Figure Title'))
+        reg.add_input_port(cls, "X Title", (basic.String, 'X-axis label'), True)
+        reg.add_input_port(cls, "Bins", (basic.Integer, 'Number of Bins'))
+        reg.add_input_port(cls, "Normalize", (basic.Boolean, 'Normalize to PDF'), True)
+        reg.add_output_port(cls, "source", (basic.String, 'source'))
+        
+class BarChart(ArrayPlot, Module):
+    '''
+    Create a bar chart of the input data.  Different datasets can be
+    used simultaneously by connecting to the Data input port multiple
+    times.  Each successive data connection will be rendered on top of
+    the previous dataset.  This creates a stacked bar chart.  Error
+    bars are drawn with the errors for each of the datasets connected
+    to the Error Bars input port.
+    '''
+    def get_ticks(self, num):
+        a = []
+        for i in range(num):
+            a.append('')
+
+        for i in self.tick_dict.keys():
+            a[i] = self.tick_dict[i]
+
+        return a
+        
+    def compute(self):
+        data = self.getInputListFromPort("Data")
+        errs = self.forceGetInputListFromPort("Error Bars")
+        if len(errs) == 0:
+            errs = None
+
+        self.label_dict = None
+        self.color_dict = None
+        use_legend = self.forceGetInputFromPort("Legend")
+        randomcolors = self.forceGetInputFromPort("Random Colors")
+        colors = self.forceGetInputListFromPort("Colors")
+        bg_color = self.forceGetInputFromPort("Background")
+        array_x_t = self.forceGetInputFromPort("Use X Title")
+        array_y_t = self.forceGetInputFromPort("Use Y Title")
+        ticks = self.forceGetInputListFromPort("Bar Labels")
+        self.tick_dict = {}
+        for (k,v) in ticks:
+            self.tick_dict[k] = v
+        p_title = self.forceGetInputFromPort("Title")
+        x_label = self.forceGetInputFromPort("X Title")
+        y_label = self.forceGetInputFromPort("Y Title")
+
+        width = self.forceGetInputFromPort("Bar Width")
+        if width == None:
+            width = 0.5
+
+        if errs != None:
+            if len(data) != len(errs):
+                raise ModuleError("Number of data does not match number of error bar data")
+
+        s = urllib.unquote(str(self.forceGetInputFromPort("source", '')))
+        self.source = ''
+
+        s = 'from pylab import *\n' +\
+            'from numpy import *\n' +\
+            'import numpy\n'
+        
+        if bg_color == None:
+            bg_color = 'w'
+
+        if type(bg_color) == type(''):
+            s += 'figure(facecolor=\'' + bg_color + '\')\n'
+        else:
+            s += 'figure(facecolor=' + str(bg_color) + ')\n'
+
+        numpts = None
+        ind = None
+        prev = None
+        ind = numpy.arange(data[0].get_array().flatten().shape[0])
+        t = self.get_ticks(data[0].get_array().flatten().shape[0])
+        ag_ar = numpy.zeros((len(data), data[0].get_array().flatten().shape[0]))
+        for i in range(len(data)):
+            da_ar = data[i].get_array().flatten()
+            ag_ar[i,:] = da_ar
+
+        er_ar = numpy.zeros((len(data), data[0].get_array().flatten().shape[0]))
+        if errs != None:
+            for i in range(len(data)):
+                er_ar[i,:] = errs[i].get_array().flatten()
+            
+        for i in range(ag_ar.shape[0]):
+            s += 'bar(ind, ag_ar[' + str(i) + ',:], width'
+            lab = self.get_label(data[i], i)
+            col = self.get_color(colors, i, randomcolors)
+            if lab != None:
+                s += ', label=\'' + lab + '\''
+            if col != None:
+                s += ', color=' + str(col)
+
+            if errs != None:
+                s += ', yerr=er_ar[' + str(i) + ',:]'
+
+            if prev != None:
+                s += ', bottom=ag_ar[' + str(i-1) + ',:]'
+
+            s += ')\n'
+            prev = ag_ar[i]
+                
+        if use_legend:
+            s += 'legend()\n'
+
+        if array_x_t:
+            s += 'xlabel(\'' + data[0].get_domain_name() + '\')\n'
+        elif x_label:
+            s += 'xlabel(\'' + x_label + '\')\n'
+
+        if array_y_t:
+            s += 'ylabel(\'' + data[0].get_range_name() + '\')\n'
+        elif y_label:
+            s += 'ylabel(\'' + y_label + '\')\n'
+
+        if p_title:
+            s += 'title(\'' + p_title + '\')\n'
+
+        s += 'xticks(ind + width/2., t)\n'
+        exec s
+        self.setResult("source", s)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "source", (basic.String, 'source'), True)
+        reg.add_input_port(cls, "Data", (NDArray, 'Data Array to Plot'))
+        reg.add_input_port(cls, "Error Bars", (NDArray, 'Error Array to Plot'))
+        reg.add_input_port(cls, "Legend", (basic.Boolean, 'Use Legend'), True)
+        reg.add_input_port(cls, "Random Colors", (basic.Boolean, 'Assign Random Colors'), True)
+        reg.add_input_port(cls, "Colors", [basic.Integer, basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Background", [basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Bar Labels", [basic.Integer, basic.String], True)
+        reg.add_input_port(cls, "Use X Title", (basic.Boolean, 'Apply X-axis Label'))
+        reg.add_input_port(cls, "Use Y Title", (basic.Boolean, 'Apply Y-axis Label'))
+        reg.add_input_port(cls, "X Title", (basic.String, 'X-axis label'), True)
+        reg.add_input_port(cls, "Y Title", (basic.String, 'Y-axis label'), True)
+        reg.add_input_port(cls, "Title", (basic.String, 'Figure Title'))
+        reg.add_input_port(cls, "Bar Width", (basic.Float, 'Bar Width'), True)
+        reg.add_output_port(cls, "source", (basic.String, 'source'))
+        
+class ScatterPlot(ArrayPlot, Module):
+    '''
+    Create a scatter plot from X and Y positions defined by the X
+    Array and Y Array ports, respectively.  Datasets can be added by
+    connecting multiple arrays to the appropriate input ports.
+    Symbols representing each dataset can be defined by using the
+    Markers input assigning a valid pylab symbol to a dataset.
+    '''
+    def compute(self):
+        xdata = self.getInputListFromPort("X Array")
+        ydata = self.getInputListFromPort("Y Array")
+        self.label_dict = None
+        use_legend = self.forceGetInputFromPort("Legend")
+        randomcolors = self.forceGetInputFromPort("Random Colors")
+        colors = self.forceGetInputListFromPort("Colors")
+        self.color_dict = None
+        bg_color = self.forceGetInputFromPort("Background")
+        markers = self.forceGetInputListFromPort("Markers")
+        self.marker_dict = None
+        ps = self.forceGetInputFromPort("Point Size")
+        array_x_t = self.forceGetInputFromPort("Use X Title")
+        array_y_t = self.forceGetInputFromPort("Use Y Title")
+
+        p_title = self.forceGetInputFromPort("Title")
+        x_label = self.forceGetInputFromPort("X Title")
+        y_label = self.forceGetInputFromPort("Y Title")
+
+        s = urllib.unquote(str(self.forceGetInputFromPort("source", '')))
+        self.source = ''
+
+        if len(xdata) != len(ydata):
+            raise ModuleError("Cannot create scatter plot for different number of X and Y datasets.")
+
+        s = 'from pylab import *\n' +\
+            'from numpy import *\n' +\
+            'import numpy\n'
+        
+        if bg_color == None:
+            bg_color = 'w'
+
+        if type(bg_color) == type(''):
+            s += 'figure(facecolor=\'' + bg_color + '\')\n'
+        else:
+            s += 'figure(facecolor=' + str(bg_color) + ')\n'
+
+        xdata_ar = numpy.zeros((len(xdata), xdata[0].get_array().flatten().shape[0]))
+        ydata_ar = numpy.zeros((len(xdata), xdata[0].get_array().flatten().shape[0]))
+
+        for i in range(len(xdata)):
+            xd = xdata[i]
+            yd = ydata[i]
+            xdata_ar[i,:] = xd.get_array().flatten()
+            ydata_ar[i,:] = yd.get_array().flatten()
+            
+        for i in range(len(xdata)):
+            xar = xdata[i]
+            yar = ydata[i]
+
+            lab = self.get_label(xar, i)
+            col = self.get_color(colors, i, randomcolors)
+            mar = self.get_marker(markers, i)
+
+            s += 'scatter(xdata_ar[' + str(i) +',:], ydata_ar[' + str(i) + ',:]'
+            
+            if lab != None:
+                s += ', label=\'' + lab +'\''
+            if col != None:
+                s += ', color=' + str(col)
+            if mar != None:
+                s += ', marker=\'' + mar + '\''
+            if ps != None:
+                s += ', size=' + str(ps)
+            s += ')\n'
+
+        if use_legend:
+            s += 'legend()\n'
+
+        if array_x_t:
+            s += 'xlabel(\'' + xar.get_domain_name() + '\')\n'
+        elif x_label:
+            s += 'xlabel(\'' + x_label + '\')\n'
+
+        if array_y_t:
+            s += 'ylabel(\'' + yar.get_domain_name() + '\')\n'
+        elif y_label:
+            s += 'ylabel(\'' + y_label + '\')\n'
+
+        if p_title:
+            s += 'title(\'' + p_title + '\')\n'
+
+        print s
+        exec s
+        self.setResult("source", s)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "source", (basic.String, 'source'), True)
+        reg.add_input_port(cls, "X Array", (NDArray, 'X Array to Plot'))
+        reg.add_input_port(cls, "Y Array", (NDArray, 'Y Array to Plot'))
+        reg.add_input_port(cls, "Legend", (basic.Boolean, 'Use Legend'), True)
+        reg.add_input_port(cls, "Random Colors", (basic.Boolean, 'Assign Random Colors'), True)
+        reg.add_input_port(cls, "Colors", [basic.Integer, basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Background", [basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Markers", [basic.Integer, basic.String], True)
+        reg.add_input_port(cls, "Use X Title", (basic.Boolean, 'Apply X-axis Label'))
+        reg.add_input_port(cls, "Use Y Title", (basic.Boolean, 'Apply Y-axis Label'))
+        reg.add_input_port(cls, "X Title", (basic.String, 'X-axis label'), True)
+        reg.add_input_port(cls, "Y Title", (basic.String, 'Y-axis label'), True)
+        reg.add_input_port(cls, "Title", (basic.String, 'Figure Title'))
+        reg.add_input_port(cls, "Point Size", (basic.Float, 'Point Size'), True)
+        reg.add_output_port(cls, "source", (basic.String, 'source'))
+
+class LinePlot(ArrayPlot, Module):
+    '''
+    Create a standard line plot from a 1 or 2-dimensional Input Array.
+    If the Input Array is 2-dimensional, each row will be plotted as a
+    new line.
+    '''    
+    def compute(self):
+        data = self.getInputFromPort("Input Array")
+        indexes = self.forceGetInputFromPort("Indexes")
+        self.label_dict = None
+        use_legend = self.forceGetInputFromPort("Legend")
+        randomcolors = self.forceGetInputFromPort("Random Colors")
+        colors = self.forceGetInputListFromPort("Colors")
+        self.color_dict = None
+        markers = self.forceGetInputListFromPort("Markers")
+        self.marker_dict = None
+        x_label = self.forceGetInputFromPort("X Title")
+        y_label = self.forceGetInputFromPort("Y Title")
+        p_title = self.forceGetInputFromPort("Title")
+        bg_color = self.forceGetInputFromPort("Background")
+
+        array_x_t = self.forceGetInputFromPort("Use X Title")
+        array_y_t = self.forceGetInputFromPort("Use Y Title")
+
+        s = urllib.unquote(str(self.forceGetInputFromPort("source", '')))
+        self.source = ''
+        da_ar = data.get_array()
+
+        if da_ar.ndim > 2:
+            raise ModuleError("Cannot plot data with dimensions > 2")
+        
+        s = 'from pylab import *\n' +\
+            'from numpy import *\n' +\
+            'import numpy\n'
+        
+        if bg_color == None:
+            bg_color = 'w'
+
+        if type(bg_color) == type(''):
+            s += 'figure(facecolor=\'' + bg_color + '\')\n'
+        else:
+            s += 'figure(facecolor=' + str(bg_color) + ')\n'
+            
+        if da_ar.ndim == 1:
+            da_ar.shape = (1, da_ar.shape[0])
+
+        xar = self.forceGetInputFromPort("X Values")
+        sf = self.forceGetInputFromPort("Scaling Factor")
+        if sf == None:
+            sf = 1.
+
+        if xar == None:
+            start_i = None
+            end_i = None
+            if indexes == None:
+                start_i = 0
+                end_i = da_ar.shape[1]
+            else:
+                start_i = indexes[0]
+                end_i = indexes[1]
+
+            xar = numpy.arange(start_i, end_i)
+            xar = xar * sf
+        else:
+            xar = xar.get_array()
+        
+        print da_ar.shape
+        print xar.shape
+        for i in range(da_ar.shape[0]):
+            lab = self.get_label(data, i)
+            col = self.get_color(colors, i, randomcolors)
+            mar = self.get_marker(markers, i)
+            if indexes == None:
+                s += 'plot(xar, da_ar[' + str(i) + ',:]'
+            else:
+                s += 'plot(xar, da_ar[' + str(i) + ',' + str(indexes[0]) + ':' + str(indexes[1]) + ']'
+                
+            if lab != None:
+                s += ', label=\'' + lab +'\''
+            if col != None:
+                s += ', color=' + str(col)
+            if mar != None:
+                s += ', marker=\'' + mar + '\''
+            s += ')\n'
+
+        if use_legend:
+            s += 'legend()\n'
+
+        if array_x_t:
+            s += 'xlabel(\'' + data.get_domain_name() + '\')\n'
+        elif x_label:
+            s += 'xlabel(\'' + x_label + '\')\n'
+
+        if array_y_t:
+            s += 'ylabel(\'' + data.get_range_name() + '\')\n'
+        elif y_label:
+            s += 'ylabel(\'' + y_label + '\')\n'
+
+        if p_title:
+            s += 'title(\'' + p_title + '\')\n'
+
+        exec s
+        self.setResult("source", s)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "source", (basic.String, 'source'), True)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Array to Plot'))
+        reg.add_input_port(cls, "X Values", (NDArray, 'Domain Values'))
+        reg.add_input_port(cls, "Legend", (basic.Boolean, 'Use Legend'), True)
+        reg.add_input_port(cls, "Random Colors", (basic.Boolean, 'Assign Random Colors'), True)
+        reg.add_input_port(cls, "Colors", [basic.Integer, basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Markers", [basic.Integer, basic.String], True)
+        reg.add_input_port(cls, "Use X Title", (basic.Boolean, 'Apply X-axis Label'))
+        reg.add_input_port(cls, "Use Y Title", (basic.Boolean, 'Apply Y-axis Label'))
+        reg.add_input_port(cls, "X Title", (basic.String, 'X-axis label'), True)
+        reg.add_input_port(cls, "Y Title", (basic.String, 'Y-axis label'), True)
+        reg.add_input_port(cls, "Title", (basic.String, 'Figure Title'))
+        reg.add_input_port(cls, "Background", [basic.Float, basic.Float, basic.Float], True)
+        reg.add_input_port(cls, "Indexes", [basic.Integer, basic.Integer], True)
+        reg.add_input_port(cls, "Scaling Factor", (basic.Float, 'Scaling Factor'), True)
+        reg.add_output_port(cls, "source", (basic.String, 'source'))
diff --git a/contrib/NumSciPy/ArrayUtilities.py b/contrib/NumSciPy/ArrayUtilities.py
new file mode 100644
index 0000000..2f3ffa9
--- /dev/null
+++ b/contrib/NumSciPy/ArrayUtilities.py
@@ -0,0 +1,254 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from scipy import sparse
+import vtk
+from Array import *
+from Matrix import *
+
+class ArrayUtilModule(object):
+    my_namespace = 'numpy|array|utilities'
+
+class ArrayToVTKVectors(ArrayUtilModule, Module):
+    def compute(self):
+        v0 = self.forceGetInputFromPort("Array0")
+        v1 = self.forceGetInputFromPort("Array1")
+        v2 = self.forceGetInputFromPort("Array2")
+        ds = self.getInputFromPort("VTK Data")
+
+        v_name = self.forceGetInputFromPort("Vector Name")
+        if v_name == None:
+            v_name = 'vectors'
+
+        vsize = 0
+        if v0:
+            vsize += 1
+            v0 = v0.get_array().flatten()
+        if v1:
+            vsize += 1
+            v1 = v1.get_array().flatten()
+        if v2:
+            vsize += 1
+            v2 = v2.get_array().flatten()
+
+        np = ds.vtkInstance.GetNumberOfPoints()
+        pd = ds.vtkInstance.GetPointData()
+        vtk_ar = vtk.vtkDoubleArray()
+#        vtk_ar.SetNumberOfValues(np)
+        vtk_ar.SetNumberOfComponents(3)
+        for i in range(np):
+            if vsize == 2:
+                vtk_ar.InsertNextTuple3(v0[i], v1[i], 0.)
+            elif vsize == 3:
+                vtk_ar.InsertNextTuple3(v0[i], v1[i], v2[i])
+
+        vtk_ar.SetName(v_name)
+        ds.vtkInstance.GetPointData().AddArray(vtk_ar)
+        ds.vtkInstance.GetPointData().SetVectors(vtk_ar)
+#        ds.vtkInstance.GetPointData().SetActiveVectors(v_name)
+        self.setResult("Output", ds)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "Array0", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "Array1", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "Array2", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "VTK Data", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkDataSet').module))
+        reg.add_input_port(cls, "Vector Name", (basic.String, 'Scalar Name'), True)
+        reg.add_output_port(cls, "Output", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkDataSet').module))
+
+class ArrayToTimeVaryingVTKVectors(ArrayUtilModule, Module):
+    def update_progress(self, cur, total):
+        t = float(cur) / float(total)
+        self.logging.update_progress(self, t)
+
+    def compute(self):
+        v0 = self.forceGetInputFromPort("Array0")
+        v1 = self.forceGetInputFromPort("Array1")
+        v2 = self.forceGetInputFromPort("Array2")
+        ds = self.getInputFromPort("VTK Data")
+
+        v_name = self.forceGetInputFromPort("Vector Name")
+        if v_name == None:
+            v_name = 'vectors'
+
+        vsize = 0
+        if v0:
+            vsize += 1
+        if v1:
+            vsize += 1
+        if v2:
+            vsize += 1
+
+        num_times = ds.vtkInstance.GetNumberOfTimeSteps()
+        for i in range(num_times):
+            self.update_progress(i, num_times)
+            np = ds.vtkInstance.GetTimeStep(i).GetNumberOfPoints()
+            pd = ds.vtkInstance.GetTimeStep(i).GetPointData()
+            vtk_ar = vtk.vtkDoubleArray()
+#        vtk_ar.SetNumberOfValues(np)
+            vtk_ar.SetNumberOfComponents(3)
+            arx = v0.get_array().squeeze()
+            arx = arx[i,::].squeeze().flatten()
+            ary = v1.get_array().squeeze()
+            ary = ary[i,::].squeeze().flatten()
+            if vsize == 3:
+                arz = v2.get_array().squeeze()
+                arz = arz[i,::].squeeze().flatten()
+            for j in range(np):
+                if vsize == 2:
+                    vtk_ar.InsertNextTuple3(arx[j], ary[j], 0.)
+                elif vsize == 3:
+                    vtk_ar.InsertNextTuple3(arz[j], ary[j], arz[j])
+
+            vtk_ar.SetName(v_name)
+            ds.vtkInstance.GetTimeStep(i).GetPointData().AddArray(vtk_ar)
+            ds.vtkInstance.GetTimeStep(i).GetPointData().SetVectors(vtk_ar)
+#        ds.vtkInstance.GetPointData().SetActiveVectors(v_name)
+        self.setResult("Output", ds)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "Array0", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "Array1", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "Array2", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "VTK Data", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkTemporalDataSet').module))
+        reg.add_input_port(cls, "Vector Name", (basic.String, 'Scalar Name'), True)
+        reg.add_output_port(cls, "Output", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkTemporalDataSet').module))
+        
+
+class ArrayToTimeVaryingVTKScalars(ArrayUtilModule, Module):
+    def update_progress(self, cur, total):
+        t = float(cur) / float(total)
+        self.logging.update_progress(self, t)
+        
+    def compute(self):
+        ds = self.getInputFromPort("VTK Data")
+        ar = self.getInputFromPort("Scalars")
+        v_name = self.forceGetInputFromPort("Array Name")
+        if v_name == None:
+            v_name = 'scalars'
+        num_times = ds.vtkInstance.GetNumberOfTimeSteps()
+        ar_ = ar.get_array()
+        if ar_.shape[0] != num_times:
+            raise ModuleError("Cannot process array with num timesteps = " +
+                              str(ar_.shape[0]) +
+                              " and vtkdata with " +
+                              str(num_times) + " timesteps")
+        
+        for i in range(num_times):
+            self.update_progress(i, num_times)
+            s_ar = ar_[i,::].squeeze().flatten()
+            vtk_ar = vtk.vtkDoubleArray()
+            vtk_ar.SetNumberOfValues(s_ar.size)
+            vtk_ar.SetName(v_name)
+            for j in range(s_ar.size):
+                vtk_ar.InsertNextValue(s_ar[j])
+            
+            ds.vtkInstance.GetTimeStep(i).GetPointData().AddArray(vtk_ar)
+            ds.vtkInstance.GetTimeStep(i).GetPointData().SetScalars(vtk_ar)
+
+        self.setResult("Output", ds)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "Scalars", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "VTK Data", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkTemporalDataSet').module))
+        reg.add_input_port(cls, "Array Name", (basic.String, 'Scalar Name'), True)
+        reg.add_output_port(cls, "Output", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkTemporalDataSet').module))
+
+class ArrayToVTKScalars(ArrayUtilModule, Module):
+    """ Take a scalar array and consider it as an array of scalars
+    to assign to a VTK dataset.  The number of elements in the
+    scalar array must be equivalent to the number of points in
+    the VTK dataset.  Please note that this module adds a scalar
+    array to the input dataset and can be considered a mutating filter
+    because of this."""
+
+    def compute(self):
+        a = self.getInputFromPort("Array")
+        ds = self.getInputFromPort("VTK Data")
+        scalar_name = ''
+        if self.hasInputFromPort("Scalar Name"):
+            scalar_name = self.getInputFromPort("Scalar Name")
+        else:
+            scalar_name = 'scalars'
+        
+        s_ar = a.get_array().flatten()
+        np = ds.vtkInstance.GetNumberOfPoints()
+#        if s_ar.size != np:
+#            raise ModuleError("Could not assign scalars to VTK dataset with different number of elements")
+
+        pd = ds.vtkInstance.GetPointData()
+        vtk_ar = vtk.vtkDoubleArray()
+        vtk_ar.SetNumberOfValues(np)
+        for i in xrange(np):
+            vtk_ar.SetValue(i, s_ar[i])
+
+        vtk_ar.SetName(scalar_name)
+        ds.vtkInstance.GetPointData().AddArray(vtk_ar)
+#        ds.vtkinstance.GetPointData().SetActiveScalars(scalar_name)
+        ds.vtkInstance.GetPointData().SetScalars(vtk_ar)
+        self.setResult("Output", ds)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "Array", (NDArray, 'Scalar Array'))
+        reg.add_input_port(cls, "VTK Data", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkDataSet').module))
+        reg.add_input_port(cls, "Scalar Name", (basic.String, 'Scalar Name'), True)
+        reg.add_output_port(cls, "Output", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkDataSet').module))
+
+class VTKDataSetToPointArray(ArrayUtilModule, Module):
+    """
+    Extract points and scalar values from a vtkDataSet.  The
+    output will be of the form [[x,y,z,v]] with the v component
+    optionally added if the IncludeScalars flag is set.
+    """
+    def compute(self):
+        data = self.getInputFromPort("vtkDataSet").vtkInstance
+        flag = self.forceGetInputFromPort("IncludeScalars")
+
+        np = data.GetNumberOfPoints()
+        ndim = 3
+        if flag:
+            ndim = 4
+
+        out_ar = numpy.ones((np, ndim))
+        for i in xrange(np):
+            (out_ar[i,0], out_ar[i,1], out_ar[i,2]) = data.GetPoint(i)
+            if flag:
+                out_ar[i,3] = data.GetPointData().GetArray(0).GetTuple1(i)
+
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+
+    @classmethod
+    def register_ports(cls, reg, basic):
+        reg.add_input_port(cls, "vtkDataSet", (reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkDataSet').module))
+        reg.add_input_port(cls, "IncludeScalars", (basic.Boolean, 'Include Scalars in Output'), True)
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Array'))
+
+        
+            
+        
diff --git a/contrib/NumSciPy/DSP.py b/contrib/NumSciPy/DSP.py
new file mode 100644
index 0000000..15b4dcb
--- /dev/null
+++ b/contrib/NumSciPy/DSP.py
@@ -0,0 +1,369 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from Matrix import *
+from Array import *
+import scipy
+import scipy.signal
+from scipy import fftpack
+import numpy
+
+class DSPModule(object):
+    my_namespace = 'scipy|signals'
+
+class SignalGenerator(DSPModule, Module):
+    my_namespace = 'scipy|signals|generator'
+
+    def compute(self):
+        samples = self.getInputFromPort("Samples")
+        periods = self.getInputFromPort("Periods")
+        freqs = self.getInputListFromPort("Frequencies")
+
+        ar = numpy.linspace(0., float(periods) * 2. * scipy.pi, periods * samples)
+        out_ar = numpy.zeros(periods * samples)
+
+        for f in freqs:
+            out_ar += scipy.sin(f * ar)
+
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Samples", (basic.Integer, "Sampling Rate"))
+        reg.add_input_port(cls, "Periods", (basic.Integer, "Signal Length"))
+        reg.add_input_port(cls, "Frequencies", (basic.Float, "Additive Frequency"))
+        reg.add_output_port(cls, "Output", (NDArray, "Output Signal"))
+
+class FFT(DSPModule, Module):
+    __doc__ = """ Calculate the discrete Fourier transform of the arbitrary
+    sequence presented on the Signal port.  This is done using
+    SciPy's FFTPack module.\n\n"""
+    __doc__ += """From fftpack.fft:\n\t"""
+    __doc__ += fftpack.fft.__doc__
+
+    my_namespace = 'scipy|signals|fourier'
+    
+    def compute(self):
+        sig_array = self.getInputFromPort("Signals")
+
+        # If there is no input on the samples port,
+        # use the number of samples in an array row for
+        # the number of fft points.
+        if self.hasInputFromPort("Samples"):
+            pts = self.getInputFromPort("Samples")
+            
+        else:
+            try:
+                pts = sig_array.get_shape()[1]
+            except:
+                pts = sig_array.get_shape()[0]
+
+        sh = sig_array.get_shape()
+        if len(sh) < 2:
+            shp = (1, sh[0])
+            sig_array.reshape(shp)
+
+        (num_sigs, num_samps) = sig_array.get_shape()
+        phasors = fftpack.fft(sig_array.get_row_range(0,0), pts)
+        out_ar = phasors
+
+        for i in xrange(1,num_sigs):
+            phasors = fftpack.fft(sig_array.get_row_range(i,i), pts)
+            out_ar = numpy.vstack([out_ar, phasors])
+        
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("FFT Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Signal Array'))
+        reg.add_input_port(cls, "Samples", (basic.Integer, 'FFT Samples'))
+        reg.add_output_port(cls, "FFT Output", (NDArray, 'FFT Output'))
+
+class FFTN(DSPModule, Module):
+    __doc__ = """ Calculate the discrete Fourier transform of the arbitrary
+    sequence presented on the Signal port.  This is done using
+    SciPy's FFTPack module.\n\n"""
+    __doc__ += """From fftpack.fftn:\n\t"""
+    __doc__ += fftpack.fftn.__doc__
+    
+    my_namespace = 'scipy|signals|fourier'
+
+    def compute(self):
+        sig_array = self.getInputFromPort("Signals")
+        # If there is no input on the samples port,
+        # use the number of samples in an array row for
+        # the number of fft points.
+        if self.hasInputFromPort("Samples"):
+            pts = self.getInputFromPort("Samples")
+            
+        else:
+            pts = sig_array.get_shape()[1]
+
+        sh = (sig_array.get_shape()[0], pts)
+
+        phasors = fftpack.fftn(sig_array.get_array(), shape=sh)
+        out = NDArray()
+        out.set_array(phasors)
+        self.setResult("FFT Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Signal Array'))
+        reg.add_input_port(cls, "Samples", (basic.Integer, 'FFT Samples'))
+        reg.add_output_port(cls, "FFT Output", (NDArray, 'FFT Output'))
+
+class ShortTimeFourierTransform(DSPModule, Module):
+    """ Calculate the short time Fourier transform of the
+    sequence presented on the Signal port.  This is done using
+    SciPy's FFTPack fft module in conjuction with an input window.
+    If a window is not specified, a Hamming window of the specified
+    size is used. """
+    my_namespace = 'scipy|signals|fourier'
+
+    def get_signal(self, sigs, window, offset, size):
+        win = scipy.zeros(sigs.shape[0])
+        win[offset:offset+size] = window
+        part = sigs * win
+        return part
+
+    def compute(self):
+        sigs = self.getInputFromPort("Signals")
+        sr = self.getInputFromPort("SamplingRate")
+
+        out_vol = None
+
+        if self.hasInputFromPort("Window"):
+            window = self.getInputFromPort("Window").get_array()
+            win_size = window.shape[0]
+        else:
+            win_size = self.getInputFromPort("Window Size")
+            window = scipy.signal.hamming(win_size)
+
+        if self.hasInputFromPort("Stride"):
+            stride = self.getInputFromPort("Stride")
+        else:
+            stride = int(win_size / 2)
+
+        sh = sigs.get_shape()
+        if len(sh) < 2:
+            shp = (1, sh[0])
+            sigs.reshape(shp)
+        (num_sigs, num_samps) = sigs.get_shape()
+
+        for i in xrange(num_sigs):
+            offset = 0
+            signal = sigs.get_array()[i]
+            #  We need to do the first window here so that we
+            #  can have something to call vstack on.
+            sig = self.get_signal(signal, window, offset, win_size)
+            im_array = fftpack.fft(sig)
+            offset += stride
+            while 1:
+                try:
+                    sig = self.get_signal(signal, window, offset, win_size)
+                    phasors = fftpack.fft(sig)
+                    offset += stride
+                    im_array = numpy.vstack([im_array, phasors.ravel()])
+                except:
+                    break
+
+            #  STFT of one signal is done.  Clean up the output
+            (slices, freqs) = im_array.shape
+            ar = im_array[0:,0:sr*2]
+            ar = ar[0:,::-1]
+            if out_vol == None:
+                out_vol = ar
+                ovshape = out_vol.shape
+                out_vol.shape = 1, ovshape[0], ovshape[1]
+            else:
+                arshape = ar.shape
+                ar.shape = 1, arshape[0], arshape[1]
+                out_vol = numpy.vstack([out_vol, ar])
+
+        # All signals have been processed and are in the volume.
+        out = NDArray()
+        out.set_array(out_vol)
+        self.setResult("FFT Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Signal Array'))
+        reg.add_input_port(cls, "SamplingRate", (basic.Integer, 'Sampling Rate'))
+        reg.add_input_port(cls, "Window", (NDArray, 'Windowing Function'))
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_input_port(cls, "Stride", (basic.Integer, 'Stride'))
+        reg.add_output_port(cls, "FFT Output", (NDArray, 'FFT Output'))
+
+class SignalSmoothing(DSPModule, Module):
+    """
+    Documentation
+    """
+    def compute(self):
+        window = self.getInputFromPort("Window").get_array()
+        in_signal = self.getInputFromPort("Signal").get_array()
+
+        to_conv = window/window.sum() # Make sure the window is normalized
+        if in_signal.ndim > 1:
+            out_ar = numpy.zeros(in_signal.shape)
+        else:
+            out_ar = numpy.zeros(1,in_signal.shape[0])
+            in_signal.shape = (1, in_signal.shape[0])
+
+        for row in xrange(in_signal.shape[0]):
+            out_ar[row] = numpy.convolve(to_conv, in_signal[row], mode='same')
+
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output Array", out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signal", (NDArray, "Input Signals"))
+        reg.add_input_port(cls, "Window", (NDArray, "Smoothing Filter"))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Smoothed Signals'))
+        
+# class SingleTrialPhaseLocking(DSPModule, Module):
+#     """
+#     Documentation
+#     """
+#     def get_time_indexes(self, t0, time_window):
+#         if time_window % 2:
+#             # odd number of samples:  t0 +/- (window-1)/2
+#             tw = (time_window - 1) / 2
+#         else:
+#             tw = time_window / 2
+#         return (t0 - tw, t0 + tw)
+    
+#     def calc_pli(self, f_n_ar, f_m_ar):
+#         phasors = numpy.concatenate((f_n_ar, f_m_ar))
+#         norm_c = numpy.sqrt(phasors.real*phasors.real + phasors.imag*phasors.imag)
+#         phasors /= norm_c
+#         mean_phasor = phasors.mean()
+#         pli = numpy.sqrt(mean_phasor.real*mean_phasor.real + mean_phasor.imag*mean_phasor.imag)
+#         return pli
+    
+#     def compute(self):
+#         phasors = self.getInputFromPort("Phasor Array").get_array()
+#         time_window = self.getInputFromPort("Time Window")
+#         time_step = self.forceGetInputFromPort("Time Step")
+#         if time_step == None:
+#             time_step = 1
+            
+#         ndims = phasors.ndim
+#         if ndims == 2:
+#             phasors.shape = (1, phasors.shape[0], phasors.shape[1])
+#         elif ndims == 1:
+#             phasors.shape = (1, phasors.shape[0], 1)
+#         else:
+#             raise ModuleError("Cannot Process Phasor set of dimension " + str(ndims))
+        
+#         num_freqs = phasors[0].shape[0]
+#         num_times = phasors[0].shape[1]
+#         num_times /= time_step
+#         out_ar = numpy.zeros((phasors.shape[0], num_freqs, num_freqs, num_times))
+#         for channel in xrange(phasors.shape[0]):
+#             tfr = phasors[channel,:,:].squeeze()
+#             for f_m in xrange(tfr.shape[0]):
+#                 f_m_row = tfr[f_m,:]
+#                 for f_n in xrange(f_m+1, tfr.shape[0], 1):
+#                     f_n_row = tfr[f_n,:]
+#                     t0 = 0
+#                     tn = 0
+#                     (start_i, end_i) = self.get_time_indexes(t0, time_window)
+#                     while t0 < f_m_row.shape[0]:
+#                         f_m_range = f_m_row[max(0,start_i):min(end_i,f_m_row.shape[0]-1)]
+#                         f_n_range = f_n_row[max(0,start_i):min(end_i,f_n_row.shape[0]-1)]
+#                         pli = self.calc_pli(f_m_range, f_n_range)
+#                         out_ar[channel, f_m, f_n, tn] = pli
+#                         out_ar[channel, f_n, f_m, tn] = pli
+#                         out_ar[channel, f_m, f_m, tn] = 1.0
+#                         tn += 1
+#                         t0 += time_step
+#                         start_i += time_step
+#                         end_i += time_step
+
+#         out = NDArray()
+#         out.set_array(out_ar)
+#         self.setResult("Output Array", out)
+
+#     @classmethod
+#     def register(cls, reg, basic):
+#         reg.add_module(cls, namespace=cls.my_namespace)
+#         reg.add_input_port(cls, "Phasor Array", (NDArray, 'Phasor Array'))
+#         reg.add_input_port(cls, "Time Step", (basic.Integer, 'Stride in the Time Domain'))
+#         reg.add_input_port(cls, "Time Window", (basic.Integer, 'Samples per Timeslice'))
+#         reg.add_output_port(cls, "Output Array", (NDArray, 'Result set'))
+
+# class CalculatePhaseLocking(DSPModule, Module):
+#     """
+#     documentation
+#     """
+#     def Phi(self, p):
+#         return scipy.arctan2(p.real, p.imag)
+    
+#     def compute(self):
+#         phasors = self.getInputFromPort("Phasor Array").get_array()
+#         if phasors.ndim != 3:
+#             raise ModuleError("Cannot handle phasor array with less than 3 dimensions")
+
+#         (trials, times, frequencies) = phasors.shape
+#         lowestF = self.getInputFromPort("Lowest Freq")
+# #        highestF = self.getInputFromPort("Highest Freq")
+        
+#         Phi = self.Phi(phasors)
+
+#         gamma_ar = numpy.zeros((times, frequencies, frequencies))
+        
+#         for t in range(times):
+#             n = lowestF
+#             for fn_i in range(frequencies):
+#                 n += fn_i
+#                 fn = fn_i + lowestF
+#                 m = lowestF
+#                 for fm_i in range(fn_i, frequencies, 1):
+#                     m += fm_i
+#                     fm = fm_i + lowestF
+#                     DeltaPhi = (float((n+m)/(2*m))Phi[:,t,fm_i] - float((n+m)/(2*n))Phi[:,t,fn_i]) % (2. * scipy.pi)
+#                     Gamma = exp(complex(0.,DeltaPhi))
+#                     Gamma = Gamma.sum()
+#                     Gamma = numpy.sqrt(Gamma * Gamma.conjugate())
+#                     gamma_ar[t, fn_i, fm_i] = Gamma
+#                     gamma_ar[t, fm_i, fn_i] = Gamma
+#                     m += 1
+#                 n += 1
+
+#         out = NDArray()
+#         out.set_array(gamma_ar)
+#         self.setResults("Gamma", out)
+
+#     @classmethod
+#     def register(cls, reg, basic):
+#         reg.add_module(cls, namespace=cls.my_namespace)
+#         reg.add_input_port(cls, "Phasor Array", (NDArray, 'Phasor Array'))
+#         reg.add_input_port(cls, "Lowest Freq", (basic.Integer, 'Lowest Frequency Phasor'))
+#         reg.add_output_port(cls, "Gamma", (NDArray, 'Phase Locking Volume'))
+        
+
+# class DifferentialPhaseLocking(DSPModule, Module):
+#     """
+#     documentation
+#     """
+#     def compute(self):
+#         phasors = self.getInputFromPort("Phasor Array").get_array()
+#         if phasors.ndim != 2:
+#             raise ModuleError("Cannot handle phasor array with more than 2 dimensions")
+
+#         mag = phasors.real*phasors.real + phasors.imag*phasors.imag
+#         mag = numpy.sqrt(mag)
+#         normalized = phasors / mag
+
+        
diff --git a/contrib/NumSciPy/EnsembleOrdering.py b/contrib/NumSciPy/EnsembleOrdering.py
new file mode 100644
index 0000000..0b46b5a
--- /dev/null
+++ b/contrib/NumSciPy/EnsembleOrdering.py
@@ -0,0 +1,297 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from Array import *
+import copy
+import scipy
+import numpy
+from scipy import fftpack
+import time
+
+class EnsembleModule(object):
+    my_namespace = 'scipy|signals|ensembles'
+
+class ComputeDistance(EnsembleModule, Module):
+    def compute(self):
+        vol = self.getInputFromPort("Signals").get_array()
+        num_im = vol.shape[0]
+
+        out_ar = numpy.zeros((num_im, num_im))
+        for i in range(num_im):
+            im_i = vol[i].squeeze().flatten()
+            for j in range(i+1, num_im, 1):
+                im_j = vol[j].squeeze().flatten()
+
+                d = (im_i - im_j)
+                d = d * d
+                d = numpy.sqrt(d.sum())
+
+                out_ar[i,j] = d
+                out_ar[j,i] = d
+
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Signal Planes'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Distance Matrix'))
+
+class OrderByIndexes(EnsembleModule, Module):
+    """ Order the inputs using an array containing the
+    indexes they should appear in """
+    def compute(self):
+        vol = self.getInputFromPort("Signals")
+        inds = self.getInputFromPort("Indexes")
+
+        sh = vol.get_shape()
+        vol = vol.get_array()
+        inds = inds.get_array()
+        out_ar = [vol[inds[0]]]
+        for i in xrange(sh[0] - 1):
+            i += 1
+            try:
+                out_ar = numpy.vstack((out_ar, [vol[inds[i]]]))
+            except:
+                pass
+
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Signal Set'))
+        reg.add_input_port(cls, "Indexes", (NDArray, 'Sorted Index Set'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Sorted Signal Set'))
+
+class OrderByCorrelation(EnsembleModule, Module):
+    """ Order the inputs using the correlations between a given
+    input index and all other slices in the volume """
+    def append_slice(self, vol, sl):
+        vol = numpy.vstack((vol, [sl]))
+        return vol
+
+    def append_cor(self, cor, sl_cor):
+        cor.append(sl_cor)
+        return cor
+    
+    def prepend_slice(self, vol, sl):
+        vol = numpy.vstack(([sl], vol))
+        return vol
+
+    def prepend_cor(self, cor, sl_cor):
+        cor.insert(0, sl_cor)
+        return cor
+    
+    def find_max(self, a):
+        f = a.max()
+        sh = a.shape
+        b = a.flatten()
+        ind = b.argmax()
+        row = int(ind/sh[1])
+        col = ind - row * sh[1]
+        return (row, col, f)
+        
+    def compute(self):
+        ts = time.time()
+        vol = self.getInputFromPort("Signals")
+        ind = self.getInputFromPort("Key Slice")
+        if self.hasInputFromPort("Normalize"):
+            self.normalize = self.getInputFromPort("Normalize")
+        else:
+            self.normalize = False
+
+        vol_ar = vol.get_array()
+        if self.normalize:
+            for i in range(vol_ar.shape[0]):
+                sl = vol_ar[i]
+                sl = sl - sl.min()
+                sl = sl / sl.max()
+                vol_ar[i] = sl
+
+        pos = self.forceGetInputFromPort("Key Position")
+            
+        key_slice = vol_ar[ind]
+        (r,c) = key_slice.shape
+        key_fft = fftpack.fftn(key_slice)
+        key_sq = key_slice * key_slice
+        norm = key_sq.sum()
+        norm = numpy.sqrt(norm)
+
+        num_slices = vol.get_shape()[0]
+        num_elements = key_slice.size
+        cor = []
+        for i in xrange(num_slices):
+            cur_slice = vol_ar[i]
+            cur_sq = cur_slice * cur_slice
+            cur_norm = cur_sq.sum()
+            cur_norm = numpy.sqrt(cur_norm)
+            
+            cur_fft = fftpack.fftn(cur_slice)
+            cur_fft = cur_fft.conjugate()
+
+            cur_max = cur_slice.max()
+            prod_slice = key_fft * cur_fft
+            prod_slice = prod_slice / (norm * cur_norm)
+            cor_slice = fftpack.ifftn(prod_slice)
+
+            (row,col,val) = self.find_max(cor_slice.real)
+
+            cor.append((val,i,row,col))
+
+        cor.sort(lambda x,y:cmp(y[0],x[0]))
+        vol = [key_slice]
+        key_slice_out = key_slice
+        out_cor_ar = []
+        if pos == None:
+            app = True
+            for i in range(len(cor)):
+                sl_cor = cor[i]
+                if sl_cor[1] == ind:
+                    continue
+                sl = vol_ar[sl_cor[1]]
+                if app:
+                    vol = self.append_slice(vol, sl)
+                    out_cor_ar = self.append_cor(out_cor_ar, cor[i][0])
+                else:
+                    vol = self.prepend_slice(vol, sl)
+                    out_cor_ar = self.prepend_cor(out_cor_ar, cor[i][0])
+                
+                app = (app != True)
+        else:
+            for i in range(len(cor)):
+                sl_cor = cor[i]
+                sl = vol_ar[sl_cor[1]]
+                vol = self.append_slice(vol, sl)
+                out_cor_ar = self.append_cor(out_cor_ar, cor[i][0])
+
+        elapsed = time.time() - ts
+#        elapsed *= 1000000.
+        print "took: ", elapsed
+        out_vol = NDArray()
+
+        out_vol.set_array(vol/vol.max())
+        out_cor = NDArray()
+        out_cor_ar = numpy.array(out_cor_ar)
+        out_cor.set_array(out_cor_ar / out_cor_ar.max())
+
+        out_key = NDArray()
+        out_key.set_array(key_slice_out)
+        self.setResult("Output Key Slice", out_key)
+        self.setResult("Output Volume", out_vol)
+        self.setResult("Output Correlation", out_cor)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Signal Volume'))
+        reg.add_input_port(cls, "Key Slice", (basic.Integer, 'Key Slice Index'))
+        reg.add_input_port(cls, "Normalize", (basic.Boolean, 'Normalize Slice Power'))
+        reg.add_input_port(cls, "Key Position", (basic.Integer, 'Key Slice Position'))
+        reg.add_output_port(cls, "Output Volume", (NDArray, 'Sorted Signal Volume'))
+        reg.add_output_port(cls, "Output Correlation", (NDArray, 'Sorted Correlation Array'))
+        reg.add_output_port(cls, "Output Key Slice", (NDArray, 'Key Slice'))
+        
+class OrderByProgressiveCorrelation(EnsembleModule, Module):
+    def find_max(self, a):
+        f = a.max()
+        sh = a.shape
+        b = a.flatten()
+        ind = b.argmax()
+        row = int(ind/sh[1])
+        col = ind - row * sh[1]
+        return (row, col, f)
+        
+    def correlate(self, plane, ref_im):
+        (r,c) = ref_im.shape
+        key_fft = fftpack.fftn(ref_im)
+        key_sq = ref_im * ref_im
+        norm = key_sq.sum()
+        norm = numpy.sqrt(norm)
+
+        cur_slice = plane
+        cur_sq = cur_slice * cur_slice
+        cur_norm = cur_sq.sum()
+        cur_norm = numpy.sqrt(cur_norm)
+        
+        cur_fft = fftpack.fftn(cur_slice)
+        cur_fft = cur_fft.conjugate()
+
+        cur_max = cur_slice.max()
+        prod_slice = key_fft * cur_fft
+        prod_slice = prod_slice / (norm * cur_norm)
+        cor_slice = fftpack.ifftn(prod_slice)
+        
+        (row,col,val) = self.find_max(cor_slice.real)
+
+        return val
+    
+    def compute(self):
+        vol = self.getInputFromPort("Signals").get_array()
+        ind = self.getInputFromPort("Key Slice")
+        normalize = self.forceGetInputFromPort("Normalize")
+
+        if normalize:
+            for i in range(vol.shape[0]):
+                sl = vol[i]
+                sl = sl - sl.min()
+                sl = sl / sl.max()
+                vol[i] = sl
+            
+        tmp_vol = copy.copy(vol)
+
+        key_slice = vol[ind]
+        vol_ind = numpy.arange(vol.shape[0]).tolist()
+
+        out_ar = numpy.zeros(vol.shape)
+        out_ar[0,:,:] = key_slice
+        tmp_vol[ind,:,:] = 0.0
+
+        tmp_size = 1
+        cors_out = [self.correlate(key_slice,key_slice)]
+        print "key cor = ", cors_out[0]
+        while tmp_size < tmp_vol.shape[0]:
+            ts = time.time()
+            cors = []
+            print "output size is currently:  ", tmp_size, 
+            for i in range(tmp_vol.shape[0]):
+                plane = tmp_vol[i]
+                if plane.min() == 0. and plane.max() == 0.:
+                    continue
+
+                cor = self.correlate(plane,out_ar[tmp_size-1,:,:])
+                cors.append((cor,i))
+
+            cors.sort(lambda x,y:cmp(y[0],x[0]))
+            (max_cor,ind) = cors[0]
+            print "\tcor = ", max_cor, ind
+            cors_out.append(max_cor)
+            out_ar[tmp_size,:,:] = vol[ind]
+            tmp_vol[ind,:,:] = 0.
+            tmp_size += 1
+            elapsed = time.time() - ts
+#            elapsed *= 1000000.
+            print "\tCorrelation took: ", elapsed
+
+        cor_ar = numpy.array(cors_out)
+        cor_ar /= cor_ar.max()
+        out = NDArray()
+        out.set_array(out_ar)
+        out_cor = NDArray()
+        out_cor.set_array(cor_ar)
+
+        self.setResult("Output Signals", out)
+        self.setResult("Output Correlations", out_cor)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Time Frequency Planes'))
+        reg.add_input_port(cls, "Key Slice", (basic.Integer, 'Key Slice'))
+        reg.add_input_port(cls, "Normalize", (basic.Boolean, 'Normalize each plane'), True)
+        reg.add_output_port(cls, "Output Signals", (NDArray, 'Output Time Frequency Planes'))
+        reg.add_output_port(cls, "Output Correlations", (NDArray, 'Output Correlations'))
diff --git a/contrib/NumSciPy/Filters.py b/contrib/NumSciPy/Filters.py
new file mode 100644
index 0000000..11b588b
--- /dev/null
+++ b/contrib/NumSciPy/Filters.py
@@ -0,0 +1,185 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from Array import *
+import scipy
+import scipy.signal
+from scipy import sparse, fftpack
+import numpy
+
+class WindowModule(object):
+    my_namespace = 'scipy|signals|windows'
+
+class HanningWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.hanning(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class TriangularWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.triang(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class BlackmanWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.blackman(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class BlackmanHarrisWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.blackmanharris(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class ParzenWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.parzen(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class HammingWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.hamming(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class KaiserWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        beta = self.getInputFromPort("Beta")
+        out = NDArray()
+        out.set_array(scipy.signal.kaiser(size, beta))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_input_port(cls, "Beta", (basic.Float, 'Beta'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class BartlettHannWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.barthann(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class GaussianWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        sigma = self.getInputFromPort("Sigma")
+        out = NDArray()
+        out.set_array(scipy.signal.gaussian(size, sigma))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_input_port(cls, "Sigma", (basic.Float, 'Sigma'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class BoxcarWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.boxcar(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class BohmanWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.bohman(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class BartlettWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.bartlett(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
+class NuttallBlackmanHarrisWindow(WindowModule, Module):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        out = NDArray()
+        out.set_array(scipy.signal.nuttall(size))
+        self.setResult("Window", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Window Size", (basic.Integer, 'Window Size'))
+        reg.add_output_port(cls, "Window", (NDArray, 'Window Function'))
+
diff --git a/contrib/NumSciPy/Imaging.py b/contrib/NumSciPy/Imaging.py
new file mode 100644
index 0000000..2297e08
--- /dev/null
+++ b/contrib/NumSciPy/Imaging.py
@@ -0,0 +1,193 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import numpy
+import scipy
+import scipy.ndimage
+from Array import *
+from Matrix import *
+
+class ArrayImaging(object):
+    my_namespace = 'numpy|imaging'
+
+class ExtractRGBAChannel(ArrayImaging, Module):
+    """ Extract a single color channel from an array representing an
+    RGBA type image.  This will return a 2D array with the single channel
+    specified as the scalar elements """
+    def compute(self):
+        im = self.getInputFromPort("Image").get_array()
+        chan = self.getInputFromPort("Channel")
+        ar = im[:,:,chan]
+        out = NDArray()
+        out.set_array(ar)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Image", (NDArray, 'Image Array'))
+        reg.add_input_port(cls, "Channel", (basic.Integer, 'Channel'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class GaussianGradientMagnitude(ArrayImaging, Module):
+    """ Calculate the Gradient Magnitude of an input NDArray using gaussian derivatives.
+    The standard-deviation of the Gaussian filter are given for each axis as a sequence
+    or as a single number, in which case the filter will be isotropic. """
+    def compute(self):
+        im = self.getInputFromPort("Image")
+        sigma = self.getInputListFromPort("Sigmas")
+        if len(sigma) <= 1:
+            sigma = sigma[0]
+        der = scipy.ndimage.gaussian_gradient_magnitude(im.get_array(), sigma)
+        out = NDArray()
+        out.set_array(der)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Image", (NDArray, 'Image Array'))
+        reg.add_input_port(cls, "Sigmas", (basic.Float, 'Standard Deviations'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class JointHistogram(ArrayImaging, Module):
+    """ Calculate the Joint Histogram of 2 inputs.  The inputs can be of arbitrary dimension,
+    but must be equivalently sized. """
+    def compute(self):
+        in_x = self.getInputFromPort("Array One").get_array()
+        in_y = self.getInputFromPort("Array Two").get_array()
+        size_x = self.getInputFromPort("Bins X")
+        size_y = self.getInputFromPort("Bins Y")
+
+        take_log = True
+        if self.hasInputFromPort("Log10"):
+            take_log = self.getInputFromPort("Log10")
+
+        out_ar = numpy.zeros((size_x, size_y))
+        min_x = in_x.min()
+        max_x = in_x.max() - min_x
+        min_y = in_y.min()
+        max_y = in_y.max() - min_y
+
+        in_x = in_x.flatten()
+        in_y = in_y.flatten()
+
+        for i in xrange(in_x.size):
+            x_cor = int(((in_x[i] - min_x)/max_x) * (size_x - 1))
+            y_cor = int(((in_y[i] - min_y)/max_y) * (size_y - 1))
+
+            out_ar[x_cor,y_cor] += 1.0
+
+        if take_log:
+            out_ar = out_ar + 1.0
+            out_ar = scipy.log(out_ar)
+        out = NDArray()
+        out_ar = out_ar.transpose()
+        out_ar = out_ar[::-1]
+        out.set_array(out_ar)
+        self.setResult("Joint Histogram", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Array One", (NDArray, 'X Axis Input'))
+        reg.add_input_port(cls, "Array Two", (NDArray, 'Y Axis Input'))
+        reg.add_input_port(cls, "Log10", (basic.Boolean, 'Use Log of Histogram'), True)
+        reg.add_input_port(cls, "Bins X", (basic.Integer, 'Number of X Bins'))
+        reg.add_input_port(cls, "Bins Y", (basic.Integer, 'Number of Y Bins'))
+        reg.add_output_port(cls, "Joint Histogram", (NDArray, 'Joint Histogram'))
+
+class GaussianSmooth(ArrayImaging, Module):
+    """ Smooth the Input array with a multi-dimensional gaussian kernel.
+    The standard-deviation of the Gaussian filter are given for each axis as a sequence
+    or as a single number, in which case the filter will be isotropic. """
+    def compute(self):
+        im = self.getInputFromPort("Input Array")
+        sigma = self.getInputListFromPort("Sigmas")
+        if len(sigma) <= 1:
+            sigma = sigma[0]
+        der = scipy.ndimage.gaussian_filter(im.get_array(), sigma)
+        out = NDArray()
+        out.set_array(der)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Image Array'))
+        reg.add_input_port(cls, "Sigmas", (basic.Float, 'Standard Deviations'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+        
+class MedianFilter(ArrayImaging, Module):
+    """ Smooth the Input array with a multi-dimensional median filter.  """
+    def compute(self):
+        im = self.getInputFromPort("Input Array")
+        k_size = self.getInputFromPort("Size")
+        der = scipy.ndimage.median_filter(im.get_array(), size=k_size)
+        out = NDArray()
+        out.set_array(der)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Array", (NDArray, 'Image Array'))
+        reg.add_input_port(cls, "Size", (basic.Integer, 'Kernel Size'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
+
+class ImageDifference(ArrayImaging, Module):
+    """ Calculate the difference between two input images. """
+    def compute(self):
+        im = self.getInputFromPort("Input 1")
+        im2 = self.getInputFromPort("Input 2")
+
+        da_ar = im.get_array() - im2.get_array()
+        da_ar = numpy.abs(da_ar)
+
+        out = NDArray()
+        out.set_array(da_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input 1", (NDArray, 'Image Array'))
+        reg.add_input_port(cls, "Input 2", (NDArray, 'Image Array'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Array'))
+
+class ImageNormalize(ArrayImaging, Module):
+    """ Move the range of the image to [0,1] """
+    def compute(self):
+        im = self.getInputFromPort("Input")
+        im_max = im.get_array().max()
+        im_ar = im.get_array() / im_max
+
+        out = NDArray()
+        out.set_array(im_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Image Array'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Array'))
+
+class SobelGradientMagnitude(ArrayImaging, Module):
+    """ Use n-dimensional sobel kernels to compute the gradient magnitude
+    of an image """
+    def compute(self):
+        im = self.getInputFromPort("Input").get_array()
+        mag = numpy.zeros(im.shape)
+        for i in xrange(im.ndim):
+            kern = scipy.ndimage.sobel(im, axis=i)
+            mag += kern*kern
+
+        out = NDArray()
+        out.set_array(numpy.sqrt(mag))
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Image Array'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Array'))
diff --git a/contrib/NumSciPy/Matrix.py b/contrib/NumSciPy/Matrix.py
new file mode 100644
index 0000000..013d687
--- /dev/null
+++ b/contrib/NumSciPy/Matrix.py
@@ -0,0 +1,107 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+import scipy
+import numpy
+from scipy import sparse
+
+from Array import *
+
+class MatrixModule(object):
+    my_namespace = 'scipy|matrix'
+
+class MatrixOp(object):
+    my_namespace = 'scipy|matrix|operation'
+
+class Matrix(MatrixModule, Module):
+    """ Container class for the scipy.sparse.csc_matrix class """
+    def __init__(self):
+        Module.__init__(self)
+        self.matrix = None
+
+    def get_shape(self):
+        return self.matrix.shape
+
+    def get_conjugate(self):
+        return self.matrix.conjugate()
+
+    def get_column(self, colId):
+        return self.matrix.getcol(colId)
+
+    def get_row(self, rowId):
+        return self.matrix.getrow(rowId)
+
+    def set_diagonal(self, vals):
+        self.matrix.setdiag(vals)
+
+    def toarray(self):
+        return self.matrix.toarray()
+
+    def transpose(self):
+        return self.matrix.transpose()
+
+    def get_num_elements(self):
+        return self.matrix.getnnz()
+
+    def get_max_elements(self):
+        return self.matrix.nzmax
+
+    def get_reals(self):
+        return self.matrix._real()
+
+    def get_imaginaries(self):
+        return self.matrix._imag()
+
+    def get_matrix(self):
+        return self.matrix
+
+    def set_matrix(self, mat):
+        self.matrix = mat
+
+class MatrixMultiply(MatrixOp, Module):
+    """ Multiply two matrices together """
+    def compute(self):
+        a = self.getInputFromPort("Matrix1")
+        b = self.getInputFromPort("Matrix2")
+        out = Matrix()
+        out.set_matrix(a.get_matrix() * b.get_matrix())
+
+        self.setResult("Matrix Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Matrix1", (Matrix, 'Input Matrix 1'))
+        reg.add_input_port(cls, "Matrix2", (Matrix, 'Input Matrix 2'))
+        reg.add_output_port(cls, "Matrix Output", (Matrix, 'Output Matrix'))
+
+class MatrixConjugate(MatrixOp, Module):
+    """ Get the complex conjugate of the input matrix. """
+    def compute(self):
+        a = self.getInputFromPort("Matrix")
+        b = a.get_conjugate().copy()
+        out = Matrix()
+        out.set_matrix(b)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Matrix", (Matrix, 'Input Matrix'))
+        reg.add_output_port(cls, "Output", (Matrix, 'Output Matrix'))
+
+class MatrixToArray(MatrixOp, Module):
+    """ Convert a SciPy matrix to a Numpy Array """
+    def compute(self):
+        m = self.getInputFromPort("Matrix")
+        a = m.toarray()
+        out = NDArray()
+        out.set_array(a)
+        self.setResult("Output Array", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Matrix", (Matrix, 'Input Matrix'))
+        reg.add_output_port(cls, "Output Array", (NDArray, 'Output Array'))
diff --git a/contrib/NumSciPy/MatrixUtilities.py b/contrib/NumSciPy/MatrixUtilities.py
new file mode 100644
index 0000000..7729d9c
--- /dev/null
+++ b/contrib/NumSciPy/MatrixUtilities.py
@@ -0,0 +1,93 @@
+from core.modules.vistrails_module import Module, ModuleError
+from Matrix import *
+from Array import *
+import scipy
+from scipy import io, sparse
+
+
+class ArrayUtilityModule(object):
+    my_namespace = 'scipy|matrix|utilities|Matlab'
+
+class MatlabReader(ArrayUtilityModule, Module):
+    """ Read a Matlab .mat file into a SciPy matrix """
+    # Gather inputs here
+    def get_inputs(self):
+        if self.hasInputFromPort("Filename"):
+            self.fname = self.getInputFromPort("Filename")
+        else:
+            self.fname = self.getInputFromPort("File").name
+
+    # Set required members externally.  This is just a helper function!
+    def set_member(self, name, val):
+        setattr(self, name, val)
+
+    # This is the work that the compute() method does
+    def process_compute(self):
+        m = io.loadmat(self.fname, None, 0)
+        vals = m.values()
+
+        for t in vals:
+            if type(t) == numpy.ndarray:
+                if t.dtype == 'object':
+                    continue
+                mat = t
+
+        return (mat,)
+
+    # Take the returns from the processing and put them out on the outputs.
+    def set_outputs(self, results):
+        try:
+            out = Matrix()
+            out.set_matrix(sparse.csc_matrix(results[0]))
+            
+            self.setResult("Matrix Output", out)
+        except:
+            pass
+        
+        out_ar = NDArray()
+        out_ar.set_array(numpy.array(results[0]))
+        self.setResult("Array Output", out_ar)
+
+    # The compute method for vistrails compatibility
+    def compute(self):
+        self.get_inputs()            
+        results = self.process_compute()
+        self.set_outputs(results)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "File", (basic.File, 'File'))
+        reg.add_output_port(cls, "Matrix Output", (Matrix, 'Matrix Output'))
+        reg.add_output_port(cls, "Array Output", (NDArray, 'Array Output'))
+    
+class MatlabWriter(ArrayUtilityModule, Module):
+    """ Write a Matlab .mat file from a SciPy matrix """
+    def compute(self):
+        if self.hasInputFromPort("Filename"):
+            fname = self.getInputFromPort("Filename")
+        else:
+            fname = self.getInputFromPort("File").name
+
+        ar_list = self.getInputListFromPort("Arrays")
+        mat_list = self.getInputListFromPort("Matrices")
+        ar_dict = {}
+        for i in xrange(len(ar_list)):
+            ar_name = "array_" + str(i)
+            ar_dict[ar_name] = ar_list[i].get_array()
+
+        for i in xrange(len(mat_list)):
+            mat_name = "matrix_" + str(i)
+            ar_dict[mat_name] = mat_list[i].get_matrix()
+
+        io.savemat(fname, ar_dict)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "File", (basic.File, 'File'))
+        reg.add_input_port(cls, "Arrays", (NDArray, 'Arrays to Save'))
+        reg.add_input_port(cls, "Matrices", (Matrix, 'Matrices to Save'))
+            
diff --git a/contrib/NumSciPy/Stockwell.py b/contrib/NumSciPy/Stockwell.py
new file mode 100644
index 0000000..336c735
--- /dev/null
+++ b/contrib/NumSciPy/Stockwell.py
@@ -0,0 +1,763 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from Matrix import *
+from Array import *
+from DSP import DSPModule
+import scipy
+import scipy.signal
+import scipy.fftpack
+import numpy
+import smt
+import st
+import time
+
+class StockwellModule(object):
+    my_namespace = 'scipy|signals|stockwell'
+#    my_namespace = 'scipy|signals'
+
+class IsotropicScaleVolumes(StockwellModule, Module):
+    def compute(self):
+        vol = self.getInputFromPort("Input").get_array()
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("Hi Freq")
+        max_vol = numpy.zeros(vol.shape)
+        grav_vol = numpy.zeros(vol.shape)
+
+        (slices,rows,cols) = vol.shape
+        for z in range(slices):
+            tr = time.time()
+            for y in range(rows):
+                ray = vol[z,y,:].squeeze()
+                t = st.st(ray, lof, hif)
+                for x in range(cols):
+                    scales = t[:,x].squeeze()
+                    scales = scales * scales.conjugate()
+
+                    max_vol[x,y,z] = float(scales.argmax())
+
+                    grav = 0.
+                    for i in range(scales.shape[0]):
+                        v = scales[i]
+                        f = lof + i
+                        grav += float(v) * float(f)
+
+                    grav_vol[x,y,z] = grav
+            
+            print "done z = ", z
+            print "took: ", (time.time() - tr) * 1000.
+
+        grav_vol = grav_vol - grav_vol.min()
+        grav_vol = grav_vol / grav_vol.max()
+        grav_vol = grav_vol * float(hif - lof)
+        grav_vol = grav_vol + lof
+        max_out = NDArray()
+        max_out.set_array(max_vol)
+        grav_out = NDArray()
+        grav_out.set_array(grav_vol)
+        self.setResult("Max Output", max_out)
+        self.setResult("Grav Output", grav_out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, "Input Signals"))
+        reg.add_input_port(cls, "Low Freq", (basic.Float, "Low Frequency"))
+        reg.add_input_port(cls, "Hi Freq", (basic.Float, "High Frequency"))
+        reg.add_output_port(cls, "Max Output", (NDArray, "Output Max TFR"))
+        reg.add_output_port(cls, "Grav Output", (NDArray, "Output Grav TFR"))
+
+
+class ScaleVolumes(StockwellModule, Module):
+    def compute(self):
+        vol = self.getInputFromPort("Input").get_array()
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("Hi Freq")
+        sigma = self.forceGetInputFromPort("Sigma")
+        max_vol = numpy.zeros(vol.shape)
+        grav_vol = numpy.zeros(vol.shape)
+
+        (slices,rows,cols) = vol.shape
+        for z in range(slices):
+            t = time.time()
+            for y in range(rows):
+                for x in range(cols):
+                    # grab our 3 rays
+                    xray = vol[z,y,:].squeeze()
+                    yray = vol[z,:,x].squeeze()
+                    zray = vol[:,y,x].squeeze()
+                    
+                    # Transform each ray
+                    xt = st.st(xray,lof,hif)
+                    yt = st.st(yray,lof,hif)
+                    zt = st.st(zray,lof,hif)
+
+                    # Grab the point at all valid scales
+                    xpt = xt[:,x]
+                    ypt = yt[:,y]
+                    zpt = zt[:,z]
+
+                    # Take the magnitude
+                    xpt = xpt * xpt.conjugate()
+                    ypt = ypt * ypt.conjugate()
+                    zpt = zpt * zpt.conjugate()
+
+                    scale_vec = xpt.real + ypt.real + zpt.real
+                    if sigma:
+                        scale_vec = scale_vec * scipy.signal.gaussian(scale_vec.shape[0], sigma)
+
+                    scale = scale_vec.argmax()
+                    max_vol[x,y,z] = scale
+
+#                    scale_vec = 
+#                    scale_vec = scale_vec / scale_vec.sum()
+
+
+                    grav = 0
+                    for s in range(scale_vec.shape[0]):
+                        v = scale_vec[s]
+                        f = lof + s
+                        grav += float(f) * float(v)
+
+#                    grav = grav / float(scale_vec.shape[0])
+                    
+                    grav_vol[x,y,z] = grav
+                    
+            print "done z = ", z
+            print "took: ", (time.time() - t) * 1000.
+
+        grav_vol = grav_vol - grav_vol.min()
+        grav_vol = grav_vol / grav_vol.max()
+        grav_vol = grav_vol * float(hif - lof)
+        grav_vol = grav_vol + lof
+        max_out = NDArray()
+        max_out.set_array(max_vol)
+        grav_out = NDArray()
+        grav_out.set_array(grav_vol)
+        self.setResult("Max Output", max_out)
+        self.setResult("Grav Output", grav_out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, "Input Signals"))
+        reg.add_input_port(cls, "Low Freq", (basic.Float, "Low Frequency"))
+        reg.add_input_port(cls, "Hi Freq", (basic.Float, "High Frequency"))
+        reg.add_input_port(cls, "Sigma", (basic.Float, "Sigma"))
+        reg.add_output_port(cls, "Max Output", (NDArray, "Output Max TFR"))
+        reg.add_output_port(cls, "Grav Output", (NDArray, "Output Grav TFR"))
+
+
+class MaximalScaleVolume(StockwellModule, Module):
+    def compute(self):
+        vol = self.getInputFromPort("Input").get_array()
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("Hi Freq")
+        sigma = self.forceGetInputFromPort("Sigma")
+        out_vol = numpy.zeros(vol.shape)
+
+        (slices,rows,cols) = vol.shape
+        for z in range(slices):
+            t = time.time()
+            for y in range(rows):
+                for x in range(cols):
+                    # grab our 3 rays
+                    xray = vol[z,y,:].squeeze()
+                    yray = vol[z,:,x].squeeze()
+                    zray = vol[:,y,x].squeeze()
+                    
+                    # Transform each ray
+                    xt = st.st(xray,lof,hif)
+                    yt = st.st(yray,lof,hif)
+                    zt = st.st(zray,lof,hif)
+
+                    # Grab the point at all valid scales
+                    xpt = xt[:,x]
+                    ypt = yt[:,y]
+                    zpt = zt[:,z]
+
+                    # Take the magnitude
+                    xpt = xpt * xpt.conjugate()
+                    ypt = ypt * ypt.conjugate()
+                    zpt = zpt * zpt.conjugate()
+
+                    scale_vec = xpt.real + ypt.real + zpt.real
+                    if sigma:
+                        scale_vec = scale_vec * scipy.signal.gaussian(scale_vec.shape[0], sigma)
+
+                    scale = scale_vec.argmax()
+                    out_vol[x,y,z] = scale
+            print "done z = ", z
+            print "took: ", (time.time() - t) * 1000.
+
+        out = NDArray()
+        out.set_array(out_vol)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, "Input Signals"))
+        reg.add_input_port(cls, "Low Freq", (basic.Float, "Low Frequency"))
+        reg.add_input_port(cls, "Hi Freq", (basic.Float, "High Frequency"))
+        reg.add_input_port(cls, "Sigma", (basic.Float, "Sigma"))
+        reg.add_output_port(cls, "Output", (NDArray, "Output TFR"))
+        
+
+class StockwellTransform(StockwellModule, Module):
+    def compute(self):
+        t = time.time()
+        signals = self.getInputFromPort("Signals").get_array()
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("Hi Freq")
+        if len(signals.shape) == 1:
+            signals.shape = (1, signals.shape[0])
+
+        outl = []
+        for i in xrange(signals.shape[0]):
+            sig_ar = signals[i]
+            x = st.st(sig_ar, lof, hif)
+            outl.append(x)
+
+        out_ar = numpy.array(outl).squeeze()
+        print "c time = ", (time.time() - t) * 1000.
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, "Input Signals"))
+        reg.add_input_port(cls, "Low Freq", (basic.Float, "Low Frequency"))
+        reg.add_input_port(cls, "Hi Freq", (basic.Float, "High Frequency"))
+        reg.add_output_port(cls, "Output", (NDArray, "Output TFR"))
+
+class PyStockwellTransform(StockwellModule, Module):
+
+    def get_gaussian(self, length, freq, factor=1.0):
+        g = numpy.arange(float(length))
+        g = g*g
+        g = scipy.exp(-2. * scipy.pi * scipy.pi * g / (float(freq)*float(freq)))
+        return g
+#       return numpy.roll(g, length/2)#.astype(complex)
+    
+    def compute(self):
+        t = time.time()
+        signal = self.getInputFromPort("Signal").get_array().squeeze()
+        print "signal.shape = ", signal.shape
+        f = scipy.fftpack.fft(signal)
+        print "got f made"
+        f = scipy.fftpack.hilbert(f)
+        print "got hilbert done"
+#        f2 = numpy.concatenate((f,f))
+
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("Hi Freq")
+
+        out_ar = numpy.zeros((hif-lof+1, signal.shape[0]))
+
+        start = 0
+        if lof == 0:
+            out_ar[0,:] = signal.mean()
+            start = 1
+
+        for k in range(start, hif-lof, 1):
+            g = self.get_gaussian(signal.shape[0], lof+k)
+            o = scipy.fftpack.ifft(numpy.roll(f,lof+k) * g) / float(signal.size)
+            out_ar[k,:] = o
+
+        print "time = ", (time.time() - t) * 1000.
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+        
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signal", (NDArray, "Input Signal"))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, "Low Frequency"))
+        reg.add_input_port(cls, "Hi Freq", (basic.Integer, "High Frequency"))
+        reg.add_output_port(cls, "Output", (NDArray, "Output TFR"))
+        
+class MultiTaperStockwellTransform(StockwellModule, Module):
+    def compute(self):
+        signals = self.getInputFromPort("Signals").get_array()
+        sr = self.getInputFromPort("Sample Rate")
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("Hi Freq")
+
+        if len(signals.shape) == 1:
+            signals.shape = (1, signals.shape[0])
+
+        if self.hasInputFromPort("Bandwidth"):
+            self.k = smt.calcK(self.getInputFromPort("Bandwidth"),signals.shape[1], sr)
+        else:
+            self.k = self.getInputFromPort("K")
+
+        outl = []
+        for i in xrange(signals.shape[0]):
+            sig_ar = signals[i]
+            x = smt.mtst(self.k, smt.calc_tapers(self.k, signals.shape[1]), sig_ar, lof, hif)
+            outl.append(x)
+
+        out_ar = numpy.array(outl).squeeze()
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Signals", (NDArray, 'Input Signal Array'))
+        reg.add_input_port(cls, "Sample Rate", (basic.Integer, 'Sample Rate'))
+        reg.add_input_port(cls, "K", (basic.Float, "K"))
+        reg.add_input_port(cls, "Bandwidth", (basic.Float, "Bandwidth"))
+        reg.add_input_port(cls, "Low Freq", (basic.Float, "Low Frequency"))
+        reg.add_input_port(cls, "Hi Freq", (basic.Float, "High Frequency"))
+        reg.add_output_port(cls, "Output", (NDArray, "Output TFR"))
+
+class FastStockwell3D(StockwellModule, Module):
+    """
+    Compute an approximation to the 3D Stockwell Transform.
+    The output is a 4D array with dimensions as follows:
+    output.shape = (voices, slices, rows, columns)
+    """
+    def compute(self):
+        in_ar = self.getInputFromPort("Input").get_array()
+        lo_f  = self.getInputFromPort("Low Freq")
+        hi_f  = self.getInputFromPort("High Freq")
+        num_f = hi_f - lo_f + 1
+
+        (slices, rows, cols) = in_ar.shape
+        out_ar = numpy.zeros((num_f, slices, rows, cols))
+        for s in range(slices):
+            for r in range(rows):
+                sig = in_ar[s,r,:]
+                t = st.st(sig,lo_f,hi_f)
+                t = t.conjugate() * t
+                t = t.real
+                for f in range(t.shape[0]):
+                    out_ar[f,s,r,:] = t[f,:]
+
+        print "done dim 1"
+        for s in range(slices):
+            for c in range(cols):
+                sig = in_ar[s,:,c]
+                t = st.st(sig,lo_f,hi_f)
+                t = t.conjugate() * t
+                t = t.real
+                for f in range(t.shape[0]):
+                    out_ar[f,s,:,c] += t[f,:]
+
+        print "done dim 2"
+        for r in range(rows):
+            for c in range(cols):
+                sig = in_ar[:,r,c]
+                t = st.st(sig,lo_f,hi_f)
+                t = t.conjugate() * t
+                t = t.real
+                for f in range(t.shape[0]):
+                    out_ar[f,:,r,c] += t[f,:]
+
+        print "done dim 3"
+#        out_ar = out_ar * out_ar.conjugate()
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Input Volume'))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, 'Lowest Voice'))
+        reg.add_input_port(cls, "High Freq", (basic.Integer, 'Highest Voice'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Voice Volume'))
+
+class ScaleSpaceHistogram(StockwellModule, Module):
+    def compute(self):
+        signal = self.getInputFromPort("Input").get_array()
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("High Freq")
+
+        num_pts = signal.size
+        min_s = signal.min()
+        max_s = signal.max()
+        d = max_s - min_s
+        print "Accumulating over " + str(num_pts) + " points"
+        histo = numpy.zeros((512,hif-lof+1))
+        print "Histo: ",histo.shape
+        dist = numpy.zeros(512)
+        for z in range(signal.shape[2]):
+            for y in range(signal.shape[1]):
+                for x in range(signal.shape[0]):
+                    sigx = signal[z,y,:]
+                    sigy = signal[z,:,x]
+                    tx = st.st(sigx, lof, hif)
+                    ty = st.st(sigy, lof, hif)
+                    sigz = signal[:,y,z]
+                    tz = st.st(sigz, lof, hif)
+                    tz = tz[:,x].squeeze()
+                    tz = tz * tz.conjugate()
+                    tx = tx[:,z].squeeze()
+                    ty = ty[:,y].squeeze()
+                    tx = tx * tx.conjugate()
+                    ty = ty * ty.conjugate()
+
+                    ar = tx.real + ty.real + tz.real
+                    ar = ar / ar.sum()
+#                    ar = ar.sum(axis=1)
+#                    print "ar: ", ar.shape
+#                    ar.shape = (ar.shape[0],1)
+                    scalar = signal[z,y,x]
+                    try:
+                        bin = int((scalar - min_s) / d * 511.)
+#                        dist[bin] += 1
+#                        print bin, scalar, ar
+                        sigma = self.forceGetInputFromPort("Sigma")
+                        if sigma:
+                            ar = scipy.signal.gaussian(ar.size, sigma) * ar
+                        histo[bin,:] += ar
+                    except:
+                        print "Cannot assign to bin: " + str(bin) +", scalar: " +str(scalar)
+                        print "location = ", x, y, z
+                        raise ModuleError("Cannot assign to bin: " + str(bin) +", scalar: " +str(scalar))
+                    
+#                print "done with y = ", y
+            print "done with z = ", z
+
+        out = NDArray()
+        out.set_array(histo)# / dist)
+        self.setResult("Output", out)
+                    
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Input Volume'))
+        reg.add_input_port(cls, "Sigma", (basic.Float, 'Sigma'))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, 'Lowest Voice'))
+        reg.add_input_port(cls, "High Freq", (basic.Integer, 'Highest Voice'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Voice Volume'))
+
+class PyScaleSpaceHistogram(StockwellModule, Module):
+    def get_gaussian(self, length, freq, factor=1.0):
+        g = numpy.arange(float(length))
+        g = g*g
+        g = scipy.exp(-2. * scipy.pi * scipy.pi * g / (float(freq)*float(freq)))
+        return g
+
+    def stockwell(self, ray, lof, hif):
+        ret = numpy.zeros((hif-lof,ray.shape[0]))
+#        ray = scipy.fftpack.hilbert(ray)
+#        ray = numpy.concatenate((ray,ray[::-1]))
+        start = 0
+        if lof == 0:
+            ret[0,:] = ray.mean()
+            start = 1
+
+        for k in range(start, hif-lof, 1):
+            g = self.get_gaussian(ray.shape[0], lof+k)
+            o = scipy.fftpack.ifft(numpy.roll(ray,lof+k) * g) / float(ray.size)
+            ret[k,:] = o
+
+        return ret
+    
+    def compute(self):
+        signal = self.getInputFromPort("Input").get_array().squeeze()
+        print "signal.shape = ", signal.shape
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("High Freq")
+
+        num_scalar_bins = self.getInputFromPort("Scalar Bins")
+
+        num_pts = signal.size
+        min_s = signal.min()
+        max_s = signal.max()
+        d = max_s - min_s
+        print "Accumulating over " + str(num_pts) + " points"
+        histo = numpy.zeros((num_scalar_bins,hif-lof))
+
+        f_sig = scipy.fftpack.fftn(signal)
+
+        for z in range(signal.shape[0]):
+            for y in range(signal.shape[1]):
+                for x in range(signal.shape[2]):
+                    yray = f_sig[z,:,x].squeeze()
+                    ty = self.stockwell(yray, lof, hif)
+                    zray = f_sig[:,y,x].squeeze()
+                    tz = self.stockwell(zray, lof, hif)
+                    xray = f_sig[z,y,:].squeeze()
+                    tx = self.stockwell(xray, lof, hif)
+
+                    tx = tx[:,z].squeeze()
+                    ty = ty[:,y].squeeze()
+                    tz = tz[:,x].squeeze()
+
+                    tx = tx * tx.conjugate()
+                    ty = ty * ty.conjugate()
+                    tz = tz * tz.conjugate()
+                    
+                    ar = tx.real + ty.real + tz.real
+                    ar = ar / ar.sum()
+                    
+    
+                    scalar = signal[z,y,x]
+                    try:
+                        bin = int((scalar - min_s) / d * float(num_scalar_bins-1.))
+#                        dist[bin] += 1
+#                        print bin, scalar, ar
+                        sigma = self.forceGetInputFromPort("Sigma")
+                        if sigma:
+                            ar = scipy.signal.gaussian(ar.size, sigma) * ar
+                        histo[bin,:] += ar
+                    except:
+                        print "Cannot assign to bin: " + str(bin) +", scalar: " +str(scalar)
+                        print "location = ", x, y, z
+                        raise ModuleError("Cannot assign to bin: " + str(bin) +", scalar: " +str(scalar))
+                    
+#                print "done with y = ", y
+            print "done with z = ", z
+
+        out = NDArray()
+        out.set_array(histo)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Input Volume'))
+        reg.add_input_port(cls, "Scalar Bins", (basic.Integer, 'Scalar Bins'))
+        reg.add_input_port(cls, "Sigma", (basic.Float, 'Sigma'))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, 'Lowest Voice'))
+        reg.add_input_port(cls, "High Freq", (basic.Integer, 'Highest Voice'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Voice Volume'))
+
+class PointBasedStockwell(StockwellModule, Module):
+    def compute(self):
+        signal = self.getInputFromPort("Input").get_array()
+        ptx = self.getInputFromPort("X")
+        pty = self.getInputFromPort("Y")
+        ptz = self.getInputFromPort("Z")
+
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("High Freq")
+
+        sigx = signal[ptz,pty,:]
+        sigy = signal[ptz,:,ptx]
+        sigz = signal[:,pty,ptx]
+
+        tx = st.st(sigx, lof, hif)
+        ty = st.st(sigy, lof, hif)
+        tz = st.st(sigz, lof, hif)
+
+        tx = tx * tx.conjugate()
+        ty = ty * ty.conjugate()
+        tz = tz * tz.conjugate()
+
+        out_ar = tx.real + ty.real + tz.real
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Input Volume'))
+        reg.add_input_port(cls, "X", (basic.Integer, 'X'))
+        reg.add_input_port(cls, "Y", (basic.Integer, 'Y'))
+        reg.add_input_port(cls, "Z", (basic.Integer, 'Z'))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, 'Lowest Voice'))
+        reg.add_input_port(cls, "High Freq", (basic.Integer, 'Highest Voice'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Voice Volume'))        
+
+class Stockwell2D(StockwellModule, Module):
+    ''' Calculate the 3D Stockwell Transform '''
+    def g_window(self, l, w):
+        if w != 0.0:   
+            sigma = l / (2 * pi * w)
+        else:   
+            print 'w is zero!'
+        g = numpy.zeros(l)
+        iarr = numpy.arange(float(l))
+        ex = (iarr - l / 2) ** 2 / (2 * sigma ** 2)
+        wl = numpy.where(numpy.ravel(ex < 25))[0]
+        g = numpy.where(ex < 25., numpy.exp(-1.*ex), ex)
+#        g = roll(g, -l / 2)
+        return g.astype(complex)
+        
+    def get_gaussian(self, sx, sy, kx, ky, factor=1.0):
+        wrow = factor * (float(sx) / float(kx))
+        wcol = factor * (float(sy) / float(ky))
+        sig_row = 1. / (2. * scipy.pi * wrow)
+        sig_col = 1. / (2. * scipy.pi * wcol)
+        print "sigmas = ", sig_row, sig_col
+
+        grow = scipy.signal.gaussian(sx, sig_row)
+        gcol = scipy.signal.gaussian(sy, sig_col)
+
+        print "gaussians good?"
+        grow.shape = sx,1
+        gcol.shape = 1,sy
+
+        print "gaussians reshaped"
+        gwin = grow*gcol
+        print "2d formed..."
+        gwin = gwin.astype(complex)
+        print "gaussian formed"
+        return gwin
+
+    def compute(self):
+        in_ar = self.getInputFromPort("Input").get_array()
+        lof = self.getInputFromPort("Low Freq")
+        hif = self.getInputFromPort("High Freq")
+        (nx,ny) = in_ar.shape
+        nf = hif-lof
+        kx_len = nf
+        nyquist_x = nx/2 + 1
+        ky_len = nf
+        h = scipy.fftpack.fftn(in_ar)
+        h = scipy.fftpack.fftshift(h)
+        or_spe = h
+
+        print "allocating output", nf,kx_len,ky_len
+        # allocate output
+        try:
+            l = numpy.zeros((nf, nx, ny))
+        except:
+            raise ModuleError("Cannot allocate output array")
+        print "Output Allocated - ", l.shape
+
+        vf = 0
+        for ky in range(lof, hif, 1):
+            print "ky = ", ky
+            for kx in range(lof, hif, 1):
+                print "kx = ", kx
+                if kx >= nyquist_x:
+                    kxwidth = nx - kx
+                else:
+                    kxwidth = kx
+
+                print "kxwidth = ", kxwidth
+                gw = self.get_gaussian(nx,ny,kxwidth,ky)
+                
+                b = h * gw
+                h = numpy.roll(h,-1,axis=0)
+                voice = scipy.fftpack.ifftn(scipy.fftpack.ifftshift(b))
+                print "voice shape = ", voice
+                t = voice * voice.conjugate()
+                print "t.min() = ", t.min()
+                print "t.max() = ", t.max()
+                l[vf,:,:] += t.real
+            h = or_spe
+            h = numpy.roll(h, -1, axis=1)
+            vf += 1
+
+        print l.shape
+        out = NDArray()
+        out.set_array(l)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input", (NDArray, 'Input Volume'))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, 'Lowest Voice'))
+        reg.add_input_port(cls, "High Freq", (basic.Integer, 'Highest Voice'))
+        reg.add_output_port(cls, "Output", (NDArray, 'Output Voice Volume'))
+
+class FrequencyPhaseLocking(StockwellModule, Module):
+    """
+    Compute the phase-locking index with respect to a single frequency.  The algorithm
+    implemented is the realization of that outline in Sauseng et al. Cross-frequency phase
+    synchronization: A brain mechanism of memory matching and attention:  NeuroImage - 2008
+
+    To summarize, the instantaneous phase of a signal at a given frequency and time is denoted
+    \Phi(f, t) = arctan(F_{Real}(x(t)), F_{Imaginary}(x(t)))
+
+    The generalized phase differences between two signal components with an m:n frequency relationship
+    is:
+
+    \frac{m+n}{2n}f_n = \frac{n+m}{2m}f_m
+
+    \Delta \Phi(f_n,f_m,t) = (\frac{n+m}{2m} \Phi(f_m, t) - \frac{m+n}{2n}f_n \Phi(f_n, t)) % 2 \pi
+
+    And the Phase Synchronization Index is defined as:
+
+    \hat{\Gamma}_\Phi(f_n,f_m,t) = \|\langle e^{j \Delta \Phi(f_n,f_m,t)} \rangle\|, j = \sqrt{-1}
+
+    """
+    def make_delta_phi(self, phase_ar):
+        (freqs,times) = phase_ar.shape
+        dphi_ar = numpy.zeros((times, freqs, freqs))
+        for t in range(times):
+            for fn in range(freqs):
+                f_n = float(fn) + float(self.lof)
+                for fm in range(fn+1,freqs,1):
+                    f_m = float(fm) + float(self.lof)
+                    n = 1.
+                    m = f_n / f_m
+                    phi_m = phase_ar[fm,t]
+                    phi_n = phase_ar[fn,t]
+                    dphi = (((n+m)/2.*m) * phi_m) - (((n+m)/2.*n) * phi_n)
+                    dphi = dphi % (2. * numpy.pi)
+                    dphi_ar[t,fn,fm] = dphi
+                    dphi_ar[t,fm,fn] = dphi
+
+        # dphi_ar.shape = (sig_len, freq_range, freq_range)
+        return dphi_ar
+    
+    def compute(self):
+        trial_ar = self.getInputFromPort("Single Trials").get_array()
+        print "trial_ar.shape = ", trial_ar.shape
+        self.lof = self.getInputFromPort("Low Freq")
+        self.hif = self.getInputFromPort("High Freq")
+        sensor_list = self.forceGetInputListFromPort("Sensors")
+        
+        if len(trial_ar.shape) != 3:
+            raise ModuleError("Cannot process input with rank not 3")
+
+        (trials, sensors, sig_len) = trial_ar.shape
+        if sensor_list == None:
+            sensor_list = numpy.arange(sensors)
+        else:
+            sensor_list = numpy.array(sensor_list)
+            
+        # Compute the TFR for a single sensor across all trials
+        freq_range = self.hif - self.lof
+        out_ar = numpy.zeros((sensor_list.shape[0], sig_len, freq_range+1, freq_range+1))
+        print "sensor list = ", sensor_list
+        
+        # For each sensor to consider, extract the signal array
+        for i in range(sensor_list.shape[0]):
+            tmp_sig = trial_ar[:,sensor_list[i],:].squeeze()
+            # For each trial, extract the signal
+            for j in range(trials):
+                sig = tmp_sig[j,:].squeeze()
+                tfr = st.st(sig, self.lof, self.hif)
+
+                # Compute the phase for the Time-freq plane
+                p = numpy.arctan2(tfr.real, tfr.imag)
+                
+                # the ordering of p is:  (freqs,times) = p.shape
+                dphi_ar = numpy.array(0.-1.j*self.make_delta_phi(p.real))
+                dphi_ar = numpy.exp(dphi_ar)
+                out_ar[i,:,:,:] += dphi_ar
+
+                print "Trial " + str(j) + " done processing..."
+            print "out_ar done with all trials"
+            out_ar[i,:,:,:] /= float(trials)
+            out_ar[i,:,:,:] = out_ar[i,:,:,:] * out_ar[i,:,:,:].conjugate()
+            out_ar[i,:,:,:] = out_ar[i,:,:,:].real
+            print "min,max,mean = ", out_ar[i].min(), out_ar[i].max(), out_ar[i].mean()
+        out = NDArray()
+        out.set_array(out_ar)
+        self.setResult("Output", out)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Single Trials", (NDArray, "Input Single Trial Array"))
+        reg.add_input_port(cls, "Low Freq", (basic.Integer, "Low Frequency"))
+        reg.add_input_port(cls, "High Freq", (basic.Integer, "High Frequency"))
+        reg.add_input_port(cls, "Sensors", (basic.Integer, "Sensors"))
+        reg.add_output_port(cls, "Output", (NDArray, "Phase Locking Volume"))
diff --git a/contrib/NumSciPy/__init__.py b/contrib/NumSciPy/__init__.py
new file mode 100644
index 0000000..554b4b8
--- /dev/null
+++ b/contrib/NumSciPy/__init__.py
@@ -0,0 +1,276 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import scipy
+import scipy.interpolate
+
+# Numpy package imports
+import Array
+import ArrayAccess
+import ArrayOperations
+import ArrayUtilities
+import ArrayConvert
+import ArrayIO
+import Imaging
+
+# Scipy package imports
+import Matrix
+import MatrixUtilities
+import DSP
+import Filters
+import EnsembleOrdering
+
+# NumSciPy plotting
+import ArrayPlot
+
+version = '0.4.0'
+name = 'Num-SciPy'
+identifier = 'edu.utah.sci.vistrails.numpyscipy'
+
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry
+    basic = core.modules.basic_modules
+
+    clslst = []
+    
+    #########################################################################################
+    #  Numpy Registry
+    reg.add_module(Array.NDArray, name="Numpy Array", namespace=Array.NDArray.my_namespace)
+    reg.add_output_port(Array.NDArray, "self", (Array.NDArray, 'self'))
+    reg.add_module(Matrix.Matrix, name="Scipy Matrix", namespace=Matrix.Matrix.my_namespace)
+    
+    
+    #########################################################################################
+    #  Array Access registry
+    accessclass = [ArrayAccess.GetShape,
+                   ArrayAccess.GetReals,
+                   ArrayAccess.GetImaginaries,
+                   ArrayAccess.GetMax,
+                   ArrayAccess.GetMean,
+                   ArrayAccess.GetMin,
+                   ArrayAccess.GetDiagonal,
+                   ArrayAccess.GetArrayAsType,
+                   ArrayAccess.GetConjugate,
+                   ArrayAccess.GetFlattenedArray,
+                   ArrayAccess.GetField,
+                   ArrayAccess.ToScalar,
+                   ArrayAccess.GetMemoryFootprint,
+                   ArrayAccess.GetArrayRank,
+                   ArrayAccess.GetNonZeroEntries,
+                   ArrayAccess.GetArraySize,
+                   ArrayAccess.GetTranspose,
+                   ArrayAccess.GetRowRange,
+                   ArrayAccess.GetColumnRange,
+                   ArrayAccess.GetRows]
+
+    for cls in accessclass:
+        cls.register(reg, basic)
+
+
+    #########################################################################################
+    #  Array Operations registry
+    opclasses = [ArrayOperations.ArrayReshape,
+                 ArrayOperations.ArrayCumulativeSum,
+                 ArrayOperations.ArraySort,
+                 ArrayOperations.ArrayCumulativeProduct,
+                 ArrayOperations.ArrayFill,
+                 ArrayOperations.ArrayResize,
+                 ArrayOperations.ArrayExtractRegion,
+                 ArrayOperations.ArrayRavel,
+                 ArrayOperations.ArrayRound,
+                 ArrayOperations.ArrayGetSigma,
+                 ArrayOperations.ArraySum,
+                 ArrayOperations.ArrayElementMultiply,
+                 ArrayOperations.ArraySetElement,
+                 ArrayOperations.ArrayVariance,
+                 ArrayOperations.ArrayTrace,
+                 ArrayOperations.ArraySwapAxes,
+                 ArrayOperations.ArraySqueeze,
+                 ArrayOperations.ArrayScalarMultiply,
+                 ArrayOperations.ArrayAdd,
+                 ArrayOperations.ArrayScalarAdd,
+                 ArrayOperations.ArrayLog10,
+                 ArrayOperations.ArrayAtan2,
+                 ArrayOperations.ArraySqrt,
+                 ArrayOperations.ArrayThreshold,
+                 ArrayOperations.ArrayWindow,
+                 ArrayOperations.ArrayNormalize,
+                 ArrayOperations.ArrayName]
+
+    for cls in opclasses:
+        cls.register(reg, basic)
+                 
+
+    #########################################################################################
+    #  Array Convert registry
+    convertclasses = [ArrayConvert.ArrayDumpToFile,
+                      ArrayConvert.ArrayDumpToString,
+                      ArrayConvert.ArrayToFile,
+                      ArrayConvert.ArrayToString,
+                      ArrayConvert.ArrayToMatrix,
+                      ArrayConvert.ArrayToVTKImageData]
+    
+    for cls in convertclasses:
+        cls.register(reg, basic)
+
+    #########################################################################################
+    #  Array IO registry
+    ioclasses = [ArrayIO.ReadRAW,
+                 ArrayIO.ReadNHDR,
+                 ArrayIO.WriteRAW,
+                 ArrayIO.WriteNHDR,
+                 ArrayIO.ReadStatisticalSummary]
+
+    try:
+        import pylab
+        ioclasses.append(ArrayIO.ReadPNG)
+        ioclasses.append(ArrayIO.WritePNG)
+    except:
+        pass
+    
+    for cls in ioclasses:
+        cls.register(reg, basic)
+
+    #########################################################################################
+    #  Array Imaging registry
+    ar_util = [ArrayUtilities.ArrayToVTKScalars,
+               ArrayUtilities.ArrayToTimeVaryingVTKScalars,
+               ArrayUtilities.ArrayToTimeVaryingVTKVectors,
+               ArrayUtilities.ArrayToVTKVectors,
+               ArrayUtilities.VTKDataSetToPointArray]
+
+    clslst.extend(ar_util)
+    
+    for cls in ar_util:
+        cls.register(reg, basic)        
+
+    #########################################################################################
+    #  Array Imaging registry
+    imclasses = [Imaging.ExtractRGBAChannel,
+                 Imaging.GaussianGradientMagnitude,
+                 Imaging.JointHistogram,
+                 Imaging.GaussianSmooth,
+                 Imaging.MedianFilter,
+                 Imaging.ImageDifference,
+                 Imaging.ImageNormalize,
+                 Imaging.SobelGradientMagnitude]
+
+    for cls in imclasses:
+        cls.register(reg, basic)
+        
+    #########################################################################################
+    #  Scipy Registry
+    matrixclasses = [Matrix.MatrixMultiply,
+                     Matrix.MatrixConjugate,
+                     Matrix.MatrixToArray]
+
+    for cls in matrixclasses:
+        cls.register(reg,basic)
+
+    #########################################################################################
+    #  Scipy Matrix Utilities Registry
+    matrixutils = [MatrixUtilities.MatlabReader,
+                   MatrixUtilities.MatlabWriter]
+
+    for cls in matrixutils:
+        cls.register(reg, basic)
+
+    #########################################################################################
+    #  Scipy DSP Registry
+    dspclasses = [DSP.FFT,
+                  DSP.FFTN,
+                  DSP.SignalSmoothing,
+                  DSP.ShortTimeFourierTransform,
+                  DSP.SignalGenerator]
+#                  DSP.FrequencyPhaseLocking,
+#                  DSP.SingleTrialPhaseLocking
+
+    try:
+        import smt
+        import Stockwell
+        dspclasses.append(Stockwell.StockwellTransform)
+        dspclasses.append(Stockwell.MultiTaperStockwellTransform)
+        dspclasses.append(Stockwell.FastStockwell3D)
+        dspclasses.append(Stockwell.Stockwell2D)
+        dspclasses.append(Stockwell.PyStockwellTransform)
+        dspclasses.append(Stockwell.PointBasedStockwell)
+        dspclasses.append(Stockwell.ScaleSpaceHistogram)
+        dspclasses.append(Stockwell.PyScaleSpaceHistogram)
+        dspclasses.append(Stockwell.MaximalScaleVolume)
+        dspclasses.append(Stockwell.ScaleVolumes)
+        dspclasses.append(Stockwell.IsotropicScaleVolumes)
+        dspclasses.append(Stockwell.FrequencyPhaseLocking)
+    except:
+        pass
+
+    for cls in dspclasses:
+        cls.register(reg, basic)
+
+    #########################################################################################
+    #  Scipy Interpolation Registry
+    interpclasses = []
+    try:
+        import ArrayInterpolate
+        interpclasses.append(ArrayInterpolate.RBFInterpolate)
+        interpclasses.append(ArrayInterpolate.BSplineInterpolate)
+    except:
+        pass
+
+    interpclasses.append(ArrayInterpolate.BSplineResample)
+    for cls in interpclasses:
+        cls.register(reg, basic)
+
+    #########################################################################################
+    #  Scipy Windows Registry
+    winclasses = [Filters.HanningWindow,
+                  Filters.TriangularWindow,
+                  Filters.BlackmanWindow,
+                  Filters.BlackmanHarrisWindow,
+                  Filters.ParzenWindow,
+                  Filters.HammingWindow,
+                  Filters.KaiserWindow,
+                  Filters.BartlettHannWindow,
+                  Filters.GaussianWindow,
+                  Filters.BoxcarWindow,
+                  Filters.BohmanWindow,
+                  Filters.BartlettWindow,
+                  Filters.NuttallBlackmanHarrisWindow]    
+
+    for cls in winclasses:
+        cls.register(reg, basic)
+
+    #########################################################################################
+    #  Scipy Signal Ensembles Registry
+    ensembles = [EnsembleOrdering.OrderByIndexes,
+                 EnsembleOrdering.OrderByCorrelation,
+                 EnsembleOrdering.OrderByProgressiveCorrelation,
+                 EnsembleOrdering.ComputeDistance]
+
+    for cls in ensembles:
+        cls.register(reg, basic)
+
+    #########################################################################################    
+    #  NumSciPy Plotting Registry
+    pl = [ArrayPlot.LinePlot,
+          ArrayPlot.ScatterPlot,
+          ArrayPlot.BarChart,
+          ArrayPlot.Histogram,
+          ArrayPlot.ArrayImage]
+
+    for cls in pl:
+        cls.register(reg, basic)
+
+    clslst.extend(pl)
+
+    #########################################################################################    
+    #  Register all ports.
+    for cls in clslst:
+        cls.register_ports(reg, basic)
+
+def package_dependencies():
+    import core.packagemanager
+    manager = core.packagemanager.get_package_manager()
+    if manager.has_package('edu.utah.sci.vistrails.vtk'):
+        return ['edu.utah.sci.vistrails.vtk']
+    else:
+        return []
diff --git a/contrib/NumSciPy/smt.py b/contrib/NumSciPy/smt.py
new file mode 100644
index 0000000..590f313
--- /dev/null
+++ b/contrib/NumSciPy/smt.py
@@ -0,0 +1,40 @@
+import sys
+import numpy as npy
+from sine import sine_taper
+from st import st
+from math import sqrt
+
+def calcK(bw, N, srate):
+	"""Calculate K for a given bandwidth, length, and sampling rate.
+	bw = 2p * fr, where fr = srate / N (frequency resolution).
+	p specifies the half bandwidth in bins (fr units).
+	K = 2p - 1"""
+
+	K = int(bw * float(N) / srate + .5) - 1
+	if K < 1: K = 1
+	return K
+
+def calcbw(K, N, srate):
+	"""Calculate the bandwidth given K."""
+
+	return float(K + 1) * srate / N
+
+# Precompute the tapers.
+
+def calc_tapers(K, N):
+	return map(lambda k, N = N: sine_taper(k, N), npy.arange(K))
+
+# Multitaper Stockwell transform.
+
+def mtst(K, tapers, x, lo, hi):
+	N = len(x)
+	K2 = float(K * K)
+	s = 0.
+	n = 0.
+	for k in range(K):
+		X = st(tapers[k] * x, lo, hi)
+		mu = 1. - k * k / K2
+		s += mu * abs(X)**2
+		n += mu
+	s *= N / n
+	return s
diff --git a/contrib/ParaView/PVBase.py b/contrib/ParaView/PVBase.py
new file mode 100644
index 0000000..315e4fc
--- /dev/null
+++ b/contrib/ParaView/PVBase.py
@@ -0,0 +1,53 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+from paraview import servermanager
+import paraview.simple as pv
+
+def extract_pv_instances(paramList):
+    newList = []
+    for param in paramList:
+        if hasattr(param, "pvInstance"):
+            newList.append(param.pvInstance)
+        else:
+            newList.append(param)
+    return newList
+
+class PVModule(Module):
+    def __init__(self):
+        Module.__init__(self)
+        self.pvInstance = None
+
+    def compute(self):
+        if self.pvInstance:
+            del self.pvInstance
+        pv.SetActiveSource(None)
+        if not self.pvInstance:
+            if hasattr(self, "pvFunction"):
+                self.pvInstance = self.pvFunction()
+            else:
+                self.pvInstance = getattr(pv, self.pvClass)()
+
+        # We need to set input before other properties
+        if self.inputPorts.has_key('Input'):
+            inp = extract_pv_instances(self.forceGetInputListFromPort('Input'))[0]
+            setattr(self.pvInstance, "Input", inp)
+
+        for (function, connector_list) in self.inputPorts.iteritems():
+            paramList = extract_pv_instances(self.forceGetInputListFromPort(function))
+            if function != 'Input':
+                if len(paramList) > 1:
+                    setattr(self.pvInstance, function, paramList)
+                else:
+                    setattr(self.pvInstance, function, paramList[0])
+
+        if hasattr(self.pvInstance, 'UpdatePipeline'):
+            self.pvInstance.UpdatePipeline()
+
+        self.setResult('Output', self)
+
+class _funcs_internals:
+    "Internal class."
+    rep_counter = 0
+
diff --git a/contrib/ParaView/__init__.py b/contrib/ParaView/__init__.py
new file mode 100644
index 0000000..06fc47d
--- /dev/null
+++ b/contrib/ParaView/__init__.py
@@ -0,0 +1,22 @@
+version = '0.0.1'
+name = 'ParaView'
+identifier = 'edu.utah.sci.eranders.ParaView'
+
+from configuration import configuration
+
+def package_dependencies():
+    import core.packagemanager
+    manager = core.packagemanager.get_package_manager()
+    if manager.has_package('edu.utah.sci.vistrails.spreadsheet'):
+        return ['edu.utah.sci.vistrails.spreadsheet']
+    else:
+        return []
+
+def package_requirements():
+    import core.requirements
+    if not core.requirements.python_module_exists('vtk'):
+        raise core.requirements.MissingRequirement('vtk')
+    if not core.requirements.python_module_exists('PyQt4'):
+        print 'PyQt4 is not available. There will be no interaction',
+        print 'between VTK and the spreadsheet.'
+    import vtk
\ No newline at end of file
diff --git a/contrib/ParaView/configuration.py b/contrib/ParaView/configuration.py
new file mode 100644
index 0000000..963f4e2
--- /dev/null
+++ b/contrib/ParaView/configuration.py
@@ -0,0 +1,7 @@
+from core.configuration import ConfigurationObject
+
+configuration = ConfigurationObject(pvserver_bin=(None, str), 
+                                    mpiexec_bin=(None, str),
+                                    start_server=False,
+                                    num_proc=4,
+                                    port=11111)
\ No newline at end of file
diff --git a/contrib/ParaView/contour.vt b/contrib/ParaView/contour.vt
new file mode 100644
index 0000000..31f0811
Binary files /dev/null and b/contrib/ParaView/contour.vt differ
diff --git a/contrib/ParaView/init.py b/contrib/ParaView/init.py
new file mode 100644
index 0000000..d17d77d
--- /dev/null
+++ b/contrib/ParaView/init.py
@@ -0,0 +1,185 @@
+import paraview
+import paraview.simple
+import paraview.servermanager as sm
+import PVBase
+import core.modules
+import core.modules.module_registry
+from pvconfig import QPVConfigWindow
+from core.modules.vistrails_module import new_module, Module, ModuleError
+from core.modules.module_registry import (registry, add_module,
+                                          has_input_port,
+                                          add_input_port, add_output_port)
+from core.modules.source_configure import SourceConfigurationWidget
+from core.modules.python_source_configure import PythonEditor, PythonSourceConfigurationWidget
+from core.modules.basic_modules import PythonSource
+from configuration import configuration
+import urllib
+
+forbidden = ['AlltoN',
+             'Balance',
+             'CTHSurface',
+             'SelectionSourceBase']
+
+
+class ProgrammableFilterConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, 
+                                           PythonEditor, False, False, parent,
+                                           portName='Script', encode=False)
+
+class PVServerPythonSourceConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, 
+                                           PythonEditor, True, False, parent,
+                                           portName='Script', encode=False)
+
+class PVServerPythonSource(PVBase.PVModule):
+
+    def compute(self):
+        if self.pvInstance:
+            del self.pvInstance
+        paraview.simple.SetActiveSource(None)
+        inputDefs = ''
+        for k in self.inputPorts:
+            if k=='Script':
+                continue
+            value = self.getInputFromPort(k)
+            if type(value)==str:
+                inputDefs += '%s = "%s"\n' % (k, value.replace('"', '\\"'))
+            elif type(value)==int:
+                inputDefs += '%s = %s\n' % (k, value)
+        prefix = """
+import paraview.servermanager as sm
+import paraview.vtk.dataset_adapter as DA
+proc = sm.vtkProcessModule.GetProcessModule()
+nPartitions = proc.GetNumberOfLocalPartitions()
+partitionId = proc.GetPartitionId()
+result = ''
+"""
+        source = self.forceGetInputFromPort('Script', '')
+        suffix = """
+if len(result)>0:
+    import vtk
+    dataImporter = vtk.vtkImageImport()
+    dataImporter.CopyImportVoidPointer(result, len(result))
+    dataImporter.SetDataScalarTypeToUnsignedChar()
+    dataImporter.SetNumberOfScalarComponents(1)
+    dataImporter.SetDataExtent(0, len(result)-1, 0, 0, 0, 0)
+    dataImporter.SetWholeExtent(0, len(result)-1, 0, 0, 0, 0)
+    dataImporter.Update()
+    self.GetOutputDataObject(0).DeepCopy(dataImporter.GetOutput())
+"""
+        self.pvInstance = paraview.simple.ProgrammableFilter()
+        self.pvInstance.OutputDataSetType = 'vtkImageData'
+        self.pvInstance.Script = inputDefs + prefix + source + suffix
+        self.pvInstance.UpdatePipeline()
+
+        self.setResult('Output', self)
+
+
+class PVClientFetch(PythonSource):
+
+    def compute(self):
+        prefix = """
+import paraview.servermanager as sm
+import paraview.vtk.dataset_adapter as DA
+proc = sm.vtkProcessModule.GetProcessModule()
+nPartitions = proc.GetNumberOfPartitions(sm.ActiveConnection.ID)
+module = self.getInputFromPort('ServerModule')
+results = []
+for i in xrange(nPartitions):
+    data = sm.Fetch(module.pvInstance, i)
+    if data==None or data.GetPointData().GetNumberOfArrays()==0:
+        continue
+    narray = DA.numpy_support.vtk_to_numpy(data.GetPointData().GetArray(0))
+    result = narray.tostring()
+    results.append(result)
+"""
+        s = urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        self.run_code(prefix + s, use_input=True, use_output=True)
+        
+        
+def add_paraview_module(name, proxy, module_type, ns, hide=False, pvFunction=None):
+
+    mod = new_module(module_type, name)
+    mod.pvSpace = ns.lower()
+    mod.pvClass = name
+    if pvFunction != None:
+        mod.pvFunction = pvFunction
+    if name=='ProgrammableFilter':
+        add_module(mod, name = name, namespace=ns, configureWidgetType=ProgrammableFilterConfigurationWidget)
+    else:
+        add_module(mod, name = name, namespace=ns)
+
+    for prop in proxy.ListProperties():
+        optional = False
+        if hide and prop != "Input":
+            optional = True
+        p = proxy.GetProperty(prop)
+        if isinstance(p, sm.ProxyProperty):
+            add_input_port(mod, prop, PVBase.PVModule, optional)
+            continue
+        if isinstance(p, sm.EnumerationProperty):
+            add_input_port(mod, prop, core.modules.basic_modules.String, optional)
+            continue
+        if isinstance(p, sm.VectorProperty):
+            params = []
+            typ = None
+            if p.IsA("vtkSMDoubleVectorProperty"):
+                typ = core.modules.basic_modules.Float
+            elif p.IsA("vtkSMIntVectorProperty"):
+                typ = core.modules.basic_modules.Integer
+            elif p.IsA("vtkSMStringVectorProperty"):
+                typ = core.modules.basic_modules.String
+            elif p.IsA("vtkSMIdTypeVectorProperty"):
+                typ = core.modules.basic_modules.Integer
+            nel = len(p)
+            if nel > 0:
+                for i in range(nel):
+                    params.append(typ)
+            else:
+                params.append(typ)
+            add_input_port(mod, prop, params, optional)
+
+    add_output_port(mod, "Output", module_type)
+        
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry
+    basic = core.modules.basic_modules
+    add_module(PVBase.PVModule, namespace='base')
+    mod_dict = {}
+
+    mlist = [("Sources", sm.sources), ("Filters", sm.filters), 
+             ("Animation", sm.animation), ("Writers", sm.writers)]
+    for ns, m in mlist:
+        dt = m.__dict__
+        for key in dt.keys():
+            if forbidden.__contains__(key):
+                continue
+            if key.__contains__('Base'):
+                continue
+            cl = dt[key]
+            if not isinstance(cl, str):
+                if paraview.simple._func_name_valid(key):
+                    add_paraview_module(key, m.__dict__[key](no_update=True), PVBase.PVModule, ns)
+
+
+    add_paraview_module("GeometryRepresentation", sm.rendering.GeometryRepresentation(no_update=True), PVBase.PVModule, "Rendering", True, sm.rendering.GeometryRepresentation)
+    add_paraview_module("PVLookupTable", sm.rendering.PVLookupTable(no_update=True), PVBase.PVModule, "Rendering", False, sm.rendering.PVLookupTable)
+    add_paraview_module("ScalarBarWidgetRepresentation", sm.rendering.ScalarBarWidgetRepresentation(no_update=True), PVBase.PVModule, "Rendering", True, sm.rendering.ScalarBarWidgetRepresentation)
+    add_module(PVServerPythonSource, name = "PVServerPythonSource", configureWidgetType=PVServerPythonSourceConfigurationWidget)
+    add_input_port(PVServerPythonSource, "Script", (core.modules.basic_modules.String, ""), True)
+    add_output_port(PVServerPythonSource, "self", PVServerPythonSource)
+    add_module(PVClientFetch, name = "PVClientFetch", configureWidgetType=PythonSourceConfigurationWidget)
+    add_input_port(PVClientFetch, "ServerModule", (PVServerPythonSource, ""))
+    add_input_port(PVClientFetch, "source", (core.modules.basic_modules.String, ""))
+
+    import pvcell
+    pvcell.registerSelf()
+
+    global pvConfigWindow
+    pvConfigWindow = QPVConfigWindow(proc_num=configuration.num_proc,
+                                     port=configuration.port)
+    pvConfigWindow.show()
+    if configuration.start_server == True:
+        pvConfigWindow.togglePVServer()
\ No newline at end of file
diff --git a/contrib/ParaView/pv.vt b/contrib/ParaView/pv.vt
new file mode 100644
index 0000000..34d152b
Binary files /dev/null and b/contrib/ParaView/pv.vt differ
diff --git a/contrib/ParaView/pvcell.py b/contrib/ParaView/pvcell.py
new file mode 100644
index 0000000..3967630
--- /dev/null
+++ b/contrib/ParaView/pvcell.py
@@ -0,0 +1,83 @@
+from PyQt4 import QtCore
+from core.modules.module_registry import get_module_registry
+from packages.vtk.vtkcell import QVTKWidget
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget
+from PVBase import PVModule
+import paraview.simple as pvsp
+import paraview.pvfilters
+import vtk
+
+class PVCell(SpreadsheetCell):
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        proxies = self.forceGetInputListFromPort('Proxy')
+        self.cellWidget = self.displayAndWait(QParaViewWidget, (proxies,))
+
+class QParaViewWidget(QVTKWidget):
+
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        QVTKWidget.__init__(self, parent, f)
+        self.view = None
+
+    def updateContents(self, inputPorts):
+
+        if self.view==None:
+            self.view = pvsp.CreateRenderView()
+            renWin = self.view.GetRenderWindow()
+            self.SetRenderWindow(renWin)
+            iren = renWin.GetInteractor()
+            print type(iren)
+            iren.SetNonInteractiveRenderDelay(0)
+            iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
+
+        (representations, ) = inputPorts
+        self.view.Representations = []
+        for r in representations:
+            self.view.Representations.append(r.pvInstance)
+
+        self.view.ResetCamera()
+        self.view.StillRender()
+
+        QCellWidget.updateContents(self, inputPorts)
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+
+        """
+        image = self.view.CaptureWindow(1)
+        image.UnRegister(None)
+
+        writer = vtk.vtkPNGWriter()
+        writer.SetInput(image)
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def deleteLater(self):
+        QCellWidget.deleteLater(self)
+
+
+
+def registerSelf():
+    registry = get_module_registry()
+    registry.add_module(PVCell)
+    registry.add_input_port(PVCell, "Location", CellLocation)
+    registry.add_input_port(PVCell, "Proxy", PVModule)
+    registry.add_output_port(PVCell, "self", PVCell)
diff --git a/contrib/ParaView/pvconfig.py b/contrib/ParaView/pvconfig.py
new file mode 100644
index 0000000..2da11b7
--- /dev/null
+++ b/contrib/ParaView/pvconfig.py
@@ -0,0 +1,89 @@
+from PyQt4 import QtCore, QtGui
+import sys
+import paraview.simple as pv
+from configuration import configuration
+
+class QPVConfigWindow(QtGui.QWidget):
+
+    def __init__(self, proc_num=4, port=11111, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.setWindowTitle('ParaView Local Server')
+        vbox = QtGui.QVBoxLayout()
+        self.setLayout(vbox)
+
+        hbox = QtGui.QHBoxLayout()
+        vbox.addLayout(hbox)
+        
+        hbox.addWidget(QtGui.QLabel('# Procs'))
+        self.procSpin = QtGui.QSpinBox()
+        self.procSpin.setRange(1, 1024*1024)
+        self.procSpin.setValue(proc_num)
+        hbox.addWidget(self.procSpin)
+        
+        hbox.addWidget(QtGui.QLabel('Port'))
+        self.portSpin = QtGui.QSpinBox()
+        self.portSpin.setRange(0, 64*1024)
+        self.portSpin.setValue(port)
+        hbox.addWidget(self.portSpin)
+        
+        hbox.addStretch()
+        
+        self.cmdOut = QtGui.QTextEdit()
+        self.cmdOut.setReadOnly(True)
+        vbox.addWidget(self.cmdOut)
+
+        self.runButton = QtGui.QPushButton('Start')
+        vbox.addWidget(self.runButton)
+
+        self.pvProcess = QtCore.QProcess()
+        self.pvProcess.setProcessChannelMode(QtCore.QProcess.MergedChannels)
+        self.connect(self.pvProcess, QtCore.SIGNAL('readyReadStandardOutput()'), self.updateLogs)
+        self.connect(self.pvProcess, QtCore.SIGNAL('error()'), self.updateError)
+        self.connect(self.pvProcess, QtCore.SIGNAL('finished(int,QProcess::ExitStatus)'), self.pvServerFinished)
+        
+        self.connect(self.runButton, QtCore.SIGNAL('clicked()'), self.togglePVServer)
+
+    def buildArguments(self):
+        #defaults
+        mpiexec_bin = '/usr/bin/mpiexec'
+        pvserver_bin = '/usr/local/bin/pvserver'
+        
+        if configuration.check('mpiexec_bin'):
+            mpiexec_bin = configuration.mpiexec_bin
+        if configuration.check("pvserver_bin"):
+            pvserver_bin = configuration.pvserver_bin
+            
+        return (mpiexec_bin, ['-n', str(self.procSpin.value()), pvserver_bin, '--server-port=%s' % self.portSpin.value()])
+
+    def sizeHint(self):
+        return QtCore.QSize(384, 512)
+
+    def togglePVServer(self):
+        if self.pvProcess.state()==QtCore.QProcess.NotRunning:
+            self.runButton.setEnabled(False)
+            self.cmdOut.append('Starting...\n')
+            self.pvProcess.start(*self.buildArguments())
+            self.pvProcess.waitForStarted()
+            if self.pvProcess.state()==QtCore.QProcess.Running:
+                self.runButton.setText('Stop')
+                pv.Connect('localhost', self.portSpin.value())
+            self.runButton.setEnabled(True)
+        else:
+            self.pvProcess.terminate()
+            self.pvProcess.waitForFinished()
+
+    def updateLogs(self):
+        self.cmdOut.append(QtCore.QString(self.pvProcess.readAllStandardOutput()))
+
+    def updateError(self, error):
+        self.cmdOut.append('ERROR %s\n' % error)
+
+    def pvServerFinished(self, exitCode, exitStatus):
+        self.cmdOut.append('Exited\n')
+        self.runButton.setText('Start')
+
+if __name__=='__main__':
+    app = QtGui.QApplication(sys.argv)
+    window = QPVConfigWindow()
+    window.show()
+    app.exec_()
diff --git a/contrib/SCIRun/__init__.py b/contrib/SCIRun/__init__.py
new file mode 100644
index 0000000..27cd2cb
--- /dev/null
+++ b/contrib/SCIRun/__init__.py
@@ -0,0 +1,9001 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+# This file was generated using vistrail_converter.py
+
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from core.modules.basic_modules import Constant
+import sr_py
+import os
+import time
+
+
+version = "0.9.1"
+identifier = "edu.utah.sci.vistrails.scirun"
+name = "SCIRun"
+
+class Time(Constant):
+  def compute(self): 
+    pass
+
+class Converters(Constant):
+  def compute(self): 
+    pass
+
+class Texture(Constant):
+  def compute(self): 
+    pass
+
+class Visualization(Constant):
+  def compute(self): 
+    pass
+
+class MiscField(Constant):
+  def compute(self): 
+    pass
+
+class DataArrayMath(Constant):
+  def compute(self): 
+    pass
+
+class Math(Constant):
+  def compute(self): 
+    pass
+
+class ChangeMesh(Constant):
+  def compute(self): 
+    pass
+
+class ChangeFieldData(Constant):
+  def compute(self): 
+    pass
+
+class Geometry(Constant):
+  def compute(self): 
+    pass
+
+class NewField(Constant):
+  def compute(self): 
+    pass
+
+class ColorMap(Constant):
+  def compute(self): 
+    pass
+
+class Field(Constant):
+  def compute(self): 
+    pass
+
+class Nrrd(Constant):
+  def compute(self): 
+    pass
+
+class Matrix(Constant):
+  def compute(self): 
+    pass
+
+class ColorMap2(Constant):
+  def compute(self): 
+    pass
+
+class Path(Constant):
+  def compute(self): 
+    pass
+
+class String(Constant):
+  def compute(self): 
+    pass
+
+class Bundle(Constant):
+  def compute(self): 
+    pass
+
+class DataIO(Constant):
+  def compute(self): 
+    pass
+
+class WriteBundle(DataIO) :
+  def compute(self) :
+    p = sr_py.WriteBundleAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(bundle, Filename)
+
+class WritePath(DataIO) :
+  def compute(self) :
+    p = sr_py.WritePathAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    Input_Data = 0
+    if self.hasInputFromPort('Input Data') :
+      Input_Data = self.getInputFromPort('Input Data')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Input_Data, Filename)
+
+class WriteColorMap2D(DataIO) :
+  def compute(self) :
+    p = sr_py.WriteColorMap2DAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    if self.hasInputFromPort('p_exporttype') :
+      p.set_p_exporttype(self.getInputFromPort('p_exporttype'))
+    Input_Data = 0
+    if self.hasInputFromPort('Input Data') :
+      Input_Data = self.getInputFromPort('Input Data')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Input_Data, Filename)
+
+class ReadHDF5File(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadHDF5FileAlg()
+    if self.hasInputFromPort('p_have_HDF5') :
+      p.set_p_have_HDF5(self.getInputFromPort('p_have_HDF5'))
+    if self.hasInputFromPort('p_power_app') :
+      p.set_p_power_app(self.getInputFromPort('p_power_app'))
+    if self.hasInputFromPort('p_datasets') :
+      p.set_p_datasets(self.getInputFromPort('p_datasets'))
+    if self.hasInputFromPort('p_dumpname') :
+      p.set_p_dumpname(self.getInputFromPort('p_dumpname'))
+    if self.hasInputFromPort('p_ports') :
+      p.set_p_ports(self.getInputFromPort('p_ports'))
+    if self.hasInputFromPort('p_ndims') :
+      p.set_p_ndims(self.getInputFromPort('p_ndims'))
+    if self.hasInputFromPort('p_mergeData') :
+      p.set_p_mergeData(self.getInputFromPort('p_mergeData'))
+    if self.hasInputFromPort('p_assumeSVT') :
+      p.set_p_assumeSVT(self.getInputFromPort('p_assumeSVT'))
+    if self.hasInputFromPort('p_animate') :
+      p.set_p_animate(self.getInputFromPort('p_animate'))
+    if self.hasInputFromPort('p_animate_tab') :
+      p.set_p_animate_tab(self.getInputFromPort('p_animate_tab'))
+    if self.hasInputFromPort('p_basic_tab') :
+      p.set_p_basic_tab(self.getInputFromPort('p_basic_tab'))
+    if self.hasInputFromPort('p_extended_tab') :
+      p.set_p_extended_tab(self.getInputFromPort('p_extended_tab'))
+    if self.hasInputFromPort('p_playmode_tab') :
+      p.set_p_playmode_tab(self.getInputFromPort('p_playmode_tab'))
+    if self.hasInputFromPort('p_selectable_min') :
+      p.set_p_selectable_min(self.getInputFromPort('p_selectable_min'))
+    if self.hasInputFromPort('p_selectable_max') :
+      p.set_p_selectable_max(self.getInputFromPort('p_selectable_max'))
+    if self.hasInputFromPort('p_selectable_inc') :
+      p.set_p_selectable_inc(self.getInputFromPort('p_selectable_inc'))
+    if self.hasInputFromPort('p_range_min') :
+      p.set_p_range_min(self.getInputFromPort('p_range_min'))
+    if self.hasInputFromPort('p_range_max') :
+      p.set_p_range_max(self.getInputFromPort('p_range_max'))
+    if self.hasInputFromPort('p_playmode') :
+      p.set_p_playmode(self.getInputFromPort('p_playmode'))
+    if self.hasInputFromPort('p_current') :
+      p.set_p_current(self.getInputFromPort('p_current'))
+    if self.hasInputFromPort('p_execmode') :
+      p.set_p_execmode(self.getInputFromPort('p_execmode'))
+    if self.hasInputFromPort('p_delay') :
+      p.set_p_delay(self.getInputFromPort('p_delay'))
+    if self.hasInputFromPort('p_inc_amount') :
+      p.set_p_inc_amount(self.getInputFromPort('p_inc_amount'))
+    if self.hasInputFromPort('p_update_type') :
+      p.set_p_update_type(self.getInputFromPort('p_update_type'))
+    if self.hasInputFromPort('p_have_group') :
+      p.set_p_have_group(self.getInputFromPort('p_have_group'))
+    if self.hasInputFromPort('p_have_attributes') :
+      p.set_p_have_attributes(self.getInputFromPort('p_have_attributes'))
+    if self.hasInputFromPort('p_have_datasets') :
+      p.set_p_have_datasets(self.getInputFromPort('p_have_datasets'))
+    if self.hasInputFromPort('p_continuous') :
+      p.set_p_continuous(self.getInputFromPort('p_continuous'))
+    if self.hasInputFromPort('p_selectionString') :
+      p.set_p_selectionString(self.getInputFromPort('p_selectionString'))
+    if self.hasInputFromPort('p_regexp') :
+      p.set_p_regexp(self.getInputFromPort('p_regexp'))
+    if self.hasInputFromPort('p_allow_selection') :
+      p.set_p_allow_selection(self.getInputFromPort('p_allow_selection'))
+    if self.hasInputFromPort('p_read_error') :
+      p.set_p_read_error(self.getInputFromPort('p_read_error'))
+    if self.hasInputFromPort('p_max_dims') :
+      p.set_p_max_dims(self.getInputFromPort('p_max_dims'))
+    if self.hasInputFromPort('p_0_dim') :
+      p.set_p_0_dim(self.getInputFromPort('p_0_dim'))
+    if self.hasInputFromPort('p_0_start') :
+      p.set_p_0_start(self.getInputFromPort('p_0_start'))
+    if self.hasInputFromPort('p_0_start2') :
+      p.set_p_0_start2(self.getInputFromPort('p_0_start2'))
+    if self.hasInputFromPort('p_0_count') :
+      p.set_p_0_count(self.getInputFromPort('p_0_count'))
+    if self.hasInputFromPort('p_0_count2') :
+      p.set_p_0_count2(self.getInputFromPort('p_0_count2'))
+    if self.hasInputFromPort('p_0_stride') :
+      p.set_p_0_stride(self.getInputFromPort('p_0_stride'))
+    if self.hasInputFromPort('p_0_stride2') :
+      p.set_p_0_stride2(self.getInputFromPort('p_0_stride2'))
+    if self.hasInputFromPort('p_1_dim') :
+      p.set_p_1_dim(self.getInputFromPort('p_1_dim'))
+    if self.hasInputFromPort('p_1_start') :
+      p.set_p_1_start(self.getInputFromPort('p_1_start'))
+    if self.hasInputFromPort('p_1_start2') :
+      p.set_p_1_start2(self.getInputFromPort('p_1_start2'))
+    if self.hasInputFromPort('p_1_count') :
+      p.set_p_1_count(self.getInputFromPort('p_1_count'))
+    if self.hasInputFromPort('p_1_count2') :
+      p.set_p_1_count2(self.getInputFromPort('p_1_count2'))
+    if self.hasInputFromPort('p_1_stride') :
+      p.set_p_1_stride(self.getInputFromPort('p_1_stride'))
+    if self.hasInputFromPort('p_1_stride2') :
+      p.set_p_1_stride2(self.getInputFromPort('p_1_stride2'))
+    if self.hasInputFromPort('p_2_dim') :
+      p.set_p_2_dim(self.getInputFromPort('p_2_dim'))
+    if self.hasInputFromPort('p_2_start') :
+      p.set_p_2_start(self.getInputFromPort('p_2_start'))
+    if self.hasInputFromPort('p_2_start2') :
+      p.set_p_2_start2(self.getInputFromPort('p_2_start2'))
+    if self.hasInputFromPort('p_2_count') :
+      p.set_p_2_count(self.getInputFromPort('p_2_count'))
+    if self.hasInputFromPort('p_2_count2') :
+      p.set_p_2_count2(self.getInputFromPort('p_2_count2'))
+    if self.hasInputFromPort('p_2_stride') :
+      p.set_p_2_stride(self.getInputFromPort('p_2_stride'))
+    if self.hasInputFromPort('p_2_stride2') :
+      p.set_p_2_stride2(self.getInputFromPort('p_2_stride2'))
+    if self.hasInputFromPort('p_3_dim') :
+      p.set_p_3_dim(self.getInputFromPort('p_3_dim'))
+    if self.hasInputFromPort('p_3_start') :
+      p.set_p_3_start(self.getInputFromPort('p_3_start'))
+    if self.hasInputFromPort('p_3_start2') :
+      p.set_p_3_start2(self.getInputFromPort('p_3_start2'))
+    if self.hasInputFromPort('p_3_count') :
+      p.set_p_3_count(self.getInputFromPort('p_3_count'))
+    if self.hasInputFromPort('p_3_count2') :
+      p.set_p_3_count2(self.getInputFromPort('p_3_count2'))
+    if self.hasInputFromPort('p_3_stride') :
+      p.set_p_3_stride(self.getInputFromPort('p_3_stride'))
+    if self.hasInputFromPort('p_3_stride2') :
+      p.set_p_3_stride2(self.getInputFromPort('p_3_stride2'))
+    if self.hasInputFromPort('p_4_dim') :
+      p.set_p_4_dim(self.getInputFromPort('p_4_dim'))
+    if self.hasInputFromPort('p_4_start') :
+      p.set_p_4_start(self.getInputFromPort('p_4_start'))
+    if self.hasInputFromPort('p_4_start2') :
+      p.set_p_4_start2(self.getInputFromPort('p_4_start2'))
+    if self.hasInputFromPort('p_4_count') :
+      p.set_p_4_count(self.getInputFromPort('p_4_count'))
+    if self.hasInputFromPort('p_4_count2') :
+      p.set_p_4_count2(self.getInputFromPort('p_4_count2'))
+    if self.hasInputFromPort('p_4_stride') :
+      p.set_p_4_stride(self.getInputFromPort('p_4_stride'))
+    if self.hasInputFromPort('p_4_stride2') :
+      p.set_p_4_stride2(self.getInputFromPort('p_4_stride2'))
+    if self.hasInputFromPort('p_5_dim') :
+      p.set_p_5_dim(self.getInputFromPort('p_5_dim'))
+    if self.hasInputFromPort('p_5_start') :
+      p.set_p_5_start(self.getInputFromPort('p_5_start'))
+    if self.hasInputFromPort('p_5_start2') :
+      p.set_p_5_start2(self.getInputFromPort('p_5_start2'))
+    if self.hasInputFromPort('p_5_count') :
+      p.set_p_5_count(self.getInputFromPort('p_5_count'))
+    if self.hasInputFromPort('p_5_count2') :
+      p.set_p_5_count2(self.getInputFromPort('p_5_count2'))
+    if self.hasInputFromPort('p_5_stride') :
+      p.set_p_5_stride(self.getInputFromPort('p_5_stride'))
+    if self.hasInputFromPort('p_5_stride2') :
+      p.set_p_5_stride2(self.getInputFromPort('p_5_stride2'))
+    Full_filename = ''
+    if self.hasInputFromPort('Full filename') :
+      Full_filename = self.getInputFromPort('Full filename')
+    Current_Index = 0
+    if self.hasInputFromPort('Current Index') :
+      Current_Index = self.getInputFromPort('Current Index')
+    results = p.execute(Full_filename, Current_Index)
+    self.setResult('Output 0 Nrrd', results[0])
+    self.setResult('Output 1 Nrrd', results[1])
+    self.setResult('Output 2 Nrrd', results[2])
+    self.setResult('Output 3 Nrrd', results[3])
+    self.setResult('Output 4 Nrrd', results[4])
+    self.setResult('Output 5 Nrrd', results[5])
+    self.setResult('Output 6 Nrrd', results[6])
+    self.setResult('Output 7 Nrrd', results[7])
+    self.setResult('Selected Index', results[8])
+
+class ReadField(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadFieldAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class WriteColorMap(DataIO) :
+  def compute(self) :
+    p = sr_py.WriteColorMapAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    if self.hasInputFromPort('p_exporttype') :
+      p.set_p_exporttype(self.getInputFromPort('p_exporttype'))
+    Input_Data = 0
+    if self.hasInputFromPort('Input Data') :
+      Input_Data = self.getInputFromPort('Input Data')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Input_Data, Filename)
+
+class ReadColorMap2D(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadColorMap2DAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class ReadString(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadStringAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class ReadColorMap(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadColorMapAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class ReadMatrix(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadMatrixAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class WriteString(DataIO) :
+  def compute(self) :
+    p = sr_py.WriteStringAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    String = ''
+    if self.hasInputFromPort('String') :
+      String = self.getInputFromPort('String')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(String, Filename)
+
+class ReadPath(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadPathAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class WriteField(DataIO) :
+  def compute(self) :
+    p = sr_py.WriteFieldAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    if self.hasInputFromPort('p_exporttype') :
+      p.set_p_exporttype(self.getInputFromPort('p_exporttype'))
+    if self.hasInputFromPort('p_increment') :
+      p.set_p_increment(self.getInputFromPort('p_increment'))
+    if self.hasInputFromPort('p_current') :
+      p.set_p_current(self.getInputFromPort('p_current'))
+    Input_Data = 0
+    if self.hasInputFromPort('Input Data') :
+      Input_Data = self.getInputFromPort('Input Data')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Input_Data, Filename)
+
+class ReadBundle(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadBundleAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    if self.hasInputFromPort('p_types') :
+      p.set_p_types(self.getInputFromPort('p_types'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('bundle', results[0])
+    self.setResult('Filename', results[1])
+
+class StreamMatrixFromDisk(DataIO) :
+  def compute(self) :
+    p = sr_py.StreamMatrixFromDiskAlg()
+    if self.hasInputFromPort('p_row_or_col') :
+      p.set_p_row_or_col(self.getInputFromPort('p_row_or_col'))
+    if self.hasInputFromPort('p_slider_min') :
+      p.set_p_slider_min(self.getInputFromPort('p_slider_min'))
+    if self.hasInputFromPort('p_slider_max') :
+      p.set_p_slider_max(self.getInputFromPort('p_slider_max'))
+    if self.hasInputFromPort('p_range_min') :
+      p.set_p_range_min(self.getInputFromPort('p_range_min'))
+    if self.hasInputFromPort('p_range_max') :
+      p.set_p_range_max(self.getInputFromPort('p_range_max'))
+    if self.hasInputFromPort('p_playmode') :
+      p.set_p_playmode(self.getInputFromPort('p_playmode'))
+    if self.hasInputFromPort('p_current') :
+      p.set_p_current(self.getInputFromPort('p_current'))
+    if self.hasInputFromPort('p_execmode') :
+      p.set_p_execmode(self.getInputFromPort('p_execmode'))
+    if self.hasInputFromPort('p_delay') :
+      p.set_p_delay(self.getInputFromPort('p_delay'))
+    if self.hasInputFromPort('p_inc_amount') :
+      p.set_p_inc_amount(self.getInputFromPort('p_inc_amount'))
+    if self.hasInputFromPort('p_send_amount') :
+      p.set_p_send_amount(self.getInputFromPort('p_send_amount'))
+    Indices = 0
+    if self.hasInputFromPort('Indices') :
+      Indices = self.getInputFromPort('Indices')
+    Weights = 0
+    if self.hasInputFromPort('Weights') :
+      Weights = self.getInputFromPort('Weights')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Indices, Weights, Filename)
+    self.setResult('DataVector', results[0])
+    self.setResult('Index', results[1])
+    self.setResult('Scaled Index', results[2])
+    self.setResult('Filename', results[3])
+
+class WriteMatrix(DataIO) :
+  def compute(self) :
+    p = sr_py.WriteMatrixAlg()
+    if self.hasInputFromPort('p_filetype') :
+      p.set_p_filetype(self.getInputFromPort('p_filetype'))
+    if self.hasInputFromPort('p_confirm') :
+      p.set_p_confirm(self.getInputFromPort('p_confirm'))
+    if self.hasInputFromPort('p_confirm_once') :
+      p.set_p_confirm_once(self.getInputFromPort('p_confirm_once'))
+    if self.hasInputFromPort('p_exporttype') :
+      p.set_p_exporttype(self.getInputFromPort('p_exporttype'))
+    if self.hasInputFromPort('p_split') :
+      p.set_p_split(self.getInputFromPort('p_split'))
+    Input_Data = 0
+    if self.hasInputFromPort('Input Data') :
+      Input_Data = self.getInputFromPort('Input Data')
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Input_Data, Filename)
+
+class ReadNrrd(DataIO) :
+  def compute(self) :
+    p = sr_py.ReadNrrdAlg()
+    if self.hasInputFromPort('p_from_env') :
+      p.set_p_from_env(self.getInputFromPort('p_from_env'))
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Output Data', results[0])
+    self.setResult('Filename', results[1])
+
+class JoinFields(NewField) :
+  def compute(self) :
+    p = sr_py.JoinFieldsAlg()
+    if self.hasInputFromPort('p_tolerance') :
+      p.set_p_tolerance(self.getInputFromPort('p_tolerance'))
+    if self.hasInputFromPort('p_force_nodemerge') :
+      p.set_p_force_nodemerge(self.getInputFromPort('p_force_nodemerge'))
+    if self.hasInputFromPort('p_force_pointcloud') :
+      p.set_p_force_pointcloud(self.getInputFromPort('p_force_pointcloud'))
+    if self.hasInputFromPort('p_matchval') :
+      p.set_p_matchval(self.getInputFromPort('p_matchval'))
+    if self.hasInputFromPort('p_meshonly') :
+      p.set_p_meshonly(self.getInputFromPort('p_meshonly'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Output Field', results)
+
+class RefineMeshByIsovalue(NewField) :
+  def compute(self) :
+    p = sr_py.RefineMeshByIsovalueAlg()
+    if self.hasInputFromPort('p_isoval') :
+      p.set_p_isoval(self.getInputFromPort('p_isoval'))
+    if self.hasInputFromPort('p_lte') :
+      p.set_p_lte(self.getInputFromPort('p_lte'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    Optional_Isovalue = 0
+    if self.hasInputFromPort('Optional Isovalue') :
+      Optional_Isovalue = self.getInputFromPort('Optional Isovalue')
+    results = p.execute(Input, Optional_Isovalue)
+    self.setResult('Refined', results[0])
+    self.setResult('Mapping', results[1])
+
+class FairMesh(NewField) :
+  def compute(self) :
+    p = sr_py.FairMeshAlg()
+    if self.hasInputFromPort('p_iterations') :
+      p.set_p_iterations(self.getInputFromPort('p_iterations'))
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    Input_Mesh = 0
+    if self.hasInputFromPort('Input Mesh') :
+      Input_Mesh = self.getInputFromPort('Input Mesh')
+    results = p.execute(Input_Mesh)
+    self.setResult('Faired Mesh', results)
+
+class CreateStructHex(NewField) :
+  def compute(self) :
+    p = sr_py.CreateStructHexAlg()
+    if self.hasInputFromPort('p_sizex') :
+      p.set_p_sizex(self.getInputFromPort('p_sizex'))
+    if self.hasInputFromPort('p_sizey') :
+      p.set_p_sizey(self.getInputFromPort('p_sizey'))
+    if self.hasInputFromPort('p_sizez') :
+      p.set_p_sizez(self.getInputFromPort('p_sizez'))
+    if self.hasInputFromPort('p_padpercent') :
+      p.set_p_padpercent(self.getInputFromPort('p_padpercent'))
+    if self.hasInputFromPort('p_data_at') :
+      p.set_p_data_at(self.getInputFromPort('p_data_at'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Sample Field', results)
+
+class ClipLatVolByIndicesOrWidget(NewField) :
+  def compute(self) :
+    p = sr_py.ClipLatVolByIndicesOrWidgetAlg()
+    if self.hasInputFromPort('p_use_text_bbox') :
+      p.set_p_use_text_bbox(self.getInputFromPort('p_use_text_bbox'))
+    if self.hasInputFromPort('p_text_min_x') :
+      p.set_p_text_min_x(self.getInputFromPort('p_text_min_x'))
+    if self.hasInputFromPort('p_text_min_y') :
+      p.set_p_text_min_y(self.getInputFromPort('p_text_min_y'))
+    if self.hasInputFromPort('p_text_min_z') :
+      p.set_p_text_min_z(self.getInputFromPort('p_text_min_z'))
+    if self.hasInputFromPort('p_text_max_x') :
+      p.set_p_text_max_x(self.getInputFromPort('p_text_max_x'))
+    if self.hasInputFromPort('p_text_max_y') :
+      p.set_p_text_max_y(self.getInputFromPort('p_text_max_y'))
+    if self.hasInputFromPort('p_text_max_z') :
+      p.set_p_text_max_z(self.getInputFromPort('p_text_max_z'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Selection Widget', results[0])
+    self.setResult('Output Field', results[1])
+    self.setResult('MaskVector', results[2])
+
+class GetFieldBoundary(NewField) :
+  def compute(self) :
+    p = sr_py.GetFieldBoundaryAlg()
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('BoundaryField', results[0])
+    self.setResult('Mapping', results[1])
+
+class ConvertMatricesToMesh(NewField) :
+  def compute(self) :
+    p = sr_py.ConvertMatricesToMeshAlg()
+    if self.hasInputFromPort('p_fieldname') :
+      p.set_p_fieldname(self.getInputFromPort('p_fieldname'))
+    if self.hasInputFromPort('p_meshname') :
+      p.set_p_meshname(self.getInputFromPort('p_meshname'))
+    if self.hasInputFromPort('p_fieldbasetype') :
+      p.set_p_fieldbasetype(self.getInputFromPort('p_fieldbasetype'))
+    if self.hasInputFromPort('p_datatype') :
+      p.set_p_datatype(self.getInputFromPort('p_datatype'))
+    Mesh_Elements = 0
+    if self.hasInputFromPort('Mesh Elements') :
+      Mesh_Elements = self.getInputFromPort('Mesh Elements')
+    Mesh_Positions = 0
+    if self.hasInputFromPort('Mesh Positions') :
+      Mesh_Positions = self.getInputFromPort('Mesh Positions')
+    Mesh_Normals = 0
+    if self.hasInputFromPort('Mesh Normals') :
+      Mesh_Normals = self.getInputFromPort('Mesh Normals')
+    results = p.execute(Mesh_Elements, Mesh_Positions, Mesh_Normals)
+    self.setResult('Output Field', results)
+
+class ClipFieldToFieldOrWidget(NewField) :
+  def compute(self) :
+    p = sr_py.ClipFieldToFieldOrWidgetAlg()
+    if self.hasInputFromPort('p_clip_location') :
+      p.set_p_clip_location(self.getInputFromPort('p_clip_location'))
+    if self.hasInputFromPort('p_clipmode') :
+      p.set_p_clipmode(self.getInputFromPort('p_clipmode'))
+    if self.hasInputFromPort('p_autoexecute') :
+      p.set_p_autoexecute(self.getInputFromPort('p_autoexecute'))
+    if self.hasInputFromPort('p_autoinvert') :
+      p.set_p_autoinvert(self.getInputFromPort('p_autoinvert'))
+    if self.hasInputFromPort('p_execmode') :
+      p.set_p_execmode(self.getInputFromPort('p_execmode'))
+    if self.hasInputFromPort('p_center_x') :
+      p.set_p_center_x(self.getInputFromPort('p_center_x'))
+    if self.hasInputFromPort('p_center_y') :
+      p.set_p_center_y(self.getInputFromPort('p_center_y'))
+    if self.hasInputFromPort('p_center_z') :
+      p.set_p_center_z(self.getInputFromPort('p_center_z'))
+    if self.hasInputFromPort('p_right_x') :
+      p.set_p_right_x(self.getInputFromPort('p_right_x'))
+    if self.hasInputFromPort('p_right_y') :
+      p.set_p_right_y(self.getInputFromPort('p_right_y'))
+    if self.hasInputFromPort('p_right_z') :
+      p.set_p_right_z(self.getInputFromPort('p_right_z'))
+    if self.hasInputFromPort('p_down_x') :
+      p.set_p_down_x(self.getInputFromPort('p_down_x'))
+    if self.hasInputFromPort('p_down_y') :
+      p.set_p_down_y(self.getInputFromPort('p_down_y'))
+    if self.hasInputFromPort('p_down_z') :
+      p.set_p_down_z(self.getInputFromPort('p_down_z'))
+    if self.hasInputFromPort('p_in_x') :
+      p.set_p_in_x(self.getInputFromPort('p_in_x'))
+    if self.hasInputFromPort('p_in_y') :
+      p.set_p_in_y(self.getInputFromPort('p_in_y'))
+    if self.hasInputFromPort('p_in_z') :
+      p.set_p_in_z(self.getInputFromPort('p_in_z'))
+    if self.hasInputFromPort('p_scale') :
+      p.set_p_scale(self.getInputFromPort('p_scale'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Clip_Field = 0
+    if self.hasInputFromPort('Clip Field') :
+      Clip_Field = self.getInputFromPort('Clip Field')
+    results = p.execute(Input_Field, Clip_Field)
+    self.setResult('Selection Widget', results[0])
+    self.setResult('Output Field', results[1])
+
+class RefineMeshByIsovalue2(NewField) :
+  def compute(self) :
+    p = sr_py.RefineMeshByIsovalue2Alg()
+    if self.hasInputFromPort('p_isoval') :
+      p.set_p_isoval(self.getInputFromPort('p_isoval'))
+    if self.hasInputFromPort('p_lte') :
+      p.set_p_lte(self.getInputFromPort('p_lte'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    Optional_Isovalue = 0
+    if self.hasInputFromPort('Optional Isovalue') :
+      Optional_Isovalue = self.getInputFromPort('Optional Isovalue')
+    results = p.execute(Input, Optional_Isovalue)
+    self.setResult('Refined', results[0])
+    self.setResult('Mapping', results[1])
+
+class CreateLatVol(NewField) :
+  def compute(self) :
+    p = sr_py.CreateLatVolAlg()
+    if self.hasInputFromPort('p_sizex') :
+      p.set_p_sizex(self.getInputFromPort('p_sizex'))
+    if self.hasInputFromPort('p_sizey') :
+      p.set_p_sizey(self.getInputFromPort('p_sizey'))
+    if self.hasInputFromPort('p_sizez') :
+      p.set_p_sizez(self.getInputFromPort('p_sizez'))
+    if self.hasInputFromPort('p_padpercent') :
+      p.set_p_padpercent(self.getInputFromPort('p_padpercent'))
+    if self.hasInputFromPort('p_data_at') :
+      p.set_p_data_at(self.getInputFromPort('p_data_at'))
+    if self.hasInputFromPort('p_element_size') :
+      p.set_p_element_size(self.getInputFromPort('p_element_size'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    LatVol_Size = 0
+    if self.hasInputFromPort('LatVol Size') :
+      LatVol_Size = self.getInputFromPort('LatVol Size')
+    results = p.execute(Input_Field, LatVol_Size)
+    self.setResult('Output Sample Field', results)
+
+class InterfaceWithCamal(NewField) :
+  def compute(self) :
+    p = sr_py.InterfaceWithCamalAlg()
+    TriSurf = 0
+    if self.hasInputFromPort('TriSurf') :
+      TriSurf = self.getInputFromPort('TriSurf')
+    results = p.execute(TriSurf)
+    self.setResult('TetVol', results)
+
+class ClipVolumeByIsovalue(NewField) :
+  def compute(self) :
+    p = sr_py.ClipVolumeByIsovalueAlg()
+    if self.hasInputFromPort('p_isoval_min') :
+      p.set_p_isoval_min(self.getInputFromPort('p_isoval_min'))
+    if self.hasInputFromPort('p_isoval_max') :
+      p.set_p_isoval_max(self.getInputFromPort('p_isoval_max'))
+    if self.hasInputFromPort('p_isoval') :
+      p.set_p_isoval(self.getInputFromPort('p_isoval'))
+    if self.hasInputFromPort('p_lte') :
+      p.set_p_lte(self.getInputFromPort('p_lte'))
+    if self.hasInputFromPort('p_update_type') :
+      p.set_p_update_type(self.getInputFromPort('p_update_type'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    Optional_Isovalue = 0
+    if self.hasInputFromPort('Optional Isovalue') :
+      Optional_Isovalue = self.getInputFromPort('Optional Isovalue')
+    results = p.execute(Input, Optional_Isovalue)
+    self.setResult('Clipped', results[0])
+    self.setResult('Mapping', results[1])
+
+class RefineMesh(NewField) :
+  def compute(self) :
+    p = sr_py.RefineMeshAlg()
+    if self.hasInputFromPort('p_select') :
+      p.set_p_select(self.getInputFromPort('p_select'))
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    if self.hasInputFromPort('p_isoval') :
+      p.set_p_isoval(self.getInputFromPort('p_isoval'))
+    Mesh = 0
+    if self.hasInputFromPort('Mesh') :
+      Mesh = self.getInputFromPort('Mesh')
+    Isovalue = 0
+    if self.hasInputFromPort('Isovalue') :
+      Isovalue = self.getInputFromPort('Isovalue')
+    results = p.execute(Mesh, Isovalue)
+    self.setResult('RefinedMesh', results[0])
+    self.setResult('Mapping', results[1])
+
+class MergeFields(NewField) :
+  def compute(self) :
+    p = sr_py.MergeFieldsAlg()
+    Container_Mesh = 0
+    if self.hasInputFromPort('Container Mesh') :
+      Container_Mesh = self.getInputFromPort('Container Mesh')
+    Insert_Field = 0
+    if self.hasInputFromPort('Insert Field') :
+      Insert_Field = self.getInputFromPort('Insert Field')
+    results = p.execute(Container_Mesh, Insert_Field)
+    self.setResult('Combined Field', results[0])
+    self.setResult('Extended Insert Field', results[1])
+    self.setResult('Combined To Extended Mapping', results[2])
+
+class GetCentroidsFromMesh(NewField) :
+  def compute(self) :
+    p = sr_py.GetCentroidsFromMeshAlg()
+    TetVolField = 0
+    if self.hasInputFromPort('TetVolField') :
+      TetVolField = self.getInputFromPort('TetVolField')
+    results = p.execute(TetVolField)
+    self.setResult('PointCloudField', results)
+
+class ExtractIsosurfaceByFunction(NewField) :
+  def compute(self) :
+    p = sr_py.ExtractIsosurfaceByFunctionAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_zero_checks') :
+      p.set_p_zero_checks(self.getInputFromPort('p_zero_checks'))
+    if self.hasInputFromPort('p_slice_value_min') :
+      p.set_p_slice_value_min(self.getInputFromPort('p_slice_value_min'))
+    if self.hasInputFromPort('p_slice_value_max') :
+      p.set_p_slice_value_max(self.getInputFromPort('p_slice_value_max'))
+    if self.hasInputFromPort('p_slice_value') :
+      p.set_p_slice_value(self.getInputFromPort('p_slice_value'))
+    if self.hasInputFromPort('p_slice_value_typed') :
+      p.set_p_slice_value_typed(self.getInputFromPort('p_slice_value_typed'))
+    if self.hasInputFromPort('p_slice_value_quantity') :
+      p.set_p_slice_value_quantity(self.getInputFromPort('p_slice_value_quantity'))
+    if self.hasInputFromPort('p_quantity_range') :
+      p.set_p_quantity_range(self.getInputFromPort('p_quantity_range'))
+    if self.hasInputFromPort('p_quantity_clusive') :
+      p.set_p_quantity_clusive(self.getInputFromPort('p_quantity_clusive'))
+    if self.hasInputFromPort('p_quantity_min') :
+      p.set_p_quantity_min(self.getInputFromPort('p_quantity_min'))
+    if self.hasInputFromPort('p_quantity_max') :
+      p.set_p_quantity_max(self.getInputFromPort('p_quantity_max'))
+    if self.hasInputFromPort('p_quantity_list') :
+      p.set_p_quantity_list(self.getInputFromPort('p_quantity_list'))
+    if self.hasInputFromPort('p_slice_value_list') :
+      p.set_p_slice_value_list(self.getInputFromPort('p_slice_value_list'))
+    if self.hasInputFromPort('p_matrix_list') :
+      p.set_p_matrix_list(self.getInputFromPort('p_matrix_list'))
+    if self.hasInputFromPort('p_algorithm') :
+      p.set_p_algorithm(self.getInputFromPort('p_algorithm'))
+    if self.hasInputFromPort('p_active_slice_value_selection_tab') :
+      p.set_p_active_slice_value_selection_tab(self.getInputFromPort('p_active_slice_value_selection_tab'))
+    if self.hasInputFromPort('p_active_tab') :
+      p.set_p_active_tab(self.getInputFromPort('p_active_tab'))
+    if self.hasInputFromPort('p_update_type') :
+      p.set_p_update_type(self.getInputFromPort('p_update_type'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Optional_Slice_values = 0
+    if self.hasInputFromPort('Optional Slice values') :
+      Optional_Slice_values = self.getInputFromPort('Optional Slice values')
+    results = p.execute(Input_Field, Optional_Slice_values)
+    self.setResult('Output Field', results)
+
+class MergeTriSurfs(NewField) :
+  def compute(self) :
+    p = sr_py.MergeTriSurfsAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class InterfaceWithTetGen(NewField) :
+  def compute(self) :
+    p = sr_py.InterfaceWithTetGenAlg()
+    if self.hasInputFromPort('p_switch') :
+      p.set_p_switch(self.getInputFromPort('p_switch'))
+    Main = 0
+    if self.hasInputFromPort('Main') :
+      Main = self.getInputFromPort('Main')
+    Points = 0
+    if self.hasInputFromPort('Points') :
+      Points = self.getInputFromPort('Points')
+    Region_Attribs = 0
+    if self.hasInputFromPort('Region Attribs') :
+      Region_Attribs = self.getInputFromPort('Region Attribs')
+    Regions = 0
+    if self.hasInputFromPort('Regions') :
+      Regions = self.getInputFromPort('Regions')
+    results = p.execute(Main, Points, Region_Attribs, Regions)
+    self.setResult('TetVol', results)
+
+class CreateImage(NewField) :
+  def compute(self) :
+    p = sr_py.CreateImageAlg()
+    if self.hasInputFromPort('p_sizex') :
+      p.set_p_sizex(self.getInputFromPort('p_sizex'))
+    if self.hasInputFromPort('p_sizey') :
+      p.set_p_sizey(self.getInputFromPort('p_sizey'))
+    if self.hasInputFromPort('p_sizez') :
+      p.set_p_sizez(self.getInputFromPort('p_sizez'))
+    if self.hasInputFromPort('p_z_value') :
+      p.set_p_z_value(self.getInputFromPort('p_z_value'))
+    if self.hasInputFromPort('p_auto_size') :
+      p.set_p_auto_size(self.getInputFromPort('p_auto_size'))
+    if self.hasInputFromPort('p_axis') :
+      p.set_p_axis(self.getInputFromPort('p_axis'))
+    if self.hasInputFromPort('p_padpercent') :
+      p.set_p_padpercent(self.getInputFromPort('p_padpercent'))
+    if self.hasInputFromPort('p_pos') :
+      p.set_p_pos(self.getInputFromPort('p_pos'))
+    if self.hasInputFromPort('p_data_at') :
+      p.set_p_data_at(self.getInputFromPort('p_data_at'))
+    if self.hasInputFromPort('p_update_type') :
+      p.set_p_update_type(self.getInputFromPort('p_update_type'))
+    if self.hasInputFromPort('p_corigin_x') :
+      p.set_p_corigin_x(self.getInputFromPort('p_corigin_x'))
+    if self.hasInputFromPort('p_corigin_y') :
+      p.set_p_corigin_y(self.getInputFromPort('p_corigin_y'))
+    if self.hasInputFromPort('p_corigin_z') :
+      p.set_p_corigin_z(self.getInputFromPort('p_corigin_z'))
+    if self.hasInputFromPort('p_cnormal_x') :
+      p.set_p_cnormal_x(self.getInputFromPort('p_cnormal_x'))
+    if self.hasInputFromPort('p_cnormal_y') :
+      p.set_p_cnormal_y(self.getInputFromPort('p_cnormal_y'))
+    if self.hasInputFromPort('p_cnormal_z') :
+      p.set_p_cnormal_z(self.getInputFromPort('p_cnormal_z'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Sample Field', results)
+
+class InsertHexVolSheetAlongSurface(NewField) :
+  def compute(self) :
+    p = sr_py.InsertHexVolSheetAlongSurfaceAlg()
+    if self.hasInputFromPort('p_side') :
+      p.set_p_side(self.getInputFromPort('p_side'))
+    if self.hasInputFromPort('p_addlayer') :
+      p.set_p_addlayer(self.getInputFromPort('p_addlayer'))
+    HexField = 0
+    if self.hasInputFromPort('HexField') :
+      HexField = self.getInputFromPort('HexField')
+    TriField = 0
+    if self.hasInputFromPort('TriField') :
+      TriField = self.getInputFromPort('TriField')
+    results = p.execute(HexField, TriField)
+    self.setResult('Side1Field', results[0])
+    self.setResult('Side2Field', results[1])
+
+class GenerateSinglePointProbeFromField(NewField) :
+  def compute(self) :
+    p = sr_py.GenerateSinglePointProbeFromFieldAlg()
+    if self.hasInputFromPort('p_main_frame') :
+      p.set_p_main_frame(self.getInputFromPort('p_main_frame'))
+    if self.hasInputFromPort('p_locx') :
+      p.set_p_locx(self.getInputFromPort('p_locx'))
+    if self.hasInputFromPort('p_locy') :
+      p.set_p_locy(self.getInputFromPort('p_locy'))
+    if self.hasInputFromPort('p_locz') :
+      p.set_p_locz(self.getInputFromPort('p_locz'))
+    if self.hasInputFromPort('p_value') :
+      p.set_p_value(self.getInputFromPort('p_value'))
+    if self.hasInputFromPort('p_node') :
+      p.set_p_node(self.getInputFromPort('p_node'))
+    if self.hasInputFromPort('p_edge') :
+      p.set_p_edge(self.getInputFromPort('p_edge'))
+    if self.hasInputFromPort('p_face') :
+      p.set_p_face(self.getInputFromPort('p_face'))
+    if self.hasInputFromPort('p_cell') :
+      p.set_p_cell(self.getInputFromPort('p_cell'))
+    if self.hasInputFromPort('p_show_value') :
+      p.set_p_show_value(self.getInputFromPort('p_show_value'))
+    if self.hasInputFromPort('p_show_node') :
+      p.set_p_show_node(self.getInputFromPort('p_show_node'))
+    if self.hasInputFromPort('p_show_edge') :
+      p.set_p_show_edge(self.getInputFromPort('p_show_edge'))
+    if self.hasInputFromPort('p_show_face') :
+      p.set_p_show_face(self.getInputFromPort('p_show_face'))
+    if self.hasInputFromPort('p_show_cell') :
+      p.set_p_show_cell(self.getInputFromPort('p_show_cell'))
+    if self.hasInputFromPort('p_probe_scale') :
+      p.set_p_probe_scale(self.getInputFromPort('p_probe_scale'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('GenerateSinglePointProbeFromField Widget', results[0])
+    self.setResult('GenerateSinglePointProbeFromField Point', results[1])
+    self.setResult('Element Index', results[2])
+
+class InterfaceWithCubit(NewField) :
+  def compute(self) :
+    p = sr_py.InterfaceWithCubitAlg()
+    if self.hasInputFromPort('p_cubitdir') :
+      p.set_p_cubitdir(self.getInputFromPort('p_cubitdir'))
+    if self.hasInputFromPort('p_ncdump') :
+      p.set_p_ncdump(self.getInputFromPort('p_ncdump'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    PointCloudField = 0
+    if self.hasInputFromPort('PointCloudField') :
+      PointCloudField = self.getInputFromPort('PointCloudField')
+    results = p.execute(Field, PointCloudField)
+    self.setResult('Field', results)
+
+class ClipFieldByFunction(NewField) :
+  def compute(self) :
+    p = sr_py.ClipFieldByFunctionAlg()
+    if self.hasInputFromPort('p_mode') :
+      p.set_p_mode(self.getInputFromPort('p_mode'))
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Function, Input)
+    self.setResult('Clipped', results[0])
+    self.setResult('Mapping', results[1])
+    self.setResult('MaskVector', results[2])
+
+class GetDomainBoundary(NewField) :
+  def compute(self) :
+    p = sr_py.GetDomainBoundaryAlg()
+    if self.hasInputFromPort('p_userange') :
+      p.set_p_userange(self.getInputFromPort('p_userange'))
+    if self.hasInputFromPort('p_minrange') :
+      p.set_p_minrange(self.getInputFromPort('p_minrange'))
+    if self.hasInputFromPort('p_maxrange') :
+      p.set_p_maxrange(self.getInputFromPort('p_maxrange'))
+    if self.hasInputFromPort('p_usevalue') :
+      p.set_p_usevalue(self.getInputFromPort('p_usevalue'))
+    if self.hasInputFromPort('p_value') :
+      p.set_p_value(self.getInputFromPort('p_value'))
+    if self.hasInputFromPort('p_includeouterboundary') :
+      p.set_p_includeouterboundary(self.getInputFromPort('p_includeouterboundary'))
+    if self.hasInputFromPort('p_innerboundaryonly') :
+      p.set_p_innerboundaryonly(self.getInputFromPort('p_innerboundaryonly'))
+    if self.hasInputFromPort('p_noinnerboundary') :
+      p.set_p_noinnerboundary(self.getInputFromPort('p_noinnerboundary'))
+    if self.hasInputFromPort('p_disconnect') :
+      p.set_p_disconnect(self.getInputFromPort('p_disconnect'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    MinValueValue = 0
+    if self.hasInputFromPort('MinValueValue') :
+      MinValueValue = self.getInputFromPort('MinValueValue')
+    MaxValue = 0
+    if self.hasInputFromPort('MaxValue') :
+      MaxValue = self.getInputFromPort('MaxValue')
+    results = p.execute(Field, MinValueValue, MaxValue)
+    self.setResult('Field', results)
+
+class CollectFields(NewField) :
+  def compute(self) :
+    p = sr_py.CollectFieldsAlg()
+    if self.hasInputFromPort('p_buffersize') :
+      p.set_p_buffersize(self.getInputFromPort('p_buffersize'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    BufferSize = 0
+    if self.hasInputFromPort('BufferSize') :
+      BufferSize = self.getInputFromPort('BufferSize')
+    results = p.execute(Field, BufferSize)
+    self.setResult('Fields', results)
+
+class GeneratePointSamplesFromField(NewField) :
+  def compute(self) :
+    p = sr_py.GeneratePointSamplesFromFieldAlg()
+    if self.hasInputFromPort('p_num_seeds') :
+      p.set_p_num_seeds(self.getInputFromPort('p_num_seeds'))
+    if self.hasInputFromPort('p_probe_scale') :
+      p.set_p_probe_scale(self.getInputFromPort('p_probe_scale'))
+    if self.hasInputFromPort('p_send') :
+      p.set_p_send(self.getInputFromPort('p_send'))
+    if self.hasInputFromPort('p_widget') :
+      p.set_p_widget(self.getInputFromPort('p_widget'))
+    if self.hasInputFromPort('p_red') :
+      p.set_p_red(self.getInputFromPort('p_red'))
+    if self.hasInputFromPort('p_green') :
+      p.set_p_green(self.getInputFromPort('p_green'))
+    if self.hasInputFromPort('p_blue') :
+      p.set_p_blue(self.getInputFromPort('p_blue'))
+    if self.hasInputFromPort('p_auto_execute') :
+      p.set_p_auto_execute(self.getInputFromPort('p_auto_execute'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('GeneratePointSamplesFromField Widget', results[0])
+    self.setResult('GeneratePointSamplesFromField Point', results[1])
+
+class GeneratePointSamplesFromFieldOrWidget(NewField) :
+  def compute(self) :
+    p = sr_py.GeneratePointSamplesFromFieldOrWidgetAlg()
+    if self.hasInputFromPort('p_wtype') :
+      p.set_p_wtype(self.getInputFromPort('p_wtype'))
+    if self.hasInputFromPort('p_endpoints') :
+      p.set_p_endpoints(self.getInputFromPort('p_endpoints'))
+    if self.hasInputFromPort('p_maxseeds') :
+      p.set_p_maxseeds(self.getInputFromPort('p_maxseeds'))
+    if self.hasInputFromPort('p_numseeds') :
+      p.set_p_numseeds(self.getInputFromPort('p_numseeds'))
+    if self.hasInputFromPort('p_rngseed') :
+      p.set_p_rngseed(self.getInputFromPort('p_rngseed'))
+    if self.hasInputFromPort('p_rnginc') :
+      p.set_p_rnginc(self.getInputFromPort('p_rnginc'))
+    if self.hasInputFromPort('p_clamp') :
+      p.set_p_clamp(self.getInputFromPort('p_clamp'))
+    if self.hasInputFromPort('p_autoexecute') :
+      p.set_p_autoexecute(self.getInputFromPort('p_autoexecute'))
+    if self.hasInputFromPort('p_dist') :
+      p.set_p_dist(self.getInputFromPort('p_dist'))
+    if self.hasInputFromPort('p_whichtab') :
+      p.set_p_whichtab(self.getInputFromPort('p_whichtab'))
+    Field_to_Sample = 0
+    if self.hasInputFromPort('Field to Sample') :
+      Field_to_Sample = self.getInputFromPort('Field to Sample')
+    results = p.execute(Field_to_Sample)
+    self.setResult('Samples', results[0])
+    self.setResult('Sampling Widget', results[1])
+
+class DecimateTriSurf(NewField) :
+  def compute(self) :
+    p = sr_py.DecimateTriSurfAlg()
+    TriSurf = 0
+    if self.hasInputFromPort('TriSurf') :
+      TriSurf = self.getInputFromPort('TriSurf')
+    results = p.execute(TriSurf)
+    self.setResult('Decimated', results)
+
+class GetSliceFromStructuredFieldByIndices(NewField) :
+  def compute(self) :
+    p = sr_py.GetSliceFromStructuredFieldByIndicesAlg()
+    if self.hasInputFromPort('p_axis') :
+      p.set_p_axis(self.getInputFromPort('p_axis'))
+    if self.hasInputFromPort('p_dims') :
+      p.set_p_dims(self.getInputFromPort('p_dims'))
+    if self.hasInputFromPort('p_dim_i') :
+      p.set_p_dim_i(self.getInputFromPort('p_dim_i'))
+    if self.hasInputFromPort('p_dim_j') :
+      p.set_p_dim_j(self.getInputFromPort('p_dim_j'))
+    if self.hasInputFromPort('p_dim_k') :
+      p.set_p_dim_k(self.getInputFromPort('p_dim_k'))
+    if self.hasInputFromPort('p_index_i') :
+      p.set_p_index_i(self.getInputFromPort('p_index_i'))
+    if self.hasInputFromPort('p_index_j') :
+      p.set_p_index_j(self.getInputFromPort('p_index_j'))
+    if self.hasInputFromPort('p_index_k') :
+      p.set_p_index_k(self.getInputFromPort('p_index_k'))
+    if self.hasInputFromPort('p_update_type') :
+      p.set_p_update_type(self.getInputFromPort('p_update_type'))
+    if self.hasInputFromPort('p_continuous') :
+      p.set_p_continuous(self.getInputFromPort('p_continuous'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Input_Matrix = 0
+    if self.hasInputFromPort('Input Matrix') :
+      Input_Matrix = self.getInputFromPort('Input Matrix')
+    results = p.execute(Input_Field, Input_Matrix)
+    self.setResult('Output Field', results[0])
+    self.setResult('Output Matrix', results[1])
+
+class RemoveHexVolSheet(NewField) :
+  def compute(self) :
+    p = sr_py.RemoveHexVolSheetAlg()
+    if self.hasInputFromPort('p_edge_list') :
+      p.set_p_edge_list(self.getInputFromPort('p_edge_list'))
+    HexField = 0
+    if self.hasInputFromPort('HexField') :
+      HexField = self.getInputFromPort('HexField')
+    results = p.execute(HexField)
+    self.setResult('NewHexField', results[0])
+    self.setResult('ExtractedHexes', results[1])
+
+class SubsampleStructuredFieldByIndices(NewField) :
+  def compute(self) :
+    p = sr_py.SubsampleStructuredFieldByIndicesAlg()
+    if self.hasInputFromPort('p_power_app') :
+      p.set_p_power_app(self.getInputFromPort('p_power_app'))
+    if self.hasInputFromPort('p_wrap') :
+      p.set_p_wrap(self.getInputFromPort('p_wrap'))
+    if self.hasInputFromPort('p_dims') :
+      p.set_p_dims(self.getInputFromPort('p_dims'))
+    if self.hasInputFromPort('p_dim_i') :
+      p.set_p_dim_i(self.getInputFromPort('p_dim_i'))
+    if self.hasInputFromPort('p_dim_j') :
+      p.set_p_dim_j(self.getInputFromPort('p_dim_j'))
+    if self.hasInputFromPort('p_dim_k') :
+      p.set_p_dim_k(self.getInputFromPort('p_dim_k'))
+    if self.hasInputFromPort('p_start_i') :
+      p.set_p_start_i(self.getInputFromPort('p_start_i'))
+    if self.hasInputFromPort('p_start_j') :
+      p.set_p_start_j(self.getInputFromPort('p_start_j'))
+    if self.hasInputFromPort('p_start_k') :
+      p.set_p_start_k(self.getInputFromPort('p_start_k'))
+    if self.hasInputFromPort('p_stop_i') :
+      p.set_p_stop_i(self.getInputFromPort('p_stop_i'))
+    if self.hasInputFromPort('p_stop_j') :
+      p.set_p_stop_j(self.getInputFromPort('p_stop_j'))
+    if self.hasInputFromPort('p_stop_k') :
+      p.set_p_stop_k(self.getInputFromPort('p_stop_k'))
+    if self.hasInputFromPort('p_stride_i') :
+      p.set_p_stride_i(self.getInputFromPort('p_stride_i'))
+    if self.hasInputFromPort('p_stride_j') :
+      p.set_p_stride_j(self.getInputFromPort('p_stride_j'))
+    if self.hasInputFromPort('p_stride_k') :
+      p.set_p_stride_k(self.getInputFromPort('p_stride_k'))
+    if self.hasInputFromPort('p_wrap_i') :
+      p.set_p_wrap_i(self.getInputFromPort('p_wrap_i'))
+    if self.hasInputFromPort('p_wrap_j') :
+      p.set_p_wrap_j(self.getInputFromPort('p_wrap_j'))
+    if self.hasInputFromPort('p_wrap_k') :
+      p.set_p_wrap_k(self.getInputFromPort('p_wrap_k'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Input_Matrix = 0
+    if self.hasInputFromPort('Input Matrix') :
+      Input_Matrix = self.getInputFromPort('Input Matrix')
+    results = p.execute(Input_Field, Input_Matrix)
+    self.setResult('Output Field', results[0])
+    self.setResult('Output Matrix', results[1])
+
+class GetAllSegmentationBoundaries(NewField) :
+  def compute(self) :
+    p = sr_py.GetAllSegmentationBoundariesAlg()
+    Segmentations = 0
+    if self.hasInputFromPort('Segmentations') :
+      Segmentations = self.getInputFromPort('Segmentations')
+    results = p.execute(Segmentations)
+    self.setResult('Boundaries', results)
+
+class ClipFieldWithSeed(NewField) :
+  def compute(self) :
+    p = sr_py.ClipFieldWithSeedAlg()
+    if self.hasInputFromPort('p_mode') :
+      p.set_p_mode(self.getInputFromPort('p_mode'))
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    Seeds = 0
+    if self.hasInputFromPort('Seeds') :
+      Seeds = self.getInputFromPort('Seeds')
+    results = p.execute(Function, Input, Seeds)
+    self.setResult('Clipped', results[0])
+    self.setResult('Mapping', results[1])
+    self.setResult('MaskVector', results[2])
+
+class SplitNodesByDomain(NewField) :
+  def compute(self) :
+    p = sr_py.SplitNodesByDomainAlg()
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('SplitField', results)
+
+class ApplyMappingMatrix(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ApplyMappingMatrixAlg()
+    Source = 0
+    if self.hasInputFromPort('Source') :
+      Source = self.getInputFromPort('Source')
+    Destination = 0
+    if self.hasInputFromPort('Destination') :
+      Destination = self.getInputFromPort('Destination')
+    Mapping = 0
+    if self.hasInputFromPort('Mapping') :
+      Mapping = self.getInputFromPort('Mapping')
+    results = p.execute(Source, Destination, Mapping)
+    self.setResult('Output', results)
+
+class MaskLatVolWithTriSurf(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.MaskLatVolWithTriSurfAlg()
+    LatVolField = 0
+    if self.hasInputFromPort('LatVolField') :
+      LatVolField = self.getInputFromPort('LatVolField')
+    TriSurfField = 0
+    if self.hasInputFromPort('TriSurfField') :
+      TriSurfField = self.getInputFromPort('TriSurfField')
+    results = p.execute(LatVolField, TriSurfField)
+    self.setResult('LatVol Mask', results)
+
+class ConvertFieldBasis(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ConvertFieldBasisAlg()
+    if self.hasInputFromPort('p_output_basis') :
+      p.set_p_output_basis(self.getInputFromPort('p_output_basis'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('Output', results[0])
+    self.setResult('Mapping', results[1])
+
+class ReportMeshQualityMeasures(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ReportMeshQualityMeasuresAlg()
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('Checked', results)
+
+class SelectAndSetFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.SelectAndSetFieldDataAlg()
+    if self.hasInputFromPort('p_selection1') :
+      p.set_p_selection1(self.getInputFromPort('p_selection1'))
+    if self.hasInputFromPort('p_function1') :
+      p.set_p_function1(self.getInputFromPort('p_function1'))
+    if self.hasInputFromPort('p_selection2') :
+      p.set_p_selection2(self.getInputFromPort('p_selection2'))
+    if self.hasInputFromPort('p_function2') :
+      p.set_p_function2(self.getInputFromPort('p_function2'))
+    if self.hasInputFromPort('p_selection3') :
+      p.set_p_selection3(self.getInputFromPort('p_selection3'))
+    if self.hasInputFromPort('p_function3') :
+      p.set_p_function3(self.getInputFromPort('p_function3'))
+    if self.hasInputFromPort('p_selection4') :
+      p.set_p_selection4(self.getInputFromPort('p_selection4'))
+    if self.hasInputFromPort('p_function4') :
+      p.set_p_function4(self.getInputFromPort('p_function4'))
+    if self.hasInputFromPort('p_functiondef') :
+      p.set_p_functiondef(self.getInputFromPort('p_functiondef'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Field, Array)
+    self.setResult('Field', results)
+
+class CalculateFieldData3(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateFieldData3Alg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    Field1 = 0
+    if self.hasInputFromPort('Field1') :
+      Field1 = self.getInputFromPort('Field1')
+    Field2 = 0
+    if self.hasInputFromPort('Field2') :
+      Field2 = self.getInputFromPort('Field2')
+    Field3 = 0
+    if self.hasInputFromPort('Field3') :
+      Field3 = self.getInputFromPort('Field3')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Field1, Field2, Field3, Function, Array)
+    self.setResult('Field', results)
+
+class SetFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.SetFieldDataAlg()
+    if self.hasInputFromPort('p_keepscalartype') :
+      p.set_p_keepscalartype(self.getInputFromPort('p_keepscalartype'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Matrix_Data = 0
+    if self.hasInputFromPort('Matrix Data') :
+      Matrix_Data = self.getInputFromPort('Matrix Data')
+    Nrrd_Data = 0
+    if self.hasInputFromPort('Nrrd Data') :
+      Nrrd_Data = self.getInputFromPort('Nrrd Data')
+    results = p.execute(Field, Matrix_Data, Nrrd_Data)
+    self.setResult('Field', results)
+
+class SwapFieldDataWithMatrixEntries(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.SwapFieldDataWithMatrixEntriesAlg()
+    if self.hasInputFromPort('p_preserve_scalar_type') :
+      p.set_p_preserve_scalar_type(self.getInputFromPort('p_preserve_scalar_type'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Input_Matrix = 0
+    if self.hasInputFromPort('Input Matrix') :
+      Input_Matrix = self.getInputFromPort('Input Matrix')
+    results = p.execute(Input_Field, Input_Matrix)
+    self.setResult('Output Field', results[0])
+    self.setResult('Output Matrix', results[1])
+
+class ConvertLatVolDataFromElemToNode(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ConvertLatVolDataFromElemToNodeAlg()
+    Elem_Field = 0
+    if self.hasInputFromPort('Elem Field') :
+      Elem_Field = self.getInputFromPort('Elem Field')
+    results = p.execute(Elem_Field)
+    self.setResult('Node Field', results)
+
+class CalculateNodeNormals(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateNodeNormalsAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Input_Point = 0
+    if self.hasInputFromPort('Input Point') :
+      Input_Point = self.getInputFromPort('Input Point')
+    results = p.execute(Input_Field, Input_Point)
+    self.setResult('Output Field', results)
+
+class CalculateVectorMagnitudes(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateVectorMagnitudesAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output CalculateVectorMagnitudes', results)
+
+class ConvertIndicesToFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ConvertIndicesToFieldDataAlg()
+    if self.hasInputFromPort('p_outputtype') :
+      p.set_p_outputtype(self.getInputFromPort('p_outputtype'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Data = 0
+    if self.hasInputFromPort('Data') :
+      Data = self.getInputFromPort('Data')
+    results = p.execute(Field, Data)
+    self.setResult('Field', results)
+
+class CalculateDistanceToFieldBoundary(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateDistanceToFieldBoundaryAlg()
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('DistanceField', results)
+
+class MapFieldDataFromSourceToDestination(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.MapFieldDataFromSourceToDestinationAlg()
+    if self.hasInputFromPort('p_interpolation_basis') :
+      p.set_p_interpolation_basis(self.getInputFromPort('p_interpolation_basis'))
+    if self.hasInputFromPort('p_map_source_to_single_dest') :
+      p.set_p_map_source_to_single_dest(self.getInputFromPort('p_map_source_to_single_dest'))
+    if self.hasInputFromPort('p_exhaustive_search') :
+      p.set_p_exhaustive_search(self.getInputFromPort('p_exhaustive_search'))
+    if self.hasInputFromPort('p_exhaustive_search_max_dist') :
+      p.set_p_exhaustive_search_max_dist(self.getInputFromPort('p_exhaustive_search_max_dist'))
+    if self.hasInputFromPort('p_np') :
+      p.set_p_np(self.getInputFromPort('p_np'))
+    Source = 0
+    if self.hasInputFromPort('Source') :
+      Source = self.getInputFromPort('Source')
+    Destination = 0
+    if self.hasInputFromPort('Destination') :
+      Destination = self.getInputFromPort('Destination')
+    results = p.execute(Source, Destination)
+    self.setResult('Remapped Destination', results)
+
+class SelectAndSetFieldData3(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.SelectAndSetFieldData3Alg()
+    if self.hasInputFromPort('p_selection1') :
+      p.set_p_selection1(self.getInputFromPort('p_selection1'))
+    if self.hasInputFromPort('p_function1') :
+      p.set_p_function1(self.getInputFromPort('p_function1'))
+    if self.hasInputFromPort('p_selection2') :
+      p.set_p_selection2(self.getInputFromPort('p_selection2'))
+    if self.hasInputFromPort('p_function2') :
+      p.set_p_function2(self.getInputFromPort('p_function2'))
+    if self.hasInputFromPort('p_selection3') :
+      p.set_p_selection3(self.getInputFromPort('p_selection3'))
+    if self.hasInputFromPort('p_function3') :
+      p.set_p_function3(self.getInputFromPort('p_function3'))
+    if self.hasInputFromPort('p_selection4') :
+      p.set_p_selection4(self.getInputFromPort('p_selection4'))
+    if self.hasInputFromPort('p_function4') :
+      p.set_p_function4(self.getInputFromPort('p_function4'))
+    if self.hasInputFromPort('p_functiondef') :
+      p.set_p_functiondef(self.getInputFromPort('p_functiondef'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    Field1 = 0
+    if self.hasInputFromPort('Field1') :
+      Field1 = self.getInputFromPort('Field1')
+    Field2 = 0
+    if self.hasInputFromPort('Field2') :
+      Field2 = self.getInputFromPort('Field2')
+    Field3 = 0
+    if self.hasInputFromPort('Field3') :
+      Field3 = self.getInputFromPort('Field3')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Field1, Field2, Field3, Array)
+    self.setResult('Field', results)
+
+class CreateFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CreateFieldDataAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    if self.hasInputFromPort('p_basis') :
+      p.set_p_basis(self.getInputFromPort('p_basis'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    DataArray = 0
+    if self.hasInputFromPort('DataArray') :
+      DataArray = self.getInputFromPort('DataArray')
+    results = p.execute(Field, Function, DataArray)
+    self.setResult('Field', results)
+
+class ConvertLatVolDataFromNodeToElem(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ConvertLatVolDataFromNodeToElemAlg()
+    Node_Field = 0
+    if self.hasInputFromPort('Node Field') :
+      Node_Field = self.getInputFromPort('Node Field')
+    results = p.execute(Node_Field)
+    self.setResult('Elem Field', results)
+
+class CalculateFieldDataCompiled(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateFieldDataCompiledAlg()
+    if self.hasInputFromPort('p_outputdatatype') :
+      p.set_p_outputdatatype(self.getInputFromPort('p_outputdatatype'))
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_cache') :
+      p.set_p_cache(self.getInputFromPort('p_cache'))
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Function, Input_Field)
+    self.setResult('Output Field', results)
+
+class MapFieldDataFromElemToNode(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.MapFieldDataFromElemToNodeAlg()
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Field', results)
+
+class ApplyFilterToFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ApplyFilterToFieldDataAlg()
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    if self.hasInputFromPort('p_ed_method') :
+      p.set_p_ed_method(self.getInputFromPort('p_ed_method'))
+    if self.hasInputFromPort('p_ed_iterations') :
+      p.set_p_ed_iterations(self.getInputFromPort('p_ed_iterations'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Field', results)
+
+class GetFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.GetFieldDataAlg()
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Data', results)
+
+class CalculateFieldData2(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateFieldData2Alg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    Field1 = 0
+    if self.hasInputFromPort('Field1') :
+      Field1 = self.getInputFromPort('Field1')
+    Field2 = 0
+    if self.hasInputFromPort('Field2') :
+      Field2 = self.getInputFromPort('Field2')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Field1, Field2, Function, Array)
+    self.setResult('Field', results)
+
+class CalculateLatVolGradientsAtNodes(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateLatVolGradientsAtNodesAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Gradient', results)
+
+class CalculateGradients(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateGradientsAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output CalculateGradients', results)
+
+class CalculateSignedDistanceToField(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateSignedDistanceToFieldAlg()
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    ObjectField = 0
+    if self.hasInputFromPort('ObjectField') :
+      ObjectField = self.getInputFromPort('ObjectField')
+    results = p.execute(Field, ObjectField)
+    self.setResult('SignedDistanceField', results)
+
+class CalculateInsideWhichField(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateInsideWhichFieldAlg()
+    if self.hasInputFromPort('p_outputbasis') :
+      p.set_p_outputbasis(self.getInputFromPort('p_outputbasis'))
+    if self.hasInputFromPort('p_outputtype') :
+      p.set_p_outputtype(self.getInputFromPort('p_outputtype'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Object = 0
+    if self.hasInputFromPort('Object') :
+      Object = self.getInputFromPort('Object')
+    results = p.execute(Field, Object)
+    self.setResult('Field', results)
+
+class MapFieldDataFromNodeToElem(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.MapFieldDataFromNodeToElemAlg()
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Field', results)
+
+class ConvertFieldDataType(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.ConvertFieldDataTypeAlg()
+    if self.hasInputFromPort('p_outputdatatype') :
+      p.set_p_outputdatatype(self.getInputFromPort('p_outputdatatype'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class CalculateIsInsideField(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateIsInsideFieldAlg()
+    if self.hasInputFromPort('p_outputtype') :
+      p.set_p_outputtype(self.getInputFromPort('p_outputtype'))
+    if self.hasInputFromPort('p_outval') :
+      p.set_p_outval(self.getInputFromPort('p_outval'))
+    if self.hasInputFromPort('p_inval') :
+      p.set_p_inval(self.getInputFromPort('p_inval'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    ObjectField = 0
+    if self.hasInputFromPort('ObjectField') :
+      ObjectField = self.getInputFromPort('ObjectField')
+    results = p.execute(Field, ObjectField)
+    self.setResult('Field', results)
+
+class CalculateFieldData(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateFieldDataAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Field, Function, Array)
+    self.setResult('Field', results)
+
+class CalculateDistanceToField(ChangeFieldData) :
+  def compute(self) :
+    p = sr_py.CalculateDistanceToFieldAlg()
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    ObjectField = 0
+    if self.hasInputFromPort('ObjectField') :
+      ObjectField = self.getInputFromPort('ObjectField')
+    results = p.execute(Field, ObjectField)
+    self.setResult('DistanceField', results)
+
+class TransformPlanarMesh(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.TransformPlanarMeshAlg()
+    if self.hasInputFromPort('p_axis') :
+      p.set_p_axis(self.getInputFromPort('p_axis'))
+    if self.hasInputFromPort('p_invert') :
+      p.set_p_invert(self.getInputFromPort('p_invert'))
+    if self.hasInputFromPort('p_trans_x') :
+      p.set_p_trans_x(self.getInputFromPort('p_trans_x'))
+    if self.hasInputFromPort('p_trans_y') :
+      p.set_p_trans_y(self.getInputFromPort('p_trans_y'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Index_Matrix = 0
+    if self.hasInputFromPort('Index Matrix') :
+      Index_Matrix = self.getInputFromPort('Index Matrix')
+    results = p.execute(Input_Field, Index_Matrix)
+    self.setResult('Transformed Field', results)
+
+class ConvertMeshToUnstructuredMesh(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ConvertMeshToUnstructuredMeshAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class ConvertQuadSurfToTriSurf(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ConvertQuadSurfToTriSurfAlg()
+    QuadSurf = 0
+    if self.hasInputFromPort('QuadSurf') :
+      QuadSurf = self.getInputFromPort('QuadSurf')
+    results = p.execute(QuadSurf)
+    self.setResult('TriSurf', results)
+
+class TransformMeshWithFunction(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.TransformMeshWithFunctionAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class ConvertHexVolToTetVol(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ConvertHexVolToTetVolAlg()
+    HexVol = 0
+    if self.hasInputFromPort('HexVol') :
+      HexVol = self.getInputFromPort('HexVol')
+    results = p.execute(HexVol)
+    self.setResult('TetVol', results)
+
+class ConvertMeshCoordinateSystem(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ConvertMeshCoordinateSystemAlg()
+    if self.hasInputFromPort('p_oldsystem') :
+      p.set_p_oldsystem(self.getInputFromPort('p_oldsystem'))
+    if self.hasInputFromPort('p_newsystem') :
+      p.set_p_newsystem(self.getInputFromPort('p_newsystem'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class ConvertMeshToPointCloud(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ConvertMeshToPointCloudAlg()
+    if self.hasInputFromPort('p_datalocation') :
+      p.set_p_datalocation(self.getInputFromPort('p_datalocation'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Field', results)
+
+class TransformMeshWithTransform(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.TransformMeshWithTransformAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Transform_Matrix = 0
+    if self.hasInputFromPort('Transform Matrix') :
+      Transform_Matrix = self.getInputFromPort('Transform Matrix')
+    results = p.execute(Input_Field, Transform_Matrix)
+    self.setResult('Transformed Field', results)
+
+class ConvertRegularMeshToStructuredMesh(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ConvertRegularMeshToStructuredMeshAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class CalculateMeshNodes(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.CalculateMeshNodesAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Field, Function, Array)
+    self.setResult('Field', results)
+
+class SmoothMesh(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.SmoothMeshAlg()
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    IsoValue = 0
+    if self.hasInputFromPort('IsoValue') :
+      IsoValue = self.getInputFromPort('IsoValue')
+    results = p.execute(Input, IsoValue)
+    self.setResult('Smoothed', results)
+
+class EditMeshBoundingBox(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.EditMeshBoundingBoxAlg()
+    if self.hasInputFromPort('p_outputcenterx') :
+      p.set_p_outputcenterx(self.getInputFromPort('p_outputcenterx'))
+    if self.hasInputFromPort('p_outputcentery') :
+      p.set_p_outputcentery(self.getInputFromPort('p_outputcentery'))
+    if self.hasInputFromPort('p_outputcenterz') :
+      p.set_p_outputcenterz(self.getInputFromPort('p_outputcenterz'))
+    if self.hasInputFromPort('p_outputsizex') :
+      p.set_p_outputsizex(self.getInputFromPort('p_outputsizex'))
+    if self.hasInputFromPort('p_outputsizey') :
+      p.set_p_outputsizey(self.getInputFromPort('p_outputsizey'))
+    if self.hasInputFromPort('p_outputsizez') :
+      p.set_p_outputsizez(self.getInputFromPort('p_outputsizez'))
+    if self.hasInputFromPort('p_useoutputcenter') :
+      p.set_p_useoutputcenter(self.getInputFromPort('p_useoutputcenter'))
+    if self.hasInputFromPort('p_useoutputsize') :
+      p.set_p_useoutputsize(self.getInputFromPort('p_useoutputsize'))
+    if self.hasInputFromPort('p_box_scale') :
+      p.set_p_box_scale(self.getInputFromPort('p_box_scale'))
+    if self.hasInputFromPort('p_box_mode') :
+      p.set_p_box_mode(self.getInputFromPort('p_box_mode'))
+    if self.hasInputFromPort('p_box_real_scale') :
+      p.set_p_box_real_scale(self.getInputFromPort('p_box_real_scale'))
+    if self.hasInputFromPort('p_box_center_x') :
+      p.set_p_box_center_x(self.getInputFromPort('p_box_center_x'))
+    if self.hasInputFromPort('p_box_center_y') :
+      p.set_p_box_center_y(self.getInputFromPort('p_box_center_y'))
+    if self.hasInputFromPort('p_box_center_z') :
+      p.set_p_box_center_z(self.getInputFromPort('p_box_center_z'))
+    if self.hasInputFromPort('p_box_right_x') :
+      p.set_p_box_right_x(self.getInputFromPort('p_box_right_x'))
+    if self.hasInputFromPort('p_box_right_y') :
+      p.set_p_box_right_y(self.getInputFromPort('p_box_right_y'))
+    if self.hasInputFromPort('p_box_right_z') :
+      p.set_p_box_right_z(self.getInputFromPort('p_box_right_z'))
+    if self.hasInputFromPort('p_box_down_x') :
+      p.set_p_box_down_x(self.getInputFromPort('p_box_down_x'))
+    if self.hasInputFromPort('p_box_down_y') :
+      p.set_p_box_down_y(self.getInputFromPort('p_box_down_y'))
+    if self.hasInputFromPort('p_box_down_z') :
+      p.set_p_box_down_z(self.getInputFromPort('p_box_down_z'))
+    if self.hasInputFromPort('p_box_in_x') :
+      p.set_p_box_in_x(self.getInputFromPort('p_box_in_x'))
+    if self.hasInputFromPort('p_box_in_y') :
+      p.set_p_box_in_y(self.getInputFromPort('p_box_in_y'))
+    if self.hasInputFromPort('p_box_in_z') :
+      p.set_p_box_in_z(self.getInputFromPort('p_box_in_z'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results[0])
+    self.setResult('Transformation Widget', results[1])
+    self.setResult('Transformation Matrix', results[2])
+
+class SwapNodeLocationsWithMatrixEntries(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.SwapNodeLocationsWithMatrixEntriesAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    Input_Matrix = 0
+    if self.hasInputFromPort('Input Matrix') :
+      Input_Matrix = self.getInputFromPort('Input Matrix')
+    results = p.execute(Input_Field, Input_Matrix)
+    self.setResult('Output Field', results[0])
+    self.setResult('Output Matrix', results[1])
+
+class MapFieldDataToNodeCoordinate(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.MapFieldDataToNodeCoordinateAlg()
+    if self.hasInputFromPort('p_coord') :
+      p.set_p_coord(self.getInputFromPort('p_coord'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Field', results)
+
+class ScaleFieldMeshAndData(ChangeMesh) :
+  def compute(self) :
+    p = sr_py.ScaleFieldMeshAndDataAlg()
+    if self.hasInputFromPort('p_datascale') :
+      p.set_p_datascale(self.getInputFromPort('p_datascale'))
+    if self.hasInputFromPort('p_geomscale') :
+      p.set_p_geomscale(self.getInputFromPort('p_geomscale'))
+    if self.hasInputFromPort('p_usegeomcenter') :
+      p.set_p_usegeomcenter(self.getInputFromPort('p_usegeomcenter'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    GeomScaleFactor = 0
+    if self.hasInputFromPort('GeomScaleFactor') :
+      GeomScaleFactor = self.getInputFromPort('GeomScaleFactor')
+    DataScaleFactor = 0
+    if self.hasInputFromPort('DataScaleFactor') :
+      DataScaleFactor = self.getInputFromPort('DataScaleFactor')
+    results = p.execute(Field, GeomScaleFactor, DataScaleFactor)
+    self.setResult('Field', results)
+
+class ReportColumnMatrixMisfit(Math) :
+  def compute(self) :
+    p = sr_py.ReportColumnMatrixMisfitAlg()
+    if self.hasInputFromPort('p_have_ui') :
+      p.set_p_have_ui(self.getInputFromPort('p_have_ui'))
+    if self.hasInputFromPort('p_methodTCL') :
+      p.set_p_methodTCL(self.getInputFromPort('p_methodTCL'))
+    if self.hasInputFromPort('p_pTCL') :
+      p.set_p_pTCL(self.getInputFromPort('p_pTCL'))
+    Vec1 = 0
+    if self.hasInputFromPort('Vec1') :
+      Vec1 = self.getInputFromPort('Vec1')
+    Vec2 = 0
+    if self.hasInputFromPort('Vec2') :
+      Vec2 = self.getInputFromPort('Vec2')
+    results = p.execute(Vec1, Vec2)
+    self.setResult('Error Out', results)
+
+class EvaluateLinAlgGeneral(Math) :
+  def compute(self) :
+    p = sr_py.EvaluateLinAlgGeneralAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    i1 = 0
+    if self.hasInputFromPort('i1') :
+      i1 = self.getInputFromPort('i1')
+    i2 = 0
+    if self.hasInputFromPort('i2') :
+      i2 = self.getInputFromPort('i2')
+    i3 = 0
+    if self.hasInputFromPort('i3') :
+      i3 = self.getInputFromPort('i3')
+    i4 = 0
+    if self.hasInputFromPort('i4') :
+      i4 = self.getInputFromPort('i4')
+    i5 = 0
+    if self.hasInputFromPort('i5') :
+      i5 = self.getInputFromPort('i5')
+    results = p.execute(i1, i2, i3, i4, i5)
+    self.setResult('o1', results[0])
+    self.setResult('o2', results[1])
+    self.setResult('o3', results[2])
+    self.setResult('o4', results[3])
+    self.setResult('o5', results[4])
+
+class AppendMatrix(Math) :
+  def compute(self) :
+    p = sr_py.AppendMatrixAlg()
+    if self.hasInputFromPort('p_row_or_column') :
+      p.set_p_row_or_column(self.getInputFromPort('p_row_or_column'))
+    BaseMatrix = 0
+    if self.hasInputFromPort('BaseMatrix') :
+      BaseMatrix = self.getInputFromPort('BaseMatrix')
+    AppendMatrix = 0
+    if self.hasInputFromPort('AppendMatrix') :
+      AppendMatrix = self.getInputFromPort('AppendMatrix')
+    results = p.execute(BaseMatrix, AppendMatrix)
+    self.setResult('Matrix', results)
+
+class EvaluateLinAlgBinary(Math) :
+  def compute(self) :
+    p = sr_py.EvaluateLinAlgBinaryAlg()
+    if self.hasInputFromPort('p_op') :
+      p.set_p_op(self.getInputFromPort('p_op'))
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    A = 0
+    if self.hasInputFromPort('A') :
+      A = self.getInputFromPort('A')
+    B = 0
+    if self.hasInputFromPort('B') :
+      B = self.getInputFromPort('B')
+    results = p.execute(A, B)
+    self.setResult('Output', results)
+
+class ConvertMaskVectorToMappingMatrix(Math) :
+  def compute(self) :
+    p = sr_py.ConvertMaskVectorToMappingMatrixAlg()
+    MaskVector = 0
+    if self.hasInputFromPort('MaskVector') :
+      MaskVector = self.getInputFromPort('MaskVector')
+    results = p.execute(MaskVector)
+    self.setResult('MappingMatrix', results)
+
+class SolveLinearSystem(Math) :
+  def compute(self) :
+    p = sr_py.SolveLinearSystemAlg()
+    if self.hasInputFromPort('p_target_error') :
+      p.set_p_target_error(self.getInputFromPort('p_target_error'))
+    if self.hasInputFromPort('p_flops') :
+      p.set_p_flops(self.getInputFromPort('p_flops'))
+    if self.hasInputFromPort('p_floprate') :
+      p.set_p_floprate(self.getInputFromPort('p_floprate'))
+    if self.hasInputFromPort('p_memrefs') :
+      p.set_p_memrefs(self.getInputFromPort('p_memrefs'))
+    if self.hasInputFromPort('p_memrate') :
+      p.set_p_memrate(self.getInputFromPort('p_memrate'))
+    if self.hasInputFromPort('p_orig_error') :
+      p.set_p_orig_error(self.getInputFromPort('p_orig_error'))
+    if self.hasInputFromPort('p_current_error') :
+      p.set_p_current_error(self.getInputFromPort('p_current_error'))
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    if self.hasInputFromPort('p_precond') :
+      p.set_p_precond(self.getInputFromPort('p_precond'))
+    if self.hasInputFromPort('p_iteration') :
+      p.set_p_iteration(self.getInputFromPort('p_iteration'))
+    if self.hasInputFromPort('p_maxiter') :
+      p.set_p_maxiter(self.getInputFromPort('p_maxiter'))
+    if self.hasInputFromPort('p_use_previous_soln') :
+      p.set_p_use_previous_soln(self.getInputFromPort('p_use_previous_soln'))
+    if self.hasInputFromPort('p_emit_partial') :
+      p.set_p_emit_partial(self.getInputFromPort('p_emit_partial'))
+    if self.hasInputFromPort('p_emit_iter') :
+      p.set_p_emit_iter(self.getInputFromPort('p_emit_iter'))
+    if self.hasInputFromPort('p_status') :
+      p.set_p_status(self.getInputFromPort('p_status'))
+    if self.hasInputFromPort('p_np') :
+      p.set_p_np(self.getInputFromPort('p_np'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    RHS = 0
+    if self.hasInputFromPort('RHS') :
+      RHS = self.getInputFromPort('RHS')
+    results = p.execute(Matrix, RHS)
+    self.setResult('Solution', results)
+
+class ReportMatrixColumnMeasure(Math) :
+  def compute(self) :
+    p = sr_py.ReportMatrixColumnMeasureAlg()
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Vector', results)
+
+class SortMatrix(Math) :
+  def compute(self) :
+    p = sr_py.SortMatrixAlg()
+    if self.hasInputFromPort('p_row_or_col') :
+      p.set_p_row_or_col(self.getInputFromPort('p_row_or_col'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Matrix', results)
+
+class CreateGeometricTransform(Math) :
+  def compute(self) :
+    p = sr_py.CreateGeometricTransformAlg()
+    if self.hasInputFromPort('p_rotate_x') :
+      p.set_p_rotate_x(self.getInputFromPort('p_rotate_x'))
+    if self.hasInputFromPort('p_rotate_y') :
+      p.set_p_rotate_y(self.getInputFromPort('p_rotate_y'))
+    if self.hasInputFromPort('p_rotate_z') :
+      p.set_p_rotate_z(self.getInputFromPort('p_rotate_z'))
+    if self.hasInputFromPort('p_rotate_theta') :
+      p.set_p_rotate_theta(self.getInputFromPort('p_rotate_theta'))
+    if self.hasInputFromPort('p_translate_x') :
+      p.set_p_translate_x(self.getInputFromPort('p_translate_x'))
+    if self.hasInputFromPort('p_translate_y') :
+      p.set_p_translate_y(self.getInputFromPort('p_translate_y'))
+    if self.hasInputFromPort('p_translate_z') :
+      p.set_p_translate_z(self.getInputFromPort('p_translate_z'))
+    if self.hasInputFromPort('p_scale_uniform') :
+      p.set_p_scale_uniform(self.getInputFromPort('p_scale_uniform'))
+    if self.hasInputFromPort('p_scale_x') :
+      p.set_p_scale_x(self.getInputFromPort('p_scale_x'))
+    if self.hasInputFromPort('p_scale_y') :
+      p.set_p_scale_y(self.getInputFromPort('p_scale_y'))
+    if self.hasInputFromPort('p_scale_z') :
+      p.set_p_scale_z(self.getInputFromPort('p_scale_z'))
+    if self.hasInputFromPort('p_shear_plane_a') :
+      p.set_p_shear_plane_a(self.getInputFromPort('p_shear_plane_a'))
+    if self.hasInputFromPort('p_shear_plane_b') :
+      p.set_p_shear_plane_b(self.getInputFromPort('p_shear_plane_b'))
+    if self.hasInputFromPort('p_shear_plane_c') :
+      p.set_p_shear_plane_c(self.getInputFromPort('p_shear_plane_c'))
+    if self.hasInputFromPort('p_widget_resizable') :
+      p.set_p_widget_resizable(self.getInputFromPort('p_widget_resizable'))
+    if self.hasInputFromPort('p_permute_x') :
+      p.set_p_permute_x(self.getInputFromPort('p_permute_x'))
+    if self.hasInputFromPort('p_permute_y') :
+      p.set_p_permute_y(self.getInputFromPort('p_permute_y'))
+    if self.hasInputFromPort('p_permute_z') :
+      p.set_p_permute_z(self.getInputFromPort('p_permute_z'))
+    if self.hasInputFromPort('p_pre_transform') :
+      p.set_p_pre_transform(self.getInputFromPort('p_pre_transform'))
+    if self.hasInputFromPort('p_which_transform') :
+      p.set_p_which_transform(self.getInputFromPort('p_which_transform'))
+    if self.hasInputFromPort('p_widget_scale') :
+      p.set_p_widget_scale(self.getInputFromPort('p_widget_scale'))
+    if self.hasInputFromPort('p_ignoring_widget_changes') :
+      p.set_p_ignoring_widget_changes(self.getInputFromPort('p_ignoring_widget_changes'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Matrix', results[0])
+    self.setResult('Geometry', results[1])
+
+class ChooseMatrix(Math) :
+  def compute(self) :
+    p = sr_py.ChooseMatrixAlg()
+    if self.hasInputFromPort('p_use_first_valid') :
+      p.set_p_use_first_valid(self.getInputFromPort('p_use_first_valid'))
+    if self.hasInputFromPort('p_port_valid_index') :
+      p.set_p_port_valid_index(self.getInputFromPort('p_port_valid_index'))
+    if self.hasInputFromPort('p_port_selected_index') :
+      p.set_p_port_selected_index(self.getInputFromPort('p_port_selected_index'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Matrix', results)
+
+class ConvertMappingMatrixToMaskVector(Math) :
+  def compute(self) :
+    p = sr_py.ConvertMappingMatrixToMaskVectorAlg()
+    MappingMatrix = 0
+    if self.hasInputFromPort('MappingMatrix') :
+      MappingMatrix = self.getInputFromPort('MappingMatrix')
+    results = p.execute(MappingMatrix)
+    self.setResult('MaskVector', results)
+
+class ResizeMatrix(Math) :
+  def compute(self) :
+    p = sr_py.ResizeMatrixAlg()
+    if self.hasInputFromPort('p_dim_m') :
+      p.set_p_dim_m(self.getInputFromPort('p_dim_m'))
+    if self.hasInputFromPort('p_dim_n') :
+      p.set_p_dim_n(self.getInputFromPort('p_dim_n'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    M = 0
+    if self.hasInputFromPort('M') :
+      M = self.getInputFromPort('M')
+    N = 0
+    if self.hasInputFromPort('N') :
+      N = self.getInputFromPort('N')
+    results = p.execute(Matrix, M, N)
+    self.setResult('Matrix', results)
+
+class CollectMatrices(Math) :
+  def compute(self) :
+    p = sr_py.CollectMatricesAlg()
+    if self.hasInputFromPort('p_append') :
+      p.set_p_append(self.getInputFromPort('p_append'))
+    if self.hasInputFromPort('p_row') :
+      p.set_p_row(self.getInputFromPort('p_row'))
+    if self.hasInputFromPort('p_front') :
+      p.set_p_front(self.getInputFromPort('p_front'))
+    Optional_BaseMatrix = 0
+    if self.hasInputFromPort('Optional BaseMatrix') :
+      Optional_BaseMatrix = self.getInputFromPort('Optional BaseMatrix')
+    SubMatrix = 0
+    if self.hasInputFromPort('SubMatrix') :
+      SubMatrix = self.getInputFromPort('SubMatrix')
+    results = p.execute(Optional_BaseMatrix, SubMatrix)
+    self.setResult('CompositeMatrix', results)
+
+class GetColumnOrRowFromMatrix(Math) :
+  def compute(self) :
+    p = sr_py.GetColumnOrRowFromMatrixAlg()
+    if self.hasInputFromPort('p_row_or_col') :
+      p.set_p_row_or_col(self.getInputFromPort('p_row_or_col'))
+    if self.hasInputFromPort('p_selectable_min') :
+      p.set_p_selectable_min(self.getInputFromPort('p_selectable_min'))
+    if self.hasInputFromPort('p_selectable_max') :
+      p.set_p_selectable_max(self.getInputFromPort('p_selectable_max'))
+    if self.hasInputFromPort('p_selectable_inc') :
+      p.set_p_selectable_inc(self.getInputFromPort('p_selectable_inc'))
+    if self.hasInputFromPort('p_selectable_units') :
+      p.set_p_selectable_units(self.getInputFromPort('p_selectable_units'))
+    if self.hasInputFromPort('p_range_min') :
+      p.set_p_range_min(self.getInputFromPort('p_range_min'))
+    if self.hasInputFromPort('p_range_max') :
+      p.set_p_range_max(self.getInputFromPort('p_range_max'))
+    if self.hasInputFromPort('p_playmode') :
+      p.set_p_playmode(self.getInputFromPort('p_playmode'))
+    if self.hasInputFromPort('p_current') :
+      p.set_p_current(self.getInputFromPort('p_current'))
+    if self.hasInputFromPort('p_execmode') :
+      p.set_p_execmode(self.getInputFromPort('p_execmode'))
+    if self.hasInputFromPort('p_delay') :
+      p.set_p_delay(self.getInputFromPort('p_delay'))
+    if self.hasInputFromPort('p_inc_amount') :
+      p.set_p_inc_amount(self.getInputFromPort('p_inc_amount'))
+    if self.hasInputFromPort('p_send_amount') :
+      p.set_p_send_amount(self.getInputFromPort('p_send_amount'))
+    if self.hasInputFromPort('p_data_series_done') :
+      p.set_p_data_series_done(self.getInputFromPort('p_data_series_done'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    Weight_Vector = 0
+    if self.hasInputFromPort('Weight Vector') :
+      Weight_Vector = self.getInputFromPort('Weight Vector')
+    Current_Index = 0
+    if self.hasInputFromPort('Current Index') :
+      Current_Index = self.getInputFromPort('Current Index')
+    results = p.execute(Matrix, Weight_Vector, Current_Index)
+    self.setResult('Vector', results[0])
+    self.setResult('Selected Index', results[1])
+
+class BuildNoiseColumnMatrix(Math) :
+  def compute(self) :
+    p = sr_py.BuildNoiseColumnMatrixAlg()
+    if self.hasInputFromPort('p_snr') :
+      p.set_p_snr(self.getInputFromPort('p_snr'))
+    Signal = 0
+    if self.hasInputFromPort('Signal') :
+      Signal = self.getInputFromPort('Signal')
+    results = p.execute(Signal)
+    self.setResult('Noise', results)
+
+class EvaluateLinAlgUnary(Math) :
+  def compute(self) :
+    p = sr_py.EvaluateLinAlgUnaryAlg()
+    if self.hasInputFromPort('p_op') :
+      p.set_p_op(self.getInputFromPort('p_op'))
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('Output', results)
+
+class GetSubmatrix(Math) :
+  def compute(self) :
+    p = sr_py.GetSubmatrixAlg()
+    if self.hasInputFromPort('p_mincol') :
+      p.set_p_mincol(self.getInputFromPort('p_mincol'))
+    if self.hasInputFromPort('p_maxcol') :
+      p.set_p_maxcol(self.getInputFromPort('p_maxcol'))
+    if self.hasInputFromPort('p_minrow') :
+      p.set_p_minrow(self.getInputFromPort('p_minrow'))
+    if self.hasInputFromPort('p_maxrow') :
+      p.set_p_maxrow(self.getInputFromPort('p_maxrow'))
+    if self.hasInputFromPort('p_nrow') :
+      p.set_p_nrow(self.getInputFromPort('p_nrow'))
+    if self.hasInputFromPort('p_ncol') :
+      p.set_p_ncol(self.getInputFromPort('p_ncol'))
+    Input_Matrix = 0
+    if self.hasInputFromPort('Input Matrix') :
+      Input_Matrix = self.getInputFromPort('Input Matrix')
+    Optional_Range_Bounds = 0
+    if self.hasInputFromPort('Optional Range Bounds') :
+      Optional_Range_Bounds = self.getInputFromPort('Optional Range Bounds')
+    results = p.execute(Input_Matrix, Optional_Range_Bounds)
+    self.setResult('Output Matrix', results)
+
+class ReorderMatrixByReverseCuthillMcKee(Math) :
+  def compute(self) :
+    p = sr_py.ReorderMatrixByReverseCuthillMcKeeAlg()
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Matrix', results[0])
+    self.setResult('Mapping', results[1])
+    self.setResult('InverseMapping', results[2])
+
+class CreateMatrix(Math) :
+  def compute(self) :
+    p = sr_py.CreateMatrixAlg()
+    if self.hasInputFromPort('p_rows') :
+      p.set_p_rows(self.getInputFromPort('p_rows'))
+    if self.hasInputFromPort('p_cols') :
+      p.set_p_cols(self.getInputFromPort('p_cols'))
+    if self.hasInputFromPort('p_data') :
+      p.set_p_data(self.getInputFromPort('p_data'))
+    if self.hasInputFromPort('p_clabel') :
+      p.set_p_clabel(self.getInputFromPort('p_clabel'))
+    if self.hasInputFromPort('p_rlabel') :
+      p.set_p_rlabel(self.getInputFromPort('p_rlabel'))
+    results = p.execute()
+    self.setResult('matrix', results)
+
+class SolveMinNormLeastSqSystem(Math) :
+  def compute(self) :
+    p = sr_py.SolveMinNormLeastSqSystemAlg()
+    BasisVec1 = 0
+    if self.hasInputFromPort('BasisVec1') :
+      BasisVec1 = self.getInputFromPort('BasisVec1')
+    BasisVec2 = 0
+    if self.hasInputFromPort('BasisVec2') :
+      BasisVec2 = self.getInputFromPort('BasisVec2')
+    BasisVec3 = 0
+    if self.hasInputFromPort('BasisVec3') :
+      BasisVec3 = self.getInputFromPort('BasisVec3')
+    TargetVec = 0
+    if self.hasInputFromPort('TargetVec') :
+      TargetVec = self.getInputFromPort('TargetVec')
+    results = p.execute(BasisVec1, BasisVec2, BasisVec3, TargetVec)
+    self.setResult('WeightVec(Col)', results[0])
+    self.setResult('ResultVec(Col)', results[1])
+
+class ConvertMatrixType(Math) :
+  def compute(self) :
+    p = sr_py.ConvertMatrixTypeAlg()
+    if self.hasInputFromPort('p_oldtype') :
+      p.set_p_oldtype(self.getInputFromPort('p_oldtype'))
+    if self.hasInputFromPort('p_newtype') :
+      p.set_p_newtype(self.getInputFromPort('p_newtype'))
+    if self.hasInputFromPort('p_nrow') :
+      p.set_p_nrow(self.getInputFromPort('p_nrow'))
+    if self.hasInputFromPort('p_ncol') :
+      p.set_p_ncol(self.getInputFromPort('p_ncol'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('Output', results)
+
+class ReportMatrixRowMeasure(Math) :
+  def compute(self) :
+    p = sr_py.ReportMatrixRowMeasureAlg()
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Vector', results)
+
+class ReorderMatrixByCuthillMcKee(Math) :
+  def compute(self) :
+    p = sr_py.ReorderMatrixByCuthillMcKeeAlg()
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Matrix', results[0])
+    self.setResult('Mapping', results[1])
+    self.setResult('InverseMapping', results[2])
+
+class ReportMatrixInfo(Math) :
+  def compute(self) :
+    p = sr_py.ReportMatrixInfoAlg()
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('NumRows', results[0])
+    self.setResult('NumCols', results[1])
+    self.setResult('NumElements', results[2])
+
+class RemoveZerosFromMatrix(Math) :
+  def compute(self) :
+    p = sr_py.RemoveZerosFromMatrixAlg()
+    if self.hasInputFromPort('p_row_or_col') :
+      p.set_p_row_or_col(self.getInputFromPort('p_row_or_col'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Matrix', results)
+
+class RemoveZeroRowsAndColumns(Math) :
+  def compute(self) :
+    p = sr_py.RemoveZeroRowsAndColumnsAlg()
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('ReducedMatrix', results[0])
+    self.setResult('LeftMapping', results[1])
+    self.setResult('RightMapping', results[2])
+
+class CreateDataArray(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.CreateDataArrayAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    Size = 0
+    if self.hasInputFromPort('Size') :
+      Size = self.getInputFromPort('Size')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Size, Function, Array)
+    self.setResult('DataArray', results)
+
+class CreateDataArrayFromIndices(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.CreateDataArrayFromIndicesAlg()
+    Indices = 0
+    if self.hasInputFromPort('Indices') :
+      Indices = self.getInputFromPort('Indices')
+    Template = 0
+    if self.hasInputFromPort('Template') :
+      Template = self.getInputFromPort('Template')
+    results = p.execute(Indices, Template)
+    self.setResult('DataArray', results)
+
+class ReportDataArrayInfo(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.ReportDataArrayInfoAlg()
+    DataArray = 0
+    if self.hasInputFromPort('DataArray') :
+      DataArray = self.getInputFromPort('DataArray')
+    results = p.execute(DataArray)
+    self.setResult('NumElements', results)
+
+class CreateVectorArray(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.CreateVectorArrayAlg()
+    X = 0
+    if self.hasInputFromPort('X') :
+      X = self.getInputFromPort('X')
+    Y = 0
+    if self.hasInputFromPort('Y') :
+      Y = self.getInputFromPort('Y')
+    Z = 0
+    if self.hasInputFromPort('Z') :
+      Z = self.getInputFromPort('Z')
+    results = p.execute(X, Y, Z)
+    self.setResult('Vector', results)
+
+class ReplicateDataArray(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.ReplicateDataArrayAlg()
+    if self.hasInputFromPort('p_size') :
+      p.set_p_size(self.getInputFromPort('p_size'))
+    DataArray = 0
+    if self.hasInputFromPort('DataArray') :
+      DataArray = self.getInputFromPort('DataArray')
+    Size = 0
+    if self.hasInputFromPort('Size') :
+      Size = self.getInputFromPort('Size')
+    results = p.execute(DataArray, Size)
+    self.setResult('DataArray', results)
+
+class SplitVectorArrayInXYZ(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.SplitVectorArrayInXYZAlg()
+    VectorArray = 0
+    if self.hasInputFromPort('VectorArray') :
+      VectorArray = self.getInputFromPort('VectorArray')
+    results = p.execute(VectorArray)
+    self.setResult('X', results[0])
+    self.setResult('Y', results[1])
+    self.setResult('Z', results[2])
+
+class DecomposeTensorArrayIntoEigenVectors(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.DecomposeTensorArrayIntoEigenVectorsAlg()
+    TensorArray = 0
+    if self.hasInputFromPort('TensorArray') :
+      TensorArray = self.getInputFromPort('TensorArray')
+    results = p.execute(TensorArray)
+    self.setResult('EigenVector1', results[0])
+    self.setResult('EigenVector2', results[1])
+    self.setResult('EigenVector3', results[2])
+    self.setResult('EigenValue1', results[3])
+    self.setResult('EigenValue2', results[4])
+    self.setResult('EigenValue3', results[5])
+
+class CalculateDataArray(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.CalculateDataArrayAlg()
+    if self.hasInputFromPort('p_function') :
+      p.set_p_function(self.getInputFromPort('p_function'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    DataArray = 0
+    if self.hasInputFromPort('DataArray') :
+      DataArray = self.getInputFromPort('DataArray')
+    Function = ''
+    if self.hasInputFromPort('Function') :
+      Function = self.getInputFromPort('Function')
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(DataArray, Function, Array)
+    self.setResult('DataArray', results)
+
+class ReportDataArrayMeasure(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.ReportDataArrayMeasureAlg()
+    if self.hasInputFromPort('p_measure') :
+      p.set_p_measure(self.getInputFromPort('p_measure'))
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Array)
+    self.setResult('Measure', results)
+
+class AppendDataArrays(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.AppendDataArraysAlg()
+    Array = 0
+    if self.hasInputFromPort('Array') :
+      Array = self.getInputFromPort('Array')
+    results = p.execute(Array)
+    self.setResult('Array', results)
+
+class CreateTensorArray(DataArrayMath) :
+  def compute(self) :
+    p = sr_py.CreateTensorArrayAlg()
+    EigenVector1 = 0
+    if self.hasInputFromPort('EigenVector1') :
+      EigenVector1 = self.getInputFromPort('EigenVector1')
+    EigenVector2 = 0
+    if self.hasInputFromPort('EigenVector2') :
+      EigenVector2 = self.getInputFromPort('EigenVector2')
+    EigenValue1 = 0
+    if self.hasInputFromPort('EigenValue1') :
+      EigenValue1 = self.getInputFromPort('EigenValue1')
+    EigenValue2 = 0
+    if self.hasInputFromPort('EigenValue2') :
+      EigenValue2 = self.getInputFromPort('EigenValue2')
+    EigenValue3 = 0
+    if self.hasInputFromPort('EigenValue3') :
+      EigenValue3 = self.getInputFromPort('EigenValue3')
+    results = p.execute(EigenVector1, EigenVector2, EigenValue1, EigenValue2, EigenValue3)
+    self.setResult('TensorArray', results)
+
+class PrintMatrixIntoString(String) :
+  def compute(self) :
+    p = sr_py.PrintMatrixIntoStringAlg()
+    if self.hasInputFromPort('p_formatstring') :
+      p.set_p_formatstring(self.getInputFromPort('p_formatstring'))
+    Format = ''
+    if self.hasInputFromPort('Format') :
+      Format = self.getInputFromPort('Format')
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Format, Input)
+    self.setResult('Output', results)
+
+class GetFileName(String) :
+  def compute(self) :
+    p = sr_py.GetFileNameAlg()
+    if self.hasInputFromPort('p_filename_base') :
+      p.set_p_filename_base(self.getInputFromPort('p_filename_base'))
+    if self.hasInputFromPort('p_delay') :
+      p.set_p_delay(self.getInputFromPort('p_delay'))
+    if self.hasInputFromPort('p_pinned') :
+      p.set_p_pinned(self.getInputFromPort('p_pinned'))
+    results = p.execute()
+    self.setResult('Full Filename', results)
+
+class SplitFileName(String) :
+  def compute(self) :
+    p = sr_py.SplitFileNameAlg()
+    Filename = ''
+    if self.hasInputFromPort('Filename') :
+      Filename = self.getInputFromPort('Filename')
+    results = p.execute(Filename)
+    self.setResult('Pathname', results[0])
+    self.setResult('Filename Base', results[1])
+    self.setResult('Extension', results[2])
+    self.setResult('Filename', results[3])
+
+class PrintStringIntoString(String) :
+  def compute(self) :
+    p = sr_py.PrintStringIntoStringAlg()
+    if self.hasInputFromPort('p_formatstring') :
+      p.set_p_formatstring(self.getInputFromPort('p_formatstring'))
+    Format = ''
+    if self.hasInputFromPort('Format') :
+      Format = self.getInputFromPort('Format')
+    Input = ''
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Format, Input)
+    self.setResult('Output', results)
+
+class CreateString(String) :
+  def compute(self) :
+    p = sr_py.CreateStringAlg()
+    if self.hasInputFromPort('p_inputstring') :
+      p.set_p_inputstring(self.getInputFromPort('p_inputstring'))
+    results = p.execute()
+    self.setResult('Output', results)
+
+class ReportStringInfo(String) :
+  def compute(self) :
+    p = sr_py.ReportStringInfoAlg()
+    if self.hasInputFromPort('p_inputstring') :
+      p.set_p_inputstring(self.getInputFromPort('p_inputstring'))
+    Input = ''
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+
+class JoinStrings(String) :
+  def compute(self) :
+    p = sr_py.JoinStringsAlg()
+    input = ''
+    if self.hasInputFromPort('input') :
+      input = self.getInputFromPort('input')
+    results = p.execute(input)
+    self.setResult('Output', results)
+
+class GetNetworkFileName(String) :
+  def compute(self) :
+    p = sr_py.GetNetworkFileNameAlg()
+    results = p.execute()
+    self.setResult('String', results)
+
+class SetFieldProperty(MiscField) :
+  def compute(self) :
+    p = sr_py.SetFieldPropertyAlg()
+    if self.hasInputFromPort('p_num_entries') :
+      p.set_p_num_entries(self.getInputFromPort('p_num_entries'))
+    if self.hasInputFromPort('p_property') :
+      p.set_p_property(self.getInputFromPort('p_property'))
+    if self.hasInputFromPort('p_type') :
+      p.set_p_type(self.getInputFromPort('p_type'))
+    if self.hasInputFromPort('p_value') :
+      p.set_p_value(self.getInputFromPort('p_value'))
+    if self.hasInputFromPort('p_readonly') :
+      p.set_p_readonly(self.getInputFromPort('p_readonly'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Field', results)
+
+class ReportScalarFieldStats(MiscField) :
+  def compute(self) :
+    p = sr_py.ReportScalarFieldStatsAlg()
+    if self.hasInputFromPort('p_min') :
+      p.set_p_min(self.getInputFromPort('p_min'))
+    if self.hasInputFromPort('p_max') :
+      p.set_p_max(self.getInputFromPort('p_max'))
+    if self.hasInputFromPort('p_mean') :
+      p.set_p_mean(self.getInputFromPort('p_mean'))
+    if self.hasInputFromPort('p_median') :
+      p.set_p_median(self.getInputFromPort('p_median'))
+    if self.hasInputFromPort('p_sigma') :
+      p.set_p_sigma(self.getInputFromPort('p_sigma'))
+    if self.hasInputFromPort('p_is_fixed') :
+      p.set_p_is_fixed(self.getInputFromPort('p_is_fixed'))
+    if self.hasInputFromPort('p_nbuckets') :
+      p.set_p_nbuckets(self.getInputFromPort('p_nbuckets'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+
+class SelectFieldROIWithBoxWidget(MiscField) :
+  def compute(self) :
+    p = sr_py.SelectFieldROIWithBoxWidgetAlg()
+    if self.hasInputFromPort('p_stampvalue') :
+      p.set_p_stampvalue(self.getInputFromPort('p_stampvalue'))
+    if self.hasInputFromPort('p_runmode') :
+      p.set_p_runmode(self.getInputFromPort('p_runmode'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Selection Widget', results[0])
+    self.setResult('Output Field', results[1])
+
+class BuildMatrixOfSurfaceNormals(MiscField) :
+  def compute(self) :
+    p = sr_py.BuildMatrixOfSurfaceNormalsAlg()
+    Surface_Field = 0
+    if self.hasInputFromPort('Surface Field') :
+      Surface_Field = self.getInputFromPort('Surface Field')
+    results = p.execute(Surface_Field)
+    self.setResult('Nodal Surface Normals', results)
+
+class ReportFieldInfo(MiscField) :
+  def compute(self) :
+    p = sr_py.ReportFieldInfoAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('NumNodes', results[0])
+    self.setResult('NumElements', results[1])
+    self.setResult('NumData', results[2])
+    self.setResult('DataMin', results[3])
+    self.setResult('DataMax', results[4])
+    self.setResult('FieldSize', results[5])
+    self.setResult('FieldCenter', results[6])
+    self.setResult('Dimensions', results[7])
+
+class ReportFieldGeometryMeasures(MiscField) :
+  def compute(self) :
+    p = sr_py.ReportFieldGeometryMeasuresAlg()
+    if self.hasInputFromPort('p_simplexString') :
+      p.set_p_simplexString(self.getInputFromPort('p_simplexString'))
+    if self.hasInputFromPort('p_xFlag') :
+      p.set_p_xFlag(self.getInputFromPort('p_xFlag'))
+    if self.hasInputFromPort('p_yFlag') :
+      p.set_p_yFlag(self.getInputFromPort('p_yFlag'))
+    if self.hasInputFromPort('p_zFlag') :
+      p.set_p_zFlag(self.getInputFromPort('p_zFlag'))
+    if self.hasInputFromPort('p_idxFlag') :
+      p.set_p_idxFlag(self.getInputFromPort('p_idxFlag'))
+    if self.hasInputFromPort('p_sizeFlag') :
+      p.set_p_sizeFlag(self.getInputFromPort('p_sizeFlag'))
+    if self.hasInputFromPort('p_normalsFlag') :
+      p.set_p_normalsFlag(self.getInputFromPort('p_normalsFlag'))
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Measures Matrix', results)
+
+class SetFieldOrMeshStringProperty(MiscField) :
+  def compute(self) :
+    p = sr_py.SetFieldOrMeshStringPropertyAlg()
+    if self.hasInputFromPort('p_prop') :
+      p.set_p_prop(self.getInputFromPort('p_prop'))
+    if self.hasInputFromPort('p_val') :
+      p.set_p_val(self.getInputFromPort('p_val'))
+    if self.hasInputFromPort('p_meshprop') :
+      p.set_p_meshprop(self.getInputFromPort('p_meshprop'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('Output', results)
+
+class ManageFieldSeries(MiscField) :
+  def compute(self) :
+    p = sr_py.ManageFieldSeriesAlg()
+    if self.hasInputFromPort('p_num_ports') :
+      p.set_p_num_ports(self.getInputFromPort('p_num_ports'))
+    Input = 0
+    if self.hasInputFromPort('Input') :
+      Input = self.getInputFromPort('Input')
+    results = p.execute(Input)
+    self.setResult('Output 0', results[0])
+    self.setResult('Output 1', results[1])
+    self.setResult('Output 2', results[2])
+    self.setResult('Output 3', results[3])
+
+class ReportSearchGridInfo(MiscField) :
+  def compute(self) :
+    p = sr_py.ReportSearchGridInfoAlg()
+    Input_Field = 0
+    if self.hasInputFromPort('Input Field') :
+      Input_Field = self.getInputFromPort('Input Field')
+    results = p.execute(Input_Field)
+    self.setResult('Output Sample Field', results)
+
+class ChooseField(MiscField) :
+  def compute(self) :
+    p = sr_py.ChooseFieldAlg()
+    if self.hasInputFromPort('p_use_first_valid') :
+      p.set_p_use_first_valid(self.getInputFromPort('p_use_first_valid'))
+    if self.hasInputFromPort('p_port_valid_index') :
+      p.set_p_port_valid_index(self.getInputFromPort('p_port_valid_index'))
+    if self.hasInputFromPort('p_port_selected_index') :
+      p.set_p_port_selected_index(self.getInputFromPort('p_port_selected_index'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Field', results)
+
+class BuildPointCloudToLatVolMappingMatrix(MiscField) :
+  def compute(self) :
+    p = sr_py.BuildPointCloudToLatVolMappingMatrixAlg()
+    if self.hasInputFromPort('p_epsilon') :
+      p.set_p_epsilon(self.getInputFromPort('p_epsilon'))
+    PointCloudField = 0
+    if self.hasInputFromPort('PointCloudField') :
+      PointCloudField = self.getInputFromPort('PointCloudField')
+    LatVolField = 0
+    if self.hasInputFromPort('LatVolField') :
+      LatVolField = self.getInputFromPort('LatVolField')
+    results = p.execute(PointCloudField, LatVolField)
+    self.setResult('MappingMatrix', results)
+
+class BuildMappingMatrix(MiscField) :
+  def compute(self) :
+    p = sr_py.BuildMappingMatrixAlg()
+    if self.hasInputFromPort('p_interpolation_basis') :
+      p.set_p_interpolation_basis(self.getInputFromPort('p_interpolation_basis'))
+    if self.hasInputFromPort('p_map_source_to_single_dest') :
+      p.set_p_map_source_to_single_dest(self.getInputFromPort('p_map_source_to_single_dest'))
+    if self.hasInputFromPort('p_exhaustive_search') :
+      p.set_p_exhaustive_search(self.getInputFromPort('p_exhaustive_search'))
+    if self.hasInputFromPort('p_exhaustive_search_max_dist') :
+      p.set_p_exhaustive_search_max_dist(self.getInputFromPort('p_exhaustive_search_max_dist'))
+    if self.hasInputFromPort('p_np') :
+      p.set_p_np(self.getInputFromPort('p_np'))
+    Source = 0
+    if self.hasInputFromPort('Source') :
+      Source = self.getInputFromPort('Source')
+    Destination = 0
+    if self.hasInputFromPort('Destination') :
+      Destination = self.getInputFromPort('Destination')
+    results = p.execute(Source, Destination)
+    self.setResult('Mapping', results)
+
+class CoregisterPointClouds(MiscField) :
+  def compute(self) :
+    p = sr_py.CoregisterPointCloudsAlg()
+    if self.hasInputFromPort('p_allowScale') :
+      p.set_p_allowScale(self.getInputFromPort('p_allowScale'))
+    if self.hasInputFromPort('p_allowRotate') :
+      p.set_p_allowRotate(self.getInputFromPort('p_allowRotate'))
+    if self.hasInputFromPort('p_allowTranslate') :
+      p.set_p_allowTranslate(self.getInputFromPort('p_allowTranslate'))
+    if self.hasInputFromPort('p_seed') :
+      p.set_p_seed(self.getInputFromPort('p_seed'))
+    if self.hasInputFromPort('p_iters') :
+      p.set_p_iters(self.getInputFromPort('p_iters'))
+    if self.hasInputFromPort('p_misfitTol') :
+      p.set_p_misfitTol(self.getInputFromPort('p_misfitTol'))
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    Fixed_PointCloudField = 0
+    if self.hasInputFromPort('Fixed PointCloudField') :
+      Fixed_PointCloudField = self.getInputFromPort('Fixed PointCloudField')
+    Mobile_PointCloudField = 0
+    if self.hasInputFromPort('Mobile PointCloudField') :
+      Mobile_PointCloudField = self.getInputFromPort('Mobile PointCloudField')
+    DistanceField_From_Fixed = 0
+    if self.hasInputFromPort('DistanceField From Fixed') :
+      DistanceField_From_Fixed = self.getInputFromPort('DistanceField From Fixed')
+    results = p.execute(Fixed_PointCloudField, Mobile_PointCloudField, DistanceField_From_Fixed)
+    self.setResult('Transform', results)
+
+class CollectPointClouds(MiscField) :
+  def compute(self) :
+    p = sr_py.CollectPointCloudsAlg()
+    if self.hasInputFromPort('p_num_fields') :
+      p.set_p_num_fields(self.getInputFromPort('p_num_fields'))
+    Point_Cloud = 0
+    if self.hasInputFromPort('Point Cloud') :
+      Point_Cloud = self.getInputFromPort('Point Cloud')
+    results = p.execute(Point_Cloud)
+    self.setResult('Curve', results)
+
+class GetColorMapsFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetColorMapsFromBundleAlg()
+    if self.hasInputFromPort('p_colormap1_name') :
+      p.set_p_colormap1_name(self.getInputFromPort('p_colormap1_name'))
+    if self.hasInputFromPort('p_colormap2_name') :
+      p.set_p_colormap2_name(self.getInputFromPort('p_colormap2_name'))
+    if self.hasInputFromPort('p_colormap3_name') :
+      p.set_p_colormap3_name(self.getInputFromPort('p_colormap3_name'))
+    if self.hasInputFromPort('p_colormap4_name') :
+      p.set_p_colormap4_name(self.getInputFromPort('p_colormap4_name'))
+    if self.hasInputFromPort('p_colormap5_name') :
+      p.set_p_colormap5_name(self.getInputFromPort('p_colormap5_name'))
+    if self.hasInputFromPort('p_colormap6_name') :
+      p.set_p_colormap6_name(self.getInputFromPort('p_colormap6_name'))
+    if self.hasInputFromPort('p_colormap_selection') :
+      p.set_p_colormap_selection(self.getInputFromPort('p_colormap_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('colormap1', results[1])
+    self.setResult('colormap2', results[2])
+    self.setResult('colormap3', results[3])
+    self.setResult('colormap4', results[4])
+    self.setResult('colormap5', results[5])
+    self.setResult('colormap6', results[6])
+
+class InsertFieldsIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertFieldsIntoBundleAlg()
+    if self.hasInputFromPort('p_field1_name') :
+      p.set_p_field1_name(self.getInputFromPort('p_field1_name'))
+    if self.hasInputFromPort('p_field2_name') :
+      p.set_p_field2_name(self.getInputFromPort('p_field2_name'))
+    if self.hasInputFromPort('p_field3_name') :
+      p.set_p_field3_name(self.getInputFromPort('p_field3_name'))
+    if self.hasInputFromPort('p_field4_name') :
+      p.set_p_field4_name(self.getInputFromPort('p_field4_name'))
+    if self.hasInputFromPort('p_field5_name') :
+      p.set_p_field5_name(self.getInputFromPort('p_field5_name'))
+    if self.hasInputFromPort('p_field6_name') :
+      p.set_p_field6_name(self.getInputFromPort('p_field6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    field1 = 0
+    if self.hasInputFromPort('field1') :
+      field1 = self.getInputFromPort('field1')
+    field2 = 0
+    if self.hasInputFromPort('field2') :
+      field2 = self.getInputFromPort('field2')
+    field3 = 0
+    if self.hasInputFromPort('field3') :
+      field3 = self.getInputFromPort('field3')
+    field4 = 0
+    if self.hasInputFromPort('field4') :
+      field4 = self.getInputFromPort('field4')
+    field5 = 0
+    if self.hasInputFromPort('field5') :
+      field5 = self.getInputFromPort('field5')
+    field6 = 0
+    if self.hasInputFromPort('field6') :
+      field6 = self.getInputFromPort('field6')
+    results = p.execute(bundle, field1, field2, field3, field4, field5, field6)
+    self.setResult('bundle', results)
+
+class GetFieldsFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetFieldsFromBundleAlg()
+    if self.hasInputFromPort('p_field1_name') :
+      p.set_p_field1_name(self.getInputFromPort('p_field1_name'))
+    if self.hasInputFromPort('p_field2_name') :
+      p.set_p_field2_name(self.getInputFromPort('p_field2_name'))
+    if self.hasInputFromPort('p_field3_name') :
+      p.set_p_field3_name(self.getInputFromPort('p_field3_name'))
+    if self.hasInputFromPort('p_field4_name') :
+      p.set_p_field4_name(self.getInputFromPort('p_field4_name'))
+    if self.hasInputFromPort('p_field5_name') :
+      p.set_p_field5_name(self.getInputFromPort('p_field5_name'))
+    if self.hasInputFromPort('p_field6_name') :
+      p.set_p_field6_name(self.getInputFromPort('p_field6_name'))
+    if self.hasInputFromPort('p_field_selection') :
+      p.set_p_field_selection(self.getInputFromPort('p_field_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('field1', results[1])
+    self.setResult('field2', results[2])
+    self.setResult('field3', results[3])
+    self.setResult('field4', results[4])
+    self.setResult('field5', results[5])
+    self.setResult('field6', results[6])
+
+class InsertColorMap2sIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertColorMap2sIntoBundleAlg()
+    if self.hasInputFromPort('p_colormap21_name') :
+      p.set_p_colormap21_name(self.getInputFromPort('p_colormap21_name'))
+    if self.hasInputFromPort('p_colormap22_name') :
+      p.set_p_colormap22_name(self.getInputFromPort('p_colormap22_name'))
+    if self.hasInputFromPort('p_colormap23_name') :
+      p.set_p_colormap23_name(self.getInputFromPort('p_colormap23_name'))
+    if self.hasInputFromPort('p_colormap24_name') :
+      p.set_p_colormap24_name(self.getInputFromPort('p_colormap24_name'))
+    if self.hasInputFromPort('p_colormap25_name') :
+      p.set_p_colormap25_name(self.getInputFromPort('p_colormap25_name'))
+    if self.hasInputFromPort('p_colormap26_name') :
+      p.set_p_colormap26_name(self.getInputFromPort('p_colormap26_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    colormap21 = 0
+    if self.hasInputFromPort('colormap21') :
+      colormap21 = self.getInputFromPort('colormap21')
+    colormap22 = 0
+    if self.hasInputFromPort('colormap22') :
+      colormap22 = self.getInputFromPort('colormap22')
+    colormap23 = 0
+    if self.hasInputFromPort('colormap23') :
+      colormap23 = self.getInputFromPort('colormap23')
+    colormap24 = 0
+    if self.hasInputFromPort('colormap24') :
+      colormap24 = self.getInputFromPort('colormap24')
+    colormap25 = 0
+    if self.hasInputFromPort('colormap25') :
+      colormap25 = self.getInputFromPort('colormap25')
+    colormap26 = 0
+    if self.hasInputFromPort('colormap26') :
+      colormap26 = self.getInputFromPort('colormap26')
+    results = p.execute(bundle, colormap21, colormap22, colormap23, colormap24, colormap25, colormap26)
+    self.setResult('bundle', results)
+
+class GetBundlesFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetBundlesFromBundleAlg()
+    if self.hasInputFromPort('p_bundle1_name') :
+      p.set_p_bundle1_name(self.getInputFromPort('p_bundle1_name'))
+    if self.hasInputFromPort('p_bundle2_name') :
+      p.set_p_bundle2_name(self.getInputFromPort('p_bundle2_name'))
+    if self.hasInputFromPort('p_bundle3_name') :
+      p.set_p_bundle3_name(self.getInputFromPort('p_bundle3_name'))
+    if self.hasInputFromPort('p_bundle4_name') :
+      p.set_p_bundle4_name(self.getInputFromPort('p_bundle4_name'))
+    if self.hasInputFromPort('p_bundle5_name') :
+      p.set_p_bundle5_name(self.getInputFromPort('p_bundle5_name'))
+    if self.hasInputFromPort('p_bundle6_name') :
+      p.set_p_bundle6_name(self.getInputFromPort('p_bundle6_name'))
+    if self.hasInputFromPort('p_bundle_selection') :
+      p.set_p_bundle_selection(self.getInputFromPort('p_bundle_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('bundle1', results[1])
+    self.setResult('bundle2', results[2])
+    self.setResult('bundle3', results[3])
+    self.setResult('bundle4', results[4])
+    self.setResult('bundle5', results[5])
+    self.setResult('bundle6', results[6])
+
+class GetPathsFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetPathsFromBundleAlg()
+    if self.hasInputFromPort('p_path1_name') :
+      p.set_p_path1_name(self.getInputFromPort('p_path1_name'))
+    if self.hasInputFromPort('p_path2_name') :
+      p.set_p_path2_name(self.getInputFromPort('p_path2_name'))
+    if self.hasInputFromPort('p_path3_name') :
+      p.set_p_path3_name(self.getInputFromPort('p_path3_name'))
+    if self.hasInputFromPort('p_path4_name') :
+      p.set_p_path4_name(self.getInputFromPort('p_path4_name'))
+    if self.hasInputFromPort('p_path5_name') :
+      p.set_p_path5_name(self.getInputFromPort('p_path5_name'))
+    if self.hasInputFromPort('p_path6_name') :
+      p.set_p_path6_name(self.getInputFromPort('p_path6_name'))
+    if self.hasInputFromPort('p_path_selection') :
+      p.set_p_path_selection(self.getInputFromPort('p_path_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('path1', results[1])
+    self.setResult('path2', results[2])
+    self.setResult('path3', results[3])
+    self.setResult('path4', results[4])
+    self.setResult('path5', results[5])
+    self.setResult('path6', results[6])
+
+class InsertStringsIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertStringsIntoBundleAlg()
+    if self.hasInputFromPort('p_string1_name') :
+      p.set_p_string1_name(self.getInputFromPort('p_string1_name'))
+    if self.hasInputFromPort('p_string2_name') :
+      p.set_p_string2_name(self.getInputFromPort('p_string2_name'))
+    if self.hasInputFromPort('p_string3_name') :
+      p.set_p_string3_name(self.getInputFromPort('p_string3_name'))
+    if self.hasInputFromPort('p_string4_name') :
+      p.set_p_string4_name(self.getInputFromPort('p_string4_name'))
+    if self.hasInputFromPort('p_string5_name') :
+      p.set_p_string5_name(self.getInputFromPort('p_string5_name'))
+    if self.hasInputFromPort('p_string6_name') :
+      p.set_p_string6_name(self.getInputFromPort('p_string6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    string1 = ''
+    if self.hasInputFromPort('string1') :
+      string1 = self.getInputFromPort('string1')
+    string2 = ''
+    if self.hasInputFromPort('string2') :
+      string2 = self.getInputFromPort('string2')
+    string3 = ''
+    if self.hasInputFromPort('string3') :
+      string3 = self.getInputFromPort('string3')
+    string4 = ''
+    if self.hasInputFromPort('string4') :
+      string4 = self.getInputFromPort('string4')
+    string5 = ''
+    if self.hasInputFromPort('string5') :
+      string5 = self.getInputFromPort('string5')
+    string6 = ''
+    if self.hasInputFromPort('string6') :
+      string6 = self.getInputFromPort('string6')
+    results = p.execute(bundle, string1, string2, string3, string4, string5, string6)
+    self.setResult('bundle', results)
+
+class GetNrrdsFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetNrrdsFromBundleAlg()
+    if self.hasInputFromPort('p_nrrd1_name') :
+      p.set_p_nrrd1_name(self.getInputFromPort('p_nrrd1_name'))
+    if self.hasInputFromPort('p_nrrd2_name') :
+      p.set_p_nrrd2_name(self.getInputFromPort('p_nrrd2_name'))
+    if self.hasInputFromPort('p_nrrd3_name') :
+      p.set_p_nrrd3_name(self.getInputFromPort('p_nrrd3_name'))
+    if self.hasInputFromPort('p_nrrd4_name') :
+      p.set_p_nrrd4_name(self.getInputFromPort('p_nrrd4_name'))
+    if self.hasInputFromPort('p_nrrd5_name') :
+      p.set_p_nrrd5_name(self.getInputFromPort('p_nrrd5_name'))
+    if self.hasInputFromPort('p_nrrd6_name') :
+      p.set_p_nrrd6_name(self.getInputFromPort('p_nrrd6_name'))
+    if self.hasInputFromPort('p_transposenrrd1') :
+      p.set_p_transposenrrd1(self.getInputFromPort('p_transposenrrd1'))
+    if self.hasInputFromPort('p_transposenrrd2') :
+      p.set_p_transposenrrd2(self.getInputFromPort('p_transposenrrd2'))
+    if self.hasInputFromPort('p_transposenrrd3') :
+      p.set_p_transposenrrd3(self.getInputFromPort('p_transposenrrd3'))
+    if self.hasInputFromPort('p_transposenrrd4') :
+      p.set_p_transposenrrd4(self.getInputFromPort('p_transposenrrd4'))
+    if self.hasInputFromPort('p_transposenrrd5') :
+      p.set_p_transposenrrd5(self.getInputFromPort('p_transposenrrd5'))
+    if self.hasInputFromPort('p_transposenrrd6') :
+      p.set_p_transposenrrd6(self.getInputFromPort('p_transposenrrd6'))
+    if self.hasInputFromPort('p_nrrd_selection') :
+      p.set_p_nrrd_selection(self.getInputFromPort('p_nrrd_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('nrrd1', results[1])
+    self.setResult('nrrd2', results[2])
+    self.setResult('nrrd3', results[3])
+    self.setResult('nrrd4', results[4])
+    self.setResult('nrrd5', results[5])
+    self.setResult('nrrd6', results[6])
+
+class GetMatricesFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetMatricesFromBundleAlg()
+    if self.hasInputFromPort('p_matrix1_name') :
+      p.set_p_matrix1_name(self.getInputFromPort('p_matrix1_name'))
+    if self.hasInputFromPort('p_matrix2_name') :
+      p.set_p_matrix2_name(self.getInputFromPort('p_matrix2_name'))
+    if self.hasInputFromPort('p_matrix3_name') :
+      p.set_p_matrix3_name(self.getInputFromPort('p_matrix3_name'))
+    if self.hasInputFromPort('p_matrix4_name') :
+      p.set_p_matrix4_name(self.getInputFromPort('p_matrix4_name'))
+    if self.hasInputFromPort('p_matrix5_name') :
+      p.set_p_matrix5_name(self.getInputFromPort('p_matrix5_name'))
+    if self.hasInputFromPort('p_matrix6_name') :
+      p.set_p_matrix6_name(self.getInputFromPort('p_matrix6_name'))
+    if self.hasInputFromPort('p_transposenrrd1') :
+      p.set_p_transposenrrd1(self.getInputFromPort('p_transposenrrd1'))
+    if self.hasInputFromPort('p_transposenrrd2') :
+      p.set_p_transposenrrd2(self.getInputFromPort('p_transposenrrd2'))
+    if self.hasInputFromPort('p_transposenrrd3') :
+      p.set_p_transposenrrd3(self.getInputFromPort('p_transposenrrd3'))
+    if self.hasInputFromPort('p_transposenrrd4') :
+      p.set_p_transposenrrd4(self.getInputFromPort('p_transposenrrd4'))
+    if self.hasInputFromPort('p_transposenrrd5') :
+      p.set_p_transposenrrd5(self.getInputFromPort('p_transposenrrd5'))
+    if self.hasInputFromPort('p_transposenrrd6') :
+      p.set_p_transposenrrd6(self.getInputFromPort('p_transposenrrd6'))
+    if self.hasInputFromPort('p_matrix_selection') :
+      p.set_p_matrix_selection(self.getInputFromPort('p_matrix_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('matrix1', results[1])
+    self.setResult('matrix2', results[2])
+    self.setResult('matrix3', results[3])
+    self.setResult('matrix4', results[4])
+    self.setResult('matrix5', results[5])
+    self.setResult('matrix6', results[6])
+
+class JoinBundles(Bundle) :
+  def compute(self) :
+    p = sr_py.JoinBundlesAlg()
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results)
+
+class ReportBundleInfo(Bundle) :
+  def compute(self) :
+    p = sr_py.ReportBundleInfoAlg()
+    if self.hasInputFromPort('p_tclinfostring') :
+      p.set_p_tclinfostring(self.getInputFromPort('p_tclinfostring'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+
+class InsertPathsIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertPathsIntoBundleAlg()
+    if self.hasInputFromPort('p_path1_name') :
+      p.set_p_path1_name(self.getInputFromPort('p_path1_name'))
+    if self.hasInputFromPort('p_path2_name') :
+      p.set_p_path2_name(self.getInputFromPort('p_path2_name'))
+    if self.hasInputFromPort('p_path3_name') :
+      p.set_p_path3_name(self.getInputFromPort('p_path3_name'))
+    if self.hasInputFromPort('p_path4_name') :
+      p.set_p_path4_name(self.getInputFromPort('p_path4_name'))
+    if self.hasInputFromPort('p_path5_name') :
+      p.set_p_path5_name(self.getInputFromPort('p_path5_name'))
+    if self.hasInputFromPort('p_path6_name') :
+      p.set_p_path6_name(self.getInputFromPort('p_path6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    path1 = 0
+    if self.hasInputFromPort('path1') :
+      path1 = self.getInputFromPort('path1')
+    path2 = 0
+    if self.hasInputFromPort('path2') :
+      path2 = self.getInputFromPort('path2')
+    path3 = 0
+    if self.hasInputFromPort('path3') :
+      path3 = self.getInputFromPort('path3')
+    path4 = 0
+    if self.hasInputFromPort('path4') :
+      path4 = self.getInputFromPort('path4')
+    path5 = 0
+    if self.hasInputFromPort('path5') :
+      path5 = self.getInputFromPort('path5')
+    path6 = 0
+    if self.hasInputFromPort('path6') :
+      path6 = self.getInputFromPort('path6')
+    results = p.execute(bundle, path1, path2, path3, path4, path5, path6)
+    self.setResult('bundle', results)
+
+class GetColorMap2sFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetColorMap2sFromBundleAlg()
+    if self.hasInputFromPort('p_colormap21_name') :
+      p.set_p_colormap21_name(self.getInputFromPort('p_colormap21_name'))
+    if self.hasInputFromPort('p_colormap22_name') :
+      p.set_p_colormap22_name(self.getInputFromPort('p_colormap22_name'))
+    if self.hasInputFromPort('p_colormap23_name') :
+      p.set_p_colormap23_name(self.getInputFromPort('p_colormap23_name'))
+    if self.hasInputFromPort('p_colormap24_name') :
+      p.set_p_colormap24_name(self.getInputFromPort('p_colormap24_name'))
+    if self.hasInputFromPort('p_colormap25_name') :
+      p.set_p_colormap25_name(self.getInputFromPort('p_colormap25_name'))
+    if self.hasInputFromPort('p_colormap26_name') :
+      p.set_p_colormap26_name(self.getInputFromPort('p_colormap26_name'))
+    if self.hasInputFromPort('p_colormap2_selection') :
+      p.set_p_colormap2_selection(self.getInputFromPort('p_colormap2_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('colormap21', results[1])
+    self.setResult('colormap22', results[2])
+    self.setResult('colormap23', results[3])
+    self.setResult('colormap24', results[4])
+    self.setResult('colormap25', results[5])
+    self.setResult('colormap26', results[6])
+
+class InsertMatricesIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertMatricesIntoBundleAlg()
+    if self.hasInputFromPort('p_matrix1_name') :
+      p.set_p_matrix1_name(self.getInputFromPort('p_matrix1_name'))
+    if self.hasInputFromPort('p_matrix2_name') :
+      p.set_p_matrix2_name(self.getInputFromPort('p_matrix2_name'))
+    if self.hasInputFromPort('p_matrix3_name') :
+      p.set_p_matrix3_name(self.getInputFromPort('p_matrix3_name'))
+    if self.hasInputFromPort('p_matrix4_name') :
+      p.set_p_matrix4_name(self.getInputFromPort('p_matrix4_name'))
+    if self.hasInputFromPort('p_matrix5_name') :
+      p.set_p_matrix5_name(self.getInputFromPort('p_matrix5_name'))
+    if self.hasInputFromPort('p_matrix6_name') :
+      p.set_p_matrix6_name(self.getInputFromPort('p_matrix6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    matrix1 = 0
+    if self.hasInputFromPort('matrix1') :
+      matrix1 = self.getInputFromPort('matrix1')
+    matrix2 = 0
+    if self.hasInputFromPort('matrix2') :
+      matrix2 = self.getInputFromPort('matrix2')
+    matrix3 = 0
+    if self.hasInputFromPort('matrix3') :
+      matrix3 = self.getInputFromPort('matrix3')
+    matrix4 = 0
+    if self.hasInputFromPort('matrix4') :
+      matrix4 = self.getInputFromPort('matrix4')
+    matrix5 = 0
+    if self.hasInputFromPort('matrix5') :
+      matrix5 = self.getInputFromPort('matrix5')
+    matrix6 = 0
+    if self.hasInputFromPort('matrix6') :
+      matrix6 = self.getInputFromPort('matrix6')
+    results = p.execute(bundle, matrix1, matrix2, matrix3, matrix4, matrix5, matrix6)
+    self.setResult('bundle', results)
+
+class InsertNrrdsIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertNrrdsIntoBundleAlg()
+    if self.hasInputFromPort('p_nrrd1_name') :
+      p.set_p_nrrd1_name(self.getInputFromPort('p_nrrd1_name'))
+    if self.hasInputFromPort('p_nrrd2_name') :
+      p.set_p_nrrd2_name(self.getInputFromPort('p_nrrd2_name'))
+    if self.hasInputFromPort('p_nrrd3_name') :
+      p.set_p_nrrd3_name(self.getInputFromPort('p_nrrd3_name'))
+    if self.hasInputFromPort('p_nrrd4_name') :
+      p.set_p_nrrd4_name(self.getInputFromPort('p_nrrd4_name'))
+    if self.hasInputFromPort('p_nrrd5_name') :
+      p.set_p_nrrd5_name(self.getInputFromPort('p_nrrd5_name'))
+    if self.hasInputFromPort('p_nrrd6_name') :
+      p.set_p_nrrd6_name(self.getInputFromPort('p_nrrd6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    nrrd1 = 0
+    if self.hasInputFromPort('nrrd1') :
+      nrrd1 = self.getInputFromPort('nrrd1')
+    nrrd2 = 0
+    if self.hasInputFromPort('nrrd2') :
+      nrrd2 = self.getInputFromPort('nrrd2')
+    nrrd3 = 0
+    if self.hasInputFromPort('nrrd3') :
+      nrrd3 = self.getInputFromPort('nrrd3')
+    nrrd4 = 0
+    if self.hasInputFromPort('nrrd4') :
+      nrrd4 = self.getInputFromPort('nrrd4')
+    nrrd5 = 0
+    if self.hasInputFromPort('nrrd5') :
+      nrrd5 = self.getInputFromPort('nrrd5')
+    nrrd6 = 0
+    if self.hasInputFromPort('nrrd6') :
+      nrrd6 = self.getInputFromPort('nrrd6')
+    results = p.execute(bundle, nrrd1, nrrd2, nrrd3, nrrd4, nrrd5, nrrd6)
+    self.setResult('bundle', results)
+
+class InsertBundlesIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertBundlesIntoBundleAlg()
+    if self.hasInputFromPort('p_bundle1_name') :
+      p.set_p_bundle1_name(self.getInputFromPort('p_bundle1_name'))
+    if self.hasInputFromPort('p_bundle2_name') :
+      p.set_p_bundle2_name(self.getInputFromPort('p_bundle2_name'))
+    if self.hasInputFromPort('p_bundle3_name') :
+      p.set_p_bundle3_name(self.getInputFromPort('p_bundle3_name'))
+    if self.hasInputFromPort('p_bundle4_name') :
+      p.set_p_bundle4_name(self.getInputFromPort('p_bundle4_name'))
+    if self.hasInputFromPort('p_bundle5_name') :
+      p.set_p_bundle5_name(self.getInputFromPort('p_bundle5_name'))
+    if self.hasInputFromPort('p_bundle6_name') :
+      p.set_p_bundle6_name(self.getInputFromPort('p_bundle6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    bundle1 = 0
+    if self.hasInputFromPort('bundle1') :
+      bundle1 = self.getInputFromPort('bundle1')
+    bundle2 = 0
+    if self.hasInputFromPort('bundle2') :
+      bundle2 = self.getInputFromPort('bundle2')
+    bundle3 = 0
+    if self.hasInputFromPort('bundle3') :
+      bundle3 = self.getInputFromPort('bundle3')
+    bundle4 = 0
+    if self.hasInputFromPort('bundle4') :
+      bundle4 = self.getInputFromPort('bundle4')
+    bundle5 = 0
+    if self.hasInputFromPort('bundle5') :
+      bundle5 = self.getInputFromPort('bundle5')
+    bundle6 = 0
+    if self.hasInputFromPort('bundle6') :
+      bundle6 = self.getInputFromPort('bundle6')
+    results = p.execute(bundle, bundle1, bundle2, bundle3, bundle4, bundle5, bundle6)
+    self.setResult('bundle', results)
+
+class GetStringsFromBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.GetStringsFromBundleAlg()
+    if self.hasInputFromPort('p_string1_name') :
+      p.set_p_string1_name(self.getInputFromPort('p_string1_name'))
+    if self.hasInputFromPort('p_string2_name') :
+      p.set_p_string2_name(self.getInputFromPort('p_string2_name'))
+    if self.hasInputFromPort('p_string3_name') :
+      p.set_p_string3_name(self.getInputFromPort('p_string3_name'))
+    if self.hasInputFromPort('p_string4_name') :
+      p.set_p_string4_name(self.getInputFromPort('p_string4_name'))
+    if self.hasInputFromPort('p_string5_name') :
+      p.set_p_string5_name(self.getInputFromPort('p_string5_name'))
+    if self.hasInputFromPort('p_string6_name') :
+      p.set_p_string6_name(self.getInputFromPort('p_string6_name'))
+    if self.hasInputFromPort('p_string_selection') :
+      p.set_p_string_selection(self.getInputFromPort('p_string_selection'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    results = p.execute(bundle)
+    self.setResult('bundle', results[0])
+    self.setResult('string1', results[1])
+    self.setResult('string2', results[2])
+    self.setResult('string3', results[3])
+    self.setResult('string4', results[4])
+    self.setResult('string5', results[5])
+    self.setResult('string6', results[6])
+
+class InsertColorMapsIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertColorMapsIntoBundleAlg()
+    if self.hasInputFromPort('p_colormap1_name') :
+      p.set_p_colormap1_name(self.getInputFromPort('p_colormap1_name'))
+    if self.hasInputFromPort('p_colormap2_name') :
+      p.set_p_colormap2_name(self.getInputFromPort('p_colormap2_name'))
+    if self.hasInputFromPort('p_colormap3_name') :
+      p.set_p_colormap3_name(self.getInputFromPort('p_colormap3_name'))
+    if self.hasInputFromPort('p_colormap4_name') :
+      p.set_p_colormap4_name(self.getInputFromPort('p_colormap4_name'))
+    if self.hasInputFromPort('p_colormap5_name') :
+      p.set_p_colormap5_name(self.getInputFromPort('p_colormap5_name'))
+    if self.hasInputFromPort('p_colormap6_name') :
+      p.set_p_colormap6_name(self.getInputFromPort('p_colormap6_name'))
+    if self.hasInputFromPort('p_replace1') :
+      p.set_p_replace1(self.getInputFromPort('p_replace1'))
+    if self.hasInputFromPort('p_replace2') :
+      p.set_p_replace2(self.getInputFromPort('p_replace2'))
+    if self.hasInputFromPort('p_replace3') :
+      p.set_p_replace3(self.getInputFromPort('p_replace3'))
+    if self.hasInputFromPort('p_replace4') :
+      p.set_p_replace4(self.getInputFromPort('p_replace4'))
+    if self.hasInputFromPort('p_replace5') :
+      p.set_p_replace5(self.getInputFromPort('p_replace5'))
+    if self.hasInputFromPort('p_replace6') :
+      p.set_p_replace6(self.getInputFromPort('p_replace6'))
+    if self.hasInputFromPort('p_bundlename') :
+      p.set_p_bundlename(self.getInputFromPort('p_bundlename'))
+    bundle = 0
+    if self.hasInputFromPort('bundle') :
+      bundle = self.getInputFromPort('bundle')
+    colormap1 = 0
+    if self.hasInputFromPort('colormap1') :
+      colormap1 = self.getInputFromPort('colormap1')
+    colormap2 = 0
+    if self.hasInputFromPort('colormap2') :
+      colormap2 = self.getInputFromPort('colormap2')
+    colormap3 = 0
+    if self.hasInputFromPort('colormap3') :
+      colormap3 = self.getInputFromPort('colormap3')
+    colormap4 = 0
+    if self.hasInputFromPort('colormap4') :
+      colormap4 = self.getInputFromPort('colormap4')
+    colormap5 = 0
+    if self.hasInputFromPort('colormap5') :
+      colormap5 = self.getInputFromPort('colormap5')
+    colormap6 = 0
+    if self.hasInputFromPort('colormap6') :
+      colormap6 = self.getInputFromPort('colormap6')
+    results = p.execute(bundle, colormap1, colormap2, colormap3, colormap4, colormap5, colormap6)
+    self.setResult('bundle', results)
+
+class CreateParameterBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.CreateParameterBundleAlg()
+    if self.hasInputFromPort('p_data') :
+      p.set_p_data(self.getInputFromPort('p_data'))
+    if self.hasInputFromPort('p_new_field_count') :
+      p.set_p_new_field_count(self.getInputFromPort('p_new_field_count'))
+    if self.hasInputFromPort('p_update_all') :
+      p.set_p_update_all(self.getInputFromPort('p_update_all'))
+    results = p.execute()
+    self.setResult('ParameterList', results)
+
+class InsertEnvironmentIntoBundle(Bundle) :
+  def compute(self) :
+    p = sr_py.InsertEnvironmentIntoBundleAlg()
+    results = p.execute()
+    self.setResult('Environment', results)
+
+class ShowColorMap(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowColorMapAlg()
+    if self.hasInputFromPort('p_length') :
+      p.set_p_length(self.getInputFromPort('p_length'))
+    if self.hasInputFromPort('p_side') :
+      p.set_p_side(self.getInputFromPort('p_side'))
+    if self.hasInputFromPort('p_numlabels') :
+      p.set_p_numlabels(self.getInputFromPort('p_numlabels'))
+    if self.hasInputFromPort('p_scale') :
+      p.set_p_scale(self.getInputFromPort('p_scale'))
+    if self.hasInputFromPort('p_numsigdigits') :
+      p.set_p_numsigdigits(self.getInputFromPort('p_numsigdigits'))
+    if self.hasInputFromPort('p_units') :
+      p.set_p_units(self.getInputFromPort('p_units'))
+    if self.hasInputFromPort('p_color_r') :
+      p.set_p_color_r(self.getInputFromPort('p_color_r'))
+    if self.hasInputFromPort('p_color_g') :
+      p.set_p_color_g(self.getInputFromPort('p_color_g'))
+    if self.hasInputFromPort('p_color_b') :
+      p.set_p_color_b(self.getInputFromPort('p_color_b'))
+    if self.hasInputFromPort('p_text_fontsize') :
+      p.set_p_text_fontsize(self.getInputFromPort('p_text_fontsize'))
+    if self.hasInputFromPort('p_extra_padding') :
+      p.set_p_extra_padding(self.getInputFromPort('p_extra_padding'))
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    results = p.execute(ColorMap)
+    self.setResult('Geometry', results)
+
+class CreateAndEditColorMap2D(Visualization) :
+  def compute(self) :
+    p = sr_py.CreateAndEditColorMap2DAlg()
+    if self.hasInputFromPort('p_histo') :
+      p.set_p_histo(self.getInputFromPort('p_histo'))
+    if self.hasInputFromPort('p_selected_widget') :
+      p.set_p_selected_widget(self.getInputFromPort('p_selected_widget'))
+    if self.hasInputFromPort('p_selected_object') :
+      p.set_p_selected_object(self.getInputFromPort('p_selected_object'))
+    if self.hasInputFromPort('p_num_entries') :
+      p.set_p_num_entries(self.getInputFromPort('p_num_entries'))
+    if self.hasInputFromPort('p_marker') :
+      p.set_p_marker(self.getInputFromPort('p_marker'))
+    if self.hasInputFromPort('p_cm2view_targ') :
+      p.set_p_cm2view_targ(self.getInputFromPort('p_cm2view_targ'))
+    if self.hasInputFromPort('p_id') :
+      p.set_p_id(self.getInputFromPort('p_id'))
+    Input_Colormap = 0
+    if self.hasInputFromPort('Input Colormap') :
+      Input_Colormap = self.getInputFromPort('Input Colormap')
+    Histogram = 0
+    if self.hasInputFromPort('Histogram') :
+      Histogram = self.getInputFromPort('Histogram')
+    results = p.execute(Input_Colormap, Histogram)
+    self.setResult('Output Colormap', results)
+
+class ShowField(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowFieldAlg()
+    if self.hasInputFromPort('p_nodes_on') :
+      p.set_p_nodes_on(self.getInputFromPort('p_nodes_on'))
+    if self.hasInputFromPort('p_nodes_transparency') :
+      p.set_p_nodes_transparency(self.getInputFromPort('p_nodes_transparency'))
+    if self.hasInputFromPort('p_nodes_color_type') :
+      p.set_p_nodes_color_type(self.getInputFromPort('p_nodes_color_type'))
+    if self.hasInputFromPort('p_nodes_display_type') :
+      p.set_p_nodes_display_type(self.getInputFromPort('p_nodes_display_type'))
+    if self.hasInputFromPort('p_edges_on') :
+      p.set_p_edges_on(self.getInputFromPort('p_edges_on'))
+    if self.hasInputFromPort('p_edges_transparency') :
+      p.set_p_edges_transparency(self.getInputFromPort('p_edges_transparency'))
+    if self.hasInputFromPort('p_edges_color_type') :
+      p.set_p_edges_color_type(self.getInputFromPort('p_edges_color_type'))
+    if self.hasInputFromPort('p_edges_display_type') :
+      p.set_p_edges_display_type(self.getInputFromPort('p_edges_display_type'))
+    if self.hasInputFromPort('p_faces_on') :
+      p.set_p_faces_on(self.getInputFromPort('p_faces_on'))
+    if self.hasInputFromPort('p_faces_transparency') :
+      p.set_p_faces_transparency(self.getInputFromPort('p_faces_transparency'))
+    if self.hasInputFromPort('p_faces_color_type') :
+      p.set_p_faces_color_type(self.getInputFromPort('p_faces_color_type'))
+    if self.hasInputFromPort('p_faces_normals') :
+      p.set_p_faces_normals(self.getInputFromPort('p_faces_normals'))
+    if self.hasInputFromPort('p_faces_usetexture') :
+      p.set_p_faces_usetexture(self.getInputFromPort('p_faces_usetexture'))
+    if self.hasInputFromPort('p_text_on') :
+      p.set_p_text_on(self.getInputFromPort('p_text_on'))
+    if self.hasInputFromPort('p_text_color_type') :
+      p.set_p_text_color_type(self.getInputFromPort('p_text_color_type'))
+    if self.hasInputFromPort('p_text_color_r') :
+      p.set_p_text_color_r(self.getInputFromPort('p_text_color_r'))
+    if self.hasInputFromPort('p_text_color_g') :
+      p.set_p_text_color_g(self.getInputFromPort('p_text_color_g'))
+    if self.hasInputFromPort('p_text_color_b') :
+      p.set_p_text_color_b(self.getInputFromPort('p_text_color_b'))
+    if self.hasInputFromPort('p_text_backface_cull') :
+      p.set_p_text_backface_cull(self.getInputFromPort('p_text_backface_cull'))
+    if self.hasInputFromPort('p_text_always_visible') :
+      p.set_p_text_always_visible(self.getInputFromPort('p_text_always_visible'))
+    if self.hasInputFromPort('p_text_fontsize') :
+      p.set_p_text_fontsize(self.getInputFromPort('p_text_fontsize'))
+    if self.hasInputFromPort('p_text_precision') :
+      p.set_p_text_precision(self.getInputFromPort('p_text_precision'))
+    if self.hasInputFromPort('p_text_render_locations') :
+      p.set_p_text_render_locations(self.getInputFromPort('p_text_render_locations'))
+    if self.hasInputFromPort('p_text_show_data') :
+      p.set_p_text_show_data(self.getInputFromPort('p_text_show_data'))
+    if self.hasInputFromPort('p_text_show_nodes') :
+      p.set_p_text_show_nodes(self.getInputFromPort('p_text_show_nodes'))
+    if self.hasInputFromPort('p_text_show_edges') :
+      p.set_p_text_show_edges(self.getInputFromPort('p_text_show_edges'))
+    if self.hasInputFromPort('p_text_show_faces') :
+      p.set_p_text_show_faces(self.getInputFromPort('p_text_show_faces'))
+    if self.hasInputFromPort('p_text_show_cells') :
+      p.set_p_text_show_cells(self.getInputFromPort('p_text_show_cells'))
+    if self.hasInputFromPort('p_def_color_r') :
+      p.set_p_def_color_r(self.getInputFromPort('p_def_color_r'))
+    if self.hasInputFromPort('p_def_color_g') :
+      p.set_p_def_color_g(self.getInputFromPort('p_def_color_g'))
+    if self.hasInputFromPort('p_def_color_b') :
+      p.set_p_def_color_b(self.getInputFromPort('p_def_color_b'))
+    if self.hasInputFromPort('p_def_color_a') :
+      p.set_p_def_color_a(self.getInputFromPort('p_def_color_a'))
+    if self.hasInputFromPort('p_nodes_scale') :
+      p.set_p_nodes_scale(self.getInputFromPort('p_nodes_scale'))
+    if self.hasInputFromPort('p_nodes_scaleNV') :
+      p.set_p_nodes_scaleNV(self.getInputFromPort('p_nodes_scaleNV'))
+    if self.hasInputFromPort('p_edges_scale') :
+      p.set_p_edges_scale(self.getInputFromPort('p_edges_scale'))
+    if self.hasInputFromPort('p_edges_scaleNV') :
+      p.set_p_edges_scaleNV(self.getInputFromPort('p_edges_scaleNV'))
+    if self.hasInputFromPort('p_active_tab') :
+      p.set_p_active_tab(self.getInputFromPort('p_active_tab'))
+    if self.hasInputFromPort('p_interactive_mode') :
+      p.set_p_interactive_mode(self.getInputFromPort('p_interactive_mode'))
+    if self.hasInputFromPort('p_show_progress') :
+      p.set_p_show_progress(self.getInputFromPort('p_show_progress'))
+    if self.hasInputFromPort('p_field_name') :
+      p.set_p_field_name(self.getInputFromPort('p_field_name'))
+    if self.hasInputFromPort('p_field_name_override') :
+      p.set_p_field_name_override(self.getInputFromPort('p_field_name_override'))
+    if self.hasInputFromPort('p_nodes_resolution') :
+      p.set_p_nodes_resolution(self.getInputFromPort('p_nodes_resolution'))
+    if self.hasInputFromPort('p_edges_resolution') :
+      p.set_p_edges_resolution(self.getInputFromPort('p_edges_resolution'))
+    if self.hasInputFromPort('p_approx_div') :
+      p.set_p_approx_div(self.getInputFromPort('p_approx_div'))
+    if self.hasInputFromPort('p_use_default_size') :
+      p.set_p_use_default_size(self.getInputFromPort('p_use_default_size'))
+    Mesh = 0
+    if self.hasInputFromPort('Mesh') :
+      Mesh = self.getInputFromPort('Mesh')
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    results = p.execute(Mesh, ColorMap)
+    self.setResult('Scene Graph', results)
+
+class ExtractIsosurface(Visualization) :
+  def compute(self) :
+    p = sr_py.ExtractIsosurfaceAlg()
+    if self.hasInputFromPort('p_isoval_min') :
+      p.set_p_isoval_min(self.getInputFromPort('p_isoval_min'))
+    if self.hasInputFromPort('p_isoval_max') :
+      p.set_p_isoval_max(self.getInputFromPort('p_isoval_max'))
+    if self.hasInputFromPort('p_isoval') :
+      p.set_p_isoval(self.getInputFromPort('p_isoval'))
+    if self.hasInputFromPort('p_isoval_typed') :
+      p.set_p_isoval_typed(self.getInputFromPort('p_isoval_typed'))
+    if self.hasInputFromPort('p_isoval_quantity') :
+      p.set_p_isoval_quantity(self.getInputFromPort('p_isoval_quantity'))
+    if self.hasInputFromPort('p_quantity_range') :
+      p.set_p_quantity_range(self.getInputFromPort('p_quantity_range'))
+    if self.hasInputFromPort('p_quantity_clusive') :
+      p.set_p_quantity_clusive(self.getInputFromPort('p_quantity_clusive'))
+    if self.hasInputFromPort('p_quantity_min') :
+      p.set_p_quantity_min(self.getInputFromPort('p_quantity_min'))
+    if self.hasInputFromPort('p_quantity_max') :
+      p.set_p_quantity_max(self.getInputFromPort('p_quantity_max'))
+    if self.hasInputFromPort('p_quantity_list') :
+      p.set_p_quantity_list(self.getInputFromPort('p_quantity_list'))
+    if self.hasInputFromPort('p_isoval_list') :
+      p.set_p_isoval_list(self.getInputFromPort('p_isoval_list'))
+    if self.hasInputFromPort('p_matrix_list') :
+      p.set_p_matrix_list(self.getInputFromPort('p_matrix_list'))
+    if self.hasInputFromPort('p_algorithm') :
+      p.set_p_algorithm(self.getInputFromPort('p_algorithm'))
+    if self.hasInputFromPort('p_build_trisurf') :
+      p.set_p_build_trisurf(self.getInputFromPort('p_build_trisurf'))
+    if self.hasInputFromPort('p_build_geom') :
+      p.set_p_build_geom(self.getInputFromPort('p_build_geom'))
+    if self.hasInputFromPort('p_transparency') :
+      p.set_p_transparency(self.getInputFromPort('p_transparency'))
+    if self.hasInputFromPort('p_np') :
+      p.set_p_np(self.getInputFromPort('p_np'))
+    if self.hasInputFromPort('p_active_isoval_selection_tab') :
+      p.set_p_active_isoval_selection_tab(self.getInputFromPort('p_active_isoval_selection_tab'))
+    if self.hasInputFromPort('p_active_tab') :
+      p.set_p_active_tab(self.getInputFromPort('p_active_tab'))
+    if self.hasInputFromPort('p_update_type') :
+      p.set_p_update_type(self.getInputFromPort('p_update_type'))
+    if self.hasInputFromPort('p_color_r') :
+      p.set_p_color_r(self.getInputFromPort('p_color_r'))
+    if self.hasInputFromPort('p_color_g') :
+      p.set_p_color_g(self.getInputFromPort('p_color_g'))
+    if self.hasInputFromPort('p_color_b') :
+      p.set_p_color_b(self.getInputFromPort('p_color_b'))
+    if self.hasInputFromPort('p_color_a') :
+      p.set_p_color_a(self.getInputFromPort('p_color_a'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    Optional_Color_Map = 0
+    if self.hasInputFromPort('Optional Color Map') :
+      Optional_Color_Map = self.getInputFromPort('Optional Color Map')
+    Optional_Isovalues = 0
+    if self.hasInputFromPort('Optional Isovalues') :
+      Optional_Isovalues = self.getInputFromPort('Optional Isovalues')
+    results = p.execute(Field, Optional_Color_Map, Optional_Isovalues)
+    self.setResult('Surface', results[0])
+    self.setResult('Geometry', results[1])
+    self.setResult('Mapping', results[2])
+
+class CreateViewerAxes(Visualization) :
+  def compute(self) :
+    p = sr_py.CreateViewerAxesAlg()
+    if self.hasInputFromPort('p_precision') :
+      p.set_p_precision(self.getInputFromPort('p_precision'))
+    if self.hasInputFromPort('p_squash') :
+      p.set_p_squash(self.getInputFromPort('p_squash'))
+    if self.hasInputFromPort('p_valuerez') :
+      p.set_p_valuerez(self.getInputFromPort('p_valuerez'))
+    if self.hasInputFromPort('p_labelrez') :
+      p.set_p_labelrez(self.getInputFromPort('p_labelrez'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_absolute') :
+      p.set_p_Plane_01_0_Axis_absolute(self.getInputFromPort('p_Plane_01_0_Axis_absolute'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_divisions') :
+      p.set_p_Plane_01_0_Axis_divisions(self.getInputFromPort('p_Plane_01_0_Axis_divisions'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_offset') :
+      p.set_p_Plane_01_0_Axis_offset(self.getInputFromPort('p_Plane_01_0_Axis_offset'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_range_first') :
+      p.set_p_Plane_01_0_Axis_range_first(self.getInputFromPort('p_Plane_01_0_Axis_range_first'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_range_second') :
+      p.set_p_Plane_01_0_Axis_range_second(self.getInputFromPort('p_Plane_01_0_Axis_range_second'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_min_absolute') :
+      p.set_p_Plane_01_0_Axis_min_absolute(self.getInputFromPort('p_Plane_01_0_Axis_min_absolute'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_max_absolute') :
+      p.set_p_Plane_01_0_Axis_max_absolute(self.getInputFromPort('p_Plane_01_0_Axis_max_absolute'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_minplane') :
+      p.set_p_Plane_01_0_Axis_minplane(self.getInputFromPort('p_Plane_01_0_Axis_minplane'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_maxplane') :
+      p.set_p_Plane_01_0_Axis_maxplane(self.getInputFromPort('p_Plane_01_0_Axis_maxplane'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_lines') :
+      p.set_p_Plane_01_0_Axis_lines(self.getInputFromPort('p_Plane_01_0_Axis_lines'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_minticks') :
+      p.set_p_Plane_01_0_Axis_minticks(self.getInputFromPort('p_Plane_01_0_Axis_minticks'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_maxticks') :
+      p.set_p_Plane_01_0_Axis_maxticks(self.getInputFromPort('p_Plane_01_0_Axis_maxticks'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_minlabel') :
+      p.set_p_Plane_01_0_Axis_minlabel(self.getInputFromPort('p_Plane_01_0_Axis_minlabel'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_maxlabel') :
+      p.set_p_Plane_01_0_Axis_maxlabel(self.getInputFromPort('p_Plane_01_0_Axis_maxlabel'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_minvalue') :
+      p.set_p_Plane_01_0_Axis_minvalue(self.getInputFromPort('p_Plane_01_0_Axis_minvalue'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_maxvalue') :
+      p.set_p_Plane_01_0_Axis_maxvalue(self.getInputFromPort('p_Plane_01_0_Axis_maxvalue'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_width') :
+      p.set_p_Plane_01_0_Axis_width(self.getInputFromPort('p_Plane_01_0_Axis_width'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_tickangle') :
+      p.set_p_Plane_01_0_Axis_tickangle(self.getInputFromPort('p_Plane_01_0_Axis_tickangle'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_ticktilt') :
+      p.set_p_Plane_01_0_Axis_ticktilt(self.getInputFromPort('p_Plane_01_0_Axis_ticktilt'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_ticksize') :
+      p.set_p_Plane_01_0_Axis_ticksize(self.getInputFromPort('p_Plane_01_0_Axis_ticksize'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_labelangle') :
+      p.set_p_Plane_01_0_Axis_labelangle(self.getInputFromPort('p_Plane_01_0_Axis_labelangle'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_labelheight') :
+      p.set_p_Plane_01_0_Axis_labelheight(self.getInputFromPort('p_Plane_01_0_Axis_labelheight'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_valuesize') :
+      p.set_p_Plane_01_0_Axis_valuesize(self.getInputFromPort('p_Plane_01_0_Axis_valuesize'))
+    if self.hasInputFromPort('p_Plane_01_0_Axis_valuesquash') :
+      p.set_p_Plane_01_0_Axis_valuesquash(self.getInputFromPort('p_Plane_01_0_Axis_valuesquash'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_absolute') :
+      p.set_p_Plane_01_1_Axis_absolute(self.getInputFromPort('p_Plane_01_1_Axis_absolute'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_divisions') :
+      p.set_p_Plane_01_1_Axis_divisions(self.getInputFromPort('p_Plane_01_1_Axis_divisions'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_offset') :
+      p.set_p_Plane_01_1_Axis_offset(self.getInputFromPort('p_Plane_01_1_Axis_offset'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_range_first') :
+      p.set_p_Plane_01_1_Axis_range_first(self.getInputFromPort('p_Plane_01_1_Axis_range_first'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_range_second') :
+      p.set_p_Plane_01_1_Axis_range_second(self.getInputFromPort('p_Plane_01_1_Axis_range_second'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_min_absolute') :
+      p.set_p_Plane_01_1_Axis_min_absolute(self.getInputFromPort('p_Plane_01_1_Axis_min_absolute'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_max_absolute') :
+      p.set_p_Plane_01_1_Axis_max_absolute(self.getInputFromPort('p_Plane_01_1_Axis_max_absolute'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_minplane') :
+      p.set_p_Plane_01_1_Axis_minplane(self.getInputFromPort('p_Plane_01_1_Axis_minplane'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_maxplane') :
+      p.set_p_Plane_01_1_Axis_maxplane(self.getInputFromPort('p_Plane_01_1_Axis_maxplane'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_lines') :
+      p.set_p_Plane_01_1_Axis_lines(self.getInputFromPort('p_Plane_01_1_Axis_lines'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_minticks') :
+      p.set_p_Plane_01_1_Axis_minticks(self.getInputFromPort('p_Plane_01_1_Axis_minticks'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_maxticks') :
+      p.set_p_Plane_01_1_Axis_maxticks(self.getInputFromPort('p_Plane_01_1_Axis_maxticks'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_minlabel') :
+      p.set_p_Plane_01_1_Axis_minlabel(self.getInputFromPort('p_Plane_01_1_Axis_minlabel'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_maxlabel') :
+      p.set_p_Plane_01_1_Axis_maxlabel(self.getInputFromPort('p_Plane_01_1_Axis_maxlabel'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_minvalue') :
+      p.set_p_Plane_01_1_Axis_minvalue(self.getInputFromPort('p_Plane_01_1_Axis_minvalue'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_maxvalue') :
+      p.set_p_Plane_01_1_Axis_maxvalue(self.getInputFromPort('p_Plane_01_1_Axis_maxvalue'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_width') :
+      p.set_p_Plane_01_1_Axis_width(self.getInputFromPort('p_Plane_01_1_Axis_width'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_tickangle') :
+      p.set_p_Plane_01_1_Axis_tickangle(self.getInputFromPort('p_Plane_01_1_Axis_tickangle'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_ticktilt') :
+      p.set_p_Plane_01_1_Axis_ticktilt(self.getInputFromPort('p_Plane_01_1_Axis_ticktilt'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_ticksize') :
+      p.set_p_Plane_01_1_Axis_ticksize(self.getInputFromPort('p_Plane_01_1_Axis_ticksize'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_labelangle') :
+      p.set_p_Plane_01_1_Axis_labelangle(self.getInputFromPort('p_Plane_01_1_Axis_labelangle'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_labelheight') :
+      p.set_p_Plane_01_1_Axis_labelheight(self.getInputFromPort('p_Plane_01_1_Axis_labelheight'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_valuesize') :
+      p.set_p_Plane_01_1_Axis_valuesize(self.getInputFromPort('p_Plane_01_1_Axis_valuesize'))
+    if self.hasInputFromPort('p_Plane_01_1_Axis_valuesquash') :
+      p.set_p_Plane_01_1_Axis_valuesquash(self.getInputFromPort('p_Plane_01_1_Axis_valuesquash'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_absolute') :
+      p.set_p_Plane_02_0_Axis_absolute(self.getInputFromPort('p_Plane_02_0_Axis_absolute'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_divisions') :
+      p.set_p_Plane_02_0_Axis_divisions(self.getInputFromPort('p_Plane_02_0_Axis_divisions'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_offset') :
+      p.set_p_Plane_02_0_Axis_offset(self.getInputFromPort('p_Plane_02_0_Axis_offset'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_range_first') :
+      p.set_p_Plane_02_0_Axis_range_first(self.getInputFromPort('p_Plane_02_0_Axis_range_first'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_range_second') :
+      p.set_p_Plane_02_0_Axis_range_second(self.getInputFromPort('p_Plane_02_0_Axis_range_second'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_min_absolute') :
+      p.set_p_Plane_02_0_Axis_min_absolute(self.getInputFromPort('p_Plane_02_0_Axis_min_absolute'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_max_absolute') :
+      p.set_p_Plane_02_0_Axis_max_absolute(self.getInputFromPort('p_Plane_02_0_Axis_max_absolute'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_minplane') :
+      p.set_p_Plane_02_0_Axis_minplane(self.getInputFromPort('p_Plane_02_0_Axis_minplane'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_maxplane') :
+      p.set_p_Plane_02_0_Axis_maxplane(self.getInputFromPort('p_Plane_02_0_Axis_maxplane'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_lines') :
+      p.set_p_Plane_02_0_Axis_lines(self.getInputFromPort('p_Plane_02_0_Axis_lines'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_minticks') :
+      p.set_p_Plane_02_0_Axis_minticks(self.getInputFromPort('p_Plane_02_0_Axis_minticks'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_maxticks') :
+      p.set_p_Plane_02_0_Axis_maxticks(self.getInputFromPort('p_Plane_02_0_Axis_maxticks'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_minlabel') :
+      p.set_p_Plane_02_0_Axis_minlabel(self.getInputFromPort('p_Plane_02_0_Axis_minlabel'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_maxlabel') :
+      p.set_p_Plane_02_0_Axis_maxlabel(self.getInputFromPort('p_Plane_02_0_Axis_maxlabel'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_minvalue') :
+      p.set_p_Plane_02_0_Axis_minvalue(self.getInputFromPort('p_Plane_02_0_Axis_minvalue'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_maxvalue') :
+      p.set_p_Plane_02_0_Axis_maxvalue(self.getInputFromPort('p_Plane_02_0_Axis_maxvalue'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_width') :
+      p.set_p_Plane_02_0_Axis_width(self.getInputFromPort('p_Plane_02_0_Axis_width'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_tickangle') :
+      p.set_p_Plane_02_0_Axis_tickangle(self.getInputFromPort('p_Plane_02_0_Axis_tickangle'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_ticktilt') :
+      p.set_p_Plane_02_0_Axis_ticktilt(self.getInputFromPort('p_Plane_02_0_Axis_ticktilt'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_ticksize') :
+      p.set_p_Plane_02_0_Axis_ticksize(self.getInputFromPort('p_Plane_02_0_Axis_ticksize'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_labelangle') :
+      p.set_p_Plane_02_0_Axis_labelangle(self.getInputFromPort('p_Plane_02_0_Axis_labelangle'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_labelheight') :
+      p.set_p_Plane_02_0_Axis_labelheight(self.getInputFromPort('p_Plane_02_0_Axis_labelheight'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_valuesize') :
+      p.set_p_Plane_02_0_Axis_valuesize(self.getInputFromPort('p_Plane_02_0_Axis_valuesize'))
+    if self.hasInputFromPort('p_Plane_02_0_Axis_valuesquash') :
+      p.set_p_Plane_02_0_Axis_valuesquash(self.getInputFromPort('p_Plane_02_0_Axis_valuesquash'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_absolute') :
+      p.set_p_Plane_02_2_Axis_absolute(self.getInputFromPort('p_Plane_02_2_Axis_absolute'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_divisions') :
+      p.set_p_Plane_02_2_Axis_divisions(self.getInputFromPort('p_Plane_02_2_Axis_divisions'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_offset') :
+      p.set_p_Plane_02_2_Axis_offset(self.getInputFromPort('p_Plane_02_2_Axis_offset'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_range_first') :
+      p.set_p_Plane_02_2_Axis_range_first(self.getInputFromPort('p_Plane_02_2_Axis_range_first'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_range_second') :
+      p.set_p_Plane_02_2_Axis_range_second(self.getInputFromPort('p_Plane_02_2_Axis_range_second'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_min_absolute') :
+      p.set_p_Plane_02_2_Axis_min_absolute(self.getInputFromPort('p_Plane_02_2_Axis_min_absolute'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_max_absolute') :
+      p.set_p_Plane_02_2_Axis_max_absolute(self.getInputFromPort('p_Plane_02_2_Axis_max_absolute'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_minplane') :
+      p.set_p_Plane_02_2_Axis_minplane(self.getInputFromPort('p_Plane_02_2_Axis_minplane'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_maxplane') :
+      p.set_p_Plane_02_2_Axis_maxplane(self.getInputFromPort('p_Plane_02_2_Axis_maxplane'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_lines') :
+      p.set_p_Plane_02_2_Axis_lines(self.getInputFromPort('p_Plane_02_2_Axis_lines'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_minticks') :
+      p.set_p_Plane_02_2_Axis_minticks(self.getInputFromPort('p_Plane_02_2_Axis_minticks'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_maxticks') :
+      p.set_p_Plane_02_2_Axis_maxticks(self.getInputFromPort('p_Plane_02_2_Axis_maxticks'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_minlabel') :
+      p.set_p_Plane_02_2_Axis_minlabel(self.getInputFromPort('p_Plane_02_2_Axis_minlabel'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_maxlabel') :
+      p.set_p_Plane_02_2_Axis_maxlabel(self.getInputFromPort('p_Plane_02_2_Axis_maxlabel'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_minvalue') :
+      p.set_p_Plane_02_2_Axis_minvalue(self.getInputFromPort('p_Plane_02_2_Axis_minvalue'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_maxvalue') :
+      p.set_p_Plane_02_2_Axis_maxvalue(self.getInputFromPort('p_Plane_02_2_Axis_maxvalue'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_width') :
+      p.set_p_Plane_02_2_Axis_width(self.getInputFromPort('p_Plane_02_2_Axis_width'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_tickangle') :
+      p.set_p_Plane_02_2_Axis_tickangle(self.getInputFromPort('p_Plane_02_2_Axis_tickangle'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_ticktilt') :
+      p.set_p_Plane_02_2_Axis_ticktilt(self.getInputFromPort('p_Plane_02_2_Axis_ticktilt'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_ticksize') :
+      p.set_p_Plane_02_2_Axis_ticksize(self.getInputFromPort('p_Plane_02_2_Axis_ticksize'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_labelangle') :
+      p.set_p_Plane_02_2_Axis_labelangle(self.getInputFromPort('p_Plane_02_2_Axis_labelangle'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_labelheight') :
+      p.set_p_Plane_02_2_Axis_labelheight(self.getInputFromPort('p_Plane_02_2_Axis_labelheight'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_valuesize') :
+      p.set_p_Plane_02_2_Axis_valuesize(self.getInputFromPort('p_Plane_02_2_Axis_valuesize'))
+    if self.hasInputFromPort('p_Plane_02_2_Axis_valuesquash') :
+      p.set_p_Plane_02_2_Axis_valuesquash(self.getInputFromPort('p_Plane_02_2_Axis_valuesquash'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_absolute') :
+      p.set_p_Plane_12_1_Axis_absolute(self.getInputFromPort('p_Plane_12_1_Axis_absolute'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_divisions') :
+      p.set_p_Plane_12_1_Axis_divisions(self.getInputFromPort('p_Plane_12_1_Axis_divisions'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_offset') :
+      p.set_p_Plane_12_1_Axis_offset(self.getInputFromPort('p_Plane_12_1_Axis_offset'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_range_first') :
+      p.set_p_Plane_12_1_Axis_range_first(self.getInputFromPort('p_Plane_12_1_Axis_range_first'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_range_second') :
+      p.set_p_Plane_12_1_Axis_range_second(self.getInputFromPort('p_Plane_12_1_Axis_range_second'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_min_absolute') :
+      p.set_p_Plane_12_1_Axis_min_absolute(self.getInputFromPort('p_Plane_12_1_Axis_min_absolute'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_max_absolute') :
+      p.set_p_Plane_12_1_Axis_max_absolute(self.getInputFromPort('p_Plane_12_1_Axis_max_absolute'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_minplane') :
+      p.set_p_Plane_12_1_Axis_minplane(self.getInputFromPort('p_Plane_12_1_Axis_minplane'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_maxplane') :
+      p.set_p_Plane_12_1_Axis_maxplane(self.getInputFromPort('p_Plane_12_1_Axis_maxplane'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_lines') :
+      p.set_p_Plane_12_1_Axis_lines(self.getInputFromPort('p_Plane_12_1_Axis_lines'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_minticks') :
+      p.set_p_Plane_12_1_Axis_minticks(self.getInputFromPort('p_Plane_12_1_Axis_minticks'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_maxticks') :
+      p.set_p_Plane_12_1_Axis_maxticks(self.getInputFromPort('p_Plane_12_1_Axis_maxticks'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_minlabel') :
+      p.set_p_Plane_12_1_Axis_minlabel(self.getInputFromPort('p_Plane_12_1_Axis_minlabel'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_maxlabel') :
+      p.set_p_Plane_12_1_Axis_maxlabel(self.getInputFromPort('p_Plane_12_1_Axis_maxlabel'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_minvalue') :
+      p.set_p_Plane_12_1_Axis_minvalue(self.getInputFromPort('p_Plane_12_1_Axis_minvalue'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_maxvalue') :
+      p.set_p_Plane_12_1_Axis_maxvalue(self.getInputFromPort('p_Plane_12_1_Axis_maxvalue'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_width') :
+      p.set_p_Plane_12_1_Axis_width(self.getInputFromPort('p_Plane_12_1_Axis_width'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_tickangle') :
+      p.set_p_Plane_12_1_Axis_tickangle(self.getInputFromPort('p_Plane_12_1_Axis_tickangle'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_ticktilt') :
+      p.set_p_Plane_12_1_Axis_ticktilt(self.getInputFromPort('p_Plane_12_1_Axis_ticktilt'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_ticksize') :
+      p.set_p_Plane_12_1_Axis_ticksize(self.getInputFromPort('p_Plane_12_1_Axis_ticksize'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_labelangle') :
+      p.set_p_Plane_12_1_Axis_labelangle(self.getInputFromPort('p_Plane_12_1_Axis_labelangle'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_labelheight') :
+      p.set_p_Plane_12_1_Axis_labelheight(self.getInputFromPort('p_Plane_12_1_Axis_labelheight'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_valuesize') :
+      p.set_p_Plane_12_1_Axis_valuesize(self.getInputFromPort('p_Plane_12_1_Axis_valuesize'))
+    if self.hasInputFromPort('p_Plane_12_1_Axis_valuesquash') :
+      p.set_p_Plane_12_1_Axis_valuesquash(self.getInputFromPort('p_Plane_12_1_Axis_valuesquash'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_absolute') :
+      p.set_p_Plane_12_2_Axis_absolute(self.getInputFromPort('p_Plane_12_2_Axis_absolute'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_divisions') :
+      p.set_p_Plane_12_2_Axis_divisions(self.getInputFromPort('p_Plane_12_2_Axis_divisions'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_offset') :
+      p.set_p_Plane_12_2_Axis_offset(self.getInputFromPort('p_Plane_12_2_Axis_offset'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_range_first') :
+      p.set_p_Plane_12_2_Axis_range_first(self.getInputFromPort('p_Plane_12_2_Axis_range_first'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_range_second') :
+      p.set_p_Plane_12_2_Axis_range_second(self.getInputFromPort('p_Plane_12_2_Axis_range_second'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_min_absolute') :
+      p.set_p_Plane_12_2_Axis_min_absolute(self.getInputFromPort('p_Plane_12_2_Axis_min_absolute'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_max_absolute') :
+      p.set_p_Plane_12_2_Axis_max_absolute(self.getInputFromPort('p_Plane_12_2_Axis_max_absolute'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_minplane') :
+      p.set_p_Plane_12_2_Axis_minplane(self.getInputFromPort('p_Plane_12_2_Axis_minplane'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_maxplane') :
+      p.set_p_Plane_12_2_Axis_maxplane(self.getInputFromPort('p_Plane_12_2_Axis_maxplane'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_lines') :
+      p.set_p_Plane_12_2_Axis_lines(self.getInputFromPort('p_Plane_12_2_Axis_lines'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_minticks') :
+      p.set_p_Plane_12_2_Axis_minticks(self.getInputFromPort('p_Plane_12_2_Axis_minticks'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_maxticks') :
+      p.set_p_Plane_12_2_Axis_maxticks(self.getInputFromPort('p_Plane_12_2_Axis_maxticks'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_minlabel') :
+      p.set_p_Plane_12_2_Axis_minlabel(self.getInputFromPort('p_Plane_12_2_Axis_minlabel'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_maxlabel') :
+      p.set_p_Plane_12_2_Axis_maxlabel(self.getInputFromPort('p_Plane_12_2_Axis_maxlabel'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_minvalue') :
+      p.set_p_Plane_12_2_Axis_minvalue(self.getInputFromPort('p_Plane_12_2_Axis_minvalue'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_maxvalue') :
+      p.set_p_Plane_12_2_Axis_maxvalue(self.getInputFromPort('p_Plane_12_2_Axis_maxvalue'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_width') :
+      p.set_p_Plane_12_2_Axis_width(self.getInputFromPort('p_Plane_12_2_Axis_width'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_tickangle') :
+      p.set_p_Plane_12_2_Axis_tickangle(self.getInputFromPort('p_Plane_12_2_Axis_tickangle'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_ticktilt') :
+      p.set_p_Plane_12_2_Axis_ticktilt(self.getInputFromPort('p_Plane_12_2_Axis_ticktilt'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_ticksize') :
+      p.set_p_Plane_12_2_Axis_ticksize(self.getInputFromPort('p_Plane_12_2_Axis_ticksize'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_labelangle') :
+      p.set_p_Plane_12_2_Axis_labelangle(self.getInputFromPort('p_Plane_12_2_Axis_labelangle'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_labelheight') :
+      p.set_p_Plane_12_2_Axis_labelheight(self.getInputFromPort('p_Plane_12_2_Axis_labelheight'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_valuesize') :
+      p.set_p_Plane_12_2_Axis_valuesize(self.getInputFromPort('p_Plane_12_2_Axis_valuesize'))
+    if self.hasInputFromPort('p_Plane_12_2_Axis_valuesquash') :
+      p.set_p_Plane_12_2_Axis_valuesquash(self.getInputFromPort('p_Plane_12_2_Axis_valuesquash'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Axes', results)
+
+class RescaleColorMap(Visualization) :
+  def compute(self) :
+    p = sr_py.RescaleColorMapAlg()
+    if self.hasInputFromPort('p_main_frame') :
+      p.set_p_main_frame(self.getInputFromPort('p_main_frame'))
+    if self.hasInputFromPort('p_isFixed') :
+      p.set_p_isFixed(self.getInputFromPort('p_isFixed'))
+    if self.hasInputFromPort('p_min') :
+      p.set_p_min(self.getInputFromPort('p_min'))
+    if self.hasInputFromPort('p_max') :
+      p.set_p_max(self.getInputFromPort('p_max'))
+    if self.hasInputFromPort('p_makeSymmetric') :
+      p.set_p_makeSymmetric(self.getInputFromPort('p_makeSymmetric'))
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(ColorMap, Field)
+    self.setResult('ColorMap', results)
+
+class ConvertNrrdsToTexture(Visualization) :
+  def compute(self) :
+    p = sr_py.ConvertNrrdsToTextureAlg()
+    if self.hasInputFromPort('p_vmin') :
+      p.set_p_vmin(self.getInputFromPort('p_vmin'))
+    if self.hasInputFromPort('p_vmax') :
+      p.set_p_vmax(self.getInputFromPort('p_vmax'))
+    if self.hasInputFromPort('p_gmin') :
+      p.set_p_gmin(self.getInputFromPort('p_gmin'))
+    if self.hasInputFromPort('p_gmax') :
+      p.set_p_gmax(self.getInputFromPort('p_gmax'))
+    if self.hasInputFromPort('p_mmin') :
+      p.set_p_mmin(self.getInputFromPort('p_mmin'))
+    if self.hasInputFromPort('p_mmax') :
+      p.set_p_mmax(self.getInputFromPort('p_mmax'))
+    if self.hasInputFromPort('p_is_fixed') :
+      p.set_p_is_fixed(self.getInputFromPort('p_is_fixed'))
+    if self.hasInputFromPort('p_card_mem') :
+      p.set_p_card_mem(self.getInputFromPort('p_card_mem'))
+    if self.hasInputFromPort('p_card_mem_auto') :
+      p.set_p_card_mem_auto(self.getInputFromPort('p_card_mem_auto'))
+    if self.hasInputFromPort('p_is_uchar') :
+      p.set_p_is_uchar(self.getInputFromPort('p_is_uchar'))
+    if self.hasInputFromPort('p_histogram') :
+      p.set_p_histogram(self.getInputFromPort('p_histogram'))
+    if self.hasInputFromPort('p_gamma') :
+      p.set_p_gamma(self.getInputFromPort('p_gamma'))
+    Value_Nrrd = 0
+    if self.hasInputFromPort('Value Nrrd') :
+      Value_Nrrd = self.getInputFromPort('Value Nrrd')
+    Gradient_Magnitude_Nrrd = 0
+    if self.hasInputFromPort('Gradient Magnitude Nrrd') :
+      Gradient_Magnitude_Nrrd = self.getInputFromPort('Gradient Magnitude Nrrd')
+    results = p.execute(Value_Nrrd, Gradient_Magnitude_Nrrd)
+    self.setResult('Texture', results[0])
+    self.setResult('JointHistoGram', results[1])
+
+class ChooseColorMap(Visualization) :
+  def compute(self) :
+    p = sr_py.ChooseColorMapAlg()
+    if self.hasInputFromPort('p_use_first_valid') :
+      p.set_p_use_first_valid(self.getInputFromPort('p_use_first_valid'))
+    if self.hasInputFromPort('p_port_valid_index') :
+      p.set_p_port_valid_index(self.getInputFromPort('p_port_valid_index'))
+    if self.hasInputFromPort('p_port_selected_index') :
+      p.set_p_port_selected_index(self.getInputFromPort('p_port_selected_index'))
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    results = p.execute(ColorMap)
+    self.setResult('ColorMap', results)
+
+class CreateLightForViewer(Visualization) :
+  def compute(self) :
+    p = sr_py.CreateLightForViewerAlg()
+    if self.hasInputFromPort('p_control_pos_saved') :
+      p.set_p_control_pos_saved(self.getInputFromPort('p_control_pos_saved'))
+    if self.hasInputFromPort('p_control_x') :
+      p.set_p_control_x(self.getInputFromPort('p_control_x'))
+    if self.hasInputFromPort('p_control_y') :
+      p.set_p_control_y(self.getInputFromPort('p_control_y'))
+    if self.hasInputFromPort('p_control_z') :
+      p.set_p_control_z(self.getInputFromPort('p_control_z'))
+    if self.hasInputFromPort('p_at_x') :
+      p.set_p_at_x(self.getInputFromPort('p_at_x'))
+    if self.hasInputFromPort('p_at_y') :
+      p.set_p_at_y(self.getInputFromPort('p_at_y'))
+    if self.hasInputFromPort('p_at_z') :
+      p.set_p_at_z(self.getInputFromPort('p_at_z'))
+    if self.hasInputFromPort('p_type') :
+      p.set_p_type(self.getInputFromPort('p_type'))
+    if self.hasInputFromPort('p_on') :
+      p.set_p_on(self.getInputFromPort('p_on'))
+    results = p.execute()
+    self.setResult('Geometry', results)
+
+class ShowTextureVolume(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowTextureVolumeAlg()
+    if self.hasInputFromPort('p_sampling_rate_hi') :
+      p.set_p_sampling_rate_hi(self.getInputFromPort('p_sampling_rate_hi'))
+    if self.hasInputFromPort('p_sampling_rate_lo') :
+      p.set_p_sampling_rate_lo(self.getInputFromPort('p_sampling_rate_lo'))
+    if self.hasInputFromPort('p_gradient_min') :
+      p.set_p_gradient_min(self.getInputFromPort('p_gradient_min'))
+    if self.hasInputFromPort('p_gradient_max') :
+      p.set_p_gradient_max(self.getInputFromPort('p_gradient_max'))
+    if self.hasInputFromPort('p_adaptive') :
+      p.set_p_adaptive(self.getInputFromPort('p_adaptive'))
+    if self.hasInputFromPort('p_cmap_size') :
+      p.set_p_cmap_size(self.getInputFromPort('p_cmap_size'))
+    if self.hasInputFromPort('p_sw_raster') :
+      p.set_p_sw_raster(self.getInputFromPort('p_sw_raster'))
+    if self.hasInputFromPort('p_render_style') :
+      p.set_p_render_style(self.getInputFromPort('p_render_style'))
+    if self.hasInputFromPort('p_alpha_scale') :
+      p.set_p_alpha_scale(self.getInputFromPort('p_alpha_scale'))
+    if self.hasInputFromPort('p_interp_mode') :
+      p.set_p_interp_mode(self.getInputFromPort('p_interp_mode'))
+    if self.hasInputFromPort('p_shading') :
+      p.set_p_shading(self.getInputFromPort('p_shading'))
+    if self.hasInputFromPort('p_ambient') :
+      p.set_p_ambient(self.getInputFromPort('p_ambient'))
+    if self.hasInputFromPort('p_diffuse') :
+      p.set_p_diffuse(self.getInputFromPort('p_diffuse'))
+    if self.hasInputFromPort('p_specular') :
+      p.set_p_specular(self.getInputFromPort('p_specular'))
+    if self.hasInputFromPort('p_shine') :
+      p.set_p_shine(self.getInputFromPort('p_shine'))
+    if self.hasInputFromPort('p_light') :
+      p.set_p_light(self.getInputFromPort('p_light'))
+    if self.hasInputFromPort('p_blend_res') :
+      p.set_p_blend_res(self.getInputFromPort('p_blend_res'))
+    if self.hasInputFromPort('p_multi_level') :
+      p.set_p_multi_level(self.getInputFromPort('p_multi_level'))
+    if self.hasInputFromPort('p_use_stencil') :
+      p.set_p_use_stencil(self.getInputFromPort('p_use_stencil'))
+    if self.hasInputFromPort('p_invert_opacity') :
+      p.set_p_invert_opacity(self.getInputFromPort('p_invert_opacity'))
+    if self.hasInputFromPort('p_num_clipping_planes') :
+      p.set_p_num_clipping_planes(self.getInputFromPort('p_num_clipping_planes'))
+    if self.hasInputFromPort('p_show_clipping_widgets') :
+      p.set_p_show_clipping_widgets(self.getInputFromPort('p_show_clipping_widgets'))
+    if self.hasInputFromPort('p_level_on') :
+      p.set_p_level_on(self.getInputFromPort('p_level_on'))
+    if self.hasInputFromPort('p_level_vals') :
+      p.set_p_level_vals(self.getInputFromPort('p_level_vals'))
+    if self.hasInputFromPort('p_id') :
+      p.set_p_id(self.getInputFromPort('p_id'))
+    Texture = 0
+    if self.hasInputFromPort('Texture') :
+      Texture = self.getInputFromPort('Texture')
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    ColorMap2 = 0
+    if self.hasInputFromPort('ColorMap2') :
+      ColorMap2 = self.getInputFromPort('ColorMap2')
+    results = p.execute(Texture, ColorMap, ColorMap2)
+    self.setResult('Geometry', results[0])
+    self.setResult('ColorMap', results[1])
+
+class ShowFieldGlyphs(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowFieldGlyphsAlg()
+    if self.hasInputFromPort('p_scalars_has_data') :
+      p.set_p_scalars_has_data(self.getInputFromPort('p_scalars_has_data'))
+    if self.hasInputFromPort('p_scalars_on') :
+      p.set_p_scalars_on(self.getInputFromPort('p_scalars_on'))
+    if self.hasInputFromPort('p_scalars_display_type') :
+      p.set_p_scalars_display_type(self.getInputFromPort('p_scalars_display_type'))
+    if self.hasInputFromPort('p_scalars_transparency') :
+      p.set_p_scalars_transparency(self.getInputFromPort('p_scalars_transparency'))
+    if self.hasInputFromPort('p_scalars_normalize') :
+      p.set_p_scalars_normalize(self.getInputFromPort('p_scalars_normalize'))
+    if self.hasInputFromPort('p_scalars_color_type') :
+      p.set_p_scalars_color_type(self.getInputFromPort('p_scalars_color_type'))
+    if self.hasInputFromPort('p_scalars_resolution') :
+      p.set_p_scalars_resolution(self.getInputFromPort('p_scalars_resolution'))
+    if self.hasInputFromPort('p_vectors_has_data') :
+      p.set_p_vectors_has_data(self.getInputFromPort('p_vectors_has_data'))
+    if self.hasInputFromPort('p_vectors_on') :
+      p.set_p_vectors_on(self.getInputFromPort('p_vectors_on'))
+    if self.hasInputFromPort('p_vectors_display_type') :
+      p.set_p_vectors_display_type(self.getInputFromPort('p_vectors_display_type'))
+    if self.hasInputFromPort('p_vectors_transparency') :
+      p.set_p_vectors_transparency(self.getInputFromPort('p_vectors_transparency'))
+    if self.hasInputFromPort('p_vectors_normalize') :
+      p.set_p_vectors_normalize(self.getInputFromPort('p_vectors_normalize'))
+    if self.hasInputFromPort('p_vectors_bidirectional') :
+      p.set_p_vectors_bidirectional(self.getInputFromPort('p_vectors_bidirectional'))
+    if self.hasInputFromPort('p_vectors_color_type') :
+      p.set_p_vectors_color_type(self.getInputFromPort('p_vectors_color_type'))
+    if self.hasInputFromPort('p_vectors_resolution') :
+      p.set_p_vectors_resolution(self.getInputFromPort('p_vectors_resolution'))
+    if self.hasInputFromPort('p_tensors_has_data') :
+      p.set_p_tensors_has_data(self.getInputFromPort('p_tensors_has_data'))
+    if self.hasInputFromPort('p_tensors_on') :
+      p.set_p_tensors_on(self.getInputFromPort('p_tensors_on'))
+    if self.hasInputFromPort('p_tensors_display_type') :
+      p.set_p_tensors_display_type(self.getInputFromPort('p_tensors_display_type'))
+    if self.hasInputFromPort('p_tensors_transparency') :
+      p.set_p_tensors_transparency(self.getInputFromPort('p_tensors_transparency'))
+    if self.hasInputFromPort('p_tensors_normalize') :
+      p.set_p_tensors_normalize(self.getInputFromPort('p_tensors_normalize'))
+    if self.hasInputFromPort('p_tensors_color_type') :
+      p.set_p_tensors_color_type(self.getInputFromPort('p_tensors_color_type'))
+    if self.hasInputFromPort('p_tensors_resolution') :
+      p.set_p_tensors_resolution(self.getInputFromPort('p_tensors_resolution'))
+    if self.hasInputFromPort('p_tensors_emphasis') :
+      p.set_p_tensors_emphasis(self.getInputFromPort('p_tensors_emphasis'))
+    if self.hasInputFromPort('p_secondary_has_data') :
+      p.set_p_secondary_has_data(self.getInputFromPort('p_secondary_has_data'))
+    if self.hasInputFromPort('p_secondary_on') :
+      p.set_p_secondary_on(self.getInputFromPort('p_secondary_on'))
+    if self.hasInputFromPort('p_secondary_display_type') :
+      p.set_p_secondary_display_type(self.getInputFromPort('p_secondary_display_type'))
+    if self.hasInputFromPort('p_secondary_color_type') :
+      p.set_p_secondary_color_type(self.getInputFromPort('p_secondary_color_type'))
+    if self.hasInputFromPort('p_secondary_alpha') :
+      p.set_p_secondary_alpha(self.getInputFromPort('p_secondary_alpha'))
+    if self.hasInputFromPort('p_secondary_value') :
+      p.set_p_secondary_value(self.getInputFromPort('p_secondary_value'))
+    if self.hasInputFromPort('p_tertiary_has_data') :
+      p.set_p_tertiary_has_data(self.getInputFromPort('p_tertiary_has_data'))
+    if self.hasInputFromPort('p_tertiary_on') :
+      p.set_p_tertiary_on(self.getInputFromPort('p_tertiary_on'))
+    if self.hasInputFromPort('p_tertiary_display_type') :
+      p.set_p_tertiary_display_type(self.getInputFromPort('p_tertiary_display_type'))
+    if self.hasInputFromPort('p_tertiary_color_type') :
+      p.set_p_tertiary_color_type(self.getInputFromPort('p_tertiary_color_type'))
+    if self.hasInputFromPort('p_tertiary_alpha') :
+      p.set_p_tertiary_alpha(self.getInputFromPort('p_tertiary_alpha'))
+    if self.hasInputFromPort('p_tertiary_value') :
+      p.set_p_tertiary_value(self.getInputFromPort('p_tertiary_value'))
+    if self.hasInputFromPort('p_text_on') :
+      p.set_p_text_on(self.getInputFromPort('p_text_on'))
+    if self.hasInputFromPort('p_text_color_type') :
+      p.set_p_text_color_type(self.getInputFromPort('p_text_color_type'))
+    if self.hasInputFromPort('p_text_color_r') :
+      p.set_p_text_color_r(self.getInputFromPort('p_text_color_r'))
+    if self.hasInputFromPort('p_text_color_g') :
+      p.set_p_text_color_g(self.getInputFromPort('p_text_color_g'))
+    if self.hasInputFromPort('p_text_color_b') :
+      p.set_p_text_color_b(self.getInputFromPort('p_text_color_b'))
+    if self.hasInputFromPort('p_text_backface_cull') :
+      p.set_p_text_backface_cull(self.getInputFromPort('p_text_backface_cull'))
+    if self.hasInputFromPort('p_text_always_visible') :
+      p.set_p_text_always_visible(self.getInputFromPort('p_text_always_visible'))
+    if self.hasInputFromPort('p_text_fontsize') :
+      p.set_p_text_fontsize(self.getInputFromPort('p_text_fontsize'))
+    if self.hasInputFromPort('p_text_precision') :
+      p.set_p_text_precision(self.getInputFromPort('p_text_precision'))
+    if self.hasInputFromPort('p_text_render_locations') :
+      p.set_p_text_render_locations(self.getInputFromPort('p_text_render_locations'))
+    if self.hasInputFromPort('p_text_show_data') :
+      p.set_p_text_show_data(self.getInputFromPort('p_text_show_data'))
+    if self.hasInputFromPort('p_text_show_nodes') :
+      p.set_p_text_show_nodes(self.getInputFromPort('p_text_show_nodes'))
+    if self.hasInputFromPort('p_text_show_edges') :
+      p.set_p_text_show_edges(self.getInputFromPort('p_text_show_edges'))
+    if self.hasInputFromPort('p_text_show_faces') :
+      p.set_p_text_show_faces(self.getInputFromPort('p_text_show_faces'))
+    if self.hasInputFromPort('p_text_show_cells') :
+      p.set_p_text_show_cells(self.getInputFromPort('p_text_show_cells'))
+    if self.hasInputFromPort('p_def_color_r') :
+      p.set_p_def_color_r(self.getInputFromPort('p_def_color_r'))
+    if self.hasInputFromPort('p_def_color_g') :
+      p.set_p_def_color_g(self.getInputFromPort('p_def_color_g'))
+    if self.hasInputFromPort('p_def_color_b') :
+      p.set_p_def_color_b(self.getInputFromPort('p_def_color_b'))
+    if self.hasInputFromPort('p_def_color_a') :
+      p.set_p_def_color_a(self.getInputFromPort('p_def_color_a'))
+    if self.hasInputFromPort('p_active_tab') :
+      p.set_p_active_tab(self.getInputFromPort('p_active_tab'))
+    if self.hasInputFromPort('p_interactive_mode') :
+      p.set_p_interactive_mode(self.getInputFromPort('p_interactive_mode'))
+    if self.hasInputFromPort('p_show_progress') :
+      p.set_p_show_progress(self.getInputFromPort('p_show_progress'))
+    if self.hasInputFromPort('p_field_name') :
+      p.set_p_field_name(self.getInputFromPort('p_field_name'))
+    if self.hasInputFromPort('p_field_name_override') :
+      p.set_p_field_name_override(self.getInputFromPort('p_field_name_override'))
+    if self.hasInputFromPort('p_approx_div') :
+      p.set_p_approx_div(self.getInputFromPort('p_approx_div'))
+    if self.hasInputFromPort('p_use_default_size') :
+      p.set_p_use_default_size(self.getInputFromPort('p_use_default_size'))
+    Primary_Data = 0
+    if self.hasInputFromPort('Primary Data') :
+      Primary_Data = self.getInputFromPort('Primary Data')
+    Primary_ColorMap = 0
+    if self.hasInputFromPort('Primary ColorMap') :
+      Primary_ColorMap = self.getInputFromPort('Primary ColorMap')
+    Secondary_Data = 0
+    if self.hasInputFromPort('Secondary Data') :
+      Secondary_Data = self.getInputFromPort('Secondary Data')
+    Secondary_ColorMap = 0
+    if self.hasInputFromPort('Secondary ColorMap') :
+      Secondary_ColorMap = self.getInputFromPort('Secondary ColorMap')
+    Tertiary_Data = 0
+    if self.hasInputFromPort('Tertiary Data') :
+      Tertiary_Data = self.getInputFromPort('Tertiary Data')
+    Tertiary_ColorMap = 0
+    if self.hasInputFromPort('Tertiary ColorMap') :
+      Tertiary_ColorMap = self.getInputFromPort('Tertiary ColorMap')
+    results = p.execute(Primary_Data, Primary_ColorMap, Secondary_Data, Secondary_ColorMap, Tertiary_Data, Tertiary_ColorMap)
+    self.setResult('Scene Graph', results)
+
+class GenerateStreamLines(Visualization) :
+  def compute(self) :
+    p = sr_py.GenerateStreamLinesAlg()
+    if self.hasInputFromPort('p_stepsize') :
+      p.set_p_stepsize(self.getInputFromPort('p_stepsize'))
+    if self.hasInputFromPort('p_tolerance') :
+      p.set_p_tolerance(self.getInputFromPort('p_tolerance'))
+    if self.hasInputFromPort('p_maxsteps') :
+      p.set_p_maxsteps(self.getInputFromPort('p_maxsteps'))
+    if self.hasInputFromPort('p_direction') :
+      p.set_p_direction(self.getInputFromPort('p_direction'))
+    if self.hasInputFromPort('p_value') :
+      p.set_p_value(self.getInputFromPort('p_value'))
+    if self.hasInputFromPort('p_remove_colinear_pts') :
+      p.set_p_remove_colinear_pts(self.getInputFromPort('p_remove_colinear_pts'))
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    if self.hasInputFromPort('p_nthreads') :
+      p.set_p_nthreads(self.getInputFromPort('p_nthreads'))
+    if self.hasInputFromPort('p_auto_parameterize') :
+      p.set_p_auto_parameterize(self.getInputFromPort('p_auto_parameterize'))
+    Vector_Field = 0
+    if self.hasInputFromPort('Vector Field') :
+      Vector_Field = self.getInputFromPort('Vector Field')
+    Seed_Points = 0
+    if self.hasInputFromPort('Seed Points') :
+      Seed_Points = self.getInputFromPort('Seed Points')
+    results = p.execute(Vector_Field, Seed_Points)
+    self.setResult('Streamlines', results)
+
+class GenerateStreamLinesWithPlacementHeuristic(Visualization) :
+  def compute(self) :
+    p = sr_py.GenerateStreamLinesWithPlacementHeuristicAlg()
+    if self.hasInputFromPort('p_numsl') :
+      p.set_p_numsl(self.getInputFromPort('p_numsl'))
+    if self.hasInputFromPort('p_numpts') :
+      p.set_p_numpts(self.getInputFromPort('p_numpts'))
+    if self.hasInputFromPort('p_minper') :
+      p.set_p_minper(self.getInputFromPort('p_minper'))
+    if self.hasInputFromPort('p_maxper') :
+      p.set_p_maxper(self.getInputFromPort('p_maxper'))
+    if self.hasInputFromPort('p_ming') :
+      p.set_p_ming(self.getInputFromPort('p_ming'))
+    if self.hasInputFromPort('p_maxg') :
+      p.set_p_maxg(self.getInputFromPort('p_maxg'))
+    if self.hasInputFromPort('p_numsamples') :
+      p.set_p_numsamples(self.getInputFromPort('p_numsamples'))
+    if self.hasInputFromPort('p_method') :
+      p.set_p_method(self.getInputFromPort('p_method'))
+    if self.hasInputFromPort('p_stepsize') :
+      p.set_p_stepsize(self.getInputFromPort('p_stepsize'))
+    if self.hasInputFromPort('p_stepout') :
+      p.set_p_stepout(self.getInputFromPort('p_stepout'))
+    if self.hasInputFromPort('p_maxsteps') :
+      p.set_p_maxsteps(self.getInputFromPort('p_maxsteps'))
+    if self.hasInputFromPort('p_minmag') :
+      p.set_p_minmag(self.getInputFromPort('p_minmag'))
+    if self.hasInputFromPort('p_direction') :
+      p.set_p_direction(self.getInputFromPort('p_direction'))
+    Source = 0
+    if self.hasInputFromPort('Source') :
+      Source = self.getInputFromPort('Source')
+    Weighting = 0
+    if self.hasInputFromPort('Weighting') :
+      Weighting = self.getInputFromPort('Weighting')
+    Flow = 0
+    if self.hasInputFromPort('Flow') :
+      Flow = self.getInputFromPort('Flow')
+    Compare = 0
+    if self.hasInputFromPort('Compare') :
+      Compare = self.getInputFromPort('Compare')
+    Seed_points = 0
+    if self.hasInputFromPort('Seed points') :
+      Seed_points = self.getInputFromPort('Seed points')
+    results = p.execute(Source, Weighting, Flow, Compare, Seed_points)
+    self.setResult('Streamlines', results[0])
+    self.setResult('Render', results[1])
+
+class ShowString(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowStringAlg()
+    if self.hasInputFromPort('p_bbox') :
+      p.set_p_bbox(self.getInputFromPort('p_bbox'))
+    if self.hasInputFromPort('p_size') :
+      p.set_p_size(self.getInputFromPort('p_size'))
+    if self.hasInputFromPort('p_location_x') :
+      p.set_p_location_x(self.getInputFromPort('p_location_x'))
+    if self.hasInputFromPort('p_location_y') :
+      p.set_p_location_y(self.getInputFromPort('p_location_y'))
+    if self.hasInputFromPort('p_color_r') :
+      p.set_p_color_r(self.getInputFromPort('p_color_r'))
+    if self.hasInputFromPort('p_color_g') :
+      p.set_p_color_g(self.getInputFromPort('p_color_g'))
+    if self.hasInputFromPort('p_color_b') :
+      p.set_p_color_b(self.getInputFromPort('p_color_b'))
+    Format_String = ''
+    if self.hasInputFromPort('Format String') :
+      Format_String = self.getInputFromPort('Format String')
+    results = p.execute(Format_String)
+    self.setResult('Title', results)
+
+class CreateAndEditColorMap(Visualization) :
+  def compute(self) :
+    p = sr_py.CreateAndEditColorMapAlg()
+    if self.hasInputFromPort('p_rgbhsv') :
+      p.set_p_rgbhsv(self.getInputFromPort('p_rgbhsv'))
+    if self.hasInputFromPort('p_rgb_points') :
+      p.set_p_rgb_points(self.getInputFromPort('p_rgb_points'))
+    if self.hasInputFromPort('p_alpha_points') :
+      p.set_p_alpha_points(self.getInputFromPort('p_alpha_points'))
+    if self.hasInputFromPort('p_resolution') :
+      p.set_p_resolution(self.getInputFromPort('p_resolution'))
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    results = p.execute(ColorMap)
+    self.setResult('ColorMap', results[0])
+    self.setResult('Geometry', results[1])
+
+class ShowMeshBoundingBox(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowMeshBoundingBoxAlg()
+    if self.hasInputFromPort('p_sizex') :
+      p.set_p_sizex(self.getInputFromPort('p_sizex'))
+    if self.hasInputFromPort('p_sizey') :
+      p.set_p_sizey(self.getInputFromPort('p_sizey'))
+    if self.hasInputFromPort('p_sizez') :
+      p.set_p_sizez(self.getInputFromPort('p_sizez'))
+    Field = 0
+    if self.hasInputFromPort('Field') :
+      Field = self.getInputFromPort('Field')
+    results = p.execute(Field)
+    self.setResult('Scene Graph', results)
+
+class CreateStandardColorMaps(Visualization) :
+  def compute(self) :
+    p = sr_py.CreateStandardColorMapsAlg()
+    if self.hasInputFromPort('p_mapName') :
+      p.set_p_mapName(self.getInputFromPort('p_mapName'))
+    if self.hasInputFromPort('p_gamma') :
+      p.set_p_gamma(self.getInputFromPort('p_gamma'))
+    if self.hasInputFromPort('p_resolution') :
+      p.set_p_resolution(self.getInputFromPort('p_resolution'))
+    if self.hasInputFromPort('p_reverse') :
+      p.set_p_reverse(self.getInputFromPort('p_reverse'))
+    if self.hasInputFromPort('p_faux') :
+      p.set_p_faux(self.getInputFromPort('p_faux'))
+    if self.hasInputFromPort('p_positionList') :
+      p.set_p_positionList(self.getInputFromPort('p_positionList'))
+    if self.hasInputFromPort('p_nodeList') :
+      p.set_p_nodeList(self.getInputFromPort('p_nodeList'))
+    if self.hasInputFromPort('p_width') :
+      p.set_p_width(self.getInputFromPort('p_width'))
+    if self.hasInputFromPort('p_height') :
+      p.set_p_height(self.getInputFromPort('p_height'))
+    results = p.execute()
+    self.setResult('ColorMap', results)
+
+class ShowTextureSlices(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowTextureSlicesAlg()
+    if self.hasInputFromPort('p_control_pos_saved') :
+      p.set_p_control_pos_saved(self.getInputFromPort('p_control_pos_saved'))
+    if self.hasInputFromPort('p_drawX') :
+      p.set_p_drawX(self.getInputFromPort('p_drawX'))
+    if self.hasInputFromPort('p_drawY') :
+      p.set_p_drawY(self.getInputFromPort('p_drawY'))
+    if self.hasInputFromPort('p_drawZ') :
+      p.set_p_drawZ(self.getInputFromPort('p_drawZ'))
+    if self.hasInputFromPort('p_drawView') :
+      p.set_p_drawView(self.getInputFromPort('p_drawView'))
+    if self.hasInputFromPort('p_interp_mode') :
+      p.set_p_interp_mode(self.getInputFromPort('p_interp_mode'))
+    if self.hasInputFromPort('p_draw_phi_0') :
+      p.set_p_draw_phi_0(self.getInputFromPort('p_draw_phi_0'))
+    if self.hasInputFromPort('p_draw_phi_1') :
+      p.set_p_draw_phi_1(self.getInputFromPort('p_draw_phi_1'))
+    if self.hasInputFromPort('p_phi_0') :
+      p.set_p_phi_0(self.getInputFromPort('p_phi_0'))
+    if self.hasInputFromPort('p_phi_1') :
+      p.set_p_phi_1(self.getInputFromPort('p_phi_1'))
+    if self.hasInputFromPort('p_multi_level') :
+      p.set_p_multi_level(self.getInputFromPort('p_multi_level'))
+    if self.hasInputFromPort('p_color_changed') :
+      p.set_p_color_changed(self.getInputFromPort('p_color_changed'))
+    if self.hasInputFromPort('p_colors') :
+      p.set_p_colors(self.getInputFromPort('p_colors'))
+    if self.hasInputFromPort('p_level_on') :
+      p.set_p_level_on(self.getInputFromPort('p_level_on'))
+    if self.hasInputFromPort('p_outline_levels') :
+      p.set_p_outline_levels(self.getInputFromPort('p_outline_levels'))
+    if self.hasInputFromPort('p_use_stencil') :
+      p.set_p_use_stencil(self.getInputFromPort('p_use_stencil'))
+    Texture = 0
+    if self.hasInputFromPort('Texture') :
+      Texture = self.getInputFromPort('Texture')
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    ColorMap2 = 0
+    if self.hasInputFromPort('ColorMap2') :
+      ColorMap2 = self.getInputFromPort('ColorMap2')
+    results = p.execute(Texture, ColorMap, ColorMap2)
+    self.setResult('Geometry', results[0])
+    self.setResult('ColorMap', results[1])
+
+class ShowMatrix(Visualization) :
+  def compute(self) :
+    p = sr_py.ShowMatrixAlg()
+    if self.hasInputFromPort('p_xpos') :
+      p.set_p_xpos(self.getInputFromPort('p_xpos'))
+    if self.hasInputFromPort('p_ypos') :
+      p.set_p_ypos(self.getInputFromPort('p_ypos'))
+    if self.hasInputFromPort('p_xscale') :
+      p.set_p_xscale(self.getInputFromPort('p_xscale'))
+    if self.hasInputFromPort('p_yscale') :
+      p.set_p_yscale(self.getInputFromPort('p_yscale'))
+    if self.hasInputFromPort('p_3d_mode') :
+      p.set_p_3d_mode(self.getInputFromPort('p_3d_mode'))
+    if self.hasInputFromPort('p_gmode') :
+      p.set_p_gmode(self.getInputFromPort('p_gmode'))
+    if self.hasInputFromPort('p_showtext') :
+      p.set_p_showtext(self.getInputFromPort('p_showtext'))
+    if self.hasInputFromPort('p_row_begin') :
+      p.set_p_row_begin(self.getInputFromPort('p_row_begin'))
+    if self.hasInputFromPort('p_rows') :
+      p.set_p_rows(self.getInputFromPort('p_rows'))
+    if self.hasInputFromPort('p_col_begin') :
+      p.set_p_col_begin(self.getInputFromPort('p_col_begin'))
+    if self.hasInputFromPort('p_cols') :
+      p.set_p_cols(self.getInputFromPort('p_cols'))
+    if self.hasInputFromPort('p_colormapmode') :
+      p.set_p_colormapmode(self.getInputFromPort('p_colormapmode'))
+    ColorMap = 0
+    if self.hasInputFromPort('ColorMap') :
+      ColorMap = self.getInputFromPort('ColorMap')
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(ColorMap, Matrix)
+    self.setResult('Geometry', results)
+
+class CreateViewerClockIcon(Visualization) :
+  def compute(self) :
+    p = sr_py.CreateViewerClockIconAlg()
+    if self.hasInputFromPort('p_type') :
+      p.set_p_type(self.getInputFromPort('p_type'))
+    if self.hasInputFromPort('p_bbox') :
+      p.set_p_bbox(self.getInputFromPort('p_bbox'))
+    if self.hasInputFromPort('p_format') :
+      p.set_p_format(self.getInputFromPort('p_format'))
+    if self.hasInputFromPort('p_min') :
+      p.set_p_min(self.getInputFromPort('p_min'))
+    if self.hasInputFromPort('p_max') :
+      p.set_p_max(self.getInputFromPort('p_max'))
+    if self.hasInputFromPort('p_current') :
+      p.set_p_current(self.getInputFromPort('p_current'))
+    if self.hasInputFromPort('p_size') :
+      p.set_p_size(self.getInputFromPort('p_size'))
+    if self.hasInputFromPort('p_location_x') :
+      p.set_p_location_x(self.getInputFromPort('p_location_x'))
+    if self.hasInputFromPort('p_location_y') :
+      p.set_p_location_y(self.getInputFromPort('p_location_y'))
+    if self.hasInputFromPort('p_color_r') :
+      p.set_p_color_r(self.getInputFromPort('p_color_r'))
+    if self.hasInputFromPort('p_color_g') :
+      p.set_p_color_g(self.getInputFromPort('p_color_g'))
+    if self.hasInputFromPort('p_color_b') :
+      p.set_p_color_b(self.getInputFromPort('p_color_b'))
+    Time_Matrix = 0
+    if self.hasInputFromPort('Time Matrix') :
+      Time_Matrix = self.getInputFromPort('Time Matrix')
+    Time_Nrrd = 0
+    if self.hasInputFromPort('Time Nrrd') :
+      Time_Nrrd = self.getInputFromPort('Time Nrrd')
+    results = p.execute(Time_Matrix, Time_Nrrd)
+    self.setResult('Clock', results)
+
+class ConvertFieldsToTexture(Visualization) :
+  def compute(self) :
+    p = sr_py.ConvertFieldsToTextureAlg()
+    if self.hasInputFromPort('p_vmin') :
+      p.set_p_vmin(self.getInputFromPort('p_vmin'))
+    if self.hasInputFromPort('p_vmax') :
+      p.set_p_vmax(self.getInputFromPort('p_vmax'))
+    if self.hasInputFromPort('p_gmin') :
+      p.set_p_gmin(self.getInputFromPort('p_gmin'))
+    if self.hasInputFromPort('p_gmax') :
+      p.set_p_gmax(self.getInputFromPort('p_gmax'))
+    if self.hasInputFromPort('p_is_fixed') :
+      p.set_p_is_fixed(self.getInputFromPort('p_is_fixed'))
+    if self.hasInputFromPort('p_card_mem') :
+      p.set_p_card_mem(self.getInputFromPort('p_card_mem'))
+    if self.hasInputFromPort('p_card_mem_auto') :
+      p.set_p_card_mem_auto(self.getInputFromPort('p_card_mem_auto'))
+    if self.hasInputFromPort('p_histogram') :
+      p.set_p_histogram(self.getInputFromPort('p_histogram'))
+    if self.hasInputFromPort('p_gamma') :
+      p.set_p_gamma(self.getInputFromPort('p_gamma'))
+    Value_Field = 0
+    if self.hasInputFromPort('Value Field') :
+      Value_Field = self.getInputFromPort('Value Field')
+    Gradient_Magnitude_Field = 0
+    if self.hasInputFromPort('Gradient Magnitude Field') :
+      Gradient_Magnitude_Field = self.getInputFromPort('Gradient Magnitude Field')
+    results = p.execute(Value_Field, Gradient_Magnitude_Field)
+    self.setResult('Texture', results[0])
+    self.setResult('JointHistoGram', results[1])
+
+class ColorMap2DSemantics(Visualization) :
+  def compute(self) :
+    p = sr_py.ColorMap2DSemanticsAlg()
+    Input_Colormap = 0
+    if self.hasInputFromPort('Input Colormap') :
+      Input_Colormap = self.getInputFromPort('Input Colormap')
+    results = p.execute(Input_Colormap)
+    self.setResult('Output Colormap', results)
+
+class ConvertMatrixToString(Converters) :
+  def compute(self) :
+    p = sr_py.ConvertMatrixToStringAlg()
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('String', results)
+
+class ConvertMatrixToField(Converters) :
+  def compute(self) :
+    p = sr_py.ConvertMatrixToFieldAlg()
+    if self.hasInputFromPort('p_datalocation') :
+      p.set_p_datalocation(self.getInputFromPort('p_datalocation'))
+    Matrix = 0
+    if self.hasInputFromPort('Matrix') :
+      Matrix = self.getInputFromPort('Matrix')
+    results = p.execute(Matrix)
+    self.setResult('Field', results)
+
+class TimeControls(Time) :
+  def compute(self) :
+    p = sr_py.TimeControlsAlg()
+    if self.hasInputFromPort('p_execmode') :
+      p.set_p_execmode(self.getInputFromPort('p_execmode'))
+    if self.hasInputFromPort('p_scale_factor') :
+      p.set_p_scale_factor(self.getInputFromPort('p_scale_factor'))
+    results = p.execute()
+    self.setResult('time', results)
+
+
+def initialize(*args, **keywords):
+
+  env = []
+  for k in os.environ.keys() :
+    estr = "%s=%s" % (k, os.environ[k])
+    env.append(estr)
+  sr_py.init_sr_py(env)
+
+  reg = core.modules.module_registry
+
+  reg.add_module(Time, abstract=True)
+  reg.add_module(Converters, abstract=True)
+  reg.add_module(Texture, abstract=True)
+  reg.add_module(Visualization, abstract=True)
+  reg.add_module(MiscField, abstract=True)
+  reg.add_module(DataArrayMath, abstract=True)
+  reg.add_module(Math, abstract=True)
+  reg.add_module(ChangeMesh, abstract=True)
+  reg.add_module(ChangeFieldData, abstract=True)
+  reg.add_module(Geometry, abstract=True)
+  reg.add_module(NewField, abstract=True)
+  reg.add_module(ColorMap, abstract=True)
+  reg.add_module(Field, abstract=True)
+  reg.add_module(Nrrd, abstract=True)
+  reg.add_module(Matrix, abstract=True)
+  reg.add_module(ColorMap2, abstract=True)
+  reg.add_module(Path, abstract=True)
+  reg.add_module(String, abstract=True)
+  reg.add_module(Bundle, abstract=True)
+  reg.add_module(DataIO, abstract=True)
+  reg.add_module(WriteBundle)
+  reg.add_input_port(WriteBundle, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteBundle, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteBundle, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(WriteBundle, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(WritePath)
+  reg.add_input_port(WritePath, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WritePath, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WritePath, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WritePath, 'Input Data',
+                   (Path, "Path"))
+  reg.add_input_port(WritePath, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(WriteColorMap2D)
+  reg.add_input_port(WriteColorMap2D, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap2D, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap2D, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap2D, 'p_exporttype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap2D, 'Input Data',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(WriteColorMap2D, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadHDF5File)
+  reg.add_input_port(ReadHDF5File, 'p_have_HDF5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_power_app',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_datasets',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_dumpname',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_ports',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_ndims',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_mergeData',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_assumeSVT',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_animate',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_animate_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_basic_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_extended_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_playmode_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_selectable_min',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_selectable_max',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_selectable_inc',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_range_min',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_range_max',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_playmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_current',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_execmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_delay',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_inc_amount',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_update_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_have_group',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_have_attributes',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_have_datasets',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_continuous',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_selectionString',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_regexp',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_allow_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_read_error',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_max_dims',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_dim',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_start',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_start2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_count',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_count2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_stride',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_0_stride2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_dim',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_start',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_start2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_count',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_count2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_stride',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_1_stride2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_dim',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_start',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_start2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_count',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_count2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_stride',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_2_stride2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_dim',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_start',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_start2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_count',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_count2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_stride',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_3_stride2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_dim',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_start',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_start2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_count',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_count2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_stride',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_4_stride2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_dim',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_start',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_start2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_count',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_count2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_stride',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'p_5_stride2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadHDF5File, 'Full filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(ReadHDF5File, 'Current Index',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReadHDF5File, 'Output 0 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 1 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 2 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 3 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 4 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 5 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 6 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Output 7 Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ReadHDF5File, 'Selected Index',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReadField)
+  reg.add_input_port(ReadField, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadField, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadField, 'Output Data',
+                   (Field, "Field"))
+  reg.add_output_port(ReadField, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(WriteColorMap)
+  reg.add_input_port(WriteColorMap, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap, 'p_exporttype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteColorMap, 'Input Data',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(WriteColorMap, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadColorMap2D)
+  reg.add_input_port(ReadColorMap2D, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadColorMap2D, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadColorMap2D, 'Output Data',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(ReadColorMap2D, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadString)
+  reg.add_input_port(ReadString, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadString, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadString, 'Output Data',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadString, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadColorMap)
+  reg.add_input_port(ReadColorMap, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadColorMap, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadColorMap, 'Output Data',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(ReadColorMap, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadMatrix)
+  reg.add_input_port(ReadMatrix, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadMatrix, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadMatrix, 'Output Data',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReadMatrix, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(WriteString)
+  reg.add_input_port(WriteString, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteString, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteString, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteString, 'String',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(WriteString, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadPath)
+  reg.add_input_port(ReadPath, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadPath, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadPath, 'Output Data',
+                   (Path, "Path"))
+  reg.add_output_port(ReadPath, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(WriteField)
+  reg.add_input_port(WriteField, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteField, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteField, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteField, 'p_exporttype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteField, 'p_increment',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(WriteField, 'p_current',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(WriteField, 'Input Data',
+                   (Field, "Field"))
+  reg.add_input_port(WriteField, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadBundle)
+  reg.add_input_port(ReadBundle, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadBundle, 'p_types',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadBundle, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(ReadBundle, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(StreamMatrixFromDisk)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_row_or_col',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_slider_min',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_slider_max',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_range_min',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_range_max',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_playmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_current',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_execmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_delay',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_inc_amount',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'p_send_amount',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(StreamMatrixFromDisk, 'Indices',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(StreamMatrixFromDisk, 'Weights',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(StreamMatrixFromDisk, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(StreamMatrixFromDisk, 'DataVector',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(StreamMatrixFromDisk, 'Index',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(StreamMatrixFromDisk, 'Scaled Index',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(StreamMatrixFromDisk, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(WriteMatrix)
+  reg.add_input_port(WriteMatrix, 'p_filetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteMatrix, 'p_confirm',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteMatrix, 'p_confirm_once',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteMatrix, 'p_exporttype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(WriteMatrix, 'p_split',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(WriteMatrix, 'Input Data',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(WriteMatrix, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReadNrrd)
+  reg.add_input_port(ReadNrrd, 'p_from_env',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReadNrrd, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ReadNrrd, 'Output Data',
+                   (Field, "Field"))
+  reg.add_output_port(ReadNrrd, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(JoinFields)
+  reg.add_input_port(JoinFields, 'p_tolerance',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(JoinFields, 'p_force_nodemerge',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(JoinFields, 'p_force_pointcloud',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(JoinFields, 'p_matchval',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(JoinFields, 'p_meshonly',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(JoinFields, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(JoinFields, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(RefineMeshByIsovalue)
+  reg.add_input_port(RefineMeshByIsovalue, 'p_isoval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(RefineMeshByIsovalue, 'p_lte',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(RefineMeshByIsovalue, 'Input',
+                   (Field, "Field"))
+  reg.add_input_port(RefineMeshByIsovalue, 'Optional Isovalue',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RefineMeshByIsovalue, 'Refined',
+                   (Field, "Field"))
+  reg.add_output_port(RefineMeshByIsovalue, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(FairMesh)
+  reg.add_input_port(FairMesh, 'p_iterations',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(FairMesh, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(FairMesh, 'Input Mesh',
+                   (Field, "Field"))
+  reg.add_output_port(FairMesh, 'Faired Mesh',
+                   (Field, "Field"))
+
+  reg.add_module(CreateStructHex)
+  reg.add_input_port(CreateStructHex, 'p_sizex',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStructHex, 'p_sizey',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStructHex, 'p_sizez',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStructHex, 'p_padpercent',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateStructHex, 'p_data_at',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateStructHex, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(CreateStructHex, 'Output Sample Field',
+                   (Field, "Field"))
+
+  reg.add_module(ClipLatVolByIndicesOrWidget)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_use_text_bbox',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_text_min_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_text_min_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_text_min_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_text_max_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_text_max_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'p_text_max_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipLatVolByIndicesOrWidget, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ClipLatVolByIndicesOrWidget, 'Selection Widget',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(ClipLatVolByIndicesOrWidget, 'Output Field',
+                   (Field, "Field"))
+  reg.add_output_port(ClipLatVolByIndicesOrWidget, 'MaskVector',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(GetFieldBoundary)
+  reg.add_input_port(GetFieldBoundary, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldBoundary, 'BoundaryField',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldBoundary, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ConvertMatricesToMesh)
+  reg.add_input_port(ConvertMatricesToMesh, 'p_fieldname',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatricesToMesh, 'p_meshname',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatricesToMesh, 'p_fieldbasetype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatricesToMesh, 'p_datatype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatricesToMesh, 'Mesh Elements',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ConvertMatricesToMesh, 'Mesh Positions',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ConvertMatricesToMesh, 'Mesh Normals',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ConvertMatricesToMesh, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(ClipFieldToFieldOrWidget)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_clip_location',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_clipmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_autoexecute',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_autoinvert',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_execmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_center_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_center_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_center_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_right_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_right_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_right_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_down_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_down_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_down_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_in_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_in_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_in_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'p_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(ClipFieldToFieldOrWidget, 'Clip Field',
+                   (Field, "Field"))
+  reg.add_output_port(ClipFieldToFieldOrWidget, 'Selection Widget',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(ClipFieldToFieldOrWidget, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(RefineMeshByIsovalue2)
+  reg.add_input_port(RefineMeshByIsovalue2, 'p_isoval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(RefineMeshByIsovalue2, 'p_lte',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(RefineMeshByIsovalue2, 'Input',
+                   (Field, "Field"))
+  reg.add_input_port(RefineMeshByIsovalue2, 'Optional Isovalue',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RefineMeshByIsovalue2, 'Refined',
+                   (Field, "Field"))
+  reg.add_output_port(RefineMeshByIsovalue2, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateLatVol)
+  reg.add_input_port(CreateLatVol, 'p_sizex',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateLatVol, 'p_sizey',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateLatVol, 'p_sizez',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateLatVol, 'p_padpercent',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLatVol, 'p_data_at',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateLatVol, 'p_element_size',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateLatVol, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(CreateLatVol, 'LatVol Size',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateLatVol, 'Output Sample Field',
+                   (Field, "Field"))
+
+  reg.add_module(InterfaceWithCamal)
+  reg.add_input_port(InterfaceWithCamal, 'TriSurf',
+                   (Field, "Field"))
+  reg.add_output_port(InterfaceWithCamal, 'TetVol',
+                   (Field, "Field"))
+
+  reg.add_module(ClipVolumeByIsovalue)
+  reg.add_input_port(ClipVolumeByIsovalue, 'p_isoval_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipVolumeByIsovalue, 'p_isoval_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipVolumeByIsovalue, 'p_isoval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ClipVolumeByIsovalue, 'p_lte',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ClipVolumeByIsovalue, 'p_update_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipVolumeByIsovalue, 'Input',
+                   (Field, "Field"))
+  reg.add_input_port(ClipVolumeByIsovalue, 'Optional Isovalue',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ClipVolumeByIsovalue, 'Clipped',
+                   (Field, "Field"))
+  reg.add_output_port(ClipVolumeByIsovalue, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(RefineMesh)
+  reg.add_input_port(RefineMesh, 'p_select',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(RefineMesh, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(RefineMesh, 'p_isoval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(RefineMesh, 'Mesh',
+                   (Field, "Field"))
+  reg.add_input_port(RefineMesh, 'Isovalue',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RefineMesh, 'RefinedMesh',
+                   (Field, "Field"))
+  reg.add_output_port(RefineMesh, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(MergeFields)
+  reg.add_input_port(MergeFields, 'Container Mesh',
+                   (Field, "Field"))
+  reg.add_input_port(MergeFields, 'Insert Field',
+                   (Field, "Field"))
+  reg.add_output_port(MergeFields, 'Combined Field',
+                   (Field, "Field"))
+  reg.add_output_port(MergeFields, 'Extended Insert Field',
+                   (Field, "Field"))
+  reg.add_output_port(MergeFields, 'Combined To Extended Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(GetCentroidsFromMesh)
+  reg.add_input_port(GetCentroidsFromMesh, 'TetVolField',
+                   (Field, "Field"))
+  reg.add_output_port(GetCentroidsFromMesh, 'PointCloudField',
+                   (Field, "Field"))
+
+  reg.add_module(ExtractIsosurfaceByFunction)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_zero_checks',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_slice_value_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_slice_value_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_slice_value',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_slice_value_typed',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_slice_value_quantity',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_quantity_range',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_quantity_clusive',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_quantity_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_quantity_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_quantity_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_slice_value_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_matrix_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_algorithm',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_active_slice_value_selection_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_active_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'p_update_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(ExtractIsosurfaceByFunction, 'Optional Slice values',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ExtractIsosurfaceByFunction, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(MergeTriSurfs)
+  reg.add_input_port(MergeTriSurfs, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(MergeTriSurfs, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(InterfaceWithTetGen)
+  reg.add_input_port(InterfaceWithTetGen, 'p_switch',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InterfaceWithTetGen, 'Main',
+                   (Field, "Field"))
+  reg.add_input_port(InterfaceWithTetGen, 'Points',
+                   (Field, "Field"))
+  reg.add_input_port(InterfaceWithTetGen, 'Region Attribs',
+                   (Field, "Field"))
+  reg.add_input_port(InterfaceWithTetGen, 'Regions',
+                   (Field, "Field"))
+  reg.add_output_port(InterfaceWithTetGen, 'TetVol',
+                   (Field, "Field"))
+
+  reg.add_module(CreateImage)
+  reg.add_input_port(CreateImage, 'p_sizex',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_sizey',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_sizez',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_z_value',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_auto_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_axis',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_padpercent',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_pos',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_data_at',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_update_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_corigin_x',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_corigin_y',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_corigin_z',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_cnormal_x',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_cnormal_y',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'p_cnormal_z',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateImage, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(CreateImage, 'Output Sample Field',
+                   (Field, "Field"))
+
+  reg.add_module(InsertHexVolSheetAlongSurface)
+  reg.add_input_port(InsertHexVolSheetAlongSurface, 'p_side',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertHexVolSheetAlongSurface, 'p_addlayer',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertHexVolSheetAlongSurface, 'HexField',
+                   (Field, "Field"))
+  reg.add_input_port(InsertHexVolSheetAlongSurface, 'TriField',
+                   (Field, "Field"))
+  reg.add_output_port(InsertHexVolSheetAlongSurface, 'Side1Field',
+                   (Field, "Field"))
+  reg.add_output_port(InsertHexVolSheetAlongSurface, 'Side2Field',
+                   (Field, "Field"))
+
+  reg.add_module(GenerateSinglePointProbeFromField)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_main_frame',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_locx',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_locy',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_locz',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_value',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_node',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_edge',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_face',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_cell',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_show_value',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_show_node',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_show_edge',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_show_face',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_show_cell',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'p_probe_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateSinglePointProbeFromField, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(GenerateSinglePointProbeFromField, 'GenerateSinglePointProbeFromField Widget',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(GenerateSinglePointProbeFromField, 'GenerateSinglePointProbeFromField Point',
+                   (Field, "Field"))
+  reg.add_output_port(GenerateSinglePointProbeFromField, 'Element Index',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(InterfaceWithCubit)
+  reg.add_input_port(InterfaceWithCubit, 'p_cubitdir',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InterfaceWithCubit, 'p_ncdump',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InterfaceWithCubit, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(InterfaceWithCubit, 'PointCloudField',
+                   (Field, "Field"))
+  reg.add_output_port(InterfaceWithCubit, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(ClipFieldByFunction)
+  reg.add_input_port(ClipFieldByFunction, 'p_mode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldByFunction, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldByFunction, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(ClipFieldByFunction, 'Input',
+                   (Field, "Field"))
+  reg.add_output_port(ClipFieldByFunction, 'Clipped',
+                   (Field, "Field"))
+  reg.add_output_port(ClipFieldByFunction, 'Mapping',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ClipFieldByFunction, 'MaskVector',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(GetDomainBoundary)
+  reg.add_input_port(GetDomainBoundary, 'p_userange',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_minrange',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_maxrange',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_usevalue',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_value',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_includeouterboundary',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_innerboundaryonly',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_noinnerboundary',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'p_disconnect',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetDomainBoundary, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(GetDomainBoundary, 'MinValueValue',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(GetDomainBoundary, 'MaxValue',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetDomainBoundary, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CollectFields)
+  reg.add_input_port(CollectFields, 'p_buffersize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CollectFields, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CollectFields, 'BufferSize',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CollectFields, 'Fields',
+                   (Field, "Field"))
+
+  reg.add_module(GeneratePointSamplesFromField)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_num_seeds',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_probe_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_send',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_widget',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_red',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_green',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_blue',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'p_auto_execute',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromField, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(GeneratePointSamplesFromField, 'GeneratePointSamplesFromField Widget',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(GeneratePointSamplesFromField, 'GeneratePointSamplesFromField Point',
+                   (Field, "Field"))
+
+  reg.add_module(GeneratePointSamplesFromFieldOrWidget)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_wtype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_endpoints',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_maxseeds',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_numseeds',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_rngseed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_rnginc',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_clamp',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_autoexecute',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_dist',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'p_whichtab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GeneratePointSamplesFromFieldOrWidget, 'Field to Sample',
+                   (Field, "Field"))
+  reg.add_output_port(GeneratePointSamplesFromFieldOrWidget, 'Samples',
+                   (Field, "Field"))
+  reg.add_output_port(GeneratePointSamplesFromFieldOrWidget, 'Sampling Widget',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(DecimateTriSurf)
+  reg.add_input_port(DecimateTriSurf, 'TriSurf',
+                   (Field, "Field"))
+  reg.add_output_port(DecimateTriSurf, 'Decimated',
+                   (Field, "Field"))
+
+  reg.add_module(GetSliceFromStructuredFieldByIndices)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_axis',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_dims',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_dim_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_dim_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_dim_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_index_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_index_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_index_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_update_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'p_continuous',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(GetSliceFromStructuredFieldByIndices, 'Input Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetSliceFromStructuredFieldByIndices, 'Output Field',
+                   (Field, "Field"))
+  reg.add_output_port(GetSliceFromStructuredFieldByIndices, 'Output Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(RemoveHexVolSheet)
+  reg.add_input_port(RemoveHexVolSheet, 'p_edge_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(RemoveHexVolSheet, 'HexField',
+                   (Field, "Field"))
+  reg.add_output_port(RemoveHexVolSheet, 'NewHexField',
+                   (Field, "Field"))
+  reg.add_output_port(RemoveHexVolSheet, 'ExtractedHexes',
+                   (Field, "Field"))
+
+  reg.add_module(SubsampleStructuredFieldByIndices)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_power_app',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_wrap',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_dims',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_dim_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_dim_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_dim_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_start_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_start_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_start_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_stop_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_stop_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_stop_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_stride_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_stride_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_stride_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_wrap_i',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_wrap_j',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'p_wrap_k',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(SubsampleStructuredFieldByIndices, 'Input Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SubsampleStructuredFieldByIndices, 'Output Field',
+                   (Field, "Field"))
+  reg.add_output_port(SubsampleStructuredFieldByIndices, 'Output Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(GetAllSegmentationBoundaries)
+  reg.add_input_port(GetAllSegmentationBoundaries, 'Segmentations',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(GetAllSegmentationBoundaries, 'Boundaries',
+                   (Field, "Field"))
+
+  reg.add_module(ClipFieldWithSeed)
+  reg.add_input_port(ClipFieldWithSeed, 'p_mode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldWithSeed, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ClipFieldWithSeed, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(ClipFieldWithSeed, 'Input',
+                   (Field, "Field"))
+  reg.add_input_port(ClipFieldWithSeed, 'Seeds',
+                   (Field, "Field"))
+  reg.add_output_port(ClipFieldWithSeed, 'Clipped',
+                   (Field, "Field"))
+  reg.add_output_port(ClipFieldWithSeed, 'Mapping',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ClipFieldWithSeed, 'MaskVector',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(SplitNodesByDomain)
+  reg.add_input_port(SplitNodesByDomain, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(SplitNodesByDomain, 'SplitField',
+                   (Field, "Field"))
+
+  reg.add_module(ApplyMappingMatrix)
+  reg.add_input_port(ApplyMappingMatrix, 'Source',
+                   (Field, "Field"))
+  reg.add_input_port(ApplyMappingMatrix, 'Destination',
+                   (Field, "Field"))
+  reg.add_input_port(ApplyMappingMatrix, 'Mapping',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ApplyMappingMatrix, 'Output',
+                   (Field, "Field"))
+
+  reg.add_module(MaskLatVolWithTriSurf)
+  reg.add_input_port(MaskLatVolWithTriSurf, 'LatVolField',
+                   (Field, "Field"))
+  reg.add_input_port(MaskLatVolWithTriSurf, 'TriSurfField',
+                   (Field, "Field"))
+  reg.add_output_port(MaskLatVolWithTriSurf, 'LatVol Mask',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertFieldBasis)
+  reg.add_input_port(ConvertFieldBasis, 'p_output_basis',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertFieldBasis, 'Input',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertFieldBasis, 'Output',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertFieldBasis, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportMeshQualityMeasures)
+  reg.add_input_port(ReportMeshQualityMeasures, 'Input',
+                   (Field, "Field"))
+  reg.add_output_port(ReportMeshQualityMeasures, 'Checked',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(SelectAndSetFieldData)
+  reg.add_input_port(SelectAndSetFieldData, 'p_selection1',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_function1',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_selection2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_function2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_selection3',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_function3',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_selection4',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_function4',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_functiondef',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(SelectAndSetFieldData, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SelectAndSetFieldData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateFieldData3)
+  reg.add_input_port(CalculateFieldData3, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldData3, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldData3, 'Field1',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateFieldData3, 'Field2',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateFieldData3, 'Field3',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateFieldData3, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CalculateFieldData3, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CalculateFieldData3, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(SetFieldData)
+  reg.add_input_port(SetFieldData, 'p_keepscalartype',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SetFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(SetFieldData, 'Matrix Data',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(SetFieldData, 'Nrrd Data',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(SetFieldData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(SwapFieldDataWithMatrixEntries)
+  reg.add_input_port(SwapFieldDataWithMatrixEntries, 'p_preserve_scalar_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SwapFieldDataWithMatrixEntries, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(SwapFieldDataWithMatrixEntries, 'Input Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SwapFieldDataWithMatrixEntries, 'Output Field',
+                   (Field, "Field"))
+  reg.add_output_port(SwapFieldDataWithMatrixEntries, 'Output Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ConvertLatVolDataFromElemToNode)
+  reg.add_input_port(ConvertLatVolDataFromElemToNode, 'Elem Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertLatVolDataFromElemToNode, 'Node Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateNodeNormals)
+  reg.add_input_port(CalculateNodeNormals, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateNodeNormals, 'Input Point',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateNodeNormals, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateVectorMagnitudes)
+  reg.add_input_port(CalculateVectorMagnitudes, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateVectorMagnitudes, 'Output CalculateVectorMagnitudes',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertIndicesToFieldData)
+  reg.add_input_port(ConvertIndicesToFieldData, 'p_outputtype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertIndicesToFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(ConvertIndicesToFieldData, 'Data',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ConvertIndicesToFieldData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateDistanceToFieldBoundary)
+  reg.add_input_port(CalculateDistanceToFieldBoundary, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateDistanceToFieldBoundary, 'DistanceField',
+                   (Field, "Field"))
+
+  reg.add_module(MapFieldDataFromSourceToDestination)
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'p_interpolation_basis',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'p_map_source_to_single_dest',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'p_exhaustive_search',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'p_exhaustive_search_max_dist',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'p_np',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'Source',
+                   (Field, "Field"))
+  reg.add_input_port(MapFieldDataFromSourceToDestination, 'Destination',
+                   (Field, "Field"))
+  reg.add_output_port(MapFieldDataFromSourceToDestination, 'Remapped Destination',
+                   (Field, "Field"))
+
+  reg.add_module(SelectAndSetFieldData3)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_selection1',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_function1',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_selection2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_function2',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_selection3',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_function3',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_selection4',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_function4',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_functiondef',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SelectAndSetFieldData3, 'Field1',
+                   (Field, "Field"))
+  reg.add_input_port(SelectAndSetFieldData3, 'Field2',
+                   (Field, "Field"))
+  reg.add_input_port(SelectAndSetFieldData3, 'Field3',
+                   (Field, "Field"))
+  reg.add_input_port(SelectAndSetFieldData3, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SelectAndSetFieldData3, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CreateFieldData)
+  reg.add_input_port(CreateFieldData, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateFieldData, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateFieldData, 'p_basis',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CreateFieldData, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CreateFieldData, 'DataArray',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateFieldData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertLatVolDataFromNodeToElem)
+  reg.add_input_port(ConvertLatVolDataFromNodeToElem, 'Node Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertLatVolDataFromNodeToElem, 'Elem Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateFieldDataCompiled)
+  reg.add_input_port(CalculateFieldDataCompiled, 'p_outputdatatype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldDataCompiled, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldDataCompiled, 'p_cache',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CalculateFieldDataCompiled, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CalculateFieldDataCompiled, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateFieldDataCompiled, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(MapFieldDataFromElemToNode)
+  reg.add_input_port(MapFieldDataFromElemToNode, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromElemToNode, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(MapFieldDataFromElemToNode, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(ApplyFilterToFieldData)
+  reg.add_input_port(ApplyFilterToFieldData, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ApplyFilterToFieldData, 'p_ed_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ApplyFilterToFieldData, 'p_ed_iterations',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ApplyFilterToFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(ApplyFilterToFieldData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(GetFieldData)
+  reg.add_input_port(GetFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldData, 'Data',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CalculateFieldData2)
+  reg.add_input_port(CalculateFieldData2, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldData2, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldData2, 'Field1',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateFieldData2, 'Field2',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateFieldData2, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CalculateFieldData2, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CalculateFieldData2, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateLatVolGradientsAtNodes)
+  reg.add_input_port(CalculateLatVolGradientsAtNodes, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateLatVolGradientsAtNodes, 'Output Gradient',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateGradients)
+  reg.add_input_port(CalculateGradients, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateGradients, 'Output CalculateGradients',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateSignedDistanceToField)
+  reg.add_input_port(CalculateSignedDistanceToField, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateSignedDistanceToField, 'ObjectField',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateSignedDistanceToField, 'SignedDistanceField',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateInsideWhichField)
+  reg.add_input_port(CalculateInsideWhichField, 'p_outputbasis',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateInsideWhichField, 'p_outputtype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateInsideWhichField, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateInsideWhichField, 'Object',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateInsideWhichField, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(MapFieldDataFromNodeToElem)
+  reg.add_input_port(MapFieldDataFromNodeToElem, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(MapFieldDataFromNodeToElem, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(MapFieldDataFromNodeToElem, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertFieldDataType)
+  reg.add_input_port(ConvertFieldDataType, 'p_outputdatatype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertFieldDataType, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertFieldDataType, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateIsInsideField)
+  reg.add_input_port(CalculateIsInsideField, 'p_outputtype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateIsInsideField, 'p_outval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CalculateIsInsideField, 'p_inval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CalculateIsInsideField, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateIsInsideField, 'ObjectField',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateIsInsideField, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateFieldData)
+  reg.add_input_port(CalculateFieldData, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldData, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateFieldData, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateFieldData, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CalculateFieldData, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CalculateFieldData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateDistanceToField)
+  reg.add_input_port(CalculateDistanceToField, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateDistanceToField, 'ObjectField',
+                   (Field, "Field"))
+  reg.add_output_port(CalculateDistanceToField, 'DistanceField',
+                   (Field, "Field"))
+
+  reg.add_module(TransformPlanarMesh)
+  reg.add_input_port(TransformPlanarMesh, 'p_axis',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(TransformPlanarMesh, 'p_invert',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(TransformPlanarMesh, 'p_trans_x',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(TransformPlanarMesh, 'p_trans_y',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(TransformPlanarMesh, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(TransformPlanarMesh, 'Index Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(TransformPlanarMesh, 'Transformed Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertMeshToUnstructuredMesh)
+  reg.add_input_port(ConvertMeshToUnstructuredMesh, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertMeshToUnstructuredMesh, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertQuadSurfToTriSurf)
+  reg.add_input_port(ConvertQuadSurfToTriSurf, 'QuadSurf',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertQuadSurfToTriSurf, 'TriSurf',
+                   (Field, "Field"))
+
+  reg.add_module(TransformMeshWithFunction)
+  reg.add_input_port(TransformMeshWithFunction, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(TransformMeshWithFunction, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(TransformMeshWithFunction, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertHexVolToTetVol)
+  reg.add_input_port(ConvertHexVolToTetVol, 'HexVol',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertHexVolToTetVol, 'TetVol',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertMeshCoordinateSystem)
+  reg.add_input_port(ConvertMeshCoordinateSystem, 'p_oldsystem',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMeshCoordinateSystem, 'p_newsystem',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMeshCoordinateSystem, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertMeshCoordinateSystem, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertMeshToPointCloud)
+  reg.add_input_port(ConvertMeshToPointCloud, 'p_datalocation',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertMeshToPointCloud, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertMeshToPointCloud, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(TransformMeshWithTransform)
+  reg.add_input_port(TransformMeshWithTransform, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(TransformMeshWithTransform, 'Transform Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(TransformMeshWithTransform, 'Transformed Field',
+                   (Field, "Field"))
+
+  reg.add_module(ConvertRegularMeshToStructuredMesh)
+  reg.add_input_port(ConvertRegularMeshToStructuredMesh, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertRegularMeshToStructuredMesh, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(CalculateMeshNodes)
+  reg.add_input_port(CalculateMeshNodes, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateMeshNodes, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(CalculateMeshNodes, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CalculateMeshNodes, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CalculateMeshNodes, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(SmoothMesh)
+  reg.add_input_port(SmoothMesh, 'Input',
+                   (Field, "Field"))
+  reg.add_input_port(SmoothMesh, 'IsoValue',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SmoothMesh, 'Smoothed',
+                   (Field, "Field"))
+
+  reg.add_module(EditMeshBoundingBox)
+  reg.add_input_port(EditMeshBoundingBox, 'p_outputcenterx',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_outputcentery',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_outputcenterz',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_outputsizex',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_outputsizey',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_outputsizez',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_useoutputcenter',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_useoutputsize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_mode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_real_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_center_x',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_center_y',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_center_z',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_right_x',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_right_y',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_right_z',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_down_x',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_down_y',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_down_z',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_in_x',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_in_y',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'p_box_in_z',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EditMeshBoundingBox, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(EditMeshBoundingBox, 'Output Field',
+                   (Field, "Field"))
+  reg.add_output_port(EditMeshBoundingBox, 'Transformation Widget',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(EditMeshBoundingBox, 'Transformation Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(SwapNodeLocationsWithMatrixEntries)
+  reg.add_input_port(SwapNodeLocationsWithMatrixEntries, 'Input Field',
+                   (Field, "Field"))
+  reg.add_input_port(SwapNodeLocationsWithMatrixEntries, 'Input Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SwapNodeLocationsWithMatrixEntries, 'Output Field',
+                   (Field, "Field"))
+  reg.add_output_port(SwapNodeLocationsWithMatrixEntries, 'Output Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(MapFieldDataToNodeCoordinate)
+  reg.add_input_port(MapFieldDataToNodeCoordinate, 'p_coord',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(MapFieldDataToNodeCoordinate, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(MapFieldDataToNodeCoordinate, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(ScaleFieldMeshAndData)
+  reg.add_input_port(ScaleFieldMeshAndData, 'p_datascale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ScaleFieldMeshAndData, 'p_geomscale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ScaleFieldMeshAndData, 'p_usegeomcenter',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ScaleFieldMeshAndData, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(ScaleFieldMeshAndData, 'GeomScaleFactor',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ScaleFieldMeshAndData, 'DataScaleFactor',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ScaleFieldMeshAndData, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(ReportColumnMatrixMisfit)
+  reg.add_input_port(ReportColumnMatrixMisfit, 'p_have_ui',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportColumnMatrixMisfit, 'p_methodTCL',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportColumnMatrixMisfit, 'p_pTCL',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportColumnMatrixMisfit, 'Vec1',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ReportColumnMatrixMisfit, 'Vec2',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportColumnMatrixMisfit, 'Error Out',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(EvaluateLinAlgGeneral)
+  reg.add_input_port(EvaluateLinAlgGeneral, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EvaluateLinAlgGeneral, 'i1',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(EvaluateLinAlgGeneral, 'i2',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(EvaluateLinAlgGeneral, 'i3',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(EvaluateLinAlgGeneral, 'i4',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(EvaluateLinAlgGeneral, 'i5',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgGeneral, 'o1',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgGeneral, 'o2',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgGeneral, 'o3',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgGeneral, 'o4',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgGeneral, 'o5',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(AppendMatrix)
+  reg.add_input_port(AppendMatrix, 'p_row_or_column',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(AppendMatrix, 'BaseMatrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(AppendMatrix, 'AppendMatrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(AppendMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(EvaluateLinAlgBinary)
+  reg.add_input_port(EvaluateLinAlgBinary, 'p_op',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EvaluateLinAlgBinary, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EvaluateLinAlgBinary, 'A',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(EvaluateLinAlgBinary, 'B',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgBinary, 'Output',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ConvertMaskVectorToMappingMatrix)
+  reg.add_input_port(ConvertMaskVectorToMappingMatrix, 'MaskVector',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ConvertMaskVectorToMappingMatrix, 'MappingMatrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(SolveLinearSystem)
+  reg.add_input_port(SolveLinearSystem, 'p_target_error',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_flops',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_floprate',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_memrefs',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_memrate',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_orig_error',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_current_error',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_precond',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_iteration',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_maxiter',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_use_previous_soln',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_emit_partial',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_emit_iter',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_status',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'p_np',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SolveLinearSystem, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(SolveLinearSystem, 'RHS',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SolveLinearSystem, 'Solution',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportMatrixColumnMeasure)
+  reg.add_input_port(ReportMatrixColumnMeasure, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportMatrixColumnMeasure, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportMatrixColumnMeasure, 'Vector',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(SortMatrix)
+  reg.add_input_port(SortMatrix, 'p_row_or_col',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SortMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SortMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateGeometricTransform)
+  reg.add_input_port(CreateGeometricTransform, 'p_rotate_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_rotate_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_rotate_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_rotate_theta',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_translate_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_translate_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_translate_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_scale_uniform',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_scale_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_scale_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_scale_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_shear_plane_a',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_shear_plane_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_shear_plane_c',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_widget_resizable',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_permute_x',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_permute_y',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_permute_z',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_pre_transform',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_which_transform',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_widget_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'p_ignoring_widget_changes',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateGeometricTransform, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateGeometricTransform, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateGeometricTransform, 'Geometry',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(ChooseMatrix)
+  reg.add_input_port(ChooseMatrix, 'p_use_first_valid',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseMatrix, 'p_port_valid_index',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseMatrix, 'p_port_selected_index',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ChooseMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ConvertMappingMatrixToMaskVector)
+  reg.add_input_port(ConvertMappingMatrixToMaskVector, 'MappingMatrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ConvertMappingMatrixToMaskVector, 'MaskVector',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(ResizeMatrix)
+  reg.add_input_port(ResizeMatrix, 'p_dim_m',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ResizeMatrix, 'p_dim_n',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ResizeMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ResizeMatrix, 'M',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ResizeMatrix, 'N',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ResizeMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CollectMatrices)
+  reg.add_input_port(CollectMatrices, 'p_append',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CollectMatrices, 'p_row',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CollectMatrices, 'p_front',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CollectMatrices, 'Optional BaseMatrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CollectMatrices, 'SubMatrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CollectMatrices, 'CompositeMatrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(GetColumnOrRowFromMatrix)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_row_or_col',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_selectable_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_selectable_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_selectable_inc',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_selectable_units',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_range_min',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_range_max',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_playmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_current',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_execmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_delay',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_inc_amount',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_send_amount',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'p_data_series_done',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'Weight Vector',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(GetColumnOrRowFromMatrix, 'Current Index',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetColumnOrRowFromMatrix, 'Vector',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetColumnOrRowFromMatrix, 'Selected Index',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(BuildNoiseColumnMatrix)
+  reg.add_input_port(BuildNoiseColumnMatrix, 'p_snr',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(BuildNoiseColumnMatrix, 'Signal',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(BuildNoiseColumnMatrix, 'Noise',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(EvaluateLinAlgUnary)
+  reg.add_input_port(EvaluateLinAlgUnary, 'p_op',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EvaluateLinAlgUnary, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(EvaluateLinAlgUnary, 'Input',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(EvaluateLinAlgUnary, 'Output',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(GetSubmatrix)
+  reg.add_input_port(GetSubmatrix, 'p_mincol',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSubmatrix, 'p_maxcol',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSubmatrix, 'p_minrow',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSubmatrix, 'p_maxrow',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSubmatrix, 'p_nrow',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSubmatrix, 'p_ncol',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetSubmatrix, 'Input Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(GetSubmatrix, 'Optional Range Bounds',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetSubmatrix, 'Output Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReorderMatrixByReverseCuthillMcKee)
+  reg.add_input_port(ReorderMatrixByReverseCuthillMcKee, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReorderMatrixByReverseCuthillMcKee, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReorderMatrixByReverseCuthillMcKee, 'Mapping',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReorderMatrixByReverseCuthillMcKee, 'InverseMapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateMatrix)
+  reg.add_input_port(CreateMatrix, 'p_rows',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateMatrix, 'p_cols',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateMatrix, 'p_data',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateMatrix, 'p_clabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateMatrix, 'p_rlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_output_port(CreateMatrix, 'matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(SolveMinNormLeastSqSystem)
+  reg.add_input_port(SolveMinNormLeastSqSystem, 'BasisVec1',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(SolveMinNormLeastSqSystem, 'BasisVec2',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(SolveMinNormLeastSqSystem, 'BasisVec3',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(SolveMinNormLeastSqSystem, 'TargetVec',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SolveMinNormLeastSqSystem, 'WeightVec(Col)',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SolveMinNormLeastSqSystem, 'ResultVec(Col)',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ConvertMatrixType)
+  reg.add_input_port(ConvertMatrixType, 'p_oldtype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatrixType, 'p_newtype',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatrixType, 'p_nrow',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatrixType, 'p_ncol',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatrixType, 'Input',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ConvertMatrixType, 'Output',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportMatrixRowMeasure)
+  reg.add_input_port(ReportMatrixRowMeasure, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportMatrixRowMeasure, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportMatrixRowMeasure, 'Vector',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReorderMatrixByCuthillMcKee)
+  reg.add_input_port(ReorderMatrixByCuthillMcKee, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReorderMatrixByCuthillMcKee, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReorderMatrixByCuthillMcKee, 'Mapping',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReorderMatrixByCuthillMcKee, 'InverseMapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportMatrixInfo)
+  reg.add_input_port(ReportMatrixInfo, 'Input',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportMatrixInfo, 'NumRows',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportMatrixInfo, 'NumCols',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportMatrixInfo, 'NumElements',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(RemoveZerosFromMatrix)
+  reg.add_input_port(RemoveZerosFromMatrix, 'p_row_or_col',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(RemoveZerosFromMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RemoveZerosFromMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(RemoveZeroRowsAndColumns)
+  reg.add_input_port(RemoveZeroRowsAndColumns, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RemoveZeroRowsAndColumns, 'ReducedMatrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RemoveZeroRowsAndColumns, 'LeftMapping',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(RemoveZeroRowsAndColumns, 'RightMapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateDataArray)
+  reg.add_input_port(CreateDataArray, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateDataArray, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateDataArray, 'Size',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateDataArray, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CreateDataArray, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateDataArray, 'DataArray',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateDataArrayFromIndices)
+  reg.add_input_port(CreateDataArrayFromIndices, 'Indices',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateDataArrayFromIndices, 'Template',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateDataArrayFromIndices, 'DataArray',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportDataArrayInfo)
+  reg.add_input_port(ReportDataArrayInfo, 'DataArray',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportDataArrayInfo, 'NumElements',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateVectorArray)
+  reg.add_input_port(CreateVectorArray, 'X',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateVectorArray, 'Y',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateVectorArray, 'Z',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateVectorArray, 'Vector',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReplicateDataArray)
+  reg.add_input_port(ReplicateDataArray, 'p_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReplicateDataArray, 'DataArray',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(ReplicateDataArray, 'Size',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReplicateDataArray, 'DataArray',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(SplitVectorArrayInXYZ)
+  reg.add_input_port(SplitVectorArrayInXYZ, 'VectorArray',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SplitVectorArrayInXYZ, 'X',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SplitVectorArrayInXYZ, 'Y',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(SplitVectorArrayInXYZ, 'Z',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(DecomposeTensorArrayIntoEigenVectors)
+  reg.add_input_port(DecomposeTensorArrayIntoEigenVectors, 'TensorArray',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(DecomposeTensorArrayIntoEigenVectors, 'EigenVector1',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(DecomposeTensorArrayIntoEigenVectors, 'EigenVector2',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(DecomposeTensorArrayIntoEigenVectors, 'EigenVector3',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(DecomposeTensorArrayIntoEigenVectors, 'EigenValue1',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(DecomposeTensorArrayIntoEigenVectors, 'EigenValue2',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(DecomposeTensorArrayIntoEigenVectors, 'EigenValue3',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CalculateDataArray)
+  reg.add_input_port(CalculateDataArray, 'p_function',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateDataArray, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CalculateDataArray, 'DataArray',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CalculateDataArray, 'Function',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(CalculateDataArray, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CalculateDataArray, 'DataArray',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportDataArrayMeasure)
+  reg.add_input_port(ReportDataArrayMeasure, 'p_measure',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportDataArrayMeasure, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportDataArrayMeasure, 'Measure',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(AppendDataArrays)
+  reg.add_input_port(AppendDataArrays, 'Array',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(AppendDataArrays, 'Array',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateTensorArray)
+  reg.add_input_port(CreateTensorArray, 'EigenVector1',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateTensorArray, 'EigenVector2',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateTensorArray, 'EigenValue1',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateTensorArray, 'EigenValue2',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateTensorArray, 'EigenValue3',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(CreateTensorArray, 'TensorArray',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(PrintMatrixIntoString)
+  reg.add_input_port(PrintMatrixIntoString, 'p_formatstring',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(PrintMatrixIntoString, 'Format',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(PrintMatrixIntoString, 'Input',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(PrintMatrixIntoString, 'Output',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(GetFileName)
+  reg.add_input_port(GetFileName, 'p_filename_base',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFileName, 'p_delay',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetFileName, 'p_pinned',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_output_port(GetFileName, 'Full Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(SplitFileName)
+  reg.add_input_port(SplitFileName, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(SplitFileName, 'Pathname',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(SplitFileName, 'Filename Base',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(SplitFileName, 'Extension',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(SplitFileName, 'Filename',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(PrintStringIntoString)
+  reg.add_input_port(PrintStringIntoString, 'p_formatstring',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(PrintStringIntoString, 'Format',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(PrintStringIntoString, 'Input',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(PrintStringIntoString, 'Output',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(CreateString)
+  reg.add_input_port(CreateString, 'p_inputstring',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_output_port(CreateString, 'Output',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ReportStringInfo)
+  reg.add_input_port(ReportStringInfo, 'p_inputstring',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportStringInfo, 'Input',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(JoinStrings)
+  reg.add_input_port(JoinStrings, 'input',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(JoinStrings, 'Output',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(GetNetworkFileName)
+  reg.add_output_port(GetNetworkFileName, 'String',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(SetFieldProperty)
+  reg.add_input_port(SetFieldProperty, 'p_num_entries',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldProperty, 'p_property',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldProperty, 'p_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldProperty, 'p_value',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldProperty, 'p_readonly',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldProperty, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(SetFieldProperty, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(ReportScalarFieldStats)
+  reg.add_input_port(ReportScalarFieldStats, 'p_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'p_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'p_mean',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'p_median',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'p_sigma',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'p_is_fixed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'p_nbuckets',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportScalarFieldStats, 'Input Field',
+                   (Field, "Field"))
+
+  reg.add_module(SelectFieldROIWithBoxWidget)
+  reg.add_input_port(SelectFieldROIWithBoxWidget, 'p_stampvalue',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SelectFieldROIWithBoxWidget, 'p_runmode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SelectFieldROIWithBoxWidget, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(SelectFieldROIWithBoxWidget, 'Selection Widget',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(SelectFieldROIWithBoxWidget, 'Output Field',
+                   (Field, "Field"))
+
+  reg.add_module(BuildMatrixOfSurfaceNormals)
+  reg.add_input_port(BuildMatrixOfSurfaceNormals, 'Surface Field',
+                   (Field, "Field"))
+  reg.add_output_port(BuildMatrixOfSurfaceNormals, 'Nodal Surface Normals',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportFieldInfo)
+  reg.add_input_port(ReportFieldInfo, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ReportFieldInfo, 'NumNodes',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'NumElements',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'NumData',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'DataMin',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'DataMax',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'FieldSize',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'FieldCenter',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ReportFieldInfo, 'Dimensions',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(ReportFieldGeometryMeasures)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_simplexString',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_xFlag',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_yFlag',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_zFlag',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_idxFlag',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_sizeFlag',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'p_normalsFlag',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ReportFieldGeometryMeasures, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ReportFieldGeometryMeasures, 'Output Measures Matrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(SetFieldOrMeshStringProperty)
+  reg.add_input_port(SetFieldOrMeshStringProperty, 'p_prop',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldOrMeshStringProperty, 'p_val',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(SetFieldOrMeshStringProperty, 'p_meshprop',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(SetFieldOrMeshStringProperty, 'Input',
+                   (Field, "Field"))
+  reg.add_output_port(SetFieldOrMeshStringProperty, 'Output',
+                   (Field, "Field"))
+
+  reg.add_module(ManageFieldSeries)
+  reg.add_input_port(ManageFieldSeries, 'p_num_ports',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ManageFieldSeries, 'Input',
+                   (Field, "Field"))
+  reg.add_output_port(ManageFieldSeries, 'Output 0',
+                   (Field, "Field"))
+  reg.add_output_port(ManageFieldSeries, 'Output 1',
+                   (Field, "Field"))
+  reg.add_output_port(ManageFieldSeries, 'Output 2',
+                   (Field, "Field"))
+  reg.add_output_port(ManageFieldSeries, 'Output 3',
+                   (Field, "Field"))
+
+  reg.add_module(ReportSearchGridInfo)
+  reg.add_input_port(ReportSearchGridInfo, 'Input Field',
+                   (Field, "Field"))
+  reg.add_output_port(ReportSearchGridInfo, 'Output Sample Field',
+                   (Field, "Field"))
+
+  reg.add_module(ChooseField)
+  reg.add_input_port(ChooseField, 'p_use_first_valid',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseField, 'p_port_valid_index',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseField, 'p_port_selected_index',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseField, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(ChooseField, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(BuildPointCloudToLatVolMappingMatrix)
+  reg.add_input_port(BuildPointCloudToLatVolMappingMatrix, 'p_epsilon',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(BuildPointCloudToLatVolMappingMatrix, 'PointCloudField',
+                   (Field, "Field"))
+  reg.add_input_port(BuildPointCloudToLatVolMappingMatrix, 'LatVolField',
+                   (Field, "Field"))
+  reg.add_output_port(BuildPointCloudToLatVolMappingMatrix, 'MappingMatrix',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(BuildMappingMatrix)
+  reg.add_input_port(BuildMappingMatrix, 'p_interpolation_basis',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(BuildMappingMatrix, 'p_map_source_to_single_dest',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(BuildMappingMatrix, 'p_exhaustive_search',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(BuildMappingMatrix, 'p_exhaustive_search_max_dist',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(BuildMappingMatrix, 'p_np',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(BuildMappingMatrix, 'Source',
+                   (Field, "Field"))
+  reg.add_input_port(BuildMappingMatrix, 'Destination',
+                   (Field, "Field"))
+  reg.add_output_port(BuildMappingMatrix, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CoregisterPointClouds)
+  reg.add_input_port(CoregisterPointClouds, 'p_allowScale',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'p_allowRotate',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'p_allowTranslate',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'p_seed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'p_iters',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'p_misfitTol',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'p_method',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CoregisterPointClouds, 'Fixed PointCloudField',
+                   (Field, "Field"))
+  reg.add_input_port(CoregisterPointClouds, 'Mobile PointCloudField',
+                   (Field, "Field"))
+  reg.add_input_port(CoregisterPointClouds, 'DistanceField From Fixed',
+                   (Field, "Field"))
+  reg.add_output_port(CoregisterPointClouds, 'Transform',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CollectPointClouds)
+  reg.add_input_port(CollectPointClouds, 'p_num_fields',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CollectPointClouds, 'Point Cloud',
+                   (Field, "Field"))
+  reg.add_output_port(CollectPointClouds, 'Curve',
+                   (Field, "Field"))
+
+  reg.add_module(GetColorMapsFromBundle)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'p_colormap_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMapsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetColorMapsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetColorMapsFromBundle, 'colormap1',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(GetColorMapsFromBundle, 'colormap2',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(GetColorMapsFromBundle, 'colormap3',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(GetColorMapsFromBundle, 'colormap4',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(GetColorMapsFromBundle, 'colormap5',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(GetColorMapsFromBundle, 'colormap6',
+                   (ColorMap, "ColorMap"))
+
+  reg.add_module(InsertFieldsIntoBundle)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_field1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_field2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_field3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_field4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_field5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_field6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertFieldsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertFieldsIntoBundle, 'field1',
+                   (Field, "Field"))
+  reg.add_input_port(InsertFieldsIntoBundle, 'field2',
+                   (Field, "Field"))
+  reg.add_input_port(InsertFieldsIntoBundle, 'field3',
+                   (Field, "Field"))
+  reg.add_input_port(InsertFieldsIntoBundle, 'field4',
+                   (Field, "Field"))
+  reg.add_input_port(InsertFieldsIntoBundle, 'field5',
+                   (Field, "Field"))
+  reg.add_input_port(InsertFieldsIntoBundle, 'field6',
+                   (Field, "Field"))
+  reg.add_output_port(InsertFieldsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(GetFieldsFromBundle)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'p_field_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetFieldsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetFieldsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetFieldsFromBundle, 'field1',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldsFromBundle, 'field2',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldsFromBundle, 'field3',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldsFromBundle, 'field4',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldsFromBundle, 'field5',
+                   (Field, "Field"))
+  reg.add_output_port(GetFieldsFromBundle, 'field6',
+                   (Field, "Field"))
+
+  reg.add_module(InsertColorMap2sIntoBundle)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_colormap21_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_colormap22_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_colormap23_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_colormap24_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_colormap25_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_colormap26_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'colormap21',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'colormap22',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'colormap23',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'colormap24',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'colormap25',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(InsertColorMap2sIntoBundle, 'colormap26',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(InsertColorMap2sIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(GetBundlesFromBundle)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'p_bundle_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetBundlesFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle1',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle2',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle3',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle4',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle5',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetBundlesFromBundle, 'bundle6',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(GetPathsFromBundle)
+  reg.add_input_port(GetPathsFromBundle, 'p_path1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'p_path2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'p_path3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'p_path4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'p_path5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'p_path6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'p_path_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetPathsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetPathsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetPathsFromBundle, 'path1',
+                   (Path, "Path"))
+  reg.add_output_port(GetPathsFromBundle, 'path2',
+                   (Path, "Path"))
+  reg.add_output_port(GetPathsFromBundle, 'path3',
+                   (Path, "Path"))
+  reg.add_output_port(GetPathsFromBundle, 'path4',
+                   (Path, "Path"))
+  reg.add_output_port(GetPathsFromBundle, 'path5',
+                   (Path, "Path"))
+  reg.add_output_port(GetPathsFromBundle, 'path6',
+                   (Path, "Path"))
+
+  reg.add_module(InsertStringsIntoBundle)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_string1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_string2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_string3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_string4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_string5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_string6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertStringsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertStringsIntoBundle, 'string1',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(InsertStringsIntoBundle, 'string2',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(InsertStringsIntoBundle, 'string3',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(InsertStringsIntoBundle, 'string4',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(InsertStringsIntoBundle, 'string5',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_input_port(InsertStringsIntoBundle, 'string6',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(InsertStringsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(GetNrrdsFromBundle)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_transposenrrd1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_transposenrrd2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_transposenrrd3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_transposenrrd4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_transposenrrd5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_transposenrrd6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'p_nrrd_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetNrrdsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetNrrdsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetNrrdsFromBundle, 'nrrd1',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(GetNrrdsFromBundle, 'nrrd2',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(GetNrrdsFromBundle, 'nrrd3',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(GetNrrdsFromBundle, 'nrrd4',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(GetNrrdsFromBundle, 'nrrd5',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(GetNrrdsFromBundle, 'nrrd6',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(GetMatricesFromBundle)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_transposenrrd1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_transposenrrd2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_transposenrrd3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_transposenrrd4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_transposenrrd5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_transposenrrd6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'p_matrix_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetMatricesFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetMatricesFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetMatricesFromBundle, 'matrix1',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetMatricesFromBundle, 'matrix2',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetMatricesFromBundle, 'matrix3',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetMatricesFromBundle, 'matrix4',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetMatricesFromBundle, 'matrix5',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(GetMatricesFromBundle, 'matrix6',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(JoinBundles)
+  reg.add_input_port(JoinBundles, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(JoinBundles, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(ReportBundleInfo)
+  reg.add_input_port(ReportBundleInfo, 'p_tclinfostring',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ReportBundleInfo, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(InsertPathsIntoBundle)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_path1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_path2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_path3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_path4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_path5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_path6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertPathsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertPathsIntoBundle, 'path1',
+                   (Path, "Path"))
+  reg.add_input_port(InsertPathsIntoBundle, 'path2',
+                   (Path, "Path"))
+  reg.add_input_port(InsertPathsIntoBundle, 'path3',
+                   (Path, "Path"))
+  reg.add_input_port(InsertPathsIntoBundle, 'path4',
+                   (Path, "Path"))
+  reg.add_input_port(InsertPathsIntoBundle, 'path5',
+                   (Path, "Path"))
+  reg.add_input_port(InsertPathsIntoBundle, 'path6',
+                   (Path, "Path"))
+  reg.add_output_port(InsertPathsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(GetColorMap2sFromBundle)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap21_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap22_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap23_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap24_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap25_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap26_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'p_colormap2_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetColorMap2sFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'colormap21',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'colormap22',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'colormap23',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'colormap24',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'colormap25',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(GetColorMap2sFromBundle, 'colormap26',
+                   (ColorMap2, "ColorMap2"))
+
+  reg.add_module(InsertMatricesIntoBundle)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_matrix1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_matrix2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_matrix3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_matrix4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_matrix5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_matrix6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertMatricesIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertMatricesIntoBundle, 'matrix1',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(InsertMatricesIntoBundle, 'matrix2',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(InsertMatricesIntoBundle, 'matrix3',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(InsertMatricesIntoBundle, 'matrix4',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(InsertMatricesIntoBundle, 'matrix5',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(InsertMatricesIntoBundle, 'matrix6',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(InsertMatricesIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(InsertNrrdsIntoBundle)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_nrrd1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_nrrd2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_nrrd3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_nrrd4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_nrrd5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_nrrd6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertNrrdsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertNrrdsIntoBundle, 'nrrd1',
+                   (Nrrd, "Nrrd"))
+  reg.add_input_port(InsertNrrdsIntoBundle, 'nrrd2',
+                   (Nrrd, "Nrrd"))
+  reg.add_input_port(InsertNrrdsIntoBundle, 'nrrd3',
+                   (Nrrd, "Nrrd"))
+  reg.add_input_port(InsertNrrdsIntoBundle, 'nrrd4',
+                   (Nrrd, "Nrrd"))
+  reg.add_input_port(InsertNrrdsIntoBundle, 'nrrd5',
+                   (Nrrd, "Nrrd"))
+  reg.add_input_port(InsertNrrdsIntoBundle, 'nrrd6',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(InsertNrrdsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(InsertBundlesIntoBundle)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundle1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundle2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundle3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundle4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundle5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundle6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle1',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle2',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle3',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle4',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle5',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertBundlesIntoBundle, 'bundle6',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(InsertBundlesIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(GetStringsFromBundle)
+  reg.add_input_port(GetStringsFromBundle, 'p_string1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'p_string2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'p_string3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'p_string4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'p_string5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'p_string6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'p_string_selection',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(GetStringsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetStringsFromBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_output_port(GetStringsFromBundle, 'string1',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(GetStringsFromBundle, 'string2',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(GetStringsFromBundle, 'string3',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(GetStringsFromBundle, 'string4',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(GetStringsFromBundle, 'string5',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(GetStringsFromBundle, 'string6',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(InsertColorMapsIntoBundle)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_colormap1_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_colormap2_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_colormap3_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_colormap4_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_colormap5_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_colormap6_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_replace1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_replace2',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_replace3',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_replace4',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_replace5',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_replace6',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'p_bundlename',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(InsertColorMapsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+  reg.add_input_port(InsertColorMapsIntoBundle, 'colormap1',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(InsertColorMapsIntoBundle, 'colormap2',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(InsertColorMapsIntoBundle, 'colormap3',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(InsertColorMapsIntoBundle, 'colormap4',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(InsertColorMapsIntoBundle, 'colormap5',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(InsertColorMapsIntoBundle, 'colormap6',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(InsertColorMapsIntoBundle, 'bundle',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(CreateParameterBundle)
+  reg.add_input_port(CreateParameterBundle, 'p_data',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateParameterBundle, 'p_new_field_count',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateParameterBundle, 'p_update_all',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_output_port(CreateParameterBundle, 'ParameterList',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(InsertEnvironmentIntoBundle)
+  reg.add_output_port(InsertEnvironmentIntoBundle, 'Environment',
+                   (Bundle, "Bundle"))
+
+  reg.add_module(ShowColorMap)
+  reg.add_input_port(ShowColorMap, 'p_length',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_side',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_numlabels',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_numsigdigits',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_units',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_text_fontsize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'p_extra_padding',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(ShowColorMap, 'Geometry',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(CreateAndEditColorMap2D)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_histo',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_selected_widget',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_selected_object',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_num_entries',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_marker',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_cm2view_targ',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'p_id',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap2D, 'Input Colormap',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_input_port(CreateAndEditColorMap2D, 'Histogram',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(CreateAndEditColorMap2D, 'Output Colormap',
+                   (ColorMap2, "ColorMap2"))
+
+  reg.add_module(ShowField)
+  reg.add_input_port(ShowField, 'p_nodes_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_nodes_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_nodes_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_nodes_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_faces_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_faces_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_faces_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_faces_normals',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_faces_usetexture',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_backface_cull',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_always_visible',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_fontsize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_precision',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_render_locations',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_show_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_show_nodes',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_show_edges',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_show_faces',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_text_show_cells',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_def_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_def_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_def_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_def_color_a',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_nodes_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_nodes_scaleNV',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_scaleNV',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_active_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_interactive_mode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_show_progress',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_field_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_field_name_override',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_nodes_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_edges_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_approx_div',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'p_use_default_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowField, 'Mesh',
+                   (Field, "Field"))
+  reg.add_input_port(ShowField, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(ShowField, 'Scene Graph',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(ExtractIsosurface)
+  reg.add_input_port(ExtractIsosurface, 'p_isoval_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_isoval_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_isoval',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_isoval_typed',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_isoval_quantity',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_quantity_range',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_quantity_clusive',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_quantity_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_quantity_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_quantity_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_isoval_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_matrix_list',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_algorithm',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_build_trisurf',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_build_geom',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_np',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_active_isoval_selection_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_active_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_update_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'p_color_a',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ExtractIsosurface, 'Field',
+                   (Field, "Field"))
+  reg.add_input_port(ExtractIsosurface, 'Optional Color Map',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(ExtractIsosurface, 'Optional Isovalues',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ExtractIsosurface, 'Surface',
+                   (Field, "Field"))
+  reg.add_output_port(ExtractIsosurface, 'Geometry',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(ExtractIsosurface, 'Mapping',
+                   (Matrix, "Matrix"))
+
+  reg.add_module(CreateViewerAxes)
+  reg.add_input_port(CreateViewerAxes, 'p_precision',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_squash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_valuerez',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_labelrez',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_divisions',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_offset',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_range_first',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_range_second',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_min_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_max_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_minplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_maxplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_lines',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_minticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_maxticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_minlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_maxlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_minvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_maxvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_width',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_tickangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_ticktilt',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_ticksize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_labelangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_labelheight',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_valuesize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_0_Axis_valuesquash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_divisions',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_offset',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_range_first',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_range_second',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_min_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_max_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_minplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_maxplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_lines',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_minticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_maxticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_minlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_maxlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_minvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_maxvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_width',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_tickangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_ticktilt',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_ticksize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_labelangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_labelheight',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_valuesize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_01_1_Axis_valuesquash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_divisions',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_offset',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_range_first',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_range_second',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_min_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_max_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_minplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_maxplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_lines',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_minticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_maxticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_minlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_maxlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_minvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_maxvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_width',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_tickangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_ticktilt',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_ticksize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_labelangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_labelheight',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_valuesize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_0_Axis_valuesquash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_divisions',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_offset',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_range_first',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_range_second',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_min_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_max_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_minplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_maxplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_lines',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_minticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_maxticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_minlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_maxlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_minvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_maxvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_width',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_tickangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_ticktilt',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_ticksize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_labelangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_labelheight',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_valuesize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_02_2_Axis_valuesquash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_divisions',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_offset',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_range_first',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_range_second',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_min_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_max_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_minplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_maxplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_lines',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_minticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_maxticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_minlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_maxlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_minvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_maxvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_width',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_tickangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_ticktilt',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_ticksize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_labelangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_labelheight',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_valuesize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_1_Axis_valuesquash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_divisions',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_offset',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_range_first',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_range_second',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_min_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_max_absolute',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_minplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_maxplane',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_lines',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_minticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_maxticks',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_minlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_maxlabel',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_minvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_maxvalue',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_width',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_tickangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_ticktilt',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_ticksize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_labelangle',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_labelheight',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_valuesize',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'p_Plane_12_2_Axis_valuesquash',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerAxes, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(CreateViewerAxes, 'Axes',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(RescaleColorMap)
+  reg.add_input_port(RescaleColorMap, 'p_main_frame',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(RescaleColorMap, 'p_isFixed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(RescaleColorMap, 'p_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(RescaleColorMap, 'p_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(RescaleColorMap, 'p_makeSymmetric',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(RescaleColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(RescaleColorMap, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(RescaleColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+
+  reg.add_module(ConvertNrrdsToTexture)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_vmin',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_vmax',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_gmin',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_gmax',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_mmin',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_mmax',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_is_fixed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_card_mem',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_card_mem_auto',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_is_uchar',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_histogram',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'p_gamma',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertNrrdsToTexture, 'Value Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_input_port(ConvertNrrdsToTexture, 'Gradient Magnitude Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(ConvertNrrdsToTexture, 'Texture',
+                   (Texture, "Texture"))
+  reg.add_output_port(ConvertNrrdsToTexture, 'JointHistoGram',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(ChooseColorMap)
+  reg.add_input_port(ChooseColorMap, 'p_use_first_valid',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseColorMap, 'p_port_valid_index',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseColorMap, 'p_port_selected_index',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ChooseColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(ChooseColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+
+  reg.add_module(CreateLightForViewer)
+  reg.add_input_port(CreateLightForViewer, 'p_control_pos_saved',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_control_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_control_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_control_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_at_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_at_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_at_z',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateLightForViewer, 'p_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_output_port(CreateLightForViewer, 'Geometry',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(ShowTextureVolume)
+  reg.add_input_port(ShowTextureVolume, 'p_sampling_rate_hi',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_sampling_rate_lo',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_gradient_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_gradient_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_adaptive',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_cmap_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_sw_raster',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_render_style',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_alpha_scale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_interp_mode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_shading',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_ambient',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_diffuse',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_specular',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_shine',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_light',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_blend_res',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_multi_level',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_use_stencil',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_invert_opacity',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_num_clipping_planes',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_show_clipping_widgets',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_level_on',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_level_vals',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'p_id',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowTextureVolume, 'Texture',
+                   (Texture, "Texture"))
+  reg.add_input_port(ShowTextureVolume, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(ShowTextureVolume, 'ColorMap2',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(ShowTextureVolume, 'Geometry',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(ShowTextureVolume, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+
+  reg.add_module(ShowFieldGlyphs)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_has_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_normalize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_scalars_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_has_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_normalize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_bidirectional',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_vectors_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_has_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_transparency',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_normalize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tensors_emphasis',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_secondary_has_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_secondary_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_secondary_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_secondary_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_secondary_alpha',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_secondary_value',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tertiary_has_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tertiary_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tertiary_display_type',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tertiary_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tertiary_alpha',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_tertiary_value',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_on',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_color_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_backface_cull',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_always_visible',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_fontsize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_precision',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_render_locations',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_show_data',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_show_nodes',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_show_edges',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_show_faces',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_text_show_cells',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_def_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_def_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_def_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_def_color_a',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_active_tab',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_interactive_mode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_show_progress',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_field_name',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_field_name_override',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_approx_div',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'p_use_default_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowFieldGlyphs, 'Primary Data',
+                   (Field, "Field"))
+  reg.add_input_port(ShowFieldGlyphs, 'Primary ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(ShowFieldGlyphs, 'Secondary Data',
+                   (Field, "Field"))
+  reg.add_input_port(ShowFieldGlyphs, 'Secondary ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(ShowFieldGlyphs, 'Tertiary Data',
+                   (Field, "Field"))
+  reg.add_input_port(ShowFieldGlyphs, 'Tertiary ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(ShowFieldGlyphs, 'Scene Graph',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(GenerateStreamLines)
+  reg.add_input_port(GenerateStreamLines, 'p_stepsize',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_tolerance',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_maxsteps',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_direction',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_value',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_remove_colinear_pts',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_method',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_nthreads',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'p_auto_parameterize',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLines, 'Vector Field',
+                   (Field, "Field"))
+  reg.add_input_port(GenerateStreamLines, 'Seed Points',
+                   (Field, "Field"))
+  reg.add_output_port(GenerateStreamLines, 'Streamlines',
+                   (Field, "Field"))
+
+  reg.add_module(GenerateStreamLinesWithPlacementHeuristic)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_numsl',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_numpts',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_minper',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_maxper',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_ming',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_maxg',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_numsamples',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_method',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_stepsize',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_stepout',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_maxsteps',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_minmag',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'p_direction',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'Source',
+                   (Field, "Field"))
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'Weighting',
+                   (Field, "Field"))
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'Flow',
+                   (Field, "Field"))
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'Compare',
+                   (Field, "Field"))
+  reg.add_input_port(GenerateStreamLinesWithPlacementHeuristic, 'Seed points',
+                   (Field, "Field"))
+  reg.add_output_port(GenerateStreamLinesWithPlacementHeuristic, 'Streamlines',
+                   (Field, "Field"))
+  reg.add_output_port(GenerateStreamLinesWithPlacementHeuristic, 'Render',
+                   (Field, "Field"))
+
+  reg.add_module(ShowString)
+  reg.add_input_port(ShowString, 'p_bbox',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowString, 'p_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowString, 'p_location_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowString, 'p_location_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowString, 'p_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowString, 'p_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowString, 'p_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowString, 'Format String',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.add_output_port(ShowString, 'Title',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(CreateAndEditColorMap)
+  reg.add_input_port(CreateAndEditColorMap, 'p_rgbhsv',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap, 'p_rgb_points',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap, 'p_alpha_points',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap, 'p_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateAndEditColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(CreateAndEditColorMap, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_output_port(CreateAndEditColorMap, 'Geometry',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(ShowMeshBoundingBox)
+  reg.add_input_port(ShowMeshBoundingBox, 'p_sizex',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMeshBoundingBox, 'p_sizey',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMeshBoundingBox, 'p_sizez',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMeshBoundingBox, 'Field',
+                   (Field, "Field"))
+  reg.add_output_port(ShowMeshBoundingBox, 'Scene Graph',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(CreateStandardColorMaps)
+  reg.add_input_port(CreateStandardColorMaps, 'p_mapName',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_gamma',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_resolution',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_reverse',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_faux',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_positionList',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_nodeList',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_width',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateStandardColorMaps, 'p_height',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_output_port(CreateStandardColorMaps, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+
+  reg.add_module(ShowTextureSlices)
+  reg.add_input_port(ShowTextureSlices, 'p_control_pos_saved',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_drawX',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_drawY',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_drawZ',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_drawView',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_interp_mode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_draw_phi_0',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_draw_phi_1',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_phi_0',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_phi_1',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_multi_level',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_color_changed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_colors',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_level_on',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_outline_levels',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'p_use_stencil',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowTextureSlices, 'Texture',
+                   (Texture, "Texture"))
+  reg.add_input_port(ShowTextureSlices, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(ShowTextureSlices, 'ColorMap2',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(ShowTextureSlices, 'Geometry',
+                   (Geometry, "Geometry"))
+  reg.add_output_port(ShowTextureSlices, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+
+  reg.add_module(ShowMatrix)
+  reg.add_input_port(ShowMatrix, 'p_xpos',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_ypos',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_xscale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_yscale',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_3d_mode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_gmode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_showtext',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_row_begin',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_rows',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_col_begin',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_cols',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'p_colormapmode',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ShowMatrix, 'ColorMap',
+                   (ColorMap, "ColorMap"))
+  reg.add_input_port(ShowMatrix, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ShowMatrix, 'Geometry',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(CreateViewerClockIcon)
+  reg.add_input_port(CreateViewerClockIcon, 'p_type',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_bbox',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_format',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_min',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_max',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_current',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_size',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_location_x',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_location_y',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_color_r',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_color_g',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'p_color_b',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(CreateViewerClockIcon, 'Time Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_input_port(CreateViewerClockIcon, 'Time Nrrd',
+                   (Nrrd, "Nrrd"))
+  reg.add_output_port(CreateViewerClockIcon, 'Clock',
+                   (Geometry, "Geometry"))
+
+  reg.add_module(ConvertFieldsToTexture)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_vmin',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_vmax',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_gmin',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_gmax',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_is_fixed',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_card_mem',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_card_mem_auto',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_histogram',
+                   (core.modules.basic_modules.Integer, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'p_gamma',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_input_port(ConvertFieldsToTexture, 'Value Field',
+                   (Field, "Field"))
+  reg.add_input_port(ConvertFieldsToTexture, 'Gradient Magnitude Field',
+                   (Field, "Field"))
+  reg.add_output_port(ConvertFieldsToTexture, 'Texture',
+                   (Texture, "Texture"))
+  reg.add_output_port(ConvertFieldsToTexture, 'JointHistoGram',
+                   (Nrrd, "Nrrd"))
+
+  reg.add_module(ColorMap2DSemantics)
+  reg.add_input_port(ColorMap2DSemantics, 'Input Colormap',
+                   (ColorMap2, "ColorMap2"))
+  reg.add_output_port(ColorMap2DSemantics, 'Output Colormap',
+                   (ColorMap2, "ColorMap2"))
+
+  reg.add_module(ConvertMatrixToString)
+  reg.add_input_port(ConvertMatrixToString, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ConvertMatrixToString, 'String',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  reg.add_module(ConvertMatrixToField)
+  reg.add_input_port(ConvertMatrixToField, 'p_datalocation',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(ConvertMatrixToField, 'Matrix',
+                   (Matrix, "Matrix"))
+  reg.add_output_port(ConvertMatrixToField, 'Field',
+                   (Field, "Field"))
+
+  reg.add_module(TimeControls)
+  reg.add_input_port(TimeControls, 'p_execmode',
+                   (core.modules.basic_modules.String, 'tip'), True)
+  reg.add_input_port(TimeControls, 'p_scale_factor',
+                   (core.modules.basic_modules.Float, 'tip'), True)
+  reg.add_output_port(TimeControls, 'time',
+                   (Time, "Time"))
+
+
+
+  import viewercell
+  viewercell.registerSelf()
+  import cm2viewcell
+  cm2viewcell.registerSelf()
+
+
+def package_dependencies():
+  return ['edu.utah.sci.vistrails.spreadsheet']
+
+
+def finalize():
+  sr_py.terminate()
+  time.sleep(.5)
diff --git a/contrib/SCIRun/cm2viewcell.py b/contrib/SCIRun/cm2viewcell.py
new file mode 100644
index 0000000..7c19e29
--- /dev/null
+++ b/contrib/SCIRun/cm2viewcell.py
@@ -0,0 +1,285 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+from PyQt4 import QtCore, QtGui, QtOpenGL
+import sip
+from core import system
+from core.modules.module_registry import registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import gc
+from gui.qt import qt_super
+from core.vistrail.action import Action
+from core.vistrail.port import Port
+from core.vistrail import module
+from core.vistrail import connection
+from core.vistrail.module_function import ModuleFunction
+from core.vistrail.module_param import ModuleParam
+from core.modules.vistrails_module import Module, ModuleError
+import db.services.action
+import copy
+import sr_py
+import time
+import uuid
+from renderbase import Render
+
+################################################################################
+class CM2ViewCell(Render):
+    """
+    CM2ViewCell is a VisTrails Module that can display SCIRun Viewer.
+    
+    """
+    def compute(self):
+        """ compute() -> None
+        Dispatch the SCIRun scene graph to the Viewer
+        """
+        sg = self.forceGetInputListFromPort('ColorMap2')
+        self.display(QCM2ViewWidget, (sg))
+        
+
+
+class QCM2ViewWidget(QtOpenGL.QGLWidget) :
+    """
+    QCM2ViewWidget is the actual rendering widget that can display
+    a SCIRun scene graph inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QCM2ViewWidget(parent: QWidget, f: WindowFlags) -> QCM2ViewWidget
+        Initialize QCM2ViewWidget.
+        context
+        
+        """
+        QtOpenGL.QGLWidget.__init__(self, parent)
+
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+
+
+        
+        self.sci_context = sr_py.CallbackOpenGLContext()
+        self.sci_context.set_pymake_current_func(self.make_current)
+        self.sci_context.set_pyswap_func(self.swap)
+        self.sci_context.set_pywidth_func(self.get_width)
+        self.sci_context.set_pyheight_func(self.get_height)
+        self.sci_context.set_pyrelease_func(self.release)
+        unique_id = uuid.uuid4()
+        self._id = "sr_viewer_%s" % str(unique_id)
+        #print self._id
+        self.full_speed = False
+        self.timer = QtCore.QTimer()
+        self.connect(self.timer,
+                     QtCore.SIGNAL("timeout()"), self.updateGL)
+        
+    def make_current(self) :
+        if self.isValid() :
+            self.makeCurrent()
+            return 1
+        return 0
+
+    def swap(self) :
+        if self.isValid() :
+            self.swapBuffers() 
+            return 1
+        return 0
+
+    def get_width(self) :
+        if self.isValid() :
+            w = self.width()
+            return w
+        return 0
+
+    def get_height(self) :
+        if self.isValid() :
+            h = self.height()
+            return h
+        return 0
+    
+    def release(self) :
+        #self.doneCurrent()
+        pass
+
+    def pointer_event(self, e, event) :
+        e.set_x(event.x())
+        e.set_y(event.y())
+
+        mask = e.get_modifiers()
+        mask = self.get_sr_py_modifier_mask(event, mask) 
+        e.set_modifiers(mask)
+        
+        state = e.get_pointer_state()
+        state, n = self.get_sr_py_pointer_modifier_mask(event, state)
+        e.set_pointer_state(state)
+        sr_py.add_pointer_event(e, self._id)
+        
+    def get_sr_py_modifier_mask(self, event, mask) :
+        if event.modifiers() & QtCore.Qt.ShiftModifier :
+            mask  |= sr_py.EventModifiers.SHIFT_E
+        if event.modifiers() & QtCore.Qt.ControlModifier :
+            mask  |= sr_py.EventModifiers.CONTROL_E
+        if event.modifiers() & QtCore.Qt.AltModifier :
+            mask  |= sr_py.EventModifiers.ALT_E
+        if event.modifiers() & QtCore.Qt.MetaModifier :
+            mask  |= sr_py.EventModifiers.M1_E
+        return mask
+
+    def get_sr_py_pointer_modifier_mask(self, event, mask) :
+        n = 0
+
+        if event.buttons() & QtCore.Qt.LeftButton :
+            mask  |= sr_py.PointerEvent.BUTTON_1_E
+            n = 1
+        if event.buttons() & QtCore.Qt.MidButton :
+            mask  |= sr_py.PointerEvent.BUTTON_2_E
+            n = 2
+        if event.buttons() & QtCore.Qt.RightButton :
+            mask  |= sr_py.PointerEvent.BUTTON_3_E
+            n = 3
+        return mask, n
+
+    def initializeGL(self):
+        # create the viewer
+        self.vid = sr_py.create_cm2view(self.sci_context, self._id)
+        #start the timer
+        #self.timer.start(33)
+        
+##     def paintGL(self):
+##         #self.doneCurrent()
+##         pass
+
+    def glDraw(self):
+        sr_py.update_cm2view(self.vid);
+        
+        if self.timer.isActive() and not self.full_speed :
+            self.full_speed = True
+            self.timer.start(55)
+
+        if not self.timer.isActive() :
+            self.timer.start(1000)
+            
+
+    
+    def mousePressEvent(self, event):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to SCIRun event system.
+        
+        """
+        e = sr_py.PointerEvent()
+        e.set_pointer_state(sr_py.PointerEvent.BUTTON_PRESS_E)
+        self.pointer_event(e, event)
+
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to SCIRun event system.
+        
+        """
+        e = sr_py.PointerEvent()
+        #e.set_time(long(event.time))
+        e.set_pointer_state(sr_py.PointerEvent.BUTTON_RELEASE_E)
+        self.pointer_event(e, event)
+
+    def mouseMoveEvent(self, event):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to SCIRun event system.
+        
+        """
+        e = sr_py.PointerEvent()
+        #e.set_time(long(event.time))
+        e.set_pointer_state(sr_py.PointerEvent.MOTION_E)
+        self.pointer_event(e, event)
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        
+        """
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        
+        """
+        
+        
+    def keyPressEvent(self, event):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Echo the key event to the SCIRun event system.
+        
+        """
+
+        ascii_key = None
+        if event.text().length()>0:
+            ascii_key = event.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        #for now use native...
+        keysym = event.nativeVirtualKey()
+        e = sr_py.KeyEvent()
+        #e.set_time(long(event.time))
+        # translate qt modifiers to sci modifiers
+        mask = e.get_modifiers()
+        e.set_modifiers(self.get_sr_py_modifier_mask(event, mask))
+        e.set_keyval(keysym)
+        e.set_key_string(ascii_key)
+        e.set_key_state(sr_py.KeyEvent.KEY_PRESS_E)
+        sr_py.add_key_event(e, self._id)
+        
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        
+        """
+        #print "keyReleaseEvent"
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        print "wheelEvent"
+        
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Connects the input scene graph to this viewer
+        
+        """
+
+##         p = inputPorts[0]
+##         for i in p:
+##             if i != 0 :
+##                 sr_py.send_scene(i, self._id);
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    identifier = "edu.utah.sci.vistrails.scirun"
+#    registry.add_module(Render, abstract=True)
+    registry.add_module(CM2ViewCell)
+    registry.add_input_port(CM2ViewCell, "Location", CellLocation)
+    registry.add_input_port(CM2ViewCell, "Scene Graph",
+                            registry.get_module_by_name(identifier,
+                                                        'Geometry'),
+                            'Scene Graph')
+
diff --git a/contrib/SCIRun/renderbase.py b/contrib/SCIRun/renderbase.py
new file mode 100644
index 0000000..a4363f0
--- /dev/null
+++ b/contrib/SCIRun/renderbase.py
@@ -0,0 +1,10 @@
+from core import system
+from core.modules.module_registry import registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+
+class Render(SpreadsheetCell):
+  def compute(self): 
+      pass
+
+def registerRender():
+    registry.add_module(Render, abstract=True)
diff --git a/contrib/SCIRun/viewercell.py b/contrib/SCIRun/viewercell.py
new file mode 100644
index 0000000..0c4053b
--- /dev/null
+++ b/contrib/SCIRun/viewercell.py
@@ -0,0 +1,289 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+from PyQt4 import QtCore, QtGui, QtOpenGL
+import sip
+from core import system
+from core.modules.module_registry import registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import gc
+from gui.qt import qt_super
+from core.vistrail.action import Action
+from core.vistrail.port import Port
+from core.vistrail import module
+from core.vistrail import connection
+from core.vistrail.module_function import ModuleFunction
+from core.vistrail.module_param import ModuleParam
+from core.modules.vistrails_module import Module, ModuleError
+import db.services.action
+import copy
+import sr_py
+import time
+import uuid
+from renderbase import Render, registerRender
+
+
+################################################################################
+class ViewerCell(Render):
+    """
+    ViewerCell is a VisTrails Module that can display SCIRun Viewer.
+    
+    """
+    def compute(self):
+        """ compute() -> None
+        Dispatch the SCIRun scene graph to the Viewer
+        """
+        sg = self.forceGetInputListFromPort('Scene Graph')
+        self.display(QViewerWidget, (sg))
+        
+
+
+class QViewerWidget(QtOpenGL.QGLWidget) :
+    """
+    QViewerWidget is the actual rendering widget that can display
+    a SCIRun scene graph inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QViewerWidget(parent: QWidget, f: WindowFlags) -> QViewerWidget
+        Initialize QViewerWidget.
+        context
+        
+        """
+        QtOpenGL.QGLWidget.__init__(self, parent)
+
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+
+
+        
+        self.sci_context = sr_py.CallbackOpenGLContext()
+        self.sci_context.set_pymake_current_func(self.make_current)
+        self.sci_context.set_pyswap_func(self.swap)
+        self.sci_context.set_pywidth_func(self.get_width)
+        self.sci_context.set_pyheight_func(self.get_height)
+        self.sci_context.set_pyrelease_func(self.release)
+        unique_id = uuid.uuid4()
+        self._id = "sr_viewer_%s" % str(unique_id)
+        #print self._id
+        self.full_speed = False
+        self.timer = QtCore.QTimer()
+        self.connect(self.timer,
+                     QtCore.SIGNAL("timeout()"), self.updateGL)
+        
+    def make_current(self) :
+        if self.isValid() :
+            self.makeCurrent()
+            return 1
+        return 0
+
+    def swap(self) :
+        if self.isValid() :
+            self.swapBuffers() 
+            return 1
+        return 0
+
+    def get_width(self) :
+        if self.isValid() :
+            w = self.width()
+            return w
+        return 0
+
+    def get_height(self) :
+        if self.isValid() :
+            h = self.height()
+            return h
+        return 0
+    
+    def release(self) :
+        #self.doneCurrent()
+        pass
+
+    def pointer_event(self, e, event) :
+        e.set_x(event.x())
+        e.set_y(event.y())
+
+        mask = e.get_modifiers()
+        mask = self.get_sr_py_modifier_mask(event, mask) 
+        e.set_modifiers(mask)
+        
+        state = e.get_pointer_state()
+        state, n = self.get_sr_py_pointer_modifier_mask(event, state)
+        e.set_pointer_state(state)
+        sr_py.add_pointer_event(e, self._id)
+        
+    def get_sr_py_modifier_mask(self, event, mask) :
+        if event.modifiers() & QtCore.Qt.ShiftModifier :
+            mask  |= sr_py.EventModifiers.SHIFT_E
+        if event.modifiers() & QtCore.Qt.ControlModifier :
+            mask  |= sr_py.EventModifiers.CONTROL_E
+        if event.modifiers() & QtCore.Qt.AltModifier :
+            mask  |= sr_py.EventModifiers.ALT_E
+        if event.modifiers() & QtCore.Qt.MetaModifier :
+            mask  |= sr_py.EventModifiers.M1_E
+        return mask
+
+    def get_sr_py_pointer_modifier_mask(self, event, mask) :
+        n = 0
+
+        if event.buttons() & QtCore.Qt.LeftButton :
+            mask  |= sr_py.PointerEvent.BUTTON_1_E
+            n = 1
+        if event.buttons() & QtCore.Qt.MidButton :
+            mask  |= sr_py.PointerEvent.BUTTON_2_E
+            n = 2
+        if event.buttons() & QtCore.Qt.RightButton :
+            mask  |= sr_py.PointerEvent.BUTTON_3_E
+            n = 3
+        return mask, n
+
+    def initializeGL(self):
+        # create the viewer
+        self.vid = sr_py.create_viewer(self.sci_context, self._id)
+        #start the timer
+        #self.timer.start(33)
+        
+##     def paintGL(self):
+##         #self.doneCurrent()
+##         pass
+
+    def glDraw(self):
+        sr_py.update_viewer(self.vid);
+        
+        if self.timer.isActive() and not self.full_speed :
+            self.full_speed = True
+            self.timer.start(55)
+
+        if not self.timer.isActive() :
+            self.timer.start(1000)
+            
+
+    
+    def mousePressEvent(self, event):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to SCIRun event system.
+        
+        """
+        e = sr_py.PointerEvent()
+        e.set_pointer_state(sr_py.PointerEvent.BUTTON_PRESS_E)
+        self.pointer_event(e, event)
+
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to SCIRun event system.
+        
+        """
+        e = sr_py.PointerEvent()
+        #e.set_time(long(event.time))
+        e.set_pointer_state(sr_py.PointerEvent.BUTTON_RELEASE_E)
+        self.pointer_event(e, event)
+
+    def mouseMoveEvent(self, event):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to SCIRun event system.
+        
+        """
+        e = sr_py.PointerEvent()
+        #e.set_time(long(event.time))
+        e.set_pointer_state(sr_py.PointerEvent.MOTION_E)
+        self.pointer_event(e, event)
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        
+        """
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        
+        """
+        
+        
+    def keyPressEvent(self, event):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Echo the key event to the SCIRun event system.
+        
+        """
+
+        ascii_key = None
+        if event.text().length()>0:
+            ascii_key = event.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        #for now use native...
+        keysym = event.nativeVirtualKey()
+        e = sr_py.KeyEvent()
+        #e.set_time(long(event.time))
+        # translate qt modifiers to sci modifiers
+        mask = e.get_modifiers()
+        e.set_modifiers(self.get_sr_py_modifier_mask(event, mask))
+        e.set_keyval(keysym)
+        e.set_key_string(ascii_key)
+        e.set_key_state(sr_py.KeyEvent.KEY_PRESS_E)
+        sr_py.add_key_event(e, self._id)
+        
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        
+        """
+        #print "keyReleaseEvent"
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        print "wheelEvent"
+        
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Connects the input scene graph to this viewer
+        
+        """
+        for p in inputPorts :
+          try:
+            for i in p:
+              if i != 0 :
+                print i
+                sr_py.send_scene(i, self._id);
+          except:
+            if p != 0 :
+              sr_py.send_scene(p, self._id);
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    identifier = "edu.utah.sci.vistrails.scirun"
+    registerRender()
+    registry.add_module(ViewerCell)
+    registry.add_input_port(ViewerCell, "Location", CellLocation)
+    registry.add_input_port(ViewerCell, "Scene Graph",
+                            registry.get_module_by_name(identifier,
+                                                        'Geometry'),
+                            'Scene Graph')
+
diff --git a/contrib/SciPy/DSP.py b/contrib/SciPy/DSP.py
new file mode 100644
index 0000000..7cf5c69
--- /dev/null
+++ b/contrib/SciPy/DSP.py
@@ -0,0 +1,150 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import *
+import scipy
+from scipy import sparse, fftpack
+import numpy
+
+#################################################################
+
+class DSP(SciPy):
+    def compute(self):
+        pass
+
+class FFT(DSP):
+    def compute(self):
+        mat = self.getInputFromPort("Signals")
+        pts = self.getInputFromPort("FFT Samples")
+
+        phasors = fftpack.fft(mat.matrix.data, pts)
+        outmat = sparse.csc_matrix(phasors)
+        out = SparseMatrix()
+        out.matrix = outmat
+        self.setResult("FFT Output", out)
+
+class FFT2(DSP):
+    def compute(self):
+        mat = self.getInputFromPort("Signals")
+
+        phasors = fftpack.fftn(mat.matrix.data)
+        outmat = sparse.csc_matrix(phasors)
+        out = SparseMatrix()
+        out.matrix = outmat
+        self.setResult("FFT Output", out)
+
+class WindowedFourierTransform(DSP):
+    def compute(self):
+        mat = self.getInputFromPort("Signal")
+        
+        sr = self.getInputFromPort("Sampling Rate")
+        if self.hasInputFromPort("Window Size"):
+            window = self.getInputFromPort("Window Size")
+        else:
+            window = sr
+
+        if self.hasInputFromPort("Stride"):
+            stride = self.getInputFromPort("Stride")
+        else:
+            stride = int(sr / 2)
+
+        
+        signal_array = mat.matrix.toarray().ravel()
+
+        # We now have a 1-D array that we can have good indexing into
+        pad = signal_array[0:int(window/2)]
+        signal_array = numpy.concatenate((pad,signal_array))
+        win_low = 0
+        win_hi = window - 1
+        phasors = fftpack.fft(signal_array[win_low:win_hi])
+        out_array = phasors.ravel()
+
+        win_low += stride
+        win_hi += stride
+
+        while win_hi < signal_array.shape[0]:
+            phasors = fftpack.fft(signal_array[win_low:win_hi])
+            win_low += stride
+            win_hi += stride
+            out_array = numpy.vstack([out_array, phasors.ravel()])
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(out_array)
+        self.setResult("FFT Output", out)
+
+class ShortTimeFourierTransform(DSP):
+    def get_signal(self, sigs, window, offset, size):
+        win = scipy.zeros(sigs.shape[0]).ravel()
+        win[offset:offset+size] = window.ravel()
+        part = sigs * win
+        return part
+    
+    def compute(self):
+        mat = self.getInputFromPort("Signal")
+        sr = self.getInputFromPort("Sampling Rate")
+
+        if self.hasInputFromPort("Window"):
+            window = self.getInputFromPort("Window").matrix.toarray()
+            win_size = window.shape[1]
+        else:
+            win_size = self.getInputFromPort("WindowSize")
+            window = scipy.signal.hamming(win_size)
+
+        if self.hasInputFromPort("Stride"):
+            stride = self.getInputFromPort("Stride")
+        else:
+            stride = int(win_size / 2)
+
+        signal_array = mat.matrix.transpose().toarray().ravel()
+
+        samples = signal_array.shape[0]
+
+        offset = 0
+        sig = self.get_signal(signal_array, window, offset, win_size)
+        phasors = fftpack.fft(sig).ravel()
+        out_array = phasors
+        offset += stride
+
+        i = 1
+        while 1:
+            try:
+                sig = self.get_signal(signal_array, window, offset, win_size)
+                phasors = fftpack.fft(sig)
+                offset += stride
+                out_array = numpy.vstack([out_array, phasors.ravel()])
+                i += 1
+            except:
+                break
+
+        (slices, freqs) = out_array.shape
+        ar = out_array[0:,0:sr*2]
+        ar = ar[0:,::-1]
+
+        out = SparseMatrix()
+        sigout = SparseMatrix()
+        sigout.matrix = sparse.csc_matrix(signal_array)
+        out.matrix = sparse.csc_matrix(ar)
+        self.setResult("Signal Output", sigout)
+        self.setResult("FFT Output", out)
diff --git a/contrib/SciPy/Filters.py b/contrib/SciPy/Filters.py
new file mode 100644
index 0000000..9ddb308
--- /dev/null
+++ b/contrib/SciPy/Filters.py
@@ -0,0 +1,118 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import *
+import scipy
+import scipy.signal
+from scipy import sparse, fftpack
+import numpy
+
+class DSPFilters(SciPy):
+    def compute(self):
+        pass
+
+class HanningWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.hanning(size))
+        self.setResult("Window", out)
+
+class TriangularWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.triang(size))
+        self.setResult("Window", out)
+
+class BlackmanWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.blackman(size))
+        self.setResult("Window", out)
+
+class BlackmanHarrisWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.blackmanharris(size))
+        self.setResult("Window", out)
+
+class ParzenWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.parzen(size))
+        self.setResult("Window", out)
+
+class HammingWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.hamming(size))
+        self.setResult("Window", out)
+
+class KaiserWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        beta = self.getInputFromPort("Beta")
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.kaiser(size, beta))
+        self.setResult("Window", out)
+
+class BartlettHannWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.barthann(size))
+        self.setResult("Window", out)
+
+class GaussianWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+        sigma = self.getInputFromPort("Sigma")
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.gaussian(size, sigma))
+        self.setResult("Window", out)
+
+class BoxcarWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.boxcar(size))
+        self.setResult("Window", out)
+
+class BohmanWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.bohman(size))
+        self.setResult("Window", out)
+
+class BartlettWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.bartlett(size))
+        self.setResult("Window", out)
+
+class NuttallBlackmanHarrisWindow(DSPFilters):
+    def compute(self):
+        size = self.getInputFromPort("Window Size")
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.signal.nuttall(size))
+        self.setResult("Window", out)
+
diff --git a/contrib/SciPy/MatlabReader.py b/contrib/SciPy/MatlabReader.py
new file mode 100644
index 0000000..38e2ced
--- /dev/null
+++ b/contrib/SciPy/MatlabReader.py
@@ -0,0 +1,51 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import *
+from scipy import io, sparse
+import numpy
+
+#######################################################################
+
+class MatlabReader(SciPy):
+
+    def compute(self):
+        if self.hasInputFromPort("Filename"):
+            fname = self.getInputFromPort("Filename")
+        else:
+            fname = self.getInputFromPort("File").name
+        self.readFileAsCSC(fname)
+   
+    def readFileAsCSC(self, filename):
+        m = io.loadmat(filename, None, 0)
+        vals = m.values()
+        for t in vals:
+            if type(t) == numpy.ndarray:
+                mat = t
+
+        cscmat = sparse.csr_matrix(mat)
+        self.matrix = SparseMatrix()
+        self.matrix.matrix = cscmat
+        self.setResult("sparseoutput", self.matrix)
diff --git a/contrib/SciPy/Matrix.py b/contrib/SciPy/Matrix.py
new file mode 100644
index 0000000..9c4d9f4
--- /dev/null
+++ b/contrib/SciPy/Matrix.py
@@ -0,0 +1,121 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+
+from numpy import allclose, arange, eye, linalg, ones
+from scipy import linsolve, sparse
+
+#######################################################################
+class Matrix(SciPy):
+
+    def setSize(self, size):
+        pass
+
+    def setMatrix(self, m):
+        self.matrix = m
+
+    def numElements(self):
+        return self.matrix.getnnz()
+
+    def maxNumElements(self):
+        return self.matrix.nzmax
+
+    def rows(self):
+        return self.matrix.shape[0]
+
+    def cols(self):
+        return self.matrix.shape[1]
+
+    def Reals(self):
+        out = SparseMatrix()
+        tmp = self.matrix.copy()
+        out.matrix = tmp._real()
+        return out
+
+    def Imaginaries(self):
+        out = SparseMatrix()
+        tmp = self.matrix.copy()
+        out.matrix = tmp._imag()
+        return out
+ 
+    def Conjugate(self):
+        out = SparseMatrix()
+        out.matrix = self.matrix.conjugate().copy()
+        return out
+
+    def GetRow(self, i):
+        return self.matrix.getrow(i)
+
+    def GetCol(self, i):
+        return self.matrix.getcol(i)
+
+class SparseMatrix(Matrix):
+
+    def setSize(self, size):
+        self.matrix = sparse.csc_matrix((size, size))
+        self.matrix.setdiag(ones(size))
+
+class DenseMatrix(Matrix):
+
+    def setSize(self, size):
+        self.matrix = sparse.csc_matrix((size, size))
+        self.matrix.setdiag(ones(size))
+        self.matrix.todense()
+    
+
+class DOKMatrix(Matrix):
+
+    def setSize(self, size):
+        self.matrix = sparse.dok_matrix((size, size))
+        self.matrix.setdiag(ones(size))
+
+class COOMatrix(Matrix):
+    
+    def __init__(self, mat):
+        self.matrix=mat
+
+    def setSize(self, size):
+        self.matrix = sparse.coo_matrix((size, size))
+        self.matrix.setdiag(ones(size))
+
+class CSRMatrix(Matrix):
+    
+    def __init__(self, mat):
+        self.matrix=mat
+
+    def setSize(self, size):
+        self.matrix = sparse.csr_matrix((size, size))
+        self.matrix.setdiag(ones(size))
+
+class LILMatrix(Matrix):
+    
+    def __init__(self, mat):
+        self.matrix=mat
+
+    def setSize(self, size):
+        self.matrix = sparse.lil_matrix((size, size))
+        self.matrix.setdiag(ones(size))
+
+#######################################################################
diff --git a/contrib/SciPy/MatrixConvert.py b/contrib/SciPy/MatrixConvert.py
new file mode 100644
index 0000000..bacc865
--- /dev/null
+++ b/contrib/SciPy/MatrixConvert.py
@@ -0,0 +1,150 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import Matrix, COOMatrix, SparseMatrix, CSRMatrix
+from scipy import sparse
+import numpy, scipy
+
+class MatrixConvert(SciPy):
+
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        to = self.getInputFromPort("OutputType")
+
+        to = to.upper()
+        if to == 'Dense':
+            self.matrix = DenseMatrix(m.matrix.todense())
+            self.setResult("SparseOutput", self.matrix)
+        else:
+            self.matrix = SparseMatrix(m.matrix.tocsc())
+            self.setResult("SparseOutput", self.matrix)
+
+class vtkDataSetToMatrix(SciPy):
+    ''' In some cases, particularly in terms of user-defined VTK Filters, the
+        output of the filter is a vtk datatype representing '''
+    
+    def from_unstructured_grid(self, vtkalgout):
+        import vtk
+        prod = vtkalgout.vtkInstance.GetProducer()
+        prod.Update()
+        grid = prod.GetOutput()
+        pt_set = grid.GetPoints()
+        scalars = grid.GetPointData().GetScalars()
+
+        ''' Points in vtk are always 3D... so we must assume this. '''
+        self.matrix_ = SparseMatrix()
+        self.matrix_.matrix = sparse.csc_matrix((grid.GetNumberOfPoints(), 3))
+
+        i = 0
+        while i < grid.GetNumberOfPoints():
+            (x,y,z) = pt_set.GetPoint(i)
+            self.matrix_.matrix[i,0] = x
+            self.matrix_.matrix[i,1] = y
+            self.matrix_.matrix[i,2] = z
+            print x, y, z
+            i += 1
+            
+        
+    def compute(self):
+        if self.hasInputFromPort("vtkUnstructuredGrid"):
+            self.from_unstructured_grid(self.getInputFromPort("vtkUnstructuredGrid"))
+        else:
+            pass
+
+        self.setResult("Output Matrix", self.matrix_)
+
+class PhaseHistogramToVTKPoints(SciPy):
+
+    def form_point_set(self, histo, point_set):
+        (slices, numbins) = histo.shape
+        phases = numpy.arange(numbins)
+        phases = phases * (360. / numbins)
+        phases += phases[1] / 2.
+        phi_step = phases[0]
+        
+        for time in xrange(slices):
+            z = float(time)
+            for bin in xrange(numbins):
+                r = histo[time,bin]
+                theta = phi_step * (bin+1)
+                theta *= (scipy.pi / 180.)
+                x = r*scipy.cos(theta)
+                y = r*scipy.sin(theta)
+                point_set.InsertNextPoint(x, y, z)
+
+            for bin in xrange(numbins):
+                curbin = bin
+                lastbin = bin-1
+                if lastbin < 0:
+                    lastbin = numbins-1
+
+                r = (histo[time,bin] -  histo[time,lastbin]) / 2.
+                theta = curbin * 360. / numbins
+                x = r*scipy.cos(theta)
+                y = r*scipy.sin(theta)
+                point_set.InsertNextPoint(x, y, z)
+                
+
+    def compute(self):
+        import vtk
+        
+        phasors = self.getInputFromPort("FFT Input")
+        numbins = self.getInputFromPort("Num Bins")
+        phasor_matrix = phasors.matrix.toarray()
+        (timeslices,phases) = phasor_matrix.shape
+
+        point_set = vtk.vtkPoints()
+
+        histo = numpy.zeros((timeslices, numbins))
+
+        for time in xrange(timeslices):
+            phase_slice = phasor_matrix[time,:]
+            reals = phase_slice.real
+            imaginary = phase_slice.imag
+            phases = scipy.arctan2(imaginary, reals)
+            phases = phases * (180. / scipy.pi)
+            bins = phases % numbins
+            for b in bins:
+                histo[time,b] += 1
+
+        self.form_point_set(histo, point_set)
+
+        pointdata = vtk.vtkUnstructuredGrid()
+        pointdata.SetPoints(point_set)
+
+        self.surf_filter = vtk.vtkSurfaceReconstructionFilter()
+
+        self.surf_filter.SetInput(0,pointdata)
+#        self.surf_filter.Update()
+        reg = core.modules.module_registry
+        vtk_set = reg.registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkAlgorithmOutput').module()
+        vtk_set.vtkInstance = self.surf_filter.GetOutputPort()
+
+        histo_mat = SparseMatrix()
+        histo_mat.matrix = sparse.csc_matrix(histo)
+
+        self.setResult("Num Slices", timeslices)
+        self.setResult("Phase Histogram", histo_mat)
+        self.setResult("Phase Geometry", vtk_set)
diff --git a/contrib/SciPy/MatrixInfo.py b/contrib/SciPy/MatrixInfo.py
new file mode 100644
index 0000000..223e40c
--- /dev/null
+++ b/contrib/SciPy/MatrixInfo.py
@@ -0,0 +1,45 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import Matrix
+
+class MatrixInfo(SciPy):
+
+    def getString(self, m):
+        numrows = m.rows()
+        numcols = m.cols()
+        numel = m.numElements()
+        maxel = m.maxNumElements()
+
+        out = "Matrix Info:\n\tNumber of Rows:  " + str(numrows) + \
+              "\n\tNumber of Columns:  " + str(numcols) + \
+              "\n\tNumber of Elements:  " + str(numel) + \
+              "\n\tMaximum Number of Elements for compressed matrix:  " + \
+              str(maxel)
+
+        return out
+
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        self.setResult("output", self.getString(m))
diff --git a/contrib/SciPy/MatrixOperations.py b/contrib/SciPy/MatrixOperations.py
new file mode 100644
index 0000000..e18aebe
--- /dev/null
+++ b/contrib/SciPy/MatrixOperations.py
@@ -0,0 +1,139 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import *
+import math
+import scipy
+
+class MatrixOperation(SciPy):
+    def compute(self):
+        pass
+
+class GetReals(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        self.setResult("OutputMatrix", m.Reals())
+
+class GetImaginaries(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        self.setResult("OutputMatrix", m.Imaginaries())
+
+class Conjugate(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        self.setResult("OutputMatrix", m.Conjugate())
+
+class GetRow(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        c = self.getInputFromPort("RowIndex")
+        row = m.GetRow(c)
+        mat = SparseMatrix()
+        mat.matrix = row
+        self.setResult("OutputMatrix", mat)
+
+class GetCol(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        c = self.getInputFromPort("ColIndex")
+        col = m.GetCol(c)
+        mat = SparseMatrix()
+        mat.matrix = col
+        self.setResult("OutputMatrix", mat)
+
+class MatrixMultiply(MatrixOperation):
+    def compute(self):
+        a = self.getInputFromPort("InputMatrix1")
+        b = self.getInputFromPort("InputMatrix2")
+        c = a.matrix * b.matrix
+        out = SparseMatrix()
+        out.matrix = c
+        return out
+
+class ScalarMultiply(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        s = self.getInputFromPort("Scalar")
+        m.matrix = m.matrix * s
+        self.setResult("OutputMatrix", m)
+
+class ElementMultiply(MatrixOperation):
+    def compute(self):
+        from numpy import array
+        a = self.getInputFromPort("InputMatrix1")
+        b = self.getInputFromPort("InputMatrix2")
+        if a.matrix.shape != b.matrix.shape:
+            raise ModuleError(self, 'Mismatching input dimensions!')
+        c = SparseMatrix()
+        c.matrix = sparse.csc_matrix(array(a.matrix.toarray())*array(b.matrix.toarray()))
+        self.setResult("OutputMatrix", c)
+
+class Transpose(MatrixOperation):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        m.matrix = m.matrix.transpose()
+        self.setResult("OutputMatrix", m)
+ 
+class PrintMatrix(Matrix):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        s = m.matrix.__str__()
+        self.setResult("Output", s)
+
+class GetColumnRange(Matrix):
+    def compute(self):
+        m = self.getInputFromPort("InputMatrix")
+        start = self.getInputFromPort("StartIndex")
+        end = self.getInputFromPort("EndIndex")
+        size = end - start
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix((m.matrix.shape[0], size))
+
+        i = 0
+        j = 0
+        while j < m.matrix.shape[0]:
+            while i < size:
+                val = m.matrix[j,start+i]
+                out.matrix[j,i] = val
+                i = i + 1
+            j = j + 1
+        
+        self.setResult("Output", out)
+        
+class ATan2(MatrixOperation):
+    def compute(self):
+        if self.hasInputFromPort("InputMatrix"):
+            m = self.getInputFromPort("InputMatrix")
+            r = m.Reals().matrix
+            im = m.Imaginaries().matrix
+        else:
+            r = self.getInputFromPort("RealMatrix").matrix
+            im = self.getInputFromPort("ImaginaryMatrix").matrix
+
+        out = SparseMatrix()
+        out.matrix = sparse.csc_matrix(scipy.arctan2(im.toarray(),r.toarray()))
+        self.setResult("Output", out)
diff --git a/contrib/SciPy/SciPy.py b/contrib/SciPy/SciPy.py
new file mode 100644
index 0000000..6ab54ea
--- /dev/null
+++ b/contrib/SciPy/SciPy.py
@@ -0,0 +1,36 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+################################################################################
+
+class SciPy(Module):
+        def compute(self):
+                pass
+#    def __init__(self):
+#        Module.__init__(self)
+
+    #  The compute method is passed on as this is functioning only as a base class.      
+
+################################################################################
diff --git a/contrib/SciPy/__init__.py b/contrib/SciPy/__init__.py
new file mode 100644
index 0000000..ba18208
--- /dev/null
+++ b/contrib/SciPy/__init__.py
@@ -0,0 +1,226 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from SciPy import SciPy
+from Matrix import *
+from MatlabReader import MatlabReader
+from MatrixInfo import MatrixInfo
+from MatrixConvert import *
+from MatrixOperations import *
+from DSP import *
+from Filters import *
+import core.modules.basic_modules
+
+version = '0.9.0'
+name = 'SciPy'
+identifier = 'edu.utah.sci.vistrails.scipy'
+
+##############################################################################
+
+from scipy import sparse
+
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry.get_module_registry()
+    basic = core.modules.basic_modules
+
+    reg.add_module(SciPy)
+    reg.add_module(Matrix)
+    reg.add_module(MatrixOperation)
+    reg.add_module(DSP)
+    reg.add_module(DSPFilters, name="DSP Window Filters")
+
+    reg.add_module(SparseMatrix)
+    reg.add_input_port(SparseMatrix, "size", (basic.Integer, 'Matrix Size'))
+    reg.add_output_port(SparseMatrix, "output", (SparseMatrix, 'Output Matrix'))
+
+    reg.add_module(HanningWindow)
+    reg.add_input_port(HanningWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(HanningWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(TriangularWindow)
+    reg.add_input_port(TriangularWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(TriangularWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(BlackmanWindow)
+    reg.add_input_port(BlackmanWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(BlackmanWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(BlackmanHarrisWindow)
+    reg.add_input_port(BlackmanHarrisWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(BlackmanHarrisWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(ParzenWindow)
+    reg.add_input_port(ParzenWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(ParzenWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(HammingWindow)
+    reg.add_input_port(HammingWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(HammingWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(KaiserWindow)
+    reg.add_input_port(KaiserWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_input_port(KaiserWindow, "Beta", (basic.Float, 'Beta'))
+    reg.add_output_port(KaiserWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(BartlettHannWindow)
+    reg.add_input_port(BartlettHannWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(BartlettHannWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(GaussianWindow)
+    reg.add_input_port(GaussianWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_input_port(GaussianWindow, "Sigma", (basic.Integer, 'Sigma (Std. Deviation)'))
+    reg.add_output_port(GaussianWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(BoxcarWindow)
+    reg.add_input_port(BoxcarWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(BoxcarWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(BohmanWindow)
+    reg.add_input_port(BohmanWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(BohmanWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(BartlettWindow)
+    reg.add_input_port(BartlettWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(BartlettWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(NuttallBlackmanHarrisWindow)
+    reg.add_input_port(NuttallBlackmanHarrisWindow, "Window Size", (basic.Integer, 'Window Size'))
+    reg.add_output_port(NuttallBlackmanHarrisWindow, "Window", (SparseMatrix, 'Window'))
+
+    reg.add_module(PrintMatrix)
+    reg.add_input_port(PrintMatrix, "InputMatrix", (Matrix, 'Matrix'))
+    reg.add_output_port(PrintMatrix, "Output", (basic.String, 'Output String'))
+
+    reg.add_module(MatrixConvert)
+    reg.add_input_port(MatrixConvert, "InputMatrix", (Matrix, 'Matrix'))
+    reg.add_input_port(MatrixConvert, "OutputType", (basic.String, 'Output Type'))
+    reg.add_output_port(MatrixConvert, "SparseOutput", (SparseMatrix, 'Output Sparse Matrix'))
+#    reg.add_output_port(MatrixConvert, "COOOutput", (COOMatrix, 'Output COO Matrix'))
+#    reg.add_output_port(MatrixConvert, "CSCOutput", (CSCMatrix, 'Output CSC Matrix'))
+
+    reg.add_module(MatlabReader)
+    reg.add_input_port(MatlabReader, "Filename", (basic.String, 'Filename'))
+    reg.add_output_port(MatlabReader, "sparseoutput", (SparseMatrix, 'Output Sparse Matrix'))
+    reg.add_input_port(MatlabReader, "File", (basic.File, 'File'))
+    
+    reg.add_module(MatrixInfo)
+    reg.add_input_port(MatrixInfo, "InputMatrix", (Matrix, 'Matrix'))
+    reg.add_output_port(MatrixInfo, "output", (basic.String, 'Output String'))
+
+    reg.add_module(GetReals)
+    reg.add_input_port(GetReals, "InputMatrix", (SparseMatrix, 'Input Matrix'))
+    reg.add_output_port(GetReals, "OutputMatrix", (SparseMatrix, 'Result'))
+
+    reg.add_module(GetImaginaries)
+    reg.add_input_port(GetImaginaries, "InputMatrix", (SparseMatrix, 'Input Matrix'))
+    reg.add_output_port(GetImaginaries, "OutputMatrix", (SparseMatrix, 'Result'))
+
+    reg.add_module(Conjugate)
+    reg.add_input_port(Conjugate, "InputMatrix", (SparseMatrix, 'Input Matrix'))
+    reg.add_output_port(Conjugate, "OutputMatrix", (SparseMatrix, 'Result'))
+
+    reg.add_module(GetRow)
+    reg.add_input_port(GetRow, "InputMatrix", (Matrix, 'Input Matrix'))
+    reg.add_input_port(GetRow, "RowIndex", (basic.Integer, 'Row Index'))
+    reg.add_output_port(GetRow, "OutputMatrix", (SparseMatrix, 'Result'))
+
+    reg.add_module(GetCol)
+    reg.add_input_port(GetCol, "InputMatrix", (Matrix, 'Input Matrix'))
+    reg.add_input_port(GetCol, "ColIndex", (basic.Integer, 'Col Index'))
+    reg.add_output_port(GetCol, "OutputMatrix", (SparseMatrix, 'Result'))
+
+    reg.add_module(GetColumnRange)
+    reg.add_input_port(GetColumnRange, "InputMatrix", (SparseMatrix, 'Input Matrix'))
+    reg.add_input_port(GetColumnRange, "StartIndex", (basic.Integer, 'Start Index'))
+    reg.add_input_port(GetColumnRange, "EndIndex", (basic.Integer, 'End Index'))
+    reg.add_output_port(GetColumnRange, "Output", (SparseMatrix, 'Result'))
+    
+    reg.add_module(ScalarMultiply)
+    reg.add_input_port(ScalarMultiply, "InputMatrix", (Matrix, 'Input Matrix'))
+    reg.add_input_port(ScalarMultiply, "Scalar", (basic.Float, 'Scalar'))
+    reg.add_output_port(ScalarMultiply, "OutputMatrix", (SparseMatrix, 'Result'))
+
+    reg.add_module(Transpose)
+    reg.add_input_port(Transpose, "InputMatrix", (Matrix, 'Input Matrix'))
+    reg.add_output_port(Transpose, "OutputMatrix", (Matrix, 'Output Matrix'))
+
+    reg.add_module(MatrixMultiply)
+    reg.add_input_port(MatrixMultiply, "InputMatrix1", (Matrix, 'Input Matrix 1'))
+    reg.add_input_port(MatrixMultiply, "InputMatrix2", (Matrix, 'Input Matrix 2'))
+    reg.add_output_port(MatrixMultiply, "OutputMatrix", (Matrix, 'Output Matrix'))
+
+    reg.add_module(ElementMultiply)
+    reg.add_input_port(ElementMultiply, "InputMatrix1", (Matrix, 'Input Matrix 1'))
+    reg.add_input_port(ElementMultiply, "InputMatrix2", (Matrix, 'Input Matrix 2'))
+    reg.add_output_port(ElementMultiply, "OutputMatrix", (SparseMatrix, 'Output Matrix'))
+
+    reg.add_module(ATan2)
+    reg.add_input_port(ATan2, "InputMatrix", (SparseMatrix, 'Complex Matrix'))
+    reg.add_input_port(ATan2, "RealMatrix", (SparseMatrix, 'Real Matrix'), True)
+    reg.add_input_port(ATan2, "ImaginaryMatrix", (SparseMatrix, 'Imaginary Matrix'), True)
+    reg.add_output_port(ATan2, "Output", (SparseMatrix, 'Output Matrix'))
+
+    reg.add_module(FFT)
+    reg.add_input_port(FFT, "Signals", (Matrix, 'Input Signal Matrix'))
+    reg.add_input_port(FFT, "FFT Samples", (basic.Integer, 'FFT Samples'))
+    reg.add_output_port(FFT, "FFT Output", (SparseMatrix, 'FFT Output'))
+
+    reg.add_module(FFT2)
+    reg.add_input_port(FFT2, "Signals", (Matrix, 'Input Signal Matrix'))
+    reg.add_output_port(FFT2, "FFT Output", (SparseMatrix, 'FFT Output'))
+
+    reg.add_module(WindowedFourierTransform)
+    reg.add_input_port(WindowedFourierTransform, "Signal", (Matrix, 'Input Signal'))
+    reg.add_input_port(WindowedFourierTransform, "Sampling Rate", (basic.Integer, 'Sampling Rate'))
+    reg.add_input_port(WindowedFourierTransform, "Window Size", (basic.Integer, 'Window Size'), True)
+    reg.add_input_port(WindowedFourierTransform, "Stride", (basic.Integer, 'Window Stride'), True)
+    reg.add_output_port(WindowedFourierTransform, "FFT Output", (SparseMatrix, 'FFT Output'))
+
+    reg.add_module(ShortTimeFourierTransform)
+    reg.add_input_port(ShortTimeFourierTransform, "Signal", (Matrix, 'Input Signal'))
+    reg.add_input_port(ShortTimeFourierTransform, "Sampling Rate", (basic.Integer, 'Sampling Rate'))
+    reg.add_input_port(ShortTimeFourierTransform, "Stride", (basic.Integer, 'Window Stride'))
+    reg.add_input_port(ShortTimeFourierTransform, "Window", (Matrix, 'Window Function'), True)
+    reg.add_input_port(ShortTimeFourierTransform, "WindowSize", (basic.Integer, 'Window Size'))
+    reg.add_output_port(ShortTimeFourierTransform, "FFT Output", (SparseMatrix, 'FFT Output'))
+    reg.add_output_port(ShortTimeFourierTransform, "Signal Output", (SparseMatrix, 'Signal Output'), True)
+    
+    reg.add_module(vtkDataSetToMatrix)
+    reg.add_input_port(vtkDataSetToMatrix, "vtkUnstructuredGrid", (reg.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkAlgorithmOutput').module, 'Input Unstructured Grid'))
+    reg.add_output_port(vtkDataSetToMatrix, "Output Matrix", (SparseMatrix, 'Output Matrix'))
+
+    reg.add_module(PhaseHistogramToVTKPoints)
+    reg.add_input_port(PhaseHistogramToVTKPoints, "FFT Input", (SparseMatrix, 'FFT Input'))
+    reg.add_input_port(PhaseHistogramToVTKPoints, "Num Bins", (basic.Integer, 'Number of Phase Bins'))
+    reg.add_output_port(PhaseHistogramToVTKPoints, "Num Slices", (basic.Integer, 'Number of Histogram Timeslices'), True)
+    reg.add_output_port(PhaseHistogramToVTKPoints, "Phase Histogram", (SparseMatrix, 'Phase Histogram'), True)
+    reg.add_output_port(PhaseHistogramToVTKPoints, "Phase Geometry", (reg.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', 'vtkAlgorithmOutput').module, 'Phase Geometry Connection'))
+
+def package_dependencies():
+    import core.packagemanager
+    manager = core.packagemanager.get_package_manager()
+    if manager.has_package('edu.utah.sci.vistrails.vtk'):
+        return ['edu.utah.sci.vistrails.vtk']
+    else:
+        return []
diff --git a/contrib/TetGenBridge/CreateTestSurf.py b/contrib/TetGenBridge/CreateTestSurf.py
new file mode 100644
index 0000000..6a5f356
--- /dev/null
+++ b/contrib/TetGenBridge/CreateTestSurf.py
@@ -0,0 +1,102 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import packages.TetGenBridge
+import TetGen
+import re
+import os
+
+# TetGen output on this mesh. -pqAz
+## Statistics:
+
+##   Input points: 149
+##   Input facets: 294
+##   Input holes: 0
+##   Input regions: 0
+
+##   Mesh points: 2184
+##   Mesh tetrahedra: 7462
+##   Mesh faces: 16726
+##   Mesh subfaces: 3604
+##   Mesh subsegments: 2037
+
+nodes_exp = re.compile('([\d\-\.]+)\s+([\d\-\.]+)\s+([\d\-\.]+)')
+def getTestNodes() :
+    nodes = []
+    p = "%spackages%sTetGenBridge%s" % (os.sep, os.sep, os.sep)
+    f = open('%s%spill.nodes' % (os.getcwd(), p))
+    for l in f.readlines() :
+        mo = nodes_exp.match(l)
+        if mo != None :
+            nodes.append((float(mo.group(1)), float(mo.group(2)),
+                          float(mo.group(3)))) 
+    return nodes
+
+tris_exp = re.compile('(\d+)\s+(\d+)\s+(\d+)')
+def getTestTris() :
+    tris = []
+    p = "%spackages%sTetGenBridge%s" % (os.sep, os.sep, os.sep)
+    f = open('%s%spill.tri' % (os.getcwd(), p))
+    for l in f.readlines() :
+        mo = tris_exp.match(l)
+        if mo != None :
+            tris.append((int(mo.group(1)), int(mo.group(2)),
+                         int(mo.group(3)))) 
+    return tris
+
+def addSurfaceInfo(tgio, marker = 0) :
+    
+    #iterate over nodes and add the points.    
+    nodes = getTestNodes()
+    sz = len(nodes)
+    tgio.pointlist = TetGen.allocate_array(sz * 3)
+    tgio.numberofpoints = sz
+    idx = 0
+    for n in nodes :
+        TetGen.set_val(tgio.pointlist, idx * 3, n[0])
+        TetGen.set_val(tgio.pointlist, idx * 3 + 1, n[1])
+        TetGen.set_val(tgio.pointlist, idx * 3 + 2, n[2])
+        idx = idx + 1
+
+    #iterate over faces and add the facets.    
+    tris = getTestTris()
+    fsz = len(tris)
+    tgio.facetlist = TetGen.allocate_facet_array(fsz)
+    tgio.numberoffacets = fsz;
+    idx = 0
+    for t in tris :
+        TetGen.add_tri(tgio.facetlist, idx, t[0], t[1], t[2])
+        idx = idx + 1
+    
+class CreateTestSurf(Module):
+    def compute(self):
+        out  = packages.TetGenBridge.tetgenio_wrapper()
+        addSurfaceInfo(out.data, 0)
+        self.setResult("tgio out", out)
+
+def initialize(reg):
+    reg.add_module(CreateTestSurf)
+    reg.add_output_port(CreateTestSurf, "tgio out",
+                      (packages.TetGenBridge.tetgenio_wrapper,
+                       'output test surface'))
diff --git a/contrib/TetGenBridge/Makefile b/contrib/TetGenBridge/Makefile
new file mode 100644
index 0000000..6ed25f4
--- /dev/null
+++ b/contrib/TetGenBridge/Makefile
@@ -0,0 +1,19 @@
+SRCS := tetgen_wrap.cc
+
+INCLUDES := -I/usr/include/python2.4 -I/scratch/mjc/tetgen-dev
+
+CC := g++
+CXXFLAGS := -fPIC
+LIBS := -lpython2.4 -ltet
+
+%.o :: %.cc
+	$(CC) $(CXXFLAGS) -c -o $@ $(INCLUDES) $<
+
+
+_TetGen.so: tetgen_wrap.o
+	$(CC) $(CXXFLAGS) -shared -o _TetGen.so tetgen_wrap.o $(INCLUDES) -L . $(LIBS)
+
+tetgen_wrap.cc:tetgen.i
+	swig -v -o tetgen_wrap.cc $(INCLUDES) -python -c++ tetgen.i
+
+
diff --git a/contrib/TetGenBridge/TetGen.py b/contrib/TetGenBridge/TetGen.py
new file mode 100644
index 0000000..8794b17
--- /dev/null
+++ b/contrib/TetGenBridge/TetGen.py
@@ -0,0 +1,313 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+# This file was created automatically by SWIG 1.3.27.
+# Don't modify this file, modify the SWIG interface instead.
+
+import _TetGen
+
+# This file is compatible with both classic and new-style classes.
+def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
+    if (name == "this"):
+        if isinstance(value, class_type):
+            self.__dict__[name] = value.this
+            if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown
+            del value.thisown
+            return
+    method = class_type.__swig_setmethods__.get(name,None)
+    if method: return method(self,value)
+    if (not static) or hasattr(self,name) or (name == "thisown"):
+        self.__dict__[name] = value
+    else:
+        raise AttributeError("You cannot add attributes to %s" % self)
+
+def _swig_setattr(self,class_type,name,value):
+    return _swig_setattr_nondynamic(self,class_type,name,value,0)
+
+def _swig_getattr(self,class_type,name):
+    method = class_type.__swig_getmethods__.get(name,None)
+    if method: return method(self)
+    raise AttributeError,name
+
+import types
+try:
+    _object = types.ObjectType
+    _newclass = 1
+except AttributeError:
+    class _object : pass
+    _newclass = 0
+del types
+
+
+class tetgenio(_object):
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, tetgenio, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, tetgenio, name)
+    def __repr__(self):
+        return "<%s.%s; proxy of C++ tetgenio instance at %s>" % (self.__class__.__module__, self.__class__.__name__, self.this,)
+    FILENAMESIZE = _TetGen.tetgenio_FILENAMESIZE
+    INPUTLINESIZE = _TetGen.tetgenio_INPUTLINESIZE
+    __swig_getmethods__["init"] = lambda x: _TetGen.tetgenio_init
+    if _newclass:init = staticmethod(_TetGen.tetgenio_init)
+    __swig_setmethods__["firstnumber"] = _TetGen.tetgenio_firstnumber_set
+    __swig_getmethods__["firstnumber"] = _TetGen.tetgenio_firstnumber_get
+    if _newclass:firstnumber = property(_TetGen.tetgenio_firstnumber_get, _TetGen.tetgenio_firstnumber_set)
+    __swig_setmethods__["mesh_dim"] = _TetGen.tetgenio_mesh_dim_set
+    __swig_getmethods__["mesh_dim"] = _TetGen.tetgenio_mesh_dim_get
+    if _newclass:mesh_dim = property(_TetGen.tetgenio_mesh_dim_get, _TetGen.tetgenio_mesh_dim_set)
+    __swig_setmethods__["pointlist"] = _TetGen.tetgenio_pointlist_set
+    __swig_getmethods__["pointlist"] = _TetGen.tetgenio_pointlist_get
+    if _newclass:pointlist = property(_TetGen.tetgenio_pointlist_get, _TetGen.tetgenio_pointlist_set)
+    __swig_setmethods__["pointattributelist"] = _TetGen.tetgenio_pointattributelist_set
+    __swig_getmethods__["pointattributelist"] = _TetGen.tetgenio_pointattributelist_get
+    if _newclass:pointattributelist = property(_TetGen.tetgenio_pointattributelist_get, _TetGen.tetgenio_pointattributelist_set)
+    __swig_setmethods__["addpointlist"] = _TetGen.tetgenio_addpointlist_set
+    __swig_getmethods__["addpointlist"] = _TetGen.tetgenio_addpointlist_get
+    if _newclass:addpointlist = property(_TetGen.tetgenio_addpointlist_get, _TetGen.tetgenio_addpointlist_set)
+    __swig_setmethods__["addpointattributelist"] = _TetGen.tetgenio_addpointattributelist_set
+    __swig_getmethods__["addpointattributelist"] = _TetGen.tetgenio_addpointattributelist_get
+    if _newclass:addpointattributelist = property(_TetGen.tetgenio_addpointattributelist_get, _TetGen.tetgenio_addpointattributelist_set)
+    __swig_setmethods__["pointmarkerlist"] = _TetGen.tetgenio_pointmarkerlist_set
+    __swig_getmethods__["pointmarkerlist"] = _TetGen.tetgenio_pointmarkerlist_get
+    if _newclass:pointmarkerlist = property(_TetGen.tetgenio_pointmarkerlist_get, _TetGen.tetgenio_pointmarkerlist_set)
+    __swig_setmethods__["numberofpoints"] = _TetGen.tetgenio_numberofpoints_set
+    __swig_getmethods__["numberofpoints"] = _TetGen.tetgenio_numberofpoints_get
+    if _newclass:numberofpoints = property(_TetGen.tetgenio_numberofpoints_get, _TetGen.tetgenio_numberofpoints_set)
+    __swig_setmethods__["numberofpointattributes"] = _TetGen.tetgenio_numberofpointattributes_set
+    __swig_getmethods__["numberofpointattributes"] = _TetGen.tetgenio_numberofpointattributes_get
+    if _newclass:numberofpointattributes = property(_TetGen.tetgenio_numberofpointattributes_get, _TetGen.tetgenio_numberofpointattributes_set)
+    __swig_setmethods__["numberofaddpoints"] = _TetGen.tetgenio_numberofaddpoints_set
+    __swig_getmethods__["numberofaddpoints"] = _TetGen.tetgenio_numberofaddpoints_get
+    if _newclass:numberofaddpoints = property(_TetGen.tetgenio_numberofaddpoints_get, _TetGen.tetgenio_numberofaddpoints_set)
+    __swig_setmethods__["tetrahedronlist"] = _TetGen.tetgenio_tetrahedronlist_set
+    __swig_getmethods__["tetrahedronlist"] = _TetGen.tetgenio_tetrahedronlist_get
+    if _newclass:tetrahedronlist = property(_TetGen.tetgenio_tetrahedronlist_get, _TetGen.tetgenio_tetrahedronlist_set)
+    __swig_setmethods__["tetrahedronattributelist"] = _TetGen.tetgenio_tetrahedronattributelist_set
+    __swig_getmethods__["tetrahedronattributelist"] = _TetGen.tetgenio_tetrahedronattributelist_get
+    if _newclass:tetrahedronattributelist = property(_TetGen.tetgenio_tetrahedronattributelist_get, _TetGen.tetgenio_tetrahedronattributelist_set)
+    __swig_setmethods__["tetrahedronvolumelist"] = _TetGen.tetgenio_tetrahedronvolumelist_set
+    __swig_getmethods__["tetrahedronvolumelist"] = _TetGen.tetgenio_tetrahedronvolumelist_get
+    if _newclass:tetrahedronvolumelist = property(_TetGen.tetgenio_tetrahedronvolumelist_get, _TetGen.tetgenio_tetrahedronvolumelist_set)
+    __swig_setmethods__["neighborlist"] = _TetGen.tetgenio_neighborlist_set
+    __swig_getmethods__["neighborlist"] = _TetGen.tetgenio_neighborlist_get
+    if _newclass:neighborlist = property(_TetGen.tetgenio_neighborlist_get, _TetGen.tetgenio_neighborlist_set)
+    __swig_setmethods__["numberoftetrahedra"] = _TetGen.tetgenio_numberoftetrahedra_set
+    __swig_getmethods__["numberoftetrahedra"] = _TetGen.tetgenio_numberoftetrahedra_get
+    if _newclass:numberoftetrahedra = property(_TetGen.tetgenio_numberoftetrahedra_get, _TetGen.tetgenio_numberoftetrahedra_set)
+    __swig_setmethods__["numberofcorners"] = _TetGen.tetgenio_numberofcorners_set
+    __swig_getmethods__["numberofcorners"] = _TetGen.tetgenio_numberofcorners_get
+    if _newclass:numberofcorners = property(_TetGen.tetgenio_numberofcorners_get, _TetGen.tetgenio_numberofcorners_set)
+    __swig_setmethods__["numberoftetrahedronattributes"] = _TetGen.tetgenio_numberoftetrahedronattributes_set
+    __swig_getmethods__["numberoftetrahedronattributes"] = _TetGen.tetgenio_numberoftetrahedronattributes_get
+    if _newclass:numberoftetrahedronattributes = property(_TetGen.tetgenio_numberoftetrahedronattributes_get, _TetGen.tetgenio_numberoftetrahedronattributes_set)
+    __swig_setmethods__["facetlist"] = _TetGen.tetgenio_facetlist_set
+    __swig_getmethods__["facetlist"] = _TetGen.tetgenio_facetlist_get
+    if _newclass:facetlist = property(_TetGen.tetgenio_facetlist_get, _TetGen.tetgenio_facetlist_set)
+    __swig_setmethods__["facetmarkerlist"] = _TetGen.tetgenio_facetmarkerlist_set
+    __swig_getmethods__["facetmarkerlist"] = _TetGen.tetgenio_facetmarkerlist_get
+    if _newclass:facetmarkerlist = property(_TetGen.tetgenio_facetmarkerlist_get, _TetGen.tetgenio_facetmarkerlist_set)
+    __swig_setmethods__["numberoffacets"] = _TetGen.tetgenio_numberoffacets_set
+    __swig_getmethods__["numberoffacets"] = _TetGen.tetgenio_numberoffacets_get
+    if _newclass:numberoffacets = property(_TetGen.tetgenio_numberoffacets_get, _TetGen.tetgenio_numberoffacets_set)
+    __swig_setmethods__["holelist"] = _TetGen.tetgenio_holelist_set
+    __swig_getmethods__["holelist"] = _TetGen.tetgenio_holelist_get
+    if _newclass:holelist = property(_TetGen.tetgenio_holelist_get, _TetGen.tetgenio_holelist_set)
+    __swig_setmethods__["numberofholes"] = _TetGen.tetgenio_numberofholes_set
+    __swig_getmethods__["numberofholes"] = _TetGen.tetgenio_numberofholes_get
+    if _newclass:numberofholes = property(_TetGen.tetgenio_numberofholes_get, _TetGen.tetgenio_numberofholes_set)
+    __swig_setmethods__["regionlist"] = _TetGen.tetgenio_regionlist_set
+    __swig_getmethods__["regionlist"] = _TetGen.tetgenio_regionlist_get
+    if _newclass:regionlist = property(_TetGen.tetgenio_regionlist_get, _TetGen.tetgenio_regionlist_set)
+    __swig_setmethods__["numberofregions"] = _TetGen.tetgenio_numberofregions_set
+    __swig_getmethods__["numberofregions"] = _TetGen.tetgenio_numberofregions_get
+    if _newclass:numberofregions = property(_TetGen.tetgenio_numberofregions_get, _TetGen.tetgenio_numberofregions_set)
+    __swig_setmethods__["facetconstraintlist"] = _TetGen.tetgenio_facetconstraintlist_set
+    __swig_getmethods__["facetconstraintlist"] = _TetGen.tetgenio_facetconstraintlist_get
+    if _newclass:facetconstraintlist = property(_TetGen.tetgenio_facetconstraintlist_get, _TetGen.tetgenio_facetconstraintlist_set)
+    __swig_setmethods__["numberoffacetconstraints"] = _TetGen.tetgenio_numberoffacetconstraints_set
+    __swig_getmethods__["numberoffacetconstraints"] = _TetGen.tetgenio_numberoffacetconstraints_get
+    if _newclass:numberoffacetconstraints = property(_TetGen.tetgenio_numberoffacetconstraints_get, _TetGen.tetgenio_numberoffacetconstraints_set)
+    __swig_setmethods__["segmentconstraintlist"] = _TetGen.tetgenio_segmentconstraintlist_set
+    __swig_getmethods__["segmentconstraintlist"] = _TetGen.tetgenio_segmentconstraintlist_get
+    if _newclass:segmentconstraintlist = property(_TetGen.tetgenio_segmentconstraintlist_get, _TetGen.tetgenio_segmentconstraintlist_set)
+    __swig_setmethods__["numberofsegmentconstraints"] = _TetGen.tetgenio_numberofsegmentconstraints_set
+    __swig_getmethods__["numberofsegmentconstraints"] = _TetGen.tetgenio_numberofsegmentconstraints_get
+    if _newclass:numberofsegmentconstraints = property(_TetGen.tetgenio_numberofsegmentconstraints_get, _TetGen.tetgenio_numberofsegmentconstraints_set)
+    __swig_setmethods__["nodeconstraintlist"] = _TetGen.tetgenio_nodeconstraintlist_set
+    __swig_getmethods__["nodeconstraintlist"] = _TetGen.tetgenio_nodeconstraintlist_get
+    if _newclass:nodeconstraintlist = property(_TetGen.tetgenio_nodeconstraintlist_get, _TetGen.tetgenio_nodeconstraintlist_set)
+    __swig_setmethods__["numberofnodeconstraints"] = _TetGen.tetgenio_numberofnodeconstraints_set
+    __swig_getmethods__["numberofnodeconstraints"] = _TetGen.tetgenio_numberofnodeconstraints_get
+    if _newclass:numberofnodeconstraints = property(_TetGen.tetgenio_numberofnodeconstraints_get, _TetGen.tetgenio_numberofnodeconstraints_set)
+    __swig_setmethods__["pbcgrouplist"] = _TetGen.tetgenio_pbcgrouplist_set
+    __swig_getmethods__["pbcgrouplist"] = _TetGen.tetgenio_pbcgrouplist_get
+    if _newclass:pbcgrouplist = property(_TetGen.tetgenio_pbcgrouplist_get, _TetGen.tetgenio_pbcgrouplist_set)
+    __swig_setmethods__["numberofpbcgroups"] = _TetGen.tetgenio_numberofpbcgroups_set
+    __swig_getmethods__["numberofpbcgroups"] = _TetGen.tetgenio_numberofpbcgroups_get
+    if _newclass:numberofpbcgroups = property(_TetGen.tetgenio_numberofpbcgroups_get, _TetGen.tetgenio_numberofpbcgroups_set)
+    __swig_setmethods__["trifacelist"] = _TetGen.tetgenio_trifacelist_set
+    __swig_getmethods__["trifacelist"] = _TetGen.tetgenio_trifacelist_get
+    if _newclass:trifacelist = property(_TetGen.tetgenio_trifacelist_get, _TetGen.tetgenio_trifacelist_set)
+    __swig_setmethods__["adjtetlist"] = _TetGen.tetgenio_adjtetlist_set
+    __swig_getmethods__["adjtetlist"] = _TetGen.tetgenio_adjtetlist_get
+    if _newclass:adjtetlist = property(_TetGen.tetgenio_adjtetlist_get, _TetGen.tetgenio_adjtetlist_set)
+    __swig_setmethods__["trifacemarkerlist"] = _TetGen.tetgenio_trifacemarkerlist_set
+    __swig_getmethods__["trifacemarkerlist"] = _TetGen.tetgenio_trifacemarkerlist_get
+    if _newclass:trifacemarkerlist = property(_TetGen.tetgenio_trifacemarkerlist_get, _TetGen.tetgenio_trifacemarkerlist_set)
+    __swig_setmethods__["numberoftrifaces"] = _TetGen.tetgenio_numberoftrifaces_set
+    __swig_getmethods__["numberoftrifaces"] = _TetGen.tetgenio_numberoftrifaces_get
+    if _newclass:numberoftrifaces = property(_TetGen.tetgenio_numberoftrifaces_get, _TetGen.tetgenio_numberoftrifaces_set)
+    __swig_setmethods__["edgelist"] = _TetGen.tetgenio_edgelist_set
+    __swig_getmethods__["edgelist"] = _TetGen.tetgenio_edgelist_get
+    if _newclass:edgelist = property(_TetGen.tetgenio_edgelist_get, _TetGen.tetgenio_edgelist_set)
+    __swig_setmethods__["edgemarkerlist"] = _TetGen.tetgenio_edgemarkerlist_set
+    __swig_getmethods__["edgemarkerlist"] = _TetGen.tetgenio_edgemarkerlist_get
+    if _newclass:edgemarkerlist = property(_TetGen.tetgenio_edgemarkerlist_get, _TetGen.tetgenio_edgemarkerlist_set)
+    __swig_setmethods__["numberofedges"] = _TetGen.tetgenio_numberofedges_set
+    __swig_getmethods__["numberofedges"] = _TetGen.tetgenio_numberofedges_get
+    if _newclass:numberofedges = property(_TetGen.tetgenio_numberofedges_get, _TetGen.tetgenio_numberofedges_set)
+    def initialize(*args): return _TetGen.tetgenio_initialize(*args)
+    def deinitialize(*args): return _TetGen.tetgenio_deinitialize(*args)
+    def load_node_call(*args): return _TetGen.tetgenio_load_node_call(*args)
+    def load_node(*args): return _TetGen.tetgenio_load_node(*args)
+    def load_addnodes(*args): return _TetGen.tetgenio_load_addnodes(*args)
+    def load_pbc(*args): return _TetGen.tetgenio_load_pbc(*args)
+    def load_var(*args): return _TetGen.tetgenio_load_var(*args)
+    def load_mtr(*args): return _TetGen.tetgenio_load_mtr(*args)
+    def load_poly(*args): return _TetGen.tetgenio_load_poly(*args)
+    def load_off(*args): return _TetGen.tetgenio_load_off(*args)
+    def load_ply(*args): return _TetGen.tetgenio_load_ply(*args)
+    def load_stl(*args): return _TetGen.tetgenio_load_stl(*args)
+    def load_medit(*args): return _TetGen.tetgenio_load_medit(*args)
+    def load_plc(*args): return _TetGen.tetgenio_load_plc(*args)
+    def load_tetmesh(*args): return _TetGen.tetgenio_load_tetmesh(*args)
+    def save_nodes(*args): return _TetGen.tetgenio_save_nodes(*args)
+    def save_elements(*args): return _TetGen.tetgenio_save_elements(*args)
+    def save_faces(*args): return _TetGen.tetgenio_save_faces(*args)
+    def save_edges(*args): return _TetGen.tetgenio_save_edges(*args)
+    def save_neighbors(*args): return _TetGen.tetgenio_save_neighbors(*args)
+    def save_poly(*args): return _TetGen.tetgenio_save_poly(*args)
+    def readline(*args): return _TetGen.tetgenio_readline(*args)
+    def findnextfield(*args): return _TetGen.tetgenio_findnextfield(*args)
+    def readnumberline(*args): return _TetGen.tetgenio_readnumberline(*args)
+    def findnextnumber(*args): return _TetGen.tetgenio_findnextnumber(*args)
+    def __init__(self, *args):
+        _swig_setattr(self, tetgenio, 'this', _TetGen.new_tetgenio(*args))
+        _swig_setattr(self, tetgenio, 'thisown', 1)
+    def __del__(self, destroy=_TetGen.delete_tetgenio):
+        try:
+            if self.thisown: destroy(self)
+        except: pass
+
+
+class tetgenioPtr(tetgenio):
+    def __init__(self, this):
+        _swig_setattr(self, tetgenio, 'this', this)
+        if not hasattr(self,"thisown"): _swig_setattr(self, tetgenio, 'thisown', 0)
+        self.__class__ = tetgenio
+_TetGen.tetgenio_swigregister(tetgenioPtr)
+
+tetgenio_init = _TetGen.tetgenio_init
+
+class polygon(_object):
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, polygon, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, polygon, name)
+    def __repr__(self):
+        return "<%s.%s; proxy of C++ tetgenio::polygon instance at %s>" % (self.__class__.__module__, self.__class__.__name__, self.this,)
+    def __init__(self, *args):
+        _swig_setattr(self, polygon, 'this', _TetGen.new_polygon(*args))
+        _swig_setattr(self, polygon, 'thisown', 1)
+    def __del__(self, destroy=_TetGen.delete_polygon):
+        try:
+            if self.thisown: destroy(self)
+        except: pass
+
+
+class polygonPtr(polygon):
+    def __init__(self, this):
+        _swig_setattr(self, polygon, 'this', this)
+        if not hasattr(self,"thisown"): _swig_setattr(self, polygon, 'thisown', 0)
+        self.__class__ = polygon
+_TetGen.polygon_swigregister(polygonPtr)
+
+class facet(_object):
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, facet, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, facet, name)
+    def __repr__(self):
+        return "<%s.%s; proxy of C++ tetgenio::facet instance at %s>" % (self.__class__.__module__, self.__class__.__name__, self.this,)
+    def __init__(self, *args):
+        _swig_setattr(self, facet, 'this', _TetGen.new_facet(*args))
+        _swig_setattr(self, facet, 'thisown', 1)
+    def __del__(self, destroy=_TetGen.delete_facet):
+        try:
+            if self.thisown: destroy(self)
+        except: pass
+
+
+class facetPtr(facet):
+    def __init__(self, this):
+        _swig_setattr(self, facet, 'this', this)
+        if not hasattr(self,"thisown"): _swig_setattr(self, facet, 'thisown', 0)
+        self.__class__ = facet
+_TetGen.facet_swigregister(facetPtr)
+
+class pbcgroup(_object):
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, pbcgroup, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, pbcgroup, name)
+    def __repr__(self):
+        return "<%s.%s; proxy of C++ tetgenio::pbcgroup instance at %s>" % (self.__class__.__module__, self.__class__.__name__, self.this,)
+    def __init__(self, *args):
+        _swig_setattr(self, pbcgroup, 'this', _TetGen.new_pbcgroup(*args))
+        _swig_setattr(self, pbcgroup, 'thisown', 1)
+    def __del__(self, destroy=_TetGen.delete_pbcgroup):
+        try:
+            if self.thisown: destroy(self)
+        except: pass
+
+
+class pbcgroupPtr(pbcgroup):
+    def __init__(self, this):
+        _swig_setattr(self, pbcgroup, 'this', this)
+        if not hasattr(self,"thisown"): _swig_setattr(self, pbcgroup, 'thisown', 0)
+        self.__class__ = pbcgroup
+_TetGen.pbcgroup_swigregister(pbcgroupPtr)
+
+
+tetrahedralize = _TetGen.tetrahedralize
+
+allocate_array = _TetGen.allocate_array
+
+set_val = _TetGen.set_val
+
+get_val = _TetGen.get_val
+
+allocate_facet_array = _TetGen.allocate_facet_array
+
+add_tri = _TetGen.add_tri
+
+
diff --git a/contrib/TetGenBridge/__init__.py b/contrib/TetGenBridge/__init__.py
new file mode 100644
index 0000000..e9abd51
--- /dev/null
+++ b/contrib/TetGenBridge/__init__.py
@@ -0,0 +1,90 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""The TetGenBridge package wraps the TetGen library, exposing the tetrahedralize function as well as the input/output classes."""
+
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import TetGen
+import CreateTestSurf
+
+identifier = 'edu.utah.sci.vistrails.tetget'
+version = '0.9.0'
+name = 'tetgen'
+
+
+# The port that wraps a tetgenio class.
+class tetgenio_wrapper(Module):
+    def __init__(self) :
+        self.data = TetGen.tetgenio()
+    
+
+class tetrahedralize(Module):
+    """tetrahedralize corresponds to the TetGen function of the same name"""
+
+
+    def __init__(self):
+        Module.__init__(self)
+
+
+    def compute(self):
+        switches = None
+        if self.hasInputFromPort("switches") :
+            switches = self.getInputFromPort("switches")
+            print switches
+        if self.hasInputFromPort("tgio in") :
+            tgio_in = self.getInputFromPort("tgio in").data
+
+        print "input has %d nodes!" % tgio_in.numberofpoints
+        tgio_in.save_nodes("/tmp/tgIN.vt")
+        tgio_in.save_poly("/tmp/tgIN.vt")
+        out  = tetgenio_wrapper()
+        TetGen.tetrahedralize(switches, tgio_in, out.data)
+        print "Done making tets"
+
+        self.setResult("tgio out", out)
+
+      
+
+
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry
+
+    #calls the lib with function of the same name.
+    reg.add_module(tetrahedralize)
+
+    # command line switches that tell tetrahedralize what to do.
+    reg.add_input_port(tetrahedralize, "switches",
+                     (core.modules.basic_modules.String, 'tetgen options'))
+    # input mesh information.
+    reg.add_input_port(tetrahedralize, "tgio in",
+                     (tetgenio_wrapper, 'input data'))
+    # output mesh information.
+    reg.add_output_port(tetrahedralize, "tgio out",
+                      (tetgenio_wrapper, 'output data'))
+
+    #holds the tetgenio class, and acts as a port.
+    reg.add_module(tetgenio_wrapper)
+
+    # get support and testing modules registered.
+    CreateTestSurf.initialize(reg)
+
diff --git a/contrib/TetGenBridge/pill.nodes b/contrib/TetGenBridge/pill.nodes
new file mode 100644
index 0000000..c5f5a68
--- /dev/null
+++ b/contrib/TetGenBridge/pill.nodes
@@ -0,0 +1,150 @@
+149
+0.033647 -0.306675 3.748440
+-0.347509 -0.075738 3.535168
+0.092023 -0.614814 3.779968
+0.021385 -2.885010 0.977596
+-0.112491 -2.852496 1.096028
+-0.056638 -2.866179 0.515760
+-0.503132 -2.472678 0.886320
+-0.570188 -2.306610 1.016956
+-0.586178 -2.308524 0.017460
+-0.301889 1.910949 -2.821956
+0.026409 2.723172 -1.229416
+-0.041798 1.964835 -2.904396
+0.235241 1.313400 3.407456
+-0.020073 2.394933 2.122384
+-0.302936 1.265127 3.373072
+-0.245984 1.872435 2.512964
+-0.210951 2.390691 1.760696
+-0.524534 1.672173 2.541640
+-0.442159 2.569212 0.792744
+-0.007979 2.949366 0.036412
+-0.488698 2.325690 -1.341472
+0.637188 1.756113 1.543692
+0.643783 2.118804 1.000968
+0.417678 2.189415 2.027796
+0.252642 0.061152 -3.837976
+0.401088 -0.941775 -3.308704
+0.134762 -0.928620 -3.737112
+-0.711742 1.731426 -0.562400
+-0.618031 -1.548495 -2.366948
+-0.347366 -2.194776 -1.896868
+-0.612231 -2.235354 -0.725212
+0.572145 -1.887516 -2.036456
+0.745612 -1.357884 -1.878496
+0.649281 -2.099940 -0.895152
+-0.337037 -1.593987 3.065784
+0.074563 -1.640271 3.317000
+-0.281961 -1.323942 3.246140
+-0.146002 -1.326615 -3.412476
+-0.165076 -1.883532 -2.705452
+-0.306512 -1.491813 -2.993896
+0.020136 -2.161710 2.709012
+-0.489976 -2.243619 1.636224
+0.284432 2.442969 1.844652
+-0.066112 2.724162 1.218828
+0.135661 2.443317 1.887448
+0.134471 2.926203 0.385164
+0.051413 -1.948131 2.941104
+-0.991643 -0.293256 0.280112
+-0.845646 -1.203078 1.264624
+-0.943756 0.206325 1.250476
+0.788734 -1.553430 -0.459912
+0.640943 -2.188170 0.116052
+0.328358 1.404426 3.190840
+0.311628 2.189739 2.399064
+0.078507 0.405717 3.669368
+-0.406630 1.108497 -3.283724
+-0.462487 1.065186 -3.209104
+0.757712 0.363909 -2.180700
+0.509538 0.514614 -3.372692
+0.629818 1.439865 -2.343808
+0.938141 0.705099 -0.924884
+0.847130 1.072203 -0.892852
+0.832034 1.334268 0.360916
+0.953819 0.182691 -0.453084
+0.900561 -0.730938 -1.147268
+0.909254 0.021477 1.332048
+0.894119 0.524982 0.917536
+0.859944 1.065861 1.453580
+0.072408 -2.553180 1.854312
+-0.971071 -0.338877 -0.813692
+-0.982599 -0.013476 -0.438032
+-0.922431 0.217410 -1.428816
+-0.301798 -2.768169 0.602832
+-0.233951 -2.786538 0.838784
+0.220680 -2.769438 -1.055128
+0.278649 -2.745525 -0.099352
+-0.209502 0.347388 -3.556680
+-0.304391 -0.668637 -3.454268
+-0.485787 -0.508335 -3.386584
+-0.880478 1.168008 -0.597384
+-0.852596 1.179015 -0.796288
+-0.893187 0.458553 -1.359004
+0.539223 -0.414942 -3.133860
+0.541222 1.678707 1.848644
+0.844172 0.822438 -1.569772
+0.791937 0.829539 -1.815540
+0.702219 1.616712 -1.745900
+0.786245 -0.454056 -2.003272
+0.854364 -0.697968 -1.578756
+0.709524 -1.070706 -2.390708
+0.847056 -0.797703 -1.550640
+0.623879 -0.843942 -2.831528
+-0.924460 1.128144 0.201020
+-0.484701 2.386260 1.167624
+-0.556188 2.165889 0.787772
+-0.614616 1.827243 1.600812
+0.425120 2.042298 -2.363344
+0.586647 0.180975 -3.115508
+0.007301 1.722885 -3.253400
+-0.269774 0.969108 -3.365348
+0.720678 -1.888437 0.818816
+0.626801 -1.465182 2.371240
+0.522424 -0.210393 3.393136
+0.442195 -0.874248 3.237860
+0.755334 -0.866100 2.246260
+-0.709054 -1.841262 1.158012
+-0.836380 -1.581552 0.439960
+-0.584255 0.320208 -3.105980
+0.558459 1.375503 1.836948
+-0.337053 -2.676717 0.016568
+0.418370 -2.390439 -1.579916
+0.161297 -2.369046 -2.258808
+-0.733779 -1.508079 -1.580732
+0.335703 1.129452 -3.371780
+-0.610116 -1.853631 1.812860
+-0.330328 -1.796346 2.745868
+0.451876 -1.652637 2.765888
+-0.744153 -1.489014 1.735160
+-0.636224 -1.239411 -2.476316
+0.508024 -0.797406 -3.097188
+-0.986026 -0.181818 -0.337200
+0.773520 1.519650 0.382688
+0.585568 2.377557 0.586440
+0.193621 -1.782402 -3.080188
+-0.706445 0.066513 -2.487392
+-0.016795 -2.830479 -1.287572
+0.156494 -2.740728 -1.255484
+0.700143 0.339690 2.424976
+0.918999 -0.719838 1.145084
+0.478251 -2.369100 1.506828
+0.838386 0.258438 1.949544
+0.382820 2.363100 -1.709844
+0.264992 -0.980940 3.385348
+-0.713670 1.119309 2.298100
+0.429838 -2.178912 1.944372
+0.372454 2.616471 -0.233160
+0.427271 2.372673 -1.077952
+0.533478 -1.502943 -2.593560
+-0.727316 0.083877 2.581624
+-0.598577 2.023176 -1.645036
+0.720693 1.742499 -0.045540
+0.382893 2.556219 0.614812
+0.773121 -0.039462 2.169820
+-0.546753 2.201277 0.690560
+-0.645896 -1.471629 2.062720
+-0.556976 0.475389 2.863348
+-0.831044 1.370163 -0.748872
+0.889934 -1.112343 0.023912
+0.920718 -0.648489 0.324428
diff --git a/contrib/TetGenBridge/pill.tri b/contrib/TetGenBridge/pill.tri
new file mode 100644
index 0000000..ebd3206
--- /dev/null
+++ b/contrib/TetGenBridge/pill.tri
@@ -0,0 +1,295 @@
+294
+0 1 2
+3 4 5
+6 7 8
+9 10 11
+12 13 14
+15 14 13
+13 16 17
+15 13 17
+18 19 20
+21 22 23
+24 25 26
+18 20 27
+28 29 30
+31 32 33
+34 35 36
+37 38 39
+4 40 41
+42 43 44
+45 43 42
+46 35 40
+34 40 35
+47 48 49
+33 50 51
+12 52 53
+34 36 1
+0 54 1
+9 55 56
+57 58 59
+60 61 62
+63 64 60
+65 66 67
+4 68 40
+28 38 29
+28 39 38
+64 50 32
+69 70 71
+72 5 4
+73 72 4
+3 5 74
+3 74 75
+76 77 78
+79 80 81
+18 16 43
+24 58 82
+21 23 83
+59 84 85
+59 86 84
+87 88 89
+90 89 88
+90 88 64
+87 89 91
+92 93 94
+92 95 93
+59 96 86
+57 87 97
+98 76 99
+14 1 54
+60 64 88
+100 51 50
+37 77 26
+20 10 9
+101 102 103
+104 102 101
+105 106 7
+8 7 106
+71 81 56
+107 71 56
+108 67 83
+21 83 67
+53 23 42
+60 86 61
+60 84 86
+72 8 109
+72 6 8
+31 110 111
+57 59 85
+57 97 58
+28 30 112
+41 7 6
+24 98 113
+58 97 82
+34 114 41
+115 34 41
+53 42 44
+46 116 35
+114 117 105
+28 118 78
+28 78 39
+119 82 91
+69 47 120
+101 103 116
+22 67 62
+121 22 62
+31 33 110
+41 114 7
+122 23 22
+37 123 38
+47 106 48
+124 78 118
+123 111 38
+92 47 49
+12 14 54
+125 126 74
+126 111 74
+110 74 111
+127 67 108
+101 100 128
+104 101 128
+101 129 100
+69 118 112
+52 83 23
+0 2 54
+57 88 87
+21 67 22
+65 67 130
+90 32 89
+75 51 129
+96 11 131
+117 106 105
+48 106 117
+30 8 106
+103 2 132
+95 133 17
+134 68 129
+63 60 66
+135 122 136
+15 17 14
+25 91 137
+119 91 25
+26 77 76
+96 131 86
+55 76 78
+138 34 1
+92 133 95
+69 120 70
+115 41 40
+92 70 47
+107 78 124
+40 68 134
+33 32 50
+139 56 81
+82 97 91
+87 91 97
+12 53 13
+33 51 75
+69 71 118
+36 2 1
+24 113 58
+122 22 140
+138 133 49
+127 130 67
+55 78 56
+107 56 78
+108 83 52
+122 42 23
+122 141 42
+127 102 142
+45 19 43
+92 79 70
+69 106 47
+134 129 116
+101 116 129
+37 26 123
+30 109 8
+18 143 94
+18 94 93
+138 117 144
+33 75 74
+110 33 74
+63 66 65
+59 113 96
+140 62 61
+60 62 67
+60 67 66
+13 44 43
+96 113 98
+139 27 20
+125 30 29
+125 109 30
+45 141 122
+135 45 122
+92 49 133
+36 35 2
+114 105 7
+138 1 145
+135 136 131
+131 11 10
+123 26 25
+104 130 142
+40 134 116
+46 40 116
+104 142 102
+136 86 131
+73 6 72
+3 75 129
+146 80 79
+139 146 27
+147 64 148
+18 27 143
+53 52 23
+138 48 117
+60 88 84
+57 84 88
+140 61 86
+55 99 76
+45 10 19
+121 140 22
+45 131 10
+135 131 45
+121 62 140
+125 72 109
+125 5 72
+93 95 17
+93 17 16
+90 64 32
+147 50 64
+132 2 35
+102 54 2
+127 142 130
+145 1 14
+13 53 44
+37 78 77
+37 39 78
+34 144 117
+34 117 114
+103 35 116
+103 132 35
+9 11 98
+96 98 11
+63 148 64
+69 112 106
+127 108 52
+128 65 130
+104 128 130
+125 74 5
+125 111 126
+79 71 70
+79 81 71
+92 146 79
+127 52 102
+100 129 51
+100 147 128
+30 106 112
+123 25 137
+128 147 148
+3 68 4
+73 4 41
+12 102 52
+119 25 82
+63 65 128
+63 128 148
+3 129 68
+139 20 9
+12 54 102
+138 14 133
+138 145 14
+17 133 14
+18 93 16
+20 19 10
+125 38 111
+13 43 16
+92 27 146
+28 112 118
+138 49 48
+103 102 2
+89 137 91
+124 118 71
+73 41 6
+138 144 34
+107 124 71
+122 140 86
+136 122 86
+57 85 84
+31 89 32
+31 137 89
+31 111 123
+31 123 137
+55 98 99
+9 98 55
+59 58 113
+115 40 34
+18 43 19
+139 9 56
+125 29 38
+24 82 25
+24 26 76
+24 76 98
+47 70 120
+100 50 147
+146 81 80
+139 81 146
+45 42 141
+92 94 143
+92 143 27
diff --git a/contrib/TetGenBridge/tetgen.i b/contrib/TetGenBridge/tetgen.i
new file mode 100644
index 0000000..72da66a
--- /dev/null
+++ b/contrib/TetGenBridge/tetgen.i
@@ -0,0 +1,284 @@
+%module TetGen
+%{
+#include <tetgen.h>
+%}
+
+class tetgenio {
+
+  public:
+
+    // Maximum number of characters in a file name (including the null).
+    enum {FILENAMESIZE = 1024};
+
+    // Maxi. numbers of chars in a line read from a file (incl. the null).
+    enum {INPUTLINESIZE = 1024};
+
+    // The polygon data structure.  A "polygon" is a planar polygon. It can
+    //   be arbitrary shaped (convex or non-convex) and bounded by non-
+    //   crossing segments, i.e., the number of vertices it has indictes the
+    //   same number of edges.
+    // 'vertexlist' is a list of vertex indices (integers), its length is
+    //   indicated by 'numberofvertices'.  The vertex indices are odered in
+    //   either counterclockwise or clockwise way.
+  
+    class polygon;
+
+    static void init(polygon* p) {
+      p->vertexlist = (int *) NULL;
+      p->numberofvertices = 0;
+    }
+
+    // The facet data structure.  A "facet" is a planar facet.  It is used
+    //   to represent a planar straight line graph (PSLG) in two dimension.
+    //   A PSLG contains a list of polygons. It also may conatin holes in it,
+    //   indicated by a list of hole points (their coordinates).
+    class facet;
+
+    static void init(facet* f) {
+      f->polygonlist = (polygon *) NULL;
+      f->numberofpolygons = 0;
+      f->holelist = (REAL *) NULL;
+      f->numberofholes = 0;
+    }
+
+    // The periodic boundary condition group data structure.  A "pbcgroup"
+    //   contains the definition of a pbc and the list of pbc point pairs.
+    //   'fmark1' and 'fmark2' are the facetmarkers of the two pbc facets f1
+    //   and f2, respectively. 'transmat' is the transformation matrix which
+    //   maps a point in f1 into f2.  An array of pbc point pairs are saved
+    //   in 'pointpairlist'. The first point pair is at indices [0] and [1],
+    //   followed by remaining pairs. Two integers per pair.
+    class pbcgroup;
+  public:
+
+    // Items are numbered starting from 'firstnumber' (0 or 1), default is 0.
+    int firstnumber; 
+
+    // Dimension of the mesh (2 or 3), default is 3.
+    int mesh_dim;
+
+    // `pointlist':  An array of point coordinates.  The first point's x
+    //   coordinate is at index [0] and its y coordinate at index [1], its
+    //   z coordinate is at index [2], followed by the coordinates of the
+    //   remaining points.  Each point occupies three REALs. 
+    // `pointattributelist':  An array of point attributes.  Each point's
+    //   attributes occupy `numberofpointattributes' REALs. 
+    // 'addpointlist':  An array of additional point coordinates.
+    // 'addpointattributelist':  An array of attributes for addition points.
+    // `pointmarkerlist':  An array of point markers; one int per point.
+    REAL *pointlist;
+    REAL *pointattributelist;
+    REAL *addpointlist;
+    REAL *addpointattributelist;
+    int *pointmarkerlist;
+    int numberofpoints;
+    int numberofpointattributes;
+    int numberofaddpoints;
+ 
+    // `elementlist':  An array of element (triangle or tetrahedron) corners. 
+    //   The first element's first corner is at index [0], followed by its
+    //   other corners in counterclockwise order, followed by any other
+    //   nodes if the element represents a nonlinear element.  Each element
+    //   occupies `numberofcorners' ints.
+    // `elementattributelist':  An array of element attributes.  Each
+    //   element's attributes occupy `numberofelementattributes' REALs.
+    // `elementconstraintlist':  An array of constraints, i.e. triangle's
+    //   area or tetrahedron's volume; one REAL per element.  Input only.
+    // `neighborlist':  An array of element neighbors; 3 or 4 ints per
+    //   element.  Output only.
+    int *tetrahedronlist;
+    REAL *tetrahedronattributelist;
+    REAL *tetrahedronvolumelist;
+    int *neighborlist;
+    int numberoftetrahedra;
+    int numberofcorners;
+    int numberoftetrahedronattributes;
+
+    // `facetlist':  An array of facets.  Each entry is a structure of facet.
+    // `facetmarkerlist':  An array of facet markers; one int per facet.
+    facet *facetlist;
+    int *facetmarkerlist;
+    int numberoffacets;
+
+    // `holelist':  An array of holes.  The first hole's x, y and z
+    //   coordinates  are at indices [0], [1] and [2], followed by the
+    //   remaining holes. Three REALs per hole. 
+    REAL *holelist;
+    int numberofholes;
+
+    // `regionlist': An array of regional attributes and volume constraints.
+    //   The first constraint's x, y and z coordinates are at indices [0],
+    //   [1] and [2], followed by the regional attribute at index [3], foll-
+    //   owed by the maximum volume at index [4]. Five REALs per constraint. 
+    // Note that each regional attribute is used only if you select the `A'
+    //   switch, and each volume constraint is used only if you select the
+    //   `a' switch (with no number following).
+    REAL *regionlist;
+    int numberofregions;
+
+    // `facetconstraintlist': An array of facet maximal area constraints.
+    //   Two REALs per constraint. The first one is the facet marker (cast
+    //   it to int), the second is its maximum area bound.
+    // Note the 'facetconstraintlist' is used only for the 'q' switch. 
+    REAL *facetconstraintlist;
+    int numberoffacetconstraints;
+
+    // `segmentconstraintlist': An array of segment max. length constraints.
+    //   Three REALs per constraint. The first two are the indices (pointing
+    //   into 'pointlist') of the endpoints of the segment, the third is its
+    //   maximum length bound.
+    // Note the 'segmentconstraintlist' is used only for the 'q' switch. 
+    REAL *segmentconstraintlist;
+    int numberofsegmentconstraints;
+
+    // `nodeconstraintlist':  An array of segment length constraints.  Two
+    //   REALs per constraint. The first one is the index (pointing into
+    //   'pointlist') of the node, the second is its edge length bound.
+    // Note the 'nodeconstraintlist' is used only for the 'q' switch. 
+    REAL *nodeconstraintlist;
+    int numberofnodeconstraints;
+
+    // 'pbcgrouplist':  An array of periodic boundary condition groups.
+    pbcgroup *pbcgrouplist;
+    int numberofpbcgroups;
+
+    // `trifacelist':  An array of triangular face endpoints.  The first
+    //   face's endpoints are at indices [0], [1] and [2], followed by the
+    //   remaining faces.  Three ints per face.
+    // `adjtetlist':  An array of adjacent tetrahedra to the faces of
+    //   trifacelist. Each face has at most two adjacent tets, the first
+    //   face's adjacent tets are at [0], [1]. Two ints per face. A '-1'
+    //   indicates outside (no adj. tet). This list is output when '-n'
+    //   switch is used.
+    // `trifacemarkerlist':  An array of face markers; one int per face.
+    int *trifacelist;
+    int *adjtetlist;
+    int *trifacemarkerlist;
+    int numberoftrifaces;
+
+    // `edgelist':  An array of edge endpoints.  The first edge's endpoints
+    //   are at indices [0] and [1], followed by the remaining edges.  Two
+    //   ints per edge.
+    // `edgemarkerlist':  An array of edge markers; one int per edge.
+    int *edgelist;
+    int *edgemarkerlist;
+    int numberofedges;
+
+  public:
+
+    // Initialize routine.
+    void initialize();
+    void deinitialize();
+
+    // Input & output routines.
+    bool load_node_call(FILE* infile, int markers, char* nodefilename);
+    bool load_node(char* filename);
+    bool load_addnodes(char* filename);
+    bool load_pbc(char* filename);
+    bool load_var(char* filename);
+    bool load_mtr(char* filename);
+    bool load_poly(char* filename);
+    bool load_off(char* filename);
+    bool load_ply(char* filename);
+    bool load_stl(char* filename);
+    bool load_medit(char* filename);
+    bool load_plc(char* filename, int object);
+    bool load_tetmesh(char* filename);
+    void save_nodes(char* filename);
+    void save_elements(char* filename);
+    void save_faces(char* filename);
+    void save_edges(char* filename);
+    void save_neighbors(char* filename);
+    void save_poly(char* filename);
+
+    // Read line and parse string functions.
+    char *readline(char* string, FILE* infile, int *linenumber);
+    char *findnextfield(char* string);
+    char *readnumberline(char* string, FILE* infile, char* infilename);
+    char *findnextnumber(char* string);
+
+    // Constructor and destructor.
+    tetgenio() {initialize();}
+    ~tetgenio() {deinitialize();}
+};
+
+%rename(polygon) tetgenio::polygon;
+%rename(facet) tetgenio::facet;
+%rename(pbcgroup) tetgenio::pbcgroup;
+
+class tetgenio::polygon {
+  int *vertexlist;
+  int numberofvertices;
+};
+
+class tetgenio::facet {
+  polygon *polygonlist;
+  int numberofpolygons;
+  REAL *holelist;
+  int numberofholes;
+};
+
+class tetgenio::pbcgroup {
+  int fmark1, fmark2;
+  REAL transmat[4][4];
+  int numberofpointpairs;
+  int *pointpairlist;
+};
+
+
+void tetrahedralize(char *switches, tetgenio &in, tetgenio &out);
+
+
+// additional interface for data loading.
+REAL* allocate_array(unsigned int sz);
+void set_val(REAL*arr, unsigned int idx, float val);
+float get_val(REAL*arr, unsigned int idx);
+tetgenio::facet* allocate_facet_array(unsigned int sz);
+void add_tri(tetgenio::facet*arr, int fidx, int nidx0, int nidx1, int nidx2); 
+
+%{
+#include <iostream>
+using namespace std;
+
+REAL* allocate_array(unsigned int sz)
+{
+  return new REAL[sz];
+}
+
+void set_val(REAL*arr, unsigned int idx, float val)
+{	
+  arr[idx] = val;
+}
+float get_val(REAL*arr, unsigned int idx)
+{	
+  return arr[idx];
+}
+
+tetgenio::facet* allocate_facet_array(unsigned int sz)
+{
+  return new tetgenio::facet[sz];
+}
+
+void add_tri(tetgenio::facet*arr, int fidx, int nidx0, int nidx1, int nidx2)
+{
+  tetgenio::facet *f = &arr[fidx];
+  f->numberofpolygons = 1;	
+  f->polygonlist = new tetgenio::polygon[f->numberofpolygons];
+  f->numberofholes = 0;
+  f->holelist = 0;
+  tetgenio::polygon *p = &f->polygonlist[0];
+  p->numberofvertices = 3;
+  p->vertexlist = new int[p->numberofvertices];
+  p->vertexlist[0] = nidx0;
+  p->vertexlist[1] = nidx1;
+  p->vertexlist[2] = nidx2;
+}
+
+
+
+void tetrahedralize(char* switches, tetgenio &in, tetgenio &out)
+{
+  tetrahedralize(switches, &in, &out);
+}
+
+%}
\ No newline at end of file
diff --git a/contrib/cdat/NOTES b/contrib/cdat/NOTES
new file mode 100644
index 0000000..8a27f3b
--- /dev/null
+++ b/contrib/cdat/NOTES
@@ -0,0 +1,17 @@
+Issues:
+
+When the user closes vistrails or uses command + q to quit, the close event
+doesn't seem to be passed to vcdat so we won't execute functionality that we 
+want to run before we close vcdat.  Right now the only thing we want to do 
+when we quit is to kill the process that is running the editor to view the 
+teaching commands if it exists.
+
+Any operation that relies on data from a defined variable such as 'altered 
+weighted average' doesn't work because the vistrails module must have access 
+to all of the defined variables to execute these commands and it doesn't have
+that yet.
+
+Clicking on the plot will show the tooltip but the tooltip will disappear very
+fast.  Right now there is a hardcoded wait(1) so the tooltip shows up for 
+1 second, otherwise the tooltip usually doesn't appear.
+
diff --git a/contrib/cdat/__init__.py b/contrib/cdat/__init__.py
new file mode 100644
index 0000000..e99857e
--- /dev/null
+++ b/contrib/cdat/__init__.py
@@ -0,0 +1,10094 @@
+############################################################################
+##
+## Copyright (C) 2006-2008 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+""" Do not edit this file!
+
+File automatically generated by scripts/gen_init.py
+Change History:
+version : description
+  0.2   : Integrated quickplot module that displays the CDAT plot
+          widget inside the spreadsheet  
+  0.1   : First automatically generated package based on xml descriptions
+
+"""
+from PyQt4 import QtCore, QtGui
+import sip
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import (Module, NotCacheable,
+                                           ModuleError, new_module)
+from core.bundles import py_import
+import os, sys, re
+
+#cdat specific packages
+vcs = py_import('vcs',{})
+cdms2 = py_import('cdms2', {})
+cdutil = py_import('cdutil', {})
+import MV2
+import genutil
+
+#local python modules
+from cdat_window import QCDATWindow
+from cdat_cell import QCDATWidget, CDATCell, Variable, GraphicsMethod, Quickplot
+#from quickplot import quickplot
+from packages.spreadsheet.basic_widgets import CellLocation
+from packages.spreadsheet.basic_widgets import SpreadsheetCell
+
+version = "0.2"
+identifier = "edu.utah.sci.vistrails.cdat"
+name = "CDAT"
+
+vt_type_dict = {}
+def get_late_type(type):
+    return vt_type_dict[type]
+
+Canvas = new_module(Module,'Canvas')
+Dp = new_module(Module,'Dp')
+vt_type_dict['vcs.displayplot.Dp'] = Dp
+Gfb = new_module(Module,'Gfb')
+vt_type_dict['vcs.boxfill.Gfb'] = Gfb
+Gfi = new_module(Module,'Gfi')
+vt_type_dict['vcs.isofill.Gfi'] = Gfi
+Gi = new_module(Module,'Gi')
+vt_type_dict['vcs.isoline.Gi'] = Gi
+Gfo = new_module(Module,'Gfo')
+vt_type_dict['vcs.outfill.Gfo'] = Gfo
+Go = new_module(Module,'Go')
+vt_type_dict['vcs.outline.Go'] = Go
+GSp = new_module(Module,'GSp')
+vt_type_dict['vcs.scatter.GSp'] = GSp
+GXY = new_module(Module,'GXY')
+vt_type_dict['vcs.xvsy.GXY'] = GXY
+GXy = new_module(Module,'GXy')
+vt_type_dict['vcs.xyvsy.GXy'] = GXy
+GYx = new_module(Module,'GYx')
+vt_type_dict['vcs.yxvsx.GYx'] = GYx
+CdmsFile = new_module(Module,'CdmsFile')
+vt_type_dict['cdms2.dataset.CdmsFile'] = CdmsFile
+TransientVariable = new_module(Module,'TransientVariable')
+vt_type_dict['cdms2.tvariable.TransientVariable'] = TransientVariable
+
+
+class boxfill(SpreadsheetCell,NotCacheable):
+    """
+			Function: boxfill                        # Generate a boxfill plot
+
+ Description of Function:
+    Generate a boxfill plot given the data, boxfill graphics method, and
+    template. If no boxfill class object is given, then the 'default' boxfill
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('boxfill')                        # Show all the existing boxfill graphics methods
+    box=a.getboxfill('quick')                # Create instance of 'quick'
+    a.boxfill(array,box)                # Plot array using specified box and default
+                                        #         template
+    templt=a.gettemplate('AMIP')        # Create an instance of template 'AMIP'
+    a.clear()                           # Clear VCS canvas
+    a.boxfill(array,box,template)       # Plot array using specified box and template
+    a.boxfill(box,array,template)       # Plot array using specified box and template
+    a.boxfill(template,array,box)       # Plot array using specified box and template
+    a.boxfill(template,array,box)       # Plot array using specified box and template
+    a.boxfill(array,'AMIP','quick')     # Use 'AMIP' template and 'quick' boxfill
+    a.boxfill('AMIP',array,'quick')     # Use 'AMIP' template and 'quick' boxfill
+    a.boxfill('AMIP','quick',array)     # Use 'AMIP' template and 'quick' boxfill
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End boxfill Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+            print 'got canvas'
+            print canvas
+        else:
+            print 'no canvas'
+            canvas = vcs.init()
+
+        # Build the argument list
+        args = []        
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+        # slab is a required port
+        if slab is None:
+            raise ModuleError(self, "'slab' is a mandatory port")
+
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        # template is a required port
+        if template is None:
+            raise ModuleError(self, "'template' is a mandatory port")
+
+        args.append('Boxfill')
+
+        gm_name = None
+        if self.hasInputFromPort('gm_name'):
+            gm_name = self.getInputFromPort('gm_name')
+            args.append(gm_name)
+        # gm_name is a required port
+        if gm_name is None:
+            raise ModuleError(self, "'template' is a mandatory port")        
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+            
+        # force images to be created in the background
+        # kwargs['bg'] = 1
+
+        # TODO
+
+        #res = canvas.boxfill(*args,**kwargs)
+        #res = canvas.plot(slab, 'ASD', 'Boxfill', 'ASD')
+
+        #plotArgs = (graphics_method, 'ASD', dataset)
+        inputPorts = (canvas, args, kwargs)
+        self.displayAndWait(QCDATWidget, inputPorts)
+        
+        # self.setResult('display', res) 
+        self.setResult('canvas',canvas)
+
+class createboxfill(Module):
+    """
+			Function: createboxfill                # Construct a new boxfill graphics method
+
+ Description of Function:
+    Create a new boxfill graphics method given the the name and the existing
+    boxfill graphics method to copy the attributes from. If no existing
+    boxfill graphics method name is given, then the default boxfill graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('boxfill')
+    box=a.createboxfill('example1',)
+    a.show('boxfill')
+    box=a.createboxfill('example2','quick')
+    a.show('boxfill')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createboxfill Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+            
+        source_GM_name = None
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        gm = canvas.createboxfill(*args,**kwargs)
+        self.setResult('boxfill', gm)
+        self.setResult('canvas', canvas)
+
+class createisofill(Module):
+    """
+			Function: createisofill  # Construct a new isofill graphics method
+
+ Description of Function:
+    Create a new isofill graphics method given the the name and the existing
+    isofill graphics method to copy the attributes from. If no existing
+    isofill graphics method name is given, then the default isofill graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isofill')
+    iso=a.createisofill('example1',)
+    a.show('isofill')
+    iso=a.createisofill('example2','quick')
+    a.show('isofill')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createisofill Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+
+        source_GM_name = None
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createisofill(*args,**kwargs)
+        self.setResult('isofill',res)
+        self.setResult('canvas',canvas)
+
+class createisoline(Module):
+    """
+			Function: createisoline                # Construct a new isoline graphics method
+
+ Description of Function:
+    Create a new isoline graphics method given the the name and the existing
+    isoline graphics method to copy the attributes from. If no existing
+    isoline graphics method name is given, then the default isoline graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('isoline')
+    iso=a.createisoline('example1',)
+    a.show('isoline')
+    iso=a.createisoline('example2','quick')
+    a.show('isoline')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createisoline Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+        source_GM_name = None
+
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createisoline(*args,**kwargs)
+        self.setResult('isoline',res)
+        self.setResult('canvas',canvas)
+
+class createoutfill(Module):
+    """
+			Function: createoutfill                # Construct a new outfill graphics method
+
+ Description of Function:
+    Create a new outfill graphics method given the the name and the existing
+    outfill graphics method to copy the attributes from. If no existing
+    outfill graphics method name is given, then the default outfill graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('outfill')
+    out=a.createoutfill('example1',)
+    a.show('outfill')
+    out=a.createoutfill('example2','quick')
+    a.show('outfill')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createoutfill Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+            
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+        
+        source_GM_name = None
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createoutfill(*args,**kwargs)
+        self.setResult('outfill',res)
+        self.setResult('canvas',canvas)
+
+class createoutline(Module):
+    """
+			Function: createoutline                # Construct a new outline graphics method
+
+ Description of Function:
+    Create a new outline graphics method given the the name and the existing
+    outline graphics method to copy the attributes from. If no existing
+    outline graphics method name is given, then the default outline graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('outline')
+    out=a.createoutline('example1',)
+    a.show('outline')
+    out=a.createoutline('example2','quick')
+    a.show('outline')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createoutline Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+        source_GM_name = None
+
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createoutline(*args,**kwargs)
+        self.setResult('outline',res)
+        self.setResult('canvas',canvas)
+
+class createscatter(Module):
+    """
+			Function: createscatter                # Construct a new scatter graphics method
+
+ Description of Function:
+    Create a new scatter graphics method given the the name and the existing
+    scatter graphics method to copy the attributes from. If no existing
+    scatter graphics method name is given, then the default scatter graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('scatter')
+    sct=a.createscatter('example1',)
+    a.show('scatter')
+    sct=a.createscatter('example2','quick')
+    a.show('scatter')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createscatter Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+
+        source_GM_name = None
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createscatter(*args,**kwargs)
+        self.setResult('scatter',res)
+        self.setResult('canvas',canvas)
+
+class createxvsy(Module):
+    """
+			Function: createxvsy                      # Construct a new XvsY graphics method
+
+ Description of Function:
+    Create a new XvsY graphics method given the the name and the existing
+    XvsY graphics method to copy the attributes from. If no existing
+    XvsY graphics method name is given, then the default XvsY graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xvsy')
+    xy=a.createxvsy('example1',)
+    a.show('xvsy')
+    xy=a.createxvsy('example2','quick')
+    a.show('xvsy')
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End createxvsy Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+        source_GM_name = None
+
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createxvsy(*args,**kwargs)
+        self.setResult('xvsy',res)
+        self.setResult('canvas',canvas)
+
+class createxyvsy(Module):
+    """
+			Function: createxyvsy                  # Construct a new Xyvsy graphics method
+
+ Description of Function:
+    Create a new Xyvsy graphics method given the the name and the existing
+    Xyvsy graphics method to copy the attributes from. If no existing
+    Xyvsy graphics method name is given, then the default Xyvsy graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('xyvsy')
+    xyy=a.createxyvsy('example1',)
+    a.show('xyvsy')
+    xyy=a.createxyvsy('example2','quick')
+    a.show('xyvsy')
+
+#######################################################################################################################
+###########################################                             ###############################################
+########################################## End createxyvsy Description ################################################
+#########################################                             #################################################
+#######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+        source_GM_name = None
+
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+        res = canvas.createxyvsy(*args,**kwargs)
+        self.setResult('xyvsy',res)
+        self.setResult('canvas',canvas)
+
+class createyxvsx(Module):
+    """
+			Function: createyxvsx                  # Construct a new Yxvsx graphics method
+
+ Description of Function:
+    Create a new Yxvsx graphics method given the the name and the existing
+    Yxvsx graphics method to copy the attributes from. If no existing
+    Yxvsx graphics method name is given, then the default Yxvsx graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('yxvsx')
+    yxx=a.createyxvsx('example1',)
+    a.show('yxvsx')
+    yxx=a.createyxvsx('example2','quick')
+    a.show('yxvsx')
+
+#######################################################################################################################
+###########################################                             ###############################################
+########################################## End createyxvsx Description ################################################
+#########################################                             #################################################
+#######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        new_GM_name = None
+        if self.hasInputFromPort('new_GM_name'):
+            new_GM_name = self.getInputFromPort('new_GM_name')
+            args.append(new_GM_name)
+        source_GM_name = None
+
+        if self.hasInputFromPort('source_GM_name'):
+            source_GM_name = self.getInputFromPort('source_GM_name')
+            args.append(source_GM_name)
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+        self.setResult('slab_0_out', slab)            
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        #kwargs['bg'] = 1
+
+        res = canvas.createyxvsx(*args,**kwargs)
+        self.setResult('yxvsx',res)
+        self.setResult('canvas',canvas)
+
+class getboxfill(Module):
+    """
+			Function: getboxfill                        # Construct a new boxfill graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    boxfill class object from an existing VCS boxfill graphics method. If
+    no boxfill name is given, then boxfill 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createboxfill function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('boxfill')                   # Show all the existing boxfill graphics methods
+    box=a.getboxfill()                  # box instance of 'default' boxfill graphics
+                                        # method
+    box2=a.getboxfill('quick')          # box2 instance of existing 'quick' boxfill
+                                        #         graphics method
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getboxfill Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getboxfill(*args)
+        self.setResult('boxfill',res)
+        self.setResult('canvas',canvas)
+
+class getisofill(Module):
+    """
+			Function: getisofill          Construct a new isofill graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    isofill class object from an existing VCS isofill graphics method. If
+    no isofill name is given, then isofill 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createisofill function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isofill')                   # Show all the existing isofill graphics methods
+    iso=a.getisofill()                  # iso instance of 'default' isofill graphics
+                                        #       method
+    iso2=a.getisofill('quick')          # iso2 instance of existing 'quick' isofill
+                                        #       graphics method
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getisofill Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getisofill(*args)
+        
+        self.setResult('isofill',res)
+        self.setResult('canvas',canvas)
+
+class getisoline(Module):
+    """
+			Function: getisoline                        # Construct a new isoline graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    isoline class object from an existing VCS isoline graphics method. If
+    no isoline name is given, then isoline 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createisoline function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isoline')                   # Show all the existing isoline graphics methods
+    iso=a.getisoline()                  # iso instance of 'default' isoline graphics
+                                        #       method
+    iso2=a.getisoline('quick')          # iso2 instance of existing 'quick' isoline
+                                        #       graphics method
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getisoline Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getisoline(*args)
+        self.setResult('isoline',res)
+        self.setResult('canvas',canvas)
+
+class getoutfill(Module):
+    """
+			Function: getoutfill                        # Construct a new outfill graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    outfill class object from an existing VCS outfill graphics method. If
+    no outfill name is given, then outfill 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createoutfill function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outfill')                   # Show all the existing outfill graphics methods
+    out=a.getoutfill()                  # out instance of 'default' outfill graphics
+                                        #       method
+    out2=a.getoutfill('quick')          # out2 instance of existing 'quick' outfill
+                                        #       graphics method
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getoutfill Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getoutfill(*args,**kwargs)
+        self.setResult('outfill',res)
+        self.setResult('canvas',canvas)
+
+class getoutline(Module):
+    """
+			Function: getoutline                        # Construct a new outline graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    outline class object from an existing VCS outline graphics method. If
+    no outline name is given, then outline 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createoutline function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outline')                   # Show all the existing outline graphics methods
+    out=a.getoutline()                  # out instance of 'default' outline graphics
+                                        #       method
+    out2=a.getoutline('quick')          # out2 instance of existing 'quick' outline
+                                        #       graphics method
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getoutline Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getoutline(*args)
+        self.setResult('outline',res)
+        self.setResult('canvas',canvas)
+
+class getscatter(Module):
+    """
+			Function: getscatter                   # Construct a new scatter graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    scatter class object from an existing VCS scatter graphics method. If
+    no scatter name is given, then scatter 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createscatter function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('scatter')                   # Show all the existing scatter graphics methods
+    sct=a.getscatter()                  # sct instance of 'default' scatter graphics
+                                        #       method
+    sct2=a.getscatter('quick')          # sct2 instance of existing 'quick' scatter
+                                        #       graphics method
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getscatter Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getscatter(*args)
+        self.setResult('scatter',res)
+        self.setResult('canvas',canvas)
+
+class getxvsy(Module):
+    """
+			Function: getxvsy                   # Construct a new XvsY graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    XvsY class object from an existing VCS XvsY graphics method. If
+    no XvsY name is given, then XvsY 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createxvsy function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xvsy')                      # Show all the existing XvsY graphics methods
+    xy=a.getxvsy()                      # xy instance of 'default' XvsY graphics
+                                        #       method
+    xy2=a.getxvsy('quick')              # xy2 instance of existing 'quick' XvsY
+                                        #       graphics method
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End getxvsy Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getxvsy(*args)
+        self.setResult('xvsy',res)
+        self.setResult('canvas',canvas)
+
+class getxyvsy(Module):
+    """
+			Function: getxyvsy        # Construct a new Xyvsy graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    Xyvsy class object from an existing VCS Xyvsy graphics method. If
+    no Xyvsy name is given, then Xyvsy 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createxyvsy function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xyvsy')                     # Show all the existing Xyvsy graphics methods
+    xyy=a.getxyvsy()                    # xyy instance of 'default' Xyvsy graphics
+                                        #       method
+    xyy2=a.getxyvsy('quick')            # xyy2 instance of existing 'quick' Xyvsy
+                                        #       graphics method
+####################################################################################################################
+###########################################                          ###############################################
+########################################## End getxyvsy Description ################################################
+#########################################                          #################################################
+####################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getxyvsy(*args)
+        self.setResult('xyvsy',res)
+        self.setResult('canvas',canvas)
+
+class getyxvsx(Module):
+    """
+			Function: getyxvsx                     # Construct a new Yxvsx graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    Yxvsx class object from an existing VCS Yxvsx graphics method. If
+    no Yxvsx name is given, then Yxvsx 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createyxvsx function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('yxvsx')                     # Show all the existing Yxvsx graphics methods
+    yxx=a.getyxvsx()                    # yxx instance of 'default' Yxvsx graphics
+                                        #       method
+    yxx2=a.getyxvsx('quick')            # yxx2 instance of existing 'quick' Yxvsx
+                                        #       graphics method
+####################################################################################################################
+###########################################                          ###############################################
+########################################## End getyxvsx Description ################################################
+#########################################                          #################################################
+####################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        GM_name = None
+        if self.hasInputFromPort('GM_name'):
+            GM_name = self.getInputFromPort('GM_name')
+            args.append(GM_name)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        res = canvas.getyxvsx(*args,**kwargs)
+        self.setResult('yxvsx',res)
+        self.setResult('canvas',canvas)
+
+class isofill(Module,NotCacheable):
+    """
+			Function: isofill                        # Generate an isofill plot
+
+ Description of Function:
+    Generate a isofill plot given the data, isofill graphics method, and
+    template. If no isofill class object is given, then the 'default' isofill
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isofill')                   # Show all the existing isofill graphics methods
+    iso=a.getisofill('quick')           # Create instance of 'quick'
+    a.isofill(array,iso)                # Plot array using specified iso and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.isofill(array,iso,template)       # Plot array using specified iso and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End isofill Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+            
+        args = []
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+            
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        # template is a required port
+        if template is None:
+            raise ModuleError(self, "'template' is a mandatory port")
+
+        args.append('Isofill')
+
+        gm_name = None
+        if self.hasInputFromPort('gm_name'):
+            gm_name = self.getInputFromPort('gm_name')
+            args.append(gm_name)
+        # gm_name is a required port
+        if gm_name is None:
+            raise ModuleError(self, "'template' is a mandatory port")                    
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.isofill(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class isoline(Module,NotCacheable):
+    """
+			Function: isoline                        # Generate an isoline plot
+
+ Description of Function:
+    Generate a isoline plot given the data, isoline graphics method, and
+    template. If no isoline class object is given, then the 'default' isoline
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isoline')                   # Show all the existing isoline graphics methods
+    iso=a.getisoline('quick')           # Create instance of 'quick'
+    a.isoline(array,iso)                # Plot array using specified iso and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.isoline(array,iso,template)       # Plot array using specified iso and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End isoline Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+            
+        args = []
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        # template is a required port
+        if template is None:
+            raise ModuleError(self, "'template' is a mandatory port")
+
+        args.append('Isoline')
+
+        gm_name = None
+        if self.hasInputFromPort('gm_name'):
+            gm_name = self.getInputFromPort('gm_name')
+            args.append(gm_name)
+        # gm_name is a required port
+        if gm_name is None:
+            raise ModuleError(self, "'template' is a mandatory port")                    
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.isoline(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class outfill(Module):
+    """
+			Function: outfill                        # Generate an outfill plot
+
+ Description of Function:
+    Generate a outfill plot given the data, outfill graphics method, and
+    template. If no outfill class object is given, then the 'default' outfill
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outfill')                   # Show all the existing outfill graphics methods
+    out=a.getoutfill('quick')           # Create instance of 'quick'
+    a.outfill(array,out)                # Plot array using specified out and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.outfill(array,out,template)       # Plot array using specified out and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End outfill Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+
+        args = []
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        # template is a required port
+        if template is None:
+            raise ModuleError(self, "'template' is a mandatory port")
+
+        args.append('Outfill')
+
+        gm_name = None
+        if self.hasInputFromPort('gm_name'):
+            gm_name = self.getInputFromPort('gm_name')
+            args.append(gm_name)
+        # gm_name is a required port
+        if gm_name is None:
+            raise ModuleError(self, "'template' is a mandatory port")                    
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.outfill(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class outline(Module):
+    """
+			Function: outline                        # Generate an outline plot
+
+ Description of Function:
+    Generate a outline plot given the data, outline graphics method, and
+    template. If no outline class object is given, then the 'default' outline
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outline')                   # Show all the existing outline graphics methods
+    out=a.getoutline('quick')           # Create instance of 'quick'
+    a.outline(array,out)                # Plot array using specified out and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.outline(array,out,template)       # Plot array using specified out and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End outline Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        # template is a required port
+        if template is None:
+            raise ModuleError(self, "'template' is a mandatory port")
+
+        args.append('Outline')
+
+        gm_name = None
+        if self.hasInputFromPort('gm_name'):
+            gm_name = self.getInputFromPort('gm_name')
+            args.append(gm_name)
+        # gm_name is a required port
+        if gm_name is None:
+            raise ModuleError(self, "'template' is a mandatory port")                    
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.outline(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class plot(SpreadsheetCell,NotCacheable):
+    """
+			Function: plot
+
+ Description of plot:
+    Plot an array(s) of data given a template and graphics method. The VCS template is
+    used to define where the data and variable attributes will be displayed on the VCS
+    Canvas. The VCS graphics method is used to define how the array(s) will be shown
+    on the VCS Canvas.
+
+ The form of the call is:
+    plot(array1=None, array2=None, template_name=None, graphics_method=None,
+            graphics_name=None, [key=value [, key=value [, ...]]])
+
+            where array1 and array2 are NumPy arrays.
+
+    Plot keywords:
+      ratio [default is none]
+            None: let the self.ratio attribute decide
+            0,'off': overwritte self.ratio and do nothing about the ratio
+            'auto': computes an automatic ratio
+            '3',3: y dim will be 3 times bigger than x dim (restricted to original tempalte.data area
+            Adding a 't' at the end of the ratio, makes the tickmarks and boxes move along.
+
+    Variable attribute keys:
+       comment1         = string   #Comment plotted above file_comment
+       comment2         = string   #Comment plotted above comment1
+       comment3         = string   #Comment plotted above comment2
+       comment4         = string   #Comment plotted above comment4
+       file_comment     = string   #Comment (defaults to file.comment)
+       hms              = string (hh:mm:ss) #Hour, minute, second
+       long_name        = string   #Descriptive variable name
+       name             = string   #Variable name (defaults to var.id)
+       time             = cdtime   #instance (relative or absolute),
+                                    cdtime, reltime or abstime value
+       units            = string   #Variable units
+       ymd              = string (yy/mm/dd) #Year, month, day
+
+    Dimension attribute keys (dimension length=n):
+       [x|y|z|t|w]array = NumPy array of length n    # x or y Dimension values
+       [x|y|z|t|w]array = NumPy array of length n    # x or y Dimension values
+       [x|y]bounds       = NumPy array of shape (n,2) # x or y Dimension boundaries
+       [x|y|z|t|w]name   = string                     # x or y Dimension name
+       [x|y|z|t|w]units  = string                     # x or y Dimension units
+       [x|y]weights      = NumPy array of length n    # x or y Dimension weights (used to
+                                                        calculate area-weighted mean)
+
+    CDMS object:
+       [x|y|z|t|w]axis   = CDMS axis object           # x or y Axis
+       grid              = CDMS grid object           # Grid object (e.g. grid=var.getGrid()
+       variable          = CDMS variable object       # Variable object
+
+    Other:
+       [x|y]rev         = 0|1                         # if ==1, reverse the direction of the x
+    							     or y axis
+       continents	= 0,1,2,3,4,5,6,7,8,9,10,11   #	if >=1, plot continental outlines
+    							     (default: plot if xaxis is
+    							     longitude, yaxis is latitude -or-
+    							     xname is 'longitude' and yname is
+    							     'latitude'
+                                                      # The continents-type values are integers
+						      # ranging from 0 to 11, where:
+						      #    0 signifies "No Continents"
+						      #    1 signifies "Fine Continents"
+						      #    2 signifies "Coarse Continents"
+						      #    3 signifies "United States"
+						      #    4 signifies "Political Borders"
+						      #    5 signifies "Rivers"
+
+						      # Values 6 through 11 signify the line type
+                                                      # defined by the files data_continent_other7
+                                                      # through data_continent_other12.
+
+    Graphics Output in Background Mode:
+       bg                 = 0|1   # if ==1, create images in the background
+                                                             (Don't display the VCS Canvas)
+
+ Note:
+    More specific attributes take precedence over general attributes. In particular,
+    specifie attributes override variable object attributes, dimension attributes and
+    arrays override axis objects, which override grid objects, which override variable
+    objects.
+
+    For example, if both 'file_comment' and 'variable' keywords are specified, the value of
+    'file_comment' is used instead of the file comment in the parent of variable. Similarly,
+    if both 'xaxis' and 'grid' keywords are specified, the value of 'xaxis' takes precedence
+    over the x-axis of grid.
+
+ Example of Use:
+    x=vcs.init()        # x is an instance of the VCS class object (constructor)
+    x.plot(array)       # this call will use default settings for template and boxfill
+    x.plot(array, 'AMIP', 'isofill','AMIP_psl') # this is specifying the template and
+                                                  graphics method
+    t=x.gettemplate('AMIP')        # get a predefined the template 'AMIP'
+    vec=x.getvector('quick')       # get a predefined the vector graphics method 'quick'
+    x.plot(array1, array2, t, vec) # plot the data as a vector using the 'AMIP' template
+    x.clear()                      # clear the VCS Canvas of all plots
+    box=x.createboxfill('new')     # create boxfill graphics method 'new'
+    x.plot(box,t,array)            # plot array data using box 'new' and template 't'
+
+###############################################################################################################
+###########################################                      ##############################################
+########################################## End plot Description ###############################################
+#########################################                      ################################################
+###############################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+            
+        # Build up the argument list
+        args = []
+        slab2 = None
+        if self.hasInputFromPort('slab2_0'):
+            slab2 = self.getInputFromPort('slab2_0')
+            args.append(slab2)
+        slab1 = None
+        if self.hasInputFromPort('slab1_0'):
+            slab1 = self.getInputFromPort('slab1_0')
+            args.append(slab1)
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        plot_type = None
+        if self.hasInputFromPort('plot_type'):
+            plot_type = self.getInputFromPort('plot_type')
+            args.append(plot_type)
+        gm_name = None
+        if self.hasInputFromPort('gm_name'):
+            gm_name = self.getInputFromPort('gm_name')
+            args.append(gm_name)
+
+        # slab1 is a required port
+        if slab1 is None:
+            raise ModuleError(self, "'slab1' is a mandatory port")
+        # template is a required port
+        if template is None:
+            raise ModuleError(self, "'template' is a mandatory port")
+        # plot_type is a required port
+        if plot_type is None:
+            raise ModuleError(self, "'plot_type' is a mandatory port")
+        # gm_name is a required port
+        if gm_name is None:
+            raise ModuleError(self, "'gm_name' is a mandatory port")
+        
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+
+        # Set the cell row / col
+        self.location = CellLocation()
+        if self.hasInputFromPort('row'):
+            self.location.row = self.getInputFromPort('row')
+        if self.hasInputFromPort('col'):
+            self.location.col = self.getInputFromPort('col')            
+
+        # Plot into the cell
+        inputPorts = (canvas, args, kwargs)
+        self.displayAndWait(QCDATWidget, inputPorts)
+        
+        self.setResult('canvas',canvas)
+
+class scatter(Module):
+    """
+			Function: scatter                      # Generate a scatter plot
+
+ Description of Function:
+    Generate a scatter plot given the data, scatter graphics method, and
+    template. If no scatter class object is given, then the 'default' scatter
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('scatter')                   # Show all the existing scatter graphics methods
+    sct=a.getscatter('quick')           # Create instance of 'quick'
+    a.scatter(array,sct)                # Plot array using specified sct and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.scatter(array,sct,template)       # Plot array using specified sct and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End scatter Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        slab2 = None
+        if self.hasInputFromPort('slab2_0'):
+            slab2 = self.getInputFromPort('slab2_0')
+            args.append(slab2)
+        slab1 = None
+        if self.hasInputFromPort('slab1_0'):
+            slab1 = self.getInputFromPort('slab1_0')
+            args.append(slab1)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.scatter(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class xvsy(Module):
+    """
+			Function: xvsy                      # Generate a XvsY plot
+
+ Description of Function:
+    Generate a XvsY plot given the data, XvsY graphics method, and
+    template. If no XvsY class object is given, then the 'default' XvsY
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xvsy')                   # Show all the existing XvsY graphics methods
+    xy=a.getxvsy('quick')            # Create instance of 'quick'
+    a.xvsy(array,xy)                 # Plot array using specified xy and default
+                                     #       template
+    a.clear()                        # Clear VCS canvas
+    a.xvsy(array,xy,template)        # Plot array using specified xy and template
+
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End xvsy Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        slab2 = None
+        if self.hasInputFromPort('slab2_0'):
+            slab2 = self.getInputFromPort('slab2_0')
+            args.append(slab2)
+        slab1 = None
+        if self.hasInputFromPort('slab1_0'):
+            slab1 = self.getInputFromPort('slab1_0')
+            args.append(slab1)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('yaxisconvert'):
+            kwargs['yaxisconvert'] = self.getInputFromPort('yaxisconvert')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.xvsy(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class xyvsy(Module):
+    """
+			Function: xyvsy                        # Generate a Xyvsy plot
+
+ Description of Function:
+    Generate a Xyvsy plot given the data, Xyvsy graphics method, and
+    template. If no Xyvsy class object is given, then the 'default' Xyvsy
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xyvsy')                   # Show all the existing Xyvsy graphics methods
+    xyy=a.getxyvsy('quick')           # Create instance of 'quick'
+    a.xyvsy(array,xyy)                # Plot array using specified xyy and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.xyvsy(array,xyy,template)       # Plot array using specified xyy and template
+
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End xyvsy Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.xyvsy(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class yxvsx(Module):
+    """
+			Function: yxvsx                        # Generate a Yxvsx plot
+
+ Description of Function:
+    Generate a Yxvsx plot given the data, Yxvsx graphics method, and
+    template. If no Yxvsx class object is given, then the 'default' Yxvsx
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('yxvsx')                   # Show all the existing Yxvsx graphics methods
+    yxx=a.getyxvsx('quick')           # Create instance of 'quick'
+    a.yxvsx(array,yxx)                # Plot array using specified yxx and default
+                                      #       template
+    a.clear()                         # Clear VCS canvas
+    a.yxvsx(array,yxx,template)       # Plot array using specified yxx and template
+
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End yxvsx Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        slab = None
+        if self.hasInputFromPort('slab_0'):
+            slab = self.getInputFromPort('slab_0')
+            args.append(slab)
+
+        # build up the keyword arguments from the optional inputs.
+        kwargs = {}
+        if self.hasInputFromPort('datawc_timeunits'):
+            kwargs['datawc_timeunits'] = self.getInputFromPort('datawc_timeunits')
+        if self.hasInputFromPort('long_name'):
+            kwargs['long_name'] = self.getInputFromPort('long_name')
+        if self.hasInputFromPort('projection_0'):
+            kwargs['projection'] = self.getInputFromPort('projection_0')
+        if self.hasInputFromPort('xticlabels2_0'):
+            kwargs['xticlabels2'] = self.getInputFromPort('xticlabels2_0')
+        if self.hasInputFromPort('xarray_0'):
+            kwargs['xarray'] = self.getInputFromPort('xarray_0')
+        if self.hasInputFromPort('yweights_0'):
+            kwargs['yweights'] = self.getInputFromPort('yweights_0')
+        if self.hasInputFromPort('xweights_0'):
+            kwargs['xweights'] = self.getInputFromPort('xweights_0')
+        if self.hasInputFromPort('warray_0'):
+            kwargs['warray'] = self.getInputFromPort('warray_0')
+        if self.hasInputFromPort('tunits'):
+            kwargs['tunits'] = self.getInputFromPort('tunits')
+        if self.hasInputFromPort('ymtics1_0'):
+            kwargs['ymtics1'] = self.getInputFromPort('ymtics1_0')
+        if self.hasInputFromPort('ymtics2_0'):
+            kwargs['ymtics2'] = self.getInputFromPort('ymtics2_0')
+        if self.hasInputFromPort('datawc_x1'):
+            kwargs['datawc_x1'] = self.getInputFromPort('datawc_x1')
+        if self.hasInputFromPort('datawc_x2'):
+            kwargs['datawc_x2'] = self.getInputFromPort('datawc_x2')
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        if self.hasInputFromPort('xmtics1_0'):
+            kwargs['xmtics1'] = self.getInputFromPort('xmtics1_0')
+        if self.hasInputFromPort('xmtics2_0'):
+            kwargs['xmtics2'] = self.getInputFromPort('xmtics2_0')
+        if self.hasInputFromPort('xbounds_0'):
+            kwargs['xbounds'] = self.getInputFromPort('xbounds_0')
+        if self.hasInputFromPort('ybounds_0'):
+            kwargs['ybounds'] = self.getInputFromPort('ybounds_0')
+        if self.hasInputFromPort('datawc_y2'):
+            kwargs['datawc_y2'] = self.getInputFromPort('datawc_y2')
+        if self.hasInputFromPort('wname'):
+            kwargs['wname'] = self.getInputFromPort('wname')
+        if self.hasInputFromPort('file_comment'):
+            kwargs['file_comment'] = self.getInputFromPort('file_comment')
+        if self.hasInputFromPort('datawc_calendar'):
+            kwargs['datawc_calendar'] = self.getInputFromPort('datawc_calendar')
+        if self.hasInputFromPort('wunits'):
+            kwargs['wunits'] = self.getInputFromPort('wunits')
+        if self.hasInputFromPort('xrev'):
+            kwargs['xrev'] = self.getInputFromPort('xrev')
+        if self.hasInputFromPort('ymd'):
+            kwargs['ymd'] = self.getInputFromPort('ymd')
+        if self.hasInputFromPort('yarray_0'):
+            kwargs['yarray'] = self.getInputFromPort('yarray_0')
+        if self.hasInputFromPort('units'):
+            kwargs['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('yunits'):
+            kwargs['yunits'] = self.getInputFromPort('yunits')
+        if self.hasInputFromPort('zarray_0'):
+            kwargs['zarray'] = self.getInputFromPort('zarray_0')
+        if self.hasInputFromPort('xname'):
+            kwargs['xname'] = self.getInputFromPort('xname')
+        if self.hasInputFromPort('tarray_0'):
+            kwargs['tarray'] = self.getInputFromPort('tarray_0')
+        if self.hasInputFromPort('bg_0'):
+            kwargs['bg'] = self.getInputFromPort('bg_0')
+        elif self.hasInputFromPort('bg_1'):
+            kwargs['bg'] = self.getInputFromPort('bg_1')
+        if self.hasInputFromPort('xaxisconvert'):
+            kwargs['xaxisconvert'] = self.getInputFromPort('xaxisconvert')
+        if self.hasInputFromPort('zname'):
+            kwargs['zname'] = self.getInputFromPort('zname')
+        if self.hasInputFromPort('hms'):
+            kwargs['hms'] = self.getInputFromPort('hms')
+        if self.hasInputFromPort('tname'):
+            kwargs['tname'] = self.getInputFromPort('tname')
+        if self.hasInputFromPort('yname'):
+            kwargs['yname'] = self.getInputFromPort('yname')
+        if self.hasInputFromPort('ratio_0'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_0')
+        elif self.hasInputFromPort('ratio_1'):
+            kwargs['ratio'] = self.getInputFromPort('ratio_1')
+        if self.hasInputFromPort('datawc_y1'):
+            kwargs['datawc_y1'] = self.getInputFromPort('datawc_y1')
+        if self.hasInputFromPort('xunits'):
+            kwargs['xunits'] = self.getInputFromPort('xunits')
+        if self.hasInputFromPort('name'):
+            kwargs['name'] = self.getInputFromPort('name')
+        if self.hasInputFromPort('yticlabels1_0'):
+            kwargs['yticlabels1'] = self.getInputFromPort('yticlabels1_0')
+        if self.hasInputFromPort('yticlabels2_0'):
+            kwargs['yticlabels2'] = self.getInputFromPort('yticlabels2_0')
+        if self.hasInputFromPort('comment1'):
+            kwargs['comment1'] = self.getInputFromPort('comment1')
+        if self.hasInputFromPort('zunits'):
+            kwargs['zunits'] = self.getInputFromPort('zunits')
+        if self.hasInputFromPort('comment3'):
+            kwargs['comment3'] = self.getInputFromPort('comment3')
+        if self.hasInputFromPort('comment2'):
+            kwargs['comment2'] = self.getInputFromPort('comment2')
+        if self.hasInputFromPort('xticlabels1_0'):
+            kwargs['xticlabels1'] = self.getInputFromPort('xticlabels1_0')
+        if self.hasInputFromPort('comment4'):
+            kwargs['comment4'] = self.getInputFromPort('comment4')
+        if self.hasInputFromPort('yrev'):
+            kwargs['yrev'] = self.getInputFromPort('yrev')
+        #force images to be created in the background
+        kwargs['bg'] = 1
+        res = canvas.yxvsx(*args,**kwargs)
+        self.setResult('display',res)
+        self.setResult('canvas',canvas)
+
+class png(Module,NotCacheable):
+    """
+			Function: png
+
+ Description of Function:
+    Png output is another form of raster graphics.
+
+ Example of Use:
+    a=vcs.init()
+    a.plot(array)
+    a.png('example')       # Overwrite a png file
+    a.png('example', width=11.5, height= 8.5)  # US Legal
+    a.png('example', width=21, height=29.7, units='cm')  # A4
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End png Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		
+    """
+    def compute(self):
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            canvas = vcs.init()
+        args = []
+        file = None
+        if self.hasInputFromPort('file'):
+            file = self.getInputFromPort('file')
+            args.append(file)
+
+        # file is a required port
+        if file is None:
+            raise ModuleError(self, "'file' is a mandatory port")
+        width = None
+        if self.hasInputFromPort('width'):
+            width = self.getInputFromPort('width')
+            args.append(width)
+        height = None
+        if self.hasInputFromPort('height'):
+            height = self.getInputFromPort('height')
+            args.append(height)
+        units = None
+        if self.hasInputFromPort('units'):
+            units = self.getInputFromPort('units')
+            args.append(units)
+        ofile = core.modules.basic_modules.File()
+        ofile.name = file
+        canvas.png(*args)
+        self.setResult('file',ofile)
+
+class open(Module):
+    """
+        Function: open     # Open an existing dataset
+
+Description of Function:
+    'uri' is a Uniform Resource Identifier, referring to a cdunif file, XML file,
+    or LDAP URL of a catalog dataset entry.
+    'mode' is 'r', 'r+', 'a', or 'w'
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End open Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+    
+    """
+    def compute(self):
+        args = []
+        uri = None
+        if self.hasInputFromPort('uri'):
+            uri = self.getInputFromPort('uri')
+            args.append(uri)
+
+        # uri is a required port
+        if uri is None:
+            raise ModuleError(self, "'uri' is a mandatory port")
+        mode = None
+        if self.hasInputFromPort('mode'):
+            mode = self.getInputFromPort('mode')
+            args.append(mode)
+        template = None
+        if self.hasInputFromPort('template'):
+            template = self.getInputFromPort('template')
+            args.append(template)
+        dods = None
+        if self.hasInputFromPort('dods'):
+            dods = self.getInputFromPort('dods')
+            args.append(dods)
+        res = cdms2.open(*args)
+        self.setResult('dataset',res)
+
+class __call__(Module):
+    """
+        Function: __call__     # Call a variable object with the given id
+
+Description of Function:
+    Call a variable object with the given id
+    Exception if not found.
+    Call the variable with the other arguments.
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End _call_ Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+    
+    """
+    def compute(self):
+        # Check ports
+        if not self.hasInputFromPort('cdmsfile'):
+            raise ModuleError(self, "'cdmsfile' is mandatory.")
+        if not self.hasInputFromPort('type'):
+            raise ModuleError(self, "'type' is mandatory.")
+        if not self.hasInputFromPort('id'):
+            raise ModuleError(self, "'id' is mandatory.")        
+        if not self.hasInputFromPort('axes'):
+            raise ModuleError(self, "'axes' is mandatory.")
+        if not self.hasInputFromPort('axesOperations'):
+            raise ModuleError(self, "'axesOperations' is mandatory.")
+
+        # Get input from ports
+        cdmsfile = self.getInputFromPort('cdmsfile')
+        varType = self.getInputFromPort('type')
+        id = self.getInputFromPort('id')
+        axes = self.getInputFromPort('axes')
+        axesOperations = self.getInputFromPort('axesOperations')                
+
+        # Get the variable
+        if (varType == 'variable'):
+            var = cdmsfile.__call__(id)
+        elif (varType == 'axis'):
+            varID = self.getAxisID(id)            
+            axis = getattr(cdmsfile, 'axes')[varID]
+            var = MV2.array(axis)
+            var.setAxis(0, axis)
+        elif (varType == 'weighted-axis'):
+            varID, axisID = self.getVarAndAxisID(id)
+            var = cdmsfile.__call__(varID)            
+            var = genutil.getAxisWeightByName(var, axisID)
+            var.id = varID +'_' + axisID + '_weight'
+        else:
+            var = None
+
+        # Get the updated variable
+        if axes is not None and var is not None:
+            try:
+                kwargs = eval(axes)
+                var = var(**kwargs)
+            except:
+                raise ModuleError(self, "Invalid 'axes' specification", axes)
+
+        # Apply axes ops to the variable
+        var = self.applyAxesOperations(var, axesOperations)
+
+        self.setResult('variable', var)
+
+    def applyAxesOperations(self, var, axesOperations):
+        """ Apply kwargs / axis operations to update the dataset """
+        try:
+            axesOperations = eval(axesOperations)
+        except:
+            raise TypeError("Invalid string 'axesOperations'")
+
+        for axis in list(axesOperations):
+            if axesOperations[axis] == 'sum':
+                var = cdutil.averager(var, axis="(%s)" % axis, weight='equal',
+                                      action='sum')
+            elif axesOperations[axis] == 'avg':
+                var = cdutil.averager(var, axis="(%s)" % axis, weight='equal')
+            elif axesOperations[axis] == 'wgt':
+                var = cdutil.averager(var, axis="(%s)" % axis)
+            elif axesOperations[axis] == 'gtm':
+                var = genutil.statistics.geometricmean(var, axis="(%s)" % axis)
+            elif axesOperations[axis] == 'std':
+                var = genutil.statistics.std(var, axis="(%s)" % axis)                
+                
+        return var
+
+    def getVarAndAxisID(self, varID):
+        """ get the varID and axisID from a string with format
+        varID_axisID_weight """
+        
+        match = re.compile('(.+)(_)(.+)(_)(weight)').match(varID)
+        if match:
+            return (match.group(1), match.group(3))
+
+        return None
+
+    def getAxisID(self, varID):
+        """ get the axisID from a string with format varID_axisID_axis """
+
+        match = re.compile('(.+)(_)(.+)(_)(axis)').match(varID)
+        if match:
+            return match.group(3)
+
+        return varID
+
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry.get_module_registry()
+
+    reg.add_module(Canvas,namespace='vcs|Canvas')
+    reg.add_module(GSp,namespace='vcs|scatter')
+    reg.add_module(CdmsFile,namespace='cdms2|dataset')
+    reg.add_module(TransientVariable,namespace='cdms2|tvariable')
+    reg.add_module(GXy,namespace='vcs|xyvsy')
+    reg.add_module(Go,namespace='vcs|outline')
+    reg.add_module(Gfi,namespace='vcs|isofill')
+    reg.add_module(Dp,namespace='vcs|displayplot')
+    reg.add_module(Gfb,namespace='vcs|boxfill')
+    reg.add_module(GYx,namespace='vcs|yxvsx')
+    reg.add_module(GXY,namespace='vcs|xvsy')
+    reg.add_module(Gi,namespace='vcs|isoline')
+    reg.add_module(Gfo,namespace='vcs|outfill')
+
+    
+    ##########################################################################
+    # included from cdatwindow_init_inc.py
+    #display = sip.unwrapinstance(QtGui.QX11Info.display())
+    #vcs._vcs.setdisplay(display)
+
+    #cdat GUI modules
+    global cdatWindow
+    cdatWindow = QCDATWindow()
+    cdatWindow.show()
+
+
+    reg.add_module(CDATCell,namespace='cdat')
+    reg.add_input_port(CDATCell, 'slab1',
+                       (TransientVariable, "variable to be plotted"))
+    reg.add_input_port(CDATCell, 'slab2',
+                       (TransientVariable, "variable to be plotted"))    
+    reg.add_input_port(CDATCell, 'plotType',
+                       (core.modules.basic_modules.String, "Plot type"))
+    reg.add_input_port(CDATCell, 'template',
+                       (core.modules.basic_modules.String, "template name"))
+    reg.add_input_port(CDATCell, 'gmName',
+                       (core.modules.basic_modules.String, "graphics method name"))    
+    reg.add_input_port(CDATCell, 'canvas',
+                       (Canvas, "Canvas object"))
+    reg.add_input_port(CDATCell, 'col',
+                       (core.modules.basic_modules.Integer, "Cell Col"))
+    reg.add_input_port(CDATCell, 'row',
+                       (core.modules.basic_modules.Integer, "Cell Row"))
+    reg.add_input_port(CDATCell, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)    
+    reg.add_output_port(CDATCell, 'canvas', 
+                       (Canvas, ""), True)    
+
+    reg.add_module(Variable, namespace='cdat')
+    reg.add_module(Quickplot, namespace='cdat')    
+    reg.add_input_port(Variable, 'id', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(Variable, 'type', 
+                       (core.modules.basic_modules.String,
+                        "variable, axis, or weighted-axis"))
+    reg.add_input_port(Variable, 'inputVariable', 
+                       (core.modules.basic_modules.List,
+                        ""))
+    reg.add_output_port(Variable, 'variable', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        ""))
+    reg.add_input_port(Variable, 'axes',
+                       (core.modules.basic_modules.String, "Axes of variables"))    
+    reg.add_input_port(Variable, 'axesOperations',
+                       (core.modules.basic_modules.String, "Axes Operations"))
+    reg.add_input_port(Variable, 'cdmsfile', 
+                       (CdmsFile, "cdmsfile"))    
+
+    reg.add_module(GraphicsMethod, namespace='cdat')
+    reg.add_input_port(GraphicsMethod, 'gmName', 
+                       (core.modules.basic_modules.String,
+                        "Get the graphics method object of the given name."))
+    reg.add_input_port(GraphicsMethod, 'plotType',
+                       (core.modules.basic_modules.String, "Plot type"))    
+    reg.add_input_port(GraphicsMethod, 'slab1', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab1"))
+    reg.add_input_port(GraphicsMethod, 'slab2', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab2"))
+    reg.add_input_port(GraphicsMethod, 'color_1',
+                       (core.modules.basic_modules.Integer, "color_1"), True)
+    reg.add_input_port(GraphicsMethod, 'color_2',
+                       (core.modules.basic_modules.Integer, "color_2"), True)
+    reg.add_input_port(GraphicsMethod, 'level_1',
+                       (core.modules.basic_modules.Float, "level_1"), True)
+    reg.add_input_port(GraphicsMethod, 'level_2',
+                       (core.modules.basic_modules.Float, "level_2"), True)        
+    reg.add_output_port(GraphicsMethod, 'slab1', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab1"))
+    reg.add_output_port(GraphicsMethod, 'slab2', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab2"))            
+    reg.add_output_port(GraphicsMethod, 'canvas', (Canvas, "Canvas object"))
+    
+    # end of cdatwindow_init_inc.py
+    ##########################################################################
+    
+    
+    #Module boxfill
+    reg.add_module(boxfill,namespace='vcs|Canvas')
+    reg.add_input_port(boxfill, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_input_port(boxfill, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(boxfill, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))
+    reg.add_input_port(boxfill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(boxfill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(boxfill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(boxfill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(boxfill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(boxfill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(boxfill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(boxfill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(boxfill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(boxfill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(boxfill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(boxfill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(boxfill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(boxfill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(boxfill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(boxfill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(boxfill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(boxfill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(boxfill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(boxfill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(boxfill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(boxfill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(boxfill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(boxfill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(boxfill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(boxfill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(boxfill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(boxfill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(boxfill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(boxfill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(boxfill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(boxfill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(boxfill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(boxfill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(boxfill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(boxfill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(boxfill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(boxfill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(boxfill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(boxfill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(boxfill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(boxfill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(boxfill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(boxfill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(boxfill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(boxfill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(boxfill, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+    
+    #Module createboxfill
+    reg.add_module(createboxfill,namespace='vcs|Canvas')
+    reg.add_input_port(createboxfill, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createboxfill, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))        
+    reg.add_input_port(createboxfill, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createboxfill, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createboxfill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createboxfill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createboxfill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createboxfill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createboxfill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createboxfill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createboxfill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createboxfill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createboxfill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createboxfill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createboxfill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createboxfill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createboxfill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createboxfill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createboxfill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createboxfill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createboxfill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createboxfill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createboxfill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createboxfill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createboxfill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createboxfill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createboxfill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createboxfill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createboxfill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createboxfill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createboxfill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createboxfill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createboxfill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createboxfill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createboxfill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createboxfill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createboxfill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createboxfill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createboxfill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createboxfill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createboxfill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createboxfill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createboxfill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createboxfill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createboxfill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createboxfill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createboxfill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createboxfill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createboxfill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createboxfill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createboxfill, 'boxfill', 
+                       (get_late_type('vcs.boxfill.Gfb'),
+                        "no default"))
+
+    #Module createisofill
+    reg.add_module(createisofill,namespace='vcs|Canvas')
+    reg.add_input_port(createisofill, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createisofill, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createisofill, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createisofill, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))            
+    reg.add_input_port(createisofill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createisofill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createisofill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createisofill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createisofill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createisofill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createisofill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createisofill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createisofill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createisofill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createisofill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createisofill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createisofill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createisofill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createisofill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createisofill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createisofill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createisofill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createisofill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createisofill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createisofill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createisofill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createisofill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createisofill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createisofill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createisofill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createisofill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createisofill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createisofill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createisofill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createisofill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createisofill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createisofill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createisofill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createisofill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createisofill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createisofill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createisofill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createisofill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createisofill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createisofill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createisofill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createisofill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createisofill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createisofill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createisofill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createisofill, 'isofill', 
+                       (get_late_type('vcs.isofill.Gfi'),
+                        "no default"))
+
+    #Module createisoline
+    reg.add_module(createisoline,namespace='vcs|Canvas')
+    reg.add_input_port(createisoline, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createisoline, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createisoline, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createisoline, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))            
+    reg.add_input_port(createisoline, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createisoline, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createisoline, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createisoline, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createisoline, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createisoline, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createisoline, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createisoline, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createisoline, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createisoline, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createisoline, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createisoline, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createisoline, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createisoline, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createisoline, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createisoline, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createisoline, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createisoline, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createisoline, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createisoline, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createisoline, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createisoline, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createisoline, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createisoline, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createisoline, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createisoline, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createisoline, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createisoline, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createisoline, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createisoline, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createisoline, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createisoline, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createisoline, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createisoline, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createisoline, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createisoline, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createisoline, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createisoline, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createisoline, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createisoline, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createisoline, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createisoline, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createisoline, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createisoline, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createisoline, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createisoline, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createisoline, 'isoline', 
+                       (get_late_type('vcs.isoline.Gi'),
+                        "no default"))
+
+    #Module createoutfill
+    reg.add_module(createoutfill,namespace='vcs|Canvas')
+    reg.add_input_port(createoutfill, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createoutfill, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createoutfill, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createoutfill, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))        
+    reg.add_input_port(createoutfill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createoutfill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createoutfill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createoutfill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createoutfill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createoutfill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createoutfill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createoutfill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createoutfill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createoutfill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createoutfill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createoutfill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createoutfill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createoutfill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createoutfill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createoutfill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createoutfill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createoutfill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createoutfill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createoutfill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createoutfill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createoutfill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createoutfill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createoutfill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createoutfill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createoutfill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createoutfill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createoutfill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createoutfill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createoutfill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createoutfill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createoutfill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createoutfill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createoutfill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createoutfill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createoutfill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createoutfill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createoutfill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createoutfill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createoutfill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createoutfill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutfill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createoutfill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createoutfill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createoutfill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createoutfill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createoutfill, 'outfill', 
+                       (get_late_type('vcs.outfill.Gfo'),
+                        "no default"))
+
+    #Module createoutline
+    reg.add_module(createoutline,namespace='vcs|Canvas')
+    reg.add_input_port(createoutline, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createoutline, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createoutline, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createoutline, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))        
+    reg.add_input_port(createoutline, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createoutline, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createoutline, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createoutline, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createoutline, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createoutline, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createoutline, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createoutline, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createoutline, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createoutline, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createoutline, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createoutline, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createoutline, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createoutline, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createoutline, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createoutline, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createoutline, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createoutline, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createoutline, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createoutline, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createoutline, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createoutline, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createoutline, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createoutline, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createoutline, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createoutline, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createoutline, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createoutline, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createoutline, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createoutline, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createoutline, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createoutline, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createoutline, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createoutline, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createoutline, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createoutline, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createoutline, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createoutline, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createoutline, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createoutline, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createoutline, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createoutline, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createoutline, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createoutline, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createoutline, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createoutline, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createoutline, 'outline', 
+                       (get_late_type('vcs.outline.Go'),
+                        "no default"))
+
+    #Module createscatter
+    reg.add_module(createscatter,namespace='vcs|Canvas')
+    reg.add_input_port(createscatter, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createscatter, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createscatter, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createscatter, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))            
+    reg.add_input_port(createscatter, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createscatter, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createscatter, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createscatter, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createscatter, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createscatter, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createscatter, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createscatter, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createscatter, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createscatter, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createscatter, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createscatter, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createscatter, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createscatter, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createscatter, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createscatter, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createscatter, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createscatter, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createscatter, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createscatter, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createscatter, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createscatter, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createscatter, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createscatter, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createscatter, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createscatter, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createscatter, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createscatter, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createscatter, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createscatter, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createscatter, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createscatter, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createscatter, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createscatter, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createscatter, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createscatter, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createscatter, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createscatter, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createscatter, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createscatter, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createscatter, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createscatter, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createscatter, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createscatter, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createscatter, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createscatter, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createscatter, 'scatter', 
+                       (get_late_type('vcs.scatter.GSp'),
+                        "no default"))
+
+    #Module createxvsy
+    reg.add_module(createxvsy,namespace='vcs|Canvas')
+    reg.add_input_port(createxvsy, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createxvsy, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createxvsy, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createxvsy, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))        
+    reg.add_input_port(createxvsy, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createxvsy, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createxvsy, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createxvsy, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createxvsy, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createxvsy, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createxvsy, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createxvsy, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createxvsy, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createxvsy, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createxvsy, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createxvsy, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createxvsy, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createxvsy, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createxvsy, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createxvsy, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createxvsy, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createxvsy, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createxvsy, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createxvsy, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createxvsy, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createxvsy, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createxvsy, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createxvsy, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createxvsy, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createxvsy, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createxvsy, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createxvsy, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createxvsy, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createxvsy, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createxvsy, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createxvsy, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createxvsy, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createxvsy, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createxvsy, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createxvsy, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createxvsy, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createxvsy, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createxvsy, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createxvsy, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createxvsy, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createxvsy, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createxvsy, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createxvsy, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createxvsy, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createxvsy, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createxvsy, 'xvsy', 
+                       (get_late_type('vcs.xvsy.GXY'),
+                        "no default"))
+
+    #Module createxyvsy
+    reg.add_module(createxyvsy,namespace='vcs|Canvas')
+    reg.add_input_port(createxyvsy, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createxyvsy, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createxyvsy, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createxyvsy, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))            
+    reg.add_input_port(createxyvsy, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createxyvsy, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createxyvsy, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createxyvsy, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createxyvsy, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createxyvsy, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createxyvsy, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createxyvsy, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createxyvsy, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createxyvsy, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createxyvsy, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createxyvsy, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createxyvsy, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createxyvsy, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createxyvsy, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createxyvsy, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createxyvsy, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createxyvsy, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createxyvsy, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createxyvsy, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createxyvsy, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createxyvsy, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createxyvsy, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createxyvsy, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createxyvsy, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createxyvsy, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createxyvsy, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createxyvsy, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createxyvsy, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createxyvsy, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createxyvsy, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createxyvsy, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createxyvsy, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createxyvsy, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createxyvsy, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createxyvsy, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createxyvsy, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createxyvsy, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createxyvsy, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createxyvsy, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createxyvsy, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createxyvsy, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createxyvsy, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createxyvsy, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createxyvsy, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createxyvsy, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createxyvsy, 'xyvsy', 
+                       (get_late_type('vcs.xyvsy.GXy'),
+                        "no default"))
+
+    #Module createyxvsx
+    reg.add_module(createyxvsx,namespace='vcs|Canvas')
+    reg.add_input_port(createyxvsx, 'new_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "name of the new graphics method object. If no name is given, then one will be created for use."))
+    reg.add_input_port(createyxvsx, 'source_GM_name', 
+                       (core.modules.basic_modules.String,
+                        "copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object."))
+    reg.add_input_port(createyxvsx, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_output_port(createyxvsx, 'slab_0_out', 
+                        (get_late_type('cdms2.tvariable.TransientVariable'),
+                         "Data at least 2D, last 2 dimensions will be plotted"))            
+    reg.add_input_port(createyxvsx, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(createyxvsx, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(createyxvsx, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(createyxvsx, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(createyxvsx, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(createyxvsx, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createyxvsx, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(createyxvsx, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(createyxvsx, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createyxvsx, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createyxvsx, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(createyxvsx, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(createyxvsx, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(createyxvsx, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(createyxvsx, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(createyxvsx, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(createyxvsx, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(createyxvsx, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(createyxvsx, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(createyxvsx, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(createyxvsx, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(createyxvsx, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(createyxvsx, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(createyxvsx, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(createyxvsx, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(createyxvsx, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(createyxvsx, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(createyxvsx, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(createyxvsx, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(createyxvsx, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createyxvsx, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(createyxvsx, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createyxvsx, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(createyxvsx, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(createyxvsx, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(createyxvsx, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(createyxvsx, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(createyxvsx, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(createyxvsx, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(createyxvsx, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(createyxvsx, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(createyxvsx, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(createyxvsx, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(createyxvsx, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(createyxvsx, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(createyxvsx, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(createyxvsx, 'yxvsx', 
+                       (get_late_type('vcs.yxvsx.GYx'),
+                        "no default"))
+
+    #Module getboxfill
+    reg.add_module(getboxfill,namespace='vcs|Canvas')
+    reg.add_input_port(getboxfill, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getboxfill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getboxfill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getboxfill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getboxfill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getboxfill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getboxfill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getboxfill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getboxfill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getboxfill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getboxfill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getboxfill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getboxfill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getboxfill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getboxfill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getboxfill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getboxfill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getboxfill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getboxfill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getboxfill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getboxfill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getboxfill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getboxfill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getboxfill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getboxfill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getboxfill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getboxfill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getboxfill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getboxfill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getboxfill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getboxfill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getboxfill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getboxfill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getboxfill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getboxfill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getboxfill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getboxfill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getboxfill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getboxfill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getboxfill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getboxfill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getboxfill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getboxfill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getboxfill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getboxfill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getboxfill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getboxfill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getboxfill, 'boxfill', 
+                       (get_late_type('vcs.boxfill.Gfb'),
+                        "no default"))
+
+    #Module getisofill
+    reg.add_module(getisofill,namespace='vcs|Canvas')
+    reg.add_input_port(getisofill, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getisofill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getisofill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getisofill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getisofill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getisofill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getisofill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getisofill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getisofill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getisofill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getisofill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getisofill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getisofill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getisofill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getisofill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getisofill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getisofill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getisofill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getisofill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getisofill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getisofill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getisofill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getisofill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getisofill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getisofill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getisofill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getisofill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getisofill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getisofill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getisofill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getisofill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getisofill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getisofill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getisofill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getisofill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getisofill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getisofill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getisofill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getisofill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getisofill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getisofill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getisofill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getisofill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getisofill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getisofill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getisofill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getisofill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getisofill, 'isofill', 
+                       (get_late_type('vcs.isofill.Gfi'),
+                        "no default"))
+
+    #Module getisoline
+    reg.add_module(getisoline,namespace='vcs|Canvas')
+    reg.add_input_port(getisoline, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getisoline, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getisoline, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getisoline, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getisoline, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getisoline, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getisoline, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getisoline, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getisoline, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getisoline, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getisoline, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getisoline, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getisoline, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getisoline, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getisoline, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getisoline, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getisoline, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getisoline, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getisoline, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getisoline, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getisoline, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getisoline, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getisoline, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getisoline, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getisoline, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getisoline, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getisoline, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getisoline, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getisoline, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getisoline, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getisoline, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getisoline, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getisoline, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getisoline, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getisoline, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getisoline, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getisoline, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getisoline, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getisoline, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getisoline, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getisoline, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getisoline, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getisoline, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getisoline, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getisoline, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getisoline, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getisoline, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getisoline, 'isoline', 
+                       (get_late_type('vcs.isoline.Gi'),
+                        "no default"))
+
+    #Module getoutfill
+    reg.add_module(getoutfill,namespace='vcs|Canvas')
+    reg.add_input_port(getoutfill, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getoutfill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getoutfill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getoutfill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getoutfill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getoutfill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getoutfill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getoutfill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getoutfill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getoutfill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getoutfill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getoutfill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getoutfill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getoutfill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getoutfill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getoutfill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getoutfill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getoutfill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getoutfill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getoutfill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getoutfill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getoutfill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getoutfill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getoutfill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getoutfill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getoutfill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getoutfill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getoutfill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getoutfill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getoutfill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getoutfill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getoutfill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getoutfill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getoutfill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getoutfill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getoutfill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getoutfill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getoutfill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getoutfill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getoutfill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getoutfill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getoutfill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutfill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getoutfill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getoutfill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getoutfill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getoutfill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getoutfill, 'outfill', 
+                       (get_late_type('vcs.outfill.Gfo'),
+                        "no default"))
+
+    #Module getoutline
+    reg.add_module(getoutline,namespace='vcs|Canvas')
+    reg.add_input_port(getoutline, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getoutline, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getoutline, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getoutline, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getoutline, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getoutline, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getoutline, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getoutline, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getoutline, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getoutline, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getoutline, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getoutline, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getoutline, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getoutline, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getoutline, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getoutline, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getoutline, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getoutline, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getoutline, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getoutline, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getoutline, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getoutline, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getoutline, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getoutline, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getoutline, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getoutline, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getoutline, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getoutline, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getoutline, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getoutline, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getoutline, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getoutline, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getoutline, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getoutline, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getoutline, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getoutline, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getoutline, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getoutline, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getoutline, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getoutline, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getoutline, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getoutline, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getoutline, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getoutline, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getoutline, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getoutline, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getoutline, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getoutline, 'outline', 
+                       (get_late_type('vcs.outline.Go'),
+                        "no default"))
+
+    #Module getscatter
+    reg.add_module(getscatter,namespace='vcs|Canvas')
+    reg.add_input_port(getscatter, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getscatter, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getscatter, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getscatter, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getscatter, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getscatter, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getscatter, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getscatter, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getscatter, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getscatter, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getscatter, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getscatter, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getscatter, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getscatter, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getscatter, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getscatter, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getscatter, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getscatter, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getscatter, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getscatter, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getscatter, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getscatter, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getscatter, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getscatter, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getscatter, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getscatter, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getscatter, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getscatter, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getscatter, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getscatter, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getscatter, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getscatter, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getscatter, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getscatter, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getscatter, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getscatter, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getscatter, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getscatter, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getscatter, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getscatter, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getscatter, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getscatter, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getscatter, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getscatter, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getscatter, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getscatter, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getscatter, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getscatter, 'scatter', 
+                       (get_late_type('vcs.scatter.GSp'),
+                        "no default"))
+
+    #Module getxvsy
+    reg.add_module(getxvsy,namespace='vcs|Canvas')
+    reg.add_input_port(getxvsy, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getxvsy, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getxvsy, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getxvsy, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getxvsy, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getxvsy, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getxvsy, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getxvsy, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getxvsy, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getxvsy, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getxvsy, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getxvsy, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getxvsy, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getxvsy, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getxvsy, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getxvsy, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getxvsy, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getxvsy, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getxvsy, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getxvsy, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getxvsy, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getxvsy, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getxvsy, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getxvsy, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getxvsy, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getxvsy, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getxvsy, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getxvsy, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getxvsy, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getxvsy, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getxvsy, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getxvsy, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getxvsy, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getxvsy, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getxvsy, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getxvsy, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getxvsy, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getxvsy, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getxvsy, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getxvsy, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getxvsy, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getxvsy, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getxvsy, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getxvsy, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getxvsy, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getxvsy, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getxvsy, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getxvsy, 'xvsy', 
+                       (get_late_type('vcs.xvsy.GXY'),
+                        "no default"))
+
+    #Module getxyvsy
+    reg.add_module(getxyvsy,namespace='vcs|Canvas')
+    reg.add_input_port(getxyvsy, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getxyvsy, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getxyvsy, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getxyvsy, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getxyvsy, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getxyvsy, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getxyvsy, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getxyvsy, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getxyvsy, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getxyvsy, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getxyvsy, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getxyvsy, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getxyvsy, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getxyvsy, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getxyvsy, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getxyvsy, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getxyvsy, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getxyvsy, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getxyvsy, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getxyvsy, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getxyvsy, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getxyvsy, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getxyvsy, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getxyvsy, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getxyvsy, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getxyvsy, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getxyvsy, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getxyvsy, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getxyvsy, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getxyvsy, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getxyvsy, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getxyvsy, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getxyvsy, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getxyvsy, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getxyvsy, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getxyvsy, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getxyvsy, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getxyvsy, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getxyvsy, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getxyvsy, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getxyvsy, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getxyvsy, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getxyvsy, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getxyvsy, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getxyvsy, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getxyvsy, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getxyvsy, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getxyvsy, 'xyvsy', 
+                       (get_late_type('vcs.xyvsy.GXy'),
+                        "no default"))
+
+    #Module getyxvsx
+    reg.add_module(getyxvsx,namespace='vcs|Canvas')
+    reg.add_input_port(getyxvsx, 'GM_name', 
+                       (core.modules.basic_modules.String,
+                        "retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method."))
+    reg.add_input_port(getyxvsx, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(getyxvsx, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(getyxvsx, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(getyxvsx, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(getyxvsx, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(getyxvsx, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getyxvsx, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(getyxvsx, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(getyxvsx, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getyxvsx, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getyxvsx, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(getyxvsx, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(getyxvsx, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(getyxvsx, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(getyxvsx, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(getyxvsx, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(getyxvsx, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(getyxvsx, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(getyxvsx, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(getyxvsx, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(getyxvsx, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(getyxvsx, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(getyxvsx, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(getyxvsx, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(getyxvsx, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(getyxvsx, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(getyxvsx, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(getyxvsx, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(getyxvsx, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(getyxvsx, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getyxvsx, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(getyxvsx, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getyxvsx, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(getyxvsx, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(getyxvsx, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(getyxvsx, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(getyxvsx, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(getyxvsx, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(getyxvsx, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(getyxvsx, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(getyxvsx, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(getyxvsx, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(getyxvsx, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(getyxvsx, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(getyxvsx, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(getyxvsx, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(getyxvsx, 'yxvsx', 
+                       (get_late_type('vcs.yxvsx.GYx'),
+                        "no default"))
+
+    #Module isofill
+    reg.add_module(isofill,namespace='vcs|Canvas')
+    reg.add_input_port(isofill, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_input_port(isofill, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(isofill, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))    
+    reg.add_input_port(isofill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(isofill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(isofill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(isofill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(isofill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(isofill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(isofill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(isofill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(isofill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(isofill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(isofill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(isofill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(isofill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(isofill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(isofill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(isofill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(isofill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(isofill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(isofill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(isofill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(isofill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(isofill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(isofill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(isofill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(isofill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(isofill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(isofill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(isofill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(isofill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(isofill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(isofill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(isofill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(isofill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(isofill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(isofill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(isofill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(isofill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(isofill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(isofill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(isofill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(isofill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(isofill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(isofill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(isofill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(isofill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(isofill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(isofill, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module isoline
+    reg.add_module(isoline,namespace='vcs|Canvas')
+    reg.add_input_port(isoline, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_input_port(isoline, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(isoline, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))    
+    reg.add_input_port(isoline, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(isoline, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(isoline, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(isoline, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(isoline, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(isoline, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(isoline, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(isoline, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(isoline, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(isoline, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(isoline, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(isoline, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(isoline, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(isoline, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(isoline, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(isoline, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(isoline, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(isoline, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(isoline, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(isoline, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(isoline, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(isoline, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(isoline, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(isoline, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(isoline, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(isoline, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(isoline, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(isoline, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(isoline, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(isoline, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(isoline, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(isoline, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(isoline, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(isoline, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(isoline, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(isoline, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(isoline, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(isoline, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(isoline, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(isoline, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(isoline, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(isoline, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(isoline, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(isoline, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(isoline, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(isoline, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(isoline, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module outfill
+    reg.add_module(outfill,namespace='vcs|Canvas')
+    reg.add_input_port(outfill, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_input_port(outfill, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(outfill, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))    
+    reg.add_input_port(outfill, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(outfill, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(outfill, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(outfill, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(outfill, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(outfill, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(outfill, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(outfill, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(outfill, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(outfill, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(outfill, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(outfill, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(outfill, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(outfill, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(outfill, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(outfill, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(outfill, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(outfill, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(outfill, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(outfill, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(outfill, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(outfill, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(outfill, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(outfill, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(outfill, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(outfill, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(outfill, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(outfill, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(outfill, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(outfill, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(outfill, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(outfill, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(outfill, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(outfill, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(outfill, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(outfill, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(outfill, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(outfill, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(outfill, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(outfill, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(outfill, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(outfill, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(outfill, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(outfill, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(outfill, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(outfill, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(outfill, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module outline
+    reg.add_module(outline,namespace='vcs|Canvas')
+    reg.add_input_port(outline, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 2D, last 2 dimensions will be plotted"))
+    reg.add_input_port(outline, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(outline, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))
+    reg.add_input_port(outline, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(outline, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(outline, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(outline, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(outline, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(outline, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(outline, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(outline, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(outline, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(outline, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(outline, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(outline, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(outline, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(outline, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(outline, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(outline, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(outline, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(outline, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(outline, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(outline, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(outline, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(outline, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(outline, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(outline, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(outline, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(outline, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(outline, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(outline, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(outline, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(outline, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(outline, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(outline, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(outline, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(outline, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(outline, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(outline, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(outline, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(outline, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(outline, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(outline, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(outline, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(outline, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(outline, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(outline, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(outline, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(outline, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(outline, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(outline, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(outline, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(outline, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(outline, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(outline, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(outline, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(outline, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module plot
+    reg.add_module(plot,namespace='vcs|Canvas')
+    reg.add_input_port(plot, 'row',
+                       (core.modules.basic_modules.Integer, "Cell Row"))
+    reg.add_input_port(plot, 'col',
+                       (core.modules.basic_modules.Integer, "Cell Col"))
+    reg.add_input_port(plot, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(plot, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))
+    reg.add_input_port(plot, 'plot_type', 
+                       (core.modules.basic_modules.String,
+                        "Type of plot - boxfill, isoline, etc"))
+    reg.add_input_port(plot, 'slab2_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    reg.add_input_port(plot, 'slab1_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    
+    reg.add_input_port(plot, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(plot, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(plot, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(plot, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(plot, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(plot, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(plot, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(plot, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(plot, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(plot, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(plot, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(plot, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(plot, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(plot, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(plot, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(plot, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(plot, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(plot, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(plot, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(plot, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(plot, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(plot, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(plot, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(plot, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(plot, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(plot, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(plot, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(plot, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(plot, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(plot, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(plot, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(plot, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(plot, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(plot, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(plot, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(plot, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(plot, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(plot, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(plot, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(plot, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(plot, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(plot, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(plot, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(plot, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(plot, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(plot, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(plot, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(plot, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(plot, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(plot, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(plot, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(plot, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(plot, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(plot, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module scatter
+    reg.add_module(scatter,namespace='vcs|Canvas')
+    reg.add_input_port(scatter, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(scatter, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))        
+    reg.add_input_port(scatter, 'slab2_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    reg.add_input_port(scatter, 'slab1_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))    
+    reg.add_input_port(scatter, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(scatter, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(scatter, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(scatter, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(scatter, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(scatter, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(scatter, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(scatter, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(scatter, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(scatter, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(scatter, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(scatter, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(scatter, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(scatter, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(scatter, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(scatter, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(scatter, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(scatter, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(scatter, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(scatter, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(scatter, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(scatter, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(scatter, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(scatter, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(scatter, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(scatter, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(scatter, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(scatter, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(scatter, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(scatter, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(scatter, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(scatter, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(scatter, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(scatter, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(scatter, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(scatter, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(scatter, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(scatter, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(scatter, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(scatter, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(scatter, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(scatter, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(scatter, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(scatter, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(scatter, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(scatter, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(scatter, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module xvsy
+    reg.add_module(xvsy,namespace='vcs|Canvas')
+    reg.add_input_port(xvsy, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(xvsy, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))        
+    reg.add_input_port(xvsy, 'slab2_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    reg.add_input_port(xvsy, 'slab1_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    reg.add_input_port(xvsy, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(xvsy, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(xvsy, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(xvsy, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(xvsy, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(xvsy, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(xvsy, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(xvsy, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(xvsy, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(xvsy, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(xvsy, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(xvsy, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(xvsy, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(xvsy, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(xvsy, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(xvsy, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(xvsy, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(xvsy, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(xvsy, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(xvsy, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(xvsy, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(xvsy, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(xvsy, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(xvsy, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(xvsy, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(xvsy, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(xvsy, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(xvsy, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(xvsy, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(xvsy, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(xvsy, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(xvsy, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(xvsy, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(xvsy, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(xvsy, 'yaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting yaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(xvsy, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(xvsy, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(xvsy, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(xvsy, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(xvsy, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(xvsy, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(xvsy, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(xvsy, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(xvsy, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(xvsy, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(xvsy, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(xvsy, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module xyvsy
+    reg.add_module(xyvsy,namespace='vcs|Canvas')
+    reg.add_input_port(xyvsy, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(xyvsy, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))        
+    reg.add_input_port(xyvsy, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    reg.add_input_port(xyvsy, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(xyvsy, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(xyvsy, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(xyvsy, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(xyvsy, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(xyvsy, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(xyvsy, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(xyvsy, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(xyvsy, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(xyvsy, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(xyvsy, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(xyvsy, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(xyvsy, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(xyvsy, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(xyvsy, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(xyvsy, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(xyvsy, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(xyvsy, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(xyvsy, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(xyvsy, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(xyvsy, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(xyvsy, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(xyvsy, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(xyvsy, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(xyvsy, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(xyvsy, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(xyvsy, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(xyvsy, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(xyvsy, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(xyvsy, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(xyvsy, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(xyvsy, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(xyvsy, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(xyvsy, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(xyvsy, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(xyvsy, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(xyvsy, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(xyvsy, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(xyvsy, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(xyvsy, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(xyvsy, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(xyvsy, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(xyvsy, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(xyvsy, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(xyvsy, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(xyvsy, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module yxvsx
+    reg.add_module(yxvsx,namespace='vcs|Canvas')
+    reg.add_input_port(yxvsx, 'template', 
+                       (core.modules.basic_modules.String,
+                        "Name of the template")) 
+    reg.add_input_port(yxvsx, 'gm_name', 
+                       (core.modules.basic_modules.String,
+                        "Name of the graphics method"))        
+    reg.add_input_port(yxvsx, 'slab_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Data at least 1D, last dimension will be plotted"))
+    reg.add_input_port(yxvsx, 'datawc_timeunits', 
+                       (core.modules.basic_modules.String,
+                        "units to use when disaplaying time dimension auto tick"), True)
+    reg.add_input_port(yxvsx, 'long_name', 
+                       (core.modules.basic_modules.String,
+                        "replaces long_name on plot"), True)
+    reg.add_input_port(yxvsx, 'projection_0', 
+                       (core.modules.basic_modules.String,
+                        "projection to use, name or object"), True)
+    reg.add_input_port(yxvsx, 'xticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of x axis"), True)
+    reg.add_input_port(yxvsx, 'xarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis"), True)
+    reg.add_input_port(yxvsx, 'yweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(yxvsx, 'xweights_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "replace xaxis weights used for computing mean"), True)
+    reg.add_input_port(yxvsx, 'warray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of w axis, only if var has more than 4D"), True)
+    reg.add_input_port(yxvsx, 'tunits', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis units on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'ymtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(yxvsx, 'ymtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(yxvsx, 'datawc_x1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of xaxis on plot"), True)
+    reg.add_input_port(yxvsx, 'datawc_x2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of xaxis on plot"), True)
+    reg.add_input_port(yxvsx, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)
+    reg.add_input_port(yxvsx, 'xmtics1_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 1st side of y axis"), True)
+    reg.add_input_port(yxvsx, 'xmtics2_0', 
+                       (core.modules.basic_modules.String,
+                        "dictionary with location of intermediate tics as keys for 2nd side of y axis"), True)
+    reg.add_input_port(yxvsx, 'xbounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of x axis bounds values"), True)
+    reg.add_input_port(yxvsx, 'ybounds_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis bounds values (if exist)"), True)
+    reg.add_input_port(yxvsx, 'datawc_y2', 
+                       (core.modules.basic_modules.Float,
+                        "second value of yaxis on plot"), True)
+    reg.add_input_port(yxvsx, 'wname', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis name on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'file_comment', 
+                       (core.modules.basic_modules.String,
+                        "replaces file_comment on plot"), True)
+    reg.add_input_port(yxvsx, 'datawc_calendar', 
+                       (core.modules.basic_modules.Integer,
+                        "calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar"), True)
+    reg.add_input_port(yxvsx, 'wunits', 
+                       (core.modules.basic_modules.String,
+                        "replace waxis units on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'xrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse x axis"), True)
+    reg.add_input_port(yxvsx, 'ymd', 
+                       (core.modules.basic_modules.String,
+                        "replaces year/month/day on plot"), True)
+    reg.add_input_port(yxvsx, 'yarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of y axis, only if var has more than 1D"), True)
+    reg.add_input_port(yxvsx, 'units', 
+                       (core.modules.basic_modules.String,
+                        "replaces units value on plot"), True)
+    reg.add_input_port(yxvsx, 'yunits', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis units on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'zarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of z axis, only if var has more than 2D"), True)
+    reg.add_input_port(yxvsx, 'xname', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis name on plot"), True)
+    reg.add_input_port(yxvsx, 'tarray_0', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "Values to use instead of t axis, only if var has more than 3D"), True)
+    reg.add_input_port(yxvsx, 'bg_0', 
+                       (core.modules.basic_modules.Boolean,
+                        "plots in background mode"), True)
+    reg.add_input_port(yxvsx, 'bg_1', 
+                       (core.modules.basic_modules.Integer,
+                        "plots in background mode"), True)
+    reg.add_input_port(yxvsx, 'xaxisconvert', 
+                       (core.modules.basic_modules.String,
+                        "converting xaxis linear/log/log10/ln/exp/area_wt"), True)
+    reg.add_input_port(yxvsx, 'zname', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis name on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'hms', 
+                       (core.modules.basic_modules.String,
+                        "replaces hh/mm/ss on plot"), True)
+    reg.add_input_port(yxvsx, 'tname', 
+                       (core.modules.basic_modules.String,
+                        "replace taxis name on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'yname', 
+                       (core.modules.basic_modules.String,
+                        "replace yaxis name on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'ratio_0', 
+                       (core.modules.basic_modules.Integer,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(yxvsx, 'ratio_1', 
+                       (core.modules.basic_modules.String,
+                        "sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks"), True)
+    reg.add_input_port(yxvsx, 'datawc_y1', 
+                       (core.modules.basic_modules.Float,
+                        "first value of yaxis on plot"), True)
+    reg.add_input_port(yxvsx, 'xunits', 
+                       (core.modules.basic_modules.String,
+                        "replace xaxis units on plot"), True)
+    reg.add_input_port(yxvsx, 'name', 
+                       (core.modules.basic_modules.String,
+                        "replaces variable name on plot time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot"), True)
+    reg.add_input_port(yxvsx, 'yticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of y axis"), True)
+    reg.add_input_port(yxvsx, 'yticlabels2_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 2nd side of y axis"), True)
+    reg.add_input_port(yxvsx, 'comment1', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment1 on plot"), True)
+    reg.add_input_port(yxvsx, 'zunits', 
+                       (core.modules.basic_modules.String,
+                        "replace zaxis units on plot (if exists)"), True)
+    reg.add_input_port(yxvsx, 'comment3', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment3 on plot"), True)
+    reg.add_input_port(yxvsx, 'comment2', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment2 on plot"), True)
+    reg.add_input_port(yxvsx, 'xticlabels1_0', 
+                       (core.modules.basic_modules.String,
+                        "values for labels on 1st side of x axis"), True)
+    reg.add_input_port(yxvsx, 'comment4', 
+                       (core.modules.basic_modules.String,
+                        "replaces comment4 on plot"), True)
+    reg.add_input_port(yxvsx, 'yrev', 
+                       (core.modules.basic_modules.Boolean,
+                        "reverse y axis, only if slab has more than 1D"), True)
+    reg.add_output_port(yxvsx, 'display', 
+                       (get_late_type('vcs.displayplot.Dp'),
+                        "no default"))
+
+    #Module png
+    reg.add_module(png,namespace='vcs|Canvas')
+    reg.add_input_port(png, 'file', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(png, 'width', 
+                       (core.modules.basic_modules.Float,
+                        ""))
+    reg.add_input_port(png, 'height', 
+                       (core.modules.basic_modules.Float,
+                        ""))
+    reg.add_input_port(png, 'units', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_output_port(png, 'file', 
+                       (core.modules.basic_modules.File,
+                        "File output"))
+
+    #extra input ports not available in the xml file
+    reg.add_input_port(boxfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createboxfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createisofill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createisoline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createoutfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createoutline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createscatter, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createxvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createxyvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(createyxvsx, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getboxfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getisofill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getisoline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getoutfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getoutline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getscatter, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getxvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getxyvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(getyxvsx, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(isofill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(isoline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(outfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(outline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(plot, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(scatter, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(xvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(xyvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(yxvsx, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_input_port(png, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+
+    #extra output ports not available in the xml file
+    reg.add_output_port(boxfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createboxfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createisofill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createisoline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createoutfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createoutline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createscatter, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createxvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createxyvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(createyxvsx, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getboxfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getisofill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getisoline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getoutfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getoutline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getscatter, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getxvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getxyvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(getyxvsx, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(isofill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(isoline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(outfill, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(outline, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(plot, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(scatter, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(xvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(xyvsy, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(yxvsx, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+    reg.add_output_port(png, 'canvas', 
+                       (Canvas,
+                        "Canvas object"))
+
+    #Module open
+    reg.add_module(open,namespace='cdms2')
+    reg.add_input_port(open, 'uri', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(open, 'mode', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(open, 'template', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(open, 'dods', 
+                       (core.modules.basic_modules.Integer,
+                        ""))
+    reg.add_output_port(open, 'dataset', 
+                       (get_late_type('cdms2.dataset.CdmsFile'),
+                        ""))
+
+    #Module __call__
+    reg.add_module(__call__,namespace='cdms2|dataset')
+    reg.add_input_port(__call__, 'id', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(__call__, 'type', 
+                       (core.modules.basic_modules.String,
+                        "variable, axis, or weighted-axis"))    
+    reg.add_output_port(__call__, 'variable', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        ""))
+
+    #extra input ports not available in the xml file
+    reg.add_input_port(__call__, 'axes',
+                       (core.modules.basic_modules.String, "Axes of variables"))
+    reg.add_input_port(__call__, 'axesOperations',
+                       (core.modules.basic_modules.String, "Axes Operations"))
+    reg.add_input_port(__call__, 'cdmsfile', 
+                       (CdmsFile, "cdmsfile"))
+
+def package_dependencies():
+  return []
+
+def package_requirements():
+    import core.requirements
+    if not core.requirements.python_module_exists('vcs'):
+        raise core.requirements.MissingRequirements('vcs')
+    if not core.requirements.python_module_exists('cdms2'):
+        raise core.requirements.MissingRequirements('cdms2')
+    if not core.requirements.python_module_exists('cdutil'):
+        raise core.requirements.MissingRequirements('cdutil')
+    import vcs, cdms2, cdutil
+
+
diff --git a/contrib/cdat/cdat.sip b/contrib/cdat/cdat.sip
new file mode 100644
index 0000000..f36d87f
--- /dev/null
+++ b/contrib/cdat/cdat.sip
@@ -0,0 +1,36 @@
+%Module coreappwrap 0
+
+%Import QtGui/QtGuimod.sip
+
+class MainWindow : QMainWindow {
+%TypeHeaderCode
+#include <Qt/mainwindow.h>
+%End
+
+public:
+  void paintEvent(QPaintEvent *);
+  virtual bool event(QEvent *);
+  void setupCairo();
+  void unsetupCairo();
+
+public slots:
+  void actionTriggered(QAction*);
+};
+
+class VCSQtManager {
+
+%TypeHeaderCode
+#include <Qt/qti.h>
+%End
+
+public:
+  static bool isCreated();
+  static MainWindow* window(int id);
+  static void sendEvent(int index, QEvent::Type eventType);
+
+public slots:
+
+signals:
+  
+};
+
diff --git a/contrib/cdat/cdat.vt b/contrib/cdat/cdat.vt
new file mode 100644
index 0000000..c375fec
Binary files /dev/null and b/contrib/cdat/cdat.vt differ
diff --git a/contrib/cdat/cdat_cell.py b/contrib/cdat/cdat_cell.py
new file mode 100644
index 0000000..24fbd54
--- /dev/null
+++ b/contrib/cdat/cdat_cell.py
@@ -0,0 +1,291 @@
+from PyQt4 import QtCore, QtGui
+from core.modules.vistrails_module import Module, ModuleError, NotCacheable
+from core.modules.basic_modules import Constant
+from packages.spreadsheet.spreadsheet_controller import spreadsheetController
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_event import DisplayCellEvent
+#from cdatwrap.coreappwrap import VCSQtManager
+import vcs
+import genutil
+import cdutil
+import time
+import api
+import re
+import MV2
+
+""" This file contains all of the classes related to the Vistrails Modules (the
+boxes).  Eventually Variable and GraphicsMethod should be replaced by generating
+the proper graphics method, cdms2, MV2, etc... modules """
+
+# Index into the VCSQtManager window array so we can communicate with the
+# C++ Qt windows which the plots show up in.  If this number is no longer
+# consistent with the number of C++ Qt windows due to adding or removing
+# vcs.init() calls, then when you plot, it will plot into a
+# separate window instead of in the cell and may crash.
+windowIndex = 1 
+
+class Variable(Module):
+    """ Get the updated transient variable """
+    
+    def compute(self):
+        # *** IMPORTANT ***
+        # Once someone figures out how to pass the tvariable object, to this
+        # module none of the computation in this method is necessary 
+        
+        # Check ports
+        if not self.hasInputFromPort('cdmsfile'):
+            raise ModuleError(self, "'cdmsfile' is mandatory.")
+        if not self.hasInputFromPort('id'):
+            raise ModuleError(self, "'id' is mandatory.")
+
+        # Get input from ports
+        cdmsfile = self.getInputFromPort('cdmsfile')
+        id = self.getInputFromPort('id')
+        axes = self.forceGetInputFromPort('axes') # None if no input
+        axesOperations = self.forceGetInputFromPort('axesOperations') # None if no input
+
+        # Get the variable
+        varType = self.getVarType(id, cdmsfile)
+        if (varType == 'variable'):
+            var = cdmsfile.__call__(id)
+        elif (varType == 'axis'):
+            varID = self.getAxisID(id)            
+            axis = getattr(cdmsfile, 'axes')[varID]
+            var = MV2.array(axis)
+            var.setAxis(0, axis)
+        elif (varType == 'weighted-axis'):
+            varID, axisID = self.getVarAndAxisID(id)
+            var = cdmsfile.__call__(varID)            
+            var = genutil.getAxisWeightByName(var, axisID)
+            var.id = varID +'_' + axisID + '_weight'
+        else:
+            var = None
+
+        # Eval the variable with the axes
+        if axes is not None and var is not None:
+            try:
+                kwargs = eval(axes)
+                var = var(**kwargs)
+            except:
+                raise ModuleError(self, "Invalid 'axes' specification", axes)
+
+        # Apply axes ops to the variable
+        if axesOperations is not None:
+            var = self.applyAxesOperations(var, axesOperations)
+
+        self.setResult('variable', var)
+
+    def applyAxesOperations(self, var, axesOperations):
+        """ Apply axes operations to update the slab """
+        try:
+            axesOperations = eval(axesOperations)
+        except:
+            raise TypeError("Invalid string 'axesOperations'")
+
+        for axis in list(axesOperations):
+            if axesOperations[axis] == 'sum':
+                var = cdutil.averager(var, axis="(%s)" % axis, weight='equal',
+                                      action='sum')
+            elif axesOperations[axis] == 'avg':
+                var = cdutil.averager(var, axis="(%s)" % axis, weight='equal')
+            elif axesOperations[axis] == 'wgt':
+                var = cdutil.averager(var, axis="(%s)" % axis)
+            elif axesOperations[axis] == 'gtm':
+                var = genutil.statistics.geometricmean(var, axis="(%s)" % axis)
+            elif axesOperations[axis] == 'std':
+                var = genutil.statistics.std(var, axis="(%s)" % axis)                
+                
+        return var
+
+    def getVarType(self, varID, file):
+        if varID in list(getattr(file, 'variables')):
+            return 'variable'
+        elif varID in list(getattr(file, 'axes')):
+            return 'axis'
+        elif re.compile('(.+)(_)(.+)(_)axis').match(varID):
+            return 'axis'
+        elif re.compile('(.+)(_)(.+)(_)weight').match(varID):
+            return 'weighted-axis'        
+
+    def getVarAndAxisID(self, varID):
+        """ Get the varID and axisID from a string with format:
+        varID_axisID_weight """
+        
+        match = re.compile('(.+)(_)(.+)(_)(weight)').match(varID)
+        if match:
+            return (match.group(1), match.group(3))
+
+        return None
+
+    def getAxisID(self, varID):
+        """ Get the axisID from a string with format: varID_axisID_axis """
+
+        match = re.compile('(.+)(_)(.+)(_)(axis)').match(varID)
+        if match:
+            return match.group(3)
+
+        return varID
+
+class Quickplot(Variable):
+    """ Quickplot is identical to Variable except we will only have a single
+    quickplot module in a pipeline. """
+
+    def foo(self):
+        return
+
+class GraphicsMethod(Module, NotCacheable):
+    """ GraphicsMethod initializes the vcs canvas and gets the graphics method
+    and modify it's attributes """
+    
+    def compute(self):
+        # Check required input ports
+        if not self.hasInputFromPort('gmName'):
+            return
+        if not self.hasInputFromPort('plotType'):
+            return
+        if not self.hasInputFromPort('slab1'):
+            return
+        
+        # Get required input
+        gmName = self.getInputFromPort('gmName')
+        plotType = self.getInputFromPort('plotType')
+
+        # GraphicsMethod doesn't need slab1/slab2 as input.  It can be passed
+        # directly to CDATCell but I pass it to graphics method so it looks
+        # nicer in the pipeline.
+        slab1 = self.getInputFromPort('slab1')
+        if self.hasInputFromPort('slab2'):
+            self.setResult('slab2', self.getInputFromPort('slab2'))
+                           
+        # Initialize the canvas and get the graphics method
+        canvas = vcs.init()
+        gm = canvas.get_gm(plotType.lower(), gmName)
+
+        # Modify the graphics method's attributes
+        if self.hasInputFromPort('color_1'):
+            gm.color_1 = self.getInputFromPort('color_1')
+        if self.hasInputFromPort('color_2'):
+            gm.color_2 = self.getInputFromPort('color_2')
+        if self.hasInputFromPort('level_1'):
+            gm.level_1 = self.getInputFromPort('level_1')
+        if self.hasInputFromPort('level_2'):
+            gm.level_2 = self.getInputFromPort('level_2')
+        # TODO: more gm attributes ...
+
+        # Add canvas / slab to output Ports
+        self.setResult('slab1', slab1)
+        self.setResult('canvas', canvas)
+
+class CDATCell(SpreadsheetCell, NotCacheable):
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        # Check required input ports
+        if self.hasInputFromPort('canvas'):
+            canvas = self.getInputFromPort('canvas')
+        else:
+            self.cellWidget = self.displayAndWait(QCDATWidget, (None,))
+            self.setResult('canvas', self.cellWidget.canvas)
+            return
+        self.setResult('canvas', canvas)
+        if not self.hasInputFromPort('gmName'):
+            return
+        if not self.hasInputFromPort('plotType'):
+            return
+        if not self.hasInputFromPort('slab1'):
+            return
+        if not self.hasInputFromPort('template'):
+            return
+
+        # Build up the argument list
+        args = []
+        slab1 = self.getInputFromPort('slab1')
+        args.append(self.getInputFromPort('slab1'))
+        if self.hasInputFromPort('slab2'):
+            args.append(self.getInputFromPort('slab2'))
+        args.append(self.getInputFromPort('template'))
+        args.append(self.getInputFromPort('plotType'))
+        args.append(self.getInputFromPort('gmName'))
+
+        # Build up plot keyword args ...
+        kwargs = {}
+        if self.hasInputFromPort('continents'):
+            kwargs['continents'] = self.getInputFromPort('continents')
+        
+        # Set the cell row / col
+        self.location = CellLocation()
+        if self.hasInputFromPort('row'):
+            self.location.row = self.getInputFromPort('row')
+        if self.hasInputFromPort('col'):
+            self.location.col = self.getInputFromPort('col')
+
+        # Plot into the cell
+        inputPorts = (canvas, args, kwargs)
+        self.displayAndWait(QCDATWidget, inputPorts)        
+
+class QCDATWidget(QCellWidget):
+    """ QCDATWidget is the spreadsheet cell widget where the plots are displayed.
+    The widget interacts with the underlying C++, VCSQtManager through SIP.
+    This enables QCDATWidget to get a reference to the Qt MainWindow that the
+    plot will be displayed in and send signals (events) to that window widget.
+    """
+    
+    def __init__(self, parent=None):
+        QCellWidget.__init__(self, parent)
+        self.window = None        
+        self.canvas =  None
+        self.windowIndex = self.getWindowIndex() #index to get QT Window from VCSQtManager
+
+    def getWindowIndex(self):
+        """ Return the index into the VCSQtManager's array of Qt Windows which
+        plots will be displayed in.
+        """
+        global windowIndex
+
+        windowIndex += 1
+        maxWindows = 8
+        if windowIndex > maxWindows:
+            windowIndex = 1
+        return windowIndex
+
+    def updateContents(self, inputPorts):
+        """ Get the vcs canvas, setup the cell's layout, and plot """        
+        spreadsheetWindow = spreadsheetController.findSpreadsheetWindow()
+        spreadsheetWindow.setUpdatesEnabled(False)
+
+        # Set the canvas
+        self.canvas = inputPorts[0]
+        if self.canvas is None:
+            self.canvas = vcs.init()
+        self.canvas.clear()
+
+        # Place the mainwindow that the plot will be displayed in, into this
+        # cell widget's layout
+        self.window = VCSQtManager.window(self.windowIndex)
+        layout = QtGui.QVBoxLayout()
+        layout.addWidget(self.window)
+        self.setLayout(layout)        
+
+        # Plot
+        if len(inputPorts) > 2:
+            args = inputPorts[1]
+            kwargs = inputPorts[2]
+            self.canvas.plot(*args, **kwargs)
+
+        spreadsheetWindow.setUpdatesEnabled(True)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        """
+        self.canvas = None
+        QCellWidget.deleteLater(self)    
+
diff --git a/contrib/cdat/cdat_window.py b/contrib/cdat/cdat_window.py
new file mode 100644
index 0000000..03ade10
--- /dev/null
+++ b/contrib/cdat/cdat_window.py
@@ -0,0 +1,2356 @@
+from PyQt4 import QtCore, QtGui
+from cdat_cell import QCDATWidget
+from gui_controller import *
+from graphics_method_controller import QGraphicsMethodAttributeWindow
+import cdutil
+import genutil
+import cdms2
+import MV2
+import os
+import re
+import api
+import vcs
+
+class QCDATWindow(QtGui.QWidget):
+    """ Main class for VCDAT Window. Contains a menu widget, file widget,
+    defined variable widget, and variable widget """
+
+    def __init__(self, parent=None):
+        """ Instantiate the child widgets of the main VCDAT window and setup
+        the overall layout """
+        QtGui.QWidget.__init__(self, parent)
+        
+        self.setWindowTitle('The Visual Climate Data Analysis Tools - (VCDAT)')
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+
+        # Init Menu Widget
+        self.menuWidget = QMenuWidget(self)
+
+        # Init File Widget
+        vsplitter  = QtGui.QSplitter(QtCore.Qt.Vertical)        
+        fileWidget = QLabeledWidgetContainer(QCDATFileWidget(),
+                                             'FILE VARIABLES')
+        vsplitter.addWidget(fileWidget)
+
+        # Init Defined Variables Widget
+        definedVar = QLabeledWidgetContainer(QDefinedVariable(),
+                                             'DEFINED VARIABLES')
+        vsplitter.addWidget(definedVar)
+        hsplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
+        hsplitter.addWidget(vsplitter)
+
+        # Init Var Plotting Widget
+        varView = QLabeledWidgetContainer(QVariableView(),
+                                          'PLOTTING')
+        hsplitter.addWidget(varView)
+        hsplitter.setStretchFactor(1, 1)
+        layout.addWidget(hsplitter)
+
+        # Init guiController
+        guiController = GuiController(fileWidget.getWidget(),
+                                      definedVar.getWidget(),
+                                      varView.getWidget())
+        guiController.initTeachingCommands()
+        self.guiController = guiController # So guicontroller doesn't get garbage collected
+
+        # Connect signals between self & GuiController
+        self.connect(self, QtCore.SIGNAL('setRecordCommands'),
+                     guiController.setRecordCommands)
+        self.connect(self, QtCore.SIGNAL('viewTeachingCommands'),
+                     guiController.viewTeachingCommands)
+        self.connect(self, QtCore.SIGNAL('closeTeachingCommands'),
+                     guiController.closeTeachingCommands)        
+
+        # Connect Signals between QVariableView & QDefinedVariable
+        varView.connect(definedVar.getWidget(), QtCore.SIGNAL('selectDefinedVariableEvent'),
+                        varView.getWidget().selectDefinedVariableEvent)
+        varView.connect(definedVar.getWidget(), QtCore.SIGNAL('setupDefinedVariableAxes'),
+                        varView.getWidget().setupDefinedVariableAxes)
+        definedVar.connect(varView.getWidget(), QtCore.SIGNAL('plotPressed'),
+                           definedVar.getWidget().defineQuickplot)
+        definedVar.connect(varView.getWidget(), QtCore.SIGNAL('defineVariable'),
+                           definedVar.getWidget().defineVariable)
+
+        # Connect Signals between QFileWidget & QVariableView
+        varView.connect(fileWidget.getWidget(), QtCore.SIGNAL('variableChanged'),
+                        varView.getWidget().setupDefinedVariableAxes)
+        varView.connect(fileWidget.getWidget(), QtCore.SIGNAL('defineVariableEvent'),
+                        varView.getWidget().defineVariableEvent)
+
+    def closeEvent(self, event):
+        # TODO
+        # closeEvent() isn't called vistrails is closed,
+        # perhaps because the event isn't propagated by vistrails? Therefore,
+        # any functionality we want to execute when vistrails exits is not done
+        # unless the user specifically closes this gui.
+        
+        self.emit(QtCore.SIGNAL('closeTeachingCommands'))
+
+    def sizeHint(self):
+        return QtCore.QSize(1024, 600)
+
+class QFileDialogWidget(QtGui.QFileDialog):
+    
+    def __init__(self, parent=None):
+        QtGui.QFileDialog.__init__(self, parent, QtCore.Qt.Widget)
+        self.setModal(False)
+        self.setSizeGripEnabled(False)
+        self.setFileMode(QtGui.QFileDialog.ExistingFile)
+        self.setLabelText(QtGui.QFileDialog.LookIn, 'Directory')
+        self.setSidebarUrls([QtCore.QUrl('file://')])
+
+        gridLayout = self.findChild(QtGui.QGridLayout, 'gridLayout')
+        if gridLayout:
+            gridLayout.setMargin(0)
+            gridLayout.setVerticalSpacing(0)
+            gridLayout.setColumnStretch(1, 1)
+            hBoxLayout = gridLayout.itemAtPosition(0, 1).layout()
+            if hBoxLayout:
+                hBoxLayout.setSpacing(0)
+        
+        # Hide the Back and Forward button
+        backButton = self.findChild(QtGui.QToolButton, 'backButton')
+        if backButton: backButton.hide()
+        forwardButton = self.findChild(QtGui.QToolButton, 'forwardButton')
+        if forwardButton: forwardButton.hide()            
+        
+        # Hide the File Name indicators
+        fileNameLabel = self.findChild(QtGui.QLabel, 'fileNameLabel')
+        if fileNameLabel: fileNameLabel.hide()
+        fileNameEdit = self.findChild(QtGui.QLineEdit, 'fileNameEdit')
+        if fileNameEdit: fileNameEdit.hide()
+
+        # Hide the File Type indicators
+        fileTypeLabel = self.findChild(QtGui.QLabel, 'fileTypeLabel')
+        if fileTypeLabel: fileTypeLabel.hide()
+        fileTypeCombo = self.findChild(QtGui.QComboBox, 'fileTypeCombo')
+        if fileTypeCombo: fileTypeCombo.hide()
+
+        # Hide the dialog buttons
+        buttonBox = self.findChild(QtGui.QDialogButtonBox, 'buttonBox')
+        buttonBox.hide()
+
+        # Adjust the sidebar width
+        splitter = self.findChild(QtGui.QSplitter, 'splitter')
+        splitter.setSizes([0, 1])
+
+        # Simplify the Details view to List View
+        stackedWidget = splitter.widget(1).findChild(QtGui.QStackedWidget, 'stackedWidget')
+        listView = stackedWidget.widget(0).findChild(QtGui.QListView, 'listView')
+        listView.setAlternatingRowColors(True)
+        listView.setWrapping(False)
+        self.setViewMode(QtGui.QFileDialog.List)
+
+    def done(self, result):
+        pass
+
+    def sizeHint(self):
+        return QtCore.QSize(384, 150)
+
+class QCDATFileWidget(QtGui.QWidget):
+    """ QCDATFileWidget contains a line-edit to enter the file name and a file
+    selection button.  It also has a combo box to choose variables once a file
+    is specified. """
+
+    FILTER = "CDAT data (*.cdms *.ctl *.dic *.hdf *.nc *.xml)"
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.cdmsFile = None
+
+        # Start the layout
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+        layout.setMargin(0)
+
+        self.fileDialog = QFileDialogWidget()
+        self.fileDialog.setNameFilter(QCDATFileWidget.FILTER)
+        layout.addWidget(self.fileDialog)
+
+        # A shared layout of the bottom half
+        vbox = QtGui.QVBoxLayout()
+        vbox.setMargin(0)
+        vbox.setSpacing(0)
+        layout.addLayout(vbox)
+        self.fileVarLayout = vbox
+        
+        # Create the bottom horizontal indicator
+        hbox = QtGui.QHBoxLayout()
+        
+        self.drawerButton = QtGui.QToolButton()
+        self.drawerButton.setArrowType(QtCore.Qt.UpArrow)
+        self.drawerButton.setAutoRaise(True)
+        self.drawerButton.setIconSize(QtCore.QSize(8, 8))
+        hbox.addWidget(self.drawerButton)
+        
+        hline = QtGui.QFrame()
+        hline.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Sunken)
+        hbox.addWidget(hline)
+
+        self.connect(self.drawerButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.toggleFileDialog)
+
+        vbox.addLayout(hbox)
+        
+        # Create the file name box
+        grid = QtGui.QGridLayout()
+        grid.setHorizontalSpacing(10)
+        vbox.addLayout(grid)
+
+        # First line: File
+        fileNameLabel = QtGui.QLabel('File')
+        grid.addWidget(fileNameLabel)
+
+        hbox = QtGui.QHBoxLayout()
+        hbox.setSpacing(6)
+        self.fileNameEdit = QtGui.QLineEdit()
+        self.fileNameEdit.setToolTip('Enter file name or click on button on the right to select a file')
+        hbox.addWidget(self.fileNameEdit, 1)
+
+        self.fileSelectButton = QtGui.QToolButton()
+        self.fileSelectButton.setText('...')
+        self.fileSelectButton.setToolTip('View and select files')
+        hbox.addWidget(self.fileSelectButton)
+        
+        grid.addLayout(hbox, 0, 1)
+
+        # Second line: Var
+        varNameLabel = QtGui.QLabel('Variable')
+        grid.addWidget(varNameLabel, 1, 0)
+
+        hbox = QtGui.QHBoxLayout()
+        hbox.setSpacing(6)
+
+        # Init combo box
+        self.varCombo = QtGui.QComboBox()
+        self.varCombo.setToolTip('View and select variables in file')
+        self.varCombo.setMinimumContentsLength(10)
+        comboPalette = self.varCombo.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.white)
+        comboPalette.setColor(QtGui.QPalette.Highlight, QtCore.Qt.blue)        
+        self.varCombo.view().setPalette(comboPalette)
+
+        hbox.addWidget(self.varCombo, 1)
+        
+        self.defineVarButton = QtGui.QPushButton('&Define')
+        self.defineVarButton.setToolTip('Define variable into memory')
+        hbox.addWidget(self.defineVarButton)
+        
+        grid.addLayout(hbox, 1, 1)
+
+        # Connect signals
+        self.connect(self.fileDialog, QtCore.SIGNAL('filesSelected(const QStringList&)'),
+                     self.filesSelected)
+        self.connect(self.fileNameEdit, QtCore.SIGNAL('returnPressed()'),
+                     self.updateCDMSFile)
+        self.connect(self.fileSelectButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.openSelectFileDialog)
+        self.connect(self.varCombo, QtCore.SIGNAL('currentIndexChanged(const QString&)'),
+                     self.variableChanged)
+        self.connect(self.defineVarButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.defineVariablePressed)
+
+        # Init the widget with its file dialog hidden
+        self.fileDialog.hide()
+        self.setFileName('')
+        self.varCombo.setCurrentIndex(1)
+
+    def updateSizeConstraints(self):
+        isDialogVisible = self.fileDialog.isVisible()
+        if isDialogVisible:
+            self.drawerButton.setArrowType(QtCore.Qt.UpArrow)
+            self.setMaximumHeight(16777215)
+        else:
+            self.drawerButton.setArrowType(QtCore.Qt.DownArrow)
+            self.setMaximumHeight(self.fileVarLayout.contentsRect().height())
+        self.fileSelectButton.setVisible(not isDialogVisible)
+
+    def toggleFileDialog(self, ignored=False):
+        self.fileDialog.setVisible(not self.fileDialog.isVisible())
+        self.updateSizeConstraints()
+
+    def showEvent(self, e):
+        self.updateSizeConstraints()
+        self.variableChanged(self.varCombo.currentText())
+
+    def setFileName(self, fn):
+        self.fileNameEdit.setText(fn)
+        self.updateCDMSFile()
+
+    def updateCDMSFile(self):
+        fn = str(self.fileNameEdit.text())
+        fi = QtCore.QFileInfo(fn)
+        if fi.exists():
+            self.fileDialog.setDirectory(fi.dir())
+            self.cdmsFile = cdms2.open(fn)
+            self.recordOpenFileTeachingCommand(fn)
+            # Create and update the open module
+            self.emit(QtCore.SIGNAL('createModule'), open_name)
+            self.emit(QtCore.SIGNAL('updateModule'), open_name, 'uri', fn)
+        else:
+            self.cdmsFile = None
+        self.updateVariableList()
+
+    def recordOpenFileTeachingCommand(self, file):
+        openFileComment = '\n# Open CDMS File\n'
+        varName = 'fid2'
+        command = "%s = cdms2.open('%s')\n" %(varName, file)
+
+        self.emit(QtCore.SIGNAL('recordTeachingCommand'), openFileComment)
+        self.emit(QtCore.SIGNAL('recordTeachingCommand'), command)
+
+    def filesSelected(self, files):
+        if files.count()>0:
+            self.setFileName(files[0])
+            
+    def updateVariableList(self):
+        self.varCombo.clear()
+        if self.cdmsFile!=None:
+            # Add Variables sorted based on their dimensions
+            curDim = -1
+            for (dim, varId) in sorted([(len(var.listdimnames()), var.id)
+                                        for var in self.cdmsFile.variables.itervalues()]):
+                if dim!=curDim:
+                    curDim = dim
+                    count = self.varCombo.count()
+                    self.varCombo.insertSeparator(count)
+                    self.varCombo.model().item(count, 0).setText('%dD VARIABLES' % dim)
+                var = self.cdmsFile.variables[varId]
+                varName = var.id + ' ' + str(var.shape) + ' ['
+                
+                if hasattr(var, 'long_name'):
+                    varName += var.long_name
+                if hasattr(var, 'units') and var.units!='':
+                    if varName[-1]!='[': varName += ' '
+                    varName += var.units
+                varName += ']'
+                self.varCombo.addItem(varName, QtCore.QVariant(QtCore.QStringList(['variables', var.id])))
+
+            # Add Axis List
+            count = self.varCombo.count()
+            self.varCombo.insertSeparator(count)
+            self.varCombo.model().item(count, 0).setText('AXIS LIST')
+            for axis in self.cdmsFile.axes.itervalues():
+                axisName = axis.id + " (" + str(len(axis)) + ") - [" + axis.units + ":  (" + str(axis[0]) + ", " + str(axis[-1]) + ")]"                
+                self.varCombo.addItem(axisName, QtCore.QVariant(QtCore.QStringList(['axes', axis.id])))
+
+            # By default, not selecting anything
+            self.varCombo.setCurrentIndex(-1)
+
+    def openSelectFileDialog(self):
+        file = QtGui.QFileDialog.getOpenFileName(self, 'Open CDAT data file...',
+                                                 self.fileDialog.directory().absolutePath(),
+                                                 QCDATFileWidget.FILTER + ';;All files (*.*)')
+        if not file.isNull():
+            self.setFileName(file)
+
+    def variableChanged(self, varName):
+        if varName == '':
+            return
+
+        self.defineVarButton.setEnabled(not varName.isNull()) # Enable define button
+        
+        # Send signal to setup axisList in 'quickplot' tab
+        self.emit(QtCore.SIGNAL('variableChanged'), self.getCDMSFile(),
+                  self.getCDMSVariable(), 'quickplot')
+        
+    def defineVariablePressed(self):
+        self.emit(QtCore.SIGNAL('defineVariableEvent'))
+
+    def getCDMSFile(self):
+        return self.cdmsFile
+
+    def getCDMSVariable(self):
+        if not self.cdmsFile is None:
+            data = self.varCombo.itemData(self.varCombo.currentIndex()).toStringList()
+            if data.count() > 0:
+                if data[0] == 'variables':
+                    return getattr(self.cdmsFile, str(data[0]))[str(data[1])]
+                elif data[0] == 'axes':
+                    axis = getattr(self.cdmsFile, str(data[0]))[str(data[1])]
+                    var = MV2.array(axis)
+                    var.setAxis(0, axis)
+                    var.id = axis.id
+                    return var
+        return None
+
+class QLabeledWidgetContainer(QtGui.QWidget):
+    """ Container widget for the 3 main widgets: QVariableView, QCDATFileWidget,
+    and QDefinedVariable """
+
+    def __init__(self, widget, label='', parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        
+        vbox = QtGui.QVBoxLayout()
+        vbox.setMargin(0)
+        
+        self.label = QtGui.QLabel(label)
+        self.label.setAutoFillBackground(True)
+        self.label.setAlignment(QtCore.Qt.AlignCenter)
+        self.label.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised)
+        vbox.addWidget(self.label, 0)
+
+        if widget!=None:
+            self.widget = widget
+        else:
+            self.widget = QtGui.QWidget()
+        vbox.addWidget(self.widget, 1)
+        
+        self.setLayout(vbox)
+
+    def getWidget(self):
+        return self.widget
+
+    def event(self, e):
+        if e.type()==76: #QtCore.QEvent.LayoutRequest:
+            self.setMaximumHeight(min(self.label.height()+self.layout().spacing()+
+                                      self.widget.maximumHeight(), 16777215))
+        return False
+
+class QDefinedVariable(QtGui.QWidget):
+    """ QDefinedVariable contains a list of the user defined variables and allows the
+    user to apply functions on defined variables """
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.warningWidget = QDefVarWarningBox(self) # Popup box to warn var is already defined
+        self.quickplotItem = None
+        self.numVarsSelected = 0
+
+        # Create Layout
+        vbox = QtGui.QVBoxLayout()
+        vbox.setMargin(0)
+        self.setLayout(vbox)
+
+        # Create Toolbar and add it to the layout
+        self.createToolbar()
+        vbox.addWidget(self.toolBar)
+
+        # Create List for defined variables and add it to the layout
+        self.varList = QtGui.QListWidget()
+        self.varList.setAlternatingRowColors(True)
+        self.varList.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
+        vbox.addWidget(self.varList)
+
+        # Connect Signals
+        self.connect(self.varList, QtCore.SIGNAL('clicked(const QModelIndex&)'),
+                     self.selectVariableFromListEvent)
+        self.connect(self.warningWidget, QtCore.SIGNAL('newVarID'),
+                     self.addVariable)      
+
+    def defineQuickplot(self, file, var):
+        """ When a user plots a variable that isn't explicitly defined a signal
+        is emitted and this function is called to define the variable under
+        the name 'quickplot'.  Replace the 'quickplot' variable if it
+        already exists
+        """
+        if self.quickplotItem is None:
+            self.quickplotItem = QDefinedVariableItem(file, var, 'quickplot')
+            self.varList.addItem(self.quickplotItem)
+        else:
+            self.quickplotItem.setVariable(var)
+            self.quickplotItem.setFile(file)            
+
+    def defineVariable(self, file, var, axesArgString):
+        """ Check if a variable with the same name has already been defined.
+        If so, warn user and prompt for a new variable name.  Otherwise,
+        add the variable to the ListWidget
+        """
+        if self.isVariableDefined(var.id):
+            self.warningWidget.showWarning(var.id, file, var, axesArgString)
+        else:
+            self.addVariable(var.id, file, var, axesArgString)
+
+    def addVariable(self, varName, file, var, axesArgString):
+        """ Add variable into dict / list & emit signal to create
+        a tab for the variable
+        """
+        # If the variable is defined, replace existing variable, else create a new variable
+        if self.isVariableDefined(varName):
+            item = self.getItem(varName)
+            item.setVariable(var)
+            item.setFile(file)
+        else:
+            item = QDefinedVariableItem(file, var, varName)
+            self.varList.addItem(item)
+
+        # Recording define variable teaching command
+        self.recordDefineVariableTeachingCommand(varName, var.id, file, axesArgString)
+
+        # emit signal to QVariableView to create a new axisList / tab
+        self.emit(QtCore.SIGNAL('setupDefinedVariableAxes'), file, var, varName)
+
+    def selectVariableFromListEvent(self, modelIndex):
+        """ Update the number next to the selected defined variable and
+        send a signal to QVariableView to display the selected variable
+        """
+        item = self.varList.item(modelIndex.row())
+        selectedItems = self.varList.selectedItems()
+
+        # If the item is unselected then change the selection str back to '--'
+        # and decrement all the numbers of the other selected vars that are
+        # less than the number of the item that was unselected
+        if item not in selectedItems:
+            unselectedNum = item.getSelectNum()            
+            item.updateVariableString(None)
+            self.numVarsSelected -= 1
+            
+            for item in selectedItems:
+                num = item.getSelectNum()
+                if num > unselectedNum:
+                    item.updateVariableString(item.getSelectNum() - 1)
+        # If item is selected, change the selection str to a number
+        else:
+            self.numVarsSelected += 1
+            item.updateVariableString(self.numVarsSelected)
+
+        # Send signal of all selected vars to qvariableview and bring up the
+        # most recently selected variable's tab
+        var = item.getVariable()
+        cdmsFile = item.getFile()
+        selectedVars = [item.getVariable() for item in selectedItems]
+        tabName = item.getVarName()
+        
+        if item.isQuickplotItem():
+            self.emit(QtCore.SIGNAL('selectDefinedVariableEvent'), 'quickplot',
+                      cdmsFile, selectedVars)
+        else:
+            self.emit(QtCore.SIGNAL('selectDefinedVariableEvent'), tabName,
+                      cdmsFile, selectedVars)
+
+    def isVariableDefined(self, varID):
+        """ Return true if a variable with the given id is defined (this does
+        not include 'quickplot' """
+        
+        for i in range(self.varList.count()):
+            item = self.varList.item(i)
+            if varID == item.getVariable().id and not item.isQuickplotItem():
+                return True
+        return False
+
+    def getItem(self, varID):
+        """ Return the item with the defined variable with name = varID """
+        for i in range(self.varList.count()):
+            listItem = self.varList.item(i)
+            if varID == listItem.getVariable().id:
+                return listItem
+        return None  
+
+    def recordDefineVariableTeachingCommand(self, name, varName, file, axesArgString):
+        if varName in list(getattr(file, 'variables')):
+            fileID = "fid2"            
+            command = '\n# Get new slab\n'
+            command += "%s = %s('%s', %s)\n" %(name, fileID, varName, axesArgString)        
+
+            self.emit(QtCore.SIGNAL('recordTeachingCommand'), command)
+
+    def createToolbar(self):
+        ICONPATH = os.path.join(cdms2.__path__[0], '..', '..', '..', '..', 'bin')
+
+        # Create options bar
+        self.toolBar = QtGui.QToolBar()
+        self.toolBar.setIconSize(QtCore.QSize(16, 16))
+        actionInfo = [
+            ('edit_20.gif', 'Edit (in memory) selected defined variable.'),
+            ('save_20.gif', 'Save selected defined variable to a netCDF file.'),
+            ('info_20.gif', 'Display selected defined variable information.'),
+            ('editdelete_20.gif', 'Move selected defined variable(s) to trashcan for disposal.'),
+            ('recycle_20.gif', 'Move [ALL] defined variables to trashcan for disposal.'),
+            ('log_20.gif', 'Logged information about the defined variables.'),
+            ('trashcan_empty_20.gif', 'Defined variable items that can be disposed of permanetly or restored.'),
+            ]
+        
+        for info in actionInfo:
+            icon = QtGui.QIcon(os.path.join(ICONPATH, info[0]))
+            action = self.toolBar.addAction(icon, '')
+            action.setStatusTip(info[1])
+            action.setToolTip(info[1])
+        self.toolBar.addSeparator()
+
+        self.opButton = QtGui.QToolButton()
+        self.opButton.setText('Ops')
+        
+        # Create Operations Menu
+        menu = QtGui.QMenu(self)
+        grid = QtGui.QGridLayout()
+        grid.setMargin(0)
+        grid.setSpacing(0)
+        menu.setLayout(grid)
+        opDefs =[
+            ['Add a number or two (or more)\nselected Defined Variables.\n(Can be used as "or")','add.gif','add'],
+            ['Subtract a number or two (or more)\nselected Defined Variables.','subtract.gif','subtract'],
+            ['Multiply a number or two (or more)\nselected Defined Variables.\n(Can be used as "and")','multiply.gif','multiply'],
+            ['Divide a number or two (or more)\nselected Defined Variables.','divide.gif','divide'],
+            ['"Grows" variable 1 and variable 2 so that they end up having the same dimensions\n(order of variable 1 plus any extra dims)','grower.gif','grower'],
+            ['Spatially regrid the first selected Defined Variable\nto the second selected Defined Variable.','regrid.gif','regrid'],
+            ['Mask variable 2 where variable 1 is "true".','mask.gif','mask'],
+            ['Get variable mask','getmask.gif','getmask'],
+            ['Return true where variable 1 is less than variable 2 (or number)','less.gif','less'],
+            ['Return true where variable 1 is greater than variable 2 (or number)','greater.gif','greater'],
+            ['Return true where variable 1 is equal than variable 2 (or number)','equal.gif','equal'],
+            ['Return not of variable','not.gif','not'],
+            ['Compute the standard deviation\n(over first axis)','std.gif','std'],
+            ['Power (i.e., x ** y) of the most recently\nselected two Defined Variables, where\nx = variable 1 and y = variable 2 or float number.','power.gif','power'],
+            ['Exp (i.e., e ** x) of the most recently\nselected Defined Variable.','exp.gif','exp'],
+            ['Log (i.e., natural log) of the most recently\nselected Defined Variable.','mlog.gif','log'],
+            ['Base10 (i.e., 10 ** x) of the most recently\nselected Defined Variable.','base10.gif','base10'],
+            ['Log10 (i.e., log base 10) of the most\nrecently selected Defined Variable. ','mlog10.gif','log10'],
+            ['Inverse (i.e., 1/x) of the most recently\nselected Defined Variable.','inverse.gif','inverse'],
+            ['Abs (i.e., absolute value of x) of the most\nrecently selected Defined Variable.','fabs.gif','fabs'],
+            ['Sine (i.e., sin) of the most recently\nselected Defined Variable.','sin.gif','sin'],
+            ['Hyperbolic sine (i.e., sinh) of the most recently\nselected Defined Variable.','sinh.gif','sinh'],
+            ['Cosine (i.e., cos) of the most recently\nselected Defined Variable.','cos.gif', 'cos'],
+            ['Hyperbolic cosine (i.e., cosh) of the most recently\nselected Defined Variable.','cosh.gif','cosh'],
+            ['Tangent (i.e., tan) of the most recently\nselected Defined Variable.','tan.gif','tan'],
+            ['Hyperbolic tangent (i.e., tanh) of the most recently\nselected Defined Variable.','tanh.gif','tanh'],
+            ]
+        self.opActions = []
+        for i in xrange(len(opDefs)):
+            action = QtGui.QAction(QtGui.QIcon(os.path.join(ICONPATH, opDefs[i][1])), opDefs[i][2], menu)
+            action.setStatusTip(opDefs[i][0])
+            action.setToolTip(opDefs[i][0])
+            self.opActions.append(action)
+            b = QtGui.QToolButton()
+            b.setDefaultAction(action)
+            grid.addWidget(b, i/2, i%2)
+
+        self.opButton.setMenu(menu)
+        self.opButton.setPopupMode(QtGui.QToolButton.InstantPopup)
+        self.connect(self.opButton, QtCore.SIGNAL('clicked(bool)'), self.opButton.showMenu)
+        
+        self.toolBar.addWidget(self.opButton)
+
+class QDefinedVariableItem(QtGui.QListWidgetItem):
+    """ Item to be stored by QDefinedVariable's list widget """
+    
+    def __init__(self, cdmsFile, variable, varName, parent=None):
+        QtGui.QListWidgetItem.__init__(self, parent)
+        self.varName = varName # This is also the tabname
+        self.cdmsFile = cdmsFile
+        self.variable = variable
+        
+        self.updateVariableString()
+
+    def getVariable(self):
+        return self.variable
+
+    def getVarName(self):
+        return self.varName
+
+    def getFile(self):
+        return self.cdmsFile
+
+    def getSelectNum(self):
+        return self.selectNum
+        
+    def isQuickplotItem(self):
+        return self.varName == 'quickplot'
+
+    def updateVariableString(self, num=None):
+        """ updateVariableString(num: int)
+
+        Update the variable string that is shown to the user in the list.
+        format =  '-- variableName (shape)', where num is the selection number
+        """
+        if num is None:
+            self.selectNum = -1
+            numString = '-- '
+        elif 0 < num < 10:
+            self.selectNum = num
+            numString = "-%s " % num
+        else:
+            self.selectNum = num
+            numString = "%s " % num
+
+        varString = numString + self.varName + ' ' + str(self.variable.shape)
+        self.setData(0, QtCore.QVariant(QtCore.QString(varString)))
+
+    def setFile(self, cdmsFile):
+        self.cdmsFile = cdmsFile
+        
+    def setVariable(self, variable):
+        """ Set the variable and update the variable string that is shown to the
+        user in the list
+        """
+        self.variable = variable
+        self.updateVariableString()
+
+class QDefVarWarningBox(QtGui.QDialog):
+    """ Popup box to warn a user that a variable with same name is already
+    defined. Contains a line edit to allow a user to enter a new variable
+    name or to replace the existing defined variable """
+
+    def __init__(self, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        self.varID = None
+
+        # Init layout
+        vbox = QtGui.QVBoxLayout()
+        hbox = QtGui.QHBoxLayout()
+        hbox.setDirection(QtGui.QBoxLayout.RightToLeft)
+        vbox.setSpacing(10)
+
+        # Add LineEdit
+        self.text = QtGui.QLabel()
+        self.lineEdit = QtGui.QLineEdit()
+
+        # Add OK / Cancel Buttons
+        okButton = QtGui.QPushButton('OK')
+        cancelButton = QtGui.QPushButton('Cancel')
+        hbox.addWidget(cancelButton)        
+        hbox.addWidget(okButton)
+
+        vbox.addWidget(self.text)
+        vbox.addWidget(self.lineEdit)
+        vbox.addLayout(hbox)
+        self.setLayout(vbox)
+
+        # Connect Signals
+        self.connect(okButton, QtCore.SIGNAL('pressed()'), self.okPressedEvent)
+        self.connect(cancelButton, QtCore.SIGNAL('pressed()'), self.close)
+        self.connect(self.lineEdit, QtCore.SIGNAL('returnPressed()'), self.okPressedEvent)
+
+    def showWarning(self, varID, file, var, axesArgString):
+        """ Show warning message and prompt user for a new variable name. Or use
+        the same var name to replace the existing defined variable """
+        
+        self.varID = varID
+        self.file = file
+        self.var = var
+        self.axesArgString = axesArgString
+        
+        message = "'%s' has already been defined.  Enter a new variable name \n or press 'OK' to replace '%s'" %(varID, varID)
+        self.text.setText(message)
+        self.lineEdit.setText(varID)
+
+        self.open()
+
+    def okPressedEvent(self):
+        self.varID = self.lineEdit.text() # get the user entered variable name
+        self.close()        
+
+        # Emit signal to QDefinedVar to indicate it's ok to add the variable to defined list
+        self.emit(QtCore.SIGNAL('newVarID'),
+                  self.varID, self.file, self.var, self.axesArgString)
+
+class QSliderCombo(QtGui.QWidget):
+    """ Widget containing min slider, max slider, min label, max label, and a
+    corresponding combo box.  The comboBox, labels, sliders must always be in
+    sync with each other """
+
+    def __init__(self, axis, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.isTime = axis.isTime()
+        self.indexMode = False
+        self.startIndex = 0
+
+        # Init Layout
+        hbox = QtGui.QHBoxLayout()
+        vbox = QtGui.QVBoxLayout()
+        vbox.setSpacing(0)
+        vbox.setMargin(0)        
+        self.setLayout(hbox)
+
+        # Init combo box
+        self.axisCombo = QAxisComboWidget()
+        hbox.addWidget(self.axisCombo)
+
+        # Init sliders
+        hbox.addLayout(vbox)
+        self.topSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
+        self.bottomSlider = QtGui.QSlider(QtCore.Qt.Horizontal)        
+        vbox.addWidget(self.topSlider)
+        vbox.addWidget(self.bottomSlider)
+
+        # Init axis slider value labels
+        self.bottomLabel = QtGui.QLabel('To', self)
+        self.topLabel = QtGui.QLabel('From', self)
+        hbox = QtGui.QHBoxLayout()        
+        hbox.addWidget(self.topLabel)
+        hbox.addWidget(self.bottomLabel)
+        vbox.addLayout(hbox)
+
+        # Initialize the sliders' and comboBox's values
+        self.initAxisValues(axis)
+        self.setSlidersMinMax()
+        self.topSlider.setValue(self.minIndex)
+        self.bottomSlider.setValue(self.maxIndex)
+        self.axisCombo.initValues(self.axisValues)
+
+        # Connect Signals
+        self.connect(self.topSlider, QtCore.SIGNAL('valueChanged (int)'),
+                     self.updateMin)
+        self.connect(self.bottomSlider, QtCore.SIGNAL('valueChanged (int)'),
+                     self.updateMax)
+        self.connect(self.axisCombo,
+                     QtCore.SIGNAL('axisComboMinValueChanged (int)'),
+                     self.updateTopSlider)
+        self.connect(self.axisCombo,
+                     QtCore.SIGNAL('axisComboMaxValueChanged (int)'),
+                     self.updateBottomSlider)
+
+    def initAxisValues(self, axis):
+        """ Initialize list containing the axis values and set the top slider /
+        combobox value to be the min value and the bottom slider / combobox
+        value to be the max value"""
+        
+        if (axis != None):
+            if self.isTime:
+                self.axisValues = [repr(t.tocomponent())
+                                   for t in axis.asRelativeTime()]
+            else:
+                self.axisValues = axis.getValue()
+        else:
+            raise TypeError("Error: axis is not defined")
+
+        self.axisIndices = range(len(self.axisValues))
+        self.updateMin(0)
+        self.updateMax(len(self.axisValues) - 1)
+
+    def setStartIndex(self, index):
+        self.startIndex = index
+
+    def setIndexMode(self, mode):
+        """ Set the indexMode to True or False.  If indexMode is True the widget
+        will display indices.  If indexMode is False the widget will display
+        actual values """
+        self.indexMode = mode
+
+    def setSlidersMinMax(self):
+        self.topSlider.setMinimum(self.minIndex)
+        self.bottomSlider.setMinimum(self.minIndex)
+        self.topSlider.setMaximum(self.maxIndex)
+        self.bottomSlider.setMaximum(self.maxIndex)
+
+    def updateMin(self, minIndex=None):
+        """ Set min value, update the slider label and the comboBox line edit
+        to show the new min value"""
+        
+        if not minIndex is None:
+            self.minIndex = minIndex
+            
+        if (self.indexMode == True):
+            minValue = self.minIndex + self.startIndex
+        else:
+            minValue = self.axisValues[self.minIndex]
+            
+        self.topLabel.setText(str(minValue))
+        self.axisCombo.setMinValue(minValue)
+
+    def updateMax(self, maxIndex=None):
+        """ Set max value, update the slider label and the comboBox line edit
+        to show the new max value"""
+        
+        if not maxIndex is None:
+            self.maxIndex = maxIndex
+            
+        if (self.indexMode == True):
+            maxValue = self.maxIndex + self.startIndex
+        else:
+            maxValue = self.axisValues[self.maxIndex]
+
+        self.bottomLabel.setText(str(maxValue))
+        self.axisCombo.setMaxValue(maxValue)
+
+    def updateTopSlider(self, index):
+        self.minIndex = index
+        self.topSlider.setValue(index)
+
+    def updateBottomSlider(self, index):
+        self.maxIndex = index
+        self.bottomSlider.setValue(index)
+
+    def replaceComboBoxValues(self, values):
+        self.axisCombo.replaceComboBoxValues(values)
+
+    def getAxisIndices(self):
+        return self.axisIndices
+    
+    def getAxisValues(self):
+        return self.axisValues
+
+    def getCurrentValues(self):
+        return (self.axisValues[self.minIndex], self.axisValues[self.maxIndex])
+
+    def getCurrentValuesAsStr(self):
+        if self.isTime:
+            return "('%s', '%s')" % (self.axisValues[self.minIndex],
+                                     self.axisValues[self.maxIndex])
+        else:
+            return "(%s, %s)" % (self.axisValues[self.minIndex],
+                                 self.axisValues[self.maxIndex])
+
+    def numValues(self):
+        return len(self.axisValues)
+
+    def getIndex(self):
+        return (self.minIndex, self.maxIndex)
+
+class QAxis(QtGui.QWidget):
+    """ Axis widget containing: a button + popup-menu for modifying an axis, combobox
+    and sliders for setting axis values, and a function def button + popup-menu """
+
+    def __init__(self, axis, axisName, axisIndex, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.myParent = parent
+        self.axis = axis
+        self.axisName = axisName # Axis name including the label
+        self.axisIndex = axisIndex
+
+        hbox = QtGui.QHBoxLayout()
+        hbox.setSpacing(0)
+        hbox.setMargin(0)                
+        self.sliderCombo = QSliderCombo(axis, self)
+        hbox.addWidget(self.sliderCombo)
+        self.setLayout(hbox)        
+
+        # These buttons aren't added to the layout here, instead they are added
+        # in QAxisList which has a grid layout so they can line up properly
+        self.axisOperationsButton = self.createAxisOperationsButtonAndMenu()
+        self.axisButton = self.createAxisButtonAndMenu()
+
+        # Connect signals such that when the value of the axis slider is changed,
+        # a signal will be emitted to update the value in the corresponding
+        # Vistrails 'Variable' or 'Quickplot' box.
+        self.connect(self.sliderCombo.topSlider,
+                     QtCore.SIGNAL('valueChanged (int)'),
+                     parent.setVistrailsVariableAxes)
+        self.connect(self.sliderCombo.bottomSlider,
+                     QtCore.SIGNAL('valueChanged (int)'),
+                     parent.setVistrailsVariableAxes)
+
+    def createAxisOperationsButtonAndMenu(self):
+        """ Initialize the button to the right of the axis sliders and it's menu
+        with operations: def, sum, avg, wgt, gtm, awt, std
+        """
+        button = QtGui.QToolButton()
+        menu = QtGui.QMenu(self)        
+        
+        opDefs = ['def default axis points',
+                  'sum summation of selected axis points',
+                  'avg average of selected axis points',
+                  'wgt weighted average of selected axis points',
+                  'awt altered weighted average of selected axis points',
+                  'gtm geometrical mean of selected axis points',
+                  'std standard deviation of selected axis points',]
+        
+        for op in opDefs:
+            action = menu.addAction(op)
+            self.connect(action, QtCore.SIGNAL('triggered ()'),
+                         self.selectAxesOperationEvent)
+
+        button.setText(' def  ')
+        button.setMenu(menu)
+        button.setPopupMode(QtGui.QToolButton.InstantPopup)
+
+        # Connect Signals
+        self.connect(button, QtCore.SIGNAL('clicked(bool)'),
+                     button.showMenu)
+
+        return button
+
+    def selectAxesOperationEvent(self):
+        """ Event handler for when a user selects an operation from the
+        axes operations popup menu (located to right of the sliders):
+        sum, avg, awt, gtm, etc ...
+        """
+        # Get the operation selected by getting the text of who sent the signal
+        op = self.sender().text()[:3] # def, sum, avg, wgt, awt, gtm, or std
+
+        # If the operation is 'awt' ask the user for an alternate weight var
+        if op == 'awt':
+            definedVars = self.myParent.getParent().getDefinedVars()
+            QReplaceAxisWeightsDialog(definedVars, self).show()
+            return
+
+        # Set button text to what the user selected
+        self.axisOperationsButton.setText(" %s  " % op)
+
+        # Update the vistrails 'Variable' module's axesOperations input
+        axesOperations = self.myParent.getAxesOperations()
+        varWidget = self.myParent.getParent()
+        varWidget.emit(QtCore.SIGNAL('updateModule'),
+                       self.myParent.currentTabName(), 'axesOperations',
+                       str(axesOperations)) 
+
+    def createAxisButtonAndMenu(self):
+        """ createAxisButtonAndMenu(axesNames: list)
+
+        Initialize the button to the left of the sliders / combo box and
+        it's menu which currently has options: index, raw, get axis values,
+        get axis weight values, replace axis values, re-order dimensions.
+        """
+        axisMenu = QtGui.QMenu(self)
+        menuVbox = QtGui.QVBoxLayout()
+        axisMenu.setLayout(menuVbox)
+        
+
+        # Add index options to the menu
+        indexAction = axisMenu.addAction(self.axis.id + '_index')
+        indexAction.setCheckable(True)
+
+        # Add raw index option if this dimension is time
+        if self.axis.isTime():
+            rawIndexAction = axisMenu.addAction(self.axis.id + '_raw')
+            rawIndexAction.setCheckable(True)
+        
+        axisMenu.addSeparator()
+
+        # Add axis value options to the menu
+        axisOptions = ['Get Axis Values', 'Get Axis Weight Values',
+                       'Replace Axis Values']
+        getAxisValuesAction = axisMenu.addAction(axisOptions[0])
+        getAxisWeightValuesAction = axisMenu.addAction(axisOptions[1])
+        replaceAxisValuesAction = axisMenu.addAction(axisOptions[2])
+
+        # Add 're-order dimensions' option to menu
+        axisMenu.addSeparator()
+        reorderAxesMenu = axisMenu.addMenu('Re-Order Dimensions')
+        axesNames = self.myParent.getAxesNames()                
+        for axisID in axesNames:
+            reorderAction = reorderAxesMenu.addAction(axisID)
+            self.connect(reorderAction, QtCore.SIGNAL('triggered()'),
+                         self.reorderAxesEvent)
+
+        # Create axis button
+        axisButton = QtGui.QToolButton()
+        axisButton.setMenu(axisMenu)
+        axisButton.setPopupMode(QtGui.QToolButton.InstantPopup)
+
+        # Connect signals emitted by the axis button menu
+        axisButton.connect(axisButton, QtCore.SIGNAL('clicked(bool)'),
+                           axisButton.showMenu)
+        self.connect(indexAction, QtCore.SIGNAL('toggled (bool)'),
+                     self.setIndexModeEvent)
+        self.connect(getAxisValuesAction, QtCore.SIGNAL('triggered ()'),
+                     self.getAxisValuesEvent)
+        self.connect(replaceAxisValuesAction, QtCore.SIGNAL('triggered ()'),
+                     self.getReplacementAxisValuesEvent)        
+        self.connect(getAxisWeightValuesAction, QtCore.SIGNAL('triggered ()'),
+                     self.getAxisWeightValuesEvent)
+        
+        if self.axis.isTime():
+            self.connect(rawIndexAction, QtCore.SIGNAL('toggled (bool)'),
+                         self.setRawIndexModeEvent)
+            # Dont allow _raw and _index to be checked simultaneously
+            self.connect(rawIndexAction, QtCore.SIGNAL('toggled (bool)'),
+                         lambda : indexAction.setChecked(False))
+            self.connect(indexAction, QtCore.SIGNAL('toggled (bool)'),
+                         lambda : rawIndexAction.setChecked(False))                        
+            
+        return axisButton
+
+    def reorderAxesEvent(self):
+        """ reorderAxesEvent is called when the user selects 're-order
+        dimensions from the axis button. Swap this axis with the selected axis
+        and update the vistrails' Variable module's 'axes' input
+        """
+        axisB = self.sender().text()
+        self.myParent.swapAxes(self.axisName, axisB)
+        self.myParent.setVistrailsVariableAxes()
+
+    def getReplacementAxisValuesEvent(self):
+        """ getReplacementAxisValuesEvent is called when the user selects
+        'Replace Axis Values' Show a dialog box which asks the user to select
+        a defined variable for replacement axis values
+        """
+        definedVars = self.myParent.getParent().getDefinedVars()
+        QReplaceAxisValuesDialog(definedVars, self).show()
+        
+    def replaceAxisValues(self, newValuesVar):
+        """ replaceAxisValues(newValuesVar: tvariable)
+
+        replaceAxisValues is called after the user selects 'Replace Axis Values'
+        and selects a replacement variable from the popup dialog.  This method
+        replaces the axis' values with 'newValuesVar'
+        """
+        # TODO doesn't work
+        var = self.myParent.getVar()
+        axis = var.getAxis(self.axisIndex)
+        axis[:] = newValuesVar.astype(axis[:].dtype.char).filled()
+        axis.setBounds(None)
+        self.myParent.setVar(var)
+
+        # Generate teaching command string
+        # TODO
+
+    def getAxisWeightValuesEvent(self):
+        """ getAxisWeightValuesEvent is called when the user selects 'Get Axis
+        Weight Values' from the axis button menu.  This method will create and
+        define a new variable / tab with the axis' weight values
+        """
+        var = self.myParent.getVar()
+        axisVar = genutil.getAxisWeightByName(var, self.axis.id)
+        axisVar.id = var.id +'_' + self.axis.id + '_weight'
+
+        # Generate teaching command string
+        fileID = 'fid2'
+        teachingCommand = "\n## Getting axis %s\n" % self.axis.id
+        teachingCommand += "%s = genutil.getAxisWeightByName(%s[\"%s\"], \"%s\")\n" % (axisVar.id, fileID, var.id, self.axis.id)
+        teachingCommand += "%s.id = \"%s\"\n" % (axisVar.id, axisVar.id)
+
+        # Record teaching commands associate 'get axis weight values' and
+        # define a new variable/tab with only the axis' weight values
+        self.myParent.defineVarAxis(axisVar, teachingCommand)
+
+    def getAxisValuesEvent(self):
+        """ getAxisValuesEvent is called when the user selects 'Get Axis
+         Values' from the axis button menu.  This method will create and
+        define a new variable / tab with the axis' values
+        """        
+        varID = self.myParent.getVar().id
+        axisVar = MV2.array(self.axis)
+        axisVar.setAxis(0, self.axis)
+        axisVar.id = varID +'_' + self.axis.id + '_axis'
+
+        # Generate teaching command string
+        fileID = 'fid2'
+        teachingCommand = "\n## Getting axis %s\n" % self.axis.id
+        teachingCommand += "%s = MV2.array(%s[\"%s\"].getAxisList(axes = \"%s\")[0][:])\n" % (axisVar.id, fileID, varID, self.axis.id)
+        teachingCommand += "%s.setAxis(0, %s[\"%s\"].getAxisList(axes = \"%s\")[0])\n" % (axisVar.id, fileID, varID, self.axis.id)
+        teachingCommand += "%s.id = \"%s\"\n" % (axisVar.id, axisVar.id)
+
+        # Record teaching commands associate 'get axis values' and
+        # define a new variable/tab with only the axis' values        
+        self.myParent.defineVarAxis(axisVar, teachingCommand)
+
+    def setIndexModeEvent(self, indexMode):
+        """ setIndexModeEvent(indexMode: bool)
+
+        If indexMode is True then set the combobox and
+        slider values to be indices.  If indexMode is False then set the
+        combobox and slider values to be the actual axis values.
+        """
+        axisIndices = self.sliderCombo.getAxisIndices()
+        axisValues = self.sliderCombo.getAxisValues()        
+        
+        self.sliderCombo.setIndexMode(indexMode)        
+        if (indexMode == True):
+            self.sliderCombo.setStartIndex(0)
+            self.sliderCombo.replaceComboBoxValues(axisIndices)
+        else:
+            self.sliderCombo.replaceComboBoxValues(axisValues)
+
+        self.sliderCombo.updateMax()
+        self.sliderCombo.updateMin()
+
+    def setRawIndexModeEvent(self, rawIndexMode):
+        """ setRawIndexModeEvent(rawIndexMode: bool)
+        
+        If rawIndexMode is True then set the combobox and
+        slider values to be indices since january 1st 1979.  
+        otherwise set the combobox and slider values to be the actual axis
+        values.
+        """
+        self.sliderCombo.setIndexMode(rawIndexMode)
+        axisValues = self.sliderCombo.getAxisValues()
+        axisIndices = self.sliderCombo.getAxisIndices()
+        
+        if (rawIndexMode == True):
+            # Calculate months since jan 1st, 1979
+            firstTimeEntry = axisValues[0]
+            match = re.compile('(\d\d\d\d)(-)(.+)(-)(.*)').match(firstTimeEntry)
+
+            if match is None:
+                raise NameError("Invalid time string: %s" % firstTimeEntry)
+
+            year = int(match.group(1))
+            month = int(match.group(3))
+            monthsSince1979 = 12 * (year - 1979) + (month - 1)
+            self.sliderCombo.setStartIndex(monthsSince1979)
+
+            # Add months since jan 1979 to indices
+            rawIndices = map(lambda x: x + monthsSince1979, axisIndices)
+            self.sliderCombo.replaceComboBoxValues(rawIndices)
+        else:
+            self.sliderCombo.replaceComboBoxValues(axisValues)
+
+        self.sliderCombo.updateMax()
+        self.sliderCombo.updateMin()
+
+    def sumAxisPoints(self, var):
+        """ Update the variable by applying the sum operation to the given
+        axis. Note this function is called only when a variable is defined.
+        """
+        varID = var.id
+        var = cdutil.averager(var, axis="(%s)" % self.axis.id, weight='equal',
+                              action='sum')        
+        var.id = varID
+        return var
+
+    def avgAxisPoints(self, var):
+        """ Update the variable by applying the avg operation to the given
+        axis.
+        """
+        varID = var.id
+        var = cdutil.averager(var, axis="(%s)" % self.axis.id, weight='equal')
+        var.id = varID
+        return var
+
+    def weightedAvgAxisPoints(self, var):
+        """ Update the variable by applying the weighted avg operation to the
+        the given axis.
+        """
+        varID = var.id
+        var = cdutil.averager(var, axis="(%s)" % self.axis.id)
+        var.id = varID
+        return var
+
+    def geoMeanAxisPoints(self, var):
+        """ Update the variable by applying the geometrical mean operation to
+        the given axis.
+        """
+        varID = var.id
+        var = genutil.statistics.geometricmean(var, axis="(%s)" % self.axis.id)
+        var.id = varID
+        return var
+
+    def stdAxisPoints(self, var):
+        """ Update the variable by applying the standard deviation operation to
+        the given axis.
+        """
+        varID = var.id
+        var = genutil.statistics.std(var, axis="(%s)" % self.axis.id)
+        var.id = varID
+        return var
+
+    def alteredWeightedAvgAxisPoints(self, var):
+        """ Update the variable by applying the altered weighted avg operation
+        to the given axis.
+        """
+        varID = var.id
+        var = cdutil.averager(var, axis="(%s)" % self.axis.id,
+                             weight=self.alteredWeightsVar.filled())
+        var.id = varID
+        return var
+
+    def setAlteredWeights(self, var):
+        self.alteredWeightsVar = var
+        self.axisOperationsButton.setText(' awt  ')
+
+    def setAxisButtonText(self, name):
+        self.axisButton.setText(name + ' ')
+        
+    def getCurrentValues(self):
+        return self.sliderCombo.getCurrentValues()
+
+    def getCurrentValuesAsStr(self):
+        return self.sliderCombo.getCurrentValuesAsStr()
+
+    def numValues(self):
+        return self.sliderCombo.numValues()
+
+    def getIndexes(self):
+        return self.sliderCombo.getIndexes()
+
+    def getID(self):
+        return self.axis.id
+
+    def getAxisOperationsButton(self):
+        return self.axisOperationsButton
+
+    def getAxisButton(self):
+        return self.axisButton
+
+    def getAlteredWeightsVar(self):
+        return self.alteredWeightsVar
+
+class QAxisComboWidget(QtGui.QComboBox):
+    """ Specialized ComboBox widget for Axis Values listing / selecting the
+    axis' values. """
+    
+    def __init__(self, parent=None):
+        QtGui.QComboBox.__init__(self, parent)
+        self.setMin = False
+        self.stride = 1 # TODO : Changing the stride does nothing as of now
+        self.minValue = 0
+        self.maxValue = 0
+
+        self.setMouseTracking(True)
+        self.setEditable(True)
+        self.setMinimumContentsLength(10)
+        self.setCurrentIndex(1)
+        self.setMaxVisibleItems(10)
+        self.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLengthWithIcon)
+
+        # Set highlighted text color to gray instead of default white
+        comboPalette = self.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.darkGray)
+        self.view().setPalette(comboPalette)
+
+        # Connect Signals
+        self.connect(self, QtCore.SIGNAL('currentIndexChanged(const QString&)'),
+                     self.valueChangedEvent)
+
+    def initValues(self, axisValues):
+        """ initValues(axisValues: list)
+
+        Initialize the values in the combo box from a list of axis values.
+        """
+        for axisValue in axisValues:
+            self.addItem(str(axisValue),
+                         QtCore.QVariant(QtCore.QStringList(['variables', str(axisValue)])))
+
+        self.minValue = axisValues[0]
+        self.maxValue = axisValues[-1]
+        self.setLineEditText() # Set lineedit text to be valueA : valueB by stride
+
+    def replaceComboBoxValues(self, axisValues):
+        """ replaceComboBoxValues(axisValues: list)
+
+        Replace the values in the comboBox with new values: raw indices, indices
+        or actual values.
+        """
+        for i in range(len(axisValues)):
+            data = QtCore.QVariant(QtCore.QStringList(['variables', str(axisValues[i])]))
+            self.setItemData(i, data)
+            self.setItemText(i, str(axisValues[i]))
+
+        self.minValue = axisValues[0]
+        self.maxValue = axisValues[-1]
+        self.setLineEditText()
+
+    def setMinValue(self, minValue):
+        self.minValue = minValue
+        self.setLineEditText()
+
+    def setMaxValue(self, maxValue):
+        self.maxValue = maxValue
+        self.setLineEditText()
+        
+    def setLineEditText(self):
+        """ Set the comboBox's lineEdit to show:  minValue : maxValue by stride
+        """
+        self.setEditText(str(self.minValue) + " : " + str(self.maxValue) + " by "
+                         + str(self.stride))
+        self.lineEdit().setCursorPosition(0)
+
+    def valueChangedEvent(self, axisValue):
+        """ valueChangedEvent(axisValue: str)
+
+        Event handler for when a user changes a combobox value by selecting a
+        value or entering a value into the line edit.  Update the corresponding
+        slider / label with the same value
+        """
+        index = self.findData(QtCore.QVariant(QtCore.QStringList(['variables', str(axisValue)])))
+
+        # If user entered a value into the lineEdit.
+        if index == -1:
+            self.updateValueFromLineEditText(axisValue)
+            return
+
+        # If user selected a value from the combo box.
+        # Selecting values from the combo box will alternate between setting the
+        # min and max values & emit a signal to update corresponding slider
+        if (self.setMin == True):
+            self.setMin = False
+            self.minValue = axisValue
+            self.emit(QtCore.SIGNAL('axisComboMinValueChanged (int)'), self.currentIndex())
+        else:
+            self.setMin = True
+            self.maxValue = axisValue
+            self.emit(QtCore.SIGNAL('axisComboMaxValueChanged (int)'), self.currentIndex())
+
+        self.setLineEditText()
+
+    def updateValueFromLineEditText(self, axisValue):
+        """ updateValueFromLineEditText(axisValue: str)
+
+        Check if the user entered a valid string in the line edit and if the
+        values exist. If it is valid & the values exist, set the values in the
+        corresponding slidingAxisWidget so the combobox and sliders match.
+        """
+        # The lineEdit text must have format "ValueA : ValueB by Stride"
+        pattern = re.compile("(.*)\s:\s(.*)\sby\s(\w*)")
+        result = pattern.match(axisValue)
+
+        # If invalid string format, do nothing
+        if (result == None):
+            return
+
+        # Set stride if it is a valid digit
+        # Stride functionality not implemented yet
+        if (str(result.group(3)).isdigit() == True):
+            self.stride = result.group(3)
+
+        minValue = result.group(1)
+        maxValue = result.group(2)
+        minIndex = self.findData(QtCore.QVariant(QtCore.QStringList(['variables', str(minValue)])))
+        maxIndex = self.findData(QtCore.QVariant(QtCore.QStringList(['variables', str(maxValue)])))
+
+        # If min or max values are not in the list of values do nothing
+        if (minIndex == -1 or maxIndex == -1):
+            return
+
+        # LineEdit string is valid, emit signal to update the corresponding axis sliders
+        self.emit(QtCore.SIGNAL('axisComboMinValueChanged (int)'), minIndex)
+        self.emit(QtCore.SIGNAL('axisComboMaxValueChanged (int)'), maxIndex)            
+
+class QAxisList(QtGui.QWidget):
+    """ Widget containing a list of axis widgets for the selected variable """
+
+    def __init__(self, file=None, var=[], parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.axisWidgets = [] # List of QAxis widgets
+        self.axesNames = [] # List of axis names (including labels)
+        self.axisOrder = [] # List of ints to specify axes ordering
+        self.file = file # cdms file associated with the variable
+        self.var = var # variable associated with the axes
+        self.axisList = None # list of axes from the variable
+        self.myParent = parent
+
+        # Init & set the layout
+        vbox = QtGui.QVBoxLayout()
+        self.gridLayout = QtGui.QGridLayout()
+        self.gridLayout.setMargin(0)
+        self.gridLayout.setSpacing(0)
+        vbox.addLayout(self.gridLayout)
+        vbox.addStretch()
+        vbox.setSpacing(0)
+        vbox.setMargin(5)
+        self.setLayout(vbox)
+
+    def clear(self):
+        """ Remove the QAxis widgets, empty axisWidgets and axesNames lists from
+        the grid layout
+        """
+        self.gridLayout.setRowStretch(self.gridLayout.rowCount()-1, 0)
+        for i in reversed(range(self.gridLayout.count())):
+            item = self.gridLayout.itemAt(i)
+            axis = item.widget()
+            if axis:
+                self.gridLayout.removeWidget(axis)
+                axis.hide()
+                axis.deleteLater()
+            else:
+                self.gridLayout.removeItem(item)
+                
+        self.axisWidgets = []
+        self.axesNames = []
+
+    def setupVariableAxes(self):
+        """ Iterate through the variable's axes and create and initialize an Axis
+        object for each axis.
+        """
+        if self.var is None:
+            return
+        
+        if (self.axisList is None):
+            self.axisList = self.var.getAxisList()
+            self.axisOrder = range(len(self.axisList))
+
+        self.clear()            
+        self.setAxesNames()
+        
+        # Iterate through the variables axes & init each axis widget
+        axisIndex = 0
+        for axis, axisName in zip(self.axisList, self.axesNames):
+            # Create the axis widget
+            axisWidget = QAxis(axis, axisName, axisIndex, self)
+            axisWidget.setAxisButtonText(axisName)
+            self.axisWidgets.append(axisWidget)
+
+            # Setup the layout for each axis
+            row = self.gridLayout.rowCount()
+            self.gridLayout.addWidget(axisWidget.getAxisButton(), row, 0)
+            self.gridLayout.addWidget(axisWidget, row, 1)            
+            self.gridLayout.addWidget(axisWidget.getAxisOperationsButton(), row, 2)
+
+            # Create separator line between each axis widget
+            vline = QtGui.QFrame()
+            vline.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Sunken)
+            self.gridLayout.addWidget(vline, row+1, 0, 1,
+                                      self.gridLayout.columnCount())
+
+            axisIndex += 1
+
+        self.gridLayout.setRowStretch(self.gridLayout.rowCount(), 1)
+
+    def defineVarAxis(self, var, teachingCommand):
+        self.myParent.defineVarAxis(var, teachingCommand)
+
+    def swapAxes(self, axisA, axisB):
+        """ swapAxes(axisA: QAxis, axisB: QAxis)
+
+        swap the axis widgets: axisA and axisB
+        """
+        if (axisA == axisB):
+            return
+
+        if axisA in self.axesNames and axisB in self.axesNames:
+            i = self.axesNames.index(axisA)
+            j = self.axesNames.index(axisB)
+            self.axisList[i], self.axisList[j] = self.axisList[j], self.axisList[i]
+            self.axisOrder[i], self.axisOrder[j] = self.axisOrder[j], self.axisOrder[i]
+            self.setupVariableAxes()
+
+    def execAxesOperations(self, var):
+        """ Return the updated variable by doing the 'sum', 'avg', 'wgt', 'awt',
+        'gtm' and 'std' operations.
+        """
+        for axis in self.axisWidgets:
+            op = str(axis.getAxisOperationsButton().text()).strip()
+            if op == 'sum':
+                var = axis.sumAxisPoints(var)
+            elif op == 'avg':
+                var = axis.avgAxisPoints(var)
+            elif op == 'wgt':
+                var = axis.weightedAvgAxisPoints(var)
+            elif op == 'gtm':
+                var = axis.geoMeanAxisPoints(var)
+            elif op == 'std':
+                var = axis.stdAxisPoints(var)
+            elif op == 'awt':
+                var = axis.alteredWeightedAvgAxisPoints(var)
+        return var
+
+    # * At this point in fixing up the code
+
+    def getAxesOperationsTeachingCommands(self, varID):
+        """ Create and return the  teaching commands for the axes operations:
+        def, sum, avg, wgt, awt, gtm, std
+        """
+        commands = ""
+        for axis in self.axisWidgets:
+            axisID = axis.getID()
+            op = str(axis.getAxisOperationsButton().text()).strip()
+            
+            if op == 'sum':
+                commands += "%s=cdutil.averager(%s, axis='(%s)', weight='equal', action='sum')\n" % (varID, varID, axisID)
+                commands += "%s.id = '%s'\n" % (varID, varID)                
+            elif op == 'avg':
+                commands += "%s=cdutil.averager(%s, axis='(%s)', weight='equal')\n" % (varID, varID, axisID)                
+                commands += "%s.id = '%s'\n" % (varID, varID)
+            elif op == 'wgt':
+                commands += "%s=cdutil.averager(%s, axis='(%s)')\n" % (varID, varID, axisID)                
+                commands += "%s.id = '%s'\n" % (varID, varID)
+            elif op == 'awt':
+                alteredWeightsID = axis.getAlteredWeightsVar().id
+                commands += "%s=cdutil.averager(%s, axis='(%s)', weight=%s.filled())" % (varID, varID, axisID, alteredWeightsID)
+                commands += "\n# Currently, VCDAT cannot record the altered average weight command."
+            elif op == 'gtm':
+                commands += "%s=genutil.statistics.geometricmean(%s, axis='(%s)')\n" % (varID, varID, axisID)
+                commands += "%s.id = '%s'\n" % (varID, varID)
+            elif op == 'std':
+                commands += "%s=genutil.statistics.std(%s, axis='(%s)')\n" % (varID, varID, axisID)
+                commands += "%s.id = '%s'\n" % (varID, varID)                                
+        return commands
+
+    def getAxesOperations(self):
+        """ Return a dict where keys are axis names, and values are the
+        operation to be done on the axis such as: def, sum, avg, etc ... """
+        
+        axisOpsDict = {}
+        for axis in self.axisWidgets:
+            op = str(axis.getAxisOperationsButton().text()).strip()
+            axisOpsDict[axis.getID()] = op
+            
+        return axisOpsDict
+
+    def getAxesNames(self):
+        return self.axesNames
+
+    def getAxisWidgets(self):
+        return self.axisWidgets
+
+    def getFile(self):
+        return self.file
+
+    def getFileID(self):
+        return self.file.id
+
+    def getVar(self):
+        return self.var
+
+    def getVarID(self):
+        return self.var.id
+
+    def getParent(self):
+        return self.myParent
+
+    def getAxesOrderString(self):
+        """ Return a string with the axes' order """
+        
+        order = list(self.axisOrder)
+        return ''.join(map(str, order))
+
+    def setAxesNames(self):
+        """ Generate a list with the axis label + axis name and store it in
+        self.axesNames """
+        
+        labels = ['T', 'Z', 'Y', 'X'] + [chr(ord('S')-i) for i in xrange(18)]
+        if (len(self.axisList) >= 4):
+            i = 0
+        else:
+            i = 4 - len(self.axisList)
+            
+        for axis in self.axisList:
+            self.axesNames.append(labels[i] + ' - ' + axis.id)
+            i += 1
+            
+    def setFile(self, cdmsFile):
+        self.file = cdmsFile
+
+    def setVar(self, var):
+        self.var = var
+
+    def currentTabName(self):
+        return self.myParent.currentTabName()
+
+    def setVistrailsVariableAxes(self):
+        """ Vistrails: Update the vistrails Variable modules 'axes' input. This
+        method is called whenever the sliders values are changed.
+        """
+        axesKwargs = {}
+        # Add the each axes' args for example: latitude: (-90, 90)
+        for axisWidget in self.axisWidgets:
+            axesKwargs[axisWidget.axis.id] = axisWidget.getCurrentValues()
+        # Add other args
+        axesKwargs['squeeze'] = 0
+        axesKwargs['order'] = self.getAxesOrderString()
+
+        self.myParent.emit(QtCore.SIGNAL('updateModule'),
+                         self.myParent.currentTabName(), 'axes', str(axesKwargs))
+
+class QVariableView(QtGui.QWidget):
+    """ Main widget containing plotting related information / options. Contains
+    a tab widget with a tab for each defined variable, plotting options widget,
+    and variable information widget """
+    
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.selectedVars = []
+        
+        # Init layout
+        vbox = QtGui.QVBoxLayout()
+        vbox.setMargin(0)
+        self.setLayout(vbox)
+
+        self.plotOptions = QPlotOptionsWidget(self)
+        self.tabWidget = QAxisListTabWidget(self)
+
+        # Init variable information widget
+        self.varInfoWidget = QtGui.QTextEdit()
+        self.varInfoWidget.setText('')
+        self.varInfoWidget.setReadOnly(True)
+
+        # Create splitter for tabWidget and variable information text
+        vsplitter = QtGui.QSplitter(QtCore.Qt.Vertical)
+        vsplitter.addWidget(self.tabWidget)
+        vsplitter.addWidget(self.varInfoWidget)
+        vsplitter.setStretchFactor(1,1)
+        vsplitter.setSizes([300, 100])
+        
+        vbox.addWidget(self.plotOptions)
+        vbox.addWidget(vsplitter)
+
+    def getUpdatedVar(self):
+        """ Return a new tvariable object with the updated information from
+        evaluating the var with the current user selected args / options
+        """
+        axisList = self.tabWidget.currentWidget()
+        kwargs = self.generateKwArgs()
+        updatedVar = axisList.getVar()(**kwargs)
+
+        # Get the variable after carrying out the: def, sum, avg... operations
+        updatedVar = axisList.execAxesOperations(updatedVar)
+
+        return updatedVar
+
+    def generateKwArgs(self, axisList=None):
+        """ Generate and return the variable axes keyword arguments """
+        if axisList is None:
+            axisList = self.tabWidget.currentWidget()
+
+        kwargs = {}        
+        for axisWidget in axisList.getAxisWidgets():
+            kwargs[axisWidget.axis.id] = axisWidget.getCurrentValues()
+
+        # Generate additional args
+        kwargs['squeeze'] = 0
+        kwargs['order'] = axisList.getAxesOrderString()
+
+        return kwargs
+
+    def generateKwargsAsString(self):
+        """ Generate and return the variable axes keyword arguments as a string
+        that is formatted to be used in teaching commands
+        """
+        args = ""
+        axisList = self.tabWidget.currentWidget()
+
+        for axisWidget in axisList.getAxisWidgets():
+            args += "%s = %s, " % (axisWidget.axis.id,
+                                   axisWidget.getCurrentValuesAsStr())
+
+        # Generate additional args
+        args += 'squeeze = 0'
+        args += ", order = '%s' " % axisList.getAxesOrderString()
+        return args
+
+    def updateVarInfo(self, axisList):
+        """ Update the text box with the variable's information """
+        if axisList is None:
+            return
+        
+        var = axisList.getVar()
+        varInfo = ''
+        for line in var.listall():
+            varInfo += line + '\n'
+        self.varInfoWidget.setText(varInfo)
+
+    def setupDefinedVariableAxes(self, cdmsFile, var, tabName):
+        """ Create a new axis list and tab with the specified tab name and setup
+        the axis list.  Initialize the vistrails Variable module associated with
+        the tab and variable.
+        """
+        if var is None:
+            return
+
+        # Create and setup the axislist
+        axisList = QAxisList(cdmsFile, var, self)
+        axisList.setupVariableAxes()
+        self.updateVarInfo(axisList)
+        self.tabWidget.createNewTab(axisList, tabName)
+
+        # Create the vistrails variable module if it doesn't exist, and update
+        # the modules input ports' values
+        if tabName == 'quickplot':
+            self.emit(QtCore.SIGNAL('createModule'), quickplot_name,
+                      quickplot_name.lower())
+        else:
+            self.emit(QtCore.SIGNAL('createModule'), variable_name, tabName)
+        self.emit(QtCore.SIGNAL('updateModule'), tabName, 'id',
+                  var.id)        
+        self.emit(QtCore.SIGNAL('updateModule'), tabName, 'axes',
+                  str(self.generateKwArgs()))
+        self.emit(QtCore.SIGNAL('updateModule'),
+                  tabName, 'axesOperations',
+                  str(axisList.getAxesOperations()))
+
+    def defineVarAxis(self, var, teachingCommand):
+        """ Create a new tab/axisList, store it in defined var list, and record
+        the associated teaching commands.  This method is called when the user
+        clicks on the axisButton -> 'Get Axis Values' """
+        
+        cdmsFile = self.tabWidget.currentWidget().getFile()
+        axisList = QAxisList(cdmsFile, var, self)
+        axisList.setupVariableAxes()
+        argString = self.generateKwargsAsString()
+
+        self.emit(QtCore.SIGNAL('recordTeachingCommand'), teachingCommand)
+        self.emit(QtCore.SIGNAL('defineVariable'), cdmsFile, var, argString)
+
+    def defineVariableEvent(self):
+        """ Get a copy of the updated var and file and pass it to the Defined
+        Variables widget """
+        if self.tabWidget.currentWidget() is None:
+            return
+
+        cdmsFile = self.tabWidget.currentWidget().getFile()        
+        var = self.getUpdatedVar()
+        argString = self.generateKwargsAsString()        
+
+        self.emit(QtCore.SIGNAL('defineVariable'), cdmsFile, var, argString)
+
+    def selectDefinedVariableEvent(self, tabName, cdmsFile, selectedVars):
+        """ Save the list of selected variables and show the selected variable,
+        variables are sorted in least recently selected to most recently selected
+        """
+        if selectedVars != []:
+            self.selectedVars = selectedVars        
+            self.tabWidget.selectAndUpdateDefinedVarTab(tabName, cdmsFile, selectedVars[-1])
+
+    def plot(self):
+        """ Create the graphics method and cdatcell modules. Update the input
+        port values and setup connections. Then plot.
+        """
+        if self.tabWidget.count() == 0:
+            return
+
+        # Error if not enough slabs
+        plotType = str(self.plotOptions.getPlotType())        
+        if len(self.selectedVars) < 2 and self.requiresTwoSlabs(plotType):
+            self.showError('Error Message to User', 'Vector, Scatter, Meshfill or XvsY plots \nmust have two data variables. The data \nvariables must be selected in the \n"Defined Variables" window.')
+            return
+
+        # Create & Update the graphics method / CDATCell vistrails modules
+        # *** IMPORTANT ***
+        # Everytime plot is pressed, this will create a new Graphics Method and
+        # CDATCell Module. Instead it should ONLY create a new graphics method
+        # and CDATCell module if the variable isn't already connected to an
+        # existing Graphics Method / CDATCell module.  This results in plots 
+        # being plotted multiple times.
+        axisList = self.tabWidget.currentWidget()
+        self.emit(QtCore.SIGNAL('createModule'), gm_name)
+        self.emit(QtCore.SIGNAL('createModule'), cdatcell_name)        
+        self.setVistrailsGraphicsMethod() 
+        self.setVistrailsCDATCell()
+
+        # Get the names of the 2 slabs so we can connect their modules in vistrails
+        if self.requiresTwoSlabs(plotType):
+            var1 = self.selectedVars[-1].id
+            var2 = self.selectedVars[-2].id
+        else:
+            var1 = self.currentTabName()
+            var2 = None
+
+        # Emit signal to GuiController to connect ports and plot
+        self.emit(QtCore.SIGNAL('plot'), var1, var2)
+
+        # If a quickplot is plotted, define current variable under 'quickplot'
+        if (self.currentTabName() == 'quickplot'):
+            var = self.getUpdatedVar()
+            self.emit(QtCore.SIGNAL('plotPressed'), axisList.getFile(), var)
+
+        # Record plot teaching commands
+        self.recordPlotTeachingCommand()
+
+    def recordPlotTeachingCommand(self):
+        axisList = self.tabWidget.currentWidget()
+        tabName = self.tabWidget.currentTabName()
+        argString = self.generateKwargsAsString()
+        var = axisList.getVar()
+        fileID = "fid2"
+
+        slabCommand = ''
+        if tabName == 'quickplot':
+            slabCommand += '\n# Get new slab\n'
+            slabCommand += "%s = %s('%s', %s)\n" %(tabName, fileID, var.id, argString)
+
+        slabCommand += '\n# Get new slab\n'
+        slabCommand += "%s = %s(%s)\n" %(tabName, tabName, argString)
+            
+        slabCommand += axisList.getAxesOperationsTeachingCommands(tabName)
+
+        canvasNum = 0 # Change the canvas # with respect to the cell?
+        clearCommand = '\n# Clear the VCS Canvas\n'        
+        clearCommand +=  "vcs_canvas_list[%d].clear()\n" % canvasNum
+
+        plotID = "vcs_display"
+        plotType = str(self.plotOptions.getPlotType())
+        template = self.getTemplateName(plotType)
+        gm = self.getGraphicsMethodName(plotType)                
+        plotArgs = "%s, '%s', '%s', '%s'" % (tabName, template, plotType, gm)
+
+        if self.plotOptions.getContinentType() is not None:
+            plotArgs += ", continents = %d" % self.plotOptions.getContinentType()
+        
+        plotCommand = '\n# Plot slab\n'        
+        plotCommand += "%s = vcs_canvas_list[%d].plot(%s)\n" %(plotID, canvasNum, plotArgs)
+
+        command = slabCommand + clearCommand + plotCommand
+        self.emit(QtCore.SIGNAL('recordTeachingCommand'), command)
+
+    def requiresTwoSlabs(self, plotType):
+        """ Returns true if the plot requires 2 slabs """
+        multiVarPlots = ['Vector', 'Scatter', 'XvsY']
+        return plotType in multiVarPlots
+
+    def getDefinedVars(self):
+        """ Get a list of all of the defined tabnames / variables """
+        numTabs = self.tabWidget.count()
+        varList = []
+        
+        for i in range(numTabs):
+            var = self.tabWidget.widget(i).getVar()
+            name = self.tabWidget.tabText(i)
+            varList.append([name, var])
+
+        return varList
+
+    def getAxisList(self, var):
+        for i in range(self.tabWidget.count()):
+            if self.tabWidget.widget(i).getVar() is var:
+                return self.tabWidget.widget(i)
+
+        return None
+
+    def getTemplateName(self, plotType):
+        """ Return the template given the plotType.  This is currently hardcoded
+        but should change based on the user? """
+
+        # TODO ?
+        return self.getGraphicsMethodName(plotType)
+
+    def getGraphicsMethodName(self, plotType):
+        """ Return the graphics method given the plotType.  This is currently
+        hardcoded but should change based on the user? """
+
+        # TODO ?
+        hasASD = ['Boxfill', 'Isofill', 'Isoline', 'Scatter', 'Taylordiagram']
+        hasquick = ['Vector']
+        hasASD1 = ['Xyvsy', 'Yxvsx']          
+
+        if plotType in hasASD:
+            return 'ASD'
+        if plotType in hasquick:
+            return 'quick'
+        if plotType in hasASD1:
+            return 'ASD1'
+        return 'default'        
+    
+    def setVistrailsCDATCell(self):
+        """ Vistrails: Update the vistrails' CDAT Cell modules' input ports: """
+        
+        visInput = []
+        plotType = str(self.plotOptions.getPlotType())
+
+        visInput.append(('plotType', plotType))
+        visInput.append(('row', str(self.plotOptions.getRow())))
+        visInput.append(('col', str(self.plotOptions.getCol())))
+        visInput.append(('gmName', self.getGraphicsMethodName(plotType)))
+        visInput.append(('template', self.getTemplateName(plotType)))
+
+        if self.plotOptions.getContinentType() is not None:
+            visInput.append(('continents', self.plotOptions.getContinentType())) # TODO
+
+        self.emit(QtCore.SIGNAL('updateModuleOps'), cdatcell_name, visInput)
+
+    def setVistrailsGraphicsMethod(self):
+        """ Vistrails: Update the vistrails' Graphics Method modules' boxfill
+        input ports.  Only set the plotType and graphics method (gm) name.
+        Setting the input for gm attributes should be handled by the gm
+        controller (graphics_method_controller.py)
+        """
+        visInput = [] # List of tuples where each tuple = (inputPortName, value)
+        plotType = str(self.plotOptions.getPlotType())
+        
+        visInput.append(('plotType', plotType))
+        visInput.append(('gmName', self.getGraphicsMethodName(plotType)))
+        self.emit(QtCore.SIGNAL('updateModuleOps'), gm_name, visInput)
+
+    def showError(self, title, text):
+        """ Show an error message in a simple popup message box. Currently there
+        is no error icon. """
+        
+        errorWidget = QtGui.QMessageBox(self)
+        errorWidget.setWindowTitle(title)
+        errorWidget.setText(text)
+        errorWidget.show()
+
+    def currentTabName(self):
+        return self.tabWidget.currentTabName()
+
+class QSelectVarDialog(QtGui.QDialog):
+    """ Popup box that allows user to selected a defined variable to replace an
+    axis """
+
+    def __init__(self, definedVars, parent):
+        QtGui.QDialog.__init__(self, parent)
+        self.selectedVariable = None
+        self.currentListIndex = None
+        self.definedVars = definedVars
+        self.myParent = parent
+        
+        vbox = QtGui.QVBoxLayout()
+        hbox = QtGui.QHBoxLayout()
+        self.setLayout(vbox)        
+
+        vbox.addWidget(QtGui.QLabel("Defined Variables:"))
+
+        # Add List of defined vars
+        self.varList = QtGui.QListWidget()
+        self.varList.setAlternatingRowColors(True)
+        vbox.addWidget(self.varList)
+
+        # Initialize the list of defined vars
+        # self.definedVars = parent.getDefinedVars()
+        for name, var in self.definedVars:
+            label = name + ' ' + str(var.shape)
+            item = QtGui.QListWidgetItem()
+            item.setData(0, QtCore.QVariant(QtCore.QString(label)))
+            self.varList.addItem(item)
+
+        # Add OK / Cancel Buttons
+        okButton = QtGui.QPushButton('OK')
+        cancelButton = QtGui.QPushButton('Cancel')
+        hbox.addWidget(okButton)
+        hbox.addWidget(cancelButton)                
+        vbox.addLayout(hbox)
+
+        # Connect Signals
+        self.connect(self.varList, QtCore.SIGNAL('clicked(const QModelIndex&)'),
+                     self.selectVariableFromListEvent)        
+        self.connect(okButton, QtCore.SIGNAL('pressed()'),
+                     self.selectDefinedVariableEvent)
+        self.connect(cancelButton, QtCore.SIGNAL('pressed()'), self.close)
+
+    def selectVariableFromListEvent(self, modelIndex):
+        self.currentListIndex = modelIndex
+
+    def varIsValid(self, var):
+        """ Return true if the var has 1 dimension and it has the same # of
+        values as the one it is replacing
+        """
+        if len(var.getAxisList()) != 1:
+            return False
+        if self.myParent.numValues() != self.myParent.numValues():
+            return False
+        return True
+
+    def showError(self):
+        errorMsg = "Invalid shape or size. Axis requiers a 1D \narray that matches in size."
+        errorMessageBox = QtGui.QMessageBox(self)
+        errorMessageBox.setWindowTitle("Error")
+        errorMessageBox.setText(errorMsg)
+        errorMessageBox.show()
+        # TODO need an icon for the message box                
+        
+    def selectDefinedVariableEvent(self):
+        # Implement in child        
+        return
+
+class QReplaceAxisValuesDialog(QSelectVarDialog):
+    """ Popup box that prompts user to select a variable to replace the current
+    axis values """    
+
+    def __init__(self, definedVars, parent):
+        QSelectVarDialog.__init__(self, definedVars, parent)
+        self.setWindowTitle("Replace Axis Values")
+
+    def selectDefinedVariableEvent(self):
+        # Do nothing if no variable is selected
+        if self.currentListIndex is None:
+            return 
+        
+        name, var = self.definedVars[self.currentListIndex.row()]
+        if self.varIsValid(var):
+            self.myParent.replaceAxisValues(var)
+            self.close()
+        else:
+            self.showError()
+
+class QReplaceAxisWeightsDialog(QSelectVarDialog):
+    """ Popup box that prompts user to select a variable to replace the current
+    axis weight values """
+
+    def __init__(self, definedVars, parent):
+        QSelectVarDialog.__init__(self, definedVars, parent)
+        self.setWindowTitle("Replace Dimension Weights")
+
+    def selectDefinedVariableEvent(self):
+        # Do nothing if no variable is selected        
+        if self.currentListIndex is None: 
+            return 
+        
+        name, var = self.definedVars[self.currentListIndex.row()]
+        if self.varIsValid(var):
+            self.myParent.setAlteredWeights(var)
+            self.close()
+        else:
+            self.showError()
+
+class QPlotOptionsWidget(QtGui.QWidget):
+    """ Widget containing plot options: plot button, plot type combobox, cell
+    col and row selection combo box, and an options button """
+    
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.myParent = parent
+        self.cellRow = -1 # if row/col = -1, then automatically plot in an open cell
+        self.cellCol = -1
+        hbox = QtGui.QHBoxLayout()
+
+        # Add plot button
+        self.plotButton = QtGui.QPushButton('&Plot')
+        hbox.addWidget(self.plotButton)
+
+        # Add plot type combo box
+        self.plotTypeCombo = QtGui.QComboBox()
+        comboPalette = self.plotTypeCombo.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.white)
+        comboPalette.setColor(QtGui.QPalette.Highlight, QtCore.Qt.blue)                
+        self.plotTypeCombo.view().setPalette(comboPalette)
+
+        plotTypes = ['Boxfill', 'Isofill', 'Isoline', 'Meshfill', 'Outfill',
+                     'Outline', 'Scatter', 'Taylordiagram', 'Vector', 'XvsY',
+                     'Xyvsy', 'Yxvsx','Ext']
+        self.plotTypeCombo.addItems(plotTypes)
+        hbox.addWidget(self.plotTypeCombo)
+
+        # Add cell row / col combo boxes
+        rowLabel = QtGui.QLabel('Row')
+        colLabel = QtGui.QLabel('Col')
+        self.cellRowCombo = QtGui.QComboBox()
+        self.cellColCombo = QtGui.QComboBox()
+
+        comboPalette = self.cellRowCombo.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.white)
+        comboPalette.setColor(QtGui.QPalette.Highlight, QtCore.Qt.blue)                
+        self.cellRowCombo.view().setPalette(comboPalette)
+
+        comboPalette = self.cellColCombo.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.white)
+        self.cellColCombo.view().setPalette(comboPalette)        
+
+        self.cellRowCombo.addItem('Auto')
+        self.cellColCombo.addItem('Auto')
+        
+        for i in range(1, 9):
+            self.cellRowCombo.addItems(str(i))
+            self.cellColCombo.addItems(str(i))
+
+        hbox.addWidget(rowLabel)
+        hbox.addWidget(self.cellRowCombo)
+        hbox.addWidget(colLabel)
+        hbox.addWidget(self.cellColCombo)
+
+        # Create the options menu
+        optionsMenu = QtGui.QMenu(self)
+        menuVbox = QtGui.QVBoxLayout()
+        menuVbox.setMargin(2)
+        optionsMenu.setLayout(menuVbox)
+
+        # Create the Continents Types Menu
+        self.continentTypesMenu = QCheckMenu()
+        self.continentTypesMenu.setTitle('Continent Types')
+        optionsMenu.addMenu(self.continentTypesMenu)        
+        self.continentTypes = [('Auto Continents', None),
+                               ('No Continents', 0),
+                               ('Coarse Continents', 2),
+                               ('Fine Continents', 1),
+                               ('United States Continents', 3),
+                               ('Political Boundary Continents', 4),
+                               ('Rivers Continents', 5),
+                               ('User1 Continents', 6),
+                               ('User2 Continents', 7),
+                               ('User3 Continents', 8),
+                               ('User4 Continents', 9),
+                               ('User5 Continents', 10),
+                               ('User6 Continents', 11)]
+
+        for continentType in self.continentTypes:
+            self.continentTypesMenu.addCheckableAction(continentType[0])
+        self.continentTypesMenu.setDefaultAction('Auto Continents')
+
+        # Create graphic method attribute option / editor
+        canvas = vcs.init()
+        self.graphicsMethodController = QGraphicsMethodAttributeWindow(canvas, self)
+        graphicMethodAction = optionsMenu.addAction('Se&t Graphics Method Attributes')
+
+        # Create Colormap option / widget
+        colorMapAction = optionsMenu.addAction("&Colormap Editor")
+        self.colorDialog = QtGui.QColorDialog(self)
+        self.connect(colorMapAction, QtCore.SIGNAL('triggered ()'),
+                     self.colorDialog.open)
+
+        # Create the options button
+        self.optionButton = QtGui.QToolButton()
+        self.optionButton.setText(' Options  ')
+        self.optionButton.setMenu(optionsMenu)
+        self.optionButton.setPopupMode(QtGui.QToolButton.InstantPopup)
+
+        hbox.addWidget(self.optionButton)
+        hbox.addStretch()        
+        self.setLayout(hbox)
+
+        # Connect Signals
+        self.connect(self.plotButton, QtCore.SIGNAL('clicked(bool)'),
+                     parent.plot)
+        self.connect(self.optionButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.optionButton.showMenu)
+        self.connect(graphicMethodAction, QtCore.SIGNAL('triggered ()'),
+                     self.graphicsMethodController.show)
+
+    def getRow(self):
+        if self.cellRowCombo.currentText() == 'Auto':
+            return -1
+        return int(self.cellRowCombo.currentText()) - 1
+
+    def getCol(self):
+        if self.cellColCombo.currentText() == 'Auto':
+            return -1
+        return int(self.cellColCombo.currentText()) - 1
+
+    def getPlotType(self):
+        return self.plotTypeCombo.currentText()
+
+    def getContinentType(self):
+        """ Returns None or a number from 0-11 corresponding to the option
+        selected in the continents menu """
+        
+        selectedText = self.continentTypesMenu.getCheckedText()
+        for text, continentType in self.continentTypes:
+            if text == selectedText:
+                return continentType
+
+        return None
+
+    def getGraphicsMethodController(self):
+        return self.graphicsMethodController
+
+    def getParent(self):
+        return self.myParent
+
+class QCheckMenu(QtGui.QMenu):
+    """ Menu where only a single 'checkable' action can be checked at a time """
+
+    def __init__(self, parent=None):
+        QtGui.QMenu.__init__(self, parent)
+        self.defaultAction = None
+        self.currentAction = None
+        self.handleCheckEvent = False
+        self.actions = {}
+
+    def addCheckableAction(self, actionText):
+        action = self.addAction(actionText)
+        action.setCheckable(True)
+        self.actions[actionText] = action
+        self.connect(action, QtCore.SIGNAL('toggled (bool)'), self.checkEvent)
+
+    def setDefaultAction(self, actionText):
+        if actionText in list(self.actions):
+            self.currentAction = self.defaultAction = self.actions[actionText]
+            self.defaultAction.setChecked(True)
+
+    def getCheckedText(self):
+        return self.currentAction.text()
+
+    def checkEvent(self, isChecked):
+        """ Force the menu to have only 1 item checked.  If an action is
+        unchecked, check the default item """
+
+        # handleCheckEvent prevents infinite recursion because this method also
+        # generates checkEvents
+        if self.handleCheckEvent == False:
+            self.handleCheckEvent = True
+            return
+        
+        if isChecked == True:
+            self.handleCheckEvent = False
+            self.currentAction.setChecked(False)            
+            self.currentAction = self.sender()
+        elif isChecked == False and not self.defaultAction is None:
+            self.handleCheckEvent = False
+            self.defaultAction.setChecked(True)
+
+class QAxisListTabWidget(QtGui.QTabWidget):
+    """ TabWidget where each tab contains a QAxisList """
+    
+    def __init__(self, parent=None):
+        QtGui.QTabWidget.__init__(self, parent)
+        self.myParent = parent
+
+        self.connect(self, QtCore.SIGNAL('currentChanged(int)'),
+                     self.tabChangeEvent)        
+
+    def createNewTab(self, axisList, tabName):
+        """ Create a new tab given the axisList widget and tab name.  If a
+        tab with the same name exists already, replace it. Set the current tab
+        to the newly created tab """
+
+        if (self.tabExists(tabName)):
+            self.removeTab(self.getTabIndexFromName(tabName))
+
+        if tabName == 'quickplot':
+            self.insertTab(0, axisList, tabName) # quickplot is always first tab
+        else:
+            self.addTab(axisList, tabName)
+            
+        self.setTabTip(tabName)
+        self.setCurrentIndex(self.getTabIndexFromName(tabName))
+
+    def setupQuickplotTab(self, axisList):
+        """ Create a new quickplot tab if one doesn't exist otherwise replace
+        the existing quickplot tab """
+
+        tabName = 'quickplot'
+        if (self.tabExists(tabName) == True):
+            index = self.getTabIndexFromName(tabName)
+            self.removeTab(index)
+            
+        self.insertTab(0, axisList, tabName)
+        self.setTabTip(tabName)
+        self.setCurrentIndex(0)
+
+    def setTabTip(self, tabName):
+        if self.tabExists(tabName):
+            index = self.getTabIndexFromName(tabName)
+            toolTip = "'%s' axisList tab widget" % tabName
+            self.setTabToolTip(index, toolTip)        
+
+    def tabChangeEvent(self, tabIndex):
+        """ Event handler for when a tab is changed. Update the variable info
+        text box.
+        """
+        axisList = self.widget(tabIndex)
+        self.myParent.updateVarInfo(axisList)
+
+    def selectAndUpdateDefinedVarTab(self, tabName, cdmsFile, var):
+        """ This function selects a tab given the tabName and then updates the
+        tab's axisList using the passed var's values
+        """
+        if (not self.tabExists(tabName)):
+            raise NameError("Error: tab '%s' was not found" % tabName)
+
+        tabIndex = self.getTabIndexFromName(tabName)
+        self.setCurrentIndex(tabIndex)
+
+        if (tabName == 'quickplot'):
+            axisList = QAxisList(cdmsFile, var, self)            
+            self.setupQuickplotTab(axisList)
+            axisList.setupVariableAxes()
+        else:
+            axisList = self.currentWidget()
+            axisList.setupVariableAxes()
+
+        self.emit(QtCore.SIGNAL('updateVarInfo'), axisList)        
+
+    def tabExists(self, name):
+        """ Returns True if a tab with the given name exists """
+        numTabs = self.count()        
+        for i in range(numTabs):
+            if (name == self.tabText(i)):
+                return True
+        return False
+
+    def getTabIndexFromName(self, name):
+        numTabs = self.count()
+        for i in range(numTabs):
+            if (name == self.tabText(i)):
+                return i
+        return None
+
+    def currentTabName(self):
+        currentTab = self.currentIndex()
+        return str(self.tabText(currentTab))
+
+class QMenuWidget(QtGui.QMenuBar):
+    def __init__(self, parent=None):
+        QtGui.QMenuBar.__init__(self, parent)
+        self.myParent = parent
+        
+        self.file = self.addMenu('&File')
+        self.pref = self.addMenu('&Preferences')
+        self.tools = self.addMenu('&Tools')
+        self.pcmdiTools = self.addMenu('&PCMDITools')
+        self.help = self.addMenu('&Help')
+        self.initToolsMenu()
+
+    def initToolsMenu(self):
+        recordTeachingAction = self.tools.addAction('Record Commands')
+        recordTeachingAction.setCheckable(True)
+        recordTeachingAction.setChecked(True)
+        
+        viewTeachingAction = self.tools.addAction('View Teaching Commands')
+        closeTeachingAction = self.tools.addAction('Close Teaching Commands')        
+
+        self.connect(viewTeachingAction, QtCore.SIGNAL('triggered ()'),
+                     self.viewTeachingCommands)
+        self.connect(closeTeachingAction, QtCore.SIGNAL('triggered ()'),
+                     self.closeTeachingCommands)        
+        self.connect(recordTeachingAction, QtCore.SIGNAL('toggled (bool)'),
+                     self.setRecordCommands)
+
+    def setRecordCommands(self, checked):
+        self.myParent.emit(QtCore.SIGNAL('setRecordCommands'), checked)
+
+    def viewTeachingCommands(self):
+        self.myParent.emit(QtCore.SIGNAL('viewTeachingCommands'))
+
+    def closeTeachingCommands(self):
+        self.myParent.emit(QtCore.SIGNAL('closeTeachingCommands'))
+
diff --git a/contrib/cdat/configure.py b/contrib/cdat/configure.py
new file mode 100644
index 0000000..e36b245
--- /dev/null
+++ b/contrib/cdat/configure.py
@@ -0,0 +1,72 @@
+import os
+import sipconfig
+from PyQt4 import pyqtconfig
+
+
+from distutils import sysconfig
+
+vcs_so = '%s/vcs/_vcs.so' % sysconfig.get_python_lib()
+vcs_inc = '%s/vcs/Include' % sysconfig.get_python_lib()
+
+## vcs_so = '/Users/hvo/src/uvcdat/cdatBuild/lib/python2.7/site-packages/vcs/_vcs.so'
+## vcs_inc = '/Users/hvo/src/uvcdat/cdat/Packages/vcs/Include'
+
+
+# The name of the SIP build file generated by SIP and used by the build
+# system.
+build_file = "pyqtscripting.sbf"
+
+# Get the PyQt configuration information.
+config = pyqtconfig.Configuration()
+
+# Get the extra SIP flags needed by the imported qt module.  Note that
+# this normally only includes those flags (-x and -t) that relate to SIP's
+# versioning system.
+qt_sip_flags = config.pyqt_sip_flags
+
+os.system("rm -rf cdatwrap")
+os.mkdir("cdatwrap")
+os.system("touch cdatwrap/__init__.py")
+
+# Run SIP to generate the code.  Note that we tell SIP where to find the qt
+# module's specification files using the -I flag.
+os.system(" ".join([ \
+    config.sip_bin, \
+    "-c", "cdatwrap", \
+    "-b", build_file, \
+    "-I", config.pyqt_sip_dir, \
+    qt_sip_flags, \
+    "cdat.sip" \
+]))
+
+# Create the Makefile.  The QtModuleMakefile class provided by the
+# pyqtconfig module takes care of all the extra preprocessor, compiler and
+# linker flags needed by the Qt library.
+makefile = pyqtconfig.QtGuiModuleMakefile(
+    dir="cdatwrap",
+    configuration=config,
+    build_file='../' + build_file
+)
+
+# Add the library we are wrapping.  The name doesn't include any platform
+# specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the
+# ".dll" extension on Windows).
+#makefile.extra_libs = ["vcs"]
+import cdat_info
+makefile.CFLAGS.append("-I%s/include" % cdat_info.externals)
+makefile.CFLAGS.append("-I%s" % vcs_inc)
+makefile.CFLAGS.append("-I%s/.." % sysconfig.get_python_inc())
+
+makefile.CXXFLAGS.append("-I%s/include" % cdat_info.externals)
+makefile.CXXFLAGS.append("-I%s" % vcs_inc)
+makefile.CXXFLAGS.append("-I%s/.." % sysconfig.get_python_inc())
+
+cwd = os.getcwd()
+makefile.LFLAGS.append("-Wl,-rpath,%s/cdatwrap" % cwd)
+
+# Generate the Makefile itself.
+makefile.generate()
+os.chdir("cdatwrap")
+os.system("make clean")
+os.system("MACOSX_DEPLOYMENT_TARGET=10.6 make -j")
+os.system("make install")
diff --git a/contrib/cdat/graphics_method_controller.py b/contrib/cdat/graphics_method_controller.py
new file mode 100644
index 0000000..1d1ff10
--- /dev/null
+++ b/contrib/cdat/graphics_method_controller.py
@@ -0,0 +1,1624 @@
+import types
+from PyQt4 import QtCore, QtGui
+from gui_controller import gm_name
+
+indentSpacing = 10
+
+class QGraphicsMethodAttributeWindow(QtGui.QMainWindow):
+
+    def __init__(self, canvas=None, parent=None):
+        QtGui.QMainWindow.__init__(self, parent)
+        initialWidth = 480
+        initialHeight = 640
+        self.resize(initialWidth, initialHeight)        
+        self.setWindowTitle('Graphics Methods Attrtibute Settings')
+        self.parent = parent
+
+        # Create tab widgets
+        self.tabWidget = QtGui.QTabWidget()
+        if canvas is not None:
+            self.boxfillEditor = QBoxfillEditor(gm=canvas.getboxfill('ASD'))
+            self.continentsEditor = QContinentsEditor(gm=canvas.getcontinents('ASD'))
+            self.meshfillEditor = QMeshfillEditor(gm=canvas.getmeshfill())
+            self.outfillEditor = QOutfillEditor(gm=canvas.getoutfill())
+            self.scatterEditor = QScatterEditor(gm=canvas.getscatter('ASD'))
+            self.taylorEditor = QTaylorDiagramEditor(gm=canvas.gettaylordiagram('ASD'))
+            self.vectorEditor = QVectorEditor(gm=canvas.getvector())
+        else:
+            self.boxfillEditor = QBoxfillEditor()
+            self.continentsEditor = QContinentsEditor()
+            self.meshfillEditor = QMeshfillEditor()
+            self.outfillEditor = QOutfillEditor()
+            self.scatterEditor = QScatterEditor()
+            self.taylorEditor = QTaylorDiagramEditor()
+            self.vectorEditor = QVectorEditor()
+            
+        self.contourEditor = QContourEditor()
+        self.oneDimEditor = Q1DPlotEditor()
+        self.outlineEditor = QOutlineEditor()
+        
+        # Add tabs
+        self.tabWidget.addTab(self.boxfillEditor, 'Boxfill')
+        self.tabWidget.addTab(self.continentsEditor, 'Continents')
+        self.tabWidget.addTab(self.contourEditor, 'Contour')
+        self.tabWidget.addTab(self.meshfillEditor, 'Meshfill')
+        self.tabWidget.addTab(self.oneDimEditor, '1D Plot')
+        self.tabWidget.addTab(self.outfillEditor, 'Outfill')
+        self.tabWidget.addTab(self.outlineEditor, 'Outline')
+        self.tabWidget.addTab(self.scatterEditor, 'Scatter')
+        self.tabWidget.addTab(self.taylorEditor, 'Taylor Diagram')
+        self.tabWidget.addTab(self.vectorEditor, 'Vector')
+        self.setToolTips()        
+        
+        # Add preview, reset, apply, cancel buttons
+        previewButton = self.getButton('Preview')
+        resetButton = self.getButton('Reset')
+        applyButton = self.getButton('Apply')
+        cancelButton = self.getButton('Cancel')
+
+        hbox = QtGui.QHBoxLayout()
+        hbox.addWidget(previewButton)
+        hbox.addWidget(resetButton)
+        hbox.addWidget(applyButton)
+        hbox.addWidget(cancelButton)
+
+        # Setup the layout
+        vbox = QtGui.QVBoxLayout()
+        vbox.addWidget(self.tabWidget)
+        vbox.addLayout(hbox)
+        wrapperWidget = QtGui.QWidget()
+        wrapperWidget.setLayout(vbox)
+        self.setCentralWidget(wrapperWidget)
+
+        # Connect Signals
+        self.connect(cancelButton, QtCore.SIGNAL('pressed()'), self.close)
+        self.connect(resetButton, QtCore.SIGNAL('pressed()'), self.resetPressedEvent)
+        self.connect(applyButton, QtCore.SIGNAL('pressed()'), self.applyPressedEvent)
+        self.connect(previewButton, QtCore.SIGNAL('pressed()'), self.previewPressedEvent)
+
+    def resetPressedEvent(self):
+        self.boxfillEditor.initValues()
+        self.continentsEditor.initValues()
+        self.meshfillEditor.initValues()
+        self.outfillEditor.initValues()
+        self.scatterEditor.initValues()
+        self.taylorEditor.initValues()
+        self.vectorEditor.initValues()
+            
+        self.contourEditor.initValues()
+        self.oneDimEditor.initValues()
+        self.outlineEditor.initValues()
+
+    def applyPressedEvent(self):
+        self.boxfillEditor.setVistrailsGraphicsMethod(self.parent.getParent())
+        
+        # TODO
+        # self.continentsEditor.setVistrailsGraphicsMethod()
+        # self.meshfillEditor.setVistrailsGraphicsMethod()
+        # self.outfillEditor.setVistrailsGraphicsMethod()
+        # self.scatterEditor.setVistrailsGraphicsMethod()
+        # self.taylorEditor.setVistrailsGraphicsMethod()
+        # self.vectorEditor.setVistrailsGraphicsMethod()
+        # self.contourEditor.setVistrailsGraphicsMethod()
+        # self.oneDimEditor.setVistrailsGraphicsMethod()
+        # self.outlineEditor.setVistrailsGraphicsMethod()
+
+    def previewPressedEvent(self):
+        return # TODO
+
+    def setToolTips(self):
+        self.tabWidget.setTabToolTip(0, 'The Boxfill graphics method displays a two-dimensional data\narray by surrounding each data value with a colored grid box.')
+        self.tabWidget.setTabToolTip(1, "The Continents graphics method draws a predefined,\ngeneric set of continental outlines in a longitude\nby latitude space. (To draw continental outlines,\nno external data set is required.)")
+        self.tabWidget.setTabToolTip(2, "This Contour notebook tab represent both the Isofill\nand Isoline graphics methods. The Isofill graphics\nmethod fills the area between selected isolevels\n(levels of constant value) of a two-dimensional\narray; the manner of filling the area is determined\nby the named fill area attributes. The Isoline\ngraphics method draws lines of constant value at\nspecified levels to graphically represent the values\nof a two-dimensional array; labels also c [...]
+        self.tabWidget.setTabToolTip(3, "The Meshfill graphics method draws data on irregular grid (or 'mesh')at specified levels to graphically represent\nthe values of a one-dimensional array;\nUnless the irregular grid is supported by cdms2, a mesh array must be passed as well")
+        self.tabWidget.setTabToolTip(4, "This 1D Plot notebook tab represent the XvsY, Xyvsy,\nand Yxvsx graphics methods. The XvsY graphics method\ndisplays a line plot from two 1D data arrays, that\nis X(t) and Y(t), where t represents the 1D\ncoordinate values. The Xyvsy graphics method displays\na line plot from a 1D data array, that is X(y),\nwhere y represents the 1D coordinate values. The\nYxvsx graphics method displays a line plot from\na 1D data array, that is Y(x), where y repr [...]
+        self.tabWidget.setTabToolTip(5, "The Outfill graphics method fills a set of integer\nvalues in any data array. Its primary purpose is\nto display continents by filling their area as\ndefined by a surface type array that indicates land,\nocean, and sea-ice points. ")
+        self.tabWidget.setTabToolTip(6, "The Outline graphics method outlines a set of integer\nvalues in any data array. Its primary purpose is\nto display continental outlines as defined by a\nsurface type array that indicates land, ocean, and\nsea-ice points.")
+        self.tabWidget.setTabToolTip(7, "The Scatter graphics method displays a scatter plot\nof two 4-dimensional data arrays, e.g. A(x,y,z,t)\nand B(x,y,z,t). ")
+        self.tabWidget.setTabToolTip(8, "The Taylor diagram graphics method provides a statistical\nsummary of pattern correspondence. A single point on\nthe diagram indicates how similar two patterns are in\nterms of their correlation, root-mean-square (RMS)\ndifference, and the ratio of their variances.  The\nstandard deviation of a pattern is proportional to the\nradial distance.  The correlation is given by the cosine\nof the azimuthal angle. The RMS difference is proportional\nto th [...]
+        self.tabWidget.setTabToolTip(9, "The Vector graphics method displays a vector plot\nof a 2D vector field. Vectors are located at the\ncoordinate locations and point in the direction of\nthe data vector field. Vector magnitudes are the\nproduct of data vector field lengths and a scaling\nfactor. ")
+
+    def getButton(self, text):
+        button = QtGui.QToolButton()
+        button.setText(text)
+        return button
+
+class QVectorEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        frame = QFramedWidget()
+        self.lineType = frame.addLabeledComboBox('Vector Line Type:',
+                                                 ['solid', 'dash', 'dot','dash-dot', 'long-dash'])
+        self.colorIndex = frame.addLabeledSpinBox('Vector Line Color Index',
+                                                  0, 255)
+        self.scale = frame.addLabeledDoubleSpinBox('Vector Scale', -1e20, 1e20, .1)
+        self.alignment = frame.addLabeledComboBox('Vector Alignment:',
+                                                  ['head', 'center', 'tail'])
+        self.headType = frame.addLabeledComboBox('Vector Head Type:',
+                                                 ['arrows', 'barbs', 'solidarrows'])
+        self.reference = frame.addLabeledDoubleSpinBox('Vector reference', -1e20, 1e20, .1)
+    
+        vbox.addWidget(frame)
+
+        # Init values & set tool tips
+        self.initValues()
+        self.lineType.setToolTip("Select the vector line type.")
+        self.colorIndex.setToolTip("Select the vector color index.")
+        self.scale.setToolTip("Select the vector scale factor.")
+        self.alignment.setToolTip("Set the vector alignment.")
+        self.headType.setToolTip("Set the vector head type.")
+        self.reference.setToolTip("Set the vector reference. Note: if the value is 1e+20,\nthen VCS will determine the vector reference.")        
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setLayout(vbox)
+        widgetWrapper.setMinimumWidth(580)
+        self.setWidget(widgetWrapper)
+
+    def initValues(self):
+        # TODO: don't init w/ hardcoded values?
+        self.colorIndex.setValue(241)
+        self.scale.setValue(1)
+        self.alignment.setCurrentIndex(1)
+        self.headType.setCurrentIndex(0)
+        self.reference.setValue(1e20)
+
+class QTaylorDiagramEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        tabWidget = QtGui.QTabWidget()
+        interfaceTab = QTaylorInterfaceTab()
+        tickAndLabelTab = QTaylorTicksLabels()
+        markersTab = QTaylorMarkers()
+        tabWidget.addTab(interfaceTab, 'Interface')
+        tabWidget.addTab(markersTab, 'Markers')
+        tabWidget.addTab(tickAndLabelTab, 'Ticks and Labels')
+        vbox.addWidget(tabWidget)
+
+        # Set up the scrollbar / widget size
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.resize(670, 520)
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+    def initValues(self):
+        interfaceTab.initValues()
+        markersTab.initValues()
+        tickAndLabelTab.initValues()
+
+class QTaylorMarkers(QtGui.QScrollArea):
+    """ Tabbed Widget for Taylor -> Markers """
+    
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        self.row = 1
+        self.grid = QtGui.QGridLayout()
+        self.markerList = []
+        vbox = QtGui.QVBoxLayout()
+        
+        # Create Column Labels
+        self.grid.addWidget(QtGui.QLabel(''), 0, 0)
+        self.grid.addWidget(QtGui.QLabel('#'), 0, 1)
+        self.grid.addWidget(QtGui.QLabel('Active'), 0, 2)
+        self.grid.addWidget(QtGui.QLabel('Symbol'), 0, 3)
+        self.grid.addWidget(QtGui.QLabel('Color'), 0, 4)
+        self.grid.addWidget(QtGui.QLabel('Size'), 0, 5)
+        self.grid.addWidget(QtGui.QLabel('Id'), 0, 6)
+        self.grid.addWidget(QtGui.QLabel('Id Size'), 0, 7)
+        self.grid.addWidget(QtGui.QLabel('+X'), 0, 8)
+        self.grid.addWidget(QtGui.QLabel('+Y'), 0, 9)
+        self.grid.addWidget(QtGui.QLabel('Id Color'), 0, 10)
+        self.grid.addWidget(QtGui.QLabel('Id Font'), 0, 11)
+        self.grid.addWidget(QtGui.QLabel('Line'), 0, 12)
+        self.grid.addWidget(QtGui.QLabel('Type'), 0, 13)
+        self.grid.addWidget(QtGui.QLabel('Size'), 0, 14)
+        self.grid.addWidget(QtGui.QLabel('Color'), 0, 15)        
+
+        vbox.addLayout(self.grid)
+
+        # Create Buttons
+        hbox = QtGui.QHBoxLayout()
+        addButton = self.createButton('Add')
+        delButton = self.createButton('Delete')
+        insertButton = self.createButton('Insert')
+        hbox.addWidget(addButton)
+        hbox.addWidget(delButton)
+        hbox.addWidget(insertButton)
+        vbox.addLayout(hbox)
+        vbox.setAlignment(self.grid, QtCore.Qt.AlignTop)
+        vbox.setAlignment(hbox, QtCore.Qt.AlignBottom)
+        
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.resize(1200, 440)
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+        # Connect Signals
+        self.connect(addButton, QtCore.SIGNAL('pressed()'), self.addMarker)
+        self.connect(delButton, QtCore.SIGNAL('pressed()'), self.removeSelectedMarkers)
+        self.connect(insertButton, QtCore.SIGNAL('pressed()'), self.insertMarkers)
+
+    def initValues(self):
+        # Delete all markers
+        # TODO
+        return
+
+    def removeMarker(self, marker):
+        widgets = marker.getWidgets()
+        for key in list(widgets):
+            self.grid.removeWidget(widgets[key])
+            widgets[key].hide()
+
+        self.row -= 1
+
+    def removeSelectedMarkers(self):
+        """ Delete all of the selected markers from the grid layout"""
+
+        removeList = []
+        for marker in self.markerList:
+            if marker.isSelected():
+                self.removeMarker(marker)
+                removeList.append(marker)
+
+                # Update each subsequent marker's entry number, and position in the grid
+                for i in range(self.markerList.index(marker) + 1, len(self.markerList)):
+                    row = int(self.markerList[i].getEntryNumber())
+                    self.markerList[i].setEntryNumber(row - 1)
+                    self.moveMarkerRow(row, row-1)
+
+        for marker in removeList:
+            if marker.isSelected():
+                self.markerList.remove(marker)
+
+    def moveMarkerRow(self, row, newRow):
+        """ Move a marker grid item at row to newRow """
+        numCols = 16
+        for col in range(numCols):
+            if self.grid.itemAtPosition(row, col) is not None:
+                widget = self.grid.itemAtPosition(row, col).widget()
+                self.grid.removeWidget(widget)
+            self.grid.addWidget(widget, newRow, col, QtCore.Qt.AlignTop)
+
+    def insertMarkers(self):
+        """ For each marker that is selected, create and insert a new marker before it """
+        selectedMarkerList = []
+        for marker in self.markerList:
+            if marker.isSelected():
+                selectedMarkerList.append(marker)
+                # Update the selected and each subsequent marker's entry number, and position in the grid
+                for i in range(self.markerList.index(marker), len(self.markerList)):
+                    row = int(self.markerList[i].getEntryNumber())
+                    self.markerList[i].setEntryNumber(row + 1)
+                    self.moveMarkerRow(row, row + 1)
+
+        # Insert the new markers in the correct positions
+        for marker in selectedMarkerList:
+            index = self.markerList.index(marker)
+            newMarker = QMarkerEditorEntry(self.grid, index + 1)                
+            self.markerList.insert(index, newMarker)
+            self.row += 1
+
+    def addMarker(self):
+        self.markerList.append(QMarkerEditorEntry(self.grid, self.row))
+        self.row += 1
+        
+    def createButton(self, text):
+        button = QtGui.QToolButton()
+        button.setText(text)
+        return button
+
+class QMarkerEditorEntry(QtGui.QWidget):
+    def __init__(self, grid, row, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.widgets = {}
+
+        symbolList = ["dot", "plus", "star", "circle", "cross", "diamond", "triangle_up", "triangle_down", "triangle_left", "triangle_right", "square", "diamond_fill", "triangle_up_fill", "triangle_down_fill", "triangle_left_fill", "triangle_right_fill", "square_fill"]
+        lineList = ['None', 'Tail', 'Head', 'Line']
+        typeList = ['solid', 'dash', 'dot', 'dash-dot', 'long-dash']
+        
+        self.widgets['selectedBox'] = QtGui.QCheckBox()
+        self.widgets['entryNumber'] = QtGui.QLabel(str(row))
+        self.widgets['activeBox'] = QtGui.QCheckBox()
+        self.widgets['symbolCombo'] = self.createCombo(symbolList)
+        self.widgets['colorCombo1'] = self.createCombo(['TODO'])
+        self.widgets['size'] = QtGui.QLineEdit()
+        self.widgets['id'] = QtGui.QLineEdit()
+        self.widgets['idSize'] = QtGui.QLineEdit()
+        self.widgets['x'] = QtGui.QLineEdit()
+        self.widgets['y'] = QtGui.QLineEdit()
+        self.widgets['idColorCombo'] = self.createCombo(['TODO'])
+        self.widgets['idFontCombo'] = self.createCombo(map(str, range(1,10)))
+        self.widgets['lineCombo'] = self.createCombo(lineList)
+        self.widgets['typeCombo'] = self.createCombo(typeList)
+        self.widgets['size2'] = QtGui.QLineEdit()
+        self.widgets['colorCombo2'] = self.createCombo(['TODO'])        
+        
+        grid.addWidget(self.widgets['selectedBox'], row, 0, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['entryNumber'], row, 1, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['activeBox'], row, 2, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['symbolCombo'], row, 3, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['colorCombo1'], row, 4, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['size'], row, 5, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['id'], row, 6, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['idSize'], row, 7, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['x'], row, 8, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['y'], row, 9, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['idColorCombo'], row, 10, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['idFontCombo'], row, 11, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['lineCombo'], row, 12, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['typeCombo'], row, 13, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['size2'], row, 14, QtCore.Qt.AlignTop)
+        grid.addWidget(self.widgets['colorCombo2'], row, 15, QtCore.Qt.AlignTop)
+
+        # TODO initialize the values
+
+    def getWidgets(self):
+        return self.widgets
+
+    def getColor2(self):
+        return self.widgets['colorCombo2'].currentText()
+
+    def getSize2(self):
+        return self.widgets['size2'].currentText()
+
+    def getType(self):
+        return self.widgets['typeCombo'].currentText()
+
+    def getLine(self):
+        return self.widgets['lineCombo'].currentText()
+
+    def getIdFont(self):
+        return self.widgets['idFontCombo'].currentText()
+
+    def getIdColor(self):
+        return self.widgets['idColorCombo'].currentText()
+
+    def getSize(self):
+        return self.widgets['size'].currentText()
+
+    def getID(self):
+        return self.widgets['id'].currentText()
+
+    def getIdSize(self):
+        return self.widgets['idSize'].currentText()
+
+    def getX(self):
+        return self.widgets['x'].currentText()
+
+    def gety(self):
+        return self.widgets['y'].currentText()    
+
+    def getColor(self):
+        return self.widgets['colorCombo1'].currentText()
+
+    def getSymbol(self):
+        return self.widgets['symbolCombo'].currentText()
+        
+    def getEntryNumber(self):
+        return int(self.widgets['entryNumber'].text())
+
+    def setEntryNumber(self, num):
+        self.widgets['entryNumber'].setText(str(num))
+
+    def isActive(self):
+        return self.widgets['activeBox'].isChecked()
+
+    def isSelected(self):
+        return self.widgets['selectedBox'].isChecked()
+
+    def createCombo(self, entries):
+        comboBox = QtGui.QComboBox()
+        comboBox.setMaximumWidth(120)
+        comboPalette = comboBox.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.white)        
+        comboPalette.setColor(QtGui.QPalette.Highlight, QtCore.Qt.blue)
+        comboBox.view().setPalette(comboPalette)
+        
+        for entry in entries:
+            comboBox.addItem(entry)
+
+        return comboBox
+
+class QTaylorTicksLabels(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        vbox = QtGui.QVBoxLayout()
+        xFrame = QFramedWidget('X axis')
+        self.xlabels = xFrame.addLabeledLineEdit('Labels:')
+        self.xticks = xFrame.addLabeledLineEdit('Ticks:')
+        vbox.addWidget(xFrame)
+
+        yFrame = QFramedWidget('Y axis')
+        self.ylabels = yFrame.addLabeledLineEdit('Labels:')
+        self.yticks = yFrame.addLabeledLineEdit('Ticks:')
+        vbox.addWidget(yFrame)
+
+        corArcFrame = QFramedWidget('Correlation arc')
+        self.corLabels = corArcFrame.addLabeledLineEdit('Labels:')
+        self.corTicks = corArcFrame.addLabeledLineEdit('Ticks:')
+        vbox.addWidget(corArcFrame)
+
+        # Init line edits
+        self.initValues()
+
+        # Set up the scrollbar
+        wrapperWidget = QtGui.QWidget()
+        wrapperWidget.setLayout(vbox)
+        wrapperWidget.setMinimumWidth(580)        
+        self.setWidget(wrapperWidget)
+
+    def initValues(self):
+        self.xlabels.setText('*')
+        self.xticks.setText('*')
+        self.ylabels.setText('*')
+        self.yticks.setText('*')
+        self.corLabels.setText('*')
+        self.corTicks.setText('*')        
+
+class QTaylorInterfaceTab(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        # General Aspect
+        genFrame = QFramedWidget('General Aspect')
+        self.detailSlider = genFrame.addLabeledSlider('Detail:', newRow=False)
+        self.maxValue = genFrame.addLabeledLineEdit('Maximum Value:')
+        self.quadran = genFrame.addRadioFrame('Quadran', ['1', '2'])
+        self.refValue = genFrame.addLabeledLineEdit('Reference Value:')
+        vbox.addWidget(genFrame)
+
+        # Skill
+        skillFrame = QFramedWidget('Skill')
+        self.skillValues = skillFrame.addLabeledLineEdit('Skill Values:')
+        self.skillLineColor = skillFrame.addLabeledComboBox('Skill Lines Color:',
+                                                            ['TODO'])
+        self.drawLabels = skillFrame.addCheckBox('Draw Skill Contour Labels')
+        self.skillCoefficients = skillFrame.addLabeledLineEdit('Skill Coefficients:')
+        vbox.addWidget(skillFrame)
+        
+        # Arrows
+        arrowFrame = QFramedWidget('Arrows')
+        self.lengthSlider = arrowFrame.addLabeledSlider('Length:', newRow=False)
+        self.angleSlider = arrowFrame.addLabeledSlider('Angle:')
+        self.baseSlider = arrowFrame.addLabeledSlider('Base:')
+        # TODO - Create a widget to draw the arrow
+        
+        vbox.addWidget(arrowFrame)
+        vbox.setAlignment(arrowFrame, QtCore.Qt.AlignTop)
+
+        # Set up the scrollbar
+        wrapperWidget = QtGui.QWidget()
+        wrapperWidget.setLayout(vbox)
+        wrapperWidget.setMinimumWidth(580)
+        self.setWidget(wrapperWidget)        
+
+        # Init Values
+        self.initValues()
+
+        # Connect Signals
+        self.connect(self.lengthSlider, QtCore.SIGNAL('valueChanged(int)'), self.lengthChangedEvent)
+        self.connect(self.angleSlider, QtCore.SIGNAL('valueChanged(int)'), self.angleChangedEvent)
+        self.connect(self.baseSlider, QtCore.SIGNAL('valueChanged(int)'), self.baseChangedEvent)        
+
+    def initValues(self):
+        # TODO Init w/ non hardcoded values?
+
+        # General Aspect
+        self.detailSlider.setTickPosition(QtGui.QSlider.TicksBelow)
+        self.detailSlider.setMinimum(0)
+        self.detailSlider.setMaximum(100)
+        self.detailSlider.setSingleStep(5)
+        self.detailSlider.setTickInterval(10)
+
+        self.maxValue.setText('None')
+        self.refValue.setText('1.0')
+        self.quadran.setChecked('1')
+
+        # Arrows
+        self.lengthSlider.setTickPosition(QtGui.QSlider.TicksBelow)
+        self.angleSlider.setTickPosition(QtGui.QSlider.TicksBelow)
+        self.baseSlider.setTickPosition(QtGui.QSlider.TicksBelow)
+
+    def lengthChangedEvent(self, int):
+        return # TODO
+
+    def angleChangedEvent(self, int):
+        return # TODO
+
+    def baseChangedEvent(self, int):
+        return # TODO
+
+class QScatterEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        # Create Widgets
+        frame = QFramedWidget()
+        markerTypes = ["dot", "plus", "star", "circle", "cross", "diamond", "triangle_up",
+                       "triangle_down", "triangle_left", "triangle_right", "square",
+                       "diamond_fill", "triangle_up_fill", "triangle_down_fill",
+                       "triangle_left_fill", "triangle_right_fill", "square_fill"]
+        self.markerType = frame.addLabeledComboBox('Scatter Marker Type:',
+                                                   markerTypes, indent=False)
+        self.colorIndex = frame.addLabeledSpinBox('Scatter Marker Color Index',
+                                                  0, 255, indent=False)
+        self.markerSize = frame.addLabeledSpinBox('Scatter Marker Size',
+                                                  1, 300, indent=False)
+
+        self.initValues()
+
+        # Set toolTips
+        self.markerType.setToolTip("Select the scatter marker type. ")
+        self.colorIndex.setToolTip("Select the scatter marker color index. ")
+        self.markerSize.setToolTip("Select the scatter marker size. ")
+
+        vbox.addWidget(frame)
+        vbox.setAlignment(frame, QtCore.Qt.AlignTop)
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setMinimumWidth(580)        
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+    def initValues(self):
+        #  TODO: init w/ non-hardcoded values?        
+        self.colorIndex.setValue(241)
+        self.markerSize.setValue(3)        
+
+class QOutlineEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        # Create Widgets
+        frame = QFramedWidget()
+        self.lineType = frame.addLabeledComboBox('Outfill Fill Area Style:',
+                                                 ['solid', 'dash', 'dot', 'dash-dot', 'long-dash'],
+                                                 indent=False)
+        self.lineColorIndex = frame.addLabeledSpinBox('Outfill Line Color Index:',
+                                                      0, 255, indent=False)
+        self.indexValues = frame.addLabeledLineEdit('Outfill Index Values:',
+                                                    indent=False)
+
+        # Init Values - TODO: init w/ non-hardcoded values?
+        self.lineColorIndex.setValue(241)
+        self.indexValues.setText('1')
+
+        # Set tool tips
+        self.lineType.setToolTip("Select the outline line type. ")
+        self.lineColorIndex.setToolTip("Enter the line color index value. There can only\nbe one color index value (ranging from 0 to 255).\nIf an error in the color index value occurs, then the\ndefault color value index (i.e., 241) will be used.")
+        self.indexValues.setToolTip("Outlines are drawn to enclose the specified values\nin the data array. As few as one, or\nas many as\nten values, can be specified:\noutline=([n1,[n2,[n3,...[n10]...]]]).")        
+
+        vbox.addWidget(frame)
+        vbox.setAlignment(frame, QtCore.Qt.AlignTop)
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setMinimumWidth(580)        
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)        
+
+class QOutfillEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        # Create Widgets
+        frame = QFramedWidget()
+        self.fillArea = frame.addLabeledComboBox('Outfill Fill Area Style:',
+                                                 ['Solid', 'Hatch', 'Pattern', 'Hallow'],
+                                                 indent=False)
+        self.fillAreaIndex = frame.addLabeledSpinBox('Outfill Fill Area Index:',
+                                                     1, 20, indent=False)
+        self.fillColorIndex = frame.addLabeledSpinBox('Outfill Fill Area Color Index:',
+                                                      0, 255, indent=False)
+        self.indexValues = frame.addLabeledLineEdit('Outfill Index Values:',
+                                                    indent=False)
+        vbox.addWidget(frame)
+        vbox.setAlignment(frame, QtCore.Qt.AlignTop)
+
+        self.initValues()
+
+        # Set ToolTips
+        self.fillArea.setToolTip("Select the outfill fill area style type. ")
+        self.fillAreaIndex.setToolTip("Select the outfill fill area index value. ")
+        self.fillColorIndex.setToolTip("Enter the fillarea color index value. There can only\nbe one color index value (ranging from 0 to 255).\nIf an error in the color index value occurs, then the\ndefault color value index (i.e., 241) will be used.")
+        self.indexValues.setToolTip("Outlines are filled to enclose the selected values\nthat appear in the data array. As few as one, or\nas many as ten values, can be specified:\noutline=([n1,[n2,[n3,...[n10]...]]]).")
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setMinimumWidth(580)        
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+    def initValues(self):
+        # TODO - init w/ non hardcoded values?
+        self.fillAreaIndex.setValue(1)
+        self.fillColorIndex.setValue(241)
+        self.indexValues.setText('1')
+        
+class Q1DPlotEditor(QtGui.QScrollArea):
+
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        frame = QFramedWidget()
+        frame.addWidget(QtGui.QLabel('Define up to 15 values:'), QtCore.Qt.AlignTop)
+        self.lineTypes = frame.addLabeledLineEdit('Line Types: ')
+        self.lineColors = frame.addLabeledLineEdit('Line Colors: ')
+        self.lineWidths = frame.addLabeledLineEdit('Line Widths: ')
+        self.markerTypes = frame.addLabeledLineEdit('Marker Types: ')
+        self.markerColors = frame.addLabeledLineEdit('Marker Colors: ')
+        self.markerSizes = frame.addLabeledLineEdit('Marker Sizes: ')
+
+        self.initValues()
+        self.lineTypes.setToolTip("Set the line types. The line values can either be\n('solid', 'dash', 'dot', 'dash-dot', 'long-dash')\nor (0, 1, 2, 3, 4) or None")
+        self.lineColors.setToolTip("Set the line colors. The line color attribute\n values must be integers ranging from 0 to 255.\n(e.g., 16, 32, 48, 64) ")
+        self.lineWidths.setToolTip("Set the line width. The line width is an integer\nor float value in the range (1 to 100)")
+        self.markerTypes.setToolTip("Set the marker types. The marker values can either\nbe (None, 'dot', 'plus', 'star', 'circle', 'cross', 'diamond',\n'triangle_up', 'triangle_down', 'triangle_left',\n'triangle_right', 'square', 'diamond_fill',\n'triangle_up_fill', 'triangle_down_fill',\n'triangle_left_fill', 'triangle_right_fill',\n'square_fill') or (0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n10, 11, 12, 13, 14, 15, 16, 17) or None. ")
+        self.markerColors.setToolTip("Set the marker colors. The marker color attribute\nvalues must be integers ranging from 0 to 255.")
+        self.markerSizes.setToolTip("Set the marker sizes. The marker size attribute\nvalues must be integers or floats ranging  from\n1 to 300. " )
+
+        vbox.addWidget(frame)
+        vbox.setAlignment(frame, QtCore.Qt.AlignTop)
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setMinimumWidth(580)
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+    def initValues(self):
+        # TODO ?
+        self.lineTypes.setText('None')
+        self.lineColors.setText('None')
+        self.lineWidths.setText('None')
+        self.markerTypes.setText('None')
+        self.markerColors.setText('None')
+        self.markerSizes.setText('None')
+
+class QMeshfillEditor(QtGui.QScrollArea):
+
+    def __init__(self, parent=None, gm=None):
+        QtGui.QWidget.__init__(self, parent)
+        
+        if type(gm) in [types.ListType, types.TupleType, types.NoneType]:
+            self.gm = gm
+        else:
+            self.gm=[gm,]
+
+        vbox = QtGui.QVBoxLayout()
+    
+        # General Settings
+        genSettings = QFramedWidget('General Settings')
+        self.missing = genSettings.addLabeledLineEdit('Missing:')
+        self.xWrap = genSettings.addLabeledLineEdit('X Wrap:')
+        self.yWrap = genSettings.addLabeledLineEdit('Y Wrap:', newRow = False)
+        self.genLegend = genSettings.addLabeledLineEdit('Legend Labels')
+        self.showMesh = genSettings.addRadioFrame('Show Mesh:', ['No', 'Yes'])
+        self.ext1 = genSettings.addRadioFrame('Ext 1:', ['No', 'Yes'], newRow=False)
+        self.ext2 = genSettings.addRadioFrame('Ext 2:', ['No', 'Yes'], newRow=False)
+        vbox.addWidget(genSettings)
+
+        # Custom Settings
+        custSettings = QFramedWidget('Custom Settings')
+        custSettings.addLabel('Define iso level range values')
+        self.incZero = custSettings.addRadioFrame('Include Zero:', ['Off', 'On'],
+                                                  newRow=False)
+        self.ranges = custSettings.addLabeledLineEdit('Ranges:')
+        self.colors = custSettings.addLabeledLineEdit('Colors:')
+        self.lineTypes = custSettings.addLabeledLineEdit('Line Types:')
+        self.lineWidths = custSettings.addLabeledLineEdit('Line Widths:')
+        self.orientation = custSettings.addLabeledLineEdit('Orientation:')
+        self.arrowScale = custSettings.addLabeledLineEdit('Contour Arrows Scale:')
+        self.arrowSpacing = custSettings.addLabeledLineEdit('Contour Arrows Spacing:')
+        self.arrowAngle = custSettings.addLabeledLineEdit('Contour Arrows Angle:')
+        self.custLegend = custSettings.addLabeledLineEdit('Legend Labels:')
+        self.isolineLabels = custSettings.addRadioFrame('Isoline Labels:',
+                                                        ['Off', 'On'])
+        custSettings.newRow()
+        custSettings.addLabel('Define iso level parameters:')
+        self.spacing = custSettings.addRadioFrame('Spacing:',
+                                                  ['Linear', 'Log'],
+                                                  newRow=False)
+        self.minVal = custSettings.addLabeledLineEdit('Minimum Value:')
+        self.maxVal = custSettings.addLabeledLineEdit('Maximum Value:')
+        self.nIntervals = custSettings.addLabeledSpinBox('Number of Intervals:',
+                                                         2, 223)
+        self.smallestExpLabel, self.smallestExp = custSettings.addLabelAndLineEdit('Smallest Exponent for Negative Values:')
+        self.numNegDecLabel, self.numNegDec = custSettings.addLabelAndLineEdit('Number of Negative Decades:')
+        genRangesButton = custSettings.addButton('Generate Ranges')
+        clearButton = custSettings.addButton('Clear All', newRow=False)
+        vbox.addWidget(custSettings)
+
+        # Init values / tool tips
+        self.initValues()
+        self.setToolTips()
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)        
+
+        # Connect Signals
+        self.connect(clearButton, QtCore.SIGNAL('pressed()'),
+                     custSettings.clearAllLineEdits)
+        self.connect(self.spacing.getButton('Linear'),
+                     QtCore.SIGNAL('pressed()'),
+                     lambda : self.setEnabledLogLineEdits(False))
+        self.connect(self.spacing.getButton('Log'),
+                     QtCore.SIGNAL('pressed()'),
+                     lambda : self.setEnabledLogLineEdits(True))
+        self.connect(genRangesButton, QtCore.SIGNAL('pressed()'),
+                     self.generateRanges)        
+
+    def initValues(self):
+        # TODO : init missing, x wrap, y wrap, legend labels
+
+        self.showMesh.setChecked('No')
+        self.ext1.setChecked('No')
+        self.ext2.setChecked('No')
+        self.incZero.setChecked('Off')
+        self.spacing.setChecked('Linear')
+        self.setEnabledLogLineEdits(False)
+
+    def generateRanges(self):
+        try:
+            minValue = float(self.minVal.text())
+            maxValue = float(self.maxVal.text())
+            numIntervals = int(self.nIntervals.text())
+        except:
+            QSimpleMessageBox('Values must be a number', self).show()
+            return
+        
+        if numIntervals < 2 or numIntervals > 223:
+            QSimpleMessageBox("The 'number of intervals' value must be between 2 and 223.",
+                              self).show()
+            return
+
+        colors = []
+        values = []                
+        value = minValue
+        color = 16
+
+        # Generate ranges and colors (Linear)
+        if self.spacing.isChecked('Linear'):
+            delta = float((maxValue - minValue) / numIntervals)
+            d = int(222 / (numIntervals - 1))
+            
+            for a in range(numIntervals + 1):
+                if color <= 238:
+                    colors.append(color)
+                values.append(value)
+                color += d
+                value += delta
+        # Generate ranges (Log)                
+        else:
+            A = float(self.minVal.text())
+            B = float(self.maxVal.text())
+            C = float(self.nIntervals.text())
+            try:
+                D = float(self.smallestExp.text())
+            except:
+                D = 0
+            try:
+                E = float(self.numNegDec.text())
+            except:
+                E = 0
+
+            if C > 0:
+                if E > 0:  # Generate negative contours
+                    for i in range(int(E * C), 0, -1):
+                        values.append(round_number(-10.0 ** (D+(i-1)/C)))
+                if B > 0:  # Generate positive contours
+                    for i in range(1, int((B * C) + 1)):
+                        values.append(round_number(10.0 ** (A+(i-1)/C)))
+            else:
+                QSimpleMessageBox("The 'Levels per Decade' must be a positive number.").show()
+
+            # Gen colors (Log)
+            numIntervals = len(values) - 1
+            d = int(222 / (numIntervals - 1))
+            for a in range(numIntervals):
+                colors.append(16 + a * d)
+            
+        if self.incZero.isChecked('On'):
+            values.insert(0, 0.0)
+
+        self.ranges.setText(str(values))
+        self.colors.setText(str(colors))
+
+    def setEnabledLogLineEdits(self, enable):
+        """ Disable or Enable the 'Num neg decades' and 'smallest exp for neg
+        values' lineEdits """
+        self.smallestExp.setEnabled(enable)
+        self.numNegDec.setEnabled(enable)
+        self.smallestExpLabel.setEnabled(enable)
+        self.numNegDecLabel.setEnabled(enable)
+
+        if enable == True:
+            self.smallestExp.setToolTip("Smallest exponent for negative values")
+            self.numNegDec.setToolTip("Number of negative decades.")
+        else:
+            self.smallestExp.setToolTip("Disabled. Not in use for linear spacing.")
+            self.numNegDec.setToolTip("Disabled. Not in use for linear spacing.")                    
+
+    def setToolTips(self):
+        # General Setting Tips
+        self.missing.setToolTip("Set the missing color index value. The colormap\nranges from 0 to 255, enter the desired color index value 0\nthrough 255.")
+        self.xWrap.setToolTip("Set the wrapping along X axis, 0 means no wrapping")
+        self.yWrap.setToolTip("Set the wrapping along Y axis, 0 means no wrapping")
+        self.genLegend.setToolTip("Specify the desired legend labels.\nFor example:\nNone -- Allow VCS to generate legend labels\n( ), or [ ], or { } -- No legend labels\n[ 0, 10, 20 ]  or  { 0:'0', 10:'10', 20:'20' }\n[ 0, 10 ]  or  { 0:'text', 10:'more text' }")        
+        
+        # Custom Setting Tips
+        self.ranges.setToolTip("The iso level range values. (e.g., 10, 20, 30, 40, 50).")
+        self.colors.setToolTip("The iso level color index values. The index colors range\nfrom 0 to 255. For example:\n   Use explicit indices: 16, 32, 48, 64, 80;\n   Use two values to generate index range: 16, 32")
+        self.lineTypes.setToolTip("The line type for the isolines. (e.g., 4, 1, 3, 2, 0).")
+        self.lineWidths.setToolTip("The width values for the isolines. (e.g., 1, 3, 5, 2, 7).")
+        self.orientation.setToolTip("Drawing orientation arrows:\n none (0)\n clokwise (1)\n clockwise where y axis is positive (2)\n clockwise where x axis is positive(3)\n Negative values indicate counter-clockwise.")
+        self.arrowScale.setToolTip("Scale factor for arrows length")
+        self.arrowSpacing.setToolTip("Spacing factor for arrows")
+        self.arrowAngle.setToolTip("Angle of Arrows heads")
+        self.isolineLabels.setToolTip("Toggle 'Isoline Labels' on or off.")
+        self.custLegend.setToolTip("Specify the desired legend labels.\nFor example:\nNone -- Allow VCS to generate legend labels\n( ), or [ ], or { } -- No legend labels\n[ 0, 10, 20 ]  or  { 0:'0', 10:'10', 20:'20' }\n[ 0, 10 ]  or  { 0:'text', 10:'more text' }")
+        self.minVal.setToolTip("The minimum contour level.")
+        self.maxVal.setToolTip("The maximum contour level.")
+        self.nIntervals.setToolTip("The number of intervals between each contour level. Maximum number range [2 to 223].")
+        self.smallestExp.setToolTip("Disabled. Not in use for linear spacing.")
+        self.numNegDec.setToolTip("Disabled. Not in use for linear spacing.")     
+
+class QContourEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+
+        #### TODO gm stuff
+
+        frame = QFramedWidget()
+
+        frame.addWidget(QtGui.QLabel('Define iso level range values:'))
+        self.includeZeroButtonGroup = frame.addRadioFrame('Include Zero:',
+                                                          ['Off', 'On'],
+                                                          newRow=False)
+        self.ranges = frame.addLabeledLineEdit('Ranges:')
+        self.colors = frame.addLabeledLineEdit('Colors:')
+        self.lineTypes = frame.addLabeledLineEdit('Line Types:', )
+        self.lineWidths = frame.addLabeledLineEdit('Line Widths:')
+        self.orientation = frame.addLabeledLineEdit('Orientation:')
+        self.arrowScale = frame.addLabeledLineEdit('Contour Arrows Scale:')
+        self.arrowSpacing = frame.addLabeledLineEdit('Contour Arrows Spacing:')
+        self.angle = frame.addLabeledLineEdit('Contour Arrows Angle:')
+        self.labelButtonGroup = frame.addRadioFrame('Isoline Labels:',
+                                                    ['Off', 'On'])
+        self.legendLabels = frame.addLabeledLineEdit('Legend Labels')
+        frame.newRow()
+        frame.addWidget(QtGui.QLabel('Define iso level parameters:'))
+        self.spacingButtonGroup = frame.addRadioFrame('Spacing:',
+                                                      ['Linear', 'Log'],
+                                                      newRow=False)
+        self.minVal = frame.addLabeledLineEdit('Minimum Value:')
+        self.maxVal = frame.addLabeledLineEdit('Maximum Value:')
+        self.nIntervals = frame.addLabeledSpinBox('Number of Intervals:',
+                                                  2, 223,)
+        self.smallestExpLabel, self.smallestExp = frame.addLabelAndLineEdit('Smallest Exponent for Negative Values:')
+        self.numNegDecLabel, self.numNegDec = frame.addLabelAndLineEdit('Number of Negative Decades:')
+        genRangesButton = frame.addButton('Generate Ranges')
+        clearButton = frame.addButton('Clear All', newRow=False)
+
+        vbox.addWidget(frame)
+        self.frame = frame
+
+        # Init values / tool tips
+        self.initValues()
+        self.setToolTips()
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setLayout(vbox)
+        widgetWrapper.setMinimumWidth(630)        
+        self.setWidget(widgetWrapper)        
+
+        # Connect Signals
+        self.connect(clearButton, QtCore.SIGNAL('pressed()'),
+                     self.frame.clearAllLineEdits)
+        self.connect(genRangesButton, QtCore.SIGNAL('pressed()'),
+                     self.generateRanges)
+        self.connect(self.spacingButtonGroup.getButton('Linear'),
+                     QtCore.SIGNAL('pressed()'),
+                     lambda : self.setEnabledLogLineEdits(False))
+        self.connect(self.spacingButtonGroup.getButton('Log'),
+                     QtCore.SIGNAL('pressed()'),
+                     lambda : self.setEnabledLogLineEdits(True))
+
+    def initValues(self):
+        self.includeZeroButtonGroup.setChecked('Off')
+        self.spacingButtonGroup.setChecked('Linear')
+        self.setEnabledLogLineEdits(False)
+
+        self.minVal.setText('1.0')
+        self.maxVal.setText('2.0')
+        self.nIntervals.setValue(2)
+
+    def generateRanges(self):
+        try:
+            minValue = float(self.minVal.text())
+            maxValue = float(self.maxVal.text())
+            numIntervals = int(self.nIntervals.text())
+        except:
+            QSimpleMessageBox('Values must be a number', self).show()
+            return
+        
+        if numIntervals < 2 or numIntervals > 223:
+            QSimpleMessageBox("The 'number of intervals' value must be between 2 and 223.",
+                              self).show()
+            return
+
+        colors = []
+        values = []                
+        value = minValue
+        color = 16
+
+        # Generate ranges and colors (Linear)
+        if self.spacingButtonGroup.isChecked('Linear'):
+            delta = float((maxValue - minValue) / numIntervals)
+            d = int(222 / (numIntervals - 1))
+            
+            for a in range(numIntervals + 1):
+                if color <= 238:
+                    colors.append(color)
+                values.append(value)
+                color += d
+                value += delta
+        # Generate ranges (Log)                
+        else:
+            A = float(self.minVal.text())
+            B = float(self.maxVal.text())
+            C = float(self.nIntervals.text())
+            try:
+                D = float(self.smallestExp.text())
+            except:
+                D = 0
+            try:
+                E = float(self.numNegDec.text())
+            except:
+                E = 0
+
+            if C > 0:
+                if E > 0:  # Generate negative contours
+                    for i in range(int(E * C), 0, -1):
+                        values.append(round_number(-10.0 ** (D+(i-1)/C)))
+                if B > 0:  # Generate positive contours
+                    for i in range(1, int((B * C) + 1)):
+                        values.append(round_number(10.0 ** (A+(i-1)/C)))
+            else:
+                QSimpleMessageBox("The 'Levels per Decade' must be a positive number.").show()
+
+            # Gen colors (Log)
+            numIntervals = len(values) - 1
+            d = int(222 / (numIntervals - 1))
+            for a in range(numIntervals):
+                colors.append(16 + a * d)
+            
+        if self.includeZeroButtonGroup.isChecked('On'):
+            values.insert(0, 0.0)
+
+        self.ranges.setText(str(values))
+        self.colors.setText(str(colors))
+
+    def setEnabledLogLineEdits(self, enable):
+        """ Disable or Enable the 'Num neg decades' and 'smallest exp for neg
+        values' lineEdits """        
+        self.smallestExp.setEnabled(enable)
+        self.numNegDec.setEnabled(enable)
+        self.smallestExpLabel.setEnabled(enable)
+        self.numNegDecLabel.setEnabled(enable)
+
+        if enable == True:
+            self.smallestExp.setToolTip("Smallest exponent for negative values")
+            self.numNegDec.setToolTip("Number of negative decades.")
+        else:
+            self.smallestExp.setToolTip("Disabled. Not in use for linear spacing.")
+            self.numNegDec.setToolTip("Disabled. Not in use for linear spacing.")            
+
+    def setToolTips(self):
+        self.ranges.setToolTip("The iso level range values. (e.g., 10, 20, 30, 40, 50).")
+        self.colors.setToolTip("The iso level color index values. The index colors range\nfrom 0 to 255. For example:\n   Use explicit indices: 16, 32, 48, 64, 80;\n   Use two values to generate index range: 16, 32")
+        self.lineTypes.setToolTip("The line type for the isolines. (e.g., 4, 1, 3, 2, 0).")
+        self.lineWidths.setToolTip("The width values for the isolines. (e.g., 1, 3, 5, 2, 7).")
+        self.orientation.setToolTip("Drawing orientation arrows:\n none (0)\n clokwise (1)\n clockwise where y axis is positive (2)\n clockwise where x axis is positive(3)\n Negative values indicate counter-clockwise.")
+        self.arrowScale.setToolTip("Scale factor for arrows length")
+        self.arrowSpacing.setToolTip("Spacing factor for arrows")
+        self.angle.setToolTip("Angle of Arrows heads")
+        self.labelButtonGroup.setToolTip("Toggle 'Isoline Labels' on or off.")
+        self.legendLabels.setToolTip("Specify the desired legend labels.\nFor example:\nNone -- Allow VCS to generate legend labels\n( ), or [ ], or { } -- No legend labels\n[ 0, 10, 20 ]  or  { 0:'0', 10:'10', 20:'20' }\n[ 0, 10 ]  or  { 0:'text', 10:'more text' }")
+        self.minVal.setToolTip("The minimum contour level.")
+        self.maxVal.setToolTip("The maximum contour level.")
+        self.nIntervals.setToolTip("The number of intervals between each contour level. Maximum number range [2 to 223].")
+        self.smallestExp.setToolTip("Disabled. Not in use for linear spacing.")
+        self.numNegDec.setToolTip("Disabled. Not in use for linear spacing.")        
+
+class QContinentsEditor(QtGui.QScrollArea):
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+        frame = QFramedWidget()
+        
+        self.lineTypeComboBox = frame.addLabeledComboBox('Continents Line Type:',
+                                                         ['solid', 'dash', 'dot', 'dash-dot', 'long-dash'])
+        self.lineColorIndex = frame.addLabeledSpinBox('Continents Line Color Index:',
+                                                      0, 255)
+        self.lineWidth = frame.addLabeledSpinBox('Continents Line Width:', 1, 300)
+        self.typeIndex = frame.addLabeledSpinBox('Continents Type Index:', -1, 11)
+        vbox.addWidget(frame)
+
+        # Init values / tool tips
+        self.initValues()
+        self.setToolTips()
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setMinimumWidth(580)
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+    def initValues(self):
+        self.lineColorIndex.setValue(0)
+        self.lineWidth.setValue(1)
+        self.typeIndex.setValue(-1)
+
+    def setToolTips(self):
+        self.lineTypeComboBox.setToolTip('Select the continents line type.')
+        self.lineColorIndex.setToolTip('Select the continents color index.')
+        self.lineWidth.setToolTip('Set the continents line width.')
+        self.typeIndex.setToolTip("Select the continents type index.Where\n-1 = 'Auto Continents';\n0 = 'No Continents';\n1 = 'Fine Continents';\n2 = 'Coarse Continents';\n3 = 'United States Continents';\n4 = 'Political Borders Continents';\n5 = 'Rivers Continents';\n6 - 11 = 'User defined Continents'")
+
+    def getLineType(self):
+        return self.lineTypeComboBox.currentText()
+        
+    def getTypeIndex(self):
+        try:
+            return int(self.typeIndex.text())
+        except:
+            return None
+
+    def getLineWidth(self):
+        try:
+            return int(self.lineWidth.text())
+        except:
+            return None
+
+    def getLineColorIndex(self):
+        try:
+            return int(self.lineColorIndex.text())
+        except:
+            return None        
+        
+class QBoxfillEditor(QtGui.QScrollArea):
+
+    def __init__(self, parent=None, gm=None):
+        QtGui.QScrollArea.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+        
+        if type(gm) in [types.ListType, types.TupleType, types.NoneType]:
+            self.gm = gm
+        elif type(gm) is not None:
+            self.gm=[gm,]
+
+        # 'define boxfill attributes + boxfill type radio buttons'
+        hbox1 = QtGui.QHBoxLayout()
+        hbox1.addWidget(QtGui.QLabel('Define boxfill attribute values'))
+
+        self.boxfillTypeButtonGroup = QRadioButtonFrame('Boxfill type:')
+        self.boxfillTypeButtonGroup.addButtonList(['linear', 'log10', 'custom'])
+        hbox1.addWidget(self.boxfillTypeButtonGroup)
+                                             
+        vbox.addLayout(hbox1)
+
+        # General Settings 
+        generalSettings = QFramedWidget('General Settings')
+        self.missingLineEdit = generalSettings.addLabeledLineEdit('Missing:')
+        self.ext1ButtonGroup = generalSettings.addRadioFrame('Ext1:',
+                                                             ['No', 'Yes'],
+                                                             newRow = False)
+        self.ext2ButtonGroup = generalSettings.addRadioFrame('Ext2:',
+                                                             ['No', 'Yes'],
+                                                             newRow = False)
+        self.legendLineEdit = generalSettings.addLabeledLineEdit('Legend Labels:')
+        vbox.addWidget(generalSettings)
+        
+        # Linear & Log Settings
+        linLogSettings = QFramedWidget('Linear and Log Settings')
+
+        self.level1LineEdit = linLogSettings.addLabeledLineEdit('Level 1:')
+        self.level2LineEdit = linLogSettings.addLabeledLineEdit('Level 2:',
+                                                                newRow = False)
+        self.color1LineEdit = linLogSettings.addLabeledLineEdit('Color 1:')
+        self.color2LineEdit = linLogSettings.addLabeledLineEdit('Color 2:',
+                                                                newRow = False)        
+        vbox.addWidget(linLogSettings)
+        
+        # Custom Settings
+        customSettings = QFramedWidget('Custom Settings')
+
+        customSettings.addWidget(QtGui.QLabel('Define iso level range values:'))
+        self.includeZeroButtonGroup = customSettings.addRadioFrame('Include Zero:',
+                                                                   ['Off', 'On'],
+                                                                   newRow=False)
+        self.rangeLineEdit = customSettings.addLabeledLineEdit('Ranges:')
+        self.colorsLineEdit = customSettings.addLabeledLineEdit('Colors:')
+
+        customSettings.newRow()
+        customSettings.addWidget(QtGui.QLabel('Define iso level parameters:'))
+        self.spacingButtonGroup = customSettings.addRadioFrame('spacing:',
+                                                               ['Linear', 'Log'],
+                                                               newRow=False)
+
+        self.minValLineEdit = customSettings.addLabeledLineEdit('Minimum Value:')
+        self.maxValLineEdit = customSettings.addLabeledLineEdit('Maximum Value:')
+        self.nIntervals = customSettings.addLabeledSpinBox('Number of Intervals:',
+                                                                   2, 223)
+        self.smallestExpLabel, self.expLineEdit = customSettings.addLabelAndLineEdit('Smallest Exponent for Negative Values:')
+        self.numNegDecLabel, self.negDecadesLineEdit = customSettings.addLabelAndLineEdit('Number of Negative Decades:')
+        genRangesButton = customSettings.addButton('Generate Ranges')
+        clearButton = customSettings.addButton('Clear All', newRow=False)        
+        vbox.addWidget(customSettings)
+
+        # Init values
+        self.initValues()
+        self.setToolTips()
+
+        # Set up the scrollbar
+        widgetWrapper = QtGui.QWidget()
+        widgetWrapper.setLayout(vbox)
+        self.setWidget(widgetWrapper)
+
+        # Connect Signals
+        self.connect(clearButton, QtCore.SIGNAL('pressed()'), self.clearCustomSettings)
+        self.connect(genRangesButton, QtCore.SIGNAL('pressed()'), self.generateRanges)
+        self.connect(self.spacingButtonGroup.getButton('Linear'),
+                     QtCore.SIGNAL('pressed()'),
+                     lambda : self.setEnabledLogLineEdits(False))
+        self.connect(self.spacingButtonGroup.getButton('Log'),
+                     QtCore.SIGNAL('pressed()'),
+                     lambda : self.setEnabledLogLineEdits(True))
+
+    def initValues(self):
+        if self.gm is None:
+            return
+
+        # Init Line Edit Text
+        self.missingLineEdit.setText(str(self.gm[0].missing))
+        self.legendLineEdit.setText('None')
+        self.level1LineEdit.setText(str(self.gm[0].level_1))
+        self.level2LineEdit.setText(str(self.gm[0].level_2))
+        self.color1LineEdit.setText(str(self.gm[0].color_1))
+        self.color2LineEdit.setText(str(self.gm[0].color_2))
+        self.rangeLineEdit.setText(str(self.gm[0].levels))
+        self.colorsLineEdit.setText('None')
+        self.minValLineEdit.setText('')
+        self.maxValLineEdit.setText('')
+        self.expLineEdit.setText('')
+        self.negDecadesLineEdit.setText('')
+        self.nIntervals.setValue(2)
+        self.setEnabledLogLineEdits(False)
+
+        # Init selected radio buttons
+        self.boxfillTypeButtonGroup.setChecked('linear')
+        self.ext1ButtonGroup.setChecked('No')
+        self.ext2ButtonGroup.setChecked('No')
+        self.includeZeroButtonGroup.setChecked('Off')
+        self.spacingButtonGroup.setChecked('Linear')
+
+    def generateRanges(self):
+        try:
+            minValue = float(self.minValLineEdit.text())
+            maxValue = float(self.maxValLineEdit.text())
+            numIntervals = int(self.nIntervals.text())
+        except:
+            QSimpleMessageBox('Values must be a number', self).show()
+            return
+        
+        if numIntervals < 2 or numIntervals > 223:
+            QSimpleMessageBox("The 'number of intervals' value must be between 2 and 223.",
+                              self).show()
+            return
+
+        colors = []
+        values = []                
+        value = minValue
+        color = 16
+
+        # Generate ranges and colors (Linear)
+        if self.spacingButtonGroup.isChecked('Linear'):
+            delta = float((maxValue - minValue) / numIntervals)
+            d = int(222 / (numIntervals - 1))
+            
+            for a in range(numIntervals + 1):
+                if color <= 238:
+                    colors.append(color)
+                values.append(value)
+                color += d
+                value += delta
+        # Generate ranges (Log)                
+        else:
+            A = float(self.minValLineEdit.text())
+            B = float(self.maxValLineEdit.text())
+            C = float(self.nIntervals.text())
+
+            try:
+                D = float(self.expLineEdit.text())
+            except:
+                D = 0
+            try:
+                E = float(self.negDecadesLineEdit.text())
+            except:
+                E = 0
+
+            if C > 0:
+                if E > 0:  # Generate negative contours
+                    for i in range(int(E * C), 0, -1):
+                        values.append(round_number(-10.0 ** (D+(i-1)/C)))
+                if B > 0:  # Generate positive contours
+                    for i in range(1, int((B * C) + 1)):
+                        values.append(round_number(10.0 ** (A+(i-1)/C)))
+            else:
+                QSimpleMessageBox("The 'Levels per Decade' must be a positive number.").show()
+
+            # Gen colors (Log)
+            numIntervals = len(values) - 1
+            d = int(222 / (numIntervals - 1))
+            for a in range(numIntervals):
+                colors.append(16 + a * d)
+            
+        if self.includeZeroButtonGroup.isChecked('On'):
+            values.insert(0, 0.0)
+
+        self.rangeLineEdit.setText(str(values))
+
+        self.colorsLineEdit.setText(str(colors))
+        
+    def setEnabledLogLineEdits(self, enable):
+        """ Disable or Enable the 'Num neg decades' and 'smallest exp for neg
+        values' lineEdits """
+        self.expLineEdit.setEnabled(enable)
+        self.negDecadesLineEdit.setEnabled(enable)
+        self.smallestExpLabel.setEnabled(enable)
+        self.numNegDecLabel.setEnabled(enable)
+
+        if enable == True:
+            self.expLineEdit.setToolTip("Smallest exponent for negative values")
+            self.negDecadesLineEdit.setToolTip("Number of negative decades.")
+        else:
+            self.expLineEdit.setToolTip("Disabled. Not in use for linear spacing.")
+            self.negDecadesLineEdit.setToolTip("Disabled. Not in use for linear spacing.")            
+
+    def setToolTips(self):
+        self.missingLineEdit.setToolTip("Set the missing color index value. The colormap\nranges from 0 to 255, enter the desired color index value 0\nthrough 255.")
+        self.legendLineEdit.setToolTip("Specify the desired legend labels.\nFor example:\n None -- Allow VCS to generate legend labels\n(), or [ ], or { } -- No legend  labels\n [0, 10, 20] or { 0:'0', 10:'10', 20:'20' }\n[ 0, 10 ] or { 0:'text', 10:'more text'}")
+        self.level1LineEdit.setToolTip("The minimum data value. If level 1 is set to '1e+20',\nthen VCS will select the level.")
+        self.level2LineEdit.setToolTip("The maximum data value. If level 2 is set to '1e+20',\nthen VCS will select the level.")
+        self.color1LineEdit.setToolTip("The minimum color range index value. The colormap\nranges from 0 to 255, but only color indices 0\nthrough 239 can be changed.")
+        self.color2LineEdit.setToolTip("The maximum color range index value. The colormap\nranges from 0 to 255, but only color indices 0\nthrough 239 can be changed.")
+        self.rangeLineEdit.setToolTip("The iso level range values. (e.g., 10, 20, 30, 40, 50).")
+        self.colorsLineEdit.setToolTip("The iso level color index values. The index colors range\nfrom 0 to 255. For example:\n   Use explicit indices: 16, 32, 48, 64, 80;\n   Use two values to generate index range: 16, 32")
+        self.minValLineEdit.setToolTip("The minimum contour level.")
+        self.maxValLineEdit.setToolTip("The maximum contour level.")
+        self.nIntervals.setToolTip("The number of intervals between each contour level. Maximum number range [2 to 223].")
+        self.expLineEdit.setToolTip("Disabled. Not in use for linear spacing.")
+        self.negDecadesLineEdit.setToolTip("Disabled. Not in use for linear spacing.")
+
+    def clearCustomSettings(self):
+        self.rangeLineEdit.setText('')
+        self.colorsLineEdit.setText('')
+        self.minValLineEdit.setText('')
+        self.maxValLineEdit.setText('')
+        self.nIntervals.setValue(2)
+        self.expLineEdit.setText('')
+        self.negDecadesLineEdit.setText('')
+
+    def linearButtonPressEvent(self):
+        """ Disable the 'Num neg decades' and 'smallest exp for neg values'
+        lineEdits """
+        
+        self.expLineEdit.setReadOnly(True)
+        self.negDecadesLineEdit.setReadOnly(True)
+        self.expLineEdit.setText('')
+        self.negDecadesLineEdit.setText('')
+        self.expLineEdit.setToolTip("Disabled. Not in use for linear spacing.")
+        self.negDecadesLineEdit.setToolTip("Disabled. Not in use for linear spacing.")        
+
+    def logButtonPressEvent(self):
+        """ Enable the 'Num neg decades' and 'smallest exp for neg values'
+        lineEdits """
+        
+        self.expLineEdit.setReadOnly(False)
+        self.negDecadesLineEdit.setReadOnly(False)
+        self.expLineEdit.setText('')
+        self.negDecadesLineEdit.setText('')
+        self.expLineEdit.setToolTip("Smallest exponent for negative values")
+        self.negDecadesLineEdit.setToolTip("Number of negative decades.")
+
+    def setVistrailsGraphicsMethod(self, varViewWidget):
+        """ Vistrails: Update the vistrails' Graphics Method modules' boxfill
+        input ports  """
+
+        # Generate a list of tuples where each tuple is: (Input Port Name, value)
+        # and update the vistrails' graphics method input ports
+        visInput = []
+        visInput.append(('color_1', self.getValue(self.color1LineEdit, int)))
+        visInput.append(('color_2', self.getValue(self.color2LineEdit, int)))
+        visInput.append(('level_1', self.getValue(self.level1LineEdit, float)))
+        visInput.append(('level_2', self.getValue(self.level2LineEdit, float)))
+
+        varViewWidget.emit(QtCore.SIGNAL('createModule'), gm_name)
+        varViewWidget.emit(QtCore.SIGNAL('updateModuleOps'), gm_name, visInput)
+            
+    def getValue(self, lineEdit, convertType, default=None):
+        try:
+            return convertType(lineEdit.text())
+        except:
+            return default
+        
+class QSimpleMessageBox(QtGui.QMessageBox):
+
+    def __init__(self, text, parent):
+        QtGui.QMessageBox.__init__(self, parent)
+        self.setText(text)
+        
+class QFramedWidget(QtGui.QFrame):
+
+    def __init__(self, titleText=None, parent=None):
+        QtGui.QFrame.__init__(self, parent)    
+        self.setFrameStyle(QtGui.QFrame.Raised)
+        self.setFrameShape(QtGui.QFrame.Box)
+        self.lineEditList = []
+        self.vbox = QtGui.QVBoxLayout()
+        self.setLayout(self.vbox)
+        self.indent = 10
+
+        if titleText is not None:
+            title = QtGui.QLabel(titleText)
+            title.setFont(QtGui.QFont("Times", 14, QtGui.QFont.Bold))
+            self.vbox.addWidget(title)
+
+        self.newRow()
+
+    def setSpacing(self, spacing):
+        self.vbox.setSpacing(spacing)
+
+    def newRow(self):
+        self.hbox = QtGui.QHBoxLayout()
+        self.vbox.addLayout(self.hbox)
+
+    def addCheckBox(self, text, indent=True, newRow=True):
+        if newRow == True:
+            self.newRow()
+        if indent == True:
+            self.hbox.addSpacing(indentSpacing)
+
+        checkbox = QtGui.QCheckBox(text)
+        self.addWidget(checkbox)
+        return checkbox
+
+    def addLabeledComboBox(self, text, comboStringList, indent=True, newRow=True):
+        if newRow == True:
+            self.newRow()
+        if indent == True:
+            self.hbox.addSpacing(indentSpacing)
+
+        # Init combo box & set text to white on blue
+        comboBox = QtGui.QComboBox()
+        comboPalette = comboBox.view().palette()
+        comboPalette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.white)        
+        comboPalette.setColor(QtGui.QPalette.Highlight, QtCore.Qt.blue)
+        comboBox.view().setPalette(comboPalette)
+
+        for string in comboStringList:
+            comboBox.addItem(string)        
+            
+        self.addLabel(text)            
+        self.addWidget(comboBox)
+        return comboBox
+
+    def addLabeledSpinBox(self, text, minValue=None, maxValue=None,
+                          indent=True, newRow=True):
+        if newRow == True:
+            self.newRow()
+        if indent == True:
+            self.hbox.addSpacing(indentSpacing)
+
+        spinbox = QtGui.QSpinBox()
+        if maxValue is not None:
+            spinbox.setMaximum(maxValue)
+        if minValue is not None:
+            spinbox.setMinimum(minValue)
+        self.addWidget(QtGui.QLabel(text))
+        self.addWidget(spinbox)
+        
+        return spinbox
+
+    def addLabeledDoubleSpinBox(self, text, minValue=None, maxValue=None,
+                                step=None, indent=True, newRow=True):
+        if newRow == True:
+            self.newRow()
+        if indent == True:
+            self.hbox.addSpacing(indentSpacing)
+
+        spinbox = QtGui.QDoubleSpinBox()
+        if maxValue is not None:
+            spinbox.setMaximum(maxValue)
+        if minValue is not None:
+            spinbox.setMinimum(minValue)
+        if step is not None:
+            spinbox.setSingleStep(step)
+            
+        self.addWidget(QtGui.QLabel(text))
+        self.addWidget(spinbox)
+        return spinbox    
+
+    def addButton(self, text, newRow=True):
+        if newRow == True:
+            self.newRow()
+            
+        button = QtGui.QToolButton()
+        button.setText(text)
+        self.addWidget(button)
+        return button
+
+    def addRadioFrame(self, text, buttonList, newRow=True):
+        if newRow == True:
+            self.newRow()
+            
+        buttonGroup = QRadioButtonFrame(text, buttonList)            
+        self.addWidget(buttonGroup)
+        return buttonGroup
+
+    def clearAllLineEdits(self):
+        for lineEdit in self.lineEditList:
+            lineEdit.setText('')
+
+    def addLabeledLineEdit(self, text, indent=True, newRow=True, align=None):
+        if newRow == True:
+            self.newRow()
+        if indent == True:
+            self.hbox.addSpacing(indentSpacing)
+            
+        lineEdit = QtGui.QLineEdit()
+        self.lineEditList.append(lineEdit)
+        self.addWidget(QtGui.QLabel(text))
+        self.addWidget(lineEdit, align)
+
+        if align is not None:
+            self.vbox.setAlignment(self.hbox, align)
+        
+        return lineEdit
+
+    def addLabelAndLineEdit(self, text, indent=True, newRow=True):
+        if newRow == True:
+            self.newRow()
+        if indent == True:
+            self.hbox.addSpacing(indentSpacing)
+
+        lineEdit = QtGui.QLineEdit()
+        self.lineEditList.append(lineEdit)
+        label = QtGui.QLabel(text)
+        
+        self.addWidget(label)
+        self.addWidget(lineEdit)
+        return label, lineEdit        
+
+    def addWidget(self, widget, align=None):
+        if align is None:
+            self.hbox.addWidget(widget)
+        else:
+            self.hbox.addWidget(widget, alignment=align)
+
+    def addLabel(self, text):
+        label = QtGui.QLabel(text)
+        self.addWidget(label)
+        return label
+
+    def addSlider(self):
+        slider = QtGui.QSlider(QtCore.Qt.Horizontal)
+        self.addWidget(slider)
+        return slider
+
+    def addLabeledSlider(self, text, newRow=True):
+        if newRow == True:
+            self.newRow()
+            
+        labeledSlider = QLabeledSlider(text)
+        self.addWidget(labeledSlider)
+        return labeledSlider.getSlider()
+
+class QLabeledSlider(QtGui.QWidget):
+    def __init__(self, text, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout()
+        vbox.setSpacing(10)
+        self.setLayout(vbox)
+        self.text = text
+        self.label = QtGui.QLabel(text)
+        self.slider = QtGui.QSlider(QtCore.Qt.Horizontal)
+
+        vbox.addWidget(self.label)
+        vbox.addWidget(self.slider)
+
+        self.connect(self.slider, QtCore.SIGNAL('valueChanged(int)'),
+                     self.updateLabel)
+
+    def getSlider(self):
+        return self.slider
+
+    def updateLabel(self, value):
+        self.label.setText("%s  %d" %(self.text, value))
+            
+class QRadioButtonFrame(QtGui.QFrame):
+    """ Framed widget containing a label and list of radiobuttons """
+    def __init__(self, labelText=None, buttonList=None, parent=None):
+        QtGui.QFrame.__init__(self, parent)
+        self.setFrameStyle(QtGui.QFrame.Raised)
+        self.setFrameShape(QtGui.QFrame.Box)
+
+        self.hbox = QtGui.QHBoxLayout()
+        self.setLayout(self.hbox)
+        self.buttonGroup = QtGui.QButtonGroup()
+        self.buttons = {}
+
+        if labelText is not None:
+            self.addLabel(QtGui.QLabel(labelText))
+        if buttonList is not None:
+            self.addButtonList(buttonList)
+
+    def addLabel(self, label):
+        self.hbox.addWidget(label)
+
+    def addButton(self, button):
+        self.buttonGroup.addButton(button)
+        self.hbox.addWidget(button)
+        self.buttons[str(button.text())] = button
+
+    def setChecked(self, buttonText):
+        if buttonText in list(self.buttons):
+            self.buttons[buttonText].setChecked(True)
+
+    def isChecked(self, buttonText):
+        if buttonText in list(self.buttons):
+            return self.buttons[buttonText].isChecked()
+
+        return False
+
+    def getButton(self, buttonText):
+        if buttonText in list(self.buttons):
+            return self.buttons[buttonText]
+
+        return None
+
+    def addButtonList(self, buttonList):
+        """ Create and add buttons from a list of strings """
+        for buttonText in buttonList:
+            button = QtGui.QRadioButton(buttonText)
+            self.buttons[buttonText] = button
+            self.addButton(button)
+
+def round_number( N ):
+   import numpy
+   P = 10.0 ** ( numpy.floor(numpy.log10(abs(N) ) ) )
+   return( sign(N) * int( abs(N)/P + 0.5) * P )
+
+def sign ( N ):
+   if (N < 0): return -1
+   else: return 1
+
+        
diff --git a/contrib/cdat/gui_controller.py b/contrib/cdat/gui_controller.py
new file mode 100644
index 0000000..c6a9546
--- /dev/null
+++ b/contrib/cdat/gui_controller.py
@@ -0,0 +1,350 @@
+import core.modules.module_registry
+import core.modules.vistrails_module
+from logging import debug, warn
+from core.vistrail.connection import Connection
+from core.vistrail.port import Port
+from PyQt4 import QtGui, QtCore
+import api
+import vcs
+import os
+
+cdat_id = "edu.utah.sci.vistrails.cdat"
+
+# Module names
+# Note: open_name, quickplot_name, etc... are used in cdat_window.py
+# and graphics_method_controller.py
+open_name = 'open'
+quickplot_name = 'Quickplot'
+variable_name = 'Variable'
+cdatcell_name = 'CDATCell'
+gm_name = 'GraphicsMethod'
+
+# Port names
+
+
+# Module Namespaces
+namespace = {}
+namespace[open_name] = 'cdms2'
+namespace[quickplot_name] = 'cdat'
+namespace[variable_name] = 'cdat'
+namespace[cdatcell_name] = 'cdat'
+namespace[gm_name] = 'cdat'
+
+# MAJOR TODO: Support for multiple workflows
+
+class Workflow():
+    """ A Workflow contains a dict of modules belonging to the workflow. Workflow
+    manages the updating of its modules connections / values """
+    
+    def __init__(self):
+        """ Workflow contains a dictionary of modules in the workflow.
+        * Key - if module is a variable then the key is the name of the variable
+        otherwise the key is the name of the module. ***** IMPORTANT *****
+        * Value - module object
+        """
+        self.modules = {}
+        self.variableNames = [] # Names of the variables in this workflow
+        self.filename = None # Name of the cdms file associated with this workflow
+        
+    def moduleExists(self, key):
+        return key in list(self.modules)
+
+    def addModule(self, name, module, isVariable=False):
+        self.modules[name] = module
+
+        # If the module is a variable save the name and connect the variable
+        # module to the open module
+        if isVariable:
+            self.variableNames.append(name)
+            self.connectPorts(self.modules[open_name], 'dataset', module,
+                              'cdmsfile')
+
+    def updatePorts(self, var1, var2):
+        """ updatePorts(var1: str, var2: str)
+
+        updatePorts connects the output ports of Variable modules with vars
+        var1 and var2 to the input ports of Graphics Method and then connects
+        the output of Graphics Method to the input of CDATCell.
+        """
+        m_open = self.modules[open_name]
+        m_variable1 = self.modules[var1]
+        m_gm = self.modules[gm_name]
+        m_cdatcell = self.modules[cdatcell_name]
+
+        # Connect the variable module being plotted to the graphics method
+        # module and store the connection
+        self.connectPorts(m_variable1, 'variable', m_gm, 'slab1')
+
+        # Connect graphics method module & cdatcell module
+        self.connectPorts(m_gm, 'canvas', m_cdatcell, 'canvas')
+        self.connectPorts(m_gm, 'slab1', m_cdatcell, 'slab1')
+
+        # Connect the second variable module (if given) to graphics method
+        # and Graphics Method to CDATCell
+        if var2 is not None:
+            m_var2 = self.modules[var2]
+            self.connectPorts(m_var2, 'variable', m_gm, 'slab2')
+            self.connectPorts(m_gm, 'slab2', m_cdatcell, 'slab2')
+
+    def connectPorts(self, moduleA, outputPortName, moduleB, inputPortName):
+        """ connectPorts(moduleA: Module, outputPortName: str, moduleB: Module,
+                         inputPortName: str) -> Connection
+                         
+        connectPorts connects moduleA's outputPort to moduleB's inputPort.
+        """
+        reg = api.get_module_registry()
+        in_port = moduleA.get_port_spec(outputPortName, 'output')
+        out_port = moduleB.get_port_spec(inputPortName, 'input')
+
+        return api.add_connection(moduleA.id, outputPortName, moduleB.id,
+                                  inputPortName)
+
+    def updateModule(self, name, portName, value):
+        """ updateModule(name: str, portName: str, value: *)
+
+        updateModule updates the vistrail module given the module name, input
+        port name, and value
+        """
+        if name not in list(self.modules):
+            return
+
+        # Set the filename associated w/ this workflow
+        if name == open_name:
+            self.filename = value
+        
+        module = self.modules[name]
+        api.get_current_controller().update_function(module, portName, [value])
+
+    def updateModuleOps(self, name, args):
+        """ updateModule(name: str, args: list)
+
+        updateModule updates the vistrail module given the module name and a
+        list of tuples where each tuple = (input port name, value)
+        """
+        if name not in list(self.modules):
+            return
+        
+        module = self.modules[name]
+        for portName, value in args:
+            api.get_current_controller().update_function(module, portName,
+                                                         [value])
+
+class GuiController(QtCore.QObject):
+    """ GuiController calls vistrails functions and handles recording and
+    displaying teaching commands.
+
+    The two most important functions that GuiController provides are:
+    'createModule' and 'updateModule'.  'createModule' creates a new box.
+    'updateModule' updates the input of a box.  Widgets interact with
+    GuiController by sending signals (which is why GuiController inherits
+    from QObject).
+    """
+
+    def __init__(self, fileWidget, defVarWidget, varWidget):
+        """ __init__(fileWidget: QCDATFileWidget, defVarWidget:QDefinedVariable,
+                     varWidget: QVariableView)
+        """
+        QtCore.QObject.__init__(self)
+        self.teachingCommands = ''
+        self.editorPid = 0
+        self.recordCommands = True
+
+        self.workflows = [] # List of workflows
+
+        # X coordinates of open, variable, and plot related modules
+        self.openX = -300
+        self.variableX = -300
+        self.plotX = -320
+        
+        self.m_open = None 
+        self.m_variable = None 
+        self.m_graphics_method = None 
+        self.m_cdat_cell = None
+
+        # Connect the 3 main widgets to the primary GuiController
+        # functionality.  If a childwidget of the 3 main widgets wants to
+        # send signals to GuiController, then it must send it through one of the
+        # main widgets to try to keep things less messy
+        self.connect(fileWidget, QtCore.SIGNAL('createModule'),
+                     self.createModule)            
+        self.connect(fileWidget, QtCore.SIGNAL('updateModule'),
+                     self.updateModule)
+        self.connect(fileWidget, QtCore.SIGNAL('recordTeachingCommand'),
+                     self.recordTeachingCommand)        
+
+        self.connect(defVarWidget, QtCore.SIGNAL('createModule'),
+                     self.createModule)            
+        self.connect(defVarWidget, QtCore.SIGNAL('updateModule'),
+                     self.updateModule)
+        self.connect(defVarWidget, QtCore.SIGNAL('recordTeachingCommand'),
+                     self.recordTeachingCommand)                
+
+        self.connect(varWidget, QtCore.SIGNAL('recordTeachingCommand'),
+                     self.recordTeachingCommand)                
+        self.connect(varWidget, QtCore.SIGNAL('createModule'),
+                     self.createModule)
+        self.connect(varWidget, QtCore.SIGNAL('updateModule'),
+                     self.updateModule)
+        self.connect(varWidget, QtCore.SIGNAL('updateModuleOps'),
+                     self.updateModuleOps)
+        self.connect(varWidget, QtCore.SIGNAL('plot'),
+                     self.plot)
+
+    def createNewWorkflow(self):
+        """ createnewWorkflow(filename: str)
+
+        createNewWorkflow is called when the user selects a new file. It makes
+        a new workflow and appends it to the workflow list.
+        """
+        if self.workflows == []:
+            api.get_current_controller().change_selected_version(0)
+        
+        self.currentWorkflow = Workflow()
+        self.workflows.append(self.currentWorkflow)
+
+    def getCoordinates(self, name):
+        """ getCoordinates(name: str) -> x: int, y: int
+
+        Return the x, y coordinate of where to place the new module given the
+        name.
+        """
+        if name == open_name: 
+            self.openX += 100
+            return self.openX, 170
+        elif name == variable_name or name == quickplot_name:
+            self.variableX += 120
+            return self.variableX, 70
+        elif name == gm_name:
+            self.plotX += 160
+            return self.plotX, -70
+        elif name == cdatcell_name:
+            return self.plotX, -170
+
+    def createModule(self, name, key=None):
+        """ createModule(name: str, key: str)
+
+        createModule creates a new module given the name and adds it to the
+        current workflow.  If key is specified, use the key instead of the name
+        as the key into the workflow's module dictionary.
+
+        Note: For Variable modules I pass key = variabe name (the tabName)
+        """
+        # If module is the 'open' module, create a new workflow
+        if name == open_name:
+            self.createNewWorkflow()
+            
+        # If module is 'quickplot' module, and it already exists, do nothing
+        if name == quickplot_name:
+            if self.currentWorkflow.moduleExists(quickplot_name.lower()):
+                return
+
+        # Create & add the module
+        x, y = self.getCoordinates(name)
+        module = api.add_module(x, y, cdat_id, name, namespace[name])
+        
+        if key is not None:
+            self.currentWorkflow.addModule(key, module, isVariable=True)
+        else:
+            self.currentWorkflow.addModule(name, module)
+
+    def updateModule(self, name, portName, value):
+        """ updateModule(name: str, portName: str, value: *)
+
+        updateModule updates the vistrail module given the module name, input
+        port name, and value
+        """
+        self.currentWorkflow.updateModule(name, portName, value)
+
+    def updateModuleOps(self, name, args):
+        """ updateModule(name: str, args: list)
+
+        updateModule updates the vistrail module given the module name and a
+        list of tuples where each tuple = (input port name, value)
+        """
+        self.currentWorkflow.updateModuleOps(name, args)
+
+    def plot(self, var1, var2):
+        """ Connect / disconnect the necessary ports and exec workflow -> plot
+        into the cell
+        """
+        self.currentWorkflow.updatePorts(var1, var2)
+        api.get_current_controller().execute_current_workflow()
+
+    def initTeachingCommands(self):
+        """  The initial teaching commands still have 4 canvases like the old
+        vcdat.  This allows you to run the teaching commands independently
+        of vistrails' spreadsheets.
+        """
+        self.teachingCommands += 'import cdms2, vcs, cdutil, genutil, os, sys\n'
+        self.teachingCommands += 'import MV2\n'
+
+        self.teachingCommands += '\n# Initialize the four VCS Canvases by creating\n'
+        self.teachingCommands += '# a list to hold the 4 VCS Canvas\n'
+        self.teachingCommands += 'vcs_canvas_list = []\n'
+
+        self.teachingCommands += '\n# Loop (from 0 to 3) to create VCS Canvas 1, 2, 3, and 4\n'
+        self.teachingCommands += 'for i in range(4):\n'
+        self.teachingCommands += '    vcs_canvas_list.append(vcs.init())\n'
+
+        self.teachingCommands += '\n# Set the Command Line VCS Canvas hooks\n'
+        self.teachingCommands += 'vcs_hook1 = vcs_canvas_list[0]\n'
+        self.teachingCommands += 'vcs_hook2 = vcs_canvas_list[1]\n'
+        self.teachingCommands += 'vcs_hook3 = vcs_canvas_list[2]\n'
+        self.teachingCommands += 'vcs_hook4 = vcs_canvas_list[3]\n'
+
+        self.writeTeachingCommands()
+
+    def recordTeachingCommand(self, command):
+        if (self.recordCommands == True):
+            self.teachingCommands += command
+            self.writeTeachingCommands()
+
+    def setRecordCommands(self, recordCommands):
+        self.recordCommands = recordCommands
+
+    def writeTeachingCommands(self):
+        try:
+            fn = '%s/PCMDI_GRAPHICS' % os.environ['HOME']
+        except:
+            print "Could not find the $HOME directory. Set your environment variable 'HOME'"
+            print "to your home directory. (e.g., 'setenv HOME /home/user')."
+            sys.exit()
+        
+        # Create PCMDI_GRAPHICS directory if it does not exist                                  
+        if (os.access(fn, os.X_OK) == 0):
+            try:
+                os.mkdir(fn)
+            except:
+                print 'Do not have write permission for home directory. Must have write permissions.'
+                sys.exit()
+
+        # Write teaching commands to vcdat_recording_script_file.py
+        self.teachingScript = fn + '/vcdat_recording_script_file.py'
+        file = open(self.teachingScript, 'w')
+        file.write(self.teachingCommands)
+        file.flush()
+
+    def viewTeachingCommands(self):
+        """ Open the teaching commands script in a child process """
+        self.editorPid = os.fork()
+
+        if (self.editorPid == 0):
+            editor = 'idle'
+
+            # If idle editor is found, view teaching commands with idle
+            for path in os.environ["PATH"].split(os.pathsep):
+                file = os.path.join(path, editor)
+                if (os.path.exists(file)):
+                    args = (editor, self.teachingScript)
+                    os.execvp(editor, args)
+                    return
+
+            # If idle editor is not found, use default editor
+            secondaryEditor = os.environ['EDITOR']
+            args = (secondaryEditor, self.teachingScript)
+            os.execvp(secondaryEditor, args)
+
+    def closeTeachingCommands(self):
+        if (self.editorPid != 0):
+            os.kill(self.editorPid, 9)
+            self.editorPid = 0
diff --git a/contrib/cdat/pyqtscripting.sbf b/contrib/cdat/pyqtscripting.sbf
new file mode 100644
index 0000000..ccee4f3
--- /dev/null
+++ b/contrib/cdat/pyqtscripting.sbf
@@ -0,0 +1,3 @@
+target = coreappwrap
+sources = sipcoreappwrapcmodule.cpp sipcoreappwrapVCSQtManager.cpp sipcoreappwrapMainWindow.cpp
+headers = sipAPIcoreappwrap.h
diff --git a/contrib/cdat/quickplot.py b/contrib/cdat/quickplot.py
new file mode 100644
index 0000000..f38e54a
--- /dev/null
+++ b/contrib/cdat/quickplot.py
@@ -0,0 +1,50 @@
+from cdat_cell import QCDATWidget, CDATCell
+from core.modules.vistrails_module import (Module, ModuleError, NotCacheable)
+from packages.spreadsheet.spreadsheet_controller import spreadsheetController
+from packages.spreadsheet.spreadsheet_event import DisplayCellEvent
+from PyQt4 import QtCore, QtGui
+
+class quickplot(Module, NotCacheable):
+    """hackiness to push a cdat plot to our spreadsheet.
+       needs: QCDATWidget ref
+              cdms2.open()d dataset
+              blah this is out of date variable name"""
+
+    def compute(self):
+        args = []
+        if not self.hasInputFromPort('dataset'):
+            raise ModuleError(self, "'dataset' is mandatory.")
+        if not self.hasInputFromPort('plot'):
+            raise ModuleError(self, "'plot' is mandatory.")
+
+        dataset = self.getInputFromPort('dataset')
+        plotType = self.getInputFromPort('plot')
+        axes = self.forceGetInputFromPort('axes')
+        inCanvas = self.forceGetInputFromPort('canvas')
+
+        if axes!=None:
+            try:
+                kwargs = eval(axes)
+            except:
+                raise ModuleError(self, "Invalid 'axes' specification", axes)
+            dataset = dataset(**kwargs)
+
+        outCanvas = None
+        if inCanvas!=None:
+            inCanvas.plot(dataset, 'ASD', plotType)
+            outCanvas = inCanvas
+        else:
+            ev = DisplayCellEvent()
+            ev.vistrail = {'locator': None, 'version': -1, 'actions': []}
+            ev.cellType = QCDATWidget
+            ev.inputPorts = (dataset, 'ASD', plotType)
+            
+            QtCore.QCoreApplication.processEvents()
+            spreadsheetWindow = spreadsheetController.findSpreadsheetWindow()
+            
+            cdatWidget = spreadsheetWindow.displayCellEvent(ev)
+            if cdatWidget!=None:
+                outCanvas = cdatWidget.canvas
+                
+        self.setResult('dataset', dataset)
+        self.setResult('canvas', outCanvas)
diff --git a/contrib/cdat/scripts/cdat_domain.py b/contrib/cdat/scripts/cdat_domain.py
new file mode 100755
index 0000000..1c29e44
--- /dev/null
+++ b/contrib/cdat/scripts/cdat_domain.py
@@ -0,0 +1,289 @@
+#!/usr/bin/env python
+############################################################################
+##
+## Copyright (C) 2006-2008 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+def convert_to_vt_type(t):
+    vt_type_dict = {'str':'core.modules.basic_modules.String',
+                    'float': 'core.modules.basic_modules.Float',
+                    'int':'core.modules.basic_modules.Integer',
+                    'bool':'core.modules.basic_modules.Boolean',
+                    #'numpy.ndarray':'reg.get_module_by_name("edu.utah.sci.vistrails.numpyscipy", "Numpy Array", namespace="numpy|array")',
+                    }
+    if vt_type_dict.has_key(t):
+        return vt_type_dict[t]
+    else:
+        print "Type %s not found!" % t
+        return None
+
+do_not_cache_me = ['png','plot','isofill','isoline','boxfill']
+class CDATModule:
+    _extra_modules = []
+    _extra_vistrails_modules = {}
+    def __init__(self, author=None, language=None, type=None, url=None,
+                 codepath=None, version=None, actions=None):
+        self._author = author
+        self._language = language
+        self._type = type
+        self._url = url
+        self._codepath = codepath
+        self._version = version
+        self._actions = actions
+        (self._namespace, self._name) = self.split(codepath)
+
+    @staticmethod
+    def split(codepath):
+        dot = codepath.rfind('.')
+        if dot != -1:
+            name = codepath[dot+1:]
+            data = codepath[:dot]
+            namespace = data.replace('.','|')
+        else:
+            name = codepath
+            namespace = codepath
+        return (namespace,name)
+
+    def write_extra_module_definition(self, lines, name):
+        lines.append("%s = new_module(Module,'%s')\n"%(name,name))
+
+    @staticmethod
+    def write_extra_module_definitions_init(lines):
+        lines.append("vt_type_dict = {}\n")
+        lines.append("def get_late_type(type):\n")
+        lines.append("    return vt_type_dict[type]\n\n")
+
+    @staticmethod
+    def write_extra_module_definitions(lines):
+        for t in CDATModule._extra_modules:
+            namespace,name = CDATModule.split(t)
+            lines.append("%s = new_module(Module,'%s')\n"%(name,name))
+            lines.append("vt_type_dict['%s'] = %s\n"%(t,name))
+            CDATModule._extra_vistrails_modules[name] = namespace
+        lines.append("\n\n")
+
+    @staticmethod
+    def register_extra_vistrails_modules(lines, ident=''):
+        for (name,namespace) in CDATModule._extra_vistrails_modules.iteritems():
+            lines.append(ident + "    reg.add_module(%s,namespace='%s')\n"%(name,
+                                                                      namespace))
+
+    def register_extra_vistrails_module(self, lines, name, ident=''):
+        lines.append(ident + "    reg.add_module(%s,namespace='%s')\n"%(name,
+                                                                        self._namespace))
+
+    def write_module_definitions(self, lines):
+        for a in self._actions:
+            a.write_module_definition(lines)
+
+    def register_vistrails_modules(self, lines):
+        for a in self._actions:
+            a.register_itself(lines,self._namespace)
+
+    def build_vistrails_modules_dict(self):
+        for a in self._actions:
+            types = a.check_output_types()
+            for t in types:
+                if t not in CDATModule._extra_modules:
+                    CDATModule._extra_modules.append(t)
+
+    def add_extra_input_port_to_all_modules(self, lines, port_name, port_type,
+                                            doc, optional = False):
+        lines.append("\n    #extra input ports not available in the xml file\n")
+        for a in self._actions:
+            a.register_extra_input_port(port_name, port_type, lines, doc,
+                                        optional)
+
+    def add_extra_output_port_to_all_modules(self, lines, port_name, port_type,
+                                            doc, optional = False):
+        lines.append("\n    #extra output ports not available in the xml file\n")
+        for a in self._actions:
+            a.register_extra_output_port(port_name, port_type, lines, doc,
+                                         optional)
+class CDATAction:
+    def __init__(self, name=None, type=None, options=None, inputs=None,
+                 outputs=None, doc=None):
+        self._name = name
+        self._type = type
+        self._options = options
+        self._inputs = inputs
+        self._outputs = outputs
+        self._doc = doc
+
+    def write_module_definition(self, lines, ident='', compute_method=None):
+        def write_compute_method(self,lines, ident):
+            lines.append(ident + "def compute(self):\n")
+            lines.append(ident + "    if self.hasInputFromPort('canvas'):\n")
+            lines.append(ident + "        canvas = self.getInputFromPort('canvas')\n")
+            lines.append(ident + "    else:\n")
+            lines.append(ident + "        canvas = vcs.init()\n")
+            lines.append(ident + "    args = []\n")
+            for inp in self._inputs:
+                lines.append(ident + "    %s = None\n"%inp._name)
+                for inst in inp._valid_instances:
+                    if inp._valid_instances.index(inst) == 0:
+                        lines.append(ident + "    if self.hasInputFromPort('%s'):\n" % inst)
+                        lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                        lines.append(ident + "        args.append(%s)\n"%inp._name)
+                    else:
+                        lines.append(ident + "    elif self.hasInputFromPort('%s'):\n" % inst)
+                        lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                        lines.append(ident + "        args.append(%s)\n"%inp._name)
+                if inp._required:
+                    lines.append("\n"+ ident +"    # %s is a required port\n" % inp._name)
+                    lines.append(ident + "    if %s == None:\n" % inp._name)
+                    lines.append(ident + "        raise ModuleError(self, \"'%s' is a mandatory port\")\n" % inp._name)
+
+            lines.append("\n"+ident +"    # build up the keyword arguments from the optional inputs.\n")
+            lines.append(ident +"    kwargs = {}\n")
+
+            for opt in self._options:
+                for inst in opt._valid_instances:
+                    if opt._valid_instances.index(inst) == 0:
+                        lines.append(ident +"    if self.hasInputFromPort('%s'):\n" % inst)
+                        lines.append(ident +"        kwargs['%s'] = self.getInputFromPort('%s')\n" % (opt._name, inst))
+                    else:
+                        lines.append(ident +"    elif self.hasInputFromPort('%s'):\n" % inst)
+                        lines.append(ident +"        kwargs['%s'] = self.getInputFromPort('%s')\n" % (opt._name, inst))
+
+            lines.append(ident + "    #force images to be created in the background\n")
+            lines.append(ident + "    kwargs['bg'] = 1\n")
+            lines.append(ident + "    res = canvas.%s(*args,**kwargs)\n"%self._name)
+            lines.append(ident + "    self.setResult('%s',res)\n"%(self._outputs[0]._name))
+            lines.append(ident + "    self.setResult('canvas',canvas)\n")
+            lines.append("\n")
+        if self._name in do_not_cache_me:
+            lines.append(ident + "class %s(Module,NotCacheable):\n" % self._name)
+        else:
+            lines.append(ident + "class %s(Module):\n" % self._name)
+        lines.append(ident + '    """%s\n'%self._doc)
+        lines.append(ident + '    """\n')
+        if not compute_method:
+            write_compute_method(self,lines,ident="    ")
+        else:
+            lines.extend(compute_method)
+
+    def register_itself(self,lines, namespace):
+        lines.append("\n    #Module %s\n" % self._name)
+        lines.append("    reg.add_module(%s,namespace='%s')\n" % (self._name,namespace))
+        for inp in self._inputs:
+            inp.write_input_ports(self._name, lines)
+        for opt in self._options:
+            opt.write_input_ports(self._name, lines, True, force=False)
+        for out in self._outputs:
+            out.write_output_ports(self._name, lines, force=True)
+
+    def check_output_types(self):
+        types = []
+        for out in self._outputs:
+            if out._instance[0] not in types:
+                types.append(out._instance[0])
+        return types
+
+    def register_extra_input_port(self, port_name, port_type, lines, doc,
+                                  optional=False):
+        self._write_port('input', port_name, port_type, lines, doc, optional)
+
+    def register_extra_output_port(self, port_name, port_type, lines, doc,
+                                  optional=False):
+        self._write_port('output', port_name, port_type, lines, doc, optional)
+
+    #private methods
+    def _write_port(self, io_type, port_name, port_type,
+                    lines, doc, optional=False):
+        lines.append("    reg.add_%s_port(%s, '%s', \n" % (io_type,
+                                                           self._name,
+                                                           port_name))
+        lines.append("                       ")
+        lines.append("(%s,\n" % port_type)
+        lines.append("                        ")
+        if not optional:
+            lines.append("\"%s\"))\n" % doc)
+        else:
+            lines.append("\"%s\"), True)\n" % doc)
+
+class CDATItem:
+    def __init__(self, tag=None, doc=None, instance=None, required=False):
+        self._name = tag
+        self._doc = doc
+        self._instance = [i.strip(" \t\n") for i in instance.split('/')]
+        self._valid_instances = []
+        if required == None:
+            self._required = False
+        else:
+            self._required = required
+
+    def write_input_ports(self, module_name, lines, optional=False, force=False):
+        self._write_ports('input',module_name, lines, optional, force)
+
+    def write_output_ports(self, module_name, lines, optional=False, force=False):
+        self._write_ports('output',module_name, lines, optional, force)
+
+    def _write_ports(self, port_type, module_name, lines, optional=False,
+                     force=False):
+        if len(self._instance) == 1:
+            type = convert_to_vt_type(self._instance[0])
+            if type == None and self._instance[0] in CDATModule._extra_modules:
+                force = True
+            if force and type == None:
+                type = "get_late_type('%s')"%self._instance[0]
+            if type != None:
+                self._valid_instances.append(self._name)
+                lines.append("    reg.add_%s_port(%s, '%s', \n" % (port_type,
+                                                                   module_name,
+                                                                   self._name))
+                lines.append("                       ")
+                lines.append("(%s,\n" % type)
+                lines.append("                        ")
+                if not optional:
+                    lines.append("\"%s\"))\n" % self._doc)
+                else:
+                    lines.append("\"%s\"), True)\n" % self._doc)
+        else:
+            count = 0
+            for i in xrange(len(self._instance)):
+                type = convert_to_vt_type(self._instance[i])
+                new_force = force
+                if type == None and self._instance[i] in CDATModule._extra_modules:
+                    new_force = True
+                if new_force and type == None:
+                    type = "get_late_type('%s')"%self._instance[i]
+                if type != None:
+                    name = "%s_%s"%(self._name,count)
+                    self._valid_instances.append(name)
+                    count += 1
+                    lines.append("    reg.add_input_port(%s, '%s', \n" % (module_name,
+                                                                          name))
+                    lines.append("                       ")
+                    lines.append("(%s,\n" % type)
+                    lines.append("                        ")
+                    if not optional:
+                        lines.append("\"%s\"))\n" % self._doc)
+                    else:
+                        lines.append("\"%s\"), True)\n" % self._doc)
+
+class CDATOption(CDATItem):
+    def __init__(self, tag=None, default=None, doc=None, instance=None):
+        CDATItem.__init__(self, tag, doc, instance, False)
+        self._default = default
+
+class CDATPort(CDATItem):
+    def __init__(self, tag=None, doc=None, instance=None, position=None, required=False):
+        CDATItem.__init__(self, tag, doc, instance, required)
+        self._position = position
\ No newline at end of file
diff --git a/contrib/cdat/scripts/cdatwindow_init_inc.py b/contrib/cdat/scripts/cdatwindow_init_inc.py
new file mode 100644
index 0000000..0122627
--- /dev/null
+++ b/contrib/cdat/scripts/cdatwindow_init_inc.py
@@ -0,0 +1,85 @@
+
+    ##########################################################################
+    # included from cdatwindow_init_inc.py
+    #display = sip.unwrapinstance(QtGui.QX11Info.display())
+    #vcs._vcs.setdisplay(display)
+
+    #cdat GUI modules
+    global cdatWindow
+    cdatWindow = QCDATWindow()
+    cdatWindow.show()
+
+    reg.add_module(CDATCell,namespace='cdat')
+    reg.add_input_port(CDATCell, 'slab1',
+                       (TransientVariable, "variable to be plotted"))
+    reg.add_input_port(CDATCell, 'slab2',
+                       (TransientVariable, "variable to be plotted"))    
+    reg.add_input_port(CDATCell, 'plotType',
+                       (core.modules.basic_modules.String, "Plot type"))
+    reg.add_input_port(CDATCell, 'template',
+                       (core.modules.basic_modules.String, "template name"))
+    reg.add_input_port(CDATCell, 'gmName',
+                       (core.modules.basic_modules.String, "graphics method name"))    
+    reg.add_input_port(CDATCell, 'canvas',
+                       (Canvas, "Canvas object"))
+    reg.add_input_port(CDATCell, 'col',
+                       (core.modules.basic_modules.Integer, "Cell Col"))
+    reg.add_input_port(CDATCell, 'row',
+                       (core.modules.basic_modules.Integer, "Cell Row"))
+    reg.add_input_port(CDATCell, 'continents', 
+                       (core.modules.basic_modules.Integer,
+                        "continents type number"), True)    
+
+    reg.add_module(Variable, namespace='cdat')
+    reg.add_module(Quickplot, namespace='cdat')    
+    reg.add_input_port(Variable, 'id', 
+                       (core.modules.basic_modules.String,
+                        ""))
+    reg.add_input_port(Variable, 'type', 
+                       (core.modules.basic_modules.String,
+                        "variable, axis, or weighted-axis"))
+    reg.add_input_port(Variable, 'inputVariable', 
+                       (core.modules.basic_modules.List,
+                        ""))
+    reg.add_output_port(Variable, 'variable', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        ""))
+    reg.add_input_port(Variable, 'axes',
+                       (core.modules.basic_modules.String, "Axes of variables"))    
+    reg.add_input_port(Variable, 'axesOperations',
+                       (core.modules.basic_modules.String, "Axes Operations"))
+    reg.add_input_port(Variable, 'cdmsfile', 
+                       (CdmsFile, "cdmsfile"))    
+
+    reg.add_module(GraphicsMethod, namespace='cdat')
+    reg.add_input_port(GraphicsMethod, 'gmName', 
+                       (core.modules.basic_modules.String,
+                        "Get the graphics method object of the given name."))
+    reg.add_input_port(GraphicsMethod, 'plotType',
+                       (core.modules.basic_modules.String, "Plot type"))    
+    reg.add_input_port(GraphicsMethod, 'slab1', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab1"))
+    reg.add_input_port(GraphicsMethod, 'slab2', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab2"))
+    reg.add_input_port(GraphicsMethod, 'color_1',
+                       (core.modules.basic_modules.Integer, "color_1"), True)
+    reg.add_input_port(GraphicsMethod, 'color_2',
+                       (core.modules.basic_modules.Integer, "color_2"), True)
+    reg.add_input_port(GraphicsMethod, 'level_1',
+                       (core.modules.basic_modules.Float, "level_1"), True)
+    reg.add_input_port(GraphicsMethod, 'level_2',
+                       (core.modules.basic_modules.Float, "level_2"), True)        
+    reg.add_output_port(GraphicsMethod, 'slab1', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab1"))
+    reg.add_output_port(GraphicsMethod, 'slab2', 
+                       (get_late_type('cdms2.tvariable.TransientVariable'),
+                        "slab2"))            
+    reg.add_output_port(GraphicsMethod, 'canvas', (Canvas, "Canvas object"))
+    
+    # end of cdatwindow_init_inc.py
+    ##########################################################################
+
+    
diff --git a/contrib/cdat/scripts/gen_init.py b/contrib/cdat/scripts/gen_init.py
new file mode 100755
index 0000000..c622bbe
--- /dev/null
+++ b/contrib/cdat/scripts/gen_init.py
@@ -0,0 +1,267 @@
+############################################################################
+##
+## Copyright (C) 2006-2008 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+import os, sys
+sys.path.append('../../../vistrails')
+from parse_cdat_xml_file import parse_cdat_xml_file
+from cdat_domain import CDATModule
+
+
+
+#cdat package identifiers
+cp_version = '0.2'
+cp_identifier = 'edu.utah.sci.vistrails.cdat'
+cp_name = 'CDAT'
+
+def write_init(output_file, classes_lines, init_lines):
+    """write_init(output_file: str, classes_lines: list, init_lines: list)
+                                -> None
+       Writes the necessary contents for the package init file"""
+
+    # cdat dependencies
+    init_lines.append("\n\n")
+    init_lines.append("def package_dependencies():\n")
+    #init_lines.append("  return ['edu.utah.sci.vistrails.numpyscipy']\n")
+    init_lines.append("  return []\n")
+    init_lines.append("\n\n")
+    init_lines.append("def package_requirements():\n")
+    init_lines.append("    import core.requirements\n")
+    init_lines.append("    if not core.requirements.python_module_exists('vcs'):\n")
+    init_lines.append("        raise core.requirements.MissingRequirements('vcs')\n")
+    init_lines.append("    if not core.requirements.python_module_exists('cdms2'):\n")
+    init_lines.append("        raise core.requirements.MissingRequirements('cdms2')\n")
+    init_lines.append("    if not core.requirements.python_module_exists('cdutil'):\n")
+    init_lines.append("        raise core.requirements.MissingRequirements('cdutil')\n")
+    init_lines.append("    import vcs, cdms2, cdutil\n")
+    init_lines.append("\n\n")
+
+    header = open("init_inc.py").readlines()
+    header.append("\n\n")
+    header.append('version = "' + cp_version + '"\n')
+    header.append('identifier = "' + cp_identifier + '"\n')
+    header.append('name = "' + cp_name + '"\n\n')
+
+    outfile = open(output_file, "w")
+    outfile.writelines(header)
+    outfile.writelines(classes_lines)
+    outfile.writelines(init_lines)
+    outfile.close()
+
+def parse_files(input_files):
+    modules = []
+    for f in input_files:
+        modules.append(parse_cdat_xml_file(f))
+    return modules
+
+def add_canvas_ports_to_canvas_modules(canvas, lines):
+    canvas.add_extra_input_port_to_all_modules(lines,
+                                               port_name='canvas',
+                                               port_type='Canvas',
+                                               doc='Canvas object',
+                                               optional=False
+                                               )
+    canvas.add_extra_output_port_to_all_modules(lines,
+                                               port_name='canvas',
+                                               port_type='Canvas',
+                                               doc='Canvas object',
+                                               optional=False
+                                               )
+
+def add_canvas_module(canvas,init_lines,class_lines):
+    canvas.write_extra_module_definition(class_lines,'Canvas')
+    canvas.register_extra_vistrails_module(init_lines,'Canvas')
+
+def get_image_compute_method(action, ident=''):
+    lines = []
+    lines.append(ident + "def compute(self):\n")
+    lines.append(ident + "    if self.hasInputFromPort('canvas'):\n")
+    lines.append(ident + "        canvas = self.getInputFromPort('canvas')\n")
+    lines.append(ident + "    else:\n")
+    lines.append(ident + "        canvas = vcs.init()\n")
+    lines.append(ident + "    args = []\n")
+    for inp in action._inputs:
+        lines.append(ident + "    %s = None\n"%inp._name)
+        for inst in inp._valid_instances:
+            if inp._valid_instances.index(inst) == 0:
+                lines.append(ident + "    if self.hasInputFromPort('%s'):\n" % inst)
+                lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                lines.append(ident + "        args.append(%s)\n"%inp._name)
+            else:
+                lines.append(ident + "    elif self.hasInputFromPort('%s'):\n" % inst)
+                lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                lines.append(ident + "        args.append(%s)\n"%inp._name)
+        if inp._required:
+            lines.append("\n"+ ident +"    # %s is a required port\n" % inp._name)
+            lines.append(ident + "    if %s is None:\n" % inp._name)
+            lines.append(ident + "        raise ModuleError(self, \"'%s' is a mandatory port\")\n" % inp._name)
+
+    lines.append(ident + "    ofile = core.modules.basic_modules.File()\n")
+    lines.append(ident + "    ofile.name = %s\n"%action._inputs[0]._name)
+
+    lines.append(ident + "    canvas.%s(*args)\n"%action._name)
+    lines.append(ident + "    self.setResult('file',ofile)\n")
+    lines.append("\n")
+    return lines
+
+def get_cdms2_compute_method(action, ident=''):
+    lines = []
+    lines.append(ident + "def compute(self):\n")
+    lines.append(ident + "    args = []\n")
+    for inp in action._inputs:
+        lines.append(ident + "    %s = None\n"%inp._name)
+        for inst in inp._valid_instances:
+            if inp._valid_instances.index(inst) == 0:
+                lines.append(ident + "    if self.hasInputFromPort('%s'):\n" % inst)
+                lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                lines.append(ident + "        args.append(%s)\n"%inp._name)
+            else:
+                lines.append(ident + "    elif self.hasInputFromPort('%s'):\n" % inst)
+                lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                lines.append(ident + "        args.append(%s)\n"%inp._name)
+        if inp._required:
+            lines.append("\n"+ ident +"    # %s is a required port\n" % inp._name)
+            lines.append(ident + "    if %s is None:\n" % inp._name)
+            lines.append(ident + "        raise ModuleError(self, \"'%s' is a mandatory port\")\n" % inp._name)
+
+    lines.append(ident + "    res = cdms2.%s(*args)\n"%action._name)
+    lines.append(ident + "    self.setResult('%s',res)\n"%action._outputs[0]._name)
+    lines.append("\n")
+    return lines
+
+def get_CdmsFile_compute_method(action, ident=''):
+    lines = []
+    lines.append(ident + "def compute(self):\n")
+    lines.append(ident + "    self.checkInputPort('cdmsfile')\n")
+    lines.append(ident + "    cdmsfile = self.getInputFromPort('cdmsfile')\n")
+    lines.append(ident + "    args = []\n")
+    for inp in action._inputs:
+        lines.append(ident + "    %s = None\n"%inp._name)
+        for inst in inp._valid_instances:
+            if inp._valid_instances.index(inst) == 0:
+                lines.append(ident + "    if self.hasInputFromPort('%s'):\n" % inst)
+                lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                lines.append(ident + "        args.append(%s)\n"%inp._name)
+            else:
+                lines.append(ident + "    elif self.hasInputFromPort('%s'):\n" % inst)
+                lines.append(ident + "        %s = self.getInputFromPort('%s')\n" % (inp._name, inst))
+                lines.append(ident + "        args.append(%s)\n"%inp._name)
+        if inp._required:
+            lines.append("\n"+ ident +"    # %s is a required port\n" % inp._name)
+            lines.append(ident + "    if %s is None:\n" % inp._name)
+            lines.append(ident + "        raise ModuleError(self, \"'%s' is a mandatory port\")\n" % inp._name)
+
+    lines.append(ident + "    res = cdmsfile.%s(*args)\n"%action._name)
+    lines.append(ident + "    self.setResult('%s',res)\n"%action._outputs[0]._name)
+    lines.append("\n")
+    return lines
+
+if __name__ == '__main__':
+    # usage:
+    args = sys.argv
+    if len(args) > 2:
+        root_dir = args[1]
+        output_file = args[2]
+    else:
+        print "Usage: %s root_dir output_file" % args[0]
+        sys.exit(0)
+
+    xmlfiles = []
+    input_files = os.walk(root_dir)
+    for (d, tree, files) in input_files:
+        for f in files:
+            if os.path.isfile(os.path.join(d,f)) and f.endswith(".xml"):
+                xmlfiles.append(os.path.join(d,f))
+
+    modules = parse_files(xmlfiles)
+
+    extra_init_lines = []
+    init_lines = []
+    extra_init_lines.append("\ndef initialize(*args, **keywords):\n")
+    extra_init_lines.append("    reg = core.modules.module_registry.get_module_registry()\n\n")
+
+    class_lines = []
+    extra_class_lines = []
+
+    print "%s xml file(s) found."% len(modules)
+
+    CDATModule.write_extra_module_definitions_init(extra_class_lines)
+
+    for m in modules:
+        print "codepath: %s has %s Vistrails Modules."%(m._codepath, len(m._actions))
+        m.build_vistrails_modules_dict()
+
+    for m in modules:
+        m.register_vistrails_modules(init_lines)
+        if m._codepath == 'vcs.Canvas.Canvas':
+            for a in m._actions:
+                if a._name == 'png':
+                    a.write_module_definition(class_lines,
+                                              ident='',
+                                              compute_method=get_image_compute_method(a,ident="    "))
+                    a.register_extra_output_port('file',
+                                      'core.modules.basic_modules.File',
+                                      init_lines,
+                                      "File output",
+                                      False)
+                else:
+                    a.write_module_definition(class_lines)
+
+            add_canvas_ports_to_canvas_modules(m,init_lines)
+            add_canvas_module(m,extra_init_lines, extra_class_lines)
+
+        elif m._codepath == "cdms2.dataset.CdmsFile":
+            for a in m._actions:
+                if a._name == "__call__":
+                    a.write_module_definition(class_lines,
+                                              ident='',
+                                               compute_method=get_CdmsFile_compute_method(a,
+                                                                                  ident="    "))
+                else:
+                    a.write_module_definition(class_lines)
+
+            m.add_extra_input_port_to_all_modules(init_lines,
+                                               port_name='cdmsfile',
+                                               port_type='CdmsFile',
+                                               doc='cdmsfile',
+                                               optional=False
+                                               )
+        elif m._codepath == 'cdms2':
+            for a in m._actions:
+                if a._name == "open":
+                    a.write_module_definition(class_lines,
+                                              ident='',
+                                               compute_method=get_cdms2_compute_method(a,
+                                                                                  ident="    "))
+                else:
+                    a.write_module_definition(class_lines)
+        else:
+            m.write_module_definitions(class_lines)
+
+    CDATModule.write_extra_module_definitions(extra_class_lines)
+    CDATModule.register_extra_vistrails_modules(extra_init_lines)
+    
+    cdatwindow_init_lines = open("cdatwindow_init_inc.py").readlines()
+    extra_init_lines.extend(cdatwindow_init_lines)
+    
+    extra_init_lines.extend(init_lines)
+    extra_class_lines.extend(class_lines)
+    write_init(output_file, extra_class_lines, extra_init_lines)
\ No newline at end of file
diff --git a/contrib/cdat/scripts/init_inc.py b/contrib/cdat/scripts/init_inc.py
new file mode 100644
index 0000000..b4b7d89
--- /dev/null
+++ b/contrib/cdat/scripts/init_inc.py
@@ -0,0 +1,49 @@
+############################################################################
+##
+## Copyright (C) 2006-2008 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+""" Do not edit this file!
+
+File automatically generated by scripts/gen_init.py
+Change History:
+version : description
+  0.2   : Integrated quickplot module that displays the CDAT plot
+          widget inside the spreadsheet  
+  0.1   : First automatically generated package based on xml descriptions
+
+"""
+from PyQt4 import QtCore, QtGui
+import sip
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import (Module, NotCacheable,
+                                           ModuleError, new_module)
+from core.bundles import py_import
+import os, sys
+
+#cdat specific packages
+vcs = py_import('vcs',{})
+cdms2 = py_import('cdms2', {})
+cdutil = py_import('cdutil', {})
+
+#local python modules
+from cdat_window import QCDATWindow
+from cdat_cell import QCDATWidget
+from quickplot import quickplot
\ No newline at end of file
diff --git a/contrib/cdat/scripts/old_cdat_init.py b/contrib/cdat/scripts/old_cdat_init.py
new file mode 100644
index 0000000..39f6cef
--- /dev/null
+++ b/contrib/cdat/scripts/old_cdat_init.py
@@ -0,0 +1,447 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import vcs, cdms, cdutil
+import inspect
+import os, sys
+
+class cdms_dataarray(Module) :
+  def __init__(self, arr) :
+    self.arr = arr
+
+class cdms_dataset(Module) :
+  def __init__(self, dataset) :
+    self.dataset = dataset
+  def slice(self, id, kwargs) :
+    dummy = []
+    return self.dataset(id, *dummy, **kwargs)
+
+class cdms_get_data(Module) :
+  def compute(self) :
+    if not self.hasInputFromPort('id') :
+      print "Error: must have id input"
+      return
+
+    if not self.hasInputFromPort('dataset') :
+      print "Error: must have dataset input"
+      return
+    id = self.getInputFromPort('id')
+    dataset = self.getInputFromPort('dataset')
+    kwargs = {}
+
+    if (self.hasInputFromPort('arg_key_1') and
+        self.hasInputFromPort('arg_val_1')) :
+      
+      k = self.getInputFromPort('arg_key_1')
+      t = self.getInputFromPort('arg_val_1')
+      kwargs[k] = t
+
+
+    if (self.hasInputFromPort('arg_key_2') and
+        self.hasInputFromPort('arg_val_2')) :
+      
+      k = self.getInputFromPort('arg_key_2')
+      t = self.getInputFromPort('arg_val_2')
+      kwargs[k] = t
+
+
+    if (self.hasInputFromPort('arg_key_3') and
+        self.hasInputFromPort('arg_val_3')) :
+      
+      k = self.getInputFromPort('arg_key_3')
+      t = self.getInputFromPort('arg_val_3')
+      kwargs[k] = t
+      
+    dummy = []
+    arr = dataset.slice(id, kwargs)
+    darr = cdms_dataarray(arr)
+    self.setResult("cdms_dataarray", darr)
+
+class cdms_open(Module) :
+  def compute(self) :
+    args = inspect.getargspec(cdms.open)
+    def_args = args[3]
+    uri = None
+    mode = def_args[0]
+    template = def_args[1]
+    dods = def_args[2]
+
+    if not self.hasInputFromPort('uri') :
+      print "Error: must have uri input"
+      return
+      
+    if self.hasInputFromPort('uri') :
+      inuri = self.getInputFromPort('uri')
+      uri = os.path.join(sys.prefix, inuri)
+    if self.hasInputFromPort('mode') :
+      mode = self.getInputFromPort('mode')
+    if self.hasInputFromPort('template') :
+      template = self.getInputFromPort('template')
+    if self.hasInputFromPort('dods') :
+      dods = self.getInputFromPort('dods')
+
+    # output the cdmsfile object.
+    cdmsfile = cdms.open(uri,mode,template,dods)
+    output = cdms_dataset(cdmsfile)
+    self.setResult("cdms_dataset", output)
+
+# just wrap whatever so it can be sent downstream
+class generic_port(Module) :
+  def __init__(self, data) :
+    self.data = data
+    
+class vcs_canvas(Module) :
+  def __init__(self) :
+    Module.__init__(self)
+    self.canvas = None
+
+  def compute(self):
+    if self.canvas == None :
+      print "calling vcs.init()"
+      self.canvas = vcs.init()
+    self.setResult("vcs_canvas", self)
+
+
+class vcs_canvas_getboxfill(Module) :
+  def compute(self) :
+    if not self.hasInputFromPort('canvas') :
+      print "ERROR: Must have canvas input port"
+      return
+
+    bname = None
+    if self.hasInputFromPort('boxfill name') :
+      bname = self.getInputFromPort('boxfill name')
+    vcs_c = self.getInputFromPort('canvas')
+
+    if bname == None :
+      bfm = vcs_c.canvas.getboxfill()
+    else :
+      bfm = vcs_c.canvas.getboxfill(bname)
+
+    out = generic_port(bfm)
+    self.setResult("boxfill graphics method", out)
+
+class vcs_canvas_gettemplate(Module) :
+  def compute(self) :
+    if not self.hasInputFromPort('canvas') :
+      print "ERROR: Must have canvas input port"
+      return
+
+    tname = None
+    if self.hasInputFromPort('template name') :
+      tname = self.getInputFromPort('template name')
+    vcs_c = self.getInputFromPort('canvas')
+
+    if tname == None :
+      t = vcs_c.canvas.gettemplate()
+    else :
+      t = vcs_c.canvas.gettemplate(tname)
+
+    out = generic_port(t)
+    self.setResult("template", out)
+  
+class vcs_canvas_plot(Module) :
+  def compute(self) :
+
+    canvas = self.getInputFromPort('vcs_canvas').canvas
+    data1 = self.getInputFromPort('array1').arr
+    data2 = None
+    if self.hasInputFromPort('array2') :
+      data2 = self.getInputFromPort('array2').arr
+      
+    gm = self.getInputFromPort('graphics_method').data
+    t = self.getInputFromPort('template_name').data
+
+
+    # build up the kewword arguments from the optional inputs.
+    kwargs = {}
+    kwargs['bg'] = 1
+    if self.hasInputFromPort('ratio') :
+      kwargs['ratio'] = self.getInputFromPort('ratio')
+
+    #variable attribute keys
+    if self.hasInputFromPort('comment1') :
+      kwargs['comment1'] = self.getInputFromPort('comment1')
+    if self.hasInputFromPort('comment2') :
+      kwargs['comment2'] = self.getInputFromPort('comment2')
+    if self.hasInputFromPort('comment3') :
+      kwargs['comment3'] = self.getInputFromPort('comment3')
+    if self.hasInputFromPort('comment4') :
+      kwargs['comment4'] = self.getInputFromPort('comment4')
+    if self.hasInputFromPort('file_comment') :
+      kwargs['file_comment'] = self.getInputFromPort('file_comment')
+    if self.hasInputFromPort('hms') :
+      kwargs['hms'] = self.getInputFromPort('hms')
+    if self.hasInputFromPort('long_name') :
+      kwargs['long_name'] = self.getInputFromPort('long_name')
+    if self.hasInputFromPort('name') :
+      kwargs['name'] = self.getInputFromPort('name')
+    if self.hasInputFromPort('time') :
+      kwargs['time'] = self.getInputFromPort('time')
+    if self.hasInputFromPort('units') :
+      kwargs['units'] = self.getInputFromPort('units')
+    if self.hasInputFromPort('ymd') :
+      kwargs['ymd'] = self.getInputFromPort('ymd')
+
+    # dimension attribute keys
+    if self.hasInputFromPort('xarray1') :
+      kwargs['xarray1'] = self.getInputFromPort('xarray1')
+    if self.hasInputFromPort('yarray1') :
+      kwargs['yarray1'] = self.getInputFromPort('yarray1')
+    if self.hasInputFromPort('zarray1') :
+      kwargs['zarray1'] = self.getInputFromPort('zarray1')
+    if self.hasInputFromPort('tarray1') :
+      kwargs['tarray1'] = self.getInputFromPort('tarray1')
+    if self.hasInputFromPort('warray1') :
+      kwargs['warray1'] = self.getInputFromPort('warray1')
+    if self.hasInputFromPort('xarray2') :
+      kwargs['xarray2'] = self.getInputFromPort('xarray2')
+    if self.hasInputFromPort('yarray2') :
+      kwargs['yarray2'] = self.getInputFromPort('yarray2')
+    if self.hasInputFromPort('zarray2') :
+      kwargs['zarray2'] = self.getInputFromPort('zarray2')
+    if self.hasInputFromPort('tarray2') :
+      kwargs['tarray2'] = self.getInputFromPort('tarray2')
+    if self.hasInputFromPort('warray2') :
+      kwargs['warray2'] = self.getInputFromPort('warray2')
+    if self.hasInputFromPort('xbounds') :
+      kwargs['xbounds'] = self.getInputFromPort('xbounds')
+    if self.hasInputFromPort('ybounds') :
+      kwargs['ybounds'] = self.getInputFromPort('ybounds')
+    if self.hasInputFromPort('xname') :
+      kwargs['xname'] = self.getInputFromPort('xname')
+    if self.hasInputFromPort('yname') :
+      kwargs['yname'] = self.getInputFromPort('yname')
+    if self.hasInputFromPort('zname') :
+      kwargs['zname'] = self.getInputFromPort('zname')
+    if self.hasInputFromPort('tname') :
+      kwargs['tname'] = self.getInputFromPort('tname')
+    if self.hasInputFromPort('wname') :
+      kwargs['wname'] = self.getInputFromPort('wname')
+    if self.hasInputFromPort('xunits') :
+      kwargs['xunits'] = self.getInputFromPort('xunits')
+    if self.hasInputFromPort('yunits') :
+      kwargs['yunits'] = self.getInputFromPort('yunits')
+    if self.hasInputFromPort('zunits') :
+      kwargs['zunits'] = self.getInputFromPort('zunits')
+    if self.hasInputFromPort('tunits') :
+      kwargs['tunits'] = self.getInputFromPort('tunits')
+    if self.hasInputFromPort('wunits') :
+      kwargs['wunits'] = self.getInputFromPort('wunits')
+    if self.hasInputFromPort('xweights') :
+      kwargs['xweights'] = self.getInputFromPort('xweights')
+    if self.hasInputFromPort('yweights') :
+      kwargs['yweights'] = self.getInputFromPort('yweights')
+
+    if data2 == None :
+      canvas.plot(data1, gm, t, **kwargs)
+    else :
+      canvas.plot(data1, data2, gm, t, **kwargs)
+    o = self.interpreter.filePool.create_file(suffix='.cdat.gif')
+    canvas.gif(o.name)
+    self.setResult("image", o)
+    
+
+def initialize(*args, **keywords):
+  reg = core.modules.module_registry
+
+
+  reg.addModule(cdms_open)
+  reg.addInputPort(cdms_open, 'dods',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.addInputPort(cdms_open, 'template',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.addInputPort(cdms_open, 'mode',
+                   (core.modules.basic_modules.String, 'tip'))
+  reg.addInputPort(cdms_open, 'uri',
+                   (core.modules.basic_modules.String, 'tip'))
+
+  # output dataset.
+  reg.addOutputPort(cdms_open, "cdms_dataset",
+                    (cdms_dataset, 'cdms.dataset'))
+  #holds the tetgenio class, and acts as a port. 
+  reg.addModule(cdms_dataset)
+
+  reg.addModule(cdms_get_data)
+  reg.addInputPort(cdms_get_data, 'dataset',
+                   (cdms_dataset, 'dataset'))
+  reg.addInputPort(cdms_get_data, 'id',
+                   (core.modules.basic_modules.String, 'dataset id'))
+
+  reg.addInputPort(cdms_get_data, 'arg_key_1',
+                   (core.modules.basic_modules.String, 'argument 1 key'))
+  reg.addInputPort(cdms_get_data, 'arg_val_1',
+                   ([core.modules.basic_modules.Float,
+                     core.modules.basic_modules.Float]))
+  
+  reg.addInputPort(cdms_get_data, 'arg_key_2',
+                   (core.modules.basic_modules.String, 'argument 2 key'))
+  reg.addInputPort(cdms_get_data, 'arg_val_2',
+                   ([core.modules.basic_modules.Float,
+                     core.modules.basic_modules.Float]))
+
+  reg.addInputPort(cdms_get_data, 'arg_key_3',
+                   (core.modules.basic_modules.String, 'argument 3 key'))
+  reg.addInputPort(cdms_get_data, 'arg_val_3',
+                   ([core.modules.basic_modules.Float,
+                     core.modules.basic_modules.Float]))
+  # output data array.
+  reg.addOutputPort(cdms_get_data, "cdms_dataarray",
+                    (cdms_dataarray, 'data'))
+
+
+  # port for passing data arrays
+  reg.addModule(cdms_dataarray)
+  # port for passing anything
+  reg.addModule(generic_port)
+  #canvas module
+  reg.addModule(vcs_canvas)
+  reg.addOutputPort(vcs_canvas, "vcs_canvas",
+                    (vcs_canvas, 'the canvas'))
+
+  #canvas module methods...
+  reg.addModule(vcs_canvas_getboxfill)
+  reg.addInputPort(vcs_canvas_getboxfill, 'canvas',
+                   (vcs_canvas, 'the canvas'))
+  reg.addInputPort(vcs_canvas_getboxfill, 'boxfill name',
+                   (core.modules.basic_modules.String, 'boxfill method name'))
+
+  reg.addOutputPort(vcs_canvas_getboxfill, "boxfill graphics method",
+                    (generic_port, 'graphics method'))
+
+  reg.addModule(vcs_canvas_gettemplate)
+  reg.addInputPort(vcs_canvas_gettemplate, 'canvas',
+                   (vcs_canvas, 'the canvas'))
+  reg.addInputPort(vcs_canvas_gettemplate, 'template name',
+                   (core.modules.basic_modules.String, 'template name'))
+
+  reg.addOutputPort(vcs_canvas_gettemplate, "template",
+                    (generic_port, 'template'))
+
+
+  reg.addModule(vcs_canvas_plot)
+  reg.addInputPort(vcs_canvas_plot, 'vcs_canvas',
+                   vcs_canvas)
+  reg.addInputPort(vcs_canvas_plot, 'array1',
+                   cdms_dataarray)
+  reg.addInputPort(vcs_canvas_plot, 'array2',
+                   cdms_dataarray)
+  reg.addInputPort(vcs_canvas_plot, 'template_name',
+                   generic_port)
+  reg.addInputPort(vcs_canvas_plot, 'graphics_method',
+                   generic_port)
+  reg.addInputPort(vcs_canvas_plot, 'graphics_name',
+                   generic_port)
+
+  # keyword args 
+  reg.addInputPort(vcs_canvas_plot, 'ratio',
+                   core.modules.basic_modules.String, True)
+
+  # Variable attribute keys
+  reg.addInputPort(vcs_canvas_plot, 'comment1',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'comment2',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'comment3',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'comment4',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'file_comment',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'hms',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'long_name',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'name',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'time',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'units',
+                   core.modules.basic_modules.String, True)
+  
+  reg.addInputPort(vcs_canvas_plot, 'ymd',
+                   core.modules.basic_modules.String, True)
+
+  # Dimension attribuge keys
+  reg.addInputPort(vcs_canvas_plot, 'xarray1',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'yarray1',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'zarray1',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'tarray1',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'warray1',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'xarray2',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'yarray2',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'zarray2',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'tarray2',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'warray2',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'xbounds',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'ybounds',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'xname',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'yname',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'zname',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'tname',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'wname',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'xunits',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'yunits',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'zunits',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'tunits',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'wunits',
+                   core.modules.basic_modules.String, True)
+  reg.addInputPort(vcs_canvas_plot, 'xweights',
+                   cdms_dataarray, True)
+  reg.addInputPort(vcs_canvas_plot, 'yweights',
+                   cdms_dataarray, True)
+  
+  reg.addOutputPort(vcs_canvas_plot, "image",
+                    (core.modules.basic_modules.File, 'rendered image'))
diff --git a/contrib/cdat/scripts/parse_cdat_xml_file.py b/contrib/cdat/scripts/parse_cdat_xml_file.py
new file mode 100755
index 0000000..6a6ffe5
--- /dev/null
+++ b/contrib/cdat/scripts/parse_cdat_xml_file.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python
+############################################################################
+##
+## Copyright (C) 2006-2008 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+from core.system import get_elementtree_library
+ElementTree = get_elementtree_library()
+from cdat_domain import CDATAction, CDATModule, CDATOption, CDATPort
+
+class XMLNode:
+    def __init__(self):
+        pass
+
+    def has_attribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def get_attribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    @staticmethod
+    def convert_from_str(value, type):
+        def bool_conv(x):
+            s = str(x).upper()
+            if s == 'TRUE':
+                return True
+            if s == 'FALSE':
+                return False
+
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                   return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'bool':
+                    return bool_conv(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+class CDATOptionNode(XMLNode):
+    @staticmethod
+    def from_xml(node):
+        tag = node.tag
+        data = node.get('default', None)
+        default = CDATOptionNode.convert_from_str(data, 'str')
+        data = node.get('doc', None)
+        doc = CDATOptionNode.convert_from_str(data, 'str')
+        data = node.get('instance', None)
+        instance = CDATOptionNode.convert_from_str(data, 'str')
+        return CDATOption(tag=tag, default=default,doc=doc,instance=instance)
+
+class CDATPortNode(XMLNode):
+    """Represents Input or Output nodes"""
+    @staticmethod
+    def from_xml(node):
+        tag = node.tag
+        data = node.get('doc', None)
+        doc = CDATPortNode.convert_from_str(data, 'str')
+        data = node.get('instance', None)
+        instance = CDATPortNode.convert_from_str(data, 'str')
+        data = node.get('position', None)
+        position = CDATPortNode.convert_from_str(data, 'int')
+        data = node.get('required', None)
+        required = CDATPortNode.convert_from_str(data, 'bool')
+        return CDATPort(tag=tag, doc=doc, instance=instance,
+                        position=position, required=required)
+
+class CDATActionNode(XMLNode):
+    @staticmethod
+    def from_xml(node):
+        data = node.get('name', None)
+        name = CDATActionNode.convert_from_str(data,'str')
+        data = node.get('type', None)
+        type = CDATActionNode.convert_from_str(data,'str')
+
+        options = []
+        inputs = []
+        outputs = []
+
+        #read children
+        for child in node.getchildren():
+            if child.tag == 'options':
+                for optnode in child.getchildren():
+                    option = CDATOptionNode.from_xml(optnode)
+                    options.append(option)
+            elif child.tag == 'input':
+                for inode in child.getchildren():
+                    port = CDATPortNode.from_xml(inode)
+                    inputs.insert(port._position,port)
+            elif child.tag == 'output':
+                for onode in child.getchildren():
+                    port = CDATPortNode.from_xml(onode)
+                    outputs.insert(port._position,port)
+            elif child.tag == 'doc':
+                doc = child.text
+        return CDATAction(name=name, type=type, options=options, inputs=inputs,
+                          outputs=outputs, doc=doc)
+
+class CDATModuleNode(XMLNode):
+    @staticmethod
+    def from_xml(node):
+        data = node.get('author',None)
+        author = CDATModuleNode.convert_from_str(data,'str')
+        data = node.get('programminglanguage', None)
+        language = CDATModuleNode.convert_from_str(data,'str')
+        data = node.get('type', None)
+        type = CDATModuleNode.convert_from_str(data, 'str')
+        data = node.get('url', None)
+        url = CDATModuleNode.convert_from_str(data, 'str')
+        data = node.get('version', None)
+        version = CDATModuleNode.convert_from_str(data, 'str')
+        data = node.get('codepath', None)
+        codepath = CDATModuleNode.convert_from_str(data, 'str')
+
+        actions = []
+        #read actions
+        for child in node.getchildren():
+            if child.tag == 'action':
+                action = CDATActionNode.from_xml(child)
+                actions.append(action)
+
+        return CDATModule(author=author,
+                              language=language,
+                              type=type,
+                              url=url,
+                              codepath=codepath,
+                              version=version,
+                              actions=actions)
+
+def parse_cdat_xml_file(filename):
+    """ parse_cdat_xml_file(filename:str) -> CDATDiagnostic
+    """
+    tree = ElementTree.parse(filename)
+    module = CDATModuleNode.from_xml(tree.getroot())
+    return module
\ No newline at end of file
diff --git a/contrib/cdat/scripts/xml/canvas.xml b/contrib/cdat/scripts/xml/canvas.xml
new file mode 100644
index 0000000..5d99a75
--- /dev/null
+++ b/contrib/cdat/scripts/xml/canvas.xml
@@ -0,0 +1,2747 @@
+<diagnostic author="PCMDI's software team" programminglanguage="Python" type="class" url="http://cdat.sf.net" version="5.0.0.alpha7" codepath="vcs.Canvas.Canvas">
+	<action name="boxfill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 2D, last 2 dimensions will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0" required="True"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: boxfill                        # Generate a boxfill plot
+
+ Description of Function:
+    Generate a boxfill plot given the data, boxfill graphics method, and
+    template. If no boxfill class object is given, then the 'default' boxfill
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('boxfill')                        # Show all the existing boxfill graphics methods
+    box=a.getboxfill('quick')                # Create instance of 'quick'
+    a.boxfill(array,box)                # Plot array using specified box and default
+                                        #         template
+    templt=a.gettemplate('AMIP')        # Create an instance of template 'AMIP'
+    a.clear()                           # Clear VCS canvas
+    a.boxfill(array,box,template)       # Plot array using specified box and template
+    a.boxfill(box,array,template)       # Plot array using specified box and template
+    a.boxfill(template,array,box)       # Plot array using specified box and template
+    a.boxfill(template,array,box)       # Plot array using specified box and template
+    a.boxfill(array,'AMIP','quick')     # Use 'AMIP' template and 'quick' boxfill
+    a.boxfill('AMIP',array,'quick')     # Use 'AMIP' template and 'quick' boxfill
+    a.boxfill('AMIP','quick',array)     # Use 'AMIP' template and 'quick' boxfill
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End boxfill Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="createboxfill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<boxfill doc="no default" instance="vcs.boxfill.Gfb" position="0"/>
+		</output>
+		<doc>
+			Function: createboxfill                # Construct a new boxfill graphics method
+
+ Description of Function:
+    Create a new boxfill graphics method given the the name and the existing
+    boxfill graphics method to copy the attributes from. If no existing
+    boxfill graphics method name is given, then the default boxfill graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('boxfill')
+    box=a.createboxfill('example1',)
+    a.show('boxfill')
+    box=a.createboxfill('example2','quick')
+    a.show('boxfill')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createboxfill Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		</doc>
+	</action>
+	<action name="createisofill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False" />
+		</input>
+		<output>
+			<isofill doc="no default" instance="vcs.isofill.Gfi" position="0"/>
+		</output>
+		<doc>
+			Function: createisofill  # Construct a new isofill graphics method
+
+ Description of Function:
+    Create a new isofill graphics method given the the name and the existing
+    isofill graphics method to copy the attributes from. If no existing
+    isofill graphics method name is given, then the default isofill graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isofill')
+    iso=a.createisofill('example1',)
+    a.show('isofill')
+    iso=a.createisofill('example2','quick')
+    a.show('isofill')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createisofill Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		</doc>
+	</action>
+	<action name="createisoline" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<isoline doc="no default" instance="vcs.isoline.Gi" position="0"/>
+		</output>
+		<doc>
+			Function: createisoline                # Construct a new isoline graphics method
+
+ Description of Function:
+    Create a new isoline graphics method given the the name and the existing
+    isoline graphics method to copy the attributes from. If no existing
+    isoline graphics method name is given, then the default isoline graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('isoline')
+    iso=a.createisoline('example1',)
+    a.show('isoline')
+    iso=a.createisoline('example2','quick')
+    a.show('isoline')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createisoline Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		</doc>
+	</action>
+	<action name="createoutfill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<outfill doc="no default" instance="vcs.outfill.Gfo" position="0"/>
+		</output>
+		<doc>
+			Function: createoutfill                # Construct a new outfill graphics method
+
+ Description of Function:
+    Create a new outfill graphics method given the the name and the existing
+    outfill graphics method to copy the attributes from. If no existing
+    outfill graphics method name is given, then the default outfill graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('outfill')
+    out=a.createoutfill('example1',)
+    a.show('outfill')
+    out=a.createoutfill('example2','quick')
+    a.show('outfill')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createoutfill Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		</doc>
+	</action>
+	<action name="createoutline" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<outline doc="no default" instance="vcs.outline.Go" position="0"/>
+		</output>
+		<doc>
+			Function: createoutline                # Construct a new outline graphics method
+
+ Description of Function:
+    Create a new outline graphics method given the the name and the existing
+    outline graphics method to copy the attributes from. If no existing
+    outline graphics method name is given, then the default outline graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('outline')
+    out=a.createoutline('example1',)
+    a.show('outline')
+    out=a.createoutline('example2','quick')
+    a.show('outline')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createoutline Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		</doc>
+	</action>
+	<action name="createscatter" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<scatter doc="no default" instance="vcs.scatter.GSp" position="0"/>
+		</output>
+		<doc>
+			Function: createscatter                # Construct a new scatter graphics method
+
+ Description of Function:
+    Create a new scatter graphics method given the the name and the existing
+    scatter graphics method to copy the attributes from. If no existing
+    scatter graphics method name is given, then the default scatter graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('scatter')
+    sct=a.createscatter('example1',)
+    a.show('scatter')
+    sct=a.createscatter('example2','quick')
+    a.show('scatter')
+
+#########################################################################################################################
+###########################################                               ###############################################
+########################################## End createscatter Description ################################################
+#########################################                               #################################################
+#########################################################################################################################
+		</doc>
+	</action>
+	<action name="createxvsy" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<xvsy doc="no default" instance="vcs.xvsy.GXY" position="0"/>
+		</output>
+		<doc>
+			Function: createxvsy                      # Construct a new XvsY graphics method
+
+ Description of Function:
+    Create a new XvsY graphics method given the the name and the existing
+    XvsY graphics method to copy the attributes from. If no existing
+    XvsY graphics method name is given, then the default XvsY graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xvsy')
+    xy=a.createxvsy('example1',)
+    a.show('xvsy')
+    xy=a.createxvsy('example2','quick')
+    a.show('xvsy')
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End createxvsy Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="createxyvsy" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<xyvsy doc="no default" instance="vcs.xyvsy.GXy" position="0"/>
+		</output>
+		<doc>
+			Function: createxyvsy                  # Construct a new Xyvsy graphics method
+
+ Description of Function:
+    Create a new Xyvsy graphics method given the the name and the existing
+    Xyvsy graphics method to copy the attributes from. If no existing
+    Xyvsy graphics method name is given, then the default Xyvsy graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('xyvsy')
+    xyy=a.createxyvsy('example1',)
+    a.show('xyvsy')
+    xyy=a.createxyvsy('example2','quick')
+    a.show('xyvsy')
+
+#######################################################################################################################
+###########################################                             ###############################################
+########################################## End createxyvsy Description ################################################
+#########################################                             #################################################
+#######################################################################################################################
+		</doc>
+	</action>
+	<action name="createyxvsx" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<source_GM_name doc="copy the contents of the source object to the newly created one. If no name is given, then the 'default' graphics methond contents is copied over to the new object." instance="str" position="1" required="False"/>
+			<new_GM_name doc="name of the new graphics method object. If no name is given, then one will be created for use." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<yxvsx doc="no default" instance="vcs.yxvsx.GYx" position="0"/>
+		</output>
+		<doc>
+			Function: createyxvsx                  # Construct a new Yxvsx graphics method
+
+ Description of Function:
+    Create a new Yxvsx graphics method given the the name and the existing
+    Yxvsx graphics method to copy the attributes from. If no existing
+    Yxvsx graphics method name is given, then the default Yxvsx graphics
+    method will be used as the graphics method to which the attributes will
+    be copied from.
+
+    If the name provided already exists, then a error will be returned. Graphics
+    method names must be unique.
+
+ Example of Use:
+
+    a=vcs.init()
+    a.show('yxvsx')
+    yxx=a.createyxvsx('example1',)
+    a.show('yxvsx')
+    yxx=a.createyxvsx('example2','quick')
+    a.show('yxvsx')
+
+#######################################################################################################################
+###########################################                             ###############################################
+########################################## End createyxvsx Description ################################################
+#########################################                             #################################################
+#######################################################################################################################
+		</doc>
+	</action>
+	<action name="getboxfill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<boxfill doc="no default" instance="vcs.boxfill.Gfb" position="0"/>
+		</output>
+		<doc>
+			Function: getboxfill                        # Construct a new boxfill graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    boxfill class object from an existing VCS boxfill graphics method. If
+    no boxfill name is given, then boxfill 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createboxfill function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('boxfill')                   # Show all the existing boxfill graphics methods
+    box=a.getboxfill()                  # box instance of 'default' boxfill graphics
+                                        # method
+    box2=a.getboxfill('quick')          # box2 instance of existing 'quick' boxfill
+                                        #         graphics method
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getboxfill Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="getisofill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<isofill doc="no default" instance="vcs.isofill.Gfi" position="0"/>
+		</output>
+		<doc>
+			Function: getisofill          Construct a new isofill graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    isofill class object from an existing VCS isofill graphics method. If
+    no isofill name is given, then isofill 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createisofill function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isofill')                   # Show all the existing isofill graphics methods
+    iso=a.getisofill()                  # iso instance of 'default' isofill graphics
+                                        #       method
+    iso2=a.getisofill('quick')          # iso2 instance of existing 'quick' isofill
+                                        #       graphics method
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getisofill Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="getisoline" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<isoline doc="no default" instance="vcs.isoline.Gi" position="0"/>
+		</output>
+		<doc>
+			Function: getisoline                        # Construct a new isoline graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    isoline class object from an existing VCS isoline graphics method. If
+    no isoline name is given, then isoline 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createisoline function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isoline')                   # Show all the existing isoline graphics methods
+    iso=a.getisoline()                  # iso instance of 'default' isoline graphics
+                                        #       method
+    iso2=a.getisoline('quick')          # iso2 instance of existing 'quick' isoline
+                                        #       graphics method
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getisoline Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="getoutfill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<outfill doc="no default" instance="vcs.outfill.Gfo" position="0"/>
+		</output>
+		<doc>
+			Function: getoutfill                        # Construct a new outfill graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    outfill class object from an existing VCS outfill graphics method. If
+    no outfill name is given, then outfill 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createoutfill function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outfill')                   # Show all the existing outfill graphics methods
+    out=a.getoutfill()                  # out instance of 'default' outfill graphics
+                                        #       method
+    out2=a.getoutfill('quick')          # out2 instance of existing 'quick' outfill
+                                        #       graphics method
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getoutfill Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="getoutline" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0" required="False"/>
+		</input>
+		<output>
+			<outline doc="no default" instance="vcs.outline.Go" position="0"/>
+		</output>
+		<doc>
+			Function: getoutline                        # Construct a new outline graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    outline class object from an existing VCS outline graphics method. If
+    no outline name is given, then outline 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createoutline function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outline')                   # Show all the existing outline graphics methods
+    out=a.getoutline()                  # out instance of 'default' outline graphics
+                                        #       method
+    out2=a.getoutline('quick')          # out2 instance of existing 'quick' outline
+                                        #       graphics method
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getoutline Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="getscatter" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0"/>
+		</input>
+		<output>
+			<scatter doc="no default" instance="vcs.scatter.GSp" position="0"/>
+		</output>
+		<doc>
+			Function: getscatter                   # Construct a new scatter graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    scatter class object from an existing VCS scatter graphics method. If
+    no scatter name is given, then scatter 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createscatter function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('scatter')                   # Show all the existing scatter graphics methods
+    sct=a.getscatter()                  # sct instance of 'default' scatter graphics
+                                        #       method
+    sct2=a.getscatter('quick')          # sct2 instance of existing 'quick' scatter
+                                        #       graphics method
+
+######################################################################################################################
+###########################################                            ###############################################
+########################################## End getscatter Description ################################################
+#########################################                            #################################################
+######################################################################################################################
+		</doc>
+	</action>
+	<action name="getxvsy" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0"/>
+		</input>
+		<output>
+			<xvsy doc="no default" instance="vcs.xvsy.GXY" position="0"/>
+		</output>
+		<doc>
+			Function: getxvsy                   # Construct a new XvsY graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    XvsY class object from an existing VCS XvsY graphics method. If
+    no XvsY name is given, then XvsY 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createxvsy function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xvsy')                      # Show all the existing XvsY graphics methods
+    xy=a.getxvsy()                      # xy instance of 'default' XvsY graphics
+                                        #       method
+    xy2=a.getxvsy('quick')              # xy2 instance of existing 'quick' XvsY
+                                        #       graphics method
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End getxvsy Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="getxyvsy" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0"/>
+		</input>
+		<output>
+			<xyvsy doc="no default" instance="vcs.xyvsy.GXy" position="0"/>
+		</output>
+		<doc>
+			Function: getxyvsy        # Construct a new Xyvsy graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    Xyvsy class object from an existing VCS Xyvsy graphics method. If
+    no Xyvsy name is given, then Xyvsy 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createxyvsy function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xyvsy')                     # Show all the existing Xyvsy graphics methods
+    xyy=a.getxyvsy()                    # xyy instance of 'default' Xyvsy graphics
+                                        #       method
+    xyy2=a.getxyvsy('quick')            # xyy2 instance of existing 'quick' Xyvsy
+                                        #       graphics method
+####################################################################################################################
+###########################################                          ###############################################
+########################################## End getxyvsy Description ################################################
+#########################################                          #################################################
+####################################################################################################################
+		</doc>
+	</action>
+	<action name="getyxvsx" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<GM_name doc="retrieve the graphics method object of the given name. If no name is given, then retrieve the 'default' graphics method." instance="str" position="0"/>
+		</input>
+		<output>
+			<yxvsx doc="no default" instance="vcs.yxvsx.GYx" position="0"/>
+		</output>
+		<doc>
+			Function: getyxvsx                     # Construct a new Yxvsx graphics method
+
+ Description of Function:
+    VCS contains a list of graphics methods. This function will create a
+    Yxvsx class object from an existing VCS Yxvsx graphics method. If
+    no Yxvsx name is given, then Yxvsx 'default' will be used.
+
+    Note, VCS does not allow the modification of `default' attribute
+    sets. However, a `default' attribute set that has been copied under a
+    different name can be modified. (See the createyxvsx function.)
+
+ Example of Use:
+    a=vcs.init()
+    a.show('yxvsx')                     # Show all the existing Yxvsx graphics methods
+    yxx=a.getyxvsx()                    # yxx instance of 'default' Yxvsx graphics
+                                        #       method
+    yxx2=a.getyxvsx('quick')            # yxx2 instance of existing 'quick' Yxvsx
+                                        #       graphics method
+####################################################################################################################
+###########################################                          ###############################################
+########################################## End getyxvsx Description ################################################
+#########################################                          #################################################
+####################################################################################################################
+		</doc>
+	</action>
+	<action name="isofill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 2D, last 2 dimensions will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: isofill                        # Generate an isofill plot
+
+ Description of Function:
+    Generate a isofill plot given the data, isofill graphics method, and
+    template. If no isofill class object is given, then the 'default' isofill
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isofill')                   # Show all the existing isofill graphics methods
+    iso=a.getisofill('quick')           # Create instance of 'quick'
+    a.isofill(array,iso)                # Plot array using specified iso and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.isofill(array,iso,template)       # Plot array using specified iso and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End isofill Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="isoline" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 2D, last 2 dimensions will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: isoline                        # Generate an isoline plot
+
+ Description of Function:
+    Generate a isoline plot given the data, isoline graphics method, and
+    template. If no isoline class object is given, then the 'default' isoline
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('isoline')                   # Show all the existing isoline graphics methods
+    iso=a.getisoline('quick')           # Create instance of 'quick'
+    a.isoline(array,iso)                # Plot array using specified iso and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.isoline(array,iso,template)       # Plot array using specified iso and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End isoline Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="outfill" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 2D, last 2 dimensions will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: outfill                        # Generate an outfill plot
+
+ Description of Function:
+    Generate a outfill plot given the data, outfill graphics method, and
+    template. If no outfill class object is given, then the 'default' outfill
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outfill')                   # Show all the existing outfill graphics methods
+    out=a.getoutfill('quick')           # Create instance of 'quick'
+    a.outfill(array,out)                # Plot array using specified out and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.outfill(array,out,template)       # Plot array using specified out and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End outfill Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="outline" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 2D, last 2 dimensions will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: outline                        # Generate an outline plot
+
+ Description of Function:
+    Generate a outline plot given the data, outline graphics method, and
+    template. If no outline class object is given, then the 'default' outline
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('outline')                   # Show all the existing outline graphics methods
+    out=a.getoutline('quick')           # Create instance of 'quick'
+    a.outline(array,out)                # Plot array using specified out and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.outline(array,out,template)       # Plot array using specified out and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End outline Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="plot" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab1 doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0" required="True"/>
+			<slab2 doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0" required="False"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: plot
+
+ Description of plot:
+    Plot an array(s) of data given a template and graphics method. The VCS template is
+    used to define where the data and variable attributes will be displayed on the VCS
+    Canvas. The VCS graphics method is used to define how the array(s) will be shown
+    on the VCS Canvas.
+
+ The form of the call is:
+    plot(array1=None, array2=None, template_name=None, graphics_method=None,
+            graphics_name=None, [key=value [, key=value [, ...]]])
+
+            where array1 and array2 are NumPy arrays.
+
+    Plot keywords:
+      ratio [default is none]
+            None: let the self.ratio attribute decide
+            0,'off': overwritte self.ratio and do nothing about the ratio
+            'auto': computes an automatic ratio
+            '3',3: y dim will be 3 times bigger than x dim (restricted to original tempalte.data area
+            Adding a 't' at the end of the ratio, makes the tickmarks and boxes move along.
+
+    Variable attribute keys:
+       comment1         = string   #Comment plotted above file_comment
+       comment2         = string   #Comment plotted above comment1
+       comment3         = string   #Comment plotted above comment2
+       comment4         = string   #Comment plotted above comment4
+       file_comment     = string   #Comment (defaults to file.comment)
+       hms              = string (hh:mm:ss) #Hour, minute, second
+       long_name        = string   #Descriptive variable name
+       name             = string   #Variable name (defaults to var.id)
+       time             = cdtime   #instance (relative or absolute),
+                                    cdtime, reltime or abstime value
+       units            = string   #Variable units
+       ymd              = string (yy/mm/dd) #Year, month, day
+
+    Dimension attribute keys (dimension length=n):
+       [x|y|z|t|w]array = NumPy array of length n    # x or y Dimension values
+       [x|y|z|t|w]array = NumPy array of length n    # x or y Dimension values
+       [x|y]bounds       = NumPy array of shape (n,2) # x or y Dimension boundaries
+       [x|y|z|t|w]name   = string                     # x or y Dimension name
+       [x|y|z|t|w]units  = string                     # x or y Dimension units
+       [x|y]weights      = NumPy array of length n    # x or y Dimension weights (used to
+                                                        calculate area-weighted mean)
+
+    CDMS object:
+       [x|y|z|t|w]axis   = CDMS axis object           # x or y Axis
+       grid              = CDMS grid object           # Grid object (e.g. grid=var.getGrid()
+       variable          = CDMS variable object       # Variable object
+
+    Other:
+       [x|y]rev         = 0|1                         # if ==1, reverse the direction of the x
+    							     or y axis
+       continents	= 0,1,2,3,4,5,6,7,8,9,10,11   #	if >=1, plot continental outlines
+    							     (default: plot if xaxis is
+    							     longitude, yaxis is latitude -or-
+    							     xname is 'longitude' and yname is
+    							     'latitude'
+                                                      # The continents-type values are integers
+						      # ranging from 0 to 11, where:
+						      #    0 signifies "No Continents"
+						      #    1 signifies "Fine Continents"
+						      #    2 signifies "Coarse Continents"
+						      #    3 signifies "United States"
+						      #    4 signifies "Political Borders"
+						      #    5 signifies "Rivers"
+
+						      # Values 6 through 11 signify the line type
+                                                      # defined by the files data_continent_other7
+                                                      # through data_continent_other12.
+
+    Graphics Output in Background Mode:
+       bg                 = 0|1   # if ==1, create images in the background
+                                                             (Don't display the VCS Canvas)
+
+ Note:
+    More specific attributes take precedence over general attributes. In particular,
+    specifie attributes override variable object attributes, dimension attributes and
+    arrays override axis objects, which override grid objects, which override variable
+    objects.
+
+    For example, if both 'file_comment' and 'variable' keywords are specified, the value of
+    'file_comment' is used instead of the file comment in the parent of variable. Similarly,
+    if both 'xaxis' and 'grid' keywords are specified, the value of 'xaxis' takes precedence
+    over the x-axis of grid.
+
+ Example of Use:
+    x=vcs.init()        # x is an instance of the VCS class object (constructor)
+    x.plot(array)       # this call will use default settings for template and boxfill
+    x.plot(array, 'AMIP', 'isofill','AMIP_psl') # this is specifying the template and
+                                                  graphics method
+    t=x.gettemplate('AMIP')        # get a predefined the template 'AMIP'
+    vec=x.getvector('quick')       # get a predefined the vector graphics method 'quick'
+    x.plot(array1, array2, t, vec) # plot the data as a vector using the 'AMIP' template
+    x.clear()                      # clear the VCS Canvas of all plots
+    box=x.createboxfill('new')     # create boxfill graphics method 'new'
+    x.plot(box,t,array)            # plot array data using box 'new' and template 't'
+
+###############################################################################################################
+###########################################                      ##############################################
+########################################## End plot Description ###############################################
+#########################################                      ################################################
+###############################################################################################################
+		</doc>
+	</action>
+	<action name="scatter" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab1 doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+			<slab2 doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: scatter                      # Generate a scatter plot
+
+ Description of Function:
+    Generate a scatter plot given the data, scatter graphics method, and
+    template. If no scatter class object is given, then the 'default' scatter
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('scatter')                   # Show all the existing scatter graphics methods
+    sct=a.getscatter('quick')           # Create instance of 'quick'
+    a.scatter(array,sct)                # Plot array using specified sct and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.scatter(array,sct,template)       # Plot array using specified sct and template
+
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End scatter Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+		</doc>
+	</action>
+	<action name="xvsy" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<yaxisconvert default="'linear'" doc="converting yaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab1 doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+			<slab2 doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: xvsy                      # Generate a XvsY plot
+
+ Description of Function:
+    Generate a XvsY plot given the data, XvsY graphics method, and
+    template. If no XvsY class object is given, then the 'default' XvsY
+    graphics method is used. Similarly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xvsy')                   # Show all the existing XvsY graphics methods
+    xy=a.getxvsy('quick')            # Create instance of 'quick'
+    a.xvsy(array,xy)                 # Plot array using specified xy and default
+                                     #       template
+    a.clear()                        # Clear VCS canvas
+    a.xvsy(array,xy,template)        # Plot array using specified xy and template
+
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End xvsy Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		</doc>
+	</action>
+	<action name="xyvsy" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: xyvsy                        # Generate a Xyvsy plot
+
+ Description of Function:
+    Generate a Xyvsy plot given the data, Xyvsy graphics method, and
+    template. If no Xyvsy class object is given, then the 'default' Xyvsy
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('xyvsy')                   # Show all the existing Xyvsy graphics methods
+    xyy=a.getxyvsy('quick')           # Create instance of 'quick'
+    a.xyvsy(array,xyy)                # Plot array using specified xyy and default
+                                        #       template
+    a.clear()                           # Clear VCS canvas
+    a.xyvsy(array,xyy,template)       # Plot array using specified xyy and template
+
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End xyvsy Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		</doc>
+	</action>
+	<action name="yxvsx" type="function">
+		<options>
+			<datawc_timeunits default="'days since 2000'" doc="units to use when disaplaying time dimension auto tick" instance="str"/>
+			<long_name doc="replaces long_name on plot" instance="str"/>
+			<projection default="'default'" doc="projection to use, name or object" instance="str/vcs.projection.Proj"/>
+			<xticlabels2 default="'*'" doc="values for labels on 2nd side of x axis" instance="str/{float:str}"/>
+			<xarray doc="Values to use instead of x axis" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<yweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xweights doc="replace xaxis weights used for computing mean" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<warray doc="Values to use instead of w axis, only if var has more than 4D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<tunits doc="replace taxis units on plot (if exists)" instance="str"/>
+			<ymtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<ymtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<datawc_x1 default="1.E20" doc="first value of xaxis on plot" instance="float"/>
+			<datawc_x2 default="1.E20" doc="second value of xaxis on plot" instance="float"/>
+			<continents doc="continents type number" instance="int"/>
+			<xmtics1 default="''" doc="dictionary with location of intermediate tics as keys for 1st side of y axis" instance="str/{float:str}"/>
+			<xmtics2 default="''" doc="dictionary with location of intermediate tics as keys for 2nd side of y axis" instance="str/{float:str}"/>
+			<xbounds doc="Values to use instead of x axis bounds values" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<ybounds doc="Values to use instead of y axis bounds values (if exist)" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<datawc_y2 default="1.E20" doc="second value of yaxis on plot" instance="float"/>
+			<wname doc="replace waxis name on plot (if exists)" instance="str"/>
+			<file_comment doc="replaces file_comment on plot" instance="str"/>
+			<datawc_calendar default="135441" doc="calendar to use when displaying time dimension auto tick, default is proleptic gregorian calendar" instance="int"/>
+			<wunits doc="replace waxis units on plot (if exists)" instance="str"/>
+			<xrev doc="reverse x axis" instance="bool"/>
+			<zaxis doc="Axis object to replace the slab -3 dim axis, only if slab has more than 2D" instance="cdms2.axis.TransientAxis"/>
+			<ymd doc="replaces year/month/day on plot" instance="str"/>
+			<yarray doc="Values to use instead of y axis, only if var has more than 1D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<units doc="replaces units value on plot" instance="str"/>
+			<yunits doc="replace yaxis units on plot (if exists)" instance="str"/>
+			<zarray doc="Values to use instead of z axis, only if var has more than 2D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<xname doc="replace xaxis name on plot" instance="str"/>
+			<tarray doc="Values to use instead of t axis, only if var has more than 3D" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list"/>
+			<bg doc="plots in background mode" instance="bool/int"/>
+			<xaxis doc="Axis object to replace the slab -1 dim axis" instance="cdms2.axis.TransientAxis"/>
+			<xaxisconvert default="'linear'" doc="converting xaxis linear/log/log10/ln/exp/area_wt" instance="str"/>
+			<zname doc="replace zaxis name on plot (if exists)" instance="str"/>
+			<hms doc="replaces hh/mm/ss on plot" instance="str"/>
+			<tname doc="replace taxis name on plot (if exists)" instance="str"/>
+			<grid doc="replaces array grid (if exists)" instance="cdms2.grid.TransientRectGrid"/>
+			<yname doc="replace yaxis name on plot (if exists)" instance="str"/>
+			<ratio doc="sets the y/x ratio ,if passed as a string with 't' at the end, will aslo moves the ticks" instance="int/str"/>
+			<datawc_y1 default="1.E20" doc="first value of yaxis on plot" instance="float"/>
+			<xunits doc="replace xaxis units on plot" instance="str"/>
+			<name doc="replaces variable name on plot
+time "" (cdtime.comptime/cdtime.reltime/cdtime.abstime) () replaces time name on plot" instance="str"/>
+			<yaxis doc="Axis object to replace the slab -2 dim axis, only if slab has more than 1D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels1 default="'*'" doc="values for labels on 1st side of y axis" instance="str/{float:str}"/>
+			<waxis doc="Axis object to replace the slab -5 dim axis, only if slab has more than 4D" instance="cdms2.axis.TransientAxis"/>
+			<yticlabels2 default="'*'" doc="values for labels on 2nd side of y axis" instance="str/{float:str}"/>
+			<comment1 doc="replaces comment1 on plot" instance="str"/>
+			<zunits doc="replace zaxis units on plot (if exists)" instance="str"/>
+			<comment3 doc="replaces comment3 on plot" instance="str"/>
+			<comment2 doc="replaces comment2 on plot" instance="str"/>
+			<xticlabels1 default="'*'" doc="values for labels on 1st side of x axis" instance="str/{float:str}"/>
+			<comment4 doc="replaces comment4 on plot" instance="str"/>
+			<yrev doc="reverse y axis, only if slab has more than 1D" instance="bool"/>
+			<taxis doc="Axis object to replace the slab -4 dim axis, only if slab has more than 3D" instance="cdms2.axis.TransientAxis"/>
+		</options>
+		<input>
+			<slab doc="Data at least 1D, last dimension will be plotted" instance="cdms2.tvariable.TransientVariable/numpy.core.ma.MaskedArray/numpy.ndarray/list" position="0"/>
+		</input>
+		<output>
+			<display doc="no default" instance="vcs.displayplot.Dp" position="0"/>
+		</output>
+		<doc>
+			Function: yxvsx                        # Generate a Yxvsx plot
+
+ Description of Function:
+    Generate a Yxvsx plot given the data, Yxvsx graphics method, and
+    template. If no Yxvsx class object is given, then the 'default' Yxvsx
+    graphics method is used. Simerly, if no template class object is given,
+    then the 'default' template is used.
+
+ Example of Use:
+    a=vcs.init()
+    a.show('yxvsx')                   # Show all the existing Yxvsx graphics methods
+    yxx=a.getyxvsx('quick')           # Create instance of 'quick'
+    a.yxvsx(array,yxx)                # Plot array using specified yxx and default
+                                      #       template
+    a.clear()                         # Clear VCS canvas
+    a.yxvsx(array,yxx,template)       # Plot array using specified yxx and template
+
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End yxvsx Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		</doc>
+	</action>
+    <action name="png" type="function">
+		<input>
+			<file doc="" instance="str" position="0" required="True"/>
+			<width doc="" instance="float" position="1" required="False"/>
+			<height doc="" instance="float" position="2" required="False"/>
+			<units doc="" instance="str" position="3" required="False"/>
+		</input>
+		<doc>
+			Function: png
+
+ Description of Function:
+    Png output is another form of raster graphics.
+
+ Example of Use:
+    a=vcs.init()
+    a.plot(array)
+    a.png('example')       # Overwrite a png file
+    a.png('example', width=11.5, height= 8.5)  # US Legal
+    a.png('example', width=21, height=29.7, units='cm')  # A4
+#################################################################################################################
+###########################################                       ###############################################
+########################################## End png Description ################################################
+#########################################                       #################################################
+#################################################################################################################
+		</doc>
+    </action>
+</diagnostic>
diff --git a/contrib/cdat/scripts/xml/cdms2.xml b/contrib/cdat/scripts/xml/cdms2.xml
new file mode 100644
index 0000000..1d384fc
--- /dev/null
+++ b/contrib/cdat/scripts/xml/cdms2.xml
@@ -0,0 +1,26 @@
+<diagnostic author="PCMDI's software team" programminglanguage="Python" type="class" url="http://cdat.sf.net" version="5.0.0.alpha7" codepath="cdms2">
+	<action name="open" type="function">
+        <input>
+           <uri doc="" instance="str" position="0" required="True"/>
+           <mode doc="" instance="str" position="1" required="False"/>
+           <template doc="" instance="str" position="2" required="False"/>
+           <dods doc="" instance="int" position="3" required="False"/>
+        </input>
+        <output>
+            <dataset doc="" instance="cdms2.dataset.CdmsFile" position="0"/>
+        </output>
+    <doc>
+        Function: open     # Open an existing dataset
+
+Description of Function:
+    'uri' is a Uniform Resource Identifier, referring to a cdunif file, XML file,
+    or LDAP URL of a catalog dataset entry.
+    'mode' is 'r', 'r+', 'a', or 'w'
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End open Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+    </doc>
+</action>
+</diagnostic>
\ No newline at end of file
diff --git a/contrib/cdat/scripts/xml/cdmsFile.xml b/contrib/cdat/scripts/xml/cdmsFile.xml
new file mode 100644
index 0000000..fe2727a
--- /dev/null
+++ b/contrib/cdat/scripts/xml/cdmsFile.xml
@@ -0,0 +1,23 @@
+<diagnostic author="PCMDI's software team" programminglanguage="Python" type="class" url="http://cdat.sf.net" version="5.0.0.alpha7" codepath="cdms2.dataset.CdmsFile">
+	<action name="__call__" type="function">
+        <input>
+           <id doc="" instance="str" position="0" required="True"/>
+        </input>
+        <output>
+            <variable doc="" instance="cdms2.tvariable.TransientVariable" position="0"/>
+        </output>
+    <doc>
+        Function: __call__     # Call a variable object with the given id
+
+Description of Function:
+    Call a variable object with the given id
+    Exception if not found.
+    Call the variable with the other arguments.
+###################################################################################################################
+###########################################                         ###############################################
+########################################## End _call_ Description ################################################
+#########################################                         #################################################
+###################################################################################################################
+    </doc>
+</action>
+</diagnostic>
\ No newline at end of file
diff --git a/contrib/edu_utah_sci_cscheid_macet/MANIFEST b/contrib/edu_utah_sci_cscheid_macet/MANIFEST
new file mode 100644
index 0000000..61b0205
--- /dev/null
+++ b/contrib/edu_utah_sci_cscheid_macet/MANIFEST
@@ -0,0 +1 @@
+F __init__.py
diff --git a/contrib/edu_utah_sci_cscheid_macet/__init__.py b/contrib/edu_utah_sci_cscheid_macet/__init__.py
new file mode 100644
index 0000000..6a86374
--- /dev/null
+++ b/contrib/edu_utah_sci_cscheid_macet/__init__.py
@@ -0,0 +1,125 @@
+# VisTrails Macet package
+
+# Macet is an isosurface triangle mesh generator that consistently
+# generates good-triangle quality.
+
+# Macet is described in
+
+# Carlos Dietrich, Joao Comba, Luciana Nedel, Carlos Scheidegger, John
+# Schreiner, Claudio Silva. Edge Transformations for Improving Mesh
+# Quality of Marching Cubes. 2007, submitted.
+
+# This package was created by Carlos Eduardo Scheidegger, 2007
+# cscheid at sci.utah.edu. This is GPL v2 or later, your choice.
+
+##############################################################################
+
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from core.system import list2cmdline
+
+# This accomodates two different VisTrails versions: the released one,
+# and the one in development
+
+
+try:
+    from core.configuration import ConfigurationObject
+    global configuration
+    configuration = ConfigurationObject(executable_path=(None, str))
+    old_vistrails = False
+except ImportError:
+    old_vistrails = True
+
+import os
+
+identifier = 'edu.utah.sci.cscheid.macet'
+version = '0.1.0'
+name = 'Macet'
+
+##############################################################################
+
+def get_path():
+    global _macet_path
+    if old_vistrails:
+        return _macet_path
+    if configuration.has('executable_path'):
+        p = configuration.executable_path + '/'
+    else:
+        p = ''
+    p += 'macet'
+    return p
+
+class Macet(Module):
+
+    def compute(self):
+        self.checkInputPort('input_file')
+        self.checkInputPort('iso_value')
+        
+        input_file = self.getInputFromPort('input_file')
+        output_file = self.interpreter.filePool.create_file(suffix='.off')
+
+        iso_value = self.getInputFromPort('iso_value')
+
+        values = [get_path(), input_file.name,
+                  str(iso_value), output_file.name, '-isCombined']
+        cmdline = list2cmdline(values)
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, 'Execution failed')
+
+        self.setResult('output_file', output_file)
+
+class MarchingCubes(Module):
+
+    def compute(self):
+        self.checkInputPort('input_file')
+        self.checkInputPort('iso_value')
+        
+        input_file = self.getInputFromPort('input_file')
+        output_file = self.interpreter.filePool.create_file(suffix='.off')
+
+        iso_value = self.getInputFromPort('iso_value')
+
+        values = [get_path(), input_file.name,
+                  str(iso_value), output_file.name]
+        cmdline = list2cmdline(values)
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, 'Execution failed')
+
+        self.setResult('output_file', output_file)
+
+##############################################################################
+
+def initialize(executable_path=None):
+
+    if old_vistrails:
+        global _macet_path
+        if executable_path:
+            _macet_path = executable_path + '/macet'
+        else:
+            _macet_path = 'macet'
+
+    reg = core.modules.module_registry
+
+    reg.add_module(Macet)
+
+    reg.add_input_port(Macet, 'input_file',
+                       core.modules.basic_modules.File)
+    reg.add_input_port(Macet, 'iso_value',
+                       core.modules.basic_modules.Float)
+    reg.add_output_port(Macet, 'output_file',
+                        core.modules.basic_modules.File)
+
+    reg.add_module(MarchingCubes)
+
+    reg.add_input_port(MarchingCubes, 'input_file',
+                       core.modules.basic_modules.File)
+    reg.add_input_port(MarchingCubes, 'iso_value',
+                       core.modules.basic_modules.Float)
+    reg.add_output_port(MarchingCubes, 'output_file',
+                        core.modules.basic_modules.File)
+
diff --git a/contrib/edu_utah_sci_cscheid_metro/MANIFEST b/contrib/edu_utah_sci_cscheid_metro/MANIFEST
new file mode 100644
index 0000000..4273023
--- /dev/null
+++ b/contrib/edu_utah_sci_cscheid_metro/MANIFEST
@@ -0,0 +1,2 @@
+F __init__.py
+
diff --git a/contrib/edu_utah_sci_cscheid_metro/__init__.py b/contrib/edu_utah_sci_cscheid_metro/__init__.py
new file mode 100644
index 0000000..bf3b9a6
--- /dev/null
+++ b/contrib/edu_utah_sci_cscheid_metro/__init__.py
@@ -0,0 +1,158 @@
+# VisTrails package for metro support
+# Copyright Carlos Eduardo Scheidegger, 2007
+# Get metro at http://vcg.sourceforge.net/
+
+# License: GPLv2 or later
+
+# ChangeLog:
+
+# 2007-03-13  Carlos Scheidegger  <cscheid at juggernaut>
+# 	* First release
+##############################################################################
+
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import core.bundles
+from core.system import list2cmdline
+import core.requirements
+import os
+import re
+
+try:
+    from core.configuration import ConfigurationObject
+    global configuration
+    configuration = ConfigurationObject(executable_path=(None, str))
+    old_vistrails = False
+except ImportError:
+    old_vistrails = True
+
+identifier = 'edu.utah.sci.cscheid.metro'
+version = '0.1'
+name = 'metro'
+
+################################################################################
+
+def get_path():
+    global _metro_path
+    if old_vistrails:
+        return _metro_path
+    if configuration.has('executable_path'):
+        p = configuration.executable_path + '/'
+    else:
+        p = ''
+    p += 'metro'
+    return p
+
+class Metro(Module):
+
+    def __init__(self):
+        Module.__init__(self)
+        self.need_error_meshes = False
+        self.need_histograms = False
+
+    def is_cacheable(self):
+        return self.need_error_meshes and self.need_histograms
+
+    def compute(self):
+        self.checkInputPort('mesh1')
+        self.checkInputPort('mesh2')
+        f1 = self.getInputFromPort('mesh1')
+        f2 = self.getInputFromPort('mesh2')
+
+        make_file = self.interpreter.filePool.create_file
+
+        metro_output = make_file(suffix='.txt')
+
+        values = [get_path(), f1.name, f2.name, '-q']
+
+        need_error_meshes = False
+        if (self.outputPorts.has_key('error_mesh_1') or
+            self.outputPorts.has_key('error_mesh_2')):
+            need_error_meshes = True
+            error_mesh_output = (make_file(suffix='.ply'),
+                                 make_file(suffix='.ply'))
+            values.append('-c')
+            values.append(error_mesh_output[0].name)
+            values.append(error_mesh_output[1].name)
+
+        need_histograms = False
+        if (self.outputPorts.has_key('error_hist_1') or
+            self.outputPorts.has_key('error_hist_2')):
+            need_histograms = True
+            error_hist_output = (make_file(suffix='.csv'),
+                                 make_file(suffix='.csv'))
+            values.append('-h')
+            values.append(error_hist_output[0].name)
+            values.append(error_hist_output[1].name)
+
+        values.append('>')
+        values.append(metro_output.name)
+        
+        cmdline = list2cmdline(values)
+
+#         cmdline = ('%s ' * len(values)) % tuple(values)
+#         cmdline += '> '
+#         cmdline += metro_output.name
+        print cmdline
+        
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, "Execution failed")
+        l = [x for x in file(metro_output.name).readlines()
+             if x.startswith('Hausdorff')][0]
+        regexp = re.compile(r'Hausdorff distance: ([0123456789.]+) \(([0123456789.]+)  wrt bounding box diagonal\)')
+        results = regexp.match(l).groups()
+        
+        if need_error_meshes:
+            self.setResult('error_mesh_1', error_mesh_output[0])
+            self.setResult('error_mesh_2', error_mesh_output[1])
+
+        if need_histograms:
+            self.setResult('error_hist_1', error_hist_output[0])
+            self.setResult('error_hist_2', error_hist_output[1])
+
+        self.need_error_meshes = need_error_meshes
+        self.need_histograms = need_histograms
+
+        self.setResult('hausdorff_error', float(results[0]))
+        self.setResult('normalized_hausdorff_error', float(results[1]))
+
+################################################################################
+
+def initialize(executable_path=None):
+    if old_vistrails:
+        global _metro_path
+        if (core.requirements.executable_file_exists('metro') or
+            core.bundles.install({'linux-ubuntu': 'vcg-metro'})):
+            _metro_path = 'metro'
+        elif executable_path:
+            _metro_path = executable_path + '/metro'
+            print "Will assume metro is in ",executable_path
+        else:
+            raise core.requirements.MissingRequirement("VCG's Metro")
+    else:
+        if (not core.requirements.executable_file_exists('metro') and
+            not core.bundles.install({'linux-ubuntu': 'vcg-metro'})):
+            raise core.requirements.MissingRequirement("VCG's Metro")
+    
+    reg = core.modules.module_registry
+
+    reg.add_module(Metro)
+    reg.add_input_port(Metro, 'mesh1',
+                       core.modules.basic_modules.File)
+    reg.add_input_port(Metro, 'mesh2',
+                       core.modules.basic_modules.File)
+
+    reg.add_output_port(Metro, 'hausdorff_error',
+                        core.modules.basic_modules.Float)
+    reg.add_output_port(Metro, 'normalized_hausdorff_error',
+                        core.modules.basic_modules.Float)
+    reg.add_output_port(Metro, 'error_mesh_1',
+                        core.modules.basic_modules.File)
+    reg.add_output_port(Metro, 'error_mesh_2',
+                        core.modules.basic_modules.File)
+    reg.add_output_port(Metro, 'error_hist_1',
+                        core.modules.basic_modules.File)
+    reg.add_output_port(Metro, 'error_hist_2',
+                        core.modules.basic_modules.File)
diff --git a/contrib/edu_utah_sci_cscheid_teem/__init__.py b/contrib/edu_utah_sci_cscheid_teem/__init__.py
new file mode 100644
index 0000000..1be4c00
--- /dev/null
+++ b/contrib/edu_utah_sci_cscheid_teem/__init__.py
@@ -0,0 +1,909 @@
+"""Teem package for VisTrails.
+"""
+
+##############################################################################
+# Changes
+#
+# 20081002: Added UnuSlice
+
+import core.modules
+import core.modules.module_registry
+import core.modules.basic_modules as basic
+from core.modules.vistrails_module import Module, ModuleError, \
+     new_module, IncompleteImplementation
+
+import os
+import subprocess
+
+_teemPath = None
+_teemLimnTestPath = None
+_teemTenTestPath = None
+
+identifier = 'edu.utah.sci.cscheid.teem'
+version = '0.2'
+name = 'teem'
+
+###############################################################################
+
+FileType = [(basic.File, '')]
+FloatType = [(basic.Float, '')]
+IntegerType = [(basic.Integer, '')]
+StringType = [(basic.String, '')]
+Vec3Type = [(basic.Float, 'x'),
+            (basic.Float, 'y'),
+            (basic.Float, 'z')]
+
+class Teem(Module):
+
+    def run_at_path(self, cmdline, path):
+        cmdline = path + cmdline
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, '"%s" failed' % cmdline)
+
+    def run_path(self, *cmds):
+        cmdline = " ".join([str(cmd) for cmd in cmds])
+        self.run_at_path(cmdline, '')
+        
+    def run_teem(self, *cmds):
+        cmdline = " ".join([str(cmd) for cmd in cmds])
+        self.run_at_path(cmdline, _teemPath)
+
+    def run_limn_test(self, *cmds):
+        cmdline = " ".join([str(cmd) for cmd in cmds])
+        self.run_at_path(cmdline, _teemLimnTestPath)
+
+    def run_ten_test(self, *cmds):
+        cmdline = " ".join([str(cmd) for cmd in cmds])
+        self.run_at_path(cmdline, _teemTenTestPath)
+
+    def opt_command_line_val(self, option_name, port_name):
+        if self.hasInputFromPort(port_name):
+            return [option_name, self.getInputFromPort(port_name)]
+        else:
+            return []
+
+    def opt_command_line_vec(self, option_name, port_name):
+        if self.hasInputFromPort(port_name):
+            t = self.getInputFromPort(port_name)
+            return [option_name] + list(t)
+        else:
+            return []
+
+    def opt_command_line_file(self, option_name, port_name):
+        if self.hasInputFromPort(port_name):
+            t = self.getInputFromPort(port_name)
+            return [option_name, t.name]
+        else:
+            return []
+
+    def opt_command_line_noopt(self, option_name, port_name):
+        if self.hasInputFromPort(port_name):
+            return [option_name]
+        else:
+            return []
+
+    ##########################################################################
+    # Default compute for (hopefully) most classes
+
+    _opt_dict = {'v': opt_command_line_val,
+                 'V': opt_command_line_vec,
+                 'f': opt_command_line_file,
+                 'n': opt_command_line_noopt}
+
+    def process_command_line_input(self):
+        cmdline = [self._cmdline_base]
+        for (opt_type, port_name, option_name) in self._cmdline_inputs:
+            call = self._opt_dict[opt_type]
+            cmdline += call(self, option_name=option_name,
+                            port_name=port_name)
+        return cmdline
+
+    def process_command_line_output(self):
+        (port_name, opt_name, format) = self._cmdline_output
+        if callable(format):
+            format = format(self)
+        output_file = self.interpreter.filePool.create_file(suffix='.'+format)
+        self.setResult(port_name, output_file)
+        return [opt_name, output_file.name]
+
+    def compute(self):
+        cmdline_input = self.process_command_line_input()
+        cmdline_output = self.process_command_line_output()
+        self._cmdline_callable(*(cmdline_input + cmdline_output))
+
+class Emap(Teem):
+
+    def compute(self):
+        cmdline = ['emap']
+        cmdline += self.opt_command_line_vec(port_name='from',
+                                             option_name='-fr')
+        cmdline += self.opt_command_line_vec(port_name='ambient',
+                                             option_name='-amb')
+        cmdline += self.opt_command_line_vec(port_name='up',
+                                             option_name='-up')
+        cmdline += self.opt_command_line_noopt(port_name='right_hand',
+                                               option_name='-rh')
+        self.checkInputPort('input_file')
+        cmdline += self.opt_command_line_file(port_name='input_file',
+                                              option_name='-i')
+
+        output_file = self.interpreter.filePool.create_file(suffix='.nrrd')
+        cmdline += ['-o', output_file.name]
+        
+        self.run_teem(*cmdline)
+        
+        self.setResult("output_file", output_file)
+
+    _input_ports = [('right_hand', []),
+                    ('input_file', [(basic.File, 'the lights input file')]),
+                    ('from', Vec3Type),
+                    ('ambient', Vec3Type),
+                    ('up', Vec3Type)]
+    _output_ports = [('output_file', [(basic.File, 'the resulting nrrd')])]
+
+class Soid(Teem):
+
+    def compute(self):
+        cmdline = ['soid']
+        cmdline += self.opt_command_line_val(port_name='resolution',
+                                                option_name='-res')
+        cmdline += self.opt_command_line_val(port_name='radius',
+                                                option_name='-r')
+        cmdline += self.opt_command_line_vec(port_name='scalings',
+                                             option_name='-sc')
+        cmdline += self.opt_command_line_noopt(port_name='sphere',
+                                               option_name='-sphere')
+
+        if self.hasInputFromPort('AB'):
+            cmdline += self.opt_command_line_vec(port_name='AB',
+                                                 option_name='-AB')
+        elif self.hasInputFromPort('A') and self.hasInputFromPort('B'):
+            cmdline += ['-AB',
+                        self.getInputFromPort('A'),
+                        self.getInputFromPort('B')]
+
+        output_file = self.interpreter.filePool.create_file(suffix='.nrrd')
+        cmdline += ['-o', output_file.name]
+
+        self.run_limn_test(*cmdline)
+        self.setResult("output_file", output_file)
+
+    _input_ports = [('resolution', [(basic.Float, 'The ellipsoid resolution')]),
+                    ('radius', [(basic.Float, 'The radius')]),
+                    ('sphere', []),
+                    ('scalings', Vec3Type),
+                    ('AB', [(basic.Float, 'A exponent'),
+                            (basic.Float, 'B exponent')]),
+                    ('A', [(basic.Float, 'A exponent')]),
+                    ('B', [(basic.Float, 'B exponent')]),
+                    ]
+    _output_ports = [('output_file', [(basic.File, 'the resulting OFF file')])]
+
+
+class OffToEps(Teem):
+
+    def compute(self):
+        cmdline = ['off2eps']
+        cmdline += self.opt_command_line_vec(port_name='from_point',
+                                             option_name='-fr')
+        cmdline += self.opt_command_line_vec(port_name='u_range',
+                                             option_name='-ur')
+        cmdline += self.opt_command_line_vec(port_name='v_range',
+                                             option_name='-vr')
+        cmdline += self.opt_command_line_vec(port_name='edge_widths',
+                                             option_name='-wd')
+        cmdline += self.opt_command_line_file(port_name='environment_map',
+                                              option_name='-e')
+        cmdline += self.opt_command_line_noopt(port_name='orthogonal',
+                                               option_name='-or')
+        cmdline += self.opt_command_line_noopt(port_name='right_hand',
+                                               option_name='-rh')
+        cmdline += self.opt_command_line_noopt(port_name='concave',
+                                               option_name='-concave')
+        cmdline += self.opt_command_line_noopt(port_name='no_background',
+                                               option_name='-nobg')
+        cmdline += self.opt_command_line_val(port_name='world_to_points_scale',
+                                             option_name='-ws')
+        
+
+        self.checkInputPort('input_file')
+        input_file = self.getInputFromPort('input_file')
+        cmdline += ['-i', input_file.name]
+
+        output_file = self.interpreter.filePool.create_file(suffix='.eps')
+        cmdline += ['-o', output_file.name]
+
+        self.run_limn_test(*cmdline)
+        self.setResult("output_file", output_file)
+
+
+    _input_ports = [
+        ("right_hand", []),
+        ("input_file", [(basic.File, 'the input OFF file')]),
+        ("environment_map", [(basic.File, 'the nrrd storing the environment map')]),
+        ("from_point", [(basic.Float, '')] * 3),
+        ("u_range", [(basic.Float, '')] * 2),
+        ("v_range", [(basic.Float, '')] * 2),
+        ("edge_widths", [(basic.Float, '')] * 5),
+        ("orthogonal", []),
+        ("no_background", []),
+        ("concave", []),
+        ("world_to_points_scale", [(basic.Float, '')]),
+        ]
+
+    _output_ports = [
+        ("output_file", [(basic.File, '')]),
+        ]
+
+class EpsToPpm(Teem):
+
+    def compute(self):
+        cmdline = ['eps2ppm']
+        self.checkInputPort('input_file')
+        self.checkInputPort('resolution')
+        cmdline += [self.getInputFromPort('input_file').name]
+        cmdline += [self.getInputFromPort('resolution')]
+        cmdline += ['>']
+        output_file = self.interpreter.filePool.create_file(suffix='.ppm')
+        cmdline += [output_file.name]
+        self.run_path(*cmdline)
+        self.setResult("output_file", output_file)
+
+    _input_ports = [
+        ("input_file", [(basic.File, 'the input EPS')]),
+        ("resolution", [(basic.Float, 'the resolution to rasterize the EPS')]),
+        ]
+
+    _output_ports = [
+        ("output_file", [(basic.File, 'the resulting PPM file')]),
+        ]
+    
+class Unu(Teem):
+
+    def do_output(self):
+        if self.hasInputFromPort('format'):
+            suffix = '.'+self.getInputFromPort('format')
+        else:
+            suffix = '.nrrd'
+        output_file = self.interpreter.filePool.create_file(suffix=suffix)
+        return (['-o', output_file.name], output_file)
+
+    def do_input(self):
+        self.checkInputPort('input_file')
+        return ['-i', self.getInputFromPort('input_file').name]
+
+    _input_ports = [
+        ("format", [(basic.String, 'file format for output')]),
+        ]
+    _output_ports = [
+        ("output_file", [(basic.File, 'the output file')]),
+        ]
+
+class UnuSave(Unu):
+    
+    def compute(self):
+	cmdline = ['unu save']
+	cmdline += self.do_input()
+	(ocmd, output_file) = self.do_output()
+	self.setResult("output_file", output_file)
+	self.setResult("output_name", output_file.name)
+	cmdline += ocmd
+	cmdline += self.opt_command_line_val(port_name='output_format', option_name='-f')
+	self.run_teem(*cmdline)
+        
+    _input_ports = [
+        ("input_file", [(basic.File, 'Input File')]),
+        ("output_format", [(basic.String, 'Output Format')]),
+        ]
+    _output_ports = [
+        ("output_name", [(basic.String, 'Output Filename')]),
+        ]
+
+class UnuSwap(Unu):
+
+    def compute(self):
+        cmdline = ['unu swap']
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        self.setResult("output_file", output_file)
+        v1, v2 = self.getInputFromPort('axes')
+        cmdline += ['-a', str(v1), str(v2)]
+        cmdline += ocmd
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("input_file", [(basic.File, 'Input File')]),
+        ("axes", [(basic.Integer, '')]*2),
+        ]
+
+class UnuProject(Unu):
+
+    def compute(self):
+        cmdline = ['unu project']
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        self.setResult("output_file", output_file)
+        cmdline += ocmd
+        cmdline += self.opt_command_line_val(port_name='axis',
+                                             option_name='-a')
+        cmdline += self.opt_command_line_val(port_name='measure',
+                                             option_name='-m')
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("input_file", [(basic.File, 'the input file')]),
+        ("measure", [(basic.String, 'the measure to use')]),
+        ("axis", (basic.Integer, 'the axis to project')),
+        ]
+
+class UnuMinmax(Teem):
+
+    def do_input(self):
+        self.checkInputPort('input_file')
+        return [self.getInputFromPort('input_file').name]
+
+    def compute(self):
+        cmdline = ['unu minmax']
+        cmdline += self.do_input()
+        if self.hasInputFromPort('blind8'):
+            cmdline += '-blind8 true'
+        output_file = self.interpreter.filePool.create_file()
+        # FIXME use popen*
+        cmdline += ['>%s'%output_file.name]
+        self.run_teem(*cmdline)
+        f = file(output_file.name)
+        try:
+            mn = float(f.readline().split()[-1])
+            mx = float(f.readline().split()[-1])
+        except:
+            raise ModuleError(self, 'Could not read result')
+        self.setResult('range', (mn, mx))
+
+    _input_ports = [('input_file', [(basic.File, 'the input file')]),
+                    ('blind8', [])]
+    _output_ports = [('range', [(basic.Float,'')] * 2)]
+
+class UnuReshape(Unu):
+
+    def compute(self):
+        cmdline = ['unu reshape']
+        cmdline += self.do_input()
+        cmdline += self.opt_command_line_val(port_name='axes',
+                                             option_name='-s')
+        (ocmd, output_file) = self.do_output()
+        self.setResult("output_file", output_file)
+        cmdline += ocmd
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("input_file", [(basic.File, 'the input file')]),
+        ("axes", [(basic.String, 'axes to split')]),
+        ]
+    
+
+class UnuResample(Unu):
+
+    def compute(self):
+        cmdline = ['unu resample']
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult("output_file", output_file)
+        cmdline += self.opt_command_line_val(port_name='sampling_spec',
+                                             option_name='-s')
+        cmdline += self.opt_command_line_val(port_name='centering',
+                                             option_name='-c')
+        cmdline += self.opt_command_line_val(port_name='kernel',
+                                             option_name='-k')
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("input_file", [(basic.File, 'the input file')]),
+        ("sampling_spec", [(basic.String, 'the sampling spec')]),
+        ("centering", [(basic.String, 'centering (node/cell)')]),
+        ("kernel", [(basic.String, 'the resampling kernel')]),
+        ]
+
+class UnuJoin(Unu):
+
+    def do_input(self):
+        self.checkInputPort('input_list')
+        return ['-i'] + [x.name
+                         for x in self.getInputFromPort('input_list')]
+
+    def compute(self):
+        cmdline = ['unu join']
+        cmdline += self.do_input()
+        cmdline += self.opt_command_line_val(port_name='axis',
+                                             option_name='-a')
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult("output_file", output_file)
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("input_list", [(basic.List, 'list of input files')]),
+        ("axis", [(basic.Integer, 'the axis to join')]),
+        ]
+    
+class UnuQuantize(Unu):
+
+    def do_input(self):
+        current = Unu.do_input(self)
+        self.checkInputPort('bits')
+        return current + ['-b', self.getInputFromPort('bits')]
+
+    def compute(self):
+        cmdline = ['unu quantize']
+        cmdline += self.do_input()
+        cmdline += self.opt_command_line_val(port_name='min',
+                                             option_name='-min')
+        cmdline += self.opt_command_line_val(port_name='max',
+                                             option_name='-max')
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult("output_file", output_file)
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("input_file", [(basic.File, 'the input file')]),
+        ('bits', [(basic.Integer, 'bits to quantize down to')]),
+        ('min', [(basic.Float, 'min value')]),
+        ('max', [(basic.Float, 'max value')]),
+        ]
+    
+class Unu1op(Unu):
+
+    def do_input(self):
+        r = []
+        if self.hasInputFromPort('in1_file'):
+            r += ['-i', self.getInputFromPort('in1_file').name]
+        return r
+
+    def is_cacheable(self):
+        return not self.getInputFromPort('op') in ['rand', 'nrand']
+
+    def compute(self):
+        allowed_ops = ['-', 'r', 'sin',
+                       'cos', 'tan', 'asin', 'acos', 'atan',
+                       'exp', 'log', 'log10', 'log1p', 'log2', 'sqrt'
+                       'cbrt', 'ceil', 'floor', 'erf', 'rup',
+                       'abs', 'sgn', 'exists', 'rand', 'nrand',
+                       'if', '0', '1']
+        self.checkInputPort('op')
+        if not self.getInputFromPort('op') in allowed_ops:
+            raise ModuleError(self, ("Operation %s is not allowed." % 
+                                     self.getInputFromPort('op')))
+        cmdline = ['unu 1op']
+        cmdline += [self.getInputFromPort('op')]
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult('output_file', output_file)
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("in1_file", [(basic.File, 'input file 1')]),
+        ("op", [(basic.String, 'the operation')]),
+        ]
+
+class Unu2op(Unu):
+
+    def do_input(self):
+        r = []
+        if self.hasInputFromPort('in1_file'):
+            r += [self.getInputFromPort('in1_file').name]
+        elif self.hasInputFromPort('in1_value'):
+            r += [self.getInputFromPort('in1_value')]
+        else:
+            raise ModuleError(self, "Needs either in1_file or in1_value")
+        if self.hasInputFromPort('in2_file'):
+            r += [self.getInputFromPort('in2_file').name]
+        elif self.hasInputFromPort('in2_value'):
+            r += [self.getInputFromPort('in2_value')]
+        else:
+            raise ModuleError(self, "Needs either in2_file or in2_value")
+        return r
+
+    def compute(self):
+        allowed_ops = ['+', '-', 'x', '/',
+                       '^', 'pow', 'spow', '%', 'fmod', 'atan2',
+                       'min', 'max', 'lt', 'lte', 'gt', 'gte'
+                       'eq', 'neq', 'comp', 'if', 'exists']
+        self.checkInputPort('op')
+        if not self.getInputFromPort('op') in allowed_ops:
+            raise ModuleError(self, ("Operation %s is not allowed." % 
+                                     self.getInputFromPort('op')))
+        cmdline = ['unu 2op']
+        cmdline += [self.getInputFromPort('op')]
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult('output_file', output_file)
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("in1_file", [(basic.File, 'input file 1')]),
+        ("in1_value", [(basic.String, 'input value 1')]),
+        ("in2_file", [(basic.File, 'input file 2')]),
+        ("in2_value", [(basic.String, 'input value 2')]),
+        ("op", [(basic.String, 'the operation')]),
+        ]
+
+
+class Unu3op(Unu):
+
+    def do_input(self):
+        r = []
+        if self.hasInputFromPort('in1_file'):
+            r += [self.getInputFromPort('in1_file').name]
+        elif self.hasInputFromPort('in1_value'):
+            r += [self.getInputFromPort('in1_value')]
+        else:
+            raise ModuleError(self, "Needs either in1_file or in1_value")
+        if self.hasInputFromPort('in2_file'):
+            r += [self.getInputFromPort('in2_file').name]
+        elif self.hasInputFromPort('in2_value'):
+            r += [self.getInputFromPort('in2_value')]
+        else:
+            raise ModuleError(self, "Needs either in2_file or in2_value")
+        if self.hasInputFromPort('in3_file'):
+            r += [self.getInputFromPort('in3_file').name]
+        elif self.hasInputFromPort('in3_value'):
+            r += [self.getInputFromPort('in3_value')]
+        else:
+            raise ModuleError(self, "Needs either in3_file or in3_value")
+        return r
+
+    def compute(self):
+        allowed_ops = ['+', 'x',
+                       'min', 'max',
+                       'clamp', 'ifelse',
+                       'lerp', 'exists',
+                       'in_op', 'in_cl']
+        self.checkInputPort('op')
+        if not self.getInputFromPort('op') in allowed_ops:
+            raise ModuleError(self, ("Operation %s is not allowed." % 
+                                     self.getInputFromPort('op')))
+        cmdline = ['unu 3op']
+        cmdline += [self.getInputFromPort('op')]
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult('output_file', output_file)
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ("in1_file", [(basic.File, 'input file 1')]),
+        ("in1_value", [(basic.String, 'input value 1')]),
+        ("in2_file", [(basic.File, 'input file 2')]),
+        ("in2_value", [(basic.String, 'input value 2')]),
+        ("in3_file", [(basic.File, 'input file 3')]),
+        ("in3_value", [(basic.String, 'input value 3')]),
+        ("op", [(basic.String, 'the operation')]),
+    ]
+    
+class Teem_TT(Teem):
+    _cmdline_base = 'tt'
+    _cmdline_inputs = [('v', 'num_samples', '-n'),
+                       ('V', 'location', '-p'),
+                       ('v', 'max_ca', '-ca'),
+                       ('n', 'right_triangle', '-r'),
+                       ('n', 'whole', '-w'),
+                       ('v', 'westin_metric', '-v'),
+                       ('v', 'hack', '-hack')]
+    _cmdline_output = ('output_file', '-o', '.nrrd')
+    _cmdline_callable = Teem.run_ten_test
+
+    _input_ports = [
+        ("num_samples", [(basic.String, 'number of samples')]),
+        ("location", Vec3Type),
+        ("max_ca", [(basic.Float, 'max CA')]),
+        ("westin_metric", [(basic.Float, 'Metric to use')]),
+        ("hack", [(basic.Float, '"this is a hack"')]),
+        ("right_triangle", []),
+        ("whole", []),
+        ]
+    _output_ports = [
+        ("output_file", [(basic.File, "the output file")]),
+        ]
+
+class Tend_norm(Teem):
+    _cmdline_base = 'tend norm'
+    _cmdline_inputs = [('V', 'weights', '-w'),
+                       ('v', 'amount', '-a'),
+                       ('v', 'target', '-t'),
+                       ('f', 'input_file', '-i')]
+    _cmdline_output = ('output_file', '-o', 'nrrd')
+    _cmdline_callable = Teem.run_teem
+
+    _input_ports = [
+        ("weights", Vec3Type),
+        ("amount", [(basic.Float, "amount of normalization")]),
+        ("target", [(basic.Float, "target size post normalization")]),
+        ("input_file", [(basic.File, "input DT volume")]),
+        ]
+
+    _output_ports = [
+        ("output_file", [(basic.File, "output file")]),
+        ]
+
+class Tend_glyph(Teem):
+    _cmdline_base = 'tend glyph'
+    _cmdline_inputs = [('v', 'sat', '-sat'),
+                       ('f', 'emap', '-emap'),
+                       ('f', 'input_file', '-i'),
+                       ('V', 'from_point', '-fr'),
+                       ('V', 'up', '-up'),
+                       ('v', 'psc', '-psc'),
+                       ('V', 'u_range', '-ur'),
+                       ('V', 'v_range', '-vr'),
+                       ('n', 'orthogonal', '-or'),
+                       ('v', 'atr', '-atr'),
+                       ('n', 'no_background', '-nobg'),
+                       ('n', 'right_hand', '-rh'),
+                       ('v', 'glyph_shape', '-g'),
+                       ('v', 'glyph_size', '-gsc'),
+                       ('v', 'glyph_resolution', '-gr'),
+                       ('V', 'widths', '-wd')]
+    _cmdline_output = ('output_file', '-o', 'eps')
+    _cmdline_callable = Teem.run_teem
+
+    _input_ports = [
+        ("sat", [(basic.Float, "max saturation")]),
+        ("from_point", [(basic.Float, '')] * 3),
+        ("up", [(basic.Float, '')] * 3),
+        ("psc", [(basic.Float, 'ps scale')]),
+        ("u_range", [(basic.Float, '')] * 2),
+        ("v_range", [(basic.Float, '')] * 2),
+        ("orthogonal", []),
+        ("atr", [(basic.Float, 'anisotropy threshold')]),
+        ("emap", [(basic.File, 'environment map nrrd')]),
+        ("input_file", [(basic.File, 'the input file')]),
+        ("no_background", []),
+        ("glyph_shape", [(basic.String, 'glyph shape')]),
+        ("glyph_size", [(basic.Float, 'glyph size in world space')]),
+        ("glyph_resolution", [(basic.Integer, 'glyph resolution of polygonization')]),
+        ("widths", [(basic.Float, '')] * 3),
+        ("right_hand", []),
+    ]
+    _output_ports = [
+        ("output_file", [(basic.File, 'output EPS file')])
+        ]
+
+class UnuSlice(Unu):
+
+    def do_input(self):
+        r = []
+        self.checkInputPort('in_file')
+        self.checkInputPort('axis')
+        self.checkInputPort('position')
+        r += ['-i', self.getInputFromPort('in_file').name]
+        r += ['-a', str(self.getInputFromPort('axis'))]
+        r += ['-p', str(self.getInputFromPort('position'))]
+        return r
+
+    def compute(self):
+        cmdline = ['unu slice']
+        cmdline += self.do_input()
+        (ocmd, output_file) = self.do_output()
+        cmdline += ocmd
+        self.setResult('output_file', output_file)
+        self.run_teem(*cmdline)
+
+    _input_ports = [
+        ('in_file', basic.File),
+        ('axis', basic.Integer),
+        ('position', basic.Integer),
+        ]
+
+    
+###############################################################################
+
+class TeemScaledTransferFunction(Teem):
+    _input_ports = [('range', [(basic.Float, '')] * 2),
+                    ('steps', [basic.Integer])]
+    _output_ports = [('nrrd', [(basic.File, 'the output TF')])]
+
+    def compute(self):
+        ramp = self.interpreter.filePool.create_file(suffix='.txt')
+        tf_vals = self.interpreter.filePool.create_file(suffix='.txt')
+        output = self.interpreter.filePool.create_file(suffix='.nrrd')
+        steps = self.getInputFromPort('steps')
+        rng = self.getInputFromPort('range')
+        self.run_teem('echo "0 1"',
+                      '| unu reshape -s 1 2',
+                      '| unu resample -s = %d -k tent -c node' % steps,
+                      '| unu save -f text -o %s' % ramp.name)
+        tf_file = file(tf_vals.name, 'w')
+        tf = self.getInputFromPort('transfer_function')
+        for (scalar, op, (r, g, b)) in tf._pts:
+            tf_file.write('%f %f %f %f %f\n' % (scalar, r, g, b, op))
+#             tf_file.write('%f %f\n' % (scalar, op))
+        tf_file.close()
+        self.run_teem('cat %s' % tf_vals.name,
+                      '| unu reshape -s 5 %d' % len(tf._pts),
+                      '| unu imap -i %s -r -m -' % ramp.name,
+                      '| unu reshape -s 4 %d' % steps,
+                      '| unu axinfo -a 0 -l "RGBA"',
+                      '| unu axinfo -a 1 -l "gage(scalar:v)" -mm %f %f -o %s' % (rng[0],
+                                                                                 rng[1],
+                                                                                 output.name))
+        self.setResult('nrrd', output)
+
+##############################################################################
+
+class Miter(Teem):
+
+    _input_ports = [
+        # Input data
+        ('input_file', FileType),
+        ('transfer_function', FileType),
+        # Camera
+        ('from_point', Vec3Type),
+        ('at_point', Vec3Type),
+        ('up_vec', Vec3Type),
+        ('right_handed', []),
+        ('relative_to_at_point', []),
+        ('near_dist', FloatType),
+        ('far_dist', FloatType),
+        ('image_plane_dist', FloatType),
+        ('urange', FloatType * 2),
+        ('vrange', FloatType * 2),
+        ('image_size', IntegerType * 2),
+        # Lighting
+        ('light_pos', Vec3Type),
+        ('ambient_light', FloatType * 3),
+        ('phong_components', FloatType * 3),
+        ('shininess', FloatType),
+        ('value_kernel', StringType),
+        ('d_kernel', StringType),
+        ('dd_kernel', StringType),
+        ('step_size', FloatType),
+        ('ref_step_size', FloatType),
+        ('thread_count', IntegerType),
+        ('opacity_termination', FloatType),
+        ]
+
+    _output_ports = [('output_file', FileType)]
+    
+    def compute(self):
+        cmdline = ['miter']
+        self.checkInputPort('input_file')
+        self.checkInputPort('transfer_function')
+        cmdline += self.opt_command_line_file('-i', 'input_file')
+        f = self.interpreter.filePool.create_file(suffix='.nrrd')
+        cmdline += ['-o', f.name]
+        cmdline += self.opt_command_line_vec('-fr', 'from_point')
+        cmdline += self.opt_command_line_vec('-at', 'at_point')
+        cmdline += self.opt_command_line_vec('-up', 'up_vec')
+        cmdline += self.opt_command_line_noopt('-rh', 'right_handed')
+        cmdline += self.opt_command_line_noopt('-ar', 'relative_to_at_point')
+        cmdline += self.opt_command_line_val('-dn', 'near_dist')
+        cmdline += self.opt_command_line_val('-di', 'image_plane_dist')
+        cmdline += self.opt_command_line_val('-df', 'far_dist')
+        cmdline += self.opt_command_line_vec('-ur', 'urange')
+        cmdline += self.opt_command_line_vec('-vr', 'vrange')
+        cmdline += self.opt_command_line_vec('-is', 'image_size')
+        cmdline += self.opt_command_line_vec('-ld', 'light_pos')
+        cmdline += self.opt_command_line_vec('-am', 'ambient_light')
+        cmdline += self.opt_command_line_vec('-ads', 'phong_components')
+        cmdline += self.opt_command_line_val('-sp', 'shininess')
+        cmdline += self.opt_command_line_val('-k00', 'value_kernel')
+        cmdline += self.opt_command_line_val('-k11', 'd_kernel')
+        cmdline += self.opt_command_line_val('-k22', 'dd_kernel')
+        cmdline += self.opt_command_line_val('-step', 'step_size')
+        cmdline += self.opt_command_line_val('-ref', 'ref_step_size')
+        cmdline += self.opt_command_line_val('-nt', 'thread_count')
+        cmdline += self.opt_command_line_val('-n1', 'opacity_termination')
+        cmdline += self.opt_command_line_file('-txf', 'transfer_function')
+        self.setResult('output_file', f) 
+        self.run_teem(*cmdline)
+        
+###############################################################################
+
+class OverRGB(Teem):
+
+    _input_ports = [
+        ('input_file', FileType),
+        ('contrast', FloatType),
+        ('component_fixed_point', FloatType),
+        ('gamma', FloatType),
+        ('background', Vec3Type),
+        ('background_image', FileType),]
+
+    _output_ports = [
+        ('output_image', FileType),
+        ]
+
+    def compute(self):
+        cmdline = ['overrgb']
+        self.checkInputPort('input_file')
+        cmdline += self.opt_command_line_file('-i', 'input_file')
+        f = self.interpreter.filePool.create_file(suffix='.png')
+        cmdline += ['-o', f.name]
+        self.setResult('output_image', f)
+        cmdline += self.opt_command_line_val('-c', 'contrast')
+        cmdline += self.opt_command_line_val('-cfp', 'component_fixed_point')
+        cmdline += self.opt_command_line_val('-g', 'gamma')
+        cmdline += self.opt_command_line_vec('-b', 'background')
+        cmdline += self.opt_command_line_file('-bi', 'background_image')
+        self.run_teem(*cmdline)
+        
+###############################################################################
+
+_modules = [Teem, Emap, Soid, Miter, OverRGB,
+            OffToEps,
+            EpsToPpm,
+            Unu,
+            UnuMinmax,
+            UnuSave,
+            UnuSwap,
+            UnuProject,
+            UnuReshape,
+            UnuResample,
+            UnuJoin,
+            UnuQuantize,
+            Unu1op,
+            Unu2op,
+            Unu3op,
+            UnuSlice,
+            Teem_TT,
+            Tend_norm,
+            Tend_glyph]
+
+##############################################################################
+
+def package_dependencies():
+    import core.packagemanager
+    manager = core.packagemanager.get_package_manager()
+    if manager.has_package('edu.utah.sci.vistrails.vtk'):
+        return ['edu.utah.sci.vistrails.vtk']
+    else:
+        return []
+
+###############################################################################
+
+def initialize(path=None, limnTestPath=None, tenTestPath=None,
+               *args, **keywords):
+    global _teemPath
+    if not path:
+        print "path not specified or incorrect: Will assume teem is on path"
+        _teemPath = ""
+    else:
+        print "will use teem from ", path
+        _teemPath = path + '/'
+
+    global _teemLimnTestPath
+    if not limnTestPath:
+        print "limnTestPath not specified or incorrect: Will not install",
+        print "limnTest modules"
+        _teemLimnTestPath = ""
+    else:
+        print "will use limnTest tools from ", limnTestPath
+        _teemLimnTestPath = limnTestPath + '/'
+
+    global _teemTenTestPath
+    if not tenTestPath:
+        print "tenTestPath not specified or incorrect: Will not install",
+        print "tenTestPath modules"
+        _teemTenTestPath = ""
+    else:
+        print "will use tenTest tools from ", tenTestPath
+        _teemTenTestPath = tenTestPath + '/'
+
+    reg = core.modules.module_registry.registry
+
+    # Register the TF widget interaction modules if they're available
+    if reg.has_module('edu.utah.sci.vistrails.vtk',
+                      'TransferFunction'):
+        # Update the auto-add _modules list
+        _modules.append(TeemScaledTransferFunction)
+        TF = reg.get_descriptor_by_name('edu.utah.sci.vistrails.vtk',
+                                        'TransferFunction').module
+        # Update the input ports for TeemScaledTransferFunction now that we
+        # know TF is present
+        TeemScaledTransferFunction._input_ports.append(('transfer_function', [(TF,
+                                                                               "the transfer function")]))
diff --git a/contrib/edu_utah_sci_cscheid_teem/examples.vt b/contrib/edu_utah_sci_cscheid_teem/examples.vt
new file mode 100644
index 0000000..a79507f
Binary files /dev/null and b/contrib/edu_utah_sci_cscheid_teem/examples.vt differ
diff --git a/contrib/edu_utah_sci_eranders_proteindatabank/PDB.py b/contrib/edu_utah_sci_eranders_proteindatabank/PDB.py
new file mode 100644
index 0000000..39e4e92
--- /dev/null
+++ b/contrib/edu_utah_sci_eranders_proteindatabank/PDB.py
@@ -0,0 +1,144 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+class ProteinDataBank(Module):
+    pass
+
+class Protein(ProteinDataBank):
+
+    def __init__(self):
+        ProteinDataBank.__init__(self)
+        self.atoms = {}
+        self.sequence = {}
+        self.hatoms = {}
+        self.author = ''
+        self.title = ''
+        
+    def compute(self):
+        pass
+
+    def getAtomOfType(self, type):
+        if self.atoms.has_key(type):
+            return self.atoms[type]
+        else:
+            return 0
+
+    def getHetAtomOfType(self, type):
+        if self.hatoms.has_key(type):
+            return self.hatoms[type]
+        else:
+            return 0
+
+    def getSequence(self, seqID):
+        if self.sequence.has_key(seqID):
+            return self.sequence[seqID].__str__()
+        else:
+            k = self.sequence.keys().__str__()
+            str =    'Invalid Sequence ID ' + k
+
+class PDBParser(ProteinDataBank):
+
+    ############################################################################
+    # line parsers
+
+    def is_continuation(self, line):
+        try:
+            int(line[0])
+            return True
+        except:
+            return False
+
+    def parse_ATOM(self, line, protein):
+        type = line[-1]
+        if protein.atoms.has_key(type):
+            protein.atoms[type] = protein.atoms[type] + 1
+        else:
+            protein.atoms[type] = 1
+
+    def parse_SEQRES(self, line, protein):
+        els = len(line)
+        seqID = line[2]
+        if not protein.sequence.has_key(seqID):
+            protein.sequence[seqID] = []
+        
+        s = protein.sequence[seqID]
+        
+        i = 4
+        while i < len(line):
+            s.append(line[i])
+            i = i + 1
+
+        protein.sequence[seqID] = s
+
+    def parse_HETATM(self, line, protein):
+        type = line[-1]
+        if protein.hatoms.has_key(type):
+            protein.hatoms[type] = protein.hatoms[type] + 1
+        else:
+            protein.hatoms[type] = 1
+
+    def parse_AUTHOR(self, line, protein):
+        if self.is_continuation(line):
+            protein.author += ' ' + ' '.join(line[1:])
+        else:
+            protein.author = ' '.join(line)
+
+    def parse_TITLE(self, line, protein):
+        if self.is_continuation(line):
+            protein.title += ' ' + ' '.join(line[1:])
+        else:
+            protein.title = ' '.join(line)
+
+    def parse_HEADER(self, line, protein):
+        protein.pdb_name = line[-1]
+        protein.date = line[-2]
+        protein.short_title = ' '.join(line[:-2])
+
+    ############################################################################
+
+    def compute(self):
+        f = self.getInputFromPort("File")
+
+        p = Protein()
+
+        for l in file(f.name):
+            l = l.strip()
+            toks = l.split()
+            if hasattr(self, 'parse_' + toks[0]):
+                getattr(self, 'parse_' + toks[0])(toks[1:], p)
+
+        self.setResult("Protein", p)
+
+class GetAtoms(ProteinDataBank):
+    def compute(self):
+        prot = self.getInputFromPort("Protein")
+        aType = self.getInputFromPort("Atom Type")
+        self.setResult("NumAtoms", prot.getAtomOfType(aType))
+
+class GetHetAtoms(ProteinDataBank):
+    def compute(self):
+        prot = self.getInputFromPort("Protein")
+        aType = self.getInputFromPort("Atom Type")
+        self.setResult("NumAtoms", prot.getHetAtomOfType(aType))
+
+class GetSequence(ProteinDataBank):
+    def compute(self):
+        prot = self.getInputFromPort("Protein")
+        sID = self.getInputFromPort("SequenceID")
+        self.setResult("Sequence", prot.getSequence(sID))
+
+class GetTitle(ProteinDataBank):
+    def compute(self):
+        prot = self.getInputFromPort("Protein")
+        self.setResult("Title", prot.title)
+
+class GetAuthor(ProteinDataBank):
+    def compute(self):
+        prot = self.getInputFromPort("Protein")
+        self.setResult("Title", prot.author)
+
+class GetPDBName(ProteinDataBank):
+    def compute(self):
+        prot = self.getInputFromPort("Protein")
+        self.setResult("name", prot.pdb_name)
diff --git a/contrib/edu_utah_sci_eranders_proteindatabank/__init__.py b/contrib/edu_utah_sci_eranders_proteindatabank/__init__.py
new file mode 100644
index 0000000..7c18d70
--- /dev/null
+++ b/contrib/edu_utah_sci_eranders_proteindatabank/__init__.py
@@ -0,0 +1,68 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+from PDB import *
+
+identifier = 'edu.utah.sci.eranders.proteindatabank'
+version = '0.1.0'
+name = 'Protein Data Bank'
+
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry
+    basic = core.modules.basic_modules
+
+    reg.add_module(ProteinDataBank, abstract=True)
+    reg.add_module(Protein, abstract=True)
+
+    reg.add_module(PDBParser)
+    reg.add_input_port(PDBParser, "File", (basic.File, 'File'))
+    reg.add_output_port(PDBParser, "Protein", (Protein, 'Protein'))
+
+    reg.add_module(GetAtoms)
+    reg.add_input_port(GetAtoms, "Protein", (Protein, 'Protein'))
+    reg.add_input_port(GetAtoms, "Atom Type", (basic.String, 'AtomType'))
+    reg.add_output_port(GetAtoms, "NumAtoms", (basic.Integer, 'NumAtoms'))
+
+    reg.add_module(GetHetAtoms)
+    reg.add_input_port(GetHetAtoms, "Protein", (Protein, 'Protein'))
+    reg.add_input_port(GetHetAtoms, "Atom Type", (basic.String, 'AtomType'))
+    reg.add_output_port(GetHetAtoms, "NumAtoms", (basic.Integer, 'NumAtoms'))
+
+    reg.add_module(GetSequence)
+    reg.add_input_port(GetSequence, "Protein", (Protein, 'Protein'))
+    reg.add_input_port(GetSequence, "SequenceID", (basic.String, 'SequenceID'))
+    reg.add_output_port(GetSequence, "Sequence", (basic.String, 'Sequence'))
+
+    reg.add_module(GetTitle)
+    reg.add_input_port(GetTitle, "Protein", (Protein, 'Protein'))
+    reg.add_output_port(GetTitle, "Title", (basic.String, 'Title'))
+
+    reg.add_module(GetAuthor)
+    reg.add_input_port(GetAuthor, "Protein", (Protein, 'Protein'))
+    reg.add_output_port(GetAuthor, "Author", (basic.String, 'Author'))
+
+    reg.add_module(GetPDBName)
+    reg.add_input_port(GetPDBName, "Protein", (Protein, 'Protein'))
+    reg.add_output_port(GetPDBName, "Name", (basic.String, 'Name'))
diff --git a/contrib/edu_utah_sci_vgc_afront/MANIFEST b/contrib/edu_utah_sci_vgc_afront/MANIFEST
new file mode 100644
index 0000000..61b0205
--- /dev/null
+++ b/contrib/edu_utah_sci_vgc_afront/MANIFEST
@@ -0,0 +1 @@
+F __init__.py
diff --git a/contrib/edu_utah_sci_vgc_afront/__init__.py b/contrib/edu_utah_sci_vgc_afront/__init__.py
new file mode 100644
index 0000000..7a71995
--- /dev/null
+++ b/contrib/edu_utah_sci_vgc_afront/__init__.py
@@ -0,0 +1,143 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""The package afront defines three modules, Afront, AfrontIso and
+MeshQualityHistogram. These run the meshing code described in
+
+Schreiner et al, Vis 2006
+Schreiner et al, Eurographics 2006
+Scheidegger et al, SGP 2005
+
+"""
+
+from core.configuration import ConfigurationObject
+from core.modules.vistrails_module import Module, ModuleError
+from core.system import list2cmdline
+import core.bundles
+import core.modules.basic_modules
+import core.modules.module_registry
+import core.requirements
+import os
+
+configuration = ConfigurationObject(path=(None, str),
+                                    debug=False)
+version = '0.1.0'
+identifier = 'edu.utah.sci.vgc.afront'
+name = 'Afront'
+
+################################################################################
+
+class AfrontRun(object):
+
+    def run(self, args):
+        cmd = ['afront', '-nogui'] + args
+        cmdline = list2cmdline(cmd)
+        print cmdline
+        os.system(cmdline)
+#         if result != 0:
+#             raise ModuleError(self, "Execution failed")
+
+
+class Afront(Module, AfrontRun):
+        
+    def compute(self):
+        o = self.interpreter.filePool.create_file(suffix='.m')
+        args = []
+        if not self.hasInputFromPort("file"):
+            raise ModuleError(self, "Needs input file")
+        args.append(self.getInputFromPort("file").name)
+        if self.hasInputFromPort("rho"):
+            args.append("-rho")
+            args.append(str(self.getInputFromPort("rho")))
+        if self.hasInputFromPort("eta"):
+            args.append("-reduction")
+            args.append(str(self.getInputFromPort("eta")))
+        args.append("-outname")
+        args.append(o.name)
+        args.append("-tri")
+        self.run(args)
+        self.setResult("output", o)
+
+
+class MeshQualityHistogram(Module, AfrontRun):
+
+    def compute(self):
+        o = self.interpreter.filePool.create_file(suffix='.csv')
+        args = []
+        self.checkInputPort("file")
+        args.append(self.getInputFromPort("file").name)
+        args.append('-histname')
+        args.append(o.name)
+        args.append('-histogram')
+        self.run(args)
+        self.setResult("output", o)
+
+class AfrontIso(Afront):
+
+    def compute(self):
+        o = self.interpreter.filePool.create_file(suffix='.m')
+        args = []
+        if not self.hasInputFromPort("file"):
+            raise ModuleError(self, "Needs input file")
+        args.append(self.getInputFromPort("file").name)
+        if self.hasInputFromPort("rho"):
+            args.append("-rho")
+            args.append(str(self.getInputFromPort("rho")))
+        if self.hasInputFromPort("eta"):
+            args.append("-eta")
+            args.append(str(self.getInputFromPort("eta")))
+        self.checkInputPort("iso")
+        args.append("-outname")
+        args.append(o.name)
+        args.append("-tri")
+        args.append(str(self.getInputFromPort("iso")))
+        self.run(args)
+        self.setResult("output", o)
+        
+
+################################################################################
+
+def initialize():
+
+    print "Afront VisTrails package"
+    print "------------------------"
+    print "Testing afront presence..."
+
+#     if (not core.requirements.executable_file_exists('afront') and
+#         not core.bundles.install({'linux-ubuntu': 'afront'})):
+#         raise core.requirements.MissingRequirement("Afront")
+
+    print "Ok, found afront"
+    __version__ = 0.1
+    
+    reg = core.modules.module_registry
+    reg.add_module(Afront)
+    reg.add_input_port(Afront, "rho", (core.modules.basic_modules.Float, 'rho'))
+    reg.add_input_port(Afront, "eta", (core.modules.basic_modules.Float, 'eta'))
+    reg.add_input_port(Afront, "file", (core.modules.basic_modules.File, 'the file to process'))
+    reg.add_output_port(Afront, "output", (core.modules.basic_modules.File, 'the result'))
+
+    reg.add_module(MeshQualityHistogram)
+    reg.add_input_port(MeshQualityHistogram, "file", core.modules.basic_modules.File)
+    reg.add_output_port(MeshQualityHistogram, "output", core.modules.basic_modules.File)
+    
+    reg.add_module(AfrontIso)
+    reg.add_input_port(AfrontIso, "iso", (core.modules.basic_modules.Float, 'iso'))
diff --git a/contrib/itk/FeatureExtractionFilters.py b/contrib/itk/FeatureExtractionFilters.py
new file mode 100644
index 0000000..6cb8cc7
--- /dev/null
+++ b/contrib/itk/FeatureExtractionFilters.py
@@ -0,0 +1,208 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import *
+from Image import Image
+
+class GradientMagnitudeRecursiveGaussianImageFilter(Module):
+    my_namespace = "Filter|Feature"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        sigma_ = self.getInputFromPort("Sigma")
+
+        self.filter_ = itk.GradientMagnitudeRecursiveGaussianImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetSigma(sigma_)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Gradient Magnitude Recursive Gaussian Image Filter", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Sigma", (basic.Float, 'Sigma'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+#TODO this filter doesn't produce any results
+class DanielssonDistanceMapImageFilter(Module):
+    my_namespace = 'Filter|Feature'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        squared_distance = self.getInputFromPort("Squared Distance")
+
+        image_spaceing = self.getInputFromPort("Image Spaceing")
+
+        self.filter_ = itk.DanielssonDistanceMapImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetSquaredDistance(squared_distance)
+        self.filter_.SetUseImageSpacing(image_spaceing)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="DanielssonDistance Map Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Squared Distance", (basic.Float, 'Squared Distance'))
+        reg.add_input_port(cls, "Image Spaceing", (basic.Float, 'Image Spaceing'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class SobelEdgeDetectionImageFilter(Module):
+    my_namespace = 'Filter|Feature'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.SobelEdgeDetectionImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Sobel Edge Detection Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
diff --git a/contrib/itk/GradientFilters.py b/contrib/itk/GradientFilters.py
new file mode 100644
index 0000000..931d4e5
--- /dev/null
+++ b/contrib/itk/GradientFilters.py
@@ -0,0 +1,84 @@
+#############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import *
+from Image import Image
+
+class GradientMagnitudeImageFilter(Module):
+    my_namespace = 'Filter|Gradient'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.GradientMagnitudeImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Gradient Magnitude Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
diff --git a/contrib/itk/ITK.py b/contrib/itk/ITK.py
new file mode 100644
index 0000000..2834326
--- /dev/null
+++ b/contrib/itk/ITK.py
@@ -0,0 +1,166 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+import itk
+
+class ITK(object):
+    my_namespace="itk"
+
+class PixelType(Module, ITK):
+    my_namespace = "disregard"
+
+    def compute(self):
+        pass
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Pixel Type", namespace=cls.my_namespace)
+
+class Filter(Module, ITK):
+    my_namespace="disregard"
+
+    def compute(self):
+        pass
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Filter", namespace=cls.my_namespace)
+
+
+class Index2D(Module, ITK):
+    my_namespace = "index"
+
+    def compute(self):
+        self.ind_ = itk.Index[2]()
+        self.x_ = self.getInputFromPort("X Index")
+        self.y_ = self.getInputFromPort("Y Index")
+
+        self.ind_.SetElement(0,self.x_)
+        self.ind_.SetElement(1,self.y_)
+
+        self.setResult("Index", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Index2D", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "X Index", (basic.Integer, 'X Index'))
+        reg.add_input_port(cls, "Y Index", (basic.Integer, 'Y Index'))
+
+        reg.add_output_port(cls, "Index", (Index2D, 'Index'))
+
+class Index3D(Module, ITK):
+    my_namespace = "index"
+    def compute(self):
+        self.ind_ = itk.Index[3]()
+        self.x_ = self.getInputFromPort("X Index")
+        self.y_ = self.getInputFromPort("Y Index")
+        self.z_ = self.getInputFromPort("Z Index")
+
+        self.ind_.SetElement(0,self.x_)
+        self.ind_.SetElement(1,self.y_)
+        self.ind_.SetElement(2,self.z_)
+
+        self.setResult("Index", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Index3D", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "X Index", (basic.Integer, 'X Index'))
+        reg.add_input_port(cls, "Y Index", (basic.Integer, 'Y Index'))
+        reg.add_input_port(cls, "Z Index", (basic.Integer, 'Z Index'))
+
+        reg.add_output_port(cls, "Index", (Index3D, 'Index'))
+
+class Size(Module, ITK):
+    my_namespace = "size"
+    def compute(self):
+        dim = self.getInputFromPort("Dimension")
+        self.size_ = itk.Size[dim]()
+        self.x = self.getInputFromPort("Element 1")
+        self.y = self.getInputFromPort("Element 2")
+        if dim > 2:
+            self.z = self.getInputFromPort("Element 3")
+
+        self.size_.SetElement(0,self.x)
+        self.size_.SetElement(1,self.y)
+
+        if dim > 2:
+            self.size_.SetElement(2,self.z)
+
+        self.setResult("Size",self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Size", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+        reg.add_input_port(cls, "Element 1", (basic.Integer, 'Element 1'))
+        reg.add_input_port(cls, "Element 2", (basic.Integer, 'Element 2'))
+        reg.add_input_port(cls, "Element 3", (basic.Integer, 'Element 3'))
+
+        reg.add_output_port(cls, "Size", (Size, 'Size'))
+
+class Region(Module, ITK):
+    my_namespace = "region"
+    def compute(self):
+        dim = self.getInputFromPort("Dimension")
+        self.region_ = itk.ImageRegion[dim]()
+        self.region_.SetSize(self.getInputFromPort("Size").size_)
+        if dim > 2:
+            self.region_.SetIndex(self.getInputFromPort("Input 3D Index").ind_)
+        else:
+            self.region_.SetIndex(self.getInputFromPort("Input 2D Index").ind_)
+
+        self.setResult("Region", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Region", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+        reg.add_input_port(cls, "Size", (Size, 'Size'))
+        reg.add_input_port(cls, "Input 2D Index", (Index2D, 'Input 2D Index'))
+        reg.add_input_port(cls, "Input 3D Index", (Index3D, 'Input 3D Index'), True)
+
+        reg.add_output_port(cls, "Region", (Region, 'Region'))
+
+class Kernel(Module, ITK):
+    my_namespace = "kernel"
+    def compute(self):
+        dim = self.getInputFromPort("Dimension")
+        radius = self.getInputFromPort("Radius")
+        self.kernel = itk.strel(dim,radius)
+
+        self.setResult("Kernel", self.kernel)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Kernel", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+        reg.add_input_port(cls, "Radius", (basic.Integer, 'Radius'))
+
+        reg.add_output_port(cls, "Kernel", (Kernel, 'Kernel'))
diff --git a/contrib/itk/Image.py b/contrib/itk/Image.py
new file mode 100644
index 0000000..c4facc4
--- /dev/null
+++ b/contrib/itk/Image.py
@@ -0,0 +1,64 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from ITK import *
+from PixelType import *
+
+class Image(Module, ITK):
+    my_namespace="disregard"
+
+    def getPixelType(self):
+        return self._type
+
+    def getDim(self):
+        return self.dim
+
+    def getImg(self):
+        return self.inIm
+
+    def setImg(self, img):
+        self.inIm = img
+
+    def setDim(self, dim):
+        self.dim = dim
+
+    def setPixelType(self, pt):
+        self._type = pt
+    
+    def compute(self):
+        self.inIm = self.getInputFromPort("Image")
+        self.dim = self.getInputFromPort("Dimension")
+        self._type = self.getInputFromPort("Pixel Type")
+
+        self.setResult("Output Image", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Image", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Pixel Type", (PixelType, 'Pixel Type'))
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+        reg.add_input_port(cls, "Image", (Image, 'Image'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
diff --git a/contrib/itk/ImageReader.py b/contrib/itk/ImageReader.py
new file mode 100644
index 0000000..c186ff7
--- /dev/null
+++ b/contrib/itk/ImageReader.py
@@ -0,0 +1,169 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+
+from ITK import *
+from Image import Image
+
+class ImageReader(Module):
+    my_namespace = "ImageReader"
+    def compute(self):
+        dim = self.getInputFromPort("Dimension")
+        outPixelType = self.getInputFromPort("Pixel Type")
+        fn = self.getInputFromPort("Filename")
+        self.reader = itk.ImageFileReader[itk.Image[outPixelType._type, dim]].New()
+        self.reader.SetFileName(fn)
+        self.reader.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.reader.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        self.setResult("Image", outIm)
+        self.setResult("Reader", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="ImageReader", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Filename", (basic.String, 'Filename'))
+        reg.add_input_port(cls, "Pixel Type", (PixelType, 'Pixel Type'))
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+
+        reg.add_output_port(cls, "Image", (Image, 'Image'))
+        reg.add_output_port(cls, "Reader", (ImageReader, 'Reader'))
+
+class ImageToFile(Module):
+    my_namespace = "ImageReader"
+    def compute(self):
+        im = self.getInputFromPort("Image")
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")._type
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        suf = self.getInputFromPort("Suffix")
+        f = self.createOutputFile(suf)
+        writeType = itk.Image[inPixelType._type, dim]
+        writer = itk.ImageFileWriter[writeType].New(im.getImg(), FileName=f.name)
+        writer.Update()
+        self.setResult("File", f)
+
+    def createOutputFile(self, s):
+        return self.interpreter.filePool.create_file(suffix=s)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="ImageToFile", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Suffix", (basic.String, 'Suffix'))
+        reg.add_input_port(cls, "Pixel Type", (PixelType, 'Pixel Type'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Image", (Image, 'Image'))
+
+        reg.add_output_port(cls, "File", (basic.File, 'File'))
+
+class GDCMReader(Module):
+    my_namespace = "ImageReader"
+    def compute(self):
+        dir = self.getInputFromPort("Directory")
+        dim = self.getInputFromPort("Dimension")
+        self.dicomNames_ = itk.GDCMSeriesFileNames.New()
+
+        self.dicomNames_.SetDirectory(dir)
+        self.dicomNames_.SetUseSeriesDetails(True)
+        self.dicomNames_.SetRecursive(True)
+        self.dicomNames_.LoadSequencesOn()
+
+        self.iType_ = itk.Image[itk.US,dim]
+        self.reader_ = itk.ImageSeriesReader[self.iType_].New()
+        self.reader_.SetFileNames(self.dicomNames_.GetInputFileNames())
+        self.io_ = itk.GDCMImageIO.New()
+        self.reader_.SetImageIO(self.io_.GetPointer())
+        self.reader_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.reader_.GetOutput())
+        outIm.setPixelType(itk.US)
+        outIm.setDim(dim)
+
+        self.setResult("Image Series", outIm)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="GDCMReader", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Directory", (basic.String, 'Directory'))
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+        reg.add_output_port(cls, "Image Series", (Image, 'Image Series'))
+
+class DICOMReader(Module):
+    my_namespace = "ImageReader"
+    def compute(self):
+        dir = self.getInputFromPort("Directory")
+        dim = self.getInputFromPort("Dimension")
+        self.dicomNames_ = itk.DICOMSeriesFileNames.New()
+
+        self.dicomNames_.SetFileNameSortingOrderToSortByImagePositionPatient()
+        self.dicomNames_.SetDirectory(dir)
+
+        self.iType_ = itk.Image[itk.US,dim]
+        self.reader_ = itk.ImageSeriesReader[self.iType_].New()
+        self.reader_.SetFileNames(self.dicomNames_.GetFileNames(False))
+        self.reader_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.reader_.GetOutput())
+        outIm.setPixelType(itk.US)
+        outIm.setDim(dim)
+
+        self.setResult("Image Series", outIm)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="DICOMReader", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Directory", (basic.String, 'Directory'))
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'))
+        reg.add_output_port(cls, "Image Series", (Image, 'Image Series'))
+
+class ITKImageToVTKData(Module):
+    my_namespace = "ImageReader"
+    def compute(self):
+        dim = self.getInputFromPort("Dimension")
+        pType = self.getInputFromPort("Input PixelType")
+        iType = itk.Image[itk.pType,dim]
+        self.vtkExport_ = itk.VTKImageExport[iType].New()
+        im = self.getInputFromPort("Input Image")
+        self.vtkExport_.SetInput(im)
+        self.vtkExport_.Update()
+        self.setResult("VTK Output", self.vtkExport_.GetOutput())
+
+        #TODO add register method
diff --git a/contrib/itk/IntensityFilters.py b/contrib/itk/IntensityFilters.py
new file mode 100644
index 0000000..987dfa9
--- /dev/null
+++ b/contrib/itk/IntensityFilters.py
@@ -0,0 +1,343 @@
+#############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import *
+from Image import Image
+
+class RescaleIntensityImageFilter(Module):
+    my_namespace = "Filter|Intensity"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        minimum = self.getInputFromPort("Minimum")
+        maximum = self.getInputFromPort("Maximum")
+
+        self.filter_ = itk.RescaleIntensityImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetOutputMaximum(maximum)
+        self.filter_.SetOutputMinimum(minimum)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Rescale Intensity Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Minimum", (basic.Integer, 'Minimum'))
+        reg.add_input_port(cls, "Maximum", (basic.Integer, 'Maximum'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class SigmoidImageFilter(Module):
+    my_namespace = "Filter|Intensity"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        #default values are those that are recommended
+        if self.hasInputFromPort("Minimum"):
+            min = self.getInputFromPort("Minimum")
+        else:
+            min = 10
+
+        if self.hasInputFromPort("Maximum"):
+            max = self.getInputFromPort("Maximum")
+        else:
+            max = 240
+
+        if self.hasInputFromPort("Alpha"):
+            alpha = self.getInputFromPort("Alpha")
+        else:
+            alpha = 10
+
+        if self.hasInputFromPort("Beta"):
+            beta = self.getInputFromPort("Beta")
+        else:
+            beta = 170
+
+        self.filter_ = itk.SigmoidImageFilter[inImgType,outImgType].New(im.getImg())
+        self.filter_.SetOutputMinimum(min)
+        self.filter_.SetOutputMaximum(max)
+        self.filter_.SetAlpha(alpha)
+        self.filter_.SetBeta(beta)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+        
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Sigmoid Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'), True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Minimum", (basic.Integer, 'Minimum'), True)
+        reg.add_input_port(cls, "Maximum", (basic.Integer, 'Maximum'), True)
+        reg.add_input_port(cls, "Alpha", (basic.Float, 'Alpha'), True)
+        reg.add_input_port(cls, "Beta", (basic.Float, 'Beta'), True)
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Output Filter'),True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class ThresholdImageFilter(Module):
+    my_namespace = "Filter|Intensity"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #setup filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        up = self.getInputFromPort("Upper Value")
+        lo = self.getInputFromPort("Lower Value")
+
+        self.filter_ = itk.ThresholdImageFilter[inImgType].New(im.getImg())
+
+        self.filter_.SetUpper(up)
+        self.filter_.SetLower(lo)
+#       self.filter_.ThresholdAbove(up)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(inPixelType)
+        outIm.setDim(dim)
+
+        self.setResult("Output Image", outIm)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Threshold Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Upper Value", (basic.Integer, 'Upper Value'))
+        reg.add_input_port(cls, "Lower Value", (basic.Integer, 'Lower Value'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+
+class ShiftScaleImageFilter(Module):
+    my_namespace = "Filter|Intensity"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        shift_value = self.getInputFromPort("Shift Value")
+
+        scale_value = self.getInputFromPort("Scale Value")
+
+        self.filter_ = itk.ShiftScaleImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetShift(shift_value)
+        self.filter_.SetScale(scale_value)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Shift Scale Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Shift Value", (basic.Float, 'Shift Value'))
+        reg.add_input_port(cls, "Scale Value", (basic.Integer, 'Scale Value'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class NormalizeImageFilter(Module):
+    my_namespace = 'Filter|Intensity'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.NormalizeImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Normalize Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
diff --git a/contrib/itk/NeighborhoodFilters.py b/contrib/itk/NeighborhoodFilters.py
new file mode 100644
index 0000000..0dbcaf2
--- /dev/null
+++ b/contrib/itk/NeighborhoodFilters.py
@@ -0,0 +1,210 @@
+#############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import *
+from Image import Image
+
+class MeanImageFilter(Module):
+    my_namespace = 'Filter|Neighborhood'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.MeanImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Mean Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+
+class MedianImageFilter(Module):
+    my_namespace = 'Filter|Neighborhood'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.MedianImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Median Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+#TODO does this filter even modify the image?
+class BinaryErodeImageFilter(Module):
+    my_namespace = 'Filter|Neighborhood'
+
+    def compute(self):
+        print "comput"
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+            
+        kernel = self.getInputFromPort("Kernel")
+        
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        erode_value = self.getInputFromPort("Erode Value")
+
+        self.filter_ = itk.BinaryErodeImageFilter[inImgType, outImgType, kernel].New(im.getImg())
+        self.filter_.SetKernel(kernel)
+        self.filter_.SetErodeValue(erode_value)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Binary Erode Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Kernel", (Kernel, 'Kernel'))
+
+        reg.add_input_port(cls, "Erode Value", (basic.Integer, 'Erode Value'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
diff --git a/contrib/itk/PixelType.py b/contrib/itk/PixelType.py
new file mode 100644
index 0000000..2f2beb4
--- /dev/null
+++ b/contrib/itk/PixelType.py
@@ -0,0 +1,71 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import PixelType
+  
+class PixelTypeFloat(Module):
+    my_namespace = "pixeltype"
+    def compute(self):
+        self._type = itk.F
+        self.setResult("Pixel Type", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Pixel Type Float", namespace=cls.my_namespace)
+        reg.add_output_port(cls, "Pixel Type", (PixelType, 'Pixel Type'))
+
+class PixelTypeUnsignedChar(Module):
+    my_namespace = "pixeltype"
+    def compute(self):
+        self._type = itk.UC
+        self.setResult("Pixel Type", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Pixel Type Unsigned Char", namespace=cls.my_namespace)
+        reg.add_output_port(cls, "Pixel Type", (PixelType, 'Pixel Type'))
+
+class PixelTypeUnsignedShort(Module):
+    my_namespace = "pixeltype"
+    def compute(self):
+        self._type = itk.US
+        self.setResult("Pixel Type", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Pixel Type Unsigned Short", namespace=cls.my_namespace)
+        reg.add_output_port(cls, "Pixel Type", (PixelType, 'Pixel Type'))
+
+class PixelTypeRGB(Module):
+    my_namespace = "pixeltype"
+    def compute(self):
+        self._type = itk.RGBPixel[itk.US]
+        self.setResult("Pixel Type", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Pixel Type RGB", namespace=cls.my_namespace)
+        reg.add_output_port(cls, "Pixel Type", (PixelType, 'Pixel Type'))
diff --git a/contrib/itk/SegmentationFilters.py b/contrib/itk/SegmentationFilters.py
new file mode 100644
index 0000000..77c5ad7
--- /dev/null
+++ b/contrib/itk/SegmentationFilters.py
@@ -0,0 +1,319 @@
+#############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import *
+from Image import Image
+
+class IsolatedWatershedImageFilter(Module):
+    my_namespace="Filter|Segmentation"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.IsolatedWatershedImageFilter[inImgType, outImgType].New(im.getImg())
+
+        if self.hasInputFromPort("Seed1"):
+            self.filter_.SetSeed1(self.getInputFromPort("Seed1").ind_)
+
+        if self.hasInputFromPort("Seed2"):
+            self.filter_.SetSeed2(self.getInputFromPort("Seed2").ind_)
+
+        if self.hasInputFromPort("ReplaceValue1"):
+            self.filter_.SetReplaceValue1(self.getInputFromPort("ReplaceValue1"))
+
+        if self.hasInputFromPort("ReplaceValue2"):
+            self.filter_.SetReplaceValue2(self.getInputFromPort("ReplaceValue2"))
+
+        if self.hasInputFromPort("Threshold"):
+            self.filter_.SetThreshold(self.getInputFromPort("Threshold"))
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+        self.setResult("Filter", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Isolated Watershed Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Seed1", (Index2D, 'Seed 1 Location'))
+
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'), True)
+        reg.add_input_port(cls, "Threshold", (basic.Float, 'Threshold'), True)
+        reg.add_input_port(cls, "Seed2", (Index2D, 'Seed 2 Location'))
+        reg.add_input_port(cls, "ReplaceValue1", (basic.Float, 'Replacement Value 1'), True);
+        reg.add_input_port(cls, "ReplaceValue2", (basic.Float, 'Replacement Value 2'), True);
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'))
+
+class ConnectedThresholdImageFilter(Module):
+    my_namespace="Filter|Segmentation"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        if self.hasInputFromPort("Seed2D"):
+            seed = self.getInputFromPort("Seed2D")
+        else:
+            seed = self.getInputFromPort("Seed3D")
+
+        replace = self.getInputFromPort("Replace Value")
+        t_lower = self.getInputFromPort("Lower Value")
+        t_upper = self.getInputFromPort("Upper Value")
+
+        #setup filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.ConnectedThresholdImageFilter[inImgType,outImgType].New(im.getImg())
+
+        self.filter_.SetSeed(seed.ind_)
+        self.filter_.SetReplaceValue(replace)
+        self.filter_.SetLower(t_lower)
+        self.filter_.SetUpper(t_upper)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Connected Threshold Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'), True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Seed2D", (Index2D, 'Seed Point'))
+        reg.add_input_port(cls, "Seed3D", (Index3D, 'Seed Point'))
+        reg.add_input_port(cls, "Replace Value", (basic.Float, 'Replacement Value'))
+        reg.add_input_port(cls, "Upper Value", (basic.Float, 'Upper Threshold Value'))
+        reg.add_input_port(cls, "Lower Value", (basic.Float, 'Lower Threshold Value'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'))
+
+class ConfidenceConnectedImageFilter(Module):
+    my_namespace="Filter|Segmentation"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        if self.hasInputFromPort("Seed2D"):
+            seed = self.getInputFromPort("Seed2D")
+        else:
+            seed = self.getInputFromPort("Seed3D")
+
+        replace = self.getInputFromPort("Replace Value")
+        multiplier = self.getInputFromPort("Multiplier")
+        iterations = self.getInputFromPort("Iterations")
+        radius = self.getInputFromPort("Neighborhood Radius")
+
+        #setup filter
+        inImgType = itk.Image[inPixelType._type,dim]
+        outImgType = itk.Image[outPixelType._type,dim]
+
+        self.filter_ = itk.ConfidenceConnectedImageFilter[inImgType,outImgType].New(im.getImg())
+
+        self.filter_.SetReplaceValue(replace)
+        self.filter_.SetMultiplier(multiplier)
+        self.filter_.SetNumberOfIterations(iterations)
+        self.filter_.SetInitialNeighborhoodRadius(radius)
+
+        self.filter_.SetSeed(seed.ind_)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Confidence Connected Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'), True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Seed2D", (Index2D, 'Seed Point'))
+        reg.add_input_port(cls, "Seed3D", (Index3D, 'Seed Point'))
+        reg.add_input_port(cls, "Replace Value", (basic.Float, 'Replacement Value'))
+        reg.add_input_port(cls, "Multiplier", (basic.Float, 'Multiplier'))
+        reg.add_input_port(cls, "Iterations", (basic.Float, 'Iterations'))
+        reg.add_input_port(cls, "Neighborhood Radius", (basic.Float, 'Neighborhood Radius'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'))
+
+class IsolatedConnectedImageFilter(Module):
+    my_namespace="Filter|Segmentation"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        seed1 = self.getInputFromPort("Seed1")
+        seed2 = self.getInputFromPort("Seed2")
+
+        replace = self.getInputFromPort("Replace Value")
+        t_lower = self.getInputFromPort("Lower Value")
+        t_upper = self.getInputFromPort("Upper Value")
+
+        inImgType = itk.Image[inPixelType._type,dim]
+        outImgType = itk.Image[outPixelType._type,dim]
+
+        self.filter_ = itk.IsolatedConnectedImageFilter[inImgType,outImgType].New(im.getImg())
+
+        self.filter_.SetReplaceValue(replace)
+        self.filter_.SetLower(t_lower)
+        self.filter_.SetUpperValueLimit(t_upper)
+        self.filter_.SetSeed1(seed1.ind_)
+        self.filter_.SetSeed2(seed2.ind_)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Isolated Connected Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'), True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Seed1", (Index2D, 'Seed Point'))
+        reg.add_input_port(cls, "Seed2", (Index2D, 'Seed Point'))
+        reg.add_input_port(cls, "Replace Value", (basic.Integer, 'Replacement Value'))
+        reg.add_input_port(cls, "Upper Value", (basic.Integer, 'Upper Threshold Value'))
+        reg.add_input_port(cls, "Lower Value", (basic.Integer, 'Lower Threshold Value'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'))
diff --git a/contrib/itk/SelectionFilters.py b/contrib/itk/SelectionFilters.py
new file mode 100644
index 0000000..61b5302
--- /dev/null
+++ b/contrib/itk/SelectionFilters.py
@@ -0,0 +1,231 @@
+#############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+from ITK import *
+from Image import Image
+
+class RegionOfInterestImageFilter(Module):
+    my_namespace="Filter|Selection"
+
+    def setStart(self, start):
+        if start == 2:
+            self.index = self.getInputFromPort("Input 2D Index").ind_
+        else:
+            self.index = self.getInputFromPort("Input 3D Index").ind_
+
+        self.region_.SetIndex(self.index)
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Input Dimension"):
+            dim = self.getInputFromPort("Input Dimension")
+        else:
+            dim = im.getDim()
+
+        if self.hasInputFromPort("Output Dimension"):
+            outDim = self.getInputFromPort("Output Dimension")
+        else:
+            outDim = dim
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, outDim]
+
+        self.filter_ = itk.RegionOfInterestImageFilter[inImgType, outImgType].New()
+
+        #TODO this is not correct, needs fixing
+        if self.hasInputFromPort("Input Region"):
+            self.region_ = self.getInputFromPort("Input Region").region_
+        else:
+            self.region_ = itk.ImageRegion[indim]()
+            self.setStart(indim)
+            self.region_.SetSize(self.getInputFromPort("Region Size").size_)
+
+        self.filter_.SetRegionOfInterest(self.region_)
+        self.filter_.SetInput(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(outDim)
+
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+        self.setResult("Output Dimension", outDim)
+        self.setResult("Filter", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Region of Interest Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Output Dimension", (basic.Integer, 'Dimension'),True)
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Input Region", (Region, 'Input Region'))
+        reg.add_input_port(cls, "Region Size", (Size, 'Region Size'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_output_port(cls, "Output Dimension", (basic.Integer, 'Dimension'),True)
+
+class CastImageFilter(Module):
+    my_namespace="Filter|Selection"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for in dimension
+        if self.hasInputFromPort("Input Dimension"):
+            dim = self.getInputFromPort("Input Dimension")
+        else:
+            dim = im.getDim()
+
+        #check for out dimension
+        if self.hasInputFromPort("Output Dimension"):
+            outDim = self.getInputFromPort("Output Dimension")
+        else:
+            outDim = dim
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, outDim]
+
+        self.filter_ = itk.CastImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(outDim)
+        
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+        self.setResult("Output Dimension", outDim)
+        self.setResult("Filter", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Cast Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Dimension", (basic.Integer, 'Input Dimension'),True)
+        reg.add_input_port(cls, "Output Dimension", (basic.Integer, 'Output Dimension'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'))
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'),True)
+        reg.add_output_port(cls, "Output Dimension", (basic.Integer, 'Output Dimension'),True)
+
+
+class ExtractImageFilter(Module):
+    my_namespace="Filter|Selection"
+    def compute(self):
+        #TODO should this be Input Volume?
+        im = self.getInputFromPort("Input Volume")
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #set outPixelType
+        outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+            
+        #check for out dimension
+        if self.hasInputFromPort("Output Dimension"):
+            outDim = self.getInputFromPort("Output Dimension")
+        else:
+            outDim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, outDim]
+
+        self.filter_ = itk.ExtractImageFilter[inImgType,outImgType].New(im.getImg())
+
+        region = self.getInputFromPort("Extraction Region")
+        self.filter_.SetExtractionRegion(region.region_)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(outDim)
+
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+        self.setResult("Dimension", outDim)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Extract Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Volume", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input Dimension", (basic.Integer, 'Input Dimension'),True)
+        reg.add_input_port(cls, "Output Dimension", (basic.Integer, 'Output Dimension'),True)
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Extraction Region", (Region, 'Extraction Region'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_output_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
diff --git a/contrib/itk/SmoothingFilters.py b/contrib/itk/SmoothingFilters.py
new file mode 100644
index 0000000..dd9e764
--- /dev/null
+++ b/contrib/itk/SmoothingFilters.py
@@ -0,0 +1,558 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+from ITK import *
+from Image import Image
+
+class CurvatureAnisotropicDiffusionFilter(Module):
+    my_namespace="Filter|Smoothing"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+
+        try:
+            self.filter_ = itk.CurvatureAnisotropicDiffusionImageFilter[inImgType, inImgType].New(im.getImg())
+        except:
+            raise ModuleError(self, "Filter requires a decimal PixelType")
+
+        #default values are recommended
+        if self.hasInputFromPort("Iterations"):
+            iterations = self.getInputFromPort("Iterations")
+        else:
+            iterations = 5
+
+        if self.hasInputFromPort("TimeStep"):
+            timestep = self.getInputFromPort("TimeStep")
+        else:
+            if dim == 2:
+                timestep = 0.125
+            else:
+                timestep = 0.0625
+
+        if self.hasInputFromPort("Conductance"):
+            conductance = self.getInputFromPort("Conductance")
+        else:
+            conductance = 3.0
+
+        self.filter_.SetNumberOfIterations(iterations)
+        self.filter_.SetTimeStep(timestep)
+        self.filter_.SetConductanceParameter(conductance)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(inPixelType)
+        outIm.setDim(dim)
+        
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Curvature Anisotropic Diffusion Filter", namespace=cls.my_namespace)
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input Dimension", (basic.Integer, 'Input Dimension'),True)
+        reg.add_input_port(cls, "Input PixelType Float", (PixelType, 'Input PixelType Float'),True)
+        reg.add_input_port(cls, "Iterations", (basic.Integer, 'Iterations'), True)
+        reg.add_input_port(cls, "TimeStep", (basic.Float, 'TimeStep'), True)
+        reg.add_input_port(cls, "Conductance", (basic.Float, 'Conductance'), True)
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+
+
+class RecursiveGaussianImageFilter(Module):
+    my_namespace="Filter|Smoothing"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        outdim = dim
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        self.filter_ = itk.RecursiveGaussianImageFilter[inImgType, outImgType].New(im.getImg())
+
+        sigma = self.getInputFromPort("Sigma")
+        self.filter_.SetSigma(sigma)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+        
+        self.setResult("Output Image", outIm)
+        self.setResult("Output PixelType", outPixelType)
+        self.setResult("Output Dimension", outdim)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Recursive Gaussian Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input Dimension", (basic.Integer, 'Input Dimension'),True)
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Sigma", (basic.Float, 'Sigma'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Output Dimension", (basic.Integer, 'Output Dimension'),True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class CurvatureFlowImageFilter(Module):
+    my_namespace="Filter|Smoothing"
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+
+        try:
+            self.filter_ = itk.CurvatureFlowImageFilter[inImgType, inImgType].New(im.getImg())
+        except:
+            raise ModuleError(self, "Filter requires a decimal PixelType")
+
+        #default values recommended
+        if self.hasInputFromPort("TimeStep"):
+            self.ts = self.getInputFromPort("TimeStep")
+        else:
+            self.ts = 0.125
+
+        if self.hasInputFromPort("Iterations"):
+            self.iterations = self.getInputFromPort("Iterations")
+        else:
+            self.iterations = 5
+
+        self.filter_.SetTimeStep(self.ts)
+        self.filter_.SetNumberOfIterations(self.iterations)
+
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(inPixelType)
+        outIm.setDim(dim)
+        
+        self.setResult("Output Image", outIm)
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Curvature Flow Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input Dimension", (basic.Integer, 'Input Dimension'),True)
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "TimeStep", (basic.Float, 'TimeStep'), True)
+        reg.add_input_port(cls, "Iterations", (basic.Integer, 'Iterations'), True)
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+
+class DiscreteGaussianImageFilter(Module):
+    my_namespace = 'Filter|Smoothing'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        gaussian_variance = self.getInputFromPort("Gaussian Variance")
+
+        max_kernel_width = self.getInputFromPort("Max Kernel Width")
+
+        try:
+            self.filter_ = itk.DiscreteGaussianImageFilter[inImgType, outImgType].New(im.getImg())
+        except:
+            raise ModuleError(self, "Requires Signed PixelType")
+
+        self.filter_.SetVariance(gaussian_variance)
+        self.filter_.SetMaximumKernelWidth(max_kernel_width)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Discrete Gaussian Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Gaussian Variance", (basic.Float, 'Gaussian Variance'))
+        reg.add_input_port(cls, "Max Kernel Width", (basic.Integer, 'Max Kernel Width'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class BinomialBlurImageFilter(Module):
+    my_namespace = 'Filter|Smoothing'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        repetitions = self.getInputFromPort("Repetitions")
+
+        self.filter_ = itk.BinomialBlurImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetRepetitions(repetitions)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="BinomialBlur Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Repetitions", (basic.Integer, 'Repetitions'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class GradientAnisotropicDiffusionImageFilter(Module):
+    my_namespace = 'Filter|Smoothing'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        timestep = self.getInputFromPort("Timestep")
+
+        conductance = self.getInputFromPort("Conductance")
+
+        iterations = self.getInputFromPort("Iterations")
+
+        try:
+            self.filter_ = itk.GradientAnisotropicDiffusionImageFilter[inImgType, outImgType].New(im.getImg())
+        except:
+            raise ModuleError(self, "Requires Decimal PixelType")
+
+        self.filter_.SetTimeStep(timestep)
+        self.filter_.SetConductanceParameter(conductance)
+        self.filter_.SetNumberOfIterations(iterations)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Gradient Anisotropic Diffusion Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Timestep", (basic.Float, 'Timestep'))
+        reg.add_input_port(cls, "Conductance", (basic.Float, 'Conductance'))
+        reg.add_input_port(cls, "Iterations", (basic.Integer, 'Iterations'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+
+class MinMaxCurvatureFlowImageFilter(Module):
+    my_namespace = 'Filter|Smoothing'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        timestep = self.getInputFromPort("Timestep")
+
+        radius = self.getInputFromPort("Radius")
+
+        iterations = self.getInputFromPort("Iterations")
+
+        self.filter_ = itk.MinMaxCurvatureFlowImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetTimeStep(timestep)
+        self.filter_.SetStencilRadius(radius)
+        self.filter_.SetNumberOfIterations(iterations)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="MinMax Curvature Flow Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Timestep", (basic.Float, 'Timestep'))
+        reg.add_input_port(cls, "Radius", (basic.Float, 'Radius'))
+        reg.add_input_port(cls, "Iterations", (basic.Integer, 'Iterations'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
+class BilateralImageFilter(Module):
+    my_namespace = 'Filter|Smoothing'
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        range_sigma = self.getInputFromPort("Range Sigma")
+
+        domain_sigma = self.getInputFromPort("Domain Sigma")
+
+        self.filter_ = itk.BilateralImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetRangeSigma(range_sigma)
+        self.filter_.SetDomainSigma(domain_sigma)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="Bilateral Image Filter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Range Sigma", (basic.Float, 'Range Sigma'))
+        reg.add_input_port(cls, "Domain Sigma", (basic.Float, 'Domain Sigma'))
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
diff --git a/contrib/itk/ThresholdFilters.py b/contrib/itk/ThresholdFilters.py
new file mode 100644
index 0000000..bab496a
--- /dev/null
+++ b/contrib/itk/ThresholdFilters.py
@@ -0,0 +1,110 @@
+#############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+import itk
+import core.modules
+from core.modules.vistrails_module import Module, ModuleError
+
+from ITK import *
+from Image import Image
+
+class BinaryThresholdImageFilter(Module):
+    my_namespace = "Filter|Threshold"
+
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+
+        if self.hasInputFromPort("Upper Threshold"):
+            upper_threshold = self.getInputFromPort("Upper Threshold")
+        else:
+            upper_threshold = 255
+
+        lower_threshold = self.getInputFromPort("Lower Threshold")
+
+        if self.hasInputFromPort("Outside Value"):
+            outside_value = self.getInputFromPort("Outside Value")
+        else:
+            outside_value = 0
+
+        if self.hasInputFromPort("Inside Value"):
+            inside_value = self.getInputFromPort("Inside Value")
+        else:
+            inside_value = 255
+
+        self.filter_ = itk.BinaryThresholdImageFilter[inImgType, outImgType].New(im.getImg())
+        self.filter_.SetUpperThreshold(upper_threshold)
+        self.filter_.SetLowerThreshold(lower_threshold)
+        self.filter_.SetOutsideValue(outside_value)
+        self.filter_.SetInsideValue(inside_value)
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+
+
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="BinaryThresholdImageFilter", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+
+        reg.add_input_port(cls, "Upper Threshold", (basic.Integer, 'Upper Threshold'),True)
+        reg.add_input_port(cls, "Lower Threshold", (basic.Integer, 'Lower Threshold'))
+        reg.add_input_port(cls, "Outside Value", (basic.Integer, 'Outside Value'),True)
+        reg.add_input_port(cls, "Inside Value", (basic.Integer, 'Inside Value'),True)
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+
diff --git a/contrib/itk/__init__.py b/contrib/itk/__init__.py
new file mode 100644
index 0000000..65c2952
--- /dev/null
+++ b/contrib/itk/__init__.py
@@ -0,0 +1,179 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+#  ITK package for VisTrails
+############################################################################
+
+"""ITK is an open-source, cross-platform system that provides developers with an extensive suite of software tools for image analysis. www.itk.org
+
+For info on installing itk and python-itk on ubuntu see: http://paulnovo.org/node/2
+
+For info on generating wrapper modules for more itk filters see itk/filter_generator.py"""
+
+version = '0.2'
+identifier = 'edu.utah.sci.vistrails.itk'
+name = 'ITK'
+
+import core.bundles.utils
+import core.requirements
+from core.modules.vistrails_module import Module, ModuleError
+
+# Ugly, but Carlos doesnt know any better
+if core.bundles.utils.guess_system() == 'linux-ubuntu':
+    import sys
+    sys.path.append('/usr/local/lib/VisTrailsITK')
+
+try:
+    from core.bundles import py_import
+    itk = py_import('itk', {'linux-ubuntu': 'vistrails-itk'})
+except ImportError:
+    raise core.requirements.MissingRequirement("ITK and WrapITK")
+
+import core.modules
+import core.modules.module_registry
+
+# ITK Package imports
+from PixelType import *
+from FeatureExtractionFilters import *
+from ITK import *
+from Image import Image
+from IntensityFilters import *
+from SegmentationFilters import *
+from SelectionFilters import *
+from SmoothingFilters import *
+from ThresholdFilters import *
+from GradientFilters import *
+from NeighborhoodFilters import *
+from ImageReader import *
+
+def initialize(*args, **keywords):
+    reg = core.modules.module_registry
+    basic = core.modules.basic_modules
+
+########################################################################################
+# Misc.
+    Index2D.register(reg,basic)
+    Index3D.register(reg,basic)
+    Size.register(reg,basic)
+    Region.register(reg,basic)
+    PixelType.register(reg,basic)
+    Filter.register(reg,basic)
+    Kernel.register(reg,basic)
+
+    Image.register(reg,basic)
+
+########################################################################################
+# Pixel Types
+    pixeltypes = [PixelTypeFloat,
+                  PixelTypeUnsignedChar,
+                  PixelTypeUnsignedShort,
+                  PixelTypeRGB]
+
+    for cls in pixeltypes:
+        cls.register(reg,basic)
+
+
+########################################################################################
+# Feature Extraction Filters
+    featurefilters = [GradientMagnitudeRecursiveGaussianImageFilter,
+                      DanielssonDistanceMapImageFilter,
+                      SobelEdgeDetectionImageFilter]
+
+    for cls in featurefilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Intensity Filters
+    intensityfilters = [RescaleIntensityImageFilter,
+                        SigmoidImageFilter,
+                        ThresholdImageFilter,
+                        ShiftScaleImageFilter,
+                        NormalizeImageFilter]
+
+    for cls in intensityfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Segmentation Filters
+    segmentationfilters = [IsolatedWatershedImageFilter,
+                           ConnectedThresholdImageFilter,
+                           ConfidenceConnectedImageFilter,
+                           IsolatedConnectedImageFilter]
+
+    for cls in segmentationfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Selection Filters
+    selectionfilters = [RegionOfInterestImageFilter,
+                        CastImageFilter,
+                        ExtractImageFilter]
+
+    for cls in selectionfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Smoothing Filters
+    smoothingfilters = [CurvatureAnisotropicDiffusionFilter,
+                        RecursiveGaussianImageFilter,
+                        DiscreteGaussianImageFilter,
+                        GradientAnisotropicDiffusionImageFilter,
+                        MinMaxCurvatureFlowImageFilter,
+                        BinomialBlurImageFilter,
+                        BilateralImageFilter,
+                        CurvatureFlowImageFilter]
+
+    for cls in smoothingfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Threshold Filters
+    thresholdfilters = [BinaryThresholdImageFilter]
+
+    for cls in thresholdfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Gradient Filters
+    gradientfilters = [GradientMagnitudeImageFilter]
+
+    for cls in gradientfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Neighborhood Filters
+    neighborhoodfilters = [MeanImageFilter,
+                           MedianImageFilter,
+                           BinaryErodeImageFilter]
+
+    for cls in neighborhoodfilters:
+        cls.register(reg,basic)
+
+########################################################################################
+# Image Reader
+    imagereader = [ImageReader,
+                   ImageToFile,
+                   GDCMReader,
+                   DICOMReader]
+
+
+    for cls in imagereader:
+        cls.register(reg,basic)
diff --git a/contrib/itk/filter_generator.py b/contrib/itk/filter_generator.py
new file mode 100644
index 0000000..352cd6a
--- /dev/null
+++ b/contrib/itk/filter_generator.py
@@ -0,0 +1,170 @@
+# This is a rough code generation tool that works to generate code used to wrap itk functions for Vistrails
+# In order to use this one must:
+#   -set generation variables
+#   -run script
+#   -paste output into desired *Filters.py file
+#   -add new filter name to __init__.py file
+#
+#NOTE: some filters require special calls, params, etc. that are not generated with this code
+#      for example, many filters only accept decimal PixelTypes meaning that the
+#      filter initialization should be wrapped in a try/except raising a ModuleError
+#
+# For example filter implementation, check out:
+#       http://math.nist.gov/mcsd/savg/software/filters/
+#       http://voxel.jouy.inra.fr/darcs/contrib-itk/WrapITK/Python/Tests/
+
+##########################################################
+#String Manipulation Methods
+##########################################################
+def AddSpaces(word):
+    output = ""
+    for char in word:
+        if char.isupper() and word.index(char)!=0:
+            output += " %s"%char
+        else:
+            output += char
+    return output
+
+def SplitCap(word):
+    temp = word.split("_")
+    output = ""
+    for elem in temp:
+        output += "%s "%elem.capitalize()
+    return output.strip()
+
+##########################################################
+#SETUP generation variables
+##########################################################
+#filter_name should be equal to itk.filter_name
+filter_name = "BinaryErodeImageFilter"
+
+#designate namespace
+namespace = "Filter|Neighborhood"
+
+#some filters require kernel inputs, usually they don't though
+has_kernel = True
+
+#usage: {variable name:[variable type, default value, itk filter set method]}
+#NOTE: you must look up the itk filter set method (dir(itk.filter_name))
+filter_values = {"level":["basic.Float",None, "SetSquaredDistance"],
+                 "lower_threshold":["basic.Float",None, "SetUseImageSpacing"]}
+
+##########################################################
+#code generation
+##########################################################
+out_class = """class %s(Module):
+    my_namespace = '%s'"""%(filter_name, namespace)
+
+compute = """
+    def compute(self):
+        im = self.getInputFromPort("Input Image")
+
+        #check for input PixelType
+        if self.hasInputFromPort("Input PixelType"):
+            inPixelType = self.getInputFromPort("Input PixelType")
+        else:
+            inPixelType = im.getPixelType()
+
+        #check for output PixelType
+        if self.hasInputFromPort("Output PixelType"):
+            outPixelType = self.getInputFromPort("Output PixelType")
+        else:
+            outPixelType = inPixelType
+
+        #check for dimension
+        if self.hasInputFromPort("Dimension"):
+            dim = self.getInputFromPort("Dimension")
+        else:
+            dim = im.getDim()
+            """
+if has_kernel:
+    compute += """
+        kernel = self.getInputFromPort("Kernel")
+        """
+
+compute += """
+        #set up filter
+        inImgType = itk.Image[inPixelType._type, dim]
+        outImgType = itk.Image[outPixelType._type, dim]
+"""
+for param in filter_values:
+    #check if default value is set
+    if type(filter_values[param][1]).__name__ != "NoneType":
+        compute += """
+        if self.hasInputFromPort("%s"):
+            %s = self.getInputFromPort("%s")
+        else:
+            %s = %d\n"""%(SplitCap(param), param, SplitCap(param), param, filter_values[param][1])
+    else:
+        compute += """
+        %s = self.getInputFromPort("%s")\n"""%(param, SplitCap(param))
+
+if has_kernel:
+    compute += """
+        self.filter_ = itk.%s[inImgType, outImgType, kernel].New(im.getImg())
+        self.filter_.SetKernel(kernel)"""%filter_name
+
+else:
+    compute += """
+        self.filter_ = itk.%s[inImgType, outImgType].New(im.getImg())"""%filter_name
+
+#set filter values
+for param in filter_values:
+    compute += """
+        self.filter_.%s(%s)"""%(filter_values[param][2], param)
+
+compute += """
+        self.filter_.Update()
+
+        #setup output image
+        outIm = Image()
+        outIm.setImg(self.filter_.GetOutput())
+        outIm.setPixelType(outPixelType)
+        outIm.setDim(dim)
+
+        #set results
+        self.setResult("Output Image", outIm)
+        self.setResult("Filter", self)
+        self.setResult("Output PixelType", outPixelType)
+"""
+register = """
+    @classmethod
+    def register(cls, reg, basic):
+        reg.add_module(cls, name="%s", namespace=cls.my_namespace)
+
+        reg.add_input_port(cls, "Input Image", (Image, 'Input Image'))
+        reg.add_input_port(cls, "Input PixelType", (PixelType, 'Input PixelType'),True)
+        reg.add_input_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+        reg.add_input_port(cls, "Dimension", (basic.Integer, 'Dimension'),True)
+"""%AddSpaces(filter_name)
+if has_kernel:
+    register += """
+        reg.add_input_port(cls, "Kernel", (Kernel, 'Kernel'))
+        """
+
+for param in filter_values:
+    #check if default value is set
+    if type(filter_values[param][1]).__name__ != "NoneType":
+        register += """
+        reg.add_input_port(cls, "%s", (%s, '%s'),True)"""%(SplitCap(param),\
+                                                          filter_values[param][0],\
+                                                          SplitCap(param))
+    else:
+        register += """
+        reg.add_input_port(cls, "%s", (%s, '%s'))"""%(SplitCap(param),\
+                                                     filter_values[param][0],\
+                                                     SplitCap(param))
+
+register += """
+
+        reg.add_output_port(cls, "Output Image", (Image, 'Output Image'))
+        reg.add_output_port(cls, "Filter", (Filter, 'Filter'), True)
+        reg.add_output_port(cls, "Output PixelType", (PixelType, 'Output PixelType'),True)
+"""
+
+##########################################################
+#Output
+##########################################################
+print out_class
+print compute
+print register
diff --git a/contrib/itk/itk_test_example.py b/contrib/itk/itk_test_example.py
new file mode 100644
index 0000000..4786ae7
--- /dev/null
+++ b/contrib/itk/itk_test_example.py
@@ -0,0 +1,42 @@
+#example code to be pasted into a python terminal to test itk filters
+#generally used to instaniate filters inorder lookup variable set methods
+
+import itk
+#image setup
+dim = 2
+pixeltype = itk.UC
+kernel = itk.stle(dim, 5)
+filename = "/home/mates/Desktop/brains.jpg"
+reader = itk.ImageFileReader[itk.Image[pixeltype, dim]].New()
+reader.SetFileName(filename)
+reader.Update()
+
+im = reader.GetOutput()
+inImg = itk.Image[pixeltype, dim]
+outImg = inImg
+
+size_ = itk.Size[dim]()
+size_.SetElement(0,150)
+size_.SetElement(1,150)
+region_ = itk.ImageRegion[dim]()
+region_.SetSize(size_)
+
+#filter
+filt = itk.IsolatedConnectedImageFilter[inImg, outImg].New(im)
+filt.SetReplaceValue(120)
+filt.SetLower(155)
+filt.SetUpperValueLimit(235)
+filt.SetSeed1([120,120])
+filt.SetSeed2([140,140])
+filt.Update()
+
+filt2 = itk.ConnectedThresholdImageFilter[itk.Image[pixeltype, dim], itk.Image[pixeltype, dim]].New(im)
+filt2.SetSeed([100,100])
+filt2.SetReplaceValue(100)
+filt2.SetLower(150)
+filt2.SetUpper(250)
+filt2.Update()
+
+#write to file
+writer = itk.ImageFileWriter[itk.Image[pixeltype, dim]].New(filt.GetOutput(), FileName="/home/mates/Desktop/output.jpg")
+writer.Update()
diff --git a/contrib/meshutils.py b/contrib/meshutils.py
new file mode 100644
index 0000000..af0f8f1
--- /dev/null
+++ b/contrib/meshutils.py
@@ -0,0 +1,104 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import core.bundles
+import core.requirements
+import os
+import re
+
+identifier = 'edu.utah.sci.cscheid.meshutils'
+version = '0.1'
+name = 'Mesh utility'
+
+class MeshArea(Module):
+
+    def compute(self):
+        self.checkInputPort('input_file')
+        f1 = self.getInputFromPort('input_file')
+        text_output = self.interpreter.filePool.create_file()
+
+        cmdline = []
+        cmdline.append(meshareapath)
+        cmdline.append(f1.name)
+        cmdline.append('>' + text_output.name)
+        cmdline = ('%s ' * len(cmdline)) % tuple(cmdline)
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, "execution failed")
+        try:
+            l = file(text_output.name).readlines()[-1]
+            v = float(l)
+        except:
+            raise ModuleError(self, "Expected a float, got '%s'" % l)
+        self.setResult('area', v)
+
+class MeshChoose(Module):
+
+    def guess_input_format(self, input_file_name):
+        i = input_file_name.rfind('.')
+        if i == -1:
+            return None
+        else:
+            return input_file_name[i:]
+
+    def compute(self):
+        self.checkInputPort('input_file_1')
+        self.checkInputPort('input_file_2')
+
+        input_file_1 = self.getInputFromPort('input_file_1')
+        input_file_2 = self.getInputFromPort('input_file_2')
+
+        if self.hasInputFromPort('output_format'):
+            output_suffix = self.getInputFromPort('output_format')
+        else:
+            output_suffix = self.guess_input_format(input_file_2.name)
+
+        output_file = self.interpreter.filePool.create_file(output_suffix)
+
+        cmdline = [meshchoosepath,
+                   input_file_1.name,
+                   input_file_2.name,
+                   output_file.name]
+        cmdline = ('%s ' * len(cmdline)) % tuple(cmdline)
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, "execution failed")
+        self.setResult('output_file', output_file)
+
+def setpath(prefix):
+    global meshareapath
+    meshareapath = prefix + 'mesh_area'
+    global meshchoosepath
+    meshchoosepath = prefix + 'mesh_choose'
+
+def initialize(meshutilspath=None):
+    global _mesh_utils_path
+    if not meshutilspath:
+        print "Assuming mesh_utils are on path"
+        setpath('')
+    else:
+        print "Assuming mesh_utils are in '%s/'" % meshutilspath
+        setpath(meshutilspath+'/')
+    reg = core.modules.module_registry
+    reg.add_module(MeshArea)
+    reg.add_input_port(MeshArea, 'input_file',
+                     core.modules.basic_modules.File)
+    reg.add_output_port(MeshArea, 'area',
+                      core.modules.basic_modules.Float)
+
+    reg.add_module(MeshChoose)
+    reg.add_input_port(MeshChoose, 'input_file_1',
+                     core.modules.basic_modules.File)
+    reg.add_input_port(MeshChoose, 'input_file_2',
+                     core.modules.basic_modules.File)
+    reg.add_input_port(MeshChoose, 'output_format',
+                     core.modules.basic_modules.String)
+
+    reg.add_output_port(MeshChoose, 'output_file',
+                      core.modules.basic_modules.File)
+
+        
+        
+
diff --git a/contrib/mobile/__init__.py b/contrib/mobile/__init__.py
new file mode 100644
index 0000000..4d191e2
--- /dev/null
+++ b/contrib/mobile/__init__.py
@@ -0,0 +1,365 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""This package provides interaction with mobile devices.
+It contains modules to represent a geolocation, to get an image and a sound memo.
+Executing on a desktop will do nothing for now.
+
+"""
+import base64
+from datetime import datetime
+
+from core.configuration import ConfigurationObject
+from core.modules.vistrails_module import Module, ModuleError
+from core.modules.basic_modules import Constant, Float, File, String
+from core.system import get_elementtree_library
+
+from time import strptime
+from datetime import datetime
+
+ElementTree = get_elementtree_library()
+
+name = "Mobile"
+identifier = "edu.utah.sci.vistrails.mobile"
+version = '0.0.1'
+
+class LocationCoordinate2D(Constant):
+    """A structure that contains a geographical coordinate using the 
+    WGS 84 reference frame."""
+    def __init__(self):
+        Constant.__init__(self) 
+        self.latitude = None
+        self.longitude = None
+        LocationCoordinate2D.default_value = self
+    
+    @staticmethod
+    def from_xml_string(xml_string):
+        node = ElementTree.fromstring(xml_string)
+        if node.tag != 'coordinate':
+            return None
+        #read attributes
+        data = node.get('latitude', None)
+        lati = float(data)
+        
+        data = node.get('longitude', None)
+        longi = float(data)
+        
+        coord = LocationCoordinate2D()
+        coord.latitude = lati
+        coord.longitude = longi
+        return coord
+    
+    @staticmethod
+    def to_xml_string(x):
+        node = ElementTree.Element('coordinate')
+        node.set('latitude', str(x.latitude))
+        node.set('longitude', str(x.longitude))  
+        return ElementTree.tostring(node)       
+    
+    @staticmethod
+    def translate_to_python(x):
+        result = LocationCoordinate2D.from_xml_string(x)
+        result.setResult("value", result)
+        return result
+
+    @staticmethod
+    def translate_to_string(x):
+        return LocationCoordinate2D.to_xml_string(x)
+        
+    def compute(self):
+        if self.hasInputFromPort("value"):
+            data = self.getInputFromPort("value")
+            self.latitude = data.latitude
+            self.longitude = data.longitude
+        
+        if self.latitude is None or self.longitude is None:
+            self.checkInputPort("latitude")
+            self.checkInputPort("longitude")
+            self.latitude = self.getInputFromPort("latitude")
+            self.longitude = self.getInputFromPort("longitude")
+        self.setResult("value", self)
+        self.setResult("value_as_string", self.translate_to_string(self))
+        
+    @classmethod
+    def provide_input_port_documentation(cls, port_name):
+        if port_name == "latitude":
+            return """The latitude in degrees. 
+Positive values indicate latitudes north of the equator. 
+Negative values indicate latitudes south of the equator."""
+        elif port_name == "longitude":
+            return """The longitude in degrees. 
+Measurements are relative to the zero meridian with positive values extending 
+east of the meridian and negative values extending west of the meridian."""
+    
+LocationCoordinate2D._input_ports = [('value', LocationCoordinate2D),
+                                     ('latitude', Float, True), 
+                                     ('longitude', Float, True)]
+    
+LocationCoordinate2D._output_ports = [('value', LocationCoordinate2D)]
+     
+class Location(Constant):
+    """This class represents the geographical coordinates and altitude of the 
+    device's location along with values indicating the accuracy of the 
+    measurements and when those measurements were made. In devices with a GPS, 
+    this class also reports information about the speed and heading in which 
+    the device is moving."""
+    def __init__(self):
+        Constant.__init__(self)
+        self.coordinate = None
+        self.altitude = None
+        self.horizontal_accuracy = None
+        self.vertical_accuracy = None
+        self.timestamp = None
+        self.speed = None
+        self.course = None
+        Location.default_value = self
+        
+    @staticmethod
+    def from_xml_string(xml_string):
+        node = ElementTree.fromstring(xml_string)
+        if node.tag != 'location':
+            return None
+        #read attributes
+        data = node.get('altitude', None)
+        alti = float(data)
+        
+        data = node.get('horizontalAccuracy', None)
+        hAcc = float(data)
+        
+        data = node.get('verticalAccuracy', None)
+        vAcc = float(data)
+    
+        data = node.get('timestamp', None)
+        timestamp = datetime(*strptime(data, '%Y-%m-%d %H:%M:%S')[0:6])
+        
+        data = node.get('speed', None)
+        speed = float(data)
+        
+        data = node.get('course', None)
+        course = float(data)
+        
+        coord = None
+        for child in node.getchildren():
+            if child.tag == "coordinate":
+                text = ElementTree.tostring(child)
+                coord = LocationCoordinate2D.from_xml_string(text)
+        
+        loc = Location()
+        loc.coordinate = coord
+        loc.altitude = alti
+        loc.horizontal_accuracy = hAcc
+        loc.vertical_accuracy = vAcc
+        loc.timestamp = timestamp
+        loc.speed = speed
+        loc.course = course
+        
+        return loc
+    
+    @staticmethod
+    def to_xml_string(x):
+        node = ElementTree.Element('location')
+        node.set('altitude', str(x.altitude))
+        node.set('horizontalAccuracy',str(x.horizontal_accuracy))
+        node.set('verticalAccuracy',str(x.vertical_accuracy))
+        node.set('timestamp', x.timestamp.strftime('%Y-%m-%d %H:%M:%S'))
+        node.set('speed', str(x.speed))
+        node.set('course', str(x.course))
+        
+        child_str = LocationCoordinate2D.to_xml_string(x.coordinate)
+        child = ElementTree.fromstring(child_str)
+        node.append(child)
+        
+        return ElementTree.tostring(node)       
+    
+    @staticmethod
+    def translate_to_python(x):
+        result = Location.from_xml_string(x)
+        result.setResult("value", result)
+        return result
+
+    @staticmethod
+    def translate_to_string(x):
+        return Location.to_xml_string(x)
+    
+    def compute(self):
+        if self.hasInputFromPort("value"):
+            data = self.getInputFromPort("value")
+            self.coordinate = data.coordinate
+            self.altitude = data.altitude
+            self.horizontal_accuracy = data.horizontal_accuracy
+            self.vertical_accuracy = data.vertical_accuracy
+            self.timestamp = data.timestamp
+            self.speed = data.speed
+            self.course = data.course
+        
+        if self.coordinate is None or self.altitude is None:
+            self.checkInputPort("coordinate")
+            self.checkInputPort("altitude")
+            self.coordinate = self.getInputFromPort("coordinate")
+            self.altitude = self.getInputFromPort("altitude")
+            
+            #check optional ports
+            if self.hasInputFromPort("horizontalAccuracy"):
+                self.horizontal_accuracy = \
+                              self.getInputFromPort("horizontalAccuracy")
+                              
+            if self.hasInputFromPort("verticalAccuracy"):
+                self.vertical_accuracy = \
+                              self.getInputFromPort("verticalAccuracy")
+                              
+            if self.hasInputFromPort("timestamp"):
+                data = self.getInputFromPort("timestamp")
+                self.timestamp = \
+                            datetime(*strptime(data, '%Y-%m-%d %H:%M:%S')[0:6])
+            if self.hasInputFromPort("speed"):
+                self.speed = self.getInputFromPort("speed")
+                
+            if self.hasInputFromPort("course"):
+                self.course = self.getInputFromPort("course")
+        
+        self.setResult("value", self)
+        self.setResult("value_as_string", self.translate_to_string(self))
+    
+    @classmethod
+    def provide_input_port_documentation(cls, port_name):
+        if port_name == "coordinate":
+            return """The geographical coordinate information 
+(latitude and longitude)."""
+        elif port_name == "altitude":
+            return """The altitude in meters.
+Positive values indicate altitudes above sea level.
+Negative values indicate altitudes below sea level."""
+        elif port_name == "horizontalAccuracy":
+            return """The radius of uncertainty for the location, 
+measured in meters.
+The coordinate's latitude and longitude identify the center of the circle and 
+this value indicates the radius of that circle. A negative value indicates 
+that the coordinate's latitude and longitude are invalid."""
+        elif port_name == "verticalAccuracy":
+            return """The accuracy of the altitude value in meters.
+The value in the altitude port could be plus or minus the value indicated 
+by this port. A negative value indicates that the altitude value is invalid.
+
+Determining the vertical accuracy requires a device with GPS capabilities. 
+Thus, on some earlier iPhone OS-based devices, this property always contains a
+negative value."""
+        elif port_name == "timestamp":
+            return """The time at which this location was determined.
+Format: '%Y-%m-%d %H:%M:%S' """
+        elif port_name == "speed":
+            return """The instantaneous speed of the device in meters per second.
+This value reflects the instantaneous speed of the device in the direction of 
+its current heading. A negative value indicates an invalid speed. 
+Because the actual speed can change many times between the delivery of 
+subsequent location events, you should use this property for informational 
+purposes only."""
+        elif port_name == "course":
+            return """The direction in which the device is travelling.
+Course values are measured in degrees starting at due north and continuing 
+clockwise around the compass. Thus, north is 0 degrees, east is 90 degrees, 
+south is 180 degrees, and so on. Course values may not be available on all 
+devices. A negative value indicates that the direction is invalid."""
+        
+Location._input_ports = [('value', Location),
+                         ('coordinate', LocationCoordinate2D, True), 
+                         ('altitude', Float, True),
+                         ('horizontalAccuracy', Float, True),
+                         ('verticalAccuracy', Float, True),
+                         ('timestamp', String, True),
+                         ('speed', Float, True),
+                         ('course', Float, True)]
+
+Location._output_ports = [('value', Location)]
+
+class B64EncodedContents(Constant):
+    def __init__(self):
+        Constant.__init__(self)
+        self.contents = None
+        B64EncodedContents.default_value = self
+    
+    @staticmethod
+    def translate_to_python(x):
+        result = B64EncodedContents()
+        result.contents = str(x)
+        result.setResult("value", result)
+        return result
+        
+    @staticmethod
+    def translate_to_string(x):
+        return x.contents
+    
+    def compute(self):
+        if self.hasInputFromPort("value"):
+            data = self.getInputFromPort("value")
+            self.contents = data.contents
+        
+        if self.contents is None:
+            if self.hasInputFromPort("file"):
+                file_ = self.getInputFromPort("file")
+                c = open(file_.name)
+                self.contents = base64.b64encode(c.read()) 
+            
+        self.setResult("value", self)
+        self.setResult("value_as_string", self.translate_to_string(self))
+        
+B64EncodedContents._input_ports = [('value', B64EncodedContents),
+                                   ('contents', String, True), 
+                                   ('file', File, True)]
+    
+B64EncodedContents._output_ports = [('value', B64EncodedContents)]
+    
+class Image(B64EncodedContents):
+    def __init__(self):
+        B64EncodedContents.__init__(self)
+        Image.default_value = self  
+        
+    @staticmethod
+    def translate_to_python(x):
+        result = Image()
+        result.contents = str(x)
+        result.setResult("value", result)
+        return result
+    
+Image._input_ports = [('value', Image)]
+    
+Image._output_ports = [('value', Image)]
+    
+class Audio(B64EncodedContents):
+    def __init__(self):
+        B64EncodedContents.__init__(self)
+        Audio.default_value = self  
+        
+    @staticmethod
+    def translate_to_python(x):
+        result = Audio()
+        result.contents = str(x)
+        result.setResult("value", result)
+        return result
+    
+Audio._input_ports = [('value', Audio)]
+    
+Audio._output_ports = [('value', Audio)]
+    
+_modules = [LocationCoordinate2D,
+            Location,
+            B64EncodedContents,
+            Image,
+            Audio]
diff --git a/contrib/pc3/__init__.py b/contrib/pc3/__init__.py
new file mode 100644
index 0000000..cad7b78
--- /dev/null
+++ b/contrib/pc3/__init__.py
@@ -0,0 +1,420 @@
+from core.modules.basic_modules import String, Boolean, File, Integer
+from core.modules.module_registry import get_module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from core.upgradeworkflow import UpgradeWorkflowHandler
+
+from info.ipaw.pc3.LoadAppLogic import LoadAppLogic
+
+import os
+
+name = "Provenance Challenge 3"
+identifier = "edu.utah.sci.dakoop.pc3"
+version = '1.0.1'
+
+# class Module(object):
+#     pass
+
+# class String(Module):
+#     pass
+
+# class Boolean(Module):
+#     pass
+
+# class Integer(Module):
+#     pass
+
+class Collection(Module):
+    def __init__(self, lst, klass=None):
+        Module.__init__(self)
+        self.lst = lst
+        self.klass = klass
+
+    def compute(self):
+        self.lst = self.forceGetInputListFromPort('elements')
+        self.setResult('collection', self.list)
+
+    _input_ports = [('elements', Module)]
+    _output_ports = []
+    # _output_ports = [('self', Collection)]
+Collection._output_ports.append(('self', Collection))
+    
+class CSVFileEntry(Module):
+    def __init__(self, file_entry=None):
+        Module.__init__(self)
+        if file_entry is not None:
+            self.file_entry = file_entry
+        else:
+            self.file_entry = LoadAppLogic.CSVFileEntry()
+
+    def compute(self):
+        self.checkInputPort('filePath')
+        self.checkInputPort('headerPath')
+        self.checkInputPort('rowCount')
+        self.checkInputPort('targetTable')
+        self.checkInputPort('checksum')
+        self.checkInputPort('columnNames')
+        self.file_entry.FilePath = self.getInputFromPort('filePath')
+        self.file_entry.HeaderPath = self.getInputFromPort('headerPath')
+        self.file_entry.RowCount = self.getInputFromPort('rowCount')
+        self.file_entry.TargetTable = self.getInputFromPort('targetTable')
+        self.file_entry.Checksum = self.getInputFromPort('checksum')
+        self.file_entry.ColumnNames = self.getInputFromPort('columnNames').lst
+        self.setResult('self', self)
+
+    _input_ports = [('filePath', String), 
+                    ('headerPath', String),
+                    ('rowCount', Integer),
+                    ('targetTable', String),
+                    ('checksum', String),
+                    ('columnNames', Collection)]
+    _output_ports = []
+    # _output_ports = [('self', CSVFileEntry)]
+CSVFileEntry._output_ports.append(('self', CSVFileEntry))
+    
+class DatabaseEntry(Module):
+    def __init__(self, db_entry=None):
+        Module.__init__(self)
+        if db_entry is not None:
+            self.db_entry = db_entry
+        else:
+            self.db_entry = LoadAppLogic.DatabaseEntry()
+    
+    def compute(self):
+        self.checkInputPort('dbGuid')
+        self.checkInputPort('dbName')
+        self.checkInputPort('connectionString')
+        self.db_entry.DBGuid = self.getInputFromPort('dbGuid')
+        self.db_entry.DBName = self.getInputFromPort('dbName')
+        self.db_entry.ConnectionString = \
+            self.getInputFromPort('connectionString')
+        self.setResult('self', self)
+
+    _input_ports = [('dbGuid', String),
+                    ('dbName', String),
+                    ('connectionString', String)]
+    _output_ports = []
+    # _output_ports = [('self', DatabaseEntry)]
+DatabaseEntry._output_ports.append(('self', DatabaseEntry))
+
+class IsCSVReadyFileExists(Module):
+    def compute(self):
+        self.checkInputPort('csvRootPath')
+        path = self.getInputFromPort('csvRootPath')
+        res = LoadAppLogic.IsCSVReadyFileExists(path)
+        self.setResult('fileExists', res)
+
+    _input_ports = [('csvRootPath', String)]
+    _output_ports = [('fileExists', Boolean)]
+    
+class ReadCSVReadyFile(Module):
+    def compute(self):
+        self.checkInputPort('csvRootPath')
+        path = self.getInputFromPort('csvRootPath')
+        self.annotate({'used_files':
+                           str([os.path.join(path, "csv_ready.csv")])})
+        csv_files = LoadAppLogic.ReadCSVReadyFile(path)
+        # wrapped_res = Collection([CSVFileEntry(e) for e in res], CSVFileEntry)
+        list_of_elts = [CSVFileEntry(f) for f in csv_files]
+        for elt in list_of_elts:
+            elt.upToDate = True
+        self.setResult('csvFiles', list_of_elts)
+
+    _input_ports = [('csvRootPath', String)]
+    # _output_ports = [('csvFiles', [Collection, CSVFileEntry])]
+    _output_ports = [('csvFiles', 
+                      '(edu.utah.sci.vistrails.basic:List)')]
+
+class IsMatchCSVFileTables(Module):
+    def compute(self):
+        self.checkInputPort('csvFiles')
+        csv_files = self.getInputFromPort('csvFiles')
+        res = LoadAppLogic.IsMatchCSVFileTables([f.file_entry 
+                                                 for f in csv_files])
+        self.setResult('tablesMatch', res)
+
+    # _input_ports = [('csvFiles', [Collection, CSVFileEntry])]
+    _input_ports = [('csvFiles', 
+                     '(edu.utah.sci.vistrails.basic:List)')]
+    _output_ports = [('tablesMatch', Boolean)]
+
+class IsExistsCSVFile(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        csv_file = self.getInputFromPort('csvFile')
+        res = LoadAppLogic.IsExistsCSVFile(csv_file.file_entry)
+        self.setResult('fileExists', res)
+
+    _input_ports = [('csvFile', CSVFileEntry)]
+    _output_ports = [('fileExists', Boolean)]
+    
+class ReadCSVFileColumnNames(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        csv_file = self.getInputFromPort('csvFile')
+        self.annotate({'used_files':
+                          str([csv_file.file_entry.HeaderPath])})
+        res = LoadAppLogic.ReadCSVFileColumnNames(csv_file.file_entry)
+        self.setResult('csvFile', CSVFileEntry(res))
+
+    _input_ports = [('csvFile', CSVFileEntry)]
+    _output_ports = [('csvFile', CSVFileEntry)]
+    
+class IsMatchCSVFileColumnNames(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        csv_file = self.getInputFromPort('csvFile')
+        res = LoadAppLogic.IsMatchCSVFileColumnNames(csv_file.file_entry)
+        self.setResult('columnsMatch', res)
+
+    _input_ports = [('csvFile', CSVFileEntry)]
+    _output_ports = [('columnsMatch', Boolean)]
+
+class CreateEmptyLoadDB(Module):
+    def compute(self):
+        self.checkInputPort('jobID')
+        job_id = self.getInputFromPort('jobID')
+        res = LoadAppLogic.CreateEmptyLoadDB(job_id)
+        self.setResult('dbEntry', DatabaseEntry(res))
+
+    _input_ports = [('jobID', String)]
+    _output_ports = [('dbEntry', DatabaseEntry)]
+
+class LoadCSVFileIntoTable(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        self.checkInputPort('dbEntry')
+        csv_file = self.getInputFromPort('csvFile')
+        db_entry = self.getInputFromPort('dbEntry')
+        self.annotate({'used_files':
+                          str([csv_file.file_entry.FilePath]),
+                       'generated_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 csv_file.file_entry.TargetTable)])})
+        res = LoadAppLogic.LoadCSVFileIntoTable(db_entry.db_entry,
+                                                csv_file.file_entry)
+        self.setResult('success', res)
+
+    _input_ports = [('csvFile', CSVFileEntry), ('dbEntry', DatabaseEntry)]
+    _output_ports = [('success', Boolean)]
+
+class UpdateComputedColumns(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        self.checkInputPort('dbEntry')
+        csv_file = self.getInputFromPort('csvFile')
+        db_entry = self.getInputFromPort('dbEntry')
+        if csv_file.file_entry.TargetTable.upper() == 'P2DETECTION':
+            self.annotate({'used_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 csv_file.file_entry.TargetTable)])})
+        res = LoadAppLogic.UpdateComputedColumns(db_entry.db_entry,
+                                                 csv_file.file_entry)
+        self.setResult('success', res)
+
+    _input_ports = [('csvFile', CSVFileEntry), ('dbEntry', DatabaseEntry)]
+    _output_ports = [('success', Boolean)]
+
+class IsMatchTableRowCount(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        self.checkInputPort('dbEntry')
+        csv_file = self.getInputFromPort('csvFile')
+        db_entry = self.getInputFromPort('dbEntry')
+        self.annotate({'used_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 csv_file.file_entry.TargetTable)])})
+        res = LoadAppLogic.IsMatchTableRowCount(db_entry.db_entry,
+                                                csv_file.file_entry)
+        self.setResult('countsMatch', res)
+
+    _input_ports = [('csvFile', CSVFileEntry), ('dbEntry', DatabaseEntry)]
+    _output_ports = [('countsMatch', Boolean)]
+
+class IsMatchTableColumnRanges(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        self.checkInputPort('dbEntry')
+        csv_file = self.getInputFromPort('csvFile')
+        db_entry = self.getInputFromPort('dbEntry')
+        if csv_file.file_entry.TargetTable.upper() == 'P2DETECTION':
+            self.annotate({'used_tables':
+                               str([(db_entry.db_entry.ConnectionString, 
+                                     db_entry.db_entry.DBName,
+                                     csv_file.file_entry.TargetTable)])})
+        res = LoadAppLogic.IsMatchTableColumnRanges(db_entry.db_entry,
+                                                    csv_file.file_entry)
+        self.setResult('rangesMatch', res)
+
+    _input_ports = [('csvFile', CSVFileEntry), ('dbEntry', DatabaseEntry)]
+    _output_ports = [('rangesMatch', Boolean)]
+
+class CompactDatabase(Module):
+    def compute(self):
+        self.checkInputPort('dbEntry')
+        db_entry = self.getInputFromPort('dbEntry')
+        self.annotate({'used_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 "P2Detection"),
+                                (db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 "P2FrameMeta"),
+                                (db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 "P2ImageMeta")])})
+        LoadAppLogic.CompactDatabase(db_entry.db_entry)
+        self.setResult('dbEntry', db_entry)
+        
+
+    _input_ports = [('dbEntry', DatabaseEntry)]
+    _output_ports = [('dbEntry', DatabaseEntry)]
+
+class GetCSVFiles(Module):
+    def compute(self):
+        self.checkInputPort('csvRootPath')
+        path = self.getInputFromPort('csvRootPath')
+        if not LoadAppLogic.IsCSVReadyFileExists(path):
+            raise ModuleError(self, "IsCSVReadyFileExists failed")
+        self.annotate({'used_files':
+                           str([os.path.join(path, "csv_ready.csv")])})
+        csv_files = LoadAppLogic.ReadCSVReadyFile(path)
+        if not LoadAppLogic.IsMatchCSVFileTables(csv_files):
+            raise ModuleError(self, "IsMatchCSVFileTables failed")
+#         getter = get_module_registry().get_descriptor_by_name
+#         descriptor = getter('edu.utah.sci.vistrails.basic', 
+#                             'List')
+#         list_of_elts = descriptor.module()
+#         list_of_elts.value = [CSVFileEntry(f) for f in csv_files]
+#         self.setResult('csvFiles', list_of_elts)
+        list_of_elts = [CSVFileEntry(f) for f in csv_files]
+        for elt in list_of_elts:
+            elt.upToDate = True
+        print 'list_of_elts:', list_of_elts
+        self.setResult('csvFiles', list_of_elts)
+#         wrapped_res = Collection([CSVFileEntry(f) for f in csv_files], 
+#                                  CSVFileEntry)
+#         self.setResult('csvFiles', wrapped_res)
+
+    _input_ports = [('csvRootPath', String)]
+    _output_ports = [('csvFiles', 
+                      '(edu.utah.sci.vistrails.basic:List)')]
+    # _output_ports = [('csvFiles', [Collection, CSVFileEntry])]
+
+class ReadCSVFile(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        csv_file = self.getInputFromPort('csvFile')
+        if not LoadAppLogic.IsExistsCSVFile(csv_file.file_entry):
+            raise ModuleError(self, "IsExistsCSVFile failed")
+        self.annotate({'used_files':
+                          str([csv_file.file_entry.HeaderPath])})
+        csv_file.file_entry = \
+            LoadAppLogic.ReadCSVFileColumnNames(csv_file.file_entry)
+        if not LoadAppLogic.IsMatchCSVFileColumnNames(csv_file.file_entry):
+            raise ModuleError(self, "IsMatchCSVFileColumnNames failed")
+        self.setResult('csvFile', csv_file)
+
+    _input_ports = [('csvFile', CSVFileEntry)]
+    _output_ports = [('csvFile', CSVFileEntry)]
+    
+class LoadCSVFileIntoDB(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        self.checkInputPort('dbEntry')
+        csv_file = self.getInputFromPort('csvFile')
+        print 'csv_file:', csv_file
+        db_entry = self.getInputFromPort('dbEntry')
+        self.annotate({'used_files':
+                          str([csv_file.file_entry.FilePath])})
+        self.annotate({'generated_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 csv_file.file_entry.TargetTable)])})
+        if not LoadAppLogic.LoadCSVFileIntoTable(db_entry.db_entry,
+                                                 csv_file.file_entry):
+            raise ModuleError(self, "LoadCSVFileIntoTable failed")
+        self.setResult('dbEntry', db_entry)
+
+    _input_ports = [('csvFile', CSVFileEntry), ('dbEntry', DatabaseEntry)]
+    _output_ports = [('dbEntry', DatabaseEntry)]
+
+class ComputeColumns(Module):
+    def compute(self):
+        self.checkInputPort('csvFile')
+        self.checkInputPort('dbEntry')
+        csv_file = self.getInputFromPort('csvFile')
+        db_entry = self.getInputFromPort('dbEntry')
+        self.annotate({'used_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 csv_file.file_entry.TargetTable)])})
+        if not LoadAppLogic.UpdateComputedColumns(db_entry.db_entry,
+                                                  csv_file.file_entry):
+            raise ModuleError(self, "UpdateComputedColumns failed")
+        if not LoadAppLogic.IsMatchTableRowCount(db_entry.db_entry,
+                                                 csv_file.file_entry):
+            raise ModuleError(self, "IsMatchTableRowCount failed")
+        if not LoadAppLogic.IsMatchTableColumnRanges(db_entry.db_entry,
+                                                     csv_file.file_entry):
+            raise ModuleError(self, "IsMatchTableColumnRanges failed")
+        self.setResult('dbEntry', db_entry)
+
+    _input_ports = [('csvFile', CSVFileEntry), ('dbEntry', DatabaseEntry)]
+    _output_ports = [('dbEntry', DatabaseEntry)]
+
+class DetectionsHistogram(Module):
+    def compute(self):
+        self.checkInputPort('dbEntry')
+        db_entry = self.getInputFromPort('dbEntry')
+        high_quality = False
+        if self.hasInputFromPort('highQuality'):
+            high_quality = self.getInputFromPort('highQuality')
+        self.annotate({'used_tables':
+                           str([(db_entry.db_entry.ConnectionString, 
+                                 db_entry.db_entry.DBName,
+                                 "P2Detection")])})
+        histogram = LoadAppLogic.DetectionsHistogram(db_entry.db_entry, 
+                                                     high_quality)
+        self.setResult('histogram', histogram)
+    
+    _input_ports = [('dbEntry', DatabaseEntry), ('highQuality', Boolean, True)]
+    _output_ports = [('histogram', 
+                      '(edu.utah.sci.vistrails.basic:List)')]
+
+_modules = [Collection,
+            CSVFileEntry,
+            DatabaseEntry,
+            IsCSVReadyFileExists,
+            ReadCSVReadyFile,
+            IsMatchCSVFileTables,
+            IsExistsCSVFile,
+            ReadCSVFileColumnNames,
+            IsMatchCSVFileColumnNames,
+            CreateEmptyLoadDB,
+            LoadCSVFileIntoTable,
+            UpdateComputedColumns,
+            IsMatchTableRowCount,
+            IsMatchTableColumnRanges,
+            CompactDatabase,
+            GetCSVFiles,
+            ReadCSVFile,
+            LoadCSVFileIntoDB,
+            ComputeColumns,
+            DetectionsHistogram,
+            ]
+
+def package_dependencies():
+    return ['edu.utah.sci.vistrails.control_flow']
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    module_remap = {'ReadCSVReadyFile': [(None, '1.0.1', None, {})],
+                    'IsMatchCSVFileTables': [(None, '1.0.1', None, {})],
+                    'GetCSVFiles': [(None, '1.0.1', None, {})],
+                    'DetectionsHistogram': [(None, '1.0.1', None, {})],
+                    }
+
+    return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline,
+                                               module_remap)
diff --git a/contrib/pc3/info/__init__.py b/contrib/pc3/info/__init__.py
new file mode 100644
index 0000000..2ae2839
--- /dev/null
+++ b/contrib/pc3/info/__init__.py
@@ -0,0 +1 @@
+pass
diff --git a/contrib/pc3/info/ipaw/__init__.py b/contrib/pc3/info/ipaw/__init__.py
new file mode 100644
index 0000000..2ae2839
--- /dev/null
+++ b/contrib/pc3/info/ipaw/__init__.py
@@ -0,0 +1 @@
+pass
diff --git a/contrib/pc3/info/ipaw/pc3/LoadAppLogic.py b/contrib/pc3/info/ipaw/pc3/LoadAppLogic.py
new file mode 100644
index 0000000..a85a563
--- /dev/null
+++ b/contrib/pc3/info/ipaw/pc3/LoadAppLogic.py
@@ -0,0 +1,441 @@
+import MySQLdb
+import os
+import uuid
+
+from LoadConstants import LoadConstants
+from LoadSql import LoadSql
+
+class LoadAppLogic(object):
+
+    #region Database Constants
+    SQL_SERVER = "localhost"
+    SQL_USER = "ipaw"
+    SQL_PASSWORD = "pc3_load-2009"
+    #endregion
+
+    #region Helper data structures
+    class CSVFileEntry(object):
+        def __init__(self):
+            self.FilePath = None
+            self.HeaderPath = None
+            self.RowCount = None
+            self.TargetTable = None
+            self.Checksum = None
+            self.ColumnNames = []
+
+    class DatabaseEntry(object):
+        def __init__(self):
+            self.DBGuid = None
+            self.DBName = None
+            self.ConnectionString = None
+    #endregion
+
+    #region Pre-Load Sanity Checks
+
+    @staticmethod
+    def IsCSVReadyFileExists(CSVRootPath):
+        """<summary>
+        Checks if the CSV Ready File exists in the given rooth path to the 
+        CSV Batch
+        </summary>
+        <param name="CSVRootPath">Path to the root directory for the batch
+        </param>
+        <returns>true if the csv_ready.csv file exists in the CSVRoothPath. 
+        False otherwise.</returns>
+        """
+
+        # 1. Check if parent directory exists.
+        if not os.path.exists(CSVRootPath):
+            return False
+            
+        # 2. Check if CSV Ready file exists. We assume a static name for the ready file.
+        CSVReadyFilePath = os.path.join(CSVRootPath, "csv_ready.csv")
+        return os.path.exists(CSVReadyFilePath)  
+
+    @staticmethod
+    def ReadCSVReadyFile(CSVRootPath):
+        """<summary>
+    
+        </summary>
+        <param name="CSVRootPath"></param>
+        <returns></returns>
+        """
+
+        # 1. Initialize output list of file entries
+        CSVFileEntryList = []
+      
+        # 2. Open input stream to read from CSV Ready File
+        CSVReadyFilePath =  os.path.join(CSVRootPath, "csv_ready.csv")
+        ReadyFileStream  = open(CSVReadyFilePath);
+
+        # 3. Read each line in CSV Ready file and split the lines into 
+        #    individual columns separated by commas
+        for ReadyFileLine in ReadyFileStream:
+            
+            # 3.a. Expect each line in the CSV ready file to be of the format:
+            # <FileName>,<NumRows>,<TargetTable>,<MD5Checksum>        
+            ReadyFileLineTokens = ReadyFileLine.split(',')
+
+            # 3.b. Create an empty FileEntry and populate it with the columns
+            FilePath = os.path.join(CSVRootPath,
+                                    ReadyFileLineTokens[0].strip())
+
+            # CSVFileEntry FileEntry  = new CSVFileEntry();
+            FileEntry = LoadAppLogic.CSVFileEntry()
+            FileEntry.FilePath = FilePath
+            FileEntry.HeaderPath = FilePath + ".hdr"
+            FileEntry.RowCount = int(ReadyFileLineTokens[1].strip())
+            FileEntry.TargetTable = ReadyFileLineTokens[2].strip()
+            FileEntry.Checksum = ReadyFileLineTokens[3].strip()
+
+            # 3.c. Add file entry to output list
+            CSVFileEntryList.append(FileEntry);
+
+        # 4. Close input stream and return output file entry list
+        ReadyFileStream.close();
+
+        return CSVFileEntryList;
+    
+    @staticmethod
+    def IsMatchCSVFileTables(FileEntries):
+        """<summary>
+        Check if the correct list of files/table names are present in this batch
+        </summary>
+        <param name="FileEntries"></param>
+        <returns></returns>
+        """
+
+        # check if the file count and the expected number of tables match
+        if (len(LoadConstants.EXPECTED_TABLES) != len(FileEntries)):
+            return false;
+
+        # for each expected table name, check if it is present 
+        # in the list of file entries
+        for TableName in LoadConstants.EXPECTED_TABLES:
+            TableExists = False
+            for FileEntry in FileEntries:
+                if TableName == FileEntry.TargetTable:
+                    TableExists = True
+                    break
+                
+            # if the table name did not exist in list of CSV files, 
+            # this check fails.
+            if not TableExists:
+                return False
+
+        return True
+
+    @staticmethod
+    def IsExistsCSVFile(FileEntry):
+        """<summary>
+        Test if a CSV File defined in the CSV Ready list actually exists on disk.
+        </summary>
+        <param name="FileEntry">FileEntry for CSVFile to test</param>
+        <returns>True if the FilePath in the given FileEntry exists on disk. False otherwise.</returns>
+        """
+        if not os.path.exists(FileEntry.FilePath):
+            return False
+
+        return os.path.exists(FileEntry.HeaderPath)
+
+    @staticmethod
+    def ReadCSVFileColumnNames (FileEntry):
+        """<summary>
+        
+        </summary>
+        <param name="FileEntry"></param>
+        <param name="FileEntry"></param>
+        <returns></returns>
+        """
+
+        # 2. Read the header line of the CSV File.
+        CSVFileReader = open(FileEntry.HeaderPath)
+        HeaderRow = CSVFileReader.readline()
+
+        # 3. Extract the comma-separated columns names of the CSV File from its header line.
+        # Strip empty spaces around column names.
+        ColumnNames = HeaderRow.split(',')
+        FileEntry.ColumnNames = []
+        for ColumnName in ColumnNames:
+            FileEntry.ColumnNames.append(ColumnName.strip())
+
+        CSVFileReader.close()
+
+        return FileEntry
+
+    @staticmethod
+    def IsMatchCSVFileColumnNames(FileEntry):
+        """<summary>
+        Checks if the correct list of column headers is present for the CSV file
+        to match the table
+        </summary>
+        <param name="FileEntry">FileEntry for CSV File whose column headers to test</param>
+        <returns>True if the column headers present in the CSV File are the same as the 
+        expected table columns. False otherwise.</returns>
+        """
+      
+        # determine expected columns
+        ExpectedColumns = None
+
+        ExpectedColumnsLookup = {"P2DETECTION": \
+                                     LoadConstants.EXPECTED_DETECTION_COLS,
+                                 "P2FRAMEMETA": \
+                                     LoadConstants.EXPECTED_FRAME_META_COLS,
+                                 "P2IMAGEMETA": \
+                                     LoadConstants.EXPECTED_IMAGE_META_COLS,
+                                 }
+        if FileEntry.TargetTable.upper() in ExpectedColumnsLookup:
+            ExpectedColumns = \
+                ExpectedColumnsLookup[FileEntry.TargetTable.upper()]
+        else:
+            return False
+            
+        # test if the expected and present column name counts are the same
+        if len(ExpectedColumns) != len(FileEntry.ColumnNames):
+            return False
+
+        # test of all expected names exist in the columns present
+        for ColumnName in ExpectedColumns:
+            if ColumnName not in FileEntry.ColumnNames:
+                return False
+
+        # all columns match
+        return True;
+    #endregion
+
+    #region Loading Section
+    @staticmethod
+    def CreateEmptyLoadDB(JobID):
+        """<summary>
+        
+        </summary>
+        <param name="JobID"></param>
+        <returns></returns>
+        """
+
+        # initialize database entry for storing database properties
+        DBEntry = LoadAppLogic.DatabaseEntry()
+        DBEntry.DBName = JobID + "_LoadDB"
+        DBEntry.DBGuid = str(uuid.uuid4())
+        DBEntry.ConnectionString = {'host': LoadAppLogic.SQL_SERVER,
+                                    'user': LoadAppLogic.SQL_USER,
+                                    'passwd': LoadAppLogic.SQL_PASSWORD,
+                                    }
+
+        # initialize Sql Connection String to sql server
+        SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+
+        # Create empty database instance
+        SqlCur = SqlConn.cursor()
+        SqlCur.execute("CREATE DATABASE " + DBEntry.DBName)
+        DBEntry.ConnectionString['db'] = DBEntry.DBName
+
+        # update Sql Connection String to new create tables
+        SqlCur = SqlConn.cursor()
+        SqlCur.execute("use %s" % DBEntry.DBName)
+        SqlCur.execute(LoadSql.CREATE_DETECTION_TABLE)
+        SqlCur.execute(LoadSql.CREATE_FRAME_META_TABLE)
+        SqlCur.execute(LoadSql.CREATE_IMAGE_META_TABLE)
+        SqlCur.close()
+        SqlConn.close()
+
+        return DBEntry
+    
+    # derby bulk load: SYSCS_UTIL.SYSCS_IMPORT_TABLE
+    @staticmethod
+    def LoadCSVFileIntoTable(DBEntry, FileEntry):
+        """<summary>
+        Loads a CSV File into an existing table using Sql BULK INSERT command
+        </summary>
+        <param name="DBEntry">Database into which to load the CSV file</param>
+        <param name="FileEntry">File to be bulk loaded into database table</param>
+        <returns>True if the bulk load ran without exceptions. False otherwise.</returns>
+        """
+        try:
+            # connect to database instance
+            SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+            SqlCur = SqlConn.cursor()
+            # execute bulk insert command
+            SqlCur.execute(("LOAD DATA INFILE %%s INTO TABLE %s "
+                            "FIELDS TERMINATED BY ','") % \
+                               FileEntry.TargetTable, 
+                           (FileEntry.FilePath,))
+            SqlCur.close()
+            SqlConn.close()
+        except Exception, e:
+            # print e
+            # bulk insert failed
+            SqlCur.close()
+            SqlConn.close()
+            return False
+        # bulk insert success
+        return True
+
+    @staticmethod
+    def UpdateComputedColumns(DBEntry, FileEntry):
+        """<summary>
+        
+        </summary>
+        <param name="DBEntry"></param>
+        <param name="FileEntry"></param>
+        """
+
+        def P2Detection(SqlCur):
+            # Update ZoneID
+            SqlCur.execute('UPDATE P2Detection '
+                           'SET zoneID = (`dec`+(90.0))/(0.0083333)')
+            # Update cx
+            SqlCur.execute('UPDATE P2Detection '
+                           'SET cx = (COS(RADIANS(`dec`))*COS(RADIANS(ra)))')
+            # Update cy
+            SqlCur.execute('UPDATE P2Detection '
+                           'SET cy = COS(RADIANS(`dec`))*SIN(RADIANS(ra))')
+            # Update cz
+            SqlCur.execute('UPDATE P2Detection '
+                           'SET cz = (SIN(RADIANS(`dec`)))')
+
+        def P2FrameMeta(SqlCur):
+            # No columns to be updated for FrameMeta
+            pass
+
+        def P2ImageMeta(SqlCur):
+            # No columns to be updated for ImageMeta
+            pass
+
+        TargetTableLookup = {"P2DETECTION": P2Detection,
+                             "P2FRAMEMETA": P2FrameMeta,
+                             "P2IMAGEMETA": P2ImageMeta,
+                             }
+            
+        try:
+            # connect to database instance
+            SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+            SqlCur = SqlConn.cursor()
+            if FileEntry.TargetTable.upper() in TargetTableLookup:
+                TargetTableLookup[FileEntry.TargetTable.upper()](SqlCur)
+            else:
+                # none of the table types matches...invalid
+                SqlCur.close()
+                SqlConn.close()
+                return False
+
+        except Exception, e:
+            print e
+            # update column failed
+            SqlCur.close()
+            SqlConn.close()
+            return False
+        # update column success
+        return True
+
+    #endregion
+
+    #region Post-Load Checks
+    @staticmethod
+    def IsMatchTableRowCount(DBEntry, FileEntry):
+        """<summary>
+        
+        </summary>
+        <param name="DBEntry"></param>
+        <param name="FileEntry"></param>
+        <returns></returns>
+        """
+
+        # does the number of rows expected match the number of rows loaded
+        SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+        SqlCur = SqlConn.cursor()
+        # execute row count command
+        SqlCur.execute("SELECT COUNT(*) FROM %s" % FileEntry.TargetTable)
+        RowCount = SqlCur.fetchone()[0]
+        SqlCur.close()
+        SqlConn.close()
+        # check if row count matches expected row count
+        return RowCount == FileEntry.RowCount
+
+    @staticmethod
+    def IsMatchTableColumnRanges(DBEntry, FileEntry):
+        """<summary>
+        
+        </summary>
+        <param name="DBEntry"></param>
+        <param name="FileEntry"></param>
+        <returns></returns>
+        """
+      
+        # determine expected column ranges
+        ExpectedColumnRanges = None
+        ExpectedColumnRangesLookup = \
+            {"P2DETECTION": LoadConstants.EXPECTED_DETECTION_COL_RANGES,
+             "P2FRAMEMETA": [],
+             "P2IMAGEMETA": [],
+             }
+        if FileEntry.TargetTable.upper() in ExpectedColumnRangesLookup:
+            ExpectedColumnRanges = \
+                ExpectedColumnRangesLookup[FileEntry.TargetTable.upper()]
+        else:
+            # none of the table types matches...invalid
+            return False
+
+        # connect to database instance
+        SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+        SqlCur = SqlConn.cursor()
+        
+        # For each column in available list, test if rows in table fall 
+        # outside expected range
+        for Column in ExpectedColumnRanges:
+            # build SQL command for error count
+            SqlCur.execute("SELECT COUNT(*) FROM %s "
+                           "WHERE (%s < %s OR %s > %s) AND %s != -999" % \
+                               (FileEntry.TargetTable, Column.ColumnName,
+                                Column.MinValue, Column.ColumnName, 
+                                Column.MaxValue, Column.ColumnName))
+
+            ErrorCount = SqlCur.fetchone()[0]
+            if ErrorCount > 0:
+                print "ERROR COUNT", ErrorCount
+                SqlCur.close()
+                SqlConn.close()
+                return False
+
+        SqlCur.close()
+        SqlConn.close()
+
+        return True # no range errors found
+
+    @staticmethod
+    def CompactDatabase(DBEntry):
+        """<summary>
+        
+        </summary>
+        <param name="DBEntry"></param>
+        """
+
+        # Shrink database instance
+        SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+        SqlCur = SqlConn.cursor()
+        
+        SqlCur.execute("SHOW TABLES")
+        SqlTables = SqlCur.fetchall()
+        for SqlTable in SqlTables:
+            SqlCur.execute("OPTIMIZE TABLE %s" % SqlTable)
+        SqlCur.close()
+        SqlConn.close()
+
+    #endregion
+
+    #region Histogram
+    @staticmethod
+    def DetectionsHistogram(DBEntry, HighQuality=False):
+        SqlConn = MySQLdb.connect(**DBEntry.ConnectionString)
+        SqlCur = SqlConn.cursor()
+        if HighQuality:
+            where_clause = "WHERE raErr < 0.1 and decErr < 0.05 "
+        else:
+            where_clause = ""
+
+        SqlCur.execute("SELECT ceiling(zoneId/10) as zoneGroup, " 
+                       "count(*) as detectionCount FROM P2Detection "
+                       "%s"
+                       "GROUP BY ceiling(zoneId/10) "
+                       "ORDER BY ceiling(zoneId/10)" % where_clause)
+        return SqlCur.fetchall()
diff --git a/contrib/pc3/info/ipaw/pc3/LoadConstants.py b/contrib/pc3/info/ipaw/pc3/LoadConstants.py
new file mode 100644
index 0000000..f9b2928
--- /dev/null
+++ b/contrib/pc3/info/ipaw/pc3/LoadConstants.py
@@ -0,0 +1,19 @@
+
+
+
+class LoadConstants(object): 
+    EXPECTED_TABLES = ["P2Detection", "P2FrameMeta", "P2ImageMeta"]
+    EXPECTED_DETECTION_COLS = ["objID", "detectID", "ippObjID", "ippDetectID", "filterID", "imageID", "obsTime", "xPos", "yPos", "xPosErr", "yPosErr", "instFlux", "instFluxErr", "psfWidMajor", "psfWidMinor", "psfTheta", "psfLikelihood", "psfCf", "infoFlag", "htmID", "zoneID", "assocDate", "modNum", "ra", "dec", "raErr", "decErr", "cx", "cy", "cz", "peakFlux", "calMag", "calMagErr", "calFlux", "calFluxErr", "calColor", "calColorErr", "sky", "skyErr", "sgSep", "dataRelease"]
+    EXPECTED_FRAME_META_COLS = ["frameID", "surveyID", "filterID", "cameraID", "telescopeID", "analysisVer", "p1Recip", "p2Recip", "p3Recip", "nP2Images", "astroScat", "photoScat", "nAstRef", "nPhoRef", "expStart", "expTime", "airmass", "raBore", "decBore"]
+    EXPECTED_IMAGE_META_COLS = ["imageID", "frameID", "ccdID", "photoCalID", "filterID", "bias", "biasScat", "sky", "skyScat", "nDetect", "magSat", "completMag", "astroScat", "photoScat", "nAstRef", "nPhoRef", "nx", "ny", "psfFwhm", "psfModelID", "psfSigMajor", "psfSigMinor", "psfTheta", "psfExtra1", "psfExtra2", "apResid", "dapResid", "detectorID", "qaFlags", "detrend1", "detrend2", "detrend3", "detrend4", "detrend5", "detrend6", "detrend7", "detrend8", "photoZero", "photoColor", "proje [...]
+
+    class ColumnRange(object):
+        def __init__(self, ColumnName_, MinValue_, MaxValue_):
+            self.ColumnName = ColumnName_
+            self.MinValue = MinValue_
+            self.MaxValue = MaxValue_
+
+    EXPECTED_DETECTION_COL_RANGES = [ColumnRange("ra", "0", "360"),
+                                     ColumnRange("\"dec\"", "-90", "90"),
+                                     ColumnRange("raErr", "-2000", "9"),
+                                     ColumnRange("decErr", "0", "9"),]
diff --git a/contrib/pc3/info/ipaw/pc3/LoadSql.py b/contrib/pc3/info/ipaw/pc3/LoadSql.py
new file mode 100644
index 0000000..7b16093
--- /dev/null
+++ b/contrib/pc3/info/ipaw/pc3/LoadSql.py
@@ -0,0 +1,147 @@
+class LoadSql(object):
+
+    CREATE_DETECTION_TABLE = \
+    """
+CREATE TABLE P2Detection(
+    `objID` bigint NOT NULL,
+    detectID bigint NOT NULL,
+    ippObjID bigint NOT NULL,
+    ippDetectID bigint NOT NULL,
+    filterID smallint NOT NULL,
+    imageID bigint NOT NULL,
+    obsTime float NOT NULL DEFAULT -999,
+    xPos real NOT NULL DEFAULT -999,
+    yPos real NOT NULL DEFAULT -999,
+    xPosErr real NOT NULL DEFAULT -999,
+    yPosErr real NOT NULL DEFAULT -999,
+    instFlux real NOT NULL DEFAULT -999,
+    instFluxErr real NOT NULL DEFAULT -999,
+    psfWidMajor real NOT NULL DEFAULT -999,
+    psfWidMinor real NOT NULL DEFAULT -999,
+    psfTheta real NOT NULL DEFAULT -999,
+    psfLikelihood real NOT NULL DEFAULT -999,
+    psfCf real NOT NULL DEFAULT -999,
+    infoFlag int NOT NULL DEFAULT -999,
+    htmID float NOT NULL DEFAULT -999,
+    zoneID float NOT NULL DEFAULT -999,
+    assocDate date NOT NULL DEFAULT '28881231',
+    modNum smallint NOT NULL DEFAULT 0,
+    ra float NOT NULL,
+    `dec` float NOT NULL,
+    raErr real NOT NULL DEFAULT 0,
+    decErr real NOT NULL DEFAULT 0,
+    cx float NOT NULL DEFAULT -999,
+    cy float NOT NULL DEFAULT -999,
+    cz float NOT NULL DEFAULT -999,
+    peakFlux real NOT NULL DEFAULT -999,
+    calMag real NOT NULL DEFAULT -999,
+    calMagErr real NOT NULL DEFAULT -999,
+    calFlux real NOT NULL DEFAULT -999,
+    calFluxErr real NOT NULL DEFAULT -999,
+    calColor real NOT NULL DEFAULT -999,
+    calColorErr real NOT NULL DEFAULT -999,
+    sky real NOT NULL DEFAULT -999,
+    skyErr real NOT NULL DEFAULT -999,
+    sgSep real NOT NULL DEFAULT -999,
+    dataRelease smallint NOT NULL,
+ CONSTRAINT PK_P2Detection_objID_detectID PRIMARY KEY
+(
+    `objID`,
+    detectID
+))
+"""
+
+    CREATE_FRAME_META_TABLE = \
+    """
+CREATE TABLE P2FrameMeta(
+    frameID int NOT NULL PRIMARY KEY,
+    surveyID smallint NOT NULL,
+    filterID smallint NOT NULL,
+    cameraID smallint NOT NULL,
+    telescopeID smallint NOT NULL,
+    analysisVer smallint NOT NULL,
+    p1Recip smallint NOT NULL DEFAULT -999,
+    p2Recip smallint NOT NULL DEFAULT -999,
+    p3Recip smallint NOT NULL DEFAULT -999,
+    nP2Images smallint NOT NULL DEFAULT -999,
+    astroScat real NOT NULL DEFAULT -999,
+    photoScat real NOT NULL DEFAULT -999,
+    nAstRef int NOT NULL DEFAULT -999,
+    nPhoRef int NOT NULL DEFAULT -999,
+    expStart float NOT NULL DEFAULT -999,
+    expTime real NOT NULL DEFAULT -999,
+    airmass real NOT NULL DEFAULT -999,
+    raBore float NOT NULL DEFAULT -999,
+    decBore float NOT NULL DEFAULT -999
+)
+"""
+
+    CREATE_IMAGE_META_TABLE = \
+    """
+CREATE TABLE P2ImageMeta(
+    imageID bigint NOT NULL PRIMARY KEY,
+    frameID int NOT NULL,
+    ccdID smallint NOT NULL,
+    photoCalID int NOT NULL,
+    filterID smallint NOT NULL,
+    bias real NOT NULL DEFAULT -999,
+    biasScat real NOT NULL DEFAULT -999,
+    sky real NOT NULL DEFAULT -999,
+    skyScat real NOT NULL DEFAULT -999,
+    nDetect int NOT NULL DEFAULT -999,
+    magSat real NOT NULL DEFAULT -999,
+    completMag real NOT NULL DEFAULT -999,
+    astroScat real NOT NULL DEFAULT -999,
+    photoScat real NOT NULL DEFAULT -999,
+    nAstRef int NOT NULL DEFAULT -999,
+    nPhoRef int NOT NULL DEFAULT -999,
+    nx smallint NOT NULL DEFAULT -999,
+    ny smallint NOT NULL DEFAULT -999,
+    psfFwhm real NOT NULL DEFAULT -999,
+    psfModelID int NOT NULL DEFAULT -999,
+    psfSigMajor real NOT NULL DEFAULT -999,
+    psfSigMinor real NOT NULL DEFAULT -999,
+    psfTheta real NOT NULL DEFAULT -999,
+    psfExtra1 real NOT NULL DEFAULT -999,
+    psfExtra2 real NOT NULL DEFAULT -999,
+    apResid real NOT NULL DEFAULT -999,
+    dapResid real NOT NULL DEFAULT -999,
+    detectorID smallint NOT NULL DEFAULT -999,
+    qaFlags int NOT NULL DEFAULT -999,
+    detrend1 bigint NOT NULL DEFAULT -999,
+    detrend2 bigint NOT NULL DEFAULT -999,
+    detrend3 bigint NOT NULL DEFAULT -999,
+    detrend4 bigint NOT NULL DEFAULT -999,
+    detrend5 bigint NOT NULL DEFAULT -999,
+    detrend6 bigint NOT NULL DEFAULT -999,
+    detrend7 bigint NOT NULL DEFAULT -999,
+    detrend8 bigint NOT NULL DEFAULT -999,
+    photoZero real NOT NULL DEFAULT -999,
+    photoColor real NOT NULL DEFAULT -999,
+    projection1 varchar(8000) NOT NULL DEFAULT '-999',
+    projection2 varchar(8000) NOT NULL DEFAULT '-999',
+    crval1 float NOT NULL DEFAULT -999,
+    crval2 float NOT NULL DEFAULT -999,
+    crpix1 float NOT NULL DEFAULT -999,
+    crpix2 float NOT NULL DEFAULT -999,
+    pc001001 float NOT NULL DEFAULT -999,
+    pc001002 float NOT NULL DEFAULT -999,
+    pc002001 float NOT NULL DEFAULT -999,
+    pc002002 float NOT NULL DEFAULT -999,
+    polyOrder int NOT NULL DEFAULT -999,
+    pca1x3y0 float NOT NULL DEFAULT -999,
+    pca1x2y1 float NOT NULL DEFAULT -999,
+    pca1x1y2 float NOT NULL DEFAULT -999,
+    pca1x0y3 float NOT NULL DEFAULT -999,
+    pca1x2y0 float NOT NULL DEFAULT -999,
+    pca1x1y1 float NOT NULL DEFAULT -999,
+    pca1x0y2 float NOT NULL DEFAULT -999,
+    pca2x3y0 float NOT NULL DEFAULT -999,
+    pca2x2y1 float NOT NULL DEFAULT -999,
+    pca2x1y2 float NOT NULL DEFAULT -999,
+    pca2x0y3 float NOT NULL DEFAULT -999,
+    pca2x2y0 float NOT NULL DEFAULT -999,
+    pca2x1y1 float NOT NULL DEFAULT -999,
+    pca2x0y2 float NOT NULL DEFAULT -999
+)
+"""
diff --git a/contrib/pc3/info/ipaw/pc3/LoadWorkflow.py b/contrib/pc3/info/ipaw/pc3/LoadWorkflow.py
new file mode 100644
index 0000000..97a71cb
--- /dev/null
+++ b/contrib/pc3/info/ipaw/pc3/LoadWorkflow.py
@@ -0,0 +1,112 @@
+from LoadAppLogic import LoadAppLogic
+
+class LoadWorkflow(object):
+    @staticmethod
+    def run(args):
+        JobID, CSVRootPath = args[1:3]
+        
+
+        # /////////////////////////////////////
+        # //////   Batch Initialization  //////
+        # /////////////////////////////////////
+        
+        # 1. IsCSVReadyFileExists
+        IsCSVReadyFileExistsOutput = \
+            LoadAppLogic.IsCSVReadyFileExists(CSVRootPath)
+
+        # 2. Control Flow: Decision
+        if not IsCSVReadyFileExistsOutput:
+            raise Exception("IsCSVReadyFileExists failed")
+
+
+        # 3. ReadCSVReadyFile
+        ReadCSVReadyFileOutput = LoadAppLogic.ReadCSVReadyFile(CSVRootPath)
+
+
+        # 4. IsMatchCSVFileTables
+        IsMatchCSVFileTablesOutput = \
+            LoadAppLogic.IsMatchCSVFileTables(ReadCSVReadyFileOutput)
+        # 5. Control Flow: Decision
+        if not IsMatchCSVFileTablesOutput:
+            raise Exception("IsMatchCSVFileTables failed")
+
+
+        # 6. CreateEmptyLoadDB
+        CreateEmptyLoadDBOutput = LoadAppLogic.CreateEmptyLoadDB(JobID)
+
+
+        # 7. Control Flow: Loop. ForEach LoadAppLogic.CSVFileEntry 
+        # in ReadCSVReadyFileOutput Do...
+        for FileEntry in ReadCSVReadyFileOutput:
+        
+            # /////////////////////////////////////
+            # //////   Pre Load Validation   //////
+            # /////////////////////////////////////
+            # 7.a. IsExistsCSVFile
+            IsExistsCSVFileOutput = LoadAppLogic.IsExistsCSVFile(FileEntry)
+            # 7.b. Control Flow: Decision
+            if not IsExistsCSVFileOutput:
+                raise Exception("IsExistsCSVFile failed")
+
+
+            # 7.c. ReadCSVFileColumnNames
+            ReadCSVFileColumnNamesOutput = \
+                LoadAppLogic.ReadCSVFileColumnNames(FileEntry)
+
+
+            # 7.d. IsMatchCSVFileColumnNames
+            IsMatchCSVFileColumnNamesOutput = \
+                LoadAppLogic.IsMatchCSVFileColumnNames(ReadCSVFileColumnNamesOutput)
+            # 7.e. Control Flow: Decision
+            if not IsMatchCSVFileColumnNamesOutput:
+                raise Exception("IsMatchCSVFileColumnNames failed")
+
+
+            # /////////////////////////////////////
+            # //////        Load File        //////
+            # /////////////////////////////////////
+            # 7.f. LoadCSVFileIntoTable
+            IsLoadedCSVFileIntoTableOutput = \
+                LoadAppLogic.LoadCSVFileIntoTable(CreateEmptyLoadDBOutput, 
+                                                  ReadCSVFileColumnNamesOutput)
+            # 7.g. Control Flow: Decision
+            if not IsLoadedCSVFileIntoTableOutput:
+                raise Exception("LoadCSVFileIntoTable failed")
+
+
+            # 7.h. UpdateComputedColumns
+            IsUpdatedComputedColumnsOutput = \
+                LoadAppLogic.UpdateComputedColumns(CreateEmptyLoadDBOutput, 
+                                                   ReadCSVFileColumnNamesOutput)
+            # 7.i. Control Flow: Decision
+            if not IsUpdatedComputedColumnsOutput:
+                raise Exception("UpdateComputedColumns failed")
+
+
+            # /////////////////////////////////////
+            # //////   PostLoad Validation   //////
+            # /////////////////////////////////////
+            # 7.j. IsMatchTableRowCount
+            IsMatchTableRowCountOutput = \
+                LoadAppLogic.IsMatchTableRowCount(CreateEmptyLoadDBOutput, 
+                                                  ReadCSVFileColumnNamesOutput)
+            # 7.k. Control Flow: Decision
+            if not IsMatchTableRowCountOutput:
+                raise Exception("IsMatchTableRowCount failed")
+
+
+            # 7.l. IsMatchTableColumnRanges
+            IsMatchTableColumnRangesOutput = \
+                LoadAppLogic.IsMatchTableColumnRanges(CreateEmptyLoadDBOutput, 
+                                                      ReadCSVFileColumnNamesOutput)
+            # 7.m. Control Flow: Decision
+            if not IsMatchTableColumnRangesOutput:
+                raise Exception("IsMatchTableColumnRanges failed")
+
+
+        # 8. CompactDatabase
+        LoadAppLogic.CompactDatabase(CreateEmptyLoadDBOutput)
+
+if __name__ == '__main__':
+    import sys
+    LoadWorkflow.run(sys.argv)
diff --git a/contrib/pc3/info/ipaw/pc3/__init__.py b/contrib/pc3/info/ipaw/pc3/__init__.py
new file mode 100644
index 0000000..2ae2839
--- /dev/null
+++ b/contrib/pc3/info/ipaw/pc3/__init__.py
@@ -0,0 +1 @@
+pass
diff --git a/contrib/pc3/workflow.vt b/contrib/pc3/workflow.vt
new file mode 100644
index 0000000..f363513
Binary files /dev/null and b/contrib/pc3/workflow.vt differ
diff --git a/contrib/pc3/workflow_ifs.vt b/contrib/pc3/workflow_ifs.vt
new file mode 100644
index 0000000..d4a0609
Binary files /dev/null and b/contrib/pc3/workflow_ifs.vt differ
diff --git a/contrib/pc3/workflow_log.xml b/contrib/pc3/workflow_log.xml
new file mode 100644
index 0000000..7f3459e
--- /dev/null
+++ b/contrib/pc3/workflow_log.xml
@@ -0,0 +1,74 @@
+<log id="" name="" version="1.0.0" vistrail_id="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/log.xsd">
+  <workflowExec completed="1" id="1" ip="155.98.20.78" name="" parentId="" parentType="vistrail" parentVersion="121" session="9" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:46" user="koop" vtVersion="1.2">
+    <moduleExec cached="0" completed="1" error="" id="1" machine_id="1" moduleId="12" moduleName="String" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+    <moduleExec cached="0" completed="1" error="" id="2" machine_id="1" moduleId="13" moduleName="ConcatenateString" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+    <moduleExec cached="0" completed="1" error="" id="3" machine_id="1" moduleId="2" moduleName="GetCSVFiles" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+      <annotation id="1" key="used_files" value="['/vistrails/pc3/SampleData/J062945/csv_ready.csv']" />
+    </moduleExec>
+    <moduleExec cached="0" completed="1" error="" id="4" machine_id="1" moduleId="4" moduleName="CreateEmptyLoadDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+    <moduleExec cached="0" completed="1" error="" id="5" machine_id="1" moduleId="8" moduleName="Map" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+      <loopExec completed="1" error="" id="6" iteration="0" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="7" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+            <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+        </groupExec>
+      </loopExec>
+      <loopExec completed="1" error="" id="14" iteration="1" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="15" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+            <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="21" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+        </groupExec>
+      </loopExec>
+      <loopExec completed="1" error="" id="22" iteration="2" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="23" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+          <moduleExec cached="0" completed="1" error="" id="24" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="25" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="26" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="10" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="27" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:47" tsStart="2009-05-14 16:51:46">
+            <annotation id="11" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv']" />
+            <annotation id="12" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="28" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:47">
+            <annotation id="13" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="29" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48" />
+        </groupExec>
+      </loopExec>
+    </moduleExec>
+    <moduleExec cached="0" completed="1" error="" id="30" machine_id="1" moduleId="26" moduleName="If" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48" />
+    <moduleExec cached="0" completed="1" error="" id="31" machine_id="1" moduleId="21" moduleName="CompactDatabase" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48">
+      <annotation id="14" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection'), ({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMet [...]
+    </moduleExec>
+    <moduleExec cached="0" completed="1" error="" id="32" machine_id="1" moduleId="28" moduleName="DetectionsHistogram" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49">
+      <annotation id="15" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+    </moduleExec>
+    <moduleExec cached="0" completed="1" error="" id="33" machine_id="1" moduleId="29" moduleName="MplPlot" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49" />
+    <moduleExec cached="0" completed="1" error="" id="34" machine_id="1" moduleId="30" moduleName="MplFigure" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49" />
+    <moduleExec cached="0" completed="1" error="" id="35" machine_id="1" moduleId="31" moduleName="MplFigureCell" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49" />
+  </workflowExec>
+  <machine architecture="32" id="1" name="vgc-g5c.sci.utah.edu" os="Darwin" processor="powerpc" ram="4294967296" />
+</log>
diff --git a/contrib/pc3/workflow_log_err.xml b/contrib/pc3/workflow_log_err.xml
new file mode 100644
index 0000000..b2e24c1
--- /dev/null
+++ b/contrib/pc3/workflow_log_err.xml
@@ -0,0 +1,49 @@
+<log id="" name="" version="1.0.0" vistrail_id="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/log.xsd">
+  <workflowExec completed="-1" id="1" ip="155.98.20.78" name="" parentId="" parentType="vistrail" parentVersion="121" session="9" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" user="koop" vtVersion="1.2">
+    <moduleExec cached="0" completed="1" error="" id="1" machine_id="1" moduleId="12" moduleName="String" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+    <moduleExec cached="0" completed="1" error="" id="2" machine_id="1" moduleId="13" moduleName="ConcatenateString" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+    <moduleExec cached="0" completed="1" error="" id="3" machine_id="1" moduleId="2" moduleName="GetCSVFiles" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+      <annotation id="1" key="used_files" value="['/vistrails/pc3/SampleData/J062945/csv_ready.csv']" />
+    </moduleExec>
+    <moduleExec cached="0" completed="1" error="" id="4" machine_id="1" moduleId="4" moduleName="CreateEmptyLoadDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+    <moduleExec cached="0" completed="-1" error="Error inside map: Error(s) inside group:
+ComputeColumns: IsMatchTableRowCount failed" id="5" machine_id="1" moduleId="8" moduleName="Map" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+      <loopExec completed="1" error="" id="6" iteration="0" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="7" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+            <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+        </groupExec>
+      </loopExec>
+      <loopExec completed="-1" error="Error(s) inside group:
+ComputeColumns: IsMatchTableRowCount failed" id="14" iteration="1" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+        <groupExec cached="0" completed="-1" error="Error(s) inside group:
+ComputeColumns: IsMatchTableRowCount failed" groupName="Group" groupType="Group" id="15" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+            <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="-1" error="IsMatchTableRowCount failed" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+        </groupExec>
+      </loopExec>
+    </moduleExec>
+  </workflowExec>
+  <machine architecture="32" id="1" name="vgc-g5c.sci.utah.edu" os="Darwin" processor="powerpc" ram="4294967296" />
+</log>
diff --git a/contrib/pc3/workflow_opm.xml b/contrib/pc3/workflow_opm.xml
new file mode 100644
index 0000000..968e4b4
--- /dev/null
+++ b/contrib/pc3/workflow_opm.xml
@@ -0,0 +1,1379 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<opmGraph xmlns="http://openprovenance.org/model/v1.01.a">
+  <accounts>
+    <account id="acct0">
+      <value>0</value>
+    </account>
+    <account id="acct1">
+      <value>1</value>
+    </account>
+    <account id="acct2">
+      <value>2</value>
+    </account>
+    <overlaps>
+      <account id="acct0" />
+      <account id="acct1" />
+    </overlaps>
+    <overlaps>
+      <account id="acct0" />
+      <account id="acct2" />
+    </overlaps>
+    <overlaps>
+      <account id="acct1" />
+      <account id="acct2" />
+    </overlaps>
+  </accounts>
+  <processes>
+    <process id="p0">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="1" machine_id="1" moduleId="12" moduleName="String" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p1">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="2" machine_id="1" moduleId="13" moduleName="ConcatenateString" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p2">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="3" machine_id="1" moduleId="2" moduleName="GetCSVFiles" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="1" key="used_files" value="['/vistrails/pc3/SampleData/J062945/csv_ready.csv']" />
+        </moduleExec>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p3">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="4" machine_id="1" moduleId="4" moduleName="CreateEmptyLoadDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p4">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="5" machine_id="1" moduleId="8" moduleName="Map" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+          <loopExec completed="1" error="" id="6" iteration="0" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="7" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+              <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+              <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+              <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+                <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+            </groupExec>
+          </loopExec>
+          <loopExec completed="1" error="" id="14" iteration="1" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="15" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+              <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+              <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+              <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+                <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="21" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+            </groupExec>
+          </loopExec>
+          <loopExec completed="1" error="" id="22" iteration="2" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+            <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="23" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+              <moduleExec cached="0" completed="1" error="" id="24" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+              <moduleExec cached="0" completed="1" error="" id="25" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+              <moduleExec cached="0" completed="1" error="" id="26" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+                <annotation id="10" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv.hdr']" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="27" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:47" tsStart="2009-05-14 16:51:46">
+                <annotation id="11" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv']" />
+                <annotation id="12" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="28" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:47">
+                <annotation id="13" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="29" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48" />
+            </groupExec>
+          </loopExec>
+        </moduleExec>
+      </value>
+      <account id="acct0" />
+    </process>
+    <process id="p5">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="30" machine_id="1" moduleId="26" moduleName="If" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p6">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="31" machine_id="1" moduleId="21" moduleName="CompactDatabase" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48">
+          <annotation id="14" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection'), ({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Fram [...]
+        </moduleExec>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p7">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="32" machine_id="1" moduleId="28" moduleName="DetectionsHistogram" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49">
+          <annotation id="15" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+        </moduleExec>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p8">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="33" machine_id="1" moduleId="29" moduleName="MplPlot" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p9">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="34" machine_id="1" moduleId="30" moduleName="MplFigure" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p10">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="35" machine_id="1" moduleId="31" moduleName="MplFigureCell" tsEnd="2009-05-14 16:51:49" tsStart="2009-05-14 16:51:49" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p11">
+      <value>
+        <moduleExec cached="" completed="1" error="" id="-1" machine_id="" moduleId="-1" moduleName="Split" tsEnd="" tsStart="" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p12">
+      <value>
+        <moduleExec cached="" completed="1" error="" id="-1" machine_id="" moduleId="-1" moduleName="Join" tsEnd="" tsStart="" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p13">
+      <value>
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="7" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+            <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+        </groupExec>
+      </value>
+      <account id="acct1" />
+    </process>
+    <process id="p14">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p15">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p16">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p17">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+          <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p18">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p19">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p20">
+      <value>
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="15" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+            <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="21" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+        </groupExec>
+      </value>
+      <account id="acct1" />
+    </process>
+    <process id="p21">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p22">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p23">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p24">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+          <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p25">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p26">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="21" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p27">
+      <value>
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="23" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:46">
+          <moduleExec cached="0" completed="1" error="" id="24" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="25" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+          <moduleExec cached="0" completed="1" error="" id="26" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+            <annotation id="10" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="27" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:47" tsStart="2009-05-14 16:51:46">
+            <annotation id="11" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv']" />
+            <annotation id="12" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="28" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:47">
+            <annotation id="13" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="29" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48" />
+        </groupExec>
+      </value>
+      <account id="acct1" />
+    </process>
+    <process id="p28">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="24" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p29">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="25" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p30">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="26" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:51:46" tsStart="2009-05-14 16:51:46">
+          <annotation id="10" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv.hdr']" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p31">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="27" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:51:47" tsStart="2009-05-14 16:51:46">
+          <annotation id="11" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv']" />
+          <annotation id="12" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p32">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="28" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:47">
+          <annotation id="13" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2Detection')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p33">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="29" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:51:48" tsStart="2009-05-14 16:51:48" />
+      </value>
+      <account id="acct2" />
+    </process>
+  </processes>
+  <artifacts>
+    <artifact id="a0">
+      <value>
+        <function id="4" name="value" pos="0">
+          <parameter alias="" id="17" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a1">
+      <value>
+        <portSpec id="8" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a2">
+      <value>
+        <function id="5" name="str1" pos="0">
+          <parameter alias="" id="12" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="/vistrails/pc3/SampleData/" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a3">
+      <value>
+        <portSpec id="29" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a4">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/csv_ready.csv" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a5">
+      <value>
+        <portSpec id="142" name="csvFiles" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a6">
+      <value>
+        <portSpec id="140" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a7">
+      <value>
+        <portSpec id="80" name="Result" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a8">
+      <value>
+        <portSpec id="-1" name="csvFile" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a9">
+      <value>
+        <portSpec id="-1" name="dbEntry" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a10">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a11">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a12">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a13">
+      <value>
+        <portSpec id="121" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a14">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a15">
+      <value>
+        <function id="-1" name="dbEntry" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="{'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945_LoadDB" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="P2FrameMeta" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a16">
+      <value>
+        <portSpec id="114" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a17">
+      <value>
+        <portSpec id="119" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a18">
+      <value>
+        <portSpec id="-1" name="csvFile" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a19">
+      <value>
+        <portSpec id="-1" name="dbEntry" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a20">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a21">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a22">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a23">
+      <value>
+        <portSpec id="121" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a24">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a25">
+      <value>
+        <function id="-1" name="dbEntry" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="{'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945_LoadDB" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="P2ImageMeta" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a26">
+      <value>
+        <portSpec id="114" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a27">
+      <value>
+        <portSpec id="119" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a28">
+      <value>
+        <portSpec id="-1" name="csvFile" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a29">
+      <value>
+        <portSpec id="-1" name="dbEntry" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a30">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a31">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a32">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv.hdr" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a33">
+      <value>
+        <portSpec id="121" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a34">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2Detection.csv" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a35">
+      <value>
+        <function id="-1" name="dbEntry" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="{'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945_LoadDB" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="P2Detection" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a36">
+      <value>
+        <portSpec id="114" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a37">
+      <value>
+        <portSpec id="119" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a38">
+      <value>
+        <portSpec id="134" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a39">
+      <value>
+        <function id="7" name="highQuality" pos="0">
+          <parameter alias="" id="21" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Boolean" val="True" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a40">
+      <value>
+        <portSpec id="130" name="histogram" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a41">
+      <value>
+        <function id="6" name="source" pos="0">
+          <parameter alias="" id="16" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="x%20%3D%20%5Ba%5B1%5D%20for%20a%20in%20histogramData%5D%0Abins%20%3D%20%5Ba%5B0%5D%20for%20a%20in%20histogramData%5D%0A%0Abar%28bins%2C%20x%29%0A" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a42">
+      <value>
+        <portSpec id="98" name="source" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a43">
+      <value>
+        <portSpec id="100" name="FigureManager" optional="0" sigstring="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+  </artifacts>
+  <causalDependencies>
+    <used>
+      <effect id="p0" />
+      <role value="in" />
+      <cause id="a0" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a1" />
+      <role value="out" />
+      <cause id="p0" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p1" />
+      <role value="in" />
+      <cause id="a2" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p1" />
+      <role value="in" />
+      <cause id="a1" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a3" />
+      <role value="out" />
+      <cause id="p1" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p2" />
+      <role value="in" />
+      <cause id="a4" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p2" />
+      <role value="in" />
+      <cause id="a3" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a5" />
+      <role value="out" />
+      <cause id="p2" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p3" />
+      <role value="in" />
+      <cause id="a1" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a6" />
+      <role value="out" />
+      <cause id="p3" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p4" />
+      <role value="in" />
+      <cause id="a5" />
+      <account id="acct0" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a7" />
+      <role value="out" />
+      <cause id="p4" />
+      <account id="acct0" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p11" />
+      <role value="in" />
+      <cause id="a5" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a8" />
+      <role value="out" />
+      <cause id="p11" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p12" />
+      <role value="in" />
+      <cause id="a9" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p13" />
+      <role value="in" />
+      <cause id="a8" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a9" />
+      <role value="out" />
+      <cause id="p13" />
+      <account id="acct1" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p13" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a10" />
+      <role value="out" />
+      <cause id="p14" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p14" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a11" />
+      <role value="out" />
+      <cause id="p15" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p15" />
+      <role value="in" />
+      <cause id="a8" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p16" />
+      <role value="in" />
+      <cause id="a12" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p16" />
+      <role value="in" />
+      <cause id="a11" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a13" />
+      <role value="out" />
+      <cause id="p16" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p17" />
+      <role value="in" />
+      <cause id="a14" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a15" />
+      <role value="out" />
+      <cause id="p17" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p17" />
+      <role value="in" />
+      <cause id="a10" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p17" />
+      <role value="in" />
+      <cause id="a13" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a16" />
+      <role value="out" />
+      <cause id="p17" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p18" />
+      <role value="in" />
+      <cause id="a15" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p18" />
+      <role value="in" />
+      <cause id="a16" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p18" />
+      <role value="in" />
+      <cause id="a13" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a17" />
+      <role value="out" />
+      <cause id="p18" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p19" />
+      <role value="in" />
+      <cause id="a17" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a9" />
+      <role value="out" />
+      <cause id="p19" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <wasGeneratedBy>
+      <effect id="a18" />
+      <role value="out" />
+      <cause id="p11" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p12" />
+      <role value="in" />
+      <cause id="a19" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p20" />
+      <role value="in" />
+      <cause id="a18" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a19" />
+      <role value="out" />
+      <cause id="p20" />
+      <account id="acct1" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p20" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a20" />
+      <role value="out" />
+      <cause id="p21" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p21" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a21" />
+      <role value="out" />
+      <cause id="p22" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p22" />
+      <role value="in" />
+      <cause id="a18" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p23" />
+      <role value="in" />
+      <cause id="a22" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p23" />
+      <role value="in" />
+      <cause id="a21" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a23" />
+      <role value="out" />
+      <cause id="p23" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p24" />
+      <role value="in" />
+      <cause id="a24" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a25" />
+      <role value="out" />
+      <cause id="p24" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p24" />
+      <role value="in" />
+      <cause id="a20" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p24" />
+      <role value="in" />
+      <cause id="a23" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a26" />
+      <role value="out" />
+      <cause id="p24" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p25" />
+      <role value="in" />
+      <cause id="a25" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p25" />
+      <role value="in" />
+      <cause id="a26" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p25" />
+      <role value="in" />
+      <cause id="a23" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a27" />
+      <role value="out" />
+      <cause id="p25" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p26" />
+      <role value="in" />
+      <cause id="a27" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a19" />
+      <role value="out" />
+      <cause id="p26" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <wasGeneratedBy>
+      <effect id="a28" />
+      <role value="out" />
+      <cause id="p11" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p12" />
+      <role value="in" />
+      <cause id="a29" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p27" />
+      <role value="in" />
+      <cause id="a28" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a29" />
+      <role value="out" />
+      <cause id="p27" />
+      <account id="acct1" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p27" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a30" />
+      <role value="out" />
+      <cause id="p28" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p28" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a31" />
+      <role value="out" />
+      <cause id="p29" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p29" />
+      <role value="in" />
+      <cause id="a28" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p30" />
+      <role value="in" />
+      <cause id="a32" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p30" />
+      <role value="in" />
+      <cause id="a31" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a33" />
+      <role value="out" />
+      <cause id="p30" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p31" />
+      <role value="in" />
+      <cause id="a34" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a35" />
+      <role value="out" />
+      <cause id="p31" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p31" />
+      <role value="in" />
+      <cause id="a30" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p31" />
+      <role value="in" />
+      <cause id="a33" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a36" />
+      <role value="out" />
+      <cause id="p31" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p32" />
+      <role value="in" />
+      <cause id="a35" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p32" />
+      <role value="in" />
+      <cause id="a36" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p32" />
+      <role value="in" />
+      <cause id="a33" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a37" />
+      <role value="out" />
+      <cause id="p32" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p33" />
+      <role value="in" />
+      <cause id="a37" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a29" />
+      <role value="out" />
+      <cause id="p33" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <wasGeneratedBy>
+      <effect id="a7" />
+      <role value="out" />
+      <cause id="p12" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p5" />
+      <role value="in" />
+      <cause id="a7" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasTriggeredBy>
+      <effect id="p6" />
+      <role value="control" />
+      <cause id="p5" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasTriggeredBy>
+    <used>
+      <effect id="p6" />
+      <role value="in" />
+      <cause id="a35" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p6" />
+      <role value="in" />
+      <cause id="a15" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p6" />
+      <role value="in" />
+      <cause id="a25" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p6" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a38" />
+      <role value="out" />
+      <cause id="p6" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p7" />
+      <role value="in" />
+      <cause id="a35" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p7" />
+      <role value="in" />
+      <cause id="a39" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p7" />
+      <role value="in" />
+      <cause id="a38" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a40" />
+      <role value="out" />
+      <cause id="p7" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p8" />
+      <role value="in" />
+      <cause id="a41" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p8" />
+      <role value="in" />
+      <cause id="a40" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a42" />
+      <role value="out" />
+      <cause id="p8" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p9" />
+      <role value="in" />
+      <cause id="a42" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a43" />
+      <role value="out" />
+      <cause id="p9" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p10" />
+      <role value="in" />
+      <cause id="a43" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+  </causalDependencies>
+</opmGraph>
diff --git a/contrib/pc3/workflow_opm_err.xml b/contrib/pc3/workflow_opm_err.xml
new file mode 100644
index 0000000..008bbdc
--- /dev/null
+++ b/contrib/pc3/workflow_opm_err.xml
@@ -0,0 +1,756 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<opmGraph xmlns="http://openprovenance.org/model/v1.01.a">
+  <accounts>
+    <account id="acct0">
+      <value>0</value>
+    </account>
+    <account id="acct1">
+      <value>1</value>
+    </account>
+    <account id="acct2">
+      <value>2</value>
+    </account>
+    <overlaps>
+      <account id="acct0" />
+      <account id="acct1" />
+    </overlaps>
+    <overlaps>
+      <account id="acct0" />
+      <account id="acct2" />
+    </overlaps>
+    <overlaps>
+      <account id="acct1" />
+      <account id="acct2" />
+    </overlaps>
+  </accounts>
+  <processes>
+    <process id="p0">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="1" machine_id="1" moduleId="12" moduleName="String" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p1">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="2" machine_id="1" moduleId="13" moduleName="ConcatenateString" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p2">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="3" machine_id="1" moduleId="2" moduleName="GetCSVFiles" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="1" key="used_files" value="['/vistrails/pc3/SampleData/J062945/csv_ready.csv']" />
+        </moduleExec>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p3">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="4" machine_id="1" moduleId="4" moduleName="CreateEmptyLoadDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p4">
+      <value>
+        <moduleExec cached="0" completed="-1" error="Error inside map: Error(s) inside group: ComputeColumns: IsMatchTableRowCount failed" id="5" machine_id="1" moduleId="8" moduleName="Map" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <loopExec completed="1" error="" id="6" iteration="0" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="7" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+              <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+              <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+              <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+                <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+                <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+                <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+                <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+            </groupExec>
+          </loopExec>
+          <loopExec completed="-1" error="Error(s) inside group: ComputeColumns: IsMatchTableRowCount failed" id="14" iteration="1" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <groupExec cached="0" completed="-1" error="Error(s) inside group: ComputeColumns: IsMatchTableRowCount failed" groupName="Group" groupType="Group" id="15" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+              <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+              <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+              <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+                <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+              </moduleExec>
+              <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+                <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+                <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+              </moduleExec>
+              <moduleExec cached="0" completed="-1" error="IsMatchTableRowCount failed" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+                <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+              </moduleExec>
+            </groupExec>
+          </loopExec>
+        </moduleExec>
+      </value>
+      <account id="acct0" />
+    </process>
+    <process id="p5">
+      <value>
+        <moduleExec cached="" completed="1" error="" id="-1" machine_id="" moduleId="-1" moduleName="Split" tsEnd="" tsStart="" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </process>
+    <process id="p6">
+      <value>
+        <groupExec cached="0" completed="1" error="" groupName="Group" groupType="Group" id="7" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+            <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+        </groupExec>
+      </value>
+      <account id="acct1" />
+    </process>
+    <process id="p7">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="8" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p8">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="9" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p9">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="10" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="2" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr']" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p10">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="11" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="3" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv']" />
+          <annotation id="4" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p11">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="12" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="5" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2FrameMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p12">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="13" machine_id="1" moduleId="6" moduleName="OutputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p13">
+      <value>
+        <groupExec cached="0" completed="-1" error="Error(s) inside group: ComputeColumns: IsMatchTableRowCount failed" groupName="Group" groupType="Group" id="15" machine_id="1" moduleId="25" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+          <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+          </moduleExec>
+          <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+            <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+          <moduleExec cached="0" completed="-1" error="IsMatchTableRowCount failed" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+            <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+          </moduleExec>
+        </groupExec>
+      </value>
+      <account id="acct1" />
+    </process>
+    <process id="p14">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="16" machine_id="1" moduleId="5" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p15">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="17" machine_id="1" moduleId="4" moduleName="InputPort" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47" />
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p16">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="18" machine_id="1" moduleId="3" moduleName="ReadCSVFile" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="6" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr']" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p17">
+      <value>
+        <moduleExec cached="0" completed="1" error="" id="19" machine_id="1" moduleId="2" moduleName="LoadCSVFileIntoDB" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="7" key="used_files" value="['/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv']" />
+          <annotation id="8" key="generated_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+    <process id="p18">
+      <value>
+        <moduleExec cached="0" completed="-1" error="IsMatchTableRowCount failed" id="20" machine_id="1" moduleId="1" moduleName="ComputeColumns" tsEnd="2009-05-14 16:36:47" tsStart="2009-05-14 16:36:47">
+          <annotation id="9" key="used_tables" value="[({'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}, 'J062945_LoadDB', 'P2ImageMeta')]" />
+        </moduleExec>
+      </value>
+      <account id="acct2" />
+    </process>
+  </processes>
+  <artifacts>
+    <artifact id="a0">
+      <value>
+        <function id="4" name="value" pos="0">
+          <parameter alias="" id="17" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a1">
+      <value>
+        <portSpec id="8" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a2">
+      <value>
+        <function id="5" name="str1" pos="0">
+          <parameter alias="" id="12" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="/vistrails/pc3/SampleData/" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a3">
+      <value>
+        <portSpec id="29" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a4">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/csv_ready.csv" />
+        </function>
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a5">
+      <value>
+        <portSpec id="142" name="csvFiles" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a6">
+      <value>
+        <portSpec id="140" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a7">
+      <value>
+        <portSpec id="-1" name="csvFile" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a8">
+      <value>
+        <portSpec id="-1" name="dbEntry" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a9">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a10">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a11">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv.hdr" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a12">
+      <value>
+        <portSpec id="121" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a13">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2FrameMeta.csv" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a14">
+      <value>
+        <function id="-1" name="dbEntry" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="{'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945_LoadDB" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="P2FrameMeta" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a15">
+      <value>
+        <portSpec id="114" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a16">
+      <value>
+        <portSpec id="119" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a17">
+      <value>
+        <portSpec id="-1" name="csvFile" optional="" sigstring="" sortKey="" type="output" />
+      </value>
+      <account id="acct1" />
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a18">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a19">
+      <value>
+        <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a20">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv.hdr" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a21">
+      <value>
+        <portSpec id="121" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a22">
+      <value>
+        <function id="-1" name="file" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:File" val="/vistrails/pc3/SampleData/J062945/P2_J062945_B001_P2fits0_20081115_P2ImageMeta.csv" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a23">
+      <value>
+        <function id="-1" name="dbEntry" pos="0">
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="{'passwd': 'pc3_load-2009', 'host': 'localhost', 'db': 'J062945_LoadDB', 'user': 'ipaw'}" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945_LoadDB" />
+          <parameter alias="" id="-1" name="" pos="0" type="edu.utah.sci.vistrails.basic:String" val="P2ImageMeta" />
+        </function>
+      </value>
+      <account id="acct2" />
+    </artifact>
+    <artifact id="a24">
+      <value>
+        <portSpec id="114" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+      </value>
+      <account id="acct2" />
+    </artifact>
+  </artifacts>
+  <causalDependencies>
+    <used>
+      <effect id="p0" />
+      <role value="in" />
+      <cause id="a0" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a1" />
+      <role value="out" />
+      <cause id="p0" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p1" />
+      <role value="in" />
+      <cause id="a2" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p1" />
+      <role value="in" />
+      <cause id="a1" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a3" />
+      <role value="out" />
+      <cause id="p1" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p2" />
+      <role value="in" />
+      <cause id="a4" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p2" />
+      <role value="in" />
+      <cause id="a3" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a5" />
+      <role value="out" />
+      <cause id="p2" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p3" />
+      <role value="in" />
+      <cause id="a1" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a6" />
+      <role value="out" />
+      <cause id="p3" />
+      <account id="acct0" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p4" />
+      <role value="in" />
+      <cause id="a5" />
+      <account id="acct0" />
+    </used>
+    <used>
+      <effect id="p5" />
+      <role value="in" />
+      <cause id="a5" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a7" />
+      <role value="out" />
+      <cause id="p5" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p6" />
+      <role value="in" />
+      <cause id="a7" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a8" />
+      <role value="out" />
+      <cause id="p6" />
+      <account id="acct1" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p6" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a9" />
+      <role value="out" />
+      <cause id="p7" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p7" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a10" />
+      <role value="out" />
+      <cause id="p8" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p8" />
+      <role value="in" />
+      <cause id="a7" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p9" />
+      <role value="in" />
+      <cause id="a11" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p9" />
+      <role value="in" />
+      <cause id="a10" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a12" />
+      <role value="out" />
+      <cause id="p9" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p10" />
+      <role value="in" />
+      <cause id="a13" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a14" />
+      <role value="out" />
+      <cause id="p10" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p10" />
+      <role value="in" />
+      <cause id="a9" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p10" />
+      <role value="in" />
+      <cause id="a12" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a15" />
+      <role value="out" />
+      <cause id="p10" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p11" />
+      <role value="in" />
+      <cause id="a14" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p11" />
+      <role value="in" />
+      <cause id="a15" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p11" />
+      <role value="in" />
+      <cause id="a12" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a16" />
+      <role value="out" />
+      <cause id="p11" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p12" />
+      <role value="in" />
+      <cause id="a16" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a8" />
+      <role value="out" />
+      <cause id="p12" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <wasGeneratedBy>
+      <effect id="a17" />
+      <role value="out" />
+      <cause id="p5" />
+      <account id="acct1" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p13" />
+      <role value="in" />
+      <cause id="a17" />
+      <account id="acct1" />
+    </used>
+    <used>
+      <effect id="p13" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct1" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a18" />
+      <role value="out" />
+      <cause id="p14" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p14" />
+      <role value="in" />
+      <cause id="a6" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a19" />
+      <role value="out" />
+      <cause id="p15" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p15" />
+      <role value="in" />
+      <cause id="a17" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p16" />
+      <role value="in" />
+      <cause id="a20" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p16" />
+      <role value="in" />
+      <cause id="a19" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a21" />
+      <role value="out" />
+      <cause id="p16" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p17" />
+      <role value="in" />
+      <cause id="a22" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a23" />
+      <role value="out" />
+      <cause id="p17" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p17" />
+      <role value="in" />
+      <cause id="a18" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p17" />
+      <role value="in" />
+      <cause id="a21" />
+      <account id="acct2" />
+    </used>
+    <wasGeneratedBy>
+      <effect id="a24" />
+      <role value="out" />
+      <cause id="p17" />
+      <account id="acct2" />
+    </wasGeneratedBy>
+    <used>
+      <effect id="p18" />
+      <role value="in" />
+      <cause id="a23" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p18" />
+      <role value="in" />
+      <cause id="a24" />
+      <account id="acct2" />
+    </used>
+    <used>
+      <effect id="p18" />
+      <role value="in" />
+      <cause id="a21" />
+      <account id="acct2" />
+    </used>
+  </causalDependencies>
+</opmGraph>
diff --git a/contrib/pc3/workflow_reg.xml b/contrib/pc3/workflow_reg.xml
new file mode 100644
index 0000000..a1cba59
--- /dev/null
+++ b/contrib/pc3/workflow_reg.xml
@@ -0,0 +1,330 @@
+<registry id="" rootDescriptorId="0" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/registry.xsd">
+  <package codepath="basic_modules" description="basic_modules defines basic VisTrails Modules that are used in most
+pipelines." id="0" identifier="edu.utah.sci.vistrails.basic" loadConfiguration="1" name="Basic Modules" version="1.2">
+    <moduleDescriptor baseDescriptorId="-1" id="0" name="Module" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="0" name="self" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="1" name="Constant" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="9" name="value_as_string" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="1" id="2" name="Boolean" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="1" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="2" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="1" id="3" name="Float" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="3" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Float)" sortKey="-1" type="input" />
+      <portSpec id="4" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Float)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="1" id="4" name="Integer" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="5" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="input" />
+      <portSpec id="6" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="1" id="5" name="String" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="7" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="8" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="1" id="6" name="File" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="10" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+      <portSpec id="11" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="output" />
+      <portSpec id="12" name="name" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="13" name="self" optional="1" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="output" />
+      <portSpec id="14" name="create_file" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="15" name="local_filename" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="7" name="FileSink" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="16" name="file" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+      <portSpec id="17" name="outputName" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="18" name="overrideFile" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="1" id="8" name="Color" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="19" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Color)" sortKey="-1" type="input" />
+      <portSpec id="20" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Color)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="9" name="StandardOutput" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="21" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="10" name="Tuple" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="22" name="self" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Tuple)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="11" name="TestTuple" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="23" name="tuple" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Integer,edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="12" name="Untuple" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="24" name="tuple" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Tuple)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="13" name="ConcatenateString" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="25" name="str1" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="26" name="str2" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="27" name="str3" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="28" name="str4" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="29" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="14" name="List" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="30" name="head" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="input" />
+      <portSpec id="31" name="tail" optional="0" sigstring="(edu.utah.sci.vistrails.basic:List)" sortKey="-1" type="input" />
+      <portSpec id="32" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:List)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="15" name="Null" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+    <moduleDescriptor baseDescriptorId="0" id="16" name="PythonSource" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="33" name="source" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="34" name="self" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="17" name="SmartSource" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="35" name="source" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="18" name="Unzip" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="36" name="archive_file" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+      <portSpec id="37" name="filename_in_archive" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="38" name="file" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="19" name="Variant" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+    <moduleDescriptor baseDescriptorId="0" id="20" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="39" name="name" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="40" name="optional" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="41" name="spec" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="42" name="old_name" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="43" name="ExternalPipe" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="input" />
+      <portSpec id="44" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="21" name="OutputPort" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="45" name="name" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="46" name="optional" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="47" name="spec" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="48" name="InternalPipe" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="input" />
+      <portSpec id="49" name="ExternalPipe" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="22" name="Group" namespace="" package="edu.utah.sci.vistrails.basic" version="">
+      <portSpec id="50" name="self" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Group)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="22" id="23" name="SubWorkflow" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+  </package>
+  <package codepath="pythonCalc" description="This package implements a very simple VisTrails module called
+PythonCalc. This is intended as a simple example that can be referred
+to by users to create their own packages and modules later.
+
+If you're interested in developing new modules for VisTrails, you
+should also consult the documentation in the User's Guide and in
+core/modules/vistrails_module.py.
+" id="1" identifier="edu.utah.sci.vistrails.pythoncalc" loadConfiguration="1" name="PythonCalc" version="0.9.0">
+    <moduleDescriptor baseDescriptorId="0" id="24" name="PythonCalc" namespace="" package="edu.utah.sci.vistrails.pythoncalc" version="">
+      <portSpec id="51" name="value1" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Float)" sortKey="-1" type="input" />
+      <portSpec id="52" name="value2" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Float)" sortKey="-1" type="input" />
+      <portSpec id="53" name="op" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="54" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Float)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="spreadsheet" description="No description available" id="2" identifier="edu.utah.sci.vistrails.spreadsheet" loadConfiguration="1" name="VisTrails Spreadsheet" version="0.9.0">
+    <moduleDescriptor baseDescriptorId="0" id="25" name="SheetReference" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="55" name="MinRowCount" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="input" />
+      <portSpec id="56" name="MinColumnCount" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="input" />
+      <portSpec id="57" name="SheetName" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="58" name="self" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:SheetReference)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="26" name="CellLocation" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="59" name="ColumnRowAddress" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="60" name="Row" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="input" />
+      <portSpec id="61" name="Column" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="input" />
+      <portSpec id="62" name="SheetReference" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:SheetReference)" sortKey="-1" type="input" />
+      <portSpec id="63" name="self" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:CellLocation)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="27" name="SpreadsheetCell" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="64" name="Location" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:CellLocation)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="25" id="28" name="SingleCellSheetReference" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="65" name="SheetName" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="66" name="self" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:SingleCellSheetReference)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="27" id="29" name="ImageViewerCell" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="67" name="Location" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:CellLocation)" sortKey="-1" type="input" />
+      <portSpec id="68" name="File" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="27" id="30" name="RichTextCell" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="69" name="Location" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:CellLocation)" sortKey="-1" type="input" />
+      <portSpec id="70" name="File" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="27" id="31" name="SVGCell" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="71" name="Location" optional="0" sigstring="(edu.utah.sci.vistrails.spreadsheet:CellLocation)" sortKey="-1" type="input" />
+      <portSpec id="72" name="File" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="32" name="SVGSplitter" namespace="" package="edu.utah.sci.vistrails.spreadsheet" version="">
+      <portSpec id="73" name="File" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="controlflow" description="No description available" id="6" identifier="edu.utah.sci.vistrails.control_flow" loadConfiguration="1" name="Control Flow" version="0.1">
+    <moduleDescriptor baseDescriptorId="1" id="33" name="ListOfElements" namespace="" package="edu.utah.sci.vistrails.control_flow" version="">
+      <portSpec id="74" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="75" name="value" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="34" name="Fold" namespace="" package="edu.utah.sci.vistrails.control_flow" version="">
+      <portSpec id="76" name="FunctionPort" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="input" />
+      <portSpec id="77" name="InputList" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="78" name="InputPort" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="79" name="OutputPort" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="80" name="Result" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="34" id="35" name="Map" namespace="" package="edu.utah.sci.vistrails.control_flow" version="" />
+    <moduleDescriptor baseDescriptorId="34" id="36" name="Filter" namespace="" package="edu.utah.sci.vistrails.control_flow" version="" />
+    <moduleDescriptor baseDescriptorId="34" id="37" name="AreaFilter" namespace="" package="edu.utah.sci.vistrails.control_flow" version="" />
+    <moduleDescriptor baseDescriptorId="34" id="38" name="SimilarityFilter" namespace="" package="edu.utah.sci.vistrails.control_flow" version="" />
+    <moduleDescriptor baseDescriptorId="0" id="39" name="If" namespace="" package="edu.utah.sci.vistrails.control_flow" version="">
+      <portSpec id="81" name="Condition" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="82" name="TruePort" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="input" />
+      <portSpec id="83" name="FalsePort" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="input" />
+      <portSpec id="84" name="TrueOutputPorts" optional="1" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="85" name="FalseOutputPorts" optional="1" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="86" name="Result" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Variant)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="40" name="Dot" namespace="" package="edu.utah.sci.vistrails.control_flow" version="">
+      <portSpec id="87" name="List_1" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="88" name="List_2" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="89" name="CombineTuple" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="90" name="Result" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="41" name="Cross" namespace="" package="edu.utah.sci.vistrails.control_flow" version="">
+      <portSpec id="91" name="List_1" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="92" name="List_2" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="93" name="CombineTuple" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="94" name="Result" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="HTTP" description="HTTP provides packages for HTTP-based file fetching. This provides
+a location-independent way of referring to files. This package uses a
+local cache of the files, inside the per-user VisTrails
+directory. This way, files that haven't been changed do not need
+downloading. The check is performed efficiently using the HTTP GET
+headers.
+" id="4" identifier="edu.utah.sci.vistrails.http" loadConfiguration="1" name="HTTP" version="0.9.0">
+    <moduleDescriptor baseDescriptorId="0" id="42" name="HTTP" namespace="" package="edu.utah.sci.vistrails.http" version="" />
+    <moduleDescriptor baseDescriptorId="42" id="43" name="HTTPFile" namespace="" package="edu.utah.sci.vistrails.http" version="">
+      <portSpec id="95" name="url" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="96" name="file" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="output" />
+      <portSpec id="97" name="local_filename" optional="1" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="pylab" description="Matplotlib package for VisTrails.
+
+This package wrap Matplotlib to provide a plotting tool for
+VisTrails. We are going to use the 'Qt4Agg' backend of the library.
+
+" id="5" identifier="edu.utah.sci.vistrails.matplotlib" loadConfiguration="1" name="matplotlib" version="0.9.0">
+    <moduleDescriptor baseDescriptorId="16" id="44" name="MplPlot" namespace="" package="edu.utah.sci.vistrails.matplotlib" version="">
+      <portSpec id="98" name="source" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="45" name="MplFigureManager" namespace="" package="edu.utah.sci.vistrails.matplotlib" version="" />
+    <moduleDescriptor baseDescriptorId="0" id="46" name="MplFigure" namespace="" package="edu.utah.sci.vistrails.matplotlib" version="">
+      <portSpec id="99" name="Script" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="100" name="FigureManager" optional="0" sigstring="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" sortKey="-1" type="output" />
+      <portSpec id="101" name="File" optional="0" sigstring="(edu.utah.sci.vistrails.basic:File)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="27" id="47" name="MplFigureCell" namespace="" package="edu.utah.sci.vistrails.matplotlib" version="">
+      <portSpec id="102" name="FigureManager" optional="0" sigstring="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" sortKey="-1" type="input" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="dialogs" description="dialogs provides modules for user-based interaction on execution.
+Users can then enter file names, numbers, strings, etc." id="3" identifier="edu.utah.sci.vistrails.dialogs" loadConfiguration="1" name="Dialogs" version="0.9.0">
+    <moduleDescriptor baseDescriptorId="0" id="48" name="Dialog" namespace="" package="edu.utah.sci.vistrails.dialogs" version="" />
+    <moduleDescriptor baseDescriptorId="48" id="49" name="TextDialog" namespace="" package="edu.utah.sci.vistrails.dialogs" version="">
+      <portSpec id="103" name="title" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="104" name="label" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="105" name="default" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="106" name="result" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="pc3" description="No description available" id="7" identifier="edu.utah.sci.dakoop.pc3" loadConfiguration="1" name="Provenance Challenge 3" version="1.0.0">
+    <moduleDescriptor baseDescriptorId="0" id="50" name="ReadCSVReadyFile" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="107" name="csvRootPath" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="108" name="csvFiles" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="51" name="IsMatchTableRowCount" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="109" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="110" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="111" name="countsMatch" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="52" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="112" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="113" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="114" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="53" name="IsMatchCSVFileColumnNames" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="115" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="116" name="columnsMatch" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="54" name="ComputeColumns" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="117" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="118" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="119" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="55" name="ReadCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="120" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="121" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="56" name="LoadCSVFileIntoTable" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="122" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="123" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="124" name="success" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="57" name="IsMatchTableColumnRanges" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="125" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="126" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="127" name="rangesMatch" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="58" name="DetectionsHistogram" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="128" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="129" name="highQuality" optional="1" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="input" />
+      <portSpec id="130" name="histogram" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="59" name="Collection" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="131" name="elements" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Module)" sortKey="-1" type="input" />
+      <portSpec id="132" name="self" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:Collection)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="60" name="CompactDatabase" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="133" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="134" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="61" name="IsMatchCSVFileTables" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="135" name="csvFiles" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="input" />
+      <portSpec id="136" name="tablesMatch" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="62" name="ReadCSVFileColumnNames" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="137" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="138" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="63" name="CreateEmptyLoadDB" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="139" name="jobID" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="140" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="64" name="GetCSVFiles" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="141" name="csvRootPath" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="142" name="csvFiles" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="65" name="IsExistsCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="143" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="144" name="fileExists" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="66" name="DatabaseEntry" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="145" name="dbGuid" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="146" name="dbName" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="147" name="connectionString" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="148" name="self" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="67" name="UpdateComputedColumns" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="149" name="csvFile" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="input" />
+      <portSpec id="150" name="dbEntry" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" sortKey="-1" type="input" />
+      <portSpec id="151" name="success" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="68" name="CSVFileEntry" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="152" name="filePath" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="153" name="headerPath" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="154" name="rowCount" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Integer)" sortKey="-1" type="input" />
+      <portSpec id="155" name="targetTable" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="156" name="checksum" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="157" name="columnNames" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:Collection)" sortKey="-1" type="input" />
+      <portSpec id="158" name="self" optional="0" sigstring="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+    <moduleDescriptor baseDescriptorId="0" id="69" name="IsCSVReadyFileExists" namespace="" package="edu.utah.sci.dakoop.pc3" version="">
+      <portSpec id="159" name="csvRootPath" optional="0" sigstring="(edu.utah.sci.vistrails.basic:String)" sortKey="-1" type="input" />
+      <portSpec id="160" name="fileExists" optional="0" sigstring="(edu.utah.sci.vistrails.basic:Boolean)" sortKey="-1" type="output" />
+    </moduleDescriptor>
+  </package>
+  <package codepath="subworkflows" description="No description available" id="8" identifier="local.abstractions" loadConfiguration="1" name="My SubWorkflows" version="1.2" />
+</registry>
diff --git a/contrib/pc3/workflow_vt.xml b/contrib/pc3/workflow_vt.xml
new file mode 100644
index 0000000..ce68b5f
--- /dev/null
+++ b/contrib/pc3/workflow_vt.xml
@@ -0,0 +1,1153 @@
+<vistrail id="" name="" version="0.9.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2009-04-07 16:02:43" id="1" prevId="0" prune="" session="0" user="koop">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="DatabaseEntry" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-162.420168067" y="79.5966386555" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:02:45" id="2" prevId="1" prune="" session="0" user="koop">
+    <add id="2" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="3" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="-104.336134454" y="-118.319327731" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:04:24" id="3" prevId="2" prune="" session="0" user="koop">
+    <delete id="4" objectId="0" parentObjId="0" parentObjType="module" what="location" />
+    <delete id="5" objectId="0" parentObjId="" parentObjType="" what="module" />
+    <delete id="6" objectId="1" parentObjId="1" parentObjType="module" what="location" />
+    <delete id="7" objectId="1" parentObjId="" parentObjType="" what="module" />
+  </action>
+  <action date="2009-04-07 16:04:27" id="4" prevId="3" prune="" session="0" user="koop">
+    <add id="8" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="GetCSVFiles" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="9" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="-84.974789916" y="105.411764706" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:04:58" id="5" prevId="4" prune="" session="0" user="koop">
+    <change id="10" newObjId="3" oldObjId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="3" x="-20.4369747899" y="129.075630252" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:04:58" id="6" prevId="5" prune="" session="0" user="koop">
+    <add id="11" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="ComputeColumns" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="12" objectId="4" parentObjId="3" parentObjType="module" what="location">
+      <location id="4" x="50.5546218487" y="-62.3865546218" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:05:01" id="7" prevId="6" prune="" session="0" user="koop">
+    <add id="13" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="CreateEmptyLoadDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="14" objectId="5" parentObjId="4" parentObjType="module" what="location">
+      <location id="5" x="-236.638655462" y="118.319327731" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:05:06" id="8" prevId="7" prune="" session="0" user="koop">
+    <add id="15" objectId="5" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="5" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="16" objectId="6" parentObjId="5" parentObjType="module" what="location">
+      <location id="6" x="-157.042016807" y="8.60504201681" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:05:10" id="9" prevId="8" prune="" session="0" user="koop">
+    <add id="17" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0" />
+    </add>
+    <add id="18" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="4" moduleName="CreateEmptyLoadDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="19" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="5" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:05:19" id="10" prevId="9" prune="" session="0" user="koop">
+    <change id="20" newObjId="7" oldObjId="6" parentObjId="5" parentObjType="module" what="location">
+      <location id="7" x="-11.8319327731" y="10.756302521" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:05:19" id="11" prevId="10" prune="" session="0" user="koop">
+    <add id="21" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1" />
+    </add>
+    <add id="22" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="5" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="23" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="3" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:06:15" id="12" prevId="11" prune="" session="0" user="koop">
+    <change id="24" newObjId="8" oldObjId="3" parentObjId="2" parentObjType="module" what="location">
+      <location id="8" x="-10.756302521" y="152.739495798" />
+    </change>
+    <change id="25" newObjId="9" oldObjId="4" parentObjId="3" parentObjType="module" what="location">
+      <location id="9" x="98.9579831933" y="-69.9159663866" />
+    </change>
+    <change id="26" newObjId="10" oldObjId="7" parentObjId="5" parentObjType="module" what="location">
+      <location id="10" x="-90.3529411765" y="1.7763568394e-15" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:06:15" id="13" prevId="12" prune="" session="0" user="koop">
+    <add id="27" objectId="6" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="6" name="ReadCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="28" objectId="11" parentObjId="6" parentObjType="module" what="location">
+      <location id="11" x="91.4285714286" y="78.5210084034" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:06:18" id="14" prevId="13" prune="" session="0" user="koop">
+    <add id="29" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2" />
+    </add>
+    <add id="30" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="6" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+    </add>
+    <add id="31" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="5" moduleName="LoadCSVFileIntoDB" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:06:22" id="15" prevId="14" prune="" session="0" user="koop">
+    <change id="32" newObjId="12" oldObjId="11" parentObjId="6" parentObjType="module" what="location">
+      <location id="12" x="86.0504201681" y="90.3529411765" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:06:22" id="16" prevId="15" prune="" session="0" user="koop">
+    <add id="33" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3" />
+    </add>
+    <add id="34" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="6" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+    </add>
+    <add id="35" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="3" moduleName="ComputeColumns" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:06:43" id="17" prevId="16" prune="" session="0" user="koop">
+    <change id="36" newObjId="13" oldObjId="8" parentObjId="2" parentObjType="module" what="location">
+      <location id="13" x="-130.151260504" y="258.151260504" />
+    </change>
+    <change id="37" newObjId="14" oldObjId="5" parentObjId="4" parentObjType="module" what="location">
+      <location id="14" x="153.81512605" y="109.714285714" />
+    </change>
+    <change id="38" newObjId="15" oldObjId="10" parentObjId="5" parentObjType="module" what="location">
+      <location id="15" x="89.2773109244" y="18.2857142857" />
+    </change>
+    <change id="39" newObjId="16" oldObjId="12" parentObjId="6" parentObjType="module" what="location">
+      <location id="16" x="-162.420168067" y="123.697478992" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:06:43" id="18" prevId="17" prune="" session="0" user="koop">
+    <add id="40" objectId="7" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="7" name="CompactDatabase" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="41" objectId="17" parentObjId="7" parentObjType="module" what="location">
+      <location id="17" x="123.697478992" y="-182.857142857" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:06:45" id="19" prevId="18" prune="" session="0" user="koop">
+    <add id="42" objectId="4" parentObjId="" parentObjType="" what="connection">
+      <connection id="4" />
+    </add>
+    <add id="43" objectId="8" parentObjId="4" parentObjType="connection" what="port">
+      <port id="8" moduleId="3" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="44" objectId="9" parentObjId="4" parentObjType="connection" what="port">
+      <port id="9" moduleId="7" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:08:31" id="20" prevId="19" prune="" session="0" user="koop">
+    <change id="45" newObjId="18" oldObjId="13" parentObjId="2" parentObjType="module" what="location">
+      <location id="18" x="-182.857142857" y="256.0" />
+    </change>
+    <change id="46" newObjId="19" oldObjId="17" parentObjId="7" parentObjType="module" what="location">
+      <location id="19" x="109.714285714" y="-190.386554622" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:08:31" id="21" prevId="20" prune="" session="0" user="koop">
+    <add id="47" objectId="8" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="8" name="Map" namespace="" package="edu.utah.sci.vistrails.control_flow" tag="" version="0.1" />
+    </add>
+    <add id="48" objectId="20" parentObjId="8" parentObjType="module" what="location">
+      <location id="20" x="114.016806723" y="-292.571428571" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:08:44" id="22" prevId="21" prune="" session="0" user="koop">
+    <add id="49" objectId="5" parentObjId="" parentObjType="" what="connection">
+      <connection id="5" />
+    </add>
+    <add id="50" objectId="10" parentObjId="5" parentObjType="connection" what="port">
+      <port id="10" moduleId="7" moduleName="CompactDatabase" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="51" objectId="11" parentObjId="5" parentObjType="connection" what="port">
+      <port id="11" moduleId="8" moduleName="Map" name="FunctionPort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:40:18" id="23" prevId="22" prune="" session="1" user="koop">
+    <change id="52" newObjId="21" oldObjId="18" parentObjId="2" parentObjType="module" what="location">
+      <location id="21" x="338.293817527" y="-164.978391356" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:40:18" id="24" prevId="23" prune="" session="1" user="koop">
+    <add id="53" objectId="6" parentObjId="" parentObjType="" what="connection">
+      <connection id="6" />
+    </add>
+    <add id="54" objectId="12" parentObjId="6" parentObjType="connection" what="port">
+      <port id="12" moduleId="2" moduleName="GetCSVFiles" name="csvFiles" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="source" />
+    </add>
+    <add id="55" objectId="13" parentObjId="6" parentObjType="connection" what="port">
+      <port id="13" moduleId="8" moduleName="Map" name="InputList" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:40:21" id="25" prevId="24" prune="" session="1" user="koop">
+    <add id="56" objectId="0" parentObjId="2" parentObjType="module" what="function">
+      <function id="0" name="csvRootPath" pos="0" />
+    </add>
+    <add id="57" objectId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:40:32" id="26" prevId="25" prune="" session="1" user="koop">
+    <change id="58" newObjId="1" oldObjId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="/vistrails/pc3/SampleData/" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:40:44" id="27" prevId="26" prune="" session="1" user="koop">
+    <change id="59" newObjId="2" oldObjId="1" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="/vistrails/pc3/SampleData/J062941" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:40:45" id="28" prevId="27" prune="" session="1" user="koop">
+    <add id="60" objectId="1" parentObjId="4" parentObjType="module" what="function">
+      <function id="1" name="jobID" pos="0" />
+    </add>
+    <add id="61" objectId="3" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:40:46" id="29" prevId="28" prune="" session="1" user="koop">
+    <change id="62" newObjId="4" oldObjId="3" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062941" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:40:56" id="30" prevId="29" prune="" session="1" user="koop">
+    <add id="63" objectId="2" parentObjId="8" parentObjType="module" what="function">
+      <function id="2" name="InputPort" pos="0" />
+    </add>
+    <add id="64" objectId="5" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="0" type="edu.utah.sci.vistrails.control_flow:ListOfElements" val="" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:41:03" id="31" prevId="30" prune="" session="1" user="koop">
+    <change id="65" newObjId="6" oldObjId="5" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="edu.utah.sci.vistrails.control_flow:ListOfElements" val="['csvFile']" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:41:04" id="32" prevId="31" prune="" session="1" user="koop">
+    <add id="66" objectId="3" parentObjId="8" parentObjType="module" what="function">
+      <function id="3" name="OutputPort" pos="1" />
+    </add>
+    <add id="67" objectId="7" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="7" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:41:06" id="33" prevId="32" prune="" session="1" user="koop">
+    <change id="68" newObjId="8" oldObjId="7" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="8" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="self" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:54:37" id="34" prevId="33" prune="" session="2" user="koop">
+    <change id="69" newObjId="22" oldObjId="9" parentObjId="3" parentObjType="module" what="location">
+      <location id="22" x="85.6656725716" y="-67.2575042623" />
+    </change>
+    <change id="70" newObjId="23" oldObjId="14" parentObjId="4" parentObjType="module" what="location">
+      <location id="23" x="140.522815428" y="228.015850247" />
+    </change>
+    <change id="71" newObjId="24" oldObjId="15" parentObjId="5" parentObjType="module" what="location">
+      <location id="24" x="75.9850003027" y="20.94417641" />
+    </change>
+    <change id="72" newObjId="25" oldObjId="16" parentObjId="6" parentObjType="module" what="location">
+      <location id="25" x="-115.897080891" y="133.002096427" />
+    </change>
+    <change id="73" newObjId="26" oldObjId="19" parentObjId="7" parentObjType="module" what="location">
+      <location id="26" x="96.4219750923" y="-187.728092498" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:54:37" id="35" prevId="34" prune="" session="2" user="koop">
+    <delete id="74" objectId="10" parentObjId="5" parentObjType="connection" what="port" />
+    <delete id="75" objectId="11" parentObjId="5" parentObjType="connection" what="port" />
+    <delete id="76" objectId="5" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-07 16:54:46" id="36" prevId="35" prune="" session="2" user="koop">
+    <change id="77" newObjId="27" oldObjId="26" parentObjId="7" parentObjType="module" what="location">
+      <location id="27" x="83.1296644706" y="-163.801933379" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:54:46" id="37" prevId="36" prune="" session="2" user="koop">
+    <add id="78" objectId="9" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="9" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="79" objectId="28" parentObjId="9" parentObjType="module" what="location">
+      <location id="28" x="-168.812344896" y="256.541594999" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:54:47" id="38" prevId="37" prune="" session="2" user="koop">
+    <add id="80" objectId="7" parentObjId="" parentObjType="" what="connection">
+      <connection id="7" />
+    </add>
+    <add id="81" objectId="14" parentObjId="7" parentObjType="connection" what="port">
+      <port id="14" moduleId="9" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="82" objectId="15" parentObjId="7" parentObjType="connection" what="port">
+      <port id="15" moduleId="6" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:54:52" id="39" prevId="38" prune="" session="2" user="koop">
+    <add id="83" objectId="10" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="10" name="OutputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="84" objectId="29" parentObjId="10" parentObjType="module" what="location">
+      <location id="29" x="-74.4369394816" y="-280.467754118" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:54:58" id="40" prevId="39" prune="" session="2" user="koop">
+    <change id="85" newObjId="30" oldObjId="27" parentObjId="7" parentObjType="module" what="location">
+      <location id="30" x="19.3265734863" y="-161.143471254" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:54:58" id="41" prevId="40" prune="" session="2" user="koop">
+    <add id="86" objectId="8" parentObjId="" parentObjType="" what="connection">
+      <connection id="8" />
+    </add>
+    <add id="87" objectId="16" parentObjId="8" parentObjType="connection" what="port">
+      <port id="16" moduleId="7" moduleName="CompactDatabase" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="88" objectId="17" parentObjId="8" parentObjType="connection" what="port">
+      <port id="17" moduleId="10" moduleName="OutputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:55:06" id="42" prevId="41" prune="" session="2" user="koop">
+    <change id="89" newObjId="31" oldObjId="29" parentObjId="10" parentObjType="module" what="location">
+      <location id="31" x="-22.5969280569" y="-256.541594999" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:55:06" id="43" prevId="42" prune="" session="2" user="koop">
+    <delete id="90" objectId="0" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="91" objectId="1" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="92" objectId="0" parentObjId="" parentObjType="" what="connection" />
+    <delete id="93" objectId="2" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="94" objectId="3" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="95" objectId="1" parentObjId="" parentObjType="" what="connection" />
+    <delete id="96" objectId="4" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="97" objectId="5" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="98" objectId="2" parentObjId="" parentObjType="" what="connection" />
+    <delete id="99" objectId="6" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="100" objectId="7" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="101" objectId="3" parentObjId="" parentObjType="" what="connection" />
+    <delete id="102" objectId="8" parentObjId="4" parentObjType="connection" what="port" />
+    <delete id="103" objectId="9" parentObjId="4" parentObjType="connection" what="port" />
+    <delete id="104" objectId="4" parentObjId="" parentObjType="" what="connection" />
+    <delete id="105" objectId="14" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="106" objectId="15" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="107" objectId="7" parentObjId="" parentObjType="" what="connection" />
+    <delete id="108" objectId="16" parentObjId="8" parentObjType="connection" what="port" />
+    <delete id="109" objectId="17" parentObjId="8" parentObjType="connection" what="port" />
+    <delete id="110" objectId="8" parentObjId="" parentObjType="" what="connection" />
+    <delete id="111" objectId="22" parentObjId="3" parentObjType="module" what="location" />
+    <delete id="112" objectId="3" parentObjId="" parentObjType="" what="module" />
+    <delete id="113" objectId="24" parentObjId="5" parentObjType="module" what="location" />
+    <delete id="114" objectId="5" parentObjId="" parentObjType="" what="module" />
+    <delete id="115" objectId="25" parentObjId="6" parentObjType="module" what="location" />
+    <delete id="116" objectId="6" parentObjId="" parentObjType="" what="module" />
+    <delete id="117" objectId="30" parentObjId="7" parentObjType="module" what="location" />
+    <delete id="118" objectId="7" parentObjId="" parentObjType="" what="module" />
+    <delete id="119" objectId="28" parentObjId="9" parentObjType="module" what="location" />
+    <delete id="120" objectId="9" parentObjId="" parentObjType="" what="module" />
+    <delete id="121" objectId="31" parentObjId="10" parentObjType="module" what="location" />
+    <delete id="122" objectId="10" parentObjId="" parentObjType="" what="module" />
+    <add id="123" objectId="11" parentObjId="" parentObjType="" what="group">
+      <group cache="1" id="11" name="Group" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+        <workflow id="" name="untitled" version="" vistrail_id="">
+          <connection id="1">
+            <port id="2" moduleId="2" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+            <port id="1" moduleId="7" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="2">
+            <port id="3" moduleId="2" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+            <port id="4" moduleId="1" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+          </connection>
+          <connection id="3">
+            <port id="5" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+            <port id="6" moduleId="2" moduleName="LoadCSVFileIntoDB" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+          </connection>
+          <connection id="4">
+            <port id="7" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+            <port id="8" moduleId="1" moduleName="ComputeColumns" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+          </connection>
+          <connection id="5">
+            <port id="9" moduleId="1" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+            <port id="10" moduleId="4" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+          </connection>
+          <connection id="6">
+            <port id="11" moduleId="5" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+            <port id="12" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+          </connection>
+          <connection id="7">
+            <port id="13" moduleId="4" moduleName="CompactDatabase" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+            <port id="14" moduleId="6" moduleName="OutputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="destination" />
+          </connection>
+          <module cache="1" id="1" name="ComputeColumns" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="1" x="106.720523819" y="-54.8483871491" />
+          </module>
+          <module cache="1" id="2" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="2" x="97.0398515499" y="33.3532935232" />
+          </module>
+          <module cache="1" id="3" name="ReadCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="3" x="-94.8422296438" y="145.41121354" />
+          </module>
+          <module cache="1" id="4" name="CompactDatabase" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="4" x="40.3814247335" y="-148.734354141" />
+          </module>
+          <module cache="1" id="5" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+            <location id="5" x="-147.757493649" y="268.950712112" />
+            <function id="1" name="name" pos="0">
+              <parameter alias="" id="1" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="csvFile" />
+            </function>
+          </module>
+          <module cache="1" id="6" name="OutputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+            <location id="6" x="-1.54207680972" y="-244.132477886" />
+            <function id="2" name="name" pos="0">
+              <parameter alias="" id="2" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="CompactDatabase" />
+            </function>
+          </module>
+          <module cache="1" id="7" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+            <location id="7" x="161.577666675" y="240.424967361" />
+            <function id="3" name="name" pos="0">
+              <parameter alias="" id="3" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+            </function>
+          </module>
+        </workflow>
+      </group>
+    </add>
+    <add id="124" objectId="32" parentObjId="11" parentObjType="group" what="location">
+      <location id="32" x="-21.0548512472" y="-12.4091171132" />
+    </add>
+    <add id="125" objectId="9" parentObjId="" parentObjType="" what="connection">
+      <connection id="9" />
+    </add>
+    <add id="126" objectId="18" parentObjId="9" parentObjType="connection" what="port">
+      <port id="18" moduleId="4" moduleName="CreateEmptyLoadDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="127" objectId="19" parentObjId="9" parentObjType="connection" what="port">
+      <port id="19" moduleId="11" moduleName="Group" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 16:55:21" id="44" prevId="43" prune="" session="2" user="koop">
+    <change id="128" newObjId="33" oldObjId="23" parentObjId="4" parentObjType="module" what="location">
+      <location id="33" x="-4.3633703485" y="23.3142666728" />
+    </change>
+    <change id="129" newObjId="34" oldObjId="32" parentObjId="11" parentObjType="group" what="location">
+      <location id="34" x="85.2836337266" y="-113.430677838" />
+    </change>
+  </action>
+  <action date="2009-04-07 16:55:23" id="45" prevId="44" prune="" session="2" user="koop">
+    <add id="130" objectId="10" parentObjId="" parentObjType="" what="connection">
+      <connection id="10" />
+    </add>
+    <add id="131" objectId="20" parentObjId="10" parentObjType="connection" what="port">
+      <port id="20" moduleId="11" moduleName="Group" name="self" signature="(edu.utah.sci.vistrails.basic:Group)" type="source" />
+    </add>
+    <add id="132" objectId="21" parentObjId="10" parentObjType="connection" what="port">
+      <port id="21" moduleId="8" moduleName="Map" name="FunctionPort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:40:52" id="46" prevId="45" prune="" session="3" user="koop" />
+  <action date="2009-04-07 17:41:16" id="47" prevId="46" prune="" session="3" user="koop">
+    <add id="133" objectId="12" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="12" name="String" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="134" objectId="35" parentObjId="12" parentObjType="module" what="location">
+      <location id="35" x="159.193277311" y="148.43697479" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:41:25" id="48" prevId="47" prune="" session="3" user="koop">
+    <add id="135" objectId="13" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="13" name="ConcatenateString" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="136" objectId="36" parentObjId="13" parentObjType="module" what="location">
+      <location id="36" x="271.058823529" y="52.7058823529" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:41:30" id="49" prevId="48" prune="" session="3" user="koop">
+    <change id="137" newObjId="37" oldObjId="35" parentObjId="12" parentObjType="module" what="location">
+      <location id="37" x="150.588235294" y="152.739495798" />
+    </change>
+  </action>
+  <action date="2009-04-07 17:41:30" id="50" prevId="49" prune="" session="3" user="koop">
+    <add id="138" objectId="11" parentObjId="" parentObjType="" what="connection">
+      <connection id="11" />
+    </add>
+    <add id="139" objectId="22" parentObjId="11" parentObjType="connection" what="port">
+      <port id="22" moduleId="12" moduleName="String" name="value" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    </add>
+    <add id="140" objectId="23" parentObjId="11" parentObjType="connection" what="port">
+      <port id="23" moduleId="4" moduleName="CreateEmptyLoadDB" name="jobID" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:41:32" id="51" prevId="50" prune="" session="3" user="koop">
+    <delete id="141" objectId="4" parentObjId="1" parentObjType="function" what="parameter" />
+    <delete id="142" objectId="1" parentObjId="4" parentObjType="module" what="function" />
+  </action>
+  <action date="2009-04-07 17:41:38" id="52" prevId="51" prune="" session="3" user="koop" />
+  <action date="2009-04-07 17:41:40" id="53" prevId="52" prune="" session="3" user="koop">
+    <add id="143" objectId="4" parentObjId="12" parentObjType="module" what="function">
+      <function id="4" name="value" pos="0" />
+    </add>
+    <add id="144" objectId="9" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="9" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:41:41" id="54" prevId="53" prune="" session="3" user="koop">
+    <change id="145" newObjId="10" oldObjId="9" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="10" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062941" />
+    </change>
+  </action>
+  <action date="2009-04-07 17:41:47" id="55" prevId="54" prune="" session="3" user="koop" />
+  <action date="2009-04-07 17:41:52" id="56" prevId="55" prune="" session="3" user="koop">
+    <add id="146" objectId="5" parentObjId="13" parentObjType="module" what="function">
+      <function id="5" name="str1" pos="0" />
+    </add>
+    <add id="147" objectId="11" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="11" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:41:57" id="57" prevId="56" prune="" session="3" user="koop">
+    <change id="148" newObjId="12" oldObjId="11" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="12" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="/vistrails/pc3/SampleData/" />
+    </change>
+  </action>
+  <action date="2009-04-07 17:41:58" id="58" prevId="57" prune="" session="3" user="koop">
+    <add id="149" objectId="12" parentObjId="" parentObjType="" what="connection">
+      <connection id="12" />
+    </add>
+    <add id="150" objectId="24" parentObjId="12" parentObjType="connection" what="port">
+      <port id="24" moduleId="12" moduleName="String" name="value" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    </add>
+    <add id="151" objectId="25" parentObjId="12" parentObjType="connection" what="port">
+      <port id="25" moduleId="13" moduleName="ConcatenateString" name="str2" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-07 17:42:02" id="59" prevId="58" prune="" session="3" user="koop">
+    <delete id="152" objectId="2" parentObjId="0" parentObjType="function" what="parameter" />
+    <delete id="153" objectId="0" parentObjId="2" parentObjType="module" what="function" />
+  </action>
+  <action date="2009-04-07 17:42:04" id="60" prevId="59" prune="" session="3" user="koop">
+    <add id="154" objectId="13" parentObjId="" parentObjType="" what="connection">
+      <connection id="13" />
+    </add>
+    <add id="155" objectId="26" parentObjId="13" parentObjType="connection" what="port">
+      <port id="26" moduleId="13" moduleName="ConcatenateString" name="value" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    </add>
+    <add id="156" objectId="27" parentObjId="13" parentObjType="connection" what="port">
+      <port id="27" moduleId="2" moduleName="GetCSVFiles" name="csvRootPath" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:17:18" id="61" prevId="60" prune="" session="4" user="koop">
+    <change id="157" newObjId="38" oldObjId="34" parentObjId="11" parentObjType="group" what="location">
+      <location id="38" x="-377.409022582" y="-678.31312327" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:17:22" id="62" prevId="61" prune="" session="4" user="koop">
+    <delete id="158" objectId="20" parentObjId="10" parentObjType="connection" what="port" />
+    <delete id="159" objectId="21" parentObjId="10" parentObjType="connection" what="port" />
+    <delete id="160" objectId="10" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-08 17:17:25" id="63" prevId="62" prune="" session="4" user="koop">
+    <delete id="161" objectId="18" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="162" objectId="19" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="163" objectId="9" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-08 17:17:27" id="64" prevId="63" prune="" session="4" user="koop">
+    <delete id="164" objectId="38" parentObjId="11" parentObjType="group" what="location" />
+    <delete id="165" objectId="11" parentObjId="" parentObjType="" what="group" />
+    <add id="166" objectId="18" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="18" name="ComputeColumns" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="167" objectId="43" parentObjId="18" parentObjType="module" what="location">
+      <location id="43" x="-270.688498763" y="-733.161510419" />
+    </add>
+    <add id="168" objectId="19" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="19" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="169" objectId="44" parentObjId="19" parentObjType="module" what="location">
+      <location id="44" x="-280.369171032" y="-644.959829747" />
+    </add>
+    <add id="170" objectId="20" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="20" name="ReadCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="171" objectId="45" parentObjId="20" parentObjType="module" what="location">
+      <location id="45" x="-472.251252226" y="-532.90190973" />
+    </add>
+    <add id="172" objectId="21" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="21" name="CompactDatabase" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="173" objectId="46" parentObjId="21" parentObjType="module" what="location">
+      <location id="46" x="-337.027597849" y="-827.047477411" />
+    </add>
+    <add id="174" objectId="19" parentObjId="" parentObjType="" what="connection">
+      <connection id="19" />
+    </add>
+    <add id="175" objectId="39" parentObjId="19" parentObjType="connection" what="port">
+      <port id="39" moduleId="18" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+    <add id="176" objectId="38" parentObjId="19" parentObjType="connection" what="port">
+      <port id="38" moduleId="19" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="177" objectId="20" parentObjId="" parentObjType="" what="connection">
+      <connection id="20" />
+    </add>
+    <add id="178" objectId="41" parentObjId="20" parentObjType="connection" what="port">
+      <port id="41" moduleId="19" moduleName="LoadCSVFileIntoDB" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+    </add>
+    <add id="179" objectId="40" parentObjId="20" parentObjType="connection" what="port">
+      <port id="40" moduleId="20" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+    </add>
+    <add id="180" objectId="21" parentObjId="" parentObjType="" what="connection">
+      <connection id="21" />
+    </add>
+    <add id="181" objectId="43" parentObjId="21" parentObjType="connection" what="port">
+      <port id="43" moduleId="18" moduleName="ComputeColumns" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+    </add>
+    <add id="182" objectId="42" parentObjId="21" parentObjType="connection" what="port">
+      <port id="42" moduleId="20" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+    </add>
+    <add id="183" objectId="22" parentObjId="" parentObjType="" what="connection">
+      <connection id="22" />
+    </add>
+    <add id="184" objectId="45" parentObjId="22" parentObjType="connection" what="port">
+      <port id="45" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+    <add id="185" objectId="44" parentObjId="22" parentObjType="connection" what="port">
+      <port id="44" moduleId="18" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:17:36" id="65" prevId="64" prune="" session="4" user="koop">
+    <delete id="186" objectId="45" parentObjId="22" parentObjType="connection" what="port" />
+    <delete id="187" objectId="44" parentObjId="22" parentObjType="connection" what="port" />
+    <delete id="188" objectId="22" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-08 17:17:50" id="66" prevId="65" prune="" session="4" user="koop">
+    <change id="189" newObjId="47" oldObjId="43" parentObjId="18" parentObjType="module" what="location">
+      <location id="47" x="-225.667156687" y="-334.401052027" />
+    </change>
+    <change id="190" newObjId="48" oldObjId="44" parentObjId="19" parentObjType="module" what="location">
+      <location id="48" x="-235.347828956" y="-246.199371355" />
+    </change>
+    <change id="191" newObjId="49" oldObjId="45" parentObjId="20" parentObjType="module" what="location">
+      <location id="49" x="-427.229910149" y="-134.141451338" />
+    </change>
+    <change id="192" newObjId="50" oldObjId="46" parentObjId="21" parentObjType="module" what="location">
+      <location id="50" x="-292.006255772" y="-428.287019019" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:17:50" id="67" prevId="66" prune="" session="4" user="koop">
+    <add id="193" objectId="22" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="22" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="194" objectId="51" parentObjId="22" parentObjType="module" what="location">
+      <location id="51" x="-482.685303555" y="16.4739011452" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:17:52" id="68" prevId="67" prune="" session="4" user="koop">
+    <add id="195" objectId="23" parentObjId="" parentObjType="" what="connection">
+      <connection id="23" />
+    </add>
+    <add id="196" objectId="46" parentObjId="23" parentObjType="connection" what="port">
+      <port id="46" moduleId="22" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="197" objectId="47" parentObjId="23" parentObjType="connection" what="port">
+      <port id="47" moduleId="20" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:17:56" id="69" prevId="68" prune="" session="4" user="koop">
+    <change id="198" newObjId="52" oldObjId="51" parentObjId="22" parentObjType="module" what="location">
+      <location id="52" x="-499.1592047" y="-21.4160714888" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:17:56" id="70" prevId="69" prune="" session="4" user="koop">
+    <add id="199" objectId="23" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="23" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="200" objectId="53" parentObjId="23" parentObjType="module" what="location">
+      <location id="53" x="-235.576786377" y="-49.4217034357" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:17:58" id="71" prevId="70" prune="" session="4" user="koop">
+    <add id="201" objectId="24" parentObjId="" parentObjType="" what="connection">
+      <connection id="24" />
+    </add>
+    <add id="202" objectId="48" parentObjId="24" parentObjType="connection" what="port">
+      <port id="48" moduleId="23" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="203" objectId="49" parentObjId="24" parentObjType="connection" what="port">
+      <port id="49" moduleId="19" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:18:27" id="72" prevId="71" prune="" session="4" user="koop">
+    <change id="204" newObjId="54" oldObjId="50" parentObjId="21" parentObjType="module" what="location">
+      <location id="54" x="-222.815870962" y="-497.477403829" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:18:27" id="73" prevId="72" prune="" session="4" user="koop">
+    <add id="205" objectId="24" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="24" name="OutputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="206" objectId="55" parentObjId="24" parentObjType="module" what="location">
+      <location id="55" x="-130.143819047" y="-401.963187943" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:18:30" id="74" prevId="73" prune="" session="4" user="koop">
+    <add id="207" objectId="25" parentObjId="" parentObjType="" what="connection">
+      <connection id="25" />
+    </add>
+    <add id="208" objectId="50" parentObjId="25" parentObjType="connection" what="port">
+      <port id="50" moduleId="18" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="209" objectId="51" parentObjId="25" parentObjType="connection" what="port">
+      <port id="51" moduleId="24" moduleName="OutputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:18:44" id="75" prevId="74" prune="" session="4" user="koop">
+    <change id="210" newObjId="56" oldObjId="55" parentObjId="24" parentObjType="module" what="location">
+      <location id="56" x="-131.791209162" y="-411.84752863" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:18:45" id="76" prevId="75" prune="" session="4" user="koop">
+    <delete id="211" objectId="39" parentObjId="19" parentObjType="connection" what="port" />
+    <delete id="212" objectId="38" parentObjId="19" parentObjType="connection" what="port" />
+    <delete id="213" objectId="19" parentObjId="" parentObjType="" what="connection" />
+    <delete id="214" objectId="41" parentObjId="20" parentObjType="connection" what="port" />
+    <delete id="215" objectId="40" parentObjId="20" parentObjType="connection" what="port" />
+    <delete id="216" objectId="20" parentObjId="" parentObjType="" what="connection" />
+    <delete id="217" objectId="43" parentObjId="21" parentObjType="connection" what="port" />
+    <delete id="218" objectId="42" parentObjId="21" parentObjType="connection" what="port" />
+    <delete id="219" objectId="21" parentObjId="" parentObjType="" what="connection" />
+    <delete id="220" objectId="46" parentObjId="23" parentObjType="connection" what="port" />
+    <delete id="221" objectId="47" parentObjId="23" parentObjType="connection" what="port" />
+    <delete id="222" objectId="23" parentObjId="" parentObjType="" what="connection" />
+    <delete id="223" objectId="48" parentObjId="24" parentObjType="connection" what="port" />
+    <delete id="224" objectId="49" parentObjId="24" parentObjType="connection" what="port" />
+    <delete id="225" objectId="24" parentObjId="" parentObjType="" what="connection" />
+    <delete id="226" objectId="50" parentObjId="25" parentObjType="connection" what="port" />
+    <delete id="227" objectId="51" parentObjId="25" parentObjType="connection" what="port" />
+    <delete id="228" objectId="25" parentObjId="" parentObjType="" what="connection" />
+    <delete id="229" objectId="47" parentObjId="18" parentObjType="module" what="location" />
+    <delete id="230" objectId="18" parentObjId="" parentObjType="" what="module" />
+    <delete id="231" objectId="48" parentObjId="19" parentObjType="module" what="location" />
+    <delete id="232" objectId="19" parentObjId="" parentObjType="" what="module" />
+    <delete id="233" objectId="49" parentObjId="20" parentObjType="module" what="location" />
+    <delete id="234" objectId="20" parentObjId="" parentObjType="" what="module" />
+    <delete id="235" objectId="52" parentObjId="22" parentObjType="module" what="location" />
+    <delete id="236" objectId="22" parentObjId="" parentObjType="" what="module" />
+    <delete id="237" objectId="53" parentObjId="23" parentObjType="module" what="location" />
+    <delete id="238" objectId="23" parentObjId="" parentObjType="" what="module" />
+    <delete id="239" objectId="56" parentObjId="24" parentObjType="module" what="location" />
+    <delete id="240" objectId="24" parentObjId="" parentObjType="" what="module" />
+    <add id="241" objectId="25" parentObjId="" parentObjType="" what="group">
+      <group cache="1" id="25" name="Group" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+        <workflow id="" name="untitled" version="" vistrail_id="">
+          <connection id="1">
+            <port id="1" moduleId="1" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+            <port id="2" moduleId="2" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+          </connection>
+          <connection id="2">
+            <port id="3" moduleId="2" moduleName="LoadCSVFileIntoDB" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+            <port id="4" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+          </connection>
+          <connection id="3">
+            <port id="5" moduleId="1" moduleName="ComputeColumns" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+            <port id="6" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+          </connection>
+          <connection id="4">
+            <port id="7" moduleId="4" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+            <port id="8" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+          </connection>
+          <connection id="5">
+            <port id="9" moduleId="5" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+            <port id="10" moduleId="2" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+          </connection>
+          <connection id="6">
+            <port id="11" moduleId="1" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+            <port id="12" moduleId="6" moduleName="OutputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="destination" />
+          </connection>
+          <module cache="1" id="1" name="ComputeColumns" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="1" x="66.7948593185" y="-134.829855648" />
+          </module>
+          <module cache="1" id="2" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="2" x="57.1141870494" y="-46.6281749756" />
+          </module>
+          <module cache="1" id="3" name="ReadCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+            <location id="3" x="-134.767894144" y="65.4297450412" />
+          </module>
+          <module cache="1" id="4" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+            <location id="4" x="-206.697188695" y="178.15512489" />
+            <function id="1" name="name" pos="0">
+              <parameter alias="" id="1" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="csvFile" />
+            </function>
+          </module>
+          <module cache="1" id="5" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+            <location id="5" x="56.8852296284" y="150.149492943" />
+            <function id="2" name="name" pos="0">
+              <parameter alias="" id="2" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+            </function>
+          </module>
+          <module cache="1" id="6" name="OutputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+            <location id="6" x="160.670806843" y="-212.276332251" />
+            <function id="3" name="name" pos="0">
+              <parameter alias="" id="3" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+            </function>
+          </module>
+        </workflow>
+      </group>
+    </add>
+    <add id="242" objectId="57" parentObjId="25" parentObjType="group" what="location">
+      <location id="57" x="-292.462016005" y="-199.571196379" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:18:51" id="77" prevId="76" prune="" session="4" user="koop">
+    <change id="243" newObjId="58" oldObjId="33" parentObjId="4" parentObjType="module" what="location">
+      <location id="58" x="-38.9585627535" y="15.0773161002" />
+    </change>
+    <change id="244" newObjId="59" oldObjId="57" parentObjId="25" parentObjType="group" what="location">
+      <location id="59" x="7.36298483796" y="-179.802515005" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:18:51" id="78" prevId="77" prune="" session="4" user="koop">
+    <add id="245" objectId="26" parentObjId="" parentObjType="" what="connection">
+      <connection id="26" />
+    </add>
+    <add id="246" objectId="52" parentObjId="26" parentObjType="connection" what="port">
+      <port id="52" moduleId="4" moduleName="CreateEmptyLoadDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="247" objectId="53" parentObjId="26" parentObjType="connection" what="port">
+      <port id="53" moduleId="25" moduleName="Group" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:18:57" id="79" prevId="78" prune="" session="4" user="koop">
+    <change id="248" newObjId="60" oldObjId="59" parentObjId="25" parentObjType="group" what="location">
+      <location id="60" x="17.2473255251" y="-163.32861386" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:18:59" id="80" prevId="79" prune="" session="4" user="koop">
+    <add id="249" objectId="27" parentObjId="" parentObjType="" what="connection">
+      <connection id="27" />
+    </add>
+    <add id="250" objectId="54" parentObjId="27" parentObjType="connection" what="port">
+      <port id="54" moduleId="25" moduleName="Group" name="self" signature="(edu.utah.sci.vistrails.basic:Group)" type="source" />
+    </add>
+    <add id="251" objectId="55" parentObjId="27" parentObjType="connection" what="port">
+      <port id="55" moduleId="8" moduleName="Map" name="FunctionPort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:19:15" id="81" prevId="80" prune="" session="4" user="koop">
+    <change id="252" newObjId="13" oldObjId="8" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="13" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:19:23" id="82" prevId="81" prune="" session="4" user="koop">
+    <change id="253" newObjId="61" oldObjId="54" parentObjId="21" parentObjType="module" what="location">
+      <location id="61" x="212.095119272" y="-431.581799248" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:19:23" id="83" prevId="82" prune="" session="4" user="koop">
+    <add id="254" objectId="28" parentObjId="" parentObjType="" what="connection">
+      <connection id="28" />
+    </add>
+    <add id="255" objectId="56" parentObjId="28" parentObjType="connection" what="port">
+      <port id="56" moduleId="8" moduleName="Map" name="Result" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="256" objectId="57" parentObjId="28" parentObjType="connection" what="port">
+      <port id="57" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:19:27" id="84" prevId="83" prune="" session="4" user="koop">
+    <delete id="257" objectId="56" parentObjId="28" parentObjType="connection" what="port" />
+    <delete id="258" objectId="57" parentObjId="28" parentObjType="connection" what="port" />
+    <delete id="259" objectId="28" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-08 17:19:34" id="85" prevId="84" prune="" session="4" user="koop">
+    <add id="260" objectId="29" parentObjId="" parentObjType="" what="connection">
+      <connection id="29" />
+    </add>
+    <add id="261" objectId="58" parentObjId="29" parentObjType="connection" what="port">
+      <port id="58" moduleId="8" moduleName="Map" name="Result" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="262" objectId="59" parentObjId="29" parentObjType="connection" what="port">
+      <port id="59" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:21:28" id="86" prevId="85" prune="" session="4" user="koop">
+    <change id="263" newObjId="62" oldObjId="61" parentObjId="21" parentObjType="module" what="location">
+      <location id="62" x="217.990984439" y="-457.523605984" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:21:28" id="87" prevId="86" prune="" session="4" user="koop">
+    <delete id="264" objectId="58" parentObjId="29" parentObjType="connection" what="port" />
+    <delete id="265" objectId="59" parentObjId="29" parentObjType="connection" what="port" />
+    <delete id="266" objectId="29" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-08 17:21:31" id="88" prevId="87" prune="" session="4" user="koop">
+    <add id="267" objectId="30" parentObjId="" parentObjType="" what="connection">
+      <connection id="30" />
+    </add>
+    <add id="268" objectId="60" parentObjId="30" parentObjType="connection" what="port">
+      <port id="60" moduleId="25" moduleName="Group" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="269" objectId="61" parentObjId="30" parentObjType="connection" what="port">
+      <port id="61" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:21:51" id="89" prevId="88" prune="" session="4" user="koop">
+    <change id="270" newObjId="63" oldObjId="62" parentObjId="21" parentObjType="module" what="location">
+      <location id="63" x="2.20231931269" y="-396.206608244" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:21:51" id="90" prevId="89" prune="" session="4" user="koop">
+    <delete id="271" objectId="60" parentObjId="30" parentObjType="connection" what="port" />
+    <delete id="272" objectId="61" parentObjId="30" parentObjType="connection" what="port" />
+    <delete id="273" objectId="30" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2009-04-08 17:22:10" id="91" prevId="90" prune="" session="4" user="koop">
+    <change id="274" newObjId="64" oldObjId="63" parentObjId="21" parentObjType="module" what="location">
+      <location id="64" x="228.60354174" y="-455.165259917" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:22:23" id="92" prevId="91" prune="" session="4" user="koop">
+    <add id="275" objectId="26" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="26" name="If" namespace="" package="edu.utah.sci.vistrails.control_flow" tag="" version="0.1" />
+    </add>
+    <add id="276" objectId="65" parentObjId="26" parentObjType="module" what="location">
+      <location id="65" x="149.754975252" y="-367.901986445" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:22:36" id="93" prevId="92" prune="" session="4" user="koop">
+    <change id="277" newObjId="66" oldObjId="64" parentObjId="21" parentObjType="module" what="location">
+      <location id="66" x="235.953509581" y="-468.64020096" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:22:39" id="94" prevId="93" prune="" session="4" user="koop">
+    <add id="278" objectId="31" parentObjId="" parentObjType="" what="connection">
+      <connection id="31" />
+    </add>
+    <add id="279" objectId="62" parentObjId="31" parentObjType="connection" what="port">
+      <port id="62" moduleId="21" moduleName="CompactDatabase" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="280" objectId="63" parentObjId="31" parentObjType="connection" what="port">
+      <port id="63" moduleId="26" moduleName="If" name="TruePort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:22:41" id="95" prevId="94" prune="" session="4" user="koop">
+    <add id="281" objectId="32" parentObjId="" parentObjType="" what="connection">
+      <connection id="32" />
+    </add>
+    <add id="282" objectId="64" parentObjId="32" parentObjType="connection" what="port">
+      <port id="64" moduleId="8" moduleName="Map" name="Result" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="283" objectId="65" parentObjId="32" parentObjType="connection" what="port">
+      <port id="65" moduleId="26" moduleName="If" name="Condition" signature="(edu.utah.sci.vistrails.basic:Boolean)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:22:56" id="96" prevId="95" prune="" session="4" user="koop">
+    <change id="284" newObjId="67" oldObjId="65" parentObjId="26" parentObjType="module" what="location">
+      <location id="67" x="165.679905574" y="-369.126981085" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:22:56" id="97" prevId="96" prune="" session="4" user="koop">
+    <add id="285" objectId="33" parentObjId="" parentObjType="" what="connection">
+      <connection id="33" />
+    </add>
+    <add id="286" objectId="66" parentObjId="33" parentObjType="connection" what="port">
+      <port id="66" moduleId="4" moduleName="CreateEmptyLoadDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="287" objectId="67" parentObjId="33" parentObjType="connection" what="port">
+      <port id="67" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:23:40" id="98" prevId="97" prune="" session="4" user="koop">
+    <change id="288" newObjId="68" oldObjId="66" parentObjId="21" parentObjType="module" what="location">
+      <location id="68" x="360.902962881" y="-460.065238478" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:23:40" id="99" prevId="98" prune="" session="4" user="koop" />
+  <action date="2009-04-08 17:43:41" id="100" prevId="99" prune="" session="5" user="koop">
+    <change id="289" newObjId="69" oldObjId="67" parentObjId="26" parentObjType="module" what="location">
+      <location id="69" x="176.22882839" y="-382.689881848" />
+    </change>
+  </action>
+  <action date="2009-04-08 17:43:41" id="101" prevId="100" prune="" session="5" user="koop">
+    <add id="290" objectId="27" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="27" name="Module" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2" />
+    </add>
+    <add id="291" objectId="70" parentObjId="27" parentObjType="module" what="location">
+      <location id="70" x="325.509618316" y="-292.355860895" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:43:47" id="102" prevId="101" prune="" session="5" user="koop">
+    <add id="292" objectId="34" parentObjId="" parentObjType="" what="connection">
+      <connection id="34" />
+    </add>
+    <add id="293" objectId="68" parentObjId="34" parentObjType="connection" what="port">
+      <port id="68" moduleId="27" moduleName="Module" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="294" objectId="69" parentObjId="34" parentObjType="connection" what="port">
+      <port id="69" moduleId="26" moduleName="If" name="FalsePort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-08 17:44:42" id="103" prevId="102" prune="" session="5" user="koop">
+    <change id="295" newObjId="71" oldObjId="70" parentObjId="27" parentObjType="module" what="location">
+      <location id="71" x="201.936522474" y="-468.673570816" />
+    </change>
+  </action>
+  <action date="2009-04-10 13:39:54" id="104" prevId="103" prune="" session="6" user="koop">
+    <add id="296" objectId="28" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="28" name="DetectionsHistogram" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0" />
+    </add>
+    <add id="297" objectId="72" parentObjId="28" parentObjType="module" what="location">
+      <location id="72" x="429.549610616" y="-595.581197698" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:39:57" id="105" prevId="104" prune="" session="6" user="koop">
+    <add id="298" objectId="35" parentObjId="" parentObjType="" what="connection">
+      <connection id="35" />
+    </add>
+    <add id="299" objectId="70" parentObjId="35" parentObjType="connection" what="port">
+      <port id="70" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    </add>
+    <add id="300" objectId="71" parentObjId="35" parentObjType="connection" what="port">
+      <port id="71" moduleId="28" moduleName="DetectionsHistogram" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:41:24" id="106" prevId="105" prune="" session="6" user="koop">
+    <add id="301" objectId="29" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="29" name="MplPlot" namespace="" package="edu.utah.sci.vistrails.matplotlib" tag="" version="0.9.0" />
+    </add>
+    <add id="302" objectId="73" parentObjId="29" parentObjType="module" what="location">
+      <location id="73" x="549.285584018" y="-710.147790766" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:41:28" id="107" prevId="106" prune="" session="6" user="koop">
+    <add id="303" objectId="30" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="30" name="MplFigure" namespace="" package="edu.utah.sci.vistrails.matplotlib" tag="" version="0.9.0" />
+    </add>
+    <add id="304" objectId="74" parentObjId="30" parentObjType="module" what="location">
+      <location id="74" x="572.826394762" y="-823.928376027" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:41:30" id="108" prevId="107" prune="" session="6" user="koop">
+    <add id="305" objectId="31" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="31" name="MplFigureCell" namespace="" package="edu.utah.sci.vistrails.matplotlib" tag="" version="0.9.0" />
+    </add>
+    <add id="306" objectId="75" parentObjId="31" parentObjType="module" what="location">
+      <location id="75" x="590.482002819" y="-937.708961288" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:41:34" id="109" prevId="108" prune="" session="6" user="koop">
+    <add id="307" objectId="36" parentObjId="" parentObjType="" what="connection">
+      <connection id="36" />
+    </add>
+    <add id="308" objectId="72" parentObjId="36" parentObjType="connection" what="port">
+      <port id="72" moduleId="30" moduleName="MplFigure" name="FigureManager" signature="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" type="source" />
+    </add>
+    <add id="309" objectId="73" parentObjId="36" parentObjType="connection" what="port">
+      <port id="73" moduleId="31" moduleName="MplFigureCell" name="FigureManager" signature="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:41:42" id="110" prevId="109" prune="" session="6" user="koop">
+    <add id="310" objectId="37" parentObjId="" parentObjType="" what="connection">
+      <connection id="37" />
+    </add>
+    <add id="311" objectId="74" parentObjId="37" parentObjType="connection" what="port">
+      <port id="74" moduleId="29" moduleName="MplPlot" name="source" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    </add>
+    <add id="312" objectId="75" parentObjId="37" parentObjType="connection" what="port">
+      <port id="75" moduleId="30" moduleName="MplFigure" name="Script" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:45:54" id="111" prevId="110" prune="" session="6" user="koop">
+    <add id="313" objectId="0" parentObjId="29" parentObjType="module" what="portSpec">
+      <portSpec id="0" name="histogramData" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="0" type="input" />
+    </add>
+    <add id="314" objectId="6" parentObjId="29" parentObjType="module" what="function">
+      <function id="6" name="source" pos="0" />
+    </add>
+    <add id="315" objectId="14" parentObjId="6" parentObjType="function" what="parameter">
+      <parameter alias="" id="14" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="x%20%3D%20%5Ba%5B1%5D%20for%20a%20in%20histogramData%5D%0Abins%20%3D%20%5Ba%5B0%5D%20for%20a%20in%20histogramData%5D%0A%0Ahist%28x%2C%20bins%29%0A" />
+    </add>
+  </action>
+  <action date="2009-04-10 13:45:58" id="112" prevId="111" prune="" session="6" user="koop">
+    <add id="316" objectId="38" parentObjId="" parentObjType="" what="connection">
+      <connection id="38" />
+    </add>
+    <add id="317" objectId="76" parentObjId="38" parentObjType="connection" what="port">
+      <port id="76" moduleId="28" moduleName="DetectionsHistogram" name="histogram" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="source" />
+    </add>
+    <add id="318" objectId="77" parentObjId="38" parentObjType="connection" what="port">
+      <port id="77" moduleId="29" moduleName="MplPlot" name="histogramData" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="destination" />
+    </add>
+  </action>
+  <action date="2009-04-10 14:02:37" id="113" prevId="112" prune="" session="7" user="koop">
+    <change id="319" newObjId="15" oldObjId="14" parentObjId="6" parentObjType="function" what="parameter">
+      <parameter alias="" id="15" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="x%20%3D%20%5Ba%5B1%5D%20for%20a%20in%20histogramData%5D%0Abins%20%3D%20%5Ba%5B0%5D%20for%20a%20in%20histogramData%5D%0A%0Abar%28x%2C%20bins%29%0A" />
+    </change>
+  </action>
+  <action date="2009-04-10 14:03:17" id="114" prevId="113" prune="" session="7" user="koop">
+    <change id="320" newObjId="16" oldObjId="15" parentObjId="6" parentObjType="function" what="parameter">
+      <parameter alias="" id="16" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="x%20%3D%20%5Ba%5B1%5D%20for%20a%20in%20histogramData%5D%0Abins%20%3D%20%5Ba%5B0%5D%20for%20a%20in%20histogramData%5D%0A%0Abar%28bins%2C%20x%29%0A" />
+    </change>
+  </action>
+  <action date="2009-04-10 14:03:32" id="115" prevId="114" prune="" session="7" user="koop">
+    <change id="321" newObjId="17" oldObjId="10" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="17" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945" />
+    </change>
+  </action>
+  <action date="2009-04-10 14:04:46" id="116" prevId="115" prune="" session="7" user="koop">
+    <add id="322" objectId="7" parentObjId="28" parentObjType="module" what="function">
+      <function id="7" name="highQuality" pos="0" />
+    </add>
+    <add id="323" objectId="18" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="18" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Boolean" val="" />
+    </add>
+  </action>
+  <action date="2009-04-10 14:04:47" id="117" prevId="116" prune="" session="7" user="koop">
+    <change id="324" newObjId="19" oldObjId="18" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="19" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Boolean" val="True" />
+    </change>
+  </action>
+  <action date="2009-04-10 14:06:31" id="118" prevId="117" prune="" session="8" user="koop" />
+  <action date="2009-04-10 14:06:32" id="119" prevId="118" prune="" session="8" user="koop">
+    <change id="325" newObjId="20" oldObjId="19" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="20" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Boolean" val="False" />
+    </change>
+  </action>
+  <action date="2009-04-10 14:08:48" id="120" prevId="119" prune="" session="8" user="koop">
+    <change id="326" newObjId="21" oldObjId="20" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="21" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Boolean" val="True" />
+    </change>
+  </action>
+  <action date="2009-04-10 14:09:20" id="121" prevId="120" prune="" session="8" user="koop" />
+  <tag id="46" name="Working Map" />
+  <tag id="60" name="SingleString" />
+  <tag id="85" name="Moved Compact" />
+  <tag id="99" name="Compact Outside" />
+  <tag id="103" name="Fixed False Branch" />
+  <tag id="119" name="Histogram" />
+  <tag id="120" name="High Quality Histogram" />
+</vistrail>
diff --git a/contrib/pc3/workflow_wf.xml b/contrib/pc3/workflow_wf.xml
new file mode 100644
index 0000000..756df00
--- /dev/null
+++ b/contrib/pc3/workflow_wf.xml
@@ -0,0 +1,169 @@
+<workflow id="0" name="untitled" version="1.0.0" vistrail_id="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/workflow.xsd">
+  <connection id="32">
+    <port id="64" moduleId="8" moduleName="Map" name="Result" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+    <port id="65" moduleId="26" moduleName="If" name="Condition" signature="(edu.utah.sci.vistrails.basic:Boolean)" type="destination" />
+  </connection>
+  <connection id="33">
+    <port id="66" moduleId="4" moduleName="CreateEmptyLoadDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    <port id="67" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+  </connection>
+  <connection id="34">
+    <port id="68" moduleId="27" moduleName="Module" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+    <port id="69" moduleId="26" moduleName="If" name="FalsePort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+  </connection>
+  <connection id="35">
+    <port id="70" moduleId="21" moduleName="CompactDatabase" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    <port id="71" moduleId="28" moduleName="DetectionsHistogram" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+  </connection>
+  <connection id="36">
+    <port id="72" moduleId="30" moduleName="MplFigure" name="FigureManager" signature="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" type="source" />
+    <port id="73" moduleId="31" moduleName="MplFigureCell" name="FigureManager" signature="(edu.utah.sci.vistrails.matplotlib:MplFigureManager)" type="destination" />
+  </connection>
+  <connection id="37">
+    <port id="74" moduleId="29" moduleName="MplPlot" name="source" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    <port id="75" moduleId="30" moduleName="MplFigure" name="Script" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+  </connection>
+  <connection id="6">
+    <port id="12" moduleId="2" moduleName="GetCSVFiles" name="csvFiles" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="source" />
+    <port id="13" moduleId="8" moduleName="Map" name="InputList" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="destination" />
+  </connection>
+  <connection id="38">
+    <port id="76" moduleId="28" moduleName="DetectionsHistogram" name="histogram" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="source" />
+    <port id="77" moduleId="29" moduleName="MplPlot" name="histogramData" signature="(edu.utah.sci.vistrails.control_flow:ListOfElements)" type="destination" />
+  </connection>
+  <connection id="11">
+    <port id="22" moduleId="12" moduleName="String" name="value" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    <port id="23" moduleId="4" moduleName="CreateEmptyLoadDB" name="jobID" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+  </connection>
+  <connection id="12">
+    <port id="24" moduleId="12" moduleName="String" name="value" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    <port id="25" moduleId="13" moduleName="ConcatenateString" name="str2" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+  </connection>
+  <connection id="13">
+    <port id="26" moduleId="13" moduleName="ConcatenateString" name="value" signature="(edu.utah.sci.vistrails.basic:String)" type="source" />
+    <port id="27" moduleId="2" moduleName="GetCSVFiles" name="csvRootPath" signature="(edu.utah.sci.vistrails.basic:String)" type="destination" />
+  </connection>
+  <connection id="26">
+    <port id="52" moduleId="4" moduleName="CreateEmptyLoadDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+    <port id="53" moduleId="25" moduleName="Group" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+  </connection>
+  <connection id="27">
+    <port id="54" moduleId="25" moduleName="Group" name="self" signature="(edu.utah.sci.vistrails.basic:Group)" type="source" />
+    <port id="55" moduleId="8" moduleName="Map" name="FunctionPort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+  </connection>
+  <connection id="31">
+    <port id="62" moduleId="21" moduleName="CompactDatabase" name="self" signature="(edu.utah.sci.vistrails.basic:Module)" type="source" />
+    <port id="63" moduleId="26" moduleName="If" name="TruePort" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+  </connection>
+  <module cache="1" id="2" name="GetCSVFiles" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+    <location id="21" x="338.293817527" y="-164.978391356" />
+  </module>
+  <module cache="1" id="4" name="CreateEmptyLoadDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+    <location id="58" x="-38.9585627535" y="15.0773161002" />
+  </module>
+  <module cache="1" id="8" name="Map" namespace="" package="edu.utah.sci.vistrails.control_flow" tag="" version="0.1">
+    <location id="20" x="114.016806723" y="-292.571428571" />
+    <function id="2" name="InputPort" pos="0">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="edu.utah.sci.vistrails.control_flow:ListOfElements" val="['csvFile']" />
+    </function>
+    <function id="3" name="OutputPort" pos="1">
+      <parameter alias="" id="13" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+    </function>
+  </module>
+  <module cache="1" id="12" name="String" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+    <location id="37" x="150.588235294" y="152.739495798" />
+    <function id="4" name="value" pos="0">
+      <parameter alias="" id="17" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="J062945" />
+    </function>
+  </module>
+  <module cache="1" id="13" name="ConcatenateString" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+    <location id="36" x="271.058823529" y="52.7058823529" />
+    <function id="5" name="str1" pos="0">
+      <parameter alias="" id="12" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="/vistrails/pc3/SampleData/" />
+    </function>
+  </module>
+  <module cache="1" id="21" name="CompactDatabase" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+    <location id="68" x="360.902962881" y="-460.065238478" />
+  </module>
+  <group cache="1" id="25" name="Group" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="">
+    <workflow id="" name="untitled" version="" vistrail_id="">
+      <connection id="1">
+        <port id="1" moduleId="1" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+        <port id="2" moduleId="2" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+      </connection>
+      <connection id="2">
+        <port id="3" moduleId="2" moduleName="LoadCSVFileIntoDB" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+        <port id="4" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+      </connection>
+      <connection id="3">
+        <port id="5" moduleId="1" moduleName="ComputeColumns" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+        <port id="6" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="source" />
+      </connection>
+      <connection id="4">
+        <port id="7" moduleId="4" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+        <port id="8" moduleId="3" moduleName="ReadCSVFile" name="csvFile" signature="(edu.utah.sci.dakoop.pc3:CSVFileEntry)" type="destination" />
+      </connection>
+      <connection id="5">
+        <port id="9" moduleId="5" moduleName="InputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="source" />
+        <port id="10" moduleId="2" moduleName="LoadCSVFileIntoDB" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="destination" />
+      </connection>
+      <connection id="6">
+        <port id="11" moduleId="1" moduleName="ComputeColumns" name="dbEntry" signature="(edu.utah.sci.dakoop.pc3:DatabaseEntry)" type="source" />
+        <port id="12" moduleId="6" moduleName="OutputPort" name="InternalPipe" signature="(edu.utah.sci.vistrails.basic:Variant)" type="destination" />
+      </connection>
+      <module cache="1" id="1" name="ComputeColumns" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+        <location id="1" x="66.7948593185" y="-134.829855648" />
+      </module>
+      <module cache="1" id="2" name="LoadCSVFileIntoDB" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+        <location id="2" x="57.1141870494" y="-46.6281749756" />
+      </module>
+      <module cache="1" id="3" name="ReadCSVFile" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+        <location id="3" x="-134.767894144" y="65.4297450412" />
+      </module>
+      <module cache="1" id="4" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+        <location id="4" x="-206.697188695" y="178.15512489" />
+        <function id="1" name="name" pos="0">
+          <parameter alias="" id="1" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="csvFile" />
+        </function>
+      </module>
+      <module cache="1" id="5" name="InputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+        <location id="5" x="56.8852296284" y="150.149492943" />
+        <function id="2" name="name" pos="0">
+          <parameter alias="" id="2" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+        </function>
+      </module>
+      <module cache="1" id="6" name="OutputPort" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+        <location id="6" x="160.670806843" y="-212.276332251" />
+        <function id="3" name="name" pos="0">
+          <parameter alias="" id="3" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="dbEntry" />
+        </function>
+      </module>
+    </workflow>
+    <location id="60" x="17.2473255251" y="-163.32861386" />
+  </group>
+  <module cache="1" id="26" name="If" namespace="" package="edu.utah.sci.vistrails.control_flow" tag="" version="0.1">
+    <location id="69" x="176.22882839" y="-382.689881848" />
+  </module>
+  <module cache="1" id="27" name="Module" namespace="" package="edu.utah.sci.vistrails.basic" tag="" version="1.2">
+    <location id="71" x="201.936522474" y="-468.673570816" />
+  </module>
+  <module cache="1" id="28" name="DetectionsHistogram" namespace="" package="edu.utah.sci.dakoop.pc3" tag="" version="1.0.0">
+    <location id="72" x="429.549610616" y="-595.581197698" />
+    <function id="7" name="highQuality" pos="0">
+      <parameter alias="" id="21" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Boolean" val="True" />
+    </function>
+  </module>
+  <module cache="1" id="29" name="MplPlot" namespace="" package="edu.utah.sci.vistrails.matplotlib" tag="" version="0.9.0">
+    <location id="73" x="549.285584018" y="-710.147790766" />
+    <function id="6" name="source" pos="0">
+      <parameter alias="" id="16" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:String" val="x%20%3D%20%5Ba%5B1%5D%20for%20a%20in%20histogramData%5D%0Abins%20%3D%20%5Ba%5B0%5D%20for%20a%20in%20histogramData%5D%0A%0Abar%28bins%2C%20x%29%0A" />
+    </function>
+    <portSpec id="0" name="histogramData" optional="0" sigstring="(edu.utah.sci.vistrails.control_flow:ListOfElements)" sortKey="0" type="input" />
+  </module>
+  <module cache="1" id="30" name="MplFigure" namespace="" package="edu.utah.sci.vistrails.matplotlib" tag="" version="0.9.0">
+    <location id="74" x="572.826394762" y="-823.928376027" />
+  </module>
+  <module cache="1" id="31" name="MplFigureCell" namespace="" package="edu.utah.sci.vistrails.matplotlib" tag="" version="0.9.0">
+    <location id="75" x="590.482002819" y="-937.708961288" />
+  </module>
+</workflow>
diff --git a/contrib/poissonrecon.py b/contrib/poissonrecon.py
new file mode 100644
index 0000000..5039182
--- /dev/null
+++ b/contrib/poissonrecon.py
@@ -0,0 +1,101 @@
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+import core.bundles
+import core.requirements
+import os
+import re
+
+from core.configuration import ConfigurationObject
+
+configuration = ConfigurationObject(executable_path=(None, str))
+
+identifier = 'edu.utah.sci.cscheid.poissonrecon'
+version = '0.1'
+name = 'Poisson Surface Reconstruction'
+
+##############################################################################
+
+class PoissonRecon(Module):
+
+    def __init__(self):
+        Module.__init__(self)
+
+    def compute(self):
+        self.checkInputPort('pts')
+        f1 = self.getInputFromPort('mesh1')
+
+        make_file = self.interpreter.filePool.create_file
+
+        metro_output = make_file(suffix='.ply')
+
+        values = ['', f1.name, f2.name, '-q']
+
+        need_error_meshes = False
+        if (self.outputPorts.has_key('error_mesh_1') or
+            self.outputPorts.has_key('error_mesh_2')):
+            need_error_meshes = True
+            error_mesh_output = (make_file(suffix='.ply'),
+                                 make_file(suffix='.ply'))
+            values.append('-c')
+            values.append(error_mesh_output[0].name)
+            values.append(error_mesh_output[1].name)
+
+        need_histograms = False
+        if (self.outputPorts.has_key('error_hist_1') or
+            self.outputPorts.has_key('error_hist_2')):
+            need_histograms = True
+            error_hist_output = (make_file(suffix='.csv'),
+                                 make_file(suffix='.csv'))
+            values.append('-h')
+            values.append(error_hist_output[0].name)
+            values.append(error_hist_output[1].name)
+
+        print values
+        print ('%s ' * len(values))
+        cmdline = ('%s ' * len(values)) % tuple(values)
+        cmdline += '> '
+        cmdline += metro_output.name
+        print cmdline
+        
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, "Execution failed")
+        l = [x for x in file(metro_output.name).readlines()
+             if x.startswith('Hausdorff')][0]
+        regexp = re.compile(r'Hausdorff distance: ([0123456789.]+) \(([0123456789.]+)  wrt bounding box diagonal\)')
+        results = regexp.match(l).groups()
+        
+        if need_error_meshes:
+            self.setResult('error_mesh_1', error_mesh_output[0])
+            self.setResult('error_mesh_2', error_mesh_output[1])
+
+        if need_histograms:
+            self.setResult('error_hist_1', error_hist_output[0])
+            self.setResult('error_hist_2', error_hist_output[1])
+
+        self.need_error_meshes = need_error_meshes
+        self.need_histograms = need_histograms
+
+        self.setResult('hausdorff_error', float(results[0]))
+        self.setResult('normalized_hausdorff_error', float(results[1]))
+
+##############################################################################
+
+def initialize():
+    if not core.requirements.executable_file_exists('PoissonRecon'):
+        raise core.requirements.MissingRequirement("PoissonRecon")
+    
+    reg = core.modules.module_registry
+
+    reg.add_module(PoissonRecon)
+    reg.add_input_port(PoissonRecon, 'pts',
+                       core.modules.basic_modules.File)
+    reg.add_input_port(PoissonRecon, 'binary',
+                       core.modules.basic_modules.Boolean)
+    reg.add_input_port(PoissonRecon, 'depth',
+                       core.modules.basic_modules.Integer)
+
+    reg.add_output_port(PoissonRecon, 'output',
+                        core.modules.basic_modules.File)
+
diff --git a/contrib/provenance/__init__.py b/contrib/provenance/__init__.py
new file mode 100644
index 0000000..cadc047
--- /dev/null
+++ b/contrib/provenance/__init__.py
@@ -0,0 +1,274 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""This package defines a set of methods that perform the command-line
+tools necesary for the task designed for the first Provenance Challenge:
+
+http://twiki.ipaw.info
+
+This VisTrails package requires three software packages to be installed:
+
+AIR - Automated Image Registration: http://bishopw.loni.ucla.edu/AIR5/
+FSL - http://www.fmrib.ox.ac.uk/fsl/
+netpbm - http://netpbm.sourceforge.net/
+
+"""
+
+from core.modules.vistrails_module import Module, ModuleError, new_module
+import core.modules
+import core.modules.basic_modules
+import core.modules.module_registry
+import core.utils
+from core.system import list2cmdline
+import os
+import os.path
+import stat
+import subprocess
+
+version = '0.9.0'
+name = 'Provenance Challenge'
+identifier = 'edu.utah.sci.vistrails.provenance'
+################################################################################
+
+global_airpath = ""
+global_fslpath = ""
+global_netpbmpath = ""
+
+class ProvenanceChallenge(Module):
+    """ProvenanceChallenge is the base Module for all Modules in the provenance
+package. It simply define helper methods for subclasses."""
+
+    __quiet = True
+    __programsQuiet = True
+    
+    def air_cmd_line(self, cmd, *params):
+        """Runs a command-line command for the AIR tools."""
+        return list2cmdline([global_airpath + cmd] + list(params))
+
+    def fsl_cmd_line(self, cmd, *params):
+        """Runs a command-line command for the FSL tools."""
+        return ('FSLOUTPUTTYPE=NIFTI_GZ ' +
+                list2cmdline([global_fslpath + cmd] + list(params)))
+
+    def run(self, cmd):
+        if not self.__quiet:
+            print cmd
+        if self.__programsQuiet:
+            cmd = '(' + cmd + ') 2>&1 >/dev/null' 
+        r = os.system(cmd)
+        if r != 0:
+            raise ModuleError(self, "system call failed: '%s'" % cmd)
+
+
+class AIRHeaderFile(core.modules.basic_modules.File):
+    """AIRHeaderFile subclasses File to annotate the execution with header
+file information for later querying."""
+
+    def get_header_annotations(self):
+        """Returns the header information for the file using the AIR scanheader
+tool."""
+        process = subprocess.Popen(global_airpath + 'scanheader ' + self.name,
+                                   shell=True,
+                                   stdout=subprocess.PIPE)
+        if process.wait() != 0:
+            raise ModuleError(self, "Could not open header file " + self.name)
+
+        result = {}
+        lines = core.utils.no_interrupt(process.stdout.readlines)
+        for l in lines:
+            l = l[:-1]
+            if not l:
+                continue
+            entries = l.split('=')
+            if len(entries) != 2:
+                raise ModuleError(self,
+                                  "Error parsing line '%s' of header %s" %
+                                  (l[:-1], self.name))
+            result[entries[0]] = entries[1]
+        return result
+
+    def compute(self):
+        core.modules.basic_modules.File.compute(self)
+        d = self.get_header_annotations()
+        self.annotate(d)
+
+
+class AlignWarp(ProvenanceChallenge):
+    """AlignWarp executes the AIR warping tool on the input."""
+
+    def compute(self):
+        image = self.getInputFromPort("image")
+        ref = self.getInputFromPort("reference")
+        model = self.getInputFromPort("model")
+        o = self.interpreter.filePool.create_file(suffix='.warp')
+        cmd = self.air_cmd_line('align_warp',
+                                image.name,
+                                ref.name,
+                                o.name,
+                                '-m',
+                                str(model),
+                                '-q')
+        self.run(cmd)
+        self.setResult("output", o)
+
+
+class Reslice(ProvenanceChallenge):
+    """AlignWarp executes the AIR reslicing tool on the input."""
+
+    def compute(self):
+        warp = self.getInputFromPort("warp")
+        o = self.interpreter.filePool.create_file()
+        cmd = self.air_cmd_line('reslice',
+                                 warp.name,
+                                 o.name)
+        self.run(cmd)
+        self.setResult("output", o)
+
+
+class SoftMean(ProvenanceChallenge):
+    """SoftMean executes the AIR softmean averaging tool on the input."""
+
+    def compute(self):
+        imageList = self.getInputFromPort("imageList")
+        o = self.interpreter.filePool.create_file(suffix='.hdr')
+        cmd = self.air_cmd_line('softmean',
+                                o.name,
+                                'y',
+                                'null',
+                                *[f.name for f in imageList])
+        self.run(cmd)
+        self.setResult('output', o)
+
+
+class Slicer(ProvenanceChallenge):
+    """Slicer executes the FSL slicer tool on the input."""
+
+    def compute(self):
+        cmd = ['slicer']
+        i = self.getInputFromPort("input")
+        cmd.append(i.name)
+        if self.hasInputFromPort("slice_x"):
+            cmd.append('-x')
+            cmd.append(str(self.getInputFromPort("slice_x")))
+        elif self.hasInputFromPort("slice_y"):
+            cmd.append('-y')
+            cmd.append(str(self.getInputFromPort("slice_y")))
+        elif self.hasInputFromPort("slice_z"):
+            cmd.append('-z')
+            cmd.append(str(self.getInputFromPort("slice_z")))
+        o = self.interpreter.filePool.create_file(suffix='.pgm')
+        cmd.append(o.name)
+        self.run(self.fsl_cmd_line(*cmd))
+        self.setResult('output', o)
+
+
+class PGMToPPM(ProvenanceChallenge):
+    """PGMToPPM executes the netpbm pgmtoppm tool on the input."""
+
+    def compute(self):
+        cmd = ['pgmtoppm', 'white']
+        i = self.getInputFromPort("input")
+        cmd.append(i.name)
+        o = self.interpreter.filePool.create_file(suffix='.ppm')
+        cmd.append(' >')
+        cmd.append(o.name)
+        self.run(list2cmdline(cmd))
+        self.setResult('output', o)
+        
+
+class PNMToJpeg(ProvenanceChallenge):
+    """PGMToPPM executes the netpbm pnmtojpeg tool on the input."""
+
+    def compute(self):
+        cmd = ['pnmtojpeg']
+        i = self.getInputFromPort("input")
+        cmd.append(i.name)
+        o = self.interpreter.filePool.create_file(suffix='.jpg')
+        cmd.append(' >')
+        cmd.append(o.name)
+        self.run(list2cmdline(cmd))
+        self.setResult('output', o)
+
+################################################################################
+
+def checkProgram(fileName):
+    return os.path.isfile(fileName) and os.stat(fileName) & 005
+
+def initialize(airpath=None, fslpath=None, netpbmpath=None, *args, **kwargs):
+    print "Initializing Provenance Challenge Package"
+
+    if not airpath:
+        print "airpath not specified or incorrect: Will assume AIR tools are on the path"
+    else:
+        print "Will use AIR tools from ", airpath
+        global global_airpath
+        global_airpath = airpath + '/'
+
+    if not fslpath:
+        print "fslpath not specified or incorrect: Will assume fsl tools are on the path"
+    else:
+        print "Will use FSL tools from ", fslpath
+        global global_fslpath
+        global_fslpath = fslpath + '/'
+
+    if not netpbmpath:
+        print "netpbmpath not specified or incorrect: Will assume netpbm tools are on the path"
+    else:
+        print "Will use netpbm tools from ", netpbmpath
+        global global_netpbmpath
+        global_netpbmpath = netpbmpath + '/'
+        
+    reg = core.modules.module_registry
+    basic = core.modules.basic_modules
+    reg.add_module(ProvenanceChallenge)
+    
+    reg.add_module(AlignWarp)
+    reg.add_input_port(AlignWarp, "image", (basic.File, 'the image file to be deformed'))
+    reg.add_input_port(AlignWarp, "image_header", (basic.File, 'the header of the image to be deformed'))
+    reg.add_input_port(AlignWarp, "reference", (basic.File, 'the reference image'))
+    reg.add_input_port(AlignWarp, "reference_header", (basic.File, 'the header of the reference image'))
+    reg.add_input_port(AlignWarp, "model", (basic.Integer, 'the deformation model'))
+    reg.add_output_port(AlignWarp, "output", (basic.File, 'the output deformation'))
+
+    reg.add_module(Reslice)
+    reg.add_input_port(Reslice, "warp", (basic.File, 'the warping to be resliced'))
+    reg.add_output_port(Reslice, "output", (basic.File, 'the new slice'))
+    
+    reg.add_module(SoftMean)
+    reg.add_input_port(SoftMean, "imageList", (basic.List, 'image files'))
+    reg.add_output_port(SoftMean, "output", (basic.File, 'average image'))
+
+    reg.add_module(Slicer)
+    reg.add_input_port(Slicer, "input", (basic.File, 'the input file to be sliced'))
+    reg.add_input_port(Slicer, "slice_x", (basic.Float, 'sagittal slice with given value'))
+    reg.add_input_port(Slicer, "slice_y", (basic.Float, 'coronal slice with given value'))
+    reg.add_input_port(Slicer, "slice_z", (basic.Float, 'axial slice with given value'))
+    reg.add_output_port(Slicer, "output", (basic.File, 'slice output'))
+
+    reg.add_module(PGMToPPM)
+    reg.add_input_port(PGMToPPM, "input", (basic.File, "input"))
+    reg.add_output_port(PGMToPPM, "output", (basic.File, "output"))
+
+    reg.add_module(PNMToJpeg)
+    reg.add_input_port(PNMToJpeg, "input", (basic.File, "input"))
+    reg.add_output_port(PNMToJpeg, "output", (basic.File, "output"))
+
+    reg.add_module(AIRHeaderFile)
diff --git a/contrib/provenance2/__init__.py b/contrib/provenance2/__init__.py
new file mode 100644
index 0000000..7347b39
--- /dev/null
+++ b/contrib/provenance2/__init__.py
@@ -0,0 +1,366 @@
+############################################################################
+##
+## Copyright (C) 2006-2007 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""This package defines a set of methods that perform the command-line
+tools necesary for the task designed for the first Provenance Challenge:
+
+http://twiki.ipaw.info
+
+This VisTrails package requires three software packages to be installed:
+
+AIR - Automated Image Registration: http://bishopw.loni.ucla.edu/AIR5/
+FSL - http://www.fmrib.ox.ac.uk/fsl/
+netpbm - http://netpbm.sourceforge.net/
+
+"""
+
+from core.modules.vistrails_module import Module, ModuleError, new_module
+import core.modules
+import core.modules.basic_modules
+import core.modules.module_registry
+import core.utils
+import os
+import os.path
+import stat
+import subprocess
+import glob
+
+version = '0.9.0'
+name = 'Provenance Challenge'
+identifier = 'edu.utah.sci.vistrails.provenance2'
+
+################################################################################
+
+global_airpath = ""
+global_fslpath = ""
+global_netpbmpath = ""
+
+class ProvenanceChallenge(Module):
+    """ProvenanceChallenge is the base Module for all Modules in the provenance
+package. It simply define helper methods for subclasses."""
+
+    __quiet = True
+    __programsQuiet = True
+    
+    def air_cmd_line(self, cmd, *params):
+        """Runs a command-line command for the AIR tools."""
+        return list2cmdline([global_airpath + cmd] + list(params))
+
+    def fsl_cmd_line(self, cmd, *params):
+        """Runs a command-line command for the FSL tools."""
+        return ('FSLOUTPUTTYPE=NIFTI_GZ ' +
+                list2cmdline([global_fslpath + cmd] + list(params)))
+
+    def netpbm_cmd_line(self, cmd, *params):
+	"""Runs a command-line command for the netpbm tools."""
+        return list2cmdline([global_netpbmpath + cmd] + list(params))
+
+    def run(self, cmd):
+        if not self.__quiet:
+            print cmd
+        if self.__programsQuiet:
+            cmd = '(' + cmd + ') 2>&1 >/dev/null' 
+        r = os.system(cmd)
+        if r != 0:
+            raise ModuleError(self, "system call failed: '%s'" % cmd)
+
+
+class AIRHeaderFile(core.modules.basic_modules.File):
+    """AIRHeaderFile subclasses File to annotate the execution with header
+file information for later querying."""
+
+    def get_header_annotations(self):
+        """Returns the header information for the file using the AIR scanheader
+tool."""
+        process = subprocess.Popen(global_airpath + 'scanheader ' + self.name,
+                                   shell=True,
+                                   stdout=subprocess.PIPE)
+	
+	waitCode = 0
+	try:
+	    waitCode = process.wait()
+	except OSError:
+	    pass
+        if waitCode != 0:
+            raise ModuleError(self, "Could not open header file " + self.name)
+
+        result = {}
+        lines = core.utils.no_interrupt(process.stdout.readlines)
+        for l in lines:
+            l = l[:-1]
+            if not l:
+                continue
+            entries = l.split('=')
+            if len(entries) != 2:
+                raise ModuleError(self,
+                                  "Error parsing line '%s' of header %s" %
+                                  (l[:-1], self.name))
+            result[entries[0]] = entries[1]
+        return result
+
+    def compute(self):
+        core.modules.basic_modules.File.compute(self)
+        d = self.get_header_annotations()
+        self.annotate(d)
+
+
+class AlignWarp(ProvenanceChallenge):
+    """AlignWarp executes the AIR warping tool on the input."""
+
+    def compute(self):
+        image = self.getInputFromPort("image")
+        ref = self.getInputFromPort("reference")
+        model = self.getInputFromPort("model")
+        o = self.interpreter.filePool.create_file(suffix='.warp')
+        cmd = self.air_cmd_line('align_warp',
+                                  image.baseName,
+                                  ref.baseName,
+                                  o.name,
+                                  '-m',
+                                  model,
+                                  '-q')
+        self.run(cmd)
+        self.setResult("output", o)
+
+
+class Reslice(ProvenanceChallenge):
+    """AlignWarp executes the AIR reslicing tool on the input."""
+
+    def compute(self):
+        warp = self.getInputFromPort("warp")
+        o = self.interpreter.filePool.create_file()
+        cmd = self.air_cmd_line('reslice',
+                                 warp.name,
+                                 o.name)
+        self.run(cmd)
+        ofs = FileSet()
+        ofs.baseName = o.name
+        self.setResult("output", ofs)
+
+
+class SoftMean(ProvenanceChallenge):
+    """SoftMean executes the AIR softmean averaging tool on the input."""
+
+    def compute(self):
+        imageList = self.getInputFromPort("imageList")
+        o = self.interpreter.filePool.create_file()
+        cmd = self.air_cmd_line('softmean',
+                                o.name,
+                                'y',
+                                'null',
+                                *[f.baseName for f in imageList])
+        self.run(cmd)
+        ofs = FileSet()
+        ofs.baseName = o.name
+        self.setResult('output', ofs)
+
+class Slicer(ProvenanceChallenge):
+    """Slicer executes the FSL slicer tool on the input."""
+
+    def compute(self):
+        cmd = ['slicer']
+        i = self.getInputFromPort("input")
+        cmd.append(i.baseName)
+        if self.hasInputFromPort("slice_x"):
+            cmd.append('-x')
+            cmd.append(str(self.getInputFromPort("slice_x")))
+        elif self.hasInputFromPort("slice_y"):
+            cmd.append('-y')
+            cmd.append(str(self.getInputFromPort("slice_y")))
+        elif self.hasInputFromPort("slice_z"):
+            cmd.append('-z')
+            cmd.append(str(self.getInputFromPort("slice_z")))
+        o = self.interpreter.filePool.create_file(suffix='.pgm')
+        cmd.append(o.name)
+        self.run(self.fsl_cmd_line(*cmd))
+        self.setResult('output', o)
+
+
+class PGMToPPM(ProvenanceChallenge):
+    """PGMToPPM executes the netpbm pgmtoppm tool on the input."""
+
+    def compute(self):
+        cmd = ['pgmtoppm white']
+        i = self.getInputFromPort("input")
+        cmd.append(i.name)
+        o = self.interpreter.filePool.create_file(suffix='.ppm')
+        cmd.append(' >')
+        cmd.append(o.name)
+        self.run(self.netpbm_cmd_line(*cmd))
+        self.setResult('output', o)
+        
+
+class PNMToJpeg(ProvenanceChallenge):
+    """PGMToPPM executes the netpbm pnmtojpeg tool on the input."""
+
+    def compute(self):
+        cmd = ['pnmtojpeg']
+        i = self.getInputFromPort("input")
+        cmd.append(i.name)
+        o = self.interpreter.filePool.create_file(suffix='.jpg')
+        cmd.append(' >')
+        cmd.append(o.name)
+        self.run(self.netpbm_cmd_line(*cmd))
+        self.setResult('output', o)
+
+class FileSet(ProvenanceChallenge):
+    """FileSet stores a set of files related by a common filename base."""
+
+    def compute(self):
+        self.checkInputPort("baseName")
+        n = self.getInputFromPort("baseName")
+	if self.hasInputFromPort("file_hdr") and \
+		self.hasInputFromPort("file_img"):
+	    n1 = self.getInputFromPort("file_hdr").name
+	    n2 = self.getInputFromPort("file_img").name
+	    if n1.endswith('.hdr'):
+		n1base = n1.rsplit('.hdr',1)[0]
+	    else:
+		n1base = n1
+	    if n2.endswith('.img'):
+		n2base = n2.rsplit('.img',1)[0]
+	    else:
+		n2base = n2
+	    if n1base != n2base:
+		o = self.interpreter.filePool.create_file()
+		o1 = o.name + '.hdr'
+		o2 = o.name + '.img'
+		try:
+		    core.system.link_or_copy(n1, o1)
+		except OSError, e:
+		    msg = "error creating tmp file '%s'" % o1
+		    raise ModuleError(self, msg)
+		try:
+		    core.system.link_or_copy(n2, o2)
+		except OSError, e:
+		    msg = "error creating tmp file '%s'" % o2
+		    raise ModuleError(self, msg)
+	    else:
+		self.baseName = n1base
+	else:
+	    self.baseName = n
+        self.setResult("local_basename", self.baseName)
+
+class FileSetSink(ProvenanceChallenge):
+    """FileSetSink is a module that takes a file set and writes them
+    in a user-specified location in the file system."""
+
+    def compute(self):
+        self.checkInputPort("fileSet")
+        self.checkInputPort("outputBaseName")
+        v1 = self.getInputFromPort("fileSet")
+        v2 = self.getInputFromPort("outputBaseName")
+        filenames = glob.glob('%s.*' % v1.baseName)
+        for filename in filenames:
+            try:
+                outFilename = filename.replace(v1.baseName, v2, 1)
+                core.system.link_or_copy(filename, outFilename)
+            except OSError, e:
+                if (self.hasInputFromPort("overrideFile") and
+                    self.getInputFromPort("overrideFile")):
+                    try:
+                        os.unlink(outFilename)
+                        core.system.link_or_copy(filename, outFilename)
+                    except OSError, e:
+                        msg = "(override true) Could not create file '%s'" % \
+                            outFilename
+                        raise ModuleError(self, msg)
+                else:
+                    msg = "Could not create file '%s': %s" % (outFilename, e)
+                    raise ModuleError(self, msg)
+
+################################################################################
+
+def checkProgram(fileName):
+    return os.path.isfile(fileName) and os.stat(fileName) & 005
+
+def initialize(airpath=None, fslpath=None, netpbmpath=None, *args, **kwargs):
+    print "Initializing Provenance Challenge Package"
+
+    if not airpath:
+        print "airpath not specified or incorrect: Will assume AIR tools are on the path"
+    else:
+        print "Will use AIR tools from ", airpath
+        global global_airpath
+        global_airpath = airpath + '/'
+
+    if not fslpath:
+        print "fslpath not specified or incorrect: Will assume fsl tools are on the path"
+    else:
+        print "Will use FSL tools from ", fslpath
+        global global_fslpath
+        global_fslpath = fslpath + '/'
+
+    if not netpbmpath:
+        print "netpbmpath not specified or incorrect: Will assume netpbm tools are on the path"
+    else:
+        print "Will use netpbm tools from ", netpbmpath
+        global global_netpbmpath
+        global_netpbmpath = netpbmpath + '/'
+        
+    reg = core.modules.module_registry
+    basic = core.modules.basic_modules
+    reg.add_module(ProvenanceChallenge)
+    
+    reg.add_module(AlignWarp)
+    reg.add_input_port(AlignWarp, "image", (FileSet, 'the image file to be deformed'))
+#    reg.add_input_port(AlignWarp, "image_header", (basic.File, 'the header of the image to be deformed'))
+    reg.add_input_port(AlignWarp, "reference", (FileSet, 'the reference image'))
+#    reg.add_input_port(AlignWarp, "reference_header", (basic.File, 'the header of the reference image'))
+    reg.add_input_port(AlignWarp, "model", (basic.Integer, 'the deformation model'))
+    reg.add_output_port(AlignWarp, "output", (basic.File, 'the output deformation'))
+
+    reg.add_module(Reslice)
+    reg.add_input_port(Reslice, "warp", (basic.File, 'the warping to be resliced'))
+    reg.add_output_port(Reslice, "output", (FileSet, 'the new slice'))
+    
+    reg.add_module(SoftMean)
+    reg.add_input_port(SoftMean, "imageList", (basic.List, 'image files'))
+    reg.add_output_port(SoftMean, "output", (FileSet, 'average image'))
+
+    reg.add_module(Slicer)
+    reg.add_input_port(Slicer, "input", (FileSet, 'the input file to be sliced'))
+    reg.add_input_port(Slicer, "slice_x", (basic.Float, 'sagittal slice with given value'))
+    reg.add_input_port(Slicer, "slice_y", (basic.Float, 'coronal slice with given value'))
+    reg.add_input_port(Slicer, "slice_z", (basic.Float, 'axial slice with given value'))
+    reg.add_output_port(Slicer, "output", (basic.File, 'slice output'))
+
+    reg.add_module(PGMToPPM)
+    reg.add_input_port(PGMToPPM, "input", (basic.File, "input"))
+    reg.add_output_port(PGMToPPM, "output", (basic.File, "output"))
+
+    reg.add_module(PNMToJpeg)
+    reg.add_input_port(PNMToJpeg, "input", (basic.File, "input"))
+    reg.add_output_port(PNMToJpeg, "output", (basic.File, "output"))
+
+    reg.add_module(AIRHeaderFile)
+
+    reg.add_module(FileSet)
+    reg.add_input_port(FileSet, "file_hdr", basic.File)
+    reg.add_input_port(FileSet, "file_img", basic.File)
+    reg.add_input_port(FileSet, "baseName", basic.String)
+    reg.add_output_port(FileSet, "self", FileSet)
+    reg.add_output_port(FileSet, "local_basename", basic.String)
+
+    reg.add_module(FileSetSink)
+    reg.add_input_port(FileSetSink,  "fileSet", FileSet)
+    reg.add_input_port(FileSetSink,  "outputBaseName", basic.String)
+    reg.add_input_port(FileSetSink,  "overrideFile", basic.Boolean)
diff --git a/contrib/sahm/ColorBreaks.csv b/contrib/sahm/ColorBreaks.csv
new file mode 100644
index 0000000..ac8f0a2
--- /dev/null
+++ b/contrib/sahm/ColorBreaks.csv
@@ -0,0 +1,18 @@
+layer,StartBreak,r,g,b
+prob_map,0,0,0,255
+prob_map,0.25,85,255,255
+prob_map,0.5,0,255,0
+prob_map,0.75,255,255,0
+prob_map,1,255,0,0
+res_map,-1,0,0,255
+res_map,-0.00000001,85,255,255
+res_map,0.00000001,255,255,0
+res_map,1,255,0,0
+bin_map,0,0,0,0
+bin_map,0.499999999,0,0,0
+bin_map,0.5000001,255,255,255
+bin_map,1,255,255,255
+mes_map,-100,0,0,255
+mes_map,-0.00000001,85,255,255
+mes_map,0.00000001,255,255,0
+mes_map,100,255,0,0
diff --git a/contrib/sahm/Images/BinMap.png b/contrib/sahm/Images/BinMap.png
new file mode 100644
index 0000000..64c8c96
Binary files /dev/null and b/contrib/sahm/Images/BinMap.png differ
diff --git a/contrib/sahm/Images/BlackPoints.png b/contrib/sahm/Images/BlackPoints.png
new file mode 100644
index 0000000..590c048
Binary files /dev/null and b/contrib/sahm/Images/BlackPoints.png differ
diff --git a/contrib/sahm/Images/GreenPoints.png b/contrib/sahm/Images/GreenPoints.png
new file mode 100644
index 0000000..127f0a4
Binary files /dev/null and b/contrib/sahm/Images/GreenPoints.png differ
diff --git a/contrib/sahm/Images/MesMap.png b/contrib/sahm/Images/MesMap.png
new file mode 100644
index 0000000..180857a
Binary files /dev/null and b/contrib/sahm/Images/MesMap.png differ
diff --git a/contrib/sahm/Images/ModMap.png b/contrib/sahm/Images/ModMap.png
new file mode 100644
index 0000000..e3f057e
Binary files /dev/null and b/contrib/sahm/Images/ModMap.png differ
diff --git a/contrib/sahm/Images/ProbMap.png b/contrib/sahm/Images/ProbMap.png
new file mode 100644
index 0000000..cb56001
Binary files /dev/null and b/contrib/sahm/Images/ProbMap.png differ
diff --git a/contrib/sahm/Images/RedPoints.png b/contrib/sahm/Images/RedPoints.png
new file mode 100644
index 0000000..ef4b8d5
Binary files /dev/null and b/contrib/sahm/Images/RedPoints.png differ
diff --git a/contrib/sahm/Images/ResMap.png b/contrib/sahm/Images/ResMap.png
new file mode 100644
index 0000000..37b24bf
Binary files /dev/null and b/contrib/sahm/Images/ResMap.png differ
diff --git a/contrib/sahm/Images/icons.pptx b/contrib/sahm/Images/icons.pptx
new file mode 100644
index 0000000..fa9e1d0
Binary files /dev/null and b/contrib/sahm/Images/icons.pptx differ
diff --git a/contrib/sahm/SahmOutputViewer.py b/contrib/sahm/SahmOutputViewer.py
new file mode 100644
index 0000000..4f21f01
--- /dev/null
+++ b/contrib/sahm/SahmOutputViewer.py
@@ -0,0 +1,494 @@
+################################################################################
+# ImageViewer widgets/toolbar implementation
+################################################################################
+from PyQt4 import QtCore, QtGui, QAxContainer
+from core.modules.vistrails_module import Module
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+from packages.spreadsheet.spreadsheet_controller import spreadsheetController
+from SahmViewerCell import Ui_Frame
+#import imageviewer_rc
+import os
+################################################################################
+
+class SAHMModelOutputViewerCell(SpreadsheetCell):
+    """
+    SAHMModelOutputViewerCell displays the various non-spatial
+    outputs from a SAHM Model run
+    """
+    _input_ports = [("row", "(edu.utah.sci.vistrails.basic:Integer)"),
+                    ("column", "(edu.utah.sci.vistrails.basic:Integer)"),
+                    ('ModelWorkspace', '(edu.utah.sci.vistrails.basic:File)')]
+     
+    def compute(self):
+        """ compute() -> None
+        Dispatch the display event to the spreadsheet with images and labels
+        
+        """
+        if self.hasInputFromPort("ModelWorkspace"):
+            window = spreadsheetController.findSpreadsheetWindow()
+            model_workspace = self.getInputFromPort("ModelWorkspace").name
+            model_dir_full = os.path.normcase(os.path.split(model_workspace)[0])
+            model_dir = os.path.split(model_dir_full)[1]
+            model_name = model_dir[:model_dir.index('output')]
+            
+#            prob_map_path = os.path.join(model_dir_full, model_name + '_prob_map.jpeg')
+#            prob_map = window.file_pool.make_local_copy(prob_map_path)
+            
+            auc_graph_path = os.path.join(model_dir_full, model_name + '_auc_plot.jpg')
+            auc_graph = window.file_pool.make_local_copy(auc_graph_path)
+            
+            text_output_path = os.path.join(model_dir_full, model_name + '_output.txt')
+            text_output = window.file_pool.make_local_copy(text_output_path)
+            
+            response_path = os.path.join(model_dir_full, model_name + '_response_curves.pdf')
+            response_curves = window.file_pool.make_local_copy(response_path)
+            
+            model_label = model_dir.capitalize().replace('output', 'Output')
+            
+            
+            if self.hasInputFromPort("row"):
+                if not self.location:
+                    self.location = CellLocation()
+                self.location.row = self.getInputFromPort('row') - 1
+            
+            if self.hasInputFromPort("column"):
+                if not self.location:
+                    self.location = CellLocation()
+                self.location.col = self.getInputFromPort('column') - 1
+            
+        else:
+            fileValue = None
+        self.cellWidget = self.displayAndWait(SAHMOutputViewerCellWidget, (auc_graph, 
+                                                                      text_output,
+                                                                      response_curves,
+                                                                      model_label))
+
+class SAHMOutputViewerCellWidget(QCellWidget):
+    """
+    SAHMOutputViewerCellWidget is the widget that will display the various
+    non spatial outputs from a model run
+    """
+    def __init__(self, parent=None):
+        QCellWidget.__init__(self, parent)
+        
+        centralLayout = QtGui.QVBoxLayout()
+        self.setLayout(centralLayout)
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)
+
+        
+#        self.setAnimationEnabled(True)
+        
+        self.Frame = QtGui.QFrame()
+        self.ui = Ui_Frame()
+        self.ui.setupUi(self.Frame)
+        
+#        #add scenes to our graphicViews
+#        self.gs_prob_map = QtGui.QGraphicsScene()
+#        self.ui.gv_prob_map.setScene(self.gs_prob_map)
+#        self.gs_prob_map.wheelEvent = self.wheel_event_prob
+        
+        self.gs_auc_graph = QtGui.QGraphicsScene()
+        self.ui.gv_auc.setScene(self.gs_auc_graph)
+        self.gs_auc_graph.wheelEvent = self.wheel_event_auc
+        
+        #add in ie browsers for the text and response
+        self.text_browser = QAxContainer.QAxWidget(self)
+        self.text_browser.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.text_browser.setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}")
+        self.ui.text_output_layout.addWidget(self.text_browser)
+        self.text_urlSrc = None
+        
+        self.response_browser = QAxContainer.QAxWidget(self)
+        self.response_browser.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.response_browser.setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}")
+        self.ui.response_curves_layout.addWidget(self.response_browser)
+        self.response_urlSrc = None
+        
+        
+        self.layout().addWidget(self.Frame)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Update the widget contents based on the input data
+        
+        """
+        (auc_graph, text_output, response_curves, model_label) = inputPorts
+        
+        self.images = {}
+#        if prob_map:
+#            #Value = (full image, sized image, scene, view, max_height)
+#            pixmap = QtGui.QPixmap(prob_map.name)
+#            max_size = self.getMaxSize(self.ui.gv_prob_map)
+#            scaled_pixmap = pixmap.scaled(max_size, max_size, 
+#                                            QtCore.Qt.KeepAspectRatio, 
+#                                            QtCore.Qt.FastTransformation)
+#            
+#            self.images['prob_map'] = [pixmap,
+#                                       scaled_pixmap,
+#                                       self.gs_prob_map,
+#                                       self.ui.gv_prob_map,
+#                                       max_size]
+        
+        if auc_graph:
+            pixmap = QtGui.QPixmap(auc_graph.name)
+            max_size = self.getMaxSize(self.ui.gv_auc)
+            scaled_pixmap = pixmap.scaled(max_size, max_size, 
+                                            QtCore.Qt.KeepAspectRatio, 
+                                            QtCore.Qt.SmoothTransformation)
+            
+            self.images['auc_graph'] = [pixmap,
+                                       scaled_pixmap,
+                                       self.gs_auc_graph,
+                                       self.ui.gv_auc,
+                                       max_size]
+        
+        
+
+        self.text_urlSrc = QtCore.QUrl.fromLocalFile(text_output.name)
+        if self.text_urlSrc!=None:
+            self.text_browser.dynamicCall('Navigate(const QString&)', self.text_urlSrc.toString())
+        else:
+            self.text_browser.dynamicCall('Navigate(const QString&)', QtCore.QString('about:blank'))
+
+        self.response_urlSrc = QtCore.QUrl.fromLocalFile(response_curves.name)
+        if self.response_urlSrc!=None:
+            self.response_browser.dynamicCall('Navigate(const QString&)', self.response_urlSrc.toString())
+        else:
+            self.response_browser.dynamicCall('Navigate(const QString&)', QtCore.QString('about:blank'))
+
+        self.view_current()
+
+        #QCellWidget.updateContents(self, inputPorts)
+
+    def getMaxSize(self, view):
+        return self.Frame.size().width() - 10
+#        if view.size().width()  <= view.size().height(): 
+#            return view.size().width() * 0.95
+#        else: 
+#            return view.size().height() * 0.95
+    
+    def view_current(self):
+        for k,v in self.images.iteritems():
+            size_img = v[1].size() 
+            wth, hgt = QtCore.QSize.width(size_img), QtCore.QSize.height(size_img) 
+            v[2].clear() 
+            v[2].setSceneRect(0, 0, wth, hgt) 
+            v[2].addPixmap(v[1]) 
+        QtCore.QCoreApplication.processEvents() 
+
+    def wheel_event_prob(self, event):
+        self.wheel_event(event, 'prob_map', QtCore.Qt.FastTransformation)
+
+    def wheel_event_auc(self, event):
+        self.wheel_event(event, 'auc_graph', QtCore.Qt.SmoothTransformation)
+
+    def wheel_event (self, event, id, transform):
+        numDegrees = event.delta() / 8 
+        numSteps = numDegrees / 15.0 
+        self.zoom(numSteps, self.images[id], transform) 
+        event.accept() 
+
+    def zoom(self, step, images, transform):
+        zoom_step = 0.06
+        images[2].clear() 
+        w = images[1].size().width() 
+        h = images[1].size().height() 
+        w, h = w * (1 + zoom_step*step), h * (1 + zoom_step*step) 
+        images[1] = images[0].scaled(w, h, 
+                                            QtCore.Qt.KeepAspectRatio, 
+                                            transform) 
+        self.view_current() 
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> bool
+        Save the current widget contents to an image file
+        
+        """
+
+        pixmap = QtGui.QPixmap(self.Frame.size())
+        painter = QtGui.QPainter(pixmap)
+        self.Frame.render(painter)
+        painter.end()
+        
+        if pixmap and (not pixmap.isNull()):
+            return pixmap.save(filename)
+        return False
+    
+    def saveToPDF(self, filename):
+        """ saveToPDF(filename: str) -> bool
+        Save the current widget contents to a pdf file
+        
+        """
+        printer = QtGui.QPrinter()
+        
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        painter = QtGui.QPainter()
+        painter.begin(printer)
+        rect = painter.viewport()
+        pixmap = self.label.pixmap()
+        size = pixmap.size()
+        size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)
+        painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
+        painter.setWindow(pixmap.rect())
+        painter.drawPixmap(0, 0, pixmap)
+        painter.end()
+#
+#    def resizeEvent(self, e):
+#        if self.originalPix!=None:
+#            self.label.setPixmap(self.originalPix.scaled(self.label.size(),
+#                                                         QtCore.Qt.KeepAspectRatio,
+#                                                         QtCore.Qt.SmoothTransformation))
+#                
+
+class ImageViewerFitToCellAction(QtGui.QAction):
+    """
+    ImageViewerFitToCellAction is the action to stretch the image to
+    fit inside a cell
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerFitToCellAction(parent: QWidget)
+                                       -> ImageViewerFitToCellAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/fittocell.png"),
+                               "&Fit To Cell",
+                               parent)
+        self.setStatusTip("Scale image content to fit cell frame")
+        self.setCheckable(True)
+        self.setChecked(True)
+
+    def toggledSlot(self, checked):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is toggled
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.label.setScaledContents(checked)
+        self.toolBar.slider.updateStatus((self.toolBar.sheet,
+                                          self.toolBar.row,
+                                          self.toolBar.col,
+                                          cellWidget))
+        
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        self.setChecked(cellWidget.label.hasScaledContents())
+
+class ImageViewerSaveAction(QtGui.QAction):
+    """
+    ImageViewerSaveAction is the action to save the image to file
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerSaveAction(parent: QWidget) -> ImageViewerSaveAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/save.png"),
+                               "&Save image as...",
+                               parent)
+        self.setStatusTip("Save image to file")
+        
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        if not cellWidget.label.pixmap() or cellWidget.label.pixmap().isNull():
+            return
+        fn = QtGui.QFileDialog.getSaveFileName(None, "Save image as...",
+                                               "screenshot.png",
+                                               "Images (*.png);;PDF files (*.pdf)")
+        if not fn:
+            return
+        if fn.endsWith(QtCore.QString("png"), QtCore.Qt.CaseInsensitive):
+            cellWidget.label.pixmap().toImage().save(fn, "png")
+        elif fn.endsWith(QtCore.QString("pdf"), QtCore.Qt.CaseInsensitive):
+            cellWidget.saveToPDF(str(fn))
+
+#class testButton(QtGui.QAction):
+#     def __init__(self, parent=None):
+#        """ ImageViewerRotateAction(parent: QWidget)
+#                                       -> ImageViewerRotateAction
+#        Setup the image, status tip, etc. of the action
+#        
+#        """
+#        QtGui.QAction.__init__(self,
+#                               QtGui.QIcon(":/images/grass_split_line.png"),
+#                               "&Do Something...",
+#                               parent)
+#        self.setStatusTip("We'll do something with this soon")
+#        self.rotationMatrix = QtGui.QMatrix(0,1,-1,0,0,0)
+#
+#class ModelLabel(QtGui.QLabel):
+#    def __init__(self, parent=None):
+#        """A lable to indicate which model the output pertains to
+#        """
+#        self.text = QtCore.QString("testing")
+#        
+#class ImageViewerZoomSlider(QtGui.QSlider):
+#    """
+#    ImageViewerZoomSlider is a slider that allows user to zoom in and
+#    out by dragging it
+#    """
+#    def __init__(self, parent=None):
+#        """ ImageViewerZoomSlider(parent: QWidget) -> ImageViewerZoomSlider
+#        Setup the ranges, status tip, etc. of the slider
+#        
+#        """
+#        QtGui.QSlider.__init__(self, QtCore.Qt.Horizontal, parent)
+#        self.setRange(100, 600)
+#        self.setValue(100)
+#        self.setTracking(True)
+#        self.setStatusTip("Zoom in the image")
+#        self.connect(self, QtCore.SIGNAL("valueChanged(int)"), self.updateZoom)
+#        self.connect(self, QtCore.SIGNAL("needUpdateStatus"), self.updateStatus)
+#        self.setSizePolicy(QtGui.QSizePolicy.Preferred,
+#                           QtGui.QSizePolicy.Expanding)
+#        
+#    def updateZoom(self, value):
+#        """ updateZoom(value: int) -> None
+#        Update the image when the slider value changed
+#        
+#        """
+#        if self.toolBar:
+#            cellWidget = self.toolBar.getSnappedWidget()
+#            if not cellWidget.label.hasScaledContents():
+#                newWidth = cellWidget.originalPix.width()*value/100
+#                pixmap = cellWidget.originalPix.scaledToWidth(newWidth)
+#                cellWidget.label.setPixmap(pixmap)
+#
+#    def updateStatus(self, info):
+#        """ updateStatus(info: tuple) -> None
+#        Updates the status of the button based on the input info
+#        
+#        """
+#        (sheet, row, col, cellWidget) = info
+#        if cellWidget:
+#            if (not cellWidget.label.hasScaledContents() and
+#                not cellWidget._playing):
+#                self.setEnabled(True)
+#                originalWidth = cellWidget.originalPix.width()
+#                self.setValue(cellWidget.label.pixmap().width()*100/originalWidth)
+#            else:
+#                self.setEnabled(False)
+#                self.setValue(100)
+#                
+#class ImageViewerZoomLabel(QtGui.QLabel):
+#    """
+#    ImageViewerZoomLabel is the label sitting next to the ImageViewerZoomSlider
+#    
+#    """
+#    def __init__(self, parent=None):
+#        """ ImageViewerZoomSlider(parent: QWidget) -> None
+#        Setup the label with a status tip
+#        
+#        """
+#        QtGui.QLabel.__init__(self, "100%", parent)
+#        self.setStatusTip("Zoom in the image")
+#        
+#    def updateValue(self, value):
+#        """ updateValue(value: int)
+#        Updates the label with the new percentage value
+#        """
+#        self.setText(str(value)+"%")
+#                
+#class ImageViewerRotateAction(QtGui.QAction):
+#    """
+#    ImageViewerRotateAction is the action to rotate the image
+#    
+#    """
+#    def __init__(self, parent=None):
+#        """ ImageViewerRotateAction(parent: QWidget)
+#                                       -> ImageViewerRotateAction
+#        Setup the image, status tip, etc. of the action
+#        
+#        """
+#        QtGui.QAction.__init__(self,
+#                               QtGui.QIcon(":/images/rotate.png"),
+#                               "&Rotate CW...",
+#                               parent)
+#        self.setStatusTip("Rotate 90 degrees CW")
+#        self.rotationMatrix = QtGui.QMatrix(0,1,-1,0,0,0)
+#        
+#    def triggeredSlot(self, checked=False):
+#        """ toggledSlot(checked: boolean) -> None
+#        Execute the action when the button is clicked
+#        
+#        """
+#        cellWidget = self.toolBar.getSnappedWidget()
+#        if not cellWidget.label.pixmap() or cellWidget.label.pixmap().isNull():
+#            return
+#        cellWidget.originalPix = cellWidget.originalPix.transformed(
+#            self.rotationMatrix)
+#        cellWidget.label.setPixmap(cellWidget.label.pixmap().transformed(
+#            self.rotationMatrix))
+#
+#class ImageViewerFlipAction(QtGui.QAction):
+#    """
+#    ImageViewerFlipAction is the action to flip the image
+#    
+#    """
+#    def __init__(self, parent=None):
+#        """ ImageViewerFlipAction(parent: QWidget) -> ImageViewerFlipAction
+#        Setup the image, status tip, etc. of the action
+#        
+#        """
+#        QtGui.QAction.__init__(self,
+#                               QtGui.QIcon(":/images/flip.png"),
+#                               "&Flip Horizontal...",
+#                               parent)
+#        self.setStatusTip("Flip the image horizontally")
+#        self.flipMatrix = QtGui.QMatrix(-1,0,0,1,0,0)
+#        
+#    def triggeredSlot(self, checked=False):
+#        """ toggledSlot(checked: boolean) -> None
+#        Execute the action when the button is clicked
+#        
+#        """
+#        cellWidget = self.toolBar.getSnappedWidget()
+#        label = cellWidget.label
+#        if not label.pixmap() or label.pixmap().isNull():
+#            return
+#        cellWidget.originalPix = cellWidget.originalPix.transformed(
+#            self.flipMatrix)
+#        label.setPixmap(label.pixmap().transformed(self.flipMatrix))
+#
+#class ImageViewerToolBar(QCellToolBar):
+#    """
+#    ImageViewerToolBar derives from CellToolBar to give the ImageViewerCellWidget
+#    a customizable toolbar
+#    
+#    """
+#    def createToolBar(self):
+#        """ createToolBar() -> None
+#        This will get call initiallly to add customizable widgets
+#        
+#        """
+#        global SAHMModelOutputViewerCell
+#        
+##        self.appendAction(QtCore.QString(SAHMModelOutputViewerCell.model_label))
+#        self.appendAction(testButton(self))
+#        self.appendAction(ImageViewerFitToCellAction(self))
+#        self.appendAction(ImageViewerSaveAction(self))
+#        self.appendAction(ImageViewerRotateAction(self))
+#        self.appendAction(ImageViewerFlipAction(self))
+#        self.slider = ImageViewerZoomSlider(self)
+#        label = ImageViewerZoomLabel(self)
+#        self.connect(self.slider,
+#                     QtCore.SIGNAL("valueChanged(int)"),
+#                     label.updateValue)
+#        self.appendWidget(self.slider)
+#        self.appendWidget(label)
+#        self.addAnimationButtons()
\ No newline at end of file
diff --git a/contrib/sahm/SahmSpatialOutputViewer.py b/contrib/sahm/SahmSpatialOutputViewer.py
new file mode 100644
index 0000000..c5f2696
--- /dev/null
+++ b/contrib/sahm/SahmSpatialOutputViewer.py
@@ -0,0 +1,483 @@
+################################################################################
+# ImageViewer widgets/toolbar implementation
+################################################################################
+from PyQt4 import QtCore, QtGui, QAxContainer
+from core.modules.vistrails_module import Module
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+from packages.spreadsheet.spreadsheet_controller import spreadsheetController
+from SahmSpatialViewerCell import Ui_Frame
+#import imageviewer_rc
+import os
+
+import csv
+
+from packages.sahm.pySAHM.utilities import mds_to_shape
+from utils import getrasterminmax
+################################################################################
+
+def setQGIS(qgis):
+    globals()["qgis"] = qgis
+
+class SAHMSpatialOutputViewerCell(SpreadsheetCell):
+    """
+    SAHMModelOutputViewerCell displays the various output from a SAHM Model run
+
+    """
+    _input_ports = [("row", "(edu.utah.sci.vistrails.basic:Integer)"),
+                    ("column", "(edu.utah.sci.vistrails.basic:Integer)"),
+                    ('model_workspace', '(edu.utah.sci.vistrails.basic:File)')]
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+
+#        globals()["qgis"] = qgis
+
+    def compute(self):
+        inputs = {}
+        inputs["model_workspace"] = self.forceGetInputFromPort('model_workspace').name
+        inputs["model_dir"] = os.path.split(inputs["model_workspace"])[0]
+
+        inputs["prob_map"] = os.path.join(inputs["model_dir"],
+                                self.find_file(inputs["model_dir"], "_prob_map.tif"))
+        inputs["bin_map"] = os.path.join(inputs["model_dir"],
+                               self.find_file(inputs["model_dir"], "_bin_map.tif"))
+        inputs["res_map"] = os.path.join(inputs["model_dir"],
+                               self.find_file(inputs["model_dir"], "_resid_map.tif"))
+        try:
+            inputs["mes_map"] = os.path.join(inputs["model_dir"],
+                                   self.find_file(inputs["model_dir"], "_mess_map.tif"))
+        except:
+            inputs["mes_map"] = ""
+        
+        try:
+            inputs["mod_map"] = os.path.join(inputs["model_dir"],
+                               self.find_file(inputs["model_dir"], "_MoD_map.tif"))
+        except:
+            inputs["mod_map"] = ""
+
+        mds = self.find_mds(inputs["model_dir"])
+        shaperoot = self.gen_points_shp(mds)
+        inputs["pres_points"] = shaperoot + "_pres.shp"
+        inputs["abs_points"] = shaperoot + "_abs.shp"
+        inputs["backs_points"] = shaperoot + "_backs.shp"
+
+        inputs["model_tag"] = os.path.split(inputs["model_dir"])[1]
+
+        if self.hasInputFromPort("row"):
+            if not self.location:
+                self.location = CellLocation()
+            self.location.row = self.getInputFromPort('row') - 1
+        
+        if self.hasInputFromPort("column"):
+            if not self.location:
+                self.location = CellLocation()
+            self.location.col = self.getInputFromPort('column') - 1
+
+        self.displayAndWait(SAHMSpatialOutputViewerCellWidget,
+                            inputs)
+
+
+    def find_file(self, model_dir, suffix):
+        return [file_name for file_name in os.listdir(model_dir)
+                                    if file_name.endswith(suffix)][0]
+
+    def find_mds(self, model_dir):
+        model_text = os.path.join(model_dir,
+                            self.find_file(model_dir, "_output.txt"))
+
+        f = open(model_text, 'rb')
+        lines = f.read().splitlines()
+
+        # grab the line after "Data:"
+        result = [lines[i + 1] for i in range(len(lines))
+                  if lines[i].startswith("Data:")][0].strip()
+
+        if os.path.exists(result):
+            return result
+        else:
+            raise RuntimeError('Valid input MDS file not found in Model text output.')
+
+    def gen_points_shp(self, mds):
+        """I couldn't figure out how to use a render on a shapefile
+        instead I split the shapefile into three separate files for each
+        class.
+        This split only occurs once per mds though.
+        """
+        parentfolder, filename = os.path.split(mds)
+        filenoext = os.path.splitext(filename)[0]
+        shpfolder = os.path.join(parentfolder, "PointShapefiles")
+
+        if not os.path.exists(shpfolder):
+            os.mkdir(shpfolder)
+        fileroot = os.path.join(shpfolder, filenoext)
+
+        pregenerated = True
+        for type in ["_pres", "_abs", "_backs"]:
+            shape_file = fileroot +  type + ".shp"
+            if not os.path.exists(shape_file):
+                pregenerated = False
+
+        if not pregenerated:
+            mds_to_shape(mds, shpfolder)
+
+        return fileroot
+
+
+class SAHMSpatialOutputViewerCellWidget(QCellWidget):
+    """
+
+    """
+    def __init__(self, parent=None):
+        """ QGISCellWidget(parent: QWidget) -> QGISCellWidget
+        Initialize the widget with its central layout
+
+        """
+        QCellWidget.__init__(self, parent)
+
+        centralLayout = QtGui.QVBoxLayout()
+        self.setLayout(centralLayout)
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)
+
+#        self.setAnimationEnabled(True)
+
+        self.Frame = QtGui.QFrame()
+        self.ui = Ui_Frame()
+        self.ui.setupUi(self.Frame)
+
+        self.toolBarType = SAHMSpatialViewerToolBar
+        self.controlBarType = SAHMSpatialViewerToolBar
+
+        self.layout().addWidget(self.Frame)
+
+
+    def updateContents(self, inputs):
+        """ updateContents(inputs: dictionary) -> None
+        Update the widget contents based on the input data
+        """
+
+        self.canvas = qgis.gui.QgsMapCanvas()
+        self.canvas.show()
+
+        self.ui.legend_label.setText(QtCore.QString(inputs["model_tag"]))
+
+        self.toolPan = qgis.gui.QgsMapToolPan(self.canvas)
+
+        self.canvas.setMapTool(self.toolPan)
+        self.canvas.setWheelAction(2)
+        self.canvas.setCanvasColor(QtCore.Qt.white)
+        self.canvas.enableAntiAliasing(True)
+
+        self.all_layers = {}
+        self.add_raster(inputs["prob_map"], "prob_map")
+        self.add_raster(inputs["bin_map"], "bin_map")
+        self.add_raster(inputs["res_map"], "res_map")
+        self.add_raster(inputs["mes_map"], "mes_map")
+        self.add_raster(inputs["mod_map"], "mod_map")
+
+        self.add_vector(inputs['pres_points'], "pres_points", '255,0,0')
+        self.add_vector(inputs['abs_points'], "abs_points", '0,255,0')
+        self.add_vector(inputs['backs_points'], "backs_points", '0,0,0')
+
+        self.canvas.setExtent(self.all_layers["prob_map"].layer().extent())
+        self.canvas.setLayerSet([self.all_layers["pres_points"],
+                                 self.all_layers["abs_points"],
+                           self.all_layers["prob_map"]])
+
+        self.ui.map_frame.layout().addWidget(self.canvas)
+        legend = self.create_legend_ramp("prob_map", None, (0, 1), 6)
+
+        self.ui.legend.layout().addWidget(legend)
+        # Update the new figure canvas
+        self.update()
+
+    def dumpToFile(self, filename):
+        pass
+
+    def saveToPDF(self, filename):
+        pass
+
+    def add_raster(self, path, tag):
+        if os.path.exists(path):
+            fileInfo = QtCore.QFileInfo(path)
+            baseName = fileInfo.baseName()
+            raster = qgis.core.QgsRasterLayer(path, baseName)
+    
+            if tag=="res_map":
+                min_max = getrasterminmax(path)
+            else:
+                min_max = None
+    
+            self.set_color_ramp(tag, raster)
+            qgis.core.QgsMapLayerRegistry.instance().addMapLayer(raster)
+            self.all_layers[tag] = qgis.gui.QgsMapCanvasLayer(raster)
+        else:
+            print "The file " + path + " could not be found on the file system."
+            print "   tag will not be enabled"
+
+    def set_color_ramp(self, layer_type, raster, min_max=None):
+        QgsColorRampShader = qgis.core.QgsColorRampShader
+
+
+        if layer_type == "mod_map":
+            #raster.setDrawingStyle(qgis.core.QgsRasterLayer.PalettedColor)
+            raster.setDrawingStyle(qgis.core.QgsRasterLayer.SingleBandPseudoColor)
+            raster.setColorShadingAlgorithm(qgis.core.QgsRasterLayer.PseudoColorShader)
+
+            #raster.setColorShadingAlgorithm(qgis.core.QgsRasterLayer.ColorRampShader)
+#            raster.setDrawingStyle(qgis.core.QgsRasterLayer.SingleBandGray)
+            return None
+        else:
+            raster.setDrawingStyle(qgis.core.QgsRasterLayer.SingleBandPseudoColor)
+
+        csv_file = os.path.abspath(os.path.join(os.path.dirname(__file__), "ColorBreaks.csv"))
+        csvfile = open(csv_file, "r")
+        reader = csv.reader(csvfile)
+        header = reader.next() #skip the header
+
+        color_ramp_items = []
+        for row in reader:
+            if row[0] == layer_type:
+                r, g, b = [int(val) for val in row[2:5]]
+                cur_color = QtGui.QColor(r, g, b)
+                cur_val = float(row[1])
+                color_item = QgsColorRampShader.ColorRampItem(cur_val, cur_color)
+                color_ramp_items.append(color_item)
+
+        raster.setColorShadingAlgorithm(qgis.core.QgsRasterLayer.ColorRampShader)
+        fcn = raster.rasterShader().rasterShaderFunction()
+        fcn.setColorRampType(QgsColorRampShader.INTERPOLATED)
+        fcn.setColorRampItemList(color_ramp_items)
+
+        if hasattr(raster, "setCacheImage"): raster.setCacheImage(None)
+        raster.triggerRepaint()
+
+        qgis.core.QgsMapLayerRegistry.instance().addMapLayer(raster)
+
+        csvfile.close()
+
+        return None
+
+    def create_legend_ramp(self, layer_type, raster, min_max, num_tags):
+        legend = QtGui.QFrame()
+        legend.setObjectName(QtCore.QString.fromUtf8("legend"))
+        mainlayout = QtGui.QVBoxLayout(legend)
+        mainlayout.setSpacing(0)
+        mainlayout.setMargin(0)
+
+        frame_colorbar = QtGui.QFrame(legend)
+        frame_colorbar.setObjectName(QtCore.QString.fromUtf8("frame_colorbar"))
+        layout_colorbar = QtGui.QHBoxLayout(frame_colorbar)
+        layout_colorbar.setSpacing(0)
+        layout_colorbar.setContentsMargins(-1, 2, -1, 0)
+
+        frame_ticks = QtGui.QFrame(legend)
+        frame_ticks.setFrameShape(QtGui.QFrame.StyledPanel)
+        frame_ticks.setFrameShadow(QtGui.QFrame.Raised)
+        frame_ticks.setObjectName(QtCore.QString.fromUtf8("frame_ticks"))
+        layout_ticks = QtGui.QHBoxLayout(frame_ticks)
+        layout_ticks.setSpacing(0)
+        layout_ticks.setContentsMargins(-1, 0, -1, 0)
+
+        frame_labels = QtGui.QFrame(legend)
+        frame_labels.setObjectName(QtCore.QString.fromUtf8("frame_labels"))
+        layout_labels = QtGui.QHBoxLayout(frame_labels)
+        layout_labels.setSpacing(0)
+        layout_labels.setContentsMargins(4, 0, 4, 0)
+
+        csv_file = os.path.abspath(os.path.join(os.path.dirname(__file__), "ColorBreaks.csv"))
+        csvfile = open(csv_file, "r")
+        reader = csv.reader(csvfile)
+        header = reader.next() #skip the header
+
+        color_ramp_items = []
+        prev_color = None
+        for row in reader:
+            if row[0] == layer_type:
+                cur_color = ", ".join(row[2:5])
+
+                if prev_color:
+                    color_label = QtGui.QLabel(frame_colorbar)
+                    sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.MinimumExpanding)
+                    sizePolicy.setHorizontalStretch(0)
+                    sizePolicy.setVerticalStretch(0)
+                    sizePolicy.setHeightForWidth(color_label.sizePolicy().hasHeightForWidth())
+                    color_label.setSizePolicy(sizePolicy)
+                    color_label.setMinimumSize(QtCore.QSize(0, 4))
+                    stylesheet = "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba("
+                    stylesheet += prev_color
+                    stylesheet += ", 255), stop:1 rgba("
+                    stylesheet += cur_color
+                    stylesheet += ", 255));"
+                    color_label.setStyleSheet(QtCore.QString.fromUtf8(stylesheet))
+                    color_label.setText(QtCore.QString.fromUtf8(""))
+                    layout_colorbar.addWidget(color_label)
+
+                prev_color = cur_color
+
+        min = min_max[0]
+        max = min_max[1]
+        step = float(max - min) / num_tags
+        curStep = min
+
+        while curStep <= max:
+            line = QtGui.QFrame(frame_ticks)
+            sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+            sizePolicy.setHorizontalStretch(0)
+            sizePolicy.setVerticalStretch(0)
+            sizePolicy.setHeightForWidth(line.sizePolicy().hasHeightForWidth())
+            line.setSizePolicy(sizePolicy)
+            line.setMinimumSize(QtCore.QSize(0, 4))
+            line.setSizeIncrement(QtCore.QSize(0, 0))
+            line.setFrameShadow(QtGui.QFrame.Plain)
+            line.setFrameShape(QtGui.QFrame.VLine)
+            line.setFrameShadow(QtGui.QFrame.Sunken)
+            line.setObjectName(QtCore.QString.fromUtf8("line"))
+            layout_ticks.addWidget(line)
+            spacerItem = QtGui.QSpacerItem(133, 2, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+            layout_ticks.addItem(spacerItem)
+
+            lbl = QtGui.QLabel(frame_labels)
+            lbl.setMinimumSize(QtCore.QSize(0, 10))
+            txt = "%.1f" %curStep
+            lbl.setText(QtCore.QString.fromUtf8(txt))
+            lbl.setAlignment(QtCore.Qt.AlignCenter)
+            #lbl.setObjectName(QtCore.QString.fromUtf8("lbl"))
+            layout_labels.addWidget(lbl)
+            spacerItem2 = QtGui.QSpacerItem(5, 5, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+            layout_labels.addItem(spacerItem2)
+
+            curStep += step
+
+        layout_ticks.removeItem(spacerItem)
+        layout_labels.removeItem(spacerItem2)
+
+        mainlayout.addWidget(frame_colorbar)
+        mainlayout.addWidget(frame_ticks)
+        mainlayout.addWidget(frame_labels)
+        return legend
+
+
+    def add_vector(self, path, tag, strcolor):
+        fileInfo = QtCore.QFileInfo(path)
+        baseName = fileInfo.baseName()
+        points_layer = qgis.core.QgsVectorLayer(path, baseName, "ogr")
+
+        props = {'color':strcolor, 'radius':'3' }
+        s = qgis.core.QgsMarkerSymbolV2.createSimple(props)
+
+        points_layer.setRendererV2( qgis.core.QgsSingleSymbolRendererV2( s ) )
+
+        qgis.core.QgsMapLayerRegistry.instance().addMapLayer(points_layer)
+        self.all_layers[tag] = qgis.gui.QgsMapCanvasLayer(points_layer)
+
+#
+#def update_displayed_layers(cellWidget):
+#    pass
+#
+#
+##        [qgis.gui.QgsMapCanvasLayer(layer) for layer in layers]
+
+#    layer = cellWidget.cur_layers[layer]
+#    layers = cellWidget.canvas.layers()
+#
+#    if visible:
+#        layers.insert(0, layer.layer())
+#    else:
+#        layers.remove(layer.layer())
+#
+#    cellWidget.canvas.setLayerSet(layerset)
+#    cellWidget.canvas.repaint()
+
+
+class ViewLayerAction(QtGui.QAction):
+    def __init__(self, action_dict, parent=None):
+        icon = os.path.abspath(os.path.join(
+                    os.path.dirname(__file__), "Images", action_dict["icon"]))
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(icon),
+                               action_dict["label"],
+                               parent)
+        self.setCheckable(True)
+        self.setChecked(action_dict["checked"])
+        self.tag = action_dict["tag"]
+        self.group = action_dict["group"]
+
+    def triggeredSlot(self, checked=False):
+#        cellWidget = self.toolBar.getSnappedWidget()
+        self.toggleOthers()
+        self.displayLayer()
+
+    def toggleOthers(self):
+        for action in self.toolBar.actions():
+            if "group" in dir(action) and \
+                action.group == self.group and \
+                action.tag <> self.tag:
+                action.setChecked(False)
+
+    def displayLayer(self):
+        cellWidget = self.toolBar.getSnappedWidget()
+
+        all_layers = cellWidget.all_layers
+        layerset = []
+        for action in self.toolBar.actions():
+            if action.isChecked() and all_layers.has_key(action.tag):
+                layer = all_layers[action.tag]
+                layerset.append(qgis.gui.QgsMapCanvasLayer(layer))
+
+        cellWidget.canvas.setLayerSet(layerset)
+        cellWidget.canvas.repaint()
+
+
+class SAHMSpatialViewerToolBar(QCellToolBar):
+    """
+    The toolbar that allows users to toggle layers on and off
+    in the widget
+
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+
+        """
+        sw = self.getSnappedWidget()
+        
+        actions = [{"tag":"pres_points", "icon":"RedPoints.png",
+                     "checked":True, "label":"Display presence points",
+                     "group":"pres_points"},
+                   {"tag":"abs_points", "icon":"GreenPoints.png",
+                     "checked":True, "label":"Display absence points",
+                     "group":"abs_points"},
+                   {"tag":"backs_points", "icon":"BlackPoints.png",
+                     "checked":False, "label":"Display background points",
+                     "group":"backs_points"},
+                   {"tag":"prob_map", "icon":"ProbMap.png",
+                     "checked":True, "label":"Display probability map",
+                     "group":"Grids"},
+                   {"tag":"bin_map", "icon":"BinMap.png",
+                     "checked":False, "label":"Display binary map",
+                     "group":"Grids"},
+                   {"tag":"res_map", "icon":"ResMap.png",
+                     "checked":False, "label":"Display residuals map",
+                     "group":"Grids"},
+                   {"tag":"mes_map", "icon":"MesMap.png",
+                     "checked":False, "label":"Display Multivariate Environmental Similarity Surface (Mess) map",
+                     "group":"Grids"},
+                    {"tag":"mod_map", "icon":"ModMap.png",
+                     "checked":False, "label":"Display Most Dissimilar Variable (MoD) map",
+                     "group":"Grids"}]
+
+
+        for action_dict in actions:
+            self.appendAction(ViewLayerAction(action_dict, self))
+            
+    def updateToolBar(self):
+        QCellToolBar.updateToolBar(self)
+        sw = self.getSnappedWidget()
+        for action in self.actions():
+            if type(action) == ViewLayerAction:
+                #disenable all action refering to data we don't have
+                action.setEnabled(action.tag in sw.all_layers)
+
+        
\ No newline at end of file
diff --git a/contrib/sahm/SahmSpatialViewerCell.py b/contrib/sahm/SahmSpatialViewerCell.py
new file mode 100644
index 0000000..0f5db47
--- /dev/null
+++ b/contrib/sahm/SahmSpatialViewerCell.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'I:\VisTrails\Central_VisTrailsInstall_debug\vistrails\packages\sahm\SahmSpatialViewerCell.ui'
+#
+# Created: Tue Oct 11 16:20:25 2011
+#      by: PyQt4 UI code generator 4.8.5
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class Ui_Frame(object):
+    def setupUi(self, Frame):
+        Frame.setObjectName(_fromUtf8("Frame"))
+        Frame.resize(734, 706)
+        Frame.setWindowTitle(QtGui.QApplication.translate("Frame", "Frame", None, QtGui.QApplication.UnicodeUTF8))
+        Frame.setFrameShape(QtGui.QFrame.StyledPanel)
+        Frame.setFrameShadow(QtGui.QFrame.Plain)
+        self.gridLayout = QtGui.QGridLayout(Frame)
+        self.gridLayout.setMargin(0)
+        self.gridLayout.setSpacing(0)
+        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
+        self.splitter = QtGui.QSplitter(Frame)
+        self.splitter.setOrientation(QtCore.Qt.Vertical)
+        self.splitter.setObjectName(_fromUtf8("splitter"))
+        self.legend_frame_2 = QtGui.QFrame(self.splitter)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.legend_frame_2.sizePolicy().hasHeightForWidth())
+        self.legend_frame_2.setSizePolicy(sizePolicy)
+        self.legend_frame_2.setMinimumSize(QtCore.QSize(0, 0))
+        self.legend_frame_2.setBaseSize(QtCore.QSize(0, 0))
+        self.legend_frame_2.setFrameShape(QtGui.QFrame.StyledPanel)
+        self.legend_frame_2.setFrameShadow(QtGui.QFrame.Sunken)
+        self.legend_frame_2.setObjectName(_fromUtf8("legend_frame_2"))
+        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.legend_frame_2)
+        self.horizontalLayout_2.setSpacing(5)
+        self.horizontalLayout_2.setContentsMargins(9, 0, 0, 0)
+        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
+        self.legend_label = QtGui.QLabel(self.legend_frame_2)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.legend_label.sizePolicy().hasHeightForWidth())
+        self.legend_label.setSizePolicy(sizePolicy)
+        self.legend_label.setText(QtGui.QApplication.translate("Frame", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+        self.legend_label.setObjectName(_fromUtf8("legend_label"))
+        self.horizontalLayout_2.addWidget(self.legend_label)
+        self.legend = QtGui.QFrame(self.legend_frame_2)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.legend.sizePolicy().hasHeightForWidth())
+        self.legend.setSizePolicy(sizePolicy)
+        self.legend.setFrameShape(QtGui.QFrame.NoFrame)
+        self.legend.setFrameShadow(QtGui.QFrame.Plain)
+        self.legend.setLineWidth(0)
+        self.legend.setObjectName(_fromUtf8("legend"))
+        self.legend_layout = QtGui.QHBoxLayout(self.legend)
+        self.legend_layout.setMargin(0)
+        self.legend_layout.setObjectName(_fromUtf8("legend_layout"))
+        self.horizontalLayout_2.addWidget(self.legend)
+        self.map_frame = QtGui.QFrame(self.splitter)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(1)
+        sizePolicy.setHeightForWidth(self.map_frame.sizePolicy().hasHeightForWidth())
+        self.map_frame.setSizePolicy(sizePolicy)
+        self.map_frame.setFrameShape(QtGui.QFrame.StyledPanel)
+        self.map_frame.setFrameShadow(QtGui.QFrame.Sunken)
+        self.map_frame.setObjectName(_fromUtf8("map_frame"))
+        self.horizontalLayout = QtGui.QHBoxLayout(self.map_frame)
+        self.horizontalLayout.setSpacing(0)
+        self.horizontalLayout.setMargin(0)
+        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+        self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
+
+        self.retranslateUi(Frame)
+        QtCore.QMetaObject.connectSlotsByName(Frame)
+
+    def retranslateUi(self, Frame):
+        pass
+
diff --git a/contrib/sahm/SahmViewerCell.py b/contrib/sahm/SahmViewerCell.py
new file mode 100644
index 0000000..af0be39
--- /dev/null
+++ b/contrib/sahm/SahmViewerCell.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'SahmViewerCell.ui'
+#
+# Created: Thu Sep 29 18:41:54 2011
+#      by: PyQt4 UI code generator 4.8.5
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class Ui_Frame(object):
+    def setupUi(self, Frame):
+        Frame.setObjectName(_fromUtf8("Frame"))
+        Frame.resize(546, 402)
+        Frame.setWindowTitle(QtGui.QApplication.translate("Frame", "Frame", None, QtGui.QApplication.UnicodeUTF8))
+        Frame.setFrameShape(QtGui.QFrame.StyledPanel)
+        Frame.setFrameShadow(QtGui.QFrame.Raised)
+        self.horizontalLayout = QtGui.QHBoxLayout(Frame)
+        self.horizontalLayout.setSpacing(0)
+        self.horizontalLayout.setMargin(0)
+        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+        self.tabWidget = QtGui.QTabWidget(Frame)
+        self.tabWidget.setEnabled(True)
+        self.tabWidget.setTabPosition(QtGui.QTabWidget.North)
+        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
+        self.text_output = QtGui.QWidget()
+        self.text_output.setObjectName(_fromUtf8("text_output"))
+        self.text_output_layout = QtGui.QHBoxLayout(self.text_output)
+        self.text_output_layout.setSpacing(0)
+        self.text_output_layout.setMargin(0)
+        self.text_output_layout.setObjectName(_fromUtf8("text_output_layout"))
+        self.tabWidget.addTab(self.text_output, _fromUtf8(""))
+        self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.text_output), QtGui.QApplication.translate("Frame", "Textual model output ", None, QtGui.QApplication.UnicodeUTF8))
+        self.response_curves = QtGui.QWidget()
+        self.response_curves.setObjectName(_fromUtf8("response_curves"))
+        self.response_curves_layout = QtGui.QHBoxLayout(self.response_curves)
+        self.response_curves_layout.setSpacing(0)
+        self.response_curves_layout.setMargin(0)
+        self.response_curves_layout.setObjectName(_fromUtf8("response_curves_layout"))
+        self.tabWidget.addTab(self.response_curves, _fromUtf8(""))
+        self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.response_curves), QtGui.QApplication.translate("Frame", "Response curves", None, QtGui.QApplication.UnicodeUTF8))
+        self.auc = QtGui.QWidget()
+        self.auc.setObjectName(_fromUtf8("auc"))
+        self.horizontalLayout_4 = QtGui.QHBoxLayout(self.auc)
+        self.horizontalLayout_4.setSpacing(0)
+        self.horizontalLayout_4.setMargin(0)
+        self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
+        self.gv_auc = QtGui.QGraphicsView(self.auc)
+        self.gv_auc.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
+        self.gv_auc.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
+        self.gv_auc.setResizeAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
+        self.gv_auc.setObjectName(_fromUtf8("gv_auc"))
+        self.horizontalLayout_4.addWidget(self.gv_auc)
+        self.tabWidget.addTab(self.auc, _fromUtf8(""))
+        self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.auc), QtGui.QApplication.translate("Frame", "Area under the curve (AUC)", None, QtGui.QApplication.UnicodeUTF8))
+        self.horizontalLayout.addWidget(self.tabWidget)
+
+        self.retranslateUi(Frame)
+        self.tabWidget.setCurrentIndex(2)
+        QtCore.QMetaObject.connectSlotsByName(Frame)
+
+    def retranslateUi(self, Frame):
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.text_output), QtGui.QApplication.translate("Frame", "Model Results", None, QtGui.QApplication.UnicodeUTF8))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.response_curves), QtGui.QApplication.translate("Frame", "Response", None, QtGui.QApplication.UnicodeUTF8))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.auc), QtGui.QApplication.translate("Frame", "AUC", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/contrib/sahm/SelectPredictorsLayers.py b/contrib/sahm/SelectPredictorsLayers.py
new file mode 100644
index 0000000..1815c27
--- /dev/null
+++ b/contrib/sahm/SelectPredictorsLayers.py
@@ -0,0 +1,428 @@
+'''
+Created on Sep 17, 2010
+
+ at author: talbertc
+'''
+from core.modules.vistrails_module import Module
+from PyQt4 import QtCore, QtGui
+import csv
+import utils
+from utils import writetolog
+import shutil
+import os
+from core.system import execute_cmdline
+import subprocess
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class SelectListDialog(QtGui.QDialog):
+
+    def __init__(self, inputMDS, outputMDS, displayJPEG, rPath, parent=None):
+        #print inputMDS, outputMDS, rPath, modelsPath
+        self.rPath = rPath
+        
+        self.selection_name = os.path.split(outputMDS)[1]
+        self.selection_name = os.path.splitext(self.selection_name)[0]
+        self.selection_name = self.selection_name.split('_')[-1]
+        
+        self.displayJPEG = displayJPEG
+        
+        QtGui.QDialog.__init__(self, parent)
+        
+        self.inputMDS = inputMDS
+        self.outputMDS = outputMDS
+        self.outputDir = os.path.split(outputMDS)[0]
+        
+        layout = QtGui.QVBoxLayout()
+        self.setWindowFlags(QtCore.Qt.Window)
+        ##begin  autogenerated code from QtDesigner
+        #
+        
+        self.horizontalLayout_4 = QtGui.QHBoxLayout()
+        self.horizontalLayout_4.setSpacing(5)
+        self.horizontalLayout_4.setMargin(5)
+        self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
+        self.verticalLayout_3 = QtGui.QVBoxLayout()
+        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
+        self.splitter = QtGui.QSplitter()
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.splitter.sizePolicy().hasHeightForWidth())
+        self.splitter.setSizePolicy(sizePolicy)
+        self.splitter.setMinimumSize(QtCore.QSize(0, 0))
+        self.splitter.setFrameShape(QtGui.QFrame.Box)
+        self.splitter.setFrameShadow(QtGui.QFrame.Plain)
+        self.splitter.setLineWidth(1)
+        self.splitter.setOrientation(QtCore.Qt.Horizontal)
+        self.splitter.setHandleWidth(10)
+        self.splitter.setObjectName(_fromUtf8("splitter"))
+        self.widget = QtGui.QWidget(self.splitter)
+        self.widget.setObjectName(_fromUtf8("widget"))
+        self.verticalLayout = QtGui.QVBoxLayout(self.widget)
+        self.verticalLayout.setSpacing(4)
+        self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
+        self.verticalLayout.setContentsMargins(6, 6, 3, 3)
+        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
+        self.label_2 = QtGui.QLabel(self.widget)
+        self.label_2.setObjectName(_fromUtf8("label_2"))
+        self.verticalLayout.addWidget(self.label_2)
+        self.treeview = QtGui.QTreeWidget(self.widget)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.treeview.sizePolicy().hasHeightForWidth())
+        self.treeview.setSizePolicy(sizePolicy)
+        self.treeview.setMinimumSize(QtCore.QSize(75, 0))
+        self.treeview.setMaximumSize(QtCore.QSize(16777215, 16777215))
+        self.treeview.setSizeIncrement(QtCore.QSize(100, 0))
+        self.treeview.setBaseSize(QtCore.QSize(0, 0))
+        self.treeview.setObjectName(_fromUtf8("treeview"))
+        self.verticalLayout.addWidget(self.treeview)
+        self.horizontalLayout_3 = QtGui.QHBoxLayout()
+        self.horizontalLayout_3.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
+        self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
+        self.btnRunR = QtGui.QPushButton(self.widget)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.btnRunR.sizePolicy().hasHeightForWidth())
+        self.btnRunR.setSizePolicy(sizePolicy)
+        self.btnRunR.setObjectName(_fromUtf8("btnRunR"))
+        self.horizontalLayout_3.addWidget(self.btnRunR)
+        spacerItem = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_3.addItem(spacerItem)
+        self.label = QtGui.QLabel(self.widget)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+        self.label.setSizePolicy(sizePolicy)
+        self.label.setObjectName(_fromUtf8("label"))
+        self.horizontalLayout_3.addWidget(self.label)
+        self.lineEdit = QtGui.QLineEdit(self.widget)
+        self.lineEdit.setText(_fromUtf8("0.7"))
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.lineEdit.sizePolicy().hasHeightForWidth())
+        self.lineEdit.setSizePolicy(sizePolicy)
+        self.lineEdit.setMaximumSize(QtCore.QSize(75, 16777215))
+        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
+        self.horizontalLayout_3.addWidget(self.lineEdit)
+        
+        self.chkPresence = QtGui.QCheckBox(self.widget)
+        self.chkPresence.setChecked(True)
+        self.chkPresence.setText(_fromUtf8("Include presence/count points"))
+        self.chkPresence.setObjectName(_fromUtf8("chkPresence"))
+        self.verticalLayout.addWidget(self.chkPresence)
+        self.chkAbsence = QtGui.QCheckBox(self.widget)
+        self.chkAbsence.setChecked(True)
+        self.chkAbsence.setText(_fromUtf8("Include absence points"))
+        self.chkAbsence.setObjectName(_fromUtf8("chkAbsence"))
+        self.verticalLayout.addWidget(self.chkAbsence)
+        self.chkBackground = QtGui.QCheckBox(self.widget)
+        self.chkBackground.setChecked(True)
+        self.chkBackground.setText(_fromUtf8("Include background points"))
+        self.chkBackground.setObjectName(_fromUtf8("chkBackground"))
+        self.verticalLayout.addWidget(self.chkBackground)
+        
+        self.verticalLayout.addLayout(self.horizontalLayout_3)
+        
+        self.scene = QtGui.QGraphicsScene() 
+        self.view = QtGui.QGraphicsView(self.scene)
+        #self.view = customGraphicsView(self.scene)
+        self.view.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
+        
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(4)
+        sizePolicy.setVerticalStretch(0)
+        #sizePolicy.setHeightForWidth(self.view.sizePolicy().hasHeightForWidth())
+        self.view.setSizePolicy(sizePolicy)
+        self.view.setResizeAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
+        self.view.setObjectName(_fromUtf8("view"))
+        
+        self.splitter.addWidget(self.view)
+        
+        self.verticalLayout_3.addWidget(self.splitter)
+        self.horizontalLayout = QtGui.QHBoxLayout()
+        self.horizontalLayout.setContentsMargins(-1, 3, -1, 3)
+        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+        self.btnOK = QtGui.QPushButton()
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.btnOK.sizePolicy().hasHeightForWidth())
+        self.btnOK.setSizePolicy(sizePolicy)
+        self.btnOK.setBaseSize(QtCore.QSize(100, 0))
+        self.btnOK.setToolTip(_fromUtf8(""))
+        self.btnOK.setObjectName(_fromUtf8("btnOK"))
+        self.horizontalLayout.addWidget(self.btnOK)
+        self.btnCancel = QtGui.QPushButton()
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.btnCancel.sizePolicy().hasHeightForWidth())
+        self.btnCancel.setSizePolicy(sizePolicy)
+        self.btnCancel.setBaseSize(QtCore.QSize(100, 0))
+        self.btnCancel.setObjectName(_fromUtf8("btnCancel"))
+        self.horizontalLayout.addWidget(self.btnCancel)
+        self.verticalLayout_3.addLayout(self.horizontalLayout)
+        self.horizontalLayout_4.addLayout(self.verticalLayout_3)
+
+        self.setWindowTitle(_fromUtf8("Covariate Coorelation viewer"))
+        self.label_2.setText(_fromUtf8("Covariates"))
+        self.btnRunR.setText(_fromUtf8("Update"))
+        self.label.setText(_fromUtf8("Threshold"))
+        self.btnOK.setText(_fromUtf8("OK"))
+        self.btnCancel.setText(_fromUtf8("Cancel"))
+        self.resize(1100, 800)
+        self.view.resize(800, 750)
+        
+        ##End  autogenerated code from QtDesigner
+        
+        layout.addLayout(self.horizontalLayout_4)
+        
+        self.btnCancel.setShortcut('Esc')
+        self.connect(self.btnOK, QtCore.SIGNAL('clicked(bool)'),
+                     self.okTriggered)
+        self.connect(self.btnCancel, QtCore.SIGNAL('clicked(bool)'),
+                     self.cancel)
+        self.connect(self.btnRunR, QtCore.SIGNAL('clicked(bool)'),
+                     self.updateROutput)
+#        self.connect(self.view, QtCore.SIGNAL('resize()'),
+#                     self.resize)
+        
+        self.scene.wheelEvent = self.wheel_event
+#        self.resizeEvent = self.resize_event
+        #code to populate the treeview with the contents of our MDS
+        self.PopulateTreeview()
+        
+        self.setLayout(layout)
+        self.repaint()
+        #utils.breakpoint()
+        #code to add in pictureviewer stuff
+        outputPic = self.runR(self.inputMDS)
+#        self.setup_view()
+        self.load_picture(outputPic)
+        
+    def okTriggered(self):
+        self.SaveMDSFromTreeview()
+        self.done(0)
+
+    def cancel(self):
+        self.done(1)
+        #raise Exception
+#        shutil.copyfile(self.inputMDS, self.outputMDS)
+        
+    
+    def PopulateTreeview(self):
+        ''' Reads in the input MDS and populates the treeview widget
+        with the items in covariate columns.  
+        Sets the check state to be the same as the 0/1 include flag.
+        '''
+        writetolog("    PopulateTreeview inputMDS = " + self.inputMDS, False, False)
+        self.treeview.setColumnCount(1)
+        #If an outputMDS already exists then the user has run this module before.
+        #We need to pull and apply their previous selections from that output file
+
+
+            
+        csvfile = open(self.inputMDS, "r")
+        #print "MDS", self.inputMDS
+        reader = csv.reader(csvfile)
+        header = reader.next() #store the header
+        header2 = reader.next() #the 2nd line of the mds with use/don't use
+        header3 = reader.next() #the 3rd line of the mds with the path
+        
+        self.responseCol = header[2]
+        
+        headerList = []
+        n = 0
+        for i in range(0, len(header)):
+            headerList.append([header[i], header2[i], header3[i]])
+        
+        #headerList.sort()
+        for item in headerList[3:]:
+            child_item = QtGui.QTreeWidgetItem([item[0],])
+            child_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
+                            QtCore.Qt.ItemIsEnabled)
+            checked = True
+            if int(item[1]) == 0:
+                checked = False 
+            
+            if not checked:
+                child_item.setCheckState(0, QtCore.Qt.Unchecked)
+            else:
+                child_item.setCheckState(0, QtCore.Qt.Checked)
+            
+            self.treeview.addTopLevelItem(child_item)
+            #self.tree_items[file] = child_item
+            n += 1
+        csvfile.close()
+        #update the tree view label to show how many covariates there are
+        self.label_2.setText(_fromUtf8("Covariates   (n=" + str(n) + ")"))
+        
+    def SaveMDSFromTreeview(self):
+        #updates the second header line on the input MDS file 
+        #to reflect the checked items in the tree view 
+        #and saves the results to the output MDS.
+        
+        reader = csv.reader(open(self.inputMDS, "r"))
+        header = reader.next() #store the header
+        header2 = reader.next() #the 2nd line of the mds with use/don't use
+        header3 = reader.next() #the 3rd line of the mds with the path
+        
+        headerList = [] 
+        for i in range(0, len(header)):
+            headerList.append([header[i], header2[i], header3[i]])
+        
+        outHeader2 = header2[:2] + [self.selection_name]        
+                  
+        treeviewIter = QtGui.QTreeWidgetItemIterator(self.treeview)
+        while treeviewIter.value():
+            if treeviewIter.value().checkState(0) == QtCore.Qt.Checked:
+                outHeader2.append("1")
+            else:
+                outHeader2.append ("0")
+            treeviewIter += 1
+
+        
+        oFile = open(self.outputMDS, 'wb')
+        writer = csv.writer(oFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
+        writer.writerow(header)
+        writer.writerow(outHeader2)
+        writer.writerow(header3)
+        for row in reader:
+            writer.writerow(row)
+        oFile.close
+
+    def updateROutput(self):
+        self.SaveMDSFromTreeview()
+        outputPic = self.runR(self.outputMDS)
+        self.load_picture(outputPic)
+        
+    def runR(self, MDSfile):
+#        
+#        program = os.path.join(self.rPath, "i386", "Rterm.exe") 
+#        script = os.path.join(utils.getModelsPath(), "PairsExplore.r")
+
+        args = "i=" + '"' + MDSfile + '"' + " o=" + '"' + self.displayJPEG + '"' + " m=" + str(self.lineEdit.text())
+        args += " rc=" + self.responseCol
+        
+        if self.chkPresence.checkState() == QtCore.Qt.Checked:
+            args += " pres=TRUE"
+        else:
+            args += " pres=FALSE"
+        if self.chkAbsence.checkState() == QtCore.Qt.Checked:
+            args += " absn=TRUE"
+        else:
+            args += " absn=FALSE"
+        if self.chkBackground.checkState() == QtCore.Qt.Checked:
+            args += " bgd=TRUE"
+        else:
+            args += " bgd=FALSE"
+
+#        command = program + " --vanilla -f " + script + " --args " + args
+#        writetolog("    " + command, False, False)
+        if os.path.exists(os.path.join(self.outputDir, "Predictor_Correlation.jpg")):
+            os.remove(os.path.join(self.outputDir, "Predictor_Correlation.jpg"))
+            
+        utils.runRScript('PairsExplore.r', args)
+
+#        p = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+#
+#        writetolog("   Calculating covariate correlation in r R ")
+
+#        ret = p.communicate()
+#        if ret[1]:
+#            msg = "An error was encountered in the R script for this module.  The R error message is below - \n"
+#            msg += ret[1]
+#            writetolog(msg)
+#            raise Exception, msg
+#        else:
+#            writetolog("   Finished in R. ")
+#        del(ret)
+        
+        if os.path.exists(os.path.join(self.displayJPEG)):
+            return os.path.join(self.displayJPEG)
+        else:
+            writetolog("Missing output from R processing: " + self.displayJPEG)
+            raise Exception, "Missing output from R processing"
+
+    def load_picture(self, strPicture):
+        #utils.breakpoint()
+        self.l_pix = QtGui.QPixmap(strPicture)
+        if self.view.size().width()  <= self.view.size().height(): 
+            self.max_vsize = self.view.size().width() * 0.95
+        else: 
+            self.max_vsize = self.view.size().height() * 0.95
+            
+        self.c_view = self.l_pix.scaled(self.max_vsize, self.max_vsize, 
+                                            QtCore.Qt.KeepAspectRatio, 
+                                            QtCore.Qt.SmoothTransformation) 
+        self.view_current()
+   
+    def view_current(self):
+        #print "view_current"
+        size_img = self.c_view.size() 
+        wth, hgt = QtCore.QSize.width(size_img), QtCore.QSize.height(size_img) 
+        self.scene.clear() 
+        self.scene.setSceneRect(0, 0, wth, hgt) 
+        self.scene.addPixmap(self.c_view) 
+        QtCore.QCoreApplication.processEvents() 
+        
+#    def load_current(self, filePath):
+#        print "load_current" 
+#        self.l_pix = QtGui.QPixmap(filePath) 
+#        self.c_view = self.l_pix.scaled(self.max_vsize, self.max_vsize, 
+#                                            QtCore.Qt.KeepAspectRatio, 
+#                                            QtCore.Qt.FastTransformation) 
+#        #change the previous line with QtCore.Qt.SmoothTransformation eventually 
+#        self.view_current()
+
+    def wheel_event (self, event):
+        numDegrees = event.delta() / 8 
+        numSteps = numDegrees / 15.0 
+        self.zoom(numSteps) 
+        event.accept() 
+
+    def zoom(self, step):
+        zoom_step = 0.06
+        self.scene.clear() 
+        w = self.c_view.size().width() 
+        h = self.c_view.size().height() 
+        w, h = w * (1 + zoom_step*step), h * (1 + zoom_step*step) 
+        self.c_view = self.l_pix.scaled(w, h, 
+                                            QtCore.Qt.KeepAspectRatio, 
+                                            QtCore.Qt.SmoothTransformation) 
+        self.view_current() 
+
+    def closeEvent(self, event):
+        self.cancel()
+        
+    def resizeEvent(self, event):
+        self.load_picture(self.displayJPEG)
+        
+#    def resize_event(self, event):
+#        utils.breakpoint()
+#        origsize = self.c_view.size()
+#        size = event.size()
+#        w = size.width() 
+#        h = size.height() 
+#        self.c_view = self.l_pix.scaled(origsize.width(), origsize.height(), 
+#                                            QtCore.Qt.KeepAspectRatio, 
+#                                            QtCore.Qt.SmoothTransformation) 
+#        self.view_current() 
+        
+
+#class customGraphicsView(QtGui.QGraphicsView):
+#          
+#    def __init__(self, parent=None):         
+#       QtGui.QGraphicsView.__init__(self, parent)
+#              
+#    def resizeEvent(self, evt=None):         
+#        self.emit(QtCore.SIGNAL("resize()"))
diff --git a/contrib/sahm/__init__.py b/contrib/sahm/__init__.py
new file mode 100644
index 0000000..7a0d593
--- /dev/null
+++ b/contrib/sahm/__init__.py
@@ -0,0 +1,14 @@
+from core.configuration import ConfigurationObject
+
+name = "SAHM"
+identifier = "gov.usgs.sahm"
+version = '0.0.5'
+
+configuration = \
+    ConfigurationObject(output_dir= r'C:\temp\SAHM_workspace',
+                        r_path = r'..\\Central_R\R-2.12.1\bin',
+                        gdal_path = r'..\\Central_GDAL',
+                        maxent_path = r'..\\Central_Maxent',
+                        qgis_path = r'..\\Central_QGIS',
+                        projection_layers_path = r'I:\WorldClim_Future_Climate\RenamedBILs', #This only applies to instances running in the FORT Infrastructure
+                        verbose = 'True')
diff --git a/contrib/sahm/enum_modules.py b/contrib/sahm/enum_modules.py
new file mode 100644
index 0000000..142c0e8
--- /dev/null
+++ b/contrib/sahm/enum_modules.py
@@ -0,0 +1,11 @@
+from core.modules.basic_modules import String
+from enum_widget import build_enum_widget
+
+class MyEnum(String):
+    _input_ports = [('value', '(gov.usgs.sahm:MyEnum:DataInput)')]
+    _widget_class = build_enum_widget('MyEnumWidget', 
+                                      ['abc', 'def', 'ghi'])
+
+    @staticmethod
+    def get_widget_class():
+        return MyEnum._widget_class
diff --git a/contrib/sahm/enum_widget.py b/contrib/sahm/enum_widget.py
new file mode 100644
index 0000000..3a61264
--- /dev/null
+++ b/contrib/sahm/enum_widget.py
@@ -0,0 +1,44 @@
+from PyQt4 import QtCore, QtGui
+from core.modules.constant_configuration import ConstantWidgetMixin
+
+class EnumWidget(QtGui.QComboBox, ConstantWidgetMixin):
+    param_values = []
+    def __init__(self, param, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+                    parent: QWidget)
+
+        """
+        contents = param.strValue
+        contentType = param.type
+        QtGui.QComboBox.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        # want to look up in registry based on parameter type
+        
+        self.addItem('')
+        for val in self.param_values:
+            self.addItem(val)
+
+        curIdx = self.findText(contents)
+        if curIdx != -1:
+            self.setCurrentIndex(curIdx)
+        self._contentType = contentType
+        self.connect(self,
+                     QtCore.SIGNAL('currentIndexChanged(int)'),
+                     self.update_parent)
+
+    def contents(self):
+        curIdx = self.currentIndex()
+        if curIdx == -1:
+            print '*** ""'
+            return ''
+        print '*** "%s"' % str(self.itemText(curIdx))
+        return str(self.itemText(curIdx))
+
+    def setContents(self, strValue, silent=True):
+        curIdx = self.findText(contents)
+        self.setCurrentIndex(curIdx)
+        if not silent:
+            self.update_parent()
+
+def build_enum_widget(name, param_values):
+    return type(name, (EnumWidget,), {'param_values': param_values})
diff --git a/contrib/sahm/init.py b/contrib/sahm/init.py
new file mode 100644
index 0000000..6e12900
--- /dev/null
+++ b/contrib/sahm/init.py
@@ -0,0 +1,1788 @@
+#test from marian
+import csv
+from datetime import datetime
+import glob
+import itertools
+import os
+import shutil
+import sys
+import subprocess
+import traceback
+
+from core.modules.vistrails_module import Module, ModuleError, ModuleConnector
+from core.modules.basic_modules import File, Directory, Path, new_constant, Constant
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+#from packages.persistence.init import PersistentPath, PersistentFile, PersistentDir
+
+from core.modules.basic_modules import List
+from core.modules.basic_modules import String
+
+from PyQt4 import QtCore, QtGui
+
+from widgets import get_predictor_widget, get_predictor_config
+from enum_widget import build_enum_widget
+
+from SelectPredictorsLayers import SelectListDialog
+
+import utils
+#import our python SAHM Processing files
+import packages.sahm.pySAHM.FieldDataQuery as FDQ
+import packages.sahm.pySAHM.MDSBuilder as MDSB
+import packages.sahm.pySAHM.PARC as parc
+import packages.sahm.pySAHM.RasterFormatConverter as RFC
+import packages.sahm.pySAHM.MaxentRunner as MaxentRunner
+from SahmOutputViewer import SAHMModelOutputViewerCell
+from SahmSpatialOutputViewer import SAHMSpatialOutputViewerCell 
+
+from utils import writetolog
+from pySAHM.utilities import TrappedError
+
+from SahmSpatialOutputViewer import setQGIS
+
+identifier = 'gov.usgs.sahm' 
+
+def menu_items():
+    """ Add a menu item which allows users to specify their session directory
+    """
+    def change_session_folder():
+        global session_dir
+        
+        path = str(QtGui.QFileDialog.getExistingDirectory(None,
+                                        'Browse to new session folder -'))
+        session_dir = path
+        utils.setrootdir(path)
+        
+        writetolog("*" * 79 + "\n" + "*" * 79)
+        writetolog(" output directory:   " + session_dir)
+        writetolog("*" * 79 + "\n" + "*" * 79)
+    
+    lst = []
+    lst.append(("Change session folder", change_session_folder))
+    return(lst)
+
+
+
+
+def expand_ports(port_list):
+    new_port_list = []
+    for port in port_list:
+        port_spec = port[1]
+        if type(port_spec) == str: # or unicode...
+            if port_spec.startswith('('):
+                port_spec = port_spec[1:]
+            if port_spec.endswith(')'):
+                port_spec = port_spec[:-1]
+            new_spec_list = []
+            for spec in port_spec.split(','):
+                spec = spec.strip()
+                parts = spec.split(':', 1)
+#                print 'parts:', parts
+                namespace = None
+                if len(parts) > 1:
+                    mod_parts = parts[1].rsplit('|', 1)
+                    if len(mod_parts) > 1:
+                        namespace, module_name = mod_parts
+                    else:
+                        module_name = parts[1]
+                    if len(parts[0].split('.')) == 1:
+                        id_str = 'edu.utah.sci.vistrails.' + parts[0]
+                    else:
+                        id_str = parts[0]
+                else:
+                    mod_parts = spec.rsplit('|', 1)
+                    if len(mod_parts) > 1:
+                        namespace, module_name = mod_parts
+                    else:
+                        module_name = spec
+                    id_str = identifier
+                if namespace:
+                    new_spec_list.append(id_str + ':' + module_name + ':' + \
+                                             namespace)
+                else:
+                    new_spec_list.append(id_str + ':' + module_name)
+            port_spec = '(' + ','.join(new_spec_list) + ')'
+        new_port_list.append((port[0], port_spec) + port[2:])
+#    print new_port_list
+    return new_port_list
+
+class FieldData(Path): 
+    '''
+    Field Data
+
+    The FieldData module allows a user to add presence/absence points or count data recorded across a
+    landscape for the phenomenon being modeled (e.g., plant sightings, evidence of animal presence, etc.).
+    The input data for this module must be in the form of a .csv file that follows one of two formats: 
+
+    Format 1
+    A .csv file with the following column headings, in order: "X," "Y," and "responseBinary".
+    In this case, the "X" field should be populated with the horizontal (longitudinal) positional
+    data for a sample point. The "Y" field should be populated with the vertical (latitudinal) data
+    for a sample point. These values must be in the same coordinate system/units as the template
+    layer used in the workflow. The column "responseBinary" should be populated with either a '0'
+    (indicating absence at the point) or a '1' (indicating presence at the point).
+
+    Format 2
+    A .csv file with the following column headings, in order: "X," "Y," and "responseCount".
+    In this case, the "X" field should be populated with the horizontal (longitudinal) positional
+    data for a sample point. The "Y" field should be populated with the vertical (latitudinal) data
+    for a sample point. These values must be in the same coordinate system/units as the template
+    layer used in the workflow. The column "responseCount" should be populated with either a '-9999'
+    (indicating that the point is a background point) or a numerical value (either '0' or a positive integer)
+    indicating the number of incidences of the phenomenon recorded at that point.
+    '''   
+#    _input_ports = [('csvFile', '(edu.utah.sci.vistrails.basic:File)')]
+    _output_ports = [('value', '(gov.usgs.sahm:FieldData:DataInput)'),
+                     ('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+    
+    
+    
+class AggregationMethod(String):
+    '''
+    This module is a required class for other modules and scripts within the
+    SAHM package. It is not intended for direct use or incorporation into
+    the VisTrails workflow by the user.
+    '''
+    _input_ports = [('value', '(gov.usgs.sahm:AggregationMethod:Other)')]
+    _output_ports = [('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+    _widget_class = build_enum_widget('AggregationMethod', 
+                                      ['Mean', 'Max', 'Min', 'Majority', 'None'])
+
+    @staticmethod
+    def get_widget_class():
+        return AggregationMethod._widget_class
+
+class ResampleMethod(String):
+    '''
+    This module is a required class for other modules and scripts within the
+    SAHM package. It is not intended for direct use or incorporation into
+    the VisTrails workflow by the user.
+    '''
+    _input_ports = [('value', '(gov.usgs.sahm:ResampleMethod:Other)')]
+    _output_ports = [('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+    _widget_class = build_enum_widget('ResampleMethod', 
+                                      ['NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline', 'Lanczos'])
+
+    @staticmethod
+    def get_widget_class():
+        return ResampleMethod._widget_class
+
+class Predictor(Constant):
+    '''
+    Predictor
+    
+    The Predictor module allows a user to select a single raster layer for consideration in the
+    modeled analysis. Four parameters must be specified by the user:
+    
+    1. Aggregation Method: The aggregation method to be used in the event that the raster layer
+    must be up-scaled to match the template layer (e.g., generalizing a 10 m input layer to a
+    100 m output layer). Care should be taken to ensure that the aggregation method that
+    best preserves the integrity of the data is used.
+    
+    2. Resample Method: The resample method employed to interpolate new cell values when
+    transforming the raster layer to the coordinate space or cell size of the template layer,
+    if necessary. 
+    
+    3. Categorical (Boolean): Checking this box indicates that the data contained in the raster
+    layer is categorical (e.g. landcover categories). Leaving this box unchecked indicates that
+    the data contained in the raster is continuous (e.g., a DEM layer). This distinction is important
+    in determining an appropriate resampling method.
+    
+    4. File Path: The location of the raster predictor file, which a user can specify by navigating to the
+    file's location on their file system. When a user is selecting an ESRI grid raster, the user should navigate
+    to the 'hdr.adf' file contained within the grid folder.
+
+    '''
+    _input_ports = [('categorical', '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('ResampleMethod', '(gov.usgs.sahm:ResampleMethod:Other)', {'defaults':str(['Bilinear'])}),
+                    ('AggregationMethod', '(gov.usgs.sahm:AggregationMethod:Other)', {'defaults':str(['Mean'])}),
+                    ('file', '(edu.utah.sci.vistrails.basic:Path)')]
+    _output_ports = [('value', '(gov.usgs.sahm:Predictor:DataInput)'),
+                     ('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+
+    def compute(self):
+        if (self.hasInputFromPort("ResampleMethod")):
+            resampleMethod = self.getInputFromPort("ResampleMethod")
+            if resampleMethod.lower() not in ['nearestneighbor', 'bilinear', 'cubic', 'cubicspline', 'lanczos']:
+                raise ModuleError(self, 
+                                  "Resample Method not one of 'nearestneighbor', 'bilinear', 'cubic', 'cubicspline', or 'lanczos'")
+        else:
+            resampleMethod = 'Bilinear'
+        
+        if (self.hasInputFromPort("AggregationMethod")):
+            aggregationMethod = self.getInputFromPort("AggregationMethod")
+            if self.getInputFromPort("AggregationMethod").lower() not in ['mean', 'max', 'min', 'majority', 'none']:
+                raise ModuleError(self, "No Aggregation Method specified")
+        else:
+            aggregationMethod = "Mean"
+        
+        if (self.hasInputFromPort("categorical")):
+            if self.getInputFromPort("categorical") == True:
+                categorical = '1'
+            else:
+                categorical = '0'
+        else:
+            categorical = '0'
+        
+        if (self.hasInputFromPort("file")):
+            inFile = utils.getRasterName(self.getInputFromPort("file").name)
+        else:
+            raise ModuleError(self, "No input file specified")
+        self.setResult('value', (inFile, categorical, resampleMethod, aggregationMethod))
+   
+class PredictorList(Constant):
+    '''
+    This module is a required class for other modules and scripts within the
+    SAHM package. It is not intended for direct use or incorporation into
+    the VisTrails workflow by the user.
+    '''
+    _input_ports = expand_ports([('value', 'Other|PredictorList'),
+                                 ('addPredictor', 'DataInput|Predictor')])
+    _output_ports = expand_ports([('value', 'Other|PredictorList')])
+    
+    @staticmethod
+    def translate_to_string(v):
+        return str(v)
+
+    @staticmethod
+    def translate_to_python(v):
+        v_list = eval(v)
+        return v_list
+
+    @staticmethod
+    def validate(x):
+        return type(x) == list
+
+    def compute(self):
+        p_list = self.forceGetInputListFromPort("addPredictor")
+        v = self.forceGetInputFromPort("value", [])
+        
+        b = self.validate(v)
+        if not b:
+            raise ModuleError(self, "Internal Error: Constant failed validation")
+        if len(v) > 0 and type(v[0]) == tuple:
+            f_list = [utils.create_file_module(v_elt[1]) for v_elt in v]
+        else:
+            f_list = v
+        p_list += f_list
+        #self.setResult("value", p_list)
+        self.setResult("value", v)     
+
+class PredictorListFile(Module):
+    '''
+    Predictor List File
+
+    The PredictorListFile module allows a user to load a .csv file containing a list
+    of rasters for consideration in the modeled analysis. The .csv file should contain
+    a header row and four columns containing the following information, in order, for
+    each raster input. 
+    
+    Column 1: The full file path to the input raster layer.
+    
+    Column 2: A binary value indicating whether the input layer is categorical or not.
+    A value of "0" indicates that an input raster is non-categorical data (continuous),
+    while a value of "1" indicates that an input raster is categorical data.
+    
+    Column 3: The resampling method employed to interpolate new cell values when
+    transforming the raster layer to the coordinate space or cell size of the template
+    layer, if necessary. The resampling type should be specified using one of the following
+    values: "nearestneighbor," "bilinear," "cubic," or "lanczos."
+    
+    Column 4: The aggregation method to be used in the event that the raster layer
+    must be up-scaled to match the template layer (e.g., generalizing a 10 m input layer to a
+    100 m output layer). Care should be taken to ensure that the aggregation method that
+    best preserves the integrity of the data is used. The aggregation should be specified
+    using one of the following values: "Min," "Mean," "Max," "Majority," or "None."
+
+    In formatting the list of predictor files, the titles assigned to each of the columns
+    are unimportant as the module retrieves the information based on the order of the
+    values in the .csv file (the ordering of the information and the permissible values
+    in the file however, are strictly enforced). The module also anticipates a header row
+    and will ignore the first row in the .csv file.
+
+    '''
+    _input_ports = expand_ports([('csvFileList', '(edu.utah.sci.vistrails.basic:File)'),
+                                 ('addPredictor', 'DataInput|Predictor')])
+    _output_ports = expand_ports([('RastersWithPARCInfoCSV', '(gov.usgs.sahm:RastersWithPARCInfoCSV:Other)')])
+
+    #copies the input predictor list csv to our working directory
+    #and appends any additionally added predictors
+
+    @staticmethod
+    def translate_to_string(v):
+        return str(v)
+
+    @staticmethod
+    def translate_to_python(v):
+        v_list = eval(v)
+        return v_list
+
+    @staticmethod
+    def validate(x):
+        return type(x) == list
+
+    def compute(self):
+        if not (self.hasInputFromPort("csvFileList") or
+                self.hasInputFromPort("addPredictor")):
+            raise ModuleError(self, "No inputs or CSV file provided")
+
+        output_fname = utils.mknextfile(prefix='PredictorList_', suffix='.csv')
+        if (self.hasInputFromPort("csvFileList") and 
+            os.path.exists(self.getInputFromPort("csvFileList").name)):
+            shutil.copy(self.getInputFromPort("csvFileList").name, 
+                output_fname)
+            csv_writer = csv.writer(open(output_fname, 'ab'))
+        else:
+            #create an empty file to start with.
+            csv_writer = csv.writer(open(output_fname, 'wb'))
+            csv_writer.writerow(["file", "Resampling", "Aggregation"])
+        
+        if self.hasInputFromPort("addPredictor"):
+            p_list = self.forceGetInputListFromPort("addPredictor")
+            for p in p_list:
+                if p.hasInputFromPort('resampleMethod'):
+                    resMethod = p.getInputFromPort('resampleMethod')
+                else:
+                    resMethod = "NearestNeighbor"
+                if p.hasInputFromPort('aggregationMethod'):
+                    aggMethod = p.getInputFromPort('aggregationMethod')
+                else:
+                    aggMethod = "Mean"  
+                csv_writer.writerow([os.path.normpath(p.name), resMethod, aggMethod])
+
+        del csv_writer
+        
+        output_file = utils.create_file_module(output_fname)
+        self.setResult('RastersWithPARCInfoCSV', output_file)
+        
+class TemplateLayer(Path):
+    '''
+    Template Layer
+
+    The TemplateLayer is a raster data layer with a defined coordinate system, a known cell size,
+    and an extent that defines the study area. This raster layer serves as the template for all
+    the other inputs in the analysis. All additional raster layers used in the analysis will be
+    resampled and reprojected as needed to match the template, snapped to the template, and
+    clipped to have an extent that matches the template. Users should ensure that any additional
+    layers considered in the analysis have coverage within the extent of the template layer.
+
+    The TemplateLayer is a required input for the PARC module.
+
+    '''
+#    _input_ports = [('FilePath', '(edu.utah.sci.vistrails.basic:File)')]
+    _output_ports = [('value', '(gov.usgs.sahm:TemplateLayer:DataInput)'),
+                     ('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+#    def compute(self):
+#        output_file = create_file_module(self.forceGetInputFromPort('FilePath', []))
+#        self.setResult('value', output_file)
+
+#class SingleInputPredictor(Predictor):
+#    pass
+#
+#class SpatialDef(Module):
+#    _output_ports = [('spatialDef', '(gov.usgs.sahm:SpatialDef:DataInput)')]
+
+class MergedDataSet(File):
+    '''
+    This module is a required class for other modules and scripts within the
+    SAHM package. It is not intended for direct use or incorporation into
+    the VisTrails workflow by the user.
+    '''
+    _input_ports = expand_ports([('mdsFile', '(edu.utah.sci.vistrails.basic:File)')])
+    _output_ports = expand_ports([('value', '(gov.usgs.sahm:MergedDataSet:Other)')])
+    
+    pass
+    
+class RastersWithPARCInfoCSV(File):
+    '''
+    This module is a required class for other modules and scripts within the
+    SAHM package. It is not intended for direct use or incorporation into
+    the VisTrails workflow by the user.
+    '''
+    _input_ports = expand_ports([('mdsFile', '(edu.utah.sci.vistrails.basic:File)')])
+    _output_ports = expand_ports([('value', '(gov.usgs.sahm:MergedDataSet:Other)')])
+    
+    pass
+#    def compute(self, is_input=None):
+#        PersistentPath.compute(self, is_input, 'blob')
+
+class ApplyModel(Module):
+    '''
+    Apply Model
+
+    The ApplyModel module allows the user to apply a model developed using a
+    particular package within the workflow and generate output probability and binary
+    maps. The process of creating an output probability map and binary map based on
+    a particular model can be time-consuming, depending on the input data. By
+    existing as a stand-alone process in the workflow, the ApplyModel module allows
+    a user to investigate the performance metrics for a particular model (such as
+    the ROC curve or the AUC) before dedicating the processing time needed to generate
+    the output maps. In most cases, a user will "fine tune" a model by exploring the
+    performance metrics of different model iterations before applying the model and
+    generating the actual maps as a final step.
+    
+    The ApplyModel module also provides the user with the option of projecting the results
+    of a model developed from one set of environmental predictors onto a new modeled space
+    containing that same set of environmental predictors but representing data captured at
+    a different temporal or spatial location. For example, a user could generate a model
+    predicting habitat suitability using recorded presence points and certain environmental
+    predictors such as elevation, landcover, and proximity to water in one geographic
+    location. Based on the training from this information, the modeled results could be
+    generated for (or "projected to") a new location based on the range of values seen in
+    elevation, landcover, and proximity to water in the second geographic area. Similarly,
+    modeling predicted results through time is also possible. A model trained using field
+    data and a set of predictor layers representative of one time period could be projected
+    onto the same geographical area using a new set of layers corresponding to the same
+    predictors but representing data from a different time period (e.g., different climate
+    data).
+
+    The ApplyModel module accepts two inputs from the user:
+
+    1. Model Workspace: The model workspace field accepts as an input a modeling
+    package element (complete with all required parameters) from upstream in the workflow.
+    The inputs and specifications provided in the dialogue fields of the model will be applied
+    and used to generate the output maps. A user should populate the model workspace field by
+    connecting a model element to the appropriate input port of the ApplyModel module in the
+    visual display of the model workflow.
+    
+    2. Projection Target: The projection target is an optional parameter that allows a user to
+    apply a model to a particular geographic area and or set of predictors (other than those
+    used to train the model) and create output maps within the spatial extent of the projection
+    target layers. This input field should be populated by connecting either the output of the
+    ProjectionLayers module or a separate MDSBuilder element to the appropriate input port of
+    the ApplyModel module.
+    
+    '''
+    
+    _input_ports = [('projectionTarget', '(gov.usgs.sahm:MergedDataSet:Other)'),
+                    ('modelWorkspace', '(edu.utah.sci.vistrails.basic:File)'),
+                    ('makeBinMap', '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('makeProbabilityMap', '(edu.utah.sci.vistrails.basic:Boolean)'),]
+    _output_ports = [('BinaryMap', '(edu.utah.sci.vistrails.basic:File)'), 
+                     ('ProbabilityMap', '(edu.utah.sci.vistrails.basic:File)')]
+    
+    
+    
+    def compute(self):
+        
+        workspace = self.forceGetInputFromPort('modelWorkspace').name
+        output_dname = utils.mknextdir(prefix='AppliedModel_')
+        if self.hasInputFromPort('projectionTarget'):
+            mdsFile = self.forceGetInputFromPort('projectionTarget').name
+            args = "ws=" + '"' + workspace + '"' + " c=" + '"' + mdsFile + '"' + " o=" + '"' + output_dname + '"'
+        else:
+            args = "ws=" + '"' + workspace + '"' + " o=" + '"' + output_dname + '"'
+        
+        if self.hasInputFromPort('makeBinMap'):
+            makeBinMap = self.forceGetInputFromPort('makeBinMap')
+            args += ' mbt=' + str(makeBinMap).upper()
+        else:
+            args += ' mbt=TRUE'
+            
+        if self.hasInputFromPort('makeProbabilityMap'):
+            makeProbabilityMap = self.forceGetInputFromPort('makeProbabilityMap')
+            args += ' mpt=' + str(makeProbabilityMap).upper()
+        else:
+             args += ' mpt=TRUE'
+                
+        
+        utils.runRScript('PredictModel.r', args, self)
+        
+        input_fname = os.path.join(output_dname, "prob_map.tif")
+        output_fname = os.path.join(output_dname, 'prob_map.jpeg')
+        if os.path.exists(input_fname):
+            utils.tif_to_color_jpeg(input_fname, output_fname, color_breaks_csv)
+            output_file1 = utils.create_file_module(output_fname)
+            self.setResult('ProbabilityMap', output_file1)
+        else:
+            msg = "Expected output from ApplyModel was not found."
+            msg += "\nThis likely indicates problems with the inputs to the R module."
+            writetolog(msg, False, True)
+            raise ModuleError(self, msg)
+        
+        if  os.path.exists(os.path.join(output_dname, "bin_map.tif")):
+            outFileName = os.path.join(output_dname, "bin_map.tif")
+            output_file2 = utils.create_file_module(outFileName)
+            self.setResult('BinaryMap', output_file2)
+        
+class Model(Module):
+    '''
+    This module is a required class for other modules and scripts within the
+    SAHM package. It is not intended for direct use or incorporation into
+    the VisTrails workflow by the user.
+    '''
+    _input_ports = [('mdsFile', '(gov.usgs.sahm:MergedDataSet:Other)'),
+                    ('makeBinMap', '(edu.utah.sci.vistrails.basic:Boolean)', {'defaults':str(['True']), 'optional':False}),
+                    ('makeProbabilityMap', '(edu.utah.sci.vistrails.basic:Boolean)', {'defaults':str(['True']), 'optional':False}),
+                    ('makeMESMap', '(edu.utah.sci.vistrails.basic:Boolean)', {'defaults':str(['False']), 'optional':False}),
+                    ('ThresholdOptimizationMethod', '(edu.utah.sci.vistrails.basic:Integer)', {'defaults':str(['2']), 'optional':False})
+                    ]
+    _output_ports = [('modelWorkspace', '(edu.utah.sci.vistrails.basic:File)'), 
+                     ('BinaryMap', '(edu.utah.sci.vistrails.basic:File)'), 
+                     ('ProbabilityMap', '(edu.utah.sci.vistrails.basic:File)'),
+                     ('AUC_plot', '(edu.utah.sci.vistrails.basic:File)'),
+                     ('ResponseCurves', '(edu.utah.sci.vistrails.basic:File)'),
+                     ('Text_Output', '(edu.utah.sci.vistrails.basic:File)')]
+
+    def compute(self):
+        global color_breaks_csv
+        
+        ModelOutput = {"FIT_BRT_pluggable.r":"brt",
+                       "FIT_GLM_pluggable.r":"glm",
+                       "FIT_RF_pluggable.r":"rf",
+                       "FIT_MARS_pluggable.r":"mars"}
+        ModelAbbrev = ModelOutput[self.name]
+        
+        output_dname = utils.mknextdir(prefix=ModelAbbrev + 'output_')
+        argsDict = utils.map_ports(self, self.port_map)
+        mdsFile = self.forceGetInputFromPort('mdsFile').name
+        
+        args = ''
+        for k, v in argsDict.iteritems():
+            if k == 'c':
+                args += ' ' + '='.join([str(k),'"' + str(v) + '"'])
+            else:
+                args += ' ' + '='.join([str(k),str(v)])
+        args += " o=" + '"' + output_dname + '"'
+        args += " rc=" + utils.MDSresponseCol(mdsFile)
+#        if self.hasInputFromPort('makeBinMap'):
+#            makeBinMap = self.forceGetInputFromPort('makeBinMap')
+#            args += ' mbt=' + str(makeBinMap).upper()
+#        else:
+#            makeBinMap = True
+#            args += ' mbt=TRUE'
+#            
+#        if self.hasInputFromPort('makeProbabilityMap'):
+#            makeProbabilityMap = self.forceGetInputFromPort('makeProbabilityMap')
+#            args += ' mpt=' + str(makeProbabilityMap).upper()
+#        else:
+#            makeProbabilityMap = True
+#            args += ' mpt=TRUE'  
+#        
+#        if self.hasInputFromPort('seed'):
+#            args += ' seed=' + str(self.forceGetInputFromPort('seed'))
+#        
+#        if self.hasInputFromPort('someParam'):
+#            x = self.forceGetInputFromPort('someParam')
+#            if x > 1:
+#                msg = "Expected output from " + ModelAbbrev + " was not found."
+#                msg += "\nThis likely indicates problems with the inputs to the R module."
+#                writetolog(msg, False, True)
+#            args += " abr=" + x
+                
+        utils.runRScript(self.name, args, self)
+#        utils.runRScript('FIT_BRT_pluggableErrorMessage.r', args, self)
+        
+        input_fname = os.path.join(output_dname, ModelAbbrev + "_prob_map.tif")
+        output_fname = os.path.join(output_dname, ModelAbbrev + "_prob_map.jpeg")
+        if os.path.exists(input_fname):
+#            utils.tif_to_color_jpeg(input_fname, output_fname, color_breaks_csv)
+#            output_file4 = utils.create_file_module(output_fname)
+            self.setResult('ProbabilityMap', input_fname)
+        elif (argsDict.has_key('mpt') and argsDict['mpt'] == True) or \
+            not argsDict.has_key('mpt'):
+            msg = "Expected output from " + ModelAbbrev + " was not found."
+            msg += "\nThis might indicate problems with the inputs to the R module."
+            msg += "\nCheck the console output for additional R warnings "
+            writetolog(msg, False, True)
+            raise ModuleError(self, msg)
+        
+        if (argsDict.has_key('mbt') and argsDict['mbt'] == True) or \
+            not argsDict.has_key('mbt'):
+            outFileName = os.path.join(output_dname, ModelAbbrev + "_bin_map.tif")
+            output_file1 = utils.create_file_module(outFileName)
+            self.setResult('BinaryMap', output_file1)
+        
+        outFileName = os.path.join(output_dname, ModelAbbrev + "_output.txt")
+        output_file2 = utils.create_file_module(outFileName)
+        self.setResult('Text_Output', output_file2)
+        
+        outFileName = os.path.join(output_dname, ModelAbbrev + "_auc_plot.jpg")
+#        print "out auc: ", outFileName
+        output_file3 = utils.create_file_module(outFileName)
+        self.setResult('AUC_plot', output_file3)
+        
+        outFileName = os.path.join(output_dname, ModelAbbrev + "_response_curves.pdf")
+        output_file5 = utils.create_file_module(outFileName)
+        self.setResult('ResponseCurves', output_file5)
+        
+        outFileName = os.path.join(output_dname, "modelWorkspace")
+#        print "out auc: ", outFileName
+        output_file6 = utils.create_file_module(outFileName)
+        self.setResult('modelWorkspace', output_file6)
+        
+        writetolog("Finished " + ModelAbbrev   +  " builder\n", True, True) 
+        
+class GLM(Model):
+    _input_ports = list(Model._input_ports)
+    _input_ports.extend([('ModelFamily', '(edu.utah.sci.vistrails.basic:String)', {'defaults':str(['binomial']), 'optional':True}),
+                         ('SimplificationMethod', '(edu.utah.sci.vistrails.basic:String)', {'defaults':str(['AIC']), 'optional':True}),
+                         ]) 
+    def __init__(self):
+        global models_path
+        Model.__init__(self) 
+        self.name = 'FIT_GLM_pluggable.r'
+        self.port_map = {'mdsFile':('c', None, True),#These ports are for all Models
+                         'makeProbabilityMap':('mpt', utils.R_boolean, False),
+                         'makeBinMap':('mbt', utils.R_boolean, False),
+                         'makeMESMap':('mes', utils.R_boolean, False),
+                         'ThresholdOptimizationMethod':('om', None, False),
+                         'ModelFamily':('mf', None, False), #This is a GLM specific port
+                         'SimplificationMethod':('sm', None, False) #This is a GLM specific port
+                         }
+
+class RandomForest(Model):
+    _input_ports = list(Model._input_ports)
+    _input_ports.extend([('MTRY', '(edu.utah.sci.vistrails.basic:Integer)', {'defaults':str(['1']), 'optional':True}),
+                         ]) 
+    def __init__(self):
+        global models_path
+        Model.__init__(self)
+        self.name = 'FIT_RF_pluggable.r'
+        self.port_map = {'mdsFile':('c', None, True),#These ports are for all Models
+                         'makeProbabilityMap':('mpt', utils.R_boolean, False),
+                         'makeBinMap':('mbt', utils.R_boolean, False),
+                         'makeMESMap':('mes', utils.R_boolean, False), 
+                         'ThresholdOptimizationMethod':('om', None, False),
+                         'MTRY': ('mtry', None, False) #This is a Random Forest specific port
+                         }
+
+class MARS(Model):
+    _input_ports = list(Model._input_ports)
+    _input_ports.extend([('MarsDegree', '(edu.utah.sci.vistrails.basic:Integer)', {'defaults':str(['1']), 'optional':True}),
+                          ('MarsPenalty', '(edu.utah.sci.vistrails.basic:Integer)', {'defaults':str(['2']), 'optional':True}),
+                          ])
+    def __init__(self):
+        global models_path        
+        Model.__init__(self)
+        self.name = 'FIT_MARS_pluggable.r'
+        self.port_map = {'mdsFile':('c', None, True),#These ports are for all Models
+                         'makeProbabilityMap':('mpt', utils.R_boolean, False),
+                         'makeBinMap':('mbt', utils.R_boolean, False),
+                         'makeMESMap':('mes', utils.R_boolean, False), 
+                         'ThresholdOptimizationMethod':('om', None, False),
+                         'MarsDegree':('deg', None, False), #This is a MARS specific port
+                         'MarsPenalty':('pen', None, False), #This is a MARS specific port
+                         }
+
+class BoostedRegressionTree(Model):
+    _input_ports = list(Model._input_ports)
+    _input_ports.extend([('Seed', '(edu.utah.sci.vistrails.basic:Integer)', True),
+                              ('TreeComplexity', '(edu.utah.sci.vistrails.basic:Integer)', True),
+                              ('NumberOfTrees', '(edu.utah.sci.vistrails.basic:Integer)', {'defaults':str(['10000']), 'optional':True}),
+                              ('BagFraction', '(edu.utah.sci.vistrails.basic:Float)', {'defaults':str(['0.5']), 'optional':True}),
+                              ('NumberOfFolds', '(edu.utah.sci.vistrails.basic:Integer)', {'defaults':str(['3']), 'optional':True}),
+                              ('Alpha', '(edu.utah.sci.vistrails.basic:Float)', {'defaults':str(['1']), 'optional':True}),
+                              ('PrevalenceStratify', '(edu.utah.sci.vistrails.basic:Boolean)', {'defaults':str(['True']), 'optional':True}),
+                              ('ToleranceMethod', '(edu.utah.sci.vistrails.basic:String)', {'defaults':str(['auto']), 'optional':True}),
+                              ('Tolerance', '(edu.utah.sci.vistrails.basic:Float)', {'defaults':str(['0.001']), 'optional':True})
+                              ])
+    def __init__(self):
+        global models_path
+        Model.__init__(self)
+        self.name = 'FIT_BRT_pluggable.r'
+        self.port_map = {'mdsFile':('c', None, True),#These ports are for all Models
+                         'makeProbabilityMap':('mpt', utils.R_boolean, False),
+                         'makeBinMap':('mbt', utils.R_boolean, False),
+                         'makeMESMap':('mes', utils.R_boolean, False), 
+                         'ThresholdOptimizationMethod':('om', None, False),
+                         'Seed':('seed', None, False), #This is a BRT specific port
+                         'TreeComplexity':('tc', None, False), #This is a BRT specific port
+                         'NumberOfTrees':('nf', None, False), #This is a BRT specific port
+                         'BagFraction':('bf', None, False), #This is a BRT specific port
+                         'NumberOfFolds':('nf', None, False), #This is a BRT specific port
+                         'Alpha':('alp', None, False), #This is a BRT specific port
+                         'PrevalenceStratify':('ps', None, False), #This is a BRT specific port
+                         'ToleranceMethod':('tolm', None, False), #This is a BRT specific port
+                         'Tolerance':('tol', None, False) #This is a BRT specific port
+                         }
+   
+class MDSBuilder(Module):
+    '''
+    MDS Builder
+
+    The Merged Data Set (MDS) Builder module is a utility that extracts the values of each predictor
+    layer to the point locations included in the field data set. The module produces a .csv file that
+    contains the x and y locations of the sample points and a column indicating whether each point
+    represents a presence recording, an absence recording, a presence count, or a background point.
+    Following these first three columns, each environmental predictor layer is appended as a column
+    with row entries representing the value present in the raster layer at each field sample point.
+    There are a total of three header rows in the output .csv of the MDSBuilder. The first row contains
+    the columns "x," "y," "ResponseBinary" or "ResponseCount," and the names of each of the raster
+    predictor files that were passed to the MDS Builder. The second row contains a binary value
+    indicating whether the column should be included when the model is finally applied; these values
+    are later modified during the Covariate Correlation and Selection process that takes place downstream
+    in the workflow. The final header row contains the full path on the file system to each of the raster
+    predictor files.
+
+    The MDSBuilder accepts four inputs from the user:
+
+    1. Rasters with PARC Info .csv File: The raster layers listed in this file will have their values
+    extracted to the points in the field data .csv file. This parameter should be supplied by connecting
+    the output of a PARC module within the workflow to the MDSBuilder module. (In order to properly
+    extract the values of each predictor layer to the field data points, all the layers must have matching
+    coordinate systems and cell sizes; outputs from the PARC module will have had the prerequisite processing).
+    
+    2. Background Point Count: This is an optional value that applies only to workflows that employ the
+    Maxent modeling package. The dialogue box provides the option of specifying a number of background points
+    to be randomly scattered throughout the study area (the extent of the template layer) to capture a more
+    complete sample of the range of values present for each predictor layer. These points will be added to
+    the field data .csv file with a value of "-999" denoting them as background points.
+    
+    3. Background Probability Surface: This is an optional parameter that applies only to workflows that
+    employ the Maxent modeling package. In some analyses, it may be appropriate to spatially limit background
+    points to a particular subset of the study area (e.g., islands within a study area polygon, particular
+    regions within a study area polygon, or a region determined by the known bias present in the field data).
+    Specifying a background probability surface raster allows a user to control where random points will be
+    scattered within the extent of the study area. The raster layer specified by a user should have the same
+    projection and extent as the template layer and contain values ranging from 0 to 100. These values represent
+    the probability that a randomly generated point will be retained should it fall within a particular cell.
+    That is, randomly generated points will not be generated in any part of the probability grid with a value
+    of "0" while all points falling in an area with a value of "100" will be retained. A point falling in an
+    area with a value of "50" will be kept as a background point 50% of the time.
+    
+    4. Field Data: The field data input corresponds to a .csv file containing presence/absence points or count
+    data recorded across a landscape for the phenomenon being modeled (e.g., plant sightings, evidence of
+    animal presence, etc.). This input file must be in a particular format, and in most cases, a user should
+    populate this field by connecting a FieldData element to the MDSBuilder in the visual display within VisTrails.
+    Please see the documention for the FieldData module for more details.
+
+    '''
+
+#    _input_ports = expand_ports([('RastersWithPARCInfoCSV', '(gov.usgs.sahm:RastersWithPARCInfoCSV:Other)'),
+#                                 ('fieldData', '(gov.usgs.sahm:FieldData:DataInput)'),
+#                                 ('backgroundPointCount', '(edu.utah.sci.vistrails.basic:Integer)'),
+#                                 ('backgroundProbSurf', '(edu.utah.sci.vistrails.basic:File)')]
+#                                 )
+#    _input_ports = expand_ports([('RastersWithPARCInfoCSV', '(edu.utah.sci.vistrails.persistence:PersistentFile)'),
+#                                 ('fieldData', '(gov.usgs.sahm:FieldData:DataInput)'),
+#                                 ('backgroundPointCount', '(edu.utah.sci.vistrails.basic:Integer)'),
+#                                 ('backgroundProbSurf', '(edu.utah.sci.vistrails.basic:File)')]
+#                                 )
+    _input_ports = expand_ports([('RastersWithPARCInfoCSV', '(edu.utah.sci.vistrails.basic:File)'),
+                                 ('fieldData', '(gov.usgs.sahm:FieldData:DataInput)'),
+                                 ('backgroundPointCount', '(edu.utah.sci.vistrails.basic:Integer)'),
+                                 ('backgroundProbSurf', '(edu.utah.sci.vistrails.basic:File)')]
+                                 )
+    
+    _output_ports = expand_ports([('mdsFile', '(gov.usgs.sahm:MergedDataSet:Other)')])
+
+    def compute(self):
+        port_map = {'fieldData': ('fieldData', None, True),
+                    'backgroundPointCount': ('pointcount', None, False),
+                    'backgroundProbSurf': ('probsurf', None, False),}
+        
+        MDSParams = utils.map_ports(self, port_map)            
+        MDSParams['outputMDS'] = utils.mknextfile(prefix='MergedDataset_', suffix='.csv')
+        
+        #allow multiple CSV of inputs to be provided.  
+        #if more than one then combine into a single CSV before sending to MDSBuilder
+        inputs_csvs = self.forceGetInputListFromPort('RastersWithPARCInfoCSV')
+        if len(inputs_csvs) == 0:
+            raise ModuleError(self, "Must supply at least one 'RastersWithPARCInfoCSV'/nThis is the output from the PARC module")
+        if len(inputs_csvs) > 1:
+            inputs_csv = utils.mknextfile(prefix='CombinedPARCFiles_', suffix='.csv')
+            inputs_names = [f.name for f in inputs_csvs]
+            utils.merge_inputs_csvs(inputs_names, inputs_csv)
+        else:
+            inputs_csv = inputs_csvs[0].name
+        MDSParams['inputsCSV'] = inputs_csv
+        
+        #inputsCSV = utils.path_port(self, 'RastersWithPARCInfoCSV')
+        
+        ourMDSBuilder = MDSB.MDSBuilder()
+        utils.PySAHM_instance_params(ourMDSBuilder, MDSParams)
+
+        writetolog("    inputsCSV=" + ourMDSBuilder.inputsCSV, False, False)
+        writetolog("    fieldData=" + ourMDSBuilder.fieldData, False, False)
+        writetolog("    outputMDS=" + ourMDSBuilder.outputMDS, False, False)
+        
+        try:
+            ourMDSBuilder.run()
+        except TrappedError as e:
+            raise ModuleError(self, e.message)
+        except:
+            utils.informative_untrapped_error(self, "MDSBuilder")
+
+        output_file = utils.create_file_module(ourMDSBuilder.outputMDS)
+        
+        self.setResult('mdsFile', output_file)
+
+class FieldDataAggregateAndWeight(Module):
+    '''
+    Documentation to be updated when module finalized.
+    '''
+    _input_ports = expand_ports([('templateLayer', '(gov.usgs.sahm:TemplateLayer:DataInput)'),
+                                 ('fieldData', '(gov.usgs.sahm:FieldData:DataInput)'),
+                                 ('aggregateRows', 'basic:Boolean'),
+                                 ('aggregateRowsByYear', 'basic:Boolean')])
+    _output_ports = expand_ports([('fieldData', '(gov.usgs.sahm:FieldData:DataInput)')])
+    
+    def compute(self):
+        writetolog("\nRunning FieldDataQuery", True)
+        port_map = {'templateLayer': ('template', None, True),
+            'fieldData': ('csv', None, True),
+            'aggregateRowsByYear': ('aggRows', None, False),
+            'addKDE': ('addKDE', None, False),}
+        
+        KDEParams = utils.map_ports(self, port_map)
+        output_fname = utils.mknextfile(prefix='FDQ_', suffix='.csv')
+        writetolog("    output_fname=" + output_fname, True, False)
+        KDEParams['output'] = output_fname
+        
+        output_fname = utils.mknextfile(prefix='FDQ_', suffix='.csv')
+        writetolog("    output_fname=" + output_fname, True, False)
+        
+        ourFDQ = FDQ.FieldDataQuery()
+        utils.PySAHM_instance_params(ourFDQ, KDEParams)
+            
+        ourFDQ.processCSV()
+        
+        output_file = utils.create_file_module(output_fname)
+        writetolog("Finished running FieldDataQuery", True)
+        self.setResult('fieldData', output_file)
+
+class PARC(Module):
+    '''
+    PARC
+
+    The Projection, Aggregation, Resampling, and Clipping (PARC) module is a powerful
+    utility that automates the preparation steps required for using raster layers in
+    most geospatial modeling packages. In order to successfully consider multiple
+    environmental predictors in raster format, each layer must have coincident cells
+    (pixels) of the same size, have the same coordinate system (and projection, if
+    applicable), and the same geographic extent. The PARC module ensures that all of
+    these conditions are met for the input layers by transforming and or reprojecting
+    each raster to match the coordinate system of the template layer. This process
+    usually involves aggregation (necessary when an input raster layer must be up-scaled
+    to match the template layer-- e.g., generalizing a 10 m input layer to a 100 m output
+    layer), and or resampling (necessary for interpolating new cell values when transforming
+    the raster layer to the coordinate space or cell size of the template layer). Lastly,
+    each raster predictor layer is clipped to match the extent of the template layer.
+
+    The settings used during these processing steps follow a particular set of decision rules
+    designed to preserve the integrity of data as much as possible. However, it is important
+    for a user to understand how these processing steps may modify the data inputs. For
+    additional information about the PARC module, please see the extended help and
+    documentation for the SAHM package. 
+
+    The PARC module accepts four kinds of inputs: 
+
+    1. Predictor List: A user should not have to populate this field. This field is populated
+    when a selection is made from the pre-loaded .csv file of raster predictor layer inputs
+    (specified during the SAHM install) and connected to the PARC module in the visual display. 
+    
+    2. .csv File List: The .csv file list corresponds to the Predictor List File element and
+    allows a user to load a .csv file containing a list of rasters for consideration in the
+    modeled analysis. For additional information, please see the documentation for the Predictor
+    List File element.
+    
+    3. Predictor:  The predictor input allows a user to select a single raster predictor layer
+    to be considered in the analysis. It is recommended that a user add this input as a separate
+    element in the visual display (and then link it to the PARC module) so that the aggregation
+    and resampling settings can be established. The PARC module can accept multiple predictor
+    elements. For additional information, please see the documentation for the Predictor element.
+    
+    4. Template Layer: The template layer is a raster data layer with a defined coordinate system,
+    a known cell size, and an extent that defines the study area. This raster layer serves as the
+    template for all the other inputs in the analysis. All additional raster layers used in the
+    analysis will be resampled and reprojected as needed to match the template, snapped to the
+    template, and clipped to have an extent that matches the template. Users should ensure that
+    any additional layers considered in the analysis have coverage within the extent of the
+    template layer. The template layer is a required input for the PARC module.
+
+    '''
+
+    #configuration = []
+    _input_ports = [('predictor', "(gov.usgs.sahm:Predictor:DataInput)"),
+                                ('PredictorList', '(gov.usgs.sahm:PredictorList:Other)'),
+                                ('RastersWithPARCInfoCSV', '(gov.usgs.sahm:RastersWithPARCInfoCSV:Other)'),
+                                ('templateLayer', '(gov.usgs.sahm:TemplateLayer:DataInput)'),
+                                ('multipleCores', '(edu.utah.sci.vistrails.basic:Boolean)', {'defaults':str(['True']), 'optional':True})]
+
+#    _output_ports = [('RastersWithPARCInfoCSV', '(gov.usgs.sahm:RastersWithPARCInfoCSV:Other)')]
+#    _output_ports = [('RastersWithPARCInfoCSV', '(edu.utah.sci.vistrails.persistence:PersistentFile)')]
+    _output_ports = [('RastersWithPARCInfoCSV', '(edu.utah.sci.vistrails.basic:File)')]
+    
+    def compute(self):
+        #writetolog("\nRunning PARC", True)
+        
+        ourPARC = parc.PARC()
+        output_dname = utils.mknextdir(prefix='PARC_')
+        
+        if configuration.verbose:
+            ourPARC.verbose = True
+        ourPARC.logger = utils.getLogger()
+        
+        ourPARC.out_dir = output_dname
+
+        if self.hasInputFromPort("multipleCores"):
+             if self.getInputFromPort("multipleCores"):
+                ourPARC.multicores = "True"
+
+        workingCSV = utils.mknextfile(prefix='tmpFilesToPARC_', suffix='.csv')
+        outputCSV = utils.mknextfile(prefix='PARCOutput_', suffix='.csv')
+
+        #append additional inputs to the existing CSV if one was supplied
+        #otherwise start a new CSV
+        if self.hasInputFromPort("RastersWithPARCInfoCSV"):
+            inputCSV = self.forceGetInputFromPort("RastersWithPARCInfoCSV").name
+            shutil.copy(inputCSV, workingCSV)
+            f = open(workingCSV, "ab")
+            csvWriter = csv.writer(f)
+        else:
+            f = open(workingCSV, "wb")
+            csvWriter = csv.writer(f)
+            csvWriter.writerow(["FilePath", "Categorical", "Resampling", "Aggregation"])
+        
+        if self.hasInputFromPort("PredictorList"):
+            predictor_lists = self.forceGetInputListFromPort('PredictorList')
+            for predictor_list in predictor_lists:
+                for predictor in predictor_list:
+                    csvWriter.writerow(list(predictor))
+        
+        if self.hasInputFromPort("predictor"):
+            predictor_list = self.forceGetInputListFromPort('predictor')
+            for predictor in predictor_list:
+                csvWriter.writerow(list(predictor))
+        f.close()
+        del csvWriter
+        ourPARC.inputs_CSV = workingCSV
+        ourPARC.template = self.forceGetInputFromPort('templateLayer').name
+        writetolog('    template layer = ' + self.forceGetInputFromPort('templateLayer').name)
+        writetolog("    output_dname=" + output_dname, False, False)
+        writetolog("    workingCSV=" + workingCSV, False, False)
+        try:
+            ourPARC.parcFiles()
+        except TrappedError as e:
+            writetolog(e.message)
+            raise ModuleError(self, e.message)
+        except:
+            utils.informative_untrapped_error(self, "PARC")        
+        
+        #delete our temp working file
+        os.remove(workingCSV)
+        
+        predictorsDir = utils.create_dir_module(output_dname)
+        outputCSV = os.path.join(output_dname, "PARC_Files.csv")
+        output_file = utils.create_file_module(outputCSV)
+        
+        
+        writetolog("Finished running PARC", True)
+        self.setResult('RastersWithPARCInfoCSV', output_file)
+        
+
+class RasterFormatConverter(Module):
+    '''
+    Raster Format Converter
+
+    The RasterFormatConverter module allows a user to easily convert .tif raster layers
+    into a different raster format for use and display in other software packages. The
+    module accepts as an input either a list of rasters in a Merged Dataset File (MDS)
+    or the location of a directory containing multiple raster files. All outputs will be
+    sent to a folder named "ConvertedRasters" (followed by an underscore and a number
+    corresponding to the run sequence of the module) within the user's current VisTrail
+    session folder.
+
+    Three parameters can be specified by the user:
+
+    1. Format: The format corresponds to the desired raster output format. The following
+    output file formats are supported: Arc/Info ASCII Grid, ESRI BIL, ERDAS Imagine, and JPEG.
+    
+    To specify the desired output, users should enter the values shown below.
+    For an ASCII (.asc) output, enter: "asc"
+    For an ESRI BIL output, enter: "bil"
+    For an Erdas Imagine (.img) output, enter: "img"
+    For a JPEG (.jpg) output, enter: "jpg"
+    
+    If no value is entered by the user, the module will default to an ASCII (.asc) output
+    format.
+
+    2. Input Directory: The input directory allows a user to point to an entire folder as
+    an input to the RasterFormatConverter. The contents of the specified folder will be
+    checked for raster files and all the raster files contained within the directory will
+    be converted to the format specified in the "Format" dialogue box. The module will
+    identify and convert files of the following raster types: .bil, .img, .tif, .jpg, and .asc. 
+
+    3. Input Merged Dataset (MDS): The input merged dataset allows a user to specify a .csv
+    file created in the VisTrails workflow (containing a list of .tif raster files) as an
+    input to the raster converter. All of the files listed in the MDS will be converted to
+    the raster format specified in the "Format" dialogue box.
+
+    '''
+
+    #configuration = []
+    _input_ports = [("inputMDS", "(gov.usgs.sahm:MergedDataSet:Other)"),
+                    ('inputDir', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('format', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('multipleCores', '(edu.utah.sci.vistrails.basic:Boolean)', {'defaults':str(['True']), 'optional':True})]
+
+    _output_ports = [('outputDir', '(edu.utah.sci.vistrails.basic:Directory)')]
+
+    def compute(self):
+        writetolog("\nRunning TiffConverter", True)
+        ourRFC = RFC.FormatConverter()
+        if self.hasInputFromPort('inputMDS'):
+            ourRFC.MDSFile = self.forceGetInputFromPort('inputMDS').name
+        elif self.hasInputFromPort('inputDir'):
+            ourRFC.inputDir = self.forceGetInputFromPort('inputDir').name
+            
+        if self.hasInputFromPort('format'):
+            format = self.forceGetInputFromPort('format')
+            if format == '':
+                format = 'asc'
+            ourRFC.format = format
+             
+        if self.hasInputFromPort("multipleCores"):
+             if self.getInputFromPort("multipleCores"):
+                ourRFC.multicores = "True"
+        
+        ourRFC.outputDir = utils.mknextdir(prefix='ConvertedRasters_')
+        if configuration.verbose:
+            ourRFC.verbose = True
+        ourRFC.logger = utils.getLogger()
+        writetolog("    output directory = " + ourRFC.outputDir, False, False)
+        
+        try:
+            ourRFC.run()
+        except TrappedError as e:
+            raise ModuleError(self, e.message)
+        except:
+            utils.informative_untrapped_error(self, "RasterFormatConverter") 
+        
+        
+        outputDir = utils.create_dir_module(ourRFC.outputDir)
+        self.setResult('outputDir', outputDir)
+        writetolog("\nFinished running TiffConverter", True)
+        
+class TestTrainingSplit(Module):
+    '''
+    Test Training Split
+
+    The TestTrainingSplit module provides the opportunity to establish specific settings
+    for how field data will be used in the modeling process. Three parameters can be set
+    by the user:
+
+    1. Ratio of Presence/Absence Points:
+    This field is populated with a number corresponding to the desired proportion of
+    presence and absence points to be used in the analysis. If populated, this entry should
+    be a number greater than zero. (A value of '1' will result in an equal number of both
+    presence and absence points being used, a value of '2' indicates that twice as many
+    presence points will be used, a value of 0.5 indicates that twice as many absence points
+    will be used, etc.). All field data points with a value equal to or greater than 1 are
+    interpreted as presence points. Although the original field data is unmodified, this
+    option will reduce the sample size as the merged dataset containing sample points will
+    have points deleted from it to achieve the specified ratio. A warning will be generated
+    if more than 50% of either the presence or absence points will be deleted based on the
+    ratio specified by the user. Background points are ignored by this module (they are read
+    in and written out, but not assigned to either the test or training split).
+
+    When left empty, this field will default to 'null' and the model will use the existing
+    presence/absence ratio present in the field data.
+
+    2. Input Merged Data Set (MDS): 
+    This is the input data set consisting of locational data for each sample point, the
+    values of each predictor variable at those points, and if established, a field denoting
+    the weight that will be assigned to each point in modeling. This input is usually provided
+    by the upstream steps that precede the Test Training Split module. Any value entered here
+    (e.g., specifying another existing MDS on the file system) will override the input
+    specified by a model connection in the visual display.
+
+    3. Training Proportion:
+    This is the proportion of the sample points that will be used to train the model, relative
+    to the total number of points. Entered values should be greater than 0 but less than 1.
+    For example, a value of '0.9' will result in 90% of the sample points being used to train
+    the model, with 10% of the sample being held out to test the model's performance. Choosing
+    an appropriate training proportion can depend on various factors, such as the total number
+    of sample points available.
+
+    '''
+
+    _input_ports = [("inputMDS", "(gov.usgs.sahm:MergedDataSet:Other)"),
+                    ('trainingProportion', '(edu.utah.sci.vistrails.basic:Float)', 
+                        {'defaults':str(['0.7'])}),
+                    ('RatioPresAbs', '(edu.utah.sci.vistrails.basic:Float)')]
+    _output_ports = [("outputMDS", "(gov.usgs.sahm:MergedDataSet:Other)")]
+    
+    def compute(self):
+        if self.hasInputFromPort('trainingProportion'):
+            print 'real input'
+        writetolog("\nGenerating Test Training split ", True)
+        inputMDS = utils.dir_path_value(self.forceGetInputFromPort('inputMDS', []))
+        outputMDS = utils.mknextfile(prefix='TestTrainingSplit_', suffix='.csv')
+
+        global models_path
+        
+        args = "i=" + '"' + inputMDS + '"' + " o=" + '"' + outputMDS + '"'
+        args += " rc=" + utils.MDSresponseCol(inputMDS) 
+        if (self.hasInputFromPort("trainingProportion")):
+            try:
+                trainingProportion = float(self.getInputFromPort("trainingProportion"))
+                if trainingProportion <= 0 or trainingProportion > 1:
+                    raise ModuleError(self, "Train Proportion (trainProp) must be a number between 0 and 1 excluding 0")
+                args += " p=" + str(trainingProportion)
+            except:
+                raise ModuleError(self, "Train Proportion (trainProp) must be a number between 0 and 1 excluding 0")
+        if (self.hasInputFromPort("RatioPresAbs")):
+            try:
+                RatioPresAbs = float(self.getInputFromPort("RatioPresAbs"))
+                if RatioPresAbs <= 0:
+                    raise ModuleError(self, "The ratio of presence to absence (RatioPresAbs) must be a number greater than 0") 
+                args += " m=" + str(trainingProportion) 
+            except:
+                raise ModuleError(self, "The ratio of presence to absence (RatioPresAbs) must be a number greater than 0") 
+        
+        utils.runRScript("TestTrainSplit.r", args, self)
+
+        output = os.path.join(outputMDS)
+        if os.path.exists(output):
+            output_file = utils.create_file_module(output)
+            writetolog("Finished Test Training split ", True)
+        else:
+            msg = "Problem encountered generating Test Training split.  Expected output file not found."
+            writetolog(msg, False)
+            raise ModuleError(self, msg)
+        self.setResult("outputMDS", output_file)
+        
+class CovariateCorrelationAndSelection(Module):
+    '''
+    Covariate Correlation And Selection
+
+    The CovariateCorrelationAndSelection view provides a breakpoint in the modeling workflow
+    for the user to assess how well each variable explains the distribution of the sampled
+    data points and to remove any variables that may exhibit high correlation with others. 
+
+    The display shows the 10 most correlated variables of those selected. These variables
+    are displayed on the diagonal and their respective graphical display and correlation with
+    other variables can be found by locating the row/column intersection between each (above
+    and below the diagonal). The column heading over each variable displays the number of
+    other variables with which the environmental predictor is correlated. The user defined
+    "Threshold" option allows a user to specify the degree of correlation required between
+    two variables for them to be counted in this tally.
+
+    A user is provided with the opportunity to select a new set of the environmental predictor
+    variables and "Update" the Covariate Correlation screen to investigate the relationships
+    among the new variables selected. The options are provided to include or exclude the
+    presence/count points, the absence points (when applicable), and the background points in
+    this correlation test. Variables with a high degree of correlation with other variables
+    should generally be unchecked in their respective radio buttons, and will be excluded from
+    subsequent analysis steps in the model workflow.
+
+    Multiple iterations can be run at this screen, allowing the user to investigate the
+    relationships among the environmental predictor variables and choose the most appropriate
+    set to be used in the subsequent modeling. When the desired set of variables has been chosen,
+    the "OK" button is selected and processing will resume in the VisTrails workflow.
+
+    '''
+    kwargs = {}
+    kwargs['defaults'] = str(['initial'])
+    _input_ports = [("inputMDS", "(gov.usgs.sahm:MergedDataSet:Other)"),
+                    ('selectionName', '(edu.utah.sci.vistrails.basic:String)', kwargs),
+                    ('ShowGUI', '(edu.utah.sci.vistrails.basic:Boolean)')]
+    _output_ports = [("outputMDS", "(gov.usgs.sahm:MergedDataSet:Other)")]
+
+    def compute(self):
+        writetolog("\nOpening Select Predictors Layers widget", True)
+        inputMDS = utils.dir_path_value(self.forceGetInputFromPort('inputMDS'))
+        selectionName = self.forceGetInputFromPort('selectionName', 'initial')
+#        outputMDS = utils.mknextfile(prefix='SelectPredictorsLayers_' + selectionName + "_", suffix='.csv')
+#        displayJPEG = utils.mknextfile(prefix='PredictorCorrelation_' + selectionName + "_", suffix='.jpg')
+        global session_dir
+        outputMDS = os.path.join(session_dir, "CovariateCorrelationOutputMDS_" + selectionName + ".csv")
+        displayJPEG = os.path.join(session_dir, "CovariateCorrelationDisplay.jpg")
+        writetolog("    inputMDS = " + inputMDS, False, False)
+        writetolog("    displayJPEG = " + displayJPEG, False, False)
+        writetolog("    outputMDS = " + outputMDS, False, False)
+        
+        if os.path.exists(outputMDS):
+            utils.applyMDS_selection(outputMDS, inputMDS)
+            os.remove(outputMDS)
+        
+        self.callDisplayMDS(inputMDS, outputMDS, displayJPEG)
+
+        output_file = utils.create_file_module(outputMDS)
+        writetolog("Finished Select Predictors Layers widget", True)
+        self.setResult("outputMDS", output_file)
+
+    def callDisplayMDS(self, inputMDS, outputMDS, displayJPEG):
+        dialog = SelectListDialog(inputMDS, outputMDS, displayJPEG, configuration.r_path)
+        #dialog.setWindowFlags(QtCore.Qt.WindowMaximizeButtonHint)
+#        print " ... finished with dialog "  
+        retVal = dialog.exec_()
+        #outputPredictorList = dialog.outputList
+        if retVal == 1:
+            raise ModuleError(self, "Cancel or Close selected (not OK) workflow halted.")
+
+
+class ProjectionLayers(Module):
+    '''
+    Projection Layers
+
+    Note: as of June 2011, this module offers some functionality that is only available
+    to users running the SAHM package within the USGS Fort Collins Science Center (FORT).
+
+    The ProjectionLayers module provides the option to prepare a separate set of predictor
+    layers so that the results of a model developed from one set of environmental predictors
+    can be projected onto a new modeled space. This second set of environmental predictors
+    (corresponding to the "projection target") most often contains the same environmental
+    predictors but represents data captured at a different temporal or spatial location. For
+    example, a user could generate a model predicting habitat suitability using recorded
+    presence points and certain environmental predictors such as elevation, landcover, and
+    proximity to water in one geographic location. Based on the training from this information,
+    the modeled results could be generated for (or "projected to") a new location based on the
+    range of values seen in elevation, landcover, and proximity to water in the second geographic
+    area. Similarly, modeling predicted results through time is also possible. A model trained
+    using field data and a set of predictor layers representative of one time period could be
+    projected onto the same geographical area using a new set of predictor layers corresponding
+    to the same predictors but representing data from a different time period (e.g., different
+    climate data). 
+
+    The output of this module is subsequently used as the projection target in the ApplyModel module.
+
+    (As part of the process of preparing the layers for modeling, the ProjectionLayers module runs
+    the PARC module internally on the inputs. Outputs from the ProjectionLayers module will possess
+    matching coordinate systems, cell sizes, and extents and do not need to be run through PARC
+    before being used downstream in the workflow.)
+
+    Six parameters can be set by the user:
+
+    1. Directory Crosswalk CSV: This is a .csv file containing two columns designating
+    the layers that should be swapped out in the projected model. The first column
+    contains a list of the full paths to the predictor layers used to develop the original
+    model that will be replaced in the projection process. The second column contains the
+    full paths to the new predictor layers that will substitute the respective layers used
+    in the original model. Each original layer in the first column should be paired with
+    its replacement in the second column (e.g., Column 1 = C:\ModelLayers\Precipitation1980.tif,
+    Column 2 = C:\ModelLayers\Precipitation2000.tif). In the case of any file used to develop
+    the first model that is not expressly listed in the Directory Crosswalk CSV with a
+    replacement, the original file will be used in the new model projection. The module
+    anticipates a header row in this .csv file (thus, the first row of data will be ignored).
+    
+    2. File List CSV: This is a .csv file containing the list of predictor files used to
+    develop the first model. Effectively, this file will be updated based on the information
+    provided in the directory crosswalk .csv and used as the input to the training process
+    for the projected model. The output of the PARC module from the first model iteration
+    should be used as the input to this parameter.
+    
+    3. Model (available only to users at the FORT): This parameter allows VisTrail users
+    running the SAHM package on site at the USGS Science Center in Fort Collins (FORT) to
+    specify one of three models to use for the projected model run ("CCCMA," "CSIRO,"
+    or "hadcm3").
+    
+    4. Scenario (available only to users at the FORT): This parameter allows VisTrail
+    users running the SAHM package on site at the USGS Science Center in Fort Collins 
+    FORT) to specify one of two scenarios for the projected model run ("A2a" or "B2b"). 
+    
+    5. Template: This parameter allows a user to specify the new template layer to be used
+    in the projected model run. The template layer is a raster data layer with a defined
+    coordinate system, a known cell size, and an extent that defines the (new) study area.
+    This raster layer serves as the template for all the other inputs in the analysis. All
+    additional raster layers used in the analysis will be resampled and reprojected as
+    needed to match the template, snapped to the template, and clipped to have an extent
+    that matches the template. Users should ensure that all the layers used for the projected
+    analysis have coverage within the extent of the template layer.
+    
+    6. Year (available only to users at the FORT): This parameter allows VisTrail users
+    running the SAHM package on site at the USGS Science Center in Fort Collins (FORT)
+    to specify one of three years to use for the projected model run ("2020," "2050," or "2080").
+
+    '''
+    _input_ports = [('RastersWithPARCInfoCSV', '(gov.usgs.sahm:RastersWithPARCInfoCSV:Other)'),
+                    ('templateLayer', '(gov.usgs.sahm:TemplateLayer:DataInput)'),
+                    ('model', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('scenario', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('year', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('directoryCrosswalkCSV', '(edu.utah.sci.vistrails.basic:File)')
+                    ]
+    _output_ports = [("MDS", "(gov.usgs.sahm:MergedDataSet:Other)")]
+
+    def compute(self):
+        models = ['CCCMA', 'CSIRO', 'hadcm3']
+        scenarioss = ['A2a', 'B2b']
+        years = ['2020', '2050', '2080']
+        
+        writetolog("\nRunning make Projection Layers", True)
+        
+        inputCSV = self.forceGetInputFromPort('RastersWithPARCInfoCSV').name
+    
+        if self.hasInputFromPort('templateLayer'):
+            template = self.forceGetInputFromPort('templateLayer').name
+        else:
+            template = '' #we'll get a template below
+            
+        fromto = []
+        climargs = {}
+        
+        for input in ['model', 'scenario', 'year']:
+            if self.hasInputFromPort(input):
+                climargs[input] = self.forceGetInputFromPort(input)
+        if climargs <> {} and climargs.keys() <> ['model', 'scenario', 'year']:
+            #they did not add in one of each, Not going to fly
+            raise ModuleError(self, "All of model, scenario, and year must be supplied if any are used.")
+        elif climargs <> {} and climargs.keys <> ['model', 'scenario', 'year']:
+            #they specified a alt climate scenario add this to our list to search for
+            fromto.append([r'K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio',
+                           os.path.join('I:\WorldClim_Future_Climate\RenamedBILs', 
+                                        climargs['model'], climargs['scenario'], climargs['year'])])
+        
+        if self.hasInputFromPort('directoryCrosswalkCSV'):
+            crosswalkCSV = csv.reader(open(self.forceGetInputFromPort('directoryCrosswalkCSV'), 'r'))
+            header = crosswalkCSV
+            for row in crosswalkCSV:
+                fromto.append(row[0], row[1])
+            del crosswalkCSV    
+            
+        #write out the outputs to an empty MDS file (just the header is needed to PARC the outputs)
+            
+        
+        inCSV = csv.reader(open(inputCSV, 'r'))
+        inCSV.next() #skip header
+        workingCSV = utils.mknextfile(prefix='tmpFilesToPARC_', suffix='.csv')
+        tmpCSV = csv.writer(open(workingCSV, 'wb'))
+        tmpCSV.writerow(["FilePath", "Categorical", "Resampling", "Aggregation"])
+        outHeader1 = ['x', 'y', 'response']
+        outHeader2 = ['', '', '']
+        outHeader3 = ['', '', '']
+        
+        output_dname = utils.mknextdir(prefix='ProjectionLayers_')
+        
+        for row in inCSV:
+            if template == '':
+                template = row[0]
+            fileShortName = utils.getShortName(row[0])
+            if row[1] == 1:
+                outHeader1.append(fileShortName + '_categorical')
+            else:
+                outHeader1.append(fileShortName)
+            outHeader2.append('1')
+            outHeader3.append(os.path.join(output_dname, fileShortName + '.tif'))
+
+            origFile = row[4]
+            newOrigFile = origFile
+            for lookup in fromto:
+               if lookup[0] in origFile:
+                   newOrigFile = origFile.replace(lookup[0], lookup[1])
+            tmpCSV.writerow([newOrigFile,] + row[1:4])
+        del tmpCSV
+        
+        #PARC the files here
+        ourPARC = parc.PARC()
+        
+        
+        if configuration.verbose:
+            ourPARC.verbose = True
+        writetolog("    output_dname=" + output_dname, False, False)
+        ourPARC.outDir = output_dname
+        ourPARC.inputsCSV = workingCSV
+        ourPARC.template = template
+
+        try:
+            ourPARC.parcFiles()
+        except TrappedError as e:
+            raise ModuleError(self, e.message)
+        except :
+            utils.informative_untrapped_error(self, "PARC")
+        
+        #loop through our workingCSV and format it into an MDS header
+        
+        #outputMDS = utils.mknextfile(prefix='ProjectionLayersMDS_', suffix = '.csv')
+        outputMDS = os.path.join(output_dname, 'ProjectionLayersMDS.csv')
+        outCSV = csv.writer(open(outputMDS, 'wb'))
+        outCSV.writerow(outHeader1)
+        outCSV.writerow(outHeader2)
+        outCSV.writerow(outHeader3)
+        
+        output_file = utils.create_file_module(outputMDS)
+        self.setResult("MDS", output_file)
+        writetolog("Finished Select Projection Layers widget", True)
+
+#class ClimateModel(String):
+#    _input_ports = [('value', '(gov.usgs.sahm:ClimateModel:Other)')]
+#    _output_ports = [('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+#    _widget_class = build_enum_widget('ClimateModel', 
+#                                      ['CCCMA', 'CSIRO', 'hadcm3'])
+#
+#    @staticmethod
+#    def get_widget_class():
+#        return ClimateModel._widget_class
+#
+#class ClimateScenario(String):
+#    _input_ports = [('value', '(gov.usgs.sahm:ClimateScenario:Other)')]
+#    _output_ports = [('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+#    _widget_class = build_enum_widget('ClimateScenario', 
+#                                      ['A2a', 'B2b'])
+#
+#    @staticmethod
+#    def get_widget_class():
+#        return ClimateScenario._widget_class
+#
+#class ClimateYear(String):
+#    _input_ports = [('value', '(gov.usgs.sahm:ClimateYear:Other)')]
+#    _output_ports = [('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True)]
+#    _widget_class = build_enum_widget('ClimateYear', 
+#                                      ['2020', '2050', '2080'])
+#
+#    @staticmethod
+#    def get_widget_class():
+#        return ClimateYear._widget_class
+
+class MAXENT(Module):
+
+    _output_ports = [("lambdas", "(edu.utah.sci.vistrails.basic:File)"),
+                     ("report", "(edu.utah.sci.vistrails.basic:File)"),
+                     ("roc", "(edu.utah.sci.vistrails.basic:File)")]
+
+    def compute(self):
+        global maxent_path
+
+        ourMaxent = MaxentRunner.MAXENTRunner()
+        ourMaxent.outputDir = utils.mknextdir(prefix='maxentFiles_')
+        
+        ourMaxent.inputMDS = self.forceGetInputFromPort('inputMDS').name
+        
+        ourMaxent.maxentpath = maxent_path
+        
+        MaxentArgsCSV = utils.mknextfile(prefix='MaxentArgs', suffix='.csv')
+        argWriter = csv.writer(open(MaxentArgsCSV, 'wb'))
+        argWriter.writerow(['parameter','value'])
+        for port in self._input_ports:
+            #print port
+            if port[0] <> 'inputMDS' and port[0] <> 'projectionlayers':
+                if self.hasInputFromPort(port[0]):
+                    port_val = self.getInputFromPort(port[0])
+                    if port[1] == "(edu.utah.sci.vistrails.basic:Boolean)":
+                        port_val = str(port_val).lower()
+                    elif (port[1] == "(edu.utah.sci.vistrails.basic:Path)" or \
+                        port[1] == "(edu.utah.sci.vistrails.basic:File)"):
+                        port_val = port_val.name
+                    argWriter.writerow([port[0], port_val])
+                else:
+                    #print "   has no input "
+                    kwargs = port[2]
+                    #print kwargs
+                    try:
+                        if port[1] == "(edu.utah.sci.vistrails.basic:Boolean)":
+                            default = kwargs['defaults'][2:-2].lower()
+                        else:
+                            default = kwargs['defaults'][2:-2]
+                        #args[port[0]] = default
+                        argWriter.writerow([port[0], default])
+                    except KeyError:
+                        pass
+        if self.hasInputFromPort('projectionlayers'):
+            value = self.forceGetInputListFromPort('projectionlayers')
+            projlayers = ','.join([path.name for path in value])
+            argWriter.writerow(['projectionlayers', projlayers])
+            
+        del argWriter
+        ourMaxent.argsCSV = MaxentArgsCSV
+        ourMaxent.logger = utils.getLogger()
+        try:
+            ourMaxent.run()
+        except TrappedError as e:
+            raise ModuleError(self, e.message)  
+        except:
+            utils.informative_untrapped_error(self, "Maxent")
+        
+         #set outputs
+        lambdasfile = os.path.join(ourMaxent.outputDir, ourMaxent.args["species_name"] + ".lambdas")
+        output_file = utils.create_file_module(lambdasfile)
+        self.setResult("lambdas", output_file)
+        
+        
+        rocfile = os.path.join(ourMaxent.outputDir, 'plots', ourMaxent.args["species_name"] + "_roc.png")
+        output_file = utils.create_file_module(rocfile)
+        self.setResult("roc", output_file)
+
+        htmlfile = os.path.join(ourMaxent.outputDir, ourMaxent.args["species_name"] + ".html")
+        print htmlfile
+        output_file = utils.create_file_module(htmlfile)
+        self.setResult("report", output_file)
+
+        writetolog("Finished Maxent widget", True)
+        
+def load_max_ent_params():    
+    maxent_fname = os.path.join(os.path.dirname(__file__), 'maxent.csv')
+    csv_reader = csv.reader(open(maxent_fname, 'rU'))
+    # pass on header
+    csv_reader.next()
+    input_ports = []
+    
+    input_ports.append(('inputMDS', '(gov.usgs.sahm:MergedDataSet:Other)'))
+    
+    docs = {}
+    basic_pkg = 'edu.utah.sci.vistrails.basic'
+    p_type_map = {'file/directory': 'Path',
+                  'double': 'Float'}
+    for row in csv_reader:
+        [name, flag, p_type, default, doc, notes] = row
+        name = name.strip()
+        p_type = p_type.strip()
+        if p_type in p_type_map:
+            p_type = p_type_map[str(p_type)]
+        else:
+            p_type = str(p_type).capitalize()
+        kwargs = {}
+        default = default.strip()
+        if default:
+            if p_type == 'Boolean':
+                default = default.capitalize()
+            kwargs['defaults'] = str([default])
+        if p_type == 'Boolean':
+            kwargs['optional'] = True
+        input_ports.append((name, '(' + basic_pkg + ':' + p_type + ')', kwargs))
+        # FIXME set documentation
+        #print 'port:', (name, '(' + basic_pkg + ':' + p_type + ')', kwargs)
+        docs[name] = doc
+
+
+    #print 'MAXENT:', input_ports
+    MAXENT._input_ports = input_ports
+    MAXENT._port_docs = docs
+
+    def provide_input_port_documentation(cls, port_name):
+        return cls._port_docs[port_name]
+    MAXENT.provide_input_port_documentation = \
+        classmethod(provide_input_port_documentation)
+
+
+#class ModelOutputCell(SpreadsheetCell):
+#    _input_ports = [("row", "(edu.utah.sci.vistrails.basic:Integer)"),
+#                    ("column", "(edu.utah.sci.vistrails.basic:Integer)"),
+#                    ('ProbabilityMap', '(edu.utah.sci.vistrails.basic:File)')]
+#    
+#    def __init__(self):
+#        SpreadsheetCell.__init__(self)
+#        self.cellWidget = None
+#
+#    def compute(self):
+#        renderView = self.forceGetInputFromPort('SetRenderView')
+#        if renderView==None:
+#            raise ModuleError(self, 'A vtkRenderView input is required.')
+#        self.cellWidget = self.displayAndWait(QVTKViewWidget, (renderView,))
+
+#class SAHMViewWidget(QCellWidget):
+#    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+#        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+#        
+
+#class RasterLayer(Module):
+#    _input_ports = [('file', '(edu.utah.sci.vistrails.basic:File)'), 
+#                    ('name', '(edu.utah.sci.vistrails.basic:String)')]
+#    _output_ports = [('self', '(gov.usgs.sahm:RasterLayer:DataInput)')]
+#
+#    def __init__(self):
+#        Module.__init__(self)
+#        self.qgis_obj = None
+#
+#    def compute(self):
+#        fname = self.getInputFromPort('file').name
+#        if self.hasInputFromPort('name'):
+#            name = self.getInputFromPort('name')
+#        else:
+#            name = os.path.splitext(os.path.basename(fname))[0]
+#        self.qgis_obj = qgis.core.QgsRasterLayer(fname, name)
+#        self.setResult('self', self)
+#
+#class VectorLayer(Module):
+#    _input_ports = [('file', '(edu.utah.sci.vistrails.basic:File)'), 
+#                    ('name', '(edu.utah.sci.vistrails.basic:String)')]
+#    _output_ports = [('self', '(gov.usgs.sahm:VectorLayer:DataInput)')]
+#
+#    def __init__(self):
+#        Module.__init__(self)
+#        self.qgis_obj = None
+#
+#    def compute(self):
+#        fname = self.getInputFromPort('file').name
+#        if self.hasInputFromPort('name'):
+#            name = self.getInputFromPort('name')
+#        else:
+#            name = os.path.splitext(os.path.basename(fname))[0]
+#        self.qgis_obj = qgis.core.QgsVectorLayer(fname, name, "ogr")
+#        self.setResult('self', self)
+
+
+
+def initialize():    
+    global maxent_path, color_breaks_csv
+    global session_dir
+    utils.config = configuration
+       
+    r_path = os.path.abspath(configuration.r_path)
+    maxent_path = os.path.abspath(configuration.maxent_path)
+    
+    
+    #I was previously setting the following environmental variables and path additions 
+    #so that each user wouldn't have to do this on their individual machines.  
+    #I was running into problems with imports occuring before this initialize routine so 
+    #I moved the setting of these to an external .net application that sets these before 
+    #starting up VisTrails.py.
+    
+    #This should also make this package easier to port to other systems as this stuff would
+    #only work on a windows instance.
+    #the current dependencies are:
+    #an installation of GDAL and Proj.4
+    # this includes the GDAL_DATA and PROJ_LIB directories as environmental variables
+    #GDAL bindings for python in the python path.
+    #QGIS built for the version of Python, QT, PyQt, and SIP used by VisTrails.
+    #  This one was a painful bear on Windows.
+    #All of the DLLs required by the above QGIS build must be on the path.
+    #In my case these were in a folder in the OSGeoW installation that QGIS was built 
+    #off of.
+    #And finally QGIS bindings for python in the python path.
+    
+     
+    import qgis.core
+    import qgis.gui
+    globals()["qgis"] = qgis
+    setQGIS(qgis)
+    
+    qgis_prefix = os.path.join(configuration.qgis_path, "qgis1.7.0")
+    qgis.core.QgsApplication.setPrefixPath(qgis_prefix, True)
+    qgis.core.QgsApplication.initQgis() 
+    
+    
+    session_dir = utils.createrootdir(configuration.output_dir)
+    utils.createLogger(session_dir, configuration.output_dir)
+    #log_file = Utilities.createsessionlog(session_dir, configuration.verbose)
+    
+    color_breaks_csv = os.path.abspath(os.path.join(os.path.dirname(__file__),  "ColorBreaks.csv"))
+    
+    load_max_ent_params()
+    
+    global layers_csv_fname
+    
+    writetolog("*" * 79)
+    writetolog("Initializing:", True, True)
+    writetolog("  Locations of dependencies")
+#    writetolog("   Layers CSV = " + os.path.join(os.path.dirname(__file__), 'layers.csv'))
+    writetolog("   Layers CSV = " + layers_csv_fname)
+    writetolog("   R path = " + r_path)
+    writetolog("   GDAL folder = " + os.path.abspath(configuration.gdal_path))
+    writetolog("        Must contain subfolders proj, gdal-data, GDAL")
+    writetolog("   Maxent folder = " + maxent_path)
+    writetolog("   QGIS folder = " + os.path.abspath(configuration.qgis_path))
+    writetolog("        Must contain subfolders qgis1.7.0, OSGeo4W")
+    writetolog("    ")
+    writetolog("*" * 79)
+    
+    writetolog("*" * 79)
+    writetolog(" output directory:   " + session_dir)
+    writetolog("*" * 79)
+    writetolog("*" * 79)
+    
+def finalize():
+    pass
+    #utils.cleantemps()#No longer used  
+
+def generate_namespaces(modules):
+    module_list = []
+    for namespace, m_list in modules.iteritems():
+        for module in m_list:
+            m_dict = {'namespace': namespace}
+            if type(module) == tuple:
+                m_dict.update(module[1])
+                module_list.append((module[0], m_dict))
+                #print 'm_dict:', m_dict
+            else:
+                module_list.append((module, m_dict))
+    return module_list
+
+def build_available_trees():
+    trees = {}
+    global layers_csv_fname
+    layers_csv_fname = os.path.join(os.path.dirname(__file__), 'layers.csv')
+    csv_reader = csv.reader(open(layers_csv_fname, 'rU'))
+    csv_reader.next()
+    first_file = csv_reader.next()[0]
+    
+    #if the first file in the layers file does not exist assume that none
+    #of them do and use the exampledata version
+    if not os.path.exists(first_file):
+        print (("!" * 30) + " WARNING " + ("!" * 30) + "\n")*3
+        print "The first grid in your layers CSV could not be found."
+        print "Defaulting to the example data csv."
+        print "fix/set paths in file " + layers_csv_fname + " to enable this functionality."
+        print "See documentation for more information on setting up the layers.csv\n"
+        print (("!" * 30) + " WARNING " + ("!" * 30) + "\n")*3
+        layers_csv_fname = os.path.join(os.path.dirname(__file__), 'layers.exampledata.csv')
+    
+    csv_reader = csv.reader(open(layers_csv_fname, 'rU'))
+    # pass on header
+    csv_reader.next()
+    for row in csv_reader:
+        if row[2] not in trees:
+            trees[row[2]] = {}
+        available_dict = trees[row[2]]
+#        if 'Daymet' not in available_dict:
+#            available_dict['Daymet'] = []
+#        available_dict['Daymet'].append((row[0], row[1], row[3]))            
+        if row[3] not in available_dict:
+            available_dict[row[3]] = []
+        available_dict[row[3]].append((row[0], row[1], row[4]))
+       
+    return trees
+
+def build_predictor_modules():
+    available_trees = build_available_trees()
+    modules = []
+    for name, tree in available_trees.iteritems():
+        name_arr = name.strip().split()
+        class_base = ''.join(n.capitalize() for n in name_arr)
+        widget_class = get_predictor_widget(class_base, tree)
+        config_class = get_predictor_config(class_base, tree)
+        class_name = class_base + "Predictors"
+        def get_widget_method(w_class):
+            @staticmethod
+            def get_widget_class():
+                return w_class
+            return get_widget_class
+        module = type(class_name, (PredictorList,),
+                      {'get_widget_class': get_widget_method(widget_class),
+                       '_input_ports': \
+                           [('value',
+                             '(gov.usgs.sahm:%s:DataInput)' % class_name, True)]})
+        
+        modules.append((module, {'configureWidgetType': config_class}))
+        for module in modules:
+            module[0]._output_ports.append(('value_as_string', '(edu.utah.sci.vistrails.basic:String)', True))
+            
+    return modules
+
+
+ 
+
+_modules = generate_namespaces({'DataInput': [
+                                              Predictor,
+                                              PredictorListFile,
+                                              FieldData,
+                                              TemplateLayer] + \
+                                              build_predictor_modules(),
+                                'Tools': [FieldDataAggregateAndWeight,
+                                          MDSBuilder,
+                                          PARC,
+                                          RasterFormatConverter,
+                                          ProjectionLayers,
+                                          TestTrainingSplit,
+                                          CovariateCorrelationAndSelection,
+                                          ApplyModel],                                          
+                                'Models': [GLM,
+                                           RandomForest,
+                                           MARS,
+                                           MAXENT,
+                                           BoostedRegressionTree],
+                                'Other':  [(Model, {'abstract': True}),
+                                           (ResampleMethod, {'abstract': True}),
+                                           (AggregationMethod, {'abstract': True}),
+                                           (PredictorList, {'abstract': True}),
+                                           (MergedDataSet, {'abstract': True}),
+                                           (RastersWithPARCInfoCSV, {'abstract': True})],
+                                'Output': [SAHMModelOutputViewerCell,
+                                          SAHMSpatialOutputViewerCell,
+                                          ]
+#                                           ClimateModel,
+#                                           ClimateScenario,
+#                                           ClimateYear
+
+                                })
\ No newline at end of file
diff --git a/contrib/sahm/layers.csv b/contrib/sahm/layers.csv
new file mode 100644
index 0000000..dcf138b
--- /dev/null
+++ b/contrib/sahm/layers.csv
@@ -0,0 +1,820 @@
+FileName,LayerName,Group,Source,Categorical
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_1.tif,Annual mean temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_2.tif,Mean diurnal range,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_3.tif,Isothermality,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_4.tif,Temperature seasonality,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_5.tif,Max. temperature of warmest month,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_6.tif,Min. temperature of coldest month,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_7.tif,Temperature annual range,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_8.tif,Mean temperature of wettest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_9.tif,Mean temperature of driest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_10.tif,Mean temperature of warmest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_11.tif,Mean temperature of coldest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_12.tif,Annual precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_13.tif,Precipitation of wettest month,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_14.tif,Precipitation of driest month,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_15.tif,Precipitation seasonality,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_16.tif,Precipitation of wettest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_17.tif,Precipitation of driest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_18.tif,Precipitiation of warmest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\DerivedData\bio_19.tif,Precipitation of coldest quarter,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax1.tif,Average Jan. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax2.tif,Average Feb. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax3.tif,Average March Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax4.tif,Average April Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax5.tif,Average May Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax6.tif,Average June Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax7.tif,Average July Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax8.tif,Average Aug. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax9.tif,Average Sept. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax10.tif,Average Oct. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax11.tif,Average Nov. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMaxTemp\tmax12.tif,Average Dec. Max. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean1.tif,Average Jan. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean2.tif,Average Feb. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean3.tif,Average March Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean4.tif,Average April Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean5.tif,Average May Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean6.tif,Average June Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean7.tif,Average July Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean8.tif,Average Aug. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean9.tif,Average Sept. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean10.tif,Average Oct. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean11.tif,Average Nov. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMeanTemp\tmean12.tif,Average Dec. Mean Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin1.tif,Average Jan. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin2.tif,Average Feb. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin3.tif,Average March Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin4.tif,Average April Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin5.tif,Average May Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin6.tif,Average June Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin7.tif,Average July Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin8.tif,Average Aug. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin9.tif,Average Sept. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin10.tif,Average Oct. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin11.tif,Average Nov. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMinTemp\tmin12.tif,Average Dec. Min. Temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt1.tif,Average Jan. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt2.tif,Average Feb. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt3.tif,Average March Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt4.tif,Average April Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt5.tif,Average May Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt6.tif,Average June Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt7.tif,Average July Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt8.tif,Average Aug. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt9.tif,Average Sept. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt10.tif,Average Oct. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt11.tif,Average Nov. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\DAYMET\SourceData\AvgMonthlyMonthlyPrecip\ppt12.tif,Average Dec. Precipitation,Climate,"Daymet (1980-1997) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_1,Average Jan. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_2,Average Feb. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_3,Average March Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_4,Average April Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_5,Average May Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_6,Average June Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_7,Average July Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_8,Average Aug. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_9,Average Sept. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_10,Average Oct. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_11,Average Nov. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MaxTempAvg1950-2000\tmax_30s_esri\tmax\tmax_12,Average Dec. Max. Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_1,Average Jan. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_2,Average Feb. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_3,Average March Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_4,Average April Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_5,Average May Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_6,Average June Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_7,Average July Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_8,Average Aug. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_9,Average Sept. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_10,Average Oct. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_11,Average Nov. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MeanTempAvg1950-2000\tmean_30s_esri\tmean\tmean_12,Average Dec. Mean Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_1,Average Jan. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_2,Average Feb. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_3,Average March Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_4,Average April Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_5,Average May Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_6,Average June Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_7,Average July Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_8,Average Aug. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_9,Average Sept. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_10,Average Oct. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_11,Average Nov. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\MinTempAvg1950-2000\tmin_30s_esri\tmin\tmin_12,Average Dec. Min Temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_1,Average Jan. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_2,Average Feb. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_3,Average March Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_4,Average April Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_5,Average May Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_6,Average June Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_7,Average July Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_8,Average Aug. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_9,Average Sept. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_10,Average Oct. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_11,Average Nov. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\TotPrecipAvg1950-2000\prec_30s_esri\prec\prec_12,Average Dec. Precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_1,Annual mean temperature,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_2,Mean diurnal range,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_3,Isothermality,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_4,Temperature seasonality,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_5,Max. temperature of warmest month,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_6,Min. temperature of coldest month,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_7,Temperature annual range,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_8,Mean temperature of wettest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_9,Mean temperature of driest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_10,Mean temperature of warmest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_11,Mean temperature of coldest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_12,Annual precipitation,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_13,Precipitation of wettest month,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_14,Precipitation of driest month,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_15,Precipitation seasonality,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_16,Precipitation of wettest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_17,Precipitation of driest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_18,Precipitiation of warmest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\WorldClim\BioclimaticVariables\bio_30s_esri\bio\bio_19,Precipitation of coldest quarter,Climate,"WorldClim (1950-2000) Normals, 1km.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_01.img,Average Jan. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_02.img,Average Feb. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_03.img,Average March Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_04.img,Average April Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_05.img,Average May Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_06.img,Average June Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_07.img,Average July Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_08.img,Average Aug. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_09.img,Average Sept. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_10.img,Average Oct. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_11.img,Average Nov. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\ppt_1971_2000_12.img,Average Dec. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_01.img,Average Jan. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_02.img,Average Feb. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_03.img,Average March Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_04.img,Average April Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_05.img,Average May Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_06.img,Average June Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_07.img,Average July Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_08.img,Average Aug. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_09.img,Average Sept. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_10.img,Average Oct. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_11.img,Average Nov. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmax_1971_2000_12.img,Average Dec. Max. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_01.img,Average Jan. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_02.img,Average Feb. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_03.img,Average March Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_04.img,Average April Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_05.img,Average May Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_06.img,Average June Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_07.img,Average July Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_08.img,Average Aug. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_09.img,Average Sept. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_10.img,Average Oct. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_11.img,Average Nov. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\Input_1971_2000\tmin_1971_2000_12.img,Average Dec. Min. Temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_01_1971_2000.img,Annual mean temperature,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_02_1971_2000.img,Mean diurnal range,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_03_1971_2000.img,Isothermality,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_04_1971_2000.img,Temperature seasonality,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_05_1971_2000.img,Max. temperature of warmest month,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_06_1971_2000.img,Min. temperature of coldest month,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_07_1971_2000.img,Temperature annual range,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_08_1971_2000.img,Mean temperature of wettest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_09_1971_2000.img,Mean temperature of driest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_10_1971_2000.img,Mean temperature of warmest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_11_1971_2000.img,Mean temperature of coldest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_12_1971_2000.img,Annual precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_13_1971_2000.img,Precipitation of wettest month,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_14_1971_2000.img,Precipitation of driest month,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_15_1971_2000.img,Precipitation seasonality,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_16_1971_2000.img,Precipitation of wettest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_17_1971_2000.img,Precipitation of driest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_18_1971_2000.img,Precipitiation of warmest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Climate\PRISM\OregonStateUniversity_Normal_1971_2000_800m\BioClim_1971_2000\bio_19_1971_2000.img,Precipitation of coldest quarter,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+K:\GIS_LIBRARY\Veg_LandCover\MODIS\LatLon.NA.2001.bare.tif,VCF Bare Landcover,Remote Sensing,MODIS / GLCF North America (2001) .5 km,N
+K:\GIS_LIBRARY\Veg_LandCover\MODIS\LatLon.NA.2001.herbaceous.tif,VCF Herbaceous Landcover,Remote Sensing,MODIS / GLCF North America (2001) .5 km,N
+K:\GIS_LIBRARY\Veg_LandCover\MODIS\LatLon.NA.2001.tree.tif,VCF Tree Landcover,Remote Sensing,MODIS / GLCF North America (2001) .5 km,N
+K:\GIS_LIBRARY\Veg_LandCover\MODIS\LatLon.SA.2001.bare.tif,VCF Bare Landcover,Remote Sensing,MODIS / GLCF South America (2001) .5 km,N
+K:\GIS_LIBRARY\Veg_LandCover\MODIS\LatLon.SA.2001.herbaceous.tif,VCF Herbaceous Landcover,Remote Sensing,MODIS / GLCF South America (2001) .5 km,N
+K:\GIS_LIBRARY\Veg_LandCover\MODIS\LatLon.SA.2001.tree.tif,VCF Tree Landcover,Remote Sensing,MODIS / GLCF South America (2001) .5 km,N
+K:\GIS_LIBRARY\Elevation\EDNA\dem\dem,DEM,Elevation / Topography,"EDNA Continental US, 30 m.",N
+K:\GIS_LIBRARY\Elevation\EDNA\aspect\aspect,DEM Derivative: Aspect,Elevation / Topography,"EDNA Continental US, 30 m.",N
+K:\GIS_LIBRARY\Elevation\EDNA\slopedeg\slopedeg,DEM Derivative: Slope in Degrees,Elevation / Topography,"EDNA Continental US, 30 m.",N
+K:\GIS_LIBRARY\Elevation\EDNA\facc\facc,DEM Derivative: Flow Accumulation,Hydrology,"EDNA Continental US, 30 m.",N
+K:\GIS_LIBRARY\Elevation\EDNA\fdir\fdir,DEM Derivative: Flow Direction,Hydrology,"EDNA Continental US, 30 m.",N
+K:\GIS_LIBRARY\Elevation\EDNA\cti\cti,DEM Derivative: CTI/Steady State Wetness,Hydrology,"EDNA Continental US, 30 m.",N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2000.tif,amplitudes1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2001.tif,amplitudes1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2002.tif,amplitudes1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2003.tif,amplitudes1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2004.tif,amplitudes1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2005.tif,amplitudes1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2006.tif,amplitudes1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2007.tif,amplitudes1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2008.tif,amplitudes1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_2009.tif,amplitudes1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes1\NDVI_amplitudes1_Average.tif,amplitudes1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2000.tif,amplitudes2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2001.tif,amplitudes2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2002.tif,amplitudes2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2003.tif,amplitudes2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2004.tif,amplitudes2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2005.tif,amplitudes2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2006.tif,amplitudes2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2007.tif,amplitudes2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2008.tif,amplitudes2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_2009.tif,amplitudes2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\amplitudes2\NDVI_amplitudes2_Average.tif,amplitudes2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2000.tif,annualMaximumValue_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2001.tif,annualMaximumValue_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2002.tif,annualMaximumValue_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2003.tif,annualMaximumValue_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2004.tif,annualMaximumValue_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2005.tif,annualMaximumValue_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2006.tif,annualMaximumValue_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2007.tif,annualMaximumValue_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2008.tif,annualMaximumValue_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_2009.tif,annualMaximumValue_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMaximumValue\NDVI_annualMaximumValue_Average.tif,annualMaximumValue_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2000.tif,annualMeanValue_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2001.tif,annualMeanValue_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2002.tif,annualMeanValue_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2003.tif,annualMeanValue_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2004.tif,annualMeanValue_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2005.tif,annualMeanValue_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2006.tif,annualMeanValue_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2007.tif,annualMeanValue_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2008.tif,annualMeanValue_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_2009.tif,annualMeanValue_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMeanValue\NDVI_annualMeanValue_Average.tif,annualMeanValue_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2000.tif,annualMinimumValue_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2001.tif,annualMinimumValue_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2002.tif,annualMinimumValue_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2003.tif,annualMinimumValue_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2004.tif,annualMinimumValue_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2005.tif,annualMinimumValue_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2006.tif,annualMinimumValue_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2007.tif,annualMinimumValue_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2008.tif,annualMinimumValue_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_2009.tif,annualMinimumValue_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\annualMinimumValue\NDVI_annualMinimumValue_Average.tif,annualMinimumValue_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2000.tif,baselevels1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2001.tif,baselevels1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2002.tif,baselevels1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2003.tif,baselevels1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2004.tif,baselevels1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2005.tif,baselevels1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2006.tif,baselevels1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2007.tif,baselevels1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2008.tif,baselevels1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_2009.tif,baselevels1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels1\NDVI_baselevels1_Average.tif,baselevels1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2000.tif,baselevels2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2001.tif,baselevels2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2002.tif,baselevels2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2003.tif,baselevels2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2004.tif,baselevels2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2005.tif,baselevels2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2006.tif,baselevels2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2007.tif,baselevels2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2008.tif,baselevels2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_2009.tif,baselevels2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\baselevels2\NDVI_baselevels2_Average.tif,baselevels2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2000.tif,browndownrates1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2001.tif,browndownrates1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2002.tif,browndownrates1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2003.tif,browndownrates1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2004.tif,browndownrates1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2005.tif,browndownrates1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2006.tif,browndownrates1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2007.tif,browndownrates1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2008.tif,browndownrates1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_2009.tif,browndownrates1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates1\NDVI_browndownrates1_Average.tif,browndownrates1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2000.tif,browndownrates2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2001.tif,browndownrates2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2002.tif,browndownrates2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2003.tif,browndownrates2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2004.tif,browndownrates2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2005.tif,browndownrates2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2006.tif,browndownrates2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2007.tif,browndownrates2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2008.tif,browndownrates2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_2009.tif,browndownrates2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndownrates2\NDVI_browndownrates2_Average.tif,browndownrates2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2000.tif,browndowns1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2001.tif,browndowns1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2002.tif,browndowns1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2003.tif,browndowns1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2004.tif,browndowns1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2005.tif,browndowns1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2006.tif,browndowns1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2007.tif,browndowns1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2008.tif,browndowns1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_2009.tif,browndowns1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns1\NDVI_browndowns1_Average.tif,browndowns1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2000.tif,browndowns2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2001.tif,browndowns2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2002.tif,browndowns2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2003.tif,browndowns2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2004.tif,browndowns2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2005.tif,browndowns2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2006.tif,browndowns2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2007.tif,browndowns2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2008.tif,browndowns2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_2009.tif,browndowns2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\browndowns2\NDVI_browndowns2_Average.tif,browndowns2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2000.tif,greenuprates1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2001.tif,greenuprates1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2002.tif,greenuprates1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2003.tif,greenuprates1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2004.tif,greenuprates1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2005.tif,greenuprates1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2006.tif,greenuprates1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2007.tif,greenuprates1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2008.tif,greenuprates1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_2009.tif,greenuprates1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates1\NDVI_greenuprates1_Average.tif,greenuprates1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2000.tif,greenuprates2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2001.tif,greenuprates2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2002.tif,greenuprates2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2003.tif,greenuprates2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2004.tif,greenuprates2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2005.tif,greenuprates2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2006.tif,greenuprates2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2007.tif,greenuprates2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2008.tif,greenuprates2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_2009.tif,greenuprates2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenuprates2\NDVI_greenuprates2_Average.tif,greenuprates2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2000.tif,greenups1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2001.tif,greenups1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2002.tif,greenups1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2003.tif,greenups1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2004.tif,greenups1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2005.tif,greenups1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2006.tif,greenups1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2007.tif,greenups1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2008.tif,greenups1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_2009.tif,greenups1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups1\NDVI_greenups1_Average.tif,greenups1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2000.tif,greenups2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2001.tif,greenups2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2002.tif,greenups2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2003.tif,greenups2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2004.tif,greenups2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2005.tif,greenups2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2006.tif,greenups2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2007.tif,greenups2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2008.tif,greenups2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_2009.tif,greenups2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\greenups2\NDVI_greenups2_Average.tif,greenups2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2000.tif,landcover_2000,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2001.tif,landcover_2001,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2002.tif,landcover_2002,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2003.tif,landcover_2003,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2004.tif,landcover_2004,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2005.tif,landcover_2005,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2006.tif,landcover_2006,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2007.tif,landcover_2007,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2008.tif,landcover_2008,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_2009.tif,landcover_2009,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\landcover\NDVI_landcover_Average.tif,landcover_Average,MODIS Phenology,NDVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2000.tif,largeintegrals1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2001.tif,largeintegrals1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2002.tif,largeintegrals1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2003.tif,largeintegrals1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2004.tif,largeintegrals1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2005.tif,largeintegrals1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2006.tif,largeintegrals1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2007.tif,largeintegrals1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2008.tif,largeintegrals1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_2009.tif,largeintegrals1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals1\NDVI_largeintegrals1_Average.tif,largeintegrals1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2000.tif,largeintegrals2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2001.tif,largeintegrals2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2002.tif,largeintegrals2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2003.tif,largeintegrals2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2004.tif,largeintegrals2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2005.tif,largeintegrals2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2006.tif,largeintegrals2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2007.tif,largeintegrals2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2008.tif,largeintegrals2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_2009.tif,largeintegrals2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\largeintegrals2\NDVI_largeintegrals2_Average.tif,largeintegrals2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2000.tif,maxpeakvalues1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2001.tif,maxpeakvalues1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2002.tif,maxpeakvalues1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2003.tif,maxpeakvalues1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2004.tif,maxpeakvalues1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2005.tif,maxpeakvalues1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2006.tif,maxpeakvalues1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2007.tif,maxpeakvalues1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2008.tif,maxpeakvalues1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_2009.tif,maxpeakvalues1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues1\NDVI_maxpeakvalues1_Average.tif,maxpeakvalues1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2000.tif,maxpeakvalues2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2001.tif,maxpeakvalues2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2002.tif,maxpeakvalues2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2003.tif,maxpeakvalues2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2004.tif,maxpeakvalues2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2005.tif,maxpeakvalues2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2006.tif,maxpeakvalues2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2007.tif,maxpeakvalues2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2008.tif,maxpeakvalues2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_2009.tif,maxpeakvalues2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\maxpeakvalues2\NDVI_maxpeakvalues2_Average.tif,maxpeakvalues2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2000.tif,peakdates1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2001.tif,peakdates1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2002.tif,peakdates1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2003.tif,peakdates1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2004.tif,peakdates1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2005.tif,peakdates1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2006.tif,peakdates1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2007.tif,peakdates1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2008.tif,peakdates1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_2009.tif,peakdates1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates1\NDVI_peakdates1_Average.tif,peakdates1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2000.tif,peakdates2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2001.tif,peakdates2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2002.tif,peakdates2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2003.tif,peakdates2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2004.tif,peakdates2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2005.tif,peakdates2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2006.tif,peakdates2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2007.tif,peakdates2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2008.tif,peakdates2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_2009.tif,peakdates2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\peakdates2\NDVI_peakdates2_Average.tif,peakdates2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2000.tif,qualityFlag_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2001.tif,qualityFlag_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2002.tif,qualityFlag_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2003.tif,qualityFlag_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2004.tif,qualityFlag_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2005.tif,qualityFlag_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2006.tif,qualityFlag_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2007.tif,qualityFlag_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2008.tif,qualityFlag_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_2009.tif,qualityFlag_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\qualityFlag\NDVI_qualityFlag_Average.tif,qualityFlag_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2000.tif,RMSE_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2001.tif,RMSE_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2002.tif,RMSE_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2003.tif,RMSE_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2004.tif,RMSE_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2005.tif,RMSE_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2006.tif,RMSE_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2007.tif,RMSE_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2008.tif,RMSE_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_2009.tif,RMSE_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\RMSE\NDVI_RMSE_Average.tif,RMSE_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2000.tif,seasonlengths1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2001.tif,seasonlengths1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2002.tif,seasonlengths1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2003.tif,seasonlengths1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2004.tif,seasonlengths1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2005.tif,seasonlengths1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2006.tif,seasonlengths1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2007.tif,seasonlengths1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2008.tif,seasonlengths1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_2009.tif,seasonlengths1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths1\NDVI_seasonlengths1_Average.tif,seasonlengths1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2000.tif,seasonlengths2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2001.tif,seasonlengths2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2002.tif,seasonlengths2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2003.tif,seasonlengths2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2004.tif,seasonlengths2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2005.tif,seasonlengths2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2006.tif,seasonlengths2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2006.tif,seasonlengths2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2007.tif,seasonlengths2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2008.tif,seasonlengths2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_2009.tif,seasonlengths2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\seasonlengths2\NDVI_seasonlengths2_Average.tif,seasonlengths2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2000.tif,smallintegrals1_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2001.tif,smallintegrals1_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2002.tif,smallintegrals1_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2003.tif,smallintegrals1_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2004.tif,smallintegrals1_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2005.tif,smallintegrals1_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2006.tif,smallintegrals1_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2007.tif,smallintegrals1_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2008.tif,smallintegrals1_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_2009.tif,smallintegrals1_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals1\NDVI_smallintegrals1_Average.tif,smallintegrals1_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2000.tif,smallintegrals2_2000,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2001.tif,smallintegrals2_2001,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2002.tif,smallintegrals2_2002,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2003.tif,smallintegrals2_2003,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2004.tif,smallintegrals2_2004,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2005.tif,smallintegrals2_2005,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2006.tif,smallintegrals2_2006,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2007.tif,smallintegrals2_2007,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2008.tif,smallintegrals2_2008,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_2009.tif,smallintegrals2_2009,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_NDVI\smallintegrals2\NDVI_smallintegrals2_Average.tif,smallintegrals2_Average,MODIS Phenology,NDVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2000.tif,amplitudes1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2001.tif,amplitudes1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2002.tif,amplitudes1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2003.tif,amplitudes1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2004.tif,amplitudes1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2005.tif,amplitudes1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2006.tif,amplitudes1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2007.tif,amplitudes1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2008.tif,amplitudes1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_2009.tif,amplitudes1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes1\EVI_amplitudes1_Average.tif,amplitudes1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2000.tif,amplitudes2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2001.tif,amplitudes2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2002.tif,amplitudes2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2003.tif,amplitudes2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2004.tif,amplitudes2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2005.tif,amplitudes2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2006.tif,amplitudes2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2007.tif,amplitudes2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2008.tif,amplitudes2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_2009.tif,amplitudes2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\amplitudes2\EVI_amplitudes2_Average.tif,amplitudes2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2000.tif,annualMaximumValue_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2001.tif,annualMaximumValue_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2002.tif,annualMaximumValue_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2003.tif,annualMaximumValue_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2004.tif,annualMaximumValue_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2005.tif,annualMaximumValue_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2006.tif,annualMaximumValue_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2007.tif,annualMaximumValue_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2008.tif,annualMaximumValue_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_2009.tif,annualMaximumValue_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMaximumValue\EVI_annualMaximumValue_Average.tif,annualMaximumValue_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2000.tif,annualMeanValue_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2001.tif,annualMeanValue_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2002.tif,annualMeanValue_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2003.tif,annualMeanValue_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2004.tif,annualMeanValue_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2005.tif,annualMeanValue_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2006.tif,annualMeanValue_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2007.tif,annualMeanValue_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2008.tif,annualMeanValue_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_2009.tif,annualMeanValue_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMeanValue\EVI_annualMeanValue_Average.tif,annualMeanValue_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2000.tif,annualMinimumValue_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2001.tif,annualMinimumValue_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2002.tif,annualMinimumValue_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2003.tif,annualMinimumValue_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2004.tif,annualMinimumValue_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2005.tif,annualMinimumValue_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2006.tif,annualMinimumValue_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2007.tif,annualMinimumValue_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2008.tif,annualMinimumValue_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_2009.tif,annualMinimumValue_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\annualMinimumValue\EVI_annualMinimumValue_Average.tif,annualMinimumValue_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2000.tif,baselevels1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2001.tif,baselevels1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2002.tif,baselevels1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2003.tif,baselevels1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2004.tif,baselevels1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2005.tif,baselevels1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2006.tif,baselevels1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2007.tif,baselevels1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2008.tif,baselevels1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_2009.tif,baselevels1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels1\EVI_baselevels1_Average.tif,baselevels1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2000.tif,baselevels2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2001.tif,baselevels2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2002.tif,baselevels2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2003.tif,baselevels2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2004.tif,baselevels2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2005.tif,baselevels2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2006.tif,baselevels2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2007.tif,baselevels2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2008.tif,baselevels2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_2009.tif,baselevels2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\baselevels2\EVI_baselevels2_Average.tif,baselevels2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2000.tif,browndownrates1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2001.tif,browndownrates1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2002.tif,browndownrates1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2003.tif,browndownrates1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2004.tif,browndownrates1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2005.tif,browndownrates1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2006.tif,browndownrates1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2007.tif,browndownrates1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2008.tif,browndownrates1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_2009.tif,browndownrates1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates1\EVI_browndownrates1_Average.tif,browndownrates1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2000.tif,browndownrates2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2001.tif,browndownrates2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2002.tif,browndownrates2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2003.tif,browndownrates2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2004.tif,browndownrates2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2005.tif,browndownrates2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2006.tif,browndownrates2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2007.tif,browndownrates2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2008.tif,browndownrates2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_2009.tif,browndownrates2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndownrates2\EVI_browndownrates2_Average.tif,browndownrates2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2000.tif,browndowns1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2001.tif,browndowns1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2002.tif,browndowns1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2003.tif,browndowns1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2004.tif,browndowns1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2005.tif,browndowns1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2006.tif,browndowns1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2007.tif,browndowns1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2008.tif,browndowns1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_2009.tif,browndowns1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns1\EVI_browndowns1_Average.tif,browndowns1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2000.tif,browndowns2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2001.tif,browndowns2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2002.tif,browndowns2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2003.tif,browndowns2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2004.tif,browndowns2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2005.tif,browndowns2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2006.tif,browndowns2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2007.tif,browndowns2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2008.tif,browndowns2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_2009.tif,browndowns2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\browndowns2\EVI_browndowns2_Average.tif,browndowns2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2000.tif,greenuprates1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2001.tif,greenuprates1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2002.tif,greenuprates1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2003.tif,greenuprates1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2004.tif,greenuprates1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2005.tif,greenuprates1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2006.tif,greenuprates1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2007.tif,greenuprates1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2008.tif,greenuprates1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_2009.tif,greenuprates1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates1\EVI_greenuprates1_Average.tif,greenuprates1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2000.tif,greenuprates2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2001.tif,greenuprates2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2002.tif,greenuprates2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2003.tif,greenuprates2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2004.tif,greenuprates2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2005.tif,greenuprates2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2006.tif,greenuprates2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2007.tif,greenuprates2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2008.tif,greenuprates2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_2009.tif,greenuprates2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenuprates2\EVI_greenuprates2_Average.tif,greenuprates2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2000.tif,greenups1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2001.tif,greenups1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2002.tif,greenups1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2003.tif,greenups1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2004.tif,greenups1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2005.tif,greenups1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2006.tif,greenups1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2007.tif,greenups1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2008.tif,greenups1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_2009.tif,greenups1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups1\EVI_greenups1_Average.tif,greenups1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2000.tif,greenups2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2001.tif,greenups2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2002.tif,greenups2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2003.tif,greenups2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2004.tif,greenups2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2005.tif,greenups2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2006.tif,greenups2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2007.tif,greenups2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2008.tif,greenups2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_2009.tif,greenups2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\greenups2\EVI_greenups2_Average.tif,greenups2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2000.tif,landcover_2000,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2001.tif,landcover_2001,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2002.tif,landcover_2002,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2003.tif,landcover_2003,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2004.tif,landcover_2004,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2005.tif,landcover_2005,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2006.tif,landcover_2006,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2007.tif,landcover_2007,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2008.tif,landcover_2008,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_2009.tif,landcover_2009,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\landcover\EVI_landcover_Average.tif,landcover_Average,MODIS Phenology,EVI (230 m),Y
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2000.tif,largeintegrals1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2001.tif,largeintegrals1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2002.tif,largeintegrals1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2003.tif,largeintegrals1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2004.tif,largeintegrals1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2005.tif,largeintegrals1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2006.tif,largeintegrals1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2007.tif,largeintegrals1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2008.tif,largeintegrals1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_2009.tif,largeintegrals1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals1\EVI_largeintegrals1_Average.tif,largeintegrals1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2000.tif,largeintegrals2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2001.tif,largeintegrals2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2002.tif,largeintegrals2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2003.tif,largeintegrals2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2004.tif,largeintegrals2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2005.tif,largeintegrals2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2006.tif,largeintegrals2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2007.tif,largeintegrals2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2008.tif,largeintegrals2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_2009.tif,largeintegrals2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\largeintegrals2\EVI_largeintegrals2_Average.tif,largeintegrals2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2000.tif,maxpeakvalues1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2001.tif,maxpeakvalues1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2002.tif,maxpeakvalues1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2003.tif,maxpeakvalues1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2004.tif,maxpeakvalues1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2005.tif,maxpeakvalues1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2006.tif,maxpeakvalues1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2007.tif,maxpeakvalues1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2008.tif,maxpeakvalues1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_2009.tif,maxpeakvalues1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues1\EVI_maxpeakvalues1_Average.tif,maxpeakvalues1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2000.tif,maxpeakvalues2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2001.tif,maxpeakvalues2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2002.tif,maxpeakvalues2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2003.tif,maxpeakvalues2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2004.tif,maxpeakvalues2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2005.tif,maxpeakvalues2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2006.tif,maxpeakvalues2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2007.tif,maxpeakvalues2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2008.tif,maxpeakvalues2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_2009.tif,maxpeakvalues2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\maxpeakvalues2\EVI_maxpeakvalues2_Average.tif,maxpeakvalues2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2000.tif,peakdates1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2001.tif,peakdates1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2002.tif,peakdates1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2003.tif,peakdates1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2004.tif,peakdates1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2005.tif,peakdates1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2006.tif,peakdates1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2007.tif,peakdates1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2008.tif,peakdates1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_2009.tif,peakdates1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates1\EVI_peakdates1_Average.tif,peakdates1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2000.tif,peakdates2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2001.tif,peakdates2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2002.tif,peakdates2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2003.tif,peakdates2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2004.tif,peakdates2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2005.tif,peakdates2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2006.tif,peakdates2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2007.tif,peakdates2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2008.tif,peakdates2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_2009.tif,peakdates2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\peakdates2\EVI_peakdates2_Average.tif,peakdates2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2000.tif,qualityFlag_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2001.tif,qualityFlag_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2002.tif,qualityFlag_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2003.tif,qualityFlag_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2004.tif,qualityFlag_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2005.tif,qualityFlag_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2006.tif,qualityFlag_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2007.tif,qualityFlag_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2008.tif,qualityFlag_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_2009.tif,qualityFlag_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\qualityFlag\EVI_qualityFlag_Average.tif,qualityFlag_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2000.tif,RMSE_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2001.tif,RMSE_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2002.tif,RMSE_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2003.tif,RMSE_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2004.tif,RMSE_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2005.tif,RMSE_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2006.tif,RMSE_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2007.tif,RMSE_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2008.tif,RMSE_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_2009.tif,RMSE_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\RMSE\EVI_RMSE_Average.tif,RMSE_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2000.tif,seasonlengths1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2001.tif,seasonlengths1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2002.tif,seasonlengths1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2003.tif,seasonlengths1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2004.tif,seasonlengths1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2005.tif,seasonlengths1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2006.tif,seasonlengths1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2007.tif,seasonlengths1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2008.tif,seasonlengths1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_2009.tif,seasonlengths1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths1\EVI_seasonlengths1_Average.tif,seasonlengths1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2000.tif,seasonlengths2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2001.tif,seasonlengths2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2002.tif,seasonlengths2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2003.tif,seasonlengths2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2004.tif,seasonlengths2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2005.tif,seasonlengths2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2006.tif,seasonlengths2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2006.tif,seasonlengths2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2007.tif,seasonlengths2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2008.tif,seasonlengths2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_2009.tif,seasonlengths2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\seasonlengths2\EVI_seasonlengths2_Average.tif,seasonlengths2_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2000.tif,smallintegrals1_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2001.tif,smallintegrals1_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2002.tif,smallintegrals1_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2003.tif,smallintegrals1_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2004.tif,smallintegrals1_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2005.tif,smallintegrals1_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2006.tif,smallintegrals1_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2007.tif,smallintegrals1_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2008.tif,smallintegrals1_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_2009.tif,smallintegrals1_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals1\EVI_smallintegrals1_Average.tif,smallintegrals1_Average,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2000.tif,smallintegrals2_2000,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2001.tif,smallintegrals2_2001,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2002.tif,smallintegrals2_2002,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2003.tif,smallintegrals2_2003,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2004.tif,smallintegrals2_2004,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2005.tif,smallintegrals2_2005,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2006.tif,smallintegrals2_2006,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2007.tif,smallintegrals2_2007,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2008.tif,smallintegrals2_2008,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_2009.tif,smallintegrals2_2009,MODIS Phenology,EVI (230 m),N
+\\IGSKBACBVMFS002\InvasivesNAS$\Phenology Share\FinalMosaics_WGS84Sinusoidal\MOD09Q1P_EVI\smallintegrals2\EVI_smallintegrals2_Average.tif,smallintegrals2_Average,MODIS Phenology,EVI (230 m),N
diff --git a/contrib/sahm/layers.exampledata.csv b/contrib/sahm/layers.exampledata.csv
new file mode 100644
index 0000000..f93f24c
--- /dev/null
+++ b/contrib/sahm/layers.exampledata.csv
@@ -0,0 +1,6 @@
+FileName,LayerName,Group,Source,Categorical
+..\examples\SAHM_example\PredictorLayers\Climate\DAYMET_WGS84\bio_1_wgs84.tif,Annual mean temperature,Climate,"Daymet (1980-1997) Normals, 1km.",N
+..\examples\SAHM_example\PredictorLayers\Climate\DAYMET_WGS84\bio_2_wgs84.tif,Mean diurnal range,Climate,"Daymet (1980-1997) Normals, 1km.",N
+..\examples\SAHM_example\PredictorLayers\Climate\PRISM\ppt_1971_2000_011.img,Average Jan. Precipitation,Climate,"PRISM (1971-2000) Normals, 800 m.",N
+..\examples\SAHM_example\PredictorLayers\NLCD\nlcd01_11.tif,NLCD Landcover,Remote Sensing,NLCD,Y
+..\examples\SAHM_example\PredictorLayers\Elevation\dem.tif,30m EDNA Elevation resampled to 90m,Elevation / Topography,"EDNA, NED",N
diff --git a/contrib/sahm/maxent.csv b/contrib/sahm/maxent.csv
new file mode 100644
index 0000000..f9c2c8d
--- /dev/null
+++ b/contrib/sahm/maxent.csv
@@ -0,0 +1,33 @@
+Flag ,Abbrv ,Type ,Default ,Meaning ,VisTrailsNotes
+projectionlayers ,j ,file/directory ,,"Location of an alternate set of environmental variables. Maxent models will be projected onto these variables.
Can be a .csv file (in SWD format) or a directory containing one file per variable.
Multiple projection files/directories can be separated by commas. ",
+randomtestpoints ,X ,integer ,0,"Percentage of presence localities to be randomly set aside as test points, used to compute AUC, omission etc. ","If the MDS input is from the test training split the will not be used, but instead this file will be generated from the input MDS Split column where it equals 'test'"
+betamultiplier ,b ,double ,1,Multiply all automatic regularization parameters by this number. A higher number gives a more spread-out distribution. ,
+maximumbackground ,MB ,integer ,10000,"If the number of background points / grid cells is larger than this number, then this number of cells is chosen randomly for background points ",
+testsamplesfile ,T ,file ,,"Use the presence localities in this file to compute statistics (AUC, omission etc.)
The file can contain different localities for different species.
It takes precedence over the random test percentage. ",
+replicates ,,integer ,1,"Number of replicate runs to do when cross-validating, bootstrapping or doing sampling with replacement runs ",If we supply the testsamples file or generate one from our testtraining split data can this also supplied?  I think not.
+replicatetype ,,string ,subsample,"If replicates > 1, do multiple runs of this type:
Crossvalidate: samples divided into replicates folds; each fold in turn used for test data.
Bootstrap: replicate sample sets chosen by sampling with replacement.
Subsample: replicate sample sets chosen by removing random test percentage without replacement to be used for evaluation. 
(Options)",same as above
+writebackgroundpredictions ,,boolean ,false ,Write .csv file with predictions at background points ,
+linear ,l ,boolean ,true ,Allow linear features to be used ,
+quadratic ,q ,boolean ,true ,Allow quadratic features to be used ,
+product ,p ,boolean ,true ,Allow product features to be used ,
+threshold ,,boolean ,true ,Allow threshold features to be used ,
+hinge ,h ,boolean ,true ,Allow hinge features to be used ,
+writeplotdata ,,boolean ,false ,"Write output files containing the data used to make response curves, for import into external plotting software ",
+fadebyclamping ,,boolean ,false ,"Reduce prediction at each point in projections by the difference between
clamped and non-clamped output at that point ",
+extrapolate ,,boolean ,true ,Predict to regions of environmental space outside the limits encountered during training ,
+autofeature ,A ,boolean ,true ,"Automatically select which feature classes to use, based on number of training samples ",
+doclamp ,,boolean ,true ,Apply clamping when projecting ,
+maximumiterations ,m ,integer ,500,Stop training after this many iterations of the optimization algorithm ,
+convergencethreshold ,c ,double ,1.00E-05,Stop training when the drop in log loss per iteration drops below this number ,
+beta_threshold ,,double ,-1,Regularization parameter to be applied to all threshold features; negative value enables automatic setting ,
+beta_categorical ,,double ,-1,Regularization parameter to be applied to all categorical features; negative value enables automatic setting ,
+beta_lqp ,,double ,-1,"Regularization parameter to be applied to all linear, quadratic and product features; negative value enables automatic setting ",
+beta_hinge ,,double ,-1,Regularization parameter to be applied to all hinge features; negative value enables automatic setting ,
+applythresholdrule ,,string ,,"Apply a threshold rule, generating a binary output grid in addition to the regular prediction grid. Options:
������ Fixed cumulative value 1
������ Fixed cumulative value 5
������ Fixed cumulative value 10
������ Minimum training presence
������ 10 percentile training presence
������ Equal training sensitivity and specificity
������ Maximum training sensitivity plus specificity
",
+prefixes,,boolean ,false ,,
+species_name,,string ,species,Used only by VisTrails to set the species name,
+responsecurves,p ,boolean ,true ,Create graphs showing how predicted relative probability of occurrence depends on the value of each environmental variable,
+jackknife,,boolean ,true ,Do jackknife to measure variable importance,
+writeclampgrid,,boolean ,false ,Do not create clamping grids when projecting,
+writemess,,boolean ,false ,Do not do MESS analysis when projecting,
+outputgrids,,boolean ,false ,Only create the summary grids when doing multiple iterations,
diff --git a/contrib/sahm/pySAHM/FieldDataQuery.py b/contrib/sahm/pySAHM/FieldDataQuery.py
new file mode 100644
index 0000000..6565ca7
--- /dev/null
+++ b/contrib/sahm/pySAHM/FieldDataQuery.py
@@ -0,0 +1,385 @@
+'''
+Created on Dec 29, 2010
+
+This module was created to 
+
+ at author: talbertc
+'''
+
+import sys, os
+import math
+import csv
+
+from osgeo import gdalconst
+from osgeo import gdal
+from osgeo import osr
+from math import floor
+
+from optparse import OptionParser
+
+import utilities
+
+def main(argv):
+    usageStmt = "usage:  options: -t --template   -f --fieldData -a --aggPixel -y --aggYears -o --output"
+    desc = "Aggregates sample points by pixel and/or year."
+
+    parser = OptionParser(usage=usageStmt, description=desc)
+    parser.add_option("-t", "--template", 
+                      dest="template", 
+                      help="The template grid in Tif, ESRI grid, or ASC format")
+    parser.add_option("-f", "--fieldData", 
+                      dest="csv", 
+                      help="The CSV of field data")
+    parser.add_option("-o", "--output", 
+                      dest="output", 
+                      help="The output CSV file with appended frequency and numPresence")
+    parser.add_option("-p", "--aggregate", 
+                      dest="bAgg", 
+                      default=True, 
+                      action="store_true", 
+                      help="Flag to aggregate by pixel in the template")
+    parser.add_option("-y", "--aggregateYears", 
+                      dest="bAggYears", 
+                      default=False, 
+                      action="store_true", 
+                      help="Flag to aggregate by years in the template")
+    parser.add_option("-v", "--verbose", 
+                      dest="verbose", 
+                      default=False, 
+                      action="store_true",
+                      help="the verbose flag causes diagnostic output to print")
+
+    (options, args) = parser.parse_args(argv)
+
+    ourFDQ = FieldDataQuery()
+    ourFDQ.template = options.template
+    ourFDQ.csv = options.csv
+    ourFDQ.output = options.output
+    ourFDQ.AggByPixel = options.bAgg
+    ourFDQ.AggByYear = options.bAggYears
+    ourFDQ.verbose = options.verbose
+    ourFDQ.processCSV()
+    
+class FieldDataQuery(object):
+
+    def __init__(self):
+        #instance level variables
+        self.csv = None
+        self.template = None
+        self.output = None
+        self.templateParams = {}
+        self.AggByYear = False
+        self.AggByPixel = True
+        self.verbose = False
+        self.countdata = False
+        self.logger = None
+
+    def validateArgs(self):
+        """
+        Make sure the user sent us some stuff we can work with
+        """
+
+        # Validate template image.
+        if self.template is None:
+            raise Exception, "template raster not provided (-t command line argument missing)"
+        
+        if not os.path.exists(self.template):
+            raise Exception, "Template file, " + self.template + ", does not exist on file system"
+
+        self.templateParams = self.getRasterParams(self.template)
+        if len(self.templateParams["Error"]) <> 0:
+            print ("There was a problem with the provided template: \n    " + 
+                                    "    " + "\n    ".join(self.templateParams["Error"]))
+            raise Exception, ("There was a problem with the provided template: \n    " + 
+                                    "    " + "\n    ".join(self.templateParams["Error"]))
+        
+        # Ensure the template has square pixels.
+        if abs(abs(self.templateParams["xScale"]) - abs(self.templateParams["yScale"])) > 1e-6:
+            print "The template raster must have square pixels."
+            print "x pixel scale = " + str(xScale)
+            print "y pixel scale = " + str(yScale)
+            raise Exception, "template image must have square pixels."
+        
+        #Validate the CSV
+        if self.csv is None:
+            raise Exception, "No csv provided"
+    
+        if not os.path.exists(self.csv):
+            raise Exception, "CSV file, " + self.csv + ", does not exist on file system"
+        
+        #make sure the directory the mds file is going into exists:
+        outDir = os.path.split(self.output)[0]
+        if not os.path.exists(outDir):
+            raise RuntimeError, "The directory of the supplied MDS output file path, " + self.output +", does not appear to exist on the filesystem"
+        
+        if self.logger is None:
+            self.logger = utilities.logger(outDir, self.verbose)
+        self.writetolog = self.logger.writetolog
+        
+    def getRasterParams(self, rasterFile):
+        """
+        Extracts a series of bits of information from a passed raster
+        All values are stored in a dictionary which is returned.
+        If errors are encountered along the way the error messages will
+        be returned as a list in the Error element.
+        """
+        try:
+            #initialize our params dictionary to have None for all parma
+            params = {}
+            allRasterParams = ["Error", "xScale", "yScale", "width", "height",
+                            "ulx", "uly", "lrx", "lry", "Wkt", 
+                            "tUlx", "tUly", "tLrx", "tLry", 
+                            "srs", "gt", "prj", "NoData", "PixelType"]
+            
+            for param in allRasterParams:
+                params[param] = None
+            params["Error"] = []
+            
+            # Get the PARC parameters from the rasterFile.
+            dataset = gdal.Open(rasterFile, gdalconst.GA_ReadOnly)
+            if dataset is None:
+                params["Error"].append("Unable to open file")
+                #print "Unable to open " + rasterFile
+                #raise Exception, "Unable to open specifed file " + rasterFile
+                
+            
+            xform  = dataset.GetGeoTransform()
+            params["xScale"] = xform[1]
+            params["yScale"] = xform[5]
+    
+            params["width"]  = dataset.RasterXSize
+            params["height"] = dataset.RasterYSize
+    
+            params["ulx"] = xform[0]
+            params["uly"] = xform[3]
+            params["lrx"] = params["ulx"] + params["width"]  * params["xScale"]
+            params["lry"] = params["uly"] + params["height"] * params["yScale"]
+                
+            
+        except:
+            #print "We ran into problems extracting raster parameters from " + rasterFile
+            params["Error"].append("Some untrapped error was encountered")
+        finally:
+            del dataset
+            return params
+    
+    def processCSV(self):
+        
+        self.validateArgs()
+        if self.verbose:
+            self.writetolog("Starting on Field Data Query for " + os.path.split(self.csv)[1])
+            self.writetolog("  using template " + os.path.split(self.template)[1])
+         
+        templatename = os.path.split(self.template)[1]
+        if templatename == 'hdr.adf':
+            templatename = os.path.split(os.path.split(self.template)[0])[1]
+         
+            
+        csvfile = open(self.csv, "r")
+        #dialect = csv.Sniffer().sniff(csvfile.read(1024))
+        reader = csv.reader(csvfile)
+        usedPixels = {}
+        header = reader.next()
+        if header[2].lower() == 'responsecount':
+            self.countdata = True
+        
+        #Commented this out because it is causing an error
+        #to be thrown by the java, uncomment out when the 
+        #java has been replaced
+        header.append("frequency")
+        header.append("numPresence")
+        header.append("pixelColumn")
+        header.append("pixelRow")
+        header.append(os.path.abspath(self.template))
+        header.append(os.path.abspath(self.csv))
+    
+        #loop through each row (observation) and 
+        #if that particular pixel hasn't been encountered before
+        #add it to a dictionary containing a key of the pixel X,Y
+        #and values of each row encountered for that pixel
+        #if pixel
+        lineCount = linesInFile(self.csv)
+        extraPoints = []
+        pointCount = 0
+        pcntDone = 0
+        for row in reader:
+            if self.pointInTemplate(row[0], row[1]):
+                pixelColumn = int(floor((float(row[0]) - self.templateParams["ulx"]) 
+                                        / self.templateParams["xScale"]))
+                pixelRow = int(floor((float(row[1]) - self.templateParams["uly"]) 
+                                     / self.templateParams["yScale"]))
+                pixel = "".join(["X:",str(pixelColumn),":Y:",str(pixelRow)])
+                #if verbose == True:
+                if not pixel in usedPixels:
+                    usedPixels[pixel] = [row]
+                    #usedPixels[pixel] = usedPixels[pixel].append(row)
+                else:
+                    curVal = usedPixels[pixel]
+                    curVal.append(row)
+                    usedPixels[pixel] = curVal
+            else:
+                extraPoints.append([row[0], row[1], row[2]])
+            pointCount += 1
+            if self.verbose:
+                if float(pointCount)/lineCount > float(pcntDone)/100:
+                    pcntDone += 10
+                    if self.verbose:
+                        print str(pcntDone) + "...",
+    
+        #Open up and write to an output file
+        oFile = open(self.output, 'wb')
+        fOut = csv.writer(oFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
+        fOut.writerow(header)
+    
+        #Add each used pixel to the output file
+        for k in usedPixels:
+            v = usedPixels[k]
+            outputLine = v[0]
+    
+            pixelColumn = int(k.rsplit(':')[1])
+            pixelRow = int(k.rsplit(':')[3])
+            outPixelX = (self.templateParams["ulx"] + (self.templateParams["xScale"] * pixelColumn) + 
+                                    self.templateParams["xScale"]/2)
+            outPixelY = (self.templateParams["uly"] + (self.templateParams["yScale"] * pixelRow) + 
+                                    self.templateParams["yScale"]/2)
+            frequency = len(v)
+    
+            #loop though the 'points' in each pixel
+            #for count data the value is the sum of the 'points'
+            #    if there were any 'hits' not equal to 0
+            #    otherwise if there were any absences the value is 0
+            #    what's left is background points
+            #for presense/absense data
+            #    The value is 1 if there were any 1s in our points
+            #    Or 0 if there were any zeros (absenses)
+            #    Otherwise it's a background pixel.
+            total = 0
+            numAbsense = 0
+            for i in range (frequency):
+                if int(float(v[i][2])) > 0:
+                    total += int(float(v[i][2]))
+                if int(float(v[i][2])) == 0:
+                    numAbsense += 1
+            
+            outputLine[0] = outPixelX
+            outputLine[1] = outPixelY
+            
+            if self.countdata and total > 0:
+                outputLine[2] = total
+            elif total > 0:
+                outputLine[2] = 1
+            elif numAbsense > 0:
+                outputLine[2] = 0
+            else:
+                outputLine[2] = -9999
+                
+            outputLine.append(frequency)
+            outputLine.append(total)
+            outputLine.append(pixelColumn)
+            outputLine.append(pixelRow)
+            
+    
+            fOut.writerow(outputLine)
+        oFile.close
+        if self.verbose:
+            self.writetolog("Done\nFinished creating field data query output.\n")
+            if len(extraPoints) > 0:
+                self.writetolog ("  WARNING: " + str(len(extraPoints)) + " points" +
+                    " out of " + str(pointCount) + " total points in the " +
+                    "original CSV were outside the template extent and WERE NOT " +
+                    "INCLUDED IN THE FDQ OUTPUT.")
+            else:
+                pass
+
+    def pointInTemplate(self, x, y):
+        if (float(x) >= self.templateParams["ulx"] and
+            float(x) <= self.templateParams["lrx"] and
+            float(y) >= self.templateParams["lry"] and
+            float(y) <= self.templateParams["uly"]):
+            return True
+        else:
+            return False
+
+def linesInFile(filename):
+    f = open(filename)                  
+    lines = 0
+    buf_size = 1024 * 1024
+    read_f = f.read # loop optimization
+
+    buf = read_f(buf_size)
+    while buf:
+        lines += buf.count('\n')
+        buf = read_f(buf_size)
+
+    return lines
+#def getTemplateParams(template, verbose):
+#    # Get the PARC parameters from the template.
+#    dataset = gdal.Open(template, gdalconst.GA_ReadOnly)
+#    
+#    if dataset is None:
+#        print "Unable to open " + template
+#        raise RuntimeError
+#    xform = dataset.GetGeoTransform()
+#    xScale = xform[1]
+#    yScale = xform[5]
+#    # Ensure the template has square pixels.
+#    if abs(math.fabs(xScale) - math.fabs(yScale)) > 1e-6:
+#        print "The template image must have square pixels."
+#        print "x pixel scale = " + str(math.fabs(xScale))
+#        print "y pixel scale = " + str(math.fabs(yScale))
+#        raise RuntimeError
+#    width = dataset.RasterXSize
+#    height = dataset.RasterYSize
+#    ulx = xform[0]
+#    uly = xform[3]
+#    lrx = ulx + width * xScale
+#    lry = uly + height * yScale
+#    if verbose == True:
+#        print "upper left = (" + str(ulx) + ", " + str(uly) + ")"
+#        print "lower right = (" + str(lrx) + ", " + str(lry) + ")"
+#    # Store the extent in geographic coordinates.
+#    tEPSG = getEPSG(dataset)
+#    if int(tEPSG) == 4326:
+#        tGeoUlX = ulx
+#        tGeoUlY = uly
+#        tGeoLrX = lrx
+#        tGeoLrY = lry
+#    else:
+#        tGeoUlX, tGeoUlY, tGeoLrX, tGeoLrY = getExtentInGeog(ulx, uly, lrx, lry, tEPSG)
+#    return ulx, uly, lrx, lry, getEPSG(dataset), xScale, yScale
+#
+#def getEPSG(dataset):
+#    #Returns code for the projection/datum used in the layer
+#    wkt = dataset.GetProjection()
+#    s_srs = osr.SpatialReference(wkt)
+#    s_srs.AutoIdentifyEPSG()
+#    epsg = s_srs.GetAuthorityCode("PROJCS")
+#    if epsg == None:
+#        epsg = s_srs.GetAuthorityCode("GEOGCS")
+#    if epsg == None:
+#        print "Unable to extract the EPSG code from the image."
+#        raise RuntimeError
+#    return epsg
+#
+#def getExtentInGeog(ulx, uly, lrx, lry, EPSG):
+#        
+#        s_srs = osr.SpatialReference()
+#        s_srs.ImportFromEPSG(int(EPSG))
+#
+#        t_srs = osr.SpatialReference()
+#        t_srs.ImportFromEPSG(4326)
+#
+#        coordXform = osr.CoordinateTransformation(s_srs, t_srs)
+#
+#        result = coordXform.TransformPoint(ulx, uly)
+#        gulx = result[0]
+#        guly = result[1]
+#
+#        result = coordXform.TransformPoint(lrx, lry)
+#        glrx = result[0]
+#        glry = result[1]
+#
+#        return gulx, guly, glrx, glry
+
+if __name__ == '__main__':
+    main(sys.argv)
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/MDSBuilder.py b/contrib/sahm/pySAHM/MDSBuilder.py
new file mode 100644
index 0000000..7bf9739
--- /dev/null
+++ b/contrib/sahm/pySAHM/MDSBuilder.py
@@ -0,0 +1,473 @@
+'''
+Created on Jan 31, 2011
+
+This module creates a Merged Data Set (MDS)
+from an input CSV and directory 
+or list of rasters. The MDS consists of three
+header lines 1st is a x, y, ResponseBinary, 
+{other info fields}, then a list of raster covariates.
+The next header line contains ones and zeros for each of the 
+raster covariates and indicates if the covariate is to be 
+used in subsequent analyses.  The last header line contains
+the full network path the raster dataset for that covariate.
+After the header lines comes the data which is the 
+covariate values pulled from the raster cell 
+with those coordinates. 
+
+ at author: talbertc
+
+'''
+
+import sys
+import csv
+import os
+import time
+import random
+import shutil
+
+from osgeo import gdalconst
+from osgeo import gdal
+
+from optparse import OptionParser
+import utilities
+#from Utilities import self.writetolog
+
+class MDSBuilder(object):
+    '''Takes a csv with animal location x,y and attributes each with the values 
+    extracted from each of the grids (covariates) indicated in the supplied 
+    csv list of files
+    '''
+    def __init__(self):
+        #instance level variables
+        self.verbose = False
+        self.inputsCSV = ''
+        self.inputs = []
+        self.fieldData = ''
+        self.outputMDS  = ''
+        self.probsurf = ''
+        self.pointcount = 0
+        self.NDFlag = -9999
+        self.deleteTmp = False
+        self.logger = None
+    
+    def validateArgs(self):
+        #check our CSV file for expectations
+        if not os.path.exists(self.fieldData):
+            raise RuntimeError, "Could not find CSV file of fieldData provided.  Please check input file: " + str(self.fieldData)
+         
+        if not os.path.exists(self.inputsCSV):
+            raise RuntimeError, "Could not find CSV file of inputs provided.  Please check input file: " + str(self.inputsCSV) 
+        
+        #check the input CSV file of inputs
+        reader = csv.reader(open(self.inputsCSV, 'r'))
+        header = reader.next()
+        missingfiles = []
+        for row in reader:
+            if not self.isRaster(row[0]):
+                missingfiles.append(row[0])
+        if not len(missingfiles) ==0:
+            msg = "One or more of the files in the input covariate list CSV could not be identified as rasters by GDAL."
+            msg += "\n    ".join(missingfiles)
+            raise RuntimeError, msg
+            
+        if self.probsurf <> '':
+            if not self.isRaster(self.probsurf):
+                raise RuntimeError, "The supplied probability surface, " + self.probsurf + ", does not appear to be a valid raster."
+        
+        try:
+            self.pointcount = int(self.pointcount)
+        except:
+            raise RuntimeError, "The supplied point count parameter, " + self.pointcount +", does not appear to be an integer"
+        
+        #make sure the directory the mds file is going into exists:
+        outDir = os.path.split(self.outputMDS)[0]
+        if not os.path.exists(outDir):
+            raise RuntimeError, "The directory of the supplied MDS output file path, " + self.outputMDS +", does not appear to exist on the filesystem"
+        
+        if self.logger is None:
+            self.logger = utilities.logger(outDir, self.verbose)  
+        self.writetolog = self.logger.writetolog
+            
+    def run(self):
+        '''
+        This routine loops through a set of rasters and creates an MDS file
+        '''
+        
+        self.validateArgs()
+        self.writetolog('\nRunning MDSBuilder', True, True)
+        # start timing
+        startTime = time.time()
+        gdal.UseExceptions()
+        gdal.AllRegister()
+        
+        self.constructEmptyMDS()
+        
+        if self.pointcount <> 0:
+            self.addBackgroundPoints()
+        
+        outputRows = self.readInPoints()
+        
+        #loop though each of the supplied rasters and add the 
+        #extracted values to
+        for input in self.inputs:
+            inputND = self.getND(input)
+            rasterDS = gdal.Open(input, gdalconst.GA_ReadOnly)
+            # get image size
+            rows = rasterDS.RasterYSize
+            cols = rasterDS.RasterXSize
+            band = rasterDS.GetRasterBand(1)
+            # get georeference info
+            transform = rasterDS.GetGeoTransform()
+            xOrigin = transform[0]
+            yOrigin = transform[3]
+            pixelWidth = transform[1]
+            pixelHeight = transform[5]
+            
+            if self.verbose:
+                self.writetolog("    Extracting raster values for " + input)
+                print "    ",
+            
+            pcntDone = 0
+            i = 1
+            badpoints = []
+            for row in outputRows:
+                x = float(row[0])
+                y = float(row[1])
+                # compute pixel offset
+                xOffset = int((x - xOrigin) / pixelWidth)
+                yOffset = int((y - yOrigin) / pixelHeight)
+#                try:
+                if xOffset < 0 or yOffset < 0:
+                    if row[:3] not in badpoints:
+                        badpoints.append(row[:3])
+                    row.append(str(self.NDFlag))
+                else:
+                    try:
+                        data = band.ReadAsArray(xOffset, yOffset, 1, 1)
+                        value = data[0,0]
+                        if value <> inputND:
+                            row.append(value)
+                        else:
+                            row.append(str(self.NDFlag))
+                    except:
+                        badpoints.append(row[:3])
+                        row.append(str(self.NDFlag))
+                
+                if self.verbose:
+                    if i/float(len(outputRows)) > float(pcntDone)/100:
+                        pcntDone += 10
+                        print str(pcntDone) + "...",
+                i += 1
+            if self.verbose:
+                self.writetolog("    Done")
+        if len(badpoints) > 0:
+                msg =  "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+                msg += "\n!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+                msg += str(len(badpoints)) + " point fell outside the Covariate coverage."
+                msg += "\nThese points were assigned the NoData value of -9999 for all covariates and will"
+                msg += "not be included in subsequent models.\n     These points are:"
+                for badpoint in badpoints:
+                    msg += "     x:" + str(row[0]) + " Y: " + str(row[1]) + " response: " + str(row[2]) 
+                self.writetolog(msg)
+            
+            
+        outputMDS = csv.writer(open(self.outputMDS, 'ab'))
+        thrownOut = 0
+        kept = 0
+        for row in outputRows:
+            #remove this if when Marian handles the ND   
+            if not str(self.NDFlag) in row[3:]:
+                outputMDS.writerow(row)
+                kept += 1
+            else:
+                outputMDS.writerow(row)
+                thrownOut += 1
+        if thrownOut > 0:
+            msg =  "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+            msg += "\n!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+            msg += str(thrownOut) + " points had 'nodata' in at least one of the covariates."
+            msg += "\nThese points will not be considered in subsequent Models."
+            msg +=  "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+            msg +=  "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+            self.writetolog(msg)
+        del outputMDS
+        
+        #convert the mds csv to a shapefile
+        output_shp = self.outputMDS.replace(".csv", ".mds")
+        utilities.mds_to_shape(self.outputMDS, output_shp)
+        
+        # figure out how long the script took to run
+        endTime = time.time()
+        
+        if self.deleteTmp:
+            #if this flag is trud the field data we're working with is 
+            # a temporary copy which we created so that we could add
+            # background points.  Delete it to clean up our working file.
+            os.remove(self.fieldData)
+        
+        if self.verbose:
+            self.writetolog('Finished running MDSBuilder', True, True)
+            self.writetolog('    The process took ' + str(endTime - startTime) + ' seconds')
+        
+    def constructEmptyMDS(self):
+        '''Creates the triple header line format of our output file.
+        Also parses the inputs file to append the '_categorical' flag 
+        to the covariate names of all categorical inputs.
+        '''        
+        
+        field_data_CSV = csv.reader(open(self.fieldData, "r"))
+        orig_header = field_data_CSV.next()
+        full_header = ["x", "y"]
+        if orig_header[2].lower not in ["responsebinary", "responsecount"]:
+            #inputs not conforming to our expected format will be assumed
+            #to be binary data
+            full_header.append("responseBinary")
+        else:
+            full_header.append(orig_header[2])
+        
+        inputs_CSV = csv.reader(open(self.inputsCSV, "r"))
+        inputs_header = inputs_CSV.next()
+        self.inputs = []
+
+        #each row contains a covariate raster layer
+        #item 0 is the full path to the file
+        #item 1 is 0/1 indicating categorical
+        #Construct our output header by extracting each individual 
+        #file (raster) name and appending '_categorical' if the flag is 1
+        rasters = {}
+        for row in inputs_CSV:
+            temp_raster = row[0]
+#            self.inputs.append(temp_raster)
+            raster_shortname = os.path.split(temp_raster)[1]
+            raster_shortname = os.path.splitext(raster_shortname)[0]
+            if len(row) > 1 and row[1] == '1':
+                raster_shortname += "_categorical"
+            rasters[raster_shortname] = temp_raster
+            
+        keys = rasters.keys()
+        keys.sort(key=lambda s: s.lower())
+        keys.sort(key=lambda s: s.lower())
+        for key in keys:
+            self.inputs.append(rasters[key])
+            full_header.append(key)
+
+        #Open up and write to an output file
+        oFile = open(self.outputMDS, 'wb')
+        fOut = csv.writer(oFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
+        
+        #Format and write out our three header lines
+        #    the original template, fieldData, and parc folder are 
+        #    stored in spots 1,2,3 in the second header line
+        if len(orig_header) > 7 and os.path.exists(orig_header[7]):
+            #The input is an output from Field data query
+            original_field_data = orig_header[7]
+            field_data_template = orig_header[8]
+        else:
+            #The input is a raw field data file
+            original_field_data = self.fieldData
+            field_data_template = "NA"
+        
+        if len(inputs_header) > 5:
+            parc_template = inputs_header[5]
+            parc_workspace = inputs_header[6]
+        else:
+            parc_template = "Unknown"
+            parc_workspace = "Unknown"
+        
+        secondRow = [original_field_data, field_data_template, ""] + ["1" for elem in self.inputs]
+        thirdRow = [parc_template, parc_workspace, ""] + self.inputs
+        fOut.writerow(full_header)
+        fOut.writerow(secondRow)
+        fOut.writerow(thirdRow)
+        oFile.close()
+        del fOut
+    
+    def readInPoints(self):
+        '''Loop through each row in our field data and add the X, Y, response
+        to our in memory list of rows to write to our output MDS file
+        '''
+        fieldDataCSV = csv.reader(open(self.fieldData, "r"))
+        origHeader = fieldDataCSV.next()
+        points = []
+        for row in fieldDataCSV:
+            points.append(row[:3])
+            
+        del fieldDataCSV
+        return points
+    
+    def addBackgroundPoints(self):
+        '''Add pointcount number of points to the supplied field data
+        If a probability surface was provided the distribution will 
+        follow this otherwise it will be uniform within the extent of the first of our inputs.
+        No more than one per pixel is used.
+        '''
+        #First we'll create a temp copy of the Field Data to work with.
+        shutil.copy(self.fieldData, self.fieldData + ".tmp.csv")
+        self.fieldData = self.fieldData + ".tmp.csv"
+        self.deleteTmp = True
+        
+        if self.probsurf <> '':
+            rasterDS = gdal.Open(self.probsurf, gdalconst.GA_ReadOnly)
+            useProbSurf = True
+        else:
+            print self.inputs[0]
+            rasterDS = gdal.Open(self.inputs[0], gdalconst.GA_ReadOnly)
+            useProbSurf = False
+            
+        # get image size
+        rows = rasterDS.RasterYSize
+        cols = rasterDS.RasterXSize
+        band = rasterDS.GetRasterBand(1)
+        # get georeference info
+        transform = rasterDS.GetGeoTransform()
+        xOrigin = transform[0]
+        yOrigin = transform[3]
+        pixelWidth = transform[1]
+        pixelHeight = transform[5]
+        xRange = [xOrigin, xOrigin * pixelWidth * cols]
+        yRange = [yOrigin, yOrigin * pixelHeight * rows]
+        
+        #Open up and write to an output file
+        oFile = open(self.fieldData, 'ab')
+        fOut = csv.writer(oFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
+        
+        
+        if self.verbose:
+            self.writetolog('    Starting generation of ' + str(self.pointcount) + ' random background points, ')
+            if self.probsurf <> '':
+                self.writetolog('      using ' + self.probsurf + ' as the probability surface.')
+            print "    Percent Done:    ",
+        
+        foundPoints = 0 # The running count of how many we've found
+        pcntDone = 0 #for status bar
+        while foundPoints < self.pointcount: #loop until we find enough
+            x = random.randint(0, cols - 1) 
+            y = random.randint(0, rows - 1)
+            #print x, y
+            tmpPixel = [x, y, -9999] # a random pixel in the entire image
+            if useProbSurf:
+                # if they supplied a probability surface ignore the random pixel
+                # if a random number between 1 and 100 is > the probability surface value
+                pixelProb = int(band.ReadAsArray(tmpPixel[0], tmpPixel[1], 1, 1)[0,0])
+                #pixelProb is the extracted probability from the probability surface
+                rand = random.randint(1,100)
+                #rand is a uniform random integer between 1 and 100 inclusive
+                if rand > pixelProb:
+                    continue
+                    #don't record this pixel in our output file 
+                    #because our rand number was lower (or equal) than that pixel's probability
+                    
+            #convert our outValues for row, col to coordinates
+            tmpPixel[0] = xOrigin + tmpPixel[0] * pixelWidth
+            tmpPixel[1] = yOrigin + tmpPixel[1] * pixelHeight
+            
+            fOut.writerow(tmpPixel)
+            foundPoints += 1
+            if self.verbose:
+                if float(foundPoints)/self.pointcount > float(pcntDone)/100:
+                    pcntDone += 10
+                    print str(pcntDone) + "...",
+        print "Done!\n"
+        oFile.close()
+        del fOut
+    
+    def getRasters(self, directory):
+        #the list of rasters in the given directory
+        rasters = []
+        dirList = os.listdir(directory)
+        for file in [elem for elem in dirList if elem[-4:].lower() == ".tif"]:
+            if isRaster(os.path.join(directory, file)):
+                rasters.append(os.path.join(directory, file))
+        for file in [elem for elem in dirList if elem[-4:].lower() == ".asc"]:
+            if isRaster(os.path.join(directory,file)):
+                rasters.append(os.path.join(directory, file))
+        for folder in [name for name in dirList if os.path.isdir(os.path.join(directory, name)) ]:
+            if isRaster(os.path.join(directory, folder)):
+                rasters.append(os.path.join(directory, folder))
+    
+        return rasters
+    
+    def isRaster(self, filePath):
+        '''Verifies that a pased file and path is recognized by
+        GDAL as a raster file.
+        '''
+        try:
+            dataset = gdal.Open(filePath, gdalconst.GA_ReadOnly)
+            if dataset is None:
+                return False
+            else:
+                return True
+                del dataset
+        except:
+            return False
+        
+    def getND(self, raster):
+        dataset = gdal.Open(raster, gdalconst.GA_ReadOnly)
+        ND = dataset.GetRasterBand(1).GetNoDataValue()
+        if ND is None:
+            if dataset.GetRasterBand(1).DataType == 1:
+                print "Warning:  Could not extract NoData value.  Using assumed nodata value of 255"
+                return 255
+            elif dataset.GetRasterBand(1).DataType == 2:
+                print "Warning:  Could not extract NoData value.  Using assumed nodata value of 65536"
+                return 65536
+            elif dataset.GetRasterBand(1).DataType == 3:
+                print "Warning:  Could not extract NoData value.  Using assumed nodata value of 32767"
+                return 32767
+            elif dataset.GetRasterBand(1).DataType == 4:
+                print "Warning:  Could not extract NoData value.  Using assumed nodata value of 2147483647"
+                return 2147483647
+            elif dataset.GetRasterBand(1).DataType == 5:
+                print "Warning:  Could not extract NoData value.  Using assumed nodata value of 2147483647"
+                return 2147483647
+            elif dataset.GetRasterBand(1).DataType == 6:
+                print "Warning:  Could not extract NoData value.  Using assumed nodata value of -3.40282346639e+038"
+                return -3.40282346639e+038
+            else:
+                return None
+        else:
+            return ND
+
+def main(argv):
+    
+    usageStmt = "usage:  options: -f --fieldData -i --inCSV -o --output -pc --pointcount -ps --probsurf"
+    desc = "Creates a merged dataset file (mds) from a csv of field points and rasters located in a csv listing one raster per line.  Optionally this module adds a number of background points to the output."
+    parser = OptionParser(usage=usageStmt, description=desc)
+    
+    parser.add_option("-v", 
+                      dest="verbose", 
+                      default=False, 
+                      action="store_true", 
+                      help="the verbose flag causes diagnostic output to print")
+    parser.add_option("-f", "--fieldData", 
+                      dest="fieldData", 
+                      help="The input CSV of field data points")
+    parser.add_option("-i", "--inCSV", 
+                      dest="inputsCSV", 
+                      help="The input CSV containing a list of our inputs, one per line.")              
+    parser.add_option("-o", "--output", 
+                      dest="outputMDS", 
+                      help="Output MDS file to save to.")
+    parser.add_option("-p", "--probsurf", 
+                      dest="probsurf",
+                      default='', 
+                      help="Probability surface to use for generation of background points (optional)")
+    parser.add_option("-c", "--pointcount", 
+                      dest="pointcount",
+                      default=0, 
+                      help="Number of random background points to add(optional)")
+    
+    (options, args) = parser.parse_args(argv)
+    
+    ourMDS = MDSBuilder()
+    ourMDS.verbose = options.verbose
+    ourMDS.fieldData = options.fieldData
+    ourMDS.inputsCSV = options.inputsCSV
+    ourMDS.probsurf = options.probsurf
+    ourMDS.pointcount = options.pointcount
+    ourMDS.outputMDS = options.outputMDS
+    ourMDS.run()
+   
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/MaxentRunner.py b/contrib/sahm/pySAHM/MaxentRunner.py
new file mode 100644
index 0000000..fa8b762
--- /dev/null
+++ b/contrib/sahm/pySAHM/MaxentRunner.py
@@ -0,0 +1,319 @@
+'''
+Created on Sep 17, 2010
+
+ at author: talbertc
+'''
+
+import time
+import os, sys
+import csv
+import itertools
+import traceback
+
+import subprocess
+
+from optparse import OptionParser
+
+#from core.modules.vistrails_module import Module, ModuleError, ModuleConnector
+#from core.system import execute_cmdline
+
+
+
+import utilities
+#from packages.sahm.pySAHM.Utilites import self.writetolog
+
+from osgeo import gdalconst
+from osgeo import gdal
+from osgeo import osr
+
+class MAXENTRunner(object):
+    
+    def __init__(self):
+        self.verbose = False
+        self.maxentpath = ''
+        self.inputMDS = ''
+        self.projectionlayers = ''
+        self.testCSV = ''
+        self.trainingCSV = ''
+        self.backgroundCSV = ''
+        self.outputDir = ''
+        self.categoricals = []
+        self.argsCSV = ''
+        self.logger = None
+      
+    def run(self):
+        self.loadArgs()
+        self.args['outputdirectory'] = self.outputDir
+    
+#        if self.projectionlayers <> '':
+#            #A command line input overrides an input in the args csv
+#            self.args['projectionlayers'] = self.projectionlayers
+#    
+        self.validateInputs()
+    
+        if self.inputMDS <> '':
+            self.prepInputs()
+        else:
+            raise Exception, "No MDS supplied."
+
+        if not self.args.has_key('projectionlayers'):
+            self.args['projectionlayers'] = ''
+
+        if self.trainingCSV <> '':
+            self.args['samplesfile'] = self.trainingCSV
+        else:
+            raise Exception, "No Samples file supplied"
+        
+        if self.testCSV <> '':
+            self.args['testsamplesfile'] = self.testCSV
+        
+        if self.backgroundCSV <> '':
+            self.args['environmentallayers'] = self.backgroundCSV
+        
+        
+        self.args['autorun'] = 'true'
+        #self.args['outputgrids'] = 'false'
+        
+        if ' ' in self.args['species_name']:
+            self.args['species_name'] = self.args['species_name'].replace(' ', '_')
+        
+        strargs = ['='.join((str(k),str(v))) for k,v in self.args.iteritems() if k <> "species_name"]
+        for categorical in self.categoricals:
+            strargs += ['togglelayertype=' + categorical.replace('_categorical', '')]
+        #strargs = ' '.join(strargs)
+        #print strargs
+        
+        if not self.maxentpath.endswith('.jar'):
+            jar = os.path.join(self.maxentpath, 'maxent.jar')
+        else:
+            jar = self.maxentpath
+            
+        self.run_cmd_line_jar(jar, strargs)
+        
+           
+    def run_cmd_line_jar(self, jar_name, args):
+        #arg_items = list(itertools.chain(*args.items()))
+        #arg_items = ['='.join((str(k),str(v))) for k,v in args.iteritems()]
+        
+        cmd = ' '.join(['java', '-mx512m',  '-jar', jar_name] + args)
+         
+        self.writetolog('    running:  ' + cmd, True, False)
+        #res = execute_cmdline(['java', '-jar', jar_name] + args, output)
+        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        self.writetolog('    Finished running:  ', True, False)
+        
+        
+        ret = p.communicate()
+        self.writetolog('    Maxent strOut:  ' + str(ret[0]))
+        if ret[1] is not None:
+            msg = "An error was encountered running the Maxent jar file.  The error message is below - \n"
+            msg += ret[1]
+            writetolog(msg)
+            raise RuntimeError , msg
+        del ret
+
+    def loadArgs(self):
+        argsReader = csv.reader(open(self.argsCSV, 'r'))
+        header = argsReader.next()
+        self.args = {}
+        for row in argsReader:
+            self.args[row[0]] = row[1]
+    
+    def validateInputs(self):
+        if not os.path.exists(self.argsCSV):
+            raise RuntimeError(self, 'Input argsFile, ' + self.argsCSV + ', could not be found on file system')
+        
+        if not os.path.exists(self.inputMDS):
+            raise RuntimeError(self, 'Input MDS, ' + self.inputMDS + ', could not be found on file system')
+        
+        if not self.args.has_key('projectionlayers'):
+             self.args['projectionlayers'] = ''
+             
+        if self.args['projectionlayers'] <> '':
+             dirs = self.args['projectionlayers'].split(',')
+             for dir in dirs:
+                 if not os.path.isdir(dir):
+                     raise RuntimeError(self, "Input 'projectionlayers' must be a directory")
+        
+        if not utilities.isMDSFile(self.inputMDS):
+            raise RuntimeError(self, 'Input MDS, ' + self.inputMDS + ', does not appear to be formated as an MDS file.')
+    
+        if not os.path.exists(self.outputDir):
+            raise RuntimeError(self, 'Output directory, ' + self.outputDir + ', could not be found on file system')
+        
+        if self.logger is None:
+            self.logger = utilities.logger(outDir, self.verbose)
+        self.writetolog = self.logger.writetolog
+    
+    def prepInputs(self):
+        '''parses out input MDS file into the 1 to 3 SWD files that Maxent requires.
+        '''
+        
+        #Create the outputs in our outputdirectory
+        self.testCSV = os.path.join(self.outputDir, 'testSamples.csv')
+        self.trainingCSV = os.path.join(self.outputDir, 'trainingSamples.csv')
+        self.backgroundCSV = os.path.join(self.outputDir, 'backgroundPoints.csv')
+        
+        testWriter = csv.writer(open(self.testCSV, 'wb'))
+        trainingWriter = csv.writer(open(self.trainingCSV, 'wb'))
+        backgroundWriter = csv.writer(open(self.backgroundCSV, 'wb'))
+        
+        #Read through the MDS and pull the headers
+        MDSreader = csv.reader(open(self.inputMDS, 'r'))
+        header1 = MDSreader.next()
+        header2 = MDSreader.next()
+        header3 = MDSreader.next()
+        
+        self.pullCategoricals(header1)
+
+        #The split column indicates that this file has been run through the 
+        #test training split and testing data should be writen to the test file.
+        splitcol = None
+        try:
+            splitcol = header1.index('Split')
+            deleteTest = False
+        except ValueError:
+            self.writetolog("    The supplied MDS does not have a 'Split' column defaulting to having Maxent apply test/training split.")        
+            deleteTest = True
+            
+        covariateIndexes = self.usedIndexes(header1, header2)        
+        covariateNames = self.usedValues(header1, covariateIndexes)
+        covariateNamesClean = [name.replace('_categorical', '') for name in covariateNames]
+        usedCovariateFiles = self.usedValues(header3, covariateIndexes)
+        
+        self.writetolog('    Used covariates:' +  ", ".join(covariateNames), False, False)
+             
+        testWriter.writerow(['full_name', 'x', 'y'] + covariateNamesClean)
+        trainingWriter.writerow(['full_name', 'x', 'y'] + covariateNamesClean)
+        backgroundWriter.writerow(['full_name', 'x', 'y'] + covariateNamesClean)
+        
+        #loop through the rows sending each row to the appropriate file
+        hasBackground = False
+        for row in MDSreader:
+            if row[2] == '-9999':
+                hasBackground = True
+                vals = self.usedValues(row, covariateIndexes)
+                backgroundWriter.writerow([''] + row[:2] + vals)
+            elif splitcol is None and row[2] <> 0:
+                vals = self.usedValues(row, covariateIndexes)
+                trainingWriter.writerow([self.args['species_name']] + row[:2] + vals)
+            elif (row[splitcol] == 'test' and row[2] <> 0) or \
+                self.testCSV == '':
+                vals = self.usedValues(row, covariateIndexes)
+                testWriter.writerow([self.args['species_name']] + row[:2] + vals)
+            elif row[splitcol] == 'train'  and row[2] <> 0:
+                vals = self.usedValues(row, covariateIndexes)
+                trainingWriter.writerow([self.args['species_name']] + row[:2] + vals)
+            #any absense points (row[2] == 0) will be ignored for maxent
+        
+        if not hasBackground:
+            msg = "    No background points were detected in the input file."
+            msg += "\n    This implementation of Maxent does not have access to prepared ASCII environmental layers"
+            msg += " from which to extract values.  Background points must be supplied in the MDS file."
+            self.writetolog(msg)
+            raise RuntimeError(msg)
+        
+        #del our writers 
+        try:
+            del testWriter
+            if deleteTest:
+                os.remove(self.testCSV)
+                self.testCSV = ''
+            del backgroundWriter
+            if not hasBackground:
+                os.remove(self.backgroundCSV)
+                self.backgroundCSV = ''
+            del trainingWriter
+        except:
+            print ' '.join([str(i) for i in sys.exc_info()[:2]])
+            pass
+        
+        #First we have to figure out what they passed us
+        #either a directory, a SWD file, or a csv with a list of files
+        
+        if self.args['projectionlayers'] <> '':
+            pass
+        else:
+            self.args['outputgrids'] = 'false'
+
+    def usedIndexes(self, header1, header2):
+        covariateIndexes = []
+        for i in range(len(header1)):
+            if header2[i] == '1' and header1[i] <> 'Split':
+                covariateIndexes.append(i)
+        return covariateIndexes
+      
+    def usedValues(self, values, indexes):
+        usedvals = []
+        for i in indexes:
+            usedvals.append(values[i])
+        return usedvals
+    
+    def pullCategoricals(self, headerline):
+        for item in headerline:
+            if item.endswith('_categorical'):
+                self.categoricals.append(item)
+        
+        
+    def isSWD(self, file):
+        '''Checks the format of a file to see if it is in the 
+        Maxent samples with data (SWD) format.
+        '''
+        if os.path.exists(file):
+            reader = csv.reader(open(file, 'r'))
+            header = reader.next()
+            if header[0].lower() in ['species', 'full_name', 'fullname']:
+                return True
+        
+        return False
+
+
+def main(argv):
+    '''Process our command line args and initiate a Maxent run
+    '''
+    usageStmt = "usage:  -m --MDSFile -a --argsCSV -o --outputDir"
+    desc = "Formats and prepares input for running the Maxent Jar in a SAHM workflow"
+
+    parser = OptionParser(usage=usageStmt, description=desc)
+    parser.add_option("-m", "--MDSFile", 
+                      dest="MDSFile", 
+                      help="The MDS file with our sample data.")
+#    parser.add_option("-p", "--projectionData", 
+#                      dest="projectionData", 
+#                      help="An optional CSV with a projection file for each of our environemnetal layers.")
+    parser.add_option("-a", "--argsCSV", 
+                      dest="argsCSV", 
+                      help="A CSV with each Maxent argument name and it's value on separate lines.")
+    parser.add_option("-e", "--maxentExecutable", 
+                  dest="maxentExecutable", 
+                  help="The full path to the maxent executable jar file.")
+    parser.add_option("-o", "--outputDir", 
+                      dest="outputDir", 
+                      help="The directory to save output files.")
+    parser.add_option("-v", "--verbose", 
+                  dest="verbose", 
+                  default=False, 
+                  action="store_true",
+                  help="the verbose flag causes diagnostic output to print")
+
+    (options, args) = parser.parse_args(argv)
+
+    ourMaxent = MAXENTRunner()
+    ourMaxent.verbose = options.verbose
+    ourMaxent.maxentpath = options.maxentExecutable
+    ourMaxent.inputMDS = options.MDSFile
+    ourMaxent.outputDir = options.outputDir
+    ourMaxent.argsCSV = options.argsCSV
+    ourMaxent.projectionDataFile = options.projectionData
+
+    utilities.createsessionlog(options.outputDir, options.verbose)
+    ourMaxent.run()
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
+    
+
+
+
+
+
diff --git a/contrib/sahm/pySAHM/PARC.py b/contrib/sahm/pySAHM/PARC.py
new file mode 100644
index 0000000..3417301
--- /dev/null
+++ b/contrib/sahm/pySAHM/PARC.py
@@ -0,0 +1,776 @@
+#!/usr/bin/python
+
+import glob
+import math
+import os
+import shutil
+import struct
+import sys
+import csv
+import Queue
+import thread
+import subprocess
+
+from optparse import OptionParser
+
+from osgeo import gdalconst
+from osgeo import gdal
+from osgeo import osr
+
+
+from numpy import *
+import numpy as np
+
+import utilities
+
+def main(args_in):
+    """
+    Process commandline Arguments, 
+    Create an instance of PARC with the Variables,
+    Kick off the parkFiles function of our PARC instance
+    """
+    # Process command-line args.  
+    usageStmt = "usage:  %prog [options] <template image> <input dir or list of input files>"
+    desc = "This application projects, aggregates, resamples, and clips imagery."
+    
+    parser = OptionParser(usage=usageStmt, description=desc)
+    parser.add_option("-l", dest="listMethodFlag", default=False, action="store_true", help="print the names of all known aggregation methods")
+    parser.add_option("-o", dest="out_dir", default="./", help="directory in which to put processed images, defaults to current directory")
+    parser.add_option("-v", dest="verbose", default=False, action="store_true", help="the verbose flag causes diagnostic output to print")
+    parser.add_option("-t", dest="templateRaster", help="The template raster used for projection, origin, cell size and extent")
+    parser.add_option("-i", dest="inputs_CSV", help="The CSV containing the list of files to process.  Format is 'FilePath, Categorical, Resampling, Aggreagtion")
+    parser.add_option("-m", dest="multicore", default=True, help="'True', 'False' indicating whether to use multiple cores or not") 
+    (options, args) = parser.parse_args(args_in)
+    
+    ourPARC = PARC()
+    ourPARC.verbose = options.verbose
+    ourPARC.template = options.templateRaster
+    ourPARC.out_dir = options.out_dir
+    ourPARC.inputs_CSV = options.inputs_CSV
+    ourPARC.multicores = options.multicore
+    ourPARC.parcFiles()
+
+class PARC:
+    '''
+     PARC:  Project, Aggregate, Resample, Clip
+      The workflow on this beast is as follows:
+            For each dataset
+            Step 1: RePrject the source raster into a tmp raster using
+                the projection info from the template and the method if 
+                supplied or the default of nearest if not.
+                At this stage the tmp output will have a cell size about
+                the same as the input.  We just use the default for this 
+                setting.
+            Step 2: Aggregate the tmpRaster to have the same origin, 
+                cell size and extent as our template.
+    '''    
+    
+    def __init__(self):
+        #instance level variables
+        self.verbose = False
+        self.template = ""
+        self.template_params = {}
+        self.out_dir = ""
+        self.inputs_CSV = ''
+        self.inputs = []
+        self.agg_methods = ['Min', 'Mean', 'Max', 'Majority']
+        self.resample_methods = ['NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline', 'Lanczos']
+        self.logger = None
+        self.multicores = 'False'
+        self.module = None
+
+    def parcFiles(self):
+        '''
+            1: Parse the inputs_CSV into our inputs list
+            2: Make sure all of our instance variables are good and proper
+            3: Loop through the list of sourceImages and PARC each one.
+            4: The outputs will be stored in the output directory
+            5: Additionally an output CSV will be produced that lists the 
+            inputs, parameters used, and outputs
+        '''
+        
+        self.logger.writetolog("Starting PARC", True, True)
+        self.validateArgs()
+        self.logger.writetolog("    Arguments validated successfully", True, True)
+        if self.multicores.lower() in ['true', 'yes', 't', 'y', '1']:
+            self.processFilesMC()
+        else:
+            self.processFiles()
+        
+        self.logger.writetolog("Finished PARC", True, True)
+        
+    def processFiles(self):
+        # Clip and reproject each source image.
+        for image in self.inputs:
+            # Ensure source is different from template.
+            #if not os.path.samefile(template, image):
+            inPath, inFileName = os.path.split(image[0])
+            outFile, ext = os.path.splitext(inFileName) 
+            outFile = os.path.join(self.out_dir, outFile + ".tif")
+            
+            # os.path.samefile(image, outFile):
+            if os.path.exists(outFile) and \
+               os.path.abspath(image[0]) == os.path.abspath(outFile):
+
+                baseName, extension = os.path.splitext(outFile)
+                outFile = baseName + "-PARC.tif"
+                
+            if os.path.abspath(self.template) != os.path.abspath(image[0]):
+                self.parcFile(image, outFile)
+            elif os.path.abspath(self.template) == os.path.abspath(image[0]): 
+                shutil.copyfile(self.template, outFile)
+                
+		
+        
+    def processFilesMC(self):
+        '''This function has the same functionality as parcFiles
+        with the addition of utilizing multiple cores to do the processing.
+        '''
+        results= Queue.Queue()
+        process_count= 0
+        
+        for image in self.inputs:
+            # Ensure source is different from template.
+            #if not os.path.samefile(template, image):
+            inPath, inFileName = os.path.split(image[0])
+            outFile, ext = os.path.splitext(inFileName) 
+            outFile = os.path.join(self.out_dir, outFile + ".tif")
+            
+            # os.path.samefile(image, outFile):
+            if os.path.exists(outFile) and \
+               os.path.abspath(image[0]) == os.path.abspath(outFile):
+
+                baseName, extension = os.path.splitext(outFile)
+                outFile = baseName + "-PARC.tif"
+            
+            if os.path.abspath(self.template) != os.path.abspath(image[0]):
+                image_short_name = os.path.split(image[0])[1]
+                args = '-s ' + '"' + os.path.abspath(image[0]) + '"'
+                args += ' -c '  + '"' + image[1] + '"'
+                args += ' -d ' + os.path.abspath(outFile)
+                args += ' -t ' + os.path.abspath(self.template)
+                args += ' -r ' + image[2]
+                args += ' -a ' + image[3]
+                
+                execDir = os.path.split(__file__)[0]
+                executable = os.path.join(execDir, 'singlePARC.py')
+                
+                pyEx = sys.executable
+                command = ' '.join([pyEx, executable, args])
+                self.logger.writetolog(command, False, False)
+                proc = subprocess.Popen( command )
+                thread.start_new_thread(utilities.process_waiter,
+                        (proc, image_short_name, results))
+                process_count+= 1
+            
+        while process_count > 0:
+            description, rc= results.get()
+            
+            if rc == 0:
+                if self.verbose:
+                    msg = "    " + description + " finished successfully:  " + \
+                        str(len(self.inputs) - process_count + 1)  + " done out of " \
+                        + str(len(self.inputs))
+                    self.logger.writetolog(msg, True, True)
+            else:
+                self.logger.writetolog("There was a problem with: " + description , True, True)
+            process_count-= 1
+                
+        
+        
+        self.logger.writetolog("Finished PARC", True, True)
+
+    def parcFile(self, source, dest):
+        """
+        Processes a single file
+        """
+        gdal.UseExceptions()
+        
+        shortName = os.path.split(os.path.splitext(source[0])[0])[1]
+        self.logger.writetolog("    Starting processing of " + source[0])
+        sourceParams = self.getRasterParams(source[0])
+                
+        gdalType = None
+        if source[2].lower() == "nearestneighbor":
+            gdalType = gdalconst.GRA_NearestNeighbour
+        if source[2].lower() == "bilinear":
+            gdalType = gdalconst.GRA_Bilinear
+        if source[2].lower() == "cubic":
+            gdalType = gdalconst.GRA_Cubic
+        if source[2].lower() == "cubicspline":
+            gdalType = gdalconst.GRA_CubicSpline
+        if source[2].lower() == "lanczos":
+            gdalType = gdalconst.GRA_Lanczos
+        if gdalType == None:
+            self.logger.writetolog("   Specified resampling method (" + source[2] + ") not one of 'NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline', or 'Lanczos'.  Defaulting to 'NearestNeighbor'")
+            gdalType = gdalconst.GRA_NearestNeighbour
+        
+        #Open dgal dataset of the source to pull some values from
+        srcDs = gdal.Open(source[0])
+        
+        cellRatio = self.getTemplateSRSCellSize(sourceParams)/self.template_params["xScale"]
+        msg = "  ratio of source cell size to template cell size = " + str(cellRatio)
+        msg += "    template cell size = " + str(self.template_params["xScale"])
+        msg += "    " + shortName + " cell size = " + str(self.getTemplateSRSCellSize(sourceParams))
+        self.writetolog(msg)
+            
+        if cellRatio > 0.5:
+            #The source cell size is close enough to our template cell size,
+            #or smaller so
+            #that all we need to do is reproject and resample.
+            self.logger.writetolog("  cell ratio > .5: reprojecting and resampling to template parameters only")
+            self.reprojectRaster(srcDs, sourceParams, self.template_params, dest, 
+                                gdalType, shortName, self.template_params["xScale"])
+        else:
+            #Our Target cell size is much bigger than our source we need to do 
+            #some aggregation to make things work.
+            msg = '  cell ratio <= .5: reprojecting and resampling to template parameters'
+            msg += '    then aggregating the reprojected raster to match template parameters'
+            self.writetolog(msg)   
+			    
+            targetCellSize, numSourcePerTarget = self.getAggregateTargetCellSize(sourceParams)
+            tmpOutput = os.path.join(os.path.dirname(dest), "tmp_" + os.path.basename(dest))
+            
+            self.reprojectRaster(srcDs, sourceParams, self.template_params,
+                                tmpOutput, gdalType,  shortName, targetCellSize)
+            self.writetolog("   Starting on Aggregating: " + shortName)
+                
+            tmpOutput2 = os.path.splitext(tmpOutput)[0] + ".tif"
+            self.Aggregate(tmpOutput2, dest, 
+                        sourceParams, self.template_params,
+                        source[3], numSourcePerTarget)
+            
+            try:
+                os.remove(tmpOutput2)
+            except WindowsError:
+                pass
+            
+    
+    def getTemplateSRSCellSize(self, sourceParams):
+        """
+        Calculate what size our source image pixels would be in the template SRS
+        """
+        #first convert our template origin into the source srs
+        tOriginX, tOriginY = self.transformPoint(self.template_params["west"], self.template_params["north"], 
+                                        self.template_params["srs"], sourceParams["srs"])
+        #next add the source xScale to the converted origin x and convert that back to template srs
+        tOriginX1 = self.transformPoint (tOriginX + sourceParams["xScale"], tOriginY, 
+                                                sourceParams["srs"], self.template_params["srs"])[0]                        
+        
+        
+#        templateCellXCorner1 = (self.template_params["west"], self.template_params["north"], 
+#                                        self.template_params["srs"], sourceParams["srs"])[0]
+#        
+#        targetCellXCorner1 = (sourceParams["west"], sourceParams["north"], 
+#                                                sourceParams["srs"], self.template_params["srs"])[0]
+#        targetCellXCorner2 = self.transformPoint(sourceParams["west"] + sourceParams["xScale"], 
+#                                                sourceParams["north"], sourceParams["srs"], self.template_params["srs"])[0]
+        templateSRSCellSize = abs(abs(tOriginX1) - abs(self.template_params["west"]))
+        return templateSRSCellSize
+
+    def getAggregateTargetCellSize(self, sourceParams):
+        """
+        This function determines the appropriate cell size to
+        reproject/resample our source raster into before 
+        aggregating.
+        This size is the cell size that results in a template 
+        cell containing a whole number of cells which are as 
+        close as possible to the cell dimension that would 
+        result if you reprojected the source cells into the 
+        target srs without changing cell size.
+        """
+        #first determine what cell size we are going to use for the initial reproject/resample 
+        #step 1:  Determine the native cell size in the template coordinate system.
+        templateSRSCellSize = self.getTemplateSRSCellSize(sourceParams)
+        #step 2:  round this up or down to an even fraction of the template cell size
+        # for example source = 30, target = 250 resampledSource = 250/round(250/30)
+        sourcePixelsPerTarget = round(self.template_params["xScale"]/templateSRSCellSize)
+        nearestWholeCellSize = (self.template_params["xScale"] / 
+                            sourcePixelsPerTarget)
+        return nearestWholeCellSize, sourcePixelsPerTarget
+        
+        
+    def Aggregate(self, inFile, outFile, sourceParams, templateParams, method=None, numSourcePerTarget=10):
+        sourceDs = gdal.Open(inFile, gdalconst.GA_ReadOnly)
+        sourceBand  = sourceDs.GetRasterBand(1)
+        
+        tmpOutput = os.path.splitext(outFile)[0] + ".tif"
+        tmpOutDataset = self.generateOutputDS(sourceParams, templateParams, tmpOutput)
+        outBand = tmpOutDataset.GetRasterBand(1)
+        
+        rows = int(sourceParams["height"])
+        cols = int(sourceParams["width"])
+
+        row = 0
+        col = 0
+        
+        
+        pcntDone = 0.0
+        if self.verbose:
+            print "    % Done:    0.0",
+            
+        while row < templateParams["width"]:
+            while col < templateParams["height"]:
+                sourceRow = row * numSourcePerTarget
+                sourceCol = col * numSourcePerTarget
+
+                #kernel = self.getKernel(sourceRow, sourceCol, numSourcePerTarget, sourceDs)
+                kernel = sourceDs.GetRasterBand(1).ReadAsArray(int(sourceRow), 
+                                                    int(sourceCol), 
+                                                    int(numSourcePerTarget),
+                                                    int(numSourcePerTarget))
+                #convert kernel values of our nodata to nan
+                ndMask = ma.masked_array(kernel, mask=(kernel==sourceParams["NoData"]))
+                #print kernel
+                if method == "Min":
+                    ans = ndMask.min()
+                elif method == "Max":
+                    ans = ndMask.max()
+                elif method == "Majority":
+#                    ndMask = ndMask.flatten()
+                    uniques = np.unique(ndMask)
+                    curMajority = -3.40282346639e+038
+                    for val in uniques:
+                        numOccurances = (array(ndMask)==val).sum()
+                        if numOccurances > curMajority:
+                            ans = val
+                            curMajority = numOccurances
+                            
+#                    histogram = np.histogram(ndMask, uniques)
+#                    ans = histogram[1][histogram[0].argmax()]
+                else:
+                    ans = ndMask.mean()
+                
+#                print ndMask
+#                print ans
+                #special case real ugly
+                if ans < 0 and sourceParams["signedByte"]:
+                    ans = ans + 255
+                
+                ansArray = empty([1, 1])
+                if type(ans) == ma.core.MaskedArray:
+                    ansArray[0, 0] = sourceParams["NoData"]
+                else:
+                    ansArray[0, 0] = ans
+
+                outBand.WriteArray(ansArray, row, col)
+                
+                col += 1
+                
+            row += 1
+            col  = 0
+            if self.verbose:
+                if float(row)/templateParams["width"] > float(pcntDone)/100:
+                    pcntDone += 2.5
+                    if int(pcntDone) % 10 == 0:
+                        print str(pcntDone),
+                    else:
+                        print ".",
+        if self.verbose:
+            print "Done"
+#        if self.verbose:
+#            print "Done\nSaving to ASCII format"
+#                            
+#        driver = gdal.GetDriverByName("AAIGrid")
+#        driver.Register()
+#        
+#        dst_ds = driver.CreateCopy(outFile, tmpOutDataset, 0)
+#        if self.verbose:
+#            print "    Finished Saving ", self.shortName
+        
+        dst_ds = None
+        tmpOutDataset=None
+        
+    def getRasterParams(self, rasterFile):
+        """
+        Extracts properties from a passed raster
+        All values are stored in a dictionary which is returned.
+        If errors are encountered along the way the error messages will
+        be returned as a list in the 'Error' element.
+        """
+        try:
+            #initialize our params dictionary to have None for all parma
+            params = {}
+            allRasterParams = ["Error", "xScale", "yScale", "width", "height",
+                            "east", "north", "west", "south",  
+                            "tEast", "tNorth", "tWest", "tSouth",
+                            "gEast", "gNorth", "gWest", "gSouth",  
+                            "Wkt", "srs", "gt", "prj", "NoData", "PixelType", "file_name"]
+            
+            for param in allRasterParams:
+                params[param] = None
+            params["Error"] = []
+            params["file_name"] = rasterFile
+
+            
+            # Get the PARC parameters from the rasterFile.
+            dataset = gdal.Open(rasterFile, gdalconst.GA_ReadOnly)
+            if dataset is None:
+                params["Error"].append("Unable to open file")
+                return params
+                
+                #print "Unable to open " + rasterFile
+                #raise Exception, "Unable to open specifed file " + rasterFile
+                
+            
+            xform  = dataset.GetGeoTransform()
+            params["xScale"] = xform[1]
+            params["yScale"] = xform[5]
+    
+            params["width"]  = dataset.RasterXSize
+            params["height"] = dataset.RasterYSize
+    
+            params["west"] = xform[0]
+            params["north"] = xform[3]
+            params["east"] = params["west"] + params["width"]  * params["xScale"]
+            params["south"] = params["north"] + params["height"] * params["yScale"]
+    
+            try:
+                wkt = dataset.GetProjection()
+                params["gt"] = dataset.GetGeoTransform()
+                params["prj"] = dataset.GetProjectionRef()
+                params["srs"] = osr.SpatialReference(wkt)
+                if wkt == '':
+                    params["Error"].append("Undefined projection")
+                else:
+                    
+                    if rasterFile == self.template:
+                        params["tWest"], params["tNorth"] = params["west"], params["north"]
+                        params["tEast"], params["tSouth"] = params["east"], params["south"]
+                    elif params["srs"].ExportToWkt() == self.template_params["srs"].ExportToWkt():
+                        params["tWest"], params["tNorth"] = params["west"], params["north"]
+                        params["tEast"], params["tSouth"] = params["east"], params["south"]
+                    else:
+                        try:
+                            params["tWest"], params["tNorth"] = self.transformPoint(params["west"], params["north"], params["srs"], self.template_params["srs"])
+                            params["tEast"], params["tSouth"] = self.transformPoint(params["east"], params["south"], params["srs"], self.template_params["srs"])
+                        except:
+                            params["Error"].append("Could not transform extent coordinates to template spatial reference")
+                            #params["Error"] = "We ran into problems converting projected coordinates to template for " +  rasterFile
+                    try:
+                        geographic = osr.SpatialReference()
+                        geographic.ImportFromEPSG(4326)
+                        params["gWest"], params["gNorth"] = self.transformPoint(params["west"], params["north"], params["srs"], geographic)
+                        params["gEast"], params["gSouth"] = self.transformPoint(params["east"], params["south"], params["srs"], geographic)
+                    except:
+                        pass
+                    
+            except:
+                #print "We ran into problems getting the projection information for " +  rasterFile
+                params["Error"].append("Undefined problems extracting the projection information")
+                
+            try:
+                params["signedByte"] = dataset.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE')['PIXELTYPE'] == 'SIGNEDBYTE'
+            except KeyError:
+                params["signedByte"] = False
+            
+            params["NoData"] = dataset.GetRasterBand(1).GetNoDataValue()
+            if params["NoData"] == None:
+                if dataset.GetRasterBand(1).DataType == 1:
+                    print "Warning:  Could not extract NoData value.  Using assumed nodata value of 255"
+                    params["NoData"] = 255
+                elif dataset.GetRasterBand(1).DataType == 2:
+                    print "Warning:  Could not extract NoData value.  Using assumed nodata value of 65536"
+                    params["NoData"] = 65536
+                elif dataset.GetRasterBand(1).DataType == 3:
+                    print "Warning:  Could not extract NoData value.  Using assumed nodata value of 32767"
+                    params["NoData"] = 32767
+                elif dataset.GetRasterBand(1).DataType == 4:
+                    print "Warning:  Could not extract NoData value.  Using assumed nodata value of 2147483647"
+                    params["NoData"] = 2147483647
+                elif dataset.GetRasterBand(1).DataType == 5:
+                    print "Warning:  Could not extract NoData value.  Using assumed nodata value of 2147483647"
+                    params["NoData"] = 2147483647
+                elif dataset.GetRasterBand(1).DataType == 6:
+                    print "Warning:  Could not extract NoData value.  Using assumed nodata value of -3.40282346639e+038"
+                    params["NoData"] = -3.40282346639e+038
+                else:
+                    params["Error"].append("Could not identify nodata value")
+            params["PixelType"] = dataset.GetRasterBand(1).DataType
+            if params["PixelType"] == None:
+                params["Error"].append("Could not identify pixel type (bit depth)")
+            
+        except:
+            #print "We ran into problems extracting raster parameters from " + rasterFile
+            params["Error"].append("Some untrapped error was encountered")
+        finally:
+            del dataset
+            return params
+
+    def transformPoint(self, x, y, from_srs, to_srs):
+        """
+        Transforms a point from one srs to another
+        """
+        coordXform = osr.CoordinateTransformation(from_srs, to_srs)
+        yRound = round(y, 4)
+        xRound = round(x, 4)
+
+        result = coordXform.TransformPoint(xRound, yRound)
+        
+        gx = result[0]
+        gy = result[1]
+
+        return gx, gy
+        
+    def ImageCoversTemplate(self, sourceParams):
+        """
+        Checks to see if the template images 
+        falls completely inside the source raster
+        
+        it does this by generating a list of 16 coordinate
+        pairs equally distributed across the template,
+        including the four absolute corners.  
+        These points are in the CRS of the image.
+        If all of these points have a valid data or nodata
+        value in the image, then the image covers the template.
+        (in nearly every case anyway)
+        """
+        
+        n = 5
+        xOffset = (self.template_params["east"] - self.template_params["west"]) / (n) - \
+                    ((self.template_params["east"] - self.template_params["west"]) / self.template_params["width"] / 1000)
+        yOffset = (self.template_params["north"] - self.template_params["south"]) / (n) - \
+                    ((self.template_params["north"] - self.template_params["south"]) / self.template_params["height"] / 1000)
+        curX = self.template_params["west"]
+        curY = self.template_params["north"]
+        testPoints =[]
+        
+        for x in range(n + 1):
+            for y in range(n + 1):
+                testPoints.append(self.transformPoint(curX, curY, self.template_params["srs"], 
+                                                    sourceParams["srs"]))
+                curY -= yOffset
+                
+            curX += xOffset
+            curY = self.template_params["north"]  
+                
+        rasterDS = gdal.Open(sourceParams["file_name"], gdalconst.GA_ReadOnly)
+        band = rasterDS.GetRasterBand(1)
+        badPoint = False        
+        for point in testPoints:
+            try:
+                xOffset = int((point[0] - sourceParams["west"]) / sourceParams["xScale"])
+                yOffset = int((point[1] - sourceParams["north"]) / sourceParams["yScale"])
+                data = band.ReadAsArray(xOffset, yOffset, 1, 1)
+                value = data[0,0]
+            except:
+                badPoint = True
+        
+        #if valid values were returned from each of our points then
+        #the template falls entirely within the Source image.
+        if badPoint:
+            return False
+        else:
+            return True
+        
+
+    def validateArgs(self):
+        """
+        Make sure the user sent us some stuff we can work with
+        """
+
+        if not os.path.exists(self.out_dir):
+            raise utilities.TrappedError("Specified Output directory " + self.out_dir + " not found on file system")
+        
+        if not os.path.isdir(self.out_dir):
+            raise utilities.TrappedError("Specified Output directory " + self.out_dir + " is not a directory")
+     
+        if self.logger is None:
+            self.logger = utilities.logger(self.out_dir, self.verbose)
+        self.writetolog = self.logger.writetolog
+
+        # Validate template image.
+        if self.template is None:
+            raise utilities.TrappedError("template raster not provided.")
+        
+        if not os.path.exists(self.template):
+            raise utilities.TrappedError("Template file, " + self.template + ", does not exist on file system")
+
+        self.template_params = self.getRasterParams(self.template)
+        if len(self.template_params["Error"]) <> 0:
+            raise utilities.TrappedError("There was a problem with the provided template: \n    " + 
+                                    "    " + "\n    ".join(self.template_params["Error"]))
+        
+        # Ensure the template has square pixels.
+        if abs(abs(self.template_params["xScale"]) - abs(self.template_params["yScale"])) > 1e-6:
+            raise utilities.TrappedError("template image must have square pixels." + 
+                            "/n    x pixel scale = " + str(xScale) +
+                            "/n    y pixel scale = " + str(yScale))
+
+        
+        #Validate input rasters
+        if not os.path.exists(self.inputs_CSV):
+            raise utilities.TrappedError("Inputs CSV, " + self.inputs_CSV + ", does not exist on file system.")
+        
+        inputsCSV = csv.reader(open(self.inputs_CSV, 'r'))
+        header = inputsCSV.next()
+        strInputFileErrors = ""
+
+        outputCSV = os.path.join(self.out_dir, "PARC_Files.csv")
+        output = csv.writer(open(outputCSV, "wb"))
+        output.writerow(["PARCOutputFile", "Categorical", "Resampling", "Aggregation", "OriginalFile", os.path.abspath(self.template), os.path.abspath(self.out_dir)])
+        
+        for row in inputsCSV:
+            inputFile = row[0]
+            sourceParams = self.getRasterParams(inputFile)
+            if len(sourceParams["Error"]) > 0:
+                strInputFileErrors += ("  " + os.path.split(inputFile)[1] + " had the following errors:\n" + 
+                                    "    " + "\n    ".join(sourceParams["Error"])) + "\n"
+            else:
+                pass
+                if not self.ImageCoversTemplate(sourceParams):
+                    strInputFileErrors += ("\n  Some part of the template image falls outside of " + os.path.split(inputFile)[1])
+                    strInputFileErrors += "\n        template upper left  = (" + str(self.template_params["gWest"]) + ", " + str(self.template_params["gNorth"]) + ")"
+                    strInputFileErrors += "\n        template lower right = (" + str(self.template_params["gEast"]) + ", " + str(self.template_params["gSouth"]) + ")"
+                    strInputFileErrors += "\n        image    upper left  = (" + str(sourceParams["gWest"]) + ", " + str(sourceParams["gNorth"]) + ")"
+                    strInputFileErrors += "\n        image    lower right = (" + str(sourceParams["gEast"]) + ", " + str(sourceParams["gSouth"]) + ")"
+#                    strInputFileErrors += "\n        points are given in projected coordinates."
+#                    strInputFileErrors += "\n        template upper left  = (" + str(self.template_params["tWest"]) + ", " + str(self.template_params["tNorth"]) + ")"
+#                    strInputFileErrors += "\n        template lower right = (" + str(self.template_params["tEast"]) + ", " + str(self.template_params["tSouth"]) + ")"
+#                    strInputFileErrors += "\n        image    upper left  = (" + str(sourceParams["tWest"]) + ", " + str(sourceParams["tNorth"]) + ")"
+#                    strInputFileErrors += "\n        image    lower right = (" + str(sourceParams["tEast"]) + ", " + str(sourceParams["tSouth"]) + ")"
+#                    strInputFileErrors += "\n        Note: points are given in the template coordinates." + "\n"
+#            
+            if len(row) < 2 or not row[1] in ['0', '1']:
+                self.writetolog("  " + os.path.split(inputFile)[1] + " categorical either missing or not 0 or 1:\n   Defaulting to 0 (continuous)")
+                if len(row) < 2:
+                    row.append('0')
+                else:
+                    row[1] = '0'
+                 
+            if len(row) < 3 or not row[2].lower() in [item.lower() for item in self.resample_methods]:
+                 self.writetolog("  " + os.path.split(inputFile)[1] + " resample method either missing or not one of " + 
+                                        ", ".join(self.resample_methods) + "\n  Defaulting to 'Bilinear'")                  
+                 
+                 if row[1] == '0':
+                     default = 'Bilinear'
+                 else:
+                     default = 'NearestNeighbor'
+                 if len(row) < 3:
+                     row.append(default)
+                 else:
+                     row[2] = default
+
+            if len(row) < 4 or not row[3].lower() in [item.lower() for item in self.agg_methods]:
+                 self.writetolog("  " + os.path.split(inputFile)[1] + " aggregation method either missing or not one of " + 
+                                        ", ".join(self.agg_methods) + "\n  Defaulting to 'Mean'")
+                 if row[1] == '0':
+                     default = 'Mean'
+                 else:
+                     default = 'Majority'
+                 if len(row) < 4:
+                     row.append(default)
+                 else:
+                     row[3] = default
+                 
+            self.inputs.append(row)
+            #also write the output row, reconfigured to our output file
+            fileName = self.getShortName(row[0])
+            fileName = os.path.abspath(os.path.join(self.out_dir, fileName + ".tif"))
+            outputrow = [fileName] + row[1:4] + [os.path.abspath(row[0]), os.path.abspath(self.out_dir)]
+            output.writerow(outputrow)
+        del output
+        
+        if strInputFileErrors <> "":
+            self.writetolog(strInputFileErrors)
+            raise utilities.TrappedError("There was one or more problems with your input rasters: \n" + strInputFileErrors)
+
+    def reprojectRaster(self, srcDs, sourceParams, templateParams, 
+                    destFile, resamplingType, shortName='', outputCellSize = None):
+        """
+        Reprojects a raster to match the template_params
+        if outputCellSize is not provided defaults to the template cellSize
+        """
+#        driver = gdal.GetDriverByName("AAIGrid")
+#        driver.Register()
+        
+        tmpOutput = os.path.splitext(destFile)[0] + ".tif"
+        
+        tmpOutDataset = self.generateOutputDS(sourceParams, templateParams, tmpOutput, outputCellSize)
+        
+        self.writetolog("    Starting intermediate reprojection of: " + shortName)
+
+        err = gdal.ReprojectImage(srcDs, tmpOutDataset, sourceParams["srs"].ExportToWkt(), 
+                                templateParams["srs"].ExportToWkt(), resamplingType)
+        
+#        dst_ds = driver.CreateCopy(destFile, tmpOutDataset, 0)
+        self.writetolog("    Finished reprojection " + shortName)
+        dst_ds = None
+        tmpOutDataset = None
+        
+    def generateOutputDS(self, sourceParams, templateParams, 
+                        tmpOutput, outputCellSize = None):
+        """
+        Creates an output dataset (tiff format) that
+          has the nodata value of the sourceParams but
+          all other attributes from the template_params
+        This output is saved to tmpOutput.
+        
+        The optional cell size will override the cell size 
+            specified in the template_params
+        """
+        tifDriver = gdal.GetDriverByName("GTiff")
+        
+        if outputCellSize == None:
+            width = templateParams["width"]
+            height = templateParams["height"]
+        else:
+            width = templateParams["width"] * int(templateParams["xScale"]/outputCellSize)
+            height = templateParams["height"] * int(templateParams["xScale"]/outputCellSize)
+        
+        if sourceParams["signedByte"]: 
+            tmpOutDataset = tifDriver.Create(tmpOutput, 
+                                            width,
+                                            height,
+                                            1, sourceParams["PixelType"], ["PIXELTYPE=SIGNEDBYTE"])
+        else:
+            tmpOutDataset = tifDriver.Create(tmpOutput, 
+                                            width,
+                                            height,
+                                            1, sourceParams["PixelType"])
+        
+            
+        if outputCellSize == None:
+            outputCellSize = templateParams["xScale"]
+        gtList = list(templateParams["gt"])
+        if templateParams["xScale"] < 0:
+            gtList[1] = -1 * outputCellSize
+        else:
+            gtList[1] = outputCellSize
+        if templateParams["yScale"] < 0:
+            gtList[5] = -1 * outputCellSize
+        else:
+            gtList[5] = outputCellSize
+        gt = tuple(gtList)
+        
+        tmpOutDataset.SetGeoTransform(gt)
+        tmpOutDataset.SetProjection(templateParams["prj"])
+        tmpOutDataset.GetRasterBand(1).SetNoDataValue(sourceParams["NoData"])
+        if sourceParams["signedByte"]:
+            #tmpOutDataset.GetRasterBand(1).SetMetadataItem('PIXELTYPE', "SIGNEDBYTE")
+            tmpOutDataset.GetRasterBand(1).PixelType = "SIGNEDBYTE"
+            tmpOutDataset.GetRasterBand(1).SetMetadata({'PIXELTYPE': 'SIGNEDBYTE'}, 'IMAGE_STRUCTURE')
+            
+#        if self.verbose:
+#            print tmpOutput
+#            print "noDataValue = ", tmpOutDataset.GetRasterBand(1).GetNoDataValue()
+#            print "Pixel type = ", gdal.GetDataTypeName(tmpOutDataset.GetRasterBand(1).DataType)
+        return tmpOutDataset
+
+    def getShortName(self, fullPathName):
+        if fullPathName.endswith('hdr.adf'):
+            shortname = os.path.split(fullPathName)[0]
+            shortname = os.path.split(shortname)[1]
+        else:
+            shortname = os.path.split(fullPathName)[1]
+            shortname = os.path.splitext(shortname)[0]
+        return shortname
+    
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
+#    try:
+##        PARC().testing()
+#        sys.exit(PARC().main(sys.argv[1:]))
+#    except Exception as e:
+#        print e
+#        sys.exit(1)
diff --git a/contrib/sahm/pySAHM/RasterFormatConverter.py b/contrib/sahm/pySAHM/RasterFormatConverter.py
new file mode 100644
index 0000000..9004bd7
--- /dev/null
+++ b/contrib/sahm/pySAHM/RasterFormatConverter.py
@@ -0,0 +1,204 @@
+#!/usr/bin/python
+'''Takes an MDS file and converts all of the tiff files into 
+ascii format in a supplied directory
+The optional parameter format can be used to specify other 
+conversion types.
+'''
+import sys
+import csv
+import os
+import time
+import random
+import shutil
+
+import Queue
+import thread
+import subprocess
+
+from osgeo import gdalconst
+from osgeo import gdal
+
+from optparse import OptionParser
+
+import utilities
+from utilities import isMDSFile
+
+class FormatConverter(object):
+    def __init__(self):
+        #instance level variables
+        self.verbose = False
+        self.MDSFile = ''
+        self.inputDir = ''
+        self.outputDir = ''
+        self.format = 'asc'
+        self.logger = None
+        self.multicore = True
+        self.driverExt = {'asc':'AAIGrid', 'bil':'EHdr', 'img':'HFA', 'jpg':'JPEG'}
+        
+    def run(self):
+        self.validateArgs()
+        if self.MDSFile <> '':
+            usedTifs = self.extractFileNames()
+        else:
+            usedTifs = self.fileNamesFromFolder()
+        #self.writetolog('    Converting: ' + ','.join(usedTifs))
+        if self.multicore:
+            self.convertEnvironmentalLayers_mc(usedTifs, self.outputDir, self.format)
+        else:
+            self.convertEnvironmentalLayers(usedTifs, self.outputDir, self.format)
+        
+    def validateArgs(self):
+        argProblem = ""
+        
+        if self.logger is None:
+            self.logger = utilities.logger(outDir, self.verbose)
+        self.writetolog = self.logger.writetolog
+        
+        if os.path.isdir(self.inputDir):
+            pass
+        elif os.path.exists(self.MDSFile):
+            if not isMDSFile(self.MDSFile):
+                argProblem += "The supplied MDS file, " + self.MDSFile + ", does not appear to be in the appropriate format."
+        else:
+            argProblem += "Neither an input Directory or MDS File was supplied."       
+        
+        if not os.path.isdir(self.outputDir):
+            try:
+                os.mkdir(self.outputDir)
+            except:
+                argProblem += 'The supplied output directory, ' + self.outputDir + ", does not exist and could not be created."
+        if not self.format.lower() in self.driverExt.keys():
+            argProblem += "The supplied format must be one of " + ", ".join(self.driverExt.keys()) 
+
+        if argProblem:
+            raise utilities.TrappedError("There was a problem with one or more of the inputs to RasterFormatConverter")
+        
+    def extractFileNames(self):
+        #Read through the MDS and pull the headers
+        MDSreader = csv.reader(open(self.MDSFile, 'r'))
+        header1 = MDSreader.next()
+        header2 = MDSreader.next()
+        header3 = MDSreader.next()
+        
+        usedTifs = []
+        for i in range(3, len(header1)):
+            if header2[i] == '1' and  header1[i] <> 'Split':
+                usedTifs.append(header3[i])
+        return usedTifs
+    
+    def fileNamesFromFolder(self):
+        usedRasters = []
+        items = os.listdir(self.inputDir)
+        for item in items:
+#            print item
+            fullPath = os.path.join(self.inputDir, item)
+            try:
+                if os.path.isdir(fullPath) or \
+                    os.path.splitext(item)[1].lower() in \
+                    ['.bil', '.img', '.tif', '.jpg', '.bmp', '.asc']:
+                    inds = None
+                    inds = gdal.Open(fullPath, gdalconst.GA_ReadOnly)
+                    if inds is not None:
+                        usedRasters.append(fullPath)
+            except:
+                pass
+        return usedRasters
+
+    def convertEnvironmentalLayers(self, files, outputFolder, type):
+        
+        i = 1
+        for f in files:
+            f_name = os.path.splitext(os.path.split(f)[1])[0]
+            self.writetolog('    Starting on ' + f_name)
+            outputfile = os.path.join(outputFolder, f_name + '.' + type)
+            self.convertFormat(f, outputfile, self.driverExt[type]) 
+            if self.verbose:
+                self.writetolog('   Finished converting ' + f_name + '    ' + str(i) + ' out of ' + str(len(files)) + ' finished.')
+            i += 1
+           
+    def convertEnvironmentalLayers_mc(self, files, outputFolder, type):
+        '''This function has the same functionality as convertEnvironmentalLayers
+        with the addition of utilizing multiple cores to do the processing.
+        '''
+        results = Queue.Queue()
+        process_count= 0
+        
+        i = 1
+        for f in files:
+            f_name = os.path.splitext(os.path.split(f)[1])[0]
+            args = '-i ' + '"' + f + '"'
+            args += ' -o '  + '"' + outputFolder + '"'
+            args += ' -f ' + type
+#            if self.verbose:
+#                args += " -v"
+            
+            execDir = os.path.split(__file__)[0]
+            executable = os.path.join(execDir, 'singleRasterFormatConverter.py')
+            
+            pyEx = sys.executable
+            command = ' '.join([pyEx, executable, args])
+            self.logger.writetolog(command, False, False)
+            proc = subprocess.Popen( command )
+            thread.start_new_thread(utilities.process_waiter,
+                    (proc, f_name, results))
+            process_count+= 1
+            
+        while process_count > 0:
+            description, rc= results.get()
+            
+            if rc == 0:
+                if self.verbose:
+                    msg = "    " + description + " finished successfully:  " + \
+                        str(len(files) - process_count + 1)  + " done out of " \
+                        + str(len(files))
+                    self.logger.writetolog(msg, True, True)
+            else:
+                self.logger.writetolog("There was a problem with: " + description , True, True)
+            process_count-= 1
+        
+        
+    def convertFormat(self, file, outfile, driver):
+        inds = gdal.Open(file, gdalconst.GA_ReadOnly)
+       
+        #ascii = "AAIGrid"
+        #bil = "EHdr"
+        Driver = gdal.GetDriverByName(driver)
+        Driver.CreateCopy(outfile, inds, 0)
+
+def main(argv):
+    usageStmt = "usage:  options: -m --MDSFile -o --outputDir -f --format -v --verbose"
+    desc = "Converts all of the tif files specified in an MDS to ASCII format (or optionally other formats)"
+    parser = OptionParser(usage=usageStmt, description=desc)
+    
+    parser.add_option("-v", 
+                      dest="verbose", 
+                      default=False, 
+                      action="store_true", 
+                      help="the verbose flag causes diagnostic output to print.")
+    parser.add_option("-m", "--MDSFile", 
+                      dest="MDSFile", 
+                      help="The input MDS used to determine tif inputs.")           
+    parser.add_option("-o", "--outputDir", 
+                      dest="outputDir", 
+                      help="Output directory to save files in.")
+    parser.add_option("-f", "--format", 
+                      dest="format",
+                      default='asc', 
+                      help="The format to convert into. 'bil', 'img', 'tif', 'jpg', 'bmp', 'asc'")
+    parser.add_option("-s", dest="multicore", 
+                      default=True, 
+                      action="store_true", 
+                      help="the use single-core flag causes each iteration to run on the same thread.") 
+    
+    (options, args) = parser.parse_args(argv)
+    
+    ourFC = FormatConverter()
+    ourFC.verbose = options.verbose
+    ourFC.MDSFile = options.MDSFile
+    ourFC.outputDir = options.outputDir
+    ourFC.format = options.format
+    ourFC.multicore = options.multicore
+    ourFC.run()
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/Docs/SAHM User Help.docx b/contrib/sahm/pySAHM/Resources/Docs/SAHM User Help.docx
new file mode 100644
index 0000000..db2a430
Binary files /dev/null and b/contrib/sahm/pySAHM/Resources/Docs/SAHM User Help.docx differ
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/AppendOut.r b/contrib/sahm/pySAHM/Resources/R_Modules/AppendOut.r
new file mode 100644
index 0000000..2c2d8ee
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/AppendOut.r
@@ -0,0 +1,170 @@
+AppendOut<-function(compile.out,Header,x,out,test.split,parent){
+    Header.Length<-nrow(Header)
+    Parm.Len<-nrow(x)
+  if(file.access(compile.out,mode=0)==-1){ #if very first time through little to do
+          #A more complex than necessary way of writing a csv with several header lines
+          write.table(Header,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=",")
+          if(!is.null(out$dat$ma$ma.test))
+              write.table(cbind("","Train Split"),file=compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=",")
+          write.table(x,file=compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=",")
+  } else { #this else (not the first time through) goes to the very end of the function
+          input<-read.table(compile.out,fill=TRUE,sep=",")
+          Orig.Header<-input[1:Header.Length,]
+
+          if(!is.null(out$dat$ma$ma.test)){ #if there is a test train split this if lasts until after plotting
+                  Train.x<-input[(Header.Length+2):(Header.Length+Parm.Len+1),]
+                  Orig.Train<-input[(Header.Length+1),]
+
+                  if(nrow(input)>15){ #if there is a test split in input (not in very first loop)
+                     Test.x<-input[(Header.Length+Parm.Len+4):nrow(input),]
+                     Orig.Test<-input[(Header.Length+Parm.Len+2):(Header.Length+Parm.Len+3),]
+                      if(test.split){ # if we're hitting this on a test and not a train
+                            Test.x[,ncol(Test.x)]<-x[,2]
+                             class(Orig.Test[,ncol(Orig.Test)])="character"
+                            Orig.Test[1,ncol(Orig.Test)]<-""
+                            Orig.Test[2,ncol(Orig.Test)]<-"Test Split"
+                      } else{
+                            Orig.Header<-cbind(Orig.Header,Header[,2])
+                            Train.x<-cbind(Train.x,x[,2])
+                            Orig.Train<-cbind(Orig.Train,"Train Split")
+                            }
+                  } else{
+                     Orig.Test=rbind(c("",""),cbind("","Test Split"))
+                     Test.x=x
+                  }
+
+                  temp<-try(write.table(Orig.Header,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+
+                  while(class(temp)=="try-error"){
+                      modalDialog("","Please Close the AppendedOutput.exe\ so that R can write to it then press ok to continue ","")
+                      temp<-try(write.table(Orig.Header,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+                  }
+                  try(write.table(Orig.Train,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                  try(write.table(Train.x,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                  try(write.table(Orig.Test,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                  try(write.table(Test.x,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                  if(ncol(Train.x)==ncol(Test.x) & ncol(Test.x)>2){
+
+                  jpeg(file=paste(parent,"AcrossModelPerformTestTrain.jpg",sep="//"),width=1000,height=1000,pointsize=13)
+                          par(mfrow=c(nrow(Train.x),1),mar=c(.2, 5, .6, 2),cex=1.1,oma=c(5, 0, 3, 0))
+                            temp<-Train.x[,2:ncol(Train.x)]
+                          temp<-matrix(data=as.numeric(as.matrix(temp,nrow=Par.Len)),nrow=Parm.Len,ncol=(ncol(Train.x)-1))
+                          temp1<-temp
+                          temp[2,]<-temp[2,]/100
+                          temp[3,]<-temp[3,]/100
+                          temp2<-Test.x[,2:ncol(Test.x)]
+                          temp2<-matrix(data=as.numeric(as.matrix(temp2,nrow=Par.Len)),nrow=Parm.Len,ncol=(ncol(Test.x)-1))
+                          temp2[2,]<-temp2[2,]/100
+                          temp2[3,]<-temp2[3,]/100
+                           ss<-seq(from=1,to=(ncol(Train.x)-1),by=1)
+                           x.labs<-sub(" ","\n",Train.x[,1])
+                           x.labs<-sub("Percent","Proportion",x.labs)
+                          colors.test=c("chocolate3","gold1","darkolivegreen2","steelblue1","brown3")
+                        colors.train=c("chocolate4","gold3","darkolivegreen4","steelblue4","brown4")
+                   #Plot 1.
+                        plot(c(0,(ncol(Test.x)+2)),c(0,1.1),type="n",xaxt="n",
+                            xlab=paste("Corresponding Column in ",ifelse(!is.null(out$dat$ma$ma.test),"AppendedOutputTestTrain.csv","AppendedOutput.csv"),sep=""),
+                            ylab=x.labs[1])
+                            grid(nx=10)
+                            legend(ncol(Test.x),y=.75,legend=c("Test","Train"),fill=c(colors.test[1],colors.train[1]))
+                          rect(xleft=ss-.4,ybottom=0,xright=ss,ytop=temp[1,],col=colors.train[1],lwd=2)
+                          rect(xleft=ss,ybottom=0,xright=(ss+.4),ytop=pmax(0,temp2[1,]),col=colors.test[1],lwd=2)
+                          text((which(temp1[1,]==max(temp1[1,],na.rm=TRUE),arr.ind=TRUE)-.25),
+                              max(temp1[1,],na.rm=TRUE)+.05,labels=as.character(round(max(temp1[1,]),digits=2)),cex=.8)
+                          text((which(temp2[1,]==max(temp2[1,],na.rm=TRUE),arr.ind=TRUE)+.25),
+                              max(temp2[1,],na.rm=TRUE)+.05,labels=as.character(round(max(temp2[1,]),digits=2)),cex=.8)
+                        par(mar=c(.2, 5, .6, 2))
+                 #Middle Plots.
+                        for(i in 2:(nrow(Train.x)-1)){
+                            plot(c(0,(ncol(Test.x)+2)),c(0,1.1),type="n",xaxt="n",
+                            ylab=x.labs[i])
+                            grid(nx=10)
+                          rect(xleft=ss-.4,ybottom=0,xright=ss,ytop=temp[i,],col=colors.train[i],lwd=2)
+                          rect(xleft=ss,ybottom=0,xright=(ss+.4),ytop=pmax(0,temp2[i,]),col=colors.test[i],lwd=2)
+                          legend(ncol(Test.x),y=.75,legend=c("Test","Train"),fill=c(colors.test[i],colors.train[i]))
+                          text((which(temp[i,]==max(temp[i,],na.rm=TRUE),arr.ind=TRUE)-.25),
+                              max(temp[i,],na.rm=TRUE)+.05,labels=as.character(round(max(temp[i,]),digits=2)),cex=.8)
+                          text((which(temp2[i,]==max(temp2[i,],na.rm=TRUE),arr.ind=TRUE)+.25),
+                              max(temp2[i,],na.rm=TRUE)+.05,labels=as.character(round(max(temp2[i,]),digits=2)),cex=.8)
+                          par(mar=c(.3, 5, .4, 2))
+                          }
+                          par(mar=c(2, 5, .4, 2))
+                #Last Plot.
+                       i=nrow(Train.x)
+                      plot(c(0,(ncol(Test.x)+2)),c(0,1.1),type="n",xaxt="n",
+                            xlab="n",
+                            ylab=x.labs[i])
+                            grid(nx=10)
+                          rect(xleft=ss-.4,ybottom=0,xright=ss,ytop=temp[i,],col=colors.train[i],lwd=2)
+                          rect(xleft=ss,ybottom=0,xright=(ss+.4),ytop=pmax(0,temp2[i,]),col=colors.test[i],lwd=2)
+                          legend(ncol(Test.x),y=.75,legend=c("Test","Train"),fill=c(colors.test[i],colors.train[i]))
+                          text((which(temp1[i,]==max(temp1[i,],na.rm=TRUE),arr.ind=TRUE)-.25),
+                              max(temp1[i,],na.rm=TRUE)+.05,labels=as.character(round(max(temp1[i,]),digits=2)),cex=.8)
+                          text((which(temp2[i,]==max(temp2[i,],na.rm=TRUE),arr.ind=TRUE)+.25),
+                              max(temp2[i,],na.rm=TRUE)+.05,labels=as.character(round(max(temp2[i,]),digits=2)),cex=.8)
+             #Outer margin labels
+                            for(i in 2:ncol(Orig.Header)) mtext(Orig.Header[1,i],line=-12,at=(i-1),las=2)
+                          mtext("Evaluation Metrics Performance Across Model Runs",outer=TRUE,side=3,cex=1.3)
+                          mtext(paste("Folder Name where model is found in ",
+                            ifelse(!is.null(out$dat$ma$ma.test),"AppendedOutputTestTrain.csv","AppendedOutput.csv"),sep=""),side=1,outer=TRUE,line=3)
+                       dev.off()
+                    }
+              }  else{
+
+          Orig.x<-input[(Header.Length+1):nrow(input),]
+          temp<-try(write.table(cbind(Orig.Header,Header[,2]),file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+           while(class(temp)=="try-error"){
+                      modalDialog("","Please Close the AppendedOutput.exe\ so that R can write to it then press ok to continue ","")
+                      temp<-try(write.table(cbind(Orig.Header,Header[,2]),file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+                  }
+           if(ncol(Orig.x)>2){
+
+        jpeg(file=paste(parent,"AcrossModelPerform.jpg",sep="//"),width=1000,height=1000,pointsize=13)
+                          par(mfrow=c(5,1),mar=c(.2, 5, .6, 2),cex=1.1,oma=c(5, 0, 3, 0))
+                            temp<-Orig.x[,2:ncol(Orig.x)]
+                          temp<-matrix(data=as.numeric(as.matrix(temp,nrow=Par.Len)),nrow=Parm.Len,ncol=(ncol(Orig.x)-1))
+                          temp1<-temp
+                          temp[2,]<-temp[2,]/100
+                          temp[3,]<-temp[3,]/100
+                           ss<-seq(from=1,to=(ncol(Orig.x)-1),by=1)
+                           x.labs<-sub(" ","\n",Orig.x[,1])
+                           x.labs<-sub("Percent","Proportion",x.labs)
+                        colors.train=c("chocolate4","gold3","darkolivegreen4","steelblue4","brown4")
+                   #Plot 1.
+                        plot(c(0,(ncol(Orig.x))),c(0,1.1),type="n",xaxt="n",ylab=x.labs[1])
+                            grid(nx=10)
+                          rect(xleft=ss-.3,ybottom=0,xright=ss+.3,ytop=temp[1,],col=colors.train[1],lwd=2)
+                          text((which(temp1[1,]==max(temp1[1,],na.rm=TRUE),arr.ind=TRUE)),
+                              max(temp1[1,],na.rm=TRUE)+.06,labels=as.character(round(max(temp1[1,]),digits=2)),cex=.8)
+                        par(mar=c(.2, 5, .6, 2))
+                 #Plot 2-4.
+                        for(i in 2:(nrow(x)-1)){
+                            plot(c(0,(ncol(Orig.x))),c(0,1.1),type="n",xaxt="n",
+                            ylab=x.labs[i])
+                            grid(nx=10)
+                          rect(xleft=ss-.3,ybottom=0,xright=ss+.3,ytop=temp[i,],col=colors.train[i],lwd=2)
+                          text((which(temp[i,]==max(temp[i,],na.rm=TRUE),arr.ind=TRUE)),
+                              max(temp[i,],na.rm=TRUE)+.06,labels=as.character(round(max(temp[i,]),digits=2)),cex=.8)
+                          par(mar=c(.3, 5, .4, 2))
+                          }
+                          par(mar=c(2, 5, .4, 2))
+                #Plot 5.
+                       i=nrow(x)
+                       plot(c(0,(ncol(Orig.x))),c(0,1.1),type="n",xaxt="n",
+                            ylab=x.labs[i])
+                            grid(nx=10)
+                          rect(xleft=ss-.3,ybottom=0,xright=ss+.3,ytop=temp[i,],col=colors.train[i],lwd=2)
+                          text((which(temp[i,]==max(temp[i,],na.rm=TRUE),arr.ind=TRUE)),
+                              max(temp[i,],na.rm=TRUE)+.06,labels=as.character(round(max(temp[i,]),digits=2)),cex=.8)
+             #Outer margin labels
+                            for(i in 2:ncol(Orig.Header)) mtext(Orig.Header[1,i],line=-12,at=(i-1),las=2)
+                          mtext("Evaluation Metrics Performance Across Model Runs",outer=TRUE,side=3,cex=1.3)
+                          mtext(paste("Folder Name where model is found in ",
+                            ifelse(!is.null(out$dat$ma$ma.test),"AppendedOutputTestTrain.csv","AppendedOutput.csv"),sep=""),side=1,outer=TRUE,line=3)
+                       dev.off()
+                     }
+
+          try(write.table(cbind(Orig.x,x[,2]),file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+          }}
+               }
+               
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/CompileOutput.r b/contrib/sahm/pySAHM/Resources/R_Modules/CompileOutput.r
new file mode 100644
index 0000000..82b38d9
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/CompileOutput.r
@@ -0,0 +1,12 @@
+Compile.Output<-function(out){
+last.dir<-strsplit(out$input$output.dir,split="/")
+length(last.dir[[1]])
+parent<-sub(paste("/",last.dir[[1]][length(last.dir[[1]])],sep=""),"",out$input$output.dir)
+
+txt0 <- paste("Generalized Liinear Results\n",out$input$run.time,"\n\n","Data:\n\t ",ma.name,"\n\t ","n(pres)=",
+        out$dat$ma$n.pres[2],"\n\t n(abs)=",out$dat$ma$n.abs[2],"\n\t number of covariates considered=",(length(names(out$dat$ma$ma))-1),
+        "\n\n","Settings:\n","\n\t model family=",out$input$model.family,
+        "\n\n","Results:\n\t ","number covariates in final model=",length(out$dat$ma$used.covs),
+        "\n\t pct deviance explained on train data =",round(out$mods$auc.output$pct.dev.exp,1),"%\n",
+        "\n\t total time for model fitting=",round((unclass(Sys.time())-t0)/60,2),"min\n",sep="")
+}
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/CrossValidationSplit.r b/contrib/sahm/pySAHM/Resources/R_Modules/CrossValidationSplit.r
new file mode 100644
index 0000000..a87e425
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/CrossValidationSplit.r
@@ -0,0 +1,99 @@
+CrossValidationSplit<-function(input.file,output.file,response.col="ResponseBinary",n.folds=10,stratify=FALSE){
+
+#Description:
+#this code takes as input an mds file with the first line being the predictor or
+#response name, the second line an indicator of predictors to include and the
+#third line being paths where tif files can be found.   An output file and a
+#response column must also be specified.  Given a number of folds, a new
+#column is created indicating which fold each observation will be assigned to
+#if a Split Column is also found (test/train split) then only the train portion
+#will be assigned a fold.  Optional stratification by response is also available
+#Background points are ignored
+#by this module (they are read in, written out, but not assigned to cv folds.
+#Output is written to a csv that can be used by the
+#SAHM R modules.
+
+#Written by Marian Talbert 9/29/2011
+
+     if(n.folds<=1 | n.folds%%1!=0) stop("n.folds must be an integer greater than 1")
+      browser()
+
+   #Read input data and remove any columns to be excluded
+          dat.in<-read.csv(input.file,header=FALSE,as.is=TRUE)
+          dat<-as.data.frame(dat.in[4:dim(dat.in)[1],])
+          names(dat)<-dat.in[1,]
+
+        response<-dat[,match(tolower(response.col),tolower(names(dat)))]
+
+          if(sum(as.numeric(response)==0)==0 && !is.null(stratify)) stop("The ratio of presence to absence cannot be set with only presence data")
+
+      #Ignoring background data that might be present in the mds
+
+          bg.dat<-dat[response==-9999,]
+
+          if(dim(bg.dat)[1]!=0){
+            dat<-dat[-c(which(response==-9999,arr.ind=TRUE)),]
+            dat.in<-dat.in[-c(which(response==-9999,arr.ind=TRUE)+3),]
+            response<-response[-c(which(response==-9999,arr.ind=TRUE))]
+            bg.dat$TrainSplit=""
+            }
+
+            #this splits the training set
+             split.mask<-dat[,match(tolower("split"),tolower(names(dat)))]=="train"
+             index<-seq(1:nrow(dat))[split.mask]
+             if(stratify==TRUE){
+               dat[,ncol(dat)+1]<-NA
+                for(i in 1:names(table(response))){
+                  index.i<-index[response[split.mask]==names(table(response))[i]]
+                  index.i<-index.i[order(runif(length(index.i)))]
+                  dat[index.i,ncol(dat)]<-c(rep(seq(1:n.folds),each=floor(length(index.i)/n.folds)),sample(seq(1:n.folds),size=length(index.i)%%n.folds,replace=FALSE))
+                }
+             } else{
+                index<-index[order(runif(length(index)))]
+                dat[index,ncol(dat)+1]<-c(rep(seq(1:n.folds),each=floor(length(index)/n.folds)),sample(seq(1:n.folds),size=length(index)%%n.folds,replace=FALSE))
+             }
+
+         #inserting data must be done in 3 steps because dat.in isn't a proper dataframe in that
+         #not all elements in a column are of the same type
+          dat.in<-dat.in[c(1:3,rownames(dat)),] #removing rows that weren't selected for the test train split
+          dat.in[4:(dim(dat.in)[1]),(dim(dat.in)[2]+1)]<-dat$TrainSplit
+          dat.in[c(1,3),(dim(dat.in)[2])]<-c("Split","")
+          dat.in[2,(dim(dat.in)[2])]<-1
+
+              if(dim(bg.dat)[1]!=0) {
+                names(bg.dat)<-names(dat.in)
+                dat.in<-rbind(dat.in,bg.dat)}
+
+              #write output files for R modules
+             write.table(dat.in,file=output.file,row.names=FALSE,col.names=FALSE,sep=",",quote=FALSE)
+
+
+    }
+
+
+ #Reading in command line arguments
+ Args <- commandArgs(T)
+    print(Args)
+    #assign default values
+
+    responseCol <- "responseBinary"
+    trainProp=.7
+    RatioPresAbs=NULL
+    #replace the defaults with passed values
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="p") trainProp <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="m") RatioPresAbs <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output.file <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="i") infil <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    }
+
+    RatioResAbs<-as.numeric(RatioPresAbs)
+    trainProp<-as.numeric(trainProp)
+
+	#Run the Test training split with these parameters
+	CrossValidationSplit(input.file=infil,output.file=output.file,response.col=responseCol,
+  trainProp=trainProp,RatioPresAbs=RatioPresAbs)
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/EvalStats.r b/contrib/sahm/pySAHM/Resources/R_Modules/EvalStats.r
new file mode 100644
index 0000000..6d566d5
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/EvalStats.r
@@ -0,0 +1,25 @@
+EvaluationStats<-function(out,thresh,train,train.pred,opt.methods=opt.methods){
+    response<-out$dat$ma$ma.test[,1]
+
+     if(out$input$model.source.file=="rf.r") {pred<-tweak.p(as.vector(predict(out$mods$final.mod,newdata=out$dat$ma$ma.test[,-1],type="prob")[,2]))
+      modelname="Random Forest"
+     }
+
+    if(out$input$model.source.file=="mars.r") {pred<-mars.predict(out$mods$final.mod,out$dat$ma$ma.test)$prediction[,1]
+         modelname="MARS"
+    }
+
+    if(out$input$model.source.file=="glm.r")  {pred=glm.predict(out$mods$final.mod,out$dat$ma$ma.test)
+        modelname="GLM"
+    }
+
+    if(out$input$model.source.file=="brt.r") {pred=predict.gbm(out$mods$final.mod,out$dat$ma$ma.test,out$mods$final.mod$target.trees,type="response")
+       modelname="BRT"
+      }
+      
+    auc.output<-make.auc.plot.jpg(out$dat$ma$ma.test,pred=pred,plotname=paste(out$dat$bname,"_auc_plot.jpg",sep=""),
+          modelname=modelname,test.split=TRUE,thresh=thresh,train=train,train.pred,opt.methods=opt.methods,weight=out$dat$ma$test.weights,out=out)
+
+                out$mods$auc.output<-auc.output
+
+}
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/EvalStatsHelperFcts.r b/contrib/sahm/pySAHM/Resources/R_Modules/EvalStatsHelperFcts.r
new file mode 100644
index 0000000..7fb65fd
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/EvalStatsHelperFcts.r
@@ -0,0 +1,122 @@
+"calibration" <-
+      function(obs, preds, family = "binomial")
+      {
+      #
+      # j elith/j leathwick 17th March 2005
+      # calculates calibration statistics for either binomial or count data
+      # but the family argument must be specified for the latter
+      # a conditional test for the latter will catch most failures to specify
+      # the family
+      #
+
+      if (family == "bernoulli") family <- "binomial"
+      pred.range <- max(preds) - min(preds)
+      if(pred.range > 1.2 & family == "binomial") {
+      print(paste("range of response variable is ", round(pred.range, 2)), sep = "", quote = F)
+      print("check family specification", quote = F)
+      return()
+      }
+      if(family == "binomial") {
+      pred <- preds + 1e-005
+      pred[pred >= 1] <- 0.99999
+      mod <- glm(obs ~ log((pred)/(1 - (pred))), family = binomial)
+      lp <- log((pred)/(1 - (pred)))
+      a0b1 <- glm(obs ~ offset(lp) - 1, family = binomial)
+      miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+      ab1 <- glm(obs ~ offset(lp), family = binomial)
+      miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+      miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+      }
+      if(family == "poisson") {
+      mod <- glm(obs ~ log(preds), family = poisson)
+      lp <- log(preds)
+      a0b1 <- glm(obs ~ offset(lp) - 1, family = poisson)
+      miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+      ab1 <- glm(obs ~ offset(lp), family = poisson)
+      miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+      miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+      }
+      calibration.result <- c(mod$coef, miller1, miller2, miller3)
+      names(calibration.result) <- c("intercept", "slope", "testa0b1", "testa0|b1", "testb1|a")
+      return(calibration.result)
+}
+
+"calc.dev" <-
+        function(obs.values, fitted.values, weights = rep(1,length(obs.values)), family="binomial", calc.mean = TRUE)
+        {
+        # j. leathwick/j. elith
+        #
+        # version 2.1 - 5th Sept 2005
+        #
+        # function to calculate deviance given two vectors of raw and fitted values
+        # requires a family argument which is set to binomial by default
+        #
+        #
+
+        if (length(obs.values) != length(fitted.values))
+           stop("observations and predictions must be of equal length")
+
+        y_i <- obs.values
+
+        u_i <- fitted.values
+
+        if (family == "binomial" | family == "bernoulli") {
+
+           deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+           deviance <- -2 * sum(deviance.contribs * weights)
+
+        }
+
+        if (family == "poisson" | family == "Poisson") {
+
+            deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+            deviance <- 2 * sum(deviance.contribs * weights)
+
+        }
+
+        if (family == "laplace") {
+            deviance <- sum(abs(y_i - u_i))
+            }
+
+        if (family == "gaussian") {
+            deviance <- sum((y_i - u_i) * (y_i - u_i))
+            }
+
+
+
+        if (calc.mean) deviance <- deviance/length(obs.values)
+        dev=list(deviance=deviance,dev.cont=deviance.contribs)
+        return(dev)
+
+}
+
+beachcolours<-function (heightrange, sealevel = 0, monochrome = FALSE, ncolours = if (monochrome) 16 else 64)
+{
+#this function was robbed from the spatstat library internals
+    if (monochrome)
+        return(grey(seq(0, 1, length = ncolours)))
+    stopifnot(is.numeric(heightrange) && length(heightrange) ==
+        2)
+    stopifnot(all(is.finite(heightrange)))
+    depths <- heightrange[1]
+    peaks <- heightrange[2]
+    dv <- diff(heightrange)/(ncolours - 1)
+    epsilon <- dv/2
+    lowtide <- max(sealevel - epsilon, depths)
+    hightide <- min(sealevel + epsilon, peaks)
+    countbetween <- function(a, b, delta) {
+        max(0, round((b - a)/delta))
+    }
+    nsea <- countbetween(depths, lowtide, dv)
+    nbeach <- countbetween(lowtide, hightide, dv)
+    nland <- countbetween(hightide, peaks, dv)
+    colours <- character(0)
+    if (nsea > 0)
+        colours <- rev(rainbow(nsea, start = 3/6, end = 4/6))
+    if (nbeach > 0)
+        colours <- c(colours, rev(rainbow(nbeach, start = 3/12,
+            end = 5/12)))
+    if (nland > 0)
+        colours <- c(colours, rev(rainbow(nland, start = 0, end = 1/6)))
+    return(colours)
+}
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/EvaluationStats.r b/contrib/sahm/pySAHM/Resources/R_Modules/EvaluationStats.r
new file mode 100644
index 0000000..ca62d3d
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/EvaluationStats.r
@@ -0,0 +1,436 @@
+make.auc.plot.jpg<-function(ma.reduced,pred,plotname,modelname,test.split=FALSE,thresh=NULL,train=NULL,train.pred=NULL,opt.methods=2,weight,out){
+
+      if(is.null(weight)) weight=rep(1,times=dim(ma.reduced)[1])
+    auc.data <- data.frame(ID=1:nrow(ma.reduced),pres.abs=ma.reduced[,1],pred=pred)
+    p.bar <- sum(auc.data$pres.abs * weight) / sum(weight)
+    n.pres <- sum(auc.data$pres.abs)
+    n.abs <- nrow(auc.data)-n.pres
+
+    null.dev<-calc.dev(auc.data$pres.abs, rep(p.bar,times=length(auc.data$pres.abs)), weight, family="binomial")$deviance*nrow(ma.reduced)
+    dev.fit<-calc.dev(auc.data$pres.abs, pred, weight, family="binomial")$deviance*nrow(ma.reduced)
+    dev.exp <- null.dev - dev.fit
+    pct.dev.exp <- dev.exp/null.dev*100
+   correlation<-cor(auc.data$pres.abs,pred)
+
+    if(is.null(thresh)){
+    thresh <- as.numeric(optimal.thresholds(auc.data,opt.methods=opt.methods))[2]}
+    auc.fit <- auc(auc.data,st.dev=T)
+    if(test.split==TRUE){
+
+      jpeg(file=plotname)
+      d<-data.frame(ID=1:nrow(train),pres.abs=train[,1],pred=train.pred)
+      thresh<- as.numeric(optimal.thresholds(d,opt.methods=opt.methods))[2]
+      TestTrainRocPlot(DATA=d,opt.thresholds=thresh,add.legend=FALSE,lwd=2)
+      TestTrainRocPlot(auc.data,model.names=modelname,opt.thresholds=thresh,add.roc=TRUE,line.type=2,color="red",add.legend=FALSE)
+      legend(x=.66,y=.2,c("Training Split","Testing Split"),lty=2,col=c("black","red"),lwd=2)
+      graphics.off()} else {
+      jpeg(file=plotname)
+        TestTrainRocPlot(auc.data,model.names=modelname,opt.thresholds=thresh)
+        graphics.off()
+
+      }
+
+    cmx <- cmx(auc.data,threshold=thresh)
+    PCC <- pcc(cmx,st.dev=F)*100
+    SENS <- sensitivity(cmx,st.dev=F)
+    SPEC <- specificity(cmx,st.dev=F)
+    KAPPA <- Kappa(cmx,st.dev=F)
+    TSS <- SENS+SPEC-1
+      response<-ma.reduced$response
+
+    capture.output(cat("\n\n============================================================",
+                        "\n\nEvaluation Statistics"),file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE)
+          if(!is.null(out$dat$ma$ma.test))
+                        capture.output(cat(" applied to",ifelse(!test.split,"train","test"), "split:\n",sep=" "),
+                        file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE)
+                      capture.output(cat( "\n",
+                       "\n\t Correlation Coefficient      : ",cor.test(pred,response)$estimate,
+                       "\n\t NULL Deviance                : ",null.dev,
+                       "\n\t Fit Deviance                 : ",dev.fit,
+                       "\n\t Explained Deviance           : ",dev.exp,
+                       "\n\t Percent Deviance Explained   : ",pct.dev.exp,
+                       file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE))
+
+                           capture.output(cat(
+                             "\n\n  Threshold Methods based on", switch(opt.methods,
+                            "1"=".5 threshold",
+                            "2"="Sens=Spec",
+                            "3"="maximize (sensitivity+specificity)/2",
+                            "4"="maximize Kappa",
+                            "5"="maximize percent correctly classified",
+                            "6"="predicted prevalence=observed prevalence",
+                            "7"="threshold=observed prevalence",
+                            "8"="mean predicted probability",
+                            "9"="minimize distance between ROC plot and (0,1)",
+                            ),
+                            "\n\t Threshold                    : ",
+                            thresh,
+                            "\n\n\t Confusion Matrix: \n\n"),
+                            print.table(cmx),
+                       cat("\n\t AUC                          : ",auc.fit[1,1],
+                       "\n\t Percent Correctly Classified : ",PCC,
+                       "\n\t Sensitivity                  : ",SENS,
+                       "\n\t Specificity                  : ",SPEC,
+                       "\n\t Kappa                        : ",KAPPA,
+                       "\n\t True Skill Statistic         : ",TSS,"\n"),
+                       file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE)
+
+                       last.dir<-strsplit(out$input$output.dir,split="\\\\")
+                        parent<-sub(paste("\\\\",last.dir[[1]][length(last.dir[[1]])],sep=""),"",out$input$output.dir)
+
+                         if(!is.null(out$dat$ma$ma.test)) compile.out<-paste(parent,"AppendedOutputTestTrain.csv",sep="/")
+                          else compile.out<-paste(parent,"AppendedOutput.csv",sep="/")
+
+                       x=data.frame(cbind(c("Correlation Coefficient","Percent Deviance Explained","Percent Correctly Classified","Sensitivity","Specificity"),
+                            c(as.vector(cor.test(pred,response)$estimate),pct.dev.exp,PCC,SENS,SPEC)))
+
+                           
+                        Header<-cbind(c("","Original Field Data","Field Data Template","PARC Output Folder","PARC Template","Covariate Selection Name",""),
+                            c(last.dir[[1]][length(last.dir[[1]])],
+                            out$dat$ma$input$OrigFieldData,out$dat$ma$input$FieldDataTemp,out$dat$ma$input$ParcOutputFolder,
+                            out$dat$ma$input$ParcTemplate,ifelse(length(out$dat$ma$input$CovSelectName)==0,"NONE",out$dat$ma$input$CovSelectName),""))
+                       Header.Length<-nrow(Header)
+                       Parm.Len<-nrow(x)
+
+             #Very first time through
+             if(file.access(compile.out,mode=0)==-1){
+                  #A more complex than necessary way of writing a csv with several header lines
+                  write.table(Header,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=",")
+                   if(!is.null(out$dat$ma$ma.test))
+                   write.table(cbind("","Train Split"),file=compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=",")
+                  write.table(x,file=compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=",")
+                      } else {
+                      input<-read.table(compile.out,fill=TRUE,sep=",")
+                      Orig.Header<-input[1:Header.Length,]
+
+                      if(!is.null(out$dat$ma$ma.test)){
+                              Train.x<-input[(Header.Length+2):(Header.Length+Parm.Len+1),]
+                              Orig.Train<-input[(Header.Length+1),]
+
+                              if(nrow(input)>15){
+                                 Test.x<-input[(Header.Length+Parm.Len+4):nrow(input),]
+                                 Orig.Test<-input[(Header.Length+Parm.Len+2):(Header.Length+Parm.Len+3),]
+                                  if(test.split){
+                                        Test.x[,ncol(Test.x)]<-x[,2]
+                                         class(Orig.Test[,ncol(Orig.Test)])="character"
+                                        Orig.Test[1,ncol(Orig.Test)]<-""
+                                        Orig.Test[2,ncol(Orig.Test)]<-"Test Split"
+                                        } else{
+                                        Orig.Header<-cbind(Orig.Header,Header[,2])
+                                        Train.x<-cbind(Train.x,x[,2])
+                                        Orig.Train<-cbind(Orig.Train,"Train Split")
+                                        }
+                                } else{
+                                 Orig.Test=rbind(c("",""),cbind("","Test Split"))
+                                 Test.x=x
+                                }
+
+                              temp<-try(write.table(Orig.Header,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+                              
+                              while(class(temp)=="try-error"){
+                                  modalDialog("","Please Close the AppendedOutput.exe\ so that R can write to it then press ok to continue ","")
+                                  temp<-try(write.table(Orig.Header,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+                              }
+                              
+                              try(write.table(Orig.Train,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                              try(write.table(Train.x,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                              try(write.table(Orig.Test,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                              try(write.table(Test.x,file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                          }  else{
+
+                      Orig.x<-input[(Header.Length+1):nrow(input),]
+                      temp<-try(write.table(cbind(Orig.Header,Header[,2]),file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+                       while(class(temp)=="try-error"){
+                                  modalDialog("","Please Close the AppendedOutput.exe\ so that R can write to it then press ok to continue ","")
+                                  temp<-try(write.table(cbind(Orig.Header,Header[,2]),file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,sep=","),silent=TRUE)
+                              }
+
+                              
+                      try(write.table(cbind(Orig.x,x[,2]),file =compile.out,row.names=FALSE,col.names=FALSE,quote=FALSE,append=TRUE,sep=","))
+                      }}
+                      
+    return(list(thresh=thresh,cmx=cmx,null.dev=null.dev,dev.fit=dev.fit,dev.exp=dev.exp,pct.dev.exp=pct.dev.exp,auc=auc.fit[1,1],auc.sd=auc.fit[1,2],
+        plotname=plotname,pcc=PCC,sens=SENS,spec=SPEC,kappa=KAPPA,tss=TSS,correlation=correlation))
+}
+
+
+make.poisson.jpg<-function(ma.reduced,pred,plotname,modelname,test.split=FALSE,thresh=NULL,train=NULL,train.pred=NULL,weight,train.weight=NULL,out){
+
+    pois.data <- data.frame(ID=1:nrow(ma.reduced),pres.abs=ma.reduced[,1],pred=pred)
+    p.bar <- sum(pois.data$pres.abs * weight) / sum(weight)
+    n.pres <- sum(pois.data$pres.abs>=1)
+    n.abs <- nrow(pois.data)-n.pres
+
+    #takes into account potential weights but not offset
+
+    null.dev<-calc.dev(pois.data$pres.abs, rep(p.bar,times=length(pois.data$pres.abs)), weight, family="poisson")$deviance*nrow(ma.reduced)
+    dev.fit<-calc.dev(pois.data$pres.abs, pred, weight, family="poisson")$deviance*nrow(ma.reduced)
+    dev.exp <- null.dev - dev.fit
+    pct.dev.exp <- dev.exp/null.dev*100 #this is the pseudo R^2 using definition in the course notes
+    correlation<-cor(pois.data$pres.abs,pred)
+    #calibration(pois.data$pres.abs,pred,family="poisson") gbm hasn't implimented this for poisson though elith and leathwich use it, I can't find much
+    prediction.error<-sum((pois.data$pres.abs-pred)^2)
+
+    ## ADD Weights and offset?
+    #function (y, mu, wt)
+    #2 * wt * (y * log(ifelse(y == 0, 1, y/mu)) - (y - mu))
+
+   if(test.split==TRUE){
+      if(is.null(train.weight)) train.weight=rep(1,times=nrow(train))
+        null.dev.train<-calc.dev(train$response, rep(mean(train$response),times=nrow(train)), train.weight, family="poisson")$deviance*nrow(train)
+        dev.fit.train<-calc.dev(train$response, train.pred, train.weight, family="poisson")$deviance*nrow(train)
+        dev.exp.train <- null.dev.train - dev.fit.train
+        pct.dev.exp.train <- dev.exp.train/null.dev.train*100
+        correlation.train<-cor(train$response,train.pred)
+
+              jpeg(file=plotname)
+           dev.contrib<-calc.dev(pois.data$pres.abs, pred, weight, family="poisson")$dev.cont
+              par(mfrow=c(3,2))
+              z<-sign(pred-pois.data$pres.abs)*dev.contrib
+              z.range<-max(z)-min(z)
+              z.lim<-c((min(z)-.1*z.range),(max(z)+.1*z.range))
+              breaks<-quantile(z, probs = seq(0, .95,length=25))
+              a<-outer(z,breaks,"<")
+              res.mag<-apply(a,1,sum)
+              plot(out$dat$ma$test.xy,col=beachcolours(heightrange=c(min(res.mag),max(res.mag)),sealevel=mean(res.mag),ncolours=length(table(res.mag)))[res.mag],cex=4,pch=19)
+              x<-out$dat$ma$test.xy[,1]
+              y<-out$dat$ma$test.xy[,2]
+              a<-loess(z~x*y)
+              x.lim<-rep(seq(from=min(out$dat$ma$test.xy[,1]),to=max(out$dat$ma$test.xy[,1]),length=100),each=100)
+              y.lim<-rep(seq(from=min(out$dat$ma$test.xy[,2]),to=max(out$dat$ma$test.xy[,2]),length=100),times=100)
+              z<-predict(a,newdata=cbind("x"=x.lim,"y"=y.lim))
+              z[z>z.lim[2]]<-NA
+              z[z<z.lim[1]]<-NA
+              breaks<-quantile(na.omit(z), probs = seq(0, .95,length=25))
+              a<-outer(z,breaks,"<")
+              res.mag<-apply(a,1,sum)
+              z<-matrix(data=z,ncol=100,nrow=100,byrow=TRUE)
+              res.mag<-matrix(data=res.mag,ncol=100,nrow=100,byrow=TRUE)
+                 image(x=seq(from=min(x.lim),to=max(x.lim),length=100),y=seq(from=min(y.lim),to=max(y.lim),length=100),
+                  z=res.mag,
+                  col=beachcolours(heightrange=c(min(na.omit(res.mag)),max(na.omit(res.mag))),sealevel=mean(na.omit(res.mag)),
+                  ncolours=length(table(na.omit(res.mag)))),xlab="Latitude",ylab="Longitude",
+                  main="Smoothed deviance residuals over space")
+
+                  points(out$dat$ma$train.xy,pch=19,cex=1)
+              #plot(unique(x.lim),apply(z,2,sum))
+              #plot(unique(y.lim),apply(z,1,sum))
+
+              mod.resids<-residuals(out$mods$final.mod,type="deviance")
+              plot(pred,(pois.data$pres.abs-pred),xlab="Predicted Values",ylab="Residuals",main="Residuals vs Fitted")
+              panel.smooth(pred,(pois.data$pres.abs-pred))
+              plot(pred,sqrt(2*dev.contrib),ylab="sqrt(Std.deviance residuals)",xlab="Predicted Values",main="Scale Location")
+              panel.smooth(pred,sqrt(2*dev.contrib))
+              qqnorm((sqrt(2*dev.contrib)-mean(sqrt(2*dev.contrib))),ylab="Std.Deviance residuals")
+              abline(0,1)
+
+        graphics.off()
+        return(list(null.dev=null.dev,dev.fit=dev.fit,dev.exp=dev.exp,pct.dev.exp=pct.dev.exp,correlation=correlation,
+          null.dev.train=null.dev.train,dev.fit.train=dev.fit.train,dev.exp.train=dev.exp.train,pct.dev.exp.train=pct.dev.exp.train,correlation.train=correlation.train))
+
+     }else{
+     jpeg(file=plotname)
+
+        dev.contrib<-calc.dev(pois.data$pres.abs, pred, weight, family="poisson")$dev.cont
+        par(mfrow=c(3,2))
+
+              dev.contrib<-calc.dev(pois.data$pres.abs, pred, weight, family="poisson")$dev.cont
+              z<-sign(pred-pois.data$pres.abs)*dev.contrib
+              breaks<-quantile(z, probs = seq(0, .95,length=25))
+              a<-outer(z,breaks,"<")
+              res.mag<-apply(a,1,sum)
+              plot(out$dat$ma$train.xy,col=heat.colors(24)[res.mag],cex=4,pch=19)
+              x<-out$dat$ma$train.xy[,1]
+              y<-out$dat$ma$train.xy[,2]
+              a<-loess(z~x*y)
+              x.lim<-rep(seq(from=min(out$dat$ma$train.xy[,1]),to=max(out$dat$ma$train.xy[,1]),length=100),each=100)
+              y.lim<-rep(seq(from=min(out$dat$ma$train.xy[,2]),to=max(out$dat$ma$train.xy[,2]),length=100),times=100)
+              z<-predict(a,newdata=cbind("x"=x.lim,"y"=y.lim))
+              breaks<-quantile(z, probs = seq(0, .95,length=25))
+              a<-outer(z,breaks,"<")
+              res.mag<-apply(a,1,sum)
+              z<-matrix(data=z,ncol=100,nrow=100,byrow=TRUE)
+              res.mag<-matrix(data=res.mag,ncol=100,nrow=100,byrow=TRUE)
+
+              image(x=seq(from=min(x.lim),to=max(x.lim),length=100),y=seq(from=min(y.lim),to=max(y.lim),length=100),
+                  z=res.mag,
+                  col=beachcolours(heightrange=c(min(res.mag),max(res.mag)),sealevel=mean(res.mag),ncolours=length(table(res.mag))),xlab="Latitude",ylab="Longitude",
+                  main="Smoothed deviance residuals over space")
+              points(out$dat$ma$train.xy,pch=19)
+              #plot(unique(x.lim),apply(z,2,sum))
+              #plot(unique(y.lim),apply(z,1,sum))
+
+              mod.resids<-residuals(out$mods$final.mod,type="deviance")
+              plot(pred,(pois.data$pres.abs-pred),xlab="Predicted Values",ylab="Residuals",main="Residuals vs Fitted")
+              panel.smooth(pred,(pois.data$pres.abs-pred))
+              plot(pred,sqrt(2*dev.contrib),ylab="sqrt(Std.deviance residuals)",xlab="Predicted Values",main="Scale Location")
+              panel.smooth(pred,sqrt(2*dev.contrib))
+              qqnorm((sqrt(2*dev.contrib)-mean(sqrt(2*dev.contrib))),ylab="Std.Deviance residuals")
+              abline(0,1)
+
+        graphics.off()
+        
+         capture.output(cat("\n\nEvaluation Statistics applied to test split:\n",
+                       "\n\t Correlation Coefficient      : ",cor.test(pred,response)$estimate,
+                       "\n\t NULL Deviance                : ",auc.output$null.dev,
+                       "\n\t Fit Deviance                 : ",auc.output$dev.fit,
+                       "\n\t Explained Deviance           : ",auc.output$dev.exp,
+                       "\n\t Percent Deviance Explained   : ",auc.output$pct.dev.exp,
+                       file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE))
+                       
+        return(list(null.dev=null.dev,dev.fit=dev.fit,dev.exp=dev.exp,pct.dev.exp=pct.dev.exp,correlation=correlation))
+        }
+}
+
+##############################################################################
+EvaluationStats<-function(out,thresh,train,train.pred,opt.methods=opt.methods){
+    response<-out$dat$ma$ma.test[,1]
+
+     if(out$input$model.source.file=="rf.r") {pred<-tweak.p(as.vector(predict(out$mods$final.mod,newdata=out$dat$ma$ma.test[,-1],type="prob")[,2]))
+      modelname="Random Forest"
+     }
+
+    if(out$input$model.source.file=="mars.r") {pred<-mars.predict(out$mods$final.mod,out$dat$ma$ma.test)$prediction[,1]
+         modelname="MARS"
+    }
+
+    if(out$input$model.source.file=="glm.r")  {pred=glm.predict(out$mods$final.mod,out$dat$ma$ma.test)
+        modelname="GLM"
+    }
+
+    if(out$input$model.source.file=="brt.r") {pred=predict.gbm(out$mods$final.mod,out$dat$ma$ma.test,out$mods$final.mod$target.trees,type="response")
+       modelname="BRT"
+      }
+
+  ifelse(out$input$model.family!="poisson",
+                  auc.output<-make.auc.plot.jpg(out$dat$ma$ma.test,pred=pred,plotname=paste(out$dat$bname,"_auc_plot.jpg",sep=""),
+                      modelname=modelname,test.split=TRUE,thresh=thresh,train=train,train.pred,opt.methods=opt.methods,weight=out$dat$ma$test.weights,out=out),
+                  auc.output<-make.poisson.jpg(out$dat$ma$ma.test,pred=pred,plotname=paste(out$dat$bname,"_auc_plot.jpg",sep=""),
+                      modelname=modelname,test.split=TRUE,thresh=thresh,train=train,train.pred,weight=out$dat$ma$test.weights,out=out))
+
+                out$mods$auc.output<-auc.output
+
+}
+
+"calibration" <-
+      function(obs, preds, family = "binomial")
+      {
+      #
+      # j elith/j leathwick 17th March 2005
+      # calculates calibration statistics for either binomial or count data
+      # but the family argument must be specified for the latter
+      # a conditional test for the latter will catch most failures to specify
+      # the family
+      #
+
+      if (family == "bernoulli") family <- "binomial"
+      pred.range <- max(preds) - min(preds)
+      if(pred.range > 1.2 & family == "binomial") {
+      print(paste("range of response variable is ", round(pred.range, 2)), sep = "", quote = F)
+      print("check family specification", quote = F)
+      return()
+      }
+      if(family == "binomial") {
+      pred <- preds + 1e-005
+      pred[pred >= 1] <- 0.99999
+      mod <- glm(obs ~ log((pred)/(1 - (pred))), family = binomial)
+      lp <- log((pred)/(1 - (pred)))
+      a0b1 <- glm(obs ~ offset(lp) - 1, family = binomial)
+      miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+      ab1 <- glm(obs ~ offset(lp), family = binomial)
+      miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+      miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+      }
+      if(family == "poisson") {
+      mod <- glm(obs ~ log(preds), family = poisson)
+      lp <- log(preds)
+      a0b1 <- glm(obs ~ offset(lp) - 1, family = poisson)
+      miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+      ab1 <- glm(obs ~ offset(lp), family = poisson)
+      miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+      miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+      }
+      calibration.result <- c(mod$coef, miller1, miller2, miller3)
+      names(calibration.result) <- c("intercept", "slope", "testa0b1", "testa0|b1", "testb1|a")
+      return(calibration.result)
+}
+
+"calc.dev" <-
+        function(obs.values, fitted.values, weights = rep(1,length(obs.values)), family="binomial", calc.mean = TRUE)
+        {
+        # j. leathwick/j. elith
+        #
+        # version 2.1 - 5th Sept 2005
+        #
+        # function to calculate deviance given two vectors of raw and fitted values
+        # requires a family argument which is set to binomial by default
+        #
+        #
+
+        if (length(obs.values) != length(fitted.values))
+           stop("observations and predictions must be of equal length")
+
+        y_i <- obs.values
+
+        u_i <- fitted.values
+
+        if (family == "binomial" | family == "bernoulli") {
+
+           deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+           deviance <- -2 * sum(deviance.contribs * weights)
+
+        }
+
+        if (family == "poisson" | family == "Poisson") {
+
+            deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+            deviance <- 2 * sum(deviance.contribs * weights)
+
+        }
+
+        if (family == "laplace") {
+            deviance <- sum(abs(y_i - u_i))
+            }
+
+        if (family == "gaussian") {
+            deviance <- sum((y_i - u_i) * (y_i - u_i))
+            }
+
+
+
+        if (calc.mean) deviance <- deviance/length(obs.values)
+        dev=list(deviance=deviance,dev.cont=deviance.contribs)
+        return(dev)
+
+}
+
+beachcolours<-function (heightrange, sealevel = 0, monochrome = FALSE, ncolours = if (monochrome) 16 else 64)
+{
+#this function was robbed from the spatstat library internals
+    if (monochrome)
+        return(grey(seq(0, 1, length = ncolours)))
+    stopifnot(is.numeric(heightrange) && length(heightrange) ==
+        2)
+    stopifnot(all(is.finite(heightrange)))
+    depths <- heightrange[1]
+    peaks <- heightrange[2]
+    dv <- diff(heightrange)/(ncolours - 1)
+    epsilon <- dv/2
+    lowtide <- max(sealevel - epsilon, depths)
+    hightide <- min(sealevel + epsilon, peaks)
+    countbetween <- function(a, b, delta) {
+        max(0, round((b - a)/delta))
+    }
+    nsea <- countbetween(depths, lowtide, dv)
+    nbeach <- countbetween(lowtide, hightide, dv)
+    nland <- countbetween(hightide, peaks, dv)
+    colours <- character(0)
+    if (nsea > 0)
+        colours <- rev(rainbow(nsea, start = 3/6, end = 4/6))
+    if (nbeach > 0)
+        colours <- c(colours, rev(rainbow(nbeach, start = 3/12,
+            end = 5/12)))
+    if (nland > 0)
+        colours <- c(colours, rev(rainbow(nland, start = 0, end = 1/6)))
+    return(colours)
+}
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/FIT_BRT_pluggable.r b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_BRT_pluggable.r
new file mode 100644
index 0000000..f336475
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_BRT_pluggable.r
@@ -0,0 +1,2505 @@
+# A set of "pluggable" R functions for automated model fitting of boosted regression trees models to presence/absence data #
+#
+# Modified 12-2-09 to:  remove categorical covariates from consideration if they only contain one level
+#                       ID factor variables based on "categorical" prefix and look for tifs in subdir
+#                       Give progress reports
+#                       write large output tif files in blocks to alleviate memory issues
+#                       various bug fixes
+#
+# Modified 3-4-09 to use a list object for passing of arguements and data
+#
+# Modified in early 2009 to incorporate new tools and methods as described in
+# Elith et al, 2008.  The new algorithm:
+#  1.  Subsets the data to a maximum of 500 used and 500 available to pick settings and
+#     perform model selection.
+#  2.  Fits a models using a range of learning rates to find a rate which produces an optimal number of ~1000 trees.
+#  3.
+# Modified 12-30-08 to use directories that don't end with a forward slash
+#
+# Modified 8-19-08 to include the creation of a image info table.
+# Modified 8-8-8 to modularize the model array input, and to include and xml output summary.
+#  also added "debug.mode" to make debugging easier on my end.
+# Modified on 6-30-08 to avoid writing to directories other the 'output.dir' spec'd in the
+#  command line arguements.  If this arguement is not defined, output may still be written
+#  to the input directories.
+# Modified on 6-27-08 to take in additional arguements for a file directory (containing
+#  the .tif files used for prediction) and an output directory.  Command line args are now
+#  (note: ma=model array): 1. ma.name, 2. cov.list.name, 3. factor.list.name, 4. ma.dir,
+#   5. tif.dir, 6. output.dir.  Also note that directories need to use forward slashes and end
+#   with a forward slash.
+# modified on 6-24-08 to be 'pluggable'.  The last 20 lines of code interpret command line
+#   arguements and run the glm model.
+# modified on 6-23-08 to handle factor variables.
+# modified on 6-18-08 to remove MARS code.
+# modified on 6-18-08 to include new function to return covariate names from a model.
+# modified on 5/15/08 to fit both Logistic and MARS models
+
+
+# Libraries required to run this program #
+#   PresenceAbsence - for ROC plots
+#   XML - for XML i/o
+#   rgdal - for geotiff i/o
+#   gbm
+#   gbmplus - not on CRAN, see elith et al or contact me.
+#   survival - used by gbm library
+#   splines -  used by gbm library
+#   lattice -  used by gbm library
+#   sp - used by rdgal library
+options(error=NULL)
+
+fit.brt.fct <- function(ma.name,tif.dir=NULL,output.dir=NULL,response.col="^response.binary",make.p.tif=T,make.binary.tif=T,
+      simp.method="cross-validation",debug.mode=F,responseCurveForm="jpg",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+     learning.rate = NULL, bag.fraction = 0.5,
+ prev.stratify = TRUE, model.family = "bernoulli",max.trees = 10000,tolerance.method = "auto",
+  tolerance = 0.001,seed=NULL,opt.methods=2,save.model=TRUE,UnitTest=FALSE,MESS=FALSE){
+
+# Possibly to add later
+# offset = NULL, fold.vector = NULL, var.monotone = rep(0,length(gbm.x))
+
+#  offset = NULL,                            # allows an offset to be specified
+#  fold.vector = NULL,                       # allows a fold vector to be read in for CV with offsets,
+#  tree.complexity = 1,                      # sets the complexity of individual trees
+#  learning.rate = 0.01,                     # sets the weight applied to inidivudal trees
+#  bag.fraction = 0.75,                      # sets the proportion of observations used in selecting variables
+#  site.weights = rep(1, nrow(dat)),         # allows varying weighting for sites
+#  var.monotone = rep(0, length(gbm.x)),     # restricts responses to individual predictors to monotone
+#  n.folds = 10,                             # number of folds
+#  prev.stratify = TRUE,                     # prevalence stratify the folds - only for p/a data
+#  family = "bernoulli",                     # family - bernoulli (=binomial), poisson, laplace or gaussian
+#  n.trees = 50,                             # number of initial trees to fit
+#  step.size = n.trees,                      # numbers of trees to add at each cycle
+#  max.trees = 10000,                        # max number of trees to fit before stopping
+#  tolerance.method = "auto",                # method to use in deciding to stop - "fixed" or "auto"
+#  tolerance = 0.001,                        # tolerance value to use - if method == fixed is absolute,
+#  seed=NULL                                 # sets a seed for the algorithm, any inegeger is acceptable
+#  opt.methods=2                             # sets the method used for threshold optimization used in the
+#                                            # the evaluation statistics module
+#  save.model=FALSE                          # whether the model will be used to later produce tifs
+
+    # This function fits a boosted regression tree model to presence-absence data.
+    # written by Alan Swanson, Jan-March 2009
+    # uses code modified from that published in Elith et al 2008
+    # Maintained and edited by Marian Talbert September 2010-
+    #
+    # Arguements.
+    # ma.name: is the name of a .csv file with a model array.  full path must be included unless it is in the current
+    #  R working directory #
+    # tif.dir: is the directory containing geotiffs for each covariate.  only required if geotiffs output of the
+    #   response surface is requested #    # cov.list.name: is the name of a text file with the names of covariates to be included in models (one per line).
+    # output.dir: is the directory that output files will be stored in.  if not given, files will go to the current working directory.
+    # response.col: column number of the model array containing a binary 0/1 response.  all other columns will be considered explanatory variables.
+    # make.p.tif: T if a geotiff of the response surface is desired.
+    # make.binary.tif: T if a geotiff of the response surface is desired.
+    # simp.method: model simplification method.  valid methods include: "cross-validation", "rel-inf", and "none".  "cross-validation" uses the
+    #   methods of Elith et al, 2008 for removing covariates that don't contribute to the model.  "rel-inf" simply removes covariates that contribute
+    #  less than 1%.  cross-validation is very slow - it can add up to 10min to a run.
+    # debug.mode: if T, output is directed to the console during the run.  also, a pdf is generated which contains response curve plots and perspective plots
+    #    showing the effects of interactions deemed important.  if F, output is diverted to a text file and the console is kept clear
+    #    except for final output of an xml file.  in either case, a set of standard output files are created in the output directory.
+    # tc:  tree-complexity for brt fits.  if specified, this sets the tree-complexity of the final model fit.  A lower tree-complexity will be used for
+    #    model selection steps.  if not set, this will be estimated loosely following the guidelines given by Elith et al, 2008.
+    #
+
+    # Value:
+    # returns nothing but generates a number of output files in the directory
+    # "output.dir" named above.  These output files consist of:
+    #
+    # brt_output.txt:  a text file with fairly detailed results of the final model.
+    # brt_output.xml:  an xml-formatted text file with results from the final model.
+    # brt_response_curves.xml:  an xml-formatted text file with response curves for
+    #   each covariate in the final model.
+    # brt_prob_map.tif:  a geotiff of the response surface
+    # brt_bin_map.tif:  a geotiff of the binary response surface.  threhold is based on the roc curve at the point where sensitivity=specificity.
+    # brt_log.txt:   a file containing text output diverted from the console when debug.mode=F
+    # brt_auc_plot.jpg:  a jpg file of a ROC plot.
+    # brt_response_curves.pdf:  an pdf file with response curves for
+    #   each covariate in the final model and perspective plots showing the effect of interactions deemed significant.
+    #   only produced when debug.mode=T
+    #
+    # when debug.mode is true, these filenames will include a number in them so that they will not overwrite preexisting files. eg brt_1_output.txt.
+    #
+    times <- as.data.frame(matrix(NA,nrow=8,ncol=1,dimnames=list(c("start","read data","model tuning","model fit",
+            "model summary","response curves","tif output","done"),c("time"))))
+    times[1,1] <- unclass(Sys.time())
+    t0 <- unclass(Sys.time())
+
+    #simp.method <- match.arg(simp.method)
+    out <- list(
+      input=list(ma.name=ma.name,
+                 tif.dir=tif.dir,
+                 output.dir=output.dir,
+                 response.col=response.col,
+                 make.p.tif=make.p.tif,
+                 make.binary.tif=make.binary.tif,
+                 tc=tc,
+                 save.model=save.model,
+                 learning.rate=learning.rate,
+                 n.folds=n.folds,
+                 bag.fraction=bag.fraction,
+                 prev.stratify=prev.stratify,
+                 model.family=model.family,
+                 max.trees=max.trees,
+                 tolerance.method=tolerance.method,
+                 tolerance=tolerance,
+                 simp.method=simp.method,
+                 alpha=alpha,
+                 model.type="boosted regression tree",
+                 model.source.file=script.name,
+                 model.fitting.subset=c(n.pres=500,n.abs=500),
+                 run.time=paste(c(format(Sys.time(),"%Y-%m-%d"),format(Sys.time(),"%H:%M:%S")),collapse="T"),
+                 sig.test="relative influence",
+                 MESS=MESS),
+      dat = list(missing.libs=NULL,
+                 output.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.ind=NULL,
+                 tif.names=NULL,
+                 bname=NULL,
+                 bad.factor.covs=NULL, # factorchange
+                 ma=list( status=c(exists=F,readable=F),
+                          dims=c(NA,NA),
+                          n.pres=c(all=NA,complete=NA,subset=NA,test=NA),
+                          n.abs=c(all=NA,complete=NA,subset=NA,test=NA),
+                          ratio=NA,
+                          resp.name=NULL,
+                          factor.levels=NA,
+                          used.covs=NULL,
+                          ma=NULL,
+                          train.weights=NULL,
+                          test.weights=NULL,
+                          train.xy=NULL,
+                          test.xy=NULL,
+                          ma.subset=NULL,
+                          weight.subset=NULL),
+                          ma.test=NULL),
+      mods=list(parms=list(n.target.trees=1000,tc.full=tc,tc.sub=tc),
+                lr.mod=NULL,
+                simp.mod=NULL,
+                final.mod=NULL,
+                r.curves=NULL,
+                tif.output=list(prob=NULL,bin=NULL),
+                auc.output=NULL,
+                interactions=NULL,
+                summary=NULL),
+      time=list(strt=unclass(Sys.time()),end=NULL),
+      error.mssg=list(NULL),
+      ec=0
+      )
+      if(!is.null(seed)) set.seed(seed)
+    # load libaries #
+
+    out <- check.libs(list("PresenceAbsence","rgdal","XML","sp","survival","lattice","raster","tcltk2","foreign","ade4","gbm"),out)
+
+    # exit program now if there are missing libraries #
+      if(!is.null(out$error.mssg[[1]])){
+          cat(saveXML(brt.to.xml(out),indent=T),'\n')
+          return()
+          }
+
+    if(is.na(match(simp.method,c("cross-validation","rel-inf","none")))){
+        out$ec <- out$ec+1
+        out$error.mssg[[out$ec]] <- "ERROR: arguement simp.method must be either cross-validation, rel-inf, or none"
+        cat(saveXML(brt.to.xml(out),indent=T),'\n')
+        return()
+        }
+
+    #if(simplify.brt==T) out$input$simp.method<-"cross-validation" else out$input$simp.method<-">1% rel. influence"
+
+    # check output dir #
+    out$dat$output.dir <- check.dir(output.dir)
+    if(out$dat$output.dir$writable==F) {out$ec<-out$ec+1
+              out$error.mssg[[out$ec]] <- paste("ERROR: output directory",output.dir,"is not writable")
+              out$dat$output.dir$dname <- getwd()
+              }
+
+    # generate a filename for output #
+    if(debug.mode==T){
+            outfile <- paste(bname<-paste(out$dat$output.dir$dname,"/brt_",n<-1,sep=""),"_output.txt",sep="")
+            while(file.access(outfile)==0) outfile<-paste(bname<-paste(out$dat$output.dir$dname,"/brt_",n<-n+1,sep=""),"_output.txt",sep="")
+            capture.output(cat("temp"),file=outfile) # reserve the new basename #
+    } else bname <- paste(out$dat$output.dir$dname,"/brt",sep="")
+    out$dat$bname <- bname
+
+    # sink console output to log file #
+    if(!debug.mode) {sink(logname <- paste(bname,"_log.txt",sep=""));on.exit(sink)} else logname<-NULL
+    options(warn=1)
+
+    # check tif dir #
+    if(!is.null(tif.dir)){
+      out$dat$tif.dir <- check.dir(tif.dir)
+      if(out$dat$tif.dir$readable==F & (out$input$make.binary.tif | out$input$make.p.tif)) {
+                out$ec<-out$ec+1
+                out$error.mssg[[out$ec]] <- paste("ERROR: tif directory",tif.dir,"is not readable")
+                if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+              cat(saveXML(brt.to.xml(out),indent=T),'\n')
+              return()
+              }
+            }
+
+    # find .tif files in tif dir #
+
+    if(out$dat$tif.dir$readable)  out$dat$tif.names <- list.files(out$dat$tif.dir$dname,pattern=".tif",recursive=T)
+
+    # check for model array #
+    out$input$ma.name <- check.dir(out$input$ma.name)$dname
+    out <- read.ma(out)
+    if(UnitTest==1) return(out)
+    # exit program now if there are errors in the input data #
+    if(!is.null(out$error.mssg[[1]])){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          cat(saveXML(brt.to.xml(out),indent=T),'\n')
+          return()
+          }
+
+    cat("\nbegin processing of model array:",out$input$ma.name,"\n")
+    cat("\nfile basename set to:",out$dat$bname,"\n")
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+    if(!debug.mode) {sink();cat("Progress:20%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("20%\n")}  ### print time
+    ##############################################################################################################
+    #  Begin model fitting #
+    ##############################################################################################################
+
+    # estimate optimal learning rate and tc #         o
+
+     if(out$input$model.family=="binomial")  out$input$model.family="bernoulli"
+    out <-est.lr(out)
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+
+    # exit program now if lr estimation fails #
+    if(!is.null(out$error.mssg[[1]])){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          cat(saveXML(brt.to.xml(out),indent=T),'\n')
+          return()}
+
+    cat("\nfinished with learning rate estimation, lr=",out$mods$lr.mod$lr0,", t=",round(out$mods$lr.mod$t.elapsed,2),"sec\n")
+    cat("\nfor final fit, lr=",out$mods$lr.mod$lr,"and tc=",out$mods$parms$tc.full,"\n");flush.console()
+    if(!debug.mode) {sink();cat("Progress:30%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("30%\n")}
+
+    if(out$input$simp.method=="cross-validation"){
+        # remove variables with <1% relative influence and re-fit model
+        print(debug.mode)
+        t1 <- unclass(Sys.time())
+            if(length(out$mods$lr.mod$good.cols)<=1) stop("BRT must have at least two independent variables")
+        m0 <- gbm.step.fast(dat=out$dat$ma$ma.subset,gbm.x=out$mods$lr.mod  $good.cols,gbm.y=1,family=out$input$model.family,
+              n.trees = c(300,600,800,1000,1200,1500,1800),step.size=out$input$step.size,max.trees=out$input$max.trees,
+              tolerance.method=out$input$tolerance.method,tolerance=out$input$tolerance, n.folds=out$input$n.folds,tree.complexity=out$mods$parms$tc.sub,
+              learning.rate=out$mods$lr.mod$lr0,bag.fraction=out$input$bag.fraction,site.weights=out$dat$ma$weight.subset,autostop=T,debug.mode=F,silent=!debug.mode,
+              plot.main=F,superfast=F)
+              if(debug.mode) assign("m0",m0,envir=.GlobalEnv)
+
+              t1b <- unclass(Sys.time())
+              if(!debug.mode) {sink();cat("Progress:40%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("40%\n")}
+              cat("\nfinished with trimmed model fitting, n.trees=",m0$target.trees,", t=",round(t1b-t1,2),"sec\n");flush.console()
+              cat("\nbeginning model simplification - very slow...\n");flush.console()
+        out$mods$simp.mod <- gbm.simplify(m0,n.folds=out$input$n.folds,plot=F,verbose=F,alpha=out$input$alpha) # this step is very slow #
+              if(debug.mode) assign("out",out,envir=.GlobalEnv)
+
+              out$mods$simp.mod$good.cols <- out$mods$simp.mod$pred.list[[length(out$mods$simp.mod$pred.list)]]
+              out$mods$simp.mod$good.vars <- names(out$dat$ma$ma)[out$mods$simp.mod$good.cols]
+              cat("\nfinished with model simplification, t=",round((unclass(Sys.time())-t1b)/60,2),"min\n");flush.console()
+              if(!debug.mode) {sink();cat("Progress:50%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("50%\n")}
+              }
+
+          # fit final model #
+          t2 <- unclass(Sys.time())
+
+   if(out$mods$lr.mod$lr==0) out$mods$lr.mod$lr<-out$mods$lr.mod$lr0
+  out$mods$final.mod <- gbm.step.fast(dat=out$dat$ma$ma,gbm.x=out$mods$simp.mod$good.cols,gbm.y = 1,family=out$input$model.family,
+                  n.trees = c(300,600,700,800,900,1000,1200,1500,1800,2200,2600,3000,3500,4000,4500,5000),n.folds=out$input$n.folds,
+                  tree.complexity=out$mods$parms$tc.full,learning.rate=out$mods$lr.mod$lr,bag.fraction=out$input$bag.fraction,site.weights=out$dat$ma$train.weights,
+                  autostop=T,debug.mode=F,silent=!debug.mode,plot.main=F,superfast=F)
+
+
+
+    assign("out",out,envir=.GlobalEnv)
+
+    t3 <- unclass(Sys.time())
+    cat("\nfinished with final model fitting, n.trees=",out$mods$final.mod$target.trees,", t=",round(t3-t2,2),"sec\n\n\n");flush.console()
+    if(!debug.mode) {sink();cat("Progress:60%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("60%\n")}
+
+    ##############################################################################################################
+    #  Begin model output #
+    ##############################################################################################################
+
+    # Store .jpg ROC plot #
+
+    # Generate and store text summary #
+    y <- gbm.interactions(out$mods$final.mod)
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+    if(class(y)!="try-error"){
+        int <- y$rank.list;
+        int<-int[int$p<.05,]
+        int <- int[order(int$p),]
+        int$p <- round(int$p,4)
+        names(int) <- c("v1","name1","v2","name2","int.size","p-value")
+        row.names(int)<-NULL
+        if(nrow(int)>0) out$mods$interactions <- int else out$mods$interactions <- NULL
+        } else {
+        out$ec <-out$ec+1
+        out$error.mssg[[out$ec]] <- paste("ERROR: problem assessing interactions:",y)
+        }
+
+    model.summary <- summary(out$mods$final.mod,plotit=F)
+    if(class(model.summary)=="try-error"){
+        if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+        out$ec<-out$ec+1
+        out$error.mssg[[out$ec]] <- paste("ERROR: can't generate summary of final model:",model.summary)
+        cat(saveXML(brt.to.xml(out),indent=T),'\n')
+        return()
+    } else {
+        out$mods$summary <- model.summary
+        }
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+    
+
+    
+    if(!is.null(out$dat$bad.factor.cols)){
+        capture.output(cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n"),
+            file=paste(bname,"_output.txt",sep=""),append=T)
+        cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n\n")
+        }
+
+
+    txt0 <- paste("\nBoosted Regression Tree Modeling Results\n",out$input$run.time,"\n\n",
+                  "Data:\n",ma.name,"\n",
+                  "\n\tn(pres)=",out$dat$ma$n.pres[2],
+                  "\n\tn(abs)=",out$dat$ma$n.abs[2],
+                  "\n\tn covariates considered=",length(out$dat$ma$used.covs),
+        "\n\n","Settings:\n",
+                "\n\ttree complexity=",out$mods$parms$tc.full,
+                "\n\tlearning rate=",round(out$mods$lr.mod$lr,4),
+                "\n\tn(trees)=",out$mods$final.mod$target.trees,
+                "\n\tmodel simplification=",out$input$simp.method,
+                "\n\tn folds=",out$input$n.folds,
+                "\n\tn covariates in final model=",nrow(out$mods$final.mod$contributions),
+        "\n\ttotal time for model fitting=",round((unclass(Sys.time())-t0)/60,2),"min\n",sep="")
+    txt1 <- "\nRelative influence of predictors in final model:\n\n"
+    txt2 <- "\nImportant interactions in final model:\n\n"
+
+    capture.output(cat(txt0),cat(txt1),print(out$mods$final.mod$contributions),cat(txt2),print(out$mods$interactions,row.names=F),file=paste(bname,"_output.txt",sep=""))
+    cat(txt0);cat(txt1);print(out$mods$final.mod$contributions);cat(txt2);print(out$mods$interactions,row.names=F)
+
+  if(out$input$model.family=="bernoulli"){
+      auc.output <- make.auc.plot.jpg(out$dat$ma$ma,pred=predict.gbm(out$mods$final.mod,out$dat$ma$ma,
+            out$mods$final.mod$target.trees,type="response"),plotname=paste(bname,"_auc_plot.jpg",sep=""),modelname="BRT",opt.methods=opt.methods,
+            weight=out$dat$ma$train.weights,out=out)
+
+      out$mods$auc.output<-auc.output
+      }
+  if(out$input$model.family=="poisson"){
+      auc.output <- make.poisson.jpg(out$dat$ma$ma,pred=predict.gbm(out$mods$final.mod,out$dat$ma$ma,
+            out$mods$final.mod$target.trees,type="response"),plotname=paste(bname,"_auc_plot.jpg",sep=""),modelname="BRT",
+            weight=out$dat$ma$train.weights,out=out)
+
+      out$mods$auc.output<-auc.output
+      }
+
+    if(!debug.mode) {sink();cat("Progress:70%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("70%\n")}
+
+    # Response curves #
+    if(is.null(responseCurveForm)){
+    responseCurveForm<-0}
+
+    if(debug.mode | responseCurveForm=="pdf"){
+        nvar <- nrow(out$mods$final.mod$contributions)
+        pcol <- min(ceiling(sqrt(nvar)),4)
+        prow <- min(ceiling(nvar/pcol),3)
+
+        pdf(paste(bname,"_response_curves.pdf",sep=""),width=11,height=8.5,onefile=T)
+            par(oma=c(2,2,4,2))
+            r.curves <- try(gbm.plot(out$mods$final.mod,plotit=T,plot.layout=c(prow,pcol)))
+            if(class(r.curves)!="try-error") {out$mods$r.curves <- r.curves
+            mtext(paste("BRT response curves for",basename(ma.name)),outer=T,side=3,cex=1.3)}
+            par(mfrow=c(1,1))
+            #for(i in 1:min(nrow(int),2)) gbm.perspec(fit,int$var1.index[i],int$var2.index[i])
+            if(!is.null(out$mods$interactions)){
+                for(i in 1:nrow(out$mods$interactions)) {gbm.perspec(out$mods$final.mod,out$mods$interactions$v1[i],out$mods$interactions$v2[i])
+                mtext(paste("BRT interaction plots for",basename(ma.name)),outer=T,side=3,cex=1.5) }
+                }
+        graphics.off()
+        } else {
+            r.curves <- try(gbm.plot(out$mods$final.mod,plotit=F))
+            if(class(r.curves)!="try-error") {out$mods$r.curves <- r.curves
+              } else {
+              out$ec<-out$ec+1
+              out$error.mssg[[out$ec]] <- paste("ERROR: problem fitting response curves",r.curves)
+              }
+        }
+    t4 <- unclass(Sys.time())
+    cat("\nfinished with final model summarization, t=",round(t4-t3,2),"sec\n");flush.console()
+    if(!debug.mode) {sink();cat("Progress:80%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("80%\n")}
+
+    assign("out",out,envir=.GlobalEnv)
+    # Make .tif of predictions #
+    
+    save.image(paste(output.dir,"modelWorkspace",sep="\\"))
+    if(out$input$make.p.tif==T | out$input$make.binary.tif==T){
+        cat("\nproducing prediction maps...","\n","\n");flush.console()
+        mssg <- proc.tiff(model=out$mods$final.mod,vnames=as.character(out$mods$final.mod$contributions$var),
+            tif.dir=out$dat$tif.dir$dname,filenames=out$dat$tif.ind,pred.fct=brt.predict,factor.levels=out$dat$ma$factor.levels,make.binary.tif=make.binary.tif,
+            thresh=out$mods$auc.output$thresh,make.p.tif=make.p.tif,outfile.p=paste(out$dat$bname,"_prob_map.tif",sep=""),
+            outfile.bin=paste(out$dat$bname,"_bin_map.tif",sep=""),tsize=50.0,NAval=-3000,logname=logname,out=out)     #"brt.prob.map.tif"
+
+        if(class(mssg)=="try-error" | mssg!=0){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          out$ec<-out$ec+1
+          out$error.mssg[[out$ec]] <- paste("Error producing prediction maps:",mssg)
+          cat(saveXML(brt.to.xml(out),indent=T),'\n')
+          return()
+        }  else {
+            if(make.p.tif) out$mods$tif.output$prob <- paste(out$dat$bname,"_prob_map.tif",sep="")
+            if(make.binary.tif) out$mods$tif.output$bin <- paste(out$dat$bname,"_bin_map.tif",sep="")
+            t5 <- unclass(Sys.time())
+            cat("\nfinished with prediction maps, t=",round(t5-t4,2),"sec\n");flush.console()
+          }
+        }
+    if(!debug.mode) {sink();cat("Progress:90%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("90%\n")}  ### print time
+
+    # Evaluation Statistics on Test Data#
+
+    if(!is.null(out$dat$ma$ma.test)) Eval.Stat<-EvaluationStats(out,thresh=auc.output$thresh,train=out$dat$ma$ma,train.pred=predict.gbm(out$mods$final.mod,out$dat$ma$ma,
+            out$mods$final.mod$target.trees,type="response"),opt.methods)
+
+
+    
+    # Write summaries to xml #
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+    doc <- brt.to.xml(out)
+
+    cat(paste("\ntotal time=",round((unclass(Sys.time())-t0)/60,2),"min\n\n\n",sep=""))
+    if(!debug.mode) {
+        sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))
+        cat("Progress:100%\n");flush.console() ### print time
+
+        cat(saveXML(doc,indent=T),'\n')
+        }
+    capture.output(cat(saveXML(doc,indent=T)),file=paste(out$dat$bname,"_output.xml",sep=""))
+    if(debug.mode) assign("fit",out$mods$final.mod,envir=.GlobalEnv)
+    invisible(out)
+}
+
+brt.predict <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictions from complete data only #
+    #y <- rep(NA,nrow(x))
+    #y[complete.cases(x)] <- predict.gbm(model, x[complete.cases(x),],model$target.trees,type="response")
+
+    # make predictions from full data #
+    y <- predict.gbm(model,x,model$target.trees,type="response")
+    # encode missing values as -1.
+     a<-complete.cases(x)
+    y[!(a)]<- NaN
+
+    # return predictions.
+    return(y)
+    }
+
+
+
+
+logit <- function(x) 1/(1+exp(-x))
+
+file_path_as_absolute <- function (x){
+    if (!file.exists(epath <- path.expand(x)))
+        stop(gettextf("file '%s' does not exist", x), domain = NA)
+    cwd <- getwd()
+    on.exit(setwd(cwd))
+    if (file_test("-d", epath)) {
+        setwd(epath)
+        getwd()
+    }
+    else {
+        setwd(dirname(epath))
+        file.path(getwd(), basename(epath))
+    }
+}
+#file_path_as_absolute(".")
+
+brt.to.xml <- function(out){
+    require(XML)
+    schema.http="http://www.w3.org/2001/XMLSchema-instance"
+    schema.fname="file:/Users/isfs2/Desktop/Source/2008-04-09/src/gov/nasa/gsfc/quickmap/ModelBuilder/modelRun_output_v2.xsd"
+    xml.out <- newXMLDoc()
+    mr <- newXMLNode("modelRunOutput",doc=xml.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))#,parent=xml.out
+    sm <- newXMLNode("singleModel",parent=mr)
+    bg <- newXMLNode("background",parent=sm)
+        newXMLNode("mdsName",out$input$ma.name,parent=bg)
+        newXMLNode("runDate",out$input$run.time,parent=bg)
+        lc <- newXMLNode("layersConsidered",parent=bg)#, parent = xml.out)
+        kids <- lapply(paste(out$dat$tif.dir$dname,"/",out$dat$ma$used.covs,".tif",sep=""),function(x) newXMLNode("layer", x))
+        addChildren(lc, kids)
+    mo <- newXMLNode("modelOutput",parent=sm)
+        newXMLNode("modelType",out$input$model.type,parent=mo)
+        newXMLNode("modelSourceFile",out$input$model.source.file,parent=mo)
+        newXMLNode("devianceExplained",out$mods$auc.output$pct_dev_exp,parent=mo,attrs=list(type="percentage"))
+        if(!is.null(out$mods$summary)){
+              newXMLNode("nativeOutput",paste(out$dat$bname,"_output.txt",sep=""),parent=mo)
+              } else {
+              newXMLNode("nativeOutput",NULL,parent=mo)
+              }
+        newXMLNode("binaryOutputFile",out$mods$tif.output[[2]],parent=mo)
+        newXMLNode("probOutputFile",out$mods$tif.output[[1]],parent=mo)
+        newXMLNode("auc",out$mods$auc.output$auc,parent=mo)
+        newXMLNode("rocGraphic",out$mods$auc.output$plotname,parent=mo)
+        newXMLNode("rocThresh",out$mods$auc.output$thresh,parent=mo)
+        newXMLNode("modelDeviance",out$mods$auc.output$dev_fit,parent=mo)
+        newXMLNode("nullDeviance",out$mods$auc.output$null_dev,parent=mo)
+        if(is.null(out$mods$r.curves)) rc.name <- NULL else rc.name <- paste(out$dat$bname,"_response_curves.xml",sep="")
+        newXMLNode("responsePlotsFile",rc.name,parent=mo)
+        newXMLNode("significanceDescription",out$input$sig.test,parent=mo)
+        mfp <- newXMLNode("modelFitParmas",parent=mo)
+            newXMLNode("treeComplexity",out$input$tc,parent=mfp)
+            newXMLNode("bagFraction",out$input$bag.fraction,parent=mfp)
+            newXMLNode("simpMethod",out$input$simp.method,parent=mfp)
+            newXMLNode("alpha",out$input$alpha,parent=mfp)
+
+        sv <- newXMLNode("significantVariables",parent=mo)
+        if(!is.null(out$mods$summary)) {
+            t.table <- data.frame(significanceMeasurement=out$mods$summary$rel.inf,row.names=out$mods$summary$var)
+            if(!is.null(out$mods$interactions)){
+                int1 <- int2 <- out$mods$interactions
+                int2$name1 <- int1$name2
+                int2$name2 <- int1$name1
+                int <- rbind(int1,int2)
+                }
+
+            for(i in 1:nrow(t.table)){
+                x <- newXMLNode("sigVar",parent=sv)
+                newXMLNode(name="name", row.names(t.table)[i],parent=x)
+                kids <- lapply(1:ncol(t.table),function(j) newXMLNode(name=names(t.table)[j], t.table[i,j]))
+                addChildren(x, kids)
+                if(!is.null(out$mods$interactions)){
+                    ints <-  c(1:nrow(int))[int$name1 %in% row.names(t.table)[i]]
+                    if(length(ints)>0){
+                        kids <- lapply(ints,function(j) newXMLNode(name="sigInteraction",attrs=list(name=as.character(int$name2)[j],size=int$int.size[j],p=int$"p-value"[j])))
+                        addChildren(x,kids)
+                        }
+
+                    }
+                }
+            }
+
+    if(!is.null(out$mods$r.curves)){
+        r.curves <-  out$mods$r.curves
+        factor.levels <- out$dat$ma$factor.levels
+        rc.out <- newXMLDoc()
+        root <- newXMLNode("responseCurves",doc=rc.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))
+        for(i in 1:length(r.curves$names)){
+            if(!is.na(f.index<-match(r.curves$names[i],names(factor.levels)))){
+                  vartype <- "factor"} else vartype="continuous"
+            x <- newXMLNode("responseCurve",attrs=list(covariate=r.curves$names[i],type=vartype),parent=root)
+            kids <- lapply(1:length(r.curves$preds[[i]]),function(j){
+                    newXMLNode(name="responsePt",parent=x,.children=list(
+                        newXMLNode(name="explanatory",as.character(r.curves$preds[[i]])[j]),
+                        newXMLNode(name="response",r.curves$resp[[i]][j])))})
+            addChildren(x, kids)
+            }
+        saveXML(rc.out,rc.name,indent=T)
+
+        }
+    if(!is.null(out$error.mssg[[1]])) {
+        kids <- lapply(out$error.mssg,function(j) newXMLNode(name="error",j))
+        addChildren(mo,kids)
+        }
+    return(xml.out)
+    }
+
+
+get.cov.names <- function(model){
+    return(attr(terms(formula(model)),"term.labels"))
+    }
+
+
+
+est.lr <- function(out){
+    # this function estimates optimal number of trees at a variety of learning rates #
+    # the learning rate that produces closest to 1000 trees is selected #
+    # in addition, variables with >1% influence are identified by column number in
+    # the original dataframe
+    # written by AKS early 2009
+    suppressMessages(require(gbm))
+
+    t0 <- unclass(Sys.time())
+
+    # set tree complexity for full-data run #
+    a<-2.69; b<-0.0012174
+    if(is.null(out$mods$parms$tc.full)) out$mods$parms$tc.full<-min(round(a+b*out$dat$ma$dims[1]),15) # this gives 3 for n=250
+    if(is.null(out$mods$parms$tc.sub)){
+        n <- out$dat$ma$n.abs[3]+out$dat$ma$n.pres[3]  # this gives 3 for n=250
+       if(is.na(n)) (n=length(out$dat$ma$weight.subset))
+        out$mods$parms$tc.sub <- round(a+b*n)
+    }
+
+    cat("\n");cat("tree complexity set to",out$mods$parms$tc.sub,"\n")
+
+    n.trees <- c(100,200,400,800,900,1000,1100,1200,1500,1800,2400)
+    lrs <- c(.1,.06,.05,.04,.03,.02,.01,.005,.0025,.001,.0005,.0001)
+    lr.out <- data.frame(lrs=lrs,max.trees=0)
+    dat <- out$dat$ma$ma.subset
+    gbm.y <- 1
+    gbm.x <- 2:ncol(dat)
+
+    max.trees <- 0
+    i=1
+
+    while(max.trees<800 & i<=nrow(lr.out)){
+
+       tryCatch(gbm.fit <- gbm.step.fast(dat=dat,
+          gbm.x = gbm.x,
+          gbm.y = gbm.y,
+          family = out$input$model.family,
+          n.trees = n.trees,
+          n.folds=out$input$n.folds,
+          tree.complexity = out$mods$parms$tc.sub,
+          learning.rate = lrs[i],
+          bag.fraction = out$input$bag.fraction,
+          site.weights=out$dat$ma$weight.subset,
+          autostop=T,verbose=F,silent=T,plot.main=F),error=function(ex){cat("Error: learning rate estimation failed.\n");
+          print(ex);
+          stop();})
+          
+       if(class(gbm.fit)=="try-error"){
+            out$ec <- out$ec+1
+            out$error.mssg[[out$ec]] <- paste("ERROR: learning rate estimation failed:",gbm.fit)
+            return(out)
+            }
+       lr.out$max.trees[i] <- max.trees <- gbm.fit$target.trees
+       assign(paste("gbm.fit",i,sep="_"),gbm.fit)
+       cat("lr =",lrs[i],"  optimal n trees =",max.trees,"\n");flush.console()
+       i<-i+1 #ifelse(max.trees<=200,i+2,i+1)
+       }
+    # pick lr that gives closest to 1000 trees #
+
+    lr.out$i <- 1:nrow(lr.out)
+    lr.out <- lr.out[lr.out$max.trees!=0,]
+    ab<-coef(lm(max.trees~log(lrs),data=lr.out))
+    tt <- out$dat$ma$ratio*800
+    lr.full <- round(as.numeric(exp((tt-ab[1])/ab[2])),4)
+    lr <- round(as.numeric(exp((1000-ab[1])/ab[2])),6)
+    lr.out$abs <- abs(lr.out$max.trees-1000)
+    lr.out$d.lr <- abs(lr.out$lrs-lr)
+    lr.out <- lr.out[order(lr.out$abs,lr.out$d.lr),]
+    lr0 <- lr.out$lrs[1]
+    i <- lr.out$i[1]
+    gbm.fit <- get(paste("gbm.fit",i,sep="_"))
+    gbm.fit$gbm.call$dataframe <- as.character(substitute(dat))
+    good.vars <- summary(gbm.fit,plotit=F)
+    good.vars <- good.vars$var[good.vars$rel.inf>ifelse(out$input$simp.method!="none",1,0)]
+    good.cols <- c(1:ncol(dat))[names(dat)  %in%  good.vars]
+    out$mods$simp.mod <- list(good.cols=good.cols,good.vars=good.vars)
+    out$mods$lr.mod <- list(tc=out$mods$parms$tc.sub,lr=lr.full,lr0=lr0,lr.out=lr.out,ab=ab,gbm.fit=gbm.fit,good.cols=good.cols,t.elapsed=c(unclass(Sys.time())-t0))
+    if(!is.null(out$input$learning.rate)) {out$mods$lr.mod$lr0=out$input$learning.rate
+       out$mods$lr.mod$lr=out$input$learning.rate
+    }
+    return(out)
+    }
+
+
+check.dir <- function(dname){
+    if(is.null(dname)) dname <- getwd()
+    dname <- gsub("[\\]","/",dname)
+    end.char <- substr(dname,nchar(dname),nchar(dname))
+    if(end.char == "/") dname <- substr(dname,1,nchar(dname)-1)
+    exist <- suppressWarnings(as.numeric(file.access(dname,mode=0))==0) # -1 if bad, 0 if ok #
+    if(exist) dname <- file_path_as_absolute(dname)
+    readable <- suppressWarnings(as.numeric(file.access(dname,mode=4))==0) # -1 if bad, 0 if ok #
+    writable <- suppressWarnings(as.numeric(file.access(dname,mode=2))==0) # -1 if bad, 0 if ok #
+    return(list(dname=dname,exist=exist,readable=readable,writable=writable))
+    }
+
+
+
+get.image.info <- function(image.names){
+    # this function creates a data.frame with summary image info for a set of images #
+    require(rgdal)
+    n.images <- length(image.names)
+
+    full.names <- image.names
+    out <- data.frame(image=full.names,available=rep(F,n.images),size=rep(NA,n.images),
+        type=factor(rep("unk",n.images),levels=c("asc","envi","tif","unk")))
+    out$type[grep(".tif",image.names)]<-"tif"
+    out$type[grep(".asc",image.names)]<-"asc"
+    for(i in 1:n.images){
+        if(out$type[i]=="tif"){
+            x <-try(GDAL.open(full.names[1],read.only=T))
+            suppressMessages(try(GDAL.close(x)))
+            if(class(x)!="try-error") out$available[i]<-T
+            x<-try(file.info(full.names[i]))
+        } else {
+            x<-try(file.info(full.names[i]))
+            if(!is.na(x$size)) out$available[i]<-T
+        }
+        if(out$available[i]==T){
+            out$size[i]<-x$size
+            if(out$type[i]=="unk"){
+                # if extension not known, look for envi .hdr file in same directory #
+                if(file.access(paste(file_path_sans_ext(full.names[i]),".hdr",sep=""))==0)
+                    out$type[i]<-"envi"
+                }
+        }
+    }
+    return(out)
+}
+
+gbm.step.fast <- function(
+  dat,                             # the input dataframe
+  gbm.x,                                    # the predictors
+  gbm.y,                                    # and response
+  offset = NULL,                            # allows an offset to be specified
+  fold.vector = NULL,                       # allows a fold vector to be read in for CV with offsets,
+  tree.complexity = 1,                      # sets the complexity of individual trees
+  learning.rate = 0.01,                     # sets the weight applied to inidivudal trees
+  bag.fraction = 0.75,                      # sets the proportion of observations used in selecting variables
+  site.weights = rep(1, nrow(dat)),        # allows varying weighting for sites
+  var.monotone = rep(0, length(gbm.x)),     # restricts responses to individual predictors to monotone
+  n.folds = 10,                             # number of folds
+  prev.stratify = TRUE,                     # prevalence stratify the folds - only for p/a data
+  family = "bernoulli",                     # family - bernoulli (=binomial), poisson, laplace or gaussian
+  n.trees = 50,                             # number of initial trees to fit
+  step.size = n.trees,                      # numbers of trees to add at each cycle
+  max.trees = 10000,                        # max number of trees to fit before stopping
+  tolerance.method = "auto",                # method to use in deciding to stop - "fixed" or "auto"
+  tolerance = 0.001,                        # tolerance value to use - if method == fixed is absolute,
+                                            # if auto is multiplier * total mean deviance
+  keep.data = FALSE,                        # keep raw data in final model
+  plot.main = TRUE,                         # plot hold-out deviance curve
+  plot.folds = FALSE,                       # plot the individual folds as well
+  verbose = TRUE,                           # control amount of screen reporting
+  silent = FALSE,                           # to allow running with no output for simplifying model)
+  keep.fold.models = FALSE,                 # keep the fold models from cross valiation
+  keep.fold.vector = FALSE,                 # allows the vector defining fold membership to be kept
+  keep.fold.fit = FALSE,                    # allows the predicted values for observations from CV to be kept
+  autostop = FALSE,                       # setting autostop to T causes the tree fitting while loop to terminate
+                                            #   if the cv.loss value increases twice in a row (AKS).
+
+  superfast=FALSE,                          # controls whether or not to compute final model when optimal n.trees differs from 1000 (AKS)
+  ...)                                      # allows for any additional plotting parameters
+{
+#
+# j. leathwick/j. elith - 19th September 2005
+#
+# version 2.9
+#
+# function to assess optimal no of boosting trees using k-fold cross validation
+#
+# implements the cross-validation procedure described on page 215 of
+# Hastie T, Tibshirani R, Friedman JH (2001) The Elements of Statistical Learning:
+# Data Mining, Inference, and Prediction Springer-Verlag, New York.
+#
+# divides the data into 10 subsets, with stratification by prevalence if required for pa data
+# then fits a gbm model of increasing complexity along the sequence from n.trees to n.trees + (n.steps * step.size)
+# calculating the residual deviance at each step along the way
+# after each fold processed, calculates the average holdout residual deviance and its standard error
+# then identifies the optimal number of trees as that at which the holdout deviance is minimised
+# and fits a model with this number of trees, returning it as a gbm model along with additional information
+# from the cv selection process
+#
+# updated 13/6/05 to accommodate weighting of sites
+#
+# updated 19/8/05 to increment all folds simultaneously, allowing the stopping rule
+# for the maxinum number of trees to be fitted to be imposed by the data,
+# rather than being fixed in advance
+#
+# updated 29/8/05 to return cv test statistics, and deviance as mean
+# time for analysis also returned via unclass(Sys.time())
+#
+# updated 5/9/05 to use external function calc.deviance
+# and to return cv test stats via predictions formed from fold models
+# with n.trees = target.trees
+#
+# updated 15/5/06 to calculate variance of fitted and predicted values across folds
+# these can be expected to approximate the variance of fitted values
+# as would be estimated for example by bootstrapping
+# as these will underestimate the true variance
+# they are corrected by multiplying by (n-1)2/n
+# where n is the number of folds
+#
+# updated 25/3/07 tp allow varying of bag fraction
+#
+# requires gbm library from Cran
+# requires roc and calibration scripts of J Elith
+# requires calc.deviance script of J Elith/J Leathwick
+#
+# updated 1/2/09 by aks:
+# now takes a vector arguement for n.trees:  if n.trees is given as a (should be montonically
+#   increasing) vector, then models with those # of trees are fit.  if n.trees is a single number,
+#   then the program works as default
+# there is also a provision for stopping the fitting of successive models IF the cv.loss.value increases
+#   over two successive steps.
+
+  require(gbm)
+
+  if (silent) verbose <- FALSE
+
+# initiate timing call
+
+  z1 <- unclass(Sys.time())
+
+# setup input data and assign to position one
+
+  dataframe.name <- deparse(substitute(dat))   # get the dataframe name
+
+  dat <- eval(dat)
+  x.data <- eval(dat[, gbm.x])                 #form the temporary datasets
+  names(x.data) <- names(dat)[gbm.x]
+  y.data <- eval(dat[, gbm.y])
+  sp.name <- names(dat)[gbm.y]
+  if (family == "bernoulli") prevalence <- mean(y.data)
+
+  assign("x.data", x.data, env = globalenv())               #and assign them for later use
+  assign("y.data", y.data, env = globalenv())
+
+  offset.name <- deparse(substitute(offset))   # get the dataframe name
+  offset = eval(offset)
+  #print(summary(offset))
+
+  n.cases <- nrow(dat)
+  n.preds <- length(gbm.x)
+
+  if (!silent) {
+    cat("\n","\n");cat("GBM STEP - version 2.9","\n","\n") #AKS
+    cat("Performing cross-validation optimization of a boosted regression tree model \n")#AKS
+    cat("for",sp.name,"with dataframe",dataframe.name,"and using a family of",family,"\n\n")
+    cat("Using",n.cases,"observations and",n.preds,"predictors \n\n")
+    flush.console() #AKS
+  }
+
+# set up the selector variable either with or without prevalence stratification
+
+  if (is.null(fold.vector)) {
+
+    if (prev.stratify & family == "bernoulli") {
+      presence.mask <- dat[,gbm.y] == 1
+      absence.mask <- dat[,gbm.y] == 0
+      n.pres <- sum(presence.mask)
+      n.abs <- sum(absence.mask)
+
+# create a vector of randomised numbers and feed into presences
+      selector <- rep(0,n.cases)
+      temp <- rep(seq(1, n.folds, by = 1), length = n.pres)
+      temp <- temp[order(runif(n.pres, 1, 100))]
+      selector[presence.mask] <- temp
+
+# and then do the same for absences
+      temp <- rep(seq(1, n.folds, by = 1), length = n.abs)
+      temp <- temp[order(runif(n.abs, 1, 100))]
+      selector[absence.mask] <- temp
+      }
+
+    else {  #otherwise make them random with respect to presence/absence
+      selector <- rep(seq(1, n.folds, by = 1), length = n.cases)
+      selector <- selector[order(runif(n.cases, 1, 100))]
+      }
+    }
+  else {
+    if (length(fold.vector) != n.cases) stop("supplied fold vector is of wrong length")
+    cat("loading user-supplied fold vector \n\n")
+    selector <- eval(fold.vector)
+    }
+
+# set up the storage space for results
+
+  pred.values <- rep(0, n.cases)
+
+  cv.loss.matrix <- matrix(0, nrow = n.folds, ncol = 1)
+  training.loss.matrix <- matrix(0, nrow = n.folds, ncol = 1)
+  trees.fitted <- n.trees[1]
+
+  model.list <- list(paste("model",c(1:n.folds),sep=""))     # dummy list for the tree models
+
+# set up the initial call to gbm
+
+  if (is.null(offset)) {  #AKS (n.trees arg)
+    gbm.call <- paste("gbm(y.subset~.,data=x.subset,n.trees=n.trees[1],interaction.depth=tree.complexity,shrinkage=learning.rate,bag.fraction=bag.fraction,weights=weight.subset,distribution=as.character(family),var.monotone=var.monotone,verbose=FALSE)",sep="")
+    }
+  else {       #AKS (n.trees arg)
+    gbm.call <- paste("gbm(y.subset~.+offset(offset.subset),data=x.subset,n.trees=n.trees[1],interaction.depth=tree.complexity,shrinkage=learning.rate,bag.fraction=bag.fraction,weights=weight.subset,distribution=as.character(family),var.monotone=var.monotone,verbose=FALSE)",sep="")
+    }
+
+
+  n.fitted <- n.trees[1] # AKS
+
+# calculate the total deviance
+
+  y_i <- y.data
+
+  u_i <- sum(y.data * site.weights) / sum(site.weights)
+  u_i <- rep(u_i,length(y_i))
+
+  total.deviance <- calc.deviance(y_i, u_i, weights = site.weights, family = family, calc.mean = FALSE)
+
+  mean.total.deviance <- total.deviance/n.cases
+
+  tolerance.test <- tolerance
+
+  if (tolerance.method == "auto") {
+     tolerance.test <- mean.total.deviance * tolerance
+  }
+
+# now step through the folds setting up the initial call
+
+  if (!silent){
+
+    cat("creating",n.folds,"initial models of",n.trees,"trees","\n")
+
+    if (prev.stratify & family == "bernoulli") {cat("\n");cat("folds are stratified by prevalence","\n","\n")#AKS
+      } else {cat("\n","folds are unstratified","\n","\n")}
+
+    cat ("total mean deviance = ",round(mean.total.deviance,4),"\n","\n")
+
+    cat("tolerance is fixed at ",round(tolerance.test,4),"\n","\n")
+    flush.console()#AKS
+
+    if (tolerance.method != "fixed" & tolerance.method != "auto") {
+      cat("invalid argument for tolerance method - should be auto or fixed","\n")
+      return()}
+  }
+
+  if (verbose) cat("fitting initial model...","\n");flush.console()#AKS
+
+  for (i in 1:n.folds) {
+
+    model.mask <- selector != i  #used to fit model on majority of data
+    pred.mask <- selector == i   #used to identify the with-held subset
+
+    y.subset <- y.data[model.mask]
+    x.subset <- x.data[model.mask,]
+    weight.subset <- site.weights[model.mask]
+
+    if (!is.null(offset)) {
+      offset.subset <- offset[model.mask]
+    }
+    else {
+      offset.subset <- NULL
+    }
+
+    model.list[[i]] <- eval(parse(text = gbm.call))
+
+    fitted.values <- model.list[[i]]$fit  #predict.gbm(model.list[[i]], x.subset, type = "response", n.trees = n.trees)
+    if (!is.null(offset)) fitted.values <- fitted.values + offset[model.mask]
+    if (family == "bernoulli") fitted.values <- exp(fitted.values)/(1 + exp(fitted.values))
+    if (family == "poisson") fitted.values <- exp(fitted.values)
+
+    pred.values[pred.mask] <- predict.gbm(model.list[[i]], x.data[pred.mask, ], n.trees = n.trees[1])
+    if (!is.null(offset)) pred.values[pred.mask] <- pred.values[pred.mask] + offset[pred.mask]
+    if (family == "bernoulli") pred.values[pred.mask] <- exp(pred.values[pred.mask])/(1 + exp(pred.values[pred.mask]))
+    if (family == "poisson") pred.values[pred.mask] <- exp(pred.values[pred.mask])
+
+# calc training deviance
+
+    y_i <- y.subset
+    u_i <- fitted.values
+    weight.fitted <- site.weights[model.mask]
+    training.loss.matrix[i,1] <- calc.deviance(y_i, u_i, weight.fitted, family = family)
+
+# calc holdout deviance
+
+    y_i <- y.data[pred.mask]
+    u_i <- pred.values[pred.mask]
+    weight.preds <- site.weights[pred.mask]
+    cv.loss.matrix[i,1] <- calc.deviance(y_i, u_i, weight.preds, family = family)
+
+  } # end of first loop
+
+# now process until the change in mean deviance is =< tolerance or max.trees is exceeded
+
+  delta.deviance <- 1
+
+  cv.loss.values <- apply(cv.loss.matrix,2,mean)
+  if (verbose) cat("ntrees resid. dev.","\n")#AKS
+  if (verbose) cat(n.fitted,"  ",round(cv.loss.values,4),"\n","\n")
+
+  if (!silent) cat("")
+  if (!silent) cat("now adding trees...","\n");flush.console()#AKS
+
+  j <- 1
+  k <- 2 #AKS
+  stop.loop <- F #AKS
+  if(length(n.trees>1)) max.trees <- n.trees[length(n.trees)] #AKS
+
+  while (delta.deviance > tolerance.test & n.fitted < max.trees & stop.loop==F) {  # beginning of inner loop
+
+        # add a new column to the results matrice..
+
+        training.loss.matrix <- cbind(training.loss.matrix,rep(0,n.folds))
+        cv.loss.matrix <- cbind(cv.loss.matrix,rep(0,n.folds))
+
+        if(length(n.trees>1)){ #AKS
+          n.fitted <- n.trees[k] #AKS
+          step.size <- n.trees[k]-n.trees[k-1]
+          k <- k+1 #AKS
+              } else {  #AKS
+          n.fitted <- n.fitted + step.size
+          }  #AKS
+
+        trees.fitted <- c(trees.fitted,n.fitted)
+
+        j <- j + 1
+
+        for (i in 1:n.folds) {
+
+          model.mask <- selector != i  #used to fit model on majority of data
+          pred.mask <- selector == i   #used to identify the with-held subset
+
+          y.subset <- y.data[model.mask]
+          x.subset <- x.data[model.mask,]
+          weight.subset <- site.weights[model.mask]
+          if (!is.null(offset)) {
+            offset.subset <- offset[model.mask]
+          }
+
+          model.list[[i]] <- gbm.more(model.list[[i]], weights = weight.subset, step.size)
+
+          fitted.values <- model.list[[i]]$fit # predict.gbm(model.list[[i]],x.subset, type = "response", n.trees = n.fitted)
+          if (!is.null(offset)) fitted.values <- fitted.values + offset[model.mask]
+          if (family == "bernoulli") fitted.values <- exp(fitted.values)/(1 + exp(fitted.values))
+          if (family == "poisson") fitted.values <- exp(fitted.values)
+
+          pred.values[pred.mask] <- predict.gbm(model.list[[i]], x.data[pred.mask, ], n.trees = n.fitted)
+          if (!is.null(offset)) pred.values[pred.mask] <- pred.values[pred.mask] + offset[pred.mask]
+          if (family == "bernoulli") pred.values[pred.mask] <- exp(pred.values[pred.mask])/(1 + exp(pred.values[pred.mask]))
+          if (family == "poisson") pred.values[pred.mask] <- exp(pred.values[pred.mask])
+
+    # calculate training deviance
+
+          y_i <- y.subset
+          u_i <- fitted.values
+          weight.fitted <- site.weights[model.mask]
+          training.loss.matrix[i,j] <- calc.deviance(y_i, u_i, weight.fitted, family = family)
+
+    # calc holdout deviance
+
+          u_i <- pred.values[pred.mask]
+          y_i <- y.data[pred.mask]
+          weight.preds <- site.weights[pred.mask]
+          cv.loss.matrix[i,j] <- calc.deviance(y_i, u_i, weight.preds, family = family)
+
+        }  # end of inner loop
+
+        cv.loss.values <- apply(cv.loss.matrix,2,mean)
+
+        if (j < 5 & autostop==F) {   #AKS
+          if (cv.loss.values[j] > cv.loss.values[j-1]) {
+            if (!silent) cat("restart model with a smaller learning rate or smaller step size...")
+            return()
+          }
+        }
+
+          if (j >= 20) {   #calculate stopping rule value
+            test1 <- mean(cv.loss.values[(j-9):j])
+            test2 <- mean(cv.loss.values[(j-19):(j-9)])
+            delta.deviance <- test2 - test1
+          }
+
+          if (verbose) cat(n.fitted," ",round(cv.loss.values[j],4),"\n");flush.console()#AKS
+          if(autostop==T & j>2){ # this if statement added by AKS
+              if((cv.loss.values[j]>cv.loss.values[j-1])){# & (cv.loss.values[j-1]>cv.loss.values[j-2])){ # if deviance increases twice in a row
+                  stop.loop=T#n.fitted <- max.trees # by setting n.fitted to max.trees, the while loop will terminate.
+                  }
+              }
+
+
+
+  } # end of while loop
+
+# now begin process of calculating optimal number of trees
+
+  training.loss.values <- apply(training.loss.matrix,2,mean)
+
+  cv.loss.ses <- rep(0,length(cv.loss.values))
+  cv.loss.ses <- sqrt(apply(cv.loss.matrix,2,var)) / sqrt(n.folds)
+
+# find the target holdout deviance
+
+  y.bar <- min(cv.loss.values)
+
+# plot out the resulting curve of holdout deviance
+
+  if (plot.main) {
+
+    y.min <- min(cv.loss.values - cv.loss.ses)  #je added multiplier 10/8/05
+    y.max <- max(cv.loss.values + cv.loss.ses)  #je added multiplier 10/8/05 }
+
+    if (plot.folds) {
+      y.min <- min(cv.loss.matrix)
+      y.max <- max(cv.loss.matrix) }
+
+      plot(trees.fitted, cv.loss.values, type = 'l', ylab = "holdout deviance",
+          xlab = "no. of trees", ylim = c(y.min,y.max), ...)
+      abline(h = y.bar, col = 2)
+
+      lines(trees.fitted, cv.loss.values + cv.loss.ses, lty=2)
+      lines(trees.fitted, cv.loss.values - cv.loss.ses, lty=2)
+
+      if (plot.folds) {
+        for (i in 1:n.folds) {
+          lines(trees.fitted, cv.loss.matrix[i,],lty = 3)
+      }
+    }
+  }
+
+# identify the optimal number of trees
+
+  target.trees <- trees.fitted[match(TRUE,cv.loss.values == y.bar)]
+  #cat("\n");cat("optimal n trees =",target.trees,"\n")    #AKS
+
+  if(plot.main) {
+    abline(v = target.trees, col=3)
+    title(paste(sp.name,", d - ",tree.complexity,", lr - ",learning.rate, sep=""))
+  }
+
+# skip additional details on final model unless target.trees is close to 1000 (AKS)#
+if(abs(target.trees-1000) >= 600 & superfast==T){         # AKS
+    return(list(target.trees=target.trees)) # AKS
+    } else {      # AKS
+
+
+# estimate the cv deviance and test statistics
+# includes estimates of the standard error of the fitted values added 2nd may 2005
+
+  cv.deviance.stats <- rep(0, n.folds)
+  cv.roc.stats <- rep(0, n.folds)
+  cv.cor.stats <- rep(0, n.folds)
+  cv.calibration.stats <- matrix(0, ncol=5, nrow = n.folds)
+  if (family == "bernoulli") threshold.stats <- rep(0, n.folds)
+
+  fitted.matrix <- matrix(NA, nrow = n.cases, ncol = n.folds)   #used to calculate se's
+  fold.fit <- rep(0,n.cases)
+
+  for (i in 1:n.folds) {
+
+    pred.mask <- selector == i   #used to identify the with-held subset
+    model.mask <- selector != i  #used to fit model on majority of data
+
+    fits <- predict.gbm(model.list[[i]], x.data[model.mask, ], n.trees = target.trees)
+    if (!is.null(offset)) fits <- fits + offset[model.mask]
+    if (family == "bernoulli") fits <- exp(fits)/(1 + exp(fits))
+    if (family == "poisson") fits <- exp(fits)
+    fitted.matrix[model.mask,i] <- fits
+
+    fits <- predict.gbm(model.list[[i]], x.data[pred.mask, ], n.trees = target.trees)
+    if (!is.null(offset)) fits <- fits + offset[pred.mask]
+    fold.fit[pred.mask] <- fits  # store the linear predictor values
+    if (family == "bernoulli") fits <- exp(fits)/(1 + exp(fits))
+    if (family == "poisson") fits <- exp(fits)
+    fitted.matrix[pred.mask,i] <- fits
+
+    y_i <- y.data[pred.mask]
+    u_i <- fitted.matrix[pred.mask,i]  #pred.values[pred.mask]      ####
+    weight.preds <- site.weights[pred.mask]
+
+    cv.deviance.stats[i] <- calc.deviance(y_i, u_i, weight.preds, family = family)
+
+    cv.cor.stats[i] <- cor(y_i,u_i)
+
+    if (family == "bernoulli") {
+      cv.roc.stats[i] <- roc(y_i,u_i)
+      cv.calibration.stats[i,] <- calibration(y_i,u_i,"binomial")
+      threshold.stats[i] <- approx(ppoints(u_i), sort(u_i,decreasing = T), prevalence)$y
+    }
+
+    if (family == "poisson") {
+      cv.calibration.stats[i,] <- calibration(y_i,u_i,"poisson")
+    }
+  }
+
+  fitted.vars <- apply(fitted.matrix,1, var, na.rm = TRUE)
+
+ #now calculate the mean and se's for the folds
+
+  cv.dev <- mean(cv.deviance.stats, na.rm = TRUE)
+  cv.dev.se <- sqrt(var(cv.deviance.stats)) / sqrt(n.folds)
+
+  cv.cor <- mean(cv.cor.stats, na.rm = TRUE)
+  cv.cor.se <- sqrt(var(cv.cor.stats, use = "complete.obs")) / sqrt(n.folds)
+
+  cv.roc <- 0.0
+  cv.roc.se <- 0.0
+
+  if (family == "bernoulli") {
+    cv.roc <- mean(cv.roc.stats,na.rm=TRUE)
+    cv.roc.se <- sqrt(var(cv.roc.stats, use = "complete.obs")) / sqrt(n.folds)
+    cv.threshold <- mean(threshold.stats, na.rm = T)
+    cv.threshold.se <- sqrt(var(threshold.stats, use = "complete.obs")) / sqrt(n.folds)
+  }
+
+  cv.calibration <- 0.0
+  cv.calibration.se <- 0.0
+
+  if (family == "poisson" | family == "bernoulli") {
+    cv.calibration <- apply(cv.calibration.stats,2,mean)
+    cv.calibration.se <- apply(cv.calibration.stats,2,var)
+    cv.calibration.se <- sqrt(cv.calibration.se) / sqrt(n.folds) }
+
+ #fit the final model
+
+  if (is.null(offset)) {
+    gbm.call <- paste("gbm(y.data~.,data=x.data,n.trees=target.trees,interaction.depth=tree.complexity,shrinkage=learning.rate,bag.fraction=bag.fraction,weights=site.weights,distribution=as.character(family),var.monotone=var.monotone,verbose=FALSE)",sep="")
+    }
+  else {
+    gbm.call <- paste("gbm(y.data~.+ offset(offset),data=x.data,n.trees=target.trees,interaction.depth=tree.complexity,shrinkage=learning.rate,bag.fraction=bag.fraction,weights=site.weights,distribution=as.character(family),var.monotone=var.monotone,verbose=FALSE)",sep="")
+    }
+
+  if (!silent) cat("fitting final gbm model with a fixed number of ",target.trees," trees for ",sp.name,"\n")
+
+  gbm.object <- eval(parse(text = gbm.call))  # AKS
+
+  best.trees <- target.trees
+
+#extract fitted values and summary table
+
+  gbm.summary <- summary(gbm.object,n.trees = target.trees, plotit = FALSE)
+
+  fits <- predict.gbm(gbm.object,x.data,n.trees = target.trees)
+  if (!is.null(offset)) fits <- fits + offset
+  if (family == "bernoulli") fits <- exp(fits)/(1 + exp(fits))
+  if (family == "poisson") fits <- exp(fits)
+  fitted.values <- fits
+
+  y_i <- y.data
+  u_i <- fitted.values
+  resid.deviance <- calc.deviance(y_i, u_i, weights = site.weights, family = family, calc.mean = FALSE)
+
+  self.cor <- cor(y_i,u_i)
+  self.calibration <- 0.0
+  self.roc <- 0.0
+
+  if (family == "bernoulli") {   #do this manually as we need the residuals
+    deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+    residuals <- sqrt(abs(deviance.contribs * 2))
+    residuals <- ifelse((y_i - u_i) < 0, 0 - residuals, residuals)
+    self.roc <- roc(y_i,u_i)
+    self.calibration <- calibration(y_i,u_i,"binomial")
+  }
+
+  if (family == "poisson") {    #do this manually as we need the residuals
+    deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+    residuals <- sqrt(abs(deviance.contribs * 2))
+    residuals <- ifelse((y_i - u_i) < 0, 0 - residuals, residuals)
+    self.calibration <- calibration(y_i,u_i,"poisson")
+  }
+
+  if (family == "gaussian" | family == "laplace") {
+    residuals <- y_i - u_i
+  }
+
+  mean.resid.deviance <- resid.deviance/n.cases
+
+  z2 <- unclass(Sys.time())
+  elapsed.time.minutes <- round((z2 - z1)/ 60,2)  # calculate the total elapsed time
+
+  if (verbose) {
+    cat("\n")
+    cat("mean total deviance =", round(mean.total.deviance,3),"\n")
+    cat("mean residual deviance =", round(mean.resid.deviance,3),"\n","\n")
+    cat("estimated cv deviance =", round(cv.dev,3),"; se =",
+      round(cv.dev.se,3),"\n","\n")
+    cat("training data correlation =",round(self.cor,3),"\n")
+    cat("cv correlation = ",round(cv.cor,3),"; se =",round(cv.cor.se,3),"\n","\n")
+    if (family == "bernoulli") {
+      cat("training data ROC score =",round(self.roc,3),"\n")
+      cat("cv ROC score =",round(cv.roc,3),"; se =",round(cv.roc.se,3),"\n","\n")
+    }
+    cat("elapsed time - ",round(elapsed.time.minutes,2),"minutes","\n")
+  }
+
+  if (n.fitted == max.trees & !silent) {
+    cat("\n"," warning ","\n","\n")
+    cat("maximum tree limit reached - results may not be optimal","\n")
+    cat("  - refit with faster learning rate or increase maximum number of trees","\n")
+
+
+  }
+
+ # now assemble data to be returned
+
+  gbm.detail <- list(dataframe = dataframe.name, gbm.x = gbm.x, predictor.names = names(x.data),
+    gbm.y = gbm.y, response.name = sp.name, offset = offset.name, family = family, tree.complexity = tree.complexity,
+    learning.rate = learning.rate, bag.fraction = bag.fraction, cv.folds = n.folds,
+    prev.stratification = prev.stratify, max.fitted = n.fitted, n.trees = target.trees,
+    best.trees = target.trees, train.fraction = 1.0, tolerance.method = tolerance.method,
+    tolerance = tolerance, var.monotone = var.monotone, date = date(),
+    elapsed.time.minutes = elapsed.time.minutes)
+
+  training.stats <- list(null = total.deviance, mean.null = mean.total.deviance,
+    resid = resid.deviance, mean.resid = mean.resid.deviance, correlation = self.cor,
+    discrimination = self.roc, calibration = self.calibration)
+
+  cv.stats <- list(deviance.mean = cv.dev, deviance.se = cv.dev.se,
+    correlation.mean = cv.cor, correlation.se = cv.cor.se,
+    discrimination.mean = cv.roc, discrimination.se = cv.roc.se,
+    calibration.mean = cv.calibration, calibration.se = cv.calibration.se)
+
+  if (family == "bernoulli") {
+    cv.stats$cv.threshold <- cv.threshold
+    cv.stats$cv.threshold.se <- cv.threshold.se
+  }
+
+  rm(x.data,y.data, envir = globalenv())          # finally, clean up the temporary dataframes
+
+ # and assemble results for return
+
+  gbm.object$gbm.call <- gbm.detail
+  gbm.object$fitted <- fitted.values
+  gbm.object$fitted.vars <- fitted.vars
+  gbm.object$residuals <- residuals
+  gbm.object$contributions <- gbm.summary
+  gbm.object$self.statistics <- training.stats
+  gbm.object$cv.statistics <- cv.stats
+  gbm.object$weights <- site.weights
+  gbm.object$trees.fitted <- trees.fitted
+  gbm.object$training.loss.values <- training.loss.values
+  gbm.object$cv.values <- cv.loss.values
+  gbm.object$cv.loss.ses <- cv.loss.ses
+  gbm.object$cv.loss.matrix <- cv.loss.matrix
+  gbm.object$cv.roc.matrix <- cv.roc.stats
+  gbm.object$target.trees <- target.trees
+
+  if (keep.fold.models) gbm.object$fold.models <- model.list
+  else gbm.object$fold.models <- NULL
+
+  if (keep.fold.vector) gbm.object$fold.vector <- selector
+  else gbm.object$fold.vector <- NULL
+
+  if (keep.fold.fit) gbm.object$fold.fit <- fold.fit
+  else gbm.object$fold.fit <- NULL
+
+  return(gbm.object)
+  } #end if statement
+}
+
+"gbm.plot" <-
+function(gbm.object,                # a gbm object - could be one from gbm.step
+     variable.no = 0,               # the var to plot - if zero then plots all
+     nt = gbm.object$n.trees,       # how many trees to use
+     smooth = FALSE,                # should we add a smoothed version of the fitted function
+     rug = T,                       # plot a rug of deciles
+     n.plots = length(pred.names),  # plot the first n most important preds
+     common.scale = T,              # use a common scale on the y axis
+     write.title = T,               # plot a title above the plot
+     y.label = "fitted function",   # the default y-axis label
+     x.label = NULL,                # the default x-axis label
+     show.contrib = T,              # show the contribution on the x axis
+     plot.layout = c(3,4),          # define the default layout for graphs on the page
+     rug.side = 3,                  # which axis for rug plot? default (3) is top; bottom=1
+     rug.lwd = 1,                   # line width for rug plots
+     rug.tick = 0.03,               # tick length for rug plots
+     plotit=T,                      # AKS
+     prob.scale=T,                       # AKS
+     ...                            # other arguments to pass to the plotting
+                                    # useful options include cex.axis, cex.lab, etc.
+     )
+{
+# function to plot gbm response variables, with the option
+# of adding a smooth representation of the response if requested
+# additional options in this version allow for plotting on a common scale
+# note too that fitted functions are now centered by subtracting their mean
+#
+# version 2.9
+#
+# j. leathwick/j. elith - March 2007
+#
+
+require(gbm)
+
+
+gbm.call <- gbm.object$gbm.call
+gbm.x <- gbm.call$gbm.x
+pred.names <- gbm.call$predictor.names
+out.names <- rep("",length(pred.names))
+response.name <- gbm.call$response.name
+dataframe.name <- gbm.call$dataframe
+data <- eval.parent(parse(text = dataframe.name))
+
+max.plots <- plot.layout[1] * plot.layout[2]
+plot.count <- 0
+n.pages <- 1
+
+if (length(variable.no) > 1) {stop("only one response variable can be plotted at a time")}
+
+if (variable.no > 0) {   #we are plotting all vars in rank order of contribution
+  n.plots <- 1
+  }
+
+max.vars <- length(gbm.object$contributions$var)
+if (n.plots > max.vars) {
+  n.plots <- max.vars
+  cat("warning - reducing no of plotted predictors to maximum available (",max.vars,")\n",sep="")
+  }
+
+predictors <- list(rep(NA,n.plots)) # matrix(0,ncol=n.plots,nrow=100)
+responses <- list(rep(NA,n.plots)) # matrix(0,ncol=n.plots,nrow=100)
+
+for (j in c(1:n.plots)) {  #cycle through the first time and get the range of the functions
+  if (n.plots == 1) {
+    k <- variable.no
+  }
+  else k <- match(gbm.object$contributions$var[j],pred.names)
+
+  if (is.null(x.label)) var.name <- gbm.call$predictor.names[k]
+    else var.name <- x.label
+
+  pred.data <- data[,gbm.call$gbm.x[k]]
+  out.names[j] <- names(data)[gbm.call$gbm.x[k]]
+
+  response.matrix <- plot.gbm(gbm.object, i.var = k, n.trees = nt, return.grid = TRUE,...)
+
+  predictors[[j]] <- response.matrix[,1]
+  if (is.factor(data[,gbm.call$gbm.x[k]])) {
+    predictors[[j]] <- factor(predictors[[j]],levels = levels(data[,gbm.call$gbm.x[k]]))
+    }
+  responses[[j]] <- response.matrix[,2] - mean(response.matrix[,2])
+  if(prob.scale) responses[[j]] <- logit(responses[[j]])
+
+  if(j == 1) {
+    ymin = min(responses[[j]])
+    ymax = max(responses[[j]])
+    }
+  else {
+    ymin = min(ymin,min(responses[[j]]))
+    ymax = max(ymax,max(responses[[j]]))
+    }
+  }
+
+# now do the actual plots
+  if(plotit==T){
+      for (j in c(1:n.plots)) {
+
+       if (plot.count == max.plots) {
+         plot.count = 0
+         n.pages <- n.pages + 1
+       }
+
+       if (plot.count == 0) {
+         #windows(width = 11, height = 8)  #aks
+         par(mfrow = plot.layout)
+       }
+
+        plot.count <- plot.count + 1
+
+        if (n.plots == 1) {
+          k <- match(pred.names[variable.no],gbm.object$contributions$var)
+          if (show.contrib) {
+             x.label <- paste(var.name,"  (",round(gbm.object$contributions[k,2],1),"%)",sep="")
+          }
+        }
+        else {
+          k <- match(gbm.object$contributions$var[j],pred.names)
+          var.name <- gbm.call$predictor.names[k]
+          if (show.contrib) {
+             x.label <- paste(var.name,"  (",round(gbm.object$contributions[j,2],1),"%)",sep="")
+          }
+          else x.label <- var.name
+        }
+
+        if (common.scale) {
+          plot(predictors[[j]],responses[[j]],ylim=c(ymin,ymax), type='l',
+            xlab = x.label, ylab = y.label, ...)
+        }
+        else {
+          plot(predictors[[j]],responses[[j]], type='l',
+            xlab = x.label, ylab = y.label, ...)
+        }
+        if (smooth & is.vector(predictors[[j]])) {
+          temp.lo <- loess(responses[[j]] ~ predictors[[j]], span = 0.3)
+          lines(predictors[[j]],fitted(temp.lo), lty = 2, col = 2)
+        }
+        if (plot.count == 1) {
+          if (write.title) {
+            title(paste(response.name," - page ",n.pages,sep=""))
+          }
+          if (rug & is.vector(data[,gbm.call$gbm.x[k]])) {
+            rug(quantile(data[,gbm.call$gbm.x[k]], probs = seq(0, 1, 0.1), na.rm = TRUE), side = rug.side, lwd = rug.lwd, ticksize = rug.tick)
+          }
+        }
+        else {
+          if (write.title & j == 1) {
+            title(response.name)
+          }
+          if (rug & is.vector(data[,gbm.call$gbm.x[k]])) {
+            rug(quantile(data[,gbm.call$gbm.x[k]], probs = seq(0, 1, 0.1), na.rm = TRUE), side = rug.side, lwd = rug.lwd, ticksize = rug.tick)
+          }
+        }
+      }
+    }
+  return(invisible(list(names=out.names,preds=predictors,resp=responses)))
+}
+
+
+"gbm.perspec" <-
+function(gbm.object,
+     x = 1,                # the first variable to be plotted
+     y = 2,                # the second variable to be plotted
+     pred.means = NULL,    # allows specification of values for other variables
+     x.label = NULL,       # allows manual specification of the x label
+     x.range = NULL,       # manual range specification for the x variable
+     y.label = NULL,       # and y label
+     y.range = NULL,       # and the y
+     z.range = NULL,       # allows control of the vertical axis
+     ticktype = "detailed",# specifiy detailed types - otherwise "simple"
+     theta = 55,           # rotation
+     phi=40,               # and elevation
+     smooth = "none",      # controls smoothing of the predicted surface
+     mask = FALSE,         # controls masking using a sample intensity model
+     perspective = TRUE,   # controls whether a contour or perspective plot is drawn
+     verbose=F,            # AKS
+     ...)                  # allows the passing of additional arguments to plotting routine
+                           # useful options include shade, ltheta, lphi for controlling illumination
+                           # and cex for controlling text size - cex.axis and cex.lab have no effect
+{
+#
+# gbm.perspec version 2.9 April 2007
+# J Leathwick/J Elith
+#
+# takes a gbm boosted regression tree object produced by gbm.step and
+# plots a perspective plot showing predicted values for two predictors
+# as specified by number using x and y
+# values for all other variables are set at their mean by default
+# but values can be specified by giving a list consisting of the variable name
+# and its desired value, e.g., c(name1 = 12.2, name2 = 57.6)
+
+  require(gbm)
+
+
+#get the boosting model details
+
+  gbm.call <- gbm.object$gbm.call
+  gbm.x <- gbm.call$gbm.x
+  n.preds <- length(gbm.x)
+  gbm.y <- gbm.call$gbm.y
+  pred.names <- gbm.call$predictor.names
+  family = gbm.call$family
+
+  x.name <- gbm.call$predictor.names[x]
+
+  if (is.null(x.label)) {
+    x.label <- gbm.call$predictor.names[x]}
+
+  y.name <- gbm.call$predictor.names[y]
+
+  if (is.null(y.label)) {
+    y.label <- gbm.call$predictor.names[y]}
+
+  data <- eval.parent(parse(text=gbm.call$dataframe))[,gbm.x]   #AKS
+  n.trees <- gbm.call$best.trees
+
+  if (is.null(x.range)) {
+   if(!is.factor(data[,x]))
+        x.var <- seq(min(data[,x],na.rm=T),max(data[,x],na.rm=T),length = 50)
+      else x.var<- sort(unique(as.numeric(levels(data[,x]))))
+  }
+  else {x.var <- seq(x.range[1],x.range[2],length = 50)}
+
+  if (is.null(y.range)) {
+      if(!is.factor(data[,y]))
+        y.var <- seq(min(data[,y],na.rm=T),max(data[,y],na.rm=T),length = 50)
+      else y.var<- sort(unique(as.numeric(levels(data[,y]))))
+  }
+  else {y.var <- seq(y.range[1],y.range[2],length = 50)}
+
+  pred.frame <- expand.grid(list(x.var,y.var))
+  names(pred.frame) <- c(x.name,y.name)
+
+  j <- 3
+  for (i in 1:n.preds) {
+    if (i != x & i != y) {
+      if (is.vector(data[,i])) {
+        m <- match(pred.names[i],names(pred.means))
+        if (is.na(m)) {
+          pred.frame[,j] <- mean(data[,i],na.rm=T)
+        }
+        else pred.frame[,j] <- pred.means[m]
+      }
+      if (is.factor(data[,i])) {
+        m <- match(pred.names[i],names(pred.means))
+        temp.table <- table(data[,i])
+        if (is.na(m)) {
+          pred.frame[,j] <- rep(names(temp.table)[2],2500)
+        }
+        else pred.frame[,j] <- pred.means[m]
+        pred.frame[,j] <- factor(pred.frame[,j],levels=names(temp.table))
+      }
+      names(pred.frame)[j] <- pred.names[i]
+      j <- j + 1
+     }
+  }
+#
+# form the prediction
+#
+  prediction <- predict.gbm(gbm.object,pred.frame,n.trees = n.trees, type="response")
+
+# model smooth if required
+
+  if (smooth == "model") {
+    require(splines)
+    pred.glm <- glm(prediction ~ ns(pred.frame[,1], df = 8) * ns(pred.frame[,2], df = 8), data=pred.frame,family=poisson)
+    prediction <- fitted(pred.glm)
+  }
+
+# report the maximum value and set up realistic ranges for z
+
+  max.pred <- max(prediction)
+  min.pred<-min(prediction)
+  if(verbose) cat("maximum value = ",round(max.pred,2),"\n")    #AKS
+
+  if (is.null(z.range)) {
+    if (family == "bernoulli") {
+      z.range <- c(min.pred,max.pred)
+    }
+    else if (family == "poisson") {
+      z.range <- c(0,max.pred * 1.1)
+    }
+    else {
+      z.min <- min(data[,y],na.rm=T)
+      z.max <- max(data[,y],na.rm=T)
+      z.delta <- z.max - z.min
+      z.range <- c(z.min - (1.1 * z.delta), z.max + (1.1 * z.delta))
+    }
+  }
+# form the matrix
+
+  pred.matrix <- matrix(prediction,ncol=length(y.var),nrow=length(x.var))
+
+# kernel smooth if required
+
+  if (smooth == "average") {  #apply a 3 x 3 smoothing average
+     pred.matrix.smooth <- pred.matrix
+     for (i in 2:(length(x.var)-1)) {
+       for (j in 2:(length(y.var)-1)) {
+         pred.matrix.smooth[i,j] <- mean(pred.matrix[c((i-1):(i+1)),c((j-1):(j+1))])
+       }
+     }
+  pred.matrix <- pred.matrix.smooth
+  }
+
+# mask out values inside hyper-rectangle but outside of sample space
+
+  if (mask) {
+    mask.trees <- mask.object$gbm.call$best.trees
+    point.prob <- predict.gbm(mask.object[[1]],pred.frame, n.trees = mask.trees, type="response")
+    point.prob <- matrix(point.prob,ncol=50,nrow=50)
+    pred.matrix[point.prob < 0.5] <- 0.0
+  }
+#
+# and finally plot the result
+
+  if (!perspective) {
+    image(x = x.var, y = y.var, z = pred.matrix, zlim = z.range)
+  }
+  else {
+    persp(x=x.var, y=y.var, z=pred.matrix, zlim= z.range,      # input vars
+      xlab = x.label, ylab = y.label, zlab = "fitted value",   # labels
+      theta=theta, phi=phi, r = sqrt(10), d = 3,               # viewing pars
+      ticktype = ticktype, mgp = c(4,1,0), ...) #
+  }
+}
+
+"calibration" <-
+function(obs, preds, family = "binomial")
+{
+#
+# j elith/j leathwick 17th March 2005
+# calculates calibration statistics for either binomial or count data
+# but the family argument must be specified for the latter
+# a conditional test for the latter will catch most failures to specify
+# the family
+#
+
+if (family == "bernoulli") family <- "binomial"
+pred.range <- max(preds) - min(preds)
+if(pred.range > 1.2 & family == "binomial") {
+print(paste("range of response variable is ", round(pred.range, 2)), sep = "", quote = F)
+print("check family specification", quote = F)
+return()
+}
+if(family == "binomial") {
+pred <- preds + 1e-005
+pred[pred >= 1] <- 0.99999
+mod <- glm(obs ~ log((pred)/(1 - (pred))), family = binomial)
+lp <- log((pred)/(1 - (pred)))
+a0b1 <- glm(obs ~ offset(lp) - 1, family = binomial)
+miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+ab1 <- glm(obs ~ offset(lp), family = binomial)
+miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+}
+if(family == "poisson") {
+mod <- glm(obs ~ log(preds), family = poisson)
+lp <- log(preds)
+a0b1 <- glm(obs ~ offset(lp) - 1, family = poisson)
+miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+ab1 <- glm(obs ~ offset(lp), family = poisson)
+miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+}
+calibration.result <- c(mod$coef, miller1, miller2, miller3)
+names(calibration.result) <- c("intercept", "slope", "testa0b1", "testa0|b1", "testb1|a")
+return(calibration.result)
+}
+
+"roc" <-
+function (obsdat, preddat)
+{
+# code adapted from Ferrier, Pearce and Watson's code, by J.Elith
+#
+# see:
+# Hanley, J.A. & McNeil, B.J. (1982) The meaning and use of the area
+# under a Receiver Operating Characteristic (ROC) curve.
+# Radiology, 143, 29-36
+#
+# Pearce, J. & Ferrier, S. (2000) Evaluating the predictive performance
+# of habitat models developed using logistic regression.
+# Ecological Modelling, 133, 225-245.
+# this is the non-parametric calculation for area under the ROC curve,
+# using the fact that a MannWhitney U statistic is closely related to
+# the area
+#
+    if (length(obsdat) != length(preddat))
+        stop("obs and preds must be equal lengths")
+    n.x <- length(obsdat[obsdat == 0])
+    n.y <- length(obsdat[obsdat == 1])
+    xy <- c(preddat[obsdat == 0], preddat[obsdat == 1])
+    rnk <- rank(xy)
+    wilc <- ((n.x * n.y) + ((n.x * (n.x + 1))/2) - sum(rnk[1:n.x]))/(n.x *
+        n.y)
+    return(round(wilc, 4))
+}
+
+"calc.deviance" <-
+function(obs.values, fitted.values, weights = rep(1,length(obs.values)), family="binomial", calc.mean = TRUE)
+{
+# j. leathwick/j. elith
+#
+# version 2.1 - 5th Sept 2005
+#
+# function to calculate deviance given two vectors of raw and fitted values
+# requires a family argument which is set to binomial by default
+#
+#
+
+if (length(obs.values) != length(fitted.values))
+   stop("observations and predictions must be of equal length")
+
+y_i <- obs.values
+
+u_i <- fitted.values
+
+if (family == "binomial" | family == "bernoulli") {
+
+   deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+   deviance <- -2 * sum(deviance.contribs * weights)
+
+}
+
+if (family == "poisson" | family == "Poisson") {
+
+    deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+    deviance <- 2 * sum(deviance.contribs * weights)
+
+}
+
+if (family == "laplace") {
+    deviance <- sum(abs(y_i - u_i))
+    }
+
+if (family == "gaussian") {
+    deviance <- sum((y_i - u_i) * (y_i - u_i))
+    }
+
+
+
+if (calc.mean) deviance <- deviance/length(obs.values)
+
+return(deviance)
+
+}
+
+"gbm.interactions" <-
+function(gbm.object,
+   use.weights = FALSE,     # use weights for samples
+   mask.object)             # a gbm object describing sample intensity
+{
+#
+# gbm.interactions version 2.9
+#
+# j. leathwick, j. elith - May 2007
+#
+# functions assesses the magnitude of 2nd order interaction effects
+# in gbm models fitted with interaction depths greater than 1
+# this is achieved by:
+#   1. forming predictions on the linear scale for each predictor pair;
+#   2. fitting a linear model that relates these predictions to the predictor
+#        pair, with the the predictors fitted as factors;
+#   3. calculating the mean value of the residuals, the magnitude of which
+#        increases with the strength of any interaction effect;
+#   4. results are stored in an array;
+#   5. finally, the n most important interactions are identified,
+#        where n is 25% of the number of interaction pairs;
+
+  require(gbm)
+
+  gbm.call <- gbm.object$gbm.call
+  n.trees <- gbm.call$best.trees
+  depth <- gbm.call$interaction.depth
+  gbm.x <- gbm.call$gbm.x
+  n.preds <- length(gbm.x)
+  pred.names <- gbm.object$gbm.call$predictor.names
+  cross.tab <- matrix(0,ncol=n.preds,nrow=n.preds)
+  dimnames(cross.tab) <- list(pred.names,pred.names)
+  int.p.table <- matrix(NA,ncol=n.preds,nrow=n.preds,dimnames=list(pred.names,pred.names))#AKS
+
+  if (use.weights) mask.trees <- mask.object$gbm.call$best.trees
+
+  #cat("gbm.interactions - version 2.9 \n")  #aks
+  #cat("Cross tabulating interactions for gbm model with ",n.preds," predictors","\n",sep="") #aks
+
+  data <- eval.parent(parse(text=gbm.call$dataframe),n=1)[,gbm.x]    #aks
+
+  for (i in 1:(n.preds - 1)) {  # step through the predictor set
+    x.fac<-F
+    if (is.vector(data[,i])) {  # create a sequence through the range
+       x.var <- seq(min(data[,i],na.rm=T),max(data[,i],na.rm=T),length = 20)
+       x2 <-  as.vector(tapply(x.var,rep(1:10,rep(2,10)),mean))
+       }  else {                      # otherwise set up simple factor variable
+       x.var <- factor(names(table(data[,i])),levels = levels(data[,i]))
+       x.fac<-T
+       }
+    x.length <- length(x.var)
+
+    #cat(i,"\n")  #aks
+
+    for (j in (i+1):n.preds) { #create vector or factor data for second variable
+      y.fac<-F
+      if (is.vector(data[,j])) {
+        y.var <- seq(min(data[,j],na.rm=T),max(data[,j],na.rm=T),length = 20)
+        y2 <-  as.vector(tapply(y.var,rep(1:10,rep(2,10)),mean))
+
+      }    else {
+        y.var <- factor(names(table(data[,j])),levels = levels(data[,j]))
+        y.fac<-T
+      }
+      y.length <- length(y.var)
+
+# and now make a temporary data frame
+
+      pred.frame <- expand.grid(list(x.var,y.var))
+      names(pred.frame) <- c(pred.names[i],pred.names[j])
+
+      n <- 3 # and add the balance of the variables to it
+
+      for (k in 1:n.preds) {
+        if (k != i & k != j) {
+          if (is.vector(data[,k])) {  # either with the mean
+            pred.frame[,n] <- mean(data[,k],na.rm=T)
+          } else {   # or the most common factor level
+            temp.table <- sort(table(data[,k]),decreasing = TRUE)
+            pred.frame[,n] <- rep(names(temp.table)[1],x.length * y.length)
+            pred.frame[,n] <- as.factor(pred.frame[,n])
+          }
+          names(pred.frame)[n] <- pred.names[k]
+          n <- n + 1
+        }
+      }
+#
+# form the prediction
+#
+      prediction <- predict.gbm(gbm.object,pred.frame,n.trees = n.trees, type="link")
+
+      if (use.weights) {
+        point.prob <- predict.gbm(mask.object[[1]],pred.frame, n.trees = mask.trees, type="response")
+        interaction.test.model <- lm(prediction ~ as.factor(pred.frame[,1]) + as.factor(pred.frame[,2]),
+          weights = point.prob)
+      }
+
+      else {
+
+        interaction.test.model <- lm(prediction ~ as.factor(pred.frame[,1]) + as.factor(pred.frame[,2]))
+      }
+      #cat("\n",i,names(data)[i],x.length,length(unique(data[,i])),"  ",
+      #      j,names(data)[j],y.length,length(unique(data[,j])),dim(pred.frame));flush.console()
+      #print(summary(data[,i]));print(summary(data[,j]))
+      # check significance of interaction term in model that pools every 4 grid points #
+      pred.frame<<-pred.frame
+
+      if(x.fac==F | y.fac==F){ # case where at least one cov is not a factor
+          if(x.fac==T) {x3 <- pred.frame[,1]
+          } else { x3 <- rep(rep(x2,rep(2,10)),y.length) }
+          if(y.fac==T) {y3 <- pred.frame[,1]
+          } else { y3 <- rep(y2,rep(x.length*2,length(y2)))}
+          int.p.table[i,j] <- anova(lm(prediction~as.factor(x3)*as.factor(y3)))[3,5] #aks
+          }
+
+
+      interaction.flag <- round(mean(resid(interaction.test.model)^2)*1000,2)
+
+      cross.tab[i,j] <- interaction.flag
+      }   # end of j loop
+  }  # end of i loop
+
+# create an index of the values in descending order
+
+  search.index <- ((n.preds^2) + 1) - rank(cross.tab, ties.method = "first")
+
+  n.important <- max(2,round(0.1 * ((n.preds^2)/2),0))
+  var1.names <- rep(" ",n.important)
+  var1.index <- rep(0,n.important)
+  var2.names <- rep(" ",n.important)
+  var2.index <- rep(0,n.important)
+  int.size <- rep(0,n.important)
+  int.p <- rep(NA,n.important) #aks
+
+  for (i in 1:n.important) {
+
+    index.match <- match(i,search.index)
+
+    j <- trunc(index.match/n.preds) + 1
+    var1.index[i] <- j
+    var1.names[i] <- pred.names[j]
+
+    k <- index.match%%n.preds
+    if (k > 0) {   #only do this if k > 0 - otherwise we have all zeros from here on
+      var2.index[i] <- k
+      var2.names[i] <- pred.names[k]
+
+      int.size[i] <- cross.tab[k,j]
+      int.p[i] <- int.p.table[k,j] #aks
+    }
+
+  }
+  rank.list <- data.frame(var1.index,var1.names,var2.index,var2.names,int.size,p=int.p)
+  rank.list <- rank.list[complete.cases(rank.list),]
+  return(list(rank.list = rank.list, interactions = cross.tab, gbm.call = gbm.object$gbm.call))
+}
+
+"gbm.simplify" <-
+function(gbm.object,          # a gbm object describing sample intensity
+  n.folds = 10,               # number of times to repeat the analysis
+  n.drops = "auto",           # can be automatic or an integer specifying the number of drops to check
+  alpha = 1,                  # controls stopping when n.drops = "auto"
+  prev.stratify = TRUE,       # use prevalence stratification in selecting evaluation data
+  eval.data = NULL,           # an independent evaluation data set - leave here for now
+  plot = TRUE,                # plot results
+  verbose=F)                  # to suppress text output.
+{
+# function to simplify a brt model fitted using gbm.step
+#
+# version 2.9 - J. Leathwick/J. Elith - June 2007
+#
+# starts with an inital cross-validated model as produced by gbm.step
+# and then assesses the potential to remove predictors using k-fold cv
+# does this for each fold, removing the lowest contributing predictor,
+# and repeating this process for a set number of steps
+# after the removal of each predictor, the change in predictive deviance
+# is computed relative to that obtained when using all predictors
+# it returns a list containing the mean change in deviance and its se
+# as a function of the number of variables removed
+# having completed the cross validation, it then identifies the sequence
+# of variable to remove when using the full data set, testing this
+# up to the number of steps used in the cross-validation phase of the analysis
+# with results reported to the screen - it then returns
+# a table containing the order in which variables are to be removed
+# and a list of vectors, each of which specifies the predictor col numbers
+# in the original dataframe  - the latter can be used as an argument to gbm.step
+# e.g., gbm.step(data = data, gbm.x = simplify.object$pred.list[[4]]...
+# would implement a new analysis with the original predictor set, minus its
+# four lowest contributing predictors
+#
+
+require(gbm)
+
+# first get the original analysis details..
+
+  gbm.call <- gbm.object$gbm.call
+  data <- eval.parent(parse(text=gbm.call$dataframe))
+  n.cases <- nrow(data)
+  gbm.x <- gbm.call$gbm.x
+  gbm.y <- gbm.call$gbm.y
+  family <- gbm.call$family
+  lr <- gbm.call$learning.rate
+  tc <- gbm.call$tree.complexity
+  start.preds <- length(gbm.x)
+  max.drops <- start.preds - 2
+  response.name <- gbm.call$response.name
+  predictor.names <- gbm.call$predictor.names
+  n.trees <- gbm.call$best.trees
+  pred.list <- list(initial = gbm.x)
+  weights <- gbm.object$weights
+
+  if (n.drops == "auto") auto.stop <- TRUE
+
+  else auto.stop <- FALSE
+
+# take a copy of the original data and starting predictors
+
+  orig.data <- data
+  orig.gbm.x <- gbm.x
+  verbose=TRUE
+#  if (!is.null(eval.data)) independent.test <- TRUE
+#    else independent.test <- FALSE
+
+# extract original performance statistics...
+
+  original.deviance <- round(gbm.object$cv.statistics$deviance.mean,4)
+  original.deviance.se <- round(gbm.object$cv.statistics$deviance.se,4)
+
+  if(verbose){ #aks
+    cat("\n");cat("gbm.simplify - version 2.9","\n\n")#AKS
+    cat("simplifying gbm.step model for ",response.name," with ",start.preds," predictors",sep="")
+    cat(" and ",n.cases," observations \n",sep="")
+    cat("original deviance = ",original.deviance,"(",original.deviance.se,")\n\n",sep="")
+    }
+
+# check that n.drops is less than n.preds - 2 and update if required
+
+  if (auto.stop) {
+    if(verbose) cat("variable removal will proceed until average change exceeds the original se\n\n") #aks
+    n.drops <- 1 } else{
+    if (n.drops > start.preds - 2) {
+      if(verbose) cat("value of n.drops (",n.drops,") is greater than permitted","\n", #aks
+        "resetting value to ",start.preds - 2,"\n\n",sep="")
+      n.drops <- start.preds - 2
+    } else {
+      if(verbose) cat("a fixed number of",n.drops,"drops will be tested\n\n") #aks
+    }
+  }
+  flush.console()#AKS
+
+
+# set up storage for results
+
+  dev.results <- matrix(0, nrow = n.drops, ncol = n.folds)
+  dimnames(dev.results) <- list(paste("drop.",1:n.drops,sep=""),
+   paste("rep.",1:n.folds,sep=""))
+
+  drop.count <- matrix(NA, nrow = start.preds, ncol = n.folds)
+  dimnames(drop.count) <- list(predictor.names,paste("rep.",1:n.folds,sep=""))
+
+  original.deviances <- rep(0,n.folds)
+
+  model.list <- list(paste("model",c(1:n.folds),sep=""))     # dummy list for the tree models
+
+# create gbm.fixed function call
+
+  gbm.call.string <- paste("gbm.fixed(data=train.data,gbm.x=gbm.new.x,gbm.y=gbm.y,",sep="")
+  gbm.call.string <- paste(gbm.call.string,"family=family,learning.rate=lr,tree.complexity=tc,",sep="")
+  gbm.call.string <- paste(gbm.call.string,"n.trees = ",n.trees,", site.weights = weights.subset,verbose=FALSE)",sep="")
+
+# now set up the fold structure
+
+  if (prev.stratify & family == "bernoulli") {
+    presence.mask <- data[,gbm.y] == 1
+    absence.mask <- data[,gbm.y] == 0
+    n.pres <- sum(presence.mask)
+    n.abs <- sum(absence.mask)
+
+# create a vector of randomised numbers and feed into presences
+    selector <- rep(0,n.cases)
+    temp <- rep(seq(1, n.folds, by = 1), length = n.pres)
+    temp <- temp[order(runif(n.pres, 1, 100))]
+    selector[presence.mask] <- temp
+
+# and then do the same for absences
+    temp <- rep(seq(1, n.folds, by = 1), length = n.abs)
+    temp <- temp[order(runif(n.abs, 1, 100))]
+    selector[absence.mask] <- temp
+    }
+
+  else {  #otherwise make them random with respect to presence/absence
+    selector <- rep(seq(1, n.folds, by = 1), length = n.cases)
+    selector <- selector[order(runif(n.cases, 1, 100))]
+    }
+
+# now start by creating the intial models for each fold
+
+  if(verbose) cat("creating initial models");flush.console()#AKS
+
+  gbm.new.x <- orig.gbm.x
+
+  for (i in 1:n.folds) {
+
+# create the training and prediction folds
+
+    train.data <- orig.data[selector!=i,]
+    weights.subset <- weights[selector != i]
+    eval.data <- orig.data[selector==i,]
+
+    model.list[[i]] <- eval(parse(text=gbm.call.string))  # create a fixed size object
+
+# now make predictions to the withheld fold
+
+    u_i <- eval.data[,gbm.y]
+    y_i <- predict.gbm(model.list[[i]], eval.data, n.trees, "response")
+
+    original.deviances[i] <- round(calc.deviance(u_i,y_i, family = family, calc.mean = TRUE),4)
+    if(verbose) cat(".");flush.console()#AKS
+  } # end of creating initial models
+  if(verbose) {cat("\n");cat("done \n\n")}  #aks
+  n.steps <- 1
+
+  while (n.steps <= n.drops & n.steps <= max.drops) {
+
+    if(verbose) cat("dropping predictor",n.steps,"\n");flush.console()#AKS
+
+    for (i in 1:n.folds) {
+
+# get the right data
+
+    train.data <- orig.data[selector!=i,]
+    eval.data <- orig.data[selector==i,]
+    weights.subset <- weights[selector != i]
+
+# get the current model details
+
+    gbm.x <- model.list[[i]]$gbm.call$gbm.x
+    n.preds <- length(gbm.x)
+    these.pred.names <- model.list[[i]]$gbm.call$predictor.names
+    contributions <- model.list[[i]]$contributions
+
+# get the index number in pred.names of the last variable in the contribution table
+
+    last.variable <- match(as.character(contributions[n.preds,1]),these.pred.names)
+    gbm.new.x <- gbm.x[-last.variable]
+
+# and keep a record of what has been dropped
+
+    last.variable <- match(as.character(contributions[n.preds,1]),predictor.names)
+    drop.count[last.variable,i] <- n.steps
+
+    model.list[[i]] <- eval(parse(text=gbm.call.string))  # create a fixed size object
+
+    u_i <- eval.data[,gbm.y]
+    y_i <- predict.gbm(model.list[[i]],eval.data,n.trees,"response")
+
+    deviance <- round(calc.deviance(u_i,y_i, family = family, calc.mean = TRUE),4)
+
+# calculate difference between intial and new model by subtracting new from old because we want to minimise deviance
+
+    dev.results[n.steps,i] <- round(deviance - original.deviances[i] ,4)
+
+    }
+
+  if (auto.stop){ # check to see if delta mean is less than original deviance error estimate
+
+    delta.mean <- mean(dev.results[n.steps,])
+
+    if (delta.mean < (alpha * original.deviance.se)) {
+      n.drops <- n.drops + 1
+      dev.results <- rbind(dev.results, rep(0,n.folds))
+      }
+    }
+  n.steps <- n.steps + 1
+  }
+
+# now label the deviance matrix
+
+  dimnames(dev.results) <- list(paste("drop.",1:n.drops,sep=""),
+   paste("rep.",1:n.folds,sep=""))
+
+# calculate mean changes in deviance and their se
+
+  mean.delta <- apply(dev.results,1,mean)
+  se.delta <- sqrt(apply(dev.results,1,var))/sqrt(n.folds)
+
+###########################
+
+  if (plot) {
+    y.max <- 1.5 * max(mean.delta + se.delta)
+    y.min <- 1.5 * min(mean.delta - se.delta)
+    plot(seq(0,n.drops),c(0,mean.delta),xlab="variables removed",
+      ylab = "change in predictive deviance",type='l',ylim=c(y.min,y.max))
+    lines(seq(0,n.drops),c(0,mean.delta) + c(0,se.delta),lty = 2)
+    lines(seq(0,n.drops),c(0,mean.delta) - c(0,se.delta),lty = 2)
+    abline(h = 0 , lty = 2, col = 3)
+    min.y <- min(c(0,mean.delta))
+    min.pos <- match(min.y,c(0,mean.delta)) - 1 # subtract one because now zero base
+    abline(v = min.pos, lty = 3, col = 2)
+    abline(h = original.deviance.se, lty = 2, col = 2)
+    title(paste("RFE deviance - ",response.name," - folds = ",n.folds,sep=""))
+  }
+
+# and do a final backwards drop sequence from the original model
+
+  if(verbose) cat("\nnow processing final dropping of variables with full data \n\n") #aks
+
+  gbm.call.string <- paste("gbm.fixed(data=orig.data,gbm.x=gbm.new.x,gbm.y=gbm.y,",sep="")
+  gbm.call.string <- paste(gbm.call.string,"family=family,learning.rate=lr,tree.complexity=tc,",sep="")
+  gbm.call.string <- paste(gbm.call.string,"n.trees = ",n.trees,", site.weights = weights,verbose=FALSE)",sep="")
+
+  n.steps <- n.steps - 1 #decrement by one to reverse last increment in prev loop
+
+  final.model <- gbm.object  # restore the original model and data
+  train.data <- orig.data
+
+# and set up storage
+
+  final.drops <- matrix(NA, nrow = start.preds, ncol = 1)
+  dimnames(final.drops) <- list(predictor.names,"step")
+
+  for (i in 1:n.steps) {
+
+# get the current model details
+
+    gbm.x <- final.model$gbm.call$gbm.x
+    n.preds <- length(gbm.x)
+    these.pred.names <- final.model$gbm.call$predictor.names
+    contributions <- final.model$contributions
+
+    if(verbose) cat(i,"-",as.character(contributions[n.preds,1]),"\n");flush.console()#AKS
+
+# get the index number in pred.names of the last variable in the contribution table
+
+    last.variable <- match(as.character(contributions[n.preds,1]),these.pred.names)
+    gbm.new.x <- gbm.x[-last.variable]
+
+# and keep a record of what has been dropped
+
+    last.variable <- match(as.character(contributions[n.preds,1]),predictor.names)
+    final.drops[last.variable] <- i
+
+    final.model <- eval(parse(text=gbm.call.string))  # create a fixed size object
+
+  }
+
+#and then the corresponding numbers
+
+  removal.list <- dimnames(final.drops)[[1]]
+  removal.list <- removal.list[order(final.drops)]
+  removal.list <- removal.list[1:n.drops]
+
+  removal.numbers <- rep(0,n.steps)
+
+# construct predictor lists to faciliate final model fitting
+
+  for (i in 1:n.steps) {
+    removal.numbers[i] <- match(removal.list[i],predictor.names)
+    pred.list[[i]] <- orig.gbm.x[0-removal.numbers[1:i]]
+    names(pred.list)[i] <- paste("preds.",i,sep="")
+  }
+
+  deviance.summary <- data.frame(mean = round(mean.delta,4), se = round(se.delta,4))
+
+  final.drops <- data.frame("preds" = dimnames(final.drops)[[1]][order(final.drops)],
+     "order" = final.drops[order(final.drops)])
+
+  return(list(deviance.summary = deviance.summary,
+    deviance.matrix = dev.results, drop.count = drop.count,
+    final.drops = final.drops, pred.list = pred.list,
+    gbm.call = gbm.call))
+
+}
+
+"gbm.fixed" <-
+function (data,                        # the input dataframe
+  gbm.x,                               # indices of the predictors in the input dataframe
+  gbm.y,                               # index of the response in the input dataframe
+  tree.complexity = 1,                 # the tree depth - sometimes referred to as interaction depth
+  site.weights = rep(1, nrow(data)),   # by default set equal
+  verbose = TRUE,                      # to control reporting
+  learning.rate = 0.001,               # controls speed of the gradient descent
+  n.trees = 2000,                      # default number of trees
+  train.fraction = 1,
+  bag.fraction = 0.5,                  # varies random sample size for each new tree
+  family = "bernoulli",                # can be any of bernoulli, poisson, gaussian, laplace - note quotes
+  keep.data = FALSE,                   # keep original data
+  var.monotone = rep(0, length(gbm.x)) # constrain to positive (1) or negative monontone (-1)
+  )
+{
+#
+# j leathwick, j elith - 6th May 2007
+#
+# version 2.9 - developed in R 2.0
+#
+# calculates a gradient boosting (gbm)object with a fixed number of trees
+# with the number of trees identified using gbm.step or some other procedure
+#
+# mostly used as a utility function, e.g., when being called by gbm.simplify
+#
+# takes as input a dataset and args selecting x and y variables, learning rate and tree complexity
+#
+# updated 13/6/05 to accommodate weighting of sites when calculating total and residual deviance
+#
+# updated 10/8/05 to correct how site.weights are returned
+#
+# requires gbm
+#
+#
+  require(gbm)
+
+# setup input data and assign to position one
+
+  dataframe.name <- deparse(substitute(data))   # get the dataframe name
+
+  if(length(gbm.x)<=1) stop("Only one predictor remains in backward selection\nplease select more predictors")
+  x.data <- eval(data[, gbm.x])                 #form the temporary datasets
+  names(x.data) <- names(data)[gbm.x]
+  y.data <- eval(data[, gbm.y])
+  sp.name <- names(data)[gbm.y]
+
+
+  assign("x.data", x.data, pos = 1)             #and assign them for later use
+  assign("y.data", y.data, pos = 1)
+
+#fit the gbm model
+
+  z1 <- unclass(Sys.time())
+
+  gbm.call <- paste("gbm(y.data ~ .,n.trees = n.trees, data=x.data, verbose = F, interaction.depth = tree.complexity,
+    weights = site.weights, shrinkage = learning.rate, distribution = as.character(family),
+    var.monotone = var.monotone, bag.fraction = bag.fraction, keep.data = keep.data)", sep="")
+
+  if (verbose) {
+    print(paste("fitting gbm model with a fixed number of ",n.trees," trees for ",sp.name,sep=""),quote=FALSE) }
+
+  gbm.object <- eval(parse(text = gbm.call))
+
+  best.trees <- n.trees
+
+#extract fitted values and summary table
+
+  fitted.values <- predict.gbm(gbm.object,x.data,n.trees = n.trees,type="response")
+  gbm.summary <- summary(gbm.object,n.trees = n.trees, plotit = FALSE)
+
+  y_i <- y.data
+  u_i <- fitted.values
+
+  if (family == "poisson") {
+    deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+    resid.deviance <- 2 * sum(deviance.contribs * site.weights)
+    residuals <- sqrt(abs(deviance.contribs * 2))
+    residuals <- ifelse((y_i - u_i) < 0, 0 - residuals, residuals)
+
+    u_i <- sum(y.data * site.weights) / sum(site.weights)
+    deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+    total.deviance <- 2 * sum(deviance.contribs * site.weights)
+  }
+
+  if (family == "bernoulli") {
+    deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+    resid.deviance <- -2 * sum(deviance.contribs * site.weights)
+    residuals <- sqrt(abs(deviance.contribs * 2))
+    residuals <- ifelse((y_i - u_i) < 0, 0 - residuals, residuals)
+
+    u_i <- sum(y.data * site.weights) / sum(site.weights)
+    deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+    total.deviance <- -2 * sum(deviance.contribs * site.weights)
+  }
+
+  if (family == "laplace") {
+    resid.deviance <- sum(abs(y_i - u_i))
+    residuals <- y_i - u_i
+    u_i <- mean(y.data)
+    total.deviance <- sum(abs(y_i - u_i))
+  }
+
+  if (family == "gaussian") {
+    resid.deviance <- sum((y_i - u_i) * (y_i - u_i))
+    residuals <- y_i - u_i
+    u_i <- mean(y.data)
+    total.deviance <- sum((y_i - u_i) * (y_i - u_i))
+  }
+
+  if (verbose) {
+    print(paste("total deviance = ",round(total.deviance,2),sep=""),quote=F)
+    print(paste("residual deviance = ",round(resid.deviance,2),sep=""),quote=F)}
+
+# now assemble data to be returned
+
+  z2 <- unclass(Sys.time())
+  elapsed.time.minutes <- round((z2 - z1)/ 60,2)  #calculate the total elapsed time
+
+  gbm.detail <- list(dataframe = dataframe.name, gbm.x = gbm.x, predictor.names = names(x.data),
+    gbm.y = gbm.y, reponse.name = names(y.data), family = family, tree.complexity = tree.complexity,
+    learning.rate = learning.rate, bag.fraction = bag.fraction, cv.folds = 0, n.trees = n.trees, best.trees = best.trees,
+    train.fraction = train.fraction, var.monotone = var.monotone, date = date(), elapsed.time.minutes = elapsed.time.minutes)
+
+  gbm.object$gbm.call <- gbm.detail
+  gbm.object$fitted <- fitted.values
+  gbm.object$residuals <- residuals
+  gbm.object$contributions <- gbm.summary
+  gbm.object$self.statistics <- list(null.deviance = total.deviance, resid.deviance = resid.deviance)
+  gbm.object$weights <- site.weights
+
+  rm(x.data,y.data, pos=1)           #finally, clean up the temporary dataframes
+
+  return(gbm.object)
+}
+
+
+make.p.tif=T
+make.binary.tif=T
+
+tc=NULL
+n.folds=3
+alpha=1
+
+learning.rate = NULL
+bag.fraction = 0.5
+prev.stratify = TRUE
+max.trees = 10000
+tolerance.method = "auto"
+tolerance = 0.001
+seed=NULL
+opt.methods=2
+save.model=TRUE
+MESS=FALSE
+# Interpret command line argurments #
+# Make Function Call #
+Args <- commandArgs(trailingOnly=FALSE)
+
+    for (i in 1:length(Args)){
+     if(Args[i]=="-f") ScriptPath<-Args[i+1]
+     }
+
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="c") csv <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+   		if(argSplit[[1]][1]=="mpt") make.p.tif <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="mbt")  make.binary.tif <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="tc")  tc <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="nf")  n.folds <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="alp")  alpha <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="lr")  learning.rate <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="bf")  bag.fraction <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="ps")  prev.stratify <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="mt")  max.trees <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="om")  opt.methods <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="seed")  seed <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="savm")  save.model <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="tolm")  tolerance.method <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="tol")  tolerance <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="mes")  MESS <- argSplit[[1]][2]
+ 			
+    }
+	print(csv)
+	print(output)
+	print(responseCol)
+
+ScriptPath<-dirname(ScriptPath)
+source(paste(ScriptPath,"LoadRequiredCode.r",sep="\\"))
+
+
+alpha<-as.numeric(alpha)
+make.p.tif<-as.logical(make.p.tif)
+make.binary.tif<-as.logical(make.binary.tif)
+prev.stratify<-as.logical(prev.stratify)
+save.model<-make.p.tif | make.binary.tif
+opt.methods<-as.numeric(opt.methods)
+MESS<-as.logical(MESS)
+
+    fit.brt.fct(ma.name=csv,
+		tif.dir=NULL,
+		output.dir=output,
+		response.col=responseCol,
+		make.p.tif=make.p.tif,make.binary.tif=make.binary.tif,
+		simp.method="cross-validation",debug.mode=F,responseCurveForm="pdf",tc=tc,n.folds=n.folds,alpha=alpha,script.name="brt.r",
+		learning.rate =learning.rate, bag.fraction = bag.fraction,prev.stratify = prev.stratify,max.trees = max.trees,seed=seed,
+    save.model=save.model,opt.methods=opt.methods,MESS=MESS)
+
+
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/FIT_GLM_pluggable.r b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_GLM_pluggable.r
new file mode 100644
index 0000000..a472b6d
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_GLM_pluggable.r
@@ -0,0 +1,775 @@
+# A set of "pluggable" R functions for automated model fitting of glm models to presence/absence data #
+#
+# Modified 12-2-09 to:  remove categorical covariates from consideration if they only contain one level
+#                       ID factor variables based on "categorical" prefix and look for tifs in subdir
+#                       Give progress reports
+#                       write large output tif files in blocks to alleviate memory issues
+#                       various bug fixes
+#
+#
+# Modified 3-4-09 to use a list object for passing of arguements and data
+#
+
+
+# Libraries required to run this program #
+#   PresenceAbsence - for ROC plots
+#   XML - for XML i/o
+#   rgdal - for geotiff i/o
+#   sp - used by rdgal library
+#   raster for geotiff o
+options(error=NULL)
+
+fit.glm.fct <- function(ma.name,tif.dir=NULL,output.dir=NULL,response.col="^response.binary",make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",responseCurveForm=NULL,debug.mode=F,model.family="binomial",script.name="glm.r",opt.methods=2,save.model=TRUE,UnitTest=FALSE,MESS=FALSE){
+    # This function fits a stepwise GLM model to presence-absence data.
+    # written by Alan Swanson, 2008-2009
+    ## Maintained and edited by Marian Talbert September 2010-
+    # Arguements.
+    # ma.name: is the name of a .csv file with a model array.  full path must be included unless it is in the current
+    #  R working directory #
+    # tif.dir: is the directory containing geotiffs for each covariate.  only required if geotiffs output of the 
+    #   response surface is requested #    # cov.list.name: is the name of a text file with the names of covariates to be included in models (one per line).
+    # output.dir: is the directory that output files will be stored in.  if not given, files will go to the current working directory. 
+    # response.col: column number of the model array containing a binary 0/1 response.  all other columns will be considered explanatory variables.
+    # make.p.tif: T if a geotiff of the response surface is desired.
+    # make.binary.tif: T if a geotiff of the response surface is desired.
+    # simp.method: model simplification method.  valid methods include: "AIC" and "BIC". 
+    # debug.mode: if T, output is directed to the console during the run.  also, a pdf is generated which contains response curve plots and perspective plots
+    #    showing the effects of interactions deemed important.  if F, output is diverted to a text file and the console is kept clear 
+    #    except for final output of an xml file.  in either case, a set of standard output files are created in the output directory.
+    # 
+
+    # Value:
+    # returns nothing but generates a number of output files in the directory
+    # "output.dir" named above.  These output files consist of:
+    #
+    # glm_output.txt:  a text file with fairly detailed results of the final model.
+    # glm_output.xml:  an xml-formatted text file with results from the final model.
+    # glm_response_curves.xml:  an xml-formatted text file with response curves for
+    #   each covariate in the final model.
+    # glm_prob_map.tif:  a geotiff of the response surface
+    # glm_bin_map.tif:  a geotiff of the binary response surface.  threhold is based on the roc curve at the point where sensitivity=specificity.
+    # glm_log.txt:   a file containing text output diverted from the console when debug.mode=F
+    # glm_auc_plot.jpg:  a jpg file of a ROC plot.
+    # glm_response_curves.pdf:  an pdf file with response curves for
+    #   each covariate in the final model and perspective plots showing the effect of interactions deemed significant.
+    #   only produced when debug.mode=T
+    #  seed=NULL                                 # sets a seed for the algorithm, any inegeger is acceptable
+    #  opt.methods=2                             # sets the method used for threshold optimization used in the
+    #                                            # the evaluation statistics module
+    #  save.model=FALSE                          # whether the model will be used to later produce tifs
+    #
+    # when debug.mode is true, these filenames will include a number in them so that they will not overwrite preexisting files. eg brt_1_output.txt.
+    #
+    times <- as.data.frame(matrix(NA,nrow=7,ncol=1,dimnames=list(c("start","read data","model fit",
+            "model summary","response curves","tif output","done"),c("time"))))
+    times[1,1] <- unclass(Sys.time())
+    t0 <- unclass(Sys.time())
+    #simp.method <- match.arg(simp.method)
+    out <- list(
+      input=list(ma.name=ma.name,
+                 tif.dir=tif.dir,
+                 output.dir=output.dir,
+                 response.col=response.col,
+                 make.p.tif=make.p.tif,
+                 model.family=model.family,
+                 make.binary.tif=make.binary.tif,
+                 simp.method=simp.method,
+                 model.type="stepwise glm",
+                 model.source.file=script.name,
+                 model.fitting.subset=NULL,
+                 save.model=save.model,
+                 run.time=paste(c(format(Sys.time(),"%Y-%m-%d"),format(Sys.time(),"%H:%M:%S")),collapse="T"),
+                 sig.test="t-test p-value",
+                 MESS=MESS),
+      dat = list(missing.libs=NULL,
+                 output.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tiff.ind=NULL,
+                 tif.names=NULL,
+                 bname=NULL,
+                 bad.factor.covs=NULL, # factorchange
+                 ma=list( status=c(exists=F,readable=F),
+                          dims=c(NA,NA),
+                          resp.name=NULL,
+                          factor.levels=NA,
+                          used.covs=NULL,
+                          ma=NULL,
+                          train.weights=NULL,
+                          test.weights=NULL,
+                          train.xy=NULL,
+                          test.xy=NULL,
+                          ma.subset=NULL
+                          ),
+                 ma.test=NULL),
+      mods=list(final.mod=NULL,
+                r.curves=NULL,
+                tif.output=list(prob=NULL,bin=NULL),
+                auc.output=NULL,
+                interactions=NULL,  # not used #
+                summary=NULL),
+      time=list(strt=unclass(Sys.time()),end=NULL),
+      error.mssg=list(NULL),
+      ec=0    # error count #
+      )
+    # load libaries #
+    out <- check.libs(list("PresenceAbsence","rgdal","XML","sp","survival","tools","raster","tcltk2","foreign","ade4"),out)
+    
+    # exit program now if there are missing libraries #
+    if(!is.null(out$error.mssg[[1]])){
+          cat(saveXML(glm.to.xml(out),indent=T),'\n')
+          return()
+          }
+          
+    if(is.na(match(simp.method,c("AIC","BIC")))){
+        return()
+        }
+        
+    # check output dir #
+    
+    out$dat$output.dir <- check.dir(output.dir)    
+    if(out$dat$output.dir$writable==F) {out$ec<-out$ec+1
+              out$error.mssg[[out$ec]] <- paste("ERROR: output directory",output.dir,"is not writable")
+              out$dat$output.dir$dname <- getwd()
+              }
+    
+    # generate a filename for output #
+    if(debug.mode==T){  #paste(bname,"_summary.txt",sep="")
+            outfile <- paste(bname<-paste(out$dat$output.dir$dname,"/glm_",n<-1,sep=""),"_output.txt",sep="")
+            while(file.access(outfile)==0) outfile<-paste(bname<-paste(out$dat$output.dir$dname,"/glm_",n<-n+1,sep=""),"_output.txt",sep="")
+            capture.output(cat("temp"),file=outfile) # reserve the new basename #
+    } else bname <- paste(out$dat$output.dir$dname,"/glm",sep="")
+    out$dat$bname <- bname    
+    
+    # sink console output to log file #
+    if(!debug.mode) {sink(logname <- paste(bname,"_log.txt",sep=""));on.exit(sink)} else logname<-NULL
+    options(warn=1)
+
+    # check tif dir #
+     if(!is.null(tif.dir)){
+      out$dat$tif.dir <- check.dir(tif.dir)
+      if(out$dat$tif.dir$readable==F & (out$input$make.binary.tif | out$input$make.p.tif)) {
+                out$ec<-out$ec+1
+                out$error.mssg[[out$ec]] <- paste("ERROR: tif directory",tif.dir,"is not readable")
+                if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+              cat(saveXML(brt.to.xml(out),indent=T),'\n')
+              return()
+              }
+            }
+
+
+    # find .tif files in tif dir #
+ 
+    if(out$dat$tif.dir$readable)  out$dat$tif.names <- list.files(out$dat$tif.dir$dname,pattern=".tif",recursive=T)
+    
+    # check for model array #
+    out$input$ma.name <- check.dir(out$input$ma.name)$dname
+    if(UnitTest!=FALSE) options(warn=2)
+    out <- read.ma(out)
+    if(UnitTest==1) return(out)
+    
+    if(!is.null(out$error.mssg[[1]])){
+          if(!debug.mode) {sink();on.exit();unlink(logname)}
+          cat(saveXML(glm.to.xml(out),indent=T),'\n')
+          return()
+          }
+      #allowing site weights    
+
+    times[2,1] <- unclass(Sys.time())
+    if(!debug.mode) {sink();cat("Progress:20%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("20%\n")}  ### print time
+    cat("\nbegin processing of model array:",out$input$ma.name,"\n")
+    cat("\nfile basename set to:",out$dat$bname,"\n")
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+    
+       
+    
+           
+    ##############################################################################################################
+    #  Begin model fitting #
+    ##############################################################################################################
+
+    # Fit null GLM and run stepwise, then print results #
+    cat("\n","Fitting stepwise GLM","\n")
+    flush.console()
+    penalty <- if(out$input$simp.method=="AIC") 2 else log(nrow(out$dat$ma$ma))
+    scope.glm <- list(lower=as.formula(paste(out$dat$ma$resp.name,"~1")),
+        upper=as.formula(paste(out$dat$ma$resp.name,"~",paste(out$dat$ma$used.covs,collapse='+'))))
+
+    mymodel.glm.step <- step(glm(as.formula(paste(out$dat$ma$resp.name,"~1")),family=out$input$model.family,data=out$dat$ma$ma,weights=out$dat$ma$train.weights,na.action="na.exclude"),
+          direction='both',scope=scope.glm,trace=0,k=penalty)
+    
+    out$mods$final.mod <- mymodel.glm.step
+
+    out$dat$ma$used.covs <- attr(terms(formula(out$mods$final.mod)),"term.labels")
+    #assign("out",out,envir=.GlobalEnv)
+    t3 <- unclass(Sys.time())
+    cat("\n","Finished with stepwise GLM","\n")
+    cat("Summary of Model:","\n")
+    print(out$mods$summary <- summary(mymodel.glm.step))
+    if(!is.null(out$dat$bad.factor.cols)){
+        cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n\n")
+        }
+    flush.console()
+
+    flush.console()
+    times[3,1] <- unclass(Sys.time())
+    if(!debug.mode) {sink();cat("Progress:40%\n");flush.console();sink(logname,append=T)} else cat("40%\n")
+
+     #r<-residuals(out$mods$final.mod, "deviance")
+
+    if(length(coef(out$mods$final.mod))==1) stop("Null model was selected.  \nEvaluation metrics and plots will not be produced")
+
+    ##############################################################################################################
+    #  Begin model output #
+    ##############################################################################################################
+           
+    # Store .jpg ROC plot #
+     txt0 <- paste("Generalized Linear Results\n",out$input$run.time,"\n\n","Data:\n\t ",ma.name,"\n\t ","n(pres)=",
+        out$dat$ma$n.pres[2],"\n\t n(abs)=",out$dat$ma$n.abs[2],"\n\t number of covariates considered=",(length(names(out$dat$ma$ma))-1),
+        "\n\n","Settings:\n","\n\t model family=",out$input$model.family,
+        "\n\n","Results:\n\t ","number covariates in final model=",length(out$dat$ma$used.covs),
+        "\n\t total time for model fitting=",round((unclass(Sys.time())-t0)/60,2),"min\n",sep="")
+
+    capture.output(cat(txt0),file=paste(bname,"_output.txt",sep=""))
+
+        capture.output(out$mods$summary,file=paste(bname,"_output.txt",sep=""),append=TRUE)
+    if(!is.null(out$dat$bad.factor.cols)){
+        capture.output(cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n"),
+            file=paste(bname,"_output.txt",sep=""),append=T)
+        }
+
+
+      auc.output <- make.auc.plot.jpg(out$dat$ma$ma,pred=predict(mymodel.glm.step,type='response'),plotname=paste(bname,"_auc_plot.jpg",sep=""),modelname="GLM",opt.methods=opt.methods,
+            weight=out$dat$ma$train.weights,out=out)
+
+      out$mods$auc.output<-auc.output
+
+ # if(out$input$model.family=="poisson"){
+ #     auc.output <- make.poisson.jpg(out$dat$ma$ma,pred=predict(mymodel.glm.step,type='response'),
+ #     plotname=paste(bname,"_auc_plot.jpg",sep=""),modelname="BRT",
+ #           weight=out$dat$ma$train.weights,out=out)
+
+  #    out$mods$auc.output<-auc.output
+   #   }
+
+  #  out$mods$auc.output<-auc.output
+
+
+
+
+    times[4,1] <- unclass(Sys.time())
+    if(!debug.mode) {sink();cat("Progress:70%\n");flush.console();sink(logname,append=T)} else cat("70%\n")
+    
+    # Response curves #
+    
+if(is.null(responseCurveForm)){
+responseCurveForm<-0}  
+  
+if(debug.mode | responseCurveForm=="pdf"){
+        nvar <- length(coef(out$mods$final.mod))-1
+        pcol <- min(ceiling(sqrt(nvar)),4)
+        prow <- min(ceiling(nvar/pcol),3)
+        
+        pdf(paste(bname,"_response_curves.pdf",sep=""),width=11,height=8.5,onefile=T)
+            par(oma=c(2,2,4,2),mfrow=c(prow,pcol))
+            r.curves <-my.termplot(out$mods$final.mod,plot.it=T)
+            mtext(paste("GLM response curves for",basename(ma.name)),outer=T,side=3,cex=1.3)
+            par(mfrow=c(1,1))
+            graphics.off()
+        } else r.curves<-try(my.termplot(out$mods$final.mod,plot.it=F))
+            
+    
+        if(class(r.curves)!="try-error") {
+            out$mods$r.curves <- r.curves
+                } else {
+            out$ec<-out$ec+1
+            out$error.mssg[[out$ec]] <- paste("ERROR: problem fitting response curves",r.curves)
+            }
+        
+    
+    t4 <- unclass(Sys.time())
+    cat("\nfinished with final model summarization, t=",round(t4-t3,2),"sec\n");flush.console()
+    times[5,1] <- unclass(Sys.time())
+    if(!debug.mode) {sink();cat("Progress:80%\n");flush.console();sink(logname,append=T)} else cat("80%\n")
+    
+   
+    ##############################################################################################################
+    # Make .tif of predictions #
+    ##############################################################################################################
+        out$mods$final.mod$contributions$var<-attr(terms(formula(out$mods$final.mod)),"term.labels")
+         assign("out",out,envir=.GlobalEnv)
+
+ save.image(paste(output.dir,"modelWorkspace",sep="\\"))
+    if(out$input$make.p.tif==T | out$input$make.binary.tif==T){
+        if((n.var <- length(coef(out$mods$final.mod)))<2){
+            mssg <- "Error producing geotiff output:  null model selected by stepwise procedure - pointless to make maps"
+            class(mssg)<-"try-error"
+            } else {
+            cat("\nproducing prediction maps...","\n","\n");flush.console()
+            mssg <- proc.tiff(model=out$mods$final.mod,vnames=attr(terms(formula(out$mods$final.mod)),"term.labels"),
+                tif.dir=out$dat$tif.dir$dname,filenames=out$dat$tif.ind,pred.fct=glm.predict,factor.levels=out$dat$ma$factor.levels,make.binary.tif=make.binary.tif,
+                thresh=out$mods$auc.output$thresh,make.p.tif=make.p.tif,outfile.p=paste(out$dat$bname,"_prob_map.tif",sep=""),
+                outfile.bin=paste(out$dat$bname,"_bin_map.tif",sep=""),tsize=50,NAval=-3000,fnames=out$dat$tif.names,logname=logname,out=out)     #"brt.prob.map.tif"
+            }
+      #  model=out$mods$final.mod;vnames=attr(terms(formula(out$mods$final.mod)),"term.labels");
+#                tif.dir=out$dat$tif.dir$dname;pred.fct=glm.predict;factor.levels=out$dat$ma$factor.levels;make.binary.tif=make.binary.tif;
+#                thresh=out$mods$auc.output$thresh;make.p.tif=make.p.tif;outfile.p=paste(out$dat$bname,"_prob_map.tif",sep="");
+#                outfile.bin=paste(out$dat$bname,"_bin_map.tif",sep="");tsize=50;NAval=-3000;fnames=out$dat$tif.names
+        if(class(mssg)=="try-error"){
+          if(!debug.mode) {sink();on.exit();unlink(logname)}
+          out$ec<-out$ec+1
+          out$error.mssg[[out$ec]] <- paste("Error producing prediction maps:",mssg)
+          cat(saveXML(glm.to.xml(out),indent=T),'\n')
+          return()
+        }  else {
+            if(make.p.tif) out$mods$tif.output$prob <- paste(out$dat$bname,"_prob_map.tif",sep="")
+            if(make.binary.tif) out$mods$tif.output$bin <- paste(out$dat$bname,"_bin_map.tif",sep="")
+            t5 <- unclass(Sys.time())
+            cat("\nfinished with prediction maps, t=",round(t5-t4,2),"sec\n");flush.console()
+          }
+        }
+    times[6,1] <- unclass(Sys.time())
+    if(!debug.mode) {sink();cat("Progress:90%\n");flush.console();sink(logname,append=T)} else cat("90%\n")
+    
+     # Evaluation Statistics on Test Data#
+
+    if(!is.null(out$dat$ma$ma.test)) Eval.Stat<-EvaluationStats(out,thresh=auc.output$thresh,train=out$dat$ma$ma,
+    train.pred=predict(mymodel.glm.step,type="response"),opt.methods)
+
+    
+    # Write summaries to xml #
+    assign("out",out,envir=.GlobalEnv)
+    doc <- glm.to.xml(out)
+    
+    #cat(paste("\ntotal time=",round((unclass(Sys.time())-t0)/60,2),"min\n\n\n",sep=""))
+    if(!debug.mode) {
+        sink();on.exit();unlink(logname)
+        cat("Progress:100%\n");flush.console()
+        cat(saveXML(doc,indent=T),'\n')
+        flush.console()
+        } else {cat("100%\n")}
+    capture.output(cat(saveXML(doc,indent=T)),file=paste(out$dat$bname,"_output.xml",sep=""))
+    assign("fit",out$mods$final.mod,envir=.GlobalEnv)
+    times[7,1] <- unclass(Sys.time())
+    
+    times$net <- times$time - times$time[1]
+    times$pct <- round(times$net/times$net[7]*100,2)
+    times$process <- c(0,times$time[-1]-times$time[-7])
+    times$ppcnt <- round(times$process/times$net[7]*100,2)
+    write.csv(times,paste(bname,"times.csv",sep="_"))
+    invisible(out)
+}
+
+glm.predict <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictionss.
+    
+    y <- as.vector(predict(model,x,type="response"))
+    
+    # encode missing values as -1.
+    y[is.na(y)]<- NaN
+    
+    # return predictions.
+    return(y)
+    }
+
+logit <- function(x) 1/(1+exp(-x))
+
+
+file_path_as_absolute <- function (x){
+    if (!file.exists(epath <- path.expand(x))) 
+        stop(gettextf("file '%s' does not exist", x), domain = NA)
+    cwd <- getwd()
+    on.exit(setwd(cwd))
+    if (file_test("-d", epath)) {
+        setwd(epath)
+        getwd()
+    }
+    else {
+        setwd(dirname(epath))
+        file.path(getwd(), basename(epath))
+    }
+}
+#file_path_as_absolute(".")
+
+glm.to.xml <- function(out){
+    require(XML)
+    schema.http="http://www.w3.org/2001/XMLSchema-instance"
+    schema.fname="file:/Users/isfs2/Desktop/Source/2008-04-09/src/gov/nasa/gsfc/quickmap/ModelBuilder/modelRun_output_v2.xsd"
+    xml.out <- newXMLDoc()
+    mr <- newXMLNode("modelRunOutput",doc=xml.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))#,parent=xml.out
+    sm <- newXMLNode("singleModel",parent=mr)
+    bg <- newXMLNode("background",parent=sm)
+        newXMLNode("mdsName",out$input$ma.name,parent=bg)
+        newXMLNode("runDate",out$input$run.time,parent=bg)
+        lc <- newXMLNode("layersConsidered",parent=bg)#, parent = xml.out)
+        kids <- lapply(paste(out$dat$tif.dir$dname,"/",out$dat$tif.names,sep=""),function(x) newXMLNode("layer", x))
+        addChildren(lc, kids)
+        mo <- newXMLNode("modelOutput",parent=sm)
+        newXMLNode("modelType",out$input$model.type,parent=mo)
+        newXMLNode("modelSourceFile",out$input$model.source.file,parent=mo)
+        newXMLNode("devianceExplained",out$mods$auc.output$pct_dev_exp,parent=mo,attrs=list(type="percentage"))
+        newXMLNode("nativeOutput",paste(out$dat$bname,"_output.txt",sep=""),parent=mo)
+        newXMLNode("binaryOutputFile",out$mods$tif.output[[2]],parent=mo)
+        newXMLNode("probOutputFile",out$mods$tif.output[[1]],parent=mo)
+        newXMLNode("auc",out$mods$auc.output$auc,parent=mo)
+        newXMLNode("rocGraphic",out$mods$auc.output$plotname,parent=mo)
+        newXMLNode("rocThresh",out$mods$auc.output$thresh,parent=mo)
+        newXMLNode("modelDeviance",out$mods$auc.output$dev_fit,parent=mo)
+        newXMLNode("nullDeviance",out$mods$auc.output$null_dev,parent=mo)
+        if(is.null(out$mods$r.curves)) rc.name <- NULL else rc.name <- paste(out$dat$bname,"_response_curves.xml",sep="")
+        newXMLNode("responsePlotsFile",rc.name,parent=mo)
+        newXMLNode("significanceDescription",out$input$sig.test,parent=mo)
+        mfp <- newXMLNode("modelFitParmas",parent=mo)
+            newXMLNode("simpMethod",out$input$model.type,parent=mfp)
+            newXMLNode("simpCriteria",out$input$simp.method,parent=mfp)
+                  
+        sv <- newXMLNode("significantVariables",parent=mo)
+        if(!is.null(out$mods$summary)) {
+            t.table <- out$mods$summary$coefficients
+            t.table <- t.table[order(t.table[,4]),]
+            dimnames(t.table)[[2]] <- c("coefficient","standardError","testStatistic","significanceMeasurement")
+            t.table <- as.data.frame(t.table)
+            for(i in 1:nrow(t.table)){
+                x <- newXMLNode("sigVar",parent=sv)
+                newXMLNode(name="name", row.names(t.table)[i],parent=x)
+                kids <- lapply(1:ncol(t.table),function(j) newXMLNode(name=names(t.table)[j], t.table[i,j]))
+                addChildren(x, kids)
+                }
+            }
+        
+    if(!is.null(out$mods$r.curves)){
+        r.curves <-  out$mods$r.curves
+        factor.levels <- out$dat$ma$factor.levels
+        rc.out <- newXMLDoc()
+        root <- newXMLNode("responseCurves",doc=rc.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))
+        for(i in 1:length(r.curves$names)){
+            if(!is.na(f.index<-match(r.curves$names[i],names(factor.levels)))){
+                  vartype <- "factor"} else vartype="continuous"
+            x <- newXMLNode("responseCurve",attrs=list(covariate=r.curves$names[i],type=vartype),parent=root)
+            kids <- lapply(1:length(r.curves$preds[[i]]),function(j){
+                    newXMLNode(name="responsePt",parent=x,.children=list(
+                        newXMLNode(name="explanatory",as.character(r.curves$preds[[i]])[j]),
+                        newXMLNode(name="response",r.curves$resp[[i]][j])))})
+            addChildren(x,kids)
+            }
+        saveXML(rc.out,rc.name,indent=T)
+        
+        } else { rc.name<-NULL }
+    if(!is.null(out$error.mssg[[1]])) {
+        kids <- lapply(out$error.mssg,function(j) newXMLNode(name="error",j))
+        addChildren(mo,kids)
+        }
+    return(xml.out)
+    }                              
+
+
+get.cov.names <- function(model){
+    return(attr(terms(formula(model)),"term.labels"))
+    }
+
+
+check.dir <- function(dname){
+    if(is.null(dname)) dname <- getwd()
+    dname <- gsub("[\\]","/",dname)
+    end.char <- substr(dname,nchar(dname),nchar(dname))
+    if(end.char == "/") dname <- substr(dname,1,nchar(dname)-1)
+    exist <- suppressWarnings(as.numeric(file.access(dname,mode=0))==0) # -1 if bad, 0 if ok #
+    if(exist) dname <- file_path_as_absolute(dname)
+    readable <- suppressWarnings(as.numeric(file.access(dname,mode=4))==0) # -1 if bad, 0 if ok #
+    writable <- suppressWarnings(as.numeric(file.access(dname,mode=2))==0) # -1 if bad, 0 if ok #
+    return(list(dname=dname,exist=exist,readable=readable,writable=writable))
+    }
+
+
+get.image.info <- function(image.names){
+    # this function creates a data.frame with summary image info for a set of images #
+    require(rgdal)
+    require(tools)
+    n.images <- length(image.names)
+
+    full.names <- image.names
+    out <- data.frame(image=full.names,available=rep(F,n.images),size=rep(NA,n.images),
+        type=factor(rep("unk",n.images),levels=c("asc","envi","tif","unk")))
+    out$type[grep(".tif",image.names)]<-"tif"
+    out$type[grep(".asc",image.names)]<-"asc"
+    for(i in 1:n.images){
+        if(out$type[i]=="tif"){
+            x <-try(GDAL.open(full.names[1],read.only=T))
+            suppressMessages(try(GDAL.close(x)))
+            if(class(x)!="try-error") out$available[i]<-T
+            x<-try(file.info(full.names[i]))
+        } else {
+            x<-try(file.info(full.names[i]))
+            if(!is.na(x$size)) out$available[i]<-T
+        }
+        if(out$available[i]==T){
+            out$size[i]<-x$size
+            if(out$type[i]=="unk"){
+                # if extension not known, look for envi .hdr file in same directory #
+                if(file.access(paste(file_path_sans_ext(full.names[i]),".hdr",sep=""))==0) 
+                    out$type[i]<-"envi"
+                }
+        }
+    }
+    return(out)
+}
+
+#make.r.curves.glm <- function(model){
+#    tms <- as.matrix(predict(model,type="terms"))
+#    mf <- model.frame(model)
+#    preds <- list()
+#    response <- list()
+#    p.names <- colnames(tms)
+#    is.fac <- sapply(p.names, function(i) is.factor(mf[, i]))
+#    for(i in 1:length(p.names)){
+#        if(is.fac[i]){
+#            ff <- mf[, p.names[i]]
+#            if (!is.null(model$na.action)) ff <- naresid(model$na.action,ff)
+#            xx <- as.numeric(ff)
+#            ll <- levels(ff)
+#            out <- rep(NA,length(ll))
+#            for (j in seq_along(ll)) {
+#                    ww <- which(ff == ll[j])[1]
+#                    out[j]<-tms[ww,i]
+#                    #out[j]<-tms[ff==ll[j],i][1]
+#                    }
+#            
+#            }
+#    
+#        
+#    
+#data = NULL; envir = environment(formula(model));
+#    partial.resid = FALSE; rug = FALSE; terms = NULL; se = FALSE;
+#    xlabs = NULL; ylabs = NULL; main = NULL; col.term = 2; lwd.term = 1.5;
+#    col.se = "orange"; lty.se = 2; lwd.se = 1; col.res = "gray";
+#    cex = 1; pch = par("pch"); col.smth = "darkred"; lty.smth = 2;
+#    span.smth = 2/3; ask = dev.interactive() && nb.fig < n.tms;
+#    use.factor.levels = TRUE; smooth = NULL; ylim = "common";plot.it=F;
+#terms="yell_250m_evi_16landcovermap_4ag05"
+my.termplot <- function (model, data = NULL, envir = environment(formula(model)),
+    partial.resid = FALSE, rug = FALSE, terms = NULL, se = FALSE,
+    xlabs = NULL, ylabs = NULL, main = NULL, col.term = 2, lwd.term = 1.5,
+    col.se = "orange", lty.se = 2, lwd.se = 1, col.res = "gray",
+    cex = 1, pch = 1, col.smth = "darkred", lty.smth = 2,
+    span.smth = 2/3, ask = dev.interactive() && nb.fig < n.tms,
+    use.factor.levels = TRUE, smooth = NULL, ylim = "common",plot.it=F,
+    ...)
+{   # this function is borrowed from the stats library #
+
+    which.terms <- terms
+    terms <- if (is.null(terms))
+        predict(model, type = "terms", se.fit = se)
+    else predict(model, type = "terms", se.fit = se, terms = terms)
+    n.tms <- ncol(tms <- as.matrix(if (se)
+        terms$fit
+    else terms))
+    mf <- model.frame(model)
+    if (is.null(data))
+        data <- eval(model$call$data, envir)
+    if (is.null(data))
+        data <- mf
+    if (NROW(tms) < NROW(data)) {
+        use.rows <- match(rownames(tms), rownames(data))
+    }
+    else use.rows <- NULL
+    nmt <- colnames(tms)
+    cn <- parse(text = nmt)
+    if (!is.null(smooth))
+        smooth <- match.fun(smooth)
+    if (is.null(ylabs))
+        ylabs <- paste("Partial for", nmt)
+    if (is.null(main))
+        main <- ""
+    else if (is.logical(main))
+        main <- if (main)
+            deparse(model$call, 500)
+        else ""
+    else if (!is.character(main))
+        stop("'main' must be TRUE, FALSE, NULL or character (vector).")
+    main <- rep(main, length.out = n.tms)
+    pf <- envir
+    carrier <- function(term) {
+        if (length(term) > 1)
+            carrier(term[[2]])
+        else eval(term, data, enclos = pf)
+    }
+    carrier.name <- function(term) {
+        if (length(term) > 1)
+            carrier.name(term[[2]])
+        else as.character(term)
+    }
+    if (is.null(xlabs))
+        xlabs <- unlist(lapply(cn, carrier.name))
+    if (partial.resid || !is.null(smooth)) {
+        pres <- residuals(model, "partial")
+        if (!is.null(which.terms))
+            pres <- pres[, which.terms, drop = FALSE]
+    }
+    is.fac <- sapply(nmt, function(i) is.factor(mf[, i]))
+    se.lines <- function(x, iy, i, ff = 2) {
+        tt <- ff * terms$se.fit[iy, i]
+        lines(x, tms[iy, i] + tt, lty = lty.se, lwd = lwd.se,
+            col = col.se)
+        lines(x, tms[iy, i] - tt, lty = lty.se, lwd = lwd.se,
+            col = col.se)
+    }
+    if(plot.it) nb.fig <- prod(par("mfcol"))
+    if (ask & plot.it) {
+        oask <- devAskNewPage(TRUE)
+        on.exit(devAskNewPage(oask))
+    }
+    ylims <- ylim
+    if (identical(ylims, "common")) {
+        ylims <- if (!se)
+            range(tms, na.rm = TRUE)
+        else range(tms + 1.05 * 2 * terms$se.fit, tms - 1.05 *
+            2 * terms$se.fit, na.rm = TRUE)
+        if (partial.resid)
+            ylims <- range(ylims, pres, na.rm = TRUE)
+        if (rug)
+            ylims[1] <- ylims[1] - 0.07 * diff(ylims)
+    }
+    preds <- list()
+    response <- list()
+    p.names <- xlabs
+    for (i in 1:n.tms) {
+        if (identical(ylim, "free")) {
+            ylims <- range(tms[, i], na.rm = TRUE)
+            if (se)
+                ylims <- range(ylims, tms[, i] + 1.05 * 2 * terms$se.fit[,
+                  i], tms[, i] - 1.05 * 2 * terms$se.fit[, i],
+                  na.rm = TRUE)
+            if (partial.resid)
+                ylims <- range(ylims, pres[, i], na.rm = TRUE)
+            if (rug)
+                ylims[1] <- ylims[1] - 0.07 * diff(ylims)
+        }
+        if (is.fac[i]) {
+            ff <- mf[, nmt[i]]
+            if (!is.null(model$na.action))
+                ff <- naresid(model$na.action, ff)
+            preds[[i]] <- ll <- levels(ff)
+            xlims <- range(seq_along(ll)) + c(-0.5, 0.5)
+            xx <- as.numeric(ff)
+            response[[i]]<-rep(NA,length(ll))
+            if (rug) {
+                xlims[1] <- xlims[1] - 0.07 * diff(xlims)
+                xlims[2] <- xlims[2] + 0.03 * diff(xlims)
+            }
+
+            if(plot.it){
+                plot(1, 0, type = "n", xlab = xlabs[i], ylab = ylabs[i],
+                    xlim = xlims, ylim = ylims, main = main[i], xaxt = "n",
+                    ...)
+                if (use.factor.levels)
+                    axis(1, at = seq_along(ll), labels = ll, ...)
+                else axis(1)
+                for (j in seq_along(ll)) {
+                    ww <- which(ff == ll[j])[c(1, 1)]
+                    jf <- j + c(-0.4, 0.4)
+                    lines(jf, response[[i]][j]<-tms[ww, i], col = col.term, lwd = lwd.term,...)
+                    if (se) se.lines(jf, iy = ww, i = i)
+                    }
+            } else {
+            for (j in seq_along(ll)) {
+                    ww <- which(ff == ll[j])[c(1, 1)]
+                    response[[i]][j]<-tms[ww, i]
+                    }
+                }
+        }
+        else {
+            xx <- carrier(cn[[i]])
+            if (!is.null(use.rows))
+                xx <- xx[use.rows]
+            xlims <- range(xx, na.rm = TRUE)
+            if (rug)
+                xlims[1] <- xlims[1] - 0.07 * diff(xlims)
+           
+            response[[i]]<-  logit(seq(min(tms[,i]),max(tms[,i]),length=100))  #aks
+            preds[[i]]<-seq(min(xx),max(xx),length=100) #aks
+            if(plot.it){
+                 oo <- order(xx)
+                 plot(xx[oo], logit(tms[oo, i]), type = "l", xlab = xlabs[i],
+                    ylab = ylabs[i], xlim = xlims, ylim = logit(ylims),
+                    main = main[i], col = col.term, lwd = lwd.term,
+                    ...)
+                if (se)
+                    se.lines(xx[oo], iy = oo, i = i)
+                }
+        }
+        if(plot.it){
+            if (partial.resid) {
+                if (!is.fac[i] && !is.null(smooth)) {
+                    smooth(xx, pres[, i], lty = lty.smth, cex = cex,
+                      pch = pch, col = col.res, col.smooth = col.smth,
+                      span = span.smth)
+                }
+                else points(xx, pres[, i], cex = cex, pch = pch,
+                    col = col.res)
+            }
+            if (rug) {
+                n <- length(xx)
+                lines(rep.int(jitter(xx), rep.int(3, n)), rep.int(ylims[1] +
+                    c(0, 0.05, NA) * diff(ylims), n))
+                if (partial.resid)
+                    lines(rep.int(xlims[1] + c(0, 0.05, NA) * diff(xlims),
+                      n), rep.int(pres[, i], rep.int(3, n)))
+            }
+        }
+    }
+    invisible(list(names=p.names,preds=preds,resp=response))
+}
+
+
+# Interpret command line argurments #
+# Make Function Call #
+ # Interpret command line argurments #
+# Make Function Call #
+make.p.tif=T
+make.binary.tif=T
+simp.method="AIC"
+opt.methods=2
+save.model=FALSE
+MESS=FALSE
+
+Args <- commandArgs(trailingOnly=FALSE)
+
+    for (i in 1:length(Args)){
+     if(Args[i]=="-f") ScriptPath<-Args[i+1]
+     }
+
+    print(Args)
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="c") csv <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="mpt") make.p.tif <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="mbt")  make.binary.tif <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="om")  opt.methods <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="savm")  save.model <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="sm")  simp.method <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="mes")  MESS <- argSplit[[1]][2]
+    }
+	print(csv)
+	print(output)
+	print(responseCol)
+
+ScriptPath<-dirname(ScriptPath)
+source(paste(ScriptPath,"LoadRequiredCode.r",sep="\\"))
+
+make.p.tif<-as.logical(make.p.tif)
+make.binary.tif<-as.logical(make.binary.tif)
+save.model<-make.p.tif | make.binary.tif
+opt.methods<-as.numeric(opt.methods)
+MESS<-as.logical(MESS)
+
+ fit.glm.fct(ma.name=csv,
+      tif.dir=NULL,output.dir=output,
+      response.col=responseCol,make.p.tif=make.p.tif,make.binary.tif=make.binary.tif,
+      simp.method=simp.method,debug.mode=F,responseCurveForm="pdf",script.name="glm.r",opt.methods=opt.methods,save.model=save.model,MESS=MESS)
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/FIT_MARS_pluggable.r b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_MARS_pluggable.r
new file mode 100644
index 0000000..914906f
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_MARS_pluggable.r
@@ -0,0 +1,1697 @@
+# A set of "pluggable" R functions for automated model fitting of glm models to presence/absence data #
+#
+# Modified 12-2-09 to:  remove categorical covariates from consideration if they only contain one level
+#                       ID factor variables based on "categorical" prefix and look for tifs in subdir
+#                       Give progress reports
+#                       write large output tif files in blocks to alleviate memory issues
+#                       various bug fixes
+#
+#
+# Modified 3-4-09 to use a list object for passing of arguements and data
+#
+
+
+# Libraries required to run this program #
+#   PresenceAbsence - for ROC plots
+#   XML - for XML i/o
+#   rgdal - for geotiff i/o
+#   sp - used by rdgal library
+#   raster for geotiff o
+options(error=NULL)
+
+fit.mars.fct <- function(ma.name,tif.dir=NULL,output.dir=NULL,response.col="^response.binary",make.p.tif=T,make.binary.tif=T,
+      mars.degree=1,mars.penalty=2,responseCurveForm=NULL,debug.mode=T,script.name="mars.r",opt.methods=2,save.model=TRUE,UnitTest=FALSE,MESS=FALSE){
+    # This function fits a stepwise GLM model to presence-absence data.
+    # written by Alan Swanson, 2008-2009
+    # # Maintained and edited by Marian Talbert September 2010-
+    # Arguements.
+    # ma.name: is the name of a .csv file with a model array.  full path must be included unless it is in the current
+    #  R working directory # THIS FILE CAN NOW INCLUDE AN OPTIONAL COLUMN OF SITE WEIGHTS WHICH MUST BE LABELED "site.weights"
+    # tif.dir: is the directory containing geotiffs for each covariate.  only required if geotiffs output of the 
+    #   response surface is requested #    # cov.list.name: is the name of a text file with the names of covariates to be included in models (one per line).
+    # output.dir: is the directory that output files will be stored in.  if not given, files will go to the current working directory. 
+    # response.col: column number of the model array containing a binary 0/1 response.  all other columns will be considered explanatory variables.
+    # make.p.tif: T if a geotiff of the response surface is desired.
+    # make.binary.tif: T if a geotiff of the response surface is desired.
+    # simp.method: model simplification method.  valid methods include: "AIC" and "BIC". NOT CURRENTLY FUNCTIONAL 
+    # debug.mode: if T, output is directed to the console during the run.  also, a pdf is generated which contains response curve plots and perspective plots
+    #    showing the effects of interactions deemed important.  if F, output is diverted to a text file and the console is kept clear 
+    #    except for final output of an xml file.  in either case, a set of standard output files are created in the output directory.
+    # 
+
+    # Value:
+    # returns nothing but generates a number of output files in the directory
+    # "output.dir" named above.  These output files consist of:
+    #
+    # glm_output.txt:  a text file with fairly detailed results of the final model.
+    # glm_output.xml:  an xml-formatted text file with results from the final model.
+    # glm_response_curves.xml:  an xml-formatted text file with response curves for
+    #   each covariate in the final model.
+    # glm_prob_map.tif:  a geotiff of the response surface
+    # glm_bin_map.tif:  a geotiff of the binary response surface.  threhold is based on the roc curve at the point where sensitivity=specificity.
+    # glm_log.txt:   a file containing text output diverted from the console when debug.mode=F
+    # glm_auc_plot.jpg:  a jpg file of a ROC plot.
+    # glm_response_curves.pdf:  an pdf file with response curves for
+    #   each covariate in the final model and perspective plots showing the effect of interactions deemed significant.
+    #   only produced when debug.mode=T
+    # #  seed=NULL                                 # sets a seed for the algorithm, any inegeger is acceptable
+    #  opt.methods=2                             # sets the method used for threshold optimization used in the
+    #                                            # the evaluation statistics module
+    #  save.model=FALSE                          # whether the model will be used to later produce tifs
+    # when debug.mode is true, these filenames will include a number in them so that they will not overwrite preexisting files. eg brt_1_output.txt.
+    #
+    times <- as.data.frame(matrix(NA,nrow=7,ncol=1,dimnames=list(c("start","read data","model fit",
+            "model summary","response curves","tif output","done"),c("time"))))
+    times[1,1] <- unclass(Sys.time())
+    t0 <- unclass(Sys.time())
+    #simp.method <- match.arg(simp.method)
+
+    out <- list(
+      input=list(ma.name=ma.name,
+                 tif.dir=tif.dir,
+                 output.dir=output.dir,
+                 response.col=response.col,
+                 make.p.tif=make.p.tif,
+                 make.binary.tif=make.binary.tif,
+                 site.weights=NULL,
+                 save.model=save.model,
+                 mars.degree=mars.degree,
+                 mars.penalty=mars.penalty,
+                 model.type="stepwise with pruning",
+                 model.source.file=script.name,
+                 model.fitting.subset=NULL, # not used.
+                 model.family="binomial",
+                 run.time=paste(c(format(Sys.time(),"%Y-%m-%d"),format(Sys.time(),"%H:%M:%S")),collapse="T"),
+                 sig.test="chi-squared anova p-value",
+                 MESS=MESS),
+      dat = list(missing.libs=NULL,
+                 output.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.ind=NULL,
+                 tif.names=NULL,
+                 bname=NULL,
+                 bad.factor.covs=NULL, # factorchange
+                 ma=list( status=c(exists=F,readable=F),
+                          dims=c(NA,NA),
+                          n.pres=c(all=NA,complete=NA,subset=NA),
+                          n.abs=c(all=NA,complete=NA,subset=NA),
+                          ratio=NA,
+                          resp.name=NULL,
+                          train.weights=NULL,
+                          test.weights=NULL,
+                          train.xy=NULL,
+                          test.xy=NULL,
+                          factor.levels=NA,
+                          used.covs=NULL,
+                          ma=NULL,
+                          ma.subset=NULL,
+                          ma.test=NULL)),
+      mods=list(final.mod=NULL,
+                r.curves=NULL,
+                tif.output=list(prob=NULL,bin=NULL),
+                auc.output=NULL,
+                interactions=NULL,  # not used #
+                summary=NULL),
+      time=list(strt=unclass(Sys.time()),end=NULL),
+      error.mssg=list(NULL),
+      ec=0    # error count #
+      )
+
+      # load libaries #
+      out <- check.libs(list("PresenceAbsence","rgdal","XML","sp","survival","mda","raster","tcltk2","foreign","ade4"),out)
+      
+      # exit program now if there are missing libraries #
+      if(!is.null(out$error.mssg[[1]])){
+          cat(saveXML(mars.to.xml(out),indent=T),'\n')
+          return()
+          }
+        
+    # check output dir #
+    out$dat$output.dir <- check.dir(output.dir)    
+    if(out$dat$output.dir$writable==F) {out$ec<-out$ec+1
+              out$error.mssg[[out$ec]] <- paste("ERROR: output directory",output.dir,"is not writable")
+              out$dat$output.dir$dname <- getwd()
+              }
+
+    # generate a filename for output #
+          if(debug.mode==T){
+            outfile <- paste(bname<-paste(out$dat$output.dir$dname,"/mars_",n<-1,sep=""),"_output.txt",sep="")
+            while(file.access(outfile)==0) outfile<-paste(bname<-paste(out$dat$output.dir$dname,"/mars_",n<-n+1,sep=""),"_output.txt",sep="")
+            capture.output(cat("temp"),file=outfile) # reserve the new basename #
+            } else bname<-paste(out$dat$output.dir$dname,"/mars",sep="")
+            out$dat$bname <- bname
+            
+    # sink console output to log file #
+    if(!debug.mode) {sink(logname <- paste(bname,"_log.txt",sep=""));on.exit(sink)} else logname<-NULL
+    options(warn=1)
+    
+    # check tif dir #
+        # check tif dir #
+    if(!is.null(tif.dir)){
+      out$dat$tif.dir <- check.dir(tif.dir)
+      if(out$dat$tif.dir$readable==F & (out$input$make.binary.tif | out$input$make.p.tif)) {
+                out$ec<-out$ec+1
+                out$error.mssg[[out$ec]] <- paste("ERROR: tif directory",tif.dir,"is not readable")
+                if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+              cat(saveXML(brt.to.xml(out),indent=T),'\n')
+              return()
+              }
+            }
+
+    
+    # find .tif files in tif dir #
+    if(out$dat$tif.dir$readable)  out$dat$tif.names <- list.files(out$dat$tif.dir$dname,pattern=".tif",recursive=T)
+
+    # check for model array #
+    out$input$ma.name <- check.dir(out$input$ma.name)$dname
+
+    if(UnitTest!=FALSE) options(warn=2)
+    out <- read.ma(out)
+    if(UnitTest==1) return(out)
+    
+    # exit program now if there are errors in the input data #
+    if(!is.null(out$error.mssg[[1]])){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          cat(saveXML(mars.to.xml(out),indent=T),'\n')
+          return()
+          }
+        
+    cat("\nbegin processing of model array:",out$input$ma.name,"\n")
+    cat("\nfile basename set to:",out$dat$bname,"\n")
+    assign("out",out,envir=.GlobalEnv)
+    if(!debug.mode) {sink();cat("Progress:20%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("20%\n")}  ### print time
+    ##############################################################################################################
+    #  Begin model fitting #
+    ##############################################################################################################
+
+    # Fit null GLM and run stepwise, then print results #
+    cat("\n","Fitting MARS model","\n")
+    flush.console()
+
+    fit <- mars.glm(data=out$dat$ma$ma, mars.x=c(2:ncol(out$dat$ma$ma)), mars.y=1, mars.degree=out$input$mars.degree, family=out$input$model.family,
+          site.weights=out$dat$ma$train.weights, penalty=out$input$mars.penalty)
+      
+    out$mods$final.mod <- fit
+
+  out$mods$final.mod$contributions$var<-names(out$dat$ma$ma)[-1]
+
+    assign("out",out,envir=.GlobalEnv)
+    t3 <- unclass(Sys.time())
+    fit_contribs <- try(mars.contribs(fit))
+    if(class(fit_contribs)=="try-error"){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          out$ec<-out$ec+1
+          out$error.mssg[[out$ec]]<- paste("Error summarizing MARS model:",fit_contribs)
+          cat(saveXML(mars.to.xml(out),indent=T),'\n')
+          return()
+          } 
+       
+    x<-fit_contribs$deviance.table
+    x <- x[x[,2]!=0,]
+    x <- x[order(x[,4]),]
+    row.names(x) <- x[,1]
+    x$df <- -1*x$df
+    x <- x[,-1]
+    
+     txt0 <- paste("\nMARS Model Results\n","\n","Data:\n",ma.name,"\n","\n\t n(pres)=",
+        out$dat$ma$n.pres[2],"\n\t n(abs)=",out$dat$ma$n.abs[2],"\n\t n covariates considered=",length(out$dat$ma$used.covs),
+        "\n",
+        "\n   total time for model fitting=",round((unclass(Sys.time())-t0)/60,2),"min\n",sep="")
+
+    capture.output(cat(txt0),file=paste(bname,"_output.txt",sep=""))
+    
+    cat("\n","Finished with MARS","\n")
+    cat("Summary of Model:","\n")
+    print(out$mods$summary <- x)
+    if(!is.null(out$dat$bad.factor.cols)){
+        cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n\n")
+        }
+    cat("\n","Storing output...","\n","\n")
+    #flush.console()
+    capture.output(cat("\n\nSummary of Model:\n"),file=paste(bname,"_output.txt",sep=""),append=TRUE)
+    capture.output(print(out$mods$summary),file=paste(bname,"_output.txt",sep=""),append=TRUE)
+    if(!is.null(out$dat$bad.factor.cols)){
+        capture.output(cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n"),
+            file=paste(bname,"_output.txt",sep=""),append=T)
+        }
+    
+    if(!debug.mode) {sink();cat("Progress:40%\n");flush.console();sink(logname,append=T)} else cat("40%\n")
+    
+    
+    ##############################################################################################################
+    #  Begin model output #
+    ##############################################################################################################
+           
+    # Store .jpg ROC plot #
+      auc.output <- make.auc.plot.jpg(out$dat$ma$ma,pred=mars.predict(fit,out$dat$ma$ma)$prediction[,1],
+      plotname=paste(bname,"_auc_plot.jpg",sep=""),modelname="MARS",opt.methods=opt.methods,
+            weight=out$dat$ma$train.weights,out=out)
+      out$mods$auc.output<-auc.output
+
+    if(!debug.mode) {sink();cat("Progress:70%\n");flush.console();sink(logname,append=T)} else cat("70%\n")
+    
+    # Response curves #
+    
+    if(is.null(responseCurveForm)){
+    responseCurveForm<-0}    
+    
+    if(debug.mode | responseCurveForm=="pdf"){
+        nvar <- nrow(out$mods$summary)
+        pcol <- min(ceiling(sqrt(nvar)),4)
+        prow <- min(ceiling(nvar/pcol),3)
+        r.curves <- try(mars.plot(fit,plot.layout=c(prow,pcol),file.name=paste(bname,"_response_curves.pdf",sep="")))
+
+        } else r.curves<-try(mars.plot(fit,plot.it=F))
+        
+        if(class(r.curves)!="try-error") {
+            out$mods$r.curves <- r.curves
+                } else {
+            out$ec<-out$ec+1
+            out$error.mssg[[out$ec]] <- paste("ERROR: problem fitting response curves",r.curves)
+            }
+
+        pred.fct<-pred.mars
+
+     assign("out",out,envir=.GlobalEnv)
+
+ save.image(paste(output.dir,"modelWorkspace",sep="\\"))
+    t4 <- unclass(Sys.time())
+    cat("\nfinished with final model summarization, t=",round(t4-t3,2),"sec\n");flush.console()
+    if(!debug.mode) {sink();cat("Progress:80%\n");flush.console();sink(logname,append=T)} else cat("70%\n")   
+    # Make .tif of predictions #
+
+    if(out$input$make.p.tif==T | out$input$make.binary.tif==T){
+        if((n.var <- nrow(out$mods$summary))<1){
+            mssg <- "Error producing geotiff output:  null model selected by stepwise procedure - pointless to make maps"
+            class(mssg)<-"try-error"
+            } else {
+            cat("\nproducing prediction maps...","\n","\n");flush.console()
+            mssg <- try(proc.tiff(model=out$mods$final.mod,vnames=names(out$dat$ma$ma)[-1],
+                tif.dir=out$dat$tif.dir$dname,filenames=out$dat$tif.ind,pred.fct=pred.mars,factor.levels=out$dat$ma$factor.levels,make.binary.tif=make.binary.tif,
+                thresh=out$mods$auc.output$thresh,make.p.tif=make.p.tif,outfile.p=paste(out$dat$bname,"_prob_map.tif",sep=""),
+                outfile.bin=paste(out$dat$bname,"_bin_map.tif",sep=""),tsize=50.0,NAval=-3000,
+                fnames=out$dat$tif.names,logname=logname,out=out))     #"brt.prob.map.tif"
+            }
+
+        if(class(mssg)=="try-error"){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          out$ec<-out$ec+1
+          out$error.mssg[[out$ec]] <- paste("Error producing prediction maps:",mssg)
+          cat(saveXML(mars.to.xml(out),indent=T),'\n')
+          return()
+        }  else {
+            if(make.p.tif) out$mods$tif.output$prob <- paste(out$dat$bname,"_prob_map.tif",sep="")
+            if(make.binary.tif) out$mods$tif.output$bin <- paste(out$dat$bname,"_bin_map.tif",sep="")
+            t5 <- unclass(Sys.time())
+            cat("\nfinished with prediction maps, t=",round(t5-t4,2),"sec\n");flush.console()
+          }
+        }
+    if(!debug.mode) {sink();cat("Progress:90%\n");flush.console();sink(logname,append=T)} else cat("90%\n")
+
+     # Evaluation Statistics on Test Data#
+
+    if(!is.null(out$dat$ma$ma.test)) Eval.Stat<-EvaluationStats(out,thresh=auc.output$thresh,train=out$dat$ma$ma,
+          train.pred=mars.predict(fit,out$dat$ma$ma)$prediction[,1],opt.methods)
+
+
+    
+    # Write summaries to xml #
+    if(debug.mode) assign("out",out,envir=.GlobalEnv)
+    doc <- mars.to.xml(out)
+    
+    cat(paste("\ntotal time=",round((unclass(Sys.time())-t0)/60,2),"min\n\n\n",sep=""))
+    if(!debug.mode) {
+        sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))
+        cat("Progress:100%\n");flush.console()
+        #cat(saveXML(doc,indent=T),'\n')
+        } else #unlink(outfile)
+    capture.output(cat(saveXML(doc,indent=T)),file=paste(out$dat$bname,"_output.xml",sep=""))
+    if(debug.mode) assign("fit",out$mods$final.mod,envir=.GlobalEnv)
+    invisible(out)
+    }
+################################################################################
+###########          End fit.mars.fct       ####################################
+
+pred.mars <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictionss.
+    y <- rep(NA,nrow(x))
+    y[complete.cases(x)] <- as.vector(mars.predict(model,x[complete.cases(x),])$prediction[,1])
+
+#if(sum(is.na(x))/dim(x)[2]!=sum(is.na(y)))
+#h<-is.na(x)
+#h<-apply(h,1,sum)
+#h=h/35
+#f<-is.na(y)
+#which((h-f)!=0,arr.ind=TRUE)
+#b<-cbind(x[which((h-f)!=0,arr.ind=TRUE),],y[which((h-f)!=0,arr.ind=TRUE)])
+
+#which(is.na(y)  
+    # encode missing values as -1.
+    y[is.na(y)]<- NaN
+    
+    # return predictions.
+    return(y)
+    }
+
+logit <- function(x) 1/(1+exp(-x))
+
+file_path_as_absolute <- function (x){
+    if (!file.exists(epath <- path.expand(x))) 
+        stop(gettextf("file '%s' does not exist", x), domain = NA)
+    cwd <- getwd()
+    on.exit(setwd(cwd))
+    if (file_test("-d", epath)) {
+        setwd(epath)
+        getwd()
+    }
+    else {
+        setwd(dirname(epath))
+        file.path(getwd(), basename(epath))
+    }
+}
+#file_path_as_absolute(".")
+
+mars.to.xml <- function(out){
+    require(XML)
+    schema.http="http://www.w3.org/2001/XMLSchema-instance"
+    schema.fname="file:/Users/isfs2/Desktop/Source/2008-04-09/src/gov/nasa/gsfc/quickmap/ModelBuilder/modelRun_output_v2.xsd"
+    xml.out <- newXMLDoc()
+    mr <- newXMLNode("modelRunOutput",doc=xml.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))#,parent=xml.out
+    sm <- newXMLNode("singleModel",parent=mr)
+    bg <- newXMLNode("background",parent=sm)
+        newXMLNode("mdsName",out$input$ma.name,parent=bg)
+        newXMLNode("runDate",out$input$run.time,parent=bg)
+        lc <- newXMLNode("layersConsidered",parent=bg)#, parent = xml.out)
+        kids <- lapply(paste(out$dat$tif.dir$dname,"/",out$dat$tif.names,sep=""),function(x) newXMLNode("layer", x))
+        addChildren(lc, kids)
+    mo <- newXMLNode("modelOutput",parent=sm)
+        newXMLNode("modelType",out$input$model.type,parent=mo)
+        newXMLNode("modelSourceFile",out$input$model.source.file,parent=mo)
+        newXMLNode("devianceExplained",out$mods$auc.output$pct_dev_exp,parent=mo,attrs=list(type="percentage"))
+        newXMLNode("nativeOutput",paste(out$dat$bname,"_output.txt",sep=""),parent=mo)
+        newXMLNode("binaryOutputFile",out$mods$tif.output[[2]],parent=mo)
+        newXMLNode("probOutputFile",out$mods$tif.output[[1]],parent=mo)
+        newXMLNode("auc",out$mods$auc.output$auc,parent=mo)
+        newXMLNode("rocGraphic",out$mods$auc.output$plotname,parent=mo)
+        newXMLNode("rocThresh",out$mods$auc.output$thresh,parent=mo)
+        newXMLNode("modelDeviance",out$mods$auc.output$dev_fit,parent=mo)
+        newXMLNode("nullDeviance",out$mods$auc.output$null_dev,parent=mo)
+        if(is.null(out$mods$r.curves)) rc.name <- NULL else rc.name <- paste(out$dat$bname,"_response_curves.xml",sep="")
+        newXMLNode("responsePlotsFile",rc.name,parent=mo)
+        newXMLNode("significanceDescription",out$input$sig.test,parent=mo)
+        mfp <- newXMLNode("modelFitParmas",parent=mo)
+            newXMLNode("marsDegree",out$input$mars.degree,parent=mfp)
+            newXMLNode("marsPenalty",out$input$mars.penalty,parent=mfp)
+        
+        sv <- newXMLNode("significantVariables",parent=mo)
+        if(!is.null(out$mods$summary)) {
+            t.table <- out$mods$summary#$coefficients
+            names(t.table)[3]<-"significanceMeasurement"
+            for(i in 1:nrow(t.table)){
+                x <- newXMLNode("sigVar",parent=sv)
+                newXMLNode(name="name", row.names(t.table)[i],parent=x)
+                kids <- lapply(1:ncol(t.table),function(j) newXMLNode(name=names(t.table)[j], t.table[i,j]))
+                addChildren(x, kids)
+                }
+            }
+        
+    if(!is.null(out$mods$r.curves)){
+        r.curves <-  out$mods$r.curves
+        factor.levels <- out$dat$ma$factor.levels
+        rc.out <- newXMLDoc()
+        root <- newXMLNode("responseCurves",doc=rc.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))
+        for(i in 1:length(r.curves$names)){
+            if(!is.na(f.index<-match(r.curves$names[i],names(factor.levels)))){
+                  vartype <- "factor"} else vartype="continuous"
+            x <- newXMLNode("responseCurve",attrs=list(covariate=r.curves$names[i],type=vartype),parent=root)
+            kids <- lapply(1:length(r.curves$preds[[i]]),function(j){
+                    newXMLNode(name="responsePt",parent=x,.children=list(
+                        newXMLNode(name="explanatory",as.character(r.curves$preds[[i]])[j]),
+                        newXMLNode(name="response",r.curves$resp[[i]][j])))})
+            addChildren(x, kids)
+            }
+        saveXML(rc.out,rc.name,indent=T)
+        
+        } 
+    if(!is.null(out$error.mssg[[1]])) {
+        kids <- lapply(out$error.mssg,function(j) newXMLNode(name="error",j))
+        addChildren(mo,kids)
+        }
+    return(xml.out)
+    }
+
+
+get.cov.names <- function(model){
+    return(attr(terms(formula(model)),"term.labels"))
+    }
+
+
+check.dir <- function(dname){
+    if(is.null(dname)) dname <- getwd()
+    dname <- gsub("[\\]","/",dname)
+    end.char <- substr(dname,nchar(dname),nchar(dname))
+    if(end.char == "/") dname <- substr(dname,1,nchar(dname)-1)
+    exist <- suppressWarnings(as.numeric(file.access(dname,mode=0))==0) # -1 if bad, 0 if ok #
+    if(exist) dname <- file_path_as_absolute(dname)
+    readable <- suppressWarnings(as.numeric(file.access(dname,mode=4))==0) # -1 if bad, 0 if ok #
+    writable <- suppressWarnings(as.numeric(file.access(dname,mode=2))==0) # -1 if bad, 0 if ok #
+    return(list(dname=dname,exist=exist,readable=readable,writable=writable))
+    }
+
+
+get.image.info <- function(image.names){
+    # this function creates a data.frame with summary image info for a set of images #
+    require(rgdal)
+    n.images <- length(image.names)
+
+    full.names <- image.names
+    out <- data.frame(image=full.names,available=rep(F,n.images),size=rep(NA,n.images),
+        type=factor(rep("unk",n.images),levels=c("asc","envi","tif","unk")))
+    out$type[grep(".tif",image.names)]<-"tif"
+    out$type[grep(".asc",image.names)]<-"asc"
+    for(i in 1:n.images){
+        if(out$type[i]=="tif"){
+            x <-try(GDAL.open(full.names[1],read.only=T))
+            suppressMessages(try(GDAL.close(x)))
+            if(class(x)!="try-error") out$available[i]<-T
+            x<-try(file.info(full.names[i]))
+        } else {
+            x<-try(file.info(full.names[i]))
+            if(!is.na(x$size)) out$available[i]<-T
+        }
+        if(out$available[i]==T){
+            out$size[i]<-x$size
+            if(out$type[i]=="unk"){
+                # if extension not known, look for envi .hdr file in same directory #
+                if(file.access(paste(file_path_sans_ext(full.names[i]),".hdr",sep=""))==0) 
+                    out$type[i]<-"envi"
+                }
+        }
+    }
+    return(out)
+}
+
+###########################################################################################
+#  The following functions are from Elith et al. 
+###########################################################################################
+
+"calc.deviance" <-
+function(obs.values, fitted.values, weights = rep(1,length(obs.values)), family=family, calc.mean = TRUE)
+{
+# j. leathwick/j. elith
+#
+# version 2.1 - 5th Sept 2005
+#
+# function to calculate deviance given two vectors of raw and fitted values
+# requires a family argument which is set to binomial by default
+#
+#
+
+if (length(obs.values) != length(fitted.values)) 
+   stop("observations and predictions must be of equal length")
+
+y_i <- obs.values
+
+u_i <- fitted.values
+ 
+if (family == "binomial" | family == "bernoulli") {
+ 
+   deviance.contribs <- (y_i * log(u_i)) + ((1-y_i) * log(1 - u_i))
+   deviance <- -2 * sum(deviance.contribs * weights)
+
+}
+
+if (family == "poisson" | family == "Poisson") {
+
+    deviance.contribs <- ifelse(y_i == 0, 0, (y_i * log(y_i/u_i))) - (y_i - u_i)
+    deviance <- 2 * sum(deviance.contribs * weights)
+
+}
+
+if (family == "laplace") {
+    deviance <- sum(abs(y_i - u_i))
+    }
+
+if (family == "gaussian") {
+    deviance <- sum((y_i - u_i) * (y_i - u_i))
+    }
+    
+
+
+if (calc.mean) deviance <- deviance/length(obs.values)
+
+return(deviance)
+
+}
+
+"calibration" <-
+function(obs, preds, family = family)
+{
+#
+# j elith/j leathwick 17th March 2005
+# calculates calibration statistics for either binomial or count data
+# but the family argument must be specified for the latter 
+# a conditional test for the latter will catch most failures to specify
+# the family
+#
+
+if (family == "bernoulli") family <- "binomial"
+pred.range <- max(preds) - min(preds)
+if(pred.range > 1.2 & family == "binomial") {
+print(paste("range of response variable is ", round(pred.range, 2)), sep = "", quote = F)
+print("check family specification", quote = F)
+return()
+}
+if(family == "binomial") {
+pred <- preds + 1e-005
+pred[pred >= 1] <- 0.99999
+mod <- glm(obs ~ log((pred)/(1 - (pred))), family = binomial)
+lp <- log((pred)/(1 - (pred)))
+a0b1 <- glm(obs ~ offset(lp) - 1, family = binomial)
+miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+ab1 <- glm(obs ~ offset(lp), family = binomial)
+miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+}
+if(family == "poisson") {
+mod <- glm(obs ~ log(preds), family = poisson)
+lp <- log(preds)
+a0b1 <- glm(obs ~ offset(lp) - 1, family = poisson)
+miller1 <- 1 - pchisq(a0b1$deviance - mod$deviance, 2)
+ab1 <- glm(obs ~ offset(lp), family = poisson)
+miller2 <- 1 - pchisq(a0b1$deviance - ab1$deviance, 1)
+miller3 <- 1 - pchisq(ab1$deviance - mod$deviance, 1)
+}
+calibration.result <- c(mod$coef, miller1, miller2, miller3)
+names(calibration.result) <- c("intercept", "slope", "testa0b1", "testa0|b1", "testb1|a")
+return(calibration.result)
+}
+
+"mars.contribs" <-
+function (mars.glm.object,sp.no = 1, verbose = TRUE) 
+{
+
+# j leathwick/j elith August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# takes a mars/glm model and uses the updated mars export table
+# stored as the second list item from mars.binomial
+# assessing the contribution of the fitted functions, 
+# amalgamating terms for variables as required
+#
+# amended 29/9/04 to pass original mars model details
+# and to return f-statistics
+#
+# amended 7th January to accommodate any glm model family
+#
+# modified 050609 by aks to output a numeric deviance table #
+
+  mars.detail <- mars.glm.object$mars.call
+  pred.names <- mars.detail$predictor.base.names #get the names from the original data
+  n.preds <- length(pred.names)
+
+  spp.names <- mars.detail$y.names
+  family <- mars.detail$family
+
+  m.table <- mars.glm.object$mars.table[-1,]
+  m.table$names1 <- as.character(m.table$names1)   #convert from a factor
+
+  x.data <- as.data.frame(eval(mars.glm.object$basis.functions))
+  y.data <- as.data.frame(eval(mars.glm.object$y.values))
+
+  assign("x.data", x.data, pos = 1)
+  assign("y.data", y.data, pos = 1)
+  assign("sp.no", sp.no, pos = 1)
+
+  glm.model <- glm(y.data[,sp.no] ~ .,data = x.data,family = family)
+
+  print(paste("performing backwards drops for mars/glm model for",
+       spp.names[sp.no]),quote=F)
+
+  n.bfs <- length(m.table[,1])
+ 
+  delta.deviance <- rep(0,n.preds)
+  df <- rep(0,n.preds)
+  signif <- rep(0,n.preds)
+
+  for (i in 1:n.preds) {   #start at two because first line is the constant
+
+    # look for variable names in the table matching those in the var list
+
+    var.nos <- grep(as.character(pred.names[i]),m.table$names1)
+
+    #drop.list stores numbers of basis functions to be dropped
+    if (length(var.nos) > 0) {
+      drop.list <- 0 - var.nos
+      x.data.new <- x.data[,drop.list]
+      assign("x.data.new",x.data.new,pos=1)
+
+      if (verbose) {
+ 	  print(paste("Dropping ",pred.names[i],"...",sep=""),
+	             quote=FALSE)
+      }
+      x.data.new<-as.data.frame(x.data.new)
+      if(dim(x.data.new)[2]==0){
+           new.model <- glm(y.data[,sp.no] ~ 1, family = family)
+           }else new.model <- glm(y.data[,sp.no] ~ ., data=x.data.new, family = family)
+           
+      comparison <- anova(glm.model,new.model,test="Chisq")
+
+      df[i] <- comparison[2,3]
+      delta.deviance[i] <- zapsmall(comparison[2,4],4)
+      signif[i] <- zapsmall(comparison[2,5],6)
+    }
+    
+  }
+
+  rm(x.data,y.data,sp.no,pos=1)  # tidy up temporary files    
+
+  #deviance.table <- as.data.frame(cbind(pred.names,delta.deviance,df,signif))
+  #names(deviance.table) <- c("variable","delta_dev","deg. free.","p-value")
+  deviance.table <- data.frame(variable=pred.names,delta_dev=delta.deviance,df=df,p_value=signif)#aks
+  return(list(mars.call=mars.detail,deviance.table=deviance.table))
+}
+
+"mars.cv" <-
+function (mars.glm.object, nk = 10, sp.no = 1, prev.stratify = F) 
+{
+#
+# j. leathwick/j. elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# function to perform k-fold cross validation 
+# with full model perturbation for each subset
+#
+# requires mda library from Cran
+# requires functions mw and calibration
+#
+# takes a mars/glm object produced by mars.glm
+# and first assesses the full model, and then 
+# randomly subsets the dataset into nk folds and drops 
+# each subset in turn, fitting on remaining data 
+# and predicting for withheld data
+#
+# caters for both single species and community models via the argument sp.no
+# for the first, sp.no can be left on its default of 1
+# for community models, sp.no can be varied from 1 to n.spp
+#
+# modified 29/9/04 to 
+#   1. return mars analysis details for audit trail
+#   2. calculate roc and calibration on subsets as well as full data
+#      returning the mean and se of the ROC scores 
+#      and the mean calibration statistics
+#
+# modified 8/10/04 to add prevalence stratification
+# modified 7th January to test for binomial family and return if not
+# 
+# updated 15th March to cater for both binomial and poisson families
+#
+# updated 16th June 2005 to calculate residual deviance
+#
+
+  data <- mars.glm.object$mars.call$dataframe    #get the dataframe name
+  dataframe.name <- deparse(substitute(data))   
+    
+  data <- as.data.frame(eval(parse(text=data)))   #and now the data
+  n.cases <- nrow(data)
+
+  mars.call <- mars.glm.object$mars.call          #and the mars call details
+  mars.x <- mars.call$mars.x    
+  mars.y <- mars.call$mars.y
+  mars.degree <- mars.call$degree
+  mars.penalty <- mars.call$penalty
+  family <- mars.call$family
+  site.weights <- eval(mars.glm.object$weights$site.weights)
+
+  n.spp <- length(mars.y)
+
+  if (sp.no > n.spp) {
+    print(paste("the value specified for sp.no of",sp.no),quote=F)
+    print(paste("exceeds the total number of species, which is ",n.spp),quote=F)
+    return()
+  }
+  
+  xdat <- as.data.frame(data[,mars.x])
+  xdat <- mars.new.dataframe(xdat)[[1]]
+  ydat <- mars.glm.object$y.values[,sp.no]
+  target.sp <- names(data)[mars.y[sp.no]]
+
+  if (prev.stratify) {
+    presence.mask <- ydat == 1
+    absence.mask <- ydat == 0
+    n.pres <- sum(presence.mask)
+    n.abs <- sum(absence.mask)
+  }
+
+  print(paste("Calculating ROC and calibration from full model for",target.sp),quote=F)
+
+  u_i <- mars.glm.object$fitted.values[,sp.no]
+  y_i <- ydat
+
+  if (family == "binomial") {
+    full.resid.deviance <- calc.deviance(y_i,u_i, weights = site.weights, family="binomial") 
+    full.test <- roc(y_i, u_i)
+    full.calib <- calibration(y_i, u_i)
+  }
+
+  if (family=="poisson") {
+    full.resid.deviance <- calc.deviance(y_i,u_i, weights = site.weights, family="poisson")
+    full.test <- cor(y_i, u_i) 
+    full.calib <- calibration(y_i, u_i, family = "poisson")
+  }
+
+# set up for results storage
+  
+  subset.test <- rep(0,nk)
+  subset.calib <- as.data.frame(matrix(0,ncol=5,nrow=nk))
+  names(subset.calib) <- c("intercept","slope","test1","test2","test3")
+  subset.resid.deviance <- rep(0,nk)
+
+# now setup for withholding random subsets
+    
+  pred.values <- rep(0, n.cases)
+  fitted.values <- rep(0, n.cases)
+
+  if (prev.stratify) {
+
+    selector <- rep(0,n.cases)
+
+#create a vector of randomised numbers and feed into presences
+
+    temp <- rep(seq(1, nk, by = 1), length = n.pres)
+    temp <- temp[order(runif(n.pres, 1, 100))]
+    selector[presence.mask] <- temp
+
+# and then do the same for absences
+
+    temp <- rep(seq(1, nk, by = 1), length = n.abs)
+    temp <- temp[order(runif(n.abs, 1, 100))]
+    selector[absence.mask] <- temp
+
+  }
+  else {  #otherwise make them random with respect to presence/absence
+
+    selector <- rep(seq(1, nk, by = 1), length = n.cases)
+    selector <- selector[order(runif(n.cases, 1, 100))]
+  }
+ 
+  print("", quote = FALSE)
+  print("Creating predictions for subsets...", quote = F)
+
+  for (i in 1:nk) {
+    cat(i," ")
+    model.mask <- selector != i  #used to fit model on majority of data
+    pred.mask <- selector == i   #used to identify the with-held subset
+    assign("species.subset", ydat[model.mask], pos = 1)
+    assign("predictor.subset", xdat[model.mask, ], pos = 1)
+
+    # fit new mars model
+
+    mars.object <- mars(y = species.subset, x = predictor.subset, 
+      degree = mars.degree, penalty = mars.penalty)
+
+    # and extract basis functions
+
+    n.bfs <- length(mars.object$selected.terms)
+    bf.data <- as.data.frame(mars.object$x)
+    names(bf.data) <- paste("bf",1:n.bfs,sep="")
+    assign("bf.data", bf.data, pos=1)
+
+    # then fit a binomial model to them
+
+    mars.binomial <- glm(species.subset ~ .,data=bf.data[,-1], family= family, maxit = 100)
+
+    pred.basis.functions <- as.data.frame(mda:::model.matrix.mars(mars.object, 
+      xdat[pred.mask, ]))
+
+    #now name the bfs to match the approach used in mars.binomial
+
+    names(pred.basis.functions) <- paste("bf",1:n.bfs,sep="")
+
+    # and form predictions for them and evaluate performance
+
+    fitted.values[pred.mask] <- predict(mars.binomial, 
+      pred.basis.functions, type = "response")
+
+    y_i <- ydat[pred.mask]
+    u_i <- fitted.values[pred.mask]  
+    weights.subset <- site.weights[pred.mask]
+
+    if (family == "binomial") {
+      subset.resid.deviance[i] <- calc.deviance(y_i,u_i,weights = weights.subset, family="binomial") 
+      subset.test[i] <- roc(y_i,u_i)
+      subset.calib[i,] <- calibration(y_i, u_i)
+    }
+
+    if (family=="poisson"){
+      subset.resid.deviance[i] <- calc.deviance(y_i,u_i,weights = weights.subset, family="poisson") 
+      subset.test[i] <- cor(y_i, u_i) 
+      subset.calib[i,] <- calibration(y_i, u_i, family = family)
+    }
+  }
+ 
+  cat("","\n")
+
+# tidy up temporary files
+
+  rm(species.subset,predictor.subset,bf.data,pos=1) 
+
+# and assemble results for return
+
+#  mars.detail <- list(dataframe = dataframe.name,
+#    x = mars.x, x.names = names(xdat), 
+#    y = mars.y, y.names = names(data)[mars.y], 
+#    target.sp = target.sp, degree=mars.degree, penalty = mars.penalty, family = family)
+
+  y_i <- ydat
+  u_i <- fitted.values
+
+  if (family=="binomial") {
+    cv.resid.deviance <- calc.deviance(y_i,u_i,weights = site.weights, family="binomial") 
+    cv.test <- roc(y_i, u_i)
+    cv.calib <- calibration(y_i, u_i)
+  }
+
+  if (family=="poisson"){
+    cv.resid.deviance <- calc.deviance(y_i,u_i,weights = site.weights, family="poisson") 
+    cv.test <- cor(y_i, u_i) 
+    cv.calib <- calibration(y_i, u_i, family = "poisson")
+  }
+
+  subset.test.mean <- mean(subset.test)
+  subset.test.se <- sqrt(var(subset.test))/sqrt(nk)
+
+  subset.test <- list(test.scores = subset.test, subset.test.mean = subset.test.mean, 
+    subset.test.se = subset.test.se)
+
+  subset.calib.mean <- apply(subset.calib[,c(1:2)],2,mean)
+  names(subset.calib.mean) <- names(subset.calib)[c(1:2)] #mean only of parameters
+
+  subset.calib <- list(subset.calib = subset.calib, 
+    subset.calib.mean = subset.calib.mean)
+    
+  subset.deviance.mean <- mean(subset.resid.deviance)
+  subset.deviance.se <- sqrt(var(subset.resid.deviance))/sqrt(nk)
+
+  subset.deviance <- list(subset.deviances = subset.resid.deviance, subset.deviance.mean = subset.deviance.mean,
+    subset.deviance.se = subset.deviance.se)
+
+  return(list(mars.call = mars.call, full.resid.deviance = full.resid.deviance,
+    full.test = full.test, full.calib = full.calib, pooled.deviance = cv.resid.deviance, pooled.test = cv.test, 
+    pooled.calib = cv.calib,subset.deviance = subset.deviance, subset.test = subset.test, subset.calib = subset.calib))
+}
+
+"mars.export" <-
+function (object,lineage) 
+{
+#
+# j leathwick/j elith August 2006
+#
+# takes a mars model fitted using library mda
+# and extracts the basis functions and their 
+# coefficients, returning them as a table
+# caters for models with degree up to 2
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+
+  which <- object$selected.terms
+  nterms <- length(which)
+  nspp <- ncol(eval(object$call$y))
+  dir <- object$factor
+  cut <- object$cuts
+  var.names <- dimnames(object$factor)[[2]]
+  p <- length(var.names)
+  coefs <- as.data.frame(object$coefficients)
+  names(coefs) <- names(eval(object$call$y))
+
+# setup storage for results
+
+  names1 <- rep("null", length = nterms)
+  types1 <- rep("null", length = nterms)
+  levels1 <- rep("null", length = nterms)
+  signs1 <- rep(0, length = nterms)
+  cuts1 <- rep(0, length = nterms)
+
+  names2 <- rep("null", length = nterms)
+  types2 <- rep("null", length = nterms)
+  levels2 <- rep("null", length = nterms)
+  signs2 <- rep(0, length = nterms)
+  cuts2 <- rep(0, length = nterms)
+  names1[1] <- "constant"
+  signs1[1] <- 1
+
+# now cycle through the terms
+if(nterms>1){
+  for (i in seq(2, nterms)) {
+    j <- which[i]
+      term.count = 1
+      for (k in 1:p) {
+        if (dir[j, k] != 0) {
+          if (term.count == 1) {
+            n <- match(var.names[k],lineage$full.name)
+            names1[i] <- lineage$base.name[n] #var.names[k]
+            types1[i] <- lineage$type[n]
+            levels1[i] <- lineage$level[n]
+            signs1[i] <- dir[j, k]
+            cuts1[i] <- cut[j, k]
+            term.count <- term.count + 1
+          }
+          else {
+            names2[i] <- var.names[k]
+            n <- match(var.names[k],lineage$full.name)
+            names2[i] <- lineage$base.name[n] #var.names[k]
+            types2[i] <- lineage$type[n]
+            levels2[i] <- lineage$level[n]
+            signs2[i] <- dir[j, k]
+            cuts2[i] <- cut[j, k]
+          }
+        }
+      }
+    }
+    }
+  mars.export.table <- data.frame(names1, types1, levels1, signs1, cuts1, 
+       names2, types2, levels2, signs2, cuts2, coefs)
+
+  return(mars.export.table)
+}
+
+"mars.glm" <-
+function (data,                         # the input data frame
+  mars.x,                               # column numbers of the predictors
+  mars.y,                               # column number(s) of the response variable(s)
+  mars.degree = 1,                      # level of interactions - 1 = zero, 2 = 1st order, etc
+  site.weights = rep(1, nrow(data)),    # one weight per site
+  spp.weights = rep(1,length(mars.y)),  # one wieght per species
+  penalty = 2,                          # the default penaly for a mars model
+  family =family)                  # the family for the glm model
+{
+#
+# j leathwick, j elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# calculates a mars/glm object in which basis functions are calculated
+# using an initial mars model with single or multiple responses 
+# data for individual species are then fitted as glms using the 
+# common set of mars basis functions with results returned as a list
+#
+# takes as input a dataset and args selecting x and y variables, and degree of interaction
+# along with site and species weights, the CV penalty, and the glm family argument
+# the latter would normally be one of "binomial" or "poisson" - "gaussian" could be used
+# but in this case the model shouldn't differ from that fitted using mars on its own
+#
+# requires mda and leathwick/elith's mars.export
+#
+# modified 3/11/04 to store information on glm phase convergence
+# and with number of iterations raised to 100 to encourage convergence for low prevalence species
+# modified 4/11/04 to accommodate observation weights in both mars and glm steps
+# modified 12/04 to accommodate non-binomial families
+# modified 11/05 to accommodate factor variables
+# these are done as 0/1 dummy variables in a new dataframe
+# created using mars.new.dataframe
+
+  require(mda)
+
+  n.spp <- length(mars.y)
+
+# setup input data and assign to position one
+
+  dataframe.name <- deparse(substitute(data))  # get the dataframe name
+
+  xdat <- as.data.frame(eval(data[, mars.x]))                 #form the temporary datasets
+  predictor.base.names <- names(xdat)
+
+# create the new dataframe with dummy vars for factor predictors
+  xdat <- mars.new.dataframe(xdat)
+  lineage <- xdat[[2]]   # tracks which variables have had dummy's created
+  xdat <- xdat[[1]]
+  predictor.dummy.names <- names(xdat)
+
+  ydat <- as.data.frame(eval(data[, mars.y]))
+  names(ydat) <- names(data)[mars.y]
+
+  assign("xdat", xdat, pos = 1)               #and assign them for later use
+  assign("ydat", ydat, pos = 1)
+
+# create storage space for glm model results
+
+  n.cases <- nrow(xdat)
+
+  fitted.values <- matrix(0,ncol = n.spp, nrow = n.cases)
+  model.residuals <- matrix(0,ncol = n.spp, nrow = n.cases)
+  null.deviances <- rep(0,n.spp)
+  residual.deviances <- rep(0,n.spp)
+  null.dfs <- rep(0,n.spp)
+  residual.dfs <- rep(0,n.spp)
+  converged <- rep(TRUE,n.spp)
+
+# fit the mars model and extract the basis functions
+
+  cat("fitting initial mars model for",n.spp,"responses","\n")
+  cat("followed by a glm model with a family of",family,"\n")
+
+  mars.object <- mars(x = xdat, y = ydat, degree = mars.degree, w = site.weights, 
+       wp = spp.weights, penalty = penalty)
+  if(length(mars.object$coefficients)==1) stop("MARS has fit the null model (intercept only) \n new predictors are required")
+  bf.data <- as.data.frame(eval(mars.object$x))
+  n.bfs <- ncol(bf.data)
+  bf.names <- paste("bf", 1:n.bfs, sep = "")
+  names(bf.data) <- bf.names
+  bf.data <- as.data.frame(bf.data[,-1])
+
+  m.table <- as.data.frame(mars.export(mars.object,lineage))
+  names(m.table)[(10 + 1):(10 + n.spp)] <- names(ydat)
+
+  p.values <- matrix(0, ncol = n.spp, nrow = n.bfs)
+  rownames(p.values) <- paste("bf", 1:n.bfs, sep = "")
+  colnames(p.values) <- names(ydat)
+
+# now cycle through the species fitting glm models 
+
+  cat("fitting glms for individual responses","\n")
+
+  for (i in 1:n.spp) {
+
+    cat(names(ydat)[i],"\n")
+    model.glm <- glm(ydat[, i] ~ ., data = bf.data, weights = site.weights, 
+  	  family = family, maxit = 100)
+
+# update the coefficients and other results
+
+    # then match names and insert as appropriate
+    m.table[ , i + 10] <- 0   					# set all values to zero
+    m.table[ , i + 10] <- model.glm$coefficients  	      # update all the constant
+    sum.table <- summary(model.glm)$coefficients
+    p.values[,i] <- sum.table[,4]
+    fitted.values[,i] <- model.glm$fitted
+    model.residuals[,i] <- resid(model.glm)
+    null.deviances[i] <- model.glm$null.deviance
+    residual.deviances[i] <- model.glm$deviance
+    null.dfs[i] <- model.glm$df.null
+    residual.dfs[i] <- model.glm$df.residual
+    converged[i] <- model.glm$converged
+  }
+
+# now assemble data to be returned
+
+  fitted.values <- as.data.frame(fitted.values)
+  names(fitted.values) <- names(ydat)
+
+  model.residuals <- as.data.frame(model.residuals)
+  names(model.residuals) <- names(ydat)
+
+  deviances <- data.frame(names(ydat),null.deviances,null.dfs,residual.deviances,residual.dfs,converged)
+  names(deviances) <- c("species","null.dev","null.df","resid.dev","resid.df","converged")
+
+  weights = list(site.weights = site.weights, spp.weights = spp.weights)
+
+  mars.detail <- list(dataframe = dataframe.name, mars.x = mars.x, 
+    predictor.base.names = predictor.base.names, predictor.dummy.names = predictor.dummy.names, 
+    mars.y = mars.y, y.names = names(ydat), degree=mars.degree, penalty = penalty, 
+    family = family)
+
+  rm(xdat,ydat,pos=1)           #finally, clean up the temporary dataframes
+
+  return(list(mars.table = m.table, basis.functions = bf.data, y.values = ydat,
+    fitted.values = fitted.values, residuals = model.residuals, weights = weights, deviances = deviances,
+    p.values = p.values, mars.call = mars.detail,mars.object=mars.object))
+}
+
+"mars.new.dataframe" <-
+function (input.data) 
+{
+#
+# j leathwick, j elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# takes an input data frame and checks for factor variables 
+# converting these to dummy variables, one each for each factor level
+# returning it for use with mars.glm so that factor vars can be included
+# in a mars analysis
+#
+
+  if (!is.data.frame(input.data)) {
+    print("input data must be a dataframe..",quote = FALSE)
+    return()
+  }
+
+  n <- 1
+  for (i in 1:ncol(input.data)) {  #first transfer the vector variables
+    if (is.vector(input.data[,i])) {
+      if (n == 1) {
+        output.data <- as.data.frame(input.data[,i]) 
+        names.list <- names(input.data)[i]
+        var.type <- "vector"
+        factor.level <- "na"
+      }
+      else {
+        output.data[,n] <- input.data[,i]
+        names.list <- c(names.list,names(input.data)[i])
+        var.type <- c(var.type,"vector")
+        factor.level <- c(factor.level,"na")
+      }
+      names(output.data)[n] <- names(input.data)[i]
+      n <- n + 1
+    }
+  }
+
+  for (i in 1:ncol(input.data)) {  # and then the factor variables
+    if (is.factor(input.data[,i])) {
+      temp.table <- summary(input.data[,i])
+      for (j in 1:length(temp.table)) {
+        names.list <- c(names.list,names(input.data)[i])
+        var.type <- c(var.type,"factor")
+        factor.level <- c(factor.level,names(temp.table)[j])
+        output.data[,n] <- ifelse(input.data[,i] == names(temp.table)[j],1,0)
+        names(output.data)[n] <- paste(names(input.data)[i],".",names(temp.table)[j],sep="")
+        n <- n + 1
+      }
+    }
+  }
+
+  lineage <- data.frame(names(output.data),names.list,var.type,factor.level)
+  for (i in 1:4) lineage[,i] <- as.character(lineage[,i])
+  names(lineage) <- c("full.name","base.name","type","level")
+   
+  return(list(dataframe = output.data, lineage = lineage))
+}
+
+"mars.plot" <-
+function (mars.glm.object,  #the input mars object
+   sp.no = 0,               # the species number for multi-response models
+   plot.rug=T,              # plot a rug of deciles
+   plot.layout = c(3,4),    # the plot layout to use
+   file.name = NA,          # giving a file name will send results to a pdf
+   plot.it=T)               # option for making curves but no plots (aks)
+{
+
+# j leathwick/j elith August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# requires mars.export of leathwick/elith
+# 
+# takes a mars or mars/glm model and either 
+# creates a mars export table (vanilla mars object)
+# and works from this or uses the updated mars export table
+# stored as the first list item from mars.binomial
+# plotting out the fitted functions, amalgamating terms
+# for variables and naming the pages as required
+#
+# caters for multispecies mars models by successively plotting
+# all species unless a value other than zero is given for sp.no
+#
+# modified by aks 050609 to only open one plot window and use the record=T option.
+
+  max.plots <- plot.layout[1] * plot.layout[2]
+  if(plot.it){ #aks
+      if (is.na(file.name)) {
+        use.windows = TRUE 
+        windows(width = 11, height = 8, record=T) #AKS
+        par(mfrow = plot.layout) #AKS
+               }
+      else {
+        use.windows = FALSE
+        pdf(file=file.name,width = 11, height=8)
+        par(mfrow = plot.layout) #AKS
+      }
+  } else use.windows = FALSE
+
+  if (class(mars.glm.object) == "mars") {  #then we have a mars object
+    mars.binomial = FALSE
+    model <- mars.glm.object
+    xdat <- eval(model$call$x)
+    Y <- as.data.frame(eval(model$call$y))
+    n.env <- ncol(xdat)
+    m.table <- mars.export(mars.glm.object)
+  }
+  else {
+    mars.binomial = TRUE
+
+    dat <- mars.glm.object$mars.call$dataframe
+    mars.x <- mars.glm.object$mars.call$mars.x
+    xdat <- as.data.frame(eval(parse(text=dat)))
+    xdat <- xdat[,mars.x]
+
+    m.table <- mars.glm.object[[1]]
+
+  }
+
+  n.bfs <- length(m.table[,1])
+  n.spp <- length(m.table[1,]) - 10
+  r.curves <- list(names=NULL,preds=list(),resp=list()) #aks
+  spp.names <- names(m.table)[(10+1):(10+n.spp)]
+
+  if (sp.no == 0) {
+    wanted.species <- seq(1:n.spp) 
+  }
+  else {
+    wanted.species <- sp.no
+  }
+
+  xrange <- matrix(0,nrow = 2,ncol = ncol(xdat))
+  factor.filter <- rep(FALSE,ncol(xdat))
+  for (i in 1:ncol(xdat)) factor.filter[i] <- is.vector(xdat[,i])
+
+  if(sum(factor.filter>1)) {
+  xrange[,factor.filter] <- sapply(xdat[,factor.filter], range)
+  } else  xrange[,factor.filter]<-range(xdat[,factor.filter])
+  
+  for (i in wanted.species) {
+    n.pages <- 1
+    plotit <- rep(TRUE, n.bfs)
+    print(paste("plotting responses for ",spp.names[i]),quote=F)
+    nplots <- 0
+    cntr <- 1 #aks
+    for (j in 2:n.bfs) {
+      if (m.table$names2[j] == "null") {
+        if (plotit[j]) {
+          varno <- pmatch(as.character(m.table$names1[j]), 
+          names(xdat))
+          if (factor.filter[varno]) {
+            Xi <- seq(xrange[1, varno], xrange[2, varno], 
+               length = 100)
+            bf <- pmax(0, m.table$signs1[j] * (Xi - m.table$cuts1[j]))
+            bf <- bf * m.table[j, i + 10]
+            bf <- bf - mean(bf)
+          }
+          else {
+            factor.table <- as.data.frame(table(xdat[,varno]))
+            names(factor.table) <- c("levels","coefficients")
+            factor.table$coefficients <- 0
+            level.no <- match(m.table$levels1[j],factor.table$levels)
+            factor.table$coefficients[level.no] <- m.table[j, i + 10]
+          }
+          if (j < n.bfs) {
+            for (k in ((j + 1):n.bfs)) {
+              if (m.table$names1[j] == m.table$names1[k] & m.table$names2[k] == "null") {
+                    if (factor.filter[varno]) {
+                      bf.add <- pmax(0, m.table$signs1[k] * 
+                          (Xi - m.table$cuts1[k]))
+                      bf.add <- bf.add * m.table[k, i + 10]
+                      bf <- bf + bf.add
+                    }
+                    else {
+                      level.no <- match(m.table$levels1[k],factor.table$levels)
+                      factor.table$coefficients[level.no] <- m.table[k, i + 10]
+                    }
+                    plotit[k] <- FALSE
+              }
+            }
+          }
+          #if (nplots == 0) { #AKS
+#            if (use.windows) windows(width = 11, height = 8)
+#              par(mfrow = plot.layout)
+#            }
+            if (factor.filter[varno]) {
+              if(plot.it) plot(Xi, bf, type = "l", xlab = names(xdat)[varno], ylab = "response") #aks
+              if (plot.rug & plot.it) rug(quantile(xdat[,varno], probs = seq(0, 1, 0.1), na.rm = FALSE))
+              r.curves$preds[[cntr]] <- Xi #aks
+              r.curves$resp[[cntr]] <- bf #aks
+            }
+            else {
+              if(plot.it) plot(factor.table$levels, factor.table$coefficients, xlab = names(xdat)[varno]) #aks
+              r.curves$preds[[cntr]] <- factor.table$levels #aks
+              r.curves$resp[[cntr]] <- factor.table$coefficients #aks
+              
+            }
+            r.curves$names <- c(r.curves$names,names(xdat)[varno])  #aks
+            cntr <- cntr + 1  #aks
+            nplots = nplots + 1
+            plotit[j] <- FALSE
+          }
+        }
+        else {  # case where there is an interaction #
+          if (plotit[j]) {
+            varno1 <- pmatch(as.character(m.table$names1[j]), names(xdat))
+            X1 <- seq(xrange[1, varno1], xrange[2, varno1], length = 20)
+            bf1 <- pmax(0, m.table$signs1[j] * (X1 - m.table$cuts1[j]))
+            varno2 <- pmatch(as.character(m.table$names2[j]), names(xdat))
+            X2 <- seq(xrange[1, varno2], xrange[2, varno2], length = 20)
+            bf2 <- pmax(0, m.table$signs2[j] * (X2 - m.table$cuts2[j]))
+            if(factor.filter[varno1] & factor.filter[varno2]){ #aks
+                zmat <- bf1 %o% bf2
+                zmat <- zmat * m.table[j, i + 10]
+                if (j < n.bfs) {
+                  for (k in ((j + 1):n.bfs)) {
+                    if (m.table$names1[j] == m.table$names1[k] & m.table$names2[j] == m.table$names2[k]) {
+                      bf1 <- pmax(0, m.table$signs1[k] * (X1 - m.table$cuts1[k]))
+                      bf2 <- pmax(0, m.table$signs2[j] * (X2 - m.table$cuts2[j]))
+                      zmat2 <- bf1 %o% bf2
+                      zmat2 <- zmat2 * m.table[j, i + 10]
+                      zmat = zmat + zmat2
+                      plotit[k] <- FALSE
+                    }
+                  }
+                }
+              #if (nplots == 0) {  #AKS
+    #            if (use.windows) windows(width = 11, height = 8)
+    #            par(mfrow = plot.layout)
+    #          }
+                if(plot.it){
+                    persp(x = X1, y = X2, z = zmat, xlab = names(xdat)[varno1], 
+                              ylab = names(xdat)[varno2], theta = 45, phi = 25) }
+                r.curves$preds[[cntr]] <- X1 #aks
+                r.curves$resp[[cntr]] <- apply(zmat,1,mean,na.rm=T) #aks
+                nplots = nplots + 1
+                } else {
+                    r.curves$preds[[cntr]] <- NA #aks
+                    r.curves$resp[[cntr]] <- NA #aks
+                    
+                }
+        r.curves$names <- c(r.curves$names,names(xdat)[varno]) #aks
+        cntr <- cntr + 1 #aks
+        }
+      }
+      if (nplots == 1 & plot.it) {
+        title(paste(spp.names[i], " - page ", n.pages, sep = ""))
+      }
+      if (nplots == max.plots) {
+        nplots = 0
+        n.pages <- n.pages + 1
+      }
+    }
+  }
+  if (!use.windows & plot.it) dev.off()
+  invisible(r.curves) #aks
+}
+
+"mars.plot.fits" <-
+function(mars.glm.object,    # the input mars object
+   sp.no = 0,                # allows selection of individual spp for multiresponse models
+   mask.presence = FALSE,    # plots out just presence records
+   use.factor = FALSE,       # draws plots as factors for faster printing
+   plot.layout = c(4,2),     # the default plot layout
+   file.name = NA)           # allows plotting to a pdf file
+{
+#
+# j leathwick, j elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# to plot distribution of fitted values in relation to ydat from mars or other p/a models
+# allows masking out of absences to enable focus on sites with high predicted values
+# fitted values = those from model; raw.values = original y values
+# label = text species name; ydat = predictor dataset
+# mask.presence forces function to only plot fitted values for presences
+# use.factor forces to use quicker printing box and whisker plot
+# file.name routes to a pdf file of this name
+#
+
+  max.plots <- plot.layout[1] * plot.layout[2]
+
+  if (is.na(file.name)) {    #setup for windows or file output
+    use.windows = TRUE 
+  }
+  else {
+    pdf(file.name, width=8, height = 11)
+    par(mfrow = plot.layout)
+    par(cex = 0.5)
+    use.windows = FALSE
+  }
+
+  dat <- mars.glm.object$mars.call$dataframe    #get the dataframe name
+  dat <- as.data.frame(eval(parse(text=dat)))   #and now the data
+
+  n.cases <- nrow(dat)
+
+  mars.call <- mars.glm.object$mars.call	#and the mars call details
+  mars.x <- mars.call$mars.x    
+  mars.y <- mars.call$mars.y
+  family <- mars.call$family
+
+  xdat <- as.data.frame(dat[,mars.x])
+  ydat <- as.data.frame(dat[,mars.y])
+
+  n.spp <- ncol(ydat)
+  n.preds <- ncol(xdat)
+
+  fitted.values <- mars.glm.object$fitted.values
+
+  pred.names <- names(dat)[mars.x]
+  spp.names <- names(dat)[mars.y]
+
+  if (sp.no == 0) {
+    wanted.species <- seq(1:n.spp) 
+    }
+  else {
+    wanted.species <- sp.no
+    }
+
+  for (i in wanted.species) {
+
+    if (mask.presence) {
+	mask <- ydat[,i] == 1 }
+    else {
+      mask <- rep(TRUE, length = n.cases) 
+    }
+
+    robust.max.fit <- approx(ppoints(fitted.values[mask,i]), sort(fitted.values[mask,i]), 0.99) #find 99%ile value
+    nplots <- 0
+
+    for (j in 1:n.preds) {
+      if (use.windows & nplots == 0) {
+        windows(width = 8, height = 11)
+        par(mfrow = plot.layout)
+        par(cex = 0.5)
+      }
+	nplots <- nplots + 1    
+      if (is.vector(xdat[,j])) wt.mean <- mean((xdat[mask, j] * fitted.values[mask, i]^5)/mean(fitted.values[mask, i]^5))
+        else wt.mean <- 0
+	if (use.factor) {
+	temp <- factor(cut(xdat[mask, j], breaks = 12))
+	if (family == "binomial") {
+	  plot(temp, fitted.values[mask,i], xlab = pred.names[j], ylab = "fitted values", ylim = c(0, 1))
+      }
+	else {
+	  plot(temp, fitted.values[mask,i], xlab = pred.names[j], ylab = "fitted values")}
+	}
+	else {
+	  if (family == "binomial") {
+	    plot(xdat[mask, j], fitted.values[mask,i], xlab = pred.names[j], ylab = "fitted values", 
+					ylim = c(0, 1))
+        }
+	  else {
+          plot(xdat[mask, j], fitted.values[mask,i], xlab = pred.names[j], ylab = "fitted values")
+        }
+	}
+	abline(h = (0.333 * robust.max.fit$y), lty = 2.)
+	if (nplots == 1) { 
+  	  title(paste(spp.names[i], ", wtm = ", zapsmall(wt.mean, 4.)))}
+	else {
+	  title(paste("wtm = ", zapsmall(wt.mean, 4.)))}
+	  nplots <- ifelse(nplots == max.plots, 0, nplots)
+	}
+    }
+  if (!use.windows) dev.off()
+}
+
+"mars.predict" <-
+function (mars.glm.object,new.data) 
+{
+#
+# j leathwick, j elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# calculates a mars/glm object in which basis functions are calculated
+# using an initial mars model with single or multiple responses 
+# data for individual species are then fitted as glms using the 
+# common set of mars basis functions with results returned as a list
+#
+# takes as input a dataset and args selecting x and y variables, and degree of interaction
+# along with site and species weights, the CV penalty, and the glm family argument
+# the latter would normally be one of "binomial" or "poisson" - "gaussian" could be used
+# but in this case the model shouldn't differ from that fitted using mars on its own
+#
+# naming problem for dataframes fixed - je - 15/12/06
+#
+# requires mda and leathwick/elith's mars.export
+#
+  require(mda)
+
+# first recreate both the original mars model and the glm model
+
+# setup input data and create original temporary data
+
+  dataframe.name <- mars.glm.object$mars.call$dataframe  # get the dataframe name
+  mars.x <- mars.glm.object$mars.call$mars.x
+  mars.y <- mars.glm.object$mars.call$mars.y
+  n.spp <- length(mars.y)
+  family <- mars.glm.object$mars.call$family
+  mars.degree <- mars.glm.object$mars.call$degree
+  penalty <- mars.glm.object$mars.call$penalty
+  site.weights <- mars.glm.object$weights[[1]]
+  spp.weights <- mars.glm.object$weights[[2]]
+
+  print("creating original data frame...",quote=FALSE)
+
+  base.data <- as.data.frame(eval.parent(parse(text = dataframe.name))) #aks
+
+  x.temp <- eval(base.data[, mars.x])                 #form the temporary datasets
+  base.names <- names(x.temp)
+
+  xdat <- mars.new.dataframe(x.temp)[[1]]
+   
+  ydat <- as.data.frame(base.data[, mars.y])
+  names(ydat) <- names(base.data)[mars.y]
+
+  assign("xdat", xdat, pos = 1)               #and assign them for later use
+  assign("ydat", ydat, pos = 1)
+
+# now create the temporary dataframe for the new data
+
+  print("checking variable matching with new data",quote = FALSE)
+
+  new.names <- names(new.data)
+
+  for (i in 1:length(base.names)) {
+
+    name <- base.names[i]
+   
+    if (!(name %in% new.names)) {
+      print(paste("Variable ",name," missing from new data",sep=""),quote = FALSE)  #aks
+      return()
+    }
+  }
+
+  print("and creating temporary dataframe for new data...",quote=FALSE)
+
+  selector <- match(names(x.temp),names(new.data))
+
+  pred.dat <- mars.new.dataframe(new.data[,selector])[[1]]
+
+  assign("pred.dat", pred.dat, pos = 1)               #and assign them for later use
+
+# fit the mars model and extract the basis functions
+
+  print(paste("re-fitting initial mars model for",n.spp,"responses"),quote = FALSE)
+  print(paste("using glm family of",family),quote = FALSE)
+
+  #mars.fit <- mars(x = xdat, y = ydat, degree = mars.degree, w = site.weights, 
+  #  wp = spp.weights, penalty = penalty)
+
+  mars.fit <- mars.glm.object$mars.object  #AKS
+
+  old.bf.data <- as.data.frame(eval(mars.fit$x))
+  n.bfs <- ncol(old.bf.data)
+  bf.names <- paste("bf", 1:n.bfs, sep = "")
+  old.bf.data <- as.data.frame(old.bf.data[,-1])
+  names(old.bf.data) <- bf.names[-1]
+
+  new.bf.data <- as.data.frame(mda:::model.matrix.mars(mars.fit,pred.dat))
+  new.bf.data <- as.data.frame(new.bf.data[,-1])
+  names(new.bf.data) <- bf.names[-1]
+
+# now cycle through the species fitting glm models 
+
+  print("fitting glms for individual responses", quote = F)
+
+  prediction <- as.data.frame(matrix(0, ncol = n.spp, nrow = nrow(pred.dat)))
+  names(prediction) <- names(ydat)
+  standard.errors <- as.data.frame(matrix(0, ncol = n.spp, nrow = nrow(pred.dat)))
+  names(standard.errors) <- names(ydat)
+
+  for (i in 1:n.spp) {
+
+    print(names(ydat)[i], quote = FALSE)
+    model.glm <- glm(ydat[, i] ~ ., data = old.bf.data, weights = site.weights, 
+      family = family, maxit = 100)
+    temp <- predict.glm(model.glm,new.bf.data,type="response",se.fit=TRUE)
+    prediction[,i] <- temp[[1]]
+    standard.errors[,i] <- temp[[2]]
+  
+    }
+   
+  return(list("prediction"=prediction,"ses"=standard.errors))
+}
+
+"roc" <-
+function (obsdat, preddat) 
+{
+# code adapted from Ferrier, Pearce and Watson's code, by J.Elith
+#
+# see:
+# Hanley, J.A. & McNeil, B.J. (1982) The meaning and use of the area
+# under a Receiver Operating Characteristic (ROC) curve.
+# Radiology, 143, 29-36
+#
+# Pearce, J. & Ferrier, S. (2000) Evaluating the predictive performance
+# of habitat models developed using logistic regression.
+# Ecological Modelling, 133, 225-245.
+# this is the non-parametric calculation for area under the ROC curve, 
+# using the fact that a MannWhitney U statistic is closely related to
+# the area
+#
+    if (length(obsdat) != length(preddat)) 
+        stop("obs and preds must be equal lengths")
+    n.x <- length(obsdat[obsdat == 0])
+    n.y <- length(obsdat[obsdat == 1])
+    xy <- c(preddat[obsdat == 0], preddat[obsdat == 1])
+    rnk <- rank(xy)
+    wilc <- ((n.x * n.y) + ((n.x * (n.x + 1))/2) - sum(rnk[1:n.x]))/(n.x * 
+        n.y)
+    return(round(wilc, 4))
+}
+
+
+
+#set defaults
+make.p.tif=T
+make.binary.tif=T
+mars.degree=1
+mars.penalty=2
+script.name="mars.r"
+opt.methods=2
+save.model=TRUE
+MESS=FALSE
+
+# Interpret command line argurments #
+# Make Function Call #
+Args <- commandArgs(trailingOnly=FALSE)
+
+    for (i in 1:length(Args)){
+     if(Args[i]=="-f") ScriptPath<-Args[i+1]
+     }
+
+    print(Args)
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="c") csv <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="mpt") make.p.tif <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="mbt")  make.binary.tif <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="deg") mars.degree <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="pen") mars.penalty <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="om")  opt.methods <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="savm")  save.model <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="mes")  MESS <- argSplit[[1]][2]
+    }
+	print(csv)
+	print(output)
+	print(responseCol)
+
+ScriptPath<-dirname(ScriptPath)
+source(paste(ScriptPath,"LoadRequiredCode.r",sep="\\"))
+print(ScriptPath)
+
+make.p.tif<-as.logical(make.p.tif)
+make.binary.tif<-as.logical(make.binary.tif)
+save.model<-make.p.tif | make.binary.tif
+opt.methods<-as.numeric(opt.methods)
+MESS<-as.logical(MESS)
+
+fit.mars.fct(ma.name=csv,
+        tif.dir=NULL,output.dir=output,
+        response.col=responseCol,make.p.tif=make.p.tif,make.binary.tif=make.binary.tif,
+            mars.degree=mars.degree,mars.penalty=mars.penalty,debug.mode=F,responseCurveForm="pdf",
+            script.name="mars.r",save.model=save.model,opt.methods=as.numeric(opt.methods),MESS=MESS)
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/FIT_RF_pluggable.r b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_RF_pluggable.r
new file mode 100644
index 0000000..d6015cc
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/FIT_RF_pluggable.r
@@ -0,0 +1,649 @@
+# A set of R functions for automated model fitting of random forest models to presence/absence data #
+#
+# Modified 12-2-09 to:  remove categorical covariates from consideration if they only contain one level
+#                       ID factor variables based on "categorical" prefix and look for tifs in subdir
+#                       Give progress reports
+#                       write large output tif files in blocks to alleviate memory issues
+#                       various bug fixes
+#
+# Adapted from existing pluggable BRT and GLM modules in April 2009 by Alan Swanson
+
+
+# Libraries required to run this program #
+#   PresenceAbsence - for ROC plots
+#   XML - for XML i/o
+#   rgdal - for geotiff i/o
+#   RandomForest - duh
+#   sp - used by rdgal library
+
+options(error=NULL)
+
+fit.rf.fct <- function(ma.name,tif.dir=NULL,output.dir=NULL,response.col="^response.binary",make.p.tif=T,make.binary.tif=T,
+      debug.mode=F,responseCurveForm="pdf",xtest=NULL,ytest=NULL,n.trees=1000,mtry=NULL, samp.replace=FALSE, sampsize=NULL,nodesize=NULL,maxnodes=NULL,importance=FALSE,
+      localImp=FALSE,nPerm=1,proximity=NULL,oob.prox=proximity,norm.votes=TRUE,do.trace=FALSE,keep.forest=NULL,keep.inbag=FALSE, make.r.curves=T,
+      seed=NULL,script.name="rf.r",opt.methods=2,save.model=TRUE,UnitTest=FALSE,MESS=FALSE){
+    # This function fits a boosted regression tree model to presence-absence data.
+    # written by Alan Swanson, Jan-March 2009
+    # uses code modified from that published in Elith et al 2008
+    # # Maintained and edited by Marian Talbert September 2010-
+    # Arguements.
+    # ma.name: is the name of a .csv file with a model array.  full path must be included unless it is in the current
+    #  R working directory #
+    # tif.dir: is the directory containing geotiffs for each covariate.  only required if geotiffs output of the 
+    #   response surface is requested #    # cov.list.name: is the name of a text file with the names of covariates to be included in models (one per line).
+    # output.dir: is the directory that output files will be stored in.  if not given, files will go to the current working directory. 
+    # response.col: column number of the model array containing a binary 0/1 response.  all other columns will be considered explanatory variables.
+    # make.p.tif: T if a geotiff of the response surface is desired.
+    # make.binary.tif: T if a geotiff of the response surface is desired.
+    # simp.method: model simplification method.  valid methods include: "cross-validation", "rel-inf", and "none".  "cross-validation" uses the
+    #   methods of Elith et al, 2008 for removing covariates that don't contribute to the model.  "rel-inf" simply removes covariates that contribute 
+    #  less than 1%.  cross-validation is very slow - it can add up to 10min to a run. 
+    # debug.mode: if T, output is directed to the console during the run.  also, a pdf is generated which contains response curve plots and perspective plots
+    #    showing the effects of interactions deemed important.  if F, output is diverted to a text file and the console is kept clear 
+    #    except for final output of an xml file.  in either case, a set of standard output files are created in the output directory.
+    # tc:  tree-complexity for brt fits.  if specified, this sets the tree-complexity of the final model fit.  A lower tree-complexity will be used for
+    #    model selection steps.  if not set, this will be estimated loosely following the guidelines given by Elith et al, 2008.
+    # 
+
+    # Value:
+    # returns nothing but generates a number of output files in the directory
+    # "output.dir" named above.  These output files consist of:
+    #
+    # brt_output.txt:  a text file with fairly detailed results of the final model.
+    # brt_output.xml:  an xml-formatted text file with results from the final model.
+    # brt_response_curves.xml:  an xml-formatted text file with response curves for
+    #   each covariate in the final model.
+    # brt_prob_map.tif:  a geotiff of the response surface
+    # brt_bin_map.tif:  a geotiff of the binary response surface.  threhold is based on the roc curve at the point where sensitivity=specificity.
+    # brt_log.txt:   a file containing text output diverted from the console when debug.mode=F
+    # brt_auc_plot.jpg:  a jpg file of a ROC plot.
+    # brt_response_curves.pdf:  an pdf file with response curves for
+    #   each covariate in the final model and perspective plots showing the effect of interactions deemed significant.
+    #   only produced when debug.mode=T
+    #  seed=NULL                                 # sets a seed for the algorithm, any inegeger is acceptable
+    #  opt.methods=2                             # sets the method used for threshold optimization used in the
+    #                                            # the evaluation statistics module
+    #  save.model=FALSE                          # whether the model will be used to later produce tifs
+    #
+    # when debug.mode is true, these filenames will include a number in them so that they will not overwrite preexisting files. eg brt_1_output.txt.
+    #
+    times <- as.data.frame(matrix(NA,nrow=8,ncol=1,dimnames=list(c("start","read data","model tuning","model fit",
+            "model summary","response curves","tif output","done"),c("time"))))
+    times[1,1] <- unclass(Sys.time())
+    t0 <- unclass(Sys.time())
+    #simp.method <- match.arg(simp.method)
+    out <- list(
+      input=list(ma.name=ma.name,
+                 tif.dir=tif.dir,
+                 output.dir=output.dir,
+                 response.col=response.col,
+                 save.model=save.model,
+                 xtest=xtest,
+                 ytest=ytest,
+                 n.trees=n.trees,
+                 mtry=mtry,
+                 samp.replace=samp.replace,
+                 sampsize=sampsize,
+                 nodesize=nodesize,
+                 maxnodes=maxnodes,
+                 importance=importance,
+                 localImp=localImp,
+                 nPerm=nPerm,
+                 proximity=proximity,
+                 oob.prox=oob.prox,
+                 norm.votes=norm.votes,
+                 do.trace=do.trace,
+                 keep.forest=keep.forest,
+                 keep.inbag=keep.inbag,
+                 make.p.tif=make.p.tif,
+                 make.binary.tif=make.binary.tif,
+                 model.type="random forest regression tree",
+                 model.source.file=script.name,
+                 model.fitting.subset=c(n.pres=50,n.abs=50),#subset used for response curves
+                 run.time=paste(c(format(Sys.time(),"%Y-%m-%d"),format(Sys.time(),"%H:%M:%S")),collapse="T"),
+                 sig.test="mean decrease in accuracy",
+                 MESS=MESS),
+      dat = list(missing.libs=NULL,
+                 output.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.dir=list(dname=NULL,exist=F,readable=F,writable=F),
+                 tif.ind=NULL,
+                 tif.names=NULL,
+                 bname=NULL,
+                 bad.factor.covs=NULL, # factorchange
+                 ma=list( status=c(exists=F,readable=F),
+                          dims=c(NA,NA),
+                          n.pres=c(all=NA,complete=NA,subset=NA),
+                          n.abs=c(all=NA,complete=NA,subset=NA),
+                          ratio=NA,
+                          resp.name=NULL,
+                          factor.levels=NULL,
+                          used.covs=NULL,
+                          ma=NULL,
+                          ma.subset=NULL,
+                          train.xy=NULL,
+                          test.xy=NULL,
+                          site.weights=NULL),
+                 ma.test=NULL),
+      mods=list(parms=list(n.trees=n.trees,mtry=NULL),
+                full.mod=NULL,
+                simp.mod=NULL,
+                final.mod=NULL,
+                r.curves=NULL,
+                tif.output=list(prob=NULL,bin=NULL),
+                auc.output=NULL,
+                interactions=NULL,
+                summary=NULL),
+      time=list(strt=unclass(Sys.time()),end=NULL),
+      error.mssg=list(NULL),
+      ec=0
+      )
+
+   if(!is.null(seed)) set.seed(seed)
+    #if(simplify.brt==T) out$input$simp.method<-"cross-validation" else out$input$simp.method<-">1% rel. influence"
+    # load libaries #
+    out <- check.libs(list("randomForest","PresenceAbsence","rgdal","XML","sp","raster","tcltk2","foreign","ade4"),out)
+    
+    # exit program now if there are missing libraries #
+    if(!is.null(out$error.mssg[[1]])){
+          cat(saveXML(rf.to.xml(out),indent=T),'\n')
+          return()
+          }
+                
+    # check output dir #
+    out$dat$output.dir <- check.dir(output.dir)    
+    if(out$dat$output.dir$writable==F) {out$ec<-out$ec+1
+              out$error.mssg[[out$ec]] <- paste("ERROR: output directory",output.dir,"is not writable")
+              out$dat$output.dir$dname <- getwd()
+              
+            }
+    
+    # generate a filename for output #
+    if(debug.mode==T){
+            outfile <- paste(bname<-paste(out$dat$output.dir$dname,"/rf_",n<-1,sep=""),"_output.txt",sep="")
+            while(file.access(outfile)==0) outfile<-paste(bname<-paste(out$dat$output.dir$dname,"/rf_",n<-n+1,sep=""),"_output.txt",sep="")
+            capture.output(cat("temp"),file=outfile) # reserve the new basename #
+    } else bname <- paste(out$dat$output.dir$dname,"/rf",sep="")
+    out$dat$bname <- bname    
+    
+    # sink console output to log file #
+    if(!debug.mode) {sink(logname <- paste(bname,"_log.txt",sep=""));on.exit(sink)} else logname<-NULL
+    #options(warn=1)
+    
+    # check tif dir #
+        # check tif dir #
+    if(!is.null(tif.dir)){
+      out$dat$tif.dir <- check.dir(tif.dir)
+      if(out$dat$tif.dir$readable==F & (out$input$make.binary.tif | out$input$make.p.tif)) {
+                out$ec<-out$ec+1
+                out$error.mssg[[out$ec]] <- paste("ERROR: tif directory",tif.dir,"is not readable")
+                if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+              cat(saveXML(brt.to.xml(out),indent=T),'\n')
+              return()
+              }
+            }
+
+    
+    # find .tif files in tif dir #
+    if(out$dat$tif.dir$readable)  out$dat$tif.names <- list.files(out$dat$tif.dir$dname,pattern=".tif",recursive=T)
+    
+    # check for model array #
+    out$input$ma.name <- check.dir(out$input$ma.name)$dname
+    if(UnitTest!=FALSE) options(warn=2)
+    out <- read.ma(out)
+    if(UnitTest==1) return(out)
+    # exit program now if there are errors in the input data #
+    if(!is.null(out$error.mssg[[1]])){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          cat(saveXML(rf.to.xml(out),indent=T),'\n')
+          return()
+          }
+    t1 <- unclass(Sys.time()) 
+    cat("\ndone processing data, t=",round(t1-t0,1),"sec\n")  
+    cat("\nbegin processing of model array:",out$input$ma.name,"\n")
+    cat("\nfile basename set to:",out$dat$bname,"\n")
+    if(debug.mode) flush.console()
+    
+    if(!debug.mode) {sink();cat("Progress:20%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("20%\n")}  ### print time
+    
+    ##############################################################################################################
+    #  Begin model fitting #
+    ##############################################################################################################
+
+
+    # tune the mtry parameter - this controls the number of covariates randomly subset for each split #
+    cat("\ntuning mtry parameter\n")
+
+  x=out$dat$ma$ma[,-1]
+  y=factor(out$dat$ma$ma[,1])
+      if(is.null(mtry)){
+     mtry <- try(tuneRF(x=out$dat$ma$ma[,-1],y=factor(out$dat$ma$ma[,1]),mtryStart=3,importance=TRUE,ntreeTry=100,
+        replace=FALSE, doBest=F, plot=F),silent=T)
+          mtry <- try(mtry[mtry[,2]==min(mtry[,2]),1][1])
+          t2 <- unclass(Sys.time())
+          if(!debug.mode) {sink();cat("Progress:30%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("30%\n")}
+    
+          cat("\ndone tuning random forest parameters, t=",round(t2-t1,1),"sec\n")
+        }
+    
+    cat("\nnow fitting full random forest model using mtry=",mtry,"\n")  
+    if(debug.mode) flush.console() 
+
+     rf.full <- randomForest(x=out$dat$ma$ma[,-1],y=factor(out$dat$ma$ma[,1]),xtest=xtest,ytest=ytest,importance=TRUE, ntree=n.trees,
+        mtry=mtry,replace=samp.replace,sampsize=ifelse(is.null(sampsize),(ifelse(samp.replace,nrow(x),ceiling(.632*nrow(x)))),sampsize),
+        nodesize=ifelse(is.null(nodesize),(if (!is.null(y) && !is.factor(y)) 5 else 1),nodesize),maxnodes=maxnodes,
+        localImp=localImp, nPerm=nPerm, keep.forest=ifelse(is.null(keep.forest),!is.null(y) && is.null(xtest),keep.forest),
+        corr.bias=corr.bias, keep.inbag=keep.inbag)
+
+              out$mods$parms$mtry<-mtry
+              out$mods$final.mod <- rf.full
+
+    t3 <- unclass(Sys.time())
+    if(!debug.mode) {sink();cat("Progress:40%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("40%\n")}  ### print time
+    
+    cat("\nfinished fitting full model, t=",round(t2-t1,1),"sec\nnow computing output stats...\n")
+    if(debug.mode) flush.console()
+        
+    ##############################################################################################################
+    #  Begin model output #
+    ##############################################################################################################
+           
+    # ROC plot #
+
+      model.summary <- try(importance(out$mods$final.mod),silent=T)
+    if(class(model.summary)=="try-error"){
+        if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+        out$ec<-out$ec+1
+        out$error.mssg[[out$ec]] <- paste("ERROR: can't generate summary of final model:",model.summary)
+        cat(saveXML(rf.to.xml(out),indent=T),'\n')
+        return()
+    } else {
+        model.summary<-model.summary[order(model.summary[,3],decreasing=T),]
+        out$mods$summary <- model.summary
+        }
+        
+   txt0 <- paste("Random Forest Modeling Results\n",out$input$run.time,"\n\n",
+          "Data:\n\t",ma.name,
+          "\n\tn(pres)=",out$dat$ma$n.pres[2],
+          "\n\tn(abs)=",out$dat$ma$n.abs[2],
+          "\n\tn covariates considered=",length(out$dat$ma$used.covs),
+        "\n\n","Settings:",
+        "\n\tn covariates considered at each split =",out$mods$parms$mtry,
+        "\n\tn trees=",out$mods$parms$n.tree,
+        "\n\ttotal time for model fitting=",round((unclass(Sys.time())-t0)/60,2),"min\n",sep="")
+    txt1 <- "\nRelative performance of predictors in final model:\n\n"
+    txt2 <- "\nDefault summary of random forest fit:\n"
+    capture.output(cat(txt0),cat(txt1),print(round(model.summary,4)),cat(txt2),print(out$mods$final.mod),file=paste(bname,"_output.txt",sep=""))
+    cat(txt0);cat(txt1);print(round(model.summary,4));cat(txt2);print(out$mods$final.mod);cat("\n\n")
+    if(!is.null(out$dat$bad.factor.cols)){
+        capture.output(cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n"),
+            file=paste(bname,"_output.txt",sep=""),append=T)
+        cat("\nWarning: the following categorical response variables were removed from consideration\n",
+            "because they had only one level:",paste(out$dat$bad.factor.cols,collapse=","),"\n\n")
+        }
+        
+    auc.output <- make.auc.plot.jpg(out$dat$ma$ma,pred=tweak.p(as.vector(predict(out$mods$final.mod,type="prob")[,2])),
+            plotname=paste(bname,"_auc_plot.jpg",sep=""),modelname="RF",opt.methods=opt.methods,weight=rep(1,times=dim(out$dat$ma$ma)[1]),out=out)
+   
+    if(class(auc.output)=="try-error"){
+          out$ec<-out$ec+1
+          out$error.mssg[[out$ec]] <- paste("Error making ROC plot:",auc.output)
+    } else { out$mods$auc.output<-auc.output}
+        
+
+    #assign("out",out,envir=.GlobalEnv)   
+    
+    # Text summary #
+
+      
+    if(!debug.mode) {sink();cat("Progress:70%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("60%\n")}  ### print time
+    
+    if(debug.mode) flush.console()
+
+    # Response curves #
+    t4 <- unclass(Sys.time())
+    if(make.r.curves){
+
+            r.curves <- list(names=row.names(out$mods$summary),preds=list(),resp=list())
+            inc <- 10/length(r.curves$names)
+            assign("r.curves",r.curves,envir=.GlobalEnv)   
+
+        if(is.null(responseCurveForm)){
+          responseCurveForm<-0}
+
+    if(debug.mode | responseCurveForm=="pdf"){
+                nvar <- nrow(out$mods$summary)
+                pcol <- min(ceiling(sqrt(nvar)),4)
+                prow <- min(ceiling(nvar/pcol),3)
+                pdf(paste(bname,"_response_curves.pdf",sep=""),width=11,height=8.5,onefile=T)
+                par(oma=c(2,2,4,2),mfrow=c(prow,pcol))
+                }
+            for(i in 1:length(r.curves$names)){
+                    assign("i",i,envir=.GlobalEnv)
+
+                            x<-try(partialPlot(out$mods$final.mod,out$dat$ma$ma.subset,r.curves$names[i],n.pt=50,plot=T,main="",
+                                    xlab=r.curves$names[i]))
+                    if(class(x)=="try-error"){
+                        if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))} else graphics.off()
+                        out$ec<-out$ec+1
+                        out$error.mssg[[out$ec]] <- paste("ERROR: can't generate response curves:",x)
+                        cat(saveXML(rf.to.xml(out),indent=T),'\n')
+                        return()
+                    } else {
+                        r.curves$preds[[i]] <- x$x
+                        r.curves$resp[[i]] <- x$y
+                        }
+                     if(!debug.mode) {sink();cat(paste("Progress:",round(70+i*inc,1),"%\n",sep=""));flush.console();sink(logname,append=T)} else {cat("\n");cat(paste(round(70+i*inc,1),"%\n",sep=""))}  ### print time
+                    }
+            if(debug.mode) graphics.off()
+            out$mods$r.curves <- r.curves
+        }
+       
+    t5 <- unclass(Sys.time())
+    #if(!debug.mode) {sink();cat("80%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("80%\n")}  ### print time
+    cat("\nfinished with response curves, t=",round(t5-t4,2),"sec\n")
+    if(debug.mode) flush.console()
+    
+    # Make .tif of predictions #
+    out$mods$final.mod$contributions$var<-as.character(row.names(out$mods$summary))
+    
+    assign("out",out,envir=.GlobalEnv)
+     save.image(paste(output.dir,"modelWorkspace",sep="\\"))
+    if(out$input$make.p.tif==T | out$input$make.binary.tif==T){
+        cat("\nproducing prediction maps...","\n","\n");flush.console()
+        mssg <- try(proc.tiff(model=out$mods$final.mod,vnames=as.character(row.names(out$mods$summary)),
+            tif.dir=out$dat$tif.dir$dname,filenames=out$dat$tif.ind,pred.fct=rf.predict,factor.levels=out$dat$ma$factor.levels,make.binary.tif=make.binary.tif,
+            thresh=out$mods$auc.output$thresh,make.p.tif=make.p.tif,outfile.p=paste(out$dat$bname,"_prob_map.tif",sep=""),
+            outfile.bin=paste(out$dat$bname,"_bin_map.tif",sep=""),tsize=50.0,NAval=-3000,fnames=out$dat$tif.names,logname=logname,out=out),silent=T)     #"brt.prob.map.tif"
+
+        if(class(mssg)=="try-error" | mssg!=0){
+          if(!debug.mode) {sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))}
+          out$ec<-out$ec+1
+          out$error.mssg[[out$ec]] <- paste("Error producing prediction maps:",mssg)
+          cat(saveXML(rf.to.xml(out),indent=T),'\n')
+          return()
+        }  else {
+            if(make.p.tif) out$mods$tif.output$prob <- paste(out$dat$bname,"_prob_map.tif",sep="")
+            if(make.binary.tif) out$mods$tif.output$bin <- paste(out$dat$bname,"_bin_map.tif",sep="")
+            t5 <- unclass(Sys.time())
+            cat("\nfinished with prediction maps, t=",round(t5-t4,2),"sec\n");flush.console()
+          }
+        }
+    if(!debug.mode) {sink();cat("Progress:90%\n");flush.console();sink(logname,append=T)} else {cat("\n");cat("90%\n")}  ### print time
+
+  # Evaluation Statistics on Test Data#
+
+    if(!is.null(out$dat$ma$ma.test)) Eval.Stat<-EvaluationStats(out,thresh=auc.output$thresh,train=out$dat$ma$ma,
+        train.pred=tweak.p(as.vector(predict(out$mods$final.mod,type="prob")[,2])),opt.methods)
+
+    
+
+    
+    # Write summaries to xml #
+    assign("out",out,envir=.GlobalEnv)
+    doc <- rf.to.xml(out)
+    
+    cat(paste("\ntotal time=",round((unclass(Sys.time())-t0)/60,2),"min\n\n\n",sep=""))
+    if(!debug.mode) {
+        sink();on.exit();unlink(paste(bname,"_log.txt",sep=""))
+        cat("Progress:100%\n");flush.console()
+        cat(saveXML(doc,indent=T),'\n')
+        }
+    capture.output(cat(saveXML(doc,indent=T)),file=paste(out$dat$bname,"_output.xml",sep=""))
+    assign("fit",out$mods$final.mod,envir=.GlobalEnv)
+    invisible(out)
+}
+
+rf.predict <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictions from complete data only #
+    y <- rep(NA,nrow(x))
+    y[complete.cases(x)] <- as.vector(predict(model,newdata=x[complete.cases(x),],type="prob")[,2])
+    
+    # make predictions from full data #
+    
+    # encode missing values as -1.
+    y[is.na(y)]<- NaN
+    
+    # return predictions.
+    return(y)
+    }
+
+logit <- function(x) 1/(1+exp(-x))
+
+file_path_as_absolute <- function (x){
+    if (!file.exists(epath <- path.expand(x))) 
+        stop(gettextf("file '%s' does not exist", x), domain = NA)
+    cwd <- getwd()
+    on.exit(setwd(cwd))
+    if (file_test("-d", epath)) {
+        setwd(epath)
+        getwd()
+    }
+    else {
+        setwd(dirname(epath))
+        file.path(getwd(), basename(epath))
+    }
+}
+#file_path_as_absolute(".")
+
+rf.to.xml <- function(out){
+    require(XML)
+    schema.http="http://www.w3.org/2001/XMLSchema-instance"
+    schema.fname="file:/Users/isfs2/Desktop/Source/2008-04-09/src/gov/nasa/gsfc/quickmap/ModelBuilder/modelRun_output_v2.xsd"
+    xml.out <- newXMLDoc()
+    mr <- newXMLNode("modelRunOutput",doc=xml.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))#,parent=xml.out
+    sm <- newXMLNode("singleModel",parent=mr)
+    bg <- newXMLNode("background",parent=sm)
+        newXMLNode("mdsName",out$input$ma.name,parent=bg)
+        newXMLNode("runDate",out$input$run.time,parent=bg)
+        lc <- newXMLNode("layersConsidered",parent=bg)#, parent = xml.out)
+        kids <- lapply(paste(out$dat$tif.dir$dname,"/",out$dat$tif.names,sep=""),function(x) newXMLNode("layer", x))
+        addChildren(lc, kids)
+    mo <- newXMLNode("modelOutput",parent=sm)
+        newXMLNode("modelType",out$input$model.type,parent=mo)
+        newXMLNode("modelSourceFile",out$input$model.source.file,parent=mo)
+        newXMLNode("devianceExplained",out$mods$auc.output$pct_dev_exp,parent=mo,attrs=list(type="percentage"))
+        newXMLNode("nativeOutput",paste(out$dat$bname,"_output.txt",sep=""),parent=mo)
+        newXMLNode("binaryOutputFile",out$mods$tif.output[[2]],parent=mo)
+        newXMLNode("probOutputFile",out$mods$tif.output[[1]],parent=mo)
+        newXMLNode("auc",out$mods$auc.output$auc,parent=mo)
+        newXMLNode("rocGraphic",out$mods$auc.output$plotname,parent=mo)
+        newXMLNode("rocThresh",out$mods$auc.output$thresh,parent=mo)
+        newXMLNode("modelDeviance",out$mods$auc.output$dev_fit,parent=mo)
+        newXMLNode("nullDeviance",out$mods$auc.output$null_dev,parent=mo)
+        if(is.null(out$mods$r.curves)) rc.name <- NULL else rc.name <- paste(out$dat$bname,"_response_curves.xml",sep="")
+        newXMLNode("responsePlotsFile",rc.name,parent=mo)
+        newXMLNode("significanceDescription",out$input$sig.test,parent=mo)
+        mfp <- newXMLNode("modelFitParmas",parent=mo)
+            newXMLNode("nTrees",out$mods$parms$n.tree,parent=mfp)
+            newXMLNode("mTry",out$mods$parms$mtry,parent=mfp)
+        
+        sv <- newXMLNode("significantVariables",parent=mo)
+        if(!is.null(out$mods$summary)) {
+            t.table <- data.frame(significanceMeasurement=out$mods$summary[,3],row.names=row.names(out$mods$summary))
+            for(i in 1:nrow(t.table)){
+                x <- newXMLNode("sigVar",parent=sv)
+                newXMLNode(name="name", row.names(t.table)[i],parent=x)
+                kids <- lapply(1:ncol(t.table),function(j) newXMLNode(name=names(t.table)[j], t.table[i,j]))
+                addChildren(x, kids)
+                }
+            }
+    if(!is.null(out$mods$r.curves)){
+        r.curves <-  out$mods$r.curves
+        rc.out <- newXMLDoc()
+        root <- newXMLNode("responseCurves",doc=rc.out,namespaceDefinitions=c(xsi=schema.http,noNamespaceSchemaLocation=schema.fname))
+        for(i in 1:length(r.curves$names)){
+            vartype <- ifelse(class(r.curves$preds[[i]])=="character","factor","continuous")
+            x <- newXMLNode("responseCurve",attrs=list(covariate=r.curves$names[i],type=vartype),parent=root)
+            kids <- lapply(1:length(r.curves$preds[[i]]),function(j){
+                newXMLNode(name="responsePt",parent=x,.children=list(
+                    newXMLNode(name="explanatory",r.curves$preds[[i]][j]),
+                    newXMLNode(name="response",r.curves$resp[[i]][j])))})
+            addChildren(x, kids)
+            }
+        saveXML(rc.out,rc.name,indent=T)
+        } 
+    if(!is.null(out$error.mssg[[1]])) {
+        kids <- lapply(out$error.mssg,function(j) newXMLNode(name="error",j))
+        addChildren(mo,kids)
+        }
+    return(xml.out)
+    }
+
+
+get.cov.names <- function(model){
+    return(attr(terms(formula(model)),"term.labels"))
+    }
+
+check.dir <- function(dname){
+    if(is.null(dname)) dname <- getwd()
+    dname <- gsub("[\\]","/",dname)
+    end.char <- substr(dname,nchar(dname),nchar(dname))
+    if(end.char == "/") dname <- substr(dname,1,nchar(dname)-1)
+    exist <- suppressWarnings(as.numeric(file.access(dname,mode=0))==0) # -1 if bad, 0 if ok #
+    if(exist) dname <- file_path_as_absolute(dname)
+    readable <- suppressWarnings(as.numeric(file.access(dname,mode=4))==0) # -1 if bad, 0 if ok #
+    writable <- suppressWarnings(as.numeric(file.access(dname,mode=2))==0) # -1 if bad, 0 if ok #
+    return(list(dname=dname,exist=exist,readable=readable,writable=writable))
+    }
+
+
+get.image.info <- function(image.names){
+    # this function creates a data.frame with summary image info for a set of images #
+    require(rgdal)
+    n.images <- length(image.names)
+
+    full.names <- image.names
+    out <- data.frame(image=full.names,available=rep(F,n.images),size=rep(NA,n.images),
+        type=factor(rep("unk",n.images),levels=c("asc","envi","tif","unk")))
+    out$type[grep(".tif",image.names)]<-"tif"
+    out$type[grep(".asc",image.names)]<-"asc"
+    for(i in 1:n.images){
+        if(out$type[i]=="tif"){
+            x <-try(GDAL.open(full.names[1],read.only=T),silent=T)
+            suppressMessages(try(GDAL.close(x),silent=T))
+            if(class(x)!="try-error") out$available[i]<-T
+            x<-try(file.info(full.names[i]))
+        } else {
+            x<-try(file.info(full.names[i]))
+            if(!is.na(x$size)) out$available[i]<-T
+        }
+        if(out$available[i]==T){
+            out$size[i]<-x$size
+            if(out$type[i]=="unk"){
+                # if extension not known, look for envi .hdr file in same directory #
+                if(file.access(paste(file_path_sans_ext(full.names[i]),".hdr",sep=""))==0) 
+                    out$type[i]<-"envi"
+                }
+        }
+    }
+    return(out)
+}
+
+tweak.p <- function(p){
+	p[p==1]<-max(p[p<1])
+	p[p==0]<-min(p[p>0])
+	return(p)
+	}
+
+
+#
+
+ # Interpret command line argurments #
+# Make Function Call #
+#Set defaults for optional commands
+make.p.tif=T
+make.binary.tif=T
+responseCurveForm="pdf"
+xtest=NULL
+ytest=NULL
+n.trees=1000
+mtry=NULL
+samp.replace=FALSE
+sampsize=NULL
+nodesize=NULL
+maxnodes=NULL
+importance=FALSE
+localImp=FALSE
+nPerm=1
+proximity=NULL
+oob.prox=proximity
+norm.votes=TRUE
+do.trace=FALSE
+keep.forest=NULL
+keep.inbag=FALSE
+make.r.curves=T
+seed=NULL
+opt.methods=2
+save.model=TRUE
+seed=NULL
+MESS=FALSE
+
+Args <- commandArgs(trailingOnly=FALSE)
+
+    for (i in 1:length(Args)){
+     if(Args[i]=="-f") ScriptPath<-Args[i+1]
+     }
+
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="c") csv <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="mpt") make.p.tif <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="mbt")  make.binary.tif <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="xtst")  xtest <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="ytst")  ytest <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="ntree")  n.trees <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="mtry")  mtry <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="sampR")  samp.replace <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="sampS")  sampsize <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="nodeS")  nodesize <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="maxN")  maxnodes <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="impt")  importance <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="locImp")  localImp <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="nPerm")  nPerm <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="prox")  proximity <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="oopp")  oop.prox <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="NVot")  norm.votes <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="Trce")  do.trace <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="kf")  keep.forest <- argSplit[[1]][2]
+ 			if(argSplit[[1]][1]=="Kbag")  keep.inbag <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="curves")  make.r.curves <- argSplit[[1]][2]
+ 		  if(argSplit[[1]][1]=="om")  opt.methods <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="savm")  save.model <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="mes")  MESS <- argSplit[[1]][2]
+ 		  
+    }
+	print(csv)
+	print(output)
+	print(responseCol)
+	
+make.p.tif<-as.logical(make.p.tif)
+make.binary.tif<-as.logical(make.binary.tif)
+samp.replace<-as.logical(samp.replace)
+importance<-as.logical(importance)
+localImp<-as.logical(localImp)
+norm.votes<-as.logical(norm.votes)
+do.trace<-as.logical(do.trace)
+keep.inbag<-as.logical(keep.inbag)
+make.r.curves<-as.logical(make.r.curves)
+save.model<-make.p.tif | make.binary.tif
+n.trees<-as.numeric(n.trees)
+opt.methods<-as.numeric(opt.methods)
+ScriptPath<-dirname(ScriptPath)
+MESS<-as.logical(MESS)
+
+source(paste(ScriptPath,"LoadRequiredCode.r",sep="\\"))
+
+fit.rf.fct(ma.name=csv,tif.dir=NULL,output.dir=output,response.col=responseCol,make.p.tif=make.p.tif,make.binary.tif=make.binary.tif,
+      debug.mode=F,responseCurveForm="pdf",xtest=xtest,ytest=ytest,n.trees=n.trees,mtry=mtry,samp.replace=samp.replace, sampsize=sampsize,
+      nodesize=nodesize,maxnodes=maxnodes,importance=importance,
+      localImp=localImp,nPerm=nPerm,proximity=proximity,oob.prox=oob.prox,norm.votes=norm.votes,do.trace=do.trace,keep.forest=keep.forest,
+      keep.inbag=keep.inbag,make.r.curves=make.r.curves,
+      seed=seed,script.name="rf.r",opt.methods=opt.methods,save.model=save.model,MESS=MESS)
+
+ 
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/FunctionCall.r b/contrib/sahm/pySAHM/Resources/R_Modules/FunctionCall.r
new file mode 100644
index 0000000..4787464
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/FunctionCall.r
@@ -0,0 +1,87 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("PredictModel.r")
+source("read.ma.r")
+source("proc.tiff.r")
+
+# Curr
+#trace(proc.tiff,browser)
+#options(error=expression(if(interactive()) recover() else dump.calls()))
+#options(error=NULL)
+
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+      fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col="ResponseBinary",test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+            simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+           learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL,opt.methods=1,seed=1,save.model=TRUE)
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+           
+
+#Now testing to make sure this code works with no test training split
+ma.name<-"H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\ModelOutputCheck\\NewInput.csv"
+ma.name="C:\\VisTrails\\mtalbert_20110406T093111\\sahm4h5b1t.mds"
+
+ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv"
+fit.brt.fct(ma.name=ma.name,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+           learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+
+
+#this is the GLM_pluggable1.r under NewMDSBuilder (Works with new vistrails format)
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110510T100421\\TestTrainingSplit_1.csv"
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+rc="responseCount"
+
+      fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col=rc,make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+
+#Mars check Works with new vistrails format
+      fit.mars.fct(ma.name=ma.name,
+        tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+        response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+
+fit.rf.fct(ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv",
+  tif.dir=NULL,
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      debug.mode=T,n.trees=1000,ma.test=NULL,make.r.curves=T,script.name="glm.r")
+
+
+
+#this one does not subset paths set up in the old way works with old sahm as well as for
+fit.brt.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,ma.test=NULL,alpha=1,script.name="brt.r",
+     learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+     
+
+fit.mars.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+fit.glm.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",ma.test=NULL,script.name="glm.r")
+  
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/LoadRequiredCode.r b/contrib/sahm/pySAHM/Resources/R_Modules/LoadRequiredCode.r
new file mode 100644
index 0000000..9518b44
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/LoadRequiredCode.r
@@ -0,0 +1,16 @@
+#source(paste(ScriptPath,"EvaluationStats.r",sep="\\"))
+source(paste(ScriptPath,"TestTrainRocPlot.r",sep="\\"))
+source(paste(ScriptPath,"read.ma.r",sep="\\"))
+source(paste(ScriptPath,"proc.tiff.r",sep="\\"))
+source(paste(ScriptPath,"check.libs.r",sep="\\"))
+source(paste(ScriptPath,"modalDialog.r",sep="\\"))
+#replace EvaluationStats with
+source(paste(ScriptPath,"make.auc.r",sep="\\"))
+#source(paste(ScriptPath,"make.poisson.plot.r",sep="\\"))
+#source(paste(ScriptPath,"make.auc.plot.r",sep="\\"))
+source(paste(ScriptPath,"EvalStats.r",sep="\\"))
+source(paste(ScriptPath,"EvalStatsHelperFcts.r",sep="\\"))
+source(paste(ScriptPath,"AppendOut.r",sep="\\"))
+source(paste(ScriptPath,"ResidualImage.r",sep="\\"))
+source(paste(ScriptPath,"Pred.Surface.r",sep="\\"))
+#Fit.Mars
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/PairsExplore.r b/contrib/sahm/pySAHM/Resources/R_Modules/PairsExplore.r
new file mode 100644
index 0000000..92b945b
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/PairsExplore.r
@@ -0,0 +1,435 @@
+Pairs.Explore<-function(num.plots=5,min.cor=.7,input.file,output.file,response.col="ResponseBinary",cors.w.highest=FALSE,pres=TRUE,absn=TRUE,bgd=TRUE,Debug=FALSE){
+
+
+      #num.plots=plots per page of display
+      #min.cor=the minimum correlation to be included in determining which set of predictors to display
+      #input.file=a csv assumed to have the new vistrails form with the first several rows specifiying where to find tiffs
+      #   and which columns to include in analysis
+      #output.file=...
+      #response.col=name of response column to be removed and used elsewhere
+    #modifications
+      #5/10/2011 altered to handle count data as well presence absence.
+      #any counts higher than or equal to 1 are set to be presence though I might consider
+      #adding the option to have a threshold set instead of using just presence/absence
+
+
+      absn<-as.logical(absn)
+      pres<-as.logical(pres)
+      bgd<-as.logical(bgd)
+      cors.w.highest<-as.logical(cors.w.highest)
+      
+   #Read input data and remove any columns to be excluded
+    dat<-read.csv(input.file,skip=3,header=FALSE)
+
+          hl<-readLines(input.file,1)
+          hl=strsplit(hl,',')
+          colnames(dat) = hl[[1]]
+
+          tif.info<-readLines(input.file,3)
+          tif.info<-strsplit(tif.info,',')
+          include<-(as.numeric(tif.info[[2]]))
+
+  #Remove coordinates, response column, site.weights
+  #before exploring predictor relationship
+    rm.cols <- as.vector(na.omit(c(match("x",tolower(names(dat))),match("y",tolower(names(dat))),
+    match("site.weights",tolower(names(dat))),match(tolower(response.col),tolower(names(dat))),match("Split",names(dat)))))
+
+     #remove testing split
+    if(!is.na(match("Split",names(dat)))) dat<-dat[-c(which(dat$Split=="test"),arr.ind=TRUE),]
+
+    include[is.na(include)]<-0
+    rm.cols<-unique(c(rm.cols,which(include==0,arr.ind=TRUE)))
+    response<-dat[,match(tolower(response.col),tolower(names(dat)))]
+
+       dat<-dat[order(response),]
+       response<-response[order(response)]
+
+       #for the purpose of the pairs plot, taking all counts greater than 1 and setting them equal to presence
+       #this is never exported
+      if(response.col=="responseCount") {response[response>=1]<-1
+      }
+      
+    #remove any of pres absn or bgd that aren't desired
+     temp<-c(0,1,-9999)
+     temp<-temp[c(absn,pres,bgd)]
+     dat<-dat[response%in%temp,]
+     response<-response[response%in%temp]
+
+
+     if(sum(response==-9999)>1000){
+      s<-sample(which(response==-9999,arr.ind=TRUE),size=(sum(response==-9999)-1000))
+      dat<-dat[-c(s),]
+      response<-response[-c(s)]
+    }
+
+   if (response.col=="responseCount") {
+    TrueResponse<-dat[,match(tolower(response.col),tolower(names(dat)))]
+    } else TrueResponse<-response
+
+    #now remove all columns except predictors
+    dat<-dat[-rm.cols]
+     dat[dat==-9999]<-NA
+      response<-response[complete.cases(dat)]
+      TrueResponse<-TrueResponse[complete.cases(dat)]
+     dat<-dat[complete.cases(dat),]
+
+
+    #dat<-dat[1:2000,]
+  #Remove columns with only one unique value
+      varr <- function(x) var(x,na.rm=TRUE)
+      
+    dat<-try(dat[,as.vector(apply(dat,2,varr)==0)!=1],silent=TRUE)
+    if(class(dat)=="try-error") stop("mds file contains nonnumeric columns please remove and continue")
+  #record correlations for later plots
+
+    cmat<-cor(dat,use="pairwise.complete.obs")
+    smat<-cor(dat,method="spearman",use="pairwise.complete.obs")
+    if(dim(dat)[1]<2000){
+    kmat<-cor(dat,method="kendall",use="pairwise.complete.obs")}
+    else {s<-sample(seq(1:dim(dat)[1]),size=2000,replace=FALSE)
+     kmat<-cor(dat[s,],method="kendall",use="pairwise.complete.obs")
+    }
+    
+    cmat=pmax(abs(cmat),abs(smat),abs(kmat),na.rm=TRUE)
+    
+    High.cor<-sort(apply(abs(cmat)>min.cor,2,sum)-1,decreasing=TRUE)
+
+  #take the top num.plots to put in the pairs plot or if the looking at a single
+  #predictor and other predictors it's correlated with, take the top num.plots-1
+  #of those with which it is correlated
+    {if(cors.w.highest==FALSE){
+    HighToPlot<-dat[,match(names(High.cor),names(dat))[1:min(num.plots,length(High.cor))]]
+      }else{
+          #take the column of the correlation matrix corresponding to the
+          #predictor with the higest number of total correlations record the names
+          #of the predictors that are correlated with this one predictor
+          temp<-cmat[rownames(cmat)==names(High.cor[1]),]
+          CorWHigh<-temp[abs(cmat[,colnames(cmat)==names(High.cor[1])])>min.cor]
+
+          #record counts of total number of correlations with all predictors for those
+          #predictors that are highly correlated with the Highest predictor
+          High.cor<-sort(High.cor[names(CorWHigh)],decreasing=TRUE)
+          HighToPlot<-dat[,match(names(High.cor),names(dat))[1:min(num.plots,length(High.cor))]]
+          }}
+              cor.hightoplot<-abs(cor(HighToPlot,use="pairwise.complete.obs"))
+              diag(cor.hightoplot)<-0
+    cor.range<-c(quantile(as.vector(cor.hightoplot),probs=c(0,.5,.7,.85)),1)
+
+  ## put histograms on the diagonal
+    panel.hist <- function(x, ...)
+    {
+        usr <- par("usr"); on.exit(par(usr))
+        par(usr = c(usr[1:2], 0, 1.5) )
+        h <- hist(x, plot = FALSE)
+        breaks <- h$breaks; nB <- length(breaks)
+        y <- h$counts; y <- y/max(y)
+        rect(breaks[-nB], 0, breaks[-1], y, col="steelblue", ...)
+
+    }
+
+
+  ## put (absolute) correlations on the upper panels,
+  ## with size proportional to the correlations.
+      panel.cor <- function(x, y, digits=2, prefix="", cor.range,cex.cor, ...)
+      {
+      a<-colors()
+          usr <- par("usr"); on.exit(par(usr))
+          par(usr = c(0, 1, 0, 1))
+          r <- abs(cor(x, y,use="pairwise.complete.obs"))
+          spear<-abs(cor(x,y,method="spearman",use="pairwise.complete.obs"))
+          ken<- abs(cor(x,y,method="kendall",use="pairwise.complete.obs"))
+          all.cor<-max(r,spear,ken)
+          #range.seq<-seq(from=cor.range[1],to=cor.range[2],length=20)
+          if(all.cor>=cor.range[4]){
+            rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col =
+            a[59])} else if(all.cor>=cor.range[3]){
+            rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col =
+            a[76])} else if(all.cor>=cor.range[2]){
+            rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col =
+            a[382])}
+          r<-max(all.cor)
+               cex.cor=3
+         txt <- format(c(r, 0.123456789), digits=digits)[1]
+          txt <- paste(prefix, txt, sep="")
+           #if(missing(cex.cor)) cex.cor <- 1.2/strwidth(txt)
+         
+              txt2=""
+            if(max(all.cor)>cor.range[2]){
+            if(spear==max(all.cor) && spear!=cor(x,y,use="pairwise.complete.obs")) {txt2 <- " s"
+              } else if(ken==max(all.cor) && ken!=cor(x,y,use="pairwise.complete.obs")){
+              txt2 <-" k"
+              }
+
+         }
+          text(0.5, 0.5, txt, cex = .7+cex.cor * (r-min(cor.range))/(max(cor.range)-min(cor.range)))
+          text(.9,.1,txt2,cex=1.5)   
+         }
+         
+#   #Find a new unique file name (one in the desired directory that hasn't yet been used)
+#   outfile <- paste(output.dir,"Predictor_Correlation.pdf",sep="\\")
+#             while(file.access(outfile)==0) outfile<-paste(output.dir,"Predictor_Correlation.pdf",sep="\\")
+# 
+#  options(warn=-1)
+#   pdf(outfile,width=11,height=9,onefile=T)
+#     MyPairs(HighToPlot,cor.range=cor.range,my.labels=(as.vector(High.cor)[1:num.plots]),
+#     lower.panel=panel.smooth,diag.panel=panel.hist, upper.panel=panel.cor,pch=21,bg = c("red","steelblue")[as.factor(response)],col.smooth = "red")
+#   graphics.off()
+#  options(warn=0)
+#  
+#   }
+
+  
+  #Find a new unique file name (one in the desired directory that hasn't yet been used)
+
+ options(warn=-1)
+ if(Debug==FALSE) jpeg(output.file,width=1000,height=1000,pointsize=13)
+    MyPairs(cbind(TrueResponse,HighToPlot),cor.range=cor.range,my.labels=(as.vector(High.cor)[1:num.plots]),
+    lower.panel=panel.smooth,diag.panel=panel.hist, upper.panel=panel.cor,pch=21,bg = c("green","red","yellow")[factor(response,levels=c(0,1,-9999))],col.smooth = "red")
+
+ if(Debug==FALSE) graphics.off()
+ options(warn=0)
+ 
+  }
+
+MyPairs<-function (x,my.labels,labels, panel = points, ..., lower.panel = panel,
+    upper.panel = panel, diag.panel = NULL, text.panel = textPanel,
+    label.pos = 0.5 + has.diag/3, cex.labels = NULL, font.labels = 1,
+    row1attop = TRUE, gap = 1,Toplabs=NULL)
+{
+    response<-x[,1]
+    response[response==-9999]<-0
+    x<-x[,2:dim(x)[2]]
+
+    textPanel <- function(x = 0.5, y = 0.5, txt, cex, font) text(x,
+        y, txt, cex = cex, font = font)
+    localAxis <- function(side, x, y, xpd, bg, col = NULL, main,
+        oma, ...) {
+        if (side%%2 == 1)
+            Axis(x, side = side, xpd = NA, ...)
+        else Axis(y, side = side, xpd = NA, ...)
+    }
+    localPlot <- function(..., main, oma, font.main, cex.main) plot(...)
+    localLowerPanel <- function(..., main, oma, font.main, cex.main) lower.panel(...)
+    localUpperPanel <- function(..., main, oma, font.main, cex.main) upper.panel(...)
+    localDiagPanel <- function(..., main, oma, font.main, cex.main) diag.panel(...)
+    dots <- list(...)
+    nmdots <- names(dots)
+    if (!is.matrix(x)) {
+        x <- as.data.frame(x)
+        for (i in seq_along(names(x))) {
+            if (is.factor(x[[i]]) || is.logical(x[[i]]))
+                x[[i]] <- as.numeric(x[[i]])
+            if (!is.numeric(unclass(x[[i]])))
+                stop("non-numeric argument to 'pairs'")
+        }
+    } else if (!is.numeric(x))
+        stop("non-numeric argument to 'pairs'")
+    panel <- match.fun(panel)
+    if ((has.lower <- !is.null(lower.panel)) && !missing(lower.panel))
+        lower.panel <- match.fun(lower.panel)
+    if ((has.upper <- !is.null(upper.panel)) && !missing(upper.panel))
+        upper.panel <- match.fun(upper.panel)
+    if ((has.diag <- !is.null(diag.panel)) && !missing(diag.panel))
+        diag.panel <- match.fun(diag.panel)
+    if (row1attop) {
+        tmp <- lower.panel
+        lower.panel <- upper.panel
+        upper.panel <- tmp
+        tmp <- has.lower
+        has.lower <- has.upper
+        has.upper <- tmp
+    }
+    nc <- ncol(x)
+    if (nc < 2)
+        stop("only one column in the argument to 'pairs'")
+    has.labs <- TRUE
+    if (missing(labels)) {
+        labels <- colnames(x)
+        if (is.null(labels))
+            labels <- paste("var", 1L:nc)
+    }
+    else if (is.null(labels))
+        has.labs <- FALSE
+    oma <- if ("oma" %in% nmdots)
+        dots$oma
+    else NULL
+    main <- if ("main" %in% nmdots)
+        dots$main
+    else NULL
+    if (is.null(oma)) {
+        oma <- c(4, 4, 4, 4)
+        if (!is.null(main))
+            oma[3L] <- 6
+    }
+
+    nCol<-ifelse(length(unique(response))>1,nc+1,nc)
+    j.start<-ifelse(length(unique(response))>1,0,1)
+    opar <- par(mfrow = c(nc, nCol), mar = rep.int(gap/2, 4), oma = oma)
+    on.exit(par(opar))
+    for (i in if (row1attop)
+        1L:(nc)
+    else nc:1L) for (j in j.start:(nc)) {
+
+
+        if(i==1){ par(mar = c(gap/2,gap/2,gap,gap/2)) #top row add extra room at top
+          if(j==0){
+                par(mar = c(gap/2,gap,gap,gap)) #top left corner room at top and on right
+          localPlot(x[, i],response, xlab = "", ylab = "", axes = FALSE,
+                type="n",...)
+                }else if(j==1) {par(mar = c(gap/2,gap,gap,gap/2)) #extra room on left and topfor second plot top row
+                    localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)} else  {
+           par(mar = c(gap/2,gap/2,gap,gap/2)) #all other top row plots need extra room at top only
+           localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)
+           }}else { par(mar = rep.int(gap/2, 4))
+               if(j==0){ par(mar = c(gap/2,gap,gap/2,gap))  #left column needs extra room on right only
+               localPlot(x[, i],response, xlab = "", ylab = "", axes = FALSE,
+                type="n",...)
+                }else if(j==1){ par(mar = c(gap/2,gap,gap/2,gap/2)) #second column needs extra room on left so labels fit
+                localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)
+        }else localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)}
+         if(j==0) {
+             if(i==1) par(mar=c(gap/2,gap,gap,gap))
+                else par(mar = c(gap/2,gap,gap/2,gap))
+
+                  if(i==1) title(main="Response",line=.04,cex.main=1.5)
+
+                  box()
+                     my.lab<-paste("cor=",round(max(abs(cor(x[,(i)],response,use="pairwise.complete.obs")),abs(cor(x[,(i)],response,method="spearman",use="pairwise.complete.obs")),
+                     abs(cor(x[,(i)],response,method="kendall",use="pairwise.complete.obs"))),digits=2),sep="")
+
+                  #panel smooth doesn't work for two reasons: one, the response is binary and it requires more than two unique values
+                  #second I don't think it can use weights which is necessary with an overwhelming amount of background points so that presnce points
+                  #can't be viewed
+                  #panel.smooth(as.vector(x[, (i)]), as.vector(jitter(response,factor=.1)),weights=
+                  #        c(rep(table(response)[2]/table(response)[1],times=table(response)[1]),rep(1,times=table(response)[2])),...)
+
+                   if(length(unique(response))>2) panel.smooth(as.vector(x[, (i)]), as.vector(response),...)
+                   else my.panel.smooth(as.vector(x[, (i)]), as.vector(response),weights=
+                          c(rep(table(response)[2]/table(response)[1],times=table(response)[1]),rep(1,times=table(response)[2])),...)
+                          
+                          title(ylab=paste("cor=",round(max(abs(cor(x[,(i)],response,use="pairwise.complete.obs")),
+                          abs(cor(x[,(i)],response,method="spearman",use="pairwise.complete.obs")),abs(cor(x[,(i)],response,method="kendall",use="pairwise.complete.obs"))),digits=2),
+                          sep=""),line=.02,cex.lab=1.5)
+                          #,y=.85,x=max(x[,(i)])-.2*diff(range(x[,(i)])),cex=1.5)
+
+                 } else{
+        if (i == j || (i < j && has.lower) || (i > j && has.upper)) {
+            box()
+            if(i==1) title(main=paste("Total Cor=",my.labels[j],sep=""),line=.04,cex.main=1.5)
+            #if (i == 1 && (!(j%%2) || !has.upper || !has.lower))
+             #   localAxis(1 + 2 * row1attop, x[, j], x[, i],
+             #   ...)
+            if (i == nc)
+                localAxis(3 - 2 * row1attop, x[, j], x[, i],
+                  ...)
+            if (j == 1 && (i!=1 || !has.upper || !has.lower))
+                localAxis(2, x[, j], x[, i], ...)
+            #if (j == nc && (i%%2 || !has.upper || !has.lower))
+            #    localAxis(4, x[, j], x[, i], ...)
+            mfg <- par("mfg")
+            if (i == j) {
+                if (has.diag)
+                  localDiagPanel(as.vector(x[, i]),...)
+                if (has.labs) {
+                  par(usr = c(0, 1, 0, 1))
+                  if (is.null(cex.labels)) {
+                    l.wid <- strwidth(labels, "user")
+                    cex.labels <- max(0.8, min(2, 0.9/max(l.wid)))
+                  }
+
+                  text.panel(0.5, label.pos, labels[i], cex = cex.labels,
+                    font = font.labels)
+                }
+            }
+
+            else if (i < j)
+                  if(length(unique(x[,i])>2)){
+                  localLowerPanel(as.vector(x[, j]), as.vector(x[,
+                    i]), ...) } else {
+                      my.panel.smooth(as.vector(x[, j]),as.vector(x[,i]))
+                    }
+                  
+            else localUpperPanel(as.vector(x[, j]), as.vector(x[,
+                i]), ...)
+            if (any(par("mfg") != mfg))
+                stop("the 'panel' function made a new plot")
+        }
+        else par(new = FALSE)
+    }}
+    if (!is.null(main)) {
+        font.main <- if ("font.main" %in% nmdots)
+            dots$font.main
+        else par("font.main")
+        cex.main <- if ("cex.main" %in% nmdots)
+            dots$cex.main
+        else par("cex.main")
+        mtext(main, 3, 3, TRUE, 0.5, cex = cex.main, font = font.main)
+    }
+    invisible(NULL)
+}
+
+
+my.panel.smooth<-function (x, y, col = par("col"), bg = NA, pch = par("pch"),
+    cex = 1, col.smooth = "red", span = 2/3, iter = 3, weights=rep(1,times=length(y)), ...)
+{
+    o<-order(x)
+    points(x, y, pch = pch, col = col, bg = bg, cex = cex)
+    ok <- is.finite(x) & is.finite(y)
+    if (any(ok) && length(unique(x))>3)
+    lines(lowess(x[o],y[o],iter=0),col="red")
+        #lines(smooth.spline(x,w=weights,jitter(y,amount=(max(y)-min(y))/100),nknots=min(length(unique(x)),4)),col="red")
+
+}
+
+
+Args <- commandArgs(T)
+    print(Args)
+    #assign default values
+    num.plots <- 10
+    min.cor <- .7
+    responseCol <- "ResponseBinary"
+    cors.w.highest <- FALSE
+    pres=TRUE
+    absn=TRUE
+    bgd=TRUE
+    #replace the defaults with passed values
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="p") num.plots <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="m") min.cor <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output.file <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="i") infile <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="core") cors.w.highest <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="pres") pres <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="absn") absn <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="bgd") bgd <- argSplit[[1]][2]
+    }
+
+    print(num.plots)
+    print(min.cor)
+    print(output.file)
+    print (infile)
+    print(responseCol)
+    print(cors.w.highest)
+    print(pres)
+    print(absn)
+    print(bgd)
+    
+	#Run the Pairs Explore function with these parameters
+    Pairs.Explore(num.plots=num.plots,
+    min.cor=min.cor,
+    input.file=infile,
+		output.file=output.file,
+		response.col=responseCol,
+		cors.w.highest=cors.w.highest,
+		pres,
+		absn,
+		bgd)
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/PairsExplore2.r b/contrib/sahm/pySAHM/Resources/R_Modules/PairsExplore2.r
new file mode 100644
index 0000000..156e158
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/PairsExplore2.r
@@ -0,0 +1,430 @@
+Pairs.Explore<-function(num.plots=5,min.cor=.7,input.file,output.file,response.col="ResponseBinary",cors.w.highest=FALSE,pres=TRUE,absn=TRUE,bgd=TRUE,Debug=FALSE){
+
+
+      #num.plots=plots per page of display
+      #min.cor=the minimum correlation to be included in determining which set of predictors to display
+      #input.file=a csv assumed to have the new vistrails form with the first several rows specifiying where to find tiffs
+      #   and which columns to include in analysis
+      #output.file=...
+      #response.col=name of response column to be removed and used elsewhere
+    #modifications
+      #5/10/2011 altered to handle count data as well presence absence.
+      #any counts higher than or equal to 1 are set to be presence though I might consider
+      #adding the option to have a threshold set instead of using just presence/absence
+
+
+      absn<-as.logical(absn)
+      pres<-as.logical(pres)
+      bgd<-as.logical(bgd)
+      cors.w.highest<-as.logical(cors.w.highest)
+      
+   #Read input data and remove any columns to be excluded
+    dat<-read.csv(input.file,skip=3,header=FALSE)
+
+          hl<-readLines(input.file,1)
+          hl=strsplit(hl,',')
+          colnames(dat) = hl[[1]]
+
+          tif.info<-readLines(input.file,3)
+          tif.info<-strsplit(tif.info,',')
+          include<-(as.numeric(tif.info[[2]]))
+
+  #Remove coordinates, response column, site.weights
+  #before exploring predictor relationship
+    rm.cols <- as.vector(na.omit(c(match("x",tolower(names(dat))),match("y",tolower(names(dat))),
+    match("site.weights",tolower(names(dat))),match(tolower(response.col),tolower(names(dat))),match("Split",names(dat)))))
+
+     #remove testing split
+    if(!is.na(match("Split",names(dat)))) dat<-dat[-c(which(dat$Split=="test"),arr.ind=TRUE),]
+
+    include[is.na(include)]<-0
+    rm.cols<-unique(c(rm.cols,which(include==0,arr.ind=TRUE)))
+    response<-dat[,match(tolower(response.col),tolower(names(dat)))]
+
+       dat<-dat[order(response),]
+       response<-response[order(response)]
+
+       #for the purpose of the pairs plot, taking all counts greater than 1 and setting them equal to presence
+       #this is never exported
+      if(response.col=="responseCount") {response[response>=1]<-1
+      }
+      
+    #remove any of pres absn or bgd that aren't desired
+     temp<-c(0,1,-9999)
+     temp<-temp[c(absn,pres,bgd)]
+     dat<-dat[response%in%temp,]
+     response<-response[response%in%temp]
+
+
+     if(sum(response==-9999)>1000){
+      s<-sample(which(response==-9999,arr.ind=TRUE),size=(sum(response==-9999)-1000))
+      dat<-dat[-c(s),]
+      response<-response[-c(s)]
+    }
+
+   if (response.col=="responseCount") {
+    TrueResponse<-dat[,match(tolower(response.col),tolower(names(dat)))]
+    } else TrueResponse<-response
+
+    #now remove all columns except predictors
+    dat<-dat[-rm.cols]
+     dat[dat==-9999]<-NA
+    #dat<-dat[1:2000,]
+  #Remove columns with only one unique value
+      varr <- function(x) var(x,na.rm=TRUE)
+      
+    dat<-try(dat[,as.vector(apply(dat,2,varr)==0)!=1],silent=TRUE)
+    if(class(dat)=="try-error") stop("mds file contains nonnumeric columns please remove and continue")
+  #record correlations for later plots
+
+    cmat<-cor(dat,use="pairwise.complete.obs")
+    smat<-cor(dat,method="spearman",use="pairwise.complete.obs")
+    if(dim(dat)[1]<2000){
+    kmat<-cor(dat,method="kendall",use="pairwise.complete.obs")}
+    else {s<-sample(seq(1:dim(dat)[1]),size=2000,replace=FALSE)
+     kmat<-cor(dat[s,],method="kendall",use="pairwise.complete.obs")
+    }
+    
+    cmat=pmax(abs(cmat),abs(smat),abs(kmat),na.rm=TRUE)
+    
+    High.cor<-sort(apply(abs(cmat)>min.cor,2,sum)-1,decreasing=TRUE)
+
+  #take the top num.plots to put in the pairs plot or if the looking at a single
+  #predictor and other predictors it's correlated with, take the top num.plots-1
+  #of those with which it is correlated
+    {if(cors.w.highest==FALSE){
+    HighToPlot<-dat[,match(names(High.cor),names(dat))[1:min(num.plots,length(High.cor))]]
+      }else{
+          #take the column of the correlation matrix corresponding to the
+          #predictor with the higest number of total correlations record the names
+          #of the predictors that are correlated with this one predictor
+          temp<-cmat[rownames(cmat)==names(High.cor[1]),]
+          CorWHigh<-temp[abs(cmat[,colnames(cmat)==names(High.cor[1])])>min.cor]
+
+          #record counts of total number of correlations with all predictors for those
+          #predictors that are highly correlated with the Highest predictor
+          High.cor<-sort(High.cor[names(CorWHigh)],decreasing=TRUE)
+          HighToPlot<-dat[,match(names(High.cor),names(dat))[1:min(num.plots,length(High.cor))]]
+          }}
+              cor.hightoplot<-abs(cor(HighToPlot,use="pairwise.complete.obs"))
+              diag(cor.hightoplot)<-0
+    cor.range<-c(quantile(as.vector(cor.hightoplot),probs=c(0,.5,.7,.85)),1)
+
+  ## put histograms on the diagonal
+    panel.hist <- function(x, ...)
+    {
+        usr <- par("usr"); on.exit(par(usr))
+        par(usr = c(usr[1:2], 0, 1.5) )
+        h <- hist(x, plot = FALSE)
+        breaks <- h$breaks; nB <- length(breaks)
+        y <- h$counts; y <- y/max(y)
+        rect(breaks[-nB], 0, breaks[-1], y, col="steelblue", ...)
+
+    }
+
+
+  ## put (absolute) correlations on the upper panels,
+  ## with size proportional to the correlations.
+      panel.cor <- function(x, y, digits=2, prefix="", cor.range,cex.cor, ...)
+      {
+      a<-colors()
+          usr <- par("usr"); on.exit(par(usr))
+          par(usr = c(0, 1, 0, 1))
+          r <- abs(cor(x, y,use="pairwise.complete.obs"))
+          spear<-abs(cor(x,y,method="spearman",use="pairwise.complete.obs"))
+          ken<- abs(cor(x,y,method="kendall",use="pairwise.complete.obs"))
+          all.cor<-max(r,spear,ken)
+          #range.seq<-seq(from=cor.range[1],to=cor.range[2],length=20)
+          if(all.cor>=cor.range[4]){
+            rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col =
+            a[59])} else if(all.cor>=cor.range[3]){
+            rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col =
+            a[76])} else if(all.cor>=cor.range[2]){
+            rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col =
+            a[382])}
+          r<-max(all.cor)
+               cex.cor=3
+         txt <- format(c(r, 0.123456789), digits=digits)[1]
+          txt <- paste(prefix, txt, sep="")
+           #if(missing(cex.cor)) cex.cor <- 1.2/strwidth(txt)
+         
+              txt2=""
+            if(max(all.cor)>cor.range[2]){
+            if(spear==max(all.cor) && spear!=cor(x,y,use="pairwise.complete.obs")) {txt2 <- " s"
+              } else if(ken==max(all.cor) && ken!=cor(x,y,use="pairwise.complete.obs")){
+              txt2 <-" k"
+              }
+
+         }
+          text(0.5, 0.5, txt, cex = .7+cex.cor * (r-min(cor.range))/(max(cor.range)-min(cor.range)))
+          text(.9,.1,txt2,cex=1.5)   
+         }
+         
+#   #Find a new unique file name (one in the desired directory that hasn't yet been used)
+#   outfile <- paste(output.dir,"Predictor_Correlation.pdf",sep="\\")
+#             while(file.access(outfile)==0) outfile<-paste(output.dir,"Predictor_Correlation.pdf",sep="\\")
+# 
+#  options(warn=-1)
+#   pdf(outfile,width=11,height=9,onefile=T)
+#     MyPairs(HighToPlot,cor.range=cor.range,my.labels=(as.vector(High.cor)[1:num.plots]),
+#     lower.panel=panel.smooth,diag.panel=panel.hist, upper.panel=panel.cor,pch=21,bg = c("red","steelblue")[as.factor(response)],col.smooth = "red")
+#   graphics.off()
+#  options(warn=0)
+#  
+#   }
+
+  
+  #Find a new unique file name (one in the desired directory that hasn't yet been used)
+
+ options(warn=-1)
+ if(Debug==FALSE) jpeg(output.file,width=1000,height=1000,pointsize=13)
+    MyPairs(cbind(TrueResponse,HighToPlot),cor.range=cor.range,my.labels=(as.vector(High.cor)[1:num.plots]),
+    lower.panel=panel.smooth,diag.panel=panel.hist, upper.panel=panel.cor,pch=21,bg = c("green","red","yellow")[factor(response,levels=c(0,1,-9999))],col.smooth = "red")
+
+ if(Debug==FALSE) graphics.off()
+ options(warn=0)
+ 
+  }
+
+MyPairs<-function (x,my.labels,labels, panel = points, ..., lower.panel = panel,
+    upper.panel = panel, diag.panel = NULL, text.panel = textPanel,
+    label.pos = 0.5 + has.diag/3, cex.labels = NULL, font.labels = 1,
+    row1attop = TRUE, gap = 1,Toplabs=NULL)
+{
+    response<-x[,1]
+    response[response==-9999]<-0
+    x<-x[,2:dim(x)[2]]
+
+    textPanel <- function(x = 0.5, y = 0.5, txt, cex, font) text(x,
+        y, txt, cex = cex, font = font)
+    localAxis <- function(side, x, y, xpd, bg, col = NULL, main,
+        oma, ...) {
+        if (side%%2 == 1)
+            Axis(x, side = side, xpd = NA, ...)
+        else Axis(y, side = side, xpd = NA, ...)
+    }
+    localPlot <- function(..., main, oma, font.main, cex.main) plot(...)
+    localLowerPanel <- function(..., main, oma, font.main, cex.main) lower.panel(...)
+    localUpperPanel <- function(..., main, oma, font.main, cex.main) upper.panel(...)
+    localDiagPanel <- function(..., main, oma, font.main, cex.main) diag.panel(...)
+    dots <- list(...)
+    nmdots <- names(dots)
+    if (!is.matrix(x)) {
+        x <- as.data.frame(x)
+        for (i in seq_along(names(x))) {
+            if (is.factor(x[[i]]) || is.logical(x[[i]]))
+                x[[i]] <- as.numeric(x[[i]])
+            if (!is.numeric(unclass(x[[i]])))
+                stop("non-numeric argument to 'pairs'")
+        }
+    } else if (!is.numeric(x))
+        stop("non-numeric argument to 'pairs'")
+    panel <- match.fun(panel)
+    if ((has.lower <- !is.null(lower.panel)) && !missing(lower.panel))
+        lower.panel <- match.fun(lower.panel)
+    if ((has.upper <- !is.null(upper.panel)) && !missing(upper.panel))
+        upper.panel <- match.fun(upper.panel)
+    if ((has.diag <- !is.null(diag.panel)) && !missing(diag.panel))
+        diag.panel <- match.fun(diag.panel)
+    if (row1attop) {
+        tmp <- lower.panel
+        lower.panel <- upper.panel
+        upper.panel <- tmp
+        tmp <- has.lower
+        has.lower <- has.upper
+        has.upper <- tmp
+    }
+    nc <- ncol(x)
+    if (nc < 2)
+        stop("only one column in the argument to 'pairs'")
+    has.labs <- TRUE
+    if (missing(labels)) {
+        labels <- colnames(x)
+        if (is.null(labels))
+            labels <- paste("var", 1L:nc)
+    }
+    else if (is.null(labels))
+        has.labs <- FALSE
+    oma <- if ("oma" %in% nmdots)
+        dots$oma
+    else NULL
+    main <- if ("main" %in% nmdots)
+        dots$main
+    else NULL
+    if (is.null(oma)) {
+        oma <- c(4, 4, 4, 4)
+        if (!is.null(main))
+            oma[3L] <- 6
+    }
+
+    nCol<-ifelse(length(unique(response))>1,nc+1,nc)
+    j.start<-ifelse(length(unique(response))>1,0,1)
+    opar <- par(mfrow = c(nc, nCol), mar = rep.int(gap/2, 4), oma = oma)
+    on.exit(par(opar))
+    for (i in if (row1attop)
+        1L:(nc)
+    else nc:1L) for (j in j.start:(nc)) {
+
+
+        if(i==1){ par(mar = c(gap/2,gap/2,gap,gap/2)) #top row add extra room at top
+          if(j==0){
+                par(mar = c(gap/2,gap,gap,gap)) #top left corner room at top and on right
+          localPlot(x[, i],response, xlab = "", ylab = "", axes = FALSE,
+                type="n",...)
+                }else if(j==1) {par(mar = c(gap/2,gap,gap,gap/2)) #extra room on left and topfor second plot top row
+                    localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)} else  {
+           par(mar = c(gap/2,gap/2,gap,gap/2)) #all other top row plots need extra room at top only
+           localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)
+           }}else { par(mar = rep.int(gap/2, 4))
+               if(j==0){ par(mar = c(gap/2,gap,gap/2,gap))  #left column needs extra room on right only
+               localPlot(x[, i],response, xlab = "", ylab = "", axes = FALSE,
+                type="n",...)
+                }else if(j==1){ par(mar = c(gap/2,gap,gap/2,gap/2)) #second column needs extra room on left so labels fit
+                localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)
+        }else localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE,
+           type="n",...)}
+         if(j==0) {
+             if(i==1) par(mar=c(gap/2,gap,gap,gap))
+                else par(mar = c(gap/2,gap,gap/2,gap))
+
+                  if(i==1) title(main="Response",line=.04,cex.main=1.5)
+
+                  box()
+                     my.lab<-paste("cor=",round(max(abs(cor(x[,(i)],response,use="pairwise.complete.obs")),abs(cor(x[,(i)],response,method="spearman",use="pairwise.complete.obs")),
+                     abs(cor(x[,(i)],response,method="kendall",use="pairwise.complete.obs"))),digits=2),sep="")
+
+                  #panel smooth doesn't work for two reasons: one, the response is binary and it requires more than two unique values
+                  #second I don't think it can use weights which is necessary with an overwhelming amount of background points so that presnce points
+                  #can't be viewed
+                  #panel.smooth(as.vector(x[, (i)]), as.vector(jitter(response,factor=.1)),weights=
+                  #        c(rep(table(response)[2]/table(response)[1],times=table(response)[1]),rep(1,times=table(response)[2])),...)
+
+                   if(length(unique(response))>2) panel.smooth(as.vector(x[, (i)]), as.vector(response),...)
+                   else my.panel.smooth(as.vector(x[, (i)]), as.vector(response),weights=
+                          c(rep(table(response)[2]/table(response)[1],times=table(response)[1]),rep(1,times=table(response)[2])),...)
+                          
+                          title(ylab=paste("cor=",round(max(abs(cor(x[,(i)],response,use="pairwise.complete.obs")),
+                          abs(cor(x[,(i)],response,method="spearman",use="pairwise.complete.obs")),abs(cor(x[,(i)],response,method="kendall",use="pairwise.complete.obs"))),digits=2),
+                          sep=""),line=.02,cex.lab=1.5)
+                          #,y=.85,x=max(x[,(i)])-.2*diff(range(x[,(i)])),cex=1.5)
+
+                 } else{
+        if (i == j || (i < j && has.lower) || (i > j && has.upper)) {
+            box()
+            if(i==1) title(main=paste("Total Cor=",my.labels[j],sep=""),line=.04,cex.main=1.5)
+            #if (i == 1 && (!(j%%2) || !has.upper || !has.lower))
+             #   localAxis(1 + 2 * row1attop, x[, j], x[, i],
+             #   ...)
+            if (i == nc)
+                localAxis(3 - 2 * row1attop, x[, j], x[, i],
+                  ...)
+            if (j == 1 && (i!=1 || !has.upper || !has.lower))
+                localAxis(2, x[, j], x[, i], ...)
+            #if (j == nc && (i%%2 || !has.upper || !has.lower))
+            #    localAxis(4, x[, j], x[, i], ...)
+            mfg <- par("mfg")
+            if (i == j) {
+                if (has.diag)
+                  localDiagPanel(as.vector(x[, i]),...)
+                if (has.labs) {
+                  par(usr = c(0, 1, 0, 1))
+                  if (is.null(cex.labels)) {
+                    l.wid <- strwidth(labels, "user")
+                    cex.labels <- max(0.8, min(2, 0.9/max(l.wid)))
+                  }
+
+                  text.panel(0.5, label.pos, labels[i], cex = cex.labels,
+                    font = font.labels)
+                }
+            }
+
+            else if (i < j)
+                  if(length(unique(x[,i])>2)){
+                  localLowerPanel(as.vector(x[, j]), as.vector(x[,
+                    i]), ...) } else {
+                      my.panel.smooth(as.vector(x[, j]),as.vector(x[,i]))
+                    }
+                  
+            else localUpperPanel(as.vector(x[, j]), as.vector(x[,
+                i]), ...)
+            if (any(par("mfg") != mfg))
+                stop("the 'panel' function made a new plot")
+        }
+        else par(new = FALSE)
+    }}
+    if (!is.null(main)) {
+        font.main <- if ("font.main" %in% nmdots)
+            dots$font.main
+        else par("font.main")
+        cex.main <- if ("cex.main" %in% nmdots)
+            dots$cex.main
+        else par("cex.main")
+        mtext(main, 3, 3, TRUE, 0.5, cex = cex.main, font = font.main)
+    }
+    invisible(NULL)
+}
+
+
+my.panel.smooth<-function (x, y, col = par("col"), bg = NA, pch = par("pch"),
+    cex = 1, col.smooth = "red", span = 2/3, iter = 3, weights=rep(1,times=length(y)), ...)
+{
+    o<-order(x)
+    points(x, y, pch = pch, col = col, bg = bg, cex = cex)
+    ok <- is.finite(x) & is.finite(y)
+    if (any(ok) && length(unique(x))>3)
+    lines(lowess(x[o],y[o],iter=0),col="red")
+        #lines(smooth.spline(x,w=weights,jitter(y,amount=(max(y)-min(y))/100),nknots=min(length(unique(x)),4)),col="red")
+
+}
+
+
+Args <- commandArgs(T)
+    print(Args)
+    #assign default values
+    num.plots <- 10
+    min.cor <- .7
+    responseCol <- "ResponseBinary"
+    cors.w.highest <- FALSE
+    pres=TRUE
+    absn=TRUE
+    bgd=TRUE
+    #replace the defaults with passed values
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="p") num.plots <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="m") min.cor <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output.file <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="i") infile <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="core") cors.w.highest <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="pres") pres <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="absn") absn <- argSplit[[1]][2]
+      if(argSplit[[1]][1]=="bgd") bgd <- argSplit[[1]][2]
+    }
+
+    print(num.plots)
+    print(min.cor)
+    print(output.file)
+    print (infile)
+    print(responseCol)
+    print(cors.w.highest)
+    print(pres)
+    print(absn)
+    print(bgd)
+    
+	#Run the Pairs Explore function with these parameters
+    Pairs.Explore(num.plots=num.plots,
+    min.cor=min.cor,
+    input.file=infile,
+		output.file=output.file,
+		response.col=responseCol,
+		cors.w.highest=cors.w.highest,
+		pres,
+		absn,
+		bgd)
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Pred.Surface.r b/contrib/sahm/pySAHM/Resources/R_Modules/Pred.Surface.r
new file mode 100644
index 0000000..a138e82
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Pred.Surface.r
@@ -0,0 +1,54 @@
+Pred.Surface<-function(object, model, filename="", na.rm=TRUE,NAval) {
+    predrast <- raster(object)
+		filename <- trim(filename)
+			firstrow <- 1
+			firstcol <- 1
+		ncols <- ncol(predrast)
+		lyrnames <- layerNames(object)
+		xylyrnames <- c('x', 'y', lyrnames)
+		v <- matrix(NA, ncol=nrow(predrast), nrow=ncol(predrast))
+      na.rm <- FALSE
+		tr <- blockSize(predrast, n=nlayers(object)+3)
+		ablock <- 1:(ncol(object) * tr$nrows[1])
+		napred <- rep(NA, ncol(predrast)*tr$nrows[1])
+  	predrast <- writeStart(predrast, filename=filename,overwrite=TRUE)
+  ############################################################
+  	for (i in 1:tr$n) {
+			if (i==tr$n) { 
+				ablock <- 1:(ncol(object) * tr$nrows[i])
+				napred <- rep(NA, ncol(predrast) * tr$nrows[i])
+			}
+			rr <- firstrow + tr$row[i] - 1
+				p <- xyFromCell(predrast, ablock + (tr$row[i]-1) * ncol(predrast)) 
+				p <- na.omit(p)
+				blockvals <- data.frame(x=p[,1], y=p[,2])
+        if (na.rm) {
+					blockvals <- na.omit(blockvals)		
+				}
+    if (nrow(blockvals) == 0 ) {
+					predv <- napred
+				} else {
+
+				predv <- predict(model, blockvals)
+				predv[is.na(predv)]<-NAval
+   	}
+				if (na.rm) {  
+					naind <- as.vector(attr(blockvals, "na.action"))
+					if (!is.null(naind)) {
+						p <- napred
+						p[-naind] <- predv
+						predv <- p
+						rm(p)
+					}
+				}
+
+				# to change factor to numeric; should keep track of this to return a factor type RasterLayer
+				predv = as.numeric(predv)
+				predrast <- writeValues(predrast, predv, tr$row[i])
+				NAvalue(predrast)<-NAval
+			}
+	predrast <- writeStop(predrast)
+	a<-readGDAL(predrast at file@name)
+    writeGDAL(a,predrast at file@name, drivername = "GTiff",setStatistics=TRUE,mvFlag=NAval)
+		return(predrast)
+	}
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/PredictModel.r b/contrib/sahm/pySAHM/Resources/R_Modules/PredictModel.r
new file mode 100644
index 0000000..69383fe
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/PredictModel.r
@@ -0,0 +1,331 @@
+PredictModel<-function(workspace=NULL,new.tifs=NULL,out.dir=NULL,thresh=NULL,make.btif=NULL,make.ptif=NULL){
+
+#This functions separates the step of model fit from producing probability or binary surfaces
+#the default is to read in a workspace and make predictions using the original tiffs supplied
+#but if an mds with new tiff directories are supplied, the function will instead use these
+#options are available for setting the threshold
+#and true and false for whether to make binary or prob.tif
+
+#my stuff to delete
+#workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\")
+#new.tifs<-out$input$ma.name
+#end delete
+
+    load(workspace)
+
+    if(!is.null(new.tifs)){
+
+              ma.name <- new.tifs
+                  #get the paths off of the new mds file
+                      tif.info<-readLines(ma.name,3)
+                      tif.info<-strsplit(tif.info,',')
+                      include<-(as.numeric(tif.info[[2]]))
+                      paths<-as.character(tif.info[[3]])
+
+              paths<-paths[paths!=""]
+            #this line needs to be changed eventually to deal with locations of model fit covaries from different models
+            if(out$input$model.source.file=="brt.r") {model.covs<-levels(summary(out$mods$final.mod,plotit=FALSE)[,1])
+            pred.fct=brt.predict
+            }
+
+            ma.cols <- match(model.covs,sub(".tif","",basename(paths)))
+            paths<-paths[ma.cols]
+            #checking that all tifs are present
+            if(any(is.na(ma.cols))){
+
+                              stop("ERROR: the following geotiff(s) are missing in ",
+                                    tif.dir,":  ",paste(ma.names[-r.col][is.na(ma.cols)],collapse=" ,"),sep="")
+                            }
+            #checking that we have read access to all tiffs
+             if(sum(file.access(paths),mode=0)!=0){
+                              stop("ERROR: the following geotiff(s) are missing : ",
+                                    paths[(file.access(paths)!=0),][1],sep="")
+
+                            }
+                            out$dat$tif.ind<-paths
+      }
+
+    if(out$input$model.source.file=="rf.r")   {
+        pred.fct=rf.predict
+        library(randomForest)
+        }
+    if(out$input$model.source.file=="mars.r") {
+        pred.fct=pred.mars
+        library(mda)
+        }
+    if(out$input$model.source.file=="glm.r")  pred.fct=glm.predict
+    if(out$input$model.source.file=="brt.r")  {
+        pred.fct=brt.predict
+        library(gbm)
+    }
+    
+    if(!is.null(thresh))out$mods$auc.output$thresh<-thresh
+    if(!is.null(make.btif)) make.binary.tif<-make.btif
+    if(!is.null(make.ptif)) make.p.tif<-make.ptif
+
+
+       assign("Pred.Surface",Pred.Surface,envir=.GlobalEnv)
+      mssg <- proc.tiff(model=out$mods$final.mod,vnames=as.character(out$mods$final.mod$contributions$var),
+                  tif.dir=out$dat$tif.dir$dname,filenames=out$dat$tif.ind,pred.fct=pred.fct,factor.levels=out$dat$ma$factor.levels,make.binary.tif=make.binary.tif,
+                  thresh=out$mods$auc.output$thresh,make.p.tif=make.p.tif,outfile.p=paste(out.dir,"prob_map.tif",sep="\\"),
+                  outfile.bin=paste(out.dir,"bin_map.tif",sep="\\"),tsize=50.0,NAval=-3000,logname=logname,out=out)
+
+
+}
+
+brt.predict <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictions from complete data only #
+    #y <- rep(NA,nrow(x))
+    #y[complete.cases(x)] <- predict.gbm(model, x[complete.cases(x),],model$target.trees,type="response")
+
+    # make predictions from full data #
+    y <- predict.gbm(model,x,model$target.trees,type="response")
+    # encode missing values as -1.
+     a<-complete.cases(x)
+    y[!(a)]<- NaN
+
+    # return predictions.
+    return(y)
+    }
+
+pred.mars <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictionss.
+    y <- rep(NA,nrow(x))
+    y[complete.cases(x)] <- as.vector(mars.predict(model,x[complete.cases(x),])$prediction[,1])
+
+#if(sum(is.na(x))/dim(x)[2]!=sum(is.na(y)))
+#h<-is.na(x)
+#h<-apply(h,1,sum)
+#h=h/35
+#f<-is.na(y)
+#which((h-f)!=0,arr.ind=TRUE)
+#b<-cbind(x[which((h-f)!=0,arr.ind=TRUE),],y[which((h-f)!=0,arr.ind=TRUE)])
+
+#which(is.na(y)
+    # encode missing values as -1.
+    y[is.na(y)]<- NaN
+
+    # return predictions.
+    return(y)
+    }
+
+glm.predict <- function(model,x) {
+    # retrieve key items from the global environment #
+    # make predictionss.
+
+    y <- as.vector(predict(model,x,type="response"))
+
+    # encode missing values as -1.
+    y[is.na(y)]<- NaN
+
+    # return predictions.
+    return(y)
+    }
+
+"mars.predict" <-
+function (mars.glm.object,new.data)
+{
+#
+# j leathwick, j elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# calculates a mars/glm object in which basis functions are calculated
+# using an initial mars model with single or multiple responses
+# data for individual species are then fitted as glms using the
+# common set of mars basis functions with results returned as a list
+#
+# takes as input a dataset and args selecting x and y variables, and degree of interaction
+# along with site and species weights, the CV penalty, and the glm family argument
+# the latter would normally be one of "binomial" or "poisson" - "gaussian" could be used
+# but in this case the model shouldn't differ from that fitted using mars on its own
+#
+# naming problem for dataframes fixed - je - 15/12/06
+#
+# requires mda and leathwick/elith's mars.export
+#
+  require(mda)
+
+# first recreate both the original mars model and the glm model
+
+# setup input data and create original temporary data
+
+  dataframe.name <- mars.glm.object$mars.call$dataframe  # get the dataframe name
+  mars.x <- mars.glm.object$mars.call$mars.x
+  mars.y <- mars.glm.object$mars.call$mars.y
+  n.spp <- length(mars.y)
+  family <- mars.glm.object$mars.call$family
+  mars.degree <- mars.glm.object$mars.call$degree
+  penalty <- mars.glm.object$mars.call$penalty
+  site.weights <- mars.glm.object$weights[[1]]
+  spp.weights <- mars.glm.object$weights[[2]]
+
+  print("creating original data frame...",quote=FALSE)
+
+  base.data <- as.data.frame(eval.parent(parse(text = dataframe.name),n=3)) #aks
+
+  x.temp <- eval(base.data[, mars.x])                 #form the temporary datasets
+  base.names <- names(x.temp)
+
+  xdat <- mars.new.dataframe(x.temp)[[1]]
+
+  ydat <- as.data.frame(base.data[, mars.y])
+  names(ydat) <- names(base.data)[mars.y]
+
+  assign("xdat", xdat, pos = 1)               #and assign them for later use
+  assign("ydat", ydat, pos = 1)
+
+# now create the temporary dataframe for the new data
+
+  print("checking variable matching with new data",quote = FALSE)
+
+  new.names <- names(new.data)
+
+  for (i in 1:length(base.names)) {
+
+    name <- base.names[i]
+
+    if (!(name %in% new.names)) {
+      print(paste("Variable ",name," missing from new data",sep=""),quote = FALSE)  #aks
+      return()
+    }
+  }
+
+  print("and creating temporary dataframe for new data...",quote=FALSE)
+
+  selector <- match(names(x.temp),names(new.data))
+
+  pred.dat <- mars.new.dataframe(new.data[,selector])[[1]]
+
+  assign("pred.dat", pred.dat, pos = 1)               #and assign them for later use
+
+# fit the mars model and extract the basis functions
+
+  print(paste("re-fitting initial mars model for",n.spp,"responses"),quote = FALSE)
+  print(paste("using glm family of",family),quote = FALSE)
+
+  #mars.fit <- mars(x = xdat, y = ydat, degree = mars.degree, w = site.weights,
+  #  wp = spp.weights, penalty = penalty)
+
+  mars.fit <- mars.glm.object$mars.object  #AKS
+
+  old.bf.data <- as.data.frame(eval(mars.fit$x))
+  n.bfs <- ncol(old.bf.data)
+  bf.names <- paste("bf", 1:n.bfs, sep = "")
+  old.bf.data <- as.data.frame(old.bf.data[,-1])
+  names(old.bf.data) <- bf.names[-1]
+
+  new.bf.data <- as.data.frame(mda:::model.matrix.mars(mars.fit,pred.dat))
+  new.bf.data <- as.data.frame(new.bf.data[,-1])
+  names(new.bf.data) <- bf.names[-1]
+
+# now cycle through the species fitting glm models
+
+  print("fitting glms for individual responses", quote = F)
+
+  prediction <- as.data.frame(matrix(0, ncol = n.spp, nrow = nrow(pred.dat)))
+  names(prediction) <- names(ydat)
+  standard.errors <- as.data.frame(matrix(0, ncol = n.spp, nrow = nrow(pred.dat)))
+  names(standard.errors) <- names(ydat)
+
+  for (i in 1:n.spp) {
+
+    print(names(ydat)[i], quote = FALSE)
+    model.glm <- glm(ydat[, i] ~ ., data = old.bf.data, weights = site.weights,
+      family = family, maxit = 100)
+    temp <- predict.glm(model.glm,new.bf.data,type="response",se.fit=TRUE)
+    prediction[,i] <- temp[[1]]
+    standard.errors[,i] <- temp[[2]]
+
+    }
+
+  return(list("prediction"=prediction,"ses"=standard.errors))
+}
+
+"mars.new.dataframe" <-
+function (input.data)
+{
+#
+# j leathwick, j elith - August 2006
+#
+# version 3.1 - developed in R 2.3.1 using mda 0.3-1
+#
+# takes an input data frame and checks for factor variables
+# converting these to dummy variables, one each for each factor level
+# returning it for use with mars.glm so that factor vars can be included
+# in a mars analysis
+#
+
+  if (!is.data.frame(input.data)) {
+    print("input data must be a dataframe..",quote = FALSE)
+    return()
+  }
+
+  n <- 1
+  for (i in 1:ncol(input.data)) {  #first transfer the vector variables
+    if (is.vector(input.data[,i])) {
+      if (n == 1) {
+        output.data <- as.data.frame(input.data[,i])
+        names.list <- names(input.data)[i]
+        var.type <- "vector"
+        factor.level <- "na"
+      }
+      else {
+        output.data[,n] <- input.data[,i]
+        names.list <- c(names.list,names(input.data)[i])
+        var.type <- c(var.type,"vector")
+        factor.level <- c(factor.level,"na")
+      }
+      names(output.data)[n] <- names(input.data)[i]
+      n <- n + 1
+    }
+  }
+
+  for (i in 1:ncol(input.data)) {  # and then the factor variables
+    if (is.factor(input.data[,i])) {
+      temp.table <- summary(input.data[,i])
+      for (j in 1:length(temp.table)) {
+        names.list <- c(names.list,names(input.data)[i])
+        var.type <- c(var.type,"factor")
+        factor.level <- c(factor.level,names(temp.table)[j])
+        output.data[,n] <- ifelse(input.data[,i] == names(temp.table)[j],1,0)
+        names(output.data)[n] <- paste(names(input.data)[i],".",names(temp.table)[j],sep="")
+        n <- n + 1
+      }
+    }
+  }
+
+  lineage <- data.frame(names(output.data),names.list,var.type,factor.level)
+  for (i in 1:4) lineage[,i] <- as.character(lineage[,i])
+  names(lineage) <- c("full.name","base.name","type","level")
+
+  return(list(dataframe = output.data, lineage = lineage))
+}
+
+
+
+
+
+new.tifs=NULL
+# Interpret command line argurments #
+# Make Function Call #
+Args <- commandArgs(trailingOnly=FALSE)
+
+    for (i in 1:length(Args)){
+     if(Args[i]=="-f") ScriptPath<-Args[i+1]
+     }
+
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="ws") ws <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="new.tifs") new.tifs <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") out.dir <- argSplit[[1]][2]
+    }
+
+PredictModel(workspace=ws,new.tifs=new.tifs,out.dir=out.dir)
+
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/ResidualImage.r b/contrib/sahm/pySAHM/Resources/R_Modules/ResidualImage.r
new file mode 100644
index 0000000..2d0104d
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/ResidualImage.r
@@ -0,0 +1,42 @@
+resid.image<-function(dev.contrib,pred,raw.dat,x,y,model.type,file.name,out){
+   z<-sign(pred-raw.dat)*dev.contrib
+              a<-loess(z~x*y)
+               x.lim<-rep(seq(from=min(out$dat$ma$train.xy[,1]),to=max(out$dat$ma$train.xy[,1]),length=100),each=100)
+               y.lim<-rep(seq(from=min(out$dat$ma$train.xy[,2]),to=max(out$dat$ma$train.xy[,2]),length=100),times=100)
+              z<-predict(a,newdata=cbind("x"=x.lim,"y"=y.lim))
+              x.lim<-seq(from=min(out$dat$ma$train.xy[,1]),to=max(out$dat$ma$train.xy[,1]),length=100)
+              y.lim<-seq(from=min(out$dat$ma$train.xy[,2]),to=max(out$dat$ma$train.xy[,2]),length=100)
+                 z<-matrix(data=z,ncol=100,nrow=100,byrow=TRUE)
+                # browser()
+                 ########################################### experiment
+                # if(out$input$make.binary.tif==TRUE | out$input$make.p.tif==TRUE){
+                # out$dat$tif.ind[1]
+                # RasterInfo=raster(out$dat$tif.ind[1])
+                #  gi <- GDALinfo(out$dat$tif.ind[1])
+                #    dims <- as.vector(gi)[1:2]
+                #    ps <- as.vector(gi)[6:7]
+                #    ll <- as.vector(gi)[4:5]
+                 #   pref<-attr(gi,"projection")
+
+
+                 # }
+                  
+                  
+                 ##########################################################
+              jpeg(file=paste(file.name,"resid.plot.jpg",sep="/"))
+                 par(oma=c(3,3,3,3))
+                 layout(matrix(data=c(1,2), nrow=1, ncol=2), widths=c(4,1), heights=c(1,1))
+                  image(z,x=x.lim,y=y.lim,col=beachcolours(heightrange=c(min(z),max(z)),sealevel=0,ncolours=length(table(z))),
+                  main="Spatial pattern of deviance residuals\n(magnitude and sign)",xlab="X coordinate",ylab="Y coordinate")
+                  points(x,y,cex=.5)
+                  #image(x=c(1,2),y=sort(unique(z)),z=matrix(data=cbind(rep(sort(unique(z)),times=2)),ncol=2),col=beachcolours(heightrange=c(min(z),max(z)),sealevel=0,ncolours=length(table(z))))
+                  par(mar = c(3,2.5,2.5,2))
+              colrange<-seq(from=min(z),to=max(z),length=100)
+               image(1,colrange,
+               matrix(data=colrange, ncol=length(colrange),nrow=1),
+              col=beachcolours(heightrange=c(min(z),max(z)),sealevel=0,ncolours=length(colrange)),
+              xlab="",ylab="",
+              xaxt="n")
+              graphics.off()
+              return(a)
+              }
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/RunMaxEnt.jar b/contrib/sahm/pySAHM/Resources/R_Modules/RunMaxEnt.jar
new file mode 100644
index 0000000..45a9faf
Binary files /dev/null and b/contrib/sahm/pySAHM/Resources/R_Modules/RunMaxEnt.jar differ
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/TestTrainRocPlot.r b/contrib/sahm/pySAHM/Resources/R_Modules/TestTrainRocPlot.r
new file mode 100644
index 0000000..7e79c14
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/TestTrainRocPlot.r
@@ -0,0 +1,372 @@
+TestTrainRocPlot<-function (DATA, threshold = 101, find.auc = TRUE, which.model = (1:(ncol(DATA) -
+    2)), na.rm = FALSE, xlab = "1-Specificity (false positives)",
+    ylab = "Sensitivity (true positives)", main = "ROC Plot",
+    model.names = NULL, color = NULL, line.type = NULL, lwd = 1,
+    mark = 0, mark.numbers = TRUE, mark.color = NULL, opt.thresholds = NULL,
+    opt.methods = NULL, req.sens, req.spec, obs.prev = NULL,
+    smoothing = 1, add.legend = TRUE, legend.text = model.names,
+    legend.cex = 0.8, add.opt.legend = TRUE, opt.legend.text = NULL,
+    opt.legend.cex = 0.7, counter.diagonal = FALSE, pch = NULL,
+    FPC, FNC, cost.line = FALSE,add.roc=FALSE)
+{
+    if (is.data.frame(DATA) == FALSE) {
+        if (is.matrix(DATA) == TRUE) {
+            DATA <- as.data.frame(DATA)
+        }
+        else {
+            stop("'DATA' must be either data frame or matrix")
+        }
+    }
+    OBS <- DATA[, 2]
+    if (length(OBS[OBS == 0]) == 0) {
+        stop("no observed absences in dataset, therefore specificity does not",
+            "exist, and modeling, much less Area Under the Curve, is not very",
+            "meaningful")
+    }
+    if (length(OBS[OBS == 1]) == 0) {
+        stop("no observed presences in dataset, therefore sensitivity does not",
+            "exist, and modeling, much less Area Under the Curve, is not very",
+            "meaningful")
+    }
+    if (is.logical(find.auc) == FALSE) {
+        stop("'find.auc' must be of logical type")
+    }
+    if (is.logical(na.rm) == FALSE) {
+        stop("'na.rm' must be of logical type")
+    }
+    if (is.logical(mark.numbers) == FALSE) {
+        stop("'mark.numbers' must be of logical type!")
+    }
+    if (is.logical(add.legend) == FALSE) {
+        stop("'add.legend' must be of logical type!")
+    }
+    if (is.logical(add.opt.legend) == FALSE) {
+        stop("'add.opt.legend' must be of logical type")
+    }
+    if (is.logical(counter.diagonal) == FALSE) {
+        stop("'counter.diagonal' must be of logical type")
+    }
+    if (length(smoothing) != 1) {
+        stop("'smoothing' must be a single number greater than or equal to 1")
+    }
+    else {
+        if (is.numeric(smoothing) == FALSE) {
+            stop("'smoothing' must be a single number greater than or equal to 1")
+        }
+        else {
+            if (smoothing < 1) {
+                stop("'smoothing' must be a single number greater than or equal to 1")
+            }
+        }
+    }
+    if (sum(is.na(DATA)) > 0) {
+        if (na.rm == TRUE) {
+            NA.rows <- apply(is.na(DATA), 1, sum)
+            warning(length(NA.rows[NA.rows > 0]), " rows ignored due to NA values")
+            DATA <- DATA[NA.rows == 0, ]
+        }
+        else {
+            return(NA)
+        }
+    }
+    DATA[DATA[, 2] > 0, 2] <- 1
+    N.models <- ncol(DATA) - 2
+    if (is.null(obs.prev) == TRUE) {
+        obs.prev <- sum(DATA[, 2])/nrow(DATA)
+    }
+    if (obs.prev < 0 || obs.prev > 1) {
+        stop("'obs.prev' must be a number between zero and one")
+    }
+    if (obs.prev == 0) {
+        warning("because your observed prevalence was zero, results may be strange")
+    }
+    if (obs.prev == 1) {
+        warning("because your observed prevalence was one, results may be strange")
+    }
+    if (min(which.model) < 1 || sum(round(which.model) != which.model) !=
+        0) {
+        stop("values in 'which.model' must be positive integers")
+    }
+    if (max(which.model) > N.models) {
+        stop("values in 'which.model' must not be greater than number of models in 'DATA'!")
+    }
+    if (is.null(model.names) == TRUE) {
+        model.names <- if (is.null(names(DATA)) == FALSE) {
+            names(DATA)[-c(1, 2)]
+        }
+        else {
+            paste("Model", 1:N.models)
+        }
+    }
+    if (N.models != length(model.names) && (length(which.model) !=
+        1 || length(model.names) != 1)) {
+        stop("If 'model.names' is specified it must either be a single name, or a vector",
+            "of the same length as the number of model predictions in 'DATA'")
+    }
+    if (is.null(legend.text) == TRUE) {
+        legend.text <- model.names
+    }
+    if (length(legend.text) != N.models) {
+        stop("'opt.legend.text' must be of same length as 'opt.methods'")
+    }
+    DATA <- DATA[, c(1, 2, which.model + 2)]
+    if (length(model.names) != 1) {
+        model.names <- model.names[which.model]
+    }
+    if (length(legend.text) != 1) {
+        legend.text <- legend.text[which.model]
+    }
+    N.dat <- ncol(DATA) - 2
+    if (is.null(obs.prev) == TRUE) {
+        obs.prev <- sum(DATA[, 2])/nrow(DATA)
+    }
+    if (obs.prev < 0 || obs.prev > 1) {
+        stop("'obs.prev' must be a number between zero and one")
+    }
+    mark <- matrix(mark, length(mark), N.dat)
+    if (!is.null(opt.methods) && is.null(opt.thresholds)) {
+        opt.thresholds <- TRUE
+    }
+    if (is.null(opt.methods) && is.null(opt.thresholds)) {
+        opt.thresholds <- FALSE
+    }
+    if (is.null(opt.methods)) {
+        opt.methods <- c(1, 2, 4)
+    }
+    if (is.logical(opt.thresholds) == TRUE) {
+        if (opt.thresholds == TRUE) {
+            POSSIBLE.meth <- c("Default", "Sens=Spec", "MaxSens+Spec",
+                "MaxKappa", "MaxPCC", "PredPrev=Obs", "ObsPrev",
+                "MeanProb", "MinROCdist", "ReqSens", "ReqSpec",
+                "Cost")
+            N.meth <- length(opt.methods)
+            if (is.numeric(opt.methods) == TRUE) {
+                if (sum(opt.methods %in% (1:length(POSSIBLE.meth))) !=
+                  N.meth) {
+                  stop("invalid optimization method")
+                }
+                else {
+                  opt.methods <- POSSIBLE.meth[opt.methods]
+                }
+            }
+            if (sum(opt.methods %in% POSSIBLE.meth) != N.meth) {
+                stop("invalid optimization method")
+            }
+            if (is.null(opt.legend.text) == TRUE) {
+                opt.legend.text <- opt.methods
+            }
+            if (length(opt.legend.text) != N.meth) {
+                stop("'opt.legend.text' must be of same length as 'opt.methods'")
+            }
+            if ("ReqSens" %in% opt.methods) {
+                if (missing(req.sens)) {
+                  warning("req.sens defaults to 0.85")
+                  req.sens <- 0.85
+                }
+            }
+            if ("ReqSpec" %in% opt.methods) {
+                if (missing(req.spec)) {
+                  warning("req.spec defaults to 0.85")
+                  req.spec <- 0.85
+                }
+            }
+            if ("Cost" %in% opt.methods) {
+                if (missing(FPC) || missing(FNC)) {
+                  warning("costs assumed to be equal")
+                  FPC <- 1
+                  FNC <- 1
+                }
+                if (FPC <= 0 || FNC <= 0) {
+                  stop("costs must be positive")
+                }
+                if (is.logical(cost.line) == FALSE) {
+                  stop("'cost.line' must be of logical type")
+                }
+                if (!"Cost" %in% opt.methods) {
+                  cost.line <- FALSE
+                }
+            }
+            mark <- optimal.thresholds(DATA = DATA, threshold = threshold,
+                model.names = model.names, na.rm = na.rm, opt.methods = opt.methods,
+                req.sens = req.sens, req.spec = req.spec, obs.prev = obs.prev,
+                smoothing = smoothing, FPC = FPC, FNC = FNC)[,
+                -1, drop = FALSE]
+            if (is.null(pch) == TRUE) {
+                pch <- c(1, 5, 2, 16, 15, 17, 8, 6, 9, 12, 4,
+                  7)[match(opt.methods, POSSIBLE.meth)]
+            }
+            else {
+                pch <- rep(pch, length(opt.methods))[1:length(opt.methods)]
+            }
+        }
+    }
+    if (is.logical(opt.thresholds) == FALSE) {
+        if (!is.numeric(opt.thresholds)) {
+            stop("'opt.thresholds' must be 'TRUE', 'FALSE', or numeric")
+        }
+        if (min(opt.thresholds) < 0) {
+            stop("'opt.thresholds' can not be negative")
+        }
+        if (max(opt.thresholds) > 1) {
+            if (N.thr == 1 && round(opt.thresholds) == opt.thresholds) {
+                opt.thresholds <- seq(length = opt.thresholds,
+                  from = 0, to = 1)
+                N.thr <- length(opt.thresholds)
+            }
+            else {
+                stop("non-interger, non-logical 'opt.thresholds' greater than 1")
+            }
+        }
+        N.opt.thresh <- length(opt.thresholds)
+        if (is.null(opt.legend.text)) {
+            opt.legend.text <- rep("threshold", N.opt.thresh)
+        }
+        if (length(opt.legend.text) != N.opt.thresh) {
+            stop("length of 'opt.legend.text' does not match number of specified thresholds")
+        }
+        if (is.null(pch)) {
+            pch <- 1:N.opt.thresh
+        }
+        if (length(pch) != N.opt.thresh) {
+            stop("length of 'pch' does not match number of specified thresholds")
+        }
+        mark <- matrix(opt.thresholds, length(opt.thresholds),
+            N.dat)
+        opt.thresholds = TRUE
+    }
+    if (is.null(pch) == TRUE) {
+        pch <- 16
+    }
+    if (is.null(color) == TRUE) {
+        colors <- rep(1, N.dat)
+        if (is.null(line.type) == TRUE) {
+            line.type <- (1:N.dat) + 1
+        }
+    }
+    else {
+        if (is.logical(color) == TRUE) {
+            if (color == FALSE) {
+                colors <- rep(1, N.dat)
+                if (is.null(line.type) == TRUE) {
+                  line.type <- (1:N.dat) + 1
+                }
+            }
+            else {
+                colors <- (1:N.dat) + 1
+                lwd <- 2 * lwd
+                if (is.null(line.type) == TRUE) {
+                  line.type <- rep(1, N.dat)
+                }
+            }
+        }
+        else {
+            colors <- rep(color, N.dat)[1:N.dat]
+            lwd <- 2 * lwd
+            if (is.null(line.type) == TRUE) {
+                line.type <- rep(1, N.dat)
+            }
+        }
+    }
+    if (is.null(mark.color) == TRUE) {
+        mark.colors <- colors
+    }
+    else {
+        if (is.logical(mark.color) == TRUE) {
+            if (mark.color == FALSE) {
+                mark.colors <- rep(1, N.dat)
+            }
+            else {
+                mark.colors <- (1:N.dat) + 1
+            }
+        }
+        else {
+            mark.colors <- rep(mark.color, N.dat)[1:N.dat]
+        }
+    }
+    if (is.null(line.type) == FALSE) {
+        if (is.logical(line.type) == TRUE) {
+            if (line.type == FALSE) {
+                line.type <- rep(1, N.dat)
+            }
+            else {
+                line.type <- (1:N.dat) + 1
+            }
+        }
+        else {
+            line.type <- rep(line.type, N.dat)[1:N.dat]
+        }
+    }
+    op <- par(pty = "s")
+    if(add.roc==FALSE){
+    plot(c(0, 1), c(0, 1), type = "n", xlab = xlab, ylab = ylab,
+        main = main)}
+    lines(c(0, 1), c(0, 1), col = "lightgray")
+    if (counter.diagonal == TRUE) {
+        abline(a = 1, b = -1, col = "lightgray")
+    }
+    for (dat in 1:N.dat) {
+        Model.dat <- roc.plot.calculate(DATA = DATA, threshold = threshold,
+            which.model = dat)
+        lines(x = (1 - Model.dat$specificity), y = Model.dat$sensitivity,
+            lty = line.type[dat], lwd = lwd, col = colors[dat])
+        if (max(mark) != 0) {
+            Mark.dat <- roc.plot.calculate(DATA = DATA, threshold = mark[,
+                dat], which.model = dat)
+            Mark.pretty <- round(Mark.dat$threshold, 2)
+            Mark.pretty.char <- as.character(Mark.pretty)
+            Mark.pretty.char[Mark.pretty == 0] <- "0.00"
+            Mark.pretty.char[Mark.pretty == 1] <- "1.00"
+            Mark.pretty.char[nchar(Mark.pretty.char) == 3] <- paste(Mark.pretty.char[nchar(Mark.pretty.char) ==
+                3], "0", sep = "")
+            if(add.roc==FALSE){
+            points(x = (1 - Mark.dat$specificity), y = Mark.dat$sensitivity,
+                cex = 2, pch = pch, col = mark.colors[dat])
+            if (mark.numbers == TRUE) {
+                text(x = (1 - Mark.dat$specificity), y = Mark.dat$sensitivity -
+                  0.03, labels = Mark.pretty.char, pos = 4, col = mark.colors[dat])
+            }}
+        }
+        if (cost.line == TRUE) {
+            tag <- match("Cost", opt.methods)
+            sl <- (FPC/FNC) * (1 - obs.prev)/obs.prev
+            if (obs.prev == 0) {
+                obs.prev <- 1e-06
+            }
+            abline(a = Mark.dat$sensitivity[tag] - ((1 - Mark.dat$specificity[tag]) *
+                sl), b = sl, col = mark.colors[dat], lty = 3)
+        }
+    }
+    inset <- c(0.02, 0.02)
+    if (opt.thresholds == TRUE && add.opt.legend == TRUE) {
+        if (N.dat == 1) {
+            opt.legend.names <- paste(Mark.pretty.char, opt.legend.text)
+        }
+        else {
+            opt.legend.names <- opt.legend.text
+        }
+        leg.loc <- legend(x = "bottomright", inset = inset, pt.cex = 1,
+            legend = opt.legend.names, pch = pch, bg = "white",
+            cex = opt.legend.cex)
+        inset <- c(0.02, leg.loc$rect$top + 0.05)
+    }
+    if (add.legend == TRUE) {
+        legend.names <- legend.text
+        if (find.auc == TRUE) {
+            AUC <- rep(0, N.dat)
+            for (dat in 1:N.dat) {
+                AUC[dat] <- auc(DATA = DATA, which.model = dat)$AUC
+            }
+            AUC.pretty <- round(AUC, 2)
+            AUC.pretty.char <- as.character(AUC.pretty)
+            AUC.pretty.char[AUC.pretty == 0] <- "0.00"
+            AUC.pretty.char[AUC.pretty == 1] <- "1.00"
+            AUC.pretty.char[nchar(AUC.pretty.char) == 3] <- paste(AUC.pretty.char[nchar(AUC.pretty.char) ==
+                3], "0", sep = "")
+            legend.names <- paste(AUC.pretty.char, legend.text)
+        }
+        legend(x = "bottomright", inset = inset, legend = legend.names,
+            lty = line.type, col = colors, title = "AUC:", cex = legend.cex,
+            lwd = lwd, bg = "white")
+    }
+    par(op)
+}
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/TestTrainSplit.r b/contrib/sahm/pySAHM/Resources/R_Modules/TestTrainSplit.r
new file mode 100644
index 0000000..d2564ea
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/TestTrainSplit.r
@@ -0,0 +1,188 @@
+ TestTrainSplit<-function(input.file,output.file,response.col="ResponseBinary",trainProp=.7,RatioPresAbs=NULL){
+
+#Description:
+#this code takes as input an mds file with the first line being the predictor or
+#response name, the second line an indicator of predictors to include and the
+#third line being paths where tif files can be found.   An output file and a
+#response column must also be specified.  Given a training proportion, a new
+#column is created indicating whether each observation should be assigned to the
+#test or training split with the correct proportion.
+#trainProp=#obs to be assigned to training split/total sample size
+#his will be balanced with respect to the response in that the training
+#proportion will be matched as close as possible for each level of the response.
+#An optional parameter, RatioPresAbs, can be used to specify if there is a certain
+#ratio of presence to absence points that should be used this ensures the given
+#ratio for all data used in both the test and train split.  For categorical data,
+#all responses greater than or equal to 1 will be used to meet this ratio.
+#This option reduces the sample size as some data must be thrown away to meet
+#the constraint of having the desired proportion.  Background points are ignored
+#by this module (they are read in, written out, but not assigned to either the
+#test or training split).  Output is written to a csv that can be used by the
+#SAHM R modules.
+
+#Written by Marian Talbert 3/23/2011
+#Modified 5/10/2011 to handle count data
+
+
+
+     if(trainProp<=0 | trainProp>1) stop("Train Proportion (trainProp) must be a number between 0 and 1 excluding 0")
+    if(!is.null(RatioPresAbs)) {
+    if(RatioPresAbs<=0) stop("The ratio of presence to absence (RatioPresAbs) must be a \ngreater than 0")}
+
+   #Read input data and remove any columns to be excluded
+          dat.in<-read.csv(input.file,header=FALSE,as.is=TRUE)
+          dat<-as.data.frame(dat.in[4:dim(dat.in)[1],])
+          names(dat)<-dat.in[1,]
+
+        response<-dat[,match(tolower(response.col),tolower(names(dat)))]
+
+          if(sum(as.numeric(response)==0)==0 && !is.null(RatioPresAbs)) stop("The ratio of presence to absence cannot be set with only presence data")
+          
+      #Ignoring background data that might be present in the mds
+
+          bg.dat<-dat[response==-9999,]
+
+          if(dim(bg.dat)[1]!=0){
+            dat<-dat[-c(which(response==-9999,arr.ind=TRUE)),]
+            dat.in<-dat.in[-c(which(response==-9999,arr.ind=TRUE)+3),]
+            response<-response[-c(which(response==-9999,arr.ind=TRUE))]
+            bg.dat$TrainSplit=""
+            }
+
+         temp<-if(!is.null(RatioPresAbs))(sum(response>=1)/sum(response==0)==RatioPresAbs)
+         if(is.null(temp)) temp<-FALSE
+       if(is.null(RatioPresAbs)| temp){
+        #Randomly sample presesce absence or counts as close to the size of the training proportion as possible
+
+          #iterate through each unique response and randomly assign the trainProp to be in the training split
+          TrainSplit<-numeric()
+          for(i in sort(as.numeric(unique(response)))){
+           TrainSplit<-c(TrainSplit,sample(which(response==i,arr.ind=TRUE),size=round(sum(response==i)*trainProp)))
+            }
+
+
+        #Take everything not in the training set for the test set
+          TestSplit=which(!(seq(1:length(response)))%in%TrainSplit,arr.ind=TRUE)
+
+          dat$TrainSplit[seq(1:length(response))%in%TrainSplit]<-"train"
+          dat$TrainSplit[seq(1:length(response))%in%TestSplit]<-"test"
+
+         #inserting data must be done in 3 steps because dat.in isn't a proper dataframe in that
+         #not all elements in a column are of the same type
+          dat.in<-dat.in[c(1:3,rownames(dat)),] #removing rows that weren't selected for the test train split
+          dat.in[4:(dim(dat.in)[1]),(dim(dat.in)[2]+1)]<-dat$TrainSplit
+          dat.in[c(1,3),(dim(dat.in)[2])]<-c("Split","")
+          dat.in[2,(dim(dat.in)[2])]<-1
+
+
+          } else {  #now considering if there is a desired ratio of presence to absence points
+                if(sum(response>=1)/sum(response==0)>=RatioPresAbs){
+
+                   #first determine how many presence points to remove
+                     TotToRmv<-(sum(response>=1)-RatioPresAbs*sum(response==0))
+                     # if(TotToRmv/sum(response>=1)>.5) {
+                     #   warning("******************************************\n**** Over 50% of the
+                     #  presence points were removed to meet the desired ratio of presence to absence \n******************************************")}
+                  #determine the number of each count to remove weighted by the reponse and then remove these
+                     EachToRmv<-round(TotToRmv*table(response[response!=0])/sum(response!=0))
+                     ByCount<-split(cbind(which(response!=0,arr.ind=TRUE)),f=response[response!=0])
+
+                     #sampling one from a vector of size 1 actually samples a sequence from 1 to the value in the vector
+                     #so correcting this here
+                     sam<-function(x,size){if(length(x)==1 & size==1) return(x)
+                                            else sample(x=x,size=size)}
+
+                     RmvIndx<-as.vector(unlist(mapply(sam,x=ByCount,size=EachToRmv)))
+                     KeepIndx<-seq(1:length(response))[-c(RmvIndx)]
+                     Response<-response[KeepIndx]
+                     names(Response)<-KeepIndx
+
+                     #now break these into a train an test split while
+                    TrainSplit<-numeric()
+
+                      for(i in sort(as.numeric(unique(Response)))){
+                        TrainSplit<-c(TrainSplit,sample(names(Response[Response==i]),size=round(sum(Response==i)*trainProp)))
+                      }
+                       TrainSplit<-as.numeric(TrainSplit)
+                      #Take everything not in the training set or in the remove list for the test set
+                      TestSplit<-seq(from=1,to=length(response))[-c(c(TrainSplit,RmvIndx))]
+
+                     dat$TrainSplit[seq(1:length(response))%in%TrainSplit]<-"train"
+                     dat$TrainSplit[seq(1:length(response))%in%TestSplit]<-"test"
+
+
+               }
+
+               if(sum(response>=1)/sum(response==0)<RatioPresAbs){
+                  browser()
+               #first ballance all responses greater than 1
+               TrainSplit<-numeric()
+                for(i in sort(as.numeric(unique(response[response!=0])))){
+                  TrainSplit<-c(TrainSplit,sample(which(response==i,arr.ind=TRUE),size=round(sum(response==i)*trainProp)))
+                  }
+                #  if((sum(response==0)-sum(response>=1)/RatioPresAbs)/sum(response==0)>.5) {
+                #        warning("******************************************\n**** Over 50% of the
+                #        absence points were removed to meet the desired ratio of presence to absence \n******************************************")}
+                  #now sampling the right number of absence points for the train split
+                  TrainSplit<-c(TrainSplit,sample(which(response==0,arr.ind=TRUE),size=round(sum(response>=1)*(1/RatioPresAbs)*trainProp)))
+
+                      #Take everything not in the training set for the test set
+                      TestSplit=which(!(seq(1:length(response)))%in%TrainSplit,arr.ind=TRUE)
+
+                      #now sample some points to remove so we have the correct proportion
+                      temp<-sample(which(TestSplit%in%which(response==0,arr.ind=TRUE),arr.ind=TRUE),
+                        size=round(sum(TestSplit%in%which(response==0,arr.ind=TRUE))-(1-trainProp)*sum(response>=1)*(1/RatioPresAbs)))
+                      TestSplit<-TestSplit[-c(temp)]
+
+                     dat$TrainSplit[seq(1:length(response))%in%TrainSplit]<-"train"
+                     dat$TrainSplit[seq(1:length(response))%in%TestSplit]<-"test"
+
+               }
+
+               dat<-dat[c(TrainSplit,TestSplit),]
+               
+               dat.in<-dat.in[c(1:3,rownames(dat)),] #removing rows that weren't selected for the test train split
+               dat.in[4:(dim(dat.in)[1]),(dim(dat.in)[2]+1)]<-dat$TrainSplit
+               dat.in[c(1,3),(dim(dat.in)[2])]<-c("Split","")
+               dat.in[2,(dim(dat.in)[2])]<-1
+
+
+              }
+
+              if(dim(bg.dat)[1]!=0) {
+                names(bg.dat)<-names(dat.in)
+                dat.in<-rbind(dat.in,bg.dat)}
+
+              #write output files for R modules
+             write.table(dat.in,file=output.file,row.names=FALSE,col.names=FALSE,sep=",",quote=FALSE)
+
+
+    }
+
+
+ #Reading in command line arguments
+ Args <- commandArgs(T)
+    print(Args)
+    #assign default values
+    
+    responseCol <- "responseBinary"
+    trainProp=.7
+    RatioPresAbs=NULL
+    #replace the defaults with passed values
+    for (arg in Args) {
+    	argSplit <- strsplit(arg, "=")
+    	argSplit[[1]][1]
+    	argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="p") trainProp <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="m") RatioPresAbs <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output.file <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="i") infil <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    }
+
+    RatioResAbs<-as.numeric(RatioPresAbs)
+    trainProp<-as.numeric(trainProp)
+    
+	#Run the Test training split with these parameters
+	TestTrainSplit(input.file=infil,output.file=output.file,response.col=responseCol,
+  trainProp=trainProp,RatioPresAbs=RatioPresAbs)
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/CallPairsPlot.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/CallPairsPlot.r
new file mode 100644
index 0000000..608b7f3
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/CallPairsPlot.r
@@ -0,0 +1,114 @@
+#Running R from the command line
+#input.file="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv"
+    #output.dir<-"H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck\\"
+    #response.col= "ResponseBinary"
+    #min.cor<-.7
+    #num.plots<-10
+source("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules\\PairsExplore.r")
+
+
+
+num.plots <- 10
+    min.cor <- .7
+    responseCol <- "responseCount"
+    cors.w.highest <- FALSE
+    pres=FALSE
+    absn=TRUE
+    bgd=TRUE
+    #infile="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110510T100421\\TestTrainingSplit_1.csv"
+    infile="I:\\NPS_NPMP_data\\ModelingSession_June\\EAME_MDS.csv"
+    output.file="H:\\Desktop\\SAHM\\Output\\PairsPlot\\pairPres.jpg"
+    Pairs.Explore(num.plots=num.plots,
+    min.cor=min.cor,
+    input.file=infile,
+		output.file=output.file,
+		response.col=responseCol,
+		pres=TRUE,
+		absn=TRUE,
+		bgd=TRUE,
+    Debug=TRUE)
+
+#binary
+input.file="C:\\VisTrails\\EAMEBinTT.csv"
+input.file="C:\\VisTrails\\DICKBinTT.csv"
+input.file="C:\\VisTrails\\HESPBinTT.csv"
+input.file="C:\\VisTrails\\GRSPBinTT.csv"
+responseCol="responseBinary"
+input.file="I:\\SpeciesData\\kudzu\\July2011\\MergedDataset_1.csv"
+#list.files("I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110725T102358")
+Pairs.Explore(num.plots=num.plots,
+    min.cor=min.cor,
+    input.file=input.file,
+		output.file=output.file,
+		response.col=responseCol,
+		pres=TRUE,
+		absn=TRUE,
+		bgd=TRUE,
+    Debug=TRUE)
+
+
+#count
+input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\EAME_MDS.csv"
+input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\DICK_MDS.csv"
+input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\HESP_MDS.csv"
+input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\GRSP_MDS.csv"
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T083827\\MergedDataset_1.csv"
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T114212\\MergedDataset_1.csv"
+responseCol="responseBinary"
+Pairs.Explore(num.plots=num.plots,
+    min.cor=min.cor,
+    input.file=input.file,
+		output.file=output.file,
+		response.col=responseCol,
+		pres=TRUE,
+		absn=TRUE,
+		bgd=TRUE,
+    Debug=TRUE)
+
+print(getwd())
+source_pathname  = get("PairsExplore",envir = parent.frame())
+source_dirname = dirname(source_pathname )
+setwd(source_dirname)
+print(getwd())
+
+
+frame_files <- lapply(sys.frames(), function(x) x$ofile)
+frame_files <- Filter(Negate(is.null), frame_files)
+PATH <- dirname(frame_files[[length(frame_files)]])
+
+
+as.double.foo <- function(x)
+{
+    str(sys.calls())
+    print(sys.frames())
+    print(sys.parents())
+    print(sys.frame(-1)); print(parent.frame())
+    x
+}
+t2 <- function(x) as.double(x)
+a <- structure(pi, class = "foo")
+t2(a)
+
+library(R.utils)
+print(getAbsolutePath("Pairs.Explore"))
+
+
+Pairs.Explore(num.plots=10,min.cor=.7,input.file="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv",
+output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck\\",
+response.col="ResponseBinary",cors.w.highest=TRUE)
+
+# The BRT Function
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f I:\VisTrails\Central_VisTrailsInstall_debug\vistrails\packages\sahm\pySAHM\Resources\R_Modules\FIT_BRT_pluggable.r --args c=I:\VisTrails\WorkingFiles\workspace\GYA_demo\test.csv o=C:\temp rc=ResponseBinary
+
+
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f H:\Desktop\SAHM\Rcode\PredictorSelection\PairsExplore2.r --args p=10 m=.7 o=H:\Desktop\SAHM\Rcode\ExposingModelParameters\PDFCheck\ i="I:\VisTrails\WorkingFiles\workspace\GYA_demo\test.csv" rc="ResponseBinary" core=TRUE
+
+
+
+if(argSplit[[1]][1]=="p") num.plots <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="m") min.cor <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="o") output.dir <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="i") input.file <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="rc") responseCol <- argSplit[[1]][2]
+    	if(argSplit[[1]][1]=="core") cors.w.higest <- argSplit[[1]][2]
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/Debugging.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/Debugging.r
new file mode 100644
index 0000000..5ae306d
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/Debugging.r
@@ -0,0 +1,173 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.ma.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+
+# Currently testing to see if models work with
+#  * new test train split
+#  * separation of model fit from prediction
+#  * working with count data
+#  * producing correct evaluation metrics
+#Future testing will include testing that factor columns are handled correctly
+#trace(proc.tiff,browser)
+#options(error=expression(if(interactive()) recover() else dump.calls()))
+#options(error=NULL)
+#trace(proc.tiff,browser)
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+output.dir="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\brtoutput_1"
+rc="responseBinary"
+PredictModel(workspace="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T130214\\brtoutput_1\\modelWorkspace",out.dir="C:\\VisTrails")
+PredictModel(workspace="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T130214\\brtoutput_1\\modelWorkspace",out.dir="C:\\VisTrails\\mtalbert_20110505T161105",make.btif=TRUE,make.ptif=TRUE)
+#######################################################
+## BRT TESTING
+
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\mtalbert_20110602T155823\\MergedDataset_1.csv"
+    rc="responseCount"
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110721T095017\\MergedDataset_2.csv"
+output.dir="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110721T095017\\brtoutput_1"
+rc="responseBinary"
+
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110721T134303\\TestTrainingSplit_1.csv"
+output.dir="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110721T134303\\marsoutput_3"
+rc="responseBinary"
+
+fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",model.family="binomial",script.name="mars.r")
+
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, max.trees = NULL,opt.methods=1,seed=1,save.model=TRUE)
+
+source("FIT_MARS_pluggable.r")
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+           
+#########################################################
+## MARS TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+
+    #this input file does not have a test training split
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+    rc="ResponseBinary"
+    
+    #this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=F,responseCurveForm="pdf",model.family="binomial",script.name="mars.r")
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+#########################################################
+## GLM TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+########################################################
+## RANDOM FOREST TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.rf.fct(ma.name=input.file,
+  tif.dir=NULL,
+  output.dir=output.dir,
+  response.col=rc,make.p.tif=F,make.binary.tif=F,
+      debug.mode=T,n.trees=1000)
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+      
+      
+#Now testing to make sure this code works with no test training split
+ma.name<-"H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\ModelOutputCheck\\NewInput.csv"
+ma.name="C:\\VisTrails\\mtalbert_20110406T093111\\sahm4h5b1t.mds"
+
+ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv"
+fit.brt.fct(ma.name=ma.name,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+           learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+
+
+#this is the GLM_pluggable1.r under NewMDSBuilder (Works with new vistrails format)
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110510T100421\\TestTrainingSplit_1.csv"
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+rc="responseCount"
+
+      fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col=rc,make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+
+#Mars check Works with new vistrails format
+      fit.mars.fct(ma.name=ma.name,
+        tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+        response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+
+fit.rf.fct(ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv",
+  tif.dir=NULL,
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      debug.mode=T,n.trees=1000,ma.test=NULL,make.r.curves=T,script.name="glm.r")
+
+
+
+#this one does not subset paths set up in the old way works with old sahm as well as for
+fit.brt.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,ma.test=NULL,alpha=1,script.name="brt.r",
+     learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+     
+
+fit.mars.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+fit.glm.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",ma.test=NULL,script.name="glm.r")
+  
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/Dickessel.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/Dickessel.r
new file mode 100644
index 0000000..fc80871
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/Dickessel.r
@@ -0,0 +1,231 @@
+ setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.ma.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+
+# Currently testing to see if models work with
+#  * new test train split
+#  * separation of model fit from prediction
+#  * working with count data
+#  * producing correct evaluation metrics
+#Future testing will include testing that factor columns are handled correctly
+#trace(proc.tiff,browser)
+#options(error=expression(if(interactive()) recover() else dump.calls()))
+#options(error=NULL)
+#trace(proc.tiff,browser)
+#################################################################################
+## Testing the code with some dickessel data
+
+ ## EAME
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\EAME_MDS.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\EAMENoTestTrain"
+
+## DICK
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\DICK_MDS.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\DICKNoTestTrain"
+ 
+## HESP
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\HESP_MDS.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\HESPNoTestTrain"
+ 
+ ## GRSP
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\GRSP_MDS.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\GRSPNoTestTrain"
+
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110623T104642\\SelectPredictorsLayers_second_1.csv"
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "binomial", opt.methods=1,seed=1,save.model=FALSE)
+
+#  No Predictions here
+#  PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r",model.family="binomial",save.model=FALSE)
+
+  #PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+  
+      fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",model.family="poisson",script.name="mars.r",save.model=FALSE)
+
+    #PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+    
+
+ 
+#######################################################
+### Now with a test/train split
+#################################################
+## GRSP
+input.file="C:\\VisTrails\\GRSP_TestTrain.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\GRSPTest"
+ 
+ 
+input.file="C:\\VisTrails\\HESP_TestTrain.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\HESPTest"
+ 
+input.file="C:\\VisTrails\\EAME_TestTrain.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails\\EAMETest"
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110622T083717\\TestTrainingSplit_1"
+    rc="responseCount"
+ output.dir="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110622T083717"
+ 
+############################################################
+### Testing with binary data
+
+  ## EAME
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\EAME_MDS_binary.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\EAMEBin"
+
+## DICK
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\DICK_MDS_binary.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\DICKBin"
+
+## HESP
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\HESP_MDS_binary.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\HESPBin"
+
+ ## GRSP
+ input.file="I:\\NPS_NPMP_data\\ModelingSession_June\\GRSP_MDS_binary.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\GRSPBin"
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110622T083717\\TestTrainingSplit_1.csv"
+    rc="responseCount"
+ output.dir="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110622T083717"
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110622T113117\\TestTrainingSplit_1.csv"
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110622T113117\\MergedDataset_2.csv"
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "binomial", opt.methods=1,seed=1,save.model=FALSE)
+
+#  No Predictions here
+#  PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r",model.family="binomial",save.model=FALSE)
+
+  #PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+      fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",model.family="binomial",script.name="mars.r",save.model=FALSE)
+
+    #PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+fit.rf.fct(ma.name=input.file,
+  tif.dir=NULL,
+  output.dir=output.dir,
+  response.col=rc,make.p.tif=F,make.binary.tif=F,
+      debug.mode=T,n.trees=1000,save.model=FALSE)
+
+
+###################################################################################
+## testing  with binary with a test train split
+  ## EAME
+ input.file="C:\\VisTrails\\EAMEBinTT.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\EAMEBinTT"
+
+## DICK
+ input.file="C:\\VisTrails\\DICKBinTT.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\DICKBinTT"
+
+## HESP
+ input.file="C:\\VisTrails\\HESPBinTT.csv"
+    rc="responseBinary"
+ output.dir="C:\\VisTrails\\HESPBinTT"
+
+ ## GRSP
+ input.file="C:\\VisTrails\\GRSPBinTT.csv"
+    rc=r"responseBinary"
+ output.dir="C:\\VisTrails\\GRSPBinTT"
+
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "binomial", opt.methods=1,seed=1,save.model=FALSE)
+
+#  No Predictions here
+#  PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r",model.family="binomial",save.model=FALSE)
+
+  #PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+      fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",model.family="binomial",script.name="mars.r",save.model=FALSE)
+
+    #PredictModel(workspace=paste("C:\\VisTrails\\EAMENoTestTrain","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+fit.rf.fct(ma.name=input.file,
+  tif.dir=NULL,
+  output.dir=output.dir,
+  response.col=rc,make.p.tif=F,make.binary.tif=F,
+      debug.mode=T,n.trees=1000,save.model=FALSE)
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T083827\\MergedDataset_1.csv"
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T112620\\TestTrainingSplit_1.csv"
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T114212\\MergedDataset_1.csv"
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T115847\\TestTrainingSplit_2.csv"
+   rc="responseBinary"
+output.dir="C:\\VisTrails"
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T134656\\TestTrainingSplit_1.csv"
+rc="responseCount"
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r",model.family="binomial",save.model=FALSE)
+
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\talbertc_20110621T114212\\MergedDataset_1.csv"
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "binomial", opt.methods=1,seed=1,save.model=FALSE)
+ 
+ 
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f I:\VisTrails\Central_VisTrailsInstall_debug\vistrails\packages\sahm\pySAHM\Resources\R_Modules\FIT_RF_pluggable.r --args  mbt=FALSE mpt=FALSE c=N:\Active\FORT_RAM\VisTrails\workspace\dignizio_20110616T162343\TestTrainingSplit_4.csv o=N:\Active\FORT_RAM\VisTrails\workspace\dignizio_20110616T162343\rfoutput_7 rc=responseBinary
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f I:\VisTrails\Central_VisTrailsInstall_debug\vistrails\packages\sahm\pySAHM\Resources\R_Modules\PairsExplore.r --args i=N:\Active\FORT_RAM\VisTrails\workspace\talbertc_20110621T083827\MergedDataset_1.csv o=N:\Active\FORT_RAM\VisTrails\workspace\talbertc_20110621T083827\PredictorCorrelation_second_1.jpg m=0.7 rc=responseBinary pres=TRUE absn=TRUE bgd=TRUE
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f I:\VisTrails\Central_VisTrailsInstall_debug\vistrails\packages\sahm\pySAHM\Resources\R_Modules\FIT_BRT_pluggable.r --args  c=N:\Active\FORT_RAM\VisTrails\workspace\talbertc_20110621T105356\TestTrainingSplit_1.csv o=N:\Active\FORT_RAM\VisTrails\workspace\talbertc_20110621T105356\brtoutput_1 rc=responseBinary
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/QuickDebug.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/QuickDebug.r
new file mode 100644
index 0000000..cc1b157
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/QuickDebug.r
@@ -0,0 +1,75 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+setwd("I:\\VisTrails\\Central_VisTrailsInstall\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.maNew.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+source("PredictModel.r")
+source("modalDialog.R")
+source("check.libs.r")
+options(error=expression(if(interactive()) recover() else dump.calls()))
+options(error=NULL)
+trace(proc.tiff,browser)
+
+list.files()
+#Testing Compile Output on data with no test train and with a test train
+
+
+input.file="N:/Active/FORT_RAM/VisTrails/workspace/mtalbert_20110817T104421/MergedDataset_1.csv"
+#input.file="N:/Active/FORT_RAM/VisTrails/workspace/mtalbert_20110817T104421/MergedDatasetTestTrain_1.csv"
+
+#No test training split
+
+#this one has a test training split
+
+output.dir="C:\\temp\\SAHMDebugJunk\\BRTOut1"
+rc="responseBinary"
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110824T133049\\CovariateCorrelationOutputMDS_anothertry.csv"
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110825T130119\\CovariateCorrelationOutputMDS_anothertry2.csv"
+#input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110824T133049\\CovariateCorrelationOutputMDS_anothertry2.csv"
+
+##RF
+    fit.rf.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+          debug.mode=T,n.trees=1000,opt.methods=5)
+
+    PredictModel(workspace=paste(output.dir,"modelWorkspace",sep="\\"),out.dir=output.dir)
+
+##BRT
+    fit.brt.fct(ma.name=input.file,
+          tif.dir=NULL,output.dir=output.dir,
+          response.col=rc,make.p.tif=F,make.binary.tif=F,
+          simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+          learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, max.trees = NULL,opt.methods=2,seed=1,save.model=TRUE)
+          
+    PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+##MARS
+    fit.mars.fct(ma.name=input.file,
+            tif.dir=NULL,output.dir=output.dir,
+            response.col=rc,make.p.tif=F,make.binary.tif=F,
+            mars.degree=1,mars.penalty=2,debug.mode=F,responseCurveForm="pdf",script.name="mars.r")
+
+    PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+##GLM
+    fit.glm.fct(ma.name=input.file,
+          tif.dir=NULL,
+          output.dir=output.dir,
+          response.col=rc,make.p.tif=F,make.binary.tif=F,
+          simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+    PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+
+## Command line
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f I:\VisTrails\Central_VisTrailsInstall_debug\vistrails\packages\sahm\pySAHM\Resources\R_Modules\FIT_MARS_pluggable.r --args c=I:\VisTrails\WorkingFiles\workspace\talbertc_20110824T133049\CovariateCorrelationOutputMDS_anothertry2.csv o=I:\VisTrails\WorkingFiles\workspace\talbertc_20110824T133049\marsoutput_4 rc=responseBinary
+C:\R-2.12.1\bin\i386\Rterm.exe --vanilla -f I:\VisTrails\Central_VisTrailsInstall\vistrails\packages\sahm\pySAHM\Resources\R_Modules\FIT_RF_pluggable.r --args c=I:\VisTrails\WorkingFiles\workspace\talbertc_20110825T130119\CovariateCorrelationOutputMDS_anothertry2.csv o=I:\VisTrails\WorkingFiles\workspace\talbertc_20110825T130119\rfoutput_1 rc=responseBinary
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/RunTestTrainSplit.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/RunTestTrainSplit.r
new file mode 100644
index 0000000..5263aef
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/RunTestTrainSplit.r
@@ -0,0 +1,171 @@
+### This file runs the TestTrainSplit and checks that all ratios end up being what they should if RatioPresAbs is set at an extreme value
+### an excessive number of values are deleted and ratios and be drastically off might want to include future error checking
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("TestTrainSplit.r")
+
+input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSetNullModelTest.csv"
+output.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSetNullSplit.csv"
+
+input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSetIncludeTest.csv"
+output.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSetIncludeSplit.csv"
+
+input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+output.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSplitTest.csv"
+
+input.file="N:/Active/FORT_RAM/VisTrails/workspace/mtalbert_20110817T104421/MergedDataset_1.csv"
+input.file="I:/VisTrails/WorkingFiles/workspace/morisettej_20110810T153126/CovariateCorrelationOutputMDS_anothertry.csv"
+output.file="N:/Active/FORT_RAM/VisTrails/workspace/mtalbert_20110817T104421/MergedDatasetTestTrain_1.csv"
+response.col="ResponseBinary"
+
+## Running the code
+TestTrainSplit(input.file,output.file,response.col=response.col,trainProp=.7)  #tried also with .8, and no RatioPresAb
+
+## Running some tests on the output
+input.file<-output.file
+dat<-read.csv(input.file,skip=3,header=FALSE)
+
+          hl<-readLines(input.file,1)
+          hl=strsplit(hl,',')
+          colnames(dat) = hl[[1]]
+
+          tif.info<-readLines(input.file,3)
+          tif.info<-strsplit(tif.info,',')
+          include<-(as.numeric(tif.info[[2]]))
+          
+# checking that trainProp is correct
+ta<-table(dat$Split,dat$responseBinary)
+ta
+#if there are background points, remove them here
+ta<-ta[-1,]
+ta<-ta[,-1]
+
+#checking that the trainProp was ballanced for each count all of these
+#should be approximately equal to the trainProp this works less well for
+#smaller sample sizes
+ta[2,]/(ta[1,]+ta[2,])
+
+#checks trainProp is correct
+sum(ta[2,])/sum(ta)
+sum(ta[1,])/sum(ta)
+
+#checking ratio of presence to absence should equal RatioPresAbs
+sum(ta[1,2:dim(ta)[2]])/ta[1,1]
+sum(ta[2,2:dim(ta)[2]])/ta[2,1]
+
+#######################################################
+#### testing looking at an mds with counts case 1. appears to be working###########
+input.file<-"H:\\Desktop\\SAHM\\Data\\ChangeFamilyData\\MergedDataSet_1.csv"
+output.file<-"H:\\Desktop\\SAHM\\Output\\TestTrainSplit\\testtrain.mds"
+TestTrainSplit(input.file,output.file,response.col="ResponseCount",trainProp=.7,RatioPresAbs=.9)
+
+input.file<-output.file
+dat<-read.csv(input.file,skip=3,header=FALSE)
+
+          hl<-readLines(input.file,1)
+          hl=strsplit(hl,',')
+          colnames(dat) = hl[[1]]
+
+          tif.info<-readLines(input.file,3)
+          tif.info<-strsplit(tif.info,',')
+          include<-(as.numeric(tif.info[[2]]))
+
+# checking that trainProp is correct
+ta<-table(dat$Split,dat$responseCount)
+ta
+
+#if there are background points, remove them here
+ta<-ta[-1,]
+ta<-ta[,-1]
+
+#checking that the trainProp was ballanced for each count all of these
+#should be approximately equal to the trainProp this works less well for
+#smaller sample sizes
+ta[2,]/(ta[1,]+ta[2,])
+
+#checks trainProp is correct
+sum(ta[2,])/sum(ta)
+sum(ta[1,])/sum(ta)
+
+#checking ratio of presence to absence should equal RatioPresAbs
+sum(ta[1,2:dim(ta)[2]])/ta[1,1]
+sum(ta[2,2:dim(ta)[2]])/ta[2,1]
+
+
+#######################################################
+#### testing looking at an mds with counts case 2. Looks like this is working too###########
+input.file<-"H:\\Desktop\\SAHM\\Data\\ChangeFamilyData\\MergedDataSet_1.csv"
+output.file<-"H:\\Desktop\\SAHM\\Output\\TestTrainSplit\\testtrain.mds"
+TestTrainSplit(input.file,output.file,response.col="ResponseCount",trainProp=.7,RatioPresAbs=.4)
+
+input.file<-output.file
+dat<-read.csv(input.file,skip=3,header=FALSE)
+
+          hl<-readLines(input.file,1)
+          hl=strsplit(hl,',')
+          colnames(dat) = hl[[1]]
+
+          tif.info<-readLines(input.file,3)
+          tif.info<-strsplit(tif.info,',')
+          include<-(as.numeric(tif.info[[2]]))
+
+# checking that trainProp is correct
+ta<-table(dat$Split,dat$responseCount)
+ta
+
+#if there are background points, remove them here
+ta<-ta[-1,]
+ta<-ta[,-1]
+
+#checking that the trainProp was ballanced for each count all of these
+#should be approximately equal to the trainProp this works less well for
+#smaller sample sizes
+ta[2,]/(ta[1,]+ta[2,])
+
+
+#checks trainProp is correct
+sum(ta[2,])/sum(ta)
+sum(ta[1,])/sum(ta)
+
+#checking ratio of presence to absence should equal RatioPresAbs for both the test and train split
+sum(ta[1,2:dim(ta)[2]])/ta[1,1]
+sum(ta[2,2:dim(ta)[2]])/ta[2,1]
+
+
+#######################################################
+#### testing looking at an mds with counts case 3. Without a RatioPresAbs###########
+input.file<-"H:\\Desktop\\SAHM\\Data\\ChangeFamilyData\\MergedDataSet_1.csv"
+output.file<-"H:\\Desktop\\SAHM\\Output\\TestTrainSplit\\testtrain.mds"
+TestTrainSplit(input.file,output.file,response.col="ResponseCount",trainProp=.7)
+
+input.file<-output.file
+dat<-read.csv(input.file,skip=3,header=FALSE)
+
+          hl<-readLines(input.file,1)
+          hl=strsplit(hl,',')
+          colnames(dat) = hl[[1]]
+
+          tif.info<-readLines(input.file,3)
+          tif.info<-strsplit(tif.info,',')
+          include<-(as.numeric(tif.info[[2]]))
+
+# checking that trainProp is correct
+ta<-table(dat$Split,dat$responseCount)
+ta
+
+#if there are background points, remove them here
+ta<-ta[-1,]
+ta<-ta[,-1]
+
+#checking that the trainProp was ballanced for each count all of these
+#should be approximately equal to the trainProp this works less well for
+#smaller sample sizes
+ta[2,]/(ta[1,]+ta[2,])
+
+
+#checks trainProp is correct
+sum(ta[2,])/sum(ta)
+sum(ta[1,])/sum(ta)
+
+#checking ratio of presence to absence should equal RatioPresAbs for both the test and train split
+sum(ta[1,2:dim(ta)[2]])/ta[1,1]
+sum(ta[2,2:dim(ta)[2]])/ta[2,1]
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/RunTests.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/RunTests.r
new file mode 100644
index 0000000..7aba394
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/RunTests.r
@@ -0,0 +1,173 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.ma.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+source("PairsExplore.r")
+
+# Currently testing to see if models work with
+#  * new test train split
+#  * separation of model fit from prediction
+#  * working with count data
+#  * producing correct evaluation metrics
+#Future testing will include testing that factor columns are handled correctly
+
+
+#################################################################
+## Current test files
+input.file<-vector()
+input.file[1]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetNullModelTest.csv"
+input.file[2]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetNullSplit.csv"
+input.file[3]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetIncludeTest.csv"
+input.file[4]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetIncludeSplit.csv"
+input.file[5]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSet_1.csv"
+input.file[6]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSplitTest.csv"
+input.file[7]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetNullModelTest2.csv"
+output.file<-sub("851/","851/TestOutput/",input.file)
+output.file<-sub(".csv",".jpg",output.file)
+
+#######################################################
+Debug=FALSE
+rc="ResponseBinary"
+output.dir="C:/VisTrails/mtalbert_20110504T132851/TestOutput"
+
+#BRT TEST LIST
+      brt.list<-list()
+      #this is the default scenario
+      brt.list[[1]]<-list(make.p.tif=TRUE,
+       			make.binary.tif=TRUE,
+            tc=NULL,
+       			n.folds=3,
+       			alpha=1,
+            learning.rate=NULL,
+       			bag.fraction=.5,
+       			model.family="\"bernoulli\"",
+       			prev.stratify=TRUE,
+       			max.trees=10000,
+       			opt.methods=2,
+       			seed=NULL,
+       		  tolerance.method="\"auto\"",
+       		  tolerance=.001,
+             debug.mode=FALSE)
+      #setting up some alternative scenarios
+      brt.list[[2]]<-brt.list[[1]]
+      brt.list[[2]]$learning.rate=.002
+
+      brt.list[[3]]<-brt.list[[1]]
+      brt.list[[3]]$bag.fraction=1
+      brt.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      brt.use.list<-list()
+      brt.use.list[[1]]<-c(3,4,5)
+      brt.use.list[[2]]<-c(5,6,7)
+      brt.use.list[[3]]<-c(3)
+
+#MARS TEST LIST
+  mars.list<-list()
+      #this is the default scenario
+      mars.list[[1]]<-list(make.p.tif=T,
+            make.binary.tif=T,
+            mars.degree=1,
+            mars.penalty=2,
+            model.family="\"binomial\"",
+            script.name="\"mars.r\"",
+            opt.methods=2,
+            save.model=TRUE,
+             debug.mode=FALSE)
+      #setting up some alternative scenarios
+      mars.list[[2]]<-mars.list[[1]]
+      mars.list[[2]]$mars.degree=2
+
+      mars.list[[3]]<-mars.list[[1]]
+      mars.list[[3]]$mars.penalty=3
+      mars.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      mars.use.list<-list()
+      mars.use.list[[1]]<-c(3)
+      mars.use.list[[2]]<-c(2,5,6,7)
+      mars.use.list[[3]]<-c(3,4)
+
+#GLM TEST LIST
+  glm.list<-list()
+      #this is the default scenario
+      glm.list[[1]]<-list(make.p.tif=TRUE,
+          make.binary.tif=TRUE,
+          simp.method="\"AIC\"",
+          model.family="\"binomial\"",
+          opt.methods=2,
+          save.model=FALSE,
+          debug.mode=FALSE)
+      #setting up some alternative scenarios
+      glm.list[[2]]<-glm.list[[1]]
+      glm.list[[2]]$simp.method="\"BIC\""
+
+      glm.list[[3]]<-glm.list[[1]]
+      glm.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      glm.use.list<-list()
+      glm.use.list[[1]]<-c(1,3)
+      glm.use.list[[2]]<-c(2,5,6,7)
+      glm.use.list[[3]]<-c(1,2,3,4)
+
+#RF TEST LIST
+  rf.list<-list()
+      #this is the default scenario
+      rf.list[[1]]<-list(make.p.tif=T,
+          make.binary.tif=T,
+          responseCurveForm="\"pdf\"",
+          xtest=NULL,
+          ytest=NULL,
+          n.trees=1000,
+          mtry=NULL,
+          samp.replace=FALSE,
+          sampsize=NULL,
+          nodesize=NULL,
+          maxnodes=NULL,
+          importance=FALSE,
+          localImp=FALSE,
+          nPerm=1,
+          proximity=NULL,
+          oob.prox=proximity,
+          norm.votes=TRUE,
+          do.trace=FALSE,
+          keep.forest=NULL,
+          keep.inbag=FALSE,
+          make.r.curves=T,
+          seed=NULL,
+          opt.methods=2,
+          save.model=TRUE,
+          seed=NULL)
+      #setting up some alternative scenarios
+      rf.list[[2]]<-rf.list[[1]]
+      rf.list[[2]]$samp.replace=TRUE
+
+      rf.list[[3]]<-rf.list[[1]]
+      rf.list[[3]]$opt.methods=4
+      rf.list[[3]]$seed=5
+      
+      rf.list[[4]]<-rf.list[[1]]
+      rf.list[[4]]$opt.methods=4
+      rf.list[[4]]$seed=5
+      
+      #which datasets to test with the given set of parameters
+      rf.use.list<-list()
+      rf.use.list[[1]]<-c(1,3)
+      rf.use.list[[2]]<-c(2,5,6,7)
+      rf.use.list[[3]]<-c(3,4)
+      rf.use.list[[4]]<-c(3,4)
+      
+      
+parameter.list<-list(brt.list=brt.list,brt.use.list=brt.use.list,mars.list=mars.list,mars.use.list=mars.use.list,
+    glm.list=glm.list,glm.use.list=glm.use.list,rf.list=rf.list,rf.use.list=rf.use.list)
+
+Out<-TestFunction(input.file,parameter.list,Debug,rc,output.dir)
+
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/SyntheticData.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/SyntheticData.r
new file mode 100644
index 0000000..48f73f1
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/SyntheticData.r
@@ -0,0 +1,78 @@
+library(raster)
+slopedeg<-raster("C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\slopedeg.tif")
+bio_4<-raster("C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\bio_4_wgs84.tif")
+bio_12<-raster("C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\bio_12_wgs84.tif")
+bio_7<-raster("C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\bio_7_wgs84.tif")
+
+#putting bio_4 on a 0 to 1 range
+temp<-as.matrix(log(bio_4))
+b4<-(log(bio_4)-min(temp))/max(temp-min(temp))
+
+#putting bio_7 on a 0 to 1 range
+temp<-as.matrix(2^bio_7)
+b7<-(2^bio_7-min(temp))/max(temp-min(temp))
+
+#putting slopedeg on a 0 to 1 range
+temp<-as.matrix(slopedeg)
+sld<-(slopedeg-min(temp))/max(temp-min(temp))
+
+#making bio_12 discrete
+temp<-as.matrix(bio_12)
+qan<-quantile(temp,probs=c(.25,.5,.75))
+b12<-.25+.25*(bio_12>=qan[1])+.25*(bio_12>qan[2])+.25*(bio_12>qan[3])
+writeRaster(b12, filename="C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\Cat12_wgs84.tif")
+
+
+#for binomal data
+myFct<-.5*b4*b7+.25*sld+.25*b12+.18
+m<-as.matrix(myFct)
+xcoord<-sample(dim(m)[1],size=200)
+ycoord<-sample(dim(m)[2],size=200)
+cells<-cbind(xcoord,ycoord)
+cellNumbs<-cellFromRowCol(myFct,xcoord,ycoord)
+
+writeRaster(myFct, filename="C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\BinomialSurface.tif")
+
+value<-extract(myFct,cellNumbs)
+responseBinary<-rbinom(length(value),1,value)
+xy = xyFromCell(myFct, cellNumbs)
+
+Binom.out<-as.data.frame(cbind(xy,responseBinary))
+write.table(Binom.out,file="C:\\VisTrails\\mtalbert_20110504T132851\\FieldDatBinom.csv",row.names=FALSE,col.names=TRUE,sep=",",quote=FALSE)
+
+#now for Poisson data generate a lambda surface we want a lot of zeros
+
+PoisFct<-myFct*4
+m<-as.matrix(PoisFct)
+xcoord<-sample(dim(m)[1],size=200)
+ycoord<-sample(dim(m)[2],size=200)
+cells<-cbind(xcoord,ycoord)
+cellNumbs<-cellFromRowCol(PoisFct,xcoord,ycoord)
+
+value<-extract(PoisFct,cellNumbs)
+responseCount<-rpois(length(value),value)
+xy = xyFromCell(myFct, cellNumbs)
+
+par(mfrow=c(2,2))
+plot(as.vector(as.matrix(b4)),as.vector(as.matrix(PoisFct)))
+plot(as.vector(as.matrix(b7)),as.vector(as.matrix(PoisFct)))
+plot(as.vector(as.matrix(sld)),as.vector(as.matrix(PoisFct)))
+plot(as.vector(as.matrix(b12)),as.vector(as.matrix(PoisFct)))
+
+writeRaster(PoisFct, filename="C:\\VisTrails\\mtalbert_20110504T132851\\PARC_1\\PoissonSurface.tif")
+
+Pois.out<-as.data.frame(cbind(xy,responseCount))
+write.table(Pois.out,file="C:\\VisTrails\\mtalbert_20110504T132851\\FieldDatPois.csv",row.names=FALSE,col.names=TRUE,sep=",",quote=FALSE)
+
+BRT.Out<-raster("C:\\VisTrails\\prob_map.tif")
+BRT.Bin<-raster("C:\\VisTrails\\prob_map.tif")
+resids<-BRT.Out-PoisFct
+
+par(mfrow=c(2,2))
+plot(resids)
+plot(PoisFct)
+plot(BRT.Out)
+
+par(mfrow=c(2,1))
+hist(as.matrix(PoisFct),breaks=40)
+hist(as.matrix(BRT.Out),breaks=40)
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestCountModelRuns.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestCountModelRuns.r
new file mode 100644
index 0000000..cbd6991
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestCountModelRuns.r
@@ -0,0 +1,186 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.ma.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+
+# Currently testing to see if models work with
+#  * new test train split
+#  * separation of model fit from prediction
+#  * working with count data
+#  * producing correct evaluation metrics
+#Future testing will include testing that factor columns are handled correctly
+#trace(proc.tiff,browser)
+#options(error=expression(if(interactive()) recover() else dump.calls()))
+#options(error=NULL)
+#trace(proc.tiff,browser)
+#######################################################
+## Count TESTING
+#this file does not have a test training split but uses Poisson data
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\mtalbert_20110607T084252\\TestTrainingSplit_2.csv"
+rc="responseCount"
+output.dir="C:\\VisTrails"
+ 
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "poisson", opt.methods=1,seed=1,save.model=TRUE)
+
+    PredictModel(workspace=paste("C:\\VisTrails","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r",model.family="poisson")
+
+    PredictModel(workspace=paste(output.dir,"modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",model.family="poisson",script.name="mars.r")
+
+    PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+############################################################################
+#Making sure some old stuff works here's a presence absence model with no
+rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", opt.methods=2,seed=1,save.model=TRUE)
+
+PredictModel(workspace=paste("C:\\VisTrails","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+## Now testing GLM model with count data
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\mtalbert_20110607T084252\\TestTrainingSplit_2.csv"
+    rc="responseCount"
+ output.dir="C:\\VisTrails"
+ 
+
+
+##this does have a test training split, trying to figure out some good output for evaluation metrics module
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\mtalbert_20110607T084252\\MergedDataset_2.csv"
+    rc="responseCount"
+
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "poisson", opt.methods=1,seed=1,save.model=TRUE)
+
+
+#########################################################
+## MARS TESTING
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\mtalbert_20110607T084252\\MergedDataset_1.csv"
+    rc="responseCount"
+
+
+
+
+#########################################################
+## GLM TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+########################################################
+## RANDOM FOREST TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.rf.fct(ma.name=input.file,
+  tif.dir=NULL,
+  output.dir=output.dir,
+  response.col=rc,make.p.tif=F,make.binary.tif=F,
+      debug.mode=T,n.trees=1000)
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+      
+      
+#Now testing to make sure this code works with no test training split
+ma.name<-"H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\ModelOutputCheck\\NewInput.csv"
+ma.name="C:\\VisTrails\\mtalbert_20110406T093111\\sahm4h5b1t.mds"
+
+ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv"
+fit.brt.fct(ma.name=ma.name,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+           learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+
+
+#this is the GLM_pluggable1.r under NewMDSBuilder (Works with new vistrails format)
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110510T100421\\TestTrainingSplit_1.csv"
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+rc="responseCount"
+
+      fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col=rc,make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+
+#Mars check Works with new vistrails format
+      fit.mars.fct(ma.name=ma.name,
+        tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+        response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+
+fit.rf.fct(ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv",
+  tif.dir=NULL,
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      debug.mode=T,n.trees=1000,ma.test=NULL,make.r.curves=T,script.name="glm.r")
+
+
+
+#this one does not subset paths set up in the old way works with old sahm as well as for
+fit.brt.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,ma.test=NULL,alpha=1,script.name="brt.r",
+     learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+     
+
+fit.mars.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+fit.glm.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",ma.test=NULL,script.name="glm.r")
+  
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestFunction2.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestFunction2.r
new file mode 100644
index 0000000..5ad66a1
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestFunction2.r
@@ -0,0 +1,23 @@
+TestFunction<-function(input.file,parameter.list,Debug,rc,output.dir){
+
+    ifelse(Debug,
+        options(error=expression(if(interactive()) recover() else dump.calls())),
+        options(error=NULL))
+ Brt.Out<-list()
+ Mars.Out<-list()
+ Glm.Out<-list()
+ RF.Out<-list()
+  for (i in 1:length(input.file)){
+      Brt.Out[[i]]<-unit.test(i,parameter.list$brt.use.list,parameter.list$brt.list,"brt",outpur.dir,rc)
+      Mars.Out[[i]]<-unit.test(i,parameter.list$mars.use.list,parameter.list$mars.list,"mars",outpur.dir,rc)
+      Glm.Out[[i]]<-unit.test(i,parameter.list$mars.use.list,parameter.list$mars.list,"glm",outpur.dir,rc)
+      RF.Out[[i]]<-unit.test(i,parameter.list$mars.use.list,parameter.list$mars.list,"rf",outpur.dir,rc)
+    } #end file for loop
+
+    options(error=NULL)
+    Out.list=list(Brt.Out=Brt.Out,Mars.Out=Mars.Out,Glm.Out=Glm.Out,RF.Out)
+    return(Out.list)
+}
+
+
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestModelRuns (2).r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestModelRuns (2).r
new file mode 100644
index 0000000..bc2aef4
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestModelRuns (2).r	
@@ -0,0 +1,148 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.ma.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+source("PairsExplore.r")
+
+# Currently testing to see if models work with
+#  * new test train split
+#  * separation of model fit from prediction
+#  * working with count data
+#  * producing correct evaluation metrics
+#Future testing will include testing that factor columns are handled correctly
+
+
+#################################################################
+## Current test files
+input.file<-vector()
+input.file[1]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetNullModelTest.csv"
+input.file[2]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetNullSplit.csv"
+input.file[3]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetIncludeTest.csv"
+input.file[4]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetIncludeSplit.csv"
+input.file[5]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSet_1.csv"
+input.file[6]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSplitTest.csv"
+input.file[7]="C:/VisTrails/mtalbert_20110504T132851/MergedDataSetNullModelTest2.csv"
+output.file<-sub("851/","851/TestOutput/",input.file)
+output.file<-sub(".csv",".jpg",output.file)
+
+#######################################################
+Debug=FALSE
+rc="ResponseBinary"
+output.dir="C:/VisTrails/mtalbert_20110504T132851/TestOutput"
+
+#BRT TEST LIST
+      brt.list<-list()
+      #this is the default scenario
+      brt.list[[1]]<-list(make.p.tif=TRUE,
+       			make.binary.tif=TRUE,
+            tc=NULL,
+       			n.folds=3,
+       			alpha=1,
+            learning.rate=NULL,
+       			bag.fraction=.5,
+       			model.family="\"bernoulli\"",
+       			prev.stratify=TRUE,
+       			max.trees=10000,
+       			opt.methods=2,
+       			seed=NULL,
+       		  tolerance.method="\"auto\"",
+       		  tolerance=.001,
+             debug.mode=FALSE)
+      #setting up some alternative scenarios
+      brt.list[[2]]<-brt.list[[1]]
+      brt.list[[2]]$learning.rate=.002
+
+      brt.list[[3]]<-brt.list[[1]]
+      brt.list[[3]]$bag.fraction=1
+      brt.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      brt.use.list<-list()
+      brt.use.list[[1]]<-c(3,4,5)
+      brt.use.list[[2]]<-c(5,6,7)
+      brt.use.list[[3]]<-c(3)
+
+#MARS TEST LIST
+  mars.list<-list()
+      #this is the default scenario
+      mars.list[[1]]<-list(make.p.tif=T,
+            make.binary.tif=T,
+            mars.degree=1,
+            mars.penalty=2,
+            model.family="\"binomial\"",
+            script.name="\"mars.r\"",
+            opt.methods=2,
+            save.model=TRUE,
+             debug.mode=FALSE)
+      #setting up some alternative scenarios
+      mars.list[[2]]<-mars.list[[1]]
+      mars.list[[2]]$mars.degree=2
+
+      mars.list[[3]]<-mars.list[[1]]
+      mars.list[[3]]$mars.penalty=3
+      mars.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      mars.use.list<-list()
+      mars.use.list[[1]]<-c(3)
+      mars.use.list[[2]]<-c(2,5,6,7)
+      mars.use.list[[3]]<-c(3,4)
+
+#GLM TEST LIST
+  glm.list<-list()
+      #this is the default scenario
+      glm.list[[1]]<-list(make.p.tif=TRUE,
+          make.binary.tif=TRUE,
+          simp.method="\"AIC\"",
+          model.family="\"binomial\"",
+          opt.methods=2,
+          save.model=FALSE,
+          debug.mode=FALSE)
+      #setting up some alternative scenarios
+      glm.list[[2]]<-glm.list[[1]]
+      glm.list[[2]]$simp.method="\"BIC\""
+
+      glm.list[[3]]<-glm.list[[1]]
+      glm.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      glm.use.list<-list()
+      glm.use.list[[1]]<-c(1,3)
+      glm.use.list[[2]]<-c(2,5,6,7)
+      glm.use.list[[3]]<-c(1,2,3,4)
+
+#RF TEST LIST
+  rf.list<-list()
+      #this is the default scenario
+      rf.list[[1]]<-list(make.p.tif=TRUE,
+          make.binary.tif=TRUE,
+          simp.method="\"AIC\"",
+          model.family="\"binomial\"",
+          opt.methods=2,
+          save.model=FALSE,
+          debug.mode=FALSE)
+      #setting up some alternative scenarios
+      rf.list[[2]]<-rf.list[[1]]
+      rf.list[[2]]$simp.method="\"BIC\""
+
+      rf.list[[3]]<-rf.list[[1]]
+      rf.list[[3]]$opt.methods=4
+
+      #which datasets to test with the given set of parameters
+      rf.use.list<-list()
+      rf.use.list[[1]]<-c(1,3)
+      rf.use.list[[2]]<-c(2,5,6,7)
+      rf.use.list[[3]]<-c(1,2,3,4)
+      
+parameter.list<-list(brt.list=brt.list,brt.use.list=brt.use.list,mars.list=mars.list,mars.use.list=mars.use.list,
+    glm.list=glm.list,glm.use.list=glm.use.list,rf.list=rf.list,rf.use.list=rf.use.list)
+
+Out<-TestFunction(input.file,parameter.list,Debug,rc,output.dir)
+
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestModelRuns.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestModelRuns.r
new file mode 100644
index 0000000..3cb9a15
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestModelRuns.r
@@ -0,0 +1,174 @@
+setwd("I:\\VisTrails\\Central_VisTrailsInstall_debug\\vistrails\\packages\\sahm\\pySAHM\\Resources\\R_Modules")
+source("FIT_BRT_pluggable.r")
+source("FIT_MARS_pluggable.r")
+source("FIT_RF_pluggable.r")
+source("FIT_GLM_pluggable.r")
+
+source("EvaluationStats.r")
+source("TestTrainRocPlot.r")
+source("read.ma.r")
+source("proc.tiff.r")
+source("PredictModel.r")
+
+# Currently testing to see if models work with
+#  * new test train split
+#  * separation of model fit from prediction
+#  * working with count data
+#  * producing correct evaluation metrics
+#Future testing will include testing that factor columns are handled correctly
+#trace(proc.tiff,browser)
+#options(error=expression(if(interactive()) recover() else dump.calls()))
+#options(error=NULL)
+#trace(proc.tiff,browser)
+list.files("I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110810T153126")
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110810T153126\\CovariateCorrelationOutputMDS_anothertry.csv"
+output.dir="C:\\temp\\SAHMDebugJunk"
+rc="responseBinary"
+fit.rf.fct(ma.name=input.file,
+  tif.dir=NULL,
+  output.dir=output.dir,
+  response.col=rc,make.p.tif=F,make.binary.tif=F,
+      debug.mode=T,n.trees=1000)
+
+PredictModel(workspace=paste(output.dir,"modelWorkspace",sep="\\"),out.dir=output.dir)
+
+#######################################################
+## BRT TESTING
+
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+input.file="N:\\Active\\FORT_RAM\\VisTrails\\workspace\\mtalbert_20110602T155823\\MergedDataset_1.csv"
+    rc="responseCount"
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110721T095017\\MergedDataset_2.csv"
+output.dir="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110721T095017\\brtoutput_1"
+rc="responseBinary"
+
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110804T084435\\CovariateCorrelationOutputMDS_initial.csv"
+output.dir="I:\\VisTrails\\WorkingFiles\\workspace\\morisettej_20110804T084435\\brtoutput_1"
+rc="responseBinary"
+fit.brt.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir=output.dir,
+      response.col=rc,test.resp.col="response",make.p.tif=F,make.binary.tif=F,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=.3,script.name="brt.r",
+      learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, max.trees = NULL,opt.methods=1,seed=1,save.model=TRUE)
+
+source("FIT_MARS_pluggable.r")
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+           
+#########################################################
+## MARS TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+
+    #this input file does not have a test training split
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+    rc="ResponseBinary"
+    
+    #this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.mars.fct(ma.name=input.file,
+        tif.dir=NULL,output.dir=output.dir,
+        response.col=rc,make.p.tif=F,make.binary.tif=F,
+        mars.degree=1,mars.penalty=2,debug.mode=F,responseCurveForm="pdf",model.family="binomial",script.name="mars.r")
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+#########################################################
+## GLM TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,
+      output.dir=output.dir,
+      response.col=rc,make.p.tif=F,make.binary.tif=F,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+
+########################################################
+## RANDOM FOREST TESTING
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+    rc="ResponseBinary"
+    input.file="C:\\VisTrails\\mtalbert_20110504T132851\\MergedDataSet_1.csv"
+
+#this file does have a test training split
+    input.file<-"I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110519T121044\\TestTrainingSplit_1.csv"
+    rc="responseBinary"
+    
+fit.rf.fct(ma.name=input.file,
+  tif.dir=NULL,
+  output.dir=output.dir,
+  response.col=rc,make.p.tif=F,make.binary.tif=F,
+      debug.mode=T,n.trees=1000)
+
+PredictModel(workspace=paste("C:\\VisTrails\\mtalbert_20110504T132851","modelWorkspace",sep="\\"),out.dir="C:\\VisTrails")
+      
+      
+#Now testing to make sure this code works with no test training split
+ma.name<-"H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\ModelOutputCheck\\NewInput.csv"
+ma.name="C:\\VisTrails\\mtalbert_20110406T093111\\sahm4h5b1t.mds"
+
+ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv"
+fit.brt.fct(ma.name=ma.name,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,alpha=1,script.name="brt.r",
+           learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+
+
+#this is the GLM_pluggable1.r under NewMDSBuilder (Works with new vistrails format)
+input.file="I:\\VisTrails\\WorkingFiles\\workspace\\talbertc_20110510T100421\\TestTrainingSplit_1.csv"
+output.dir="C:\\VisTrails\\mtalbert_20110504T132851"
+rc="responseCount"
+
+      fit.glm.fct(ma.name=input.file,
+      tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+      response.col=rc,make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",script.name="glm.r")
+
+
+#Mars check Works with new vistrails format
+      fit.mars.fct(ma.name=ma.name,
+        tif.dir=NULL,output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+        response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+            mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+
+fit.rf.fct(ma.name="I:\\VisTrails\\WorkingFiles\\workspace\\GYA_demo\\test.csv",
+  tif.dir=NULL,
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="ResponseBinary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      debug.mode=T,n.trees=1000,ma.test=NULL,make.r.curves=T,script.name="glm.r")
+
+
+
+#this one does not subset paths set up in the old way works with old sahm as well as for
+fit.brt.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="cross-validation",debug.mode=T,responseCurveForm="pdf",tc=NULL,n.folds=3,ma.test=NULL,alpha=1,script.name="brt.r",
+     learning.rate =NULL, bag.fraction = 0.5,prev.stratify = TRUE, model.family = "bernoulli", max.trees = NULL)
+     
+
+fit.mars.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      mars.degree=1,mars.penalty=2,debug.mode=T,responseCurveForm="pdf",ma.test=NULL,model.family="binomial",script.name="mars.r")
+
+fit.glm.fct(ma.name="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\canadathistle_gcs_grp_r_mds_train.mds",
+  tif.dir="H:\\Desktop\\SAHM\\Data\\CanadaThistle\\layers",
+  output.dir="H:\\Desktop\\SAHM\\Rcode\\ExposingModelParameters\\PDFCheck",
+  response.col="response.binary",test.resp.col="response",make.p.tif=T,make.binary.tif=T,
+      simp.method="AIC",debug.mode=T,responseCurveForm="pdf",ma.test=NULL,script.name="glm.r")
+  
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestingRandomForest.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestingRandomForest.r
new file mode 100644
index 0000000..b70a563
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/TestingRandomForest.r
@@ -0,0 +1,17 @@
+dat<-read.csv("C:\\VisTrails\\DICK_MDS_binary.csv")
+
+rf.full <- randomForest(x=dat[,-1],y=factor(dat[,1]),importance=TRUE,
+        ntree=1000, replace=FALSE)
+
+pred<-predict(rf.full, newdata=dat[,-1],type="prob")[,2]
+
+null.dev<-calc.deviance(dat[,1], rep(p.bar,times=length(dat[,1])),family="binomial")*nrow(dat)
+    dev.fit<-calc.deviance(dat[,1], pred, family="binomial")*nrow(dat)
+    dev.exp <- null.dev - dev.fit
+    pct.dev.exp <- dev.exp/null.dev*100
+    
+r<-randomForest(x=dat[,-1],y=factor(out$dat$ma$ma[,1]),xtest=xtest,ytest=ytest,importance=TRUE, ntree=n.trees,
+        mtry=mtry,replace=samp.replace,sampsize=ifelse(is.null(sampsize),(ifelse(samp.replace,nrow(x),ceiling(.632*nrow(x)))),sampsize),
+        nodesize=ifelse(is.null(nodesize),(if (!is.null(y) && !is.factor(y)) 5 else 1),nodesize),maxnodes=maxnodes,
+        localImp=localImp, nPerm=nPerm, keep.forest=ifelse(is.null(keep.forest),!is.null(y) && is.null(xtest),keep.forest),
+        corr.bias=corr.bias, keep.inbag=keep.inbag)
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/Testing/unit.test.r b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/unit.test.r
new file mode 100644
index 0000000..83a3985
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/Testing/unit.test.r
@@ -0,0 +1,49 @@
+unit.test<-function(i,use.list,model.list,model,outpur.dir,rc){
+  list.fct<-function(x,i) sum(!is.na(match(x=i,table=x)))
+      valid.params<-which(unlist(lapply(use.list,list.fct,i=i))!=0,arr.ind=TRUE)
+       Model.Out<-list()
+       Model.Out[[i]]<-data.frame(list("FctFailed"=rep(FALSE,times=length(valid.params)),
+                              "PredictFailed"=rep(FALSE,times=length(valid.params)),
+                              "NullDev"=rep(0,times=length(valid.params)),
+                              "FitDev"=rep(0,times=length(valid.params)),
+                              "Correlation"=rep(0,times=length(valid.params)),
+                              "ErrorMessage"=rep("No Error",times=length(valid.params))),row.names=valid.params)
+
+                            class(Model.Out[[i]]$ErrorMessage)<-"character"
+      if(length(valid.params)!=0){
+      for(j in 1:length(valid.params)){
+
+            k<-valid.params[j]
+                   if(Debug==TRUE) parameter.list$brt.list[[k]]$debug.mode=TRUE
+
+                    a<-paste(paste(names(model.list[[k]]),model.list[[k]],sep="="),collapse=",")
+                    call.fct<-paste("fit.",model,".fct(ma.name=\"",input.file[i],
+                                  "\", tif.dir=NULL,output.dir=\"",output.dir,"\", response.col=\"",rc,"\",",a,")",sep="")
+                    #Right here I should remove almost everything since all output is written to the global environment
+                    call.predict<-"PredictModel(workspace=paste(output.dir,\"modelWorkspace\",sep=\"/\"),out.dir=output.dir)"
+                      if(Debug==FALSE) {call.fct<-paste("try(",call.fct,",silent=TRUE)",sep="")
+                                      call.predict<-paste("try(",call.predict,")",sep="")
+                     #so that we don't predict on an old copy in the next loop
+                     file.remove(paste(output.dir,"modelWorkspace",sep="/"))
+                                        }
+
+                  fct.output<-eval(parse(text=call.fct))
+                    sink()
+                  pred.output<-eval(parse(text=call.predict))
+                    sink()
+                if(class(fct.output)=="try-error") {
+                Model.Out[[i]][j,1]=TRUE
+                Model.Out[[i]][j,6]=fct.output[1]
+                  }  else {
+                  Model.Out[[i]][j,1]=FALSE
+                  Model.Out[[i]][j,3]<-fct.output$mods$auc.output$null.dev
+                  Model.Out[[i]][j,4]<-fct.output$mods$auc.output$dev.fit
+                  Model.Out[[i]][j,5]<-fct.output$mods$auc.output$correlation
+                    }
+                if(class(pred.output)=="try-error") Model.Out[[i]][j,2]=TRUE
+
+          }
+          print(Model.Out)
+          } ## END BRT
+return(Model.Out)
+ }
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/check.libs.r b/contrib/sahm/pySAHM/Resources/R_Modules/check.libs.r
new file mode 100644
index 0000000..49a16bb
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/check.libs.r
@@ -0,0 +1,16 @@
+check.libs <- function(libs,out){
+
+      lib.mssg <- unlist(suppressMessages(suppressWarnings(lapply(libs,require,quietly = T, warn.conflicts=F,character.only=T))))
+      if(any(!lib.mssg)){
+            install.packages(unlist(libs[!lib.mssg]), repos = "http://cran.r-project.org")
+            lib.mssg <- unlist(suppressMessages(suppressWarnings(lapply(unlist(libs[!lib.mssg]),require,quietly = T, warn.conflicts=F,character.only=T))))
+            }
+        if(any(!lib.mssg)) {
+           out$ec <- out$ec+1
+            out$dat$missing.libs <-  paste(unlist(libs)[!lib.mssg],collapse="; ")
+        stop("the following package(s) could not be loaded:",out$dat$missing.libs)
+        }
+      return(out)
+      }
+
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/make.auc.r b/contrib/sahm/pySAHM/Resources/R_Modules/make.auc.r
new file mode 100644
index 0000000..9e50dfa
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/make.auc.r
@@ -0,0 +1,136 @@
+make.auc.plot.jpg<-function(ma.reduced,pred,plotname,modelname,test.split=FALSE,thresh=NULL,train=NULL,train.pred=NULL,opt.methods=2,weight,out){
+
+      if(is.null(weight)) weight=rep(1,times=dim(ma.reduced)[1])
+    auc.data <- data.frame(ID=1:nrow(ma.reduced),pres.abs=ma.reduced[,1],pred=pred)
+    p.bar <- sum(auc.data$pres.abs * weight) / sum(weight)
+    n.pres <- sum(auc.data$pres.abs>=1)
+    n.abs <- nrow(auc.data)-n.pres
+
+    null.dev<-calc.dev(auc.data$pres.abs, rep(p.bar,times=length(auc.data$pres.abs)), weight, family=out$input$model.family)$deviance*nrow(ma.reduced)
+    dev.fit<-calc.dev(auc.data$pres.abs, pred, weight, family=out$input$model.family)$deviance*nrow(ma.reduced)
+    dev.exp <- null.dev - dev.fit
+    pct.dev.exp <- dev.exp/null.dev*100
+   correlation<-cor(auc.data$pres.abs,pred)
+    residual.smooth.fct<-NULL
+     if(test.split==FALSE) residual.smooth.fct<-resid.image(calc.dev(auc.data$pres.abs, pred, weight, family=out$input$model.family)$dev.cont,pred,
+          auc.data$pres.abs,out$dat$ma$train.xy[,1],out$dat$ma$train.xy[,2],out$input$model.family,out$input$output.dir,out)
+
+    if(is.null(thresh) & out$input$model.family!="poisson"){
+      thresh <- as.numeric(optimal.thresholds(auc.data,opt.methods=opt.methods))[2]
+    }
+
+    if(out$input$model.family%in%c("binomial","bernoulli")){
+      auc.fit <- auc(auc.data,st.dev=T)
+          if(test.split==TRUE){
+            jpeg(file=plotname)
+            d<-data.frame(ID=1:nrow(train),pres.abs=train[,1],pred=train.pred)
+            thresh<- as.numeric(optimal.thresholds(d,opt.methods=opt.methods))[2]
+            TestTrainRocPlot(DATA=d,opt.thresholds=thresh,add.legend=FALSE,lwd=2)
+            TestTrainRocPlot(auc.data,model.names=modelname,opt.thresholds=thresh,add.roc=TRUE,line.type=2,color="red",add.legend=FALSE)
+            legend(x=.66,y=.2,c("Training Split","Testing Split"),lty=2,col=c("black","red"),lwd=2)
+            graphics.off()}
+          else {
+            jpeg(file=plotname)
+            TestTrainRocPlot(auc.data,model.names=modelname,opt.thresholds=thresh)
+            graphics.off()
+          }
+        cmx <- cmx(auc.data,threshold=thresh)
+        PCC <- pcc(cmx,st.dev=F)*100
+        SENS <- sensitivity(cmx,st.dev=F)
+        SPEC <- specificity(cmx,st.dev=F)
+        KAPPA <- Kappa(cmx,st.dev=F)
+        TSS <- SENS+SPEC-1
+    }
+
+    if(out$input$model.family%in%c("poisson")){
+      auc.fit <- auc(auc.data,st.dev=T)
+          if(test.split==FALSE){
+            jpeg(file=plotname)
+            par(mfrow=c(2,2))
+            #plot(out$mods$final.mod)
+             plot(log(pred[pred!=0]),(auc.data$pres.abs[pred!=0]-pred[pred!=0]),xlab="Predicted Values (log scale)",ylab="Residuals",main="Residuals vs Fitted",ylim=c(-3,3))
+              abline(h=0,lty=2)
+              #this is the residual plot from glm but I don't think it will work for anything else
+              qqnorm(residuals(out$mods$final.mod),ylab="Std. deviance residuals")
+              qqline(residuals(out$mods$final.mod))
+               yl <- as.expression(substitute(sqrt(abs(YL)), list(YL = as.name("Std. Deviance Resid"))))
+              plot(log(pred[pred!=0]),sqrt((abs(residuals(out$mods$final.mod,type="deviance")[pred!=0]))),xlab="Predicted Values (log Scale)",ylab=yl)
+            graphics.off()}
+       prediction.error<-sum((auc.data$pres.abs-pred)^2)
+       cmx=PCC=SENS=SPEC=KAPPA=TSS<-NA
+    }
+
+      calibration.stats<-calibration(auc.data$pres.abs, pred, family =out$input$model.family)
+      response<-ma.reduced$response
+
+    capture.output(cat("\n\n============================================================",
+                        "\n\nEvaluation Statistics"),file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE)
+          if(!is.null(out$dat$ma$ma.test))
+                        capture.output(cat(" applied to",ifelse(!test.split,"train","test"), "split:\n",sep=" "),
+                        file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE)
+                      capture.output(cat( "\n",
+                       "\n\t Correlation Coefficient      : ",cor.test(pred,response)$estimate,
+                       "\n\t NULL Deviance                : ",null.dev,
+                       "\n\t Fit Deviance                 : ",dev.fit,
+                       "\n\t Explained Deviance           : ",dev.exp,
+                       "\n\t Percent Deviance Explained   : ",pct.dev.exp,
+                       file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE))
+
+                        if(out$input$model.family%in%c("binomial","bernoulli")){
+                               capture.output(cat(
+                                 "\n\n  Threshold Methods based on", switch(opt.methods,
+                                "1"=".5 threshold",
+                                "2"="Sens=Spec",
+                                "3"="maximize (sensitivity+specificity)/2",
+                                "4"="maximize Kappa",
+                                "5"="maximize percent correctly classified",
+                                "6"="predicted prevalence=observed prevalence",
+                                "7"="threshold=observed prevalence",
+                                "8"="mean predicted probability",
+                                "9"="minimize distance between ROC plot and (0,1)",
+                                ),
+                                "\n\t Threshold                    : ",
+                                thresh,
+                                "\n\n\t Confusion Matrix: \n\n"),
+                                print.table(cmx),
+                           cat("\n\t AUC                          : ",auc.fit[1,1],
+                           "\n\t Percent Correctly Classified : ",PCC,
+                           "\n\t Sensitivity                  : ",SENS,
+                           "\n\t Specificity                  : ",SPEC,
+                           "\n\t Kappa                        : ",KAPPA,
+                           "\n\t True Skill Statistic         : ",TSS,"\n"),
+                           file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE)
+                       }
+
+                         capture.output(cat( "\n\n   Calibration Statistics",
+                          "\n\t Intercept (general calibration)                            : ",calibration.stats[1],
+                          "\n\t Slope   (direction and variation in fit)                   : ",calibration.stats[2],
+                          "\n\t Testa0b1 (overall reliability of predictors)               : ",calibration.stats[3],
+                          "\n\t Testa0|b1(incorrect calibration given correct refinement)  : ",calibration.stats[4],
+                          "\n\t Testb1|a (refinement given correct calibration)            : ",calibration.stats[5],"\n",
+                       file=paste(out$dat$bname,"_output.txt",sep=""),append=TRUE))
+                       
+                       last.dir<-strsplit(out$input$output.dir,split="\\\\")
+                        parent<-sub(paste("\\\\",last.dir[[1]][length(last.dir[[1]])],sep=""),"",out$input$output.dir)
+
+                         compile.out<-paste(parent,
+                              paste(switch(out$input$model.family,"binomial"="Binary","bernoulli"="Binary","poisson"="Count"),ifelse(!is.null(out$dat$ma$ma.test),"TestTrain",""),
+                              "AppendedOutput.csv",sep="."),sep="/")
+
+                       if(out$input$model.family%in%c("binomial","bernoulli")){
+                       x=data.frame(cbind(c("Correlation Coefficient","Percent Deviance Explained","Percent Correctly Classified","Sensitivity","Specificity"),
+                            c(as.vector(cor.test(pred,response)$estimate),pct.dev.exp,PCC,SENS,SPEC)))
+                       }else  x=data.frame(cbind(c("Correlation Coefficient","Percent Deviance Explained","Prediction Error"),
+                            c(as.vector(cor.test(pred,response)$estimate),pct.dev.exp,prediction.error)))
+
+                        Header<-cbind(c("","Original Field Data","Field Data Template","PARC Output Folder","PARC Template","Covariate Selection Name",""),
+                            c(last.dir[[1]][length(last.dir[[1]])],
+                            out$dat$ma$input$OrigFieldData,out$dat$ma$input$FieldDataTemp,out$dat$ma$input$ParcOutputFolder,
+                            out$dat$ma$input$ParcTemplate,ifelse(length(out$dat$ma$input$CovSelectName)==0,"NONE",out$dat$ma$input$CovSelectName),""))
+
+AppendOut(compile.out,Header,x,out,test.split,parent=parent)
+
+    return(list(thresh=thresh,cmx=cmx,null.dev=null.dev,dev.fit=dev.fit,dev.exp=dev.exp,pct.dev.exp=pct.dev.exp,auc=auc.fit[1,1],auc.sd=auc.fit[1,2],
+        plotname=plotname,pcc=PCC,sens=SENS,spec=SPEC,kappa=KAPPA,tss=TSS,correlation=correlation,residual.smooth.fct=residual.smooth.fct))
+}
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/modalDialog.R b/contrib/sahm/pySAHM/Resources/R_Modules/modalDialog.R
new file mode 100644
index 0000000..0e185ce
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/modalDialog.R
@@ -0,0 +1,46 @@
+#This function was robbed from the dynamicGraphic library
+"modalDialog" <-
+function (title, question, entryInit, top = NULL, entryWidth = 20, 
+    returnValOnCancel = "ID_CANCEL", do.grab = FALSE) 
+{
+    dlg <- tktoplevel()
+    tkwm.deiconify(dlg)
+    if (do.grab) 
+        tkgrab.set(dlg)
+    tkfocus(dlg)
+    tkwm.title(dlg, title)
+    textEntryVarTcl <- tclVar(paste(entryInit))
+    textEntryWidget <- tkentry(dlg, width = paste(entryWidth), 
+        textvariable = textEntryVarTcl, background = "white")
+    tkgrid(tklabel(dlg, text = "       "))
+    tkgrid(tklabel(dlg, text = question), textEntryWidget)
+    tkgrid(tklabel(dlg, text = "       "))
+    ReturnVal <- returnValOnCancel
+    "onOK" <- function() {
+        ReturnVal <<- tclvalue(textEntryVarTcl)
+        tkgrab.release(dlg)
+        tkdestroy(dlg)
+        if (!is.null(top)) 
+            tkfocus(top)
+    }
+    "onCancel" <- function() {
+        ReturnVal <<- returnValOnCancel
+        tkgrab.release(dlg)
+        tkdestroy(dlg)
+        if (!is.null(top)) 
+            tkfocus(top)
+    }
+    OK.but <- tkbutton(dlg, text = "   OK   ", command = onOK)
+    Cancel.but <- tkbutton(dlg, text = " Cancel ", command = onCancel)
+    tkgrid(OK.but, Cancel.but)
+    tkgrid(tklabel(dlg, text = "    "))
+    tkfocus(dlg)
+    tkbind(dlg, "<Destroy>", function() {
+        tkgrab.release(dlg)
+        tkfocus(top)
+    })
+    tkbind(textEntryWidget, "<Return>", onOK)
+    tkwait.window(dlg)
+    return(ReturnVal)
+}
+
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/proc.tiff.r b/contrib/sahm/pySAHM/Resources/R_Modules/proc.tiff.r
new file mode 100644
index 0000000..767e335
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/proc.tiff.r
@@ -0,0 +1,212 @@
+proc.tiff<- function(model,vnames,tif.dir=NULL,filenames=NULL,pred.fct,factor.levels=NA,make.binary.tif=F,make.p.tif=T,
+    thresh=0.5,outfile.p="brt.prob.map.tif",outfile.bin="brt.bin.map.tif",tsize=2.0,NAval=-3000,fnames=NULL,logname=NULL,out){
+
+    # vnames,fpath,myfun,make.binary.tif=F,outfile=NA,outfile.bin=NA,output.dir=NA,tsize=10.0,NAval=NA,fnames=NA
+    # Written by Alan Swanson, YERC, 6-11-08
+    # Revised and Edited by Marian Talbert 2010-2011
+    # Description:
+    # This function is used to make predictions using a number of .tiff image inputs
+    # in cases where memory limitations don't allow the full images to be read in.
+    #
+    # Arguments:
+    # vname: names of variables used for prediction.  must be same as filenames and variables
+    #   in model used for prediction. do not include a .tif extension as this is added in code.
+    # fpath: path to .tif files for predictors. use forward slashes and end with a forward slash ('/').
+    # myfun: prediction function.  must generate a vector of predictions using only a
+    #   dataframe as input.
+    # outfile:  name of output file.  placed in same directory as input .tif files.  should
+    #   have .tif extension in name.
+    # tsize: size of dataframe used for prediction in MB.  this controls the size of tiles
+    #   extracted from the input files, and the memory usage of this function.
+    # NAval: this is the NAvalue used in the input files.
+    # fnames: if the filenames of input files are different from the variable names used in the
+    #   prediction model.
+    #
+    # Modification history:
+    # Fixed problem with NA values causing crash 10/2010
+    # Included code to produce MESS map and Mod map  8/2011
+    # Removed Tiff Directory option as well as some other unused code 10/2011
+    #
+    # Description:
+    # This function reads in a limited number of lines of each image (specified in terms of the
+    # size of the temporary predictor dataframe), applies a user-specified
+    # prediction function, and stores the results as matrix.  Alternatively, if an
+    # output file is specified, a file is written directly to that file in .tif format to
+    # the same directory as the input files.  Geographic information from the input images
+    # is retained.
+    #
+
+    # Start of function #
+    library(rgdal)
+    library(raster)
+    
+    MESS=out$input$MESS
+    if(is.null(thresh)) thresh<-.5
+    nvars<-length(vnames)
+
+# settup up output raster to match input raster
+
+          fullnames <- as.character(filenames[match(vnames,basename(sub(".tif","",filenames)))])
+          goodfiles <- file.access(fullnames)==0
+          if(!all(goodfiles)) stop(paste("ERROR: the following image files are missing:",paste(fullnames[!goodfiles],collapse=", ")))
+
+if(nvars<=1) MESS=FALSE
+ ######################################
+ # get spatial reference info from existing image file
+options(warn=-1)
+    gi <- GDALinfo(fullnames[1])
+options(warn=0)
+    dims <- as.vector(gi)[1:2]
+    ps <- as.vector(gi)[6:7]
+    ll <- as.vector(gi)[4:5]
+    pref<-attr(gi,"projection")
+
+RasterInfo=raster(fullnames[1])
+RasterInfo at file@datanotation<-"FLT4S"
+NAval<- -3.399999999999999961272e+38
+
+#To remove use of the Raster package I need to see if rgdal handles area or point correctly
+if(!is.na(match("AREA_OR_POINT=Point",attr(gi,"mdata")))){
+   xx<-RasterInfo  #this shifts by a half pixel
+nrow(xx) <- nrow(xx) - 1
+ncol(xx) <- ncol(xx) - 1
+rs <- res(xx)
+xmin(RasterInfo) <- xmin(RasterInfo) - 0.5 * rs[1]
+xmax(RasterInfo) <- xmax(RasterInfo) - 0.5 * rs[1]
+ymin(RasterInfo) <- ymin(RasterInfo) + 0.5 * rs[2]
+ymax(RasterInfo) <- ymax(RasterInfo) + 0.5 * rs[2]
+ }
+    # calculate position of upper left corner and get geotransform ala http://www.gdal.org/gdal_datamodel.html
+    ul <- c(ll[1],ll[2]+(dims[1])*ps[2])
+    gt<-c(ul[1],ps[1],0,ul[2],0,ps[2])
+
+    # setting tile size
+    MB.per.row<-dims[2]*nvars*32/8/1000/1024
+
+    nrows<-min(round(tsize/MB.per.row),dims[1])
+    bs<-c(nrows,dims[2])
+    nbs <- ceiling(dims[1]/nrows)
+    inc<-round(10/nbs,1)
+
+    chunksize<-bs[1]*bs[2]
+    tr<-blockSize(RasterInfo,chunksize=chunksize)
+
+  continuousRaster<-raster(RasterInfo)
+  continuousRaster <- writeStart(continuousRaster, filename=outfile.p, overwrite=TRUE)
+    if(make.binary.tif) {
+     binaryRaster<-raster(RasterInfo)
+      binaryRaster <- writeStart(binaryRaster, filename=outfile.bin, overwrite=TRUE)}
+    if(MESS) {
+     MessRaster<-raster(RasterInfo)
+     ModRaster<-raster(RasterInfo)
+      MessRaster <- writeStart(MessRaster, filename=sub("bin","mess",outfile.bin), overwrite=TRUE)
+      ModRaster <- writeStart(ModRaster, filename=sub("bin","MoD",outfile.bin), overwrite=TRUE)
+      }
+      
+temp <- data.frame(matrix(ncol=nvars,nrow=tr$size*ncol(RasterInfo))) # temp data.frame.
+names(temp) <- vnames
+FactorInd<-which(!is.na(match(names(temp),names(factor.levels))),arr.ind=TRUE)
+  if((nvars-length(FactorInd))==0) MESS<-FALSE #turn this off if only one factor column was selected
+    if(MESS) {
+      pred.rng<-temp
+        CalcMESS<-function(tiff.entry,pred.vect){
+              f<-sum(pred.vect<tiff.entry)/length(pred.vect)*100
+              if(is.na(f)) return(NA)
+              if(f==0) return((tiff.entry-min(pred.vect))/(max(pred.vect)-min(pred.vect))*100)
+              if(0<f & f<=50) return(2*f)
+              if(50<=f & f<100) return(2*(100-f))
+              if(f==100) return((max(pred.vect)-tiff.entry)/(max(pred.vect)-min(pred.vect))*100)
+              else return(NA)
+        }
+    }
+
+ Pred.Surface(object=RasterInfo,model=out$mods$auc.output$residual.smooth.fct,filename=sub("prob_map.tif","resid_map.tif",outfile.p),NAval=NAval)
+
+  min.pred<-1
+  max.pred<-0
+
+  for (i in 1:tr$n) {
+    strt <- c((i-1)*nrows,0)
+     region.dims <- c(min(dims[1]-strt[1],nrows),dims[2])
+        if (i==tr$n) if(is.null(dim(temp))) { temp <- temp[1:(tr$nrows[i]*dims[2])]
+                                              if(MESS) pred.rng<-pred.rng[1:(tr$nrows[i]*dims[2])]
+        } else {temp <- temp[1:(tr$nrows[i]*dims[2]),]
+                      if(MESS) pred.rng<-pred.rng[1:(tr$nrows[i]*dims[2]),]
+                }
+         # for the last tile...
+      for(k in 1:nvars) { # fill temp data frame
+            if(is.null(dim(temp))){
+              temp<- getValuesBlock(raster(fullnames[k]), row=tr$row[i], nrows=tr$size)
+            } else {temp[,k]<- getValuesBlock(raster(fullnames[k]), row=tr$row[i], nrows=tr$size)
+                    }
+                  if(MESS & !k%in%FactorInd){
+                        pred.range<-out$dat$ma$ma[,c(match(sub(".tif","",basename(fullnames[k])),names(out$dat$ma$ma)))]
+                        if(nvars>1) pred.rng[,k]<-mapply(CalcMESS,tiff.entry=temp[,k],MoreArgs=list(pred.vect=pred.range))
+                        else pred.rng<-mapply(CalcMESS,tiff.entry=temp,MoreArgs=list(pred.vect=pred.range))
+                         }
+            }
+            if(MESS & length(FactorInd)>0) pred.rng<-pred.rng[,-c(FactorInd)]
+    temp[temp==NAval] <- NA # replace missing values #
+    temp[is.na(temp)]<-NA #this seemingly worthless line switches NaNs to NA so they aren't predicted
+        if(sum(!is.na(factor.levels))){
+            factor.cols <- match(names(factor.levels),names(temp))
+            if(sum(!is.na(factor.cols))>0){
+            for(j in 1:length(factor.cols)){
+                if(!is.na(factor.cols[j])){
+                    temp[,factor.cols[j]] <- factor(temp[,factor.cols[j]],levels=factor.levels[[j]]$number,labels=factor.levels[[j]]$class)
+                }
+            }
+                   }}
+    ifelse(sum(!is.na(temp))==0,  # does not calculate predictions if all predictors in the region are na
+        preds<-matrix(data=NaN,nrow=region.dims[1],ncol=region.dims[2]),
+        preds <- t(matrix(pred.fct(model,temp),ncol=dims[2],byrow=T)))
+        min.pred<-min(na.omit(preds),min.pred)
+        max.pred<-max(na.omit(preds),max.pred)
+        preds[is.na(preds)]<-NAval
+    ## Writing to the rasters u
+     f<-function(x){
+     if(any(is.na(x))) return(NA)
+     a<-which(x==min(x),arr.ind=TRUE)
+     if(length(a>1)) a<-sample(a,size=1)
+     return(a)
+     }
+    if(MESS) {
+    MessRaster<-writeValues(MessRaster,apply(pred.rng,1,min), tr$row[i])
+    if(!is.null(dim(pred.rng)[2])) a<-apply(as.matrix(pred.rng),1,f)
+    else a<-rep(1,times=length(pred.rng))
+    #if(is.list(a)) a<-unlist(a)
+      ModRaster<-writeValues(ModRaster,a, tr$row[i])
+    }
+      if(make.binary.tif) binaryRaster<-writeValues(binaryRaster,(preds>thresh),tr$row[i])
+   continuousRaster <- writeValues(continuousRaster,preds, tr$row[i])
+  #NAvalue(continuousRaster) <-NAval
+        rm(preds);gc() #why is gc not working on the last call
+}
+
+  continuousRaster <- writeStop(continuousRaster)
+    a<-readGDAL(continuousRaster at file@name)
+    writeGDAL(a,continuousRaster at file@name, drivername = "GTiff",setStatistics=TRUE,mvFlag=NAval)
+
+
+
+  if(make.binary.tif) {
+    writeStop(binaryRaster)
+     a<-readGDAL(binaryRaster at file@name)
+    writeGDAL(a,binaryRaster at file@name, drivername = "GTiff",setStatistics=TRUE,mvFlag=NAval)
+  }
+   if(MESS) {
+    writeStop(MessRaster)
+      a<-readGDAL(MessRaster at file@name)
+      writeGDAL(a,MessRaster at file@name, drivername = "GTiff",setStatistics=TRUE,mvFlag=NAval)
+
+    writeStop(ModRaster)
+      a<-readGDAL(ModRaster at file@name)
+      d<-data.frame(as.integer(seq(1:ncol(pred.rng))),names(pred.rng))
+      names(d)=c("Value","Class")
+      ModRaster at file@datanotation<-"INT1U"
+      write.dbf(d, sub(".tif",".tif.vat.dbf",ModRaster at file@name), factor2char = TRUE, max_nchar = 254)
+      writeGDAL(a,ModRaster at file@name, drivername = "GTiff",setStatistics=TRUE,mvFlag=255,type="UInt16")
+  }
+
+   return(0)
+   }
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/read.ma.r b/contrib/sahm/pySAHM/Resources/R_Modules/read.ma.r
new file mode 100644
index 0000000..f477ebd
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/read.ma.r
@@ -0,0 +1,209 @@
+ read.ma <- function(out){
+
+          ma.name <- out$input$ma.name
+
+      tif.dir <- out$dat$tif.dir$dname
+      out.list <- out$dat$ma
+      out.list$status[1] <- file.access(ma.name,mode=0)==0
+
+          try(ma<-read.csv(ma.name,skip=2))
+          hl<-readLines(ma.name,1)
+          hl=strsplit(hl,',')
+          colnames(ma) = hl[[1]]
+
+          tif.info<-readLines(ma.name,3)
+          tif.info<-strsplit(tif.info,',')
+          temp<-tif.info[[2]]
+          temp[1:3]<-0
+          include<-as.numeric(temp)
+
+          paths<-as.character(tif.info[[3]])
+
+      if(class(ma)=="try-error") stop("Error reading MDS")
+          else out.list$status[2]<-T
+
+              temp<-strsplit(tif.info[[2]][1],split="\\\\")[[1]]
+            out.list$input$FieldDataTemp<-temp[length(temp)]
+
+                temp<-strsplit(tif.info[[2]][2],split="\\\\")[[1]]
+            out.list$input$OrigFieldData<-temp[length(temp)]
+
+               temp<-strsplit(tif.info[[2]][3],split="\\\\")[[1]]
+            out.list$input$CovSelectName<-temp[length(temp)]
+
+                temp<-strsplit(tif.info[[3]][1],split="\\\\")[[1]]
+            out.list$input$ParcTemplate<-temp[length(temp)]
+
+            temp<-strsplit(tif.info[[3]][2],split="\\\\")[[1]]
+            out.list$input$ParcOutputFolder<-temp[length(temp)]
+
+            temp<-strsplit(tif.info[[2]][2],split="\\\\")[[1]]
+            out.list$input$OrigFieldData<-temp[length(temp)]
+
+          r.name <- out$input$response.col
+          if(r.name=="responseCount") out$input$model.family="poisson"
+
+      r.col <- grep(r.name,names(ma))
+      if(length(r.col)==0) stop("Response column was not found")
+      if(length(r.col)>1) stop("Multiple columns matched the response column")
+         rm.list<-r.col
+
+        # remove background points which aren't used here
+         if(length(which(ma[,r.col]==-9999,arr.ind=TRUE))>0) ma<-ma[-c(which(ma[,r.col]==-9999,arr.ind=TRUE)),]
+
+       # remove incomplete cases and warn user if this number is more than 10% of the data
+
+      # find and save xy columns#
+      xy.cols <- na.omit(c(match("x",tolower(names(ma))),match("y",tolower(names(ma)))))
+      if(length(xy.cols)>0)  rm.list<-c(rm.list,xy.cols)
+
+       # remove weights column except for Random Forest
+       site.weights<-match("site.weights",tolower(names(ma)))
+        if(!is.na(site.weights)) rm.list<-c(rm.list,site.weights)
+        
+        # and index as well
+       split.indx<-match("split",tolower(names(ma)))
+        if(length(na.omit(split.indx))>0) rm.list<-c(rm.list,split.indx)
+
+       #complete the list of columns to include
+          include[is.na(include)]<-0
+          rm.list<-c(rm.list,(which(include!=1,arr.ind=TRUE)))
+          rm.list<-unique(rm.list[!is.na(rm.list)])
+          
+      ######################### REMOVING INCOMPLETE CASES ###############
+        #remove incomplete cases but only for include variables
+       all.cases<-nrow(ma)
+          out.list$n.pres[1] <- NA
+          out.list$n.abs[1] <- NA
+          ma<-ma[complete.cases(ma[,-c(rm.list)]),]
+          comp.cases<-nrow(ma)
+          if(comp.cases/all.cases<.9) warning(paste(round((1-comp.cases/all.cases)*100,digits=2),"% of cases were removed because of missing values",sep=""))
+      #########################################################################
+        #split out the weights,response, and xy.columns after removing incomplete cases
+       if(!is.na(site.weights)){
+          out.list$train.weights<-ma[,site.weights]
+          } else out.list$train.weights<-rep(1,times=dim(ma)[1])
+        if(length(xy.cols)>0) out.list$train.xy<-ma[,xy.cols]
+        response<-ma[,r.col]
+        
+      ma.names<-names(ma)
+      # tagging factors and looking at their levels
+         factor.cols <- grep("categorical",names(ma))
+      factor.cols <- factor.cols[!is.na(factor.cols)]
+      if(length(factor.cols)==0){
+          out.list$factor.levels <- NA
+          } else {
+                names(ma) <- ma.names <-  sub("_categorical","",ma.names)
+                factor.names <- ma.names[factor.cols]
+                factor.levels <- list()
+                for (i in 1:length(factor.cols)){
+                 f.col <- factor.cols[i]
+
+                        x <- table(ma[,f.col])
+                        if(nrow(x)<2){
+                              out$dat$bad.factor.cols <- c(out$dat$bad.factor.cols,factor.names[i])
+                              }
+                        lc.levs <-  as.numeric(row.names(x))[x>0] # make sure there is at least one "available" observation at each level
+                        lc.levs <- data.frame(number=lc.levs,class=lc.levs)
+                        factor.levels[[i]] <- lc.levs
+
+                    ma[,f.col] <- factor(ma[,f.col],levels=lc.levs$number,labels=lc.levs$class)
+                    }
+
+                    names(factor.levels)<-factor.names
+                    out.list$factor.levels <- factor.levels
+
+                if(!is.null(out$dat$bad.factor.cols)) rm.list<-c(rm.list,match(out$dat$bad.factor.cols,names(ma)))
+          }
+
+            if(length(which(lapply(apply(ma,2,unique),length)==1,arr.ind=TRUE))>0){
+                rm.list<-c(rm.list,which(lapply(apply(ma,2,unique),length)==1,arr.ind=TRUE))
+                warning(paste("The Following Predictors will be removed because they have only 1 unique value: ",
+                names(which(lapply(apply(ma,2,unique),length)==1,arr.ind=TRUE))))
+                }
+     #remove test training split column if present
+
+          if(length(na.omit(split.indx))>0){
+              split.col<-ma[,split.indx]
+              out.list$ma.test<-ma[split.col=="test",]
+              ma<-ma[split.col=="train",]
+              out.list$test.weights<-out.list$train.weights[split.col=="test"]
+              out.list$train.weights<-out.list$train.weights[split.col=="train"]
+              out.list$test.xy<-out.list$train.xy[split.col=="test",]
+              out.list$train.xy<-out.list$train.xy[split.col=="train",]
+              out.list$n.pres[4] <- sum(out.list$ma.test[,r.col]!=0)
+              out.list$n.abs[4] <- sum(out.list$ma.test[,r.col]==0)
+            }
+
+         # Complete cases n.pres and n.abs must be calculated after splitting data (this is train cases reported)
+          out.list$n.pres[2] <- sum(ma[,r.col]!=0)
+          out.list$n.abs[2] <- sum(ma[,r.col]==0)
+          
+      # check that response column contains only 1's and 0's, but not all 1's or all 0's if GLMFamily==binomial
+      if(out$input$model.source.file=="rf.r") out$input$model.family="bernoulli"
+      
+      if(tolower(out$input$model.family)=="bernoulli" || tolower(out$input$model.family)=="binomial"){
+          if(any(ma[,r.col]!=1 & ma[,r.col]!=0) | sum(ma[,r.col]==1)==nrow(ma) | sum(ma[,r.col]==0)==nrow(ma))
+          stop("response column (#",r.col,") in ",ma.name," is not binary 0/1",sep="")
+          }
+
+  #check that response column contains at least two unique values for counts
+
+      if(tolower(out$input$model.family)=="poisson"){
+          if(length(table(unique(ma[,r.col])))==1)
+          stop("response column (#",r.col,") in ",ma.name," does not have at least two unique values",sep="")
+          }
+
+          #ma has the first column equal to the response and removes all other remove columns
+         ma <- cbind(ma[,r.col],ma[,-c(rm.list)]) #ma still needs the response column
+         if(length(na.omit(split.indx))>0) out.list$ma.test <- cbind(out.list$ma.test[,r.col],out.list$ma.test[,-c(rm.list)])
+                    paths<-paths[-c(rm.list)]
+                    include<-include[-c(rm.list)]
+                    
+           out.list$resp.name <- names(ma)[1]<-"response"
+           if(length(na.omit(split.indx))>0) names(out.list$ma.test)[1]<-"response"
+         ma.names<-names(ma)
+
+      # if producing geotiff output, check to make sure geotiffs are available for each column of the model array #
+        if(out$input$make.binary.tif==T | out$input$make.p.tif==T){
+                #Check that tiffs to be used exist
+         if(sum(file.access(paths),mode=0)!=0){
+                         temp<-as.vector(file.access(paths))==-1
+                         temp.paths<-paths[temp]
+                  stop("the following geotiff(s) are missing:",
+                      "\nif these are intentionally left blank, uncheck makeBinMap and makeProbabilityMap options\n",
+                        paste(paths[temp],collapse="\n"),sep="")
+                          }
+
+                 } else out$dat$tif.names <- ma.names[-1]
+
+                 out$dat$tif.ind<-paths
+
+          out.list$ma <- ma
+
+        out.list$dims <- dim(out.list$ma)
+        out.list$ratio <- min(sum(out$input$model.fitting.subset)/out.list$dims[1],1)
+        out.list$used.covs <- names(out.list$ma)[-1]
+
+      if(!is.null(out$input$model.fitting.subset)){
+            pres.sample <- sample(c(1:nrow(out.list$ma))[out.list$ma[,1]>=1],min(out.list$n.pres[2],out$input$model.fitting.subset[1]))
+            abs.sample <- sample(c(1:nrow(out.list$ma))[out.list$ma[,1]==0],min(out.list$n.abs[2],out$input$model.fitting.subset[2]))
+            out.list$ma.subset <- out.list$ma[c(pres.sample,abs.sample),]
+            if(out$input$model.source.file!="rf.r") out.list$weight.subset<-out.list$train.weights[c(pres.sample,abs.sample)]
+            out.list$n.pres[3] <- length(pres.sample)
+            out.list$n.abs[3] <- length(abs.sample)
+            } else {
+            out.list$ma.subset <- NULL
+            out.list$weight.subset<-NULL
+            out.list$n.pres[3] <- NA
+            out.list$n.abs[3] <- NA }
+
+if(tolower(out$input$model.family)=="poisson"){
+out.list$ma.subset<-out.list$ma
+out.list$weight.subset<-out.list$train.weights
+}
+
+          out$dat$ma <- out.list
+
+      return(out)
+      }
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/read.maNew.r b/contrib/sahm/pySAHM/Resources/R_Modules/read.maNew.r
new file mode 100644
index 0000000..c2b9004
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/read.maNew.r
@@ -0,0 +1,224 @@
+ read.ma <- function(out){
+
+          ma.name <- out$input$ma.name
+      browser()
+      tif.dir <- out$dat$tif.dir$dname
+      out.list <- out$dat$ma
+      out.list$status[1] <- file.access(ma.name,mode=0)==0
+
+
+      if(is.null(out$input$tif.dir)){
+          try(ma<-read.csv(ma.name,skip=3))
+          hl<-readLines(ma.name,1)
+          hl=strsplit(hl,',')
+          colnames(ma) = hl[[1]]
+
+          tif.info<-readLines(ma.name,3)
+          tif.info<-strsplit(tif.info,',')
+          temp<-tif.info[[2]]
+          temp[1:3]<-0
+          include<-as.numeric(temp)
+
+          paths<-as.character(tif.info[[3]])
+            }
+      if(class(ma)=="try-error") stop("Error reading MDS")
+          else out.list$status[2]<-T
+
+              temp<-strsplit(tif.info[[2]][1],split="\\\\")[[1]]
+            out.list$input$FieldDataTemp<-temp[length(temp)]
+
+                temp<-strsplit(tif.info[[2]][2],split="\\\\")[[1]]
+            out.list$input$OrigFieldData<-temp[length(temp)]
+
+               temp<-strsplit(tif.info[[2]][3],split="\\\\")[[1]]
+            out.list$input$CovSelectName<-temp[length(temp)]
+
+                temp<-strsplit(tif.info[[3]][1],split="\\\\")[[1]]
+            out.list$input$ParcTemplate<-temp[length(temp)]
+
+            temp<-strsplit(tif.info[[3]][2],split="\\\\")[[1]]
+            out.list$input$ParcOutputFolder<-temp[length(temp)]
+
+            temp<-strsplit(tif.info[[2]][2],split="\\\\")[[1]]
+            out.list$input$OrigFieldData<-temp[length(temp)]
+
+          r.name <- out$input$response.col
+          if(r.name=="responseCount") out$input$model.family="poisson"
+
+      r.col <- grep(r.name,names(ma))
+      if(length(r.col)==0) stop("Response column was not found")
+      if(length(r.col)>1) stop("Multiple columns matched the response column")
+         rm.list<-r.col
+
+        # remove background points which aren't used here
+         if(length(which(ma[,r.col]==-9999,arr.ind=TRUE))>0) ma<-ma[-c(which(ma[,r.col]==-9999,arr.ind=TRUE)),]
+         response<-ma[,r.col]
+         
+      # find and save xy columns#
+      xy.cols <- na.omit(c(match("x",tolower(names(ma))),match("y",tolower(names(ma)))))
+      if(length(xy.cols)>0) {out.list$train.xy<-ma[,xy.cols]
+      rm.list<-c(rm.list,xy.cols)}
+
+
+       # remove weights column except for Random Forest
+       site.weights<-match("site.weights",tolower(names(ma)))
+       if(!is.na(site.weights)){
+          out.list$train.weights<-ma[,site.weights]
+          rm.list<-c(rm.list,site.weights)
+          } else out.list$train.weights<-rep(1,times=dim(ma)[1]))
+
+
+      ma.names<-names(ma)
+      # tagging factors and looking at their levels
+         factor.cols <- grep("categorical",names(ma))
+      factor.cols <- factor.cols[!is.na(factor.cols)]
+      if(length(factor.cols)==0){
+          out.list$factor.levels <- NA
+          } else {
+                names(ma) <- ma.names <-  sub("_categorical","",ma.names)
+                factor.names <- ma.names[factor.cols]
+                factor.levels <- list()
+                for (i in 1:length(factor.cols)){
+                 f.col <- factor.cols[i]
+
+                        x <- table(ma[,f.col])
+                        if(nrow(x)<2){
+                              out$dat$bad.factor.cols <- c(out$dat$bad.factor.cols,factor.names[i])
+                              }
+                        lc.levs <-  as.numeric(row.names(x))[x>0] # make sure there is at least one "available" observation at each level
+                        lc.levs <- data.frame(number=lc.levs,class=lc.levs)
+                        factor.levels[[i]] <- lc.levs
+
+                    ma[,f.col] <- factor(ma[,f.col],levels=lc.levs$number,labels=lc.levs$class)
+                    }
+
+                    names(factor.levels)<-factor.names
+                    out.list$factor.levels <- factor.levels
+          }
+          
+     #remove test training split column if present
+          split.indx<-match("split",tolower(names(ma)))
+          if(length(na.omit(split.indx))>0){
+              split.col<-ma[,split.indx]
+              out.list$ma.test<-ma[split.col=="test",]
+              ma<-ma[split.col=="train",]
+              out.list$test.weights<-out.list$train.weights[split.col=="test"]
+              out.list$train.weights<-out.list$train.weights[split.col=="train"]
+              out.list$test.xy<-out.list$train.xy[split.col=="test",]
+              out.list$train.xy<-out.list$train.xy[split.col=="train",]
+              rm.list<-c(rm.list,split.indx)
+            }
+
+
+      # check that response column contains only 1's and 0's, but not all 1's or all 0's if GLMFamily==binomial
+      if(out$input$model.source.file=="rf.r") out$input$model.family="bernoulli"
+      
+      if(tolower(out$input$model.family)=="bernoulli" || tolower(out$input$model.family)=="binomial"){
+          if(any(ma[,r.col]!=1 & ma[,r.col]!=0) | sum(ma[,r.col]==1)==nrow(ma) | sum(ma[,r.col]==0)==nrow(ma))
+          stop("response column (#",r.col,") in ",ma.name," is not binary 0/1",sep="")
+
+          out.list$n.pres[1] <- sum(ma[,r.col])
+          out.list$n.abs[1] <- nrow(ma)-sum(ma[,r.col])
+          }
+
+
+
+     #check that response column contains at least two unique values for counts
+
+      if(tolower(out$input$model.family)=="poisson"){
+          if(length(table(unique(ma[,r.col])))==1)
+          stop("response column (#",r.col,") in ",ma.name," does not have at least two unique values",sep="")
+
+          out.list$n.pres[1] <- sum(ma[,r.col]!=0)
+          out.list$n.abs[1] <- sum(ma[,r.col]==0)
+          }
+          
+         out$dat$ma$resp.name <- names(ma)[r.col]<-"response"
+         out.list$resp.name <- names(ma)[r.col]
+         
+          include[is.na(include)]<-0
+          rm.list<-c(rm.list,(which(include!=1,arr.ind=TRUE)))
+          rm.list<-unique(rm.list[!is.na(rm.list)])
+
+         ma <- ma[,-rm.list]
+                  if(is.null(out$input$tif.dir)){
+                    paths<-paths[-c(rm.list)]
+                    include<-include[-c(rm.list)]
+                    #ma.names[-c(rm.cols)]
+                    }
+
+         ma[ma==-9999]<-NA
+         ma.names<-names(ma)
+          browser()
+      # if producing geotiff output, check to make sure geotiffs are available for each column of the model array #
+        if(out$input$make.binary.tif==T | out$input$make.p.tif==T){
+                #Now check that tiffs to be used exist
+
+              ma.cols <- match(ma.names,sub(".tif","",basename(paths[-r.col])))
+                if(any(is.na(ma.cols))){
+                  stop("the following geotiff(s) are missing in ",
+                        tif.dir,":  ",paste(ma.names[-r.col][is.na(ma.cols)],collapse=" ,"),
+                        "\nif these are intentionally left blank, uncheck makeBinMap and makeProbabilityMap options",sep="")
+
+              if(sum(file.access(paths[include==1]),mode=0)!=0)
+                  stop("the following geotiff(s) are missing : ",
+                        paths[(file.access(paths)!=0),][1],"\nif these are intentionally left blank, uncheck makeBinMap and makeProbabilityMap options", sep="")
+
+                out$dat$tif.ind<-paths
+                }
+                
+          if(!is.null(out$input$tif.dir)){
+              tif.names <- out$dat$tif.names
+              ma.cols <- match(ma.names[-r.col],sub(".tif","",basename(tif.names)))
+              if(any(is.na(ma.cols)))stop("the following geotiff(s) are missing in ",
+                        tif.dir,":  ",paste(ma.names[is.na(ma.cols)],collapse=" ,"),sep="")
+
+            out$dat$tif.names <- tif.names[ma.cols]
+
+            } else out$dat$tif.names <- ma.names
+       #Removing NAs this might be better in a loop
+          out.list$ma <- ma[complete.cases(ma),c(r.col,c(1:ncol(ma))[-r.col])]
+         if(length(na.omit(split.indx))>0) out.list$test.xy<-out.list$test.xy[complete.cases(out.list$ma.test),]
+         out.list$train.xy<-out.list$train.xy[complete.cases(ma),]
+
+      if(!is.null(out.list$ma.test)){
+      if(out$input$model.source.file!="rf.r") out.list$test.weights<- out.list$test.weights[complete.cases(out.list$ma.test)]
+        out.list$ma.test<-out.list$ma.test[complete.cases(out.list$ma.test),c(r.col,c(1:ncol(out.list$ma.test))[-r.col])]
+        if(out$input$model.source.file!="rf.r") out.list$test.weights<- out.list$test.weights[complete.cases(out.list$ma.test)]
+        # out.list$ma.test<-out.list$ma.test[,c(r.col,c(1:ncol(out.list$ma.test))[-r.col])]
+        #if(out$input$model.source.file!="rf.r") out.list$test.weights<- out.list$test.weights
+        out.list$n.pres[4] <- sum(out.list$ma.test[,r.col]!=0)
+        out.list$n.abs[4] <- nrow(out.list$ma.test)-sum(out.list$ma.test[,r.col]!=0)
+        }
+      if(out$input$model.source.file!="rf.r") out.list$train.weights <- out.list$train.weights[complete.cases(ma)]
+      if(!is.null(out$dat$bad.factor.cols)) out.list$ma <- out.list$ma[,-match(out$dat$bad.factor.cols,names(out.list$ma))]
+
+        out.list$dims <- dim(out.list$ma)
+        out.list$ratio <- min(sum(out$input$model.fitting.subset)/out.list$dims[1],1)
+        out.list$n.pres[2] <- sum(out.list$ma[,1]!=0)
+        out.list$n.abs[2] <- nrow(out.list$ma)-sum(out.list$ma[,1]!=0)
+        out.list$used.covs <- names(out.list$ma)[-1]
+
+      if(!is.null(out$input$model.fitting.subset)){
+            pres.sample <- sample(c(1:nrow(out.list$ma))[out.list$ma[,1]>=1],min(out.list$n.pres[2],out$input$model.fitting.subset[1]))
+            abs.sample <- sample(c(1:nrow(out.list$ma))[out.list$ma[,1]==0],min(out.list$n.abs[2],out$input$model.fitting.subset[2]))
+            out.list$ma.subset <- out.list$ma[c(pres.sample,abs.sample),]
+            if(out$input$model.source.file!="rf.r") out.list$weight.subset<-out.list$train.weights[c(pres.sample,abs.sample)]
+            out.list$n.pres[3] <- length(pres.sample)
+            out.list$n.abs[3] <- length(abs.sample)
+            } else {
+            out.list$ma.subset <- NULL
+            out.list$weight.subset<-NULL
+            out.list$n.pres[3] <- NA
+            out.list$n.abs[3] <- NA }
+
+if(tolower(out$input$model.family)=="poisson"){
+out.list$ma.subset<-out.list$ma
+out.list$weight.subset<-out.list$train.weights
+}
+
+
+          out$dat$ma <- out.list
+
+      return(out)
+      }
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/Resources/R_Modules/tmp_ThrowsError.r b/contrib/sahm/pySAHM/Resources/R_Modules/tmp_ThrowsError.r
new file mode 100644
index 0000000..a82bea5
--- /dev/null
+++ b/contrib/sahm/pySAHM/Resources/R_Modules/tmp_ThrowsError.r
@@ -0,0 +1 @@
+1 = 2
\ No newline at end of file
diff --git a/contrib/sahm/pySAHM/__init__.py b/contrib/sahm/pySAHM/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/contrib/sahm/pySAHM/singlePARC.py b/contrib/sahm/pySAHM/singlePARC.py
new file mode 100644
index 0000000..c1d5dc9
--- /dev/null
+++ b/contrib/sahm/pySAHM/singlePARC.py
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+"""
+This was an experiment to explore breaking the
+individual raster processes into individual
+runs that could be either run on separate 
+processes on the same computer with a command line
+popopen perhaps or sent out individually to our 
+Condor distributed computing cluster.
+
+"""
+
+
+import glob
+import math
+import os
+import shutil
+import struct
+import sys
+import csv
+
+from optparse import OptionParser
+from multiprocessing import Process, Queue
+
+from osgeo import gdalconst
+from osgeo import gdal
+from osgeo import osr
+
+from numpy import *
+import numpy as np
+
+import utilities
+from PARC import PARC
+
+def main(args_in):
+    """
+    Process commandline Arguments, 
+    Create an instance of PARC with the Variables,
+    Kick off the parkFiles function of our PARC instance
+    """
+    # Process command-line args.  
+    usageStmt = "usage:  %prog [options] <template image> <input dir or list of input files>"
+    desc = "This application projects, aggregates, resamples, and clips imagery."
+    
+    parser = OptionParser(usage=usageStmt, description=desc)
+    parser.add_option("-s", dest="source", help="print the names of all known aggregation methods")
+    parser.add_option("-c", dest="categorical")
+    parser.add_option("-d", dest="dest", default="./", help="directory in which to put processed images, defaults to current directory")
+    parser.add_option("-v", dest="verbose", default=False, action="store_true", help="the verbose flag causes diagnostic output to print")
+    parser.add_option("-t", dest="template", help="The template raster used for projection, origin, cell size and extent")
+    parser.add_option("-r", dest="resampling", help="The CSV containing the list of files to process.  Format is 'FilePath, Categorical, Resampling, Aggreagtion")
+    parser.add_option("-a", dest="aggregation", default=True, help="'True', 'False' indicating whether to use multiple cores or not") 
+    (options, args) = parser.parse_args(args_in)
+    
+    ourPARC = PARC()
+    ourPARC.verbose = options.verbose
+    ourPARC.template = options.template
+    outDir = os.path.split(options.dest)[0]
+    ourPARC.outDir = outDir
+    ourPARC.logger = utilities.logger(outDir, ourPARC.verbose)
+    ourPARC.writetolog = ourPARC.logger.writetolog
+    ourPARC.template_params = ourPARC.getRasterParams(options.template)
+    ourPARC.parcFile([options.source, options.categorical, options.resampling, options.aggregation], options.dest)
+    
+if __name__ == "__main__":
+    main(sys.argv[1:])
+#    try:
+##        PARC().testing()
+#        sys.exit(PARC().main(sys.argv[1:]))
+#    except Exception as e:
+#        print e
+#        sys.exit(1)
diff --git a/contrib/sahm/pySAHM/singleRasterFormatConverter.py b/contrib/sahm/pySAHM/singleRasterFormatConverter.py
new file mode 100644
index 0000000..99ee88e
--- /dev/null
+++ b/contrib/sahm/pySAHM/singleRasterFormatConverter.py
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+"""
+This script is a wrapper for the
+RasterFormatConverter which allows 
+the user to run an individual raster through.
+It is used by RasterFormatConverter itself
+to allow each raster to be spawned off as 
+a separate command line to take advantage of 
+multiple cores on a machine.
+
+"""
+
+
+import glob
+import math
+import os
+import shutil
+import struct
+import sys
+import csv
+
+from optparse import OptionParser
+from multiprocessing import Process, Queue
+
+from osgeo import gdalconst
+from osgeo import gdal
+from osgeo import osr
+
+from numpy import *
+import numpy as np
+
+import utilities
+from RasterFormatConverter import FormatConverter
+
+def main(argv):
+    usageStmt = "usage:  options: -m --MDSFile -o --outputDir -f --format -v --verbose"
+    desc = "Converts all of the tif files specified in an MDS to ASCII format (or optionally other formats)"
+    parser = OptionParser(usage=usageStmt, description=desc)
+    
+    parser.add_option("-v", 
+                      dest="verbose", 
+                      default=False, 
+                      action="store_true", 
+                      help="the verbose flag causes diagnostic output to print.")
+    parser.add_option("-i", "--inputfile", 
+                      dest="input", 
+                      help="")           
+    parser.add_option("-o", "--outputDir", 
+                      dest="outputDir", 
+                      help="Output directory to save files in.")
+    parser.add_option("-f", "--format", 
+                      dest="format",
+                      default='asc', 
+                      help="The format to convert into. 'bil', 'img', 'tif', 'jpg', 'bmp', 'asc'")
+    
+    (options, args) = parser.parse_args(argv)
+    
+    ourFC = FormatConverter()
+    ourFC.verbose = options.verbose
+    ourFC.logger = utilities.logger(options.outputDir, ourFC.verbose)
+    ourFC.writetolog = ourFC.logger.writetolog
+    ourFC.outputDir = options.outputDir
+    ourFC.format = options.format
+    ourFC.convertEnvironmentalLayers([options.input, ], options.outputDir, options.format)
+    
+if __name__ == "__main__":
+    main(sys.argv[1:])
+#    try:
+##        PARC().testing()
+#        sys.exit(PARC().main(sys.argv[1:]))
+#    except Exception as e:
+#        print e
+#        sys.exit(1)
diff --git a/contrib/sahm/pySAHM/utilities.py b/contrib/sahm/pySAHM/utilities.py
new file mode 100644
index 0000000..53fe97f
--- /dev/null
+++ b/contrib/sahm/pySAHM/utilities.py
@@ -0,0 +1,261 @@
+#!/usr/bin/python
+
+''' These utility functions are shared 
+between all of the Python SAHM command line
+modules
+'''
+
+import os, sys
+import time
+import csv
+import string
+
+from osgeo import gdal
+from osgeo import osr
+from osgeo import ogr
+
+_logfile = ''
+_verbose = False
+
+class logger(object):
+    def __init__(self, logfile, verbose):
+        self.logfile = logfile
+        self.verbose = verbose
+        
+        #if we mistakenly get a output dir instead of a filename
+        if os.path.isdir(logfile):
+            self.logfile = os.path.join(logfile, 'sessionLog.txt')
+        else:
+            self.logfile = logfile
+            
+        if os.path.exists(self.logfile):
+            self.writetolog("\nSession continued\n", True, True)
+        else:
+            logDir = os.path.split(self.logfile)[0]
+            if not os.path.exists(logDir):
+                raise RuntimeError('Directory of specified logfile does not exist.')
+            f = open(self.logfile, "w")
+            del f
+            self.writetolog("\nSession started\n", True, False)
+            
+            
+    def writetolog(self, msg, addtime=False, printtoscreen=True):
+        '''Opens the log file and writes the passed msg.
+    Optionally adds a time slot to the message and
+    Prints the msg to the screen.
+    If the logfile is not specified tries to use the global variable.
+        '''
+        f = open(self.logfile, "a")
+        if self.verbose and printtoscreen:
+            print msg
+        if addtime:
+            msg = ' at: '.join([msg, time.strftime("%m/%d/%Y %H:%M")])
+        msg = "\n" + msg
+        f.write(msg)
+        del f  
+
+class TrappedError(Exception):
+    """Exception class indicating that an anticipated problem
+    was encountered in a specific module
+    """
+    def __init__(self, msg=None):
+        Exception.__init__(self)
+        self.message = msg
+
+            
+
+#def createsessionlog(roottempdir, verbose):
+#    '''Creates a new log file if one doesn't already exist.
+#    If one exists then writes that the session has continued.
+#    '''
+#    global _logfile, _verbose
+#    _verbose = verbose
+#    
+#    logfile = os.path.join(roottempdir, "sessionLog.txt")
+#    _logfile = logfile
+#    
+#    if os.path.exists(logfile):
+#        writetolog("\nSession continued\n", True, True, logfile=logfile)
+#    else:
+#        f = open(os.path.join(roottempdir, "sessionLog.txt"), "w")
+#        del f
+#    
+#    return logfile
+#
+#def writetolog(msg, addtime=False, printtoscreen=True, logfile=''):
+#    '''Opens the log file and writes the passed msg.
+#    Optionally adds a time slot to the message and
+#    Prints the msg to the screen.
+#    If the logfile is not specified tries to use the global variable.
+#    '''
+#    global _logfile
+#    if logfile == '':
+#        logfile = _logfile
+#    
+#    f = open(logfile, "a")
+#    if _verbose and printtoscreen:
+#        print msg
+#    if addtime:
+#        msg = ' at: '.join([msg, time.strftime("%m/%d/%Y %H:%M")])
+#    msg = "\n" + msg
+#    f.write(msg)
+#    del f
+
+    
+def isMDSFile(MDSFile):
+    '''performs a check to see if a supplied file is in 'MDS' format
+    This means:
+    1 - The file has three header lines
+        first: x, y, responseBinary or responseCount, a series of covariate names, and an optional Split
+        second: '0', '0', '0', 0 or blanks and 0 or 1 for each covariate indicate use or ignore
+        third: '', '', '', the full path and filename of the tiff covariate layer.
+    2 - additionally lines contain individual occurance location, response, covariate attributes at that location, and test\train for the Split column
+    
+        Values of -9999 in the response column indicate a background point.
+        covariate names ending in '*_categorical' indicate a categorical variable
+        
+    The test used in this check are by no means thorough in checking for covariate files
+    existing on the file system, missing values in any columns, appropriate values in 
+    the response or Split columns, etc.  Instead this function is intended to just give a 
+    best guess as to to if this is an MDS.    
+    '''
+    MDSreader = csv.reader(open(MDSFile, 'r'))
+    header1 = MDSreader.next()
+    header2 = MDSreader.next()
+    header3 = MDSreader.next()
+
+#These no longer apply with the new agg feature.
+#    for i in [0, 1, 2]:
+#        if not(header2[0] == '' or header2[0] == '0'):
+#            return False
+    
+#    for item in header2[3:-1]:
+#        if not item in ['0', '1']:
+#            return False
+    
+    return True
+    del MDSreader
+
+def process_waiter(popen, description, que):
+    try: 
+        popen.wait()     
+    finally: 
+        que.put( (description, popen.returncode) ) 
+
+
+def mds_to_shape(MDSFile, outputfolder):
+    
+    #bit of a hack but currently saving the shape file as 
+    #three shape files presence, absence, and background
+    #as I'm having trouble getting QGIS to display points
+    #with categorical symbology
+    
+    h, t = os.path.split(MDSFile)
+    t_no_ext = os.path.splitext(t)[0]
+    outputfiles = {"pres":os.path.join(outputfolder, t_no_ext + "_pres.shp"),
+                   "abs":os.path.join(outputfolder, t_no_ext +  "_abs.shp"),
+                   "backs":os.path.join(outputfolder, t_no_ext +  "_backs.shp")}
+
+    driver = ogr.GetDriverByName('ESRI Shapefile')
+    
+    MDSreader = csv.reader(open(MDSFile, 'r'))
+    header1 = MDSreader.next()
+    header2 = MDSreader.next()
+    header3 = MDSreader.next()
+    
+    h, t = os.path.split(MDSFile)
+    t_no_ext = os.path.splitext(t)[0]
+#    
+    
+    for outfile in outputfiles.values():
+        h, t = os.path.split(outfile)
+        if os.path.exists(outfile):
+            os.chdir(h)
+            driver.DeleteDataSource(t)
+    
+    ds = driver.CreateDataSource(h)
+    
+    preslayer = ds.CreateLayer(t_no_ext + "_pres",
+                           geom_type=ogr.wkbPoint)
+    abslayer = ds.CreateLayer(t_no_ext + "_abs",
+                           geom_type=ogr.wkbPoint)
+    backslayer = ds.CreateLayer(t_no_ext + "_backs",
+                           geom_type=ogr.wkbPoint)
+    
+    #cycle through the items in the header and add
+    #these to each output shapefile attribute table
+    fields = {}
+    for field in header1:
+        field_name = Normalized_field_name(field, fields)
+        fields[field_name] = field
+        if field == "Split":
+            #this is the test training split field that we add
+            fieldDefn = ogr.FieldDefn(field_name, ogr.OFTString)
+        else:
+            fieldDefn = ogr.FieldDefn(field_name, ogr.OFTReal)
+        
+        preslayer.CreateField(fieldDefn)
+        abslayer.CreateField(fieldDefn)
+        backslayer.CreateField(fieldDefn)
+        
+    featureDefn = preslayer.GetLayerDefn()
+    
+    #cycle through the rows and add each geometry to the 
+    #appropriate shapefile
+    for row in MDSreader:
+        feature = ogr.Feature(featureDefn)
+        point = ogr.Geometry(ogr.wkbPoint)
+        
+        point.SetPoint_2D(0, float(row[0]), float(row[1]))
+        feature.SetGeometry(point)
+        
+        # for this feature add in each of the attributes from the row
+        header_num = 0
+        for field in header1:
+            short_field = find_key(fields, field)
+            if field == "Split":
+                feature.SetField(short_field, row[header_num])
+            else:
+                feature.SetField(short_field, float(row[header_num]))
+            header_num += 1
+        
+        response = float(row[2])
+        
+        if abs(response - 0) < 1e-9: 
+            abslayer.CreateFeature(feature)
+        elif response > 0:
+            preslayer.CreateFeature(feature)
+        elif abs(response - -9999.0) < 1e-9:
+            backslayer.CreateFeature(feature)
+
+    # close the data sources
+    del MDSreader
+    ds.Destroy()
+
+def Normalized_field_name(field_name, previous_fields):
+    short_name = field_name[:10]
+    
+    #remove Non alpha numeric characters
+    short_name = ''.join(ch for ch in short_name if ch in (string.ascii_letters + string.digits + '_'))
+    
+    if previous_fields.has_key(short_name):
+        i = 1
+        shorter_name = short_name[:8]
+        short_name = shorter_name + "_" + str(i)
+        while previous_fields.has_key(short_name):
+            i += 1
+            short_name = shorter_name + "_" + str(i)
+    return short_name
+
+def find_key(dic, val):
+    """return the key of dictionary dic given the value
+    from: http://www.daniweb.com/software-development/python/code/217019"""    
+    return [k for k, v in dic.iteritems() if v == val][0]
+
+if __name__ == "__main__":
+    
+    mds_to_shape(r"I:\VisTrails\WorkingFiles\workspace\talbertc_20110901T175958\CovariateCorrelationOutputMDS_anothertry2.csv", r"I:\VisTrails\WorkingFiles\workspace\talbertc_20110901T175958\CovariateCorrelationOutputMDS_anothertry2.shp")
+    print "done"
+
+
+
diff --git a/contrib/sahm/utils.py b/contrib/sahm/utils.py
new file mode 100644
index 0000000..2933b1d
--- /dev/null
+++ b/contrib/sahm/utils.py
@@ -0,0 +1,481 @@
+'''
+These are utilites used by the VisTrails 
+wrappers of the SAHM command line applications
+
+ at author: talbertc
+test
+
+'''
+import os, sys, shutil
+import traceback
+import csv
+import time
+import tempfile
+import subprocess
+
+from PyQt4 import QtCore, QtGui
+
+from core.modules.basic_modules import File, Path, Directory, new_constant, Constant
+from core.modules.vistrails_module import ModuleError
+
+from osgeo import gdalconst
+from osgeo import gdal
+from osgeo import osr
+import numpy
+
+import packages.sahm.pySAHM.utilities as utilities
+import getpass
+
+_roottempdir = ""
+_logger = None
+config = None
+
+def getrasterminmax(filename):
+    dataset = gdal.Open(filename, gdalconst.GA_ReadOnly)
+    band = dataset.GetRasterBand(1)
+    
+    min = band.GetMinimum()
+    max = band.GetMaximum()
+    
+    try:
+        #our output rasters have approx nodata values
+        #which don't equal the specified nodata.
+        #set the specified to equal what is actually used.
+        if (abs(band.GetNoDataValue() - band.GetMinimum()) < 1e-9 and 
+            band.GetNoDataValue() <> band.GetMinimum()):
+            band.SetNoDataValue(band.GetMinimum)
+        
+        if min is None or max is None:
+            (min,max) = band.ComputeRasterMinMax(1)
+        
+    except:
+        pass
+    return (min, max)
+    dataset = None
+
+def mknextfile(prefix, suffix="", directory=""):
+    global _roottempdir
+    if directory == "":
+        directory = _roottempdir
+    files = os.listdir(directory)
+    seq = 0
+    for f in files:
+        if f.startswith(prefix):
+            old_seq = f.replace(prefix, '')
+            old_seq = old_seq.replace(suffix, '')
+            old_seq = old_seq.replace("_", '')
+            if old_seq.isdigit():
+                if int(old_seq) > seq:
+                    seq = int(old_seq)
+    seq += 1
+    filename = prefix + str(seq) + suffix
+    return os.path.join(directory, filename)
+
+def mknextdir(prefix, directory=""):
+    global _roottempdir
+    if directory == "":
+        directory = _roottempdir
+    files = os.listdir(directory)
+    seq = 0
+    for f in files:
+        if (f.startswith(prefix) and
+            not os.path.isfile(f)):
+            f_seq = int(f.replace(prefix, ''))
+            if f_seq > seq:
+                seq = f_seq
+    seq += 1
+    dirname = prefix + str(seq)
+    os.mkdir(os.path.join(directory, dirname))
+    return os.path.join(directory, dirname)
+
+def setrootdir(session_dir):
+    global _roottempdir
+    _roottempdir = session_dir
+
+def createrootdir(rootWorkspace):
+    '''Creates a session Directory which will
+    contain all of the output produced in a single
+    VisTrails/Sahm session.
+    '''
+    global _roottempdir
+    user_nospace = getpass.getuser().split(' ')[0]
+    _roottempdir = os.path.join(rootWorkspace, user_nospace + '_' + time.strftime("%Y%m%dT%H%M%S"))
+    if not os.path.exists(_roottempdir):
+        os.makedirs(_roottempdir) 
+
+    return _roottempdir
+
+def map_ports(module, port_map):
+    args = {}
+    for port, (flag, access, required) in port_map.iteritems():
+        if required or module.hasInputFromPort(port):
+            #breakpoint()
+            value = module.forceGetInputListFromPort(port)
+            if len(value) > 1:
+                raise ModuleError(module, 'Multiple items found from Port ' + 
+                    port + '.  Only single entry handled.  Please remove extraneous items.')
+            elif len(value)  == 0:
+                raise ModuleError(module, 'Multiple items found from Port ' + 
+                    port + '.  Only single entry handled.  Please remove extraneous items.')
+            value = module.forceGetInputFromPort(port)
+            if access is not None:
+                value = access(value)
+            if isinstance(value, File) or \
+                        isinstance(value, Directory) or \
+                        isinstance(value, Path):
+                value = path_port(module, port)
+            args[flag] = value
+    return args
+
+def path_port(module, portName):
+    value = module.forceGetInputListFromPort(portName)
+    if len(value) > 1:
+        raise ModuleError(module, 'Multiple items found from Port ' + 
+                          portName + '.  Only single entry handled.  Please remove extraneous items.')
+    value = value[0]
+    path = value.name 
+    path.replace("/", os.path.sep)
+    if os.path.exists(path):
+        return path
+    else:
+        raise RuntimeError, 'The indicated file or directory, ' + \
+            path + ', does not exist on the file system.  Cannot continue!'
+    
+def PySAHM_instance_params(instance, mappedPorts):
+    global _logger
+    instance.__dict__['logger'] = _logger
+    instance.__dict__['verbose'] = _logger.verbose
+    for k, v in mappedPorts.iteritems():
+            instance.__dict__[k] = v
+    
+def R_boolean(value):
+    if value:
+        return 'TRUE'
+    else:
+        return 'FALSE'
+
+def dir_path_value(value):
+    val = value.name
+    sep = os.path.sep
+    return val.replace("/", sep)
+    
+def create_file_module(fname, f=None):
+    if f is None:
+        f = File()
+    f.name = fname
+    f.upToDate = True
+    return f
+
+def create_dir_module(dname, d=None):
+    if d is None:
+        d = Directory()
+    d.name = dname
+    d.upToDate = True
+    return d
+
+#No longer used
+#def collapse_dictionary(dict):
+#    list = []
+#    for k,v in dict.items():
+#        list.append(k)
+#        list.append(v)
+#    return list
+
+#def tif_to_color_jpeg(input, output, colorBreaksCSV):
+#    writetolog("    running  tif_to_color_jpeg()", True, False)
+#    writetolog("        input=" + input, False, False)
+#    writetolog("        output=" + output, False, False)
+#    writetolog("        colorBreaksCSV=" + colorBreaksCSV, False, False)
+#    out_bands = 3
+#    #output_tmp = mktempfile(prefix='intermediateJpegPic', suffix='.tif')
+#    output_tmp = output + ".tmp.tif"
+#    # Print some info
+#    #print "Creating %s" % (output)
+#    
+#    #populate the color breaks dictionary 
+#    #  from the colorBreaks CSV
+#
+#    csvfile = open(colorBreaksCSV, "r")
+#    #dialect = csv.Sniffer().sniff(csvfile.read(1024))
+#    reader = csv.reader(csvfile)
+#    usedPixels = {}
+#    header = reader.next() #skip the header
+#    
+#    color_dict = {}
+#    maxVal = -9999
+#    for row in reader:
+#        color_dict[float(row[1])] = [row[3], row[4], row[5]]
+#        if row[2] > maxVal: maxVal = row[2]
+#        
+#    #print color_dict
+#    # Open source file
+#    src_ds = gdal.Open( input )
+#    src_band = src_ds.GetRasterBand(1)
+#    
+#    # create destination file
+#    dst_driver = gdal.GetDriverByName('GTiff')
+#    dst_ds = dst_driver.Create(output_tmp, src_ds.RasterXSize,
+#                               src_ds.RasterYSize, out_bands, gdal.GDT_Byte)
+#    
+#    # create output bands
+#    band1 = numpy.zeros([src_ds.RasterYSize, src_ds.RasterXSize])
+#    band2 = numpy.zeros([src_ds.RasterYSize, src_ds.RasterXSize])
+#    band3 = numpy.zeros([src_ds.RasterYSize, src_ds.RasterXSize])
+#    
+#    # set the projection and georeferencing info
+#    dst_ds.SetProjection( src_ds.GetProjection() )
+#    dst_ds.SetGeoTransform( src_ds.GetGeoTransform() )
+#    
+#    # read the source file
+#    #gdal.TermProgress( 0.0 )
+#    for iY in range(src_ds.RasterYSize):
+#        src_data = src_band.ReadAsArray(0,iY,src_ds.RasterXSize,1)
+#        col_values = src_data[0] # array of z_values, one per row in source data
+#        for iX in range(src_ds.RasterXSize):
+#            z_value = col_values[iX]
+#            [R,G,B] = MakeColor(z_value, color_dict, maxVal)
+#            band1[iY][iX] = R
+#            band2[iY][iX] = G
+#            band3[iY][iX] = B
+#    #gdal.TermProgress( (iY+1.0) / src_ds.RasterYSize )
+#    
+#    # write each band out
+#    dst_ds.GetRasterBand(1).WriteArray(band1)
+#    dst_ds.GetRasterBand(2).WriteArray(band2)
+#    dst_ds.GetRasterBand(3).WriteArray(band3)
+#
+#    # Create jpeg or rename tmp file
+#    jpg_driver = gdal.GetDriverByName("JPEG") 
+#    jpg_driver.CreateCopy(output, dst_ds, 0 ) 
+#    
+#    try:
+#        os.remove(output_tmp)
+#    except:
+#        pass
+#    
+#    try:
+#        GDALClose(output_tmp)
+#    except:
+#        pass
+#    
+#    try:
+#        os.remove(output_tmp)
+#    except:
+#        pass
+#    
+#    dst_ds = None
+#    writetolog("    finished running  tif_to_color_jpeg()", True, False)
+#    return True
+#
+#def MakeColor(z_value, color_dict, maxVal):
+#
+#    
+#    key_list = color_dict.keys()
+#    key_list.sort()
+#    while len(key_list) > 0:
+#        last_val = key_list[-1]
+#        #print "lastVal =   ",last_val
+#        #print "ZVal =   ",z_value
+#        if z_value >= last_val and z_value <= maxVal:
+#            #"print color for ", z_value, " is ", last_val, " = ", color_dict[last_val]
+#            return color_dict[last_val]
+#            break
+#        else:
+#            key_list.remove(last_val)
+#
+#    #if we get here something is wrong return black
+#    #print "Value not found defaulting to black"
+#    return [255, 255, 255]
+    
+def MDSresponseCol(MDSFile):
+    csvfile = open(MDSFile, "r")
+    reader = csv.reader(csvfile)
+    header = reader.next() #store the header
+    responseCol = header[2]
+    return responseCol 
+   
+def print_exc_plus( ):
+    """ Print the usual traceback information, followed by a listing of
+        all the local variables in each frame.
+        lifted from the Python Cookbook
+    """
+    msg = ""
+    tb = sys.exc_info( )[2]
+    while tb.tb_next:
+        tb = tb.tb_next
+    stack = [  ]
+    f = tb.tb_frame
+    while f:
+        if r'\sahm\\' in f.f_code.co_filename:
+            stack.append(f)
+        f = f.f_back
+    stack.reverse( )
+    traceback.print_exc( )
+    msg += "\n" + "Locals by frame, innermost last"
+    for frame in stack:
+        msg += "\n"
+        msg += "\n" + "Frame %s in %s at line %s" % (frame.f_code.co_name,
+                                             frame.f_code.co_filename,
+                                             frame.f_lineno)
+        msg += "\n"
+        for key, value in frame.f_locals.items( ):
+            msg += "\t%20s = " % key
+            # we must _absolutely_ avoid propagating exceptions, and str(value)
+            # COULD cause any exception, so we MUST catch any...:
+            try:
+                msg += str(value)
+            except:
+                msg += "<ERROR WHILE PRINTING VALUE>"
+                
+    msg += "\n\n" + ' '.join([str(i) for i in sys.exc_info()[:2]])
+    
+    return msg
+
+def informative_untrapped_error(instance, name):
+    errorMsg = "An error occurred running " + name + ", error message below:  "
+    errorMsg += "\n    " + ' '.join([str(i) for i in sys.exc_info()[:2]])
+    try:
+        errorMsg += traceback.format_tb(sys.exc_info()[2], 10)[-2]
+    except IndexError:
+        pass
+    writetolog(print_exc_plus(), False, False)
+    raise ModuleError(instance, errorMsg)
+
+def breakpoint():
+    ''' open up the python debugger here and poke around
+    Very helpful, I should have figured this out ages ago!
+    '''
+    QtCore.pyqtRemoveInputHook()
+    import pdb; pdb.set_trace()
+
+def writetolog(*args, **kwargs):
+    '''Uses the SAHM log file writting function
+    but appends our known logfile to the kwargs.
+    '''
+    global _logger
+    _logger.writetolog(*args, **kwargs)
+
+def createLogger(outputdir, verbose):
+    global _logger
+    _logger = utilities.logger(outputdir, verbose)
+    
+def getLogger():
+    global _logger
+    return _logger
+
+def getShortName(fullPathName):
+    if fullPathName.endswith('hdr.adf'):
+        shortname = os.path.split(fullPathName)[0]
+        shortname = os.path.split(shortname)[1]
+    else:
+        shortname = os.path.split(fullPathName)[1]
+        shortname = os.path.splitext(shortname)[0]
+    return shortname
+
+def getRasterName(fullPathName):
+    if fullPathName.endswith('hdr.adf'):
+        rastername = os.path.split(fullPathName)[0]
+    else:
+        rastername = fullPathName
+    return rastername
+
+def getModelsPath():
+    return os.path.join(os.path.dirname(__file__), "pySAHM", "Resources", "R_Modules")
+
+def runRScript(script, args, module=None):
+    global config
+    r_path = config.r_path
+    program = os.path.join(r_path, "i386", "Rterm.exe") #-q prevents program from running
+    scriptFile = os.path.join(getModelsPath(), script)
+    
+    command = program + " --vanilla -f " + scriptFile + " --args " + args
+    
+    p = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+    writetolog("\nStarting R Processing of " + script, True)
+    writetolog("    args: " + args, False, False)
+    writetolog("    command: " + command, False, False)
+    ret = p.communicate()
+    
+    if 'Error' in ret[1]:
+        msg = "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+        msg +="\n  An error was encountered in the R script for this module."
+        msg += "\n     The R error message is below: \n"
+        msg += ret[1]
+        writetolog(msg)
+        if module:
+            raise ModuleError(module, msg)
+        else:
+            raise RuntimeError , msg
+
+    if 'Warning' in ret[1]:
+        msg = "The R scipt returned the following warning(s).  The R warning message is below - \n"
+        msg += ret[1]
+        writetolog(msg)
+
+    del(ret)
+    writetolog("\nFinished R Processing of " + script, True)
+
+def merge_inputs_csvs(inputCSVs_list, outputFile):
+    oFile = open(outputFile, "wb")
+    outputCSV = csv.writer(oFile)
+    outputCSV.writerow(["PARCOutputFile", "Categorical",
+                         "Resampling", "Aggregation", "OriginalFile"])
+    for inputCSV in inputCSVs_list:
+        iFile = open(inputCSV, "rb")
+        inputreader = csv.reader(iFile)
+        inputreader.next()
+        for row in inputreader:
+            outputCSV.writerow(row)
+        iFile.close()
+    oFile.close()
+
+def applyMDS_selection(oldMDS, newMDS):
+    """Takes a selection from a previous MDS and '
+        applies it to a new MDS file.
+    """
+    oldvals = {}
+    if os.path.exists(oldMDS):
+        iFile = open(oldMDS, 'r')
+        previousout = csv.reader(iFile)
+        oldheader1 = previousout.next()
+        oldheader2 = previousout.next()
+        oldvals = dict(zip(oldheader1, oldheader2))
+        iFile.close()
+        del previousout
+        
+    tmpnewMDS = newMDS + ".tmp.csv"
+    oFile = open(tmpnewMDS, "wb")
+    tmpOutCSV = csv.writer(oFile)
+    iFile = open(newMDS, "rb")
+    outCSV = csv.reader(iFile)
+    
+    oldHeader1 = outCSV.next()
+    oldHeader2 = outCSV.next()
+    oldHeader3 = outCSV.next()
+    
+    selectionline = []
+    for i in range(len(oldHeader1)):
+        if oldvals.has_key(oldHeader1[i]) and \
+        oldvals[oldHeader1[i]] == '0':
+            selectionline.append('0')
+        else:
+            selectionline.append('1')
+            
+    tmpOutCSV.writerow(oldHeader1)
+    tmpOutCSV.writerow(selectionline)    
+    tmpOutCSV.writerow(oldHeader3)
+    for row in outCSV:
+        tmpOutCSV.writerow(row)
+    
+    iFile.close()
+    oFile.close()
+    shutil.copyfile(tmpnewMDS, newMDS)
+    os.remove(tmpnewMDS)
+    
+
+
+    
+    
+    
+
+    
\ No newline at end of file
diff --git a/contrib/sahm/widgets.py b/contrib/sahm/widgets.py
new file mode 100644
index 0000000..4defe99
--- /dev/null
+++ b/contrib/sahm/widgets.py
@@ -0,0 +1,369 @@
+from PyQt4 import QtCore, QtGui
+import os
+
+from core.modules.module_configure import StandardModuleConfigurationWidget
+from core.modules.constant_configuration import ConstantWidgetMixin
+
+class PredictorListWidget(QtGui.QTreeWidget):
+    
+    def __init__(self, p_value, available_tree, parent=None):
+        
+        self.resamplingMethods = ["nearestneighbor", 
+                                "bilinear",
+                                "cubic", 
+                                "cubicspline",
+                                "lanczos"]
+
+        self.aggregationMethods = ["Min", 
+                        "Mean",
+                        "Max",
+                        "Majority", 
+                        "None"]
+        
+        #print "p_value : ", p_value
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.available_tree = available_tree
+        self.setColumnCount(5)
+        self.headerItem().setText(0, "Include")
+        self.setColumnWidth(0,100)
+        self.headerItem().setText(1, "Layer")
+        self.setColumnWidth(1,self.width() - 350)
+        self.headerItem().setText(2, "Categorical")
+        self.setColumnWidth(0,90)
+        self.headerItem().setText(3, "Resampling")
+        self.setColumnWidth(2,125)
+        self.headerItem().setText(4, "Aggregation")
+        self.setColumnWidth(0,125)
+#        self.setSelectionBehavior(QtGui.QTreeView.SelectRows)
+
+        self.tree_items = {}
+        for source, file_list in self.available_tree.iteritems():
+            #print source, file_list
+            source_item = QtGui.QTreeWidgetItem([source])
+            self.addTopLevelItem(source_item)
+            for (file, desc, categorical) in file_list:
+                child_item = QtGui.QTreeWidgetItem([file, desc])#, resVal, aggVal])
+                child_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
+                                    QtCore.Qt.ItemIsEnabled)
+                child_item.setCheckState(0, QtCore.Qt.Unchecked)
+                source_item.addChild(child_item)
+                
+                resamplingCB = QtGui.QComboBox(self)
+                resamplingCB.addItems(self.resamplingMethods)
+                aggCB = QtGui.QComboBox(self)
+                aggCB.addItems(self.aggregationMethods)
+                catChk = QtGui.QCheckBox(self)
+#                self.connect(aggCB, QtCore.SIGNAL('currentIndexChanged(QString)'), self.testing)
+                if categorical == "N":
+                    resamplingCB.setCurrentIndex(1)
+                    aggCB.setCurrentIndex(1)
+                    curVal = (file, "Bilinear", "Mean")
+                    catChk.setCheckState(QtCore.Qt.Unchecked)
+                else:
+                    resamplingCB.setCurrentIndex(0)
+                    aggCB.setCurrentIndex(3)
+                    curVal = (file, "NearestNeighbor", "Majority")
+                    catChk.setCheckState(QtCore.Qt.Checked)
+
+                self.setItemWidget(child_item, 2, catChk)
+                self.setItemWidget(child_item, 3, resamplingCB)
+                self.setItemWidget(child_item, 4, aggCB)
+                
+#                print "The file for dict is ", file
+                self.tree_items[curVal] = child_item
+        self.set_values(p_value)
+
+    def set_values(self, str_value):
+        #print 'set_values:', str_value 
+        values = []
+        if str_value:
+            values = eval(str_value)
+        files = {}
+        for k in self.tree_items.iterkeys():
+            files[k[0]] = k[1:]
+        for value in values:
+            if value[0] in files.keys():
+                try:
+                    oldValue = (value[0], files[value[0]][0], files[value[0]][1])
+                    self.tree_items[oldValue].setCheckState(0, QtCore.Qt.Checked)
+                    item = self.itemWidget(self.tree_items[oldValue], 2)
+                    if value[1] == '1':
+                        item.setCheckState(QtCore.Qt.Checked)
+                    else:
+                        item.setCheckState(QtCore.Qt.Unchecked)
+                    item = self.itemWidget(self.tree_items[oldValue], 3)
+                    item.setCurrentIndex(self.resamplingMethods.index(value[2]))
+                    item = self.itemWidget(self.tree_items[oldValue], 4)
+                    item.setCurrentIndex(self.aggregationMethods.index(value[3]))
+                except ValueError:
+                    pass
+    
+    def get_values(self):
+        #print 'get_values:'
+        values = []
+        for value, item in self.tree_items.iteritems():
+            #print value, item
+            if item.checkState(0) == QtCore.Qt.Checked:
+                if self.itemWidget(item, 2).checkState() == QtCore.Qt.Checked:
+                    categorical = '1'
+                else:
+                    categorical = '0'
+                resampleMethod = str(self.itemWidget(item, 3).currentText())
+                aggMethod = str(self.itemWidget(item, 4).currentText())
+                   
+                values.append((value[0], categorical, resampleMethod, aggMethod))
+#        print 'get_vals = ', str(values)
+        return str(values)
+        
+    def select_all(self):
+        for value, item in self.tree_items.iteritems():
+            self.tree_items[value].setCheckState(0, QtCore.Qt.Checked)
+    
+    def switch_selection(self):
+        for value, item in self.tree_items.iteritems():
+            if item.checkState(0) == QtCore.Qt.Checked:
+                self.tree_items[value].setCheckState(0, QtCore.Qt.Unchecked)
+            else:
+                self.tree_items[value].setCheckState(0, QtCore.Qt.Checked)
+                
+    def query_add(self, query_text):
+        for value, item in self.tree_items.iteritems():
+            if str(query_text) in value[0]:
+                self.tree_items[value].setCheckState(0, QtCore.Qt.Checked)
+
+
+    
+    def query_remove(self, query_text):
+        for value, item in self.tree_items.iteritems():
+            if str(query_text) in value[0]:
+                self.tree_items[value].setCheckState(0, QtCore.Qt.Unchecked)
+
+class PredictorListConfigurationWidget(PredictorListWidget, 
+                                       ConstantWidgetMixin):
+    
+    def __init__(self, param, available_tree, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+                    parent: QWidget)
+
+        Initialize the line edit with its contents. Content type is limited
+        to 'int', 'float', and 'string'
+
+        """
+        PredictorListWidget.__init__(self, param.strValue, available_tree, 
+                                     parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        # assert param.namespace == None
+        # assert param.identifier == 'edu.utah.sci.vistrails.basic'
+#         self.available_tree = available_tree
+#         self.setColumnCount(2)
+#         for source, file_list in self.available_tree.iteritems():
+#             source_item = QtGui.QTreeWidgetItem([source])
+#             self.addTopLevelItem(source_item)
+#             for (file, desc) in file_list:
+#                 child_item = QtGui.QTreeWidgetItem([file, desc])
+#                 child_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
+#                                     QtCore.Qt.ItemIsEnabled)
+#                 child_item.setCheckState(0, QtCore.Qt.Unchecked)
+#                 source_item.addChild(child_item)
+
+        contents = param.strValue
+        contentType = param.type
+
+        # need to deserialize contents and set tree widget accordingly
+        # self.setText(contents)
+        self._contentType = contentType
+#         self.connect(self,
+#                      QtCore.SIGNAL('returnPressed()'),
+#                      self.update_parent)
+
+    def contents(self):
+        """contents() -> str
+        Re-implement this method to make sure that it will return a string
+        representation of the value that it will be passed to the module
+        As this is a QLineEdit, we just call text()
+
+        """
+        return self.get_values()
+
+    def setContents(self, strValue, silent=True):
+        """setContents(strValue: str) -> None
+        Re-implement this method so the widget can change its value after 
+        constructed. If silent is False, it will propagate the event back 
+        to the parent.
+        As this is a QLineEdit, we just call setText(strValue)
+        """
+#         self.setText(strValue)
+#         self.update_text()
+#         if not silent:
+#             self.update_parent()
+        self.set_values(strValue)
+#         self.update_text()
+        if not silent:
+            self.update_parent()
+            
+#     def update_text(self):
+#         """ update_text() -> None
+#         Update the text to the result of the evaluation
+
+#         """
+#         # FIXME: eval should pretty much never be used
+#         base = expression.evaluate_expressions(self.text())
+#         if self._contentType == 'String':
+#             self.setText(base)
+#         else:
+#             try:
+#                 self.setText(str(eval(str(base), None, None)))
+#             except:
+#                 self.setText(base)
+
+    def sizeHint(self):
+        return QtCore.QSize(912, 912)
+
+#    def sizeHint(self):
+#        metrics = QtGui.QFontMetrics(self.font())
+#        width = min(metrics.width(self.text())+10,70)
+#        return QtCore.QSize(width, 
+#                            metrics.height()+6)
+    
+    def minimumSizeHint(self):
+        return self.sizeHint()
+    
+    ###########################################################################
+    # event handlers
+
+    def focusInEvent(self, event):
+        """ focusInEvent(event: QEvent) -> None
+        Pass the event to the parent
+
+        """
+        self._contents = self.get_values()
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+        QtGui.QTreeWidget.focusInEvent(self, event)
+
+    def focusOutEvent(self, event):
+        self.update_parent()
+        QtGui.QTreeWidget.focusOutEvent(self, event)
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+
+class PredictorListConfiguration(StandardModuleConfigurationWidget):
+    # FIXME add available_dict as parameter to allow config
+    def __init__(self, module, controller, available_tree, parent=None):
+        StandardModuleConfigurationWidget.__init__(self, module, controller, 
+                                                   parent)
+
+        # set title
+        if module.has_annotation_with_key('__desc__'):
+            label = module.get_annotation_by_key('__desc__').value.strip()
+            title = '%s (%s) Module Configuration' % (label, module.name)
+        else:
+            title = '%s Module Configuration' % module.name
+        self.setWindowTitle(title)
+        self.build_gui(available_tree)
+
+    def build_gui(self, available_tree):
+        layout = QtGui.QVBoxLayout()
+        # precompute tree so we only load once
+ 
+        # factor PredictorListConfigurationWidget so that it can be reused in
+        # both cases
+        self.p_value = ''
+        for function in self.module.functions:
+            if function.name == 'value':
+                self.p_value = function.parameters[0].strValue
+        # should just be able to pass this across to the PredictorList config
+        self.list_config = PredictorListWidget(self.p_value, available_tree)
+        layout.addWidget(self.list_config)
+
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.okButton = QtGui.QPushButton('&OK', self)
+        self.okButton.setFixedWidth(110)
+        self.buttonLayout.addWidget(self.okButton)
+        self.cancelButton = QtGui.QPushButton('&Cancel', self)
+        self.cancelButton.setShortcut('Esc')
+        self.cancelButton.setFixedWidth(110)
+        self.buttonLayout.addWidget(self.cancelButton)
+        
+        self.selectAllButton = QtGui.QPushButton('&Select All', self)
+        self.selectAllButton.setFixedWidth(110)
+        self.buttonLayout.addWidget(self.selectAllButton)
+        
+        self.switchSelectionButton = QtGui.QPushButton('&Switch Selection', self)
+        self.switchSelectionButton.setFixedWidth(110)
+        self.buttonLayout.addWidget(self.switchSelectionButton)
+        
+        spacerItem = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.buttonLayout.addItem(spacerItem)
+        
+        self.queryLabel = QtGui.QLabel("Query")
+        self.buttonLayout.addWidget(self.queryLabel)
+        
+        self.queryText = QtGui.QLineEdit(self)
+        self.queryText.setFixedWidth(110)
+        self.buttonLayout.addWidget(self.queryText)
+        
+        self.addQuery = QtGui.QPushButton('&Add', self)
+        self.addQuery.setFixedWidth(60)
+        self.buttonLayout.addWidget(self.addQuery)
+        
+        self.removeQuery = QtGui.QPushButton('&Remove', self)
+        self.removeQuery.setFixedWidth(60)
+        self.buttonLayout.addWidget(self.removeQuery)
+        
+        layout.addLayout(self.buttonLayout)
+        self.connect(self.okButton, QtCore.SIGNAL('clicked(bool)'), 
+                     self.okTriggered)
+        self.connect(self.cancelButton, QtCore.SIGNAL('clicked(bool)'), 
+                     self.close)
+        self.connect(self.selectAllButton, QtCore.SIGNAL('clicked(bool)'), 
+                     self.selectAllTriggered)
+        self.connect(self.switchSelectionButton, QtCore.SIGNAL('clicked(bool)'), 
+                     self.switchSelectionTriggered)
+        self.connect(self.addQuery, QtCore.SIGNAL('clicked(bool)'), 
+                     self.queryAdd)
+        self.connect(self.removeQuery, QtCore.SIGNAL('clicked(bool)'), 
+                     self.queryRemove)
+        self.setLayout(layout)
+
+    def okTriggered(self):
+        str_value = self.list_config.get_values()
+        #print str_value, "=?=", self.p_value
+        if str_value != self.p_value:
+#            print 'okTriggered:', str_value
+            functions = [('value', [str_value])]
+            self.controller.update_functions(self.module, functions)
+        self.close()
+
+    def selectAllTriggered(self):
+        self.list_config.select_all()
+    
+    def switchSelectionTriggered(self):
+        self.list_config.switch_selection()
+
+    def sizeHint(self):
+        return QtCore.QSize(912, 912)
+    
+    def queryAdd(self):
+        self.list_config.query_add(self.queryText.text())
+        
+    def queryRemove(self):
+        self.list_config.query_remove(self.queryText.text())
+
+def get_predictor_widget(class_name, tree):
+    def __init__(self, param, parent=None):
+        PredictorListConfigurationWidget.__init__(self, param, tree, parent)
+    class_name += "PredictorListWidget"
+    widget_class = type(class_name, (PredictorListConfigurationWidget,),
+                        {'__init__': __init__})
+    return widget_class
+
+def get_predictor_config(class_name, tree):
+    def __init__(self, module, controller, parent=None):
+        PredictorListConfiguration.__init__(self, module, controller, tree, 
+                                            parent)
+    class_name += "PredictorListConfig"
+    widget_class = type(class_name, (PredictorListConfiguration,),
+                        {'__init__': __init__})
+    return widget_class
diff --git a/contrib/stem/__init__.py b/contrib/stem/__init__.py
new file mode 100644
index 0000000..b8326dd
--- /dev/null
+++ b/contrib/stem/__init__.py
@@ -0,0 +1,6 @@
+name = 'STEM'
+identifier = 'edu.cornell.birds.stem'
+version = '0.0.2'
+
+def package_dependencies():
+    return ['edu.utah.sci.vistrails.rpy']
diff --git a/contrib/stem/code/STEM_Globals.R b/contrib/stem/code/STEM_Globals.R
new file mode 100644
index 0000000..e0907b9
--- /dev/null
+++ b/contrib/stem/code/STEM_Globals.R
@@ -0,0 +1,236 @@
+
+debugOutput <- FALSE
+# Slash direction for directory creation
+platform = "linux"
+# Possibly Spp names info
+	
+# Required Packages
+require(rpart)
+require(mgcv)
+require(gbm)
+require(fields)
+require(splancs)
+require(maps)
+require(maptools)
+	
+# Source STEM Libraries
+source(paste(code.directory,"stem.library.A.R",sep=""))	
+source(paste(code.directory,"stem.library.B.R",sep=""))  
+source(paste(code.directory,"stem.library.ST.R",sep=""))
+	
+# Source MORE STEM Functions 
+#source(paste(code.directory,"STEM_erd.data.creation.R",sep=""))
+source(paste(code.directory,"STEM_erd.srd.data.subsetting.R",sep=""))	
+source(paste(code.directory,"STEM_ModelFitting.R",sep="") )	
+source(paste(code.directory,"predict.eBird.ST.matrix.R",sep=""))	
+source(paste(code.directory,"STEM_st.matrix.cv.average.R",sep=""))
+
+
+## Name of space time matrix sub-directory
+st.matrix.name <- "stm"
+
+## Name of space time matrix ave map sub-directory
+st.matrix.ave.maps <- "stm.ave.maps"
+
+
+
+# ------------------------
+# Select One Species
+# speciesList - a list of vectors. vector[1] = scientificName & vector[2] = commonName 
+# ------------------------
+speciesList <- list(
+c("Hylocichla_mustelina", "Wood_Thrush"))
+#c("Cyanocitta_cristata", "Blue_Jay"))
+#c("Euphagus_carolinus", "Rusty_Blackbird"))
+#c("Turdus_migratorius", "American_Robin"))
+#c("Seiurus_aurocapilla", "Ovenbird"), 
+#c("Vireo_olivaceus", "Red-eyed_Vireo")) 
+#c("Cardinalis_cardinalis", "Northern_Cardinal"))
+#c("Junco_hyemalis", "Dark-eyed_Junco"), 
+#c("Piranga_olivacea", "Scarlet_Tanager"))
+#c("Carduelis_pinus", "Pine_Siskin"))
+#c("Hylocichla_mustelina", "Wood_Thrush"))
+#c("Colinus_virginianus", "Northern_Bobwhite"))
+
+# -----------------------------------------------------
+# SRD maximum sample size - this further restricts SRD
+# in addition to ERD spatial restrictions above)
+# -----------------------------------------------------
+srd.max.sample.size <- 5000
+
+## response.family = "bernoulli" or "gaussian"
+response.family <- "bernoulli"
+	
+# ----------------------------------------------------------------------
+# Spatial Extent by Point in Rectangle, Polygon, or ShapeFile
+# ----------------------------------------------------------------------   
+#spatial.extent.list <- NULL # Full US
+# -----------
+#spatial.extent.list <- list(type = "rectangle",
+#				lat.min = 25.0,  
+#				lat.max = 50.0,
+#				lon.min = -130.0,
+#				lon.max = -65.0)
+# -----------
+spatial.extent.list <- list(type = "polygon",
+			# data.frame with named vertices x and y
+			polygon.vertices = 
+				data.frame(x = c(-85,-85,-70,-70), 
+						   y = c(35, 50, 50, 35)) )
+# -----------
+#spatial.extent.list <- list(type="shapefile",
+#			shape.dir = data.dir.shapefiles,
+#			att.selection.column.name = "BCR",
+#			# watch capitalization!
+#			shape.filename =  "bcr.shp",  
+#			selected.shape.names = c(13))
+# -----------	
+#spatial.extent.list <- list(type="shapefile",
+#			shape.dir = data.dir.shapefiles, 
+#			att.selection.column.name = "STATE_NAME",
+#			shape.filename = "STATES.shp",
+#			selected.shape.names = c("New York")) 
+
+	
+# -------------------------------------------------------------------
+# Temporal Extent
+# -------------------------------------------------------------------	
+temporal.extent.list <- list(begin.jdate = 1, 
+			begin.year = 2006, 
+			end.jdate = 366, 
+			end.year = 2008)
+iii.year <- 2008
+n.intervals.per.year <-52
+n.intervals <- n.intervals.per.year  + 1
+jdate.seq <- seq(from = temporal.extent.list[['begin.jdate']], to = temporal.extent.list[['end.jdate']], length = (n.intervals))
+if (n.intervals > 1) {
+   jdate.seq <- round((jdate.seq[2:n.intervals] + jdate.seq[1:(n.intervals-1)])/2)
+}
+year.seq <- rep(iii.year, length(jdate.seq))
+begin.seq <- 1
+end.seq <- length(jdate.seq)
+
+
+
+# ------------------------
+# Select predictors - must be a subset of what is in erd…..
+# ------------------------
+predictor.names <- c("YEAR", "TIME", "DAY",
+		     "EFFORT_HRS", "EFFORT_DISTANCE_KM",
+		     "NUMBER_OBSERVERS", "HOUSING_DENSITY",
+		     "ELEV_NED",    	
+		     "CAUS_TEMP_AVG",
+		     "CAUS_TEMP_MIN", "CAUS_TEMP_MAX",
+		     "CAUS_PREC", "CAUS_SNOW",
+		     "NLCD2001_FS_C11_750_PLAND", "NLCD2001_FS_C12_750_PLAND",
+		     "NLCD2001_FS_C21_750_PLAND", "NLCD2001_FS_C22_750_PLAND",
+		     "NLCD2001_FS_C23_750_PLAND", "NLCD2001_FS_C24_750_PLAND",
+		     "NLCD2001_FS_C31_750_PLAND", "NLCD2001_FS_C41_750_PLAND",
+		     "NLCD2001_FS_C42_750_PLAND", "NLCD2001_FS_C43_750_PLAND",
+		     "NLCD2001_FS_C52_750_PLAND", "NLCD2001_FS_C71_750_PLAND",
+		     "NLCD2001_FS_C81_750_PLAND", "NLCD2001_FS_C82_750_PLAND",
+		     "NLCD2001_FS_C90_750_PLAND", "NLCD2001_FS_C95_750_PLAND")	
+
+# -------------------------------------------------------------------
+# Data Splitting Parameters 
+# -------------------------------------------------------------------	
+split.par.list <- list(grid.cell.min.lat = 0.75,
+                       grid.cell.min.lon = 0.75,
+                       min.val.cell.locs = 2,
+                       fraction.training.data=0.8,
+                       mfrac=1.0,
+                       plot.it=FALSE)	
+
+# -------------------------------------------------------------------
+# CV Fold Splitting Parameters 
+# -------------------------------------------------------------------	
+cv.folds <- 1
+cv.list <- c(1:cv.folds)	
+cv.folds.par.list <- list(grid.cell.min.lat = 0.75,
+                          grid.cell.min.lon = 0.75,
+                          min.val.cell.locs = 2,
+                          fraction.training.data = 0.8,
+                          mfrac = 1.0,
+                          plot.it = FALSE)						
+
+# ---------------------------------------------------------------------
+# STEM Ensemble Design
+# ---------------------------------------------------------------------
+iii.scale <- 2  # largest scale in STEM MS ==> current magic value
+stem.init.par.list <- list(  
+	# --------------------------------------------------
+	# Spatial Design
+	# --------------------------------------------------
+	spatial.extent.list = NULL,
+	spatial.region.par.list = list(	
+		# Number of MC regionalizations for each time interval
+		n.mc.regions=1, 
+		# define minimum area & sample size of rectangles
+		regional.cell.min.lat = 3.00*iii.scale,
+		regional.cell.min.lon = 4.00*iii.scale,
+		# Underlying Coverage Grid
+			# Older declarations
+			# grid.cell.min.lat = 1*(iii.scale^0.5), #5 degrees
+			# grid.cell.min.lon = 1.75*(iii.scale^0.5), # 10 degrees
+		# Simplified
+		grid.cell.min.lat = 3.00*iii.scale/3, #5 degrees
+		grid.cell.min.lon = 4.00*iii.scale/3, # 10 degrees
+		n.centers.per.region = 1, # Density Dependent!!!
+		min.data.size = 10),
+	# --------------------------------------------------
+	# Temporal Design: 
+	# Slice year into n.intervals prediction points
+	# --------------------------------------------------
+	n.intervals=60,  #add 1!    # 81 for migration
+	begin.jdate=1 ,
+	end.jdate = 366,
+	season.window.width=40,  #40       # Fitting window
+	prediction.window.width=36,  #36
+	# --------------------------------------------------
+	# Sampling
+	# --------------------------------------------------
+	sampling.par.list = list(
+		split.by.location = FALSE,
+	    # if TRUE uses locs == ensemble.data.locs
+	    ST.basis.rotation = FALSE,
+	    # if TRUE assumes {lat,lon} ={$y, $ x} 
+	    # and julian date == $JDATES 
+	    p.train=0.75))				
+
+base.model.par.list <- rpart.control(cp = 0.01, xval = 0, minbucket = 10)
+
+# ---------------------------------------------------------------------
+# conditioning variables
+# ---------------------------------------------------------------------
+
+conditioning.vars <- list(EFFORT_HRS = 1.0,
+			  EFFORT_DISTANCE_KM = 1.0,
+			  TIME = 7.0,
+			  NUMBER_OBSERVERS = 1.0,
+			  I.STATIONARY = 0)
+
+# -----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------- 
+# ST Matrix Maps 
+# (AKA Halloween Maps) 
+# -----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------- 
+
+ns.rows <- 40
+map.plot.pixel.width <- 1000
+z.max <- 0.50
+z.min <- 0.0
+map.filename.tag <- "demo."
+state.map <- TRUE   	
+state.map.lwd <- 1.0
+county.map <- TRUE                                                                                   
+county.map.lwd <- 0.5
+pred.grid.size <- ns.rows
+## map.plot.width <- map.plot.pixel.width
+map.plot.width <- 1000
+## This is duplicated in stem.init.par.list
+spatial.extent.list <- NULL
+map.tag <- map.filename.tag
+date.bar <- TRUE
+print.date <- TRUE
+## KFW resp.transformation.code <- NULL
diff --git a/contrib/stem/code/STEM_Globals.R.bkup b/contrib/stem/code/STEM_Globals.R.bkup
new file mode 100644
index 0000000..e0907b9
--- /dev/null
+++ b/contrib/stem/code/STEM_Globals.R.bkup
@@ -0,0 +1,236 @@
+
+debugOutput <- FALSE
+# Slash direction for directory creation
+platform = "linux"
+# Possibly Spp names info
+	
+# Required Packages
+require(rpart)
+require(mgcv)
+require(gbm)
+require(fields)
+require(splancs)
+require(maps)
+require(maptools)
+	
+# Source STEM Libraries
+source(paste(code.directory,"stem.library.A.R",sep=""))	
+source(paste(code.directory,"stem.library.B.R",sep=""))  
+source(paste(code.directory,"stem.library.ST.R",sep=""))
+	
+# Source MORE STEM Functions 
+#source(paste(code.directory,"STEM_erd.data.creation.R",sep=""))
+source(paste(code.directory,"STEM_erd.srd.data.subsetting.R",sep=""))	
+source(paste(code.directory,"STEM_ModelFitting.R",sep="") )	
+source(paste(code.directory,"predict.eBird.ST.matrix.R",sep=""))	
+source(paste(code.directory,"STEM_st.matrix.cv.average.R",sep=""))
+
+
+## Name of space time matrix sub-directory
+st.matrix.name <- "stm"
+
+## Name of space time matrix ave map sub-directory
+st.matrix.ave.maps <- "stm.ave.maps"
+
+
+
+# ------------------------
+# Select One Species
+# speciesList - a list of vectors. vector[1] = scientificName & vector[2] = commonName 
+# ------------------------
+speciesList <- list(
+c("Hylocichla_mustelina", "Wood_Thrush"))
+#c("Cyanocitta_cristata", "Blue_Jay"))
+#c("Euphagus_carolinus", "Rusty_Blackbird"))
+#c("Turdus_migratorius", "American_Robin"))
+#c("Seiurus_aurocapilla", "Ovenbird"), 
+#c("Vireo_olivaceus", "Red-eyed_Vireo")) 
+#c("Cardinalis_cardinalis", "Northern_Cardinal"))
+#c("Junco_hyemalis", "Dark-eyed_Junco"), 
+#c("Piranga_olivacea", "Scarlet_Tanager"))
+#c("Carduelis_pinus", "Pine_Siskin"))
+#c("Hylocichla_mustelina", "Wood_Thrush"))
+#c("Colinus_virginianus", "Northern_Bobwhite"))
+
+# -----------------------------------------------------
+# SRD maximum sample size - this further restricts SRD
+# in addition to ERD spatial restrictions above)
+# -----------------------------------------------------
+srd.max.sample.size <- 5000
+
+## response.family = "bernoulli" or "gaussian"
+response.family <- "bernoulli"
+	
+# ----------------------------------------------------------------------
+# Spatial Extent by Point in Rectangle, Polygon, or ShapeFile
+# ----------------------------------------------------------------------   
+#spatial.extent.list <- NULL # Full US
+# -----------
+#spatial.extent.list <- list(type = "rectangle",
+#				lat.min = 25.0,  
+#				lat.max = 50.0,
+#				lon.min = -130.0,
+#				lon.max = -65.0)
+# -----------
+spatial.extent.list <- list(type = "polygon",
+			# data.frame with named vertices x and y
+			polygon.vertices = 
+				data.frame(x = c(-85,-85,-70,-70), 
+						   y = c(35, 50, 50, 35)) )
+# -----------
+#spatial.extent.list <- list(type="shapefile",
+#			shape.dir = data.dir.shapefiles,
+#			att.selection.column.name = "BCR",
+#			# watch capitalization!
+#			shape.filename =  "bcr.shp",  
+#			selected.shape.names = c(13))
+# -----------	
+#spatial.extent.list <- list(type="shapefile",
+#			shape.dir = data.dir.shapefiles, 
+#			att.selection.column.name = "STATE_NAME",
+#			shape.filename = "STATES.shp",
+#			selected.shape.names = c("New York")) 
+
+	
+# -------------------------------------------------------------------
+# Temporal Extent
+# -------------------------------------------------------------------	
+temporal.extent.list <- list(begin.jdate = 1, 
+			begin.year = 2006, 
+			end.jdate = 366, 
+			end.year = 2008)
+iii.year <- 2008
+n.intervals.per.year <-52
+n.intervals <- n.intervals.per.year  + 1
+jdate.seq <- seq(from = temporal.extent.list[['begin.jdate']], to = temporal.extent.list[['end.jdate']], length = (n.intervals))
+if (n.intervals > 1) {
+   jdate.seq <- round((jdate.seq[2:n.intervals] + jdate.seq[1:(n.intervals-1)])/2)
+}
+year.seq <- rep(iii.year, length(jdate.seq))
+begin.seq <- 1
+end.seq <- length(jdate.seq)
+
+
+
+# ------------------------
+# Select predictors - must be a subset of what is in erd…..
+# ------------------------
+predictor.names <- c("YEAR", "TIME", "DAY",
+		     "EFFORT_HRS", "EFFORT_DISTANCE_KM",
+		     "NUMBER_OBSERVERS", "HOUSING_DENSITY",
+		     "ELEV_NED",    	
+		     "CAUS_TEMP_AVG",
+		     "CAUS_TEMP_MIN", "CAUS_TEMP_MAX",
+		     "CAUS_PREC", "CAUS_SNOW",
+		     "NLCD2001_FS_C11_750_PLAND", "NLCD2001_FS_C12_750_PLAND",
+		     "NLCD2001_FS_C21_750_PLAND", "NLCD2001_FS_C22_750_PLAND",
+		     "NLCD2001_FS_C23_750_PLAND", "NLCD2001_FS_C24_750_PLAND",
+		     "NLCD2001_FS_C31_750_PLAND", "NLCD2001_FS_C41_750_PLAND",
+		     "NLCD2001_FS_C42_750_PLAND", "NLCD2001_FS_C43_750_PLAND",
+		     "NLCD2001_FS_C52_750_PLAND", "NLCD2001_FS_C71_750_PLAND",
+		     "NLCD2001_FS_C81_750_PLAND", "NLCD2001_FS_C82_750_PLAND",
+		     "NLCD2001_FS_C90_750_PLAND", "NLCD2001_FS_C95_750_PLAND")	
+
+# -------------------------------------------------------------------
+# Data Splitting Parameters 
+# -------------------------------------------------------------------	
+split.par.list <- list(grid.cell.min.lat = 0.75,
+                       grid.cell.min.lon = 0.75,
+                       min.val.cell.locs = 2,
+                       fraction.training.data=0.8,
+                       mfrac=1.0,
+                       plot.it=FALSE)	
+
+# -------------------------------------------------------------------
+# CV Fold Splitting Parameters 
+# -------------------------------------------------------------------	
+cv.folds <- 1
+cv.list <- c(1:cv.folds)	
+cv.folds.par.list <- list(grid.cell.min.lat = 0.75,
+                          grid.cell.min.lon = 0.75,
+                          min.val.cell.locs = 2,
+                          fraction.training.data = 0.8,
+                          mfrac = 1.0,
+                          plot.it = FALSE)						
+
+# ---------------------------------------------------------------------
+# STEM Ensemble Design
+# ---------------------------------------------------------------------
+iii.scale <- 2  # largest scale in STEM MS ==> current magic value
+stem.init.par.list <- list(  
+	# --------------------------------------------------
+	# Spatial Design
+	# --------------------------------------------------
+	spatial.extent.list = NULL,
+	spatial.region.par.list = list(	
+		# Number of MC regionalizations for each time interval
+		n.mc.regions=1, 
+		# define minimum area & sample size of rectangles
+		regional.cell.min.lat = 3.00*iii.scale,
+		regional.cell.min.lon = 4.00*iii.scale,
+		# Underlying Coverage Grid
+			# Older declarations
+			# grid.cell.min.lat = 1*(iii.scale^0.5), #5 degrees
+			# grid.cell.min.lon = 1.75*(iii.scale^0.5), # 10 degrees
+		# Simplified
+		grid.cell.min.lat = 3.00*iii.scale/3, #5 degrees
+		grid.cell.min.lon = 4.00*iii.scale/3, # 10 degrees
+		n.centers.per.region = 1, # Density Dependent!!!
+		min.data.size = 10),
+	# --------------------------------------------------
+	# Temporal Design: 
+	# Slice year into n.intervals prediction points
+	# --------------------------------------------------
+	n.intervals=60,  #add 1!    # 81 for migration
+	begin.jdate=1 ,
+	end.jdate = 366,
+	season.window.width=40,  #40       # Fitting window
+	prediction.window.width=36,  #36
+	# --------------------------------------------------
+	# Sampling
+	# --------------------------------------------------
+	sampling.par.list = list(
+		split.by.location = FALSE,
+	    # if TRUE uses locs == ensemble.data.locs
+	    ST.basis.rotation = FALSE,
+	    # if TRUE assumes {lat,lon} ={$y, $ x} 
+	    # and julian date == $JDATES 
+	    p.train=0.75))				
+
+base.model.par.list <- rpart.control(cp = 0.01, xval = 0, minbucket = 10)
+
+# ---------------------------------------------------------------------
+# conditioning variables
+# ---------------------------------------------------------------------
+
+conditioning.vars <- list(EFFORT_HRS = 1.0,
+			  EFFORT_DISTANCE_KM = 1.0,
+			  TIME = 7.0,
+			  NUMBER_OBSERVERS = 1.0,
+			  I.STATIONARY = 0)
+
+# -----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------- 
+# ST Matrix Maps 
+# (AKA Halloween Maps) 
+# -----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------- 
+
+ns.rows <- 40
+map.plot.pixel.width <- 1000
+z.max <- 0.50
+z.min <- 0.0
+map.filename.tag <- "demo."
+state.map <- TRUE   	
+state.map.lwd <- 1.0
+county.map <- TRUE                                                                                   
+county.map.lwd <- 0.5
+pred.grid.size <- ns.rows
+## map.plot.width <- map.plot.pixel.width
+map.plot.width <- 1000
+## This is duplicated in stem.init.par.list
+spatial.extent.list <- NULL
+map.tag <- map.filename.tag
+date.bar <- TRUE
+print.date <- TRUE
+## KFW resp.transformation.code <- NULL
diff --git a/contrib/stem/code/STEM_ModelFitting.R b/contrib/stem/code/STEM_ModelFitting.R
new file mode 100644
index 0000000..cde239e
--- /dev/null
+++ b/contrib/stem/code/STEM_ModelFitting.R
@@ -0,0 +1,201 @@
+
+
+# --------------------------------------------------------------------
+# --------------------------------------------------------------------
+#
+# cv.folds = 0 : fit complete training data, no splitting
+# cv.folds >= 1: fit nfold data
+#
+# ---------------------------------------------------------------------
+# Fit & Save The bagged rpart Ensemble
+# ------------------------------------------------
+# Note: Ensemble Model information is autmatically stored 
+# with the tag ".ensemble.index.RData" in the model directory. 
+# This is essential information along with the 
+# ensemble parameter list. So we save that too.
+# ----------------------
+# Brieman rpart parameters
+#control=rpart.control(cp=0,xval=0,minsplit=2))
+# Limit infludence of any one point. 
+# And for node-level predictions, it means that a
+# single positive value may have a maximum of 
+# 1/minbucket. Which was one 
+#parms=list(split="information")) # bernoulli deviance 
+# Its huge and all the information is in the index file          
+# ---------------------------------------------------------------------
+#
+#
+# TO DO: 
+# ** Add functionality for 		
+#		keep.data = TRUE,#		verbose = TRUE,
+# and check functionality for RNG.seed in the fit.ensemble() 
+# routine. 
+# --------------------------------------------------------------------
+# --------------------------------------------------------------------
+# DMF 3.19.10 VT Changes
+# 	* remove creation of stem.results.directories
+stem <- function(train.data,
+                 stem.directory,		
+                 weights = NULL,
+                 offset = NULL,
+                 response.family = "bernoulli",	
+                 cv.folds=0,
+                 cv.folds.par.list=NULL,
+                 stem.init.par.list,
+                 base.model.par.list = NULL,
+                 keep.data = TRUE,
+                 verbose = TRUE, 
+		 RNG.seed= 12345, 
+		 block.save.size=100) # (training sample size x block.save.size ) 
+{# begin function
+# --------------------------------------------------------------------
+# use constant tag value to simplify inputs
+stem.model.tag <- "stem."
+for (iii.cv in 1:cv.folds){
+  print(paste("iii.cv", iii.cv))
+	# -------------------------------------------------------------
+	# Create Directories
+	# -------------------------------------------------------------
+		if (iii.cv == 1) {
+			system(paste("mkdir ",stem.directory,sep=""), intern=TRUE)
+
+                        if( "/" != substring(stem.directory, nchar(stem.directory), nchar(stem.directory))) {
+			   stem.model.directory <- paste(stem.directory,"/model/",sep="")                          
+                        } 
+                        else {
+			   stem.model.directory <- paste(stem.directory,"model/",sep="")
+                        }
+
+			system(paste("mkdir ",stem.model.directory,sep=""), intern=TRUE)
+		}
+		model.dir <- paste(stem.model.directory, 
+						"stem.models.", as.character(iii.cv), "/",sep="")
+		ttt.statement <- paste("mkdir ",model.dir,sep="")
+		#print(ttt.statement)
+		system(ttt.statement, intern=TRUE)
+		#results.dir <- paste(stem.directory, 
+		#				"stem.results.", as.character(iii.cv), "/",sep="")
+		#ttt.statement <- paste("mkdir ",results.dir,sep="")
+		#print(ttt.statement)
+		#system(ttt.statement, intern=TRUE)
+	# -------------------------------------------------------------
+	# Split-Fold Training Data
+	# -------------------------------------------------------------
+  print(paste("cv.folds", cv.folds))
+		if (cv.folds<=0) {
+				cv.train.data <- list(
+					X = train.data$X,
+					y = train.data$y,
+					locs = train.data$loc,
+					jdates = train.data$jdates)
+                       }
+		if (cv.folds>0) {
+			D.split <- maximum.coverage.selection(
+						locs=data.frame(
+							x=train.data$locs$x ,
+							y=train.data$locs$y),
+						jdates=train.data$jdates,	
+						grid.cell.min.lat = cv.folds.par.list$grid.cell.min.lat,						grid.cell.min.lon = cv.folds.par.list$grid.cell.min.lon,						min.val.cell.locs = cv.folds.par.list$min.val.cell.locs,						fraction.training.data = cv.folds.par.list$fraction.training.data,						mfrac = cv.folds.par.list$mfrac,						plot.it=cv.folds.par.list$plot.it)							
+			cv.train.data <- list(
+					X = train.data$X[ D.split$train.index, ],
+					y = train.data$y[ D.split$train.index ],
+					locs = 
+						list(x=train.data$loc$x[ D.split$train.index ],
+							y=train.data$loc$y[ D.split$train.index ]),
+					jdates = train.data$jdates[ D.split$train.index ])
+
+		}
+	# -------------------------------------------------------------
+	# Create Ensemble based on Training Data
+	# -------------------------------------------------------------
+
+  print("creating ensemble")
+	stem.par.list <- create.simple.STEM.ensemble(
+		ensemble.data.locs = cv.train.data$locs,
+		ensemble.data.jdates = cv.train.data$jdates,
+		#ensemble.model.filename = stem.model.tag,
+		# --------------------------------------------------
+		# Spatial Design
+		# --------------------------------------------------
+		spatial.extent.list = stem.init.par.list$spatial.extent.list ,  #default to train data convex hull 
+		spatial.region.par.list = stem.init.par.list$spatial.region.par.list, 
+			#~ # Number of MC regionalizations for each time interval
+			#~ n.mc.regions=1, 
+			#~ # Underlying Coverage Grid
+			#~ grid.cell.min.lat = 1.5*(iii.scale^0.5), #5 degrees
+			#~ grid.cell.min.lon = 2*(iii.scale^0.5), # 10 degrees
+			#~ n.centers.per.region = 1, # Density Dependent!!!
+			#~ # Maximum Rectangular Region Growth Factor
+			#~ #max.random.scale.factor = 0.25,
+			#~ # define minimum area & sample size of rectangles
+			#~ regional.cell.min.lat = 3.00*iii.scale,
+			#~ regional.cell.min.lon = 4.00*iii.scale,
+			#~ min.data.size = 25),
+		# --------------------------------------------------
+		# Temporal Design: 
+		#		Slice year into n.intervals prediction points
+		# --------------------------------------------------
+			n.intervals = stem.init.par.list$n.intervals,  #add 1!    # 81 for migration
+			begin.jdate= stem.init.par.list$begin.jdate,
+			end.jdate = stem.init.par.list$end.jdate,
+			season.window.width= stem.init.par.list$season.window.width,  #40       # Fitting window
+			prediction.window.width=stem.init.par.list$prediction.window.width,  #36
+		# --------------------------------------------------
+		# Sampling
+		# --------------------------------------------------
+			sample.ensemble.function = sample.ST.ensemble,
+			sampling.par.list = stem.init.par.list$sampling.par.list, 
+				    #~ split.by.location = FALSE,
+				    #~ # if TRUE uses locs == ensemble.data.locs
+				    #~ ST.basis.rotation = FALSE,
+				    #~ # if TRUE assumes {lat,lon} ={$y, $ x} 
+				    #~ # and julian date == $JDATES 
+				    #~ p.train=0.63),
+		# --------------------------------------------------
+		# Prediction
+		# --------------------------------------------------
+			predict.ensemble.function = predict.ST.ensemble)
+# ---------------------------------------------------------------------
+
+	# -------------------------------------------------------------
+	# STEM Fit
+	# -------------------------------------------------------------
+  print("running fit")
+		D.ttt <- fit.ensemble(
+			train.data = cv.train.data, 
+			resp.family= response.family,
+			filename = paste(model.dir,stem.model.tag,sep=""),
+			RNG.seed = RNG.seed, 
+			ensemble.par.list = stem.par.list,
+			ensemble.weights = weights,
+			block.save.size=block.save.size,
+			control=base.model.par.list)
+	# -------------------------------------------------------------	# Pack additional info into stem.par.list	# -------------------------------------------------------------
+	stem.par.list$cv.fold.train.index <- D.split$train.index
+	stem.par.list$realized.sample.par <- D.ttt$realized.sample.par
+	stem.par.list$RNG.seed <- D.ttt$RNG.seed
+	stem.par.list$function.call <- D.ttt$function.call
+	D.stem <- stem.par.list
+	save(D.stem, 
+		file = paste(model.dir, "stem.model.par.list.", 
+					iii.cv,".RData" , sep = ""))
+	rm(D.stem, D.split, stem.par.list, D.ttt)
+	## KFW gc()
+	# -------------------------------------------------------------	# Debug output	# -------------------------------------------------------------
+         if (debugOutput == TRUE) {
+       	     print("----- Memory usage before system() call gc() -----")
+             memoryMsg <- paste("Memory info =", gc(verbose=TRUE), sep=" ")
+             print(memoryMsg)
+             print("----- Memory usage before system() call object.size()-----")
+             mem <- sapply(ls(), function(x) object.size(get(x)))
+             print(mem)
+             print("----- Sum of object.size()-----")
+             print(sum(mem))
+          }
+} ## End for (iii.cv in 1:nnn.cv)
+# -----------------------------------------------------------------------------
+# No Return Value Object
+} # end function
+# --------------------------------------------------------------------
+
+        
diff --git a/contrib/stem/code/STEM_erd.srd.data.subsetting.R b/contrib/stem/code/STEM_erd.srd.data.subsetting.R
new file mode 100644
index 0000000..36f6004
--- /dev/null
+++ b/contrib/stem/code/STEM_erd.srd.data.subsetting.R
@@ -0,0 +1,273 @@
+#------------------------------------------------------------------------------
+# I envision ERD data creation this way 
+# * STEM_erd.data.creation - processes data from CSV files
+# * STEM_erd.data.subsetting - load and further subset data
+# 
+#  * Consider SRD & ERD data together as a single functional step 
+# 		because they rely on the same parameters
+#  ==> subsetting should also be done together
+# 
+# Kevin, we will need to talk about how to incorporate
+# your work on ERD & NDVI data creation.  
+# In general we want this to extend to other SRD with 
+# temporally varying covariates.  
+# 
+# Kevin, I dont know where this fits
+#------------------------------------------------------------------------------
+# Load NDVI Data
+#-----------------------------------------------------------------------------
+## KFW
+## vegetationIndexData <- read.csv(file="ebird_reference_data/processed_VI_Data_SRD.csv", na.strings = c("NA", "?"))
+#vegetationIndexData  <- matrix(scan("ebird_reference_data/custom_vi.txt"), 18880842, 6, byrow=TRUE)
+#print(class(vegetationIndexData))
+#print(nrow(vegetationIndexData))
+#print(ncol(vegetationIndexData))
+
+testRpyCall <- function(object) {
+   print(class(object))
+   print(object)
+}
+
+
+
+#------------------------------------------------------------------------------
+erd.srd.data.subsetting <- function(
+			erd.data.filename,    #erd.data.tag,
+			srd.pred.design.filename,
+			spatial.extent.list, 
+			temporal.extent.list, 
+			## KFW speciesList,
+			species.name,
+			predictor.names, 
+			response.family,
+			srd.max.sample.size,
+			split.par.list,
+			response.truncation.cutoff=20){
+ 	#---------------------------------------------------------------------------
+ 	# Load SRD Data	#------------------------------------------------------------------------------------------------------------
+  print(srd.pred.design.filename)
+	load(file=srd.pred.design.filename)  # pred.data
+		#dim(pred.data$D.pred)
+		#dim(pred.data$locs)
+	# ----------------------------------------------------------------------
+	# Limit Spatial Extent by Point in Rectangle, Polygon, or ShapeFile
+	# ----------------------------------------------------------------------   
+	xxx <- pred.data$locs$x
+	yyy <- pred.data$locs$y
+	region.index <- rep(TRUE, nrow(pred.data$D.pred) )
+	if (!is.null(spatial.extent.list)){
+		## KFW if (spatial.extent.list$type == "rectangle"){
+		if (spatial.extent.list[['type']] == "rectangle"){
+			ttt.index <- ( 
+						yyy > spatial.extent.list$lat.min & 
+						yyy < spatial.extent.list$lat.max &
+						xxx > spatial.extent.list$lon.min & 
+						xxx < spatial.extent.list$lon.max )
+			region.index <- (ttt.index & region.index)			  
+			}
+		  ## KFW if (spatial.extent.list$type == "polygon"){
+		  if (spatial.extent.list[['type']] == "polygon"){
+			ttt.index <- point.in.polygon(
+					    xxx = xxx, 
+					    yyy = yyy,
+					    polygon.vertices = 
+			spatial.extent.list$polygon.vertices)
+			region.index <- (ttt.index & region.index)			  
+			  }
+		  ## KFW if (spatial.extent.list$type == "shapefile"){
+		  if (spatial.extent.list[['type']] == "shapefile"){
+
+			  ttt.index <- point.in.shapefile(
+				sites = data.frame(lon=xxx, lat=yyy), 
+				shape.dir=spatial.extent.list$shape.dir, 
+				shape.filename=spatial.extent.list$shape.filename, 
+				att.selection.column.name=
+				       spatial.extent.list$att.selection.column.name,
+				selected.shape.names=
+				    spatial.extent.list$selected.shape.names) 
+			  region.index <- (ttt.index & region.index)		  
+			}				 		
+	} 	# if (!is.null(spatial.extent.list)){    	    
+	# ------------------
+	# Subset SRD
+	# ------------------
+	srd.data <-NULL
+	srd.data$D.pred <- pred.data$D.pred[region.index, ]
+	srd.data$locs <- pred.data$locs[region.index, ]
+		#dim(pred.data$D.pred)
+		#dim(pred.data$locs)		
+	rm(pred.data)
+	## KFW gc()	
+	# ------------------
+	# Subset SRD
+	# DMF 3.17.10
+	# ------------------	
+	if (!is.null(srd.max.sample.size)) {
+		if (nrow(srd.data$D.pred) > srd.max.sample.size){
+			ttt.index <- sample(x=c(1:nrow(srd.data$D.pred)), 
+							size=srd.max.sample.size)
+			srd.data$D.pred <- srd.data$D.pred[ttt.index, ]
+			srd.data$locs <- srd.data$locs[ttt.index, ]
+		}
+	}
+	# --------------------------
+
+
+	#-----------------------------------------------------------------------------
+	# Load ERD parameter data & Data	
+        #	
+        # Wish List for erd.data.creation 	
+        # ** combine data & parameters into a single list object
+	# ** save only index to identify train & test sets. There is no need to 	
+        # 	save entire thing twice. 	
+        #------------------------------------------------------------------------------
+	#erdParameterListFile <- paste(data.dir, erd.data.tag, "erd.data.par.list.RData", sep="")
+	#load(file=erdParameterListFile) #return.list
+	#D.erd.data.par.list <- return.list
+	
+	#erdDataFile <- paste(data.dir, D.erd.data.par.list$erd.data.tag, "erd.data.RData", sep="")
+	load(file=erd.data.filename) #    erdDataFile) #D
+	# ----------------------------------------------------------------------
+	# Limit Spatial Extent by Point in Rectangle, Polygon, or ShapeFile
+	# ----------------------------------------------------------------------
+	xxx <- D$LONGITUDE
+	yyy <- D$LATITUDE
+	region.index <- rep(TRUE, nrow(D) )
+	if (!is.null(spatial.extent.list)){
+		## KFW if (spatial.extent.list$type == "rectangle"){
+		if (spatial.extent.list[['type']] == "rectangle"){
+			ttt.index <- ( 
+						yyy > spatial.extent.list$lat.min & 
+						yyy < spatial.extent.list$lat.max &
+						xxx > spatial.extent.list$lon.min & 
+						xxx < spatial.extent.list$lon.max )
+			region.index <- (ttt.index & region.index)			  
+			}
+		  ## KFW if (spatial.extent.list$type == "polygon"){
+		  if (spatial.extent.list[['type']] == "polygon"){
+			ttt.index <- point.in.polygon(
+					    xxx = xxx, 
+					    yyy = yyy,
+					    polygon.vertices = 
+			spatial.extent.list$polygon.vertices)
+			region.index <- (ttt.index & region.index)			  
+			  }
+		  ## KFW if (spatial.extent.list$type == "shapefile"){
+		  if (spatial.extent.list[['type']] == "shapefile"){
+			  ttt.index <- point.in.shapefile(
+				sites = data.frame(lon=xxx, lat=yyy), 
+				shape.dir=spatial.extent.list$shape.dir, 
+				shape.filename=spatial.extent.list$shape.filename, 
+				att.selection.column.name=
+				       spatial.extent.list$att.selection.column.name,
+				selected.shape.names=
+				    spatial.extent.list$selected.shape.names) 
+			  region.index <- (ttt.index & region.index)		  
+			}				 		
+	} 	# if (!is.null(spatial.extent.list)){    	    
+	# -------------------------------------------------------------------
+	# -------------------------------------------------------------------
+	# Limit Temporal Extent
+	# -------------------------------------------------------------------	
+	season.index <- rep(TRUE, nrow(D) )
+	if (!is.null(temporal.extent.list)){ 
+		# Convert JDATE + YEAR to single temporal index
+		begin.tindex <- temporal.extent.list$begin.year + 
+						temporal.extent.list$begin.jdate/366 
+		end.tindex <- temporal.extent.list$end.year + 
+						temporal.extent.list$end.jdate/366
+		D.tindex <- D$YEAR + D$DAY/366 
+		season.index <- D.tindex >= begin.tindex & 
+						D.tindex <= end.tindex
+	}
+	# -------------------------------------------------------------------
+	# ST extent
+	# -------------------------------------------------------------------	
+	regional.seasonal.index <- region.index & season.index
+	sum(regional.seasonal.index)
+	ebirdReferenceDataFrame <- D[regional.seasonal.index, ]
+	rm(D)
+	## KFW gc(D)
+	#------------------------------------------------------------------------------------------------------------	
+        # Train:Test Set Split :   maximum coverage, eq wt train-test split	
+        #------------------------------------------------------------------------------------------------------------	
+        D.split <- maximum.coverage.selection(locs=data.frame(x=ebirdReferenceDataFrame$LONGITUDE ,
+                                                              y=ebirdReferenceDataFrame$LATITUDE),
+                                              jdates=ebirdReferenceDataFrame$DAY,	
+                                              #  vector length n
+                                              grid.cell.min.lat = split.par.list$grid.cell.min.lat,	
+                                              grid.cell.min.lon = split.par.list$grid.cell.min.lon, 
+                                              min.val.cell.locs = split.par.list$min.val.cell.locs,
+                                              fraction.training.data = split.par.list$fraction.training.data,
+                                              mfrac = split.par.list$mfrac,	
+                                              plot.it=split.par.list$plot.it)
+	# -----------------------------------------------
+			train.index <- D.split$train.index
+	 		test.index <- D.split$test.index
+	 		rm(D.split)
+			## KFW response.index <-  names(ebirdReferenceDataFrame) %in% speciesList[[1]][1]
+			response.index <- names(ebirdReferenceDataFrame) %in% species.name
+			predictors.index <- names(ebirdReferenceDataFrame) %in% predictor.names
+	 		train.data <- NULL
+	 		test.data <- NULL
+	 		# ---------------------
+	 		train.data$X <- ebirdReferenceDataFrame[train.index, predictors.index]
+	 		ttt.y <-  ebirdReferenceDataFrame[, response.index]
+			train.data$y <- ttt.y[train.index]
+			rm(ttt.y)
+	 		train.data$locs$x <- ebirdReferenceDataFrame$LONGITUDE[train.index]
+	 		train.data$locs$y <- ebirdReferenceDataFrame$LATITUDE[train.index]
+	 		train.data$jdates <- ebirdReferenceDataFrame$DAY[train.index]
+	 		# ------------------------------------
+	 		test.data$X <- ebirdReferenceDataFrame[test.index,predictors.index]
+	 		ttt.y <-  ebirdReferenceDataFrame[, response.index]
+			test.data$y <- ttt.y[test.index]
+			rm(ttt.y)
+	 		test.data$locs$x <- ebirdReferenceDataFrame$LONGITUDE[test.index]
+	 		test.data$locs$y <- ebirdReferenceDataFrame$LATITUDE[test.index]
+	 		test.data$jdates <- ebirdReferenceDataFrame$DAY[test.index]
+	 		# --------------------------------------------
+	 		rm(ebirdReferenceDataFrame)
+	# ----------------------------------------------------------------------
+	#  ERD parameters
+	# ----------------------------------------------------------------------
+		#protocol.tag <- D.erd.data.par.list$protocol.tag  
+			#c("traveling","stationary") #,"casual.obs")
+		#if (D.erd.data.par.list$response.type == "occurrence") {
+		#	resp.family <- "bernoulli"  # "gaussian" or "bernoulli"
+		#	}
+		#if (D.erd.data.par.list$response.type == "abundance"){
+		#	resp.family <- "gaussian"  # "gaussian" or "bernoulli"
+		#	}
+	# --------------------------------
+	if ( response.family =="bernoulli") {
+		# ------------------------------------
+		# Logical - where the predicted response is the 
+		# probability of a positive/True class
+		# -------------------------------------
+		train.data$y <- as.factor( train.data$y > 0) # TRUE if positive
+		test.data$y <- as.factor( test.data$y > 0) # TRUE if positive
+		} 
+	# Create Truncated Gaussian Response
+	if ( response.family == "gaussian"){ 
+		#
+		# truncate responses @ 10 
+		#sum(train.data$y > response.truncation.cutoff)
+		train.data$y[train.data$y > response.truncation.cutoff] <- response.truncation.cutoff
+		test.data$y[test.data$y >response.truncation.cutoff] <- response.truncation.cutoff
+		}     
+# --------------------------------------------------------------------------
+	return.list <- list(
+	 		train.index = train.index,
+	 		test.index = test.index,
+	 		#protocol.tag=protocol.tag,
+	 		response.family=response.family,
+	 		train.data = train.data, 
+	 		test.data = test.data,
+	 		srd.data = srd.data) 
+# --------------------------------------------------------------------------
+	return(return.list)
+	}
+# --------------------------------------------------------------------------
+
+
diff --git a/contrib/stem/code/STEM_st.matrix.cv.average.R b/contrib/stem/code/STEM_st.matrix.cv.average.R
new file mode 100644
index 0000000..7d62b24
--- /dev/null
+++ b/contrib/stem/code/STEM_st.matrix.cv.average.R
@@ -0,0 +1,95 @@
+# -----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------- 
+# Compute ST Matrix fold-average
+# # DMF 3.19.10 
+# 
+# The fold-average st.mat predictions produces
+# a single ST matrix object and stores it in the output dir.
+# 
+# The idea here is the ST matrix handle is the directory name
+# So, different ST matrices need to live in different directories
+# because each directory will have the same file names. 
+#
+# Remember, we are assuming that the loc list is identical for 
+# all cv.folds. 
+#
+#
+#
+# Inputs
+# 	stem.dir
+# 	st.matrix.input.name
+# 	jdate.seq
+# 	year.seq
+# Outputs:
+# 	ST.matrix 
+#
+#
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------		
+st.matrix.cv.average <- function(
+		stem.directory, #=stem.directory
+		st.matrix.input.directory,	# st.matrix project name #st.matrix.file.tag, # = "demo." 
+	  	cv.list, # = c(1:cv.folds) 
+		jdate.seq = jdate.seq,
+		year.seq = year.seq,			   
+		st.matrix.output.directory){
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------					    
+
+   if ("/" == substring(st.matrix.input.directory, nchar(st.matrix.input.directory), nchar(st.matrix.input.directory))) {
+      st.matrix.directory <- st.matrix.input.directory
+   }
+   else {
+      st.matrix.directory <- paste(st.matrix.input.directory, "/", sep="")
+   }
+
+   if ("/" == substring(st.matrix.output.directory, nchar(st.matrix.output.directory), nchar(st.matrix.output.directory))) {
+      st.matrix.output.directory <- st.matrix.output.directory
+   }
+   else {
+      st.matrix.output.directory <- paste(st.matrix.output.directory, "/", sep="")
+   }
+
+   system(paste("mkdir ", st.matrix.output.directory,sep=""), intern=TRUE)
+# -----------------
+for (iii in 1:length(jdate.seq)){	
+	cv.pred <- NULL
+	for (iii.cv in cv.list){
+		# --------------------------------------------------------------------
+		# Load data into (location, time) matrix
+		# --------------------------------------------------------------------
+		#results.dir <- paste(stem.directory,"stem.results.",iii.cv, "/",sep="")
+		#stem.ST.matrix.file.tag <- 
+		#	paste(results.dir,st.matrix.file.tag,"st.matrix.",sep="")
+		results.dir <- paste(st.matrix.directory, "st.matrix.", 
+				as.character(iii.cv), "/",sep="")	
+		stem.ST.matrix.file.tag <- 
+	    		paste(results.dir,"st.matrix.",sep="")
+		stp.name <- paste(stem.ST.matrix.file.tag,".",iii,".RData",sep="")
+		load(stp.name) # st.pred
+		#names(st.pred) #xxx      yyy      pred        sd
+		if (iii.cv == cv.list[1]) cv.pred <- st.pred$pred
+		if (iii.cv != cv.list[1]) cv.pred <- cv.pred + st.pred$pred
+	} # iii.cv 
+	st.pred$pred <- cv.pred/length(cv.list)
+	# -----------------------
+	# Save st.pred
+	# -----------------------
+	# map.dir 
+	cv.ave.st.pred.filename <- paste(st.matrix.output.directory,
+					"st.matrix..",iii,".RData",sep="")
+
+	save(st.pred, file = cv.ave.st.pred.filename) # st.pred
+} # end iii - intervals
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+} # end function 
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+
+
+
+
+
+
+        
diff --git a/contrib/stem/code/predict.eBird.ST.matrix.R b/contrib/stem/code/predict.eBird.ST.matrix.R
new file mode 100644
index 0000000..e46cd31
--- /dev/null
+++ b/contrib/stem/code/predict.eBird.ST.matrix.R
@@ -0,0 +1,200 @@
+
+
+# --------------------------------------------------------------------
#  
+#  ==> This function is just a CV wrapper to 
+#		predict.st.matrix.ebird.ref.data!!! 
+#  ==> Also new is the creation of an "index" file
+# 		to hold all of the parameters needed to describe
+# 		the st.matrix (file sequence)
+# 
+#
+# The ST Matrix: 
+# ------------------
+# Basis for predictive experiments or ST analysis 
+# is predictions across a region in space and across. 
+# Often we want to know how spatial distrivution changed shrought time. 
+# 
+# Conceptually the ST Matrix as a data object is a set of 
+# prediction across a lattice in space and time.  
+# The st.matrix data object is a sequence of files
+# Each one contains the predictions across a set of locations
+# during a single time step.
+# Each file in the sequence contains the predictions across
+# the same set of locations evaluated at each of times
+# in the temporal sequence.
+#
+# One set of ST.matrix files is written for each CV-fold 
+# model in cv.list
+#
+# The ST matrix can be thougth of as a source of psuedo-data
+# with 3 added benefits: 
+# 1) Cleaned
+# 2) Filled In
+# 3) Uncertainty Estimates 
+#
+# 
+# File Namining Conventions
+# ---------------------------
+#
+#
+# Naming Standards are being hardcoded for convenience/simplicity
+# For example, one stem analysis per directory means that the
+# STEM objects are uniquely identified by the directory name. 
+# So, I fixed the model names by hardcoding 
+# 		stem.model.tag <- "stem." 
+# 
+# st.matrix Names = paste(results.dir,st.matrix.file.tag,"st.matrix.",
+#							[sequence number], ".RData",sep="")
+# These are kept in the CV result directories 
+# because they are CV specific. 
+# 
+# --------------------------------------------------------------------
# --------------------------------------------------------------------
+# DMF 3.19.10 VT modifications
+# 	* change formal parameter st.matrix.name,	# st.matrix project name
+predict.erd.st.matrix <- function(
+	stem.directory, # equivalent to stem.object
+	pred.data, 		#= srd.data,
+  	cv.list, 		# subset of cv's
+  	stem.predictor.names, 		   
+	# --------------
+	st.matrix.name,	# st.matrix project name
+	#st.matrix.directory,
+	jdate.seq,
+	year.seq,
+	conditioning.vars){ #= conditioning.vars)				   
+# -------------------------------------------------------------------- 
+   stem.model.tag <- "stem."  #hardcoded for convenience
+
+   print("**********")
+   print(stem.directory)
+
+
+   if ("/" == substring(stem.directory, nchar(stem.directory), nchar(stem.directory))) {
+      st.matrix.directory <- paste(stem.directory, st.matrix.name, "/", sep="")
+      stem.model.directory <- paste(stem.directory, "model", "/", sep = "")
+   }
+   else {
+      st.matrix.directory <- paste(stem.directory, "/", st.matrix.name, "/", sep="")
+      stem.model.directory <- paste(stem.directory, "/", "model", "/", sep="")
+   }
+
+   system(paste("mkdir ",st.matrix.directory, sep=""), intern=TRUE)
+
+# ---------------------------
+for (iii.cv in cv.list){
+	results.dir <- paste(st.matrix.directory, "st.matrix.", 
+		as.character(iii.cv), sep = "")
+	system(paste("mkdir ",results.dir,sep=""), intern=TRUE)
+	# ------	
+	model.dir <- paste(stem.model.directory, "stem.models.", 
+		as.character(iii.cv), "/", sep="")
+	stem.ST.matrix.file.tag <- 
+	    paste(results.dir,"/", "st.matrix.",sep="")
+	## Load nfold specific parameter list
+	load(file = paste(model.dir, 
+				"stem.model.par.list.", iii.cv, ".RData" , sep = "")) # D.stem      
+    # ----------------------------
+    # Write ST.Matrix object to stem.results directories
+    # ----------------------------
+
+   print(names(pred.data$D.pred))
+   print(nrow(pred.data$D.pred))
+
+
+    predict.st.matrix.ebird.ref.data(
+	    	prediction.design = pred.data$D.pred,
+		   	prediction.design.locs = pred.data$locs,
+	  	# prediction.design.jdates,  #not needed here
+	  	#--------------
+	  		model.predictor.names = stem.predictor.names,
+	  		model.filename = #stem.model$ensemble.model.filename,
+				paste(model.dir, stem.model.tag,sep=""),
+	  		ensemble.par.list = D.stem, #stem.model, #ensemble.par.list,
+	  	# --------------
+	  		save.name = stem.ST.matrix.file.tag,
+	  	# Temporal Sequence
+	  		jdate.seq =jdate.seq,
+	  		year.seq =year.seq,
+	  	# Conditioning Vars - Observation Process Design
+	  		conditioning.vars = conditioning.vars)
+	# ---------------------- 
+	# Save Index File 
+	# ----------------------    
+	st.matrix.list <- list(
+		stem.directory = stem.directory, 
+		pred.data.locs = pred.data$locs, 		
+		cv.number=iii.cv, 		# subset of cv's
+		stem.predictor.names=stem.predictor.names, 		   
+		# --------------
+		st.matrix.name = st.matrix.name,
+		jdate.seq = jdate.seq,
+		year.seq = year.seq,
+		conditioning.vars=conditioning.vars)
+	filename.tag <- 
+        paste(results.dir,"st.matrix.list.",iii.cv,".RData",sep="")    
+    save(st.matrix.list, file=filename.tag)
+    # ------------------       
+    ## KFW DF
+    ## Local memory recovery block
+    rm(D.stem,st.matrix.list)
+    ## KFW gc()
+} # end iii.cv - data folds    
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+## Clear the deck
+rm(list = c("bs.rpart.maps", "conditioning.vars", "create.pd.grid", 
+	"create.simple.STEM.ensemble", "D", "data.filename", 
+	"D.erd.data.par.list", "D.erd.test.data.par.list", 
+	"D.erd.train.data.par.list", "deviance.explained", 
+	"ebirdReferenceDataFrame", "ensemble.partial.dependence", 
+	"equal.wt.max.coverage.selection", "erdDataFile", "erdParameterListFile", 
+	"exp.name", "fit.ensemble", "fit.stem", "halloween.maps", "iii.cv",
+	"iii.year", "initizalize.map.grid", "jdate.seq", "make.erd.data", 
+	"make.functional.data.design.matrix", "make.SPAT.COVAR.pred.data", 
+	"make.spatial.erd.prediction.design", "map.tag", 
+	"maximum.coverage.selection", "model.dir", "monthly.maps", "n.intervals", 
+	"n.intervals.per.year", "n.red", "plot.diagnostics", 
+	"plot.STEM.temporal.design", "plot.ST.ensemble", "plot.vi.bdt", 
+	"point.in.polygon", "point.in.polygon.contours", "point.in.shapefile", 
+	"poisson.accuracy", "poisson.deviance", "poisson.pearson", "pop.rpart", 
+	"pred.data", "predictive.performance", "predictors.index", 
+	"predict.stem.ST.matrix", "predict.ST.ensemble", "predict.st.matrix", 
+	"predict.st.matrix.ebird.ref.data", "protocol.tag", "resp.family", 
+	"response.index", "response.truncation.cutoff", "results.dir", "return.list", 
+	"rotate.ST.basis.pred", "rotate.ST.basis.sample", 
+	"rpart.ensemble.diagnostics", "sample.ST.ensemble", "seasonal.window", 
+	"smooth.st.predictions", "spatial.density.contours", 
+	"spatial.performance.plot", "spp.common.name", "spp.dir", "spp.list", 
+	"stateMapEnv", "stem.map.inference.split", "STEM.partial.dependence", 
+	"stem.ST.matrix.file.tag", "st.ttt.pred", "summarize.ensemble", 
+	"summary.1D.PD.ensemble", "surface.maps", "test.set.prediction.filename", 
+	"ttsplit", "ttt.statement", "unique.locs.splitting", 
+	"year.seq", "zzz.max"))
+if (debugOutput == TRUE) {
+   rm(list = c("mem", "memoryMsg"))
+}
+## KFW gc()
+# --------------------------------------------------------------------------
+} #end function
+# --------------------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/contrib/stem/code/stem.library.A.R b/contrib/stem/code/stem.library.A.R
new file mode 100644
index 0000000..60b9074
--- /dev/null
+++ b/contrib/stem/code/stem.library.A.R
@@ -0,0 +1,2088 @@
+
+#--------------------------------------------------------------------------------
+# Predictive.Ensemble.Modeling.Library
+# 1.22.09
+# DMF
+#
+#
+#--------------------------------------------------------------------------------
+#
+# One Stop Shopping for BDT's
+# Bigger vision - this is a flexible bootstrap CV wrapper
+# for predictive modeling.
+#
+#
+# 3.11.09 - Added New STEM Spatial Design 
+# 	Tested standalone
+# 
+#	Tested with Demo - performed favorably on NE Norcar data 
+# 	compared with BDT!!! Bernoulli - 
+# 	spatial design - no temporal segmentation.  
+#
+#New Strategy for saving smaller rpart objects. 
+# ----------------------------------------------------
+#Sucess = saving minimal structure for making predicitons 
+#        & CALCULATING diagnostics (VI's)
+#Test: 
+#Pass data frame to predict function. 
+#How big are the terms? 
+#Can they be left out and still make preds & VI's?
+#--------------------------------------
+#      ans <- list(frame = frame, where = where, call = call, 
+#            terms = Terms, cptable = t(rp$cptable), splits = splits, 
+#            method = method, parms = init$parms, control = controls, 
+#            functions = functions)
+#      class(ans) <- "rpart"
+#
+#
+# 4/15
+# -------
+# ** sample.ST.ensemble - fixed temporal index problem
+# ** predict.ST.ensemble - fixed temporal index problem
+# 					** fixed response factor input
+# ==> This means that the ST ensemble is finally doing 
+# what I THOUGHT it was doing all the time. 
+# ** reduced memory footprint & speed up run times
+# ==> Run very many more small models - improving 
+# ensemble depth. 
+#
+# 4.15 TO DO LIST: 
+# -------------------------
+# ** Batch processing for Partial Calculations
+# ** I need to figure out some logic to deal with possibilites
+# 	of region-seasons that do not contain any data, or 
+# 	perhaps do not contain any sampled training data. 
+# 		this will affect sample.ST.ensemble 
+# 		create.ST.ensemble - one option may be to simply exclude them
+# 		and fit.ST.ensemble & predict.ST.ensemble
+# ** Need to make location information names and parameters 
+# 	consistent across all ST.ensmble functions
+# 		This means do not assume that train.data$X$x & $X$y are there!!
+# ** sample.ST.ensemble
+# 		** missing logic for sampling options
+# 		** currently writing $X.loc to the GLOBAL instance 
+# 			of ensemble.par.list. This is BAD - and unnecessary
+# 			need to clean logic. 
+#
+#
+#
+# predict.ST.ensemble - Assumes existance of 
+# 	prediction.design$x,  $y,  & $JDATE
+# 
+#
+#--------------------------------------------------------------------------------
+
+
+
+# ---------------------------------------------------------------------
+# ---------------------------------------------------------------------
+# FUNCTION: Fit and Save BDT Ensemble
+# ---------------------------------------------------------------------
+# ---------------------------------------------------------------------
+# D.Fink
+# Cornell Lab of Ornithology
+# Department of Statistical Science
+# 7.14.08
+#
+# Description
+# -------------
+#
+# Usage:
+# --------
+#
+# Arguments:
+# -----------
+# y 		response vector
+# X			matrix/data.frame of predictors only!!!
+#       		one predictor per column. Describe how predictors enter model
+#       		as main effects and interactions of smooth & nonsmooth funcitional
+#       		forms. Invariant to Monotone transformations.etc.
+# ensemble.weights = from ben's experience rpart likes variances (as 
+# opposed to sd or reciprocals of ...)
+# it looks like gam likes st.dev. 
+#
+# Value
+# --------
+#  ib.sample.index = logical matrix dimension (n x bs.trials)
+#                  indicates training samples for each ensemble
+#
+# Details
+# --------
+#
+# TO DO List
+# -------------
+#
+# 3.25.09 Added code to pass weights to rpart
+#
+# 4.14.09
+# -------------
+# Modified code to save oob. & ib.sample.index's 
+# 	** in batches
+# 	** to separate file sets
+# This in order to reduce the memory overhead. 
+# Both of these matrices were being stored as 
+# size = N x (# of ensemble model). 
+# Moreover, I almost never use this information for predictions. 
+# So, I am going to write it to disk , just in case. 
+# Meanwhile - The index file has been modified to hold:
+#	# * Number of models in ensemble 
+#	# * ensemble resp.family
+#	# * realized.sample.par
+# and I might add the ensemble.par.list for good measure. 
+#
+#
+# **** I NEED LOGIC TO CHECK FOR "NULL" SAMPLES!!!
+#
+#
+# ---------------------------------------------------------------------
+# ---------------------------------------------------------
+# Design Notes:
+#
+# * Individual-Model Paramters will pass through, since cant anticipate
+#           how to handle parameters from other models!!!
+# * Ensemble Parameters will be passed with a dedicated list name
+#   since this is something that I CAN control
+# ---------------------------------------------------------
+fit.ensemble <- function(
+    train.data,
+    resp.family,
+    RNG.seed = NULL,
+    #sample.ensemble.function,
+    ensemble.par.list=NULL,
+    filename,
+    ensemble.weights=NULL,
+    block.save.size=100,  # (training sample size x block.save.size ) 
+    # Model Parameter Pass Through
+    ...){
+    # ---------------------------------------------------------
+    # Inits
+    # ---------------------------------------------------------
+    function.call <- match.call()
+    ib.sample.index <- NULL
+    oob.sample.index <- NULL
+    realized.sample.par <- NULL
+    n <- length(train.data$y)
+    ensemble.trials <- ensemble.par.list$n.ensemble.models
+    # -----------------------------------------------
+    if (resp.family=="gaussian") bs.method <- "anova"
+    if (resp.family=="bernoulli") bs.method <- "class"
+    if (resp.family=="multiclass") bs.method <- "class"
+    if (resp.family=="poisson") bs.method <- "poisson"
+    # ---------------------------------------------------------
+    # Bootstrap Samples
+    # ---------------------------------------------------------
+    block.number <- 1
+    for (iii in 1:ensemble.trials) {
+	# -------------------------------------
+	# RNG.seed parameter
+	# ------------------------------------------------
+	if (iii==1 & !is.null(RNG.seed)) set.seed(RNG.seed)
+	# --------------------------
+
+	sample.data <- ensemble.par.list$sample.ensemble.function(
+					ensemble.model.number = iii,
+				    ensemble.data = train.data, 
+				    ensemble.par.list = ensemble.par.list,
+				    diagnostic.plot = FALSE) 
+	
+			#cat("fe: iii,",iii, " length(yyy)=", length(sample.data$y),
+			#	sum(is.na(sample.data$y)) "\n")
+			#cat("fit.ensemble: iii,",iii, " sum(is.na(yyy))=", sum(is.na(sample.data$y)), "\n")
+			#if (length(sample.data$y) == sum(is.na(sample.data$y)) ){
+			#	print(sample.data$y)
+			#}	
+	# ---------------------------------------------
+	# Fit Ensemble Member with sampled data
+	# ---------------------------------------
+        # First check for weights
+	if (is.null(ensemble.weights)) {
+	   f.rpart <- try(rpart( yyy ~ .,
+                 data= data.frame(yyy=sample.data$y,sample.data$X),
+				 method=bs.method,
+				 ...))	
+	   # If there is an error, try it again
+	   if (class(f.rpart) == "try-error") {
+	      cat("fit.ensemble: rpart error \n")
+	      f.rpart <- try(rpart( yyy ~ .,
+				    data= data.frame(yyy=sample.data$y,sample.data$X),
+				    method=bs.method,
+				    ...))	
+	   }				
+	}
+        else { 
+	     f.rpart <- try(rpart( yyy ~ .,
+				data= data.frame(yyy=sample.data$y,sample.data$X),
+				weights= ensemble.weights[sample.data$ib.num.ind],
+				method=bs.method,
+				...))
+	     # If there is an error, try it again
+	     if (class(f.rpart) == "try-error") {
+	     	cat("fit.ensemble: rpart error \n")
+		f.rpart <- try(rpart( yyy ~ .,
+				      data= data.frame(yyy=sample.data$y,sample.data$X),
+				      weights= ensemble.weights[sample.data$ib.num.ind],
+				      method=bs.method,
+				      ...))	
+	     }			
+        }
+	# ----------------------
+	# Save Ensemble Model
+	#-----------------------
+	num.txt <- formatC(iii, format="fg", width=6)
+	num.txt <- chartr(" ","0",num.txt)
+	temp.filename <- paste(filename,".",num.txt,".RData",sep="")
+	if (iii == 1) save(f.rpart,  file=temp.filename)
+	if (iii > 1) {
+		rpart.parts <-
+		list( frame = f.rpart$frame,
+			where = f.rpart$where, # - vector
+			splits= f.rpart$splits, #- numeric matrix
+			cptable = f.rpart$cptable)
+		if (sum(names(f.rpart) == "csplit") > 0)
+			rpart.parts$csplit <- f.rpart$csplit
+		save(rpart.parts,  file=temp.filename)
+	}
+	# --------------------------------
+	# Save sampled data information
+	# --------------------------------
+	ttt.logical <- rep(FALSE, n)
+	ttt.logical[sample.data$oob.num.ind] <- TRUE
+	oob.sample.index <- cbind(oob.sample.index, ttt.logical)
+	ttt.logical <- rep(FALSE, n)
+	ttt.logical[sample.data$ib.num.ind] <- TRUE
+	ib.sample.index <- cbind(ib.sample.index, ttt.logical)
+	# ---------------- 
+	realized.sample.par <- cbind(realized.sample.par, sample.data$realized.par)
+
+    	# ----------------------------------------------------
+    	# Block Save of Sampling Index Information 
+    	# ----------------------------------------------------
+    	if ( round(iii/block.save.size) == (iii/block.save.size)) { 
+	    return.list <- list(oob.sample.index = oob.sample.index,
+	                        ib.sample.index = ib.sample.index,
+	                        realized.sample.par = realized.sample.par,
+	                        function.call = function.call)
+	    temp.filename <- paste(filename,".bs.sampling.index.", block.number,".RData",sep="")
+	    save(return.list, file=temp.filename)
+	    # -------------------------------
+	    # Reinitialize Results 
+	    # -------------------------------
+	    ib.sample.index <- NULL
+	    oob.sample.index <- NULL
+	    # Next block number
+	    block.number <- block.number + 1
+	}                                                         
+    }# End for(iii) :Bootstrap
+
+    # ---------------------------------------------------------
+    # ----------------------------------------------------
+    # Final Block Save of Sampling Index Information 
+    # ----------------------------------------------------
+    if (!is.null(oob.sample.index)){
+	    return.list <- list(oob.sample.index = oob.sample.index,
+	        ib.sample.index = ib.sample.index,
+	        realized.sample.par = realized.sample.par,
+	        function.call = function.call)
+	    temp.filename <- paste(filename,".bs.sampling.index.",
+	    			   block.number,".RData",sep="")
+	    save(return.list, file=temp.filename)
+            rm(ib.sample.index) 
+    	    rm(oob.sample.index)
+	    ## KFW gc()
+    }                                       
+    # ---------------------------------------------------------
+    # Return Value
+    # ** I need to return enough information to act as a
+    #    handle to the ensemble for prediction, diagnostics, etc.
+    # ** Save all this information as a header/providence
+    #    index file with the ensemble itself
+    # ---------------------------------------------------------
+    rm(rpart.parts)
+    rm(num.txt)
+    return.list <- list(realized.sample.par = realized.sample.par,
+		   			    resp.family=resp.family,
+					    RNG.seed = RNG.seed,
+					    block.save.size=block.save.size,
+					    function.call = function.call)
+    temp.filename <- paste(filename,".ensemble.index.RData",sep="")
+    save(return.list, file=temp.filename)
+
+    return(return.list)
+}# End FUNCTION
+# ---------------------------------------------------------
+
+
+
+
+
+# ---------------------------------------------------------------------
+# This is a simple function to compute
+# OOB Predictions,
+# SD,
+# OOB Matrix,
+# * Handle NA's for samples that have not been predited
+# OOB. This is more of a concern when the number of
+# bootstraps is small.
+#
+#
+# OUTPUT:
+#        count = (n x 1) vector count of BS reps for each obs
+#        mean =  (n x 1) vector count of BS reps for each obs
+#        sd = OOB.sd,
+#        matrix = OOB.pred.index)
+#
+#      predict.oob.bdt
+# ---------------------------------------------------------------------
+#predict.oob.bdt <- function(filename, X.train){
+## ---------------------------------------------------------------------
+#  # ---------------------------------------------------------
+#  # Inits
+#  # ---------------------------------------------------------
+#    temp.filename <- paste(filename,".ensemble.index.RData",sep="")
+#    load(file=temp.filename) #return.list
+#  # ---------------------------------------------------------
+#  # OOB Predictions - Means & SD's
+#  # ---------------------------------------------------------
+#      #KISS-Predict entire training set, then extract OOB preds
+#      training.pred <- predict.bdt(
+#                      filename = filename,  #model specific stuff stored here
+#                      prediction.design=X.train)
+#      OOB.pred.index <- training.pred$matrix
+#      OOB.pred.index[return.list$ib.sample.index==TRUE] <- NA
+#      # -------------------
+#      OOB.count <- apply(!return.list$ib.sample.index, 1, sum)
+#      OOB.pred <- apply(OOB.pred.index, 1, mean, na.rm = TRUE)
+#      OOB.sd <-  apply(OOB.pred.index, 1, sd, na.rm = TRUE)
+#  # ---------------------------------------------------------
+#  # Return Value
+#  # ---------------------------------------------------------
+#    return.list <- list(
+#        count = OOB.count,
+#        mean = OOB.pred,
+#        sd = OOB.sd,
+#        matrix = OOB.pred.index)
+#    return(return.list)
+## ---------------------------------------------------------
+#}# END OOB FUNCTION
+## ---------------------------------------------------------------------
+## ---------------------------------------------------------------------
+#
+
+# -------------------------------------------------------------------
+# -------------------------------------------------------------------
+# Variable Importances & Summaries
+# DT-rpart Specific Diagnostics
+# -------------------------------------------------------------------
+# -------------------------------------------------------------------
+# 	var.imp[ ,1]
+#		a vector of all the variable importances measured as the empirical
+#		improvement in the splitting criterion. Importances are in the
+#		same order as the columns in X (design matrix).
+#		See above notes for more info.
+# 	var.imp[ ,2]
+#		variable importance weighted by height in tree
+# 	var.imp[ ,3]
+#		variable importance weighted by support - number of data pts affected by
+#          split. I need to look at code
+#
+#	leaf.count = # of terminal leafs
+# 	ave.leaf.obs = average number of observations per leaf
+# 	min.leaf.obs = minimum number of observation in leaf
+# 					(this value is controled by min.bucket too!)
+#
+# -------------------------------------------------------------------
+rpart.ensemble.diagnostics <- function(
+        filename, 
+	ensemble.par.list,
+        X,
+        ensemble.index=NULL){
+# -------------------------------------------------------------------
+
+   # ---------------------------------------------------------
+   # Inits
+   # ---------------------------------------------------------
+
+   bs.trials <- ensemble.par.list$n.ensemble.models
+   # -------------------------------------------------------------------
+   #    ** I can pull out the number of predictors
+   #    used in the rpart ensemble from the files that
+   #    are saved. Then I can remove X.train from the parameter list
+   # -------------------------------------------------------------------
+    # Results
+    # ----------
+    var.imp1 <- matrix(0,NCOL(X), bs.trials)
+    var.imp2 <- matrix(0,NCOL(X), bs.trials)
+    var.imp3 <- matrix(0,NCOL(X), bs.trials)
+    leaf.count <- rep(0,bs.trials)
+    ave.leaf.obs  <- rep(0,bs.trials)
+    min.leaf.obs  <- rep(0,bs.trials)
+    # ----------------------------------------------------------
+    # Load First Ensemble Model
+    # -----------------------------------------------------------
+    iii <- 1
+    num.txt <- formatC(iii,format="fg", width=6)
+    num.txt <- chartr(" ","0",num.txt)
+    temp.filename <- paste(filename,".",num.txt,".RData",sep="")
+    load( file=temp.filename)
+    # Save ensemble rpart.object stub
+    ttt.rpart <- f.rpart
+    if (is.null(ensemble.index)) ensemble.index <- 1:bs.trials
+    # ----------------------------------------------------------
+    # Loop over Ensemble.Index
+    #       KISS - but not the most efficient programming
+    # -----------------------------------------------------------
+    for (iii in 1:length(ensemble.index)){
+        # ----------------------------------------------------------
+        # Load/Construct rpart.object
+        # -----------------------------------------------------------
+        f.rpart <- ttt.rpart
+        if (ensemble.index[iii]!=1){
+            num.txt <- formatC(ensemble.index[iii],format="fg", width=6)
+      	    num.txt <- chartr(" ","0",num.txt)
+            temp.filename <- paste(filename,".",num.txt,".RData",sep="")
+            load( file=temp.filename)  #rpart.parts
+            # Reassemble f.rpart from ttt.rpart stub
+            # ----------------------------
+            f.rpart$frame   <- rpart.parts$frame
+            f.rpart$where   <- rpart.parts$where
+            f.rpart$splits  <- rpart.parts$splits
+            f.rpart$cptable <- rpart.parts$cptable
+            if (sum(names(rpart.parts) == "csplit") > 0)
+              f.rpart$csplit <- rpart.parts$csplit
+        }
+	# -------------------------------------------------------------------
+ 	# DT-rpart Specific Variable Importance Measures
+	# -------------------------------------------------------------------
+	# Split Variables = row.names(d.rpart$split)
+	# Empirical Improvement = Change in Deviance= d.rpart$split[,3]
+	# var.imp is a vector of all the variable importances in the
+	# same order as the columns in X (design matrix)
+	# -------------------------------------------------------------------
+	# sort out info about leaf nodes (I just want splits!)
+	dnodes <- f.rpart$frame[ f.rpart$frame[ ,1] != "<leaf>", ]
+	ncompete <- dnodes[,7]
+	nsurrogate <- dnodes[,8]
+	nsupport <- dnodes[, 2]  # no. of pts affected by split
+	nheight <- as.numeric(row.names(dnodes)) # height in pascal's triange
+	nheight <- floor(log2(nheight)) + 1
+	split.index <- 1 # initialize split index
+	# variable look-up table
+	var.table <- data.frame(pos=seq(1:NCOL(X)), varname=names(X))
+	# add "<leaf>" level to var.table$varname so that var.index works
+	levels(var.table$varname) <- c(levels(var.table$varname),"<leaf>")
+	if (!is.null(f.rpart$split)){
+  	   # Loop through all splits (rows)
+  	   for (ii in 1:NROW(dnodes)){
+  	       # ID split predictor
+               # --------------------------------------------------
+               # Summer & Fall 2007
+               # Generating error number of levels in the factor is different
+               # But I not understand exactly when this error is generated
+               # so I dont  know why it occurrs!
+               # ---------------------------------------------------
+  		
+  		var.index <- var.table[as.character(dnodes[ii,1]) == as.character(var.table$varname) , 1]
+  		# extract & store improvement in empirical purity from split frame
+  		# Use twice emprical improvement to get actual deviance for entropy splitting rule
+  		var.imp1[var.index,iii] <- var.imp1[var.index,1] + 2*f.rpart$split[split.index,3]
+  		# update current row index in d.rpart$split
+  		split.index <- split.index + ncompete[ii] + nsurrogate[ii]+1
+  		# variable importance weighted by height in tree
+  		var.imp2[var.index,iii] <- var.imp2[var.index,2] + nheight[ii]
+  		# variable importance weighted by support
+  		var.imp3[var.index,iii] <- var.imp3[var.index,3] + nsupport[ii]
+  	     } #endfor ii
+       } #end if is.null
+	
+
+       # ----------------------------------------------------------
+       # 10.2.07
+       # I need information on ensemble trees to understand laplacian
+       # smoothing.
+       #	leaf.count = # of terminal leafs
+       # 	ave.leaf.obs = average number of observations per leaf
+       # 	min.leaf.obs = minimum number of observation in leaf
+       # 					(this value is controled by min.bucket too!)
+       # ----------------------------------------------------------
+       is.leaf.ind <- (f.rpart$frame$var == "<leaf>")
+       leaf.count[iii] <- sum(is.leaf.ind)
+       ave.leaf.obs[iii] <- mean(f.rpart$frame$n[is.leaf.ind])
+       min.leaf.obs[iii] <- min(f.rpart$frame$n[is.leaf.ind])
+       # -------------------------------------------------------------------
+    } #end ensemble.index
+
+    # ----------------------------------------------------------
+    # Return Prediction Matrix
+    # -----------------------------------------------------------
+    return.list <- list(var.imp1 = var.imp1,
+            	   	var.imp2 = var.imp2,
+            		var.imp3 = var.imp3,
+            		leaf.count = leaf.count,
+            		ave.leaf.obs = ave.leaf.obs,
+            		min.leaf.obs=min.leaf.obs)
+    return(return.list)
+# ---------------------------------------------------------
+}# End FUNCTION
+# ---------------------------------------------------------
+
+
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+# Variable Importance Barplot
+# -----------------------------------------------------------------------------
+# Daniel Fink
+#
+#
+# Description
+# -----------------
+# This function ....
+# I need to describe what the measure of relative variable importance
+# is and how it is aggregated over the ensemble.
+# * key assumptions
+# * uses, strengths & weaknesses
+#
+#
+# Input
+# ----------
+#	 vi = (n x 1) numeric vector of VI point estimates
+#       where n is the number of Variables
+#       barplot
+#  vi.mat = ( n x bs.trials) numeric matrix of VI estimates
+#           one set of estimates per column.
+#           Variabliltiy in estimates plotted with boxplot
+# 	 plot.it=FALSE
+#
+# Output
+# ----------
+# A plot may be produced or the predictive performances for train & test
+# returned.
+#
+# Notes:
+# ---------
+#
+# Further Development:
+# ----------------------------
+# ** common parameter names and calling proceedures for
+# 	all functions
+# ** return variable importances and names as data.frame
+# -----------------------------------------------------------------------------
+plot.vi.bdt <- function(
+	vi=NULL,
+        vi.mat=NULL,
+        predictor.names,
+	max.vars = 25,
+	file.name = NULL,
+        plot.width = 600,
+        plot.height = 800 ){
+	# --------------------------------------------------------------
+	# VI Point Estimate Plot
+	# --------------------------------------------------------------
+	if (!is.null(vi)) {
+    	   # --------------------------------------------------------------
+    	   # Assemble Scaled VI & Names
+    	   # ---------------------------------------------------------------
+    	   ttt <- data.frame(Predictor = predictor.names, Deviance = vi/sum(vi)*100)
+    	   # Re-order ttt in terms of descending Deviance
+    	   ttt.ind <- order(ttt[,2],decreasing=TRUE)
+    	   ttt <- ttt[ttt.ind, ]
+    	   ttt$Predictor <- as.character(ttt$Predictor)
+    	   # ---------------------------------------------------
+    	   # Save image to disk
+    	   # ---------------------------------------------------
+    	   if (!is.null(file.name)) {
+      	      png(file=file.name, 
+              	  bg="white",
+            	  width=plot.width,
+    	    	  height=plot.height) 
+    	   }
+    
+	  # ---------------------------------------------------
+    	  # Barplot
+    	  # ---------------------------------------------------
+    	  xmax <- max(ttt$Deviance)	# scale max bar length
+    	  x.stretch <- 1.4		# scale max bar length
+    	  nbars <- max.vars		# number of bars to plot
+    	  bar.length <- ttt$Deviance
+    	  bar.names <- ttt$Predictor
+    	  tcol <- rainbow(nbars, start = 3/6, end = 4/6)
+    	  tcol <- tcol[nbars:1]   # reorder from dark to light colors
+    	  barplot(bar.length[1:nbars],
+		  horiz=TRUE,
+    		  xlim=c(0,(xmax*x.stretch)),
+    		  xlab="Relative Importance",
+   		  col = tcol,
+    		  axes=F)
+    	  axis(1)
+    	  for (ii in 1:nbars) {
+    	      text( bar.length[ii] + 1, 
+              	    1.2*(ii-1) + .75,
+    	      	    as.character(bar.names[ii]), 
+	      	    cex=0.75, 
+	      	    pos=4)
+    	  }
+    	  title(main="Ensemble Averages")
+    	  # ---------------------------------------------------
+    	  # Save image to disk
+    	  # ---------------------------------------------------
+    	  if (!is.null(file.name)) dev.off()
+      }
+
+      # --------------------------------------------------------------
+      # VI Estimates BoxPlot
+      # --------------------------------------------------------------
+      if (!is.null(vi.mat)) {
+      	 mean.vi <- apply(vi.mat, 1, mean)
+  	 mean.index <- order(mean.vi, decreasing=TRUE)
+  	 mean.vi <- mean.vi[mean.index]
+  	 vi.mat <- vi.mat[mean.index,]/sum(mean.vi)*100
+  	 mean.vi <- mean.vi/sum(mean.vi)*100
+  	 predictor.names <- predictor.names[mean.index]
+  	 # --------------------
+  	 nbars <- max.vars
+  	 mean.vi <- mean.vi[c(1:nbars)]
+  	 predictor.names <- predictor.names[c(1:nbars)]
+  	 vi.mat <- vi.mat[c(1:nbars), ]
+  	 ttt.stack <- stack(data.frame(vi.mat))
+  	 ttt.stack <- data.frame(ttt.stack, var=c(1:nbars))
+  	 # --------------------
+ 	 xmax <- max(ttt.stack[,1])		# scale max bar length
+	 x.stretch <- 1.3				# scale max bar length
+	 bar.length <- mean.vi
+	 bar.names <- predictor.names
+	 tcol <- rainbow(nbars, start = 3/6, end = 4/6)
+	 tcol <- tcol[nbars:1]   # reorder from dark to light colors
+	 # ---------------------------------------------------
+	 # Save image to disk
+	 # ---------------------------------------------------
+	 if (!is.null(file.name)) {
+		png(file=file.name, bg="white",
+			width=plot.width,
+			height=plot.height) 
+	 }
+
+	 # --------------
+
+	 boxplot(-values ~ as.factor(var),
+			data = ttt.stack,
+			horizontal=TRUE,
+			outline=FALSE,
+			#xlim=c(0,(nbars)),
+			ylim=c(-(xmax*x.stretch),(.5*xmax)),
+			xlab="Relative Importance",
+			col = tcol,
+			axes=F)
+	 axis(1)
+	 for (ii in 1:nbars) {  #bar.length[ii]
+			#text( ttt.stack$values[ii] + 1, 1.2*(ii-1) + .75,
+			text( 0.5 , 1.*(ii-1) + 1,
+			       as.character(bar.names[ii]), cex=1.0, pos=4)
+	 }
+	 title(main="Ensemble BoxPlot")
+         # ------------
+    	 # ---------------------------------------------------
+    	 # Save image to disk
+    	 # ---------------------------------------------------
+      	 if (!is.null(file.name)) dev.off()
+      } # end vi.mat
+} # end function
+
+
+# -------------------------------------------------------------------
+# create.pd.grid - Function to Create List of Prediction Grid(s)
+# -------------------------------------------------------------------
+# based on plot.gbm!
+# Input
+# 	XX - DTM Design matrix
+#		arguments that are lists
+#		# --------------------------
+#	i.var.list = list of i.var vectors
+# 		for now- these two arguments must be scalars
+#	continuous.resolution = list/vector of cont.resolutions
+#
+# Output
+#  	for each of member of the list, the following objects will be
+# 	produced:
+#	pd.grids
+#
+# Notes:
+# -------
+# There may be times when we actually want to see what the
+# predictions are for NA's - I have left this out, as an extra item.
+# I need to document how I am handling NA's.
+# -------------------------------------------------------------------
+# ---------------------------------------------------------------------
+create.pd.grid <- function(XX,
+			   i.var.list,
+			   continuous.resolution,
+			   na.flag=NULL) {
+   # Cycle through elements of list
+   # --------------------------------
+   pd.grids <- vector(mode="list", length=length(i.var.list))
+   for (iii in 1:length(i.var.list)){
+	i.var <- i.var.list[[iii]]
+
+ 	# --------------------------------------------
+ 	# Check User Input
+ 	# --------------------------------------------
+ 	 if (all(is.character(i.var))) {
+        i <- match(i.var, names(XX))
+        if (any(is.na(i))) {
+            stop("i.var.list contains variables that are not used in model",
+                i.var[is.na(i)])
+        }
+        else {
+            i.var <- i
+        }
+   }
+
+   if ((min(i.var) < 1) || (max(i.var) > length(names(XX)))) {
+        warning("i.var must be between 1 and ", length(names(XX)))
+   }
+
+
+   # --------------------------------------------
+   # Create Prediction Grid
+   # --------------------------------------------
+   # vector produces a vector of the given length and mode.
+   grid.levels <- vector(mode="list", length=length(i.var))
+   for (i in 1:length(i.var)) {
+       X.vars <- XX[ ,i.var[i]]
+       # Check for missing values flag other than "NA"
+       # (for ex. I do not want RF 9e30 flag to affect the
+       # quantile calculations below
+       # ----------------------------------------------
+       if (!is.null(na.flag)){
+       	  na.ind <- (X.vars == na.flag)
+	  # replace with NA's
+	  X.vars[na.ind] <- NA
+       }
+
+       # ----------------------
+       # Integer Predictors
+       # ----------------------
+       # continuous resolution - use minimum of either
+       #  	the range of integers or continuous.resolution
+       if (is.integer(X.vars)) {
+       	  cont.res <- min((max(X.vars,na.rm=TRUE) - min(X.vars,na.rm=TRUE) + 1), continuous.resolution)
+	  grid.levels[[i]] <- seq(min(X.vars,na.rm=TRUE), max(X.vars,na.rm=TRUE), length = cont.res)
+	  grid.levels[[i]] <- sort(unique(grid.levels[[i]]))
+       }
+       # ----------------------
+       # Double Predictors
+       # ----------------------
+       if (is.double(X.vars)) {
+            # Sequential Grid
+	    # grid.levels[[i]] <- seq(min(XX[ ,i.var[i]],na.rm=TRUE),
+            #    					max(XX[ ,i.var[i]],na.rm=TRUE),
+            #   						length = continuous.resolution)
+	    # Grid at Equi-spaced Quantiles
+	    prob.seq <- seq(from=0, to=1, length= (continuous.resolution+2))
+	    # Remove the endpoints of this sequence
+	    prob.seq <- prob.seq[2:(continuous.resolution+1)]
+	    grid.levels[[i]] <- quantile(X.vars, probs = prob.seq, na.rm = TRUE)
+	    grid.levels[[i]] <- sort(unique(grid.levels[[i]]))
+    	} #end double
+        # ----------------------
+	# Factors: code levels numerically
+	# ----------------------
+ 	if (is.factor(X.vars)) {
+	   # What happens with missing values here?
+           grid.levels[[i]] <- sort(unique(as.numeric(X.vars) ))
+       	} # end factor
+     } #end for i: Making grid.levels
+     # ----------------------
+     pd.grid <- expand.grid(grid.levels)
+     names(pd.grid) <- names(XX)[i.var]
+     # ----------------------------------------
+     pd.grids[[iii]] <- pd.grid
+   } # end for i.var.lists
+
+   return(pd.grids)
+} # end function
+
+
+
+# -------------------------------------------------------------------
+# Predict.pd.grid - Function to make Predictions over PD.grids
+# -------------------------------------------------------------------
+# Input
+# 	XX = DTM Design matrix
+#	pd.quant.grids = create.pd.grid obejct
+# 	nn.sample = # of randomly selected samples from XX
+# Output
+#  	list of predictions for each member of the create.pd.grid.object
+#
+#
+#
+# TO DO: 
+# --------------------------------
+# 1) 	Add key parameters to output object!!!
+#		partial.dependence.list,
+#		continuous.resolution = 15,
+#		nn.sample = 500
+#
+# 2)	Need to Recode Categorical predictors
+# eg. if BCR was a predictor we would need to recode it 
+# to its proper level labels !!!!!
+# Currently, BCR is coded as the number of the LEVEL
+# xxx.grid[,2] <- levels(train.data$X$BCR)[xxx.grid[,2]]
+#
+#
+# HPM Use:
+# 	HPM will need to store and accululate these predictions or
+# 	lists of predictions for plotting.
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+ensemble.partial.dependence <- function(filename,
+	                                ensemble.par.list,
+	                                XX,
+	                                partial.dependence.list,
+	                                continuous.resolution = 15,
+	                                nn.sample = 500) { 
+   # ------------------------------------------------------------------------------------------------------
+   # Inits Formal Parameters
+   # ------------------------------------------------------------------------------------------------------
+   # Results
+   pd.means <- vector(mode="list", length=length(partial.dependence.list))
+   pd.matrices <- vector(mode="list", length=length(partial.dependence.list))
+   # ------------------------------------------------------------------------------------------------------
+   # Compute Partial Dependence Quantile Grids
+   # ------------------------------------------------------------------------------------------------------
+   pd.quant.grids <- create.pd.grid(XX=XX,
+				    i.var.list=partial.dependence.list,
+				    continuous.resolution = continuous.resolution)
+   # ------------------------------------------------------------------------------------------------------
+   # Check Function input
+   # ------------------------------------------------------------------------------------------------------
+   if (nn.sample > NROW(XX)) {
+      nn.sample <- NROW(XX)
+   }
+   # ------------------------------------------------------------------------------------------------------
+   # Random Sample of Data Rows (same sample for all PD elements)
+   # ------------------------------------------------------------------------------------------------------
+   # Sample without replacement from data rows
+   if (nn.sample == NROW(XX)) sample.index <- c(1:NROW(XX))
+   if (nn.sample < NROW(XX)) sample.index <- sample(1:NROW(XX), nn.sample, replace = FALSE)
+
+   # ------------------------------------------------------------------------------------------------------
+   # Find factors in XX
+   # 	Note : I can not use apply b/c XX is class data.frame
+   # ------------------------------------------------------------------------------------------------------
+   XX.factor.ind <- rep(FALSE, NCOL(XX))
+   ttt <- XX[1,] # it is much faster to search a 1D data.frame!
+   for (ii in 1:NCOL(XX)) XX.factor.ind[ii] <- is.factor(ttt[,ii])
+	
+   # Extract an index of column positions for factors (wo zeros!)
+   factor.index <- as.numeric(XX.factor.ind)*seq(1,NCOL(XX))
+   factor.index <- factor.index[factor.index > 0 ]
+   # ------------------------------------------------------------------------------------------------------
+   # Loop Over PD list elements
+   # ------------------------------------------------------------------------------------------------------
+   for (iii in 1:length(pd.quant.grids)){
+	# ------------------------------------
+	# 1. Expand Quantile Grid into PD Prediction Design
+	# 2. BDT Predictions
+	# 3. Assemble Results
+	# ------------------------------------
+	i.var <- match( names(pd.quant.grids[[iii]]), names(XX))
+	XX.sample <- XX[sample.index, setdiff(names(XX), names(XX)[i.var]) ]
+	pd.grid <- pd.quant.grids[[iii]]
+	# ----------------------------
+	# NOTE** The size of the PD design = nn.sample * length(pd.grid)
+	# If this too large, there should be a loop here that can
+	# break this computation into pieces by breaking up
+	# nn.sample
+	# ----------------------------
+	# ------------------------------------------------------------------------------------------------------
+	# Construct Partial Dependence Prediction Data Frame
+	# 	NOTE: the use of data.matrix converts factors to numerics
+	# ------------------------------------------------------------------------------------------------------
+	# Stack Randomly Sampled Data Rows
+	XX.stack <- kronecker( matrix(1, NROW(pd.grid), 1), data.matrix(XX.sample))
+	XX.stack <- as.data.frame(XX.stack)
+	names(XX.stack) <- names(XX.sample)
+	# Stack Partial Dependence Grids
+	pd.stack <- kronecker( data.matrix(pd.grid), matrix(1, nn.sample, 1))
+	pd.stack <- as.data.frame(pd.stack)
+	names(pd.stack) <- names(pd.grid)
+	PD.prediction.frame <- cbind(pd.stack,XX.stack)
+	# ------------------------------------------------------------------------------------------------------
+	# Reconstruct Factor structure for data.frame
+	# ------------------------------------------------------------------------------------------------------
+	# XX = original data frame that may include factors
+	# PD.prediction.frame = the data.frame currently with numeric
+	#	values for all predictors. The prediction data.frame needs
+	#	to have the same column/predictor structure as XX
+	# ------------------------------------------------
+	# 1) Reorder PD.prediction.frame to match XX
+	col.order <- match( names(XX), names(PD.prediction.frame))
+	PD.prediction.frame <- PD.prediction.frame[,col.order]
+	# 2) Convert PD.prediction.frame cols to factors
+	for (i in factor.index) {
+	    PD.prediction.frame[,i] <- factor(levels(XX[,i])[PD.prediction.frame[,i]], levels=levels(XX[,i]))
+	}
+	# ------------------------------------------------------------------------------------------------------
+	# Ensemble PD Predictions
+	# ------------------------------------------------------------------------------------------------------
+
+	ttt.pred <- ensemble.par.list$predict.ensemble.function(
+		filename = filename,
+		ensemble.par.list = ensemble.par.list, 
+		prediction.design= PD.prediction.frame) 		    
+		# BDT ensemble mean predictions
+	pred.X <- ttt.pred$mean
+	pred.X.matrix <- ttt.pred$matrix
+	rm(ttt.pred)
+	# -----------------------------
+	# PD Design Loop would (somewhere?) end here, I think, hmmm
+	# -----------------------------
+	# --------------------------------------------
+	# Ensemble Matrix PD estimates
+	# --------------------------------------------
+	pdf.grid.matrix <- NULL
+	pred.index <- (rep(c(1:NROW(pd.grid)),each=nn.sample))
+	for (jjj in 1:NCOL(pred.X.matrix)){
+		pdf.grid.matrix <- cbind(pdf.grid.matrix, tapply(pred.X.matrix[,jjj], pred.index, mean,na.rm=T))
+	}
+	rm(pred.X.matrix)
+	# --------------------------------------------
+	# Average to get Ensemble average PD estimates
+	# --------------------------------------------
+	pred.index <- (rep(c(1:NROW(pd.grid)), each=nn.sample))
+ 	ppp <- tapply(pred.X, pred.index, mean,na.rm=T)
+ 	# recode pd.grid factors
+	f.factor <- rep(FALSE, NCOL(pd.grid))
+	for (i in 1:NCOL(pd.grid)) {
+		col.index <- match( names(pd.grid)[i], names(XX))
+		if (!is.numeric( XX[,col.index] )) {
+		   f.factor[i] <- TRUE
+		   pd.grid[,i] <- factor(levels(XX[,col.index])[pd.grid[,i]], levels=levels(XX[,col.index]))
+		}
+	} #end for i 
+	# Reassociate pd.grid with predictions
+	pdf.grid <- data.frame(pd.grid, pred=ppp)
+
+	# -----------------------------------
+	# Store results in PD.list
+	# -----------------------------------
+	# pd.means = the Partial Dependence Estimate averaged over bags
+	# pd.matrices = the PD estimates, one col per bag/model
+  	pd.means[[iii]] <- pdf.grid
+  	pd.matrices[[iii]] <- pdf.grid.matrix
+	#names(pdf.grid)
+	#dim(pdf.grid)
+   } # end iii
+
+   return(list(pd.quant.grids=pd.quant.grids, pd.means=pd.means, pd.matrices=pd.matrices))
+} # end function
+
+# ---------------------------------------------------------
+# Summary (TEXT) Function
+# ---------------------------------------------------------
+summarize.ensemble <- function(model.filename,
+              ensemble.par.list,
+              train.data,
+              test.data=NULL,
+              diag.bdt = NULL,
+              oob.pred = NULL,
+              train.pred = NULL,
+              test.pred = NULL){
+   # ---------------------------------------------------------
+   # Inits
+   # ---------------------------------------------------------
+   temp.filename <- paste(model.filename,".ensemble.index.RData",sep="")
+   load(file=temp.filename) #return.list
+   bs.trials <- ensemble.par.list$n.ensemble.models
+   resp.family <-  return.list$resp.family
+   # ---------------------------------------------------------
+   cat(" -------------------------------------\n")
+   cat(" Bagged Decision Trees \n")
+   cat(" -------------------------------------\n")
+   cat("   Model Name: ", model.filename , "\n")
+   cat("   Response type = ", resp.family , "\n")
+   cat("   Number of Predictors = ", NCOL(train.data$X) , "\n")
+   cat("   Training sample size = ", NROW(train.data$X) , "\n")
+   cat(" -------------------------------------\n")
+   cat(" Ensemble   \n")
+   cat(" -------------------------------------\n")
+   cat("   ensemble size  = ", bs.trials,"\n")
+   cat("   Ensemble parameters: \n")
+   for (iii in 2:length(ensemble.par.list)){
+      cat( "      ",names(ensemble.par.list)[iii],"\n")
+   }
+   # ----------------------------------------------------
+   # Ensemble size stats
+   # ----------------------------------------------------
+   if (!is.null(diag.bdt)) {
+        cat("   Average # leaves per tree =",
+              mean(diag.bdt$leaf.count) ,"\n")
+        cat("   Average # obs per leaf =",
+              mean(diag.bdt$ave.leaf.obs) ,"\n")
+        cat("   Minimum # obs per leaf =",
+              mean(diag.bdt$min.leaf.obs) ,"\n")
+   }
+   # -----------------------------------------
+   pp <- NULL
+   pp.names <- NULL
+   # -----------------------------------------
+   if (resp.family == "gaussian" | resp.family == "poisson"){
+      if (!is.null(train.pred)) {
+      # -------------------
+      ttt.ind <- (!is.na(train.pred$mean)) 
+      ttt <- predictive.performance(
+            obs=train.data$y[ttt.ind],
+            ppp=train.pred$mean[ttt.ind],
+            resp.family=resp.family )
+      pp  <- cbind(pp, ttt)
+      pp.names <- rbind(pp.names, "Training")
+      }
+      # -----------------
+      if (!is.null(oob.pred)) {
+      ttt.ind <- (oob.pred$count > 0 & !is.na(oob.pred$mean)) 
+      ttt <- predictive.performance(
+            obs=train.data$y[ttt.ind],
+            ppp=oob.pred$mean[ttt.ind],
+            resp.family=resp.family)
+      pp  <- cbind(pp, ttt)
+      pp.names <- rbind(pp.names, "OOB")
+      }
+      # ----------------
+      if (!is.null(test.pred)){
+	 ttt.ind <- (!is.na(test.pred$mean)) 
+          ttt <- predictive.performance(
+                      obs=test.data$y[ttt.ind],
+                      ppp=test.pred$mean[ttt.ind],
+                      resp.family=resp.family)
+      pp  <- cbind(pp, ttt)
+      pp.names <- rbind(pp.names, "Test")
+      }
+      if (!is.null(pp)) pp <- data.frame(pp)
+      # -----------------
+   } # end if gaussian or poisson
+   # ----------------------------------------
+   if (resp.family == "bernoulli"){
+      if (!is.null(train.pred)) {
+      # -------------------
+      ttt.ind <- (!is.na(train.pred$mean)) 
+      ttt <- predictive.performance(
+            obs=train.data$y[ttt.ind],
+            ppp=train.pred$mean[ttt.ind],
+            resp.family=resp.family )
+      pp  <- cbind(pp, c(ttt$acc, ttt$rmse, ttt$auc))
+      pp.names <- rbind(pp.names, "Training")
+      }
+      # -----------------
+      if (!is.null(oob.pred)) {
+      ttt.ind <- (oob.pred$count > 0 & !is.na(oob.pred$mean)) 
+      ttt <- predictive.performance(
+            obs=train.data$y[ttt.ind],
+            ppp=oob.pred$mean[ttt.ind],
+            resp.family=resp.family)
+     pp  <- cbind(pp, c(ttt$acc, ttt$rmse, ttt$auc))
+      pp.names <- rbind(pp.names, "OOB")
+      }
+      # ----------------
+      if (!is.null(test.pred)){
+	 ttt.ind <- (!is.na(test.pred$mean)) 
+          ttt <- predictive.performance(
+                      obs=test.data$y[ttt.ind],
+                      ppp=test.pred$mean[ttt.ind],
+                      resp.family=resp.family)
+        pp  <- cbind(pp, c(ttt$acc, ttt$rmse, ttt$auc))
+      pp.names <- rbind(pp.names, "Test")
+      }
+      if (!is.null(pp)) pp <- data.frame(pp)
+      # -----------------
+      rownames(pp) <- c("Accuracy", "RMSE", "AUC")
+   } # end if bernoulli 
+  
+   cat(" -------------------------------------\n")
+   cat(" Predictive Performance   \n")
+   cat(" -------------------------------------\n")
+   n.row <- NROW(pp)
+   n.col <- NCOL(pp)
+   for (ii in 1:n.col){
+      cat( "      ",pp.names[ii]," ")
+   }
+   cat("\n")
+     
+   for (ii in 1:n.row){
+       cat("   ", rownames(pp)[ii], "  ")
+       for (jj in 1:n.col) {
+       	   cat( as.character(format(pp[ii,jj], digits=5)),"   ")
+       }
+       cat("\n")
+   }
+   # ----------------------------------------------------
+   # Relative Variable Importance -
+   # ----------------------------------------------------
+   if (!is.null(diag.bdt)) {
+      cat(" ---------------------------------------------------------------------\n")
+      cat("  Relative Variable Importance - Top 10    \n")
+      cat(" ---------------------------------------------------------------------\n")
+      # Re-order ttt in terms of descending Deviance
+      ttt <- data.frame(Predictor = c(names(train.data$X)), Deviance = diag.bdt$var.imp1/sum(diag.bdt$var.imp1)*100 )
+      ttt.ind <- order(ttt[,2],decreasing=TRUE)
+      ttt <- ttt[ttt.ind, ]
+      ttt$Predictor <- as.character(ttt$Predictor)
+      for (iii in 1:10) cat("    ", iii, "  ",ttt[iii, 2],"   ", ttt[iii, 1], "\n")
+      cat(" ---------------------------------------------------------------------\n")
+      cat("\n")
+      cat("\n")
+   }
+}# end summary function
+
+
+# -----------------------------------------------------------------------------------------------------------
+# -----------------------------------------------------------------------------------------------------------
+# Predictive Performance Functions
+# 10.23.08
+#
+# Compute predictive Performance measures. The basic idea is to
+# measure the average distance between observation & prediction.
+#  		ave (distance(obs - pred))
+# Methods vary according to the family of the response, how the
+# averaging is performed and how distance is measured.
+#
+# ** Assumed that there are no NA's in either obs or predicted.
+#
+# Input:
+# ---------
+# 	obs = observed response
+# 	ppp = corresponding predicted response (on response scale!)
+# 	family = family or name of response type
+#
+# Output:
+# ---------
+# 	Family = "bernoulli" == binary (numerical? logical?)
+# 	------------------------------------------------
+# 	Family = "gaussian" == numerical
+# 	------------------------------------------------
+# 	Family = "poisson" == counts
+# 	------------------------------------------------
+#	**  I am no longer computing Pearson's Chi-Squared measure
+# 	because the predictions in the denominator make is very
+# 	unstable when there are lots of small predictions.
+#	(for the relative abundance analyses)
+#	          p <- sum( ((yyy - ppp)^2)/(ppp) )
+# 	** Deviance Calculations
+#
+# Demo Code:
+# -----------
+#	yyy <- p.data$yp
+#	ppp <- (d.dtm$pred.Xp)^2  #Untransformed
+#	res <- residuals.dtm(obs = yyy,
+#					ppp = ppp,
+#					family="poisson")
+#
+# Needed:
+# --------------------
+# * More documentation
+# * Example showing ROC curve using pred.obj (ROCR library help(performance))
+# * Add gaussian & binary deviance functions & measures
+# * erorr checking for different types of binary obs & pred
+#
+# -----------------------------------------------------------------------------------------------------------
+# -----------------------------------------------------------------------------------------------------------
+predictive.performance <- function(obs, ppp, resp.family) {
+	if (resp.family=="poisson"){
+		# ----------------------------------
+		MSE <- mean((ppp - obs)^2)
+		R2 <- 1 - mean((ppp - obs)^2)/mean((mean(obs) - obs)^2)
+		MSE.sqrt <- mean((sqrt(ppp) - sqrt(obs))^2)
+		R2.sqrt <- 1 - mean((sqrt(ppp) - sqrt(obs))^2)/
+					mean((mean(sqrt(obs)) - sqrt(obs))^2)
+		MAD <- mean(abs(ppp - obs))
+		rho <- cor(obs,ppp)
+		rho.sqrt <- cor(sqrt(obs),sqrt(ppp))
+		# ----------------------------
+		# Poisson Deviance can not have zero predictions
+		# Substitute predicted zero's with small values
+		# ------------------------------------
+			epsilon <- 1e-8
+			ppp[ppp == 0] <- epsilon
+		# ---------------------------------------------------------
+		null.deviance <- poisson.deviance(
+						yyy=obs,
+						ppp=rep(mean(obs),length(obs) ))
+		obs.deviance <- poisson.deviance(
+						yyy=obs,
+						ppp=ppp)
+		deviance.explained <- (null.deviance - obs.deviance)/null.deviance
+		# ----------------------------------
+		return(list(
+			MSE = MSE,
+			R2=R2,
+			MSE.sqrt = MSE.sqrt,
+			R2.sqrt=R2.sqrt,
+			MAD=MAD,
+			rho=rho,
+			rho.sqrt=rho.sqrt,
+			deviance.explained=deviance.explained,
+			obs.deviance=obs.deviance,
+			null.deviance=null.deviance))
+		}
+
+	if (resp.family=="bernoulli"){
+		acc <- 1 - sum(abs(obs-ppp))/length(ppp)
+		require(ROCR)
+		pred.obj <- prediction(prediction=ppp, labels=as.numeric(obs))
+		perf <- performance(pred.obj, "auc")
+		auc <- perf at y.values[[1]][1]
+		perf <- performance(pred.obj, "rmse")
+		rmse <- perf at y.values[[1]][1]
+		return(list(
+			acc=acc,
+			rmse = rmse,
+			auc = auc,
+			pred.obj = pred.obj))
+		}
+	if (resp.family=="gaussian"){
+		# ----------------------------------
+		MSE <- mean((ppp - obs)^2)
+		R2 <- 1 - mean((ppp - obs)^2)/mean((mean(obs) - obs)^2)
+		MAD <- mean(abs(ppp - obs))
+		rho <- cor(obs,ppp)
+		# ----------------------------
+		return(list(
+			MSE = MSE,
+			R2=R2,
+			MAD=MAD,
+			rho=rho))
+		}
+}
+# -----------------------------------------------------------------------------------------------------------
+# -----------------------------------------------------------------------------------------------------------
+
+
+# -----------------------------------------------------------------------------------------------------------
+# Poisson Predictive Performance Measures
+# -----------------------------------------------------------------------------------------------------------
+# yyy = observations
+# ppp = predicted value - response scale
+#
+# Verified - replicated GAM deviance calcuatlions for poisson
+# -----------------------------------------------------------------------------------------------------------
+poisson.deviance <- function(yyy,ppp){
+      # if predictions (ppp) equal zero we will get underflow
+      # problems from log function.
+      # -------------
+      # break deviance into two pieces - where obs == 0
+      ttt.zero <- (yyy == 0)
+      ttt.pos <- (yyy > 0)
+      dev1 <- sum( (yyy[ttt.zero] - ppp[ttt.zero]) )
+      dev2 <- sum( yyy[ttt.pos]*log(yyy[ttt.pos]/ppp[ttt.pos]) -
+                  (yyy[ttt.pos] - ppp[ttt.pos]))
+      dev <- 2*(dev2 - dev1)
+      return(dev)
+}
+# -----------------------------------------------------------------------------------------------------------
+# -----------------------------------------------------------------------------------------------------------
+
+
+# ------------------------------------------------------------------------
+# ------------------------------------------------------------------------
+# Random Train/Test Split
+# ------------------------
+# n = length of index
+# p.train = percentage for training
+#
+# This function simply returns two indices that partition
+# a set of n iterms into two mutually exclusive sets.
+#
+# Demo
+#ttt <- ttsplit(n=100, p.train=0.5)
+#length(ttt$train.index)
+#length(ttt$test.index)
+# ---------------------------------------------------
+ttsplit <- function(n, p.train){
+  train.index <- NULL
+  val.index <- NULL 
+  ttt.index <- 1:n
+  nnn.train <- round(n * p.train)
+  nnn.val <- n - nnn.train
+  if (nnn.train <= n)
+      train.index <- sample((1:n), nnn.train)
+  if (nnn.val > 0 ) {
+  	full.index <- c(1:n)
+  	val.index <- setdiff(full.index, train.index)
+  	val.index <- sample( val.index, min(nnn.val, length(val.index)))
+  	}
+  return(list(train.index=train.index, test.index=val.index))
+} # end function
+
+# ------------------------------------------------------------------------
+# ------------------------------------------------------------------------
+
+# ------------------------------------------------------------------------
+# ------------------------------------------------------------------------
+# Simple Unique Location Train/Test Splitting
+# 11.3.07
+#
+# Randomly select a unique set of locations for the train and
+# test sets. This function will collect all records for a given
+# location and assign them according to the train/test split.
+# This sampling design does NOT preserve the relative sampling
+# density across locations because there are no repeat locations
+# sampled.
+#
+# Input:
+# ---------
+#     locs - location data frame/matrix
+#     p.train - proportion of locations for training
+#     m.frac - fraction of multiple observations to include for
+#               each location
+#
+# Output:
+# ---------
+#   unique.index= unique loc index ( I believe that the
+#                 first instance for each repeated loc is indicated here)
+#   train.index.single & test.locs.single
+#                 index to one observation from a unique set of locations.
+#                 Train & test sets form a random partition of the locations
+#                 in the unique.index.
+#   train.locs.index & test.locs.index
+#                 Collect a fraction of available observations at each of
+#                 the randomly selected training locations. If there are repeat observations at
+#                 a unique location, then all of these observations will
+#                 be included in this set. Same for the test set.
+#
+# Demo Code:
+# -----------
+#  # Create Data with Repeat Obs at specific locations
+#  #nnn <- 10000
+#  #locs <- data.frame(x=rnorm(nnn), y=rnorm(nnn))
+#  locs <- cc.data$loc
+#  ddd <- unique.locs.splitting(locs, p.train=0.75, m.frac=0.5)
+#  length(ddd$train.locs.single)
+#  length(ddd$train.locs.multiple)
+#  length(ddd$test.locs.single)
+#  length(ddd$test.locs.multiple)
+#  # ----------------------------
+#  # Plot Map of Train/Test Sets
+#  # ----------------------------
+#  plot(locs$x[ddd$train.locs.single],
+#      locs$y[ddd$train.locs.single],
+#      xlab ="lon", ylab="lon",
+#      pch=24,
+#      col="red",
+#      cex=.5)
+#  points(locs$x[ddd$test.locs.single],
+#      locs$y[ddd$test.locs.single],
+#      col="blue",
+#      pch=25,
+#      cex=0.5)
+#  title(main="eBird Northern Cardinal Summer 2006", font.main = 4 )
+#  box(lwd=3.0)
+#  require(maps)
+#  require(mapdata)
+#  map('state',add=TRUE)
+# ------------------------------------------------------------------------
+# ------------------------------------------------------------------------
+unique.locs.splitting <- function(locs, p.train, m.frac=1.0){
+  # Extract unique locs as ttt
+  ttt <- unique(locs)
+  # 1) Randomly select proportion of unique locations
+  split.ind <- ttsplit(n=NROW(ttt), p.train=p.train)
+  train.index <- split.ind$train.index
+  test.index <- split.ind$test.index
+  # ----------------------
+  # 2) Process Test Set
+   test.locs.single <- NULL
+   test.locs.multiple <- NULL
+   for (iii in 1:length(test.index)){
+      temp.ind <- (locs$x == ttt$x[test.index[iii]]  &
+                   locs$y == ttt$y[test.index[iii]])
+      #Convert to index into locs for matches
+      temp.ind <- as.numeric(temp.ind) * c(1:NROW(locs))
+      temp.ind <- temp.ind[temp.ind > 0]
+      # Random Selection Single
+      temp.ind.single <-temp.ind[
+            sample(1:length(temp.ind), size=1, replace=FALSE) ]
+      test.locs.single<- c(test.locs.single, temp.ind.single)
+      # Random Selection Multiple
+      m.size <- max(1,round(m.frac*length(temp.ind)))
+      temp.ind.multiple <- temp.ind[
+            sample(1:length(temp.ind), size=m.size, replace=FALSE)]
+      test.locs.multiple <- c(test.locs.multiple, temp.ind.multiple)
+      }
+  # -------------------------
+  # 3) Process Train Set
+    train.locs.single <- NULL
+    train.locs.multiple <- NULL
+    for (iii in 1:length(train.index)){
+      temp.ind <- (locs$x == ttt$x[train.index[iii]]  &
+                   locs$y == ttt$y[train.index[iii]])
+      #Convert to index into locs for matches
+      temp.ind <- as.numeric(temp.ind) * c(1:NROW(locs))
+      temp.ind <- temp.ind[temp.ind > 0]
+      # Random Selection Single
+      temp.ind.single <-temp.ind[
+            sample(1:length(temp.ind), size=1, replace=FALSE) ]
+      train.locs.single<- c(train.locs.single, temp.ind.single)
+      # Random Selection Multiple
+      m.size <- max(1,round(m.frac*length(temp.ind)))
+      temp.ind.multiple <- temp.ind[
+            sample(1:length(temp.ind), size=m.size, replace=FALSE)]
+      train.locs.multiple <- c(train.locs.multiple, temp.ind.multiple)
+      }
+  # -------------------------
+  return(list(train.locs.single = train.locs.single,
+              train.locs.multiple = train.locs.multiple,
+              test.locs.single = test.locs.single,
+              test.locs.multiple = test.locs.multiple,
+              unique.index=as.numeric(rownames(ttt))
+              ))
+} # end function
+# ------------------------------------------------------------------------
+# ------------------------------------------------------------------------
+
+
+
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+# Loop Over 1 Grid Realization - Compute & Store Distribution 
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+# Create Train:Test sets with Unique Locations 
+# ----------------------------------------------------------------------
+#	dsplit <- unique.locs.splitting(locs=cc.data$loc,
+#			p.train=fraction.training.data,
+#			m.frac=1.0)
+#	train.index <- dsplit$train.locs.multiple
+#	test.index <- dsplit$test.locs.multiple
+# ---------------------------
+# Maximum Coverage Selection
+# for Train:Test Set
+# ---------------------------
+maximum.coverage.selection <- function(
+               locs, # data.frame(x , y) length n
+               jdates, # vector length n
+			#grid.parameters,
+	              grid.cell.min.lat,
+		  	    grid.cell.min.lon,
+			min.val.cell.locs,
+			fraction.training.data,
+			mfrac=1.0,
+			plot.it =FALSE ){
+# ----------------------------------------------------------------
+#		 RETURN:
+#			train.index <- 
+#			test.index <- 
+# -------------------------------------------------------------------
+# Formal test values
+#               locs=cc.data$locs  data.frame(x , y) length n
+#               jdates=cc.data$X$JDATE  vector length n
+#			grid.parameters,
+#	              grid.cell.min.lat=1.0
+#		  	    grid.cell.min.lon=1.5
+#			min.val.cell.locs=5
+#			fraction.training.data=0.8
+#			mfrac=1.0
+# ----------------------				
+	lon.min <- min(locs$x)
+	lon.max <- max(locs$x)
+	lat.min <- min(locs$y)
+	lat.max <- max(locs$y)
+
+	#for (iii.loop in 1:nnn.grids) { 
+	iii.loop <- 1
+	# 1) Randomize Coordinate for first grid cell boundary
+		r.lat <- runif(1,min=0, max=grid.cell.min.lat)
+		r.lon <- runif(1,min=0, max=grid.cell.min.lon)
+		# 2) lay down equally spaced grid until x.max reached
+		grid.ttt <- seq(from=(lon.min+r.lon),
+		               to=lon.max,
+			           by=grid.cell.min.lon)
+		grid.xxx <- c(lon.min, grid.ttt, lon.max)
+		grid.ttt <- seq(from=(lat.min+r.lat),
+		               to=lat.max,
+			           by=grid.cell.min.lat)
+		grid.yyy <- c(lat.min, grid.ttt, lat.max)
+		# incase of any duplicates!
+		grid.xxx <- sort(unique(grid.xxx))
+		grid.yyy <- sort(unique(grid.yyy))
+		# ---------------------------
+		# Sample Maximal Coverage Validation Data
+		# Then use the rest for Training
+		# ** Take up to the first min.val.cell.locs
+		# ** Then randomly select the rest, by unique loc
+		# ---------------------------
+		kkk <- 0 # counter for grid cell regions
+		nnn.grid.cells <- (length(grid.xxx)-1)*(length(grid.yyy)-1)
+		u.test.locs <- NULL 
+		# -----------------------------------------------------------------
+		# Cycle over Columns(xxx_iii) within Given Row (yyy_jjj)
+		# -----------------------------------------------------------------
+		for (jjj in 1:(length(grid.yyy)-1)){
+		for (iii in 1:(length(grid.xxx)-1)){
+			#iii <- 10
+			#jjj <- 20
+			
+			kkk <- kkk + 1
+			# --------------------------------
+			xxx <- locs$x
+			yyy <- locs$y
+			cell.index <- xxx >= grid.xxx[iii] & xxx < grid.xxx[iii+1] &
+					yyy >= grid.yyy[jjj] & yyy < grid.yyy[jjj+1]
+			# Check for minimum Prediction Cell Locations
+			# ---------------------------------------------
+			u.locs <- unique(data.frame(x=locs$x[cell.index],
+				  		y=locs$y[cell.index]))
+ 			sum(cell.index)
+ 			dim(u.locs)
+			 
+			 if (NROW(u.locs) <= min.val.cell.locs) {
+			   # Randomly Select first min.val.cell.locs
+			   u.test.locs <- rbind(u.test.locs,u.locs)
+			   }		
+			if (NROW(u.locs) > min.val.cell.locs) {
+			   # Randomly Select first min.val.cell.locs
+			   # Then Randomly split the rest
+			   # ---------------------------------
+			   ttt.ind <- sample(1:NROW(u.locs), size=min.val.cell.locs)
+			   u.test.locs <- rbind(u.test.locs,u.locs[ttt.ind,])
+			   u.locs <- u.locs[ (setdiff(1:NROW(u.locs),ttt.ind)) , ] 
+			   dsplit <- unique.locs.splitting(locs=u.locs,
+							p.train=fraction.training.data,
+							m.frac=1.0)
+			   u.test.locs <- rbind(u.test.locs, 
+			   			     u.locs[dsplit$test.locs.multiple,])
+			   }						  		
+		}}# end grid loop
+		# -----------------------------------------	
+		#  
+		# -----------------------------------------			
+		# Should be locs DF with all unique locs for valiation set
+		# Now, I need to divide data accordingly 
+		# ------------------------------	
+		test.index <- (locs$x %in% u.test.locs$x) & (locs$y %in% u.test.locs$y)
+		train.index <- !test.index		
+		# -------------------------
+		# Test Plot of Grid
+		# -------------------------
+		if ( plot.it == TRUE){
+			plot(1,1, 
+				xlim=c(lon.min,lon.max), 
+				ylim=c(lat.min, lat.max),
+				type="n",
+				cex=0.25, 
+				main =paste("Train=Blue(",sum(train.index),
+					")    Test=Red(",sum(test.index),")"))
+			require(maps)
+			map("state", add=TRUE, col="black", lwd=2)
+			for (jjj in 1:length(grid.yyy)){
+			      lines(c(lon.min,lon.max),rep(grid.yyy[jjj],2),col="grey")
+			      }
+			for (jjj in 1:length(grid.xxx)){
+			      lines(rep(grid.xxx[jjj],2),c(lat.min,lat.max),col="grey")
+			      }			
+			#dim(u.test.locs) 
+			points(locs[train.index,], col="blue", cex=0.5, pch=19)
+			points(u.test.locs, cex=0.5, col=2,pch=19)
+			}
+# ------------------		
+return(list( test.index = test.index, 
+    train.index = train.index))		
+# ---------------------------------------------------------------------------------
+} #end FUNCTION
+# ---------------------------------------------------------------------------------	
+
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+# equal.wt.max.coverage.selection
+# max.uniform.coverage.split
+# DFink 
+# 3.22.10
+#
+# This function splits a set of locations into "test" and "training" 
+# set with with the goal that the test set meet two objectives:
+# 	1) The test set covers the broadest extent possible, and 
+# 	2) The test set is approximately uniform over the extent.
+# 
+# The first goal is met by constructing a randomly located rectangular
+# grid over the extent of the data and then preferentially select 
+# test locations that populate as many cells as possible. Within
+# grid cell density is controlled, i.e. made more uniform, by 
+# setting the maximum number of unique locations included in cell. 
+# Small value of the maximum cell sample size parameter help 
+# to produce more uniformly distributed test set samples.
+#
+# Note, if locations are repeated, all the repeats for each location 
+# are all assigned to either the test or training sets.  
+#
+# Inputs:
+# ---------  
+#	locs - data frame or list with elements x & y.  
+#	grid.cell.min.lat - height of grid cells
+#	grid.cell.min.lon - width of grid cells
+#	max.cell.locs - integer giving maximum number of unique locations 
+# 					per cell
+#	plot.it =FALSE - flag for diagnostic plot
+# 
+# Outputs: 
+# --------- 
+# 	test.index = boolean index of length = nrows(locs)
+# 	train.index = same. 
+#   
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+# Equal Weight with Maximum Coverage Splitting
+# for Train:Test Set
+# ---------------------------
+equal.wt.max.coverage.selection <- function(
+	locs, 
+	grid.cell.min.lat,
+	grid.cell.min.lon,
+	max.cell.locs=1,
+	plot.it =FALSE ){
+# ----------------------------------------------------------------
+# Formal test values
+#           locs=cc.data$locs  data.frame(x , y) length n
+#	        grid.cell.min.lat=1.0
+#		  	grid.cell.min.lon=1.5
+#			max.cell.locs=5
+# ----------------------				
+	lon.min <- min(locs$x)
+	lon.max <- max(locs$x)
+	lat.min <- min(locs$y)
+	lat.max <- max(locs$y)
+	iii.loop <- 1
+	# 1) Randomize Coordinate for first grid cell boundary
+	r.lat <- runif(1,min=0, max=grid.cell.min.lat)
+	r.lon <- runif(1,min=0, max=grid.cell.min.lon)
+	# 2) lay down equally spaced grids from min to max
+	grid.ttt <- seq(from=(lon.min+r.lon),
+	               to=lon.max,
+		           by=grid.cell.min.lon)
+	grid.xxx <- c(lon.min, grid.ttt, lon.max)
+	grid.ttt <- seq(from=(lat.min+r.lat),
+	               to=lat.max,
+		           by=grid.cell.min.lat)
+	grid.yyy <- c(lat.min, grid.ttt, lat.max)
+	# incase of any duplicates!
+	grid.xxx <- sort(unique(grid.xxx))
+	grid.yyy <- sort(unique(grid.yyy))
+	# ---------------------------------------------------
+	# Sample Maximal Coverage Test Set 
+	# Then use the rest for Training
+	# ** Take up to the first max.cell.locs
+	# ** Then randomly select the rest, by unique loc
+	# ---------------------------------------------------
+	kkk <- 0 # counter for grid cell regions
+	nnn.grid.cells <- (length(grid.xxx)-1)*(length(grid.yyy)-1)
+	u.test.locs <- NULL 
+	# -----------------------------------------------------------------
+	# Cycle over Columns(xxx_iii) within Given Row (yyy_jjj)
+	# -----------------------------------------------------------------
+	for (jjj in 1:(length(grid.yyy)-1)){
+	for (iii in 1:(length(grid.xxx)-1)){
+		kkk <- kkk + 1
+		xxx <- locs$x
+		yyy <- locs$y
+		cell.index <- xxx >= grid.xxx[iii] & xxx < grid.xxx[iii+1] &
+				yyy >= grid.yyy[jjj] & yyy < grid.yyy[jjj+1]
+		# Check for minimum Prediction Cell Locations
+		# ---------------------------------------------
+		u.locs <- unique(data.frame(x=locs$x[cell.index],
+			  						y=locs$y[cell.index]))
+		#sum(cell.index)
+		#dim(u.locs)
+		#cat(NROW(u.locs),"\n")
+		#cat( max.cell.locs, "\n")
+		if (NROW(u.locs) <= max.cell.locs) {
+			# Randomly Select first max.cell.locs
+		   	u.test.locs <- rbind(u.test.locs,u.locs)
+		   	}		
+		if (NROW(u.locs) > max.cell.locs) {
+		   	# Randomly Select first max.cell.locs
+		   	# Then Randomly split the rest
+		   	# ---------------------------------
+		   	ttt.ind <- sample(1:NROW(u.locs), size=max.cell.locs)
+		   	u.test.locs <- rbind(u.test.locs,u.locs[ttt.ind,])
+		   }						  		
+	}}# end grid loops
+	# -----------------------------------------			
+	# Build index into all locations.  
+	# ------------------------------	
+	test.index <- (locs$x %in% u.test.locs$x) & (locs$y %in% u.test.locs$y)
+	train.index <- !test.index		
+	# -------------------------
+	# Test Plot of Grid
+	# -------------------------
+	if ( plot.it == TRUE){
+		plot(1,1, 
+			xlim=c(lon.min,lon.max), 
+			ylim=c(lat.min, lat.max),
+			type="n",
+			cex=0.25, 
+			main =paste("Train=Blue(",sum(train.index),
+				")    Test=Red(",sum(test.index),")"))
+		require(maps)
+		map("state", add=TRUE, col="black", lwd=2)
+		for (jjj in 1:length(grid.yyy)){
+		      lines(c(lon.min,lon.max),rep(grid.yyy[jjj],2),col="grey")
+		      }
+		for (jjj in 1:length(grid.xxx)){
+		      lines(rep(grid.xxx[jjj],2),c(lat.min,lat.max),col="grey")
+		      }			
+		#dim(u.test.locs) 
+		points(locs$x, locs$y, col="blue", cex=0.25, pch=1)
+		points(u.test.locs, cex=0.25, col=2,pch=1)
+	} # plot.it
+# ------------------		
+return(list(test.index = test.index, 
+    		train.index = train.index))		
+# ---------------------------------------------------------------------------------
+} #end FUNCTION
+# ---------------------------------------------------------------------------------	
+
+
+
+
+
+# ---------------------------------------------------------------------
+# ---------------------------------------------------------------------
+# OOB Diagnositic Plots
+# ---------------------------------------------------------------------
+plot.diagnostics <- function(pred, ensemble.data, resp.family) {
+   # ---------------------------------------------------------------------
+   # ---------------------------------------------------------------------
+   #
+   #  pred = test.pred
+   #          oob <-  FALSE
+   #          ensemble.data = test.data
+   # ---------------------------------------------------------------------        
+   require(mgcv)
+   par(mfrow=c(3,2))
+   # Plot Residuals
+   # --------------      
+   ttt.ind <- !is.na(pred$mean) 
+   res <- (ensemble.data$y[ttt.ind] - pred$mean[ttt.ind])
+   hist(res,
+	xlab = "Observation - Prediction",
+	main = "Residuals")
+   lines(c(0,0), c(-9e9,9e9), col="blue")
+   # ------------------------------------
+   # How many models support In-Bag Predicitons
+   # and Out Of Bag/Sample Predictions
+   # --------------------------------------------
+   hist(apply(!is.na(pred$matrix), 1, sum, na.rm=T),
+   main="Ensemble Support",
+   xlab="Number of Models per Prediction")
+   # Note: Zero column is the number of training points
+   # that were never predicted OOB
+   # Plot predictions vs Obs.
+   # ---------------------------
+   ttt.ind <- !is.na(pred$mean) 
+   xxx <- pred$mean[ttt.ind]
+   yyy <- ensemble.data$y[ttt.ind]
+   plot(xxx, 
+   	yyy,
+	xlab="Prediction",
+	ylab="Observation")
+   abline(0,1, col="blue")
+   require(mgcv)
+   d.gam <- gam(yyy ~ s(xxx), data=data.frame(yyy,xxx), gamma=1.2)
+   ttt <- seq(from=min(xxx), to=max(xxx), length=15)
+   p.ttt <- predict(d.gam, newdata=data.frame(xxx=ttt))
+   lines(ttt,p.ttt, col=2)
+   # Mean - Var Scaling 
+   # -------------------
+   ttt.ind <- ( !is.na(pred$sd) & !is.na(pred$mean) )       
+   xxx <- pred$mean[ttt.ind]
+   yyy <- pred$sd[ttt.ind]
+   plot(xxx, 
+        yyy,
+	xlab="Ensemble Pointwise Mean",
+	ylab="Ensemble Pointwise SD")
+   abline(0,1, col="blue")
+   d.gam <- gam(yyy ~ s(xxx), data=data.frame(yyy,xxx), gamma=1.2)
+   ttt <- seq(from=min(xxx), to=max(xxx), length=15)
+   p.ttt <- predict(d.gam, newdata=data.frame(xxx=ttt))
+   lines(ttt,p.ttt, col=2)  
+   # ------------------------------
+   # -------------------------------------------------------------
+   # Add Bootstrap Trajectory for MSE(oob.pred, training.obs)
+   # -------------------------------------------------------------
+   if (resp.family=="gaussian" | resp.family=="poisson") {	
+      ppp <- pred$matrix  # continous.res x btrials
+      j.length <- 25
+      j.ind <- seq(from=1, to=NCOL(ppp), length=j.length)
+      MSE <- rep(0,  j.length)
+      for (jjj in 1:j.length){
+      	  if (jjj == 1) ttt.pred <- ppp[,1]
+          if (jjj > 1) ttt.pred <- apply(ppp[,c(1:j.ind[jjj])],1,
+                                         mean,
+                                         na.rm=TRUE)
+	  MSE[jjj] <- predictive.performance(obs=ensemble.data$y[!is.na(ttt.pred)],
+						ppp=ttt.pred[!is.na(ttt.pred)],
+	                			resp.family=resp.family)$MSE             
+          }
+          plot(j.ind,
+                MSE,
+                xlab="Ensemble Size",
+                main=" MSE vs Ensemble Size ",
+                type="l", lwd=2)
+       } # 
+       # -------------------------------------------------
+       # -------------------------------------------------------------
+       # Add Bootstrap Trajectory for MSE(oob.pred, training.obs)
+       # -------------------------------------------------------------
+       if (resp.family=="bernoulli") {
+		ppp <- pred$matrix  # continous.res x btrials
+          j.length <- 25
+          j.ind <- seq(from=1, to=NCOL(ppp), length=j.length)
+          MSE <- rep(0,  j.length)
+          for (jjj in 1:j.length){
+            if (jjj == 1) ttt.pred <- ppp[,1]
+            if (jjj > 1) ttt.pred <- apply(ppp[,c(1:j.ind[jjj])],1,
+                                    mean,
+                                    na.rm=TRUE)
+		  # ---------------------------------------------------------------
+		  # This is a hack to accomodate 
+		  # an error from the ROCR prediction() function 
+		  # encountered when all the observations are of a 
+		  # single class! 
+		  # "Error in prediction(prediction = ppp, labels = as.numeric(obs)) : 
+  		  # "Number of classes is not equal to 2.
+		  # ---------------------------------------------------------------
+		  if (length((unique(ensemble.data$y[!is.na(ttt.pred)]))) ==2)
+		  	MSE[jjj] <- predictive.performance(
+                	    obs=ensemble.data$y[!is.na(ttt.pred)],
+                	    ppp=ttt.pred[!is.na(ttt.pred)],
+                	    resp.family=resp.family)$auc     	    
+          }
+          plot(j.ind,
+                MSE,
+                ylim=c(0.5, 1.0),
+                xlab="Ensemble Size",
+                ylab="AUC",
+                main=" AUC vs Ensemble Size ",
+                type="l", lwd=2)
+       } # 
+       # -------------------------------------------------
+# -------------------------------------------------------------
+} # end function
+# ---------------------------------------------------------------------
+# ---------------------------------------------------------------------
+
+# ---------------------------------------------------------
+# Simple Plot for 1D PD plots
+# 
+# This needs to really be cleaned up 
+# ---------------------------------------------------------
+summary.1D.PD.ensemble<- function(filename=NULL,
+					ensemble.par.list,
+					pd.data,
+    					pd.bdt.object.name = NULL, 
+    					continuous.resolution = 15,
+    					nn.sample = 100,
+    					# ----------------------
+    					partial.datafile = NULL, 
+    					diag.bdt=NULL,
+    					n.pd = 4,
+    					pd.filename,
+    					# ----------------------
+    					plot.it = TRUE,
+    					plot.range = "common",
+    					n.row = 2,
+    					n.col =2) {
+	# ---------pd.data------------------------------------------------
+	    X.names <- names(pd.data$X)
+	    X.factor.ind <-  rep(FALSE, NCOL(pd.data$X))
+		  ttt <- pd.data$X[1,] # it is much faster to search a 1D data.frame!
+	    for (ii in 1:NCOL(pd.data$X))
+		X.factor.ind[ii] <- is.factor(ttt[,ii])
+	    # ------------------------------
+	    ttt.ind <- order(apply(diag.bdt$var.imp1,1,median), decreasing=TRUE)
+	    pd.names <- X.names[ttt.ind]
+	    pd.names <- pd.names[1:n.pd]
+	    pd.factor.ind <- X.factor.ind[ttt.ind]
+	    pd.factor.ind <- pd.factor.ind[1:n.pd]
+	    pd.list <- as.list(pd.names)
+    
+	if (is.null(pd.bdt.object.name) ){
+	# ------------------------------------------------
+	pd.bdt <- ensemble.partial.dependence(
+                  filename = filename,
+		  	   ensemble.par.list = ensemble.par.list,
+                  XX = pd.data$X,
+                  partial.dependence.list = pd.list,
+                  continuous.resolution = continuous.resolution,
+                  nn.sample = nn.sample)
+	save(pd.bdt, file=paste(pd.filename,sep=""))
+	} 
+
+	if (!is.null(pd.bdt.object.name) ){
+	# ------------------------------------------------
+	load(pd.bdt.object.name) # Assumed name is pd.bdt
+	} 
+
+    # ---------------------------
+    if (plot.it == TRUE) {
+      # Calc Centered PD means &
+      # Find y-limits for these plots
+      # --------------------------------
+      y.min <- 0.0
+      y.max <- 0.0
+      for (iii in 1:n.pd) {
+          # Calculate Centered Mean
+          ppp <- pd.bdt$pd.matrices[[iii]]
+          ppp.mean <- apply(ppp, 1, mean, na.rm=T)
+          ppp.mean <- ppp.mean - mean(ppp.mean)
+          y.min <- min(c(y.min,min(ppp.mean)))
+          y.max <- max(c(y.max,max(ppp.mean)))
+        }
+      y.range <- NULL
+      if (plot.range=="common") y.range <- c(y.min, y.max)
+	      
+      # -------------------------------------------------------------------------------------------------------
+      par(mfrow=c(n.row,n.col), mar=c(2,2,4,2))
+      # mar = c(bottom, left, top, right)
+      for (iii in 1:n.pd) {
+      # --------------------------
+          # Continuous Plot
+          # ----------------------------------
+	if (pd.factor.ind[iii] == FALSE) { 
+              xxx <- pd.bdt$pd.quant.grids[[iii]] #
+              ppp <- pd.bdt$pd.matrices[[iii]]  # matrix: continous.res x btrials
+             # Change ppp to data.frame
+              ppp <- data.frame(ppp)
+              # Calculate Centered Mean
+              ppp.mean <- apply(ppp, 1, mean, na.rm=T)
+              ppp.center <- mean(ppp.mean)
+              ppp.mean <- ppp.mean - ppp.center
+              #names(ppp) <- as.character(c(1:NCOL(ppp)))
+              #yyy.stacked <- stack(ppp)
+              #yyy.stacked <- as.numeric(yyy.stacked[,1])- ppp.center
+              #xxx.stacked <- rep(as.numeric(xxx[,1]), times=NCOL(ppp))
+              #----		
+			plot(xxx[,1],
+					ppp.mean,
+					ylim=y.range ,
+					type = "p",
+					col="black",
+					pch = 19,
+					cex=.75,
+					xlab = " ",
+					main = names(xxx),
+					ylab = " ")
+			abline(0,0) 
+			
+		# -----------------------------------------------
+		# Plot when there enough unique levels to smooth 
+		# ----------------------------------------------
+		if (length(sort(unique(xxx[,1]))) >= 10) { 	      
+		# ----------------------------------------------------
+			yyy.stacked <- ppp.mean
+			xxx.stacked <- xxx[,1]
+			# ---------------
+			require(mgcv)
+			d.gam <- gam( yyy.stacked ~ s(xxx.stacked),
+					gamma=1.2)
+			xxx.pred <- seq(from=min(xxx.stacked),
+						to=max(xxx.stacked),
+						length=25)
+			pred.gam <- predict(d.gam,
+				  newdata=data.frame(xxx.stacked=xxx.pred),
+				  se.fit=TRUE, type="response")
+			lines(xxx.pred,pred.gam$fit,col="blue", lwd=2.0)
+		}}
+          # ----------------------------------
+          # Factor Plot
+          # ----------------------------------
+          if (pd.factor.ind[iii] == TRUE){
+              xxx <- pd.bdt$pd.quant.grids[[iii]] #
+              ppp <- pd.bdt$pd.matrices[[iii]]  # continous.res x btrials
+              # Calculate Centered Mean
+              ppp.mean <- apply(ppp, 1, mean, na.rm=T)
+              ppp.center <- mean(ppp.mean)
+              ppp.mean <- ppp.mean - ppp.center
+              # -----------------------------------------------
+              # Change xxx to class factor for plot
+              # -----------------------------------------------
+              factor.levels <-
+                levels(pd.data$X[, names(pd.data$X) == names(xxx)])
+              xxx.recoded <- factor.levels[ xxx[,1]]
+              plot(as.factor(xxx.recoded),
+                   ppp.mean,
+                   ylim= y.range,
+                   xlab = " ",
+                   main = names(xxx),
+                   ylab = " ")
+              abline(0,0)
+            }
+       }# end plotting
+    } # end plot.it
+} # end function
+# -------------------------------------------------------------------
+# ---------------------------------------------------------------------
+
+
+ 
+#------------------------------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------------------------------
+# Extract Seasonal p.data
+# function st.gam relies on this function. 
+#
+# 1.13.08 
+# Modified to only do a single "training/test" data set
+# and to return only the index (logical index). 
+#
+#
+#Demo:
+# -----------
+# ttt.data <- seasonal.window(
+# 					begin.window=30, 
+# 					end.window=80,
+# 					p.data=p.data)
+# 		names(ttt.data$X)
+# 		dim(ttt.data$X)
+# 		dim(ttt.data$Xp)
+# 		sort(unique(ttt.data$X$JDATE))	
+#
+#
+# Tree Swallow Notes: 
+# ---------------------------------
+	# -----------------------------------------
+	# Define Seasons
+	# -----------------------------------------
+	#ttt<- c( 	320, 45, 		#winter
+	#		45, 110, 		#spring
+	#		110, 200, 	#Breeding
+	#		200, 320)		# Fall 
+	#season.boundaries <- matrix(ttt,4,2, byrow=TRUE)
+#------------------------------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------------------------------
+seasonal.window <- function(
+					begin.window, 
+					end.window,
+					p.data){
+		season.boundaries <- matrix(c(begin.window, end.window), 
+									1,2, byrow=TRUE)
+		jjj <- 1					
+		winter <- (begin.window > end.window)
+		# -----------------------------------------
+		# Training p.data 
+		# -----------------------------------------
+		season.index <- p.data$jdates >= season.boundaries[jjj,1]  & 
+						p.data$jdates <= season.boundaries[jjj,2]	
+		if (winter) { # Winter
+			season.index <- p.data$jdates >= season.boundaries[jjj,1] | 
+						p.data$jdates <= season.boundaries[jjj,2]
+                }
+		return(
+			list(
+      #p.data=p.data,
+			season.index = season.index))
+			#season.p.index = season.p.index))
+	} #end function
+# -------------------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------------------
+
+
+## Clear the deck of all local variables
+## rm(list = c("arrival.dates", "begin.date", "bs.rpart.maps", "by.tic", "color.palette", "create.pd.grid", "create.simple.STEM.ensemble", "D.erd.data.par.list", "deviance.explained", "end.date", "ensemble.partial.dependence", "equal.wt.max.coverage.selection", "fit.ensemble", "halloween.colors", "halloween.maps", "iii", "initizalize.map.grid", "jdate.index", "jdate.seq", "jdate.tic.names", "jdate.tics", "j.index", "make.functional.data.design.matrix", "make.SPAT.COVAR.pred.data", "map.i [...]
+## KFW gc()
\ No newline at end of file
diff --git a/contrib/stem/code/stem.library.B.R b/contrib/stem/code/stem.library.B.R
new file mode 100644
index 0000000..3d54a90
--- /dev/null
+++ b/contrib/stem/code/stem.library.B.R
@@ -0,0 +1,2124 @@
+
+# STEM LIBRARY INDEX
+# ---------------------------------------------------------
+# FUNCTION: Create Simple ST Ensemble, 5.1.09
+#    * cleaned
+#
+# sample.ST.ensemble <- function(    5.1.09
+#    * cleaned, consistent use of locs
+#    * STEM ensemble requires ensemble.locs & ensemble.jdates
+#      WTIHOUT requiring predictors ($x, $y, & $JDATE)
+#    * These predictors are required if basis rotation used!
+#
+# rotate.ST.basis.sample - added ensemble.locs
+# 	this means that you can split by location within DT
+#    without having layt & lon predictors!
+#
+# FUNCTION: Plot STEM Spatial Design
+#
+# FUNCTION: predict.ST.ensemble -
+# 		explicit locs & jdate incices 
+# 		better handling of null predictions
+# 		verified
+#
+# FUNCTION: predict.ST.matrix
+# FUNCTION: STEM.partial.dependence
+# 	** NOT yet working for lat,lon effects!!!
+# 
+# 
+# plot ST design Function
+# ---------------------------------------------------------
+# STEM Specific functionality that is Needed:
+# --------------
+# Histogram of ensemble sample sizes
+# Support Map at a point
+# Support Depth Map
+# -------------------------------------------
+
+
+
+
+
+
+
+
+# ---------------------------------------------------------
+# FUNCTION: Create Simple ST Ensemble
+# D Fink
+# 5.1.09
+# ---------------------------------------------------------
+#
+# Becuase the spatial regions are generated randomly, I want
+# to incorporate as much of this variation as possible in
+# the sample. We use a different spatial
+# regionalization for each time interval.
+#
+# Note with spatial design.
+# if locations are only unique locations, then min.data.size
+# if applied to unique locations. Otherwise min.data.size
+# is applied to total number of data pts w/in STEM cell.
+#
+#
+# -----------------------------------------------------------
+# Temporal Design - Seasonal Tiles
+# -----------------------------------------------------------
+# 1) jdate.seq are centers of symmetric temporal window
+# 	Evenly spaced slices throughout year
+#  ** begin.window = vector of jdates for beginning of window
+# 					 centered at jdate.seq
+#  ** end.window = same
+#  ** begin.pred.window = is the beginning of the prediction
+# 							window. This controls how the
+# 							averaging of the ensemble is done.
+#		Eg. If prediction.window.width <
+# 		season.window.width. This can be used to remove bias
+# 		often encountered when predicting at end of time series.
+# 		If prediction.window.width > season.window.width
+# 		then this allows forecasting, predictions beyond the
+# 		time horizon of the data. This should give a more
+# 		realistic errors if goal is forecasting.
+# ------------------------------------------------------------
+#
+# INPUT:
+# -----------
+#     y = (n x 1) full response vector
+#         (Should I remove this or make it optional??)
+#     X = (n x p) full design matrix
+#
+# sampling.par.list=NULL
+# split.by.location==TRUE
+#   X.loc = data.frame used to split data.
+#           note - the NROWS(X.loc) must equal NROWS(X) the
+#           training design!!!
+#   p.train = proportion data sampled for training
+#                  # Default ==> Use all available data for
+#                  # test & training sets by including all replicate locations.
+#                  m.frac <- 1.0
+# OUTPUT:
+# -------------
+#   Regional.polygons = data.frame with components
+#       x = vertices of polygons
+#       y = vertices of polygons
+#       region.code = sequential number code,
+#
+#   Cluster.codes = (rows = NROW(ensemble.data$X)
+#                     cols =  n.mc.regions)
+#                 contains the clusterings for each mc realization
+# regional.polygons = data.frame that defines the regional polygons
+#                     the partition the global region.
+#                     Here, regions are defined by clustering algorithm
+#                     number of polygons = n.region
+#                     (longitude, latitude, region.number)
+# design.summary <- Center of region mass
+#            (good for Knot locations & text titles)
+# ----------------------------------------------------------------------
+# Future Development -
+# ** add logic to cycle through limited
+# 	number of n.mc.regions for all btrial x n.interval combinations.
+# ------------------------------------------------------------
+create.simple.STEM.ensemble <- function(
+		# Data
+		# ------------------------
+			ensemble.data.locs, # <- data.frame(x=ensemble.data$X$x, y=ensemble.data$X$y)
+			ensemble.data.jdates, 	# "JDATE" = Julian date from 0 to 365
+		# ------------------------
+		# Spatial Design
+		# ------------------------
+			spatial.region.par.list, # All Random Rectangle Inits
+		# Temporal Design
+		# ------------------------
+			n.intervals, 		# Slice year into n.intervals prediction points
+			begin.jdate = 0,       #
+			end.jdate = 365,
+			season.window.width,     # Fitting/Training window width in days
+			prediction.window.width, # Prediction window width in days
+		# Sampling parameters (pass through only)
+		# ------------------------------------
+			sample.ensemble.function,
+			sampling.par.list,
+			predict.ensemble.function,
+			spatial.extent.list=NULL)
+{# ---------------------------------------------------------
+#	# ----------------------------------------------------------------------
+#	# Formal parameter Test Values
+#	# ----------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# Temporal Design - Seasonal Tiles
+# ----------------------------------------------------------------------
+	jdate.seq <- seq(from=begin.jdate, to=end.jdate, length=(n.intervals+1))
+	jdate.seq <- round((jdate.seq[2:(n.intervals+1)] + jdate.seq[1:(n.intervals)])/2)
+	begin.window <- jdate.seq - round(season.window.width/2)
+	begin.window[  begin.window < 0 ] <- begin.window[  begin.window < 0 ] + 365
+	end.window <- jdate.seq + round(season.window.width/2)
+	end.window[  end.window > 365 ] <- end.window[ end.window > 365 ] - 365
+	# ----------------------
+	begin.pred.window <- jdate.seq - round(prediction.window.width/2)
+	begin.pred.window[  begin.pred.window < 0 ] <-
+			begin.pred.window[  begin.pred.window < 0 ] +365
+	end.pred.window <- jdate.seq + round(prediction.window.width/2)
+	end.pred.window[  end.pred.window > 365 ] <-
+			end.pred.window[ end.pred.window > 365 ] -365
+
+# ----------------------------------------------------------------------
+# Spatial Design - Random Rectangular Regional Tiles
+# ----------------------------------------------------------------------
+	# --------------------------------------------------------------------------------------------
+	# Inits
+	# --------------------------------------------------------------------------------------------
+		n.mc.regions <- spatial.region.par.list$n.mc.regions
+		# Underlying Coverage Grid
+		grid.cell.min.lat <- spatial.region.par.list$grid.cell.min.lat
+		grid.cell.min.lon <- spatial.region.par.list$grid.cell.min.lon
+		# Randomized Rectangular Regions
+		n.centers.per.region <- spatial.region.par.list$n.centers.per.region
+		regional.cell.min.lat <- spatial.region.par.list$regional.cell.min.lat
+		regional.cell.min.lon <- spatial.region.par.list$regional.cell.min.lon
+		min.data.size <- spatial.region.par.list$min.data.size
+		# Unpack location info
+		# ----------------------
+		xxx <- ensemble.data.locs$x # Longitude
+		yyy <- ensemble.data.locs$y # Longitude
+		lat.min <- min(yyy)
+		lat.max <- max(yyy)
+		lon.min <- min(xxx)
+		lon.max <- max(xxx)
+		iii.count <- 0
+# --------------------------------------------------------------------------------------------
+# Loop MC Regions - one SET of regions for each MC x Time Interval Combination
+# --------------------------------------------------------------------------------------------
+regional.polygons <- NULL
+design.summary <- NULL
+for (iii.interval in 1:n.intervals){
+for (iii.mc.region in 1:(n.mc.regions)){  #  1){ #
+	# ----------------------------------------------------------------------
+	# Define "Coverage" Grid
+	# ----------------------------------------------------------------------
+	# Store grid as x-vector of grid vertices
+	# and y-vector of grid vectices. Both of these are bookended
+	# with their min & max values.
+	# 0) Initialize with x-min,
+	# 1) randomize position of first vertex
+	# 2) lay down equally spaced grid until x.max reached
+	# ** Repeate for y-axis
+	# --------------------------------------------------
+  	# --------------------------------------------------
+   	# Randomize Coordinate for first grid cell boundary
+   	# --------------------------------------------------
+	r.lat <- runif(1,min=0, max=grid.cell.min.lat)
+	r.lon <- runif(1,min=0, max=grid.cell.min.lon)
+	grid.ttt <- seq(from=(lon.min+r.lon),
+	               to=lon.max,
+		           by=grid.cell.min.lon)
+	grid.xxx <- c(lon.min, grid.ttt, lon.max)
+	grid.ttt <- seq(from=(lat.min+r.lat),
+	               to=lat.max,
+		           by=grid.cell.min.lat)
+	grid.yyy <- c(lat.min, grid.ttt, lat.max)
+	# incase of any duplicates!
+	grid.xxx <- sort(unique(grid.xxx))
+	grid.yyy <- sort(unique(grid.yyy))
+	   # -------------------------
+	   # Test Plot of Grid
+	   # -------------------------
+	   #plot(xxx,yyy, cex=0.25)
+	   #require(maps)
+	   #map("state", add=TRUE)
+	   #for (jjj in 1:length(grid.yyy)){
+	   #        lines(c(lon.min,lon.max),rep(grid.yyy[jjj],2))
+	   #        }
+	   #for (jjj in 1:length(grid.xxx)){
+	   #        lines(rep(grid.xxx[jjj],2),c(lat.min,lat.max))
+	   #        }
+   # --------------------------------------------------------------
+   # -------------------------------------------------------
+   # Cycle over Columns(xxx_iii) within Given Row (yyy_jjj)
+   # Sample Random Centers within Grid Cells
+   # -------------------------------------------------------
+   grid.centers.x <- NULL
+   grid.centers.y <- NULL
+   for (jjj in 1:(length(grid.yyy)-1)){
+   for (iii in 1:(length(grid.xxx)-1)){
+	   ttt.index <- xxx >= grid.xxx[iii] & xxx < grid.xxx[iii+1] &
+	                yyy >= grid.yyy[jjj] & yyy < grid.yyy[jjj+1]
+	   ttt.df <- data.frame(xxx=xxx[ttt.index], yyy=yyy[ttt.index])
+	   #ttt.u <- unique(ttt.df)
+	   # Check for at least 1 data point in the coverage cell.
+	   # If so, then Sample Random Centers
+	   # ----------------------------------------
+	   if (NROW(ttt.df) > 0 ){
+		  n.centers <- n.centers.per.region
+   	  	  grid.centers.x <-c(grid.centers.x,
+		   	   			   runif(n.centers,
+								min=grid.xxx[iii],
+								max=grid.xxx[iii+1]))
+   	  	  grid.centers.y <-c(grid.centers.y,
+			   			   runif(n.centers,
+								min=grid.yyy[jjj],
+								max=grid.yyy[jjj+1]))
+	   } # endif
+   # ---------------
+   } #iii
+   } #jjj
+   grid.centers <- data.frame(x=grid.centers.x,
+                              y=grid.centers.y)
+   rm(grid.centers.x)
+   rm(grid.centers.y)
+	   #dim(grid.centers)
+	   # plot
+	   #points(grid.centers, cex=1.5, pch=19, col=2)
+   # --------------------------------------------------
+   # Filter Grid Centers to lie within Target Boundary
+   # --------------------------------------------------
+	  ttt.index <- c(1:NROW(grid.centers))
+	  if (!is.null(spatial.extent.list)){
+	   	 if (spatial.extent.list$type == "shapefile"){
+			  ttt.index <- point.in.shapefile(
+				sites = data.frame(lon=grid.centers$x,
+	                                  lat=grid.centers$y),
+				shape.dir=spatial.extent.list$shape.dir,
+				shape.filename=spatial.extent.list$shape.filename,
+				att.selection.column.name=
+			               spatial.extent.list$att.selection.column.name,
+				selected.shape.names=
+			            spatial.extent.list$selected.shape.names)
+			  }
+	    	  } 	# if (!is.null(spatial.extent.list)){
+	   # Use Convex Hull around ensemble.data to get approximate boundary
+	   # ------------------------------------------------------------
+	   if (!is.null(spatial.extent.list)){
+		if (spatial.extent.list$type == "convexhull"){
+		 chull.index <- chull(ensemble.data.locs )
+	   	 ttt.index <- point.in.polygon(
+		  			    xxx = grid.centers$x,
+		  			    yyy = grid.centers$y,
+		  			    polygon.vertices = ensemble.data.locs[chull.index,])
+	   }}
+   # -----------------------------------------
+   grid.centers <- grid.centers[ttt.index,]
+	   # -----------------------------------------
+	   # plot check
+	   # -----------------------------------------
+	   #points(grid.centers, cex=1.0, pch=19, col=3)
+	   #cat(dim(grid.centers), "\n")
+	   #for (jjj in 1:length(grid.yyy)){
+	   #        lines(c(lon.min,lon.max),rep(grid.yyy[jjj],2))
+	   #        }
+	   #for (jjj in 1:length(grid.xxx)){
+	   #        lines(rep(grid.xxx[jjj],2),c(lat.min,lat.max))
+	   #        }
+	   # --------------
+# --------------------------------------------------------------------------------------------
+# Cycle over Regions - Check for minimum data & area requirements
+# Grow Rectanges as necessary
+# --------------------------------------------------------------------------------------------
+  	for (iii in 1:NROW(grid.centers)) {
+      # Make Intial Rectangle
+      # ----------------------
+           center.lon <- grid.centers$x[iii]
+	      center.lat <- grid.centers$y[iii]
+	      r.lat <- regional.cell.min.lat/2
+       	 r.lon <- regional.cell.min.lon/2
+		 regional.rectangle <- data.frame(
+		 x= c((center.lon-r.lon), (center.lon-r.lon),
+	           (center.lon+r.lon), (center.lon+r.lon), (center.lon- r.lon)),
+		 y= c((center.lat-r.lat), (center.lat+r.lat),
+	           (center.lat+r.lat), (center.lat-r.lat), (center.lat-r.lat)) )
+		 # Clip X & Y coordinates: maximum is
+		 # the rectangle bounding the data PLUS
+		 # an essential small (epsilon) boundary. This is essential 
+		 # to include "boundary points" with the point in polygon 
+		 # routines that I am using. They points that lie 
+		 # on the lower polygon boundaries. 
+		 # --------------------------------------------------
+		 epsilon <- 1e-10
+		 regional.rectangle$x[ regional.rectangle$x > max(xxx)] <- max(xxx)+epsilon
+		 regional.rectangle$x[ regional.rectangle$x < min(xxx)] <- min(xxx)-epsilon
+		 regional.rectangle$y[ regional.rectangle$y > max(yyy)] <- max(yyy)+epsilon
+		 regional.rectangle$y[ regional.rectangle$y < min(yyy)] <- min(yyy)-epsilon
+	# --------------------------
+	# Loop over all ST windows/extents/regions
+	# Record vector of Regional-seasonal sample sizes
+	# Test for minimum sample size requirements
+	# --------------------------
+          # Spatial Region Index
+		rr.index <- point.in.rectangle(
+		  			    xxx = ensemble.data.locs$x,
+		  			    yyy = ensemble.data.locs$y,
+		  			    polygon.vertices = regional.rectangle )
+	     # Seasonal Index
+		if ((begin.window[iii.interval] < end.window[iii.interval])) # non-Winter
+		   season.index <- ensemble.data.jdates >= begin.window[iii.interval] &
+ 			 ensemble.data.jdates <= end.window[iii.interval]
+		if ((begin.window[iii.interval] > end.window[iii.interval])) # Winter
+		   season.index <-ensemble.data.jdates >= begin.window[iii.interval] |
+                ensemble.data.jdates <= end.window[iii.interval]
+	          # regional & Seasonal indices
+   		ttt.index <- rr.index & season.index
+   		# Now see how many unique locations there
+   		# are among the selected/identified points
+   		# ------------------------------------------
+   		u.locs <- unique(data.frame(ensemble.data.locs$x[ttt.index],
+	                            ensemble.data.locs$y[ttt.index]))
+		   # number of unique locs
+ 		temp.samp.sizes <- NROW(u.locs) #sum(ttt.index)
+ 	# -------------------------------
+	# If minium data size is met for
+	# ALL Temporal Windows in that region
+	# Then we record its name in the book of
+	# regional names. Otherwise, we ignore that region.
+	# -------------------------------
+	# 4) Summarize Regions
+	# -------------------------------
+	if (temp.samp.sizes > min.data.size) {
+	   iii.count <- iii.count + 1
+		regional.polygons <- rbind(regional.polygons,
+		   data.frame(
+		     	    regional.rectangle,
+	           	    region.number=rep(iii.count, NROW(regional.rectangle)),
+	          	    region.mc = iii.mc.region,
+	          	    time.intervals=iii.interval))
+		design.summary <- rbind(design.summary,
+		   data.frame(
+		   		    x.center=center.lon,
+		   		    y.center=center.lat,
+			  	    region.number=iii.count,
+				    region.mc=iii.mc.region,
+	    			    time.intervals=iii.interval,
+                        unique.locs = temp.samp.sizes))
+    }
+   	# -------------------------------
+    # 5) plot final region
+    # -------------------------------
+ 	#polygon(regional.rectangle, border=iii+3)
+    #points(center.lon, center.lat, col=iii+3, pch=19)
+    #cat("Region ",iii," :",sum(rr.index),"\n")
+# ------------------------------------------------
+} # end loop over regions iii
+# ------------------------------------------------
+iii.count <- 0
+# ------------------------------------------------
+}} # end loop over MC x Time Interval Combinations
+# --------------------------------------------------------------------------------------------
+    #names(design.summary)
+    #dim(design.summary)
+    #names(regional.polygons)
+    #dim(regional.polygons)
+    # -----------------------------------------------------------------
+    # -------------------------------------------------
+    # Cleanup & Return
+    # -------------------------------------------------
+    return.list <- list(
+        ensemble.data.locs=ensemble.data.locs, # <- data.frame(x=ensemble.data$X$x, y=ensemble.data$X$y)
+        ensemble.data.jdates=ensemble.data.jdates, 	# "JDATE" = Julian date from 0 to 365
+        # Spatial
+        # --------
+            n.ensemble.models = NROW(design.summary),
+            regional.polygons=regional.polygons,
+            design.summary = design.summary,
+            spatial.region.par.list = spatial.region.par.list,
+        # Temporal
+        # ---------
+			n.intervals=n.intervals, 		# Slice year into n.intervals prediction points
+			begin.jdate = begin.jdate,       #
+			end.jdate = end.jdate,
+			season.window.width=season.window.width,     # Fitting/Training window width in days
+			prediction.window.width=prediction.window.width, # Prediction window width in days
+            begin.window=begin.window,
+            end.window=end.window,
+            begin.pred.window=begin.pred.window,
+            end.pred.window=end.pred.window,
+        # Sampling
+        # -----------------------
+            sample.ensemble.function = sample.ensemble.function,
+            sampling.par.list = sampling.par.list,
+        	predict.ensemble.function = predict.ensemble.function)
+# ---------------------------------------- -----------------
+    return(return.list)
+# ---------------------------------------- -----------------
+}# end Create STEM ensemble Function
+# ---------------------------------------------------------
+
+
+
+# ---------------------------------------------------------
+# sample.ST.ensemble
+# ---------------------------------------------------------
+# Generate a Sample from a SINGLE ST.ensemble model
+# 4.13.09 - modifications
+# ** if there are no data in stem cell, skip that cell.
+# ---------------------------------------------------------
+sample.ST.ensemble <- function(
+                          ensemble.model.number,
+                          ensemble.data,
+                          ensemble.par.list,
+                          diagnostic.plot = FALSE)
+{# -----------------------------------------------------------
+# -----------------------------------------------------------
+# Formal Parameter TEST Values
+# -----------------------------------------------------------
+	#ensemble.model.number <- 100
+	#ensemble.data <- train.data
+# -----------------------------------------------------------
+# Inits
+# -----------------------------------------------------------
+	return.list <- NULL
+	# -----------------
+	n.ensemble.models <- ensemble.par.list$n.ensemble.models
+	# Check ensemble.model.number
+	if (ensemble.model.number > n.ensemble.models)
+		stop(paste("Error: There are only ", n.ensemble.models,
+			" ensemble models. "))
+	# --------
+	ensemble.data.locs <- ensemble.par.list$ensemble.data.locs
+	ensemble.data.jdates <- ensemble.par.list$ensemble.data.jdates
+# -----------------------------------------------------------
+# Select Temporal Window
+# -----------------------------------------------------------
+	iii.interval <- 
+		ensemble.par.list$design.summary$time.intervals[ensemble.model.number]
+	sw.obj <- seasonal.window(
+			begin.window = ensemble.par.list$begin.window[iii.interval],
+			end.window = ensemble.par.list$end.window[iii.interval],
+			p.data= ensemble.data)
+			
+#cat("   iii.iterval=",iii.interval,	
+#	ensemble.par.list$begin.window[iii.interval],
+#	ensemble.par.list$end.window[iii.interval],"\n")
+#readline()	
+#print(
+#	cbind(ensemble.par.list$begin.window, ensemble.par.list$end.window)	)
+	
+			
+# -----------------------------------------------------------
+# Check that there are data!!!
+# -----------------------------------------------------------
+	if (sum(sw.obj$season.index) > 0){
+# -----------------------------------------------------------
+# Select Region
+# -----------------------------------------------------------
+	# Index into regional polygons
+	region.number <- ensemble.par.list$design.summary$region.number[ensemble.model.number]
+	region.mc <- ensemble.par.list$design.summary$region.mc[ensemble.model.number]
+	#**** Requires temporal index
+	# *** 4.13 Added temporal interval
+	r.index <- (ensemble.par.list$regional.polygons$region.mc == region.mc &
+		ensemble.par.list$regional.polygons$region.number == region.number &
+		ensemble.par.list$regional.polygons$time.intervals == iii.interval )
+	# Index into p.data Training set
+	region.given.season.index <- point.in.rectangle(
+		# = ttt.data$X$x
+		xxx = ensemble.data.locs$x[sw.obj$season.index],
+		# = ttt.data$X$y
+		yyy = ensemble.data.locs$y[sw.obj$season.index],
+		polygon.vertices = ensemble.par.list$regional.polygons[r.index,1:2])
+# -----------------------------------------------------------
+# Check that there are data!!!
+# -----------------------------------------------------------
+	if (sum(region.given.season.index) > 0){
+	# -----------------------------------------------------------
+	# Indexing Verification
+	# -----------------------------------------------------------
+	# 	dim(ensemble.data$X)        # size training data
+	#    # Seasonal index = logical index into training data
+	#    length(sw.obj$season.index)
+	#    sum( sw.obj$season.index)
+	#    # region.given.season.index = logical index into seasonal subset
+	#    length(region.given.season.index)
+	#    sum(region.given.season.index)
+	#    # sample.data$row.index = numeric index into regional-seasonal subset
+	#    length(sample.data$row.index)
+	# -------------------------------------
+	# numerical index from training data to
+	# regional-seasonal OOB/IB samples
+	# -------------------------------------
+	seasonal.num.ind <- c(1:length(sw.obj$season.index))[sw.obj$season.index]
+	#length(seasonal.num.ind)
+	reg.sea.num.ind <- seasonal.num.ind[region.given.season.index]
+# -----------------------------------------------------------
+# Sampling and Data Transformations
+# -----------------------------------------------------------
+	# Sample with rotate.ST.basis.sample()
+	sample.data <- rotate.ST.basis.sample(
+		train.data = list(
+			X = ensemble.data$X[reg.sea.num.ind,],
+			y = ensemble.data$y[reg.sea.num.ind]) ,
+		train.locs =ensemble.data.locs[reg.sea.num.ind , ] ,
+		train.jdates = ensemble.data.jdates[reg.sea.num.ind  ],
+		sampling.par.list = ensemble.par.list$sampling.par.list)
+
+# -----------------------------------------------------------
+# Check that there are data!!!
+if (length(sample.data$row.index) > 0){
+# ----------------------------------------------
+	# ----------------------------------
+	# Final Indexing Information
+	# ----------------------------------
+	#length(reg.sea.num.ind)
+	ib.reg.sea.num.ind <- reg.sea.num.ind[sample.data$row.index]
+	#length(oob.reg.sea.num.ind)
+	# -----------------------
+	oob.reg.sea.num.ind <- setdiff(reg.sea.num.ind,ib.reg.sea.num.ind)
+	#length(ib.reg.sea.num.ind)
+	#length(oob.reg.sea.num.ind)+ length(ib.reg.sea.num.ind)
+
+# -----------------------------------------
+# Visual Verification Plot
+#   Illustrating some fancy sampling!
+# -----------------------------------------
+	if (diagnostic.plot == TRUE) {
+		#windows()
+		# All training points
+		plot( ensemble.data.locs$x, ensemble.data.locs$y, pch=19, cex=0.5)
+		map('state',add=TRUE, lwd=2, col="yellow")
+		map('state',add=TRUE, lwd=1, col="black")
+		# -----------------------------------------------
+		# Seasonal Points
+		points(ensemble.data.locs$x[seasonal.num.ind],
+			ensemble.data.locs$y[seasonal.num.ind],
+			col="red", cex=1.0)
+		# -----------------------------------------------
+		# Regional-Seasonal Points
+		points(ensemble.data.locs$x[reg.sea.num.ind],
+			ensemble.data.locs$y[reg.sea.num.ind],
+			col="blue", cex=1.5)
+		polygon(ensemble.par.list$regional.polygons[r.index,1:2],
+			border="blue")
+		# ----------------------------------------------
+		# IB/OOB points
+		points(ensemble.data.locs$x[oob.reg.sea.num.ind],
+			ensemble.data.locs$y[oob.reg.sea.num.ind],
+			col="green", cex=2.0, lwd=2)
+		points(ensemble.data.locs$x[ib.reg.sea.num.ind],
+			ensemble.data.locs$y[ib.reg.sea.num.ind],
+			col="purple", cex=2.0, lwd=2)
+	}
+	# -------------------------------------------------
+	# Cleanup & Return
+	# -------------------------------------------------
+	return.list <- list(
+		# These are the sampled ("in bag") data
+		X = sample.data$X,
+		y = sample.data$y,
+		# Numerical IB & OOB Indices into formal parameter ensemble.data
+		oob.num.ind = oob.reg.sea.num.ind,
+		ib.num.ind = ib.reg.sea.num.ind,
+		#unique.locs.split = sample.data$dsplit,
+		realized.par =  sample.data$realized.par)
+} # seasonal window check end ifs checking for data in stem cell
+}  # #sw.obj$season.index
+} # bs - subsampling sampled
+	return(return.list)
+# ---------------------------------------------------------
+}# end Function sample.ST.ensemble
+# ---------------------------------------------------------
+
+
+
+# ---------------------------------------------------------
+# Sample with ST Basis Rotation
+# ---------------------------------------------------------
+# This function is identical to simple.sample,
+# except for the rotation and the sister function
+#     rotate.ST.basis.pred()
+# Note: I am going to start with hard coded
+# rotation code.
+#
+#
+# ---------------------------------------------------------
+rotate.ST.basis.sample <- function(
+				   train.data,
+				   train.locs,
+				   train.jdates,
+				   sampling.par.list=NULL){
+    # ------------------------------------------------
+    # Inits
+    # ------------------------------------------------
+    n <- NROW(train.data$X)
+    realized.par <- NULL
+    dsplit <- NULL
+    # ------------------------------------------------
+    # Check sampling.par.list for "RND.seed"
+    # ------------------------------------------------
+    if (!is.null(sampling.par.list)) {
+      if (sum(names(sampling.par.list)=="RNG.seed") > 0)
+          set.seed(sampling.par.list$RNG.seed)
+          }
+    # -----------------------------------------------------------
+    # Check for Sampling with ST Basis Rotation
+    # ----------------------------------
+    # requires variables named
+    #  "x" - lon coordinate
+    #  "y" - lat coordinate
+    #  "JDATE" - julian date
+    # --------------
+    #  ==> this is a way of introducing Data Transformations
+    #  or randomization into the model. perhaps this may be
+    #  a nice way of icncorporating latent structure???
+    # -----------------------------------------------------------
+    if (sampling.par.list$ST.basis.rotation == TRUE){
+	    # ------------------------------------------------
+	    # Random Rotation of "Cartesian" Lat-Lon Plane
+	    #   and Random cutting of the Julian Date Circle
+	    # ------------------------------------------------
+	    theta.prime <- runif(1, min=0, max=2*pi)
+	    train.data$X$x <- train.data$X$x*cos(theta.prime) - train.data$X$y*sin(theta.prime)
+	    train.data$X$y <- train.data$X$x*sin(theta.prime) + train.data$X$y*cos(theta.prime)
+	    # ------------------------------------------
+	    # Random rotation of Julian Date line
+	    theta2.prime <- round(runif(1, min=0, max=365))
+	    train.data$X$JDATE <-  train.data$X$JDATE + theta2.prime
+	    train.data$X$JDATE[train.data$X$JDATE > 365] <- train.data$X$JDATE[train.data$X$JDATE > 365] - 365
+	    realized.par <- c(theta.prime, theta2.prime)
+	    }
+
+    # -------------------------------------------------
+    # Split Data into Train:Test sets with Unique Locations
+    # -------------------------------------------------
+    if (!is.null(sampling.par.list$split.by.location)){
+      if (sampling.par.list$split.by.location==TRUE){
+		 # ------------------------------------
+		 # train.locs = data.frame( x, y)
+           # -----
+           # m.frac
+           if (is.null(sampling.par.list$m.frac))
+                  # Default ==> Use all available data for
+                  # test & training sets by including all replicate locations.
+                  m.frac <- 1.0
+           if (!is.null(sampling.par.list$m.frac))
+                  m.frac <- sampling.par.list$m.frac
+           # -------
+           # p.train
+           p.train <- NULL
+            if (!is.null(sampling.par.list$p.train))
+                p.train <- sampling.par.list$p.train
+            if (is.null(sampling.par.list$p.train))
+                # Bootstrap proportion as default
+                p.train <-  0.63
+           # --------
+		       dsplit <- unique.locs.splitting(
+                              locs=train.locs,
+                              p.train=p.train,
+                              m.frac=m.frac)
+		       bindex <- dsplit$train.locs.multiple
+	         # default is to pass back train.locs.multiple
+	     }}
+
+    # -------------------------------------------------
+    # Split Data Randomly - w/o respect to anything else
+    # -------------------------------------------------
+    if (is.null(sampling.par.list$split.by.location) |
+      (!is.null(sampling.par.list$split.by.location) &
+       sampling.par.list$split.by.location==FALSE)) {
+        # ------------------------------------------------
+         # -------------------------------------------------
+        # Random Sampling
+        # -------------------------------------------------
+    		if (!is.null(sampling.par.list$p.train)){
+  		 	bindex <- sample( c(1:n), 
+			   	  round(n*sampling.par.list$p.train) , 
+					replace=FALSE)
+          }
+        # Default is to sample with replacement
+    		if (is.null(sampling.par.list$p.train))
+		    bindex <- round(1 + (n-1)*runif(n))
+    } # end random split
+     # -------------------------------------------------
+
+    # -------------------------------------------------
+    # Cleanup & Return
+    # -------------------------------------------------
+    return.list <- list(
+        X = train.data$X[bindex,],
+        y = train.data$y[bindex],
+        row.index = bindex,
+        unique.locs.split = dsplit,
+        realized.par = realized.par)
+    return(return.list)
+# ---------------------------------------------------------
+}# end Function
+# ---------------------------------------------------------
+
+# ---------------------------------------------------------
+# Predict with ST Basis Rotation
+# ---------------------------------------------------------
+# The prediction-sampling functions need to
+# apply the same design transformations that were
+# used on the training data to subsequent prediction
+# designs. Here the "Cartesian" latxlon and Julian date
+# transformation are performed.
+#
+# INPUT:
+#     X = (n x p) full design matrix (unrotated)
+#     realized.par = c(theta.prime, theta2.prime)
+#                     rotation parameters
+#
+# OUTPUT:
+#     X = (nnn x ppp) newly rotated prediction matrix
+#
+# NOTE
+# -----------
+# response could be made optional parameter,
+# This might be a nice way to deal with
+# response transformations??? Like
+# box-cox parameterization??
+# ----------------------------------------------
+
+
+# ---------------------------------------------------------
+rotate.ST.basis.pred <- function(X, realized.par){
+			# ----------------------------------------------------------------------
+			# Randomize(Rotate) the predictor.data
+			# 7.17.08
+			# ----------------------------------------------------------------------
+				# Random rotation of "Cartesian" lat-lon plane
+				theta.prime <-realized.par[1]
+				# Random rotation of Julian Date line, Jan 1
+				theta2.prime <- realized.par[2]
+				# ---------------------------------
+    		X$x <- X$x*cos(theta.prime) - X$y*sin(theta.prime)
+    		X$y <- X$x*sin(theta.prime) + X$y*cos(theta.prime)
+    		# ------------------------------------------
+    		X$JDATE <-  X$JDATE + theta2.prime
+    		ttt.ind <- (X$JDATE > 365)
+        X$JDATE[ttt.ind] <- X$JDATE[ttt.ind] - 365
+    # -------------------------------------------------
+    # Cleanup & Return
+    # -------------------------------------------------
+    return(list(X = X))
+# ---------------------------------------------------------
+}# end Function
+# ---------------------------------------------------------
+
+
+
+
+
+# --------------------------------------------------------
+pop.rpart <- function(filename, ensemble.model.number,ttt.rpart){
+   f.rpart <- ttt.rpart
+   num.txt <- formatC(ensemble.model.number,format="fg", width=6)
+   num.txt <- chartr(" ","0",num.txt)
+   temp.filename <- paste(filename,".",num.txt,".RData",sep="")
+   load( file=temp.filename)  #rpart.parts
+   # ----------------------------
+   # Reassemble f.rpart from ttt.rpart stub
+   # ----------------------------
+   f.rpart$frame  <- rpart.parts$frame
+   f.rpart$where  <- rpart.parts$where
+   f.rpart$splits  <- rpart.parts$splits
+   f.rpart$cptable <- rpart.parts$cptable
+   if (sum(names(rpart.parts) == "csplit") > 0)
+      f.rpart$csplit <- rpart.parts$csplit
+
+   return(f.rpart)
+}# end function
+
+
+# ---------------------------------------------------------
+# ---------------------------------------------------------
+#  Notes: I need to check the resp.family
+#         multiclass has not been added - I have not
+#         how to handle the MATRIX of class probablities
+#
+# ** ensemble.pred.matrix - could be a VERY large
+# matrix. There are other strategies for dealing with
+# large data sets. This project is geared towards
+# "mid-sized" data sets.
+#
+#
+# 	# 3.18.09
+# ----------------------------
+# This the first revision to cut down on memory requirements
+# required when (naively) storing ALL ensmble predictions.
+# Here - store only the first two moments - mean & variance's
+# for baggged/ensemble predictions. There is a formal parameter
+# that can be set to store all predictions, if desired
+# 			matrix.flag = FALSE
+#
+#
+# ensemble.index = (not implemented yet)
+# 		optional ordered index of ensemble modelsto use for predictions)
+#
+# -----------------------------------------------------------
+# rpart.object$ frame
+# -----------------------------------------------------------
+# frame = data frame with one row for each node in the tree.
+# row.names of frame contain the (unique) node numbers that
+# follow a binary ordering indexed by node depth.
+# Elements of frame include
+# -----------------
+#	* var = factor giving the variable used in the split at each node
+#  	(leaf nodes are denoted by the string <leaf>),
+#	* n = size of each node,
+#	* wt = sum of case weights for the node,
+#	* dev = deviance of each node,
+#	* yval = the fitted value of the response at each node, and
+#	* splits = two column matrix of left and right split labels for each node.
+#Also included in the frame are
+#	* complexity = complexity parameter at which this split will collapse,
+#	* ncompete = number of competitor splits retained, and
+#	* nsurrogate, the number of surrogate splits retained.
+#	* yval2 = contains the number of events at the node (poisson),
+#  		or a matrix containing the fitted class, the class counts for
+#		each node and the class probabilities (classification).
+# -----------------------------------------------------------
+# ---------------------------------------------------------
+# ---------------------------------------------------------
+# ---------------------------------------------------------
+predict.ST.ensemble <- function(
+	filename, # filename of ensemble & index file
+	ensemble.par.list,
+	prediction.design,
+	prediction.design.locs,    # required for STEM
+	prediction.design.jdates,  # required for STEM
+	matrix.flag = FALSE)
+	#ensemble.index=NULL)
+	#...)   # pass through model.specific/predict.rpart parameters
+{ 
+
+   # ---------------------------------------------------------
+   # Formal Parameter Test Values
+   # ---------------------------------------------------------
+   #	filename <-  ensemble.model.filename
+   #	ensemble.index <- NULL
+   #	prediction.design <- train.data$X
+   #	matrix.flag <- FALSE
+   # ---------------------------------------------------------
+   # Inits
+   # ---------------------------------------------------------
+   function.call <- match.call()
+   # ---------------------------
+   # Load Ensemble Information
+   # ---------------------------
+   # * Number of models in ensemble
+   # * ensemble resp.family
+   # * realized.sample.par
+   # ----------------------------
+   n.ensemble.models <- ensemble.par.list$n.ensemble.models
+   ensemble.index <- 1:n.ensemble.models
+   ensemble.index <- sort(ensemble.index)
+   # ------------------
+   temp.filename <- paste(filename,".ensemble.index.RData",sep="")
+   load(file=temp.filename) #return.list
+   ens.realized.par <- return.list$realized.sample.par
+   resp.family <- return.list$resp.family
+   rm(return.list)
+   ## KFW gc()
+# -------------------------
+# Extract Time Intervals
+# DMF - 3.17.10
+# 	added logic
+# -------------------------
+	time.intervals <- sort(unique(ensemble.par.list$design.summary$time.intervals))
+	time.interval.vect <- ensemble.par.list$design.summary$time.intervals
+	# These two parametes define the time intervals 
+	# for each unique time interval in the ST ensemble
+	# ==> vector of length(time.intervals)
+	# ---------------------
+	begin.pred.window <-  ensemble.par.list$begin.pred.window
+	end.pred.window <-  ensemble.par.list$end.pred.window
+	# -----------------------------------------------------------
+	# 3.13.10 
+	# Instead of looping over all temporal intervals
+	# I want to identify the subset of temporal intervals 
+	# that contain any of the prediction design!!!!
+	# 
+	# This should result in speed ups for many predicitons 
+	# where the prediction design covers a relatively 
+	# small interval of times. Eg. ST matrix and ST PD predictions. 
+	# -----------------------------------------------------------
+		ttt.intervals <- rep(FALSE, length(time.intervals))
+		for (iii.time in time.intervals){
+	     	winter <- begin.pred.window[iii.time] > end.pred.window[iii.time]
+	        if (!winter) {
+	            pd.season.index <-  begin.pred.window[iii.time] <= 
+	            	prediction.design.jdates &
+					prediction.design.jdates <= end.pred.window[iii.time]
+	         	}
+		  	else {
+	            pd.season.index <-  begin.pred.window[iii.time] <= 
+	            	prediction.design.jdates |
+					prediction.design.jdates <= end.pred.window[iii.time]
+	         	}
+			if (sum(pd.season.index) > 0) ttt.intervals[iii.time] <- TRUE
+		}
+		# Select only the time intervals needed to cover pred.design
+		time.intervals <- time.intervals[ttt.intervals]  
+   # ----------------------------------------
+   # Initialize Results/Prediction Vectors
+   # ----------------------------------------
+   ens.count <- rep(0, nrow(prediction.design))
+   ens.moment1<- rep(0, nrow(prediction.design))
+   ens.moment2<- rep(0, nrow(prediction.design))
+   if (matrix.flag==TRUE){
+      ensemble.pred.matrix <- matrix(NA, NROW(prediction.design), NROW(ensemble.par.list$design.summary))
+   }
+
+   # ----------------------------------------------------------
+   # Init: Load First Ensemble Model
+   # -----------------------------------------------------------
+   iii <- 1
+   num.txt <- formatC(iii,format="fg", width=6)
+   num.txt <- chartr(" ","0",num.txt)
+   temp.filename <- paste(filename,".",num.txt,".RData",sep="")
+   load( file=temp.filename)
+
+   # Save ensemble rpart.object stub
+   ## f.rpart is coming from loaded(RData) objects 
+   ttt.rpart <- f.rpart
+
+   # ----------------------------------------------------------
+   # A) Loop Over All Seasons & ID Models within Given Season
+   # -----------------------------------------------------------
+   for (iii.time in time.intervals){
+      seasonal.model.index <- c(1:length(time.interval.vect))[time.interval.vect == iii.time]
+      # ----------------------------------------------------------
+      # B) Loop over all MODELS in Specified Season &
+      #     Search for Subset of Data within Prediction Season
+      # -----------------------------------------------------------
+      for (ensemble.model.number in seasonal.model.index){
+         winter <- begin.pred.window[iii.time] > end.pred.window[iii.time]
+         if (!winter) {
+            pd.season.index <-  begin.pred.window[iii.time] <= prediction.design.jdates &
+				prediction.design.jdates <= end.pred.window[iii.time]
+         }
+	 else {
+            pd.season.index <-  begin.pred.window[iii.time] <= prediction.design.jdates |
+				prediction.design.jdates <= end.pred.window[iii.time]
+         }
+         # --------------------------------------------------------
+         # 1) Point in Polygon: Are seasonal data in Model Region?
+         # --------------------------------------------------------
+	 if (sum(pd.season.index) > 0){
+	    # -----------------------------------------------------------
+	    # Select Region
+	    # -----------------------------------------------------------
+            region.number <- ensemble.par.list$design.summary$region.number[ensemble.model.number]
+	    region.mc <- ensemble.par.list$design.summary$region.mc[ensemble.model.number]
+            t.interval <- ensemble.par.list$design.summary$time.intervals[ensemble.model.number]
+            r.index <- (ensemble.par.list$regional.polygons$region.mc == region.mc &
+			ensemble.par.list$regional.polygons$region.number == region.number &
+			ensemble.par.list$regional.polygons$time.intervals == t.interval	)
+            # Index into Prediction Design set
+            region.given.season.index <- point.in.rectangle(xxx = prediction.design.locs$x[pd.season.index],
+			                                  yyy = prediction.design.locs$y[pd.season.index],
+			                                  polygon.vertices = ensemble.par.list$regional.polygons[r.index,1:2])
+            # -------------------------------------------------------- 
+            # 2) Are there data in ensemble.model.number's REGION-SEASON ?
+            # -----------------------------------------------------------
+	    if (sum(region.given.season.index) > 0){
+		# -------------------------------------------------
+		# Numeric Indices:
+		#    superset/parent: Prediction.design
+		#    subset/child   : Regional-Seaonal data set
+		# -------------------------------------------------
+		seasonal.num.ind <- c(1:length(pd.season.index))[pd.season.index]
+		reg.sea.num.ind <- seasonal.num.ind[region.given.season.index]
+		# -------------------------------
+		# Regional-seasonal design
+		# ------------------------------
+                X.pred  <-  prediction.design[ reg.sea.num.ind, ]
+		# -------------------------------------------------
+		# check for Design Transformations, e.g. for basis rotation
+		# -------------------------------------------------
+		if (ensemble.par.list$sampling.par.list$ST.basis.rotation == TRUE){
+	           ttt <- rotate.ST.basis.pred(X = X.pred, realized.par=ens.realized.par[,ensemble.model.number])
+		   X.pred <- ttt$X
+		   rm(ttt)
+                   ## KFW gc()
+		}
+		# ----------------------------------------------------------
+		# Load/Construct rpart.object
+		# -----------------------------------------------------------
+
+		if  (ensemble.model.number != 1){
+			# ---------------------------------
+			# 5.20.09 
+			# Adding Error Trapping code 
+			# to deal with the following mysterious message
+			# Error in f.rpart$frame <- rpart.parts$frame :  
+			# value of 'SET_ATTRIB' must be a pairlist or NULL, not a 'character' 
+			# ---------------------------------
+			f.rpart <- try( pop.rpart(filename, ensemble.model.number, ttt.rpart) )
+			# If there is an error, try it again
+			if (class(f.rpart) == "try-error") {
+			   cat("rpart file read error \n")
+			   f.rpart <- try( pop.rpart(filename, ensemble.model.number, ttt.rpart) )
+			}
+		} # end ensemble.model.number != 1
+                else {
+		   f.rpart <- ttt.rpart
+                }
+
+		# -------------------------------------------------
+		# rpart Predict
+		# ------------------
+		# Note: the predict method for rpart will
+		# not make a prediction on a root node only.
+		# That is, if the rpart model is only a root node
+		# then I need to skip the call to predict - will generate an error
+		# and manually assign all pts the same prediction.
+		# --------------------
+		# 4.9.09
+		# Separate out case when bernoulli because
+		# it requires slightly different call to deal with two classes.
+		# -------------------------------------------------
+		#NROW(f.rpart$frame)
+		if (NROW(f.rpart$frame) == 1) {
+			if (resp.family == "bernoulli"){
+			   # yval is the predicted response
+			   # In the two class problem, the assumed coding is
+			   # a factor with levels "FALSE" and "TRUE".
+			   # rpart orders these alphabetically, so
+			   # 	The first class: FALSE
+			   # 	The second class: TRUE
+			   # So, if yval are predicted prob for the first class
+			   # i.e. FALSE, then I want to use 1-yval as the predicted value
+			   #  -------------------------------------------------------------
+			   ttt.rpart.pred <- rep((1-f.rpart$frame$yval), NROW(X.pred))
+			 }
+			 if (resp.family =="gaussian"){
+			    ttt.rpart.pred <- rep(f.rpart$frame$yval, NROW(X.pred))
+			 }# end gaussian
+		} #end stump predictions section
+		# ------------------------------------------
+  		# If there is more than just the root node
+    		# ------------------------------------------
+		if (NROW(f.rpart$frame) > 1) {
+			if (resp.family=="gaussian"){
+				ttt.rpart.pred <- predict(f.rpart,newdata=X.pred) # ...)
+			}
+			if (resp.family=="bernoulli"){
+				## ttt.rpart.pred.bern <- predict(f.rpart,newdata=X.pred, type="prob")
+
+				tryCatch ({
+                                   x.pred.attributes <- attributes(X.pred)
+                                   f.rpart.attributes <- attributes(f.rpart)
+
+                                   ## print("start of X.pred attributes")
+                                   ## print(x.pred.attributes)
+                                   ## print("end of X.pred attributes")
+
+                                   if (is.null(x.pred.attributes)) {
+                                      print("**** NULL X.pred attributes ***")
+                                   }
+
+                                   if (is.null(f.rpart.attributes)) {
+                                      print("**** NULL X.pred attributes ***")
+                                   }
+
+
+                                   ## print("start of f.rpart attributes")
+                                   ## print(f.rpart.attributes)
+                                   ## print("end of f.rpart attributes")
+                                   ## print(f.rpart)
+                                   ## print("======= before predict() ==================================================")
+
+                                   ttt.rpart.pred.bern <- predict(f.rpart,newdata=X.pred, type="prob");
+
+                                   ## print("after predict()")
+                                },
+                                error = function(ex) {
+                                   print("***** KFW start of catch block")
+
+                                   x.pred.attributes <- attributes(X.pred)
+                                   f.rpart.attributes <- attributes(f.rpart)
+
+                                   print("start of X.pred attributes")
+                                   print(x.pred.attributes)
+                                   print("end of X.pred attributes")
+                                   print("start of f.rpart attributes")
+                                   print(f.rpart.attributes)
+                                   print("end of f.rpart attributes")
+                                   print(f.rpart)
+                                   print("=========================================================")
+
+                                ##
+                                ##   print("---- prediction.design ---")
+                                ##
+                                ##   print(nrow(prediction.design))
+                                ##   print(ncol(prediction.design))
+                                ##
+                                ##   for (colIndex in 1:ncol(prediction.design)) {
+                                ##      message <- paste(colIndex, class(prediction.design[,colIndex]), sep="  ")
+                                ##      print(message)
+                                ##   }
+                                ##
+                                ##
+                                   stop("ERROR - bailing out!")
+                                },
+                                finally = {
+                                })
+
+	   			ttt.rpart.pred <- ttt.rpart.pred.bern[,2]
+	   		}
+			if (resp.family=="poisson") {
+				ttt.rpart.pred <- predict(f.rpart,newdata=X.pred,type="vector") #,...)
+			}
+		}
+
+                #---------------------------------------------------------------
+                # 3. Accumulate Predictions
+                # --------------------------------------------------------------
+	        ens.count[reg.sea.num.ind] <- ens.count[reg.sea.num.ind] + 1
+	        ens.moment1[reg.sea.num.ind] <- ens.moment1[reg.sea.num.ind] + ttt.rpart.pred
+	        ens.moment2[reg.sea.num.ind] <- ens.moment2[reg.sea.num.ind] + ttt.rpart.pred^2
+	        # ----------------------------
+	        #   nrow = NROW(prediction.design)
+	        #   ncol = number models in ensemble models
+	        # ----------------------------
+	        if (matrix.flag == TRUE){
+	           ensemble.pred.matrix[reg.sea.num.ind,ensemble.model.number] <- ttt.rpart.pred
+	        }
+
+                rm(X.pred)
+	    } # End REGION-SEASON Prediction
+         } # if data in REGION-SEASON subset
+
+         ## KFW gc()
+      } # end loop over Seasonal ensemble models
+   } # end time interval loop
+
+   # ----------------------------------------------------------
+   # Return Prediction Matrix
+   # -----------------------------------------------------------
+   # 3.18.09 Modifications
+   # -----------------------------------
+   ens.mean <-  rep(NA, NROW(prediction.design))
+   ens.var <-  rep(NA, NROW(prediction.design))
+   na.ind <- (ens.count > 0)
+   ens.mean[na.ind] <- ens.moment1[na.ind]/ens.count[na.ind]
+   na.ind2 <- (ens.count >= 2)
+   ens.var[na.ind2] <- ens.moment2[na.ind2]/ (ens.count[na.ind2] -1) -
+			(ens.mean[na.ind2]^2)*(ens.count[na.ind2])/(ens.count[na.ind2] -1)
+
+   if (matrix.flag == TRUE) {
+      return.list <- list(
+      	mean = ens.mean, 
+      	sd = sqrt(ens.var), 
+      	count = ens.count, 
+      	matrix = ensemble.pred.matrix, 
+      	function.call = function.call)
+   }
+   else {
+      return.list <- list(
+      	mean = ens.mean, 
+      	sd = sqrt(ens.var), 
+      	count = ens.count, 
+      	function.call = function.call)
+   }
+
+   if (matrix.flag==TRUE){
+      rm(ensemble.pred.matrix)
+   }
+
+   ## kfw gc()
+
+   return(return.list)
+}# End FUNCTION
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+
+
+
+
+
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# BS.RPART Random Space-Time Prediction Function
+# --------------------------------------------------------------------------
+# 1.15.07
+# 7.16.08 - quick & dirty modifications to take into
+# 					account basis rotations performed in the function
+#						ST.BDT.test (located in this file)
+# 1.8.09 - reorganization
+#
+# This function performs two related tasks:
+#
+# 	1) Predictor Conditioning
+# 	2) Time-Slice Predictions
+#
+# Predictor Conditioning:
+# -----------------------------
+# For many prediction tasks it is necessary to assign constant
+# values to certain predictors. E.g. constructing a prediction
+# design to control for observation effort - by seting effort constant.
+# The conditioning variables and corresponding values are defined
+#  in the conditioning.vars list.  If the conditioning variable is not
+# present in the predictor.design data frame, it will be added.
+#
+# Time-Slice predictions.
+# ----------------------------
+# We loop though all time slices (defined by julian date AND year)
+# and make the full set of (spatial) predictions. This simple looping
+# proceedure was designed to handle large prediction vectors.
+# For this reason, we decided to cycle throught each ensemble model
+# for EACH time slice. This takes more time to load and reload all
+# of the models, but requires less memory to hold the predictions
+# for ALL time slices simultaneously.
+#
+# The results, i.e. the prediction vectors, are saved into sequentially
+#  numbered  files, in the same order as the temporal sequence.
+#
+# Like the other functions I am writing, I will begin by keeping
+# this as simple as possible. KISS!!
+#
+# INPUT
+# ------------
+# 	predictor.design  <- data frame of predictors. Including YEAR, JDATE,
+#					and the conditioning variables, this should have
+# 					the same number of predictors are the
+# 					predictors used in the models.
+#   --------------
+# 	information about the ensemble models
+#   ------------------------------------
+#		model.predictor.names,
+# 		bs.rpart.name,
+#		bs.rpart.dir,
+#		btrials,
+#  Save Results to directory and name
+#			# --------------
+#			save.name,
+#			save.dir,
+# Define Temporal Sequence
+# ** jdate.seq and year.seq must be of the same length
+#     the code cycles through all pairs of values.
+#			jdate.seq,
+#			year.seq,
+# Conditioning Variable List - This is how we control for the Observation
+# 							process.
+#			conditioning.vars = NULL
+#
+# OUTPUT
+# ------------
+#		call = call,
+#		# Saved predictions
+#			save.name=save.name,
+#			save.dir=save.dir,
+#		# Temporal Sequence
+#			jdate.seq=jdate.seq,
+#			year.seq = year.seq)
+#
+# To do:
+# ---------
+# I need to describe the format of D.pred in detail so that I can
+# generate new sets. Part of this will be to point to/describe the
+# process that Roger and I went through to generate this data.
+#
+# A simple way to do this is to pass the dtm object which
+# should include the names of the predictors!
+# It will also include the bs.trial, and the bs.path and file
+# name information!!!
+#
+# ERROR occurs when there is a predictor.name in "model.predictor.names"
+# but that predictor does not occurr in predictor.design or the
+# conditioning variables. should this happen?
+# If so, I should pass a more intelligible error message to the user.
+#
+# NOTE:
+# When model predicts an NA (e.g. STEM does this when location
+# has no support , i.e. an extrapolation) then this function
+#will just pass NA's through $mean & $sd
+#
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+predict.st.matrix <- function(
+              prediction.design,
+		    prediction.design.locs,   
+		    #prediction.design.jdates = NULL,  # required for STEM
+			#--------------
+			model.predictor.names,
+			model.filename,
+			ensemble.par.list,
+			# --------------
+			save.name,
+		# Temporal Sequence
+			jdate.seq,
+			year.seq,
+		# Conditioning Vars - Observation Process Design
+			conditioning.vars = NULL){
+# ---------------------------------------------------
+#			prediction.design = pred.data$D.pred
+#			prediction.design.locs = pred.data$locs
+#			#--------------
+#			model.predictor.names = names(train.data$X)
+#			model.filename = ensemble.model.filename
+#			ensemble.par.list = ensemble.par.list
+#			# --------------
+#			save.name = st.pred.filename
+#			# Temporal Sequence
+#			jdate.seq =jdate.seq
+#			year.seq =year.seq
+#			# Conditioning Vars - Observation Process Design
+#			conditioning.vars = conditioning.vars
+# ---------------------------------------------------------
+# Inits
+# ---------------------------------------------------------
+	  function.call <- match.call()	  
+## ------------------------------------------------------------------------
+# Assign and/or Add  Conditioning variables as necessary
+#		Verified for class numeric
+#		Check to make sure that this works with factors -
+#     especially if the conditioning value is a level
+#     that has NOT been used for training!!!
+# ------------------------------------------------------------------------
+	for (iii in 1:length(conditioning.vars)) {
+		# When conditioning predictor is already in predictor.design
+		if (names(conditioning.vars)[iii] %in% names(prediction.design) ) {
+			pred.index <- names(prediction.design)  %in% names(conditioning.vars)[iii]
+			prediction.design[ , pred.index] <- conditioning.vars[[iii]]
+			}
+		# When conditioning predictor is NOT in predictor.design
+		if (!(names(conditioning.vars)[iii] %in% names(prediction.design) )) {
+			ttt.names <- names(prediction.design)
+			ttt <- matrix(conditioning.vars[[iii]], NROW(prediction.design),1)
+		 	prediction.design <- data.frame(prediction.design,  ttt)
+		 	names(prediction.design) <- c(ttt.names,
+				names(conditioning.vars)[iii])
+			}
+		} # end iii
+
+# ------------------------------------------------------------------------
+# Check to see if any model.predictor.names are missing from predictor.design
+# ------------------------------------------------------------------------
+		# ID predictors in the predictor.design but not in the model.predictors
+		#setdiff(names(prediction.design), model.predictor.names)
+			# These are OK, just extraneous
+		# and the other way around
+		#setdiff(model.predictor.names,names(prediction.design))
+			# year and jdate are OK here, but anything else needs to be flagged
+
+# --------------------------------------------------------------------------
+# Loop over dates in design & make predicitons
+# --------------------------------------------------------------------------
+   for (iii in 1:length(jdate.seq)){
+  	    # Set prediction design jdate
+  	    prediction.design.jdates <- rep(jdate.seq[iii],NROW(prediction.design))
+	    # Check for predictors called JDATES & YEARS
+	    # If so, then impute prediction design values
+	    # ----------------------------------------------
+	    if ( c("JDATE") %in% model.predictor.names  ) 
+	    	 prediction.design$JDATE <- rep(jdate.seq[iii],NROW(prediction.design))
+	    if ( c("YEAR") %in% model.predictor.names ) 	 
+		 prediction.design$YEAR <- rep(year.seq[iii],NROW(prediction.design))
+         # -----------------------------------------------
+		# Ensemble predictions
+	     # -----------------------------------------------
+		#pred.Xp <- ensemble.par.list$predict.ensemble.function(
+		#	filename = model.filename,
+		#	ensemble.par.list =ensemble.par.list,
+		#	prediction.design=predictor.design)
+		# --------------------------------------
+		pred.Xp <- predict.ST.ensemble(
+			filename = model.filename,
+			ensemble.par.list,
+			prediction.design=prediction.design,
+			prediction.design.locs=prediction.design.locs,    # required for STEM
+			prediction.design.jdates=prediction.design.jdates,  # required for STEM
+			matrix.flag = FALSE)
+    	# --------------------------------------------------------------------------
+    	# Save predictions to files
+    	# --------------------------------------------------------------------------
+    	save.filename <- paste(save.name,".",iii,".RData",sep="")
+    	st.pred <- data.frame(
+					xxx = prediction.design.locs$x,
+					yyy = prediction.design.locs$y,
+					pred = pred.Xp$mean,
+					sd = pred.Xp$sd)
+    	save(st.pred,  file=save.filename) # st.pred
+    	# Compare to dput or other methods to see if
+    	# there is a size advantage
+	# ----------------------------------------------------
+  }    # end iii loop
+
+  # ------------------------------------------------------------
+  # Return Values
+  # ------------------------------------------------------------
+	return(function.call)
+} # end function
+# --------------------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------------------
+
+
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# Modify predict.st.matrix from stem.library.8.18.09.R
+# by 
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+predict.st.matrix.ebird.ref.data <- function(
+		prediction.design,
+		prediction.design.locs,   
+		#prediction.design.jdates = NULL,  # required for STEM
+			#--------------
+			model.predictor.names,
+			model.filename,
+			ensemble.par.list,
+			# --------------
+			save.name,
+		# Temporal Sequence
+			jdate.seq,
+			year.seq,
+		# Conditioning Vars - Observation Process Design
+			conditioning.vars = NULL){
+# ---------------------------------------------------
+#			prediction.design = pred.data$D.pred
+#			prediction.design.locs = pred.data$locs
+#			#--------------
+#			model.predictor.names = names(train.data$X)
+#			model.filename = ensemble.model.filename
+#			ensemble.par.list = ensemble.par.list
+#			# --------------
+#			save.name = st.pred.filename
+#			# Temporal Sequence
+#			jdate.seq =jdate.seq
+#			year.seq =year.seq
+#			# Conditioning Vars - Observation Process Design
+#			conditioning.vars = conditioning.vars
+# ---------------------------------------------------------
+# Inits
+# ---------------------------------------------------------
+	  function.call <- match.call()	  
+# ------------------------------------------------------------------------
+# Assign and/or Add  Conditioning variables as necessary
+#		Verified for class numeric
+#		Check to make sure that this works with factors -
+#     especially if the conditioning value is a level
+#     that has NOT been used for training!!!
+# ------------------------------------------------------------------------
+	for (iii in 1:length(conditioning.vars)) {
+		# When conditioning predictor is already in predictor.design
+		if (names(conditioning.vars)[iii] %in% names(prediction.design) ) {
+			pred.index <- names(prediction.design)  %in% names(conditioning.vars)[iii]
+			prediction.design[ , pred.index] <- conditioning.vars[[iii]]
+			}
+		# When conditioning predictor is NOT in predictor.design
+		if (!(names(conditioning.vars)[iii] %in% names(prediction.design) )) {
+			ttt.names <- names(prediction.design)
+			ttt <- matrix(conditioning.vars[[iii]], NROW(prediction.design),1)
+		 	prediction.design <- data.frame(prediction.design,  ttt)
+		 	names(prediction.design) <- c(ttt.names,
+				names(conditioning.vars)[iii])
+			}
+		} # end iii
+
+# ------------------------------------------------------------------------
+# Check to see if any model.predictor.names are missing from predictor.design
+# ------------------------------------------------------------------------
+		# ID predictors in the predictor.design but not in the model.predictors
+		#setdiff(names(prediction.design), model.predictor.names)
+			# These are OK, just extraneous
+		# and the other way around
+		#setdiff(model.predictor.names,names(prediction.design))
+			# year and jdate are OK here, but anything else needs to be flagged
+
+		## KFW 
+                ## vegetationIndexData <- read.csv(file="ebird_reference_data/processed_VI_Data_SRD.csv", na.strings = c("NA", "?"))
+		## KFW 
+
+# --------------------------------------------------------------------------
+# Loop over dates in design & make predicitons
+# --------------------------------------------------------------------------
+   for (iii in 1:length(jdate.seq)){
+	    # Set prediction design jdate
+  	    prediction.design.jdates <- rep(jdate.seq[iii],NROW(prediction.design))
+	    # Check for predictors called JDATES & YEARS
+	    # If so, then impute prediction design values
+	    # ----------------------------------------------
+	    if ( c("DAY") %in% model.predictor.names  ) 
+	    	 prediction.design$DAY <- rep(jdate.seq[iii],NROW(prediction.design))
+	    if ( c("YEAR") %in% model.predictor.names ) 	 
+		 prediction.design$YEAR <- rep(year.seq[iii],NROW(prediction.design))
+		 
+		# ----------------------------------------------------------------------------------------------------------------------
+		# 8.18.09 
+		# -----------------
+		# check for special ebird reference data predictors called 
+		# "caus_temp_avg"              "caus_temp_min"             
+		#[15] "caus_temp_max"              "caus_prec"                 
+		#[17] "caus_snow"     
+		#each of these records the climate variable value  ( e.g. snow depth ) 
+		# for month in which observation was made. so, here i 
+		# will assume that the requisite us climate are available and then 
+		# select the approtiate month for the 
+		# corresponding prediction design "observation". 
+		# ----------------------------------------------		 
+		if ( "CAUS_TEMP_AVG"  %in% model.predictor.names  ) {
+			month.index <- floor(jdate.seq[iii] / (366/12))+1 
+			num.txt <- formatC(month.index, format="fg",width=2)
+			num.txt <- chartr(" ","0",num.txt)
+			ttt.pred.name <- paste("CAUS_TEMP_AVG", num.txt,sep="")
+			## KFW prediction.design$CAUS_TEMP_AVG <- 
+			## KFW	prediction.design[ , names(prediction.design) %in% ttt.pred.name]
+
+			prediction.design$CAUS_TEMP_AVG <- 
+				as.numeric(prediction.design[ , names(prediction.design) %in% ttt.pred.name])
+			} # end if
+		if ( "CAUS_TEMP_MIN"  %in% model.predictor.names  ) {
+			month.index <- floor(jdate.seq[iii] / (366/12))+1 
+			num.txt <- formatC(month.index, format="fg",width=2)
+			num.txt <- chartr(" ","0",num.txt)
+			ttt.pred.name <- paste("CAUS_TEMP_MIN", num.txt,sep="")
+			## KFW prediction.design$CAUS_TEMP_MIN <- 
+			## KFW	prediction.design[ , names(prediction.design) %in% ttt.pred.name]
+
+			prediction.design$CAUS_TEMP_MIN <- 
+				as.numeric(prediction.design[ , names(prediction.design) %in% ttt.pred.name])
+			} # end if
+		if ( "CAUS_TEMP_MAX"  %in% model.predictor.names  ) {
+			month.index <- floor(jdate.seq[iii] / (366/12))+1 
+			num.txt <- formatC(month.index, format="fg",width=2)
+			num.txt <- chartr(" ","0",num.txt)
+			ttt.pred.name <- paste("CAUS_TEMP_MAX", num.txt,sep="")
+			## KFW prediction.design$CAUS_TEMP_MAX <- 
+			## KFW	prediction.design[ , names(prediction.design) %in% ttt.pred.name]
+
+			prediction.design$CAUS_TEMP_MAX <- 
+				as.numeric(prediction.design[ , names(prediction.design) %in% ttt.pred.name])
+			} # end if			
+		if ( "CAUS_PREC"  %in% model.predictor.names  ) {
+			month.index <- floor(jdate.seq[iii] / (366/12))+1 
+			num.txt <- formatC(month.index, format="fg",width=2)
+			num.txt <- chartr(" ","0",num.txt)
+			ttt.pred.name <- paste("CAUS_PREC", num.txt,sep="")
+			## KFW prediction.design$CAUS_PREC <- 
+			## KFW	prediction.design[ , names(prediction.design) %in% ttt.pred.name]
+
+			prediction.design$CAUS_PREC <- 
+				as.numeric(prediction.design[ , names(prediction.design) %in% ttt.pred.name])
+			} # end if						
+		if ( "CAUS_SNOW"  %in% model.predictor.names  ) {
+			month.index <- floor(jdate.seq[iii] / (366/12))+1 
+			num.txt <- formatC(month.index, format="fg",width=2)
+			num.txt <- chartr(" ","0",num.txt)
+			ttt.pred.name <- paste("CAUS_SNOW", num.txt,sep="")
+			# Check for Mean snow depth May - Sept 
+			snow.check <- month.index >=5 & month.index <=9
+			if (snow.check) 	ttt.pred <- rep(0,NROW(prediction.design)) 
+			if (!snow.check) 	ttt.pred <- 
+					prediction.design[ , names(prediction.design) %in% ttt.pred.name]						
+			## KFW prediction.design$CAUS_SNOW <- ttt.pred
+
+			prediction.design$CAUS_SNOW <- as.numeric(ttt.pred)
+			} # end if
+
+
+                ## KFW
+		if ( "NDVI"  %in% model.predictor.names  ) {
+                   ## viDataRecordMask <- vegetationIndexData$YEAR == year.seq[iii] &
+                   ##                     vegetationIndexData$DAY == jdate.seq[iii]  
+                
+                   ## prediction.design$NDVI <- as.numeric(vegetationIndexData$NDVI[viDataRecordMask])
+
+                   viDataRecordMask <- vegetationIndexData[,3] == year.seq[iii] &
+                                       vegetationIndexData[,4] == jdate.seq[iii]  
+                
+                   prediction.design$NDVI <- as.numeric(vegetationIndexData[viDataRecordMask, 5])
+
+
+                   ## print(year.seq[iii])
+                   ## print(jdate.seq[iii])
+                   ## print(prediction.design$NDVI)
+
+                   rm(viDataRecordMask)
+                }
+
+	        if ( "EVI"  %in% model.predictor.names  ) {
+                   viDataRecordMask <- vegetationIndexData$YEAR == year.seq[iii] &
+                                       vegetationIndexData$DAY == jdate.seq[iii]  
+
+	           prediction.design$EVI <- as.numeric(vegetationIndexData$EVI[viDataRecordMask])
+
+                   rm(viDataRecordMask)
+                }
+                ## KFW
+
+
+         # -----------------------------------------------
+		# Ensemble predictions
+	     # -----------------------------------------------
+		#pred.Xp <- ensemble.par.list$predict.ensemble.function(
+		#	filename = model.filename,
+		#	ensemble.par.list =ensemble.par.list,
+		#	prediction.design=predictor.design)
+		# --------------------------------------
+
+
+                ## print("predict.st.matrix.ebird.ref.data() calling predict.ST.ensemble()")
+
+		pred.Xp <- predict.ST.ensemble(
+			filename = model.filename,
+			ensemble.par.list,
+			prediction.design=prediction.design,
+			prediction.design.locs=prediction.design.locs,    # required for STEM
+			prediction.design.jdates=prediction.design.jdates,  # required for STEM
+			matrix.flag = FALSE)
+    	# --------------------------------------------------------------------------
+    	# Save predictions to files
+    	# --------------------------------------------------------------------------
+    	save.filename <- paste(save.name,".",iii,".RData",sep="")
+    	st.pred <- data.frame(
+					xxx = prediction.design.locs$x,
+					yyy = prediction.design.locs$y,
+					pred = pred.Xp$mean,
+					sd = pred.Xp$sd)
+    	save(st.pred,  file=save.filename) # st.pred
+    	# Compare to dput or other methods to see if
+    	# there is a size advantage
+	# ----------------------------------------------------
+  }    # end iii loop
+
+  # ------------------------------------------------------------
+  # Return Values
+  # ------------------------------------------------------------
+	return(st.pred)
+} # end function
+# --------------------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------------------
+
+
+
+# -------------------------------------------------------------------
+# Predict.pd.grid - Function to make Predictions over PD.grids
+# -------------------------------------------------------------------
+# Input
+# 	XX = DTM Design matrix
+#	pd.quant.grids = create.pd.grid obejct
+# 	nn.sample = # of randomly selected samples from XX
+# Output
+#  	list of predictions for each member of the create.pd.grid.object
+#
+# 5.4.09 
+# --------------------------------
+#  ** Got rid of "matrix" object - only using mean 
+#  ** STEM additions
+# 		construct updated prediction.design.locs & prediction.design.jdate 
+#  ** break appart & sum over nn.sample
+#  ** added logic to deal with PD of JDATE and (x,y) locs 
+#
+# TO DO: 
+# --------------------------------
+# ** collect PD sd estimates!
+# **	Need to Recode Categorical predictors
+# 	eg. if BCR was a predictor we would need to recode it 
+# 	to its proper level labels !!!!!
+# 	Currently, BCR is coded as the number of the LEVEL
+# 	xxx.grid[,2] <- levels(train.data$X$BCR)[xxx.grid[,2]]
+# ** 2.26.10
+#	I need to take a single random sample 
+# 	of size nn.sample from an index of length == nrows(prediction.design)
+# 	then add to it over the batch "samples".
+#	This instead of the multiple samples taken one batch at a time. 
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+STEM.partial.dependence <- function(
+	filename,
+	ensemble.par.list,
+	prediction.design,   	#XX,
+	prediction.design.locs,    # required for STEM
+	prediction.design.jdates,  # required for STEM	
+	partial.dependence.list,
+	continuous.resolution = 15,
+	nn.sample = 200,
+	batch.size =50 )
+{ # ----------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+# Test Formal Parameters
+# ------------------------------------------------------------------------------------------------------
+#	pd.list <- list( 
+#     		"NLCD01_N90A100R5", "JDATE", 
+#        # 2D Partials
+#     		c("x", "y"),         # lat x lon interaction
+#     		c("JDATE", "NLCD01_N90A100R5"))  # can we pick up change in time of sunrise? 
+#		filename = ensemble.model.filename
+#		ensemble.par.list = ensemble.par.list
+#		#XX = train.data$X,
+#		prediction.design=train.data$X   	#XX,
+#		prediction.design.locs=ensemble.par.list$ensemble.data.locs    # required for STEM
+#		prediction.design.jdates=ensemble.par.list$ensemble.data.jdates  # required for STEM
+#		partial.dependence.list=pd.list
+#		continuous.resolution = 30
+#		nn.sample = 500
+#		batch.size = 50	
+# ------------------------------------------------------------------------------------------------------
+# Inits Formal Parameters
+# ------------------------------------------------------------------------------------------------------
+	#temp.filename <- paste(filename,".ensemble.index.RData",sep="")
+	#load(file=temp.filename) #return.list
+	#bs.trials <- NCOL(return.list$ib.sample.index)
+	# Results
+   	XX <- prediction.design
+ 	pd.means <- vector(mode="list", length=length(partial.dependence.list))
+ 	pd.matrices <- vector(mode="list", length=length(partial.dependence.list))
+# ------------------------------------------------------------------------------------------------------
+# Compute Partial Dependence Quantile Grids
+# ------------------------------------------------------------------------------------------------------
+	pd.quant.grids <- create.pd.grid(
+				XX=XX,
+				i.var.list=partial.dependence.list,
+				continuous.resolution = continuous.resolution)
+# ------------------------------------------------------------------------------------------------------
+# Find factors in XX
+# 	Note : I can not use apply b/c XX is class data.frame
+# ------------------------------------------------------------------------------------------------------
+	XX.factor.ind <- rep(FALSE, NCOL(XX))
+	ttt <- XX[1,] # it is much faster to search a 1D data.frame!
+	for (ii in 1:NCOL(XX)) XX.factor.ind[ii] <- is.factor(ttt[,ii])
+	# Extract an index of column positions for factors (wo zeros!)
+ 	factor.index <-	as.numeric(XX.factor.ind)*seq(1,NCOL(XX))
+ 	factor.index <- factor.index[factor.index > 0 ]
+# ------------------------------------------------------------------------------------------------------
+# Loop Over PD list elements
+# ------------------------------------------------------------------------------------------------------
+for (iii in 1:length(pd.quant.grids)){
+	# Initialize Batch Result Vectors
+	ppp.batch <- 0
+	ppp.batch.count <- 0
+	# Calculate # of Batch Loops	 
+	nnn.batch <- floor(nn.sample/batch.size) + 
+	                 as.numeric(ceiling(nn.sample/batch.size) > 
+                          floor(nn.sample/batch.size))	  
+# Begin Batch loop Here
+# -------------------------------
+for ( iii.batch in 1:nnn.batch){
+# -------------------------------
+     batch.sample.size <- min(batch.size, (nn.sample - (iii.batch-1)*batch.size)) 
+	# ------------------------------------------------------------------------------------------------------
+	# Random Sample of Data Rows (same sample for all PD elements)
+	# ------------------------------------------------------------------------------------------------------
+	    # Sample without replacement from data rows
+	    if (batch.sample.size  >= NROW(XX))	
+	    	  sample.index <- sample(1:NROW(XX), batch.sample.size, replace = TRUE)
+	    if (batch.sample.size < NROW(XX))
+	    	sample.index <- sample(1:NROW(XX), batch.sample.size, replace = FALSE)
+	    #dim(XX.sample)
+	# ------------------------------------
+	# 1. Expand Quantile Grid into PD Prediction Design
+	# 2. BDT Predictions
+	# 3. Assemble Results
+	# ------------------------------------
+	i.var <- match( names(pd.quant.grids[[iii]]), names(XX))
+	XX.sample <- XX[sample.index, setdiff(names(XX), names(XX)[i.var]) ]
+	pd.grid <- pd.quant.grids[[iii]]
+	 # ----------------------------
+	 # NOTE** PD design can get big = batch.sample.size * length(pd.grid)
+	# ------------------------------------------------------------------------------------------------------
+	# Construct Partial Dependence Prediction Data Frame
+	# 	NOTE: the use of data.matrix converts factors to numerics
+	# ------------------------------------------------------------------------------------------------------
+	# Stack Randomly Sampled Data Rows
+	XX.stack <- kronecker( matrix(1, NROW(pd.grid), 1),
+    						data.matrix(XX.sample))
+	XX.stack <- as.data.frame(XX.stack)
+	names(XX.stack) <- names(XX.sample)
+	# Stack Partial Dependence Grids
+	pd.stack <- kronecker( data.matrix(pd.grid), matrix(1, batch.sample.size, 1))
+	pd.stack <- as.data.frame(pd.stack)
+	names(pd.stack) <- names(pd.grid)
+	PD.prediction.frame <- cbind(pd.stack,XX.stack)
+	# -------------------------------------------
+	# Stack Location & JDATE indices
+	# Stack Randomly Sampled Data Rows
+	XX.locs.sample <- prediction.design.locs[sample.index,]
+	XX.locs.stack <- kronecker( matrix(1, NROW(pd.grid), 1),
+    						data.matrix(XX.locs.sample))
+	XX.locs.stack <- as.data.frame(XX.locs.stack)
+	names(XX.locs.stack) <- names(XX.locs.sample)	
+	# -----------
+	XX.jdates.sample <- prediction.design.jdates[sample.index]
+	XX.jdates.stack <- kronecker( matrix(1, NROW(pd.grid), 1),
+    						data.matrix(XX.jdates.sample))
+	# -------------------------------------------
+	# **** Check to see if i.var is an index variable. 
+	# Currently the ST index variable names are hardcoded to " x, y, or JDATE "
+	#
+	# modified 10.20.09
+	#
+	# If so, then modify parameter indices accordingly 
+	# ** Check out the flexible logic - this will work 
+	# 	for any pd.list! 
+	# -------------------------------------------    						
+	#    	if ("DAY" %in% names(XX)[i.var]) XX.jdates.stack <- pd.stack$DAY
+	#    	if ("x" %in% names(XX)[i.var]) XX.locs.stack[,1] <- pd.stack$x
+	#    	if ("y" %in% names(XX)[i.var]) XX.locs.stack[,2] <- pd.stack$y
+	# modified 02.17.10
+	# -------------------
+	# With the separate index variables, there is no need to 
+	# treat them specially, whether or not the same index 
+	# variables are used as predictors. 
+	# Therefore, I removed the lines above. 	
+	
+				   					   					     	     							
+	# ------------------------------------------------------------------------------------------------------
+	# Reconstruct Factor structure for data.frame
+	# ------------------------------------------------------------------------------------------------------
+	# XX = original data frame that may include factors
+	# PD.prediction.frame = the data.frame currently with numeric
+	#	values for all predictors. The prediction data.frame needs
+	#	to have the same column/predictor structure as XX
+	# ------------------------------------------------
+	# 1) Reorder PD.prediction.frame to match XX
+	col.order <- match( names(XX), names(PD.prediction.frame))
+		PD.prediction.frame <- PD.prediction.frame[,col.order]
+		# 2) Convert PD.prediction.frame cols to factors
+		for (i in factor.index) {
+			PD.prediction.frame[,i] <-
+			factor(levels(XX[,i])[PD.prediction.frame[,i]],
+				levels=levels(XX[,i]))
+				}
+	# ------------------------------------------------------------------------------------------------------
+	# Ensemble PD Predictions
+	# ------------------------------------------------------------------------------------------------------
+	ttt.pred <- predict.ST.ensemble(
+		filename= filename, # filename of ensemble & index file
+		ensemble.par.list = ensemble.par.list,
+		prediction.design= PD.prediction.frame,
+		prediction.design.locs=XX.locs.stack,    # required for STEM
+		prediction.design.jdates=XX.jdates.stack,  # required for STEM
+		matrix.flag = FALSE)
+	pred.X <- ttt.pred$mean	
+	# --------------------------------------------
+	# Average to get Ensemble average PD estimates
+	# --------------------------------------------
+		pred.index <- (rep(c(1:NROW(pd.grid)),each=batch.sample.size))
+	 	ppp <- tapply(pred.X, pred.index, sum, na.rm=T)
+	 	ppp.count <-  tapply(!is.na(pred.X), pred.index, sum, na.rm=T)
+	# ---------------------------------
+	# Collect the mean (first moment + count) 
+	# across batch of partial prediction jobs
+	# ---------------------------------	
+	 	ppp.batch <- ppp.batch + ppp
+	 	ppp.batch.count <- ppp.batch.count + ppp.count
+	# ---------------------------------
+	# 2.26.10 Cleanup
+	# 	(incomplete)
+	# ---------------------------------	
+	rm(ttt.pred, XX.stack,pd.stack,PD.prediction.frame, 
+		XX.locs.stack, XX.jdates.stack)
+	## KFW gc()
+
+# end Batch loop Here
+# -------------------------
+} # end iii.batch
+# ------------------------- 	
+ 	if (sum(ppp.batch.count==0) > 0) 
+ 	   warning(paste("STEM.partial.dependence: unsupported",
+	     "partial predictions, ppp.batch.count==0 ")) 
+	 # Calculate Mean Value and Final Count(support)
+	ppp <- ppp.batch/ppp.batch.count
+ 	# -------------------------------	
+ 	# recode pd.grid factors
+	f.factor <- rep(FALSE, NCOL(pd.grid))
+	for (i in 1:NCOL(pd.grid)) {
+		col.index <- match( names(pd.grid)[i], names(XX))
+		if (!is.numeric( XX[,col.index] )) {
+			f.factor[i] <- TRUE
+		#if (names(pd.grid[i]) %in% names(XX)[factor.index])
+			pd.grid[,i] <-
+				factor(levels(XX[,col.index])[pd.grid[,i]],
+					levels=levels(XX[,col.index]))}
+	} #end for i - search for factors
+	# Reassociate pd.grid with predictions
+	pdf.grid <- data.frame(pd.grid, pred=ppp)
+	# -----------------------------------
+	# Store results in PD.list
+	# -----------------------------------
+	# pd.means = the Partial Dependence Estimate averaged over bags
+	# pd.matrices = the PD estimates, one col per bag/model
+  	pd.means[[iii]] <- pdf.grid
+  	#pd.matrices[[iii]] <- pdf.grid.matrix
+	#names(pdf.grid)
+	#dim(pdf.grid)
+} # end iii
+# -----------------
+return(list(
+      pd.quant.grids=pd.quant.grids,
+      pd.means=pd.means))
+      #pd.matrices=pd.matrices))
+} # end function
+# -------------------------------------------------------------------
+# ---------------------------------------------------------------------
+
+
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+# Plot STEM Temporal Design
+# ---------------------------------------------------------------------------------------------------------------------
+plot.STEM.temporal.design<- function(
+      ensemble.par.list)
+      #ensemble.data,
+      #mc.region.x.time.index=1, # value of nnn.spatial.mc)
+      #...) # pass through plotting parameters?
+{# ---------------------------------------------------------
+		#ensemble.par.list
+		p.min <- -1.5
+		p.max <- 1.5
+	# -----------------------------------------------------
+	# Central Julian Calendar Circle
+	# ------------------------------------------------------
+		nnn <- 1000
+		radian.seq <- seq(from=0, to=2*pi, length=nnn)
+		plot( cos(radian.seq),
+			sin(radian.seq),
+				type="l",
+				lwd=3.0,
+				xlab=" ",
+				ylab=" ",
+				xlim = c(p.min,p.max),
+				ylim = c(p.min, p.max),
+				axes = FALSE)
+	# ---------------------------------------------------------
+	# Convert Temporal Sequence times to POSIX
+	# ---------------------------------------------------------
+		#text( -.25, .75,
+		#		pos=4, # text is to the left of location
+		#		cex = 1.5,
+		#		labels=c("Dec/Jan") )
+		# Add notches at 3,6,9, & 12 o'clock
+		n.notches <- 12
+		radian.seq <- seq(from=pi/2, to=5*pi/2, length=(n.notches+1))
+		jdate.ttt <- 365 - radian.seq/2/pi *365 +  radian.seq[1]/2/pi *365 + 1
+		jdate.ttt[jdate.ttt > 365]  <- jdate.ttt[jdate.ttt > 365] -365
+		jdate.ttt <- jdate.ttt[1:n.notches]
+		p.time <- strptime( x=paste(round(jdate.ttt)), "%j")
+		# Nice function to convert DateTime Classes
+		month.text <- months(p.time, abbreviate = TRUE)
+		date.names <- paste(month.text, " ",p.time$mday,sep="")
+		#p.time
+		#month.text
+		#date.names
+		ttt.min <- 1.0
+		ttt.max <- 1.1
+		inside.scale <- 0.9
+		for (iii in 1:n.notches){
+			lines(  c(ttt.min*cos(radian.seq[iii]), ttt.max*cos(radian.seq[iii])),
+					c(ttt.min*sin(radian.seq[iii]), ttt.max*sin(radian.seq[iii])),
+					lwd=2.0)
+			text( inside.scale* cos(radian.seq[iii]) ,
+				 inside.scale*sin(radian.seq[iii]),
+		#		pos=4, # text is to the left of location
+		#		cex = 1.5,
+				labels=c(month.text[iii]) )
+					}
+	# ---------------------------------------------------------
+	# Add Shingles
+	# ---------------------------------------------------------
+	nnn <- length(ensemble.par.list$begin.window)
+	#nnn <- 1
+	inner.radius <- 1.0
+	outer.radius <- 1.5
+	training.window.color <- "blue"
+		inner.pred.radius <- inner.radius + 0.1
+		outer.pred.radius <- outer.radius - 0.1
+	pred.window.color <- "red"
+	# Convert Julian dates into positions on Julian Calendar
+	begin.window.radians <- ensemble.par.list$end.window/365*2*pi + pi/2
+	end.window.radians <- ensemble.par.list$begin.window/365*2*pi + pi/2
+	begin.pred.window.radians <- ensemble.par.list$begin.pred.window/365*2*pi + pi/2
+	end.pred.window.radians <- ensemble.par.list$end.pred.window/365*2*pi + pi/2
+	for (iii in 1:nnn){
+		lines(  c( inner.radius*cos(begin.window.radians [iii]),
+					outer.radius*cos(end.window.radians [iii])),
+				c( inner.radius*sin(begin.window.radians [iii]),
+					outer.radius*sin(end.window.radians [iii])),
+					lwd=2.0,
+					col=training.window.color)
+		#lines(  c( inner.pred.radius*cos(begin.pred.window.radians [iii]),
+		#			outer.pred.radius*cos(end.pred.window.radians [iii])),
+		#		c( inner.pred.radius*sin(begin.pred.window.radians [iii]),
+		#			outer.pred.radius*sin(end.pred.window.radians [iii])),
+		#			lwd=2.0,
+		#			col=pred.window.color)
+		}
+	title(main = paste("STEM Temporal Design"),
+		font.main=4, line=2, cex.main=2.0 )
+
+
+ # ---------------------------------------------------------
+    return()
+# ---------------------------------------------------------------------------------------------------------------------
+}# end plot ST ensemble Function
+# ---------------------------------------------------------------------------------------------------------------------
+# ---------------------------------------------------------------------------------------------------------------------
+
+
+
+
+# ---------------------------------------------------------------------------
+# FUNCTION: Plot STEM Spatial Design
+# --------------------------------------
+# Plots a sinlge realization of the STEM Spatial design
+# identified & indexed by its mc.region and time.interval values.
+#
+#	# -------------------------------
+#	regional.polygons <- rbind(regional.polygons,
+#	   data.frame(
+#	     	    regional.rectangle,
+#           	    region.number=rep(iii, NROW(regional.rectangle)),
+#          	    region.mc = iii.mc.region,
+#          	    time.intervals=iii.interval))
+# ----------------------------------------------------------------------------
+plot.ST.ensemble <- function(
+      ensemble.par.list,
+      # Like JDATE-YEAR.SEQ's These two vectors
+      # define an index PAIR into the ensemble
+      # This means that these have to be the same length!!!!
+      # ----------------------------------------------------
+	 mc.regions,
+	 time.intervals,
+      ...) # pass through plotting parameters?
+{# ---------------------------------------------------------
+    # mc.regions = c(1)
+    # time.intervals = c(2)
+# -------------------------
+# Inits
+# ------------------------
+      require(maps)
+      regional.polygons <- ensemble.par.list$regional.polygons
+      xxx <- regional.polygons$x
+      yyy <- regional.polygons$y
+      # -------------------------
+      # Plot clusters
+      # ------------------------
+	 # Divergent Colors from RColorBrewer
+	 col.names <- c( "#E41A1C", "#377EB8", "#4DAF4A",
+  					 "#984EA3", "#FF7F00", #"#FFFF33", Remove yellow!!
+  					 "#A65628", "#F781BF", "#999999",
+  					 "#66C2A5", "#FC8D62", "#8DA0CB",
+  					 "#E78AC3", "#A6D854", "#FFD92F",
+  					 "#E5C494", "#B3B3B3")
+	 # Repeat colors for large sets of polygons
+	 col.names <- rep( col.names, times=1000)
+       # Intialize Plotting Region
+      plot(xxx, yyy, type="n", ...)
+ 	map('state',add=TRUE, lwd=2, col="yellow")
+	map('state',add=TRUE, lwd=1, col="black")
+	# ------------------------------------------------
+	for (jjj in length(time.intervals)){
+	     ttt.index <- regional.polygons$region.mc == mc.regions[jjj] &
+		         	  regional.polygons$time.intervals == time.intervals[jjj]
+		ttt.poly <- regional.polygons[ttt.index,]
+		n.region <- max(ttt.poly$region.number)
+		for (iii in 1:n.region){
+		    polygon(ttt.poly[ttt.poly$region.number == iii,],
+		        			 border = col.names[iii],
+					      lwd=2.0,
+						 density=NULL)
+		    #cat("polygon=",iii," Enter to continue","\n") # prompt
+		    #ttt.scan <-scan(n=1,what="character")
+		} # end iii
+	} # end jjj
+	# ------------------------------------------------
+	#points(region.centers, col="white", cex=1.5)
+	#points(ensemble.data$X$x,ensemble.data$X$y, col="black", cex=.25)
+	#points(ensemble.data$X$x,ensemble.data$X$y, col="white", cex=.25)
+# ---------------------------------------------------------
+    return()
+# ---------------------------------------------------------
+}# end plot ST ensemble Function
+# ---------------------------------------------------------
+
+
+                 
diff --git a/contrib/stem/code/stem.library.ST.R b/contrib/stem/code/stem.library.ST.R
new file mode 100644
index 0000000..f795bad
--- /dev/null
+++ b/contrib/stem/code/stem.library.ST.R
@@ -0,0 +1,2430 @@
+
+
+
+# ------------------------------------------------------------------
+# 10.8.08
+#  Adding 
+#	Point in ploygon Function
+# (This is a more basic/generic version of the 
+# the point.in.polygon.contours() function in 
+# rel.abundance.mapping.functions3.r. 
+#
+#
+# 10.6.08
+# Adding Functions: 
+#	Point in ShapeFile Function
+# 		NOTE: This function is based on the NCEAS function XXXXXX
+# 		except that I needed to fix the donut hole problem with 
+# 		the shape files. I need to finish documenting this and 
+# 		send it back to those guys!
+# Initialize Map Gridding
+# Needed ==> a more generic regional.cluster.cloropleth.map()
+# 	
+# ------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------------------------------
+# SBT: Better ST Maps
+# -------------------------------------
+# 9.9.08 
+#
+# Produce maps and save them to disk.  
+# Based on "st.bdt.surface.maps.9.9.R"
+#
+# 10.20.08 Modifications
+# -----------------------------------------
+# 1) Added code include the leading zeros on the map.filename 
+# 	This produces files that will be sequentially ordered in file browsers!
+# 	Small but important "convenience" modification. 
+# 2) Also added call to the function initizalize.map.grid() in 
+# 	st.clustering.functions.2.R format maps automatically
+# 3) Assumed additional parameters 
+# 	begin.seq
+# 	end.seq
+#
+# 10/24/08
+# -------------------
+# * Added code & switch to deal with sqrt transform
+# 	# Response Transformation code: resp.transformation.code <- "sqrt"
+# * Excluded the extraneous spatial density contours
+#
+# 11/19/08
+# -------------
+# google earth maps - transparent & no margin plots. 
+# 
+#	
+# REQUIRES 
+# ------------------------
+#"eBird taxonomy file.csv",
+#"yelwar.East.travel.spatial.density.contours.RData",se
+	#~ # ------------------------
+	#~ # control.data
+	#~ # ------------------------
+	#~ # (spp.code, spatial.extent, exp.tag, ST.group)
+	#~ # ST groups
+	#~ # 	A - 156 - 1 per week 2004-06
+	#~ # 	B - 36 - 1 per month 2004 -2006
+	#~ # 	C -26 - 1per 2 weeks 2006
+	#~ # ------------------------
+	#~ "amekes", US, stbdt.8.19., B
+	#~ "buffle",US, stbdt.8.19., C
+	#~ "buwwar",East, stbdt.8.19., B	
+	#~ "barswa", US, stbdt.9.3.,C
+	#~ "cavswa", SoTX, stbdt.9.3.,C	
+	#~ "cliswa", US, stbdt.9.3.,C
+#------------------------------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------------------------------
+
+
+
+## KFW
+require(fields)
+
+
+
+
+
+
+
+# These are legacy code for spatial contours
+# They will need to be intergrated with current functions
+# if this functions stays!
+# -------------------------------------------------------------------
+# Poisson Predictive Performance Measures
+# -------------------------------------------------------------------
+# yyy = observations
+# ppp = predicted value - response scale 
+#
+# Verified - replicated GAM deviance calcuatlions for poisson
+poisson.deviance <- function(yyy,ppp){
+      # if predictions (ppp) equal zero we will get underflow 
+      # problems from log function. 
+      # -------------
+      # break deviance into two pieces - where obs == 0 
+      ttt.zero <- (yyy == 0)
+      ttt.pos <- (yyy > 0)
+      dev1 <- sum( (yyy[ttt.zero] - ppp[ttt.zero]) )
+      dev2 <- sum( yyy[ttt.pos]*(log(yyy[ttt.pos])-log(ppp[ttt.pos])) - 
+                  (yyy[ttt.pos] - ppp[ttt.pos]))
+      dev <- 2*(dev2 - dev1)
+      return(dev)
+      } 
+
+deviance.explained <- function(yyy,ppp){
+      null.deviance <- poisson.deviance(yyy, rep(mean(yyy),length(yyy) ))
+      obs.deviance <- poisson.deviance(yyy,ppp)
+      deviance.explained <- (null.deviance - obs.deviance)/null.deviance
+      de <- list(deviance.explained=deviance.explained, 
+                obs.deviance=obs.deviance, 
+                null.deviance=null.deviance)
+      return(de) 
+      }
+           
+poisson.pearson <- function(yyy,ppp){
+      p <- sum( ((yyy - ppp)^2)/(ppp) )
+      return(p)
+      }    
+      
+  # Accuracy of 0-1 Classification for Poisson Regression 
+  # ---------------------------------------------------------
+  poisson.accuracy <-  function(yyy, ppp, threshold=0.5){
+      y.binary <- as.numeric(yyy > threshold)
+      p.binary <- as.numeric(ppp > threshold)
+      acc <- 1-sum(abs(y.binary - p.binary))/length(y.binary)  
+      return(acc)
+      }    
+# -------------------------------------------------------------------
+# -------------------------------------------------------------------
+
+
+
+
+
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+# Measure Predictive performance as a function of Spatial Scale
+# -----------------------------------------------------------------------------
+# Daniel Fink 
+# 1.9.08
+# 2.7.08 modifications 
+#
+# Description
+# -----------------
+# This function Measures the predictive performance as a function of
+# Spatial Scale. It takes the bs.model object from a single test/training
+# split and bins/grids this data across a range of scales. Performance 
+# is computed and recorded at each scale and passed back to the user. 
+# Predictive performance is computed on the test set. 
+# Predictive performance may also be plotted as a function of scale.  
+# 
+# Currently, the function will take the entire spatial extent analyzed/
+# in the data set, p.data. 
+#
+# Input
+# ----------
+#		p.data, 
+#		dtm.obj,
+#		grid.size.seq,
+#		grid.size.units = "cells",
+#		file.name=NULL,
+#		plot.it=FALSE,
+#		plot.height=600 
+#		plot.width=800
+#
+# Output 
+# ----------
+#	pred.performance[iii,1] <- perf.ttt$deviance.explained
+#	pred.performance[iii,2] <- perf.ttt$obs.deviance
+#	pred.performance[iii,3] <- poisson.pearson(zzz.size[ttt.ind],ppp.size[ttt.ind] )
+#	# Total number of grid cells that have test-set observations 
+#	pred.performance[iii,4] <- NROW(image.pred$ind)
+#	# Median # of observations/grid cell, in grid cells with observations 
+#	pred.performance[iii,5] <- median(image.pred$weights[image.pred$ind])
+#	# Grid Size in units of cells
+#	pred.performance[iii,6] <- grid.size[iii]
+#	# Grid Size in units of (approximate) km^2
+#	pred.performance[iii,7] <- grid.size[iii]
+# 
+#
+# Notes: 
+# ---------
+#
+# Further Development: 
+# ----------------------------
+# * include km2 as units 
+# 	Check out the web page at
+# 	 http://www.movable-type.co.uk/scripts/latlong.html
+#	 for the Haversine formula 
+# * inlcude control over spatial.extent 
+# -----------------------------------------------------------------------------
+spatial.performance.plot <- function(
+		xxx,
+    yyy,
+    ppp, # predicted
+    zzz, #obs 
+    spatial.extent=NULL, 
+		#dtm.obj,
+		grid.size.seq,
+		grid.size.ratio = 2,
+		grid.size.units = "cells",
+		# ----------------------------
+		file.name=NULL,
+		plot.it=NULL,
+		span=0.3,
+		plot.height=600, 
+		plot.width=800){
+# ------------------------------------------
+#  Dummy Values
+# ------------------------------------------
+#   xxx = test.data$X$x[subset.index]
+#   yyy = test.data$X$y[subset.index]
+#   ppp = test.pred$mean[subset.index]  predicted
+#   zzz = test.data$y[subset.index]   observed	
+#   spatial.extent = spatial.extent 	
+#   grid.size.seq = grid.size.seq
+#   grid.size.ratio = 1.0
+#   file.name=NULL
+#   plot.it=TRUE 
+#	 
+#         spatial.extent <- list(   
+#		   				#  NE Region
+#					       	lat.max = 50.0,
+#					      	lat.min = 25.0,	
+#					      	lon.min= -100.0,
+#					      	lon.max = -67.0  )
+#         file.name <- FALSE
+#         plot.it <- TRUE
+#         n.sizes <- 50
+#        grid.size.seq <- round(seq(from=5, to=120, length=n.sizes))
+         # -----------------------------------         	 
+         # verification
+         #length(xxx)
+         #length(yyy)
+         #length(ppp)
+         #length(zzz) 	        
+         #  image.pred <- as.image(ppp, x= data.frame(xxx,yyy),
+	       #        nrow=40, 
+	       #        ncol=40, na.rm=TRUE)
+         #  image.plot(image.pred)
+         #         map('state',add=TRUE, lwd=1, col="grey")        
+
+# ------------------------------------------
+#  Initial Values
+# ------------------------------------------
+ 	n.sizes <- length(grid.size.seq)
+ 	pred.performance <- matrix(0, n.sizes, 20)
+	# Covert grid sizes to both units
+	# -----------------------------------------	
+# ------------------------------------------
+#  Compute Baseline-Point Performance
+# ------------------------------------------
+       epsilon <- 1e-8
+       #ppp <- ddd$pred.Xp
+       #obs <- p.data$yp
+       obs <- zzz
+           ttt.index <- ppp == 0      
+           ppp[ttt.index] <- epsilon
+           ttt.ind <- !is.na(ppp)      
+        test.dev <- deviance.explained(obs[ttt.ind],ppp[ttt.ind])$deviance.explained
+        test.pearson <- poisson.pearson(obs[ttt.ind],  ppp[ttt.ind])
+
+# ------------------------------------------
+#  Compute Performance across scales
+# ------------------------------------------
+ for (iii in 1:n.sizes){
+# -------------------------
+#      if (!is.null(spatial.extent)){     
+#          # Add two points based on spatial extent
+#          # Idea is to set spatial extent manually
+#          # I should rewrite the binning myself!
+#          # small bias caused in perf. metrics  
+#          ppp.ip <- c(ppp,0,0)
+#          zzz.ip <- c(zzz,0,0)
+#          xxx.ip <- c(xxx,spatial.extent$lon.min,spatial.extent$lon.max)
+#          yyy.ip <- c(yyy,spatial.extent$lat.min,spatial.extent$lat.max)  
+#    	   image.pred <- as.image(ppp.ip, x= data.frame(xxx.ip,yyy.ip),
+#    	               nrow=grid.size.seq[iii]*grid.size.ratio, 
+#    	               ncol=grid.size.seq[iii] , na.rm=TRUE)
+#    	   image.obs <- as.image(zzz.ip, x= data.frame(xxx.ip,yyy.ip),
+#    	               nrow=grid.size.seq[iii]*grid.size.ratio, 
+#    	               ncol=grid.size.seq[iii], na.rm=TRUE)
+#     } 
+# -----------------------
+      #if (is.null(spatial.extent)){       
+    	   image.pred <- as.image(ppp, x= data.frame(xxx,yyy),
+    	               nrow=grid.size.seq[iii]*grid.size.ratio, 
+    	               ncol=grid.size.seq[iii] , na.rm=TRUE)
+    	   image.obs <- as.image(zzz, x= data.frame(xxx,yyy),
+    	               nrow=grid.size.seq[iii]*grid.size.ratio, 
+    	               ncol=grid.size.seq[iii]) #, na.rm=TRUE)
+    # Form a common na index
+    # ---------------------------
+     ddd.na.ind <- !is.na(image.pred$weights)
+     d2.na.ind <- ddd.na.ind & !is.na(image.obs$weights)    
+  
+	   ppp.size <- image.pred$z[d2.na.ind ]
+	   zzz.size <- image.obs$z[d2.na.ind ]
+	   length(ppp.size)
+	   length(zzz.size)
+	   
+       # -------------------------------------
+       # Clean Predictions for Dev. Calcs
+       # -------------------------------------
+       # Substitute predicted zero's with small values
+       ttt.index <- ppp.size == 0
+       ppp.size[ttt.index] <- epsilon
+       # Remove any NA's - several occurr with GAM models
+       ttt.ind <- !is.na(ppp.size)
+       # -------------------------------------
+    	perf.ttt <- deviance.explained(zzz.size[ttt.ind], ppp.size[ttt.ind])
+    	pred.performance[iii,1] <- perf.ttt$deviance.explained
+    	pred.performance[iii,2] <- perf.ttt$obs.deviance
+    	pred.performance[iii,3] <- poisson.pearson(zzz.size[ttt.ind],ppp.size[ttt.ind] )
+    	# Total number of grid cells that have test-set observations
+      # This is the sample size at this scale 
+    	ip.ind <- !is.na(image.pred$weight)
+      pred.performance[iii,4] <- sum(ip.ind)
+      # Mean Squared error and scaled RMSE
+      pred.performance[iii,5] <- sqrt(
+              mean((zzz.size[ttt.ind]-ppp.size[ttt.ind])^2))
+        pred.performance[iii,6] <- sqrt(
+              mean(((zzz.size[ttt.ind]-ppp.size[ttt.ind])/
+                    ppp.size[ttt.ind]) )) 
+	# -----------------------------	    
+	 # Add more 
+	 # -------------------------        
+	#MSE 
+	pred.performance[iii,11] <- mean((ppp.size - zzz.size)^2)
+	
+	#R2 
+	pred.performance[iii,12] <- 1 - mean((ppp.size - zzz.size)^2)/
+	mean((mean(zzz.size) - zzz.size)^2)
+	#MSE.sqrt 
+	pred.performance[iii,13] <- mean((sqrt(ppp.size) - sqrt(zzz.size))^2)
+	#R2.sqrt 
+	pred.performance[iii,14] <- 1 - mean((sqrt(ppp.size) - sqrt(zzz.size))^2)/
+				mean((mean(sqrt(zzz.size)) - sqrt(zzz.size))^2)
+	#MAD 
+	pred.performance[iii,15]<- mean(abs(ppp.size - zzz.size))
+	#rho 
+	pred.performance[iii,16]<- cor(zzz.size,ppp.size)
+	#rho.sqrt 
+	pred.performance[iii,17]<- cor(sqrt(zzz.size),sqrt(ppp.size))
+	         
+ # --------------------------------              
+ 
+    	# Median # of observations/grid cell, in grid cells with observations 
+    	pred.performance[iii,7] <- median(image.pred$weights[ip.ind])
+    	pred.performance[iii,8] <- sd(image.pred$weights[ip.ind])
+      # Grid Size in units of cells
+    	pred.performance[iii,9] <- grid.size.seq[iii]
+    	# Grid Size in units of (approximate) km^2
+    	# --------------------------------------------------
+      #  Great Circle Distance Formula using decimal degrees:
+          # Where r is the radius of the earth in whatever units you desire.
+          #r <-3437.74677 (nautical miles)
+          r <- 6378.7 #(kilometers)
+          #r<-3963.0 (statute miles)
+          # Assume we are at centered at 40 Lat and 100 lon
+          lat1 <- 40
+          lon1 <- -100
+          # Step size from image grid
+          lat2 <- lat1 + (image.pred$y[2]- image.pred$y[1])
+          lon2 <- lon1 #+ (image.pred$x[2]- image.pred$x[1])
+          cell.height.km <- r * acos(sin(lat1/57.2958) * sin(lat2/57.2958) + 
+                      cos(lat1/57.2958) * cos(lat2/57.2958) *  
+                      cos(lon2/57.2958 -lon1/57.2958))
+          lat2 <- lat1 #+ (image.pred$y[2]- image.pred$y[1])
+          lon2 <- lon1 + (image.pred$x[2]- image.pred$x[1])
+          cell.width.km <- r * acos(sin(lat1/57.2958) * sin(lat2/57.2958) + 
+                      cos(lat1/57.2958) * cos(lat2/57.2958) *  
+                      cos(lon2/57.2958 -lon1/57.2958))                      	
+    	pred.performance[iii,10] <- cell.width.km*cell.height.km  
+ } # end for loop
+ # ----------------------------------------------------------
+# pred.performance
+
+# ------------------------------------------
+# Plot Performance vs Spatial Scale
+# ------------------------------------------
+	 if  (!is.null(file.name)){
+	    	png(file=file.name, 
+	    			bg="white",
+	    			width = plot.width, 
+	    			height = plot.height)
+	    			}      
+  	if  (!is.null(file.name) | !is.null(plot.it)){
+	 	# --------------------------------------
+	 	# ** dual x-labels for # cells and km2 would be cool
+	 	# ** draw Base-Line at point-level predictive performance
+	 	# ** adaptively set maximum y-axis value?  
+	 	# ** plot smoothed performance trajectory?? 
+	 	# --------------------------------------
+		 ymin <- min(c( 0.9*min(pred.performance[,1]),  0.9*test.dev)  )
+		 ymax <- max( c( 1.1*max(pred.performance[,1]), 1.1*test.dev) )
+		 plot(pred.performance[,9],
+		     pred.performance[,1],
+		     ylim=c(ymin,ymax),
+		     type="p",
+		     lwd=2.0,
+		     col="red",
+		     xlab=" #  latitude cells ", 
+		     ylab=" Percent Deviance Explained",
+		     main="Performance vs Scale" )
+		 # Smoothed Performance 
+
+		 # Smoothed Performance 
+		 lines(lowess(pred.performance[,9], pred.performance[,1],
+		 		f=span), 
+		 		lwd=2.0, 
+		 		col="red")
+		 # baseline performance
+		 lines(range(pred.performance[,9]), 
+		            c(test.dev, test.dev),
+		            lwd=2.0,
+		            col="black")
+		            
+     		}
+	if  (!is.null(file.name)) dev.off() 
+	
+# ------------------------------------------
+# Return Values
+# ------------------------------------------    			
+return.list <- list(pred.performance=pred.performance,
+                    test.dev=test.dev, 
+                    test.pearson=test.pearson)    			
+return(return.list)    			    
+# --------------------------------------------------------------------------
+} # end function
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+
+
+
+
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+# Generate Contours for Spatial Density of Given Locations
+# -----------------------------------------------------------------------------
+# Daniel Fink 
+# 2.7.08
+#
+# Description
+# -----------------
+# Objectives are to 
+#   ** estimate 2D KDE over lat & Lon
+#       ** second: estimate the SD of prediction error
+#   ** exclude/white out lowest level of density surface     
+#   ** estimate quantiles of density surface estimates
+
+# ----------------------------------------------------------------------
+#
+#
+# Input
+# ----------
+#     xxx, yyy - locations 
+#     contours - vector of numbers
+#     density.cutoff
+#
+# Output 
+# ----------
+#   ** draw contours
+#   ** return zzz quantile hieghts that define the contours. 
+#      This will be a numeric vector with same length as contours 
+#
+# Notes: 
+# ---------
+#
+# Further Development: 
+# ----------------------------
+# ** return density estimate
+# ** pass through to access options on density estimator
+# -----------------------------------------------------------------------------
+spatial.density.contours <- function(
+		xxx, yyy, 
+		contours,
+		density.cutoff = 0.1,
+		xgridsize = 40, 
+		ygridsize = 40,
+		# ----------------------------
+		file.name =NULL,
+		plot.it =FALSE,
+		plot.height=600, 
+		plot.width=800){
+# ------------------------------------------
+#  Dummy Values/Calls
+# ------------------------------------------
+
+# ------------------------------------------
+#  Inits
+# ------------------------------------------
+    require(GenKern)
+    require(maps)
+    require(fields)
+# -------------------------------------
+# GenKern: Estimate 2D KDE over lat & Lon
+# ----------------------------------
+    # calculate and plot a surface with zero correlation
+    # Notes that KernSur 2D KDE can change dramatically by 
+    # changing the bandwidths and correlation.
+    # The selection of grid size determines spatial resoluation
+    # of the contours. Which we want regional. 
+    # ------------------------------------------ 
+    op <- KernSur(xxx,yyy, 
+            xgridsize=xgridsize, 
+            ygridsize=ygridsize) 
+            #correlation=0, 
+            #xbandwidth=1, 
+            #ybandwidth=1, 
+    # Plot level plot of the Density estimate
+      #density.cutoff <- 0.1 # "Zero" Density cutoff
+    # cleans up map and calculations
+    #par(mfrow=c(1,2))
+    image.plot(op$xords, op$yords, 
+          log(op$zden+1), 
+          zlim = c(density.cutoff, 7),
+          col=terrain.colors(100),
+          #col=heat.colors(100), 
+          axes=TRUE,
+          xlab="Longitude",
+          ylab="Latitude", 
+          main=" eBird Spatial Log Density " )
+  # Compute quantiles of the Density estimate. 
+  # Note however, that this includes all the zeros that are 
+  # in the boundary area. 
+  # ---------------------------------------------------------
+    # Quantiles for 2004 - 2007 Unique Locations (12008)
+    zzz.quant <- quantile( op$zden[op$zden > density.cutoff],  
+                  probs = contours) # Defines lower bound for data quality 
+    # Quantiles for 2004 - 2007 Unique Locations (12008)
+    #zzz.quant <- quantile( op$zden[op$zden > density.cutoff],  
+    #                  probs =c(0.983, 0.88, 0.65))   
+    # Quantiles for 2006 Unique Locations (~6000) #c(0.85, 0.605))
+    # Plot Contours at these levels
+    # ------------------------------
+    #contour(op$xords, op$yords, op$zden, add=TRUE, 
+    #    levels=zzz.quant, 
+    #    col=c(1:length(contours))+1,
+    #    lwd=2.0)
+    box()
+    # Add political Boundaries
+    map('state',add=TRUE, lwd=2, col="yellow")
+    map('state',add=TRUE, lwd=1, col="black")
+    #points(xxx,yyy,         cex=0.25)
+
+    # Calculate All Contour Polygons using contourLines
+    # contour.poly is a list where each element describes
+    #     one ploygon. Elements are 
+    #     $level (this is one of the z.quantiles) 
+    #     $x 
+    #     $y (vectors defining boundary of polygon)
+    # -------------------------------------------------
+    contour.polygons <- contourLines(op$xords, op$yords, op$zden, 
+                                levels=zzz.quant) 
+# Return contours as polygons too!!! 
+results.list <- list(
+        contours = contours,
+        xxx = xxx,
+        yyy = yyy, 
+        log.density.quantiles = zzz.quant,
+        contour.polygons = contour.polygons,
+        density.KernSur.obj = op) 
+ return(results.list)
+}#---------------------------------------------------------------------
+#-----------------------------------------------------------------------
+#-----------------------------------------------------------------------
+
+
+
+
+
+
+# --------------------------------------------------------------------------
+# Plot Halloween Maps
+# -----------------------------
+#
+#
+# -------------------------------------
+#   There may be a problem with the halloween.maps()
+#	code when there are NO missing values and
+# 	this parameter is used: NA.col="grey20")
+# ------------------------------------- 
+#
+#
+# jdate.seq
+# year.seq
+# save.name 
+# spp.name <- "Yellow Warbler" 	
+# z.min  <- 
+# z.max <- 
+# If you use the mapping function for a single map, and 
+# turn the add=TRUE parameter, then you can add 
+# more stuff to the plot. You will need to end it with a call to 
+# dev.off()
+#
+#	# ----------------------------------------------------------------------
+#	# Calculate Indices for Point.in.polygon for Contours
+#	# ----------------------------------------------------------------------   
+#		# Do not filter locations
+#		# ------------------------
+#		contour.index <- rep(TRUE, length(st.pred$xxx))
+#		# Filter locations using archived polygon
+#		# --------------------------------
+#		sdc.name <- paste(control.dir,
+#				"yelwar.East.travel.spatial.density.contours.RData",sep="")
+#		load( file=sdc.name) # sd.cont 
+#		pip.cont <- point.in.polygon.contours( st.pred$xxx, st.pred$yyy, 
+#			                   				sd.cont$contour.polygons)
+#		#contour.index <- pip.cont$contour.index[,1]
+#	#
+##
+#
+#	#~ # Eg.1. extract individual States
+#	#~ #--------------------------------------------------------------
+#		#~ sites <- data.frame(lon=st.pred$xxx, lat=st.pred$yyy)
+#		#~ shape.dir <-"/mnt/data2/ST.BDT/BDT.shapefiles/" 
+#		#~ shape.filename <- "STATES.shp"
+#		#~ selected.shape.names <- c("New York", "Georgia")
+#		#~ att.selection.column.name <- "STATE_NAME"
+#	#~ # --------------------------------------------------------------
+#	#~ # Eg.2 extract individual BCRs
+#	#~ #--------------------------------------------------------------
+#		#~ sites <- data.frame(lon=st.pred$xxx, lat=st.pred$yyy)
+#		#~ shape.dir <-"/mnt/data2/ST.BDT/BDT.shapefiles/" 
+#		#~ shape.filename <- "bcr.shp"		  # watch capitalization!
+#		#~ att.selection.column.name <- "BCR"
+##	#~ # --------------------------------------------------------------		#~ selected.shape.names <- c(13, 27)   # class must match att.selection.column
+##
+#
+# --------------------------------------------------------------------------
+# DMF 3.19.10 modified from halloween.maps in stem.library.ST.R 
+# 					dated 3.16.10
+# 
+# I am going to add formal parameters so that 
+# we can can specify separate input directories for st.matrix files
+# and separate directories for map sequence outputs
+# --------------------------------------------------------------------------
+st.matrix.maps <- function(
+			st.matrix.directory, 
+			map.directory,
+			# --------------
+			#save.dir, 
+			#save.name, 
+			## KFW resp.transformation.code = NULL, 
+			# ---------------
+			jdate.seq,
+			year.seq,
+			begin.seq,
+			end.seq=length(jdate.seq),
+			# ------------------
+		# output
+			pred.grid.size=NULL,
+			map.plot.width = 1000,
+			spatial.extent.list = NULL,  
+			z.max = NULL,
+			z.min = NULL,
+			map.tag = NULL,
+			google.maps=FALSE, 
+			add=FALSE,
+			NA.col=NULL,
+			halloween.colors=NULL,
+			title.text = NULL,
+			date.bar = TRUE,
+			# -------------------------------------------
+			# map args
+			# -------------------------------------------
+			county.map = FALSE, 
+			state.map=TRUE,
+			world.map=FALSE,
+			state.map.lwd = NULL,
+			state.map.col = NULL,
+			county.map.lwd = NULL,
+			county.map.col = NULL,
+			world.map.lwd = NULL,
+			world.map.col = NULL,
+			# -------------------------
+			print.date=FALSE,
+			# -------------------------
+			...) {
+# ------------------------------------------------
+
+			if (is.null(state.map.lwd))	state.map.lwd <- 1.5
+			if (is.null(state.map.col))		state.map.col <- "grey"
+			if (is.null(county.map.lwd))	county.map.lwd <- 0.5
+			if (is.null(county.map.col))	county.map.col <- "grey"
+			if (is.null(world.map.lwd))	world.map.lwd <- 2.0
+			if (is.null(world.map.col))	world.map.col <- "white"	
+#---------------------------------------------
+
+   if ("/" != substring(map.directory, nchar(map.directory), nchar(map.directory))) {
+      map.directory <- paste(map.directory, "/", sep="")
+   }
+
+   if ("/" != substring(st.matrix.directory, nchar(st.matrix.directory), nchar(st.matrix.directory))) {
+      st.matrix.directory <- paste(st.matrix.directory, "/", sep="")
+   }
+
+	system(paste("mkdir ", map.directory,sep=""), intern=TRUE)
+	# Initialization Info Space-Time Predictions From file
+	# ---------------------------------------------- 
+	stp.name <- paste(st.matrix.directory,"st.matrix..1.RData",sep="")
+	load(stp.name) 
+	# ----------------------------------------------------------------------
+	# Limit Spatial Extent by Point in Polygon or ShapeFile
+	# ----------------------------------------------------------------------   
+	contour.index <- rep(TRUE, length(st.pred$xxx))
+	if (!is.null(spatial.extent.list)){
+		if (spatial.extent.list$type == "rectangle"){
+			ttt.index <- ( st.pred$yyy > spatial.extent.list$lat.min & 
+						st.pred$yyy < spatial.extent.list$lat.max &
+						st.pred$xxx > spatial.extent.list$lon.min & 
+						st.pred$xxx < spatial.extent.list$lon.max )
+			contour.index <- (ttt.index & contour.index)			  
+			}
+		  if (spatial.extent.list$type == "polygon"){
+			ttt.index <- point.in.polygon(
+					    xxx = st.pred$xxx, 
+					    yyy = st.pred$yyy,
+					    polygon.vertices = 
+				      spatial.extent.list$polygon.vertices)
+			contour.index <- (ttt.index & contour.index)			  
+			  }
+		  if (spatial.extent.list$type == "shapefile"){
+			  ttt.index <- point.in.shapefile(
+				sites = data.frame(lon=st.pred$xxx, lat=st.pred$yyy), 
+				shape.dir=spatial.extent.list$shape.dir, 
+				shape.filename=spatial.extent.list$shape.filename, 
+				att.selection.column.name=
+				       spatial.extent.list$att.selection.column.name,
+				selected.shape.names=
+				    spatial.extent.list$selected.shape.names) 
+			  contour.index <- (ttt.index & contour.index)			  
+			}				 		
+	} 	# if (!is.null(spatial.extent.list)){    	    
+	# -------------------------------------------------------------------
+	# initizalize.map.grid() formats maps automatically	
+	# -------------------------------------------------------------------		
+	mapping.spatial.extent <- list(
+			lat.max = max( st.pred$yyy[contour.index]),
+						  lat.min = min( st.pred$yyy[contour.index]),	
+						  lon.min = min( st.pred$xxx[contour.index]),
+						  lon.max = max( st.pred$xxx[contour.index]) )	   
+	map.inits <- initizalize.map.grid(
+						spatial.extent = mapping.spatial.extent,
+						map.plot.width = map.plot.width, 
+						pred.grid.size = pred.grid.size)
+	# ----------------------------------------------------------------------   	
+	# Compute Surface Summaries 
+	# ----------------------------------------------------------------------   
+		st.summary <- matrix(0,(end.seq-begin.seq+1), 7)
+		for (iii in begin.seq:end.seq){	
+			stp.name <- paste(st.matrix.directory,"st.matrix..",iii,".RData",sep="")
+			load(stp.name) 
+				# ---------------------------------------------------------------------------
+				# Un-tranform Responses
+				# ---------------------------------------------------------------------------		
+					## KFW if ( resp.transformation.code == "sqrt") {  
+					## KFW 		st.pred$pred <- (st.pred$pred) ^2
+                                        ## KFW } 
+				# ---------------------------------------------------------------------------	
+				st.summary[(iii-begin.seq +1),] <- quantile(st.pred$pred[contour.index], 
+									probs=c(0, .1,.25,.5,.75,.9,1),
+									na.rm = TRUE)
+				}
+		# Set minium as min of 10th quantiles
+		if (is.null(z.min))	z.min <- min(st.summary[,2])
+		# Take max as max of 90th quantiles
+		if (is.null(z.max))	z.max <- max(st.summary[,6])
+	# ---------------------------------------------------------  
+	# Convert Temporal Sequence times to POSIX
+	# ---------------------------------------------------------
+		p.time <- strptime( x=paste(round(jdate.seq),year.seq), "%j %Y")
+		# Nice function to convert DateTime Classes 
+		month.text <- months(p.time, abbreviate = FALSE)
+		date.names <- paste(month.text, " ",p.time$mday,",", year.seq,sep="") 
+	# --------------------------------------------------------------
+	# Lookup Common Name in eBird Taxonomy File
+	# --------------------------------------------------------------
+		#	datafile <- paste(control.dir,"eBird taxonomy file.csv",sep="")
+		#	eBird.taxonomy <- read.csv(file=datafile) 
+		#	#names(eBird.taxonomy)
+		#	spp.name <- eBird.taxonomy$PRIMARY_COM_NAME[          
+		#				as.character(eBird.taxonomy$SPECIES_CODE) == spp.code ] 
+	# --------------------------------------------------------------
+	# Will's Halloween Pallete 
+	# --------------------------------------------------------------				
+	if (is.null(halloween.colors)){	
+		n.red <- 100   
+		red.colors <- colorRampPalette(
+			#-----------------------------------------------------------------------------------------
+			# Traditional Halloweeen Map (black under 0.20)
+			# -----------------------------------------------------------------------------------------
+			#	c("black","black","#FF7100","white"),
+			#	bias=1.9)
+			# -----------------------------------------------------------------------------------------
+			# Low Probability Halloween
+			# -----------------------------------------------------------------------------------------
+			#	c("black","grey","#FF7100","yellow","white"),
+			#	bias=1.0)
+			# -----------------------------------------------------------------------------------------
+			# Low Probability Halloween 2
+			# -----------------------------------------------------------------------------------------
+				c("black","grey20","#FF7100","white"),
+				bias=2.0)			
+			# -----------------------------------------------------------------------------------------
+			# Green Halloween
+			# -----------------------------------------------------------------------------------------
+			#c("black","black","DarkGreen","Green4","Green"),
+			#space = "rgb",
+	}
+	else { 
+           n.red <- 100   
+           red.colors <- halloween.colors
+	}
+	
+	# --------------------------------------------------------------
+	# Loop over Dates
+	# --------------------------------------------------------------
+	for (iii in begin.seq:end.seq){
+		#---------------------------------------------
+		# Load Space-Time Predictions From file
+		# ---------------------------------------------- 
+		#stp.name <- paste(save.dir,save.name,".",iii,".RData",sep="")
+		stp.name <- paste(st.matrix.directory,"st.matrix..",iii,".RData",sep="")
+		load(stp.name) 
+		# ---------------------------------------------------------------------------
+		# Un-tranform Responses
+		# ---------------------------------------------------------------------------		
+			## KFW if ( resp.transformation.code== "sqrt")  
+			## KFW 		st.pred$pred <- (st.pred$pred) ^2 
+		# ---------------------------------------------------------------------------	
+		#----------------------------
+		# Surface Height Limits
+		# ----------------------------
+		st.pred$pred[st.pred$pred < z.min] <- z.min
+		st.pred$pred[st.pred$pred > z.max] <- z.max  	
+		# --------------
+		# --------------
+		num.txt <- formatC(iii,format="fg", width=5)
+		num.txt <- chartr(" ","0",num.txt)
+		map.file.name <- paste(map.directory,map.tag,
+						num.txt,".",jdate.seq[iii],
+						".",year.seq[iii],".png" ,sep="") 			
+		
+		# --------------------------------------------------------------
+		# "Google".maps == Transparent PNG's
+		# --------------------------------------------------------------
+		# if TRUE then background = Transparent
+		# PNG margins are ajusted. 
+		# spatial.extent needs to be communicated to 
+		# Google.Earth so that it knows how to overlay image
+		# --------------------------------------------------------------						
+			if (!google.maps) { 
+				png(file=map.file.name, bg="white", 
+				    width=map.plot.width, 
+				    height=map.inits$map.plot.height) 
+				par(mar = c(2,4,4,2), bg="black",fg="grey")  
+			}
+			if (google.maps) {	
+				png(file=map.file.name, bg="transparent", 
+				    width=map.plot.width, 
+				    height=map.inits$map.plot.height) 
+				par(mar=c(0,0,0,0),bg="black",fg="grey",
+					xpd=TRUE)
+			}			
+		# --------------------------------------------------------------
+		# Include Date Bar
+		# --------------------------------------------------------------	
+		if (date.bar) { 
+			par(plt = c(0.10, 0.883, 0.25, 0.85) )
+			# --------------------------------------------------------				
+			# Do not add NA's filled in with given color
+			# --------------------------------------------------------
+			if ( is.null(NA.col) ) { 
+				bs.rpart.maps(			
+						xxx = st.pred$xxx[contour.index],
+						yyy = st.pred$yyy[contour.index],
+						zzz = st.pred$pred[contour.index],
+						zlim = c(z.min,z.max),  
+						pred.grid.size = map.inits$pred.grid.size , 
+						grid.size.ratio = map.inits$grid.size.ratio,  
+						axis.args=list(fg="grey", col.axis="grey"),
+						# Less than 1 reduces height, 
+						# greater than 1 increase height 
+						#for given width
+						col.palette = red.colors(n.red),  
+						axes = FALSE,
+						...)
+			}
+			# --------------------------------------------------------				
+			# Add image plot with NA's filled in with given color
+			# --------------------------------------------------------
+			if ( !is.null(NA.col) ) {
+				ttt.st.pred <- rep(NA,length(st.pred$pred))
+				ttt.st.pred[is.na(st.pred$pred)] <- 1
+				ttt.image <- as.image(
+					ttt.st.pred[contour.index],
+					x= data.frame(	st.pred$xxx[contour.index],
+									st.pred$yyy[contour.index]),
+					nrow=round(map.inits$pred.grid.size*
+								map.inits$grid.size.ratio),  	# nrow=X direction
+					ncol=map.inits$pred.grid.size,     		# ncol=Y direction
+					na.rm=TRUE)
+				image(ttt.image, 
+						col=NA.col, 
+						#	 add=TRUE, 	
+						axes = FALSE,...)
+				if (!is.null(title.text)) {
+					title(main=paste(title.text), col="white",line=0)
+					}
+				bs.rpart.maps(			
+					xxx = st.pred$xxx[contour.index],
+					yyy = st.pred$yyy[contour.index],
+					zzz = st.pred$pred[contour.index],
+					zlim = c(z.min,z.max),  
+					pred.grid.size = map.inits$pred.grid.size , 
+					grid.size.ratio = map.inits$grid.size.ratio,  
+					axis.args=list(fg="grey", col.axis="grey"),
+					# Less than 1 reduces height, 
+					# greater than 1 increase height 
+					#for given width
+					col.palette = red.colors(n.red),  
+					axes = FALSE,
+					add=TRUE,
+					...)
+			}	# !is.null(NA.col)
+		# -------------------------------------------------------------
+		# Add Date Text
+		# -------------------------------------------------------------  		
+			if (print.date)  {
+				#mtext( paste(date.names[iii]), side=3, col="white")
+				text( x= min(st.pred$xxx[contour.index]), 
+					y= min(st.pred$yyy[contour.index]), 
+					pos=4, #plot to the right
+					labels= date.names[iii])
+					}
+		# -------------------------------------------------------------
+		# Add Political Boundaries
+		# -------------------------------------------------------------  		
+			if (county.map)  map('county',add=TRUE, lwd=county.map.lwd,  col=county.map.col)		
+			if (state.map)  map('state',add=TRUE, lwd=state.map.lwd,  col=state.map.col)
+			if (world.map)  map('world',add=TRUE, lwd=world.map.lwd,  col=world.map.col)
+		# -------------------------------------------------------------		
+		# Bottom Date Legend Rectangle
+		# -------------------------------------------------------------
+			# Find the coordinate for the right boundary of
+			# image.plot's "bigplot"
+			right.corner <- image.plot.plt()$bigplot[2]
+			par(plt = c(0.10, right.corner, 0.15, 0.22) )
+			# Set user coordinates for this region
+			par(usr=c(-1,366,0,1))
+			box(lwd=2, col="grey")
+			rect(xleft= (jdate.seq[iii]-2), ybottom=0, xright=(jdate.seq[iii]+2), ytop=2,
+			      col=red.colors(n.red)[n.red],
+			      border=NA )
+			axis(1, at = c(5, 90, 180, 270, 360),
+			       labels = c("Jan", "Apr", "Jun", "Sep", "Dec"),
+			       cex=1.5,
+			       col="grey",
+			       col.axis="grey",
+			       font=1)
+		# -------------------------------------------------------------			
+		} # end date.bar == TRUE
+		# -------------------------------------------------------------
+		
+		
+		# --------------------------------------------------------------
+		# Exclude Date Bar
+		# --------------------------------------------------------------	
+		if (!date.bar) { 
+			# --------------------------------------------------------				
+			# Do not add NA's filled in with given color
+			# --------------------------------------------------------
+			if ( is.null(NA.col) ) { 
+				bs.rpart.maps(			
+						xxx = st.pred$xxx[contour.index],
+						yyy = st.pred$yyy[contour.index],
+						zzz = st.pred$pred[contour.index],
+						zlim = c(z.min,z.max),  
+						pred.grid.size = map.inits$pred.grid.size , 
+						grid.size.ratio = map.inits$grid.size.ratio,  
+						axis.args=list(fg="grey", col.axis="grey"),
+						# Less than 1 reduces height, 
+						# greater than 1 increase height 
+						#for given width
+						col.palette = red.colors(n.red),  
+						axes = FALSE,
+						...)
+			}
+			# --------------------------------------------------------				
+			# Add image plot with NA's filled in with given color
+			# --------------------------------------------------------
+			if ( !is.null(NA.col) ) {
+				ttt.st.pred <- rep(NA,length(st.pred$pred))
+				ttt.st.pred[is.na(st.pred$pred)] <- 1
+				ttt.image <- as.image(
+					ttt.st.pred[contour.index],
+					x= data.frame(	st.pred$xxx[contour.index],
+									st.pred$yyy[contour.index]),
+					nrow=round(map.inits$pred.grid.size*
+								map.inits$grid.size.ratio),  	# nrow=X direction
+					ncol=map.inits$pred.grid.size,     		# ncol=Y direction
+					na.rm=TRUE)
+				image(ttt.image, 
+						col=NA.col, 
+						#	 add=TRUE, 	
+						axes = FALSE,...)
+				if (!is.null(title.text)) {
+					title(main=paste(title.text), col="white",line=0)
+					}
+				bs.rpart.maps(			
+					xxx = st.pred$xxx[contour.index],
+					yyy = st.pred$yyy[contour.index],
+					zzz = st.pred$pred[contour.index],
+					zlim = c(z.min,z.max),  
+					pred.grid.size = map.inits$pred.grid.size , 
+					grid.size.ratio = map.inits$grid.size.ratio,  
+					axis.args=list(fg="grey", col.axis="grey"),
+					# Less than 1 reduces height, 
+					# greater than 1 increase height 
+					#for given width
+					col.palette = red.colors(n.red),  
+					axes = FALSE,
+					add=TRUE,
+					...)
+			}	# !is.null(NA.col)
+		# -------------------------------------------------------------
+		# Add Date Text
+		# -------------------------------------------------------------  		
+			if (print.date)  {
+				#mtext( paste(date.names[iii]), side=3, col="white")
+				text( x= min(st.pred$xxx[contour.index]), 
+					y= min(st.pred$yyy[contour.index]), 
+					pos=4, #plot to the right
+					labels= date.names[iii])
+					}
+		# -------------------------------------------------------------
+		# Add Political Boundaries
+		# -------------------------------------------------------------  		
+			if (county.map)  map('county',add=TRUE, lwd=county.map.lwd,  col=county.map.col)		
+			if (state.map)  map('state',add=TRUE, lwd=state.map.lwd,  col=state.map.col)
+			if (world.map)  map('world',add=TRUE, lwd=world.map.lwd,  col=world.map.col)
+		# -------------------------------------------------------------
+		} # end plotting w/o date bar
+		# -------------------------------------------------------------  			
+		if (add==FALSE) dev.off()			
+	# ---------------------------------------------------------------------------		
+	} # iii - loop over dates
+# -----------------------------------------------------------------------------------	
+}# end function
+#------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------
+
+
+
+# --------------------------------------------------------------------------
+# Plot  Base Surface Maps
+# -----------------------------
+#
+#
+# Results:  
+#
+#
+# jdate.seq
+# year.seq
+# save.name 
+# spp.name <- "Yellow Warbler" 	
+# z.min  <- 
+# z.max <- 
+		#----------------------------
+		# google.maps 
+		# ---------------------
+		# if TRUE then background = Transparent
+		# PNG margins are ajusted. 
+		# spatial.extent needs to be communicated to 
+		# Google.Earth so that it knows how to overlay image
+		# ----------------------------						
+# --------------------------------------------------------------------------
+surface.maps <- function(
+			save.dir, 
+			save.name, 
+			jdate.seq,
+			year.seq,
+			begin.seq,
+			end.seq=length(jdate.seq),
+			## KFW resp.transformation.code = NULL, 
+		# output
+			pred.grid.size=NULL,
+			z.max = NULL,
+			z.min = NULL,
+			map.tag,
+			google.maps=FALSE,
+			add=FALSE)  		
+{
+# ------------------------------------------
+	# call to the function initizalize.map.grid() in 
+	# st.clustering.functions.2.R format maps automatically	
+	# ---------------------------------------------------------------------------------------------------
+		map.inits <- initizalize.map.grid(spatial.extent=spatial.extent,
+							map.plot.width=map.plot.width, 
+							pred.grid.size= pred.grid.size)
+		# Reset this for slightly larger grid cells 
+	# Response Transformation code 	
+		#resp.transformation.code <- "sqrt"
+	# Map surface filename tag 
+		#map.tag <- paste(exp.name,"st.map.",sep="")
+	#---------------------------------------------
+	# Initialization Info Space-Time Predictions From file
+	# ---------------------------------------------- 
+		stp.name <- paste(save.dir, 
+				save.name,".",1,".RData",sep="")
+		load(stp.name) 
+	# ----------------------------------------------------------------------
+	# Calculate Indices for Point.in.polygon for Contours
+	# ----------------------------------------------------------------------   
+		# Do not filter locations
+		# ------------------------
+		contour.index <- rep(TRUE, length(st.pred$xxx))
+		# Filter locations using archived polygon
+		# --------------------------------
+		sdc.name <- paste(control.dir,
+				"yelwar.East.travel.spatial.density.contours.RData",sep="")
+		load( file=sdc.name) # sd.cont 
+		pip.cont <- point.in.polygon.contours( st.pred$xxx, st.pred$yyy, 
+			                   				sd.cont$contour.polygons)
+		#contour.index <- pip.cont$contour.index[,1]
+	# ----------------------------------------------------------------------   	
+	# Compute Surface Summaries 
+	# ----------------------------------------------------------------------   
+		st.summary <- matrix(0,(end.seq-begin.seq+1), 7)
+		for (iii in begin.seq:end.seq){	
+			stp.name <- paste(save.dir, 
+				save.name,".",iii,".RData",sep="")
+			load(stp.name) 
+			# ---------------------------------------------------------------------------
+			# Un-tranform Responses
+			# ---------------------------------------------------------------------------		
+				## KFW if ( resp.transformation.code== "sqrt")  
+				## KFW 		st.pred$pred <- (st.pred$pred) ^2 
+			# ---------------------------------------------------------------------------	
+			st.summary[iii,] <- quantile(st.pred$pred[contour.index], 
+								probs=c(0, .1,.25,.5,.75,.9,1))
+			}
+		# Set minium as min of 10th quantiles
+		if (is.null(z.min)) z.min <- min(st.summary[,2])
+		# Take max as max of 90th quantiles
+		if (is.null(z.max))	z.max <- max(st.summary[,6])
+
+			# Compute Slice Quantiles
+			#pred.ecdf <- ecdf(st.pred$pred)+
+			#qqq <- pred.ecdf(st.pred$pred) 
+	# ---------------------------------------------------------  
+	# Convert Temporal Sequence times to POSIX
+	# ---------------------------------------------------------
+		p.time <- strptime( x=paste(round(jdate.seq),year.seq), "%j %Y")
+		# Nice function to convert DateTime Classes 
+		month.text <- months(p.time, abbreviate = FALSE)
+		date.names <- paste(month.text, " ",p.time$mday,",", year.seq,sep="") 
+	# --------------------------------------------------------------
+	# Lookup Common Name in eBird Taxonomy File
+	# --------------------------------------------------------------
+		datafile <- paste(control.dir,"eBird taxonomy file.csv",sep="")
+		eBird.taxonomy <- read.csv(file=datafile) 
+		#names(eBird.taxonomy)
+		spp.name <- eBird.taxonomy$PRIMARY_COM_NAME[          
+					as.character(eBird.taxonomy$SPECIES_CODE) == spp.code ] 
+	# ------------------------------------
+	# My "Red" Pallete 
+	# ------------------------------------				
+		n.red <- 100   
+		red.colors <- colorRampPalette(
+			c("white","red","#7F0000"), 
+			space = "rgb",
+			bias=0.5)		  		
+	# --------------------------------------- 
+	for (iii in begin.seq:end.seq){
+		#---------------------------------------------
+		# Load Space-Time Predictions From file
+		# ---------------------------------------------- 
+		stp.name <- paste(save.dir, 
+			save.name,".",iii,".RData",sep="")
+		load(stp.name) 
+		# ---------------------------------------------------------------------------
+		# Un-tranform Responses
+		# ---------------------------------------------------------------------------		
+			## KFW if ( resp.transformation.code== "sqrt")  
+			## KFW 		st.pred$pred <- (st.pred$pred) ^2 
+		# ---------------------------------------------------------------------------	
+		#----------------------------
+		# Surface Height Limits
+		# ----------------------------
+		st.pred$pred[st.pred$pred < z.min] <- z.min
+		st.pred$pred[st.pred$pred > z.max] <- z.max  	
+		# --------------
+		# --------------
+		num.txt <- formatC(iii,format="fg", width=5)
+		num.txt <- chartr(" ","0",num.txt)
+		map.file.name <- paste(save.dir,map.tag,
+						num.txt,".",jdate.seq[iii],
+						".",year.seq[iii],".png" ,sep="") 			
+		
+		#----------------------------
+		# google.maps 
+		# ---------------------
+		# if TRUE then background = Transparent
+		# PNG margins are ajusted. 
+		# spatial.extent needs to be communicated to 
+		# Google.Earth so that it knows how to overlay image
+		# ----------------------------						
+		if (!google.maps) { 
+			png(file=map.file.name, bg="white", 
+		            width=map.plot.width, 
+		            height=map.inits$map.plot.height) 
+			par(mfrow=c(1,1), cex=2.0, mar=c(5,4,4,5))  
+		}
+		if (google.maps) {	
+			png(file=map.file.name, bg="transparent", 
+		            width=map.plot.width, 
+		            height=map.inits$map.plot.height) 
+			par(mfrow=c(1,1), 
+				cex=2.0, 
+				mar=c(0,0,0,0),
+				xpd=TRUE)
+		}			
+		# ---------------
+		# Plot Surface 
+		# ---------------	
+		contour.index <- pip.cont$contour.index[,1]
+		bs.rpart.maps(			
+				xxx = st.pred$xxx[contour.index],
+				yyy = st.pred$yyy[contour.index],
+				zzz = st.pred$pred[contour.index],
+				zlim = c(z.min,z.max),  
+				pred.grid.size = map.inits$pred.grid.size , 
+				grid.size.ratio = map.inits$grid.size.ratio,  
+				# Less than 1 reduces height, 
+				# greater than 1 increase height 
+				#for given width
+				col.palette = red.colors(n.red),  
+				#spatial.extent =  spatial.extent.map  ,
+				xlab= "Longitude",
+				ylab= "Latitude")
+		title(main = paste(spp.name, "  ", date.names[iii]) , 
+			font.main=4, line=1, cex.main=3.0 )
+		# -------------------------------------------------------------
+		# Add Polygon Boundaries
+		# -------------------------------------------------------------           
+		kk <- 1 # first (lower) quantile
+		hd.index <- pip.cont$contour.level.index ==
+				sd.cont$log.density.quantiles[kk]
+		hd.set <- (1:length(pip.cont$contour.level.index))[hd.index]
+		# There are 9 polygons in this set, but only the first and fourth 
+		# are the big important regions
+		for (kkk in c(1,4)){
+			polygon(sd.cont$contour.polygons[[kkk]])  #$x,
+			#sd.cont$contour.polygons[[jjj]]$y,
+			# col=  "black",  #c.col[kk],
+			#border=TRUE)             
+			}                                             		
+		# -------------------------------------------------------------
+		# Add Political Boundaries
+		# -------------------------------------------------------------  
+			require(maps)
+      map('county',add=TRUE, lwd=2, col="grey") 
+			map('state',add=TRUE, lwd=3, col="yellow")
+			map('state',add=TRUE, lwd=2, col="black") 
+		# -----------------------------------------------------
+		# -------------------------------------------------------------
+		if (add==FALSE) dev.off()
+		} # iii - st.pred index
+}# end fuction  		
+#------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------------
+
+
+
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+# Initialize Map Gridding 
+# ------------------------------------------------------------
+# 10.7.08
+#
+# This needs to be cleaned up a bit
+# 
+# Input:
+# -------------
+#			
+# Output:
+# ----------
+#
+# Examples: 
+# ------------------
+# --------------------------------------------------
+	#~ spatial.extent  <- list( lat.max = 45.0,
+						 #~ lat.min = 39.0,	
+						 #~ lon.min= -82.5,
+						 #~ lon.max = -67.0  )	
+	#~ # ----------------------------------------
+	#~ if (spatial.extent.code == "US") {
+		#~ spatial.extent <- spatial.extent.US
+		#~ map.plot.width <- 1800  
+		#~ #pred.grid.size <- 100 #height == lat
+		#~ }
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+
+
+initizalize.map.grid <- function(
+    	spatial.extent=NULL,
+    	lat=NULL,
+    	lon=NULL,
+    	map.plot.width,
+    	pred.grid.size=NULL	){
+# Needs either spatial.extent or lat & lon	
+# -----------------------------------------------------------------------------
+# ST Surface Plots Inits
+# ----------------------------------------------------------------------------- 
+#~ Latitude and longitude can be used very simply for plotting 
+#~ by setting up a rectangular grid (e.g. like a Simple Cylindrical Projection) 
+#~ The question is how to scale the length:width of the rectangles. 
+#~ At the equator a degree of latitude is roughly the same length 
+#~ in miles as a degree of longitude - ignoring the asphericity of the 
+#~ Earth's globe. Thus, at the equator, a square grid would be satisfactory 
+#~ for a small map. 
+#	
+#~ As we move further away from the equator, e.g. where the continental US lies, 
+#~ a degree of longitude is shorter in miles, though a degree of latitude 
+#~ is much the same. Thus, a square lat-lon grid in the continental US distorts 
+# distances, the map being stretched E-W. Using a rectangular lat-lon grid
+# gives a truer picture of everyday miles. 
+#
+#~ The ratio of lengths for a degree latitude:longitude approximately corresponds 
+#~ to the inverse of the cosine of the latitude. For example, at 40 degrees 
+#~ latitude,  the ratio of lat:lon is appriximately 1/cos(40 degrees) = 1.31. 
+#~ This is the ratio for latitude of Denver,CO Springfield, IL, or Harrisburg, PA. 
+#
+#~ This ratio of latitude:longitude is used to determine an appropriate 
+#~ ratio of map image size (length & width in pixes) as well to determine 
+# grid size ratio so that 
+#~ grid cells plotted in the map surface have approximately equal length width & height in miles. 
+#~ For simplicity, I use a fixed grid size for mapping.  The ratio of 
+#~ the length latitude:longitude length of the pixels is adjusted to 
+#~ the inverse of the cosine of the latitude from the middle of the spatial 
+#~ extent being plotted. 
+# -----------------------------------------------------------------------------------------------------
+	# user specified: Width of image (png file) in pixels
+	#map.plot.width <- 1500  
+	middle.lat <- mean(spatial.extent$lat.max,spatial.extent$lat.min)
+	pixels.per.degree.lon <- map.plot.width/
+			(spatial.extent$lon.max - spatial.extent$lon.min)
+	length.lat.to.length.lon.ratio <- 1/cos(middle.lat/360*2*pi)
+	pixels.per.degree.lat <- length.lat.to.length.lon.ratio  * 
+						pixels.per.degree.lon
+	map.plot.height <- round(pixels.per.degree.lat * 
+			(spatial.extent$lat.max-spatial.extent$lat.min))
+
+# ------------------------------------------------------------------------
+  # Discretization size
+  # ------------------------------------------------------------------------
+  # Calculate the maximum number of grid cells (minimum grid cell area)
+  # to achieve the 10 random locations per cell from the prediction
+  # grid design.
+  #
+  # NOTE: It appears that with these setting there are FAR more than 
+  # 			10 random locs per cell!!!!
+  #
+  # The minimum Longitude grid side = . .14436 deg long
+  # At 40 degrees Lat, a change of  .14436 lon is 12km in length. 
+  # This number comes from the stratified design used to sample the 
+  # random locations based on extent and 400 equally spaced lon cells: 
+  #                          .14436 deg long =   (-124.72839 - -66.98426)/400
+  #
+  # The minimum Latitude grid side = ..12210 deg lat
+  # At 40 degrees Lat, a change of .12210 lat is 14 km in length. 
+  # This number comes from the stratified design used to sample the 
+  # random locations based on extent and 200 equally spaced lat cells: 
+  #				.12210 deg lat= (48.97630 - 24.55572)/200
+  #------------------------------------------------------------------------
+	if (is.null(pred.grid.size)) {
+		  # Calculate Maximum pred.grid.size for this region
+		  pred.grid.size.max.xxx <- 
+			floor( (spatial.extent$lon.max - spatial.extent$lon.min)/.145)
+		  pred.grid.size.max.yyy <- 
+			floor( (spatial.extent$lat.max - spatial.extent$lat.min)/.123 )
+		  if (pred.grid.size.max.xxx < pred.grid.size.max.yyy)
+		        pred.grid.size <- floor(pred.grid.size.max.xxx)
+		  if (pred.grid.size.max.xxx > pred.grid.size.max.yyy)
+		        pred.grid.size <- floor(pred.grid.size.max.yyy)
+		  #pred.grid.size
+		  }
+	# -------------------------------------------------------------------
+	# User specified: number of latitude cells across spatial.extent
+	#pred.grid.size <- 100 
+	# --------------------------------------------------------------------------
+	# longitude cells = pred.grid.size * grid.size.ratio 
+	# Note that this ratio really takes into account two 
+	# quantities, the ratio of the lat:lon distances on the 
+	# surface of the Earth as well as the lat:lon ratio of 
+	# the spatial extent.
+	# -------------------------------------------------------------------------
+	cells.per.degree.lat <- pred.grid.size/
+			(spatial.extent$lat.max - spatial.extent$lat.min)
+	cells.per.degree.lon <-  cells.per.degree.lat /  
+						length.lat.to.length.lon.ratio  						
+	grid.cell.plot.width <- cells.per.degree.lon * 
+			(spatial.extent$lon.max-spatial.extent$lon.min)	
+	grid.size.ratio  <-   grid.cell.plot.width/pred.grid.size    		
+		#grid.size.ratio
+		#pred.grid.size
+		#grid.cell.plot.width
+		
+	# ---------------------------------------------------------------------------------
+	# How long are the sides of a grid cell? 
+	# ----------------------------------------------------------------------------------
+	# Assume a grid cell centered at 40 degrees lat
+	# ----------------------------------------------------------------------------------
+	# Formula for distance between two points on a great circle
+	# Each point needs to be expressed in radians
+	# ---------------------------------------------------------------------------------------------
+	lat1<- (40)*pi/180
+	lon1 <- 70*pi/180
+	lat2 <- (40 + 1/cells.per.degree.lat)*pi/180
+	lon2 <- lon1
+	d <- 2*asin(sqrt((sin((lat1-lat2)/2))^2 + 
+                 cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))	
+	radius.km <- 6371.0 
+	lat.distance.km <- radius.km * d
+	# ---------------------------------------------------------------------------------------------
+	lat1<- (40)*pi/180
+	lon1 <- 70*pi/180
+	lon2 <- (70 + 1/cells.per.degree.lon)*pi/180
+	lat2 <- lat1
+	d <- 2*asin(sqrt((sin((lat1-lat2)/2))^2 + 
+                 cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))	
+	radius.km <- 6371.0 
+	lon.distance.km <- radius.km * d
+ 	# ----------------------------	
+
+return(list(
+		pixels.per.degree.lon=pixels.per.degree.lon,
+		pixels.per.degree.lat=pixels.per.degree.lat,
+		map.plot.height=map.plot.height,
+		length.lat.to.length.lon.ratio=length.lat.to.length.lon.ratio,
+		cells.per.degree.lat =cells.per.degree.lat ,
+		cells.per.degree.lon=cells.per.degree.lon,
+		grid.cell.plot.width=grid.cell.plot.width,
+		grid.size.ratio =grid.size.ratio,
+		pred.grid.size=pred.grid.size,
+		lon.distance.km=lon.distance.km,
+		lat.distance.km=lat.distance.km))
+} # end function
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+# Point in Shapefile Polygon Operation
+# ------------------------------------------------------------
+# 6.3.08
+# 10.6.08
+#
+# This function performs the "Point in shapefile" operation 
+# for BCRs and Statenames for a specific set of shapefiles.
+# Because each shape file has its own attr data frame, there are two 
+# steps to select shapes:
+# 	1) find the att.selection.column of the att.data data.frame 
+# 	2) search for selected.shape.names in the att.selection.column
+#
+# NOTE: This function is based on the NCEAS function XXXXXX
+# except that I needed to fix the donut hole problem with 
+# the shape files. I need to finish documenting this and 
+# send it back to those guys!
+#
+# NOTE: 1.9.09
+# ---------------
+# I changed the way that I access attributes - 
+# I ran into problems not having S4 objects
+#
+# Input:
+# -------------
+#     shape.dir
+#     shape.filename
+#     sites = data.frame with lat & lon vectors for spatial extent/universe 
+#	att.selection.column.name = the name of the att.data column
+# 	selected.shape.names = vector of region/shape names from shape file
+#			
+# Output:
+# ----------
+#     location.pip - T/F vector the length of the sites
+#
+# Examples: 
+# ------------------
+	#~ # --------------------------------------------------------------
+	#~ # Eg.1. extract individual States
+	#~ #--------------------------------------------------------------
+		#~ sites <- data.frame(lon=st.pred$xxx, lat=st.pred$yyy)
+		#~ shape.dir <-"/mnt/data2/ST.BDT/BDT.shapefiles/" 
+		#~ shape.filename <- "STATES.shp"
+		#~ selected.shape.names <- c("New York", "Georgia")
+		#~ att.selection.column.name <- "STATE_NAME"
+	#~ # --------------------------------------------------------------
+	#~ # Eg.2 extract individual BCRs
+	#~ #--------------------------------------------------------------
+		#~ sites <- data.frame(lon=st.pred$xxx, lat=st.pred$yyy)
+		#~ shape.dir <-"/mnt/data2/ST.BDT/BDT.shapefiles/" 
+		#~ shape.filename <- "bcr.shp"		  # watch capitalization!
+		#~ att.selection.column.name <- "BCR"
+		#~ selected.shape.names <- c(13, 27)   # class must match att.selection.column
+
+		#~ # ------------------------------------------------------------
+	#~ location.pip <- point.in.shapefile(
+			#~ sites, 
+			#~ shape.dir, 
+			#~ shape.filename, 
+			#~ att.selection.column.name,
+			#~ selected.shape.names) 
+	#~ plot(sites)
+	#~ points(sites[location.pip,], col="red",cex=0.25)		
+# ------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------
+point.in.shapefile <- function(
+		sites, 
+		shape.dir, 
+		shape.filename, 
+		att.selection.column.name,
+		selected.shape.names
+		 ) {
+# ------------------------------------------------------------------------------------------------------
+	require(maptools)
+	require(splancs)
+	#require(maps)
+	# --------------------------------------------------------------
+	# Read Shape File & Create Map object (using Maptools package)
+	#--------------------------------------------------------------
+		#shape.dir <-"c:\\users\\Research.AKN\\BDT\\Data\\point.in.polygon\\"
+		#shape.dir <- data.dir
+		#shape.filename <- "STATES.shp"
+		#shape.data <- read.shape(paste(shape.dir,shape.filename,sep=""))
+		
+		# 2.24.10 Theo Damoulas 
+		# The map tools library was "updated"
+		# !!!!!!! function read.shape deprecated use internal ::: to find
+		shape.data <- maptools:::read.shape(paste(shape.dir,shape.filename,sep=""))
+		#maptools:::getinfo.shape(paste(shape.dir,shape.filename,sep=""))		
+		
+		# --------------------------------------------------------------------------------
+		# Because each shape file has its own attr data frame, 
+		# 	1) find the att.selection.column.name of the att.data data.frame 
+		# 	2) search for selected.shape.names in the att.selection.column
+		# --------------------------------------------------------------------------------
+		att.col.index <-( names(shape.data$att.data) %in% 
+                      att.selection.column.name )
+		#selected.regions <- subset(Map2poly(shape.data),
+		#		shape.data$att.data[, att.col.index] %in% selected.shape.names  )
+		selected.regions <- subset(maptools:::Map2poly(shape.data),
+				shape.data$att.data[, att.col.index] %in% selected.shape.names  )
+				
+	# ----------------------------------------------
+	# PIP function
+	# ----------------------------------------------
+		selected.sites <- NULL           
+		nnn.regions <- length(selected.regions[])
+		point.in.poly.ind <- NULL
+		for (iii in 1:nnn.regions){
+			# --------------------------------------------------
+			temp.region <- selected.regions[[iii]]               
+			# cycle through individual parts within each polygon region
+			# performing the PinP operation one part at a time
+			# instead of one region at a time
+			# ------------------------------------------------
+			attr.temp <- attributes(temp.region)
+      #nParts <-  temp.region at nParts
+			nParts <- attr.temp$nParts
+      for (jjj in 1:nParts) {
+				#begin.ttt <- temp.region at pstart$from[jjj]
+				#end.ttt <- temp.region at pstart$to[jjj]
+				begin.ttt <- attr.temp$pstart$from[jjj]
+				end.ttt <- attr.temp$pstart$to[jjj]
+				ttt <- temp.region[begin.ttt:end.ttt,]                   
+				res <- try(inpip(sites[c("lon","lat")], ttt))
+				# If no errors, collect indices of sites that
+				# are within the set of polygons.
+				if (class(res)=="integer")
+					point.in.poly.ind <- c(point.in.poly.ind,res)
+			} # end for jjj
+		} #end for iii
+	# --------------------------------------------------------	
+	# Collect all point in Polygon set
+	# --------------------------------------------------------
+	location.pip <- rep(FALSE, NROW(sites))
+	location.pip[point.in.poly.ind] <- TRUE
+	return(location.pip)
+} # end function
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+
+
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+# Point-in-Polygon Function
+# -----------------------------------------------------------------------------
+# Daniel Fink 
+# 10.08.08
+# 03.17.10
+#
+# Description
+# -----------------
+# For a given set of locations determine if they fall into 
+# a sinlge Polygon. Return one index (length of locations).  
+#
+# Input
+# ----------
+#     xxx, yyy - locations 
+#     polygon.vertices - data.frame with named vertices x and y 
+# 							corresponding to xxx and yyy coordinates, resp.
+# 
+# Output 
+# ----------
+# 		 index vector the length of locations
+#
+# Notes: 
+# ---------
+#
+# Examples: 
+# ----------
+#nnn <- 1000
+#xxx <- rnorm(nnn, mean=0, sd=1)
+#yyy <- rnorm(nnn, mean=0, sd=1)
+#unit.sq.polygon <- data.frame( x=c(0,0,1,1),y=c(0,1,1,0))
+#pip.index <- point.in.polygon(
+#								xxx = xxx, 
+#								yyy = yyy,
+#								polygon.vertices = unit.sq.polygon)
+#plot(xxx, yyy, type="n")
+#polygon(unit.sq.polygon, col="blue")
+#points(xxx,yyy)
+#points(xxx[pip.index], yyy[pip.index], pch=19, col="yellow")					
+#	
+# -----------------------------------------------------------------------------
+point.in.polygon <- function(
+		xxx, yyy, 
+		polygon.vertices){
+# ------------------------------------------
+    require(splancs)
+ 		ttt.index <- inpip(cbind(xxx,yyy),
+                              cbind(polygon.vertices$x, 
+                                    polygon.vertices$y))
+		data.index <- rep(FALSE, length(xxx))
+		data.index[ttt.index] <- TRUE   
+ return(data.index)
+}#---------------------------------------------------------------------
+#-----------------------------------------------------------------------
+# Drew, Kevin, and the Point in Polygon requires a lot 
+# DF: is very general - allows very flexible spatial partions
+# Drew: is computationally intensive
+# Kevin: is easily replaced 
+# 
+# I have changed the name because point.in.polygon is 
+# used LEGITIMATELY used in many other routines. 
+# This new function expedites the logic that selects 
+# stixels (ST ensemble extents/subsets)
+# 	 predict.ST.ensemble
+# 	 sample.ST.ensemble
+# 	and create.ST.ensemble
+#
+#
+# ------------------------------------------
+# ------------------------------------------
+## For North America
+##
+## min(x), max(y)
+##       -----------------------
+##       |                     |
+##       |                     |    		
+##       |                     | 
+##       |                     |           
+##       |                     |
+##       |                     |            
+##       -----------------------
+##                       max(x), min(y)
+##
+## This means that even if the base model extents 
+## were indeed non-rectangular polgons, then 
+## this logic will simply cover each polygon with 
+## the smallest covering retangle. 
+## This is an interesting idea. 
+##
+##
+## Here is another way to do it: 
+# The order of the vertices written by create.ST.ensemble is:
+# 1)	Lower Left corner
+# 2) 	Upper Left
+# 3) 	Upper Right
+# 4) 	Lower Right
+#	ttt.index <- rep(FALSE, length(xxx))
+#	ttt.index <- xxx >= polygon.vertices$x[1] &
+#				xxx <= polygon.vertices$x[4] & 
+#				yyy >= polygon.vertices$y[1] &
+#				xxx <= polygon.vertices$y[2] 
+#
+#-----------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+point.in.rectangle <- function(
+		xxx, yyy, 
+		polygon.vertices){
+# ------------------------------------------
+    maxX <- max(polygon.vertices$x)
+    minX <- min(polygon.vertices$x)
+    maxY <- max(polygon.vertices$y)
+    minY <- min(polygon.vertices$y)
+    newDataIndex <- rep(FALSE, length(xxx))
+    locationMask <- xxx <= maxX & xxx >= minX & yyy <= maxY & yyy >= minY   
+    newDataIndex[locationMask] <- TRUE
+####    if (isTRUE(all.equal(data.index,newDataIndex)) == FALSE) {
+####       print("~~~~~ point.in.polygon FALSE")
+####    }
+   return(newDataIndex)
+}#---------------------------------------------------------------------
+#-----------------------------------------------------------------------
+#-----------------------------------------------------------------------
+
+
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# BS.RPART Mapping Plot Function   
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# 1.2.08
+#
+# Description:
+# ----------------
+# This function produces a single map image using fields. 
+# No smoothing. 
+# Primitive (i.e. rectangular) control of spatial extent  
+#
+# INPUT
+# ------------			
+#   xxx
+#   yyy
+#   zzz
+#
+# OUTPUT
+# ------------
+#
+# To do: 
+# ---------
+#
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+bs.rpart.maps <- function(
+		# Data			
+			xxx, 
+			yyy,
+			zzz,
+			pred.grid.size = NULL, 
+      			grid.size.ratio = 2, 	
+			spatial.extent = NULL,
+	        # Save File
+     			save.name = NULL,
+			plot.width = 800,
+			plot.height = 600,
+			main.text = NULL,
+		# Pass in other plotting parameters 
+			col.palette=NULL,
+			... )
+{  #begin function
+
+# ------------------------------------------------------
+# Inits
+# ------------------------------------------------------
+	call <- match.call()
+    	require(maps)
+    	require(fields)  
+    	
+    	if (is.null(col.palette)){
+    	# Color scheme stolen from sp library	
+	 col.palette<- c(   	
+	  "#000033FF", "#00003CFF", "#000046FF", "#00004FFF", "#000058FF", "#000061FF",
+	  "#00006BFF", "#000074FF", "#00007DFF", "#000086FF", "#000090FF", "#000099FF",
+	  "#0000A2FF", "#0000ACFF", "#0000B5FF", "#0000BEFF", "#0000C7FF", "#0000D1FF",
+	  "#0000DAFF", "#0000E3FF", "#0000ECFF", "#0000F6FF", "#0000FFFF", "#0700FFFF",
+	  "#0E00FFFF", "#1600FFFF", "#1D00FFFF", "#2400FFFF", "#2B00FFFF", "#3300FFFF",
+	  "#3A00FFFF", "#4100FFFF", "#4800FFFF", "#5000FFFF", "#5700FFFF", "#5E00FFFF",
+	  "#6500FFFF", "#6D00FFFF", "#7400FFFF", "#7B00FFFF", "#8200FFFF", "#8A01FEFF",
+	  "#9106F9FF", "#980BF4FF", "#9F0FF0FF", "#A714EBFF", "#AE19E6FF", "#B51DE2FF",
+	  "#BC22DDFF", "#C426D9FF", "#CB2BD4FF", "#D230CFFF", "#D934CBFF", "#E139C6FF",
+	  "#E83EC1FF", "#EF42BDFF", "#F647B8FF", "#FE4CB3FF", "#FF50AFFF", "#FF55AAFF",
+	  "#FF59A6FF", "#FF5EA1FF", "#FF639CFF", "#FF6798FF", "#FF6C93FF", "#FF718EFF",
+	  "#FF758AFF", "#FF7A85FF", "#FF7F80FF", "#FF837CFF", "#FF8877FF", "#FF8C73FF",
+	  "#FF916EFF", "#FF9669FF", "#FF9A65FF", "#FF9F60FF", "#FFA45BFF", "#FFA857FF",
+	  "#FFAD52FF", "#FFB24DFF", "#FFB649FF", "#FFBB44FF", "#FFBF40FF", "#FFC43BFF",
+	  "#FFC936FF", "#FFCD32FF", "#FFD22DFF", "#FFD728FF", "#FFDB24FF", "#FFE01FFF",
+	  "#FFE51AFF", "#FFE916FF", "#FFEE11FF", "#FFF20DFF", "#FFF708FF", "#FFFC03FF",
+	  "#FFFF09FF", "#FFFF26FF", "#FFFF43FF", "#FFFF60FF")}
+
+# ----------------------------------------------
+# Set Spatial Extent
+# ----------------------------------------------
+    	if  (!is.null(spatial.extent)) { 
+	     	if (is.null(spatial.extent$lat.max))   spatial.extent$lat.max <- max(yyy)
+	     	if (is.null(spatial.extent$lat.min))   spatial.extent$lat.min <- min(yyy)
+	     	if (is.null(spatial.extent$lon.min))   spatial.extent$lon.min <- min(xxx)
+	     	if (is.null(spatial.extent$lon.max))   spatial.extent$lon.max <- max(xxx)
+	      	x.zoom.ind <- (xxx < spatial.extent$lon.max & xxx > spatial.extent$lon.min)
+	      	y.zoom.ind <- (yyy < spatial.extent$lat.max & yyy > spatial.extent$lat.min)
+	      	zoom.ind <- as.logical( x.zoom.ind & y.zoom.ind)
+	      	#sum(zoom.ind)
+	      	zzz <- zzz[zoom.ind]
+	      	xxx <- xxx[zoom.ind] 
+	      	yyy <- yyy[zoom.ind] 
+     	}   
+
+  # ------------------------------------------------------------------------
+  # Discretization size
+  # ------------------------------------------------------------------------
+  # Calculate the maximum number of grid cells(minimum grid cell area)
+  # to achieve the 10 random locations per cell from the prediction
+  # grid design.
+  #
+  # The minimum Longitude grid side = .28872 deg long
+  # This number comes from the stratified design used to sample the 
+  # random locations based on extent and 200 equally spaced lon cells: 
+  #                          .28872 deg long =   (-124.72839 - -66.98426)/200
+  #
+  # The minimum Latitude grid side = .24421 deg lat
+  # This number comes from the stratified design used to sample the 
+  # random locations based on extent and 100 equally spaced lat cells: 
+  #				.24421 deg lat= (48.97630 - 24.55572)/100
+  #------------------------------------------------------------------------
+	if (is.null(pred.grid.size)) {
+		  # Calculate Maximum pred.grid.size for this region
+		  pred.grid.size.max.xxx <- floor( (max(xxx) - min(xxx))/.28872 )
+		  pred.grid.size.max.yyy <- floor( (max(yyy) - min(yyy))/.24421 )
+		  if (pred.grid.size.max.xxx/2 < pred.grid.size.max.yyy)
+		        pred.grid.size <- floor(pred.grid.size.max.xxx/2)
+		  if (pred.grid.size.max.xxx > pred.grid.size.max.yyy*2)
+		        pred.grid.size <- floor(pred.grid.size.max.yyy)
+		  #pred.grid.size
+		  }
+
+  # ----------------------------------------------
+  # Create Prediction Grid with as.image
+  # ----------------------------------------------   
+      ttt.image <- as.image(zzz,
+                x= data.frame(xxx,yyy),
+                nrow=round(pred.grid.size*grid.size.ratio),  	# nrow=X direction
+                ncol=pred.grid.size,     		# ncol=Y direction
+		na.rm=TRUE)
+
+    if  (!is.null(save.name)){
+    	png(file=save.name, 
+    			bg="white",
+    			width = plot.width, 
+    			height = plot.height)
+    			}      
+      image.plot(ttt.image, 
+      		col = col.palette, ...) 
+          #      			zlim=c(0,5))
+       	if  (!is.null(main.text)){
+     		title(main = main.text , font.main=4, line=2) 
+		    title(main = paste("Spatial Grid:",pred.grid.size,"x",
+	            pred.grid.size*2), font.main=4, line=1, cex.main=0.75)}
+      
+      # Add political Boundaries
+      # ----------------------------
+      #map('state',add=TRUE, lwd=2, col="yellow")
+      #map('state',add=TRUE, lwd=1.5, col="black")
+
+if  (!is.null(save.name)){
+    	dev.off()
+    			}
+    
+# --------------------------------------------------------------------------
+} # end function
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+
+
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+# Point-in-Polygon Contours
+# -----------------------------------------------------------------------------
+# Daniel Fink 
+# 2.7.08
+#
+# Description
+# -----------------
+# For a given set of locations determine if they fall into 
+# a set of Polygon contours. Return one index (lenght of locations)
+# for each unique level of polygon contours. 
+#
+# Also compute quantiles for locations and make a pretty picture. 
+#
+# Input
+# ----------
+#     xxx, yyy - locations 
+#     contour.polygons - list of polygon contours from contourLines 
+#                         function
+#
+# Output 
+# ----------
+# Return one index (lenght of locations)
+# for each unique level of polygon contours.
+#
+# Notes: 
+# ---------
+#
+# Further Development: 
+# ----------------------------
+# -----------------------------------------------------------------------------
+point.in.polygon.contours <- function(
+		xxx, yyy, 
+		contour.polygons){
+# ------------------------------------------
+#  Dummy Values/Calls
+# ------------------------------------------
+ #contour.polygons <- sd.cont$contour.polygons
+# ------------------------------------------
+#  Inits
+# ------------------------------------------
+    require(splancs)
+
+# ------------------------------------------
+#  Identify unique polygon levels 
+# ------------------------------------------
+   level.index <- rep(0,length(contour.polygons)) 
+   for (iii in 1:length(contour.polygons)) 
+       level.index[iii] <- contour.polygons[[iii]]$level
+   unique.levels <- sort(unique(level.index))
+   # Matrix of Contour indices
+   contour.index <- matrix(FALSE,length(xxx),length(unique.levels))   
+               
+    # Cycle through all Polygons in order  
+    # ** Do point-in-polygon operations 
+    # ** store indices according to polygon level 
+    # ----------------------------------------------------------
+        #sum.points <- 0
+        for (jjj in 1:length(contour.polygons)) {
+            ttt.ind <- inpip(cbind(yyy,xxx),
+                              cbind(contour.polygons[[jjj]]$y, 
+                                    contour.polygons[[jjj]]$x))
+            # Construct/store contour indices
+            col.index <- (contour.polygons[[jjj]]$level == unique.levels)
+            contour.index[ ttt.ind, col.index] <- TRUE
+            }        
+        # -----------------------
+        # Empirical Quantiles
+        empirical.quant <- apply(contour.index, 2, mean)
+
+    # ---------------------------------------------------------
+    # Construct Indices into nonoverlapping contours
+    # ---------------------------------------------------------
+       non.olap.index <- matrix(FALSE, NROW(contour.index), 
+                           NCOL(contour.index)) 
+       # Begin with smallest contour
+       non.olap.index[,NCOL(contour.index)] <-
+              contour.index[,NCOL(contour.index)]  
+       # Sequentially subtract
+       for (iii in NCOL(contour.index):2){    
+              non.olap.index[,(iii-1)] <- (contour.index[,(iii-1)] & 
+                                            !contour.index[,iii])
+            }         
+       # % of data in each contour
+       n.contour <- apply(non.olap.index, 2, sum)
+    # ---------------------------------------------------------
+            
+# Return contours as polygons too!!! 
+results.list <- list(
+        xxx = xxx,
+        yyy = yyy, 
+        empirical.quant = empirical.quant,
+        contour.polygons = contour.polygons,
+        contour.index = contour.index,
+        contour.level.index = level.index, 
+        non.olap.index = non.olap.index, 
+        n.contour = n.contour) 
+ return(results.list)
+}#---------------------------------------------------------------------
+#-----------------------------------------------------------------------
+
+
+#-----------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+# Smooth ST Predictions 
+#  
+# -------------------------------------------------------------------------------
+smooth.st.predictions <- function(
+		kkk, # Single Time slice
+		pred.grid.size, # roughly twice desired plotting resolution
+		gam.smoothing.knots=25, 
+		st.rough.dir,
+    		st.rough.name ,
+		st.smooth.dir ,
+		st.smooth.name){
+		# ----------------
+		#shape.dir, # <- "C:\\users\\Research.STBDT\\Data\\BDT.shapefiles\\"
+    		#shape.filename, # <- "STATES.shp"
+    		#selected.state.names = NULL) {
+  # -----------------------------------------------
+    stp.name <- paste(st.rough.dir,st.rough.name,".",kkk,".RData",sep="")
+		load(stp.name) #st.pred   
+    require(mgcv)
+    # -----------------------------------------------
+    xxx <- st.pred$xxx
+    yyy <- st.pred$yyy
+    #xxx.name <- "Lon"
+    #yyy.name <- "Lat"
+    zzz <- st.pred$pred
+    # -----------------------------------------------
+    require(mgcv)
+    d.gam <- gam( zzz ~ s(xxx,yyy, k=gam.smoothing.knots))
+    nnn.xxx <- pred.grid.size
+    nnn.yyy <- pred.grid.size
+    xxx.pred <- seq(from=min(xxx),to=max(xxx),length=nnn.xxx)
+    yyy.pred <- seq(from=min(yyy),to=max(yyy),length=nnn.yyy)
+    pred.design <- expand.grid(xxx=xxx.pred, yyy=yyy.pred)
+    # "Fuzz up" Prediction Grid to better fill in image.plot
+    pred.design$xxx <- pred.design$xxx + runif(NROW(pred.design), 
+                min = -(abs(xxx.pred[2] - xxx.pred[1]))/2.,
+                max =  (abs(xxx.pred[2] - xxx.pred[1]))/2.)
+    pred.design$yyy <- pred.design$yyy + runif(NROW(pred.design), 
+                min = -(abs(yyy.pred[2] - yyy.pred[1]))/2.,
+                max =  (abs(yyy.pred[2] - yyy.pred[1]))/2.)
+#  # -------------------------------------------------------
+#  # Cutout US States to reduce prediction time! 
+#	# --------------------------------------------------------------
+#	if (!is.null(selected.state.names)){
+#		sites <- data.frame(lon=pred.design$xxx, lat=pred.design$yyy)
+#		#shape.dir <- "C:\\users\\Research.STBDT\\Data\\BDT.shapefiles\\"
+#    		#shape.filename <- "STATES.shp"
+#    		#selected.shape.names <- 
+#        #      c("New York", "Pennsylvania", "New Jersey", 
+#        #        "Ohio", "West Virginia", "Delaware", "Connecticut",
+#        #        "Rhode Island", "Massachusetts", 
+#        #        "Vermont", "New Hampshire", "Maine", 
+#        #        "Maryland", "Virginia")
+#	  att.selection.column.name <- "STATE_NAME"
+#    	  location.pip <- point.in.shapefile(
+#    			sites, 
+#    			shape.dir, 
+#    			shape.filename, 
+#    			att.selection.column.name,
+#    			selected.shape.names=selected.state.names) 
+#    	   #plot(sites)
+#    	   #points(sites[location.pip,], col="red",cex=0.25)	    
+#        pred.design <- pred.design[ location.pip, ]
+#    }            
+#    # -------------------------------
+    pred.gam <- predict(d.gam, 
+                newdata=pred.design,
+                se.fit=FALSE, type="response")
+    st.pred <- data.frame(pred.design, pred=pred.gam)
+    names(st.pred)
+    dim(st.pred)
+    # -----------------------------------------------
+    smooth.filename <- paste(st.smooth.dir,st.smooth.name,".",kkk,".RData",sep="")
+    save(st.pred, file=smooth.filename)
+    # For initialization in Halloween.maps()
+    #smooth.filename <- paste(st.smooth.dir,st.smooth.name,".",1,".RData",sep="")
+    #save(st.pred, file=smooth.filename)
+    # -----------------------------------------------  
+  # ------------------------------------------------------------
+  # Return Values
+  # ------------------------------------------------------------
+} # end function
+# --------------------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------------------
+
+
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# Load & Process SPAT_COVAR Data for Spatial Prediction
+# --------------------------------------------------------------------------
+# This function will load, subsample, and process the Spatial
+# prediction data.
+#
+# Like the other functions I am writing, I will begin by keeping
+# this as simple as possible. KISS!!
+#
+# INPUT
+# ------------
+# INPUT
+# ------------
+# 	pred.data.file <- character string for file location including directory
+#       	pred.dir <-  "~/norcar.temp/USA Prediction Grid/"
+#        	pred.data.file <- paste(pred.dir,"Random.locations.NE.10.31.07.csv",sep="")
+#
+#
+#   		This file is assumed to contain the following fields/information
+#
+#		what happens if a field is missing?
+#		Should these fields be compared/match to the p.data$X fields used to
+# 			develop the model?
+#
+#
+# 	NNN.pred <- (sub)sample size of prediction data file. Defalult = NULL
+#				(defaults to whole data set)
+#	NNN <- 5000
+# 	spatial.extent <- list( # NE Region
+#				      lat.max <- 45.0,
+#				      lat.min <- 39.0,
+#				      lon.min <- -82.5,
+#				      lon.max <- -67.0  )
+#
+# OUTPUT
+# ------------
+# 	D.pred  - prediction data frame
+# 	locs - 	locations corresponding to D.pred
+#
+# To do:
+# ---------
+# I need to describe the format of D.pred in detail so that I can
+# generate new sets. Part of this will be to point to/describe the
+# process that Roger and I went through to generate this data.
+#
+# Currently, I have hard coded the list of predictor variables that
+# to be added to D.pred. I would like to add logic to match and
+# keep only those predictors that match a list of predictor names
+# 		target.var <- names(p.data$X)
+# possibly matching the classes of the variables too. That would
+# be very useful.
+#
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+make.SPAT.COVAR.pred.data <- function(
+			pred.data.file,
+			NNN.pred = NULL,
+			spatial.extent = NULL)  {
+# ---------------------------------------------------
+	call <- match.call()
+# ----------------------------------------------
+# Load Data
+# ----------------------------------------------
+        D.pred <- read.csv(file=pred.data.file)
+        #dim(D.pred) #27933   67
+# ----------------------------------------------
+# Set Spatial Extent
+# ----------------------------------------------
+    	if  (!is.null(spatial.extent)) {
+	     	xxx <- D.pred$DECIMAL_LONGITUDE
+	     	yyy <- D.pred$DECIMAL_LATITUDE
+	     	if (is.null(spatial.extent$lat.max))   spatial.extent$lat.max <- max(yyy)
+	     	if (is.null(spatial.extent$lat.min))   spatial.extent$lat.min <- min(yyy)
+	     	if (is.null(spatial.extent$lon.min))   spatial.extent$lon.min <- min(xxx)
+	     	if (is.null(spatial.extent$lon.max))   spatial.extent$lon.max <- max(xxx)
+	      	x.zoom.ind <- (xxx < spatial.extent$lon.max & xxx > spatial.extent$lon.min)
+	      	y.zoom.ind <- (yyy < spatial.extent$lat.max & yyy > spatial.extent$lat.min)
+	      	zoom.ind <- as.logical( x.zoom.ind & y.zoom.ind)
+	      	#sum(zoom.ind)
+	      	D.pred <- D.pred[zoom.ind, ]
+	      	rm(xxx,yyy)
+     	}
+
+# ---------------------------------------------------------------------
+# Convert regional NCLD classes counts to proportions
+# ---------------------------------------------------------------------
+	  # Currently, Rogers NLCD neighborhood variables in SPATCOVAR
+	  # contain the counts of each landcover class within the given neighborhood.
+	  #   i.e percentages x 100
+	  # # of cells = (a*r)^2
+	  #
+	  # This was only for earlier version ==>
+	  # It should be a non-issue with the "new" version of
+	  # "ebird.data.processing.12.03.07.R"
+	  # ----------------------------------------------------
+	  #  NLCD01_CMN"   "NLCD01_IMN", are already stored as %'s
+	  # However, I am going to include them so that these
+	  # predictors are 100% compatible with the ebird predictors.
+	  # I need to fix the ebird data!!!
+	  # ------------------------------------------------------------
+	  nbhd.size <- c("A10R15", "A10R5", "A100R5")
+	  nbhd.cell.size <- c(22500,2500,250000)
+	  nlcd.vars <- c(
+	          "NLCD01_N11",           "NLCD01_N12",
+	          "NLCD01_N21",           "NLCD01_N22",
+	          "NLCD01_N23",           "NLCD01_N24",
+	          "NLCD01_N31",           "NLCD01_N41",
+	          "NLCD01_N42",           "NLCD01_N43",
+	          "NLCD01_N52",           "NLCD01_N71",
+	          "NLCD01_N81",           "NLCD01_N82",
+	          "NLCD01_N90",           "NLCD01_N95")
+	  for (iii in 1:3) {
+		    regional.nlcd.vars <- paste(nlcd.vars, nbhd.size[iii] ,sep="")
+		    D.pred[,names(D.pred) %in% regional.nlcd.vars] <-
+		          D.pred[,names(D.pred) %in%
+		          	regional.nlcd.vars]/nbhd.cell.size[iii]*100
+	  }
+# ------------------------------------------------------------
+# Subsampling
+# ------------------------------------------------------------
+  subsample.index <- NULL
+  if (!is.null(NNN.pred)) {
+        	if (NNN.pred < NROW(D.pred)){
+        		subsample.index <- sample(1:NROW(D.pred), NNN.pred)
+        		D.pred <- D.pred[subsample.index, ]
+        }}
+
+# ------------------------------------------------------------
+# Predictor Processing
+# ------------------------------------------------------------
+	        y <- D.pred$DECIMAL_LATITUDE
+	        x <- D.pred$DECIMAL_LONGITUDE
+	        # List of D.NE predictors that need to be removed
+	        remove.var <- c( "X", "DECIMAL_LATITUDE_CS", "DECIMAL_LONGITUDE_CS",
+	                      "NED48_ELEVATION",  "BLOCKGROUP_FIPS_ESRI04" ,
+	                      "DECIMAL_LATITUDE",  "DECIMAL_LONGITUDE")
+	                      # "NLCD01_IMPERV" , "NLCD01_LANDCOVER" )
+	        D.pred <-  D.pred[ , !(names(D.pred) %in% remove.var) ]
+    	# BCR Processing: BCR == 0 occurs at coastline locations
+    	# ---------------------------------------------------------------------
+	          #points( loc.x[ D.pred$BCR == 0],
+	          #      loc.y[ D.pred$BCR == 0],
+	          #      col=4,
+	          #      cex=3.0,
+	          #      pch=5)
+	          D.pred$BCR[ D.pred$BCR == 0] <- NA
+	          D.pred$BCR <- as.factor(D.pred$BCR)
+            	  D.pred$NLCD01_LANDCOVER <- as.factor(D.pred$NLCD01_LANDCOVER)
+    	# Append Lat & lon
+    	# ------------------------------------------
+        	D.pred <- cbind(D.pred, x, y)
+# ------------------------------------------------------------
+# Return Values
+# ------------------------------------------------------------
+	locs <- data.frame(x = x, y=y)
+	data.list <- list(
+		call = call,
+		locs = locs,
+		D.pred = D.pred,
+		subsample.index=subsample.index)
+	return(data.list)
+} # end function
+
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+
+
+
+
+
+# -----------------------------------------------------------------------------------------------------------
+# Plot Monthly Training Data Map
+# -----------------------------------------------------------------------------------------------------------		
+monthly.maps <- function(	
+		    xxx,
+		    yyy,
+		    jdates,
+		    zzz, # same length as (xxx, yyy, jdates)
+		    zzz.index.1,  #red   obs > pred  ===> Predictions too BIG
+		    zzz.index.2)
+{# ----------------------------------------
+		mo.txt <- c("Jan","Feb","Mar","Apr","May","Jun",
+				"Jul","Aug","Sep","Oct","Nov","Dec")	
+		require(maps)  
+	     par(mfrow=c(3,4),mar=c(0,0,1,0),cex=1.0)
+		n.period <- 12
+		for (iii in 1:n.period) {
+			#Subseting Criterion
+			# -------------------------------------
+			#ll <- min(jdates)
+			#ul <- max(jdates)
+			#ttt.index <- jdates >= ll & jdates <= ul 
+			ll <- (365/n.period)*(iii-1)
+			ul <- (365/n.period)*(iii)
+			ttt.index <- jdates > ll & jdates < ul 
+			# --------------------------------------
+			plot(	xxx[ttt.index], 
+				yyy[ttt.index], 
+					#type="n",
+					cex=0.25,
+					pch=19,
+					col="grey",
+					axes = FALSE,
+					main=paste( mo.txt[iii], " ", format(ll, digits=3),":", 
+							format(ul, digits=3),"   + propor = ",
+							format(sum(zzz[ttt.index] > 0)/ sum(ttt.index),
+							digits=3)))
+			box()
+			# ---------------------------------------
+			# Add negative residuals in blue 
+			# RED, neg res ==> ppp> yyy ==> almost all occur when yyy == 0)
+			# ----------------------------------------
+			ttt.index <- jdates > ll & jdates < ul & zzz.index.1
+			points(	xxx[ttt.index], 
+					yyy[ttt.index], 
+					cex=sqrt(abs(zzz[ttt.index])),
+					col="red",
+					#cex=0.25,
+					pch=1)	
+			# BLUE ==> ppp < yyy
+			ttt.index <- jdates > ll & jdates < ul  & zzz.index.2
+			points(	xxx[ttt.index], 
+					yyy[ttt.index], 
+					cex=sqrt(abs(zzz[ttt.index])),
+					col="blue",
+					#cex=0.25,
+					pch=4)					
+			# Add political Boundaries
+			# ----------------------------
+			map('state',add=TRUE, lwd=2, col="yellow")
+			map('state',add=TRUE, lwd=1.5, col="black")   
+		} # end iii = months
+
+  # ------------------------------------------------------------
+  # Return Values
+  # ------------------------------------------------------------
+	return()
+} # end function
+# --------------------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------------------
+
+
+# ------------------------------------------------------------------
+#  FOR LOOP over time slices (within season)
+#   * Load Predicted Surface
+#   * Pixelate it
+#   * Stack pixelated surface into Clustering design
+#        row = pixel/locations, cols= times
+#        ==> group trajectories
+#        Q: rows come from stack/unstack(ttt.image) ??
+#   * END FOR
+#
+#  Then cluster the Clustering design
+#  Output: each row, i.e. pixel/location will get a cluster
+#          label and a silhoullette number
+#
+#  Plot these on a map, perhaps one color at a time.
+#
+#
+# Inputs: 
+# ---------
+#   		stp.save.name,  #bs.stp.save.name
+#         temporal.index,
+#         pred.grid.size,
+#         grid.size.ratio,
+#         spatial.index=NULL  This is an index on the prediction vector, 
+# 								usually used to select regions (BCR's or states) 
+# Outputs: 
+# ---------
+#return.list <- list(call=call,
+#                    X=X.cluster,
+#                    X.image = ttt.image)
+# ------------------------------------------------------------------
+make.functional.data.design.matrix <- function(
+         stp.save.dir,	#bs.stp.save.dir 
+	    stp.save.name,  #bs.stp.save.name
+         temporal.index,
+         pred.grid.size,
+         grid.size.ratio,
+         spatial.index=NULL){
+ # ----------------------------------
+	call <- match.call()
+    # ------------------------------------------------------------
+    X.cluster <- NULL
+    # ------------------------------------------------
+    for (iii in (temporal.index)){
+      # ----------------------------------------------
+      # Load Space-Time Predictions From file
+      # ----------------------------------------------
+          stp.name <- paste(stp.save.dir,stp.save.name,".",iii,".RData",sep="")
+    			load(stp.name) # st.pred
+      # ----------------------------------------------
+      # Spatial Index
+      # ----------------------------------------------      
+          if (is.null(spatial.index))  
+                spatial.index <- rep(TRUE, length(st.pred$xxx))
+      # ----------------------------------------------
+      # Create Prediction Grid with as.image
+      # ----------------------------------------------
+          xxx <- st.pred$xxx[spatial.index]
+          yyy <- st.pred$yyy[spatial.index]
+          zzz <- st.pred$pred[spatial.index]
+      # ----------------------------------------------
+      # Stack/Unstack using as.image
+      # ----------------------------------------------
+          ttt.image <- as.image(zzz,
+                    x= data.frame(xxx,yyy),
+                    nrow=round(pred.grid.size*grid.size.ratio), # nrow=X direction
+                    ncol=pred.grid.size,
+				na.rm=TRUE)     		                # ncol=Y direction
+           #names(ttt.image)
+           # ---------------------
+           zzz.vector <- rep(0, length( ttt.image$ind[,1] ))
+           for (jjj in 1:length( ttt.image$ind[,1] ))
+                  zzz.vector[jjj] <- ttt.image$z[ ttt.image$ind[jjj,1],
+                                                  ttt.image$ind[jjj,2]]
+           #zzz.loc.x <- ttt.image$x[ttt.image$ind[,1]]
+           #zzz.loc.y <- ttt.image$y[ttt.image$ind[,2]]
+           # ---------------------
+           #hist(zzz.vector)
+           #image.plot(ttt.image)
+           #points(ttt.image$x[ttt.image$ind[,1]],
+           #       ttt.image$y[ttt.image$ind[,2]],
+           #       cex=0.5*zzz.vector ,
+           #       col="yellow")
+           # ---------------------
+      # ----------------------------------------------
+      # Add to cluster design
+      # ----------------------------------------------
+      X.cluster <- cbind(X.cluster, zzz.vector)
+  } # end iii
+# ------------------------------------------
+# Return Values
+# ------------------------------------------
+return.list <- list(call=call,
+                    X=X.cluster,
+                    X.image = ttt.image)
+return(return.list)
+# --------------------------------------------------------------------------
+} # end function
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+# --------------------------------------------------------------------------
+
diff --git a/contrib/stem/current.vt b/contrib/stem/current.vt
new file mode 100644
index 0000000..9a86095
Binary files /dev/null and b/contrib/stem/current.vt differ
diff --git a/contrib/stem/init.py b/contrib/stem/init.py
new file mode 100644
index 0000000..efacabb
--- /dev/null
+++ b/contrib/stem/init.py
@@ -0,0 +1,646 @@
+import os
+
+from core.modules.basic_modules import File, Directory, new_constant
+from core.modules.module_registry import get_module_registry
+from core.modules.vistrails_module import Module, ModuleError, ModuleConnector
+
+reg = get_module_registry()
+RSource = \
+    reg.get_descriptor_by_name('edu.utah.sci.vistrails.rpy', 'RSource').module
+RFigure = reg.get_descriptor_by_name('edu.utah.sci.vistrails.rpy',
+                                     'RFigure', 'Figures').module
+
+def create_file_module(fname, f=None):
+    if f is None:
+        f = File()
+    f.name = fname
+    f.upToDate = True
+    return f
+
+def create_dir_module(dname, d=None):
+    if d is None:
+        d = Directory()
+    d.name = dname
+    d.upToDate = True
+    return d
+
+def get_path(fname=''):
+    return os.path.join(os.path.dirname(__file__), fname)
+
+def build_params(input_ports, remap={}):
+    def get_name(port):
+        if port in remap:
+            return remap[port]
+        return port
+    params = ",\n".join(["%s=%s" % (get_name(port[0]), get_name(port[0]))
+                         for port in input_ports
+                         if port[0] not in remap.keys() or (port[0] in remap.keys() and remap[port[0]] is not None)])
+    return params
+
+
+
+def processActivePortData(inputPorts, object):
+    portData = []
+
+    if object.hasInputFromPort('stem.globals'):       
+        stemGlobals = object.getInputFromPort('stem.globals')
+    else :
+        stemGlobals = None
+
+    for port in inputPorts:
+        if port[0] != 'stem.globals' and object.hasInputFromPort(port[0]) and object.getInputFromPort(port[0]) is not None:       
+            portData.append((port[0], port[0]))
+            if port[1] == '(edu.utah.sci.vistrails.basic:Directory)' or port[1] == '(edu.utah.sci.vistrails.basic:File)':
+                object.set_variable(port[0], object.getInputFromPort(port[0]).name)                          
+            else:
+                object.set_variable(port[0], object.getInputFromPort(port[0]))                          
+        elif stemGlobals:
+            if stemGlobals.global_vars.has_key(port[0]) and stemGlobals.global_vars[port[0]] is not None:          
+                portData.append((port[0], port[0]))
+ 
+    return portData
+
+class STEMConfiguration(RSource):
+    _input_ports = []
+    _output_ports = [('config', '(edu.cornell.birds.stem:STEMConfiguration)')]
+    def compute(self):
+        self.chdir(get_path())
+        self.run_file(get_path('STEM_Configuration.R'), 
+                      excluded_outputs=set(['config']))
+        self.setResult('config', self)
+
+class RunModels(RSource):
+    _input_ports = [('config', '(edu.cornell.birds.stem:STEMConfiguration)'),
+                    ('spp.name', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('spp.common', '(edu.utah.sci.vistrails.basic:String)')]
+    _output_ports = [('config', '(edu.cornell.birds.stem:STEMConfiguration)')]
+    def compute(self):
+        self.chdir(get_path())
+        self.set_variable('spp.dir.name', self.getInputFromPort('spp.name'))
+        self.run_file(get_path('STEM_ModelingEngine.R'),
+                      excluded_inputs=set(['source', 'config']), 
+                      excluded_outputs=set(['config']))
+        self.setResult('config', self.getInputFromPort('config'))
+
+class BuildVisualizations(RSource):
+    _input_ports = [('config', '(edu.cornell.birds.stem:STEMConfiguration)')]
+    _output_ports = [('results.dir', 
+                      '(edu.utah.sci.vistrails.basic:Directory)')]
+    def compute(self):
+        self.chdir(get_path())
+        self.run_file(get_path('STEM.nfold.pp.comp_2.12.10.R'),
+                      excluded_inputs=set(['source', 'config']),
+                      excluded_outputs=set(['results.dir']))
+        dname = list(self.get_variable('results.dir'))[0]
+        self.setResult('results.dir', create_dir_module(dname))
+        
+class STEMFigure(RFigure):
+    """Write only the R figure code.  You do not need the png or pdf
+    graphics setup code or the dev.off calls"""
+    _input_ports = [('results.dir',
+                     '(edu.utah.sci.vistrails.basic:Directory)', ),
+                    ('pp.metric', '(edu.utah.sci.vistrails.basic:String)')]
+    def compute(self):
+        self.chdir(get_path())
+        self.set_variable('results.dir', 
+                          self.getInputFromPort('results.dir').name)
+        self.run_figure_file(get_path('STEM_Figure.R'), 'png', 800, 600, 
+                             excluded_inputs=set(['source',
+                                                  'results.dir']))
+
+# class STEMCreateData(Module):
+#     """Data preparation"""
+#     def compute(self):
+#         self.run_file(get_path('STEM.erd.data.creation.R'))
+
+class STEMGlobals(RSource):
+    _input_ports = [('debugOutput', '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('platform', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('parent.dir', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('code.directory', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('species.name', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('common.name', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('erd.data.file', '(edu.utah.sci.vistrails.basic:File)'),
+                    ('srd.pred.design.file', '(edu.utah.sci.vistrails.basic:File)')]
+    _output_ports = [('self', '(edu.cornell.birds.stem:STEMGlobals)')]
+    def compute(self):
+        # run the requires and the loading of STEM libs
+        parent_dir = self.getInputFromPort('parent.dir')
+        self.chdir(self.getInputFromPort('code.directory').name)
+        self.set_variable('parent.dir', parent_dir.name)
+        # FIXME code.directory defaults to parent.dir
+        if not self.hasInputFromPort('code.directory'):
+            self.set_variable('code.directory', parent_dir.name)
+        else:
+            self.set_variable('code.directory',
+                              self.getInputFromPort('code.directory').name)
+        self.set_variable('erd.data.filename',
+                              ''.join([parent_dir.name, "Data/", self.getInputFromPort('erd.data.file').name]))
+        self.set_variable('srd.pred.design.filename',
+                          ''.join([parent_dir.name, "Data/", self.getInputFromPort('srd.pred.design.file').name]))
+        species_name = self.getInputFromPort('species.name')
+        stem_directory = create_dir_module(os.path.join(parent_dir.name, species_name))
+        self.set_variable('stem.directory', stem_directory.name)
+        self.set_variable('species.name', species_name)
+        self.set_variable('common.name', self.getInputFromPort('common.name'))
+
+        # FIXME add erd.data.filename and srd.pred.design.filename
+        # No tags needed, then
+
+        self.run_code(''.join(["source(\"", "STEM_Globals.R", "\")"]),
+                      excluded_inputs=set(['source', 'parent.dir', 
+                                           'code.directory', 'erd.data.file',
+                                            'srd.pred.design.file']))
+
+        # FIXME need to actually use and output the globals
+        global_var_list = ['debugOutput',
+                           'platform',
+                           'parent.dir',
+                           'code.directory',
+                           'species.name',
+                           'common.name',
+                           'erd.data.filename',
+                           'srd.pred.design.filename',
+                           'stem.directory',
+                           'spatial.extent.list',
+                           'temporal.extent.list',
+                           'predictor.names',
+                           'response.family',
+                           'cv.folds',
+                           'cv.folds.par.list',
+                           'cv.list',
+                           'stem.init.par.list',
+                           'base.model.par.list', 
+                           'srd.max.sample.size',
+                           'split.par.list',
+                           'st.matrix.name',
+                           'jdate.seq',
+                           'year.seq',
+                           'conditioning.vars',
+                           'st.matrix.ave.maps',
+                           'begin.seq',
+                           'end.seq',
+                           'pred.grid.size',
+                           'map.plot.width',
+                           'spatial.extent.list',
+                           'z.max',
+                           'z.min',
+                           'map.tag',
+                           'date.bar',
+                           'print.date',
+                           'county.map', 
+                           'county.map.lwd',
+                           'state.map',
+                           'state.map.lwd']
+        self.global_vars = dict((name, self.get_variable(name)) 
+                                for name in global_var_list)
+
+
+class InitERDMapAnalysis(RSource):
+    _input_ports = [('project.directory', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('species.directory.nametag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('map.directory.nametag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('map.file.nametag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('map.rows', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('z.max', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('z.min', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('map.number', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('lat.max', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('lat.min', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('lon.max', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('lon.min', '(edu.utah.sci.vistrails.basic:Float)')]
+    _output_ports = [('self', '(edu.cornell.birds.stem:InitERDMapAnalysis)')]
+    def compute(self):
+        # run the requires and the loading of STEM libs
+        self.chdir(self.getInputFromPort('project.directory'))
+
+        self.set_variable('project.directory', self.getInputFromPort('project.directory'))
+        self.set_variable('species.directory.nametag', self.getInputFromPort('species.directory.nametag'))
+        self.set_variable('map.directory.nametag', self.getInputFromPort('map.directory.nametag'))
+        self.set_variable('map.file.nametag', self.getInputFromPort('map.file.nametag'))
+        self.set_variable('map.rows', self.getInputFromPort('map.rows'))
+        self.set_variable('z.max', self.getInputFromPort('z.max'))
+        self.set_variable('z.min', self.getInputFromPort('z.min'))
+        self.set_variable('map.number', self.getInputFromPort('map.number'))
+
+        latMax = self.getInputFromPort('lat.max')
+        if latMax:
+            self.set_variable('lat.max', latMax)
+        else:
+            ## self.set_variable('lat.max', "as.null(lat.max)")
+            self.run_code("lat.max <- NULL")
+
+        latMin = self.getInputFromPort('lat.min')
+        if latMin:
+            self.set_variable('lat.min', latMin)
+        else :
+            self.run_code("lat.min <- NULL")
+
+        lonMax = self.getInputFromPort('lon.max') 
+        if lonMax:
+            self.set_variable('lon.max', lonMax)
+        else:
+            self.run_code("lon.max <- NULL")
+
+        lonMin = self.getInputFromPort('lon.min')
+        if lonMin:
+            self.set_variable('lon.min', lonMin)
+        else:
+            self.run_code("lon.min <- NULL")
+
+        self.run_code(''.join(["source(\"", self.getInputFromPort('project.directory'), '/code/stem.vt.erd.map.function.R', "\")"]))
+
+        global_var_list = ['project.directory', 
+                           'species.directory.nametag', 
+                           'map.directory.nametag', 
+                           'map.file.nametag', 
+                           'map.rows',
+                           'z.max',
+                           'z.min',
+                           'map.number',
+                           'lat.max',
+                           'lat.min',
+                           'lon.max',
+                           'lon.min'] 
+
+        self.global_vars = dict((name, self.get_variable(name)) 
+                                for name in global_var_list if name is not None)
+
+class PlotERDMaps(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:InitERDMapAnalysis)'),
+                    ('project.directory', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('species.directory.nametag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('map.directory.nametag', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('map.file.nametag', '(edu.utah.sci.vistrails.basic:File)'),
+                    ('map.rows', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('z.max', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('z.min', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('map.number', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('lat.max', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('lat.min', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('lon.max', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('lon.min', '(edu.utah.sci.vistrails.basic:Float)')]
+    _output_ports = [('map_file', '(edu.utah.sci.vistrails.basic:File)')]
+
+    def compute(self):
+        ## stem_globals = self.getInputFromPort('stem.globals')
+        ## for k, v in stem_globals.global_vars.iteritems():
+        ##     self.set_variable(k,v)                          
+
+        activePorts = processActivePortData(PlotERDMaps._input_ports, self)
+
+        remap = {'stem.globals': None}
+        params = build_params(activePorts, remap)
+        code_str = "mapFile <-stem.erd.maps(%s)" % params
+
+        self.run_code(code_str)
+
+        self.setResult('map_file', create_file_module(str(list(self.get_variable('mapFile'))[0])))
+
+
+class ERDDataCreation(RSource):
+    _input_ports = [('protocol.tag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('max.effort.hours', 
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('max.effort.distance.fm', 
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('min.obs.time', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('max.obs.time', '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('response.type', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('ebird.data.dir', 
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('erd.data.tag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('spatial.erd.tag', 
+                     '(edu.utah.sci.vistrails.basic:String)'),
+                    ('checklist.covariate.names', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('core.covariate.names', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('NLCD.class.neighborhood.size', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('NLCD.names', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('class.level.fragstats', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('landscape.fragstat.tags', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('landscape.neighborhood.size', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)')]
+    _output_ports = [('srd.pred.design.file', 
+                      '(edu.utah.sci.vistrails.basic:File)'),
+                     ('erd.design.file',
+                      '(edu.utah.sci.vistrails.basic:File)')]
+    def compute(self):
+        self.chdir(get_path())
+        self.set_variable('ebird.data.dir',
+                          self.getInputFromPort('ebird.data.dir').name)
+        self.run_file(get_path('STEM_Globals.R'),
+                      excluded_inputs=set(['source', 'ebird.data.dir']))
+        srd_fname = list(self.get_variable('srd.pred.design.filename'))[0]
+        erd_fname = list(self.get_variable('erd.design.filename'))[0]
+        self.setResult('srd.pred.design.file', create_file_module(srd_fname))
+        self.setResult('erd.design.file', create_file_module(erd_fname))
+                    
+
+class ERDDataSubsetting(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('erd.data.filename', '(edu.utah.sci.vistrails.basic:File)'),
+                    ('srd.pred.design.filename', '(edu.utah.sci.vistrails.basic:File)'),
+                    ('spatial.extent.list', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('temporal.extent.list', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('species.name', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('predictor.names', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('response.family', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('srd.max.sample.size', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('split.par.list', '(edu.utah.sci.vistrails.rpy:RList:Types)')]
+    _output_ports = [('train.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                     ('test.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                     ('pred.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                     ('stem.predictor.names', '(edu.utah.sci.vistrails.rpy:RVector:Types)')]
+    # Get train.data, test.data, srd.data from eBird.data and expose
+    # these three as the output ports
+    def compute(self):
+        ## stem_globals = self.getInputFromPort('stem.globals')
+        ## for k, v in stem_globals.global_vars.iteritems():
+        ##     self.set_variable(k,v)
+
+        activePorts = processActivePortData(ERDDataSubsetting._input_ports, self)
+
+        remap = {'srd.pred.design.file': 'srd.pred.design.filename',
+                 'stem.globals': None}
+        params = build_params(activePorts, remap)
+        code_str = "eBird.data <- erd.srd.data.subsetting(%s)" % params
+
+        self.run_code(code_str, 
+                      excluded_inputs=set(['source', 'srd.pred.design.file']),
+                      excluded_outputs=set(['eBird.data']))
+
+        train = self.get_variable('eBird.data$train.data')
+        test = self.get_variable('eBird.data$test.data')
+        srd = self.get_variable('eBird.data$srd.data')
+
+        self.run_code("stem.predictor.names <- names(eBird.data$train.data$X)")
+        stem_predictor_names = self.get_variable('stem.predictor.names')
+        
+        self.setResult('train.data', train)
+        self.setResult('test.data', test)
+        self.setResult('pred.data', srd)
+        self.setResult('stem.predictor.names', stem_predictor_names)
+    
+class FitSTEM(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('train.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('stem.directory', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('response.family', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('cv.folds', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('cv.folds.par.list', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('stem.init.par.list', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('base.model.par.list', '(edu.utah.sci.vistrails.rpy:RList:Types)')]
+    _output_ports = [('models.directory', '(edu.utah.sci.vistrails.basic:Directory)')]
+
+    def compute(self):
+        # use a single models dir with a variable number of
+        # subdirectories depending on the cv.folds value
+        # same for results, now -- models/stem.models.[1-10]
+        ## stem_globals = self.getInputFromPort('stem.globals')
+        ## for k, v in stem_globals.global_vars.iteritems():
+        ##     self.set_variable(k,v)
+
+        activePorts = processActivePortData(FitSTEM._input_ports, self)
+
+        remap = {'stem.globals': None}
+        params = build_params(activePorts, remap)
+        code_str = "stem(%s)" % params
+
+        self.run_code(code_str)
+
+
+class ERDPredictivePerformance(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('test.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('stem.directory', 
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('pp.directory', 
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('cv.list',
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('n.mc',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('grid.cell.min.lat',
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('grid.cell.min.lon',
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('min.val.cell.locs',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('threshold',
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('min.testset.sample.size',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('plot.it',
+                     '(edu.utah.sci.vistrails.basic:Boolean)')]
+    # pp.directory specifies where, but we can move this, i think
+    _output_ports = [('pp.directory',
+                      '(edu.utah.sci.vistrails.basic:Directory)')]
+    def compute(self):
+        self.set_variable('stem.directory', 
+                          self.getInputFromPort('stem.directory').name)
+        pp_directory = self.getInputFromPort('pp.directory')
+        self.set_variable('pp.directory', pp_directory.name)
+        self.run_file('')
+        self.setResult('pp.directory', pp_directory)
+    
+class PredictSTEM(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('stem.directory', 
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('pred.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('cv.list', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('st.pred.tag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('st.prediction.filename', 
+                     '(edu.utah.sci.vistrails.basic:File)')]
+    _output_ports = [('st.pred', '(edu.utah.sci.vistrails.rpy:RList:Types)')]
+    def compute(self):
+        pas
+
+class ERDPredictSTMatrix(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('stem.directory',
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('pred.data', '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('cv.list', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('stem.predictor.names', 
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('st.matrix.name', 
+                     '(edu.utah.sci.vistrails.basic:String)'),
+                    ('jdate.seq',
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('year.seq',
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('conditioning.vars',
+                     '(edu.utah.sci.vistrails.rpy:RList:Types)')]
+    _output_ports = [('st.matrix.directory',
+                      '(edu.utah.sci.vistrails.basic:Directory)')]
+    def compute(self): 
+        stem_globals = self.getInputFromPort('stem.globals')
+        ## for k, v in stem_globals.global_vars.iteritems():
+        ##     self.set_variable(k,v)
+                                          
+        activePorts = processActivePortData(ERDPredictSTMatrix._input_ports, self)
+ 
+        remap = {'stem.globals': None}
+        params = build_params(activePorts, remap)
+        code_str = "predict.erd.st.matrix(%s)" % params
+
+        self.run_code(code_str)
+
+        if self.hasInputFromPort('stem.directory'):
+           if self.hasInputFromPort('st.matrix.name'):
+               self.setResult('st.matrix.directory', create_dir_module(os.path.join(self.getInputFromPort('stem.directory').name,
+                                                       self.getInputFromPort('st.matrix.name'))))
+           else:
+               self.setResult('st.matrix.directory', create_dir_module(os.path.join(self.getInputFromPort('stem.directory').name,
+                                                       str(list(stem_globals.global_vars['st.matrix.name'])[0]))))
+        else:
+           if self.hasInputFromPort('st.matrix.name'):
+               self.setResult('st.matrix.directory', create_dir_module(os.path.join(str(list(stem_globals.global_vars['stem.directory'])[0]),
+                                                       self.getInputFromPort('st.matrix.name'))))
+           else:
+               self.setResult('st.matrix.directory', create_dir_module(os.path.join(str(list(stem_globals.global_vars['stem.directory'])[0]),
+                                                       str(list(stem_globals.global_vars['st.matrix.name'])[0]))))
+
+
+class STMatrixCVAvg(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('stem.directory', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('st.matrix.input.directory', '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('cv.list', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('jdate.seq', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('year.seq', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('st.matrix.output.directory', '(edu.utah.sci.vistrails.basic:Directory)')]
+    _output_ports = [('st.matrix.directory', '(edu.utah.sci.vistrails.basic:Directory)'),
+                     ('map.directory', '(edu.utah.sci.vistrails.basic:Directory)')]
+    def compute(self):
+        self.set_variable('st.matrix.input.directory', self.getInputFromPort('st.matrix.input.directory').name)        
+        st_matrix_output_directory = self.getInputFromPort('st.matrix.input.directory')
+        self.set_variable('st.matrix.output.directory', st_matrix_output_directory.name)
+
+        stem_globals = self.getInputFromPort('stem.globals')
+        ## for k, v in stem_globals.global_vars.iteritems():
+        ##     self.set_variable(k,v)
+
+        activePorts = processActivePortData(STMatrixCVAvg._input_ports, self)
+ 
+        remap = {'stem.globals': None}
+        params = build_params(activePorts, remap)
+        code_str = "st.matrix.cv.average(%s)" % params
+
+        self.run_code(code_str)
+
+        self.setResult('st.matrix.directory', st_matrix_output_directory)
+        self.setResult('map.directory', create_dir_module(os.path.join(str(list(stem_globals.global_vars['stem.directory'])[0]),
+                                                                       str(list(stem_globals.global_vars['st.matrix.ave.maps'])[0]))))
+
+
+
+class STMatrixMaps(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('st.matrix.directory',
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('map.directory',
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('jdate.seq',
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('year.seq',
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('begin.seq',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('end.seq',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('pred.grid.size',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('map.plot.width',
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('spatial.extent.list',
+                     '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('z.max',
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('z.min',
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('map.tag',
+                     '(edu.utah.sci.vistrails.basic:String)'),
+                    ('date.bar',
+                     '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('print.date',
+                     '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('county.map',
+                     '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('county.map.lwd',
+                     '(edu.utah.sci.vistrails.basic:Float)'),
+                    ('state.map',
+                     '(edu.utah.sci.vistrails.basic:Boolean)'),
+                    ('state.map.lwd',
+                     '(edu.utah.sci.vistrails.basic:Float)')]
+    _output_ports = [('map.directory',
+                      '(edu.utah.sci.vistrails.basic:Directory)'),
+                     ('map_file_1', 
+                      '(edu.utah.sci.vistrails.basic:File)')]
+    def compute(self):
+        self.set_variable('st.matrix.directory', ''.join([self.getInputFromPort('st.matrix.directory').name]))
+        map_directory = self.getInputFromPort('map.directory')
+        self.set_variable('map.directory', map_directory.name)
+
+        ## stem_globals = self.getInputFromPort('stem.globals')
+        ## for k, v in stem_globals.global_vars.iteritems():
+        ##     self.set_variable(k,v)                          
+
+        activePorts = processActivePortData(STMatrixMaps._input_ports, self)
+
+        remap = {'stem.globals': None}
+        params = build_params(activePorts, remap)
+        code_str = "st.matrix.maps(%s)" % params
+
+        self.run_code(code_str)
+
+        self.setResult('map.directory', map_directory)
+
+
+
+class ERD_CV_Avg_Maps(RSource):
+    _input_ports = [('stem.globals', '(edu.cornell.birds.stem:STEMGlobals)'),
+                    ('stem.directory', 
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('st.matrix.file.tag',
+                     '(edu.utah.sci.vistrails.basic:String)'),
+                    ('cv.list', '(edu.utah.sci.vistrails.rpy:RVector:Types)'),
+                    ('maps.directory', 
+                     '(edu.utah.sci.vistrails.basic:Directory)'),
+                    ('map.file.tag', '(edu.utah.sci.vistrails.basic:String)'),
+                    ('ns.rows', '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('map.plot.pixel.width', 
+                     '(edu.utah.sci.vistrails.basic:Integer)'),
+                    ('mapping.spatial.extent', 
+                     '(edu.utah.sci.vistrails.rpy:RList:Types)'),
+                    ('z.max', '(edu.utah.sci.vistrails.basic:Float)')]
+    _output_ports = [('erd.cv.avg.maps.directory',
+                     '(edu.utah.sci.vistrails.basic:Directory)')]
+    def compute(self):
+        pass
+
+# _modules = [STEMConfiguration, 
+#             RunModels, 
+#             BuildVisualizations, 
+#             STEMFigure]
+            
+_modules = [ERDDataCreation,
+            ERDDataSubsetting,
+            FitSTEM,
+            ERDPredictivePerformance,
+            PredictSTEM,
+            ERDPredictSTMatrix,
+            STMatrixCVAvg,
+            STMatrixMaps,
+            # ERD_CV_Avg_Maps,
+            STEMGlobals,
+            InitERDMapAnalysis,
+            PlotERDMaps
+            ]
diff --git a/contrib/stem/mycurrent.vt b/contrib/stem/mycurrent.vt
new file mode 100644
index 0000000..1b3d0d0
Binary files /dev/null and b/contrib/stem/mycurrent.vt differ
diff --git a/contrib/stem/mycurrent2.vt b/contrib/stem/mycurrent2.vt
new file mode 100644
index 0000000..208e254
Binary files /dev/null and b/contrib/stem/mycurrent2.vt differ
diff --git a/contrib/titan/__init__.py b/contrib/titan/__init__.py
new file mode 100644
index 0000000..546fd3f
--- /dev/null
+++ b/contrib/titan/__init__.py
@@ -0,0 +1,59 @@
+###########################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# Titan Package for VisTrails (Sandia National Laboratories)
+################################################################################
+
+"""The Titan Informatics Toolkit is a collaborative effort between 
+Sandia National Laboratories and Kitware Inc. It represents a 
+significant expansion of the Visualization ToolKit (VTK) to support 
+the ingestion, processing, and display of informatics data. By 
+leveraging the VTK engine, Titan provides a flexible, component 
+based, pipeline architecture for the integration and deployment of 
+algorithms in the fields of intelligence, semantic graph and 
+information analysis. 
+
+https://www.kitware.com/InfovisWiki/"""
+
+identifier = 'edu.utah.sci.vistrails.titan'
+name = 'Titan'
+version = '0.1.2'
+
+def package_dependencies():
+    import core.packagemanager
+    manager = core.packagemanager.get_package_manager()
+
+    ret = []
+    #if manager.has_package('edu.utah.sci.vistrails.vtk'):
+    ret.append('edu.utah.sci.vistrails.vtk')
+    #if manager.has_package('edu.utah.sci.vistrails.spreadsheet'):
+    ret.append('edu.utah.sci.vistrails.spreadsheet')
+    return ret
+
+def package_requirements():
+    import core.requirements
+    if not core.requirements.python_module_exists('titan'):
+        raise core.requirements.MissingRequirement('titan')
+    if not core.requirements.python_module_exists('PyQt4'):
+        print 'PyQt4 is not available. There will be no interaction',
+        print 'between Titan and the spreadsheet.'
+    import titan 
diff --git a/contrib/titan/base_module.py b/contrib/titan/base_module.py
new file mode 100644
index 0000000..0b74737
--- /dev/null
+++ b/contrib/titan/base_module.py
@@ -0,0 +1,203 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# This describes basic modules used by other VTK module
+################################################################################
+import vtk
+from core.modules.module_registry import registry
+from core.modules.vistrails_module import Module, ModuleError
+from itertools import izip
+
+################################################################################
+
+class vtkBaseModule(Module):
+    """
+    vtkBaseModule is the base class for all VTK modules in VisTrails, it acts
+    as a wrapper to direct all input/output ports to appropriate VTK function
+    calls
+    
+    """
+
+    def __init__(self):
+        """ vtkBaseModule() -> vtkBaseModule
+        Instantiate an emptt VTK Module with real VTK instance
+        
+        """
+        Module.__init__(self)
+        self.vtkInstance = None
+
+    def is_cacheable(self):
+        # VTK objects are by default cacheable only if they're subclasses
+        # of vtkAlgorithm
+        return (issubclass(self.vtkClass, vtk.vtkAlgorithm)
+                and (not issubclass(self.vtkClass, vtk.vtkAbstractMapper)))
+
+    def call_input_function(self, function, params):
+        """self.call_input_function(function, params) -> None
+        Calls the input function on the vtkInstance, or a special
+        input function if one exists in the class."""
+        if hasattr(self, '_special_input_function_' + function):
+            attr = getattr(self, '_special_input_function_' + function)
+        else:
+            try:
+                attr = getattr(self.vtkInstance, function)
+            except AttributeError:
+                # Compensates for overload by exploiting the fact that
+                # no VTK method has underscores.
+                f = function.find('_')
+                if f != -1:
+                    function = function[:f]
+                attr = getattr(self.vtkInstance, function)
+        attr(*params)
+        # print "Called ",attr,function,params
+
+    @classmethod
+    def _provide_doc(cls, port_name):
+        f = port_name.find('_')
+        if f != -1:
+            name = port_name[:f]
+        else:
+            name = port_name
+        return getattr(cls.vtkClass, name).__doc__
+
+    @classmethod
+    def provide_input_port_documentation(cls, port_name):
+        return cls._provide_doc(port_name)
+
+    @classmethod
+    def provide_output_port_documentation(cls, port_name):
+        return cls._provide_doc(port_name)
+
+    def compute(self):
+        """ compute() -> None
+        Actually perform real VTK task by directing all input/output ports
+        to VTK function calls
+        
+        """
+
+        def call_it(function, p):
+            # Translate between VisTrails objects and VTK objects
+            if p is None:
+                # None indicates a call with no parameters
+                params = []
+            elif type(p) == tuple:
+                # A tuple indicates a call with many parameters
+                params = list(p)
+            else:
+                # Otherwise, it's a single parameter
+                params = [p]
+
+            # Unwraps VTK objects
+            for i in xrange(len(params)):
+                if hasattr(params[i], 'vtkInstance'):
+                    params[i] = params[i].vtkInstance
+            try:
+                self.call_input_function(function, params)
+            except Exception, e:
+                msg = 'VTK Exception: '
+                raise ModuleError(self, msg  + str(type(e)) + ': ' + str(e))
+
+        # Always re-create vtkInstance module, no caching here
+        if self.vtkInstance:
+            del self.vtkInstance
+        self.vtkInstance = self.vtkClass()
+
+        # We need to call method ports before anything else, and in
+        # the right order.
+
+        # FIXME: This does not belong here, it belongs in the main class
+        # No time for that now
+        methods = self.is_method.values()
+        methods.sort()
+        for value in methods:
+            (_, port) = value
+            conn = self.is_method.inverse[value]
+            p = conn()
+            call_it(port, p)
+
+        # Make sure all input ports are called correctly
+        for (function, connector_list) in self.inputPorts.iteritems():
+            paramList = self.forceGetInputListFromPort(function)
+            if function[:18]=='SetInputConnection':
+                paramList = zip([int(function[18:])]*len(paramList),
+                                 paramList)
+                function = 'SetInputConnection'
+            if function=='AddInputConnection':
+                desc = registry.get_descriptor_by_name(
+                    'edu.utah.sci.vistrails.vtk',
+                    'vtkAlgorithmOutput')
+                for i in xrange(len(paramList)):
+                    if type(paramList[i])==desc.module:
+                        paramList[i] = (0, paramList[i])
+            for p,connector in izip(paramList, connector_list):
+                # Don't call method
+                if connector in self.is_method:
+                    continue
+                call_it(function, p)
+
+        # Call update if appropriate
+        if hasattr(self.vtkInstance, 'Update'):
+            def ProgressEvent(obj, event):
+                self.logging.update_progress(self, obj.GetProgress())
+            isAlgorithm = issubclass(self.vtkClass, vtk.vtkAlgorithm)
+            if isAlgorithm:
+                cbId = self.vtkInstance.AddObserver('ProgressEvent', ProgressEvent)
+            self.vtkInstance.Update()
+            if isAlgorithm:
+                self.vtkInstance.RemoveObserver(cbId)
+
+        # Then update the output ports also with appropriate function calls
+        for function in self.outputPorts.keys():
+            if function[:13]=='GetOutputPort':
+                i = int(function[13:])
+                vtkOutput = self.vtkInstance.GetOutputPort(i)
+                output = vtkBaseModule.wrapperModule('vtkAlgorithmOutput',
+                                                     vtkOutput)
+                self.setResult(function, output)
+            elif hasattr(self.vtkInstance, function):
+                retValues = getattr(self.vtkInstance, function)()
+                if issubclass(retValues.__class__, vtk.vtkObject):
+                    className = retValues.GetClassName()
+                    output  = vtkBaseModule.wrapperModule(className, retValues)
+                    self.setResult(function, output)                                   
+                elif (type(retValues) in [tuple, list]):
+                    result = list(retValues)
+                    for i in xrange(len(result)):
+                        if issubclass(result[i].__class__, vtk.vtkObject):
+                            className = result[i].GetClassName()
+                            result[i] = vtkBaseModule.wrapperModule(className,
+                                                                    result[i])
+                    self.setResult(function, type(retValues)(result))
+                else:
+                    self.setResult(function, retValues)
+
+    @staticmethod
+    def wrapperModule(classname, instance):
+        """ wrapperModule(classname: str, instance: vtk class) -> Module
+        Create a wrapper module in VisTrails with a vtk instance
+        
+        """
+        result = registry.get_descriptor_by_name(
+            'edu.utah.sci.vistrails.vtk',
+            classname).module()
+        result.vtkInstance = instance
+        return result
diff --git a/contrib/titan/class_tree.py b/contrib/titan/class_tree.py
new file mode 100644
index 0000000..c9f53ff
--- /dev/null
+++ b/contrib/titan/class_tree.py
@@ -0,0 +1,268 @@
+# Author: Prabhu Ramachandran
+# Copyright (c) 2004, Enthought, Inc.
+# License: BSD Style.
+
+"""This module generates the class hierarchy for any given Python
+modules.  This can be used (among other things) to generate the
+traitified VTK classes in the correct order.
+
+"""
+
+import __builtin__
+
+
+class TreeNode(object):
+    """Represents a node in the class tree.
+
+    Stores information on the sub and super classes of a particular
+    class.  It also stores the inheritance level of the class inside
+    the inheritance tree (essentially how many levels of inheritance
+    are there below this class).  This inheritance level is computed
+    when the `get_level` method is called.  The `get_level` method
+    works only when the parent information is complete.
+    
+    """
+
+    def __init__(self, klass):
+        """Given a class, create a node in the tree.
+
+        Parameters
+        ----------
+        - klass : `class`
+
+          The class which is represented as a node in the tree.
+
+        """
+        self.klass = klass
+        self.name = klass.__name__
+        self.children = []
+        self.parents = []
+        # Uninitialized level is set to None
+        self.level = None
+
+    def add_parent(self, parent):
+        """Add a parent node."""
+        assert isinstance(parent, TreeNode)
+        if parent not in self.parents:
+            self.parents.append(parent)
+
+    def add_child(self, child):
+        """Add a child node. """
+        assert isinstance(child, TreeNode)
+        if child not in self.children:
+            self.children.append(child)
+
+    def get_level(self):
+        """Returns the inheritance level of the node (an int).  If the
+        level has not been set, the method computes it.  Note however,
+        that this computation will fail if the parent information is
+        incorrect.
+
+        """
+        if not self.level:
+            if self.parents:
+                self.level = max([x.get_level() for x in self.parents]) + 1
+            else:
+                self.level = 0
+        return self.level
+
+    def get_ancestors(self):
+        """Returns a list of ancestor nodes from which this class has
+        descended.
+
+        """
+        def _get_ancestors(node, ancestors):
+            ancestors.extend(node.parents)
+            for p in node.parents:
+                _get_ancestors(p, ancestors)
+        ancestors = []
+        _get_ancestors(self, ancestors)
+        return ancestors
+
+
+class ClassTree(object):
+    """Contains and generates all the class tree information.
+
+    On initialization of the instance, nothing is done.  The classes
+    are obtained using the list of modules (or a single module) that
+    is used to initialize the instance.  One must then call the
+    `create` method to generate the tree structure.  The instance of
+    the class also can be treated as an iterator which iterates over
+    the nodes of the tree.
+
+    There are two ways in which the tree hierarchy is stored.  A
+    dictionary mapping class names to the tree node and a tree
+    represented as a list of lists containing the nodes.  The tree is
+    organized based on a concept of an inheritance level.  A class
+    that has no parent classes (no base classes) is said to be at
+    level zero.  If a class inherits successively from 7 classes, it
+    is at level 6.  An example of inheritance for a vtkFoo class is
+    given below:
+
+      vtkFoo -> vtkBar -> vtkObject -> vtkObjectBase
+
+    Here, vtkObjectBase has an inheritance level of 0 and vtkFoo a
+    level of 3.  One can traverse the tree by using the level as an
+    index and find all the classes at a particular level.
+
+    Here is some example usage of this class::
+
+        >>> import vtk
+        >>> t = ClassTree(vtk)
+        >>> t.create()
+        >>> print t.get_node('vtkObject').name
+        vtkObject
+        >>> print t.get_node('vtkObject').parents[0].name
+        vtkObjectBase
+        >>> print len(t.tree[0])
+        1
+        >>> t.tree[0][0].name
+        vtkObjectBase
+    
+    """
+
+    def __init__(self, modules):
+        """Initialize the instance with the given modules.
+
+        Parameters
+        ----------
+
+        - modules : `sequence` of modules or a module
+
+          This is either a single module or a sequence of modules.
+          The instance uses these list of modules to generate the
+          class tree.
+          
+        """
+        self.nodes = {}
+        self.tree = [[]]        
+        if not hasattr(modules, '__iter__'):
+            self.modules = [modules]
+        else:
+            self.modules = modules
+
+    def __iter__(self):
+        return iter(self.nodes.values())
+
+    def _generate_hierarchy(self, klass):
+        """Does the hard work of generating the class hierarchy."""
+        node = self.get_node(klass.__name__, create=1)
+        for base in klass.__bases__:
+            base_node = self.get_node_from_class(base, create=1)
+            node.add_parent(base_node)
+            base_node.add_child(node)
+            self._generate_hierarchy(base)
+
+    def get_class(self, name):
+        """Given a class name in the given modules returns the class."""
+        klass = None
+        for m in self.modules:
+            if hasattr(m, name):
+                return getattr(m, name)
+        if hasattr(__builtin__, name):
+            klass = getattr(__builtin__, name)
+        if not klass:
+            try:
+                klass = self.nodes[name].klass
+            except KeyError:
+                raise KeyError, "Cannot find class of name %s"%name
+        return klass
+
+    def add_node(self, klass):
+        """Create a node for the given class."""
+        name = klass.__name__
+        if not self.nodes.has_key(name):
+            node = TreeNode(klass)
+            self.nodes[name] = node
+            return node
+
+    def get_node(self, name, create=0):
+        """Get a node of the given name.
+
+        Parameters
+        ----------
+
+        - name : `str`
+
+          Name of the node to get.
+
+        - create : `boolean`
+
+          If True, a new node will be added if no node of the given
+          name is available.  Defaults to False.
+
+        Returns
+        -------
+
+        - `TreeNode`
+
+        """
+        if self.nodes.has_key(name):
+            return self.nodes[name]
+        elif create:
+            return self.add_node(self.get_class(name))
+
+    def get_node_from_class(self, cls, create=0):
+        """Get a node of the given class.
+
+        Parameters
+        ----------
+
+        - cls : `class`
+
+          Class of the node to get.
+
+        - create : `boolean`
+
+          If True, a new node will be added if no node of the given
+          name is available.  Defaults to False.
+
+        Returns
+        -------
+
+        - `TreeNode`
+
+        """
+        name = cls.__name__
+        if self.nodes.has_key(name):
+            return self.nodes[name]
+        elif create:
+            return self.add_node(cls)
+
+    def create(self, class_names=None):
+        """This method generates the class tree given an optional list
+        of class names.
+
+        Parameters
+        ----------
+
+        - class_names - `list` of `str`
+
+          An optional list of names of the classes to generate the
+          tree for.  Defaults to None where the class list is computed
+          from the modules.        
+
+        """
+        if class_names is None:
+            class_names = []
+            for m in self.modules:
+                class_names.extend(dir(m))
+        
+        # Generate the nodes.
+        for name in class_names:
+            klass = self.get_class(name)
+            if klass and hasattr(klass, '__bases__'):
+                self._generate_hierarchy(klass)
+
+        # Compute the inheritance level and store the nodes in the tree.
+        for node in self:
+            d = node.get_level()
+            while len(self.tree) <= d:
+                self.tree.append([])
+            self.tree[d].append(node)
+
+        # Sort the nodes alphabetically.
+        def _comp(x, y):
+            return cmp(x.name, y.name)
+        for nodes in self.tree:
+            nodes.sort(_comp)
diff --git a/contrib/titan/fix_classes.py b/contrib/titan/fix_classes.py
new file mode 100644
index 0000000..8181458
--- /dev/null
+++ b/contrib/titan/fix_classes.py
@@ -0,0 +1,51 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+import vtk
+
+################################################################################
+# Some fixed classes that solve a few VTK API issues
+
+# This dictionary stores the patched class to vtk class mapping.
+# This would be naturally better stored as an attribute directly on the
+# patched class. VTK, however, doesn't like class attributes.
+description = {}
+
+# http://www.vtk.org/doc/nightly/html/classvtkImagePlaneWidget.html
+# SetUserControlledLookupTable needs to be set before calling
+# SetLookupTable.  VTK should do it automatically, so let's fix it
+
+
+# This fix seems to break on VTK versions larger than 5.0.3. It might also
+# be because of an interaction with python 2.6, but I haven't checked that.
+class vtkImagePlaneWidget_fixed(vtk.vtkImagePlaneWidget):
+    def SetLookupTable(self, lookup_table):
+        self.UserControlledLookupTableOn()
+        vtk.vtkImagePlaneWidget.SetLookupTable(self, lookup_table)
+
+if tuple(vtk.vtkVersion().GetVTKVersion().split('.')) < ('5', '0', '4'):
+    description[vtkImagePlaneWidget_fixed] = vtk.vtkImagePlaneWidget
+else:
+    description[id(vtkImagePlaneWidget_fixed)] = vtk.vtkImagePlaneWidget
+
+# Set docstring to wrap it correctly
+vtkImagePlaneWidget_fixed.SetLookupTable.__doc__ = vtk.vtkImagePlaneWidget.SetLookupTable.__doc__
diff --git a/contrib/titan/hasher.py b/contrib/titan/hasher.py
new file mode 100644
index 0000000..34909ec
--- /dev/null
+++ b/contrib/titan/hasher.py
@@ -0,0 +1,36 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+# This is the user-defined hasher for VTK, that takes into account
+# incoming and outgoing connections
+from core.cache.hasher import Hasher
+
+def vtk_hasher(pipeline, module, chm):
+    outgoing_connections = pipeline.graph.edges_from(module.id)
+    incoming_connections = pipeline.graph.edges_to(module.id)
+    current_hash = Hasher.module_signature(module, chm)
+    chashes = [Hasher.connection_signature(pipeline.connections[c_id])
+               for (_, c_id) in outgoing_connections]
+    chashes += [Hasher.connection_signature(pipeline.connections[c_id])
+               for (_, c_id) in incoming_connections]
+    compound_hash = Hasher.compound_signature(chashes)
+    return Hasher.compound_signature([current_hash, compound_hash])
diff --git a/contrib/titan/init.py b/contrib/titan/init.py
new file mode 100644
index 0000000..070661a
--- /dev/null
+++ b/contrib/titan/init.py
@@ -0,0 +1,1132 @@
+###########################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# Titan Package for VisTrails (Sandia National Laboratories)
+################################################################################
+from core.bundles import py_import
+
+pkgs = [ "titan.Antiword", 
+#"titan.Clustering", 
+"titan.Common", 
+"titan.DataAnalysis",
+"titan.GMeans", 
+"titan.HDF5", 
+#"titan.JSON",
+#"titan.LsaLib",  
+"titan.MPIDataAnalysis", 
+"titan.MPITextAnalysis",
+"titan.MTGLGraphAnalysis", 
+"titan.OWL", 
+#"titan.QtGui", 
+"titan.StanfordNER",
+"titan.TextAnalysis", 
+"titan.Trilinos", 
+"titan.Web", 
+#"titan.uBLAS",
+"titan.XPDF"]
+
+import sys
+titan2 = []
+for i in pkgs:
+    __import__(i)
+    titan2.append(sys.modules[i])
+
+titan = sys.modules["titan"]
+
+import vtk
+
+in_out_table = {
+
+}
+
+
+from core.utils import all, any, VistrailsInternalError, InstanceObject
+from core.debug import debug
+from core.modules.basic_modules import Integer, Float, String, File, \
+     Variant, Color
+from core.modules.module_registry import get_module_registry
+from core.modules.vistrails_module import new_module, ModuleError
+from base_module import vtkBaseModule
+from class_tree import ClassTree
+from vtk_parser import VTKMethodParser
+import re
+import os.path
+from itertools import izip
+from vtkcell import VTKCell
+import tf_widget
+import offscreen
+import fix_classes
+import inspectors
+from hasher import vtk_hasher
+import sys
+
+################################################################################
+
+# filter some deprecation warnings coming from the fact that vtk calls
+# range() with float parameters
+
+import warnings
+warnings.filterwarnings("ignore",
+                        message="integer argument expected, got float")
+
+################################################################################
+
+if tuple(vtk.vtkVersion().GetVTKVersion().split('.')) < ('5', '0', '4'):
+    def get_description_class(klass):
+        """Because sometimes we need to patch VTK classes, the klass that
+        has the methods is different than the klass we want to
+        instantiate. get_description_class makes sure that for patched
+        classes we get the correct one."""
+        try:
+            return fix_classes.description[klass]
+        except KeyError:
+            return klass
+else:
+    # On VTK 5.0.4, we use the id of the class to hash, because it
+    # seems that VTK hasn't implemented hash() correctly for their
+    # classes.
+    def get_description_class(klass):
+        """Because sometimes we need to patch VTK classes, the klass that
+        has the methods is different than the klass we want to
+        instantiate. get_description_class makes sure that for patched
+        classes we get the correct one."""
+        try:
+            return fix_classes.description[id(klass)]
+        except KeyError:
+            return klass
+
+parser = VTKMethodParser()
+
+typeMapDict = {'int': Integer,
+               'long': Integer,
+               'float': Float,
+               'char*': String,
+               'char *': String,
+               'string': String,
+               'char': String,
+               'const char*': String,
+               'const char *': String}
+typeMapDictValues = [Integer, Float, String]
+
+file_name_pattern = re.compile('.*FileName$')
+set_file_name_pattern = re.compile('Set.*FileName$')
+
+def resolve_overloaded_name(name, ix, signatures):
+    # VTK supports static overloading, VisTrails does not. The
+    # solution is to check whether the current function has
+    # overloads and change the names appropriately.
+    if len(signatures) == 1:
+        return name
+    else:
+        return name + '_' + str(ix+1)
+
+def typeMap(name, package=None):
+    """ typeMap(name: str) -> Module
+    Convert from C/C++ types into VisTrails Module type
+    
+    """
+
+    if package is None:
+        package = identifier
+    if type(name) == tuple:
+        return [typeMap(x, package) for x in name]
+    if name in typeMapDict:
+        return typeMapDict[name]
+    else:
+        registry = get_module_registry()
+
+        if registry.has_descriptor_with_name('edu.utah.sci.vistrails.vtk', name):
+            return registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk', name).module
+        elif not registry.has_descriptor_with_name(package, name):
+            return None
+        else:
+            return registry.get_descriptor_by_name(package, name).module
+
+def get_method_signature(method):
+    """ get_method_signature(method: vtkmethod) -> [ret, arg]
+    Re-wrap Prabu's method to increase performance
+
+    """
+    doc = method.__doc__
+    tmptmp = doc.split('\n')
+    tmp = []
+    for l in tmptmp:
+        l = l.strip('\n \t')
+        if l.startswith('V.') or l.startswith('C++:'):
+            tmp.append(l)
+        #else:
+        #    tmp[-1] = tmp[-1] + l
+    tmp.append('')
+    sig = []        
+    pat = re.compile(r'\b')
+
+    # Remove all the C++ function signatures and V.<method_name> field
+    offset = 2+len(method.__name__)
+    for i in xrange(len(tmp)):
+        s = tmp[i]
+        if s=='': break
+        if i%2==0:
+            x = s.split('->')
+            arg = x[0].strip()[offset:]
+            if len(x) == 1: # No return value
+                ret = None
+            else:
+                ret = x[1].strip()
+
+            # Remove leading and trailing parens for arguments.
+            arg = arg[1:-1]
+            if not arg:
+                arg = None
+            if arg and arg[-1] == ')':
+                arg = arg + ','
+
+            # Now quote the args and eval them.  Easy!
+            if ret and ret[:3]!='vtk':
+                try:
+                    ret = eval(pat.sub('\"', ret))
+                except:
+                    continue
+            if arg:
+                if arg.find('(')!=-1:
+                    try:
+                        arg = eval(pat.sub('\"', arg))
+                    except:
+                        continue
+                else:
+                    arg = arg.split(', ')
+                    if len(arg)>1:
+                        arg = tuple(arg)
+                    else:
+                        arg = arg[0]
+                if type(arg) == str:
+                    arg = [arg]
+
+            sig.append(([ret], arg))
+    return sig    
+
+def prune_signatures(module, name, signatures, output=False):
+    """prune_signatures tries to remove redundant signatures to reduce
+    overloading. It _mutates_ the given parameter.
+
+    It does this by performing several operations:
+
+    1) It compares a 'flattened' version of the types
+    against the other 'flattened' signatures. If any of them match, we
+    keep only the 'flatter' ones.
+
+    A 'flattened' signature is one where parameters are not inside a
+    tuple.
+
+    2) We explicitly forbid a few signatures based on modules and names
+
+    """
+    # yeah, this is Omega(n^2) on the number of overloads. Who cares?
+
+    def flatten(type_):
+        if type_ is None:
+            return []
+        def convert(entry):
+            if type(entry) == tuple:
+                return list(entry)
+            else:
+                assert(type(entry) == str)
+                return [entry]
+        result = []
+        for entry in type_:
+            result.extend(convert(entry))
+        return result
+
+    flattened_entries = [flatten(sig[1]) for
+                         sig in signatures]
+    def hit_count(entry):
+        result = 0
+        for entry in flattened_entries:
+            if entry in flattened_entries:
+                result += 1
+        return result
+    hits = [hit_count(entry) for entry in flattened_entries]
+
+    def forbidden(flattened, hit_count, original):
+        if (issubclass(get_description_class(module.vtkClass), vtk.vtk3DWidget) and
+            name == 'PlaceWidget' and
+            flattened == []):
+            return True
+        # We forbid this because addPorts hardcodes this but
+        # SetInputArrayToProcess is an exception for the InfoVis
+        # package
+        if (get_description_class(module.vtkClass) == vtk.vtkAlgorithm and
+            name!='SetInputArrayToProcess'):
+            return True
+        return False
+
+    # This is messy: a signature is only allowed if there's no
+    # explicit disallowing of it. Then, if it's not overloaded,
+    # it is also allowed. If it is overloaded and not the flattened
+    # version, it is pruned. If these are output ports, there can be
+    # no parameters.
+
+    def passes(flattened, hit_count, original):
+        if forbidden(flattened, hit_count, original):
+            return False
+        if hit_count == 1:
+            return True
+        if original[1] is None:
+            return True
+        if output and len(original[1]) > 0:
+            return False
+        if hit_count > 1 and len(original[1]) == len(flattened):
+            return True
+        return False
+    
+    signatures[:] = [original for (flattened, hit_count, original)
+                     in izip(flattened_entries,
+                             hits,
+                             signatures)
+                     if passes(flattened, hit_count, original)]
+    
+    #then we remove the duplicates, if necessary
+    unique_signatures = []
+    [unique_signatures.append(s) for s in signatures if not unique_signatures.count(s)]
+    signatures[:] = unique_signatures
+    
+disallowed_classes = set(
+    [
+    'vtkCriticalSection',
+    'vtkDataArraySelection',
+    'vtkDebugLeaks',
+    'vtkDirectory',
+    'vtkDynamicLoader',
+    'vtkFunctionParser',
+    'vtkGarbageCollector',
+    'vtkHeap',
+    'vtkInformationKey',
+    'vtkInstantiator',
+    'vtkLogLookupTable', # VTK: use vtkLookupTable.SetScaleToLog10() instead
+    'vtkMath',
+    'vtkModelMetadata',
+    'vtkMultiProcessController',
+    'vtkMutexLock',
+    'vtkOutputWindow',
+    'vtkPriorityQueue',
+    'vtkReferenceCount',
+    'vtkRenderWindowCollection',
+    'vtkRenderWindowInteractor',
+    'vtkTesting',
+    'vtkWindow',
+    'vtkVersion',
+    'vtkDiffFilter',
+    'vtkDocumentM3MetaData',
+    'vtkPPointwiseMutualInformation'
+    #'vtkXMLUtilities',
+    #'vtkXMLShader',
+    #'vtkXMLMaterialReader',
+    #'vtkXMLMaterial',
+    #'vtkXMLDataElement'
+     ])
+
+def is_class_allowed(module):
+    if module is None:
+        return False
+    try:
+        name = module.__name__
+        return not (name in disallowed_classes)
+    except AttributeError:
+        return True
+
+def addAlgorithmPorts(module):
+    """ addAlgorithmPorts(module: Module) -> None
+    If module is a subclass of vtkAlgorithm, this function will add all
+    SetInputConnection([id],[port]) and GetOutputPort([id]) as
+    SetInputConnection{id}([port]) and GetOutputPort{id}.
+
+    """
+    if issubclass(get_description_class(module.vtkClass), vtk.vtkAlgorithm):
+        if get_description_class(module.vtkClass)!=vtk.vtkStructuredPointsGeometryFilter:
+            # We try to instantiate the class here to get the number of
+            # ports and to avoid abstract classes
+            try:
+                instance = module.vtkClass()
+            except TypeError:
+                pass
+            else:
+                registry = get_module_registry()
+                des = registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtk',
+                                                      'vtkAlgorithmOutput')
+                for i in xrange(0,instance.GetNumberOfInputPorts()):
+                    registry.add_input_port(module, 'SetInputConnection%d'%i, 
+                                            des.module)
+                for i in xrange(0,instance.GetNumberOfOutputPorts()):
+                    registry.add_output_port(module, 'GetOutputPort%d'%i, 
+                                    des.module)
+
+disallowed_set_get_ports = set(['ReferenceCount',
+                                'InputConnection',
+                                'OutputPort',
+                                'Progress',
+                                'ProgressText',
+                                'InputArrayToProcess',
+                                ])
+def addSetGetPorts(module, get_set_dict, delayed):
+    """ addSetGetPorts(module: Module, get_set_dict: dict) -> None
+    Convert all Setxxx methods of module into input ports and all Getxxx
+    methods of module into output ports
+
+    Keyword arguments:
+    module       --- Module
+    get_set_dict --- the Set/Get method signatures returned by vtk_parser
+
+    """
+
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in get_set_dict.iterkeys():
+        if name in disallowed_set_get_ports: continue
+        getterMethod = getattr(klass, 'Get%s'%name)
+        setterMethod = getattr(klass, 'Set%s'%name)
+        getterSig = get_method_signature(getterMethod)
+        setterSig = get_method_signature(setterMethod)
+
+        if len(getterSig) > 1:
+            prune_signatures(module, 'Get%s'%name, getterSig, output=True)
+        for order, getter in enumerate(getterSig):
+            if getter[1]:
+                debug("Can't handle getter %s (%s) of class %s: Needs input to "
+                    "get output" % (order+1, name, klass))
+                continue
+            if len(getter[0]) != 1:
+                debug("Can't handle getter %s (%s) of class %s: More than a "
+                    "single output" % (order+1, name, str(klass)))
+                continue
+            class_ = typeMap(getter[0][0])
+            if is_class_allowed(class_):
+                registry.add_output_port(module, 'Get'+name, class_, True)
+        if len(setterSig) > 1:
+            prune_signatures(module, 'Set%s'%name, setterSig)
+        for ix, setter in enumerate(setterSig):
+            if setter[1]==None: continue
+            n = resolve_overloaded_name('Set' + name, ix, setterSig)
+            if len(setter[1]) == 1 and is_class_allowed(typeMap(setter[1][0])):
+                registry.add_input_port(module, n,
+                                        typeMap(setter[1][0]),
+                                        setter[1][0] in typeMapDict)
+            else:
+                classes = [typeMap(i) for i in setter[1]]
+                if all(is_class_allowed(x) for x in classes):
+                    registry.add_input_port(module, n, classes, True)
+            # Wrap SetFileNames for VisTrails file access
+            if file_name_pattern.match(name):
+                registry.add_input_port(module, 'Set' + name[:-4], 
+                                        (File, 'input file'), False)
+            # Wrap SetRenderWindow for exporters
+            elif name == 'RenderWindow':
+                # cscheid 2008-07-11 This is messy: VTKCell isn't
+                # registered yet, so we can't use it as a port
+                # However, we can't register VTKCell before these either,
+                # because VTKCell requires vtkRenderer. The "right" way would
+                # be to add all modules first, then all ports. However, that would
+                # be too slow.
+                # Workaround: delay the addition of the port by storing
+                # the information in a list
+                if registry.has_module('edu.utah.sci.vistrails.spreadsheet',
+                                       'SpreadsheetCell'):
+                    delayed.add_input_port.append((module, 'SetVTKCell', VTKCell, False))
+            # Wrap color methods for VisTrails GUI facilities
+            elif name == 'DiffuseColor':
+                registry.add_input_port(module, 'SetDiffuseColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'Color':
+                registry.add_input_port(module, 'SetColorWidget', 
+                                        (Color, 'color'), True)
+            elif name == 'AmbientColor':
+                registry.add_input_port(module, 'SetAmbientColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'SpecularColor':
+                registry.add_input_port(module, 'SetSpecularColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'EdgeColor':
+                registry.add_input_port(module, 'SetEdgeColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'Background' :
+                registry.add_input_port(module, 'SetBackgroundWidget', 
+                                        (Color, 'color'), True)
+            elif name == 'Background2' :
+                registry.add_input_port(module, 'SetBackground2Widget', 
+                                        (Color, 'color'), True)
+
+disallowed_toggle_ports = set(['GlobalWarningDisplay',
+                               'Debug',
+                               ])
+def addTogglePorts(module, toggle_dict):
+    """ addTogglePorts(module: Module, toggle_dict: dict) -> None
+    Convert all xxxOn/Off methods of module into input ports
+
+    Keyword arguments:
+    module      --- Module
+    toggle_dict --- the Toggle method signatures returned by vtk_parser
+
+    """
+    registry = get_module_registry()
+    for name in toggle_dict.iterkeys():
+        if name in disallowed_toggle_ports:
+            continue
+        registry.add_input_port(module, name+'On', [], True)
+        registry.add_input_port(module, name+'Off', [], True)
+
+disallowed_state_ports = set(['SetInputArrayToProcess'])
+def addStatePorts(module, state_dict):
+    """ addStatePorts(module: Module, state_dict: dict) -> None
+    Convert all SetxxxToyyy methods of module into input ports
+
+    Keyword arguments:
+    module     --- Module
+    state_dict --- the State method signatures returned by vtk_parser
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in state_dict.iterkeys():
+        for mode in state_dict[name]:
+            # Creates the port Set foo to bar
+            field = 'Set'+name+'To'+mode[0]
+            if field in disallowed_state_ports:
+                continue
+            if not registry.has_input_port(module, field):
+                registry.add_input_port(module, field, [], True)
+
+        # Now create the port Set foo with parameter
+        if hasattr(klass, 'Set%s'%name):
+            setterMethod = getattr(klass, 'Set%s'%name)
+            setterSig = get_method_signature(setterMethod)
+            # if the signature looks like an enum, we'll skip it, it shouldn't
+            # be necessary
+            if len(setterSig) > 1:
+                prune_signatures(module, 'Set%s'%name, setterSig)
+            for ix, setter in enumerate(setterSig):
+                n = resolve_overloaded_name('Set' + name, ix, setterSig)
+                tm = typeMap(setter[1][0])
+                if len(setter[1]) == 1 and is_class_allowed(tm):
+                    registry.add_input_port(module, n, tm,
+                                            setter[1][0] in typeMapDict)
+                else:
+                    classes = [typeMap(i) for i in setter[1]]
+                    if all(is_class_allowed(x) for x in classes):
+                        registry.add_input_port(module, n, classes, True)
+
+disallowed_other_ports = set(
+    [
+     'BreakOnError',
+     'DeepCopy',
+     'FastDelete',
+     'HasObserver',
+     'HasExecutive',
+     'INPUT_ARRAYS_TO_PROCESS',
+     'INPUT_CONNECTION',
+     'INPUT_IS_OPTIONAL',
+     'INPUT_IS_REPEATABLE',
+     'INPUT_PORT',
+     'INPUT_REQUIRED_DATA_TYPE',
+     'INPUT_REQUIRED_FIELDS',
+     'InvokeEvent',
+     'IsA',
+     'Modified',
+     'NewInstance',
+     'PrintRevisions',
+     'RemoveAllInputs',
+     'RemoveObserver',
+     'RemoveObservers',
+#     'SafeDownCast',
+#     'SetInputArrayToProcess',
+     'ShallowCopy',
+     'Update',
+     'UpdateInformation',
+     'UpdateProgress',
+     'UpdateWholeExtent',
+     ])
+
+force_not_optional_port = set(
+    ['ApplyViewTheme',
+     ])
+
+
+def addOtherPorts(module, other_list):
+    """ addOtherPorts(module: Module, other_list: list) -> None
+    Convert all other ports such as Insert/Add.... into input/output
+
+    Keyword arguments:
+    module     --- Module
+    other_dict --- any other method signatures that is not
+                   Algorithm/SetGet/Toggle/State type
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in other_list:
+        if name[:3] in ['Add','Set'] or name[:6]=='Insert':
+            if name in disallowed_other_ports:
+                continue
+            method = getattr(klass, name)
+            signatures = ""
+            if not isinstance(method, int):
+                signatures = get_method_signature(method)
+            if len(signatures) > 1:
+                prune_signatures(module, name, signatures)
+            for (ix, sig) in enumerate(signatures):
+                ([result], params) = sig
+                types = []
+                if params:
+                    for p in params:
+                        t = typeMap(p)
+                        if not t:
+                            types = None
+                            break
+                        else: types.append(t)
+                else:
+                    types = [[]]
+                if types:
+                    if not all(is_class_allowed(x) for x in types):
+                        continue
+                    n = resolve_overloaded_name(name, ix, signatures)
+                    if len(types)<=1:
+                        registry.add_input_port(module, n, types[0],
+                                                types[0] in typeMapDictValues)
+                    else:
+                        registry.add_input_port(module, n, types, True)
+        else:
+            if name in disallowed_other_ports:
+                continue
+            method = getattr(klass, name)
+            signatures = ""
+            if not isinstance(method, int):
+                signatures = get_method_signature(method)
+            if len(signatures) > 1:
+                prune_signatures(module, name, signatures)
+            for (ix, sig) in enumerate(signatures):
+                ([result], params) = sig
+                types = []
+                if params:
+                    types = [typeMap(p) for p in params]
+                else:
+                    types = []
+                if not all(is_class_allowed(x) for x in types):
+                    continue
+                if types==[] or (result==None):
+                    n = resolve_overloaded_name(name, ix, signatures)
+                    registry.add_input_port(module, n, types,
+                                            not (n in force_not_optional_port))
+
+disallowed_get_ports = set([
+    'GetClassName',
+    'GetErrorCode',
+    'GetNumberOfInputPorts',
+    'GetNumberOfOutputPorts',
+    'GetOutputPortInformation',
+    'GetTotalNumberOfInputConnections',
+    ])
+
+def addGetPorts(module, get_list):
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in get_list:
+        if name in disallowed_get_ports:
+            continue
+        method = getattr(klass, name)
+        signatures = get_method_signature(method)
+        if len(signatures) > 1:
+            prune_signatures(module, name, signatures, output=True)
+        for ix, getter in enumerate(signatures):
+            if getter[1] or len(getter[0]) > 1:
+                continue
+            class_ = typeMap(getter[0][0])
+            if is_class_allowed(class_):
+                if len(signatures) > 1:
+                    n = name + "_" + str(ix+1)
+                else:
+                    n = name
+                registry.add_output_port(module, n, class_, True)
+    
+def addPorts(module, delayed):
+    """ addPorts(module: VTK module inherited from Module,
+                 delayed: object with add_input_port slot
+    ) -> None
+    
+    Search all metamethods of module and add appropriate ports
+
+    ports that cannot be added immediately should be appended to
+    the delayed object that is passed. see the SetRenderWindow cases.
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    registry.add_output_port(module, 'self', module)
+    parser.parse(klass)
+    addAlgorithmPorts(module)
+    addGetPorts(module, parser.get_get_methods())
+    addSetGetPorts(module, parser.get_get_set_methods(), delayed)
+    addTogglePorts(module, parser.get_toggle_methods())
+    addStatePorts(module, parser.get_state_methods())
+    addOtherPorts(module, parser.get_other_methods())
+
+    # CVS version of VTK doesn't support AddInputConnect(vtkAlgorithmOutput)
+    if klass==vtk.vtkAlgorithm:
+        registry.add_input_port(module, 'AddInputConnection',
+                                typeMap('vtkAlgorithmOutput'))
+    # vtkWriters have a custom File port
+    elif klass==vtk.vtkWriter:
+        registry.add_output_port(module, 'file', 
+                                 typeMap('File','edu.utah.sci.vistrails.basic'))
+    elif klass==vtk.vtkImageWriter:
+        registry.add_output_port(module, 'file', 
+                                 typeMap('File','edu.utah.sci.vistrails.basic'))
+    elif klass==vtk.vtkVolumeProperty:
+        registry.add_input_port(module, 'SetTransferFunction',
+                                typeMap('TransferFunction'))
+    elif klass==vtk.vtkDataSet:
+        registry.add_input_port(module, 'SetPointData', typeMap('vtkPointData'))
+        registry.add_input_port(module, 'SetCallData', typeMap('vtkCellData'))
+    elif klass==vtk.vtkCell:
+        registry.add_input_port(module, 'SetPointIds', typeMap('vtkIdList'))
+
+def setAllPorts(descriptor, delayed):
+    """ setAllPorts(descriptor: ModuleDescriptor) -> None
+    Traverse descriptor and all of its children/grand-children to add all ports
+
+    """
+    addPorts(descriptor.module, delayed)
+    for child in descriptor.children:
+        setAllPorts(child, delayed)
+
+def class_dict(base_module, node):
+    """class_dict(base_module, node) -> dict
+    Returns the class dictionary for the module represented by node and
+    with base class base_module"""
+
+    class_dict_ = {}
+    def update_dict(name, callable_):
+        if class_dict_.has_key(name):
+            class_dict_[name] = callable_(class_dict_[name])
+        elif hasattr(base_module, name):
+            class_dict_[name] = callable_(getattr(base_module, name))
+        else:
+            class_dict_[name] = callable_(None)
+
+    def guarded_SimpleScalarTree_wrap_compute(old_compute):
+        # This builds the scalar tree and makes it cacheable
+
+        def compute(self):
+            self.is_cacheable = lambda *args, **kwargs: True
+            old_compute(self)
+            self.vtkInstance.BuildTree()
+        return compute
+
+    def guarded_SetFileName_wrap_compute(old_compute):
+        # This checks for the presence of file in VTK readers
+        def compute(self):
+
+            # Skips the check if it's a vtkImageReader or vtkPLOT3DReader, because
+            # it has other ways of specifying files, like SetFilePrefix for
+            # multiple files
+            if any(issubclass(self.vtkClass, x)
+                   for x in
+                   [vtk.vtkBYUReader,
+                    vtk.vtkImageReader,
+                    vtk.vtkPLOT3DReader,
+                    vtk.vtkDICOMImageReader,
+                    vtk.vtkTIFFReader]):
+                old_compute(self)
+                return
+            if self.hasInputFromPort('SetFileName'):
+                name = self.getInputFromPort('SetFileName')
+            elif self.hasInputFromPort('SetFile'):
+                name = self.getInputFromPort('SetFile').name
+            else:
+                raise ModuleError(self, 'Missing filename')
+            if not os.path.isfile(name):
+                raise ModuleError(self, 'File does not exist')
+            old_compute(self)
+        return compute
+
+    def compute_SetDiffuseColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetDiffuseColorWidget(self, color):
+            self.vtkInstance.SetDiffuseColor(color.tuple)
+        return call_SetDiffuseColorWidget
+
+    def compute_SetAmbientColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetAmbientColorWidget(self, color):
+            self.vtkInstance.SetAmbientColor(color.tuple)
+        return call_SetAmbientColorWidget
+
+    def compute_SetSpecularColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetSpecularColorWidget(self, color):
+            self.vtkInstance.SetSpecularColor(color.tuple)
+        return call_SetSpecularColorWidget
+
+    def compute_SetColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetColorWidget(self, color):
+            self.vtkInstance.SetColor(color.tuple)
+        return call_SetColorWidget
+
+    def compute_SetEdgeColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetEdgeColorWidget(self, color):
+            self.vtkInstance.SetEdgeColor(color.tuple)
+        return call_SetEdgeColorWidget
+    
+    def compute_SetBackgroundWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetBackgroundWidget(self, color):
+            self.vtkInstance.SetBackground(color.tuple)
+        return call_SetBackgroundWidget
+    
+    def compute_SetBackground2Widget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetBackground2Widget(self, color):
+            self.vtkInstance.SetBackground2(color.tuple)
+        return call_SetBackground2Widget
+    
+    def compute_SetVTKCell(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetRenderWindow(self, cellObj):
+            if cellObj.cellWidget:
+                self.vtkInstance.SetRenderWindow(cellObj.cellWidget.mRenWin)
+        return call_SetRenderWindow
+    
+    def compute_SetTransferFunction(old_compute):
+        # This sets the transfer function
+        if old_compute != None:
+            return old_compute
+        def call_SetTransferFunction(self, tf):
+            tf.set_on_vtk_volume_property(self.vtkInstance)
+        return call_SetTransferFunction
+
+    def compute_SetPointData(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetPointData(self, pd):
+            self.vtkInstance.GetPointData().ShallowCopy(pd)
+        return call_SetPointData
+
+    def compute_SetCellData(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetCellData(self, cd):
+            self.vtkInstance.GetCellData().ShallowCopy(cd)
+        return call_SetCellData            
+
+    def compute_SetPointIds(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetPointIds(self, point_ids):
+            self.vtkInstance.GetPointIds().SetNumberOfIds(point_ids.GetNumberOfIds())
+            for i in xrange(point_ids.GetNumberOfIds()):
+                self.vtkInstance.GetPointIds().SetId(i, point_ids.GetId(i))
+        return call_SetPointIds
+
+    def guarded_Writer_wrap_compute(old_compute):
+        # The behavior for vtkWriter subclasses is to call Write()
+        # If the user sets a name, we will create a file with that name
+        # If not, we will create a temporary file from the file pool
+        def compute(self):
+            old_compute(self)
+            fn = self.vtkInstance.GetFileName()
+            if not fn:
+                o = self.interpreter.filePool.create_file(suffix='.vtk')
+                self.vtkInstance.SetFileName(o.name)
+            else:
+                o = File()
+                o.name = fn
+            self.vtkInstance.Write()
+            self.setResult('file', o)
+        return compute
+
+    for var in dir(node.klass):
+        # Everyone that has a Set.*FileName should have a Set.*File port too
+        if set_file_name_pattern.match(var):
+            def get_compute_SetFile(method_name):
+                def compute_SetFile(old_compute):
+                    if old_compute != None:
+                        return old_compute
+                    def call_SetFile(self, file_obj):
+                        getattr(self.vtkInstance, method_name)(file_obj.name)
+                    return call_SetFile
+                return compute_SetFile
+            update_dict('_special_input_function_' + var[:-4], 
+                        get_compute_SetFile(var))
+
+    if hasattr(node.klass, 'SetFileName'):
+        # ... BUT we only want to check existence of filenames on
+        # readers. VTK is nice enough to be consistent with names, but
+        # this is brittle..
+        if node.klass.__name__.endswith('Reader'):
+            if not node.klass.__name__.endswith('TiffReader'):
+                update_dict('compute', guarded_SetFileName_wrap_compute)
+    if hasattr(node.klass, 'SetRenderWindow'):
+        update_dict('_special_input_function_SetVTKCell',
+                    compute_SetVTKCell)
+    #color gui wrapping
+    if hasattr(node.klass, 'SetDiffuseColor'):
+        update_dict('_special_input_function_SetDiffuseColorWidget',
+                    compute_SetDiffuseColorWidget)
+    if hasattr(node.klass, 'SetAmbientColor'):
+        update_dict('_special_input_function_SetAmbientColorWidget',
+                    compute_SetAmbientColorWidget)
+    if hasattr(node.klass, 'SetSpecularColor'):
+        update_dict('_special_input_function_SetSpecularColorWidget',
+                    compute_SetSpecularColorWidget)
+    if hasattr(node.klass, 'SetEdgeColor'):
+        update_dict('_special_input_function_SetEdgeColorWidget',
+                    compute_SetEdgeColorWidget)
+    if hasattr(node.klass, 'SetColor'):
+        update_dict('_special_input_function_SetColorWidget',
+                    compute_SetColorWidget)
+
+    if (issubclass(node.klass, vtk.vtkRenderer) and 
+        hasattr(node.klass, 'SetBackground')):
+        update_dict('_special_input_function_SetBackgroundWidget',
+                    compute_SetBackgroundWidget)
+    if (issubclass(node.klass, vtk.vtkRenderer) and 
+        hasattr(node.klass, 'SetBackground2')):
+        update_dict('_special_input_function_SetBackground2Widget',
+                    compute_SetBackground2Widget)    
+    if issubclass(node.klass, vtk.vtkWriter):
+        update_dict('compute', guarded_Writer_wrap_compute)
+
+    if issubclass(node.klass, vtk.vtkScalarTree):
+        update_dict('compute', guarded_SimpleScalarTree_wrap_compute)
+
+    if issubclass(node.klass, vtk.vtkVolumeProperty):
+        update_dict('_special_input_function_SetTransferFunction',
+                    compute_SetTransferFunction)
+    if issubclass(node.klass, vtk.vtkDataSet):
+        update_dict('_special_input_function_SetPointData',
+                    compute_SetPointData)
+        update_dict('_special_input_function_SetCellData',
+                    compute_SetCellData)
+    if issubclass(node.klass, vtk.vtkCell):
+        update_dict('_special_input_function_SetPointIds',
+                    compute_SetPointIds)
+    return class_dict_
+
+disallowed_modules = set([
+#        'vtkGeoAlignedImageCache',
+#        'vtkGeoTerrainCache',
+#        'vtkMimeTypeStrategy',
+#        'vtkMPIGroup',
+        'vtkPlotWriter', # Segfaults when being destroyed (when created without a reference, or when last reference is removed)
+        'vtkRenderedLandscapeRepresentation' # Segfaults when calling: GetPeakLabelStopWords()
+        ])
+def createModule(baseModule, node):
+    """ createModule(baseModule: a Module subclass, node: TreeNode) -> None
+    Construct a module inherits baseModule with specification from node
+    
+    """
+    if node.name in disallowed_modules: return
+    def obsolete_class_list():
+        lst = []
+        items = ['vtkInteractorStyleTrackball',
+                 'vtkStructuredPointsGeometryFilter',
+                 'vtkConstrainedPointHandleRepresentation',
+                 'vtkTypePromotion']
+        def try_to_add_item(item):
+            try:
+                lst.append(getattr(titan, item))
+            except AttributeError:
+                pass
+        for item in items:
+            try_to_add_item(item)
+        return lst
+
+    obsolete_list = obsolete_class_list()
+
+    pack1 = vtk
+    for i in titan2:
+        if getattr(i, node.name, None) != None:
+            pack1 = i
+    
+    def is_abstract():
+        """is_abstract tries to instantiate the class. If it's
+        abstract, this will raise."""
+        # Consider obsolete classes abstract        
+        if node.klass in obsolete_list:
+            return True
+        try:
+            getattr(pack1, node.name)()
+        except TypeError: # VTK raises type error on abstract classes
+            return True
+        return False
+    
+    module = new_module(baseModule, node.name,
+                       class_dict(baseModule, node),
+                       docstring=getattr(pack1, node.name).__doc__
+                       )
+
+    # This is sitting on the class
+    if hasattr(fix_classes, node.klass.__name__ + '_fixed'):
+        module.vtkClass = getattr(fix_classes, node.klass.__name__ + '_fixed')
+    else:
+        module.vtkClass = node.klass
+    registry = get_module_registry()
+    registry.add_module(module, abstract=is_abstract(), 
+                        signatureCallable=vtk_hasher)
+    for child in node.children:
+        if child.name in disallowed_classes:
+            continue
+        createModule(module, child)
+
+def createAllModules(g):
+    """ createAllModules(g: ClassTree) -> None
+    Traverse the VTK class tree and add all modules into the module registry
+    
+    """
+    if tuple(vtk.vtkVersion().GetVTKVersion().split('.')) < ('5', '7', '0'):
+        assert len(g.tree[0]) == 1
+        base = g.tree[0][0]
+        assert base.name == 'vtkObjectBase'
+    
+    vtkObjectBase = new_module(vtkBaseModule, 'vtkObjectBase')
+    vtkObjectBase.vtkClass = vtk.vtkObjectBase
+    registry = get_module_registry()
+    registry.add_module(vtkObjectBase)
+    if tuple(vtk.vtkVersion().GetVTKVersion().split('.')) < ('5', '7', '0'):
+        for child in base.children:
+            if child.name in disallowed_classes:
+                continue
+            createModule(vtkObjectBase, child)
+    else:
+        for base in g.tree[0]:
+            for child in base.children:
+                if child.name in disallowed_classes:
+                    continue
+                createModule(vtkObjectBase, child)
+
+##############################################################################
+# Convenience methods
+
+def extract_vtk_instance(vistrails_obj):
+    """extract_vtk_instance(vistrails_obj) -> vtk_object
+
+    takes an instance of a VisTrails module that is a subclass
+    of the vtkObjectBase module and returns the corresponding
+    instance."""
+    global identifier
+    vtkObjectBase = registry.get_descriptor_by_name(identifier,
+                                                    'vtkObjectBase').module
+    assert isinstance(vistrails_obj, vtkObjectBase)
+    return vistrails_obj.vtkInstance
+
+def wrap_vtk_instance(vtk_obj):
+    """wrap_vtk_instance(vtk_object) -> VisTrails module
+
+    takes a vtk instance and returns a corresponding
+    wrapped instance of a VisTrails module"""
+    global identifier
+
+    assert isinstance(vtk_obj, vtk.vtkObjectBase)
+    m = registry.get_descriptor_by_name(identifier,
+                                        vtk_obj.GetClassName())
+    result = m.module()
+    result.vtkInstance = vtk_obj
+    return result
+
+################################################################################
+
+def initialize():
+    """ initialize() -> None
+    Package-entry to initialize the package
+    
+    """
+    # Check VTK version
+    v = vtk.vtkVersion()
+    version = [v.GetVTKMajorVersion(),
+               v.GetVTKMinorVersion(),
+               v.GetVTKBuildVersion()]
+    if version < [5, 0, 0]:
+        raise Exception("You need to upgrade your VTK install to version \
+        > >= 5.0.0")
+    inheritanceGraph = ClassTree(titan2)
+    inheritanceGraph.create()
+
+    # Transfer Function constant
+    tf_widget.initialize()
+
+    delayed = InstanceObject(add_input_port=[])
+    # Add VTK modules
+    registry = get_module_registry()
+    registry.add_module(vtkBaseModule)
+    createAllModules(inheritanceGraph)
+    setAllPorts(registry.get_descriptor_by_name(identifier,
+                                                'vtkObjectBase'),
+                delayed)
+
+#    # Register the VTKCell and VTKHandler type if the spreadsheet is up
+#    if registry.has_module('edu.utah.sci.vistrails.spreadsheet',
+#                           'SpreadsheetCell'):
+#        import vtkhandler
+#        import vtkcell
+#        import vtkviewcell
+#        vtkhandler.registerSelf()
+#        vtkcell.registerSelf()
+#        vtkviewcell.registerSelf()
+
+    # register offscreen rendering module
+    offscreen.register_self()
+
+    # Now add all "delayed" ports - see comment on addSetGetPorts
+    for args in delayed.add_input_port:
+        
+        registry.add_input_port(*args)
+
+    # register Transfer Function adjustment
+    # This can't be reordered -- TransferFunction needs to go before
+    # vtkVolumeProperty, but vtkScaledTransferFunction needs
+    # to go after vtkAlgorithmOutput
+    
+    getter = registry.get_descriptor_by_name
+    registry.add_module(tf_widget.vtkScaledTransferFunction)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Input', getter('edu.utah.sci.vistrails.vtk',
+                                            'vtkAlgorithmOutput').module)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Dataset', getter ('edu.utah.sci.vistrails.vtk',
+                                               'vtkDataObject').module)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Range', [Float, Float])
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'TransferFunction',
+                            tf_widget.TransferFunctionConstant)
+    registry.add_output_port(tf_widget.vtkScaledTransferFunction,
+                             'TransferFunction',
+                             tf_widget.TransferFunctionConstant)
+
+
+################################################################################
diff --git a/contrib/titan/inspectors.py b/contrib/titan/inspectors.py
new file mode 100644
index 0000000..f94e2b5
--- /dev/null
+++ b/contrib/titan/inspectors.py
@@ -0,0 +1,232 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+##############################################################################
+# Data inspectors for VTK
+import vtk
+
+from core.modules.vistrails_module import ModuleError
+from core.utils import VistrailsInternalError
+from core.modules.basic_modules import Module, Float, Integer
+from core.modules.module_registry import get_module_registry
+from base_module import vtkBaseModule
+from hasher import vtk_hasher
+
+class vtkBaseInspector(Module):
+
+    @classmethod
+    def register_self(cls, **kwargs):
+        registry = get_module_registry()
+        def resolve_type(t):
+            if type(t) == tuple:
+                return registry.get_descriptor_by_name(*t).module
+            elif type(t) == type:
+                return t
+            else:
+                assert False, ("Unknown type " + str(type(t)))
+
+        registry.add_module(cls, **kwargs)
+        try:
+            ips = cls.input_ports
+        except AttributeError:
+            pass
+        else:
+            for (port_name, types) in ips:
+                registry.add_input_port(cls,
+                                        port_name,
+                                        list(resolve_type(t) for t in types))
+
+        try:
+            ops = cls.output_ports
+        except AttributeError:
+            pass
+        else:
+            for (port_name, types) in ops:
+                registry.add_output_port(cls,
+                                         port_name,
+                                         list(resolve_type(t) for t in types))
+
+    def auto_set_results(self, vtk_object):
+        for function in self.outputPorts.keys():
+            if hasattr(vtk_object, function):
+                retValues = getattr(vtk_object, function)()
+                if issubclass(retValues.__class__, vtk.vtkObject):
+                    className = retValues.GetClassName()
+                    output  = vtkBaseModule.wrapperModule(className, retValues)
+                    self.setResult(function, output)
+                elif type(retValues) in [tuple, list]:
+                    result = list(retValues)
+                    for i in xrange(len(result)):
+                        if issubclass(result[i].__class__, vtk.vtkObject):
+                            className = result[i].GetClassName()
+                            result[i] = vtkBaseModule.wrapperModule(className,
+                                                                    result[i])
+                    self.setResult(function, type(retValues)(result))
+                else:
+                    self.setResult(function, retValues)
+
+class vtkDataSetInspector(vtkBaseInspector):
+
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInputConnection0"):
+            ic = self.getInputFromPort("SetInputConnection0")
+            port_object = ic.vtkInstance
+            ix = port_object.GetIndex()
+            producer = port_object.GetProducer()
+            try:
+                vtk_object = producer.GetOutput()
+            except AttributeError:
+                raise ModuleError(self, 
+                                  "expected a module that supports GetOutput")
+        elif self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInputConnection0',
+                    [('edu.utah.sci.vistrails.vtk', 'vtkAlgorithmOutput')]),
+                   ('SetInput',
+                    [('edu.utah.sci.vistrails.vtk', 'vtkDataSet')]),
+                   ]
+    output_ports = [('GetBounds', [Float] * 6),
+                    ('GetScalarRange', [Float] * 2),
+                    ('GetLength', [Float]),
+                    ('GetCenter', [Float] * 3),
+                    ('GetNumberOfPoints', [Integer]),
+                    ('GetNumberOfCells', [Integer]),
+                    ('GetPointData', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkPointData')]),
+                    ('GetCellData',
+                     [('edu.utah.sci.vistrails.vtk', 'vtkCellData')]),
+                    ]
+
+class vtkDataSetAttributesInspector(vtkBaseInspector):
+    
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInput',
+                    [('edu.utah.sci.vistrails.vtk', 'vtkDataSetAttributes')]),
+                   ]
+    output_ports = [('GetScalars', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')]),
+                    ('GetVectors', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')]),
+                    ('GetNormals', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')]),
+                    ('GetTCoords', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')]),
+                    ('GetTensors', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')]),
+                    ('GetGlobalIds', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')]),
+                    ('GetPedigreeIds', 
+                     [('edu.utah.sci.vistrails.vtk', 'vtkAbstractArray')]),
+                    ]
+
+class vtkDataArrayInspector(vtkBaseInspector):
+
+   def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+   input_ports = [('SetInput',
+                   [('edu.utah.sci.vistrails.vtk', 'vtkDataArray')])]
+   output_ports = [('GetMaxNorm', [Float]),
+                   ('GetRange', [Float] * 2)]
+                   
+class vtkPolyDataInspector(vtkDataSetInspector):
+
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInputConnection0"):
+            ic = self.getInputFromPort("SetInputConnection0")
+            port_object = ic.vtkInstance
+            ix = port_object.GetIndex()
+            producer = port_object.GetProducer()
+            try:
+                vtk_object = producer.GetOutput()
+            except AttributeError:
+                raise ModuleError(self, 
+                                  "expected a module that supports GetOutput")
+        elif self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+# Wendel
+    input_ports = [('SetInputConnection0',
+                    [('edu.utah.sci.vistrails.vtk', 'vtkAlgorithmOutput')]),
+                   ('SetInput',
+                    [('edu.utah.sci.vistrails.vtk', 'vtkDataSet')]),
+                   ]
+    output_ports = [('GetVerts',
+                     [('edu.utah.sci.vistrails.vtk', 'vtkCellArray')]),
+                    ('GetLines',
+                     [('edu.utah.sci.vistrails.vtk', 'vtkCellArray')]),
+                    ('GetPolys',
+                     [('edu.utah.sci.vistrails.vtk', 'vtkCellArray')]),
+                    ('GetStrips',
+                     [('edu.utah.sci.vistrails.vtk', 'vtkCellArray')]),
+                    ('GetPoints',
+                     [('edu.utah.sci.vistrails.vtk', 'vtkPoints')]),
+                    ('GetNumberOfVerts', [Integer]),
+                    ('GetNumberOfLines', [Integer]),
+                    ('GetNumberOfPolys', [Integer]),
+                    ('GetNumberOfStrips', [Integer]),
+                    ]
+
+def initialize():
+    vtkBaseInspector.register_self(abstract=True, signatureCallable=vtk_hasher)
+    vtkDataSetInspector.register_self(abstract=False, 
+                                      signatureCallable=vtk_hasher)
+    vtkDataSetAttributesInspector.register_self(abstract=False, 
+                                                signatureCallable=vtk_hasher)
+    vtkDataArrayInspector.register_self(abstract=False, 
+                                        signatureCallable=vtk_hasher)
+    vtkPolyDataInspector.register_self(abstract=False,
+                                       signatureCallable=vtk_hasher)
+    
diff --git a/contrib/titan/offscreen.py b/contrib/titan/offscreen.py
new file mode 100644
index 0000000..127ba57
--- /dev/null
+++ b/contrib/titan/offscreen.py
@@ -0,0 +1,62 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+from core.modules.module_registry import get_module_registry
+from core.modules.vistrails_module import Module
+from core.modules.basic_modules import File, Integer
+
+class VTKRenderOffscreen(Module):
+
+    def compute(self):
+        r = self.getInputFromPort("renderer").vtkInstance
+        window = vtk.vtkRenderWindow()
+        w = self.forceGetInputFromPort("width", 512)
+        h = self.forceGetInputFromPort("height", 512)
+        window.OffScreenRenderingOn()
+        window.SetSize(w, h)
+        # r.ResetCamera()
+        window.AddRenderer(r)
+        window.Start()
+        window.Render()
+        win2image = vtk.vtkWindowToImageFilter()
+        win2image.SetInput(window)
+        win2image.Update()
+        writer = vtk.vtkPNGWriter()
+        writer.SetInput(win2image.GetOutput())
+        output = self.interpreter.filePool.create_file(suffix='.png')
+        writer.SetFileName(output.name)
+        writer.Write()
+        window.Finalize()
+        self.setResult("image", output)
+
+def register_self():
+    registry = get_module_registry()
+    r = registry.get_descriptor_by_name(
+        'edu.utah.sci.vistrails.vtk',
+# Wendel
+        'vtkRenderer').module
+    registry.add_module(VTKRenderOffscreen)
+    registry.add_input_port(VTKRenderOffscreen, 'renderer', r)
+    registry.add_input_port(VTKRenderOffscreen, 'width', Integer)
+    registry.add_input_port(VTKRenderOffscreen, 'height', Integer)
+    registry.add_output_port(VTKRenderOffscreen, 'image', File)
+
diff --git a/contrib/titan/tf_widget.py b/contrib/titan/tf_widget.py
new file mode 100644
index 0000000..0c52e73
--- /dev/null
+++ b/contrib/titan/tf_widget.py
@@ -0,0 +1,575 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+##############################################################################
+# Transfer Function Widget for VTK
+
+from PyQt4 import QtCore, QtGui
+from core.modules.constant_configuration import ConstantWidgetMixin
+from core.modules.basic_modules import new_constant, init_constant, Module
+from core.utils.color import ColorByName
+import vtk
+import math
+import pickle
+import copy
+
+################################################################################
+# etc
+
+def clamp(v, mn, mx, eps=0.0):
+    mn += eps
+    mx -= eps
+    if v < mn: return mn
+    if v > mx: return mx
+    return v
+
+##############################################################################
+# Transfer Function object
+
+class TransferFunction(object):
+
+    def __init__(self):
+        self._min_range = 0.0
+        self._max_range = 1.0
+        self._pts = []
+
+    def set_range(self, mn, mx):
+        self._min_range = mn
+        self._max_range = mx
+
+    def set_on_vtk_volume_property(self, vtk_volume_property):
+        # Builds the opacity and color functions
+        of = vtk.vtkPiecewiseFunction()
+        cf = vtk.vtkColorTransferFunction()
+        vp = vtk_volume_property
+        for pt in self._pts:
+            (scalar, opacity, color) = pt
+            # Map scalar to tf range
+            s = self._min_range + (self._max_range - self._min_range) * scalar
+            of.AddPoint(s, opacity)
+            cf.AddRGBPoint(s, color[0], color[1], color[2])
+        vp.SetScalarOpacity(of)
+        vp.SetColor(cf)
+
+    def add_point(self, scalar, opacity, color):
+        self._pts.append((scalar, opacity, color))
+        self._pts.sort()
+
+    def get_value(self, scalar):
+        """get_value(scalar): returns the opacity and color
+        linearly interpolated at the value. Useful for
+        adding knots."""
+        ix = 0
+        while ix < len(self._pts) and self._pts[ix][0] > scalar:
+            ix += 1
+        if ix == 0:
+            return (self._pts[0][1], self._pts[0][2])
+        elif ix == len(self._pts):
+            return (self._pts[-1][1], self._pts[-1][2])
+        else:
+            u = ((self._pts[ix][0] - scalar) /
+                 (self._pts[ix][0] - self._pts[ix-1][0]))
+            do = self._pts[ix][1] - self._pts[ix-1][1]
+            dr = self._pts[ix][2][0] - self._pts[ix-1][2][0]
+            dg = self._pts[ix][2][1] - self._pts[ix-1][2][1]
+            db = self._pts[ix][2][2] - self._pts[ix-1][2][2]
+            return (self._pts[ix-1][1] + u * do,
+                    (self._pts[ix-1][2][0] + u * dr,
+                     self._pts[ix-1][2][1] + u * dg,
+                     self._pts[ix-1][2][2] + u * db))
+
+    def __copy__(self):
+        result = TransferFunction()
+        result._min_range = self._min_range
+        result._max_range = self._max_range
+        result._pts = copy.copy(self._pts)
+        return result
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        if self._min_range != other._min_range:
+            return False
+        if self._max_range != other._max_range:
+            return False
+        for my_pt, other_pt in zip(self._pts, other._pts):
+            if my_pt != other_pt:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+##############################################################################
+# Graphics Items
+
+class TransferFunctionPoint(QtGui.QGraphicsEllipseItem):
+
+    selection_pens = { True: QtGui.QPen(QtGui.QBrush(
+        QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))),0.012),
+                       False: QtGui.QPen() }
+
+    def __init__(self, scalar, opacity, color, parent=None):
+        QtGui.QGraphicsEllipseItem.__init__(self, parent)
+        self._scalar = scalar
+        self._opacity = opacity
+        self._color = QtGui.QColor(color[0]*255,
+                                   color[1]*255,
+                                   color[2]*255)
+        self.setPen(QtGui.QPen(QtGui.QColor(0,0,0)))
+        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable) 
+        self.setZValue(2.0)
+
+        self._sx = 1.0
+        self._sy = 1.0
+        self._left_line = None
+        self._right_line = None
+        self._point = QtCore.QPointF(scalar, opacity)
+        self.refresh()
+
+        self.setToolTip("Double-click to change color\n"
+                        "Right-click to remove point\n"
+                        "Scalar: %.5f, Opacity: %.5f" % (self._scalar,
+                                                         self._opacity))
+        # This sets up the linked list of Lines
+
+    def keyPressEvent(self, event):
+        if event.key() == QtCore.Qt.Key_Backspace or \
+           event.key() == QtCore.Qt.Key_Delete:
+            self.remove_self()
+
+    def refresh(self):
+        dx = 0.025 / self._sx
+        dy = 0.025 / self._sy
+        # this is the setup
+        self.setBrush(QtGui.QBrush(self._color))
+        self.setRect(-dx,
+                     -dy,
+                     2 * dx, 2 * dy)
+        self.setPos(self._scalar,
+                    self._opacity)
+
+    def update_scale(self, sx, sy):
+        self._sx = sx
+        self._sy = sy
+        self.refresh()
+
+    def itemChange(self, change, value):
+        if change == QtGui.QGraphicsItem.ItemSelectedChange:
+            self.setPen(self.selection_pens[value.toBool()])
+        if change == QtGui.QGraphicsItem.ItemPositionChange:
+            # moves point
+            pt = value.toPointF()
+            pt.setY(clamp(pt.y(), 0.0, 1.0))
+            self._opacity = pt.y()
+            self._point.setY(pt.y())
+            if not self._left_line:
+                pt.setX(0.0)
+            elif not self._right_line:
+                pt.setX(1.0)
+            else:
+                assert self._left_line._point_right == self
+                assert self._right_line._point_left == self
+                pt.setX(clamp(pt.x(),
+                              self._left_line._point_left._point.x(),
+                              self._right_line._point_right._point.x(),
+                              1e-6))
+                self._point.setX(pt.x())
+                self._scalar = pt.x()
+            if self._left_line:
+                self._left_line.refresh()
+            if self._right_line:
+                self._right_line.refresh()
+            if self.scene():
+                self.scene()._tf_poly.setup()
+            self.setToolTip("Double-click to change color\n"
+                        "Right-click to remove point\n"
+                        "Scalar: %.5f, Opacity: %.5f" % (self._scalar,
+                                                         self._opacity))
+            return QtGui.QGraphicsItem.itemChange(self, change,
+                                                  QtCore.QVariant(pt))
+        return QtGui.QGraphicsItem.itemChange(self, change, value)
+
+    def remove_self(self):
+        if not self._left_line or not self._right_line:
+            # Ignore, self is a corner node that can't be removed
+            return
+        
+        # Removes the right line and self, re-ties data structure
+        self._left_line._point_right = self._right_line._point_right
+        self._left_line._point_right._left_line = self._left_line
+        
+        # be friends with garbage collector
+        self._right_line._point_left = None
+        self._right_line._point_right = None
+        self.scene()._tf_poly.setup()
+        self.scene().removeItem(self._right_line)
+        self.scene().removeItem(self)
+        self._left_line.refresh()
+
+    def mouseDoubleClickEvent(self, event):
+        new_color = QtGui.QColorDialog.getColor(self._color)
+        if not new_color.isValid():
+            return
+        self._color = new_color
+        if self._left_line:
+            self._left_line.refresh()
+        if self._right_line:
+            self._right_line.refresh()
+        self.refresh()
+        self.scene()._tf_poly.setup()
+
+    def mousePressEvent(self, event):
+        if event.button() == QtCore.Qt.RightButton:
+            event.accept()
+            self.remove_self()
+        else:
+            QtGui.QGraphicsEllipseItem.mousePressEvent(self, event)
+        
+    def add_self_to_transfer_function(self, tf):
+        tf.add_point(self._scalar,
+                     self._opacity,
+                     (self._color.redF(),
+                      self._color.greenF(),
+                      self._color.blueF()))
+
+class TransferFunctionPolygon(QtGui.QGraphicsPolygonItem):
+
+    def __init__(self):
+        QtGui.QGraphicsPolygonItem.__init__(self)
+
+    def setup(self):
+        # This inspects the scene, finds the left-most point, and
+        # then builds the polygon traversing the linked list structure
+        if not self.scene():
+            return
+        pt = self.scene().get_leftmost_point()
+        first_pt = pt
+        self.setZValue(1.25)
+        g = QtGui.QLinearGradient()
+        g.setStart(0.0, 0.5)
+        g.setFinalStop(1.0, 0.5)
+        p = QtGui.QPen()
+        p.setStyle(QtCore.Qt.NoPen)
+        pts = [QtCore.QPointF(pt.x(), 0)]
+        self.setPen(p)
+        
+        while 1:
+            c = QtGui.QColor(pt._color)
+            c.setAlphaF(pt._opacity)
+            g.setColorAt(pt._scalar, c)
+            pts.append(pt._point)
+            # move cursor fwd
+            if pt._right_line:
+                pt = pt._right_line._point_right
+            else:
+                break
+        self.setBrush(QtGui.QBrush(g))
+        pts.append(QtCore.QPointF(pt.x(), 0))
+        self.setPolygon(QtGui.QPolygonF(pts))
+
+class TransferFunctionLine(QtGui.QGraphicsPolygonItem):
+
+    def __init__(self, point_left, point_right, parent=None):
+        assert point_right._scalar >= point_left._scalar
+        QtGui.QGraphicsPolygonItem.__init__(self, parent)
+        self._point_left = point_left
+        self._point_right = point_right
+        self._point_left._right_line = self
+        self._point_right._left_line = self
+        self.setup(1.0, 1.0)
+        self._sx = 1.0
+        self._sy = 1.0
+        
+    def setup(self, sx, sy):
+        d = self._point_right._point - self._point_left._point
+        d_normal = QtCore.QPointF(d.y(), -d.x())
+        l = math.sqrt(d.x() * d.x() + d.y() * d.y())
+        if l != 0.0:
+            d_normal /= l
+            d_normal *= 0.010
+            d_normal.setX(d_normal.x() / sx)
+            d_normal.setY(d_normal.y() / sy)
+        ps = [self._point_left._point + d_normal,
+              self._point_right._point + d_normal,
+              self._point_right._point - d_normal,
+              self._point_left._point - d_normal]
+        self.setPolygon(QtGui.QPolygonF(ps))
+        self.setZValue(1.5)
+        # Gradient for filling
+        g = QtGui.QLinearGradient()
+        g.setStart(self._point_left._point)
+        g.setFinalStop(self._point_right._point)
+        g.setColorAt(0.0, self._point_left._color)
+        g.setColorAt(1.0, self._point_right._color)
+        self.setBrush(QtGui.QBrush(g))
+        # Gradient for outlining
+        g = QtGui.QLinearGradient()
+        g.setStart(self._point_left._point)
+        g.setFinalStop(self._point_right._point)
+        dark_pl = QtGui.QColor(self._point_left._color.red() * 0.5,
+                               self._point_left._color.green() * 0.5,
+                               self._point_left._color.blue() * 0.5)
+        dark_pr = QtGui.QColor(self._point_right._color.red() * 0.5,
+                               self._point_right._color.green() * 0.5,
+                               self._point_right._color.blue() * 0.5)
+        g.setColorAt(0.0, dark_pl)
+        g.setColorAt(1.0, dark_pr)
+        p = QtGui.QPen()
+        p.setBrush(QtGui.QBrush(g))
+        self.setPen(p)
+
+    def update_scale(self, sx, sy):
+        self._sx = sx
+        self._sy = sy
+        self.refresh()
+
+    def refresh(self):
+        self.setup(self._sx, self._sy)
+
+    def mouseDoubleClickEvent(self, event):
+        p = event.scenePos()
+        c_left = self._point_left._color
+        c_right = self._point_right._color
+        u = ((p.x() - self._point_left._point.x()) /
+             (self._point_right._point.x() - self._point_left._point.x()))
+        new_c = (u * c_right.redF() + (1-u) * c_left.redF(),
+                 u * c_right.greenF() + (1-u) * c_left.greenF(),
+                 u * c_right.blueF() + (1-u) * c_left.blueF())
+        new_point = TransferFunctionPoint(p.x(), p.y(), new_c)
+        new_line = TransferFunctionLine(new_point, self._point_right)
+        new_point._left_line = self
+        self._point_right = new_point
+        self.scene().addItem(new_line)
+        self.scene().addItem(new_point)
+        new_line.update_scale(self._point_left._sx,
+                              self._point_left._sy)
+        new_point.update_scale(self._point_left._sx,
+                               self._point_left._sy)
+        new_point.refresh()
+        self.refresh()
+
+    def mousePressEvent(self, event):
+        # This needs to be here, otherwise mouseDoubleClickEvent does
+        # not get called.
+        event.accept()
+        
+
+##############################################################################
+# Scene, view, widget
+
+class TransferFunctionScene(QtGui.QGraphicsScene):
+
+    def __init__(self, tf, parent=None):
+        QtGui.QGraphicsScene.__init__(self, parent)
+        self._tf_items = []
+        poly = TransferFunctionPolygon()
+        poly.setup()
+        self._tf_poly = poly
+        self.addItem(poly)
+        self.create_tf_items(tf)
+        #current scale
+        self._sx = 1.0
+        self._sy = 1.0    
+        # Add outlines
+        line_color = QtGui.QColor(200, 200, 200)
+        pen = QtGui.QPen(line_color)
+        ps = [QtCore.QPointF(0.0, 0.0),
+              QtCore.QPointF(1.0, 0.0),
+              QtCore.QPointF(1.0, 1.0),
+              QtCore.QPointF(0.0, 1.0)]
+        outline = QtGui.QPolygonF(ps)
+        self.addPolygon(outline, pen)
+
+        for i in xrange(51):
+            u = float(i) / 50.0
+            self.addLine(QtCore.QLineF(u, 0.0, u, 1.0), pen)
+            self.addLine(QtCore.QLineF(0.0, u, 1.0, u), pen)
+
+    def reset_transfer_function(self, tf):
+        self.create_tf_items(tf)
+        self.update_scale(self._sx, self._sy)
+        self._tf_poly.setup()
+        
+    def removeItem(self, item):
+        if item in self._tf_items:
+            self._tf_items.remove(item)
+        QtGui.QGraphicsScene.removeItem(self, item)
+
+    def addItem(self, item):
+        # Ugly, but hey
+        if isinstance(item, TransferFunctionLine) or \
+           isinstance(item, TransferFunctionPoint):
+            self._tf_items.append(item)
+        QtGui.QGraphicsScene.addItem(self, item)
+
+    def create_tf_items(self, tf):
+        items = copy.copy(self._tf_items)
+        for item in items:
+            self.removeItem(item)
+        self._tf_items = []
+        if len(tf._pts) == 0:
+            pt_left = TransferFunctionPoint(0.0, 0.0, (0.0, 0.0, 0.0))
+            pt_right = TransferFunctionPoint(1.0, 0.0, (0.0, 0.0, 0.0))
+            line = TransferFunctionLine(pt_left, pt_right)
+            
+            self.addItem(pt_left)
+            self.addItem(pt_right)
+            self.addItem(line)
+            
+        else:
+            pts = [TransferFunctionPoint(*pt)
+                   for pt in tf._pts]
+            lines = [TransferFunctionLine(pt_l, pt_r)
+                     for (pt_l, pt_r) in zip(pts[:-1], pts[1:])]
+            for pt in pts:
+                self.addItem(pt)
+            for line in lines:
+                self.addItem(line)
+
+    def add_knot(self, scalar, opacity):
+        pass
+
+    def update_scale(self, sx, sy):
+        for item in self._tf_items:
+            item.update_scale(sx, sy)
+        self._sx = sx
+        self._sy = sy
+
+    def get_leftmost_point(self):
+        pt = None
+        
+        for item in self._tf_items:
+            if hasattr(item, '_left_line') and not item._left_line:
+                pt = item
+                break
+        assert pt
+        return pt        
+
+    def get_transfer_function(self):
+        result = TransferFunction()
+        pt = self.get_leftmost_point()
+        while 1:
+            pt.add_self_to_transfer_function(result)
+            if pt._right_line:
+                pt = pt._right_line._point_right
+            else:
+                break
+        return result
+
+class TransferFunctionView(QtGui.QGraphicsView):
+    def __init__(self, parent=None):
+        QtGui.QGraphicsView.__init__(self, parent)
+        self.setRenderHint(QtGui.QPainter.Antialiasing)
+        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        
+    def resizeEvent(self, event):
+        self.setMatrix(QtGui.QMatrix(event.size().width() / (10.0/9), 0,
+                                     0, -event.size().height() / (10.0/9), 0, 0))
+        self.scene().update_scale(event.size().width()/(2000.0/9), event.size().height()/(2000.0/9))
+        
+    def focusOutEvent(self, event):
+        self.parent().update_parent()
+        QtGui.QGraphicsView.focusOutEvent(self, event)
+
+default_tf = TransferFunction()
+default_tf.add_point(0.0, 0.0, (0.0, 0.0, 0.0))
+default_tf.add_point(1.0, 0.0, (0.0, 0.0, 0.0))
+    
+class TransferFunctionWidget(QtGui.QWidget, ConstantWidgetMixin):
+
+    def __init__(self, param, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        if not param.strValue:
+            self._tf = copy.copy(default_tf)
+        else:
+            self._tf = pickle.loads(param.strValue.decode('hex'))
+        self._scene = TransferFunctionScene(self._tf, self)
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+        self._view = TransferFunctionView()
+        self._view.setScene(self._scene)
+        self._view.setMinimumSize(200,200)
+        self._view.show()
+        self._view.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                 QtGui.QSizePolicy.Expanding)
+        self._view.setMatrix(QtGui.QMatrix(180, 0, 0, -180, 0, 0))
+        self.setMinimumSize(200,200)
+        caption = QtGui.QLabel("Double-click on the line to add a point")
+        font = QtGui.QFont('Arial', 11)
+        font.setItalic(True)
+        caption.setFont(font)
+        layout.addWidget(self._view)
+        layout.addWidget(caption)
+
+    def contents(self):
+        return pickle.dumps(self._scene.get_transfer_function()).encode('hex')
+    
+    def setContents(self, strValue, silent=True):
+        if not strValue:
+            self._tf = copy.copy(default_tf)
+        else:
+            self._tf = pickle.loads(strValue.decode('hex'))
+        self._scene.reset_transfer_function(self._tf)
+        if not silent:
+            self.update_parent()    
+            
+##############################################################################
+# Helper module to adjust range
+
+class vtkScaledTransferFunction(Module):
+
+    def compute(self):
+        tf = self.getInputFromPort('TransferFunction')
+        new_tf = copy.copy(tf)
+        if self.hasInputFromPort('Input'):
+            port = self.getInputFromPort('Input')
+            algo = port.vtkInstance.GetProducer()
+            output = algo.GetOutput(port.vtkInstance.GetIndex())
+            (new_tf._min_range, new_tf._max_range) = output.GetScalarRange()
+        elif self.hasInputFromPort('Dataset'):
+            algo = self.getInputFromPort('Dataset').vtkInstance
+            output = algo
+            (new_tf._min_range, new_tf._max_range) = output.GetScalarRange()
+        else:
+            (new_tf._min_range, new_tf._max_range) = self.getInputFromPort('Range')
+            
+        self.setResult('TransferFunction', new_tf)
+
+string_conversion = staticmethod(lambda x: pickle.dumps(x).encode('hex'))
+conversion = staticmethod(lambda x: pickle.loads(x.decode('hex')))
+validation = staticmethod(lambda x: isinstance(x, TransferFunction))
+TransferFunctionConstant = new_constant('TransferFunction',
+                                        conversion,
+                                        default_tf,
+                                        validation,
+                                        TransferFunctionWidget)
+TransferFunctionConstant.translate_to_string = string_conversion
+
+##############################################################################
+
+def initialize():
+    init_constant(TransferFunctionConstant)
diff --git a/contrib/titan/vtk_parser.py b/contrib/titan/vtk_parser.py
new file mode 100644
index 0000000..c0479c9
--- /dev/null
+++ b/contrib/titan/vtk_parser.py
@@ -0,0 +1,528 @@
+# Author: Prabhu Ramachandran
+# Copyright (c) 2004, Enthought, Inc.
+# License: BSD Style.
+
+# Modified for VisTrails by the VisTrails team.
+
+"""This module parses the VTK methods, obtains the argument and return
+type information, and organizes them.
+
+"""
+
+pkgs = [ "titan.Antiword", "titan.Common", "titan.DataAnalysis",
+"titan.GMeans", "titan.HDF5", "titan.MPIDataAnalysis", "titan.MPITextAnalysis",
+"titan.MTGLGraphAnalysis", "titan.OWL",
+#"titan.StanfordNER",
+"titan.TextAnalysis", "titan.Trilinos", "titan.Web", "titan.XPDF"]
+titan2 = []
+for i in pkgs:
+    titan2.append(__import__(i))
+
+import vtk
+
+import re
+import class_tree
+import core.debug
+
+log      = core.debug.log
+warning  = core.debug.warning
+critical = core.debug.critical
+debug    = core.debug.debug
+
+class VTKMethodParser(object):
+    """This class provides useful methods for parsing methods of a VTK
+    class or instance.
+
+    The class allows one to categorize the methods of the VTK class
+    and also obtain the method signatures in a form that is easy to
+    use.  When the `parse` method is called, it in turn calls the
+    `_organize_methods` method.  This method organizes the VTK methods
+    into different instance variables described in the following.
+    `self.toggle_meths` contains a dictionary of all the boolean
+    methods of the form <Value>On/Off.  The dictionary keys are
+    strings with the <Value>'s and the value of each item is the
+    default value (0/1) of the item (the example below will clarify
+    this).  `self.state_meths` contains a dictionary which collects
+    the Set<Prop>To<Value> type of methods.  The key is the <Prop> and
+    the value is a list containing the different string <Value>'s and
+    their corresponding mapped value.  The first value in these is the
+    default value of the <Prop>.  `self.get_set_meths` will contain a
+    dictionary which collects all the methods of the form
+    Set/Get<Prop> that are not already specified in
+    `self.toggle_meths` or `self.state_meths`.  The default value of
+    the Get<Prop> is stored.  If the value accepted by the method has
+    a range (via the methods `Get<Prop>MinValue` and
+    `Get<Prop>MaxValue`), then that range is computed and stored.
+    `self.get_meths` stores the methods that are of the form
+    `Get<Prop>`.  `self.other_meths` stores the remaining methods.
+    The parsing is quite fast.  Parsing every class in the VTK API
+    takes a couple of seconds (on a Pentium III @ 450Mhz).
+
+    Here is an example::
+        
+       >>> import vtk
+       >>> p = VTKMethodParser()
+       >>> p.parse(vtk.vtkProperty)
+       >>> print p.get_toggle_methods()
+       {'EdgeVisibility': 0, 'BackfaceCulling': 0, 'FrontfaceCulling': 0}
+       >>> print p.get_state_methods()['Representation']
+       [['Surface', 2], ['Points', 0], ['Surface', 2], ['Wireframe', 1]]
+       >>> print p.get_get_set_methods()['Opacity']
+       (1.0, (0.0, 1.0))
+       >>> print p.get_get_methods()
+       ['GetClassName']
+       >>> print p.get_other_methods()[:3]
+       ['BackfaceRender', 'DeepCopy', 'IsA']
+
+
+    The class also provides a method called `get_method_signature`
+    that obtains the Python method signature given the VTK method
+    object.  Here is an example::
+    
+       >>> import vtk
+       >>> p = VTKMethodParser()
+       >>> o = vtk.vtkProperty
+       >>> print p.get_method_signature(o.GetClassName)
+       [(['string'], None)]
+       >>> print p.get_method_signature(o.GetColor)[0]
+       ([('float', 'float', 'float')], None)
+       >>> print p.get_method_signature(o.GetColor)[1]
+       ([None], (('float', 'float', 'float'),))
+
+    The `get_method_signature` is fairly efficient and obtaining the
+    signature for every method in every class in the VTK API takes
+    around 6 seconds (on a Pentium III @ 450Mhz).
+
+    """
+
+    def __init__(self, use_tree=True):
+        """Initializes the object.
+
+        Parameters
+        ----------
+
+        - use_tree : `bool`
+
+          If True (default), use a ClassTree instance to obtain a
+          concrete subclass for an abstract base class.  This is used
+          only to find the range and default values for some of the
+          methods.  If False, no ClassTree instance is created.
+
+          This is optional because, creating a ClassTree is expensive.
+          The parser functionality can be very useful even without the
+          use of a ClassTree.  For example, if one wants to save the
+          state of a VTK object one only needs to know the names of
+          the methods and not their default values, ranges etc.  In
+          that case using a parser should be cheap.
+
+        """
+        # The ClassTree is needed to find an instantiable child class
+        # for an abstract VTK parent class.  This instance is used to
+        # obtain the state values and the ranges of the arguments
+        # accepted by the Get/Set methods that have a
+        # Get<Prop>{MaxValue,MinValue} method.
+        if use_tree:
+            self._tree = class_tree.ClassTree(titan2)
+            self._tree.create()
+        else:
+            self._tree = None
+        self._state_patn = re.compile('To[A-Z0-9]')
+        self._initialize()
+
+    #################################################################
+    # 'VTKMethodParser' interface.
+    #################################################################
+
+    def parse(self, obj, no_warn=True):
+        """Parse the methods for a given VTK object/class.
+
+        Given a VTK class or object, this method parses the methods
+        and orgaizes them into useful categories.  The categories and
+        their usage is documented in the documentation for the class.
+
+        Parameters
+        ----------
+
+        - obj : VTK class or instance
+
+        - no_warn : `bool` (default: True)
+
+          If True (default), it suppresses any warnings generated by
+          the VTK object when parsing the methods.  This is safe to
+          use.
+        
+        """
+        if not hasattr(obj, '__bases__'):
+            klass = obj.__class__
+        else:
+            klass = obj
+
+        methods = self.get_methods(klass)
+
+# Wendel
+        if no_warn:
+            # Save warning setting and shut it off before parsing.
+            warn = vtk.vtkObject.GetGlobalWarningDisplay()
+            if klass.__name__ <> 'vtkObject':
+                vtk.vtkObject.GlobalWarningDisplayOff()
+
+        self._organize_methods(klass, methods)
+
+        if no_warn:
+            # Reset warning status.
+            vtk.vtkObject.SetGlobalWarningDisplay(warn)
+
+    def get_methods(self, klass):
+        """Returns all the relevant methods of the given VTK class."""
+        methods = dir(klass)[:]
+        if hasattr(klass, '__members__'):
+            # Only VTK versions < 4.5 have these.
+            for m in klass.__members__:
+                methods.remove(m)
+
+        return methods
+
+    def get_toggle_methods(self):        
+        """Returns a dictionary of the parsed <Value>On/Off methods
+        along with the default value.
+
+        """
+        return self.toggle_meths
+    
+    def get_state_methods(self):
+        """Returns a dict of the parsed Set<Prop>To<Value>.
+
+        The keys are the <Prop> string with a list of the different
+        <Value> strings along with their corresponding value (if
+        obtainable).  The first value is the default value of the
+        state.
+        
+        """
+        return self.state_meths
+
+    def get_get_set_methods(self):
+        """Returns a dict of the parsed Get/Set<Value> methods.
+
+        The keys of the dict are the <Value> strings and contain a
+        two-tuple containing the default value (or None if it is not
+        obtainable for some reason) and a pair of numbers specifying
+        an acceptable range of values (or None if not obtainable).
+
+        """
+        return self.get_set_meths
+    
+    def get_get_methods(self):
+        """Return a list of parsed Get<Value> methods.
+
+        All of these methods do NOT have a corresponding Set<Value>.
+
+        """
+        return self.get_meths
+    
+    def get_other_methods(self):
+        """Return list of all other methods, that are not
+        categorizable.
+
+        """
+        return self.other_meths    
+
+    def get_method_signature(self, method):
+        """Returns information on the Python method signature given
+        the VTK method.
+
+        The doc string of the given method object to get the method
+        signature.  The method returns a list of tuples, each of which
+        contains 2 items, the first is a list representing the return
+        value the second represents the arguments to be passed to the
+        function.  If the method supports different return values and
+        arguments, this function returns all of their signatures.
+
+        Parameters
+        ----------
+
+        - method : `method`
+
+          A VTK method object.
+
+        """
+        doc = method.__doc__
+        doc = doc[:doc.find('\n\n')]
+        sig = doc.split('\n')
+        sig = [x.strip() for x in sig]
+
+        # Remove all the C++ function signatures.
+        for i in sig[:]:
+            if i[:4] == 'C++:':
+                sig.remove(i)
+
+        # Remove the V.<method_name>
+        sig = [x.replace('V.' + method.__name__, '') for x in sig]
+
+        pat = re.compile(r'\b')
+
+        # Split into [return_value, arguments] after processing them.
+        tmp = list(sig)
+        sig = []
+        for i in tmp:
+            # Split to get return values.
+            x = i.split('->')
+            # Strip each part.
+            x = [y.strip() for y in x]
+
+            if len(x) == 1: # No return value
+                x = [None, x[0]]
+            else:
+                x.reverse()
+
+            ret, arg = x        
+
+            # Remove leading and trailing parens for arguments.
+            arg = arg[1:-1]
+            if not arg:
+                arg = None
+            if arg and arg[-1] == ')':
+                arg = arg + ','
+
+            # Now quote the args and eval them.  Easy!
+            if ret:
+                ret = eval(pat.sub('\"', ret))
+            if arg:
+                arg = eval(pat.sub('\"', arg))
+                if type(arg) == type('str'):
+                    arg = [arg]        
+
+            sig.append(([ret], arg))
+
+        return sig
+
+    def get_tree(self):
+        """Return the ClassTree instance used by this class."""
+        return self._tree
+
+    #################################################################
+    # Non-public interface.
+    #################################################################
+
+    def _initialize(self):
+        """Initializes the method categories."""
+        # Collects the <Value>On/Off methods.
+        self.toggle_meths = {}
+        # Collects the Set<Prop>To<Value> methods.
+        self.state_meths = {}
+        # Collects the Set/Get<Value> pairs.
+        self.get_set_meths = {}
+        # Collects the Get<Value> methods.
+        self.get_meths = []
+        # Collects all the remaining methods.
+        self.other_meths = []
+
+    def _organize_methods(self, klass, methods):
+        """Organizes the given methods of a VTK class into different
+        categories.
+
+        Parameters
+        ----------
+
+        - klass : A VTK class
+
+        - methods : `list` of `str`
+
+          A list of the methods to be categorized.
+
+        """
+        self._initialize()
+        meths = methods[:]
+        meths = self._find_toggle_methods(klass, meths)
+        meths = self._find_state_methods(klass, meths)
+        meths = self._find_get_set_methods(klass, meths)
+        meths = self._find_get_methods(klass, meths)
+        self.other_meths = [x for x in meths if '__' not in x]
+
+    def _remove_method(self, meths, method):
+        try:
+            meths.remove(method)
+        except ValueError:
+            pass
+
+    def _find_toggle_methods(self, klass, methods):
+        """Find/store methods of the form <Value>{On,Off} in the given
+        `methods`.  Returns the remaining list of methods.
+
+        """
+        meths = methods[:]
+        tm = self.toggle_meths
+        for method in meths[:]:
+            if method[-2:] == 'On':
+                key = method[:-2]
+                if (key + 'Off') in meths and ('Get' + key) in meths:
+                    tm[key] = None
+                    meths.remove(method)
+                    meths.remove(key + 'Off')
+                    self._remove_method(meths, 'Set' + key)
+                    self._remove_method(meths, 'Get' + key)
+        # get defaults
+        if tm:
+            obj = self._get_instance(klass)
+            if obj:
+                for key in tm:
+                    try:
+                        tm[key] = getattr(obj, 'Get%s'%key)()
+                    except TypeError, e:
+                        log("Type error during parsing: class %s will not expose method %s " % (klass.__name__, key))
+                    except AttributeError, e:
+                        log("Attribute error during parsing: class %s will not expose method %s " % (klass.__name__, key))
+        return meths
+
+    def _find_state_methods(self, klass, methods):
+        """Find/store methods of the form Set<Prop>To<Value> in the
+        given `methods`.  Returns the remaining list of methods.  The
+        method also computes the mapped value of the different
+        <Values>.
+
+        """
+        # These ignored ones are really not state methods.
+        ignore = ['SetUpdateExtentToWholeExtent']
+        meths = methods[:]
+        sm = self.state_meths
+        for method in meths[:]:
+            if method not in ignore and method[:3] == 'Set':
+                # Methods of form Set<Prop>To<Value>
+                match = self._state_patn.search(method)
+                # Second cond. ensures that this is not an accident.
+                if match and (('Get'+method[3:]) not in meths):
+                    key = method[3:match.start()] # The <Prop> part.
+                    if (('Get' + key) in methods):
+                        val = method[match.start()+2:] # <Value> part.
+                        meths.remove(method)
+                        if sm.has_key(key):
+                            sm[key].append([val, None])
+                        else:
+                            sm[key] = [[val, None]]
+                            meths.remove('Get'+ key)
+                            self._remove_method(meths, 'Set'+ key)
+                            if ('Get' + key + 'MaxValue') in meths:
+                                meths.remove('Get' + key + 'MaxValue')
+                                meths.remove('Get' + key + 'MinValue')
+                            try:
+                                meths.remove('Get' + key + 'AsString')
+                            except ValueError:
+                                pass
+
+        # Find the values for each of the states, i.e. find that
+        # vtkProperty.SetRepresentationToWireframe() corresponds to
+        # vtkProperty.SetRepresentation(1).
+        if sm:
+            obj = self._get_instance(klass)
+            if obj:
+                for key, values in sm.items():
+                    default = getattr(obj, 'Get%s'%key)()
+                    for x in values[:]:
+                        try:
+                            getattr(obj, 'Set%sTo%s'%(key, x[0]))()
+                        except:
+                            continue
+                        val = getattr(obj, 'Get%s'%key)()
+                        x[1] = val
+                        if val == default:
+                            values.insert(0, [x[0], val])
+        return meths
+
+    def _find_get_set_methods(self, klass, methods):
+        """Find/store methods of the form {Get,Set}Prop in the given
+        `methods` and returns the remaining list of methods.
+
+        Note that it makes sense to call this *after*
+        `_find_state_methods` is called in order to avoid incorrect
+        duplication.  This method also computes the default value and
+        the ranges of the arguments (when possible) by using the
+        Get<Prop>{MaxValue,MinValue} methods.
+
+        """
+        meths = methods[:]
+        gsm = self.get_set_meths
+        
+        for method in meths[:]:
+            # Methods of the Set/Get form.
+            if method in ['Get', 'Set']:
+                # This occurs with the vtkInformation class.
+                continue
+            elif (method[:3] == 'Set') and ('Get' + method[3:]) in methods:
+                key = method[3:]
+                meths.remove('Set' + key)
+                meths.remove('Get' + key)                    
+                if ('Get' + key + 'MaxValue') in meths:
+                    meths.remove('Get' + key + 'MaxValue')
+                    meths.remove('Get' + key + 'MinValue')
+                    gsm[key] = 1
+                else:
+                    gsm[key] = None
+
+        # Find the default and range of the values.
+        if gsm:
+            obj = self._get_instance(klass)
+            if obj:
+                klass_name = klass.__name__
+                for key, value in gsm.items():
+                    if klass_name == 'vtkPolyData':
+                        # Evil hack, this class segfaults!
+                        default = None
+                    else:
+                        try:
+                            default = getattr(obj, 'Get%s'%key)()
+                        except TypeError:
+                            default = None
+                    if value:
+                        low = getattr(obj, 'Get%sMinValue'%key)()
+                        high = getattr(obj, 'Get%sMaxValue'%key)()
+                        gsm[key] = (default, (low, high))
+                    else:
+                        gsm[key] = (default, None)
+            else:
+                # We still might have methods that have a default range.
+                for key, value in gsm.items():
+                    if value == 1:
+                        gsm[key] = None
+        
+        return meths
+
+    def _find_get_methods(self, klass, methods):
+        """Find/store methods of the form Get<Value> in the given
+        `methods` and returns the remaining list of methods.
+
+        """
+        meths = methods[:]
+        gm = self.get_meths
+        for method in meths[:]:
+            if method == 'Get':
+                # Occurs with vtkInformation
+                continue
+            elif method[:3] == 'Get':        
+                gm.append(method)
+                meths.remove(method)
+        return meths
+
+    def _get_instance(self, klass):
+        """Given a VTK class, `klass`, returns an instance of the
+        class.
+
+        If the class is abstract, it uses the class tree to return an
+        instantiable subclass.  This is necessary to get the values of
+        the 'state' methods and the ranges for the Get/Set methods.
+        
+        """
+        obj = None
+        try:
+            obj = klass()
+        except TypeError:
+            if self._tree:
+                t = self._tree
+                n = t.get_node(klass.__name__)
+# Wendel
+                if n == None:
+                    return False
+                for c in n.children:
+                    obj = self._get_instance(t.get_class(c.name))
+                    if obj:
+                        break
+        return obj
+
diff --git a/contrib/titan/vtkcell.py b/contrib/titan/vtkcell.py
new file mode 100644
index 0000000..429c77a
--- /dev/null
+++ b/contrib/titan/vtkcell.py
@@ -0,0 +1,1094 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# File QVTKWidget.py
+# File for displaying a vtkRenderWindow in a Qt's QWidget ported from
+# VTK/GUISupport/QVTK. Combine altogether to a single class: QVTKWidget
+################################################################################
+import vtk
+from PyQt4 import QtCore, QtGui
+import sip
+from core import system
+from core.modules.module_registry import get_module_registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import vtkcell_rc
+import gc
+from gui.qt import qt_super
+import core.db.action
+from core.vistrail.action import Action
+from core.vistrail.port import Port
+from core.vistrail import module
+from core.vistrail import connection
+from core.vistrail.module_function import ModuleFunction
+from core.vistrail.module_param import ModuleParam
+from core.vistrail.location import Location
+from core.modules.vistrails_module import ModuleError
+import copy
+
+################################################################################
+
+class VTKCell(SpreadsheetCell):
+    """
+    VTKCell is a VisTrails Module that can display vtkRenderWindow inside a cell
+    
+    """
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        renderers = self.forceGetInputListFromPort('AddRenderer')
+        renderViews = self.forceGetInputListFromPort('SetRenderView')
+        if len(renderViews)>1:
+            raise ModuleError(self, 'There can only be one vtkRenderView '
+                              'per cell')
+        if len(renderViews)==1 and len(renderers)>0:
+            raise ModuleError(self, 'Cannot set both vtkRenderView '
+                              'and vtkRenderer to a cell')
+        renderView = self.forceGetInputFromPort('SetRenderView')
+        iHandlers = self.forceGetInputListFromPort('InteractionHandler')
+        iStyle = self.forceGetInputFromPort('InteractorStyle')
+        picker = self.forceGetInputFromPort('AddPicker')
+        self.cellWidget = self.displayAndWait(QVTKWidget, (renderers, renderView, iHandlers, iStyle, picker))
+
+AsciiToKeySymTable = ( None, None, None, None, None, None, None,
+                       None, None,
+                       "Tab", None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None,
+                       "space", "exclam", "quotedbl", "numbersign",
+                       "dollar", "percent", "ampersand", "quoteright",
+                       "parenleft", "parenright", "asterisk", "plus",
+                       "comma", "minus", "period", "slash",
+                       "0", "1", "2", "3", "4", "5", "6", "7",
+                       "8", "9", "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",
+                       "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+                       "h", "i", "j", "k", "l", "m", "n", "o",
+                       "p", "q", "r", "s", "t", "u", "v", "w",
+                       "x", "y", "z", "braceleft", "bar", "braceright",
+                       "asciitilde", "Delete",
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None)
+
+class QVTKWidget(QCellWidget):
+    """
+    QVTKWidget is the actual rendering widget that can display
+    vtkRenderer inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVTKWidget(parent: QWidget, f: WindowFlags) -> QVTKWidget
+        Initialize QVTKWidget with a toolbar with its own device
+        context
+        
+        """
+        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+
+        self.interacting = None
+        self.mRenWin = None
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.toolBarType = QVTKWidgetToolBar
+        self.iHandlers = []
+        self.setAnimationEnabled(True)
+        self.renderer_maps = {}
+        
+    def removeObserversFromInteractorStyle(self):
+        """ removeObserversFromInteractorStyle() -> None        
+        Remove all python binding from interactor style observers for
+        safely freeing the cell
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.RemoveObservers("InteractionEvent")
+            style.RemoveObservers("EndPickEvent")
+            style.RemoveObservers("CharEvent")
+            style.RemoveObservers("MouseWheelForwardEvent")
+            style.RemoveObservers("MouseWheelBackwardEvent")
+        
+    def addObserversToInteractorStyle(self):
+        """ addObserversToInteractorStyle() -> None        
+        Assign observer to the current interactor style
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.AddObserver("InteractionEvent", self.interactionEvent)
+            style.AddObserver("EndPickEvent", self.interactionEvent)
+            style.AddObserver("CharEvent", self.charEvent)
+            style.AddObserver("MouseWheelForwardEvent", self.interactionEvent)
+            style.AddObserver("MouseWheelBackwardEvent", self.interactionEvent)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        
+        """
+        self.renderer_maps = {}
+        for ren in self.getRendererList():
+            self.mRenWin.RemoveRenderer(ren)
+            
+        self.removeObserversFromInteractorStyle()
+        
+        self.updateContents(([], None, [], None, None))
+        
+        self.SetRenderWindow(None)
+
+        QCellWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Updates the cell contents with new vtkRenderer
+        
+        """
+        renWin = self.GetRenderWindow()
+        for iHandler in self.iHandlers:
+            if iHandler.observer:
+                iHandler.observer.vtkInstance.SetInteractor(None)
+            iHandler.clear()
+
+        # Remove old renderers first
+        oldRenderers = self.getRendererList()
+        for renderer in oldRenderers:
+            renWin.RemoveRenderer(renderer)
+            renderer.SetRenderWindow(None)
+        del oldRenderers
+
+        (renderers, renderView, self.iHandlers, iStyle, picker) = inputPorts
+        if renderView:
+            renderView.vtkInstance.SetupRenderWindow(renWin)
+            renderers = [renderView.vtkInstance.GetRenderer()]
+        self.renderer_maps = {}
+        for renderer in renderers:
+            if renderView==None:
+                vtkInstance = renderer.vtkInstance
+                renWin.AddRenderer(vtkInstance)
+                self.renderer_maps[vtkInstance] = renderer.moduleInfo['moduleId']
+            else:
+                vtkInstance = renderer
+            if hasattr(vtkInstance, 'IsActiveCameraCreated'):
+                if not vtkInstance.IsActiveCameraCreated():
+                    vtkInstance.ResetCamera()
+                else:
+                    vtkInstance.ResetCameraClippingRange()
+            
+        iren = renWin.GetInteractor()
+        if picker:
+            iren.SetPicker(picker.vtkInstance)
+            
+        # Update interactor style
+        self.removeObserversFromInteractorStyle()
+        if renderView==None:
+            if iStyle==None:
+                iStyleInstance = vtk.vtkInteractorStyleTrackballCamera()
+            else:
+                iStyleInstance = iStyle.vtkInstance
+            iren.SetInteractorStyle(iStyleInstance)
+        self.addObserversToInteractorStyle()
+        
+        for iHandler in self.iHandlers:
+            if iHandler.observer:
+                iHandler.observer.vtkInstance.SetInteractor(iren)
+        renWin.Render()
+
+        # Capture window into history for playback
+        # Call this at the end to capture the image after rendering
+        QCellWidget.updateContents(self, inputPorts)
+
+    def GetRenderWindow(self):
+        """ GetRenderWindow() -> vtkRenderWindow
+        Return the associated vtkRenderWindow
+        
+        """
+        if not self.mRenWin:
+            win = vtk.vtkRenderWindow()
+            win.DoubleBufferOn()
+            self.SetRenderWindow(win)
+            del win
+
+        return self.mRenWin
+
+    def SetRenderWindow(self,w):
+        """ SetRenderWindow(w: vtkRenderWindow)        
+        Set a new render window to QVTKWidget and initialize the
+        interactor as well
+        
+        """
+        if w == self.mRenWin:
+            return
+        
+        if self.mRenWin:
+            if system.systemType!='Linux':
+                self.mRenWin.SetInteractor(None)
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+            
+        self.mRenWin = w
+        
+        if self.mRenWin:
+            self.mRenWin.Register(None)
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+            if system.systemType=='Linux':
+                try:
+                    vp = '_%s_void_p' % (hex(int(QtGui.QX11Info.display()))[2:])
+                except TypeError:
+                    #This was change for PyQt4.2
+                    if isinstance(QtGui.QX11Info.display(),QtGui.Display):
+                        display = sip.unwrapinstance(QtGui.QX11Info.display())
+                        vp = '_%s_void_p' % (hex(display)[2:])
+                self.mRenWin.SetDisplayId(vp)
+                self.resizeWindow(1,1)
+            self.mRenWin.SetWindowInfo(str(int(self.winId())))
+            if self.isVisible():
+                self.mRenWin.Start()
+
+            if not self.mRenWin.GetInteractor():
+                iren = vtk.vtkRenderWindowInteractor()
+                if system.systemType=='Darwin':
+                    iren.InstallMessageProcOff()
+                iren.SetRenderWindow(self.mRenWin)
+                iren.Initialize()
+                if system.systemType=='Linux':
+                    system.XDestroyWindow(self.mRenWin.GetGenericDisplayId(),
+                                          self.mRenWin.GetGenericWindowId())
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                self.resizeWindow(self.width(), self.height())
+                self.mRenWin.SetPosition(self.x(), self.y())
+
+    def GetInteractor(self):
+        """ GetInteractor() -> vtkInteractor
+        Return the vtkInteractor control this QVTKWidget
+        """
+        return self.GetRenderWindow().GetInteractor()
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Process window and interaction events
+        
+        """
+        if e.type()==QtCore.QEvent.ParentAboutToChange:
+            if self.mRenWin:
+                if self.mRenWin.GetMapped():
+                    self.mRenWin.Finalize()
+        else:
+            if e.type()==QtCore.QEvent.ParentChange:
+                if self.mRenWin:
+                    self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                    if self.isVisible():
+                        self.mRenWin.Start()
+        
+        if QtCore.QObject.event(self,e):
+            return 1
+
+        if e.type() == QtCore.QEvent.KeyPress:
+            self.keyPressEvent(e)
+            if e.isAccepted():
+                return e.isAccepted()
+
+        return qt_super(QVTKWidget, self).event(e)
+        
+        # return QtGui.QWidget.event(self,e)
+        # Was this right? Wasn't this supposed to be QCellWidget.event()?
+
+    def resizeWindow(self, width, height):
+        """ resizeWindow(width: int, height: int) -> None
+        Work around vtk bugs for resizing window
+        
+        """
+        ########################################################
+        # VTK - BUGGGGGGGGG - GRRRRRRRRR
+        # This is a 'bug' in vtkWin32OpenGLRenderWindow(.cxx)
+        # If a render window is mapped to screen, the actual
+        # window size is the client area of the window in Win32.
+        # However, this real window size is only updated through
+        # vtkWin32OpenGLRenderWindow::GetSize(). So this has to
+        # be called here to get the cell size correctly. This
+        # invalidates the condition in the next SetSize().
+        # We can use self.mRenWin.SetSize(0,0) here but it will
+        # cause flickering and decrease performance!
+        # SetPosition(curX,curY) also works here but slower.
+        self.mRenWin.GetSize()
+        
+        self.mRenWin.SetSize(width, height)
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().SetSize(width, height)
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the vtkRenderWindow size then QVTKWidget resized
+        
+        """
+        qt_super(QVTKWidget, self).resizeEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.resizeWindow(self.width(), self.height())
+        self.mRenWin.Render()
+
+    def moveEvent(self,e):
+        """ moveEvent(e: QEvent) -> None
+        Echo the move event into vtkRenderWindow
+        
+        """
+        qt_super(QVTKWidget, self).moveEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.mRenWin.SetPosition(self.x(),self.y())
+
+    def paintEvent(self, e):
+        """ paintEvent(e: QPaintEvent) -> None
+        Paint the QVTKWidget with vtkRenderWindow
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        if hasattr(self.mRenWin, 'UpdateGLRegion'):
+            self.mRenWin.UpdateGLRegion()
+        self.mRenWin.Render()
+
+    def SelectActiveRenderer(self,iren):
+        """ SelectActiveRenderer(iren: vtkRenderWindowIteractor) -> None
+        Only make the vtkRenderer below the mouse cursor active
+        
+        """
+        epos = iren.GetEventPosition()
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            ren.SetInteractive(ren.IsInViewport(epos[0], epos[1]))
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        isDoubleClick = e.type()==QtCore.QEvent.MouseButtonDblClick
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      ctrl,
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),
+                                      isDoubleClick,
+                                      None)
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonPressEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonPressEvent",
+                  QtCore.Qt.RightButton:"RightButtonPressEvent"}
+
+        self.SelectActiveRenderer(iren)
+
+        if ctrl:
+            e.ignore()
+            return
+
+        self.interacting = self.getActiveRenderer(iren)
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0), 0, None)
+
+        iren.InvokeEvent("MouseMoveEvent")
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("EnterEvent")
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("LeaveEvent")
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonReleaseEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonReleaseEvent",
+                  QtCore.Qt.RightButton:"RightButtonReleaseEvent"}
+
+        self.interacting = None
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def keyPressEvent(self,e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q', 'e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl,shift,ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyPressEvent")
+
+        if ascii_key:
+            iren.InvokeEvent("CharEvent")
+
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q','e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl, shift, ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyReleaseEvent")
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+        
+        self.SelectActiveRenderer(iren)
+        
+        if e.delta()>0:
+            iren.InvokeEvent("MouseWheelForwardEvent")
+        else:
+            iren.InvokeEvent("MouseWheelBackwardEvent")
+
+    def focusInEvent(self,e):
+        """ focusInEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def focusOutEvent(self,e):
+        """ focusOutEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def contextMenuEvent(self,e):
+        """ contextMenuEvent(e: QContextMenuEvent) -> None        
+        Make sure to get the right mouse position for the context menu
+        event, i.e. also the right click
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = int(e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = int(e.modifiers()&QtCore.Qt.ShiftModifier)
+        iren.SetEventInformationFlipY(e.x(),e.y(),ctrl,shift,chr(0),0,None)
+        iren.InvokeEvent("ContextMenuEvent")
+
+    def ascii_to_key_sym(self,i):
+        """ ascii_to_key_sym(i: int) -> str
+        Convert ASCII code into key name
+        
+        """
+        global AsciiToKeySymTable
+        return AsciiToKeySymTable[i]
+
+    def qt_key_to_key_sym(self,i):
+        """ qt_key_to_key_sym(i: QtCore.Qt.Keycode) -> str
+        Convert Qt key code into key name
+        
+        """
+        handler = {QtCore.Qt.Key_Backspace:"BackSpace",
+                   QtCore.Qt.Key_Tab:"Tab",
+                   QtCore.Qt.Key_Backtab:"Tab",
+                   QtCore.Qt.Key_Return:"Return",
+                   QtCore.Qt.Key_Enter:"Return",
+                   QtCore.Qt.Key_Shift:"Shift_L",
+                   QtCore.Qt.Key_Control:"Control_L",
+                   QtCore.Qt.Key_Alt:"Alt_L",
+                   QtCore.Qt.Key_Pause:"Pause",
+                   QtCore.Qt.Key_CapsLock:"Caps_Lock",
+                   QtCore.Qt.Key_Escape:"Escape",
+                   QtCore.Qt.Key_Space:"space",
+                   QtCore.Qt.Key_End:"End",
+                   QtCore.Qt.Key_Home:"Home",
+                   QtCore.Qt.Key_Left:"Left",
+                   QtCore.Qt.Key_Up:"Up",
+                   QtCore.Qt.Key_Right:"Right",
+                   QtCore.Qt.Key_Down:"Down",
+                   QtCore.Qt.Key_SysReq:"Snapshot",
+                   QtCore.Qt.Key_Insert:"Insert",
+                   QtCore.Qt.Key_Delete:"Delete",
+                   QtCore.Qt.Key_Help:"Help",
+                   QtCore.Qt.Key_0:"0",
+                   QtCore.Qt.Key_1:"1",
+                   QtCore.Qt.Key_2:"2",
+                   QtCore.Qt.Key_3:"3",
+                   QtCore.Qt.Key_4:"4",
+                   QtCore.Qt.Key_5:"5",
+                   QtCore.Qt.Key_6:"6",
+                   QtCore.Qt.Key_7:"7",
+                   QtCore.Qt.Key_8:"8",
+                   QtCore.Qt.Key_9:"9",
+                   QtCore.Qt.Key_A:"a",
+                   QtCore.Qt.Key_B:"b",
+                   QtCore.Qt.Key_C:"c",
+                   QtCore.Qt.Key_D:"d",
+                   QtCore.Qt.Key_E:"e",
+                   QtCore.Qt.Key_F:"f",
+                   QtCore.Qt.Key_G:"g",
+                   QtCore.Qt.Key_H:"h",
+                   QtCore.Qt.Key_I:"i",
+                   QtCore.Qt.Key_J:"h",
+                   QtCore.Qt.Key_K:"k",
+                   QtCore.Qt.Key_L:"l",
+                   QtCore.Qt.Key_M:"m",
+                   QtCore.Qt.Key_N:"n",
+                   QtCore.Qt.Key_O:"o",
+                   QtCore.Qt.Key_P:"p",
+                   QtCore.Qt.Key_Q:"q",
+                   QtCore.Qt.Key_R:"r",
+                   QtCore.Qt.Key_S:"s",
+                   QtCore.Qt.Key_T:"t",
+                   QtCore.Qt.Key_U:"u",
+                   QtCore.Qt.Key_V:"v",
+                   QtCore.Qt.Key_W:"w",
+                   QtCore.Qt.Key_X:"x",
+                   QtCore.Qt.Key_Y:"y",
+                   QtCore.Qt.Key_Z:"z",
+                   QtCore.Qt.Key_Asterisk:"asterisk",
+                   QtCore.Qt.Key_Plus:"plus",
+                   QtCore.Qt.Key_Minus:"minus",
+                   QtCore.Qt.Key_Period:"period",
+                   QtCore.Qt.Key_Slash:"slash",
+                   QtCore.Qt.Key_F1:"F1",
+                   QtCore.Qt.Key_F2:"F2",
+                   QtCore.Qt.Key_F3:"F3",
+                   QtCore.Qt.Key_F4:"F4",
+                   QtCore.Qt.Key_F5:"F5",
+                   QtCore.Qt.Key_F6:"F6",
+                   QtCore.Qt.Key_F7:"F7",
+                   QtCore.Qt.Key_F8:"F8",
+                   QtCore.Qt.Key_F9:"F9",
+                   QtCore.Qt.Key_F10:"F10",
+                   QtCore.Qt.Key_F11:"F11",
+                   QtCore.Qt.Key_F12:"F12",
+                   QtCore.Qt.Key_F13:"F13",
+                   QtCore.Qt.Key_F14:"F14",
+                   QtCore.Qt.Key_F15:"F15",
+                   QtCore.Qt.Key_F16:"F16",
+                   QtCore.Qt.Key_F17:"F17",
+                   QtCore.Qt.Key_F18:"F18",
+                   QtCore.Qt.Key_F19:"F19",
+                   QtCore.Qt.Key_F20:"F20",
+                   QtCore.Qt.Key_F21:"F21",
+                   QtCore.Qt.Key_F22:"F22",
+                   QtCore.Qt.Key_F23:"F23",
+                   QtCore.Qt.Key_F24:"F24",
+                   QtCore.Qt.Key_NumLock:"Num_Lock",
+                   QtCore.Qt.Key_ScrollLock:"Scroll_Lock"}
+        if i in handler:            
+            return handler[i]
+        else:
+            return "None"
+
+    def getRendererList(self):
+        """ getRendererList() -> list
+        Return a list of vtkRenderer running in this QVTKWidget
+        """
+        result = []
+        renWin = self.GetRenderWindow()
+        renderers = renWin.GetRenderers()
+        renderers.InitTraversal()
+        for i in xrange(renderers.GetNumberOfItems()):
+            result.append(renderers.GetNextItem())
+        return result
+
+    def getActiveRenderer(self, iren):
+        """ getActiveRenderer(iren: vtkRenderWindowwInteractor) -> vtkRenderer
+        Return the active vtkRenderer under mouse
+        
+        """
+        epos = list(iren.GetEventPosition())
+        if epos[1]<0:
+            epos[1] = -epos[1]
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            if ren.IsInViewport(epos[0], epos[1]):
+                return ren
+        return None
+
+    def findSheetTabWidget(self):
+        """ findSheetTabWidget() -> QTabWidget
+        Find and return the sheet tab widget
+        
+        """
+        p = self.parent()
+        while p:
+            if hasattr(p, 'isSheetTabWidget'):
+                if p.isSheetTabWidget()==True:
+                    return p
+            p = p.parent()
+        return None
+
+    def getRenderersInCellList(self, sheet, cells):
+        """ isRendererIn(sheet: spreadsheet.StandardWidgetSheet,
+                         cells: [(int,int)]) -> bool
+        Get the list of renderers in side a list of (row, column)
+        cells.
+        
+        """
+        rens = []
+        for (row, col) in cells:
+            cell = sheet.getCell(row, col)
+            if hasattr(cell, 'getRendererList'):
+                rens += cell.getRendererList()
+        return rens
+
+    def getSelectedCellWidgets(self):
+        sheet = self.findSheetTabWidget()
+        if sheet:
+            iren = self.mRenWin.GetInteractor()
+            ren = self.interacting
+            if not ren: ren = self.getActiveRenderer(iren)
+            if ren:
+                cells = sheet.getSelectedLocations()
+                if (ren in self.getRenderersInCellList(sheet, cells)):
+                    return [sheet.getCell(row, col)
+                            for (row, col) in cells
+                            if hasattr(sheet.getCell(row, col), 
+                                       'getRendererList')]
+        return []
+
+    def interactionEvent(self, istyle, name):
+        """ interactionEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure interactions sync across selected renderers
+        
+        """
+        if name=='MouseWheelForwardEvent':
+            istyle.OnMouseWheelForward()
+        if name=='MouseWheelBackwardEvent':
+            istyle.OnMouseWheelBackward()
+        ren = self.interacting
+        if not ren:
+            ren = self.getActiveRenderer(istyle.GetInteractor())
+        if ren:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            for cell in self.getSelectedCellWidgets():
+                if cell!=self and hasattr(cell, 'getRendererList'): 
+                    rens = cell.getRendererList()
+                    for r in rens:
+                        if r!=ren:
+                            dcam = r.GetActiveCamera()
+                            dcam.SetPosition(cpos)
+                            dcam.SetFocalPoint(cfol)
+                            dcam.SetViewUp(cup)
+                            r.ResetCameraClippingRange()
+                    cell.update()
+
+    def charEvent(self, istyle, name):
+        """ charEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure key presses also sync across selected renderers
+
+        """
+        iren = istyle.GetInteractor()
+        ren = self.interacting
+        if not ren: ren = self.getActiveRenderer(iren)
+        if ren:
+            keyCode = iren.GetKeyCode()
+            if keyCode in ['w','W','s','S','r','R','p','P']:
+                for cell in self.getSelectedCellWidgets():
+                    if hasattr(cell, 'GetInteractor'):
+                        selectedIren = cell.GetInteractor()
+                        selectedIren.SetKeyCode(keyCode)
+                        selectedIren.GetInteractorStyle().OnChar()
+                        selectedIren.Render()
+            istyle.OnChar()
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+        
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+        
+        """
+        w2i = vtk.vtkWindowToImageFilter()
+        w2i.ReadFrontBufferOff()
+        w2i.SetInput(self.mRenWin)
+        # Render twice to get a clean image on the back buffer
+        self.mRenWin.Render()
+        self.mRenWin.Render()
+        w2i.Update()
+        writer = vtk.vtkPNGWriter()
+        writer.SetInputConnection(w2i.GetOutputPort())
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def captureWindow(self):
+        """ captureWindow() -> None        
+        Capture the window contents to file
+        
+        """
+        fn = QtGui.QFileDialog.getSaveFileName(None,
+                                               "Save file as...",
+                                               "screenshot.png",
+                                               "Images (*.png)")
+        if fn.isNull():
+            return
+        self.saveToPNG(str(fn))
+        
+    def grabWindowPixmap(self):
+        """ grabWindowImage() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        uchar = self.saveToPNG(None)
+
+        ba = QtCore.QByteArray()
+        buf = QtCore.QBuffer(ba)
+        buf.open(QtCore.QIODevice.WriteOnly)
+        for i in xrange(uchar.GetNumberOfTuples()):
+            c = uchar.GetValue(i)
+            buf.putChar(chr(c))
+        buf.close()
+        
+        pixmap = QtGui.QPixmap()
+        pixmap.loadFromData(ba, 'PNG')
+        return pixmap
+
+    def dumpToFile(self, filename):
+        """dumpToFile() -> None
+        Dumps itself as an image to a file, calling saveToPNG
+        """
+        self.saveToPNG(filename)
+
+class QVTKWidgetCapture(QtGui.QAction):
+    """
+    QVTKWidgetCapture is the action to capture the vtk rendering
+    window to an image
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKWidgetCapture(parent: QWidget) -> QVTKWidgetCapture
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera.png"),
+                               "&Capture image to file",
+                               parent)
+        self.setStatusTip("Capture the rendered image to a file")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.captureWindow()
+
+class QVTKWidgetSaveCamera(QtGui.QAction):
+    """
+    QVTKWidgetSaveCamera is the action to capture the current camera
+    of the vtk renderers and save it back to the pipeline
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKWidgetSaveCamera(parent: QWidget) -> QVTKWidgetSaveCamera
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               "Save &Camera",
+                               parent)
+        self.setStatusTip("Save current camera views to the pipeline")
+
+    def setCamera(self, controller):
+        ops = []
+        pipeline = controller.current_pipeline                        
+        cellWidget = self.toolBar.getSnappedWidget()
+        renderers = cellWidget.getRendererList()
+        for ren in renderers:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            rendererId = cellWidget.renderer_maps[ren]
+            # Looking for SetActiveCamera()
+            camera = None
+            renderer = pipeline.modules[rendererId]
+            for c in pipeline.connections.values():
+                if c.destination.moduleId==rendererId:
+                    if c.destination.name=='SetActiveCamera':
+                        camera = pipeline.modules[c.source.moduleId]
+                        break
+            
+            if not camera:
+                # Create camera
+                vtk_package = 'edu.utah.sci.vistrails.vtk'
+                camera = controller.create_module(vtk_package, 'vtkCamera', '',
+                                                  0.0, 0.0)
+                ops.append(('add', camera))
+
+                # Connect camera to renderer
+                camera_conn = controller.create_connection(camera, 'self',
+                                                           renderer, 
+                                                           'SetActiveCamera')
+                ops.append(('add', camera_conn))
+            # update functions
+            def convert_to_str(arglist):
+                new_arglist = []
+                for arg in arglist:
+                    new_arglist.append(str(arg))
+                return new_arglist
+            functions = [('SetPosition', convert_to_str(cpos)),
+                         ('SetFocalPoint', convert_to_str(cfol)),
+                         ('SetViewUp', convert_to_str(cup))]
+            ops.extend(controller.update_functions_ops(camera, functions))
+
+        action = core.db.action.create_action(ops)
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        controller.select_latest_version()
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        visApp = QtCore.QCoreApplication.instance()
+        if hasattr(visApp, 'builderWindow'):
+            builderWindow = visApp.builderWindow
+            if builderWindow:
+                info = self.toolBar.sheet.getCellPipelineInfo(
+                    self.toolBar.row, self.toolBar.col)
+                if info:
+                    info = info[0]
+                    viewManager = builderWindow.viewManager
+                    view = viewManager.ensureVistrail(info['locator'])
+                    if view:
+                        controller = view.controller
+                        controller.change_selected_version(info['version'])
+                        self.setCamera(controller)
+                        
+                
+class QVTKWidgetToolBar(QCellToolBar):
+    """
+    QVTKWidgetToolBar derives from QCellToolBar to give the VTKCell
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(QVTKWidgetCapture(self))
+        self.addAnimationButtons()
+        self.appendAction(QVTKWidgetSaveCamera(self))
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    identifier = 'edu.utah.sci.vistrails.vtk'
+    registry = get_module_registry()
+    registry.add_module(VTKCell)
+    registry.add_input_port(VTKCell, "Location", CellLocation)
+    import core.debug
+    for (port,module) in [("AddRenderer",'vtkRenderer'),
+                          ("SetRenderView",'vtkRenderView'),
+                          ("InteractionHandler",'vtkInteractionHandler'),
+                          ("InteractorStyle", 'vtkInteractorStyle'),
+                          ("AddPicker",'vtkAbstractPicker')]:
+        try:
+            registry.add_input_port(VTKCell, port,'(%s:%s)'%(identifier,module))
+ 
+        except Exception, e:
+            core.debug.warning(str(e))
+
+    registry.add_output_port(VTKCell, "self", VTKCell)
diff --git a/contrib/titan/vtkcell_rc.py b/contrib/titan/vtkcell_rc.py
new file mode 100644
index 0000000..8aa8cbf
--- /dev/null
+++ b/contrib/titan/vtkcell_rc.py
@@ -0,0 +1,793 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+# Resource object code
+#
+# Created: Fri Sep 22 09:09:40 2006
+#      by: The Resource Compiler for PyQt (Qt v4.1.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = "\
+\x00\x00\x09\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x08\xd6\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x32\x60\x64\x64\x64\xc0\x00\x6c\x82\x0c\x0c\
+\xdc\xca\x0c\x0c\x3c\x40\x2c\x62\xc3\xc0\xc0\xc4\x0e\x14\x04\xea\
+\x63\x64\xb0\x61\xf8\xf5\x6f\x15\xc3\x9f\xbf\x07\x19\x38\x59\x4b\
+\x81\x82\x4f\x30\xf4\xfe\x7a\x0f\x14\x5d\xc3\xc0\xf0\xfe\x0c\x5c\
+\x08\xd9\x4e\x80\x00\x62\xc4\xeb\x00\x4e\x29\x06\x06\x09\x0f\x06\
+\x06\x3e\x1d\x06\x06\x56\x3e\xa0\x24\x13\x03\xc3\xbf\x3f\x10\xcb\
+\xc1\x86\xff\x6d\xd0\x31\x94\xaa\xe7\xe5\x65\x67\x38\xbe\xef\xee\
+\x43\x06\x56\xa6\x0e\x06\x56\xe6\x39\x40\x99\x3f\x08\x03\x99\x40\
+\x04\x03\xc3\xdb\x63\x0c\x0c\x8f\x57\x01\x65\xbe\xa0\x38\x00\x20\
+\x80\x98\x18\x70\x01\x61\x2b\x06\x06\xad\x7a\x06\x06\x51\x07\x88\
+\xe5\xff\xff\x02\x2d\xff\x8d\xb0\x1c\x04\x7e\xff\x63\x94\x93\xe5\
+\x67\x58\x36\xc5\x83\xa1\xaa\xc1\x4d\x5e\x44\x9c\x7f\x3a\xc3\xd7\
+\x5f\x47\x18\xfe\xfd\x77\x41\x78\xf7\x1f\x44\x2f\xc8\x1c\x9d\x66\
+\x06\x06\x29\x5f\x14\x6b\x00\x02\x08\xbb\x03\x84\xcc\x18\x18\x94\
+\x33\x20\x2e\xff\xfb\x1d\x62\x00\x36\xc0\xc8\xf0\xfd\xfb\xf7\xbf\
+\x0c\x0f\x3e\x33\x30\x58\xb9\xaa\x32\xf4\x4d\x0e\x61\xf0\x08\x33\
+\x33\x67\x62\x66\xde\xcd\xf0\xe3\xd7\x22\xa0\x0a\x65\xb8\x5a\x90\
+\x39\x2c\xbc\x0c\x0c\x32\x61\x28\x46\x00\x04\x10\x0b\x56\x83\x55\
+\xb2\x21\x1a\x10\x80\x19\xe8\x71\x63\x86\xbf\xff\xf4\x81\xbe\x13\
+\x05\xf3\x81\xe1\x01\x8c\x02\xe7\xef\x3f\xff\x31\x3c\x06\x46\xf3\
+\xc3\x77\x0c\x0c\x5c\xec\x6c\x0c\xc1\x09\x66\x0c\x5a\x26\xaa\x0c\
+\xeb\x57\x9c\x8a\xbd\x7f\xe9\xae\x2f\x03\x13\x43\x0f\x03\x2b\xcb\
+\x04\xa0\xfa\xaf\x60\x8f\xfc\xfd\x86\x62\x15\x40\x00\x61\xa6\x01\
+\xad\x6a\xa0\x49\xf2\x0c\x48\x29\x26\x96\xe1\xc7\x9f\x42\x06\x76\
+\x26\x43\x71\x71\x6e\x06\x50\x7c\x83\xd2\x09\x48\x17\xe3\xcf\xdf\
+\x0c\x9a\xc6\x4a\x0c\xd6\x7e\x96\x0c\xcf\x3f\x01\xd3\x26\x23\x24\
+\x82\x38\x39\x80\x72\x40\xbb\x6e\x9e\x7b\xc8\x70\x64\xdb\x29\x86\
+\x17\x77\x5f\x5e\x65\x60\x63\xa9\x63\x60\x61\x5a\x07\x36\xf2\x4c\
+\x1a\xdc\x78\x80\x00\xc2\x74\x80\xd9\x02\xa0\xdf\x7e\x81\x98\xdc\
+\xc0\xd4\x3d\x87\x85\x99\x31\xc2\xc6\x49\x8d\xc1\xc4\x5e\x9d\x81\
+\x5f\x5c\x04\xe8\x77\x56\xa8\xc3\x80\x08\x68\x21\x33\x90\x78\xf1\
+\x81\x91\xe1\xed\x0f\x20\x9b\x11\xe6\x66\x48\xda\xe3\xe6\x04\x3a\
+\x06\xe8\xeb\x07\x67\x2e\x33\x1c\xd8\x76\x81\xe1\xfd\xeb\xaf\x9b\
+\x18\x38\x58\x6b\x80\x0e\xb8\x0c\xb3\x0f\x20\x80\x30\x1d\x60\x32\
+\x0b\x12\x35\x7f\xfe\xae\xe7\xe5\xe3\xf0\xf1\x88\x77\x66\xe0\x57\
+\x92\x63\x78\xf9\x81\x01\x18\xe1\x40\xb7\x21\x29\x07\xb1\x85\x81\
+\x96\xb0\x00\x2d\x7b\xfb\x1d\x12\x02\xc8\x00\x6c\x34\x50\x4c\x0c\
+\x98\x8b\x65\xb8\x7e\x30\x1c\x59\x77\x84\xe1\xe8\xfe\xdb\xef\xff\
+\x5f\xcc\x14\x82\xa9\x01\x08\x20\xec\x69\xe0\xdf\xff\x62\x56\x36\
+\x16\x1f\xd3\x30\x4f\x86\xb7\x3c\x12\x0c\xf7\xef\x00\x7d\x07\xb4\
+\x84\x09\x84\x99\x51\x1d\xf0\x0d\x98\x31\xfe\x01\x83\xfb\xe3\x77\
+\x44\x08\xa0\x24\x1e\x60\x80\xdd\x7d\xc1\xc0\x70\xf6\xfe\x0b\x86\
+\x4f\x0f\x3f\x82\x14\x5d\x45\x96\x07\x08\x20\x6c\x0e\x90\x65\xf8\
+\xfd\xbb\x4c\xc1\xce\x9a\x41\x40\x41\x82\xe1\x27\x30\xcd\x70\x09\
+\x00\xcb\x22\x60\xd9\xf3\xe3\xeb\x1f\x86\xcf\x6f\x3f\x32\xfc\x83\
+\x05\x03\x90\x66\x15\xe4\x60\xe0\x11\xe4\x65\x60\x61\x05\x95\x21\
+\x48\x16\x03\x1d\xca\xc2\xc6\xc0\xf0\xea\xe1\x5b\x86\x9b\xfb\x4e\
+\x32\xbc\xb9\xf3\xe0\x35\x50\x05\xa8\x9c\x98\x86\x6c\x19\x40\x00\
+\x61\x3a\xe0\xef\xbf\x44\x36\x01\x3e\x21\x13\x7b\x6d\x06\x41\x1e\
+\x20\x17\x98\xa0\xd8\x80\xf8\xc6\xd9\xfb\x0c\x27\x37\x1d\x67\xf8\
+\xfc\xf1\x33\x3c\x68\x19\x7e\xfc\x66\xd0\xb5\xd6\x64\x70\x4f\x70\
+\x66\xe0\x01\x3a\x94\x11\x1a\xf7\x1c\xc0\x68\xf9\x08\x4c\x14\xa7\
+\x77\x9f\x67\xb8\x7e\xec\xca\xff\xbf\x3f\x7f\xcd\x65\x60\x63\x05\
+\x16\x02\x0c\x8f\xd0\xad\x03\x08\x20\x4c\x07\xfc\xfa\xe3\xa3\xac\
+\x29\xc5\xa0\xa7\xce\xc6\xf0\x0b\x98\xb0\x58\x81\xbe\x78\x70\xeb\
+\x35\xc3\xbe\x45\xbb\x18\xfe\xfe\xfe\xbb\x18\xe8\x83\x79\x40\x6b\
+\xbe\x83\x5d\xf1\x9f\x21\x95\x99\x85\x21\x59\x1c\x18\x42\x3c\xc0\
+\x10\xe2\x04\x5a\xfc\x1b\x98\x7e\x4f\x1e\xb8\xce\x70\x70\xe3\x59\
+\x86\x4f\x2f\x3f\x1c\x62\x60\x67\xad\x01\x5a\x7e\x18\xb9\xf0\x40\
+\x06\x00\x01\x84\xe9\x80\x3f\xff\x95\x35\x35\x84\x19\xd4\x64\x81\
+\xf1\xfb\x15\x68\x28\x17\x03\xc3\xee\x15\xb7\x18\xfe\x7e\xfd\x75\
+\x0e\x68\x4b\x1c\xaa\x41\x8c\x2e\xac\x40\x13\x64\xc5\x81\x21\x05\
+\x2c\x7c\x2f\x9c\x79\xce\xb0\x7e\xf1\x29\x86\x3b\x97\x9e\x80\x8a\
+\xe5\x66\x06\x4e\xb6\x79\xa8\x45\x27\x88\xf7\x1b\x85\x0b\x10\x40\
+\x98\x0e\xe0\x64\x15\x3a\x73\xf4\x2e\xc3\x8b\x27\x6f\xc0\x86\x82\
+\x12\xdd\xf5\x2b\xc0\x54\xc4\xc9\x76\x1f\x43\xed\x7f\x06\x76\x01\
+\x5e\x16\x06\xe6\x1f\xdf\x18\xe6\x4c\x39\xc5\xb0\x77\xfb\x8d\x1f\
+\xff\x7f\xff\x9d\x02\x34\xa3\x13\x28\xfb\x06\x6b\x02\xff\xfd\x09\
+\x85\x0b\x10\x40\x98\x0e\x60\x65\xea\x7f\x74\xe7\xb5\xc2\xa3\xeb\
+\x2f\x21\x9e\x04\xb9\x9f\x1d\x94\xa2\x98\xd6\xa0\xf9\x05\x28\xce\
+\xf2\xfd\xca\xc5\x67\x0c\x99\x49\xeb\x18\xde\x3c\xf8\xb0\x85\x81\
+\x9b\xb5\x16\x98\xcf\x2f\x30\xe0\x03\xec\x22\x28\x5c\x80\x00\x62\
+\xc1\xe2\xab\x22\x60\x3c\x33\x80\x31\xaa\x38\x26\x60\x61\x9c\xfe\
+\xfc\xf1\x47\x50\xc9\x74\x89\x81\x87\x6d\x03\x03\x31\x00\x54\x39\
+\x21\x01\x80\x00\x62\x62\xa0\x04\xfc\xfd\x2f\x01\x4e\xd9\x2c\x4c\
+\x7b\xc8\x35\x02\x20\x80\x30\x43\x80\x11\x28\xf4\xff\x0f\x21\x7d\
+\x02\xc0\xfa\xa1\x94\x89\x8b\xb5\x40\x48\x88\x93\xeb\xcd\xab\xaf\
+\x86\xc0\x62\x30\x1f\x4d\x8d\x31\x30\xa7\x44\x03\x2b\x2c\x44\xb2\
+\x07\x95\x64\xac\x4c\xc0\x04\xc5\xd0\x09\x13\x02\x08\x20\x4c\x07\
+\x7c\x05\xa6\x35\x2e\x59\xdc\x56\xff\xf9\x17\x03\xcc\xaa\x0d\x6a\
+\xfa\xd2\xca\xb9\x25\x56\x0c\xc7\x8f\x3e\x66\x58\x36\xfd\x84\x20\
+\x03\x37\x1b\x7a\x39\x1c\xc6\xc6\xc1\x5a\x28\xaf\x21\x06\x6f\xe8\
+\x7c\xfa\xf4\x03\x98\xb8\x3f\x32\x20\x3b\x00\x20\x80\x30\x1d\xc0\
+\xc2\xc3\x80\xa3\x78\x36\x07\x16\x3c\x2d\xfc\xe2\x7c\x2e\x3e\xe1\
+\xc6\x0c\xae\xde\x5a\x0c\x42\xc2\x8c\x0c\x3b\x76\x3e\x04\xa7\x6d\
+\x0c\xf5\x3f\xfe\xc8\xab\xe8\xc9\x30\xd4\x76\x7a\x03\x0b\x56\x48\
+\xe1\xb4\x77\xdb\x6d\x86\x99\x6d\xbb\xbe\x22\x2b\x03\x08\x20\x16\
+\xac\xa9\x14\xb5\x01\x22\xc5\xf0\xf3\x77\x15\x33\x3b\x6b\xba\xb1\
+\xa7\x01\x8b\x4b\x90\x11\x83\xa8\x38\x17\xc3\x33\x60\xe5\xf4\x1e\
+\x58\x50\xfd\xf8\x09\x2e\x12\x80\x4d\x26\x06\x79\xb8\x99\xff\xfe\
+\xf9\x03\x71\x90\xa6\xa9\x2a\x58\xdd\x4f\xa0\x3a\x0e\x60\x79\x72\
+\xf3\x0e\xc8\xf7\xff\x5f\x22\x1b\x0e\x10\x40\x58\x72\xc1\x5f\x84\
+\xdc\x9f\xbf\xe9\x40\x83\x6a\xa4\x35\xe5\x25\x2c\x7d\xcd\x18\xe4\
+\xd5\xc4\x18\xbe\x02\x7d\xf3\xf1\x31\x24\x53\xf0\x02\x03\xeb\xc7\
+\x0f\x60\xaa\xfe\xf3\x3b\x90\xe1\x37\x93\x37\xd4\x00\x66\x16\x36\
+\x36\x36\x3d\x5f\x63\x06\x69\x3d\x35\x86\xfb\xcf\x20\x65\xd6\x9f\
+\xb7\xc0\xac\x72\xee\x31\x28\x0d\x1c\x41\xb6\x0e\x20\x80\x70\xd5\
+\x86\x2e\xc0\x70\x6b\xe5\x12\x15\x32\xd3\xb0\x37\x65\x50\x32\x54\
+\x05\xa7\x9f\x7b\x4f\x51\x73\x25\x37\x30\x30\xc5\x35\xd5\x19\x8c\
+\x79\xc4\x99\x99\x58\x98\x38\x41\xc5\x33\x13\x30\xae\xf9\x44\x05\
+\x19\x04\x25\xf8\x18\x9e\x00\xab\x9f\x7f\x40\xf7\xb1\x02\xeb\x92\
+\xfb\x97\x1e\x33\xbc\x7b\x08\x4c\x7f\xac\x2c\x73\x91\xad\x02\x08\
+\x20\x16\x2c\x96\xcf\xe6\x15\xe0\x4c\xe1\x53\x33\x61\x90\x34\xd0\
+\x65\xe0\xe6\x63\x63\x78\xf6\x16\x5a\xb7\x33\xa0\x56\xc5\xbc\xc0\
+\x74\xc7\xc5\x2d\xc8\xc0\xa1\x28\xc8\x80\x5c\x6a\x7c\x07\x5a\xfa\
+\xe5\x15\xa8\x5e\x83\xd4\xa2\x7c\xc0\x86\xc4\xcd\xbd\x47\x40\x21\
+\x01\x6c\x9f\x33\x1c\x42\x36\x07\x20\x80\x30\x1d\xf0\xfb\x6f\x84\
+\x86\x86\x28\x83\x73\xb4\x3e\xc3\xbd\x8f\x2c\x0c\xaf\x80\x6d\x3d\
+\x76\x56\xf4\x2a\x04\xe2\x00\x6e\x76\x50\x88\x42\x1b\xe1\x4c\xa8\
+\x85\x0b\xa8\x06\x15\x01\x36\x44\x38\x7e\x7c\x62\xd8\xbb\x68\x37\
+\xc3\xe7\x97\xef\xee\x01\x0d\xca\x43\xb7\x0e\x20\x80\xb0\x24\x42\
+\x16\xd7\xd3\x47\x1e\x34\x3f\xba\xbb\xdc\xc5\x11\x18\x8f\x86\xba\
+\x9a\x0c\x9f\xfe\x30\x32\x7c\xfb\x8e\x5a\x1a\xc2\x42\x40\x46\x98\
+\x81\x41\x9d\x09\x62\x29\xac\x96\x06\x85\xc6\x9f\x6f\x9f\x19\x6e\
+\x9f\xbf\xcb\xb0\x65\xc3\x45\x86\x77\xaf\xbf\x5c\x06\x5a\x0e\x6a\
+\x0e\x3f\x47\xf7\x0a\x40\x00\xe1\x6a\x92\x81\x42\x22\x1e\x98\x08\
+\xeb\xe4\x35\xa5\x95\x6c\xbc\x81\x09\x50\x4b\x1a\x58\x51\x42\x52\
+\x3d\x23\xb8\x49\x0c\xf4\x21\x30\x11\x3e\x3e\x7f\x83\xe1\xf2\xf1\
+\x1b\x20\x87\xc3\xcd\xf8\xfc\xf9\x27\xc3\x93\x47\x1f\x19\x3e\xbd\
+\xf9\xf6\x0e\x18\xe7\xf3\x80\x25\x65\x2b\x50\xf8\x03\xc4\x02\x60\
+\x03\xfb\x74\x32\x5c\x2d\x40\x00\xe1\x76\x00\xb4\x87\x00\xcc\x82\
+\xa5\xc0\x2a\x31\x4f\xdd\x58\x8d\xcb\x37\x0c\x98\x20\x55\x79\x19\
+\x3e\x01\x43\xe3\x07\xb0\xde\x97\x01\xb6\xec\xd6\xcd\x3f\xc1\xb0\
+\x6d\xe1\xf1\xdb\xc0\xf8\x38\x08\x0d\xfd\x7f\xc0\x94\xf8\x16\x68\
+\xe9\x45\x60\xf3\xeb\x00\xc4\xd7\xb0\x66\x12\xb0\x30\xb8\x5a\xcf\
+\xf0\xff\xcb\x3d\xb8\x10\x40\x00\x61\x46\x01\x33\x17\xb4\x4f\x00\
+\x76\xd8\x3b\x60\xd0\x55\x02\x53\xe0\xb2\x9b\xa7\xae\x35\xdd\xbb\
+\xf6\x30\xc0\xcb\xdf\x80\x21\x24\x54\x97\x81\x4b\x9c\x05\x58\xf9\
+\x01\xa3\x81\x8b\x09\x54\x85\x1f\x60\xe0\x64\x49\xc3\x5b\x78\x83\
+\x2c\x7f\xb9\x1b\x52\xd2\x22\x01\x80\x00\xc2\xac\x8c\x9e\xac\x82\
+\x58\x0e\xd2\x80\xe8\x30\x5e\x66\xe0\x60\x0b\xfc\xfd\xf3\x67\xe0\
+\xc6\x45\x47\x2f\x97\x17\xac\x63\xb8\x72\xec\x01\x83\x16\xb0\x25\
+\xc4\xcb\xcd\x0c\x52\xce\x8a\xab\xeb\x04\xae\x5b\x98\x40\x8d\xc3\
+\xfd\xc0\xde\xcb\x62\x0c\x15\x00\x01\x84\xbd\x73\x0a\xee\x94\x7a\
+\x02\x23\xd9\x1a\x52\x30\xa1\x56\xa1\x5c\xc0\xba\x20\x07\x18\xd0\
+\x25\xae\xde\x1a\xa2\xff\x80\xfa\xf7\x6e\xbf\xb9\x18\x98\x06\x10\
+\xad\x25\x90\x85\x20\xcb\xff\x01\x8b\xc0\x9f\xc0\xc2\xe0\xd1\x72\
+\x06\x86\x4f\xd7\xb0\xf6\x8e\x01\x02\x08\x7f\xef\x58\xc0\x00\x58\
+\xc0\xc6\x62\xaf\x1f\xfe\x03\xfb\x7d\xc0\xba\x01\xd8\x6e\x70\x07\
+\xe6\xc5\x22\x20\x7f\x01\xd8\x52\x90\x63\x3f\x5e\x02\x16\x04\xb7\
+\x80\xa9\x11\x88\xbf\x3f\xc3\xa8\x5d\x91\xed\x04\x08\x30\x00\xbd\
+\xc3\xf9\xac\x32\x36\xd0\x57\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\x43\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xcc\xaa\x63\xf8\xf1\x27\x89\xe1\
+\xcf\xbf\xbf\x40\x2e\x44\x10\x01\x98\x18\xd8\x98\xff\x31\xb0\x33\
+\xb7\x01\x65\xe6\x31\xe0\x03\x8c\x0c\x21\x0c\xbf\xff\xb5\x00\xcd\
+\x62\x03\xf2\xfe\x61\xc8\x33\x33\x71\x30\x70\xb2\x6c\xfc\x7f\x26\
+\x2d\x1b\xc4\x05\x08\x20\x46\xb8\x03\x74\xa7\x7d\x48\x89\xd0\xe3\
+\xb7\xd4\x17\x67\xf8\xfe\xf3\x2f\x8a\x1e\x4e\x76\x66\x86\xcd\x87\
+\x1e\x32\x6c\xd8\x76\xfb\x04\x03\x3b\x93\x25\xaa\x85\x8c\xa8\x16\
+\xfc\xf8\xb3\xce\xca\x54\x3a\x30\x25\x44\x9b\xe1\xdb\x8f\x3f\x28\
+\x52\xec\x6c\xcc\x0c\x57\xef\xbe\x63\x98\xb8\xe8\xc2\xa7\x7f\xe7\
+\xd2\xf9\x41\x62\x00\x01\xc4\x02\x97\xfd\xfd\x8f\xc1\xc6\x54\x96\
+\x21\xd6\x4d\x9e\xe1\x13\x92\x3e\x90\xf3\x04\x80\xaa\x9e\xbc\xf9\
+\xc1\xb0\x61\xd3\x8d\x7f\x0c\x6c\x4c\xe8\x3e\x46\x65\xff\xfe\xf7\
+\x4f\x45\x4e\x90\x21\xc1\x5b\x85\xe1\xc3\x1f\x54\x69\x1e\xa0\x39\
+\x3b\xcf\xbc\x62\x98\xb4\xe0\x3c\x3c\x84\x01\x02\x88\x05\x29\x90\
+\xff\x3f\xff\xf8\x97\xe1\xe6\x07\x06\x86\xaf\xdf\x50\x1d\xc0\xcb\
+\xcd\xc0\xf0\xf6\xcb\x3f\x90\x69\xff\xf1\x06\xff\x7f\x88\x39\x1f\
+\xbf\xff\x63\xb8\xf9\x91\x81\xe1\xf3\x67\xa0\x16\x24\xf7\x72\x72\
+\x30\x30\x3c\x7d\xf7\x97\xe1\x3f\x92\x39\x00\x01\xc4\x82\xac\xff\
+\xd3\x4f\x06\x86\x97\x5f\x18\x18\xbe\x7d\x47\x35\xf7\x1b\x50\xf9\
+\x97\xdf\x68\xbe\xc5\x03\x40\x21\xff\x0a\x68\xce\xe7\x6f\xa8\x31\
+\xc4\x09\x8c\xd9\xf7\x3f\x50\xd5\x02\x04\x10\x0b\x72\xf0\x81\x1c\
+\xf0\xfa\x2b\x03\xc3\x77\x34\x07\x7c\x05\x3a\xe0\xeb\x2f\xe2\x2c\
+\x07\x99\x03\x76\x00\xd0\x9c\xaf\x5f\x51\x1d\xc0\x01\x74\xc0\xc7\
+\x1f\xa8\x1e\x01\x08\x20\x94\x10\xf8\x08\x74\xc0\x0b\xa0\xa6\x1f\
+\x68\x0e\x00\x69\xfc\xf2\x8b\xc8\x10\x00\xaa\xf9\x0e\x54\xff\x02\
+\x14\x92\x68\x21\xc0\xfe\x07\x1a\x02\x48\x11\x09\x10\x40\xa8\x21\
+\xf0\x03\x12\x05\xbf\x7e\xa2\x9a\xc9\xfe\x0f\xc9\x01\x8c\xc4\x85\
+\xc0\x4b\xa0\xe5\x3f\xbf\xa1\xaa\x67\x05\x3a\xec\x03\x5a\x14\x00\
+\x04\x10\x8a\x03\x40\x21\xf0\xf2\x2b\xa6\x03\xd8\xfe\x40\x1d\x40\
+\x24\xf8\xfe\x07\x12\x02\xbf\xbe\x81\x13\x25\xc2\x01\xbf\xa0\x21\
+\x80\xe4\x28\x80\x00\xc2\x70\x00\x48\xe3\x5f\x34\xcb\x58\xfe\x90\
+\x18\x05\x7f\x20\x21\xf9\x07\xcd\x23\xcc\xac\x90\x10\x40\xce\x4a\
+\x00\x01\x84\x92\x06\xbe\x02\x35\xbc\xfd\x86\xe9\x00\x66\xa0\x81\
+\xdf\x48\xc8\x05\x3f\xff\x40\xcc\xc1\xe6\x00\x50\x34\x23\x1b\x03\
+\x10\x40\x28\x0e\xf8\xf7\x1f\x81\x51\x3c\xf5\x1f\x4b\xe1\x8c\x27\
+\x04\x40\x6a\xff\xfe\xc3\x6e\x0e\x48\x0c\x59\x18\x20\x80\x58\x08\
+\x95\x2b\x30\xfa\x3f\x03\xf9\xe0\x3f\x1a\x8d\x1c\x02\x00\x01\xc4\
+\x82\xae\x90\x52\xcb\x48\x35\x07\x20\x80\x98\x18\x06\x18\x00\x04\
+\xd0\x80\x3b\x00\x20\x80\x06\xdc\x01\x00\x01\x34\xe0\x0e\x00\x08\
+\xa0\x01\x77\x00\x40\x00\x0d\xb8\x03\x00\x02\x68\xc0\x1d\x00\x10\
+\x40\x28\xe5\x00\x0b\x33\xb0\xe6\x63\x81\x94\x62\x28\x45\x28\x50\
+\x8c\x99\x99\xc8\x8c\x0d\x54\xc3\x04\x2c\x69\xd8\x59\xb1\x9b\x03\
+\xb2\x03\xd9\x18\x80\x00\x62\x41\xd6\xc8\x05\x6c\xc7\xf2\x71\x01\
+\xcb\x70\xb4\xf2\x91\x95\x1d\xd8\x26\x60\x21\xde\x57\x6c\x40\xb5\
+\xfc\x40\x73\x7e\x33\xa1\xd5\x7c\x40\x47\xfd\x64\x47\x55\x0b\x10\
+\x40\x28\xc6\x72\x80\x1c\xc0\x09\xd5\x88\xe6\x00\x90\x8f\x88\x0d\
+\x01\x56\xa0\xa9\xbc\x20\x73\x18\x30\x1d\xf0\x95\x1d\xb5\x28\x06\
+\x08\x20\x14\x07\x70\x82\x1c\x00\x6c\x38\xfe\x42\x73\x00\x1b\x07\
+\xd4\x01\x44\x02\x56\x66\x88\x47\x7e\xa1\x3b\x00\x68\xf9\x47\x36\
+\x54\xb5\x00\x01\x84\x70\xc0\x3f\x88\x03\x78\xb9\x30\x1d\xc0\xce\
+\x81\x14\x02\xff\x19\x70\x37\xcb\x61\x21\x00\x75\xc0\xcf\xff\x68\
+\x2d\x22\xa0\x03\xb8\x38\x50\x95\x03\x04\x10\x66\x08\x80\x1c\x80\
+\x66\x28\x07\x27\x24\x71\x12\x9d\x06\x98\x21\xe6\xfc\xf8\x8f\xda\
+\x26\x64\x63\x87\xa4\x33\x64\x00\x10\x40\x58\xd3\x00\x5a\xb3\x8d\
+\x81\x83\x8b\xc4\x34\x00\x0d\x01\xd6\x7f\xa8\x21\xc0\xc1\x01\x75\
+\x00\x92\x39\x00\x01\x84\x92\x0b\x38\x81\x96\xf0\x03\x35\xb2\xa1\
+\x59\xc4\x41\x4a\x1a\x00\xea\x65\x61\x81\x38\x80\xe5\x2f\x5a\xab\
+\x98\x03\x33\x04\x00\x02\x08\x39\x04\x18\xf9\x79\x99\x19\x24\x44\
+\x80\xcd\xaf\xaf\xa8\x8a\xb8\x78\x40\x69\x83\x09\x5b\x57\x13\x6b\
+\x6b\x88\x8b\x9d\x89\x41\x42\x14\x9a\xe2\x19\x51\x43\xf2\x29\x3f\
+\x33\x4a\xca\x01\x08\x20\x16\xa4\x5e\x2b\xf3\x83\xdb\xaf\x18\xce\
+\xf0\xb1\x32\xfc\x44\xeb\x9c\x72\x70\x30\x33\x3c\x7b\xfc\x0e\xe8\
+\x25\x26\x56\x82\xed\x42\x16\x26\x96\xb7\xaf\x3f\x33\x9c\x3d\xfa\
+\x0c\xd8\xc1\xf9\x8b\x9a\x06\x80\x89\xe3\xce\xad\xd7\x20\x57\x31\
+\xc3\xc4\x00\x02\x88\x11\xa9\x7b\x3e\x89\xe1\xcf\xdf\x30\x86\xbf\
+\xff\xff\x60\x4d\xeb\xcc\x4c\x4c\x40\xc3\xfb\x81\xec\x6e\x02\x4e\
+\x48\x01\x36\xfc\xea\x19\x7e\xff\x65\xc4\x9a\x6a\x98\x18\xd9\x81\
+\x89\x64\x3b\xb0\x7b\x1e\x0f\xe2\x02\x04\x18\x00\x0c\x5e\x57\xaa\
+\x57\xdc\x85\x99\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x07\xb6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x07\x48\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\xd0\x80\x3b\x00\x20\x80\
+\x58\x40\x84\xb1\x71\x2a\xc3\x8f\x1f\x3f\x99\x7e\xfe\xfc\xce\xfd\
+\xff\xff\xbf\xbf\x4a\x4a\xaa\x86\x52\x52\x02\x59\x3c\x3c\x8c\x66\
+\x7f\xfe\xfc\x61\x7e\xf2\xe4\xed\x8d\xd3\xa7\xf7\x2d\xfb\xf6\xed\
+\xdd\x76\x25\x25\xc7\x9f\x0c\x0c\xff\xa0\xda\x19\x21\xbe\x60\x82\
+\xf8\x83\x91\x91\x11\x8e\x99\x98\x18\x19\x40\xe9\x1b\xc4\x86\xc9\
+\x81\xc4\x98\x98\x98\x19\x7f\xff\xfe\xf4\xe5\xcc\x99\xa5\xe0\xd4\
+\x0f\x10\x40\x60\x07\xfc\xfb\xf7\xdf\x4e\x45\x45\xa6\x41\x50\x90\
+\x97\x07\x98\x2b\xfe\x72\x70\x70\x6a\x70\x71\x31\x0a\xb0\xb1\x31\
+\x81\x2d\xe1\xe5\xe5\x55\x94\x92\x8a\x75\xff\xf7\xef\xef\x65\x06\
+\x86\xff\x3f\x41\x86\xb0\xb3\xb3\x83\x03\x10\x64\xfe\xef\xdf\xbf\
+\x41\x06\x83\x2d\x01\x7a\x00\xcc\x06\x3b\xe0\xdf\x7f\x86\xff\x70\
+\x87\x81\x4c\x02\x3a\x80\x99\x99\xf1\xc5\x8b\x97\xaf\x1e\x3c\x50\
+\xa9\x7f\xf3\xe6\xce\x19\x80\x00\x02\x3b\x40\x4d\x4d\x76\x62\x6f\
+\x6f\x9a\x81\xa0\x20\x1f\xd8\xd5\x9f\x3f\x7f\x67\xf8\xf8\xf1\x2b\
+\xc3\xb7\x6f\xbf\xc1\x7c\x16\x16\x66\x06\x56\x56\x56\xa0\x47\x99\
+\xf4\x41\x86\xb1\xb1\x73\x30\x5c\xbf\x7c\x9c\xe1\xf1\x83\x3b\x0c\
+\x6a\xda\x46\x0c\xc2\x22\x62\x40\x75\x7f\x80\x1e\xf9\xc7\xc0\xcc\
+\xcc\xcc\xf0\xf7\x2f\x13\x03\x07\x07\x1f\x03\x3b\x3b\x50\x2d\x0b\
+\x23\x03\x33\x28\x10\x18\x99\x18\xbe\x7c\xfd\xc1\xf0\xfd\x27\x2b\
+\xd0\xfc\xbf\x0c\xf7\xef\x5f\x66\x02\x3a\x20\x09\x20\x80\xc0\x0e\
+\x10\x15\xe5\x96\x65\x61\xf9\xc7\xf0\xe5\xcb\x67\xb0\xeb\x3f\x7d\
+\xfa\xca\xf0\xf2\xe5\x7b\x86\x0f\x1f\xbe\x83\x83\x8f\x99\x99\x05\
+\x8c\x41\x72\x5c\x9c\x5c\x0c\x77\x6f\x9f\x60\x68\x59\x75\x9c\x41\
+\xc9\x3a\x80\xe1\x45\xd3\x74\x86\x25\xfd\xb9\x0c\x4b\x96\xaf\x66\
+\xf8\xf8\xe1\x03\x43\x45\x45\x25\xd8\xe7\x97\xaf\x5e\x64\x10\x91\
+\x92\x65\x10\x92\x94\x61\x78\xf1\x8d\x91\xe1\xf9\xd7\xff\x0c\xaf\
+\xdf\xfd\x64\xe0\x7a\x78\x83\x41\x54\x50\x11\xe8\x40\x0e\x05\xa0\
+\xd1\x0a\x00\x01\x04\x8e\xbc\x5f\xbf\x7e\xfd\xfd\xfd\xfb\x2f\x3c\
+\xbe\x50\xe3\x0c\x82\x41\x7c\x66\x66\x26\x70\xb4\xbf\x7c\x76\x93\
+\xe1\xfe\x27\x1e\x86\xdd\x8f\xa5\x18\x18\x39\x44\x19\x04\xf8\x78\
+\x18\x56\x2c\x5f\xc1\xb0\x60\xc1\x22\x86\xef\xdf\x7f\x30\x28\xab\
+\x28\x33\xd8\x58\x9b\x31\x3c\xff\xc6\xc4\x70\xe6\xfe\x67\x86\xcb\
+\xf7\xde\x30\x7c\xff\xf2\x9b\x81\xf9\xe7\x37\x06\x0e\x60\xd4\xfd\
+\xfe\xf5\x07\x18\x6d\x7f\x41\x96\xb1\x01\x04\x10\x0b\x2c\x31\x21\
+\xd9\x8d\x15\x40\x1c\xc7\xc8\xf0\xf8\xf1\x0d\x06\x77\x5f\x6f\x06\
+\x0e\xc1\x13\x0c\x07\x8f\x75\x31\x64\x97\x86\x30\xc8\x29\x6b\x31\
+\x2c\x5d\xba\x14\x68\xf9\x77\x06\x0d\x0d\x75\x60\x82\xfe\x0d\x8c\
+\x32\x76\x06\x0b\x25\x01\x86\x5f\x3f\x7e\x32\x5c\xb9\x72\x95\x41\
+\x98\x4b\x8d\x81\x55\x90\x9f\xe1\x1d\x23\x3b\x30\x7a\x7f\xc2\x3c\
+\xfb\x1f\x20\x80\x58\x88\xcd\x2e\x20\xdf\xbf\x7a\xf5\x88\x41\x4c\
+\x8c\x9f\x41\x52\x52\x9e\x21\x39\x5e\x99\x21\x3b\x25\x92\x81\x85\
+\x83\x07\x2c\x6f\x67\x67\x07\x57\xfb\xfb\x37\x24\x97\xf0\xf0\xf0\
+\x32\xfc\x66\xe7\x62\x30\x30\x34\x66\xb8\x78\xf1\x1a\x83\xa4\x94\
+\x38\x30\x3d\x81\x92\xe5\x0f\xb8\x87\x01\x02\x88\x05\xe1\xbb\xff\
+\x78\x7c\xcf\x04\xf4\xd5\x0f\xa0\xaf\xfe\x30\xc8\xc9\x29\x83\x83\
+\x99\x81\x81\x95\x81\x81\x9b\x93\x81\x0d\x18\x9c\x5f\xbe\x7c\x02\
+\x3a\xee\x05\x58\x0d\x1f\x1f\x3f\x30\x4d\x49\x80\x13\xee\xb7\x6f\
+\x3f\xc1\x39\x84\x99\x85\x1d\x68\xb9\x08\xc3\xa3\x47\x57\x18\x04\
+\x04\x54\x19\x90\xab\x1f\x80\x00\x22\x2a\x04\x40\x89\xef\xc3\x87\
+\x97\x0c\xb2\xb2\x52\xc0\x14\xfe\x1f\xec\x58\x90\xa3\x81\xd9\x92\
+\xe1\xde\xbd\x07\x0c\x2f\x5e\xbc\x06\x0a\xb1\x03\x2d\x62\x03\x26\
+\xde\x27\xc0\x68\x7a\xc2\xa0\xa2\xa2\xca\xc0\xc5\xc5\x0f\x4c\x5f\
+\xa0\xf8\xfe\xc3\x20\x2c\x2c\x0e\x4e\xd8\x3f\x7e\x7c\x87\x46\x39\
+\x24\x08\x00\x02\x88\x89\x50\x81\x08\x52\xf8\xf7\xef\x6f\xa0\x41\
+\x5f\x19\xd8\xd8\xb8\xc0\x96\x42\xa2\x84\x99\xe1\xcd\x9b\x97\x0c\
+\xaf\x5f\xbf\x63\xe0\xe1\x95\x64\x78\xfd\xe6\x23\xc3\xb9\x73\x67\
+\x19\x38\x38\x85\x80\x39\x8e\x87\xe1\xc6\x8d\x6b\x0c\xc0\x82\x0d\
+\x5a\x36\x00\xcb\x83\xff\x4c\x0c\xdc\xdc\xec\xc0\xd0\x7a\x0b\x0c\
+\x1d\x84\xbf\x01\x02\x88\x09\x62\x09\xde\xe4\x07\xf4\xc1\x2f\x06\
+\x4e\x4e\xa0\x0f\x99\x59\xc1\x86\xc1\x7c\xff\xfe\xfd\x7b\x06\x31\
+\x71\x39\x86\x53\xa7\x8e\x30\x24\xa7\x84\x30\x14\x15\xa5\x02\xb3\
+\x61\x16\xb0\xe0\xe2\x07\x46\x17\x17\xc3\xdb\xb7\xaf\x80\x96\x41\
+\x3c\xf7\xf7\xef\x5f\xb0\x19\x3f\x7e\x7c\x00\x47\x29\x0c\x00\x04\
+\x10\x11\x0e\x60\x00\x5b\x0a\x2a\xf9\x60\x6d\x07\x50\xd1\xfb\xf3\
+\xe7\x0f\x70\xaa\x11\x13\x17\x65\x58\xb8\x60\x26\xc3\xe7\x4f\x9f\
+\x40\x25\x2a\xc3\x89\xe3\x47\x18\xce\x9c\x39\xc6\x20\x2e\x21\x05\
+\x2c\x70\x3e\xc2\x2d\x83\x98\xc1\x01\xe4\xff\x03\xab\x83\x15\xe3\
+\x00\x01\xc4\x84\x5c\xa6\xe3\x03\x10\x4d\x08\x07\x81\x1c\xf1\x0f\
+\xe8\xab\xff\xc0\x7a\x41\x50\x48\x18\x45\x2d\xbf\x00\x3f\xc3\x1f\
+\x60\xb4\xfd\xfd\xfb\x0f\x29\x2a\x19\xc0\x25\xe5\xbf\x7f\xa8\xe6\
+\x02\x04\x10\x52\x2e\xc0\x57\x06\x30\x83\xf3\x38\xc2\x31\xff\x80\
+\xe9\x81\x13\x98\xe8\x58\x18\x5e\x3e\x7f\xca\x50\x5e\x51\xcd\xf0\
+\x13\x98\xb8\x5e\x3c\x7f\xce\xe0\xe1\xed\xc3\x60\x6e\x6e\xc9\x70\
+\xe3\xfa\x45\x06\x49\x09\x49\x68\x94\x41\xec\x00\x25\x40\x26\x26\
+\x56\xb0\xe3\x61\x76\x02\x04\x10\x0b\xa1\x28\x00\x19\xc0\xc6\xc6\
+\x06\xcc\x05\xff\x80\x3e\xfa\x05\x54\xcb\x0e\x97\x13\x03\xd6\x01\
+\xf7\xee\xdf\x65\x10\x11\x91\x60\x98\x39\x7b\x3e\x38\x7b\xf2\xf0\
+\x70\x33\xdc\xbd\x73\x1d\x58\xda\xfd\x64\x90\x90\x90\x02\xc7\x3d\
+\xac\x3e\xf9\xf1\xe3\x17\x50\x5e\x84\x01\x58\xc3\xc2\xed\x04\x08\
+\x20\x22\xb2\x21\x24\xb8\x39\x39\xf9\x19\xbe\x7e\xfd\xc4\xc0\xcf\
+\x2f\x08\x4f\x54\xc2\x22\xa2\x40\xd7\xff\x67\x78\xf2\xe4\x31\xc3\
+\xdb\x9f\x7f\x80\xc1\xfe\x87\xe1\xc5\xb3\x3f\xc0\xc4\xca\xc8\x60\
+\x6a\x6a\x01\x2e\x0d\x7f\xff\xfe\x01\xcd\x49\xbf\x80\x69\xe2\x27\
+\x30\x27\x08\x00\x13\xef\x57\x78\xb4\x03\x04\x10\x51\x51\x00\xb2\
+\x8c\x8f\x4f\x88\xe1\xd9\xb3\x7b\xc0\x52\x50\x12\xe8\x20\x48\x28\
+\x80\x7c\x22\x21\x21\x0d\x2c\x1d\x45\x81\x86\x7f\x01\xe7\x16\x16\
+\x16\x56\xa0\x2f\xf9\xc1\xf1\xff\xfd\xfb\x4f\xb0\x3a\x36\x36\x56\
+\x86\xdb\xb7\x6f\x03\x1d\x26\x08\xae\xd4\x90\x01\x40\x00\x11\x99\
+\x08\xff\x83\x35\x72\x72\x8a\x82\xf3\x37\x28\x38\x61\x8e\xfe\x0b\
+\xf4\x35\x0b\xb0\xa4\x13\x11\x11\x01\x3a\x4e\x0a\x48\x8b\x82\x83\
+\x17\xe4\x68\x10\x60\x65\x65\x01\x46\xdf\x6b\x60\xf9\xff\x97\x41\
+\x46\x46\x0d\xac\x1e\xb9\xee\x01\x08\x20\xa2\xb2\x21\x2c\x14\x84\
+\x84\x44\x81\x05\x12\x2b\xc3\xe5\xcb\xe7\xc0\x7a\x40\x69\x03\x51\
+\xd0\x20\xd4\x81\xf8\xa0\x82\x8a\x9d\x9d\x8d\xe1\xdd\xbb\xd7\x0c\
+\x77\xee\x3c\x06\x56\x52\xe6\xf0\x34\x85\x0c\x00\x02\x88\x09\x5a\
+\xaa\x31\x83\x2a\x1b\x6c\x55\x30\x72\x13\x0b\x54\xf8\x48\x4a\x2a\
+\x00\x83\x96\x95\xe1\xc8\x91\xa3\x0c\xcf\x9f\x3f\x01\xfa\x90\x19\
+\x5c\xd8\xc0\x13\x15\x30\x74\x40\x05\x0e\xa8\x14\xbc\x7a\xf5\x32\
+\x30\xe8\x9f\x31\xe8\xe8\x58\x03\x8b\x65\x0e\x70\x6b\x09\x62\x16\
+\x13\xb8\x69\x06\x52\x0f\x10\x40\xe0\x08\x79\xf2\xe4\xcd\xed\x87\
+\x0f\xdf\x09\x2b\x2a\x4a\x01\xe3\x15\x54\x9b\x81\xe2\x17\x98\xcf\
+\xff\x31\xc1\x2b\x23\x18\x06\xb5\x1b\x84\x85\xe5\x80\x29\xfa\x1b\
+\xb0\x04\xbc\x07\xac\x6a\xef\x01\x43\x86\x17\xe8\x30\x71\xb0\x8f\
+\x3f\x00\x1b\x25\xcf\x9e\x01\xeb\xff\xef\xff\x80\xe9\x46\x8a\x41\
+\x5b\x5b\x05\xec\xf8\x5f\xbf\x80\x25\xc6\x3f\x90\x67\x58\x80\x0d\
+\x9e\xcf\xa0\x68\x01\xd5\x68\xff\x01\x02\x88\x11\x14\x24\x52\x52\
+\x7a\x76\xe2\xe2\x72\xd5\xbc\xbc\xdc\xb2\xa0\xf8\x06\x66\xf3\xff\
+\xa0\x82\x07\x56\xec\x22\xb7\x07\x40\x86\xc1\x2a\x28\x50\xf9\x00\
+\xf2\xe9\xb7\x6f\x9f\x80\x21\xc1\x08\xf6\x3d\xa8\xf2\x01\x25\x52\
+\x7e\x7e\x21\x50\x33\x0e\x68\xd6\x1f\xa8\xc5\x90\xb4\x04\x64\x33\
+\x7e\xfc\xf8\xe6\xe7\xb5\x6b\x07\xf7\x7c\xff\xfe\x69\x0e\x40\x00\
+\x31\x42\x2d\x01\x49\x4b\x01\xb1\x1c\x28\x46\xe8\xd0\x1a\x07\x95\
+\x87\xc0\x2a\x94\xe1\x11\x40\x00\x31\x0e\x74\xdf\x10\x20\x80\x06\
+\xbc\x63\x02\x10\x40\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\x18\
+\x00\x4e\x12\xc6\x99\x32\x89\xe5\xec\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x09\x8f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x09\x21\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\xd0\x80\x3b\x00\x20\x80\
+\x58\x40\x84\xb1\x71\x2a\xc3\x8f\x1f\x3f\x99\x7e\xfe\xfc\xce\xfd\
+\xff\xff\xbf\xbf\x4a\x4a\xaa\x46\x52\x52\x02\x99\x3c\x3c\x0c\xa6\
+\xff\xfe\xfd\x63\x7d\xfc\xf8\xcd\x8d\x73\xe7\x8e\xac\xfc\xf4\xe9\
+\xe5\x66\x25\x25\xfb\x9f\x0c\x0c\xb0\x84\xcb\x08\xc6\x8c\x40\x8a\
+\x89\x09\xe1\x17\x18\x9b\x99\x19\x42\x83\xd2\x39\x23\x50\x11\x13\
+\x13\x48\x2d\x33\xe3\xbf\x7f\xdf\xbf\x9f\x3a\xb5\xe0\x0f\x48\x0e\
+\x20\x80\xc0\x0e\xf8\xf7\xef\xbf\x9d\x8a\x8a\x4c\x83\xa0\x20\x2f\
+\x0f\x30\x57\xfc\xe5\xe0\xe0\xd4\xe0\xe2\x62\x14\x60\x63\x63\x02\
+\x6b\xe4\xe2\xe2\x51\x90\x94\x94\x76\xff\xfb\xf7\xcf\x65\x20\xf7\
+\x07\x23\x13\x33\x23\x07\x3b\x3b\xc8\x6a\xa0\xc9\x4c\x0c\xbf\x7f\
+\xff\x02\x1a\xce\x0c\xb6\x00\xe8\x60\x38\x1b\x64\x31\xd0\x43\x40\
+\x33\x98\xc0\x8e\x84\x38\x8a\x85\xf1\xdd\xbb\x0f\x5f\x1e\x3f\xd6\
+\xe9\x78\xfe\xfc\xca\x4e\x80\x00\x1c\x8e\xb1\x0d\xc2\x30\x10\x00\
+\xcf\xf8\x6d\x22\xb1\x00\xa2\x70\x83\x44\x2a\xb2\x0e\x1b\x30\x4e\
+\x1a\x06\xc9\x18\xf4\x48\x54\x88\x02\x31\x41\xb0\x62\x23\x70\x24\
+\xde\xf4\xa7\xbb\xfb\x0f\xb4\x6d\x38\xf5\xfd\xb1\xd3\x01\x15\x18\
+\x62\xcc\x8c\xe3\x44\x4a\xdf\x3a\x87\x88\xc5\x39\x31\x2a\xee\xaa\
+\xcc\x7b\xcf\xf5\x72\xe6\xf9\xb8\xb1\xdd\xed\x59\x6f\x82\x86\x2a\
+\x3b\x2b\x2b\x94\x62\x94\x59\xb1\xf4\x96\xa6\x11\x6c\xfd\x64\x41\
+\x7a\x7f\x78\x4d\x30\x17\x47\xce\x31\x0c\xc3\xfd\xf0\x13\x40\x60\
+\x07\x88\x88\x70\x49\x33\x31\xfd\x65\xf8\xf4\xe9\x33\xd8\xf5\x20\
+\xcb\x5f\xbc\x78\x0f\xa4\xbf\x01\x0d\x66\x04\xb9\x1a\x88\x99\xc1\
+\x34\x3b\x3b\x27\xc3\xcb\x67\xf7\x19\xaa\x16\x1c\x66\x50\xb1\x0f\
+\x60\x78\xd4\x31\x8b\x61\x79\x5f\x06\xc3\x86\xcd\xdb\x18\xee\xdf\
+\xbf\xcf\x50\x59\x59\xc9\xc0\xcb\xcb\xc9\x70\xee\xfc\x45\x06\x2e\
+\x21\x31\x06\x05\x15\x0d\x86\x97\xdf\x18\x18\x9e\x7d\xfd\xcf\xf0\
+\xee\x3b\x23\x03\xcb\xed\xeb\x0c\xe2\xdc\x52\x40\x73\x38\x44\x80\
+\x9e\x31\x00\x08\x20\x70\x24\xfd\xfa\xf5\xeb\xef\xef\xdf\x7f\xc1\
+\xc1\x0d\x03\x90\x38\x63\x02\x07\x25\x24\xee\x60\x7c\x06\x86\x57\
+\xcf\xef\x30\x3c\xfe\xc6\xc7\xb0\xf3\x81\x24\xc3\x6f\x36\x31\x06\
+\x61\x60\xc8\xad\x59\xb3\x96\x61\xe1\xc2\x45\xc0\x50\xfb\xce\xa0\
+\xa0\x20\xcf\x60\x6d\x65\xc6\xf0\xf1\x37\x1b\xc3\x99\x07\x9f\x19\
+\x2e\xdc\x7e\xcd\xf0\xf5\xd3\x2f\x06\xc6\x6f\xdf\x18\x38\xd8\x58\
+\x19\xfe\x02\xa3\xe9\xc7\x8f\xdf\xa0\xd4\xc1\x0e\x10\x40\x2c\xb0\
+\xc4\x84\x64\x37\x56\x00\x72\x00\x28\xf8\x1f\x3f\xbe\xc5\x60\x65\
+\x6f\xcd\x30\x89\xe7\x3c\xc3\x9e\x43\x9d\x0c\xc9\x45\x7e\x0c\x32\
+\x8a\x9a\x0c\xf3\xe7\xcf\x67\x78\xfd\xfa\x35\x83\xb6\xb6\x0e\xc3\
+\xcf\x9f\xbf\x19\x38\x39\x79\x18\x6c\x34\x24\x19\x7e\x01\xd3\xc7\
+\xad\x4f\x77\x18\x58\x7f\x8a\x33\xf0\xf3\xcb\x30\xbc\xf9\x2d\xce\
+\xf0\xf9\xcb\x5f\x98\x7d\xff\x01\x02\x88\x85\xd8\xec\x02\x0a\xfe\
+\x37\x6f\x9e\x02\xa3\x8b\x9b\x41\x4a\x5a\x91\x21\x5a\x4d\x83\x21\
+\x39\x2e\x8c\x81\x85\x83\x1b\x9c\xd8\x4c\x4c\x4c\xe0\x6a\x41\x0e\
+\x00\x15\xf1\x5c\xdc\xdc\x0c\xac\xbf\xd8\x19\x74\xf4\x8c\x18\xce\
+\x03\xa3\x84\xe3\x8f\x04\x30\x6d\x70\x02\xe5\x3e\x43\x73\x10\x03\
+\x03\x40\x00\xb1\xc0\x7c\x87\xc8\x5a\xd8\x7c\xcf\x04\x0c\xb2\xef\
+\xc0\x44\xf6\x85\x41\x5e\xde\x14\x94\x65\x81\x62\xff\x18\xfe\x71\
+\xb2\x33\xb0\x33\xfe\x06\x06\xfb\x17\x86\x97\x2f\x5f\x00\xe9\xaf\
+\x0c\x3c\x3c\x7c\x0c\xe2\xe2\x12\x40\x07\xb3\x03\x73\xc7\x0f\x86\
+\x3f\x7f\xff\x82\x13\xb6\xbc\xbc\x0c\xc3\xad\x5b\xd7\x19\x84\x84\
+\xb4\x18\x10\x76\x32\x30\x00\x04\x10\x51\x21\x00\x49\x98\xaf\x19\
+\xa4\xa5\x65\xc0\x86\x81\x7c\x07\xd2\x0f\xc2\x8f\x1e\xde\x67\x78\
+\xfe\xe2\x25\xc3\xdf\xbf\x6c\xc0\x9c\xc2\x09\x0c\xa5\x17\x0c\x4f\
+\x9f\x3e\x65\xd0\xd1\xd4\x62\xe0\xe5\x13\x66\x78\xfb\xeb\x03\x30\
+\x57\xfc\x61\xe0\xe3\x13\x02\x3a\xee\x05\xc3\xd7\xaf\x9f\x40\x65\
+\x01\xdc\x6c\x80\x00\x62\x82\xf9\x10\x1f\x00\xe6\x7f\x06\x50\x2e\
+\x01\xc5\xeb\x5f\xa0\x8f\x20\x8e\x62\x65\x78\xff\xfe\x2d\xc3\x8b\
+\x97\xaf\x19\x38\xb9\xc4\x19\xde\xbd\xfb\xcc\x70\xe2\xe4\x71\x06\
+\x16\x56\x5e\x60\x42\x13\x66\x98\xb7\x62\x2d\xc3\xa5\x1b\x37\x19\
+\xf8\xb8\x79\xc1\xa1\x0d\x4a\xe4\xdc\xdc\x5c\x0c\x1f\x3e\xbc\x00\
+\x66\x55\x56\x78\x08\x00\x04\x10\xc1\x10\x00\x29\xfc\xfb\x17\x92\
+\xc7\x81\x29\x01\x1c\x55\x20\xb1\x7f\xff\x7e\x03\xb3\xea\x33\x06\
+\x71\x09\x79\x86\xe3\x27\x4e\x30\x14\xe4\xa5\x02\x0d\xff\xc0\xa0\
+\xa7\x6d\xc8\x20\x6d\x67\xc9\xf0\x52\xf2\x1c\xc3\xb2\xa5\x2b\x19\
+\x4a\x6c\x2b\x18\xfc\x6c\x1d\x19\x5e\xbc\x79\x0d\xcc\x9e\x7c\x40\
+\x7d\x8f\xa0\x66\x41\x00\x40\x00\x41\xd3\x00\x03\x81\x10\xf8\x0b\
+\x2e\xd1\x20\x4d\x07\x48\x96\x04\x95\x7e\xac\xac\xec\x40\x07\x88\
+\x33\x6c\xdc\xb0\x0a\x6c\x39\x08\x5c\x7a\xfd\x84\x41\xc0\xe4\x32\
+\x83\xb2\xcd\x4f\x86\xff\xdf\xfe\x32\x34\xcf\x6b\x62\xf8\x03\x4c\
+\x94\xde\x36\x0e\x0c\xaf\xff\xfe\x04\xea\x61\x06\x9a\xf7\x8f\x81\
+\x19\x18\xad\xa0\x92\x14\x20\x80\x98\x10\x65\x3a\xa1\x2c\x08\x73\
+\xe8\x7f\xb8\x18\xc8\x11\xa0\xe8\x91\x92\x90\x84\x44\x8b\x8c\x0c\
+\x83\x6d\x97\x3e\x83\xa4\xe5\x57\x86\xa7\xb7\x5f\x30\x7c\xff\xf2\
+\x9e\xc1\x24\x99\x89\xa1\xe9\x58\x03\xc3\xf6\x63\x87\x19\xf8\xb9\
+\xf8\xc0\xbe\x67\x67\xe1\x80\x14\xd3\x0c\xff\xff\x01\x04\x10\x13\
+\x72\x8a\xc4\x97\x05\x21\x09\x07\x62\x39\xa8\xbc\x67\x63\xe3\x00\
+\x8b\xbf\x7c\xfe\x98\x21\x26\x26\x81\x81\x5b\x55\x83\xc1\xb8\x4e\
+\x9e\x41\xc9\xf2\x13\xc3\xaf\x57\x5f\x18\x14\x84\x44\x18\x84\x99\
+\xb9\x18\x78\xfe\x7f\x67\xb0\x4a\x61\x67\xa8\x3e\x58\xc1\xb0\x66\
+\xef\x26\x06\x61\x6e\x49\x86\x4b\x4f\x4e\x31\xec\xfe\xb8\x80\xf3\
+\x0f\xe7\x4f\x01\x80\x00\x22\x18\x05\xa0\x14\xcf\xc2\xc2\x06\xa4\
+\x41\x6e\xfd\x0b\x2f\xb4\x40\x3e\x90\x97\x57\x60\x78\x72\xff\x21\
+\x43\xef\xaa\xe5\x0c\xb2\x59\xfc\x0c\x06\x4e\xc0\x68\x7a\xf7\x8b\
+\x41\x0c\x18\xd7\xb0\x1a\x91\x9f\x87\x9f\x41\x86\x87\x8d\xe1\x7b\
+\xf2\x3f\x86\xae\xd9\x3d\x0c\x9e\x9c\x51\x0c\x87\x18\x37\x31\xb0\
+\x99\x7f\x66\xfd\x7f\xec\xbf\x0c\x40\x00\x31\x11\x97\x0d\x41\xc5\
+\x30\x1b\x30\xa5\xbf\x02\xc6\x21\x2b\x34\x1b\xfe\x67\xe0\x06\xe6\
+\x8a\xde\x35\xab\x19\x0e\x72\x6f\x64\xb0\xf1\x67\x66\xe0\xfc\x06\
+\x2c\x7c\x38\xb9\x18\x38\x39\x38\x80\x65\x3d\x3b\x03\x1b\x3b\x1b\
+\x83\x0c\x30\x91\xaa\x8a\xeb\x30\x98\xc8\x4a\x33\x98\x26\x0a\x30\
+\xac\xfa\x3d\x99\x41\x25\x92\x15\x98\x25\x81\xb9\xe3\xe7\x3f\x16\
+\x80\x00\x62\x21\x26\x0a\x40\xf1\xcc\xc7\x27\xc2\xf0\xea\xd5\x5d\
+\x06\x29\xa9\xaf\xc0\xec\x28\xc8\xc0\x05\x2c\xd1\x1a\x66\x4f\x67\
+\xd8\xc6\xb6\x9a\x21\x20\x49\x9c\x41\xe0\x17\x33\xc3\x7f\x50\xf5\
+\xcd\xc4\x08\xae\xb8\xc0\x29\x1c\x58\x33\xf2\x72\x0a\x30\xb0\x32\
+\x72\x32\xa8\x08\xe9\x30\xb0\x32\x73\x32\x88\x95\xf1\x30\xf0\x70\
+\x73\x32\x9c\x59\xfe\xe0\x1f\x50\xc9\x77\x80\x00\x22\x2a\x11\xc2\
+\x1a\x17\xbc\xbc\x92\xc0\xd2\xec\x06\x03\x0b\xb0\x7e\xfd\xfb\xe7\
+\x3f\xc3\xb6\xeb\x07\x18\xd4\x3d\x38\x18\xe4\x38\xb9\xc1\x69\x82\
+\x9d\x83\x1d\xe2\x73\x60\x75\xcd\x0e\xf4\x3d\x2f\x30\xd1\x71\x32\
+\xf3\x00\x2b\x62\x16\x06\x4e\x26\x5e\x06\x75\x01\x7d\x06\x1b\x51\
+\x0d\x86\xff\xc0\xea\xfa\xcb\xd7\x9f\xc0\xf8\x62\xf8\x01\x10\x40\
+\x4c\xc4\x64\x43\x58\x56\xe4\xe7\x17\x04\xaa\xe5\x63\x38\x79\xea\
+\x38\x30\x5e\xfe\x30\x94\xf8\x24\x32\x9c\x5b\xf2\x95\xe1\xc2\xeb\
+\xaf\x40\x39\x2e\x60\xdd\x0f\x09\x7a\x48\xf0\xb3\x02\xa3\x88\x97\
+\x81\x9d\x81\x93\x81\x0d\x88\x59\x81\x98\x9b\x51\x88\x41\x96\x5d\
+\x93\xe1\xc7\x6f\x26\x86\x5f\x5f\x7f\xfd\x01\xfa\xfb\x07\x40\x00\
+\x31\x41\x7c\xc7\x0c\x0c\x2d\x26\x70\xc2\x01\xf9\x14\xb9\x1a\x86\
+\x61\x66\x66\x50\x11\xfc\x17\x58\x19\x49\x01\x83\x56\x84\x61\xd7\
+\xde\xfd\x0c\x2e\xfa\x86\x0c\x2d\x66\xd5\x0c\xdb\xe7\xbe\x61\x38\
+\xfb\xfa\x0b\x03\x1f\x0f\x27\x38\xfe\x39\x60\x18\x98\xdd\x40\x16\
+\xb3\x33\x00\x1d\xc7\xc0\x0d\x64\xf1\x02\x1d\xc3\x0e\x6c\x98\x00\
+\xeb\x91\xef\x7f\x80\x85\x0b\xc3\x77\x80\x00\x02\x3b\xe0\xd1\xa3\
+\x57\xd7\x6e\x03\xeb\xec\x1f\x3f\xfe\x02\xcb\xea\x3f\xc0\xd6\xca\
+\x1f\x60\x8d\xf6\x1f\xd8\x4e\x60\x40\xc3\x40\x1d\xdf\x7f\x01\xa3\
+\x42\x04\x88\x95\x18\x8e\x1c\xbf\xcd\x60\x28\xa5\xc5\xe0\xf3\xcb\
+\x91\x61\xc3\x94\x7b\x0c\x67\x5e\x7d\x65\x10\xe2\xe7\x86\x24\x42\
+\x0e\x4e\x06\x66\x60\xa1\xc3\x0a\xb4\x92\x15\xec\x00\x3e\xa0\x13\
+\x04\x80\x91\xc1\xce\xf0\xf9\x1b\xd0\xb0\x1f\xa0\xd2\x8d\xe1\x07\
+\x40\x00\x81\x13\xe1\xd1\xa3\xeb\xcb\x6e\xdf\x3e\x5b\xc5\xc3\xc3\
+\x23\x0f\xcc\xe5\x8c\xa0\x2c\xf6\xef\x1f\x38\xc7\x83\xab\x0b\x48\
+\x14\x31\x22\x15\x48\x8c\xd0\x76\x1e\x33\xc3\x3f\x60\x02\xfd\xff\
+\xfb\xf7\x3f\xce\x6f\xac\xdc\x4b\xff\x5d\x56\xfe\x5f\x60\xc8\xe0\
+\xae\x2a\xc9\xf0\x9d\x01\x58\x7c\x33\x00\xeb\x10\x60\xf1\xcd\x01\
+\x74\x00\x27\x03\x30\xf1\x31\x08\x01\xc5\xbe\x32\x7c\xfa\x0c\x34\
+\xf7\x3b\xb0\x86\xfa\xc7\xf0\x0d\x20\x80\xc0\x0e\x78\xf5\xea\xfa\
+\x71\x20\x4e\x06\x32\xe5\x89\xad\x21\xd1\xc0\x3f\x70\x45\xf1\x95\
+\x33\x65\xd9\xbf\xf3\x71\x4c\x79\x0c\xcc\x2e\x9a\xd2\x40\xeb\xff\
+\x03\x4b\x8e\xbf\xd0\x28\xe0\x05\x3a\x40\x18\xc8\xfb\xc2\xf0\xfb\
+\x1b\x30\xe0\x7f\x82\x5d\xf8\x1d\x20\x80\x90\x2d\x7b\x05\xc5\xe4\
+\x01\x29\x36\x90\xaf\xfe\xff\xbf\xff\x3e\xf8\xde\xbd\x0f\x7c\x9c\
+\x9a\xfa\x40\x4b\x41\xc1\xcf\x02\xc6\x2c\xe0\x92\xff\x37\x30\x22\
+\x84\x80\x90\x1d\xe4\x80\x9f\xa0\x10\x00\x08\x20\x16\xaa\xf4\x2e\
+\xf4\x79\x18\x18\xa4\x39\xd4\x81\x89\x7e\x96\x63\x9c\x3a\x5f\x94\
+\x9b\x2d\x03\xe3\x2f\x60\x75\x0d\x4c\x38\xcf\x7f\xde\x63\xb8\xf2\
+\xfb\x16\xc3\xf7\x9f\x7f\x18\x7e\xfc\xfa\xc9\x00\xaa\xcd\xdf\xbd\
+\x7d\x0a\x2a\x54\x41\xfd\x82\x6f\x00\x01\xc4\x08\x29\xd5\x18\xc9\
+\xb3\x98\x15\xa8\x4f\x97\x9b\x81\x41\x92\x1d\x94\x68\x56\x6a\xda\
+\xf1\x87\x89\x48\x70\x32\x7c\x79\xfd\x8b\xe1\xe3\x87\x6f\x0c\xdf\
+\xbe\x7c\xff\xf7\xe3\xdb\xcf\xbf\xbf\x7f\xfd\xf9\xf7\xfb\x07\xb0\
+\x59\xf2\xe3\xff\xdf\x7f\xa0\xc4\xf1\x1b\x68\xfd\x0d\x86\x13\x0c\
+\x2f\x18\x5a\x01\x02\x88\x32\x07\xb0\x00\xf5\x89\xb0\x02\x5b\x1b\
+\xc0\x24\xc0\xcc\x68\x0f\xcc\xa7\xe1\xc0\xd4\x2d\x08\xa4\xbf\x83\
+\xb2\x18\x10\xff\x04\xa5\x74\x28\xfe\x0e\x8a\x73\x30\xfe\x0b\xc4\
+\x0c\x0c\xc0\x60\x60\xb8\x02\x10\x60\x00\x48\xb0\x3b\x49\xa1\xf4\
+\xe9\xc0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xe5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x05\x77\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xcc\x62\x20\x09\x30\x32\x48\x31\
+\xfc\xfe\x37\x93\xe1\xff\x7f\x61\x06\x36\xe6\x44\x86\xff\x0c\x37\
+\x49\xd1\xfe\xff\x4c\x1a\x98\x06\x08\x20\x26\x06\x72\x00\x23\x10\
+\xff\xf8\x93\xab\x22\x27\xe0\xa3\xa3\x2a\x62\xc9\xf0\xfd\x4f\x35\
+\x50\x8c\x91\x1c\xa3\x00\x02\x88\x3c\x07\xfc\xfd\x6f\xc1\xf0\xf7\
+\x5f\x7e\x5e\x82\x09\x43\x7d\xa1\x2d\x03\x13\x0b\x53\x2c\x30\x34\
+\x02\xc9\x31\x0a\x20\x80\xc8\x71\x00\x2b\xc3\xb7\x5f\x1d\xa6\x66\
+\x0a\x9c\xb6\xd6\x4a\x0c\x5a\xda\x12\x0c\xee\xce\x6a\x0c\x0c\xdf\
+\x7f\x55\x01\xe5\xf8\x48\x35\x0c\x20\x80\x48\x77\xc0\xbf\x7f\x71\
+\x2c\xdc\xec\xf6\x51\x61\x86\x0c\x9f\xff\x30\x31\x3c\xfe\xc0\xc0\
+\x10\x18\x60\xc8\x20\x20\xce\x6f\xcc\xf0\xfb\x6f\x3e\xa9\xc6\x01\
+\x04\x10\x13\x89\x71\x2f\xc1\xf0\xed\x77\x85\xa7\xbb\x0e\x83\x96\
+\x8e\x34\xc3\xed\x57\x0c\x0c\x4f\xdf\x33\x30\x08\x4a\x08\x32\xb8\
+\x79\xea\x31\x30\xfc\xfc\x5d\x0c\x54\xa5\x49\x8a\x91\x00\x01\x44\
+\x9a\x03\x7e\xfc\x2e\x14\x95\x11\x56\xf1\x0d\x30\x62\xb8\xf3\x86\
+\x81\xe1\xf5\x57\x06\x86\xb7\xdf\x18\x18\x1e\xbf\x63\x60\x30\xb4\
+\xd1\x61\x90\x55\x97\xe1\x07\xaa\xa9\x23\xc5\x48\x80\x00\x22\xde\
+\x01\xff\xff\x5b\x33\xfc\xfb\x9f\xe3\xe8\x69\xc8\xf0\x8b\x95\x83\
+\xe1\xfe\x5b\x06\x86\xf7\x3f\x18\x18\xde\x7c\x67\x60\x78\xf1\x09\
+\x98\x04\x98\x58\x19\x2c\x3d\x4c\x19\x98\x58\x99\x43\x80\xd1\x14\
+\x40\xac\xb1\x00\x01\x44\xac\x03\xb8\x18\x7e\xfe\x6a\x95\xd1\x90\
+\xe3\x32\xb2\xd2\x64\xb8\xf4\x0c\x68\xf1\x57\x48\x08\x80\xe8\x37\
+\xc0\x50\x78\x02\x0c\x11\x21\x25\x59\x06\x45\x3d\x35\x16\x60\x54\
+\xd4\x01\xa3\x4b\x94\x18\x83\x01\x02\x88\x89\xc8\x84\x17\xc1\xc0\
+\xca\x66\x6f\xed\x6e\xc2\xf0\x08\xe8\xdb\xc7\xc0\x78\x7f\xf7\x1d\
+\x62\x31\x32\x7e\xf1\x99\x81\x41\xc1\xca\x98\x81\x4d\x80\xd7\x90\
+\xe1\xcf\xdf\x2c\x62\x8c\x06\x08\x20\x62\x1c\x20\xcc\xf0\xeb\x4f\
+\xbd\x86\xa5\x3e\x83\x94\x8a\x14\xc3\xd9\xc7\x90\xa0\x7f\xfd\x0d\
+\x13\xbf\xfc\xc8\xc0\xf0\x9b\x97\x9f\x41\xd2\x50\x9f\x01\xe8\x80\
+\x12\x60\xb4\xa9\x13\x32\x1c\x20\x80\x08\x3b\xe0\xcf\xef\x0a\x76\
+\x41\x41\x39\x1b\x67\x5d\x86\x5b\xaf\x81\x09\xfd\x0f\xd0\x92\x7f\
+\x0c\x0c\xbf\xfe\x62\xc7\xdf\x80\x21\x23\xac\xab\xc3\xc0\x2d\x2d\
+\xc5\xc3\xf0\xe7\x4f\x23\x21\xe3\x01\x02\x88\x90\x03\xec\x19\xfe\
+\x32\xa4\x19\xb9\x98\x30\x30\xf1\x70\x33\x3c\x01\x06\x3d\x33\x13\
+\xa4\x24\xc6\x85\xff\x03\x1d\xc1\xc2\xce\xca\x20\x63\x69\x0e\x54\
+\xcc\x1c\x04\x0c\x05\x5f\x7c\x16\x00\x04\x10\x13\x9e\x3c\xcf\x0e\
+\x4c\x78\x15\x7c\x72\x32\x7c\x56\xd6\x6a\x0c\xb7\x5e\x00\x0d\x87\
+\x65\x08\x3c\x18\x5c\x52\xff\x02\x16\x89\x72\xd2\x0c\xc2\xaa\xaa\
+\xac\x0c\xbf\x7e\xd5\x03\x85\x78\x71\x59\x03\x10\x40\xb8\x1d\xf0\
+\xe7\x6f\x1c\xd0\x2b\x1e\x0e\x3e\x16\x0c\x5f\xfe\x30\x82\x53\x3b\
+\x2b\x13\x29\x65\x16\x03\x83\x94\xb9\x09\x03\x2b\x2f\xaf\x31\x30\
+\x2a\xca\x71\xa9\x03\x08\x20\x5c\x46\x4a\x02\x23\xbb\x52\xc9\x5c\
+\x97\xc1\x54\x5f\x9c\xe1\xca\x53\xa0\xe5\xcc\xa8\x86\xe3\xc2\xf0\
+\xfa\xea\x37\x03\x03\xa7\x30\x3f\x83\x98\x81\x01\x90\xf3\x2f\x03\
+\x28\xa4\x8f\xcd\x22\x80\x00\xc2\xee\x80\x3f\x7f\x2a\x99\x85\x85\
+\x15\xfd\x7c\xf5\x19\x9e\x00\xcb\xfa\xcf\xbf\x20\xbe\x67\x62\x84\
+\x60\x46\x3c\x98\x09\x09\x33\x00\x13\xac\xb4\x91\x1e\x03\x8f\xac\
+\x8c\x30\xc3\xef\xdf\xf5\xd8\xec\x03\x08\x20\x16\x2c\x25\x9e\x23\
+\xc3\xaf\x7f\xe9\x4e\x3e\xa6\x0c\x2a\x72\x9c\x0c\xdb\xae\x31\x30\
+\x88\x02\xeb\x38\x66\xb2\x6a\x7b\x60\x82\xe4\x60\x62\xd0\x74\x32\
+\x63\x38\xbd\x64\x63\x20\xb0\x3c\xf1\x63\x60\x62\xda\x80\x2c\x0f\
+\x10\x40\x2c\x18\x0e\xfa\xf1\xbb\x4a\x42\x53\x81\x2d\xc2\x47\x89\
+\xe1\x39\x30\xde\x79\xb8\x80\xd9\x8a\x99\x81\x6c\x00\x0a\x15\x31\
+\x7d\x29\x86\x0f\x37\x35\x19\x6e\x1f\xbb\xdc\xcc\xc0\xc9\x7e\x10\
+\x28\xfc\x1e\x26\x0f\x10\x40\xa8\x0e\xf8\xf3\x2f\x95\x89\x83\xc3\
+\x25\x36\xd1\x8c\x41\x1e\x68\xeb\x4d\x60\xf0\x8b\xf1\x63\xfa\x9e\
+\x11\x47\xa2\xc3\xd9\x80\x60\x67\x60\xb0\xf3\x33\x60\x78\x72\xf5\
+\xbe\xce\xf7\xaf\x3f\x4a\x81\x09\xaa\x0a\x26\x07\x10\x40\x2c\x48\
+\x4e\x95\x67\xf8\xfe\xbb\xc0\x35\xd2\x90\x21\xcc\x51\x8c\xe1\xd7\
+\x17\x06\x06\x2d\x71\x48\xc1\xf3\x17\x94\xa8\x80\x85\xcf\x3f\x50\
+\xa9\xfc\x1f\x92\xdd\xfe\x81\x63\x0b\x29\x5b\xfe\x47\x64\x43\x6c\
+\x40\x4a\x5b\x80\xc1\x39\xc8\x98\x61\xcb\xbc\x43\x29\x40\x07\xac\
+\x03\x0a\x9d\x01\x89\x03\x04\x10\xc2\x01\xbf\x7e\x17\x88\xab\x8a\
+\xaa\x45\x46\xea\x01\x4b\x5e\xa0\xc5\x4c\xff\x19\x94\x04\x21\x16\
+\x22\x5b\xfc\x1f\xea\x90\xbf\xe0\x2a\x02\x2a\x07\x73\x00\x92\x5a\
+\x10\xfe\x0d\xc4\xbf\xfe\x41\x8c\x67\x06\x06\xa3\x7f\x88\x16\xc3\
+\x9d\x4b\x0f\x44\x6f\x9c\x7b\x52\x02\x14\x8a\x00\x89\x03\x04\x10\
+\xc2\x01\xcc\x4c\xdc\x3f\xbe\xff\x66\x68\xaa\xdb\x06\x2c\x7f\xfe\
+\xc1\x83\x94\x91\x91\x70\x10\x63\x95\x67\x44\x2a\xb5\x60\xc1\x0d\
+\xcc\x4a\xef\x3f\xfc\x00\xe5\x69\x2e\x98\x18\x40\x00\x21\x1c\xc0\
+\xc4\x54\xf2\xf1\xfd\xb7\xcd\x1f\x5f\x7f\xe1\x84\x7a\x8a\x16\x80\
+\x11\x98\xa0\x7e\x03\x3d\x7b\x0c\x26\x00\x10\x40\x48\x69\x80\xc1\
+\x10\x18\xd1\x21\xc0\x12\x90\x19\xc8\xa6\x8d\x03\xfe\x83\xc2\x85\
+\x89\x09\xe8\x00\x50\xb8\x6c\x04\x09\x01\x04\x10\xc2\x01\xbf\xff\
+\xb5\xab\xaa\x89\x5b\xaa\x29\x8b\x00\x2b\xc0\xff\x34\xb1\x9f\x15\
+\x18\x05\x0f\x81\x25\xdb\xe5\xab\x4f\x0d\x60\x0e\x00\x08\x20\x24\
+\x07\xfc\xe1\x11\x55\x57\x61\xd0\xf1\xd2\x63\xf8\xf9\x9d\x36\xe1\
+\xcf\x01\x8c\xf9\xdf\x47\xee\x31\x5c\xbe\xf8\x88\x0d\x26\x06\x10\
+\x40\x48\x89\x90\xe1\xef\xfd\x37\x7f\x19\x7e\xdc\x80\xd4\x66\xb4\
+\x00\xcc\xc0\xf2\xe0\xcd\x8b\x3f\xa0\x02\x19\x1e\xc5\x00\x01\xc4\
+\x82\x9e\x70\x41\x65\xf8\x7f\x46\xda\x38\x00\x56\x8f\x20\x03\x80\
+\x00\x62\x41\x4e\x20\x6c\x6c\x4c\x0c\xc0\x76\x07\xc3\x1f\x16\xda\
+\x38\x80\x85\x83\x81\xe1\x13\x1b\x6a\xb9\x0e\x10\x40\xc8\x25\x21\
+\x13\xc7\xaf\xf7\x0c\x02\x9f\x9f\x31\xfc\x01\xb5\xad\x68\x91\x08\
+\x7f\xb3\x30\x7c\xf8\xf9\x1a\x14\x16\x70\x7b\x01\x02\x08\xe1\x00\
+\x36\xd6\xa5\x37\x4f\xdd\xc8\xbb\x79\xe2\x1a\xa1\x52\x95\x82\x42\
+\x80\x81\xf1\x3f\x13\x13\x33\xb0\x20\x5a\x0f\x13\x03\x08\x30\x00\
+\x49\xfd\xb6\x3b\x2a\xaa\x2e\x21\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x06\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x05\xe0\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xce\xae\x60\xf8\xf6\x3b\x8c\x81\
+\x95\x69\x3a\x10\x2f\x64\xf8\xcf\xf0\x8b\x81\x86\xe0\xff\x99\x34\
+\x30\x0d\x10\x40\x4c\x70\x91\xbf\xff\xca\x83\x7d\xd4\x0c\xa5\x44\
+\xb9\x67\x31\x7c\xfc\xb9\x07\xc8\x77\x63\x60\x64\xa0\x39\x00\x08\
+\x20\x84\x03\x7e\xfe\x61\x8a\xf5\xd7\x60\x38\xb6\x34\x84\x21\x3c\
+\x44\xc7\x96\xf5\x3f\xc3\x4e\x60\x88\x2c\x04\xca\x68\xd0\xd2\x01\
+\x00\x01\xc4\x84\xc4\xfe\xf7\xe2\xdd\x1f\x06\x59\x31\x4e\x86\xf9\
+\xad\x8e\x0c\xab\x66\x06\x30\x98\x19\xcb\xc5\x31\x7c\xfe\x79\x10\
+\xe8\xb8\x26\xa0\x3c\x1f\x2d\x1c\x00\x10\x40\xc8\x0e\x60\xf8\xfe\
+\x87\x81\xe1\xd3\x5f\x06\x86\x8f\x5f\x19\x18\x9c\x4d\x25\x18\xd6\
+\x4e\xf7\x65\x68\xa8\x71\x15\x93\x91\x11\xaa\x65\xf8\xf2\xf3\x04\
+\xc3\xbf\xff\x51\xc0\x68\x61\xa5\xa6\x03\x00\x02\x08\xd5\x01\x40\
+\xcb\x7f\xfc\x66\x60\x78\xf8\x81\x81\xe1\xf2\x53\x06\x86\x2f\xdf\
+\x19\x18\xb2\x23\x34\x18\xd6\xcc\x0a\x64\x88\x8a\xb3\xd0\x64\x61\
+\x62\x5a\x0a\x74\xc8\x36\x86\x7f\xff\xac\xa8\x95\x3e\x00\x02\x08\
+\xc5\x01\xdf\x80\x96\x7f\x01\xe2\xa7\x9f\x19\x18\x1e\x00\x1d\x71\
+\xf1\x05\x03\xc3\x89\x7b\x0c\x0c\x2c\x6c\xec\x0c\x8d\xb9\xa6\x0c\
+\x0b\xa7\x86\x30\x58\x3b\x6b\xbb\x30\xfc\xf9\x7f\x10\xe8\xd2\x19\
+\x40\x2d\x6a\x94\x3a\x00\x20\x80\x10\x0e\x60\x84\xf8\xfe\xd3\x0f\
+\x06\x86\x77\x40\x9f\x7f\xfe\x09\x8c\x0a\x20\xfb\xc9\x27\x06\x86\
+\xd3\x8f\x20\x0e\x91\x97\x15\x64\xe8\xad\x71\x62\xa8\xab\xf3\x65\
+\x91\x96\x17\x4f\x67\xf8\xfe\xeb\x00\xc3\xef\x3f\x05\x40\xdd\x9c\
+\xe4\x3a\x00\x20\x80\x50\xa3\x00\xe4\x80\x5f\x10\x07\x7c\x00\x5a\
+\xfe\xe1\x27\x84\xff\x09\x48\x3f\x01\x86\xca\xa1\xbb\x0c\x0c\xe7\
+\x9e\x30\x30\x58\x99\xc9\x30\x4c\xeb\x0f\x66\x88\xcf\x70\x91\xe4\
+\xe1\xe7\xed\x67\xf8\xf6\xf3\x22\x30\x5a\x42\xd1\xcd\x23\x06\x00\
+\x04\x10\x0b\x32\xe7\xc7\x1f\x48\x08\xbc\xff\x01\x0f\x14\x0c\xf0\
+\x11\xe8\x98\x07\xef\x19\x18\x24\x78\x19\x19\x7c\x3d\x35\x18\x0c\
+\x0d\x64\x19\xd6\x6c\xbc\xac\x7a\xe4\xc0\x95\x55\x0c\xdf\x7f\x6c\
+\x66\xe0\x60\x6d\x65\x60\x64\x3c\x49\xac\x03\x00\x02\x88\x05\x3d\
+\x0d\x80\x43\xe0\x1b\xd0\x2b\x4c\x0c\xb8\xd3\xd9\x7f\x88\x23\x6f\
+\xbe\x61\x60\x90\x15\xe4\x66\x48\x49\xb6\x60\xb0\xb4\x51\x67\x58\
+\xb3\xe6\xb4\xef\xfd\x0b\xb7\xbd\x18\x98\x19\x67\x30\xb0\xb1\x74\
+\x02\xd5\x3d\x26\xe4\x00\x80\x00\x62\x41\xcf\x86\x1f\xa1\x21\xc0\
+\x42\x64\x60\x5e\x04\xe6\x96\x6b\xc0\xc4\xaa\x20\x2c\xc8\x90\x91\
+\xe3\xc6\x70\xfa\xac\x06\xf3\xee\xad\x67\xb2\x3f\x3e\x7c\xea\x05\
+\x74\xc4\x54\x06\x66\xe6\xc9\x40\x65\x38\x8b\x75\x80\x00\x62\x41\
+\x4e\x84\xa0\x10\x00\xc5\x3f\x08\xb3\x32\x13\x1f\x8f\xff\x80\xc6\
+\xbf\x04\x26\x54\x6e\x36\x60\xb6\xd0\x92\x63\x48\x55\x97\x61\x38\
+\xb0\xf7\xaa\xe2\xf9\x83\xe7\x7b\xfe\x7e\xfa\x18\xc1\xc0\xce\x56\
+\x07\x8c\x96\xed\xd8\xf4\x02\x04\x10\x46\x08\xbc\x03\x25\x3e\x12\
+\x1d\x00\xf3\xc0\x17\xa0\x43\x9e\x02\x73\x8d\x20\x17\x13\x83\xa1\
+\xbd\x2e\x83\xa2\xae\x22\xc3\xb1\xbd\x97\x4d\x9e\x9e\xbb\xb4\x95\
+\xe1\xef\xcf\x8d\x0c\xac\x6c\xf5\x40\x87\x5c\x42\xd6\x06\x10\x40\
+\x28\x01\xfd\xef\x1f\xd0\x11\xc0\x44\xf6\x0b\x48\xff\x21\x15\xff\
+\x05\xd5\x67\x90\x74\xf3\xe6\x0b\x03\xc3\xa9\x07\xc0\xf4\xc4\xc8\
+\xc3\x60\x1f\x60\xc9\x60\x15\x1b\xc4\xc8\xaf\xa4\x1c\xc0\xf0\xf7\
+\xef\x49\x86\xdf\xbf\x5b\x80\x4a\x64\x60\x76\x02\x04\x10\x46\x4c\
+\xff\xfe\xc7\x40\x56\x21\xf7\x1f\x09\x33\x33\x41\xd2\xd0\xcb\x8f\
+\x0c\x0c\x37\x9e\x33\x30\xf0\x4a\x8a\x32\xe8\x07\x7b\x31\xa8\xfa\
+\xfb\x71\x70\x4b\x4a\x56\x03\x7d\xba\x16\xa6\x0f\x20\x80\xb0\x3a\
+\x80\x5a\x00\xe4\x10\x90\x8b\x5e\x03\x43\xe4\x07\xd0\x5c\x76\x5e\
+\x1e\x06\x66\x56\x60\x55\xf2\xff\xbf\x10\x4c\x0d\x40\x00\xb1\xa0\
+\x6b\x02\x05\x25\x39\x80\x11\x2d\x34\xc0\x62\x40\x07\x30\x03\xed\
+\xfb\xf9\xe1\x0b\xc3\xa3\x03\xe7\x18\xde\xdd\xbc\xc9\xf0\xef\xf7\
+\xaf\x05\x0c\xac\xac\x5d\x30\xb5\x00\x01\xc4\x82\x1e\x8c\x7f\xff\
+\x33\x50\x5c\xcf\x80\x3c\xce\x04\xcc\x11\xbf\x7f\xfd\x62\x78\x79\
+\xf6\x26\xc3\xf3\xd3\x67\x18\xfe\x7c\xf9\x72\x02\x68\x71\x33\x10\
+\x6f\x43\x56\x0b\x10\x40\x28\x0e\x00\xc5\x1b\x2b\x50\x84\x03\xa8\
+\x99\x95\x89\xbc\x60\x60\x86\x56\xd6\x2f\x6f\xde\x67\x78\x78\xec\
+\x0c\xc3\xf7\x57\x2f\x9f\x30\xb0\xb0\x34\x31\xb0\xb3\x2f\x05\x95\
+\x75\xe8\x5a\x00\x02\x08\xc5\x01\x20\xcb\xd9\x81\x06\x70\x71\x00\
+\xd9\x24\x06\x03\x13\x50\x2f\x33\x10\xbf\x79\xf4\x9a\xe1\xde\xb1\
+\x73\x0c\xaf\x6f\xdc\xfe\x00\x2c\x4e\x17\x32\xb0\xb1\x75\x02\xa5\
+\x9f\xe3\xd2\x07\x10\x40\x2c\xc8\xe1\x0f\xca\xfb\x20\x07\x80\x0a\
+\x14\x62\x4b\x42\x26\xa0\x1e\x56\x76\x60\xed\x09\x2c\x3e\xaf\xed\
+\x3b\xc7\xf0\xf0\xf4\x65\x60\x3c\xff\xd9\x08\xb4\xb8\x0e\x28\x7d\
+\x89\x90\x7e\x80\x00\x42\x29\x09\x41\x86\xb1\x03\x2d\xe7\x06\x86\
+\x00\x33\x11\x21\xc0\x06\x54\xf7\x03\x58\x7a\xdd\x3c\x72\x83\xe1\
+\xfa\xe1\xf3\x0c\x3f\xde\x7d\x38\xc3\xc0\x06\xac\x8c\xd8\x58\x37\
+\x10\x1b\x72\x00\x01\x84\x91\x06\xc0\x51\x00\xf4\x11\x13\x23\xf6\
+\xcc\xce\x08\x14\x67\x05\x3a\x12\x94\x5b\xef\x5f\x79\xc2\x70\x6a\
+\xeb\x49\x86\x0f\x8f\x9e\xbf\x63\x60\x61\x6e\x67\xe0\x60\x9f\x0d\
+\xaa\x30\x49\x89\x3a\x80\x00\x42\x71\x00\x28\x0e\xc1\x21\xc0\x86\
+\xe9\x80\xff\xd0\x34\xc2\x02\x94\x7b\x7c\xef\x3d\xc3\x91\x0d\xc7\
+\x19\x1e\x5f\x7b\xf0\x0d\x98\xa7\x67\x03\x53\x2d\xde\x78\xc6\x07\
+\x00\x02\x08\xc5\x01\xa0\x2a\x18\x54\x78\x70\xb3\xa3\xda\x0c\x76\
+\x18\x30\xb8\xdf\xbe\xfe\xc1\x70\x68\xe3\x45\x86\x4b\x07\xae\x30\
+\xfc\xfa\xf6\x1d\x58\xf7\xb3\x81\xf2\xf3\x11\x4a\xb2\x2c\x40\x00\
+\xa1\x38\x00\x14\xfc\xec\x40\xcb\x19\xff\x41\x7c\x0c\x0a\x04\x0e\
+\x60\x63\xeb\xe7\xaf\xff\x0c\xc7\xf6\xdc\x64\x38\xb8\xe1\x34\xc3\
+\xb7\xd7\xef\x2f\x03\x2d\x6e\x03\xe2\x15\xd4\x28\x2d\x01\x02\x08\
+\x25\x17\xb0\xb1\x40\xe2\x9f\x05\xc4\x66\x87\xb8\xe0\xdc\xc9\x27\
+\x0c\x7b\xd6\x9e\x63\x78\x72\xed\xd1\x1b\x06\x36\xe6\x2e\x06\x1e\
+\x8e\x79\x40\xb5\x6f\xa9\x55\x5c\x03\x04\x10\x4a\x08\x80\x1c\x20\
+\xc0\x05\x2c\x0d\x81\xbe\xbe\x7f\xf7\x23\xc3\xa6\xe5\x67\x19\x2e\
+\x1c\xbc\x01\xac\xa0\xff\xaf\x60\xe0\x64\x6d\x02\xa6\xc0\xfb\xf0\
+\x72\x96\x4a\x00\x20\x80\x90\x43\x80\x51\x48\x80\x85\xe1\x1f\xb0\
+\x2c\x5e\xb9\xe0\x2c\xc3\xc1\x4d\x97\x18\xbe\x7f\xfe\xb6\x1f\x68\
+\x71\x0d\xd0\xe2\x63\xb4\xea\x9a\x01\x04\x10\xc2\x01\x6c\xcc\x8c\
+\x27\x8f\x3c\x60\x58\x38\xfd\x38\xc3\xf3\x9b\x2f\xae\x33\x70\xb2\
+\xf4\x31\x70\xb1\xcd\x63\x80\xe4\x38\x9a\x01\x80\x00\x42\x38\x80\
+\x85\x79\xce\xfe\x4d\x97\x02\x80\x35\xc9\x22\x06\x3e\xf6\x69\xc0\
+\x10\x79\xcd\x40\x07\x00\x10\x60\x00\x67\x40\x00\x61\x44\x18\x7f\
+\x31\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = "\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x12\
+\x05\x0c\xb7\x27\
+\x00\x6e\
+\x00\x6f\x00\x61\x00\x74\x00\x75\x00\x6e\x00\x6c\x00\x6f\x00\x6f\x00\x70\x00\x73\x00\x6f\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
+\x00\x10\
+\x03\x05\x50\x67\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x70\x00\x61\x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\x91\x67\x27\
+\x00\x63\
+\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x05\x42\x7f\x67\
+\x00\x63\
+\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x5f\x00\x6d\x00\x6f\x00\x75\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x04\x32\xd5\x67\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x65\x00\x6a\x00\x65\x00\x63\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x03\x75\x07\x07\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = "\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x02\
+\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x09\x48\
+\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x25\x33\
+\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x4a\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x15\xb7\
+\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xfd\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/contrib/titan/vtkhandler.py b/contrib/titan/vtkhandler.py
new file mode 100644
index 0000000..b6703a3
--- /dev/null
+++ b/contrib/titan/vtkhandler.py
@@ -0,0 +1,292 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""Modules for handling vtkRenderWindowInteractor events"""
+from PyQt4 import QtCore, QtGui
+from core.modules.basic_modules import String
+from core.modules.vistrails_module import Module, NotCacheable
+from core.modules.module_registry import get_module_registry
+from core.modules.module_configure import StandardModuleConfigurationWidget
+from core.modules.python_source_configure import PythonEditor
+from core.vistrail.module_function import ModuleFunction, ModuleParam
+import urllib
+
+################################################################################
+class vtkInteractionHandler(NotCacheable, Module):
+    """
+    vtkInteractionHandler allow users to insert callback code for interacting
+    with the vtkRenderWindowInteractor InteractionEvent
+    
+    """
+
+    # Since vtkCommand is not wrapped in Python, we need to hardcoded all events
+    # string from vtkCommand.h
+    vtkEvents = [
+        'AnyEvent',
+        'DeleteEvent',
+        'StartEvent',
+        'EndEvent',
+        'RenderEvent',
+        'ProgressEvent',
+        'PickEvent',
+        'StartPickEvent',
+        'EndPickEvent',
+        'AbortCheckEvent',
+        'ExitEvent',
+        'LeftButtonPressEvent',
+        'LeftButtonReleaseEvent',
+        'MiddleButtonPressEvent',
+        'MiddleButtonReleaseEvent',
+        'RightButtonPressEvent',
+        'RightButtonReleaseEvent',
+        'EnterEvent',
+        'LeaveEvent',
+        'KeyPressEvent',
+        'KeyReleaseEvent',
+        'CharEvent',
+        'ExposeEvent',
+        'ConfigureEvent',
+        'TimerEvent',
+        'MouseMoveEvent',
+        'MouseWheelForwardEvent',
+        'MouseWheelBackwardEvent',
+        'ResetCameraEvent',
+        'ResetCameraClippingRangeEvent',
+        'ModifiedEvent',
+        'WindowLevelEvent',
+        'StartWindowLevelEvent',
+        'EndWindowLevelEvent',
+        'ResetWindowLevelEvent',
+        'SetOutputEvent',
+        'ErrorEvent',
+        'WarningEvent',
+        'StartInteractionEvent',
+        'InteractionEvent',
+        'EndInteractionEvent',
+        'EnableEvent',
+        'DisableEvent',
+        'CreateTimerEvent',
+        'DestroyTimerEvent',
+        'PlacePointEvent',
+        'PlaceWidgetEvent',
+        'CursorChangedEvent',
+        'ExecuteInformationEvent',
+        'RenderWindowMessageEvent',
+        'WrongTagEvent',
+        'StartAnimationCueEvent',
+        'AnimationCueTickEvent',
+        'EndAnimationCueEvent',
+        'VolumeMapperRenderEndEvent',
+        'VolumeMapperRenderProgressEvent',
+        'VolumeMapperRenderStartEvent',
+        'VolumeMapperComputeGradientsEndEvent',
+        'VolumeMapperComputeGradientsProgressEvent',
+        'VolumeMapperComputeGradientsStartEvent',
+        'WidgetModifiedEvent',
+        'WidgetValueChangedEvent',
+        'WidgetActivateEvent',
+        'ConnectionCreatedEvent',
+        'ConnectionClosedEvent',
+        'DomainModifiedEvent',
+        'PropertyModifiedEvent',
+        'UpdateEvent',
+        'RegisterEvent',
+        'UnRegisterEvent',
+        'UpdateInformationEvent']
+    
+    def __init__(self):
+        Module.__init__(self)
+        self.observer = None
+        self.handler = None
+        self.shareddata = None
+
+    def compute(self):
+        """ compute() -> None
+        Actually compute nothing
+        """        
+        self.observer = self.forceGetInputFromPort('Observer')
+        self.handler = self.forceGetInputFromPort('Handler', '')
+        self.shareddata = self.forceGetInputListFromPort('SharedData')
+        if len(self.shareddata)==1:
+            self.shareddata = self.shareddata[0]
+        if self.observer:
+            source = urllib.unquote(self.handler)
+            observer = self.observer.vtkInstance
+            for e in vtkInteractionHandler.vtkEvents:
+                f = e[0].lower() + e[1:]
+                f = f.replace('Event', 'Handler')
+                source += ('\nif locals().has_key("%s"):\n' % f +
+                           '\tobserver.AddObserver("%s", ' % e +
+                           'self.eventHandler)\n')
+            exec(source)
+            if hasattr(self.observer.vtkInstance, 'PlaceWidget'):
+                self.observer.vtkInstance.PlaceWidget()
+
+    def eventHandler(self, obj, event):
+        """ eventHandler(obj: vtkObject, event: str) -> None
+        A proxy for all vtk events to direct to the correct calls
+        
+        """
+        if self.handler!='':
+            source = urllib.unquote(self.handler)
+            f = event[0].lower() + event[1:]
+            f = f.replace('Event', 'Handler')
+            myGlobals = globals()
+            myGlobals.update({'self':self})
+            exec(source + ('\nif locals().has_key("%s"):\n' % f)+
+                 ('\t%s(obj, self.shareddata)' % f)) in myGlobals, locals()
+
+    def clear(self):
+        """ clear() -> None
+        Remove event handler so the object can be freed correctly
+        
+        """
+        # Remove all observers
+        if self.observer:
+            for e in vtkInteractionHandler.vtkEvents:
+                self.observer.vtkInstance.RemoveObservers(e)
+        Module.clear(self)
+
+    def repaintCells(self):
+        """ repaintCells() -> None
+        Redraw all cells on the current sheet
+        
+        """
+        from packages.spreadsheet.spreadsheet_controller \
+             import spreadsheetController
+        from packages.spreadsheet.spreadsheet_event \
+             import RepaintCurrentSheetEvent
+        spreadsheetController.postEventToSpreadsheet(RepaintCurrentSheetEvent())
+
+class HandlerConfigurationWidget(StandardModuleConfigurationWidget):
+    """
+    HandlerConfigurationWidget is simialr to PythonSource
+    configuration widget except that it doesn't allow add/remove
+    ports. In this configuration widget, the user will enter their
+    python code to handle a specifc event
+    
+    """
+    def __init__(self, module, controller, parent=None):
+        """ HandlerConfigurationWidget(module: Module,
+                                       controller: VistrailController,
+                                       parent: QWidget)
+                                       -> HandlerConfigurationWidget
+        Setup the dialog to have a single python source editor and 2
+        buttons
+        
+        """
+        StandardModuleConfigurationWidget.__init__(self, module,
+                                                   controller, parent)
+        self.setWindowTitle('Handler Python Script Editor')
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().setMargin(0)
+        self.layout().setSpacing(0)
+        self.createEditor()
+        self.createButtonLayout()        
+    
+    def findHandlerFunction(self):
+        """ findHandlerFunction() -> int
+        Return the function id associated with input port 'source'
+        
+        """
+        fid = -1
+        for i in xrange(self.module.getNumFunctions()):
+            if self.module.functions[i].name=='Handler':
+                fid = i
+                break
+        return fid
+
+    def createEditor(self):
+        """ createEditor() -> None
+        Add a python editor into the widget layout
+        
+        """
+        self.codeEditor = PythonEditor(self)
+        fid = self.findHandlerFunction()
+        if fid!=-1:
+            f = self.module.functions[fid]
+            self.codeEditor.setPlainText(urllib.unquote(f.params[0].strValue))
+        self.codeEditor.document().setModified(False)
+        self.layout().addWidget(self.codeEditor, 1)
+        
+    def createButtonLayout(self):
+        """ createButtonLayout() -> None
+        Construct Ok & Cancel button
+        
+        """
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.okButton = QtGui.QPushButton('&OK', self)
+        self.okButton.setAutoDefault(False)
+        self.okButton.setFixedWidth(100)
+        self.buttonLayout.addWidget(self.okButton)
+        self.cancelButton = QtGui.QPushButton('&Cancel', self)
+        self.cancelButton.setAutoDefault(False)
+        self.cancelButton.setShortcut('Esc')
+        self.cancelButton.setFixedWidth(100)
+        self.buttonLayout.addWidget(self.cancelButton)
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.okButton, QtCore.SIGNAL('clicked(bool)'), self.okTriggered)
+        self.connect(self.cancelButton, QtCore.SIGNAL('clicked(bool)'), self.close)
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return the recommendation size of this widget
+        
+        """
+        return QtCore.QSize(512, 512)
+
+    def updateController(self, controller):
+        """ updateController() -> None        
+        Based on the input of the python editor, update the vistrail
+        controller appropriately
+        
+        """
+        if self.codeEditor.document().isModified():
+            code = urllib.quote(str(self.codeEditor.toPlainText()))
+            functions = [('Handler', [code])]
+            self.controller.update_functions(self.module, functions)
+
+    def okTriggered(self, checked = False):
+        """ okTriggered(checked: bool) -> None
+        Update vistrail controller (if neccesssary) then close the widget
+        
+        """
+        self.updateController(self.controller)
+        self.emit(QtCore.SIGNAL('doneConfigure()'))
+        self.close()
+
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    registry = get_module_registry()
+    vIO = registry.get_descriptor_by_name(
+        'edu.utah.sci.vistrails.vtk',
+# Wendel
+        'vtkInteractorObserver').module
+    registry.add_module(vtkInteractionHandler, configureWidgetType=HandlerConfigurationWidget)
+    registry.add_input_port(vtkInteractionHandler, 'Observer', vIO)
+    registry.add_input_port(vtkInteractionHandler, 'Handler', String, True)
+    registry.add_input_port(vtkInteractionHandler, 'SharedData', Module)
+    registry.add_output_port(vtkInteractionHandler, 'self',
+                             vtkInteractionHandler)
diff --git a/contrib/titan/vtkviewcell.py b/contrib/titan/vtkviewcell.py
new file mode 100644
index 0000000..a4826d0
--- /dev/null
+++ b/contrib/titan/vtkviewcell.py
@@ -0,0 +1,1032 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# File QVTKViewWidget.py
+# File for displaying a vtkRenderWindow in a Qt's QWidget ported from
+# VTK/GUISupport/QVTK. Combine altogether to a single class: QVTKViewWidget
+################################################################################
+import vtk
+from PyQt4 import QtCore, QtGui
+import sip
+from core import system
+from core.modules.module_registry import get_module_registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import vtkcell_rc
+import gc
+from gui.qt import qt_super
+import core.db.action
+from core.vistrail.action import Action
+from core.vistrail.port import Port
+from core.vistrail import module
+from core.vistrail import connection
+from core.vistrail.module_function import ModuleFunction
+from core.vistrail.module_param import ModuleParam
+from core.vistrail.location import Location
+from core.modules.vistrails_module import ModuleError
+import copy
+
+################################################################################
+
+class VTKViewCell(SpreadsheetCell):
+    """
+    VTKViewCell is a VisTrails Module that can display vtkRenderWindow inside a cell
+    
+    """
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        renderView = self.forceGetInputFromPort('SetRenderView')
+        if renderView==None:
+            raise ModuleError(self, 'A vtkRenderView input is required.')
+        self.cellWidget = self.displayAndWait(QVTKViewWidget, (renderView,))
+
+AsciiToKeySymTable = ( None, None, None, None, None, None, None,
+                       None, None,
+                       "Tab", None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None,
+                       "space", "exclam", "quotedbl", "numbersign",
+                       "dollar", "percent", "ampersand", "quoteright",
+                       "parenleft", "parenright", "asterisk", "plus",
+                       "comma", "minus", "period", "slash",
+                       "0", "1", "2", "3", "4", "5", "6", "7",
+                       "8", "9", "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",
+                       "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+                       "h", "i", "j", "k", "l", "m", "n", "o",
+                       "p", "q", "r", "s", "t", "u", "v", "w",
+                       "x", "y", "z", "braceleft", "bar", "braceright",
+                       "asciitilde", "Delete",
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None)
+
+class QVTKViewWidget(QCellWidget):
+    """
+    QVTKViewWidget is the actual rendering widget that can display
+    vtkRenderer inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVTKViewWidget(parent: QWidget, f: WindowFlags) -> QVTKViewWidget
+        Initialize QVTKViewWidget with a toolbar with its own device
+        context
+        
+        """
+        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+
+        self.interacting = None
+        self.mRenWin = None
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.toolBarType = QVTKViewWidgetToolBar
+        self.setAnimationEnabled(True)
+        
+    def removeObserversFromInteractorStyle(self):
+        """ removeObserversFromInteractorStyle() -> None        
+        Remove all python binding from interactor style observers for
+        safely freeing the cell
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.RemoveObservers("InteractionEvent")
+            style.RemoveObservers("EndPickEvent")
+            style.RemoveObservers("CharEvent")
+            style.RemoveObservers("MouseWheelForwardEvent")
+            style.RemoveObservers("MouseWheelBackwardEvent")
+        
+    def addObserversToInteractorStyle(self):
+        """ addObserversToInteractorStyle() -> None        
+        Assign observer to the current interactor style
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.AddObserver("InteractionEvent", self.interactionEvent)
+            style.AddObserver("EndPickEvent", self.interactionEvent)
+            style.AddObserver("CharEvent", self.charEvent)
+            style.AddObserver("MouseWheelForwardEvent", self.interactionEvent)
+            style.AddObserver("MouseWheelBackwardEvent", self.interactionEvent)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        
+        """
+        self.renderer_maps = {}
+        for ren in self.getRendererList():
+            self.mRenWin.RemoveRenderer(ren)
+        self.removeObserversFromInteractorStyle()
+        self.SetRenderWindow(None)
+        QCellWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Updates the cell contents with new vtkRenderer
+        
+        """
+        (renderView, ) = inputPorts
+        renWin = renderView.vtkInstance.GetRenderWindow()
+        renWin.DoubleBufferOn()
+        self.SetRenderWindow(renWin)
+        renderView.vtkInstance.ResetCamera()
+        self.addObserversToInteractorStyle()
+        
+#        renWin = self.GetRenderWindow()
+#        renderers = [renderView.vtkInstance.GetRenderer()]
+#        iren = renWin.GetInteractor()
+        # Update interactor style
+#         self.removeObserversFromInteractorStyle()
+#         if renderView==None:
+#             if iStyle==None:
+#                 iStyleInstance = vtk.vtkInteractorStyleTrackballCamera()
+#             else:
+#                 iStyleInstance = iStyle.vtkInstance
+#             iren.SetInteractorStyle(iStyleInstance)
+#         self.addObserversToInteractorStyle()
+        # Capture window into history for playback
+        # Call this at the end to capture the image after rendering
+        QCellWidget.updateContents(self, inputPorts)
+
+    def GetRenderWindow(self):
+        """ GetRenderWindow() -> vtkRenderWindow
+        Return the associated vtkRenderWindow
+        
+        """
+        if not self.mRenWin:
+            win = vtk.vtkRenderWindow()
+            win.DoubleBufferOn()
+            self.SetRenderWindow(win)
+            del win
+
+        return self.mRenWin
+
+    def SetRenderWindow(self,w):
+        """ SetRenderWindow(w: vtkRenderWindow)        
+        Set a new render window to QVTKViewWidget and initialize the
+        interactor as well
+        
+        """
+        if w == self.mRenWin:
+            return
+        
+        if self.mRenWin:
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+                
+        self.mRenWin = w
+        
+        if self.mRenWin:
+            self.mRenWin.Register(None)
+            if system.systemType=='Linux':
+                try:
+                    vp = '_%s_void_p' % (hex(int(QtGui.QX11Info.display()))[2:])
+                except TypeError:
+                    #This was change for PyQt4.2
+                    if isinstance(QtGui.QX11Info.display(),QtGui.Display):
+                        display = sip.unwrapinstance(QtGui.QX11Info.display())
+                        vp = '_%s_void_p' % (hex(display)[2:])
+                self.mRenWin.SetDisplayId(vp)
+                if not self.mRenWin.GetMapped():
+                    self.mRenWin.GetInteractor().Initialize()
+                    system.XDestroyWindow(self.mRenWin.GetGenericDisplayId(),
+                                          self.mRenWin.GetGenericWindowId())
+                    self.mRenWin.Finalize()
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))
+            else:
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))                
+            if self.isVisible():
+                self.mRenWin.Start()
+
+    def GetInteractor(self):
+        """ GetInteractor() -> vtkInteractor
+        Return the vtkInteractor control this QVTKViewWidget
+        """
+        return self.GetRenderWindow().GetInteractor()
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Process window and interaction events
+        
+        """
+        if e.type()==QtCore.QEvent.ParentAboutToChange:
+            if self.mRenWin:
+                if self.mRenWin.GetMapped():
+                    self.mRenWin.Finalize()
+        else:
+            if e.type()==QtCore.QEvent.ParentChange:
+                if self.mRenWin:
+                    self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                    if self.isVisible():
+                        self.mRenWin.Start()
+        
+        if QtCore.QObject.event(self,e):
+            return 1
+
+        if e.type() == QtCore.QEvent.KeyPress:
+            self.keyPressEvent(e)
+            if e.isAccepted():
+                return e.isAccepted()
+
+        return qt_super(QVTKViewWidget, self).event(e)
+        
+        # return QtGui.QWidget.event(self,e)
+        # Was this right? Wasn't this supposed to be QCellWidget.event()?
+
+    def resizeWindow(self, width, height):
+        """ resizeWindow(width: int, height: int) -> None
+        Work around vtk bugs for resizing window
+        
+        """
+        ########################################################
+        # VTK - BUGGGGGGGGG - GRRRRRRRRR
+        # This is a 'bug' in vtkWin32OpenGLRenderWindow(.cxx)
+        # If a render window is mapped to screen, the actual
+        # window size is the client area of the window in Win32.
+        # However, this real window size is only updated through
+        # vtkWin32OpenGLRenderWindow::GetSize(). So this has to
+        # be called here to get the cell size correctly. This
+        # invalidates the condition in the next SetSize().
+        # We can use self.mRenWin.SetSize(0,0) here but it will
+        # cause flickering and decrease performance!
+        # SetPosition(curX,curY) also works here but slower.
+        self.mRenWin.GetSize()
+        
+        self.mRenWin.SetSize(width, height)
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().SetSize(width, height)
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the vtkRenderWindow size then QVTKViewWidget resized
+        
+        """
+        qt_super(QVTKViewWidget, self).resizeEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.resizeWindow(self.width(), self.height())
+        self.mRenWin.Render()
+
+    def moveEvent(self,e):
+        """ moveEvent(e: QEvent) -> None
+        Echo the move event into vtkRenderWindow
+        
+        """
+        qt_super(QVTKViewWidget, self).moveEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.mRenWin.SetPosition(self.x(),self.y())
+
+    def paintEvent(self, e):
+        """ paintEvent(e: QPaintEvent) -> None
+        Paint the QVTKViewWidget with vtkRenderWindow
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        if hasattr(self.mRenWin, 'UpdateGLRegion'):
+            self.mRenWin.UpdateGLRegion()
+        self.mRenWin.Render()
+
+    def SelectActiveRenderer(self,iren):
+        """ SelectActiveRenderer(iren: vtkRenderWindowIteractor) -> None
+        Only make the vtkRenderer below the mouse cursor active
+        
+        """
+        epos = iren.GetEventPosition()
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            ren.SetInteractive(ren.IsInViewport(epos[0], epos[1]))
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        isDoubleClick = e.type()==QtCore.QEvent.MouseButtonDblClick
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      ctrl,
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),
+                                      isDoubleClick,
+                                      None)
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonPressEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonPressEvent",
+                  QtCore.Qt.RightButton:"RightButtonPressEvent"}
+
+        self.SelectActiveRenderer(iren)
+
+        if ctrl:
+            e.ignore()
+            return
+
+        self.interacting = self.getActiveRenderer(iren)
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0), 0, None)
+
+        iren.InvokeEvent("MouseMoveEvent")
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("EnterEvent")
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("LeaveEvent")
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonReleaseEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonReleaseEvent",
+                  QtCore.Qt.RightButton:"RightButtonReleaseEvent"}
+
+        self.interacting = None
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def keyPressEvent(self,e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q', 'e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl,shift,ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyPressEvent")
+
+        if ascii_key:
+            iren.InvokeEvent("CharEvent")
+
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q','e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl, shift, ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyReleaseEvent")
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+        
+        self.SelectActiveRenderer(iren)
+        
+        if e.delta()>0:
+            iren.InvokeEvent("MouseWheelForwardEvent")
+        else:
+            iren.InvokeEvent("MouseWheelBackwardEvent")
+
+    def focusInEvent(self,e):
+        """ focusInEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def focusOutEvent(self,e):
+        """ focusOutEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def contextMenuEvent(self,e):
+        """ contextMenuEvent(e: QContextMenuEvent) -> None        
+        Make sure to get the right mouse position for the context menu
+        event, i.e. also the right click
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = int(e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = int(e.modifiers()&QtCore.Qt.ShiftModifier)
+        iren.SetEventInformationFlipY(e.x(),e.y(),ctrl,shift,chr(0),0,None)
+        iren.InvokeEvent("ContextMenuEvent")
+
+    def ascii_to_key_sym(self,i):
+        """ ascii_to_key_sym(i: int) -> str
+        Convert ASCII code into key name
+        
+        """
+        global AsciiToKeySymTable
+        return AsciiToKeySymTable[i]
+
+    def qt_key_to_key_sym(self,i):
+        """ qt_key_to_key_sym(i: QtCore.Qt.Keycode) -> str
+        Convert Qt key code into key name
+        
+        """
+        handler = {QtCore.Qt.Key_Backspace:"BackSpace",
+                   QtCore.Qt.Key_Tab:"Tab",
+                   QtCore.Qt.Key_Backtab:"Tab",
+                   QtCore.Qt.Key_Return:"Return",
+                   QtCore.Qt.Key_Enter:"Return",
+                   QtCore.Qt.Key_Shift:"Shift_L",
+                   QtCore.Qt.Key_Control:"Control_L",
+                   QtCore.Qt.Key_Alt:"Alt_L",
+                   QtCore.Qt.Key_Pause:"Pause",
+                   QtCore.Qt.Key_CapsLock:"Caps_Lock",
+                   QtCore.Qt.Key_Escape:"Escape",
+                   QtCore.Qt.Key_Space:"space",
+                   QtCore.Qt.Key_End:"End",
+                   QtCore.Qt.Key_Home:"Home",
+                   QtCore.Qt.Key_Left:"Left",
+                   QtCore.Qt.Key_Up:"Up",
+                   QtCore.Qt.Key_Right:"Right",
+                   QtCore.Qt.Key_Down:"Down",
+                   QtCore.Qt.Key_SysReq:"Snapshot",
+                   QtCore.Qt.Key_Insert:"Insert",
+                   QtCore.Qt.Key_Delete:"Delete",
+                   QtCore.Qt.Key_Help:"Help",
+                   QtCore.Qt.Key_0:"0",
+                   QtCore.Qt.Key_1:"1",
+                   QtCore.Qt.Key_2:"2",
+                   QtCore.Qt.Key_3:"3",
+                   QtCore.Qt.Key_4:"4",
+                   QtCore.Qt.Key_5:"5",
+                   QtCore.Qt.Key_6:"6",
+                   QtCore.Qt.Key_7:"7",
+                   QtCore.Qt.Key_8:"8",
+                   QtCore.Qt.Key_9:"9",
+                   QtCore.Qt.Key_A:"a",
+                   QtCore.Qt.Key_B:"b",
+                   QtCore.Qt.Key_C:"c",
+                   QtCore.Qt.Key_D:"d",
+                   QtCore.Qt.Key_E:"e",
+                   QtCore.Qt.Key_F:"f",
+                   QtCore.Qt.Key_G:"g",
+                   QtCore.Qt.Key_H:"h",
+                   QtCore.Qt.Key_I:"i",
+                   QtCore.Qt.Key_J:"h",
+                   QtCore.Qt.Key_K:"k",
+                   QtCore.Qt.Key_L:"l",
+                   QtCore.Qt.Key_M:"m",
+                   QtCore.Qt.Key_N:"n",
+                   QtCore.Qt.Key_O:"o",
+                   QtCore.Qt.Key_P:"p",
+                   QtCore.Qt.Key_Q:"q",
+                   QtCore.Qt.Key_R:"r",
+                   QtCore.Qt.Key_S:"s",
+                   QtCore.Qt.Key_T:"t",
+                   QtCore.Qt.Key_U:"u",
+                   QtCore.Qt.Key_V:"v",
+                   QtCore.Qt.Key_W:"w",
+                   QtCore.Qt.Key_X:"x",
+                   QtCore.Qt.Key_Y:"y",
+                   QtCore.Qt.Key_Z:"z",
+                   QtCore.Qt.Key_Asterisk:"asterisk",
+                   QtCore.Qt.Key_Plus:"plus",
+                   QtCore.Qt.Key_Minus:"minus",
+                   QtCore.Qt.Key_Period:"period",
+                   QtCore.Qt.Key_Slash:"slash",
+                   QtCore.Qt.Key_F1:"F1",
+                   QtCore.Qt.Key_F2:"F2",
+                   QtCore.Qt.Key_F3:"F3",
+                   QtCore.Qt.Key_F4:"F4",
+                   QtCore.Qt.Key_F5:"F5",
+                   QtCore.Qt.Key_F6:"F6",
+                   QtCore.Qt.Key_F7:"F7",
+                   QtCore.Qt.Key_F8:"F8",
+                   QtCore.Qt.Key_F9:"F9",
+                   QtCore.Qt.Key_F10:"F10",
+                   QtCore.Qt.Key_F11:"F11",
+                   QtCore.Qt.Key_F12:"F12",
+                   QtCore.Qt.Key_F13:"F13",
+                   QtCore.Qt.Key_F14:"F14",
+                   QtCore.Qt.Key_F15:"F15",
+                   QtCore.Qt.Key_F16:"F16",
+                   QtCore.Qt.Key_F17:"F17",
+                   QtCore.Qt.Key_F18:"F18",
+                   QtCore.Qt.Key_F19:"F19",
+                   QtCore.Qt.Key_F20:"F20",
+                   QtCore.Qt.Key_F21:"F21",
+                   QtCore.Qt.Key_F22:"F22",
+                   QtCore.Qt.Key_F23:"F23",
+                   QtCore.Qt.Key_F24:"F24",
+                   QtCore.Qt.Key_NumLock:"Num_Lock",
+                   QtCore.Qt.Key_ScrollLock:"Scroll_Lock"}
+        if i in handler:            
+            return handler[i]
+        else:
+            return "None"
+
+    def getRendererList(self):
+        """ getRendererList() -> list
+        Return a list of vtkRenderer running in this QVTKViewWidget
+        """
+        result = []
+        renWin = self.GetRenderWindow()
+        renderers = renWin.GetRenderers()
+        renderers.InitTraversal()
+        for i in xrange(renderers.GetNumberOfItems()):
+            result.append(renderers.GetNextItem())
+        return result
+
+    def getActiveRenderer(self, iren):
+        """ getActiveRenderer(iren: vtkRenderWindowwInteractor) -> vtkRenderer
+        Return the active vtkRenderer under mouse
+        
+        """
+        epos = list(iren.GetEventPosition())
+        if epos[1]<0:
+            epos[1] = -epos[1]
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            if ren.IsInViewport(epos[0], epos[1]):
+                return ren
+        return None
+
+    def findSheetTabWidget(self):
+        """ findSheetTabWidget() -> QTabWidget
+        Find and return the sheet tab widget
+        
+        """
+        p = self.parent()
+        while p:
+            if hasattr(p, 'isSheetTabWidget'):
+                if p.isSheetTabWidget()==True:
+                    return p
+            p = p.parent()
+        return None
+
+    def getRenderersInCellList(self, sheet, cells):
+        """ isRendererIn(sheet: spreadsheet.StandardWidgetSheet,
+                         cells: [(int,int)]) -> bool
+        Get the list of renderers in side a list of (row, column)
+        cells.
+        
+        """
+        rens = []
+        for (row, col) in cells:
+            cell = sheet.getCell(row, col)
+            if hasattr(cell, 'getRendererList'):
+                rens += cell.getRendererList()
+        return rens
+
+    def getSelectedCellWidgets(self):
+        sheet = self.findSheetTabWidget()
+        if sheet:
+            iren = self.mRenWin.GetInteractor()
+            ren = self.interacting
+            if not ren: ren = self.getActiveRenderer(iren)
+            if ren:
+                cells = sheet.getSelectedLocations()
+                if (ren in self.getRenderersInCellList(sheet, cells)):
+                    return [sheet.getCell(row, col)
+                            for (row, col) in cells
+                            if hasattr(sheet.getCell(row, col), 
+                                       'getRendererList')]
+        return []
+
+    def interactionEvent(self, istyle, name):
+        """ interactionEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure interactions sync across selected renderers
+        
+        """
+        if name=='MouseWheelForwardEvent':
+            istyle.OnMouseWheelForward()
+        if name=='MouseWheelBackwardEvent':
+            istyle.OnMouseWheelBackward()
+        ren = self.interacting
+        if not ren:
+            ren = self.getActiveRenderer(istyle.GetInteractor())
+        if ren:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            for cell in self.getSelectedCellWidgets():
+                if cell!=self and hasattr(cell, 'getRendererList'): 
+                    rens = cell.getRendererList()
+                    for r in rens:
+                        if r!=ren:
+                            dcam = r.GetActiveCamera()
+                            dcam.SetPosition(cpos)
+                            dcam.SetFocalPoint(cfol)
+                            dcam.SetViewUp(cup)
+                            r.ResetCameraClippingRange()
+                    cell.update()
+
+    def charEvent(self, istyle, name):
+        """ charEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure key presses also sync across selected renderers
+
+        """
+        iren = istyle.GetInteractor()
+        ren = self.interacting
+        if not ren: ren = self.getActiveRenderer(iren)
+        if ren:
+            keyCode = iren.GetKeyCode()
+            if keyCode in ['w','W','s','S','r','R','p','P']:
+                for cell in self.getSelectedCellWidgets():
+                    if hasattr(cell, 'GetInteractor'):
+                        selectedIren = cell.GetInteractor()
+                        selectedIren.SetKeyCode(keyCode)
+                        selectedIren.GetInteractorStyle().OnChar()
+                        selectedIren.Render()
+            istyle.OnChar()
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+        
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+        
+        """
+        w2i = vtk.vtkWindowToImageFilter()
+        w2i.ReadFrontBufferOff()
+        w2i.SetInput(self.mRenWin)
+        # Render twice to get a clean image on the back buffer
+        self.mRenWin.Render()
+        self.mRenWin.Render()
+        w2i.Update()
+        writer = vtk.vtkPNGWriter()
+        writer.SetInputConnection(w2i.GetOutputPort())
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def captureWindow(self):
+        """ captureWindow() -> None        
+        Capture the window contents to file
+        
+        """
+        fn = QtGui.QFileDialog.getSaveFileName(None,
+                                               "Save file as...",
+                                               "screenshot.png",
+                                               "Images (*.png)")
+        if fn.isNull():
+            return
+        self.saveToPNG(str(fn))
+        
+    def grabWindowPixmap(self):
+        """ grabWindowImage() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        uchar = self.saveToPNG(None)
+
+        ba = QtCore.QByteArray()
+        buf = QtCore.QBuffer(ba)
+        buf.open(QtCore.QIODevice.WriteOnly)
+        for i in xrange(uchar.GetNumberOfTuples()):
+            c = uchar.GetValue(i)
+            buf.putChar(chr(c))
+        buf.close()
+        
+        pixmap = QtGui.QPixmap()
+        pixmap.loadFromData(ba, 'PNG')
+        return pixmap
+
+    def dumpToFile(self, filename):
+        """dumpToFile() -> None
+        Dumps itself as an image to a file, calling saveToPNG
+        """
+        self.saveToPNG(filename)
+
+class QVTKViewWidgetCapture(QtGui.QAction):
+    """
+    QVTKViewWidgetCapture is the action to capture the vtk rendering
+    window to an image
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKViewWidgetCapture(parent: QWidget) -> QVTKViewWidgetCapture
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera.png"),
+                               "&Capture image to file",
+                               parent)
+        self.setStatusTip("Capture the rendered image to a file")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.captureWindow()
+
+class QVTKViewWidgetSaveCamera(QtGui.QAction):
+    """
+    QVTKViewWidgetSaveCamera is the action to capture the current camera
+    of the vtk renderers and save it back to the pipeline
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKViewWidgetSaveCamera(parent: QWidget) -> QVTKViewWidgetSaveCamera
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               "Save &Camera",
+                               parent)
+        self.setStatusTip("Save current camera views to the pipeline")
+
+    def setCamera(self, controller):
+        ops = []
+        pipeline = controller.current_pipeline                        
+        cellWidget = self.toolBar.getSnappedWidget()
+        renderers = cellWidget.getRendererList()
+        for ren in renderers:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            rendererId = cellWidget.renderer_maps[ren]
+            # Looking for SetActiveCamera()
+            camera = None
+            renderer = pipeline.modules[rendererId]
+            for c in pipeline.connections.values():
+                if c.destination.moduleId==rendererId:
+                    if c.destination.name=='SetActiveCamera':
+                        camera = pipeline.modules[c.source.moduleId]
+                        break
+            
+            if not camera:
+                # Create camera
+                vtk_package = 'edu.utah.sci.vistrails.vtk'
+                camera = controller.create_module(vtk_package, 'vtkCamera', '',
+                                                  0.0, 0.0)
+                ops.append(('add', camera))
+
+                # Connect camera to renderer
+                camera_conn = controller.create_connection(camera, 'self',
+                                                           renderer, 
+                                                           'SetActiveCamera')
+                ops.append(('add', camera_conn))
+            # update functions
+            def convert_to_str(arglist):
+                new_arglist = []
+                for arg in arglist:
+                    new_arglist.append(str(arg))
+                return new_arglist
+            functions = [('SetPosition', convert_to_str(cpos)),
+                         ('SetFocalPoint', convert_to_str(cfol)),
+                         ('SetViewUp', convert_to_str(cup))]
+            ops.extend(controller.update_functions_ops(camera, functions))
+
+        action = core.db.action.create_action(ops)
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        controller.select_latest_version()
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        visApp = QtCore.QCoreApplication.instance()
+        if hasattr(visApp, 'builderWindow'):
+            builderWindow = visApp.builderWindow
+            if builderWindow:
+                info = self.toolBar.sheet.getCellPipelineInfo(
+                    self.toolBar.row, self.toolBar.col)
+                if info:
+                    info = info[0]
+                    viewManager = builderWindow.viewManager
+                    view = viewManager.ensureVistrail(info['locator'])
+                    if view:
+                        controller = view.controller
+                        controller.change_selected_version(info['version'])
+                        self.setCamera(controller)
+                        
+                
+class QVTKViewWidgetToolBar(QCellToolBar):
+    """
+    QVTKViewWidgetToolBar derives from QCellToolBar to give the VTKViewCell
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(QVTKViewWidgetCapture(self))
+        self.addAnimationButtons()
+        self.appendAction(QVTKViewWidgetSaveCamera(self))
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    identifier = 'edu.utah.sci.vistrails.vtk'
+    registry = get_module_registry()
+    registry.add_module(VTKViewCell)
+    registry.add_input_port(VTKViewCell, "Location", CellLocation)
+    import core.debug
+    for (port,module) in [("SetRenderView",'vtkRenderView')]:
+        try:
+            registry.add_input_port(VTKViewCell, port,'(%s:%s)'%(identifier,module))
+ 
+        except Exception, e:
+            core.debug.warning(str(e))
+
+    registry.add_output_port(VTKViewCell, "self", VTKViewCell)
diff --git a/contrib/trimesh2.py b/contrib/trimesh2.py
new file mode 100644
index 0000000..f00638a
--- /dev/null
+++ b/contrib/trimesh2.py
@@ -0,0 +1,123 @@
+# VisTrails package for trimesh2 support
+# Copyright Carlos Eduardo Scheidegger, 2007
+# Get trimesh2 at www.cs.princeton.edu/gfx/proj/trimesh2/
+#  or a patched version with more available file formats
+# at www.sci.utah.edu/~cscheid/software
+
+# License: GPLv2 or later
+
+# ChangeLog:
+
+# 2007-03-13  Carlos Scheidegger  <cscheid at juggernaut>
+# 	* uses core.system.list2cmd to generate command lines.
+# 2007-03-12  Carlos Scheidegger  <cscheid at juggernaut>
+# 	* First release
+##############################################################################
+
+import core.modules
+import core.modules.module_registry
+from core.modules.vistrails_module import Module, ModuleError
+from core.system import list2cmdline
+import os
+
+_mesh_filter_path = None
+
+identifier = 'edu.utah.sci.cscheid.trimesh2'
+version = '0.1'
+name = 'trimesh2'
+
+##############################################################################
+# MeshFilter
+class MeshFilter(Module):
+
+    def guess_input_format(self, input_file_name):
+        i = input_file_name.rfind('.')
+        if i == -1:
+            return None
+        else:
+            return input_file_name[i:]
+
+    def compute(self):
+        self.checkInputPort('input_file')
+        input_file = self.getInputFromPort('input_file')
+        if self.hasInputFromPort('output_format'):
+            output_suffix = self.getInputFromPort('output_format')
+        else:
+            output_suffix = self.guess_input_format(input_file.name)
+        if not output_suffix:
+            output_suffix = '.off'
+        output_file = self.interpreter.filePool.create_file(suffix=output_suffix)
+        values = [_mesh_filter_path,
+                  input_file.name,
+                  output_file.name]
+        cmdline = list2cmdline(values)
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, 'Execution failed')
+        self.setResult('output_file', output_file)
+
+##############################################################################
+# PlanarSubdiv
+class PlanarSubdiv(MeshFilter):
+
+    def compute(self):
+        self.checkInputPort('input_file')
+        self.checkInputPort('iterations')
+        iters = self.getInputFromPort('iterations')
+        if iters < 1:
+            raise ModuleError(self, 'iterations must be >=1')
+        input_file = self.getInputFromPort('input_file')
+        if self.hasInputFromPort('output_format'):
+            output_suffix = self.getInputFromPort('output_format')
+        else:
+            output_suffix = self.guess_input_format(input_file.name)
+        if not output_suffix:
+            output_suffix = '.off'
+        output_file = self.interpreter.filePool.create_file(suffix=output_suffix)
+
+        values = [_mesh_filter_path,
+                  input_file.name,
+                  '-subdiv',
+                  output_file.name]
+        cmdline = list2cmdline(values)
+        print cmdline
+        result = os.system(cmdline)
+        if result != 0:
+            raise ModuleError(self, 'Execution failed')
+
+        for i in xrange(iters-1):
+            cmdline = '%s %s -subdiv %s'  % (_mesh_filter_path,
+                                             output_file.name,
+                                             output_file.name)
+            print cmdline
+            result = os.system(cmdline)
+            if result != 0:
+                raise ModuleError(self, 'Execution failed')
+            
+        self.setResult('output_file', output_file)
+    
+
+def initialize(executable_path=None):
+    global _mesh_filter_path
+    if not executable_path:
+        print "Assuming mesh_filter is in path"
+        _mesh_filter_path = 'mesh_filter'
+    else:
+        print "Assuming mesh_filter is in '%s'" % executable_path
+        _mesh_filter_path = executable_path + '/mesh_filter'
+
+    reg = core.modules.module_registry
+
+    reg.add_module(MeshFilter)
+
+    reg.add_input_port(MeshFilter, 'input_file',
+                       core.modules.basic_modules.File)
+    reg.add_input_port(MeshFilter, 'output_format',
+                       core.modules.basic_modules.String)
+    reg.add_output_port(MeshFilter, 'output_file',
+                        core.modules.basic_modules.File)
+
+    reg.add_module(PlanarSubdiv)
+    reg.add_input_port(PlanarSubdiv, 'iterations',
+                       core.modules.basic_modules.Integer)
diff --git a/contrib/vtksnl/__init__.py b/contrib/vtksnl/__init__.py
new file mode 100644
index 0000000..03508a3
--- /dev/null
+++ b/contrib/vtksnl/__init__.py
@@ -0,0 +1,53 @@
+###########################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# VTK-SNL Package for VisTrails (Sandia National Laboratories)
+################################################################################
+
+"""The Visualization ToolKit (VTK) is an open source, freely available
+software system for 3D computer graphics, image processing, and
+visualization used by thousands of researchers and developers around
+the world. This version of the VTK package requires the Sandia
+National Laboratories version of the VTK libraries.
+
+http://www.vtk.org"""
+
+identifier = 'edu.utah.sci.vistrails.vtksnl'
+name = 'VTKSNL'
+version = '0.9.1'
+
+def package_dependencies():
+    import core.packagemanager
+    manager = core.packagemanager.get_package_manager()
+    if manager.has_package('edu.utah.sci.vistrails.spreadsheet'):
+        return ['edu.utah.sci.vistrails.spreadsheet']
+    else:
+        return []
+
+def package_requirements():
+    import core.requirements
+    if not core.requirements.python_module_exists('vtksnl'):
+        raise core.requirements.MissingRequirement('vtksnl')
+    if not core.requirements.python_module_exists('PyQt4'):
+        print 'PyQt4 is not available. There will be no interaction',
+        print 'between VTK and the spreadsheet.'
+    import vtksnl 
diff --git a/contrib/vtksnl/base_module.py b/contrib/vtksnl/base_module.py
new file mode 100644
index 0000000..e9cadac
--- /dev/null
+++ b/contrib/vtksnl/base_module.py
@@ -0,0 +1,203 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# This describes basic modules used by other VTK module
+################################################################################
+import vtksnl
+from core.modules.module_registry import registry
+from core.modules.vistrails_module import Module, ModuleError
+from itertools import izip
+
+################################################################################
+
+class vtkBaseModule(Module):
+    """
+    vtkBaseModule is the base class for all VTK modules in VisTrails, it acts
+    as a wrapper to direct all input/output ports to appropriate VTK function
+    calls
+    
+    """
+
+    def __init__(self):
+        """ vtkBaseModule() -> vtkBaseModule
+        Instantiate an emptt VTK Module with real VTK instance
+        
+        """
+        Module.__init__(self)
+        self.vtkInstance = None
+
+    def is_cacheable(self):
+        # VTK objects are by default cacheable only if they're subclasses
+        # of vtkAlgorithm
+        return (issubclass(self.vtkClass, vtksnl.vtkAlgorithm)
+                and (not issubclass(self.vtkClass, vtksnl.vtkAbstractMapper)))
+
+    def call_input_function(self, function, params):
+        """self.call_input_function(function, params) -> None
+        Calls the input function on the vtkInstance, or a special
+        input function if one exists in the class."""
+        if hasattr(self, '_special_input_function_' + function):
+            attr = getattr(self, '_special_input_function_' + function)
+        else:
+            try:
+                attr = getattr(self.vtkInstance, function)
+            except AttributeError:
+                # Compensates for overload by exploiting the fact that
+                # no VTK method has underscores.
+                f = function.find('_')
+                if f != -1:
+                    function = function[:f]
+                attr = getattr(self.vtkInstance, function)
+        attr(*params)
+        # print "Called ",attr,function,params
+
+    @classmethod
+    def _provide_doc(cls, port_name):
+        f = port_name.find('_')
+        if f != -1:
+            name = port_name[:f]
+        else:
+            name = port_name
+        return getattr(cls.vtkClass, name).__doc__
+
+    @classmethod
+    def provide_input_port_documentation(cls, port_name):
+        return cls._provide_doc(port_name)
+
+    @classmethod
+    def provide_output_port_documentation(cls, port_name):
+        return cls._provide_doc(port_name)
+
+    def compute(self):
+        """ compute() -> None
+        Actually perform real VTK task by directing all input/output ports
+        to VTK function calls
+        
+        """
+
+        def call_it(function, p):
+            # Translate between VisTrails objects and VTK objects
+            if p is None:
+                # None indicates a call with no parameters
+                params = []
+            elif type(p) == tuple:
+                # A tuple indicates a call with many parameters
+                params = list(p)
+            else:
+                # Otherwise, it's a single parameter
+                params = [p]
+
+            # Unwraps VTK objects
+            for i in xrange(len(params)):
+                if hasattr(params[i], 'vtkInstance'):
+                    params[i] = params[i].vtkInstance
+            try:
+                self.call_input_function(function, params)
+            except Exception, e:
+                msg = 'VTK Exception: '
+                raise ModuleError(self, msg  + str(type(e)) + ': ' + str(e))
+
+        # Always re-create vtkInstance module, no caching here
+        if self.vtkInstance:
+            del self.vtkInstance
+        self.vtkInstance = self.vtkClass()
+
+        # We need to call method ports before anything else, and in
+        # the right order.
+
+        # FIXME: This does not belong here, it belongs in the main class
+        # No time for that now
+        methods = self.is_method.values()
+        methods.sort()
+        for value in methods:
+            (_, port) = value
+            conn = self.is_method.inverse[value]
+            p = conn()
+            call_it(port, p)
+
+        # Make sure all input ports are called correctly
+        for (function, connector_list) in self.inputPorts.iteritems():
+            paramList = self.forceGetInputListFromPort(function)
+            if function[:18]=='SetInputConnection':
+                paramList = zip([int(function[18:])]*len(paramList),
+                                 paramList)
+                function = 'SetInputConnection'
+            if function=='AddInputConnection':
+                desc = registry.get_descriptor_by_name(
+                    'edu.utah.sci.vistrails.vtksnl',
+                    'vtkAlgorithmOutput')
+                for i in xrange(len(paramList)):
+                    if type(paramList[i])==desc.module:
+                        paramList[i] = (0, paramList[i])
+            for p,connector in izip(paramList, connector_list):
+                # Don't call method
+                if connector in self.is_method:
+                    continue
+                call_it(function, p)
+
+        # Call update if appropriate
+        if hasattr(self.vtkInstance, 'Update'):
+            def ProgressEvent(obj, event):
+                self.logging.update_progress(self, obj.GetProgress())
+            isAlgorithm = issubclass(self.vtkClass, vtksnl.vtkAlgorithm)
+            if isAlgorithm:
+                cbId = self.vtkInstance.AddObserver('ProgressEvent', ProgressEvent)
+            self.vtkInstance.Update()
+            if isAlgorithm:
+                self.vtkInstance.RemoveObserver(cbId)
+
+        # Then update the output ports also with appropriate function calls
+        for function in self.outputPorts.keys():
+            if function[:13]=='GetOutputPort':
+                i = int(function[13:])
+                vtkOutput = self.vtkInstance.GetOutputPort(i)
+                output = vtkBaseModule.wrapperModule('vtkAlgorithmOutput',
+                                                     vtkOutput)
+                self.setResult(function, output)
+            elif hasattr(self.vtkInstance, function):
+                retValues = getattr(self.vtkInstance, function)()
+                if issubclass(retValues.__class__, vtksnl.vtkObject):
+                    className = retValues.GetClassName()
+                    output  = vtkBaseModule.wrapperModule(className, retValues)
+                    self.setResult(function, output)                                   
+                elif (type(retValues) in [tuple, list]):
+                    result = list(retValues)
+                    for i in xrange(len(result)):
+                        if issubclass(result[i].__class__, vtksnl.vtkObject):
+                            className = result[i].GetClassName()
+                            result[i] = vtkBaseModule.wrapperModule(className,
+                                                                    result[i])
+                    self.setResult(function, type(retValues)(result))
+                else:
+                    self.setResult(function, retValues)
+
+    @staticmethod
+    def wrapperModule(classname, instance):
+        """ wrapperModule(classname: str, instance: vtk class) -> Module
+        Create a wrapper module in VisTrails with a vtk instance
+        
+        """
+        result = registry.get_descriptor_by_name(
+            'edu.utah.sci.vistrails.vtksnl',
+            classname).module()
+        result.vtkInstance = instance
+        return result
diff --git a/contrib/vtksnl/class_tree.py b/contrib/vtksnl/class_tree.py
new file mode 100644
index 0000000..75f8566
--- /dev/null
+++ b/contrib/vtksnl/class_tree.py
@@ -0,0 +1,268 @@
+# Author: Prabhu Ramachandran
+# Copyright (c) 2004, Enthought, Inc.
+# License: BSD Style.
+
+"""This module generates the class hierarchy for any given Python
+modules.  This can be used (among other things) to generate the
+traitified VTK classes in the correct order.
+
+"""
+
+import __builtin__
+
+
+class TreeNode(object):
+    """Represents a node in the class tree.
+
+    Stores information on the sub and super classes of a particular
+    class.  It also stores the inheritance level of the class inside
+    the inheritance tree (essentially how many levels of inheritance
+    are there below this class).  This inheritance level is computed
+    when the `get_level` method is called.  The `get_level` method
+    works only when the parent information is complete.
+    
+    """
+
+    def __init__(self, klass):
+        """Given a class, create a node in the tree.
+
+        Parameters
+        ----------
+        - klass : `class`
+
+          The class which is represented as a node in the tree.
+
+        """
+        self.klass = klass
+        self.name = klass.__name__
+        self.children = []
+        self.parents = []
+        # Uninitialized level is set to None
+        self.level = None
+
+    def add_parent(self, parent):
+        """Add a parent node."""
+        assert isinstance(parent, TreeNode)
+        if parent not in self.parents:
+            self.parents.append(parent)
+
+    def add_child(self, child):
+        """Add a child node. """
+        assert isinstance(child, TreeNode)
+        if child not in self.children:
+            self.children.append(child)
+
+    def get_level(self):
+        """Returns the inheritance level of the node (an int).  If the
+        level has not been set, the method computes it.  Note however,
+        that this computation will fail if the parent information is
+        incorrect.
+
+        """
+        if not self.level:
+            if self.parents:
+                self.level = max([x.get_level() for x in self.parents]) + 1
+            else:
+                self.level = 0
+        return self.level
+
+    def get_ancestors(self):
+        """Returns a list of ancestor nodes from which this class has
+        descended.
+
+        """
+        def _get_ancestors(node, ancestors):
+            ancestors.extend(node.parents)
+            for p in node.parents:
+                _get_ancestors(p, ancestors)
+        ancestors = []
+        _get_ancestors(self, ancestors)
+        return ancestors
+
+
+class ClassTree(object):
+    """Contains and generates all the class tree information.
+
+    On initialization of the instance, nothing is done.  The classes
+    are obtained using the list of modules (or a single module) that
+    is used to initialize the instance.  One must then call the
+    `create` method to generate the tree structure.  The instance of
+    the class also can be treated as an iterator which iterates over
+    the nodes of the tree.
+
+    There are two ways in which the tree hierarchy is stored.  A
+    dictionary mapping class names to the tree node and a tree
+    represented as a list of lists containing the nodes.  The tree is
+    organized based on a concept of an inheritance level.  A class
+    that has no parent classes (no base classes) is said to be at
+    level zero.  If a class inherits successively from 7 classes, it
+    is at level 6.  An example of inheritance for a vtkFoo class is
+    given below:
+
+      vtkFoo -> vtkBar -> vtkObject -> vtkObjectBase
+
+    Here, vtkObjectBase has an inheritance level of 0 and vtkFoo a
+    level of 3.  One can traverse the tree by using the level as an
+    index and find all the classes at a particular level.
+
+    Here is some example usage of this class::
+
+        >>> import vtk
+        >>> t = ClassTree(vtk)
+        >>> t.create()
+        >>> print t.get_node('vtkObject').name
+        vtkObject
+        >>> print t.get_node('vtkObject').parents[0].name
+        vtkObjectBase
+        >>> print len(t.tree[0])
+        1
+        >>> t.tree[0][0].name
+        vtkObjectBase
+    
+    """
+
+    def __init__(self, modules):
+        """Initialize the instance with the given modules.
+
+        Parameters
+        ----------
+
+        - modules : `sequence` of modules or a module
+
+          This is either a single module or a sequence of modules.
+          The instance uses these list of modules to generate the
+          class tree.
+          
+        """
+        self.nodes = {}
+        self.tree = [[]]
+        if not hasattr(modules, '__iter__'):
+            self.modules = [modules]
+        else:
+            self.modules = modules
+
+    def __iter__(self):
+        return iter(self.nodes.values())
+
+    def _generate_hierarchy(self, klass):
+        """Does the hard work of generating the class hierarchy."""
+        node = self.get_node(klass.__name__, create=1)
+        for base in klass.__bases__:
+            base_node = self.get_node_from_class(base, create=1)
+            node.add_parent(base_node)
+            base_node.add_child(node)
+            self._generate_hierarchy(base)
+
+    def get_class(self, name):
+        """Given a class name in the given modules returns the class."""
+        klass = None
+        for m in self.modules:
+            if hasattr(m, name):
+                return getattr(m, name)
+        if hasattr(__builtin__, name):
+            klass = getattr(__builtin__, name)
+        if not klass:
+            try:
+                klass = self.nodes[name].klass
+            except KeyError:
+                raise KeyError, "Cannot find class of name %s"%name
+        return klass
+
+    def add_node(self, klass):
+        """Create a node for the given class."""
+        name = klass.__name__
+        if not self.nodes.has_key(name):
+            node = TreeNode(klass)
+            self.nodes[name] = node
+            return node
+
+    def get_node(self, name, create=0):
+        """Get a node of the given name.
+
+        Parameters
+        ----------
+
+        - name : `str`
+
+          Name of the node to get.
+
+        - create : `boolean`
+
+          If True, a new node will be added if no node of the given
+          name is available.  Defaults to False.
+
+        Returns
+        -------
+
+        - `TreeNode`
+
+        """
+        if self.nodes.has_key(name):
+            return self.nodes[name]
+        elif create:
+            return self.add_node(self.get_class(name))
+
+    def get_node_from_class(self, cls, create=0):
+        """Get a node of the given class.
+
+        Parameters
+        ----------
+
+        - cls : `class`
+
+          Class of the node to get.
+
+        - create : `boolean`
+
+          If True, a new node will be added if no node of the given
+          name is available.  Defaults to False.
+
+        Returns
+        -------
+
+        - `TreeNode`
+
+        """
+        name = cls.__name__
+        if self.nodes.has_key(name):
+            return self.nodes[name]
+        elif create:
+            return self.add_node(cls)
+
+    def create(self, class_names=None):
+        """This method generates the class tree given an optional list
+        of class names.
+
+        Parameters
+        ----------
+
+        - class_names - `list` of `str`
+
+          An optional list of names of the classes to generate the
+          tree for.  Defaults to None where the class list is computed
+          from the modules.        
+
+        """
+        if class_names is None:
+            class_names = []
+            for m in self.modules:            
+                class_names.extend(dir(m))
+            
+        # Generate the nodes.
+        for name in class_names:
+            klass = self.get_class(name)
+            if klass and hasattr(klass, '__bases__'):
+                self._generate_hierarchy(klass)
+
+        # Compute the inheritance level and store the nodes in the tree.
+        for node in self:
+            d = node.get_level()
+            while len(self.tree) <= d:
+                self.tree.append([])
+            self.tree[d].append(node)
+
+        # Sort the nodes alphabetically.
+        def _comp(x, y):
+            return cmp(x.name, y.name)
+        for nodes in self.tree:
+            nodes.sort(_comp)
diff --git a/contrib/vtksnl/fix_classes.py b/contrib/vtksnl/fix_classes.py
new file mode 100644
index 0000000..90b608d
--- /dev/null
+++ b/contrib/vtksnl/fix_classes.py
@@ -0,0 +1,51 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+import vtksnl
+
+################################################################################
+# Some fixed classes that solve a few VTK API issues
+
+# This dictionary stores the patched class to vtk class mapping.
+# This would be naturally better stored as an attribute directly on the
+# patched class. VTK, however, doesn't like class attributes.
+description = {}
+
+# http://www.vtk.org/doc/nightly/html/classvtkImagePlaneWidget.html
+# SetUserControlledLookupTable needs to be set before calling
+# SetLookupTable.  VTK should do it automatically, so let's fix it
+
+
+# This fix seems to break on VTK versions larger than 5.0.3. It might also
+# be because of an interaction with python 2.6, but I haven't checked that.
+class vtkImagePlaneWidget_fixed(vtksnl.vtkImagePlaneWidget):
+    def SetLookupTable(self, lookup_table):
+        self.UserControlledLookupTableOn()
+        vtksnl.vtkImagePlaneWidget.SetLookupTable(self, lookup_table)
+
+if tuple(vtksnl.vtkVersion().GetVTKVersion().split('.')) < ('5', '0', '4'):
+    description[vtkImagePlaneWidget_fixed] = vtksnl.vtkImagePlaneWidget
+else:
+    description[id(vtkImagePlaneWidget_fixed)] = vtksnl.vtkImagePlaneWidget
+
+# Set docstring to wrap it correctly
+vtkImagePlaneWidget_fixed.SetLookupTable.__doc__ = vtksnl.vtkImagePlaneWidget.SetLookupTable.__doc__
diff --git a/contrib/vtksnl/hasher.py b/contrib/vtksnl/hasher.py
new file mode 100644
index 0000000..34909ec
--- /dev/null
+++ b/contrib/vtksnl/hasher.py
@@ -0,0 +1,36 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+# This is the user-defined hasher for VTK, that takes into account
+# incoming and outgoing connections
+from core.cache.hasher import Hasher
+
+def vtk_hasher(pipeline, module, chm):
+    outgoing_connections = pipeline.graph.edges_from(module.id)
+    incoming_connections = pipeline.graph.edges_to(module.id)
+    current_hash = Hasher.module_signature(module, chm)
+    chashes = [Hasher.connection_signature(pipeline.connections[c_id])
+               for (_, c_id) in outgoing_connections]
+    chashes += [Hasher.connection_signature(pipeline.connections[c_id])
+               for (_, c_id) in incoming_connections]
+    compound_hash = Hasher.compound_signature(chashes)
+    return Hasher.compound_signature([current_hash, compound_hash])
diff --git a/contrib/vtksnl/init.py b/contrib/vtksnl/init.py
new file mode 100644
index 0000000..118f102
--- /dev/null
+++ b/contrib/vtksnl/init.py
@@ -0,0 +1,1073 @@
+###########################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# VTK-SNL Package for VisTrails (Sandia National Laboratories)
+################################################################################
+
+from core.bundles import py_import
+import vtksnl
+
+from core.utils import all, any, VistrailsInternalError, InstanceObject
+from core.debug import debug
+from core.modules.basic_modules import Integer, Float, String, File, \
+     Variant, Color
+from core.modules.module_registry import get_module_registry
+from core.modules.vistrails_module import new_module, ModuleError
+from base_module import vtkBaseModule
+from class_tree import ClassTree
+from vtk_parser import VTKMethodParser
+import re
+import os.path
+from itertools import izip
+from vtkcell import VTKCell
+import tf_widget
+import offscreen
+import fix_classes
+import inspectors
+from hasher import vtk_hasher
+import sys
+
+################################################################################
+
+# filter some deprecation warnings coming from the fact that vtk calls
+# range() with float parameters
+
+import warnings
+warnings.filterwarnings("ignore",
+                        message="integer argument expected, got float")
+
+################################################################################
+
+if tuple(vtksnl.vtkVersion().GetVTKVersion().split('.')) < ('5', '0', '4'):
+    def get_description_class(klass):
+        """Because sometimes we need to patch VTK classes, the klass that
+        has the methods is different than the klass we want to
+        instantiate. get_description_class makes sure that for patched
+        classes we get the correct one."""
+        try:
+            return fix_classes.description[klass]
+        except KeyError:
+            return klass
+else:
+    # On VTK 5.0.4, we use the id of the class to hash, because it
+    # seems that VTK hasn't implemented hash() correctly for their
+    # classes.
+    def get_description_class(klass):
+        """Because sometimes we need to patch VTK classes, the klass that
+        has the methods is different than the klass we want to
+        instantiate. get_description_class makes sure that for patched
+        classes we get the correct one."""
+        try:
+            return fix_classes.description[id(klass)]
+        except KeyError:
+            return klass
+
+parser = VTKMethodParser()
+
+typeMapDict = {'int': Integer,
+               'long': Integer,
+               'float': Float,
+               'char*': String,
+               'char *': String,
+               'string': String,
+               'char': String,
+               'const char*': String,
+               'const char *': String}
+typeMapDictValues = [Integer, Float, String]
+
+file_name_pattern = re.compile('.*FileName$')
+set_file_name_pattern = re.compile('Set.*FileName$')
+
+def resolve_overloaded_name(name, ix, signatures):
+    # VTK supports static overloading, VisTrails does not. The
+    # solution is to check whether the current function has
+    # overloads and change the names appropriately.
+    if len(signatures) == 1:
+        return name
+    else:
+        return name + '_' + str(ix+1)
+
+def typeMap(name, package=None):
+    """ typeMap(name: str) -> Module
+    Convert from C/C++ types into VisTrails Module type
+    
+    """
+    if package is None:
+        package = identifier
+    if type(name) == tuple:
+        return [typeMap(x, package) for x in name]
+    if name in typeMapDict:
+        return typeMapDict[name]
+    else:
+        registry = get_module_registry()
+        if not registry.has_descriptor_with_name(package, name):
+            return None
+        else:
+            return registry.get_descriptor_by_name(package,
+                                                   name).module
+
+def get_method_signature(method):
+    """ get_method_signature(method: vtkmethod) -> [ret, arg]
+    Re-wrap Prabu's method to increase performance
+
+    """
+    doc = method.__doc__
+    tmptmp = doc.split('\n')
+    tmp = []
+    for l in tmptmp:
+        l = l.strip('\n \t')
+        if l.startswith('V.') or l.startswith('C++:'):
+            tmp.append(l)
+        else:
+            tmp[-1] = tmp[-1] + l
+    tmp.append('')
+    sig = []        
+    pat = re.compile(r'\b')
+
+    # Remove all the C++ function signatures and V.<method_name> field
+    offset = 2+len(method.__name__)
+    for i in xrange(len(tmp)):
+        s = tmp[i]
+        if s=='': break
+        if i%2==0:
+            x = s.split('->')
+            arg = x[0].strip()[offset:]
+            if len(x) == 1: # No return value
+                ret = None
+            else:
+                ret = x[1].strip()
+
+            # Remove leading and trailing parens for arguments.
+            arg = arg[1:-1]
+            if not arg:
+                arg = None
+            if arg and arg[-1] == ')':
+                arg = arg + ','
+
+            # Now quote the args and eval them.  Easy!
+            if ret and ret[:3]!='vtk':
+                try:
+                    ret = eval(pat.sub('\"', ret))
+                except:
+                    continue
+            if arg:
+                if arg.find('(')!=-1:
+                    try:
+                        arg = eval(pat.sub('\"', arg))
+                    except:
+                        continue
+                else:
+                    arg = arg.split(', ')
+                    if len(arg)>1:
+                        arg = tuple(arg)
+                    else:
+                        arg = arg[0]
+                if type(arg) == str:
+                    arg = [arg]
+
+            sig.append(([ret], arg))
+    return sig    
+
+def prune_signatures(module, name, signatures, output=False):
+    """prune_signatures tries to remove redundant signatures to reduce
+    overloading. It _mutates_ the given parameter.
+
+    It does this by performing several operations:
+
+    1) It compares a 'flattened' version of the types
+    against the other 'flattened' signatures. If any of them match, we
+    keep only the 'flatter' ones.
+
+    A 'flattened' signature is one where parameters are not inside a
+    tuple.
+
+    2) We explicitly forbid a few signatures based on modules and names
+
+    """
+    # yeah, this is Omega(n^2) on the number of overloads. Who cares?
+
+    def flatten(type_):
+        if type_ is None:
+            return []
+        def convert(entry):
+            if type(entry) == tuple:
+                return list(entry)
+            else:
+                assert(type(entry) == str)
+                return [entry]
+        result = []
+        for entry in type_:
+            result.extend(convert(entry))
+        return result
+
+    flattened_entries = [flatten(sig[1]) for
+                         sig in signatures]
+    def hit_count(entry):
+        result = 0
+        for entry in flattened_entries:
+            if entry in flattened_entries:
+                result += 1
+        return result
+    hits = [hit_count(entry) for entry in flattened_entries]
+
+    def forbidden(flattened, hit_count, original):
+        if (issubclass(get_description_class(module.vtkClass), vtksnl.vtk3DWidget) and
+            name == 'PlaceWidget' and
+            flattened == []):
+            return True
+        # We forbid this because addPorts hardcodes this but
+        # SetInputArrayToProcess is an exception for the InfoVis
+        # package
+        if (get_description_class(module.vtkClass) == vtksnl.vtkAlgorithm and
+            name!='SetInputArrayToProcess'):
+            return True
+        return False
+
+    # This is messy: a signature is only allowed if there's no
+    # explicit disallowing of it. Then, if it's not overloaded,
+    # it is also allowed. If it is overloaded and not the flattened
+    # version, it is pruned. If these are output ports, there can be
+    # no parameters.
+
+    def passes(flattened, hit_count, original):
+        if forbidden(flattened, hit_count, original):
+            return False
+        if hit_count == 1:
+            return True
+        if original[1] is None:
+            return True
+        if output and len(original[1]) > 0:
+            return False
+        if hit_count > 1 and len(original[1]) == len(flattened):
+            return True
+        return False
+    
+    signatures[:] = [original for (flattened, hit_count, original)
+                     in izip(flattened_entries,
+                             hits,
+                             signatures)
+                     if passes(flattened, hit_count, original)]
+    
+    #then we remove the duplicates, if necessary
+    unique_signatures = []
+    [unique_signatures.append(s) for s in signatures if not unique_signatures.count(s)]
+    signatures[:] = unique_signatures
+    
+disallowed_classes = set(
+    [
+    'vtkCriticalSection',
+    'vtkDataArraySelection',
+    'vtkDebugLeaks',
+    'vtkDirectory',
+    'vtkDynamicLoader',
+    'vtkFunctionParser',
+    'vtkGarbageCollector',
+    'vtkHeap',
+    'vtkInformationKey',
+    'vtkInstantiator',
+    'vtkLogLookupTable', # VTK: use vtkLookupTable.SetScaleToLog10() instead
+    'vtkMath',
+    'vtkModelMetadata',
+    'vtkMultiProcessController',
+    'vtkMutexLock',
+    'vtkOutputWindow',
+    'vtkPriorityQueue',
+    'vtkReferenceCount',
+    'vtkRenderWindowCollection',
+    'vtkRenderWindowInteractor',
+    'vtkTesting',
+    'vtkWindow',
+    'vtksnlVersion',
+    'vtkDiffFilter',
+    'vtkDocumentM3MetaData'
+    #'vtkXMLUtilities',
+    #'vtkXMLShader',
+    #'vtkXMLMaterialReader',
+    #'vtkXMLMaterial',
+    #'vtkXMLDataElement'
+     ])
+
+def is_class_allowed(module):
+    if module is None:
+        return False
+    try:
+        name = module.__name__
+        return not (name in disallowed_classes)
+    except AttributeError:
+        return True
+
+def addAlgorithmPorts(module):
+    """ addAlgorithmPorts(module: Module) -> None
+    If module is a subclass of vtkAlgorithm, this function will add all
+    SetInputConnection([id],[port]) and GetOutputPort([id]) as
+    SetInputConnection{id}([port]) and GetOutputPort{id}.
+
+    """
+    if issubclass(get_description_class(module.vtkClass), vtksnl.vtkAlgorithm):
+        if get_description_class(module.vtkClass)!=vtksnl.vtkStructuredPointsGeometryFilter:
+            # We try to instantiate the class here to get the number of
+            # ports and to avoid abstract classes
+            try:
+                instance = module.vtkClass()
+            except TypeError:
+                pass
+            else:
+                registry = get_module_registry()
+                des = registry.get_descriptor_by_name('edu.utah.sci.vistrails.vtksnl',
+                                                      'vtkAlgorithmOutput')
+                for i in xrange(0,instance.GetNumberOfInputPorts()):
+                    registry.add_input_port(module, 'SetInputConnection%d'%i, 
+                                            des.module)
+                for i in xrange(0,instance.GetNumberOfOutputPorts()):
+                    registry.add_output_port(module, 'GetOutputPort%d'%i, 
+                                    des.module)
+
+disallowed_set_get_ports = set(['ReferenceCount',
+                                'InputConnection',
+                                'OutputPort',
+                                'Progress',
+                                'ProgressText',
+                                'InputArrayToProcess',
+                                ])
+def addSetGetPorts(module, get_set_dict, delayed):
+    """ addSetGetPorts(module: Module, get_set_dict: dict) -> None
+    Convert all Setxxx methods of module into input ports and all Getxxx
+    methods of module into output ports
+
+    Keyword arguments:
+    module       --- Module
+    get_set_dict --- the Set/Get method signatures returned by vtk_parser
+
+    """
+
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in get_set_dict.iterkeys():
+        if name in disallowed_set_get_ports: continue
+        getterMethod = getattr(klass, 'Get%s'%name)
+        setterMethod = getattr(klass, 'Set%s'%name)
+        getterSig = get_method_signature(getterMethod)
+        setterSig = get_method_signature(setterMethod)
+        if len(getterSig) > 1:
+            prune_signatures(module, 'Get%s'%name, getterSig, output=True)
+        for order, getter in enumerate(getterSig):
+            if getter[1]:
+                debug("Can't handle getter %s (%s) of class %s: Needs input to "
+                    "get output" % (order+1, name, klass))
+                continue
+            if len(getter[0]) != 1:
+                debug("Can't handle getter %s (%s) of class %s: More than a "
+                    "single output" % (order+1, name, str(klass)))
+                continue
+            class_ = typeMap(getter[0][0])
+            if is_class_allowed(class_):
+                registry.add_output_port(module, 'Get'+name, class_, True)
+        if len(setterSig) > 1:
+            prune_signatures(module, 'Set%s'%name, setterSig)
+        for ix, setter in enumerate(setterSig):
+            if setter[1]==None: continue
+            n = resolve_overloaded_name('Set' + name, ix, setterSig)
+            if len(setter[1]) == 1 and is_class_allowed(typeMap(setter[1][0])):
+                registry.add_input_port(module, n,
+                                        typeMap(setter[1][0]),
+                                        setter[1][0] in typeMapDict)
+            else:
+                classes = [typeMap(i) for i in setter[1]]
+                if all(is_class_allowed(x) for x in classes):
+                    registry.add_input_port(module, n, classes, True)
+            # Wrap SetFileNames for VisTrails file access
+            if file_name_pattern.match(name):
+                registry.add_input_port(module, 'Set' + name[:-4], 
+                                        (File, 'input file'), False)
+            # Wrap SetRenderWindow for exporters
+            elif name == 'RenderWindow':
+                # cscheid 2008-07-11 This is messy: VTKCell isn't
+                # registered yet, so we can't use it as a port
+                # However, we can't register VTKCell before these either,
+                # because VTKCell requires vtkRenderer. The "right" way would
+                # be to add all modules first, then all ports. However, that would
+                # be too slow.
+                # Workaround: delay the addition of the port by storing
+                # the information in a list
+                if registry.has_module('edu.utah.sci.vistrails.spreadsheet',
+                                       'SpreadsheetCell'):
+                    delayed.add_input_port.append((module, 'SetVTKCell', VTKCell, False))
+            # Wrap color methods for VisTrails GUI facilities
+            elif name == 'DiffuseColor':
+                registry.add_input_port(module, 'SetDiffuseColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'Color':
+                registry.add_input_port(module, 'SetColorWidget', 
+                                        (Color, 'color'), True)
+            elif name == 'AmbientColor':
+                registry.add_input_port(module, 'SetAmbientColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'SpecularColor':
+                registry.add_input_port(module, 'SetSpecularColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'EdgeColor':
+                registry.add_input_port(module, 'SetEdgeColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'Background' :
+                registry.add_input_port(module, 'SetBackgroundWidget', 
+                                        (Color, 'color'), True)
+            elif name == 'Background2' :
+                registry.add_input_port(module, 'SetBackground2Widget', 
+                                        (Color, 'color'), True)
+
+disallowed_toggle_ports = set(['GlobalWarningDisplay',
+                               'Debug',
+                               ])
+def addTogglePorts(module, toggle_dict):
+    """ addTogglePorts(module: Module, toggle_dict: dict) -> None
+    Convert all xxxOn/Off methods of module into input ports
+
+    Keyword arguments:
+    module      --- Module
+    toggle_dict --- the Toggle method signatures returned by vtk_parser
+
+    """
+    registry = get_module_registry()
+    for name in toggle_dict.iterkeys():
+        if name in disallowed_toggle_ports:
+            continue
+        registry.add_input_port(module, name+'On', [], True)
+        registry.add_input_port(module, name+'Off', [], True)
+
+disallowed_state_ports = set(['SetInputArrayToProcess'])
+def addStatePorts(module, state_dict):
+    """ addStatePorts(module: Module, state_dict: dict) -> None
+    Convert all SetxxxToyyy methods of module into input ports
+
+    Keyword arguments:
+    module     --- Module
+    state_dict --- the State method signatures returned by vtk_parser
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in state_dict.iterkeys():
+        for mode in state_dict[name]:
+            # Creates the port Set foo to bar
+            field = 'Set'+name+'To'+mode[0]
+            if field in disallowed_state_ports:
+                continue
+            if not registry.has_input_port(module, field):
+                registry.add_input_port(module, field, [], True)
+
+        # Now create the port Set foo with parameter
+        if hasattr(klass, 'Set%s'%name):
+            setterMethod = getattr(klass, 'Set%s'%name)
+            setterSig = get_method_signature(setterMethod)
+            # if the signature looks like an enum, we'll skip it, it shouldn't
+            # be necessary
+            if len(setterSig) > 1:
+                prune_signatures(module, 'Set%s'%name, setterSig)
+            for ix, setter in enumerate(setterSig):
+                n = resolve_overloaded_name('Set' + name, ix, setterSig)
+                tm = typeMap(setter[1][0])
+                if len(setter[1]) == 1 and is_class_allowed(tm):
+                    registry.add_input_port(module, n, tm,
+                                            setter[1][0] in typeMapDict)
+                else:
+                    classes = [typeMap(i) for i in setter[1]]
+                    if all(is_class_allowed(x) for x in classes):
+                        registry.add_input_port(module, n, classes, True)
+
+disallowed_other_ports = set(
+    [
+     'BreakOnError',
+     'DeepCopy',
+     'FastDelete',
+     'HasObserver',
+     'HasExecutive',
+     'INPUT_ARRAYS_TO_PROCESS',
+     'INPUT_CONNECTION',
+     'INPUT_IS_OPTIONAL',
+     'INPUT_IS_REPEATABLE',
+     'INPUT_PORT',
+     'INPUT_REQUIRED_DATA_TYPE',
+     'INPUT_REQUIRED_FIELDS',
+     'InvokeEvent',
+     'IsA',
+     'Modified',
+     'NewInstance',
+     'PrintRevisions',
+     'RemoveAllInputs',
+     'RemoveObserver',
+     'RemoveObservers',
+     'SafeDownCast',
+#     'SetInputArrayToProcess',
+     'ShallowCopy',
+     'Update',
+     'UpdateInformation',
+     'UpdateProgress',
+     'UpdateWholeExtent',
+     ])
+
+force_not_optional_port = set(
+    ['ApplyViewTheme',
+     ])
+
+
+def addOtherPorts(module, other_list):
+    """ addOtherPorts(module: Module, other_list: list) -> None
+    Convert all other ports such as Insert/Add.... into input/output
+
+    Keyword arguments:
+    module     --- Module
+    other_dict --- any other method signatures that is not
+                   Algorithm/SetGet/Toggle/State type
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in other_list:
+        if name[:3] in ['Add','Set'] or name[:6]=='Insert':
+            if name in disallowed_other_ports:
+                continue
+            method = getattr(klass, name)
+            signatures = get_method_signature(method)
+            if len(signatures) > 1:
+                prune_signatures(module, name, signatures)
+            for (ix, sig) in enumerate(signatures):
+                ([result], params) = sig
+                types = []
+                if params:
+                    for p in params:
+                        t = typeMap(p)
+                        if not t:
+                            types = None
+                            break
+                        else: types.append(t)
+                else:
+                    types = [[]]
+                if types:
+                    if not all(is_class_allowed(x) for x in types):
+                        continue
+                    n = resolve_overloaded_name(name, ix, signatures)
+                    if len(types)<=1:
+                        registry.add_input_port(module, n, types[0],
+                                                types[0] in typeMapDictValues)
+                    else:
+                        registry.add_input_port(module, n, types, True)
+        else:
+            if name in disallowed_other_ports:
+                continue
+            method = getattr(klass, name)
+            signatures = get_method_signature(method)
+            if len(signatures) > 1:
+                prune_signatures(module, name, signatures)
+            for (ix, sig) in enumerate(signatures):
+                ([result], params) = sig
+                types = []
+                if params:
+                    types = [typeMap(p) for p in params]
+                else:
+                    types = []
+                if not all(is_class_allowed(x) for x in types):
+                    continue
+                if types==[] or (result==None):
+                    n = resolve_overloaded_name(name, ix, signatures)
+                    registry.add_input_port(module, n, types,
+                                            not (n in force_not_optional_port))
+
+disallowed_get_ports = set([
+    'GetClassName',
+    'GetErrorCode',
+    'GetNumberOfInputPorts',
+    'GetNumberOfOutputPorts',
+    'GetOutputPortInformation',
+    'GetTotalNumberOfInputConnections',
+    ])
+
+def addGetPorts(module, get_list):
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in get_list:
+        if name in disallowed_get_ports:
+            continue
+        method = getattr(klass, name)
+        signatures = get_method_signature(method)
+        if len(signatures) > 1:
+            prune_signatures(module, name, signatures, output=True)
+        for ix, getter in enumerate(signatures):
+            if getter[1] or len(getter[0]) > 1:
+                continue
+            class_ = typeMap(getter[0][0])
+            if is_class_allowed(class_):
+                if len(signatures) > 1:
+                    n = name + "_" + str(ix+1)
+                else:
+                    n = name
+                registry.add_output_port(module, n, class_, True)
+    
+def addPorts(module, delayed):
+    """ addPorts(module: VTK module inherited from Module,
+                 delayed: object with add_input_port slot
+    ) -> None
+    
+    Search all metamethods of module and add appropriate ports
+
+    ports that cannot be added immediately should be appended to
+    the delayed object that is passed. see the SetRenderWindow cases.
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    registry.add_output_port(module, 'self', module)
+    parser.parse(klass)
+    addAlgorithmPorts(module)
+    addGetPorts(module, parser.get_get_methods())
+    addSetGetPorts(module, parser.get_get_set_methods(), delayed)
+    addTogglePorts(module, parser.get_toggle_methods())
+    addStatePorts(module, parser.get_state_methods())
+    addOtherPorts(module, parser.get_other_methods())
+    # CVS version of VTK doesn't support AddInputConnect(vtkAlgorithmOutput)
+    if klass==vtksnl.vtkAlgorithm:
+        registry.add_input_port(module, 'AddInputConnection',
+                                typeMap('vtkAlgorithmOutput'))
+    # vtkWriters have a custom File port
+    elif klass==vtksnl.vtkWriter:
+        registry.add_output_port(module, 'file', 
+                                 typeMap('File','edu.utah.sci.vistrails.basic'))
+    elif klass==vtksnl.vtkImageWriter:
+        registry.add_output_port(module, 'file', 
+                                 typeMap('File','edu.utah.sci.vistrails.basic'))
+    elif klass==vtksnl.vtkVolumeProperty:
+        registry.add_input_port(module, 'SetTransferFunction',
+                                typeMap('TransferFunction'))
+    elif klass==vtksnl.vtkDataSet:
+        registry.add_input_port(module, 'SetPointData', typeMap('vtkPointData'))
+        registry.add_input_port(module, 'SetCallData', typeMap('vtkCellData'))
+    elif klass==vtksnl.vtkCell:
+        registry.add_input_port(module, 'SetPointIds', typeMap('vtkIdList'))
+
+def setAllPorts(descriptor, delayed):
+    """ setAllPorts(descriptor: ModuleDescriptor) -> None
+    Traverse descriptor and all of its children/grand-children to add all ports
+
+    """
+    addPorts(descriptor.module, delayed)
+    for child in descriptor.children:
+        setAllPorts(child, delayed)
+
+def class_dict(base_module, node):
+    """class_dict(base_module, node) -> dict
+    Returns the class dictionary for the module represented by node and
+    with base class base_module"""
+
+    class_dict_ = {}
+    def update_dict(name, callable_):
+        if class_dict_.has_key(name):
+            class_dict_[name] = callable_(class_dict_[name])
+        elif hasattr(base_module, name):
+            class_dict_[name] = callable_(getattr(base_module, name))
+        else:
+            class_dict_[name] = callable_(None)
+
+    def guarded_SimpleScalarTree_wrap_compute(old_compute):
+        # This builds the scalar tree and makes it cacheable
+
+        def compute(self):
+            self.is_cacheable = lambda *args, **kwargs: True
+            old_compute(self)
+            self.vtkInstance.BuildTree()
+        return compute
+
+    def guarded_SetFileName_wrap_compute(old_compute):
+        # This checks for the presence of file in VTK readers
+        def compute(self):
+
+            # Skips the check if it's a vtkImageReader or vtkPLOT3DReader, because
+            # it has other ways of specifying files, like SetFilePrefix for
+            # multiple files
+            if any(issubclass(self.vtkClass, x)
+                   for x in
+                   [vtksnl.vtkBYUReader,
+                    vtksnl.vtkImageReader,
+                    vtksnl.vtkPLOT3DReader,
+                    vtksnl.vtkDICOMImageReader,
+                    vtksnl.vtkTIFFReader]):
+                old_compute(self)
+                return
+            if self.hasInputFromPort('SetFileName'):
+                name = self.getInputFromPort('SetFileName')
+            elif self.hasInputFromPort('SetFile'):
+                name = self.getInputFromPort('SetFile').name
+            else:
+                raise ModuleError(self, 'Missing filename')
+            if not os.path.isfile(name):
+                raise ModuleError(self, 'File does not exist')
+            old_compute(self)
+        return compute
+
+    def compute_SetDiffuseColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetDiffuseColorWidget(self, color):
+            self.vtkInstance.SetDiffuseColor(color.tuple)
+        return call_SetDiffuseColorWidget
+
+    def compute_SetAmbientColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetAmbientColorWidget(self, color):
+            self.vtkInstance.SetAmbientColor(color.tuple)
+        return call_SetAmbientColorWidget
+
+    def compute_SetSpecularColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetSpecularColorWidget(self, color):
+            self.vtkInstance.SetSpecularColor(color.tuple)
+        return call_SetSpecularColorWidget
+
+    def compute_SetColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetColorWidget(self, color):
+            self.vtkInstance.SetColor(color.tuple)
+        return call_SetColorWidget
+
+    def compute_SetEdgeColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetEdgeColorWidget(self, color):
+            self.vtkInstance.SetEdgeColor(color.tuple)
+        return call_SetEdgeColorWidget
+    
+    def compute_SetBackgroundWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetBackgroundWidget(self, color):
+            self.vtkInstance.SetBackground(color.tuple)
+        return call_SetBackgroundWidget
+    
+    def compute_SetBackground2Widget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetBackground2Widget(self, color):
+            self.vtkInstance.SetBackground2(color.tuple)
+        return call_SetBackground2Widget
+    
+    def compute_SetVTKCell(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetRenderWindow(self, cellObj):
+            if cellObj.cellWidget:
+                self.vtkInstance.SetRenderWindow(cellObj.cellWidget.mRenWin)
+        return call_SetRenderWindow
+    
+    def compute_SetTransferFunction(old_compute):
+        # This sets the transfer function
+        if old_compute != None:
+            return old_compute
+        def call_SetTransferFunction(self, tf):
+            tf.set_on_vtk_volume_property(self.vtkInstance)
+        return call_SetTransferFunction
+
+    def compute_SetPointData(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetPointData(self, pd):
+            self.vtkInstance.GetPointData().ShallowCopy(pd)
+        return call_SetPointData
+
+    def compute_SetCellData(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetCellData(self, cd):
+            self.vtkInstance.GetCellData().ShallowCopy(cd)
+        return call_SetCellData            
+
+    def compute_SetPointIds(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetPointIds(self, point_ids):
+            self.vtkInstance.GetPointIds().SetNumberOfIds(point_ids.GetNumberOfIds())
+            for i in xrange(point_ids.GetNumberOfIds()):
+                self.vtkInstance.GetPointIds().SetId(i, point_ids.GetId(i))
+        return call_SetPointIds
+
+    def guarded_Writer_wrap_compute(old_compute):
+        # The behavior for vtkWriter subclasses is to call Write()
+        # If the user sets a name, we will create a file with that name
+        # If not, we will create a temporary file from the file pool
+        def compute(self):
+            old_compute(self)
+            fn = self.vtkInstance.GetFileName()
+            if not fn:
+                o = self.interpreter.filePool.create_file(suffix='.vtk')
+                self.vtkInstance.SetFileName(o.name)
+            else:
+                o = File()
+                o.name = fn
+            self.vtkInstance.Write()
+            self.setResult('file', o)
+        return compute
+
+    for var in dir(node.klass):
+        # Everyone that has a Set.*FileName should have a Set.*File port too
+        if set_file_name_pattern.match(var):
+            def get_compute_SetFile(method_name):
+                def compute_SetFile(old_compute):
+                    if old_compute != None:
+                        return old_compute
+                    def call_SetFile(self, file_obj):
+                        getattr(self.vtkInstance, method_name)(file_obj.name)
+                    return call_SetFile
+                return compute_SetFile
+            update_dict('_special_input_function_' + var[:-4], 
+                        get_compute_SetFile(var))
+
+    if hasattr(node.klass, 'SetFileName'):
+        # ... BUT we only want to check existence of filenames on
+        # readers. VTK is nice enough to be consistent with names, but
+        # this is brittle..
+        if node.klass.__name__.endswith('Reader'):
+            if not node.klass.__name__.endswith('TiffReader'):
+                update_dict('compute', guarded_SetFileName_wrap_compute)
+    if hasattr(node.klass, 'SetRenderWindow'):
+        update_dict('_special_input_function_SetVTKCell',
+                    compute_SetVTKCell)
+    #color gui wrapping
+    if hasattr(node.klass, 'SetDiffuseColor'):
+        update_dict('_special_input_function_SetDiffuseColorWidget',
+                    compute_SetDiffuseColorWidget)
+    if hasattr(node.klass, 'SetAmbientColor'):
+        update_dict('_special_input_function_SetAmbientColorWidget',
+                    compute_SetAmbientColorWidget)
+    if hasattr(node.klass, 'SetSpecularColor'):
+        update_dict('_special_input_function_SetSpecularColorWidget',
+                    compute_SetSpecularColorWidget)
+    if hasattr(node.klass, 'SetEdgeColor'):
+        update_dict('_special_input_function_SetEdgeColorWidget',
+                    compute_SetEdgeColorWidget)
+    if hasattr(node.klass, 'SetColor'):
+        update_dict('_special_input_function_SetColorWidget',
+                    compute_SetColorWidget)
+    if (issubclass(node.klass, vtksnl.vtkRenderer) and 
+        hasattr(node.klass, 'SetBackground')):
+        update_dict('_special_input_function_SetBackgroundWidget',
+                    compute_SetBackgroundWidget)
+    if (issubclass(node.klass, vtksnl.vtkRenderer) and 
+        hasattr(node.klass, 'SetBackground2')):
+        update_dict('_special_input_function_SetBackground2Widget',
+                    compute_SetBackground2Widget)    
+    if issubclass(node.klass, vtksnl.vtkWriter):
+        update_dict('compute', guarded_Writer_wrap_compute)
+
+    if issubclass(node.klass, vtksnl.vtkScalarTree):
+        update_dict('compute', guarded_SimpleScalarTree_wrap_compute)
+
+    if issubclass(node.klass, vtksnl.vtkVolumeProperty):
+        update_dict('_special_input_function_SetTransferFunction',
+                    compute_SetTransferFunction)
+    if issubclass(node.klass, vtksnl.vtkDataSet):
+        update_dict('_special_input_function_SetPointData',
+                    compute_SetPointData)
+        update_dict('_special_input_function_SetCellData',
+                    compute_SetCellData)
+    if issubclass(node.klass, vtksnl.vtkCell):
+        update_dict('_special_input_function_SetPointIds',
+                    compute_SetPointIds)
+    return class_dict_
+
+disallowed_modules = set([
+#        'vtkGeoAlignedImageCache',
+#        'vtkGeoTerrainCache',
+#        'vtkMimeTypeStrategy',
+#        'vtkMPIGroup',
+        'vtkPlotWriter', # Segfaults when being destroyed (when created without a reference, or when last reference is removed)
+        'vtkRenderedLandscapeRepresentation' # Segfaults when calling: GetPeakLabelStopWords()
+        ])
+def createModule(baseModule, node):
+    """ createModule(baseModule: a Module subclass, node: TreeNode) -> None
+    Construct a module inherits baseModule with specification from node
+    
+    """
+    if node.name in disallowed_modules: return
+    def obsolete_class_list():
+        lst = []
+        items = ['vtkInteractorStyleTrackball',
+                 'vtkStructuredPointsGeometryFilter',
+                 'vtkConstrainedPointHandleRepresentation',
+                 'vtkTypePromotion']
+        def try_to_add_item(item):
+            try:
+                lst.append(getattr(vtksnl, item))
+            except AttributeError:
+                pass
+        for item in items:
+            try_to_add_item(item)
+        return lst
+
+    obsolete_list = obsolete_class_list()
+    
+    def is_abstract():
+        """is_abstract tries to instantiate the class. If it's
+        abstract, this will raise."""
+        # Consider obsolete classes abstract        
+        if node.klass in obsolete_list:
+            return True
+        try:
+            getattr(vtksnl, node.name)()
+        except TypeError: # VTK raises type error on abstract classes
+            return True
+        return False
+    module = new_module(baseModule, node.name,
+                       class_dict(baseModule, node),
+                       docstring=getattr(vtksnl, node.name).__doc__
+                       )
+
+    # This is sitting on the class
+    if hasattr(fix_classes, node.klass.__name__ + '_fixed'):
+        module.vtkClass = getattr(fix_classes, node.klass.__name__ + '_fixed')
+    else:
+        module.vtkClass = node.klass
+    registry = get_module_registry()
+    registry.add_module(module, abstract=is_abstract(), 
+                        signatureCallable=vtk_hasher)
+    for child in node.children:
+        if child.name in disallowed_classes:
+            continue
+        createModule(module, child)
+
+def createAllModules(g):
+    """ createAllModules(g: ClassTree) -> None
+    Traverse the VTK class tree and add all modules into the module registry
+    
+    """
+    assert len(g.tree[0]) == 1
+    base = g.tree[0][0]
+    assert base.name == 'vtkObjectBase'
+    vtkObjectBase = new_module(vtkBaseModule, 'vtkObjectBase')
+    vtkObjectBase.vtkClass = vtksnl.vtkObjectBase
+    registry = get_module_registry()
+    registry.add_module(vtkObjectBase)
+    for child in base.children:
+        if child.name in disallowed_classes:
+            continue
+        createModule(vtkObjectBase, child)
+
+##############################################################################
+# Convenience methods
+
+def extract_vtk_instance(vistrails_obj):
+    """extract_vtk_instance(vistrails_obj) -> vtk_object
+
+    takes an instance of a VisTrails module that is a subclass
+    of the vtkObjectBase module and returns the corresponding
+    instance."""
+    global identifier
+    vtkObjectBase = registry.get_descriptor_by_name(identifier,
+                                                    'vtkObjectBase').module
+    assert isinstance(vistrails_obj, vtkObjectBase)
+    return vistrails_obj.vtkInstance
+
+def wrap_vtk_instance(vtk_obj):
+    """wrap_vtk_instance(vtk_object) -> VisTrails module
+
+    takes a vtk instance and returns a corresponding
+    wrapped instance of a VisTrails module"""
+    global identifier
+
+    assert isinstance(vtk_obj, vtksnl.vtkObjectBase)
+    m = registry.get_descriptor_by_name(identifier,
+                                        vtk_obj.GetClassName())
+    result = m.module()
+    result.vtkInstance = vtk_obj
+    return result
+
+################################################################################
+
+def initialize():
+    """ initialize() -> None
+    Package-entry to initialize the package
+    
+    """
+    # Check VTK version
+    v = vtksnl.vtkVersion()
+    version = [v.GetVTKMajorVersion(),
+               v.GetVTKMinorVersion(),
+               v.GetVTKBuildVersion()]
+    if version < [5, 0, 0]:
+        raise Exception("You need to upgrade your VTK install to version \
+        > >= 5.0.0")
+    inheritanceGraph = ClassTree(vtksnl)
+    inheritanceGraph.create()
+
+    # Transfer Function constant
+    tf_widget.initialize()
+
+    delayed = InstanceObject(add_input_port=[])
+    # Add VTK modules
+    registry = get_module_registry()
+    registry.add_module(vtkBaseModule)
+    createAllModules(inheritanceGraph)
+    setAllPorts(registry.get_descriptor_by_name(identifier,
+                                                'vtkObjectBase'),
+                delayed)
+
+    # Register the VTKCell and VTKHandler type if the spreadsheet is up
+    if registry.has_module('edu.utah.sci.vistrails.spreadsheet',
+                           'SpreadsheetCell'):
+        import vtkhandler
+        import vtkcell
+        import vtkviewcell
+        vtkhandler.registerSelf()
+        vtkcell.registerSelf()
+        vtkviewcell.registerSelf()
+
+    # register offscreen rendering module
+    offscreen.register_self()
+
+    # Now add all "delayed" ports - see comment on addSetGetPorts
+    for args in delayed.add_input_port:
+        
+        registry.add_input_port(*args)
+
+    # register Transfer Function adjustment
+    # This can't be reordered -- TransferFunction needs to go before
+    # vtkVolumeProperty, but vtkScaledTransferFunction needs
+    # to go after vtkAlgorithmOutput
+    
+    getter = registry.get_descriptor_by_name
+    registry.add_module(tf_widget.vtkScaledTransferFunction)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Input', getter('edu.utah.sci.vistrails.vtksnl',
+                                            'vtkAlgorithmOutput').module)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Dataset', getter ('edu.utah.sci.vistrails.vtksnl',
+                                               'vtkDataObject').module)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Range', [Float, Float])
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'TransferFunction',
+                            tf_widget.TransferFunctionConstant)
+    registry.add_output_port(tf_widget.vtkScaledTransferFunction,
+                             'TransferFunction',
+                             tf_widget.TransferFunctionConstant)
+    inspectors.initialize()
+
+################################################################################
diff --git a/contrib/vtksnl/inspectors.py b/contrib/vtksnl/inspectors.py
new file mode 100644
index 0000000..9a40acf
--- /dev/null
+++ b/contrib/vtksnl/inspectors.py
@@ -0,0 +1,231 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+##############################################################################
+# Data inspectors for VTK
+
+from core.modules.vistrails_module import ModuleError
+from core.utils import VistrailsInternalError
+from core.modules.basic_modules import Module, Float, Integer
+from core.modules.module_registry import get_module_registry
+import vtksnl
+from base_module import vtkBaseModule
+from hasher import vtk_hasher
+
+class vtkBaseInspector(Module):
+
+    @classmethod
+    def register_self(cls, **kwargs):
+        registry = get_module_registry()
+        def resolve_type(t):
+            if type(t) == tuple:
+                return registry.get_descriptor_by_name(*t).module
+            elif type(t) == type:
+                return t
+            else:
+                assert False, ("Unknown type " + str(type(t)))
+
+        registry.add_module(cls, **kwargs)
+        try:
+            ips = cls.input_ports
+        except AttributeError:
+            pass
+        else:
+            for (port_name, types) in ips:
+                registry.add_input_port(cls,
+                                        port_name,
+                                        list(resolve_type(t) for t in types))
+
+        try:
+            ops = cls.output_ports
+        except AttributeError:
+            pass
+        else:
+            for (port_name, types) in ops:
+                registry.add_output_port(cls,
+                                         port_name,
+                                         list(resolve_type(t) for t in types))
+
+    def auto_set_results(self, vtk_object):
+        for function in self.outputPorts.keys():
+            if hasattr(vtk_object, function):
+                retValues = getattr(vtk_object, function)()
+                if issubclass(retValues.__class__, vtksnl.vtkObject):
+                    className = retValues.GetClassName()
+                    output  = vtkBaseModule.wrapperModule(className, retValues)
+                    self.setResult(function, output)
+                elif type(retValues) in [tuple, list]:
+                    result = list(retValues)
+                    for i in xrange(len(result)):
+                        if issubclass(result[i].__class__, vtksnl.vtkObject):
+                            className = result[i].GetClassName()
+                            result[i] = vtkBaseModule.wrapperModule(className,
+                                                                    result[i])
+                    self.setResult(function, type(retValues)(result))
+                else:
+                    self.setResult(function, retValues)
+
+class vtkDataSetInspector(vtkBaseInspector):
+
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInputConnection0"):
+            ic = self.getInputFromPort("SetInputConnection0")
+            port_object = ic.vtkInstance
+            ix = port_object.GetIndex()
+            producer = port_object.GetProducer()
+            try:
+                vtk_object = producer.GetOutput()
+            except AttributeError:
+                raise ModuleError(self, 
+                                  "expected a module that supports GetOutput")
+        elif self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInputConnection0',
+                    [('edu.utah.sci.vistrails.vtksnl', 'vtkAlgorithmOutput')]),
+                   ('SetInput',
+                    [('edu.utah.sci.vistrails.vtksnl', 'vtkDataSet')]),
+                   ]
+    output_ports = [('GetBounds', [Float] * 6),
+                    ('GetScalarRange', [Float] * 2),
+                    ('GetLength', [Float]),
+                    ('GetCenter', [Float] * 3),
+                    ('GetNumberOfPoints', [Integer]),
+                    ('GetNumberOfCells', [Integer]),
+                    ('GetPointData', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkPointData')]),
+                    ('GetCellData',
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkCellData')]),
+                    ]
+
+class vtkDataSetAttributesInspector(vtkBaseInspector):
+    
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInput',
+                    [('edu.utah.sci.vistrails.vtksnl', 'vtkDataSetAttributes')]),
+                   ]
+    output_ports = [('GetScalars', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')]),
+                    ('GetVectors', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')]),
+                    ('GetNormals', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')]),
+                    ('GetTCoords', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')]),
+                    ('GetTensors', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')]),
+                    ('GetGlobalIds', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')]),
+                    ('GetPedigreeIds', 
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkAbstractArray')]),
+                    ]
+
+class vtkDataArrayInspector(vtkBaseInspector):
+
+   def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+   input_ports = [('SetInput',
+                   [('edu.utah.sci.vistrails.vtksnl', 'vtkDataArray')])]
+   output_ports = [('GetMaxNorm', [Float]),
+                   ('GetRange', [Float] * 2)]
+                   
+class vtkPolyDataInspector(vtkDataSetInspector):
+
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInputConnection0"):
+            ic = self.getInputFromPort("SetInputConnection0")
+            port_object = ic.vtkInstance
+            ix = port_object.GetIndex()
+            producer = port_object.GetProducer()
+            try:
+                vtk_object = producer.GetOutput()
+            except AttributeError:
+                raise ModuleError(self, 
+                                  "expected a module that supports GetOutput")
+        elif self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInputConnection0',
+                    [('edu.utah.sci.vistrails.vtksnl', 'vtkAlgorithmOutput')]),
+                   ('SetInput',
+                    [('edu.utah.sci.vistrails.vtksnl', 'vtkDataSet')]),
+                   ]
+    output_ports = [('GetVerts',
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkCellArray')]),
+                    ('GetLines',
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkCellArray')]),
+                    ('GetPolys',
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkCellArray')]),
+                    ('GetStrips',
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkCellArray')]),
+                    ('GetPoints',
+                     [('edu.utah.sci.vistrails.vtksnl', 'vtkPoints')]),
+                    ('GetNumberOfVerts', [Integer]),
+                    ('GetNumberOfLines', [Integer]),
+                    ('GetNumberOfPolys', [Integer]),
+                    ('GetNumberOfStrips', [Integer]),
+                    ]
+
+def initialize():
+    vtkBaseInspector.register_self(abstract=True, signatureCallable=vtk_hasher)
+    vtkDataSetInspector.register_self(abstract=False, 
+                                      signatureCallable=vtk_hasher)
+    vtkDataSetAttributesInspector.register_self(abstract=False, 
+                                                signatureCallable=vtk_hasher)
+    vtkDataArrayInspector.register_self(abstract=False, 
+                                        signatureCallable=vtk_hasher)
+    vtkPolyDataInspector.register_self(abstract=False,
+                                       signatureCallable=vtk_hasher)
+    
diff --git a/contrib/vtksnl/offscreen.py b/contrib/vtksnl/offscreen.py
new file mode 100644
index 0000000..508baa3
--- /dev/null
+++ b/contrib/vtksnl/offscreen.py
@@ -0,0 +1,62 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+import vtksnl
+from core.modules.module_registry import get_module_registry
+from core.modules.vistrails_module import Module
+from core.modules.basic_modules import File, Integer
+
+class VTKRenderOffscreen(Module):
+
+    def compute(self):
+        r = self.getInputFromPort("renderer").vtkInstance
+        window = vtksnl.vtkRenderWindow()
+        w = self.forceGetInputFromPort("width", 512)
+        h = self.forceGetInputFromPort("height", 512)
+        window.OffScreenRenderingOn()
+        window.SetSize(w, h)
+        # r.ResetCamera()
+        window.AddRenderer(r)
+        window.Start()
+        window.Render()
+        win2image = vtksnl.vtkWindowToImageFilter()
+        win2image.SetInput(window)
+        win2image.Update()
+        writer = vtksnl.vtkPNGWriter()
+        writer.SetInput(win2image.GetOutput())
+        output = self.interpreter.filePool.create_file(suffix='.png')
+        writer.SetFileName(output.name)
+        writer.Write()
+        window.Finalize()
+        self.setResult("image", output)
+
+def register_self():
+    registry = get_module_registry()
+    r = registry.get_descriptor_by_name(
+        'edu.utah.sci.vistrails.vtksnl',
+        'vtkRenderer').module
+    registry.add_module(VTKRenderOffscreen)
+    registry.add_input_port(VTKRenderOffscreen, 'renderer', r)
+    registry.add_input_port(VTKRenderOffscreen, 'width', Integer)
+    registry.add_input_port(VTKRenderOffscreen, 'height', Integer)
+    registry.add_output_port(VTKRenderOffscreen, 'image', File)
+
diff --git a/contrib/vtksnl/tf_widget.py b/contrib/vtksnl/tf_widget.py
new file mode 100644
index 0000000..7ad6838
--- /dev/null
+++ b/contrib/vtksnl/tf_widget.py
@@ -0,0 +1,575 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+
+##############################################################################
+# Transfer Function Widget for VTK
+
+from PyQt4 import QtCore, QtGui
+from core.modules.constant_configuration import ConstantWidgetMixin
+from core.modules.basic_modules import new_constant, init_constant, Module
+from core.utils.color import ColorByName
+import vtksnl
+import math
+import pickle
+import copy
+
+################################################################################
+# etc
+
+def clamp(v, mn, mx, eps=0.0):
+    mn += eps
+    mx -= eps
+    if v < mn: return mn
+    if v > mx: return mx
+    return v
+
+##############################################################################
+# Transfer Function object
+
+class TransferFunction(object):
+
+    def __init__(self):
+        self._min_range = 0.0
+        self._max_range = 1.0
+        self._pts = []
+
+    def set_range(self, mn, mx):
+        self._min_range = mn
+        self._max_range = mx
+
+    def set_on_vtk_volume_property(self, vtk_volume_property):
+        # Builds the opacity and color functions
+        of = vtksnl.vtkPiecewiseFunction()
+        cf = vtksnl.vtkColorTransferFunction()
+        vp = vtk_volume_property
+        for pt in self._pts:
+            (scalar, opacity, color) = pt
+            # Map scalar to tf range
+            s = self._min_range + (self._max_range - self._min_range) * scalar
+            of.AddPoint(s, opacity)
+            cf.AddRGBPoint(s, color[0], color[1], color[2])
+        vp.SetScalarOpacity(of)
+        vp.SetColor(cf)
+
+    def add_point(self, scalar, opacity, color):
+        self._pts.append((scalar, opacity, color))
+        self._pts.sort()
+
+    def get_value(self, scalar):
+        """get_value(scalar): returns the opacity and color
+        linearly interpolated at the value. Useful for
+        adding knots."""
+        ix = 0
+        while ix < len(self._pts) and self._pts[ix][0] > scalar:
+            ix += 1
+        if ix == 0:
+            return (self._pts[0][1], self._pts[0][2])
+        elif ix == len(self._pts):
+            return (self._pts[-1][1], self._pts[-1][2])
+        else:
+            u = ((self._pts[ix][0] - scalar) /
+                 (self._pts[ix][0] - self._pts[ix-1][0]))
+            do = self._pts[ix][1] - self._pts[ix-1][1]
+            dr = self._pts[ix][2][0] - self._pts[ix-1][2][0]
+            dg = self._pts[ix][2][1] - self._pts[ix-1][2][1]
+            db = self._pts[ix][2][2] - self._pts[ix-1][2][2]
+            return (self._pts[ix-1][1] + u * do,
+                    (self._pts[ix-1][2][0] + u * dr,
+                     self._pts[ix-1][2][1] + u * dg,
+                     self._pts[ix-1][2][2] + u * db))
+
+    def __copy__(self):
+        result = TransferFunction()
+        result._min_range = self._min_range
+        result._max_range = self._max_range
+        result._pts = copy.copy(self._pts)
+        return result
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        if self._min_range != other._min_range:
+            return False
+        if self._max_range != other._max_range:
+            return False
+        for my_pt, other_pt in zip(self._pts, other._pts):
+            if my_pt != other_pt:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+##############################################################################
+# Graphics Items
+
+class TransferFunctionPoint(QtGui.QGraphicsEllipseItem):
+
+    selection_pens = { True: QtGui.QPen(QtGui.QBrush(
+        QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))),0.012),
+                       False: QtGui.QPen() }
+
+    def __init__(self, scalar, opacity, color, parent=None):
+        QtGui.QGraphicsEllipseItem.__init__(self, parent)
+        self._scalar = scalar
+        self._opacity = opacity
+        self._color = QtGui.QColor(color[0]*255,
+                                   color[1]*255,
+                                   color[2]*255)
+        self.setPen(QtGui.QPen(QtGui.QColor(0,0,0)))
+        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable) 
+        self.setZValue(2.0)
+
+        self._sx = 1.0
+        self._sy = 1.0
+        self._left_line = None
+        self._right_line = None
+        self._point = QtCore.QPointF(scalar, opacity)
+        self.refresh()
+
+        self.setToolTip("Double-click to change color\n"
+                        "Right-click to remove point\n"
+                        "Scalar: %.5f, Opacity: %.5f" % (self._scalar,
+                                                         self._opacity))
+        # This sets up the linked list of Lines
+
+    def keyPressEvent(self, event):
+        if event.key() == QtCore.Qt.Key_Backspace or \
+           event.key() == QtCore.Qt.Key_Delete:
+            self.remove_self()
+
+    def refresh(self):
+        dx = 0.025 / self._sx
+        dy = 0.025 / self._sy
+        # this is the setup
+        self.setBrush(QtGui.QBrush(self._color))
+        self.setRect(-dx,
+                     -dy,
+                     2 * dx, 2 * dy)
+        self.setPos(self._scalar,
+                    self._opacity)
+
+    def update_scale(self, sx, sy):
+        self._sx = sx
+        self._sy = sy
+        self.refresh()
+
+    def itemChange(self, change, value):
+        if change == QtGui.QGraphicsItem.ItemSelectedChange:
+            self.setPen(self.selection_pens[value.toBool()])
+        if change == QtGui.QGraphicsItem.ItemPositionChange:
+            # moves point
+            pt = value.toPointF()
+            pt.setY(clamp(pt.y(), 0.0, 1.0))
+            self._opacity = pt.y()
+            self._point.setY(pt.y())
+            if not self._left_line:
+                pt.setX(0.0)
+            elif not self._right_line:
+                pt.setX(1.0)
+            else:
+                assert self._left_line._point_right == self
+                assert self._right_line._point_left == self
+                pt.setX(clamp(pt.x(),
+                              self._left_line._point_left._point.x(),
+                              self._right_line._point_right._point.x(),
+                              1e-6))
+                self._point.setX(pt.x())
+                self._scalar = pt.x()
+            if self._left_line:
+                self._left_line.refresh()
+            if self._right_line:
+                self._right_line.refresh()
+            if self.scene():
+                self.scene()._tf_poly.setup()
+            self.setToolTip("Double-click to change color\n"
+                        "Right-click to remove point\n"
+                        "Scalar: %.5f, Opacity: %.5f" % (self._scalar,
+                                                         self._opacity))
+            return QtGui.QGraphicsItem.itemChange(self, change,
+                                                  QtCore.QVariant(pt))
+        return QtGui.QGraphicsItem.itemChange(self, change, value)
+
+    def remove_self(self):
+        if not self._left_line or not self._right_line:
+            # Ignore, self is a corner node that can't be removed
+            return
+        
+        # Removes the right line and self, re-ties data structure
+        self._left_line._point_right = self._right_line._point_right
+        self._left_line._point_right._left_line = self._left_line
+        
+        # be friends with garbage collector
+        self._right_line._point_left = None
+        self._right_line._point_right = None
+        self.scene()._tf_poly.setup()
+        self.scene().removeItem(self._right_line)
+        self.scene().removeItem(self)
+        self._left_line.refresh()
+
+    def mouseDoubleClickEvent(self, event):
+        new_color = QtGui.QColorDialog.getColor(self._color)
+        if not new_color.isValid():
+            return
+        self._color = new_color
+        if self._left_line:
+            self._left_line.refresh()
+        if self._right_line:
+            self._right_line.refresh()
+        self.refresh()
+        self.scene()._tf_poly.setup()
+
+    def mousePressEvent(self, event):
+        if event.button() == QtCore.Qt.RightButton:
+            event.accept()
+            self.remove_self()
+        else:
+            QtGui.QGraphicsEllipseItem.mousePressEvent(self, event)
+        
+    def add_self_to_transfer_function(self, tf):
+        tf.add_point(self._scalar,
+                     self._opacity,
+                     (self._color.redF(),
+                      self._color.greenF(),
+                      self._color.blueF()))
+
+class TransferFunctionPolygon(QtGui.QGraphicsPolygonItem):
+
+    def __init__(self):
+        QtGui.QGraphicsPolygonItem.__init__(self)
+
+    def setup(self):
+        # This inspects the scene, finds the left-most point, and
+        # then builds the polygon traversing the linked list structure
+        if not self.scene():
+            return
+        pt = self.scene().get_leftmost_point()
+        first_pt = pt
+        self.setZValue(1.25)
+        g = QtGui.QLinearGradient()
+        g.setStart(0.0, 0.5)
+        g.setFinalStop(1.0, 0.5)
+        p = QtGui.QPen()
+        p.setStyle(QtCore.Qt.NoPen)
+        pts = [QtCore.QPointF(pt.x(), 0)]
+        self.setPen(p)
+        
+        while 1:
+            c = QtGui.QColor(pt._color)
+            c.setAlphaF(pt._opacity)
+            g.setColorAt(pt._scalar, c)
+            pts.append(pt._point)
+            # move cursor fwd
+            if pt._right_line:
+                pt = pt._right_line._point_right
+            else:
+                break
+        self.setBrush(QtGui.QBrush(g))
+        pts.append(QtCore.QPointF(pt.x(), 0))
+        self.setPolygon(QtGui.QPolygonF(pts))
+
+class TransferFunctionLine(QtGui.QGraphicsPolygonItem):
+
+    def __init__(self, point_left, point_right, parent=None):
+        assert point_right._scalar >= point_left._scalar
+        QtGui.QGraphicsPolygonItem.__init__(self, parent)
+        self._point_left = point_left
+        self._point_right = point_right
+        self._point_left._right_line = self
+        self._point_right._left_line = self
+        self.setup(1.0, 1.0)
+        self._sx = 1.0
+        self._sy = 1.0
+        
+    def setup(self, sx, sy):
+        d = self._point_right._point - self._point_left._point
+        d_normal = QtCore.QPointF(d.y(), -d.x())
+        l = math.sqrt(d.x() * d.x() + d.y() * d.y())
+        if l != 0.0:
+            d_normal /= l
+            d_normal *= 0.010
+            d_normal.setX(d_normal.x() / sx)
+            d_normal.setY(d_normal.y() / sy)
+        ps = [self._point_left._point + d_normal,
+              self._point_right._point + d_normal,
+              self._point_right._point - d_normal,
+              self._point_left._point - d_normal]
+        self.setPolygon(QtGui.QPolygonF(ps))
+        self.setZValue(1.5)
+        # Gradient for filling
+        g = QtGui.QLinearGradient()
+        g.setStart(self._point_left._point)
+        g.setFinalStop(self._point_right._point)
+        g.setColorAt(0.0, self._point_left._color)
+        g.setColorAt(1.0, self._point_right._color)
+        self.setBrush(QtGui.QBrush(g))
+        # Gradient for outlining
+        g = QtGui.QLinearGradient()
+        g.setStart(self._point_left._point)
+        g.setFinalStop(self._point_right._point)
+        dark_pl = QtGui.QColor(self._point_left._color.red() * 0.5,
+                               self._point_left._color.green() * 0.5,
+                               self._point_left._color.blue() * 0.5)
+        dark_pr = QtGui.QColor(self._point_right._color.red() * 0.5,
+                               self._point_right._color.green() * 0.5,
+                               self._point_right._color.blue() * 0.5)
+        g.setColorAt(0.0, dark_pl)
+        g.setColorAt(1.0, dark_pr)
+        p = QtGui.QPen()
+        p.setBrush(QtGui.QBrush(g))
+        self.setPen(p)
+
+    def update_scale(self, sx, sy):
+        self._sx = sx
+        self._sy = sy
+        self.refresh()
+
+    def refresh(self):
+        self.setup(self._sx, self._sy)
+
+    def mouseDoubleClickEvent(self, event):
+        p = event.scenePos()
+        c_left = self._point_left._color
+        c_right = self._point_right._color
+        u = ((p.x() - self._point_left._point.x()) /
+             (self._point_right._point.x() - self._point_left._point.x()))
+        new_c = (u * c_right.redF() + (1-u) * c_left.redF(),
+                 u * c_right.greenF() + (1-u) * c_left.greenF(),
+                 u * c_right.blueF() + (1-u) * c_left.blueF())
+        new_point = TransferFunctionPoint(p.x(), p.y(), new_c)
+        new_line = TransferFunctionLine(new_point, self._point_right)
+        new_point._left_line = self
+        self._point_right = new_point
+        self.scene().addItem(new_line)
+        self.scene().addItem(new_point)
+        new_line.update_scale(self._point_left._sx,
+                              self._point_left._sy)
+        new_point.update_scale(self._point_left._sx,
+                               self._point_left._sy)
+        new_point.refresh()
+        self.refresh()
+
+    def mousePressEvent(self, event):
+        # This needs to be here, otherwise mouseDoubleClickEvent does
+        # not get called.
+        event.accept()
+        
+
+##############################################################################
+# Scene, view, widget
+
+class TransferFunctionScene(QtGui.QGraphicsScene):
+
+    def __init__(self, tf, parent=None):
+        QtGui.QGraphicsScene.__init__(self, parent)
+        self._tf_items = []
+        poly = TransferFunctionPolygon()
+        poly.setup()
+        self._tf_poly = poly
+        self.addItem(poly)
+        self.create_tf_items(tf)
+        #current scale
+        self._sx = 1.0
+        self._sy = 1.0    
+        # Add outlines
+        line_color = QtGui.QColor(200, 200, 200)
+        pen = QtGui.QPen(line_color)
+        ps = [QtCore.QPointF(0.0, 0.0),
+              QtCore.QPointF(1.0, 0.0),
+              QtCore.QPointF(1.0, 1.0),
+              QtCore.QPointF(0.0, 1.0)]
+        outline = QtGui.QPolygonF(ps)
+        self.addPolygon(outline, pen)
+
+        for i in xrange(51):
+            u = float(i) / 50.0
+            self.addLine(QtCore.QLineF(u, 0.0, u, 1.0), pen)
+            self.addLine(QtCore.QLineF(0.0, u, 1.0, u), pen)
+
+    def reset_transfer_function(self, tf):
+        self.create_tf_items(tf)
+        self.update_scale(self._sx, self._sy)
+        self._tf_poly.setup()
+        
+    def removeItem(self, item):
+        if item in self._tf_items:
+            self._tf_items.remove(item)
+        QtGui.QGraphicsScene.removeItem(self, item)
+
+    def addItem(self, item):
+        # Ugly, but hey
+        if isinstance(item, TransferFunctionLine) or \
+           isinstance(item, TransferFunctionPoint):
+            self._tf_items.append(item)
+        QtGui.QGraphicsScene.addItem(self, item)
+
+    def create_tf_items(self, tf):
+        items = copy.copy(self._tf_items)
+        for item in items:
+            self.removeItem(item)
+        self._tf_items = []
+        if len(tf._pts) == 0:
+            pt_left = TransferFunctionPoint(0.0, 0.0, (0.0, 0.0, 0.0))
+            pt_right = TransferFunctionPoint(1.0, 0.0, (0.0, 0.0, 0.0))
+            line = TransferFunctionLine(pt_left, pt_right)
+            
+            self.addItem(pt_left)
+            self.addItem(pt_right)
+            self.addItem(line)
+            
+        else:
+            pts = [TransferFunctionPoint(*pt)
+                   for pt in tf._pts]
+            lines = [TransferFunctionLine(pt_l, pt_r)
+                     for (pt_l, pt_r) in zip(pts[:-1], pts[1:])]
+            for pt in pts:
+                self.addItem(pt)
+            for line in lines:
+                self.addItem(line)
+
+    def add_knot(self, scalar, opacity):
+        pass
+
+    def update_scale(self, sx, sy):
+        for item in self._tf_items:
+            item.update_scale(sx, sy)
+        self._sx = sx
+        self._sy = sy
+
+    def get_leftmost_point(self):
+        pt = None
+        
+        for item in self._tf_items:
+            if hasattr(item, '_left_line') and not item._left_line:
+                pt = item
+                break
+        assert pt
+        return pt        
+
+    def get_transfer_function(self):
+        result = TransferFunction()
+        pt = self.get_leftmost_point()
+        while 1:
+            pt.add_self_to_transfer_function(result)
+            if pt._right_line:
+                pt = pt._right_line._point_right
+            else:
+                break
+        return result
+
+class TransferFunctionView(QtGui.QGraphicsView):
+    def __init__(self, parent=None):
+        QtGui.QGraphicsView.__init__(self, parent)
+        self.setRenderHint(QtGui.QPainter.Antialiasing)
+        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        
+    def resizeEvent(self, event):
+        self.setMatrix(QtGui.QMatrix(event.size().width() / (10.0/9), 0,
+                                     0, -event.size().height() / (10.0/9), 0, 0))
+        self.scene().update_scale(event.size().width()/(2000.0/9), event.size().height()/(2000.0/9))
+        
+    def focusOutEvent(self, event):
+        self.parent().update_parent()
+        QtGui.QGraphicsView.focusOutEvent(self, event)
+
+default_tf = TransferFunction()
+default_tf.add_point(0.0, 0.0, (0.0, 0.0, 0.0))
+default_tf.add_point(1.0, 0.0, (0.0, 0.0, 0.0))
+    
+class TransferFunctionWidget(QtGui.QWidget, ConstantWidgetMixin):
+
+    def __init__(self, param, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        if not param.strValue:
+            self._tf = copy.copy(default_tf)
+        else:
+            self._tf = pickle.loads(param.strValue.decode('hex'))
+        self._scene = TransferFunctionScene(self._tf, self)
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+        self._view = TransferFunctionView()
+        self._view.setScene(self._scene)
+        self._view.setMinimumSize(200,200)
+        self._view.show()
+        self._view.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                 QtGui.QSizePolicy.Expanding)
+        self._view.setMatrix(QtGui.QMatrix(180, 0, 0, -180, 0, 0))
+        self.setMinimumSize(200,200)
+        caption = QtGui.QLabel("Double-click on the line to add a point")
+        font = QtGui.QFont('Arial', 11)
+        font.setItalic(True)
+        caption.setFont(font)
+        layout.addWidget(self._view)
+        layout.addWidget(caption)
+
+    def contents(self):
+        return pickle.dumps(self._scene.get_transfer_function()).encode('hex')
+    
+    def setContents(self, strValue, silent=True):
+        if not strValue:
+            self._tf = copy.copy(default_tf)
+        else:
+            self._tf = pickle.loads(strValue.decode('hex'))
+        self._scene.reset_transfer_function(self._tf)
+        if not silent:
+            self.update_parent()    
+            
+##############################################################################
+# Helper module to adjust range
+
+class vtkScaledTransferFunction(Module):
+
+    def compute(self):
+        tf = self.getInputFromPort('TransferFunction')
+        new_tf = copy.copy(tf)
+        if self.hasInputFromPort('Input'):
+            port = self.getInputFromPort('Input')
+            algo = port.vtkInstance.GetProducer()
+            output = algo.GetOutput(port.vtkInstance.GetIndex())
+            (new_tf._min_range, new_tf._max_range) = output.GetScalarRange()
+        elif self.hasInputFromPort('Dataset'):
+            algo = self.getInputFromPort('Dataset').vtkInstance
+            output = algo
+            (new_tf._min_range, new_tf._max_range) = output.GetScalarRange()
+        else:
+            (new_tf._min_range, new_tf._max_range) = self.getInputFromPort('Range')
+            
+        self.setResult('TransferFunction', new_tf)
+
+string_conversion = staticmethod(lambda x: pickle.dumps(x).encode('hex'))
+conversion = staticmethod(lambda x: pickle.loads(x.decode('hex')))
+validation = staticmethod(lambda x: isinstance(x, TransferFunction))
+TransferFunctionConstant = new_constant('TransferFunction',
+                                        conversion,
+                                        default_tf,
+                                        validation,
+                                        TransferFunctionWidget)
+TransferFunctionConstant.translate_to_string = string_conversion
+
+##############################################################################
+
+def initialize():
+    init_constant(TransferFunctionConstant)
diff --git a/contrib/vtksnl/vtk_parser.py b/contrib/vtksnl/vtk_parser.py
new file mode 100644
index 0000000..1624f09
--- /dev/null
+++ b/contrib/vtksnl/vtk_parser.py
@@ -0,0 +1,514 @@
+# Author: Prabhu Ramachandran
+# Copyright (c) 2004, Enthought, Inc.
+# License: BSD Style.
+
+# Modified for VisTrails by the VisTrails team.
+
+"""This module parses the VTK methods, obtains the argument and return
+type information, and organizes them.
+
+"""
+
+import re
+import vtksnl
+import class_tree
+import core.debug
+
+log      = core.debug.log
+warning  = core.debug.warning
+critical = core.debug.critical
+debug    = core.debug.debug
+
+class VTKMethodParser(object):
+    """This class provides useful methods for parsing methods of a VTK
+    class or instance.
+
+    The class allows one to categorize the methods of the VTK class
+    and also obtain the method signatures in a form that is easy to
+    use.  When the `parse` method is called, it in turn calls the
+    `_organize_methods` method.  This method organizes the VTK methods
+    into different instance variables described in the following.
+    `self.toggle_meths` contains a dictionary of all the boolean
+    methods of the form <Value>On/Off.  The dictionary keys are
+    strings with the <Value>'s and the value of each item is the
+    default value (0/1) of the item (the example below will clarify
+    this).  `self.state_meths` contains a dictionary which collects
+    the Set<Prop>To<Value> type of methods.  The key is the <Prop> and
+    the value is a list containing the different string <Value>'s and
+    their corresponding mapped value.  The first value in these is the
+    default value of the <Prop>.  `self.get_set_meths` will contain a
+    dictionary which collects all the methods of the form
+    Set/Get<Prop> that are not already specified in
+    `self.toggle_meths` or `self.state_meths`.  The default value of
+    the Get<Prop> is stored.  If the value accepted by the method has
+    a range (via the methods `Get<Prop>MinValue` and
+    `Get<Prop>MaxValue`), then that range is computed and stored.
+    `self.get_meths` stores the methods that are of the form
+    `Get<Prop>`.  `self.other_meths` stores the remaining methods.
+    The parsing is quite fast.  Parsing every class in the VTK API
+    takes a couple of seconds (on a Pentium III @ 450Mhz).
+
+    Here is an example::
+        
+       >>> import vtk
+       >>> p = VTKMethodParser()
+       >>> p.parse(vtk.vtkProperty)
+       >>> print p.get_toggle_methods()
+       {'EdgeVisibility': 0, 'BackfaceCulling': 0, 'FrontfaceCulling': 0}
+       >>> print p.get_state_methods()['Representation']
+       [['Surface', 2], ['Points', 0], ['Surface', 2], ['Wireframe', 1]]
+       >>> print p.get_get_set_methods()['Opacity']
+       (1.0, (0.0, 1.0))
+       >>> print p.get_get_methods()
+       ['GetClassName']
+       >>> print p.get_other_methods()[:3]
+       ['BackfaceRender', 'DeepCopy', 'IsA']
+
+
+    The class also provides a method called `get_method_signature`
+    that obtains the Python method signature given the VTK method
+    object.  Here is an example::
+    
+       >>> import vtk
+       >>> p = VTKMethodParser()
+       >>> o = vtk.vtkProperty
+       >>> print p.get_method_signature(o.GetClassName)
+       [(['string'], None)]
+       >>> print p.get_method_signature(o.GetColor)[0]
+       ([('float', 'float', 'float')], None)
+       >>> print p.get_method_signature(o.GetColor)[1]
+       ([None], (('float', 'float', 'float'),))
+
+    The `get_method_signature` is fairly efficient and obtaining the
+    signature for every method in every class in the VTK API takes
+    around 6 seconds (on a Pentium III @ 450Mhz).
+
+    """
+
+    def __init__(self, use_tree=True):
+        """Initializes the object.
+
+        Parameters
+        ----------
+
+        - use_tree : `bool`
+
+          If True (default), use a ClassTree instance to obtain a
+          concrete subclass for an abstract base class.  This is used
+          only to find the range and default values for some of the
+          methods.  If False, no ClassTree instance is created.
+
+          This is optional because, creating a ClassTree is expensive.
+          The parser functionality can be very useful even without the
+          use of a ClassTree.  For example, if one wants to save the
+          state of a VTK object one only needs to know the names of
+          the methods and not their default values, ranges etc.  In
+          that case using a parser should be cheap.
+
+        """
+        # The ClassTree is needed to find an instantiable child class
+        # for an abstract VTK parent class.  This instance is used to
+        # obtain the state values and the ranges of the arguments
+        # accepted by the Get/Set methods that have a
+        # Get<Prop>{MaxValue,MinValue} method.
+        if use_tree:
+            self._tree = class_tree.ClassTree(vtksnl)
+            self._tree.create()
+        else:
+            self._tree = None
+        self._state_patn = re.compile('To[A-Z0-9]')
+        self._initialize()
+
+    #################################################################
+    # 'VTKMethodParser' interface.
+    #################################################################
+
+    def parse(self, obj, no_warn=True):
+        """Parse the methods for a given VTK object/class.
+
+        Given a VTK class or object, this method parses the methods
+        and orgaizes them into useful categories.  The categories and
+        their usage is documented in the documentation for the class.
+
+        Parameters
+        ----------
+
+        - obj : VTK class or instance
+
+        - no_warn : `bool` (default: True)
+
+          If True (default), it suppresses any warnings generated by
+          the VTK object when parsing the methods.  This is safe to
+          use.
+        
+        """
+        if not hasattr(obj, '__bases__'):
+            klass = obj.__class__
+        else:
+            klass = obj
+
+        methods = self.get_methods(klass)
+
+        if no_warn:
+            # Save warning setting and shut it off before parsing.
+            warn = vtksnl.vtkObject.GetGlobalWarningDisplay()
+            if klass.__name__ <> 'vtkObject':
+                vtksnl.vtkObject.GlobalWarningDisplayOff()
+
+        self._organize_methods(klass, methods)
+
+        if no_warn:
+            # Reset warning status.
+            vtksnl.vtkObject.SetGlobalWarningDisplay(warn)
+
+    def get_methods(self, klass):
+        """Returns all the relevant methods of the given VTK class."""
+        methods = dir(klass)[:]
+        if hasattr(klass, '__members__'):
+            # Only VTK versions < 4.5 have these.
+            for m in klass.__members__:
+                methods.remove(m)
+
+        return methods
+
+    def get_toggle_methods(self):        
+        """Returns a dictionary of the parsed <Value>On/Off methods
+        along with the default value.
+
+        """
+        return self.toggle_meths
+    
+    def get_state_methods(self):
+        """Returns a dict of the parsed Set<Prop>To<Value>.
+
+        The keys are the <Prop> string with a list of the different
+        <Value> strings along with their corresponding value (if
+        obtainable).  The first value is the default value of the
+        state.
+        
+        """
+        return self.state_meths
+
+    def get_get_set_methods(self):
+        """Returns a dict of the parsed Get/Set<Value> methods.
+
+        The keys of the dict are the <Value> strings and contain a
+        two-tuple containing the default value (or None if it is not
+        obtainable for some reason) and a pair of numbers specifying
+        an acceptable range of values (or None if not obtainable).
+
+        """
+        return self.get_set_meths
+    
+    def get_get_methods(self):
+        """Return a list of parsed Get<Value> methods.
+
+        All of these methods do NOT have a corresponding Set<Value>.
+
+        """
+        return self.get_meths
+    
+    def get_other_methods(self):
+        """Return list of all other methods, that are not
+        categorizable.
+
+        """
+        return self.other_meths    
+
+    def get_method_signature(self, method):
+        """Returns information on the Python method signature given
+        the VTK method.
+
+        The doc string of the given method object to get the method
+        signature.  The method returns a list of tuples, each of which
+        contains 2 items, the first is a list representing the return
+        value the second represents the arguments to be passed to the
+        function.  If the method supports different return values and
+        arguments, this function returns all of their signatures.
+
+        Parameters
+        ----------
+
+        - method : `method`
+
+          A VTK method object.
+
+        """
+        doc = method.__doc__
+        doc = doc[:doc.find('\n\n')]
+        sig = doc.split('\n')
+        sig = [x.strip() for x in sig]
+
+        # Remove all the C++ function signatures.
+        for i in sig[:]:
+            if i[:4] == 'C++:':
+                sig.remove(i)
+
+        # Remove the V.<method_name>
+        sig = [x.replace('V.' + method.__name__, '') for x in sig]
+
+        pat = re.compile(r'\b')
+
+        # Split into [return_value, arguments] after processing them.
+        tmp = list(sig)
+        sig = []
+        for i in tmp:
+            # Split to get return values.
+            x = i.split('->')
+            # Strip each part.
+            x = [y.strip() for y in x]
+
+            if len(x) == 1: # No return value
+                x = [None, x[0]]
+            else:
+                x.reverse()
+
+            ret, arg = x        
+
+            # Remove leading and trailing parens for arguments.
+            arg = arg[1:-1]
+            if not arg:
+                arg = None
+            if arg and arg[-1] == ')':
+                arg = arg + ','
+
+            # Now quote the args and eval them.  Easy!
+            if ret:
+                ret = eval(pat.sub('\"', ret))
+            if arg:
+                arg = eval(pat.sub('\"', arg))
+                if type(arg) == type('str'):
+                    arg = [arg]        
+
+            sig.append(([ret], arg))
+
+        return sig
+
+    def get_tree(self):
+        """Return the ClassTree instance used by this class."""
+        return self._tree
+
+    #################################################################
+    # Non-public interface.
+    #################################################################
+
+    def _initialize(self):
+        """Initializes the method categories."""
+        # Collects the <Value>On/Off methods.
+        self.toggle_meths = {}
+        # Collects the Set<Prop>To<Value> methods.
+        self.state_meths = {}
+        # Collects the Set/Get<Value> pairs.
+        self.get_set_meths = {}
+        # Collects the Get<Value> methods.
+        self.get_meths = []
+        # Collects all the remaining methods.
+        self.other_meths = []
+
+    def _organize_methods(self, klass, methods):
+        """Organizes the given methods of a VTK class into different
+        categories.
+
+        Parameters
+        ----------
+
+        - klass : A VTK class
+
+        - methods : `list` of `str`
+
+          A list of the methods to be categorized.
+
+        """
+        self._initialize()
+        meths = methods[:]
+        meths = self._find_toggle_methods(klass, meths)
+        meths = self._find_state_methods(klass, meths)
+        meths = self._find_get_set_methods(klass, meths)
+        meths = self._find_get_methods(klass, meths)
+        self.other_meths = [x for x in meths if '__' not in x]
+
+    def _remove_method(self, meths, method):
+        try:
+            meths.remove(method)
+        except ValueError:
+            pass
+
+    def _find_toggle_methods(self, klass, methods):
+        """Find/store methods of the form <Value>{On,Off} in the given
+        `methods`.  Returns the remaining list of methods.
+
+        """
+        meths = methods[:]
+        tm = self.toggle_meths
+        for method in meths[:]:
+            if method[-2:] == 'On':
+                key = method[:-2]
+                if (key + 'Off') in meths and ('Get' + key) in meths:
+                    tm[key] = None
+                    meths.remove(method)
+                    meths.remove(key + 'Off')
+                    self._remove_method(meths, 'Set' + key)
+                    self._remove_method(meths, 'Get' + key)
+        # get defaults
+        if tm:
+            obj = self._get_instance(klass)
+            if obj:
+                for key in tm:
+                    try:
+                        tm[key] = getattr(obj, 'Get%s'%key)()
+                    except TypeError, e:
+                        log("Type error during parsing: class %s will not expose method %s " % (klass.__name__, key))
+                    except AttributeError, e:
+                        log("Attribute error during parsing: class %s will not expose method %s " % (klass.__name__, key))
+        return meths
+
+    def _find_state_methods(self, klass, methods):
+        """Find/store methods of the form Set<Prop>To<Value> in the
+        given `methods`.  Returns the remaining list of methods.  The
+        method also computes the mapped value of the different
+        <Values>.
+
+        """
+        # These ignored ones are really not state methods.
+        ignore = ['SetUpdateExtentToWholeExtent']
+        meths = methods[:]
+        sm = self.state_meths
+        for method in meths[:]:
+            if method not in ignore and method[:3] == 'Set':
+                # Methods of form Set<Prop>To<Value>
+                match = self._state_patn.search(method)
+                # Second cond. ensures that this is not an accident.
+                if match and (('Get'+method[3:]) not in meths):
+                    key = method[3:match.start()] # The <Prop> part.
+                    if (('Get' + key) in methods):
+                        val = method[match.start()+2:] # <Value> part.
+                        meths.remove(method)
+                        if sm.has_key(key):
+                            sm[key].append([val, None])
+                        else:
+                            sm[key] = [[val, None]]
+                            meths.remove('Get'+ key)
+                            self._remove_method(meths, 'Set'+ key)
+                            if ('Get' + key + 'MaxValue') in meths:
+                                meths.remove('Get' + key + 'MaxValue')
+                                meths.remove('Get' + key + 'MinValue')
+                            try:
+                                meths.remove('Get' + key + 'AsString')
+                            except ValueError:
+                                pass
+
+        # Find the values for each of the states, i.e. find that
+        # vtkProperty.SetRepresentationToWireframe() corresponds to
+        # vtkProperty.SetRepresentation(1).
+        if sm:
+            obj = self._get_instance(klass)
+            if obj:
+                for key, values in sm.items():
+                    default = getattr(obj, 'Get%s'%key)()
+                    for x in values[:]:
+                        try:
+                            getattr(obj, 'Set%sTo%s'%(key, x[0]))()
+                        except:
+                            continue
+                        val = getattr(obj, 'Get%s'%key)()
+                        x[1] = val
+                        if val == default:
+                            values.insert(0, [x[0], val])
+        return meths
+
+    def _find_get_set_methods(self, klass, methods):
+        """Find/store methods of the form {Get,Set}Prop in the given
+        `methods` and returns the remaining list of methods.
+
+        Note that it makes sense to call this *after*
+        `_find_state_methods` is called in order to avoid incorrect
+        duplication.  This method also computes the default value and
+        the ranges of the arguments (when possible) by using the
+        Get<Prop>{MaxValue,MinValue} methods.
+
+        """
+        meths = methods[:]
+        gsm = self.get_set_meths
+        
+        for method in meths[:]:
+            # Methods of the Set/Get form.
+            if method in ['Get', 'Set']:
+                # This occurs with the vtkInformation class.
+                continue
+            elif (method[:3] == 'Set') and ('Get' + method[3:]) in methods:
+                key = method[3:]
+                meths.remove('Set' + key)
+                meths.remove('Get' + key)                    
+                if ('Get' + key + 'MaxValue') in meths:
+                    meths.remove('Get' + key + 'MaxValue')
+                    meths.remove('Get' + key + 'MinValue')
+                    gsm[key] = 1
+                else:
+                    gsm[key] = None
+
+        # Find the default and range of the values.
+        if gsm:
+            obj = self._get_instance(klass)
+            if obj:
+                klass_name = klass.__name__
+                for key, value in gsm.items():
+                    if klass_name == 'vtkPolyData':
+                        # Evil hack, this class segfaults!
+                        default = None
+                    else:
+                        try:
+                            default = getattr(obj, 'Get%s'%key)()
+                        except TypeError:
+                            default = None
+                    if value:
+                        low = getattr(obj, 'Get%sMinValue'%key)()
+                        high = getattr(obj, 'Get%sMaxValue'%key)()
+                        gsm[key] = (default, (low, high))
+                    else:
+                        gsm[key] = (default, None)
+            else:
+                # We still might have methods that have a default range.
+                for key, value in gsm.items():
+                    if value == 1:
+                        gsm[key] = None
+        
+        return meths
+
+    def _find_get_methods(self, klass, methods):
+        """Find/store methods of the form Get<Value> in the given
+        `methods` and returns the remaining list of methods.
+
+        """
+        meths = methods[:]
+        gm = self.get_meths
+        for method in meths[:]:
+            if method == 'Get':
+                # Occurs with vtkInformation
+                continue
+            elif method[:3] == 'Get':        
+                gm.append(method)
+                meths.remove(method)
+        return meths
+
+    def _get_instance(self, klass):
+        """Given a VTK class, `klass`, returns an instance of the
+        class.
+
+        If the class is abstract, it uses the class tree to return an
+        instantiable subclass.  This is necessary to get the values of
+        the 'state' methods and the ranges for the Get/Set methods.
+        
+        """
+        obj = None
+        try:
+            obj = klass()
+        except TypeError:
+            if self._tree:
+                t = self._tree
+                n = t.get_node(klass.__name__)
+                for c in n.children:
+                    obj = self._get_instance(t.get_class(c.name))
+                    if obj:
+                        break
+        return obj
+
diff --git a/contrib/vtksnl/vtkcell.py b/contrib/vtksnl/vtkcell.py
new file mode 100644
index 0000000..fa61481
--- /dev/null
+++ b/contrib/vtksnl/vtkcell.py
@@ -0,0 +1,1094 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# File QVTKWidget.py
+# File for displaying a vtkRenderWindow in a Qt's QWidget ported from
+# VTK/GUISupport/QVTK. Combine altogether to a single class: QVTKWidget
+################################################################################
+import vtksnl
+from PyQt4 import QtCore, QtGui
+import sip
+from core import system
+from core.modules.module_registry import get_module_registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import vtkcell_rc
+import gc
+from gui.qt import qt_super
+import core.db.action
+from core.vistrail.action import Action
+from core.vistrail.port import Port
+from core.vistrail import module
+from core.vistrail import connection
+from core.vistrail.module_function import ModuleFunction
+from core.vistrail.module_param import ModuleParam
+from core.vistrail.location import Location
+from core.modules.vistrails_module import ModuleError
+import copy
+
+################################################################################
+
+class VTKCell(SpreadsheetCell):
+    """
+    VTKCell is a VisTrails Module that can display vtkRenderWindow inside a cell
+    
+    """
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        renderers = self.forceGetInputListFromPort('AddRenderer')
+        renderViews = self.forceGetInputListFromPort('SetRenderView')
+        if len(renderViews)>1:
+            raise ModuleError(self, 'There can only be one vtkRenderView '
+                              'per cell')
+        if len(renderViews)==1 and len(renderers)>0:
+            raise ModuleError(self, 'Cannot set both vtkRenderView '
+                              'and vtkRenderer to a cell')
+        renderView = self.forceGetInputFromPort('SetRenderView')
+        iHandlers = self.forceGetInputListFromPort('InteractionHandler')
+        iStyle = self.forceGetInputFromPort('InteractorStyle')
+        picker = self.forceGetInputFromPort('AddPicker')
+        self.cellWidget = self.displayAndWait(QVTKWidget, (renderers, renderView, iHandlers, iStyle, picker))
+
+AsciiToKeySymTable = ( None, None, None, None, None, None, None,
+                       None, None,
+                       "Tab", None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None,
+                       "space", "exclam", "quotedbl", "numbersign",
+                       "dollar", "percent", "ampersand", "quoteright",
+                       "parenleft", "parenright", "asterisk", "plus",
+                       "comma", "minus", "period", "slash",
+                       "0", "1", "2", "3", "4", "5", "6", "7",
+                       "8", "9", "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",
+                       "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+                       "h", "i", "j", "k", "l", "m", "n", "o",
+                       "p", "q", "r", "s", "t", "u", "v", "w",
+                       "x", "y", "z", "braceleft", "bar", "braceright",
+                       "asciitilde", "Delete",
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None)
+
+class QVTKWidget(QCellWidget):
+    """
+    QVTKWidget is the actual rendering widget that can display
+    vtkRenderer inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVTKWidget(parent: QWidget, f: WindowFlags) -> QVTKWidget
+        Initialize QVTKWidget with a toolbar with its own device
+        context
+        
+        """
+        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+
+        self.interacting = None
+        self.mRenWin = None
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.toolBarType = QVTKWidgetToolBar
+        self.iHandlers = []
+        self.setAnimationEnabled(True)
+        self.renderer_maps = {}
+        
+    def removeObserversFromInteractorStyle(self):
+        """ removeObserversFromInteractorStyle() -> None        
+        Remove all python binding from interactor style observers for
+        safely freeing the cell
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.RemoveObservers("InteractionEvent")
+            style.RemoveObservers("EndPickEvent")
+            style.RemoveObservers("CharEvent")
+            style.RemoveObservers("MouseWheelForwardEvent")
+            style.RemoveObservers("MouseWheelBackwardEvent")
+        
+    def addObserversToInteractorStyle(self):
+        """ addObserversToInteractorStyle() -> None        
+        Assign observer to the current interactor style
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.AddObserver("InteractionEvent", self.interactionEvent)
+            style.AddObserver("EndPickEvent", self.interactionEvent)
+            style.AddObserver("CharEvent", self.charEvent)
+            style.AddObserver("MouseWheelForwardEvent", self.interactionEvent)
+            style.AddObserver("MouseWheelBackwardEvent", self.interactionEvent)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        
+        """
+        self.renderer_maps = {}
+        for ren in self.getRendererList():
+            self.mRenWin.RemoveRenderer(ren)
+            
+        self.removeObserversFromInteractorStyle()
+        
+        self.updateContents(([], None, [], None, None))
+        
+        self.SetRenderWindow(None)
+
+        QCellWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Updates the cell contents with new vtkRenderer
+        
+        """
+        renWin = self.GetRenderWindow()
+        for iHandler in self.iHandlers:
+            if iHandler.observer:
+                iHandler.observer.vtkInstance.SetInteractor(None)
+            iHandler.clear()
+
+        # Remove old renderers first
+        oldRenderers = self.getRendererList()
+        for renderer in oldRenderers:
+            renWin.RemoveRenderer(renderer)
+            renderer.SetRenderWindow(None)
+        del oldRenderers
+
+        (renderers, renderView, self.iHandlers, iStyle, picker) = inputPorts
+        if renderView:
+            renderView.vtkInstance.SetupRenderWindow(renWin)
+            renderers = [renderView.vtkInstance.GetRenderer()]
+        self.renderer_maps = {}
+        for renderer in renderers:
+            if renderView==None:
+                vtkInstance = renderer.vtkInstance
+                renWin.AddRenderer(vtkInstance)
+                self.renderer_maps[vtkInstance] = renderer.moduleInfo['moduleId']
+            else:
+                vtkInstance = renderer
+            if hasattr(vtkInstance, 'IsActiveCameraCreated'):
+                if not vtkInstance.IsActiveCameraCreated():
+                    vtkInstance.ResetCamera()
+                else:
+                    vtkInstance.ResetCameraClippingRange()
+            
+        iren = renWin.GetInteractor()
+        if picker:
+            iren.SetPicker(picker.vtkInstance)
+            
+        # Update interactor style
+        self.removeObserversFromInteractorStyle()
+        if renderView==None:
+            if iStyle==None:
+                iStyleInstance = vtksnl.vtkInteractorStyleTrackballCamera()
+            else:
+                iStyleInstance = iStyle.vtkInstance
+            iren.SetInteractorStyle(iStyleInstance)
+        self.addObserversToInteractorStyle()
+        
+        for iHandler in self.iHandlers:
+            if iHandler.observer:
+                iHandler.observer.vtkInstance.SetInteractor(iren)
+        renWin.Render()
+
+        # Capture window into history for playback
+        # Call this at the end to capture the image after rendering
+        QCellWidget.updateContents(self, inputPorts)
+
+    def GetRenderWindow(self):
+        """ GetRenderWindow() -> vtkRenderWindow
+        Return the associated vtkRenderWindow
+        
+        """
+        if not self.mRenWin:
+            win = vtksnl.vtkRenderWindow()
+            win.DoubleBufferOn()
+            self.SetRenderWindow(win)
+            del win
+
+        return self.mRenWin
+
+    def SetRenderWindow(self,w):
+        """ SetRenderWindow(w: vtkRenderWindow)        
+        Set a new render window to QVTKWidget and initialize the
+        interactor as well
+        
+        """
+        if w == self.mRenWin:
+            return
+        
+        if self.mRenWin:
+            if system.systemType!='Linux':
+                self.mRenWin.SetInteractor(None)
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+            
+        self.mRenWin = w
+        
+        if self.mRenWin:
+            self.mRenWin.Register(None)
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+            if system.systemType=='Linux':
+                try:
+                    vp = '_%s_void_p' % (hex(int(QtGui.QX11Info.display()))[2:])
+                except TypeError:
+                    #This was change for PyQt4.2
+                    if isinstance(QtGui.QX11Info.display(),QtGui.Display):
+                        display = sip.unwrapinstance(QtGui.QX11Info.display())
+                        vp = '_%s_void_p' % (hex(display)[2:])
+                self.mRenWin.SetDisplayId(vp)
+                self.resizeWindow(1,1)
+            self.mRenWin.SetWindowInfo(str(int(self.winId())))
+            if self.isVisible():
+                self.mRenWin.Start()
+
+            if not self.mRenWin.GetInteractor():
+                iren = vtksnl.vtkRenderWindowInteractor()
+                if system.systemType=='Darwin':
+                    iren.InstallMessageProcOff()
+                iren.SetRenderWindow(self.mRenWin)
+                iren.Initialize()
+                if system.systemType=='Linux':
+                    system.XDestroyWindow(self.mRenWin.GetGenericDisplayId(),
+                                          self.mRenWin.GetGenericWindowId())
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                self.resizeWindow(self.width(), self.height())
+                self.mRenWin.SetPosition(self.x(), self.y())
+
+    def GetInteractor(self):
+        """ GetInteractor() -> vtkInteractor
+        Return the vtkInteractor control this QVTKWidget
+        """
+        return self.GetRenderWindow().GetInteractor()
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Process window and interaction events
+        
+        """
+        if e.type()==QtCore.QEvent.ParentAboutToChange:
+            if self.mRenWin:
+                if self.mRenWin.GetMapped():
+                    self.mRenWin.Finalize()
+        else:
+            if e.type()==QtCore.QEvent.ParentChange:
+                if self.mRenWin:
+                    self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                    if self.isVisible():
+                        self.mRenWin.Start()
+        
+        if QtCore.QObject.event(self,e):
+            return 1
+
+        if e.type() == QtCore.QEvent.KeyPress:
+            self.keyPressEvent(e)
+            if e.isAccepted():
+                return e.isAccepted()
+
+        return qt_super(QVTKWidget, self).event(e)
+        
+        # return QtGui.QWidget.event(self,e)
+        # Was this right? Wasn't this supposed to be QCellWidget.event()?
+
+    def resizeWindow(self, width, height):
+        """ resizeWindow(width: int, height: int) -> None
+        Work around vtk bugs for resizing window
+        
+        """
+        ########################################################
+        # VTK - BUGGGGGGGGG - GRRRRRRRRR
+        # This is a 'bug' in vtkWin32OpenGLRenderWindow(.cxx)
+        # If a render window is mapped to screen, the actual
+        # window size is the client area of the window in Win32.
+        # However, this real window size is only updated through
+        # vtkWin32OpenGLRenderWindow::GetSize(). So this has to
+        # be called here to get the cell size correctly. This
+        # invalidates the condition in the next SetSize().
+        # We can use self.mRenWin.SetSize(0,0) here but it will
+        # cause flickering and decrease performance!
+        # SetPosition(curX,curY) also works here but slower.
+        self.mRenWin.GetSize()
+        
+        self.mRenWin.SetSize(width, height)
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().SetSize(width, height)
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the vtkRenderWindow size then QVTKWidget resized
+        
+        """
+        qt_super(QVTKWidget, self).resizeEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.resizeWindow(self.width(), self.height())
+        self.mRenWin.Render()
+
+    def moveEvent(self,e):
+        """ moveEvent(e: QEvent) -> None
+        Echo the move event into vtkRenderWindow
+        
+        """
+        qt_super(QVTKWidget, self).moveEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.mRenWin.SetPosition(self.x(),self.y())
+
+    def paintEvent(self, e):
+        """ paintEvent(e: QPaintEvent) -> None
+        Paint the QVTKWidget with vtkRenderWindow
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        if hasattr(self.mRenWin, 'UpdateGLRegion'):
+            self.mRenWin.UpdateGLRegion()
+        self.mRenWin.Render()
+
+    def SelectActiveRenderer(self,iren):
+        """ SelectActiveRenderer(iren: vtkRenderWindowIteractor) -> None
+        Only make the vtkRenderer below the mouse cursor active
+        
+        """
+        epos = iren.GetEventPosition()
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            ren.SetInteractive(ren.IsInViewport(epos[0], epos[1]))
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        isDoubleClick = e.type()==QtCore.QEvent.MouseButtonDblClick
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      ctrl,
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),
+                                      isDoubleClick,
+                                      None)
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonPressEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonPressEvent",
+                  QtCore.Qt.RightButton:"RightButtonPressEvent"}
+
+        self.SelectActiveRenderer(iren)
+
+        if ctrl:
+            e.ignore()
+            return
+
+        self.interacting = self.getActiveRenderer(iren)
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0), 0, None)
+
+        iren.InvokeEvent("MouseMoveEvent")
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("EnterEvent")
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("LeaveEvent")
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonReleaseEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonReleaseEvent",
+                  QtCore.Qt.RightButton:"RightButtonReleaseEvent"}
+
+        self.interacting = None
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def keyPressEvent(self,e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q', 'e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl,shift,ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyPressEvent")
+
+        if ascii_key:
+            iren.InvokeEvent("CharEvent")
+
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q','e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl, shift, ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyReleaseEvent")
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+        
+        self.SelectActiveRenderer(iren)
+        
+        if e.delta()>0:
+            iren.InvokeEvent("MouseWheelForwardEvent")
+        else:
+            iren.InvokeEvent("MouseWheelBackwardEvent")
+
+    def focusInEvent(self,e):
+        """ focusInEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def focusOutEvent(self,e):
+        """ focusOutEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def contextMenuEvent(self,e):
+        """ contextMenuEvent(e: QContextMenuEvent) -> None        
+        Make sure to get the right mouse position for the context menu
+        event, i.e. also the right click
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = int(e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = int(e.modifiers()&QtCore.Qt.ShiftModifier)
+        iren.SetEventInformationFlipY(e.x(),e.y(),ctrl,shift,chr(0),0,None)
+        iren.InvokeEvent("ContextMenuEvent")
+
+    def ascii_to_key_sym(self,i):
+        """ ascii_to_key_sym(i: int) -> str
+        Convert ASCII code into key name
+        
+        """
+        global AsciiToKeySymTable
+        return AsciiToKeySymTable[i]
+
+    def qt_key_to_key_sym(self,i):
+        """ qt_key_to_key_sym(i: QtCore.Qt.Keycode) -> str
+        Convert Qt key code into key name
+        
+        """
+        handler = {QtCore.Qt.Key_Backspace:"BackSpace",
+                   QtCore.Qt.Key_Tab:"Tab",
+                   QtCore.Qt.Key_Backtab:"Tab",
+                   QtCore.Qt.Key_Return:"Return",
+                   QtCore.Qt.Key_Enter:"Return",
+                   QtCore.Qt.Key_Shift:"Shift_L",
+                   QtCore.Qt.Key_Control:"Control_L",
+                   QtCore.Qt.Key_Alt:"Alt_L",
+                   QtCore.Qt.Key_Pause:"Pause",
+                   QtCore.Qt.Key_CapsLock:"Caps_Lock",
+                   QtCore.Qt.Key_Escape:"Escape",
+                   QtCore.Qt.Key_Space:"space",
+                   QtCore.Qt.Key_End:"End",
+                   QtCore.Qt.Key_Home:"Home",
+                   QtCore.Qt.Key_Left:"Left",
+                   QtCore.Qt.Key_Up:"Up",
+                   QtCore.Qt.Key_Right:"Right",
+                   QtCore.Qt.Key_Down:"Down",
+                   QtCore.Qt.Key_SysReq:"Snapshot",
+                   QtCore.Qt.Key_Insert:"Insert",
+                   QtCore.Qt.Key_Delete:"Delete",
+                   QtCore.Qt.Key_Help:"Help",
+                   QtCore.Qt.Key_0:"0",
+                   QtCore.Qt.Key_1:"1",
+                   QtCore.Qt.Key_2:"2",
+                   QtCore.Qt.Key_3:"3",
+                   QtCore.Qt.Key_4:"4",
+                   QtCore.Qt.Key_5:"5",
+                   QtCore.Qt.Key_6:"6",
+                   QtCore.Qt.Key_7:"7",
+                   QtCore.Qt.Key_8:"8",
+                   QtCore.Qt.Key_9:"9",
+                   QtCore.Qt.Key_A:"a",
+                   QtCore.Qt.Key_B:"b",
+                   QtCore.Qt.Key_C:"c",
+                   QtCore.Qt.Key_D:"d",
+                   QtCore.Qt.Key_E:"e",
+                   QtCore.Qt.Key_F:"f",
+                   QtCore.Qt.Key_G:"g",
+                   QtCore.Qt.Key_H:"h",
+                   QtCore.Qt.Key_I:"i",
+                   QtCore.Qt.Key_J:"h",
+                   QtCore.Qt.Key_K:"k",
+                   QtCore.Qt.Key_L:"l",
+                   QtCore.Qt.Key_M:"m",
+                   QtCore.Qt.Key_N:"n",
+                   QtCore.Qt.Key_O:"o",
+                   QtCore.Qt.Key_P:"p",
+                   QtCore.Qt.Key_Q:"q",
+                   QtCore.Qt.Key_R:"r",
+                   QtCore.Qt.Key_S:"s",
+                   QtCore.Qt.Key_T:"t",
+                   QtCore.Qt.Key_U:"u",
+                   QtCore.Qt.Key_V:"v",
+                   QtCore.Qt.Key_W:"w",
+                   QtCore.Qt.Key_X:"x",
+                   QtCore.Qt.Key_Y:"y",
+                   QtCore.Qt.Key_Z:"z",
+                   QtCore.Qt.Key_Asterisk:"asterisk",
+                   QtCore.Qt.Key_Plus:"plus",
+                   QtCore.Qt.Key_Minus:"minus",
+                   QtCore.Qt.Key_Period:"period",
+                   QtCore.Qt.Key_Slash:"slash",
+                   QtCore.Qt.Key_F1:"F1",
+                   QtCore.Qt.Key_F2:"F2",
+                   QtCore.Qt.Key_F3:"F3",
+                   QtCore.Qt.Key_F4:"F4",
+                   QtCore.Qt.Key_F5:"F5",
+                   QtCore.Qt.Key_F6:"F6",
+                   QtCore.Qt.Key_F7:"F7",
+                   QtCore.Qt.Key_F8:"F8",
+                   QtCore.Qt.Key_F9:"F9",
+                   QtCore.Qt.Key_F10:"F10",
+                   QtCore.Qt.Key_F11:"F11",
+                   QtCore.Qt.Key_F12:"F12",
+                   QtCore.Qt.Key_F13:"F13",
+                   QtCore.Qt.Key_F14:"F14",
+                   QtCore.Qt.Key_F15:"F15",
+                   QtCore.Qt.Key_F16:"F16",
+                   QtCore.Qt.Key_F17:"F17",
+                   QtCore.Qt.Key_F18:"F18",
+                   QtCore.Qt.Key_F19:"F19",
+                   QtCore.Qt.Key_F20:"F20",
+                   QtCore.Qt.Key_F21:"F21",
+                   QtCore.Qt.Key_F22:"F22",
+                   QtCore.Qt.Key_F23:"F23",
+                   QtCore.Qt.Key_F24:"F24",
+                   QtCore.Qt.Key_NumLock:"Num_Lock",
+                   QtCore.Qt.Key_ScrollLock:"Scroll_Lock"}
+        if i in handler:            
+            return handler[i]
+        else:
+            return "None"
+
+    def getRendererList(self):
+        """ getRendererList() -> list
+        Return a list of vtkRenderer running in this QVTKWidget
+        """
+        result = []
+        renWin = self.GetRenderWindow()
+        renderers = renWin.GetRenderers()
+        renderers.InitTraversal()
+        for i in xrange(renderers.GetNumberOfItems()):
+            result.append(renderers.GetNextItem())
+        return result
+
+    def getActiveRenderer(self, iren):
+        """ getActiveRenderer(iren: vtkRenderWindowwInteractor) -> vtkRenderer
+        Return the active vtkRenderer under mouse
+        
+        """
+        epos = list(iren.GetEventPosition())
+        if epos[1]<0:
+            epos[1] = -epos[1]
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            if ren.IsInViewport(epos[0], epos[1]):
+                return ren
+        return None
+
+    def findSheetTabWidget(self):
+        """ findSheetTabWidget() -> QTabWidget
+        Find and return the sheet tab widget
+        
+        """
+        p = self.parent()
+        while p:
+            if hasattr(p, 'isSheetTabWidget'):
+                if p.isSheetTabWidget()==True:
+                    return p
+            p = p.parent()
+        return None
+
+    def getRenderersInCellList(self, sheet, cells):
+        """ isRendererIn(sheet: spreadsheet.StandardWidgetSheet,
+                         cells: [(int,int)]) -> bool
+        Get the list of renderers in side a list of (row, column)
+        cells.
+        
+        """
+        rens = []
+        for (row, col) in cells:
+            cell = sheet.getCell(row, col)
+            if hasattr(cell, 'getRendererList'):
+                rens += cell.getRendererList()
+        return rens
+
+    def getSelectedCellWidgets(self):
+        sheet = self.findSheetTabWidget()
+        if sheet:
+            iren = self.mRenWin.GetInteractor()
+            ren = self.interacting
+            if not ren: ren = self.getActiveRenderer(iren)
+            if ren:
+                cells = sheet.getSelectedLocations()
+                if (ren in self.getRenderersInCellList(sheet, cells)):
+                    return [sheet.getCell(row, col)
+                            for (row, col) in cells
+                            if hasattr(sheet.getCell(row, col), 
+                                       'getRendererList')]
+        return []
+
+    def interactionEvent(self, istyle, name):
+        """ interactionEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure interactions sync across selected renderers
+        
+        """
+        if name=='MouseWheelForwardEvent':
+            istyle.OnMouseWheelForward()
+        if name=='MouseWheelBackwardEvent':
+            istyle.OnMouseWheelBackward()
+        ren = self.interacting
+        if not ren:
+            ren = self.getActiveRenderer(istyle.GetInteractor())
+        if ren:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            for cell in self.getSelectedCellWidgets():
+                if cell!=self and hasattr(cell, 'getRendererList'): 
+                    rens = cell.getRendererList()
+                    for r in rens:
+                        if r!=ren:
+                            dcam = r.GetActiveCamera()
+                            dcam.SetPosition(cpos)
+                            dcam.SetFocalPoint(cfol)
+                            dcam.SetViewUp(cup)
+                            r.ResetCameraClippingRange()
+                    cell.update()
+
+    def charEvent(self, istyle, name):
+        """ charEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure key presses also sync across selected renderers
+
+        """
+        iren = istyle.GetInteractor()
+        ren = self.interacting
+        if not ren: ren = self.getActiveRenderer(iren)
+        if ren:
+            keyCode = iren.GetKeyCode()
+            if keyCode in ['w','W','s','S','r','R','p','P']:
+                for cell in self.getSelectedCellWidgets():
+                    if hasattr(cell, 'GetInteractor'):
+                        selectedIren = cell.GetInteractor()
+                        selectedIren.SetKeyCode(keyCode)
+                        selectedIren.GetInteractorStyle().OnChar()
+                        selectedIren.Render()
+            istyle.OnChar()
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+        
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+        
+        """
+        w2i = vtksnl.vtkWindowToImageFilter()
+        w2i.ReadFrontBufferOff()
+        w2i.SetInput(self.mRenWin)
+        # Render twice to get a clean image on the back buffer
+        self.mRenWin.Render()
+        self.mRenWin.Render()
+        w2i.Update()
+        writer = vtksnl.vtkPNGWriter()
+        writer.SetInputConnection(w2i.GetOutputPort())
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def captureWindow(self):
+        """ captureWindow() -> None        
+        Capture the window contents to file
+        
+        """
+        fn = QtGui.QFileDialog.getSaveFileName(None,
+                                               "Save file as...",
+                                               "screenshot.png",
+                                               "Images (*.png)")
+        if fn.isNull():
+            return
+        self.saveToPNG(str(fn))
+        
+    def grabWindowPixmap(self):
+        """ grabWindowImage() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        uchar = self.saveToPNG(None)
+
+        ba = QtCore.QByteArray()
+        buf = QtCore.QBuffer(ba)
+        buf.open(QtCore.QIODevice.WriteOnly)
+        for i in xrange(uchar.GetNumberOfTuples()):
+            c = uchar.GetValue(i)
+            buf.putChar(chr(c))
+        buf.close()
+        
+        pixmap = QtGui.QPixmap()
+        pixmap.loadFromData(ba, 'PNG')
+        return pixmap
+
+    def dumpToFile(self, filename):
+        """dumpToFile() -> None
+        Dumps itself as an image to a file, calling saveToPNG
+        """
+        self.saveToPNG(filename)
+
+class QVTKWidgetCapture(QtGui.QAction):
+    """
+    QVTKWidgetCapture is the action to capture the vtk rendering
+    window to an image
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKWidgetCapture(parent: QWidget) -> QVTKWidgetCapture
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera.png"),
+                               "&Capture image to file",
+                               parent)
+        self.setStatusTip("Capture the rendered image to a file")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.captureWindow()
+
+class QVTKWidgetSaveCamera(QtGui.QAction):
+    """
+    QVTKWidgetSaveCamera is the action to capture the current camera
+    of the vtk renderers and save it back to the pipeline
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKWidgetSaveCamera(parent: QWidget) -> QVTKWidgetSaveCamera
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               "Save &Camera",
+                               parent)
+        self.setStatusTip("Save current camera views to the pipeline")
+
+    def setCamera(self, controller):
+        ops = []
+        pipeline = controller.current_pipeline                        
+        cellWidget = self.toolBar.getSnappedWidget()
+        renderers = cellWidget.getRendererList()
+        for ren in renderers:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            rendererId = cellWidget.renderer_maps[ren]
+            # Looking for SetActiveCamera()
+            camera = None
+            renderer = pipeline.modules[rendererId]
+            for c in pipeline.connections.values():
+                if c.destination.moduleId==rendererId:
+                    if c.destination.name=='SetActiveCamera':
+                        camera = pipeline.modules[c.source.moduleId]
+                        break
+            
+            if not camera:
+                # Create camera
+                vtk_package = 'edu.utah.sci.vistrails.vtksnl'
+                camera = controller.create_module(vtk_package, 'vtkCamera', '',
+                                                  0.0, 0.0)
+                ops.append(('add', camera))
+
+                # Connect camera to renderer
+                camera_conn = controller.create_connection(camera, 'self',
+                                                           renderer, 
+                                                           'SetActiveCamera')
+                ops.append(('add', camera_conn))
+            # update functions
+            def convert_to_str(arglist):
+                new_arglist = []
+                for arg in arglist:
+                    new_arglist.append(str(arg))
+                return new_arglist
+            functions = [('SetPosition', convert_to_str(cpos)),
+                         ('SetFocalPoint', convert_to_str(cfol)),
+                         ('SetViewUp', convert_to_str(cup))]
+            ops.extend(controller.update_functions_ops(camera, functions))
+
+        action = core.db.action.create_action(ops)
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        controller.select_latest_version()
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        visApp = QtCore.QCoreApplication.instance()
+        if hasattr(visApp, 'builderWindow'):
+            builderWindow = visApp.builderWindow
+            if builderWindow:
+                info = self.toolBar.sheet.getCellPipelineInfo(
+                    self.toolBar.row, self.toolBar.col)
+                if info:
+                    info = info[0]
+                    viewManager = builderWindow.viewManager
+                    view = viewManager.ensureVistrail(info['locator'])
+                    if view:
+                        controller = view.controller
+                        controller.change_selected_version(info['version'])
+                        self.setCamera(controller)
+                        
+                
+class QVTKWidgetToolBar(QCellToolBar):
+    """
+    QVTKWidgetToolBar derives from QCellToolBar to give the VTKCell
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(QVTKWidgetCapture(self))
+        self.addAnimationButtons()
+        self.appendAction(QVTKWidgetSaveCamera(self))
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    identifier = 'edu.utah.sci.vistrails.vtksnl'
+    registry = get_module_registry()
+    registry.add_module(VTKCell)
+    registry.add_input_port(VTKCell, "Location", CellLocation)
+    import core.debug
+    for (port,module) in [("AddRenderer",'vtkRenderer'),
+                          ("SetRenderView",'vtkRenderView'),
+                          ("InteractionHandler",'vtkInteractionHandler'),
+                          ("InteractorStyle", 'vtkInteractorStyle'),
+                          ("AddPicker",'vtkAbstractPicker')]:
+        try:
+            registry.add_input_port(VTKCell, port,'(%s:%s)'%(identifier,module))
+ 
+        except Exception, e:
+            core.debug.warning(str(e))
+
+    registry.add_output_port(VTKCell, "self", VTKCell)
diff --git a/contrib/vtksnl/vtkcell_rc.py b/contrib/vtksnl/vtkcell_rc.py
new file mode 100644
index 0000000..8aa8cbf
--- /dev/null
+++ b/contrib/vtksnl/vtkcell_rc.py
@@ -0,0 +1,793 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+# Resource object code
+#
+# Created: Fri Sep 22 09:09:40 2006
+#      by: The Resource Compiler for PyQt (Qt v4.1.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = "\
+\x00\x00\x09\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x08\xd6\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x32\x60\x64\x64\x64\xc0\x00\x6c\x82\x0c\x0c\
+\xdc\xca\x0c\x0c\x3c\x40\x2c\x62\xc3\xc0\xc0\xc4\x0e\x14\x04\xea\
+\x63\x64\xb0\x61\xf8\xf5\x6f\x15\xc3\x9f\xbf\x07\x19\x38\x59\x4b\
+\x81\x82\x4f\x30\xf4\xfe\x7a\x0f\x14\x5d\xc3\xc0\xf0\xfe\x0c\x5c\
+\x08\xd9\x4e\x80\x00\x62\xc4\xeb\x00\x4e\x29\x06\x06\x09\x0f\x06\
+\x06\x3e\x1d\x06\x06\x56\x3e\xa0\x24\x13\x03\xc3\xbf\x3f\x10\xcb\
+\xc1\x86\xff\x6d\xd0\x31\x94\xaa\xe7\xe5\x65\x67\x38\xbe\xef\xee\
+\x43\x06\x56\xa6\x0e\x06\x56\xe6\x39\x40\x99\x3f\x08\x03\x99\x40\
+\x04\x03\xc3\xdb\x63\x0c\x0c\x8f\x57\x01\x65\xbe\xa0\x38\x00\x20\
+\x80\x98\x18\x70\x01\x61\x2b\x06\x06\xad\x7a\x06\x06\x51\x07\x88\
+\xe5\xff\xff\x02\x2d\xff\x8d\xb0\x1c\x04\x7e\xff\x63\x94\x93\xe5\
+\x67\x58\x36\xc5\x83\xa1\xaa\xc1\x4d\x5e\x44\x9c\x7f\x3a\xc3\xd7\
+\x5f\x47\x18\xfe\xfd\x77\x41\x78\xf7\x1f\x44\x2f\xc8\x1c\x9d\x66\
+\x06\x06\x29\x5f\x14\x6b\x00\x02\x08\xbb\x03\x84\xcc\x18\x18\x94\
+\x33\x20\x2e\xff\xfb\x1d\x62\x00\x36\xc0\xc8\xf0\xfd\xfb\xf7\xbf\
+\x0c\x0f\x3e\x33\x30\x58\xb9\xaa\x32\xf4\x4d\x0e\x61\xf0\x08\x33\
+\x33\x67\x62\x66\xde\xcd\xf0\xe3\xd7\x22\xa0\x0a\x65\xb8\x5a\x90\
+\x39\x2c\xbc\x0c\x0c\x32\x61\x28\x46\x00\x04\x10\x0b\x56\x83\x55\
+\xb2\x21\x1a\x10\x80\x19\xe8\x71\x63\x86\xbf\xff\xf4\x81\xbe\x13\
+\x05\xf3\x81\xe1\x01\x8c\x02\xe7\xef\x3f\xff\x31\x3c\x06\x46\xf3\
+\xc3\x77\x0c\x0c\x5c\xec\x6c\x0c\xc1\x09\x66\x0c\x5a\x26\xaa\x0c\
+\xeb\x57\x9c\x8a\xbd\x7f\xe9\xae\x2f\x03\x13\x43\x0f\x03\x2b\xcb\
+\x04\xa0\xfa\xaf\x60\x8f\xfc\xfd\x86\x62\x15\x40\x00\x61\xa6\x01\
+\xad\x6a\xa0\x49\xf2\x0c\x48\x29\x26\x96\xe1\xc7\x9f\x42\x06\x76\
+\x26\x43\x71\x71\x6e\x06\x50\x7c\x83\xd2\x09\x48\x17\xe3\xcf\xdf\
+\x0c\x9a\xc6\x4a\x0c\xd6\x7e\x96\x0c\xcf\x3f\x01\xd3\x26\x23\x24\
+\x82\x38\x39\x80\x72\x40\xbb\x6e\x9e\x7b\xc8\x70\x64\xdb\x29\x86\
+\x17\x77\x5f\x5e\x65\x60\x63\xa9\x63\x60\x61\x5a\x07\x36\xf2\x4c\
+\x1a\xdc\x78\x80\x00\xc2\x74\x80\xd9\x02\xa0\xdf\x7e\x81\x98\xdc\
+\xc0\xd4\x3d\x87\x85\x99\x31\xc2\xc6\x49\x8d\xc1\xc4\x5e\x9d\x81\
+\x5f\x5c\x04\xe8\x77\x56\xa8\xc3\x80\x08\x68\x21\x33\x90\x78\xf1\
+\x81\x91\xe1\xed\x0f\x20\x9b\x11\xe6\x66\x48\xda\xe3\xe6\x04\x3a\
+\x06\xe8\xeb\x07\x67\x2e\x33\x1c\xd8\x76\x81\xe1\xfd\xeb\xaf\x9b\
+\x18\x38\x58\x6b\x80\x0e\xb8\x0c\xb3\x0f\x20\x80\x30\x1d\x60\x32\
+\x0b\x12\x35\x7f\xfe\xae\xe7\xe5\xe3\xf0\xf1\x88\x77\x66\xe0\x57\
+\x92\x63\x78\xf9\x81\x01\x18\xe1\x40\xb7\x21\x29\x07\xb1\x85\x81\
+\x96\xb0\x00\x2d\x7b\xfb\x1d\x12\x02\xc8\x00\x6c\x34\x50\x4c\x0c\
+\x98\x8b\x65\xb8\x7e\x30\x1c\x59\x77\x84\xe1\xe8\xfe\xdb\xef\xff\
+\x5f\xcc\x14\x82\xa9\x01\x08\x20\xec\x69\xe0\xdf\xff\x62\x56\x36\
+\x16\x1f\xd3\x30\x4f\x86\xb7\x3c\x12\x0c\xf7\xef\x00\x7d\x07\xb4\
+\x84\x09\x84\x99\x51\x1d\xf0\x0d\x98\x31\xfe\x01\x83\xfb\xe3\x77\
+\x44\x08\xa0\x24\x1e\x60\x80\xdd\x7d\xc1\xc0\x70\xf6\xfe\x0b\x86\
+\x4f\x0f\x3f\x82\x14\x5d\x45\x96\x07\x08\x20\x6c\x0e\x90\x65\xf8\
+\xfd\xbb\x4c\xc1\xce\x9a\x41\x40\x41\x82\xe1\x27\x30\xcd\x70\x09\
+\x00\xcb\x22\x60\xd9\xf3\xe3\xeb\x1f\x86\xcf\x6f\x3f\x32\xfc\x83\
+\x05\x03\x90\x66\x15\xe4\x60\xe0\x11\xe4\x65\x60\x61\x05\x95\x21\
+\x48\x16\x03\x1d\xca\xc2\xc6\xc0\xf0\xea\xe1\x5b\x86\x9b\xfb\x4e\
+\x32\xbc\xb9\xf3\xe0\x35\x50\x05\xa8\x9c\x98\x86\x6c\x19\x40\x00\
+\x61\x3a\xe0\xef\xbf\x44\x36\x01\x3e\x21\x13\x7b\x6d\x06\x41\x1e\
+\x20\x17\x98\xa0\xd8\x80\xf8\xc6\xd9\xfb\x0c\x27\x37\x1d\x67\xf8\
+\xfc\xf1\x33\x3c\x68\x19\x7e\xfc\x66\xd0\xb5\xd6\x64\x70\x4f\x70\
+\x66\xe0\x01\x3a\x94\x11\x1a\xf7\x1c\xc0\x68\xf9\x08\x4c\x14\xa7\
+\x77\x9f\x67\xb8\x7e\xec\xca\xff\xbf\x3f\x7f\xcd\x65\x60\x63\x05\
+\x16\x02\x0c\x8f\xd0\xad\x03\x08\x20\x4c\x07\xfc\xfa\xe3\xa3\xac\
+\x29\xc5\xa0\xa7\xce\xc6\xf0\x0b\x98\xb0\x58\x81\xbe\x78\x70\xeb\
+\x35\xc3\xbe\x45\xbb\x18\xfe\xfe\xfe\xbb\x18\xe8\x83\x79\x40\x6b\
+\xbe\x83\x5d\xf1\x9f\x21\x95\x99\x85\x21\x59\x1c\x18\x42\x3c\xc0\
+\x10\xe2\x04\x5a\xfc\x1b\x98\x7e\x4f\x1e\xb8\xce\x70\x70\xe3\x59\
+\x86\x4f\x2f\x3f\x1c\x62\x60\x67\xad\x01\x5a\x7e\x18\xb9\xf0\x40\
+\x06\x00\x01\x84\xe9\x80\x3f\xff\x95\x35\x35\x84\x19\xd4\x64\x81\
+\xf1\xfb\x15\x68\x28\x17\x03\xc3\xee\x15\xb7\x18\xfe\x7e\xfd\x75\
+\x0e\x68\x4b\x1c\xaa\x41\x8c\x2e\xac\x40\x13\x64\xc5\x81\x21\x05\
+\x2c\x7c\x2f\x9c\x79\xce\xb0\x7e\xf1\x29\x86\x3b\x97\x9e\x80\x8a\
+\xe5\x66\x06\x4e\xb6\x79\xa8\x45\x27\x88\xf7\x1b\x85\x0b\x10\x40\
+\x98\x0e\xe0\x64\x15\x3a\x73\xf4\x2e\xc3\x8b\x27\x6f\xc0\x86\x82\
+\x12\xdd\xf5\x2b\xc0\x54\xc4\xc9\x76\x1f\x43\xed\x7f\x06\x76\x01\
+\x5e\x16\x06\xe6\x1f\xdf\x18\xe6\x4c\x39\xc5\xb0\x77\xfb\x8d\x1f\
+\xff\x7f\xff\x9d\x02\x34\xa3\x13\x28\xfb\x06\x6b\x02\xff\xfd\x09\
+\x85\x0b\x10\x40\x98\x0e\x60\x65\xea\x7f\x74\xe7\xb5\xc2\xa3\xeb\
+\x2f\x21\x9e\x04\xb9\x9f\x1d\x94\xa2\x98\xd6\xa0\xf9\x05\x28\xce\
+\xf2\xfd\xca\xc5\x67\x0c\x99\x49\xeb\x18\xde\x3c\xf8\xb0\x85\x81\
+\x9b\xb5\x16\x98\xcf\x2f\x30\xe0\x03\xec\x22\x28\x5c\x80\x00\x62\
+\xc1\xe2\xab\x22\x60\x3c\x33\x80\x31\xaa\x38\x26\x60\x61\x9c\xfe\
+\xfc\xf1\x47\x50\xc9\x74\x89\x81\x87\x6d\x03\x03\x31\x00\x54\x39\
+\x21\x01\x80\x00\x62\x62\xa0\x04\xfc\xfd\x2f\x01\x4e\xd9\x2c\x4c\
+\x7b\xc8\x35\x02\x20\x80\x30\x43\x80\x11\x28\xf4\xff\x0f\x21\x7d\
+\x02\xc0\xfa\xa1\x94\x89\x8b\xb5\x40\x48\x88\x93\xeb\xcd\xab\xaf\
+\x86\xc0\x62\x30\x1f\x4d\x8d\x31\x30\xa7\x44\x03\x2b\x2c\x44\xb2\
+\x07\x95\x64\xac\x4c\xc0\x04\xc5\xd0\x09\x13\x02\x08\x20\x4c\x07\
+\x7c\x05\xa6\x35\x2e\x59\xdc\x56\xff\xf9\x17\x03\xcc\xaa\x0d\x6a\
+\xfa\xd2\xca\xb9\x25\x56\x0c\xc7\x8f\x3e\x66\x58\x36\xfd\x84\x20\
+\x03\x37\x1b\x7a\x39\x1c\xc6\xc6\xc1\x5a\x28\xaf\x21\x06\x6f\xe8\
+\x7c\xfa\xf4\x03\x98\xb8\x3f\x32\x20\x3b\x00\x20\x80\x30\x1d\xc0\
+\xc2\xc3\x80\xa3\x78\x36\x07\x16\x3c\x2d\xfc\xe2\x7c\x2e\x3e\xe1\
+\xc6\x0c\xae\xde\x5a\x0c\x42\xc2\x8c\x0c\x3b\x76\x3e\x04\xa7\x6d\
+\x0c\xf5\x3f\xfe\xc8\xab\xe8\xc9\x30\xd4\x76\x7a\x03\x0b\x56\x48\
+\xe1\xb4\x77\xdb\x6d\x86\x99\x6d\xbb\xbe\x22\x2b\x03\x08\x20\x16\
+\xac\xa9\x14\xb5\x01\x22\xc5\xf0\xf3\x77\x15\x33\x3b\x6b\xba\xb1\
+\xa7\x01\x8b\x4b\x90\x11\x83\xa8\x38\x17\xc3\x33\x60\xe5\xf4\x1e\
+\x58\x50\xfd\xf8\x09\x2e\x12\x80\x4d\x26\x06\x79\xb8\x99\xff\xfe\
+\xf9\x03\x71\x90\xa6\xa9\x2a\x58\xdd\x4f\xa0\x3a\x0e\x60\x79\x72\
+\xf3\x0e\xc8\xf7\xff\x5f\x22\x1b\x0e\x10\x40\x58\x72\xc1\x5f\x84\
+\xdc\x9f\xbf\xe9\x40\x83\x6a\xa4\x35\xe5\x25\x2c\x7d\xcd\x18\xe4\
+\xd5\xc4\x18\xbe\x02\x7d\xf3\xf1\x31\x24\x53\xf0\x02\x03\xeb\xc7\
+\x0f\x60\xaa\xfe\xf3\x3b\x90\xe1\x37\x93\x37\xd4\x00\x66\x16\x36\
+\x36\x36\x3d\x5f\x63\x06\x69\x3d\x35\x86\xfb\xcf\x20\x65\xd6\x9f\
+\xb7\xc0\xac\x72\xee\x31\x28\x0d\x1c\x41\xb6\x0e\x20\x80\x70\xd5\
+\x86\x2e\xc0\x70\x6b\xe5\x12\x15\x32\xd3\xb0\x37\x65\x50\x32\x54\
+\x05\xa7\x9f\x7b\x4f\x51\x73\x25\x37\x30\x30\xc5\x35\xd5\x19\x8c\
+\x79\xc4\x99\x99\x58\x98\x38\x41\xc5\x33\x13\x30\xae\xf9\x44\x05\
+\x19\x04\x25\xf8\x18\x9e\x00\xab\x9f\x7f\x40\xf7\xb1\x02\xeb\x92\
+\xfb\x97\x1e\x33\xbc\x7b\x08\x4c\x7f\xac\x2c\x73\x91\xad\x02\x08\
+\x20\x16\x2c\x96\xcf\xe6\x15\xe0\x4c\xe1\x53\x33\x61\x90\x34\xd0\
+\x65\xe0\xe6\x63\x63\x78\xf6\x16\x5a\xb7\x33\xa0\x56\xc5\xbc\xc0\
+\x74\xc7\xc5\x2d\xc8\xc0\xa1\x28\xc8\x80\x5c\x6a\x7c\x07\x5a\xfa\
+\xe5\x15\xa8\x5e\x83\xd4\xa2\x7c\xc0\x86\xc4\xcd\xbd\x47\x40\x21\
+\x01\x6c\x9f\x33\x1c\x42\x36\x07\x20\x80\x30\x1d\xf0\xfb\x6f\x84\
+\x86\x86\x28\x83\x73\xb4\x3e\xc3\xbd\x8f\x2c\x0c\xaf\x80\x6d\x3d\
+\x76\x56\xf4\x2a\x04\xe2\x00\x6e\x76\x50\x88\x42\x1b\xe1\x4c\xa8\
+\x85\x0b\xa8\x06\x15\x01\x36\x44\x38\x7e\x7c\x62\xd8\xbb\x68\x37\
+\xc3\xe7\x97\xef\xee\x01\x0d\xca\x43\xb7\x0e\x20\x80\xb0\x24\x42\
+\x16\xd7\xd3\x47\x1e\x34\x3f\xba\xbb\xdc\xc5\x11\x18\x8f\x86\xba\
+\x9a\x0c\x9f\xfe\x30\x32\x7c\xfb\x8e\x5a\x1a\xc2\x42\x40\x46\x98\
+\x81\x41\x9d\x09\x62\x29\xac\x96\x06\x85\xc6\x9f\x6f\x9f\x19\x6e\
+\x9f\xbf\xcb\xb0\x65\xc3\x45\x86\x77\xaf\xbf\x5c\x06\x5a\x0e\x6a\
+\x0e\x3f\x47\xf7\x0a\x40\x00\xe1\x6a\x92\x81\x42\x22\x1e\x98\x08\
+\xeb\xe4\x35\xa5\x95\x6c\xbc\x81\x09\x50\x4b\x1a\x58\x51\x42\x52\
+\x3d\x23\xb8\x49\x0c\xf4\x21\x30\x11\x3e\x3e\x7f\x83\xe1\xf2\xf1\
+\x1b\x20\x87\xc3\xcd\xf8\xfc\xf9\x27\xc3\x93\x47\x1f\x19\x3e\xbd\
+\xf9\xf6\x0e\x18\xe7\xf3\x80\x25\x65\x2b\x50\xf8\x03\xc4\x02\x60\
+\x03\xfb\x74\x32\x5c\x2d\x40\x00\xe1\x76\x00\xb4\x87\x00\xcc\x82\
+\xa5\xc0\x2a\x31\x4f\xdd\x58\x8d\xcb\x37\x0c\x98\x20\x55\x79\x19\
+\x3e\x01\x43\xe3\x07\xb0\xde\x97\x01\xb6\xec\xd6\xcd\x3f\xc1\xb0\
+\x6d\xe1\xf1\xdb\xc0\xf8\x38\x08\x0d\xfd\x7f\xc0\x94\xf8\x16\x68\
+\xe9\x45\x60\xf3\xeb\x00\xc4\xd7\xb0\x66\x12\xb0\x30\xb8\x5a\xcf\
+\xf0\xff\xcb\x3d\xb8\x10\x40\x00\x61\x46\x01\x33\x17\xb4\x4f\x00\
+\x76\xd8\x3b\x60\xd0\x55\x02\x53\xe0\xb2\x9b\xa7\xae\x35\xdd\xbb\
+\xf6\x30\xc0\xcb\xdf\x80\x21\x24\x54\x97\x81\x4b\x9c\x05\x58\xf9\
+\x01\xa3\x81\x8b\x09\x54\x85\x1f\x60\xe0\x64\x49\xc3\x5b\x78\x83\
+\x2c\x7f\xb9\x1b\x52\xd2\x22\x01\x80\x00\xc2\xac\x8c\x9e\xac\x82\
+\x58\x0e\xd2\x80\xe8\x30\x5e\x66\xe0\x60\x0b\xfc\xfd\xf3\x67\xe0\
+\xc6\x45\x47\x2f\x97\x17\xac\x63\xb8\x72\xec\x01\x83\x16\xb0\x25\
+\xc4\xcb\xcd\x0c\x52\xce\x8a\xab\xeb\x04\xae\x5b\x98\x40\x8d\xc3\
+\xfd\xc0\xde\xcb\x62\x0c\x15\x00\x01\x84\xbd\x73\x0a\xee\x94\x7a\
+\x02\x23\xd9\x1a\x52\x30\xa1\x56\xa1\x5c\xc0\xba\x20\x07\x18\xd0\
+\x25\xae\xde\x1a\xa2\xff\x80\xfa\xf7\x6e\xbf\xb9\x18\x98\x06\x10\
+\xad\x25\x90\x85\x20\xcb\xff\x01\x8b\xc0\x9f\xc0\xc2\xe0\xd1\x72\
+\x06\x86\x4f\xd7\xb0\xf6\x8e\x01\x02\x08\x7f\xef\x58\xc0\x00\x58\
+\xc0\xc6\x62\xaf\x1f\xfe\x03\xfb\x7d\xc0\xba\x01\xd8\x6e\x70\x07\
+\xe6\xc5\x22\x20\x7f\x01\xd8\x52\x90\x63\x3f\x5e\x02\x16\x04\xb7\
+\x80\xa9\x11\x88\xbf\x3f\xc3\xa8\x5d\x91\xed\x04\x08\x30\x00\xbd\
+\xc3\xf9\xac\x32\x36\xd0\x57\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\x43\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xcc\xaa\x63\xf8\xf1\x27\x89\xe1\
+\xcf\xbf\xbf\x40\x2e\x44\x10\x01\x98\x18\xd8\x98\xff\x31\xb0\x33\
+\xb7\x01\x65\xe6\x31\xe0\x03\x8c\x0c\x21\x0c\xbf\xff\xb5\x00\xcd\
+\x62\x03\xf2\xfe\x61\xc8\x33\x33\x71\x30\x70\xb2\x6c\xfc\x7f\x26\
+\x2d\x1b\xc4\x05\x08\x20\x46\xb8\x03\x74\xa7\x7d\x48\x89\xd0\xe3\
+\xb7\xd4\x17\x67\xf8\xfe\xf3\x2f\x8a\x1e\x4e\x76\x66\x86\xcd\x87\
+\x1e\x32\x6c\xd8\x76\xfb\x04\x03\x3b\x93\x25\xaa\x85\x8c\xa8\x16\
+\xfc\xf8\xb3\xce\xca\x54\x3a\x30\x25\x44\x9b\xe1\xdb\x8f\x3f\x28\
+\x52\xec\x6c\xcc\x0c\x57\xef\xbe\x63\x98\xb8\xe8\xc2\xa7\x7f\xe7\
+\xd2\xf9\x41\x62\x00\x01\xc4\x02\x97\xfd\xfd\x8f\xc1\xc6\x54\x96\
+\x21\xd6\x4d\x9e\xe1\x13\x92\x3e\x90\xf3\x04\x80\xaa\x9e\xbc\xf9\
+\xc1\xb0\x61\xd3\x8d\x7f\x0c\x6c\x4c\xe8\x3e\x46\x65\xff\xfe\xf7\
+\x4f\x45\x4e\x90\x21\xc1\x5b\x85\xe1\xc3\x1f\x54\x69\x1e\xa0\x39\
+\x3b\xcf\xbc\x62\x98\xb4\xe0\x3c\x3c\x84\x01\x02\x88\x05\x29\x90\
+\xff\x3f\xff\xf8\x97\xe1\xe6\x07\x06\x86\xaf\xdf\x50\x1d\xc0\xcb\
+\xcd\xc0\xf0\xf6\xcb\x3f\x90\x69\xff\xf1\x06\xff\x7f\x88\x39\x1f\
+\xbf\xff\x63\xb8\xf9\x91\x81\xe1\xf3\x67\xa0\x16\x24\xf7\x72\x72\
+\x30\x30\x3c\x7d\xf7\x97\xe1\x3f\x92\x39\x00\x01\xc4\x82\xac\xff\
+\xd3\x4f\x06\x86\x97\x5f\x18\x18\xbe\x7d\x47\x35\xf7\x1b\x50\xf9\
+\x97\xdf\x68\xbe\xc5\x03\x40\x21\xff\x0a\x68\xce\xe7\x6f\xa8\x31\
+\xc4\x09\x8c\xd9\xf7\x3f\x50\xd5\x02\x04\x10\x0b\x72\xf0\x81\x1c\
+\xf0\xfa\x2b\x03\xc3\x77\x34\x07\x7c\x05\x3a\xe0\xeb\x2f\xe2\x2c\
+\x07\x99\x03\x76\x00\xd0\x9c\xaf\x5f\x51\x1d\xc0\x01\x74\xc0\xc7\
+\x1f\xa8\x1e\x01\x08\x20\x94\x10\xf8\x08\x74\xc0\x0b\xa0\xa6\x1f\
+\x68\x0e\x00\x69\xfc\xf2\x8b\xc8\x10\x00\xaa\xf9\x0e\x54\xff\x02\
+\x14\x92\x68\x21\xc0\xfe\x07\x1a\x02\x48\x11\x09\x10\x40\xa8\x21\
+\xf0\x03\x12\x05\xbf\x7e\xa2\x9a\xc9\xfe\x0f\xc9\x01\x8c\xc4\x85\
+\xc0\x4b\xa0\xe5\x3f\xbf\xa1\xaa\x67\x05\x3a\xec\x03\x5a\x14\x00\
+\x04\x10\x8a\x03\x40\x21\xf0\xf2\x2b\xa6\x03\xd8\xfe\x40\x1d\x40\
+\x24\xf8\xfe\x07\x12\x02\xbf\xbe\x81\x13\x25\xc2\x01\xbf\xa0\x21\
+\x80\xe4\x28\x80\x00\xc2\x70\x00\x48\xe3\x5f\x34\xcb\x58\xfe\x90\
+\x18\x05\x7f\x20\x21\xf9\x07\xcd\x23\xcc\xac\x90\x10\x40\xce\x4a\
+\x00\x01\x84\x92\x06\xbe\x02\x35\xbc\xfd\x86\xe9\x00\x66\xa0\x81\
+\xdf\x48\xc8\x05\x3f\xff\x40\xcc\xc1\xe6\x00\x50\x34\x23\x1b\x03\
+\x10\x40\x28\x0e\xf8\xf7\x1f\x81\x51\x3c\xf5\x1f\x4b\xe1\x8c\x27\
+\x04\x40\x6a\xff\xfe\xc3\x6e\x0e\x48\x0c\x59\x18\x20\x80\x58\x08\
+\x95\x2b\x30\xfa\x3f\x03\xf9\xe0\x3f\x1a\x8d\x1c\x02\x00\x01\xc4\
+\x82\xae\x90\x52\xcb\x48\x35\x07\x20\x80\x98\x18\x06\x18\x00\x04\
+\xd0\x80\x3b\x00\x20\x80\x06\xdc\x01\x00\x01\x34\xe0\x0e\x00\x08\
+\xa0\x01\x77\x00\x40\x00\x0d\xb8\x03\x00\x02\x68\xc0\x1d\x00\x10\
+\x40\x28\xe5\x00\x0b\x33\xb0\xe6\x63\x81\x94\x62\x28\x45\x28\x50\
+\x8c\x99\x99\xc8\x8c\x0d\x54\xc3\x04\x2c\x69\xd8\x59\xb1\x9b\x03\
+\xb2\x03\xd9\x18\x80\x00\x62\x41\xd6\xc8\x05\x6c\xc7\xf2\x71\x01\
+\xcb\x70\xb4\xf2\x91\x95\x1d\xd8\x26\x60\x21\xde\x57\x6c\x40\xb5\
+\xfc\x40\x73\x7e\x33\xa1\xd5\x7c\x40\x47\xfd\x64\x47\x55\x0b\x10\
+\x40\x28\xc6\x72\x80\x1c\xc0\x09\xd5\x88\xe6\x00\x90\x8f\x88\x0d\
+\x01\x56\xa0\xa9\xbc\x20\x73\x18\x30\x1d\xf0\x95\x1d\xb5\x28\x06\
+\x08\x20\x14\x07\x70\x82\x1c\x00\x6c\x38\xfe\x42\x73\x00\x1b\x07\
+\xd4\x01\x44\x02\x56\x66\x88\x47\x7e\xa1\x3b\x00\x68\xf9\x47\x36\
+\x54\xb5\x00\x01\x84\x70\xc0\x3f\x88\x03\x78\xb9\x30\x1d\xc0\xce\
+\x81\x14\x02\xff\x19\x70\x37\xcb\x61\x21\x00\x75\xc0\xcf\xff\x68\
+\x2d\x22\xa0\x03\xb8\x38\x50\x95\x03\x04\x10\x66\x08\x80\x1c\x80\
+\x66\x28\x07\x27\x24\x71\x12\x9d\x06\x98\x21\xe6\xfc\xf8\x8f\xda\
+\x26\x64\x63\x87\xa4\x33\x64\x00\x10\x40\x58\xd3\x00\x5a\xb3\x8d\
+\x81\x83\x8b\xc4\x34\x00\x0d\x01\xd6\x7f\xa8\x21\xc0\xc1\x01\x75\
+\x00\x92\x39\x00\x01\x84\x92\x0b\x38\x81\x96\xf0\x03\x35\xb2\xa1\
+\x59\xc4\x41\x4a\x1a\x00\xea\x65\x61\x81\x38\x80\xe5\x2f\x5a\xab\
+\x98\x03\x33\x04\x00\x02\x08\x39\x04\x18\xf9\x79\x99\x19\x24\x44\
+\x80\xcd\xaf\xaf\xa8\x8a\xb8\x78\x40\x69\x83\x09\x5b\x57\x13\x6b\
+\x6b\x88\x8b\x9d\x89\x41\x42\x14\x9a\xe2\x19\x51\x43\xf2\x29\x3f\
+\x33\x4a\xca\x01\x08\x20\x16\xa4\x5e\x2b\xf3\x83\xdb\xaf\x18\xce\
+\xf0\xb1\x32\xfc\x44\xeb\x9c\x72\x70\x30\x33\x3c\x7b\xfc\x0e\xe8\
+\x25\x26\x56\x82\xed\x42\x16\x26\x96\xb7\xaf\x3f\x33\x9c\x3d\xfa\
+\x0c\xd8\xc1\xf9\x8b\x9a\x06\x80\x89\xe3\xce\xad\xd7\x20\x57\x31\
+\xc3\xc4\x00\x02\x88\x11\xa9\x7b\x3e\x89\xe1\xcf\xdf\x30\x86\xbf\
+\xff\xff\x60\x4d\xeb\xcc\x4c\x4c\x40\xc3\xfb\x81\xec\x6e\x02\x4e\
+\x48\x01\x36\xfc\xea\x19\x7e\xff\x65\xc4\x9a\x6a\x98\x18\xd9\x81\
+\x89\x64\x3b\xb0\x7b\x1e\x0f\xe2\x02\x04\x18\x00\x0c\x5e\x57\xaa\
+\x57\xdc\x85\x99\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x07\xb6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x07\x48\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\xd0\x80\x3b\x00\x20\x80\
+\x58\x40\x84\xb1\x71\x2a\xc3\x8f\x1f\x3f\x99\x7e\xfe\xfc\xce\xfd\
+\xff\xff\xbf\xbf\x4a\x4a\xaa\x86\x52\x52\x02\x59\x3c\x3c\x8c\x66\
+\x7f\xfe\xfc\x61\x7e\xf2\xe4\xed\x8d\xd3\xa7\xf7\x2d\xfb\xf6\xed\
+\xdd\x76\x25\x25\xc7\x9f\x0c\x0c\xff\xa0\xda\x19\x21\xbe\x60\x82\
+\xf8\x83\x91\x91\x11\x8e\x99\x98\x18\x19\x40\xe9\x1b\xc4\x86\xc9\
+\x81\xc4\x98\x98\x98\x19\x7f\xff\xfe\xf4\xe5\xcc\x99\xa5\xe0\xd4\
+\x0f\x10\x40\x60\x07\xfc\xfb\xf7\xdf\x4e\x45\x45\xa6\x41\x50\x90\
+\x97\x07\x98\x2b\xfe\x72\x70\x70\x6a\x70\x71\x31\x0a\xb0\xb1\x31\
+\x81\x2d\xe1\xe5\xe5\x55\x94\x92\x8a\x75\xff\xf7\xef\xef\x65\x06\
+\x86\xff\x3f\x41\x86\xb0\xb3\xb3\x83\x03\x10\x64\xfe\xef\xdf\xbf\
+\x41\x06\x83\x2d\x01\x7a\x00\xcc\x06\x3b\xe0\xdf\x7f\x86\xff\x70\
+\x87\x81\x4c\x02\x3a\x80\x99\x99\xf1\xc5\x8b\x97\xaf\x1e\x3c\x50\
+\xa9\x7f\xf3\xe6\xce\x19\x80\x00\x02\x3b\x40\x4d\x4d\x76\x62\x6f\
+\x6f\x9a\x81\xa0\x20\x1f\xd8\xd5\x9f\x3f\x7f\x67\xf8\xf8\xf1\x2b\
+\xc3\xb7\x6f\xbf\xc1\x7c\x16\x16\x66\x06\x56\x56\x56\xa0\x47\x99\
+\xf4\x41\x86\xb1\xb1\x73\x30\x5c\xbf\x7c\x9c\xe1\xf1\x83\x3b\x0c\
+\x6a\xda\x46\x0c\xc2\x22\x62\x40\x75\x7f\x80\x1e\xf9\xc7\xc0\xcc\
+\xcc\xcc\xf0\xf7\x2f\x13\x03\x07\x07\x1f\x03\x3b\x3b\x50\x2d\x0b\
+\x23\x03\x33\x28\x10\x18\x99\x18\xbe\x7c\xfd\xc1\xf0\xfd\x27\x2b\
+\xd0\xfc\xbf\x0c\xf7\xef\x5f\x66\x02\x3a\x20\x09\x20\x80\xc0\x0e\
+\x10\x15\xe5\x96\x65\x61\xf9\xc7\xf0\xe5\xcb\x67\xb0\xeb\x3f\x7d\
+\xfa\xca\xf0\xf2\xe5\x7b\x86\x0f\x1f\xbe\x83\x83\x8f\x99\x99\x05\
+\x8c\x41\x72\x5c\x9c\x5c\x0c\x77\x6f\x9f\x60\x68\x59\x75\x9c\x41\
+\xc9\x3a\x80\xe1\x45\xd3\x74\x86\x25\xfd\xb9\x0c\x4b\x96\xaf\x66\
+\xf8\xf8\xe1\x03\x43\x45\x45\x25\xd8\xe7\x97\xaf\x5e\x64\x10\x91\
+\x92\x65\x10\x92\x94\x61\x78\xf1\x8d\x91\xe1\xf9\xd7\xff\x0c\xaf\
+\xdf\xfd\x64\xe0\x7a\x78\x83\x41\x54\x50\x11\xe8\x40\x0e\x05\xa0\
+\xd1\x0a\x00\x01\x04\x8e\xbc\x5f\xbf\x7e\xfd\xfd\xfd\xfb\x2f\x3c\
+\xbe\x50\xe3\x0c\x82\x41\x7c\x66\x66\x26\x70\xb4\xbf\x7c\x76\x93\
+\xe1\xfe\x27\x1e\x86\xdd\x8f\xa5\x18\x18\x39\x44\x19\x04\xf8\x78\
+\x18\x56\x2c\x5f\xc1\xb0\x60\xc1\x22\x86\xef\xdf\x7f\x30\x28\xab\
+\x28\x33\xd8\x58\x9b\x31\x3c\xff\xc6\xc4\x70\xe6\xfe\x67\x86\xcb\
+\xf7\xde\x30\x7c\xff\xf2\x9b\x81\xf9\xe7\x37\x06\x0e\x60\xd4\xfd\
+\xfe\xf5\x07\x18\x6d\x7f\x41\x96\xb1\x01\x04\x10\x0b\x2c\x31\x21\
+\xd9\x8d\x15\x40\x1c\xc7\xc8\xf0\xf8\xf1\x0d\x06\x77\x5f\x6f\x06\
+\x0e\xc1\x13\x0c\x07\x8f\x75\x31\x64\x97\x86\x30\xc8\x29\x6b\x31\
+\x2c\x5d\xba\x14\x68\xf9\x77\x06\x0d\x0d\x75\x60\x82\xfe\x0d\x8c\
+\x32\x76\x06\x0b\x25\x01\x86\x5f\x3f\x7e\x32\x5c\xb9\x72\x95\x41\
+\x98\x4b\x8d\x81\x55\x90\x9f\xe1\x1d\x23\x3b\x30\x7a\x7f\xc2\x3c\
+\xfb\x1f\x20\x80\x58\x88\xcd\x2e\x20\xdf\xbf\x7a\xf5\x88\x41\x4c\
+\x8c\x9f\x41\x52\x52\x9e\x21\x39\x5e\x99\x21\x3b\x25\x92\x81\x85\
+\x83\x07\x2c\x6f\x67\x67\x07\x57\xfb\xfb\x37\x24\x97\xf0\xf0\xf0\
+\x32\xfc\x66\xe7\x62\x30\x30\x34\x66\xb8\x78\xf1\x1a\x83\xa4\x94\
+\x38\x30\x3d\x81\x92\xe5\x0f\xb8\x87\x01\x02\x88\x05\xe1\xbb\xff\
+\x78\x7c\xcf\x04\xf4\xd5\x0f\xa0\xaf\xfe\x30\xc8\xc9\x29\x83\x83\
+\x99\x81\x81\x95\x81\x81\x9b\x93\x81\x0d\x18\x9c\x5f\xbe\x7c\x02\
+\x3a\xee\x05\x58\x0d\x1f\x1f\x3f\x30\x4d\x49\x80\x13\xee\xb7\x6f\
+\x3f\xc1\x39\x84\x99\x85\x1d\x68\xb9\x08\xc3\xa3\x47\x57\x18\x04\
+\x04\x54\x19\x90\xab\x1f\x80\x00\x22\x2a\x04\x40\x89\xef\xc3\x87\
+\x97\x0c\xb2\xb2\x52\xc0\x14\xfe\x1f\xec\x58\x90\xa3\x81\xd9\x92\
+\xe1\xde\xbd\x07\x0c\x2f\x5e\xbc\x06\x0a\xb1\x03\x2d\x62\x03\x26\
+\xde\x27\xc0\x68\x7a\xc2\xa0\xa2\xa2\xca\xc0\xc5\xc5\x0f\x4c\x5f\
+\xa0\xf8\xfe\xc3\x20\x2c\x2c\x0e\x4e\xd8\x3f\x7e\x7c\x87\x46\x39\
+\x24\x08\x00\x02\x88\x89\x50\x81\x08\x52\xf8\xf7\xef\x6f\xa0\x41\
+\x5f\x19\xd8\xd8\xb8\xc0\x96\x42\xa2\x84\x99\xe1\xcd\x9b\x97\x0c\
+\xaf\x5f\xbf\x63\xe0\xe1\x95\x64\x78\xfd\xe6\x23\xc3\xb9\x73\x67\
+\x19\x38\x38\x85\x80\x39\x8e\x87\xe1\xc6\x8d\x6b\x0c\xc0\x82\x0d\
+\x5a\x36\x00\xcb\x83\xff\x4c\x0c\xdc\xdc\xec\xc0\xd0\x7a\x0b\x0c\
+\x1d\x84\xbf\x01\x02\x88\x09\x62\x09\xde\xe4\x07\xf4\xc1\x2f\x06\
+\x4e\x4e\xa0\x0f\x99\x59\xc1\x86\xc1\x7c\xff\xfe\xfd\x7b\x06\x31\
+\x71\x39\x86\x53\xa7\x8e\x30\x24\xa7\x84\x30\x14\x15\xa5\x02\xb3\
+\x61\x16\xb0\xe0\xe2\x07\x46\x17\x17\xc3\xdb\xb7\xaf\x80\x96\x41\
+\x3c\xf7\xf7\xef\x5f\xb0\x19\x3f\x7e\x7c\x00\x47\x29\x0c\x00\x04\
+\x10\x11\x0e\x60\x00\x5b\x0a\x2a\xf9\x60\x6d\x07\x50\xd1\xfb\xf3\
+\xe7\x0f\x70\xaa\x11\x13\x17\x65\x58\xb8\x60\x26\xc3\xe7\x4f\x9f\
+\x40\x25\x2a\xc3\x89\xe3\x47\x18\xce\x9c\x39\xc6\x20\x2e\x21\x05\
+\x2c\x70\x3e\xc2\x2d\x83\x98\xc1\x01\xe4\xff\x03\xab\x83\x15\xe3\
+\x00\x01\xc4\x84\x5c\xa6\xe3\x03\x10\x4d\x08\x07\x81\x1c\xf1\x0f\
+\xe8\xab\xff\xc0\x7a\x41\x50\x48\x18\x45\x2d\xbf\x00\x3f\xc3\x1f\
+\x60\xb4\xfd\xfd\xfb\x0f\x29\x2a\x19\xc0\x25\xe5\xbf\x7f\xa8\xe6\
+\x02\x04\x10\x52\x2e\xc0\x57\x06\x30\x83\xf3\x38\xc2\x31\xff\x80\
+\xe9\x81\x13\x98\xe8\x58\x18\x5e\x3e\x7f\xca\x50\x5e\x51\xcd\xf0\
+\x13\x98\xb8\x5e\x3c\x7f\xce\xe0\xe1\xed\xc3\x60\x6e\x6e\xc9\x70\
+\xe3\xfa\x45\x06\x49\x09\x49\x68\x94\x41\xec\x00\x25\x40\x26\x26\
+\x56\xb0\xe3\x61\x76\x02\x04\x10\x0b\xa1\x28\x00\x19\xc0\xc6\xc6\
+\x06\xcc\x05\xff\x80\x3e\xfa\x05\x54\xcb\x0e\x97\x13\x03\xd6\x01\
+\xf7\xee\xdf\x65\x10\x11\x91\x60\x98\x39\x7b\x3e\x38\x7b\xf2\xf0\
+\x70\x33\xdc\xbd\x73\x1d\x58\xda\xfd\x64\x90\x90\x90\x02\xc7\x3d\
+\xac\x3e\xf9\xf1\xe3\x17\x50\x5e\x84\x01\x58\xc3\xc2\xed\x04\x08\
+\x20\x22\xb2\x21\x24\xb8\x39\x39\xf9\x19\xbe\x7e\xfd\xc4\xc0\xcf\
+\x2f\x08\x4f\x54\xc2\x22\xa2\x40\xd7\xff\x67\x78\xf2\xe4\x31\xc3\
+\xdb\x9f\x7f\x80\xc1\xfe\x87\xe1\xc5\xb3\x3f\xc0\xc4\xca\xc8\x60\
+\x6a\x6a\x01\x2e\x0d\x7f\xff\xfe\x01\xcd\x49\xbf\x80\x69\xe2\x27\
+\x30\x27\x08\x00\x13\xef\x57\x78\xb4\x03\x04\x10\x51\x51\x00\xb2\
+\x8c\x8f\x4f\x88\xe1\xd9\xb3\x7b\xc0\x52\x50\x12\xe8\x20\x48\x28\
+\x80\x7c\x22\x21\x21\x0d\x2c\x1d\x45\x81\x86\x7f\x01\xe7\x16\x16\
+\x16\x56\xa0\x2f\xf9\xc1\xf1\xff\xfd\xfb\x4f\xb0\x3a\x36\x36\x56\
+\x86\xdb\xb7\x6f\x03\x1d\x26\x08\xae\xd4\x90\x01\x40\x00\x11\x99\
+\x08\xff\x83\x35\x72\x72\x8a\x82\xf3\x37\x28\x38\x61\x8e\xfe\x0b\
+\xf4\x35\x0b\xb0\xa4\x13\x11\x11\x01\x3a\x4e\x0a\x48\x8b\x82\x83\
+\x17\xe4\x68\x10\x60\x65\x65\x01\x46\xdf\x6b\x60\xf9\xff\x97\x41\
+\x46\x46\x0d\xac\x1e\xb9\xee\x01\x08\x20\xa2\xb2\x21\x2c\x14\x84\
+\x84\x44\x81\x05\x12\x2b\xc3\xe5\xcb\xe7\xc0\x7a\x40\x69\x03\x51\
+\xd0\x20\xd4\x81\xf8\xa0\x82\x8a\x9d\x9d\x8d\xe1\xdd\xbb\xd7\x0c\
+\x77\xee\x3c\x06\x56\x52\xe6\xf0\x34\x85\x0c\x00\x02\x88\x09\x5a\
+\xaa\x31\x83\x2a\x1b\x6c\x55\x30\x72\x13\x0b\x54\xf8\x48\x4a\x2a\
+\x00\x83\x96\x95\xe1\xc8\x91\xa3\x0c\xcf\x9f\x3f\x01\xfa\x90\x19\
+\x5c\xd8\xc0\x13\x15\x30\x74\x40\x05\x0e\xa8\x14\xbc\x7a\xf5\x32\
+\x30\xe8\x9f\x31\xe8\xe8\x58\x03\x8b\x65\x0e\x70\x6b\x09\x62\x16\
+\x13\xb8\x69\x06\x52\x0f\x10\x40\xe0\x08\x79\xf2\xe4\xcd\xed\x87\
+\x0f\xdf\x09\x2b\x2a\x4a\x01\xe3\x15\x54\x9b\x81\xe2\x17\x98\xcf\
+\xff\x31\xc1\x2b\x23\x18\x06\xb5\x1b\x84\x85\xe5\x80\x29\xfa\x1b\
+\xb0\x04\xbc\x07\xac\x6a\xef\x01\x43\x86\x17\xe8\x30\x71\xb0\x8f\
+\x3f\x00\x1b\x25\xcf\x9e\x01\xeb\xff\xef\xff\x80\xe9\x46\x8a\x41\
+\x5b\x5b\x05\xec\xf8\x5f\xbf\x80\x25\xc6\x3f\x90\x67\x58\x80\x0d\
+\x9e\xcf\xa0\x68\x01\xd5\x68\xff\x01\x02\x88\x11\x14\x24\x52\x52\
+\x7a\x76\xe2\xe2\x72\xd5\xbc\xbc\xdc\xb2\xa0\xf8\x06\x66\xf3\xff\
+\xa0\x82\x07\x56\xec\x22\xb7\x07\x40\x86\xc1\x2a\x28\x50\xf9\x00\
+\xf2\xe9\xb7\x6f\x9f\x80\x21\xc1\x08\xf6\x3d\xa8\xf2\x01\x25\x52\
+\x7e\x7e\x21\x50\x33\x0e\x68\xd6\x1f\xa8\xc5\x90\xb4\x04\x64\x33\
+\x7e\xfc\xf8\xe6\xe7\xb5\x6b\x07\xf7\x7c\xff\xfe\x69\x0e\x40\x00\
+\x31\x42\x2d\x01\x49\x4b\x01\xb1\x1c\x28\x46\xe8\xd0\x1a\x07\x95\
+\x87\xc0\x2a\x94\xe1\x11\x40\x00\x31\x0e\x74\xdf\x10\x20\x80\x06\
+\xbc\x63\x02\x10\x40\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\x18\
+\x00\x4e\x12\xc6\x99\x32\x89\xe5\xec\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x09\x8f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x09\x21\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\xd0\x80\x3b\x00\x20\x80\
+\x58\x40\x84\xb1\x71\x2a\xc3\x8f\x1f\x3f\x99\x7e\xfe\xfc\xce\xfd\
+\xff\xff\xbf\xbf\x4a\x4a\xaa\x46\x52\x52\x02\x99\x3c\x3c\x0c\xa6\
+\xff\xfe\xfd\x63\x7d\xfc\xf8\xcd\x8d\x73\xe7\x8e\xac\xfc\xf4\xe9\
+\xe5\x66\x25\x25\xfb\x9f\x0c\x0c\xb0\x84\xcb\x08\xc6\x8c\x40\x8a\
+\x89\x09\xe1\x17\x18\x9b\x99\x19\x42\x83\xd2\x39\x23\x50\x11\x13\
+\x13\x48\x2d\x33\xe3\xbf\x7f\xdf\xbf\x9f\x3a\xb5\xe0\x0f\x48\x0e\
+\x20\x80\xc0\x0e\xf8\xf7\xef\xbf\x9d\x8a\x8a\x4c\x83\xa0\x20\x2f\
+\x0f\x30\x57\xfc\xe5\xe0\xe0\xd4\xe0\xe2\x62\x14\x60\x63\x63\x02\
+\x6b\xe4\xe2\xe2\x51\x90\x94\x94\x76\xff\xfb\xf7\xcf\x65\x20\xf7\
+\x07\x23\x13\x33\x23\x07\x3b\x3b\xc8\x6a\xa0\xc9\x4c\x0c\xbf\x7f\
+\xff\x02\x1a\xce\x0c\xb6\x00\xe8\x60\x38\x1b\x64\x31\xd0\x43\x40\
+\x33\x98\xc0\x8e\x84\x38\x8a\x85\xf1\xdd\xbb\x0f\x5f\x1e\x3f\xd6\
+\xe9\x78\xfe\xfc\xca\x4e\x80\x00\x1c\x8e\xb1\x0d\xc2\x30\x10\x00\
+\xcf\xf8\x6d\x22\xb1\x00\xa2\x70\x83\x44\x2a\xb2\x0e\x1b\x30\x4e\
+\x1a\x06\xc9\x18\xf4\x48\x54\x88\x02\x31\x41\xb0\x62\x23\x70\x24\
+\xde\xf4\xa7\xbb\xfb\x0f\xb4\x6d\x38\xf5\xfd\xb1\xd3\x01\x15\x18\
+\x62\xcc\x8c\xe3\x44\x4a\xdf\x3a\x87\x88\xc5\x39\x31\x2a\xee\xaa\
+\xcc\x7b\xcf\xf5\x72\xe6\xf9\xb8\xb1\xdd\xed\x59\x6f\x82\x86\x2a\
+\x3b\x2b\x2b\x94\x62\x94\x59\xb1\xf4\x96\xa6\x11\x6c\xfd\x64\x41\
+\x7a\x7f\x78\x4d\x30\x17\x47\xce\x31\x0c\xc3\xfd\xf0\x13\x40\x60\
+\x07\x88\x88\x70\x49\x33\x31\xfd\x65\xf8\xf4\xe9\x33\xd8\xf5\x20\
+\xcb\x5f\xbc\x78\x0f\xa4\xbf\x01\x0d\x66\x04\xb9\x1a\x88\x99\xc1\
+\x34\x3b\x3b\x27\xc3\xcb\x67\xf7\x19\xaa\x16\x1c\x66\x50\xb1\x0f\
+\x60\x78\xd4\x31\x8b\x61\x79\x5f\x06\xc3\x86\xcd\xdb\x18\xee\xdf\
+\xbf\xcf\x50\x59\x59\xc9\xc0\xcb\xcb\xc9\x70\xee\xfc\x45\x06\x2e\
+\x21\x31\x06\x05\x15\x0d\x86\x97\xdf\x18\x18\x9e\x7d\xfd\xcf\xf0\
+\xee\x3b\x23\x03\xcb\xed\xeb\x0c\xe2\xdc\x52\x40\x73\x38\x44\x80\
+\x9e\x31\x00\x08\x20\x70\x24\xfd\xfa\xf5\xeb\xef\xef\xdf\x7f\xc1\
+\xc1\x0d\x03\x90\x38\x63\x02\x07\x25\x24\xee\x60\x7c\x06\x86\x57\
+\xcf\xef\x30\x3c\xfe\xc6\xc7\xb0\xf3\x81\x24\xc3\x6f\x36\x31\x06\
+\x61\x60\xc8\xad\x59\xb3\x96\x61\xe1\xc2\x45\xc0\x50\xfb\xce\xa0\
+\xa0\x20\xcf\x60\x6d\x65\xc6\xf0\xf1\x37\x1b\xc3\x99\x07\x9f\x19\
+\x2e\xdc\x7e\xcd\xf0\xf5\xd3\x2f\x06\xc6\x6f\xdf\x18\x38\xd8\x58\
+\x19\xfe\x02\xa3\xe9\xc7\x8f\xdf\xa0\xd4\xc1\x0e\x10\x40\x2c\xb0\
+\xc4\x84\x64\x37\x56\x00\x72\x00\x28\xf8\x1f\x3f\xbe\xc5\x60\x65\
+\x6f\xcd\x30\x89\xe7\x3c\xc3\x9e\x43\x9d\x0c\xc9\x45\x7e\x0c\x32\
+\x8a\x9a\x0c\xf3\xe7\xcf\x67\x78\xfd\xfa\x35\x83\xb6\xb6\x0e\xc3\
+\xcf\x9f\xbf\x19\x38\x39\x79\x18\x6c\x34\x24\x19\x7e\x01\xd3\xc7\
+\xad\x4f\x77\x18\x58\x7f\x8a\x33\xf0\xf3\xcb\x30\xbc\xf9\x2d\xce\
+\xf0\xf9\xcb\x5f\x98\x7d\xff\x01\x02\x88\x85\xd8\xec\x02\x0a\xfe\
+\x37\x6f\x9e\x02\xa3\x8b\x9b\x41\x4a\x5a\x91\x21\x5a\x4d\x83\x21\
+\x39\x2e\x8c\x81\x85\x83\x1b\x9c\xd8\x4c\x4c\x4c\xe0\x6a\x41\x0e\
+\x00\x15\xf1\x5c\xdc\xdc\x0c\xac\xbf\xd8\x19\x74\xf4\x8c\x18\xce\
+\x03\xa3\x84\xe3\x8f\x04\x30\x6d\x70\x02\xe5\x3e\x43\x73\x10\x03\
+\x03\x40\x00\xb1\xc0\x7c\x87\xc8\x5a\xd8\x7c\xcf\x04\x0c\xb2\xef\
+\xc0\x44\xf6\x85\x41\x5e\xde\x14\x94\x65\x81\x62\xff\x18\xfe\x71\
+\xb2\x33\xb0\x33\xfe\x06\x06\xfb\x17\x86\x97\x2f\x5f\x00\xe9\xaf\
+\x0c\x3c\x3c\x7c\x0c\xe2\xe2\x12\x40\x07\xb3\x03\x73\xc7\x0f\x86\
+\x3f\x7f\xff\x82\x13\xb6\xbc\xbc\x0c\xc3\xad\x5b\xd7\x19\x84\x84\
+\xb4\x18\x10\x76\x32\x30\x00\x04\x10\x51\x21\x00\x49\x98\xaf\x19\
+\xa4\xa5\x65\xc0\x86\x81\x7c\x07\xd2\x0f\xc2\x8f\x1e\xde\x67\x78\
+\xfe\xe2\x25\xc3\xdf\xbf\x6c\xc0\x9c\xc2\x09\x0c\xa5\x17\x0c\x4f\
+\x9f\x3e\x65\xd0\xd1\xd4\x62\xe0\xe5\x13\x66\x78\xfb\xeb\x03\x30\
+\x57\xfc\x61\xe0\xe3\x13\x02\x3a\xee\x05\xc3\xd7\xaf\x9f\x40\x65\
+\x01\xdc\x6c\x80\x00\x62\x82\xf9\x10\x1f\x00\xe6\x7f\x06\x50\x2e\
+\x01\xc5\xeb\x5f\xa0\x8f\x20\x8e\x62\x65\x78\xff\xfe\x2d\xc3\x8b\
+\x97\xaf\x19\x38\xb9\xc4\x19\xde\xbd\xfb\xcc\x70\xe2\xe4\x71\x06\
+\x16\x56\x5e\x60\x42\x13\x66\x98\xb7\x62\x2d\xc3\xa5\x1b\x37\x19\
+\xf8\xb8\x79\xc1\xa1\x0d\x4a\xe4\xdc\xdc\x5c\x0c\x1f\x3e\xbc\x00\
+\x66\x55\x56\x78\x08\x00\x04\x10\xc1\x10\x00\x29\xfc\xfb\x17\x92\
+\xc7\x81\x29\x01\x1c\x55\x20\xb1\x7f\xff\x7e\x03\xb3\xea\x33\x06\
+\x71\x09\x79\x86\xe3\x27\x4e\x30\x14\xe4\xa5\x02\x0d\xff\xc0\xa0\
+\xa7\x6d\xc8\x20\x6d\x67\xc9\xf0\x52\xf2\x1c\xc3\xb2\xa5\x2b\x19\
+\x4a\x6c\x2b\x18\xfc\x6c\x1d\x19\x5e\xbc\x79\x0d\xcc\x9e\x7c\x40\
+\x7d\x8f\xa0\x66\x41\x00\x40\x00\x41\xd3\x00\x03\x81\x10\xf8\x0b\
+\x2e\xd1\x20\x4d\x07\x48\x96\x04\x95\x7e\xac\xac\xec\x40\x07\x88\
+\x33\x6c\xdc\xb0\x0a\x6c\x39\x08\x5c\x7a\xfd\x84\x41\xc0\xe4\x32\
+\x83\xb2\xcd\x4f\x86\xff\xdf\xfe\x32\x34\xcf\x6b\x62\xf8\x03\x4c\
+\x94\xde\x36\x0e\x0c\xaf\xff\xfe\x04\xea\x61\x06\x9a\xf7\x8f\x81\
+\x19\x18\xad\xa0\x92\x14\x20\x80\x98\x10\x65\x3a\xa1\x2c\x08\x73\
+\xe8\x7f\xb8\x18\xc8\x11\xa0\xe8\x91\x92\x90\x84\x44\x8b\x8c\x0c\
+\x83\x6d\x97\x3e\x83\xa4\xe5\x57\x86\xa7\xb7\x5f\x30\x7c\xff\xf2\
+\x9e\xc1\x24\x99\x89\xa1\xe9\x58\x03\xc3\xf6\x63\x87\x19\xf8\xb9\
+\xf8\xc0\xbe\x67\x67\xe1\x80\x14\xd3\x0c\xff\xff\x01\x04\x10\x13\
+\x72\x8a\xc4\x97\x05\x21\x09\x07\x62\x39\xa8\xbc\x67\x63\xe3\x00\
+\x8b\xbf\x7c\xfe\x98\x21\x26\x26\x81\x81\x5b\x55\x83\xc1\xb8\x4e\
+\x9e\x41\xc9\xf2\x13\xc3\xaf\x57\x5f\x18\x14\x84\x44\x18\x84\x99\
+\xb9\x18\x78\xfe\x7f\x67\xb0\x4a\x61\x67\xa8\x3e\x58\xc1\xb0\x66\
+\xef\x26\x06\x61\x6e\x49\x86\x4b\x4f\x4e\x31\xec\xfe\xb8\x80\xf3\
+\x0f\xe7\x4f\x01\x80\x00\x22\x18\x05\xa0\x14\xcf\xc2\xc2\x06\xa4\
+\x41\x6e\xfd\x0b\x2f\xb4\x40\x3e\x90\x97\x57\x60\x78\x72\xff\x21\
+\x43\xef\xaa\xe5\x0c\xb2\x59\xfc\x0c\x06\x4e\xc0\x68\x7a\xf7\x8b\
+\x41\x0c\x18\xd7\xb0\x1a\x91\x9f\x87\x9f\x41\x86\x87\x8d\xe1\x7b\
+\xf2\x3f\x86\xae\xd9\x3d\x0c\x9e\x9c\x51\x0c\x87\x18\x37\x31\xb0\
+\x99\x7f\x66\xfd\x7f\xec\xbf\x0c\x40\x00\x31\x11\x97\x0d\x41\xc5\
+\x30\x1b\x30\xa5\xbf\x02\xc6\x21\x2b\x34\x1b\xfe\x67\xe0\x06\xe6\
+\x8a\xde\x35\xab\x19\x0e\x72\x6f\x64\xb0\xf1\x67\x66\xe0\xfc\x06\
+\x2c\x7c\x38\xb9\x18\x38\x39\x38\x80\x65\x3d\x3b\x03\x1b\x3b\x1b\
+\x83\x0c\x30\x91\xaa\x8a\xeb\x30\x98\xc8\x4a\x33\x98\x26\x0a\x30\
+\xac\xfa\x3d\x99\x41\x25\x92\x15\x98\x25\x81\xb9\xe3\xe7\x3f\x16\
+\x80\x00\x62\x21\x26\x0a\x40\xf1\xcc\xc7\x27\xc2\xf0\xea\xd5\x5d\
+\x06\x29\xa9\xaf\xc0\xec\x28\xc8\xc0\x05\x2c\xd1\x1a\x66\x4f\x67\
+\xd8\xc6\xb6\x9a\x21\x20\x49\x9c\x41\xe0\x17\x33\xc3\x7f\x50\xf5\
+\xcd\xc4\x08\xae\xb8\xc0\x29\x1c\x58\x33\xf2\x72\x0a\x30\xb0\x32\
+\x72\x32\xa8\x08\xe9\x30\xb0\x32\x73\x32\x88\x95\xf1\x30\xf0\x70\
+\x73\x32\x9c\x59\xfe\xe0\x1f\x50\xc9\x77\x80\x00\x22\x2a\x11\xc2\
+\x1a\x17\xbc\xbc\x92\xc0\xd2\xec\x06\x03\x0b\xb0\x7e\xfd\xfb\xe7\
+\x3f\xc3\xb6\xeb\x07\x18\xd4\x3d\x38\x18\xe4\x38\xb9\xc1\x69\x82\
+\x9d\x83\x1d\xe2\x73\x60\x75\xcd\x0e\xf4\x3d\x2f\x30\xd1\x71\x32\
+\xf3\x00\x2b\x62\x16\x06\x4e\x26\x5e\x06\x75\x01\x7d\x06\x1b\x51\
+\x0d\x86\xff\xc0\xea\xfa\xcb\xd7\x9f\xc0\xf8\x62\xf8\x01\x10\x40\
+\x4c\xc4\x64\x43\x58\x56\xe4\xe7\x17\x04\xaa\xe5\x63\x38\x79\xea\
+\x38\x30\x5e\xfe\x30\x94\xf8\x24\x32\x9c\x5b\xf2\x95\xe1\xc2\xeb\
+\xaf\x40\x39\x2e\x60\xdd\x0f\x09\x7a\x48\xf0\xb3\x02\xa3\x88\x97\
+\x81\x9d\x81\x93\x81\x0d\x88\x59\x81\x98\x9b\x51\x88\x41\x96\x5d\
+\x93\xe1\xc7\x6f\x26\x86\x5f\x5f\x7f\xfd\x01\xfa\xfb\x07\x40\x00\
+\x31\x41\x7c\xc7\x0c\x0c\x2d\x26\x70\xc2\x01\xf9\x14\xb9\x1a\x86\
+\x61\x66\x66\x50\x11\xfc\x17\x58\x19\x49\x01\x83\x56\x84\x61\xd7\
+\xde\xfd\x0c\x2e\xfa\x86\x0c\x2d\x66\xd5\x0c\xdb\xe7\xbe\x61\x38\
+\xfb\xfa\x0b\x03\x1f\x0f\x27\x38\xfe\x39\x60\x18\x98\xdd\x40\x16\
+\xb3\x33\x00\x1d\xc7\xc0\x0d\x64\xf1\x02\x1d\xc3\x0e\x6c\x98\x00\
+\xeb\x91\xef\x7f\x80\x85\x0b\xc3\x77\x80\x00\x02\x3b\xe0\xd1\xa3\
+\x57\xd7\x6e\x03\xeb\xec\x1f\x3f\xfe\x02\xcb\xea\x3f\xc0\xd6\xca\
+\x1f\x60\x8d\xf6\x1f\xd8\x4e\x60\x40\xc3\x40\x1d\xdf\x7f\x01\xa3\
+\x42\x04\x88\x95\x18\x8e\x1c\xbf\xcd\x60\x28\xa5\xc5\xe0\xf3\xcb\
+\x91\x61\xc3\x94\x7b\x0c\x67\x5e\x7d\x65\x10\xe2\xe7\x86\x24\x42\
+\x0e\x4e\x06\x66\x60\xa1\xc3\x0a\xb4\x92\x15\xec\x00\x3e\xa0\x13\
+\x04\x80\x91\xc1\xce\xf0\xf9\x1b\xd0\xb0\x1f\xa0\xd2\x8d\xe1\x07\
+\x40\x00\x81\x13\xe1\xd1\xa3\xeb\xcb\x6e\xdf\x3e\x5b\xc5\xc3\xc3\
+\x23\x0f\xcc\xe5\x8c\xa0\x2c\xf6\xef\x1f\x38\xc7\x83\xab\x0b\x48\
+\x14\x31\x22\x15\x48\x8c\xd0\x76\x1e\x33\xc3\x3f\x60\x02\xfd\xff\
+\xfb\xf7\x3f\xce\x6f\xac\xdc\x4b\xff\x5d\x56\xfe\x5f\x60\xc8\xe0\
+\xae\x2a\xc9\xf0\x9d\x01\x58\x7c\x33\x00\xeb\x10\x60\xf1\xcd\x01\
+\x74\x00\x27\x03\x30\xf1\x31\x08\x01\xc5\xbe\x32\x7c\xfa\x0c\x34\
+\xf7\x3b\xb0\x86\xfa\xc7\xf0\x0d\x20\x80\xc0\x0e\x78\xf5\xea\xfa\
+\x71\x20\x4e\x06\x32\xe5\x89\xad\x21\xd1\xc0\x3f\x70\x45\xf1\x95\
+\x33\x65\xd9\xbf\xf3\x71\x4c\x79\x0c\xcc\x2e\x9a\xd2\x40\xeb\xff\
+\x03\x4b\x8e\xbf\xd0\x28\xe0\x05\x3a\x40\x18\xc8\xfb\xc2\xf0\xfb\
+\x1b\x30\xe0\x7f\x82\x5d\xf8\x1d\x20\x80\x90\x2d\x7b\x05\xc5\xe4\
+\x01\x29\x36\x90\xaf\xfe\xff\xbf\xff\x3e\xf8\xde\xbd\x0f\x7c\x9c\
+\x9a\xfa\x40\x4b\x41\xc1\xcf\x02\xc6\x2c\xe0\x92\xff\x37\x30\x22\
+\x84\x80\x90\x1d\xe4\x80\x9f\xa0\x10\x00\x08\x20\x16\xaa\xf4\x2e\
+\xf4\x79\x18\x18\xa4\x39\xd4\x81\x89\x7e\x96\x63\x9c\x3a\x5f\x94\
+\x9b\x2d\x03\xe3\x2f\x60\x75\x0d\x4c\x38\xcf\x7f\xde\x63\xb8\xf2\
+\xfb\x16\xc3\xf7\x9f\x7f\x18\x7e\xfc\xfa\xc9\x00\xaa\xcd\xdf\xbd\
+\x7d\x0a\x2a\x54\x41\xfd\x82\x6f\x00\x01\xc4\x08\x29\xd5\x18\xc9\
+\xb3\x98\x15\xa8\x4f\x97\x9b\x81\x41\x92\x1d\x94\x68\x56\x6a\xda\
+\xf1\x87\x89\x48\x70\x32\x7c\x79\xfd\x8b\xe1\xe3\x87\x6f\x0c\xdf\
+\xbe\x7c\xff\xf7\xe3\xdb\xcf\xbf\xbf\x7f\xfd\xf9\xf7\xfb\x07\xb0\
+\x59\xf2\xe3\xff\xdf\x7f\xa0\xc4\xf1\x1b\x68\xfd\x0d\x86\x13\x0c\
+\x2f\x18\x5a\x01\x02\x88\x32\x07\xb0\x00\xf5\x89\xb0\x02\x5b\x1b\
+\xc0\x24\xc0\xcc\x68\x0f\xcc\xa7\xe1\xc0\xd4\x2d\x08\xa4\xbf\x83\
+\xb2\x18\x10\xff\x04\xa5\x74\x28\xfe\x0e\x8a\x73\x30\xfe\x0b\xc4\
+\x0c\x0c\xc0\x60\x60\xb8\x02\x10\x60\x00\x48\xb0\x3b\x49\xa1\xf4\
+\xe9\xc0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xe5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x05\x77\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xcc\x62\x20\x09\x30\x32\x48\x31\
+\xfc\xfe\x37\x93\xe1\xff\x7f\x61\x06\x36\xe6\x44\x86\xff\x0c\x37\
+\x49\xd1\xfe\xff\x4c\x1a\x98\x06\x08\x20\x26\x06\x72\x00\x23\x10\
+\xff\xf8\x93\xab\x22\x27\xe0\xa3\xa3\x2a\x62\xc9\xf0\xfd\x4f\x35\
+\x50\x8c\x91\x1c\xa3\x00\x02\x88\x3c\x07\xfc\xfd\x6f\xc1\xf0\xf7\
+\x5f\x7e\x5e\x82\x09\x43\x7d\xa1\x2d\x03\x13\x0b\x53\x2c\x30\x34\
+\x02\xc9\x31\x0a\x20\x80\xc8\x71\x00\x2b\xc3\xb7\x5f\x1d\xa6\x66\
+\x0a\x9c\xb6\xd6\x4a\x0c\x5a\xda\x12\x0c\xee\xce\x6a\x0c\x0c\xdf\
+\x7f\x55\x01\xe5\xf8\x48\x35\x0c\x20\x80\x48\x77\xc0\xbf\x7f\x71\
+\x2c\xdc\xec\xf6\x51\x61\x86\x0c\x9f\xff\x30\x31\x3c\xfe\xc0\xc0\
+\x10\x18\x60\xc8\x20\x20\xce\x6f\xcc\xf0\xfb\x6f\x3e\xa9\xc6\x01\
+\x04\x10\x13\x89\x71\x2f\xc1\xf0\xed\x77\x85\xa7\xbb\x0e\x83\x96\
+\x8e\x34\xc3\xed\x57\x0c\x0c\x4f\xdf\x33\x30\x08\x4a\x08\x32\xb8\
+\x79\xea\x31\x30\xfc\xfc\x5d\x0c\x54\xa5\x49\x8a\x91\x00\x01\x44\
+\x9a\x03\x7e\xfc\x2e\x14\x95\x11\x56\xf1\x0d\x30\x62\xb8\xf3\x86\
+\x81\xe1\xf5\x57\x06\x86\xb7\xdf\x18\x18\x1e\xbf\x63\x60\x30\xb4\
+\xd1\x61\x90\x55\x97\xe1\x07\xaa\xa9\x23\xc5\x48\x80\x00\x22\xde\
+\x01\xff\xff\x5b\x33\xfc\xfb\x9f\xe3\xe8\x69\xc8\xf0\x8b\x95\x83\
+\xe1\xfe\x5b\x06\x86\xf7\x3f\x18\x18\xde\x7c\x67\x60\x78\xf1\x09\
+\x98\x04\x98\x58\x19\x2c\x3d\x4c\x19\x98\x58\x99\x43\x80\xd1\x14\
+\x40\xac\xb1\x00\x01\x44\xac\x03\xb8\x18\x7e\xfe\x6a\x95\xd1\x90\
+\xe3\x32\xb2\xd2\x64\xb8\xf4\x0c\x68\xf1\x57\x48\x08\x80\xe8\x37\
+\xc0\x50\x78\x02\x0c\x11\x21\x25\x59\x06\x45\x3d\x35\x16\x60\x54\
+\xd4\x01\xa3\x4b\x94\x18\x83\x01\x02\x88\x89\xc8\x84\x17\xc1\xc0\
+\xca\x66\x6f\xed\x6e\xc2\xf0\x08\xe8\xdb\xc7\xc0\x78\x7f\xf7\x1d\
+\x62\x31\x32\x7e\xf1\x99\x81\x41\xc1\xca\x98\x81\x4d\x80\xd7\x90\
+\xe1\xcf\xdf\x2c\x62\x8c\x06\x08\x20\x62\x1c\x20\xcc\xf0\xeb\x4f\
+\xbd\x86\xa5\x3e\x83\x94\x8a\x14\xc3\xd9\xc7\x90\xa0\x7f\xfd\x0d\
+\x13\xbf\xfc\xc8\xc0\xf0\x9b\x97\x9f\x41\xd2\x50\x9f\x01\xe8\x80\
+\x12\x60\xb4\xa9\x13\x32\x1c\x20\x80\x08\x3b\xe0\xcf\xef\x0a\x76\
+\x41\x41\x39\x1b\x67\x5d\x86\x5b\xaf\x81\x09\xfd\x0f\xd0\x92\x7f\
+\x0c\x0c\xbf\xfe\x62\xc7\xdf\x80\x21\x23\xac\xab\xc3\xc0\x2d\x2d\
+\xc5\xc3\xf0\xe7\x4f\x23\x21\xe3\x01\x02\x88\x90\x03\xec\x19\xfe\
+\x32\xa4\x19\xb9\x98\x30\x30\xf1\x70\x33\x3c\x01\x06\x3d\x33\x13\
+\xa4\x24\xc6\x85\xff\x03\x1d\xc1\xc2\xce\xca\x20\x63\x69\x0e\x54\
+\xcc\x1c\x04\x0c\x05\x5f\x7c\x16\x00\x04\x10\x13\x9e\x3c\xcf\x0e\
+\x4c\x78\x15\x7c\x72\x32\x7c\x56\xd6\x6a\x0c\xb7\x5e\x00\x0d\x87\
+\x65\x08\x3c\x18\x5c\x52\xff\x02\x16\x89\x72\xd2\x0c\xc2\xaa\xaa\
+\xac\x0c\xbf\x7e\xd5\x03\x85\x78\x71\x59\x03\x10\x40\xb8\x1d\xf0\
+\xe7\x6f\x1c\xd0\x2b\x1e\x0e\x3e\x16\x0c\x5f\xfe\x30\x82\x53\x3b\
+\x2b\x13\x29\x65\x16\x03\x83\x94\xb9\x09\x03\x2b\x2f\xaf\x31\x30\
+\x2a\xca\x71\xa9\x03\x08\x20\x5c\x46\x4a\x02\x23\xbb\x52\xc9\x5c\
+\x97\xc1\x54\x5f\x9c\xe1\xca\x53\xa0\xe5\xcc\xa8\x86\xe3\xc2\xf0\
+\xfa\xea\x37\x03\x03\xa7\x30\x3f\x83\x98\x81\x01\x90\xf3\x2f\x03\
+\x28\xa4\x8f\xcd\x22\x80\x00\xc2\xee\x80\x3f\x7f\x2a\x99\x85\x85\
+\x15\xfd\x7c\xf5\x19\x9e\x00\xcb\xfa\xcf\xbf\x20\xbe\x67\x62\x84\
+\x60\x46\x3c\x98\x09\x09\x33\x00\x13\xac\xb4\x91\x1e\x03\x8f\xac\
+\x8c\x30\xc3\xef\xdf\xf5\xd8\xec\x03\x08\x20\x16\x2c\x25\x9e\x23\
+\xc3\xaf\x7f\xe9\x4e\x3e\xa6\x0c\x2a\x72\x9c\x0c\xdb\xae\x31\x30\
+\x88\x02\xeb\x38\x66\xb2\x6a\x7b\x60\x82\xe4\x60\x62\xd0\x74\x32\
+\x63\x38\xbd\x64\x63\x20\xb0\x3c\xf1\x63\x60\x62\xda\x80\x2c\x0f\
+\x10\x40\x2c\x18\x0e\xfa\xf1\xbb\x4a\x42\x53\x81\x2d\xc2\x47\x89\
+\xe1\x39\x30\xde\x79\xb8\x80\xd9\x8a\x99\x81\x6c\x00\x0a\x15\x31\
+\x7d\x29\x86\x0f\x37\x35\x19\x6e\x1f\xbb\xdc\xcc\xc0\xc9\x7e\x10\
+\x28\xfc\x1e\x26\x0f\x10\x40\xa8\x0e\xf8\xf3\x2f\x95\x89\x83\xc3\
+\x25\x36\xd1\x8c\x41\x1e\x68\xeb\x4d\x60\xf0\x8b\xf1\x63\xfa\x9e\
+\x11\x47\xa2\xc3\xd9\x80\x60\x67\x60\xb0\xf3\x33\x60\x78\x72\xf5\
+\xbe\xce\xf7\xaf\x3f\x4a\x81\x09\xaa\x0a\x26\x07\x10\x40\x2c\x48\
+\x4e\x95\x67\xf8\xfe\xbb\xc0\x35\xd2\x90\x21\xcc\x51\x8c\xe1\xd7\
+\x17\x06\x06\x2d\x71\x48\xc1\xf3\x17\x94\xa8\x80\x85\xcf\x3f\x50\
+\xa9\xfc\x1f\x92\xdd\xfe\x81\x63\x0b\x29\x5b\xfe\x47\x64\x43\x6c\
+\x40\x4a\x5b\x80\xc1\x39\xc8\x98\x61\xcb\xbc\x43\x29\x40\x07\xac\
+\x03\x0a\x9d\x01\x89\x03\x04\x10\xc2\x01\xbf\x7e\x17\x88\xab\x8a\
+\xaa\x45\x46\xea\x01\x4b\x5e\xa0\xc5\x4c\xff\x19\x94\x04\x21\x16\
+\x22\x5b\xfc\x1f\xea\x90\xbf\xe0\x2a\x02\x2a\x07\x73\x00\x92\x5a\
+\x10\xfe\x0d\xc4\xbf\xfe\x41\x8c\x67\x06\x06\xa3\x7f\x88\x16\xc3\
+\x9d\x4b\x0f\x44\x6f\x9c\x7b\x52\x02\x14\x8a\x00\x89\x03\x04\x10\
+\xc2\x01\xcc\x4c\xdc\x3f\xbe\xff\x66\x68\xaa\xdb\x06\x2c\x7f\xfe\
+\xc1\x83\x94\x91\x91\x70\x10\x63\x95\x67\x44\x2a\xb5\x60\xc1\x0d\
+\xcc\x4a\xef\x3f\xfc\x00\xe5\x69\x2e\x98\x18\x40\x00\x21\x1c\xc0\
+\xc4\x54\xf2\xf1\xfd\xb7\xcd\x1f\x5f\x7f\xe1\x84\x7a\x8a\x16\x80\
+\x11\x98\xa0\x7e\x03\x3d\x7b\x0c\x26\x00\x10\x40\x48\x69\x80\xc1\
+\x10\x18\xd1\x21\xc0\x12\x90\x19\xc8\xa6\x8d\x03\xfe\x83\xc2\x85\
+\x89\x09\xe8\x00\x50\xb8\x6c\x04\x09\x01\x04\x10\xc2\x01\xbf\xff\
+\xb5\xab\xaa\x89\x5b\xaa\x29\x8b\x00\x2b\xc0\xff\x34\xb1\x9f\x15\
+\x18\x05\x0f\x81\x25\xdb\xe5\xab\x4f\x0d\x60\x0e\x00\x08\x20\x24\
+\x07\xfc\xe1\x11\x55\x57\x61\xd0\xf1\xd2\x63\xf8\xf9\x9d\x36\xe1\
+\xcf\x01\x8c\xf9\xdf\x47\xee\x31\x5c\xbe\xf8\x88\x0d\x26\x06\x10\
+\x40\x48\x89\x90\xe1\xef\xfd\x37\x7f\x19\x7e\xdc\x80\xd4\x66\xb4\
+\x00\xcc\xc0\xf2\xe0\xcd\x8b\x3f\xa0\x02\x19\x1e\xc5\x00\x01\xc4\
+\x82\x9e\x70\x41\x65\xf8\x7f\x46\xda\x38\x00\x56\x8f\x20\x03\x80\
+\x00\x62\x41\x4e\x20\x6c\x6c\x4c\x0c\xc0\x76\x07\xc3\x1f\x16\xda\
+\x38\x80\x85\x83\x81\xe1\x13\x1b\x6a\xb9\x0e\x10\x40\xc8\x25\x21\
+\x13\xc7\xaf\xf7\x0c\x02\x9f\x9f\x31\xfc\x01\xb5\xad\x68\x91\x08\
+\x7f\xb3\x30\x7c\xf8\xf9\x1a\x14\x16\x70\x7b\x01\x02\x08\xe1\x00\
+\x36\xd6\xa5\x37\x4f\xdd\xc8\xbb\x79\xe2\x1a\xa1\x52\x95\x82\x42\
+\x80\x81\xf1\x3f\x13\x13\x33\xb0\x20\x5a\x0f\x13\x03\x08\x30\x00\
+\x49\xfd\xb6\x3b\x2a\xaa\x2e\x21\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x06\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x05\xe0\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xce\xae\x60\xf8\xf6\x3b\x8c\x81\
+\x95\x69\x3a\x10\x2f\x64\xf8\xcf\xf0\x8b\x81\x86\xe0\xff\x99\x34\
+\x30\x0d\x10\x40\x4c\x70\x91\xbf\xff\xca\x83\x7d\xd4\x0c\xa5\x44\
+\xb9\x67\x31\x7c\xfc\xb9\x07\xc8\x77\x63\x60\x64\xa0\x39\x00\x08\
+\x20\x84\x03\x7e\xfe\x61\x8a\xf5\xd7\x60\x38\xb6\x34\x84\x21\x3c\
+\x44\xc7\x96\xf5\x3f\xc3\x4e\x60\x88\x2c\x04\xca\x68\xd0\xd2\x01\
+\x00\x01\xc4\x84\xc4\xfe\xf7\xe2\xdd\x1f\x06\x59\x31\x4e\x86\xf9\
+\xad\x8e\x0c\xab\x66\x06\x30\x98\x19\xcb\xc5\x31\x7c\xfe\x79\x10\
+\xe8\xb8\x26\xa0\x3c\x1f\x2d\x1c\x00\x10\x40\xc8\x0e\x60\xf8\xfe\
+\x87\x81\xe1\xd3\x5f\x06\x86\x8f\x5f\x19\x18\x9c\x4d\x25\x18\xd6\
+\x4e\xf7\x65\x68\xa8\x71\x15\x93\x91\x11\xaa\x65\xf8\xf2\xf3\x04\
+\xc3\xbf\xff\x51\xc0\x68\x61\xa5\xa6\x03\x00\x02\x08\xd5\x01\x40\
+\xcb\x7f\xfc\x66\x60\x78\xf8\x81\x81\xe1\xf2\x53\x06\x86\x2f\xdf\
+\x19\x18\xb2\x23\x34\x18\xd6\xcc\x0a\x64\x88\x8a\xb3\xd0\x64\x61\
+\x62\x5a\x0a\x74\xc8\x36\x86\x7f\xff\xac\xa8\x95\x3e\x00\x02\x08\
+\xc5\x01\xdf\x80\x96\x7f\x01\xe2\xa7\x9f\x19\x18\x1e\x00\x1d\x71\
+\xf1\x05\x03\xc3\x89\x7b\x0c\x0c\x2c\x6c\xec\x0c\x8d\xb9\xa6\x0c\
+\x0b\xa7\x86\x30\x58\x3b\x6b\xbb\x30\xfc\xf9\x7f\x10\xe8\xd2\x19\
+\x40\x2d\x6a\x94\x3a\x00\x20\x80\x10\x0e\x60\x84\xf8\xfe\xd3\x0f\
+\x06\x86\x77\x40\x9f\x7f\xfe\x09\x8c\x0a\x20\xfb\xc9\x27\x06\x86\
+\xd3\x8f\x20\x0e\x91\x97\x15\x64\xe8\xad\x71\x62\xa8\xab\xf3\x65\
+\x91\x96\x17\x4f\x67\xf8\xfe\xeb\x00\xc3\xef\x3f\x05\x40\xdd\x9c\
+\xe4\x3a\x00\x20\x80\x50\xa3\x00\xe4\x80\x5f\x10\x07\x7c\x00\x5a\
+\xfe\xe1\x27\x84\xff\x09\x48\x3f\x01\x86\xca\xa1\xbb\x0c\x0c\xe7\
+\x9e\x30\x30\x58\x99\xc9\x30\x4c\xeb\x0f\x66\x88\xcf\x70\x91\xe4\
+\xe1\xe7\xed\x67\xf8\xf6\xf3\x22\x30\x5a\x42\xd1\xcd\x23\x06\x00\
+\x04\x10\x0b\x32\xe7\xc7\x1f\x48\x08\xbc\xff\x01\x0f\x14\x0c\xf0\
+\x11\xe8\x98\x07\xef\x19\x18\x24\x78\x19\x19\x7c\x3d\x35\x18\x0c\
+\x0d\x64\x19\xd6\x6c\xbc\xac\x7a\xe4\xc0\x95\x55\x0c\xdf\x7f\x6c\
+\x66\xe0\x60\x6d\x65\x60\x64\x3c\x49\xac\x03\x00\x02\x88\x05\x3d\
+\x0d\x80\x43\xe0\x1b\xd0\x2b\x4c\x0c\xb8\xd3\xd9\x7f\x88\x23\x6f\
+\xbe\x61\x60\x90\x15\xe4\x66\x48\x49\xb6\x60\xb0\xb4\x51\x67\x58\
+\xb3\xe6\xb4\xef\xfd\x0b\xb7\xbd\x18\x98\x19\x67\x30\xb0\xb1\x74\
+\x02\xd5\x3d\x26\xe4\x00\x80\x00\x62\x41\xcf\x86\x1f\xa1\x21\xc0\
+\x42\x64\x60\x5e\x04\xe6\x96\x6b\xc0\xc4\xaa\x20\x2c\xc8\x90\x91\
+\xe3\xc6\x70\xfa\xac\x06\xf3\xee\xad\x67\xb2\x3f\x3e\x7c\xea\x05\
+\x74\xc4\x54\x06\x66\xe6\xc9\x40\x65\x38\x8b\x75\x80\x00\x62\x41\
+\x4e\x84\xa0\x10\x00\xc5\x3f\x08\xb3\x32\x13\x1f\x8f\xff\x80\xc6\
+\xbf\x04\x26\x54\x6e\x36\x60\xb6\xd0\x92\x63\x48\x55\x97\x61\x38\
+\xb0\xf7\xaa\xe2\xf9\x83\xe7\x7b\xfe\x7e\xfa\x18\xc1\xc0\xce\x56\
+\x07\x8c\x96\xed\xd8\xf4\x02\x04\x10\x46\x08\xbc\x03\x25\x3e\x12\
+\x1d\x00\xf3\xc0\x17\xa0\x43\x9e\x02\x73\x8d\x20\x17\x13\x83\xa1\
+\xbd\x2e\x83\xa2\xae\x22\xc3\xb1\xbd\x97\x4d\x9e\x9e\xbb\xb4\x95\
+\xe1\xef\xcf\x8d\x0c\xac\x6c\xf5\x40\x87\x5c\x42\xd6\x06\x10\x40\
+\x28\x01\xfd\xef\x1f\xd0\x11\xc0\x44\xf6\x0b\x48\xff\x21\x15\xff\
+\x05\xd5\x67\x90\x74\xf3\xe6\x0b\x03\xc3\xa9\x07\xc0\xf4\xc4\xc8\
+\xc3\x60\x1f\x60\xc9\x60\x15\x1b\xc4\xc8\xaf\xa4\x1c\xc0\xf0\xf7\
+\xef\x49\x86\xdf\xbf\x5b\x80\x4a\x64\x60\x76\x02\x04\x10\x46\x4c\
+\xff\xfe\xc7\x40\x56\x21\xf7\x1f\x09\x33\x33\x41\xd2\xd0\xcb\x8f\
+\x0c\x0c\x37\x9e\x33\x30\xf0\x4a\x8a\x32\xe8\x07\x7b\x31\xa8\xfa\
+\xfb\x71\x70\x4b\x4a\x56\x03\x7d\xba\x16\xa6\x0f\x20\x80\xb0\x3a\
+\x80\x5a\x00\xe4\x10\x90\x8b\x5e\x03\x43\xe4\x07\xd0\x5c\x76\x5e\
+\x1e\x06\x66\x56\x60\x55\xf2\xff\xbf\x10\x4c\x0d\x40\x00\xb1\xa0\
+\x6b\x02\x05\x25\x39\x80\x11\x2d\x34\xc0\x62\x40\x07\x30\x03\xed\
+\xfb\xf9\xe1\x0b\xc3\xa3\x03\xe7\x18\xde\xdd\xbc\xc9\xf0\xef\xf7\
+\xaf\x05\x0c\xac\xac\x5d\x30\xb5\x00\x01\xc4\x82\x1e\x8c\x7f\xff\
+\x33\x50\x5c\xcf\x80\x3c\xce\x04\xcc\x11\xbf\x7f\xfd\x62\x78\x79\
+\xf6\x26\xc3\xf3\xd3\x67\x18\xfe\x7c\xf9\x72\x02\x68\x71\x33\x10\
+\x6f\x43\x56\x0b\x10\x40\x28\x0e\x00\xc5\x1b\x2b\x50\x84\x03\xa8\
+\x99\x95\x89\xbc\x60\x60\x86\x56\xd6\x2f\x6f\xde\x67\x78\x78\xec\
+\x0c\xc3\xf7\x57\x2f\x9f\x30\xb0\xb0\x34\x31\xb0\xb3\x2f\x05\x95\
+\x75\xe8\x5a\x00\x02\x08\xc5\x01\x20\xcb\xd9\x81\x06\x70\x71\x00\
+\xd9\x24\x06\x03\x13\x50\x2f\x33\x10\xbf\x79\xf4\x9a\xe1\xde\xb1\
+\x73\x0c\xaf\x6f\xdc\xfe\x00\x2c\x4e\x17\x32\xb0\xb1\x75\x02\xa5\
+\x9f\xe3\xd2\x07\x10\x40\x2c\xc8\xe1\x0f\xca\xfb\x20\x07\x80\x0a\
+\x14\x62\x4b\x42\x26\xa0\x1e\x56\x76\x60\xed\x09\x2c\x3e\xaf\xed\
+\x3b\xc7\xf0\xf0\xf4\x65\x60\x3c\xff\xd9\x08\xb4\xb8\x0e\x28\x7d\
+\x89\x90\x7e\x80\x00\x42\x29\x09\x41\x86\xb1\x03\x2d\xe7\x06\x86\
+\x00\x33\x11\x21\xc0\x06\x54\xf7\x03\x58\x7a\xdd\x3c\x72\x83\xe1\
+\xfa\xe1\xf3\x0c\x3f\xde\x7d\x38\xc3\xc0\x06\xac\x8c\xd8\x58\x37\
+\x10\x1b\x72\x00\x01\x84\x91\x06\xc0\x51\x00\xf4\x11\x13\x23\xf6\
+\xcc\xce\x08\x14\x67\x05\x3a\x12\x94\x5b\xef\x5f\x79\xc2\x70\x6a\
+\xeb\x49\x86\x0f\x8f\x9e\xbf\x63\x60\x61\x6e\x67\xe0\x60\x9f\x0d\
+\xaa\x30\x49\x89\x3a\x80\x00\x42\x71\x00\x28\x0e\xc1\x21\xc0\x86\
+\xe9\x80\xff\xd0\x34\xc2\x02\x94\x7b\x7c\xef\x3d\xc3\x91\x0d\xc7\
+\x19\x1e\x5f\x7b\xf0\x0d\x98\xa7\x67\x03\x53\x2d\xde\x78\xc6\x07\
+\x00\x02\x08\xc5\x01\xa0\x2a\x18\x54\x78\x70\xb3\xa3\xda\x0c\x76\
+\x18\x30\xb8\xdf\xbe\xfe\xc1\x70\x68\xe3\x45\x86\x4b\x07\xae\x30\
+\xfc\xfa\xf6\x1d\x58\xf7\xb3\x81\xf2\xf3\x11\x4a\xb2\x2c\x40\x00\
+\xa1\x38\x00\x14\xfc\xec\x40\xcb\x19\xff\x41\x7c\x0c\x0a\x04\x0e\
+\x60\x63\xeb\xe7\xaf\xff\x0c\xc7\xf6\xdc\x64\x38\xb8\xe1\x34\xc3\
+\xb7\xd7\xef\x2f\x03\x2d\x6e\x03\xe2\x15\xd4\x28\x2d\x01\x02\x08\
+\x25\x17\xb0\xb1\x40\xe2\x9f\x05\xc4\x66\x87\xb8\xe0\xdc\xc9\x27\
+\x0c\x7b\xd6\x9e\x63\x78\x72\xed\xd1\x1b\x06\x36\xe6\x2e\x06\x1e\
+\x8e\x79\x40\xb5\x6f\xa9\x55\x5c\x03\x04\x10\x4a\x08\x80\x1c\x20\
+\xc0\x05\x2c\x0d\x81\xbe\xbe\x7f\xf7\x23\xc3\xa6\xe5\x67\x19\x2e\
+\x1c\xbc\x01\xac\xa0\xff\xaf\x60\xe0\x64\x6d\x02\xa6\xc0\xfb\xf0\
+\x72\x96\x4a\x00\x20\x80\x90\x43\x80\x51\x48\x80\x85\xe1\x1f\xb0\
+\x2c\x5e\xb9\xe0\x2c\xc3\xc1\x4d\x97\x18\xbe\x7f\xfe\xb6\x1f\x68\
+\x71\x0d\xd0\xe2\x63\xb4\xea\x9a\x01\x04\x10\xc2\x01\x6c\xcc\x8c\
+\x27\x8f\x3c\x60\x58\x38\xfd\x38\xc3\xf3\x9b\x2f\xae\x33\x70\xb2\
+\xf4\x31\x70\xb1\xcd\x63\x80\xe4\x38\x9a\x01\x80\x00\x42\x38\x80\
+\x85\x79\xce\xfe\x4d\x97\x02\x80\x35\xc9\x22\x06\x3e\xf6\x69\xc0\
+\x10\x79\xcd\x40\x07\x00\x10\x60\x00\x67\x40\x00\x61\x44\x18\x7f\
+\x31\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = "\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x12\
+\x05\x0c\xb7\x27\
+\x00\x6e\
+\x00\x6f\x00\x61\x00\x74\x00\x75\x00\x6e\x00\x6c\x00\x6f\x00\x6f\x00\x70\x00\x73\x00\x6f\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
+\x00\x10\
+\x03\x05\x50\x67\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x70\x00\x61\x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\x91\x67\x27\
+\x00\x63\
+\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x05\x42\x7f\x67\
+\x00\x63\
+\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x5f\x00\x6d\x00\x6f\x00\x75\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x04\x32\xd5\x67\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x65\x00\x6a\x00\x65\x00\x63\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x03\x75\x07\x07\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = "\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x02\
+\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x09\x48\
+\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x25\x33\
+\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x4a\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x15\xb7\
+\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xfd\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/contrib/vtksnl/vtkhandler.py b/contrib/vtksnl/vtkhandler.py
new file mode 100644
index 0000000..36b344c
--- /dev/null
+++ b/contrib/vtksnl/vtkhandler.py
@@ -0,0 +1,291 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""Modules for handling vtkRenderWindowInteractor events"""
+from PyQt4 import QtCore, QtGui
+from core.modules.basic_modules import String
+from core.modules.vistrails_module import Module, NotCacheable
+from core.modules.module_registry import get_module_registry
+from core.modules.module_configure import StandardModuleConfigurationWidget
+from core.modules.python_source_configure import PythonEditor
+from core.vistrail.module_function import ModuleFunction, ModuleParam
+import urllib
+
+################################################################################
+class vtkInteractionHandler(NotCacheable, Module):
+    """
+    vtkInteractionHandler allow users to insert callback code for interacting
+    with the vtkRenderWindowInteractor InteractionEvent
+    
+    """
+
+    # Since vtkCommand is not wrapped in Python, we need to hardcoded all events
+    # string from vtkCommand.h
+    vtkEvents = [
+        'AnyEvent',
+        'DeleteEvent',
+        'StartEvent',
+        'EndEvent',
+        'RenderEvent',
+        'ProgressEvent',
+        'PickEvent',
+        'StartPickEvent',
+        'EndPickEvent',
+        'AbortCheckEvent',
+        'ExitEvent',
+        'LeftButtonPressEvent',
+        'LeftButtonReleaseEvent',
+        'MiddleButtonPressEvent',
+        'MiddleButtonReleaseEvent',
+        'RightButtonPressEvent',
+        'RightButtonReleaseEvent',
+        'EnterEvent',
+        'LeaveEvent',
+        'KeyPressEvent',
+        'KeyReleaseEvent',
+        'CharEvent',
+        'ExposeEvent',
+        'ConfigureEvent',
+        'TimerEvent',
+        'MouseMoveEvent',
+        'MouseWheelForwardEvent',
+        'MouseWheelBackwardEvent',
+        'ResetCameraEvent',
+        'ResetCameraClippingRangeEvent',
+        'ModifiedEvent',
+        'WindowLevelEvent',
+        'StartWindowLevelEvent',
+        'EndWindowLevelEvent',
+        'ResetWindowLevelEvent',
+        'SetOutputEvent',
+        'ErrorEvent',
+        'WarningEvent',
+        'StartInteractionEvent',
+        'InteractionEvent',
+        'EndInteractionEvent',
+        'EnableEvent',
+        'DisableEvent',
+        'CreateTimerEvent',
+        'DestroyTimerEvent',
+        'PlacePointEvent',
+        'PlaceWidgetEvent',
+        'CursorChangedEvent',
+        'ExecuteInformationEvent',
+        'RenderWindowMessageEvent',
+        'WrongTagEvent',
+        'StartAnimationCueEvent',
+        'AnimationCueTickEvent',
+        'EndAnimationCueEvent',
+        'VolumeMapperRenderEndEvent',
+        'VolumeMapperRenderProgressEvent',
+        'VolumeMapperRenderStartEvent',
+        'VolumeMapperComputeGradientsEndEvent',
+        'VolumeMapperComputeGradientsProgressEvent',
+        'VolumeMapperComputeGradientsStartEvent',
+        'WidgetModifiedEvent',
+        'WidgetValueChangedEvent',
+        'WidgetActivateEvent',
+        'ConnectionCreatedEvent',
+        'ConnectionClosedEvent',
+        'DomainModifiedEvent',
+        'PropertyModifiedEvent',
+        'UpdateEvent',
+        'RegisterEvent',
+        'UnRegisterEvent',
+        'UpdateInformationEvent']
+    
+    def __init__(self):
+        Module.__init__(self)
+        self.observer = None
+        self.handler = None
+        self.shareddata = None
+
+    def compute(self):
+        """ compute() -> None
+        Actually compute nothing
+        """        
+        self.observer = self.forceGetInputFromPort('Observer')
+        self.handler = self.forceGetInputFromPort('Handler', '')
+        self.shareddata = self.forceGetInputListFromPort('SharedData')
+        if len(self.shareddata)==1:
+            self.shareddata = self.shareddata[0]
+        if self.observer:
+            source = urllib.unquote(self.handler)
+            observer = self.observer.vtkInstance
+            for e in vtkInteractionHandler.vtkEvents:
+                f = e[0].lower() + e[1:]
+                f = f.replace('Event', 'Handler')
+                source += ('\nif locals().has_key("%s"):\n' % f +
+                           '\tobserver.AddObserver("%s", ' % e +
+                           'self.eventHandler)\n')
+            exec(source)
+            if hasattr(self.observer.vtkInstance, 'PlaceWidget'):
+                self.observer.vtkInstance.PlaceWidget()
+
+    def eventHandler(self, obj, event):
+        """ eventHandler(obj: vtkObject, event: str) -> None
+        A proxy for all vtk events to direct to the correct calls
+        
+        """
+        if self.handler!='':
+            source = urllib.unquote(self.handler)
+            f = event[0].lower() + event[1:]
+            f = f.replace('Event', 'Handler')
+            myGlobals = globals()
+            myGlobals.update({'self':self})
+            exec(source + ('\nif locals().has_key("%s"):\n' % f)+
+                 ('\t%s(obj, self.shareddata)' % f)) in myGlobals, locals()
+
+    def clear(self):
+        """ clear() -> None
+        Remove event handler so the object can be freed correctly
+        
+        """
+        # Remove all observers
+        if self.observer:
+            for e in vtkInteractionHandler.vtkEvents:
+                self.observer.vtkInstance.RemoveObservers(e)
+        Module.clear(self)
+
+    def repaintCells(self):
+        """ repaintCells() -> None
+        Redraw all cells on the current sheet
+        
+        """
+        from packages.spreadsheet.spreadsheet_controller \
+             import spreadsheetController
+        from packages.spreadsheet.spreadsheet_event \
+             import RepaintCurrentSheetEvent
+        spreadsheetController.postEventToSpreadsheet(RepaintCurrentSheetEvent())
+
+class HandlerConfigurationWidget(StandardModuleConfigurationWidget):
+    """
+    HandlerConfigurationWidget is simialr to PythonSource
+    configuration widget except that it doesn't allow add/remove
+    ports. In this configuration widget, the user will enter their
+    python code to handle a specifc event
+    
+    """
+    def __init__(self, module, controller, parent=None):
+        """ HandlerConfigurationWidget(module: Module,
+                                       controller: VistrailController,
+                                       parent: QWidget)
+                                       -> HandlerConfigurationWidget
+        Setup the dialog to have a single python source editor and 2
+        buttons
+        
+        """
+        StandardModuleConfigurationWidget.__init__(self, module,
+                                                   controller, parent)
+        self.setWindowTitle('Handler Python Script Editor')
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().setMargin(0)
+        self.layout().setSpacing(0)
+        self.createEditor()
+        self.createButtonLayout()        
+    
+    def findHandlerFunction(self):
+        """ findHandlerFunction() -> int
+        Return the function id associated with input port 'source'
+        
+        """
+        fid = -1
+        for i in xrange(self.module.getNumFunctions()):
+            if self.module.functions[i].name=='Handler':
+                fid = i
+                break
+        return fid
+
+    def createEditor(self):
+        """ createEditor() -> None
+        Add a python editor into the widget layout
+        
+        """
+        self.codeEditor = PythonEditor(self)
+        fid = self.findHandlerFunction()
+        if fid!=-1:
+            f = self.module.functions[fid]
+            self.codeEditor.setPlainText(urllib.unquote(f.params[0].strValue))
+        self.codeEditor.document().setModified(False)
+        self.layout().addWidget(self.codeEditor, 1)
+        
+    def createButtonLayout(self):
+        """ createButtonLayout() -> None
+        Construct Ok & Cancel button
+        
+        """
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.okButton = QtGui.QPushButton('&OK', self)
+        self.okButton.setAutoDefault(False)
+        self.okButton.setFixedWidth(100)
+        self.buttonLayout.addWidget(self.okButton)
+        self.cancelButton = QtGui.QPushButton('&Cancel', self)
+        self.cancelButton.setAutoDefault(False)
+        self.cancelButton.setShortcut('Esc')
+        self.cancelButton.setFixedWidth(100)
+        self.buttonLayout.addWidget(self.cancelButton)
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.okButton, QtCore.SIGNAL('clicked(bool)'), self.okTriggered)
+        self.connect(self.cancelButton, QtCore.SIGNAL('clicked(bool)'), self.close)
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return the recommendation size of this widget
+        
+        """
+        return QtCore.QSize(512, 512)
+
+    def updateController(self, controller):
+        """ updateController() -> None        
+        Based on the input of the python editor, update the vistrail
+        controller appropriately
+        
+        """
+        if self.codeEditor.document().isModified():
+            code = urllib.quote(str(self.codeEditor.toPlainText()))
+            functions = [('Handler', [code])]
+            self.controller.update_functions(self.module, functions)
+
+    def okTriggered(self, checked = False):
+        """ okTriggered(checked: bool) -> None
+        Update vistrail controller (if neccesssary) then close the widget
+        
+        """
+        self.updateController(self.controller)
+        self.emit(QtCore.SIGNAL('doneConfigure()'))
+        self.close()
+
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    registry = get_module_registry()
+    vIO = registry.get_descriptor_by_name(
+        'edu.utah.sci.vistrails.vtksnl',
+        'vtkInteractorObserver').module
+    registry.add_module(vtkInteractionHandler, configureWidgetType=HandlerConfigurationWidget)
+    registry.add_input_port(vtkInteractionHandler, 'Observer', vIO)
+    registry.add_input_port(vtkInteractionHandler, 'Handler', String, True)
+    registry.add_input_port(vtkInteractionHandler, 'SharedData', Module)
+    registry.add_output_port(vtkInteractionHandler, 'self',
+                             vtkInteractionHandler)
diff --git a/contrib/vtksnl/vtkviewcell.py b/contrib/vtksnl/vtkviewcell.py
new file mode 100644
index 0000000..1611d95
--- /dev/null
+++ b/contrib/vtksnl/vtkviewcell.py
@@ -0,0 +1,1032 @@
+############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+################################################################################
+# File QVTKViewWidget.py
+# File for displaying a vtkRenderWindow in a Qt's QWidget ported from
+# VTK/GUISupport/QVTK. Combine altogether to a single class: QVTKViewWidget
+################################################################################
+import vtksnl
+from PyQt4 import QtCore, QtGui
+import sip
+from core import system
+from core.modules.module_registry import get_module_registry
+from packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import vtkcell_rc
+import gc
+from gui.qt import qt_super
+import core.db.action
+from core.vistrail.action import Action
+from core.vistrail.port import Port
+from core.vistrail import module
+from core.vistrail import connection
+from core.vistrail.module_function import ModuleFunction
+from core.vistrail.module_param import ModuleParam
+from core.vistrail.location import Location
+from core.modules.vistrails_module import ModuleError
+import copy
+
+################################################################################
+
+class VTKViewCell(SpreadsheetCell):
+    """
+    VTKViewCell is a VisTrails Module that can display vtkRenderWindow inside a cell
+    
+    """
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        renderView = self.forceGetInputFromPort('SetRenderView')
+        if renderView==None:
+            raise ModuleError(self, 'A vtkRenderView input is required.')
+        self.cellWidget = self.displayAndWait(QVTKViewWidget, (renderView,))
+
+AsciiToKeySymTable = ( None, None, None, None, None, None, None,
+                       None, None,
+                       "Tab", None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None,
+                       "space", "exclam", "quotedbl", "numbersign",
+                       "dollar", "percent", "ampersand", "quoteright",
+                       "parenleft", "parenright", "asterisk", "plus",
+                       "comma", "minus", "period", "slash",
+                       "0", "1", "2", "3", "4", "5", "6", "7",
+                       "8", "9", "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",
+                       "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+                       "h", "i", "j", "k", "l", "m", "n", "o",
+                       "p", "q", "r", "s", "t", "u", "v", "w",
+                       "x", "y", "z", "braceleft", "bar", "braceright",
+                       "asciitilde", "Delete",
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None)
+
+class QVTKViewWidget(QCellWidget):
+    """
+    QVTKViewWidget is the actual rendering widget that can display
+    vtkRenderer inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVTKViewWidget(parent: QWidget, f: WindowFlags) -> QVTKViewWidget
+        Initialize QVTKViewWidget with a toolbar with its own device
+        context
+        
+        """
+        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+
+        self.interacting = None
+        self.mRenWin = None
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.toolBarType = QVTKViewWidgetToolBar
+        self.setAnimationEnabled(True)
+        
+    def removeObserversFromInteractorStyle(self):
+        """ removeObserversFromInteractorStyle() -> None        
+        Remove all python binding from interactor style observers for
+        safely freeing the cell
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.RemoveObservers("InteractionEvent")
+            style.RemoveObservers("EndPickEvent")
+            style.RemoveObservers("CharEvent")
+            style.RemoveObservers("MouseWheelForwardEvent")
+            style.RemoveObservers("MouseWheelBackwardEvent")
+        
+    def addObserversToInteractorStyle(self):
+        """ addObserversToInteractorStyle() -> None        
+        Assign observer to the current interactor style
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.AddObserver("InteractionEvent", self.interactionEvent)
+            style.AddObserver("EndPickEvent", self.interactionEvent)
+            style.AddObserver("CharEvent", self.charEvent)
+            style.AddObserver("MouseWheelForwardEvent", self.interactionEvent)
+            style.AddObserver("MouseWheelBackwardEvent", self.interactionEvent)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        
+        """
+        self.renderer_maps = {}
+        for ren in self.getRendererList():
+            self.mRenWin.RemoveRenderer(ren)
+        self.removeObserversFromInteractorStyle()
+        self.SetRenderWindow(None)
+        QCellWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Updates the cell contents with new vtkRenderer
+        
+        """
+        (renderView, ) = inputPorts
+        renWin = renderView.vtkInstance.GetRenderWindow()
+        renWin.DoubleBufferOn()
+        self.SetRenderWindow(renWin)
+        renderView.vtkInstance.ResetCamera()
+        self.addObserversToInteractorStyle()
+        
+#        renWin = self.GetRenderWindow()
+#        renderers = [renderView.vtkInstance.GetRenderer()]
+#        iren = renWin.GetInteractor()
+        # Update interactor style
+#         self.removeObserversFromInteractorStyle()
+#         if renderView==None:
+#             if iStyle==None:
+#                 iStyleInstance = vtk.vtkInteractorStyleTrackballCamera()
+#             else:
+#                 iStyleInstance = iStyle.vtkInstance
+#             iren.SetInteractorStyle(iStyleInstance)
+#         self.addObserversToInteractorStyle()
+        # Capture window into history for playback
+        # Call this at the end to capture the image after rendering
+        QCellWidget.updateContents(self, inputPorts)
+
+    def GetRenderWindow(self):
+        """ GetRenderWindow() -> vtkRenderWindow
+        Return the associated vtkRenderWindow
+        
+        """
+        if not self.mRenWin:
+            win = vtksnl.vtkRenderWindow()
+            win.DoubleBufferOn()
+            self.SetRenderWindow(win)
+            del win
+
+        return self.mRenWin
+
+    def SetRenderWindow(self,w):
+        """ SetRenderWindow(w: vtkRenderWindow)        
+        Set a new render window to QVTKViewWidget and initialize the
+        interactor as well
+        
+        """
+        if w == self.mRenWin:
+            return
+        
+        if self.mRenWin:
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+                
+        self.mRenWin = w
+        
+        if self.mRenWin:
+            self.mRenWin.Register(None)
+            if system.systemType=='Linux':
+                try:
+                    vp = '_%s_void_p' % (hex(int(QtGui.QX11Info.display()))[2:])
+                except TypeError:
+                    #This was change for PyQt4.2
+                    if isinstance(QtGui.QX11Info.display(),QtGui.Display):
+                        display = sip.unwrapinstance(QtGui.QX11Info.display())
+                        vp = '_%s_void_p' % (hex(display)[2:])
+                self.mRenWin.SetDisplayId(vp)
+                if not self.mRenWin.GetMapped():
+                    self.mRenWin.GetInteractor().Initialize()
+                    system.XDestroyWindow(self.mRenWin.GetGenericDisplayId(),
+                                          self.mRenWin.GetGenericWindowId())
+                    self.mRenWin.Finalize()
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))
+            else:
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))                
+            if self.isVisible():
+                self.mRenWin.Start()
+
+    def GetInteractor(self):
+        """ GetInteractor() -> vtkInteractor
+        Return the vtkInteractor control this QVTKViewWidget
+        """
+        return self.GetRenderWindow().GetInteractor()
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Process window and interaction events
+        
+        """
+        if e.type()==QtCore.QEvent.ParentAboutToChange:
+            if self.mRenWin:
+                if self.mRenWin.GetMapped():
+                    self.mRenWin.Finalize()
+        else:
+            if e.type()==QtCore.QEvent.ParentChange:
+                if self.mRenWin:
+                    self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                    if self.isVisible():
+                        self.mRenWin.Start()
+        
+        if QtCore.QObject.event(self,e):
+            return 1
+
+        if e.type() == QtCore.QEvent.KeyPress:
+            self.keyPressEvent(e)
+            if e.isAccepted():
+                return e.isAccepted()
+
+        return qt_super(QVTKViewWidget, self).event(e)
+        
+        # return QtGui.QWidget.event(self,e)
+        # Was this right? Wasn't this supposed to be QCellWidget.event()?
+
+    def resizeWindow(self, width, height):
+        """ resizeWindow(width: int, height: int) -> None
+        Work around vtk bugs for resizing window
+        
+        """
+        ########################################################
+        # VTK - BUGGGGGGGGG - GRRRRRRRRR
+        # This is a 'bug' in vtkWin32OpenGLRenderWindow(.cxx)
+        # If a render window is mapped to screen, the actual
+        # window size is the client area of the window in Win32.
+        # However, this real window size is only updated through
+        # vtkWin32OpenGLRenderWindow::GetSize(). So this has to
+        # be called here to get the cell size correctly. This
+        # invalidates the condition in the next SetSize().
+        # We can use self.mRenWin.SetSize(0,0) here but it will
+        # cause flickering and decrease performance!
+        # SetPosition(curX,curY) also works here but slower.
+        self.mRenWin.GetSize()
+        
+        self.mRenWin.SetSize(width, height)
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().SetSize(width, height)
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the vtkRenderWindow size then QVTKViewWidget resized
+        
+        """
+        qt_super(QVTKViewWidget, self).resizeEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.resizeWindow(self.width(), self.height())
+        self.mRenWin.Render()
+
+    def moveEvent(self,e):
+        """ moveEvent(e: QEvent) -> None
+        Echo the move event into vtkRenderWindow
+        
+        """
+        qt_super(QVTKViewWidget, self).moveEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.mRenWin.SetPosition(self.x(),self.y())
+
+    def paintEvent(self, e):
+        """ paintEvent(e: QPaintEvent) -> None
+        Paint the QVTKViewWidget with vtkRenderWindow
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        if hasattr(self.mRenWin, 'UpdateGLRegion'):
+            self.mRenWin.UpdateGLRegion()
+        self.mRenWin.Render()
+
+    def SelectActiveRenderer(self,iren):
+        """ SelectActiveRenderer(iren: vtkRenderWindowIteractor) -> None
+        Only make the vtkRenderer below the mouse cursor active
+        
+        """
+        epos = iren.GetEventPosition()
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            ren.SetInteractive(ren.IsInViewport(epos[0], epos[1]))
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        isDoubleClick = e.type()==QtCore.QEvent.MouseButtonDblClick
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      ctrl,
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),
+                                      isDoubleClick,
+                                      None)
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonPressEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonPressEvent",
+                  QtCore.Qt.RightButton:"RightButtonPressEvent"}
+
+        self.SelectActiveRenderer(iren)
+
+        if ctrl:
+            e.ignore()
+            return
+
+        self.interacting = self.getActiveRenderer(iren)
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0), 0, None)
+
+        iren.InvokeEvent("MouseMoveEvent")
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("EnterEvent")
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("LeaveEvent")
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonReleaseEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonReleaseEvent",
+                  QtCore.Qt.RightButton:"RightButtonReleaseEvent"}
+
+        self.interacting = None
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def keyPressEvent(self,e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q', 'e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl,shift,ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyPressEvent")
+
+        if ascii_key:
+            iren.InvokeEvent("CharEvent")
+
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if e.text().length()>0:
+            ascii_key = e.text().toLatin1()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q','e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl, shift, ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyReleaseEvent")
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+        
+        self.SelectActiveRenderer(iren)
+        
+        if e.delta()>0:
+            iren.InvokeEvent("MouseWheelForwardEvent")
+        else:
+            iren.InvokeEvent("MouseWheelBackwardEvent")
+
+    def focusInEvent(self,e):
+        """ focusInEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def focusOutEvent(self,e):
+        """ focusOutEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def contextMenuEvent(self,e):
+        """ contextMenuEvent(e: QContextMenuEvent) -> None        
+        Make sure to get the right mouse position for the context menu
+        event, i.e. also the right click
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = int(e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = int(e.modifiers()&QtCore.Qt.ShiftModifier)
+        iren.SetEventInformationFlipY(e.x(),e.y(),ctrl,shift,chr(0),0,None)
+        iren.InvokeEvent("ContextMenuEvent")
+
+    def ascii_to_key_sym(self,i):
+        """ ascii_to_key_sym(i: int) -> str
+        Convert ASCII code into key name
+        
+        """
+        global AsciiToKeySymTable
+        return AsciiToKeySymTable[i]
+
+    def qt_key_to_key_sym(self,i):
+        """ qt_key_to_key_sym(i: QtCore.Qt.Keycode) -> str
+        Convert Qt key code into key name
+        
+        """
+        handler = {QtCore.Qt.Key_Backspace:"BackSpace",
+                   QtCore.Qt.Key_Tab:"Tab",
+                   QtCore.Qt.Key_Backtab:"Tab",
+                   QtCore.Qt.Key_Return:"Return",
+                   QtCore.Qt.Key_Enter:"Return",
+                   QtCore.Qt.Key_Shift:"Shift_L",
+                   QtCore.Qt.Key_Control:"Control_L",
+                   QtCore.Qt.Key_Alt:"Alt_L",
+                   QtCore.Qt.Key_Pause:"Pause",
+                   QtCore.Qt.Key_CapsLock:"Caps_Lock",
+                   QtCore.Qt.Key_Escape:"Escape",
+                   QtCore.Qt.Key_Space:"space",
+                   QtCore.Qt.Key_End:"End",
+                   QtCore.Qt.Key_Home:"Home",
+                   QtCore.Qt.Key_Left:"Left",
+                   QtCore.Qt.Key_Up:"Up",
+                   QtCore.Qt.Key_Right:"Right",
+                   QtCore.Qt.Key_Down:"Down",
+                   QtCore.Qt.Key_SysReq:"Snapshot",
+                   QtCore.Qt.Key_Insert:"Insert",
+                   QtCore.Qt.Key_Delete:"Delete",
+                   QtCore.Qt.Key_Help:"Help",
+                   QtCore.Qt.Key_0:"0",
+                   QtCore.Qt.Key_1:"1",
+                   QtCore.Qt.Key_2:"2",
+                   QtCore.Qt.Key_3:"3",
+                   QtCore.Qt.Key_4:"4",
+                   QtCore.Qt.Key_5:"5",
+                   QtCore.Qt.Key_6:"6",
+                   QtCore.Qt.Key_7:"7",
+                   QtCore.Qt.Key_8:"8",
+                   QtCore.Qt.Key_9:"9",
+                   QtCore.Qt.Key_A:"a",
+                   QtCore.Qt.Key_B:"b",
+                   QtCore.Qt.Key_C:"c",
+                   QtCore.Qt.Key_D:"d",
+                   QtCore.Qt.Key_E:"e",
+                   QtCore.Qt.Key_F:"f",
+                   QtCore.Qt.Key_G:"g",
+                   QtCore.Qt.Key_H:"h",
+                   QtCore.Qt.Key_I:"i",
+                   QtCore.Qt.Key_J:"h",
+                   QtCore.Qt.Key_K:"k",
+                   QtCore.Qt.Key_L:"l",
+                   QtCore.Qt.Key_M:"m",
+                   QtCore.Qt.Key_N:"n",
+                   QtCore.Qt.Key_O:"o",
+                   QtCore.Qt.Key_P:"p",
+                   QtCore.Qt.Key_Q:"q",
+                   QtCore.Qt.Key_R:"r",
+                   QtCore.Qt.Key_S:"s",
+                   QtCore.Qt.Key_T:"t",
+                   QtCore.Qt.Key_U:"u",
+                   QtCore.Qt.Key_V:"v",
+                   QtCore.Qt.Key_W:"w",
+                   QtCore.Qt.Key_X:"x",
+                   QtCore.Qt.Key_Y:"y",
+                   QtCore.Qt.Key_Z:"z",
+                   QtCore.Qt.Key_Asterisk:"asterisk",
+                   QtCore.Qt.Key_Plus:"plus",
+                   QtCore.Qt.Key_Minus:"minus",
+                   QtCore.Qt.Key_Period:"period",
+                   QtCore.Qt.Key_Slash:"slash",
+                   QtCore.Qt.Key_F1:"F1",
+                   QtCore.Qt.Key_F2:"F2",
+                   QtCore.Qt.Key_F3:"F3",
+                   QtCore.Qt.Key_F4:"F4",
+                   QtCore.Qt.Key_F5:"F5",
+                   QtCore.Qt.Key_F6:"F6",
+                   QtCore.Qt.Key_F7:"F7",
+                   QtCore.Qt.Key_F8:"F8",
+                   QtCore.Qt.Key_F9:"F9",
+                   QtCore.Qt.Key_F10:"F10",
+                   QtCore.Qt.Key_F11:"F11",
+                   QtCore.Qt.Key_F12:"F12",
+                   QtCore.Qt.Key_F13:"F13",
+                   QtCore.Qt.Key_F14:"F14",
+                   QtCore.Qt.Key_F15:"F15",
+                   QtCore.Qt.Key_F16:"F16",
+                   QtCore.Qt.Key_F17:"F17",
+                   QtCore.Qt.Key_F18:"F18",
+                   QtCore.Qt.Key_F19:"F19",
+                   QtCore.Qt.Key_F20:"F20",
+                   QtCore.Qt.Key_F21:"F21",
+                   QtCore.Qt.Key_F22:"F22",
+                   QtCore.Qt.Key_F23:"F23",
+                   QtCore.Qt.Key_F24:"F24",
+                   QtCore.Qt.Key_NumLock:"Num_Lock",
+                   QtCore.Qt.Key_ScrollLock:"Scroll_Lock"}
+        if i in handler:            
+            return handler[i]
+        else:
+            return "None"
+
+    def getRendererList(self):
+        """ getRendererList() -> list
+        Return a list of vtkRenderer running in this QVTKViewWidget
+        """
+        result = []
+        renWin = self.GetRenderWindow()
+        renderers = renWin.GetRenderers()
+        renderers.InitTraversal()
+        for i in xrange(renderers.GetNumberOfItems()):
+            result.append(renderers.GetNextItem())
+        return result
+
+    def getActiveRenderer(self, iren):
+        """ getActiveRenderer(iren: vtkRenderWindowwInteractor) -> vtkRenderer
+        Return the active vtkRenderer under mouse
+        
+        """
+        epos = list(iren.GetEventPosition())
+        if epos[1]<0:
+            epos[1] = -epos[1]
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            if ren.IsInViewport(epos[0], epos[1]):
+                return ren
+        return None
+
+    def findSheetTabWidget(self):
+        """ findSheetTabWidget() -> QTabWidget
+        Find and return the sheet tab widget
+        
+        """
+        p = self.parent()
+        while p:
+            if hasattr(p, 'isSheetTabWidget'):
+                if p.isSheetTabWidget()==True:
+                    return p
+            p = p.parent()
+        return None
+
+    def getRenderersInCellList(self, sheet, cells):
+        """ isRendererIn(sheet: spreadsheet.StandardWidgetSheet,
+                         cells: [(int,int)]) -> bool
+        Get the list of renderers in side a list of (row, column)
+        cells.
+        
+        """
+        rens = []
+        for (row, col) in cells:
+            cell = sheet.getCell(row, col)
+            if hasattr(cell, 'getRendererList'):
+                rens += cell.getRendererList()
+        return rens
+
+    def getSelectedCellWidgets(self):
+        sheet = self.findSheetTabWidget()
+        if sheet:
+            iren = self.mRenWin.GetInteractor()
+            ren = self.interacting
+            if not ren: ren = self.getActiveRenderer(iren)
+            if ren:
+                cells = sheet.getSelectedLocations()
+                if (ren in self.getRenderersInCellList(sheet, cells)):
+                    return [sheet.getCell(row, col)
+                            for (row, col) in cells
+                            if hasattr(sheet.getCell(row, col), 
+                                       'getRendererList')]
+        return []
+
+    def interactionEvent(self, istyle, name):
+        """ interactionEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure interactions sync across selected renderers
+        
+        """
+        if name=='MouseWheelForwardEvent':
+            istyle.OnMouseWheelForward()
+        if name=='MouseWheelBackwardEvent':
+            istyle.OnMouseWheelBackward()
+        ren = self.interacting
+        if not ren:
+            ren = self.getActiveRenderer(istyle.GetInteractor())
+        if ren:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            for cell in self.getSelectedCellWidgets():
+                if cell!=self and hasattr(cell, 'getRendererList'): 
+                    rens = cell.getRendererList()
+                    for r in rens:
+                        if r!=ren:
+                            dcam = r.GetActiveCamera()
+                            dcam.SetPosition(cpos)
+                            dcam.SetFocalPoint(cfol)
+                            dcam.SetViewUp(cup)
+                            r.ResetCameraClippingRange()
+                    cell.update()
+
+    def charEvent(self, istyle, name):
+        """ charEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure key presses also sync across selected renderers
+
+        """
+        iren = istyle.GetInteractor()
+        ren = self.interacting
+        if not ren: ren = self.getActiveRenderer(iren)
+        if ren:
+            keyCode = iren.GetKeyCode()
+            if keyCode in ['w','W','s','S','r','R','p','P']:
+                for cell in self.getSelectedCellWidgets():
+                    if hasattr(cell, 'GetInteractor'):
+                        selectedIren = cell.GetInteractor()
+                        selectedIren.SetKeyCode(keyCode)
+                        selectedIren.GetInteractorStyle().OnChar()
+                        selectedIren.Render()
+            istyle.OnChar()
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+        
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+        
+        """
+        w2i = vtksnl.vtkWindowToImageFilter()
+        w2i.ReadFrontBufferOff()
+        w2i.SetInput(self.mRenWin)
+        # Render twice to get a clean image on the back buffer
+        self.mRenWin.Render()
+        self.mRenWin.Render()
+        w2i.Update()
+        writer = vtksnl.vtkPNGWriter()
+        writer.SetInputConnection(w2i.GetOutputPort())
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def captureWindow(self):
+        """ captureWindow() -> None        
+        Capture the window contents to file
+        
+        """
+        fn = QtGui.QFileDialog.getSaveFileName(None,
+                                               "Save file as...",
+                                               "screenshot.png",
+                                               "Images (*.png)")
+        if fn.isNull():
+            return
+        self.saveToPNG(str(fn))
+        
+    def grabWindowPixmap(self):
+        """ grabWindowImage() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        uchar = self.saveToPNG(None)
+
+        ba = QtCore.QByteArray()
+        buf = QtCore.QBuffer(ba)
+        buf.open(QtCore.QIODevice.WriteOnly)
+        for i in xrange(uchar.GetNumberOfTuples()):
+            c = uchar.GetValue(i)
+            buf.putChar(chr(c))
+        buf.close()
+        
+        pixmap = QtGui.QPixmap()
+        pixmap.loadFromData(ba, 'PNG')
+        return pixmap
+
+    def dumpToFile(self, filename):
+        """dumpToFile() -> None
+        Dumps itself as an image to a file, calling saveToPNG
+        """
+        self.saveToPNG(filename)
+
+class QVTKViewWidgetCapture(QtGui.QAction):
+    """
+    QVTKViewWidgetCapture is the action to capture the vtk rendering
+    window to an image
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKViewWidgetCapture(parent: QWidget) -> QVTKViewWidgetCapture
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera.png"),
+                               "&Capture image to file",
+                               parent)
+        self.setStatusTip("Capture the rendered image to a file")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.captureWindow()
+
+class QVTKViewWidgetSaveCamera(QtGui.QAction):
+    """
+    QVTKViewWidgetSaveCamera is the action to capture the current camera
+    of the vtk renderers and save it back to the pipeline
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKViewWidgetSaveCamera(parent: QWidget) -> QVTKViewWidgetSaveCamera
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               "Save &Camera",
+                               parent)
+        self.setStatusTip("Save current camera views to the pipeline")
+
+    def setCamera(self, controller):
+        ops = []
+        pipeline = controller.current_pipeline                        
+        cellWidget = self.toolBar.getSnappedWidget()
+        renderers = cellWidget.getRendererList()
+        for ren in renderers:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            rendererId = cellWidget.renderer_maps[ren]
+            # Looking for SetActiveCamera()
+            camera = None
+            renderer = pipeline.modules[rendererId]
+            for c in pipeline.connections.values():
+                if c.destination.moduleId==rendererId:
+                    if c.destination.name=='SetActiveCamera':
+                        camera = pipeline.modules[c.source.moduleId]
+                        break
+            
+            if not camera:
+                # Create camera
+                vtk_package = 'edu.utah.sci.vistrails.vtksnl'
+                camera = controller.create_module(vtk_package, 'vtkCamera', '',
+                                                  0.0, 0.0)
+                ops.append(('add', camera))
+
+                # Connect camera to renderer
+                camera_conn = controller.create_connection(camera, 'self',
+                                                           renderer, 
+                                                           'SetActiveCamera')
+                ops.append(('add', camera_conn))
+            # update functions
+            def convert_to_str(arglist):
+                new_arglist = []
+                for arg in arglist:
+                    new_arglist.append(str(arg))
+                return new_arglist
+            functions = [('SetPosition', convert_to_str(cpos)),
+                         ('SetFocalPoint', convert_to_str(cfol)),
+                         ('SetViewUp', convert_to_str(cup))]
+            ops.extend(controller.update_functions_ops(camera, functions))
+
+        action = core.db.action.create_action(ops)
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        controller.select_latest_version()
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        visApp = QtCore.QCoreApplication.instance()
+        if hasattr(visApp, 'builderWindow'):
+            builderWindow = visApp.builderWindow
+            if builderWindow:
+                info = self.toolBar.sheet.getCellPipelineInfo(
+                    self.toolBar.row, self.toolBar.col)
+                if info:
+                    info = info[0]
+                    viewManager = builderWindow.viewManager
+                    view = viewManager.ensureVistrail(info['locator'])
+                    if view:
+                        controller = view.controller
+                        controller.change_selected_version(info['version'])
+                        self.setCamera(controller)
+                        
+                
+class QVTKViewWidgetToolBar(QCellToolBar):
+    """
+    QVTKViewWidgetToolBar derives from QCellToolBar to give the VTKViewCell
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(QVTKViewWidgetCapture(self))
+        self.addAnimationButtons()
+        self.appendAction(QVTKViewWidgetSaveCamera(self))
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    identifier = 'edu.utah.sci.vistrails.vtksnl'
+    registry = get_module_registry()
+    registry.add_module(VTKViewCell)
+    registry.add_input_port(VTKViewCell, "Location", CellLocation)
+    import core.debug
+    for (port,module) in [("SetRenderView",'vtkRenderView')]:
+        try:
+            registry.add_input_port(VTKViewCell, port,'(%s:%s)'%(identifier,module))
+ 
+        except Exception, e:
+            core.debug.warning(str(e))
+
+    registry.add_output_port(VTKViewCell, "self", VTKViewCell)
diff --git a/data/1n25.pdb b/data/1n25.pdb
new file mode 100644
index 0000000..c7b0213
--- /dev/null
+++ b/data/1n25.pdb
@@ -0,0 +1,6334 @@
+HEADER    VIRUS/VIRAL PROTEIN                     21-OCT-02   1N25              
+TITLE     CRYSTAL STRUCTURE OF THE SV40 LARGE T ANTIGEN HELICASE                
+TITLE    2 DOMAIN                                                               
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: LARGE T ANTIGEN;                                           
+COMPND   3 CHAIN: A, B;                                                         
+COMPND   4 FRAGMENT: HELICASE DOMAIN;                                           
+COMPND   5 ENGINEERED: YES                                                      
+SOURCE    MOL_ID: 1;                                                            
+SOURCE   2 ORGANISM_SCIENTIFIC: SIMIAN VIRUS 40;                                
+SOURCE   3 ORGANISM_COMMON: VIRUS;                                              
+SOURCE   4 EXPRESSION_SYSTEM: ESCHERICHIA COLI;                                 
+SOURCE   5 EXPRESSION_SYSTEM_COMMON: BACTERIA;                                  
+SOURCE   6 EXPRESSION_SYSTEM_STRAIN: XA90;                                      
+SOURCE   7 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID;                              
+SOURCE   8 EXPRESSION_SYSTEM_PLASMID: PGEX-2TK                                  
+KEYWDS    HELICASE DOMAIN                                                       
+EXPDTA    X-RAY DIFFRACTION                                                     
+AUTHOR    D.LI,R.ZHAO,W.LILYESTROM,D.GAI,R.ZHANG,J.A.DECAPRIO,                  
+AUTHOR   2 E.FANNING,A.JOCHIMIAK,G.SZAKONYI,X.S.CHEN                            
+REVDAT   1   03-JUN-03 1N25    0                                                
+JRNL        AUTH   D.LI,R.ZHAO,W.LILYESTROM,D.GAI,R.ZHANG,                      
+JRNL        AUTH 2 J.A.DECAPRIO,E.FANNING,A.JOCHIMIAK,G.SZAKONYI,               
+JRNL        AUTH 3 X.S.CHEN                                                     
+JRNL        TITL   STRUCTURE OF THE REPLICATIVE HELICASE OF THE                 
+JRNL        TITL 2 ONCOPROTEIN SV40 LARGE TUMOUR ANTIGEN                        
+JRNL        REF    NATURE                        V. 423   512 2003              
+JRNL        REFN   ASTM NATUAS  UK ISSN 0028-0836                               
+REMARK   1                                                                      
+REMARK   2                                                                      
+REMARK   2 RESOLUTION. 2.80 ANGSTROMS.                                          
+REMARK   3                                                                      
+REMARK   3 REFINEMENT.                                                          
+REMARK   3   PROGRAM     : CNS                                                  
+REMARK   3   AUTHORS     : BRUNGER,ADAMS,CLORE,DELANO,GROS,GROSSE-              
+REMARK   3               : KUNSTLEVE,JIANG,KUSZEWSKI,NILGES, PANNU,             
+REMARK   3               : READ,RICE,SIMONSON,WARREN                            
+REMARK   3                                                                      
+REMARK   3  REFINEMENT TARGET : ENGH & HUBER                                    
+REMARK   3                                                                      
+REMARK   3  DATA USED IN REFINEMENT.                                            
+REMARK   3   RESOLUTION RANGE HIGH (ANGSTROMS) : 2.80                           
+REMARK   3   RESOLUTION RANGE LOW  (ANGSTROMS) : 30.00                          
+REMARK   3   DATA CUTOFF            (SIGMA(F)) : 0.000                          
+REMARK   3   OUTLIER CUTOFF HIGH (RMS(ABS(F))) : NULL                           
+REMARK   3   COMPLETENESS (WORKING+TEST)   (%) : 96.3                           
+REMARK   3   NUMBER OF REFLECTIONS             : 26688                          
+REMARK   3                                                                      
+REMARK   3  FIT TO DATA USED IN REFINEMENT.                                     
+REMARK   3   CROSS-VALIDATION METHOD          : THROUGHOUT                      
+REMARK   3   FREE R VALUE TEST SET SELECTION  : RANDOM                          
+REMARK   3   R VALUE            (WORKING SET) : 0.243                           
+REMARK   3   FREE R VALUE                     : 0.276                           
+REMARK   3   FREE R VALUE TEST SET SIZE   (%) : 5.000                           
+REMARK   3   FREE R VALUE TEST SET COUNT      : 1333                            
+REMARK   3   ESTIMATED ERROR OF FREE R VALUE  : NULL                            
+REMARK   3                                                                      
+REMARK   3  FIT IN THE HIGHEST RESOLUTION BIN.                                  
+REMARK   3   TOTAL NUMBER OF BINS USED           : 26                           
+REMARK   3   BIN RESOLUTION RANGE HIGH       (A) : 2.80                         
+REMARK   3   BIN RESOLUTION RANGE LOW        (A) : 2.84                         
+REMARK   3   BIN COMPLETENESS (WORKING+TEST) (%) : NULL                         
+REMARK   3   REFLECTIONS IN BIN    (WORKING SET) : 921                          
+REMARK   3   BIN R VALUE           (WORKING SET) : 0.3670                       
+REMARK   3   BIN FREE R VALUE                    : 0.3920                       
+REMARK   3   BIN FREE R VALUE TEST SET SIZE  (%) : 5.00                         
+REMARK   3   BIN FREE R VALUE TEST SET COUNT     : 49                           
+REMARK   3   ESTIMATED ERROR OF BIN FREE R VALUE : NULL                         
+REMARK   3                                                                      
+REMARK   3  NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.                    
+REMARK   3   PROTEIN ATOMS            : 5806                                    
+REMARK   3   NUCLEIC ACID ATOMS       : 0                                       
+REMARK   3   HETEROGEN ATOMS          : 0                                       
+REMARK   3   SOLVENT ATOMS            : 0                                       
+REMARK   3                                                                      
+REMARK   3  B VALUES.                                                           
+REMARK   3   FROM WILSON PLOT           (A**2) : NULL                           
+REMARK   3   MEAN B VALUE      (OVERALL, A**2) : 30.79                          
+REMARK   3   OVERALL ANISOTROPIC B VALUE.                                       
+REMARK   3    B11 (A**2) : 13.86600                                             
+REMARK   3    B22 (A**2) : 13.86600                                             
+REMARK   3    B33 (A**2) : -27.73200                                            
+REMARK   3    B12 (A**2) : 3.91200                                              
+REMARK   3    B13 (A**2) : 0.00000                                              
+REMARK   3    B23 (A**2) : 0.00000                                              
+REMARK   3                                                                      
+REMARK   3  ESTIMATED COORDINATE ERROR.                                         
+REMARK   3   ESD FROM LUZZATI PLOT        (A) : 0.40                            
+REMARK   3   ESD FROM SIGMAA              (A) : 0.57                            
+REMARK   3   LOW RESOLUTION CUTOFF        (A) : 5.00                            
+REMARK   3                                                                      
+REMARK   3  CROSS-VALIDATED ESTIMATED COORDINATE ERROR.                         
+REMARK   3   ESD FROM C-V LUZZATI PLOT    (A) : 0.47                            
+REMARK   3   ESD FROM C-V SIGMAA          (A) : 0.62                            
+REMARK   3                                                                      
+REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES.                                   
+REMARK   3   BOND LENGTHS                 (A) : 0.009                           
+REMARK   3   BOND ANGLES            (DEGREES) : 1.37                            
+REMARK   3   DIHEDRAL ANGLES        (DEGREES) : 21.54                           
+REMARK   3   IMPROPER ANGLES        (DEGREES) : 0.80                            
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL MODEL : ANISOTROPIC                               
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL FACTOR RESTRAINTS.    RMS    SIGMA                
+REMARK   3   MAIN-CHAIN BOND              (A**2) : 2.953 ; NULL                 
+REMARK   3   MAIN-CHAIN ANGLE             (A**2) : 4.570 ; NULL                 
+REMARK   3   SIDE-CHAIN BOND              (A**2) : 4.926 ; NULL                 
+REMARK   3   SIDE-CHAIN ANGLE             (A**2) : 7.546 ; NULL                 
+REMARK   3                                                                      
+REMARK   3  BULK SOLVENT MODELING.                                              
+REMARK   3   METHOD USED : ANISOTROPIC                                          
+REMARK   3   KSOL        : 0.33                                                 
+REMARK   3   BSOL        : 30.79                                                
+REMARK   3                                                                      
+REMARK   3  NCS MODEL : NULL                                                    
+REMARK   3                                                                      
+REMARK   3  NCS RESTRAINTS.                         RMS   SIGMA/WEIGHT          
+REMARK   3   GROUP  1  POSITIONAL            (A) : NULL  ; NULL                 
+REMARK   3   GROUP  1  B-FACTOR           (A**2) : NULL  ; NULL                 
+REMARK   3                                                                      
+REMARK   3  PARAMETER FILE  1  : PROTEIN_REP.PARAM                              
+REMARK   3  PARAMETER FILE  2  : ION.PARAM                                      
+REMARK   3  PARAMETER FILE  3  : NULL                                           
+REMARK   3  TOPOLOGY FILE  1   : PROTEIN.TOP                                    
+REMARK   3  TOPOLOGY FILE  2   : ION.TOP                                        
+REMARK   3  TOPOLOGY FILE  3   : NULL                                           
+REMARK   3                                                                      
+REMARK   3  OTHER REFINEMENT REMARKS: NULL                                      
+REMARK   4                                                                      
+REMARK   4 1N25 COMPLIES WITH FORMAT V. 2.3, 09-JULY-1998                       
+REMARK 100                                                                      
+REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY RCSB ON 23-OCT-2002.                
+REMARK 100 THE RCSB ID CODE IS RCSB017424.                                      
+REMARK 200                                                                      
+REMARK 200 EXPERIMENTAL DETAILS                                                 
+REMARK 200  EXPERIMENT TYPE                : X-RAY DIFFRACTION                  
+REMARK 200  DATE OF DATA COLLECTION        : 20-JUN-2001                        
+REMARK 200  TEMPERATURE           (KELVIN) : 100.0                              
+REMARK 200  PH                             : 7.60                               
+REMARK 200  NUMBER OF CRYSTALS USED        : 1                                  
+REMARK 200                                                                      
+REMARK 200  SYNCHROTRON              (Y/N) : Y                                  
+REMARK 200  RADIATION SOURCE               : APS                                
+REMARK 200  BEAMLINE                       : 19ID                               
+REMARK 200  X-RAY GENERATOR MODEL          : NULL                               
+REMARK 200  MONOCHROMATIC OR LAUE    (M/L) : M                                  
+REMARK 200  WAVELENGTH OR RANGE        (A) : 1.074385                           
+REMARK 200  MONOCHROMATOR                  : SI 220                             
+REMARK 200  OPTICS                         : UNDULATOR A                        
+REMARK 200                                                                      
+REMARK 200  DETECTOR TYPE                  : CCD                                
+REMARK 200  DETECTOR MANUFACTURER          : SBC2 3K X 3K CCD BUILT BY ANL      
+REMARK 200                                   -ECT 210MM X 210MM ACTIVE AREA     
+REMARK 200                                   1.8 SEC READOUT                    
+REMARK 200  INTENSITY-INTEGRATION SOFTWARE : HKL-2000                           
+REMARK 200  DATA SCALING SOFTWARE          : TRUNCATE                           
+REMARK 200                                                                      
+REMARK 200  NUMBER OF UNIQUE REFLECTIONS   : 27610                              
+REMARK 200  RESOLUTION RANGE HIGH      (A) : 2.800                              
+REMARK 200  RESOLUTION RANGE LOW       (A) : 30.000                             
+REMARK 200  REJECTION CRITERIA  (SIGMA(I)) : -3.000                             
+REMARK 200                                                                      
+REMARK 200 OVERALL.                                                             
+REMARK 200  COMPLETENESS FOR RANGE     (%) : 98.4                               
+REMARK 200  DATA REDUNDANCY                : 6.200                              
+REMARK 200  R MERGE                    (I) : 0.12500                            
+REMARK 200  R SYM                      (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR THE DATA SET  : 16.5000                            
+REMARK 200                                                                      
+REMARK 200 IN THE HIGHEST RESOLUTION SHELL.                                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 2.80                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE LOW  (A) : 2.90                     
+REMARK 200  COMPLETENESS FOR SHELL     (%) : 99.2                               
+REMARK 200  DATA REDUNDANCY IN SHELL       : 5.40                               
+REMARK 200  R MERGE FOR SHELL          (I) : 0.54400                            
+REMARK 200  R SYM FOR SHELL            (I) : 0.54400                            
+REMARK 200  <I/SIGMA(I)> FOR SHELL         : 3.900                              
+REMARK 200                                                                      
+REMARK 200 DIFFRACTION PROTOCOL: SINGLE WAVELENGTH                              
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MAD                          
+REMARK 200 SOFTWARE USED: SOLVE                                                 
+REMARK 200 STARTING MODEL: NULL                                                 
+REMARK 200                                                                      
+REMARK 200 REMARK: NULL                                                         
+REMARK 280                                                                      
+REMARK 280 CRYSTAL                                                              
+REMARK 280 SOLVENT CONTENT, VS   (%): 64.0                                      
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 3.40                     
+REMARK 280                                                                      
+REMARK 280 CRYSTALLIZATION CONDITIONS: GLYCEROL, DTT, HEPES, NACL, ETOH,        
+REMARK 280  EDTA, PH 7.6, VAPOR DIFFUSION, HANGING DROP, TEMPERATURE 291K       
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY                                            
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 3 2 1                          
+REMARK 290                                                                      
+REMARK 290      SYMOP   SYMMETRY                                                
+REMARK 290     NNNMMM   OPERATOR                                                
+REMARK 290       1555   X,Y,Z                                                   
+REMARK 290       2555   -Y,X-Y,Z                                                
+REMARK 290       3555   -X+Y,-X,Z                                               
+REMARK 290       4555   Y,X,-Z                                                  
+REMARK 290       5555   X-Y,-Y,-Z                                               
+REMARK 290       6555   -X,-X+Y,-Z                                              
+REMARK 290                                                                      
+REMARK 290     WHERE NNN -> OPERATOR NUMBER                                     
+REMARK 290           MMM -> TRANSLATION VECTOR                                  
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS                            
+REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM             
+REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY                
+REMARK 290 RELATED MOLECULES.                                                   
+REMARK 290   SMTRY1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 290   SMTRY1   2 -0.500000 -0.866025  0.000000        0.00000            
+REMARK 290   SMTRY2   2  0.866025 -0.500000  0.000000        0.00000            
+REMARK 290   SMTRY3   2  0.000000  0.000000  1.000000        0.00000            
+REMARK 290   SMTRY1   3 -0.500000  0.866025  0.000000        0.00000            
+REMARK 290   SMTRY2   3 -0.866025 -0.500000  0.000000        0.00000            
+REMARK 290   SMTRY3   3  0.000000  0.000000  1.000000        0.00000            
+REMARK 290   SMTRY1   4 -0.500000  0.866025  0.000000        0.00000            
+REMARK 290   SMTRY2   4  0.866025  0.500000  0.000000        0.00000            
+REMARK 290   SMTRY3   4  0.000000  0.000000 -1.000000        0.00000            
+REMARK 290   SMTRY1   5  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   5  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   5  0.000000  0.000000 -1.000000        0.00000            
+REMARK 290   SMTRY1   6 -0.500000 -0.866025  0.000000        0.00000            
+REMARK 290   SMTRY2   6 -0.866025  0.500000  0.000000        0.00000            
+REMARK 290   SMTRY3   6  0.000000  0.000000 -1.000000        0.00000            
+REMARK 290                                                                      
+REMARK 290 REMARK: NULL                                                         
+REMARK 300                                                                      
+REMARK 300 BIOMOLECULE: 1                                                       
+REMARK 300 THIS ENTRY CONTAINS THE CRYSTALLOGRAPHIC ASYMMETRIC UNIT             
+REMARK 300 WHICH CONSISTS OF 2 CHAIN(S). SEE REMARK 350 FOR                     
+REMARK 300 INFORMATION ON GENERATING THE BIOLOGICAL MOLECULE(S).                
+REMARK 350                                                                      
+REMARK 350 GENERATING THE BIOMOLECULE                                           
+REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN           
+REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE                
+REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS          
+REMARK 350 GIVEN BELOW.  BOTH NON-CRYSTALLOGRAPHIC AND                          
+REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN.                               
+REMARK 350                                                                      
+REMARK 350 BIOMOLECULE: 1                                                       
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: A, B                                  
+REMARK 350   BIOMT1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 350   BIOMT2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 350   BIOMT3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 350   BIOMT1   2 -0.500000 -0.866025  0.000000      120.32100            
+REMARK 350   BIOMT2   2  0.866025 -0.500000  0.000000        0.00000            
+REMARK 350   BIOMT3   2  0.000000  0.000000  1.000000        0.00000            
+REMARK 350   BIOMT1   3 -0.500000  0.866025  0.000000       60.16050            
+REMARK 350   BIOMT2   3 -0.866025 -0.500000  0.000000      104.20104            
+REMARK 350   BIOMT3   3  0.000000  0.000000  1.000000        0.00000            
+REMARK 465                                                                      
+REMARK 465 MISSING RESIDUES                                                     
+REMARK 465 THE FOLLOWING RESIDUES WERE NOT LOCATED IN THE                       
+REMARK 465 EXPERIMENT. (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 465 IDENTIFIER; SSSEQ=SEQUENCE NUMBER; I=INSERTION CODE.)                
+REMARK 465                                                                      
+REMARK 465   M RES C SSSEQI                                                     
+REMARK 465     GLU A   260                                                      
+REMARK 465     GLU A   261                                                      
+REMARK 465     ALA A   262                                                      
+REMARK 465     GLU A   263                                                      
+REMARK 465     GLU A   264                                                      
+REMARK 465     THR A   265                                                      
+REMARK 465     GLU B   260                                                      
+REMARK 465     GLU B   261                                                      
+REMARK 465     ALA B   262                                                      
+REMARK 465     GLU B   263                                                      
+REMARK 465     GLU B   264                                                      
+REMARK 465     THR B   265                                                      
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND LENGTHS                                      
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,2(A3,1X,A1,I4,A1,1X,A4,3X),F6.3)                  
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES: ENGH AND HUBER, 1991                                
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   RES CSSEQI ATM2   DEVIATION                     
+REMARK 500    MET A 360   SD    MET A 360   CE     0.096                        
+REMARK 500    MET A 401   SD    MET A 401   CE    -0.092                        
+REMARK 500    MET A 528   SD    MET A 528   CE    -0.069                        
+REMARK 500    MET A 578   SD    MET A 578   CE    -0.195                        
+REMARK 500    MET A 615   CG    MET A 615   SD     0.074                        
+REMARK 500    MET A 615   SD    MET A 615   CE    -0.109                        
+REMARK 500    MET B 360   SD    MET B 360   CE    -0.073                        
+REMARK 500    MET B 388   SD    MET B 388   CE    -0.170                        
+REMARK 500    MET B 412   SD    MET B 412   CE    -0.057                        
+REMARK 500    CYS B 443   CB    CYS B 443   SG    -0.061                        
+REMARK 500    MET B 528   SD    MET B 528   CE    -0.095                        
+REMARK 500    MET B 578   SD    MET B 578   CE    -0.190                        
+REMARK 500    MET B 615   SD    MET B 615   CE    -0.104                        
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND ANGLES                                       
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1)              
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES: ENGH AND HUBER, 1991                                
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   ATM2   ATM3                                     
+REMARK 500    GLY A 480   N   -  CA  -  C   ANGL. DEV. = 16.4 DEGREES           
+REMARK 500    GLY A 503   N   -  CA  -  C   ANGL. DEV. =  8.3 DEGREES           
+REMARK 500    THR A 518   N   -  CA  -  C   ANGL. DEV. = -8.8 DEGREES           
+REMARK 500    ILE A 520   N   -  CA  -  C   ANGL. DEV. = -8.3 DEGREES           
+REMARK 500    MET A 528   CB  -  CG  -  SD  ANGL. DEV. = -8.6 DEGREES           
+REMARK 500    ILE A 623   N   -  CA  -  C   ANGL. DEV. =  9.4 DEGREES           
+REMARK 500    THR B 356   N   -  CA  -  C   ANGL. DEV. = -9.0 DEGREES           
+REMARK 500    ALA B 389   N   -  CA  -  C   ANGL. DEV. = -9.1 DEGREES           
+REMARK 500    GLY B 444   N   -  CA  -  C   ANGL. DEV. = -9.9 DEGREES           
+REMARK 500    ASN B 451   N   -  CA  -  C   ANGL. DEV. =-10.2 DEGREES           
+REMARK 500    ARG B 517   N   -  CA  -  C   ANGL. DEV. =  9.2 DEGREES           
+REMARK 500    THR B 518   N   -  CA  -  C   ANGL. DEV. =-11.1 DEGREES           
+REMARK 500    ILE B 520   N   -  CA  -  C   ANGL. DEV. = -9.5 DEGREES           
+REMARK 500    VAL B 526   N   -  CA  -  C   ANGL. DEV. = -8.9 DEGREES           
+REMARK 500    ASN B 529   N   -  CA  -  C   ANGL. DEV. =  9.5 DEGREES           
+REMARK 500    VAL B 625   N   -  CA  -  C   ANGL. DEV. =  9.3 DEGREES           
+DBREF  1N25 A  260   627  GB     335056   AAB59924       260    627             
+DBREF  1N25 B  260   627  GB     335056   AAB59924       260    627             
+SEQRES   1 A  368  GLU GLU ALA GLU GLU THR LYS GLN VAL SER TRP LYS LEU          
+SEQRES   2 A  368  VAL THR GLU TYR ALA MET GLU THR LYS CYS ASP ASP VAL          
+SEQRES   3 A  368  LEU LEU LEU LEU GLY MET TYR LEU GLU PHE GLN TYR SER          
+SEQRES   4 A  368  PHE GLU MET CYS LEU LYS CYS ILE LYS LYS GLU GLN PRO          
+SEQRES   5 A  368  SER HIS TYR LYS TYR HIS GLU LYS HIS TYR ALA ASN ALA          
+SEQRES   6 A  368  ALA ILE PHE ALA ASP SER LYS ASN GLN LYS THR ILE CYS          
+SEQRES   7 A  368  GLN GLN ALA VAL ASP THR VAL LEU ALA LYS LYS ARG VAL          
+SEQRES   8 A  368  ASP SER LEU GLN LEU THR ARG GLU GLN MET LEU THR ASN          
+SEQRES   9 A  368  ARG PHE ASN ASP LEU LEU ASP ARG MET ASP ILE MET PHE          
+SEQRES  10 A  368  GLY SER THR GLY SER ALA ASP ILE GLU GLU TRP MET ALA          
+SEQRES  11 A  368  GLY VAL ALA TRP LEU HIS CYS LEU LEU PRO LYS MET ASP          
+SEQRES  12 A  368  SER VAL VAL TYR ASP PHE LEU LYS CYS MET VAL TYR ASN          
+SEQRES  13 A  368  ILE PRO LYS LYS ARG TYR TRP LEU PHE LYS GLY PRO ILE          
+SEQRES  14 A  368  ASP SER GLY LYS THR THR LEU ALA ALA ALA LEU LEU GLU          
+SEQRES  15 A  368  LEU CYS GLY GLY LYS ALA LEU ASN VAL ASN LEU PRO LEU          
+SEQRES  16 A  368  ASP ARG LEU ASN PHE GLU LEU GLY VAL ALA ILE ASP GLN          
+SEQRES  17 A  368  PHE LEU VAL VAL PHE GLU ASP VAL LYS GLY THR GLY GLY          
+SEQRES  18 A  368  GLU SER ARG ASP LEU PRO SER GLY GLN GLY ILE ASN ASN          
+SEQRES  19 A  368  LEU ASP ASN LEU ARG ASP TYR LEU ASP GLY SER VAL LYS          
+SEQRES  20 A  368  VAL ASN LEU GLU LYS LYS HIS LEU ASN LYS ARG THR GLN          
+SEQRES  21 A  368  ILE PHE PRO PRO GLY ILE VAL THR MET ASN GLU TYR SER          
+SEQRES  22 A  368  VAL PRO LYS THR LEU GLN ALA ARG PHE VAL LYS GLN ILE          
+SEQRES  23 A  368  ASP PHE ARG PRO LYS ASP TYR LEU LYS HIS CYS LEU GLU          
+SEQRES  24 A  368  ARG SER GLU PHE LEU LEU GLU LYS ARG ILE ILE GLN SER          
+SEQRES  25 A  368  GLY ILE ALA LEU LEU LEU MET LEU ILE TRP TYR ARG PRO          
+SEQRES  26 A  368  VAL ALA GLU PHE ALA GLN SER ILE GLN SER ARG ILE VAL          
+SEQRES  27 A  368  GLU TRP LYS GLU ARG LEU ASP LYS GLU PHE SER LEU SER          
+SEQRES  28 A  368  VAL TYR GLN LYS MET LYS PHE ASN VAL ALA MET GLY ILE          
+SEQRES  29 A  368  GLY VAL LEU ASP                                              
+SEQRES   1 B  368  GLU GLU ALA GLU GLU THR LYS GLN VAL SER TRP LYS LEU          
+SEQRES   2 B  368  VAL THR GLU TYR ALA MET GLU THR LYS CYS ASP ASP VAL          
+SEQRES   3 B  368  LEU LEU LEU LEU GLY MET TYR LEU GLU PHE GLN TYR SER          
+SEQRES   4 B  368  PHE GLU MET CYS LEU LYS CYS ILE LYS LYS GLU GLN PRO          
+SEQRES   5 B  368  SER HIS TYR LYS TYR HIS GLU LYS HIS TYR ALA ASN ALA          
+SEQRES   6 B  368  ALA ILE PHE ALA ASP SER LYS ASN GLN LYS THR ILE CYS          
+SEQRES   7 B  368  GLN GLN ALA VAL ASP THR VAL LEU ALA LYS LYS ARG VAL          
+SEQRES   8 B  368  ASP SER LEU GLN LEU THR ARG GLU GLN MET LEU THR ASN          
+SEQRES   9 B  368  ARG PHE ASN ASP LEU LEU ASP ARG MET ASP ILE MET PHE          
+SEQRES  10 B  368  GLY SER THR GLY SER ALA ASP ILE GLU GLU TRP MET ALA          
+SEQRES  11 B  368  GLY VAL ALA TRP LEU HIS CYS LEU LEU PRO LYS MET ASP          
+SEQRES  12 B  368  SER VAL VAL TYR ASP PHE LEU LYS CYS MET VAL TYR ASN          
+SEQRES  13 B  368  ILE PRO LYS LYS ARG TYR TRP LEU PHE LYS GLY PRO ILE          
+SEQRES  14 B  368  ASP SER GLY LYS THR THR LEU ALA ALA ALA LEU LEU GLU          
+SEQRES  15 B  368  LEU CYS GLY GLY LYS ALA LEU ASN VAL ASN LEU PRO LEU          
+SEQRES  16 B  368  ASP ARG LEU ASN PHE GLU LEU GLY VAL ALA ILE ASP GLN          
+SEQRES  17 B  368  PHE LEU VAL VAL PHE GLU ASP VAL LYS GLY THR GLY GLY          
+SEQRES  18 B  368  GLU SER ARG ASP LEU PRO SER GLY GLN GLY ILE ASN ASN          
+SEQRES  19 B  368  LEU ASP ASN LEU ARG ASP TYR LEU ASP GLY SER VAL LYS          
+SEQRES  20 B  368  VAL ASN LEU GLU LYS LYS HIS LEU ASN LYS ARG THR GLN          
+SEQRES  21 B  368  ILE PHE PRO PRO GLY ILE VAL THR MET ASN GLU TYR SER          
+SEQRES  22 B  368  VAL PRO LYS THR LEU GLN ALA ARG PHE VAL LYS GLN ILE          
+SEQRES  23 B  368  ASP PHE ARG PRO LYS ASP TYR LEU LYS HIS CYS LEU GLU          
+SEQRES  24 B  368  ARG SER GLU PHE LEU LEU GLU LYS ARG ILE ILE GLN SER          
+SEQRES  25 B  368  GLY ILE ALA LEU LEU LEU MET LEU ILE TRP TYR ARG PRO          
+SEQRES  26 B  368  VAL ALA GLU PHE ALA GLN SER ILE GLN SER ARG ILE VAL          
+SEQRES  27 B  368  GLU TRP LYS GLU ARG LEU ASP LYS GLU PHE SER LEU SER          
+SEQRES  28 B  368  VAL TYR GLN LYS MET LYS PHE ASN VAL ALA MET GLY ILE          
+SEQRES  29 B  368  GLY VAL LEU ASP                                              
+HET     ZN  A 700       1                                                       
+HET     ZN  B 700       1                                                       
+HETNAM      ZN ZINC ION                                                         
+FORMUL   3   ZN    2(ZN1 2+)                                                    
+HELIX    1   1 SER A  269  LYS A  281  1                                  13    
+HELIX    2   2 ASP A  284  LEU A  293  1                                  10    
+HELIX    3   3 GLU A  294  TYR A  297  5                                   4    
+HELIX    4   4 CYS A  302  LYS A  307  1                                   6    
+HELIX    5   5 GLN A  310  LYS A  315  1                                   6    
+HELIX    6   6 TYR A  316  ALA A  328  1                                  13    
+HELIX    7   7 ASN A  332  LEU A  355  1                                  24    
+HELIX    8   8 THR A  356  PHE A  376  1                                  21    
+HELIX    9   9 ASP A  383  HIS A  395  1                                  13    
+HELIX   10  10 LYS A  400  ASN A  415  1                                  16    
+HELIX   11  11 GLY A  431  GLY A  444  1                                  14    
+HELIX   12  12 ARG A  456  GLY A  462  1                                   7    
+HELIX   13  13 VAL A  463  ILE A  465  5                                   3    
+HELIX   14  14 GLN A  489  ASP A  495  1                                   7    
+HELIX   15  15 LEU A  497  GLY A  503  1                                   7    
+HELIX   16  16 PRO A  534  ALA A  539  1                                   6    
+HELIX   17  17 LYS A  550  ARG A  559  1                                  10    
+HELIX   18  18 GLU A  561  LYS A  566  1                                   6    
+HELIX   19  19 SER A  571  ARG A  583  1                                  13    
+HELIX   20  20 PRO A  584  PHE A  588  5                                   5    
+HELIX   21  21 ALA A  589  LYS A  605  1                                  17    
+HELIX   22  22 SER A  608  MET A  621  1                                  14    
+HELIX   23  23 SER B  269  GLU B  279  1                                  11    
+HELIX   24  24 ASP B  284  LEU B  293  1                                  10    
+HELIX   25  25 GLU B  294  TYR B  297  5                                   4    
+HELIX   26  26 CYS B  302  LYS B  307  1                                   6    
+HELIX   27  27 GLN B  310  LYS B  315  1                                   6    
+HELIX   28  28 TYR B  316  ALA B  328  1                                  13    
+HELIX   29  29 ASN B  332  LEU B  355  1                                  24    
+HELIX   30  30 THR B  356  PHE B  376  1                                  21    
+HELIX   31  31 ASP B  383  LEU B  398  1                                  16    
+HELIX   32  32 LYS B  400  ASN B  415  1                                  16    
+HELIX   33  33 GLY B  431  GLY B  444  1                                  14    
+HELIX   34  34 ARG B  456  GLY B  462  1                                   7    
+HELIX   35  35 VAL B  463  ILE B  465  5                                   3    
+HELIX   36  36 GLN B  489  ASP B  495  1                                   7    
+HELIX   37  37 LEU B  497  ASP B  502  1                                   6    
+HELIX   38  38 PRO B  534  ALA B  539  1                                   6    
+HELIX   39  39 LYS B  550  SER B  560  1                                  11    
+HELIX   40  40 GLU B  561  LYS B  566  1                                   6    
+HELIX   41  41 SER B  571  ARG B  583  1                                  13    
+HELIX   42  42 PRO B  584  PHE B  588  5                                   5    
+HELIX   43  43 ALA B  589  PHE B  607  1                                  19    
+HELIX   44  44 SER B  608  GLY B  622  1                                  15    
+SHEET    1   A 5 GLY A 445  LEU A 448  0                                        
+SHEET    2   A 5 LEU A 469  VAL A 475  1  O  VAL A 471   N  LEU A 448           
+SHEET    3   A 5 GLY A 524  MET A 528  1  O  ILE A 525   N  PHE A 472           
+SHEET    4   A 5 TYR A 421  LYS A 425  1  N  PHE A 424   O  MET A 528           
+SHEET    5   A 5 LYS A 543  ASP A 546  1  O  ILE A 545   N  LEU A 423           
+SHEET    1   B 2 VAL A 507  LYS A 511  0                                        
+SHEET    2   B 2 LEU A 514  GLN A 519 -1  O  GLN A 519   N  VAL A 507           
+SHEET    1   C 5 LYS B 446  LEU B 448  0                                        
+SHEET    2   C 5 VAL B 470  VAL B 475  1  O  VAL B 471   N  LEU B 448           
+SHEET    3   C 5 GLY B 524  MET B 528  1  O  THR B 527   N  PHE B 472           
+SHEET    4   C 5 TYR B 421  LYS B 425  1  N  PHE B 424   O  VAL B 526           
+SHEET    5   C 5 LYS B 543  ASP B 546  1  O  ILE B 545   N  LEU B 423           
+SHEET    1   D 2 VAL B 507  LYS B 511  0                                        
+SHEET    2   D 2 LEU B 514  GLN B 519 -1  O  GLN B 519   N  VAL B 507           
+CRYST1  120.321  120.321  132.202  90.00  90.00 120.00 P 3 2 1      12          
+ORIGX1      1.000000  0.000000  0.000000        0.00000                         
+ORIGX2      0.000000  1.000000  0.000000        0.00000                         
+ORIGX3      0.000000  0.000000  1.000000        0.00000                         
+SCALE1      0.008311  0.004798  0.000000        0.00000                         
+SCALE2      0.000000  0.009596  0.000000        0.00000                         
+SCALE3      0.000000  0.000000  0.007564        0.00000                         
+ATOM      1  N   LYS A 266      44.458  43.722  -0.913  1.00 78.76           N  
+ATOM      2  CA  LYS A 266      45.695  44.058  -1.666  1.00 79.67           C  
+ATOM      3  C   LYS A 266      46.880  44.311  -0.754  1.00 83.17           C  
+ATOM      4  O   LYS A 266      47.722  43.438  -0.543  1.00 81.29           O  
+ATOM      5  CB  LYS A 266      45.465  45.286  -2.545  1.00 78.46           C  
+ATOM      6  CG  LYS A 266      45.019  44.931  -3.946  1.00 78.06           C  
+ATOM      7  CD  LYS A 266      46.037  44.013  -4.599  1.00 76.42           C  
+ATOM      8  CE  LYS A 266      45.609  43.599  -5.987  1.00 75.78           C  
+ATOM      9  NZ  LYS A 266      46.626  42.697  -6.594  1.00 77.33           N  
+ATOM     10  N   GLN A 267      46.954  45.520  -0.220  1.00 83.76           N  
+ATOM     11  CA  GLN A 267      48.046  45.864   0.670  1.00 82.59           C  
+ATOM     12  C   GLN A 267      47.527  46.868   1.687  1.00 77.07           C  
+ATOM     13  O   GLN A 267      47.300  48.035   1.367  1.00 70.67           O  
+ATOM     14  CB  GLN A 267      49.216  46.436  -0.142  1.00 92.78           C  
+ATOM     15  CG  GLN A 267      50.558  46.410   0.584  1.00112.09           C  
+ATOM     16  CD  GLN A 267      50.893  45.038   1.149  1.00120.64           C  
+ATOM     17  OE1 GLN A 267      51.357  44.925   2.285  1.00123.65           O  
+ATOM     18  NE2 GLN A 267      50.667  43.990   0.355  1.00123.10           N  
+ATOM     19  N   VAL A 268      47.311  46.392   2.908  1.00 65.08           N  
+ATOM     20  CA  VAL A 268      46.806  47.239   3.975  1.00 54.25           C  
+ATOM     21  C   VAL A 268      47.773  48.372   4.244  1.00 49.67           C  
+ATOM     22  O   VAL A 268      48.984  48.188   4.225  1.00 45.61           O  
+ATOM     23  CB  VAL A 268      46.609  46.441   5.283  1.00 51.93           C  
+ATOM     24  CG1 VAL A 268      45.932  47.311   6.332  1.00 50.50           C  
+ATOM     25  CG2 VAL A 268      45.783  45.197   5.007  1.00 53.61           C  
+ATOM     26  N   SER A 269      47.222  49.550   4.491  1.00 42.47           N  
+ATOM     27  CA  SER A 269      48.028  50.724   4.785  1.00 38.57           C  
+ATOM     28  C   SER A 269      48.313  50.842   6.279  1.00 37.02           C  
+ATOM     29  O   SER A 269      47.508  51.403   7.011  1.00 37.31           O  
+ATOM     30  CB  SER A 269      47.308  51.988   4.316  1.00 36.94           C  
+ATOM     31  OG  SER A 269      47.925  53.135   4.865  1.00 35.77           O  
+ATOM     32  N   TRP A 270      49.453  50.322   6.729  1.00 34.84           N  
+ATOM     33  CA  TRP A 270      49.826  50.394   8.142  1.00 34.47           C  
+ATOM     34  C   TRP A 270      49.854  51.843   8.626  1.00 36.89           C  
+ATOM     35  O   TRP A 270      49.569  52.133   9.787  1.00 35.43           O  
+ATOM     36  CB  TRP A 270      51.213  49.789   8.364  1.00 30.01           C  
+ATOM     37  CG  TRP A 270      51.305  48.330   8.150  1.00 25.31           C  
+ATOM     38  CD1 TRP A 270      50.766  47.631   7.132  1.00 22.40           C  
+ATOM     39  CD2 TRP A 270      52.034  47.385   8.948  1.00 24.93           C  
+ATOM     40  NE1 TRP A 270      51.106  46.301   7.231  1.00 23.28           N  
+ATOM     41  CE2 TRP A 270      51.884  46.123   8.343  1.00 22.30           C  
+ATOM     42  CE3 TRP A 270      52.800  47.485  10.122  1.00 24.62           C  
+ATOM     43  CZ2 TRP A 270      52.466  44.966   8.859  1.00 21.50           C  
+ATOM     44  CZ3 TRP A 270      53.386  46.324  10.642  1.00 22.83           C  
+ATOM     45  CH2 TRP A 270      53.210  45.084  10.008  1.00 21.47           C  
+ATOM     46  N   LYS A 271      50.199  52.749   7.717  1.00 40.89           N  
+ATOM     47  CA  LYS A 271      50.301  54.165   8.038  1.00 42.20           C  
+ATOM     48  C   LYS A 271      48.975  54.744   8.497  1.00 42.18           C  
+ATOM     49  O   LYS A 271      48.900  55.424   9.517  1.00 39.54           O  
+ATOM     50  CB  LYS A 271      50.813  54.932   6.821  1.00 45.61           C  
+ATOM     51  CG  LYS A 271      51.162  56.372   7.116  1.00 52.18           C  
+ATOM     52  CD  LYS A 271      51.635  57.082   5.873  1.00 55.28           C  
+ATOM     53  CE  LYS A 271      52.058  58.502   6.200  1.00 56.96           C  
+ATOM     54  NZ  LYS A 271      52.538  59.205   4.983  1.00 58.32           N  
+ATOM     55  N   LEU A 272      47.927  54.474   7.734  1.00 41.75           N  
+ATOM     56  CA  LEU A 272      46.607  54.968   8.079  1.00 41.77           C  
+ATOM     57  C   LEU A 272      46.188  54.484   9.455  1.00 40.55           C  
+ATOM     58  O   LEU A 272      45.714  55.266  10.274  1.00 41.22           O  
+ATOM     59  CB  LEU A 272      45.573  54.511   7.056  1.00 45.58           C  
+ATOM     60  CG  LEU A 272      45.159  55.560   6.032  1.00 49.61           C  
+ATOM     61  CD1 LEU A 272      44.056  54.975   5.176  1.00 53.46           C  
+ATOM     62  CD2 LEU A 272      44.671  56.826   6.739  1.00 51.91           C  
+ATOM     63  N   VAL A 273      46.350  53.191   9.709  1.00 38.10           N  
+ATOM     64  CA  VAL A 273      45.985  52.642  11.006  1.00 35.48           C  
+ATOM     65  C   VAL A 273      46.730  53.378  12.126  1.00 35.01           C  
+ATOM     66  O   VAL A 273      46.175  53.638  13.201  1.00 33.73           O  
+ATOM     67  CB  VAL A 273      46.292  51.135  11.061  1.00 32.73           C  
+ATOM     68  CG1 VAL A 273      46.020  50.599  12.452  1.00 27.49           C  
+ATOM     69  CG2 VAL A 273      45.438  50.410  10.025  1.00 30.52           C  
+ATOM     70  N   THR A 274      47.986  53.726  11.862  1.00 35.07           N  
+ATOM     71  CA  THR A 274      48.785  54.440  12.840  1.00 37.62           C  
+ATOM     72  C   THR A 274      48.232  55.844  13.028  1.00 43.27           C  
+ATOM     73  O   THR A 274      48.231  56.374  14.141  1.00 39.74           O  
+ATOM     74  CB  THR A 274      50.252  54.544  12.407  1.00 34.96           C  
+ATOM     75  OG1 THR A 274      50.851  53.245  12.441  1.00 35.24           O  
+ATOM     76  CG2 THR A 274      51.017  55.469  13.339  1.00 33.38           C  
+ATOM     77  N   GLU A 275      47.766  56.445  11.936  1.00 49.90           N  
+ATOM     78  CA  GLU A 275      47.214  57.792  11.990  1.00 52.53           C  
+ATOM     79  C   GLU A 275      45.987  57.804  12.883  1.00 48.41           C  
+ATOM     80  O   GLU A 275      45.806  58.698  13.707  1.00 43.54           O  
+ATOM     81  CB  GLU A 275      46.840  58.272  10.591  1.00 65.86           C  
+ATOM     82  CG  GLU A 275      46.164  59.624  10.593  1.00 93.06           C  
+ATOM     83  CD  GLU A 275      45.756  60.068   9.215  1.00104.71           C  
+ATOM     84  OE1 GLU A 275      45.841  59.243   8.279  1.00108.70           O  
+ATOM     85  OE2 GLU A 275      45.343  61.238   9.074  1.00109.07           O  
+ATOM     86  N   TYR A 276      45.140  56.801  12.715  1.00 40.92           N  
+ATOM     87  CA  TYR A 276      43.940  56.691  13.525  1.00 33.40           C  
+ATOM     88  C   TYR A 276      44.363  56.535  14.988  1.00 30.54           C  
+ATOM     89  O   TYR A 276      43.845  57.220  15.869  1.00 27.65           O  
+ATOM     90  CB  TYR A 276      43.114  55.490  13.068  1.00 33.41           C  
+ATOM     91  CG  TYR A 276      41.929  55.197  13.950  1.00 36.52           C  
+ATOM     92  CD1 TYR A 276      40.893  56.122  14.096  1.00 37.24           C  
+ATOM     93  CD2 TYR A 276      41.856  53.999  14.671  1.00 37.54           C  
+ATOM     94  CE1 TYR A 276      39.816  55.863  14.939  1.00 37.19           C  
+ATOM     95  CE2 TYR A 276      40.790  53.732  15.512  1.00 37.31           C  
+ATOM     96  CZ  TYR A 276      39.772  54.665  15.645  1.00 37.89           C  
+ATOM     97  OH  TYR A 276      38.714  54.392  16.492  1.00 40.18           O  
+ATOM     98  N   ALA A 277      45.318  55.644  15.240  1.00 28.42           N  
+ATOM     99  CA  ALA A 277      45.806  55.429  16.597  1.00 27.30           C  
+ATOM    100  C   ALA A 277      46.291  56.743  17.236  1.00 27.20           C  
+ATOM    101  O   ALA A 277      45.897  57.082  18.354  1.00 26.98           O  
+ATOM    102  CB  ALA A 277      46.938  54.382  16.588  1.00 23.86           C  
+ATOM    103  N   MET A 278      47.149  57.476  16.533  1.00 30.99           N  
+ATOM    104  CA  MET A 278      47.666  58.740  17.049  1.00 35.54           C  
+ATOM    105  C   MET A 278      46.589  59.808  17.213  1.00 39.94           C  
+ATOM    106  O   MET A 278      46.722  60.694  18.057  1.00 39.37           O  
+ATOM    107  CB  MET A 278      48.772  59.262  16.141  1.00 35.32           C  
+ATOM    108  CG  MET A 278      50.084  58.515  16.318  1.00 37.07           C  
+ATOM    109  SD  MET A 278      51.308  59.375  17.330  1.00 36.64           S  
+ATOM    110  CE  MET A 278      50.257  60.467  18.334  1.00 34.84           C  
+ATOM    111  N   GLU A 279      45.527  59.718  16.410  1.00 45.14           N  
+ATOM    112  CA  GLU A 279      44.408  60.666  16.458  1.00 47.29           C  
+ATOM    113  C   GLU A 279      43.443  60.328  17.617  1.00 48.11           C  
+ATOM    114  O   GLU A 279      42.838  61.207  18.241  1.00 41.82           O  
+ATOM    115  CB  GLU A 279      43.661  60.641  15.114  1.00 54.04           C  
+ATOM    116  CG  GLU A 279      43.583  61.989  14.410  1.00 69.60           C  
+ATOM    117  CD  GLU A 279      43.865  61.889  12.919  1.00 77.60           C  
+ATOM    118  OE1 GLU A 279      43.135  61.158  12.214  1.00 80.48           O  
+ATOM    119  OE2 GLU A 279      44.821  62.543  12.446  1.00 80.21           O  
+ATOM    120  N   THR A 280      43.313  59.037  17.900  1.00 48.69           N  
+ATOM    121  CA  THR A 280      42.449  58.548  18.963  1.00 44.94           C  
+ATOM    122  C   THR A 280      43.267  58.525  20.257  1.00 44.45           C  
+ATOM    123  O   THR A 280      42.723  58.373  21.356  1.00 42.62           O  
+ATOM    124  CB  THR A 280      41.969  57.116  18.625  1.00 47.20           C  
+ATOM    125  OG1 THR A 280      41.123  57.162  17.473  1.00 52.10           O  
+ATOM    126  CG2 THR A 280      41.207  56.501  19.782  1.00 54.38           C  
+ATOM    127  N   LYS A 281      44.581  58.675  20.110  1.00 47.63           N  
+ATOM    128  CA  LYS A 281      45.490  58.656  21.249  1.00 49.19           C  
+ATOM    129  C   LYS A 281      45.463  57.267  21.876  1.00 48.67           C  
+ATOM    130  O   LYS A 281      45.724  57.099  23.068  1.00 54.24           O  
+ATOM    131  CB  LYS A 281      45.060  59.701  22.279  1.00 49.36           C  
+ATOM    132  CG  LYS A 281      45.353  61.144  21.890  1.00 47.49           C  
+ATOM    133  CD  LYS A 281      44.762  62.105  22.922  1.00 46.90           C  
+ATOM    134  CE  LYS A 281      45.391  63.496  22.846  1.00 46.08           C  
+ATOM    135  NZ  LYS A 281      46.778  63.540  23.393  1.00 44.64           N  
+ATOM    136  N   CYS A 282      45.168  56.268  21.055  1.00 48.98           N  
+ATOM    137  CA  CYS A 282      45.064  54.905  21.533  1.00 49.25           C  
+ATOM    138  C   CYS A 282      46.374  54.167  21.774  1.00 49.91           C  
+ATOM    139  O   CYS A 282      47.074  53.804  20.835  1.00 51.42           O  
+ATOM    140  CB  CYS A 282      44.213  54.101  20.573  1.00 46.97           C  
+ATOM    141  SG  CYS A 282      43.966  52.455  21.201  1.00 40.88           S  
+ATOM    142  N   ASP A 283      46.681  53.920  23.043  1.00 47.36           N  
+ATOM    143  CA  ASP A 283      47.907  53.225  23.421  1.00 44.65           C  
+ATOM    144  C   ASP A 283      47.664  51.759  23.774  1.00 43.93           C  
+ATOM    145  O   ASP A 283      48.568  51.074  24.255  1.00 39.51           O  
+ATOM    146  CB  ASP A 283      48.576  53.937  24.606  1.00 44.58           C  
+ATOM    147  CG  ASP A 283      47.640  54.114  25.787  1.00 46.75           C  
+ATOM    148  OD1 ASP A 283      47.110  53.103  26.297  1.00 48.30           O  
+ATOM    149  OD2 ASP A 283      47.430  55.269  26.211  1.00 49.39           O  
+ATOM    150  N   ASP A 284      46.444  51.281  23.538  1.00 40.95           N  
+ATOM    151  CA  ASP A 284      46.081  49.888  23.825  1.00 40.00           C  
+ATOM    152  C   ASP A 284      45.963  49.101  22.515  1.00 38.39           C  
+ATOM    153  O   ASP A 284      45.175  49.464  21.636  1.00 36.59           O  
+ATOM    154  CB  ASP A 284      44.746  49.840  24.571  1.00 45.90           C  
+ATOM    155  CG  ASP A 284      44.389  48.442  25.049  1.00 54.16           C  
+ATOM    156  OD1 ASP A 284      44.402  47.491  24.236  1.00 57.69           O  
+ATOM    157  OD2 ASP A 284      44.084  48.298  26.248  1.00 58.14           O  
+ATOM    158  N   VAL A 285      46.726  48.020  22.380  1.00 34.05           N  
+ATOM    159  CA  VAL A 285      46.675  47.250  21.146  1.00 29.65           C  
+ATOM    160  C   VAL A 285      45.341  46.555  20.888  1.00 29.63           C  
+ATOM    161  O   VAL A 285      44.776  46.674  19.802  1.00 29.84           O  
+ATOM    162  CB  VAL A 285      47.777  46.201  21.084  1.00 27.34           C  
+ATOM    163  CG1 VAL A 285      47.800  45.592  19.702  1.00 27.94           C  
+ATOM    164  CG2 VAL A 285      49.116  46.834  21.384  1.00 28.25           C  
+ATOM    165  N   LEU A 286      44.832  45.819  21.869  1.00 30.50           N  
+ATOM    166  CA  LEU A 286      43.556  45.141  21.678  1.00 31.23           C  
+ATOM    167  C   LEU A 286      42.409  46.133  21.489  1.00 31.47           C  
+ATOM    168  O   LEU A 286      41.468  45.877  20.743  1.00 33.17           O  
+ATOM    169  CB  LEU A 286      43.261  44.206  22.853  1.00 29.32           C  
+ATOM    170  CG  LEU A 286      43.987  42.858  22.807  1.00 27.27           C  
+ATOM    171  CD1 LEU A 286      43.789  42.142  24.118  1.00 27.98           C  
+ATOM    172  CD2 LEU A 286      43.466  42.005  21.657  1.00 26.33           C  
+ATOM    173  N   LEU A 287      42.492  47.277  22.151  1.00 32.01           N  
+ATOM    174  CA  LEU A 287      41.447  48.279  22.018  1.00 30.98           C  
+ATOM    175  C   LEU A 287      41.486  48.882  20.623  1.00 29.38           C  
+ATOM    176  O   LEU A 287      40.457  49.173  20.043  1.00 28.73           O  
+ATOM    177  CB  LEU A 287      41.618  49.379  23.065  1.00 31.75           C  
+ATOM    178  CG  LEU A 287      40.501  50.417  23.035  1.00 31.98           C  
+ATOM    179  CD1 LEU A 287      39.167  49.733  23.319  1.00 33.54           C  
+ATOM    180  CD2 LEU A 287      40.776  51.500  24.054  1.00 32.79           C  
+ATOM    181  N   LEU A 288      42.681  49.062  20.078  1.00 26.92           N  
+ATOM    182  CA  LEU A 288      42.805  49.619  18.738  1.00 25.93           C  
+ATOM    183  C   LEU A 288      42.277  48.635  17.712  1.00 27.61           C  
+ATOM    184  O   LEU A 288      41.464  48.988  16.856  1.00 27.45           O  
+ATOM    185  CB  LEU A 288      44.261  49.937  18.411  1.00 23.92           C  
+ATOM    186  CG  LEU A 288      44.527  50.272  16.936  1.00 21.52           C  
+ATOM    187  CD1 LEU A 288      43.758  51.499  16.492  1.00 20.19           C  
+ATOM    188  CD2 LEU A 288      46.007  50.510  16.770  1.00 23.14           C  
+ATOM    189  N   LEU A 289      42.751  47.396  17.804  1.00 29.02           N  
+ATOM    190  CA  LEU A 289      42.341  46.342  16.886  1.00 29.78           C  
+ATOM    191  C   LEU A 289      40.827  46.264  16.785  1.00 30.56           C  
+ATOM    192  O   LEU A 289      40.258  46.381  15.697  1.00 29.97           O  
+ATOM    193  CB  LEU A 289      42.877  44.995  17.365  1.00 30.20           C  
+ATOM    194  CG  LEU A 289      42.445  43.786  16.539  1.00 32.47           C  
+ATOM    195  CD1 LEU A 289      43.221  43.753  15.238  1.00 33.31           C  
+ATOM    196  CD2 LEU A 289      42.692  42.516  17.333  1.00 32.60           C  
+ATOM    197  N   GLY A 290      40.186  46.061  17.935  1.00 31.54           N  
+ATOM    198  CA  GLY A 290      38.748  45.949  17.977  1.00 31.64           C  
+ATOM    199  C   GLY A 290      38.024  47.142  17.390  1.00 33.25           C  
+ATOM    200  O   GLY A 290      36.953  47.002  16.804  1.00 33.35           O  
+ATOM    201  N   MET A 291      38.590  48.331  17.534  1.00 33.56           N  
+ATOM    202  CA  MET A 291      37.919  49.510  17.007  1.00 32.79           C  
+ATOM    203  C   MET A 291      38.125  49.676  15.515  1.00 32.18           C  
+ATOM    204  O   MET A 291      37.185  49.993  14.782  1.00 29.93           O  
+ATOM    205  CB  MET A 291      38.371  50.764  17.755  1.00 34.17           C  
+ATOM    206  CG  MET A 291      37.883  50.791  19.186  1.00 40.00           C  
+ATOM    207  SD  MET A 291      38.213  52.345  20.021  1.00 47.45           S  
+ATOM    208  CE  MET A 291      36.613  53.084  19.764  1.00 46.12           C  
+ATOM    209  N   TYR A 292      39.339  49.440  15.045  1.00 31.64           N  
+ATOM    210  CA  TYR A 292      39.569  49.597  13.625  1.00 30.61           C  
+ATOM    211  C   TYR A 292      38.693  48.640  12.840  1.00 30.33           C  
+ATOM    212  O   TYR A 292      38.165  49.004  11.791  1.00 32.95           O  
+ATOM    213  CB  TYR A 292      41.029  49.350  13.271  1.00 30.70           C  
+ATOM    214  CG  TYR A 292      41.460  50.144  12.075  1.00 31.55           C  
+ATOM    215  CD1 TYR A 292      41.531  51.535  12.137  1.00 30.37           C  
+ATOM    216  CD2 TYR A 292      41.764  49.512  10.867  1.00 31.91           C  
+ATOM    217  CE1 TYR A 292      41.898  52.283  11.017  1.00 31.27           C  
+ATOM    218  CE2 TYR A 292      42.128  50.245   9.742  1.00 31.93           C  
+ATOM    219  CZ  TYR A 292      42.194  51.626   9.825  1.00 31.36           C  
+ATOM    220  OH  TYR A 292      42.574  52.346   8.725  1.00 31.38           O  
+ATOM    221  N   LEU A 293      38.533  47.422  13.356  1.00 31.72           N  
+ATOM    222  CA  LEU A 293      37.725  46.398  12.703  1.00 32.56           C  
+ATOM    223  C   LEU A 293      36.244  46.754  12.582  1.00 33.99           C  
+ATOM    224  O   LEU A 293      35.511  46.123  11.816  1.00 34.48           O  
+ATOM    225  CB  LEU A 293      37.873  45.066  13.437  1.00 30.72           C  
+ATOM    226  CG  LEU A 293      39.182  44.300  13.219  1.00 28.22           C  
+ATOM    227  CD1 LEU A 293      39.293  43.225  14.283  1.00 26.90           C  
+ATOM    228  CD2 LEU A 293      39.235  43.705  11.807  1.00 25.91           C  
+ATOM    229  N   GLU A 294      35.791  47.751  13.331  1.00 36.51           N  
+ATOM    230  CA  GLU A 294      34.396  48.146  13.226  1.00 37.48           C  
+ATOM    231  C   GLU A 294      34.181  48.882  11.909  1.00 36.98           C  
+ATOM    232  O   GLU A 294      33.093  48.838  11.337  1.00 37.79           O  
+ATOM    233  CB  GLU A 294      33.999  49.053  14.382  1.00 38.80           C  
+ATOM    234  CG  GLU A 294      34.133  48.398  15.726  1.00 42.71           C  
+ATOM    235  CD  GLU A 294      33.342  49.111  16.798  1.00 44.92           C  
+ATOM    236  OE1 GLU A 294      33.487  50.349  16.935  1.00 46.13           O  
+ATOM    237  OE2 GLU A 294      32.575  48.425  17.509  1.00 47.02           O  
+ATOM    238  N   PHE A 295      35.235  49.547  11.437  1.00 36.80           N  
+ATOM    239  CA  PHE A 295      35.203  50.308  10.192  1.00 36.65           C  
+ATOM    240  C   PHE A 295      35.100  49.447   8.920  1.00 38.06           C  
+ATOM    241  O   PHE A 295      34.784  49.962   7.852  1.00 41.09           O  
+ATOM    242  CB  PHE A 295      36.458  51.190  10.064  1.00 34.45           C  
+ATOM    243  CG  PHE A 295      36.716  52.103  11.237  1.00 28.80           C  
+ATOM    244  CD1 PHE A 295      35.676  52.604  12.006  1.00 26.98           C  
+ATOM    245  CD2 PHE A 295      38.013  52.517  11.527  1.00 27.49           C  
+ATOM    246  CE1 PHE A 295      35.934  53.511  13.046  1.00 25.92           C  
+ATOM    247  CE2 PHE A 295      38.267  53.424  12.567  1.00 25.37           C  
+ATOM    248  CZ  PHE A 295      37.233  53.916  13.318  1.00 22.99           C  
+ATOM    249  N   GLN A 296      35.372  48.151   9.026  1.00 41.46           N  
+ATOM    250  CA  GLN A 296      35.325  47.246   7.872  1.00 43.34           C  
+ATOM    251  C   GLN A 296      33.955  47.119   7.193  1.00 45.29           C  
+ATOM    252  O   GLN A 296      33.822  46.470   6.148  1.00 46.84           O  
+ATOM    253  CB  GLN A 296      35.752  45.847   8.290  1.00 40.41           C  
+ATOM    254  CG  GLN A 296      34.576  44.965   8.702  1.00 35.59           C  
+ATOM    255  CD  GLN A 296      35.033  43.677   9.319  1.00 35.21           C  
+ATOM    256  OE1 GLN A 296      35.316  43.621  10.511  1.00 35.54           O  
+ATOM    257  NE2 GLN A 296      35.132  42.632   8.508  1.00 36.66           N  
+ATOM    258  N   TYR A 297      32.931  47.699   7.799  1.00 49.42           N  
+ATOM    259  CA  TYR A 297      31.597  47.622   7.230  1.00 54.13           C  
+ATOM    260  C   TYR A 297      31.305  48.903   6.475  1.00 57.45           C  
+ATOM    261  O   TYR A 297      31.844  49.957   6.808  1.00 57.90           O  
+ATOM    262  CB  TYR A 297      30.584  47.432   8.342  1.00 55.85           C  
+ATOM    263  CG  TYR A 297      30.882  46.234   9.196  1.00 56.79           C  
+ATOM    264  CD1 TYR A 297      30.788  44.943   8.678  1.00 56.08           C  
+ATOM    265  CD2 TYR A 297      31.254  46.387  10.528  1.00 56.58           C  
+ATOM    266  CE1 TYR A 297      31.051  43.838   9.474  1.00 55.80           C  
+ATOM    267  CE2 TYR A 297      31.521  45.290  11.329  1.00 55.64           C  
+ATOM    268  CZ  TYR A 297      31.418  44.022  10.802  1.00 55.36           C  
+ATOM    269  OH  TYR A 297      31.668  42.942  11.614  1.00 56.00           O  
+ATOM    270  N   SER A 298      30.459  48.819   5.456  1.00 60.51           N  
+ATOM    271  CA  SER A 298      30.141  50.008   4.684  1.00 60.31           C  
+ATOM    272  C   SER A 298      29.560  51.029   5.643  1.00 62.98           C  
+ATOM    273  O   SER A 298      28.634  50.732   6.412  1.00 53.59           O  
+ATOM    274  CB  SER A 298      29.128  49.707   3.575  1.00 60.41           C  
+ATOM    275  OG  SER A 298      27.801  49.832   4.051  1.00 68.55           O  
+ATOM    276  N   PHE A 299      30.135  52.226   5.605  1.00 70.43           N  
+ATOM    277  CA  PHE A 299      29.692  53.320   6.447  1.00 75.17           C  
+ATOM    278  C   PHE A 299      28.403  53.835   5.820  1.00 76.91           C  
+ATOM    279  O   PHE A 299      27.603  54.516   6.464  1.00 78.45           O  
+ATOM    280  CB  PHE A 299      30.774  54.402   6.479  1.00 80.94           C  
+ATOM    281  CG  PHE A 299      30.373  55.689   5.831  1.00 93.15           C  
+ATOM    282  CD1 PHE A 299      29.946  56.762   6.603  1.00 98.29           C  
+ATOM    283  CD2 PHE A 299      30.407  55.827   4.449  1.00 98.25           C  
+ATOM    284  CE1 PHE A 299      29.558  57.960   6.007  1.00100.97           C  
+ATOM    285  CE2 PHE A 299      30.021  57.020   3.838  1.00100.52           C  
+ATOM    286  CZ  PHE A 299      29.595  58.090   4.617  1.00101.11           C  
+ATOM    287  N   GLU A 300      28.209  53.477   4.554  1.00 85.28           N  
+ATOM    288  CA  GLU A 300      27.027  53.877   3.804  1.00 93.02           C  
+ATOM    289  C   GLU A 300      25.768  53.306   4.451  1.00 98.29           C  
+ATOM    290  O   GLU A 300      24.737  53.182   3.796  1.00100.57           O  
+ATOM    291  CB  GLU A 300      27.095  53.364   2.362  1.00 96.63           C  
+ATOM    292  CG  GLU A 300      28.484  53.174   1.782  1.00 99.09           C  
+ATOM    293  CD  GLU A 300      28.436  52.797   0.309  1.00100.18           C  
+ATOM    294  OE1 GLU A 300      27.623  51.919  -0.059  1.00100.10           O  
+ATOM    295  OE2 GLU A 300      29.213  53.376  -0.481  1.00100.08           O  
+ATOM    296  N   MET A 301      25.850  52.945   5.726  1.00105.50           N  
+ATOM    297  CA  MET A 301      24.699  52.380   6.418  1.00104.07           C  
+ATOM    298  C   MET A 301      24.951  52.309   7.925  1.00 96.31           C  
+ATOM    299  O   MET A 301      24.012  52.192   8.712  1.00 97.43           O  
+ATOM    300  CB  MET A 301      24.406  50.977   5.861  1.00109.33           C  
+ATOM    301  CG  MET A 301      22.926  50.599   5.789  1.00122.12           C  
+ATOM    302  SD  MET A 301      22.079  51.080   4.247  1.00128.75           S  
+ATOM    303  CE  MET A 301      21.741  49.459   3.509  1.00130.64           C  
+ATOM    304  N   CYS A 302      26.224  52.382   8.314  1.00 84.94           N  
+ATOM    305  CA  CYS A 302      26.635  52.322   9.725  1.00 81.73           C  
+ATOM    306  C   CYS A 302      25.698  53.097  10.649  1.00 82.88           C  
+ATOM    307  O   CYS A 302      25.638  54.327  10.591  1.00 85.64           O  
+ATOM    308  CB  CYS A 302      28.080  52.850   9.881  1.00 75.87           C  
+ATOM    309  SG  CYS A 302      28.610  53.402  11.543  1.00 58.95           S  
+ATOM    310  N   LEU A 303      24.964  52.372  11.493  1.00 79.96           N  
+ATOM    311  CA  LEU A 303      24.052  53.006  12.437  1.00 74.47           C  
+ATOM    312  C   LEU A 303      24.825  53.665  13.568  1.00 72.34           C  
+ATOM    313  O   LEU A 303      24.363  54.649  14.147  1.00 61.98           O  
+ATOM    314  CB  LEU A 303      23.064  51.989  13.020  1.00 76.93           C  
+ATOM    315  CG  LEU A 303      21.716  51.852  12.303  1.00 83.85           C  
+ATOM    316  CD1 LEU A 303      20.805  50.926  13.092  1.00 88.23           C  
+ATOM    317  CD2 LEU A 303      21.064  53.227  12.161  1.00 88.93           C  
+ATOM    318  N   LYS A 304      26.003  53.117  13.873  1.00 65.87           N  
+ATOM    319  CA  LYS A 304      26.866  53.647  14.927  1.00 62.29           C  
+ATOM    320  C   LYS A 304      27.254  55.074  14.585  1.00 59.80           C  
+ATOM    321  O   LYS A 304      27.462  55.909  15.464  1.00 57.26           O  
+ATOM    322  CB  LYS A 304      28.125  52.788  15.063  1.00 68.05           C  
+ATOM    323  CG  LYS A 304      27.831  51.352  15.445  1.00 80.77           C  
+ATOM    324  CD  LYS A 304      29.060  50.586  15.904  1.00 85.84           C  
+ATOM    325  CE  LYS A 304      28.649  49.195  16.371  1.00 88.26           C  
+ATOM    326  NZ  LYS A 304      29.799  48.349  16.773  1.00 89.31           N  
+ATOM    327  N   CYS A 305      27.335  55.334  13.287  1.00 59.51           N  
+ATOM    328  CA  CYS A 305      27.683  56.640  12.746  1.00 57.56           C  
+ATOM    329  C   CYS A 305      26.429  57.495  12.663  1.00 56.90           C  
+ATOM    330  O   CYS A 305      26.410  58.621  13.151  1.00 62.03           O  
+ATOM    331  CB  CYS A 305      28.263  56.473  11.347  1.00 52.85           C  
+ATOM    332  SG  CYS A 305      29.564  55.208  11.239  1.00 52.95           S  
+ATOM    333  N   ILE A 306      25.388  56.951  12.032  1.00 60.49           N  
+ATOM    334  CA  ILE A 306      24.121  57.664  11.888  1.00 70.12           C  
+ATOM    335  C   ILE A 306      23.653  58.114  13.265  1.00 73.00           C  
+ATOM    336  O   ILE A 306      23.259  59.269  13.455  1.00 74.36           O  
+ATOM    337  CB  ILE A 306      23.011  56.773  11.251  1.00 68.00           C  
+ATOM    338  CG1 ILE A 306      23.422  56.330   9.846  1.00 65.88           C  
+ATOM    339  CG2 ILE A 306      21.705  57.557  11.166  1.00 67.57           C  
+ATOM    340  CD1 ILE A 306      22.407  55.432   9.170  1.00 62.53           C  
+ATOM    341  N   LYS A 307      23.704  57.199  14.229  1.00 76.09           N  
+ATOM    342  CA  LYS A 307      23.287  57.526  15.583  1.00 72.32           C  
+ATOM    343  C   LYS A 307      24.365  58.239  16.403  1.00 67.09           C  
+ATOM    344  O   LYS A 307      24.117  58.620  17.542  1.00 60.11           O  
+ATOM    345  CB  LYS A 307      22.801  56.269  16.313  1.00 76.95           C  
+ATOM    346  CG  LYS A 307      21.450  55.771  15.811  1.00 92.17           C  
+ATOM    347  CD  LYS A 307      20.821  54.741  16.741  1.00100.72           C  
+ATOM    348  CE  LYS A 307      19.438  54.327  16.236  1.00104.46           C  
+ATOM    349  NZ  LYS A 307      18.753  53.346  17.129  1.00105.22           N  
+ATOM    350  N   LYS A 308      25.550  58.427  15.823  1.00 59.56           N  
+ATOM    351  CA  LYS A 308      26.651  59.119  16.501  1.00 58.92           C  
+ATOM    352  C   LYS A 308      26.902  58.586  17.923  1.00 64.36           C  
+ATOM    353  O   LYS A 308      26.993  59.360  18.881  1.00 61.71           O  
+ATOM    354  CB  LYS A 308      26.348  60.624  16.561  1.00 55.07           C  
+ATOM    355  CG  LYS A 308      26.189  61.303  15.201  1.00 52.50           C  
+ATOM    356  CD  LYS A 308      27.542  61.670  14.586  1.00 51.89           C  
+ATOM    357  CE  LYS A 308      27.411  62.323  13.198  1.00 50.22           C  
+ATOM    358  NZ  LYS A 308      28.708  62.882  12.700  1.00 49.81           N  
+ATOM    359  N   GLU A 309      27.036  57.265  18.039  1.00 71.33           N  
+ATOM    360  CA  GLU A 309      27.241  56.577  19.316  1.00 72.64           C  
+ATOM    361  C   GLU A 309      28.564  56.869  20.017  1.00 67.99           C  
+ATOM    362  O   GLU A 309      28.587  57.165  21.214  1.00 61.21           O  
+ATOM    363  CB  GLU A 309      27.126  55.066  19.110  1.00 84.01           C  
+ATOM    364  CG  GLU A 309      25.987  54.641  18.201  1.00109.26           C  
+ATOM    365  CD  GLU A 309      25.892  53.134  18.065  1.00120.47           C  
+ATOM    366  OE1 GLU A 309      26.947  52.495  17.862  1.00124.79           O  
+ATOM    367  OE2 GLU A 309      24.768  52.591  18.154  1.00124.00           O  
+ATOM    368  N   GLN A 310      29.663  56.759  19.272  1.00 60.61           N  
+ATOM    369  CA  GLN A 310      31.002  56.992  19.813  1.00 53.51           C  
+ATOM    370  C   GLN A 310      31.822  57.844  18.856  1.00 50.70           C  
+ATOM    371  O   GLN A 310      32.034  57.471  17.700  1.00 50.89           O  
+ATOM    372  CB  GLN A 310      31.723  55.663  20.030  1.00 53.87           C  
+ATOM    373  CG  GLN A 310      31.165  54.801  21.149  1.00 54.31           C  
+ATOM    374  CD  GLN A 310      31.465  55.355  22.526  1.00 52.49           C  
+ATOM    375  OE1 GLN A 310      32.597  55.734  22.820  1.00 52.36           O  
+ATOM    376  NE2 GLN A 310      30.453  55.388  23.384  1.00 53.03           N  
+ATOM    377  N   PRO A 311      32.310  58.997  19.335  1.00 45.68           N  
+ATOM    378  CA  PRO A 311      33.110  59.911  18.513  1.00 46.38           C  
+ATOM    379  C   PRO A 311      34.350  59.235  17.944  1.00 47.63           C  
+ATOM    380  O   PRO A 311      34.780  59.549  16.832  1.00 45.34           O  
+ATOM    381  CB  PRO A 311      33.450  61.040  19.481  1.00 44.83           C  
+ATOM    382  CG  PRO A 311      32.301  61.010  20.452  1.00 44.16           C  
+ATOM    383  CD  PRO A 311      32.122  59.540  20.689  1.00 45.84           C  
+ATOM    384  N   SER A 312      34.921  58.309  18.713  1.00 48.85           N  
+ATOM    385  CA  SER A 312      36.114  57.572  18.285  1.00 48.81           C  
+ATOM    386  C   SER A 312      35.786  56.714  17.057  1.00 47.29           C  
+ATOM    387  O   SER A 312      36.670  56.198  16.372  1.00 44.34           O  
+ATOM    388  CB  SER A 312      36.612  56.676  19.422  1.00 51.14           C  
+ATOM    389  OG  SER A 312      35.594  55.780  19.841  1.00 59.07           O  
+ATOM    390  N   HIS A 313      34.498  56.580  16.783  1.00 45.05           N  
+ATOM    391  CA  HIS A 313      34.056  55.793  15.655  1.00 43.34           C  
+ATOM    392  C   HIS A 313      33.432  56.636  14.544  1.00 43.10           C  
+ATOM    393  O   HIS A 313      33.909  56.636  13.402  1.00 42.21           O  
+ATOM    394  CB  HIS A 313      33.041  54.757  16.127  1.00 42.86           C  
+ATOM    395  CG  HIS A 313      32.443  53.951  15.016  1.00 43.56           C  
+ATOM    396  ND1 HIS A 313      33.117  52.920  14.396  1.00 43.88           N  
+ATOM    397  CD2 HIS A 313      31.235  54.029  14.406  1.00 43.46           C  
+ATOM    398  CE1 HIS A 313      32.349  52.396  13.454  1.00 43.76           C  
+ATOM    399  NE2 HIS A 313      31.203  53.055  13.445  1.00 43.67           N  
+ATOM    400  N   TYR A 314      32.374  57.364  14.881  1.00 43.28           N  
+ATOM    401  CA  TYR A 314      31.668  58.153  13.884  1.00 44.30           C  
+ATOM    402  C   TYR A 314      32.403  59.332  13.240  1.00 45.53           C  
+ATOM    403  O   TYR A 314      31.806  60.065  12.455  1.00 44.80           O  
+ATOM    404  CB  TYR A 314      30.324  58.614  14.455  1.00 43.58           C  
+ATOM    405  CG  TYR A 314      30.396  59.740  15.462  1.00 44.86           C  
+ATOM    406  CD1 TYR A 314      30.866  61.003  15.096  1.00 44.37           C  
+ATOM    407  CD2 TYR A 314      29.939  59.562  16.767  1.00 45.29           C  
+ATOM    408  CE1 TYR A 314      30.876  62.056  15.997  1.00 45.24           C  
+ATOM    409  CE2 TYR A 314      29.947  60.615  17.682  1.00 45.95           C  
+ATOM    410  CZ  TYR A 314      30.416  61.857  17.286  1.00 45.59           C  
+ATOM    411  OH  TYR A 314      30.419  62.905  18.174  1.00 45.85           O  
+ATOM    412  N   LYS A 315      33.682  59.517  13.566  1.00 46.71           N  
+ATOM    413  CA  LYS A 315      34.472  60.606  12.989  1.00 47.03           C  
+ATOM    414  C   LYS A 315      35.580  60.032  12.116  1.00 46.55           C  
+ATOM    415  O   LYS A 315      36.360  60.777  11.526  1.00 46.18           O  
+ATOM    416  CB  LYS A 315      35.120  61.464  14.081  1.00 48.16           C  
+ATOM    417  CG  LYS A 315      34.153  62.153  15.023  1.00 53.01           C  
+ATOM    418  CD  LYS A 315      34.889  62.929  16.130  1.00 55.42           C  
+ATOM    419  CE  LYS A 315      35.460  64.261  15.647  1.00 56.95           C  
+ATOM    420  NZ  LYS A 315      36.411  64.130  14.503  1.00 58.49           N  
+ATOM    421  N   TYR A 316      35.658  58.708  12.036  1.00 45.41           N  
+ATOM    422  CA  TYR A 316      36.703  58.088  11.242  1.00 43.87           C  
+ATOM    423  C   TYR A 316      36.234  56.940  10.369  1.00 43.53           C  
+ATOM    424  O   TYR A 316      36.970  56.498   9.482  1.00 42.95           O  
+ATOM    425  CB  TYR A 316      37.830  57.597  12.156  1.00 44.35           C  
+ATOM    426  CG  TYR A 316      38.382  58.654  13.092  1.00 46.19           C  
+ATOM    427  CD1 TYR A 316      37.716  58.989  14.274  1.00 47.17           C  
+ATOM    428  CD2 TYR A 316      39.559  59.337  12.784  1.00 46.48           C  
+ATOM    429  CE1 TYR A 316      38.215  59.986  15.130  1.00 46.53           C  
+ATOM    430  CE2 TYR A 316      40.064  60.330  13.623  1.00 46.53           C  
+ATOM    431  CZ  TYR A 316      39.389  60.652  14.793  1.00 47.19           C  
+ATOM    432  OH  TYR A 316      39.876  61.647  15.614  1.00 48.47           O  
+ATOM    433  N   HIS A 317      35.019  56.451  10.604  1.00 42.74           N  
+ATOM    434  CA  HIS A 317      34.520  55.329   9.809  1.00 42.88           C  
+ATOM    435  C   HIS A 317      34.611  55.606   8.312  1.00 48.40           C  
+ATOM    436  O   HIS A 317      35.125  54.784   7.551  1.00 44.88           O  
+ATOM    437  CB  HIS A 317      33.074  54.977  10.181  1.00 38.29           C  
+ATOM    438  CG  HIS A 317      32.600  53.685   9.579  1.00 35.44           C  
+ATOM    439  ND1 HIS A 317      31.340  53.174   9.798  1.00 34.68           N  
+ATOM    440  CD2 HIS A 317      33.235  52.783   8.794  1.00 34.44           C  
+ATOM    441  CE1 HIS A 317      31.219  52.010   9.180  1.00 34.29           C  
+ATOM    442  NE2 HIS A 317      32.358  51.752   8.563  1.00 34.04           N  
+ATOM    443  N   GLU A 318      34.115  56.768   7.903  1.00 57.52           N  
+ATOM    444  CA  GLU A 318      34.138  57.173   6.503  1.00 64.21           C  
+ATOM    445  C   GLU A 318      35.550  57.019   5.942  1.00 62.43           C  
+ATOM    446  O   GLU A 318      35.825  56.147   5.119  1.00 61.63           O  
+ATOM    447  CB  GLU A 318      33.703  58.636   6.381  1.00 77.63           C  
+ATOM    448  CG  GLU A 318      32.624  58.916   5.339  1.00100.73           C  
+ATOM    449  CD  GLU A 318      33.055  58.603   3.918  1.00110.50           C  
+ATOM    450  OE1 GLU A 318      32.296  58.938   2.982  1.00113.70           O  
+ATOM    451  OE2 GLU A 318      34.146  58.025   3.736  1.00114.14           O  
+ATOM    452  N   LYS A 319      36.447  57.871   6.417  1.00 58.22           N  
+ATOM    453  CA  LYS A 319      37.830  57.876   5.973  1.00 52.13           C  
+ATOM    454  C   LYS A 319      38.534  56.524   5.992  1.00 49.19           C  
+ATOM    455  O   LYS A 319      39.405  56.259   5.161  1.00 49.24           O  
+ATOM    456  CB  LYS A 319      38.628  58.869   6.818  1.00 48.75           C  
+ATOM    457  CG  LYS A 319      40.097  58.916   6.477  1.00 46.93           C  
+ATOM    458  CD  LYS A 319      40.779  60.000   7.269  1.00 47.21           C  
+ATOM    459  CE  LYS A 319      42.255  60.120   6.913  1.00 47.29           C  
+ATOM    460  NZ  LYS A 319      42.854  61.352   7.538  1.00 48.50           N  
+ATOM    461  N   HIS A 320      38.155  55.660   6.922  1.00 45.92           N  
+ATOM    462  CA  HIS A 320      38.827  54.376   7.026  1.00 45.26           C  
+ATOM    463  C   HIS A 320      38.138  53.140   6.465  1.00 46.44           C  
+ATOM    464  O   HIS A 320      38.730  52.057   6.482  1.00 45.28           O  
+ATOM    465  CB  HIS A 320      39.231  54.145   8.488  1.00 41.42           C  
+ATOM    466  CG  HIS A 320      40.308  55.076   8.960  1.00 37.00           C  
+ATOM    467  ND1 HIS A 320      41.643  54.876   8.675  1.00 34.20           N  
+ATOM    468  CD2 HIS A 320      40.243  56.242   9.645  1.00 35.15           C  
+ATOM    469  CE1 HIS A 320      42.352  55.878   9.164  1.00 32.77           C  
+ATOM    470  NE2 HIS A 320      41.526  56.722   9.758  1.00 31.78           N  
+ATOM    471  N   TYR A 321      36.911  53.280   5.966  1.00 47.30           N  
+ATOM    472  CA  TYR A 321      36.218  52.120   5.411  1.00 48.38           C  
+ATOM    473  C   TYR A 321      37.184  51.351   4.506  1.00 48.38           C  
+ATOM    474  O   TYR A 321      37.630  50.254   4.842  1.00 46.70           O  
+ATOM    475  CB  TYR A 321      34.991  52.537   4.594  1.00 51.57           C  
+ATOM    476  CG  TYR A 321      34.400  51.387   3.813  1.00 55.99           C  
+ATOM    477  CD1 TYR A 321      33.702  50.371   4.460  1.00 59.02           C  
+ATOM    478  CD2 TYR A 321      34.613  51.266   2.441  1.00 58.52           C  
+ATOM    479  CE1 TYR A 321      33.227  49.252   3.761  1.00 60.96           C  
+ATOM    480  CE2 TYR A 321      34.145  50.153   1.728  1.00 61.16           C  
+ATOM    481  CZ  TYR A 321      33.456  49.145   2.397  1.00 61.32           C  
+ATOM    482  OH  TYR A 321      33.009  48.029   1.712  1.00 60.75           O  
+ATOM    483  N   ALA A 322      37.508  51.954   3.366  1.00 47.79           N  
+ATOM    484  CA  ALA A 322      38.410  51.370   2.380  1.00 46.61           C  
+ATOM    485  C   ALA A 322      39.545  50.558   2.990  1.00 45.04           C  
+ATOM    486  O   ALA A 322      39.636  49.346   2.787  1.00 46.87           O  
+ATOM    487  CB  ALA A 322      38.994  52.474   1.503  1.00 46.20           C  
+ATOM    488  N   ASN A 323      40.410  51.234   3.738  1.00 42.98           N  
+ATOM    489  CA  ASN A 323      41.559  50.586   4.353  1.00 41.24           C  
+ATOM    490  C   ASN A 323      41.213  49.568   5.435  1.00 40.49           C  
+ATOM    491  O   ASN A 323      41.909  48.564   5.589  1.00 41.21           O  
+ATOM    492  CB  ASN A 323      42.495  51.633   4.927  1.00 39.68           C  
+ATOM    493  CG  ASN A 323      43.783  51.039   5.405  1.00 38.56           C  
+ATOM    494  OD1 ASN A 323      44.498  50.398   4.636  1.00 38.32           O  
+ATOM    495  ND2 ASN A 323      44.097  51.243   6.683  1.00 39.64           N  
+ATOM    496  N   ALA A 324      40.146  49.826   6.187  1.00 37.41           N  
+ATOM    497  CA  ALA A 324      39.724  48.907   7.236  1.00 34.71           C  
+ATOM    498  C   ALA A 324      39.162  47.641   6.596  1.00 33.63           C  
+ATOM    499  O   ALA A 324      39.267  46.543   7.143  1.00 34.06           O  
+ATOM    500  CB  ALA A 324      38.673  49.566   8.107  1.00 30.16           C  
+ATOM    501  N   ALA A 325      38.554  47.809   5.430  1.00 34.53           N  
+ATOM    502  CA  ALA A 325      37.987  46.692   4.697  1.00 36.08           C  
+ATOM    503  C   ALA A 325      39.129  45.790   4.241  1.00 38.91           C  
+ATOM    504  O   ALA A 325      38.994  44.566   4.216  1.00 42.96           O  
+ATOM    505  CB  ALA A 325      37.207  47.205   3.511  1.00 34.45           C  
+ATOM    506  N   ILE A 326      40.255  46.399   3.879  1.00 40.72           N  
+ATOM    507  CA  ILE A 326      41.429  45.644   3.457  1.00 41.75           C  
+ATOM    508  C   ILE A 326      42.094  45.062   4.713  1.00 41.19           C  
+ATOM    509  O   ILE A 326      42.686  43.981   4.679  1.00 42.06           O  
+ATOM    510  CB  ILE A 326      42.454  46.556   2.729  1.00 42.84           C  
+ATOM    511  CG1 ILE A 326      41.782  47.277   1.557  1.00 41.51           C  
+ATOM    512  CG2 ILE A 326      43.642  45.729   2.246  1.00 41.67           C  
+ATOM    513  CD1 ILE A 326      42.688  48.245   0.842  1.00 40.40           C  
+ATOM    514  N   PHE A 327      41.976  45.795   5.816  1.00 40.10           N  
+ATOM    515  CA  PHE A 327      42.547  45.399   7.099  1.00 39.71           C  
+ATOM    516  C   PHE A 327      41.958  44.094   7.586  1.00 40.75           C  
+ATOM    517  O   PHE A 327      42.683  43.187   7.968  1.00 43.11           O  
+ATOM    518  CB  PHE A 327      42.272  46.472   8.155  1.00 36.64           C  
+ATOM    519  CG  PHE A 327      42.877  46.171   9.500  1.00 30.03           C  
+ATOM    520  CD1 PHE A 327      44.242  46.336   9.715  1.00 28.79           C  
+ATOM    521  CD2 PHE A 327      42.083  45.726  10.552  1.00 27.98           C  
+ATOM    522  CE1 PHE A 327      44.805  46.066  10.950  1.00 26.48           C  
+ATOM    523  CE2 PHE A 327      42.641  45.451  11.795  1.00 26.00           C  
+ATOM    524  CZ  PHE A 327      43.999  45.622  11.994  1.00 26.17           C  
+ATOM    525  N   ALA A 328      40.636  44.006   7.578  1.00 42.18           N  
+ATOM    526  CA  ALA A 328      39.960  42.811   8.050  1.00 44.94           C  
+ATOM    527  C   ALA A 328      40.358  41.549   7.282  1.00 48.29           C  
+ATOM    528  O   ALA A 328      40.020  40.430   7.690  1.00 46.06           O  
+ATOM    529  CB  ALA A 328      38.456  43.016   7.985  1.00 45.34           C  
+ATOM    530  N   ASP A 329      41.078  41.721   6.177  1.00 50.33           N  
+ATOM    531  CA  ASP A 329      41.506  40.578   5.377  1.00 51.25           C  
+ATOM    532  C   ASP A 329      43.013  40.358   5.433  1.00 49.93           C  
+ATOM    533  O   ASP A 329      43.569  39.564   4.678  1.00 45.64           O  
+ATOM    534  CB  ASP A 329      41.045  40.748   3.926  1.00 59.61           C  
+ATOM    535  CG  ASP A 329      39.785  39.946   3.615  1.00 72.08           C  
+ATOM    536  OD1 ASP A 329      39.877  38.697   3.544  1.00 77.68           O  
+ATOM    537  OD2 ASP A 329      38.705  40.562   3.450  1.00 77.97           O  
+ATOM    538  N   SER A 330      43.666  41.064   6.345  1.00 47.77           N  
+ATOM    539  CA  SER A 330      45.107  40.946   6.528  1.00 44.94           C  
+ATOM    540  C   SER A 330      45.404  39.716   7.387  1.00 43.21           C  
+ATOM    541  O   SER A 330      44.584  39.323   8.220  1.00 40.84           O  
+ATOM    542  CB  SER A 330      45.642  42.211   7.213  1.00 45.37           C  
+ATOM    543  OG  SER A 330      46.993  42.062   7.615  1.00 50.61           O  
+ATOM    544  N   LYS A 331      46.568  39.108   7.185  1.00 41.02           N  
+ATOM    545  CA  LYS A 331      46.937  37.930   7.968  1.00 40.17           C  
+ATOM    546  C   LYS A 331      47.723  38.244   9.247  1.00 42.07           C  
+ATOM    547  O   LYS A 331      48.207  37.341   9.921  1.00 38.53           O  
+ATOM    548  CB  LYS A 331      47.732  36.951   7.109  1.00 40.02           C  
+ATOM    549  CG  LYS A 331      46.881  36.142   6.168  1.00 43.49           C  
+ATOM    550  CD  LYS A 331      47.739  35.208   5.343  1.00 45.95           C  
+ATOM    551  CE  LYS A 331      46.885  34.262   4.506  1.00 46.76           C  
+ATOM    552  NZ  LYS A 331      47.689  33.086   4.048  1.00 47.56           N  
+ATOM    553  N   ASN A 332      47.862  39.518   9.583  1.00 43.52           N  
+ATOM    554  CA  ASN A 332      48.569  39.872  10.805  1.00 43.47           C  
+ATOM    555  C   ASN A 332      48.178  41.266  11.270  1.00 41.12           C  
+ATOM    556  O   ASN A 332      48.985  42.202  11.311  1.00 34.12           O  
+ATOM    557  CB  ASN A 332      50.088  39.741  10.620  1.00 54.19           C  
+ATOM    558  CG  ASN A 332      50.629  40.618   9.516  1.00 68.01           C  
+ATOM    559  OD1 ASN A 332      49.877  41.168   8.713  1.00 76.57           O  
+ATOM    560  ND2 ASN A 332      51.949  40.744   9.463  1.00 76.04           N  
+ATOM    561  N   GLN A 333      46.909  41.378  11.640  1.00 37.13           N  
+ATOM    562  CA  GLN A 333      46.363  42.631  12.101  1.00 33.91           C  
+ATOM    563  C   GLN A 333      47.002  43.088  13.410  1.00 33.58           C  
+ATOM    564  O   GLN A 333      47.311  44.264  13.570  1.00 32.33           O  
+ATOM    565  CB  GLN A 333      44.846  42.509  12.250  1.00 34.87           C  
+ATOM    566  CG  GLN A 333      44.284  41.192  11.761  1.00 39.93           C  
+ATOM    567  CD  GLN A 333      42.791  41.242  11.500  1.00 41.95           C  
+ATOM    568  OE1 GLN A 333      42.345  41.857  10.536  1.00 42.03           O  
+ATOM    569  NE2 GLN A 333      42.010  40.594  12.362  1.00 43.19           N  
+ATOM    570  N   LYS A 334      47.228  42.171  14.340  1.00 33.54           N  
+ATOM    571  CA  LYS A 334      47.828  42.563  15.611  1.00 33.56           C  
+ATOM    572  C   LYS A 334      49.231  43.169  15.474  1.00 34.00           C  
+ATOM    573  O   LYS A 334      49.596  44.083  16.217  1.00 29.56           O  
+ATOM    574  CB  LYS A 334      47.861  41.375  16.577  1.00 37.38           C  
+ATOM    575  CG  LYS A 334      48.520  41.705  17.901  1.00 46.32           C  
+ATOM    576  CD  LYS A 334      47.933  40.908  19.047  1.00 50.87           C  
+ATOM    577  CE  LYS A 334      48.485  41.407  20.375  1.00 53.82           C  
+ATOM    578  NZ  LYS A 334      47.702  40.919  21.543  1.00 54.15           N  
+ATOM    579  N   THR A 335      50.016  42.666  14.529  1.00 34.10           N  
+ATOM    580  CA  THR A 335      51.365  43.180  14.315  1.00 31.59           C  
+ATOM    581  C   THR A 335      51.245  44.617  13.833  1.00 29.52           C  
+ATOM    582  O   THR A 335      52.041  45.465  14.191  1.00 28.13           O  
+ATOM    583  CB  THR A 335      52.118  42.364  13.245  1.00 36.79           C  
+ATOM    584  OG1 THR A 335      52.143  40.974  13.610  1.00 45.65           O  
+ATOM    585  CG2 THR A 335      53.535  42.866  13.111  1.00 42.57           C  
+ATOM    586  N   ILE A 336      50.242  44.885  13.009  1.00 27.64           N  
+ATOM    587  CA  ILE A 336      50.024  46.227  12.494  1.00 26.82           C  
+ATOM    588  C   ILE A 336      49.666  47.150  13.660  1.00 28.06           C  
+ATOM    589  O   ILE A 336      50.250  48.220  13.830  1.00 27.95           O  
+ATOM    590  CB  ILE A 336      48.873  46.238  11.442  1.00 26.63           C  
+ATOM    591  CG1 ILE A 336      49.273  45.404  10.214  1.00 24.66           C  
+ATOM    592  CG2 ILE A 336      48.531  47.664  11.040  1.00 23.93           C  
+ATOM    593  CD1 ILE A 336      48.174  45.293   9.163  1.00 22.99           C  
+ATOM    594  N   CYS A 337      48.714  46.724  14.478  1.00 30.43           N  
+ATOM    595  CA  CYS A 337      48.298  47.528  15.619  1.00 32.29           C  
+ATOM    596  C   CYS A 337      49.440  47.751  16.597  1.00 33.23           C  
+ATOM    597  O   CYS A 337      49.527  48.795  17.228  1.00 31.18           O  
+ATOM    598  CB  CYS A 337      47.117  46.863  16.323  1.00 33.35           C  
+ATOM    599  SG  CYS A 337      45.599  46.894  15.317  1.00 39.71           S  
+ATOM    600  N   GLN A 338      50.318  46.769  16.722  1.00 35.00           N  
+ATOM    601  CA  GLN A 338      51.451  46.902  17.619  1.00 36.01           C  
+ATOM    602  C   GLN A 338      52.274  48.118  17.236  1.00 34.74           C  
+ATOM    603  O   GLN A 338      52.705  48.881  18.103  1.00 34.53           O  
+ATOM    604  CB  GLN A 338      52.344  45.664  17.561  1.00 41.23           C  
+ATOM    605  CG  GLN A 338      52.077  44.651  18.648  1.00 51.41           C  
+ATOM    606  CD  GLN A 338      52.005  45.291  20.012  1.00 55.66           C  
+ATOM    607  OE1 GLN A 338      52.589  46.355  20.245  1.00 56.13           O  
+ATOM    608  NE2 GLN A 338      51.295  44.643  20.931  1.00 56.98           N  
+ATOM    609  N   GLN A 339      52.490  48.300  15.938  1.00 32.27           N  
+ATOM    610  CA  GLN A 339      53.269  49.426  15.475  1.00 31.10           C  
+ATOM    611  C   GLN A 339      52.498  50.729  15.636  1.00 30.96           C  
+ATOM    612  O   GLN A 339      53.090  51.771  15.917  1.00 32.90           O  
+ATOM    613  CB  GLN A 339      53.674  49.242  14.016  1.00 31.15           C  
+ATOM    614  CG  GLN A 339      54.781  50.217  13.576  1.00 32.06           C  
+ATOM    615  CD  GLN A 339      55.455  49.797  12.286  1.00 32.50           C  
+ATOM    616  OE1 GLN A 339      55.110  50.280  11.212  1.00 31.82           O  
+ATOM    617  NE2 GLN A 339      56.416  48.880  12.389  1.00 31.42           N  
+ATOM    618  N   ALA A 340      51.182  50.679  15.457  1.00 31.54           N  
+ATOM    619  CA  ALA A 340      50.365  51.876  15.616  1.00 31.34           C  
+ATOM    620  C   ALA A 340      50.524  52.369  17.051  1.00 31.80           C  
+ATOM    621  O   ALA A 340      50.727  53.567  17.304  1.00 33.84           O  
+ATOM    622  CB  ALA A 340      48.900  51.559  15.337  1.00 32.52           C  
+ATOM    623  N   VAL A 341      50.445  51.421  17.981  1.00 29.88           N  
+ATOM    624  CA  VAL A 341      50.555  51.702  19.406  1.00 28.77           C  
+ATOM    625  C   VAL A 341      51.956  52.149  19.799  1.00 32.27           C  
+ATOM    626  O   VAL A 341      52.129  53.163  20.476  1.00 28.35           O  
+ATOM    627  CB  VAL A 341      50.152  50.450  20.213  1.00 25.53           C  
+ATOM    628  CG1 VAL A 341      50.529  50.588  21.690  1.00 22.64           C  
+ATOM    629  CG2 VAL A 341      48.665  50.242  20.075  1.00 22.06           C  
+ATOM    630  N   ASP A 342      52.959  51.394  19.370  1.00 36.29           N  
+ATOM    631  CA  ASP A 342      54.328  51.744  19.694  1.00 39.02           C  
+ATOM    632  C   ASP A 342      54.586  53.180  19.248  1.00 36.87           C  
+ATOM    633  O   ASP A 342      55.376  53.901  19.856  1.00 35.16           O  
+ATOM    634  CB  ASP A 342      55.304  50.792  19.003  1.00 49.20           C  
+ATOM    635  CG  ASP A 342      55.270  49.396  19.592  1.00 63.23           C  
+ATOM    636  OD1 ASP A 342      55.057  49.278  20.818  1.00 70.17           O  
+ATOM    637  OD2 ASP A 342      55.471  48.417  18.838  1.00 70.02           O  
+ATOM    638  N   THR A 343      53.908  53.596  18.186  1.00 32.36           N  
+ATOM    639  CA  THR A 343      54.071  54.943  17.679  1.00 27.32           C  
+ATOM    640  C   THR A 343      53.436  55.933  18.641  1.00 27.11           C  
+ATOM    641  O   THR A 343      53.964  57.024  18.870  1.00 26.54           O  
+ATOM    642  CB  THR A 343      53.410  55.118  16.309  1.00 23.74           C  
+ATOM    643  OG1 THR A 343      54.093  54.316  15.338  1.00 20.28           O  
+ATOM    644  CG2 THR A 343      53.480  56.577  15.886  1.00 23.32           C  
+ATOM    645  N   VAL A 344      52.290  55.560  19.195  1.00 26.83           N  
+ATOM    646  CA  VAL A 344      51.615  56.439  20.128  1.00 27.04           C  
+ATOM    647  C   VAL A 344      52.476  56.612  21.374  1.00 26.22           C  
+ATOM    648  O   VAL A 344      52.557  57.703  21.940  1.00 27.14           O  
+ATOM    649  CB  VAL A 344      50.229  55.876  20.509  1.00 28.17           C  
+ATOM    650  CG1 VAL A 344      49.637  56.666  21.661  1.00 27.35           C  
+ATOM    651  CG2 VAL A 344      49.316  55.934  19.309  1.00 28.15           C  
+ATOM    652  N   LEU A 345      53.125  55.533  21.790  1.00 25.57           N  
+ATOM    653  CA  LEU A 345      53.983  55.564  22.966  1.00 25.44           C  
+ATOM    654  C   LEU A 345      55.298  56.280  22.672  1.00 26.26           C  
+ATOM    655  O   LEU A 345      55.933  56.829  23.576  1.00 26.98           O  
+ATOM    656  CB  LEU A 345      54.272  54.137  23.432  1.00 23.39           C  
+ATOM    657  CG  LEU A 345      53.065  53.293  23.829  1.00 20.96           C  
+ATOM    658  CD1 LEU A 345      53.516  51.860  23.877  1.00 19.55           C  
+ATOM    659  CD2 LEU A 345      52.490  53.731  25.160  1.00 15.63           C  
+ATOM    660  N   ALA A 346      55.709  56.263  21.408  1.00 27.40           N  
+ATOM    661  CA  ALA A 346      56.947  56.913  21.004  1.00 28.96           C  
+ATOM    662  C   ALA A 346      56.774  58.419  21.120  1.00 32.80           C  
+ATOM    663  O   ALA A 346      57.720  59.141  21.439  1.00 31.41           O  
+ATOM    664  CB  ALA A 346      57.298  56.532  19.577  1.00 28.77           C  
+ATOM    665  N   LYS A 347      55.554  58.884  20.862  1.00 35.50           N  
+ATOM    666  CA  LYS A 347      55.228  60.306  20.940  1.00 36.16           C  
+ATOM    667  C   LYS A 347      55.104  60.715  22.402  1.00 35.65           C  
+ATOM    668  O   LYS A 347      55.637  61.745  22.815  1.00 30.50           O  
+ATOM    669  CB  LYS A 347      53.913  60.583  20.207  1.00 40.88           C  
+ATOM    670  CG  LYS A 347      53.530  62.050  20.132  1.00 52.30           C  
+ATOM    671  CD  LYS A 347      54.613  62.851  19.432  1.00 58.83           C  
+ATOM    672  CE  LYS A 347      54.266  64.333  19.340  1.00 60.27           C  
+ATOM    673  NZ  LYS A 347      55.388  65.100  18.716  1.00 60.69           N  
+ATOM    674  N   LYS A 348      54.414  59.889  23.184  1.00 36.12           N  
+ATOM    675  CA  LYS A 348      54.230  60.173  24.602  1.00 35.77           C  
+ATOM    676  C   LYS A 348      55.578  60.177  25.283  1.00 37.11           C  
+ATOM    677  O   LYS A 348      55.728  60.714  26.382  1.00 32.49           O  
+ATOM    678  CB  LYS A 348      53.291  59.142  25.255  1.00 37.01           C  
+ATOM    679  CG  LYS A 348      51.838  59.582  25.207  1.00 44.58           C  
+ATOM    680  CD  LYS A 348      50.819  58.488  25.496  1.00 48.05           C  
+ATOM    681  CE  LYS A 348      49.404  59.074  25.332  1.00 50.25           C  
+ATOM    682  NZ  LYS A 348      48.303  58.065  25.335  1.00 50.48           N  
+ATOM    683  N   ARG A 349      56.564  59.587  24.613  1.00 38.80           N  
+ATOM    684  CA  ARG A 349      57.914  59.519  25.153  1.00 38.71           C  
+ATOM    685  C   ARG A 349      58.713  60.760  24.783  1.00 36.32           C  
+ATOM    686  O   ARG A 349      59.547  61.235  25.553  1.00 32.87           O  
+ATOM    687  CB  ARG A 349      58.628  58.270  24.632  1.00 45.89           C  
+ATOM    688  CG  ARG A 349      60.081  58.169  25.048  1.00 59.74           C  
+ATOM    689  CD  ARG A 349      60.266  58.645  26.473  1.00 67.52           C  
+ATOM    690  NE  ARG A 349      61.278  57.875  27.179  1.00 71.26           N  
+ATOM    691  CZ  ARG A 349      61.215  56.557  27.351  1.00 72.35           C  
+ATOM    692  NH1 ARG A 349      60.187  55.869  26.860  1.00 71.04           N  
+ATOM    693  NH2 ARG A 349      62.171  55.928  28.028  1.00 72.24           N  
+ATOM    694  N   VAL A 350      58.463  61.275  23.590  1.00 33.56           N  
+ATOM    695  CA  VAL A 350      59.160  62.451  23.130  1.00 31.43           C  
+ATOM    696  C   VAL A 350      58.694  63.630  23.944  1.00 33.24           C  
+ATOM    697  O   VAL A 350      59.504  64.332  24.545  1.00 31.87           O  
+ATOM    698  CB  VAL A 350      58.883  62.719  21.631  1.00 30.19           C  
+ATOM    699  CG1 VAL A 350      59.149  64.194  21.290  1.00 27.51           C  
+ATOM    700  CG2 VAL A 350      59.759  61.790  20.774  1.00 28.93           C  
+ATOM    701  N   ASP A 351      57.385  63.842  23.976  1.00 37.24           N  
+ATOM    702  CA  ASP A 351      56.833  64.965  24.718  1.00 39.20           C  
+ATOM    703  C   ASP A 351      57.235  64.902  26.176  1.00 38.93           C  
+ATOM    704  O   ASP A 351      57.328  65.923  26.859  1.00 34.74           O  
+ATOM    705  CB  ASP A 351      55.321  64.999  24.559  1.00 46.34           C  
+ATOM    706  CG  ASP A 351      54.908  65.206  23.119  1.00 57.86           C  
+ATOM    707  OD1 ASP A 351      55.516  66.070  22.443  1.00 63.07           O  
+ATOM    708  OD2 ASP A 351      53.977  64.511  22.662  1.00 63.84           O  
+ATOM    709  N   SER A 352      57.510  63.691  26.634  1.00 40.46           N  
+ATOM    710  CA  SER A 352      57.940  63.463  28.004  1.00 41.25           C  
+ATOM    711  C   SER A 352      59.253  64.201  28.290  1.00 42.21           C  
+ATOM    712  O   SER A 352      59.509  64.614  29.419  1.00 40.42           O  
+ATOM    713  CB  SER A 352      58.123  61.962  28.239  1.00 42.96           C  
+ATOM    714  OG  SER A 352      58.586  61.686  29.543  1.00 50.07           O  
+ATOM    715  N   LEU A 353      60.074  64.382  27.261  1.00 43.11           N  
+ATOM    716  CA  LEU A 353      61.354  65.061  27.425  1.00 42.72           C  
+ATOM    717  C   LEU A 353      61.441  66.428  26.744  1.00 41.93           C  
+ATOM    718  O   LEU A 353      62.174  67.306  27.204  1.00 40.44           O  
+ATOM    719  CB  LEU A 353      62.470  64.168  26.895  1.00 47.94           C  
+ATOM    720  CG  LEU A 353      62.261  62.688  27.214  1.00 56.76           C  
+ATOM    721  CD1 LEU A 353      63.273  61.861  26.454  1.00 60.24           C  
+ATOM    722  CD2 LEU A 353      62.371  62.455  28.712  1.00 60.96           C  
+ATOM    723  N   GLN A 354      60.694  66.613  25.659  1.00 39.45           N  
+ATOM    724  CA  GLN A 354      60.740  67.867  24.926  1.00 37.20           C  
+ATOM    725  C   GLN A 354      59.755  68.935  25.356  1.00 37.18           C  
+ATOM    726  O   GLN A 354      60.040  70.126  25.217  1.00 38.81           O  
+ATOM    727  CB  GLN A 354      60.563  67.608  23.434  1.00 36.51           C  
+ATOM    728  CG  GLN A 354      61.468  66.518  22.903  1.00 38.29           C  
+ATOM    729  CD  GLN A 354      61.682  66.610  21.413  1.00 40.11           C  
+ATOM    730  OE1 GLN A 354      60.786  66.996  20.652  1.00 39.79           O  
+ATOM    731  NE2 GLN A 354      62.879  66.242  20.980  1.00 41.38           N  
+ATOM    732  N   LEU A 355      58.601  68.540  25.878  1.00 37.19           N  
+ATOM    733  CA  LEU A 355      57.614  69.539  26.291  1.00 38.60           C  
+ATOM    734  C   LEU A 355      57.882  70.190  27.641  1.00 38.12           C  
+ATOM    735  O   LEU A 355      58.442  69.569  28.540  1.00 37.71           O  
+ATOM    736  CB  LEU A 355      56.205  68.937  26.292  1.00 39.14           C  
+ATOM    737  CG  LEU A 355      55.630  68.616  24.910  1.00 40.92           C  
+ATOM    738  CD1 LEU A 355      54.140  68.362  25.035  1.00 39.66           C  
+ATOM    739  CD2 LEU A 355      55.880  69.781  23.952  1.00 41.33           C  
+ATOM    740  N   THR A 356      57.491  71.455  27.768  1.00 37.87           N  
+ATOM    741  CA  THR A 356      57.657  72.188  29.023  1.00 36.78           C  
+ATOM    742  C   THR A 356      56.460  71.846  29.924  1.00 35.25           C  
+ATOM    743  O   THR A 356      55.434  71.359  29.450  1.00 34.70           O  
+ATOM    744  CB  THR A 356      57.696  73.713  28.780  1.00 37.33           C  
+ATOM    745  OG1 THR A 356      56.424  74.154  28.280  1.00 37.69           O  
+ATOM    746  CG2 THR A 356      58.784  74.058  27.771  1.00 36.36           C  
+ATOM    747  N   ARG A 357      56.577  72.096  31.217  1.00 32.91           N  
+ATOM    748  CA  ARG A 357      55.475  71.757  32.096  1.00 33.17           C  
+ATOM    749  C   ARG A 357      54.184  72.477  31.723  1.00 36.84           C  
+ATOM    750  O   ARG A 357      53.119  71.856  31.697  1.00 35.12           O  
+ATOM    751  CB  ARG A 357      55.863  71.998  33.564  1.00 28.89           C  
+ATOM    752  CG  ARG A 357      56.906  71.001  34.055  1.00 22.61           C  
+ATOM    753  CD  ARG A 357      57.315  71.218  35.486  1.00 20.66           C  
+ATOM    754  NE  ARG A 357      56.241  70.843  36.393  1.00 23.55           N  
+ATOM    755  CZ  ARG A 357      55.851  69.592  36.610  1.00 22.45           C  
+ATOM    756  NH1 ARG A 357      56.466  68.599  35.982  1.00 21.93           N  
+ATOM    757  NH2 ARG A 357      54.838  69.335  37.436  1.00 20.72           N  
+ATOM    758  N   GLU A 358      54.263  73.768  31.402  1.00 42.01           N  
+ATOM    759  CA  GLU A 358      53.048  74.483  31.019  1.00 45.54           C  
+ATOM    760  C   GLU A 358      52.400  73.833  29.784  1.00 44.88           C  
+ATOM    761  O   GLU A 358      51.166  73.785  29.675  1.00 40.96           O  
+ATOM    762  CB  GLU A 358      53.318  75.968  30.750  1.00 52.44           C  
+ATOM    763  CG  GLU A 358      52.025  76.788  30.787  1.00 67.91           C  
+ATOM    764  CD  GLU A 358      52.247  78.288  30.713  1.00 74.83           C  
+ATOM    765  OE1 GLU A 358      53.139  78.793  31.433  1.00 77.60           O  
+ATOM    766  OE2 GLU A 358      51.518  78.965  29.949  1.00 76.31           O  
+ATOM    767  N   GLN A 359      53.220  73.332  28.860  1.00 43.80           N  
+ATOM    768  CA  GLN A 359      52.681  72.671  27.678  1.00 40.66           C  
+ATOM    769  C   GLN A 359      52.059  71.364  28.132  1.00 37.70           C  
+ATOM    770  O   GLN A 359      50.992  70.987  27.651  1.00 39.76           O  
+ATOM    771  CB  GLN A 359      53.768  72.381  26.663  1.00 40.42           C  
+ATOM    772  CG  GLN A 359      54.542  73.593  26.262  1.00 44.30           C  
+ATOM    773  CD  GLN A 359      55.505  73.303  25.137  1.00 46.12           C  
+ATOM    774  OE1 GLN A 359      55.128  73.313  23.962  1.00 46.15           O  
+ATOM    775  NE2 GLN A 359      56.758  73.026  25.489  1.00 46.18           N  
+ATOM    776  N   MET A 360      52.719  70.675  29.061  1.00 32.83           N  
+ATOM    777  CA  MET A 360      52.168  69.425  29.564  1.00 30.76           C  
+ATOM    778  C   MET A 360      50.781  69.748  30.092  1.00 32.62           C  
+ATOM    779  O   MET A 360      49.797  69.063  29.754  1.00 33.06           O  
+ATOM    780  CB  MET A 360      53.017  68.842  30.699  1.00 28.13           C  
+ATOM    781  CG  MET A 360      54.296  68.141  30.258  1.00 25.98           C  
+ATOM    782  SD  MET A 360      55.359  67.650  31.647  1.00 23.38           S  
+ATOM    783  CE  MET A 360      54.730  65.895  31.940  1.00 19.00           C  
+ATOM    784  N   LEU A 361      50.696  70.806  30.900  1.00 30.29           N  
+ATOM    785  CA  LEU A 361      49.412  71.204  31.466  1.00 29.00           C  
+ATOM    786  C   LEU A 361      48.361  71.562  30.396  1.00 29.14           C  
+ATOM    787  O   LEU A 361      47.187  71.160  30.489  1.00 23.55           O  
+ATOM    788  CB  LEU A 361      49.595  72.391  32.424  1.00 31.42           C  
+ATOM    789  CG  LEU A 361      48.945  72.325  33.821  1.00 32.27           C  
+ATOM    790  CD1 LEU A 361      48.349  73.685  34.145  1.00 32.53           C  
+ATOM    791  CD2 LEU A 361      47.842  71.260  33.869  1.00 33.31           C  
+ATOM    792  N   THR A 362      48.776  72.315  29.382  1.00 30.51           N  
+ATOM    793  CA  THR A 362      47.842  72.708  28.337  1.00 32.94           C  
+ATOM    794  C   THR A 362      47.289  71.499  27.593  1.00 33.24           C  
+ATOM    795  O   THR A 362      46.113  71.486  27.213  1.00 34.26           O  
+ATOM    796  CB  THR A 362      48.489  73.639  27.318  1.00 34.32           C  
+ATOM    797  OG1 THR A 362      48.964  74.813  27.983  1.00 38.78           O  
+ATOM    798  CG2 THR A 362      47.481  74.031  26.248  1.00 37.61           C  
+ATOM    799  N   ASN A 363      48.126  70.486  27.374  1.00 33.71           N  
+ATOM    800  CA  ASN A 363      47.663  69.293  26.667  1.00 33.44           C  
+ATOM    801  C   ASN A 363      46.593  68.627  27.501  1.00 32.85           C  
+ATOM    802  O   ASN A 363      45.569  68.183  26.988  1.00 31.77           O  
+ATOM    803  CB  ASN A 363      48.809  68.320  26.406  1.00 32.84           C  
+ATOM    804  CG  ASN A 363      49.726  68.795  25.298  1.00 31.77           C  
+ATOM    805  OD1 ASN A 363      49.296  69.515  24.399  1.00 31.32           O  
+ATOM    806  ND2 ASN A 363      50.990  68.379  25.345  1.00 30.72           N  
+ATOM    807  N   ARG A 364      46.837  68.576  28.801  1.00 30.84           N  
+ATOM    808  CA  ARG A 364      45.870  68.004  29.715  1.00 28.85           C  
+ATOM    809  C   ARG A 364      44.575  68.778  29.527  1.00 28.57           C  
+ATOM    810  O   ARG A 364      43.503  68.210  29.288  1.00 26.00           O  
+ATOM    811  CB  ARG A 364      46.356  68.174  31.147  1.00 30.12           C  
+ATOM    812  CG  ARG A 364      45.358  67.713  32.171  1.00 33.03           C  
+ATOM    813  CD  ARG A 364      44.991  66.296  31.907  1.00 32.73           C  
+ATOM    814  NE  ARG A 364      44.083  65.794  32.915  1.00 36.81           N  
+ATOM    815  CZ  ARG A 364      43.685  64.529  32.974  1.00 38.28           C  
+ATOM    816  NH1 ARG A 364      44.126  63.655  32.074  1.00 37.70           N  
+ATOM    817  NH2 ARG A 364      42.850  64.133  33.929  1.00 37.61           N  
+ATOM    818  N   PHE A 365      44.693  70.094  29.628  1.00 28.29           N  
+ATOM    819  CA  PHE A 365      43.544  70.960  29.473  1.00 28.45           C  
+ATOM    820  C   PHE A 365      42.799  70.661  28.183  1.00 29.15           C  
+ATOM    821  O   PHE A 365      41.594  70.400  28.217  1.00 28.82           O  
+ATOM    822  CB  PHE A 365      43.988  72.430  29.544  1.00 27.14           C  
+ATOM    823  CG  PHE A 365      44.078  72.960  30.950  1.00 26.64           C  
+ATOM    824  CD1 PHE A 365      44.041  72.093  32.042  1.00 28.20           C  
+ATOM    825  CD2 PHE A 365      44.161  74.316  31.190  1.00 24.47           C  
+ATOM    826  CE1 PHE A 365      44.080  72.583  33.332  1.00 26.00           C  
+ATOM    827  CE2 PHE A 365      44.199  74.803  32.476  1.00 24.52           C  
+ATOM    828  CZ  PHE A 365      44.158  73.941  33.545  1.00 25.17           C  
+ATOM    829  N   ASN A 366      43.514  70.676  27.059  1.00 32.81           N  
+ATOM    830  CA  ASN A 366      42.899  70.403  25.764  1.00 35.64           C  
+ATOM    831  C   ASN A 366      42.162  69.071  25.761  1.00 38.78           C  
+ATOM    832  O   ASN A 366      41.112  68.931  25.128  1.00 36.88           O  
+ATOM    833  CB  ASN A 366      43.949  70.418  24.654  1.00 35.50           C  
+ATOM    834  CG  ASN A 366      44.186  71.807  24.097  1.00 36.88           C  
+ATOM    835  OD1 ASN A 366      43.276  72.426  23.546  1.00 39.37           O  
+ATOM    836  ND2 ASN A 366      45.409  72.306  24.236  1.00 37.94           N  
+ATOM    837  N   ASP A 367      42.698  68.091  26.480  1.00 43.70           N  
+ATOM    838  CA  ASP A 367      42.048  66.785  26.537  1.00 45.66           C  
+ATOM    839  C   ASP A 367      40.773  66.840  27.364  1.00 43.94           C  
+ATOM    840  O   ASP A 367      39.787  66.187  27.031  1.00 40.92           O  
+ATOM    841  CB  ASP A 367      43.008  65.719  27.085  1.00 53.86           C  
+ATOM    842  CG  ASP A 367      43.937  65.144  26.004  1.00 65.29           C  
+ATOM    843  OD1 ASP A 367      43.424  64.577  25.009  1.00 70.52           O  
+ATOM    844  OD2 ASP A 367      45.177  65.252  26.153  1.00 69.72           O  
+ATOM    845  N   LEU A 368      40.779  67.628  28.434  1.00 40.34           N  
+ATOM    846  CA  LEU A 368      39.576  67.751  29.260  1.00 35.78           C  
+ATOM    847  C   LEU A 368      38.484  68.524  28.517  1.00 33.38           C  
+ATOM    848  O   LEU A 368      37.294  68.310  28.741  1.00 29.00           O  
+ATOM    849  CB  LEU A 368      39.891  68.434  30.597  1.00 37.93           C  
+ATOM    850  CG  LEU A 368      40.489  67.547  31.700  1.00 40.32           C  
+ATOM    851  CD1 LEU A 368      40.691  68.375  32.967  1.00 40.91           C  
+ATOM    852  CD2 LEU A 368      39.556  66.368  31.981  1.00 39.89           C  
+ATOM    853  N   LEU A 369      38.891  69.423  27.634  1.00 31.08           N  
+ATOM    854  CA  LEU A 369      37.929  70.171  26.857  1.00 30.91           C  
+ATOM    855  C   LEU A 369      37.300  69.257  25.795  1.00 32.37           C  
+ATOM    856  O   LEU A 369      36.121  69.389  25.477  1.00 33.46           O  
+ATOM    857  CB  LEU A 369      38.590  71.384  26.197  1.00 29.40           C  
+ATOM    858  CG  LEU A 369      38.867  72.563  27.134  1.00 31.37           C  
+ATOM    859  CD1 LEU A 369      39.461  73.704  26.326  1.00 31.37           C  
+ATOM    860  CD2 LEU A 369      37.571  73.013  27.835  1.00 32.44           C  
+ATOM    861  N   ASP A 370      38.073  68.334  25.233  1.00 36.20           N  
+ATOM    862  CA  ASP A 370      37.494  67.433  24.244  1.00 38.67           C  
+ATOM    863  C   ASP A 370      36.401  66.628  24.952  1.00 39.79           C  
+ATOM    864  O   ASP A 370      35.316  66.429  24.399  1.00 40.84           O  
+ATOM    865  CB  ASP A 370      38.565  66.510  23.642  1.00 39.28           C  
+ATOM    866  CG  ASP A 370      39.552  67.258  22.744  1.00 42.17           C  
+ATOM    867  OD1 ASP A 370      39.114  68.092  21.920  1.00 41.41           O  
+ATOM    868  OD2 ASP A 370      40.774  67.006  22.849  1.00 45.37           O  
+ATOM    869  N   ARG A 371      36.689  66.187  26.180  1.00 41.08           N  
+ATOM    870  CA  ARG A 371      35.729  65.435  27.008  1.00 40.34           C  
+ATOM    871  C   ARG A 371      34.476  66.267  27.298  1.00 38.57           C  
+ATOM    872  O   ARG A 371      33.366  65.741  27.367  1.00 37.33           O  
+ATOM    873  CB  ARG A 371      36.344  65.065  28.361  1.00 41.98           C  
+ATOM    874  CG  ARG A 371      37.035  63.722  28.447  1.00 44.98           C  
+ATOM    875  CD  ARG A 371      37.508  63.429  29.884  1.00 46.97           C  
+ATOM    876  NE  ARG A 371      36.403  63.276  30.840  1.00 48.95           N  
+ATOM    877  CZ  ARG A 371      36.548  63.150  32.164  1.00 49.50           C  
+ATOM    878  NH1 ARG A 371      37.756  63.159  32.719  1.00 47.15           N  
+ATOM    879  NH2 ARG A 371      35.476  63.007  32.939  1.00 49.47           N  
+ATOM    880  N   MET A 372      34.679  67.566  27.511  1.00 36.37           N  
+ATOM    881  CA  MET A 372      33.594  68.494  27.804  1.00 34.00           C  
+ATOM    882  C   MET A 372      32.778  68.789  26.554  1.00 34.72           C  
+ATOM    883  O   MET A 372      31.557  68.929  26.628  1.00 36.19           O  
+ATOM    884  CB  MET A 372      34.157  69.798  28.386  1.00 29.98           C  
+ATOM    885  CG  MET A 372      34.636  69.700  29.871  1.00 20.18           C  
+ATOM    886  SD  MET A 372      35.665  71.068  30.366  1.00 12.54           S  
+ATOM    887  CE  MET A 372      34.530  72.463  30.198  1.00 15.35           C  
+ATOM    888  N   ASP A 373      33.449  68.874  25.408  1.00 37.32           N  
+ATOM    889  CA  ASP A 373      32.762  69.144  24.153  1.00 40.83           C  
+ATOM    890  C   ASP A 373      31.695  68.083  23.899  1.00 42.07           C  
+ATOM    891  O   ASP A 373      30.606  68.381  23.419  1.00 45.01           O  
+ATOM    892  CB  ASP A 373      33.744  69.148  22.978  1.00 42.78           C  
+ATOM    893  CG  ASP A 373      34.610  70.386  22.941  1.00 45.33           C  
+ATOM    894  OD1 ASP A 373      34.069  71.498  23.088  1.00 46.16           O  
+ATOM    895  OD2 ASP A 373      35.836  70.249  22.749  1.00 47.15           O  
+ATOM    896  N   ILE A 374      32.020  66.838  24.218  1.00 41.14           N  
+ATOM    897  CA  ILE A 374      31.094  65.744  24.019  1.00 39.38           C  
+ATOM    898  C   ILE A 374      30.059  65.675  25.136  1.00 38.74           C  
+ATOM    899  O   ILE A 374      28.876  65.538  24.857  1.00 40.82           O  
+ATOM    900  CB  ILE A 374      31.839  64.405  23.939  1.00 39.05           C  
+ATOM    901  CG1 ILE A 374      32.777  64.417  22.739  1.00 37.37           C  
+ATOM    902  CG2 ILE A 374      30.846  63.254  23.817  1.00 37.23           C  
+ATOM    903  CD1 ILE A 374      33.633  63.180  22.647  1.00 37.48           C  
+ATOM    904  N   MET A 375      30.493  65.762  26.392  1.00 37.82           N  
+ATOM    905  CA  MET A 375      29.563  65.713  27.527  1.00 38.23           C  
+ATOM    906  C   MET A 375      28.381  66.659  27.330  1.00 39.47           C  
+ATOM    907  O   MET A 375      27.218  66.268  27.469  1.00 41.00           O  
+ATOM    908  CB  MET A 375      30.248  66.138  28.827  1.00 36.41           C  
+ATOM    909  CG  MET A 375      31.314  65.215  29.369  1.00 33.48           C  
+ATOM    910  SD  MET A 375      32.068  66.016  30.795  1.00 27.97           S  
+ATOM    911  CE  MET A 375      30.738  65.997  31.926  1.00 27.90           C  
+ATOM    912  N   PHE A 376      28.692  67.912  27.014  1.00 40.75           N  
+ATOM    913  CA  PHE A 376      27.672  68.936  26.845  1.00 41.94           C  
+ATOM    914  C   PHE A 376      27.313  69.231  25.392  1.00 43.72           C  
+ATOM    915  O   PHE A 376      26.780  70.297  25.084  1.00 43.82           O  
+ATOM    916  CB  PHE A 376      28.141  70.216  27.529  1.00 37.45           C  
+ATOM    917  CG  PHE A 376      28.648  69.999  28.933  1.00 32.70           C  
+ATOM    918  CD1 PHE A 376      27.791  69.560  29.936  1.00 28.61           C  
+ATOM    919  CD2 PHE A 376      29.990  70.242  29.251  1.00 32.55           C  
+ATOM    920  CE1 PHE A 376      28.257  69.369  31.233  1.00 31.08           C  
+ATOM    921  CE2 PHE A 376      30.471  70.053  30.553  1.00 30.28           C  
+ATOM    922  CZ  PHE A 376      29.605  69.619  31.542  1.00 31.31           C  
+ATOM    923  N   GLY A 377      27.586  68.280  24.505  1.00 46.34           N  
+ATOM    924  CA  GLY A 377      27.290  68.484  23.099  1.00 51.35           C  
+ATOM    925  C   GLY A 377      25.952  67.920  22.664  1.00 54.81           C  
+ATOM    926  O   GLY A 377      25.177  67.439  23.497  1.00 56.74           O  
+ATOM    927  N   SER A 378      25.691  67.988  21.356  1.00 56.90           N  
+ATOM    928  CA  SER A 378      24.454  67.492  20.744  1.00 55.98           C  
+ATOM    929  C   SER A 378      24.187  66.034  21.093  1.00 59.12           C  
+ATOM    930  O   SER A 378      23.072  65.669  21.480  1.00 51.38           O  
+ATOM    931  CB  SER A 378      24.530  67.636  19.224  1.00 54.17           C  
+ATOM    932  OG  SER A 378      25.638  66.924  18.707  1.00 57.58           O  
+ATOM    933  N   THR A 379      25.215  65.204  20.932  1.00 63.57           N  
+ATOM    934  CA  THR A 379      25.115  63.784  21.253  1.00 66.44           C  
+ATOM    935  C   THR A 379      25.948  63.539  22.509  1.00 63.46           C  
+ATOM    936  O   THR A 379      27.086  63.073  22.433  1.00 60.51           O  
+ATOM    937  CB  THR A 379      25.654  62.900  20.106  1.00 78.47           C  
+ATOM    938  OG1 THR A 379      27.083  63.003  20.045  1.00 96.49           O  
+ATOM    939  CG2 THR A 379      25.064  63.346  18.773  1.00 96.67           C  
+ATOM    940  N   GLY A 380      25.373  63.885  23.657  1.00 57.83           N  
+ATOM    941  CA  GLY A 380      26.046  63.720  24.931  1.00 49.07           C  
+ATOM    942  C   GLY A 380      24.974  63.730  25.995  1.00 47.41           C  
+ATOM    943  O   GLY A 380      23.859  64.169  25.727  1.00 46.60           O  
+ATOM    944  N   SER A 381      25.294  63.266  27.199  1.00 45.98           N  
+ATOM    945  CA  SER A 381      24.311  63.213  28.281  1.00 46.50           C  
+ATOM    946  C   SER A 381      24.410  64.350  29.291  1.00 46.30           C  
+ATOM    947  O   SER A 381      23.394  64.852  29.760  1.00 47.53           O  
+ATOM    948  CB  SER A 381      24.456  61.907  29.036  1.00 48.06           C  
+ATOM    949  OG  SER A 381      25.741  61.865  29.627  1.00 54.19           O  
+ATOM    950  N   ALA A 382      25.635  64.744  29.627  1.00 43.09           N  
+ATOM    951  CA  ALA A 382      25.893  65.800  30.610  1.00 39.82           C  
+ATOM    952  C   ALA A 382      24.880  66.949  30.687  1.00 37.80           C  
+ATOM    953  O   ALA A 382      24.413  67.458  29.665  1.00 34.41           O  
+ATOM    954  CB  ALA A 382      27.301  66.361  30.400  1.00 39.86           C  
+ATOM    955  N   ASP A 383      24.551  67.339  31.918  1.00 34.30           N  
+ATOM    956  CA  ASP A 383      23.608  68.434  32.190  1.00 33.80           C  
+ATOM    957  C   ASP A 383      24.416  69.611  32.745  1.00 34.31           C  
+ATOM    958  O   ASP A 383      24.625  69.711  33.950  1.00 34.34           O  
+ATOM    959  CB  ASP A 383      22.583  67.996  33.235  1.00 35.29           C  
+ATOM    960  CG  ASP A 383      21.481  69.019  33.444  1.00 38.33           C  
+ATOM    961  OD1 ASP A 383      21.735  70.227  33.247  1.00 39.88           O  
+ATOM    962  OD2 ASP A 383      20.355  68.615  33.822  1.00 40.92           O  
+ATOM    963  N   ILE A 384      24.852  70.514  31.873  1.00 33.99           N  
+ATOM    964  CA  ILE A 384      25.687  71.631  32.301  1.00 33.03           C  
+ATOM    965  C   ILE A 384      25.199  72.436  33.511  1.00 33.49           C  
+ATOM    966  O   ILE A 384      26.000  72.978  34.273  1.00 31.18           O  
+ATOM    967  CB  ILE A 384      25.980  72.567  31.107  1.00 33.99           C  
+ATOM    968  CG1 ILE A 384      27.301  73.291  31.352  1.00 36.82           C  
+ATOM    969  CG2 ILE A 384      24.853  73.549  30.899  1.00 35.47           C  
+ATOM    970  CD1 ILE A 384      27.800  74.028  30.136  1.00 39.49           C  
+ATOM    971  N   GLU A 385      23.892  72.506  33.701  1.00 33.61           N  
+ATOM    972  CA  GLU A 385      23.347  73.243  34.831  1.00 32.72           C  
+ATOM    973  C   GLU A 385      23.749  72.556  36.136  1.00 32.78           C  
+ATOM    974  O   GLU A 385      23.995  73.209  37.148  1.00 31.37           O  
+ATOM    975  CB  GLU A 385      21.823  73.313  34.706  1.00 34.14           C  
+ATOM    976  CG  GLU A 385      21.135  74.086  35.810  1.00 38.54           C  
+ATOM    977  CD  GLU A 385      19.641  73.795  35.893  1.00 40.19           C  
+ATOM    978  OE1 GLU A 385      19.259  72.607  36.008  1.00 40.79           O  
+ATOM    979  OE2 GLU A 385      18.846  74.755  35.854  1.00 42.23           O  
+ATOM    980  N   GLU A 386      23.812  71.231  36.107  1.00 33.82           N  
+ATOM    981  CA  GLU A 386      24.191  70.462  37.287  1.00 36.75           C  
+ATOM    982  C   GLU A 386      25.692  70.571  37.533  1.00 36.75           C  
+ATOM    983  O   GLU A 386      26.167  70.412  38.665  1.00 37.20           O  
+ATOM    984  CB  GLU A 386      23.788  68.995  37.124  1.00 40.88           C  
+ATOM    985  CG  GLU A 386      22.332  68.714  37.492  1.00 48.69           C  
+ATOM    986  CD  GLU A 386      21.922  67.277  37.212  1.00 51.43           C  
+ATOM    987  OE1 GLU A 386      22.798  66.489  36.795  1.00 52.06           O  
+ATOM    988  OE2 GLU A 386      20.729  66.937  37.407  1.00 51.42           O  
+ATOM    989  N   TRP A 387      26.442  70.856  36.473  1.00 33.05           N  
+ATOM    990  CA  TRP A 387      27.879  71.019  36.598  1.00 28.82           C  
+ATOM    991  C   TRP A 387      28.292  72.418  37.080  1.00 25.70           C  
+ATOM    992  O   TRP A 387      29.373  72.584  37.639  1.00 24.22           O  
+ATOM    993  CB  TRP A 387      28.556  70.683  35.279  1.00 28.62           C  
+ATOM    994  CG  TRP A 387      28.604  69.218  35.047  1.00 29.42           C  
+ATOM    995  CD1 TRP A 387      27.621  68.436  34.529  1.00 29.34           C  
+ATOM    996  CD2 TRP A 387      29.676  68.338  35.396  1.00 30.22           C  
+ATOM    997  NE1 TRP A 387      28.010  67.118  34.536  1.00 30.68           N  
+ATOM    998  CE2 TRP A 387      29.269  67.030  35.064  1.00 29.27           C  
+ATOM    999  CE3 TRP A 387      30.943  68.534  35.967  1.00 30.28           C  
+ATOM   1000  CZ2 TRP A 387      30.080  65.916  35.274  1.00 29.25           C  
+ATOM   1001  CZ3 TRP A 387      31.757  67.423  36.180  1.00 31.11           C  
+ATOM   1002  CH2 TRP A 387      31.318  66.130  35.835  1.00 30.29           C  
+ATOM   1003  N   MET A 388      27.451  73.427  36.869  1.00 23.71           N  
+ATOM   1004  CA  MET A 388      27.788  74.761  37.357  1.00 22.54           C  
+ATOM   1005  C   MET A 388      27.388  74.762  38.822  1.00 21.87           C  
+ATOM   1006  O   MET A 388      27.943  75.507  39.632  1.00 22.54           O  
+ATOM   1007  CB  MET A 388      27.043  75.864  36.579  1.00 21.87           C  
+ATOM   1008  CG  MET A 388      27.724  76.283  35.264  1.00 18.17           C  
+ATOM   1009  SD  MET A 388      29.400  76.960  35.445  1.00 15.07           S  
+ATOM   1010  CE  MET A 388      29.023  78.572  36.115  1.00 10.75           C  
+ATOM   1011  N   ALA A 389      26.428  73.905  39.156  1.00 21.92           N  
+ATOM   1012  CA  ALA A 389      25.975  73.769  40.535  1.00 24.23           C  
+ATOM   1013  C   ALA A 389      27.145  73.162  41.291  1.00 25.26           C  
+ATOM   1014  O   ALA A 389      27.347  73.460  42.474  1.00 24.11           O  
+ATOM   1015  CB  ALA A 389      24.768  72.845  40.622  1.00 24.33           C  
+ATOM   1016  N   GLY A 390      27.902  72.306  40.594  1.00 26.35           N  
+ATOM   1017  CA  GLY A 390      29.071  71.674  41.189  1.00 27.18           C  
+ATOM   1018  C   GLY A 390      30.133  72.720  41.503  1.00 26.50           C  
+ATOM   1019  O   GLY A 390      30.788  72.690  42.548  1.00 27.23           O  
+ATOM   1020  N   VAL A 391      30.300  73.653  40.576  1.00 24.66           N  
+ATOM   1021  CA  VAL A 391      31.242  74.737  40.750  1.00 23.66           C  
+ATOM   1022  C   VAL A 391      30.780  75.597  41.932  1.00 22.94           C  
+ATOM   1023  O   VAL A 391      31.571  75.961  42.811  1.00 23.44           O  
+ATOM   1024  CB  VAL A 391      31.310  75.591  39.475  1.00 24.96           C  
+ATOM   1025  CG1 VAL A 391      32.140  76.859  39.713  1.00 24.27           C  
+ATOM   1026  CG2 VAL A 391      31.907  74.747  38.346  1.00 25.40           C  
+ATOM   1027  N   ALA A 392      29.491  75.904  41.968  1.00 20.41           N  
+ATOM   1028  CA  ALA A 392      28.974  76.702  43.055  1.00 20.38           C  
+ATOM   1029  C   ALA A 392      29.279  76.026  44.400  1.00 22.12           C  
+ATOM   1030  O   ALA A 392      29.744  76.670  45.344  1.00 21.02           O  
+ATOM   1031  CB  ALA A 392      27.496  76.887  42.885  1.00 19.94           C  
+ATOM   1032  N   TRP A 393      29.018  74.732  44.502  1.00 23.53           N  
+ATOM   1033  CA  TRP A 393      29.293  74.026  45.747  1.00 24.55           C  
+ATOM   1034  C   TRP A 393      30.792  74.042  46.073  1.00 23.78           C  
+ATOM   1035  O   TRP A 393      31.181  74.210  47.228  1.00 23.31           O  
+ATOM   1036  CB  TRP A 393      28.813  72.574  45.660  1.00 28.91           C  
+ATOM   1037  CG  TRP A 393      28.879  71.868  46.976  1.00 33.67           C  
+ATOM   1038  CD1 TRP A 393      27.903  71.818  47.940  1.00 34.59           C  
+ATOM   1039  CD2 TRP A 393      30.013  71.180  47.521  1.00 35.26           C  
+ATOM   1040  NE1 TRP A 393      28.366  71.147  49.045  1.00 35.58           N  
+ATOM   1041  CE2 TRP A 393      29.657  70.745  48.815  1.00 35.44           C  
+ATOM   1042  CE3 TRP A 393      31.299  70.892  47.036  1.00 35.79           C  
+ATOM   1043  CZ2 TRP A 393      30.540  70.035  49.634  1.00 34.69           C  
+ATOM   1044  CZ3 TRP A 393      32.172  70.188  47.850  1.00 35.80           C  
+ATOM   1045  CH2 TRP A 393      31.788  69.767  49.135  1.00 35.79           C  
+ATOM   1046  N   LEU A 394      31.627  73.859  45.054  1.00 24.39           N  
+ATOM   1047  CA  LEU A 394      33.076  73.868  45.239  1.00 24.37           C  
+ATOM   1048  C   LEU A 394      33.639  75.226  45.636  1.00 25.03           C  
+ATOM   1049  O   LEU A 394      34.606  75.319  46.402  1.00 28.71           O  
+ATOM   1050  CB  LEU A 394      33.773  73.415  43.963  1.00 20.59           C  
+ATOM   1051  CG  LEU A 394      33.890  71.904  43.802  1.00 19.69           C  
+ATOM   1052  CD1 LEU A 394      34.407  71.592  42.416  1.00 17.43           C  
+ATOM   1053  CD2 LEU A 394      34.812  71.327  44.893  1.00 18.82           C  
+ATOM   1054  N   HIS A 395      33.036  76.284  45.115  1.00 26.75           N  
+ATOM   1055  CA  HIS A 395      33.511  77.623  45.407  1.00 29.15           C  
+ATOM   1056  C   HIS A 395      33.044  78.083  46.785  1.00 30.98           C  
+ATOM   1057  O   HIS A 395      33.215  79.250  47.151  1.00 32.79           O  
+ATOM   1058  CB  HIS A 395      33.035  78.575  44.308  1.00 27.42           C  
+ATOM   1059  CG  HIS A 395      33.895  79.785  44.146  1.00 24.44           C  
+ATOM   1060  ND1 HIS A 395      33.844  80.855  45.014  1.00 22.69           N  
+ATOM   1061  CD2 HIS A 395      34.842  80.091  43.227  1.00 22.76           C  
+ATOM   1062  CE1 HIS A 395      34.724  81.769  44.632  1.00 21.51           C  
+ATOM   1063  NE2 HIS A 395      35.339  81.330  43.553  1.00 18.73           N  
+ATOM   1064  N   CYS A 396      32.461  77.151  47.539  1.00 30.22           N  
+ATOM   1065  CA  CYS A 396      31.965  77.421  48.885  1.00 29.88           C  
+ATOM   1066  C   CYS A 396      32.704  76.538  49.873  1.00 28.74           C  
+ATOM   1067  O   CYS A 396      32.553  76.681  51.092  1.00 26.71           O  
+ATOM   1068  CB  CYS A 396      30.457  77.130  48.991  1.00 33.03           C  
+ATOM   1069  SG  CYS A 396      29.304  78.382  48.316  1.00 39.21           S  
+ATOM   1070  N   LEU A 397      33.492  75.614  49.335  1.00 26.81           N  
+ATOM   1071  CA  LEU A 397      34.262  74.678  50.147  1.00 25.36           C  
+ATOM   1072  C   LEU A 397      35.486  75.336  50.759  1.00 25.37           C  
+ATOM   1073  O   LEU A 397      35.896  75.007  51.874  1.00 25.16           O  
+ATOM   1074  CB  LEU A 397      34.724  73.508  49.298  1.00 25.97           C  
+ATOM   1075  CG  LEU A 397      35.596  72.464  49.991  1.00 25.95           C  
+ATOM   1076  CD1 LEU A 397      34.789  71.700  51.035  1.00 24.31           C  
+ATOM   1077  CD2 LEU A 397      36.136  71.525  48.925  1.00 26.09           C  
+ATOM   1078  N   LEU A 398      36.070  76.269  50.015  1.00 26.55           N  
+ATOM   1079  CA  LEU A 398      37.250  76.978  50.466  1.00 25.79           C  
+ATOM   1080  C   LEU A 398      37.134  78.425  50.031  1.00 24.05           C  
+ATOM   1081  O   LEU A 398      36.518  78.731  49.010  1.00 28.55           O  
+ATOM   1082  CB  LEU A 398      38.490  76.336  49.843  1.00 27.44           C  
+ATOM   1083  CG  LEU A 398      39.627  75.852  50.739  1.00 28.16           C  
+ATOM   1084  CD1 LEU A 398      39.109  75.065  51.944  1.00 26.09           C  
+ATOM   1085  CD2 LEU A 398      40.537  74.990  49.876  1.00 27.14           C  
+ATOM   1086  N   PRO A 399      37.722  79.340  50.805  1.00 24.93           N  
+ATOM   1087  CA  PRO A 399      37.691  80.776  50.503  1.00 25.13           C  
+ATOM   1088  C   PRO A 399      38.546  81.085  49.281  1.00 26.38           C  
+ATOM   1089  O   PRO A 399      39.628  80.518  49.122  1.00 29.12           O  
+ATOM   1090  CB  PRO A 399      38.285  81.410  51.747  1.00 19.95           C  
+ATOM   1091  CG  PRO A 399      38.081  80.390  52.812  1.00 19.79           C  
+ATOM   1092  CD  PRO A 399      38.356  79.094  52.106  1.00 22.16           C  
+ATOM   1093  N   LYS A 400      38.061  81.979  48.423  1.00 29.66           N  
+ATOM   1094  CA  LYS A 400      38.794  82.364  47.218  1.00 31.32           C  
+ATOM   1095  C   LYS A 400      39.242  81.103  46.474  1.00 30.51           C  
+ATOM   1096  O   LYS A 400      40.323  81.063  45.868  1.00 28.23           O  
+ATOM   1097  CB  LYS A 400      40.003  83.238  47.601  1.00 32.72           C  
+ATOM   1098  CG  LYS A 400      39.611  84.545  48.278  1.00 33.65           C  
+ATOM   1099  CD  LYS A 400      40.797  85.335  48.829  1.00 36.43           C  
+ATOM   1100  CE  LYS A 400      41.431  86.286  47.796  1.00 40.96           C  
+ATOM   1101  NZ  LYS A 400      42.457  85.684  46.853  1.00 39.75           N  
+ATOM   1102  N   MET A 401      38.384  80.082  46.528  1.00 26.98           N  
+ATOM   1103  CA  MET A 401      38.655  78.801  45.897  1.00 23.45           C  
+ATOM   1104  C   MET A 401      39.235  78.913  44.498  1.00 22.44           C  
+ATOM   1105  O   MET A 401      40.199  78.219  44.180  1.00 22.39           O  
+ATOM   1106  CB  MET A 401      37.388  77.936  45.873  1.00 19.42           C  
+ATOM   1107  CG  MET A 401      37.571  76.528  45.279  1.00 13.83           C  
+ATOM   1108  SD  MET A 401      39.000  75.607  45.926  1.00  7.98           S  
+ATOM   1109  CE  MET A 401      38.323  74.598  47.113  1.00 15.86           C  
+ATOM   1110  N   ASP A 402      38.697  79.802  43.670  1.00 22.47           N  
+ATOM   1111  CA  ASP A 402      39.211  79.904  42.308  1.00 25.43           C  
+ATOM   1112  C   ASP A 402      40.633  80.448  42.246  1.00 27.83           C  
+ATOM   1113  O   ASP A 402      41.372  80.180  41.294  1.00 29.53           O  
+ATOM   1114  CB  ASP A 402      38.288  80.746  41.434  1.00 25.72           C  
+ATOM   1115  CG  ASP A 402      38.433  82.201  41.689  1.00 28.47           C  
+ATOM   1116  OD1 ASP A 402      39.048  82.899  40.859  1.00 28.54           O  
+ATOM   1117  OD2 ASP A 402      37.932  82.649  42.732  1.00 33.58           O  
+ATOM   1118  N   SER A 403      41.034  81.207  43.256  1.00 28.91           N  
+ATOM   1119  CA  SER A 403      42.394  81.736  43.275  1.00 27.72           C  
+ATOM   1120  C   SER A 403      43.320  80.602  43.757  1.00 26.37           C  
+ATOM   1121  O   SER A 403      44.476  80.479  43.340  1.00 22.80           O  
+ATOM   1122  CB  SER A 403      42.431  82.944  44.206  1.00 28.27           C  
+ATOM   1123  OG  SER A 403      41.289  83.764  43.965  1.00 36.54           O  
+ATOM   1124  N   VAL A 404      42.768  79.755  44.621  1.00 25.55           N  
+ATOM   1125  CA  VAL A 404      43.477  78.614  45.169  1.00 23.86           C  
+ATOM   1126  C   VAL A 404      43.878  77.632  44.083  1.00 23.23           C  
+ATOM   1127  O   VAL A 404      44.984  77.102  44.099  1.00 25.89           O  
+ATOM   1128  CB  VAL A 404      42.605  77.863  46.171  1.00 21.72           C  
+ATOM   1129  CG1 VAL A 404      43.295  76.575  46.595  1.00 22.60           C  
+ATOM   1130  CG2 VAL A 404      42.334  78.734  47.367  1.00 21.45           C  
+ATOM   1131  N   VAL A 405      42.973  77.380  43.144  1.00 22.29           N  
+ATOM   1132  CA  VAL A 405      43.251  76.441  42.062  1.00 22.38           C  
+ATOM   1133  C   VAL A 405      44.261  77.034  41.092  1.00 23.76           C  
+ATOM   1134  O   VAL A 405      45.112  76.332  40.553  1.00 21.51           O  
+ATOM   1135  CB  VAL A 405      41.946  76.052  41.301  1.00 22.89           C  
+ATOM   1136  CG1 VAL A 405      42.263  75.112  40.130  1.00 22.08           C  
+ATOM   1137  CG2 VAL A 405      40.981  75.376  42.255  1.00 22.59           C  
+ATOM   1138  N   TYR A 406      44.163  78.332  40.856  1.00 26.32           N  
+ATOM   1139  CA  TYR A 406      45.110  78.977  39.960  1.00 27.52           C  
+ATOM   1140  C   TYR A 406      46.474  78.918  40.645  1.00 27.30           C  
+ATOM   1141  O   TYR A 406      47.481  78.580  40.030  1.00 24.17           O  
+ATOM   1142  CB  TYR A 406      44.697  80.434  39.710  1.00 32.08           C  
+ATOM   1143  CG  TYR A 406      45.749  81.281  39.014  1.00 37.39           C  
+ATOM   1144  CD1 TYR A 406      46.126  81.033  37.692  1.00 39.09           C  
+ATOM   1145  CD2 TYR A 406      46.354  82.346  39.678  1.00 39.31           C  
+ATOM   1146  CE1 TYR A 406      47.080  81.833  37.049  1.00 40.05           C  
+ATOM   1147  CE2 TYR A 406      47.303  83.148  39.047  1.00 40.71           C  
+ATOM   1148  CZ  TYR A 406      47.665  82.891  37.737  1.00 40.85           C  
+ATOM   1149  OH  TYR A 406      48.608  83.699  37.133  1.00 41.94           O  
+ATOM   1150  N   ASP A 407      46.494  79.262  41.928  1.00 29.09           N  
+ATOM   1151  CA  ASP A 407      47.730  79.224  42.683  1.00 30.28           C  
+ATOM   1152  C   ASP A 407      48.316  77.827  42.593  1.00 29.91           C  
+ATOM   1153  O   ASP A 407      49.464  77.650  42.203  1.00 33.30           O  
+ATOM   1154  CB  ASP A 407      47.497  79.555  44.152  1.00 31.80           C  
+ATOM   1155  CG  ASP A 407      47.280  81.032  44.400  1.00 35.59           C  
+ATOM   1156  OD1 ASP A 407      47.949  81.857  43.736  1.00 37.55           O  
+ATOM   1157  OD2 ASP A 407      46.449  81.360  45.282  1.00 36.88           O  
+ATOM   1158  N   PHE A 408      47.521  76.828  42.949  1.00 28.68           N  
+ATOM   1159  CA  PHE A 408      47.997  75.456  42.910  1.00 26.43           C  
+ATOM   1160  C   PHE A 408      48.599  75.085  41.560  1.00 24.63           C  
+ATOM   1161  O   PHE A 408      49.652  74.452  41.499  1.00 24.71           O  
+ATOM   1162  CB  PHE A 408      46.871  74.485  43.233  1.00 22.03           C  
+ATOM   1163  CG  PHE A 408      47.290  73.057  43.163  1.00 18.93           C  
+ATOM   1164  CD1 PHE A 408      48.128  72.522  44.127  1.00 19.10           C  
+ATOM   1165  CD2 PHE A 408      46.883  72.256  42.108  1.00 18.55           C  
+ATOM   1166  CE1 PHE A 408      48.561  71.194  44.044  1.00 19.69           C  
+ATOM   1167  CE2 PHE A 408      47.304  70.933  42.009  1.00 16.92           C  
+ATOM   1168  CZ  PHE A 408      48.144  70.399  42.977  1.00 17.84           C  
+ATOM   1169  N   LEU A 409      47.919  75.463  40.485  1.00 23.47           N  
+ATOM   1170  CA  LEU A 409      48.387  75.181  39.134  1.00 23.84           C  
+ATOM   1171  C   LEU A 409      49.743  75.818  38.876  1.00 27.83           C  
+ATOM   1172  O   LEU A 409      50.609  75.202  38.259  1.00 25.49           O  
+ATOM   1173  CB  LEU A 409      47.374  75.696  38.105  1.00 22.10           C  
+ATOM   1174  CG  LEU A 409      46.083  74.884  37.939  1.00 20.48           C  
+ATOM   1175  CD1 LEU A 409      45.170  75.536  36.935  1.00 19.00           C  
+ATOM   1176  CD2 LEU A 409      46.449  73.476  37.477  1.00 22.01           C  
+ATOM   1177  N   LYS A 410      49.943  77.044  39.352  1.00 32.67           N  
+ATOM   1178  CA  LYS A 410      51.225  77.713  39.125  1.00 36.19           C  
+ATOM   1179  C   LYS A 410      52.325  77.015  39.941  1.00 35.15           C  
+ATOM   1180  O   LYS A 410      53.461  76.838  39.491  1.00 30.89           O  
+ATOM   1181  CB  LYS A 410      51.136  79.204  39.492  1.00 45.80           C  
+ATOM   1182  CG  LYS A 410      51.192  79.491  40.974  1.00 63.96           C  
+ATOM   1183  CD  LYS A 410      51.124  80.976  41.284  1.00 72.23           C  
+ATOM   1184  CE  LYS A 410      51.182  81.197  42.795  1.00 74.82           C  
+ATOM   1185  NZ  LYS A 410      51.046  82.626  43.169  1.00 75.46           N  
+ATOM   1186  N   CYS A 411      51.965  76.609  41.147  1.00 33.44           N  
+ATOM   1187  CA  CYS A 411      52.896  75.914  42.000  1.00 30.81           C  
+ATOM   1188  C   CYS A 411      53.337  74.658  41.239  1.00 28.55           C  
+ATOM   1189  O   CYS A 411      54.526  74.439  41.044  1.00 31.80           O  
+ATOM   1190  CB  CYS A 411      52.206  75.535  43.306  1.00 31.63           C  
+ATOM   1191  SG  CYS A 411      53.297  74.894  44.583  1.00 34.99           S  
+ATOM   1192  N   MET A 412      52.374  73.858  40.787  1.00 26.53           N  
+ATOM   1193  CA  MET A 412      52.669  72.630  40.066  1.00 25.54           C  
+ATOM   1194  C   MET A 412      53.445  72.851  38.777  1.00 28.04           C  
+ATOM   1195  O   MET A 412      54.302  72.041  38.431  1.00 30.26           O  
+ATOM   1196  CB  MET A 412      51.378  71.853  39.736  1.00 22.95           C  
+ATOM   1197  CG  MET A 412      50.562  71.321  40.932  1.00 14.77           C  
+ATOM   1198  SD  MET A 412      51.499  70.312  42.097  1.00  8.66           S  
+ATOM   1199  CE  MET A 412      52.088  71.568  43.198  1.00  9.18           C  
+ATOM   1200  N   VAL A 413      53.155  73.919  38.043  1.00 28.31           N  
+ATOM   1201  CA  VAL A 413      53.890  74.137  36.798  1.00 28.45           C  
+ATOM   1202  C   VAL A 413      55.263  74.724  37.051  1.00 30.04           C  
+ATOM   1203  O   VAL A 413      56.230  74.313  36.440  1.00 29.00           O  
+ATOM   1204  CB  VAL A 413      53.141  75.065  35.806  1.00 30.11           C  
+ATOM   1205  CG1 VAL A 413      54.123  75.645  34.817  1.00 31.81           C  
+ATOM   1206  CG2 VAL A 413      52.101  74.283  35.028  1.00 33.51           C  
+ATOM   1207  N   TYR A 414      55.351  75.695  37.944  1.00 31.77           N  
+ATOM   1208  CA  TYR A 414      56.633  76.318  38.241  1.00 33.12           C  
+ATOM   1209  C   TYR A 414      57.593  75.284  38.837  1.00 32.86           C  
+ATOM   1210  O   TYR A 414      58.811  75.390  38.693  1.00 33.01           O  
+ATOM   1211  CB  TYR A 414      56.430  77.503  39.198  1.00 36.82           C  
+ATOM   1212  CG  TYR A 414      55.855  78.743  38.538  1.00 41.97           C  
+ATOM   1213  CD1 TYR A 414      54.798  78.653  37.626  1.00 44.77           C  
+ATOM   1214  CD2 TYR A 414      56.337  80.014  38.857  1.00 44.97           C  
+ATOM   1215  CE1 TYR A 414      54.233  79.799  37.047  1.00 45.26           C  
+ATOM   1216  CE2 TYR A 414      55.781  81.170  38.285  1.00 46.06           C  
+ATOM   1217  CZ  TYR A 414      54.731  81.052  37.385  1.00 45.74           C  
+ATOM   1218  OH  TYR A 414      54.189  82.179  36.816  1.00 44.79           O  
+ATOM   1219  N   ASN A 415      57.030  74.279  39.495  1.00 32.00           N  
+ATOM   1220  CA  ASN A 415      57.809  73.216  40.108  1.00 29.74           C  
+ATOM   1221  C   ASN A 415      59.142  73.681  40.690  1.00 29.63           C  
+ATOM   1222  O   ASN A 415      60.213  73.315  40.188  1.00 28.55           O  
+ATOM   1223  CB  ASN A 415      58.059  72.126  39.078  1.00 28.33           C  
+ATOM   1224  CG  ASN A 415      58.638  70.890  39.693  1.00 28.81           C  
+ATOM   1225  OD1 ASN A 415      59.198  70.056  39.005  1.00 31.76           O  
+ATOM   1226  ND2 ASN A 415      58.502  70.759  41.002  1.00 28.27           N  
+ATOM   1227  N   ILE A 416      59.080  74.467  41.761  1.00 30.66           N  
+ATOM   1228  CA  ILE A 416      60.289  74.993  42.387  1.00 30.53           C  
+ATOM   1229  C   ILE A 416      60.752  74.229  43.621  1.00 30.34           C  
+ATOM   1230  O   ILE A 416      59.983  73.983  44.551  1.00 33.98           O  
+ATOM   1231  CB  ILE A 416      60.114  76.480  42.748  1.00 31.45           C  
+ATOM   1232  CG1 ILE A 416      60.084  77.293  41.453  1.00 30.13           C  
+ATOM   1233  CG2 ILE A 416      61.228  76.945  43.691  1.00 31.65           C  
+ATOM   1234  CD1 ILE A 416      60.291  78.767  41.646  1.00 33.94           C  
+ATOM   1235  N   PRO A 417      62.038  73.861  43.658  1.00 35.04           N  
+ATOM   1236  CA  PRO A 417      62.514  73.119  44.829  1.00 35.17           C  
+ATOM   1237  C   PRO A 417      62.058  73.703  46.160  1.00 35.90           C  
+ATOM   1238  O   PRO A 417      62.099  74.913  46.364  1.00 37.52           O  
+ATOM   1239  CB  PRO A 417      64.040  73.107  44.647  1.00 33.79           C  
+ATOM   1240  CG  PRO A 417      64.301  74.212  43.633  1.00 31.76           C  
+ATOM   1241  CD  PRO A 417      63.132  74.155  42.720  1.00 31.43           C  
+ATOM   1242  N   LYS A 418      61.593  72.819  47.041  1.00 38.21           N  
+ATOM   1243  CA  LYS A 418      61.108  73.170  48.378  1.00 38.73           C  
+ATOM   1244  C   LYS A 418      59.857  74.035  48.396  1.00 38.62           C  
+ATOM   1245  O   LYS A 418      59.533  74.648  49.412  1.00 37.36           O  
+ATOM   1246  CB  LYS A 418      62.208  73.859  49.187  1.00 41.51           C  
+ATOM   1247  CG  LYS A 418      63.351  72.954  49.607  1.00 47.93           C  
+ATOM   1248  CD  LYS A 418      64.339  73.708  50.467  1.00 51.98           C  
+ATOM   1249  CE  LYS A 418      65.456  72.804  50.964  1.00 54.81           C  
+ATOM   1250  NZ  LYS A 418      66.452  73.568  51.786  1.00 54.53           N  
+ATOM   1251  N   LYS A 419      59.148  74.086  47.275  1.00 36.54           N  
+ATOM   1252  CA  LYS A 419      57.915  74.865  47.186  1.00 33.29           C  
+ATOM   1253  C   LYS A 419      57.012  74.154  46.189  1.00 31.53           C  
+ATOM   1254  O   LYS A 419      56.345  74.802  45.378  1.00 32.04           O  
+ATOM   1255  CB  LYS A 419      58.204  76.266  46.662  1.00 33.55           C  
+ATOM   1256  CG  LYS A 419      59.081  77.130  47.527  1.00 38.19           C  
+ATOM   1257  CD  LYS A 419      59.224  78.477  46.836  1.00 40.30           C  
+ATOM   1258  CE  LYS A 419      59.907  79.527  47.684  1.00 40.35           C  
+ATOM   1259  NZ  LYS A 419      59.945  80.830  46.960  1.00 39.64           N  
+ATOM   1260  N   ARG A 420      56.990  72.825  46.252  1.00 28.25           N  
+ATOM   1261  CA  ARG A 420      56.208  72.019  45.309  1.00 26.37           C  
+ATOM   1262  C   ARG A 420      55.089  71.189  45.924  1.00 24.71           C  
+ATOM   1263  O   ARG A 420      54.338  70.537  45.199  1.00 24.40           O  
+ATOM   1264  CB  ARG A 420      57.152  71.075  44.564  1.00 24.03           C  
+ATOM   1265  CG  ARG A 420      58.577  71.549  44.598  1.00 23.53           C  
+ATOM   1266  CD  ARG A 420      59.466  70.696  43.753  1.00 25.58           C  
+ATOM   1267  NE  ARG A 420      59.706  69.375  44.332  1.00 24.94           N  
+ATOM   1268  CZ  ARG A 420      59.532  68.236  43.673  1.00 23.58           C  
+ATOM   1269  NH1 ARG A 420      59.108  68.248  42.414  1.00 23.34           N  
+ATOM   1270  NH2 ARG A 420      59.803  67.087  44.266  1.00 23.07           N  
+ATOM   1271  N   TYR A 421      54.987  71.206  47.250  1.00 21.14           N  
+ATOM   1272  CA  TYR A 421      53.982  70.420  47.928  1.00 18.44           C  
+ATOM   1273  C   TYR A 421      53.014  71.155  48.801  1.00 19.01           C  
+ATOM   1274  O   TYR A 421      53.368  72.094  49.487  1.00 16.63           O  
+ATOM   1275  CB  TYR A 421      54.650  69.310  48.737  1.00 16.41           C  
+ATOM   1276  CG  TYR A 421      54.911  68.102  47.887  1.00 17.95           C  
+ATOM   1277  CD1 TYR A 421      55.999  68.067  47.005  1.00 17.12           C  
+ATOM   1278  CD2 TYR A 421      54.004  67.028  47.877  1.00 16.87           C  
+ATOM   1279  CE1 TYR A 421      56.179  66.995  46.123  1.00 18.25           C  
+ATOM   1280  CE2 TYR A 421      54.173  65.957  47.007  1.00 17.30           C  
+ATOM   1281  CZ  TYR A 421      55.259  65.952  46.129  1.00 18.54           C  
+ATOM   1282  OH  TYR A 421      55.415  64.929  45.235  1.00 17.50           O  
+ATOM   1283  N   TRP A 422      51.769  70.708  48.748  1.00 20.35           N  
+ATOM   1284  CA  TRP A 422      50.696  71.263  49.555  1.00 20.18           C  
+ATOM   1285  C   TRP A 422      50.239  70.126  50.448  1.00 19.44           C  
+ATOM   1286  O   TRP A 422      50.263  68.961  50.040  1.00 18.75           O  
+ATOM   1287  CB  TRP A 422      49.526  71.742  48.682  1.00 21.03           C  
+ATOM   1288  CG  TRP A 422      49.767  73.063  48.042  1.00 24.75           C  
+ATOM   1289  CD1 TRP A 422      50.979  73.606  47.721  1.00 25.95           C  
+ATOM   1290  CD2 TRP A 422      48.777  73.972  47.534  1.00 25.60           C  
+ATOM   1291  NE1 TRP A 422      50.807  74.791  47.039  1.00 25.74           N  
+ATOM   1292  CE2 TRP A 422      49.464  75.040  46.911  1.00 25.72           C  
+ATOM   1293  CE3 TRP A 422      47.372  73.985  47.546  1.00 24.93           C  
+ATOM   1294  CZ2 TRP A 422      48.798  76.108  46.292  1.00 24.30           C  
+ATOM   1295  CZ3 TRP A 422      46.706  75.052  46.930  1.00 25.30           C  
+ATOM   1296  CH2 TRP A 422      47.425  76.098  46.314  1.00 25.30           C  
+ATOM   1297  N   LEU A 423      49.821  70.483  51.657  1.00 20.27           N  
+ATOM   1298  CA  LEU A 423      49.351  69.527  52.636  1.00 21.39           C  
+ATOM   1299  C   LEU A 423      47.887  69.777  53.025  1.00 22.94           C  
+ATOM   1300  O   LEU A 423      47.557  70.818  53.593  1.00 22.15           O  
+ATOM   1301  CB  LEU A 423      50.234  69.610  53.877  1.00 18.43           C  
+ATOM   1302  CG  LEU A 423      49.764  68.706  55.016  1.00 17.98           C  
+ATOM   1303  CD1 LEU A 423      50.112  67.246  54.667  1.00 14.98           C  
+ATOM   1304  CD2 LEU A 423      50.419  69.152  56.334  1.00 15.97           C  
+ATOM   1305  N   PHE A 424      47.009  68.832  52.706  1.00 23.85           N  
+ATOM   1306  CA  PHE A 424      45.607  68.983  53.069  1.00 24.69           C  
+ATOM   1307  C   PHE A 424      45.363  68.188  54.355  1.00 25.99           C  
+ATOM   1308  O   PHE A 424      45.549  66.963  54.405  1.00 22.30           O  
+ATOM   1309  CB  PHE A 424      44.685  68.459  51.953  1.00 26.39           C  
+ATOM   1310  CG  PHE A 424      44.737  69.246  50.664  1.00 26.89           C  
+ATOM   1311  CD1 PHE A 424      45.673  70.248  50.464  1.00 27.41           C  
+ATOM   1312  CD2 PHE A 424      43.831  68.967  49.640  1.00 27.27           C  
+ATOM   1313  CE1 PHE A 424      45.705  70.964  49.270  1.00 27.06           C  
+ATOM   1314  CE2 PHE A 424      43.856  69.676  48.441  1.00 26.84           C  
+ATOM   1315  CZ  PHE A 424      44.794  70.677  48.258  1.00 26.43           C  
+ATOM   1316  N   LYS A 425      44.961  68.890  55.403  1.00 28.57           N  
+ATOM   1317  CA  LYS A 425      44.699  68.243  56.677  1.00 30.98           C  
+ATOM   1318  C   LYS A 425      43.215  68.329  57.005  1.00 30.85           C  
+ATOM   1319  O   LYS A 425      42.548  69.280  56.593  1.00 30.78           O  
+ATOM   1320  CB  LYS A 425      45.520  68.906  57.794  1.00 35.03           C  
+ATOM   1321  CG  LYS A 425      46.554  67.990  58.433  1.00 41.31           C  
+ATOM   1322  CD  LYS A 425      47.161  68.632  59.674  1.00 45.59           C  
+ATOM   1323  CE  LYS A 425      48.023  67.647  60.457  1.00 46.44           C  
+ATOM   1324  NZ  LYS A 425      48.570  68.247  61.707  1.00 46.77           N  
+ATOM   1325  N   GLY A 426      42.693  67.332  57.724  1.00 31.01           N  
+ATOM   1326  CA  GLY A 426      41.289  67.361  58.099  1.00 32.00           C  
+ATOM   1327  C   GLY A 426      40.678  66.015  58.446  1.00 35.55           C  
+ATOM   1328  O   GLY A 426      41.200  64.970  58.044  1.00 33.53           O  
+ATOM   1329  N   PRO A 427      39.558  66.007  59.191  1.00 37.74           N  
+ATOM   1330  CA  PRO A 427      38.878  64.770  59.586  1.00 38.27           C  
+ATOM   1331  C   PRO A 427      38.339  64.163  58.312  1.00 40.30           C  
+ATOM   1332  O   PRO A 427      38.594  64.692  57.239  1.00 38.21           O  
+ATOM   1333  CB  PRO A 427      37.748  65.264  60.483  1.00 38.50           C  
+ATOM   1334  CG  PRO A 427      38.251  66.583  60.996  1.00 42.02           C  
+ATOM   1335  CD  PRO A 427      38.875  67.178  59.764  1.00 38.73           C  
+ATOM   1336  N   ILE A 428      37.587  63.073  58.412  1.00 42.97           N  
+ATOM   1337  CA  ILE A 428      37.008  62.473  57.214  1.00 45.86           C  
+ATOM   1338  C   ILE A 428      35.765  63.295  56.881  1.00 47.57           C  
+ATOM   1339  O   ILE A 428      35.160  63.889  57.770  1.00 45.94           O  
+ATOM   1340  CB  ILE A 428      36.604  61.007  57.438  1.00 49.52           C  
+ATOM   1341  CG1 ILE A 428      36.125  60.395  56.122  1.00 55.62           C  
+ATOM   1342  CG2 ILE A 428      35.488  60.923  58.455  1.00 55.35           C  
+ATOM   1343  CD1 ILE A 428      35.724  58.951  56.248  1.00 59.07           C  
+ATOM   1344  N   ASP A 429      35.399  63.341  55.604  1.00 49.26           N  
+ATOM   1345  CA  ASP A 429      34.240  64.108  55.144  1.00 48.28           C  
+ATOM   1346  C   ASP A 429      34.363  65.595  55.454  1.00 45.57           C  
+ATOM   1347  O   ASP A 429      33.440  66.222  55.989  1.00 42.03           O  
+ATOM   1348  CB  ASP A 429      32.944  63.550  55.739  1.00 56.60           C  
+ATOM   1349  CG  ASP A 429      32.586  62.189  55.170  1.00 69.73           C  
+ATOM   1350  OD1 ASP A 429      32.899  61.948  53.986  1.00 76.05           O  
+ATOM   1351  OD2 ASP A 429      31.979  61.367  55.892  1.00 76.93           O  
+ATOM   1352  N   SER A 430      35.516  66.155  55.109  1.00 41.37           N  
+ATOM   1353  CA  SER A 430      35.779  67.571  55.323  1.00 37.97           C  
+ATOM   1354  C   SER A 430      36.009  68.248  53.977  1.00 35.90           C  
+ATOM   1355  O   SER A 430      35.960  69.472  53.873  1.00 37.01           O  
+ATOM   1356  CB  SER A 430      37.005  67.749  56.219  1.00 38.99           C  
+ATOM   1357  OG  SER A 430      38.125  67.087  55.666  1.00 40.94           O  
+ATOM   1358  N   GLY A 431      36.268  67.441  52.951  1.00 33.34           N  
+ATOM   1359  CA  GLY A 431      36.483  67.974  51.616  1.00 30.32           C  
+ATOM   1360  C   GLY A 431      37.860  67.838  50.974  1.00 29.91           C  
+ATOM   1361  O   GLY A 431      37.956  68.001  49.753  1.00 26.81           O  
+ATOM   1362  N   LYS A 432      38.910  67.543  51.755  1.00 29.41           N  
+ATOM   1363  CA  LYS A 432      40.267  67.405  51.198  1.00 29.05           C  
+ATOM   1364  C   LYS A 432      40.411  66.294  50.165  1.00 28.61           C  
+ATOM   1365  O   LYS A 432      41.154  66.433  49.181  1.00 24.24           O  
+ATOM   1366  CB  LYS A 432      41.299  67.192  52.310  1.00 30.36           C  
+ATOM   1367  CG  LYS A 432      40.790  66.406  53.493  1.00 34.91           C  
+ATOM   1368  CD  LYS A 432      41.904  66.154  54.495  1.00 35.46           C  
+ATOM   1369  CE  LYS A 432      42.262  64.691  54.538  1.00 36.42           C  
+ATOM   1370  NZ  LYS A 432      41.189  63.851  55.148  1.00 35.30           N  
+ATOM   1371  N   THR A 433      39.699  65.196  50.397  1.00 29.25           N  
+ATOM   1372  CA  THR A 433      39.733  64.068  49.491  1.00 30.62           C  
+ATOM   1373  C   THR A 433      39.110  64.476  48.165  1.00 31.14           C  
+ATOM   1374  O   THR A 433      39.674  64.227  47.102  1.00 30.59           O  
+ATOM   1375  CB  THR A 433      38.969  62.887  50.076  1.00 33.21           C  
+ATOM   1376  OG1 THR A 433      39.575  62.507  51.319  1.00 37.31           O  
+ATOM   1377  CG2 THR A 433      38.997  61.709  49.120  1.00 37.45           C  
+ATOM   1378  N   THR A 434      37.956  65.127  48.227  1.00 30.55           N  
+ATOM   1379  CA  THR A 434      37.268  65.573  47.012  1.00 28.56           C  
+ATOM   1380  C   THR A 434      38.112  66.567  46.187  1.00 28.35           C  
+ATOM   1381  O   THR A 434      38.352  66.353  44.994  1.00 24.93           O  
+ATOM   1382  CB  THR A 434      35.913  66.235  47.350  1.00 29.51           C  
+ATOM   1383  OG1 THR A 434      35.244  65.458  48.344  1.00 34.62           O  
+ATOM   1384  CG2 THR A 434      35.029  66.286  46.125  1.00 31.28           C  
+ATOM   1385  N   LEU A 435      38.572  67.646  46.817  1.00 28.59           N  
+ATOM   1386  CA  LEU A 435      39.358  68.623  46.081  1.00 28.57           C  
+ATOM   1387  C   LEU A 435      40.631  67.974  45.542  1.00 29.16           C  
+ATOM   1388  O   LEU A 435      41.025  68.203  44.397  1.00 29.25           O  
+ATOM   1389  CB  LEU A 435      39.708  69.835  46.962  1.00 27.52           C  
+ATOM   1390  CG  LEU A 435      40.379  70.983  46.170  1.00 28.42           C  
+ATOM   1391  CD1 LEU A 435      39.458  71.426  45.025  1.00 26.90           C  
+ATOM   1392  CD2 LEU A 435      40.688  72.152  47.085  1.00 25.70           C  
+ATOM   1393  N   ALA A 436      41.264  67.149  46.365  1.00 29.72           N  
+ATOM   1394  CA  ALA A 436      42.495  66.489  45.955  1.00 30.34           C  
+ATOM   1395  C   ALA A 436      42.294  65.567  44.752  1.00 28.16           C  
+ATOM   1396  O   ALA A 436      43.224  65.334  43.965  1.00 26.88           O  
+ATOM   1397  CB  ALA A 436      43.080  65.719  47.125  1.00 32.21           C  
+ATOM   1398  N   ALA A 437      41.078  65.049  44.615  1.00 24.35           N  
+ATOM   1399  CA  ALA A 437      40.734  64.162  43.511  1.00 22.91           C  
+ATOM   1400  C   ALA A 437      40.536  64.974  42.228  1.00 24.56           C  
+ATOM   1401  O   ALA A 437      41.082  64.658  41.172  1.00 24.07           O  
+ATOM   1402  CB  ALA A 437      39.471  63.405  43.853  1.00 21.00           C  
+ATOM   1403  N   ALA A 438      39.743  66.028  42.325  1.00 24.75           N  
+ATOM   1404  CA  ALA A 438      39.500  66.888  41.181  1.00 24.65           C  
+ATOM   1405  C   ALA A 438      40.826  67.490  40.738  1.00 23.95           C  
+ATOM   1406  O   ALA A 438      41.113  67.570  39.548  1.00 23.71           O  
+ATOM   1407  CB  ALA A 438      38.523  67.997  41.567  1.00 24.36           C  
+ATOM   1408  N   LEU A 439      41.631  67.927  41.703  1.00 25.94           N  
+ATOM   1409  CA  LEU A 439      42.933  68.510  41.390  1.00 26.91           C  
+ATOM   1410  C   LEU A 439      43.793  67.499  40.616  1.00 28.33           C  
+ATOM   1411  O   LEU A 439      44.438  67.836  39.621  1.00 28.13           O  
+ATOM   1412  CB  LEU A 439      43.637  68.951  42.677  1.00 22.58           C  
+ATOM   1413  CG  LEU A 439      43.188  70.286  43.306  1.00 23.24           C  
+ATOM   1414  CD1 LEU A 439      44.031  70.562  44.561  1.00 20.97           C  
+ATOM   1415  CD2 LEU A 439      43.342  71.452  42.312  1.00 19.53           C  
+ATOM   1416  N   LEU A 440      43.766  66.250  41.067  1.00 33.02           N  
+ATOM   1417  CA  LEU A 440      44.522  65.200  40.407  1.00 35.72           C  
+ATOM   1418  C   LEU A 440      44.072  65.077  38.957  1.00 36.00           C  
+ATOM   1419  O   LEU A 440      44.883  65.115  38.041  1.00 34.66           O  
+ATOM   1420  CB  LEU A 440      44.308  63.865  41.112  1.00 36.87           C  
+ATOM   1421  CG  LEU A 440      45.604  63.094  41.349  1.00 40.35           C  
+ATOM   1422  CD1 LEU A 440      45.275  61.700  41.830  1.00 39.22           C  
+ATOM   1423  CD2 LEU A 440      46.432  63.046  40.063  1.00 40.57           C  
+ATOM   1424  N   GLU A 441      42.767  64.934  38.764  1.00 35.88           N  
+ATOM   1425  CA  GLU A 441      42.201  64.799  37.431  1.00 34.50           C  
+ATOM   1426  C   GLU A 441      42.362  66.077  36.608  1.00 33.18           C  
+ATOM   1427  O   GLU A 441      42.394  66.028  35.375  1.00 31.37           O  
+ATOM   1428  CB  GLU A 441      40.724  64.422  37.527  1.00 35.60           C  
+ATOM   1429  CG  GLU A 441      40.008  64.360  36.193  1.00 42.03           C  
+ATOM   1430  CD  GLU A 441      38.557  63.926  36.333  1.00 45.81           C  
+ATOM   1431  OE1 GLU A 441      37.726  64.274  35.458  1.00 47.50           O  
+ATOM   1432  OE2 GLU A 441      38.248  63.227  37.319  1.00 47.92           O  
+ATOM   1433  N   LEU A 442      42.471  67.221  37.278  1.00 31.15           N  
+ATOM   1434  CA  LEU A 442      42.631  68.473  36.551  1.00 29.12           C  
+ATOM   1435  C   LEU A 442      44.019  68.518  35.957  1.00 30.61           C  
+ATOM   1436  O   LEU A 442      44.211  69.034  34.863  1.00 30.16           O  
+ATOM   1437  CB  LEU A 442      42.444  69.680  37.473  1.00 26.28           C  
+ATOM   1438  CG  LEU A 442      42.524  71.083  36.841  1.00 24.61           C  
+ATOM   1439  CD1 LEU A 442      41.331  71.321  35.914  1.00 21.36           C  
+ATOM   1440  CD2 LEU A 442      42.525  72.151  37.942  1.00 23.29           C  
+ATOM   1441  N   CYS A 443      44.981  67.936  36.667  1.00 35.93           N  
+ATOM   1442  CA  CYS A 443      46.373  67.954  36.227  1.00 39.99           C  
+ATOM   1443  C   CYS A 443      46.940  66.675  35.659  1.00 41.61           C  
+ATOM   1444  O   CYS A 443      47.911  66.717  34.904  1.00 44.32           O  
+ATOM   1445  CB  CYS A 443      47.271  68.385  37.381  1.00 40.22           C  
+ATOM   1446  SG  CYS A 443      46.777  69.948  38.115  1.00 43.25           S  
+ATOM   1447  N   GLY A 444      46.342  65.545  36.011  1.00 43.27           N  
+ATOM   1448  CA  GLY A 444      46.866  64.277  35.544  1.00 44.42           C  
+ATOM   1449  C   GLY A 444      47.965  63.884  36.516  1.00 44.11           C  
+ATOM   1450  O   GLY A 444      48.694  64.735  37.020  1.00 47.39           O  
+ATOM   1451  N   GLY A 445      48.092  62.599  36.795  1.00 42.70           N  
+ATOM   1452  CA  GLY A 445      49.107  62.170  37.738  1.00 39.56           C  
+ATOM   1453  C   GLY A 445      48.577  61.042  38.597  1.00 39.53           C  
+ATOM   1454  O   GLY A 445      47.368  60.835  38.683  1.00 34.21           O  
+ATOM   1455  N   LYS A 446      49.467  60.306  39.245  1.00 40.27           N  
+ATOM   1456  CA  LYS A 446      49.014  59.191  40.058  1.00 39.57           C  
+ATOM   1457  C   LYS A 446      49.036  59.452  41.564  1.00 37.20           C  
+ATOM   1458  O   LYS A 446      49.789  60.296  42.070  1.00 32.87           O  
+ATOM   1459  CB  LYS A 446      49.849  57.946  39.736  1.00 46.40           C  
+ATOM   1460  CG  LYS A 446      49.968  57.632  38.239  1.00 60.03           C  
+ATOM   1461  CD  LYS A 446      48.628  57.281  37.597  1.00 66.89           C  
+ATOM   1462  CE  LYS A 446      48.106  55.925  38.070  1.00 71.12           C  
+ATOM   1463  NZ  LYS A 446      46.724  55.613  37.556  1.00 71.25           N  
+ATOM   1464  N   ALA A 447      48.175  58.733  42.272  1.00 35.71           N  
+ATOM   1465  CA  ALA A 447      48.125  58.832  43.719  1.00 34.62           C  
+ATOM   1466  C   ALA A 447      49.059  57.726  44.172  1.00 34.60           C  
+ATOM   1467  O   ALA A 447      49.251  56.744  43.446  1.00 36.80           O  
+ATOM   1468  CB  ALA A 447      46.724  58.570  44.221  1.00 34.78           C  
+ATOM   1469  N   LEU A 448      49.650  57.876  45.350  1.00 33.19           N  
+ATOM   1470  CA  LEU A 448      50.563  56.858  45.840  1.00 32.37           C  
+ATOM   1471  C   LEU A 448      50.241  56.600  47.308  1.00 33.49           C  
+ATOM   1472  O   LEU A 448      49.623  57.434  47.971  1.00 29.81           O  
+ATOM   1473  CB  LEU A 448      52.021  57.327  45.668  1.00 31.16           C  
+ATOM   1474  CG  LEU A 448      52.411  58.000  44.333  1.00 30.55           C  
+ATOM   1475  CD1 LEU A 448      53.903  58.239  44.288  1.00 32.88           C  
+ATOM   1476  CD2 LEU A 448      52.025  57.141  43.165  1.00 31.48           C  
+ATOM   1477  N   ASN A 449      50.642  55.440  47.815  1.00 35.09           N  
+ATOM   1478  CA  ASN A 449      50.383  55.101  49.207  1.00 35.57           C  
+ATOM   1479  C   ASN A 449      51.662  54.765  49.946  1.00 36.22           C  
+ATOM   1480  O   ASN A 449      52.248  53.716  49.734  1.00 35.06           O  
+ATOM   1481  CB  ASN A 449      49.425  53.928  49.300  1.00 38.86           C  
+ATOM   1482  CG  ASN A 449      49.323  53.403  50.693  1.00 44.90           C  
+ATOM   1483  OD1 ASN A 449      50.193  52.669  51.143  1.00 48.69           O  
+ATOM   1484  ND2 ASN A 449      48.276  53.800  51.406  1.00 49.22           N  
+ATOM   1485  N   VAL A 450      52.081  55.667  50.824  1.00 40.03           N  
+ATOM   1486  CA  VAL A 450      53.311  55.510  51.590  1.00 41.32           C  
+ATOM   1487  C   VAL A 450      53.086  54.799  52.924  1.00 43.14           C  
+ATOM   1488  O   VAL A 450      53.962  54.787  53.780  1.00 46.98           O  
+ATOM   1489  CB  VAL A 450      53.945  56.894  51.844  1.00 40.29           C  
+ATOM   1490  CG1 VAL A 450      55.287  56.758  52.495  1.00 43.35           C  
+ATOM   1491  CG2 VAL A 450      54.111  57.616  50.551  1.00 41.70           C  
+ATOM   1492  N   ASN A 451      51.906  54.212  53.103  1.00 49.01           N  
+ATOM   1493  CA  ASN A 451      51.595  53.496  54.337  1.00 53.05           C  
+ATOM   1494  C   ASN A 451      51.985  52.044  54.149  1.00 55.55           C  
+ATOM   1495  O   ASN A 451      51.192  51.131  54.370  1.00 60.01           O  
+ATOM   1496  CB  ASN A 451      50.110  53.611  54.647  1.00 51.69           C  
+ATOM   1497  CG  ASN A 451      49.703  55.025  55.000  1.00 50.87           C  
+ATOM   1498  OD1 ASN A 451      50.163  55.580  55.996  1.00 48.70           O  
+ATOM   1499  ND2 ASN A 451      48.836  55.619  54.183  1.00 49.34           N  
+ATOM   1500  N   LEU A 452      53.224  51.847  53.721  1.00 58.16           N  
+ATOM   1501  CA  LEU A 452      53.748  50.517  53.468  1.00 59.46           C  
+ATOM   1502  C   LEU A 452      55.043  50.256  54.227  1.00 60.46           C  
+ATOM   1503  O   LEU A 452      55.661  51.180  54.780  1.00 57.07           O  
+ATOM   1504  CB  LEU A 452      53.991  50.332  51.969  1.00 60.08           C  
+ATOM   1505  CG  LEU A 452      52.770  50.476  51.059  1.00 61.67           C  
+ATOM   1506  CD1 LEU A 452      53.172  50.190  49.620  1.00 62.13           C  
+ATOM   1507  CD2 LEU A 452      51.675  49.518  51.512  1.00 62.46           C  
+ATOM   1508  N   PRO A 453      55.457  48.979  54.285  1.00 59.30           N  
+ATOM   1509  CA  PRO A 453      56.693  48.617  54.985  1.00 58.73           C  
+ATOM   1510  C   PRO A 453      57.861  49.248  54.247  1.00 58.83           C  
+ATOM   1511  O   PRO A 453      57.962  49.132  53.025  1.00 57.49           O  
+ATOM   1512  CB  PRO A 453      56.691  47.097  54.909  1.00 58.78           C  
+ATOM   1513  CG  PRO A 453      55.210  46.783  54.935  1.00 58.69           C  
+ATOM   1514  CD  PRO A 453      54.686  47.775  53.931  1.00 57.45           C  
+ATOM   1515  N   LEU A 454      58.727  49.920  54.997  1.00 59.85           N  
+ATOM   1516  CA  LEU A 454      59.882  50.617  54.440  1.00 62.91           C  
+ATOM   1517  C   LEU A 454      60.562  49.959  53.232  1.00 68.80           C  
+ATOM   1518  O   LEU A 454      61.347  50.600  52.541  1.00 65.23           O  
+ATOM   1519  CB  LEU A 454      60.917  50.854  55.546  1.00 61.42           C  
+ATOM   1520  CG  LEU A 454      61.971  51.917  55.224  1.00 61.53           C  
+ATOM   1521  CD1 LEU A 454      61.399  53.318  55.490  1.00 60.23           C  
+ATOM   1522  CD2 LEU A 454      63.211  51.671  56.067  1.00 60.79           C  
+ATOM   1523  N   ASP A 455      60.259  48.690  52.975  1.00 77.64           N  
+ATOM   1524  CA  ASP A 455      60.858  47.960  51.857  1.00 81.59           C  
+ATOM   1525  C   ASP A 455      59.929  47.896  50.650  1.00 80.32           C  
+ATOM   1526  O   ASP A 455      60.384  47.777  49.512  1.00 72.73           O  
+ATOM   1527  CB  ASP A 455      61.207  46.539  52.290  1.00 97.12           C  
+ATOM   1528  CG  ASP A 455      61.694  46.476  53.719  1.00119.52           C  
+ATOM   1529  OD1 ASP A 455      62.749  47.078  54.021  1.00131.43           O  
+ATOM   1530  OD2 ASP A 455      61.012  45.828  54.543  1.00131.16           O  
+ATOM   1531  N   ARG A 456      58.625  47.958  50.909  1.00 77.80           N  
+ATOM   1532  CA  ARG A 456      57.620  47.924  49.851  1.00 73.16           C  
+ATOM   1533  C   ARG A 456      57.471  49.314  49.217  1.00 67.15           C  
+ATOM   1534  O   ARG A 456      56.876  49.469  48.151  1.00 67.41           O  
+ATOM   1535  CB  ARG A 456      56.267  47.465  50.417  1.00 78.55           C  
+ATOM   1536  CG  ARG A 456      56.309  46.146  51.183  1.00 89.39           C  
+ATOM   1537  CD  ARG A 456      55.161  45.218  50.769  1.00 94.81           C  
+ATOM   1538  NE  ARG A 456      55.130  43.977  51.549  1.00 97.11           N  
+ATOM   1539  CZ  ARG A 456      54.503  43.831  52.716  1.00 96.88           C  
+ATOM   1540  NH1 ARG A 456      53.841  44.848  53.250  1.00 96.76           N  
+ATOM   1541  NH2 ARG A 456      54.536  42.667  53.350  1.00 96.07           N  
+ATOM   1542  N   LEU A 457      58.031  50.316  49.886  1.00 60.00           N  
+ATOM   1543  CA  LEU A 457      57.973  51.705  49.437  1.00 55.70           C  
+ATOM   1544  C   LEU A 457      58.371  51.911  47.960  1.00 57.21           C  
+ATOM   1545  O   LEU A 457      57.507  52.104  47.104  1.00 57.05           O  
+ATOM   1546  CB  LEU A 457      58.856  52.563  50.360  1.00 46.96           C  
+ATOM   1547  CG  LEU A 457      58.436  53.997  50.720  1.00 38.08           C  
+ATOM   1548  CD1 LEU A 457      56.939  54.042  50.994  1.00 33.65           C  
+ATOM   1549  CD2 LEU A 457      59.221  54.485  51.939  1.00 31.33           C  
+ATOM   1550  N   ASN A 458      59.671  51.860  47.674  1.00 57.81           N  
+ATOM   1551  CA  ASN A 458      60.219  52.049  46.324  1.00 59.86           C  
+ATOM   1552  C   ASN A 458      59.365  51.619  45.119  1.00 63.06           C  
+ATOM   1553  O   ASN A 458      59.319  52.330  44.108  1.00 57.73           O  
+ATOM   1554  CB  ASN A 458      61.587  51.366  46.229  1.00 63.26           C  
+ATOM   1555  CG  ASN A 458      62.650  52.065  47.060  1.00 68.14           C  
+ATOM   1556  OD1 ASN A 458      63.027  53.203  46.774  1.00 70.50           O  
+ATOM   1557  ND2 ASN A 458      63.141  51.384  48.096  1.00 70.20           N  
+ATOM   1558  N   PHE A 459      58.721  50.454  45.207  1.00 66.24           N  
+ATOM   1559  CA  PHE A 459      57.866  49.950  44.119  1.00 67.09           C  
+ATOM   1560  C   PHE A 459      56.825  51.037  43.843  1.00 63.56           C  
+ATOM   1561  O   PHE A 459      56.664  51.503  42.714  1.00 61.87           O  
+ATOM   1562  CB  PHE A 459      57.173  48.652  44.577  1.00 76.64           C  
+ATOM   1563  CG  PHE A 459      56.452  47.892  43.482  1.00 90.28           C  
+ATOM   1564  CD1 PHE A 459      57.129  47.452  42.344  1.00 95.54           C  
+ATOM   1565  CD2 PHE A 459      55.109  47.538  43.637  1.00 95.52           C  
+ATOM   1566  CE1 PHE A 459      56.476  46.665  41.380  1.00 97.44           C  
+ATOM   1567  CE2 PHE A 459      54.451  46.752  42.681  1.00 97.48           C  
+ATOM   1568  CZ  PHE A 459      55.137  46.314  41.552  1.00 97.53           C  
+ATOM   1569  N   GLU A 460      56.142  51.438  44.915  1.00 59.04           N  
+ATOM   1570  CA  GLU A 460      55.105  52.462  44.881  1.00 55.09           C  
+ATOM   1571  C   GLU A 460      55.678  53.778  44.357  1.00 51.99           C  
+ATOM   1572  O   GLU A 460      55.151  54.351  43.406  1.00 52.49           O  
+ATOM   1573  CB  GLU A 460      54.538  52.659  46.294  1.00 55.44           C  
+ATOM   1574  CG  GLU A 460      53.302  53.547  46.392  1.00 54.52           C  
+ATOM   1575  CD  GLU A 460      51.999  52.774  46.265  1.00 54.08           C  
+ATOM   1576  OE1 GLU A 460      51.831  51.774  47.001  1.00 54.18           O  
+ATOM   1577  OE2 GLU A 460      51.139  53.168  45.443  1.00 52.93           O  
+ATOM   1578  N   LEU A 461      56.763  54.248  44.969  1.00 44.37           N  
+ATOM   1579  CA  LEU A 461      57.389  55.500  44.553  1.00 37.91           C  
+ATOM   1580  C   LEU A 461      57.727  55.536  43.062  1.00 36.85           C  
+ATOM   1581  O   LEU A 461      57.846  56.614  42.471  1.00 32.48           O  
+ATOM   1582  CB  LEU A 461      58.664  55.754  45.351  1.00 32.89           C  
+ATOM   1583  CG  LEU A 461      58.590  55.999  46.859  1.00 28.90           C  
+ATOM   1584  CD1 LEU A 461      60.001  56.190  47.395  1.00 27.67           C  
+ATOM   1585  CD2 LEU A 461      57.743  57.230  47.173  1.00 26.32           C  
+ATOM   1586  N   GLY A 462      57.882  54.360  42.456  1.00 35.79           N  
+ATOM   1587  CA  GLY A 462      58.212  54.287  41.040  1.00 37.35           C  
+ATOM   1588  C   GLY A 462      57.044  54.651  40.152  1.00 39.12           C  
+ATOM   1589  O   GLY A 462      57.226  55.044  39.003  1.00 38.84           O  
+ATOM   1590  N   VAL A 463      55.840  54.509  40.696  1.00 41.77           N  
+ATOM   1591  CA  VAL A 463      54.609  54.828  39.980  1.00 41.45           C  
+ATOM   1592  C   VAL A 463      54.616  56.255  39.448  1.00 39.76           C  
+ATOM   1593  O   VAL A 463      54.061  56.537  38.385  1.00 39.83           O  
+ATOM   1594  CB  VAL A 463      53.384  54.666  40.910  1.00 43.86           C  
+ATOM   1595  CG1 VAL A 463      52.119  55.177  40.221  1.00 46.49           C  
+ATOM   1596  CG2 VAL A 463      53.230  53.205  41.299  1.00 47.59           C  
+ATOM   1597  N   ALA A 464      55.253  57.142  40.204  1.00 36.92           N  
+ATOM   1598  CA  ALA A 464      55.345  58.557  39.872  1.00 35.38           C  
+ATOM   1599  C   ALA A 464      56.178  58.867  38.628  1.00 35.94           C  
+ATOM   1600  O   ALA A 464      56.262  60.018  38.198  1.00 37.48           O  
+ATOM   1601  CB  ALA A 464      55.897  59.300  41.056  1.00 32.61           C  
+ATOM   1602  N   ILE A 465      56.793  57.845  38.053  1.00 37.14           N  
+ATOM   1603  CA  ILE A 465      57.616  58.028  36.872  1.00 38.23           C  
+ATOM   1604  C   ILE A 465      56.850  58.674  35.730  1.00 41.29           C  
+ATOM   1605  O   ILE A 465      55.728  58.281  35.438  1.00 41.49           O  
+ATOM   1606  CB  ILE A 465      58.209  56.671  36.427  1.00 36.25           C  
+ATOM   1607  CG1 ILE A 465      59.476  56.395  37.241  1.00 33.89           C  
+ATOM   1608  CG2 ILE A 465      58.499  56.659  34.927  1.00 33.71           C  
+ATOM   1609  CD1 ILE A 465      60.130  55.073  36.931  1.00 34.55           C  
+ATOM   1610  N   ASP A 466      57.465  59.671  35.094  1.00 45.08           N  
+ATOM   1611  CA  ASP A 466      56.865  60.382  33.962  1.00 48.18           C  
+ATOM   1612  C   ASP A 466      55.600  61.171  34.307  1.00 47.91           C  
+ATOM   1613  O   ASP A 466      54.991  61.770  33.418  1.00 49.70           O  
+ATOM   1614  CB  ASP A 466      56.548  59.394  32.829  1.00 54.16           C  
+ATOM   1615  CG  ASP A 466      57.796  58.922  32.087  1.00 62.44           C  
+ATOM   1616  OD1 ASP A 466      58.811  58.634  32.754  1.00 65.42           O  
+ATOM   1617  OD2 ASP A 466      57.760  58.827  30.837  1.00 65.51           O  
+ATOM   1618  N   GLN A 467      55.215  61.185  35.584  1.00 45.79           N  
+ATOM   1619  CA  GLN A 467      54.006  61.884  36.024  1.00 43.12           C  
+ATOM   1620  C   GLN A 467      54.139  63.399  36.176  1.00 41.81           C  
+ATOM   1621  O   GLN A 467      55.230  63.921  36.420  1.00 42.34           O  
+ATOM   1622  CB  GLN A 467      53.515  61.295  37.348  1.00 42.30           C  
+ATOM   1623  CG  GLN A 467      53.136  59.844  37.261  1.00 40.84           C  
+ATOM   1624  CD  GLN A 467      52.066  59.593  36.227  1.00 40.24           C  
+ATOM   1625  OE1 GLN A 467      51.844  58.461  35.825  1.00 41.83           O  
+ATOM   1626  NE2 GLN A 467      51.391  60.651  35.794  1.00 41.54           N  
+ATOM   1627  N   PHE A 468      53.011  64.096  36.037  1.00 39.15           N  
+ATOM   1628  CA  PHE A 468      52.978  65.551  36.163  1.00 36.91           C  
+ATOM   1629  C   PHE A 468      52.978  65.902  37.634  1.00 36.42           C  
+ATOM   1630  O   PHE A 468      53.745  66.747  38.090  1.00 38.57           O  
+ATOM   1631  CB  PHE A 468      51.720  66.127  35.528  1.00 34.90           C  
+ATOM   1632  CG  PHE A 468      51.656  67.627  35.569  1.00 35.97           C  
+ATOM   1633  CD1 PHE A 468      52.425  68.396  34.695  1.00 36.53           C  
+ATOM   1634  CD2 PHE A 468      50.825  68.278  36.479  1.00 37.27           C  
+ATOM   1635  CE1 PHE A 468      52.365  69.797  34.718  1.00 36.31           C  
+ATOM   1636  CE2 PHE A 468      50.756  69.680  36.516  1.00 36.90           C  
+ATOM   1637  CZ  PHE A 468      51.530  70.444  35.629  1.00 36.82           C  
+ATOM   1638  N   LEU A 469      52.092  65.262  38.381  1.00 34.84           N  
+ATOM   1639  CA  LEU A 469      52.029  65.510  39.808  1.00 33.60           C  
+ATOM   1640  C   LEU A 469      51.598  64.240  40.505  1.00 32.91           C  
+ATOM   1641  O   LEU A 469      51.053  63.319  39.895  1.00 33.15           O  
+ATOM   1642  CB  LEU A 469      51.059  66.660  40.140  1.00 31.26           C  
+ATOM   1643  CG  LEU A 469      49.548  66.444  40.041  1.00 26.83           C  
+ATOM   1644  CD1 LEU A 469      49.030  65.673  41.233  1.00 27.39           C  
+ATOM   1645  CD2 LEU A 469      48.875  67.787  40.004  1.00 27.02           C  
+ATOM   1646  N   VAL A 470      51.851  64.205  41.801  1.00 31.41           N  
+ATOM   1647  CA  VAL A 470      51.516  63.057  42.603  1.00 30.26           C  
+ATOM   1648  C   VAL A 470      50.679  63.476  43.811  1.00 29.10           C  
+ATOM   1649  O   VAL A 470      50.793  64.604  44.301  1.00 29.60           O  
+ATOM   1650  CB  VAL A 470      52.821  62.357  43.044  1.00 26.81           C  
+ATOM   1651  CG1 VAL A 470      52.548  61.308  44.092  1.00 24.49           C  
+ATOM   1652  CG2 VAL A 470      53.476  61.734  41.824  1.00 23.72           C  
+ATOM   1653  N   VAL A 471      49.805  62.575  44.254  1.00 26.97           N  
+ATOM   1654  CA  VAL A 471      48.995  62.834  45.429  1.00 26.13           C  
+ATOM   1655  C   VAL A 471      49.145  61.702  46.438  1.00 25.75           C  
+ATOM   1656  O   VAL A 471      48.664  60.592  46.211  1.00 25.66           O  
+ATOM   1657  CB  VAL A 471      47.520  62.954  45.099  1.00 25.15           C  
+ATOM   1658  CG1 VAL A 471      46.728  62.939  46.391  1.00 23.20           C  
+ATOM   1659  CG2 VAL A 471      47.250  64.247  44.327  1.00 23.35           C  
+ATOM   1660  N   PHE A 472      49.826  61.991  47.545  1.00 24.20           N  
+ATOM   1661  CA  PHE A 472      50.028  61.022  48.619  1.00 24.12           C  
+ATOM   1662  C   PHE A 472      48.729  60.942  49.426  1.00 26.41           C  
+ATOM   1663  O   PHE A 472      48.539  61.694  50.378  1.00 24.01           O  
+ATOM   1664  CB  PHE A 472      51.169  61.477  49.528  1.00 23.65           C  
+ATOM   1665  CG  PHE A 472      52.544  61.343  48.911  1.00 22.85           C  
+ATOM   1666  CD1 PHE A 472      53.155  60.099  48.807  1.00 22.02           C  
+ATOM   1667  CD2 PHE A 472      53.241  62.465  48.449  1.00 21.24           C  
+ATOM   1668  CE1 PHE A 472      54.444  59.974  48.252  1.00 21.27           C  
+ATOM   1669  CE2 PHE A 472      54.532  62.343  47.894  1.00 19.87           C  
+ATOM   1670  CZ  PHE A 472      55.125  61.106  47.798  1.00 19.62           C  
+ATOM   1671  N   GLU A 473      47.853  60.018  49.036  1.00 31.45           N  
+ATOM   1672  CA  GLU A 473      46.556  59.829  49.675  1.00 35.63           C  
+ATOM   1673  C   GLU A 473      46.561  59.340  51.109  1.00 39.67           C  
+ATOM   1674  O   GLU A 473      47.068  58.266  51.405  1.00 37.76           O  
+ATOM   1675  CB  GLU A 473      45.701  58.850  48.887  1.00 37.58           C  
+ATOM   1676  CG  GLU A 473      45.139  59.355  47.603  1.00 43.95           C  
+ATOM   1677  CD  GLU A 473      44.237  58.314  46.968  1.00 47.85           C  
+ATOM   1678  OE1 GLU A 473      44.166  57.189  47.513  1.00 48.92           O  
+ATOM   1679  OE2 GLU A 473      43.607  58.611  45.931  1.00 48.93           O  
+ATOM   1680  N   ASP A 474      45.944  60.124  51.984  1.00 46.13           N  
+ATOM   1681  CA  ASP A 474      45.810  59.799  53.398  1.00 49.06           C  
+ATOM   1682  C   ASP A 474      47.011  59.131  54.043  1.00 46.09           C  
+ATOM   1683  O   ASP A 474      47.059  57.909  54.203  1.00 44.28           O  
+ATOM   1684  CB  ASP A 474      44.574  58.928  53.611  1.00 60.47           C  
+ATOM   1685  CG  ASP A 474      44.394  58.533  55.057  1.00 75.79           C  
+ATOM   1686  OD1 ASP A 474      44.505  59.421  55.935  1.00 82.76           O  
+ATOM   1687  OD2 ASP A 474      44.140  57.336  55.312  1.00 83.07           O  
+ATOM   1688  N   VAL A 475      47.980  59.952  54.420  1.00 40.05           N  
+ATOM   1689  CA  VAL A 475      49.174  59.465  55.064  1.00 33.79           C  
+ATOM   1690  C   VAL A 475      48.797  59.277  56.514  1.00 34.24           C  
+ATOM   1691  O   VAL A 475      48.030  60.063  57.062  1.00 31.38           O  
+ATOM   1692  CB  VAL A 475      50.296  60.498  54.946  1.00 30.34           C  
+ATOM   1693  CG1 VAL A 475      51.589  59.950  55.559  1.00 28.93           C  
+ATOM   1694  CG2 VAL A 475      50.489  60.858  53.475  1.00 28.17           C  
+ATOM   1695  N   LYS A 476      49.319  58.235  57.139  1.00 35.78           N  
+ATOM   1696  CA  LYS A 476      49.007  57.992  58.541  1.00 36.45           C  
+ATOM   1697  C   LYS A 476      50.241  58.127  59.420  1.00 36.10           C  
+ATOM   1698  O   LYS A 476      51.339  57.743  59.023  1.00 32.93           O  
+ATOM   1699  CB  LYS A 476      48.366  56.610  58.702  1.00 41.99           C  
+ATOM   1700  CG  LYS A 476      46.973  56.519  58.087  1.00 51.65           C  
+ATOM   1701  CD  LYS A 476      46.336  55.161  58.324  1.00 57.32           C  
+ATOM   1702  CE  LYS A 476      47.140  54.039  57.666  1.00 60.18           C  
+ATOM   1703  NZ  LYS A 476      46.566  52.682  57.929  1.00 59.98           N  
+ATOM   1704  N   GLY A 477      50.047  58.693  60.610  1.00 37.04           N  
+ATOM   1705  CA  GLY A 477      51.147  58.891  61.540  1.00 39.86           C  
+ATOM   1706  C   GLY A 477      51.077  58.002  62.767  1.00 42.88           C  
+ATOM   1707  O   GLY A 477      50.322  57.032  62.797  1.00 41.28           O  
+ATOM   1708  N   THR A 478      51.862  58.332  63.785  1.00 51.32           N  
+ATOM   1709  CA  THR A 478      51.868  57.536  64.999  1.00 58.31           C  
+ATOM   1710  C   THR A 478      51.035  58.159  66.110  1.00 61.69           C  
+ATOM   1711  O   THR A 478      49.811  57.996  66.144  1.00 67.19           O  
+ATOM   1712  CB  THR A 478      53.299  57.317  65.505  1.00 59.03           C  
+ATOM   1713  OG1 THR A 478      54.046  56.610  64.511  1.00 60.57           O  
+ATOM   1714  CG2 THR A 478      53.293  56.489  66.784  1.00 62.62           C  
+ATOM   1715  N   GLY A 479      51.703  58.867  67.012  1.00 64.56           N  
+ATOM   1716  CA  GLY A 479      51.026  59.507  68.124  1.00 67.85           C  
+ATOM   1717  C   GLY A 479      49.540  59.241  68.338  1.00 67.85           C  
+ATOM   1718  O   GLY A 479      49.129  58.156  68.753  1.00 72.71           O  
+ATOM   1719  N   GLY A 480      48.742  60.261  68.037  1.00 66.17           N  
+ATOM   1720  CA  GLY A 480      47.296  60.245  68.208  1.00 58.48           C  
+ATOM   1721  C   GLY A 480      46.328  59.077  68.065  1.00 56.07           C  
+ATOM   1722  O   GLY A 480      45.471  59.097  67.187  1.00 49.76           O  
+ATOM   1723  N   GLU A 481      46.409  58.088  68.944  1.00 54.74           N  
+ATOM   1724  CA  GLU A 481      45.477  56.963  68.890  1.00 54.80           C  
+ATOM   1725  C   GLU A 481      44.373  57.227  69.922  1.00 53.97           C  
+ATOM   1726  O   GLU A 481      43.368  56.506  69.974  1.00 49.04           O  
+ATOM   1727  CB  GLU A 481      46.182  55.642  69.220  1.00 61.10           C  
+ATOM   1728  CG  GLU A 481      46.777  55.596  70.624  1.00 76.28           C  
+ATOM   1729  CD  GLU A 481      47.046  54.186  71.119  1.00 82.33           C  
+ATOM   1730  OE1 GLU A 481      47.865  53.478  70.491  1.00 84.24           O  
+ATOM   1731  OE2 GLU A 481      46.437  53.790  72.141  1.00 83.95           O  
+ATOM   1732  N   SER A 482      44.574  58.268  70.738  1.00 51.75           N  
+ATOM   1733  CA  SER A 482      43.618  58.670  71.779  1.00 48.00           C  
+ATOM   1734  C   SER A 482      42.416  59.372  71.166  1.00 47.38           C  
+ATOM   1735  O   SER A 482      41.348  59.458  71.773  1.00 45.39           O  
+ATOM   1736  CB  SER A 482      44.281  59.620  72.762  1.00 46.01           C  
+ATOM   1737  OG  SER A 482      45.393  59.005  73.358  1.00 52.47           O  
+ATOM   1738  N   ARG A 483      42.605  59.881  69.956  1.00 48.45           N  
+ATOM   1739  CA  ARG A 483      41.547  60.567  69.255  1.00 49.36           C  
+ATOM   1740  C   ARG A 483      40.994  59.660  68.161  1.00 51.97           C  
+ATOM   1741  O   ARG A 483      40.381  60.126  67.196  1.00 52.34           O  
+ATOM   1742  CB  ARG A 483      42.084  61.870  68.671  1.00 47.17           C  
+ATOM   1743  CG  ARG A 483      42.790  62.747  69.693  1.00 46.02           C  
+ATOM   1744  CD  ARG A 483      44.093  63.238  69.109  1.00 46.36           C  
+ATOM   1745  NE  ARG A 483      43.864  63.868  67.813  1.00 46.74           N  
+ATOM   1746  CZ  ARG A 483      44.810  64.094  66.910  1.00 46.12           C  
+ATOM   1747  NH1 ARG A 483      46.060  63.736  67.157  1.00 46.83           N  
+ATOM   1748  NH2 ARG A 483      44.507  64.687  65.764  1.00 47.46           N  
+ATOM   1749  N   ASP A 484      41.223  58.359  68.321  1.00 57.25           N  
+ATOM   1750  CA  ASP A 484      40.725  57.357  67.385  1.00 61.32           C  
+ATOM   1751  C   ASP A 484      41.302  57.440  65.982  1.00 59.15           C  
+ATOM   1752  O   ASP A 484      40.569  57.534  64.996  1.00 60.35           O  
+ATOM   1753  CB  ASP A 484      39.193  57.422  67.321  1.00 70.82           C  
+ATOM   1754  CG  ASP A 484      38.544  57.235  68.682  1.00 80.85           C  
+ATOM   1755  OD1 ASP A 484      38.734  56.159  69.288  1.00 85.18           O  
+ATOM   1756  OD2 ASP A 484      37.841  58.161  69.143  1.00 84.62           O  
+ATOM   1757  N   LEU A 485      42.624  57.412  65.899  1.00 54.38           N  
+ATOM   1758  CA  LEU A 485      43.311  57.464  64.614  1.00 47.43           C  
+ATOM   1759  C   LEU A 485      44.378  56.369  64.565  1.00 44.51           C  
+ATOM   1760  O   LEU A 485      45.301  56.348  65.381  1.00 46.56           O  
+ATOM   1761  CB  LEU A 485      43.953  58.839  64.419  1.00 41.09           C  
+ATOM   1762  CG  LEU A 485      42.978  60.014  64.356  1.00 31.95           C  
+ATOM   1763  CD1 LEU A 485      43.749  61.307  64.142  1.00 28.14           C  
+ATOM   1764  CD2 LEU A 485      41.993  59.784  63.218  1.00 28.85           C  
+ATOM   1765  N   PRO A 486      44.253  55.442  63.607  1.00 46.51           N  
+ATOM   1766  CA  PRO A 486      45.163  54.313  63.397  1.00 46.48           C  
+ATOM   1767  C   PRO A 486      46.618  54.706  63.183  1.00 46.46           C  
+ATOM   1768  O   PRO A 486      46.918  55.566  62.356  1.00 49.52           O  
+ATOM   1769  CB  PRO A 486      44.577  53.633  62.165  1.00 47.65           C  
+ATOM   1770  CG  PRO A 486      43.125  53.934  62.273  1.00 48.15           C  
+ATOM   1771  CD  PRO A 486      43.132  55.385  62.656  1.00 47.49           C  
+ATOM   1772  N   SER A 487      47.518  54.062  63.922  1.00 45.52           N  
+ATOM   1773  CA  SER A 487      48.952  54.323  63.794  1.00 42.96           C  
+ATOM   1774  C   SER A 487      49.490  53.704  62.510  1.00 42.14           C  
+ATOM   1775  O   SER A 487      49.234  52.531  62.224  1.00 39.93           O  
+ATOM   1776  CB  SER A 487      49.710  53.749  64.996  1.00 40.77           C  
+ATOM   1777  OG  SER A 487      49.359  54.433  66.189  1.00 42.39           O  
+ATOM   1778  N   GLY A 488      50.227  54.496  61.735  1.00 40.33           N  
+ATOM   1779  CA  GLY A 488      50.785  54.007  60.484  1.00 40.29           C  
+ATOM   1780  C   GLY A 488      52.188  54.530  60.332  1.00 40.43           C  
+ATOM   1781  O   GLY A 488      52.613  55.354  61.142  1.00 42.17           O  
+ATOM   1782  N   GLN A 489      52.917  54.073  59.319  1.00 41.28           N  
+ATOM   1783  CA  GLN A 489      54.293  54.542  59.143  1.00 41.70           C  
+ATOM   1784  C   GLN A 489      54.471  55.519  57.978  1.00 40.95           C  
+ATOM   1785  O   GLN A 489      55.585  55.966  57.704  1.00 39.93           O  
+ATOM   1786  CB  GLN A 489      55.262  53.354  58.977  1.00 43.14           C  
+ATOM   1787  CG  GLN A 489      55.499  52.490  60.237  1.00 43.91           C  
+ATOM   1788  CD  GLN A 489      56.128  53.247  61.416  1.00 44.91           C  
+ATOM   1789  OE1 GLN A 489      57.201  53.852  61.299  1.00 43.41           O  
+ATOM   1790  NE2 GLN A 489      55.453  53.203  62.563  1.00 45.44           N  
+ATOM   1791  N   GLY A 490      53.371  55.851  57.307  1.00 40.36           N  
+ATOM   1792  CA  GLY A 490      53.417  56.770  56.181  1.00 38.73           C  
+ATOM   1793  C   GLY A 490      54.117  58.083  56.480  1.00 37.84           C  
+ATOM   1794  O   GLY A 490      55.038  58.471  55.763  1.00 37.01           O  
+ATOM   1795  N   ILE A 491      53.678  58.776  57.528  1.00 37.89           N  
+ATOM   1796  CA  ILE A 491      54.302  60.044  57.898  1.00 40.48           C  
+ATOM   1797  C   ILE A 491      55.789  59.821  58.060  1.00 42.37           C  
+ATOM   1798  O   ILE A 491      56.612  60.572  57.533  1.00 43.73           O  
+ATOM   1799  CB  ILE A 491      53.798  60.579  59.247  1.00 36.60           C  
+ATOM   1800  CG1 ILE A 491      52.342  60.996  59.130  1.00 32.93           C  
+ATOM   1801  CG2 ILE A 491      54.645  61.776  59.679  1.00 31.50           C  
+ATOM   1802  CD1 ILE A 491      52.143  62.144  58.200  1.00 31.28           C  
+ATOM   1803  N   ASN A 492      56.113  58.774  58.810  1.00 46.99           N  
+ATOM   1804  CA  ASN A 492      57.488  58.421  59.087  1.00 49.22           C  
+ATOM   1805  C   ASN A 492      58.288  58.241  57.820  1.00 48.68           C  
+ATOM   1806  O   ASN A 492      59.442  58.646  57.756  1.00 49.53           O  
+ATOM   1807  CB  ASN A 492      57.549  57.147  59.903  1.00 52.76           C  
+ATOM   1808  CG  ASN A 492      58.620  57.203  60.935  1.00 57.16           C  
+ATOM   1809  OD1 ASN A 492      58.485  57.914  61.932  1.00 59.59           O  
+ATOM   1810  ND2 ASN A 492      59.716  56.480  60.701  1.00 59.18           N  
+ATOM   1811  N   ASN A 493      57.676  57.629  56.814  1.00 47.70           N  
+ATOM   1812  CA  ASN A 493      58.354  57.415  55.539  1.00 46.10           C  
+ATOM   1813  C   ASN A 493      58.580  58.738  54.818  1.00 45.42           C  
+ATOM   1814  O   ASN A 493      59.672  58.993  54.330  1.00 44.39           O  
+ATOM   1815  CB  ASN A 493      57.550  56.469  54.637  1.00 44.35           C  
+ATOM   1816  CG  ASN A 493      57.441  55.071  55.208  1.00 42.14           C  
+ATOM   1817  OD1 ASN A 493      58.304  54.641  55.971  1.00 42.16           O  
+ATOM   1818  ND2 ASN A 493      56.392  54.349  54.830  1.00 39.23           N  
+ATOM   1819  N   LEU A 494      57.549  59.575  54.747  1.00 45.56           N  
+ATOM   1820  CA  LEU A 494      57.686  60.868  54.087  1.00 45.58           C  
+ATOM   1821  C   LEU A 494      58.887  61.628  54.637  1.00 46.12           C  
+ATOM   1822  O   LEU A 494      59.647  62.233  53.874  1.00 45.94           O  
+ATOM   1823  CB  LEU A 494      56.423  61.719  54.270  1.00 45.72           C  
+ATOM   1824  CG  LEU A 494      55.250  61.490  53.310  1.00 44.50           C  
+ATOM   1825  CD1 LEU A 494      54.083  62.371  53.719  1.00 43.23           C  
+ATOM   1826  CD2 LEU A 494      55.681  61.798  51.877  1.00 43.55           C  
+ATOM   1827  N   ASP A 495      59.063  61.598  55.956  1.00 46.69           N  
+ATOM   1828  CA  ASP A 495      60.186  62.297  56.564  1.00 48.62           C  
+ATOM   1829  C   ASP A 495      61.506  61.712  56.061  1.00 51.10           C  
+ATOM   1830  O   ASP A 495      62.560  62.346  56.166  1.00 48.01           O  
+ATOM   1831  CB  ASP A 495      60.123  62.205  58.084  1.00 50.47           C  
+ATOM   1832  CG  ASP A 495      60.492  63.517  58.759  1.00 54.31           C  
+ATOM   1833  OD1 ASP A 495      61.458  64.165  58.312  1.00 55.61           O  
+ATOM   1834  OD2 ASP A 495      59.821  63.901  59.741  1.00 57.91           O  
+ATOM   1835  N   ASN A 496      61.445  60.502  55.512  1.00 52.10           N  
+ATOM   1836  CA  ASN A 496      62.632  59.850  54.973  1.00 50.67           C  
+ATOM   1837  C   ASN A 496      62.658  60.034  53.465  1.00 46.98           C  
+ATOM   1838  O   ASN A 496      63.410  59.363  52.773  1.00 45.88           O  
+ATOM   1839  CB  ASN A 496      62.620  58.355  55.280  1.00 58.59           C  
+ATOM   1840  CG  ASN A 496      62.272  58.061  56.718  1.00 69.59           C  
+ATOM   1841  OD1 ASN A 496      62.747  58.733  57.638  1.00 75.17           O  
+ATOM   1842  ND2 ASN A 496      61.443  57.044  56.926  1.00 76.13           N  
+ATOM   1843  N   LEU A 497      61.817  60.926  52.954  1.00 42.93           N  
+ATOM   1844  CA  LEU A 497      61.765  61.178  51.520  1.00 42.16           C  
+ATOM   1845  C   LEU A 497      61.956  62.662  51.196  1.00 48.34           C  
+ATOM   1846  O   LEU A 497      61.498  63.151  50.158  1.00 44.98           O  
+ATOM   1847  CB  LEU A 497      60.442  60.678  50.945  1.00 34.22           C  
+ATOM   1848  CG  LEU A 497      60.168  59.174  51.035  1.00 26.79           C  
+ATOM   1849  CD1 LEU A 497      58.732  58.897  50.583  1.00 24.13           C  
+ATOM   1850  CD2 LEU A 497      61.172  58.406  50.188  1.00 23.58           C  
+ATOM   1851  N   ARG A 498      62.647  63.369  52.089  1.00 57.36           N  
+ATOM   1852  CA  ARG A 498      62.928  64.786  51.898  1.00 62.61           C  
+ATOM   1853  C   ARG A 498      63.463  65.024  50.490  1.00 62.12           C  
+ATOM   1854  O   ARG A 498      63.126  66.019  49.865  1.00 54.57           O  
+ATOM   1855  CB  ARG A 498      63.950  65.269  52.927  1.00 74.56           C  
+ATOM   1856  CG  ARG A 498      65.308  64.623  52.779  1.00 99.94           C  
+ATOM   1857  CD  ARG A 498      66.380  65.434  53.479  1.00112.42           C  
+ATOM   1858  NE  ARG A 498      67.722  64.897  53.248  1.00116.52           N  
+ATOM   1859  CZ  ARG A 498      68.466  65.154  52.173  1.00117.25           C  
+ATOM   1860  NH1 ARG A 498      68.009  65.949  51.213  1.00117.33           N  
+ATOM   1861  NH2 ARG A 498      69.672  64.612  52.058  1.00116.82           N  
+ATOM   1862  N   ASP A 499      64.287  64.098  49.999  1.00 59.10           N  
+ATOM   1863  CA  ASP A 499      64.870  64.181  48.656  1.00 54.82           C  
+ATOM   1864  C   ASP A 499      63.790  64.255  47.584  1.00 50.55           C  
+ATOM   1865  O   ASP A 499      63.803  65.126  46.708  1.00 45.50           O  
+ATOM   1866  CB  ASP A 499      65.733  62.951  48.382  1.00 65.08           C  
+ATOM   1867  CG  ASP A 499      67.164  63.141  48.805  1.00 81.10           C  
+ATOM   1868  OD1 ASP A 499      67.389  63.808  49.835  1.00 89.63           O  
+ATOM   1869  OD2 ASP A 499      68.063  62.614  48.112  1.00 88.92           O  
+ATOM   1870  N   TYR A 500      62.859  63.317  47.653  1.00 42.63           N  
+ATOM   1871  CA  TYR A 500      61.787  63.274  46.691  1.00 35.02           C  
+ATOM   1872  C   TYR A 500      60.927  64.530  46.778  1.00 32.25           C  
+ATOM   1873  O   TYR A 500      60.728  65.222  45.784  1.00 29.31           O  
+ATOM   1874  CB  TYR A 500      60.921  62.029  46.923  1.00 35.29           C  
+ATOM   1875  CG  TYR A 500      61.664  60.720  46.749  1.00 38.26           C  
+ATOM   1876  CD1 TYR A 500      62.622  60.305  47.678  1.00 39.95           C  
+ATOM   1877  CD2 TYR A 500      61.448  59.920  45.625  1.00 39.68           C  
+ATOM   1878  CE1 TYR A 500      63.352  59.127  47.484  1.00 40.39           C  
+ATOM   1879  CE2 TYR A 500      62.169  58.745  45.420  1.00 40.34           C  
+ATOM   1880  CZ  TYR A 500      63.122  58.356  46.349  1.00 40.13           C  
+ATOM   1881  OH  TYR A 500      63.875  57.227  46.117  1.00 39.16           O  
+ATOM   1882  N   LEU A 501      60.436  64.836  47.970  1.00 30.01           N  
+ATOM   1883  CA  LEU A 501      59.558  65.983  48.147  1.00 31.18           C  
+ATOM   1884  C   LEU A 501      60.010  67.339  47.596  1.00 35.38           C  
+ATOM   1885  O   LEU A 501      59.345  67.905  46.720  1.00 33.81           O  
+ATOM   1886  CB  LEU A 501      59.185  66.125  49.626  1.00 28.48           C  
+ATOM   1887  CG  LEU A 501      58.211  65.083  50.188  1.00 26.35           C  
+ATOM   1888  CD1 LEU A 501      58.113  65.252  51.691  1.00 25.75           C  
+ATOM   1889  CD2 LEU A 501      56.845  65.231  49.534  1.00 23.28           C  
+ATOM   1890  N   ASP A 502      61.123  67.875  48.088  1.00 42.45           N  
+ATOM   1891  CA  ASP A 502      61.547  69.181  47.603  1.00 47.26           C  
+ATOM   1892  C   ASP A 502      62.357  69.171  46.321  1.00 46.26           C  
+ATOM   1893  O   ASP A 502      62.699  70.223  45.796  1.00 45.47           O  
+ATOM   1894  CB  ASP A 502      62.295  69.939  48.693  1.00 57.98           C  
+ATOM   1895  CG  ASP A 502      63.244  69.067  49.445  1.00 71.37           C  
+ATOM   1896  OD1 ASP A 502      63.870  68.203  48.800  1.00 78.52           O  
+ATOM   1897  OD2 ASP A 502      63.370  69.251  50.672  1.00 78.06           O  
+ATOM   1898  N   GLY A 503      62.650  67.979  45.823  1.00 45.47           N  
+ATOM   1899  CA  GLY A 503      63.392  67.832  44.586  1.00 43.33           C  
+ATOM   1900  C   GLY A 503      64.374  68.907  44.132  1.00 42.02           C  
+ATOM   1901  O   GLY A 503      64.105  69.641  43.173  1.00 41.29           O  
+ATOM   1902  N   SER A 504      65.521  68.993  44.803  1.00 40.38           N  
+ATOM   1903  CA  SER A 504      66.558  69.953  44.425  1.00 39.58           C  
+ATOM   1904  C   SER A 504      67.484  69.251  43.428  1.00 40.11           C  
+ATOM   1905  O   SER A 504      68.134  69.883  42.600  1.00 39.58           O  
+ATOM   1906  CB  SER A 504      67.348  70.397  45.660  1.00 38.19           C  
+ATOM   1907  OG  SER A 504      66.546  71.186  46.526  1.00 33.86           O  
+ATOM   1908  N   VAL A 505      67.516  67.926  43.518  1.00 39.44           N  
+ATOM   1909  CA  VAL A 505      68.333  67.089  42.645  1.00 38.88           C  
+ATOM   1910  C   VAL A 505      67.493  65.882  42.196  1.00 40.02           C  
+ATOM   1911  O   VAL A 505      66.513  65.521  42.852  1.00 37.04           O  
+ATOM   1912  CB  VAL A 505      69.609  66.583  43.389  1.00 40.41           C  
+ATOM   1913  CG1 VAL A 505      70.589  65.948  42.399  1.00 41.74           C  
+ATOM   1914  CG2 VAL A 505      70.281  67.740  44.118  1.00 41.22           C  
+ATOM   1915  N   LYS A 506      67.877  65.270  41.076  1.00 40.38           N  
+ATOM   1916  CA  LYS A 506      67.165  64.109  40.540  1.00 39.28           C  
+ATOM   1917  C   LYS A 506      67.172  62.880  41.450  1.00 38.39           C  
+ATOM   1918  O   LYS A 506      67.885  62.827  42.457  1.00 37.68           O  
+ATOM   1919  CB  LYS A 506      67.718  63.743  39.157  1.00 40.31           C  
+ATOM   1920  CG  LYS A 506      67.047  64.513  38.026  1.00 42.43           C  
+ATOM   1921  CD  LYS A 506      67.786  64.376  36.715  1.00 43.43           C  
+ATOM   1922  CE  LYS A 506      69.015  65.286  36.677  1.00 46.06           C  
+ATOM   1923  NZ  LYS A 506      70.051  64.953  37.712  1.00 47.04           N  
+ATOM   1924  N   VAL A 507      66.370  61.887  41.074  1.00 38.97           N  
+ATOM   1925  CA  VAL A 507      66.222  60.655  41.849  1.00 40.05           C  
+ATOM   1926  C   VAL A 507      65.988  59.456  40.920  1.00 42.50           C  
+ATOM   1927  O   VAL A 507      65.560  59.615  39.773  1.00 41.16           O  
+ATOM   1928  CB  VAL A 507      65.028  60.809  42.854  1.00 37.56           C  
+ATOM   1929  CG1 VAL A 507      64.604  59.465  43.401  1.00 36.32           C  
+ATOM   1930  CG2 VAL A 507      65.425  61.733  44.008  1.00 34.76           C  
+ATOM   1931  N   ASN A 508      66.287  58.258  41.411  1.00 48.25           N  
+ATOM   1932  CA  ASN A 508      66.096  57.037  40.622  1.00 50.66           C  
+ATOM   1933  C   ASN A 508      64.786  56.333  41.004  1.00 49.60           C  
+ATOM   1934  O   ASN A 508      64.545  56.012  42.173  1.00 46.68           O  
+ATOM   1935  CB  ASN A 508      67.278  56.083  40.829  1.00 58.34           C  
+ATOM   1936  CG  ASN A 508      68.620  56.724  40.500  1.00 68.38           C  
+ATOM   1937  OD1 ASN A 508      69.648  56.048  40.467  1.00 74.62           O  
+ATOM   1938  ND2 ASN A 508      68.616  58.030  40.264  1.00 73.70           N  
+ATOM   1939  N   LEU A 509      63.940  56.099  40.008  1.00 49.76           N  
+ATOM   1940  CA  LEU A 509      62.648  55.459  40.230  1.00 50.49           C  
+ATOM   1941  C   LEU A 509      62.626  54.055  39.639  1.00 58.34           C  
+ATOM   1942  O   LEU A 509      63.294  53.797  38.639  1.00 54.20           O  
+ATOM   1943  CB  LEU A 509      61.547  56.328  39.616  1.00 44.00           C  
+ATOM   1944  CG  LEU A 509      60.784  57.250  40.576  1.00 40.53           C  
+ATOM   1945  CD1 LEU A 509      61.705  57.803  41.649  1.00 36.48           C  
+ATOM   1946  CD2 LEU A 509      60.112  58.362  39.776  1.00 37.88           C  
+ATOM   1947  N   GLU A 510      61.848  53.156  40.244  1.00 74.63           N  
+ATOM   1948  CA  GLU A 510      61.798  51.769  39.778  1.00 85.59           C  
+ATOM   1949  C   GLU A 510      60.443  51.230  39.323  1.00 89.60           C  
+ATOM   1950  O   GLU A 510      59.388  51.784  39.652  1.00 87.02           O  
+ATOM   1951  CB  GLU A 510      62.336  50.844  40.868  1.00 95.97           C  
+ATOM   1952  CG  GLU A 510      63.502  51.418  41.640  1.00120.13           C  
+ATOM   1953  CD  GLU A 510      64.108  50.419  42.601  1.00130.61           C  
+ATOM   1954  OE1 GLU A 510      63.354  49.818  43.393  1.00134.64           O  
+ATOM   1955  OE2 GLU A 510      65.343  50.240  42.568  1.00134.85           O  
+ATOM   1956  N   LYS A 511      60.508  50.125  38.575  1.00100.17           N  
+ATOM   1957  CA  LYS A 511      59.350  49.410  38.029  1.00106.24           C  
+ATOM   1958  C   LYS A 511      59.866  48.086  37.454  1.00107.46           C  
+ATOM   1959  O   LYS A 511      61.075  47.862  37.418  1.00113.88           O  
+ATOM   1960  CB  LYS A 511      58.677  50.236  36.926  1.00111.48           C  
+ATOM   1961  CG  LYS A 511      57.475  49.560  36.266  1.00119.83           C  
+ATOM   1962  CD  LYS A 511      56.830  50.478  35.236  1.00123.38           C  
+ATOM   1963  CE  LYS A 511      55.726  49.777  34.455  1.00123.83           C  
+ATOM   1964  NZ  LYS A 511      55.093  50.692  33.458  1.00124.02           N  
+ATOM   1965  N   LYS A 512      58.960  47.216  37.010  1.00114.93           N  
+ATOM   1966  CA  LYS A 512      59.337  45.917  36.443  1.00119.36           C  
+ATOM   1967  C   LYS A 512      60.455  45.210  37.204  1.00124.50           C  
+ATOM   1968  O   LYS A 512      61.200  44.416  36.625  1.00129.08           O  
+ATOM   1969  CB  LYS A 512      59.760  46.064  34.978  1.00113.46           C  
+ATOM   1970  CG  LYS A 512      58.603  46.162  34.008  1.00103.38           C  
+ATOM   1971  CD  LYS A 512      57.711  44.931  34.088  1.00 98.05           C  
+ATOM   1972  CE  LYS A 512      56.553  45.025  33.102  1.00 96.64           C  
+ATOM   1973  NZ  LYS A 512      55.562  43.926  33.276  1.00 96.01           N  
+ATOM   1974  N   HIS A 513      60.567  45.502  38.496  1.00134.30           N  
+ATOM   1975  CA  HIS A 513      61.585  44.897  39.351  1.00140.56           C  
+ATOM   1976  C   HIS A 513      63.012  45.218  38.889  1.00137.57           C  
+ATOM   1977  O   HIS A 513      63.886  44.351  38.899  1.00143.66           O  
+ATOM   1978  CB  HIS A 513      61.380  43.375  39.416  1.00146.45           C  
+ATOM   1979  CG  HIS A 513      61.756  42.766  40.734  1.00151.21           C  
+ATOM   1980  ND1 HIS A 513      63.030  42.853  41.258  1.00152.84           N  
+ATOM   1981  CD2 HIS A 513      61.025  42.073  41.637  1.00152.67           C  
+ATOM   1982  CE1 HIS A 513      63.064  42.238  42.429  1.00153.27           C  
+ATOM   1983  NE2 HIS A 513      61.859  41.757  42.681  1.00153.36           N  
+ATOM   1984  N   LEU A 514      63.232  46.470  38.489  1.00130.89           N  
+ATOM   1985  CA  LEU A 514      64.537  46.961  38.035  1.00126.77           C  
+ATOM   1986  C   LEU A 514      64.455  48.481  37.846  1.00126.70           C  
+ATOM   1987  O   LEU A 514      63.378  49.014  37.581  1.00128.13           O  
+ATOM   1988  CB  LEU A 514      64.956  46.286  36.718  1.00118.24           C  
+ATOM   1989  CG  LEU A 514      65.558  44.872  36.762  1.00104.96           C  
+ATOM   1990  CD1 LEU A 514      65.826  44.400  35.344  1.00 97.34           C  
+ATOM   1991  CD2 LEU A 514      66.854  44.860  37.569  1.00 97.63           C  
+ATOM   1992  N   ASN A 515      65.585  49.174  37.984  1.00123.51           N  
+ATOM   1993  CA  ASN A 515      65.626  50.636  37.849  1.00119.16           C  
+ATOM   1994  C   ASN A 515      65.289  51.190  36.458  1.00114.13           C  
+ATOM   1995  O   ASN A 515      65.841  50.750  35.446  1.00113.33           O  
+ATOM   1996  CB  ASN A 515      67.003  51.172  38.278  1.00117.39           C  
+ATOM   1997  CG  ASN A 515      67.146  51.301  39.792  1.00115.54           C  
+ATOM   1998  OD1 ASN A 515      66.924  50.343  40.534  1.00115.73           O  
+ATOM   1999  ND2 ASN A 515      67.525  52.491  40.252  1.00115.50           N  
+ATOM   2000  N   LYS A 516      64.373  52.159  36.425  1.00103.46           N  
+ATOM   2001  CA  LYS A 516      63.964  52.810  35.180  1.00100.63           C  
+ATOM   2002  C   LYS A 516      64.426  54.272  35.247  1.00 99.40           C  
+ATOM   2003  O   LYS A 516      65.570  54.554  35.617  1.00 97.71           O  
+ATOM   2004  CB  LYS A 516      62.435  52.776  34.997  1.00101.97           C  
+ATOM   2005  CG  LYS A 516      61.733  51.489  35.408  1.00 97.89           C  
+ATOM   2006  CD  LYS A 516      62.306  50.244  34.732  1.00 95.97           C  
+ATOM   2007  CE  LYS A 516      62.030  50.186  33.236  1.00 93.83           C  
+ATOM   2008  NZ  LYS A 516      62.525  48.891  32.674  1.00 93.26           N  
+ATOM   2009  N   ARG A 517      63.520  55.194  34.919  1.00 89.03           N  
+ATOM   2010  CA  ARG A 517      63.809  56.626  34.911  1.00 76.68           C  
+ATOM   2011  C   ARG A 517      64.425  57.264  36.154  1.00 72.12           C  
+ATOM   2012  O   ARG A 517      64.208  56.825  37.286  1.00 59.09           O  
+ATOM   2013  CB  ARG A 517      62.546  57.403  34.548  1.00 74.59           C  
+ATOM   2014  CG  ARG A 517      62.178  57.324  33.083  1.00 80.58           C  
+ATOM   2015  CD  ARG A 517      61.724  58.688  32.601  1.00 85.08           C  
+ATOM   2016  NE  ARG A 517      62.715  59.716  32.912  1.00 86.38           N  
+ATOM   2017  CZ  ARG A 517      62.517  61.020  32.747  1.00 86.90           C  
+ATOM   2018  NH1 ARG A 517      61.360  61.468  32.273  1.00 86.20           N  
+ATOM   2019  NH2 ARG A 517      63.479  61.876  33.060  1.00 87.30           N  
+ATOM   2020  N   THR A 518      65.204  58.315  35.904  1.00 64.50           N  
+ATOM   2021  CA  THR A 518      65.865  59.105  36.939  1.00 62.32           C  
+ATOM   2022  C   THR A 518      65.354  60.513  36.653  1.00 60.46           C  
+ATOM   2023  O   THR A 518      65.369  60.954  35.501  1.00 60.26           O  
+ATOM   2024  CB  THR A 518      67.404  59.095  36.788  1.00 66.62           C  
+ATOM   2025  OG1 THR A 518      67.890  57.748  36.846  1.00 74.37           O  
+ATOM   2026  CG2 THR A 518      68.051  59.911  37.902  1.00 73.41           C  
+ATOM   2027  N   GLN A 519      64.911  61.226  37.683  1.00 56.28           N  
+ATOM   2028  CA  GLN A 519      64.355  62.557  37.458  1.00 52.54           C  
+ATOM   2029  C   GLN A 519      64.072  63.284  38.755  1.00 50.17           C  
+ATOM   2030  O   GLN A 519      64.417  62.813  39.840  1.00 48.30           O  
+ATOM   2031  CB  GLN A 519      63.030  62.419  36.722  1.00 52.33           C  
+ATOM   2032  CG  GLN A 519      62.001  61.673  37.574  1.00 51.32           C  
+ATOM   2033  CD  GLN A 519      60.667  61.487  36.888  1.00 51.87           C  
+ATOM   2034  OE1 GLN A 519      60.553  60.728  35.927  1.00 51.92           O  
+ATOM   2035  NE2 GLN A 519      59.644  62.184  37.378  1.00 50.98           N  
+ATOM   2036  N   ILE A 520      63.424  64.438  38.620  1.00 44.28           N  
+ATOM   2037  CA  ILE A 520      63.024  65.229  39.773  1.00 39.05           C  
+ATOM   2038  C   ILE A 520      61.704  64.596  40.176  1.00 36.48           C  
+ATOM   2039  O   ILE A 520      60.799  64.504  39.345  1.00 34.52           O  
+ATOM   2040  CB  ILE A 520      62.776  66.699  39.382  1.00 38.42           C  
+ATOM   2041  CG1 ILE A 520      64.091  67.362  38.973  1.00 37.72           C  
+ATOM   2042  CG2 ILE A 520      62.161  67.458  40.547  1.00 37.50           C  
+ATOM   2043  CD1 ILE A 520      65.095  67.491  40.100  1.00 37.25           C  
+ATOM   2044  N   PHE A 521      61.590  64.131  41.419  1.00 31.08           N  
+ATOM   2045  CA  PHE A 521      60.333  63.514  41.833  1.00 29.96           C  
+ATOM   2046  C   PHE A 521      59.279  64.566  41.526  1.00 29.94           C  
+ATOM   2047  O   PHE A 521      59.554  65.762  41.625  1.00 31.08           O  
+ATOM   2048  CB  PHE A 521      60.329  63.167  43.323  1.00 27.52           C  
+ATOM   2049  CG  PHE A 521      59.216  62.243  43.717  1.00 25.56           C  
+ATOM   2050  CD1 PHE A 521      59.156  60.953  43.210  1.00 25.34           C  
+ATOM   2051  CD2 PHE A 521      58.222  62.653  44.600  1.00 25.75           C  
+ATOM   2052  CE1 PHE A 521      58.106  60.068  43.584  1.00 25.11           C  
+ATOM   2053  CE2 PHE A 521      57.172  61.778  44.977  1.00 24.84           C  
+ATOM   2054  CZ  PHE A 521      57.119  60.491  44.468  1.00 23.47           C  
+ATOM   2055  N   PRO A 522      58.064  64.148  41.140  1.00 26.85           N  
+ATOM   2056  CA  PRO A 522      57.076  65.181  40.836  1.00 26.10           C  
+ATOM   2057  C   PRO A 522      56.546  65.881  42.066  1.00 24.34           C  
+ATOM   2058  O   PRO A 522      56.656  65.367  43.181  1.00 24.30           O  
+ATOM   2059  CB  PRO A 522      55.977  64.418  40.089  1.00 25.17           C  
+ATOM   2060  CG  PRO A 522      56.653  63.151  39.640  1.00 26.78           C  
+ATOM   2061  CD  PRO A 522      57.547  62.819  40.794  1.00 25.02           C  
+ATOM   2062  N   PRO A 523      55.997  67.091  41.872  1.00 21.36           N  
+ATOM   2063  CA  PRO A 523      55.416  67.916  42.938  1.00 21.51           C  
+ATOM   2064  C   PRO A 523      54.017  67.354  43.220  1.00 21.96           C  
+ATOM   2065  O   PRO A 523      53.515  66.524  42.441  1.00 20.82           O  
+ATOM   2066  CB  PRO A 523      55.358  69.295  42.301  1.00 20.72           C  
+ATOM   2067  CG  PRO A 523      55.081  68.969  40.837  1.00 18.36           C  
+ATOM   2068  CD  PRO A 523      56.034  67.824  40.590  1.00 19.50           C  
+ATOM   2069  N   GLY A 524      53.390  67.780  44.316  1.00 21.33           N  
+ATOM   2070  CA  GLY A 524      52.066  67.262  44.605  1.00 22.84           C  
+ATOM   2071  C   GLY A 524      51.373  67.638  45.900  1.00 23.58           C  
+ATOM   2072  O   GLY A 524      51.606  68.697  46.478  1.00 23.73           O  
+ATOM   2073  N   ILE A 525      50.502  66.749  46.356  1.00 24.15           N  
+ATOM   2074  CA  ILE A 525      49.736  66.989  47.569  1.00 26.08           C  
+ATOM   2075  C   ILE A 525      49.805  65.801  48.524  1.00 24.70           C  
+ATOM   2076  O   ILE A 525      49.888  64.642  48.109  1.00 27.53           O  
+ATOM   2077  CB  ILE A 525      48.226  67.196  47.250  1.00 28.51           C  
+ATOM   2078  CG1 ILE A 525      48.048  68.207  46.123  1.00 31.26           C  
+ATOM   2079  CG2 ILE A 525      47.487  67.663  48.490  1.00 32.03           C  
+ATOM   2080  CD1 ILE A 525      46.625  68.310  45.620  1.00 30.68           C  
+ATOM   2081  N   VAL A 526      49.766  66.099  49.809  1.00 21.78           N  
+ATOM   2082  CA  VAL A 526      49.735  65.065  50.812  1.00 21.78           C  
+ATOM   2083  C   VAL A 526      48.401  65.303  51.520  1.00 27.72           C  
+ATOM   2084  O   VAL A 526      48.135  66.404  52.020  1.00 22.81           O  
+ATOM   2085  CB  VAL A 526      50.908  65.194  51.819  1.00 19.35           C  
+ATOM   2086  CG1 VAL A 526      50.679  64.285  53.015  1.00 15.90           C  
+ATOM   2087  CG2 VAL A 526      52.205  64.789  51.158  1.00 14.77           C  
+ATOM   2088  N   THR A 527      47.545  64.286  51.508  1.00 35.58           N  
+ATOM   2089  CA  THR A 527      46.246  64.350  52.174  1.00 38.56           C  
+ATOM   2090  C   THR A 527      46.446  63.643  53.519  1.00 37.40           C  
+ATOM   2091  O   THR A 527      46.868  62.483  53.571  1.00 36.32           O  
+ATOM   2092  CB  THR A 527      45.170  63.638  51.351  1.00 47.75           C  
+ATOM   2093  OG1 THR A 527      44.166  63.121  52.228  1.00 63.01           O  
+ATOM   2094  CG2 THR A 527      45.770  62.515  50.554  1.00 62.65           C  
+ATOM   2095  N   MET A 528      46.139  64.339  54.608  1.00 37.10           N  
+ATOM   2096  CA  MET A 528      46.370  63.785  55.937  1.00 36.44           C  
+ATOM   2097  C   MET A 528      45.167  63.883  56.884  1.00 37.86           C  
+ATOM   2098  O   MET A 528      44.286  64.727  56.701  1.00 42.10           O  
+ATOM   2099  CB  MET A 528      47.582  64.511  56.514  1.00 32.35           C  
+ATOM   2100  CG  MET A 528      48.172  63.935  57.758  1.00 23.82           C  
+ATOM   2101  SD  MET A 528      49.416  65.106  58.228  1.00 13.96           S  
+ATOM   2102  CE  MET A 528      50.696  64.566  57.210  1.00 15.97           C  
+ATOM   2103  N   ASN A 529      45.155  63.049  57.920  1.00 41.20           N  
+ATOM   2104  CA  ASN A 529      44.031  63.024  58.847  1.00 43.96           C  
+ATOM   2105  C   ASN A 529      44.166  63.719  60.201  1.00 45.12           C  
+ATOM   2106  O   ASN A 529      43.329  63.508  61.077  1.00 44.03           O  
+ATOM   2107  CB  ASN A 529      43.607  61.579  59.097  1.00 46.83           C  
+ATOM   2108  CG  ASN A 529      42.128  61.449  59.434  1.00 48.41           C  
+ATOM   2109  OD1 ASN A 529      41.591  62.174  60.278  1.00 48.15           O  
+ATOM   2110  ND2 ASN A 529      41.463  60.512  58.771  1.00 50.44           N  
+ATOM   2111  N   GLU A 530      45.203  64.523  60.390  1.00 45.45           N  
+ATOM   2112  CA  GLU A 530      45.388  65.255  61.649  1.00 47.15           C  
+ATOM   2113  C   GLU A 530      46.342  64.645  62.661  1.00 47.08           C  
+ATOM   2114  O   GLU A 530      46.170  64.814  63.870  1.00 47.20           O  
+ATOM   2115  CB  GLU A 530      44.044  65.549  62.349  1.00 47.01           C  
+ATOM   2116  CG  GLU A 530      43.201  66.604  61.645  1.00 53.61           C  
+ATOM   2117  CD  GLU A 530      42.154  67.237  62.545  1.00 56.97           C  
+ATOM   2118  OE1 GLU A 530      41.139  66.567  62.858  1.00 57.40           O  
+ATOM   2119  OE2 GLU A 530      42.353  68.412  62.935  1.00 58.52           O  
+ATOM   2120  N   TYR A 531      47.350  63.933  62.171  1.00 46.85           N  
+ATOM   2121  CA  TYR A 531      48.348  63.369  63.059  1.00 45.57           C  
+ATOM   2122  C   TYR A 531      49.344  64.500  63.247  1.00 44.83           C  
+ATOM   2123  O   TYR A 531      49.431  65.400  62.408  1.00 44.60           O  
+ATOM   2124  CB  TYR A 531      49.069  62.195  62.409  1.00 46.77           C  
+ATOM   2125  CG  TYR A 531      48.178  61.058  62.002  1.00 48.77           C  
+ATOM   2126  CD1 TYR A 531      47.438  61.116  60.823  1.00 49.31           C  
+ATOM   2127  CD2 TYR A 531      48.062  59.920  62.806  1.00 49.59           C  
+ATOM   2128  CE1 TYR A 531      46.596  60.062  60.450  1.00 49.74           C  
+ATOM   2129  CE2 TYR A 531      47.224  58.862  62.445  1.00 49.46           C  
+ATOM   2130  CZ  TYR A 531      46.494  58.942  61.266  1.00 49.67           C  
+ATOM   2131  OH  TYR A 531      45.658  57.908  60.908  1.00 49.67           O  
+ATOM   2132  N   SER A 532      50.084  64.465  64.348  1.00 43.29           N  
+ATOM   2133  CA  SER A 532      51.092  65.485  64.608  1.00 41.35           C  
+ATOM   2134  C   SER A 532      52.144  65.320  63.523  1.00 40.13           C  
+ATOM   2135  O   SER A 532      52.379  64.202  63.048  1.00 39.40           O  
+ATOM   2136  CB  SER A 532      51.722  65.261  65.982  1.00 40.32           C  
+ATOM   2137  OG  SER A 532      52.071  63.897  66.144  1.00 41.16           O  
+ATOM   2138  N   VAL A 533      52.770  66.424  63.130  1.00 38.95           N  
+ATOM   2139  CA  VAL A 533      53.790  66.374  62.089  1.00 39.14           C  
+ATOM   2140  C   VAL A 533      55.148  66.848  62.581  1.00 39.44           C  
+ATOM   2141  O   VAL A 533      55.250  67.851  63.289  1.00 41.56           O  
+ATOM   2142  CB  VAL A 533      53.382  67.232  60.881  1.00 37.85           C  
+ATOM   2143  CG1 VAL A 533      54.481  67.213  59.835  1.00 35.93           C  
+ATOM   2144  CG2 VAL A 533      52.068  66.710  60.297  1.00 34.58           C  
+ATOM   2145  N   PRO A 534      56.213  66.116  62.228  1.00 41.51           N  
+ATOM   2146  CA  PRO A 534      57.568  66.492  62.648  1.00 42.78           C  
+ATOM   2147  C   PRO A 534      57.961  67.789  61.958  1.00 43.86           C  
+ATOM   2148  O   PRO A 534      57.706  67.947  60.766  1.00 42.90           O  
+ATOM   2149  CB  PRO A 534      58.415  65.313  62.173  1.00 43.01           C  
+ATOM   2150  CG  PRO A 534      57.450  64.157  62.215  1.00 43.46           C  
+ATOM   2151  CD  PRO A 534      56.204  64.773  61.622  1.00 42.88           C  
+ATOM   2152  N   LYS A 535      58.577  68.711  62.700  1.00 44.01           N  
+ATOM   2153  CA  LYS A 535      58.991  70.002  62.141  1.00 42.60           C  
+ATOM   2154  C   LYS A 535      59.841  69.855  60.868  1.00 41.40           C  
+ATOM   2155  O   LYS A 535      59.851  70.744  60.011  1.00 35.53           O  
+ATOM   2156  CB  LYS A 535      59.773  70.819  63.177  1.00 46.80           C  
+ATOM   2157  CG  LYS A 535      61.278  70.588  63.148  1.00 58.71           C  
+ATOM   2158  CD  LYS A 535      62.039  71.857  62.759  1.00 64.10           C  
+ATOM   2159  CE  LYS A 535      63.535  71.576  62.572  1.00 66.00           C  
+ATOM   2160  NZ  LYS A 535      64.341  72.793  62.237  1.00 66.30           N  
+ATOM   2161  N   THR A 536      60.562  68.746  60.742  1.00 38.83           N  
+ATOM   2162  CA  THR A 536      61.377  68.547  59.552  1.00 37.41           C  
+ATOM   2163  C   THR A 536      60.487  68.245  58.339  1.00 38.15           C  
+ATOM   2164  O   THR A 536      60.824  68.573  57.197  1.00 37.52           O  
+ATOM   2165  CB  THR A 536      62.401  67.403  59.768  1.00 39.04           C  
+ATOM   2166  OG1 THR A 536      61.718  66.175  60.054  1.00 43.35           O  
+ATOM   2167  CG2 THR A 536      63.307  67.740  60.939  1.00 42.50           C  
+ATOM   2168  N   LEU A 537      59.341  67.622  58.593  1.00 40.53           N  
+ATOM   2169  CA  LEU A 537      58.409  67.283  57.524  1.00 41.01           C  
+ATOM   2170  C   LEU A 537      57.581  68.505  57.157  1.00 39.31           C  
+ATOM   2171  O   LEU A 537      57.428  68.856  55.990  1.00 39.46           O  
+ATOM   2172  CB  LEU A 537      57.482  66.157  57.978  1.00 44.91           C  
+ATOM   2173  CG  LEU A 537      56.472  65.695  56.927  1.00 49.35           C  
+ATOM   2174  CD1 LEU A 537      57.199  65.183  55.698  1.00 50.49           C  
+ATOM   2175  CD2 LEU A 537      55.592  64.611  57.517  1.00 51.83           C  
+ATOM   2176  N   GLN A 538      57.039  69.141  58.182  1.00 36.88           N  
+ATOM   2177  CA  GLN A 538      56.222  70.328  58.019  1.00 35.62           C  
+ATOM   2178  C   GLN A 538      56.879  71.296  57.039  1.00 35.85           C  
+ATOM   2179  O   GLN A 538      56.214  71.893  56.183  1.00 34.43           O  
+ATOM   2180  CB  GLN A 538      56.043  70.997  59.385  1.00 34.70           C  
+ATOM   2181  CG  GLN A 538      54.984  72.075  59.439  1.00 33.65           C  
+ATOM   2182  CD  GLN A 538      53.622  71.580  58.972  1.00 34.08           C  
+ATOM   2183  OE1 GLN A 538      53.117  70.553  59.445  1.00 33.95           O  
+ATOM   2184  NE2 GLN A 538      53.017  72.315  58.043  1.00 34.77           N  
+ATOM   2185  N   ALA A 539      58.197  71.421  57.169  1.00 36.25           N  
+ATOM   2186  CA  ALA A 539      59.004  72.321  56.350  1.00 36.95           C  
+ATOM   2187  C   ALA A 539      59.006  72.011  54.865  1.00 38.74           C  
+ATOM   2188  O   ALA A 539      59.353  72.866  54.051  1.00 39.34           O  
+ATOM   2189  CB  ALA A 539      60.433  72.329  56.863  1.00 34.84           C  
+ATOM   2190  N   ARG A 540      58.623  70.796  54.501  1.00 42.74           N  
+ATOM   2191  CA  ARG A 540      58.620  70.426  53.097  1.00 44.73           C  
+ATOM   2192  C   ARG A 540      57.359  70.922  52.415  1.00 43.40           C  
+ATOM   2193  O   ARG A 540      57.282  70.963  51.186  1.00 42.87           O  
+ATOM   2194  CB  ARG A 540      58.755  68.914  52.962  1.00 50.46           C  
+ATOM   2195  CG  ARG A 540      59.901  68.354  53.790  1.00 58.88           C  
+ATOM   2196  CD  ARG A 540      61.226  69.004  53.438  1.00 62.11           C  
+ATOM   2197  NE  ARG A 540      62.248  68.680  54.425  1.00 63.75           N  
+ATOM   2198  CZ  ARG A 540      63.553  68.841  54.232  1.00 65.44           C  
+ATOM   2199  NH1 ARG A 540      64.005  69.325  53.084  1.00 66.14           N  
+ATOM   2200  NH2 ARG A 540      64.411  68.505  55.184  1.00 66.03           N  
+ATOM   2201  N   PHE A 541      56.375  71.318  53.214  1.00 39.87           N  
+ATOM   2202  CA  PHE A 541      55.136  71.832  52.651  1.00 36.33           C  
+ATOM   2203  C   PHE A 541      55.140  73.351  52.616  1.00 34.81           C  
+ATOM   2204  O   PHE A 541      55.252  74.009  53.648  1.00 35.51           O  
+ATOM   2205  CB  PHE A 541      53.940  71.326  53.447  1.00 33.49           C  
+ATOM   2206  CG  PHE A 541      53.853  69.837  53.490  1.00 32.84           C  
+ATOM   2207  CD1 PHE A 541      54.276  69.135  54.610  1.00 32.20           C  
+ATOM   2208  CD2 PHE A 541      53.401  69.129  52.389  1.00 31.04           C  
+ATOM   2209  CE1 PHE A 541      54.254  67.747  54.631  1.00 31.47           C  
+ATOM   2210  CE2 PHE A 541      53.377  67.755  52.398  1.00 30.76           C  
+ATOM   2211  CZ  PHE A 541      53.804  67.056  53.520  1.00 31.43           C  
+ATOM   2212  N   VAL A 542      55.031  73.903  51.415  1.00 34.35           N  
+ATOM   2213  CA  VAL A 542      55.026  75.342  51.250  1.00 36.52           C  
+ATOM   2214  C   VAL A 542      53.661  75.932  51.561  1.00 36.17           C  
+ATOM   2215  O   VAL A 542      53.522  77.138  51.770  1.00 39.69           O  
+ATOM   2216  CB  VAL A 542      55.423  75.739  49.814  1.00 36.15           C  
+ATOM   2217  CG1 VAL A 542      54.362  75.288  48.821  1.00 32.62           C  
+ATOM   2218  CG2 VAL A 542      55.645  77.250  49.749  1.00 34.52           C  
+ATOM   2219  N   LYS A 543      52.653  75.070  51.598  1.00 35.60           N  
+ATOM   2220  CA  LYS A 543      51.287  75.501  51.862  1.00 34.36           C  
+ATOM   2221  C   LYS A 543      50.495  74.419  52.594  1.00 33.74           C  
+ATOM   2222  O   LYS A 543      50.662  73.238  52.335  1.00 33.88           O  
+ATOM   2223  CB  LYS A 543      50.589  75.849  50.538  1.00 31.85           C  
+ATOM   2224  CG  LYS A 543      49.143  76.192  50.720  1.00 31.38           C  
+ATOM   2225  CD  LYS A 543      48.645  77.191  49.700  1.00 30.19           C  
+ATOM   2226  CE  LYS A 543      47.261  77.724  50.100  1.00 30.75           C  
+ATOM   2227  NZ  LYS A 543      46.804  78.891  49.274  1.00 32.15           N  
+ATOM   2228  N   GLN A 544      49.650  74.820  53.530  1.00 31.21           N  
+ATOM   2229  CA  GLN A 544      48.819  73.859  54.250  1.00 29.21           C  
+ATOM   2230  C   GLN A 544      47.384  74.350  54.269  1.00 29.28           C  
+ATOM   2231  O   GLN A 544      47.122  75.523  54.532  1.00 27.66           O  
+ATOM   2232  CB  GLN A 544      49.295  73.654  55.686  1.00 27.97           C  
+ATOM   2233  CG  GLN A 544      48.314  72.844  56.520  1.00 29.44           C  
+ATOM   2234  CD  GLN A 544      48.879  72.413  57.866  1.00 31.20           C  
+ATOM   2235  OE1 GLN A 544      48.159  71.885  58.714  1.00 32.47           O  
+ATOM   2236  NE2 GLN A 544      50.170  72.634  58.066  1.00 32.33           N  
+ATOM   2237  N   ILE A 545      46.457  73.450  53.972  1.00 28.83           N  
+ATOM   2238  CA  ILE A 545      45.047  73.795  53.957  1.00 29.08           C  
+ATOM   2239  C   ILE A 545      44.301  72.919  54.947  1.00 29.59           C  
+ATOM   2240  O   ILE A 545      44.323  71.695  54.838  1.00 30.57           O  
+ATOM   2241  CB  ILE A 545      44.427  73.591  52.556  1.00 29.20           C  
+ATOM   2242  CG1 ILE A 545      45.134  74.479  51.528  1.00 28.79           C  
+ATOM   2243  CG2 ILE A 545      42.928  73.900  52.603  1.00 29.95           C  
+ATOM   2244  CD1 ILE A 545      44.548  74.369  50.133  1.00 28.13           C  
+ATOM   2245  N   ASP A 546      43.643  73.549  55.914  1.00 31.76           N  
+ATOM   2246  CA  ASP A 546      42.887  72.811  56.909  1.00 31.89           C  
+ATOM   2247  C   ASP A 546      41.421  72.727  56.540  1.00 31.01           C  
+ATOM   2248  O   ASP A 546      40.743  73.744  56.364  1.00 31.17           O  
+ATOM   2249  CB  ASP A 546      43.048  73.447  58.288  1.00 34.08           C  
+ATOM   2250  CG  ASP A 546      44.450  73.301  58.818  1.00 37.82           C  
+ATOM   2251  OD1 ASP A 546      44.970  72.171  58.747  1.00 40.48           O  
+ATOM   2252  OD2 ASP A 546      45.032  74.297  59.301  1.00 39.17           O  
+ATOM   2253  N   PHE A 547      40.941  71.497  56.408  1.00 30.35           N  
+ATOM   2254  CA  PHE A 547      39.553  71.275  56.071  1.00 30.61           C  
+ATOM   2255  C   PHE A 547      38.798  70.885  57.326  1.00 33.73           C  
+ATOM   2256  O   PHE A 547      39.272  70.082  58.132  1.00 31.81           O  
+ATOM   2257  CB  PHE A 547      39.414  70.177  55.004  1.00 27.96           C  
+ATOM   2258  CG  PHE A 547      40.089  70.510  53.707  1.00 28.24           C  
+ATOM   2259  CD1 PHE A 547      41.481  70.391  53.574  1.00 27.61           C  
+ATOM   2260  CD2 PHE A 547      39.345  70.984  52.627  1.00 26.45           C  
+ATOM   2261  CE1 PHE A 547      42.129  70.745  52.381  1.00 26.76           C  
+ATOM   2262  CE2 PHE A 547      39.971  71.345  51.424  1.00 25.92           C  
+ATOM   2263  CZ  PHE A 547      41.363  71.228  51.296  1.00 27.03           C  
+ATOM   2264  N   ARG A 548      37.634  71.494  57.500  1.00 39.02           N  
+ATOM   2265  CA  ARG A 548      36.781  71.203  58.633  1.00 42.85           C  
+ATOM   2266  C   ARG A 548      35.409  70.955  58.037  1.00 42.12           C  
+ATOM   2267  O   ARG A 548      34.932  71.724  57.194  1.00 40.04           O  
+ATOM   2268  CB  ARG A 548      36.766  72.383  59.598  1.00 48.70           C  
+ATOM   2269  CG  ARG A 548      38.156  72.695  60.088  1.00 62.54           C  
+ATOM   2270  CD  ARG A 548      38.266  74.050  60.735  1.00 69.07           C  
+ATOM   2271  NE  ARG A 548      39.663  74.473  60.774  1.00 70.85           N  
+ATOM   2272  CZ  ARG A 548      40.092  75.589  61.349  1.00 72.04           C  
+ATOM   2273  NH1 ARG A 548      39.226  76.403  61.944  1.00 72.77           N  
+ATOM   2274  NH2 ARG A 548      41.386  75.892  61.323  1.00 71.92           N  
+ATOM   2275  N   PRO A 549      34.767  69.851  58.435  1.00 41.98           N  
+ATOM   2276  CA  PRO A 549      33.446  69.578  57.880  1.00 39.73           C  
+ATOM   2277  C   PRO A 549      32.502  70.708  58.230  1.00 38.80           C  
+ATOM   2278  O   PRO A 549      32.520  71.214  59.355  1.00 37.73           O  
+ATOM   2279  CB  PRO A 549      33.062  68.265  58.544  1.00 39.46           C  
+ATOM   2280  CG  PRO A 549      34.387  67.609  58.766  1.00 42.04           C  
+ATOM   2281  CD  PRO A 549      35.207  68.746  59.299  1.00 41.06           C  
+ATOM   2282  N   LYS A 550      31.706  71.122  57.250  1.00 37.00           N  
+ATOM   2283  CA  LYS A 550      30.742  72.190  57.451  1.00 37.15           C  
+ATOM   2284  C   LYS A 550      29.329  71.617  57.283  1.00 40.74           C  
+ATOM   2285  O   LYS A 550      29.078  70.789  56.408  1.00 35.41           O  
+ATOM   2286  CB  LYS A 550      30.988  73.335  56.460  1.00 36.51           C  
+ATOM   2287  CG  LYS A 550      32.344  74.020  56.596  1.00 39.58           C  
+ATOM   2288  CD  LYS A 550      32.471  75.102  55.538  1.00 43.40           C  
+ATOM   2289  CE  LYS A 550      33.909  75.557  55.295  1.00 43.64           C  
+ATOM   2290  NZ  LYS A 550      33.949  76.515  54.131  1.00 42.42           N  
+ATOM   2291  N   ASP A 551      28.413  72.071  58.133  1.00 45.20           N  
+ATOM   2292  CA  ASP A 551      27.035  71.601  58.132  1.00 45.25           C  
+ATOM   2293  C   ASP A 551      26.234  71.996  56.911  1.00 41.40           C  
+ATOM   2294  O   ASP A 551      25.554  71.154  56.318  1.00 37.47           O  
+ATOM   2295  CB  ASP A 551      26.331  72.095  59.394  1.00 58.06           C  
+ATOM   2296  CG  ASP A 551      26.979  71.571  60.652  1.00 74.69           C  
+ATOM   2297  OD1 ASP A 551      26.724  70.405  61.004  1.00 82.52           O  
+ATOM   2298  OD2 ASP A 551      27.761  72.318  61.278  1.00 84.94           O  
+ATOM   2299  N   TYR A 552      26.307  73.265  56.524  1.00 37.38           N  
+ATOM   2300  CA  TYR A 552      25.532  73.690  55.378  1.00 34.50           C  
+ATOM   2301  C   TYR A 552      25.937  72.967  54.107  1.00 34.55           C  
+ATOM   2302  O   TYR A 552      25.083  72.636  53.278  1.00 36.77           O  
+ATOM   2303  CB  TYR A 552      25.586  75.221  55.209  1.00 31.15           C  
+ATOM   2304  CG  TYR A 552      26.960  75.830  55.060  1.00 30.45           C  
+ATOM   2305  CD1 TYR A 552      27.587  75.894  53.812  1.00 30.34           C  
+ATOM   2306  CD2 TYR A 552      27.634  76.354  56.159  1.00 28.46           C  
+ATOM   2307  CE1 TYR A 552      28.847  76.460  53.664  1.00 27.62           C  
+ATOM   2308  CE2 TYR A 552      28.898  76.925  56.018  1.00 27.60           C  
+ATOM   2309  CZ  TYR A 552      29.496  76.971  54.769  1.00 27.63           C  
+ATOM   2310  OH  TYR A 552      30.762  77.494  54.624  1.00 27.86           O  
+ATOM   2311  N   LEU A 553      27.226  72.683  53.958  1.00 35.06           N  
+ATOM   2312  CA  LEU A 553      27.685  71.991  52.765  1.00 34.33           C  
+ATOM   2313  C   LEU A 553      27.170  70.571  52.707  1.00 34.59           C  
+ATOM   2314  O   LEU A 553      26.882  70.046  51.632  1.00 33.13           O  
+ATOM   2315  CB  LEU A 553      29.203  71.983  52.710  1.00 33.94           C  
+ATOM   2316  CG  LEU A 553      29.776  73.296  52.177  1.00 36.49           C  
+ATOM   2317  CD1 LEU A 553      31.301  73.246  52.238  1.00 37.32           C  
+ATOM   2318  CD2 LEU A 553      29.296  73.522  50.746  1.00 35.37           C  
+ATOM   2319  N   LYS A 554      27.055  69.950  53.872  1.00 35.55           N  
+ATOM   2320  CA  LYS A 554      26.577  68.585  53.936  1.00 36.32           C  
+ATOM   2321  C   LYS A 554      25.090  68.585  53.642  1.00 35.94           C  
+ATOM   2322  O   LYS A 554      24.595  67.720  52.910  1.00 37.28           O  
+ATOM   2323  CB  LYS A 554      26.830  67.994  55.320  1.00 37.70           C  
+ATOM   2324  CG  LYS A 554      26.506  66.532  55.404  1.00 38.79           C  
+ATOM   2325  CD  LYS A 554      26.573  66.051  56.831  1.00 40.86           C  
+ATOM   2326  CE  LYS A 554      26.189  64.594  56.909  1.00 41.01           C  
+ATOM   2327  NZ  LYS A 554      26.270  64.104  58.306  1.00 42.37           N  
+ATOM   2328  N   HIS A 555      24.386  69.565  54.212  1.00 35.62           N  
+ATOM   2329  CA  HIS A 555      22.948  69.695  54.017  1.00 34.24           C  
+ATOM   2330  C   HIS A 555      22.655  69.993  52.576  1.00 34.32           C  
+ATOM   2331  O   HIS A 555      21.641  69.563  52.039  1.00 36.59           O  
+ATOM   2332  CB  HIS A 555      22.374  70.820  54.862  1.00 32.77           C  
+ATOM   2333  CG  HIS A 555      22.419  70.552  56.329  1.00 30.74           C  
+ATOM   2334  ND1 HIS A 555      22.456  69.274  56.846  1.00 29.93           N  
+ATOM   2335  CD2 HIS A 555      22.425  71.390  57.389  1.00 30.93           C  
+ATOM   2336  CE1 HIS A 555      22.485  69.340  58.166  1.00 30.18           C  
+ATOM   2337  NE2 HIS A 555      22.467  70.611  58.519  1.00 31.41           N  
+ATOM   2338  N   CYS A 556      23.538  70.754  51.952  1.00 31.90           N  
+ATOM   2339  CA  CYS A 556      23.358  71.083  50.552  1.00 29.58           C  
+ATOM   2340  C   CYS A 556      23.342  69.795  49.728  1.00 28.95           C  
+ATOM   2341  O   CYS A 556      22.460  69.583  48.901  1.00 25.97           O  
+ATOM   2342  CB  CYS A 556      24.492  71.985  50.078  1.00 29.37           C  
+ATOM   2343  SG  CYS A 556      24.277  72.506  48.411  1.00 30.69           S  
+ATOM   2344  N   LEU A 557      24.324  68.935  49.963  1.00 29.67           N  
+ATOM   2345  CA  LEU A 557      24.411  67.679  49.239  1.00 31.39           C  
+ATOM   2346  C   LEU A 557      23.208  66.789  49.522  1.00 34.51           C  
+ATOM   2347  O   LEU A 557      22.699  66.112  48.625  1.00 35.26           O  
+ATOM   2348  CB  LEU A 557      25.690  66.941  49.616  1.00 30.62           C  
+ATOM   2349  CG  LEU A 557      26.976  67.618  49.159  1.00 30.57           C  
+ATOM   2350  CD1 LEU A 557      28.187  66.791  49.591  1.00 30.21           C  
+ATOM   2351  CD2 LEU A 557      26.939  67.771  47.652  1.00 30.61           C  
+ATOM   2352  N   GLU A 558      22.760  66.779  50.772  1.00 38.85           N  
+ATOM   2353  CA  GLU A 558      21.611  65.969  51.135  1.00 42.60           C  
+ATOM   2354  C   GLU A 558      20.424  66.368  50.254  1.00 43.14           C  
+ATOM   2355  O   GLU A 558      19.583  65.540  49.922  1.00 43.39           O  
+ATOM   2356  CB  GLU A 558      21.278  66.156  52.625  1.00 47.84           C  
+ATOM   2357  CG  GLU A 558      22.436  65.763  53.554  1.00 56.71           C  
+ATOM   2358  CD  GLU A 558      22.133  65.948  55.037  1.00 59.05           C  
+ATOM   2359  OE1 GLU A 558      21.654  67.034  55.417  1.00 60.31           O  
+ATOM   2360  OE2 GLU A 558      22.393  65.012  55.825  1.00 60.18           O  
+ATOM   2361  N   ARG A 559      20.365  67.633  49.854  1.00 41.80           N  
+ATOM   2362  CA  ARG A 559      19.272  68.099  49.013  1.00 38.09           C  
+ATOM   2363  C   ARG A 559      19.685  68.267  47.560  1.00 35.57           C  
+ATOM   2364  O   ARG A 559      18.923  68.812  46.758  1.00 34.40           O  
+ATOM   2365  CB  ARG A 559      18.714  69.427  49.531  1.00 40.61           C  
+ATOM   2366  CG  ARG A 559      17.888  69.321  50.795  1.00 45.05           C  
+ATOM   2367  CD  ARG A 559      18.752  69.338  52.024  1.00 48.75           C  
+ATOM   2368  NE  ARG A 559      17.961  69.263  53.246  1.00 50.23           N  
+ATOM   2369  CZ  ARG A 559      18.465  69.423  54.466  1.00 50.86           C  
+ATOM   2370  NH1 ARG A 559      19.756  69.671  54.619  1.00 51.72           N  
+ATOM   2371  NH2 ARG A 559      17.683  69.332  55.534  1.00 50.40           N  
+ATOM   2372  N   SER A 560      20.881  67.791  47.220  1.00 32.92           N  
+ATOM   2373  CA  SER A 560      21.390  67.904  45.848  1.00 32.60           C  
+ATOM   2374  C   SER A 560      22.111  66.615  45.397  1.00 35.73           C  
+ATOM   2375  O   SER A 560      23.168  66.660  44.774  1.00 31.32           O  
+ATOM   2376  CB  SER A 560      22.350  69.103  45.760  1.00 28.88           C  
+ATOM   2377  OG  SER A 560      21.747  70.293  46.254  1.00 25.81           O  
+ATOM   2378  N   GLU A 561      21.511  65.471  45.693  1.00 39.91           N  
+ATOM   2379  CA  GLU A 561      22.105  64.178  45.383  1.00 41.05           C  
+ATOM   2380  C   GLU A 561      22.927  64.098  44.108  1.00 38.26           C  
+ATOM   2381  O   GLU A 561      23.984  63.454  44.090  1.00 34.27           O  
+ATOM   2382  CB  GLU A 561      21.032  63.080  45.374  1.00 49.62           C  
+ATOM   2383  CG  GLU A 561      20.325  62.869  46.709  1.00 65.93           C  
+ATOM   2384  CD  GLU A 561      18.994  63.606  46.797  1.00 74.51           C  
+ATOM   2385  OE1 GLU A 561      18.951  64.836  46.547  1.00 75.86           O  
+ATOM   2386  OE2 GLU A 561      17.984  62.943  47.123  1.00 77.77           O  
+ATOM   2387  N   PHE A 562      22.472  64.749  43.044  1.00 33.66           N  
+ATOM   2388  CA  PHE A 562      23.211  64.663  41.782  1.00 29.77           C  
+ATOM   2389  C   PHE A 562      24.693  65.026  41.876  1.00 28.57           C  
+ATOM   2390  O   PHE A 562      25.503  64.514  41.116  1.00 28.67           O  
+ATOM   2391  CB  PHE A 562      22.525  65.499  40.688  1.00 28.26           C  
+ATOM   2392  CG  PHE A 562      22.501  66.973  40.966  1.00 30.44           C  
+ATOM   2393  CD1 PHE A 562      23.592  67.778  40.647  1.00 30.82           C  
+ATOM   2394  CD2 PHE A 562      21.402  67.553  41.582  1.00 30.45           C  
+ATOM   2395  CE1 PHE A 562      23.590  69.131  40.937  1.00 29.40           C  
+ATOM   2396  CE2 PHE A 562      21.392  68.907  41.878  1.00 31.34           C  
+ATOM   2397  CZ  PHE A 562      22.494  69.698  41.553  1.00 31.87           C  
+ATOM   2398  N   LEU A 563      25.064  65.885  42.817  1.00 27.04           N  
+ATOM   2399  CA  LEU A 563      26.467  66.261  42.933  1.00 26.12           C  
+ATOM   2400  C   LEU A 563      27.371  65.086  43.286  1.00 26.19           C  
+ATOM   2401  O   LEU A 563      28.552  65.083  42.934  1.00 23.62           O  
+ATOM   2402  CB  LEU A 563      26.649  67.388  43.967  1.00 25.49           C  
+ATOM   2403  CG  LEU A 563      26.089  68.768  43.592  1.00 23.41           C  
+ATOM   2404  CD1 LEU A 563      26.451  69.770  44.671  1.00 21.75           C  
+ATOM   2405  CD2 LEU A 563      26.648  69.212  42.250  1.00 22.93           C  
+ATOM   2406  N   LEU A 564      26.811  64.093  43.974  1.00 29.23           N  
+ATOM   2407  CA  LEU A 564      27.559  62.900  44.397  1.00 31.91           C  
+ATOM   2408  C   LEU A 564      27.315  61.714  43.491  1.00 35.23           C  
+ATOM   2409  O   LEU A 564      28.247  61.058  43.050  1.00 32.79           O  
+ATOM   2410  CB  LEU A 564      27.168  62.494  45.813  1.00 32.34           C  
+ATOM   2411  CG  LEU A 564      27.562  63.461  46.928  1.00 34.96           C  
+ATOM   2412  CD1 LEU A 564      26.772  63.131  48.192  1.00 36.57           C  
+ATOM   2413  CD2 LEU A 564      29.066  63.382  47.175  1.00 33.93           C  
+ATOM   2414  N   GLU A 565      26.045  61.444  43.226  1.00 41.21           N  
+ATOM   2415  CA  GLU A 565      25.662  60.331  42.379  1.00 43.98           C  
+ATOM   2416  C   GLU A 565      26.297  60.450  40.998  1.00 42.31           C  
+ATOM   2417  O   GLU A 565      26.641  59.446  40.368  1.00 40.14           O  
+ATOM   2418  CB  GLU A 565      24.141  60.277  42.269  1.00 53.77           C  
+ATOM   2419  CG  GLU A 565      23.438  60.242  43.615  1.00 71.49           C  
+ATOM   2420  CD  GLU A 565      21.979  59.843  43.497  1.00 79.84           C  
+ATOM   2421  OE1 GLU A 565      21.271  60.421  42.645  1.00 82.86           O  
+ATOM   2422  OE2 GLU A 565      21.534  58.954  44.255  1.00 82.42           O  
+ATOM   2423  N   LYS A 566      26.452  61.673  40.515  1.00 36.96           N  
+ATOM   2424  CA  LYS A 566      27.060  61.842  39.210  1.00 31.68           C  
+ATOM   2425  C   LYS A 566      28.524  62.220  39.338  1.00 29.95           C  
+ATOM   2426  O   LYS A 566      29.136  62.631  38.353  1.00 28.56           O  
+ATOM   2427  CB  LYS A 566      26.323  62.893  38.392  1.00 31.04           C  
+ATOM   2428  CG  LYS A 566      24.925  62.485  37.981  1.00 30.61           C  
+ATOM   2429  CD  LYS A 566      24.327  63.544  37.087  1.00 31.63           C  
+ATOM   2430  CE  LYS A 566      22.877  63.258  36.792  1.00 33.25           C  
+ATOM   2431  NZ  LYS A 566      22.292  64.337  35.938  1.00 35.34           N  
+ATOM   2432  N   ARG A 567      29.075  62.081  40.545  1.00 30.03           N  
+ATOM   2433  CA  ARG A 567      30.488  62.388  40.815  1.00 30.85           C  
+ATOM   2434  C   ARG A 567      30.932  63.718  40.212  1.00 31.32           C  
+ATOM   2435  O   ARG A 567      31.908  63.750  39.449  1.00 32.60           O  
+ATOM   2436  CB  ARG A 567      31.381  61.302  40.226  1.00 32.09           C  
+ATOM   2437  CG  ARG A 567      30.977  59.883  40.536  1.00 31.59           C  
+ATOM   2438  CD  ARG A 567      31.911  58.949  39.808  1.00 32.17           C  
+ATOM   2439  NE  ARG A 567      31.823  57.572  40.279  1.00 33.38           N  
+ATOM   2440  CZ  ARG A 567      30.715  56.836  40.235  1.00 33.98           C  
+ATOM   2441  NH1 ARG A 567      29.593  57.350  39.742  1.00 33.40           N  
+ATOM   2442  NH2 ARG A 567      30.732  55.582  40.675  1.00 33.36           N  
+ATOM   2443  N   ILE A 568      30.245  64.808  40.550  1.00 30.01           N  
+ATOM   2444  CA  ILE A 568      30.600  66.095  39.971  1.00 27.25           C  
+ATOM   2445  C   ILE A 568      31.623  66.883  40.763  1.00 26.36           C  
+ATOM   2446  O   ILE A 568      32.595  67.372  40.194  1.00 27.51           O  
+ATOM   2447  CB  ILE A 568      29.344  66.954  39.738  1.00 25.59           C  
+ATOM   2448  CG1 ILE A 568      28.507  66.327  38.611  1.00 21.14           C  
+ATOM   2449  CG2 ILE A 568      29.738  68.401  39.397  1.00 21.19           C  
+ATOM   2450  CD1 ILE A 568      27.170  66.997  38.418  1.00 19.81           C  
+ATOM   2451  N   ILE A 569      31.439  66.996  42.069  1.00 26.08           N  
+ATOM   2452  CA  ILE A 569      32.394  67.759  42.849  1.00 29.82           C  
+ATOM   2453  C   ILE A 569      33.780  67.118  43.037  1.00 32.11           C  
+ATOM   2454  O   ILE A 569      34.634  67.720  43.677  1.00 35.02           O  
+ATOM   2455  CB  ILE A 569      31.824  68.116  44.223  1.00 26.08           C  
+ATOM   2456  CG1 ILE A 569      31.496  66.852  45.007  1.00 23.22           C  
+ATOM   2457  CG2 ILE A 569      30.585  68.956  44.053  1.00 23.63           C  
+ATOM   2458  CD1 ILE A 569      30.989  67.129  46.425  1.00 20.64           C  
+ATOM   2459  N   GLN A 570      34.009  65.916  42.495  1.00 34.80           N  
+ATOM   2460  CA  GLN A 570      35.312  65.250  42.607  1.00 34.89           C  
+ATOM   2461  C   GLN A 570      35.952  65.255  41.233  1.00 34.81           C  
+ATOM   2462  O   GLN A 570      37.078  64.777  41.054  1.00 35.33           O  
+ATOM   2463  CB  GLN A 570      35.179  63.787  43.030  1.00 36.00           C  
+ATOM   2464  CG  GLN A 570      34.200  63.498  44.139  1.00 41.20           C  
+ATOM   2465  CD  GLN A 570      32.929  62.864  43.613  1.00 41.01           C  
+ATOM   2466  OE1 GLN A 570      31.943  63.550  43.345  1.00 40.67           O  
+ATOM   2467  NE2 GLN A 570      32.955  61.549  43.441  1.00 39.97           N  
+ATOM   2468  N   SER A 571      35.224  65.782  40.255  1.00 32.92           N  
+ATOM   2469  CA  SER A 571      35.716  65.830  38.888  1.00 32.56           C  
+ATOM   2470  C   SER A 571      36.658  67.000  38.583  1.00 32.22           C  
+ATOM   2471  O   SER A 571      36.415  68.146  38.978  1.00 31.40           O  
+ATOM   2472  CB  SER A 571      34.537  65.879  37.924  1.00 33.26           C  
+ATOM   2473  OG  SER A 571      34.991  65.967  36.587  1.00 36.86           O  
+ATOM   2474  N   GLY A 572      37.738  66.706  37.869  1.00 30.49           N  
+ATOM   2475  CA  GLY A 572      38.665  67.757  37.495  1.00 28.33           C  
+ATOM   2476  C   GLY A 572      38.000  68.695  36.502  1.00 28.00           C  
+ATOM   2477  O   GLY A 572      38.429  69.832  36.307  1.00 25.21           O  
+ATOM   2478  N   ILE A 573      36.944  68.210  35.859  1.00 28.62           N  
+ATOM   2479  CA  ILE A 573      36.216  69.022  34.894  1.00 30.13           C  
+ATOM   2480  C   ILE A 573      35.486  70.155  35.610  1.00 28.00           C  
+ATOM   2481  O   ILE A 573      35.309  71.237  35.057  1.00 28.80           O  
+ATOM   2482  CB  ILE A 573      35.211  68.168  34.090  1.00 33.39           C  
+ATOM   2483  CG1 ILE A 573      35.979  67.300  33.084  1.00 35.88           C  
+ATOM   2484  CG2 ILE A 573      34.195  69.065  33.385  1.00 36.61           C  
+ATOM   2485  CD1 ILE A 573      35.102  66.433  32.206  1.00 36.77           C  
+ATOM   2486  N   ALA A 574      35.067  69.907  36.844  1.00 23.30           N  
+ATOM   2487  CA  ALA A 574      34.382  70.943  37.598  1.00 19.88           C  
+ATOM   2488  C   ALA A 574      35.379  72.062  37.897  1.00 18.72           C  
+ATOM   2489  O   ALA A 574      34.998  73.233  37.973  1.00 16.48           O  
+ATOM   2490  CB  ALA A 574      33.795  70.363  38.894  1.00 15.66           C  
+ATOM   2491  N   LEU A 575      36.652  71.700  38.063  1.00 18.22           N  
+ATOM   2492  CA  LEU A 575      37.687  72.697  38.321  1.00 19.37           C  
+ATOM   2493  C   LEU A 575      38.075  73.440  37.034  1.00 20.92           C  
+ATOM   2494  O   LEU A 575      38.330  74.646  37.066  1.00 23.19           O  
+ATOM   2495  CB  LEU A 575      38.944  72.060  38.949  1.00 18.21           C  
+ATOM   2496  CG  LEU A 575      38.798  71.577  40.395  1.00 16.66           C  
+ATOM   2497  CD1 LEU A 575      40.155  71.205  41.000  1.00 12.34           C  
+ATOM   2498  CD2 LEU A 575      38.137  72.700  41.189  1.00 15.57           C  
+ATOM   2499  N   LEU A 576      38.133  72.740  35.905  1.00 23.59           N  
+ATOM   2500  CA  LEU A 576      38.478  73.434  34.676  1.00 28.14           C  
+ATOM   2501  C   LEU A 576      37.336  74.396  34.378  1.00 29.60           C  
+ATOM   2502  O   LEU A 576      37.551  75.524  33.927  1.00 30.40           O  
+ATOM   2503  CB  LEU A 576      38.666  72.461  33.507  1.00 30.69           C  
+ATOM   2504  CG  LEU A 576      39.033  73.131  32.167  1.00 33.82           C  
+ATOM   2505  CD1 LEU A 576      40.246  74.034  32.349  1.00 35.33           C  
+ATOM   2506  CD2 LEU A 576      39.313  72.073  31.111  1.00 35.40           C  
+ATOM   2507  N   LEU A 577      36.119  73.936  34.654  1.00 30.84           N  
+ATOM   2508  CA  LEU A 577      34.909  74.722  34.456  1.00 29.82           C  
+ATOM   2509  C   LEU A 577      34.907  75.991  35.314  1.00 27.81           C  
+ATOM   2510  O   LEU A 577      34.486  77.046  34.835  1.00 29.09           O  
+ATOM   2511  CB  LEU A 577      33.688  73.873  34.792  1.00 31.00           C  
+ATOM   2512  CG  LEU A 577      32.753  73.586  33.626  1.00 32.52           C  
+ATOM   2513  CD1 LEU A 577      31.801  72.471  34.030  1.00 33.21           C  
+ATOM   2514  CD2 LEU A 577      32.005  74.862  33.229  1.00 32.18           C  
+ATOM   2515  N   MET A 578      35.363  75.876  36.569  1.00 26.30           N  
+ATOM   2516  CA  MET A 578      35.444  77.004  37.506  1.00 26.32           C  
+ATOM   2517  C   MET A 578      36.415  78.051  36.947  1.00 27.55           C  
+ATOM   2518  O   MET A 578      36.116  79.262  36.898  1.00 31.15           O  
+ATOM   2519  CB  MET A 578      35.941  76.509  38.871  1.00 21.73           C  
+ATOM   2520  CG  MET A 578      36.187  77.590  39.945  1.00 13.18           C  
+ATOM   2521  SD  MET A 578      36.528  76.887  41.602  1.00  5.56           S  
+ATOM   2522  CE  MET A 578      38.121  76.967  41.546  1.00  9.41           C  
+ATOM   2523  N   LEU A 579      37.580  77.571  36.518  1.00 27.27           N  
+ATOM   2524  CA  LEU A 579      38.601  78.434  35.941  1.00 28.18           C  
+ATOM   2525  C   LEU A 579      38.023  79.249  34.782  1.00 28.12           C  
+ATOM   2526  O   LEU A 579      38.117  80.462  34.768  1.00 27.81           O  
+ATOM   2527  CB  LEU A 579      39.774  77.585  35.445  1.00 25.25           C  
+ATOM   2528  CG  LEU A 579      40.679  76.989  36.509  1.00 18.84           C  
+ATOM   2529  CD1 LEU A 579      41.788  76.205  35.838  1.00 15.97           C  
+ATOM   2530  CD2 LEU A 579      41.254  78.106  37.350  1.00 16.17           C  
+ATOM   2531  N   ILE A 580      37.435  78.550  33.815  1.00 27.08           N  
+ATOM   2532  CA  ILE A 580      36.815  79.149  32.636  1.00 25.62           C  
+ATOM   2533  C   ILE A 580      35.802  80.209  33.055  1.00 25.66           C  
+ATOM   2534  O   ILE A 580      35.665  81.244  32.405  1.00 22.40           O  
+ATOM   2535  CB  ILE A 580      36.042  78.073  31.800  1.00 27.92           C  
+ATOM   2536  CG1 ILE A 580      37.020  77.094  31.152  1.00 28.62           C  
+ATOM   2537  CG2 ILE A 580      35.184  78.748  30.726  1.00 28.40           C  
+ATOM   2538  CD1 ILE A 580      36.353  76.031  30.329  1.00 27.85           C  
+ATOM   2539  N   TRP A 581      35.097  79.929  34.146  1.00 24.66           N  
+ATOM   2540  CA  TRP A 581      34.059  80.808  34.663  1.00 24.36           C  
+ATOM   2541  C   TRP A 581      34.578  81.996  35.454  1.00 24.88           C  
+ATOM   2542  O   TRP A 581      33.966  83.052  35.452  1.00 27.10           O  
+ATOM   2543  CB  TRP A 581      33.106  79.988  35.525  1.00 25.19           C  
+ATOM   2544  CG  TRP A 581      32.006  80.757  36.163  1.00 26.56           C  
+ATOM   2545  CD1 TRP A 581      31.887  81.080  37.487  1.00 27.51           C  
+ATOM   2546  CD2 TRP A 581      30.833  81.257  35.521  1.00 26.96           C  
+ATOM   2547  NE1 TRP A 581      30.704  81.747  37.711  1.00 27.07           N  
+ATOM   2548  CE2 TRP A 581      30.038  81.872  36.522  1.00 27.92           C  
+ATOM   2549  CE3 TRP A 581      30.373  81.247  34.199  1.00 27.26           C  
+ATOM   2550  CZ2 TRP A 581      28.803  82.468  36.238  1.00 27.55           C  
+ATOM   2551  CZ3 TRP A 581      29.146  81.836  33.915  1.00 27.58           C  
+ATOM   2552  CH2 TRP A 581      28.373  82.441  34.935  1.00 28.50           C  
+ATOM   2553  N   TYR A 582      35.706  81.831  36.134  1.00 25.46           N  
+ATOM   2554  CA  TYR A 582      36.254  82.919  36.925  1.00 24.01           C  
+ATOM   2555  C   TYR A 582      37.443  83.644  36.314  1.00 24.51           C  
+ATOM   2556  O   TYR A 582      37.492  84.862  36.273  1.00 25.82           O  
+ATOM   2557  CB  TYR A 582      36.684  82.395  38.294  1.00 20.52           C  
+ATOM   2558  CG  TYR A 582      35.587  82.312  39.316  1.00 18.62           C  
+ATOM   2559  CD1 TYR A 582      34.873  81.128  39.509  1.00 17.95           C  
+ATOM   2560  CD2 TYR A 582      35.251  83.428  40.088  1.00 17.36           C  
+ATOM   2561  CE1 TYR A 582      33.839  81.052  40.447  1.00 16.47           C  
+ATOM   2562  CE2 TYR A 582      34.224  83.370  41.032  1.00 17.82           C  
+ATOM   2563  CZ  TYR A 582      33.520  82.174  41.202  1.00 18.33           C  
+ATOM   2564  OH  TYR A 582      32.503  82.103  42.111  1.00 21.41           O  
+ATOM   2565  N   ARG A 583      38.417  82.873  35.862  1.00 27.33           N  
+ATOM   2566  CA  ARG A 583      39.670  83.398  35.331  1.00 27.02           C  
+ATOM   2567  C   ARG A 583      39.660  84.125  34.002  1.00 26.94           C  
+ATOM   2568  O   ARG A 583      38.897  83.788  33.085  1.00 27.10           O  
+ATOM   2569  CB  ARG A 583      40.695  82.261  35.283  1.00 26.13           C  
+ATOM   2570  CG  ARG A 583      40.994  81.753  36.661  1.00 24.98           C  
+ATOM   2571  CD  ARG A 583      41.722  82.848  37.368  1.00 26.55           C  
+ATOM   2572  NE  ARG A 583      41.536  82.857  38.809  1.00 27.71           N  
+ATOM   2573  CZ  ARG A 583      42.183  83.686  39.620  1.00 26.66           C  
+ATOM   2574  NH1 ARG A 583      43.055  84.554  39.114  1.00 24.90           N  
+ATOM   2575  NH2 ARG A 583      41.944  83.662  40.925  1.00 26.75           N  
+ATOM   2576  N   PRO A 584      40.528  85.145  33.887  1.00 28.80           N  
+ATOM   2577  CA  PRO A 584      40.688  85.975  32.687  1.00 29.47           C  
+ATOM   2578  C   PRO A 584      41.414  85.191  31.604  1.00 31.56           C  
+ATOM   2579  O   PRO A 584      42.400  84.512  31.874  1.00 31.06           O  
+ATOM   2580  CB  PRO A 584      41.487  87.175  33.199  1.00 27.82           C  
+ATOM   2581  CG  PRO A 584      42.270  86.603  34.347  1.00 25.32           C  
+ATOM   2582  CD  PRO A 584      41.285  85.702  35.022  1.00 26.93           C  
+ATOM   2583  N   VAL A 585      40.909  85.283  30.383  1.00 35.75           N  
+ATOM   2584  CA  VAL A 585      41.472  84.566  29.242  1.00 37.23           C  
+ATOM   2585  C   VAL A 585      42.999  84.584  29.060  1.00 36.27           C  
+ATOM   2586  O   VAL A 585      43.583  83.570  28.692  1.00 36.08           O  
+ATOM   2587  CB  VAL A 585      40.817  85.054  27.935  1.00 40.72           C  
+ATOM   2588  CG1 VAL A 585      41.412  84.333  26.748  1.00 46.60           C  
+ATOM   2589  CG2 VAL A 585      39.322  84.812  27.995  1.00 46.16           C  
+ATOM   2590  N   ALA A 586      43.651  85.718  29.305  1.00 34.65           N  
+ATOM   2591  CA  ALA A 586      45.101  85.796  29.123  1.00 32.54           C  
+ATOM   2592  C   ALA A 586      45.890  85.047  30.190  1.00 34.09           C  
+ATOM   2593  O   ALA A 586      47.113  84.964  30.125  1.00 34.63           O  
+ATOM   2594  CB  ALA A 586      45.538  87.236  29.094  1.00 27.83           C  
+ATOM   2595  N   GLU A 587      45.191  84.498  31.172  1.00 36.49           N  
+ATOM   2596  CA  GLU A 587      45.858  83.771  32.237  1.00 37.91           C  
+ATOM   2597  C   GLU A 587      46.138  82.349  31.751  1.00 38.18           C  
+ATOM   2598  O   GLU A 587      46.884  81.601  32.395  1.00 37.07           O  
+ATOM   2599  CB  GLU A 587      44.983  83.777  33.500  1.00 41.13           C  
+ATOM   2600  CG  GLU A 587      45.765  83.883  34.814  1.00 45.48           C  
+ATOM   2601  CD  GLU A 587      44.921  84.427  35.968  1.00 48.26           C  
+ATOM   2602  OE1 GLU A 587      43.830  83.877  36.217  1.00 48.04           O  
+ATOM   2603  OE2 GLU A 587      45.349  85.401  36.630  1.00 49.66           O  
+ATOM   2604  N   PHE A 588      45.535  81.989  30.611  1.00 37.92           N  
+ATOM   2605  CA  PHE A 588      45.735  80.676  29.986  1.00 36.59           C  
+ATOM   2606  C   PHE A 588      46.836  80.829  28.936  1.00 36.70           C  
+ATOM   2607  O   PHE A 588      47.228  81.949  28.602  1.00 39.31           O  
+ATOM   2608  CB  PHE A 588      44.463  80.178  29.278  1.00 35.11           C  
+ATOM   2609  CG  PHE A 588      43.308  79.904  30.197  1.00 33.37           C  
+ATOM   2610  CD1 PHE A 588      42.505  80.935  30.647  1.00 33.60           C  
+ATOM   2611  CD2 PHE A 588      43.028  78.607  30.614  1.00 35.16           C  
+ATOM   2612  CE1 PHE A 588      41.439  80.688  31.497  1.00 33.35           C  
+ATOM   2613  CE2 PHE A 588      41.962  78.345  31.469  1.00 34.59           C  
+ATOM   2614  CZ  PHE A 588      41.167  79.391  31.911  1.00 34.17           C  
+ATOM   2615  N   ALA A 589      47.332  79.712  28.414  1.00 39.83           N  
+ATOM   2616  CA  ALA A 589      48.378  79.748  27.390  1.00 43.14           C  
+ATOM   2617  C   ALA A 589      47.780  80.222  26.064  1.00 47.90           C  
+ATOM   2618  O   ALA A 589      46.649  79.867  25.729  1.00 47.33           O  
+ATOM   2619  CB  ALA A 589      49.006  78.355  27.221  1.00 41.05           C  
+ATOM   2620  N   GLN A 590      48.539  81.020  25.316  1.00 53.41           N  
+ATOM   2621  CA  GLN A 590      48.071  81.540  24.038  1.00 56.42           C  
+ATOM   2622  C   GLN A 590      47.367  80.463  23.229  1.00 54.51           C  
+ATOM   2623  O   GLN A 590      46.179  80.561  22.933  1.00 51.00           O  
+ATOM   2624  CB  GLN A 590      49.241  82.116  23.241  1.00 66.29           C  
+ATOM   2625  CG  GLN A 590      48.905  82.420  21.796  1.00 84.97           C  
+ATOM   2626  CD  GLN A 590      49.975  83.245  21.111  1.00 93.82           C  
+ATOM   2627  OE1 GLN A 590      51.172  83.003  21.286  1.00 96.71           O  
+ATOM   2628  NE2 GLN A 590      49.550  84.222  20.313  1.00 96.36           N  
+ATOM   2629  N   SER A 591      48.111  79.429  22.881  1.00 48.00           N  
+ATOM   2630  CA  SER A 591      47.584  78.313  22.120  1.00 41.22           C  
+ATOM   2631  C   SER A 591      46.155  77.899  22.462  1.00 38.84           C  
+ATOM   2632  O   SER A 591      45.393  77.583  21.569  1.00 35.43           O  
+ATOM   2633  CB  SER A 591      48.506  77.104  22.299  1.00 41.77           C  
+ATOM   2634  OG  SER A 591      47.896  75.917  21.826  1.00 49.39           O  
+ATOM   2635  N   ILE A 592      45.784  77.902  23.740  1.00 36.38           N  
+ATOM   2636  CA  ILE A 592      44.446  77.456  24.143  1.00 34.42           C  
+ATOM   2637  C   ILE A 592      43.332  78.504  24.318  1.00 34.84           C  
+ATOM   2638  O   ILE A 592      42.131  78.157  24.349  1.00 34.41           O  
+ATOM   2639  CB  ILE A 592      44.538  76.592  25.439  1.00 36.98           C  
+ATOM   2640  CG1 ILE A 592      44.225  75.137  25.092  1.00 40.69           C  
+ATOM   2641  CG2 ILE A 592      43.596  77.099  26.513  1.00 39.89           C  
+ATOM   2642  CD1 ILE A 592      44.065  74.234  26.298  1.00 43.91           C  
+ATOM   2643  N   GLN A 593      43.724  79.773  24.420  1.00 34.78           N  
+ATOM   2644  CA  GLN A 593      42.779  80.874  24.612  1.00 35.22           C  
+ATOM   2645  C   GLN A 593      41.567  80.919  23.671  1.00 38.22           C  
+ATOM   2646  O   GLN A 593      40.448  81.185  24.113  1.00 35.60           O  
+ATOM   2647  CB  GLN A 593      43.546  82.191  24.571  1.00 31.57           C  
+ATOM   2648  CG  GLN A 593      44.330  82.411  25.849  1.00 31.00           C  
+ATOM   2649  CD  GLN A 593      45.340  83.529  25.763  1.00 28.03           C  
+ATOM   2650  OE1 GLN A 593      45.091  84.558  25.145  1.00 29.68           O  
+ATOM   2651  NE2 GLN A 593      46.483  83.340  26.408  1.00 27.12           N  
+ATOM   2652  N   SER A 594      41.787  80.648  22.387  1.00 44.66           N  
+ATOM   2653  CA  SER A 594      40.711  80.647  21.394  1.00 48.05           C  
+ATOM   2654  C   SER A 594      39.621  79.661  21.806  1.00 46.69           C  
+ATOM   2655  O   SER A 594      38.425  79.912  21.627  1.00 45.12           O  
+ATOM   2656  CB  SER A 594      41.251  80.242  20.013  1.00 53.17           C  
+ATOM   2657  OG  SER A 594      42.339  81.059  19.614  1.00 67.56           O  
+ATOM   2658  N   ARG A 595      40.043  78.532  22.361  1.00 44.53           N  
+ATOM   2659  CA  ARG A 595      39.100  77.516  22.782  1.00 41.48           C  
+ATOM   2660  C   ARG A 595      38.449  77.910  24.108  1.00 38.75           C  
+ATOM   2661  O   ARG A 595      37.300  77.565  24.379  1.00 40.07           O  
+ATOM   2662  CB  ARG A 595      39.820  76.177  22.901  1.00 40.52           C  
+ATOM   2663  CG  ARG A 595      38.916  74.972  22.734  1.00 39.90           C  
+ATOM   2664  CD  ARG A 595      39.714  73.678  22.555  1.00 39.79           C  
+ATOM   2665  NE  ARG A 595      38.842  72.512  22.702  1.00 40.19           N  
+ATOM   2666  CZ  ARG A 595      39.256  71.251  22.661  1.00 39.91           C  
+ATOM   2667  NH1 ARG A 595      40.542  70.978  22.474  1.00 39.38           N  
+ATOM   2668  NH2 ARG A 595      38.383  70.265  22.821  1.00 39.87           N  
+ATOM   2669  N   ILE A 596      39.174  78.651  24.932  1.00 36.72           N  
+ATOM   2670  CA  ILE A 596      38.616  79.070  26.207  1.00 35.68           C  
+ATOM   2671  C   ILE A 596      37.556  80.162  26.029  1.00 34.31           C  
+ATOM   2672  O   ILE A 596      36.470  80.067  26.591  1.00 35.99           O  
+ATOM   2673  CB  ILE A 596      39.728  79.563  27.167  1.00 31.62           C  
+ATOM   2674  CG1 ILE A 596      40.638  78.387  27.541  1.00 26.32           C  
+ATOM   2675  CG2 ILE A 596      39.113  80.167  28.432  1.00 25.66           C  
+ATOM   2676  CD1 ILE A 596      39.931  77.246  28.261  1.00 22.06           C  
+ATOM   2677  N   VAL A 597      37.871  81.194  25.249  1.00 33.55           N  
+ATOM   2678  CA  VAL A 597      36.923  82.283  25.010  1.00 36.20           C  
+ATOM   2679  C   VAL A 597      35.633  81.684  24.490  1.00 40.37           C  
+ATOM   2680  O   VAL A 597      34.534  82.155  24.794  1.00 39.19           O  
+ATOM   2681  CB  VAL A 597      37.443  83.290  23.940  1.00 31.54           C  
+ATOM   2682  CG1 VAL A 597      36.335  84.274  23.569  1.00 24.61           C  
+ATOM   2683  CG2 VAL A 597      38.680  84.035  24.467  1.00 26.58           C  
+ATOM   2684  N   GLU A 598      35.794  80.631  23.699  1.00 45.55           N  
+ATOM   2685  CA  GLU A 598      34.682  79.915  23.085  1.00 48.25           C  
+ATOM   2686  C   GLU A 598      33.768  79.297  24.148  1.00 46.04           C  
+ATOM   2687  O   GLU A 598      32.546  79.287  23.993  1.00 41.56           O  
+ATOM   2688  CB  GLU A 598      35.255  78.838  22.168  1.00 57.33           C  
+ATOM   2689  CG  GLU A 598      34.370  78.382  21.041  1.00 73.73           C  
+ATOM   2690  CD  GLU A 598      35.137  77.507  20.070  1.00 82.03           C  
+ATOM   2691  OE1 GLU A 598      36.109  78.006  19.464  1.00 84.79           O  
+ATOM   2692  OE2 GLU A 598      34.782  76.320  19.917  1.00 85.58           O  
+ATOM   2693  N   TRP A 599      34.362  78.785  25.226  1.00 42.85           N  
+ATOM   2694  CA  TRP A 599      33.579  78.186  26.308  1.00 38.81           C  
+ATOM   2695  C   TRP A 599      32.967  79.237  27.223  1.00 37.56           C  
+ATOM   2696  O   TRP A 599      31.867  79.042  27.738  1.00 39.66           O  
+ATOM   2697  CB  TRP A 599      34.432  77.233  27.148  1.00 35.24           C  
+ATOM   2698  CG  TRP A 599      34.335  75.809  26.707  1.00 33.45           C  
+ATOM   2699  CD1 TRP A 599      35.197  75.139  25.890  1.00 31.98           C  
+ATOM   2700  CD2 TRP A 599      33.269  74.895  27.000  1.00 31.36           C  
+ATOM   2701  NE1 TRP A 599      34.733  73.867  25.657  1.00 32.33           N  
+ATOM   2702  CE2 TRP A 599      33.552  73.691  26.330  1.00 30.39           C  
+ATOM   2703  CE3 TRP A 599      32.106  74.980  27.777  1.00 31.68           C  
+ATOM   2704  CZ2 TRP A 599      32.709  72.581  26.390  1.00 29.61           C  
+ATOM   2705  CZ3 TRP A 599      31.264  73.867  27.838  1.00 32.24           C  
+ATOM   2706  CH2 TRP A 599      31.577  72.685  27.152  1.00 30.62           C  
+ATOM   2707  N   LYS A 600      33.688  80.338  27.437  1.00 39.23           N  
+ATOM   2708  CA  LYS A 600      33.203  81.432  28.282  1.00 42.83           C  
+ATOM   2709  C   LYS A 600      31.910  81.962  27.687  1.00 46.95           C  
+ATOM   2710  O   LYS A 600      30.915  82.152  28.395  1.00 47.83           O  
+ATOM   2711  CB  LYS A 600      34.226  82.568  28.347  1.00 41.74           C  
+ATOM   2712  CG  LYS A 600      35.355  82.326  29.308  1.00 39.47           C  
+ATOM   2713  CD  LYS A 600      36.473  83.331  29.110  1.00 37.46           C  
+ATOM   2714  CE  LYS A 600      37.545  83.143  30.172  1.00 38.36           C  
+ATOM   2715  NZ  LYS A 600      36.987  83.344  31.548  1.00 38.25           N  
+ATOM   2716  N   GLU A 601      31.939  82.210  26.379  1.00 49.49           N  
+ATOM   2717  CA  GLU A 601      30.770  82.693  25.675  1.00 48.89           C  
+ATOM   2718  C   GLU A 601      29.634  81.711  25.921  1.00 46.57           C  
+ATOM   2719  O   GLU A 601      28.566  82.092  26.398  1.00 43.63           O  
+ATOM   2720  CB  GLU A 601      31.072  82.805  24.182  1.00 53.59           C  
+ATOM   2721  CG  GLU A 601      31.778  84.100  23.811  1.00 65.00           C  
+ATOM   2722  CD  GLU A 601      32.285  84.127  22.375  1.00 70.52           C  
+ATOM   2723  OE1 GLU A 601      31.541  83.708  21.453  1.00 72.89           O  
+ATOM   2724  OE2 GLU A 601      33.433  84.583  22.173  1.00 72.11           O  
+ATOM   2725  N   ARG A 602      29.876  80.441  25.610  1.00 43.42           N  
+ATOM   2726  CA  ARG A 602      28.868  79.406  25.807  1.00 40.54           C  
+ATOM   2727  C   ARG A 602      28.247  79.632  27.184  1.00 38.64           C  
+ATOM   2728  O   ARG A 602      27.058  79.918  27.306  1.00 41.31           O  
+ATOM   2729  CB  ARG A 602      29.526  78.015  25.736  1.00 38.20           C  
+ATOM   2730  CG  ARG A 602      28.588  76.841  25.406  1.00 33.40           C  
+ATOM   2731  CD  ARG A 602      27.815  76.343  26.610  1.00 32.51           C  
+ATOM   2732  NE  ARG A 602      26.890  75.262  26.267  1.00 33.65           N  
+ATOM   2733  CZ  ARG A 602      27.253  74.090  25.752  1.00 32.11           C  
+ATOM   2734  NH1 ARG A 602      28.528  73.825  25.505  1.00 32.37           N  
+ATOM   2735  NH2 ARG A 602      26.336  73.171  25.499  1.00 32.57           N  
+ATOM   2736  N   LEU A 603      29.076  79.526  28.215  1.00 39.29           N  
+ATOM   2737  CA  LEU A 603      28.631  79.704  29.585  1.00 42.77           C  
+ATOM   2738  C   LEU A 603      27.896  81.008  29.816  1.00 49.18           C  
+ATOM   2739  O   LEU A 603      26.808  81.013  30.386  1.00 49.13           O  
+ATOM   2740  CB  LEU A 603      29.821  79.629  30.532  1.00 37.61           C  
+ATOM   2741  CG  LEU A 603      30.094  78.300  31.235  1.00 31.25           C  
+ATOM   2742  CD1 LEU A 603      29.483  77.143  30.472  1.00 26.77           C  
+ATOM   2743  CD2 LEU A 603      31.599  78.130  31.385  1.00 26.71           C  
+ATOM   2744  N   ASP A 604      28.487  82.114  29.382  1.00 56.19           N  
+ATOM   2745  CA  ASP A 604      27.860  83.414  29.581  1.00 59.09           C  
+ATOM   2746  C   ASP A 604      26.483  83.500  28.955  1.00 58.67           C  
+ATOM   2747  O   ASP A 604      25.570  84.103  29.526  1.00 52.52           O  
+ATOM   2748  CB  ASP A 604      28.755  84.533  29.051  1.00 69.55           C  
+ATOM   2749  CG  ASP A 604      29.865  84.903  30.029  1.00 85.72           C  
+ATOM   2750  OD1 ASP A 604      29.542  85.264  31.187  1.00 95.13           O  
+ATOM   2751  OD2 ASP A 604      31.056  84.835  29.645  1.00 94.11           O  
+ATOM   2752  N   LYS A 605      26.325  82.866  27.801  1.00 57.42           N  
+ATOM   2753  CA  LYS A 605      25.056  82.863  27.083  1.00 57.77           C  
+ATOM   2754  C   LYS A 605      23.979  81.994  27.754  1.00 57.98           C  
+ATOM   2755  O   LYS A 605      22.831  82.000  27.334  1.00 54.85           O  
+ATOM   2756  CB  LYS A 605      25.306  82.395  25.638  1.00 65.08           C  
+ATOM   2757  CG  LYS A 605      24.066  82.186  24.782  1.00 79.80           C  
+ATOM   2758  CD  LYS A 605      24.438  81.656  23.399  1.00 86.48           C  
+ATOM   2759  CE  LYS A 605      23.212  81.162  22.622  1.00 88.26           C  
+ATOM   2760  NZ  LYS A 605      22.581  79.939  23.222  1.00 87.98           N  
+ATOM   2761  N   GLU A 606      24.338  81.275  28.811  1.00 55.10           N  
+ATOM   2762  CA  GLU A 606      23.391  80.383  29.490  1.00 48.33           C  
+ATOM   2763  C   GLU A 606      23.189  80.657  30.965  1.00 42.25           C  
+ATOM   2764  O   GLU A 606      22.206  80.219  31.561  1.00 33.08           O  
+ATOM   2765  CB  GLU A 606      23.843  78.929  29.382  1.00 54.95           C  
+ATOM   2766  CG  GLU A 606      23.339  78.161  28.194  1.00 73.48           C  
+ATOM   2767  CD  GLU A 606      23.512  76.669  28.400  1.00 82.09           C  
+ATOM   2768  OE1 GLU A 606      22.845  76.127  29.310  1.00 84.95           O  
+ATOM   2769  OE2 GLU A 606      24.320  76.045  27.670  1.00 85.05           O  
+ATOM   2770  N   PHE A 607      24.141  81.344  31.571  1.00 35.19           N  
+ATOM   2771  CA  PHE A 607      24.028  81.625  32.985  1.00 29.64           C  
+ATOM   2772  C   PHE A 607      24.369  83.063  33.272  1.00 27.29           C  
+ATOM   2773  O   PHE A 607      25.403  83.577  32.837  1.00 28.17           O  
+ATOM   2774  CB  PHE A 607      24.970  80.726  33.793  1.00 28.55           C  
+ATOM   2775  CG  PHE A 607      24.757  79.268  33.571  1.00 24.92           C  
+ATOM   2776  CD1 PHE A 607      25.456  78.596  32.579  1.00 24.35           C  
+ATOM   2777  CD2 PHE A 607      23.835  78.570  34.337  1.00 23.12           C  
+ATOM   2778  CE1 PHE A 607      25.228  77.235  32.358  1.00 25.72           C  
+ATOM   2779  CE2 PHE A 607      23.604  77.222  34.124  1.00 23.34           C  
+ATOM   2780  CZ  PHE A 607      24.293  76.552  33.138  1.00 23.51           C  
+ATOM   2781  N   SER A 608      23.484  83.716  34.004  1.00 25.52           N  
+ATOM   2782  CA  SER A 608      23.723  85.097  34.376  1.00 24.81           C  
+ATOM   2783  C   SER A 608      24.430  85.047  35.720  1.00 26.75           C  
+ATOM   2784  O   SER A 608      24.391  84.042  36.433  1.00 21.04           O  
+ATOM   2785  CB  SER A 608      22.408  85.874  34.524  1.00 22.92           C  
+ATOM   2786  OG  SER A 608      21.711  85.460  35.682  1.00 22.36           O  
+ATOM   2787  N   LEU A 609      25.094  86.134  36.057  1.00 28.31           N  
+ATOM   2788  CA  LEU A 609      25.760  86.189  37.326  1.00 28.84           C  
+ATOM   2789  C   LEU A 609      24.780  85.995  38.461  1.00 26.62           C  
+ATOM   2790  O   LEU A 609      25.089  85.275  39.400  1.00 26.74           O  
+ATOM   2791  CB  LEU A 609      26.477  87.520  37.502  1.00 37.70           C  
+ATOM   2792  CG  LEU A 609      27.982  87.385  37.329  1.00 47.31           C  
+ATOM   2793  CD1 LEU A 609      28.643  88.732  37.485  1.00 53.39           C  
+ATOM   2794  CD2 LEU A 609      28.503  86.403  38.364  1.00 52.23           C  
+ATOM   2795  N   SER A 610      23.594  86.597  38.389  1.00 23.81           N  
+ATOM   2796  CA  SER A 610      22.669  86.441  39.511  1.00 22.92           C  
+ATOM   2797  C   SER A 610      22.212  84.994  39.704  1.00 21.40           C  
+ATOM   2798  O   SER A 610      21.977  84.562  40.836  1.00 21.25           O  
+ATOM   2799  CB  SER A 610      21.466  87.395  39.394  1.00 23.10           C  
+ATOM   2800  OG  SER A 610      20.607  87.042  38.331  1.00 27.62           O  
+ATOM   2801  N   VAL A 611      22.112  84.239  38.611  1.00 20.11           N  
+ATOM   2802  CA  VAL A 611      21.703  82.843  38.692  1.00 19.36           C  
+ATOM   2803  C   VAL A 611      22.791  82.037  39.413  1.00 19.17           C  
+ATOM   2804  O   VAL A 611      22.500  81.299  40.366  1.00 21.78           O  
+ATOM   2805  CB  VAL A 611      21.435  82.266  37.271  1.00 17.03           C  
+ATOM   2806  CG1 VAL A 611      21.189  80.762  37.306  1.00 10.43           C  
+ATOM   2807  CG2 VAL A 611      20.219  82.949  36.685  1.00 13.05           C  
+ATOM   2808  N   TYR A 612      24.036  82.178  38.964  1.00 18.86           N  
+ATOM   2809  CA  TYR A 612      25.146  81.471  39.591  1.00 21.47           C  
+ATOM   2810  C   TYR A 612      25.282  81.926  41.031  1.00 24.38           C  
+ATOM   2811  O   TYR A 612      25.589  81.127  41.920  1.00 22.30           O  
+ATOM   2812  CB  TYR A 612      26.458  81.755  38.865  1.00 20.33           C  
+ATOM   2813  CG  TYR A 612      27.680  81.268  39.610  1.00 16.74           C  
+ATOM   2814  CD1 TYR A 612      28.014  79.919  39.630  1.00 16.03           C  
+ATOM   2815  CD2 TYR A 612      28.499  82.155  40.291  1.00 16.43           C  
+ATOM   2816  CE1 TYR A 612      29.148  79.447  40.315  1.00 16.15           C  
+ATOM   2817  CE2 TYR A 612      29.631  81.709  40.986  1.00 18.51           C  
+ATOM   2818  CZ  TYR A 612      29.957  80.347  40.991  1.00 18.39           C  
+ATOM   2819  OH  TYR A 612      31.083  79.904  41.662  1.00 13.95           O  
+ATOM   2820  N   GLN A 613      25.072  83.220  41.248  1.00 25.82           N  
+ATOM   2821  CA  GLN A 613      25.149  83.791  42.583  1.00 28.59           C  
+ATOM   2822  C   GLN A 613      24.105  83.187  43.520  1.00 28.92           C  
+ATOM   2823  O   GLN A 613      24.356  83.029  44.706  1.00 24.28           O  
+ATOM   2824  CB  GLN A 613      24.952  85.300  42.533  1.00 35.32           C  
+ATOM   2825  CG  GLN A 613      26.248  86.055  42.541  1.00 48.52           C  
+ATOM   2826  CD  GLN A 613      27.222  85.443  43.506  1.00 54.26           C  
+ATOM   2827  OE1 GLN A 613      26.846  85.070  44.619  1.00 58.23           O  
+ATOM   2828  NE2 GLN A 613      28.480  85.328  43.094  1.00 55.22           N  
+ATOM   2829  N   LYS A 614      22.932  82.860  42.989  1.00 27.33           N  
+ATOM   2830  CA  LYS A 614      21.881  82.266  43.795  1.00 23.98           C  
+ATOM   2831  C   LYS A 614      22.275  80.855  44.197  1.00 20.88           C  
+ATOM   2832  O   LYS A 614      21.999  80.438  45.316  1.00 18.07           O  
+ATOM   2833  CB  LYS A 614      20.558  82.247  43.027  1.00 28.47           C  
+ATOM   2834  CG  LYS A 614      19.354  81.813  43.871  1.00 37.11           C  
+ATOM   2835  CD  LYS A 614      18.047  82.294  43.231  1.00 42.35           C  
+ATOM   2836  CE  LYS A 614      16.822  81.630  43.847  1.00 43.48           C  
+ATOM   2837  NZ  LYS A 614      16.781  80.164  43.532  1.00 44.05           N  
+ATOM   2838  N   MET A 615      22.914  80.119  43.289  1.00 18.29           N  
+ATOM   2839  CA  MET A 615      23.349  78.764  43.606  1.00 16.56           C  
+ATOM   2840  C   MET A 615      24.278  78.795  44.843  1.00 16.45           C  
+ATOM   2841  O   MET A 615      24.102  78.015  45.797  1.00 15.06           O  
+ATOM   2842  CB  MET A 615      24.077  78.134  42.406  1.00 14.76           C  
+ATOM   2843  CG  MET A 615      23.249  78.064  41.100  1.00 13.78           C  
+ATOM   2844  SD  MET A 615      23.998  77.183  39.622  1.00  9.75           S  
+ATOM   2845  CE  MET A 615      25.642  77.410  39.893  1.00 10.37           C  
+ATOM   2846  N   LYS A 616      25.247  79.712  44.838  1.00 19.52           N  
+ATOM   2847  CA  LYS A 616      26.177  79.837  45.957  1.00 21.30           C  
+ATOM   2848  C   LYS A 616      25.424  80.166  47.232  1.00 22.53           C  
+ATOM   2849  O   LYS A 616      25.790  79.709  48.313  1.00 23.38           O  
+ATOM   2850  CB  LYS A 616      27.217  80.923  45.678  1.00 21.04           C  
+ATOM   2851  CG  LYS A 616      28.231  80.563  44.577  1.00 20.90           C  
+ATOM   2852  CD  LYS A 616      29.512  81.404  44.706  1.00 20.31           C  
+ATOM   2853  CE  LYS A 616      30.320  80.990  45.945  1.00 21.79           C  
+ATOM   2854  NZ  LYS A 616      31.278  82.030  46.418  1.00 19.43           N  
+ATOM   2855  N   PHE A 617      24.363  80.957  47.097  1.00 24.76           N  
+ATOM   2856  CA  PHE A 617      23.537  81.348  48.238  1.00 26.40           C  
+ATOM   2857  C   PHE A 617      22.796  80.127  48.770  1.00 25.96           C  
+ATOM   2858  O   PHE A 617      22.663  79.931  49.980  1.00 25.12           O  
+ATOM   2859  CB  PHE A 617      22.519  82.413  47.823  1.00 29.39           C  
+ATOM   2860  CG  PHE A 617      21.526  82.758  48.900  1.00 34.26           C  
+ATOM   2861  CD1 PHE A 617      21.832  83.705  49.871  1.00 33.58           C  
+ATOM   2862  CD2 PHE A 617      20.281  82.121  48.948  1.00 36.63           C  
+ATOM   2863  CE1 PHE A 617      20.914  84.019  50.879  1.00 35.37           C  
+ATOM   2864  CE2 PHE A 617      19.355  82.424  49.950  1.00 36.25           C  
+ATOM   2865  CZ  PHE A 617      19.671  83.376  50.919  1.00 36.19           C  
+ATOM   2866  N   ASN A 618      22.306  79.301  47.853  1.00 27.23           N  
+ATOM   2867  CA  ASN A 618      21.587  78.097  48.245  1.00 27.67           C  
+ATOM   2868  C   ASN A 618      22.514  77.156  49.023  1.00 27.35           C  
+ATOM   2869  O   ASN A 618      22.105  76.587  50.029  1.00 28.30           O  
+ATOM   2870  CB  ASN A 618      20.964  77.405  47.009  1.00 24.46           C  
+ATOM   2871  CG  ASN A 618      19.785  78.201  46.419  1.00 21.11           C  
+ATOM   2872  OD1 ASN A 618      19.173  79.036  47.100  1.00 19.68           O  
+ATOM   2873  ND2 ASN A 618      19.466  77.939  45.157  1.00 19.80           N  
+ATOM   2874  N   VAL A 619      23.757  77.003  48.567  1.00 28.91           N  
+ATOM   2875  CA  VAL A 619      24.722  76.154  49.274  1.00 30.25           C  
+ATOM   2876  C   VAL A 619      24.951  76.706  50.678  1.00 30.14           C  
+ATOM   2877  O   VAL A 619      24.969  75.963  51.652  1.00 32.11           O  
+ATOM   2878  CB  VAL A 619      26.090  76.117  48.570  1.00 28.56           C  
+ATOM   2879  CG1 VAL A 619      27.103  75.463  49.463  1.00 25.83           C  
+ATOM   2880  CG2 VAL A 619      25.990  75.352  47.265  1.00 25.43           C  
+ATOM   2881  N   ALA A 620      25.135  78.017  50.770  1.00 32.43           N  
+ATOM   2882  CA  ALA A 620      25.347  78.669  52.057  1.00 34.47           C  
+ATOM   2883  C   ALA A 620      24.223  78.326  53.039  1.00 34.97           C  
+ATOM   2884  O   ALA A 620      24.475  78.025  54.209  1.00 39.08           O  
+ATOM   2885  CB  ALA A 620      25.432  80.177  51.866  1.00 32.79           C  
+ATOM   2886  N   MET A 621      22.983  78.383  52.559  1.00 34.89           N  
+ATOM   2887  CA  MET A 621      21.817  78.066  53.381  1.00 34.57           C  
+ATOM   2888  C   MET A 621      21.591  76.547  53.482  1.00 35.45           C  
+ATOM   2889  O   MET A 621      20.667  76.098  54.159  1.00 34.35           O  
+ATOM   2890  CB  MET A 621      20.575  78.715  52.773  1.00 33.54           C  
+ATOM   2891  CG  MET A 621      20.609  80.226  52.751  1.00 29.11           C  
+ATOM   2892  SD  MET A 621      20.573  80.916  54.408  1.00 28.26           S  
+ATOM   2893  CE  MET A 621      22.237  81.591  54.585  1.00 27.21           C  
+ATOM   2894  N   GLY A 622      22.443  75.777  52.799  1.00 35.73           N  
+ATOM   2895  CA  GLY A 622      22.332  74.327  52.782  1.00 33.53           C  
+ATOM   2896  C   GLY A 622      20.992  73.815  52.283  1.00 31.98           C  
+ATOM   2897  O   GLY A 622      20.355  73.045  52.986  1.00 32.22           O  
+ATOM   2898  N   ILE A 623      20.566  74.197  51.078  1.00 30.07           N  
+ATOM   2899  CA  ILE A 623      19.267  73.741  50.591  1.00 32.89           C  
+ATOM   2900  C   ILE A 623      19.139  73.076  49.217  1.00 33.69           C  
+ATOM   2901  O   ILE A 623      18.151  72.369  48.954  1.00 36.79           O  
+ATOM   2902  CB  ILE A 623      18.232  74.874  50.621  1.00 30.24           C  
+ATOM   2903  CG1 ILE A 623      18.709  76.044  49.759  1.00 29.79           C  
+ATOM   2904  CG2 ILE A 623      17.976  75.291  52.059  1.00 27.93           C  
+ATOM   2905  CD1 ILE A 623      17.661  77.097  49.506  1.00 27.29           C  
+ATOM   2906  N   GLY A 624      20.099  73.272  48.331  1.00 34.27           N  
+ATOM   2907  CA  GLY A 624      19.954  72.640  47.032  1.00 34.32           C  
+ATOM   2908  C   GLY A 624      20.329  73.669  46.002  1.00 34.23           C  
+ATOM   2909  O   GLY A 624      19.533  74.527  45.631  1.00 32.29           O  
+ATOM   2910  N   VAL A 625      21.570  73.585  45.550  1.00 33.64           N  
+ATOM   2911  CA  VAL A 625      22.085  74.525  44.586  1.00 33.38           C  
+ATOM   2912  C   VAL A 625      21.007  74.965  43.604  1.00 33.30           C  
+ATOM   2913  O   VAL A 625      20.843  76.153  43.347  1.00 35.04           O  
+ATOM   2914  CB  VAL A 625      23.272  73.912  43.816  1.00 32.55           C  
+ATOM   2915  CG1 VAL A 625      24.097  75.018  43.168  1.00 29.70           C  
+ATOM   2916  CG2 VAL A 625      24.123  73.095  44.756  1.00 30.89           C  
+ATOM   2917  N   LEU A 626      20.241  74.010  43.094  1.00 34.40           N  
+ATOM   2918  CA  LEU A 626      19.212  74.312  42.108  1.00 35.68           C  
+ATOM   2919  C   LEU A 626      17.853  74.797  42.581  1.00 38.46           C  
+ATOM   2920  O   LEU A 626      16.930  74.916  41.776  1.00 39.06           O  
+ATOM   2921  CB  LEU A 626      19.007  73.110  41.198  1.00 31.73           C  
+ATOM   2922  CG  LEU A 626      20.280  72.622  40.524  1.00 28.36           C  
+ATOM   2923  CD1 LEU A 626      19.894  71.560  39.502  1.00 25.73           C  
+ATOM   2924  CD2 LEU A 626      21.015  73.799  39.877  1.00 24.32           C  
+ATOM   2925  N   ASP A 627      17.701  75.077  43.867  1.00 44.95           N  
+ATOM   2926  CA  ASP A 627      16.412  75.576  44.321  1.00 50.87           C  
+ATOM   2927  C   ASP A 627      16.258  77.032  43.872  1.00 53.87           C  
+ATOM   2928  O   ASP A 627      17.278  77.659  43.480  1.00 55.14           O  
+ATOM   2929  CB  ASP A 627      16.288  75.481  45.846  1.00 53.95           C  
+ATOM   2930  CG  ASP A 627      16.030  74.064  46.321  1.00 57.53           C  
+ATOM   2931  OD1 ASP A 627      15.698  73.194  45.483  1.00 57.84           O  
+ATOM   2932  OD2 ASP A 627      16.149  73.819  47.537  1.00 59.41           O  
+ATOM   2933  OXT ASP A 627      15.113  77.534  43.922  1.00 56.88           O  
+TER    2934      ASP A 627                                                      
+ATOM   2935  N   LYS B 266      59.471  52.275  -0.025  1.00 86.31           N  
+ATOM   2936  CA  LYS B 266      60.374  51.550  -0.960  1.00 84.38           C  
+ATOM   2937  C   LYS B 266      61.457  50.774  -0.231  1.00 86.62           C  
+ATOM   2938  O   LYS B 266      61.270  49.602   0.109  1.00 85.27           O  
+ATOM   2939  CB  LYS B 266      61.018  52.529  -1.947  1.00 84.51           C  
+ATOM   2940  CG  LYS B 266      60.035  53.072  -2.968  1.00 80.32           C  
+ATOM   2941  CD  LYS B 266      59.411  51.944  -3.789  1.00 77.55           C  
+ATOM   2942  CE  LYS B 266      58.226  52.441  -4.597  1.00 76.34           C  
+ATOM   2943  NZ  LYS B 266      57.670  51.378  -5.469  1.00 76.10           N  
+ATOM   2944  N   GLN B 267      62.588  51.426   0.010  1.00 81.43           N  
+ATOM   2945  CA  GLN B 267      63.691  50.771   0.694  1.00 75.99           C  
+ATOM   2946  C   GLN B 267      64.351  51.732   1.678  1.00 72.16           C  
+ATOM   2947  O   GLN B 267      65.257  52.473   1.311  1.00 64.47           O  
+ATOM   2948  CB  GLN B 267      64.712  50.276  -0.340  1.00 79.72           C  
+ATOM   2949  CG  GLN B 267      65.760  49.321   0.206  1.00 90.15           C  
+ATOM   2950  CD  GLN B 267      65.151  48.081   0.831  1.00 94.61           C  
+ATOM   2951  OE1 GLN B 267      64.548  47.249   0.147  1.00 95.63           O  
+ATOM   2952  NE2 GLN B 267      65.303  47.954   2.144  1.00 96.24           N  
+ATOM   2953  N   VAL B 268      63.894  51.726   2.927  1.00 62.73           N  
+ATOM   2954  CA  VAL B 268      64.466  52.610   3.941  1.00 55.47           C  
+ATOM   2955  C   VAL B 268      65.918  52.276   4.259  1.00 52.02           C  
+ATOM   2956  O   VAL B 268      66.355  51.130   4.146  1.00 49.07           O  
+ATOM   2957  CB  VAL B 268      63.686  52.556   5.270  1.00 56.78           C  
+ATOM   2958  CG1 VAL B 268      64.198  53.633   6.216  1.00 60.42           C  
+ATOM   2959  CG2 VAL B 268      62.211  52.747   5.014  1.00 62.50           C  
+ATOM   2960  N   SER B 269      66.659  53.294   4.670  1.00 46.97           N  
+ATOM   2961  CA  SER B 269      68.059  53.128   5.010  1.00 43.00           C  
+ATOM   2962  C   SER B 269      68.184  52.901   6.505  1.00 41.62           C  
+ATOM   2963  O   SER B 269      67.874  53.788   7.302  1.00 44.05           O  
+ATOM   2964  CB  SER B 269      68.854  54.375   4.617  1.00 40.42           C  
+ATOM   2965  OG  SER B 269      70.214  54.240   4.990  1.00 36.78           O  
+ATOM   2966  N   TRP B 270      68.620  51.709   6.888  1.00 39.70           N  
+ATOM   2967  CA  TRP B 270      68.790  51.405   8.296  1.00 40.19           C  
+ATOM   2968  C   TRP B 270      70.035  52.136   8.797  1.00 42.41           C  
+ATOM   2969  O   TRP B 270      70.124  52.488   9.974  1.00 43.04           O  
+ATOM   2970  CB  TRP B 270      68.957  49.897   8.490  1.00 36.44           C  
+ATOM   2971  CG  TRP B 270      67.717  49.116   8.179  1.00 32.82           C  
+ATOM   2972  CD1 TRP B 270      66.843  49.350   7.162  1.00 28.94           C  
+ATOM   2973  CD2 TRP B 270      67.199  47.982   8.902  1.00 30.98           C  
+ATOM   2974  NE1 TRP B 270      65.811  48.440   7.205  1.00 28.11           N  
+ATOM   2975  CE2 TRP B 270      66.002  47.590   8.261  1.00 27.79           C  
+ATOM   2976  CE3 TRP B 270      67.631  47.264  10.032  1.00 30.12           C  
+ATOM   2977  CZ2 TRP B 270      65.221  46.513   8.706  1.00 27.65           C  
+ATOM   2978  CZ3 TRP B 270      66.847  46.181  10.482  1.00 28.47           C  
+ATOM   2979  CH2 TRP B 270      65.655  45.823   9.813  1.00 27.48           C  
+ATOM   2980  N   LYS B 271      70.982  52.387   7.892  1.00 43.15           N  
+ATOM   2981  CA  LYS B 271      72.232  53.048   8.259  1.00 42.97           C  
+ATOM   2982  C   LYS B 271      72.052  54.537   8.464  1.00 42.28           C  
+ATOM   2983  O   LYS B 271      72.806  55.162   9.196  1.00 38.58           O  
+ATOM   2984  CB  LYS B 271      73.305  52.797   7.193  1.00 46.26           C  
+ATOM   2985  CG  LYS B 271      74.736  52.865   7.734  1.00 53.06           C  
+ATOM   2986  CD  LYS B 271      75.782  52.441   6.700  1.00 56.56           C  
+ATOM   2987  CE  LYS B 271      76.322  53.620   5.908  1.00 57.17           C  
+ATOM   2988  NZ  LYS B 271      75.253  54.340   5.169  1.00 58.31           N  
+ATOM   2989  N   LEU B 272      71.049  55.111   7.817  1.00 40.42           N  
+ATOM   2990  CA  LEU B 272      70.809  56.535   7.970  1.00 39.09           C  
+ATOM   2991  C   LEU B 272      70.158  56.800   9.318  1.00 37.51           C  
+ATOM   2992  O   LEU B 272      70.376  57.851   9.926  1.00 36.91           O  
+ATOM   2993  CB  LEU B 272      69.922  57.073   6.845  1.00 43.62           C  
+ATOM   2994  CG  LEU B 272      70.535  58.222   6.032  1.00 47.96           C  
+ATOM   2995  CD1 LEU B 272      69.438  58.892   5.232  1.00 50.99           C  
+ATOM   2996  CD2 LEU B 272      71.204  59.239   6.951  1.00 50.25           C  
+ATOM   2997  N   VAL B 273      69.355  55.846   9.782  1.00 34.46           N  
+ATOM   2998  CA  VAL B 273      68.702  55.964  11.081  1.00 31.40           C  
+ATOM   2999  C   VAL B 273      69.756  55.736  12.167  1.00 30.01           C  
+ATOM   3000  O   VAL B 273      69.811  56.475  13.148  1.00 28.25           O  
+ATOM   3001  CB  VAL B 273      67.552  54.936  11.221  1.00 31.07           C  
+ATOM   3002  CG1 VAL B 273      66.858  55.084  12.577  1.00 28.72           C  
+ATOM   3003  CG2 VAL B 273      66.550  55.145  10.097  1.00 29.08           C  
+ATOM   3004  N   THR B 274      70.607  54.729  11.974  1.00 29.08           N  
+ATOM   3005  CA  THR B 274      71.661  54.442  12.941  1.00 31.40           C  
+ATOM   3006  C   THR B 274      72.573  55.656  13.089  1.00 36.97           C  
+ATOM   3007  O   THR B 274      73.070  55.932  14.179  1.00 33.62           O  
+ATOM   3008  CB  THR B 274      72.511  53.205  12.535  1.00 27.12           C  
+ATOM   3009  OG1 THR B 274      71.710  52.027  12.634  1.00 26.37           O  
+ATOM   3010  CG2 THR B 274      73.697  53.020  13.472  1.00 24.28           C  
+ATOM   3011  N   GLU B 275      72.795  56.382  11.997  1.00 44.33           N  
+ATOM   3012  CA  GLU B 275      73.624  57.576  12.063  1.00 48.98           C  
+ATOM   3013  C   GLU B 275      72.955  58.529  13.043  1.00 47.13           C  
+ATOM   3014  O   GLU B 275      73.559  58.979  14.019  1.00 44.34           O  
+ATOM   3015  CB  GLU B 275      73.706  58.256  10.700  1.00 61.55           C  
+ATOM   3016  CG  GLU B 275      74.772  57.717   9.786  1.00 85.55           C  
+ATOM   3017  CD  GLU B 275      74.741  58.391   8.433  1.00 95.88           C  
+ATOM   3018  OE1 GLU B 275      74.791  59.640   8.384  1.00 99.15           O  
+ATOM   3019  OE2 GLU B 275      74.666  57.669   7.418  1.00 99.19           O  
+ATOM   3020  N   TYR B 276      71.689  58.828  12.779  1.00 41.64           N  
+ATOM   3021  CA  TYR B 276      70.938  59.731  13.628  1.00 34.97           C  
+ATOM   3022  C   TYR B 276      71.055  59.329  15.092  1.00 33.20           C  
+ATOM   3023  O   TYR B 276      71.281  60.164  15.950  1.00 31.08           O  
+ATOM   3024  CB  TYR B 276      69.468  59.752  13.210  1.00 31.86           C  
+ATOM   3025  CG  TYR B 276      68.637  60.668  14.067  1.00 29.83           C  
+ATOM   3026  CD1 TYR B 276      68.897  62.037  14.107  1.00 30.09           C  
+ATOM   3027  CD2 TYR B 276      67.606  60.167  14.864  1.00 30.82           C  
+ATOM   3028  CE1 TYR B 276      68.162  62.882  14.915  1.00 29.94           C  
+ATOM   3029  CE2 TYR B 276      66.862  61.005  15.677  1.00 30.77           C  
+ATOM   3030  CZ  TYR B 276      67.148  62.362  15.693  1.00 30.80           C  
+ATOM   3031  OH  TYR B 276      66.410  63.201  16.486  1.00 34.43           O  
+ATOM   3032  N   ALA B 277      70.911  58.047  15.381  1.00 34.29           N  
+ATOM   3033  CA  ALA B 277      71.003  57.600  16.759  1.00 35.87           C  
+ATOM   3034  C   ALA B 277      72.387  57.866  17.347  1.00 36.14           C  
+ATOM   3035  O   ALA B 277      72.499  58.424  18.441  1.00 37.64           O  
+ATOM   3036  CB  ALA B 277      70.664  56.114  16.852  1.00 36.71           C  
+ATOM   3037  N   MET B 278      73.433  57.471  16.618  1.00 35.83           N  
+ATOM   3038  CA  MET B 278      74.817  57.642  17.068  1.00 36.61           C  
+ATOM   3039  C   MET B 278      75.210  59.080  17.347  1.00 40.00           C  
+ATOM   3040  O   MET B 278      76.012  59.342  18.232  1.00 37.10           O  
+ATOM   3041  CB  MET B 278      75.797  57.078  16.041  1.00 35.98           C  
+ATOM   3042  CG  MET B 278      75.964  55.573  16.058  1.00 38.79           C  
+ATOM   3043  SD  MET B 278      76.782  54.900  17.532  1.00 41.29           S  
+ATOM   3044  CE  MET B 278      77.491  56.401  18.327  1.00 38.77           C  
+ATOM   3045  N   GLU B 279      74.644  60.011  16.589  1.00 42.20           N  
+ATOM   3046  CA  GLU B 279      74.965  61.423  16.749  1.00 42.49           C  
+ATOM   3047  C   GLU B 279      74.025  62.122  17.720  1.00 41.80           C  
+ATOM   3048  O   GLU B 279      74.100  63.332  17.917  1.00 33.64           O  
+ATOM   3049  CB  GLU B 279      74.939  62.115  15.381  1.00 51.90           C  
+ATOM   3050  CG  GLU B 279      75.696  61.330  14.314  1.00 73.72           C  
+ATOM   3051  CD  GLU B 279      75.993  62.135  13.068  1.00 83.44           C  
+ATOM   3052  OE1 GLU B 279      75.087  62.858  12.601  1.00 87.47           O  
+ATOM   3053  OE2 GLU B 279      77.129  62.034  12.553  1.00 86.16           O  
+ATOM   3054  N   THR B 280      73.146  61.343  18.334  1.00 40.43           N  
+ATOM   3055  CA  THR B 280      72.194  61.854  19.304  1.00 37.13           C  
+ATOM   3056  C   THR B 280      72.490  61.123  20.609  1.00 38.77           C  
+ATOM   3057  O   THR B 280      71.958  61.456  21.665  1.00 35.72           O  
+ATOM   3058  CB  THR B 280      70.745  61.578  18.846  1.00 39.27           C  
+ATOM   3059  OG1 THR B 280      70.429  62.421  17.730  1.00 47.57           O  
+ATOM   3060  CG2 THR B 280      69.769  61.864  19.957  1.00 49.31           C  
+ATOM   3061  N   LYS B 281      73.376  60.135  20.527  1.00 43.68           N  
+ATOM   3062  CA  LYS B 281      73.751  59.335  21.685  1.00 45.87           C  
+ATOM   3063  C   LYS B 281      72.482  58.708  22.261  1.00 45.08           C  
+ATOM   3064  O   LYS B 281      72.383  58.440  23.457  1.00 45.40           O  
+ATOM   3065  CB  LYS B 281      74.454  60.220  22.720  1.00 51.30           C  
+ATOM   3066  CG  LYS B 281      75.735  60.880  22.201  1.00 62.19           C  
+ATOM   3067  CD  LYS B 281      76.982  60.421  22.977  1.00 67.78           C  
+ATOM   3068  CE  LYS B 281      78.260  61.108  22.474  1.00 69.13           C  
+ATOM   3069  NZ  LYS B 281      79.510  60.688  23.190  1.00 68.42           N  
+ATOM   3070  N   CYS B 282      71.524  58.460  21.372  1.00 44.69           N  
+ATOM   3071  CA  CYS B 282      70.225  57.895  21.728  1.00 43.41           C  
+ATOM   3072  C   CYS B 282      70.198  56.383  21.908  1.00 46.14           C  
+ATOM   3073  O   CYS B 282      70.397  55.630  20.965  1.00 42.02           O  
+ATOM   3074  CB  CYS B 282      69.192  58.290  20.679  1.00 41.14           C  
+ATOM   3075  SG  CYS B 282      67.557  57.665  21.058  1.00 43.83           S  
+ATOM   3076  N   ASP B 283      69.907  55.953  23.130  1.00 49.59           N  
+ATOM   3077  CA  ASP B 283      69.860  54.531  23.492  1.00 50.83           C  
+ATOM   3078  C   ASP B 283      68.426  54.072  23.785  1.00 49.49           C  
+ATOM   3079  O   ASP B 283      68.194  52.926  24.178  1.00 41.18           O  
+ATOM   3080  CB  ASP B 283      70.735  54.319  24.727  1.00 63.58           C  
+ATOM   3081  CG  ASP B 283      70.372  55.270  25.853  1.00 82.71           C  
+ATOM   3082  OD1 ASP B 283      69.388  54.992  26.570  1.00 92.88           O  
+ATOM   3083  OD2 ASP B 283      71.054  56.307  26.009  1.00 92.28           O  
+ATOM   3084  N   ASP B 284      67.478  54.986  23.587  1.00 45.03           N  
+ATOM   3085  CA  ASP B 284      66.058  54.732  23.823  1.00 40.02           C  
+ATOM   3086  C   ASP B 284      65.371  54.385  22.496  1.00 36.23           C  
+ATOM   3087  O   ASP B 284      65.298  55.222  21.590  1.00 32.64           O  
+ATOM   3088  CB  ASP B 284      65.411  55.987  24.421  1.00 47.17           C  
+ATOM   3089  CG  ASP B 284      64.082  55.705  25.109  1.00 57.74           C  
+ATOM   3090  OD1 ASP B 284      63.261  54.925  24.577  1.00 62.39           O  
+ATOM   3091  OD2 ASP B 284      63.855  56.294  26.187  1.00 63.79           O  
+ATOM   3092  N   VAL B 285      64.868  53.158  22.384  1.00 32.04           N  
+ATOM   3093  CA  VAL B 285      64.196  52.718  21.168  1.00 28.26           C  
+ATOM   3094  C   VAL B 285      62.923  53.504  20.901  1.00 28.27           C  
+ATOM   3095  O   VAL B 285      62.726  54.038  19.813  1.00 28.51           O  
+ATOM   3096  CB  VAL B 285      63.831  51.241  21.238  1.00 25.00           C  
+ATOM   3097  CG1 VAL B 285      63.281  50.805  19.909  1.00 22.67           C  
+ATOM   3098  CG2 VAL B 285      65.057  50.425  21.604  1.00 23.69           C  
+ATOM   3099  N   LEU B 286      62.039  53.550  21.886  1.00 31.33           N  
+ATOM   3100  CA  LEU B 286      60.812  54.303  21.726  1.00 33.74           C  
+ATOM   3101  C   LEU B 286      61.144  55.762  21.406  1.00 33.70           C  
+ATOM   3102  O   LEU B 286      60.540  56.364  20.521  1.00 35.93           O  
+ATOM   3103  CB  LEU B 286      59.959  54.224  22.995  1.00 35.23           C  
+ATOM   3104  CG  LEU B 286      59.062  52.995  23.124  1.00 35.60           C  
+ATOM   3105  CD1 LEU B 286      58.140  53.178  24.314  1.00 36.20           C  
+ATOM   3106  CD2 LEU B 286      58.249  52.818  21.864  1.00 33.97           C  
+ATOM   3107  N   LEU B 287      62.103  56.333  22.126  1.00 31.94           N  
+ATOM   3108  CA  LEU B 287      62.493  57.713  21.875  1.00 30.42           C  
+ATOM   3109  C   LEU B 287      63.063  57.893  20.454  1.00 30.62           C  
+ATOM   3110  O   LEU B 287      62.723  58.853  19.762  1.00 30.82           O  
+ATOM   3111  CB  LEU B 287      63.511  58.171  22.916  1.00 26.17           C  
+ATOM   3112  CG  LEU B 287      63.963  59.633  22.852  1.00 22.88           C  
+ATOM   3113  CD1 LEU B 287      62.757  60.592  22.887  1.00 22.43           C  
+ATOM   3114  CD2 LEU B 287      64.890  59.883  24.022  1.00 20.85           C  
+ATOM   3115  N   LEU B 288      63.916  56.978  20.009  1.00 30.82           N  
+ATOM   3116  CA  LEU B 288      64.471  57.084  18.665  1.00 31.86           C  
+ATOM   3117  C   LEU B 288      63.334  57.110  17.653  1.00 32.56           C  
+ATOM   3118  O   LEU B 288      63.267  57.993  16.793  1.00 32.73           O  
+ATOM   3119  CB  LEU B 288      65.375  55.897  18.348  1.00 32.38           C  
+ATOM   3120  CG  LEU B 288      65.996  55.946  16.950  1.00 32.76           C  
+ATOM   3121  CD1 LEU B 288      66.849  57.216  16.805  1.00 33.91           C  
+ATOM   3122  CD2 LEU B 288      66.839  54.700  16.722  1.00 33.34           C  
+ATOM   3123  N   LEU B 289      62.456  56.118  17.754  1.00 33.96           N  
+ATOM   3124  CA  LEU B 289      61.308  56.021  16.872  1.00 35.96           C  
+ATOM   3125  C   LEU B 289      60.522  57.338  16.879  1.00 36.83           C  
+ATOM   3126  O   LEU B 289      60.176  57.877  15.827  1.00 37.25           O  
+ATOM   3127  CB  LEU B 289      60.395  54.890  17.339  1.00 37.04           C  
+ATOM   3128  CG  LEU B 289      59.044  54.812  16.624  1.00 39.40           C  
+ATOM   3129  CD1 LEU B 289      59.255  54.328  15.198  1.00 40.10           C  
+ATOM   3130  CD2 LEU B 289      58.109  53.887  17.369  1.00 38.85           C  
+ATOM   3131  N   GLY B 290      60.237  57.847  18.073  1.00 37.23           N  
+ATOM   3132  CA  GLY B 290      59.488  59.084  18.193  1.00 36.45           C  
+ATOM   3133  C   GLY B 290      60.171  60.234  17.488  1.00 36.87           C  
+ATOM   3134  O   GLY B 290      59.538  60.975  16.733  1.00 35.41           O  
+ATOM   3135  N   MET B 291      61.465  60.391  17.735  1.00 36.79           N  
+ATOM   3136  CA  MET B 291      62.217  61.463  17.111  1.00 37.44           C  
+ATOM   3137  C   MET B 291      62.156  61.357  15.587  1.00 37.26           C  
+ATOM   3138  O   MET B 291      61.709  62.280  14.892  1.00 37.80           O  
+ATOM   3139  CB  MET B 291      63.686  61.419  17.540  1.00 40.47           C  
+ATOM   3140  CG  MET B 291      63.960  61.701  19.001  1.00 46.97           C  
+ATOM   3141  SD  MET B 291      63.247  63.246  19.528  1.00 50.44           S  
+ATOM   3142  CE  MET B 291      64.092  64.451  18.429  1.00 51.21           C  
+ATOM   3143  N   TYR B 292      62.591  60.217  15.067  1.00 34.81           N  
+ATOM   3144  CA  TYR B 292      62.641  60.028  13.633  1.00 32.12           C  
+ATOM   3145  C   TYR B 292      61.337  60.248  12.880  1.00 32.36           C  
+ATOM   3146  O   TYR B 292      61.348  60.789  11.771  1.00 31.76           O  
+ATOM   3147  CB  TYR B 292      63.207  58.648  13.304  1.00 29.07           C  
+ATOM   3148  CG  TYR B 292      64.091  58.666  12.078  1.00 27.00           C  
+ATOM   3149  CD1 TYR B 292      65.304  59.355  12.079  1.00 25.14           C  
+ATOM   3150  CD2 TYR B 292      63.701  58.020  10.905  1.00 26.70           C  
+ATOM   3151  CE1 TYR B 292      66.108  59.395  10.946  1.00 25.08           C  
+ATOM   3152  CE2 TYR B 292      64.498  58.053   9.762  1.00 26.55           C  
+ATOM   3153  CZ  TYR B 292      65.697  58.742   9.787  1.00 25.16           C  
+ATOM   3154  OH  TYR B 292      66.483  58.770   8.655  1.00 24.14           O  
+ATOM   3155  N   LEU B 293      60.215  59.841  13.463  1.00 32.96           N  
+ATOM   3156  CA  LEU B 293      58.936  60.009  12.792  1.00 34.10           C  
+ATOM   3157  C   LEU B 293      58.524  61.466  12.609  1.00 35.67           C  
+ATOM   3158  O   LEU B 293      57.543  61.757  11.930  1.00 34.88           O  
+ATOM   3159  CB  LEU B 293      57.855  59.236  13.537  1.00 34.85           C  
+ATOM   3160  CG  LEU B 293      57.934  57.730  13.271  1.00 38.35           C  
+ATOM   3161  CD1 LEU B 293      57.021  56.955  14.206  1.00 38.90           C  
+ATOM   3162  CD2 LEU B 293      57.555  57.467  11.814  1.00 39.60           C  
+ATOM   3163  N   GLU B 294      59.276  62.387  13.193  1.00 37.48           N  
+ATOM   3164  CA  GLU B 294      58.943  63.798  13.045  1.00 38.99           C  
+ATOM   3165  C   GLU B 294      59.543  64.360  11.768  1.00 39.03           C  
+ATOM   3166  O   GLU B 294      59.090  65.379  11.250  1.00 38.64           O  
+ATOM   3167  CB  GLU B 294      59.476  64.604  14.215  1.00 42.19           C  
+ATOM   3168  CG  GLU B 294      59.108  64.033  15.541  1.00 50.29           C  
+ATOM   3169  CD  GLU B 294      59.314  65.017  16.654  1.00 53.28           C  
+ATOM   3170  OE1 GLU B 294      60.406  65.619  16.727  1.00 55.56           O  
+ATOM   3171  OE2 GLU B 294      58.377  65.185  17.462  1.00 56.22           O  
+ATOM   3172  N   PHE B 295      60.576  63.701  11.267  1.00 37.85           N  
+ATOM   3173  CA  PHE B 295      61.225  64.171  10.063  1.00 35.94           C  
+ATOM   3174  C   PHE B 295      60.489  63.760   8.802  1.00 36.20           C  
+ATOM   3175  O   PHE B 295      60.932  64.077   7.709  1.00 37.56           O  
+ATOM   3176  CB  PHE B 295      62.662  63.640   9.971  1.00 36.00           C  
+ATOM   3177  CG  PHE B 295      63.500  63.895  11.192  1.00 33.88           C  
+ATOM   3178  CD1 PHE B 295      63.299  65.027  11.979  1.00 34.40           C  
+ATOM   3179  CD2 PHE B 295      64.526  63.016  11.527  1.00 33.37           C  
+ATOM   3180  CE1 PHE B 295      64.113  65.279  13.082  1.00 35.16           C  
+ATOM   3181  CE2 PHE B 295      65.348  63.254  12.625  1.00 34.75           C  
+ATOM   3182  CZ  PHE B 295      65.147  64.388  13.408  1.00 34.92           C  
+ATOM   3183  N   GLN B 296      59.379  63.053   8.936  1.00 39.46           N  
+ATOM   3184  CA  GLN B 296      58.646  62.614   7.748  1.00 43.33           C  
+ATOM   3185  C   GLN B 296      57.928  63.754   7.030  1.00 45.50           C  
+ATOM   3186  O   GLN B 296      57.604  63.647   5.842  1.00 46.04           O  
+ATOM   3187  CB  GLN B 296      57.622  61.552   8.123  1.00 43.36           C  
+ATOM   3188  CG  GLN B 296      56.541  62.073   9.028  1.00 43.08           C  
+ATOM   3189  CD  GLN B 296      55.501  61.033   9.292  1.00 43.93           C  
+ATOM   3190  OE1 GLN B 296      55.816  59.937   9.743  1.00 45.16           O  
+ATOM   3191  NE2 GLN B 296      54.249  61.359   9.008  1.00 45.76           N  
+ATOM   3192  N   TYR B 297      57.675  64.832   7.765  1.00 49.91           N  
+ATOM   3193  CA  TYR B 297      56.995  66.003   7.232  1.00 52.28           C  
+ATOM   3194  C   TYR B 297      57.998  66.907   6.535  1.00 52.85           C  
+ATOM   3195  O   TYR B 297      59.174  66.924   6.891  1.00 52.37           O  
+ATOM   3196  CB  TYR B 297      56.306  66.765   8.366  1.00 55.46           C  
+ATOM   3197  CG  TYR B 297      55.411  65.893   9.226  1.00 60.11           C  
+ATOM   3198  CD1 TYR B 297      54.387  65.131   8.658  1.00 60.32           C  
+ATOM   3199  CD2 TYR B 297      55.617  65.793  10.602  1.00 61.87           C  
+ATOM   3200  CE1 TYR B 297      53.597  64.287   9.439  1.00 61.37           C  
+ATOM   3201  CE2 TYR B 297      54.831  64.950  11.394  1.00 61.93           C  
+ATOM   3202  CZ  TYR B 297      53.827  64.195  10.807  1.00 61.80           C  
+ATOM   3203  OH  TYR B 297      53.084  63.318  11.576  1.00 61.03           O  
+ATOM   3204  N   SER B 298      57.535  67.657   5.536  1.00 54.55           N  
+ATOM   3205  CA  SER B 298      58.420  68.564   4.807  1.00 54.26           C  
+ATOM   3206  C   SER B 298      59.022  69.543   5.804  1.00 57.78           C  
+ATOM   3207  O   SER B 298      58.315  70.094   6.659  1.00 53.69           O  
+ATOM   3208  CB  SER B 298      57.649  69.328   3.729  1.00 51.76           C  
+ATOM   3209  OG  SER B 298      56.776  70.280   4.307  1.00 51.11           O  
+ATOM   3210  N   PHE B 299      60.330  69.744   5.699  1.00 67.50           N  
+ATOM   3211  CA  PHE B 299      61.035  70.642   6.605  1.00 75.16           C  
+ATOM   3212  C   PHE B 299      60.907  72.101   6.148  1.00 76.58           C  
+ATOM   3213  O   PHE B 299      61.306  73.027   6.868  1.00 79.85           O  
+ATOM   3214  CB  PHE B 299      62.517  70.244   6.689  1.00 81.03           C  
+ATOM   3215  CG  PHE B 299      63.399  71.022   5.766  1.00 89.07           C  
+ATOM   3216  CD1 PHE B 299      64.220  72.031   6.259  1.00 91.52           C  
+ATOM   3217  CD2 PHE B 299      63.357  70.793   4.394  1.00 92.58           C  
+ATOM   3218  CE1 PHE B 299      64.985  72.804   5.401  1.00 93.46           C  
+ATOM   3219  CE2 PHE B 299      64.118  71.563   3.523  1.00 94.19           C  
+ATOM   3220  CZ  PHE B 299      64.934  72.573   4.028  1.00 94.38           C  
+ATOM   3221  N   GLU B 300      60.358  72.291   4.950  1.00 82.55           N  
+ATOM   3222  CA  GLU B 300      60.172  73.624   4.387  1.00 88.29           C  
+ATOM   3223  C   GLU B 300      59.367  74.511   5.327  1.00 91.18           C  
+ATOM   3224  O   GLU B 300      59.786  75.618   5.659  1.00 97.37           O  
+ATOM   3225  CB  GLU B 300      59.472  73.530   3.033  1.00 88.10           C  
+ATOM   3226  CG  GLU B 300      60.354  72.977   1.928  1.00 83.41           C  
+ATOM   3227  CD  GLU B 300      59.783  71.726   1.281  1.00 80.11           C  
+ATOM   3228  OE1 GLU B 300      58.698  71.808   0.662  1.00 78.42           O  
+ATOM   3229  OE2 GLU B 300      60.426  70.660   1.395  1.00 77.59           O  
+ATOM   3230  N   MET B 301      58.208  74.031   5.754  1.00 92.84           N  
+ATOM   3231  CA  MET B 301      57.391  74.809   6.671  1.00 92.01           C  
+ATOM   3232  C   MET B 301      57.487  74.216   8.077  1.00 88.96           C  
+ATOM   3233  O   MET B 301      56.523  74.278   8.856  1.00 84.33           O  
+ATOM   3234  CB  MET B 301      55.927  74.834   6.208  1.00 97.69           C  
+ATOM   3235  CG  MET B 301      55.674  75.604   4.911  1.00105.22           C  
+ATOM   3236  SD  MET B 301      56.053  74.670   3.406  1.00108.78           S  
+ATOM   3237  CE  MET B 301      54.460  73.900   3.081  1.00108.86           C  
+ATOM   3238  N   CYS B 302      58.647  73.639   8.402  1.00 79.72           N  
+ATOM   3239  CA  CYS B 302      58.841  73.048   9.723  1.00 70.14           C  
+ATOM   3240  C   CYS B 302      58.966  74.149  10.768  1.00 66.23           C  
+ATOM   3241  O   CYS B 302      59.919  74.926  10.758  1.00 63.11           O  
+ATOM   3242  CB  CYS B 302      60.086  72.149   9.752  1.00 65.55           C  
+ATOM   3243  SG  CYS B 302      60.689  71.769  11.439  1.00 61.97           S  
+ATOM   3244  N   LEU B 303      57.988  74.208  11.665  1.00 62.86           N  
+ATOM   3245  CA  LEU B 303      57.983  75.211  12.714  1.00 64.49           C  
+ATOM   3246  C   LEU B 303      59.033  74.891  13.768  1.00 66.76           C  
+ATOM   3247  O   LEU B 303      59.713  75.787  14.275  1.00 69.86           O  
+ATOM   3248  CB  LEU B 303      56.595  75.288  13.350  1.00 61.91           C  
+ATOM   3249  CG  LEU B 303      55.454  75.620  12.383  1.00 57.69           C  
+ATOM   3250  CD1 LEU B 303      54.133  75.686  13.152  1.00 54.85           C  
+ATOM   3251  CD2 LEU B 303      55.741  76.952  11.682  1.00 53.50           C  
+ATOM   3252  N   LYS B 304      59.163  73.609  14.094  1.00 67.18           N  
+ATOM   3253  CA  LYS B 304      60.136  73.178  15.086  1.00 65.15           C  
+ATOM   3254  C   LYS B 304      61.512  73.645  14.668  1.00 64.15           C  
+ATOM   3255  O   LYS B 304      62.286  74.130  15.488  1.00 60.14           O  
+ATOM   3256  CB  LYS B 304      60.106  71.654  15.240  1.00 66.27           C  
+ATOM   3257  CG  LYS B 304      58.852  71.176  15.954  1.00 70.91           C  
+ATOM   3258  CD  LYS B 304      58.809  69.676  16.184  1.00 72.65           C  
+ATOM   3259  CE  LYS B 304      57.549  69.307  16.957  1.00 73.53           C  
+ATOM   3260  NZ  LYS B 304      57.318  67.843  16.974  1.00 74.13           N  
+ATOM   3261  N   CYS B 305      61.804  73.510  13.381  1.00 63.82           N  
+ATOM   3262  CA  CYS B 305      63.086  73.936  12.838  1.00 64.62           C  
+ATOM   3263  C   CYS B 305      63.086  75.460  12.767  1.00 65.05           C  
+ATOM   3264  O   CYS B 305      63.988  76.116  13.280  1.00 68.09           O  
+ATOM   3265  CB  CYS B 305      63.280  73.363  11.436  1.00 61.96           C  
+ATOM   3266  SG  CYS B 305      62.726  71.645  11.243  1.00 60.59           S  
+ATOM   3267  N   ILE B 306      62.064  76.009  12.115  1.00 68.13           N  
+ATOM   3268  CA  ILE B 306      61.915  77.451  11.969  1.00 75.66           C  
+ATOM   3269  C   ILE B 306      62.060  78.149  13.319  1.00 75.47           C  
+ATOM   3270  O   ILE B 306      62.648  79.232  13.404  1.00 75.04           O  
+ATOM   3271  CB  ILE B 306      60.532  77.816  11.351  1.00 79.19           C  
+ATOM   3272  CG1 ILE B 306      60.521  77.459   9.862  1.00 83.79           C  
+ATOM   3273  CG2 ILE B 306      60.239  79.298  11.548  1.00 83.04           C  
+ATOM   3274  CD1 ILE B 306      59.170  77.620   9.190  1.00 83.47           C  
+ATOM   3275  N   LYS B 307      61.532  77.531  14.371  1.00 73.50           N  
+ATOM   3276  CA  LYS B 307      61.623  78.120  15.697  1.00 66.14           C  
+ATOM   3277  C   LYS B 307      62.810  77.624  16.502  1.00 62.00           C  
+ATOM   3278  O   LYS B 307      62.996  78.043  17.638  1.00 57.14           O  
+ATOM   3279  CB  LYS B 307      60.345  77.861  16.484  1.00 64.25           C  
+ATOM   3280  CG  LYS B 307      59.165  78.677  16.016  1.00 69.33           C  
+ATOM   3281  CD  LYS B 307      58.076  78.661  17.073  1.00 73.69           C  
+ATOM   3282  CE  LYS B 307      57.023  79.732  16.813  1.00 76.00           C  
+ATOM   3283  NZ  LYS B 307      56.037  79.829  17.937  1.00 76.84           N  
+ATOM   3284  N   LYS B 308      63.603  76.733  15.910  1.00 58.98           N  
+ATOM   3285  CA  LYS B 308      64.784  76.143  16.551  1.00 61.13           C  
+ATOM   3286  C   LYS B 308      64.573  75.794  18.026  1.00 64.93           C  
+ATOM   3287  O   LYS B 308      65.315  76.231  18.907  1.00 67.09           O  
+ATOM   3288  CB  LYS B 308      65.992  77.065  16.366  1.00 59.90           C  
+ATOM   3289  CG  LYS B 308      66.350  77.223  14.899  1.00 57.27           C  
+ATOM   3290  CD  LYS B 308      67.739  77.796  14.673  1.00 55.65           C  
+ATOM   3291  CE  LYS B 308      68.118  77.714  13.188  1.00 54.38           C  
+ATOM   3292  NZ  LYS B 308      69.533  78.114  12.928  1.00 54.05           N  
+ATOM   3293  N   GLU B 309      63.556  74.968  18.259  1.00 69.75           N  
+ATOM   3294  CA  GLU B 309      63.146  74.522  19.582  1.00 69.05           C  
+ATOM   3295  C   GLU B 309      63.874  73.272  20.094  1.00 66.42           C  
+ATOM   3296  O   GLU B 309      63.865  73.004  21.298  1.00 64.00           O  
+ATOM   3297  CB  GLU B 309      61.633  74.273  19.561  1.00 71.21           C  
+ATOM   3298  CG  GLU B 309      60.889  75.271  18.673  1.00 81.59           C  
+ATOM   3299  CD  GLU B 309      59.409  74.953  18.488  1.00 86.43           C  
+ATOM   3300  OE1 GLU B 309      59.074  73.797  18.157  1.00 88.15           O  
+ATOM   3301  OE2 GLU B 309      58.578  75.872  18.656  1.00 88.22           O  
+ATOM   3302  N   GLN B 310      64.493  72.500  19.200  1.00 62.07           N  
+ATOM   3303  CA  GLN B 310      65.213  71.292  19.620  1.00 61.01           C  
+ATOM   3304  C   GLN B 310      66.362  70.904  18.704  1.00 61.01           C  
+ATOM   3305  O   GLN B 310      66.152  70.576  17.538  1.00 64.40           O  
+ATOM   3306  CB  GLN B 310      64.263  70.109  19.721  1.00 61.85           C  
+ATOM   3307  CG  GLN B 310      63.392  70.115  20.956  1.00 60.20           C  
+ATOM   3308  CD  GLN B 310      64.181  69.953  22.234  1.00 58.49           C  
+ATOM   3309  OE1 GLN B 310      65.065  69.096  22.333  1.00 58.28           O  
+ATOM   3310  NE2 GLN B 310      63.854  70.765  23.233  1.00 57.04           N  
+ATOM   3311  N   PRO B 311      67.596  70.915  19.231  1.00 53.33           N  
+ATOM   3312  CA  PRO B 311      68.781  70.562  18.443  1.00 54.66           C  
+ATOM   3313  C   PRO B 311      68.675  69.156  17.859  1.00 54.84           C  
+ATOM   3314  O   PRO B 311      68.970  68.934  16.682  1.00 49.90           O  
+ATOM   3315  CB  PRO B 311      69.919  70.680  19.458  1.00 53.22           C  
+ATOM   3316  CG  PRO B 311      69.403  71.697  20.436  1.00 53.21           C  
+ATOM   3317  CD  PRO B 311      67.974  71.265  20.612  1.00 55.97           C  
+ATOM   3318  N   SER B 312      68.245  68.215  18.696  1.00 52.30           N  
+ATOM   3319  CA  SER B 312      68.092  66.824  18.290  1.00 50.49           C  
+ATOM   3320  C   SER B 312      67.088  66.712  17.152  1.00 48.57           C  
+ATOM   3321  O   SER B 312      66.842  65.632  16.623  1.00 46.34           O  
+ATOM   3322  CB  SER B 312      67.623  65.986  19.477  1.00 52.39           C  
+ATOM   3323  OG  SER B 312      66.447  66.532  20.041  1.00 60.03           O  
+ATOM   3324  N   HIS B 313      66.515  67.842  16.771  1.00 47.09           N  
+ATOM   3325  CA  HIS B 313      65.543  67.843  15.704  1.00 46.06           C  
+ATOM   3326  C   HIS B 313      65.917  68.737  14.532  1.00 46.44           C  
+ATOM   3327  O   HIS B 313      66.131  68.247  13.420  1.00 49.98           O  
+ATOM   3328  CB  HIS B 313      64.190  68.278  16.233  1.00 41.80           C  
+ATOM   3329  CG  HIS B 313      63.181  68.493  15.154  1.00 37.90           C  
+ATOM   3330  ND1 HIS B 313      62.443  67.466  14.610  1.00 37.56           N  
+ATOM   3331  CD2 HIS B 313      62.844  69.606  14.463  1.00 37.06           C  
+ATOM   3332  CE1 HIS B 313      61.695  67.935  13.628  1.00 35.54           C  
+ATOM   3333  NE2 HIS B 313      61.921  69.231  13.518  1.00 35.85           N  
+ATOM   3334  N   TYR B 314      65.995  70.045  14.782  1.00 48.21           N  
+ATOM   3335  CA  TYR B 314      66.297  71.003  13.722  1.00 50.55           C  
+ATOM   3336  C   TYR B 314      67.650  70.840  13.036  1.00 50.42           C  
+ATOM   3337  O   TYR B 314      67.812  71.242  11.879  1.00 52.24           O  
+ATOM   3338  CB  TYR B 314      66.110  72.448  14.226  1.00 49.89           C  
+ATOM   3339  CG  TYR B 314      67.114  72.970  15.244  1.00 47.78           C  
+ATOM   3340  CD1 TYR B 314      68.456  73.137  14.912  1.00 46.23           C  
+ATOM   3341  CD2 TYR B 314      66.700  73.373  16.520  1.00 46.18           C  
+ATOM   3342  CE1 TYR B 314      69.362  73.696  15.818  1.00 45.52           C  
+ATOM   3343  CE2 TYR B 314      67.600  73.933  17.437  1.00 44.56           C  
+ATOM   3344  CZ  TYR B 314      68.931  74.094  17.080  1.00 45.38           C  
+ATOM   3345  OH  TYR B 314      69.835  74.661  17.964  1.00 43.74           O  
+ATOM   3346  N   LYS B 315      68.609  70.236  13.734  1.00 47.12           N  
+ATOM   3347  CA  LYS B 315      69.936  70.016  13.165  1.00 42.83           C  
+ATOM   3348  C   LYS B 315      69.995  68.802  12.244  1.00 41.78           C  
+ATOM   3349  O   LYS B 315      71.008  68.572  11.603  1.00 40.97           O  
+ATOM   3350  CB  LYS B 315      70.976  69.832  14.272  1.00 39.23           C  
+ATOM   3351  CG  LYS B 315      71.369  71.099  15.012  1.00 35.30           C  
+ATOM   3352  CD  LYS B 315      72.241  70.770  16.213  1.00 35.35           C  
+ATOM   3353  CE  LYS B 315      73.383  69.814  15.827  1.00 38.50           C  
+ATOM   3354  NZ  LYS B 315      74.257  69.364  16.978  1.00 39.22           N  
+ATOM   3355  N   TYR B 316      68.926  68.017  12.171  1.00 40.36           N  
+ATOM   3356  CA  TYR B 316      68.955  66.839  11.310  1.00 40.25           C  
+ATOM   3357  C   TYR B 316      67.728  66.607  10.430  1.00 40.84           C  
+ATOM   3358  O   TYR B 316      67.746  65.730   9.569  1.00 44.03           O  
+ATOM   3359  CB  TYR B 316      69.180  65.580  12.148  1.00 39.03           C  
+ATOM   3360  CG  TYR B 316      70.244  65.701  13.219  1.00 37.49           C  
+ATOM   3361  CD1 TYR B 316      69.998  66.416  14.395  1.00 36.49           C  
+ATOM   3362  CD2 TYR B 316      71.489  65.088  13.068  1.00 35.85           C  
+ATOM   3363  CE1 TYR B 316      70.961  66.512  15.400  1.00 35.10           C  
+ATOM   3364  CE2 TYR B 316      72.458  65.178  14.066  1.00 36.39           C  
+ATOM   3365  CZ  TYR B 316      72.187  65.894  15.228  1.00 35.46           C  
+ATOM   3366  OH  TYR B 316      73.139  65.990  16.216  1.00 35.68           O  
+ATOM   3367  N   HIS B 317      66.662  67.376  10.630  1.00 43.49           N  
+ATOM   3368  CA  HIS B 317      65.446  67.180   9.839  1.00 45.61           C  
+ATOM   3369  C   HIS B 317      65.678  67.142   8.329  1.00 49.92           C  
+ATOM   3370  O   HIS B 317      65.214  66.223   7.656  1.00 50.12           O  
+ATOM   3371  CB  HIS B 317      64.407  68.256  10.185  1.00 42.50           C  
+ATOM   3372  CG  HIS B 317      63.042  67.994   9.613  1.00 38.56           C  
+ATOM   3373  ND1 HIS B 317      61.952  68.788   9.897  1.00 37.03           N  
+ATOM   3374  CD2 HIS B 317      62.589  67.024   8.787  1.00 36.40           C  
+ATOM   3375  CE1 HIS B 317      60.886  68.318   9.274  1.00 34.43           C  
+ATOM   3376  NE2 HIS B 317      61.246  67.247   8.593  1.00 35.39           N  
+ATOM   3377  N   GLU B 318      66.410  68.115   7.797  1.00 54.61           N  
+ATOM   3378  CA  GLU B 318      66.633  68.155   6.361  1.00 56.76           C  
+ATOM   3379  C   GLU B 318      67.372  66.943   5.809  1.00 54.56           C  
+ATOM   3380  O   GLU B 318      66.913  66.311   4.862  1.00 51.51           O  
+ATOM   3381  CB  GLU B 318      67.373  69.432   5.966  1.00 65.07           C  
+ATOM   3382  CG  GLU B 318      66.974  69.938   4.584  1.00 80.29           C  
+ATOM   3383  CD  GLU B 318      67.888  71.029   4.053  1.00 87.12           C  
+ATOM   3384  OE1 GLU B 318      68.064  72.059   4.741  1.00 89.59           O  
+ATOM   3385  OE2 GLU B 318      68.426  70.854   2.937  1.00 89.60           O  
+ATOM   3386  N   LYS B 319      68.513  66.607   6.394  1.00 50.20           N  
+ATOM   3387  CA  LYS B 319      69.288  65.458   5.917  1.00 45.94           C  
+ATOM   3388  C   LYS B 319      68.540  64.141   6.047  1.00 43.27           C  
+ATOM   3389  O   LYS B 319      69.017  63.114   5.584  1.00 42.55           O  
+ATOM   3390  CB  LYS B 319      70.623  65.346   6.677  1.00 46.28           C  
+ATOM   3391  CG  LYS B 319      71.459  64.118   6.303  1.00 49.81           C  
+ATOM   3392  CD  LYS B 319      72.929  64.279   6.697  1.00 52.72           C  
+ATOM   3393  CE  LYS B 319      73.820  63.252   5.984  1.00 54.35           C  
+ATOM   3394  NZ  LYS B 319      75.269  63.642   5.961  1.00 52.69           N  
+ATOM   3395  N   HIS B 320      67.367  64.166   6.665  1.00 39.44           N  
+ATOM   3396  CA  HIS B 320      66.624  62.933   6.872  1.00 36.27           C  
+ATOM   3397  C   HIS B 320      65.230  62.896   6.278  1.00 38.06           C  
+ATOM   3398  O   HIS B 320      64.614  61.831   6.211  1.00 33.79           O  
+ATOM   3399  CB  HIS B 320      66.559  62.634   8.374  1.00 31.18           C  
+ATOM   3400  CG  HIS B 320      67.882  62.246   8.964  1.00 26.63           C  
+ATOM   3401  ND1 HIS B 320      68.464  61.017   8.745  1.00 25.13           N  
+ATOM   3402  CD2 HIS B 320      68.762  62.952   9.709  1.00 25.44           C  
+ATOM   3403  CE1 HIS B 320      69.650  60.983   9.325  1.00 24.49           C  
+ATOM   3404  NE2 HIS B 320      69.857  62.147   9.917  1.00 25.01           N  
+ATOM   3405  N   TYR B 321      64.731  64.048   5.843  1.00 41.58           N  
+ATOM   3406  CA  TYR B 321      63.396  64.099   5.272  1.00 44.15           C  
+ATOM   3407  C   TYR B 321      63.152  62.855   4.433  1.00 43.01           C  
+ATOM   3408  O   TYR B 321      62.391  61.969   4.819  1.00 42.61           O  
+ATOM   3409  CB  TYR B 321      63.217  65.333   4.387  1.00 52.00           C  
+ATOM   3410  CG  TYR B 321      61.856  65.373   3.732  1.00 62.58           C  
+ATOM   3411  CD1 TYR B 321      60.722  65.700   4.466  1.00 67.30           C  
+ATOM   3412  CD2 TYR B 321      61.692  65.014   2.394  1.00 67.18           C  
+ATOM   3413  CE1 TYR B 321      59.454  65.665   3.889  1.00 69.56           C  
+ATOM   3414  CE2 TYR B 321      60.427  64.974   1.807  1.00 69.38           C  
+ATOM   3415  CZ  TYR B 321      59.311  65.301   2.562  1.00 69.87           C  
+ATOM   3416  OH  TYR B 321      58.052  65.263   2.000  1.00 70.45           O  
+ATOM   3417  N   ALA B 322      63.823  62.799   3.291  1.00 41.01           N  
+ATOM   3418  CA  ALA B 322      63.691  61.691   2.361  1.00 39.13           C  
+ATOM   3419  C   ALA B 322      63.559  60.345   3.052  1.00 39.76           C  
+ATOM   3420  O   ALA B 322      62.574  59.636   2.871  1.00 40.55           O  
+ATOM   3421  CB  ALA B 322      64.883  61.670   1.424  1.00 37.37           C  
+ATOM   3422  N   ASN B 323      64.559  59.994   3.848  1.00 40.66           N  
+ATOM   3423  CA  ASN B 323      64.553  58.714   4.534  1.00 40.52           C  
+ATOM   3424  C   ASN B 323      63.325  58.560   5.437  1.00 38.72           C  
+ATOM   3425  O   ASN B 323      62.603  57.567   5.351  1.00 38.53           O  
+ATOM   3426  CB  ASN B 323      65.853  58.562   5.335  1.00 43.51           C  
+ATOM   3427  CG  ASN B 323      66.192  57.111   5.641  1.00 46.70           C  
+ATOM   3428  OD1 ASN B 323      66.229  56.266   4.747  1.00 48.85           O  
+ATOM   3429  ND2 ASN B 323      66.452  56.821   6.910  1.00 49.44           N  
+ATOM   3430  N   ALA B 324      63.078  59.556   6.282  1.00 35.14           N  
+ATOM   3431  CA  ALA B 324      61.950  59.525   7.207  1.00 33.14           C  
+ATOM   3432  C   ALA B 324      60.616  59.284   6.506  1.00 33.80           C  
+ATOM   3433  O   ALA B 324      59.802  58.492   6.967  1.00 33.01           O  
+ATOM   3434  CB  ALA B 324      61.900  60.833   8.003  1.00 28.88           C  
+ATOM   3435  N   ALA B 325      60.395  59.977   5.395  1.00 36.17           N  
+ATOM   3436  CA  ALA B 325      59.156  59.834   4.638  1.00 37.55           C  
+ATOM   3437  C   ALA B 325      58.941  58.395   4.190  1.00 38.25           C  
+ATOM   3438  O   ALA B 325      57.800  57.957   4.036  1.00 37.94           O  
+ATOM   3439  CB  ALA B 325      59.170  60.760   3.426  1.00 38.98           C  
+ATOM   3440  N   ILE B 326      60.032  57.665   3.965  1.00 38.88           N  
+ATOM   3441  CA  ILE B 326      59.937  56.262   3.552  1.00 40.33           C  
+ATOM   3442  C   ILE B 326      59.763  55.389   4.794  1.00 39.45           C  
+ATOM   3443  O   ILE B 326      59.061  54.373   4.767  1.00 39.20           O  
+ATOM   3444  CB  ILE B 326      61.209  55.802   2.795  1.00 40.92           C  
+ATOM   3445  CG1 ILE B 326      61.465  56.728   1.607  1.00 42.37           C  
+ATOM   3446  CG2 ILE B 326      61.043  54.377   2.302  1.00 40.24           C  
+ATOM   3447  CD1 ILE B 326      62.680  56.352   0.793  1.00 42.77           C  
+ATOM   3448  N   PHE B 327      60.417  55.813   5.873  1.00 38.70           N  
+ATOM   3449  CA  PHE B 327      60.382  55.130   7.157  1.00 36.97           C  
+ATOM   3450  C   PHE B 327      58.941  55.072   7.634  1.00 35.76           C  
+ATOM   3451  O   PHE B 327      58.491  54.060   8.172  1.00 36.30           O  
+ATOM   3452  CB  PHE B 327      61.235  55.909   8.156  1.00 35.76           C  
+ATOM   3453  CG  PHE B 327      61.344  55.263   9.511  1.00 33.77           C  
+ATOM   3454  CD1 PHE B 327      62.111  54.112   9.691  1.00 33.17           C  
+ATOM   3455  CD2 PHE B 327      60.714  55.832  10.621  1.00 32.44           C  
+ATOM   3456  CE1 PHE B 327      62.251  53.547  10.956  1.00 31.28           C  
+ATOM   3457  CE2 PHE B 327      60.852  55.269  11.886  1.00 32.11           C  
+ATOM   3458  CZ  PHE B 327      61.621  54.129  12.053  1.00 30.41           C  
+ATOM   3459  N   ALA B 328      58.226  56.168   7.407  1.00 36.03           N  
+ATOM   3460  CA  ALA B 328      56.829  56.310   7.802  1.00 38.07           C  
+ATOM   3461  C   ALA B 328      55.878  55.271   7.182  1.00 42.88           C  
+ATOM   3462  O   ALA B 328      54.810  54.983   7.749  1.00 42.32           O  
+ATOM   3463  CB  ALA B 328      56.359  57.719   7.464  1.00 34.21           C  
+ATOM   3464  N   ASP B 329      56.267  54.720   6.028  1.00 48.12           N  
+ATOM   3465  CA  ASP B 329      55.467  53.715   5.320  1.00 51.93           C  
+ATOM   3466  C   ASP B 329      56.080  52.315   5.411  1.00 52.24           C  
+ATOM   3467  O   ASP B 329      55.639  51.391   4.726  1.00 47.12           O  
+ATOM   3468  CB  ASP B 329      55.320  54.097   3.842  1.00 62.48           C  
+ATOM   3469  CG  ASP B 329      54.373  55.271   3.623  1.00 77.08           C  
+ATOM   3470  OD1 ASP B 329      53.148  55.098   3.813  1.00 84.40           O  
+ATOM   3471  OD2 ASP B 329      54.856  56.367   3.258  1.00 83.83           O  
+ATOM   3472  N   SER B 330      57.103  52.171   6.249  1.00 52.10           N  
+ATOM   3473  CA  SER B 330      57.787  50.898   6.449  1.00 49.40           C  
+ATOM   3474  C   SER B 330      57.034  50.044   7.466  1.00 47.75           C  
+ATOM   3475  O   SER B 330      56.465  50.563   8.429  1.00 46.70           O  
+ATOM   3476  CB  SER B 330      59.210  51.149   6.940  1.00 50.11           C  
+ATOM   3477  OG  SER B 330      59.866  49.925   7.214  1.00 59.43           O  
+ATOM   3478  N   LYS B 331      57.048  48.731   7.265  1.00 47.20           N  
+ATOM   3479  CA  LYS B 331      56.336  47.817   8.154  1.00 48.09           C  
+ATOM   3480  C   LYS B 331      57.020  47.406   9.457  1.00 49.60           C  
+ATOM   3481  O   LYS B 331      56.365  46.897  10.367  1.00 50.18           O  
+ATOM   3482  CB  LYS B 331      55.929  46.568   7.378  1.00 49.27           C  
+ATOM   3483  CG  LYS B 331      54.793  46.816   6.419  1.00 52.46           C  
+ATOM   3484  CD  LYS B 331      54.638  45.666   5.447  1.00 53.69           C  
+ATOM   3485  CE  LYS B 331      53.451  45.917   4.539  1.00 54.40           C  
+ATOM   3486  NZ  LYS B 331      53.455  47.327   4.063  1.00 54.52           N  
+ATOM   3487  N   ASN B 332      58.326  47.613   9.563  1.00 49.40           N  
+ATOM   3488  CA  ASN B 332      59.018  47.249  10.792  1.00 47.18           C  
+ATOM   3489  C   ASN B 332      59.894  48.392  11.315  1.00 44.74           C  
+ATOM   3490  O   ASN B 332      61.114  48.271  11.434  1.00 39.15           O  
+ATOM   3491  CB  ASN B 332      59.830  45.970  10.570  1.00 53.46           C  
+ATOM   3492  CG  ASN B 332      60.832  46.099   9.445  1.00 63.24           C  
+ATOM   3493  OD1 ASN B 332      60.642  46.878   8.509  1.00 67.50           O  
+ATOM   3494  ND2 ASN B 332      61.903  45.318   9.520  1.00 68.90           N  
+ATOM   3495  N   GLN B 333      59.243  49.510  11.618  1.00 39.07           N  
+ATOM   3496  CA  GLN B 333      59.911  50.696  12.146  1.00 34.64           C  
+ATOM   3497  C   GLN B 333      60.655  50.329  13.438  1.00 34.56           C  
+ATOM   3498  O   GLN B 333      61.814  50.694  13.630  1.00 30.29           O  
+ATOM   3499  CB  GLN B 333      58.875  51.789  12.430  1.00 35.07           C  
+ATOM   3500  CG  GLN B 333      58.169  52.351  11.204  1.00 37.13           C  
+ATOM   3501  CD  GLN B 333      57.029  53.284  11.577  1.00 39.05           C  
+ATOM   3502  OE1 GLN B 333      56.555  54.065  10.757  1.00 41.74           O  
+ATOM   3503  NE2 GLN B 333      56.574  53.195  12.820  1.00 39.34           N  
+ATOM   3504  N   LYS B 334      59.972  49.596  14.313  1.00 34.56           N  
+ATOM   3505  CA  LYS B 334      60.526  49.147  15.590  1.00 33.53           C  
+ATOM   3506  C   LYS B 334      61.849  48.383  15.399  1.00 32.50           C  
+ATOM   3507  O   LYS B 334      62.865  48.694  16.025  1.00 29.12           O  
+ATOM   3508  CB  LYS B 334      59.499  48.251  16.291  1.00 37.90           C  
+ATOM   3509  CG  LYS B 334      59.924  47.691  17.636  1.00 47.19           C  
+ATOM   3510  CD  LYS B 334      59.567  48.617  18.792  1.00 52.16           C  
+ATOM   3511  CE  LYS B 334      59.937  47.975  20.123  1.00 54.06           C  
+ATOM   3512  NZ  LYS B 334      59.619  48.844  21.287  1.00 55.05           N  
+ATOM   3513  N   THR B 335      61.837  47.380  14.531  1.00 31.48           N  
+ATOM   3514  CA  THR B 335      63.034  46.593  14.290  1.00 30.28           C  
+ATOM   3515  C   THR B 335      64.204  47.459  13.798  1.00 28.26           C  
+ATOM   3516  O   THR B 335      65.340  47.291  14.249  1.00 29.50           O  
+ATOM   3517  CB  THR B 335      62.731  45.464  13.291  1.00 32.26           C  
+ATOM   3518  OG1 THR B 335      61.695  44.635  13.836  1.00 35.83           O  
+ATOM   3519  CG2 THR B 335      63.973  44.608  13.036  1.00 33.46           C  
+ATOM   3520  N   ILE B 336      63.931  48.381  12.880  1.00 27.09           N  
+ATOM   3521  CA  ILE B 336      64.969  49.273  12.371  1.00 27.40           C  
+ATOM   3522  C   ILE B 336      65.602  50.021  13.564  1.00 28.54           C  
+ATOM   3523  O   ILE B 336      66.824  49.997  13.764  1.00 29.79           O  
+ATOM   3524  CB  ILE B 336      64.361  50.298  11.363  1.00 22.80           C  
+ATOM   3525  CG1 ILE B 336      63.792  49.566  10.154  1.00 18.69           C  
+ATOM   3526  CG2 ILE B 336      65.403  51.281  10.891  1.00 17.17           C  
+ATOM   3527  CD1 ILE B 336      63.104  50.482   9.171  1.00 15.36           C  
+ATOM   3528  N   CYS B 337      64.759  50.667  14.367  1.00 31.20           N  
+ATOM   3529  CA  CYS B 337      65.227  51.411  15.535  1.00 34.00           C  
+ATOM   3530  C   CYS B 337      66.065  50.564  16.482  1.00 35.43           C  
+ATOM   3531  O   CYS B 337      66.986  51.068  17.114  1.00 35.01           O  
+ATOM   3532  CB  CYS B 337      64.045  51.992  16.310  1.00 32.98           C  
+ATOM   3533  SG  CYS B 337      63.171  53.316  15.443  1.00 37.16           S  
+ATOM   3534  N   GLN B 338      65.734  49.282  16.591  1.00 38.08           N  
+ATOM   3535  CA  GLN B 338      66.468  48.381  17.466  1.00 39.30           C  
+ATOM   3536  C   GLN B 338      67.931  48.354  17.112  1.00 37.85           C  
+ATOM   3537  O   GLN B 338      68.782  48.654  17.937  1.00 39.68           O  
+ATOM   3538  CB  GLN B 338      65.919  46.961  17.370  1.00 43.87           C  
+ATOM   3539  CG  GLN B 338      64.886  46.623  18.423  1.00 51.44           C  
+ATOM   3540  CD  GLN B 338      65.357  46.954  19.823  1.00 53.05           C  
+ATOM   3541  OE1 GLN B 338      66.547  47.184  20.053  1.00 52.69           O  
+ATOM   3542  NE2 GLN B 338      64.422  46.972  20.773  1.00 53.74           N  
+ATOM   3543  N   GLN B 339      68.214  47.988  15.873  1.00 35.50           N  
+ATOM   3544  CA  GLN B 339      69.583  47.905  15.390  1.00 32.70           C  
+ATOM   3545  C   GLN B 339      70.329  49.216  15.575  1.00 32.12           C  
+ATOM   3546  O   GLN B 339      71.527  49.222  15.872  1.00 33.21           O  
+ATOM   3547  CB  GLN B 339      69.597  47.527  13.910  1.00 31.03           C  
+ATOM   3548  CG  GLN B 339      70.984  47.315  13.350  1.00 27.08           C  
+ATOM   3549  CD  GLN B 339      70.953  46.595  12.023  1.00 26.96           C  
+ATOM   3550  OE1 GLN B 339      71.117  47.210  10.971  1.00 27.76           O  
+ATOM   3551  NE2 GLN B 339      70.729  45.279  12.063  1.00 24.84           N  
+ATOM   3552  N   ALA B 340      69.625  50.325  15.383  1.00 31.05           N  
+ATOM   3553  CA  ALA B 340      70.240  51.633  15.531  1.00 30.70           C  
+ATOM   3554  C   ALA B 340      70.646  51.857  16.981  1.00 31.49           C  
+ATOM   3555  O   ALA B 340      71.630  52.536  17.267  1.00 33.94           O  
+ATOM   3556  CB  ALA B 340      69.269  52.704  15.094  1.00 29.70           C  
+ATOM   3557  N   VAL B 341      69.877  51.277  17.891  1.00 30.39           N  
+ATOM   3558  CA  VAL B 341      70.130  51.411  19.317  1.00 30.71           C  
+ATOM   3559  C   VAL B 341      71.216  50.444  19.774  1.00 32.21           C  
+ATOM   3560  O   VAL B 341      72.079  50.798  20.576  1.00 28.62           O  
+ATOM   3561  CB  VAL B 341      68.829  51.164  20.127  1.00 31.56           C  
+ATOM   3562  CG1 VAL B 341      69.128  51.172  21.635  1.00 31.69           C  
+ATOM   3563  CG2 VAL B 341      67.806  52.231  19.779  1.00 30.26           C  
+ATOM   3564  N   ASP B 342      71.164  49.222  19.267  1.00 32.62           N  
+ATOM   3565  CA  ASP B 342      72.164  48.233  19.614  1.00 33.29           C  
+ATOM   3566  C   ASP B 342      73.529  48.766  19.180  1.00 32.48           C  
+ATOM   3567  O   ASP B 342      74.560  48.431  19.766  1.00 31.50           O  
+ATOM   3568  CB  ASP B 342      71.852  46.907  18.913  1.00 37.58           C  
+ATOM   3569  CG  ASP B 342      70.712  46.150  19.579  1.00 45.30           C  
+ATOM   3570  OD1 ASP B 342      69.935  46.785  20.325  1.00 48.91           O  
+ATOM   3571  OD2 ASP B 342      70.581  44.924  19.356  1.00 49.09           O  
+ATOM   3572  N   THR B 343      73.518  49.609  18.151  1.00 32.53           N  
+ATOM   3573  CA  THR B 343      74.738  50.191  17.617  1.00 33.32           C  
+ATOM   3574  C   THR B 343      75.275  51.195  18.600  1.00 34.53           C  
+ATOM   3575  O   THR B 343      76.479  51.294  18.795  1.00 35.65           O  
+ATOM   3576  CB  THR B 343      74.492  50.931  16.288  1.00 33.35           C  
+ATOM   3577  OG1 THR B 343      74.164  49.986  15.259  1.00 33.16           O  
+ATOM   3578  CG2 THR B 343      75.729  51.727  15.888  1.00 32.79           C  
+ATOM   3579  N   VAL B 344      74.379  51.957  19.211  1.00 35.21           N  
+ATOM   3580  CA  VAL B 344      74.803  52.958  20.170  1.00 34.09           C  
+ATOM   3581  C   VAL B 344      75.256  52.261  21.437  1.00 32.68           C  
+ATOM   3582  O   VAL B 344      76.235  52.663  22.045  1.00 30.76           O  
+ATOM   3583  CB  VAL B 344      73.665  53.946  20.481  1.00 37.18           C  
+ATOM   3584  CG1 VAL B 344      74.111  54.942  21.522  1.00 39.83           C  
+ATOM   3585  CG2 VAL B 344      73.256  54.673  19.206  1.00 39.69           C  
+ATOM   3586  N   LEU B 345      74.551  51.210  21.833  1.00 31.33           N  
+ATOM   3587  CA  LEU B 345      74.933  50.466  23.027  1.00 30.01           C  
+ATOM   3588  C   LEU B 345      76.246  49.749  22.754  1.00 29.83           C  
+ATOM   3589  O   LEU B 345      77.065  49.567  23.658  1.00 30.36           O  
+ATOM   3590  CB  LEU B 345      73.863  49.435  23.407  1.00 29.53           C  
+ATOM   3591  CG  LEU B 345      72.501  49.978  23.857  1.00 30.06           C  
+ATOM   3592  CD1 LEU B 345      71.563  48.827  24.094  1.00 29.20           C  
+ATOM   3593  CD2 LEU B 345      72.645  50.793  25.138  1.00 30.75           C  
+ATOM   3594  N   ALA B 346      76.446  49.345  21.501  1.00 29.79           N  
+ATOM   3595  CA  ALA B 346      77.665  48.643  21.115  1.00 29.54           C  
+ATOM   3596  C   ALA B 346      78.877  49.572  21.183  1.00 31.30           C  
+ATOM   3597  O   ALA B 346      79.975  49.159  21.570  1.00 30.44           O  
+ATOM   3598  CB  ALA B 346      77.518  48.083  19.720  1.00 26.97           C  
+ATOM   3599  N   LYS B 347      78.675  50.830  20.808  1.00 33.83           N  
+ATOM   3600  CA  LYS B 347      79.750  51.806  20.834  1.00 35.39           C  
+ATOM   3601  C   LYS B 347      80.087  52.097  22.295  1.00 36.26           C  
+ATOM   3602  O   LYS B 347      81.250  52.262  22.655  1.00 33.16           O  
+ATOM   3603  CB  LYS B 347      79.323  53.085  20.096  1.00 37.67           C  
+ATOM   3604  CG  LYS B 347      80.354  54.207  20.099  1.00 43.63           C  
+ATOM   3605  CD  LYS B 347      81.694  53.751  19.545  1.00 47.72           C  
+ATOM   3606  CE  LYS B 347      82.795  54.786  19.777  1.00 48.27           C  
+ATOM   3607  NZ  LYS B 347      84.165  54.220  19.504  1.00 48.67           N  
+ATOM   3608  N   LYS B 348      79.066  52.124  23.142  1.00 38.54           N  
+ATOM   3609  CA  LYS B 348      79.281  52.391  24.554  1.00 40.37           C  
+ATOM   3610  C   LYS B 348      79.996  51.242  25.239  1.00 42.08           C  
+ATOM   3611  O   LYS B 348      80.681  51.436  26.244  1.00 38.28           O  
+ATOM   3612  CB  LYS B 348      77.950  52.682  25.249  1.00 43.59           C  
+ATOM   3613  CG  LYS B 348      77.339  53.996  24.807  1.00 53.33           C  
+ATOM   3614  CD  LYS B 348      76.104  54.352  25.612  1.00 58.30           C  
+ATOM   3615  CE  LYS B 348      75.608  55.749  25.266  1.00 59.02           C  
+ATOM   3616  NZ  LYS B 348      74.437  56.117  26.109  1.00 60.12           N  
+ATOM   3617  N   ARG B 349      79.832  50.042  24.698  1.00 44.90           N  
+ATOM   3618  CA  ARG B 349      80.487  48.871  25.254  1.00 44.81           C  
+ATOM   3619  C   ARG B 349      81.959  48.897  24.826  1.00 42.98           C  
+ATOM   3620  O   ARG B 349      82.850  48.404  25.529  1.00 42.59           O  
+ATOM   3621  CB  ARG B 349      79.802  47.602  24.744  1.00 47.90           C  
+ATOM   3622  CG  ARG B 349      80.517  46.326  25.123  1.00 60.28           C  
+ATOM   3623  CD  ARG B 349      80.859  46.297  26.604  1.00 67.20           C  
+ATOM   3624  NE  ARG B 349      80.132  45.256  27.327  1.00 70.34           N  
+ATOM   3625  CZ  ARG B 349      78.808  45.213  27.472  1.00 70.31           C  
+ATOM   3626  NH1 ARG B 349      78.038  46.158  26.945  1.00 70.03           N  
+ATOM   3627  NH2 ARG B 349      78.249  44.218  28.150  1.00 69.88           N  
+ATOM   3628  N   VAL B 350      82.215  49.494  23.671  1.00 41.99           N  
+ATOM   3629  CA  VAL B 350      83.570  49.574  23.162  1.00 42.89           C  
+ATOM   3630  C   VAL B 350      84.382  50.624  23.908  1.00 42.33           C  
+ATOM   3631  O   VAL B 350      85.553  50.411  24.200  1.00 45.20           O  
+ATOM   3632  CB  VAL B 350      83.570  49.897  21.651  1.00 42.12           C  
+ATOM   3633  CG1 VAL B 350      84.978  50.240  21.187  1.00 41.20           C  
+ATOM   3634  CG2 VAL B 350      83.035  48.703  20.867  1.00 39.28           C  
+ATOM   3635  N   ASP B 351      83.764  51.756  24.222  1.00 41.66           N  
+ATOM   3636  CA  ASP B 351      84.471  52.814  24.927  1.00 40.28           C  
+ATOM   3637  C   ASP B 351      84.756  52.423  26.366  1.00 40.20           C  
+ATOM   3638  O   ASP B 351      85.732  52.881  26.969  1.00 35.85           O  
+ATOM   3639  CB  ASP B 351      83.666  54.105  24.886  1.00 40.64           C  
+ATOM   3640  CG  ASP B 351      83.540  54.652  23.498  1.00 42.17           C  
+ATOM   3641  OD1 ASP B 351      84.480  54.434  22.703  1.00 44.45           O  
+ATOM   3642  OD2 ASP B 351      82.514  55.308  23.210  1.00 43.39           O  
+ATOM   3643  N   SER B 352      83.894  51.574  26.909  1.00 39.00           N  
+ATOM   3644  CA  SER B 352      84.062  51.092  28.269  1.00 39.31           C  
+ATOM   3645  C   SER B 352      85.386  50.362  28.358  1.00 37.56           C  
+ATOM   3646  O   SER B 352      86.174  50.578  29.269  1.00 37.89           O  
+ATOM   3647  CB  SER B 352      82.943  50.114  28.648  1.00 41.62           C  
+ATOM   3648  OG  SER B 352      81.742  50.788  28.970  1.00 49.00           O  
+ATOM   3649  N   LEU B 353      85.638  49.506  27.385  1.00 35.98           N  
+ATOM   3650  CA  LEU B 353      86.855  48.729  27.399  1.00 35.71           C  
+ATOM   3651  C   LEU B 353      88.065  49.306  26.687  1.00 35.63           C  
+ATOM   3652  O   LEU B 353      89.122  48.672  26.680  1.00 39.17           O  
+ATOM   3653  CB  LEU B 353      86.552  47.342  26.845  1.00 34.84           C  
+ATOM   3654  CG  LEU B 353      85.559  46.567  27.701  1.00 32.99           C  
+ATOM   3655  CD1 LEU B 353      85.137  45.313  26.974  1.00 31.38           C  
+ATOM   3656  CD2 LEU B 353      86.216  46.235  29.039  1.00 32.04           C  
+ATOM   3657  N   GLN B 354      87.945  50.496  26.107  1.00 34.01           N  
+ATOM   3658  CA  GLN B 354      89.077  51.062  25.380  1.00 32.72           C  
+ATOM   3659  C   GLN B 354      89.514  52.481  25.692  1.00 31.82           C  
+ATOM   3660  O   GLN B 354      90.638  52.851  25.380  1.00 33.53           O  
+ATOM   3661  CB  GLN B 354      88.836  50.969  23.875  1.00 30.21           C  
+ATOM   3662  CG  GLN B 354      88.243  49.657  23.467  1.00 30.42           C  
+ATOM   3663  CD  GLN B 354      88.562  49.283  22.039  1.00 31.22           C  
+ATOM   3664  OE1 GLN B 354      88.504  50.121  21.123  1.00 31.76           O  
+ATOM   3665  NE2 GLN B 354      88.891  48.009  21.833  1.00 30.51           N  
+ATOM   3666  N   LEU B 355      88.658  53.301  26.274  1.00 30.07           N  
+ATOM   3667  CA  LEU B 355      89.100  54.656  26.543  1.00 30.74           C  
+ATOM   3668  C   LEU B 355      89.788  54.783  27.893  1.00 31.26           C  
+ATOM   3669  O   LEU B 355      89.479  54.053  28.843  1.00 31.32           O  
+ATOM   3670  CB  LEU B 355      87.922  55.619  26.469  1.00 30.80           C  
+ATOM   3671  CG  LEU B 355      87.202  55.581  25.129  1.00 29.10           C  
+ATOM   3672  CD1 LEU B 355      86.028  56.522  25.155  1.00 28.35           C  
+ATOM   3673  CD2 LEU B 355      88.174  55.959  24.029  1.00 29.41           C  
+ATOM   3674  N   THR B 356      90.748  55.698  27.963  1.00 30.32           N  
+ATOM   3675  CA  THR B 356      91.451  55.956  29.210  1.00 27.99           C  
+ATOM   3676  C   THR B 356      90.441  56.769  29.983  1.00 27.19           C  
+ATOM   3677  O   THR B 356      89.513  57.323  29.388  1.00 27.63           O  
+ATOM   3678  CB  THR B 356      92.685  56.811  28.985  1.00 27.25           C  
+ATOM   3679  OG1 THR B 356      92.303  58.065  28.376  1.00 22.76           O  
+ATOM   3680  CG2 THR B 356      93.671  56.061  28.103  1.00 24.43           C  
+ATOM   3681  N   ARG B 357      90.600  56.848  31.293  1.00 27.80           N  
+ATOM   3682  CA  ARG B 357      89.645  57.605  32.068  1.00 31.82           C  
+ATOM   3683  C   ARG B 357      89.606  59.082  31.655  1.00 39.66           C  
+ATOM   3684  O   ARG B 357      88.529  59.702  31.642  1.00 36.19           O  
+ATOM   3685  CB  ARG B 357      89.938  57.441  33.554  1.00 27.00           C  
+ATOM   3686  CG  ARG B 357      89.729  56.014  34.042  1.00 22.61           C  
+ATOM   3687  CD  ARG B 357      90.095  55.866  35.507  1.00 21.02           C  
+ATOM   3688  NE  ARG B 357      89.191  56.622  36.368  1.00 23.50           N  
+ATOM   3689  CZ  ARG B 357      87.917  56.304  36.584  1.00 22.05           C  
+ATOM   3690  NH1 ARG B 357      87.383  55.237  36.004  1.00 22.06           N  
+ATOM   3691  NH2 ARG B 357      87.175  57.057  37.383  1.00 22.73           N  
+ATOM   3692  N   GLU B 358      90.755  59.646  31.283  1.00 48.78           N  
+ATOM   3693  CA  GLU B 358      90.751  61.039  30.875  1.00 54.17           C  
+ATOM   3694  C   GLU B 358      89.879  61.210  29.631  1.00 50.56           C  
+ATOM   3695  O   GLU B 358      89.065  62.134  29.575  1.00 44.95           O  
+ATOM   3696  CB  GLU B 358      92.170  61.562  30.615  1.00 70.81           C  
+ATOM   3697  CG  GLU B 358      92.263  63.089  30.789  1.00102.33           C  
+ATOM   3698  CD  GLU B 358      93.674  63.645  30.666  1.00115.30           C  
+ATOM   3699  OE1 GLU B 358      94.589  63.108  31.329  1.00119.65           O  
+ATOM   3700  OE2 GLU B 358      93.862  64.631  29.917  1.00119.28           O  
+ATOM   3701  N   GLN B 359      90.027  60.325  28.643  1.00 43.72           N  
+ATOM   3702  CA  GLN B 359      89.208  60.423  27.432  1.00 35.07           C  
+ATOM   3703  C   GLN B 359      87.743  60.367  27.850  1.00 30.94           C  
+ATOM   3704  O   GLN B 359      86.893  61.071  27.289  1.00 28.83           O  
+ATOM   3705  CB  GLN B 359      89.507  59.282  26.469  1.00 32.53           C  
+ATOM   3706  CG  GLN B 359      90.969  59.120  26.154  1.00 34.68           C  
+ATOM   3707  CD  GLN B 359      91.224  57.948  25.221  1.00 37.16           C  
+ATOM   3708  OE1 GLN B 359      90.667  56.855  25.396  1.00 35.83           O  
+ATOM   3709  NE2 GLN B 359      92.075  58.168  24.223  1.00 37.58           N  
+ATOM   3710  N   MET B 360      87.454  59.527  28.843  1.00 27.62           N  
+ATOM   3711  CA  MET B 360      86.095  59.408  29.373  1.00 26.56           C  
+ATOM   3712  C   MET B 360      85.663  60.779  29.912  1.00 27.50           C  
+ATOM   3713  O   MET B 360      84.619  61.323  29.511  1.00 26.72           O  
+ATOM   3714  CB  MET B 360      86.036  58.372  30.515  1.00 22.82           C  
+ATOM   3715  CG  MET B 360      85.872  56.906  30.093  1.00 17.31           C  
+ATOM   3716  SD  MET B 360      85.841  55.762  31.514  1.00 15.67           S  
+ATOM   3717  CE  MET B 360      87.195  54.760  31.176  1.00 14.26           C  
+ATOM   3718  N   LEU B 361      86.481  61.341  30.807  1.00 26.92           N  
+ATOM   3719  CA  LEU B 361      86.171  62.634  31.401  1.00 26.64           C  
+ATOM   3720  C   LEU B 361      86.007  63.735  30.363  1.00 26.61           C  
+ATOM   3721  O   LEU B 361      85.213  64.651  30.562  1.00 25.27           O  
+ATOM   3722  CB  LEU B 361      87.249  63.058  32.408  1.00 27.64           C  
+ATOM   3723  CG  LEU B 361      86.838  63.711  33.752  1.00 27.55           C  
+ATOM   3724  CD1 LEU B 361      87.946  64.652  34.224  1.00 24.80           C  
+ATOM   3725  CD2 LEU B 361      85.513  64.472  33.622  1.00 26.29           C  
+ATOM   3726  N   THR B 362      86.748  63.665  29.260  1.00 28.11           N  
+ATOM   3727  CA  THR B 362      86.627  64.704  28.234  1.00 31.93           C  
+ATOM   3728  C   THR B 362      85.309  64.602  27.455  1.00 33.70           C  
+ATOM   3729  O   THR B 362      84.704  65.622  27.106  1.00 34.11           O  
+ATOM   3730  CB  THR B 362      87.781  64.661  27.234  1.00 31.36           C  
+ATOM   3731  OG1 THR B 362      89.021  64.783  27.934  1.00 32.92           O  
+ATOM   3732  CG2 THR B 362      87.661  65.813  26.255  1.00 32.58           C  
+ATOM   3733  N   ASN B 363      84.861  63.381  27.173  1.00 34.86           N  
+ATOM   3734  CA  ASN B 363      83.599  63.223  26.471  1.00 34.56           C  
+ATOM   3735  C   ASN B 363      82.530  63.846  27.352  1.00 34.02           C  
+ATOM   3736  O   ASN B 363      81.655  64.557  26.877  1.00 33.97           O  
+ATOM   3737  CB  ASN B 363      83.278  61.751  26.245  1.00 36.57           C  
+ATOM   3738  CG  ASN B 363      84.315  61.057  25.394  1.00 38.97           C  
+ATOM   3739  OD1 ASN B 363      84.997  61.686  24.588  1.00 39.94           O  
+ATOM   3740  ND2 ASN B 363      84.430  59.746  25.561  1.00 40.98           N  
+ATOM   3741  N   ARG B 364      82.624  63.589  28.650  1.00 33.79           N  
+ATOM   3742  CA  ARG B 364      81.668  64.138  29.601  1.00 34.11           C  
+ATOM   3743  C   ARG B 364      81.672  65.657  29.491  1.00 33.81           C  
+ATOM   3744  O   ARG B 364      80.621  66.286  29.392  1.00 34.79           O  
+ATOM   3745  CB  ARG B 364      82.039  63.710  31.025  1.00 34.92           C  
+ATOM   3746  CG  ARG B 364      81.113  64.224  32.100  1.00 35.24           C  
+ATOM   3747  CD  ARG B 364      79.720  63.681  31.944  1.00 35.27           C  
+ATOM   3748  NE  ARG B 364      78.778  64.409  32.784  1.00 37.20           N  
+ATOM   3749  CZ  ARG B 364      77.477  64.144  32.850  1.00 38.31           C  
+ATOM   3750  NH1 ARG B 364      76.962  63.160  32.127  1.00 39.70           N  
+ATOM   3751  NH2 ARG B 364      76.684  64.871  33.620  1.00 37.31           N  
+ATOM   3752  N   PHE B 365      82.862  66.244  29.496  1.00 32.52           N  
+ATOM   3753  CA  PHE B 365      82.991  67.692  29.394  1.00 31.25           C  
+ATOM   3754  C   PHE B 365      82.386  68.232  28.104  1.00 31.75           C  
+ATOM   3755  O   PHE B 365      81.663  69.240  28.121  1.00 29.40           O  
+ATOM   3756  CB  PHE B 365      84.463  68.087  29.517  1.00 30.06           C  
+ATOM   3757  CG  PHE B 365      84.936  68.179  30.934  1.00 30.36           C  
+ATOM   3758  CD1 PHE B 365      84.235  67.545  31.959  1.00 31.72           C  
+ATOM   3759  CD2 PHE B 365      86.079  68.900  31.253  1.00 29.41           C  
+ATOM   3760  CE1 PHE B 365      84.667  67.630  33.285  1.00 30.86           C  
+ATOM   3761  CE2 PHE B 365      86.523  68.993  32.568  1.00 29.08           C  
+ATOM   3762  CZ  PHE B 365      85.818  68.357  33.588  1.00 30.67           C  
+ATOM   3763  N   ASN B 366      82.671  67.561  26.989  1.00 30.81           N  
+ATOM   3764  CA  ASN B 366      82.127  67.987  25.712  1.00 30.95           C  
+ATOM   3765  C   ASN B 366      80.615  68.018  25.790  1.00 33.38           C  
+ATOM   3766  O   ASN B 366      79.973  68.962  25.314  1.00 30.44           O  
+ATOM   3767  CB  ASN B 366      82.573  67.052  24.598  1.00 29.44           C  
+ATOM   3768  CG  ASN B 366      83.985  67.329  24.156  1.00 29.88           C  
+ATOM   3769  OD1 ASN B 366      84.327  68.471  23.875  1.00 30.77           O  
+ATOM   3770  ND2 ASN B 366      84.817  66.288  24.090  1.00 31.26           N  
+ATOM   3771  N   ASP B 367      80.047  66.995  26.415  1.00 37.78           N  
+ATOM   3772  CA  ASP B 367      78.603  66.926  26.562  1.00 41.01           C  
+ATOM   3773  C   ASP B 367      78.072  68.084  27.391  1.00 39.56           C  
+ATOM   3774  O   ASP B 367      77.196  68.822  26.939  1.00 38.85           O  
+ATOM   3775  CB  ASP B 367      78.198  65.587  27.174  1.00 48.84           C  
+ATOM   3776  CG  ASP B 367      78.341  64.434  26.187  1.00 60.70           C  
+ATOM   3777  OD1 ASP B 367      77.619  64.428  25.166  1.00 66.84           O  
+ATOM   3778  OD2 ASP B 367      79.180  63.540  26.420  1.00 67.04           O  
+ATOM   3779  N   LEU B 368      78.600  68.267  28.594  1.00 35.98           N  
+ATOM   3780  CA  LEU B 368      78.132  69.375  29.413  1.00 31.25           C  
+ATOM   3781  C   LEU B 368      78.281  70.658  28.608  1.00 28.73           C  
+ATOM   3782  O   LEU B 368      77.414  71.526  28.647  1.00 26.95           O  
+ATOM   3783  CB  LEU B 368      78.928  69.473  30.715  1.00 32.07           C  
+ATOM   3784  CG  LEU B 368      78.741  68.322  31.712  1.00 33.32           C  
+ATOM   3785  CD1 LEU B 368      79.473  68.666  33.002  1.00 32.58           C  
+ATOM   3786  CD2 LEU B 368      77.251  68.084  31.981  1.00 32.94           C  
+ATOM   3787  N   LEU B 369      79.373  70.777  27.862  1.00 28.21           N  
+ATOM   3788  CA  LEU B 369      79.560  71.969  27.054  1.00 28.53           C  
+ATOM   3789  C   LEU B 369      78.444  72.025  26.019  1.00 31.16           C  
+ATOM   3790  O   LEU B 369      77.818  73.077  25.832  1.00 33.08           O  
+ATOM   3791  CB  LEU B 369      80.928  71.971  26.359  1.00 21.52           C  
+ATOM   3792  CG  LEU B 369      82.155  72.464  27.146  1.00 16.34           C  
+ATOM   3793  CD1 LEU B 369      83.349  72.569  26.186  1.00 12.51           C  
+ATOM   3794  CD2 LEU B 369      81.877  73.836  27.781  1.00 13.17           C  
+ATOM   3795  N   ASP B 370      78.183  70.898  25.358  1.00 36.36           N  
+ATOM   3796  CA  ASP B 370      77.125  70.853  24.356  1.00 40.75           C  
+ATOM   3797  C   ASP B 370      75.882  71.552  24.916  1.00 42.57           C  
+ATOM   3798  O   ASP B 370      75.249  72.355  24.229  1.00 44.78           O  
+ATOM   3799  CB  ASP B 370      76.795  69.400  23.965  1.00 43.02           C  
+ATOM   3800  CG  ASP B 370      77.877  68.756  23.073  1.00 48.21           C  
+ATOM   3801  OD1 ASP B 370      78.292  69.386  22.068  1.00 50.27           O  
+ATOM   3802  OD2 ASP B 370      78.310  67.613  23.366  1.00 50.04           O  
+ATOM   3803  N   ARG B 371      75.549  71.271  26.174  1.00 43.01           N  
+ATOM   3804  CA  ARG B 371      74.384  71.888  26.807  1.00 42.46           C  
+ATOM   3805  C   ARG B 371      74.542  73.386  26.963  1.00 41.54           C  
+ATOM   3806  O   ARG B 371      73.631  74.160  26.664  1.00 42.36           O  
+ATOM   3807  CB  ARG B 371      74.160  71.346  28.206  1.00 43.84           C  
+ATOM   3808  CG  ARG B 371      73.765  69.930  28.310  1.00 45.50           C  
+ATOM   3809  CD  ARG B 371      73.346  69.746  29.731  1.00 47.79           C  
+ATOM   3810  NE  ARG B 371      73.457  68.365  30.170  1.00 51.73           N  
+ATOM   3811  CZ  ARG B 371      73.344  67.990  31.439  1.00 51.00           C  
+ATOM   3812  NH1 ARG B 371      73.119  68.909  32.375  1.00 47.19           N  
+ATOM   3813  NH2 ARG B 371      73.450  66.704  31.767  1.00 51.17           N  
+ATOM   3814  N   MET B 372      75.697  73.779  27.486  1.00 39.37           N  
+ATOM   3815  CA  MET B 372      75.987  75.180  27.715  1.00 37.56           C  
+ATOM   3816  C   MET B 372      75.759  76.012  26.457  1.00 37.35           C  
+ATOM   3817  O   MET B 372      75.131  77.072  26.524  1.00 38.99           O  
+ATOM   3818  CB  MET B 372      77.423  75.337  28.239  1.00 34.77           C  
+ATOM   3819  CG  MET B 372      77.597  74.865  29.706  1.00 27.50           C  
+ATOM   3820  SD  MET B 372      79.306  74.596  30.190  1.00 19.75           S  
+ATOM   3821  CE  MET B 372      79.791  76.258  30.566  1.00 22.14           C  
+ATOM   3822  N   ASP B 373      76.238  75.538  25.309  1.00 37.88           N  
+ATOM   3823  CA  ASP B 373      76.029  76.291  24.073  1.00 40.62           C  
+ATOM   3824  C   ASP B 373      74.527  76.564  23.927  1.00 42.73           C  
+ATOM   3825  O   ASP B 373      74.115  77.661  23.550  1.00 44.89           O  
+ATOM   3826  CB  ASP B 373      76.536  75.514  22.852  1.00 37.14           C  
+ATOM   3827  CG  ASP B 373      78.034  75.274  22.895  1.00 34.93           C  
+ATOM   3828  OD1 ASP B 373      78.748  76.081  23.532  1.00 34.98           O  
+ATOM   3829  OD2 ASP B 373      78.507  74.286  22.286  1.00 32.01           O  
+ATOM   3830  N   ILE B 374      73.711  75.568  24.251  1.00 42.40           N  
+ATOM   3831  CA  ILE B 374      72.273  75.726  24.160  1.00 41.74           C  
+ATOM   3832  C   ILE B 374      71.657  76.545  25.291  1.00 40.51           C  
+ATOM   3833  O   ILE B 374      70.911  77.479  25.016  1.00 40.48           O  
+ATOM   3834  CB  ILE B 374      71.579  74.377  24.111  1.00 43.36           C  
+ATOM   3835  CG1 ILE B 374      72.114  73.584  22.927  1.00 45.31           C  
+ATOM   3836  CG2 ILE B 374      70.077  74.577  23.998  1.00 43.88           C  
+ATOM   3837  CD1 ILE B 374      71.606  72.159  22.878  1.00 48.19           C  
+ATOM   3838  N   MET B 375      71.939  76.191  26.548  1.00 37.53           N  
+ATOM   3839  CA  MET B 375      71.389  76.935  27.693  1.00 36.20           C  
+ATOM   3840  C   MET B 375      71.649  78.425  27.548  1.00 36.07           C  
+ATOM   3841  O   MET B 375      70.754  79.258  27.747  1.00 36.64           O  
+ATOM   3842  CB  MET B 375      72.053  76.539  29.010  1.00 33.12           C  
+ATOM   3843  CG  MET B 375      71.789  75.165  29.530  1.00 32.29           C  
+ATOM   3844  SD  MET B 375      73.032  74.915  30.784  1.00 27.50           S  
+ATOM   3845  CE  MET B 375      72.519  76.117  32.007  1.00 27.30           C  
+ATOM   3846  N   PHE B 376      72.903  78.748  27.240  1.00 37.69           N  
+ATOM   3847  CA  PHE B 376      73.336  80.130  27.103  1.00 39.07           C  
+ATOM   3848  C   PHE B 376      73.245  80.650  25.682  1.00 40.59           C  
+ATOM   3849  O   PHE B 376      73.580  81.800  25.421  1.00 43.00           O  
+ATOM   3850  CB  PHE B 376      74.766  80.278  27.645  1.00 35.86           C  
+ATOM   3851  CG  PHE B 376      74.918  79.797  29.068  1.00 30.20           C  
+ATOM   3852  CD1 PHE B 376      74.176  80.378  30.094  1.00 26.27           C  
+ATOM   3853  CD2 PHE B 376      75.784  78.742  29.377  1.00 29.57           C  
+ATOM   3854  CE1 PHE B 376      74.289  79.915  31.409  1.00 27.89           C  
+ATOM   3855  CE2 PHE B 376      75.908  78.270  30.690  1.00 26.94           C  
+ATOM   3856  CZ  PHE B 376      75.158  78.859  31.706  1.00 27.89           C  
+ATOM   3857  N   GLY B 377      72.795  79.803  24.765  1.00 43.72           N  
+ATOM   3858  CA  GLY B 377      72.654  80.247  23.392  1.00 46.64           C  
+ATOM   3859  C   GLY B 377      71.498  81.228  23.283  1.00 47.84           C  
+ATOM   3860  O   GLY B 377      70.863  81.566  24.300  1.00 47.76           O  
+ATOM   3861  N   SER B 378      71.214  81.684  22.060  1.00 48.61           N  
+ATOM   3862  CA  SER B 378      70.118  82.632  21.830  1.00 51.26           C  
+ATOM   3863  C   SER B 378      68.749  81.961  21.943  1.00 54.56           C  
+ATOM   3864  O   SER B 378      67.722  82.641  21.957  1.00 51.94           O  
+ATOM   3865  CB  SER B 378      70.226  83.252  20.447  1.00 49.77           C  
+ATOM   3866  OG  SER B 378      69.770  82.333  19.476  1.00 49.66           O  
+ATOM   3867  N   THR B 379      68.747  80.629  22.006  1.00 59.08           N  
+ATOM   3868  CA  THR B 379      67.517  79.847  22.123  1.00 60.19           C  
+ATOM   3869  C   THR B 379      67.300  79.401  23.564  1.00 58.26           C  
+ATOM   3870  O   THR B 379      66.171  79.187  23.991  1.00 54.54           O  
+ATOM   3871  CB  THR B 379      67.558  78.588  21.228  1.00 68.23           C  
+ATOM   3872  OG1 THR B 379      67.627  78.981  19.854  1.00 80.85           O  
+ATOM   3873  CG2 THR B 379      66.315  77.740  21.437  1.00 79.96           C  
+ATOM   3874  N   GLY B 380      68.388  79.257  24.308  1.00 54.69           N  
+ATOM   3875  CA  GLY B 380      68.275  78.838  25.689  1.00 50.12           C  
+ATOM   3876  C   GLY B 380      67.628  79.907  26.545  1.00 47.71           C  
+ATOM   3877  O   GLY B 380      67.400  81.019  26.082  1.00 47.07           O  
+ATOM   3878  N   SER B 381      67.344  79.568  27.800  1.00 46.66           N  
+ATOM   3879  CA  SER B 381      66.711  80.488  28.743  1.00 49.51           C  
+ATOM   3880  C   SER B 381      67.627  80.854  29.915  1.00 50.63           C  
+ATOM   3881  O   SER B 381      67.268  81.669  30.770  1.00 53.75           O  
+ATOM   3882  CB  SER B 381      65.434  79.851  29.284  1.00 49.16           C  
+ATOM   3883  OG  SER B 381      65.707  78.543  29.751  1.00 44.63           O  
+ATOM   3884  N   ALA B 382      68.814  80.257  29.944  1.00 48.60           N  
+ATOM   3885  CA  ALA B 382      69.768  80.495  31.019  1.00 46.12           C  
+ATOM   3886  C   ALA B 382      70.404  81.887  31.044  1.00 45.61           C  
+ATOM   3887  O   ALA B 382      70.750  82.455  30.002  1.00 40.04           O  
+ATOM   3888  CB  ALA B 382      70.857  79.430  30.971  1.00 44.23           C  
+ATOM   3889  N   ASP B 383      70.554  82.416  32.258  1.00 42.31           N  
+ATOM   3890  CA  ASP B 383      71.162  83.725  32.493  1.00 40.08           C  
+ATOM   3891  C   ASP B 383      72.584  83.438  32.954  1.00 38.79           C  
+ATOM   3892  O   ASP B 383      72.813  82.977  34.075  1.00 35.84           O  
+ATOM   3893  CB  ASP B 383      70.408  84.473  33.596  1.00 45.25           C  
+ATOM   3894  CG  ASP B 383      70.929  85.884  33.814  1.00 52.61           C  
+ATOM   3895  OD1 ASP B 383      72.162  86.090  33.786  1.00 57.72           O  
+ATOM   3896  OD2 ASP B 383      70.100  86.791  34.032  1.00 57.22           O  
+ATOM   3897  N   ILE B 384      73.547  83.710  32.089  1.00 36.75           N  
+ATOM   3898  CA  ILE B 384      74.928  83.442  32.434  1.00 36.63           C  
+ATOM   3899  C   ILE B 384      75.405  84.209  33.668  1.00 42.65           C  
+ATOM   3900  O   ILE B 384      76.306  83.747  34.377  1.00 36.77           O  
+ATOM   3901  CB  ILE B 384      75.848  83.730  31.249  1.00 33.86           C  
+ATOM   3902  CG1 ILE B 384      77.226  83.147  31.536  1.00 34.30           C  
+ATOM   3903  CG2 ILE B 384      75.906  85.218  30.986  1.00 33.71           C  
+ATOM   3904  CD1 ILE B 384      78.171  83.278  30.382  1.00 37.84           C  
+ATOM   3905  N   GLU B 385      74.812  85.376  33.925  1.00 50.34           N  
+ATOM   3906  CA  GLU B 385      75.180  86.160  35.104  1.00 54.17           C  
+ATOM   3907  C   GLU B 385      74.835  85.359  36.356  1.00 51.51           C  
+ATOM   3908  O   GLU B 385      75.583  85.356  37.336  1.00 44.78           O  
+ATOM   3909  CB  GLU B 385      74.411  87.478  35.164  1.00 69.17           C  
+ATOM   3910  CG  GLU B 385      74.851  88.533  34.185  1.00100.62           C  
+ATOM   3911  CD  GLU B 385      74.730  89.925  34.780  1.00113.92           C  
+ATOM   3912  OE1 GLU B 385      73.719  90.187  35.472  1.00117.90           O  
+ATOM   3913  OE2 GLU B 385      75.642  90.754  34.554  1.00118.68           O  
+ATOM   3914  N   GLU B 386      73.690  84.683  36.311  1.00 45.21           N  
+ATOM   3915  CA  GLU B 386      73.226  83.893  37.439  1.00 38.46           C  
+ATOM   3916  C   GLU B 386      74.071  82.651  37.655  1.00 36.10           C  
+ATOM   3917  O   GLU B 386      74.249  82.195  38.796  1.00 33.10           O  
+ATOM   3918  CB  GLU B 386      71.753  83.526  37.252  1.00 39.98           C  
+ATOM   3919  CG  GLU B 386      70.809  84.678  37.565  1.00 47.18           C  
+ATOM   3920  CD  GLU B 386      69.354  84.315  37.354  1.00 52.36           C  
+ATOM   3921  OE1 GLU B 386      68.952  83.218  37.795  1.00 53.77           O  
+ATOM   3922  OE2 GLU B 386      68.606  85.127  36.757  1.00 54.49           O  
+ATOM   3923  N   TRP B 387      74.610  82.111  36.564  1.00 33.02           N  
+ATOM   3924  CA  TRP B 387      75.458  80.930  36.657  1.00 30.12           C  
+ATOM   3925  C   TRP B 387      76.887  81.302  37.081  1.00 28.35           C  
+ATOM   3926  O   TRP B 387      77.689  80.440  37.469  1.00 26.70           O  
+ATOM   3927  CB  TRP B 387      75.449  80.169  35.327  1.00 31.31           C  
+ATOM   3928  CG  TRP B 387      74.214  79.364  35.177  1.00 35.49           C  
+ATOM   3929  CD1 TRP B 387      72.984  79.808  34.777  1.00 37.06           C  
+ATOM   3930  CD2 TRP B 387      74.043  77.992  35.546  1.00 36.75           C  
+ATOM   3931  NE1 TRP B 387      72.057  78.796  34.880  1.00 37.94           N  
+ATOM   3932  CE2 TRP B 387      72.681  77.671  35.347  1.00 37.24           C  
+ATOM   3933  CE3 TRP B 387      74.912  77.001  36.025  1.00 37.30           C  
+ATOM   3934  CZ2 TRP B 387      72.165  76.402  35.618  1.00 37.27           C  
+ATOM   3935  CZ3 TRP B 387      74.398  75.736  36.294  1.00 37.95           C  
+ATOM   3936  CH2 TRP B 387      73.037  75.448  36.088  1.00 37.83           C  
+ATOM   3937  N   MET B 388      77.203  82.590  37.000  1.00 27.61           N  
+ATOM   3938  CA  MET B 388      78.513  83.061  37.413  1.00 27.95           C  
+ATOM   3939  C   MET B 388      78.359  83.515  38.872  1.00 27.72           C  
+ATOM   3940  O   MET B 388      79.336  83.695  39.603  1.00 29.42           O  
+ATOM   3941  CB  MET B 388      78.978  84.218  36.513  1.00 26.24           C  
+ATOM   3942  CG  MET B 388      79.756  83.789  35.246  1.00 22.25           C  
+ATOM   3943  SD  MET B 388      81.445  83.155  35.517  1.00 14.78           S  
+ATOM   3944  CE  MET B 388      81.235  81.674  34.892  1.00 18.81           C  
+ATOM   3945  N   ALA B 389      77.116  83.692  39.295  1.00 28.99           N  
+ATOM   3946  CA  ALA B 389      76.859  84.082  40.669  1.00 29.51           C  
+ATOM   3947  C   ALA B 389      77.015  82.770  41.406  1.00 29.60           C  
+ATOM   3948  O   ALA B 389      77.330  82.733  42.604  1.00 28.45           O  
+ATOM   3949  CB  ALA B 389      75.429  84.618  40.817  1.00 29.44           C  
+ATOM   3950  N   GLY B 390      76.792  81.687  40.661  1.00 28.44           N  
+ATOM   3951  CA  GLY B 390      76.907  80.361  41.234  1.00 27.86           C  
+ATOM   3952  C   GLY B 390      78.346  79.969  41.506  1.00 26.72           C  
+ATOM   3953  O   GLY B 390      78.653  79.373  42.549  1.00 26.18           O  
+ATOM   3954  N   VAL B 391      79.231  80.305  40.565  1.00 25.12           N  
+ATOM   3955  CA  VAL B 391      80.654  79.999  40.701  1.00 22.35           C  
+ATOM   3956  C   VAL B 391      81.158  80.742  41.915  1.00 21.36           C  
+ATOM   3957  O   VAL B 391      81.850  80.186  42.753  1.00 21.06           O  
+ATOM   3958  CB  VAL B 391      81.454  80.457  39.460  1.00 21.90           C  
+ATOM   3959  CG1 VAL B 391      82.905  80.083  39.594  1.00 18.60           C  
+ATOM   3960  CG2 VAL B 391      80.879  79.807  38.219  1.00 22.35           C  
+ATOM   3961  N   ALA B 392      80.776  82.006  42.011  1.00 20.19           N  
+ATOM   3962  CA  ALA B 392      81.196  82.841  43.119  1.00 20.99           C  
+ATOM   3963  C   ALA B 392      80.753  82.257  44.463  1.00 21.88           C  
+ATOM   3964  O   ALA B 392      81.548  82.163  45.412  1.00 22.07           O  
+ATOM   3965  CB  ALA B 392      80.634  84.256  42.937  1.00 19.27           C  
+ATOM   3966  N   TRP B 393      79.485  81.874  44.552  1.00 23.98           N  
+ATOM   3967  CA  TRP B 393      79.004  81.312  45.795  1.00 26.79           C  
+ATOM   3968  C   TRP B 393      79.793  80.046  46.066  1.00 27.18           C  
+ATOM   3969  O   TRP B 393      80.424  79.916  47.115  1.00 28.78           O  
+ATOM   3970  CB  TRP B 393      77.517  80.976  45.721  1.00 28.13           C  
+ATOM   3971  CG  TRP B 393      76.949  80.598  47.053  1.00 28.90           C  
+ATOM   3972  CD1 TRP B 393      76.435  81.441  47.995  1.00 29.54           C  
+ATOM   3973  CD2 TRP B 393      76.869  79.282  47.610  1.00 29.83           C  
+ATOM   3974  NE1 TRP B 393      76.035  80.733  49.108  1.00 29.88           N  
+ATOM   3975  CE2 TRP B 393      76.290  79.404  48.897  1.00 30.35           C  
+ATOM   3976  CE3 TRP B 393      77.231  78.011  47.150  1.00 29.12           C  
+ATOM   3977  CZ2 TRP B 393      76.064  78.294  49.728  1.00 29.04           C  
+ATOM   3978  CZ3 TRP B 393      77.007  76.912  47.978  1.00 28.95           C  
+ATOM   3979  CH2 TRP B 393      76.430  77.062  49.250  1.00 27.79           C  
+ATOM   3980  N   LEU B 394      79.769  79.116  45.116  1.00 26.88           N  
+ATOM   3981  CA  LEU B 394      80.507  77.868  45.285  1.00 26.43           C  
+ATOM   3982  C   LEU B 394      81.983  78.112  45.652  1.00 26.41           C  
+ATOM   3983  O   LEU B 394      82.591  77.326  46.384  1.00 26.77           O  
+ATOM   3984  CB  LEU B 394      80.411  77.022  44.014  1.00 25.18           C  
+ATOM   3985  CG  LEU B 394      79.186  76.112  43.910  1.00 27.18           C  
+ATOM   3986  CD1 LEU B 394      79.067  75.525  42.509  1.00 27.42           C  
+ATOM   3987  CD2 LEU B 394      79.304  74.991  44.952  1.00 30.90           C  
+ATOM   3988  N   HIS B 395      82.546  79.221  45.184  1.00 26.80           N  
+ATOM   3989  CA  HIS B 395      83.936  79.517  45.466  1.00 27.58           C  
+ATOM   3990  C   HIS B 395      84.127  80.050  46.886  1.00 29.81           C  
+ATOM   3991  O   HIS B 395      85.260  80.315  47.318  1.00 33.66           O  
+ATOM   3992  CB  HIS B 395      84.469  80.501  44.412  1.00 27.68           C  
+ATOM   3993  CG  HIS B 395      85.959  80.458  44.231  1.00 26.49           C  
+ATOM   3994  ND1 HIS B 395      86.832  81.140  45.052  1.00 24.54           N  
+ATOM   3995  CD2 HIS B 395      86.728  79.790  43.338  1.00 25.64           C  
+ATOM   3996  CE1 HIS B 395      88.073  80.893  44.675  1.00 25.33           C  
+ATOM   3997  NE2 HIS B 395      88.042  80.075  43.636  1.00 23.82           N  
+ATOM   3998  N   CYS B 396      83.026  80.206  47.618  1.00 32.44           N  
+ATOM   3999  CA  CYS B 396      83.103  80.687  49.003  1.00 33.22           C  
+ATOM   4000  C   CYS B 396      82.759  79.559  49.973  1.00 31.28           C  
+ATOM   4001  O   CYS B 396      82.844  79.721  51.188  1.00 32.73           O  
+ATOM   4002  CB  CYS B 396      82.165  81.882  49.225  1.00 33.37           C  
+ATOM   4003  SG  CYS B 396      82.703  83.458  48.456  1.00 32.20           S  
+ATOM   4004  N   LEU B 397      82.389  78.409  49.414  1.00 30.03           N  
+ATOM   4005  CA  LEU B 397      82.030  77.234  50.193  1.00 29.91           C  
+ATOM   4006  C   LEU B 397      83.278  76.533  50.746  1.00 31.11           C  
+ATOM   4007  O   LEU B 397      83.223  75.915  51.806  1.00 33.59           O  
+ATOM   4008  CB  LEU B 397      81.221  76.272  49.319  1.00 25.95           C  
+ATOM   4009  CG  LEU B 397      80.639  74.987  49.941  1.00 23.46           C  
+ATOM   4010  CD1 LEU B 397      79.659  75.348  51.058  1.00 18.81           C  
+ATOM   4011  CD2 LEU B 397      79.940  74.154  48.860  1.00 17.88           C  
+ATOM   4012  N   LEU B 398      84.401  76.647  50.036  1.00 30.63           N  
+ATOM   4013  CA  LEU B 398      85.657  76.031  50.453  1.00 29.96           C  
+ATOM   4014  C   LEU B 398      86.843  76.866  50.001  1.00 30.06           C  
+ATOM   4015  O   LEU B 398      86.779  77.587  48.995  1.00 29.42           O  
+ATOM   4016  CB  LEU B 398      85.812  74.640  49.849  1.00 30.26           C  
+ATOM   4017  CG  LEU B 398      85.488  73.351  50.596  1.00 28.60           C  
+ATOM   4018  CD1 LEU B 398      84.200  73.462  51.357  1.00 29.62           C  
+ATOM   4019  CD2 LEU B 398      85.396  72.234  49.571  1.00 29.56           C  
+ATOM   4020  N   PRO B 399      87.952  76.776  50.744  1.00 36.38           N  
+ATOM   4021  CA  PRO B 399      89.182  77.511  50.442  1.00 36.28           C  
+ATOM   4022  C   PRO B 399      89.838  76.882  49.220  1.00 39.84           C  
+ATOM   4023  O   PRO B 399      89.938  75.656  49.147  1.00 39.96           O  
+ATOM   4024  CB  PRO B 399      90.021  77.308  51.700  1.00 35.60           C  
+ATOM   4025  CG  PRO B 399      88.976  77.057  52.778  1.00 36.60           C  
+ATOM   4026  CD  PRO B 399      88.029  76.146  52.072  1.00 34.07           C  
+ATOM   4027  N   LYS B 400      90.288  77.714  48.278  1.00 44.16           N  
+ATOM   4028  CA  LYS B 400      90.932  77.257  47.038  1.00 44.01           C  
+ATOM   4029  C   LYS B 400      90.087  76.189  46.342  1.00 38.78           C  
+ATOM   4030  O   LYS B 400      90.597  75.156  45.918  1.00 34.94           O  
+ATOM   4031  CB  LYS B 400      92.338  76.714  47.327  1.00 53.19           C  
+ATOM   4032  CG  LYS B 400      93.235  77.700  48.070  1.00 70.95           C  
+ATOM   4033  CD  LYS B 400      94.708  77.294  48.076  1.00 80.04           C  
+ATOM   4034  CE  LYS B 400      95.360  77.515  46.710  1.00 83.91           C  
+ATOM   4035  NZ  LYS B 400      96.831  77.231  46.703  1.00 84.24           N  
+ATOM   4036  N   MET B 401      88.795  76.475  46.206  1.00 30.38           N  
+ATOM   4037  CA  MET B 401      87.833  75.556  45.618  1.00 24.59           C  
+ATOM   4038  C   MET B 401      88.135  75.068  44.204  1.00 23.45           C  
+ATOM   4039  O   MET B 401      87.888  73.907  43.879  1.00 23.40           O  
+ATOM   4040  CB  MET B 401      86.422  76.174  45.675  1.00 19.51           C  
+ATOM   4041  CG  MET B 401      85.328  75.293  45.067  1.00 12.14           C  
+ATOM   4042  SD  MET B 401      85.121  73.773  45.954  1.00  6.69           S  
+ATOM   4043  CE  MET B 401      83.678  74.146  46.984  1.00  7.33           C  
+ATOM   4044  N   ASP B 402      88.654  75.938  43.354  1.00 22.60           N  
+ATOM   4045  CA  ASP B 402      88.970  75.519  41.996  1.00 23.23           C  
+ATOM   4046  C   ASP B 402      90.124  74.520  41.978  1.00 22.55           C  
+ATOM   4047  O   ASP B 402      90.184  73.652  41.108  1.00 22.31           O  
+ATOM   4048  CB  ASP B 402      89.283  76.737  41.104  1.00 23.95           C  
+ATOM   4049  CG  ASP B 402      90.457  77.554  41.602  1.00 26.30           C  
+ATOM   4050  OD1 ASP B 402      91.611  77.327  41.146  1.00 26.64           O  
+ATOM   4051  OD2 ASP B 402      90.208  78.429  42.458  1.00 27.75           O  
+ATOM   4052  N   SER B 403      91.034  74.646  42.940  1.00 21.07           N  
+ATOM   4053  CA  SER B 403      92.179  73.754  43.039  1.00 19.49           C  
+ATOM   4054  C   SER B 403      91.631  72.476  43.656  1.00 19.95           C  
+ATOM   4055  O   SER B 403      92.106  71.383  43.387  1.00 20.21           O  
+ATOM   4056  CB  SER B 403      93.259  74.365  43.936  1.00 17.92           C  
+ATOM   4057  OG  SER B 403      93.552  75.703  43.568  1.00 19.10           O  
+ATOM   4058  N   VAL B 404      90.606  72.620  44.478  1.00 21.49           N  
+ATOM   4059  CA  VAL B 404      89.993  71.465  45.087  1.00 23.64           C  
+ATOM   4060  C   VAL B 404      89.284  70.655  44.007  1.00 22.90           C  
+ATOM   4061  O   VAL B 404      89.448  69.443  43.933  1.00 25.74           O  
+ATOM   4062  CB  VAL B 404      88.976  71.872  46.176  1.00 25.78           C  
+ATOM   4063  CG1 VAL B 404      88.138  70.663  46.585  1.00 28.47           C  
+ATOM   4064  CG2 VAL B 404      89.717  72.423  47.385  1.00 27.06           C  
+ATOM   4065  N   VAL B 405      88.493  71.322  43.171  1.00 22.93           N  
+ATOM   4066  CA  VAL B 405      87.784  70.624  42.107  1.00 23.74           C  
+ATOM   4067  C   VAL B 405      88.766  69.938  41.167  1.00 25.13           C  
+ATOM   4068  O   VAL B 405      88.593  68.768  40.804  1.00 25.85           O  
+ATOM   4069  CB  VAL B 405      86.922  71.578  41.272  1.00 20.21           C  
+ATOM   4070  CG1 VAL B 405      86.400  70.849  40.031  1.00 17.52           C  
+ATOM   4071  CG2 VAL B 405      85.765  72.086  42.102  1.00 15.99           C  
+ATOM   4072  N   TYR B 406      89.787  70.681  40.762  1.00 27.11           N  
+ATOM   4073  CA  TYR B 406      90.809  70.164  39.870  1.00 29.13           C  
+ATOM   4074  C   TYR B 406      91.416  68.876  40.436  1.00 29.32           C  
+ATOM   4075  O   TYR B 406      91.453  67.842  39.758  1.00 27.58           O  
+ATOM   4076  CB  TYR B 406      91.888  71.230  39.662  1.00 32.47           C  
+ATOM   4077  CG  TYR B 406      93.121  70.746  38.933  1.00 38.98           C  
+ATOM   4078  CD1 TYR B 406      93.054  70.282  37.612  1.00 40.68           C  
+ATOM   4079  CD2 TYR B 406      94.360  70.751  39.563  1.00 39.36           C  
+ATOM   4080  CE1 TYR B 406      94.201  69.831  36.945  1.00 41.20           C  
+ATOM   4081  CE2 TYR B 406      95.501  70.308  38.912  1.00 40.84           C  
+ATOM   4082  CZ  TYR B 406      95.423  69.854  37.609  1.00 40.66           C  
+ATOM   4083  OH  TYR B 406      96.576  69.430  36.994  1.00 40.25           O  
+ATOM   4084  N   ASP B 407      91.884  68.933  41.679  1.00 27.56           N  
+ATOM   4085  CA  ASP B 407      92.473  67.761  42.295  1.00 26.28           C  
+ATOM   4086  C   ASP B 407      91.540  66.553  42.255  1.00 25.90           C  
+ATOM   4087  O   ASP B 407      91.917  65.475  41.784  1.00 25.12           O  
+ATOM   4088  CB  ASP B 407      92.865  68.062  43.742  1.00 28.19           C  
+ATOM   4089  CG  ASP B 407      94.025  69.029  43.841  1.00 31.96           C  
+ATOM   4090  OD1 ASP B 407      94.975  68.907  43.044  1.00 35.67           O  
+ATOM   4091  OD2 ASP B 407      94.000  69.908  44.724  1.00 32.88           O  
+ATOM   4092  N   PHE B 408      90.326  66.731  42.759  1.00 23.91           N  
+ATOM   4093  CA  PHE B 408      89.359  65.652  42.777  1.00 21.79           C  
+ATOM   4094  C   PHE B 408      89.429  64.957  41.422  1.00 20.53           C  
+ATOM   4095  O   PHE B 408      89.528  63.741  41.342  1.00 17.94           O  
+ATOM   4096  CB  PHE B 408      87.951  66.218  43.022  1.00 23.22           C  
+ATOM   4097  CG  PHE B 408      86.874  65.163  43.157  1.00 24.94           C  
+ATOM   4098  CD1 PHE B 408      86.855  64.309  44.247  1.00 23.90           C  
+ATOM   4099  CD2 PHE B 408      85.879  65.027  42.176  1.00 25.89           C  
+ATOM   4100  CE1 PHE B 408      85.855  63.327  44.361  1.00 27.42           C  
+ATOM   4101  CE2 PHE B 408      84.874  64.052  42.279  1.00 25.04           C  
+ATOM   4102  CZ  PHE B 408      84.862  63.201  43.370  1.00 25.97           C  
+ATOM   4103  N   LEU B 409      89.387  65.747  40.358  1.00 20.67           N  
+ATOM   4104  CA  LEU B 409      89.439  65.220  39.000  1.00 21.08           C  
+ATOM   4105  C   LEU B 409      90.695  64.382  38.777  1.00 23.30           C  
+ATOM   4106  O   LEU B 409      90.614  63.236  38.336  1.00 20.40           O  
+ATOM   4107  CB  LEU B 409      89.373  66.374  37.988  1.00 19.20           C  
+ATOM   4108  CG  LEU B 409      88.064  67.175  38.044  1.00 20.21           C  
+ATOM   4109  CD1 LEU B 409      88.050  68.302  37.021  1.00 19.29           C  
+ATOM   4110  CD2 LEU B 409      86.906  66.227  37.790  1.00 19.92           C  
+ATOM   4111  N   LYS B 410      91.859  64.944  39.073  1.00 27.46           N  
+ATOM   4112  CA  LYS B 410      93.070  64.177  38.884  1.00 30.34           C  
+ATOM   4113  C   LYS B 410      92.900  62.884  39.663  1.00 29.97           C  
+ATOM   4114  O   LYS B 410      93.220  61.791  39.177  1.00 28.52           O  
+ATOM   4115  CB  LYS B 410      94.293  64.943  39.385  1.00 36.27           C  
+ATOM   4116  CG  LYS B 410      94.772  66.012  38.425  1.00 49.56           C  
+ATOM   4117  CD  LYS B 410      94.942  65.458  37.013  1.00 55.70           C  
+ATOM   4118  CE  LYS B 410      95.218  66.568  36.000  1.00 58.66           C  
+ATOM   4119  NZ  LYS B 410      95.179  66.104  34.582  1.00 58.35           N  
+ATOM   4120  N   CYS B 411      92.378  63.009  40.874  1.00 29.32           N  
+ATOM   4121  CA  CYS B 411      92.163  61.844  41.705  1.00 28.44           C  
+ATOM   4122  C   CYS B 411      91.304  60.816  40.952  1.00 26.76           C  
+ATOM   4123  O   CYS B 411      91.727  59.688  40.724  1.00 30.38           O  
+ATOM   4124  CB  CYS B 411      91.479  62.265  43.000  1.00 28.05           C  
+ATOM   4125  SG  CYS B 411      91.452  61.020  44.289  1.00 31.02           S  
+ATOM   4126  N   MET B 412      90.112  61.221  40.539  1.00 24.91           N  
+ATOM   4127  CA  MET B 412      89.201  60.330  39.842  1.00 25.36           C  
+ATOM   4128  C   MET B 412      89.762  59.737  38.543  1.00 25.86           C  
+ATOM   4129  O   MET B 412      89.548  58.555  38.237  1.00 27.54           O  
+ATOM   4130  CB  MET B 412      87.880  61.063  39.554  1.00 22.85           C  
+ATOM   4131  CG  MET B 412      87.088  61.490  40.794  1.00 16.96           C  
+ATOM   4132  SD  MET B 412      86.667  60.141  41.922  1.00 10.65           S  
+ATOM   4133  CE  MET B 412      87.945  60.265  43.088  1.00 10.78           C  
+ATOM   4134  N   VAL B 413      90.463  60.554  37.769  1.00 23.19           N  
+ATOM   4135  CA  VAL B 413      91.024  60.080  36.522  1.00 21.94           C  
+ATOM   4136  C   VAL B 413      92.172  59.115  36.819  1.00 25.81           C  
+ATOM   4137  O   VAL B 413      92.282  58.062  36.195  1.00 24.95           O  
+ATOM   4138  CB  VAL B 413      91.542  61.255  35.679  1.00 18.49           C  
+ATOM   4139  CG1 VAL B 413      92.507  60.753  34.621  1.00 16.54           C  
+ATOM   4140  CG2 VAL B 413      90.388  61.975  35.022  1.00 15.60           C  
+ATOM   4141  N   TYR B 414      93.014  59.455  37.790  1.00 29.70           N  
+ATOM   4142  CA  TYR B 414      94.163  58.613  38.125  1.00 32.15           C  
+ATOM   4143  C   TYR B 414      93.781  57.296  38.754  1.00 32.13           C  
+ATOM   4144  O   TYR B 414      94.536  56.337  38.668  1.00 31.56           O  
+ATOM   4145  CB  TYR B 414      95.136  59.361  39.048  1.00 38.69           C  
+ATOM   4146  CG  TYR B 414      95.925  60.470  38.370  1.00 47.72           C  
+ATOM   4147  CD1 TYR B 414      95.579  60.925  37.099  1.00 51.92           C  
+ATOM   4148  CD2 TYR B 414      96.991  61.090  39.019  1.00 52.00           C  
+ATOM   4149  CE1 TYR B 414      96.267  61.965  36.488  1.00 53.30           C  
+ATOM   4150  CE2 TYR B 414      97.691  62.141  38.416  1.00 54.28           C  
+ATOM   4151  CZ  TYR B 414      97.317  62.573  37.148  1.00 54.23           C  
+ATOM   4152  OH  TYR B 414      97.979  63.614  36.538  1.00 54.09           O  
+ATOM   4153  N   ASN B 415      92.608  57.259  39.380  1.00 33.32           N  
+ATOM   4154  CA  ASN B 415      92.090  56.058  40.041  1.00 33.30           C  
+ATOM   4155  C   ASN B 415      93.201  55.144  40.569  1.00 32.57           C  
+ATOM   4156  O   ASN B 415      93.353  54.013  40.120  1.00 33.11           O  
+ATOM   4157  CB  ASN B 415      91.197  55.280  39.074  1.00 33.28           C  
+ATOM   4158  CG  ASN B 415      90.386  54.215  39.765  1.00 35.68           C  
+ATOM   4159  OD1 ASN B 415      89.926  53.281  39.131  1.00 39.48           O  
+ATOM   4160  ND2 ASN B 415      90.198  54.352  41.066  1.00 36.02           N  
+ATOM   4161  N   ILE B 416      93.961  55.638  41.538  1.00 31.18           N  
+ATOM   4162  CA  ILE B 416      95.067  54.885  42.103  1.00 29.37           C  
+ATOM   4163  C   ILE B 416      94.754  54.194  43.438  1.00 28.85           C  
+ATOM   4164  O   ILE B 416      94.235  54.809  44.362  1.00 29.17           O  
+ATOM   4165  CB  ILE B 416      96.291  55.831  42.242  1.00 30.86           C  
+ATOM   4166  CG1 ILE B 416      96.840  56.133  40.843  1.00 30.56           C  
+ATOM   4167  CG2 ILE B 416      97.343  55.236  43.169  1.00 29.05           C  
+ATOM   4168  CD1 ILE B 416      97.799  57.284  40.797  1.00 32.19           C  
+ATOM   4169  N   PRO B 417      95.085  52.900  43.552  1.00 28.06           N  
+ATOM   4170  CA  PRO B 417      94.852  52.101  44.761  1.00 27.75           C  
+ATOM   4171  C   PRO B 417      95.007  52.842  46.092  1.00 28.92           C  
+ATOM   4172  O   PRO B 417      96.052  53.441  46.366  1.00 30.18           O  
+ATOM   4173  CB  PRO B 417      95.864  50.960  44.616  1.00 25.31           C  
+ATOM   4174  CG  PRO B 417      95.834  50.712  43.150  1.00 22.69           C  
+ATOM   4175  CD  PRO B 417      95.865  52.127  42.568  1.00 24.91           C  
+ATOM   4176  N   LYS B 418      93.953  52.778  46.906  1.00 31.96           N  
+ATOM   4177  CA  LYS B 418      93.911  53.397  48.230  1.00 35.22           C  
+ATOM   4178  C   LYS B 418      93.975  54.924  48.248  1.00 36.92           C  
+ATOM   4179  O   LYS B 418      94.081  55.531  49.319  1.00 36.57           O  
+ATOM   4180  CB  LYS B 418      95.025  52.816  49.110  1.00 37.80           C  
+ATOM   4181  CG  LYS B 418      94.870  51.325  49.384  1.00 42.47           C  
+ATOM   4182  CD  LYS B 418      95.941  50.790  50.316  1.00 43.77           C  
+ATOM   4183  CE  LYS B 418      95.678  49.324  50.671  1.00 45.28           C  
+ATOM   4184  NZ  LYS B 418      96.764  48.725  51.511  1.00 45.48           N  
+ATOM   4185  N   LYS B 419      93.903  55.544  47.071  1.00 34.73           N  
+ATOM   4186  CA  LYS B 419      93.940  57.000  46.965  1.00 30.63           C  
+ATOM   4187  C   LYS B 419      92.845  57.468  46.012  1.00 28.61           C  
+ATOM   4188  O   LYS B 419      93.065  58.335  45.164  1.00 23.59           O  
+ATOM   4189  CB  LYS B 419      95.302  57.441  46.442  1.00 33.32           C  
+ATOM   4190  CG  LYS B 419      96.475  56.969  47.285  1.00 40.51           C  
+ATOM   4191  CD  LYS B 419      97.782  57.349  46.617  1.00 45.23           C  
+ATOM   4192  CE  LYS B 419      98.985  56.964  47.454  1.00 46.69           C  
+ATOM   4193  NZ  LYS B 419     100.258  57.360  46.771  1.00 48.03           N  
+ATOM   4194  N   ARG B 420      91.656  56.893  46.163  1.00 25.51           N  
+ATOM   4195  CA  ARG B 420      90.539  57.238  45.285  1.00 23.49           C  
+ATOM   4196  C   ARG B 420      89.234  57.634  45.978  1.00 22.11           C  
+ATOM   4197  O   ARG B 420      88.225  57.874  45.304  1.00 21.73           O  
+ATOM   4198  CB  ARG B 420      90.271  56.071  44.325  1.00 22.85           C  
+ATOM   4199  CG  ARG B 420      90.907  54.778  44.777  1.00 21.96           C  
+ATOM   4200  CD  ARG B 420      90.600  53.686  43.812  1.00 23.48           C  
+ATOM   4201  NE  ARG B 420      89.461  52.913  44.281  1.00 23.14           N  
+ATOM   4202  CZ  ARG B 420      88.648  52.233  43.486  1.00 22.90           C  
+ATOM   4203  NH1 ARG B 420      88.844  52.238  42.171  1.00 23.14           N  
+ATOM   4204  NH2 ARG B 420      87.652  51.539  44.008  1.00 19.90           N  
+ATOM   4205  N   TYR B 421      89.254  57.705  47.308  1.00 21.45           N  
+ATOM   4206  CA  TYR B 421      88.062  58.075  48.045  1.00 21.99           C  
+ATOM   4207  C   TYR B 421      88.190  59.262  48.961  1.00 23.49           C  
+ATOM   4208  O   TYR B 421      89.078  59.315  49.808  1.00 25.96           O  
+ATOM   4209  CB  TYR B 421      87.516  56.894  48.846  1.00 19.53           C  
+ATOM   4210  CG  TYR B 421      86.541  56.092  48.041  1.00 18.10           C  
+ATOM   4211  CD1 TYR B 421      86.984  55.079  47.191  1.00 18.07           C  
+ATOM   4212  CD2 TYR B 421      85.184  56.438  48.020  1.00 17.47           C  
+ATOM   4213  CE1 TYR B 421      86.106  54.427  46.326  1.00 17.87           C  
+ATOM   4214  CE2 TYR B 421      84.290  55.804  47.158  1.00 17.64           C  
+ATOM   4215  CZ  TYR B 421      84.763  54.801  46.306  1.00 18.55           C  
+ATOM   4216  OH  TYR B 421      83.920  54.221  45.389  1.00 16.71           O  
+ATOM   4217  N   TRP B 422      87.280  60.213  48.768  1.00 23.70           N  
+ATOM   4218  CA  TRP B 422      87.209  61.416  49.573  1.00 22.97           C  
+ATOM   4219  C   TRP B 422      86.018  61.261  50.499  1.00 24.21           C  
+ATOM   4220  O   TRP B 422      85.016  60.622  50.162  1.00 21.72           O  
+ATOM   4221  CB  TRP B 422      87.013  62.635  48.689  1.00 21.55           C  
+ATOM   4222  CG  TRP B 422      88.213  62.972  47.923  1.00 22.57           C  
+ATOM   4223  CD1 TRP B 422      89.218  62.124  47.568  1.00 23.47           C  
+ATOM   4224  CD2 TRP B 422      88.571  64.263  47.408  1.00 22.88           C  
+ATOM   4225  NE1 TRP B 422      90.188  62.802  46.866  1.00 23.93           N  
+ATOM   4226  CE2 TRP B 422      89.817  64.117  46.751  1.00 23.38           C  
+ATOM   4227  CE3 TRP B 422      87.958  65.525  47.441  1.00 20.94           C  
+ATOM   4228  CZ2 TRP B 422      90.470  65.187  46.127  1.00 22.32           C  
+ATOM   4229  CZ3 TRP B 422      88.602  66.588  46.826  1.00 21.75           C  
+ATOM   4230  CH2 TRP B 422      89.852  66.412  46.175  1.00 23.52           C  
+ATOM   4231  N   LEU B 423      86.148  61.862  51.669  1.00 27.32           N  
+ATOM   4232  CA  LEU B 423      85.124  61.809  52.679  1.00 30.01           C  
+ATOM   4233  C   LEU B 423      84.595  63.210  52.924  1.00 29.64           C  
+ATOM   4234  O   LEU B 423      85.335  64.080  53.382  1.00 30.70           O  
+ATOM   4235  CB  LEU B 423      85.710  61.258  53.984  1.00 31.97           C  
+ATOM   4236  CG  LEU B 423      84.697  61.192  55.126  1.00 34.79           C  
+ATOM   4237  CD1 LEU B 423      83.769  60.025  54.853  1.00 34.51           C  
+ATOM   4238  CD2 LEU B 423      85.389  61.035  56.477  1.00 35.42           C  
+ATOM   4239  N   PHE B 424      83.327  63.436  52.603  1.00 30.55           N  
+ATOM   4240  CA  PHE B 424      82.716  64.739  52.856  1.00 30.60           C  
+ATOM   4241  C   PHE B 424      81.980  64.571  54.165  1.00 31.42           C  
+ATOM   4242  O   PHE B 424      80.929  63.933  54.224  1.00 31.85           O  
+ATOM   4243  CB  PHE B 424      81.744  65.132  51.744  1.00 28.61           C  
+ATOM   4244  CG  PHE B 424      82.421  65.606  50.480  1.00 27.26           C  
+ATOM   4245  CD1 PHE B 424      83.801  65.479  50.312  1.00 27.28           C  
+ATOM   4246  CD2 PHE B 424      81.672  66.183  49.448  1.00 27.55           C  
+ATOM   4247  CE1 PHE B 424      84.423  65.922  49.137  1.00 28.10           C  
+ATOM   4248  CE2 PHE B 424      82.279  66.627  48.270  1.00 25.97           C  
+ATOM   4249  CZ  PHE B 424      83.661  66.496  48.115  1.00 26.62           C  
+ATOM   4250  N   LYS B 425      82.561  65.113  55.225  1.00 33.92           N  
+ATOM   4251  CA  LYS B 425      81.962  64.992  56.537  1.00 35.95           C  
+ATOM   4252  C   LYS B 425      81.437  66.348  56.997  1.00 37.29           C  
+ATOM   4253  O   LYS B 425      82.160  67.347  57.012  1.00 37.80           O  
+ATOM   4254  CB  LYS B 425      82.992  64.438  57.524  1.00 36.30           C  
+ATOM   4255  CG  LYS B 425      82.418  63.495  58.565  1.00 37.17           C  
+ATOM   4256  CD  LYS B 425      83.525  62.989  59.474  1.00 38.59           C  
+ATOM   4257  CE  LYS B 425      82.970  62.276  60.687  1.00 38.47           C  
+ATOM   4258  NZ  LYS B 425      83.997  62.255  61.765  1.00 38.51           N  
+ATOM   4259  N   GLY B 426      80.162  66.392  57.353  1.00 39.53           N  
+ATOM   4260  CA  GLY B 426      79.609  67.649  57.800  1.00 39.73           C  
+ATOM   4261  C   GLY B 426      78.213  67.482  58.345  1.00 38.71           C  
+ATOM   4262  O   GLY B 426      77.588  66.426  58.174  1.00 41.97           O  
+ATOM   4263  N   PRO B 427      77.708  68.509  59.040  1.00 44.32           N  
+ATOM   4264  CA  PRO B 427      76.366  68.475  59.613  1.00 43.94           C  
+ATOM   4265  C   PRO B 427      75.367  68.355  58.486  1.00 45.46           C  
+ATOM   4266  O   PRO B 427      75.478  67.488  57.624  1.00 49.43           O  
+ATOM   4267  CB  PRO B 427      76.263  69.819  60.320  1.00 41.75           C  
+ATOM   4268  CG  PRO B 427      77.660  70.061  60.762  1.00 40.93           C  
+ATOM   4269  CD  PRO B 427      78.455  69.675  59.536  1.00 42.09           C  
+ATOM   4270  N   ILE B 428      74.402  69.255  58.493  1.00 50.37           N  
+ATOM   4271  CA  ILE B 428      73.358  69.275  57.484  1.00 53.16           C  
+ATOM   4272  C   ILE B 428      73.241  70.731  57.034  1.00 58.56           C  
+ATOM   4273  O   ILE B 428      73.452  71.653  57.828  1.00 52.38           O  
+ATOM   4274  CB  ILE B 428      72.036  68.763  58.094  1.00 54.51           C  
+ATOM   4275  CG1 ILE B 428      71.083  68.318  56.996  1.00 57.04           C  
+ATOM   4276  CG2 ILE B 428      71.405  69.845  58.952  1.00 57.18           C  
+ATOM   4277  CD1 ILE B 428      69.930  67.495  57.515  1.00 58.80           C  
+ATOM   4278  N   ASP B 429      72.926  70.938  55.761  1.00 62.79           N  
+ATOM   4279  CA  ASP B 429      72.826  72.286  55.217  1.00 63.60           C  
+ATOM   4280  C   ASP B 429      74.192  72.902  55.403  1.00 58.80           C  
+ATOM   4281  O   ASP B 429      74.313  74.080  55.699  1.00 54.89           O  
+ATOM   4282  CB  ASP B 429      71.784  73.111  55.973  1.00 81.05           C  
+ATOM   4283  CG  ASP B 429      70.428  72.452  55.985  1.00105.52           C  
+ATOM   4284  OD1 ASP B 429      70.316  71.344  56.550  1.00118.22           O  
+ATOM   4285  OD2 ASP B 429      69.475  73.037  55.429  1.00117.76           O  
+ATOM   4286  N   SER B 430      75.222  72.081  55.244  1.00 51.30           N  
+ATOM   4287  CA  SER B 430      76.603  72.530  55.394  1.00 43.99           C  
+ATOM   4288  C   SER B 430      77.370  72.618  54.071  1.00 40.98           C  
+ATOM   4289  O   SER B 430      78.511  73.078  54.047  1.00 38.97           O  
+ATOM   4290  CB  SER B 430      77.344  71.602  56.360  1.00 43.06           C  
+ATOM   4291  OG  SER B 430      77.010  70.248  56.118  1.00 45.54           O  
+ATOM   4292  N   GLY B 431      76.743  72.171  52.982  1.00 38.44           N  
+ATOM   4293  CA  GLY B 431      77.375  72.217  51.674  1.00 35.10           C  
+ATOM   4294  C   GLY B 431      77.799  70.891  51.050  1.00 34.36           C  
+ATOM   4295  O   GLY B 431      77.748  70.744  49.818  1.00 33.05           O  
+ATOM   4296  N   LYS B 432      78.212  69.926  51.878  1.00 32.12           N  
+ATOM   4297  CA  LYS B 432      78.668  68.634  51.368  1.00 32.02           C  
+ATOM   4298  C   LYS B 432      77.734  68.008  50.346  1.00 31.35           C  
+ATOM   4299  O   LYS B 432      78.172  67.533  49.291  1.00 31.31           O  
+ATOM   4300  CB  LYS B 432      78.902  67.658  52.512  1.00 30.97           C  
+ATOM   4301  CG  LYS B 432      77.945  67.806  53.651  1.00 33.97           C  
+ATOM   4302  CD  LYS B 432      78.114  66.665  54.642  1.00 33.09           C  
+ATOM   4303  CE  LYS B 432      77.045  65.613  54.420  1.00 32.65           C  
+ATOM   4304  NZ  LYS B 432      75.701  66.159  54.715  1.00 32.69           N  
+ATOM   4305  N   THR B 433      76.445  67.998  50.655  1.00 28.74           N  
+ATOM   4306  CA  THR B 433      75.472  67.434  49.737  1.00 26.58           C  
+ATOM   4307  C   THR B 433      75.498  68.196  48.414  1.00 25.74           C  
+ATOM   4308  O   THR B 433      75.522  67.600  47.345  1.00 21.86           O  
+ATOM   4309  CB  THR B 433      74.053  67.456  50.373  1.00 25.90           C  
+ATOM   4310  OG1 THR B 433      73.934  66.355  51.290  1.00 26.30           O  
+ATOM   4311  CG2 THR B 433      72.974  67.351  49.319  1.00 25.35           C  
+ATOM   4312  N   THR B 434      75.528  69.518  48.492  1.00 24.32           N  
+ATOM   4313  CA  THR B 434      75.550  70.343  47.289  1.00 23.06           C  
+ATOM   4314  C   THR B 434      76.789  70.101  46.420  1.00 24.94           C  
+ATOM   4315  O   THR B 434      76.662  69.809  45.222  1.00 22.10           O  
+ATOM   4316  CB  THR B 434      75.451  71.836  47.660  1.00 25.01           C  
+ATOM   4317  OG1 THR B 434      74.106  72.116  48.055  1.00 28.10           O  
+ATOM   4318  CG2 THR B 434      75.831  72.733  46.486  1.00 26.86           C  
+ATOM   4319  N   LEU B 435      77.977  70.205  47.023  1.00 27.02           N  
+ATOM   4320  CA  LEU B 435      79.232  70.003  46.300  1.00 27.60           C  
+ATOM   4321  C   LEU B 435      79.374  68.595  45.714  1.00 26.87           C  
+ATOM   4322  O   LEU B 435      79.900  68.425  44.613  1.00 28.49           O  
+ATOM   4323  CB  LEU B 435      80.425  70.297  47.208  1.00 28.49           C  
+ATOM   4324  CG  LEU B 435      81.783  70.347  46.489  1.00 28.74           C  
+ATOM   4325  CD1 LEU B 435      81.724  71.363  45.356  1.00 30.45           C  
+ATOM   4326  CD2 LEU B 435      82.872  70.733  47.479  1.00 29.41           C  
+ATOM   4327  N   ALA B 436      78.908  67.593  46.454  1.00 26.25           N  
+ATOM   4328  CA  ALA B 436      78.971  66.210  45.992  1.00 26.41           C  
+ATOM   4329  C   ALA B 436      78.030  66.035  44.814  1.00 26.58           C  
+ATOM   4330  O   ALA B 436      78.283  65.228  43.916  1.00 27.34           O  
+ATOM   4331  CB  ALA B 436      78.575  65.255  47.108  1.00 24.13           C  
+ATOM   4332  N   ALA B 437      76.938  66.792  44.822  1.00 25.59           N  
+ATOM   4333  CA  ALA B 437      75.967  66.714  43.741  1.00 26.14           C  
+ATOM   4334  C   ALA B 437      76.566  67.340  42.484  1.00 27.25           C  
+ATOM   4335  O   ALA B 437      76.436  66.804  41.380  1.00 27.20           O  
+ATOM   4336  CB  ALA B 437      74.687  67.442  44.129  1.00 26.75           C  
+ATOM   4337  N   ALA B 438      77.221  68.479  42.656  1.00 25.80           N  
+ATOM   4338  CA  ALA B 438      77.835  69.158  41.531  1.00 26.37           C  
+ATOM   4339  C   ALA B 438      78.969  68.305  40.965  1.00 26.13           C  
+ATOM   4340  O   ALA B 438      79.121  68.176  39.754  1.00 26.01           O  
+ATOM   4341  CB  ALA B 438      78.368  70.512  41.974  1.00 26.85           C  
+ATOM   4342  N   LEU B 439      79.768  67.725  41.852  1.00 26.17           N  
+ATOM   4343  CA  LEU B 439      80.891  66.898  41.426  1.00 25.76           C  
+ATOM   4344  C   LEU B 439      80.371  65.665  40.713  1.00 26.00           C  
+ATOM   4345  O   LEU B 439      80.954  65.219  39.717  1.00 24.83           O  
+ATOM   4346  CB  LEU B 439      81.746  66.490  42.638  1.00 25.13           C  
+ATOM   4347  CG  LEU B 439      82.685  67.553  43.231  1.00 24.09           C  
+ATOM   4348  CD1 LEU B 439      83.330  67.028  44.498  1.00 22.23           C  
+ATOM   4349  CD2 LEU B 439      83.741  67.941  42.208  1.00 23.38           C  
+ATOM   4350  N   LEU B 440      79.259  65.136  41.230  1.00 27.70           N  
+ATOM   4351  CA  LEU B 440      78.621  63.954  40.666  1.00 28.33           C  
+ATOM   4352  C   LEU B 440      78.238  64.223  39.223  1.00 30.13           C  
+ATOM   4353  O   LEU B 440      78.543  63.421  38.343  1.00 30.22           O  
+ATOM   4354  CB  LEU B 440      77.376  63.567  41.481  1.00 27.63           C  
+ATOM   4355  CG  LEU B 440      76.653  62.216  41.255  1.00 26.65           C  
+ATOM   4356  CD1 LEU B 440      75.523  62.367  40.254  1.00 25.80           C  
+ATOM   4357  CD2 LEU B 440      77.640  61.154  40.801  1.00 26.90           C  
+ATOM   4358  N   GLU B 441      77.603  65.367  38.974  1.00 31.94           N  
+ATOM   4359  CA  GLU B 441      77.181  65.716  37.622  1.00 33.09           C  
+ATOM   4360  C   GLU B 441      78.347  66.116  36.712  1.00 30.87           C  
+ATOM   4361  O   GLU B 441      78.337  65.851  35.513  1.00 30.94           O  
+ATOM   4362  CB  GLU B 441      76.145  66.842  37.665  1.00 37.61           C  
+ATOM   4363  CG  GLU B 441      75.619  67.228  36.288  1.00 46.88           C  
+ATOM   4364  CD  GLU B 441      74.299  67.969  36.338  1.00 51.32           C  
+ATOM   4365  OE1 GLU B 441      74.231  69.035  36.993  1.00 53.39           O  
+ATOM   4366  OE2 GLU B 441      73.329  67.481  35.715  1.00 53.42           O  
+ATOM   4367  N   LEU B 442      79.364  66.739  37.282  1.00 27.62           N  
+ATOM   4368  CA  LEU B 442      80.515  67.165  36.499  1.00 24.36           C  
+ATOM   4369  C   LEU B 442      81.257  65.989  35.895  1.00 25.62           C  
+ATOM   4370  O   LEU B 442      81.726  66.077  34.768  1.00 24.18           O  
+ATOM   4371  CB  LEU B 442      81.479  67.972  37.370  1.00 20.75           C  
+ATOM   4372  CG  LEU B 442      82.749  68.466  36.685  1.00 18.25           C  
+ATOM   4373  CD1 LEU B 442      82.422  69.620  35.764  1.00 16.40           C  
+ATOM   4374  CD2 LEU B 442      83.761  68.893  37.735  1.00 18.89           C  
+ATOM   4375  N   CYS B 443      81.357  64.888  36.638  1.00 29.46           N  
+ATOM   4376  CA  CYS B 443      82.073  63.691  36.170  1.00 32.36           C  
+ATOM   4377  C   CYS B 443      81.265  62.531  35.608  1.00 34.25           C  
+ATOM   4378  O   CYS B 443      81.818  61.668  34.921  1.00 33.09           O  
+ATOM   4379  CB  CYS B 443      82.903  63.122  37.302  1.00 31.81           C  
+ATOM   4380  SG  CYS B 443      84.072  64.275  37.898  1.00 37.05           S  
+ATOM   4381  N   GLY B 444      79.969  62.511  35.906  1.00 37.65           N  
+ATOM   4382  CA  GLY B 444      79.121  61.410  35.491  1.00 42.32           C  
+ATOM   4383  C   GLY B 444      79.126  60.505  36.717  1.00 43.98           C  
+ATOM   4384  O   GLY B 444      79.887  60.753  37.649  1.00 49.06           O  
+ATOM   4385  N   GLY B 445      78.294  59.474  36.757  1.00 44.74           N  
+ATOM   4386  CA  GLY B 445      78.305  58.604  37.923  1.00 42.92           C  
+ATOM   4387  C   GLY B 445      76.979  58.466  38.649  1.00 42.71           C  
+ATOM   4388  O   GLY B 445      76.021  59.181  38.359  1.00 41.85           O  
+ATOM   4389  N   LYS B 446      76.932  57.542  39.607  1.00 42.71           N  
+ATOM   4390  CA  LYS B 446      75.719  57.285  40.384  1.00 40.08           C  
+ATOM   4391  C   LYS B 446      75.871  57.449  41.894  1.00 38.23           C  
+ATOM   4392  O   LYS B 446      76.948  57.237  42.461  1.00 36.96           O  
+ATOM   4393  CB  LYS B 446      75.218  55.867  40.099  1.00 40.85           C  
+ATOM   4394  CG  LYS B 446      74.698  55.631  38.689  1.00 43.95           C  
+ATOM   4395  CD  LYS B 446      73.378  56.343  38.438  1.00 46.70           C  
+ATOM   4396  CE  LYS B 446      72.712  55.855  37.154  1.00 47.61           C  
+ATOM   4397  NZ  LYS B 446      71.339  56.435  36.994  1.00 48.16           N  
+ATOM   4398  N   ALA B 447      74.776  57.832  42.538  1.00 37.92           N  
+ATOM   4399  CA  ALA B 447      74.757  57.984  43.986  1.00 38.85           C  
+ATOM   4400  C   ALA B 447      74.339  56.605  44.490  1.00 40.12           C  
+ATOM   4401  O   ALA B 447      73.619  55.889  43.783  1.00 43.35           O  
+ATOM   4402  CB  ALA B 447      73.727  59.041  44.399  1.00 39.61           C  
+ATOM   4403  N   LEU B 448      74.795  56.219  45.683  1.00 38.67           N  
+ATOM   4404  CA  LEU B 448      74.439  54.911  46.234  1.00 37.24           C  
+ATOM   4405  C   LEU B 448      74.055  54.971  47.704  1.00 39.96           C  
+ATOM   4406  O   LEU B 448      74.699  55.666  48.497  1.00 35.95           O  
+ATOM   4407  CB  LEU B 448      75.597  53.920  46.089  1.00 35.87           C  
+ATOM   4408  CG  LEU B 448      76.155  53.591  44.709  1.00 34.46           C  
+ATOM   4409  CD1 LEU B 448      77.257  52.560  44.848  1.00 35.05           C  
+ATOM   4410  CD2 LEU B 448      75.061  53.076  43.830  1.00 34.46           C  
+ATOM   4411  N   ASN B 449      73.014  54.227  48.066  1.00 41.60           N  
+ATOM   4412  CA  ASN B 449      72.569  54.173  49.452  1.00 42.60           C  
+ATOM   4413  C   ASN B 449      72.973  52.831  50.030  1.00 41.43           C  
+ATOM   4414  O   ASN B 449      72.490  51.791  49.600  1.00 39.25           O  
+ATOM   4415  CB  ASN B 449      71.057  54.350  49.557  1.00 50.00           C  
+ATOM   4416  CG  ASN B 449      70.582  54.297  50.986  1.00 60.69           C  
+ATOM   4417  OD1 ASN B 449      70.625  53.245  51.619  1.00 68.36           O  
+ATOM   4418  ND2 ASN B 449      70.152  55.434  51.516  1.00 65.68           N  
+ATOM   4419  N   VAL B 450      73.869  52.867  51.008  1.00 42.39           N  
+ATOM   4420  CA  VAL B 450      74.370  51.657  51.626  1.00 43.90           C  
+ATOM   4421  C   VAL B 450      73.790  51.452  53.019  1.00 46.33           C  
+ATOM   4422  O   VAL B 450      74.101  50.469  53.691  1.00 47.15           O  
+ATOM   4423  CB  VAL B 450      75.911  51.687  51.657  1.00 43.01           C  
+ATOM   4424  CG1 VAL B 450      76.458  50.457  52.309  1.00 45.62           C  
+ATOM   4425  CG2 VAL B 450      76.435  51.755  50.251  1.00 44.17           C  
+ATOM   4426  N   ASN B 451      72.953  52.384  53.465  1.00 50.97           N  
+ATOM   4427  CA  ASN B 451      72.301  52.212  54.753  1.00 52.38           C  
+ATOM   4428  C   ASN B 451      71.175  51.257  54.384  1.00 52.69           C  
+ATOM   4429  O   ASN B 451      70.050  51.685  54.139  1.00 50.17           O  
+ATOM   4430  CB  ASN B 451      71.692  53.515  55.248  1.00 58.27           C  
+ATOM   4431  CG  ASN B 451      72.593  54.692  55.030  1.00 66.62           C  
+ATOM   4432  OD1 ASN B 451      73.686  54.765  55.591  1.00 70.41           O  
+ATOM   4433  ND2 ASN B 451      72.142  55.633  54.207  1.00 71.80           N  
+ATOM   4434  N   LEU B 452      71.482  49.969  54.304  1.00 57.13           N  
+ATOM   4435  CA  LEU B 452      70.473  48.987  53.930  1.00 60.61           C  
+ATOM   4436  C   LEU B 452      70.716  47.659  54.647  1.00 63.75           C  
+ATOM   4437  O   LEU B 452      71.607  47.555  55.497  1.00 69.41           O  
+ATOM   4438  CB  LEU B 452      70.514  48.758  52.414  1.00 54.90           C  
+ATOM   4439  CG  LEU B 452      70.287  49.905  51.427  1.00 50.44           C  
+ATOM   4440  CD1 LEU B 452      70.412  49.368  50.014  1.00 48.18           C  
+ATOM   4441  CD2 LEU B 452      68.918  50.519  51.626  1.00 48.56           C  
+ATOM   4442  N   PRO B 453      69.898  46.636  54.340  1.00 83.32           N  
+ATOM   4443  CA  PRO B 453      70.080  45.326  54.977  1.00 84.65           C  
+ATOM   4444  C   PRO B 453      71.356  44.721  54.394  1.00 83.91           C  
+ATOM   4445  O   PRO B 453      71.498  44.651  53.173  1.00 88.85           O  
+ATOM   4446  CB  PRO B 453      68.836  44.557  54.543  1.00 90.04           C  
+ATOM   4447  CG  PRO B 453      67.809  45.645  54.357  1.00 91.36           C  
+ATOM   4448  CD  PRO B 453      68.601  46.699  53.642  1.00 84.86           C  
+ATOM   4449  N   LEU B 454      72.275  44.288  55.254  1.00 83.57           N  
+ATOM   4450  CA  LEU B 454      73.542  43.727  54.788  1.00 79.96           C  
+ATOM   4451  C   LEU B 454      73.403  42.727  53.638  1.00 82.24           C  
+ATOM   4452  O   LEU B 454      74.405  42.295  53.067  1.00 77.88           O  
+ATOM   4453  CB  LEU B 454      74.303  43.066  55.941  1.00 73.50           C  
+ATOM   4454  CG  LEU B 454      75.708  42.564  55.575  1.00 68.39           C  
+ATOM   4455  CD1 LEU B 454      76.704  43.723  55.579  1.00 65.47           C  
+ATOM   4456  CD2 LEU B 454      76.139  41.494  56.560  1.00 67.29           C  
+ATOM   4457  N   ASP B 455      72.172  42.358  53.294  1.00 87.31           N  
+ATOM   4458  CA  ASP B 455      71.953  41.418  52.198  1.00 92.70           C  
+ATOM   4459  C   ASP B 455      71.318  42.099  50.986  1.00 95.57           C  
+ATOM   4460  O   ASP B 455      71.501  41.666  49.845  1.00 94.38           O  
+ATOM   4461  CB  ASP B 455      71.097  40.238  52.676  1.00 98.07           C  
+ATOM   4462  CG  ASP B 455      71.942  39.090  53.243  1.00105.29           C  
+ATOM   4463  OD1 ASP B 455      72.820  39.342  54.099  1.00109.17           O  
+ATOM   4464  OD2 ASP B 455      71.723  37.929  52.833  1.00109.15           O  
+ATOM   4465  N   ARG B 456      70.573  43.168  51.237  1.00100.41           N  
+ATOM   4466  CA  ARG B 456      69.951  43.920  50.158  1.00103.49           C  
+ATOM   4467  C   ARG B 456      70.958  44.984  49.724  1.00 99.71           C  
+ATOM   4468  O   ARG B 456      70.591  46.055  49.233  1.00101.80           O  
+ATOM   4469  CB  ARG B 456      68.651  44.562  50.647  1.00112.19           C  
+ATOM   4470  CG  ARG B 456      67.580  43.533  50.974  1.00125.10           C  
+ATOM   4471  CD  ARG B 456      66.300  44.166  51.506  1.00130.45           C  
+ATOM   4472  NE  ARG B 456      65.248  43.166  51.696  1.00131.93           N  
+ATOM   4473  CZ  ARG B 456      64.065  43.413  52.254  1.00132.20           C  
+ATOM   4474  NH1 ARG B 456      63.776  44.633  52.684  1.00132.19           N  
+ATOM   4475  NH2 ARG B 456      63.169  42.442  52.379  1.00131.91           N  
+ATOM   4476  N   LEU B 457      72.236  44.656  49.910  1.00 90.72           N  
+ATOM   4477  CA  LEU B 457      73.353  45.535  49.576  1.00 81.96           C  
+ATOM   4478  C   LEU B 457      73.847  45.320  48.140  1.00 79.50           C  
+ATOM   4479  O   LEU B 457      73.909  46.270  47.352  1.00 75.68           O  
+ATOM   4480  CB  LEU B 457      74.494  45.298  50.575  1.00 76.38           C  
+ATOM   4481  CG  LEU B 457      75.725  46.208  50.574  1.00 70.67           C  
+ATOM   4482  CD1 LEU B 457      75.283  47.654  50.694  1.00 69.03           C  
+ATOM   4483  CD2 LEU B 457      76.650  45.837  51.731  1.00 67.15           C  
+ATOM   4484  N   ASN B 458      74.197  44.079  47.802  1.00 73.08           N  
+ATOM   4485  CA  ASN B 458      74.678  43.755  46.456  1.00 69.84           C  
+ATOM   4486  C   ASN B 458      73.827  44.447  45.395  1.00 71.95           C  
+ATOM   4487  O   ASN B 458      74.339  44.882  44.357  1.00 63.80           O  
+ATOM   4488  CB  ASN B 458      74.643  42.243  46.225  1.00 70.04           C  
+ATOM   4489  CG  ASN B 458      75.586  41.492  47.144  1.00 73.90           C  
+ATOM   4490  OD1 ASN B 458      76.799  41.710  47.124  1.00 76.91           O  
+ATOM   4491  ND2 ASN B 458      75.031  40.598  47.955  1.00 76.37           N  
+ATOM   4492  N   PHE B 459      72.526  44.528  45.676  1.00 72.95           N  
+ATOM   4493  CA  PHE B 459      71.537  45.172  44.807  1.00 72.96           C  
+ATOM   4494  C   PHE B 459      72.080  46.535  44.373  1.00 71.07           C  
+ATOM   4495  O   PHE B 459      72.323  46.776  43.186  1.00 62.90           O  
+ATOM   4496  CB  PHE B 459      70.227  45.367  45.597  1.00 85.95           C  
+ATOM   4497  CG  PHE B 459      69.121  46.068  44.832  1.00106.24           C  
+ATOM   4498  CD1 PHE B 459      68.191  45.335  44.096  1.00114.37           C  
+ATOM   4499  CD2 PHE B 459      68.989  47.457  44.879  1.00114.03           C  
+ATOM   4500  CE1 PHE B 459      67.143  45.975  43.421  1.00117.48           C  
+ATOM   4501  CE2 PHE B 459      67.948  48.104  44.208  1.00117.01           C  
+ATOM   4502  CZ  PHE B 459      67.025  47.361  43.479  1.00118.06           C  
+ATOM   4503  N   GLU B 460      72.281  47.411  45.358  1.00 67.66           N  
+ATOM   4504  CA  GLU B 460      72.761  48.767  45.124  1.00 62.79           C  
+ATOM   4505  C   GLU B 460      74.187  48.828  44.578  1.00 56.97           C  
+ATOM   4506  O   GLU B 460      74.464  49.536  43.609  1.00 54.32           O  
+ATOM   4507  CB  GLU B 460      72.666  49.580  46.422  1.00 67.31           C  
+ATOM   4508  CG  GLU B 460      72.275  51.038  46.204  1.00 77.67           C  
+ATOM   4509  CD  GLU B 460      70.783  51.226  46.004  1.00 82.26           C  
+ATOM   4510  OE1 GLU B 460      70.139  50.355  45.383  1.00 83.76           O  
+ATOM   4511  OE2 GLU B 460      70.255  52.256  46.464  1.00 84.48           O  
+ATOM   4512  N   LEU B 461      75.094  48.090  45.201  1.00 49.44           N  
+ATOM   4513  CA  LEU B 461      76.473  48.093  44.745  1.00 45.10           C  
+ATOM   4514  C   LEU B 461      76.559  47.792  43.251  1.00 43.19           C  
+ATOM   4515  O   LEU B 461      77.472  48.253  42.566  1.00 42.65           O  
+ATOM   4516  CB  LEU B 461      77.294  47.074  45.536  1.00 40.94           C  
+ATOM   4517  CG  LEU B 461      77.476  47.360  47.032  1.00 37.84           C  
+ATOM   4518  CD1 LEU B 461      78.447  46.319  47.604  1.00 33.59           C  
+ATOM   4519  CD2 LEU B 461      78.002  48.798  47.265  1.00 34.26           C  
+ATOM   4520  N   GLY B 462      75.603  47.019  42.750  1.00 41.64           N  
+ATOM   4521  CA  GLY B 462      75.594  46.679  41.340  1.00 40.36           C  
+ATOM   4522  C   GLY B 462      75.323  47.877  40.447  1.00 41.30           C  
+ATOM   4523  O   GLY B 462      75.616  47.837  39.254  1.00 38.56           O  
+ATOM   4524  N   VAL B 463      74.764  48.943  41.014  1.00 42.70           N  
+ATOM   4525  CA  VAL B 463      74.469  50.144  40.234  1.00 44.21           C  
+ATOM   4526  C   VAL B 463      75.757  50.797  39.751  1.00 43.35           C  
+ATOM   4527  O   VAL B 463      75.762  51.528  38.752  1.00 44.46           O  
+ATOM   4528  CB  VAL B 463      73.705  51.198  41.067  1.00 48.30           C  
+ATOM   4529  CG1 VAL B 463      73.341  52.401  40.188  1.00 51.37           C  
+ATOM   4530  CG2 VAL B 463      72.464  50.577  41.679  1.00 52.22           C  
+ATOM   4531  N   ALA B 464      76.841  50.516  40.473  1.00 41.37           N  
+ATOM   4532  CA  ALA B 464      78.160  51.073  40.190  1.00 39.33           C  
+ATOM   4533  C   ALA B 464      78.782  50.578  38.897  1.00 41.81           C  
+ATOM   4534  O   ALA B 464      79.767  51.145  38.421  1.00 44.34           O  
+ATOM   4535  CB  ALA B 464      79.087  50.775  41.347  1.00 35.00           C  
+ATOM   4536  N   ILE B 465      78.200  49.522  38.337  1.00 46.92           N  
+ATOM   4537  CA  ILE B 465      78.684  48.910  37.107  1.00 51.40           C  
+ATOM   4538  C   ILE B 465      78.954  49.895  35.985  1.00 55.54           C  
+ATOM   4539  O   ILE B 465      78.053  50.612  35.559  1.00 55.70           O  
+ATOM   4540  CB  ILE B 465      77.683  47.857  36.625  1.00 52.72           C  
+ATOM   4541  CG1 ILE B 465      77.791  46.628  37.532  1.00 55.93           C  
+ATOM   4542  CG2 ILE B 465      77.926  47.524  35.161  1.00 54.61           C  
+ATOM   4543  CD1 ILE B 465      76.741  45.567  37.301  1.00 57.56           C  
+ATOM   4544  N   ASP B 466      80.199  49.918  35.513  1.00 59.32           N  
+ATOM   4545  CA  ASP B 466      80.621  50.804  34.426  1.00 61.25           C  
+ATOM   4546  C   ASP B 466      80.513  52.305  34.719  1.00 58.62           C  
+ATOM   4547  O   ASP B 466      80.692  53.126  33.814  1.00 57.13           O  
+ATOM   4548  CB  ASP B 466      79.833  50.492  33.146  1.00 70.78           C  
+ATOM   4549  CG  ASP B 466      80.149  49.123  32.582  1.00 83.85           C  
+ATOM   4550  OD1 ASP B 466      81.128  48.506  33.049  1.00 90.84           O  
+ATOM   4551  OD2 ASP B 466      79.425  48.670  31.666  1.00 89.90           O  
+ATOM   4552  N   GLN B 467      80.215  52.669  35.964  1.00 52.29           N  
+ATOM   4553  CA  GLN B 467      80.107  54.079  36.334  1.00 45.89           C  
+ATOM   4554  C   GLN B 467      81.499  54.680  36.527  1.00 42.21           C  
+ATOM   4555  O   GLN B 467      82.383  54.042  37.088  1.00 41.59           O  
+ATOM   4556  CB  GLN B 467      79.295  54.229  37.624  1.00 45.56           C  
+ATOM   4557  CG  GLN B 467      77.801  53.982  37.465  1.00 45.85           C  
+ATOM   4558  CD  GLN B 467      77.185  54.879  36.406  1.00 45.76           C  
+ATOM   4559  OE1 GLN B 467      77.309  54.615  35.216  1.00 45.91           O  
+ATOM   4560  NE2 GLN B 467      76.537  55.955  36.834  1.00 45.38           N  
+ATOM   4561  N   PHE B 468      81.690  55.904  36.059  1.00 35.95           N  
+ATOM   4562  CA  PHE B 468      82.977  56.580  36.190  1.00 31.78           C  
+ATOM   4563  C   PHE B 468      83.375  56.845  37.648  1.00 30.75           C  
+ATOM   4564  O   PHE B 468      84.530  56.672  38.017  1.00 31.28           O  
+ATOM   4565  CB  PHE B 468      82.933  57.889  35.419  1.00 30.08           C  
+ATOM   4566  CG  PHE B 468      84.199  58.681  35.494  1.00 27.67           C  
+ATOM   4567  CD1 PHE B 468      85.318  58.292  34.761  1.00 26.08           C  
+ATOM   4568  CD2 PHE B 468      84.266  59.832  36.280  1.00 25.96           C  
+ATOM   4569  CE1 PHE B 468      86.488  59.036  34.803  1.00 26.77           C  
+ATOM   4570  CE2 PHE B 468      85.424  60.583  36.332  1.00 26.67           C  
+ATOM   4571  CZ  PHE B 468      86.544  60.188  35.591  1.00 27.18           C  
+ATOM   4572  N   LEU B 469      82.433  57.297  38.468  1.00 27.72           N  
+ATOM   4573  CA  LEU B 469      82.717  57.536  39.881  1.00 27.26           C  
+ATOM   4574  C   LEU B 469      81.433  57.280  40.648  1.00 28.57           C  
+ATOM   4575  O   LEU B 469      80.335  57.310  40.084  1.00 29.37           O  
+ATOM   4576  CB  LEU B 469      83.205  58.973  40.148  1.00 25.26           C  
+ATOM   4577  CG  LEU B 469      82.244  60.152  40.402  1.00 23.80           C  
+ATOM   4578  CD1 LEU B 469      81.416  59.922  41.665  1.00 23.69           C  
+ATOM   4579  CD2 LEU B 469      83.050  61.442  40.574  1.00 24.39           C  
+ATOM   4580  N   VAL B 470      81.563  57.048  41.942  1.00 27.95           N  
+ATOM   4581  CA  VAL B 470      80.403  56.769  42.749  1.00 27.32           C  
+ATOM   4582  C   VAL B 470      80.290  57.690  43.944  1.00 26.11           C  
+ATOM   4583  O   VAL B 470      81.289  58.207  44.445  1.00 27.79           O  
+ATOM   4584  CB  VAL B 470      80.459  55.304  43.229  1.00 27.94           C  
+ATOM   4585  CG1 VAL B 470      79.753  55.139  44.567  1.00 27.17           C  
+ATOM   4586  CG2 VAL B 470      79.831  54.414  42.181  1.00 27.45           C  
+ATOM   4587  N   VAL B 471      79.061  57.910  44.391  1.00 24.64           N  
+ATOM   4588  CA  VAL B 471      78.860  58.719  45.571  1.00 24.06           C  
+ATOM   4589  C   VAL B 471      77.912  58.015  46.544  1.00 23.72           C  
+ATOM   4590  O   VAL B 471      76.757  57.742  46.220  1.00 24.86           O  
+ATOM   4591  CB  VAL B 471      78.308  60.122  45.231  1.00 21.44           C  
+ATOM   4592  CG1 VAL B 471      77.979  60.877  46.537  1.00 14.48           C  
+ATOM   4593  CG2 VAL B 471      79.334  60.912  44.424  1.00 12.41           C  
+ATOM   4594  N   PHE B 472      78.442  57.687  47.720  1.00 25.75           N  
+ATOM   4595  CA  PHE B 472      77.679  57.055  48.795  1.00 29.45           C  
+ATOM   4596  C   PHE B 472      77.100  58.227  49.584  1.00 35.97           C  
+ATOM   4597  O   PHE B 472      77.811  58.856  50.377  1.00 31.82           O  
+ATOM   4598  CB  PHE B 472      78.605  56.253  49.707  1.00 27.11           C  
+ATOM   4599  CG  PHE B 472      79.238  55.043  49.048  1.00 25.45           C  
+ATOM   4600  CD1 PHE B 472      78.652  53.790  49.165  1.00 23.46           C  
+ATOM   4601  CD2 PHE B 472      80.440  55.152  48.353  1.00 22.28           C  
+ATOM   4602  CE1 PHE B 472      79.250  52.672  48.608  1.00 21.89           C  
+ATOM   4603  CE2 PHE B 472      81.041  54.035  47.796  1.00 21.71           C  
+ATOM   4604  CZ  PHE B 472      80.450  52.800  47.923  1.00 22.09           C  
+ATOM   4605  N   GLU B 473      75.822  58.521  49.349  1.00 43.95           N  
+ATOM   4606  CA  GLU B 473      75.158  59.630  50.008  1.00 50.62           C  
+ATOM   4607  C   GLU B 473      74.627  59.356  51.403  1.00 52.29           C  
+ATOM   4608  O   GLU B 473      73.969  58.351  51.641  1.00 46.85           O  
+ATOM   4609  CB  GLU B 473      74.028  60.174  49.134  1.00 62.20           C  
+ATOM   4610  CG  GLU B 473      74.264  61.590  48.622  1.00 87.71           C  
+ATOM   4611  CD  GLU B 473      74.395  62.622  49.737  1.00 98.31           C  
+ATOM   4612  OE1 GLU B 473      73.475  62.717  50.580  1.00101.96           O  
+ATOM   4613  OE2 GLU B 473      75.416  63.344  49.768  1.00101.31           O  
+ATOM   4614  N   ASP B 474      74.922  60.282  52.313  1.00 53.04           N  
+ATOM   4615  CA  ASP B 474      74.506  60.225  53.705  1.00 49.97           C  
+ATOM   4616  C   ASP B 474      74.629  58.864  54.371  1.00 45.96           C  
+ATOM   4617  O   ASP B 474      73.642  58.284  54.813  1.00 42.30           O  
+ATOM   4618  CB  ASP B 474      73.075  60.730  53.853  1.00 59.21           C  
+ATOM   4619  CG  ASP B 474      72.955  61.796  54.909  1.00 74.74           C  
+ATOM   4620  OD1 ASP B 474      72.014  61.717  55.723  1.00 83.31           O  
+ATOM   4621  OD2 ASP B 474      73.803  62.715  54.919  1.00 82.54           O  
+ATOM   4622  N   VAL B 475      75.852  58.360  54.440  1.00 42.61           N  
+ATOM   4623  CA  VAL B 475      76.109  57.091  55.081  1.00 39.96           C  
+ATOM   4624  C   VAL B 475      75.802  57.316  56.560  1.00 40.87           C  
+ATOM   4625  O   VAL B 475      76.142  58.363  57.111  1.00 40.16           O  
+ATOM   4626  CB  VAL B 475      77.580  56.706  54.907  1.00 37.46           C  
+ATOM   4627  CG1 VAL B 475      77.783  55.251  55.268  1.00 37.24           C  
+ATOM   4628  CG2 VAL B 475      78.009  56.978  53.482  1.00 36.08           C  
+ATOM   4629  N   LYS B 476      75.144  56.350  57.197  1.00 44.18           N  
+ATOM   4630  CA  LYS B 476      74.802  56.475  58.614  1.00 45.22           C  
+ATOM   4631  C   LYS B 476      75.451  55.378  59.439  1.00 45.90           C  
+ATOM   4632  O   LYS B 476      75.638  54.261  58.954  1.00 43.93           O  
+ATOM   4633  CB  LYS B 476      73.288  56.420  58.802  1.00 47.29           C  
+ATOM   4634  CG  LYS B 476      72.550  57.537  58.106  1.00 51.09           C  
+ATOM   4635  CD  LYS B 476      71.057  57.304  58.117  1.00 53.28           C  
+ATOM   4636  CE  LYS B 476      70.380  58.208  57.110  1.00 54.71           C  
+ATOM   4637  NZ  LYS B 476      68.907  58.071  57.150  1.00 55.63           N  
+ATOM   4638  N   GLY B 477      75.794  55.705  60.682  1.00 49.06           N  
+ATOM   4639  CA  GLY B 477      76.426  54.733  61.555  1.00 53.66           C  
+ATOM   4640  C   GLY B 477      75.653  54.486  62.831  1.00 58.13           C  
+ATOM   4641  O   GLY B 477      74.948  55.368  63.315  1.00 55.95           O  
+ATOM   4642  N   THR B 478      75.776  53.275  63.366  1.00 67.05           N  
+ATOM   4643  CA  THR B 478      75.095  52.913  64.602  1.00 73.80           C  
+ATOM   4644  C   THR B 478      75.719  53.745  65.710  1.00 75.48           C  
+ATOM   4645  O   THR B 478      75.022  54.451  66.440  1.00 76.87           O  
+ATOM   4646  CB  THR B 478      75.288  51.426  64.947  1.00 78.75           C  
+ATOM   4647  OG1 THR B 478      74.915  50.620  63.824  1.00 85.98           O  
+ATOM   4648  CG2 THR B 478      74.422  51.046  66.144  1.00 85.99           C  
+ATOM   4649  N   GLY B 479      77.039  53.645  65.836  1.00 78.60           N  
+ATOM   4650  CA  GLY B 479      77.730  54.418  66.846  1.00 80.24           C  
+ATOM   4651  C   GLY B 479      77.216  55.833  66.693  1.00 81.02           C  
+ATOM   4652  O   GLY B 479      76.970  56.281  65.572  1.00 82.07           O  
+ATOM   4653  N   GLY B 480      77.031  56.536  67.802  1.00 81.00           N  
+ATOM   4654  CA  GLY B 480      76.529  57.893  67.719  1.00 82.35           C  
+ATOM   4655  C   GLY B 480      75.017  57.884  67.669  1.00 86.16           C  
+ATOM   4656  O   GLY B 480      74.412  57.153  66.888  1.00 83.18           O  
+ATOM   4657  N   GLU B 481      74.406  58.724  68.490  1.00 91.11           N  
+ATOM   4658  CA  GLU B 481      72.957  58.793  68.573  1.00 89.75           C  
+ATOM   4659  C   GLU B 481      72.574  59.978  69.444  1.00 85.74           C  
+ATOM   4660  O   GLU B 481      71.595  60.677  69.183  1.00 81.96           O  
+ATOM   4661  CB  GLU B 481      72.443  57.499  69.197  1.00 95.75           C  
+ATOM   4662  CG  GLU B 481      73.279  57.063  70.393  1.00112.64           C  
+ATOM   4663  CD  GLU B 481      72.901  55.694  70.915  1.00120.77           C  
+ATOM   4664  OE1 GLU B 481      71.763  55.538  71.407  1.00123.88           O  
+ATOM   4665  OE2 GLU B 481      73.743  54.773  70.832  1.00124.11           O  
+ATOM   4666  N   SER B 482      73.361  60.194  70.490  1.00 82.96           N  
+ATOM   4667  CA  SER B 482      73.121  61.295  71.403  1.00 83.45           C  
+ATOM   4668  C   SER B 482      72.944  62.604  70.635  1.00 85.33           C  
+ATOM   4669  O   SER B 482      71.917  63.264  70.766  1.00 90.55           O  
+ATOM   4670  CB  SER B 482      74.277  61.407  72.403  1.00 81.55           C  
+ATOM   4671  OG  SER B 482      75.532  61.215  71.768  1.00 74.27           O  
+ATOM   4672  N   ARG B 483      73.927  62.963  69.813  1.00 86.74           N  
+ATOM   4673  CA  ARG B 483      73.865  64.206  69.044  1.00 86.80           C  
+ATOM   4674  C   ARG B 483      72.710  64.339  68.029  1.00 87.00           C  
+ATOM   4675  O   ARG B 483      72.752  65.199  67.144  1.00 79.05           O  
+ATOM   4676  CB  ARG B 483      75.218  64.473  68.358  1.00 90.48           C  
+ATOM   4677  CG  ARG B 483      75.842  63.281  67.640  1.00 97.49           C  
+ATOM   4678  CD  ARG B 483      76.573  62.325  68.588  1.00100.20           C  
+ATOM   4679  NE  ARG B 483      77.886  62.818  69.008  1.00100.82           N  
+ATOM   4680  CZ  ARG B 483      78.728  62.138  69.787  1.00101.45           C  
+ATOM   4681  NH1 ARG B 483      78.400  60.931  70.236  1.00101.17           N  
+ATOM   4682  NH2 ARG B 483      79.904  62.664  70.119  1.00101.05           N  
+ATOM   4683  N   ASP B 484      71.684  63.497  68.174  1.00 82.10           N  
+ATOM   4684  CA  ASP B 484      70.489  63.530  67.319  1.00 75.79           C  
+ATOM   4685  C   ASP B 484      70.583  62.845  65.957  1.00 71.38           C  
+ATOM   4686  O   ASP B 484      69.709  63.016  65.098  1.00 63.51           O  
+ATOM   4687  CB  ASP B 484      70.033  64.978  67.104  1.00 83.33           C  
+ATOM   4688  CG  ASP B 484      69.816  65.721  68.404  1.00 96.30           C  
+ATOM   4689  OD1 ASP B 484      69.208  65.135  69.323  1.00103.78           O  
+ATOM   4690  OD2 ASP B 484      70.242  66.892  68.502  1.00104.24           O  
+ATOM   4691  N   LEU B 485      71.628  62.057  65.759  1.00 66.69           N  
+ATOM   4692  CA  LEU B 485      71.809  61.375  64.490  1.00 63.92           C  
+ATOM   4693  C   LEU B 485      71.226  59.967  64.512  1.00 62.94           C  
+ATOM   4694  O   LEU B 485      71.479  59.196  65.442  1.00 65.22           O  
+ATOM   4695  CB  LEU B 485      73.296  61.313  64.156  1.00 64.76           C  
+ATOM   4696  CG  LEU B 485      74.006  62.665  64.247  1.00 65.73           C  
+ATOM   4697  CD1 LEU B 485      75.500  62.499  64.012  1.00 66.40           C  
+ATOM   4698  CD2 LEU B 485      73.396  63.612  63.227  1.00 66.43           C  
+ATOM   4699  N   PRO B 486      70.427  59.618  63.486  1.00 65.55           N  
+ATOM   4700  CA  PRO B 486      69.776  58.312  63.325  1.00 65.96           C  
+ATOM   4701  C   PRO B 486      70.731  57.125  63.441  1.00 66.83           C  
+ATOM   4702  O   PRO B 486      71.912  57.300  63.747  1.00 68.29           O  
+ATOM   4703  CB  PRO B 486      69.138  58.424  61.944  1.00 65.64           C  
+ATOM   4704  CG  PRO B 486      68.702  59.851  61.925  1.00 65.07           C  
+ATOM   4705  CD  PRO B 486      69.925  60.569  62.476  1.00 64.97           C  
+ATOM   4706  N   SER B 487      70.224  55.924  63.180  1.00 67.36           N  
+ATOM   4707  CA  SER B 487      71.043  54.721  63.288  1.00 67.47           C  
+ATOM   4708  C   SER B 487      71.738  54.315  61.983  1.00 65.37           C  
+ATOM   4709  O   SER B 487      72.943  54.554  61.814  1.00 62.70           O  
+ATOM   4710  CB  SER B 487      70.189  53.565  63.807  1.00 71.90           C  
+ATOM   4711  OG  SER B 487      70.984  52.428  64.094  1.00 80.65           O  
+ATOM   4712  N   GLY B 488      70.992  53.694  61.068  1.00 59.63           N  
+ATOM   4713  CA  GLY B 488      71.576  53.279  59.798  1.00 53.38           C  
+ATOM   4714  C   GLY B 488      72.781  52.351  59.909  1.00 51.19           C  
+ATOM   4715  O   GLY B 488      73.483  52.347  60.920  1.00 46.11           O  
+ATOM   4716  N   GLN B 489      73.033  51.574  58.860  1.00 51.47           N  
+ATOM   4717  CA  GLN B 489      74.152  50.635  58.853  1.00 52.08           C  
+ATOM   4718  C   GLN B 489      75.220  50.920  57.792  1.00 51.27           C  
+ATOM   4719  O   GLN B 489      76.103  50.095  57.561  1.00 50.23           O  
+ATOM   4720  CB  GLN B 489      73.625  49.209  58.664  1.00 54.93           C  
+ATOM   4721  CG  GLN B 489      72.834  48.668  59.842  1.00 61.98           C  
+ATOM   4722  CD  GLN B 489      73.708  48.338  61.039  1.00 65.32           C  
+ATOM   4723  OE1 GLN B 489      74.681  47.586  60.922  1.00 66.90           O  
+ATOM   4724  NE2 GLN B 489      73.358  48.886  62.203  1.00 66.19           N  
+ATOM   4725  N   GLY B 490      75.141  52.079  57.146  1.00 49.30           N  
+ATOM   4726  CA  GLY B 490      76.116  52.414  56.121  1.00 47.25           C  
+ATOM   4727  C   GLY B 490      77.573  52.287  56.540  1.00 45.97           C  
+ATOM   4728  O   GLY B 490      78.335  51.556  55.902  1.00 46.10           O  
+ATOM   4729  N   ILE B 491      77.962  52.997  57.602  1.00 43.06           N  
+ATOM   4730  CA  ILE B 491      79.342  52.958  58.094  1.00 38.17           C  
+ATOM   4731  C   ILE B 491      79.738  51.501  58.314  1.00 40.89           C  
+ATOM   4732  O   ILE B 491      80.859  51.077  58.006  1.00 35.68           O  
+ATOM   4733  CB  ILE B 491      79.498  53.700  59.443  1.00 36.14           C  
+ATOM   4734  CG1 ILE B 491      78.787  55.051  59.399  1.00 34.17           C  
+ATOM   4735  CG2 ILE B 491      80.972  53.915  59.748  1.00 32.76           C  
+ATOM   4736  CD1 ILE B 491      79.441  56.072  58.518  1.00 35.07           C  
+ATOM   4737  N   ASN B 492      78.793  50.739  58.847  1.00 44.31           N  
+ATOM   4738  CA  ASN B 492      79.012  49.330  59.109  1.00 47.14           C  
+ATOM   4739  C   ASN B 492      79.320  48.627  57.797  1.00 47.48           C  
+ATOM   4740  O   ASN B 492      80.295  47.888  57.692  1.00 48.00           O  
+ATOM   4741  CB  ASN B 492      77.760  48.712  59.717  1.00 54.60           C  
+ATOM   4742  CG  ASN B 492      78.075  47.734  60.811  1.00 63.99           C  
+ATOM   4743  OD1 ASN B 492      78.156  48.108  61.983  1.00 69.01           O  
+ATOM   4744  ND2 ASN B 492      78.269  46.470  60.441  1.00 67.45           N  
+ATOM   4745  N   ASN B 493      78.483  48.871  56.794  1.00 47.26           N  
+ATOM   4746  CA  ASN B 493      78.651  48.239  55.495  1.00 44.97           C  
+ATOM   4747  C   ASN B 493      79.909  48.680  54.767  1.00 43.91           C  
+ATOM   4748  O   ASN B 493      80.635  47.848  54.218  1.00 41.65           O  
+ATOM   4749  CB  ASN B 493      77.429  48.502  54.613  1.00 45.91           C  
+ATOM   4750  CG  ASN B 493      76.176  47.838  55.144  1.00 47.47           C  
+ATOM   4751  OD1 ASN B 493      76.125  46.624  55.295  1.00 49.98           O  
+ATOM   4752  ND2 ASN B 493      75.160  48.634  55.432  1.00 49.48           N  
+ATOM   4753  N   LEU B 494      80.168  49.984  54.762  1.00 43.52           N  
+ATOM   4754  CA  LEU B 494      81.348  50.498  54.082  1.00 44.12           C  
+ATOM   4755  C   LEU B 494      82.577  49.761  54.561  1.00 46.33           C  
+ATOM   4756  O   LEU B 494      83.437  49.395  53.762  1.00 45.35           O  
+ATOM   4757  CB  LEU B 494      81.523  52.006  54.323  1.00 42.56           C  
+ATOM   4758  CG  LEU B 494      80.578  52.959  53.570  1.00 41.07           C  
+ATOM   4759  CD1 LEU B 494      80.966  54.377  53.896  1.00 39.22           C  
+ATOM   4760  CD2 LEU B 494      80.644  52.724  52.051  1.00 39.99           C  
+ATOM   4761  N   ASP B 495      82.652  49.522  55.864  1.00 51.79           N  
+ATOM   4762  CA  ASP B 495      83.805  48.830  56.413  1.00 55.06           C  
+ATOM   4763  C   ASP B 495      83.959  47.398  55.899  1.00 55.70           C  
+ATOM   4764  O   ASP B 495      85.048  46.820  55.981  1.00 53.90           O  
+ATOM   4765  CB  ASP B 495      83.760  48.831  57.934  1.00 60.63           C  
+ATOM   4766  CG  ASP B 495      85.138  48.986  58.541  1.00 69.57           C  
+ATOM   4767  OD1 ASP B 495      86.057  48.243  58.127  1.00 74.01           O  
+ATOM   4768  OD2 ASP B 495      85.306  49.853  59.425  1.00 73.94           O  
+ATOM   4769  N   ASN B 496      82.880  46.832  55.360  1.00 57.46           N  
+ATOM   4770  CA  ASN B 496      82.918  45.473  54.820  1.00 56.65           C  
+ATOM   4771  C   ASN B 496      83.121  45.484  53.311  1.00 53.89           C  
+ATOM   4772  O   ASN B 496      82.941  44.467  52.640  1.00 56.25           O  
+ATOM   4773  CB  ASN B 496      81.623  44.735  55.131  1.00 58.74           C  
+ATOM   4774  CG  ASN B 496      81.326  44.697  56.603  1.00 62.52           C  
+ATOM   4775  OD1 ASN B 496      82.175  44.324  57.415  1.00 63.47           O  
+ATOM   4776  ND2 ASN B 496      80.112  45.083  56.962  1.00 65.34           N  
+ATOM   4777  N   LEU B 497      83.494  46.643  52.781  1.00 51.11           N  
+ATOM   4778  CA  LEU B 497      83.710  46.786  51.353  1.00 52.26           C  
+ATOM   4779  C   LEU B 497      85.083  47.399  51.066  1.00 58.79           C  
+ATOM   4780  O   LEU B 497      85.283  48.020  50.024  1.00 55.73           O  
+ATOM   4781  CB  LEU B 497      82.606  47.661  50.758  1.00 45.55           C  
+ATOM   4782  CG  LEU B 497      81.159  47.225  51.020  1.00 37.73           C  
+ATOM   4783  CD1 LEU B 497      80.201  48.377  50.737  1.00 32.55           C  
+ATOM   4784  CD2 LEU B 497      80.833  46.023  50.162  1.00 33.77           C  
+ATOM   4785  N   ARG B 498      86.025  47.219  51.991  1.00 63.77           N  
+ATOM   4786  CA  ARG B 498      87.377  47.746  51.829  1.00 63.57           C  
+ATOM   4787  C   ARG B 498      87.965  47.385  50.465  1.00 59.66           C  
+ATOM   4788  O   ARG B 498      88.796  48.107  49.937  1.00 49.04           O  
+ATOM   4789  CB  ARG B 498      88.277  47.223  52.948  1.00 74.69           C  
+ATOM   4790  CG  ARG B 498      88.318  45.721  53.019  1.00101.51           C  
+ATOM   4791  CD  ARG B 498      89.087  45.230  54.222  1.00115.21           C  
+ATOM   4792  NE  ARG B 498      89.292  43.784  54.154  1.00120.19           N  
+ATOM   4793  CZ  ARG B 498      89.944  43.074  55.069  1.00121.23           C  
+ATOM   4794  NH1 ARG B 498      90.457  43.678  56.132  1.00121.28           N  
+ATOM   4795  NH2 ARG B 498      90.091  41.763  54.916  1.00120.71           N  
+ATOM   4796  N   ASP B 499      87.515  46.281  49.884  1.00 55.47           N  
+ATOM   4797  CA  ASP B 499      88.019  45.849  48.584  1.00 52.62           C  
+ATOM   4798  C   ASP B 499      87.423  46.629  47.424  1.00 51.25           C  
+ATOM   4799  O   ASP B 499      88.051  46.787  46.369  1.00 53.70           O  
+ATOM   4800  CB  ASP B 499      87.758  44.358  48.393  1.00 53.32           C  
+ATOM   4801  CG  ASP B 499      88.850  43.502  48.995  1.00 56.79           C  
+ATOM   4802  OD1 ASP B 499      89.484  43.935  49.981  1.00 58.87           O  
+ATOM   4803  OD2 ASP B 499      89.072  42.388  48.487  1.00 60.25           O  
+ATOM   4804  N   TYR B 500      86.203  47.106  47.616  1.00 51.40           N  
+ATOM   4805  CA  TYR B 500      85.542  47.886  46.588  1.00 51.59           C  
+ATOM   4806  C   TYR B 500      86.115  49.299  46.635  1.00 49.07           C  
+ATOM   4807  O   TYR B 500      86.291  49.947  45.611  1.00 52.55           O  
+ATOM   4808  CB  TYR B 500      84.033  47.963  46.850  1.00 53.59           C  
+ATOM   4809  CG  TYR B 500      83.310  46.638  46.867  1.00 54.20           C  
+ATOM   4810  CD1 TYR B 500      83.570  45.691  47.855  1.00 54.00           C  
+ATOM   4811  CD2 TYR B 500      82.354  46.337  45.896  1.00 53.99           C  
+ATOM   4812  CE1 TYR B 500      82.896  44.477  47.877  1.00 53.45           C  
+ATOM   4813  CE2 TYR B 500      81.674  45.131  45.910  1.00 53.33           C  
+ATOM   4814  CZ  TYR B 500      81.951  44.204  46.901  1.00 53.46           C  
+ATOM   4815  OH  TYR B 500      81.288  43.000  46.910  1.00 54.64           O  
+ATOM   4816  N   LEU B 501      86.418  49.765  47.839  1.00 41.44           N  
+ATOM   4817  CA  LEU B 501      86.922  51.113  48.024  1.00 36.83           C  
+ATOM   4818  C   LEU B 501      88.330  51.418  47.545  1.00 40.39           C  
+ATOM   4819  O   LEU B 501      88.506  52.299  46.710  1.00 33.96           O  
+ATOM   4820  CB  LEU B 501      86.785  51.522  49.489  1.00 28.32           C  
+ATOM   4821  CG  LEU B 501      85.355  51.721  49.984  1.00 21.97           C  
+ATOM   4822  CD1 LEU B 501      85.384  52.019  51.467  1.00 20.79           C  
+ATOM   4823  CD2 LEU B 501      84.686  52.856  49.229  1.00 19.33           C  
+ATOM   4824  N   ASP B 502      89.334  50.711  48.055  1.00 42.25           N  
+ATOM   4825  CA  ASP B 502      90.706  51.007  47.634  1.00 43.10           C  
+ATOM   4826  C   ASP B 502      91.096  50.429  46.289  1.00 39.26           C  
+ATOM   4827  O   ASP B 502      92.149  50.755  45.738  1.00 32.66           O  
+ATOM   4828  CB  ASP B 502      91.727  50.612  48.714  1.00 58.00           C  
+ATOM   4829  CG  ASP B 502      91.299  49.420  49.525  1.00 76.04           C  
+ATOM   4830  OD1 ASP B 502      91.052  48.357  48.923  1.00 87.21           O  
+ATOM   4831  OD2 ASP B 502      91.219  49.548  50.768  1.00 85.36           O  
+ATOM   4832  N   GLY B 503      90.220  49.586  45.765  1.00 35.81           N  
+ATOM   4833  CA  GLY B 503      90.419  48.993  44.459  1.00 32.50           C  
+ATOM   4834  C   GLY B 503      91.773  48.453  44.060  1.00 31.96           C  
+ATOM   4835  O   GLY B 503      92.281  48.807  42.993  1.00 29.22           O  
+ATOM   4836  N   SER B 504      92.352  47.588  44.896  1.00 34.73           N  
+ATOM   4837  CA  SER B 504      93.643  46.974  44.589  1.00 35.94           C  
+ATOM   4838  C   SER B 504      93.405  45.872  43.573  1.00 36.94           C  
+ATOM   4839  O   SER B 504      94.191  45.686  42.650  1.00 38.91           O  
+ATOM   4840  CB  SER B 504      94.274  46.366  45.839  1.00 36.35           C  
+ATOM   4841  OG  SER B 504      94.745  47.366  46.723  1.00 37.14           O  
+ATOM   4842  N   VAL B 505      92.308  45.145  43.751  1.00 38.67           N  
+ATOM   4843  CA  VAL B 505      91.955  44.057  42.848  1.00 39.92           C  
+ATOM   4844  C   VAL B 505      90.508  44.225  42.385  1.00 39.99           C  
+ATOM   4845  O   VAL B 505      89.773  45.047  42.936  1.00 41.32           O  
+ATOM   4846  CB  VAL B 505      92.125  42.673  43.540  1.00 39.41           C  
+ATOM   4847  CG1 VAL B 505      91.978  41.548  42.508  1.00 38.17           C  
+ATOM   4848  CG2 VAL B 505      93.494  42.582  44.208  1.00 36.74           C  
+ATOM   4849  N   LYS B 506      90.107  43.457  41.369  1.00 40.90           N  
+ATOM   4850  CA  LYS B 506      88.743  43.529  40.838  1.00 41.58           C  
+ATOM   4851  C   LYS B 506      87.656  43.030  41.799  1.00 41.04           C  
+ATOM   4852  O   LYS B 506      87.934  42.430  42.838  1.00 43.09           O  
+ATOM   4853  CB  LYS B 506      88.623  42.742  39.539  1.00 39.44           C  
+ATOM   4854  CG  LYS B 506      89.467  43.246  38.384  1.00 36.22           C  
+ATOM   4855  CD  LYS B 506      88.660  43.157  37.084  1.00 34.18           C  
+ATOM   4856  CE  LYS B 506      89.543  43.113  35.850  1.00 32.63           C  
+ATOM   4857  NZ  LYS B 506      90.077  41.747  35.649  1.00 35.22           N  
+ATOM   4858  N   VAL B 507      86.408  43.273  41.418  1.00 41.71           N  
+ATOM   4859  CA  VAL B 507      85.258  42.893  42.223  1.00 43.67           C  
+ATOM   4860  C   VAL B 507      84.055  42.491  41.331  1.00 48.45           C  
+ATOM   4861  O   VAL B 507      83.954  42.896  40.165  1.00 44.17           O  
+ATOM   4862  CB  VAL B 507      84.916  44.073  43.173  1.00 38.61           C  
+ATOM   4863  CG1 VAL B 507      83.492  44.020  43.609  1.00 37.67           C  
+ATOM   4864  CG2 VAL B 507      85.805  44.021  44.389  1.00 34.88           C  
+ATOM   4865  N   ASN B 508      83.155  41.672  41.873  1.00 54.86           N  
+ATOM   4866  CA  ASN B 508      81.984  41.222  41.114  1.00 57.53           C  
+ATOM   4867  C   ASN B 508      80.697  41.945  41.524  1.00 56.62           C  
+ATOM   4868  O   ASN B 508      80.258  41.843  42.666  1.00 47.40           O  
+ATOM   4869  CB  ASN B 508      81.815  39.707  41.270  1.00 70.65           C  
+ATOM   4870  CG  ASN B 508      83.047  38.929  40.812  1.00 89.37           C  
+ATOM   4871  OD1 ASN B 508      82.995  37.711  40.646  1.00 99.61           O  
+ATOM   4872  ND2 ASN B 508      84.158  39.631  40.615  1.00 99.06           N  
+ATOM   4873  N   LEU B 509      80.100  42.660  40.570  1.00 55.71           N  
+ATOM   4874  CA  LEU B 509      78.883  43.448  40.792  1.00 54.87           C  
+ATOM   4875  C   LEU B 509      77.583  42.768  40.331  1.00 59.16           C  
+ATOM   4876  O   LEU B 509      77.522  42.193  39.247  1.00 52.40           O  
+ATOM   4877  CB  LEU B 509      79.034  44.809  40.092  1.00 59.48           C  
+ATOM   4878  CG  LEU B 509      79.910  45.917  40.712  1.00 68.14           C  
+ATOM   4879  CD1 LEU B 509      80.983  45.336  41.618  1.00 72.38           C  
+ATOM   4880  CD2 LEU B 509      80.534  46.751  39.592  1.00 72.66           C  
+ATOM   4881  N   GLU B 510      76.540  42.862  41.155  1.00 71.31           N  
+ATOM   4882  CA  GLU B 510      75.240  42.242  40.858  1.00 75.95           C  
+ATOM   4883  C   GLU B 510      74.146  43.177  40.339  1.00 75.52           C  
+ATOM   4884  O   GLU B 510      73.752  44.126  41.014  1.00 77.97           O  
+ATOM   4885  CB  GLU B 510      74.684  41.540  42.103  1.00 82.26           C  
+ATOM   4886  CG  GLU B 510      75.286  40.189  42.427  1.00 98.76           C  
+ATOM   4887  CD  GLU B 510      74.412  39.394  43.390  1.00106.36           C  
+ATOM   4888  OE1 GLU B 510      74.139  39.896  44.502  1.00108.51           O  
+ATOM   4889  OE2 GLU B 510      73.993  38.270  43.032  1.00109.66           O  
+ATOM   4890  N   LYS B 511      73.631  42.869  39.153  1.00 82.43           N  
+ATOM   4891  CA  LYS B 511      72.565  43.652  38.534  1.00 90.15           C  
+ATOM   4892  C   LYS B 511      71.707  42.671  37.722  1.00 95.24           C  
+ATOM   4893  O   LYS B 511      72.178  41.586  37.375  1.00104.88           O  
+ATOM   4894  CB  LYS B 511      73.174  44.723  37.624  1.00 89.47           C  
+ATOM   4895  CG  LYS B 511      72.188  45.741  37.086  1.00 80.69           C  
+ATOM   4896  CD  LYS B 511      72.816  46.578  35.974  1.00 74.66           C  
+ATOM   4897  CE  LYS B 511      71.763  47.407  35.260  1.00 72.51           C  
+ATOM   4898  NZ  LYS B 511      72.267  47.961  33.980  1.00 71.63           N  
+ATOM   4899  N   LYS B 512      70.460  43.033  37.419  1.00104.09           N  
+ATOM   4900  CA  LYS B 512      69.577  42.140  36.662  1.00107.50           C  
+ATOM   4901  C   LYS B 512      69.266  40.901  37.496  1.00112.77           C  
+ATOM   4902  O   LYS B 512      68.702  39.925  36.994  1.00109.18           O  
+ATOM   4903  CB  LYS B 512      70.239  41.705  35.346  1.00102.99           C  
+ATOM   4904  CG  LYS B 512      69.734  42.424  34.104  1.00 98.78           C  
+ATOM   4905  CD  LYS B 512      68.296  42.036  33.786  1.00 96.92           C  
+ATOM   4906  CE  LYS B 512      67.801  42.740  32.531  1.00 96.42           C  
+ATOM   4907  NZ  LYS B 512      66.380  42.422  32.240  1.00 96.32           N  
+ATOM   4908  N   HIS B 513      69.651  40.959  38.769  1.00122.75           N  
+ATOM   4909  CA  HIS B 513      69.449  39.873  39.726  1.00130.20           C  
+ATOM   4910  C   HIS B 513      70.374  38.690  39.444  1.00127.83           C  
+ATOM   4911  O   HIS B 513      69.954  37.532  39.502  1.00133.51           O  
+ATOM   4912  CB  HIS B 513      67.988  39.407  39.714  1.00141.01           C  
+ATOM   4913  CG  HIS B 513      67.591  38.642  40.940  1.00153.93           C  
+ATOM   4914  ND1 HIS B 513      68.193  37.461  41.312  1.00158.69           N  
+ATOM   4915  CD2 HIS B 513      66.663  38.907  41.893  1.00158.71           C  
+ATOM   4916  CE1 HIS B 513      67.657  37.028  42.439  1.00160.58           C  
+ATOM   4917  NE2 HIS B 513      66.726  37.889  42.813  1.00160.70           N  
+ATOM   4918  N   LEU B 514      71.635  38.994  39.147  1.00125.51           N  
+ATOM   4919  CA  LEU B 514      72.646  37.978  38.850  1.00123.61           C  
+ATOM   4920  C   LEU B 514      74.042  38.609  38.935  1.00121.42           C  
+ATOM   4921  O   LEU B 514      74.190  39.732  39.426  1.00129.84           O  
+ATOM   4922  CB  LEU B 514      72.421  37.403  37.443  1.00114.80           C  
+ATOM   4923  CG  LEU B 514      71.203  36.501  37.205  1.00100.99           C  
+ATOM   4924  CD1 LEU B 514      70.921  36.382  35.711  1.00 92.56           C  
+ATOM   4925  CD2 LEU B 514      71.449  35.132  37.837  1.00 92.50           C  
+ATOM   4926  N   ASN B 515      75.059  37.889  38.461  1.00114.82           N  
+ATOM   4927  CA  ASN B 515      76.433  38.401  38.482  1.00110.58           C  
+ATOM   4928  C   ASN B 515      76.914  38.879  37.112  1.00106.87           C  
+ATOM   4929  O   ASN B 515      77.419  38.095  36.309  1.00104.06           O  
+ATOM   4930  CB  ASN B 515      77.406  37.338  39.014  1.00107.23           C  
+ATOM   4931  CG  ASN B 515      77.504  37.334  40.536  1.00 99.67           C  
+ATOM   4932  OD1 ASN B 515      76.576  36.917  41.230  1.00 95.55           O  
+ATOM   4933  ND2 ASN B 515      78.633  37.807  41.058  1.00 94.60           N  
+ATOM   4934  N   LYS B 516      76.748  40.173  36.855  1.00 93.76           N  
+ATOM   4935  CA  LYS B 516      77.176  40.767  35.595  1.00 83.07           C  
+ATOM   4936  C   LYS B 516      78.666  41.051  35.727  1.00 80.31           C  
+ATOM   4937  O   LYS B 516      79.439  40.211  36.193  1.00 70.49           O  
+ATOM   4938  CB  LYS B 516      76.457  42.097  35.331  1.00 78.96           C  
+ATOM   4939  CG  LYS B 516      75.028  42.189  35.835  1.00 77.75           C  
+ATOM   4940  CD  LYS B 516      74.083  41.323  35.028  1.00 78.92           C  
+ATOM   4941  CE  LYS B 516      74.003  41.774  33.581  1.00 78.76           C  
+ATOM   4942  NZ  LYS B 516      72.988  40.972  32.845  1.00 79.11           N  
+ATOM   4943  N   ARG B 517      79.038  42.267  35.346  1.00 73.19           N  
+ATOM   4944  CA  ARG B 517      80.412  42.741  35.375  1.00 70.93           C  
+ATOM   4945  C   ARG B 517      81.301  42.469  36.592  1.00 71.67           C  
+ATOM   4946  O   ARG B 517      80.860  42.494  37.749  1.00 64.37           O  
+ATOM   4947  CB  ARG B 517      80.439  44.247  35.091  1.00 75.07           C  
+ATOM   4948  CG  ARG B 517      80.790  44.597  33.659  1.00 85.90           C  
+ATOM   4949  CD  ARG B 517      81.931  45.604  33.615  1.00 91.17           C  
+ATOM   4950  NE  ARG B 517      82.559  45.666  32.296  1.00 93.46           N  
+ATOM   4951  CZ  ARG B 517      83.551  46.490  31.974  1.00 93.61           C  
+ATOM   4952  NH1 ARG B 517      84.039  47.334  32.875  1.00 93.21           N  
+ATOM   4953  NH2 ARG B 517      84.053  46.471  30.747  1.00 93.07           N  
+ATOM   4954  N   THR B 518      82.572  42.221  36.274  1.00 71.23           N  
+ATOM   4955  CA  THR B 518      83.656  41.975  37.222  1.00 67.21           C  
+ATOM   4956  C   THR B 518      84.582  43.135  36.876  1.00 64.40           C  
+ATOM   4957  O   THR B 518      85.112  43.184  35.771  1.00 61.53           O  
+ATOM   4958  CB  THR B 518      84.409  40.672  36.901  1.00 72.54           C  
+ATOM   4959  OG1 THR B 518      83.475  39.602  36.714  1.00 82.37           O  
+ATOM   4960  CG2 THR B 518      85.374  40.328  38.027  1.00 82.39           C  
+ATOM   4961  N   GLN B 519      84.778  44.071  37.795  1.00 58.29           N  
+ATOM   4962  CA  GLN B 519      85.613  45.232  37.489  1.00 54.00           C  
+ATOM   4963  C   GLN B 519      86.198  45.877  38.730  1.00 50.82           C  
+ATOM   4964  O   GLN B 519      85.890  45.495  39.856  1.00 51.13           O  
+ATOM   4965  CB  GLN B 519      84.766  46.296  36.777  1.00 55.88           C  
+ATOM   4966  CG  GLN B 519      83.695  46.895  37.706  1.00 57.00           C  
+ATOM   4967  CD  GLN B 519      82.912  48.040  37.089  1.00 57.44           C  
+ATOM   4968  OE1 GLN B 519      82.079  47.835  36.206  1.00 56.56           O  
+ATOM   4969  NE2 GLN B 519      83.179  49.259  37.558  1.00 56.62           N  
+ATOM   4970  N   ILE B 520      87.054  46.865  38.513  1.00 42.67           N  
+ATOM   4971  CA  ILE B 520      87.598  47.599  39.632  1.00 34.90           C  
+ATOM   4972  C   ILE B 520      86.409  48.478  40.036  1.00 33.07           C  
+ATOM   4973  O   ILE B 520      85.796  49.124  39.184  1.00 28.62           O  
+ATOM   4974  CB  ILE B 520      88.758  48.513  39.207  1.00 35.11           C  
+ATOM   4975  CG1 ILE B 520      89.901  47.689  38.601  1.00 32.53           C  
+ATOM   4976  CG2 ILE B 520      89.244  49.319  40.421  1.00 32.71           C  
+ATOM   4977  CD1 ILE B 520      90.838  47.089  39.631  1.00 31.26           C  
+ATOM   4978  N   PHE B 521      86.052  48.483  41.315  1.00 27.60           N  
+ATOM   4979  CA  PHE B 521      84.931  49.311  41.754  1.00 26.96           C  
+ATOM   4980  C   PHE B 521      85.292  50.784  41.518  1.00 29.17           C  
+ATOM   4981  O   PHE B 521      86.440  51.187  41.698  1.00 26.49           O  
+ATOM   4982  CB  PHE B 521      84.641  49.077  43.231  1.00 22.67           C  
+ATOM   4983  CG  PHE B 521      83.277  49.505  43.637  1.00 22.37           C  
+ATOM   4984  CD1 PHE B 521      82.161  48.832  43.151  1.00 22.27           C  
+ATOM   4985  CD2 PHE B 521      83.096  50.573  44.512  1.00 23.26           C  
+ATOM   4986  CE1 PHE B 521      80.879  49.215  43.534  1.00 22.78           C  
+ATOM   4987  CE2 PHE B 521      81.811  50.970  44.905  1.00 22.74           C  
+ATOM   4988  CZ  PHE B 521      80.702  50.288  44.415  1.00 23.77           C  
+ATOM   4989  N   PRO B 522      84.312  51.608  41.118  1.00 28.76           N  
+ATOM   4990  CA  PRO B 522      84.634  53.021  40.876  1.00 27.89           C  
+ATOM   4991  C   PRO B 522      85.091  53.823  42.099  1.00 25.12           C  
+ATOM   4992  O   PRO B 522      84.781  53.460  43.229  1.00 23.86           O  
+ATOM   4993  CB  PRO B 522      83.335  53.574  40.269  1.00 31.25           C  
+ATOM   4994  CG  PRO B 522      82.737  52.373  39.584  1.00 31.91           C  
+ATOM   4995  CD  PRO B 522      82.957  51.292  40.637  1.00 30.13           C  
+ATOM   4996  N   PRO B 523      85.854  54.914  41.868  1.00 25.34           N  
+ATOM   4997  CA  PRO B 523      86.396  55.838  42.867  1.00 22.77           C  
+ATOM   4998  C   PRO B 523      85.244  56.787  43.190  1.00 21.78           C  
+ATOM   4999  O   PRO B 523      84.205  56.742  42.531  1.00 27.07           O  
+ATOM   5000  CB  PRO B 523      87.490  56.585  42.104  1.00 20.38           C  
+ATOM   5001  CG  PRO B 523      87.648  55.837  40.813  1.00 19.05           C  
+ATOM   5002  CD  PRO B 523      86.283  55.336  40.530  1.00 20.82           C  
+ATOM   5003  N   GLY B 524      85.406  57.653  44.178  1.00 21.40           N  
+ATOM   5004  CA  GLY B 524      84.319  58.563  44.464  1.00 22.26           C  
+ATOM   5005  C   GLY B 524      84.332  59.282  45.785  1.00 23.31           C  
+ATOM   5006  O   GLY B 524      85.385  59.516  46.372  1.00 23.22           O  
+ATOM   5007  N   ILE B 525      83.141  59.635  46.254  1.00 23.81           N  
+ATOM   5008  CA  ILE B 525      83.006  60.357  47.506  1.00 24.35           C  
+ATOM   5009  C   ILE B 525      82.097  59.600  48.485  1.00 24.14           C  
+ATOM   5010  O   ILE B 525      81.291  58.738  48.110  1.00 23.44           O  
+ATOM   5011  CB  ILE B 525      82.350  61.747  47.276  1.00 24.66           C  
+ATOM   5012  CG1 ILE B 525      82.919  62.405  46.025  1.00 24.73           C  
+ATOM   5013  CG2 ILE B 525      82.551  62.646  48.499  1.00 23.87           C  
+ATOM   5014  CD1 ILE B 525      82.054  63.587  45.515  1.00 23.92           C  
+ATOM   5015  N   VAL B 526      82.242  59.933  49.754  1.00 24.02           N  
+ATOM   5016  CA  VAL B 526      81.395  59.369  50.774  1.00 25.08           C  
+ATOM   5017  C   VAL B 526      80.932  60.598  51.526  1.00 29.69           C  
+ATOM   5018  O   VAL B 526      81.744  61.326  52.097  1.00 26.11           O  
+ATOM   5019  CB  VAL B 526      82.156  58.422  51.718  1.00 21.33           C  
+ATOM   5020  CG1 VAL B 526      81.392  58.252  53.018  1.00 17.28           C  
+ATOM   5021  CG2 VAL B 526      82.305  57.069  51.068  1.00 18.53           C  
+ATOM   5022  N   THR B 527      79.629  60.858  51.454  1.00 35.18           N  
+ATOM   5023  CA  THR B 527      79.024  61.992  52.145  1.00 36.85           C  
+ATOM   5024  C   THR B 527      78.553  61.441  53.496  1.00 34.89           C  
+ATOM   5025  O   THR B 527      77.903  60.402  53.563  1.00 32.03           O  
+ATOM   5026  CB  THR B 527      77.854  62.557  51.330  1.00 44.77           C  
+ATOM   5027  OG1 THR B 527      77.167  63.551  52.094  1.00 58.56           O  
+ATOM   5028  CG2 THR B 527      76.921  61.478  50.967  1.00 57.44           C  
+ATOM   5029  N   MET B 528      78.886  62.133  54.573  1.00 32.94           N  
+ATOM   5030  CA  MET B 528      78.547  61.633  55.891  1.00 31.02           C  
+ATOM   5031  C   MET B 528      78.064  62.736  56.801  1.00 33.51           C  
+ATOM   5032  O   MET B 528      78.397  63.903  56.595  1.00 34.33           O  
+ATOM   5033  CB  MET B 528      79.791  60.970  56.465  1.00 27.78           C  
+ATOM   5034  CG  MET B 528      79.594  60.172  57.717  1.00 24.05           C  
+ATOM   5035  SD  MET B 528      81.178  59.620  58.243  1.00 15.70           S  
+ATOM   5036  CE  MET B 528      81.403  58.327  57.168  1.00 19.12           C  
+ATOM   5037  N   ASN B 529      77.318  62.361  57.837  1.00 40.76           N  
+ATOM   5038  CA  ASN B 529      76.739  63.342  58.750  1.00 46.59           C  
+ATOM   5039  C   ASN B 529      77.375  63.607  60.117  1.00 49.12           C  
+ATOM   5040  O   ASN B 529      76.793  64.331  60.922  1.00 50.16           O  
+ATOM   5041  CB  ASN B 529      75.260  63.020  58.955  1.00 50.36           C  
+ATOM   5042  CG  ASN B 529      74.403  64.264  59.027  1.00 54.97           C  
+ATOM   5043  OD1 ASN B 529      74.661  65.166  59.831  1.00 56.38           O  
+ATOM   5044  ND2 ASN B 529      73.373  64.324  58.182  1.00 56.71           N  
+ATOM   5045  N   GLU B 530      78.549  63.043  60.379  1.00 55.63           N  
+ATOM   5046  CA  GLU B 530      79.264  63.246  61.649  1.00 59.39           C  
+ATOM   5047  C   GLU B 530      79.108  62.165  62.703  1.00 60.38           C  
+ATOM   5048  O   GLU B 530      78.735  62.443  63.845  1.00 64.07           O  
+ATOM   5049  CB  GLU B 530      78.915  64.590  62.300  1.00 58.24           C  
+ATOM   5050  CG  GLU B 530      79.654  65.769  61.724  1.00 58.91           C  
+ATOM   5051  CD  GLU B 530      79.680  66.941  62.680  1.00 59.79           C  
+ATOM   5052  OE1 GLU B 530      78.590  67.454  63.018  1.00 59.81           O  
+ATOM   5053  OE2 GLU B 530      80.790  67.345  63.098  1.00 60.50           O  
+ATOM   5054  N   TYR B 531      79.414  60.933  62.314  1.00 64.49           N  
+ATOM   5055  CA  TYR B 531      79.349  59.796  63.218  1.00 67.51           C  
+ATOM   5056  C   TYR B 531      80.783  59.475  63.625  1.00 68.81           C  
+ATOM   5057  O   TYR B 531      81.684  60.298  63.456  1.00 72.21           O  
+ATOM   5058  CB  TYR B 531      78.740  58.589  62.505  1.00 67.47           C  
+ATOM   5059  CG  TYR B 531      77.312  58.783  62.053  1.00 63.74           C  
+ATOM   5060  CD1 TYR B 531      76.998  59.676  61.039  1.00 61.45           C  
+ATOM   5061  CD2 TYR B 531      76.277  58.056  62.634  1.00 62.54           C  
+ATOM   5062  CE1 TYR B 531      75.682  59.839  60.609  1.00 61.78           C  
+ATOM   5063  CE2 TYR B 531      74.961  58.212  62.216  1.00 61.73           C  
+ATOM   5064  CZ  TYR B 531      74.665  59.103  61.202  1.00 61.32           C  
+ATOM   5065  OH  TYR B 531      73.357  59.248  60.779  1.00 61.16           O  
+ATOM   5066  N   SER B 532      80.988  58.285  64.176  1.00 68.73           N  
+ATOM   5067  CA  SER B 532      82.323  57.848  64.562  1.00 65.58           C  
+ATOM   5068  C   SER B 532      82.750  56.908  63.457  1.00 61.68           C  
+ATOM   5069  O   SER B 532      82.059  55.929  63.163  1.00 61.98           O  
+ATOM   5070  CB  SER B 532      82.299  57.100  65.897  1.00 64.61           C  
+ATOM   5071  OG  SER B 532      82.015  57.983  66.969  1.00 65.04           O  
+ATOM   5072  N   VAL B 533      83.877  57.210  62.829  1.00 54.21           N  
+ATOM   5073  CA  VAL B 533      84.351  56.375  61.744  1.00 52.41           C  
+ATOM   5074  C   VAL B 533      85.524  55.492  62.165  1.00 50.55           C  
+ATOM   5075  O   VAL B 533      86.591  55.985  62.537  1.00 52.89           O  
+ATOM   5076  CB  VAL B 533      84.747  57.242  60.525  1.00 50.60           C  
+ATOM   5077  CG1 VAL B 533      85.333  56.359  59.421  1.00 45.37           C  
+ATOM   5078  CG2 VAL B 533      83.527  57.990  60.009  1.00 44.45           C  
+ATOM   5079  N   PRO B 534      85.330  54.165  62.119  1.00 41.78           N  
+ATOM   5080  CA  PRO B 534      86.344  53.172  62.483  1.00 43.63           C  
+ATOM   5081  C   PRO B 534      87.662  53.473  61.780  1.00 44.32           C  
+ATOM   5082  O   PRO B 534      87.671  53.833  60.602  1.00 40.60           O  
+ATOM   5083  CB  PRO B 534      85.728  51.861  62.005  1.00 41.09           C  
+ATOM   5084  CG  PRO B 534      84.286  52.087  62.193  1.00 40.63           C  
+ATOM   5085  CD  PRO B 534      84.086  53.505  61.688  1.00 45.14           C  
+ATOM   5086  N   LYS B 535      88.768  53.326  62.504  1.00 43.32           N  
+ATOM   5087  CA  LYS B 535      90.084  53.592  61.937  1.00 42.84           C  
+ATOM   5088  C   LYS B 535      90.273  52.797  60.640  1.00 41.84           C  
+ATOM   5089  O   LYS B 535      90.882  53.277  59.675  1.00 38.25           O  
+ATOM   5090  CB  LYS B 535      91.193  53.211  62.921  1.00 46.54           C  
+ATOM   5091  CG  LYS B 535      92.521  53.824  62.528  1.00 55.47           C  
+ATOM   5092  CD  LYS B 535      93.714  53.109  63.118  1.00 59.84           C  
+ATOM   5093  CE  LYS B 535      94.986  53.672  62.494  1.00 61.40           C  
+ATOM   5094  NZ  LYS B 535      96.181  52.840  62.777  1.00 63.11           N  
+ATOM   5095  N   THR B 536      89.741  51.582  60.618  1.00 39.34           N  
+ATOM   5096  CA  THR B 536      89.861  50.753  59.437  1.00 38.15           C  
+ATOM   5097  C   THR B 536      89.117  51.391  58.255  1.00 37.18           C  
+ATOM   5098  O   THR B 536      89.494  51.205  57.096  1.00 37.79           O  
+ATOM   5099  CB  THR B 536      89.324  49.328  59.715  1.00 40.52           C  
+ATOM   5100  OG1 THR B 536      88.099  49.409  60.456  1.00 45.16           O  
+ATOM   5101  CG2 THR B 536      90.334  48.527  60.515  1.00 42.30           C  
+ATOM   5102  N   LEU B 537      88.071  52.155  58.546  1.00 35.98           N  
+ATOM   5103  CA  LEU B 537      87.314  52.810  57.485  1.00 34.50           C  
+ATOM   5104  C   LEU B 537      87.987  54.128  57.115  1.00 33.99           C  
+ATOM   5105  O   LEU B 537      88.121  54.472  55.939  1.00 34.34           O  
+ATOM   5106  CB  LEU B 537      85.881  53.084  57.948  1.00 33.87           C  
+ATOM   5107  CG  LEU B 537      84.917  53.635  56.898  1.00 32.31           C  
+ATOM   5108  CD1 LEU B 537      84.872  52.691  55.695  1.00 31.47           C  
+ATOM   5109  CD2 LEU B 537      83.529  53.793  57.511  1.00 31.93           C  
+ATOM   5110  N   GLN B 538      88.418  54.858  58.136  1.00 32.26           N  
+ATOM   5111  CA  GLN B 538      89.069  56.144  57.945  1.00 32.32           C  
+ATOM   5112  C   GLN B 538      90.267  56.028  57.020  1.00 32.28           C  
+ATOM   5113  O   GLN B 538      90.510  56.903  56.192  1.00 33.63           O  
+ATOM   5114  CB  GLN B 538      89.530  56.692  59.290  1.00 33.05           C  
+ATOM   5115  CG  GLN B 538      90.060  58.104  59.233  1.00 30.86           C  
+ATOM   5116  CD  GLN B 538      88.969  59.117  58.995  1.00 31.61           C  
+ATOM   5117  OE1 GLN B 538      87.961  59.127  59.700  1.00 31.47           O  
+ATOM   5118  NE2 GLN B 538      89.164  59.986  58.006  1.00 30.90           N  
+ATOM   5119  N   ALA B 539      91.013  54.937  57.174  1.00 31.18           N  
+ATOM   5120  CA  ALA B 539      92.210  54.667  56.374  1.00 29.27           C  
+ATOM   5121  C   ALA B 539      91.867  54.468  54.905  1.00 30.15           C  
+ATOM   5122  O   ALA B 539      92.739  54.399  54.044  1.00 28.56           O  
+ATOM   5123  CB  ALA B 539      92.918  53.425  56.918  1.00 25.48           C  
+ATOM   5124  N   ARG B 540      90.577  54.379  54.632  1.00 33.32           N  
+ATOM   5125  CA  ARG B 540      90.106  54.179  53.283  1.00 36.18           C  
+ATOM   5126  C   ARG B 540      90.018  55.472  52.486  1.00 36.77           C  
+ATOM   5127  O   ARG B 540      89.957  55.435  51.258  1.00 37.56           O  
+ATOM   5128  CB  ARG B 540      88.749  53.488  53.329  1.00 38.71           C  
+ATOM   5129  CG  ARG B 540      88.849  52.085  53.885  1.00 44.47           C  
+ATOM   5130  CD  ARG B 540      89.539  51.167  52.888  1.00 47.50           C  
+ATOM   5131  NE  ARG B 540      90.207  50.030  53.518  1.00 49.43           N  
+ATOM   5132  CZ  ARG B 540      91.434  50.062  54.032  1.00 48.57           C  
+ATOM   5133  NH1 ARG B 540      92.150  51.177  53.996  1.00 46.65           N  
+ATOM   5134  NH2 ARG B 540      91.945  48.970  54.582  1.00 48.87           N  
+ATOM   5135  N   PHE B 541      90.039  56.613  53.168  1.00 35.50           N  
+ATOM   5136  CA  PHE B 541      89.924  57.891  52.470  1.00 35.11           C  
+ATOM   5137  C   PHE B 541      91.221  58.665  52.398  1.00 34.09           C  
+ATOM   5138  O   PHE B 541      91.826  58.958  53.422  1.00 34.77           O  
+ATOM   5139  CB  PHE B 541      88.864  58.761  53.140  1.00 35.63           C  
+ATOM   5140  CG  PHE B 541      87.568  58.040  53.391  1.00 36.31           C  
+ATOM   5141  CD1 PHE B 541      87.249  57.588  54.664  1.00 34.86           C  
+ATOM   5142  CD2 PHE B 541      86.701  57.761  52.340  1.00 35.27           C  
+ATOM   5143  CE1 PHE B 541      86.091  56.868  54.885  1.00 34.78           C  
+ATOM   5144  CE2 PHE B 541      85.546  57.043  52.546  1.00 34.36           C  
+ATOM   5145  CZ  PHE B 541      85.237  56.592  53.822  1.00 36.27           C  
+ATOM   5146  N   VAL B 542      91.628  59.013  51.181  1.00 30.39           N  
+ATOM   5147  CA  VAL B 542      92.854  59.754  50.960  1.00 28.60           C  
+ATOM   5148  C   VAL B 542      92.746  61.241  51.318  1.00 29.50           C  
+ATOM   5149  O   VAL B 542      93.755  61.923  51.515  1.00 27.64           O  
+ATOM   5150  CB  VAL B 542      93.281  59.649  49.510  1.00 27.70           C  
+ATOM   5151  CG1 VAL B 542      92.278  60.399  48.635  1.00 27.33           C  
+ATOM   5152  CG2 VAL B 542      94.708  60.192  49.351  1.00 26.49           C  
+ATOM   5153  N   LYS B 543      91.521  61.744  51.384  1.00 27.31           N  
+ATOM   5154  CA  LYS B 543      91.286  63.139  51.730  1.00 25.57           C  
+ATOM   5155  C   LYS B 543      89.950  63.245  52.464  1.00 25.33           C  
+ATOM   5156  O   LYS B 543      89.035  62.471  52.200  1.00 22.37           O  
+ATOM   5157  CB  LYS B 543      91.259  64.002  50.464  1.00 27.69           C  
+ATOM   5158  CG  LYS B 543      91.029  65.476  50.733  1.00 34.80           C  
+ATOM   5159  CD  LYS B 543      90.902  66.279  49.441  1.00 38.58           C  
+ATOM   5160  CE  LYS B 543      90.855  67.790  49.709  1.00 40.40           C  
+ATOM   5161  NZ  LYS B 543      92.128  68.308  50.301  1.00 41.48           N  
+ATOM   5162  N   GLN B 544      89.850  64.179  53.403  1.00 25.10           N  
+ATOM   5163  CA  GLN B 544      88.606  64.380  54.140  1.00 23.94           C  
+ATOM   5164  C   GLN B 544      88.330  65.867  54.257  1.00 25.40           C  
+ATOM   5165  O   GLN B 544      89.189  66.631  54.694  1.00 22.78           O  
+ATOM   5166  CB  GLN B 544      88.673  63.772  55.542  1.00 25.63           C  
+ATOM   5167  CG  GLN B 544      87.452  64.118  56.391  1.00 29.62           C  
+ATOM   5168  CD  GLN B 544      87.459  63.466  57.771  1.00 31.02           C  
+ATOM   5169  OE1 GLN B 544      86.727  63.893  58.672  1.00 30.20           O  
+ATOM   5170  NE2 GLN B 544      88.278  62.426  57.940  1.00 31.34           N  
+ATOM   5171  N   ILE B 545      87.124  66.270  53.862  1.00 29.80           N  
+ATOM   5172  CA  ILE B 545      86.715  67.674  53.906  1.00 29.89           C  
+ATOM   5173  C   ILE B 545      85.609  67.856  54.940  1.00 32.00           C  
+ATOM   5174  O   ILE B 545      84.626  67.122  54.924  1.00 29.60           O  
+ATOM   5175  CB  ILE B 545      86.172  68.149  52.528  1.00 31.30           C  
+ATOM   5176  CG1 ILE B 545      87.212  67.884  51.438  1.00 32.75           C  
+ATOM   5177  CG2 ILE B 545      85.807  69.627  52.590  1.00 32.59           C  
+ATOM   5178  CD1 ILE B 545      86.769  68.287  50.056  1.00 34.28           C  
+ATOM   5179  N   ASP B 546      85.786  68.822  55.840  1.00 39.18           N  
+ATOM   5180  CA  ASP B 546      84.789  69.108  56.859  1.00 42.46           C  
+ATOM   5181  C   ASP B 546      84.006  70.321  56.422  1.00 42.27           C  
+ATOM   5182  O   ASP B 546      84.588  71.366  56.131  1.00 47.75           O  
+ATOM   5183  CB  ASP B 546      85.435  69.407  58.207  1.00 43.52           C  
+ATOM   5184  CG  ASP B 546      86.190  68.229  58.758  1.00 46.19           C  
+ATOM   5185  OD1 ASP B 546      85.612  67.124  58.839  1.00 44.39           O  
+ATOM   5186  OD2 ASP B 546      87.370  68.415  59.117  1.00 49.16           O  
+ATOM   5187  N   PHE B 547      82.690  70.174  56.348  1.00 43.59           N  
+ATOM   5188  CA  PHE B 547      81.841  71.290  55.970  1.00 46.11           C  
+ATOM   5189  C   PHE B 547      81.136  71.751  57.234  1.00 49.70           C  
+ATOM   5190  O   PHE B 547      80.546  70.935  57.946  1.00 50.27           O  
+ATOM   5191  CB  PHE B 547      80.793  70.874  54.933  1.00 40.95           C  
+ATOM   5192  CG  PHE B 547      81.365  70.506  53.597  1.00 33.68           C  
+ATOM   5193  CD1 PHE B 547      82.060  69.320  53.432  1.00 30.47           C  
+ATOM   5194  CD2 PHE B 547      81.221  71.357  52.506  1.00 30.85           C  
+ATOM   5195  CE1 PHE B 547      82.608  68.986  52.196  1.00 30.66           C  
+ATOM   5196  CE2 PHE B 547      81.760  71.036  51.274  1.00 29.43           C  
+ATOM   5197  CZ  PHE B 547      82.457  69.849  51.114  1.00 29.76           C  
+ATOM   5198  N   ARG B 548      81.226  73.048  57.524  1.00 52.34           N  
+ATOM   5199  CA  ARG B 548      80.577  73.634  58.696  1.00 52.60           C  
+ATOM   5200  C   ARG B 548      79.680  74.748  58.177  1.00 51.10           C  
+ATOM   5201  O   ARG B 548      80.120  75.578  57.387  1.00 47.22           O  
+ATOM   5202  CB  ARG B 548      81.625  74.173  59.676  1.00 55.79           C  
+ATOM   5203  CG  ARG B 548      82.181  73.106  60.618  1.00 65.04           C  
+ATOM   5204  CD  ARG B 548      83.385  73.596  61.394  1.00 70.23           C  
+ATOM   5205  NE  ARG B 548      84.646  73.309  60.709  1.00 72.67           N  
+ATOM   5206  CZ  ARG B 548      85.807  73.898  60.997  1.00 73.68           C  
+ATOM   5207  NH1 ARG B 548      85.871  74.817  61.957  1.00 74.03           N  
+ATOM   5208  NH2 ARG B 548      86.910  73.568  60.335  1.00 73.16           N  
+ATOM   5209  N   PRO B 549      78.401  74.765  58.596  1.00 50.55           N  
+ATOM   5210  CA  PRO B 549      77.461  75.795  58.141  1.00 49.15           C  
+ATOM   5211  C   PRO B 549      78.010  77.201  58.322  1.00 51.07           C  
+ATOM   5212  O   PRO B 549      78.617  77.523  59.348  1.00 49.36           O  
+ATOM   5213  CB  PRO B 549      76.222  75.540  59.001  1.00 47.80           C  
+ATOM   5214  CG  PRO B 549      76.280  74.091  59.280  1.00 47.86           C  
+ATOM   5215  CD  PRO B 549      77.756  73.895  59.595  1.00 49.19           C  
+ATOM   5216  N   LYS B 550      77.801  78.038  57.316  1.00 53.39           N  
+ATOM   5217  CA  LYS B 550      78.277  79.411  57.383  1.00 55.81           C  
+ATOM   5218  C   LYS B 550      77.091  80.351  57.190  1.00 56.51           C  
+ATOM   5219  O   LYS B 550      76.328  80.222  56.230  1.00 49.91           O  
+ATOM   5220  CB  LYS B 550      79.346  79.656  56.311  1.00 62.73           C  
+ATOM   5221  CG  LYS B 550      80.576  78.748  56.414  1.00 76.31           C  
+ATOM   5222  CD  LYS B 550      81.472  78.955  55.204  1.00 83.34           C  
+ATOM   5223  CE  LYS B 550      82.633  77.982  55.150  1.00 84.36           C  
+ATOM   5224  NZ  LYS B 550      83.429  78.213  53.906  1.00 84.47           N  
+ATOM   5225  N   ASP B 551      76.946  81.294  58.114  1.00 54.75           N  
+ATOM   5226  CA  ASP B 551      75.852  82.248  58.086  1.00 51.19           C  
+ATOM   5227  C   ASP B 551      75.741  83.088  56.819  1.00 47.04           C  
+ATOM   5228  O   ASP B 551      74.661  83.185  56.224  1.00 40.45           O  
+ATOM   5229  CB  ASP B 551      75.943  83.151  59.311  1.00 62.13           C  
+ATOM   5230  CG  ASP B 551      75.846  82.370  60.597  1.00 78.14           C  
+ATOM   5231  OD1 ASP B 551      74.795  81.735  60.823  1.00 86.26           O  
+ATOM   5232  OD2 ASP B 551      76.825  82.380  61.372  1.00 87.51           O  
+ATOM   5233  N   TYR B 552      76.842  83.697  56.399  1.00 41.33           N  
+ATOM   5234  CA  TYR B 552      76.788  84.515  55.200  1.00 35.84           C  
+ATOM   5235  C   TYR B 552      76.318  83.699  54.005  1.00 32.55           C  
+ATOM   5236  O   TYR B 552      75.519  84.177  53.207  1.00 33.74           O  
+ATOM   5237  CB  TYR B 552      78.151  85.177  54.928  1.00 35.09           C  
+ATOM   5238  CG  TYR B 552      79.346  84.242  54.947  1.00 37.73           C  
+ATOM   5239  CD1 TYR B 552      79.933  83.793  53.757  1.00 36.64           C  
+ATOM   5240  CD2 TYR B 552      79.924  83.842  56.158  1.00 37.97           C  
+ATOM   5241  CE1 TYR B 552      81.066  82.983  53.779  1.00 36.21           C  
+ATOM   5242  CE2 TYR B 552      81.058  83.032  56.186  1.00 35.26           C  
+ATOM   5243  CZ  TYR B 552      81.624  82.612  54.998  1.00 35.39           C  
+ATOM   5244  OH  TYR B 552      82.768  81.853  55.034  1.00 35.21           O  
+ATOM   5245  N   LEU B 553      76.787  82.462  53.892  1.00 29.99           N  
+ATOM   5246  CA  LEU B 553      76.378  81.619  52.777  1.00 30.34           C  
+ATOM   5247  C   LEU B 553      74.876  81.367  52.821  1.00 32.24           C  
+ATOM   5248  O   LEU B 553      74.211  81.329  51.787  1.00 32.95           O  
+ATOM   5249  CB  LEU B 553      77.125  80.283  52.806  1.00 26.05           C  
+ATOM   5250  CG  LEU B 553      78.627  80.302  52.514  1.00 21.61           C  
+ATOM   5251  CD1 LEU B 553      79.167  78.866  52.451  1.00 18.01           C  
+ATOM   5252  CD2 LEU B 553      78.872  81.016  51.207  1.00 19.21           C  
+ATOM   5253  N   LYS B 554      74.350  81.187  54.024  1.00 32.80           N  
+ATOM   5254  CA  LYS B 554      72.933  80.937  54.202  1.00 34.14           C  
+ATOM   5255  C   LYS B 554      72.129  82.202  53.865  1.00 35.04           C  
+ATOM   5256  O   LYS B 554      71.263  82.188  52.971  1.00 30.04           O  
+ATOM   5257  CB  LYS B 554      72.679  80.521  55.645  1.00 38.40           C  
+ATOM   5258  CG  LYS B 554      71.237  80.266  55.992  1.00 46.99           C  
+ATOM   5259  CD  LYS B 554      71.100  80.174  57.493  1.00 51.44           C  
+ATOM   5260  CE  LYS B 554      69.655  80.017  57.902  1.00 54.33           C  
+ATOM   5261  NZ  LYS B 554      69.509  80.097  59.384  1.00 55.41           N  
+ATOM   5262  N   HIS B 555      72.410  83.299  54.565  1.00 35.90           N  
+ATOM   5263  CA  HIS B 555      71.687  84.542  54.299  1.00 36.37           C  
+ATOM   5264  C   HIS B 555      71.730  84.828  52.811  1.00 35.55           C  
+ATOM   5265  O   HIS B 555      70.704  85.085  52.181  1.00 34.65           O  
+ATOM   5266  CB  HIS B 555      72.317  85.721  55.036  1.00 41.13           C  
+ATOM   5267  CG  HIS B 555      72.494  85.495  56.505  1.00 48.83           C  
+ATOM   5268  ND1 HIS B 555      71.498  84.969  57.301  1.00 50.74           N  
+ATOM   5269  CD2 HIS B 555      73.547  85.730  57.321  1.00 51.91           C  
+ATOM   5270  CE1 HIS B 555      71.935  84.889  58.545  1.00 53.22           C  
+ATOM   5271  NE2 HIS B 555      73.174  85.344  58.586  1.00 52.57           N  
+ATOM   5272  N   CYS B 556      72.939  84.770  52.264  1.00 35.92           N  
+ATOM   5273  CA  CYS B 556      73.174  85.012  50.849  1.00 34.28           C  
+ATOM   5274  C   CYS B 556      72.158  84.310  49.957  1.00 33.23           C  
+ATOM   5275  O   CYS B 556      71.621  84.909  49.028  1.00 33.41           O  
+ATOM   5276  CB  CYS B 556      74.580  84.559  50.472  1.00 32.10           C  
+ATOM   5277  SG  CYS B 556      74.988  85.019  48.804  1.00 33.74           S  
+ATOM   5278  N   LEU B 557      71.898  83.037  50.235  1.00 34.45           N  
+ATOM   5279  CA  LEU B 557      70.937  82.287  49.438  1.00 35.25           C  
+ATOM   5280  C   LEU B 557      69.559  82.894  49.655  1.00 36.39           C  
+ATOM   5281  O   LEU B 557      68.800  83.091  48.701  1.00 35.72           O  
+ATOM   5282  CB  LEU B 557      70.925  80.796  49.829  1.00 33.45           C  
+ATOM   5283  CG  LEU B 557      72.191  79.964  49.599  1.00 30.17           C  
+ATOM   5284  CD1 LEU B 557      71.996  78.548  50.100  1.00 27.41           C  
+ATOM   5285  CD2 LEU B 557      72.517  79.950  48.118  1.00 28.79           C  
+ATOM   5286  N   GLU B 558      69.246  83.204  50.913  1.00 38.89           N  
+ATOM   5287  CA  GLU B 558      67.947  83.795  51.241  1.00 40.45           C  
+ATOM   5288  C   GLU B 558      67.691  84.977  50.308  1.00 40.75           C  
+ATOM   5289  O   GLU B 558      66.576  85.173  49.817  1.00 38.31           O  
+ATOM   5290  CB  GLU B 558      67.919  84.259  52.703  1.00 40.89           C  
+ATOM   5291  CG  GLU B 558      68.288  83.149  53.691  1.00 45.66           C  
+ATOM   5292  CD  GLU B 558      68.167  83.552  55.167  1.00 46.54           C  
+ATOM   5293  OE1 GLU B 558      68.550  84.695  55.511  1.00 47.65           O  
+ATOM   5294  OE2 GLU B 558      67.705  82.712  55.983  1.00 44.57           O  
+ATOM   5295  N   ARG B 559      68.748  85.740  50.048  1.00 42.94           N  
+ATOM   5296  CA  ARG B 559      68.665  86.906  49.181  1.00 43.00           C  
+ATOM   5297  C   ARG B 559      69.026  86.607  47.722  1.00 41.72           C  
+ATOM   5298  O   ARG B 559      68.899  87.475  46.856  1.00 43.36           O  
+ATOM   5299  CB  ARG B 559      69.558  88.013  49.741  1.00 43.49           C  
+ATOM   5300  CG  ARG B 559      69.150  88.474  51.125  1.00 44.54           C  
+ATOM   5301  CD  ARG B 559      70.102  89.539  51.632  1.00 47.06           C  
+ATOM   5302  NE  ARG B 559      69.674  90.139  52.896  1.00 48.94           N  
+ATOM   5303  CZ  ARG B 559      69.542  89.481  54.047  1.00 48.42           C  
+ATOM   5304  NH1 ARG B 559      69.806  88.182  54.110  1.00 48.01           N  
+ATOM   5305  NH2 ARG B 559      69.141  90.127  55.138  1.00 46.78           N  
+ATOM   5306  N   SER B 560      69.457  85.376  47.453  1.00 40.36           N  
+ATOM   5307  CA  SER B 560      69.817  84.971  46.096  1.00 41.52           C  
+ATOM   5308  C   SER B 560      69.064  83.702  45.691  1.00 46.91           C  
+ATOM   5309  O   SER B 560      69.626  82.768  45.101  1.00 42.40           O  
+ATOM   5310  CB  SER B 560      71.324  84.738  45.994  1.00 39.41           C  
+ATOM   5311  OG  SER B 560      72.033  85.836  46.536  1.00 34.84           O  
+ATOM   5312  N   GLU B 561      67.780  83.692  46.021  1.00 50.89           N  
+ATOM   5313  CA  GLU B 561      66.883  82.588  45.718  1.00 50.98           C  
+ATOM   5314  C   GLU B 561      67.168  81.901  44.384  1.00 46.02           C  
+ATOM   5315  O   GLU B 561      67.228  80.673  44.317  1.00 40.13           O  
+ATOM   5316  CB  GLU B 561      65.430  83.082  45.719  1.00 62.52           C  
+ATOM   5317  CG  GLU B 561      65.242  84.569  46.067  1.00 87.76           C  
+ATOM   5318  CD  GLU B 561      65.939  85.530  45.094  1.00 98.33           C  
+ATOM   5319  OE1 GLU B 561      65.742  85.401  43.866  1.00102.12           O  
+ATOM   5320  OE2 GLU B 561      66.678  86.426  45.560  1.00101.30           O  
+ATOM   5321  N   PHE B 562      67.354  82.686  43.325  1.00 39.42           N  
+ATOM   5322  CA  PHE B 562      67.586  82.112  41.998  1.00 34.47           C  
+ATOM   5323  C   PHE B 562      68.663  81.035  41.963  1.00 32.75           C  
+ATOM   5324  O   PHE B 562      68.687  80.209  41.047  1.00 33.76           O  
+ATOM   5325  CB  PHE B 562      67.902  83.213  40.967  1.00 32.25           C  
+ATOM   5326  CG  PHE B 562      69.270  83.835  41.115  1.00 31.72           C  
+ATOM   5327  CD1 PHE B 562      70.405  83.199  40.604  1.00 30.49           C  
+ATOM   5328  CD2 PHE B 562      69.426  85.062  41.764  1.00 31.44           C  
+ATOM   5329  CE1 PHE B 562      71.665  83.770  40.735  1.00 30.13           C  
+ATOM   5330  CE2 PHE B 562      70.687  85.638  41.900  1.00 31.42           C  
+ATOM   5331  CZ  PHE B 562      71.807  84.988  41.382  1.00 30.92           C  
+ATOM   5332  N   LEU B 563      69.543  81.030  42.959  1.00 31.64           N  
+ATOM   5333  CA  LEU B 563      70.592  80.037  42.987  1.00 31.20           C  
+ATOM   5334  C   LEU B 563      70.047  78.649  43.303  1.00 31.79           C  
+ATOM   5335  O   LEU B 563      70.505  77.648  42.743  1.00 31.86           O  
+ATOM   5336  CB  LEU B 563      71.652  80.425  44.008  1.00 28.93           C  
+ATOM   5337  CG  LEU B 563      72.595  81.533  43.568  1.00 26.46           C  
+ATOM   5338  CD1 LEU B 563      73.719  81.651  44.603  1.00 22.95           C  
+ATOM   5339  CD2 LEU B 563      73.158  81.210  42.177  1.00 24.98           C  
+ATOM   5340  N   LEU B 564      69.075  78.590  44.209  1.00 33.29           N  
+ATOM   5341  CA  LEU B 564      68.467  77.320  44.596  1.00 34.99           C  
+ATOM   5342  C   LEU B 564      67.283  76.989  43.696  1.00 38.54           C  
+ATOM   5343  O   LEU B 564      67.078  75.835  43.316  1.00 33.31           O  
+ATOM   5344  CB  LEU B 564      68.013  77.377  46.062  1.00 35.22           C  
+ATOM   5345  CG  LEU B 564      69.131  77.585  47.092  1.00 37.51           C  
+ATOM   5346  CD1 LEU B 564      68.580  77.476  48.491  1.00 37.23           C  
+ATOM   5347  CD2 LEU B 564      70.217  76.540  46.882  1.00 38.77           C  
+ATOM   5348  N   GLU B 565      66.529  78.020  43.335  1.00 41.18           N  
+ATOM   5349  CA  GLU B 565      65.355  77.858  42.497  1.00 41.24           C  
+ATOM   5350  C   GLU B 565      65.656  77.362  41.087  1.00 38.17           C  
+ATOM   5351  O   GLU B 565      64.828  76.702  40.462  1.00 32.32           O  
+ATOM   5352  CB  GLU B 565      64.564  79.171  42.474  1.00 51.88           C  
+ATOM   5353  CG  GLU B 565      64.073  79.567  43.869  1.00 74.96           C  
+ATOM   5354  CD  GLU B 565      63.045  80.687  43.864  1.00 85.67           C  
+ATOM   5355  OE1 GLU B 565      63.383  81.811  43.435  1.00 89.25           O  
+ATOM   5356  OE2 GLU B 565      61.894  80.443  44.298  1.00 89.23           O  
+ATOM   5357  N   LYS B 566      66.837  77.659  40.571  1.00 32.85           N  
+ATOM   5358  CA  LYS B 566      67.155  77.180  39.236  1.00 27.92           C  
+ATOM   5359  C   LYS B 566      68.180  76.057  39.312  1.00 26.60           C  
+ATOM   5360  O   LYS B 566      68.826  75.728  38.319  1.00 23.45           O  
+ATOM   5361  CB  LYS B 566      67.661  78.319  38.354  1.00 29.50           C  
+ATOM   5362  CG  LYS B 566      66.592  79.341  38.044  1.00 33.82           C  
+ATOM   5363  CD  LYS B 566      67.145  80.458  37.197  1.00 38.26           C  
+ATOM   5364  CE  LYS B 566      66.333  81.740  37.386  1.00 40.14           C  
+ATOM   5365  NZ  LYS B 566      66.894  82.892  36.605  1.00 40.42           N  
+ATOM   5366  N   ARG B 567      68.317  75.477  40.502  1.00 26.25           N  
+ATOM   5367  CA  ARG B 567      69.228  74.361  40.720  1.00 26.90           C  
+ATOM   5368  C   ARG B 567      70.610  74.616  40.132  1.00 27.23           C  
+ATOM   5369  O   ARG B 567      71.184  73.742  39.477  1.00 27.17           O  
+ATOM   5370  CB  ARG B 567      68.630  73.092  40.099  1.00 28.45           C  
+ATOM   5371  CG  ARG B 567      67.252  72.734  40.641  1.00 30.55           C  
+ATOM   5372  CD  ARG B 567      66.667  71.510  39.957  1.00 32.66           C  
+ATOM   5373  NE  ARG B 567      65.473  70.977  40.634  1.00 33.99           N  
+ATOM   5374  CZ  ARG B 567      64.270  71.556  40.639  1.00 33.17           C  
+ATOM   5375  NH1 ARG B 567      64.067  72.703  40.005  1.00 32.79           N  
+ATOM   5376  NH2 ARG B 567      63.261  70.983  41.278  1.00 33.35           N  
+ATOM   5377  N   ILE B 568      71.144  75.806  40.391  1.00 28.39           N  
+ATOM   5378  CA  ILE B 568      72.446  76.213  39.872  1.00 29.40           C  
+ATOM   5379  C   ILE B 568      73.681  75.784  40.680  1.00 28.96           C  
+ATOM   5380  O   ILE B 568      74.673  75.327  40.105  1.00 30.88           O  
+ATOM   5381  CB  ILE B 568      72.502  77.742  39.701  1.00 29.39           C  
+ATOM   5382  CG1 ILE B 568      71.299  78.220  38.890  1.00 28.01           C  
+ATOM   5383  CG2 ILE B 568      73.797  78.142  38.984  1.00 28.68           C  
+ATOM   5384  CD1 ILE B 568      71.215  79.723  38.806  1.00 26.78           C  
+ATOM   5385  N   ILE B 569      73.634  75.927  41.999  1.00 28.37           N  
+ATOM   5386  CA  ILE B 569      74.787  75.562  42.799  1.00 28.27           C  
+ATOM   5387  C   ILE B 569      75.073  74.072  42.876  1.00 29.36           C  
+ATOM   5388  O   ILE B 569      76.201  73.695  43.214  1.00 29.73           O  
+ATOM   5389  CB  ILE B 569      74.698  76.122  44.232  1.00 27.13           C  
+ATOM   5390  CG1 ILE B 569      73.429  75.648  44.920  1.00 26.59           C  
+ATOM   5391  CG2 ILE B 569      74.703  77.633  44.196  1.00 27.10           C  
+ATOM   5392  CD1 ILE B 569      73.352  76.081  46.370  1.00 25.04           C  
+ATOM   5393  N   GLN B 570      74.083  73.221  42.579  1.00 30.71           N  
+ATOM   5394  CA  GLN B 570      74.312  71.773  42.615  1.00 30.81           C  
+ATOM   5395  C   GLN B 570      74.601  71.256  41.216  1.00 30.45           C  
+ATOM   5396  O   GLN B 570      74.623  70.052  40.991  1.00 31.16           O  
+ATOM   5397  CB  GLN B 570      73.111  70.984  43.140  1.00 32.52           C  
+ATOM   5398  CG  GLN B 570      72.205  71.682  44.099  1.00 39.62           C  
+ATOM   5399  CD  GLN B 570      70.986  72.251  43.395  1.00 41.89           C  
+ATOM   5400  OE1 GLN B 570      71.080  73.231  42.652  1.00 41.56           O  
+ATOM   5401  NE2 GLN B 570      69.836  71.627  43.614  1.00 42.79           N  
+ATOM   5402  N   SER B 571      74.810  72.154  40.269  1.00 28.18           N  
+ATOM   5403  CA  SER B 571      75.089  71.723  38.917  1.00 26.50           C  
+ATOM   5404  C   SER B 571      76.561  71.549  38.627  1.00 26.14           C  
+ATOM   5405  O   SER B 571      77.394  72.392  38.980  1.00 24.48           O  
+ATOM   5406  CB  SER B 571      74.519  72.701  37.896  1.00 27.79           C  
+ATOM   5407  OG  SER B 571      74.958  72.344  36.594  1.00 28.15           O  
+ATOM   5408  N   GLY B 572      76.871  70.442  37.967  1.00 24.87           N  
+ATOM   5409  CA  GLY B 572      78.236  70.179  37.584  1.00 23.27           C  
+ATOM   5410  C   GLY B 572      78.566  71.226  36.542  1.00 23.63           C  
+ATOM   5411  O   GLY B 572      79.738  71.498  36.284  1.00 24.31           O  
+ATOM   5412  N   ILE B 573      77.536  71.817  35.935  1.00 23.38           N  
+ATOM   5413  CA  ILE B 573      77.760  72.851  34.928  1.00 23.54           C  
+ATOM   5414  C   ILE B 573      78.314  74.088  35.602  1.00 24.08           C  
+ATOM   5415  O   ILE B 573      79.091  74.843  35.006  1.00 25.62           O  
+ATOM   5416  CB  ILE B 573      76.470  73.221  34.168  1.00 25.15           C  
+ATOM   5417  CG1 ILE B 573      76.270  72.234  33.015  1.00 23.27           C  
+ATOM   5418  CG2 ILE B 573      76.539  74.674  33.649  1.00 23.92           C  
+ATOM   5419  CD1 ILE B 573      75.128  72.571  32.118  1.00 23.54           C  
+ATOM   5420  N   ALA B 574      77.917  74.292  36.851  1.00 24.78           N  
+ATOM   5421  CA  ALA B 574      78.413  75.426  37.599  1.00 24.39           C  
+ATOM   5422  C   ALA B 574      79.897  75.170  37.817  1.00 24.43           C  
+ATOM   5423  O   ALA B 574      80.715  76.086  37.741  1.00 26.69           O  
+ATOM   5424  CB  ALA B 574      77.687  75.534  38.935  1.00 24.17           C  
+ATOM   5425  N   LEU B 575      80.244  73.912  38.075  1.00 24.36           N  
+ATOM   5426  CA  LEU B 575      81.635  73.548  38.313  1.00 23.92           C  
+ATOM   5427  C   LEU B 575      82.493  73.534  37.061  1.00 24.82           C  
+ATOM   5428  O   LEU B 575      83.705  73.715  37.149  1.00 27.38           O  
+ATOM   5429  CB  LEU B 575      81.741  72.190  39.014  1.00 20.23           C  
+ATOM   5430  CG  LEU B 575      81.392  72.206  40.504  1.00 13.79           C  
+ATOM   5431  CD1 LEU B 575      81.688  70.840  41.117  1.00 11.67           C  
+ATOM   5432  CD2 LEU B 575      82.210  73.274  41.189  1.00 10.18           C  
+ATOM   5433  N   LEU B 576      81.886  73.319  35.898  1.00 27.18           N  
+ATOM   5434  CA  LEU B 576      82.668  73.335  34.664  1.00 29.56           C  
+ATOM   5435  C   LEU B 576      82.973  74.789  34.318  1.00 29.77           C  
+ATOM   5436  O   LEU B 576      84.008  75.094  33.722  1.00 30.81           O  
+ATOM   5437  CB  LEU B 576      81.915  72.677  33.500  1.00 30.15           C  
+ATOM   5438  CG  LEU B 576      82.714  72.613  32.190  1.00 29.10           C  
+ATOM   5439  CD1 LEU B 576      84.107  72.032  32.446  1.00 27.96           C  
+ATOM   5440  CD2 LEU B 576      81.949  71.784  31.171  1.00 28.76           C  
+ATOM   5441  N   LEU B 577      82.064  75.682  34.698  1.00 29.22           N  
+ATOM   5442  CA  LEU B 577      82.256  77.092  34.448  1.00 28.48           C  
+ATOM   5443  C   LEU B 577      83.354  77.612  35.357  1.00 27.38           C  
+ATOM   5444  O   LEU B 577      84.090  78.522  34.972  1.00 30.99           O  
+ATOM   5445  CB  LEU B 577      80.970  77.872  34.713  1.00 26.43           C  
+ATOM   5446  CG  LEU B 577      80.093  78.201  33.503  1.00 25.60           C  
+ATOM   5447  CD1 LEU B 577      78.754  78.735  33.978  1.00 24.76           C  
+ATOM   5448  CD2 LEU B 577      80.806  79.225  32.614  1.00 22.63           C  
+ATOM   5449  N   MET B 578      83.468  77.050  36.561  1.00 25.06           N  
+ATOM   5450  CA  MET B 578      84.488  77.508  37.497  1.00 25.14           C  
+ATOM   5451  C   MET B 578      85.902  77.172  37.022  1.00 26.24           C  
+ATOM   5452  O   MET B 578      86.848  77.937  37.237  1.00 28.66           O  
+ATOM   5453  CB  MET B 578      84.258  76.892  38.872  1.00 20.36           C  
+ATOM   5454  CG  MET B 578      85.180  77.463  39.967  1.00 12.03           C  
+ATOM   5455  SD  MET B 578      85.012  76.614  41.551  1.00  4.67           S  
+ATOM   5456  CE  MET B 578      86.018  75.416  41.210  1.00  6.52           C  
+ATOM   5457  N   LEU B 579      86.042  76.020  36.381  1.00 25.53           N  
+ATOM   5458  CA  LEU B 579      87.334  75.577  35.879  1.00 25.16           C  
+ATOM   5459  C   LEU B 579      87.745  76.403  34.668  1.00 23.79           C  
+ATOM   5460  O   LEU B 579      88.891  76.804  34.536  1.00 23.14           O  
+ATOM   5461  CB  LEU B 579      87.263  74.095  35.493  1.00 27.02           C  
+ATOM   5462  CG  LEU B 579      86.997  73.035  36.559  1.00 26.12           C  
+ATOM   5463  CD1 LEU B 579      86.828  71.682  35.888  1.00 28.03           C  
+ATOM   5464  CD2 LEU B 579      88.145  72.993  37.541  1.00 27.24           C  
+ATOM   5465  N   ILE B 580      86.794  76.644  33.781  1.00 21.37           N  
+ATOM   5466  CA  ILE B 580      87.049  77.423  32.588  1.00 21.06           C  
+ATOM   5467  C   ILE B 580      87.415  78.855  32.977  1.00 21.89           C  
+ATOM   5468  O   ILE B 580      88.192  79.517  32.284  1.00 20.80           O  
+ATOM   5469  CB  ILE B 580      85.789  77.497  31.683  1.00 22.89           C  
+ATOM   5470  CG1 ILE B 580      85.308  76.090  31.317  1.00 24.33           C  
+ATOM   5471  CG2 ILE B 580      86.101  78.319  30.428  1.00 21.57           C  
+ATOM   5472  CD1 ILE B 580      83.963  76.060  30.571  1.00 22.68           C  
+ATOM   5473  N   TRP B 581      86.846  79.324  34.085  1.00 22.42           N  
+ATOM   5474  CA  TRP B 581      87.074  80.684  34.556  1.00 23.19           C  
+ATOM   5475  C   TRP B 581      88.310  80.905  35.423  1.00 23.60           C  
+ATOM   5476  O   TRP B 581      88.788  82.033  35.524  1.00 24.88           O  
+ATOM   5477  CB  TRP B 581      85.819  81.175  35.292  1.00 24.82           C  
+ATOM   5478  CG  TRP B 581      85.962  82.519  35.975  1.00 29.26           C  
+ATOM   5479  CD1 TRP B 581      86.281  82.744  37.292  1.00 30.84           C  
+ATOM   5480  CD2 TRP B 581      85.806  83.814  35.377  1.00 29.86           C  
+ATOM   5481  NE1 TRP B 581      86.332  84.098  37.546  1.00 31.52           N  
+ATOM   5482  CE2 TRP B 581      86.046  84.777  36.390  1.00 31.13           C  
+ATOM   5483  CE3 TRP B 581      85.485  84.255  34.089  1.00 29.33           C  
+ATOM   5484  CZ2 TRP B 581      85.977  86.157  36.146  1.00 30.40           C  
+ATOM   5485  CZ3 TRP B 581      85.417  85.631  33.850  1.00 29.24           C  
+ATOM   5486  CH2 TRP B 581      85.661  86.561  34.876  1.00 30.05           C  
+ATOM   5487  N   TYR B 582      88.834  79.839  36.032  1.00 22.92           N  
+ATOM   5488  CA  TYR B 582      90.003  79.927  36.917  1.00 20.44           C  
+ATOM   5489  C   TYR B 582      91.236  79.229  36.401  1.00 21.35           C  
+ATOM   5490  O   TYR B 582      92.362  79.678  36.601  1.00 19.93           O  
+ATOM   5491  CB  TYR B 582      89.696  79.287  38.261  1.00 18.43           C  
+ATOM   5492  CG  TYR B 582      89.131  80.204  39.293  1.00 18.94           C  
+ATOM   5493  CD1 TYR B 582      87.758  80.280  39.512  1.00 20.16           C  
+ATOM   5494  CD2 TYR B 582      89.970  80.999  40.061  1.00 19.37           C  
+ATOM   5495  CE1 TYR B 582      87.224  81.140  40.481  1.00 19.75           C  
+ATOM   5496  CE2 TYR B 582      89.459  81.855  41.028  1.00 21.17           C  
+ATOM   5497  CZ  TYR B 582      88.080  81.921  41.234  1.00 20.39           C  
+ATOM   5498  OH  TYR B 582      87.577  82.762  42.193  1.00 21.34           O  
+ATOM   5499  N   ARG B 583      91.009  78.113  35.731  1.00 23.58           N  
+ATOM   5500  CA  ARG B 583      92.079  77.265  35.251  1.00 23.71           C  
+ATOM   5501  C   ARG B 583      92.697  77.542  33.883  1.00 23.19           C  
+ATOM   5502  O   ARG B 583      92.039  78.055  32.985  1.00 24.52           O  
+ATOM   5503  CB  ARG B 583      91.565  75.827  35.332  1.00 25.54           C  
+ATOM   5504  CG  ARG B 583      91.256  75.428  36.760  1.00 25.11           C  
+ATOM   5505  CD  ARG B 583      92.579  75.184  37.434  1.00 28.37           C  
+ATOM   5506  NE  ARG B 583      92.601  75.424  38.868  1.00 27.98           N  
+ATOM   5507  CZ  ARG B 583      93.646  75.123  39.634  1.00 25.73           C  
+ATOM   5508  NH1 ARG B 583      94.729  74.574  39.094  1.00 21.57           N  
+ATOM   5509  NH2 ARG B 583      93.609  75.371  40.935  1.00 27.15           N  
+ATOM   5510  N   PRO B 584      93.989  77.213  33.722  1.00 28.96           N  
+ATOM   5511  CA  PRO B 584      94.671  77.432  32.440  1.00 29.39           C  
+ATOM   5512  C   PRO B 584      94.357  76.329  31.431  1.00 29.56           C  
+ATOM   5513  O   PRO B 584      94.208  75.163  31.797  1.00 32.28           O  
+ATOM   5514  CB  PRO B 584      96.154  77.474  32.827  1.00 27.91           C  
+ATOM   5515  CG  PRO B 584      96.217  76.578  34.036  1.00 25.93           C  
+ATOM   5516  CD  PRO B 584      94.959  76.940  34.802  1.00 27.78           C  
+ATOM   5517  N   VAL B 585      94.258  76.716  30.164  1.00 31.08           N  
+ATOM   5518  CA  VAL B 585      93.967  75.800  29.073  1.00 29.30           C  
+ATOM   5519  C   VAL B 585      94.782  74.502  29.024  1.00 28.14           C  
+ATOM   5520  O   VAL B 585      94.218  73.433  28.771  1.00 28.31           O  
+ATOM   5521  CB  VAL B 585      94.108  76.532  27.730  1.00 28.15           C  
+ATOM   5522  CG1 VAL B 585      94.282  75.549  26.601  1.00 29.76           C  
+ATOM   5523  CG2 VAL B 585      92.871  77.351  27.489  1.00 29.19           C  
+ATOM   5524  N   ALA B 586      96.091  74.582  29.262  1.00 26.75           N  
+ATOM   5525  CA  ALA B 586      96.947  73.390  29.213  1.00 27.32           C  
+ATOM   5526  C   ALA B 586      96.569  72.335  30.228  1.00 29.91           C  
+ATOM   5527  O   ALA B 586      97.070  71.214  30.181  1.00 32.05           O  
+ATOM   5528  CB  ALA B 586      98.398  73.766  29.422  1.00 23.87           C  
+ATOM   5529  N   GLU B 587      95.699  72.696  31.160  1.00 33.59           N  
+ATOM   5530  CA  GLU B 587      95.286  71.760  32.176  1.00 35.68           C  
+ATOM   5531  C   GLU B 587      94.198  70.861  31.640  1.00 36.19           C  
+ATOM   5532  O   GLU B 587      93.933  69.819  32.218  1.00 38.86           O  
+ATOM   5533  CB  GLU B 587      94.788  72.511  33.400  1.00 38.20           C  
+ATOM   5534  CG  GLU B 587      95.550  72.195  34.666  1.00 42.29           C  
+ATOM   5535  CD  GLU B 587      95.101  73.054  35.820  1.00 45.86           C  
+ATOM   5536  OE1 GLU B 587      93.871  73.166  36.011  1.00 46.03           O  
+ATOM   5537  OE2 GLU B 587      95.969  73.608  36.534  1.00 45.93           O  
+ATOM   5538  N   PHE B 588      93.564  71.269  30.541  1.00 35.95           N  
+ATOM   5539  CA  PHE B 588      92.501  70.476  29.913  1.00 36.51           C  
+ATOM   5540  C   PHE B 588      93.118  69.511  28.918  1.00 37.14           C  
+ATOM   5541  O   PHE B 588      94.292  69.633  28.593  1.00 38.75           O  
+ATOM   5542  CB  PHE B 588      91.518  71.368  29.150  1.00 36.45           C  
+ATOM   5543  CG  PHE B 588      90.634  72.197  30.026  1.00 36.21           C  
+ATOM   5544  CD1 PHE B 588      91.146  73.273  30.737  1.00 36.75           C  
+ATOM   5545  CD2 PHE B 588      89.283  71.918  30.118  1.00 36.37           C  
+ATOM   5546  CE1 PHE B 588      90.328  74.065  31.522  1.00 36.72           C  
+ATOM   5547  CE2 PHE B 588      88.447  72.704  30.905  1.00 38.29           C  
+ATOM   5548  CZ  PHE B 588      88.970  73.781  31.608  1.00 37.81           C  
+ATOM   5549  N   ALA B 589      92.328  68.566  28.420  1.00 37.77           N  
+ATOM   5550  CA  ALA B 589      92.827  67.607  27.435  1.00 38.57           C  
+ATOM   5551  C   ALA B 589      93.009  68.335  26.105  1.00 41.86           C  
+ATOM   5552  O   ALA B 589      92.155  69.122  25.704  1.00 37.72           O  
+ATOM   5553  CB  ALA B 589      91.842  66.461  27.271  1.00 36.76           C  
+ATOM   5554  N   GLN B 590      94.124  68.070  25.428  1.00 46.88           N  
+ATOM   5555  CA  GLN B 590      94.427  68.707  24.149  1.00 50.35           C  
+ATOM   5556  C   GLN B 590      93.180  68.818  23.283  1.00 49.04           C  
+ATOM   5557  O   GLN B 590      92.843  69.881  22.761  1.00 45.62           O  
+ATOM   5558  CB  GLN B 590      95.500  67.897  23.409  1.00 61.26           C  
+ATOM   5559  CG  GLN B 590      95.890  68.423  22.029  1.00 81.11           C  
+ATOM   5560  CD  GLN B 590      96.529  69.793  22.084  1.00 89.81           C  
+ATOM   5561  OE1 GLN B 590      97.215  70.129  23.049  1.00 92.97           O  
+ATOM   5562  NE2 GLN B 590      96.322  70.588  21.038  1.00 93.00           N  
+ATOM   5563  N   SER B 591      92.494  67.695  23.153  1.00 45.69           N  
+ATOM   5564  CA  SER B 591      91.284  67.594  22.353  1.00 40.32           C  
+ATOM   5565  C   SER B 591      90.201  68.630  22.602  1.00 37.60           C  
+ATOM   5566  O   SER B 591      89.499  69.013  21.674  1.00 36.59           O  
+ATOM   5567  CB  SER B 591      90.668  66.202  22.534  1.00 41.32           C  
+ATOM   5568  OG  SER B 591      89.274  66.236  22.263  1.00 46.79           O  
+ATOM   5569  N   ILE B 592      90.055  69.083  23.841  1.00 35.41           N  
+ATOM   5570  CA  ILE B 592      88.992  70.025  24.163  1.00 33.59           C  
+ATOM   5571  C   ILE B 592      89.405  71.496  24.291  1.00 34.17           C  
+ATOM   5572  O   ILE B 592      88.600  72.393  24.058  1.00 33.80           O  
+ATOM   5573  CB  ILE B 592      88.292  69.577  25.458  1.00 30.85           C  
+ATOM   5574  CG1 ILE B 592      86.824  69.941  25.390  1.00 30.49           C  
+ATOM   5575  CG2 ILE B 592      88.913  70.248  26.671  1.00 30.28           C  
+ATOM   5576  CD1 ILE B 592      86.090  69.588  26.654  1.00 31.95           C  
+ATOM   5577  N   GLN B 593      90.663  71.729  24.652  1.00 36.82           N  
+ATOM   5578  CA  GLN B 593      91.206  73.078  24.846  1.00 38.37           C  
+ATOM   5579  C   GLN B 593      90.673  74.152  23.909  1.00 40.75           C  
+ATOM   5580  O   GLN B 593      90.234  75.203  24.357  1.00 41.38           O  
+ATOM   5581  CB  GLN B 593      92.730  73.050  24.738  1.00 34.56           C  
+ATOM   5582  CG  GLN B 593      93.382  71.997  25.611  1.00 32.36           C  
+ATOM   5583  CD  GLN B 593      94.881  72.137  25.664  1.00 31.57           C  
+ATOM   5584  OE1 GLN B 593      95.469  72.958  24.950  1.00 32.41           O  
+ATOM   5585  NE2 GLN B 593      95.518  71.332  26.511  1.00 30.62           N  
+ATOM   5586  N   SER B 594      90.724  73.899  22.609  1.00 46.33           N  
+ATOM   5587  CA  SER B 594      90.251  74.884  21.646  1.00 51.04           C  
+ATOM   5588  C   SER B 594      88.816  75.304  21.928  1.00 50.54           C  
+ATOM   5589  O   SER B 594      88.433  76.441  21.663  1.00 54.54           O  
+ATOM   5590  CB  SER B 594      90.364  74.336  20.223  1.00 54.78           C  
+ATOM   5591  OG  SER B 594      91.715  74.041  19.914  1.00 60.74           O  
+ATOM   5592  N   ARG B 595      88.029  74.391  22.482  1.00 47.62           N  
+ATOM   5593  CA  ARG B 595      86.636  74.682  22.784  1.00 44.29           C  
+ATOM   5594  C   ARG B 595      86.509  75.472  24.090  1.00 41.28           C  
+ATOM   5595  O   ARG B 595      85.581  76.263  24.262  1.00 43.76           O  
+ATOM   5596  CB  ARG B 595      85.866  73.371  22.873  1.00 42.18           C  
+ATOM   5597  CG  ARG B 595      84.379  73.502  22.688  1.00 38.08           C  
+ATOM   5598  CD  ARG B 595      83.708  72.136  22.690  1.00 36.56           C  
+ATOM   5599  NE  ARG B 595      82.251  72.250  22.631  1.00 35.93           N  
+ATOM   5600  CZ  ARG B 595      81.410  71.237  22.817  1.00 34.80           C  
+ATOM   5601  NH1 ARG B 595      81.872  70.018  23.081  1.00 36.66           N  
+ATOM   5602  NH2 ARG B 595      80.103  71.443  22.737  1.00 35.66           N  
+ATOM   5603  N   ILE B 596      87.447  75.246  25.005  1.00 36.49           N  
+ATOM   5604  CA  ILE B 596      87.475  75.937  26.296  1.00 33.41           C  
+ATOM   5605  C   ILE B 596      87.909  77.396  26.063  1.00 33.42           C  
+ATOM   5606  O   ILE B 596      87.276  78.335  26.558  1.00 32.93           O  
+ATOM   5607  CB  ILE B 596      88.490  75.262  27.277  1.00 28.37           C  
+ATOM   5608  CG1 ILE B 596      88.040  73.836  27.617  1.00 21.47           C  
+ATOM   5609  CG2 ILE B 596      88.658  76.117  28.530  1.00 21.60           C  
+ATOM   5610  CD1 ILE B 596      86.697  73.763  28.281  1.00 16.92           C  
+ATOM   5611  N   VAL B 597      88.994  77.566  25.304  1.00 31.42           N  
+ATOM   5612  CA  VAL B 597      89.533  78.885  24.980  1.00 33.14           C  
+ATOM   5613  C   VAL B 597      88.401  79.727  24.419  1.00 36.88           C  
+ATOM   5614  O   VAL B 597      88.237  80.900  24.753  1.00 35.01           O  
+ATOM   5615  CB  VAL B 597      90.642  78.799  23.908  1.00 31.52           C  
+ATOM   5616  CG1 VAL B 597      90.962  80.204  23.387  1.00 30.13           C  
+ATOM   5617  CG2 VAL B 597      91.886  78.148  24.492  1.00 28.29           C  
+ATOM   5618  N   GLU B 598      87.632  79.089  23.552  1.00 41.56           N  
+ATOM   5619  CA  GLU B 598      86.475  79.671  22.892  1.00 43.15           C  
+ATOM   5620  C   GLU B 598      85.555  80.264  23.969  1.00 41.41           C  
+ATOM   5621  O   GLU B 598      85.078  81.399  23.855  1.00 38.47           O  
+ATOM   5622  CB  GLU B 598      85.777  78.542  22.134  1.00 49.15           C  
+ATOM   5623  CG  GLU B 598      84.906  78.923  20.971  1.00 61.07           C  
+ATOM   5624  CD  GLU B 598      84.336  77.686  20.289  1.00 67.18           C  
+ATOM   5625  OE1 GLU B 598      85.117  76.904  19.699  1.00 68.26           O  
+ATOM   5626  OE2 GLU B 598      83.106  77.485  20.358  1.00 69.86           O  
+ATOM   5627  N   TRP B 599      85.329  79.480  25.020  1.00 39.44           N  
+ATOM   5628  CA  TRP B 599      84.470  79.888  26.127  1.00 37.87           C  
+ATOM   5629  C   TRP B 599      85.083  80.967  27.033  1.00 36.96           C  
+ATOM   5630  O   TRP B 599      84.391  81.901  27.462  1.00 35.95           O  
+ATOM   5631  CB  TRP B 599      84.094  78.661  26.972  1.00 33.82           C  
+ATOM   5632  CG  TRP B 599      82.751  78.111  26.631  1.00 30.33           C  
+ATOM   5633  CD1 TRP B 599      82.477  76.989  25.904  1.00 27.18           C  
+ATOM   5634  CD2 TRP B 599      81.486  78.690  26.975  1.00 29.48           C  
+ATOM   5635  NE1 TRP B 599      81.122  76.833  25.775  1.00 27.46           N  
+ATOM   5636  CE2 TRP B 599      80.485  77.858  26.422  1.00 27.42           C  
+ATOM   5637  CE3 TRP B 599      81.102  79.836  27.698  1.00 29.96           C  
+ATOM   5638  CZ2 TRP B 599      79.111  78.129  26.564  1.00 28.46           C  
+ATOM   5639  CZ3 TRP B 599      79.726  80.116  27.844  1.00 29.63           C  
+ATOM   5640  CH2 TRP B 599      78.749  79.257  27.277  1.00 30.20           C  
+ATOM   5641  N   LYS B 600      86.373  80.817  27.336  1.00 36.77           N  
+ATOM   5642  CA  LYS B 600      87.087  81.770  28.182  1.00 37.21           C  
+ATOM   5643  C   LYS B 600      86.883  83.156  27.621  1.00 38.67           C  
+ATOM   5644  O   LYS B 600      86.468  84.079  28.322  1.00 36.86           O  
+ATOM   5645  CB  LYS B 600      88.584  81.467  28.196  1.00 36.77           C  
+ATOM   5646  CG  LYS B 600      88.959  80.195  28.914  1.00 38.05           C  
+ATOM   5647  CD  LYS B 600      90.457  79.984  28.942  1.00 37.15           C  
+ATOM   5648  CE  LYS B 600      90.785  78.806  29.841  1.00 37.66           C  
+ATOM   5649  NZ  LYS B 600      90.263  79.046  31.219  1.00 35.97           N  
+ATOM   5650  N   GLU B 601      87.181  83.281  26.337  1.00 40.16           N  
+ATOM   5651  CA  GLU B 601      87.033  84.535  25.634  1.00 40.04           C  
+ATOM   5652  C   GLU B 601      85.612  85.067  25.775  1.00 39.49           C  
+ATOM   5653  O   GLU B 601      85.400  86.240  26.086  1.00 39.08           O  
+ATOM   5654  CB  GLU B 601      87.406  84.325  24.168  1.00 41.16           C  
+ATOM   5655  CG  GLU B 601      88.907  84.104  23.976  1.00 46.01           C  
+ATOM   5656  CD  GLU B 601      89.275  83.676  22.571  1.00 49.04           C  
+ATOM   5657  OE1 GLU B 601      88.543  84.041  21.624  1.00 50.51           O  
+ATOM   5658  OE2 GLU B 601      90.310  82.989  22.417  1.00 50.28           O  
+ATOM   5659  N   ARG B 602      84.636  84.199  25.568  1.00 40.02           N  
+ATOM   5660  CA  ARG B 602      83.257  84.618  25.681  1.00 40.79           C  
+ATOM   5661  C   ARG B 602      83.029  85.140  27.092  1.00 41.63           C  
+ATOM   5662  O   ARG B 602      82.469  86.220  27.287  1.00 45.68           O  
+ATOM   5663  CB  ARG B 602      82.340  83.434  25.391  1.00 42.15           C  
+ATOM   5664  CG  ARG B 602      80.884  83.786  25.200  1.00 41.54           C  
+ATOM   5665  CD  ARG B 602      80.168  83.834  26.521  1.00 43.37           C  
+ATOM   5666  NE  ARG B 602      78.726  83.973  26.351  1.00 45.92           N  
+ATOM   5667  CZ  ARG B 602      77.967  83.121  25.667  1.00 45.85           C  
+ATOM   5668  NH1 ARG B 602      78.511  82.056  25.081  1.00 45.69           N  
+ATOM   5669  NH2 ARG B 602      76.659  83.332  25.571  1.00 44.44           N  
+ATOM   5670  N   LEU B 603      83.496  84.380  28.075  1.00 42.62           N  
+ATOM   5671  CA  LEU B 603      83.323  84.742  29.477  1.00 42.96           C  
+ATOM   5672  C   LEU B 603      84.104  85.990  29.886  1.00 46.39           C  
+ATOM   5673  O   LEU B 603      83.606  86.814  30.666  1.00 44.55           O  
+ATOM   5674  CB  LEU B 603      83.721  83.554  30.350  1.00 38.78           C  
+ATOM   5675  CG  LEU B 603      82.715  83.088  31.408  1.00 35.66           C  
+ATOM   5676  CD1 LEU B 603      81.282  83.232  30.930  1.00 31.14           C  
+ATOM   5677  CD2 LEU B 603      83.036  81.631  31.745  1.00 34.19           C  
+ATOM   5678  N   ASP B 604      85.326  86.117  29.363  1.00 51.12           N  
+ATOM   5679  CA  ASP B 604      86.195  87.262  29.650  1.00 53.46           C  
+ATOM   5680  C   ASP B 604      85.687  88.526  28.958  1.00 52.08           C  
+ATOM   5681  O   ASP B 604      86.035  89.640  29.354  1.00 50.81           O  
+ATOM   5682  CB  ASP B 604      87.640  86.980  29.207  1.00 60.84           C  
+ATOM   5683  CG  ASP B 604      88.454  86.252  30.270  1.00 71.18           C  
+ATOM   5684  OD1 ASP B 604      88.614  86.801  31.380  1.00 76.81           O  
+ATOM   5685  OD2 ASP B 604      88.940  85.133  29.998  1.00 76.01           O  
+ATOM   5686  N   LYS B 605      84.870  88.348  27.921  1.00 48.81           N  
+ATOM   5687  CA  LYS B 605      84.289  89.473  27.196  1.00 46.95           C  
+ATOM   5688  C   LYS B 605      83.033  89.936  27.934  1.00 50.30           C  
+ATOM   5689  O   LYS B 605      82.627  91.089  27.823  1.00 45.03           O  
+ATOM   5690  CB  LYS B 605      83.931  89.050  25.769  1.00 45.44           C  
+ATOM   5691  CG  LYS B 605      83.128  90.076  24.972  1.00 47.62           C  
+ATOM   5692  CD  LYS B 605      82.743  89.536  23.588  1.00 49.53           C  
+ATOM   5693  CE  LYS B 605      81.765  90.456  22.843  1.00 48.76           C  
+ATOM   5694  NZ  LYS B 605      80.397  90.531  23.459  1.00 48.91           N  
+ATOM   5695  N   GLU B 606      82.448  89.030  28.711  1.00 52.42           N  
+ATOM   5696  CA  GLU B 606      81.224  89.297  29.468  1.00 50.67           C  
+ATOM   5697  C   GLU B 606      81.386  89.799  30.902  1.00 44.45           C  
+ATOM   5698  O   GLU B 606      80.542  90.556  31.392  1.00 35.95           O  
+ATOM   5699  CB  GLU B 606      80.362  88.036  29.502  1.00 63.61           C  
+ATOM   5700  CG  GLU B 606      79.649  87.735  28.206  1.00 91.14           C  
+ATOM   5701  CD  GLU B 606      78.147  87.801  28.367  1.00103.32           C  
+ATOM   5702  OE1 GLU B 606      77.661  88.797  28.949  1.00107.69           O  
+ATOM   5703  OE2 GLU B 606      77.457  86.865  27.911  1.00107.53           O  
+ATOM   5704  N   PHE B 607      82.441  89.371  31.589  1.00 35.20           N  
+ATOM   5705  CA  PHE B 607      82.620  89.788  32.972  1.00 28.14           C  
+ATOM   5706  C   PHE B 607      84.026  90.236  33.273  1.00 26.21           C  
+ATOM   5707  O   PHE B 607      84.980  89.634  32.804  1.00 27.06           O  
+ATOM   5708  CB  PHE B 607      82.265  88.640  33.932  1.00 26.96           C  
+ATOM   5709  CG  PHE B 607      80.912  88.036  33.684  1.00 25.80           C  
+ATOM   5710  CD1 PHE B 607      80.767  86.958  32.819  1.00 24.19           C  
+ATOM   5711  CD2 PHE B 607      79.772  88.600  34.256  1.00 26.34           C  
+ATOM   5712  CE1 PHE B 607      79.499  86.451  32.516  1.00 24.69           C  
+ATOM   5713  CE2 PHE B 607      78.502  88.108  33.966  1.00 24.79           C  
+ATOM   5714  CZ  PHE B 607      78.363  87.028  33.089  1.00 25.18           C  
+ATOM   5715  N   SER B 608      84.148  91.287  34.076  1.00 26.77           N  
+ATOM   5716  CA  SER B 608      85.450  91.798  34.475  1.00 26.54           C  
+ATOM   5717  C   SER B 608      85.782  91.134  35.803  1.00 28.17           C  
+ATOM   5718  O   SER B 608      84.891  90.800  36.585  1.00 27.35           O  
+ATOM   5719  CB  SER B 608      85.406  93.320  34.670  1.00 26.10           C  
+ATOM   5720  OG  SER B 608      84.706  93.671  35.862  1.00 25.22           O  
+ATOM   5721  N   LEU B 609      87.067  90.948  36.058  1.00 30.12           N  
+ATOM   5722  CA  LEU B 609      87.507  90.329  37.290  1.00 31.09           C  
+ATOM   5723  C   LEU B 609      86.915  91.055  38.491  1.00 31.11           C  
+ATOM   5724  O   LEU B 609      86.553  90.418  39.482  1.00 32.27           O  
+ATOM   5725  CB  LEU B 609      89.036  90.353  37.375  1.00 32.84           C  
+ATOM   5726  CG  LEU B 609      89.648  89.255  38.246  1.00 34.53           C  
+ATOM   5727  CD1 LEU B 609      89.329  89.455  39.704  1.00 35.64           C  
+ATOM   5728  CD2 LEU B 609      89.085  87.931  37.773  1.00 37.19           C  
+ATOM   5729  N   SER B 610      86.816  92.382  38.401  1.00 31.01           N  
+ATOM   5730  CA  SER B 610      86.284  93.200  39.495  1.00 31.60           C  
+ATOM   5731  C   SER B 610      84.805  92.936  39.761  1.00 31.17           C  
+ATOM   5732  O   SER B 610      84.356  92.966  40.912  1.00 31.88           O  
+ATOM   5733  CB  SER B 610      86.505  94.691  39.205  1.00 32.62           C  
+ATOM   5734  OG  SER B 610      86.038  95.042  37.913  1.00 35.41           O  
+ATOM   5735  N   VAL B 611      84.053  92.670  38.696  1.00 28.31           N  
+ATOM   5736  CA  VAL B 611      82.633  92.386  38.820  1.00 24.67           C  
+ATOM   5737  C   VAL B 611      82.460  91.069  39.554  1.00 25.13           C  
+ATOM   5738  O   VAL B 611      81.620  90.936  40.450  1.00 24.12           O  
+ATOM   5739  CB  VAL B 611      81.991  92.287  37.442  1.00 22.21           C  
+ATOM   5740  CG1 VAL B 611      80.583  91.738  37.559  1.00 19.87           C  
+ATOM   5741  CG2 VAL B 611      81.975  93.666  36.796  1.00 21.68           C  
+ATOM   5742  N   TYR B 612      83.272  90.096  39.166  1.00 26.41           N  
+ATOM   5743  CA  TYR B 612      83.235  88.789  39.779  1.00 28.10           C  
+ATOM   5744  C   TYR B 612      83.660  88.880  41.231  1.00 29.60           C  
+ATOM   5745  O   TYR B 612      83.066  88.236  42.099  1.00 31.02           O  
+ATOM   5746  CB  TYR B 612      84.171  87.836  39.045  1.00 29.82           C  
+ATOM   5747  CG  TYR B 612      84.346  86.526  39.764  1.00 32.12           C  
+ATOM   5748  CD1 TYR B 612      83.330  85.578  39.783  1.00 33.78           C  
+ATOM   5749  CD2 TYR B 612      85.517  86.243  40.449  1.00 33.26           C  
+ATOM   5750  CE1 TYR B 612      83.476  84.366  40.469  1.00 33.67           C  
+ATOM   5751  CE2 TYR B 612      85.673  85.039  41.141  1.00 35.34           C  
+ATOM   5752  CZ  TYR B 612      84.650  84.102  41.147  1.00 34.28           C  
+ATOM   5753  OH  TYR B 612      84.804  82.911  41.828  1.00 31.38           O  
+ATOM   5754  N   GLN B 613      84.694  89.670  41.494  1.00 29.32           N  
+ATOM   5755  CA  GLN B 613      85.189  89.819  42.852  1.00 30.30           C  
+ATOM   5756  C   GLN B 613      84.146  90.443  43.763  1.00 30.67           C  
+ATOM   5757  O   GLN B 613      84.081  90.118  44.949  1.00 27.92           O  
+ATOM   5758  CB  GLN B 613      86.460  90.657  42.869  1.00 32.65           C  
+ATOM   5759  CG  GLN B 613      87.692  89.903  42.393  1.00 38.10           C  
+ATOM   5760  CD  GLN B 613      88.025  88.713  43.277  1.00 39.29           C  
+ATOM   5761  OE1 GLN B 613      88.140  88.848  44.491  1.00 40.19           O  
+ATOM   5762  NE2 GLN B 613      88.184  87.544  42.669  1.00 40.63           N  
+ATOM   5763  N   LYS B 614      83.320  91.329  43.211  1.00 30.74           N  
+ATOM   5764  CA  LYS B 614      82.269  91.966  44.003  1.00 29.95           C  
+ATOM   5765  C   LYS B 614      81.247  90.888  44.387  1.00 27.41           C  
+ATOM   5766  O   LYS B 614      80.696  90.886  45.495  1.00 26.44           O  
+ATOM   5767  CB  LYS B 614      81.600  93.085  43.189  1.00 33.43           C  
+ATOM   5768  CG  LYS B 614      80.596  93.947  43.964  1.00 38.42           C  
+ATOM   5769  CD  LYS B 614      80.313  95.240  43.194  1.00 43.26           C  
+ATOM   5770  CE  LYS B 614      79.358  96.179  43.912  1.00 43.23           C  
+ATOM   5771  NZ  LYS B 614      77.946  95.725  43.782  1.00 43.87           N  
+ATOM   5772  N   MET B 615      81.016  89.966  43.455  1.00 24.00           N  
+ATOM   5773  CA  MET B 615      80.089  88.879  43.677  1.00 21.33           C  
+ATOM   5774  C   MET B 615      80.554  88.079  44.889  1.00 22.27           C  
+ATOM   5775  O   MET B 615      79.753  87.765  45.761  1.00 23.33           O  
+ATOM   5776  CB  MET B 615      79.997  87.988  42.429  1.00 17.34           C  
+ATOM   5777  CG  MET B 615      79.224  88.587  41.252  1.00  8.89           C  
+ATOM   5778  SD  MET B 615      78.923  87.349  39.957  1.00  6.32           S  
+ATOM   5779  CE  MET B 615      80.223  87.587  38.908  1.00 11.47           C  
+ATOM   5780  N   LYS B 616      81.844  87.766  44.969  1.00 24.19           N  
+ATOM   5781  CA  LYS B 616      82.335  87.006  46.122  1.00 26.58           C  
+ATOM   5782  C   LYS B 616      82.242  87.863  47.369  1.00 28.53           C  
+ATOM   5783  O   LYS B 616      81.872  87.381  48.430  1.00 28.60           O  
+ATOM   5784  CB  LYS B 616      83.796  86.546  45.940  1.00 26.18           C  
+ATOM   5785  CG  LYS B 616      84.000  85.438  44.912  1.00 26.63           C  
+ATOM   5786  CD  LYS B 616      85.435  84.879  44.944  1.00 25.69           C  
+ATOM   5787  CE  LYS B 616      85.681  84.032  46.199  1.00 25.83           C  
+ATOM   5788  NZ  LYS B 616      87.084  83.551  46.303  1.00 25.31           N  
+ATOM   5789  N   PHE B 617      82.594  89.140  47.240  1.00 31.53           N  
+ATOM   5790  CA  PHE B 617      82.543  90.054  48.374  1.00 32.38           C  
+ATOM   5791  C   PHE B 617      81.129  90.033  48.939  1.00 32.68           C  
+ATOM   5792  O   PHE B 617      80.929  90.027  50.160  1.00 32.97           O  
+ATOM   5793  CB  PHE B 617      82.885  91.474  47.941  1.00 33.30           C  
+ATOM   5794  CG  PHE B 617      82.682  92.487  49.022  1.00 35.32           C  
+ATOM   5795  CD1 PHE B 617      83.612  92.627  50.045  1.00 35.64           C  
+ATOM   5796  CD2 PHE B 617      81.536  93.275  49.044  1.00 36.93           C  
+ATOM   5797  CE1 PHE B 617      83.403  93.534  51.075  1.00 37.00           C  
+ATOM   5798  CE2 PHE B 617      81.316  94.187  50.069  1.00 37.37           C  
+ATOM   5799  CZ  PHE B 617      82.251  94.318  51.087  1.00 37.39           C  
+ATOM   5800  N   ASN B 618      80.151  90.031  48.035  1.00 34.06           N  
+ATOM   5801  CA  ASN B 618      78.750  89.993  48.428  1.00 34.93           C  
+ATOM   5802  C   ASN B 618      78.441  88.721  49.206  1.00 33.90           C  
+ATOM   5803  O   ASN B 618      77.898  88.779  50.309  1.00 36.07           O  
+ATOM   5804  CB  ASN B 618      77.841  90.096  47.203  1.00 33.90           C  
+ATOM   5805  CG  ASN B 618      77.658  91.522  46.749  1.00 33.27           C  
+ATOM   5806  OD1 ASN B 618      77.869  92.456  47.532  1.00 34.38           O  
+ATOM   5807  ND2 ASN B 618      77.254  91.710  45.489  1.00 32.50           N  
+ATOM   5808  N   VAL B 619      78.784  87.575  48.632  1.00 31.33           N  
+ATOM   5809  CA  VAL B 619      78.555  86.302  49.303  1.00 29.38           C  
+ATOM   5810  C   VAL B 619      79.203  86.385  50.691  1.00 30.70           C  
+ATOM   5811  O   VAL B 619      78.677  85.870  51.673  1.00 30.97           O  
+ATOM   5812  CB  VAL B 619      79.183  85.140  48.488  1.00 26.01           C  
+ATOM   5813  CG1 VAL B 619      79.149  83.850  49.279  1.00 21.70           C  
+ATOM   5814  CG2 VAL B 619      78.438  84.970  47.177  1.00 18.61           C  
+ATOM   5815  N   ALA B 620      80.337  87.074  50.760  1.00 33.11           N  
+ATOM   5816  CA  ALA B 620      81.082  87.240  52.005  1.00 35.77           C  
+ATOM   5817  C   ALA B 620      80.307  88.044  53.047  1.00 36.45           C  
+ATOM   5818  O   ALA B 620      80.327  87.706  54.231  1.00 38.86           O  
+ATOM   5819  CB  ALA B 620      82.412  87.911  51.714  1.00 35.97           C  
+ATOM   5820  N   MET B 621      79.635  89.107  52.601  1.00 38.27           N  
+ATOM   5821  CA  MET B 621      78.840  89.963  53.484  1.00 39.15           C  
+ATOM   5822  C   MET B 621      77.419  89.428  53.636  1.00 39.31           C  
+ATOM   5823  O   MET B 621      76.571  90.085  54.243  1.00 40.32           O  
+ATOM   5824  CB  MET B 621      78.763  91.386  52.930  1.00 38.75           C  
+ATOM   5825  CG  MET B 621      80.075  92.175  52.961  1.00 39.00           C  
+ATOM   5826  SD  MET B 621      80.749  92.490  54.610  1.00 36.57           S  
+ATOM   5827  CE  MET B 621      82.241  91.479  54.575  1.00 35.60           C  
+ATOM   5828  N   GLY B 622      77.168  88.245  53.069  1.00 37.36           N  
+ATOM   5829  CA  GLY B 622      75.855  87.619  53.137  1.00 32.75           C  
+ATOM   5830  C   GLY B 622      74.714  88.447  52.577  1.00 30.81           C  
+ATOM   5831  O   GLY B 622      73.750  88.693  53.278  1.00 29.49           O  
+ATOM   5832  N   ILE B 623      74.793  88.851  51.314  1.00 29.09           N  
+ATOM   5833  CA  ILE B 623      73.747  89.679  50.733  1.00 29.02           C  
+ATOM   5834  C   ILE B 623      73.365  89.411  49.288  1.00 30.68           C  
+ATOM   5835  O   ILE B 623      72.973  90.323  48.579  1.00 32.19           O  
+ATOM   5836  CB  ILE B 623      74.121  91.173  50.797  1.00 29.79           C  
+ATOM   5837  CG1 ILE B 623      75.523  91.368  50.204  1.00 29.85           C  
+ATOM   5838  CG2 ILE B 623      74.019  91.688  52.229  1.00 28.46           C  
+ATOM   5839  CD1 ILE B 623      75.850  92.788  49.797  1.00 26.72           C  
+ATOM   5840  N   GLY B 624      73.455  88.189  48.809  1.00 32.90           N  
+ATOM   5841  CA  GLY B 624      73.054  88.010  47.426  1.00 35.64           C  
+ATOM   5842  C   GLY B 624      74.039  88.607  46.440  1.00 37.71           C  
+ATOM   5843  O   GLY B 624      74.286  89.819  46.413  1.00 35.07           O  
+ATOM   5844  N   VAL B 625      74.592  87.715  45.624  1.00 39.89           N  
+ATOM   5845  CA  VAL B 625      75.590  88.035  44.618  1.00 40.45           C  
+ATOM   5846  C   VAL B 625      75.357  89.171  43.635  1.00 40.19           C  
+ATOM   5847  O   VAL B 625      76.303  89.883  43.300  1.00 40.65           O  
+ATOM   5848  CB  VAL B 625      75.914  86.797  43.793  1.00 41.40           C  
+ATOM   5849  CG1 VAL B 625      77.163  86.157  44.308  1.00 45.21           C  
+ATOM   5850  CG2 VAL B 625      74.774  85.821  43.883  1.00 43.70           C  
+ATOM   5851  N   LEU B 626      74.128  89.358  43.168  1.00 39.16           N  
+ATOM   5852  CA  LEU B 626      73.886  90.402  42.176  1.00 38.52           C  
+ATOM   5853  C   LEU B 626      73.542  91.802  42.660  1.00 39.66           C  
+ATOM   5854  O   LEU B 626      73.046  92.614  41.877  1.00 41.72           O  
+ATOM   5855  CB  LEU B 626      72.817  89.937  41.188  1.00 35.12           C  
+ATOM   5856  CG  LEU B 626      73.160  88.620  40.494  1.00 33.02           C  
+ATOM   5857  CD1 LEU B 626      72.094  88.294  39.461  1.00 31.33           C  
+ATOM   5858  CD2 LEU B 626      74.545  88.729  39.838  1.00 32.12           C  
+ATOM   5859  N   ASP B 627      73.800  92.100  43.931  1.00 44.14           N  
+ATOM   5860  CA  ASP B 627      73.501  93.431  44.459  1.00 48.27           C  
+ATOM   5861  C   ASP B 627      74.465  94.495  43.903  1.00 50.64           C  
+ATOM   5862  O   ASP B 627      75.657  94.161  43.670  1.00 54.13           O  
+ATOM   5863  CB  ASP B 627      73.582  93.429  45.994  1.00 49.55           C  
+ATOM   5864  CG  ASP B 627      72.259  93.058  46.661  1.00 48.92           C  
+ATOM   5865  OD1 ASP B 627      71.836  93.789  47.591  1.00 47.20           O  
+ATOM   5866  OD2 ASP B 627      71.646  92.040  46.265  1.00 47.20           O  
+ATOM   5867  OXT ASP B 627      74.022  95.662  43.729  1.00 54.20           O  
+TER    5868      ASP B 627                                                      
+HETATM 5869 ZN    ZN A 700      30.663  53.669  11.494  1.00 56.10          ZN  
+HETATM 5870 ZN    ZN B 700      61.548  69.963  11.448  1.00 53.72          ZN  
+MASTER      304    0    2   44   14    0    0    6 5868    2    0   58          
+END                                                                             
diff --git a/data/carotid.vtk b/data/carotid.vtk
new file mode 100644
index 0000000..458ebab
--- /dev/null
+++ b/data/carotid.vtk
@@ -0,0 +1,111734 @@
+# vtk DataFile Version 1.0
+Carotid arteries with flow vectors and speed scalars
+ASCII
+DATASET STRUCTURED_POINTS
+DIMENSIONS 76 49 45
+ORIGIN 100.0 80.0 1.0
+ASPECT_RATIO 1.0 1.0 1.0
+
+POINT_DATA 167580
+SCALARS scalars float
+LOOKUP_TABLE default
+57.000000 50.000000 43.000000 42.000000 46.000000 51.000000 
+49.000000 47.000000 47.000000 46.000000 45.000000 46.000000 
+51.000000 57.000000 53.000000 42.000000 39.000000 46.000000 
+52.000000 53.000000 55.000000 59.000000 55.000000 40.000000 
+36.000000 46.000000 56.000000 66.000000 71.000000 71.000000 
+74.000000 72.000000 53.000000 29.000000 21.000000 30.000000 
+40.000000 45.000000 49.000000 55.000000 62.000000 64.000000 
+53.000000 37.000000 34.000000 36.000000 32.000000 28.000000 
+23.000000 20.000000 28.000000 51.000000 67.000000 68.000000 
+74.000000 81.000000 63.000000 27.000000 16.000000 24.000000 
+21.000000 14.000000 14.000000 22.000000 31.000000 39.000000 
+38.000000 31.000000 27.000000 30.000000 35.000000 33.000000 
+31.000000 41.000000 66.000000 90.000000 57.000000 55.000000 
+55.000000 59.000000 58.000000 52.000000 45.000000 43.000000 
+45.000000 46.000000 47.000000 55.000000 63.000000 60.000000 
+44.000000 30.000000 35.000000 58.000000 70.000000 67.000000 
+56.000000 44.000000 36.000000 41.000000 49.000000 57.000000 
+62.000000 62.000000 63.000000 62.000000 58.000000 59.000000 
+53.000000 36.000000 27.000000 37.000000 49.000000 55.000000 
+58.000000 64.000000 68.000000 62.000000 46.000000 33.000000 
+30.000000 28.000000 22.000000 17.000000 19.000000 28.000000 
+46.000000 69.000000 86.000000 88.000000 83.000000 68.000000 
+45.000000 39.000000 44.000000 36.000000 20.000000 10.000000 
+14.000000 21.000000 27.000000 39.000000 51.000000 51.000000 
+42.000000 36.000000 37.000000 39.000000 41.000000 46.000000 
+63.000000 85.000000 57.000000 53.000000 60.000000 71.000000 
+71.000000 62.000000 50.000000 43.000000 42.000000 45.000000 
+49.000000 51.000000 51.000000 47.000000 39.000000 30.000000 
+25.000000 39.000000 66.000000 82.000000 74.000000 47.000000 
+30.000000 37.000000 55.000000 68.000000 65.000000 49.000000 
+29.000000 27.000000 31.000000 31.000000 34.000000 33.000000 
+33.000000 36.000000 38.000000 39.000000 47.000000 55.000000 
+57.000000 47.000000 33.000000 24.000000 25.000000 26.000000 
+25.000000 29.000000 35.000000 43.000000 57.000000 80.000000 
+104.000000 113.000000 93.000000 59.000000 42.000000 51.000000 
+52.000000 36.000000 23.000000 22.000000 20.000000 16.000000 
+18.000000 36.000000 59.000000 69.000000 65.000000 59.000000 
+51.000000 42.000000 37.000000 45.000000 64.000000 85.000000 
+58.000000 60.000000 64.000000 61.000000 54.000000 51.000000 
+50.000000 47.000000 45.000000 47.000000 48.000000 44.000000 
+41.000000 43.000000 45.000000 40.000000 31.000000 33.000000 
+48.000000 62.000000 62.000000 52.000000 42.000000 43.000000 
+56.000000 74.000000 74.000000 59.000000 40.000000 25.000000 
+19.000000 23.000000 29.000000 34.000000 34.000000 28.000000 
+18.000000 16.000000 29.000000 40.000000 37.000000 27.000000 
+18.000000 19.000000 28.000000 36.000000 39.000000 38.000000 
+32.000000 41.000000 73.000000 103.000000 111.000000 103.000000 
+79.000000 53.000000 47.000000 48.000000 41.000000 31.000000 
+25.000000 26.000000 25.000000 24.000000 29.000000 41.000000 
+59.000000 79.000000 95.000000 98.000000 86.000000 69.000000 
+61.000000 67.000000 83.000000 98.000000 54.000000 56.000000 
+54.000000 50.000000 49.000000 52.000000 53.000000 48.000000 
+43.000000 41.000000 42.000000 43.000000 44.000000 47.000000 
+49.000000 47.000000 41.000000 34.000000 34.000000 45.000000 
+60.000000 62.000000 47.000000 34.000000 49.000000 75.000000 
+83.000000 72.000000 54.000000 38.000000 35.000000 38.000000 
+38.000000 38.000000 39.000000 32.000000 19.000000 17.000000 
+22.000000 26.000000 25.000000 21.000000 20.000000 25.000000 
+35.000000 48.000000 58.000000 51.000000 28.000000 31.000000 
+67.000000 104.000000 117.000000 98.000000 65.000000 44.000000 
+43.000000 43.000000 37.000000 32.000000 30.000000 30.000000 
+26.000000 19.000000 19.000000 30.000000 54.000000 83.000000 
+107.000000 112.000000 101.000000 85.000000 78.000000 83.000000 
+98.000000 112.000000 48.000000 49.000000 53.000000 56.000000 
+58.000000 57.000000 53.000000 46.000000 43.000000 43.000000 
+44.000000 44.000000 45.000000 47.000000 51.000000 52.000000 
+46.000000 37.000000 32.000000 33.000000 45.000000 55.000000 
+48.000000 30.000000 30.000000 45.000000 55.000000 55.000000 
+53.000000 55.000000 59.000000 57.000000 49.000000 45.000000 
+43.000000 38.000000 31.000000 31.000000 39.000000 41.000000 
+34.000000 27.000000 28.000000 31.000000 37.000000 51.000000 
+63.000000 60.000000 39.000000 36.000000 63.000000 89.000000 
+90.000000 68.000000 41.000000 30.000000 36.000000 43.000000 
+38.000000 30.000000 32.000000 37.000000 33.000000 24.000000 
+16.000000 16.000000 28.000000 51.000000 81.000000 104.000000 
+112.000000 108.000000 100.000000 97.000000 104.000000 113.000000 
+42.000000 42.000000 44.000000 48.000000 53.000000 54.000000 
+50.000000 46.000000 45.000000 44.000000 39.000000 33.000000 
+34.000000 40.000000 45.000000 47.000000 47.000000 47.000000 
+45.000000 39.000000 32.000000 30.000000 35.000000 39.000000 
+42.000000 45.000000 42.000000 39.000000 42.000000 50.000000 
+52.000000 49.000000 48.000000 53.000000 54.000000 46.000000 
+38.000000 40.000000 53.000000 59.000000 53.000000 44.000000 
+38.000000 30.000000 26.000000 37.000000 55.000000 61.000000 
+46.000000 33.000000 48.000000 69.000000 69.000000 54.000000 
+32.000000 16.000000 12.000000 14.000000 17.000000 23.000000 
+34.000000 35.000000 28.000000 26.000000 29.000000 28.000000 
+26.000000 38.000000 65.000000 93.000000 113.000000 121.000000 
+119.000000 111.000000 102.000000 100.000000 35.000000 35.000000 
+38.000000 40.000000 43.000000 45.000000 46.000000 47.000000 
+47.000000 45.000000 40.000000 34.000000 30.000000 30.000000 
+34.000000 42.000000 47.000000 48.000000 46.000000 43.000000 
+39.000000 33.000000 29.000000 31.000000 37.000000 43.000000 
+43.000000 45.000000 51.000000 54.000000 48.000000 40.000000 
+40.000000 48.000000 51.000000 45.000000 40.000000 42.000000 
+47.000000 48.000000 48.000000 49.000000 51.000000 43.000000 
+33.000000 41.000000 58.000000 65.000000 49.000000 31.000000 
+44.000000 70.000000 75.000000 55.000000 32.000000 18.000000 
+14.000000 14.000000 17.000000 25.000000 33.000000 33.000000 
+31.000000 34.000000 36.000000 30.000000 23.000000 32.000000 
+59.000000 87.000000 107.000000 116.000000 119.000000 116.000000 
+110.000000 104.000000 45.000000 45.000000 42.000000 40.000000 
+41.000000 44.000000 45.000000 43.000000 39.000000 37.000000 
+36.000000 37.000000 39.000000 43.000000 48.000000 47.000000 
+41.000000 38.000000 42.000000 46.000000 46.000000 40.000000 
+33.000000 29.000000 27.000000 24.000000 25.000000 32.000000 
+41.000000 46.000000 45.000000 42.000000 42.000000 49.000000 
+56.000000 54.000000 44.000000 39.000000 41.000000 54.000000 
+65.000000 61.000000 50.000000 38.000000 34.000000 49.000000 
+67.000000 68.000000 48.000000 37.000000 52.000000 76.000000 
+83.000000 66.000000 40.000000 27.000000 30.000000 36.000000 
+35.000000 30.000000 26.000000 25.000000 26.000000 30.000000 
+33.000000 28.000000 24.000000 35.000000 53.000000 70.000000 
+81.000000 93.000000 107.000000 121.000000 128.000000 126.000000 
+66.000000 58.000000 47.000000 42.000000 40.000000 43.000000 
+46.000000 44.000000 38.000000 35.000000 36.000000 38.000000 
+39.000000 41.000000 43.000000 42.000000 41.000000 44.000000 
+50.000000 54.000000 53.000000 50.000000 46.000000 43.000000 
+42.000000 38.000000 34.000000 32.000000 35.000000 41.000000 
+45.000000 44.000000 40.000000 44.000000 52.000000 53.000000 
+44.000000 36.000000 43.000000 59.000000 68.000000 62.000000 
+49.000000 38.000000 36.000000 43.000000 51.000000 51.000000 
+41.000000 43.000000 60.000000 78.000000 81.000000 66.000000 
+44.000000 34.000000 39.000000 43.000000 36.000000 26.000000 
+25.000000 27.000000 29.000000 31.000000 32.000000 30.000000 
+28.000000 29.000000 32.000000 36.000000 43.000000 59.000000 
+84.000000 107.000000 118.000000 118.000000 81.000000 59.000000 
+44.000000 43.000000 43.000000 44.000000 46.000000 43.000000 
+38.000000 36.000000 38.000000 41.000000 44.000000 49.000000 
+53.000000 50.000000 47.000000 51.000000 58.000000 61.000000 
+59.000000 58.000000 57.000000 54.000000 51.000000 50.000000 
+50.000000 50.000000 49.000000 48.000000 50.000000 50.000000 
+49.000000 50.000000 50.000000 46.000000 39.000000 38.000000 
+46.000000 55.000000 58.000000 56.000000 50.000000 41.000000 
+32.000000 35.000000 45.000000 49.000000 45.000000 48.000000 
+61.000000 70.000000 66.000000 50.000000 32.000000 32.000000 
+43.000000 42.000000 31.000000 25.000000 28.000000 32.000000 
+33.000000 33.000000 33.000000 30.000000 23.000000 19.000000 
+22.000000 29.000000 34.000000 40.000000 51.000000 67.000000 
+81.000000 88.000000 71.000000 56.000000 39.000000 29.000000 
+38.000000 54.000000 53.000000 45.000000 40.000000 37.000000 
+33.000000 33.000000 41.000000 53.000000 57.000000 53.000000 
+52.000000 59.000000 63.000000 58.000000 53.000000 57.000000 
+63.000000 63.000000 54.000000 46.000000 42.000000 41.000000 
+38.000000 37.000000 41.000000 50.000000 55.000000 54.000000 
+48.000000 40.000000 39.000000 45.000000 53.000000 57.000000 
+58.000000 58.000000 57.000000 49.000000 42.000000 48.000000 
+56.000000 50.000000 34.000000 37.000000 54.000000 64.000000 
+58.000000 36.000000 23.000000 32.000000 44.000000 40.000000 
+30.000000 27.000000 31.000000 33.000000 30.000000 29.000000 
+28.000000 26.000000 27.000000 32.000000 34.000000 28.000000 
+22.000000 26.000000 38.000000 47.000000 48.000000 48.000000 
+58.000000 57.000000 49.000000 22.000000 12.000000 36.000000 
+52.000000 48.000000 45.000000 43.000000 39.000000 36.000000 
+38.000000 42.000000 45.000000 46.000000 50.000000 55.000000 
+55.000000 54.000000 56.000000 60.000000 64.000000 64.000000 
+62.000000 56.000000 47.000000 39.000000 34.000000 35.000000 
+40.000000 47.000000 54.000000 57.000000 53.000000 44.000000 
+39.000000 42.000000 48.000000 55.000000 59.000000 60.000000 
+53.000000 45.000000 48.000000 57.000000 55.000000 35.000000 
+15.000000 31.000000 60.000000 72.000000 62.000000 36.000000 
+29.000000 40.000000 41.000000 31.000000 25.000000 27.000000 
+31.000000 31.000000 28.000000 29.000000 32.000000 29.000000 
+31.000000 38.000000 43.000000 40.000000 34.000000 37.000000 
+49.000000 54.000000 47.000000 37.000000 56.000000 56.000000 
+61.000000 53.000000 32.000000 21.000000 31.000000 48.000000 
+54.000000 54.000000 49.000000 42.000000 38.000000 38.000000 
+41.000000 44.000000 45.000000 44.000000 46.000000 53.000000 
+60.000000 65.000000 67.000000 68.000000 65.000000 58.000000 
+48.000000 43.000000 45.000000 49.000000 51.000000 51.000000 
+55.000000 58.000000 54.000000 44.000000 38.000000 44.000000 
+56.000000 64.000000 64.000000 55.000000 43.000000 38.000000 
+45.000000 50.000000 39.000000 18.000000 19.000000 46.000000 
+71.000000 76.000000 55.000000 29.000000 27.000000 38.000000 
+37.000000 29.000000 28.000000 35.000000 37.000000 33.000000 
+29.000000 29.000000 29.000000 24.000000 20.000000 28.000000 
+44.000000 56.000000 60.000000 57.000000 55.000000 55.000000 
+55.000000 50.000000 55.000000 55.000000 60.000000 68.000000 
+63.000000 40.000000 22.000000 25.000000 44.000000 55.000000 
+53.000000 47.000000 42.000000 38.000000 38.000000 41.000000 
+42.000000 43.000000 46.000000 47.000000 47.000000 52.000000 
+60.000000 63.000000 58.000000 47.000000 38.000000 38.000000 
+45.000000 52.000000 54.000000 52.000000 49.000000 46.000000 
+44.000000 44.000000 45.000000 47.000000 54.000000 59.000000 
+53.000000 41.000000 34.000000 39.000000 53.000000 57.000000 
+37.000000 20.000000 38.000000 69.000000 85.000000 74.000000 
+37.000000 16.000000 27.000000 39.000000 35.000000 27.000000 
+29.000000 40.000000 42.000000 34.000000 28.000000 30.000000 
+31.000000 27.000000 24.000000 30.000000 43.000000 51.000000 
+52.000000 50.000000 51.000000 54.000000 55.000000 51.000000 
+53.000000 55.000000 52.000000 53.000000 56.000000 47.000000 
+18.000000 5.000000 27.000000 32.000000 33.000000 42.000000 
+47.000000 44.000000 37.000000 33.000000 33.000000 34.000000 
+36.000000 37.000000 35.000000 35.000000 41.000000 49.000000 
+50.000000 45.000000 41.000000 44.000000 49.000000 55.000000 
+59.000000 59.000000 54.000000 49.000000 49.000000 53.000000 
+55.000000 48.000000 42.000000 43.000000 47.000000 54.000000 
+60.000000 63.000000 69.000000 63.000000 44.000000 46.000000 
+64.000000 78.000000 79.000000 49.000000 16.000000 19.000000 
+36.000000 41.000000 33.000000 21.000000 21.000000 34.000000 
+43.000000 40.000000 35.000000 35.000000 38.000000 39.000000 
+40.000000 43.000000 44.000000 41.000000 39.000000 44.000000 
+53.000000 60.000000 59.000000 52.000000 46.000000 43.000000 
+41.000000 44.000000 44.000000 30.000000 16.000000 26.000000 
+33.000000 24.000000 31.000000 43.000000 39.000000 32.000000 
+32.000000 33.000000 33.000000 34.000000 35.000000 35.000000 
+33.000000 28.000000 25.000000 27.000000 34.000000 43.000000 
+51.000000 54.000000 53.000000 52.000000 54.000000 58.000000 
+59.000000 57.000000 58.000000 60.000000 58.000000 49.000000 
+41.000000 41.000000 53.000000 73.000000 82.000000 77.000000 
+63.000000 44.000000 40.000000 59.000000 72.000000 67.000000 
+50.000000 21.000000 20.000000 42.000000 50.000000 48.000000 
+43.000000 35.000000 31.000000 32.000000 39.000000 49.000000 
+53.000000 49.000000 41.000000 37.000000 41.000000 45.000000 
+41.000000 37.000000 41.000000 51.000000 58.000000 58.000000 
+55.000000 52.000000 51.000000 47.000000 42.000000 38.000000 
+34.000000 27.000000 32.000000 43.000000 35.000000 27.000000 
+35.000000 39.000000 28.000000 17.000000 22.000000 28.000000 
+28.000000 32.000000 28.000000 21.000000 19.000000 26.000000 
+30.000000 29.000000 30.000000 38.000000 47.000000 52.000000 
+52.000000 47.000000 39.000000 40.000000 50.000000 57.000000 
+52.000000 45.000000 44.000000 51.000000 57.000000 51.000000 
+44.000000 46.000000 53.000000 44.000000 27.000000 23.000000 
+42.000000 67.000000 79.000000 71.000000 49.000000 24.000000 
+25.000000 39.000000 47.000000 51.000000 52.000000 47.000000 
+41.000000 36.000000 38.000000 50.000000 58.000000 54.000000 
+42.000000 35.000000 37.000000 41.000000 42.000000 41.000000 
+42.000000 47.000000 49.000000 49.000000 48.000000 50.000000 
+47.000000 51.000000 49.000000 41.000000 35.000000 35.000000 
+37.000000 34.000000 27.000000 20.000000 22.000000 29.000000 
+28.000000 18.000000 11.000000 13.000000 13.000000 17.000000 
+16.000000 12.000000 14.000000 24.000000 33.000000 34.000000 
+31.000000 31.000000 36.000000 46.000000 59.000000 63.000000 
+55.000000 48.000000 50.000000 54.000000 52.000000 46.000000 
+45.000000 58.000000 75.000000 76.000000 56.000000 32.000000 
+24.000000 32.000000 45.000000 57.000000 66.000000 71.000000 
+74.000000 72.000000 61.000000 34.000000 24.000000 38.000000 
+44.000000 43.000000 44.000000 37.000000 27.000000 31.000000 
+45.000000 54.000000 51.000000 43.000000 41.000000 44.000000 
+44.000000 39.000000 36.000000 38.000000 43.000000 47.000000 
+48.000000 48.000000 47.000000 46.000000 46.000000 48.000000 
+50.000000 50.000000 49.000000 45.000000 40.000000 33.000000 
+23.000000 13.000000 22.000000 41.000000 43.000000 28.000000 
+13.000000 13.000000 26.000000 34.000000 33.000000 23.000000 
+15.000000 18.000000 27.000000 34.000000 37.000000 37.000000 
+39.000000 48.000000 60.000000 69.000000 70.000000 65.000000 
+58.000000 54.000000 56.000000 61.000000 67.000000 75.000000 
+89.000000 95.000000 81.000000 55.000000 42.000000 55.000000 
+83.000000 97.000000 90.000000 72.000000 60.000000 57.000000 
+55.000000 36.000000 28.000000 50.000000 59.000000 42.000000 
+32.000000 32.000000 28.000000 31.000000 42.000000 49.000000 
+43.000000 36.000000 38.000000 44.000000 43.000000 35.000000 
+31.000000 36.000000 45.000000 49.000000 49.000000 49.000000 
+48.000000 47.000000 52.000000 49.000000 48.000000 52.000000 
+57.000000 57.000000 49.000000 38.000000 25.000000 17.000000 
+25.000000 42.000000 42.000000 24.000000 6.000000 5.000000 
+21.000000 37.000000 33.000000 17.000000 8.000000 10.000000 
+20.000000 27.000000 30.000000 34.000000 44.000000 55.000000 
+61.000000 61.000000 64.000000 68.000000 66.000000 58.000000 
+53.000000 61.000000 74.000000 83.000000 88.000000 91.000000 
+90.000000 84.000000 77.000000 74.000000 76.000000 81.000000 
+79.000000 67.000000 52.000000 48.000000 51.000000 46.000000 
+41.000000 55.000000 67.000000 52.000000 33.000000 31.000000 
+38.000000 41.000000 39.000000 38.000000 35.000000 28.000000 
+21.000000 20.000000 28.000000 36.000000 40.000000 41.000000 
+43.000000 46.000000 48.000000 49.000000 49.000000 49.000000 
+51.000000 50.000000 53.000000 61.000000 68.000000 66.000000 
+52.000000 35.000000 30.000000 30.000000 24.000000 25.000000 
+33.000000 33.000000 30.000000 29.000000 28.000000 28.000000 
+20.000000 8.000000 6.000000 9.000000 13.000000 12.000000 
+12.000000 25.000000 42.000000 52.000000 53.000000 55.000000 
+64.000000 72.000000 70.000000 60.000000 52.000000 54.000000 
+62.000000 70.000000 75.000000 82.000000 88.000000 86.000000 
+79.000000 73.000000 66.000000 58.000000 53.000000 46.000000 
+35.000000 32.000000 38.000000 47.000000 57.000000 65.000000 
+67.000000 59.000000 46.000000 37.000000 37.000000 42.000000 
+44.000000 39.000000 28.000000 16.000000 14.000000 21.000000 
+21.000000 23.000000 34.000000 41.000000 43.000000 45.000000 
+48.000000 52.000000 53.000000 49.000000 58.000000 64.000000 
+70.000000 72.000000 73.000000 72.000000 63.000000 45.000000 
+30.000000 26.000000 33.000000 51.000000 90.000000 129.000000 
+131.000000 101.000000 67.000000 44.000000 25.000000 9.000000 
+9.000000 12.000000 15.000000 15.000000 17.000000 31.000000 
+42.000000 43.000000 40.000000 42.000000 51.000000 59.000000 
+62.000000 60.000000 56.000000 53.000000 55.000000 61.000000 
+65.000000 65.000000 62.000000 58.000000 56.000000 56.000000 
+55.000000 51.000000 46.000000 41.000000 32.000000 15.000000 
+13.000000 39.000000 68.000000 79.000000 71.000000 56.000000 
+46.000000 42.000000 39.000000 39.000000 45.000000 47.000000 
+30.000000 12.000000 26.000000 45.000000 35.000000 25.000000 
+28.000000 33.000000 38.000000 44.000000 49.000000 54.000000 
+55.000000 48.000000 69.000000 72.000000 73.000000 74.000000 
+74.000000 72.000000 70.000000 60.000000 31.000000 17.000000 
+61.000000 105.000000 143.000000 170.000000 156.000000 115.000000 
+76.000000 47.000000 23.000000 14.000000 16.000000 13.000000 
+13.000000 14.000000 14.000000 15.000000 27.000000 38.000000 
+39.000000 32.000000 27.000000 33.000000 45.000000 54.000000 
+58.000000 58.000000 55.000000 47.000000 40.000000 38.000000 
+42.000000 44.000000 41.000000 36.000000 36.000000 37.000000 
+32.000000 29.000000 27.000000 15.000000 10.000000 24.000000 
+44.000000 60.000000 63.000000 56.000000 46.000000 41.000000 
+43.000000 45.000000 47.000000 47.000000 35.000000 16.000000 
+28.000000 61.000000 68.000000 56.000000 39.000000 33.000000 
+38.000000 47.000000 53.000000 55.000000 55.000000 51.000000 
+77.000000 72.000000 74.000000 83.000000 87.000000 77.000000 
+61.000000 40.000000 21.000000 43.000000 100.000000 125.000000 
+118.000000 105.000000 97.000000 91.000000 74.000000 41.000000 
+16.000000 15.000000 16.000000 14.000000 10.000000 10.000000 
+13.000000 12.000000 18.000000 26.000000 26.000000 22.000000 
+19.000000 22.000000 29.000000 36.000000 42.000000 46.000000 
+40.000000 32.000000 29.000000 26.000000 30.000000 34.000000 
+32.000000 27.000000 22.000000 16.000000 10.000000 13.000000 
+25.000000 34.000000 29.000000 17.000000 11.000000 19.000000 
+39.000000 59.000000 65.000000 53.000000 43.000000 43.000000 
+43.000000 40.000000 34.000000 13.000000 19.000000 66.000000 
+79.000000 63.000000 44.000000 37.000000 37.000000 38.000000 
+44.000000 54.000000 66.000000 71.000000 79.000000 85.000000 
+92.000000 92.000000 77.000000 49.000000 28.000000 19.000000 
+33.000000 86.000000 121.000000 120.000000 99.000000 84.000000 
+84.000000 81.000000 57.000000 25.000000 8.000000 6.000000 
+11.000000 15.000000 12.000000 9.000000 15.000000 23.000000 
+24.000000 27.000000 30.000000 29.000000 23.000000 20.000000 
+26.000000 32.000000 32.000000 28.000000 22.000000 27.000000 
+32.000000 25.000000 18.000000 18.000000 22.000000 18.000000 
+15.000000 15.000000 10.000000 16.000000 36.000000 47.000000 
+45.000000 45.000000 50.000000 52.000000 53.000000 54.000000 
+60.000000 61.000000 48.000000 37.000000 38.000000 45.000000 
+45.000000 18.000000 11.000000 50.000000 64.000000 54.000000 
+38.000000 31.000000 32.000000 36.000000 41.000000 53.000000 
+72.000000 86.000000 87.000000 93.000000 90.000000 72.000000 
+44.000000 18.000000 12.000000 35.000000 68.000000 98.000000 
+114.000000 111.000000 95.000000 81.000000 73.000000 62.000000 
+42.000000 20.000000 7.000000 11.000000 21.000000 29.000000 
+26.000000 16.000000 12.000000 15.000000 25.000000 39.000000 
+45.000000 39.000000 29.000000 28.000000 34.000000 38.000000 
+33.000000 24.000000 25.000000 31.000000 33.000000 27.000000 
+20.000000 14.000000 9.000000 7.000000 15.000000 21.000000 
+9.000000 12.000000 32.000000 44.000000 44.000000 49.000000 
+66.000000 84.000000 86.000000 67.000000 50.000000 51.000000 
+61.000000 60.000000 49.000000 47.000000 49.000000 32.000000 
+11.000000 22.000000 37.000000 33.000000 22.000000 18.000000 
+24.000000 30.000000 32.000000 38.000000 55.000000 80.000000 
+76.000000 72.000000 62.000000 43.000000 23.000000 18.000000 
+28.000000 48.000000 73.000000 91.000000 91.000000 74.000000 
+55.000000 46.000000 45.000000 45.000000 35.000000 18.000000 
+9.000000 17.000000 29.000000 37.000000 34.000000 24.000000 
+14.000000 12.000000 22.000000 29.000000 34.000000 34.000000 
+34.000000 34.000000 29.000000 26.000000 26.000000 28.000000 
+33.000000 39.000000 39.000000 28.000000 18.000000 12.000000 
+8.000000 19.000000 28.000000 23.000000 11.000000 17.000000 
+34.000000 46.000000 50.000000 51.000000 58.000000 80.000000 
+111.000000 128.000000 106.000000 65.000000 52.000000 60.000000 
+55.000000 38.000000 31.000000 35.000000 25.000000 12.000000 
+15.000000 15.000000 15.000000 17.000000 20.000000 22.000000 
+17.000000 15.000000 38.000000 71.000000 45.000000 41.000000 
+35.000000 26.000000 16.000000 15.000000 29.000000 55.000000 
+76.000000 79.000000 60.000000 33.000000 15.000000 16.000000 
+29.000000 40.000000 37.000000 21.000000 8.000000 10.000000 
+15.000000 23.000000 25.000000 19.000000 11.000000 10.000000 
+20.000000 30.000000 37.000000 40.000000 39.000000 33.000000 
+26.000000 22.000000 22.000000 23.000000 25.000000 30.000000 
+33.000000 32.000000 29.000000 24.000000 23.000000 23.000000 
+21.000000 21.000000 16.000000 16.000000 28.000000 39.000000 
+46.000000 57.000000 68.000000 80.000000 106.000000 144.000000 
+165.000000 146.000000 95.000000 56.000000 44.000000 36.000000 
+29.000000 32.000000 37.000000 32.000000 27.000000 31.000000 
+43.000000 52.000000 47.000000 26.000000 8.000000 16.000000 
+55.000000 86.000000 23.000000 16.000000 9.000000 10.000000 
+19.000000 31.000000 54.000000 75.000000 81.000000 71.000000 
+52.000000 34.000000 25.000000 34.000000 54.000000 66.000000 
+60.000000 40.000000 24.000000 22.000000 26.000000 28.000000 
+24.000000 19.000000 16.000000 16.000000 23.000000 32.000000 
+36.000000 36.000000 33.000000 29.000000 26.000000 23.000000 
+21.000000 21.000000 21.000000 19.000000 23.000000 36.000000 
+49.000000 48.000000 33.000000 20.000000 19.000000 25.000000 
+25.000000 22.000000 22.000000 25.000000 32.000000 47.000000 
+67.000000 82.000000 93.000000 113.000000 144.000000 164.000000 
+155.000000 116.000000 65.000000 32.000000 32.000000 41.000000 
+36.000000 31.000000 29.000000 33.000000 51.000000 69.000000 
+56.000000 20.000000 30.000000 69.000000 90.000000 105.000000 
+22.000000 22.000000 27.000000 39.000000 49.000000 52.000000 
+61.000000 70.000000 71.000000 63.000000 53.000000 48.000000 
+51.000000 57.000000 60.000000 58.000000 51.000000 40.000000 
+35.000000 34.000000 31.000000 25.000000 18.000000 13.000000 
+11.000000 14.000000 18.000000 22.000000 28.000000 31.000000 
+30.000000 25.000000 22.000000 24.000000 22.000000 18.000000 
+13.000000 12.000000 19.000000 30.000000 38.000000 36.000000 
+28.000000 24.000000 29.000000 38.000000 44.000000 39.000000 
+28.000000 27.000000 39.000000 51.000000 60.000000 71.000000 
+81.000000 87.000000 98.000000 126.000000 164.000000 177.000000 
+134.000000 53.000000 15.000000 37.000000 47.000000 31.000000 
+21.000000 33.000000 53.000000 59.000000 34.000000 27.000000 
+89.000000 118.000000 123.000000 111.000000 47.000000 43.000000 
+43.000000 48.000000 51.000000 45.000000 40.000000 41.000000 
+46.000000 50.000000 51.000000 49.000000 44.000000 34.000000 
+25.000000 25.000000 25.000000 23.000000 30.000000 33.000000 
+26.000000 22.000000 25.000000 24.000000 19.000000 15.000000 
+15.000000 20.000000 27.000000 30.000000 29.000000 25.000000 
+25.000000 27.000000 26.000000 20.000000 11.000000 10.000000 
+19.000000 30.000000 36.000000 35.000000 29.000000 24.000000 
+23.000000 30.000000 36.000000 35.000000 31.000000 36.000000 
+47.000000 55.000000 53.000000 49.000000 55.000000 71.000000 
+87.000000 106.000000 141.000000 174.000000 171.000000 122.000000 
+42.000000 10.000000 40.000000 32.000000 21.000000 37.000000 
+41.000000 37.000000 39.000000 73.000000 120.000000 139.000000 
+125.000000 101.000000 62.000000 49.000000 44.000000 37.000000 
+26.000000 21.000000 29.000000 41.000000 44.000000 40.000000 
+34.000000 31.000000 27.000000 22.000000 28.000000 41.000000 
+40.000000 32.000000 34.000000 36.000000 33.000000 31.000000 
+29.000000 27.000000 19.000000 11.000000 9.000000 20.000000 
+26.000000 22.000000 18.000000 18.000000 20.000000 21.000000 
+21.000000 18.000000 17.000000 17.000000 26.000000 38.000000 
+40.000000 30.000000 22.000000 24.000000 31.000000 34.000000 
+33.000000 35.000000 42.000000 47.000000 49.000000 49.000000 
+47.000000 43.000000 45.000000 58.000000 76.000000 93.000000 
+117.000000 153.000000 181.000000 167.000000 99.000000 27.000000 
+23.000000 37.000000 28.000000 49.000000 64.000000 56.000000 
+47.000000 55.000000 84.000000 114.000000 113.000000 92.000000 
+55.000000 60.000000 56.000000 41.000000 28.000000 26.000000 
+33.000000 38.000000 35.000000 31.000000 30.000000 38.000000 
+47.000000 47.000000 39.000000 32.000000 33.000000 38.000000 
+48.000000 51.000000 47.000000 37.000000 25.000000 20.000000 
+19.000000 17.000000 20.000000 25.000000 29.000000 31.000000 
+30.000000 31.000000 31.000000 26.000000 21.000000 17.000000 
+16.000000 17.000000 23.000000 33.000000 37.000000 32.000000 
+27.000000 25.000000 28.000000 33.000000 39.000000 47.000000 
+55.000000 61.000000 62.000000 53.000000 35.000000 21.000000 
+28.000000 47.000000 62.000000 76.000000 98.000000 133.000000 
+161.000000 153.000000 103.000000 39.000000 21.000000 36.000000 
+31.000000 38.000000 50.000000 53.000000 46.000000 33.000000 
+37.000000 71.000000 95.000000 87.000000 48.000000 56.000000 
+53.000000 45.000000 38.000000 31.000000 25.000000 21.000000 
+21.000000 26.000000 35.000000 45.000000 47.000000 38.000000 
+25.000000 22.000000 31.000000 39.000000 48.000000 54.000000 
+50.000000 40.000000 28.000000 19.000000 17.000000 17.000000 
+16.000000 18.000000 31.000000 44.000000 49.000000 48.000000 
+45.000000 41.000000 39.000000 36.000000 32.000000 31.000000 
+31.000000 30.000000 25.000000 22.000000 27.000000 32.000000 
+35.000000 37.000000 44.000000 56.000000 64.000000 63.000000 
+56.000000 46.000000 33.000000 12.000000 20.000000 50.000000 
+63.000000 60.000000 63.000000 87.000000 121.000000 132.000000 
+104.000000 57.000000 40.000000 53.000000 49.000000 35.000000 
+26.000000 25.000000 33.000000 39.000000 32.000000 30.000000 
+53.000000 62.000000 47.000000 52.000000 55.000000 57.000000 
+52.000000 38.000000 24.000000 18.000000 20.000000 25.000000 
+28.000000 27.000000 26.000000 28.000000 35.000000 42.000000 
+40.000000 35.000000 34.000000 34.000000 32.000000 27.000000 
+22.000000 20.000000 21.000000 27.000000 32.000000 39.000000 
+46.000000 48.000000 45.000000 41.000000 41.000000 43.000000 
+43.000000 39.000000 39.000000 42.000000 39.000000 30.000000 
+21.000000 20.000000 25.000000 29.000000 31.000000 34.000000 
+39.000000 48.000000 53.000000 48.000000 39.000000 35.000000 
+35.000000 36.000000 41.000000 53.000000 59.000000 55.000000 
+51.000000 53.000000 67.000000 86.000000 87.000000 63.000000 
+52.000000 79.000000 92.000000 70.000000 32.000000 7.000000 
+10.000000 26.000000 46.000000 50.000000 48.000000 50.000000 
+56.000000 49.000000 36.000000 28.000000 25.000000 25.000000 
+23.000000 22.000000 22.000000 20.000000 15.000000 14.000000 
+28.000000 43.000000 44.000000 36.000000 29.000000 25.000000 
+28.000000 29.000000 25.000000 21.000000 23.000000 31.000000 
+37.000000 45.000000 48.000000 44.000000 37.000000 33.000000 
+33.000000 37.000000 41.000000 45.000000 45.000000 37.000000 
+33.000000 40.000000 45.000000 42.000000 37.000000 32.000000 
+29.000000 31.000000 35.000000 38.000000 36.000000 39.000000 
+46.000000 45.000000 37.000000 33.000000 34.000000 33.000000 
+27.000000 27.000000 34.000000 44.000000 49.000000 45.000000 
+43.000000 52.000000 58.000000 46.000000 42.000000 80.000000 
+122.000000 125.000000 82.000000 33.000000 16.000000 22.000000 
+42.000000 51.000000 49.000000 45.000000 44.000000 38.000000 
+29.000000 23.000000 25.000000 33.000000 37.000000 38.000000 
+38.000000 32.000000 18.000000 11.000000 21.000000 32.000000 
+36.000000 37.000000 37.000000 38.000000 38.000000 33.000000 
+29.000000 31.000000 41.000000 52.000000 56.000000 51.000000 
+40.000000 33.000000 39.000000 52.000000 64.000000 72.000000 
+80.000000 95.000000 113.000000 122.000000 110.000000 83.000000 
+66.000000 62.000000 55.000000 44.000000 40.000000 44.000000 
+43.000000 36.000000 34.000000 42.000000 52.000000 46.000000 
+26.000000 20.000000 34.000000 47.000000 42.000000 26.000000 
+20.000000 31.000000 44.000000 45.000000 34.000000 26.000000 
+28.000000 30.000000 36.000000 71.000000 124.000000 157.000000 
+153.000000 115.000000 58.000000 21.000000 27.000000 39.000000 
+44.000000 41.000000 33.000000 34.000000 34.000000 31.000000 
+32.000000 35.000000 38.000000 41.000000 43.000000 40.000000 
+30.000000 17.000000 15.000000 24.000000 33.000000 37.000000 
+37.000000 38.000000 43.000000 48.000000 49.000000 49.000000 
+51.000000 51.000000 47.000000 39.000000 34.000000 39.000000 
+48.000000 56.000000 65.000000 68.000000 63.000000 62.000000 
+87.000000 134.000000 169.000000 157.000000 106.000000 68.000000 
+57.000000 53.000000 53.000000 55.000000 49.000000 36.000000 
+23.000000 26.000000 39.000000 48.000000 51.000000 46.000000 
+44.000000 47.000000 45.000000 37.000000 32.000000 33.000000 
+40.000000 48.000000 44.000000 22.000000 14.000000 28.000000 
+41.000000 53.000000 82.000000 125.000000 166.000000 178.000000 
+150.000000 98.000000 48.000000 17.000000 18.000000 32.000000 
+36.000000 36.000000 39.000000 39.000000 36.000000 35.000000 
+40.000000 43.000000 43.000000 40.000000 36.000000 32.000000 
+30.000000 30.000000 31.000000 31.000000 30.000000 34.000000 
+46.000000 66.000000 77.000000 75.000000 65.000000 55.000000 
+47.000000 44.000000 56.000000 71.000000 73.000000 65.000000 
+62.000000 66.000000 66.000000 64.000000 77.000000 120.000000 
+167.000000 176.000000 136.000000 82.000000 63.000000 68.000000 
+66.000000 61.000000 62.000000 67.000000 63.000000 53.000000 
+48.000000 50.000000 50.000000 45.000000 41.000000 39.000000 
+39.000000 39.000000 45.000000 49.000000 45.000000 44.000000 
+48.000000 39.000000 18.000000 17.000000 45.000000 73.000000 
+84.000000 88.000000 107.000000 143.000000 166.000000 146.000000 
+91.000000 53.000000 47.000000 44.000000 43.000000 47.000000 
+48.000000 46.000000 41.000000 37.000000 37.000000 42.000000 
+45.000000 42.000000 41.000000 45.000000 45.000000 38.000000 
+24.000000 13.000000 15.000000 39.000000 59.000000 74.000000 
+84.000000 83.000000 71.000000 59.000000 58.000000 69.000000 
+78.000000 78.000000 73.000000 68.000000 64.000000 61.000000 
+61.000000 70.000000 92.000000 124.000000 153.000000 160.000000 
+143.000000 108.000000 75.000000 70.000000 80.000000 87.000000 
+86.000000 80.000000 70.000000 58.000000 49.000000 47.000000 
+51.000000 56.000000 59.000000 59.000000 54.000000 49.000000 
+46.000000 43.000000 39.000000 40.000000 53.000000 63.000000 
+45.000000 17.000000 29.000000 62.000000 88.000000 131.000000 
+149.000000 120.000000 104.000000 102.000000 71.000000 69.000000 
+99.000000 86.000000 43.000000 43.000000 43.000000 42.000000 
+40.000000 38.000000 39.000000 44.000000 47.000000 44.000000 
+41.000000 43.000000 45.000000 34.000000 13.000000 8.000000 
+26.000000 45.000000 68.000000 82.000000 86.000000 83.000000 
+79.000000 78.000000 80.000000 80.000000 79.000000 78.000000 
+79.000000 78.000000 74.000000 68.000000 61.000000 62.000000 
+79.000000 113.000000 143.000000 156.000000 151.000000 129.000000 
+101.000000 90.000000 97.000000 103.000000 97.000000 82.000000 
+63.000000 50.000000 47.000000 49.000000 48.000000 42.000000 
+36.000000 34.000000 39.000000 44.000000 48.000000 51.000000 
+48.000000 38.000000 36.000000 42.000000 42.000000 32.000000 
+13.000000 23.000000 92.000000 140.000000 106.000000 49.000000 
+94.000000 152.000000 145.000000 123.000000 94.000000 51.000000 
+38.000000 37.000000 38.000000 38.000000 38.000000 39.000000 
+42.000000 42.000000 41.000000 43.000000 51.000000 59.000000 
+56.000000 33.000000 12.000000 29.000000 53.000000 73.000000 
+95.000000 103.000000 95.000000 86.000000 88.000000 92.000000 
+90.000000 87.000000 90.000000 94.000000 93.000000 86.000000 
+80.000000 79.000000 79.000000 74.000000 67.000000 79.000000 
+106.000000 128.000000 135.000000 126.000000 108.000000 93.000000 
+93.000000 101.000000 103.000000 92.000000 73.000000 56.000000 
+47.000000 42.000000 40.000000 41.000000 39.000000 34.000000 
+31.000000 33.000000 39.000000 43.000000 44.000000 42.000000 
+38.000000 33.000000 33.000000 43.000000 54.000000 47.000000 
+45.000000 63.000000 38.000000 22.000000 97.000000 140.000000 
+136.000000 111.000000 81.000000 45.000000 38.000000 42.000000 
+43.000000 42.000000 41.000000 39.000000 37.000000 36.000000 
+37.000000 42.000000 49.000000 55.000000 49.000000 30.000000 
+30.000000 59.000000 82.000000 100.000000 107.000000 102.000000 
+96.000000 97.000000 98.000000 94.000000 92.000000 94.000000 
+95.000000 94.000000 92.000000 90.000000 88.000000 89.000000 
+91.000000 89.000000 77.000000 68.000000 76.000000 93.000000 
+102.000000 101.000000 97.000000 100.000000 109.000000 117.000000 
+118.000000 111.000000 95.000000 72.000000 49.000000 31.000000 
+24.000000 27.000000 31.000000 34.000000 34.000000 34.000000 
+33.000000 33.000000 38.000000 43.000000 40.000000 31.000000 
+27.000000 35.000000 52.000000 64.000000 56.000000 29.000000 
+13.000000 32.000000 67.000000 98.000000 108.000000 92.000000 
+65.000000 40.000000 44.000000 44.000000 43.000000 42.000000 
+38.000000 31.000000 28.000000 32.000000 38.000000 42.000000 
+46.000000 51.000000 45.000000 37.000000 55.000000 85.000000 
+104.000000 114.000000 111.000000 103.000000 103.000000 106.000000 
+103.000000 94.000000 89.000000 90.000000 93.000000 91.000000 
+85.000000 80.000000 80.000000 86.000000 95.000000 97.000000 
+91.000000 77.000000 65.000000 65.000000 68.000000 70.000000 
+73.000000 87.000000 111.000000 138.000000 154.000000 153.000000 
+134.000000 100.000000 65.000000 41.000000 29.000000 25.000000 
+28.000000 28.000000 27.000000 31.000000 34.000000 36.000000 
+41.000000 44.000000 42.000000 39.000000 38.000000 39.000000 
+43.000000 48.000000 51.000000 48.000000 39.000000 38.000000 
+50.000000 64.000000 78.000000 81.000000 71.000000 54.000000 
+42.000000 44.000000 41.000000 37.000000 35.000000 37.000000 
+40.000000 42.000000 43.000000 46.000000 49.000000 43.000000 
+35.000000 49.000000 77.000000 99.000000 114.000000 117.000000 
+112.000000 108.000000 108.000000 106.000000 100.000000 96.000000 
+93.000000 90.000000 89.000000 90.000000 91.000000 88.000000 
+82.000000 81.000000 86.000000 91.000000 94.000000 92.000000 
+88.000000 84.000000 83.000000 83.000000 80.000000 80.000000 
+94.000000 126.000000 164.000000 183.000000 170.000000 130.000000 
+81.000000 41.000000 19.000000 17.000000 23.000000 17.000000 
+8.000000 17.000000 36.000000 44.000000 38.000000 34.000000 
+41.000000 48.000000 45.000000 38.000000 40.000000 48.000000 
+50.000000 44.000000 37.000000 35.000000 41.000000 54.000000 
+71.000000 82.000000 78.000000 63.000000 39.000000 38.000000 
+38.000000 38.000000 37.000000 40.000000 45.000000 51.000000 
+53.000000 49.000000 38.000000 38.000000 64.000000 93.000000 
+105.000000 107.000000 109.000000 112.000000 113.000000 111.000000 
+105.000000 96.000000 91.000000 91.000000 90.000000 87.000000 
+85.000000 87.000000 89.000000 89.000000 87.000000 88.000000 
+91.000000 96.000000 100.000000 99.000000 95.000000 88.000000 
+85.000000 86.000000 88.000000 86.000000 84.000000 98.000000 
+132.000000 169.000000 177.000000 148.000000 96.000000 50.000000 
+17.000000 12.000000 20.000000 16.000000 11.000000 11.000000 
+23.000000 37.000000 38.000000 37.000000 41.000000 46.000000 
+44.000000 42.000000 45.000000 51.000000 52.000000 47.000000 
+42.000000 41.000000 43.000000 49.000000 59.000000 65.000000 
+62.000000 51.000000 47.000000 48.000000 42.000000 34.000000 
+31.000000 36.000000 46.000000 56.000000 58.000000 44.000000 
+37.000000 62.000000 93.000000 107.000000 108.000000 105.000000 
+104.000000 106.000000 105.000000 98.000000 92.000000 90.000000 
+94.000000 97.000000 99.000000 98.000000 96.000000 95.000000 
+93.000000 91.000000 89.000000 90.000000 91.000000 91.000000 
+91.000000 91.000000 92.000000 91.000000 88.000000 86.000000 
+88.000000 87.000000 80.000000 78.000000 101.000000 142.000000 
+170.000000 161.000000 119.000000 72.000000 37.000000 13.000000 
+10.000000 20.000000 24.000000 23.000000 29.000000 40.000000 
+42.000000 38.000000 38.000000 45.000000 51.000000 52.000000 
+51.000000 52.000000 51.000000 46.000000 41.000000 43.000000 
+47.000000 50.000000 51.000000 52.000000 51.000000 43.000000 
+44.000000 38.000000 35.000000 38.000000 43.000000 49.000000 
+56.000000 57.000000 47.000000 44.000000 64.000000 93.000000 
+114.000000 122.000000 118.000000 111.000000 109.000000 108.000000 
+106.000000 101.000000 96.000000 93.000000 92.000000 94.000000 
+96.000000 95.000000 93.000000 92.000000 94.000000 95.000000 
+94.000000 93.000000 93.000000 92.000000 89.000000 87.000000 
+88.000000 91.000000 91.000000 88.000000 86.000000 85.000000 
+83.000000 82.000000 92.000000 122.000000 152.000000 154.000000 
+126.000000 86.000000 53.000000 19.000000 10.000000 26.000000 
+33.000000 31.000000 29.000000 30.000000 30.000000 29.000000 
+37.000000 51.000000 57.000000 53.000000 47.000000 46.000000 
+46.000000 43.000000 42.000000 48.000000 60.000000 64.000000 
+60.000000 50.000000 42.000000 48.000000 44.000000 42.000000 
+40.000000 44.000000 49.000000 47.000000 40.000000 37.000000 
+40.000000 43.000000 44.000000 43.000000 40.000000 35.000000 
+28.000000 22.000000 23.000000 33.000000 46.000000 51.000000 
+52.000000 54.000000 44.000000 20.000000 15.000000 20.000000 
+11.000000 6.000000 21.000000 46.000000 62.000000 57.000000 
+38.000000 20.000000 18.000000 18.000000 17.000000 24.000000 
+36.000000 45.000000 50.000000 46.000000 32.000000 21.000000 
+21.000000 29.000000 42.000000 55.000000 62.000000 59.000000 
+54.000000 56.000000 61.000000 68.000000 72.000000 65.000000 
+46.000000 25.000000 14.000000 12.000000 11.000000 10.000000 
+17.000000 31.000000 30.000000 20.000000 20.000000 30.000000 
+34.000000 31.000000 30.000000 33.000000 38.000000 54.000000 
+81.000000 97.000000 54.000000 48.000000 45.000000 48.000000 
+51.000000 46.000000 41.000000 42.000000 41.000000 35.000000 
+30.000000 35.000000 42.000000 39.000000 27.000000 20.000000 
+23.000000 31.000000 37.000000 39.000000 40.000000 36.000000 
+25.000000 21.000000 39.000000 61.000000 60.000000 42.000000 
+32.000000 40.000000 46.000000 40.000000 28.000000 21.000000 
+17.000000 17.000000 19.000000 28.000000 44.000000 55.000000 
+53.000000 43.000000 33.000000 29.000000 26.000000 24.000000 
+27.000000 33.000000 34.000000 34.000000 39.000000 52.000000 
+58.000000 54.000000 53.000000 41.000000 23.000000 26.000000 
+39.000000 38.000000 23.000000 9.000000 12.000000 23.000000 
+23.000000 16.000000 20.000000 38.000000 53.000000 54.000000 
+43.000000 32.000000 32.000000 49.000000 72.000000 88.000000 
+53.000000 48.000000 46.000000 44.000000 41.000000 41.000000 
+42.000000 40.000000 36.000000 31.000000 31.000000 36.000000 
+42.000000 39.000000 29.000000 18.000000 17.000000 30.000000 
+44.000000 49.000000 42.000000 28.000000 20.000000 28.000000 
+49.000000 67.000000 70.000000 55.000000 34.000000 29.000000 
+31.000000 26.000000 20.000000 19.000000 20.000000 24.000000 
+26.000000 28.000000 37.000000 48.000000 49.000000 40.000000 
+31.000000 24.000000 14.000000 7.000000 9.000000 15.000000 
+15.000000 12.000000 23.000000 47.000000 66.000000 72.000000 
+66.000000 49.000000 41.000000 47.000000 48.000000 35.000000 
+20.000000 17.000000 18.000000 13.000000 8.000000 9.000000 
+23.000000 47.000000 68.000000 73.000000 61.000000 46.000000 
+45.000000 57.000000 73.000000 85.000000 44.000000 52.000000 
+51.000000 41.000000 33.000000 34.000000 36.000000 34.000000 
+29.000000 25.000000 25.000000 28.000000 34.000000 38.000000 
+37.000000 29.000000 20.000000 18.000000 27.000000 37.000000 
+40.000000 37.000000 33.000000 36.000000 47.000000 62.000000 
+66.000000 56.000000 39.000000 29.000000 28.000000 23.000000 
+15.000000 13.000000 19.000000 22.000000 18.000000 17.000000 
+24.000000 36.000000 37.000000 28.000000 22.000000 17.000000 
+14.000000 18.000000 25.000000 28.000000 23.000000 8.000000 
+17.000000 50.000000 76.000000 80.000000 65.000000 44.000000 
+33.000000 35.000000 35.000000 27.000000 17.000000 15.000000 
+18.000000 20.000000 13.000000 8.000000 19.000000 44.000000 
+73.000000 90.000000 86.000000 72.000000 65.000000 70.000000 
+82.000000 89.000000 46.000000 46.000000 41.000000 36.000000 
+37.000000 39.000000 40.000000 38.000000 34.000000 29.000000 
+26.000000 28.000000 33.000000 38.000000 39.000000 35.000000 
+27.000000 19.000000 16.000000 18.000000 22.000000 31.000000 
+37.000000 37.000000 40.000000 45.000000 47.000000 43.000000 
+38.000000 37.000000 39.000000 35.000000 24.000000 18.000000 
+22.000000 22.000000 14.000000 13.000000 17.000000 27.000000 
+33.000000 29.000000 26.000000 23.000000 25.000000 34.000000 
+44.000000 48.000000 36.000000 17.000000 26.000000 57.000000 
+84.000000 91.000000 72.000000 44.000000 33.000000 31.000000 
+26.000000 18.000000 15.000000 17.000000 16.000000 18.000000 
+17.000000 10.000000 14.000000 34.000000 64.000000 90.000000 
+94.000000 83.000000 73.000000 78.000000 90.000000 94.000000 
+34.000000 30.000000 32.000000 38.000000 42.000000 43.000000 
+40.000000 37.000000 36.000000 38.000000 39.000000 40.000000 
+40.000000 43.000000 42.000000 35.000000 25.000000 21.000000 
+20.000000 20.000000 19.000000 18.000000 22.000000 27.000000 
+29.000000 29.000000 29.000000 32.000000 36.000000 43.000000 
+51.000000 54.000000 47.000000 33.000000 23.000000 26.000000 
+26.000000 25.000000 29.000000 34.000000 37.000000 37.000000 
+37.000000 34.000000 33.000000 39.000000 51.000000 55.000000 
+43.000000 30.000000 44.000000 68.000000 77.000000 70.000000 
+56.000000 46.000000 42.000000 33.000000 19.000000 8.000000 
+10.000000 16.000000 12.000000 12.000000 18.000000 17.000000 
+13.000000 17.000000 35.000000 62.000000 83.000000 91.000000 
+88.000000 84.000000 91.000000 106.000000 41.000000 41.000000 
+40.000000 39.000000 37.000000 34.000000 30.000000 28.000000 
+30.000000 34.000000 36.000000 37.000000 36.000000 35.000000 
+33.000000 32.000000 30.000000 27.000000 23.000000 24.000000 
+28.000000 29.000000 28.000000 28.000000 30.000000 34.000000 
+38.000000 39.000000 36.000000 36.000000 40.000000 43.000000 
+43.000000 36.000000 25.000000 17.000000 15.000000 22.000000 
+35.000000 41.000000 42.000000 42.000000 41.000000 36.000000 
+30.000000 35.000000 47.000000 51.000000 43.000000 34.000000 
+39.000000 53.000000 60.000000 60.000000 52.000000 27.000000 
+23.000000 35.000000 26.000000 16.000000 19.000000 20.000000 
+24.000000 33.000000 37.000000 31.000000 20.000000 15.000000 
+21.000000 38.000000 59.000000 80.000000 94.000000 101.000000 
+106.000000 116.000000 53.000000 48.000000 39.000000 32.000000 
+29.000000 29.000000 26.000000 21.000000 18.000000 24.000000 
+33.000000 38.000000 37.000000 36.000000 38.000000 40.000000 
+38.000000 35.000000 37.000000 42.000000 46.000000 44.000000 
+39.000000 36.000000 36.000000 36.000000 36.000000 33.000000 
+23.000000 21.000000 29.000000 38.000000 47.000000 51.000000 
+43.000000 29.000000 20.000000 22.000000 33.000000 39.000000 
+38.000000 36.000000 37.000000 39.000000 45.000000 54.000000 
+62.000000 57.000000 38.000000 21.000000 24.000000 41.000000 
+58.000000 65.000000 53.000000 20.000000 13.000000 26.000000 
+21.000000 15.000000 17.000000 23.000000 33.000000 39.000000 
+36.000000 27.000000 18.000000 15.000000 20.000000 25.000000 
+31.000000 44.000000 66.000000 92.000000 109.000000 112.000000 
+70.000000 64.000000 46.000000 32.000000 27.000000 25.000000 
+25.000000 27.000000 25.000000 23.000000 27.000000 35.000000 
+42.000000 44.000000 42.000000 37.000000 35.000000 37.000000 
+42.000000 46.000000 47.000000 43.000000 40.000000 41.000000 
+40.000000 33.000000 26.000000 25.000000 28.000000 33.000000 
+36.000000 37.000000 39.000000 42.000000 41.000000 37.000000 
+33.000000 32.000000 35.000000 38.000000 38.000000 39.000000 
+38.000000 38.000000 46.000000 53.000000 50.000000 38.000000 
+24.000000 21.000000 31.000000 46.000000 54.000000 53.000000 
+44.000000 28.000000 15.000000 10.000000 5.000000 7.000000 
+16.000000 27.000000 37.000000 38.000000 28.000000 18.000000 
+14.000000 20.000000 29.000000 26.000000 15.000000 18.000000 
+36.000000 60.000000 80.000000 84.000000 100.000000 87.000000 
+61.000000 37.000000 30.000000 34.000000 36.000000 37.000000 
+34.000000 26.000000 24.000000 29.000000 35.000000 38.000000 
+37.000000 34.000000 32.000000 34.000000 42.000000 49.000000 
+52.000000 50.000000 49.000000 52.000000 54.000000 50.000000 
+43.000000 40.000000 43.000000 46.000000 43.000000 37.000000 
+34.000000 34.000000 35.000000 33.000000 29.000000 25.000000 
+28.000000 33.000000 38.000000 42.000000 40.000000 35.000000 
+34.000000 31.000000 29.000000 34.000000 40.000000 40.000000 
+36.000000 35.000000 36.000000 35.000000 30.000000 23.000000 
+16.000000 9.000000 7.000000 14.000000 26.000000 31.000000 
+25.000000 16.000000 11.000000 12.000000 18.000000 27.000000 
+35.000000 38.000000 31.000000 20.000000 17.000000 29.000000 
+47.000000 53.000000 99.000000 91.000000 81.000000 56.000000 
+32.000000 37.000000 50.000000 43.000000 34.000000 28.000000 
+24.000000 21.000000 23.000000 28.000000 32.000000 35.000000 
+37.000000 39.000000 43.000000 46.000000 48.000000 49.000000 
+49.000000 50.000000 52.000000 53.000000 49.000000 44.000000 
+41.000000 42.000000 41.000000 38.000000 35.000000 37.000000 
+41.000000 42.000000 39.000000 35.000000 34.000000 33.000000 
+32.000000 35.000000 40.000000 40.000000 32.000000 24.000000 
+30.000000 45.000000 51.000000 43.000000 35.000000 35.000000 
+39.000000 37.000000 28.000000 22.000000 22.000000 23.000000 
+20.000000 21.000000 27.000000 30.000000 21.000000 10.000000 
+8.000000 12.000000 21.000000 30.000000 34.000000 38.000000 
+36.000000 26.000000 19.000000 18.000000 23.000000 32.000000 
+80.000000 84.000000 86.000000 68.000000 34.000000 16.000000 
+25.000000 36.000000 40.000000 43.000000 43.000000 36.000000 
+28.000000 26.000000 30.000000 37.000000 42.000000 46.000000 
+48.000000 51.000000 52.000000 50.000000 49.000000 49.000000 
+50.000000 48.000000 46.000000 45.000000 45.000000 44.000000 
+41.000000 37.000000 36.000000 38.000000 39.000000 39.000000 
+40.000000 43.000000 44.000000 39.000000 34.000000 36.000000 
+42.000000 45.000000 40.000000 38.000000 45.000000 48.000000 
+41.000000 34.000000 35.000000 42.000000 47.000000 44.000000 
+35.000000 30.000000 28.000000 25.000000 24.000000 23.000000 
+24.000000 23.000000 22.000000 21.000000 21.000000 20.000000 
+22.000000 26.000000 31.000000 30.000000 24.000000 24.000000 
+31.000000 29.000000 18.000000 15.000000 71.000000 75.000000 
+77.000000 71.000000 53.000000 31.000000 18.000000 15.000000 
+27.000000 46.000000 51.000000 44.000000 32.000000 28.000000 
+33.000000 39.000000 42.000000 42.000000 44.000000 47.000000 
+52.000000 53.000000 52.000000 48.000000 41.000000 34.000000 
+31.000000 32.000000 37.000000 43.000000 45.000000 45.000000 
+45.000000 46.000000 45.000000 42.000000 41.000000 44.000000 
+45.000000 44.000000 43.000000 47.000000 51.000000 47.000000 
+43.000000 46.000000 51.000000 46.000000 33.000000 30.000000 
+37.000000 41.000000 39.000000 34.000000 36.000000 43.000000 
+42.000000 31.000000 23.000000 20.000000 19.000000 20.000000 
+26.000000 32.000000 33.000000 28.000000 24.000000 22.000000 
+25.000000 26.000000 27.000000 32.000000 39.000000 41.000000 
+34.000000 29.000000 70.000000 74.000000 81.000000 80.000000 
+70.000000 57.000000 43.000000 24.000000 11.000000 25.000000 
+46.000000 44.000000 33.000000 27.000000 31.000000 36.000000 
+38.000000 38.000000 37.000000 38.000000 42.000000 48.000000 
+48.000000 42.000000 34.000000 29.000000 29.000000 29.000000 
+33.000000 41.000000 48.000000 50.000000 49.000000 48.000000 
+47.000000 43.000000 39.000000 37.000000 37.000000 40.000000 
+43.000000 42.000000 38.000000 35.000000 39.000000 44.000000 
+41.000000 24.000000 22.000000 38.000000 48.000000 44.000000 
+34.000000 28.000000 33.000000 43.000000 43.000000 35.000000 
+27.000000 23.000000 20.000000 22.000000 29.000000 35.000000 
+34.000000 24.000000 16.000000 15.000000 17.000000 24.000000 
+35.000000 44.000000 45.000000 42.000000 41.000000 49.000000 
+60.000000 65.000000 75.000000 79.000000 74.000000 65.000000 
+56.000000 39.000000 18.000000 18.000000 28.000000 26.000000 
+28.000000 32.000000 35.000000 36.000000 34.000000 29.000000 
+28.000000 30.000000 33.000000 37.000000 40.000000 38.000000 
+34.000000 33.000000 32.000000 32.000000 33.000000 35.000000 
+37.000000 40.000000 44.000000 49.000000 50.000000 44.000000 
+36.000000 29.000000 31.000000 41.000000 47.000000 40.000000 
+23.000000 19.000000 30.000000 39.000000 32.000000 12.000000 
+19.000000 42.000000 53.000000 48.000000 32.000000 25.000000 
+32.000000 37.000000 32.000000 23.000000 17.000000 17.000000 
+15.000000 15.000000 23.000000 34.000000 37.000000 30.000000 
+23.000000 20.000000 21.000000 24.000000 30.000000 37.000000 
+42.000000 42.000000 43.000000 46.000000 62.000000 60.000000 
+67.000000 77.000000 78.000000 63.000000 47.000000 39.000000 
+39.000000 33.000000 15.000000 8.000000 22.000000 32.000000 
+34.000000 29.000000 21.000000 17.000000 23.000000 29.000000 
+28.000000 24.000000 24.000000 28.000000 35.000000 36.000000 
+35.000000 36.000000 35.000000 35.000000 39.000000 44.000000 
+47.000000 49.000000 51.000000 49.000000 40.000000 30.000000 
+31.000000 43.000000 47.000000 36.000000 26.000000 28.000000 
+37.000000 42.000000 32.000000 12.000000 23.000000 44.000000 
+49.000000 43.000000 31.000000 27.000000 31.000000 32.000000 
+27.000000 19.000000 15.000000 16.000000 17.000000 17.000000 
+20.000000 28.000000 35.000000 37.000000 36.000000 33.000000 
+29.000000 26.000000 26.000000 29.000000 36.000000 42.000000 
+44.000000 39.000000 61.000000 59.000000 63.000000 70.000000 
+69.000000 58.000000 49.000000 50.000000 49.000000 35.000000 
+13.000000 9.000000 25.000000 31.000000 32.000000 25.000000 
+17.000000 16.000000 24.000000 29.000000 23.000000 18.000000 
+16.000000 18.000000 22.000000 24.000000 28.000000 36.000000 
+44.000000 49.000000 51.000000 51.000000 47.000000 46.000000 
+48.000000 49.000000 45.000000 42.000000 45.000000 49.000000 
+45.000000 42.000000 49.000000 56.000000 52.000000 29.000000 
+16.000000 16.000000 36.000000 53.000000 46.000000 31.000000 
+22.000000 22.000000 27.000000 28.000000 23.000000 19.000000 
+17.000000 19.000000 27.000000 34.000000 33.000000 29.000000 
+29.000000 31.000000 32.000000 32.000000 29.000000 26.000000 
+27.000000 30.000000 34.000000 39.000000 40.000000 36.000000 
+53.000000 58.000000 62.000000 62.000000 62.000000 63.000000 
+62.000000 54.000000 43.000000 37.000000 31.000000 24.000000 
+20.000000 18.000000 20.000000 25.000000 24.000000 20.000000 
+17.000000 15.000000 17.000000 22.000000 27.000000 23.000000 
+16.000000 13.000000 16.000000 26.000000 39.000000 55.000000 
+61.000000 55.000000 44.000000 39.000000 39.000000 44.000000 
+52.000000 59.000000 61.000000 58.000000 53.000000 48.000000 
+46.000000 44.000000 21.000000 12.000000 26.000000 44.000000 
+61.000000 69.000000 56.000000 30.000000 11.000000 8.000000 
+20.000000 29.000000 24.000000 17.000000 15.000000 19.000000 
+28.000000 39.000000 44.000000 38.000000 30.000000 27.000000 
+29.000000 31.000000 28.000000 25.000000 28.000000 33.000000 
+35.000000 35.000000 37.000000 40.000000 64.000000 66.000000 
+64.000000 63.000000 67.000000 71.000000 64.000000 48.000000 
+40.000000 46.000000 49.000000 31.000000 15.000000 15.000000 
+11.000000 21.000000 23.000000 18.000000 17.000000 15.000000 
+18.000000 26.000000 28.000000 28.000000 31.000000 29.000000 
+25.000000 24.000000 34.000000 51.000000 60.000000 57.000000 
+53.000000 54.000000 55.000000 56.000000 61.000000 68.000000 
+74.000000 76.000000 71.000000 50.000000 23.000000 20.000000 
+17.000000 36.000000 62.000000 66.000000 61.000000 59.000000 
+54.000000 32.000000 12.000000 13.000000 19.000000 24.000000 
+25.000000 21.000000 21.000000 29.000000 37.000000 39.000000 
+33.000000 27.000000 25.000000 28.000000 32.000000 33.000000 
+32.000000 30.000000 30.000000 29.000000 29.000000 31.000000 
+35.000000 41.000000 67.000000 62.000000 59.000000 64.000000 
+73.000000 75.000000 64.000000 50.000000 41.000000 38.000000 
+30.000000 17.000000 20.000000 19.000000 12.000000 25.000000 
+23.000000 29.000000 37.000000 30.000000 19.000000 15.000000 
+23.000000 31.000000 36.000000 34.000000 27.000000 23.000000 
+36.000000 54.000000 66.000000 69.000000 66.000000 64.000000 
+66.000000 69.000000 68.000000 66.000000 69.000000 74.000000 
+71.000000 55.000000 42.000000 50.000000 66.000000 75.000000 
+75.000000 62.000000 44.000000 36.000000 37.000000 22.000000 
+13.000000 25.000000 21.000000 19.000000 28.000000 22.000000 
+13.000000 21.000000 34.000000 38.000000 32.000000 26.000000 
+27.000000 31.000000 31.000000 30.000000 32.000000 35.000000 
+33.000000 28.000000 29.000000 35.000000 38.000000 39.000000 
+72.000000 71.000000 71.000000 71.000000 73.000000 71.000000 
+62.000000 50.000000 43.000000 42.000000 30.000000 19.000000 
+27.000000 17.000000 1.000000 6.000000 14.000000 29.000000 
+32.000000 21.000000 12.000000 11.000000 21.000000 22.000000 
+18.000000 18.000000 19.000000 22.000000 35.000000 48.000000 
+58.000000 62.000000 58.000000 51.000000 48.000000 53.000000 
+58.000000 54.000000 49.000000 49.000000 52.000000 57.000000 
+66.000000 75.000000 80.000000 82.000000 75.000000 56.000000 
+36.000000 27.000000 22.000000 13.000000 21.000000 39.000000 
+34.000000 20.000000 17.000000 14.000000 10.000000 14.000000 
+21.000000 25.000000 27.000000 27.000000 25.000000 21.000000 
+20.000000 22.000000 27.000000 34.000000 37.000000 37.000000 
+40.000000 46.000000 47.000000 43.000000 79.000000 86.000000 
+87.000000 81.000000 74.000000 69.000000 67.000000 59.000000 
+51.000000 51.000000 37.000000 20.000000 42.000000 68.000000 
+70.000000 59.000000 48.000000 35.000000 20.000000 8.000000 
+7.000000 12.000000 12.000000 13.000000 17.000000 22.000000 
+22.000000 21.000000 27.000000 35.000000 40.000000 44.000000 
+48.000000 51.000000 49.000000 46.000000 46.000000 48.000000 
+49.000000 47.000000 45.000000 48.000000 55.000000 66.000000 
+72.000000 70.000000 64.000000 51.000000 32.000000 17.000000 
+14.000000 20.000000 31.000000 44.000000 47.000000 33.000000 
+19.000000 17.000000 20.000000 22.000000 24.000000 19.000000 
+11.000000 18.000000 27.000000 19.000000 10.000000 11.000000 
+16.000000 24.000000 29.000000 31.000000 36.000000 45.000000 
+49.000000 46.000000 75.000000 83.000000 88.000000 84.000000 
+79.000000 80.000000 82.000000 77.000000 66.000000 45.000000 
+20.000000 28.000000 85.000000 155.000000 190.000000 164.000000 
+103.000000 55.000000 32.000000 14.000000 5.000000 6.000000 
+8.000000 19.000000 24.000000 21.000000 19.000000 18.000000 
+21.000000 27.000000 32.000000 36.000000 42.000000 45.000000 
+45.000000 40.000000 37.000000 41.000000 46.000000 47.000000 
+42.000000 36.000000 38.000000 46.000000 48.000000 41.000000 
+39.000000 45.000000 40.000000 17.000000 12.000000 25.000000 
+31.000000 39.000000 49.000000 50.000000 41.000000 29.000000 
+25.000000 30.000000 36.000000 28.000000 14.000000 33.000000 
+62.000000 58.000000 37.000000 18.000000 8.000000 9.000000 
+20.000000 29.000000 33.000000 37.000000 45.000000 54.000000 
+84.000000 91.000000 87.000000 82.000000 86.000000 94.000000 
+92.000000 80.000000 55.000000 27.000000 36.000000 85.000000 
+133.000000 173.000000 186.000000 156.000000 104.000000 64.000000 
+37.000000 14.000000 9.000000 11.000000 12.000000 14.000000 
+13.000000 9.000000 15.000000 28.000000 30.000000 18.000000 
+10.000000 14.000000 29.000000 38.000000 36.000000 29.000000 
+28.000000 31.000000 30.000000 29.000000 31.000000 32.000000 
+26.000000 23.000000 25.000000 24.000000 22.000000 35.000000 
+43.000000 29.000000 14.000000 15.000000 21.000000 21.000000 
+24.000000 35.000000 44.000000 42.000000 37.000000 36.000000 
+35.000000 25.000000 16.000000 36.000000 72.000000 90.000000 
+87.000000 70.000000 45.000000 31.000000 35.000000 37.000000 
+38.000000 44.000000 58.000000 72.000000 91.000000 92.000000 
+89.000000 92.000000 98.000000 95.000000 77.000000 51.000000 
+24.000000 24.000000 80.000000 142.000000 164.000000 150.000000 
+130.000000 115.000000 102.000000 73.000000 34.000000 13.000000 
+16.000000 22.000000 16.000000 8.000000 11.000000 14.000000 
+17.000000 27.000000 27.000000 15.000000 13.000000 18.000000 
+26.000000 30.000000 31.000000 29.000000 28.000000 26.000000 
+22.000000 18.000000 15.000000 14.000000 11.000000 13.000000 
+24.000000 29.000000 24.000000 29.000000 41.000000 47.000000 
+44.000000 45.000000 52.000000 45.000000 28.000000 25.000000 
+33.000000 37.000000 30.000000 24.000000 26.000000 26.000000 
+17.000000 20.000000 49.000000 75.000000 86.000000 80.000000 
+66.000000 53.000000 46.000000 44.000000 43.000000 51.000000 
+63.000000 78.000000 85.000000 83.000000 88.000000 94.000000 
+89.000000 72.000000 48.000000 24.000000 19.000000 49.000000 
+99.000000 144.000000 157.000000 139.000000 116.000000 100.000000 
+83.000000 56.000000 30.000000 17.000000 16.000000 21.000000 
+17.000000 9.000000 12.000000 14.000000 10.000000 9.000000 
+11.000000 16.000000 26.000000 25.000000 18.000000 18.000000 
+22.000000 26.000000 22.000000 18.000000 18.000000 16.000000 
+11.000000 7.000000 6.000000 8.000000 16.000000 21.000000 
+15.000000 21.000000 44.000000 61.000000 69.000000 86.000000 
+117.000000 142.000000 139.000000 99.000000 54.000000 31.000000 
+28.000000 30.000000 33.000000 37.000000 29.000000 16.000000 
+31.000000 56.000000 63.000000 57.000000 35.000000 25.000000 
+48.000000 57.000000 55.000000 60.000000 71.000000 82.000000 
+77.000000 75.000000 79.000000 77.000000 66.000000 53.000000 
+42.000000 33.000000 35.000000 59.000000 91.000000 110.000000 
+107.000000 91.000000 78.000000 73.000000 66.000000 52.000000 
+35.000000 23.000000 21.000000 24.000000 22.000000 15.000000 
+13.000000 12.000000 8.000000 6.000000 12.000000 18.000000 
+19.000000 16.000000 16.000000 21.000000 22.000000 19.000000 
+16.000000 18.000000 19.000000 14.000000 9.000000 9.000000 
+9.000000 10.000000 15.000000 16.000000 8.000000 21.000000 
+44.000000 58.000000 66.000000 80.000000 112.000000 163.000000 
+208.000000 207.000000 154.000000 93.000000 62.000000 54.000000 
+46.000000 42.000000 39.000000 23.000000 20.000000 45.000000 
+63.000000 60.000000 33.000000 27.000000 68.000000 72.000000 
+58.000000 62.000000 73.000000 82.000000 68.000000 68.000000 
+71.000000 68.000000 60.000000 48.000000 38.000000 35.000000 
+43.000000 60.000000 74.000000 75.000000 63.000000 49.000000 
+45.000000 49.000000 51.000000 42.000000 31.000000 27.000000 
+33.000000 36.000000 28.000000 15.000000 8.000000 11.000000 
+11.000000 9.000000 14.000000 16.000000 18.000000 18.000000 
+15.000000 12.000000 11.000000 12.000000 17.000000 27.000000 
+27.000000 15.000000 10.000000 14.000000 13.000000 8.000000 
+7.000000 6.000000 17.000000 35.000000 45.000000 46.000000 
+52.000000 73.000000 101.000000 134.000000 181.000000 223.000000 
+225.000000 180.000000 121.000000 79.000000 59.000000 46.000000 
+41.000000 31.000000 23.000000 44.000000 65.000000 63.000000 
+68.000000 82.000000 76.000000 57.000000 47.000000 62.000000 
+76.000000 87.000000 55.000000 56.000000 62.000000 63.000000 
+55.000000 45.000000 42.000000 44.000000 48.000000 54.000000 
+56.000000 54.000000 45.000000 38.000000 44.000000 55.000000 
+55.000000 45.000000 34.000000 31.000000 34.000000 34.000000 
+25.000000 13.000000 4.000000 13.000000 19.000000 17.000000 
+18.000000 25.000000 26.000000 14.000000 10.000000 8.000000 
+5.000000 12.000000 20.000000 27.000000 30.000000 26.000000 
+17.000000 13.000000 13.000000 11.000000 12.000000 18.000000 
+25.000000 29.000000 38.000000 44.000000 41.000000 54.000000 
+91.000000 123.000000 141.000000 166.000000 204.000000 226.000000 
+207.000000 149.000000 87.000000 46.000000 29.000000 23.000000 
+24.000000 42.000000 60.000000 65.000000 80.000000 97.000000 
+84.000000 52.000000 43.000000 66.000000 83.000000 95.000000 
+45.000000 49.000000 54.000000 54.000000 53.000000 54.000000 
+47.000000 43.000000 53.000000 56.000000 50.000000 46.000000 
+45.000000 50.000000 61.000000 68.000000 64.000000 55.000000 
+46.000000 37.000000 28.000000 23.000000 22.000000 19.000000 
+13.000000 11.000000 12.000000 22.000000 26.000000 25.000000 
+20.000000 15.000000 23.000000 20.000000 4.000000 6.000000 
+15.000000 24.000000 25.000000 23.000000 21.000000 18.000000 
+14.000000 11.000000 15.000000 26.000000 32.000000 31.000000 
+32.000000 38.000000 40.000000 41.000000 62.000000 105.000000 
+136.000000 142.000000 148.000000 176.000000 206.000000 204.000000 
+156.000000 86.000000 30.000000 9.000000 15.000000 28.000000 
+33.000000 40.000000 55.000000 69.000000 60.000000 40.000000 
+55.000000 84.000000 97.000000 105.000000 35.000000 40.000000 
+45.000000 44.000000 44.000000 42.000000 23.000000 15.000000 
+37.000000 45.000000 39.000000 36.000000 35.000000 35.000000 
+41.000000 47.000000 43.000000 41.000000 44.000000 34.000000 
+19.000000 15.000000 21.000000 22.000000 18.000000 10.000000 
+7.000000 15.000000 15.000000 8.000000 6.000000 16.000000 
+23.000000 19.000000 9.000000 4.000000 5.000000 10.000000 
+14.000000 19.000000 27.000000 32.000000 23.000000 12.000000 
+7.000000 16.000000 31.000000 38.000000 37.000000 41.000000 
+51.000000 55.000000 52.000000 64.000000 100.000000 132.000000 
+136.000000 135.000000 160.000000 197.000000 204.000000 158.000000 
+86.000000 26.000000 8.000000 21.000000 25.000000 30.000000 
+48.000000 54.000000 35.000000 32.000000 75.000000 108.000000 
+117.000000 114.000000 14.000000 9.000000 14.000000 18.000000 
+21.000000 21.000000 13.000000 14.000000 28.000000 29.000000 
+26.000000 27.000000 23.000000 18.000000 34.000000 50.000000 
+38.000000 29.000000 38.000000 29.000000 18.000000 27.000000 
+31.000000 25.000000 17.000000 11.000000 10.000000 10.000000 
+13.000000 14.000000 16.000000 16.000000 13.000000 11.000000 
+12.000000 10.000000 10.000000 10.000000 19.000000 27.000000 
+30.000000 28.000000 21.000000 11.000000 9.000000 20.000000 
+34.000000 36.000000 39.000000 51.000000 59.000000 57.000000 
+52.000000 46.000000 60.000000 100.000000 135.000000 146.000000 
+150.000000 167.000000 193.000000 197.000000 159.000000 86.000000 
+23.000000 16.000000 31.000000 34.000000 43.000000 36.000000 
+25.000000 50.000000 92.000000 121.000000 138.000000 136.000000 
+20.000000 16.000000 19.000000 18.000000 19.000000 21.000000 
+21.000000 29.000000 31.000000 25.000000 22.000000 24.000000 
+25.000000 30.000000 51.000000 59.000000 44.000000 24.000000 
+21.000000 17.000000 19.000000 33.000000 36.000000 28.000000 
+12.000000 10.000000 12.000000 12.000000 22.000000 22.000000 
+16.000000 15.000000 17.000000 16.000000 14.000000 15.000000 
+17.000000 21.000000 32.000000 38.000000 32.000000 20.000000 
+12.000000 11.000000 22.000000 29.000000 24.000000 24.000000 
+48.000000 68.000000 65.000000 57.000000 60.000000 61.000000 
+49.000000 56.000000 97.000000 141.000000 158.000000 154.000000 
+160.000000 177.000000 171.000000 121.000000 64.000000 40.000000 
+36.000000 34.000000 26.000000 16.000000 26.000000 55.000000 
+84.000000 110.000000 134.000000 148.000000 42.000000 44.000000 
+44.000000 37.000000 30.000000 25.000000 30.000000 35.000000 
+34.000000 35.000000 37.000000 38.000000 36.000000 33.000000 
+39.000000 38.000000 28.000000 26.000000 26.000000 24.000000 
+32.000000 37.000000 30.000000 17.000000 6.000000 15.000000 
+11.000000 12.000000 25.000000 27.000000 25.000000 25.000000 
+28.000000 29.000000 25.000000 19.000000 13.000000 16.000000 
+25.000000 33.000000 33.000000 19.000000 13.000000 19.000000 
+29.000000 31.000000 27.000000 39.000000 58.000000 67.000000 
+63.000000 50.000000 41.000000 45.000000 47.000000 45.000000 
+60.000000 101.000000 139.000000 156.000000 153.000000 146.000000 
+139.000000 125.000000 98.000000 64.000000 54.000000 61.000000 
+36.000000 9.000000 12.000000 28.000000 57.000000 102.000000 
+139.000000 151.000000 35.000000 46.000000 48.000000 44.000000 
+43.000000 43.000000 36.000000 28.000000 23.000000 19.000000 
+20.000000 22.000000 21.000000 20.000000 27.000000 33.000000 
+32.000000 28.000000 30.000000 36.000000 39.000000 28.000000 
+13.000000 7.000000 15.000000 19.000000 15.000000 22.000000 
+30.000000 34.000000 35.000000 34.000000 35.000000 33.000000 
+28.000000 23.000000 23.000000 26.000000 28.000000 25.000000 
+16.000000 7.000000 10.000000 14.000000 21.000000 30.000000 
+38.000000 49.000000 53.000000 51.000000 47.000000 34.000000 
+22.000000 27.000000 38.000000 49.000000 56.000000 69.000000 
+98.000000 124.000000 134.000000 131.000000 125.000000 118.000000 
+108.000000 104.000000 106.000000 90.000000 52.000000 19.000000 
+14.000000 29.000000 24.000000 36.000000 62.000000 71.000000 
+39.000000 46.000000 49.000000 46.000000 42.000000 38.000000 
+32.000000 25.000000 17.000000 13.000000 16.000000 21.000000 
+21.000000 21.000000 25.000000 28.000000 30.000000 30.000000 
+34.000000 41.000000 39.000000 26.000000 21.000000 21.000000 
+22.000000 36.000000 39.000000 31.000000 28.000000 32.000000 
+37.000000 40.000000 41.000000 39.000000 38.000000 39.000000 
+41.000000 42.000000 39.000000 30.000000 19.000000 15.000000 
+17.000000 19.000000 25.000000 31.000000 31.000000 31.000000 
+27.000000 19.000000 19.000000 20.000000 21.000000 26.000000 
+34.000000 40.000000 45.000000 44.000000 47.000000 66.000000 
+93.000000 111.000000 112.000000 109.000000 116.000000 131.000000 
+141.000000 134.000000 105.000000 50.000000 12.000000 27.000000 
+23.000000 17.000000 35.000000 40.000000 23.000000 31.000000 
+39.000000 40.000000 34.000000 26.000000 24.000000 24.000000 
+24.000000 25.000000 25.000000 21.000000 17.000000 26.000000 
+41.000000 49.000000 46.000000 34.000000 18.000000 14.000000 
+18.000000 17.000000 21.000000 29.000000 36.000000 38.000000 
+38.000000 38.000000 41.000000 45.000000 49.000000 57.000000 
+74.000000 99.000000 123.000000 130.000000 110.000000 74.000000 
+44.000000 31.000000 29.000000 29.000000 32.000000 34.000000 
+37.000000 40.000000 37.000000 31.000000 25.000000 16.000000 
+10.000000 20.000000 30.000000 30.000000 34.000000 37.000000 
+34.000000 30.000000 28.000000 36.000000 53.000000 77.000000 
+97.000000 104.000000 108.000000 132.000000 175.000000 201.000000 
+186.000000 132.000000 61.000000 14.000000 11.000000 11.000000 
+32.000000 40.000000 29.000000 35.000000 37.000000 33.000000 
+27.000000 25.000000 27.000000 32.000000 34.000000 31.000000 
+24.000000 13.000000 10.000000 30.000000 43.000000 45.000000 
+40.000000 29.000000 20.000000 16.000000 18.000000 26.000000 
+34.000000 38.000000 39.000000 40.000000 42.000000 48.000000 
+58.000000 69.000000 70.000000 62.000000 65.000000 99.000000 
+156.000000 195.000000 184.000000 132.000000 81.000000 53.000000 
+46.000000 52.000000 51.000000 38.000000 21.000000 14.000000 
+25.000000 35.000000 31.000000 28.000000 28.000000 24.000000 
+21.000000 20.000000 22.000000 26.000000 35.000000 46.000000 
+49.000000 41.000000 31.000000 45.000000 72.000000 84.000000 
+86.000000 109.000000 165.000000 223.000000 243.000000 216.000000 
+162.000000 98.000000 47.000000 33.000000 41.000000 43.000000 
+35.000000 39.000000 35.000000 28.000000 24.000000 24.000000 
+27.000000 31.000000 37.000000 39.000000 34.000000 20.000000 
+13.000000 27.000000 36.000000 29.000000 20.000000 21.000000 
+29.000000 39.000000 56.000000 71.000000 74.000000 65.000000 
+55.000000 54.000000 56.000000 53.000000 55.000000 68.000000 
+79.000000 75.000000 65.000000 81.000000 138.000000 190.000000 
+191.000000 143.000000 87.000000 62.000000 67.000000 71.000000 
+67.000000 68.000000 76.000000 76.000000 62.000000 46.000000 
+38.000000 40.000000 45.000000 43.000000 32.000000 18.000000 
+8.000000 10.000000 20.000000 32.000000 41.000000 42.000000 
+27.000000 14.000000 35.000000 68.000000 81.000000 88.000000 
+111.000000 157.000000 206.000000 230.000000 219.000000 184.000000 
+137.000000 84.000000 48.000000 40.000000 32.000000 34.000000 
+32.000000 29.000000 31.000000 33.000000 30.000000 26.000000 
+28.000000 32.000000 33.000000 30.000000 33.000000 41.000000 
+35.000000 21.000000 13.000000 14.000000 27.000000 46.000000 
+65.000000 77.000000 73.000000 58.000000 51.000000 59.000000 
+67.000000 66.000000 62.000000 61.000000 64.000000 67.000000 
+71.000000 89.000000 130.000000 171.000000 184.000000 163.000000 
+119.000000 80.000000 75.000000 82.000000 87.000000 87.000000 
+81.000000 66.000000 49.000000 42.000000 47.000000 52.000000 
+50.000000 42.000000 35.000000 31.000000 27.000000 26.000000 
+27.000000 29.000000 32.000000 37.000000 37.000000 15.000000 
+11.000000 47.000000 68.000000 76.000000 88.000000 104.000000 
+129.000000 173.000000 210.000000 201.000000 139.000000 59.000000 
+20.000000 42.000000 32.000000 33.000000 34.000000 36.000000 
+37.000000 33.000000 25.000000 22.000000 27.000000 29.000000 
+31.000000 39.000000 44.000000 39.000000 23.000000 14.000000 
+25.000000 37.000000 52.000000 74.000000 90.000000 91.000000 
+78.000000 66.000000 63.000000 66.000000 69.000000 75.000000 
+80.000000 78.000000 72.000000 67.000000 61.000000 67.000000 
+98.000000 138.000000 167.000000 171.000000 140.000000 99.000000 
+84.000000 85.000000 84.000000 78.000000 70.000000 60.000000 
+49.000000 40.000000 34.000000 31.000000 29.000000 28.000000 
+28.000000 29.000000 28.000000 27.000000 27.000000 24.000000 
+21.000000 27.000000 37.000000 33.000000 16.000000 21.000000 
+41.000000 58.000000 82.000000 89.000000 97.000000 148.000000 
+194.000000 171.000000 129.000000 123.000000 110.000000 67.000000 
+35.000000 32.000000 28.000000 28.000000 30.000000 33.000000 
+34.000000 34.000000 33.000000 31.000000 33.000000 38.000000 
+41.000000 34.000000 22.000000 30.000000 55.000000 72.000000 
+85.000000 90.000000 86.000000 77.000000 71.000000 67.000000 
+65.000000 70.000000 81.000000 89.000000 87.000000 78.000000 
+73.000000 70.000000 60.000000 50.000000 61.000000 91.000000 
+122.000000 134.000000 121.000000 91.000000 69.000000 65.000000 
+71.000000 78.000000 83.000000 82.000000 73.000000 60.000000 
+45.000000 31.000000 27.000000 27.000000 26.000000 26.000000 
+26.000000 28.000000 28.000000 18.000000 9.000000 8.000000 
+15.000000 23.000000 29.000000 27.000000 13.000000 25.000000 
+76.000000 90.000000 61.000000 78.000000 166.000000 182.000000 
+143.000000 112.000000 80.000000 31.000000 35.000000 28.000000 
+31.000000 39.000000 43.000000 40.000000 35.000000 31.000000 
+29.000000 29.000000 36.000000 49.000000 52.000000 42.000000 
+45.000000 75.000000 93.000000 98.000000 97.000000 90.000000 
+79.000000 72.000000 71.000000 72.000000 80.000000 91.000000 
+96.000000 89.000000 78.000000 76.000000 84.000000 90.000000 
+84.000000 64.000000 50.000000 60.000000 80.000000 92.000000 
+88.000000 73.000000 62.000000 61.000000 64.000000 64.000000 
+68.000000 72.000000 68.000000 55.000000 43.000000 27.000000 
+19.000000 29.000000 31.000000 20.000000 17.000000 27.000000 
+37.000000 37.000000 32.000000 24.000000 14.000000 9.000000 
+17.000000 36.000000 49.000000 42.000000 32.000000 46.000000 
+54.000000 57.000000 92.000000 133.000000 145.000000 137.000000 
+104.000000 53.000000 31.000000 30.000000 31.000000 33.000000 
+35.000000 34.000000 31.000000 28.000000 27.000000 32.000000 
+44.000000 54.000000 53.000000 52.000000 72.000000 93.000000 
+100.000000 96.000000 85.000000 77.000000 82.000000 94.000000 
+100.000000 96.000000 92.000000 93.000000 97.000000 94.000000 
+84.000000 76.000000 76.000000 80.000000 82.000000 76.000000 
+65.000000 58.000000 61.000000 66.000000 71.000000 72.000000 
+70.000000 69.000000 69.000000 68.000000 71.000000 77.000000 
+73.000000 58.000000 49.000000 37.000000 9.000000 10.000000 
+23.000000 23.000000 22.000000 26.000000 31.000000 33.000000 
+33.000000 30.000000 26.000000 25.000000 23.000000 19.000000 
+22.000000 35.000000 42.000000 25.000000 10.000000 31.000000 
+54.000000 71.000000 85.000000 88.000000 73.000000 50.000000 
+36.000000 35.000000 30.000000 28.000000 31.000000 32.000000 
+28.000000 26.000000 30.000000 39.000000 44.000000 41.000000 
+42.000000 60.000000 83.000000 94.000000 99.000000 102.000000 
+103.000000 101.000000 100.000000 98.000000 93.000000 87.000000 
+84.000000 88.000000 94.000000 95.000000 89.000000 79.000000 
+74.000000 75.000000 78.000000 80.000000 80.000000 81.000000 
+82.000000 86.000000 90.000000 92.000000 88.000000 80.000000 
+72.000000 70.000000 74.000000 82.000000 83.000000 70.000000 
+54.000000 39.000000 16.000000 9.000000 17.000000 16.000000 
+9.000000 13.000000 26.000000 33.000000 32.000000 29.000000 
+28.000000 28.000000 25.000000 22.000000 24.000000 31.000000 
+40.000000 41.000000 24.000000 11.000000 28.000000 46.000000 
+61.000000 73.000000 68.000000 52.000000 32.000000 35.000000 
+35.000000 33.000000 31.000000 30.000000 32.000000 35.000000 
+41.000000 45.000000 45.000000 49.000000 68.000000 88.000000 
+95.000000 92.000000 89.000000 94.000000 101.000000 103.000000 
+99.000000 91.000000 85.000000 86.000000 90.000000 95.000000 
+99.000000 99.000000 93.000000 82.000000 73.000000 69.000000 
+73.000000 78.000000 80.000000 81.000000 82.000000 84.000000 
+88.000000 93.000000 97.000000 100.000000 98.000000 94.000000 
+93.000000 99.000000 101.000000 87.000000 64.000000 48.000000 
+32.000000 10.000000 11.000000 19.000000 19.000000 21.000000 
+28.000000 34.000000 34.000000 32.000000 32.000000 31.000000 
+28.000000 25.000000 29.000000 35.000000 39.000000 38.000000 
+31.000000 21.000000 21.000000 37.000000 55.000000 66.000000 
+65.000000 53.000000 33.000000 29.000000 25.000000 27.000000 
+35.000000 41.000000 46.000000 53.000000 60.000000 62.000000 
+64.000000 73.000000 87.000000 99.000000 103.000000 102.000000 
+102.000000 103.000000 104.000000 100.000000 93.000000 87.000000 
+87.000000 91.000000 96.000000 94.000000 87.000000 82.000000 
+80.000000 78.000000 74.000000 69.000000 69.000000 74.000000 
+81.000000 86.000000 90.000000 93.000000 92.000000 87.000000 
+86.000000 91.000000 100.000000 106.000000 108.000000 108.000000 
+108.000000 99.000000 75.000000 54.000000 41.000000 21.000000 
+11.000000 18.000000 24.000000 26.000000 31.000000 34.000000 
+33.000000 30.000000 30.000000 33.000000 34.000000 33.000000 
+33.000000 35.000000 37.000000 38.000000 38.000000 37.000000 
+36.000000 36.000000 37.000000 38.000000 39.000000 39.000000 
+33.000000 28.000000 26.000000 33.000000 45.000000 53.000000 
+56.000000 56.000000 59.000000 66.000000 81.000000 100.000000 
+112.000000 111.000000 106.000000 102.000000 100.000000 98.000000 
+96.000000 95.000000 94.000000 90.000000 88.000000 91.000000 
+98.000000 100.000000 96.000000 88.000000 82.000000 80.000000 
+80.000000 81.000000 82.000000 83.000000 84.000000 83.000000 
+81.000000 83.000000 86.000000 86.000000 82.000000 79.000000 
+83.000000 96.000000 112.000000 117.000000 109.000000 96.000000 
+80.000000 68.000000 55.000000 31.000000 12.000000 21.000000 
+32.000000 30.000000 26.000000 25.000000 27.000000 31.000000 
+35.000000 36.000000 36.000000 38.000000 41.000000 40.000000 
+33.000000 30.000000 35.000000 41.000000 39.000000 31.000000 
+27.000000 32.000000 43.000000 45.000000 35.000000 31.000000 
+30.000000 34.000000 45.000000 62.000000 79.000000 90.000000 
+95.000000 99.000000 100.000000 97.000000 95.000000 97.000000 
+99.000000 96.000000 90.000000 87.000000 89.000000 94.000000 
+96.000000 94.000000 95.000000 100.000000 102.000000 95.000000 
+85.000000 79.000000 83.000000 91.000000 96.000000 91.000000 
+80.000000 72.000000 72.000000 78.000000 85.000000 88.000000 
+88.000000 88.000000 87.000000 87.000000 87.000000 91.000000 
+100.000000 108.000000 112.000000 106.000000 91.000000 74.000000 
+63.000000 44.000000 13.000000 15.000000 33.000000 26.000000 
+12.000000 9.000000 16.000000 27.000000 34.000000 34.000000 
+31.000000 32.000000 36.000000 36.000000 31.000000 29.000000 
+36.000000 45.000000 46.000000 41.000000 34.000000 22.000000 
+16.000000 29.000000 46.000000 48.000000 50.000000 50.000000 
+50.000000 51.000000 47.000000 36.000000 25.000000 22.000000 
+31.000000 43.000000 46.000000 34.000000 19.000000 16.000000 
+19.000000 21.000000 20.000000 20.000000 26.000000 35.000000 
+37.000000 33.000000 30.000000 33.000000 43.000000 46.000000 
+34.000000 31.000000 41.000000 40.000000 33.000000 29.000000 
+22.000000 10.000000 14.000000 23.000000 32.000000 38.000000 
+36.000000 29.000000 21.000000 14.000000 16.000000 35.000000 
+63.000000 79.000000 61.000000 20.000000 15.000000 26.000000 
+39.000000 53.000000 55.000000 45.000000 31.000000 20.000000 
+14.000000 17.000000 27.000000 32.000000 31.000000 27.000000 
+28.000000 26.000000 17.000000 23.000000 38.000000 40.000000 
+35.000000 32.000000 40.000000 61.000000 81.000000 90.000000 
+38.000000 43.000000 47.000000 46.000000 40.000000 31.000000 
+25.000000 26.000000 32.000000 37.000000 40.000000 42.000000 
+37.000000 27.000000 18.000000 16.000000 22.000000 29.000000 
+27.000000 22.000000 17.000000 17.000000 20.000000 21.000000 
+17.000000 12.000000 9.000000 13.000000 24.000000 32.000000 
+36.000000 35.000000 30.000000 25.000000 22.000000 20.000000 
+22.000000 27.000000 31.000000 31.000000 30.000000 29.000000 
+28.000000 26.000000 25.000000 30.000000 40.000000 47.000000 
+39.000000 19.000000 12.000000 15.000000 27.000000 40.000000 
+35.000000 22.000000 21.000000 30.000000 36.000000 30.000000 
+16.000000 10.000000 13.000000 16.000000 17.000000 16.000000 
+10.000000 12.000000 30.000000 50.000000 58.000000 56.000000 
+55.000000 60.000000 67.000000 76.000000 26.000000 31.000000 
+38.000000 38.000000 29.000000 21.000000 25.000000 33.000000 
+36.000000 31.000000 23.000000 20.000000 23.000000 29.000000 
+31.000000 25.000000 18.000000 20.000000 24.000000 23.000000 
+20.000000 17.000000 21.000000 29.000000 32.000000 26.000000 
+17.000000 16.000000 24.000000 29.000000 27.000000 22.000000 
+18.000000 16.000000 17.000000 18.000000 15.000000 16.000000 
+21.000000 26.000000 26.000000 25.000000 24.000000 22.000000 
+17.000000 19.000000 28.000000 36.000000 34.000000 23.000000 
+13.000000 17.000000 32.000000 43.000000 41.000000 33.000000 
+30.000000 32.000000 31.000000 25.000000 19.000000 16.000000 
+14.000000 15.000000 12.000000 6.000000 9.000000 16.000000 
+31.000000 55.000000 69.000000 70.000000 69.000000 72.000000 
+75.000000 80.000000 26.000000 32.000000 37.000000 33.000000 
+27.000000 26.000000 28.000000 27.000000 25.000000 22.000000 
+23.000000 23.000000 23.000000 25.000000 28.000000 28.000000 
+23.000000 16.000000 12.000000 13.000000 16.000000 23.000000 
+30.000000 37.000000 40.000000 37.000000 34.000000 34.000000 
+36.000000 35.000000 28.000000 19.000000 11.000000 11.000000 
+16.000000 18.000000 13.000000 10.000000 16.000000 24.000000 
+27.000000 22.000000 16.000000 13.000000 15.000000 22.000000 
+30.000000 33.000000 31.000000 26.000000 22.000000 32.000000 
+47.000000 51.000000 43.000000 33.000000 29.000000 27.000000 
+22.000000 15.000000 10.000000 10.000000 14.000000 15.000000 
+15.000000 11.000000 7.000000 10.000000 24.000000 43.000000 
+60.000000 68.000000 72.000000 77.000000 87.000000 95.000000 
+25.000000 23.000000 22.000000 21.000000 21.000000 23.000000 
+23.000000 23.000000 26.000000 31.000000 33.000000 28.000000 
+20.000000 16.000000 17.000000 22.000000 27.000000 28.000000 
+24.000000 20.000000 16.000000 14.000000 14.000000 16.000000 
+22.000000 30.000000 35.000000 35.000000 33.000000 33.000000 
+34.000000 31.000000 25.000000 19.000000 17.000000 12.000000 
+11.000000 19.000000 25.000000 25.000000 22.000000 17.000000 
+18.000000 24.000000 29.000000 36.000000 42.000000 41.000000 
+28.000000 11.000000 12.000000 32.000000 54.000000 62.000000 
+55.000000 47.000000 41.000000 36.000000 26.000000 17.000000 
+14.000000 14.000000 11.000000 10.000000 11.000000 12.000000 
+10.000000 9.000000 10.000000 20.000000 41.000000 58.000000 
+68.000000 75.000000 85.000000 95.000000 33.000000 27.000000 
+25.000000 26.000000 26.000000 22.000000 18.000000 20.000000 
+27.000000 33.000000 34.000000 31.000000 27.000000 22.000000 
+16.000000 16.000000 21.000000 27.000000 25.000000 18.000000 
+16.000000 17.000000 21.000000 24.000000 23.000000 24.000000 
+27.000000 29.000000 32.000000 35.000000 38.000000 39.000000 
+35.000000 26.000000 17.000000 9.000000 9.000000 18.000000 
+25.000000 25.000000 19.000000 15.000000 20.000000 26.000000 
+27.000000 28.000000 33.000000 34.000000 18.000000 11.000000 
+23.000000 44.000000 67.000000 75.000000 60.000000 40.000000 
+34.000000 32.000000 16.000000 10.000000 16.000000 14.000000 
+10.000000 14.000000 19.000000 23.000000 22.000000 16.000000 
+6.000000 5.000000 19.000000 36.000000 53.000000 65.000000 
+71.000000 75.000000 65.000000 46.000000 34.000000 29.000000 
+23.000000 15.000000 12.000000 17.000000 26.000000 35.000000 
+36.000000 31.000000 26.000000 26.000000 25.000000 23.000000 
+24.000000 29.000000 32.000000 31.000000 28.000000 28.000000 
+33.000000 37.000000 33.000000 26.000000 21.000000 23.000000 
+28.000000 32.000000 37.000000 41.000000 41.000000 34.000000 
+24.000000 18.000000 18.000000 24.000000 29.000000 26.000000 
+20.000000 19.000000 24.000000 28.000000 28.000000 27.000000 
+27.000000 27.000000 14.000000 13.000000 31.000000 51.000000 
+68.000000 78.000000 69.000000 39.000000 16.000000 20.000000 
+21.000000 18.000000 22.000000 18.000000 13.000000 17.000000 
+24.000000 26.000000 21.000000 15.000000 14.000000 14.000000 
+11.000000 14.000000 27.000000 41.000000 49.000000 52.000000 
+109.000000 87.000000 59.000000 37.000000 25.000000 20.000000 
+21.000000 26.000000 31.000000 34.000000 34.000000 33.000000 
+29.000000 24.000000 20.000000 22.000000 33.000000 42.000000 
+44.000000 42.000000 41.000000 42.000000 45.000000 49.000000 
+50.000000 45.000000 33.000000 24.000000 22.000000 27.000000 
+31.000000 33.000000 35.000000 36.000000 32.000000 25.000000 
+21.000000 21.000000 24.000000 25.000000 21.000000 19.000000 
+24.000000 28.000000 29.000000 28.000000 28.000000 23.000000 
+14.000000 20.000000 38.000000 52.000000 63.000000 68.000000 
+61.000000 40.000000 23.000000 28.000000 32.000000 26.000000 
+23.000000 22.000000 19.000000 20.000000 24.000000 23.000000 
+17.000000 13.000000 14.000000 14.000000 7.000000 2.000000 
+8.000000 23.000000 37.000000 40.000000 112.000000 109.000000 
+93.000000 66.000000 40.000000 29.000000 28.000000 25.000000 
+25.000000 29.000000 33.000000 36.000000 33.000000 26.000000 
+19.000000 23.000000 37.000000 46.000000 48.000000 41.000000 
+37.000000 37.000000 37.000000 40.000000 45.000000 47.000000 
+43.000000 35.000000 30.000000 29.000000 27.000000 26.000000 
+29.000000 35.000000 35.000000 27.000000 16.000000 16.000000 
+25.000000 32.000000 32.000000 31.000000 32.000000 31.000000 
+26.000000 23.000000 23.000000 21.000000 24.000000 37.000000 
+51.000000 55.000000 51.000000 45.000000 40.000000 33.000000 
+28.000000 24.000000 21.000000 19.000000 19.000000 24.000000 
+26.000000 20.000000 14.000000 13.000000 13.000000 18.000000 
+23.000000 20.000000 14.000000 12.000000 14.000000 22.000000 
+31.000000 34.000000 94.000000 102.000000 104.000000 88.000000 
+53.000000 26.000000 25.000000 27.000000 25.000000 32.000000 
+36.000000 34.000000 29.000000 23.000000 24.000000 34.000000 
+42.000000 41.000000 36.000000 32.000000 38.000000 43.000000 
+43.000000 42.000000 41.000000 42.000000 42.000000 37.000000 
+31.000000 26.000000 25.000000 25.000000 28.000000 32.000000 
+32.000000 26.000000 21.000000 23.000000 32.000000 41.000000 
+44.000000 43.000000 36.000000 27.000000 22.000000 22.000000 
+26.000000 31.000000 34.000000 38.000000 40.000000 38.000000 
+31.000000 25.000000 23.000000 22.000000 20.000000 16.000000 
+12.000000 10.000000 11.000000 17.000000 21.000000 15.000000 
+8.000000 7.000000 6.000000 13.000000 22.000000 23.000000 
+24.000000 24.000000 22.000000 25.000000 30.000000 30.000000 
+93.000000 100.000000 104.000000 92.000000 60.000000 26.000000 
+19.000000 29.000000 23.000000 20.000000 40.000000 53.000000 
+44.000000 30.000000 28.000000 37.000000 41.000000 36.000000 
+31.000000 36.000000 45.000000 47.000000 44.000000 43.000000 
+41.000000 36.000000 31.000000 29.000000 30.000000 31.000000 
+32.000000 31.000000 30.000000 31.000000 30.000000 28.000000 
+27.000000 28.000000 33.000000 39.000000 41.000000 38.000000 
+31.000000 26.000000 27.000000 30.000000 31.000000 30.000000 
+27.000000 28.000000 32.000000 35.000000 36.000000 34.000000 
+24.000000 13.000000 13.000000 18.000000 21.000000 20.000000 
+18.000000 15.000000 12.000000 10.000000 12.000000 19.000000 
+22.000000 19.000000 17.000000 15.000000 19.000000 23.000000 
+24.000000 23.000000 22.000000 22.000000 85.000000 94.000000 
+101.000000 96.000000 73.000000 42.000000 23.000000 23.000000 
+21.000000 28.000000 61.000000 81.000000 74.000000 54.000000 
+37.000000 29.000000 30.000000 30.000000 32.000000 40.000000 
+47.000000 47.000000 41.000000 39.000000 38.000000 32.000000 
+25.000000 22.000000 26.000000 32.000000 36.000000 33.000000 
+28.000000 24.000000 22.000000 21.000000 23.000000 28.000000 
+35.000000 37.000000 34.000000 28.000000 24.000000 27.000000 
+32.000000 37.000000 37.000000 31.000000 24.000000 22.000000 
+26.000000 32.000000 38.000000 36.000000 24.000000 20.000000 
+26.000000 28.000000 26.000000 21.000000 17.000000 14.000000 
+12.000000 10.000000 13.000000 25.000000 34.000000 29.000000 
+18.000000 12.000000 15.000000 23.000000 27.000000 24.000000 
+16.000000 16.000000 75.000000 85.000000 95.000000 95.000000 
+84.000000 69.000000 62.000000 61.000000 53.000000 48.000000 
+55.000000 63.000000 56.000000 41.000000 31.000000 26.000000 
+27.000000 32.000000 39.000000 47.000000 51.000000 49.000000 
+42.000000 33.000000 26.000000 24.000000 25.000000 27.000000 
+27.000000 28.000000 28.000000 28.000000 29.000000 31.000000 
+30.000000 28.000000 28.000000 32.000000 38.000000 40.000000 
+38.000000 33.000000 32.000000 34.000000 37.000000 40.000000 
+38.000000 30.000000 20.000000 17.000000 24.000000 33.000000 
+40.000000 40.000000 33.000000 30.000000 28.000000 21.000000 
+13.000000 9.000000 13.000000 22.000000 27.000000 26.000000 
+25.000000 27.000000 28.000000 24.000000 17.000000 18.000000 
+26.000000 31.000000 31.000000 27.000000 22.000000 24.000000 
+77.000000 82.000000 90.000000 97.000000 97.000000 90.000000 
+82.000000 76.000000 70.000000 64.000000 56.000000 39.000000 
+19.000000 12.000000 14.000000 16.000000 21.000000 30.000000 
+41.000000 46.000000 48.000000 44.000000 36.000000 26.000000 
+18.000000 18.000000 23.000000 28.000000 30.000000 31.000000 
+34.000000 36.000000 37.000000 36.000000 35.000000 35.000000 
+38.000000 40.000000 42.000000 43.000000 44.000000 42.000000 
+37.000000 32.000000 32.000000 37.000000 37.000000 27.000000 
+12.000000 17.000000 35.000000 44.000000 41.000000 37.000000 
+32.000000 27.000000 25.000000 21.000000 16.000000 12.000000 
+14.000000 24.000000 32.000000 33.000000 31.000000 26.000000 
+21.000000 17.000000 17.000000 21.000000 27.000000 36.000000 
+42.000000 39.000000 31.000000 27.000000 73.000000 78.000000 
+87.000000 94.000000 96.000000 87.000000 70.000000 60.000000 
+67.000000 80.000000 75.000000 42.000000 11.000000 13.000000 
+19.000000 14.000000 13.000000 13.000000 14.000000 18.000000 
+17.000000 26.000000 27.000000 18.000000 12.000000 21.000000 
+25.000000 26.000000 28.000000 32.000000 37.000000 40.000000 
+40.000000 39.000000 36.000000 34.000000 34.000000 37.000000 
+41.000000 46.000000 49.000000 46.000000 34.000000 24.000000 
+24.000000 28.000000 27.000000 18.000000 14.000000 29.000000 
+48.000000 50.000000 38.000000 23.000000 18.000000 21.000000 
+26.000000 27.000000 23.000000 20.000000 17.000000 17.000000 
+21.000000 27.000000 30.000000 31.000000 25.000000 20.000000 
+18.000000 19.000000 23.000000 32.000000 39.000000 37.000000 
+28.000000 22.000000 70.000000 72.000000 78.000000 85.000000 
+85.000000 78.000000 69.000000 66.000000 72.000000 80.000000 
+72.000000 38.000000 9.000000 18.000000 24.000000 19.000000 
+19.000000 17.000000 10.000000 6.000000 4.000000 12.000000 
+21.000000 17.000000 7.000000 14.000000 21.000000 22.000000 
+22.000000 27.000000 33.000000 36.000000 38.000000 38.000000 
+35.000000 35.000000 34.000000 35.000000 37.000000 41.000000 
+42.000000 33.000000 21.000000 19.000000 25.000000 25.000000 
+14.000000 4.000000 13.000000 33.000000 47.000000 45.000000 
+27.000000 11.000000 10.000000 16.000000 15.000000 12.000000 
+13.000000 19.000000 23.000000 21.000000 17.000000 19.000000 
+26.000000 30.000000 28.000000 24.000000 21.000000 17.000000 
+17.000000 22.000000 30.000000 33.000000 29.000000 26.000000 
+72.000000 73.000000 78.000000 83.000000 82.000000 78.000000 
+75.000000 73.000000 71.000000 69.000000 59.000000 35.000000 
+14.000000 13.000000 18.000000 20.000000 25.000000 26.000000 
+20.000000 16.000000 13.000000 10.000000 15.000000 15.000000 
+12.000000 11.000000 12.000000 16.000000 23.000000 30.000000 
+36.000000 37.000000 32.000000 27.000000 29.000000 34.000000 
+37.000000 38.000000 40.000000 43.000000 40.000000 34.000000 
+31.000000 35.000000 35.000000 16.000000 10.000000 14.000000 
+26.000000 39.000000 41.000000 27.000000 12.000000 8.000000 
+12.000000 14.000000 11.000000 9.000000 9.000000 15.000000 
+26.000000 33.000000 32.000000 27.000000 24.000000 23.000000 
+24.000000 25.000000 22.000000 18.000000 16.000000 19.000000 
+27.000000 39.000000 41.000000 35.000000 77.000000 76.000000 
+76.000000 78.000000 80.000000 79.000000 76.000000 72.000000 
+70.000000 70.000000 66.000000 54.000000 32.000000 14.000000 
+18.000000 31.000000 39.000000 38.000000 33.000000 30.000000 
+24.000000 17.000000 14.000000 13.000000 11.000000 11.000000 
+10.000000 11.000000 24.000000 39.000000 49.000000 47.000000 
+38.000000 35.000000 37.000000 35.000000 34.000000 37.000000 
+42.000000 43.000000 35.000000 27.000000 33.000000 38.000000 
+20.000000 9.000000 25.000000 40.000000 47.000000 46.000000 
+28.000000 12.000000 10.000000 12.000000 11.000000 10.000000 
+14.000000 17.000000 16.000000 19.000000 29.000000 41.000000 
+44.000000 36.000000 25.000000 20.000000 23.000000 24.000000 
+22.000000 24.000000 29.000000 29.000000 28.000000 34.000000 
+39.000000 39.000000 77.000000 75.000000 76.000000 79.000000 
+83.000000 84.000000 78.000000 70.000000 69.000000 75.000000 
+79.000000 66.000000 36.000000 9.000000 9.000000 28.000000 
+41.000000 39.000000 30.000000 25.000000 26.000000 22.000000 
+17.000000 16.000000 13.000000 11.000000 9.000000 12.000000 
+20.000000 42.000000 59.000000 58.000000 49.000000 47.000000 
+48.000000 41.000000 29.000000 28.000000 40.000000 53.000000 
+53.000000 36.000000 14.000000 16.000000 17.000000 36.000000 
+52.000000 50.000000 51.000000 44.000000 18.000000 13.000000 
+17.000000 11.000000 9.000000 11.000000 13.000000 19.000000 
+22.000000 23.000000 28.000000 36.000000 35.000000 24.000000 
+16.000000 18.000000 23.000000 25.000000 22.000000 21.000000 
+23.000000 26.000000 28.000000 29.000000 32.000000 32.000000 
+78.000000 82.000000 85.000000 84.000000 82.000000 84.000000 
+84.000000 78.000000 70.000000 69.000000 71.000000 53.000000 
+21.000000 9.000000 13.000000 19.000000 32.000000 32.000000 
+21.000000 14.000000 18.000000 18.000000 15.000000 18.000000 
+21.000000 17.000000 9.000000 7.000000 10.000000 30.000000 
+53.000000 61.000000 58.000000 52.000000 52.000000 50.000000 
+37.000000 27.000000 32.000000 49.000000 62.000000 54.000000 
+33.000000 33.000000 46.000000 59.000000 60.000000 43.000000 
+32.000000 25.000000 23.000000 33.000000 27.000000 13.000000 
+11.000000 12.000000 16.000000 18.000000 14.000000 15.000000 
+22.000000 26.000000 21.000000 16.000000 20.000000 25.000000 
+21.000000 14.000000 10.000000 9.000000 12.000000 19.000000 
+25.000000 28.000000 29.000000 29.000000 85.000000 87.000000 
+86.000000 82.000000 81.000000 86.000000 91.000000 89.000000 
+78.000000 67.000000 56.000000 31.000000 9.000000 29.000000 
+25.000000 8.000000 13.000000 23.000000 24.000000 16.000000 
+14.000000 19.000000 22.000000 20.000000 17.000000 14.000000 
+9.000000 4.000000 13.000000 25.000000 38.000000 47.000000 
+49.000000 43.000000 38.000000 38.000000 38.000000 37.000000 
+35.000000 36.000000 40.000000 42.000000 49.000000 55.000000 
+54.000000 49.000000 44.000000 31.000000 16.000000 9.000000 
+16.000000 23.000000 19.000000 15.000000 9.000000 10.000000 
+22.000000 20.000000 10.000000 9.000000 12.000000 16.000000 
+19.000000 21.000000 22.000000 17.000000 11.000000 8.000000 
+8.000000 8.000000 12.000000 24.000000 37.000000 36.000000 
+28.000000 32.000000 86.000000 89.000000 89.000000 88.000000 
+86.000000 87.000000 89.000000 88.000000 80.000000 68.000000 
+48.000000 18.000000 27.000000 88.000000 120.000000 115.000000 
+87.000000 54.000000 28.000000 14.000000 13.000000 19.000000 
+22.000000 19.000000 14.000000 9.000000 8.000000 10.000000 
+15.000000 20.000000 21.000000 22.000000 24.000000 23.000000 
+21.000000 22.000000 28.000000 37.000000 40.000000 34.000000 
+27.000000 28.000000 36.000000 43.000000 40.000000 30.000000 
+24.000000 25.000000 28.000000 22.000000 10.000000 9.000000 
+15.000000 19.000000 16.000000 16.000000 19.000000 14.000000 
+12.000000 12.000000 12.000000 20.000000 34.000000 40.000000 
+31.000000 17.000000 10.000000 11.000000 15.000000 17.000000 
+23.000000 36.000000 45.000000 37.000000 29.000000 45.000000 
+85.000000 88.000000 90.000000 87.000000 85.000000 89.000000 
+93.000000 87.000000 73.000000 55.000000 31.000000 28.000000 
+86.000000 164.000000 230.000000 239.000000 180.000000 101.000000 
+46.000000 18.000000 13.000000 12.000000 14.000000 17.000000 
+14.000000 9.000000 6.000000 10.000000 13.000000 14.000000 
+12.000000 12.000000 16.000000 18.000000 19.000000 23.000000 
+27.000000 31.000000 33.000000 26.000000 16.000000 15.000000 
+21.000000 24.000000 20.000000 13.000000 14.000000 28.000000 
+40.000000 30.000000 19.000000 20.000000 14.000000 3.000000 
+10.000000 25.000000 23.000000 12.000000 6.000000 11.000000 
+21.000000 24.000000 37.000000 62.000000 69.000000 57.000000 
+41.000000 33.000000 34.000000 36.000000 39.000000 44.000000 
+44.000000 40.000000 48.000000 73.000000 84.000000 85.000000 
+86.000000 85.000000 86.000000 92.000000 98.000000 90.000000 
+66.000000 34.000000 20.000000 72.000000 154.000000 193.000000 
+204.000000 190.000000 152.000000 108.000000 66.000000 27.000000 
+13.000000 15.000000 21.000000 17.000000 9.000000 7.000000 
+5.000000 10.000000 19.000000 20.000000 16.000000 13.000000 
+13.000000 18.000000 21.000000 20.000000 20.000000 23.000000 
+27.000000 22.000000 16.000000 15.000000 15.000000 11.000000 
+7.000000 5.000000 11.000000 27.000000 35.000000 32.000000 
+40.000000 53.000000 53.000000 46.000000 39.000000 29.000000 
+25.000000 24.000000 17.000000 20.000000 29.000000 23.000000 
+30.000000 64.000000 84.000000 82.000000 76.000000 75.000000 
+62.000000 44.000000 47.000000 59.000000 60.000000 60.000000 
+76.000000 99.000000 91.000000 90.000000 89.000000 87.000000 
+81.000000 80.000000 85.000000 83.000000 55.000000 23.000000 
+46.000000 121.000000 185.000000 205.000000 185.000000 158.000000 
+140.000000 116.000000 74.000000 36.000000 24.000000 28.000000 
+29.000000 15.000000 5.000000 4.000000 10.000000 13.000000 
+10.000000 11.000000 17.000000 18.000000 16.000000 22.000000 
+24.000000 20.000000 15.000000 13.000000 14.000000 11.000000 
+10.000000 13.000000 16.000000 16.000000 16.000000 15.000000 
+14.000000 22.000000 29.000000 37.000000 66.000000 118.000000 
+174.000000 200.000000 161.000000 81.000000 31.000000 18.000000 
+19.000000 35.000000 43.000000 30.000000 33.000000 63.000000 
+78.000000 78.000000 73.000000 59.000000 34.000000 34.000000 
+71.000000 90.000000 80.000000 71.000000 88.000000 109.000000 
+94.000000 93.000000 89.000000 80.000000 74.000000 77.000000 
+82.000000 75.000000 48.000000 36.000000 76.000000 125.000000 
+159.000000 167.000000 151.000000 129.000000 110.000000 88.000000 
+61.000000 39.000000 29.000000 30.000000 27.000000 15.000000 
+7.000000 6.000000 14.000000 15.000000 8.000000 6.000000 
+12.000000 17.000000 18.000000 16.000000 17.000000 17.000000 
+16.000000 15.000000 14.000000 10.000000 7.000000 11.000000 
+17.000000 22.000000 27.000000 27.000000 22.000000 18.000000 
+29.000000 51.000000 87.000000 145.000000 214.000000 263.000000 
+255.000000 191.000000 107.000000 40.000000 12.000000 23.000000 
+41.000000 40.000000 39.000000 58.000000 73.000000 74.000000 
+64.000000 44.000000 30.000000 56.000000 99.000000 104.000000 
+85.000000 78.000000 94.000000 112.000000 89.000000 88.000000 
+81.000000 73.000000 74.000000 85.000000 89.000000 72.000000 
+51.000000 53.000000 79.000000 105.000000 108.000000 88.000000 
+68.000000 64.000000 68.000000 65.000000 50.000000 35.000000 
+30.000000 31.000000 27.000000 14.000000 9.000000 8.000000 
+8.000000 11.000000 12.000000 9.000000 8.000000 9.000000 
+8.000000 8.000000 9.000000 10.000000 15.000000 16.000000 
+10.000000 7.000000 7.000000 15.000000 23.000000 23.000000 
+27.000000 33.000000 26.000000 17.000000 29.000000 60.000000 
+104.000000 141.000000 165.000000 198.000000 234.000000 238.000000 
+196.000000 127.000000 57.000000 19.000000 29.000000 51.000000 
+52.000000 49.000000 58.000000 68.000000 68.000000 69.000000 
+78.000000 93.000000 107.000000 102.000000 87.000000 89.000000 
+103.000000 113.000000 83.000000 80.000000 75.000000 71.000000 
+72.000000 79.000000 82.000000 73.000000 59.000000 58.000000 
+68.000000 85.000000 87.000000 70.000000 58.000000 63.000000 
+65.000000 59.000000 45.000000 32.000000 30.000000 31.000000 
+25.000000 15.000000 13.000000 15.000000 16.000000 19.000000 
+18.000000 16.000000 14.000000 5.000000 6.000000 11.000000 
+11.000000 5.000000 9.000000 13.000000 6.000000 7.000000 
+11.000000 15.000000 22.000000 26.000000 32.000000 40.000000 
+35.000000 32.000000 46.000000 60.000000 84.000000 118.000000 
+136.000000 145.000000 177.000000 221.000000 237.000000 208.000000 
+144.000000 69.000000 28.000000 36.000000 50.000000 46.000000 
+49.000000 67.000000 80.000000 91.000000 110.000000 115.000000 
+100.000000 83.000000 84.000000 99.000000 107.000000 108.000000 
+71.000000 70.000000 74.000000 75.000000 73.000000 70.000000 
+71.000000 71.000000 66.000000 56.000000 50.000000 56.000000 
+60.000000 58.000000 68.000000 76.000000 65.000000 48.000000 
+36.000000 25.000000 21.000000 22.000000 25.000000 25.000000 
+21.000000 20.000000 24.000000 29.000000 24.000000 18.000000 
+16.000000 10.000000 15.000000 20.000000 18.000000 11.000000 
+11.000000 14.000000 16.000000 10.000000 13.000000 16.000000 
+16.000000 20.000000 22.000000 33.000000 44.000000 49.000000 
+59.000000 68.000000 70.000000 83.000000 107.000000 123.000000 
+138.000000 171.000000 217.000000 242.000000 224.000000 166.000000 
+85.000000 32.000000 34.000000 51.000000 57.000000 71.000000 
+87.000000 97.000000 112.000000 116.000000 98.000000 79.000000 
+82.000000 97.000000 106.000000 108.000000 71.000000 76.000000 
+79.000000 78.000000 76.000000 76.000000 76.000000 66.000000 
+49.000000 32.000000 26.000000 35.000000 43.000000 47.000000 
+57.000000 61.000000 46.000000 25.000000 18.000000 20.000000 
+21.000000 30.000000 33.000000 28.000000 19.000000 14.000000 
+7.000000 13.000000 16.000000 12.000000 11.000000 12.000000 
+21.000000 21.000000 14.000000 16.000000 11.000000 6.000000 
+12.000000 11.000000 14.000000 21.000000 15.000000 15.000000 
+11.000000 18.000000 33.000000 39.000000 49.000000 64.000000 
+70.000000 71.000000 84.000000 106.000000 121.000000 132.000000 
+159.000000 204.000000 243.000000 243.000000 191.000000 101.000000 
+36.000000 32.000000 50.000000 67.000000 76.000000 85.000000 
+93.000000 95.000000 89.000000 89.000000 100.000000 109.000000 
+113.000000 114.000000 75.000000 84.000000 90.000000 91.000000 
+89.000000 85.000000 75.000000 55.000000 36.000000 27.000000 
+29.000000 36.000000 39.000000 38.000000 39.000000 46.000000 
+47.000000 35.000000 21.000000 22.000000 27.000000 35.000000 
+35.000000 26.000000 18.000000 18.000000 12.000000 9.000000 
+10.000000 15.000000 19.000000 14.000000 12.000000 14.000000 
+13.000000 15.000000 12.000000 7.000000 7.000000 15.000000 
+31.000000 34.000000 16.000000 20.000000 26.000000 21.000000 
+26.000000 37.000000 48.000000 55.000000 57.000000 57.000000 
+61.000000 77.000000 102.000000 123.000000 136.000000 157.000000 
+199.000000 240.000000 251.000000 208.000000 123.000000 46.000000 
+25.000000 33.000000 43.000000 56.000000 65.000000 67.000000 
+70.000000 84.000000 100.000000 106.000000 103.000000 101.000000 
+80.000000 84.000000 82.000000 81.000000 83.000000 76.000000 
+54.000000 28.000000 19.000000 24.000000 31.000000 38.000000 
+37.000000 33.000000 41.000000 52.000000 55.000000 53.000000 
+42.000000 27.000000 26.000000 33.000000 37.000000 28.000000 
+14.000000 10.000000 9.000000 12.000000 10.000000 11.000000 
+16.000000 13.000000 15.000000 27.000000 31.000000 25.000000 
+17.000000 11.000000 14.000000 27.000000 37.000000 35.000000 
+19.000000 17.000000 26.000000 30.000000 36.000000 39.000000 
+45.000000 59.000000 69.000000 69.000000 64.000000 59.000000 
+71.000000 109.000000 143.000000 151.000000 153.000000 177.000000 
+217.000000 239.000000 213.000000 143.000000 60.000000 11.000000 
+13.000000 37.000000 50.000000 49.000000 51.000000 59.000000 
+70.000000 91.000000 107.000000 111.000000 55.000000 63.000000 
+67.000000 62.000000 47.000000 28.000000 18.000000 26.000000 
+38.000000 42.000000 38.000000 31.000000 23.000000 28.000000 
+53.000000 63.000000 49.000000 37.000000 34.000000 28.000000 
+31.000000 38.000000 43.000000 41.000000 33.000000 22.000000 
+14.000000 20.000000 20.000000 10.000000 9.000000 13.000000 
+23.000000 27.000000 24.000000 22.000000 25.000000 20.000000 
+10.000000 15.000000 17.000000 11.000000 7.000000 17.000000 
+30.000000 34.000000 25.000000 23.000000 45.000000 65.000000 
+65.000000 59.000000 65.000000 67.000000 54.000000 61.000000 
+102.000000 145.000000 166.000000 166.000000 171.000000 196.000000 
+221.000000 207.000000 150.000000 73.000000 20.000000 18.000000 
+26.000000 20.000000 31.000000 56.000000 64.000000 77.000000 
+106.000000 125.000000 27.000000 39.000000 34.000000 12.000000 
+1.000000 5.000000 16.000000 38.000000 46.000000 36.000000 
+19.000000 8.000000 10.000000 26.000000 52.000000 68.000000 
+62.000000 44.000000 37.000000 43.000000 50.000000 49.000000 
+41.000000 34.000000 29.000000 24.000000 22.000000 26.000000 
+27.000000 28.000000 32.000000 37.000000 36.000000 30.000000 
+24.000000 22.000000 24.000000 26.000000 24.000000 21.000000 
+18.000000 15.000000 14.000000 13.000000 16.000000 19.000000 
+14.000000 30.000000 56.000000 64.000000 54.000000 38.000000 
+41.000000 60.000000 61.000000 40.000000 44.000000 91.000000 
+146.000000 175.000000 174.000000 166.000000 170.000000 184.000000 
+187.000000 159.000000 97.000000 40.000000 26.000000 15.000000 
+12.000000 36.000000 52.000000 72.000000 104.000000 131.000000 
+25.000000 35.000000 27.000000 19.000000 22.000000 29.000000 
+34.000000 34.000000 26.000000 14.000000 8.000000 12.000000 
+18.000000 28.000000 40.000000 47.000000 46.000000 36.000000 
+24.000000 16.000000 15.000000 14.000000 15.000000 22.000000 
+23.000000 18.000000 19.000000 19.000000 18.000000 23.000000 
+32.000000 41.000000 44.000000 40.000000 33.000000 29.000000 
+26.000000 27.000000 30.000000 24.000000 13.000000 11.000000 
+13.000000 17.000000 16.000000 12.000000 16.000000 34.000000 
+47.000000 42.000000 27.000000 10.000000 9.000000 27.000000 
+48.000000 56.000000 45.000000 46.000000 84.000000 143.000000 
+183.000000 179.000000 153.000000 148.000000 170.000000 182.000000 
+159.000000 114.000000 73.000000 42.000000 19.000000 6.000000 
+15.000000 47.000000 77.000000 88.000000 34.000000 36.000000 
+33.000000 30.000000 30.000000 30.000000 27.000000 24.000000 
+19.000000 11.000000 9.000000 14.000000 24.000000 35.000000 
+39.000000 39.000000 37.000000 36.000000 29.000000 16.000000 
+10.000000 8.000000 10.000000 12.000000 8.000000 6.000000 
+14.000000 23.000000 35.000000 39.000000 43.000000 72.000000 
+104.000000 118.000000 113.000000 93.000000 67.000000 46.000000 
+30.000000 20.000000 18.000000 21.000000 20.000000 16.000000 
+17.000000 23.000000 31.000000 34.000000 27.000000 17.000000 
+15.000000 9.000000 3.000000 8.000000 29.000000 48.000000 
+44.000000 30.000000 39.000000 82.000000 135.000000 163.000000 
+163.000000 152.000000 148.000000 164.000000 185.000000 181.000000 
+146.000000 104.000000 63.000000 27.000000 12.000000 24.000000 
+43.000000 42.000000 21.000000 20.000000 24.000000 24.000000 
+21.000000 19.000000 20.000000 22.000000 21.000000 16.000000 
+13.000000 13.000000 17.000000 32.000000 52.000000 59.000000 
+46.000000 25.000000 13.000000 9.000000 21.000000 29.000000 
+37.000000 36.000000 31.000000 33.000000 36.000000 46.000000 
+65.000000 72.000000 65.000000 70.000000 108.000000 170.000000 
+211.000000 190.000000 129.000000 80.000000 56.000000 44.000000 
+41.000000 44.000000 40.000000 30.000000 25.000000 28.000000 
+34.000000 26.000000 20.000000 32.000000 35.000000 18.000000 
+17.000000 16.000000 11.000000 23.000000 35.000000 34.000000 
+31.000000 38.000000 68.000000 112.000000 144.000000 151.000000 
+145.000000 148.000000 169.000000 193.000000 203.000000 190.000000 
+145.000000 82.000000 36.000000 12.000000 11.000000 33.000000 
+22.000000 24.000000 28.000000 27.000000 21.000000 16.000000 
+16.000000 19.000000 22.000000 22.000000 21.000000 19.000000 
+24.000000 38.000000 39.000000 28.000000 14.000000 11.000000 
+22.000000 23.000000 53.000000 81.000000 82.000000 65.000000 
+55.000000 56.000000 55.000000 47.000000 48.000000 57.000000 
+62.000000 64.000000 86.000000 155.000000 222.000000 227.000000 
+171.000000 100.000000 62.000000 63.000000 68.000000 65.000000 
+65.000000 70.000000 69.000000 57.000000 41.000000 36.000000 
+36.000000 37.000000 36.000000 33.000000 28.000000 21.000000 
+11.000000 14.000000 27.000000 31.000000 29.000000 25.000000 
+22.000000 41.000000 82.000000 121.000000 141.000000 147.000000 
+155.000000 172.000000 195.000000 207.000000 198.000000 161.000000 
+99.000000 38.000000 9.000000 10.000000 29.000000 35.000000 
+34.000000 28.000000 22.000000 18.000000 20.000000 26.000000 
+32.000000 28.000000 21.000000 26.000000 41.000000 51.000000 
+41.000000 25.000000 23.000000 29.000000 34.000000 35.000000 
+45.000000 79.000000 93.000000 78.000000 59.000000 55.000000 
+57.000000 57.000000 55.000000 57.000000 65.000000 78.000000 
+99.000000 142.000000 191.000000 210.000000 193.000000 151.000000 
+101.000000 80.000000 82.000000 86.000000 88.000000 81.000000 
+66.000000 51.000000 44.000000 40.000000 34.000000 28.000000 
+24.000000 23.000000 22.000000 20.000000 16.000000 11.000000 
+10.000000 16.000000 23.000000 17.000000 14.000000 26.000000 
+40.000000 62.000000 93.000000 125.000000 152.000000 171.000000 
+172.000000 160.000000 161.000000 180.000000 180.000000 129.000000 
+54.000000 12.000000 24.000000 33.000000 33.000000 29.000000 
+26.000000 24.000000 20.000000 21.000000 26.000000 19.000000 
+10.000000 23.000000 46.000000 62.000000 60.000000 55.000000 
+54.000000 51.000000 50.000000 59.000000 72.000000 78.000000 
+75.000000 63.000000 54.000000 54.000000 60.000000 68.000000 
+75.000000 76.000000 75.000000 74.000000 84.000000 115.000000 
+153.000000 181.000000 187.000000 159.000000 108.000000 75.000000 
+70.000000 75.000000 78.000000 70.000000 55.000000 44.000000 
+38.000000 33.000000 32.000000 32.000000 29.000000 25.000000 
+25.000000 25.000000 25.000000 21.000000 12.000000 4.000000 
+5.000000 15.000000 19.000000 10.000000 20.000000 43.000000 
+48.000000 63.000000 107.000000 163.000000 184.000000 156.000000 
+132.000000 148.000000 170.000000 134.000000 57.000000 24.000000 
+26.000000 26.000000 26.000000 29.000000 29.000000 23.000000 
+18.000000 22.000000 26.000000 21.000000 17.000000 28.000000 
+44.000000 47.000000 42.000000 57.000000 73.000000 73.000000 
+71.000000 75.000000 80.000000 82.000000 75.000000 64.000000 
+56.000000 55.000000 62.000000 76.000000 89.000000 92.000000 
+85.000000 71.000000 62.000000 73.000000 96.000000 120.000000 
+130.000000 113.000000 76.000000 49.000000 46.000000 55.000000 
+63.000000 65.000000 67.000000 68.000000 63.000000 53.000000 
+40.000000 27.000000 13.000000 9.000000 17.000000 26.000000 
+25.000000 18.000000 11.000000 8.000000 9.000000 16.000000 
+31.000000 26.000000 12.000000 24.000000 38.000000 43.000000 
+62.000000 102.000000 147.000000 168.000000 174.000000 177.000000 
+171.000000 125.000000 73.000000 69.000000 30.000000 31.000000 
+31.000000 29.000000 26.000000 23.000000 22.000000 22.000000 
+19.000000 17.000000 26.000000 43.000000 53.000000 54.000000 
+64.000000 84.000000 88.000000 83.000000 84.000000 89.000000 
+86.000000 75.000000 67.000000 66.000000 68.000000 71.000000 
+76.000000 82.000000 86.000000 91.000000 95.000000 94.000000 
+79.000000 61.000000 62.000000 76.000000 87.000000 83.000000 
+68.000000 54.000000 49.000000 48.000000 51.000000 59.000000 
+69.000000 74.000000 68.000000 57.000000 45.000000 28.000000 
+17.000000 14.000000 12.000000 15.000000 18.000000 20.000000 
+17.000000 9.000000 7.000000 14.000000 24.000000 26.000000 
+21.000000 18.000000 13.000000 25.000000 53.000000 65.000000 
+83.000000 121.000000 158.000000 188.000000 203.000000 173.000000 
+107.000000 53.000000 24.000000 25.000000 28.000000 29.000000 
+27.000000 26.000000 25.000000 24.000000 24.000000 30.000000 
+40.000000 48.000000 55.000000 69.000000 89.000000 98.000000 
+92.000000 83.000000 77.000000 77.000000 79.000000 82.000000 
+84.000000 83.000000 82.000000 87.000000 96.000000 97.000000 
+89.000000 82.000000 86.000000 96.000000 97.000000 84.000000 
+68.000000 63.000000 69.000000 76.000000 77.000000 70.000000 
+64.000000 61.000000 57.000000 53.000000 57.000000 67.000000 
+72.000000 66.000000 57.000000 45.000000 19.000000 9.000000 
+19.000000 21.000000 15.000000 16.000000 18.000000 11.000000 
+9.000000 15.000000 19.000000 19.000000 24.000000 36.000000 
+40.000000 29.000000 27.000000 46.000000 62.000000 73.000000 
+94.000000 116.000000 124.000000 112.000000 78.000000 37.000000 
+22.000000 23.000000 27.000000 30.000000 29.000000 26.000000 
+24.000000 26.000000 33.000000 39.000000 47.000000 58.000000 
+69.000000 77.000000 83.000000 86.000000 87.000000 85.000000 
+83.000000 84.000000 87.000000 88.000000 84.000000 81.000000 
+86.000000 97.000000 104.000000 101.000000 93.000000 89.000000 
+89.000000 90.000000 91.000000 92.000000 91.000000 89.000000 
+87.000000 90.000000 94.000000 94.000000 86.000000 78.000000 
+71.000000 63.000000 58.000000 58.000000 60.000000 58.000000 
+59.000000 54.000000 26.000000 14.000000 25.000000 28.000000 
+17.000000 12.000000 20.000000 26.000000 23.000000 18.000000 
+16.000000 13.000000 13.000000 19.000000 32.000000 40.000000 
+35.000000 21.000000 21.000000 36.000000 49.000000 70.000000 
+87.000000 89.000000 76.000000 53.000000 23.000000 22.000000 
+20.000000 18.000000 19.000000 20.000000 24.000000 30.000000 
+36.000000 48.000000 65.000000 79.000000 85.000000 87.000000 
+86.000000 84.000000 83.000000 86.000000 89.000000 93.000000 
+96.000000 96.000000 93.000000 91.000000 91.000000 92.000000 
+93.000000 92.000000 89.000000 85.000000 81.000000 78.000000 
+78.000000 80.000000 82.000000 83.000000 83.000000 85.000000 
+91.000000 97.000000 97.000000 92.000000 86.000000 81.000000 
+74.000000 64.000000 55.000000 51.000000 53.000000 53.000000 
+38.000000 13.000000 12.000000 28.000000 35.000000 23.000000 
+12.000000 17.000000 25.000000 28.000000 29.000000 26.000000 
+21.000000 18.000000 20.000000 25.000000 31.000000 37.000000 
+29.000000 11.000000 18.000000 46.000000 56.000000 59.000000 
+57.000000 48.000000 21.000000 19.000000 17.000000 18.000000 
+19.000000 23.000000 33.000000 46.000000 57.000000 65.000000 
+74.000000 82.000000 83.000000 80.000000 78.000000 80.000000 
+84.000000 89.000000 93.000000 94.000000 91.000000 86.000000 
+86.000000 91.000000 96.000000 96.000000 93.000000 92.000000 
+91.000000 86.000000 78.000000 75.000000 80.000000 88.000000 
+91.000000 91.000000 90.000000 91.000000 92.000000 93.000000 
+95.000000 95.000000 92.000000 86.000000 80.000000 74.000000 
+66.000000 59.000000 55.000000 51.000000 42.000000 21.000000 
+10.000000 23.000000 33.000000 26.000000 17.000000 21.000000 
+32.000000 31.000000 23.000000 17.000000 17.000000 25.000000 
+33.000000 34.000000 29.000000 23.000000 18.000000 13.000000 
+11.000000 17.000000 29.000000 41.000000 41.000000 33.000000 
+25.000000 27.000000 28.000000 30.000000 34.000000 40.000000 
+45.000000 53.000000 66.000000 82.000000 90.000000 87.000000 
+79.000000 79.000000 85.000000 90.000000 93.000000 96.000000 
+96.000000 93.000000 89.000000 88.000000 92.000000 95.000000 
+97.000000 96.000000 95.000000 95.000000 92.000000 87.000000 
+83.000000 83.000000 84.000000 86.000000 87.000000 88.000000 
+90.000000 89.000000 87.000000 85.000000 85.000000 86.000000 
+87.000000 88.000000 89.000000 88.000000 79.000000 64.000000 
+55.000000 57.000000 57.000000 38.000000 9.000000 12.000000 
+29.000000 31.000000 28.000000 30.000000 37.000000 31.000000 
+16.000000 12.000000 23.000000 33.000000 32.000000 26.000000 
+25.000000 30.000000 32.000000 28.000000 20.000000 14.000000 
+18.000000 36.000000 54.000000 64.000000 29.000000 34.000000 
+35.000000 35.000000 43.000000 62.000000 85.000000 99.000000 
+98.000000 90.000000 84.000000 82.000000 84.000000 89.000000 
+94.000000 94.000000 87.000000 82.000000 84.000000 92.000000 
+96.000000 95.000000 92.000000 92.000000 94.000000 94.000000 
+92.000000 91.000000 90.000000 91.000000 92.000000 93.000000 
+90.000000 87.000000 87.000000 89.000000 88.000000 86.000000 
+85.000000 87.000000 87.000000 85.000000 86.000000 90.000000 
+93.000000 89.000000 80.000000 73.000000 72.000000 74.000000 
+66.000000 42.000000 9.000000 13.000000 31.000000 29.000000 
+18.000000 13.000000 23.000000 37.000000 38.000000 30.000000 
+28.000000 33.000000 36.000000 34.000000 29.000000 28.000000 
+33.000000 36.000000 28.000000 12.000000 9.000000 24.000000 
+47.000000 75.000000 31.000000 48.000000 68.000000 84.000000 
+95.000000 101.000000 102.000000 96.000000 86.000000 83.000000 
+85.000000 86.000000 87.000000 88.000000 90.000000 89.000000 
+88.000000 88.000000 89.000000 90.000000 91.000000 93.000000 
+95.000000 96.000000 94.000000 92.000000 90.000000 87.000000 
+84.000000 87.000000 93.000000 95.000000 91.000000 87.000000 
+87.000000 90.000000 90.000000 85.000000 80.000000 79.000000 
+84.000000 90.000000 91.000000 88.000000 85.000000 84.000000 
+82.000000 79.000000 73.000000 70.000000 68.000000 54.000000 
+22.000000 9.000000 22.000000 23.000000 18.000000 23.000000 
+28.000000 29.000000 27.000000 20.000000 18.000000 24.000000 
+32.000000 30.000000 24.000000 26.000000 36.000000 41.000000 
+30.000000 17.000000 19.000000 14.000000 11.000000 45.000000 
+39.000000 45.000000 46.000000 44.000000 42.000000 43.000000 
+45.000000 36.000000 13.000000 6.000000 20.000000 30.000000 
+36.000000 28.000000 16.000000 14.000000 10.000000 16.000000 
+29.000000 33.000000 30.000000 24.000000 16.000000 17.000000 
+31.000000 50.000000 61.000000 58.000000 43.000000 27.000000 
+14.000000 11.000000 11.000000 14.000000 14.000000 17.000000 
+20.000000 16.000000 12.000000 11.000000 10.000000 11.000000 
+10.000000 11.000000 20.000000 29.000000 36.000000 42.000000 
+42.000000 29.000000 12.000000 13.000000 22.000000 27.000000 
+33.000000 35.000000 29.000000 19.000000 15.000000 20.000000 
+34.000000 49.000000 51.000000 39.000000 32.000000 31.000000 
+23.000000 12.000000 8.000000 13.000000 23.000000 33.000000 
+45.000000 63.000000 76.000000 80.000000 28.000000 37.000000 
+46.000000 45.000000 37.000000 32.000000 33.000000 33.000000 
+25.000000 13.000000 12.000000 32.000000 43.000000 31.000000 
+18.000000 20.000000 16.000000 9.000000 15.000000 22.000000 
+28.000000 29.000000 25.000000 20.000000 21.000000 29.000000 
+36.000000 35.000000 26.000000 16.000000 14.000000 12.000000 
+13.000000 11.000000 11.000000 13.000000 16.000000 16.000000 
+13.000000 9.000000 9.000000 13.000000 15.000000 16.000000 
+23.000000 32.000000 36.000000 37.000000 40.000000 37.000000 
+22.000000 6.000000 10.000000 25.000000 36.000000 40.000000 
+40.000000 39.000000 32.000000 21.000000 16.000000 16.000000 
+14.000000 13.000000 22.000000 28.000000 21.000000 10.000000 
+10.000000 15.000000 13.000000 20.000000 39.000000 63.000000 
+81.000000 87.000000 19.000000 23.000000 28.000000 27.000000 
+20.000000 17.000000 21.000000 30.000000 33.000000 25.000000 
+13.000000 18.000000 32.000000 33.000000 30.000000 28.000000 
+21.000000 13.000000 11.000000 13.000000 18.000000 24.000000 
+27.000000 27.000000 26.000000 25.000000 27.000000 28.000000 
+25.000000 16.000000 9.000000 9.000000 12.000000 15.000000 
+16.000000 16.000000 15.000000 12.000000 12.000000 12.000000 
+15.000000 18.000000 17.000000 15.000000 15.000000 17.000000 
+23.000000 27.000000 31.000000 32.000000 25.000000 18.000000 
+21.000000 30.000000 36.000000 35.000000 31.000000 28.000000 
+24.000000 16.000000 9.000000 5.000000 7.000000 13.000000 
+15.000000 15.000000 15.000000 13.000000 10.000000 9.000000 
+9.000000 19.000000 38.000000 58.000000 70.000000 74.000000 
+15.000000 21.000000 26.000000 26.000000 22.000000 18.000000 
+17.000000 23.000000 30.000000 30.000000 21.000000 13.000000 
+19.000000 25.000000 30.000000 35.000000 32.000000 23.000000 
+13.000000 8.000000 10.000000 15.000000 21.000000 22.000000 
+20.000000 22.000000 27.000000 29.000000 28.000000 23.000000 
+20.000000 18.000000 15.000000 14.000000 18.000000 19.000000 
+16.000000 12.000000 11.000000 12.000000 12.000000 11.000000 
+12.000000 12.000000 12.000000 12.000000 19.000000 26.000000 
+28.000000 29.000000 25.000000 26.000000 37.000000 48.000000 
+55.000000 50.000000 36.000000 25.000000 18.000000 14.000000 
+13.000000 11.000000 8.000000 7.000000 9.000000 11.000000 
+12.000000 13.000000 17.000000 16.000000 9.000000 14.000000 
+32.000000 43.000000 50.000000 57.000000 13.000000 15.000000 
+21.000000 22.000000 18.000000 16.000000 17.000000 21.000000 
+29.000000 30.000000 22.000000 13.000000 14.000000 19.000000 
+20.000000 24.000000 27.000000 31.000000 29.000000 22.000000 
+13.000000 9.000000 13.000000 19.000000 23.000000 25.000000 
+27.000000 28.000000 30.000000 32.000000 32.000000 28.000000 
+23.000000 18.000000 18.000000 19.000000 18.000000 16.000000 
+14.000000 13.000000 15.000000 16.000000 20.000000 24.000000 
+24.000000 20.000000 19.000000 27.000000 33.000000 26.000000 
+15.000000 23.000000 40.000000 56.000000 69.000000 68.000000 
+50.000000 24.000000 11.000000 11.000000 10.000000 10.000000 
+8.000000 7.000000 9.000000 9.000000 8.000000 16.000000 
+28.000000 32.000000 21.000000 9.000000 20.000000 36.000000 
+37.000000 33.000000 66.000000 38.000000 16.000000 7.000000 
+9.000000 11.000000 13.000000 21.000000 30.000000 32.000000 
+25.000000 15.000000 13.000000 17.000000 16.000000 20.000000 
+27.000000 32.000000 27.000000 19.000000 15.000000 15.000000 
+20.000000 22.000000 22.000000 22.000000 24.000000 25.000000 
+24.000000 24.000000 26.000000 30.000000 32.000000 32.000000 
+27.000000 21.000000 16.000000 14.000000 12.000000 11.000000 
+11.000000 11.000000 18.000000 27.000000 30.000000 27.000000 
+24.000000 20.000000 22.000000 17.000000 14.000000 26.000000 
+39.000000 52.000000 64.000000 52.000000 23.000000 10.000000 
+12.000000 12.000000 11.000000 9.000000 10.000000 10.000000 
+9.000000 11.000000 18.000000 27.000000 33.000000 31.000000 
+21.000000 9.000000 9.000000 17.000000 19.000000 19.000000 
+126.000000 93.000000 54.000000 22.000000 11.000000 12.000000 
+13.000000 20.000000 32.000000 32.000000 23.000000 15.000000 
+18.000000 29.000000 35.000000 34.000000 32.000000 32.000000 
+30.000000 25.000000 23.000000 30.000000 36.000000 33.000000 
+25.000000 20.000000 21.000000 25.000000 27.000000 25.000000 
+21.000000 21.000000 25.000000 28.000000 25.000000 18.000000 
+14.000000 17.000000 21.000000 22.000000 20.000000 19.000000 
+19.000000 17.000000 17.000000 23.000000 32.000000 31.000000 
+21.000000 11.000000 14.000000 28.000000 42.000000 51.000000 
+53.000000 41.000000 12.000000 8.000000 24.000000 23.000000 
+13.000000 11.000000 13.000000 17.000000 21.000000 20.000000 
+22.000000 25.000000 19.000000 17.000000 18.000000 15.000000 
+10.000000 6.000000 7.000000 14.000000 133.000000 126.000000 
+107.000000 79.000000 49.000000 29.000000 21.000000 17.000000 
+16.000000 19.000000 22.000000 24.000000 26.000000 31.000000 
+32.000000 25.000000 27.000000 34.000000 37.000000 33.000000 
+26.000000 26.000000 34.000000 42.000000 41.000000 30.000000 
+19.000000 16.000000 21.000000 25.000000 24.000000 22.000000 
+24.000000 27.000000 27.000000 22.000000 16.000000 14.000000 
+19.000000 24.000000 29.000000 30.000000 26.000000 20.000000 
+17.000000 20.000000 24.000000 26.000000 21.000000 20.000000 
+31.000000 42.000000 56.000000 70.000000 68.000000 41.000000 
+16.000000 15.000000 25.000000 28.000000 17.000000 9.000000 
+8.000000 10.000000 18.000000 20.000000 15.000000 10.000000 
+8.000000 15.000000 20.000000 20.000000 17.000000 13.000000 
+11.000000 11.000000 119.000000 129.000000 129.000000 113.000000 
+81.000000 42.000000 15.000000 8.000000 11.000000 12.000000 
+15.000000 24.000000 28.000000 29.000000 29.000000 32.000000 
+39.000000 40.000000 36.000000 34.000000 33.000000 32.000000 
+33.000000 34.000000 34.000000 32.000000 23.000000 17.000000 
+21.000000 25.000000 23.000000 21.000000 22.000000 24.000000 
+26.000000 24.000000 20.000000 17.000000 16.000000 20.000000 
+22.000000 22.000000 22.000000 21.000000 22.000000 24.000000 
+23.000000 19.000000 18.000000 33.000000 56.000000 66.000000 
+67.000000 65.000000 52.000000 23.000000 10.000000 12.000000 
+13.000000 19.000000 17.000000 8.000000 6.000000 9.000000 
+14.000000 18.000000 14.000000 11.000000 15.000000 18.000000 
+16.000000 15.000000 20.000000 24.000000 24.000000 21.000000 
+111.000000 119.000000 119.000000 106.000000 82.000000 58.000000 
+44.000000 38.000000 31.000000 16.000000 5.000000 16.000000 
+31.000000 39.000000 41.000000 40.000000 38.000000 39.000000 
+38.000000 34.000000 31.000000 33.000000 39.000000 39.000000 
+31.000000 21.000000 17.000000 14.000000 15.000000 18.000000 
+16.000000 16.000000 19.000000 21.000000 21.000000 21.000000 
+22.000000 23.000000 22.000000 23.000000 23.000000 21.000000 
+16.000000 13.000000 19.000000 29.000000 33.000000 29.000000 
+28.000000 35.000000 43.000000 42.000000 37.000000 36.000000 
+33.000000 22.000000 10.000000 5.000000 8.000000 17.000000 
+20.000000 14.000000 9.000000 10.000000 15.000000 21.000000 
+21.000000 16.000000 14.000000 14.000000 14.000000 13.000000 
+14.000000 21.000000 28.000000 26.000000 102.000000 103.000000 
+108.000000 108.000000 97.000000 88.000000 88.000000 81.000000 
+52.000000 35.000000 50.000000 64.000000 63.000000 51.000000 
+38.000000 34.000000 34.000000 36.000000 44.000000 42.000000 
+32.000000 27.000000 36.000000 44.000000 37.000000 22.000000 
+13.000000 12.000000 15.000000 16.000000 16.000000 18.000000 
+20.000000 21.000000 20.000000 20.000000 21.000000 23.000000 
+26.000000 27.000000 28.000000 26.000000 21.000000 19.000000 
+23.000000 31.000000 35.000000 33.000000 25.000000 21.000000 
+23.000000 26.000000 33.000000 38.000000 31.000000 15.000000 
+7.000000 11.000000 19.000000 21.000000 15.000000 10.000000 
+9.000000 13.000000 25.000000 33.000000 30.000000 19.000000 
+14.000000 21.000000 26.000000 23.000000 18.000000 15.000000 
+17.000000 18.000000 97.000000 98.000000 100.000000 102.000000 
+99.000000 97.000000 99.000000 97.000000 84.000000 84.000000 
+109.000000 112.000000 80.000000 42.000000 28.000000 34.000000 
+29.000000 25.000000 32.000000 37.000000 34.000000 28.000000 
+22.000000 29.000000 37.000000 30.000000 18.000000 15.000000 
+19.000000 26.000000 26.000000 21.000000 19.000000 21.000000 
+23.000000 20.000000 15.000000 16.000000 23.000000 30.000000 
+30.000000 25.000000 23.000000 25.000000 26.000000 28.000000 
+27.000000 23.000000 16.000000 21.000000 34.000000 39.000000 
+38.000000 34.000000 25.000000 19.000000 23.000000 27.000000 
+22.000000 13.000000 6.000000 7.000000 13.000000 21.000000 
+29.000000 32.000000 29.000000 25.000000 27.000000 31.000000 
+30.000000 25.000000 21.000000 17.000000 15.000000 19.000000 
+94.000000 96.000000 94.000000 93.000000 97.000000 106.000000 
+108.000000 98.000000 85.000000 89.000000 106.000000 102.000000 
+66.000000 27.000000 19.000000 25.000000 19.000000 16.000000 
+20.000000 26.000000 29.000000 24.000000 13.000000 10.000000 
+17.000000 17.000000 15.000000 15.000000 17.000000 25.000000 
+30.000000 27.000000 24.000000 24.000000 26.000000 23.000000 
+19.000000 19.000000 23.000000 25.000000 22.000000 18.000000 
+18.000000 20.000000 24.000000 27.000000 24.000000 12.000000 
+12.000000 26.000000 39.000000 45.000000 40.000000 31.000000 
+25.000000 26.000000 28.000000 24.000000 17.000000 10.000000 
+8.000000 12.000000 18.000000 23.000000 27.000000 30.000000 
+32.000000 32.000000 32.000000 30.000000 24.000000 19.000000 
+19.000000 22.000000 23.000000 21.000000 88.000000 94.000000 
+98.000000 99.000000 102.000000 108.000000 104.000000 88.000000 
+75.000000 85.000000 103.000000 98.000000 61.000000 19.000000 
+7.000000 13.000000 9.000000 8.000000 8.000000 12.000000 
+14.000000 13.000000 9.000000 7.000000 7.000000 8.000000 
+13.000000 14.000000 19.000000 24.000000 26.000000 26.000000 
+25.000000 26.000000 27.000000 25.000000 22.000000 19.000000 
+16.000000 14.000000 15.000000 19.000000 22.000000 24.000000 
+27.000000 29.000000 23.000000 8.000000 11.000000 26.000000 
+36.000000 43.000000 42.000000 32.000000 24.000000 22.000000 
+19.000000 15.000000 16.000000 16.000000 13.000000 13.000000 
+17.000000 24.000000 32.000000 32.000000 28.000000 25.000000 
+23.000000 24.000000 20.000000 16.000000 19.000000 28.000000 
+33.000000 26.000000 86.000000 92.000000 95.000000 93.000000 
+94.000000 93.000000 86.000000 76.000000 81.000000 98.000000 
+108.000000 95.000000 55.000000 15.000000 6.000000 9.000000 
+4.000000 9.000000 13.000000 17.000000 23.000000 27.000000 
+23.000000 16.000000 14.000000 13.000000 12.000000 11.000000 
+17.000000 25.000000 26.000000 24.000000 25.000000 29.000000 
+29.000000 26.000000 23.000000 21.000000 19.000000 20.000000 
+25.000000 28.000000 26.000000 24.000000 25.000000 24.000000 
+16.000000 6.000000 9.000000 26.000000 42.000000 44.000000 
+34.000000 19.000000 16.000000 18.000000 17.000000 14.000000 
+15.000000 14.000000 11.000000 13.000000 21.000000 32.000000 
+40.000000 33.000000 21.000000 14.000000 14.000000 16.000000 
+18.000000 21.000000 22.000000 22.000000 23.000000 23.000000 
+89.000000 94.000000 96.000000 95.000000 92.000000 87.000000 
+84.000000 87.000000 94.000000 97.000000 91.000000 73.000000 
+44.000000 19.000000 7.000000 7.000000 15.000000 30.000000 
+38.000000 35.000000 37.000000 45.000000 43.000000 33.000000 
+28.000000 26.000000 21.000000 16.000000 19.000000 27.000000 
+32.000000 31.000000 28.000000 27.000000 25.000000 24.000000 
+21.000000 20.000000 24.000000 32.000000 34.000000 26.000000 
+17.000000 17.000000 22.000000 18.000000 10.000000 8.000000 
+16.000000 36.000000 52.000000 47.000000 25.000000 12.000000 
+12.000000 14.000000 15.000000 10.000000 9.000000 12.000000 
+10.000000 11.000000 18.000000 25.000000 30.000000 23.000000 
+15.000000 15.000000 17.000000 20.000000 23.000000 26.000000 
+27.000000 21.000000 20.000000 26.000000 89.000000 95.000000 
+101.000000 103.000000 99.000000 93.000000 90.000000 90.000000 
+89.000000 85.000000 79.000000 69.000000 51.000000 26.000000 
+7.000000 12.000000 32.000000 49.000000 51.000000 37.000000 
+25.000000 29.000000 31.000000 28.000000 27.000000 26.000000 
+24.000000 21.000000 25.000000 31.000000 37.000000 35.000000 
+29.000000 24.000000 23.000000 26.000000 27.000000 26.000000 
+27.000000 30.000000 30.000000 27.000000 27.000000 29.000000 
+23.000000 11.000000 9.000000 12.000000 26.000000 41.000000 
+41.000000 25.000000 10.000000 14.000000 18.000000 12.000000 
+9.000000 9.000000 13.000000 15.000000 10.000000 8.000000 
+9.000000 12.000000 15.000000 15.000000 14.000000 14.000000 
+16.000000 18.000000 16.000000 14.000000 20.000000 31.000000 
+43.000000 46.000000 93.000000 93.000000 94.000000 95.000000 
+93.000000 90.000000 87.000000 82.000000 77.000000 80.000000 
+90.000000 96.000000 82.000000 48.000000 21.000000 29.000000 
+45.000000 54.000000 50.000000 38.000000 27.000000 24.000000 
+22.000000 20.000000 18.000000 17.000000 17.000000 20.000000 
+26.000000 31.000000 33.000000 29.000000 27.000000 29.000000 
+30.000000 29.000000 29.000000 30.000000 27.000000 23.000000 
+21.000000 21.000000 20.000000 19.000000 15.000000 15.000000 
+20.000000 25.000000 36.000000 41.000000 27.000000 11.000000 
+7.000000 13.000000 14.000000 10.000000 7.000000 11.000000 
+19.000000 16.000000 9.000000 10.000000 12.000000 12.000000 
+13.000000 14.000000 16.000000 13.000000 12.000000 11.000000 
+7.000000 6.000000 13.000000 26.000000 38.000000 39.000000 
+94.000000 94.000000 97.000000 97.000000 92.000000 88.000000 
+87.000000 85.000000 82.000000 85.000000 96.000000 100.000000 
+79.000000 38.000000 14.000000 25.000000 33.000000 36.000000 
+33.000000 33.000000 36.000000 35.000000 29.000000 23.000000 
+20.000000 19.000000 23.000000 29.000000 30.000000 25.000000 
+19.000000 14.000000 15.000000 24.000000 29.000000 25.000000 
+15.000000 16.000000 29.000000 37.000000 35.000000 20.000000 
+6.000000 5.000000 22.000000 46.000000 53.000000 47.000000 
+48.000000 43.000000 20.000000 13.000000 14.000000 10.000000 
+11.000000 13.000000 11.000000 12.000000 15.000000 15.000000 
+15.000000 14.000000 12.000000 11.000000 10.000000 9.000000 
+10.000000 13.000000 16.000000 13.000000 10.000000 15.000000 
+27.000000 33.000000 25.000000 20.000000 92.000000 97.000000 
+102.000000 103.000000 100.000000 95.000000 90.000000 85.000000 
+85.000000 92.000000 95.000000 81.000000 47.000000 16.000000 
+13.000000 15.000000 11.000000 15.000000 18.000000 24.000000 
+31.000000 30.000000 22.000000 16.000000 18.000000 21.000000 
+26.000000 32.000000 31.000000 21.000000 12.000000 13.000000 
+15.000000 21.000000 24.000000 17.000000 11.000000 10.000000 
+19.000000 41.000000 49.000000 37.000000 30.000000 36.000000 
+45.000000 59.000000 62.000000 44.000000 36.000000 30.000000 
+11.000000 9.000000 14.000000 23.000000 29.000000 18.000000 
+9.000000 13.000000 15.000000 15.000000 19.000000 18.000000 
+12.000000 12.000000 15.000000 14.000000 13.000000 15.000000 
+15.000000 13.000000 11.000000 21.000000 41.000000 47.000000 
+30.000000 27.000000 97.000000 98.000000 98.000000 98.000000 
+97.000000 94.000000 90.000000 91.000000 95.000000 93.000000 
+82.000000 65.000000 40.000000 24.000000 40.000000 45.000000 
+41.000000 34.000000 29.000000 29.000000 27.000000 22.000000 
+19.000000 17.000000 19.000000 25.000000 27.000000 31.000000 
+35.000000 32.000000 23.000000 19.000000 15.000000 14.000000 
+16.000000 14.000000 20.000000 21.000000 15.000000 21.000000 
+28.000000 28.000000 33.000000 45.000000 48.000000 46.000000 
+39.000000 23.000000 15.000000 10.000000 9.000000 10.000000 
+13.000000 25.000000 23.000000 14.000000 17.000000 19.000000 
+14.000000 9.000000 11.000000 13.000000 12.000000 17.000000 
+20.000000 18.000000 13.000000 17.000000 27.000000 28.000000 
+26.000000 33.000000 46.000000 48.000000 39.000000 57.000000 
+96.000000 95.000000 96.000000 96.000000 95.000000 93.000000 
+94.000000 96.000000 95.000000 84.000000 62.000000 37.000000 
+20.000000 49.000000 133.000000 194.000000 184.000000 120.000000 
+57.000000 29.000000 28.000000 26.000000 20.000000 14.000000 
+17.000000 24.000000 29.000000 32.000000 36.000000 38.000000 
+32.000000 20.000000 11.000000 5.000000 9.000000 20.000000 
+29.000000 33.000000 30.000000 17.000000 10.000000 12.000000 
+17.000000 25.000000 35.000000 35.000000 22.000000 14.000000 
+12.000000 17.000000 24.000000 19.000000 13.000000 17.000000 
+14.000000 20.000000 30.000000 24.000000 14.000000 10.000000 
+12.000000 20.000000 36.000000 51.000000 49.000000 32.000000 
+15.000000 14.000000 25.000000 31.000000 39.000000 53.000000 
+63.000000 64.000000 65.000000 79.000000 96.000000 97.000000 
+96.000000 96.000000 99.000000 102.000000 98.000000 87.000000 
+80.000000 76.000000 58.000000 32.000000 40.000000 115.000000 
+218.000000 280.000000 254.000000 173.000000 93.000000 39.000000 
+25.000000 29.000000 22.000000 18.000000 13.000000 18.000000 
+23.000000 24.000000 27.000000 27.000000 25.000000 23.000000 
+20.000000 19.000000 16.000000 20.000000 23.000000 24.000000 
+21.000000 17.000000 14.000000 13.000000 17.000000 22.000000 
+26.000000 25.000000 15.000000 8.000000 17.000000 48.000000 
+75.000000 71.000000 53.000000 38.000000 24.000000 17.000000 
+17.000000 18.000000 17.000000 20.000000 23.000000 33.000000 
+64.000000 90.000000 82.000000 54.000000 32.000000 24.000000 
+10.000000 12.000000 55.000000 89.000000 98.000000 91.000000 
+88.000000 102.000000 95.000000 94.000000 96.000000 100.000000 
+102.000000 99.000000 91.000000 86.000000 82.000000 65.000000 
+42.000000 49.000000 118.000000 195.000000 224.000000 219.000000 
+191.000000 157.000000 117.000000 59.000000 16.000000 14.000000 
+22.000000 27.000000 12.000000 15.000000 18.000000 15.000000 
+17.000000 25.000000 26.000000 20.000000 19.000000 25.000000 
+23.000000 17.000000 13.000000 9.000000 9.000000 14.000000 
+19.000000 15.000000 14.000000 27.000000 31.000000 30.000000 
+24.000000 14.000000 20.000000 62.000000 132.000000 188.000000 
+193.000000 143.000000 67.000000 13.000000 0.000000 10.000000 
+17.000000 22.000000 20.000000 23.000000 58.000000 88.000000 
+86.000000 66.000000 54.000000 51.000000 40.000000 50.000000 
+98.000000 122.000000 111.000000 91.000000 95.000000 115.000000 
+96.000000 95.000000 96.000000 100.000000 96.000000 83.000000 
+77.000000 85.000000 85.000000 56.000000 32.000000 66.000000 
+146.000000 217.000000 238.000000 215.000000 184.000000 153.000000 
+111.000000 58.000000 16.000000 7.000000 20.000000 22.000000 
+15.000000 11.000000 9.000000 7.000000 6.000000 19.000000 
+30.000000 27.000000 19.000000 21.000000 24.000000 23.000000 
+18.000000 9.000000 10.000000 16.000000 19.000000 14.000000 
+15.000000 32.000000 40.000000 36.000000 32.000000 29.000000 
+41.000000 80.000000 156.000000 252.000000 305.000000 270.000000 
+172.000000 78.000000 32.000000 22.000000 17.000000 22.000000 
+19.000000 25.000000 64.000000 90.000000 89.000000 80.000000 
+78.000000 75.000000 82.000000 106.000000 120.000000 109.000000 
+84.000000 76.000000 95.000000 113.000000 98.000000 98.000000 
+95.000000 90.000000 81.000000 75.000000 79.000000 87.000000 
+79.000000 53.000000 48.000000 87.000000 126.000000 151.000000 
+156.000000 148.000000 138.000000 124.000000 95.000000 57.000000 
+29.000000 20.000000 25.000000 26.000000 21.000000 15.000000 
+14.000000 16.000000 13.000000 11.000000 19.000000 27.000000 
+26.000000 21.000000 22.000000 22.000000 14.000000 8.000000 
+15.000000 19.000000 17.000000 15.000000 20.000000 28.000000 
+35.000000 34.000000 28.000000 30.000000 60.000000 105.000000 
+151.000000 209.000000 261.000000 270.000000 227.000000 161.000000 
+103.000000 56.000000 15.000000 13.000000 27.000000 34.000000 
+62.000000 84.000000 83.000000 80.000000 87.000000 92.000000 
+94.000000 106.000000 113.000000 96.000000 80.000000 90.000000 
+108.000000 115.000000 89.000000 92.000000 94.000000 87.000000 
+76.000000 77.000000 91.000000 99.000000 84.000000 62.000000 
+63.000000 87.000000 98.000000 85.000000 66.000000 63.000000 
+74.000000 79.000000 67.000000 50.000000 36.000000 26.000000 
+17.000000 13.000000 14.000000 19.000000 21.000000 19.000000 
+20.000000 16.000000 12.000000 16.000000 17.000000 13.000000 
+11.000000 10.000000 6.000000 8.000000 13.000000 15.000000 
+16.000000 22.000000 30.000000 36.000000 40.000000 41.000000 
+31.000000 30.000000 58.000000 96.000000 123.000000 153.000000 
+197.000000 236.000000 249.000000 228.000000 177.000000 109.000000 
+33.000000 9.000000 33.000000 43.000000 57.000000 80.000000 
+84.000000 80.000000 87.000000 101.000000 106.000000 105.000000 
+103.000000 93.000000 87.000000 97.000000 108.000000 111.000000 
+97.000000 97.000000 94.000000 86.000000 79.000000 81.000000 
+92.000000 95.000000 82.000000 68.000000 67.000000 72.000000 
+73.000000 64.000000 56.000000 62.000000 68.000000 61.000000 
+46.000000 33.000000 29.000000 26.000000 22.000000 18.000000 
+19.000000 20.000000 19.000000 16.000000 14.000000 12.000000 
+11.000000 9.000000 6.000000 8.000000 9.000000 9.000000 
+12.000000 16.000000 15.000000 14.000000 12.000000 21.000000 
+35.000000 41.000000 39.000000 37.000000 35.000000 41.000000 
+63.000000 86.000000 93.000000 102.000000 139.000000 199.000000 
+252.000000 272.000000 244.000000 178.000000 94.000000 29.000000 
+17.000000 38.000000 54.000000 69.000000 78.000000 80.000000 
+87.000000 103.000000 113.000000 109.000000 96.000000 87.000000 
+89.000000 97.000000 103.000000 105.000000 91.000000 94.000000 
+95.000000 90.000000 83.000000 83.000000 90.000000 91.000000 
+79.000000 67.000000 62.000000 57.000000 54.000000 52.000000 
+60.000000 79.000000 79.000000 58.000000 36.000000 26.000000 
+28.000000 35.000000 37.000000 31.000000 22.000000 17.000000 
+18.000000 22.000000 18.000000 11.000000 10.000000 6.000000 
+12.000000 28.000000 33.000000 28.000000 26.000000 22.000000 
+18.000000 18.000000 17.000000 21.000000 30.000000 30.000000 
+22.000000 20.000000 29.000000 44.000000 60.000000 74.000000 
+77.000000 72.000000 87.000000 136.000000 201.000000 252.000000 
+270.000000 250.000000 195.000000 113.000000 38.000000 19.000000 
+42.000000 63.000000 74.000000 80.000000 89.000000 102.000000 
+113.000000 112.000000 98.000000 83.000000 81.000000 89.000000 
+99.000000 107.000000 81.000000 87.000000 92.000000 89.000000 
+83.000000 85.000000 94.000000 98.000000 90.000000 72.000000 
+47.000000 26.000000 26.000000 36.000000 54.000000 72.000000 
+68.000000 47.000000 30.000000 29.000000 39.000000 39.000000 
+31.000000 23.000000 19.000000 13.000000 7.000000 8.000000 
+8.000000 14.000000 15.000000 13.000000 19.000000 28.000000 
+34.000000 35.000000 29.000000 20.000000 15.000000 12.000000 
+12.000000 18.000000 22.000000 27.000000 27.000000 23.000000 
+27.000000 39.000000 49.000000 53.000000 55.000000 56.000000 
+59.000000 83.000000 132.000000 188.000000 236.000000 267.000000 
+265.000000 220.000000 140.000000 69.000000 49.000000 62.000000 
+76.000000 86.000000 94.000000 102.000000 105.000000 99.000000 
+90.000000 91.000000 100.000000 106.000000 107.000000 110.000000 
+89.000000 94.000000 95.000000 88.000000 81.000000 86.000000 
+97.000000 98.000000 79.000000 51.000000 35.000000 34.000000 
+36.000000 37.000000 43.000000 56.000000 67.000000 69.000000 
+59.000000 47.000000 44.000000 43.000000 38.000000 31.000000 
+24.000000 20.000000 18.000000 15.000000 16.000000 19.000000 
+26.000000 31.000000 28.000000 20.000000 16.000000 14.000000 
+17.000000 20.000000 15.000000 13.000000 16.000000 14.000000 
+10.000000 20.000000 29.000000 31.000000 35.000000 42.000000 
+47.000000 48.000000 55.000000 62.000000 56.000000 49.000000 
+66.000000 110.000000 168.000000 226.000000 266.000000 272.000000 
+240.000000 179.000000 116.000000 84.000000 81.000000 84.000000 
+85.000000 87.000000 86.000000 82.000000 85.000000 99.000000 
+112.000000 114.000000 110.000000 109.000000 104.000000 103.000000 
+92.000000 84.000000 89.000000 104.000000 107.000000 86.000000 
+55.000000 37.000000 43.000000 62.000000 70.000000 57.000000 
+51.000000 65.000000 75.000000 69.000000 54.000000 46.000000 
+47.000000 51.000000 48.000000 39.000000 28.000000 21.000000 
+18.000000 15.000000 11.000000 7.000000 19.000000 27.000000 
+28.000000 24.000000 22.000000 25.000000 24.000000 21.000000 
+22.000000 21.000000 13.000000 13.000000 24.000000 27.000000 
+21.000000 19.000000 25.000000 36.000000 47.000000 58.000000 
+67.000000 72.000000 72.000000 62.000000 49.000000 60.000000 
+101.000000 154.000000 206.000000 250.000000 273.000000 261.000000 
+214.000000 153.000000 106.000000 85.000000 80.000000 81.000000 
+76.000000 71.000000 75.000000 87.000000 97.000000 102.000000 
+106.000000 112.000000 99.000000 95.000000 82.000000 77.000000 
+87.000000 97.000000 89.000000 65.000000 43.000000 40.000000 
+56.000000 67.000000 54.000000 42.000000 59.000000 73.000000 
+68.000000 53.000000 40.000000 36.000000 42.000000 50.000000 
+52.000000 51.000000 49.000000 41.000000 29.000000 21.000000 
+19.000000 22.000000 21.000000 17.000000 17.000000 18.000000 
+18.000000 20.000000 16.000000 13.000000 23.000000 29.000000 
+25.000000 21.000000 21.000000 26.000000 37.000000 42.000000 
+35.000000 32.000000 42.000000 58.000000 61.000000 57.000000 
+62.000000 78.000000 81.000000 64.000000 64.000000 95.000000 
+141.000000 186.000000 222.000000 248.000000 257.000000 230.000000 
+166.000000 100.000000 68.000000 67.000000 76.000000 79.000000 
+79.000000 79.000000 84.000000 95.000000 113.000000 127.000000 
+53.000000 63.000000 70.000000 71.000000 63.000000 51.000000 
+37.000000 26.000000 25.000000 32.000000 39.000000 34.000000 
+22.000000 37.000000 75.000000 87.000000 73.000000 53.000000 
+41.000000 38.000000 42.000000 46.000000 50.000000 52.000000 
+47.000000 33.000000 17.000000 7.000000 9.000000 11.000000 
+14.000000 18.000000 24.000000 29.000000 27.000000 22.000000 
+20.000000 17.000000 15.000000 24.000000 30.000000 26.000000 
+21.000000 23.000000 35.000000 42.000000 31.000000 25.000000 
+35.000000 46.000000 45.000000 33.000000 21.000000 34.000000 
+61.000000 70.000000 63.000000 68.000000 101.000000 140.000000 
+166.000000 188.000000 217.000000 240.000000 233.000000 186.000000 
+119.000000 76.000000 71.000000 71.000000 69.000000 69.000000 
+73.000000 81.000000 97.000000 120.000000 30.000000 42.000000 
+44.000000 36.000000 26.000000 20.000000 16.000000 18.000000 
+30.000000 34.000000 21.000000 9.000000 10.000000 31.000000 
+47.000000 50.000000 37.000000 22.000000 17.000000 20.000000 
+22.000000 19.000000 22.000000 30.000000 32.000000 29.000000 
+25.000000 20.000000 15.000000 13.000000 27.000000 58.000000 
+83.000000 78.000000 50.000000 34.000000 32.000000 27.000000 
+16.000000 13.000000 21.000000 24.000000 21.000000 17.000000 
+22.000000 31.000000 29.000000 33.000000 36.000000 28.000000 
+22.000000 28.000000 27.000000 17.000000 26.000000 46.000000 
+61.000000 63.000000 68.000000 102.000000 150.000000 178.000000 
+183.000000 191.000000 215.000000 237.000000 220.000000 150.000000 
+72.000000 41.000000 35.000000 30.000000 43.000000 69.000000 
+93.000000 101.000000 20.000000 15.000000 14.000000 12.000000 
+10.000000 10.000000 11.000000 17.000000 24.000000 20.000000 
+13.000000 12.000000 10.000000 7.000000 16.000000 27.000000 
+19.000000 7.000000 14.000000 15.000000 14.000000 17.000000 
+23.000000 27.000000 27.000000 27.000000 33.000000 47.000000 
+55.000000 51.000000 65.000000 116.000000 181.000000 216.000000 
+187.000000 116.000000 72.000000 58.000000 50.000000 30.000000 
+23.000000 28.000000 21.000000 16.000000 18.000000 22.000000 
+20.000000 22.000000 36.000000 40.000000 20.000000 9.000000 
+12.000000 8.000000 7.000000 23.000000 40.000000 47.000000 
+52.000000 64.000000 102.000000 152.000000 183.000000 187.000000 
+181.000000 189.000000 211.000000 217.000000 177.000000 105.000000 
+47.000000 23.000000 25.000000 40.000000 71.000000 75.000000 
+22.000000 23.000000 23.000000 21.000000 18.000000 16.000000 
+16.000000 16.000000 16.000000 19.000000 18.000000 9.000000 
+4.000000 15.000000 31.000000 42.000000 28.000000 10.000000 
+16.000000 15.000000 29.000000 55.000000 66.000000 65.000000 
+61.000000 56.000000 55.000000 60.000000 65.000000 60.000000 
+53.000000 77.000000 167.000000 260.000000 274.000000 200.000000 
+105.000000 61.000000 67.000000 78.000000 72.000000 62.000000 
+61.000000 65.000000 57.000000 32.000000 13.000000 10.000000 
+18.000000 35.000000 44.000000 28.000000 18.000000 23.000000 
+15.000000 9.000000 14.000000 19.000000 35.000000 49.000000 
+55.000000 90.000000 153.000000 199.000000 205.000000 189.000000 
+180.000000 192.000000 204.000000 192.000000 158.000000 110.000000 
+48.000000 11.000000 25.000000 48.000000 29.000000 28.000000 
+21.000000 16.000000 14.000000 13.000000 13.000000 20.000000 
+27.000000 22.000000 13.000000 10.000000 14.000000 32.000000 
+32.000000 18.000000 18.000000 38.000000 40.000000 34.000000 
+40.000000 67.000000 86.000000 86.000000 70.000000 53.000000 
+46.000000 45.000000 50.000000 58.000000 69.000000 82.000000 
+129.000000 201.000000 240.000000 223.000000 172.000000 115.000000 
+84.000000 77.000000 73.000000 72.000000 73.000000 65.000000 
+45.000000 29.000000 23.000000 23.000000 28.000000 35.000000 
+40.000000 37.000000 28.000000 22.000000 22.000000 11.000000 
+10.000000 19.000000 18.000000 32.000000 51.000000 56.000000 
+77.000000 131.000000 187.000000 217.000000 213.000000 190.000000 
+177.000000 190.000000 210.000000 208.000000 152.000000 69.000000 
+15.000000 13.000000 27.000000 24.000000 18.000000 17.000000 
+18.000000 15.000000 12.000000 15.000000 16.000000 12.000000 
+13.000000 21.000000 36.000000 43.000000 36.000000 46.000000 
+71.000000 68.000000 53.000000 45.000000 56.000000 73.000000 
+77.000000 67.000000 54.000000 50.000000 61.000000 65.000000 
+61.000000 59.000000 66.000000 79.000000 109.000000 161.000000 
+204.000000 210.000000 173.000000 113.000000 75.000000 64.000000 
+67.000000 75.000000 78.000000 69.000000 57.000000 52.000000 
+45.000000 37.000000 29.000000 23.000000 23.000000 25.000000 
+19.000000 13.000000 17.000000 17.000000 7.000000 9.000000 
+19.000000 17.000000 18.000000 34.000000 46.000000 64.000000 
+112.000000 170.000000 209.000000 207.000000 179.000000 173.000000 
+207.000000 237.000000 204.000000 116.000000 45.000000 20.000000 
+21.000000 18.000000 16.000000 16.000000 17.000000 16.000000 
+14.000000 15.000000 14.000000 8.000000 13.000000 28.000000 
+43.000000 59.000000 76.000000 90.000000 87.000000 73.000000 
+63.000000 63.000000 72.000000 83.000000 78.000000 57.000000 
+42.000000 47.000000 69.000000 84.000000 83.000000 76.000000 
+72.000000 72.000000 78.000000 100.000000 126.000000 135.000000 
+116.000000 78.000000 51.000000 44.000000 48.000000 55.000000 
+61.000000 67.000000 69.000000 69.000000 68.000000 63.000000 
+47.000000 25.000000 14.000000 15.000000 11.000000 6.000000 
+11.000000 17.000000 15.000000 8.000000 12.000000 22.000000 
+21.000000 13.000000 22.000000 47.000000 72.000000 109.000000 
+151.000000 175.000000 179.000000 187.000000 224.000000 255.000000 
+220.000000 120.000000 46.000000 34.000000 20.000000 21.000000 
+21.000000 20.000000 19.000000 16.000000 17.000000 21.000000 
+19.000000 11.000000 13.000000 34.000000 60.000000 73.000000 
+75.000000 73.000000 70.000000 73.000000 79.000000 85.000000 
+85.000000 76.000000 63.000000 53.000000 58.000000 67.000000 
+75.000000 82.000000 88.000000 91.000000 89.000000 80.000000 
+72.000000 74.000000 83.000000 89.000000 81.000000 62.000000 
+43.000000 39.000000 45.000000 51.000000 50.000000 49.000000 
+52.000000 62.000000 72.000000 71.000000 55.000000 32.000000 
+11.000000 6.000000 11.000000 14.000000 19.000000 25.000000 
+20.000000 11.000000 3.000000 9.000000 28.000000 26.000000 
+13.000000 23.000000 42.000000 59.000000 84.000000 108.000000 
+127.000000 160.000000 219.000000 260.000000 222.000000 118.000000 
+46.000000 41.000000 23.000000 24.000000 23.000000 21.000000 
+21.000000 20.000000 16.000000 11.000000 12.000000 22.000000 
+38.000000 54.000000 71.000000 83.000000 86.000000 85.000000 
+88.000000 89.000000 82.000000 74.000000 67.000000 66.000000 
+72.000000 78.000000 79.000000 81.000000 86.000000 89.000000 
+87.000000 86.000000 88.000000 91.000000 86.000000 77.000000 
+73.000000 79.000000 87.000000 88.000000 78.000000 67.000000 
+61.000000 58.000000 53.000000 50.000000 57.000000 69.000000 
+74.000000 68.000000 62.000000 52.000000 25.000000 7.000000 
+11.000000 13.000000 14.000000 17.000000 14.000000 8.000000 
+5.000000 11.000000 24.000000 30.000000 28.000000 21.000000 
+15.000000 34.000000 67.000000 89.000000 103.000000 118.000000 
+149.000000 174.000000 147.000000 79.000000 35.000000 36.000000 
+22.000000 22.000000 21.000000 19.000000 20.000000 20.000000 
+18.000000 17.000000 21.000000 30.000000 40.000000 57.000000 
+78.000000 87.000000 83.000000 81.000000 87.000000 88.000000 
+83.000000 78.000000 78.000000 83.000000 87.000000 90.000000 
+94.000000 98.000000 98.000000 98.000000 99.000000 97.000000 
+91.000000 88.000000 92.000000 98.000000 98.000000 91.000000 
+87.000000 90.000000 96.000000 95.000000 86.000000 77.000000 
+70.000000 65.000000 59.000000 56.000000 56.000000 61.000000 
+68.000000 60.000000 32.000000 8.000000 12.000000 19.000000 
+12.000000 9.000000 15.000000 14.000000 10.000000 12.000000 
+21.000000 27.000000 31.000000 32.000000 28.000000 23.000000 
+25.000000 39.000000 58.000000 76.000000 93.000000 103.000000 
+97.000000 70.000000 38.000000 31.000000 15.000000 14.000000 
+15.000000 15.000000 13.000000 14.000000 18.000000 24.000000 
+32.000000 42.000000 63.000000 88.000000 94.000000 82.000000 
+70.000000 72.000000 78.000000 81.000000 82.000000 86.000000 
+89.000000 89.000000 89.000000 92.000000 96.000000 96.000000 
+93.000000 92.000000 93.000000 94.000000 95.000000 97.000000 
+99.000000 99.000000 96.000000 91.000000 87.000000 85.000000 
+89.000000 96.000000 102.000000 99.000000 91.000000 81.000000 
+71.000000 62.000000 55.000000 51.000000 51.000000 48.000000 
+35.000000 14.000000 16.000000 32.000000 30.000000 16.000000 
+15.000000 18.000000 13.000000 13.000000 20.000000 23.000000 
+20.000000 22.000000 29.000000 35.000000 37.000000 27.000000 
+20.000000 43.000000 79.000000 95.000000 86.000000 64.000000 
+40.000000 29.000000 12.000000 12.000000 13.000000 13.000000 
+13.000000 18.000000 30.000000 43.000000 54.000000 68.000000 
+84.000000 88.000000 81.000000 73.000000 76.000000 82.000000 
+85.000000 87.000000 87.000000 87.000000 87.000000 92.000000 
+101.000000 106.000000 104.000000 97.000000 92.000000 92.000000 
+93.000000 93.000000 95.000000 99.000000 102.000000 99.000000 
+93.000000 92.000000 95.000000 98.000000 98.000000 97.000000 
+97.000000 96.000000 95.000000 92.000000 84.000000 72.000000 
+57.000000 45.000000 44.000000 46.000000 41.000000 25.000000 
+17.000000 25.000000 32.000000 27.000000 23.000000 26.000000 
+28.000000 25.000000 19.000000 15.000000 13.000000 18.000000 
+25.000000 27.000000 26.000000 26.000000 20.000000 9.000000 
+18.000000 35.000000 40.000000 43.000000 40.000000 32.000000 
+17.000000 16.000000 15.000000 15.000000 22.000000 35.000000 
+50.000000 64.000000 78.000000 90.000000 92.000000 83.000000 
+73.000000 70.000000 70.000000 72.000000 77.000000 83.000000 
+87.000000 88.000000 90.000000 93.000000 97.000000 100.000000 
+100.000000 98.000000 95.000000 93.000000 95.000000 98.000000 
+99.000000 97.000000 93.000000 91.000000 92.000000 93.000000 
+91.000000 89.000000 87.000000 89.000000 93.000000 97.000000 
+97.000000 92.000000 84.000000 73.000000 64.000000 57.000000 
+56.000000 57.000000 48.000000 26.000000 12.000000 15.000000 
+18.000000 16.000000 18.000000 23.000000 24.000000 22.000000 
+19.000000 17.000000 18.000000 21.000000 23.000000 21.000000 
+17.000000 16.000000 18.000000 20.000000 17.000000 17.000000 
+23.000000 30.000000 29.000000 22.000000 25.000000 28.000000 
+27.000000 25.000000 29.000000 43.000000 65.000000 84.000000 
+93.000000 91.000000 85.000000 78.000000 74.000000 72.000000 
+76.000000 83.000000 88.000000 88.000000 86.000000 88.000000 
+95.000000 99.000000 98.000000 97.000000 96.000000 93.000000 
+88.000000 85.000000 86.000000 88.000000 88.000000 89.000000 
+94.000000 99.000000 98.000000 92.000000 88.000000 89.000000 
+93.000000 95.000000 97.000000 100.000000 103.000000 103.000000 
+98.000000 90.000000 81.000000 71.000000 64.000000 62.000000 
+56.000000 39.000000 17.000000 8.000000 15.000000 21.000000 
+18.000000 20.000000 22.000000 18.000000 17.000000 24.000000 
+28.000000 24.000000 18.000000 18.000000 21.000000 22.000000 
+18.000000 13.000000 13.000000 23.000000 34.000000 37.000000 
+42.000000 54.000000 21.000000 30.000000 43.000000 63.000000 
+83.000000 96.000000 97.000000 90.000000 83.000000 81.000000 
+80.000000 74.000000 69.000000 74.000000 85.000000 90.000000 
+87.000000 83.000000 86.000000 93.000000 96.000000 94.000000 
+92.000000 93.000000 94.000000 94.000000 92.000000 90.000000 
+89.000000 90.000000 94.000000 100.000000 104.000000 105.000000 
+101.000000 96.000000 93.000000 91.000000 90.000000 89.000000 
+90.000000 96.000000 102.000000 103.000000 97.000000 87.000000 
+77.000000 71.000000 70.000000 73.000000 69.000000 52.000000 
+31.000000 10.000000 9.000000 16.000000 11.000000 10.000000 
+14.000000 21.000000 27.000000 28.000000 29.000000 30.000000 
+27.000000 22.000000 16.000000 13.000000 18.000000 20.000000 
+12.000000 26.000000 45.000000 30.000000 42.000000 99.000000 
+77.000000 93.000000 108.000000 116.000000 112.000000 101.000000 
+93.000000 91.000000 90.000000 82.000000 71.000000 67.000000 
+75.000000 87.000000 95.000000 96.000000 93.000000 95.000000 
+97.000000 95.000000 92.000000 93.000000 99.000000 103.000000 
+99.000000 92.000000 89.000000 89.000000 91.000000 94.000000 
+99.000000 104.000000 105.000000 102.000000 97.000000 93.000000 
+90.000000 87.000000 87.000000 90.000000 94.000000 94.000000 
+93.000000 94.000000 94.000000 88.000000 77.000000 69.000000 
+69.000000 74.000000 75.000000 66.000000 46.000000 17.000000 
+8.000000 15.000000 12.000000 5.000000 9.000000 25.000000 
+36.000000 31.000000 22.000000 19.000000 20.000000 18.000000 
+16.000000 20.000000 30.000000 27.000000 17.000000 35.000000 
+51.000000 32.000000 37.000000 95.000000 39.000000 43.000000 
+35.000000 21.000000 17.000000 25.000000 32.000000 21.000000 
+16.000000 52.000000 79.000000 76.000000 50.000000 23.000000 
+15.000000 22.000000 19.000000 9.000000 10.000000 11.000000 
+7.000000 11.000000 14.000000 17.000000 19.000000 20.000000 
+17.000000 15.000000 15.000000 15.000000 16.000000 20.000000 
+15.000000 7.000000 8.000000 15.000000 20.000000 20.000000 
+16.000000 10.000000 8.000000 13.000000 20.000000 17.000000 
+15.000000 14.000000 14.000000 12.000000 4.000000 13.000000 
+17.000000 10.000000 17.000000 32.000000 42.000000 44.000000 
+39.000000 27.000000 16.000000 21.000000 44.000000 66.000000 
+68.000000 54.000000 33.000000 20.000000 20.000000 22.000000 
+21.000000 20.000000 24.000000 23.000000 20.000000 30.000000 
+38.000000 43.000000 18.000000 20.000000 20.000000 18.000000 
+14.000000 13.000000 19.000000 23.000000 18.000000 27.000000 
+55.000000 65.000000 56.000000 37.000000 22.000000 19.000000 
+20.000000 19.000000 16.000000 16.000000 20.000000 25.000000 
+22.000000 18.000000 20.000000 22.000000 19.000000 15.000000 
+13.000000 13.000000 14.000000 16.000000 19.000000 19.000000 
+19.000000 18.000000 20.000000 25.000000 27.000000 19.000000 
+7.000000 11.000000 17.000000 17.000000 15.000000 15.000000 
+14.000000 12.000000 13.000000 25.000000 25.000000 8.000000 
+17.000000 31.000000 33.000000 37.000000 41.000000 38.000000 
+26.000000 14.000000 16.000000 22.000000 21.000000 23.000000 
+28.000000 30.000000 27.000000 23.000000 23.000000 27.000000 
+27.000000 18.000000 12.000000 20.000000 29.000000 32.000000 
+19.000000 24.000000 28.000000 27.000000 21.000000 15.000000 
+17.000000 23.000000 19.000000 17.000000 37.000000 59.000000 
+62.000000 42.000000 16.000000 6.000000 12.000000 22.000000 
+21.000000 14.000000 12.000000 16.000000 17.000000 15.000000 
+16.000000 18.000000 17.000000 14.000000 13.000000 14.000000 
+12.000000 12.000000 14.000000 17.000000 15.000000 9.000000 
+6.000000 12.000000 21.000000 22.000000 13.000000 7.000000 
+10.000000 12.000000 10.000000 8.000000 15.000000 21.000000 
+21.000000 24.000000 27.000000 15.000000 16.000000 28.000000 
+31.000000 28.000000 29.000000 35.000000 35.000000 26.000000 
+14.000000 9.000000 12.000000 19.000000 22.000000 22.000000 
+21.000000 21.000000 23.000000 23.000000 17.000000 10.000000 
+8.000000 13.000000 16.000000 14.000000 9.000000 22.000000 
+31.000000 30.000000 26.000000 21.000000 20.000000 23.000000 
+20.000000 12.000000 24.000000 53.000000 60.000000 47.000000 
+28.000000 20.000000 18.000000 17.000000 18.000000 20.000000 
+17.000000 17.000000 21.000000 19.000000 15.000000 15.000000 
+16.000000 15.000000 13.000000 11.000000 12.000000 13.000000 
+15.000000 15.000000 12.000000 10.000000 14.000000 19.000000 
+20.000000 15.000000 13.000000 6.000000 6.000000 8.000000 
+6.000000 6.000000 16.000000 31.000000 40.000000 40.000000 
+28.000000 13.000000 26.000000 51.000000 60.000000 55.000000 
+40.000000 26.000000 17.000000 11.000000 11.000000 16.000000 
+17.000000 10.000000 10.000000 13.000000 10.000000 9.000000 
+12.000000 11.000000 9.000000 11.000000 14.000000 13.000000 
+7.000000 2.000000 27.000000 7.000000 6.000000 16.000000 
+22.000000 25.000000 27.000000 31.000000 32.000000 21.000000 
+12.000000 32.000000 55.000000 54.000000 37.000000 20.000000 
+17.000000 18.000000 23.000000 30.000000 28.000000 20.000000 
+18.000000 20.000000 20.000000 20.000000 22.000000 23.000000 
+23.000000 22.000000 22.000000 21.000000 19.000000 15.000000 
+14.000000 16.000000 23.000000 24.000000 15.000000 11.000000 
+6.000000 5.000000 10.000000 12.000000 12.000000 11.000000 
+13.000000 22.000000 33.000000 37.000000 22.000000 5.000000 
+24.000000 55.000000 67.000000 58.000000 37.000000 15.000000 
+7.000000 6.000000 9.000000 14.000000 9.000000 8.000000 
+15.000000 12.000000 6.000000 7.000000 10.000000 12.000000 
+14.000000 16.000000 19.000000 19.000000 18.000000 23.000000 
+105.000000 71.000000 42.000000 23.000000 12.000000 11.000000 
+17.000000 31.000000 37.000000 22.000000 7.000000 31.000000 
+52.000000 51.000000 36.000000 25.000000 25.000000 26.000000 
+25.000000 24.000000 26.000000 25.000000 21.000000 19.000000 
+19.000000 20.000000 20.000000 19.000000 18.000000 22.000000 
+28.000000 31.000000 28.000000 20.000000 15.000000 14.000000 
+13.000000 10.000000 4.000000 4.000000 4.000000 9.000000 
+9.000000 13.000000 19.000000 21.000000 21.000000 18.000000 
+18.000000 11.000000 12.000000 29.000000 51.000000 63.000000 
+61.000000 47.000000 27.000000 11.000000 6.000000 7.000000 
+7.000000 7.000000 10.000000 10.000000 10.000000 16.000000 
+21.000000 14.000000 8.000000 13.000000 18.000000 19.000000 
+17.000000 17.000000 21.000000 25.000000 146.000000 139.000000 
+117.000000 79.000000 36.000000 6.000000 0.000000 11.000000 
+19.000000 9.000000 6.000000 25.000000 37.000000 42.000000 
+37.000000 27.000000 24.000000 25.000000 27.000000 26.000000 
+23.000000 24.000000 26.000000 25.000000 18.000000 14.000000 
+11.000000 7.000000 14.000000 18.000000 21.000000 23.000000 
+24.000000 23.000000 19.000000 16.000000 15.000000 15.000000 
+15.000000 13.000000 10.000000 12.000000 13.000000 18.000000 
+21.000000 21.000000 23.000000 25.000000 21.000000 12.000000 
+19.000000 42.000000 63.000000 72.000000 65.000000 46.000000 
+26.000000 9.000000 5.000000 13.000000 19.000000 20.000000 
+21.000000 16.000000 11.000000 19.000000 24.000000 14.000000 
+4.000000 8.000000 17.000000 20.000000 16.000000 12.000000 
+12.000000 13.000000 136.000000 146.000000 146.000000 125.000000 
+88.000000 51.000000 29.000000 22.000000 18.000000 14.000000 
+22.000000 42.000000 60.000000 64.000000 49.000000 30.000000 
+27.000000 25.000000 23.000000 22.000000 18.000000 20.000000 
+29.000000 32.000000 24.000000 14.000000 10.000000 12.000000 
+19.000000 20.000000 19.000000 20.000000 24.000000 26.000000 
+24.000000 20.000000 18.000000 20.000000 19.000000 16.000000 
+14.000000 16.000000 18.000000 16.000000 18.000000 23.000000 
+22.000000 16.000000 14.000000 25.000000 42.000000 52.000000 
+56.000000 61.000000 61.000000 45.000000 27.000000 20.000000 
+18.000000 15.000000 14.000000 16.000000 15.000000 18.000000 
+25.000000 25.000000 21.000000 16.000000 18.000000 23.000000 
+26.000000 24.000000 22.000000 20.000000 18.000000 16.000000 
+116.000000 126.000000 135.000000 129.000000 107.000000 84.000000 
+73.000000 64.000000 56.000000 60.000000 68.000000 73.000000 
+68.000000 59.000000 45.000000 32.000000 29.000000 30.000000 
+26.000000 23.000000 22.000000 27.000000 34.000000 36.000000 
+28.000000 15.000000 15.000000 19.000000 19.000000 17.000000 
+14.000000 17.000000 20.000000 20.000000 18.000000 15.000000 
+11.000000 10.000000 9.000000 11.000000 18.000000 24.000000 
+24.000000 19.000000 20.000000 25.000000 22.000000 11.000000 
+10.000000 24.000000 44.000000 52.000000 50.000000 46.000000 
+41.000000 28.000000 17.000000 17.000000 16.000000 13.000000 
+10.000000 7.000000 5.000000 12.000000 23.000000 22.000000 
+17.000000 19.000000 25.000000 31.000000 32.000000 31.000000 
+28.000000 25.000000 18.000000 13.000000 104.000000 106.000000 
+117.000000 127.000000 119.000000 103.000000 97.000000 96.000000 
+94.000000 88.000000 78.000000 72.000000 72.000000 64.000000 
+39.000000 17.000000 28.000000 40.000000 41.000000 37.000000 
+36.000000 37.000000 36.000000 27.000000 16.000000 14.000000 
+21.000000 24.000000 19.000000 12.000000 10.000000 15.000000 
+18.000000 17.000000 14.000000 12.000000 8.000000 5.000000 
+6.000000 11.000000 18.000000 20.000000 18.000000 17.000000 
+22.000000 23.000000 17.000000 11.000000 14.000000 23.000000 
+31.000000 34.000000 35.000000 33.000000 24.000000 14.000000 
+12.000000 13.000000 14.000000 21.000000 22.000000 16.000000 
+15.000000 18.000000 23.000000 22.000000 17.000000 19.000000 
+26.000000 31.000000 32.000000 30.000000 29.000000 27.000000 
+23.000000 19.000000 107.000000 105.000000 114.000000 124.000000 
+122.000000 110.000000 102.000000 103.000000 104.000000 98.000000 
+93.000000 97.000000 99.000000 79.000000 41.000000 20.000000 
+27.000000 32.000000 37.000000 41.000000 38.000000 32.000000 
+28.000000 17.000000 7.000000 10.000000 18.000000 22.000000 
+19.000000 15.000000 12.000000 14.000000 17.000000 17.000000 
+17.000000 16.000000 11.000000 7.000000 8.000000 10.000000 
+19.000000 23.000000 18.000000 15.000000 18.000000 21.000000 
+17.000000 12.000000 14.000000 22.000000 26.000000 26.000000 
+25.000000 29.000000 26.000000 16.000000 8.000000 6.000000 
+11.000000 18.000000 16.000000 11.000000 11.000000 18.000000 
+23.000000 20.000000 15.000000 18.000000 24.000000 27.000000 
+28.000000 23.000000 18.000000 17.000000 20.000000 21.000000 
+110.000000 110.000000 111.000000 110.000000 111.000000 114.000000 
+116.000000 109.000000 95.000000 87.000000 99.000000 116.000000 
+111.000000 76.000000 35.000000 16.000000 19.000000 18.000000 
+21.000000 25.000000 23.000000 16.000000 14.000000 15.000000 
+13.000000 9.000000 11.000000 13.000000 15.000000 17.000000 
+19.000000 21.000000 21.000000 19.000000 18.000000 17.000000 
+14.000000 12.000000 11.000000 14.000000 20.000000 23.000000 
+22.000000 21.000000 22.000000 21.000000 18.000000 17.000000 
+23.000000 31.000000 37.000000 40.000000 40.000000 39.000000 
+34.000000 25.000000 18.000000 14.000000 12.000000 11.000000 
+11.000000 10.000000 10.000000 16.000000 21.000000 20.000000 
+20.000000 20.000000 19.000000 19.000000 20.000000 16.000000 
+11.000000 8.000000 10.000000 15.000000 108.000000 109.000000 
+107.000000 104.000000 103.000000 110.000000 113.000000 99.000000 
+78.000000 72.000000 89.000000 108.000000 101.000000 65.000000 
+26.000000 12.000000 17.000000 14.000000 10.000000 9.000000 
+9.000000 9.000000 10.000000 16.000000 18.000000 15.000000 
+11.000000 13.000000 17.000000 22.000000 24.000000 23.000000 
+20.000000 19.000000 17.000000 15.000000 10.000000 8.000000 
+9.000000 17.000000 21.000000 20.000000 21.000000 28.000000 
+31.000000 21.000000 15.000000 18.000000 28.000000 41.000000 
+43.000000 38.000000 34.000000 30.000000 26.000000 23.000000 
+22.000000 19.000000 14.000000 10.000000 11.000000 10.000000 
+8.000000 12.000000 18.000000 23.000000 24.000000 19.000000 
+16.000000 20.000000 22.000000 18.000000 12.000000 11.000000 
+20.000000 22.000000 112.000000 110.000000 107.000000 105.000000 
+106.000000 109.000000 108.000000 95.000000 81.000000 82.000000 
+100.000000 114.000000 101.000000 59.000000 21.000000 12.000000 
+14.000000 9.000000 2.000000 3.000000 7.000000 15.000000 
+17.000000 18.000000 21.000000 19.000000 17.000000 18.000000 
+21.000000 24.000000 25.000000 24.000000 23.000000 22.000000 
+20.000000 16.000000 14.000000 11.000000 10.000000 12.000000 
+17.000000 20.000000 21.000000 22.000000 22.000000 15.000000 
+17.000000 19.000000 21.000000 32.000000 35.000000 27.000000 
+20.000000 16.000000 14.000000 13.000000 14.000000 14.000000 
+13.000000 11.000000 8.000000 5.000000 8.000000 17.000000 
+23.000000 27.000000 27.000000 22.000000 21.000000 26.000000 
+27.000000 22.000000 18.000000 21.000000 35.000000 36.000000 
+109.000000 107.000000 107.000000 109.000000 111.000000 111.000000 
+109.000000 106.000000 100.000000 98.000000 105.000000 112.000000 
+100.000000 59.000000 18.000000 6.000000 8.000000 7.000000 
+9.000000 11.000000 13.000000 18.000000 17.000000 20.000000 
+23.000000 22.000000 22.000000 23.000000 26.000000 26.000000 
+27.000000 30.000000 29.000000 24.000000 20.000000 19.000000 
+21.000000 20.000000 19.000000 18.000000 17.000000 19.000000 
+18.000000 17.000000 16.000000 12.000000 14.000000 16.000000 
+11.000000 19.000000 31.000000 27.000000 18.000000 13.000000 
+14.000000 13.000000 10.000000 8.000000 9.000000 12.000000 
+17.000000 21.000000 17.000000 20.000000 34.000000 38.000000 
+31.000000 22.000000 19.000000 20.000000 17.000000 17.000000 
+20.000000 23.000000 34.000000 39.000000 103.000000 103.000000 
+103.000000 106.000000 108.000000 107.000000 105.000000 102.000000 
+96.000000 93.000000 98.000000 102.000000 89.000000 53.000000 
+17.000000 6.000000 11.000000 21.000000 35.000000 39.000000 
+36.000000 29.000000 20.000000 24.000000 29.000000 31.000000 
+27.000000 26.000000 29.000000 30.000000 30.000000 26.000000 
+20.000000 14.000000 17.000000 20.000000 15.000000 15.000000 
+17.000000 16.000000 17.000000 16.000000 15.000000 17.000000 
+15.000000 9.000000 12.000000 15.000000 10.000000 23.000000 
+39.000000 33.000000 14.000000 10.000000 17.000000 20.000000 
+17.000000 10.000000 6.000000 8.000000 16.000000 24.000000 
+17.000000 11.000000 20.000000 26.000000 18.000000 13.000000 
+14.000000 10.000000 7.000000 11.000000 18.000000 24.000000 
+30.000000 34.000000 103.000000 105.000000 105.000000 105.000000 
+106.000000 107.000000 104.000000 97.000000 88.000000 85.000000 
+93.000000 102.000000 98.000000 75.000000 44.000000 27.000000 
+32.000000 45.000000 52.000000 47.000000 38.000000 25.000000 
+13.000000 13.000000 30.000000 38.000000 28.000000 17.000000 
+19.000000 24.000000 27.000000 22.000000 15.000000 13.000000 
+17.000000 20.000000 15.000000 11.000000 7.000000 9.000000 
+12.000000 12.000000 12.000000 12.000000 4.000000 6.000000 
+17.000000 21.000000 22.000000 29.000000 37.000000 30.000000 
+11.000000 5.000000 11.000000 19.000000 24.000000 19.000000 
+11.000000 7.000000 6.000000 11.000000 17.000000 14.000000 
+10.000000 8.000000 6.000000 7.000000 8.000000 6.000000 
+6.000000 10.000000 22.000000 31.000000 29.000000 23.000000 
+107.000000 112.000000 112.000000 108.000000 106.000000 106.000000 
+105.000000 100.000000 92.000000 89.000000 96.000000 110.000000 
+115.000000 94.000000 54.000000 30.000000 42.000000 53.000000 
+51.000000 37.000000 30.000000 26.000000 26.000000 22.000000 
+35.000000 42.000000 28.000000 11.000000 16.000000 25.000000 
+28.000000 25.000000 25.000000 25.000000 21.000000 15.000000 
+13.000000 8.000000 6.000000 12.000000 19.000000 21.000000 
+14.000000 12.000000 14.000000 22.000000 22.000000 24.000000 
+33.000000 34.000000 22.000000 15.000000 16.000000 17.000000 
+17.000000 19.000000 22.000000 17.000000 11.000000 8.000000 
+7.000000 11.000000 18.000000 19.000000 14.000000 10.000000 
+11.000000 9.000000 9.000000 12.000000 14.000000 16.000000 
+27.000000 31.000000 18.000000 11.000000 104.000000 110.000000 
+113.000000 112.000000 109.000000 109.000000 108.000000 103.000000 
+94.000000 92.000000 101.000000 109.000000 97.000000 62.000000 
+26.000000 16.000000 26.000000 35.000000 42.000000 44.000000 
+43.000000 42.000000 43.000000 37.000000 35.000000 36.000000 
+27.000000 16.000000 21.000000 32.000000 33.000000 29.000000 
+24.000000 19.000000 14.000000 9.000000 6.000000 9.000000 
+17.000000 24.000000 32.000000 33.000000 24.000000 29.000000 
+43.000000 41.000000 24.000000 30.000000 47.000000 42.000000 
+17.000000 12.000000 18.000000 21.000000 25.000000 24.000000 
+17.000000 9.000000 8.000000 12.000000 17.000000 20.000000 
+21.000000 22.000000 20.000000 16.000000 13.000000 16.000000 
+21.000000 23.000000 23.000000 28.000000 38.000000 38.000000 
+23.000000 27.000000 102.000000 106.000000 110.000000 111.000000 
+108.000000 110.000000 112.000000 108.000000 99.000000 93.000000 
+95.000000 91.000000 74.000000 46.000000 22.000000 6.000000 
+0.000000 1.000000 24.000000 42.000000 39.000000 28.000000 
+25.000000 25.000000 22.000000 25.000000 30.000000 26.000000 
+19.000000 29.000000 38.000000 34.000000 23.000000 13.000000 
+9.000000 10.000000 15.000000 23.000000 27.000000 27.000000 
+29.000000 31.000000 31.000000 40.000000 52.000000 42.000000 
+26.000000 39.000000 49.000000 33.000000 14.000000 11.000000 
+11.000000 16.000000 23.000000 19.000000 17.000000 16.000000 
+12.000000 18.000000 24.000000 20.000000 14.000000 16.000000 
+19.000000 16.000000 11.000000 12.000000 14.000000 19.000000 
+24.000000 33.000000 46.000000 53.000000 49.000000 58.000000 
+109.000000 105.000000 100.000000 101.000000 109.000000 118.000000 
+118.000000 109.000000 98.000000 89.000000 84.000000 80.000000 
+73.000000 55.000000 45.000000 60.000000 65.000000 49.000000 
+31.000000 22.000000 21.000000 17.000000 15.000000 20.000000 
+24.000000 28.000000 36.000000 39.000000 31.000000 28.000000 
+31.000000 26.000000 18.000000 15.000000 11.000000 12.000000 
+20.000000 21.000000 20.000000 16.000000 11.000000 16.000000 
+24.000000 36.000000 49.000000 44.000000 33.000000 43.000000 
+43.000000 23.000000 4.000000 6.000000 21.000000 29.000000 
+20.000000 12.000000 20.000000 23.000000 16.000000 14.000000 
+19.000000 15.000000 7.000000 4.000000 5.000000 10.000000 
+23.000000 23.000000 17.000000 23.000000 37.000000 53.000000 
+72.000000 83.000000 81.000000 82.000000 107.000000 103.000000 
+102.000000 107.000000 114.000000 117.000000 112.000000 100.000000 
+90.000000 87.000000 83.000000 70.000000 50.000000 50.000000 
+116.000000 223.000000 257.000000 189.000000 85.000000 27.000000 
+20.000000 22.000000 19.000000 16.000000 24.000000 28.000000 
+34.000000 39.000000 36.000000 27.000000 21.000000 17.000000 
+15.000000 13.000000 14.000000 17.000000 15.000000 10.000000 
+12.000000 13.000000 8.000000 8.000000 17.000000 33.000000 
+46.000000 40.000000 24.000000 32.000000 49.000000 58.000000 
+45.000000 27.000000 22.000000 14.000000 3.000000 11.000000 
+18.000000 11.000000 12.000000 22.000000 19.000000 16.000000 
+30.000000 47.000000 49.000000 45.000000 49.000000 48.000000 
+47.000000 59.000000 81.000000 101.000000 113.000000 114.000000 
+104.000000 97.000000 103.000000 105.000000 108.000000 107.000000 
+105.000000 105.000000 105.000000 99.000000 90.000000 84.000000 
+73.000000 55.000000 51.000000 102.000000 201.000000 289.000000 
+303.000000 233.000000 137.000000 67.000000 28.000000 20.000000 
+18.000000 15.000000 17.000000 20.000000 20.000000 24.000000 
+30.000000 30.000000 26.000000 25.000000 24.000000 21.000000 
+21.000000 23.000000 17.000000 8.000000 11.000000 16.000000 
+16.000000 15.000000 20.000000 27.000000 33.000000 25.000000 
+9.000000 13.000000 48.000000 110.000000 162.000000 167.000000 
+131.000000 74.000000 28.000000 11.000000 12.000000 12.000000 
+21.000000 33.000000 24.000000 30.000000 68.000000 96.000000 
+102.000000 92.000000 79.000000 73.000000 83.000000 105.000000 
+125.000000 129.000000 120.000000 109.000000 103.000000 102.000000 
+102.000000 105.000000 103.000000 102.000000 104.000000 106.000000 
+102.000000 97.000000 96.000000 86.000000 62.000000 51.000000 
+98.000000 191.000000 249.000000 258.000000 233.000000 191.000000 
+145.000000 91.000000 39.000000 19.000000 22.000000 21.000000 
+13.000000 13.000000 12.000000 12.000000 25.000000 37.000000 
+31.000000 25.000000 27.000000 28.000000 24.000000 22.000000 
+15.000000 9.000000 15.000000 19.000000 17.000000 19.000000 
+26.000000 29.000000 27.000000 26.000000 23.000000 19.000000 
+45.000000 124.000000 238.000000 319.000000 302.000000 193.000000 
+75.000000 15.000000 7.000000 17.000000 31.000000 27.000000 
+22.000000 49.000000 77.000000 82.000000 81.000000 85.000000 
+94.000000 100.000000 112.000000 125.000000 125.000000 112.000000 
+99.000000 97.000000 102.000000 102.000000 101.000000 105.000000 
+106.000000 110.000000 110.000000 100.000000 88.000000 90.000000 
+101.000000 92.000000 62.000000 58.000000 111.000000 185.000000 
+234.000000 243.000000 222.000000 187.000000 139.000000 82.000000 
+38.000000 26.000000 30.000000 31.000000 25.000000 23.000000 
+24.000000 16.000000 17.000000 26.000000 29.000000 30.000000 
+33.000000 36.000000 30.000000 16.000000 7.000000 13.000000 
+19.000000 18.000000 16.000000 20.000000 30.000000 33.000000 
+25.000000 26.000000 29.000000 39.000000 71.000000 136.000000 
+235.000000 312.000000 304.000000 218.000000 121.000000 58.000000 
+21.000000 8.000000 17.000000 16.000000 25.000000 60.000000 
+80.000000 77.000000 70.000000 78.000000 95.000000 106.000000 
+110.000000 116.000000 111.000000 98.000000 93.000000 97.000000 
+98.000000 98.000000 97.000000 99.000000 102.000000 106.000000 
+103.000000 93.000000 88.000000 95.000000 97.000000 79.000000 
+55.000000 62.000000 98.000000 123.000000 134.000000 142.000000 
+150.000000 146.000000 116.000000 66.000000 28.000000 22.000000 
+31.000000 38.000000 37.000000 33.000000 31.000000 27.000000 
+18.000000 14.000000 19.000000 25.000000 27.000000 28.000000 
+21.000000 9.000000 11.000000 20.000000 22.000000 23.000000 
+23.000000 28.000000 33.000000 33.000000 25.000000 23.000000 
+25.000000 47.000000 91.000000 140.000000 201.000000 258.000000 
+277.000000 259.000000 210.000000 130.000000 50.000000 10.000000 
+9.000000 17.000000 43.000000 77.000000 91.000000 85.000000 
+76.000000 80.000000 97.000000 107.000000 107.000000 106.000000 
+107.000000 106.000000 105.000000 101.000000 97.000000 97.000000 
+101.000000 96.000000 100.000000 104.000000 99.000000 88.000000 
+84.000000 92.000000 96.000000 84.000000 67.000000 67.000000 
+77.000000 82.000000 77.000000 73.000000 77.000000 81.000000 
+71.000000 49.000000 27.000000 17.000000 23.000000 25.000000 
+22.000000 20.000000 22.000000 21.000000 17.000000 12.000000 
+12.000000 10.000000 4.000000 5.000000 8.000000 11.000000 
+16.000000 19.000000 19.000000 25.000000 33.000000 34.000000 
+35.000000 40.000000 40.000000 32.000000 23.000000 39.000000 
+75.000000 97.000000 126.000000 184.000000 247.000000 278.000000 
+255.000000 184.000000 103.000000 38.000000 5.000000 20.000000 
+50.000000 70.000000 84.000000 86.000000 85.000000 91.000000 
+102.000000 110.000000 112.000000 111.000000 106.000000 99.000000 
+97.000000 102.000000 104.000000 101.000000 104.000000 98.000000 
+98.000000 101.000000 100.000000 92.000000 85.000000 87.000000 
+93.000000 92.000000 86.000000 83.000000 79.000000 71.000000 
+68.000000 74.000000 82.000000 80.000000 64.000000 45.000000 
+31.000000 26.000000 26.000000 24.000000 19.000000 15.000000 
+14.000000 13.000000 15.000000 14.000000 11.000000 11.000000 
+11.000000 11.000000 14.000000 15.000000 9.000000 5.000000 
+5.000000 7.000000 15.000000 21.000000 30.000000 43.000000 
+41.000000 21.000000 10.000000 33.000000 68.000000 80.000000 
+84.000000 121.000000 182.000000 233.000000 247.000000 217.000000 
+161.000000 93.000000 30.000000 9.000000 26.000000 53.000000 
+82.000000 92.000000 87.000000 88.000000 96.000000 106.000000 
+111.000000 112.000000 106.000000 97.000000 90.000000 92.000000 
+96.000000 98.000000 100.000000 92.000000 92.000000 98.000000 
+103.000000 103.000000 101.000000 99.000000 96.000000 86.000000 
+76.000000 72.000000 69.000000 62.000000 60.000000 67.000000 
+69.000000 61.000000 53.000000 51.000000 51.000000 43.000000 
+30.000000 25.000000 25.000000 23.000000 19.000000 17.000000 
+18.000000 22.000000 21.000000 17.000000 19.000000 22.000000 
+19.000000 15.000000 15.000000 13.000000 11.000000 9.000000 
+4.000000 8.000000 22.000000 33.000000 33.000000 23.000000 
+25.000000 39.000000 54.000000 60.000000 60.000000 74.000000 
+112.000000 160.000000 197.000000 207.000000 188.000000 146.000000 
+91.000000 35.000000 13.000000 36.000000 66.000000 82.000000 
+85.000000 89.000000 99.000000 109.000000 115.000000 115.000000 
+112.000000 107.000000 100.000000 97.000000 98.000000 101.000000 
+108.000000 101.000000 97.000000 97.000000 98.000000 102.000000 
+109.000000 114.000000 109.000000 88.000000 60.000000 37.000000 
+26.000000 28.000000 36.000000 43.000000 45.000000 45.000000 
+51.000000 56.000000 48.000000 30.000000 18.000000 21.000000 
+37.000000 43.000000 32.000000 19.000000 14.000000 18.000000 
+23.000000 26.000000 26.000000 21.000000 19.000000 21.000000 
+27.000000 27.000000 18.000000 8.000000 6.000000 12.000000 
+20.000000 25.000000 32.000000 38.000000 30.000000 20.000000 
+19.000000 31.000000 48.000000 54.000000 62.000000 88.000000 
+128.000000 164.000000 181.000000 173.000000 142.000000 98.000000 
+60.000000 47.000000 58.000000 68.000000 72.000000 76.000000 
+86.000000 98.000000 106.000000 108.000000 107.000000 104.000000 
+101.000000 100.000000 103.000000 107.000000 96.000000 100.000000 
+107.000000 105.000000 95.000000 96.000000 112.000000 126.000000 
+112.000000 72.000000 38.000000 25.000000 26.000000 28.000000 
+31.000000 41.000000 62.000000 71.000000 57.000000 40.000000 
+32.000000 34.000000 39.000000 35.000000 35.000000 35.000000 
+30.000000 24.000000 22.000000 20.000000 24.000000 30.000000 
+27.000000 24.000000 22.000000 22.000000 31.000000 39.000000 
+27.000000 7.000000 10.000000 17.000000 20.000000 25.000000 
+33.000000 36.000000 30.000000 24.000000 24.000000 34.000000 
+49.000000 61.000000 64.000000 61.000000 72.000000 108.000000 
+152.000000 184.000000 188.000000 167.000000 134.000000 105.000000 
+90.000000 83.000000 79.000000 78.000000 83.000000 87.000000 
+90.000000 92.000000 94.000000 98.000000 101.000000 103.000000 
+107.000000 114.000000 98.000000 106.000000 110.000000 101.000000 
+91.000000 100.000000 124.000000 130.000000 103.000000 64.000000 
+45.000000 43.000000 38.000000 32.000000 46.000000 73.000000 
+87.000000 76.000000 49.000000 33.000000 39.000000 52.000000 
+56.000000 47.000000 30.000000 19.000000 21.000000 27.000000 
+25.000000 18.000000 14.000000 14.000000 15.000000 29.000000 
+41.000000 34.000000 27.000000 34.000000 35.000000 24.000000 
+17.000000 17.000000 25.000000 32.000000 33.000000 34.000000 
+44.000000 55.000000 57.000000 55.000000 55.000000 61.000000 
+66.000000 65.000000 64.000000 77.000000 109.000000 148.000000 
+181.000000 201.000000 201.000000 185.000000 161.000000 136.000000 
+111.000000 90.000000 77.000000 75.000000 78.000000 82.000000 
+87.000000 95.000000 102.000000 102.000000 101.000000 105.000000 
+111.000000 117.000000 121.000000 119.000000 116.000000 114.000000 
+106.000000 81.000000 48.000000 39.000000 59.000000 78.000000 
+76.000000 72.000000 80.000000 75.000000 62.000000 49.000000 
+35.000000 27.000000 30.000000 40.000000 51.000000 54.000000 
+49.000000 40.000000 29.000000 15.000000 7.000000 8.000000 
+11.000000 11.000000 13.000000 19.000000 24.000000 23.000000 
+12.000000 8.000000 22.000000 31.000000 20.000000 6.000000 
+4.000000 16.000000 36.000000 46.000000 44.000000 35.000000 
+37.000000 57.000000 75.000000 68.000000 47.000000 36.000000 
+45.000000 68.000000 93.000000 113.000000 138.000000 174.000000 
+215.000000 238.000000 228.000000 191.000000 147.000000 114.000000 
+93.000000 81.000000 74.000000 70.000000 72.000000 82.000000 
+96.000000 106.000000 109.000000 111.000000 85.000000 94.000000 
+104.000000 116.000000 121.000000 106.000000 74.000000 39.000000 
+19.000000 25.000000 41.000000 44.000000 39.000000 48.000000 
+63.000000 58.000000 41.000000 24.000000 17.000000 17.000000 
+19.000000 22.000000 30.000000 38.000000 39.000000 39.000000 
+31.000000 16.000000 17.000000 19.000000 26.000000 30.000000 
+36.000000 36.000000 23.000000 17.000000 21.000000 16.000000 
+15.000000 22.000000 21.000000 16.000000 11.000000 13.000000 
+36.000000 55.000000 44.000000 19.000000 25.000000 46.000000 
+57.000000 53.000000 34.000000 19.000000 18.000000 38.000000 
+67.000000 87.000000 98.000000 120.000000 166.000000 226.000000 
+270.000000 272.000000 234.000000 179.000000 131.000000 102.000000 
+89.000000 85.000000 83.000000 83.000000 91.000000 104.000000 
+113.000000 114.000000 26.000000 52.000000 70.000000 77.000000 
+76.000000 63.000000 39.000000 20.000000 17.000000 25.000000 
+21.000000 11.000000 23.000000 42.000000 42.000000 35.000000 
+23.000000 9.000000 9.000000 10.000000 10.000000 13.000000 
+21.000000 26.000000 29.000000 35.000000 37.000000 49.000000 
+47.000000 30.000000 52.000000 113.000000 181.000000 191.000000 
+133.000000 67.000000 45.000000 45.000000 36.000000 27.000000 
+28.000000 25.000000 23.000000 18.000000 21.000000 33.000000 
+18.000000 21.000000 53.000000 62.000000 45.000000 29.000000 
+16.000000 16.000000 14.000000 7.000000 20.000000 50.000000 
+80.000000 99.000000 117.000000 157.000000 216.000000 267.000000 
+287.000000 271.000000 223.000000 169.000000 134.000000 116.000000 
+99.000000 82.000000 74.000000 81.000000 95.000000 105.000000 
+10.000000 24.000000 29.000000 20.000000 13.000000 16.000000 
+21.000000 21.000000 14.000000 9.000000 5.000000 5.000000 
+21.000000 40.000000 47.000000 39.000000 20.000000 13.000000 
+23.000000 20.000000 23.000000 39.000000 51.000000 53.000000 
+48.000000 44.000000 55.000000 69.000000 61.000000 40.000000 
+47.000000 133.000000 251.000000 301.000000 243.000000 135.000000 
+68.000000 65.000000 77.000000 66.000000 48.000000 48.000000 
+57.000000 47.000000 18.000000 9.000000 5.000000 17.000000 
+34.000000 37.000000 26.000000 20.000000 24.000000 24.000000 
+22.000000 14.000000 9.000000 25.000000 58.000000 87.000000 
+98.000000 107.000000 138.000000 193.000000 250.000000 286.000000 
+287.000000 249.000000 185.000000 131.000000 105.000000 91.000000 
+76.000000 73.000000 87.000000 95.000000 12.000000 17.000000 
+21.000000 16.000000 7.000000 6.000000 15.000000 21.000000 
+15.000000 6.000000 4.000000 7.000000 21.000000 32.000000 
+31.000000 23.000000 24.000000 39.000000 42.000000 35.000000 
+34.000000 50.000000 66.000000 78.000000 78.000000 62.000000 
+44.000000 44.000000 53.000000 67.000000 82.000000 124.000000 
+209.000000 271.000000 265.000000 207.000000 137.000000 86.000000 
+70.000000 67.000000 68.000000 72.000000 69.000000 56.000000 
+46.000000 40.000000 27.000000 15.000000 14.000000 25.000000 
+30.000000 24.000000 20.000000 16.000000 12.000000 13.000000 
+12.000000 11.000000 25.000000 52.000000 78.000000 97.000000 
+114.000000 139.000000 178.000000 227.000000 273.000000 291.000000 
+263.000000 200.000000 135.000000 99.000000 84.000000 69.000000 
+66.000000 76.000000 24.000000 20.000000 18.000000 19.000000 
+16.000000 12.000000 11.000000 12.000000 12.000000 9.000000 
+8.000000 17.000000 32.000000 42.000000 53.000000 64.000000 
+68.000000 64.000000 57.000000 52.000000 52.000000 59.000000 
+66.000000 68.000000 61.000000 50.000000 45.000000 45.000000 
+49.000000 59.000000 73.000000 102.000000 155.000000 208.000000 
+230.000000 204.000000 141.000000 79.000000 53.000000 59.000000 
+72.000000 72.000000 60.000000 52.000000 54.000000 53.000000 
+46.000000 38.000000 29.000000 23.000000 22.000000 23.000000 
+16.000000 11.000000 11.000000 9.000000 9.000000 17.000000 
+18.000000 22.000000 46.000000 75.000000 93.000000 105.000000 
+125.000000 163.000000 217.000000 269.000000 297.000000 283.000000 
+227.000000 152.000000 96.000000 69.000000 50.000000 38.000000 
+23.000000 23.000000 20.000000 14.000000 12.000000 15.000000 
+14.000000 11.000000 8.000000 9.000000 19.000000 28.000000 
+34.000000 44.000000 64.000000 85.000000 99.000000 96.000000 
+81.000000 62.000000 56.000000 68.000000 73.000000 62.000000 
+49.000000 48.000000 60.000000 71.000000 77.000000 79.000000 
+78.000000 82.000000 101.000000 129.000000 144.000000 131.000000 
+94.000000 56.000000 33.000000 32.000000 44.000000 59.000000 
+68.000000 72.000000 71.000000 71.000000 70.000000 64.000000 
+49.000000 25.000000 13.000000 17.000000 17.000000 15.000000 
+16.000000 14.000000 9.000000 13.000000 20.000000 10.000000 
+8.000000 31.000000 61.000000 89.000000 103.000000 114.000000 
+146.000000 199.000000 254.000000 288.000000 278.000000 212.000000 
+118.000000 50.000000 21.000000 8.000000 12.000000 19.000000 
+23.000000 20.000000 14.000000 14.000000 18.000000 16.000000 
+10.000000 13.000000 27.000000 38.000000 49.000000 67.000000 
+85.000000 91.000000 86.000000 79.000000 76.000000 76.000000 
+72.000000 67.000000 62.000000 55.000000 54.000000 62.000000 
+72.000000 85.000000 98.000000 105.000000 101.000000 90.000000 
+83.000000 81.000000 78.000000 69.000000 59.000000 52.000000 
+49.000000 47.000000 44.000000 46.000000 52.000000 60.000000 
+68.000000 77.000000 85.000000 86.000000 72.000000 42.000000 
+9.000000 3.000000 7.000000 9.000000 16.000000 22.000000 
+19.000000 10.000000 7.000000 14.000000 18.000000 9.000000 
+14.000000 47.000000 78.000000 93.000000 98.000000 124.000000 
+179.000000 236.000000 250.000000 202.000000 112.000000 36.000000 
+10.000000 18.000000 14.000000 13.000000 12.000000 12.000000 
+12.000000 14.000000 13.000000 9.000000 7.000000 14.000000 
+28.000000 47.000000 65.000000 78.000000 83.000000 83.000000 
+83.000000 82.000000 77.000000 73.000000 73.000000 71.000000 
+73.000000 80.000000 83.000000 81.000000 85.000000 96.000000 
+101.000000 96.000000 86.000000 80.000000 81.000000 83.000000 
+84.000000 84.000000 85.000000 85.000000 81.000000 71.000000 
+59.000000 50.000000 50.000000 56.000000 67.000000 79.000000 
+84.000000 81.000000 71.000000 53.000000 30.000000 12.000000 
+7.000000 10.000000 18.000000 22.000000 15.000000 12.000000 
+15.000000 15.000000 20.000000 26.000000 18.000000 7.000000 
+25.000000 67.000000 95.000000 105.000000 126.000000 166.000000 
+181.000000 139.000000 66.000000 15.000000 10.000000 15.000000 
+12.000000 14.000000 17.000000 20.000000 23.000000 21.000000 
+14.000000 9.000000 15.000000 29.000000 51.000000 69.000000 
+76.000000 72.000000 68.000000 76.000000 86.000000 85.000000 
+75.000000 66.000000 68.000000 80.000000 93.000000 98.000000 
+96.000000 98.000000 106.000000 112.000000 105.000000 92.000000 
+85.000000 88.000000 92.000000 93.000000 93.000000 98.000000 
+103.000000 103.000000 100.000000 94.000000 86.000000 72.000000 
+58.000000 53.000000 60.000000 70.000000 71.000000 69.000000 
+69.000000 62.000000 42.000000 15.000000 8.000000 14.000000 
+21.000000 22.000000 14.000000 7.000000 7.000000 15.000000 
+15.000000 12.000000 19.000000 27.000000 23.000000 25.000000 
+54.000000 90.000000 114.000000 129.000000 133.000000 114.000000 
+72.000000 28.000000 13.000000 27.000000 18.000000 20.000000 
+21.000000 18.000000 13.000000 9.000000 10.000000 16.000000 
+30.000000 48.000000 66.000000 81.000000 84.000000 76.000000 
+71.000000 76.000000 77.000000 73.000000 70.000000 75.000000 
+83.000000 90.000000 95.000000 97.000000 97.000000 97.000000 
+100.000000 103.000000 103.000000 99.000000 96.000000 97.000000 
+98.000000 99.000000 98.000000 96.000000 95.000000 94.000000 
+97.000000 103.000000 104.000000 95.000000 81.000000 71.000000 
+68.000000 69.000000 67.000000 65.000000 69.000000 69.000000 
+51.000000 29.000000 21.000000 16.000000 13.000000 19.000000 
+20.000000 13.000000 10.000000 14.000000 19.000000 21.000000 
+17.000000 16.000000 23.000000 24.000000 21.000000 41.000000 
+76.000000 101.000000 107.000000 94.000000 61.000000 25.000000 
+23.000000 45.000000 16.000000 15.000000 13.000000 11.000000 
+8.000000 9.000000 14.000000 23.000000 34.000000 54.000000 
+79.000000 91.000000 82.000000 70.000000 69.000000 72.000000 
+75.000000 77.000000 81.000000 84.000000 89.000000 96.000000 
+100.000000 99.000000 95.000000 94.000000 96.000000 97.000000 
+96.000000 96.000000 98.000000 102.000000 104.000000 106.000000 
+107.000000 107.000000 106.000000 105.000000 105.000000 107.000000 
+107.000000 102.000000 91.000000 81.000000 74.000000 69.000000 
+62.000000 56.000000 59.000000 60.000000 41.000000 19.000000 
+14.000000 12.000000 8.000000 11.000000 17.000000 20.000000 
+18.000000 18.000000 21.000000 20.000000 14.000000 12.000000 
+18.000000 26.000000 26.000000 15.000000 15.000000 37.000000 
+53.000000 50.000000 33.000000 22.000000 31.000000 41.000000 
+18.000000 17.000000 15.000000 14.000000 16.000000 21.000000 
+31.000000 47.000000 68.000000 84.000000 88.000000 83.000000 
+78.000000 77.000000 75.000000 70.000000 71.000000 79.000000 
+89.000000 95.000000 97.000000 96.000000 96.000000 97.000000 
+97.000000 94.000000 91.000000 92.000000 96.000000 100.000000 
+101.000000 102.000000 105.000000 108.000000 107.000000 103.000000 
+99.000000 99.000000 101.000000 100.000000 99.000000 100.000000 
+102.000000 99.000000 87.000000 68.000000 54.000000 53.000000 
+64.000000 70.000000 51.000000 20.000000 9.000000 11.000000 
+11.000000 9.000000 14.000000 22.000000 23.000000 21.000000 
+20.000000 19.000000 18.000000 17.000000 17.000000 18.000000 
+21.000000 22.000000 17.000000 11.000000 7.000000 8.000000 
+19.000000 29.000000 29.000000 29.000000 17.000000 14.000000 
+16.000000 25.000000 34.000000 45.000000 62.000000 79.000000 
+86.000000 81.000000 76.000000 77.000000 77.000000 72.000000 
+68.000000 68.000000 69.000000 73.000000 82.000000 94.000000 
+102.000000 102.000000 99.000000 98.000000 98.000000 96.000000 
+92.000000 91.000000 94.000000 99.000000 103.000000 104.000000 
+105.000000 109.000000 111.000000 107.000000 99.000000 93.000000 
+96.000000 103.000000 105.000000 100.000000 97.000000 96.000000 
+93.000000 81.000000 65.000000 58.000000 62.000000 66.000000 
+55.000000 31.000000 10.000000 4.000000 7.000000 13.000000 
+21.000000 27.000000 28.000000 25.000000 22.000000 24.000000 
+25.000000 23.000000 17.000000 12.000000 13.000000 16.000000 
+17.000000 18.000000 22.000000 26.000000 26.000000 23.000000 
+21.000000 19.000000 24.000000 26.000000 31.000000 38.000000 
+51.000000 70.000000 87.000000 90.000000 80.000000 75.000000 
+78.000000 78.000000 73.000000 70.000000 72.000000 76.000000 
+79.000000 83.000000 90.000000 97.000000 100.000000 100.000000 
+98.000000 97.000000 96.000000 97.000000 97.000000 97.000000 
+96.000000 97.000000 99.000000 101.000000 103.000000 105.000000 
+105.000000 102.000000 97.000000 94.000000 97.000000 104.000000 
+107.000000 103.000000 97.000000 96.000000 97.000000 92.000000 
+78.000000 64.000000 63.000000 69.000000 70.000000 54.000000 
+30.000000 14.000000 8.000000 7.000000 11.000000 19.000000 
+23.000000 20.000000 16.000000 16.000000 18.000000 17.000000 
+16.000000 18.000000 18.000000 17.000000 17.000000 17.000000 
+19.000000 27.000000 23.000000 12.000000 23.000000 42.000000 
+8.000000 22.000000 57.000000 83.000000 90.000000 89.000000 
+87.000000 81.000000 79.000000 83.000000 82.000000 75.000000 
+70.000000 72.000000 77.000000 81.000000 87.000000 95.000000 
+100.000000 100.000000 99.000000 102.000000 105.000000 103.000000 
+96.000000 88.000000 84.000000 86.000000 93.000000 101.000000 
+107.000000 108.000000 105.000000 102.000000 100.000000 100.000000 
+98.000000 96.000000 97.000000 102.000000 109.000000 109.000000 
+103.000000 99.000000 101.000000 102.000000 92.000000 76.000000 
+68.000000 70.000000 74.000000 70.000000 55.000000 32.000000 
+9.000000 6.000000 14.000000 16.000000 15.000000 18.000000 
+23.000000 26.000000 27.000000 26.000000 21.000000 13.000000 
+8.000000 11.000000 20.000000 22.000000 18.000000 36.000000 
+55.000000 37.000000 41.000000 82.000000 81.000000 117.000000 
+119.000000 96.000000 75.000000 76.000000 82.000000 79.000000 
+77.000000 77.000000 74.000000 70.000000 71.000000 76.000000 
+80.000000 82.000000 85.000000 91.000000 97.000000 99.000000 
+99.000000 99.000000 100.000000 100.000000 99.000000 96.000000 
+93.000000 93.000000 96.000000 102.000000 108.000000 109.000000 
+105.000000 99.000000 95.000000 94.000000 95.000000 95.000000 
+97.000000 102.000000 106.000000 105.000000 100.000000 96.000000 
+96.000000 96.000000 91.000000 81.000000 73.000000 71.000000 
+77.000000 81.000000 71.000000 44.000000 16.000000 11.000000 
+17.000000 18.000000 21.000000 25.000000 24.000000 18.000000 
+12.000000 13.000000 21.000000 24.000000 20.000000 14.000000 
+15.000000 19.000000 19.000000 37.000000 67.000000 56.000000 
+44.000000 88.000000 31.000000 31.000000 28.000000 23.000000 
+18.000000 13.000000 11.000000 10.000000 8.000000 29.000000 
+76.000000 101.000000 85.000000 47.000000 16.000000 7.000000 
+12.000000 19.000000 20.000000 18.000000 15.000000 15.000000 
+15.000000 13.000000 13.000000 9.000000 5.000000 7.000000 
+12.000000 18.000000 20.000000 18.000000 15.000000 15.000000 
+15.000000 17.000000 16.000000 12.000000 13.000000 12.000000 
+12.000000 12.000000 13.000000 12.000000 10.000000 9.000000 
+6.000000 4.000000 14.000000 28.000000 30.000000 12.000000 
+14.000000 28.000000 25.000000 15.000000 14.000000 15.000000 
+14.000000 29.000000 59.000000 83.000000 96.000000 87.000000 
+49.000000 10.000000 9.000000 26.000000 32.000000 33.000000 
+29.000000 30.000000 31.000000 28.000000 16.000000 14.000000 
+18.000000 16.000000 15.000000 15.000000 12.000000 7.000000 
+9.000000 12.000000 9.000000 16.000000 63.000000 92.000000 
+85.000000 52.000000 19.000000 7.000000 17.000000 24.000000 
+27.000000 25.000000 20.000000 17.000000 15.000000 15.000000 
+12.000000 9.000000 10.000000 13.000000 14.000000 13.000000 
+14.000000 15.000000 16.000000 15.000000 13.000000 14.000000 
+15.000000 15.000000 14.000000 12.000000 9.000000 10.000000 
+17.000000 15.000000 12.000000 14.000000 18.000000 18.000000 
+15.000000 20.000000 21.000000 12.000000 14.000000 19.000000 
+17.000000 20.000000 31.000000 38.000000 24.000000 18.000000 
+42.000000 62.000000 53.000000 34.000000 27.000000 29.000000 
+31.000000 32.000000 36.000000 36.000000 26.000000 21.000000 
+22.000000 17.000000 9.000000 9.000000 7.000000 7.000000 
+9.000000 9.000000 9.000000 9.000000 10.000000 12.000000 
+13.000000 14.000000 42.000000 78.000000 88.000000 69.000000 
+41.000000 20.000000 14.000000 24.000000 30.000000 26.000000 
+18.000000 13.000000 11.000000 9.000000 8.000000 11.000000 
+16.000000 18.000000 14.000000 9.000000 9.000000 11.000000 
+16.000000 19.000000 19.000000 16.000000 13.000000 15.000000 
+19.000000 25.000000 26.000000 17.000000 8.000000 8.000000 
+8.000000 12.000000 16.000000 19.000000 19.000000 17.000000 
+22.000000 21.000000 13.000000 28.000000 49.000000 51.000000 
+44.000000 42.000000 30.000000 16.000000 15.000000 18.000000 
+17.000000 18.000000 29.000000 39.000000 33.000000 27.000000 
+34.000000 36.000000 24.000000 15.000000 18.000000 18.000000 
+13.000000 7.000000 15.000000 16.000000 16.000000 15.000000 
+18.000000 18.000000 13.000000 12.000000 13.000000 17.000000 
+43.000000 79.000000 94.000000 78.000000 41.000000 12.000000 
+19.000000 25.000000 24.000000 24.000000 27.000000 26.000000 
+20.000000 12.000000 10.000000 14.000000 16.000000 12.000000 
+7.000000 7.000000 7.000000 9.000000 11.000000 13.000000 
+15.000000 18.000000 17.000000 13.000000 10.000000 16.000000 
+23.000000 16.000000 7.000000 9.000000 7.000000 8.000000 
+15.000000 27.000000 37.000000 33.000000 27.000000 20.000000 
+10.000000 37.000000 70.000000 65.000000 43.000000 27.000000 
+17.000000 10.000000 10.000000 15.000000 18.000000 14.000000 
+19.000000 31.000000 34.000000 30.000000 30.000000 33.000000 
+27.000000 15.000000 14.000000 22.000000 23.000000 17.000000 
+62.000000 49.000000 33.000000 18.000000 8.000000 5.000000 
+8.000000 14.000000 16.000000 12.000000 34.000000 74.000000 
+94.000000 82.000000 49.000000 22.000000 25.000000 27.000000 
+23.000000 18.000000 17.000000 20.000000 15.000000 10.000000 
+9.000000 14.000000 17.000000 17.000000 16.000000 15.000000 
+14.000000 14.000000 15.000000 13.000000 11.000000 8.000000 
+8.000000 11.000000 14.000000 19.000000 16.000000 10.000000 
+7.000000 9.000000 7.000000 7.000000 8.000000 17.000000 
+37.000000 40.000000 18.000000 7.000000 20.000000 58.000000 
+83.000000 66.000000 30.000000 11.000000 6.000000 7.000000 
+15.000000 21.000000 18.000000 12.000000 12.000000 18.000000 
+28.000000 34.000000 30.000000 22.000000 17.000000 15.000000 
+16.000000 19.000000 19.000000 15.000000 130.000000 121.000000 
+94.000000 56.000000 23.000000 7.000000 6.000000 5.000000 
+2.000000 2.000000 20.000000 64.000000 89.000000 79.000000 
+47.000000 22.000000 24.000000 33.000000 32.000000 25.000000 
+18.000000 12.000000 6.000000 6.000000 10.000000 10.000000 
+8.000000 16.000000 17.000000 15.000000 16.000000 19.000000 
+19.000000 16.000000 14.000000 11.000000 11.000000 16.000000 
+19.000000 20.000000 18.000000 15.000000 11.000000 9.000000 
+9.000000 13.000000 18.000000 19.000000 25.000000 24.000000 
+7.000000 14.000000 47.000000 73.000000 75.000000 52.000000 
+23.000000 11.000000 12.000000 20.000000 30.000000 29.000000 
+20.000000 14.000000 12.000000 16.000000 21.000000 21.000000 
+15.000000 13.000000 17.000000 21.000000 19.000000 13.000000 
+8.000000 8.000000 157.000000 158.000000 139.000000 105.000000 
+66.000000 36.000000 26.000000 28.000000 28.000000 33.000000 
+48.000000 76.000000 93.000000 85.000000 52.000000 17.000000 
+15.000000 31.000000 30.000000 25.000000 22.000000 18.000000 
+15.000000 9.000000 9.000000 15.000000 9.000000 15.000000 
+26.000000 25.000000 20.000000 17.000000 17.000000 14.000000 
+12.000000 10.000000 12.000000 17.000000 17.000000 16.000000 
+16.000000 17.000000 14.000000 10.000000 12.000000 16.000000 
+19.000000 20.000000 16.000000 16.000000 24.000000 42.000000 
+57.000000 57.000000 44.000000 28.000000 16.000000 14.000000 
+20.000000 26.000000 27.000000 22.000000 21.000000 24.000000 
+25.000000 22.000000 15.000000 9.000000 13.000000 26.000000 
+36.000000 35.000000 27.000000 18.000000 12.000000 15.000000 
+131.000000 129.000000 129.000000 126.000000 113.000000 99.000000 
+93.000000 85.000000 70.000000 66.000000 83.000000 107.000000 
+118.000000 99.000000 59.000000 22.000000 13.000000 26.000000 
+30.000000 27.000000 22.000000 21.000000 24.000000 22.000000 
+11.000000 20.000000 27.000000 23.000000 26.000000 28.000000 
+20.000000 15.000000 15.000000 13.000000 12.000000 12.000000 
+14.000000 15.000000 14.000000 15.000000 19.000000 22.000000 
+20.000000 13.000000 15.000000 19.000000 15.000000 10.000000 
+6.000000 14.000000 33.000000 47.000000 53.000000 53.000000 
+40.000000 17.000000 13.000000 20.000000 18.000000 14.000000 
+12.000000 11.000000 19.000000 32.000000 36.000000 28.000000 
+15.000000 5.000000 6.000000 21.000000 39.000000 45.000000 
+36.000000 21.000000 13.000000 13.000000 107.000000 109.000000 
+123.000000 137.000000 133.000000 121.000000 118.000000 117.000000 
+114.000000 117.000000 121.000000 122.000000 114.000000 94.000000 
+60.000000 24.000000 11.000000 24.000000 33.000000 34.000000 
+30.000000 28.000000 28.000000 25.000000 20.000000 19.000000 
+32.000000 29.000000 20.000000 17.000000 18.000000 22.000000 
+22.000000 18.000000 15.000000 14.000000 12.000000 9.000000 
+11.000000 14.000000 14.000000 19.000000 22.000000 21.000000 
+18.000000 16.000000 10.000000 5.000000 5.000000 14.000000 
+31.000000 45.000000 52.000000 51.000000 41.000000 23.000000 
+16.000000 16.000000 13.000000 12.000000 9.000000 6.000000 
+16.000000 29.000000 33.000000 30.000000 24.000000 15.000000 
+12.000000 22.000000 34.000000 36.000000 29.000000 22.000000 
+17.000000 14.000000 116.000000 117.000000 120.000000 122.000000 
+116.000000 107.000000 106.000000 116.000000 127.000000 128.000000 
+119.000000 112.000000 112.000000 100.000000 63.000000 21.000000 
+13.000000 28.000000 32.000000 31.000000 29.000000 28.000000 
+26.000000 18.000000 13.000000 10.000000 15.000000 20.000000 
+19.000000 19.000000 24.000000 24.000000 18.000000 15.000000 
+15.000000 13.000000 11.000000 13.000000 15.000000 15.000000 
+19.000000 21.000000 20.000000 18.000000 16.000000 14.000000 
+9.000000 4.000000 11.000000 22.000000 26.000000 30.000000 
+31.000000 25.000000 25.000000 32.000000 31.000000 19.000000 
+12.000000 11.000000 10.000000 13.000000 22.000000 31.000000 
+34.000000 30.000000 19.000000 13.000000 18.000000 27.000000 
+33.000000 32.000000 29.000000 28.000000 25.000000 18.000000 
+118.000000 118.000000 116.000000 115.000000 113.000000 109.000000 
+108.000000 109.000000 107.000000 97.000000 91.000000 98.000000 
+106.000000 91.000000 53.000000 19.000000 16.000000 24.000000 
+24.000000 24.000000 20.000000 16.000000 12.000000 10.000000 
+11.000000 12.000000 11.000000 18.000000 22.000000 22.000000 
+21.000000 17.000000 15.000000 16.000000 17.000000 17.000000 
+16.000000 16.000000 14.000000 9.000000 13.000000 18.000000 
+18.000000 15.000000 18.000000 20.000000 16.000000 11.000000 
+11.000000 17.000000 21.000000 21.000000 22.000000 20.000000 
+20.000000 25.000000 23.000000 14.000000 10.000000 6.000000 
+8.000000 18.000000 26.000000 32.000000 31.000000 23.000000 
+14.000000 14.000000 19.000000 23.000000 27.000000 24.000000 
+20.000000 19.000000 18.000000 13.000000 114.000000 118.000000 
+119.000000 120.000000 120.000000 119.000000 115.000000 106.000000 
+96.000000 92.000000 99.000000 109.000000 107.000000 83.000000 
+47.000000 20.000000 13.000000 19.000000 22.000000 21.000000 
+16.000000 13.000000 11.000000 11.000000 16.000000 18.000000 
+17.000000 19.000000 18.000000 14.000000 11.000000 10.000000 
+14.000000 15.000000 14.000000 13.000000 12.000000 9.000000 
+7.000000 6.000000 9.000000 14.000000 15.000000 13.000000 
+12.000000 15.000000 24.000000 34.000000 32.000000 21.000000 
+15.000000 22.000000 29.000000 27.000000 21.000000 15.000000 
+14.000000 15.000000 11.000000 5.000000 9.000000 13.000000 
+15.000000 23.000000 27.000000 25.000000 24.000000 23.000000 
+21.000000 19.000000 19.000000 14.000000 8.000000 10.000000 
+17.000000 21.000000 107.000000 108.000000 114.000000 118.000000 
+117.000000 115.000000 113.000000 108.000000 100.000000 97.000000 
+105.000000 119.000000 117.000000 86.000000 39.000000 8.000000 
+11.000000 14.000000 20.000000 20.000000 17.000000 15.000000 
+14.000000 17.000000 20.000000 23.000000 27.000000 27.000000 
+23.000000 18.000000 16.000000 16.000000 15.000000 12.000000 
+11.000000 11.000000 10.000000 9.000000 7.000000 8.000000 
+14.000000 19.000000 16.000000 14.000000 15.000000 16.000000 
+19.000000 25.000000 33.000000 31.000000 23.000000 23.000000 
+27.000000 26.000000 21.000000 14.000000 10.000000 11.000000 
+11.000000 14.000000 18.000000 13.000000 10.000000 18.000000 
+27.000000 34.000000 32.000000 25.000000 18.000000 17.000000 
+19.000000 19.000000 14.000000 8.000000 15.000000 22.000000 
+106.000000 104.000000 109.000000 114.000000 113.000000 112.000000 
+116.000000 117.000000 105.000000 88.000000 88.000000 107.000000 
+118.000000 95.000000 45.000000 9.000000 10.000000 10.000000 
+20.000000 25.000000 23.000000 18.000000 13.000000 14.000000 
+23.000000 28.000000 31.000000 30.000000 27.000000 24.000000 
+23.000000 22.000000 19.000000 14.000000 11.000000 11.000000 
+11.000000 15.000000 16.000000 19.000000 22.000000 22.000000 
+17.000000 13.000000 17.000000 20.000000 15.000000 14.000000 
+15.000000 22.000000 28.000000 26.000000 20.000000 17.000000 
+15.000000 12.000000 13.000000 15.000000 15.000000 13.000000 
+12.000000 11.000000 8.000000 11.000000 20.000000 30.000000 
+31.000000 25.000000 19.000000 16.000000 15.000000 15.000000 
+17.000000 13.000000 10.000000 14.000000 115.000000 113.000000 
+111.000000 110.000000 109.000000 111.000000 117.000000 118.000000 
+105.000000 87.000000 86.000000 103.000000 115.000000 95.000000 
+49.000000 15.000000 11.000000 21.000000 39.000000 46.000000 
+41.000000 31.000000 19.000000 9.000000 15.000000 26.000000 
+27.000000 22.000000 18.000000 16.000000 19.000000 23.000000 
+21.000000 16.000000 12.000000 13.000000 17.000000 24.000000 
+26.000000 22.000000 18.000000 16.000000 16.000000 16.000000 
+15.000000 15.000000 15.000000 17.000000 13.000000 16.000000 
+24.000000 22.000000 13.000000 6.000000 4.000000 9.000000 
+18.000000 21.000000 16.000000 10.000000 8.000000 9.000000 
+5.000000 3.000000 8.000000 17.000000 23.000000 23.000000 
+18.000000 11.000000 8.000000 12.000000 24.000000 28.000000 
+21.000000 16.000000 116.000000 115.000000 112.000000 108.000000 
+108.000000 115.000000 125.000000 125.000000 112.000000 98.000000 
+97.000000 106.000000 107.000000 87.000000 56.000000 33.000000 
+28.000000 36.000000 46.000000 44.000000 36.000000 28.000000 
+22.000000 17.000000 21.000000 29.000000 26.000000 17.000000 
+14.000000 15.000000 16.000000 19.000000 20.000000 18.000000 
+18.000000 20.000000 23.000000 27.000000 28.000000 20.000000 
+12.000000 11.000000 13.000000 13.000000 9.000000 8.000000 
+13.000000 19.000000 15.000000 14.000000 16.000000 14.000000 
+12.000000 11.000000 11.000000 11.000000 11.000000 11.000000 
+9.000000 10.000000 14.000000 12.000000 6.000000 4.000000 
+5.000000 11.000000 15.000000 13.000000 11.000000 10.000000 
+12.000000 22.000000 32.000000 33.000000 24.000000 15.000000 
+116.000000 123.000000 124.000000 119.000000 115.000000 118.000000 
+122.000000 118.000000 106.000000 95.000000 95.000000 105.000000 
+111.000000 101.000000 74.000000 47.000000 35.000000 36.000000 
+42.000000 38.000000 27.000000 21.000000 25.000000 29.000000 
+33.000000 36.000000 29.000000 13.000000 12.000000 17.000000 
+18.000000 19.000000 20.000000 19.000000 19.000000 21.000000 
+29.000000 35.000000 30.000000 18.000000 14.000000 19.000000 
+23.000000 18.000000 7.000000 6.000000 14.000000 19.000000 
+12.000000 14.000000 17.000000 11.000000 10.000000 14.000000 
+18.000000 13.000000 12.000000 16.000000 15.000000 14.000000 
+18.000000 18.000000 13.000000 9.000000 14.000000 23.000000 
+25.000000 15.000000 6.000000 10.000000 22.000000 28.000000 
+34.000000 36.000000 19.000000 8.000000 116.000000 125.000000 
+130.000000 127.000000 120.000000 114.000000 112.000000 108.000000 
+100.000000 91.000000 92.000000 107.000000 122.000000 113.000000 
+76.000000 41.000000 31.000000 33.000000 38.000000 40.000000 
+38.000000 40.000000 42.000000 40.000000 37.000000 37.000000 
+31.000000 16.000000 9.000000 20.000000 25.000000 23.000000 
+23.000000 24.000000 27.000000 32.000000 38.000000 36.000000 
+25.000000 13.000000 12.000000 20.000000 28.000000 26.000000 
+20.000000 18.000000 20.000000 14.000000 11.000000 23.000000 
+29.000000 20.000000 14.000000 17.000000 14.000000 11.000000 
+15.000000 19.000000 20.000000 20.000000 18.000000 18.000000 
+17.000000 16.000000 19.000000 26.000000 31.000000 26.000000 
+13.000000 8.000000 18.000000 20.000000 22.000000 28.000000 
+17.000000 25.000000 113.000000 116.000000 121.000000 123.000000 
+121.000000 118.000000 116.000000 113.000000 104.000000 94.000000 
+96.000000 109.000000 112.000000 92.000000 57.000000 32.000000 
+21.000000 17.000000 21.000000 31.000000 44.000000 52.000000 
+51.000000 44.000000 34.000000 35.000000 41.000000 36.000000 
+20.000000 13.000000 21.000000 21.000000 14.000000 16.000000 
+32.000000 40.000000 33.000000 19.000000 14.000000 15.000000 
+16.000000 18.000000 20.000000 22.000000 24.000000 26.000000 
+18.000000 9.000000 19.000000 29.000000 27.000000 23.000000 
+20.000000 13.000000 8.000000 11.000000 15.000000 20.000000 
+23.000000 22.000000 20.000000 18.000000 15.000000 12.000000 
+12.000000 13.000000 10.000000 9.000000 17.000000 21.000000 
+27.000000 35.000000 39.000000 42.000000 50.000000 80.000000 
+114.000000 111.000000 109.000000 110.000000 114.000000 119.000000 
+123.000000 121.000000 112.000000 101.000000 94.000000 91.000000 
+86.000000 73.000000 50.000000 21.000000 0.000000 0.000000 
+0.000000 21.000000 35.000000 32.000000 30.000000 32.000000 
+31.000000 28.000000 33.000000 40.000000 32.000000 14.000000 
+18.000000 27.000000 22.000000 15.000000 22.000000 25.000000 
+17.000000 10.000000 8.000000 11.000000 22.000000 32.000000 
+29.000000 16.000000 16.000000 19.000000 12.000000 14.000000 
+24.000000 23.000000 18.000000 18.000000 16.000000 7.000000 
+6.000000 10.000000 14.000000 26.000000 36.000000 38.000000 
+42.000000 40.000000 28.000000 24.000000 29.000000 38.000000 
+37.000000 31.000000 37.000000 49.000000 61.000000 70.000000 
+82.000000 94.000000 102.000000 106.000000 114.000000 111.000000 
+108.000000 110.000000 114.000000 117.000000 120.000000 119.000000 
+113.000000 102.000000 91.000000 83.000000 77.000000 72.000000 
+60.000000 62.000000 84.000000 83.000000 54.000000 35.000000 
+24.000000 19.000000 17.000000 22.000000 31.000000 30.000000 
+26.000000 28.000000 31.000000 28.000000 24.000000 24.000000 
+21.000000 16.000000 12.000000 11.000000 13.000000 13.000000 
+7.000000 14.000000 27.000000 31.000000 21.000000 12.000000 
+14.000000 13.000000 21.000000 36.000000 43.000000 32.000000 
+9.000000 0.000000 0.000000 5.000000 17.000000 17.000000 
+20.000000 33.000000 40.000000 50.000000 57.000000 55.000000 
+55.000000 61.000000 67.000000 75.000000 86.000000 87.000000 
+78.000000 73.000000 76.000000 87.000000 105.000000 115.000000 
+105.000000 91.000000 112.000000 112.000000 116.000000 119.000000 
+117.000000 113.000000 111.000000 108.000000 98.000000 89.000000 
+90.000000 89.000000 73.000000 59.000000 87.000000 186.000000 
+273.000000 254.000000 158.000000 69.000000 28.000000 19.000000 
+17.000000 14.000000 19.000000 27.000000 31.000000 28.000000 
+25.000000 23.000000 21.000000 18.000000 13.000000 13.000000 
+12.000000 12.000000 16.000000 10.000000 13.000000 32.000000 
+32.000000 15.000000 12.000000 25.000000 28.000000 15.000000 
+27.000000 55.000000 85.000000 111.000000 113.000000 95.000000 
+63.000000 36.000000 25.000000 24.000000 31.000000 37.000000 
+45.000000 53.000000 47.000000 47.000000 66.000000 83.000000 
+84.000000 80.000000 85.000000 94.000000 97.000000 95.000000 
+97.000000 105.000000 110.000000 102.000000 91.000000 92.000000 
+111.000000 113.000000 113.000000 112.000000 112.000000 114.000000 
+114.000000 107.000000 96.000000 91.000000 88.000000 75.000000 
+61.000000 79.000000 162.000000 275.000000 331.000000 290.000000 
+192.000000 105.000000 48.000000 17.000000 12.000000 11.000000 
+10.000000 15.000000 23.000000 28.000000 29.000000 28.000000 
+32.000000 37.000000 34.000000 26.000000 22.000000 20.000000 
+14.000000 7.000000 17.000000 27.000000 24.000000 17.000000 
+25.000000 33.000000 36.000000 27.000000 25.000000 43.000000 
+103.000000 208.000000 301.000000 303.000000 208.000000 86.000000 
+14.000000 15.000000 34.000000 39.000000 44.000000 47.000000 
+48.000000 56.000000 69.000000 80.000000 89.000000 93.000000 
+95.000000 102.000000 108.000000 110.000000 113.000000 111.000000 
+102.000000 92.000000 91.000000 96.000000 109.000000 115.000000 
+114.000000 113.000000 117.000000 122.000000 116.000000 103.000000 
+100.000000 102.000000 87.000000 60.000000 66.000000 136.000000 
+234.000000 290.000000 289.000000 245.000000 187.000000 130.000000 
+70.000000 27.000000 15.000000 16.000000 17.000000 16.000000 
+18.000000 23.000000 32.000000 39.000000 40.000000 38.000000 
+35.000000 31.000000 20.000000 12.000000 10.000000 12.000000 
+15.000000 15.000000 16.000000 22.000000 22.000000 21.000000 
+28.000000 39.000000 32.000000 34.000000 105.000000 240.000000 
+350.000000 347.000000 235.000000 105.000000 32.000000 19.000000 
+33.000000 45.000000 37.000000 41.000000 71.000000 82.000000 
+68.000000 64.000000 81.000000 102.000000 109.000000 109.000000 
+109.000000 108.000000 107.000000 110.000000 109.000000 103.000000 
+96.000000 96.000000 109.000000 116.000000 116.000000 114.000000 
+116.000000 117.000000 109.000000 101.000000 103.000000 106.000000 
+90.000000 67.000000 82.000000 138.000000 207.000000 251.000000 
+252.000000 221.000000 176.000000 122.000000 69.000000 35.000000 
+25.000000 29.000000 28.000000 19.000000 13.000000 16.000000 
+22.000000 25.000000 27.000000 29.000000 32.000000 29.000000 
+17.000000 10.000000 14.000000 18.000000 20.000000 22.000000 
+23.000000 16.000000 14.000000 14.000000 25.000000 39.000000 
+31.000000 49.000000 120.000000 222.000000 300.000000 301.000000 
+236.000000 154.000000 78.000000 25.000000 24.000000 46.000000 
+45.000000 48.000000 71.000000 79.000000 68.000000 65.000000 
+81.000000 99.000000 104.000000 102.000000 104.000000 109.000000 
+111.000000 110.000000 106.000000 98.000000 95.000000 99.000000 
+107.000000 112.000000 114.000000 116.000000 113.000000 102.000000 
+91.000000 94.000000 108.000000 114.000000 100.000000 85.000000 
+92.000000 111.000000 123.000000 135.000000 150.000000 156.000000 
+137.000000 93.000000 51.000000 33.000000 34.000000 41.000000 
+38.000000 26.000000 18.000000 13.000000 10.000000 12.000000 
+17.000000 20.000000 18.000000 19.000000 21.000000 24.000000 
+25.000000 29.000000 30.000000 29.000000 27.000000 22.000000 
+26.000000 23.000000 20.000000 22.000000 21.000000 57.000000 
+110.000000 168.000000 228.000000 264.000000 261.000000 213.000000 
+125.000000 41.000000 9.000000 24.000000 32.000000 33.000000 
+56.000000 79.000000 81.000000 80.000000 88.000000 99.000000 
+102.000000 102.000000 107.000000 114.000000 115.000000 109.000000 
+102.000000 100.000000 99.000000 99.000000 105.000000 105.000000 
+109.000000 112.000000 106.000000 95.000000 92.000000 100.000000 
+110.000000 109.000000 100.000000 92.000000 92.000000 94.000000 
+92.000000 87.000000 82.000000 78.000000 68.000000 52.000000 
+36.000000 27.000000 30.000000 36.000000 35.000000 25.000000 
+17.000000 17.000000 16.000000 12.000000 12.000000 13.000000 
+8.000000 14.000000 21.000000 22.000000 21.000000 18.000000 
+14.000000 12.000000 20.000000 37.000000 48.000000 43.000000 
+26.000000 16.000000 23.000000 56.000000 89.000000 116.000000 
+156.000000 206.000000 235.000000 220.000000 161.000000 86.000000 
+24.000000 3.000000 11.000000 30.000000 64.000000 94.000000 
+98.000000 89.000000 88.000000 97.000000 105.000000 108.000000 
+109.000000 111.000000 110.000000 104.000000 103.000000 106.000000 
+107.000000 104.000000 103.000000 109.000000 111.000000 108.000000 
+105.000000 104.000000 103.000000 98.000000 96.000000 100.000000 
+101.000000 91.000000 79.000000 82.000000 86.000000 82.000000 
+75.000000 69.000000 59.000000 48.000000 44.000000 46.000000 
+40.000000 26.000000 17.000000 14.000000 19.000000 25.000000 
+24.000000 27.000000 34.000000 38.000000 29.000000 20.000000 
+20.000000 26.000000 24.000000 14.000000 8.000000 10.000000 
+16.000000 24.000000 37.000000 49.000000 45.000000 29.000000 
+20.000000 35.000000 69.000000 94.000000 107.000000 127.000000 
+152.000000 166.000000 153.000000 111.000000 64.000000 30.000000 
+16.000000 26.000000 55.000000 83.000000 92.000000 90.000000 
+91.000000 99.000000 105.000000 106.000000 106.000000 106.000000 
+104.000000 101.000000 100.000000 103.000000 107.000000 110.000000 
+103.000000 103.000000 102.000000 103.000000 107.000000 107.000000 
+100.000000 92.000000 94.000000 102.000000 96.000000 72.000000 
+54.000000 64.000000 75.000000 65.000000 53.000000 50.000000 
+51.000000 48.000000 46.000000 45.000000 43.000000 38.000000 
+32.000000 29.000000 32.000000 35.000000 33.000000 33.000000 
+36.000000 40.000000 36.000000 24.000000 17.000000 22.000000 
+28.000000 29.000000 28.000000 25.000000 20.000000 19.000000 
+26.000000 36.000000 37.000000 29.000000 21.000000 25.000000 
+44.000000 65.000000 73.000000 73.000000 82.000000 101.000000 
+117.000000 115.000000 94.000000 67.000000 48.000000 46.000000 
+58.000000 74.000000 83.000000 85.000000 86.000000 93.000000 
+103.000000 109.000000 109.000000 106.000000 105.000000 107.000000 
+108.000000 105.000000 103.000000 103.000000 109.000000 105.000000 
+104.000000 107.000000 110.000000 109.000000 108.000000 110.000000 
+114.000000 105.000000 80.000000 46.000000 24.000000 25.000000 
+32.000000 32.000000 28.000000 29.000000 39.000000 47.000000 
+41.000000 29.000000 28.000000 42.000000 54.000000 47.000000 
+31.000000 27.000000 30.000000 35.000000 37.000000 37.000000 
+35.000000 31.000000 28.000000 30.000000 40.000000 46.000000 
+39.000000 25.000000 19.000000 23.000000 33.000000 42.000000 
+49.000000 49.000000 41.000000 32.000000 33.000000 46.000000 
+61.000000 67.000000 70.000000 80.000000 95.000000 102.000000 
+95.000000 78.000000 61.000000 53.000000 56.000000 64.000000 
+71.000000 76.000000 83.000000 95.000000 107.000000 112.000000 
+111.000000 107.000000 105.000000 105.000000 102.000000 98.000000 
+98.000000 103.000000 107.000000 101.000000 100.000000 104.000000 
+108.000000 109.000000 113.000000 119.000000 121.000000 110.000000 
+81.000000 42.000000 11.000000 5.000000 15.000000 32.000000 
+59.000000 73.000000 67.000000 56.000000 48.000000 41.000000 
+39.000000 41.000000 45.000000 41.000000 27.000000 12.000000 
+9.000000 19.000000 30.000000 33.000000 35.000000 36.000000 
+33.000000 28.000000 31.000000 38.000000 39.000000 33.000000 
+26.000000 24.000000 27.000000 35.000000 45.000000 49.000000 
+42.000000 30.000000 26.000000 34.000000 48.000000 57.000000 
+61.000000 68.000000 80.000000 86.000000 82.000000 71.000000 
+64.000000 64.000000 65.000000 64.000000 62.000000 64.000000 
+70.000000 80.000000 91.000000 100.000000 106.000000 108.000000 
+105.000000 100.000000 98.000000 100.000000 103.000000 105.000000 
+101.000000 98.000000 105.000000 110.000000 107.000000 105.000000 
+112.000000 122.000000 124.000000 112.000000 91.000000 66.000000 
+47.000000 50.000000 57.000000 58.000000 71.000000 81.000000 
+63.000000 37.000000 29.000000 36.000000 47.000000 49.000000 
+42.000000 36.000000 31.000000 21.000000 13.000000 10.000000 
+12.000000 14.000000 16.000000 17.000000 19.000000 20.000000 
+24.000000 33.000000 41.000000 38.000000 30.000000 25.000000 
+24.000000 24.000000 29.000000 36.000000 44.000000 50.000000 
+52.000000 52.000000 51.000000 49.000000 47.000000 51.000000 
+64.000000 79.000000 85.000000 80.000000 72.000000 70.000000 
+73.000000 75.000000 76.000000 74.000000 73.000000 75.000000 
+81.000000 90.000000 97.000000 99.000000 97.000000 95.000000 
+97.000000 101.000000 103.000000 103.000000 102.000000 112.000000 
+126.000000 128.000000 117.000000 106.000000 105.000000 110.000000 
+107.000000 92.000000 79.000000 85.000000 87.000000 64.000000 
+47.000000 42.000000 31.000000 30.000000 27.000000 24.000000 
+22.000000 27.000000 33.000000 39.000000 42.000000 39.000000 
+31.000000 21.000000 17.000000 21.000000 28.000000 29.000000 
+25.000000 16.000000 8.000000 9.000000 15.000000 18.000000 
+22.000000 25.000000 19.000000 9.000000 6.000000 7.000000 
+19.000000 38.000000 49.000000 48.000000 49.000000 57.000000 
+60.000000 52.000000 44.000000 43.000000 53.000000 71.000000 
+81.000000 79.000000 79.000000 83.000000 88.000000 94.000000 
+97.000000 93.000000 83.000000 73.000000 69.000000 75.000000 
+85.000000 92.000000 94.000000 97.000000 104.000000 109.000000 
+109.000000 107.000000 99.000000 123.000000 139.000000 140.000000 
+131.000000 111.000000 82.000000 55.000000 43.000000 30.000000 
+11.000000 13.000000 25.000000 19.000000 14.000000 15.000000 
+10.000000 8.000000 12.000000 14.000000 10.000000 10.000000 
+14.000000 30.000000 40.000000 42.000000 38.000000 28.000000 
+21.000000 37.000000 80.000000 121.000000 132.000000 100.000000 
+46.000000 24.000000 33.000000 39.000000 31.000000 27.000000 
+19.000000 11.000000 14.000000 9.000000 13.000000 29.000000 
+38.000000 31.000000 40.000000 59.000000 58.000000 39.000000 
+24.000000 17.000000 18.000000 29.000000 45.000000 58.000000 
+70.000000 83.000000 101.000000 126.000000 142.000000 140.000000 
+122.000000 100.000000 82.000000 73.000000 75.000000 85.000000 
+93.000000 95.000000 99.000000 108.000000 113.000000 110.000000 
+59.000000 86.000000 98.000000 94.000000 83.000000 69.000000 
+49.000000 29.000000 18.000000 14.000000 12.000000 7.000000 
+6.000000 23.000000 35.000000 30.000000 21.000000 14.000000 
+12.000000 18.000000 27.000000 30.000000 33.000000 32.000000 
+29.000000 35.000000 51.000000 61.000000 46.000000 50.000000 
+112.000000 210.000000 285.000000 267.000000 174.000000 92.000000 
+76.000000 88.000000 79.000000 50.000000 35.000000 36.000000 
+43.000000 44.000000 26.000000 7.000000 1.000000 10.000000 
+42.000000 68.000000 59.000000 26.000000 8.000000 9.000000 
+14.000000 11.000000 11.000000 22.000000 39.000000 60.000000 
+92.000000 135.000000 175.000000 189.000000 173.000000 150.000000 
+134.000000 121.000000 105.000000 93.000000 87.000000 83.000000 
+81.000000 90.000000 103.000000 110.000000 23.000000 29.000000 
+26.000000 19.000000 13.000000 12.000000 14.000000 16.000000 
+15.000000 12.000000 14.000000 13.000000 14.000000 35.000000 
+42.000000 44.000000 46.000000 44.000000 39.000000 39.000000 
+45.000000 54.000000 63.000000 71.000000 74.000000 66.000000 
+55.000000 47.000000 40.000000 44.000000 83.000000 192.000000 
+297.000000 316.000000 247.000000 154.000000 91.000000 72.000000 
+68.000000 64.000000 66.000000 76.000000 76.000000 66.000000 
+51.000000 31.000000 16.000000 20.000000 33.000000 45.000000 
+49.000000 39.000000 24.000000 18.000000 21.000000 27.000000 
+26.000000 13.000000 14.000000 43.000000 76.000000 109.000000 
+150.000000 195.000000 224.000000 222.000000 197.000000 165.000000 
+137.000000 115.000000 101.000000 93.000000 91.000000 92.000000 
+99.000000 108.000000 12.000000 11.000000 12.000000 16.000000 
+15.000000 11.000000 13.000000 21.000000 22.000000 12.000000 
+10.000000 18.000000 34.000000 39.000000 43.000000 77.000000 
+90.000000 68.000000 43.000000 39.000000 49.000000 58.000000 
+64.000000 68.000000 64.000000 51.000000 40.000000 39.000000 
+52.000000 70.000000 94.000000 152.000000 222.000000 256.000000 
+232.000000 163.000000 93.000000 55.000000 53.000000 68.000000 
+76.000000 72.000000 63.000000 60.000000 61.000000 56.000000 
+48.000000 45.000000 38.000000 28.000000 25.000000 25.000000 
+16.000000 6.000000 9.000000 17.000000 20.000000 16.000000 
+16.000000 28.000000 49.000000 74.000000 101.000000 139.000000 
+189.000000 230.000000 244.000000 226.000000 190.000000 152.000000 
+120.000000 97.000000 85.000000 87.000000 96.000000 102.000000 
+10.000000 5.000000 5.000000 7.000000 9.000000 10.000000 
+13.000000 16.000000 13.000000 10.000000 14.000000 28.000000 
+36.000000 31.000000 65.000000 113.000000 112.000000 82.000000 
+62.000000 61.000000 69.000000 76.000000 73.000000 63.000000 
+54.000000 52.000000 56.000000 64.000000 72.000000 80.000000 
+87.000000 102.000000 132.000000 153.000000 143.000000 108.000000 
+70.000000 42.000000 37.000000 49.000000 62.000000 71.000000 
+76.000000 78.000000 77.000000 75.000000 69.000000 58.000000 
+39.000000 20.000000 11.000000 14.000000 17.000000 14.000000 
+8.000000 13.000000 21.000000 20.000000 13.000000 8.000000 
+15.000000 36.000000 62.000000 90.000000 126.000000 171.000000 
+211.000000 227.000000 215.000000 183.000000 144.000000 110.000000 
+91.000000 87.000000 92.000000 92.000000 12.000000 14.000000 
+14.000000 14.000000 14.000000 13.000000 10.000000 7.000000 
+5.000000 9.000000 25.000000 37.000000 34.000000 45.000000 
+80.000000 95.000000 87.000000 77.000000 78.000000 82.000000 
+82.000000 78.000000 72.000000 66.000000 65.000000 72.000000 
+82.000000 91.000000 101.000000 108.000000 102.000000 86.000000 
+75.000000 76.000000 80.000000 78.000000 65.000000 46.000000 
+32.000000 31.000000 42.000000 54.000000 60.000000 62.000000 
+70.000000 83.000000 93.000000 92.000000 76.000000 47.000000 
+21.000000 13.000000 12.000000 9.000000 8.000000 10.000000 
+11.000000 10.000000 13.000000 18.000000 14.000000 14.000000 
+30.000000 53.000000 81.000000 112.000000 148.000000 182.000000 
+196.000000 177.000000 134.000000 93.000000 66.000000 52.000000 
+43.000000 38.000000 14.000000 15.000000 14.000000 11.000000 
+11.000000 12.000000 13.000000 11.000000 11.000000 18.000000 
+32.000000 44.000000 59.000000 77.000000 87.000000 84.000000 
+72.000000 63.000000 64.000000 67.000000 68.000000 62.000000 
+55.000000 56.000000 68.000000 81.000000 93.000000 102.000000 
+105.000000 100.000000 90.000000 81.000000 74.000000 65.000000 
+63.000000 70.000000 76.000000 74.000000 65.000000 56.000000 
+51.000000 48.000000 48.000000 53.000000 63.000000 77.000000 
+89.000000 94.000000 85.000000 62.000000 36.000000 18.000000 
+11.000000 11.000000 12.000000 13.000000 17.000000 20.000000 
+15.000000 12.000000 16.000000 15.000000 7.000000 14.000000 
+46.000000 81.000000 110.000000 137.000000 156.000000 153.000000 
+120.000000 74.000000 39.000000 28.000000 30.000000 31.000000 
+13.000000 13.000000 14.000000 13.000000 14.000000 15.000000 
+11.000000 8.000000 19.000000 34.000000 46.000000 58.000000 
+63.000000 61.000000 61.000000 66.000000 67.000000 67.000000 
+68.000000 70.000000 73.000000 76.000000 85.000000 94.000000 
+98.000000 100.000000 106.000000 111.000000 106.000000 95.000000 
+88.000000 90.000000 91.000000 89.000000 86.000000 90.000000 
+96.000000 95.000000 87.000000 81.000000 77.000000 69.000000 
+57.000000 50.000000 56.000000 73.000000 88.000000 90.000000 
+79.000000 62.000000 40.000000 17.000000 9.000000 8.000000 
+6.000000 7.000000 11.000000 16.000000 17.000000 12.000000 
+7.000000 13.000000 19.000000 9.000000 10.000000 38.000000 
+72.000000 107.000000 124.000000 118.000000 102.000000 83.000000 
+59.000000 35.000000 28.000000 34.000000 13.000000 11.000000 
+12.000000 14.000000 15.000000 12.000000 7.000000 7.000000 
+20.000000 43.000000 69.000000 83.000000 77.000000 64.000000 
+58.000000 57.000000 59.000000 64.000000 71.000000 76.000000 
+83.000000 92.000000 99.000000 103.000000 107.000000 111.000000 
+111.000000 106.000000 99.000000 96.000000 96.000000 97.000000 
+98.000000 101.000000 105.000000 106.000000 104.000000 104.000000 
+104.000000 104.000000 101.000000 93.000000 78.000000 63.000000 
+57.000000 62.000000 70.000000 74.000000 79.000000 76.000000 
+49.000000 14.000000 11.000000 12.000000 5.000000 6.000000 
+8.000000 9.000000 8.000000 7.000000 11.000000 17.000000 
+18.000000 22.000000 25.000000 18.000000 26.000000 59.000000 
+84.000000 86.000000 70.000000 52.000000 35.000000 15.000000 
+21.000000 43.000000 12.000000 13.000000 15.000000 13.000000 
+9.000000 10.000000 14.000000 23.000000 37.000000 56.000000 
+72.000000 79.000000 76.000000 67.000000 62.000000 62.000000 
+65.000000 72.000000 82.000000 92.000000 100.000000 105.000000 
+108.000000 110.000000 107.000000 103.000000 101.000000 102.000000 
+104.000000 103.000000 101.000000 100.000000 103.000000 107.000000 
+108.000000 108.000000 110.000000 112.000000 113.000000 112.000000 
+112.000000 111.000000 102.000000 89.000000 77.000000 67.000000 
+60.000000 61.000000 74.000000 75.000000 46.000000 14.000000 
+13.000000 13.000000 6.000000 9.000000 15.000000 19.000000 
+19.000000 15.000000 14.000000 16.000000 19.000000 18.000000 
+15.000000 15.000000 14.000000 18.000000 34.000000 45.000000 
+40.000000 25.000000 17.000000 22.000000 30.000000 33.000000 
+13.000000 15.000000 17.000000 15.000000 9.000000 7.000000 
+13.000000 23.000000 43.000000 65.000000 76.000000 74.000000 
+67.000000 63.000000 65.000000 69.000000 73.000000 77.000000 
+83.000000 93.000000 103.000000 109.000000 111.000000 110.000000 
+108.000000 107.000000 105.000000 103.000000 101.000000 101.000000 
+102.000000 105.000000 108.000000 110.000000 109.000000 109.000000 
+111.000000 111.000000 108.000000 103.000000 100.000000 105.000000 
+110.000000 106.000000 88.000000 65.000000 51.000000 55.000000 
+69.000000 69.000000 42.000000 15.000000 18.000000 19.000000 
+8.000000 9.000000 13.000000 13.000000 14.000000 17.000000 
+20.000000 20.000000 18.000000 16.000000 13.000000 13.000000 
+17.000000 19.000000 18.000000 15.000000 10.000000 7.000000 
+14.000000 24.000000 28.000000 25.000000 18.000000 17.000000 
+12.000000 12.000000 17.000000 21.000000 35.000000 62.000000 
+79.000000 77.000000 66.000000 61.000000 62.000000 61.000000 
+58.000000 62.000000 71.000000 82.000000 95.000000 106.000000 
+111.000000 108.000000 105.000000 104.000000 104.000000 101.000000 
+100.000000 101.000000 106.000000 108.000000 106.000000 104.000000 
+103.000000 105.000000 106.000000 105.000000 104.000000 105.000000 
+107.000000 106.000000 104.000000 104.000000 109.000000 112.000000 
+102.000000 78.000000 57.000000 53.000000 64.000000 72.000000 
+62.000000 39.000000 20.000000 11.000000 9.000000 7.000000 
+6.000000 9.000000 11.000000 15.000000 18.000000 17.000000 
+13.000000 12.000000 14.000000 14.000000 11.000000 10.000000 
+12.000000 14.000000 13.000000 11.000000 13.000000 17.000000 
+21.000000 24.000000 11.000000 8.000000 12.000000 26.000000 
+36.000000 45.000000 60.000000 71.000000 70.000000 66.000000 
+67.000000 68.000000 64.000000 63.000000 69.000000 77.000000 
+81.000000 87.000000 98.000000 108.000000 110.000000 103.000000 
+97.000000 97.000000 99.000000 100.000000 97.000000 93.000000 
+92.000000 97.000000 105.000000 111.000000 110.000000 106.000000 
+105.000000 107.000000 108.000000 106.000000 103.000000 102.000000 
+105.000000 107.000000 110.000000 113.000000 110.000000 97.000000 
+77.000000 63.000000 62.000000 68.000000 69.000000 56.000000 
+31.000000 12.000000 6.000000 9.000000 11.000000 11.000000 
+10.000000 11.000000 12.000000 15.000000 16.000000 14.000000 
+10.000000 10.000000 12.000000 14.000000 14.000000 13.000000 
+14.000000 14.000000 14.000000 13.000000 13.000000 14.000000 
+17.000000 20.000000 31.000000 46.000000 51.000000 50.000000 
+58.000000 67.000000 69.000000 69.000000 69.000000 65.000000 
+62.000000 63.000000 69.000000 82.000000 95.000000 104.000000 
+105.000000 102.000000 100.000000 99.000000 96.000000 95.000000 
+94.000000 94.000000 92.000000 91.000000 94.000000 100.000000 
+104.000000 104.000000 103.000000 106.000000 111.000000 112.000000 
+108.000000 103.000000 102.000000 104.000000 107.000000 107.000000 
+106.000000 110.000000 113.000000 109.000000 92.000000 72.000000 
+64.000000 69.000000 77.000000 74.000000 54.000000 24.000000 
+8.000000 10.000000 11.000000 12.000000 16.000000 17.000000 
+14.000000 12.000000 12.000000 14.000000 17.000000 18.000000 
+17.000000 14.000000 11.000000 10.000000 10.000000 13.000000 
+14.000000 14.000000 18.000000 17.000000 18.000000 34.000000 
+53.000000 61.000000 54.000000 53.000000 67.000000 74.000000 
+71.000000 69.000000 67.000000 65.000000 65.000000 68.000000 
+76.000000 88.000000 99.000000 104.000000 105.000000 104.000000 
+103.000000 103.000000 102.000000 100.000000 97.000000 94.000000 
+91.000000 92.000000 95.000000 100.000000 105.000000 109.000000 
+109.000000 107.000000 105.000000 105.000000 105.000000 107.000000 
+113.000000 119.000000 119.000000 109.000000 98.000000 98.000000 
+108.000000 115.000000 106.000000 86.000000 69.000000 63.000000 
+70.000000 79.000000 75.000000 53.000000 22.000000 8.000000 
+11.000000 14.000000 14.000000 16.000000 17.000000 15.000000 
+13.000000 15.000000 17.000000 16.000000 17.000000 19.000000 
+21.000000 19.000000 12.000000 25.000000 57.000000 65.000000 
+63.000000 66.000000 31.000000 61.000000 67.000000 49.000000 
+45.000000 63.000000 71.000000 68.000000 68.000000 69.000000 
+65.000000 61.000000 62.000000 70.000000 84.000000 97.000000 
+102.000000 101.000000 100.000000 101.000000 100.000000 97.000000 
+96.000000 97.000000 96.000000 93.000000 91.000000 94.000000 
+100.000000 104.000000 107.000000 111.000000 113.000000 110.000000 
+103.000000 98.000000 100.000000 106.000000 111.000000 112.000000 
+111.000000 108.000000 107.000000 107.000000 111.000000 113.000000 
+109.000000 97.000000 81.000000 69.000000 69.000000 77.000000 
+76.000000 60.000000 34.000000 12.000000 11.000000 22.000000 
+23.000000 19.000000 15.000000 14.000000 16.000000 17.000000 
+17.000000 16.000000 15.000000 14.000000 20.000000 28.000000 
+21.000000 23.000000 61.000000 83.000000 78.000000 71.000000 
+10.000000 12.000000 12.000000 11.000000 10.000000 9.000000 
+10.000000 12.000000 10.000000 15.000000 52.000000 86.000000 
+87.000000 55.000000 17.000000 9.000000 25.000000 23.000000 
+14.000000 9.000000 13.000000 15.000000 14.000000 10.000000 
+9.000000 9.000000 8.000000 9.000000 7.000000 5.000000 
+7.000000 11.000000 13.000000 12.000000 9.000000 9.000000 
+13.000000 15.000000 13.000000 10.000000 8.000000 9.000000 
+11.000000 10.000000 9.000000 9.000000 8.000000 8.000000 
+9.000000 9.000000 12.000000 10.000000 14.000000 27.000000 
+31.000000 26.000000 21.000000 17.000000 20.000000 34.000000 
+59.000000 89.000000 107.000000 98.000000 50.000000 13.000000 
+26.000000 39.000000 36.000000 30.000000 31.000000 38.000000 
+41.000000 32.000000 19.000000 17.000000 8.000000 9.000000 
+10.000000 8.000000 9.000000 15.000000 14.000000 11.000000 
+15.000000 16.000000 40.000000 81.000000 89.000000 61.000000 
+23.000000 7.000000 21.000000 22.000000 18.000000 15.000000 
+17.000000 19.000000 19.000000 15.000000 11.000000 10.000000 
+14.000000 15.000000 13.000000 12.000000 12.000000 11.000000 
+11.000000 9.000000 11.000000 13.000000 17.000000 18.000000 
+12.000000 9.000000 9.000000 5.000000 7.000000 14.000000 
+14.000000 11.000000 8.000000 8.000000 10.000000 7.000000 
+5.000000 11.000000 13.000000 14.000000 21.000000 29.000000 
+36.000000 35.000000 16.000000 31.000000 79.000000 107.000000 
+99.000000 55.000000 16.000000 18.000000 30.000000 25.000000 
+25.000000 34.000000 39.000000 34.000000 25.000000 19.000000 
+15.000000 14.000000 15.000000 17.000000 18.000000 16.000000 
+13.000000 11.000000 8.000000 10.000000 26.000000 33.000000 
+38.000000 64.000000 82.000000 70.000000 38.000000 12.000000 
+17.000000 34.000000 34.000000 21.000000 12.000000 15.000000 
+19.000000 16.000000 10.000000 8.000000 9.000000 12.000000 
+13.000000 12.000000 12.000000 16.000000 19.000000 16.000000 
+12.000000 12.000000 14.000000 15.000000 16.000000 18.000000 
+17.000000 16.000000 17.000000 13.000000 9.000000 11.000000 
+9.000000 5.000000 10.000000 22.000000 19.000000 11.000000 
+12.000000 21.000000 38.000000 52.000000 52.000000 39.000000 
+19.000000 14.000000 40.000000 67.000000 54.000000 25.000000 
+22.000000 33.000000 33.000000 31.000000 31.000000 27.000000 
+20.000000 14.000000 12.000000 13.000000 15.000000 13.000000 
+44.000000 38.000000 30.000000 25.000000 18.000000 7.000000 
+5.000000 11.000000 13.000000 24.000000 38.000000 58.000000 
+78.000000 75.000000 44.000000 11.000000 18.000000 27.000000 
+22.000000 16.000000 12.000000 11.000000 9.000000 9.000000 
+12.000000 10.000000 11.000000 14.000000 15.000000 12.000000 
+12.000000 15.000000 19.000000 19.000000 17.000000 15.000000 
+15.000000 14.000000 15.000000 18.000000 16.000000 14.000000 
+13.000000 9.000000 9.000000 12.000000 7.000000 4.000000 
+6.000000 9.000000 9.000000 17.000000 24.000000 27.000000 
+52.000000 70.000000 53.000000 25.000000 14.000000 9.000000 
+18.000000 33.000000 21.000000 17.000000 32.000000 34.000000 
+29.000000 29.000000 28.000000 23.000000 19.000000 10.000000 
+8.000000 17.000000 15.000000 15.000000 117.000000 108.000000 
+84.000000 54.000000 28.000000 7.000000 0.000000 3.000000 
+0.000000 7.000000 34.000000 58.000000 73.000000 69.000000 
+40.000000 12.000000 27.000000 38.000000 27.000000 12.000000 
+8.000000 14.000000 14.000000 6.000000 7.000000 12.000000 
+11.000000 12.000000 11.000000 10.000000 11.000000 11.000000 
+11.000000 10.000000 10.000000 12.000000 10.000000 8.000000 
+13.000000 17.000000 18.000000 16.000000 14.000000 14.000000 
+14.000000 12.000000 9.000000 10.000000 11.000000 6.000000 
+12.000000 26.000000 33.000000 34.000000 45.000000 54.000000 
+46.000000 28.000000 13.000000 10.000000 17.000000 14.000000 
+13.000000 24.000000 32.000000 35.000000 35.000000 29.000000 
+25.000000 27.000000 28.000000 18.000000 6.000000 8.000000 
+15.000000 27.000000 140.000000 128.000000 112.000000 93.000000 
+69.000000 44.000000 34.000000 41.000000 45.000000 55.000000 
+77.000000 97.000000 99.000000 81.000000 47.000000 18.000000 
+17.000000 28.000000 31.000000 26.000000 21.000000 15.000000 
+12.000000 14.000000 10.000000 7.000000 11.000000 12.000000 
+10.000000 9.000000 9.000000 8.000000 7.000000 6.000000 
+6.000000 8.000000 13.000000 18.000000 22.000000 20.000000 
+20.000000 17.000000 11.000000 9.000000 9.000000 7.000000 
+8.000000 11.000000 12.000000 10.000000 11.000000 15.000000 
+28.000000 41.000000 41.000000 36.000000 33.000000 29.000000 
+20.000000 16.000000 15.000000 12.000000 16.000000 21.000000 
+22.000000 28.000000 32.000000 28.000000 21.000000 21.000000 
+25.000000 26.000000 22.000000 20.000000 25.000000 29.000000 
+134.000000 124.000000 122.000000 124.000000 119.000000 107.000000 
+106.000000 112.000000 111.000000 108.000000 112.000000 119.000000 
+114.000000 89.000000 50.000000 16.000000 8.000000 20.000000 
+31.000000 39.000000 41.000000 33.000000 24.000000 18.000000 
+8.000000 9.000000 14.000000 18.000000 22.000000 18.000000 
+9.000000 8.000000 11.000000 11.000000 9.000000 8.000000 
+13.000000 20.000000 19.000000 11.000000 8.000000 10.000000 
+12.000000 12.000000 11.000000 10.000000 10.000000 10.000000 
+7.000000 7.000000 6.000000 4.000000 7.000000 16.000000 
+22.000000 26.000000 28.000000 25.000000 16.000000 11.000000 
+11.000000 13.000000 18.000000 20.000000 24.000000 28.000000 
+28.000000 25.000000 20.000000 17.000000 18.000000 20.000000 
+24.000000 27.000000 28.000000 25.000000 122.000000 120.000000 
+129.000000 139.000000 137.000000 125.000000 118.000000 120.000000 
+125.000000 130.000000 135.000000 133.000000 122.000000 96.000000 
+54.000000 17.000000 19.000000 33.000000 36.000000 36.000000 
+31.000000 28.000000 24.000000 24.000000 17.000000 16.000000 
+22.000000 21.000000 22.000000 19.000000 12.000000 11.000000 
+11.000000 10.000000 7.000000 9.000000 12.000000 11.000000 
+9.000000 9.000000 11.000000 15.000000 17.000000 15.000000 
+15.000000 12.000000 8.000000 7.000000 8.000000 14.000000 
+18.000000 19.000000 22.000000 28.000000 26.000000 19.000000 
+22.000000 23.000000 12.000000 10.000000 11.000000 17.000000 
+29.000000 35.000000 31.000000 28.000000 31.000000 34.000000 
+31.000000 24.000000 23.000000 25.000000 25.000000 23.000000 
+21.000000 16.000000 120.000000 123.000000 130.000000 131.000000 
+121.000000 106.000000 96.000000 97.000000 108.000000 122.000000 
+126.000000 120.000000 110.000000 93.000000 62.000000 29.000000 
+24.000000 35.000000 31.000000 29.000000 32.000000 34.000000 
+25.000000 15.000000 16.000000 18.000000 26.000000 26.000000 
+20.000000 15.000000 13.000000 12.000000 9.000000 7.000000 
+8.000000 9.000000 10.000000 10.000000 11.000000 13.000000 
+16.000000 18.000000 20.000000 22.000000 22.000000 17.000000 
+11.000000 11.000000 15.000000 23.000000 31.000000 33.000000 
+35.000000 40.000000 34.000000 15.000000 8.000000 13.000000 
+14.000000 11.000000 8.000000 13.000000 21.000000 20.000000 
+23.000000 37.000000 39.000000 30.000000 20.000000 19.000000 
+28.000000 31.000000 24.000000 19.000000 16.000000 10.000000 
+124.000000 122.000000 125.000000 126.000000 122.000000 112.000000 
+104.000000 103.000000 106.000000 104.000000 101.000000 104.000000 
+112.000000 101.000000 67.000000 29.000000 13.000000 25.000000 
+28.000000 28.000000 31.000000 34.000000 27.000000 11.000000 
+11.000000 18.000000 21.000000 26.000000 27.000000 22.000000 
+17.000000 13.000000 12.000000 12.000000 13.000000 11.000000 
+10.000000 12.000000 14.000000 12.000000 13.000000 16.000000 
+20.000000 21.000000 17.000000 14.000000 11.000000 11.000000 
+15.000000 23.000000 30.000000 30.000000 29.000000 31.000000 
+29.000000 17.000000 7.000000 9.000000 12.000000 7.000000 
+3.000000 8.000000 17.000000 21.000000 32.000000 46.000000 
+40.000000 23.000000 11.000000 12.000000 19.000000 21.000000 
+17.000000 12.000000 13.000000 17.000000 124.000000 121.000000 
+122.000000 124.000000 123.000000 115.000000 106.000000 102.000000 
+101.000000 99.000000 101.000000 115.000000 124.000000 104.000000 
+57.000000 15.000000 4.000000 10.000000 13.000000 14.000000 
+16.000000 19.000000 20.000000 12.000000 6.000000 14.000000 
+19.000000 23.000000 25.000000 23.000000 21.000000 20.000000 
+18.000000 15.000000 14.000000 15.000000 9.000000 9.000000 
+10.000000 11.000000 16.000000 19.000000 18.000000 16.000000 
+14.000000 12.000000 7.000000 9.000000 18.000000 21.000000 
+20.000000 21.000000 24.000000 29.000000 28.000000 17.000000 
+9.000000 7.000000 6.000000 7.000000 12.000000 16.000000 
+22.000000 31.000000 33.000000 28.000000 26.000000 27.000000 
+26.000000 22.000000 18.000000 17.000000 17.000000 13.000000 
+10.000000 13.000000 120.000000 121.000000 120.000000 120.000000 
+120.000000 121.000000 116.000000 104.000000 89.000000 83.000000 
+95.000000 117.000000 124.000000 99.000000 54.000000 18.000000 
+7.000000 8.000000 8.000000 8.000000 11.000000 15.000000 
+19.000000 17.000000 8.000000 7.000000 13.000000 21.000000 
+26.000000 23.000000 19.000000 18.000000 19.000000 15.000000 
+13.000000 13.000000 8.000000 8.000000 9.000000 7.000000 
+15.000000 20.000000 18.000000 13.000000 10.000000 11.000000 
+12.000000 13.000000 20.000000 26.000000 20.000000 8.000000 
+16.000000 29.000000 27.000000 18.000000 13.000000 11.000000 
+9.000000 11.000000 15.000000 11.000000 12.000000 17.000000 
+17.000000 14.000000 17.000000 24.000000 26.000000 23.000000 
+17.000000 14.000000 14.000000 15.000000 14.000000 12.000000 
+117.000000 117.000000 119.000000 121.000000 122.000000 123.000000 
+121.000000 110.000000 93.000000 83.000000 92.000000 114.000000 
+124.000000 106.000000 68.000000 31.000000 14.000000 14.000000 
+14.000000 15.000000 19.000000 22.000000 21.000000 21.000000 
+15.000000 12.000000 20.000000 25.000000 28.000000 23.000000 
+15.000000 14.000000 16.000000 14.000000 8.000000 6.000000 
+8.000000 10.000000 10.000000 8.000000 12.000000 14.000000 
+12.000000 10.000000 8.000000 9.000000 13.000000 11.000000 
+14.000000 30.000000 34.000000 22.000000 20.000000 25.000000 
+21.000000 13.000000 12.000000 15.000000 16.000000 17.000000 
+13.000000 9.000000 11.000000 10.000000 8.000000 10.000000 
+14.000000 16.000000 17.000000 15.000000 12.000000 10.000000 
+9.000000 9.000000 12.000000 11.000000 125.000000 124.000000 
+124.000000 123.000000 120.000000 118.000000 118.000000 115.000000 
+106.000000 94.000000 92.000000 104.000000 120.000000 114.000000 
+81.000000 39.000000 18.000000 23.000000 31.000000 29.000000 
+26.000000 30.000000 26.000000 21.000000 11.000000 27.000000 
+39.000000 33.000000 22.000000 15.000000 15.000000 17.000000 
+15.000000 13.000000 9.000000 10.000000 13.000000 11.000000 
+8.000000 10.000000 12.000000 13.000000 14.000000 12.000000 
+9.000000 9.000000 9.000000 12.000000 15.000000 21.000000 
+30.000000 32.000000 25.000000 13.000000 13.000000 18.000000 
+19.000000 19.000000 15.000000 13.000000 15.000000 17.000000 
+18.000000 15.000000 12.000000 13.000000 16.000000 17.000000 
+16.000000 13.000000 9.000000 7.000000 12.000000 18.000000 
+13.000000 9.000000 123.000000 123.000000 124.000000 123.000000 
+122.000000 124.000000 126.000000 122.000000 110.000000 94.000000 
+88.000000 101.000000 117.000000 111.000000 75.000000 34.000000 
+19.000000 31.000000 46.000000 43.000000 27.000000 21.000000 
+29.000000 29.000000 23.000000 39.000000 44.000000 31.000000 
+16.000000 12.000000 15.000000 18.000000 13.000000 11.000000 
+13.000000 14.000000 13.000000 13.000000 15.000000 15.000000 
+15.000000 17.000000 21.000000 20.000000 13.000000 7.000000 
+6.000000 13.000000 17.000000 14.000000 14.000000 19.000000 
+17.000000 7.000000 11.000000 20.000000 22.000000 12.000000 
+5.000000 12.000000 20.000000 21.000000 19.000000 17.000000 
+18.000000 19.000000 20.000000 22.000000 24.000000 22.000000 
+16.000000 11.000000 16.000000 23.000000 13.000000 9.000000 
+118.000000 120.000000 123.000000 122.000000 120.000000 123.000000 
+126.000000 122.000000 108.000000 94.000000 93.000000 107.000000 
+121.000000 116.000000 86.000000 48.000000 26.000000 24.000000 
+34.000000 41.000000 32.000000 16.000000 18.000000 27.000000 
+32.000000 33.000000 30.000000 20.000000 10.000000 10.000000 
+12.000000 17.000000 15.000000 12.000000 14.000000 15.000000 
+23.000000 29.000000 27.000000 20.000000 15.000000 14.000000 
+19.000000 24.000000 16.000000 10.000000 7.000000 9.000000 
+15.000000 18.000000 20.000000 22.000000 17.000000 12.000000 
+12.000000 12.000000 17.000000 17.000000 15.000000 18.000000 
+25.000000 30.000000 26.000000 15.000000 9.000000 12.000000 
+19.000000 17.000000 16.000000 20.000000 17.000000 17.000000 
+25.000000 29.000000 20.000000 9.000000 121.000000 125.000000 
+124.000000 119.000000 117.000000 123.000000 130.000000 129.000000 
+116.000000 101.000000 97.000000 107.000000 122.000000 121.000000 
+93.000000 55.000000 31.000000 30.000000 37.000000 39.000000 
+33.000000 27.000000 23.000000 27.000000 30.000000 28.000000 
+21.000000 13.000000 11.000000 9.000000 10.000000 19.000000 
+22.000000 17.000000 15.000000 20.000000 32.000000 34.000000 
+26.000000 16.000000 13.000000 15.000000 20.000000 22.000000 
+17.000000 13.000000 10.000000 12.000000 21.000000 29.000000 
+31.000000 27.000000 18.000000 11.000000 10.000000 16.000000 
+28.000000 38.000000 39.000000 35.000000 32.000000 29.000000 
+24.000000 18.000000 14.000000 15.000000 20.000000 18.000000 
+14.000000 15.000000 14.000000 20.000000 36.000000 45.000000 
+39.000000 27.000000 125.000000 124.000000 118.000000 114.000000 
+117.000000 126.000000 133.000000 134.000000 124.000000 108.000000 
+98.000000 102.000000 110.000000 102.000000 71.000000 35.000000 
+17.000000 22.000000 34.000000 38.000000 36.000000 36.000000 
+42.000000 41.000000 31.000000 25.000000 20.000000 12.000000 
+10.000000 8.000000 7.000000 13.000000 20.000000 22.000000 
+24.000000 31.000000 36.000000 32.000000 20.000000 10.000000 
+16.000000 26.000000 28.000000 21.000000 14.000000 12.000000 
+14.000000 23.000000 31.000000 36.000000 36.000000 24.000000 
+12.000000 18.000000 19.000000 15.000000 23.000000 32.000000 
+32.000000 31.000000 25.000000 23.000000 31.000000 43.000000 
+51.000000 53.000000 57.000000 65.000000 69.000000 66.000000 
+60.000000 58.000000 62.000000 67.000000 61.000000 60.000000 
+121.000000 117.000000 112.000000 113.000000 116.000000 122.000000 
+129.000000 132.000000 124.000000 107.000000 93.000000 93.000000 
+98.000000 92.000000 69.000000 39.000000 13.000000 1.000000 
+9.000000 31.000000 46.000000 46.000000 44.000000 41.000000 
+32.000000 21.000000 16.000000 19.000000 18.000000 11.000000 
+4.000000 12.000000 20.000000 28.000000 37.000000 44.000000 
+42.000000 27.000000 14.000000 15.000000 23.000000 26.000000 
+22.000000 13.000000 10.000000 8.000000 11.000000 21.000000 
+33.000000 41.000000 39.000000 19.000000 9.000000 22.000000 
+22.000000 10.000000 15.000000 25.000000 33.000000 37.000000 
+38.000000 47.000000 62.000000 75.000000 82.000000 81.000000 
+81.000000 88.000000 98.000000 104.000000 102.000000 95.000000 
+89.000000 91.000000 91.000000 91.000000 113.000000 112.000000 
+112.000000 112.000000 113.000000 120.000000 128.000000 131.000000 
+125.000000 111.000000 98.000000 91.000000 87.000000 84.000000 
+76.000000 52.000000 18.000000 1.000000 1.000000 10.000000 
+31.000000 45.000000 44.000000 40.000000 36.000000 31.000000 
+29.000000 35.000000 34.000000 24.000000 10.000000 18.000000 
+30.000000 36.000000 38.000000 36.000000 29.000000 18.000000 
+18.000000 34.000000 44.000000 45.000000 36.000000 20.000000 
+12.000000 11.000000 21.000000 31.000000 32.000000 27.000000 
+22.000000 13.000000 12.000000 16.000000 18.000000 24.000000 
+34.000000 43.000000 56.000000 68.000000 73.000000 76.000000 
+84.000000 91.000000 91.000000 83.000000 79.000000 83.000000 
+91.000000 97.000000 93.000000 84.000000 84.000000 97.000000 
+106.000000 104.000000 115.000000 120.000000 122.000000 121.000000 
+121.000000 124.000000 125.000000 120.000000 112.000000 106.000000 
+104.000000 101.000000 89.000000 74.000000 69.000000 75.000000 
+98.000000 112.000000 88.000000 42.000000 21.000000 24.000000 
+31.000000 33.000000 30.000000 34.000000 40.000000 40.000000 
+41.000000 39.000000 25.000000 16.000000 23.000000 23.000000 
+22.000000 17.000000 13.000000 16.000000 21.000000 31.000000 
+50.000000 64.000000 51.000000 29.000000 16.000000 18.000000 
+45.000000 69.000000 69.000000 56.000000 48.000000 45.000000 
+31.000000 18.000000 14.000000 25.000000 43.000000 56.000000 
+70.000000 80.000000 76.000000 71.000000 77.000000 87.000000 
+87.000000 83.000000 87.000000 97.000000 101.000000 96.000000 
+86.000000 82.000000 93.000000 105.000000 106.000000 103.000000 
+112.000000 116.000000 125.000000 131.000000 128.000000 120.000000 
+116.000000 114.000000 107.000000 99.000000 98.000000 99.000000 
+86.000000 66.000000 80.000000 164.000000 274.000000 298.000000 
+217.000000 108.000000 37.000000 13.000000 23.000000 26.000000 
+26.000000 26.000000 30.000000 39.000000 45.000000 44.000000 
+36.000000 24.000000 12.000000 4.000000 8.000000 14.000000 
+18.000000 15.000000 14.000000 23.000000 29.000000 30.000000 
+17.000000 15.000000 22.000000 27.000000 53.000000 82.000000 
+126.000000 191.000000 233.000000 202.000000 109.000000 29.000000 
+7.000000 21.000000 34.000000 43.000000 67.000000 87.000000 
+79.000000 62.000000 61.000000 72.000000 75.000000 69.000000 
+69.000000 80.000000 88.000000 88.000000 93.000000 106.000000 
+112.000000 106.000000 97.000000 100.000000 113.000000 116.000000 
+124.000000 127.000000 121.000000 112.000000 110.000000 113.000000 
+112.000000 108.000000 100.000000 83.000000 62.000000 68.000000 
+137.000000 257.000000 348.000000 343.000000 250.000000 142.000000 
+64.000000 22.000000 22.000000 26.000000 26.000000 26.000000 
+28.000000 36.000000 39.000000 39.000000 41.000000 39.000000 
+27.000000 19.000000 18.000000 21.000000 23.000000 15.000000 
+14.000000 24.000000 18.000000 9.000000 6.000000 16.000000 
+36.000000 46.000000 49.000000 74.000000 167.000000 308.000000 
+381.000000 309.000000 152.000000 37.000000 16.000000 23.000000 
+16.000000 17.000000 49.000000 86.000000 92.000000 74.000000 
+63.000000 70.000000 81.000000 80.000000 74.000000 76.000000 
+86.000000 97.000000 109.000000 119.000000 118.000000 108.000000 
+100.000000 103.000000 114.000000 127.000000 133.000000 126.000000 
+118.000000 117.000000 116.000000 108.000000 103.000000 106.000000 
+104.000000 79.000000 62.000000 96.000000 190.000000 287.000000 
+330.000000 304.000000 239.000000 168.000000 98.000000 38.000000 
+13.000000 16.000000 23.000000 28.000000 28.000000 28.000000 
+33.000000 40.000000 43.000000 39.000000 33.000000 29.000000 
+25.000000 20.000000 14.000000 9.000000 6.000000 7.000000 
+12.000000 19.000000 20.000000 23.000000 37.000000 44.000000 
+39.000000 84.000000 197.000000 312.000000 341.000000 264.000000 
+150.000000 66.000000 19.000000 10.000000 8.000000 14.000000 
+52.000000 89.000000 95.000000 76.000000 65.000000 78.000000 
+99.000000 107.000000 101.000000 97.000000 102.000000 109.000000 
+111.000000 110.000000 107.000000 103.000000 100.000000 102.000000 
+108.000000 125.000000 132.000000 125.000000 118.000000 119.000000 
+116.000000 104.000000 100.000000 108.000000 109.000000 87.000000 
+72.000000 102.000000 165.000000 233.000000 273.000000 269.000000 
+229.000000 167.000000 98.000000 47.000000 22.000000 24.000000 
+36.000000 39.000000 33.000000 26.000000 24.000000 26.000000 
+29.000000 31.000000 32.000000 26.000000 15.000000 10.000000 
+12.000000 13.000000 11.000000 9.000000 10.000000 12.000000 
+16.000000 19.000000 28.000000 37.000000 47.000000 96.000000 
+178.000000 254.000000 288.000000 271.000000 214.000000 127.000000 
+38.000000 9.000000 21.000000 34.000000 52.000000 70.000000 
+75.000000 70.000000 71.000000 83.000000 99.000000 112.000000 
+117.000000 117.000000 117.000000 115.000000 111.000000 108.000000 
+107.000000 105.000000 101.000000 98.000000 116.000000 124.000000 
+124.000000 120.000000 117.000000 114.000000 105.000000 98.000000 
+104.000000 119.000000 120.000000 103.000000 88.000000 96.000000 
+109.000000 122.000000 148.000000 177.000000 178.000000 133.000000 
+69.000000 32.000000 28.000000 44.000000 55.000000 48.000000 
+37.000000 27.000000 17.000000 13.000000 16.000000 23.000000 
+27.000000 24.000000 17.000000 12.000000 13.000000 19.000000 
+20.000000 18.000000 15.000000 14.000000 18.000000 18.000000 
+24.000000 32.000000 43.000000 84.000000 147.000000 204.000000 
+239.000000 243.000000 207.000000 141.000000 63.000000 16.000000 
+27.000000 47.000000 51.000000 59.000000 72.000000 78.000000 
+80.000000 85.000000 97.000000 109.000000 114.000000 114.000000 
+113.000000 111.000000 108.000000 106.000000 107.000000 107.000000 
+104.000000 100.000000 117.000000 117.000000 115.000000 114.000000 
+114.000000 112.000000 109.000000 109.000000 114.000000 121.000000 
+122.000000 113.000000 99.000000 91.000000 90.000000 90.000000 
+92.000000 95.000000 87.000000 66.000000 40.000000 26.000000 
+26.000000 34.000000 36.000000 32.000000 24.000000 19.000000 
+19.000000 18.000000 16.000000 16.000000 16.000000 21.000000 
+26.000000 23.000000 17.000000 13.000000 11.000000 11.000000 
+18.000000 27.000000 33.000000 33.000000 31.000000 25.000000 
+27.000000 62.000000 113.000000 154.000000 172.000000 171.000000 
+154.000000 124.000000 72.000000 29.000000 36.000000 56.000000 
+56.000000 57.000000 70.000000 83.000000 86.000000 86.000000 
+90.000000 96.000000 103.000000 109.000000 112.000000 109.000000 
+106.000000 109.000000 116.000000 118.000000 112.000000 105.000000 
+114.000000 118.000000 120.000000 118.000000 115.000000 113.000000 
+113.000000 110.000000 106.000000 106.000000 111.000000 115.000000 
+107.000000 93.000000 86.000000 88.000000 86.000000 77.000000 
+65.000000 54.000000 45.000000 38.000000 32.000000 20.000000 
+11.000000 11.000000 16.000000 17.000000 19.000000 23.000000 
+31.000000 34.000000 29.000000 28.000000 32.000000 36.000000 
+28.000000 16.000000 11.000000 13.000000 18.000000 28.000000 
+40.000000 49.000000 48.000000 39.000000 32.000000 50.000000 
+80.000000 100.000000 106.000000 109.000000 113.000000 107.000000 
+80.000000 49.000000 47.000000 64.000000 75.000000 75.000000 
+74.000000 82.000000 92.000000 95.000000 92.000000 88.000000 
+92.000000 106.000000 118.000000 119.000000 112.000000 110.000000 
+114.000000 116.000000 112.000000 106.000000 115.000000 117.000000 
+117.000000 113.000000 109.000000 106.000000 105.000000 102.000000 
+100.000000 103.000000 115.000000 131.000000 129.000000 101.000000 
+79.000000 87.000000 81.000000 59.000000 44.000000 39.000000 
+39.000000 40.000000 40.000000 35.000000 30.000000 29.000000 
+32.000000 39.000000 44.000000 44.000000 41.000000 37.000000 
+34.000000 34.000000 37.000000 39.000000 37.000000 33.000000 
+28.000000 25.000000 23.000000 30.000000 46.000000 54.000000 
+45.000000 29.000000 22.000000 32.000000 52.000000 71.000000 
+86.000000 95.000000 96.000000 91.000000 79.000000 66.000000 
+58.000000 63.000000 75.000000 85.000000 87.000000 86.000000 
+88.000000 92.000000 95.000000 97.000000 101.000000 109.000000 
+119.000000 121.000000 113.000000 108.000000 112.000000 116.000000 
+111.000000 102.000000 114.000000 113.000000 109.000000 105.000000 
+105.000000 108.000000 111.000000 111.000000 111.000000 117.000000 
+125.000000 130.000000 118.000000 81.000000 52.000000 62.000000 
+72.000000 63.000000 48.000000 43.000000 43.000000 38.000000 
+35.000000 39.000000 49.000000 56.000000 55.000000 48.000000 
+49.000000 48.000000 41.000000 36.000000 33.000000 31.000000 
+29.000000 30.000000 31.000000 31.000000 30.000000 32.000000 
+34.000000 33.000000 33.000000 37.000000 36.000000 30.000000 
+24.000000 21.000000 32.000000 61.000000 92.000000 103.000000 
+93.000000 78.000000 70.000000 67.000000 66.000000 68.000000 
+75.000000 84.000000 89.000000 90.000000 88.000000 88.000000 
+92.000000 99.000000 105.000000 107.000000 109.000000 112.000000 
+113.000000 111.000000 110.000000 108.000000 105.000000 104.000000 
+115.000000 107.000000 101.000000 104.000000 113.000000 120.000000 
+119.000000 117.000000 121.000000 127.000000 121.000000 97.000000 
+63.000000 39.000000 28.000000 35.000000 55.000000 68.000000 
+70.000000 60.000000 50.000000 46.000000 46.000000 42.000000 
+36.000000 35.000000 37.000000 35.000000 32.000000 32.000000 
+37.000000 42.000000 40.000000 36.000000 36.000000 36.000000 
+32.000000 28.000000 28.000000 31.000000 33.000000 30.000000 
+25.000000 26.000000 36.000000 45.000000 44.000000 34.000000 
+28.000000 41.000000 66.000000 80.000000 75.000000 62.000000 
+57.000000 56.000000 54.000000 53.000000 61.000000 78.000000 
+92.000000 97.000000 97.000000 96.000000 97.000000 101.000000 
+107.000000 109.000000 106.000000 106.000000 112.000000 116.000000 
+112.000000 106.000000 108.000000 115.000000 113.000000 101.000000 
+97.000000 104.000000 115.000000 125.000000 134.000000 146.000000 
+151.000000 138.000000 104.000000 56.000000 32.000000 48.000000 
+66.000000 66.000000 46.000000 36.000000 47.000000 44.000000 
+36.000000 33.000000 33.000000 34.000000 33.000000 33.000000 
+29.000000 20.000000 15.000000 19.000000 24.000000 19.000000 
+13.000000 18.000000 28.000000 30.000000 33.000000 37.000000 
+41.000000 41.000000 35.000000 33.000000 32.000000 30.000000 
+32.000000 38.000000 43.000000 44.000000 43.000000 46.000000 
+55.000000 60.000000 52.000000 38.000000 35.000000 41.000000 
+43.000000 40.000000 43.000000 58.000000 80.000000 93.000000 
+95.000000 98.000000 104.000000 108.000000 108.000000 106.000000 
+105.000000 103.000000 101.000000 101.000000 103.000000 102.000000 
+99.000000 101.000000 114.000000 113.000000 115.000000 120.000000 
+131.000000 146.000000 158.000000 157.000000 132.000000 90.000000 
+45.000000 20.000000 37.000000 44.000000 24.000000 18.000000 
+11.000000 1.000000 19.000000 31.000000 31.000000 23.000000 
+15.000000 18.000000 19.000000 23.000000 25.000000 23.000000 
+20.000000 35.000000 60.000000 66.000000 56.000000 37.000000 
+25.000000 21.000000 29.000000 34.000000 27.000000 19.000000 
+13.000000 19.000000 24.000000 21.000000 19.000000 21.000000 
+26.000000 50.000000 79.000000 86.000000 68.000000 52.000000 
+47.000000 41.000000 34.000000 28.000000 24.000000 25.000000 
+34.000000 46.000000 63.000000 83.000000 93.000000 92.000000 
+90.000000 93.000000 99.000000 103.000000 105.000000 103.000000 
+96.000000 91.000000 94.000000 101.000000 104.000000 104.000000 
+109.000000 132.000000 149.000000 156.000000 156.000000 148.000000 
+127.000000 88.000000 43.000000 16.000000 8.000000 16.000000 
+31.000000 22.000000 9.000000 11.000000 20.000000 17.000000 
+12.000000 10.000000 10.000000 13.000000 10.000000 15.000000 
+19.000000 28.000000 49.000000 62.000000 48.000000 64.000000 
+140.000000 232.000000 268.000000 200.000000 92.000000 42.000000 
+58.000000 81.000000 59.000000 28.000000 20.000000 21.000000 
+27.000000 29.000000 31.000000 24.000000 4.000000 13.000000 
+47.000000 74.000000 70.000000 44.000000 31.000000 35.000000 
+35.000000 27.000000 24.000000 33.000000 47.000000 52.000000 
+52.000000 58.000000 70.000000 76.000000 76.000000 79.000000 
+87.000000 96.000000 102.000000 105.000000 107.000000 106.000000 
+107.000000 111.000000 115.000000 113.000000 69.000000 104.000000 
+136.000000 143.000000 129.000000 101.000000 66.000000 27.000000 
+2.000000 13.000000 32.000000 35.000000 29.000000 34.000000 
+38.000000 38.000000 54.000000 51.000000 35.000000 27.000000 
+30.000000 36.000000 42.000000 43.000000 44.000000 50.000000 
+62.000000 64.000000 45.000000 47.000000 137.000000 285.000000 
+373.000000 324.000000 192.000000 95.000000 76.000000 91.000000 
+90.000000 71.000000 61.000000 67.000000 69.000000 61.000000 
+46.000000 28.000000 19.000000 17.000000 34.000000 59.000000 
+66.000000 43.000000 25.000000 27.000000 25.000000 18.000000 
+23.000000 30.000000 39.000000 52.000000 59.000000 58.000000 
+59.000000 67.000000 73.000000 75.000000 79.000000 86.000000 
+96.000000 107.000000 113.000000 112.000000 108.000000 109.000000 
+111.000000 108.000000 4.000000 18.000000 34.000000 39.000000 
+29.000000 10.000000 0.000000 9.000000 13.000000 13.000000 
+18.000000 19.000000 33.000000 53.000000 65.000000 83.000000 
+89.000000 71.000000 48.000000 43.000000 48.000000 50.000000 
+50.000000 59.000000 66.000000 57.000000 36.000000 26.000000 
+37.000000 74.000000 138.000000 228.000000 293.000000 286.000000 
+212.000000 126.000000 76.000000 63.000000 69.000000 71.000000 
+71.000000 70.000000 66.000000 59.000000 49.000000 38.000000 
+33.000000 37.000000 46.000000 51.000000 46.000000 25.000000 
+9.000000 6.000000 11.000000 22.000000 28.000000 19.000000 
+24.000000 49.000000 66.000000 67.000000 63.000000 62.000000 
+66.000000 71.000000 78.000000 84.000000 87.000000 89.000000 
+95.000000 103.000000 107.000000 108.000000 111.000000 114.000000 
+16.000000 16.000000 16.000000 17.000000 19.000000 23.000000 
+21.000000 13.000000 11.000000 8.000000 6.000000 18.000000 
+33.000000 42.000000 63.000000 88.000000 94.000000 79.000000 
+61.000000 57.000000 66.000000 74.000000 72.000000 65.000000 
+60.000000 51.000000 40.000000 34.000000 41.000000 64.000000 
+104.000000 160.000000 205.000000 204.000000 150.000000 86.000000 
+54.000000 50.000000 60.000000 71.000000 79.000000 86.000000 
+88.000000 82.000000 72.000000 63.000000 61.000000 63.000000 
+59.000000 46.000000 26.000000 11.000000 8.000000 12.000000 
+11.000000 10.000000 10.000000 9.000000 10.000000 16.000000 
+20.000000 27.000000 39.000000 54.000000 67.000000 74.000000 
+74.000000 74.000000 73.000000 71.000000 71.000000 81.000000 
+98.000000 111.000000 113.000000 109.000000 12.000000 12.000000 
+16.000000 21.000000 19.000000 13.000000 11.000000 13.000000 
+12.000000 10.000000 13.000000 22.000000 31.000000 44.000000 
+70.000000 93.000000 100.000000 93.000000 83.000000 80.000000 
+82.000000 82.000000 74.000000 64.000000 60.000000 65.000000 
+66.000000 62.000000 65.000000 82.000000 99.000000 110.000000 
+111.000000 98.000000 81.000000 74.000000 70.000000 62.000000 
+53.000000 51.000000 61.000000 73.000000 75.000000 67.000000 
+66.000000 81.000000 99.000000 100.000000 76.000000 41.000000 
+15.000000 8.000000 7.000000 12.000000 15.000000 10.000000 
+5.000000 6.000000 13.000000 15.000000 13.000000 20.000000 
+36.000000 49.000000 60.000000 69.000000 74.000000 72.000000 
+64.000000 59.000000 68.000000 83.000000 97.000000 109.000000 
+110.000000 99.000000 14.000000 13.000000 9.000000 9.000000 
+10.000000 7.000000 5.000000 8.000000 14.000000 18.000000 
+22.000000 35.000000 53.000000 63.000000 70.000000 82.000000 
+85.000000 75.000000 66.000000 68.000000 74.000000 75.000000 
+73.000000 82.000000 102.000000 113.000000 106.000000 93.000000 
+91.000000 95.000000 91.000000 77.000000 65.000000 61.000000 
+62.000000 62.000000 58.000000 56.000000 56.000000 57.000000 
+57.000000 53.000000 48.000000 49.000000 61.000000 81.000000 
+97.000000 103.000000 98.000000 74.000000 32.000000 15.000000 
+11.000000 9.000000 12.000000 10.000000 9.000000 10.000000 
+11.000000 14.000000 14.000000 9.000000 12.000000 25.000000 
+40.000000 56.000000 69.000000 71.000000 61.000000 52.000000 
+57.000000 76.000000 92.000000 98.000000 94.000000 82.000000 
+6.000000 8.000000 13.000000 16.000000 12.000000 9.000000 
+11.000000 17.000000 16.000000 14.000000 27.000000 48.000000 
+53.000000 48.000000 56.000000 65.000000 58.000000 53.000000 
+60.000000 72.000000 79.000000 85.000000 94.000000 104.000000 
+110.000000 111.000000 110.000000 106.000000 97.000000 90.000000 
+88.000000 89.000000 87.000000 83.000000 84.000000 87.000000 
+85.000000 82.000000 85.000000 90.000000 85.000000 65.000000 
+46.000000 40.000000 46.000000 58.000000 77.000000 103.000000 
+114.000000 89.000000 40.000000 11.000000 7.000000 7.000000 
+9.000000 7.000000 8.000000 13.000000 15.000000 14.000000 
+12.000000 12.000000 11.000000 14.000000 27.000000 39.000000 
+49.000000 54.000000 52.000000 40.000000 30.000000 37.000000 
+57.000000 72.000000 75.000000 68.000000 11.000000 14.000000 
+15.000000 12.000000 10.000000 9.000000 10.000000 17.000000 
+21.000000 31.000000 52.000000 59.000000 58.000000 64.000000 
+71.000000 64.000000 53.000000 53.000000 67.000000 82.000000 
+94.000000 102.000000 107.000000 109.000000 109.000000 110.000000 
+112.000000 114.000000 111.000000 105.000000 100.000000 101.000000 
+103.000000 106.000000 106.000000 107.000000 107.000000 107.000000 
+106.000000 105.000000 101.000000 92.000000 78.000000 60.000000 
+51.000000 57.000000 73.000000 90.000000 96.000000 84.000000 
+55.000000 22.000000 10.000000 11.000000 9.000000 8.000000 
+11.000000 17.000000 22.000000 17.000000 10.000000 9.000000 
+9.000000 8.000000 8.000000 10.000000 18.000000 26.000000 
+27.000000 28.000000 23.000000 22.000000 49.000000 71.000000 
+73.000000 62.000000 8.000000 10.000000 11.000000 11.000000 
+13.000000 13.000000 13.000000 16.000000 28.000000 53.000000 
+70.000000 74.000000 68.000000 59.000000 50.000000 46.000000 
+50.000000 59.000000 72.000000 88.000000 105.000000 115.000000 
+115.000000 111.000000 110.000000 113.000000 113.000000 109.000000 
+106.000000 106.000000 108.000000 112.000000 114.000000 114.000000 
+111.000000 110.000000 113.000000 117.000000 117.000000 112.000000 
+109.000000 109.000000 102.000000 82.000000 58.000000 45.000000 
+50.000000 68.000000 86.000000 82.000000 50.000000 13.000000 
+8.000000 13.000000 12.000000 12.000000 12.000000 11.000000 
+12.000000 14.000000 17.000000 19.000000 20.000000 19.000000 
+21.000000 26.000000 28.000000 26.000000 16.000000 7.000000 
+14.000000 12.000000 12.000000 41.000000 58.000000 58.000000 
+9.000000 12.000000 14.000000 11.000000 8.000000 10.000000 
+14.000000 26.000000 47.000000 64.000000 73.000000 70.000000 
+58.000000 52.000000 59.000000 67.000000 67.000000 69.000000 
+81.000000 98.000000 108.000000 108.000000 104.000000 104.000000 
+104.000000 103.000000 100.000000 101.000000 106.000000 111.000000 
+110.000000 108.000000 109.000000 111.000000 113.000000 112.000000 
+110.000000 112.000000 115.000000 116.000000 113.000000 111.000000 
+109.000000 101.000000 84.000000 61.000000 48.000000 56.000000 
+76.000000 80.000000 55.000000 19.000000 6.000000 9.000000 
+20.000000 29.000000 22.000000 14.000000 13.000000 14.000000 
+15.000000 18.000000 20.000000 19.000000 13.000000 12.000000 
+15.000000 13.000000 11.000000 10.000000 10.000000 12.000000 
+14.000000 20.000000 26.000000 24.000000 13.000000 12.000000 
+10.000000 9.000000 12.000000 20.000000 27.000000 38.000000 
+55.000000 68.000000 67.000000 56.000000 50.000000 58.000000 
+68.000000 69.000000 66.000000 73.000000 92.000000 108.000000 
+113.000000 110.000000 108.000000 108.000000 105.000000 101.000000 
+98.000000 101.000000 107.000000 111.000000 111.000000 109.000000 
+107.000000 106.000000 106.000000 107.000000 109.000000 111.000000 
+111.000000 109.000000 107.000000 109.000000 114.000000 114.000000 
+101.000000 79.000000 61.000000 57.000000 64.000000 68.000000 
+57.000000 32.000000 12.000000 14.000000 23.000000 24.000000 
+16.000000 8.000000 10.000000 16.000000 15.000000 13.000000 
+14.000000 15.000000 14.000000 13.000000 12.000000 11.000000 
+11.000000 10.000000 10.000000 18.000000 22.000000 14.000000 
+8.000000 15.000000 10.000000 9.000000 7.000000 12.000000 
+28.000000 39.000000 47.000000 57.000000 65.000000 65.000000 
+61.000000 58.000000 59.000000 62.000000 64.000000 66.000000 
+75.000000 90.000000 103.000000 110.000000 111.000000 111.000000 
+110.000000 107.000000 104.000000 101.000000 100.000000 101.000000 
+103.000000 104.000000 105.000000 107.000000 109.000000 110.000000 
+111.000000 113.000000 114.000000 114.000000 114.000000 112.000000 
+110.000000 110.000000 114.000000 119.000000 114.000000 97.000000 
+73.000000 58.000000 60.000000 72.000000 74.000000 55.000000 
+25.000000 8.000000 4.000000 6.000000 10.000000 11.000000 
+11.000000 14.000000 13.000000 11.000000 10.000000 12.000000 
+14.000000 13.000000 8.000000 4.000000 4.000000 6.000000 
+11.000000 18.000000 23.000000 24.000000 20.000000 18.000000 
+13.000000 13.000000 18.000000 30.000000 43.000000 49.000000 
+49.000000 52.000000 60.000000 65.000000 64.000000 61.000000 
+56.000000 53.000000 58.000000 76.000000 96.000000 107.000000 
+109.000000 109.000000 112.000000 114.000000 112.000000 108.000000 
+105.000000 104.000000 103.000000 103.000000 103.000000 105.000000 
+107.000000 111.000000 113.000000 114.000000 114.000000 116.000000 
+115.000000 111.000000 106.000000 104.000000 106.000000 106.000000 
+103.000000 106.000000 114.000000 115.000000 99.000000 72.000000 
+56.000000 59.000000 72.000000 71.000000 49.000000 18.000000 
+5.000000 11.000000 14.000000 15.000000 17.000000 15.000000 
+9.000000 8.000000 8.000000 10.000000 13.000000 12.000000 
+9.000000 9.000000 11.000000 14.000000 14.000000 14.000000 
+15.000000 14.000000 15.000000 19.000000 8.000000 9.000000 
+14.000000 24.000000 28.000000 33.000000 49.000000 61.000000 
+59.000000 56.000000 57.000000 54.000000 50.000000 52.000000 
+66.000000 88.000000 103.000000 107.000000 109.000000 111.000000 
+112.000000 110.000000 105.000000 104.000000 107.000000 109.000000 
+108.000000 104.000000 103.000000 106.000000 111.000000 112.000000 
+112.000000 114.000000 118.000000 118.000000 113.000000 107.000000 
+106.000000 108.000000 110.000000 108.000000 105.000000 106.000000 
+112.000000 116.000000 109.000000 89.000000 68.000000 61.000000 
+69.000000 76.000000 66.000000 37.000000 11.000000 12.000000 
+20.000000 20.000000 16.000000 9.000000 6.000000 8.000000 
+10.000000 9.000000 9.000000 9.000000 11.000000 13.000000 
+14.000000 15.000000 17.000000 13.000000 7.000000 7.000000 
+11.000000 13.000000 9.000000 18.000000 27.000000 34.000000 
+42.000000 51.000000 56.000000 55.000000 55.000000 60.000000 
+63.000000 62.000000 59.000000 66.000000 84.000000 101.000000 
+110.000000 111.000000 111.000000 112.000000 113.000000 112.000000 
+108.000000 105.000000 103.000000 103.000000 102.000000 103.000000 
+108.000000 113.000000 114.000000 112.000000 109.000000 108.000000 
+108.000000 107.000000 105.000000 104.000000 106.000000 110.000000 
+112.000000 111.000000 106.000000 104.000000 107.000000 115.000000 
+114.000000 98.000000 73.000000 59.000000 62.000000 73.000000 
+76.000000 64.000000 40.000000 16.000000 10.000000 15.000000 
+16.000000 14.000000 12.000000 11.000000 9.000000 10.000000 
+10.000000 12.000000 11.000000 11.000000 14.000000 18.000000 
+16.000000 17.000000 37.000000 58.000000 58.000000 40.000000 
+13.000000 25.000000 35.000000 43.000000 50.000000 57.000000 
+60.000000 57.000000 51.000000 49.000000 51.000000 56.000000 
+66.000000 81.000000 96.000000 104.000000 104.000000 104.000000 
+105.000000 109.000000 110.000000 108.000000 106.000000 104.000000 
+103.000000 104.000000 103.000000 102.000000 101.000000 102.000000 
+105.000000 111.000000 116.000000 117.000000 111.000000 104.000000 
+103.000000 108.000000 112.000000 110.000000 106.000000 105.000000 
+105.000000 105.000000 107.000000 111.000000 115.000000 111.000000 
+95.000000 75.000000 59.000000 55.000000 63.000000 67.000000 
+56.000000 29.000000 10.000000 16.000000 22.000000 18.000000 
+15.000000 13.000000 9.000000 9.000000 11.000000 9.000000 
+9.000000 16.000000 26.000000 30.000000 22.000000 18.000000 
+60.000000 123.000000 143.000000 104.000000 15.000000 25.000000 
+25.000000 17.000000 9.000000 6.000000 6.000000 10.000000 
+17.000000 20.000000 21.000000 28.000000 36.000000 32.000000 
+21.000000 18.000000 16.000000 11.000000 8.000000 13.000000 
+14.000000 11.000000 12.000000 12.000000 13.000000 11.000000 
+12.000000 14.000000 12.000000 12.000000 12.000000 10.000000 
+10.000000 12.000000 11.000000 9.000000 8.000000 10.000000 
+9.000000 8.000000 13.000000 11.000000 5.000000 4.000000 
+6.000000 9.000000 12.000000 9.000000 6.000000 7.000000 
+9.000000 16.000000 17.000000 14.000000 26.000000 33.000000 
+31.000000 32.000000 27.000000 20.000000 40.000000 76.000000 
+102.000000 98.000000 57.000000 15.000000 17.000000 35.000000 
+35.000000 36.000000 39.000000 35.000000 31.000000 32.000000 
+37.000000 42.000000 32.000000 25.000000 18.000000 14.000000 
+13.000000 15.000000 16.000000 15.000000 16.000000 25.000000 
+31.000000 37.000000 45.000000 40.000000 23.000000 11.000000 
+13.000000 11.000000 9.000000 10.000000 10.000000 12.000000 
+14.000000 13.000000 12.000000 11.000000 14.000000 13.000000 
+11.000000 10.000000 7.000000 5.000000 7.000000 9.000000 
+10.000000 11.000000 11.000000 9.000000 6.000000 15.000000 
+21.000000 12.000000 8.000000 13.000000 13.000000 11.000000 
+8.000000 7.000000 11.000000 11.000000 9.000000 13.000000 
+17.000000 14.000000 9.000000 20.000000 31.000000 20.000000 
+13.000000 37.000000 79.000000 113.000000 116.000000 79.000000 
+27.000000 11.000000 27.000000 33.000000 34.000000 36.000000 
+27.000000 13.000000 9.000000 18.000000 30.000000 36.000000 
+74.000000 67.000000 59.000000 48.000000 35.000000 23.000000 
+14.000000 10.000000 11.000000 16.000000 27.000000 46.000000 
+58.000000 49.000000 25.000000 6.000000 28.000000 36.000000 
+26.000000 11.000000 3.000000 11.000000 13.000000 10.000000 
+10.000000 11.000000 11.000000 12.000000 10.000000 8.000000 
+9.000000 12.000000 15.000000 15.000000 14.000000 11.000000 
+7.000000 10.000000 15.000000 21.000000 18.000000 12.000000 
+9.000000 7.000000 8.000000 13.000000 15.000000 11.000000 
+10.000000 16.000000 14.000000 7.000000 18.000000 12.000000 
+17.000000 48.000000 50.000000 21.000000 17.000000 47.000000 
+93.000000 119.000000 92.000000 35.000000 11.000000 23.000000 
+27.000000 24.000000 22.000000 19.000000 17.000000 14.000000 
+13.000000 17.000000 24.000000 29.000000 103.000000 95.000000 
+84.000000 72.000000 55.000000 34.000000 22.000000 18.000000 
+15.000000 22.000000 28.000000 27.000000 44.000000 61.000000 
+40.000000 12.000000 15.000000 34.000000 37.000000 23.000000 
+6.000000 5.000000 5.000000 6.000000 9.000000 13.000000 
+16.000000 19.000000 16.000000 9.000000 7.000000 9.000000 
+9.000000 9.000000 7.000000 11.000000 14.000000 17.000000 
+23.000000 22.000000 8.000000 9.000000 8.000000 4.000000 
+5.000000 9.000000 11.000000 6.000000 7.000000 17.000000 
+20.000000 21.000000 25.000000 10.000000 31.000000 68.000000 
+55.000000 20.000000 25.000000 46.000000 59.000000 63.000000 
+35.000000 10.000000 22.000000 33.000000 26.000000 21.000000 
+20.000000 20.000000 18.000000 16.000000 14.000000 17.000000 
+25.000000 35.000000 149.000000 131.000000 106.000000 84.000000 
+73.000000 68.000000 68.000000 68.000000 63.000000 64.000000 
+75.000000 66.000000 43.000000 41.000000 51.000000 26.000000 
+16.000000 37.000000 37.000000 27.000000 16.000000 12.000000 
+11.000000 9.000000 7.000000 12.000000 14.000000 12.000000 
+10.000000 9.000000 10.000000 11.000000 12.000000 12.000000 
+9.000000 10.000000 11.000000 15.000000 22.000000 22.000000 
+14.000000 13.000000 11.000000 6.000000 8.000000 10.000000 
+7.000000 8.000000 11.000000 14.000000 14.000000 14.000000 
+15.000000 10.000000 16.000000 33.000000 29.000000 10.000000 
+18.000000 34.000000 32.000000 25.000000 14.000000 19.000000 
+36.000000 40.000000 35.000000 29.000000 25.000000 21.000000 
+14.000000 11.000000 15.000000 21.000000 25.000000 28.000000 
+125.000000 121.000000 113.000000 103.000000 96.000000 94.000000 
+93.000000 90.000000 92.000000 109.000000 142.000000 152.000000 
+108.000000 51.000000 28.000000 19.000000 14.000000 33.000000 
+34.000000 27.000000 20.000000 12.000000 10.000000 18.000000 
+21.000000 20.000000 18.000000 15.000000 14.000000 16.000000 
+14.000000 11.000000 9.000000 7.000000 9.000000 8.000000 
+7.000000 14.000000 19.000000 16.000000 13.000000 11.000000 
+12.000000 11.000000 9.000000 9.000000 8.000000 5.000000 
+6.000000 8.000000 13.000000 17.000000 15.000000 7.000000 
+9.000000 21.000000 22.000000 10.000000 12.000000 18.000000 
+16.000000 11.000000 12.000000 26.000000 41.000000 44.000000 
+38.000000 28.000000 22.000000 22.000000 22.000000 22.000000 
+21.000000 24.000000 28.000000 32.000000 111.000000 111.000000 
+116.000000 122.000000 123.000000 121.000000 117.000000 111.000000 
+114.000000 132.000000 153.000000 159.000000 135.000000 82.000000 
+29.000000 7.000000 13.000000 33.000000 37.000000 30.000000 
+22.000000 21.000000 23.000000 23.000000 21.000000 27.000000 
+30.000000 25.000000 17.000000 13.000000 11.000000 9.000000 
+11.000000 10.000000 4.000000 9.000000 10.000000 12.000000 
+14.000000 11.000000 6.000000 5.000000 7.000000 9.000000 
+7.000000 6.000000 8.000000 9.000000 9.000000 8.000000 
+15.000000 22.000000 19.000000 6.000000 15.000000 28.000000 
+16.000000 9.000000 15.000000 16.000000 10.000000 9.000000 
+17.000000 26.000000 31.000000 34.000000 33.000000 28.000000 
+21.000000 18.000000 20.000000 18.000000 14.000000 18.000000 
+30.000000 37.000000 115.000000 111.000000 122.000000 133.000000 
+135.000000 131.000000 127.000000 122.000000 113.000000 105.000000 
+107.000000 122.000000 132.000000 109.000000 57.000000 17.000000 
+25.000000 39.000000 41.000000 34.000000 26.000000 20.000000 
+18.000000 26.000000 24.000000 20.000000 25.000000 27.000000 
+18.000000 10.000000 9.000000 9.000000 13.000000 13.000000 
+9.000000 12.000000 10.000000 8.000000 11.000000 12.000000 
+12.000000 14.000000 15.000000 14.000000 10.000000 7.000000 
+8.000000 10.000000 9.000000 8.000000 9.000000 13.000000 
+15.000000 13.000000 19.000000 23.000000 11.000000 10.000000 
+18.000000 16.000000 8.000000 16.000000 34.000000 39.000000 
+32.000000 27.000000 24.000000 23.000000 23.000000 23.000000 
+24.000000 21.000000 17.000000 18.000000 24.000000 28.000000 
+123.000000 120.000000 122.000000 123.000000 117.000000 112.000000 
+113.000000 110.000000 97.000000 85.000000 93.000000 116.000000 
+129.000000 109.000000 64.000000 29.000000 23.000000 26.000000 
+24.000000 20.000000 18.000000 17.000000 12.000000 14.000000 
+23.000000 16.000000 17.000000 25.000000 22.000000 12.000000 
+11.000000 12.000000 11.000000 11.000000 12.000000 9.000000 
+10.000000 14.000000 15.000000 11.000000 12.000000 15.000000 
+21.000000 22.000000 16.000000 13.000000 14.000000 13.000000 
+9.000000 9.000000 12.000000 18.000000 16.000000 18.000000 
+24.000000 18.000000 13.000000 13.000000 14.000000 13.000000 
+13.000000 23.000000 32.000000 26.000000 24.000000 31.000000 
+36.000000 33.000000 26.000000 19.000000 17.000000 18.000000 
+18.000000 17.000000 16.000000 17.000000 129.000000 128.000000 
+127.000000 122.000000 111.000000 102.000000 100.000000 102.000000 
+98.000000 96.000000 103.000000 119.000000 123.000000 102.000000 
+61.000000 24.000000 10.000000 13.000000 17.000000 19.000000 
+18.000000 23.000000 25.000000 17.000000 14.000000 9.000000 
+12.000000 20.000000 20.000000 18.000000 20.000000 19.000000 
+12.000000 7.000000 7.000000 5.000000 10.000000 15.000000 
+14.000000 11.000000 14.000000 16.000000 16.000000 15.000000 
+12.000000 13.000000 12.000000 10.000000 7.000000 9.000000 
+20.000000 25.000000 21.000000 25.000000 24.000000 13.000000 
+14.000000 13.000000 10.000000 14.000000 16.000000 21.000000 
+21.000000 16.000000 18.000000 31.000000 41.000000 40.000000 
+33.000000 25.000000 20.000000 18.000000 18.000000 19.000000 
+20.000000 21.000000 117.000000 119.000000 123.000000 123.000000 
+117.000000 111.000000 110.000000 107.000000 97.000000 87.000000 
+88.000000 103.000000 116.000000 105.000000 69.000000 28.000000 
+7.000000 12.000000 17.000000 16.000000 14.000000 17.000000 
+23.000000 18.000000 6.000000 11.000000 22.000000 27.000000 
+24.000000 19.000000 16.000000 14.000000 8.000000 8.000000 
+9.000000 7.000000 11.000000 13.000000 10.000000 9.000000 
+8.000000 10.000000 12.000000 11.000000 12.000000 17.000000 
+14.000000 7.000000 6.000000 5.000000 15.000000 17.000000 
+20.000000 31.000000 14.000000 12.000000 25.000000 24.000000 
+24.000000 18.000000 17.000000 24.000000 18.000000 11.000000 
+12.000000 13.000000 17.000000 26.000000 32.000000 31.000000 
+23.000000 17.000000 15.000000 14.000000 16.000000 22.000000 
+121.000000 120.000000 118.000000 116.000000 118.000000 121.000000 
+121.000000 114.000000 101.000000 87.000000 83.000000 92.000000 
+103.000000 100.000000 76.000000 43.000000 18.000000 10.000000 
+8.000000 6.000000 13.000000 17.000000 13.000000 5.000000 
+11.000000 23.000000 33.000000 37.000000 24.000000 12.000000 
+16.000000 19.000000 17.000000 14.000000 11.000000 10.000000 
+9.000000 8.000000 10.000000 8.000000 10.000000 16.000000 
+20.000000 21.000000 21.000000 18.000000 12.000000 12.000000 
+18.000000 20.000000 20.000000 16.000000 24.000000 31.000000 
+12.000000 10.000000 20.000000 30.000000 36.000000 21.000000 
+17.000000 22.000000 12.000000 6.000000 6.000000 6.000000 
+7.000000 12.000000 15.000000 15.000000 15.000000 17.000000 
+17.000000 11.000000 7.000000 11.000000 132.000000 131.000000 
+127.000000 123.000000 124.000000 126.000000 124.000000 113.000000 
+99.000000 90.000000 89.000000 97.000000 109.000000 112.000000 
+94.000000 60.000000 27.000000 12.000000 11.000000 12.000000 
+10.000000 20.000000 18.000000 5.000000 19.000000 31.000000 
+27.000000 19.000000 17.000000 16.000000 24.000000 27.000000 
+22.000000 13.000000 9.000000 9.000000 7.000000 8.000000 
+15.000000 15.000000 14.000000 19.000000 22.000000 19.000000 
+16.000000 15.000000 14.000000 14.000000 15.000000 15.000000 
+24.000000 38.000000 38.000000 21.000000 10.000000 9.000000 
+19.000000 33.000000 36.000000 27.000000 18.000000 16.000000 
+22.000000 22.000000 17.000000 15.000000 18.000000 20.000000 
+17.000000 13.000000 13.000000 15.000000 16.000000 13.000000 
+11.000000 9.000000 131.000000 132.000000 133.000000 131.000000 
+125.000000 122.000000 120.000000 114.000000 101.000000 87.000000 
+83.000000 95.000000 114.000000 121.000000 102.000000 64.000000 
+31.000000 20.000000 25.000000 29.000000 20.000000 24.000000 
+28.000000 18.000000 20.000000 33.000000 27.000000 10.000000 
+13.000000 16.000000 15.000000 12.000000 11.000000 7.000000 
+6.000000 8.000000 8.000000 7.000000 12.000000 16.000000 
+14.000000 14.000000 13.000000 10.000000 11.000000 18.000000 
+20.000000 17.000000 16.000000 18.000000 27.000000 25.000000 
+22.000000 14.000000 11.000000 16.000000 25.000000 38.000000 
+43.000000 37.000000 16.000000 9.000000 17.000000 16.000000 
+11.000000 11.000000 14.000000 13.000000 11.000000 10.000000 
+14.000000 18.000000 20.000000 20.000000 17.000000 12.000000 
+134.000000 134.000000 132.000000 124.000000 116.000000 114.000000 
+120.000000 127.000000 121.000000 101.000000 85.000000 91.000000 
+112.000000 122.000000 102.000000 64.000000 36.000000 32.000000 
+38.000000 39.000000 33.000000 28.000000 27.000000 25.000000 
+25.000000 29.000000 25.000000 14.000000 15.000000 17.000000 
+10.000000 7.000000 9.000000 9.000000 6.000000 11.000000 
+15.000000 13.000000 14.000000 18.000000 19.000000 15.000000 
+12.000000 13.000000 14.000000 13.000000 13.000000 19.000000 
+29.000000 35.000000 19.000000 8.000000 13.000000 12.000000 
+11.000000 10.000000 19.000000 39.000000 51.000000 42.000000 
+22.000000 24.000000 34.000000 32.000000 26.000000 22.000000 
+21.000000 23.000000 25.000000 27.000000 30.000000 30.000000 
+32.000000 39.000000 42.000000 36.000000 132.000000 132.000000 
+128.000000 124.000000 123.000000 124.000000 125.000000 126.000000 
+122.000000 110.000000 98.000000 96.000000 109.000000 118.000000 
+101.000000 63.000000 32.000000 29.000000 40.000000 41.000000 
+32.000000 27.000000 27.000000 28.000000 32.000000 27.000000 
+19.000000 12.000000 16.000000 21.000000 19.000000 15.000000 
+10.000000 7.000000 5.000000 13.000000 21.000000 25.000000 
+25.000000 23.000000 21.000000 21.000000 22.000000 22.000000 
+20.000000 13.000000 7.000000 18.000000 32.000000 25.000000 
+11.000000 20.000000 24.000000 14.000000 9.000000 9.000000 
+24.000000 48.000000 59.000000 46.000000 31.000000 44.000000 
+69.000000 75.000000 65.000000 53.000000 55.000000 64.000000 
+69.000000 66.000000 59.000000 54.000000 55.000000 63.000000 
+65.000000 50.000000 125.000000 122.000000 120.000000 123.000000 
+129.000000 133.000000 131.000000 126.000000 119.000000 108.000000 
+97.000000 94.000000 104.000000 110.000000 94.000000 59.000000 
+28.000000 23.000000 36.000000 38.000000 31.000000 33.000000 
+38.000000 30.000000 22.000000 22.000000 16.000000 13.000000 
+14.000000 18.000000 24.000000 29.000000 27.000000 20.000000 
+17.000000 21.000000 28.000000 31.000000 24.000000 15.000000 
+11.000000 14.000000 20.000000 23.000000 22.000000 14.000000 
+10.000000 18.000000 25.000000 24.000000 28.000000 31.000000 
+27.000000 18.000000 13.000000 18.000000 34.000000 53.000000 
+66.000000 64.000000 60.000000 72.000000 90.000000 97.000000 
+97.000000 97.000000 98.000000 100.000000 100.000000 99.000000 
+98.000000 99.000000 97.000000 90.000000 76.000000 60.000000 
+123.000000 120.000000 116.000000 117.000000 125.000000 133.000000 
+135.000000 129.000000 118.000000 107.000000 99.000000 98.000000 
+103.000000 106.000000 95.000000 68.000000 37.000000 20.000000 
+27.000000 34.000000 32.000000 28.000000 30.000000 32.000000 
+25.000000 23.000000 18.000000 10.000000 8.000000 12.000000 
+26.000000 38.000000 36.000000 28.000000 29.000000 35.000000 
+36.000000 31.000000 23.000000 9.000000 5.000000 11.000000 
+15.000000 14.000000 8.000000 9.000000 18.000000 24.000000 
+29.000000 37.000000 36.000000 27.000000 20.000000 16.000000 
+15.000000 24.000000 41.000000 58.000000 73.000000 83.000000 
+90.000000 98.000000 102.000000 107.000000 115.000000 122.000000 
+121.000000 113.000000 108.000000 112.000000 121.000000 123.000000 
+114.000000 96.000000 83.000000 85.000000 122.000000 120.000000 
+118.000000 120.000000 127.000000 136.000000 138.000000 130.000000 
+115.000000 107.000000 107.000000 107.000000 102.000000 97.000000 
+91.000000 74.000000 43.000000 14.000000 10.000000 26.000000 
+40.000000 33.000000 30.000000 37.000000 36.000000 26.000000 
+16.000000 11.000000 15.000000 13.000000 12.000000 23.000000 
+30.000000 34.000000 37.000000 33.000000 26.000000 23.000000 
+18.000000 9.000000 21.000000 32.000000 23.000000 10.000000 
+4.000000 7.000000 20.000000 35.000000 50.000000 55.000000 
+45.000000 31.000000 20.000000 9.000000 15.000000 34.000000 
+45.000000 59.000000 82.000000 99.000000 104.000000 104.000000 
+104.000000 105.000000 107.000000 108.000000 108.000000 107.000000 
+110.000000 117.000000 119.000000 110.000000 94.000000 84.000000 
+88.000000 98.000000 125.000000 123.000000 123.000000 122.000000 
+124.000000 131.000000 138.000000 134.000000 118.000000 104.000000 
+99.000000 99.000000 95.000000 87.000000 81.000000 74.000000 
+51.000000 27.000000 15.000000 15.000000 34.000000 45.000000 
+38.000000 27.000000 18.000000 21.000000 23.000000 22.000000 
+17.000000 19.000000 17.000000 21.000000 30.000000 39.000000 
+33.000000 21.000000 15.000000 12.000000 12.000000 21.000000 
+46.000000 53.000000 35.000000 17.000000 19.000000 27.000000 
+38.000000 45.000000 41.000000 21.000000 5.000000 13.000000 
+27.000000 18.000000 12.000000 20.000000 30.000000 54.000000 
+89.000000 110.000000 114.000000 110.000000 106.000000 105.000000 
+104.000000 103.000000 105.000000 110.000000 115.000000 115.000000 
+106.000000 91.000000 84.000000 92.000000 104.000000 110.000000 
+127.000000 125.000000 126.000000 128.000000 125.000000 122.000000 
+123.000000 126.000000 119.000000 102.000000 87.000000 87.000000 
+90.000000 83.000000 77.000000 88.000000 112.000000 129.000000 
+110.000000 60.000000 30.000000 28.000000 27.000000 17.000000 
+10.000000 29.000000 43.000000 37.000000 21.000000 25.000000 
+27.000000 20.000000 18.000000 21.000000 16.000000 16.000000 
+17.000000 6.000000 19.000000 40.000000 58.000000 60.000000 
+39.000000 20.000000 24.000000 55.000000 86.000000 90.000000 
+92.000000 104.000000 105.000000 77.000000 40.000000 33.000000 
+21.000000 10.000000 26.000000 61.000000 92.000000 100.000000 
+92.000000 86.000000 91.000000 101.000000 103.000000 98.000000 
+97.000000 100.000000 100.000000 99.000000 102.000000 108.000000 
+112.000000 109.000000 102.000000 103.000000 121.000000 124.000000 
+131.000000 137.000000 133.000000 123.000000 120.000000 122.000000 
+114.000000 94.000000 83.000000 86.000000 83.000000 70.000000 
+75.000000 138.000000 245.000000 305.000000 258.000000 147.000000 
+57.000000 27.000000 32.000000 27.000000 20.000000 31.000000 
+42.000000 42.000000 37.000000 32.000000 24.000000 17.000000 
+13.000000 13.000000 17.000000 21.000000 19.000000 9.000000 
+20.000000 34.000000 39.000000 38.000000 29.000000 30.000000 
+42.000000 68.000000 88.000000 111.000000 201.000000 318.000000 
+336.000000 210.000000 52.000000 16.000000 32.000000 31.000000 
+39.000000 58.000000 81.000000 88.000000 78.000000 72.000000 
+84.000000 95.000000 92.000000 83.000000 85.000000 94.000000 
+100.000000 105.000000 115.000000 123.000000 117.000000 102.000000 
+95.000000 101.000000 119.000000 127.000000 133.000000 133.000000 
+128.000000 125.000000 124.000000 119.000000 108.000000 101.000000 
+102.000000 91.000000 67.000000 65.000000 115.000000 227.000000 
+348.000000 386.000000 314.000000 191.000000 91.000000 41.000000 
+40.000000 44.000000 29.000000 25.000000 35.000000 42.000000 
+38.000000 35.000000 39.000000 36.000000 26.000000 18.000000 
+18.000000 20.000000 19.000000 18.000000 20.000000 24.000000 
+24.000000 21.000000 23.000000 41.000000 61.000000 63.000000 
+53.000000 105.000000 243.000000 354.000000 335.000000 209.000000 
+77.000000 12.000000 15.000000 33.000000 52.000000 72.000000 
+84.000000 85.000000 79.000000 79.000000 87.000000 91.000000 
+88.000000 89.000000 94.000000 102.000000 109.000000 111.000000 
+114.000000 115.000000 110.000000 103.000000 102.000000 107.000000 
+122.000000 128.000000 128.000000 123.000000 121.000000 124.000000 
+122.000000 109.000000 102.000000 112.000000 120.000000 97.000000 
+65.000000 77.000000 155.000000 275.000000 360.000000 363.000000 
+296.000000 206.000000 124.000000 61.000000 38.000000 44.000000 
+50.000000 49.000000 50.000000 53.000000 47.000000 42.000000 
+44.000000 46.000000 42.000000 30.000000 16.000000 8.000000 
+12.000000 14.000000 17.000000 24.000000 24.000000 18.000000 
+17.000000 26.000000 43.000000 43.000000 61.000000 150.000000 
+255.000000 302.000000 277.000000 214.000000 136.000000 47.000000 
+9.000000 29.000000 68.000000 94.000000 95.000000 85.000000 
+80.000000 84.000000 87.000000 88.000000 92.000000 100.000000 
+107.000000 112.000000 115.000000 112.000000 107.000000 106.000000 
+111.000000 113.000000 111.000000 109.000000 124.000000 132.000000 
+129.000000 121.000000 120.000000 125.000000 120.000000 102.000000 
+92.000000 107.000000 123.000000 109.000000 81.000000 81.000000 
+125.000000 209.000000 286.000000 316.000000 293.000000 222.000000 
+132.000000 67.000000 37.000000 35.000000 48.000000 57.000000 
+55.000000 43.000000 33.000000 31.000000 37.000000 40.000000 
+36.000000 27.000000 17.000000 10.000000 12.000000 9.000000 
+8.000000 13.000000 9.000000 9.000000 16.000000 22.000000 
+32.000000 41.000000 75.000000 144.000000 218.000000 266.000000 
+278.000000 241.000000 156.000000 63.000000 21.000000 44.000000 
+81.000000 92.000000 83.000000 79.000000 82.000000 85.000000 
+83.000000 79.000000 83.000000 95.000000 107.000000 113.000000 
+113.000000 111.000000 108.000000 106.000000 104.000000 103.000000 
+105.000000 108.000000 127.000000 131.000000 128.000000 122.000000 
+121.000000 122.000000 116.000000 103.000000 99.000000 112.000000 
+126.000000 122.000000 104.000000 90.000000 86.000000 101.000000 
+145.000000 202.000000 222.000000 171.000000 87.000000 38.000000 
+35.000000 46.000000 48.000000 37.000000 32.000000 27.000000 
+20.000000 14.000000 16.000000 20.000000 21.000000 25.000000 
+28.000000 27.000000 24.000000 17.000000 9.000000 8.000000 
+8.000000 16.000000 22.000000 19.000000 21.000000 35.000000 
+63.000000 110.000000 163.000000 207.000000 226.000000 204.000000 
+141.000000 70.000000 36.000000 60.000000 101.000000 110.000000 
+91.000000 77.000000 82.000000 91.000000 91.000000 84.000000 
+83.000000 91.000000 101.000000 107.000000 109.000000 110.000000 
+112.000000 113.000000 111.000000 107.000000 104.000000 108.000000 
+124.000000 123.000000 123.000000 122.000000 117.000000 111.000000 
+107.000000 106.000000 110.000000 118.000000 127.000000 129.000000 
+117.000000 93.000000 72.000000 69.000000 88.000000 112.000000 
+105.000000 66.000000 27.000000 21.000000 37.000000 51.000000 
+51.000000 42.000000 33.000000 30.000000 26.000000 18.000000 
+13.000000 18.000000 26.000000 38.000000 41.000000 31.000000 
+20.000000 13.000000 7.000000 11.000000 18.000000 24.000000 
+31.000000 23.000000 22.000000 31.000000 46.000000 82.000000 
+121.000000 139.000000 136.000000 121.000000 99.000000 73.000000 
+49.000000 56.000000 87.000000 105.000000 100.000000 90.000000 
+88.000000 93.000000 97.000000 99.000000 99.000000 98.000000 
+100.000000 108.000000 114.000000 115.000000 113.000000 115.000000 
+119.000000 120.000000 116.000000 114.000000 124.000000 123.000000 
+124.000000 124.000000 120.000000 112.000000 109.000000 115.000000 
+123.000000 126.000000 126.000000 128.000000 124.000000 107.000000 
+89.000000 92.000000 100.000000 97.000000 78.000000 46.000000 
+22.000000 22.000000 35.000000 39.000000 31.000000 25.000000 
+25.000000 26.000000 24.000000 19.000000 15.000000 16.000000 
+26.000000 34.000000 34.000000 24.000000 15.000000 14.000000 
+16.000000 16.000000 19.000000 27.000000 37.000000 38.000000 
+27.000000 21.000000 27.000000 53.000000 85.000000 106.000000 
+112.000000 106.000000 92.000000 72.000000 55.000000 54.000000 
+70.000000 87.000000 93.000000 89.000000 85.000000 88.000000 
+98.000000 106.000000 107.000000 104.000000 104.000000 110.000000 
+116.000000 116.000000 111.000000 108.000000 112.000000 115.000000 
+114.000000 110.000000 124.000000 126.000000 123.000000 115.000000 
+109.000000 107.000000 109.000000 112.000000 117.000000 125.000000 
+134.000000 140.000000 140.000000 130.000000 115.000000 102.000000 
+83.000000 62.000000 49.000000 41.000000 35.000000 33.000000 
+39.000000 42.000000 36.000000 28.000000 30.000000 37.000000 
+41.000000 37.000000 28.000000 23.000000 25.000000 30.000000 
+33.000000 33.000000 31.000000 30.000000 30.000000 30.000000 
+31.000000 34.000000 39.000000 39.000000 31.000000 20.000000 
+20.000000 34.000000 61.000000 93.000000 115.000000 113.000000 
+92.000000 70.000000 59.000000 58.000000 68.000000 84.000000 
+93.000000 94.000000 91.000000 92.000000 97.000000 102.000000 
+103.000000 102.000000 103.000000 107.000000 111.000000 111.000000 
+106.000000 104.000000 111.000000 118.000000 117.000000 108.000000 
+117.000000 116.000000 111.000000 103.000000 100.000000 105.000000 
+111.000000 113.000000 116.000000 126.000000 140.000000 146.000000 
+141.000000 125.000000 99.000000 72.000000 65.000000 57.000000 
+43.000000 45.000000 56.000000 53.000000 49.000000 47.000000 
+51.000000 61.000000 64.000000 57.000000 51.000000 53.000000 
+55.000000 49.000000 38.000000 37.000000 43.000000 47.000000 
+39.000000 29.000000 29.000000 38.000000 46.000000 44.000000 
+43.000000 47.000000 50.000000 40.000000 24.000000 21.000000 
+37.000000 63.000000 86.000000 87.000000 66.000000 47.000000 
+45.000000 55.000000 68.000000 82.000000 96.000000 104.000000 
+101.000000 96.000000 97.000000 101.000000 105.000000 107.000000 
+111.000000 115.000000 117.000000 115.000000 111.000000 112.000000 
+115.000000 114.000000 107.000000 100.000000 119.000000 113.000000 
+108.000000 107.000000 110.000000 115.000000 117.000000 119.000000 
+127.000000 139.000000 148.000000 145.000000 121.000000 77.000000 
+38.000000 25.000000 49.000000 58.000000 53.000000 47.000000 
+43.000000 42.000000 49.000000 53.000000 52.000000 50.000000 
+47.000000 39.000000 35.000000 39.000000 41.000000 35.000000 
+29.000000 29.000000 34.000000 36.000000 32.000000 32.000000 
+40.000000 43.000000 37.000000 28.000000 25.000000 30.000000 
+37.000000 39.000000 32.000000 26.000000 22.000000 32.000000 
+53.000000 58.000000 41.000000 27.000000 39.000000 66.000000 
+82.000000 84.000000 89.000000 105.000000 113.000000 106.000000 
+94.000000 91.000000 96.000000 102.000000 106.000000 108.000000 
+112.000000 116.000000 118.000000 116.000000 113.000000 113.000000 
+113.000000 112.000000 122.000000 109.000000 99.000000 103.000000 
+115.000000 122.000000 123.000000 129.000000 143.000000 147.000000 
+126.000000 88.000000 48.000000 29.000000 40.000000 55.000000 
+47.000000 35.000000 26.000000 25.000000 30.000000 27.000000 
+21.000000 26.000000 33.000000 39.000000 37.000000 30.000000 
+32.000000 44.000000 46.000000 36.000000 23.000000 15.000000 
+17.000000 21.000000 29.000000 37.000000 43.000000 48.000000 
+42.000000 35.000000 26.000000 19.000000 19.000000 28.000000 
+34.000000 31.000000 29.000000 39.000000 52.000000 49.000000 
+29.000000 19.000000 31.000000 50.000000 68.000000 85.000000 
+97.000000 104.000000 108.000000 103.000000 95.000000 95.000000 
+98.000000 100.000000 104.000000 112.000000 118.000000 116.000000 
+112.000000 112.000000 113.000000 112.000000 108.000000 105.000000 
+114.000000 107.000000 106.000000 119.000000 140.000000 154.000000 
+153.000000 138.000000 117.000000 88.000000 52.000000 21.000000 
+17.000000 37.000000 37.000000 22.000000 17.000000 21.000000 
+15.000000 6.000000 14.000000 11.000000 11.000000 23.000000 
+31.000000 43.000000 43.000000 31.000000 31.000000 75.000000 
+130.000000 174.000000 165.000000 95.000000 34.000000 24.000000 
+54.000000 60.000000 35.000000 31.000000 33.000000 36.000000 
+29.000000 17.000000 12.000000 16.000000 20.000000 17.000000 
+26.000000 49.000000 65.000000 59.000000 37.000000 18.000000 
+17.000000 26.000000 48.000000 82.000000 107.000000 113.000000 
+113.000000 111.000000 104.000000 101.000000 103.000000 106.000000 
+105.000000 106.000000 111.000000 112.000000 107.000000 103.000000 
+104.000000 106.000000 103.000000 100.000000 105.000000 113.000000 
+123.000000 141.000000 162.000000 166.000000 138.000000 90.000000 
+44.000000 13.000000 4.000000 11.000000 20.000000 29.000000 
+28.000000 28.000000 41.000000 48.000000 42.000000 30.000000 
+17.000000 15.000000 22.000000 28.000000 31.000000 44.000000 
+63.000000 60.000000 40.000000 85.000000 208.000000 342.000000 
+374.000000 267.000000 121.000000 57.000000 74.000000 100.000000 
+82.000000 45.000000 35.000000 38.000000 30.000000 28.000000 
+31.000000 36.000000 36.000000 33.000000 45.000000 60.000000 
+60.000000 50.000000 40.000000 28.000000 22.000000 34.000000 
+44.000000 61.000000 94.000000 114.000000 118.000000 117.000000 
+113.000000 102.000000 99.000000 106.000000 114.000000 113.000000 
+113.000000 117.000000 115.000000 105.000000 96.000000 98.000000 
+104.000000 105.000000 100.000000 114.000000 130.000000 137.000000 
+126.000000 92.000000 47.000000 22.000000 23.000000 19.000000 
+9.000000 13.000000 22.000000 33.000000 41.000000 61.000000 
+78.000000 72.000000 57.000000 44.000000 36.000000 34.000000 
+43.000000 60.000000 71.000000 64.000000 51.000000 42.000000 
+47.000000 76.000000 183.000000 315.000000 370.000000 304.000000 
+171.000000 78.000000 55.000000 65.000000 72.000000 66.000000 
+66.000000 71.000000 68.000000 62.000000 54.000000 47.000000 
+40.000000 38.000000 52.000000 62.000000 54.000000 40.000000 
+30.000000 22.000000 21.000000 35.000000 47.000000 50.000000 
+64.000000 91.000000 108.000000 111.000000 111.000000 109.000000 
+102.000000 97.000000 105.000000 116.000000 122.000000 122.000000 
+121.000000 118.000000 111.000000 104.000000 102.000000 103.000000 
+52.000000 53.000000 60.000000 57.000000 42.000000 22.000000 
+8.000000 4.000000 6.000000 18.000000 24.000000 28.000000 
+38.000000 44.000000 64.000000 89.000000 84.000000 60.000000 
+46.000000 52.000000 66.000000 73.000000 72.000000 69.000000 
+61.000000 45.000000 31.000000 34.000000 52.000000 91.000000 
+157.000000 231.000000 267.000000 233.000000 153.000000 85.000000 
+61.000000 64.000000 72.000000 71.000000 68.000000 73.000000 
+78.000000 77.000000 70.000000 70.000000 82.000000 92.000000 
+84.000000 56.000000 30.000000 23.000000 26.000000 20.000000 
+14.000000 27.000000 43.000000 40.000000 30.000000 49.000000 
+88.000000 106.000000 97.000000 83.000000 77.000000 79.000000 
+89.000000 102.000000 115.000000 120.000000 118.000000 118.000000 
+117.000000 110.000000 98.000000 92.000000 28.000000 15.000000 
+16.000000 26.000000 23.000000 7.000000 5.000000 14.000000 
+15.000000 18.000000 25.000000 31.000000 24.000000 27.000000 
+70.000000 103.000000 106.000000 90.000000 72.000000 68.000000 
+79.000000 89.000000 83.000000 68.000000 55.000000 48.000000 
+46.000000 46.000000 55.000000 81.000000 118.000000 147.000000 
+150.000000 122.000000 91.000000 80.000000 73.000000 65.000000 
+58.000000 58.000000 72.000000 90.000000 93.000000 82.000000 
+76.000000 87.000000 107.000000 116.000000 102.000000 72.000000 
+42.000000 20.000000 9.000000 9.000000 6.000000 5.000000 
+15.000000 25.000000 14.000000 11.000000 38.000000 61.000000 
+61.000000 50.000000 48.000000 59.000000 72.000000 84.000000 
+98.000000 112.000000 119.000000 119.000000 116.000000 112.000000 
+105.000000 96.000000 11.000000 15.000000 16.000000 12.000000 
+11.000000 9.000000 10.000000 13.000000 21.000000 30.000000 
+27.000000 12.000000 11.000000 41.000000 74.000000 98.000000 
+105.000000 97.000000 90.000000 93.000000 97.000000 87.000000 
+68.000000 55.000000 58.000000 68.000000 68.000000 59.000000 
+63.000000 83.000000 97.000000 93.000000 79.000000 69.000000 
+72.000000 77.000000 74.000000 64.000000 57.000000 62.000000 
+74.000000 84.000000 80.000000 71.000000 73.000000 92.000000 
+118.000000 128.000000 109.000000 69.000000 29.000000 13.000000 
+16.000000 19.000000 12.000000 7.000000 10.000000 6.000000 
+5.000000 4.000000 3.000000 11.000000 21.000000 16.000000 
+8.000000 19.000000 45.000000 71.000000 85.000000 91.000000 
+100.000000 110.000000 116.000000 117.000000 114.000000 105.000000 
+8.000000 14.000000 20.000000 22.000000 18.000000 15.000000 
+14.000000 11.000000 10.000000 14.000000 12.000000 12.000000 
+39.000000 68.000000 76.000000 72.000000 67.000000 69.000000 
+73.000000 73.000000 72.000000 72.000000 81.000000 99.000000 
+113.000000 113.000000 103.000000 90.000000 89.000000 94.000000 
+96.000000 90.000000 81.000000 80.000000 87.000000 93.000000 
+94.000000 91.000000 89.000000 84.000000 74.000000 62.000000 
+52.000000 49.000000 53.000000 65.000000 82.000000 98.000000 
+103.000000 86.000000 50.000000 19.000000 9.000000 15.000000 
+16.000000 9.000000 12.000000 16.000000 10.000000 9.000000 
+12.000000 10.000000 13.000000 15.000000 8.000000 6.000000 
+17.000000 34.000000 59.000000 82.000000 93.000000 103.000000 
+118.000000 123.000000 110.000000 92.000000 13.000000 13.000000 
+17.000000 25.000000 27.000000 22.000000 18.000000 16.000000 
+15.000000 12.000000 9.000000 31.000000 68.000000 86.000000 
+81.000000 70.000000 68.000000 73.000000 75.000000 75.000000 
+82.000000 99.000000 118.000000 128.000000 125.000000 117.000000 
+111.000000 110.000000 111.000000 112.000000 113.000000 114.000000 
+112.000000 109.000000 109.000000 113.000000 119.000000 122.000000 
+120.000000 112.000000 100.000000 86.000000 74.000000 62.000000 
+51.000000 52.000000 67.000000 94.000000 110.000000 94.000000 
+53.000000 23.000000 15.000000 20.000000 23.000000 19.000000 
+17.000000 17.000000 14.000000 11.000000 11.000000 14.000000 
+17.000000 15.000000 11.000000 13.000000 18.000000 11.000000 
+13.000000 46.000000 82.000000 105.000000 118.000000 126.000000 
+116.000000 89.000000 20.000000 23.000000 21.000000 22.000000 
+20.000000 12.000000 6.000000 8.000000 9.000000 8.000000 
+16.000000 48.000000 74.000000 79.000000 68.000000 52.000000 
+43.000000 53.000000 80.000000 113.000000 130.000000 126.000000 
+112.000000 102.000000 104.000000 114.000000 121.000000 121.000000 
+116.000000 110.000000 110.000000 113.000000 115.000000 115.000000 
+116.000000 121.000000 126.000000 124.000000 116.000000 111.000000 
+115.000000 120.000000 113.000000 88.000000 58.000000 43.000000 
+52.000000 76.000000 93.000000 86.000000 60.000000 28.000000 
+15.000000 14.000000 11.000000 10.000000 10.000000 10.000000 
+10.000000 12.000000 13.000000 7.000000 6.000000 12.000000 
+17.000000 21.000000 23.000000 22.000000 14.000000 5.000000 
+23.000000 67.000000 108.000000 123.000000 113.000000 89.000000 
+14.000000 15.000000 13.000000 9.000000 8.000000 12.000000 
+20.000000 18.000000 17.000000 32.000000 50.000000 62.000000 
+65.000000 58.000000 49.000000 46.000000 49.000000 62.000000 
+84.000000 104.000000 112.000000 109.000000 105.000000 106.000000 
+109.000000 110.000000 107.000000 103.000000 102.000000 107.000000 
+115.000000 119.000000 117.000000 115.000000 115.000000 117.000000 
+118.000000 116.000000 114.000000 116.000000 121.000000 127.000000 
+127.000000 110.000000 82.000000 58.000000 50.000000 60.000000 
+79.000000 85.000000 62.000000 21.000000 5.000000 5.000000 
+15.000000 24.000000 18.000000 10.000000 9.000000 9.000000 
+8.000000 8.000000 12.000000 16.000000 15.000000 9.000000 
+8.000000 14.000000 20.000000 21.000000 10.000000 6.000000 
+53.000000 94.000000 98.000000 75.000000 7.000000 11.000000 
+9.000000 6.000000 8.000000 16.000000 19.000000 22.000000 
+41.000000 61.000000 61.000000 49.000000 41.000000 46.000000 
+56.000000 58.000000 58.000000 69.000000 91.000000 109.000000 
+114.000000 111.000000 110.000000 110.000000 109.000000 108.000000 
+109.000000 112.000000 112.000000 114.000000 116.000000 119.000000 
+119.000000 118.000000 117.000000 117.000000 116.000000 115.000000 
+115.000000 115.000000 111.000000 108.000000 111.000000 114.000000 
+103.000000 78.000000 55.000000 48.000000 60.000000 65.000000 
+48.000000 19.000000 12.000000 12.000000 18.000000 29.000000 
+29.000000 15.000000 7.000000 9.000000 10.000000 12.000000 
+12.000000 9.000000 12.000000 14.000000 11.000000 13.000000 
+23.000000 19.000000 16.000000 22.000000 12.000000 22.000000 
+43.000000 44.000000 14.000000 13.000000 10.000000 8.000000 
+12.000000 17.000000 26.000000 42.000000 57.000000 60.000000 
+52.000000 44.000000 44.000000 49.000000 56.000000 62.000000 
+70.000000 85.000000 101.000000 113.000000 117.000000 118.000000 
+118.000000 119.000000 116.000000 109.000000 103.000000 101.000000 
+102.000000 108.000000 113.000000 114.000000 111.000000 109.000000 
+114.000000 118.000000 116.000000 108.000000 103.000000 106.000000 
+112.000000 116.000000 120.000000 124.000000 117.000000 96.000000 
+71.000000 60.000000 64.000000 69.000000 58.000000 34.000000 
+16.000000 6.000000 13.000000 29.000000 33.000000 24.000000 
+17.000000 12.000000 8.000000 6.000000 7.000000 12.000000 
+12.000000 10.000000 7.000000 7.000000 6.000000 5.000000 
+12.000000 22.000000 23.000000 13.000000 10.000000 21.000000 
+11.000000 8.000000 6.000000 10.000000 18.000000 26.000000 
+34.000000 42.000000 49.000000 53.000000 53.000000 49.000000 
+45.000000 46.000000 55.000000 69.000000 87.000000 104.000000 
+114.000000 116.000000 114.000000 114.000000 115.000000 114.000000 
+111.000000 106.000000 102.000000 101.000000 103.000000 108.000000 
+111.000000 113.000000 112.000000 111.000000 111.000000 111.000000 
+109.000000 107.000000 107.000000 109.000000 113.000000 116.000000 
+119.000000 123.000000 124.000000 116.000000 98.000000 77.000000 
+66.000000 66.000000 65.000000 50.000000 30.000000 20.000000 
+14.000000 11.000000 11.000000 10.000000 7.000000 8.000000 
+12.000000 13.000000 12.000000 13.000000 12.000000 8.000000 
+7.000000 9.000000 7.000000 10.000000 17.000000 20.000000 
+22.000000 22.000000 16.000000 9.000000 12.000000 9.000000 
+7.000000 10.000000 21.000000 35.000000 44.000000 49.000000 
+54.000000 57.000000 55.000000 51.000000 50.000000 53.000000 
+63.000000 79.000000 97.000000 108.000000 109.000000 106.000000 
+110.000000 115.000000 117.000000 113.000000 109.000000 108.000000 
+109.000000 111.000000 111.000000 111.000000 110.000000 112.000000 
+117.000000 121.000000 119.000000 114.000000 111.000000 110.000000 
+108.000000 103.000000 102.000000 106.000000 113.000000 119.000000 
+122.000000 120.000000 110.000000 95.000000 81.000000 75.000000 
+73.000000 64.000000 45.000000 22.000000 9.000000 9.000000 
+12.000000 11.000000 10.000000 11.000000 10.000000 9.000000 
+7.000000 9.000000 11.000000 9.000000 7.000000 7.000000 
+8.000000 11.000000 13.000000 14.000000 14.000000 17.000000 
+19.000000 14.000000 11.000000 12.000000 17.000000 25.000000 
+33.000000 42.000000 49.000000 52.000000 54.000000 55.000000 
+53.000000 51.000000 50.000000 57.000000 78.000000 102.000000 
+116.000000 116.000000 111.000000 111.000000 115.000000 116.000000 
+112.000000 110.000000 112.000000 113.000000 110.000000 104.000000 
+101.000000 105.000000 110.000000 112.000000 113.000000 113.000000 
+112.000000 108.000000 104.000000 104.000000 107.000000 110.000000 
+111.000000 111.000000 112.000000 113.000000 116.000000 118.000000 
+115.000000 103.000000 83.000000 66.000000 63.000000 69.000000 
+68.000000 48.000000 18.000000 7.000000 9.000000 9.000000 
+12.000000 12.000000 8.000000 4.000000 6.000000 8.000000 
+9.000000 8.000000 5.000000 7.000000 10.000000 11.000000 
+11.000000 11.000000 13.000000 17.000000 18.000000 16.000000 
+14.000000 13.000000 11.000000 15.000000 28.000000 38.000000 
+40.000000 38.000000 43.000000 53.000000 58.000000 56.000000 
+55.000000 67.000000 90.000000 108.000000 115.000000 115.000000 
+115.000000 116.000000 115.000000 110.000000 105.000000 101.000000 
+101.000000 104.000000 107.000000 107.000000 107.000000 109.000000 
+112.000000 116.000000 116.000000 114.000000 111.000000 106.000000 
+101.000000 103.000000 109.000000 114.000000 112.000000 110.000000 
+111.000000 114.000000 115.000000 115.000000 116.000000 114.000000 
+99.000000 75.000000 59.000000 62.000000 72.000000 66.000000 
+39.000000 12.000000 7.000000 10.000000 10.000000 14.000000 
+15.000000 11.000000 8.000000 9.000000 9.000000 7.000000 
+10.000000 13.000000 11.000000 11.000000 13.000000 14.000000 
+20.000000 32.000000 36.000000 23.000000 13.000000 13.000000 
+7.000000 9.000000 23.000000 34.000000 40.000000 45.000000 
+54.000000 61.000000 62.000000 58.000000 61.000000 77.000000 
+99.000000 114.000000 118.000000 112.000000 105.000000 103.000000 
+106.000000 111.000000 111.000000 107.000000 102.000000 102.000000 
+106.000000 110.000000 111.000000 112.000000 114.000000 118.000000 
+121.000000 118.000000 112.000000 104.000000 100.000000 103.000000 
+110.000000 115.000000 114.000000 109.000000 106.000000 103.000000 
+101.000000 103.000000 110.000000 118.000000 113.000000 93.000000 
+71.000000 60.000000 64.000000 68.000000 57.000000 32.000000 
+9.000000 9.000000 13.000000 11.000000 11.000000 9.000000 
+7.000000 7.000000 9.000000 10.000000 10.000000 7.000000 
+7.000000 13.000000 17.000000 18.000000 48.000000 94.000000 
+106.000000 77.000000 98.000000 91.000000 70.000000 51.000000 
+41.000000 32.000000 22.000000 14.000000 9.000000 17.000000 
+28.000000 20.000000 11.000000 11.000000 14.000000 16.000000 
+13.000000 12.000000 12.000000 10.000000 9.000000 9.000000 
+11.000000 10.000000 8.000000 7.000000 10.000000 15.000000 
+15.000000 10.000000 8.000000 9.000000 12.000000 13.000000 
+13.000000 14.000000 14.000000 13.000000 10.000000 14.000000 
+20.000000 21.000000 13.000000 7.000000 5.000000 8.000000 
+8.000000 8.000000 8.000000 6.000000 3.000000 5.000000 
+9.000000 17.000000 28.000000 34.000000 37.000000 37.000000 
+34.000000 31.000000 42.000000 71.000000 94.000000 81.000000 
+32.000000 12.000000 34.000000 38.000000 25.000000 21.000000 
+26.000000 28.000000 30.000000 25.000000 16.000000 16.000000 
+130.000000 129.000000 112.000000 88.000000 74.000000 65.000000 
+51.000000 37.000000 24.000000 11.000000 6.000000 11.000000 
+8.000000 5.000000 8.000000 13.000000 14.000000 14.000000 
+11.000000 10.000000 9.000000 7.000000 9.000000 9.000000 
+10.000000 13.000000 14.000000 14.000000 12.000000 7.000000 
+9.000000 11.000000 10.000000 8.000000 11.000000 13.000000 
+15.000000 11.000000 6.000000 14.000000 20.000000 22.000000 
+19.000000 13.000000 9.000000 7.000000 5.000000 4.000000 
+11.000000 17.000000 14.000000 9.000000 10.000000 17.000000 
+27.000000 33.000000 30.000000 23.000000 28.000000 52.000000 
+89.000000 115.000000 107.000000 64.000000 21.000000 20.000000 
+32.000000 25.000000 24.000000 35.000000 40.000000 29.000000 
+20.000000 22.000000 25.000000 22.000000 141.000000 145.000000 
+138.000000 116.000000 91.000000 76.000000 73.000000 74.000000 
+67.000000 45.000000 22.000000 9.000000 7.000000 17.000000 
+15.000000 11.000000 11.000000 14.000000 10.000000 6.000000 
+4.000000 6.000000 7.000000 5.000000 9.000000 16.000000 
+17.000000 13.000000 9.000000 8.000000 10.000000 8.000000 
+5.000000 4.000000 6.000000 10.000000 13.000000 12.000000 
+15.000000 17.000000 14.000000 14.000000 15.000000 13.000000 
+11.000000 9.000000 8.000000 8.000000 4.000000 11.000000 
+18.000000 15.000000 11.000000 16.000000 27.000000 29.000000 
+15.000000 13.000000 22.000000 60.000000 118.000000 140.000000 
+107.000000 42.000000 15.000000 30.000000 30.000000 22.000000 
+21.000000 27.000000 35.000000 37.000000 31.000000 24.000000 
+18.000000 14.000000 126.000000 129.000000 133.000000 133.000000 
+124.000000 112.000000 106.000000 107.000000 108.000000 99.000000 
+74.000000 35.000000 7.000000 8.000000 14.000000 9.000000 
+8.000000 19.000000 28.000000 27.000000 19.000000 13.000000 
+10.000000 6.000000 8.000000 12.000000 16.000000 19.000000 
+15.000000 10.000000 8.000000 6.000000 5.000000 5.000000 
+5.000000 7.000000 12.000000 14.000000 14.000000 14.000000 
+10.000000 6.000000 7.000000 9.000000 8.000000 7.000000 
+8.000000 8.000000 5.000000 12.000000 19.000000 18.000000 
+14.000000 19.000000 30.000000 30.000000 21.000000 17.000000 
+23.000000 58.000000 102.000000 104.000000 59.000000 18.000000 
+16.000000 24.000000 24.000000 28.000000 32.000000 33.000000 
+31.000000 27.000000 23.000000 20.000000 18.000000 23.000000 
+128.000000 125.000000 122.000000 120.000000 117.000000 110.000000 
+107.000000 117.000000 130.000000 119.000000 87.000000 65.000000 
+50.000000 23.000000 6.000000 9.000000 10.000000 15.000000 
+25.000000 32.000000 27.000000 20.000000 14.000000 11.000000 
+17.000000 20.000000 19.000000 15.000000 12.000000 6.000000 
+4.000000 5.000000 6.000000 7.000000 4.000000 7.000000 
+9.000000 12.000000 15.000000 14.000000 9.000000 10.000000 
+12.000000 14.000000 11.000000 6.000000 5.000000 4.000000 
+7.000000 11.000000 13.000000 12.000000 14.000000 20.000000 
+20.000000 14.000000 13.000000 20.000000 33.000000 56.000000 
+77.000000 70.000000 24.000000 10.000000 35.000000 40.000000 
+32.000000 26.000000 32.000000 40.000000 39.000000 31.000000 
+22.000000 20.000000 24.000000 31.000000 136.000000 138.000000 
+130.000000 116.000000 109.000000 110.000000 116.000000 121.000000 
+121.000000 113.000000 109.000000 117.000000 110.000000 67.000000 
+24.000000 14.000000 18.000000 20.000000 22.000000 23.000000 
+23.000000 17.000000 8.000000 18.000000 30.000000 30.000000 
+21.000000 15.000000 12.000000 11.000000 10.000000 10.000000 
+9.000000 7.000000 4.000000 12.000000 12.000000 8.000000 
+12.000000 14.000000 12.000000 11.000000 11.000000 12.000000 
+10.000000 7.000000 6.000000 9.000000 11.000000 9.000000 
+11.000000 15.000000 18.000000 11.000000 7.000000 9.000000 
+16.000000 29.000000 45.000000 61.000000 71.000000 59.000000 
+24.000000 13.000000 34.000000 45.000000 38.000000 23.000000 
+19.000000 26.000000 34.000000 34.000000 27.000000 22.000000 
+25.000000 28.000000 131.000000 138.000000 137.000000 127.000000 
+115.000000 113.000000 115.000000 107.000000 94.000000 91.000000 
+107.000000 128.000000 127.000000 95.000000 50.000000 21.000000 
+20.000000 28.000000 28.000000 23.000000 17.000000 13.000000 
+8.000000 12.000000 20.000000 23.000000 21.000000 15.000000 
+10.000000 14.000000 14.000000 13.000000 14.000000 12.000000 
+8.000000 11.000000 11.000000 14.000000 18.000000 15.000000 
+12.000000 8.000000 9.000000 11.000000 11.000000 10.000000 
+8.000000 9.000000 11.000000 10.000000 11.000000 10.000000 
+10.000000 13.000000 19.000000 21.000000 28.000000 39.000000 
+47.000000 55.000000 56.000000 43.000000 25.000000 21.000000 
+31.000000 38.000000 36.000000 30.000000 25.000000 26.000000 
+29.000000 25.000000 21.000000 22.000000 28.000000 32.000000 
+120.000000 129.000000 139.000000 140.000000 132.000000 126.000000 
+126.000000 121.000000 105.000000 95.000000 105.000000 125.000000 
+130.000000 103.000000 59.000000 27.000000 20.000000 28.000000 
+33.000000 27.000000 18.000000 17.000000 18.000000 16.000000 
+16.000000 11.000000 11.000000 12.000000 6.000000 8.000000 
+13.000000 15.000000 14.000000 13.000000 13.000000 13.000000 
+12.000000 16.000000 18.000000 14.000000 15.000000 19.000000 
+22.000000 19.000000 13.000000 10.000000 10.000000 13.000000 
+10.000000 8.000000 9.000000 8.000000 11.000000 22.000000 
+25.000000 21.000000 29.000000 38.000000 43.000000 45.000000 
+37.000000 17.000000 14.000000 26.000000 32.000000 38.000000 
+44.000000 42.000000 31.000000 21.000000 18.000000 19.000000 
+20.000000 22.000000 26.000000 30.000000 118.000000 123.000000 
+133.000000 142.000000 142.000000 130.000000 116.000000 107.000000 
+106.000000 108.000000 116.000000 127.000000 130.000000 112.000000 
+71.000000 27.000000 8.000000 20.000000 27.000000 28.000000 
+18.000000 11.000000 15.000000 14.000000 13.000000 11.000000 
+11.000000 14.000000 12.000000 9.000000 11.000000 14.000000 
+12.000000 10.000000 12.000000 13.000000 9.000000 11.000000 
+14.000000 10.000000 12.000000 17.000000 20.000000 18.000000 
+17.000000 14.000000 12.000000 13.000000 11.000000 8.000000 
+10.000000 12.000000 13.000000 18.000000 19.000000 23.000000 
+35.000000 43.000000 51.000000 55.000000 39.000000 14.000000 
+10.000000 19.000000 27.000000 39.000000 50.000000 51.000000 
+41.000000 30.000000 23.000000 20.000000 16.000000 13.000000 
+19.000000 33.000000 121.000000 124.000000 128.000000 125.000000 
+119.000000 113.000000 110.000000 110.000000 108.000000 106.000000 
+109.000000 118.000000 126.000000 116.000000 79.000000 33.000000 
+10.000000 17.000000 20.000000 22.000000 18.000000 13.000000 
+13.000000 14.000000 10.000000 9.000000 11.000000 10.000000 
+10.000000 13.000000 14.000000 13.000000 12.000000 11.000000 
+9.000000 6.000000 4.000000 7.000000 8.000000 8.000000 
+8.000000 8.000000 11.000000 13.000000 12.000000 14.000000 
+16.000000 11.000000 8.000000 11.000000 20.000000 16.000000 
+11.000000 16.000000 14.000000 25.000000 39.000000 52.000000 
+71.000000 73.000000 52.000000 29.000000 12.000000 8.000000 
+17.000000 25.000000 28.000000 32.000000 41.000000 45.000000 
+38.000000 30.000000 27.000000 26.000000 28.000000 35.000000 
+118.000000 125.000000 128.000000 122.000000 114.000000 114.000000 
+122.000000 126.000000 118.000000 104.000000 96.000000 101.000000 
+115.000000 117.000000 95.000000 56.000000 23.000000 10.000000 
+12.000000 15.000000 18.000000 17.000000 14.000000 14.000000 
+13.000000 17.000000 20.000000 14.000000 9.000000 10.000000 
+13.000000 10.000000 8.000000 8.000000 6.000000 6.000000 
+10.000000 13.000000 10.000000 10.000000 9.000000 6.000000 
+8.000000 12.000000 12.000000 11.000000 11.000000 8.000000 
+10.000000 17.000000 20.000000 15.000000 15.000000 16.000000 
+17.000000 27.000000 37.000000 62.000000 89.000000 83.000000 
+53.000000 24.000000 6.000000 4.000000 13.000000 18.000000 
+18.000000 14.000000 18.000000 25.000000 24.000000 22.000000 
+24.000000 29.000000 33.000000 34.000000 120.000000 123.000000 
+125.000000 125.000000 127.000000 129.000000 129.000000 125.000000 
+117.000000 107.000000 100.000000 101.000000 110.000000 119.000000 
+112.000000 83.000000 45.000000 17.000000 9.000000 14.000000 
+16.000000 15.000000 12.000000 6.000000 16.000000 30.000000 
+32.000000 22.000000 9.000000 11.000000 13.000000 14.000000 
+11.000000 7.000000 7.000000 9.000000 12.000000 12.000000 
+11.000000 10.000000 13.000000 13.000000 11.000000 10.000000 
+11.000000 12.000000 12.000000 14.000000 17.000000 16.000000 
+12.000000 17.000000 18.000000 11.000000 21.000000 25.000000 
+34.000000 71.000000 93.000000 76.000000 39.000000 12.000000 
+8.000000 8.000000 6.000000 9.000000 14.000000 12.000000 
+9.000000 10.000000 13.000000 18.000000 19.000000 15.000000 
+14.000000 19.000000 126.000000 126.000000 128.000000 129.000000 
+130.000000 130.000000 131.000000 130.000000 122.000000 108.000000 
+98.000000 99.000000 109.000000 116.000000 109.000000 84.000000 
+50.000000 21.000000 11.000000 17.000000 20.000000 21.000000 
+21.000000 16.000000 25.000000 35.000000 28.000000 9.000000 
+9.000000 12.000000 13.000000 15.000000 14.000000 11.000000 
+9.000000 9.000000 13.000000 12.000000 10.000000 9.000000 
+10.000000 15.000000 16.000000 15.000000 14.000000 17.000000 
+20.000000 18.000000 13.000000 9.000000 8.000000 11.000000 
+10.000000 8.000000 13.000000 19.000000 41.000000 71.000000 
+79.000000 60.000000 32.000000 19.000000 18.000000 13.000000 
+9.000000 11.000000 11.000000 10.000000 7.000000 2.000000 
+7.000000 19.000000 26.000000 22.000000 14.000000 9.000000 
+130.000000 129.000000 129.000000 128.000000 126.000000 126.000000 
+130.000000 133.000000 124.000000 103.000000 83.000000 80.000000 
+98.000000 116.000000 111.000000 77.000000 32.000000 8.000000 
+11.000000 21.000000 30.000000 36.000000 34.000000 34.000000 
+41.000000 35.000000 13.000000 10.000000 20.000000 16.000000 
+12.000000 11.000000 9.000000 10.000000 11.000000 15.000000 
+19.000000 14.000000 7.000000 11.000000 16.000000 17.000000 
+13.000000 11.000000 14.000000 18.000000 17.000000 12.000000 
+12.000000 18.000000 24.000000 23.000000 17.000000 8.000000 
+8.000000 17.000000 44.000000 77.000000 87.000000 73.000000 
+60.000000 60.000000 61.000000 61.000000 67.000000 72.000000 
+71.000000 65.000000 54.000000 38.000000 26.000000 28.000000 
+35.000000 37.000000 32.000000 24.000000 135.000000 131.000000 
+125.000000 123.000000 124.000000 127.000000 129.000000 131.000000 
+130.000000 118.000000 98.000000 88.000000 101.000000 124.000000 
+123.000000 87.000000 39.000000 15.000000 20.000000 36.000000 
+41.000000 33.000000 27.000000 35.000000 37.000000 21.000000 
+11.000000 27.000000 30.000000 24.000000 15.000000 9.000000 
+8.000000 7.000000 10.000000 13.000000 13.000000 12.000000 
+12.000000 17.000000 18.000000 10.000000 4.000000 2.000000 
+7.000000 14.000000 18.000000 19.000000 21.000000 25.000000 
+25.000000 21.000000 19.000000 17.000000 14.000000 15.000000 
+40.000000 76.000000 93.000000 92.000000 94.000000 102.000000 
+109.000000 113.000000 117.000000 117.000000 116.000000 117.000000 
+116.000000 108.000000 94.000000 86.000000 86.000000 81.000000 
+73.000000 62.000000 136.000000 135.000000 130.000000 126.000000 
+125.000000 128.000000 130.000000 132.000000 132.000000 127.000000 
+113.000000 101.000000 102.000000 110.000000 107.000000 83.000000 
+52.000000 29.000000 26.000000 42.000000 42.000000 25.000000 
+15.000000 27.000000 26.000000 10.000000 19.000000 27.000000 
+23.000000 21.000000 20.000000 15.000000 11.000000 9.000000 
+10.000000 15.000000 19.000000 19.000000 17.000000 15.000000 
+13.000000 9.000000 9.000000 8.000000 12.000000 17.000000 
+14.000000 18.000000 25.000000 28.000000 25.000000 20.000000 
+20.000000 25.000000 17.000000 10.000000 32.000000 66.000000 
+88.000000 101.000000 113.000000 122.000000 124.000000 123.000000 
+122.000000 121.000000 119.000000 120.000000 124.000000 128.000000 
+126.000000 121.000000 115.000000 110.000000 102.000000 87.000000 
+131.000000 133.000000 132.000000 127.000000 124.000000 126.000000 
+131.000000 131.000000 125.000000 116.000000 108.000000 100.000000 
+96.000000 95.000000 94.000000 85.000000 64.000000 39.000000 
+24.000000 31.000000 41.000000 38.000000 23.000000 17.000000 
+17.000000 9.000000 17.000000 14.000000 6.000000 15.000000 
+17.000000 13.000000 10.000000 13.000000 21.000000 28.000000 
+34.000000 31.000000 24.000000 17.000000 15.000000 20.000000 
+22.000000 21.000000 20.000000 16.000000 7.000000 6.000000 
+18.000000 34.000000 40.000000 33.000000 24.000000 23.000000 
+23.000000 14.000000 30.000000 68.000000 94.000000 107.000000 
+115.000000 119.000000 118.000000 117.000000 118.000000 118.000000 
+116.000000 116.000000 119.000000 124.000000 123.000000 118.000000 
+112.000000 108.000000 98.000000 82.000000 126.000000 122.000000 
+120.000000 121.000000 125.000000 129.000000 130.000000 126.000000 
+117.000000 108.000000 104.000000 101.000000 100.000000 101.000000 
+104.000000 101.000000 78.000000 43.000000 18.000000 15.000000 
+33.000000 42.000000 31.000000 18.000000 15.000000 9.000000 
+16.000000 18.000000 12.000000 11.000000 11.000000 9.000000 
+9.000000 15.000000 26.000000 31.000000 34.000000 35.000000 
+31.000000 22.000000 15.000000 18.000000 22.000000 19.000000 
+18.000000 11.000000 8.000000 14.000000 27.000000 36.000000 
+33.000000 25.000000 24.000000 31.000000 36.000000 29.000000 
+41.000000 78.000000 105.000000 110.000000 107.000000 106.000000 
+108.000000 109.000000 106.000000 104.000000 104.000000 108.000000 
+114.000000 121.000000 126.000000 125.000000 119.000000 110.000000 
+99.000000 94.000000 125.000000 119.000000 117.000000 121.000000 
+128.000000 133.000000 131.000000 121.000000 107.000000 98.000000 
+96.000000 96.000000 96.000000 95.000000 95.000000 93.000000 
+72.000000 41.000000 28.000000 20.000000 18.000000 32.000000 
+31.000000 24.000000 24.000000 11.000000 19.000000 51.000000 
+50.000000 27.000000 10.000000 11.000000 26.000000 27.000000 
+23.000000 31.000000 34.000000 29.000000 22.000000 17.000000 
+11.000000 12.000000 20.000000 26.000000 20.000000 8.000000 
+19.000000 37.000000 38.000000 31.000000 29.000000 35.000000 
+35.000000 30.000000 27.000000 28.000000 52.000000 91.000000 
+114.000000 117.000000 112.000000 113.000000 114.000000 110.000000 
+104.000000 104.000000 109.000000 113.000000 115.000000 119.000000 
+122.000000 121.000000 113.000000 104.000000 102.000000 107.000000 
+124.000000 120.000000 122.000000 129.000000 135.000000 134.000000 
+126.000000 115.000000 104.000000 97.000000 97.000000 98.000000 
+98.000000 95.000000 86.000000 80.000000 67.000000 57.000000 
+57.000000 43.000000 19.000000 18.000000 24.000000 21.000000 
+32.000000 34.000000 24.000000 46.000000 72.000000 65.000000 
+44.000000 28.000000 33.000000 37.000000 21.000000 19.000000 
+18.000000 13.000000 13.000000 19.000000 21.000000 16.000000 
+26.000000 31.000000 22.000000 37.000000 61.000000 62.000000 
+53.000000 47.000000 39.000000 21.000000 27.000000 33.000000 
+26.000000 37.000000 74.000000 107.000000 115.000000 105.000000 
+99.000000 103.000000 107.000000 106.000000 103.000000 105.000000 
+110.000000 116.000000 120.000000 124.000000 124.000000 119.000000 
+112.000000 108.000000 108.000000 111.000000 120.000000 116.000000 
+120.000000 131.000000 138.000000 134.000000 126.000000 121.000000 
+118.000000 110.000000 97.000000 90.000000 94.000000 95.000000 
+86.000000 88.000000 103.000000 123.000000 123.000000 90.000000 
+50.000000 25.000000 26.000000 26.000000 27.000000 44.000000 
+37.000000 25.000000 44.000000 58.000000 63.000000 46.000000 
+25.000000 21.000000 15.000000 8.000000 6.000000 7.000000 
+15.000000 31.000000 47.000000 35.000000 18.000000 14.000000 
+26.000000 74.000000 94.000000 112.000000 176.000000 222.000000 
+182.000000 64.000000 26.000000 40.000000 34.000000 56.000000 
+91.000000 110.000000 111.000000 96.000000 82.000000 84.000000 
+96.000000 105.000000 105.000000 104.000000 110.000000 118.000000 
+122.000000 122.000000 122.000000 117.000000 107.000000 99.000000 
+100.000000 111.000000 118.000000 119.000000 126.000000 136.000000 
+141.000000 138.000000 131.000000 126.000000 121.000000 108.000000 
+87.000000 75.000000 79.000000 81.000000 83.000000 118.000000 
+200.000000 273.000000 265.000000 184.000000 99.000000 54.000000 
+38.000000 34.000000 17.000000 20.000000 31.000000 27.000000 
+19.000000 28.000000 38.000000 36.000000 25.000000 13.000000 
+11.000000 15.000000 17.000000 17.000000 24.000000 30.000000 
+32.000000 27.000000 15.000000 26.000000 49.000000 69.000000 
+84.000000 165.000000 307.000000 386.000000 314.000000 144.000000 
+47.000000 22.000000 30.000000 71.000000 98.000000 103.000000 
+102.000000 96.000000 89.000000 88.000000 96.000000 104.000000 
+108.000000 108.000000 110.000000 115.000000 117.000000 113.000000 
+110.000000 108.000000 103.000000 100.000000 102.000000 110.000000 
+121.000000 128.000000 132.000000 132.000000 131.000000 129.000000 
+127.000000 120.000000 107.000000 93.000000 82.000000 78.000000 
+73.000000 70.000000 97.000000 180.000000 311.000000 397.000000 
+362.000000 246.000000 138.000000 74.000000 38.000000 32.000000 
+25.000000 19.000000 22.000000 28.000000 27.000000 26.000000 
+28.000000 30.000000 31.000000 25.000000 19.000000 15.000000 
+13.000000 19.000000 23.000000 20.000000 15.000000 19.000000 
+33.000000 49.000000 61.000000 52.000000 81.000000 189.000000 
+303.000000 333.000000 266.000000 167.000000 88.000000 29.000000 
+31.000000 73.000000 100.000000 104.000000 94.000000 90.000000 
+93.000000 95.000000 92.000000 93.000000 102.000000 111.000000 
+113.000000 113.000000 114.000000 113.000000 108.000000 102.000000 
+100.000000 105.000000 111.000000 113.000000 127.000000 131.000000 
+133.000000 126.000000 117.000000 117.000000 123.000000 121.000000 
+108.000000 99.000000 100.000000 93.000000 63.000000 52.000000 
+106.000000 232.000000 359.000000 403.000000 350.000000 250.000000 
+158.000000 87.000000 43.000000 39.000000 42.000000 39.000000 
+36.000000 35.000000 28.000000 20.000000 22.000000 29.000000 
+32.000000 30.000000 26.000000 15.000000 13.000000 14.000000 
+12.000000 23.000000 34.000000 37.000000 36.000000 39.000000 
+41.000000 45.000000 103.000000 195.000000 258.000000 275.000000 
+258.000000 211.000000 133.000000 63.000000 41.000000 67.000000 
+97.000000 103.000000 96.000000 96.000000 102.000000 101.000000 
+95.000000 97.000000 105.000000 112.000000 112.000000 113.000000 
+114.000000 113.000000 109.000000 105.000000 107.000000 111.000000 
+112.000000 111.000000 131.000000 135.000000 134.000000 126.000000 
+121.000000 128.000000 133.000000 120.000000 102.000000 104.000000 
+122.000000 116.000000 80.000000 60.000000 95.000000 191.000000 
+287.000000 333.000000 324.000000 264.000000 170.000000 79.000000 
+33.000000 36.000000 46.000000 44.000000 29.000000 18.000000 
+18.000000 20.000000 24.000000 25.000000 24.000000 25.000000 
+25.000000 22.000000 22.000000 13.000000 10.000000 24.000000 
+30.000000 29.000000 27.000000 26.000000 24.000000 42.000000 
+98.000000 172.000000 236.000000 270.000000 259.000000 203.000000 
+133.000000 86.000000 76.000000 92.000000 106.000000 106.000000 
+102.000000 101.000000 103.000000 101.000000 97.000000 98.000000 
+104.000000 110.000000 113.000000 113.000000 113.000000 111.000000 
+111.000000 113.000000 114.000000 110.000000 106.000000 106.000000 
+136.000000 136.000000 128.000000 120.000000 120.000000 128.000000 
+129.000000 117.000000 104.000000 107.000000 122.000000 127.000000 
+113.000000 94.000000 88.000000 106.000000 150.000000 208.000000 
+245.000000 221.000000 139.000000 57.000000 21.000000 24.000000 
+46.000000 50.000000 36.000000 23.000000 19.000000 24.000000 
+31.000000 30.000000 25.000000 26.000000 29.000000 27.000000 
+21.000000 13.000000 12.000000 18.000000 20.000000 20.000000 
+20.000000 18.000000 21.000000 36.000000 73.000000 136.000000 
+202.000000 235.000000 220.000000 171.000000 119.000000 87.000000 
+86.000000 101.000000 111.000000 105.000000 92.000000 87.000000 
+94.000000 103.000000 102.000000 96.000000 93.000000 97.000000 
+103.000000 106.000000 109.000000 115.000000 118.000000 116.000000 
+110.000000 106.000000 106.000000 112.000000 133.000000 130.000000 
+123.000000 121.000000 122.000000 121.000000 116.000000 113.000000 
+114.000000 117.000000 119.000000 121.000000 123.000000 114.000000 
+95.000000 82.000000 93.000000 114.000000 119.000000 92.000000 
+54.000000 32.000000 32.000000 32.000000 47.000000 58.000000 
+59.000000 49.000000 34.000000 30.000000 29.000000 26.000000 
+31.000000 39.000000 38.000000 27.000000 20.000000 16.000000 
+14.000000 14.000000 15.000000 19.000000 22.000000 17.000000 
+19.000000 34.000000 61.000000 97.000000 124.000000 133.000000 
+126.000000 113.000000 93.000000 77.000000 81.000000 99.000000 
+115.000000 115.000000 100.000000 85.000000 82.000000 92.000000 
+103.000000 107.000000 104.000000 101.000000 101.000000 104.000000 
+109.000000 115.000000 119.000000 120.000000 119.000000 118.000000 
+117.000000 116.000000 125.000000 122.000000 120.000000 121.000000 
+123.000000 118.000000 110.000000 109.000000 117.000000 122.000000 
+121.000000 119.000000 124.000000 125.000000 113.000000 102.000000 
+99.000000 93.000000 71.000000 46.000000 34.000000 37.000000 
+41.000000 39.000000 35.000000 38.000000 43.000000 40.000000 
+31.000000 23.000000 18.000000 21.000000 31.000000 37.000000 
+36.000000 32.000000 31.000000 29.000000 19.000000 9.000000 
+10.000000 24.000000 39.000000 38.000000 27.000000 23.000000 
+32.000000 57.000000 84.000000 94.000000 86.000000 72.000000 
+63.000000 67.000000 79.000000 96.000000 112.000000 120.000000 
+115.000000 99.000000 84.000000 85.000000 102.000000 119.000000 
+123.000000 115.000000 108.000000 109.000000 113.000000 117.000000 
+118.000000 117.000000 116.000000 117.000000 118.000000 119.000000 
+124.000000 126.000000 130.000000 129.000000 120.000000 110.000000 
+107.000000 115.000000 126.000000 133.000000 131.000000 128.000000 
+127.000000 127.000000 119.000000 105.000000 91.000000 72.000000 
+52.000000 41.000000 40.000000 38.000000 37.000000 42.000000 
+47.000000 50.000000 44.000000 32.000000 23.000000 24.000000 
+29.000000 31.000000 30.000000 32.000000 38.000000 44.000000 
+44.000000 39.000000 33.000000 31.000000 30.000000 27.000000 
+28.000000 31.000000 27.000000 22.000000 26.000000 42.000000 
+63.000000 77.000000 78.000000 67.000000 57.000000 64.000000 
+78.000000 88.000000 98.000000 110.000000 115.000000 106.000000 
+90.000000 83.000000 94.000000 112.000000 117.000000 110.000000 
+103.000000 106.000000 116.000000 120.000000 115.000000 109.000000 
+109.000000 113.000000 115.000000 112.000000 114.000000 120.000000 
+128.000000 124.000000 112.000000 103.000000 108.000000 119.000000 
+128.000000 131.000000 131.000000 131.000000 126.000000 120.000000 
+111.000000 92.000000 68.000000 49.000000 34.000000 26.000000 
+38.000000 50.000000 56.000000 59.000000 54.000000 50.000000 
+47.000000 44.000000 44.000000 42.000000 38.000000 36.000000 
+32.000000 32.000000 38.000000 47.000000 52.000000 51.000000 
+50.000000 52.000000 52.000000 47.000000 43.000000 46.000000 
+49.000000 43.000000 35.000000 36.000000 42.000000 48.000000 
+49.000000 42.000000 37.000000 53.000000 77.000000 91.000000 
+100.000000 110.000000 120.000000 117.000000 100.000000 86.000000 
+90.000000 103.000000 112.000000 112.000000 110.000000 110.000000 
+114.000000 117.000000 116.000000 114.000000 114.000000 114.000000 
+112.000000 110.000000 120.000000 121.000000 122.000000 118.000000 
+112.000000 111.000000 115.000000 121.000000 128.000000 133.000000 
+137.000000 139.000000 136.000000 123.000000 96.000000 62.000000 
+39.000000 37.000000 34.000000 23.000000 28.000000 43.000000 
+54.000000 60.000000 57.000000 49.000000 42.000000 38.000000 
+37.000000 30.000000 20.000000 10.000000 8.000000 17.000000 
+28.000000 32.000000 33.000000 35.000000 42.000000 46.000000 
+47.000000 46.000000 39.000000 32.000000 29.000000 27.000000 
+26.000000 26.000000 23.000000 25.000000 29.000000 18.000000 
+15.000000 27.000000 51.000000 83.000000 108.000000 118.000000 
+122.000000 121.000000 114.000000 104.000000 98.000000 99.000000 
+107.000000 119.000000 128.000000 129.000000 123.000000 118.000000 
+118.000000 119.000000 117.000000 111.000000 108.000000 109.000000 
+123.000000 127.000000 122.000000 115.000000 115.000000 125.000000 
+134.000000 136.000000 132.000000 127.000000 122.000000 120.000000 
+121.000000 111.000000 86.000000 62.000000 49.000000 36.000000 
+21.000000 11.000000 11.000000 15.000000 21.000000 28.000000 
+35.000000 38.000000 33.000000 25.000000 30.000000 50.000000 
+64.000000 61.000000 52.000000 38.000000 35.000000 40.000000 
+40.000000 38.000000 34.000000 31.000000 34.000000 36.000000 
+29.000000 20.000000 13.000000 9.000000 10.000000 18.000000 
+28.000000 43.000000 47.000000 21.000000 6.000000 8.000000 
+33.000000 72.000000 97.000000 107.000000 114.000000 117.000000 
+112.000000 101.000000 91.000000 89.000000 94.000000 102.000000 
+111.000000 116.000000 115.000000 112.000000 115.000000 120.000000 
+119.000000 112.000000 105.000000 104.000000 115.000000 118.000000 
+115.000000 113.000000 123.000000 136.000000 139.000000 130.000000 
+117.000000 104.000000 85.000000 67.000000 64.000000 65.000000 
+66.000000 73.000000 70.000000 53.000000 38.000000 27.000000 
+19.000000 16.000000 20.000000 21.000000 27.000000 40.000000 
+48.000000 42.000000 43.000000 105.000000 216.000000 297.000000 
+274.000000 164.000000 73.000000 54.000000 65.000000 65.000000 
+42.000000 24.000000 28.000000 33.000000 27.000000 25.000000 
+37.000000 47.000000 37.000000 22.000000 19.000000 35.000000 
+47.000000 39.000000 20.000000 11.000000 32.000000 66.000000 
+86.000000 97.000000 108.000000 120.000000 122.000000 110.000000 
+100.000000 100.000000 106.000000 109.000000 107.000000 108.000000 
+112.000000 114.000000 114.000000 114.000000 116.000000 117.000000 
+115.000000 112.000000 114.000000 118.000000 121.000000 127.000000 
+136.000000 135.000000 118.000000 97.000000 83.000000 71.000000 
+49.000000 23.000000 15.000000 30.000000 56.000000 82.000000 
+87.000000 74.000000 60.000000 51.000000 50.000000 59.000000 
+65.000000 66.000000 69.000000 70.000000 62.000000 47.000000 
+41.000000 103.000000 255.000000 391.000000 401.000000 277.000000 
+125.000000 54.000000 50.000000 66.000000 66.000000 50.000000 
+45.000000 48.000000 50.000000 46.000000 55.000000 74.000000 
+78.000000 61.000000 41.000000 32.000000 35.000000 41.000000 
+40.000000 31.000000 36.000000 53.000000 72.000000 90.000000 
+102.000000 109.000000 111.000000 110.000000 108.000000 110.000000 
+112.000000 110.000000 105.000000 103.000000 109.000000 117.000000 
+120.000000 117.000000 115.000000 117.000000 116.000000 111.000000 
+116.000000 125.000000 138.000000 144.000000 132.000000 106.000000 
+80.000000 64.000000 55.000000 42.000000 22.000000 8.000000 
+9.000000 27.000000 69.000000 100.000000 101.000000 80.000000 
+60.000000 61.000000 78.000000 85.000000 83.000000 83.000000 
+82.000000 67.000000 42.000000 34.000000 54.000000 117.000000 
+226.000000 320.000000 335.000000 260.000000 151.000000 78.000000 
+56.000000 60.000000 63.000000 58.000000 57.000000 67.000000 
+74.000000 73.000000 66.000000 69.000000 85.000000 89.000000 
+74.000000 51.000000 30.000000 20.000000 21.000000 26.000000 
+33.000000 41.000000 49.000000 63.000000 79.000000 93.000000 
+106.000000 115.000000 115.000000 109.000000 105.000000 105.000000 
+108.000000 110.000000 113.000000 118.000000 125.000000 125.000000 
+119.000000 111.000000 105.000000 101.000000 96.000000 100.000000 
+103.000000 95.000000 71.000000 48.000000 40.000000 40.000000 
+39.000000 30.000000 20.000000 23.000000 20.000000 15.000000 
+53.000000 82.000000 87.000000 84.000000 87.000000 93.000000 
+96.000000 97.000000 98.000000 93.000000 78.000000 58.000000 
+42.000000 44.000000 63.000000 100.000000 155.000000 197.000000 
+197.000000 155.000000 103.000000 76.000000 63.000000 55.000000 
+55.000000 64.000000 81.000000 95.000000 98.000000 92.000000 
+86.000000 91.000000 105.000000 112.000000 98.000000 67.000000 
+38.000000 18.000000 15.000000 18.000000 19.000000 20.000000 
+20.000000 30.000000 51.000000 73.000000 92.000000 110.000000 
+122.000000 121.000000 111.000000 104.000000 107.000000 116.000000 
+122.000000 122.000000 118.000000 114.000000 111.000000 110.000000 
+109.000000 108.000000 46.000000 41.000000 38.000000 33.000000 
+30.000000 32.000000 38.000000 49.000000 46.000000 33.000000 
+29.000000 27.000000 18.000000 10.000000 37.000000 68.000000 
+83.000000 87.000000 90.000000 100.000000 107.000000 100.000000 
+79.000000 62.000000 57.000000 65.000000 68.000000 63.000000 
+66.000000 87.000000 110.000000 115.000000 102.000000 86.000000 
+81.000000 78.000000 69.000000 57.000000 50.000000 59.000000 
+79.000000 95.000000 94.000000 85.000000 82.000000 91.000000 
+106.000000 112.000000 102.000000 79.000000 44.000000 12.000000 
+5.000000 7.000000 7.000000 13.000000 15.000000 16.000000 
+31.000000 55.000000 75.000000 89.000000 97.000000 100.000000 
+99.000000 101.000000 109.000000 119.000000 122.000000 116.000000 
+109.000000 109.000000 111.000000 109.000000 103.000000 99.000000 
+12.000000 15.000000 15.000000 15.000000 16.000000 21.000000 
+38.000000 50.000000 42.000000 29.000000 16.000000 7.000000 
+22.000000 36.000000 44.000000 62.000000 74.000000 74.000000 
+72.000000 72.000000 68.000000 57.000000 51.000000 65.000000 
+86.000000 95.000000 89.000000 79.000000 80.000000 87.000000 
+91.000000 87.000000 80.000000 76.000000 77.000000 78.000000 
+77.000000 75.000000 74.000000 73.000000 74.000000 76.000000 
+75.000000 74.000000 72.000000 75.000000 88.000000 105.000000 
+110.000000 90.000000 53.000000 23.000000 12.000000 14.000000 
+11.000000 7.000000 11.000000 12.000000 4.000000 9.000000 
+33.000000 56.000000 62.000000 53.000000 49.000000 55.000000 
+70.000000 91.000000 110.000000 117.000000 113.000000 108.000000 
+109.000000 110.000000 106.000000 102.000000 9.000000 9.000000 
+7.000000 9.000000 13.000000 17.000000 25.000000 31.000000 
+30.000000 21.000000 12.000000 22.000000 60.000000 81.000000 
+88.000000 99.000000 99.000000 84.000000 68.000000 58.000000 
+58.000000 66.000000 85.000000 105.000000 114.000000 117.000000 
+120.000000 121.000000 114.000000 103.000000 97.000000 98.000000 
+97.000000 91.000000 87.000000 93.000000 105.000000 117.000000 
+119.000000 108.000000 88.000000 70.000000 62.000000 59.000000 
+55.000000 55.000000 69.000000 90.000000 99.000000 86.000000 
+59.000000 27.000000 15.000000 14.000000 10.000000 8.000000 
+8.000000 6.000000 8.000000 12.000000 11.000000 15.000000 
+19.000000 12.000000 8.000000 17.000000 36.000000 64.000000 
+93.000000 110.000000 118.000000 121.000000 122.000000 117.000000 
+106.000000 96.000000 9.000000 17.000000 23.000000 19.000000 
+14.000000 20.000000 32.000000 32.000000 17.000000 7.000000 
+24.000000 63.000000 95.000000 104.000000 91.000000 73.000000 
+66.000000 75.000000 92.000000 96.000000 93.000000 101.000000 
+119.000000 131.000000 127.000000 119.000000 119.000000 123.000000 
+123.000000 117.000000 112.000000 114.000000 119.000000 124.000000 
+130.000000 137.000000 139.000000 134.000000 123.000000 115.000000 
+112.000000 110.000000 99.000000 78.000000 57.000000 49.000000 
+56.000000 68.000000 77.000000 77.000000 55.000000 20.000000 
+12.000000 13.000000 19.000000 21.000000 12.000000 11.000000 
+10.000000 6.000000 9.000000 16.000000 19.000000 14.000000 
+15.000000 19.000000 15.000000 27.000000 60.000000 90.000000 
+114.000000 129.000000 133.000000 125.000000 112.000000 106.000000 
+18.000000 16.000000 18.000000 22.000000 23.000000 21.000000 
+18.000000 15.000000 13.000000 12.000000 36.000000 79.000000 
+101.000000 97.000000 80.000000 64.000000 60.000000 75.000000 
+98.000000 115.000000 120.000000 117.000000 112.000000 110.000000 
+112.000000 115.000000 117.000000 118.000000 119.000000 122.000000 
+121.000000 116.000000 115.000000 121.000000 129.000000 133.000000 
+130.000000 125.000000 119.000000 114.000000 111.000000 113.000000 
+113.000000 104.000000 83.000000 60.000000 48.000000 56.000000 
+78.000000 87.000000 64.000000 22.000000 6.000000 16.000000 
+24.000000 20.000000 11.000000 10.000000 11.000000 9.000000 
+12.000000 15.000000 18.000000 19.000000 13.000000 8.000000 
+13.000000 18.000000 20.000000 41.000000 78.000000 104.000000 
+117.000000 127.000000 133.000000 132.000000 12.000000 12.000000 
+14.000000 14.000000 13.000000 10.000000 9.000000 14.000000 
+14.000000 26.000000 52.000000 70.000000 74.000000 63.000000 
+45.000000 38.000000 49.000000 75.000000 103.000000 121.000000 
+124.000000 121.000000 116.000000 113.000000 110.000000 107.000000 
+110.000000 116.000000 121.000000 122.000000 121.000000 123.000000 
+124.000000 124.000000 123.000000 122.000000 121.000000 121.000000 
+122.000000 121.000000 118.000000 115.000000 117.000000 118.000000 
+105.000000 77.000000 53.000000 48.000000 61.000000 69.000000 
+55.000000 31.000000 11.000000 6.000000 13.000000 17.000000 
+13.000000 8.000000 8.000000 12.000000 11.000000 8.000000 
+7.000000 7.000000 8.000000 8.000000 12.000000 20.000000 
+18.000000 16.000000 41.000000 68.000000 86.000000 107.000000 
+126.000000 135.000000 11.000000 13.000000 17.000000 16.000000 
+11.000000 11.000000 11.000000 8.000000 20.000000 51.000000 
+63.000000 54.000000 43.000000 46.000000 58.000000 66.000000 
+71.000000 84.000000 104.000000 118.000000 119.000000 114.000000 
+111.000000 113.000000 115.000000 116.000000 117.000000 115.000000 
+110.000000 109.000000 114.000000 121.000000 124.000000 124.000000 
+125.000000 127.000000 125.000000 118.000000 113.000000 111.000000 
+111.000000 111.000000 116.000000 124.000000 121.000000 96.000000 
+66.000000 50.000000 54.000000 64.000000 65.000000 49.000000 
+24.000000 11.000000 11.000000 16.000000 20.000000 15.000000 
+7.000000 8.000000 9.000000 6.000000 7.000000 9.000000 
+6.000000 6.000000 9.000000 13.000000 20.000000 24.000000 
+25.000000 33.000000 42.000000 60.000000 93.000000 118.000000 
+15.000000 17.000000 19.000000 18.000000 16.000000 16.000000 
+11.000000 18.000000 41.000000 51.000000 48.000000 43.000000 
+44.000000 51.000000 58.000000 67.000000 84.000000 105.000000 
+115.000000 112.000000 108.000000 111.000000 118.000000 120.000000 
+115.000000 108.000000 105.000000 106.000000 109.000000 114.000000 
+120.000000 125.000000 127.000000 125.000000 123.000000 122.000000 
+120.000000 116.000000 112.000000 111.000000 113.000000 115.000000 
+117.000000 121.000000 124.000000 117.000000 97.000000 70.000000 
+54.000000 58.000000 69.000000 58.000000 24.000000 7.000000 
+10.000000 19.000000 28.000000 24.000000 14.000000 8.000000 
+7.000000 10.000000 10.000000 10.000000 11.000000 7.000000 
+6.000000 11.000000 17.000000 19.000000 14.000000 24.000000 
+36.000000 25.000000 39.000000 85.000000 9.000000 11.000000 
+16.000000 18.000000 14.000000 9.000000 18.000000 42.000000 
+57.000000 55.000000 43.000000 39.000000 47.000000 58.000000 
+67.000000 80.000000 98.000000 111.000000 113.000000 109.000000 
+108.000000 113.000000 117.000000 116.000000 112.000000 108.000000 
+106.000000 106.000000 107.000000 109.000000 113.000000 117.000000 
+120.000000 119.000000 117.000000 116.000000 116.000000 113.000000 
+109.000000 111.000000 118.000000 121.000000 116.000000 112.000000 
+118.000000 127.000000 121.000000 98.000000 77.000000 72.000000 
+73.000000 60.000000 32.000000 16.000000 10.000000 8.000000 
+10.000000 10.000000 9.000000 7.000000 7.000000 11.000000 
+10.000000 7.000000 7.000000 6.000000 5.000000 5.000000 
+6.000000 8.000000 11.000000 21.000000 36.000000 25.000000 
+11.000000 38.000000 13.000000 14.000000 18.000000 17.000000 
+11.000000 22.000000 47.000000 59.000000 58.000000 51.000000 
+47.000000 47.000000 50.000000 56.000000 70.000000 91.000000 
+108.000000 113.000000 113.000000 116.000000 123.000000 125.000000 
+120.000000 115.000000 113.000000 112.000000 110.000000 107.000000 
+109.000000 115.000000 119.000000 119.000000 120.000000 121.000000 
+119.000000 113.000000 108.000000 111.000000 117.000000 121.000000 
+119.000000 116.000000 113.000000 113.000000 115.000000 120.000000 
+120.000000 110.000000 91.000000 75.000000 71.000000 70.000000 
+57.000000 30.000000 10.000000 8.000000 7.000000 9.000000 
+12.000000 10.000000 7.000000 5.000000 6.000000 9.000000 
+11.000000 9.000000 7.000000 7.000000 10.000000 11.000000 
+11.000000 11.000000 18.000000 22.000000 13.000000 18.000000 
+9.000000 10.000000 12.000000 8.000000 12.000000 34.000000 
+51.000000 55.000000 52.000000 52.000000 51.000000 45.000000 
+43.000000 57.000000 84.000000 109.000000 118.000000 115.000000 
+110.000000 110.000000 112.000000 112.000000 112.000000 115.000000 
+118.000000 117.000000 114.000000 112.000000 115.000000 119.000000 
+121.000000 119.000000 118.000000 120.000000 122.000000 121.000000 
+117.000000 113.000000 113.000000 116.000000 120.000000 123.000000 
+123.000000 121.000000 119.000000 123.000000 128.000000 122.000000 
+100.000000 75.000000 65.000000 69.000000 70.000000 50.000000 
+18.000000 5.000000 8.000000 8.000000 9.000000 11.000000 
+11.000000 10.000000 11.000000 8.000000 6.000000 6.000000 
+7.000000 6.000000 5.000000 8.000000 13.000000 13.000000 
+12.000000 14.000000 12.000000 9.000000 10.000000 16.000000 
+21.000000 14.000000 16.000000 40.000000 57.000000 61.000000 
+59.000000 56.000000 50.000000 45.000000 55.000000 80.000000 
+106.000000 117.000000 116.000000 112.000000 112.000000 114.000000 
+115.000000 114.000000 114.000000 113.000000 110.000000 108.000000 
+108.000000 110.000000 111.000000 111.000000 112.000000 117.000000 
+122.000000 123.000000 120.000000 115.000000 110.000000 107.000000 
+108.000000 114.000000 121.000000 122.000000 118.000000 115.000000 
+115.000000 119.000000 124.000000 124.000000 115.000000 96.000000 
+75.000000 64.000000 64.000000 60.000000 40.000000 15.000000 
+4.000000 7.000000 10.000000 11.000000 13.000000 12.000000 
+10.000000 7.000000 5.000000 4.000000 5.000000 8.000000 
+8.000000 7.000000 9.000000 10.000000 8.000000 9.000000 
+10.000000 7.000000 11.000000 17.000000 17.000000 9.000000 
+18.000000 43.000000 57.000000 62.000000 67.000000 69.000000 
+62.000000 57.000000 67.000000 92.000000 112.000000 119.000000 
+117.000000 114.000000 112.000000 111.000000 111.000000 113.000000 
+113.000000 113.000000 113.000000 113.000000 113.000000 114.000000 
+115.000000 118.000000 122.000000 124.000000 123.000000 118.000000 
+112.000000 109.000000 109.000000 110.000000 110.000000 114.000000 
+120.000000 123.000000 119.000000 113.000000 111.000000 114.000000 
+117.000000 121.000000 120.000000 111.000000 90.000000 66.000000 
+56.000000 60.000000 60.000000 44.000000 19.000000 7.000000 
+13.000000 16.000000 14.000000 12.000000 9.000000 6.000000 
+5.000000 7.000000 9.000000 9.000000 10.000000 11.000000 
+9.000000 7.000000 12.000000 25.000000 38.000000 32.000000 
+133.000000 134.000000 136.000000 135.000000 127.000000 107.000000 
+78.000000 51.000000 30.000000 16.000000 6.000000 8.000000 
+27.000000 35.000000 33.000000 22.000000 11.000000 9.000000 
+11.000000 8.000000 9.000000 13.000000 11.000000 8.000000 
+8.000000 9.000000 9.000000 11.000000 13.000000 12.000000 
+8.000000 8.000000 9.000000 8.000000 8.000000 9.000000 
+12.000000 14.000000 10.000000 9.000000 11.000000 14.000000 
+12.000000 9.000000 9.000000 11.000000 10.000000 5.000000 
+10.000000 10.000000 7.000000 12.000000 16.000000 15.000000 
+26.000000 36.000000 34.000000 31.000000 28.000000 22.000000 
+27.000000 51.000000 69.000000 54.000000 29.000000 20.000000 
+18.000000 16.000000 19.000000 26.000000 29.000000 26.000000 
+24.000000 25.000000 27.000000 23.000000 137.000000 152.000000 
+151.000000 135.000000 116.000000 109.000000 114.000000 116.000000 
+95.000000 58.000000 25.000000 8.000000 13.000000 18.000000 
+18.000000 18.000000 14.000000 8.000000 8.000000 8.000000 
+6.000000 10.000000 9.000000 8.000000 10.000000 15.000000 
+14.000000 9.000000 7.000000 6.000000 9.000000 11.000000 
+10.000000 7.000000 7.000000 12.000000 15.000000 10.000000 
+6.000000 7.000000 9.000000 12.000000 12.000000 11.000000 
+11.000000 14.000000 12.000000 6.000000 10.000000 13.000000 
+7.000000 12.000000 24.000000 29.000000 30.000000 33.000000 
+36.000000 32.000000 22.000000 27.000000 57.000000 84.000000 
+84.000000 54.000000 24.000000 16.000000 16.000000 14.000000 
+19.000000 27.000000 27.000000 24.000000 26.000000 32.000000 
+33.000000 27.000000 118.000000 121.000000 123.000000 127.000000 
+127.000000 120.000000 120.000000 129.000000 126.000000 104.000000 
+69.000000 33.000000 11.000000 6.000000 7.000000 10.000000 
+12.000000 8.000000 3.000000 6.000000 10.000000 10.000000 
+11.000000 14.000000 12.000000 14.000000 13.000000 9.000000 
+10.000000 10.000000 11.000000 12.000000 9.000000 9.000000 
+9.000000 10.000000 10.000000 9.000000 11.000000 11.000000 
+10.000000 12.000000 10.000000 7.000000 10.000000 13.000000 
+11.000000 9.000000 11.000000 18.000000 18.000000 11.000000 
+16.000000 20.000000 27.000000 38.000000 38.000000 23.000000 
+25.000000 55.000000 87.000000 93.000000 69.000000 33.000000 
+15.000000 20.000000 25.000000 24.000000 22.000000 20.000000 
+19.000000 26.000000 33.000000 32.000000 27.000000 21.000000 
+118.000000 121.000000 125.000000 131.000000 135.000000 127.000000 
+117.000000 122.000000 132.000000 124.000000 90.000000 50.000000 
+31.000000 32.000000 30.000000 16.000000 4.000000 9.000000 
+14.000000 13.000000 9.000000 5.000000 7.000000 13.000000 
+14.000000 10.000000 7.000000 5.000000 6.000000 7.000000 
+10.000000 10.000000 10.000000 10.000000 9.000000 10.000000 
+9.000000 9.000000 13.000000 10.000000 9.000000 14.000000 
+13.000000 7.000000 7.000000 7.000000 6.000000 9.000000 
+9.000000 17.000000 20.000000 12.000000 15.000000 10.000000 
+19.000000 43.000000 41.000000 26.000000 45.000000 87.000000 
+113.000000 106.000000 68.000000 17.000000 9.000000 36.000000 
+42.000000 37.000000 32.000000 29.000000 29.000000 33.000000 
+33.000000 30.000000 26.000000 23.000000 126.000000 133.000000 
+135.000000 133.000000 132.000000 130.000000 124.000000 116.000000 
+109.000000 95.000000 75.000000 60.000000 57.000000 53.000000 
+41.000000 25.000000 12.000000 10.000000 15.000000 14.000000 
+21.000000 32.000000 25.000000 12.000000 14.000000 14.000000 
+10.000000 9.000000 9.000000 8.000000 10.000000 10.000000 
+6.000000 4.000000 6.000000 11.000000 13.000000 17.000000 
+24.000000 21.000000 13.000000 12.000000 10.000000 9.000000 
+9.000000 8.000000 6.000000 5.000000 5.000000 8.000000 
+9.000000 9.000000 10.000000 8.000000 13.000000 16.000000 
+24.000000 35.000000 50.000000 78.000000 100.000000 90.000000 
+50.000000 11.000000 14.000000 41.000000 51.000000 46.000000 
+39.000000 38.000000 42.000000 42.000000 35.000000 26.000000 
+24.000000 27.000000 124.000000 128.000000 130.000000 126.000000 
+123.000000 122.000000 120.000000 114.000000 109.000000 102.000000 
+95.000000 88.000000 78.000000 63.000000 43.000000 24.000000 
+16.000000 12.000000 18.000000 25.000000 21.000000 18.000000 
+28.000000 24.000000 20.000000 18.000000 15.000000 12.000000 
+10.000000 9.000000 9.000000 8.000000 8.000000 6.000000 
+4.000000 9.000000 15.000000 18.000000 24.000000 21.000000 
+10.000000 8.000000 9.000000 9.000000 9.000000 9.000000 
+9.000000 9.000000 10.000000 11.000000 15.000000 20.000000 
+15.000000 11.000000 9.000000 10.000000 23.000000 32.000000 
+48.000000 83.000000 97.000000 70.000000 24.000000 7.000000 
+18.000000 31.000000 42.000000 45.000000 42.000000 37.000000 
+35.000000 33.000000 28.000000 20.000000 16.000000 20.000000 
+133.000000 133.000000 134.000000 133.000000 132.000000 133.000000 
+129.000000 120.000000 113.000000 114.000000 114.000000 104.000000 
+84.000000 63.000000 43.000000 24.000000 18.000000 18.000000 
+18.000000 26.000000 22.000000 11.000000 10.000000 15.000000 
+15.000000 11.000000 10.000000 11.000000 12.000000 11.000000 
+10.000000 12.000000 14.000000 12.000000 13.000000 17.000000 
+13.000000 19.000000 32.000000 31.000000 17.000000 12.000000 
+9.000000 8.000000 9.000000 10.000000 10.000000 10.000000 
+11.000000 15.000000 17.000000 16.000000 14.000000 10.000000 
+10.000000 27.000000 35.000000 34.000000 54.000000 80.000000 
+80.000000 53.000000 23.000000 8.000000 14.000000 35.000000 
+49.000000 52.000000 50.000000 46.000000 40.000000 35.000000 
+31.000000 29.000000 29.000000 33.000000 143.000000 142.000000 
+139.000000 135.000000 133.000000 132.000000 127.000000 114.000000 
+105.000000 109.000000 118.000000 114.000000 95.000000 72.000000 
+51.000000 31.000000 21.000000 25.000000 21.000000 20.000000 
+24.000000 21.000000 13.000000 10.000000 5.000000 5.000000 
+9.000000 13.000000 13.000000 10.000000 7.000000 10.000000 
+13.000000 15.000000 14.000000 14.000000 16.000000 24.000000 
+29.000000 28.000000 22.000000 18.000000 15.000000 10.000000 
+7.000000 10.000000 10.000000 9.000000 12.000000 12.000000 
+10.000000 8.000000 10.000000 9.000000 14.000000 35.000000 
+44.000000 52.000000 76.000000 83.000000 58.000000 30.000000 
+21.000000 18.000000 16.000000 21.000000 28.000000 35.000000 
+40.000000 42.000000 41.000000 39.000000 39.000000 42.000000 
+48.000000 52.000000 128.000000 137.000000 142.000000 136.000000 
+123.000000 115.000000 119.000000 127.000000 127.000000 121.000000 
+117.000000 111.000000 99.000000 82.000000 65.000000 45.000000 
+26.000000 21.000000 24.000000 18.000000 22.000000 25.000000 
+19.000000 14.000000 16.000000 20.000000 21.000000 16.000000 
+9.000000 9.000000 11.000000 11.000000 9.000000 8.000000 
+8.000000 10.000000 15.000000 18.000000 18.000000 21.000000 
+22.000000 18.000000 16.000000 13.000000 12.000000 15.000000 
+16.000000 11.000000 12.000000 14.000000 16.000000 15.000000 
+12.000000 7.000000 19.000000 41.000000 43.000000 59.000000 
+93.000000 93.000000 54.000000 18.000000 9.000000 18.000000 
+24.000000 20.000000 19.000000 22.000000 26.000000 36.000000 
+43.000000 44.000000 43.000000 45.000000 48.000000 48.000000 
+106.000000 120.000000 134.000000 135.000000 124.000000 114.000000 
+118.000000 130.000000 134.000000 123.000000 109.000000 101.000000 
+96.000000 87.000000 74.000000 59.000000 38.000000 17.000000 
+20.000000 24.000000 20.000000 23.000000 18.000000 10.000000 
+20.000000 30.000000 28.000000 17.000000 8.000000 10.000000 
+13.000000 9.000000 6.000000 6.000000 11.000000 19.000000 
+18.000000 13.000000 11.000000 15.000000 19.000000 16.000000 
+18.000000 20.000000 17.000000 15.000000 15.000000 12.000000 
+11.000000 15.000000 19.000000 13.000000 10.000000 6.000000 
+14.000000 26.000000 33.000000 63.000000 99.000000 95.000000 
+57.000000 16.000000 3.000000 12.000000 18.000000 21.000000 
+22.000000 20.000000 21.000000 29.000000 38.000000 40.000000 
+37.000000 37.000000 40.000000 41.000000 108.000000 113.000000 
+125.000000 132.000000 131.000000 125.000000 126.000000 132.000000 
+133.000000 122.000000 105.000000 97.000000 98.000000 99.000000 
+90.000000 72.000000 48.000000 21.000000 20.000000 30.000000 
+20.000000 16.000000 16.000000 12.000000 22.000000 31.000000 
+28.000000 15.000000 7.000000 9.000000 10.000000 11.000000 
+10.000000 12.000000 13.000000 16.000000 12.000000 8.000000 
+9.000000 8.000000 7.000000 8.000000 12.000000 13.000000 
+9.000000 8.000000 9.000000 11.000000 10.000000 13.000000 
+13.000000 8.000000 8.000000 8.000000 15.000000 19.000000 
+31.000000 66.000000 95.000000 86.000000 51.000000 25.000000 
+20.000000 19.000000 15.000000 8.000000 7.000000 18.000000 
+22.000000 17.000000 14.000000 17.000000 20.000000 19.000000 
+19.000000 22.000000 119.000000 118.000000 123.000000 130.000000 
+134.000000 133.000000 132.000000 133.000000 131.000000 120.000000 
+104.000000 97.000000 104.000000 112.000000 105.000000 80.000000 
+47.000000 18.000000 11.000000 22.000000 14.000000 11.000000 
+12.000000 13.000000 27.000000 32.000000 26.000000 17.000000 
+11.000000 11.000000 12.000000 14.000000 12.000000 10.000000 
+9.000000 8.000000 7.000000 8.000000 8.000000 5.000000 
+5.000000 7.000000 6.000000 6.000000 6.000000 7.000000 
+9.000000 12.000000 14.000000 15.000000 11.000000 10.000000 
+8.000000 11.000000 17.000000 22.000000 41.000000 75.000000 
+94.000000 81.000000 56.000000 48.000000 50.000000 46.000000 
+43.000000 32.000000 23.000000 22.000000 11.000000 1.000000 
+5.000000 10.000000 12.000000 14.000000 15.000000 14.000000 
+127.000000 121.000000 120.000000 125.000000 129.000000 129.000000 
+126.000000 126.000000 129.000000 128.000000 118.000000 108.000000 
+108.000000 112.000000 108.000000 85.000000 51.000000 20.000000 
+8.000000 14.000000 15.000000 20.000000 18.000000 14.000000 
+30.000000 30.000000 17.000000 15.000000 16.000000 14.000000 
+15.000000 13.000000 11.000000 8.000000 8.000000 10.000000 
+11.000000 9.000000 3.000000 2.000000 8.000000 11.000000 
+9.000000 9.000000 14.000000 17.000000 18.000000 15.000000 
+13.000000 13.000000 12.000000 12.000000 11.000000 11.000000 
+19.000000 32.000000 52.000000 75.000000 83.000000 77.000000 
+75.000000 83.000000 87.000000 87.000000 86.000000 81.000000 
+73.000000 66.000000 52.000000 38.000000 34.000000 31.000000 
+28.000000 26.000000 23.000000 16.000000 129.000000 125.000000 
+126.000000 128.000000 127.000000 126.000000 126.000000 129.000000 
+133.000000 134.000000 127.000000 114.000000 104.000000 104.000000 
+105.000000 93.000000 64.000000 35.000000 24.000000 27.000000 
+32.000000 34.000000 22.000000 16.000000 31.000000 20.000000 
+14.000000 27.000000 27.000000 23.000000 21.000000 16.000000 
+10.000000 7.000000 6.000000 12.000000 16.000000 14.000000 
+8.000000 8.000000 9.000000 10.000000 10.000000 10.000000 
+12.000000 13.000000 15.000000 19.000000 18.000000 10.000000 
+9.000000 12.000000 9.000000 12.000000 24.000000 37.000000 
+54.000000 76.000000 92.000000 99.000000 103.000000 106.000000 
+107.000000 110.000000 116.000000 116.000000 114.000000 112.000000 
+107.000000 94.000000 83.000000 85.000000 92.000000 86.000000 
+72.000000 58.000000 130.000000 129.000000 128.000000 124.000000 
+121.000000 124.000000 128.000000 129.000000 130.000000 133.000000 
+131.000000 120.000000 106.000000 101.000000 102.000000 94.000000 
+71.000000 47.000000 38.000000 42.000000 40.000000 29.000000 
+20.000000 18.000000 18.000000 16.000000 21.000000 30.000000 
+26.000000 19.000000 14.000000 11.000000 9.000000 11.000000 
+13.000000 17.000000 20.000000 21.000000 17.000000 13.000000 
+9.000000 11.000000 15.000000 17.000000 15.000000 13.000000 
+17.000000 24.000000 22.000000 9.000000 6.000000 6.000000 
+13.000000 27.000000 30.000000 27.000000 48.000000 86.000000 
+113.000000 124.000000 124.000000 115.000000 109.000000 113.000000 
+122.000000 124.000000 121.000000 116.000000 112.000000 110.000000 
+115.000000 126.000000 134.000000 132.000000 118.000000 102.000000 
+139.000000 134.000000 124.000000 116.000000 116.000000 121.000000 
+127.000000 132.000000 139.000000 146.000000 144.000000 127.000000 
+105.000000 94.000000 95.000000 94.000000 78.000000 54.000000 
+36.000000 35.000000 41.000000 35.000000 28.000000 23.000000 
+12.000000 12.000000 20.000000 13.000000 10.000000 11.000000 
+10.000000 8.000000 9.000000 12.000000 13.000000 16.000000 
+22.000000 24.000000 22.000000 14.000000 11.000000 13.000000 
+19.000000 23.000000 21.000000 21.000000 20.000000 17.000000 
+9.000000 8.000000 14.000000 20.000000 34.000000 42.000000 
+31.000000 22.000000 53.000000 98.000000 118.000000 117.000000 
+109.000000 106.000000 109.000000 115.000000 117.000000 115.000000 
+114.000000 113.000000 115.000000 120.000000 125.000000 126.000000 
+123.000000 116.000000 106.000000 98.000000 130.000000 123.000000 
+119.000000 121.000000 124.000000 129.000000 134.000000 142.000000 
+146.000000 143.000000 132.000000 114.000000 99.000000 96.000000 
+100.000000 103.000000 93.000000 65.000000 36.000000 24.000000 
+32.000000 45.000000 40.000000 25.000000 11.000000 14.000000 
+25.000000 24.000000 23.000000 21.000000 16.000000 14.000000 
+12.000000 8.000000 8.000000 17.000000 29.000000 33.000000 
+28.000000 20.000000 15.000000 19.000000 25.000000 27.000000 
+23.000000 16.000000 11.000000 9.000000 8.000000 15.000000 
+29.000000 38.000000 39.000000 42.000000 35.000000 35.000000 
+68.000000 108.000000 121.000000 112.000000 103.000000 107.000000 
+115.000000 116.000000 110.000000 106.000000 110.000000 114.000000 
+117.000000 120.000000 121.000000 119.000000 112.000000 108.000000 
+108.000000 109.000000 121.000000 118.000000 121.000000 128.000000 
+132.000000 133.000000 135.000000 138.000000 137.000000 127.000000 
+112.000000 100.000000 102.000000 109.000000 108.000000 103.000000 
+92.000000 68.000000 45.000000 31.000000 22.000000 37.000000 
+47.000000 37.000000 19.000000 11.000000 33.000000 45.000000 
+40.000000 26.000000 19.000000 17.000000 14.000000 8.000000 
+11.000000 19.000000 29.000000 33.000000 27.000000 19.000000 
+16.000000 20.000000 24.000000 22.000000 15.000000 8.000000 
+9.000000 17.000000 23.000000 28.000000 33.000000 36.000000 
+40.000000 46.000000 46.000000 56.000000 84.000000 108.000000 
+113.000000 109.000000 111.000000 120.000000 122.000000 117.000000 
+114.000000 117.000000 120.000000 117.000000 113.000000 113.000000 
+115.000000 114.000000 110.000000 108.000000 111.000000 112.000000 
+132.000000 131.000000 128.000000 127.000000 131.000000 133.000000 
+133.000000 132.000000 128.000000 116.000000 97.000000 86.000000 
+95.000000 110.000000 111.000000 98.000000 82.000000 65.000000 
+53.000000 44.000000 29.000000 27.000000 42.000000 42.000000 
+24.000000 6.000000 35.000000 50.000000 43.000000 25.000000 
+17.000000 19.000000 21.000000 14.000000 12.000000 15.000000 
+19.000000 24.000000 25.000000 23.000000 26.000000 35.000000 
+41.000000 31.000000 8.000000 14.000000 23.000000 18.000000 
+9.000000 13.000000 32.000000 48.000000 47.000000 40.000000 
+48.000000 75.000000 103.000000 111.000000 103.000000 99.000000 
+107.000000 117.000000 119.000000 118.000000 124.000000 130.000000 
+129.000000 122.000000 116.000000 117.000000 117.000000 111.000000 
+105.000000 106.000000 111.000000 112.000000 131.000000 129.000000 
+124.000000 122.000000 126.000000 132.000000 132.000000 126.000000 
+115.000000 98.000000 81.000000 75.000000 86.000000 103.000000 
+108.000000 98.000000 81.000000 70.000000 66.000000 60.000000 
+44.000000 30.000000 35.000000 35.000000 21.000000 17.000000 
+35.000000 50.000000 48.000000 32.000000 31.000000 33.000000 
+33.000000 25.000000 16.000000 19.000000 15.000000 15.000000 
+21.000000 31.000000 33.000000 33.000000 38.000000 25.000000 
+25.000000 55.000000 70.000000 72.000000 77.000000 82.000000 
+74.000000 51.000000 38.000000 31.000000 50.000000 86.000000 
+107.000000 109.000000 100.000000 94.000000 101.000000 110.000000 
+115.000000 115.000000 114.000000 115.000000 118.000000 122.000000 
+122.000000 120.000000 116.000000 110.000000 108.000000 114.000000 
+120.000000 121.000000 122.000000 119.000000 119.000000 123.000000 
+127.000000 127.000000 123.000000 115.000000 105.000000 94.000000 
+84.000000 83.000000 93.000000 102.000000 99.000000 94.000000 
+97.000000 111.000000 122.000000 108.000000 75.000000 46.000000 
+41.000000 48.000000 35.000000 24.000000 30.000000 35.000000 
+35.000000 33.000000 40.000000 38.000000 27.000000 23.000000 
+19.000000 14.000000 12.000000 15.000000 15.000000 16.000000 
+15.000000 7.000000 12.000000 16.000000 50.000000 75.000000 
+96.000000 169.000000 258.000000 271.000000 176.000000 53.000000 
+18.000000 37.000000 72.000000 98.000000 100.000000 100.000000 
+103.000000 104.000000 102.000000 102.000000 108.000000 114.000000 
+113.000000 107.000000 106.000000 112.000000 118.000000 119.000000 
+117.000000 115.000000 118.000000 123.000000 124.000000 117.000000 
+124.000000 125.000000 127.000000 131.000000 133.000000 129.000000 
+119.000000 110.000000 105.000000 100.000000 94.000000 94.000000 
+99.000000 97.000000 86.000000 96.000000 159.000000 241.000000 
+267.000000 211.000000 124.000000 63.000000 38.000000 41.000000 
+35.000000 22.000000 23.000000 17.000000 15.000000 21.000000 
+23.000000 23.000000 23.000000 20.000000 20.000000 13.000000 
+9.000000 11.000000 12.000000 6.000000 6.000000 15.000000 
+30.000000 45.000000 52.000000 54.000000 101.000000 220.000000 
+331.000000 339.000000 238.000000 111.000000 40.000000 42.000000 
+76.000000 101.000000 106.000000 101.000000 101.000000 101.000000 
+98.000000 99.000000 107.000000 116.000000 116.000000 111.000000 
+110.000000 118.000000 124.000000 120.000000 111.000000 106.000000 
+108.000000 111.000000 111.000000 110.000000 126.000000 134.000000 
+139.000000 140.000000 134.000000 127.000000 118.000000 109.000000 
+97.000000 90.000000 93.000000 101.000000 98.000000 82.000000 
+83.000000 142.000000 273.000000 396.000000 405.000000 300.000000 
+173.000000 91.000000 39.000000 20.000000 20.000000 16.000000 
+13.000000 15.000000 16.000000 15.000000 17.000000 18.000000 
+22.000000 21.000000 21.000000 20.000000 12.000000 4.000000 
+9.000000 18.000000 23.000000 28.000000 37.000000 50.000000 
+50.000000 64.000000 139.000000 241.000000 302.000000 290.000000 
+234.000000 168.000000 99.000000 59.000000 63.000000 87.000000 
+103.000000 102.000000 96.000000 98.000000 103.000000 104.000000 
+106.000000 108.000000 110.000000 114.000000 119.000000 124.000000 
+122.000000 113.000000 104.000000 102.000000 103.000000 104.000000 
+106.000000 110.000000 126.000000 131.000000 139.000000 141.000000 
+134.000000 125.000000 120.000000 110.000000 94.000000 86.000000 
+94.000000 99.000000 82.000000 66.000000 97.000000 194.000000 
+339.000000 431.000000 413.000000 314.000000 203.000000 117.000000 
+55.000000 32.000000 37.000000 34.000000 26.000000 21.000000 
+19.000000 13.000000 12.000000 16.000000 22.000000 27.000000 
+26.000000 17.000000 9.000000 9.000000 12.000000 23.000000 
+31.000000 34.000000 39.000000 48.000000 51.000000 76.000000 
+149.000000 230.000000 277.000000 282.000000 251.000000 188.000000 
+118.000000 76.000000 76.000000 89.000000 92.000000 88.000000 
+93.000000 108.000000 117.000000 115.000000 112.000000 112.000000 
+114.000000 118.000000 120.000000 119.000000 117.000000 115.000000 
+113.000000 111.000000 109.000000 108.000000 108.000000 107.000000 
+129.000000 132.000000 134.000000 131.000000 124.000000 121.000000 
+121.000000 112.000000 97.000000 91.000000 99.000000 98.000000 
+78.000000 67.000000 98.000000 174.000000 272.000000 343.000000 
+360.000000 320.000000 231.000000 128.000000 58.000000 38.000000 
+51.000000 58.000000 43.000000 21.000000 13.000000 12.000000 
+15.000000 23.000000 33.000000 36.000000 29.000000 16.000000 
+9.000000 11.000000 12.000000 17.000000 28.000000 38.000000 
+39.000000 33.000000 29.000000 53.000000 120.000000 200.000000 
+261.000000 277.000000 239.000000 170.000000 107.000000 74.000000 
+69.000000 76.000000 85.000000 92.000000 95.000000 96.000000 
+98.000000 102.000000 110.000000 114.000000 116.000000 120.000000 
+123.000000 119.000000 112.000000 109.000000 110.000000 109.000000 
+109.000000 111.000000 114.000000 114.000000 129.000000 130.000000 
+129.000000 124.000000 120.000000 122.000000 121.000000 110.000000 
+95.000000 92.000000 106.000000 117.000000 109.000000 96.000000 
+102.000000 131.000000 170.000000 219.000000 264.000000 259.000000 
+189.000000 99.000000 45.000000 30.000000 42.000000 48.000000 
+42.000000 33.000000 29.000000 27.000000 26.000000 22.000000 
+21.000000 25.000000 28.000000 26.000000 23.000000 20.000000 
+20.000000 27.000000 36.000000 40.000000 36.000000 25.000000 
+17.000000 33.000000 83.000000 150.000000 200.000000 201.000000 
+160.000000 112.000000 80.000000 71.000000 76.000000 83.000000 
+91.000000 95.000000 92.000000 88.000000 87.000000 94.000000 
+102.000000 105.000000 106.000000 112.000000 116.000000 115.000000 
+108.000000 105.000000 108.000000 112.000000 114.000000 115.000000 
+115.000000 116.000000 131.000000 131.000000 131.000000 133.000000 
+133.000000 127.000000 112.000000 97.000000 91.000000 100.000000 
+117.000000 130.000000 128.000000 117.000000 106.000000 103.000000 
+113.000000 130.000000 137.000000 118.000000 79.000000 48.000000 
+42.000000 43.000000 44.000000 41.000000 39.000000 42.000000 
+42.000000 36.000000 29.000000 24.000000 24.000000 33.000000 
+39.000000 37.000000 28.000000 18.000000 15.000000 21.000000 
+33.000000 41.000000 34.000000 20.000000 15.000000 31.000000 
+60.000000 88.000000 103.000000 105.000000 102.000000 90.000000 
+71.000000 66.000000 83.000000 107.000000 119.000000 113.000000 
+97.000000 83.000000 80.000000 86.000000 93.000000 98.000000 
+98.000000 98.000000 102.000000 109.000000 115.000000 118.000000 
+119.000000 118.000000 118.000000 118.000000 120.000000 122.000000 
+130.000000 131.000000 133.000000 136.000000 134.000000 119.000000 
+98.000000 86.000000 96.000000 115.000000 126.000000 130.000000 
+134.000000 136.000000 126.000000 108.000000 100.000000 99.000000 
+87.000000 65.000000 49.000000 48.000000 53.000000 49.000000 
+36.000000 28.000000 32.000000 36.000000 32.000000 23.000000 
+22.000000 33.000000 44.000000 48.000000 45.000000 37.000000 
+25.000000 13.000000 7.000000 10.000000 22.000000 32.000000 
+32.000000 28.000000 27.000000 30.000000 35.000000 45.000000 
+57.000000 68.000000 70.000000 68.000000 69.000000 80.000000 
+101.000000 122.000000 131.000000 127.000000 111.000000 88.000000 
+69.000000 66.000000 80.000000 97.000000 101.000000 95.000000 
+95.000000 108.000000 122.000000 126.000000 121.000000 115.000000 
+113.000000 116.000000 121.000000 126.000000 124.000000 124.000000 
+127.000000 131.000000 129.000000 115.000000 97.000000 91.000000 
+104.000000 123.000000 134.000000 139.000000 145.000000 145.000000 
+132.000000 111.000000 99.000000 85.000000 64.000000 48.000000 
+46.000000 52.000000 56.000000 52.000000 45.000000 42.000000 
+37.000000 30.000000 23.000000 20.000000 23.000000 28.000000 
+33.000000 38.000000 43.000000 46.000000 41.000000 33.000000 
+25.000000 19.000000 18.000000 19.000000 23.000000 30.000000 
+37.000000 37.000000 35.000000 38.000000 44.000000 47.000000 
+49.000000 57.000000 75.000000 100.000000 121.000000 129.000000 
+126.000000 122.000000 116.000000 102.000000 79.000000 65.000000 
+72.000000 91.000000 100.000000 98.000000 98.000000 109.000000 
+125.000000 131.000000 125.000000 117.000000 113.000000 114.000000 
+117.000000 120.000000 120.000000 121.000000 128.000000 128.000000 
+115.000000 97.000000 91.000000 102.000000 118.000000 130.000000 
+136.000000 139.000000 137.000000 130.000000 120.000000 109.000000 
+91.000000 61.000000 35.000000 30.000000 46.000000 64.000000 
+68.000000 62.000000 65.000000 71.000000 62.000000 43.000000 
+29.000000 25.000000 28.000000 31.000000 35.000000 43.000000 
+49.000000 50.000000 46.000000 43.000000 40.000000 35.000000 
+31.000000 33.000000 39.000000 43.000000 40.000000 32.000000 
+31.000000 37.000000 40.000000 36.000000 37.000000 51.000000 
+78.000000 106.000000 122.000000 124.000000 123.000000 123.000000 
+120.000000 108.000000 89.000000 72.000000 66.000000 74.000000 
+91.000000 110.000000 121.000000 118.000000 114.000000 115.000000 
+117.000000 117.000000 113.000000 111.000000 112.000000 115.000000 
+122.000000 127.000000 133.000000 130.000000 115.000000 99.000000 
+96.000000 107.000000 120.000000 125.000000 129.000000 135.000000 
+137.000000 127.000000 111.000000 102.000000 96.000000 80.000000 
+57.000000 36.000000 26.000000 27.000000 31.000000 45.000000 
+65.000000 68.000000 49.000000 28.000000 21.000000 24.000000 
+26.000000 23.000000 21.000000 28.000000 41.000000 44.000000 
+41.000000 36.000000 37.000000 35.000000 33.000000 37.000000 
+40.000000 37.000000 30.000000 25.000000 28.000000 29.000000 
+21.000000 12.000000 20.000000 44.000000 67.000000 82.000000 
+95.000000 111.000000 121.000000 124.000000 123.000000 123.000000 
+118.000000 102.000000 84.000000 82.000000 101.000000 124.000000 
+133.000000 124.000000 110.000000 104.000000 109.000000 116.000000 
+115.000000 111.000000 110.000000 113.000000 124.000000 129.000000 
+128.000000 118.000000 108.000000 105.000000 110.000000 115.000000 
+114.000000 111.000000 115.000000 129.000000 141.000000 134.000000 
+110.000000 92.000000 90.000000 94.000000 84.000000 58.000000 
+34.000000 23.000000 21.000000 27.000000 33.000000 31.000000 
+18.000000 14.000000 24.000000 74.000000 127.000000 151.000000 
+123.000000 62.000000 33.000000 33.000000 51.000000 44.000000 
+29.000000 18.000000 15.000000 21.000000 25.000000 29.000000 
+37.000000 51.000000 50.000000 33.000000 19.000000 17.000000 
+21.000000 29.000000 33.000000 42.000000 74.000000 109.000000 
+124.000000 124.000000 121.000000 121.000000 119.000000 111.000000 
+98.000000 88.000000 89.000000 101.000000 115.000000 124.000000 
+125.000000 120.000000 118.000000 118.000000 113.000000 106.000000 
+105.000000 112.000000 121.000000 132.000000 131.000000 119.000000 
+108.000000 109.000000 115.000000 112.000000 103.000000 104.000000 
+114.000000 123.000000 120.000000 101.000000 80.000000 74.000000 
+80.000000 92.000000 91.000000 68.000000 46.000000 41.000000 
+39.000000 35.000000 35.000000 47.000000 57.000000 44.000000 
+38.000000 140.000000 298.000000 403.000000 359.000000 208.000000 
+89.000000 67.000000 96.000000 96.000000 50.000000 18.000000 
+21.000000 34.000000 37.000000 44.000000 67.000000 84.000000 
+74.000000 50.000000 38.000000 34.000000 22.000000 10.000000 
+8.000000 31.000000 68.000000 99.000000 114.000000 118.000000 
+122.000000 128.000000 128.000000 117.000000 104.000000 99.000000 
+108.000000 120.000000 127.000000 125.000000 120.000000 115.000000 
+111.000000 111.000000 112.000000 112.000000 112.000000 115.000000 
+116.000000 125.000000 124.000000 115.000000 109.000000 112.000000 
+115.000000 109.000000 99.000000 90.000000 81.000000 74.000000 
+72.000000 70.000000 72.000000 77.000000 77.000000 71.000000 
+61.000000 51.000000 56.000000 67.000000 71.000000 76.000000 
+83.000000 82.000000 66.000000 50.000000 56.000000 139.000000 
+292.000000 401.000000 376.000000 239.000000 105.000000 56.000000 
+60.000000 71.000000 63.000000 48.000000 46.000000 55.000000 
+62.000000 64.000000 69.000000 79.000000 84.000000 86.000000 
+79.000000 57.000000 33.000000 23.000000 24.000000 35.000000 
+56.000000 79.000000 94.000000 102.000000 113.000000 125.000000 
+128.000000 117.000000 104.000000 102.000000 112.000000 121.000000 
+122.000000 118.000000 115.000000 115.000000 114.000000 114.000000 
+116.000000 119.000000 121.000000 119.000000 110.000000 114.000000 
+120.000000 120.000000 113.000000 105.000000 98.000000 92.000000 
+87.000000 82.000000 70.000000 55.000000 48.000000 56.000000 
+71.000000 80.000000 85.000000 87.000000 86.000000 89.000000 
+91.000000 90.000000 93.000000 96.000000 87.000000 64.000000 
+40.000000 40.000000 69.000000 140.000000 235.000000 293.000000 
+272.000000 191.000000 111.000000 69.000000 55.000000 56.000000 
+58.000000 62.000000 71.000000 81.000000 84.000000 79.000000 
+74.000000 82.000000 104.000000 119.000000 117.000000 99.000000 
+69.000000 40.000000 21.000000 19.000000 32.000000 51.000000 
+73.000000 96.000000 113.000000 123.000000 129.000000 127.000000 
+121.000000 116.000000 113.000000 113.000000 114.000000 116.000000 
+119.000000 124.000000 128.000000 128.000000 124.000000 116.000000 
+112.000000 111.000000 110.000000 114.000000 118.000000 113.000000 
+100.000000 89.000000 83.000000 78.000000 73.000000 66.000000 
+55.000000 36.000000 15.000000 22.000000 58.000000 83.000000 
+97.000000 106.000000 114.000000 116.000000 110.000000 92.000000 
+77.000000 70.000000 65.000000 58.000000 52.000000 55.000000 
+71.000000 108.000000 151.000000 170.000000 150.000000 114.000000 
+92.000000 82.000000 71.000000 57.000000 49.000000 55.000000 
+73.000000 88.000000 91.000000 85.000000 81.000000 88.000000 
+103.000000 116.000000 116.000000 99.000000 72.000000 47.000000 
+32.000000 13.000000 8.000000 19.000000 38.000000 76.000000 
+108.000000 117.000000 117.000000 121.000000 125.000000 125.000000 
+122.000000 118.000000 117.000000 118.000000 120.000000 123.000000 
+126.000000 128.000000 128.000000 124.000000 116.000000 109.000000 
+97.000000 86.000000 78.000000 73.000000 71.000000 73.000000 
+76.000000 82.000000 87.000000 81.000000 64.000000 42.000000 
+19.000000 15.000000 44.000000 72.000000 88.000000 91.000000 
+88.000000 83.000000 74.000000 60.000000 51.000000 58.000000 
+77.000000 91.000000 88.000000 77.000000 77.000000 87.000000 
+96.000000 97.000000 90.000000 82.000000 73.000000 65.000000 
+62.000000 61.000000 60.000000 58.000000 61.000000 71.000000 
+80.000000 83.000000 80.000000 83.000000 98.000000 115.000000 
+119.000000 107.000000 84.000000 56.000000 28.000000 9.000000 
+18.000000 23.000000 9.000000 29.000000 71.000000 95.000000 
+105.000000 109.000000 109.000000 109.000000 114.000000 121.000000 
+122.000000 116.000000 113.000000 120.000000 130.000000 132.000000 
+124.000000 115.000000 109.000000 106.000000 56.000000 54.000000 
+52.000000 48.000000 47.000000 58.000000 77.000000 87.000000 
+79.000000 56.000000 33.000000 17.000000 17.000000 52.000000 
+93.000000 114.000000 114.000000 96.000000 74.000000 65.000000 
+67.000000 73.000000 80.000000 90.000000 100.000000 104.000000 
+103.000000 102.000000 100.000000 94.000000 84.000000 76.000000 
+75.000000 76.000000 76.000000 77.000000 82.000000 90.000000 
+93.000000 86.000000 75.000000 70.000000 70.000000 68.000000 
+63.000000 65.000000 77.000000 89.000000 96.000000 98.000000 
+86.000000 58.000000 32.000000 14.000000 10.000000 16.000000 
+17.000000 7.000000 14.000000 43.000000 72.000000 92.000000 
+100.000000 96.000000 89.000000 89.000000 94.000000 105.000000 
+120.000000 129.000000 129.000000 121.000000 111.000000 108.000000 
+110.000000 110.000000 9.000000 11.000000 24.000000 35.000000 
+45.000000 57.000000 61.000000 51.000000 31.000000 18.000000 
+16.000000 25.000000 72.000000 128.000000 149.000000 135.000000 
+109.000000 89.000000 83.000000 85.000000 89.000000 100.000000 
+117.000000 131.000000 134.000000 132.000000 131.000000 131.000000 
+126.000000 116.000000 108.000000 104.000000 103.000000 106.000000 
+113.000000 124.000000 132.000000 130.000000 123.000000 116.000000 
+113.000000 105.000000 86.000000 63.000000 54.000000 61.000000 
+74.000000 81.000000 83.000000 81.000000 61.000000 31.000000 
+17.000000 17.000000 15.000000 9.000000 9.000000 11.000000 
+7.000000 2.000000 7.000000 24.000000 40.000000 45.000000 
+42.000000 45.000000 60.000000 86.000000 110.000000 119.000000 
+118.000000 114.000000 111.000000 111.000000 112.000000 111.000000 
+27.000000 19.000000 11.000000 10.000000 20.000000 36.000000 
+45.000000 39.000000 27.000000 19.000000 38.000000 95.000000 
+135.000000 144.000000 130.000000 110.000000 99.000000 101.000000 
+106.000000 107.000000 110.000000 122.000000 135.000000 138.000000 
+131.000000 126.000000 127.000000 129.000000 128.000000 126.000000 
+125.000000 129.000000 132.000000 133.000000 135.000000 136.000000 
+137.000000 134.000000 130.000000 128.000000 131.000000 133.000000 
+123.000000 102.000000 79.000000 62.000000 56.000000 63.000000 
+80.000000 88.000000 68.000000 29.000000 4.000000 8.000000 
+23.000000 26.000000 19.000000 12.000000 8.000000 8.000000 
+7.000000 10.000000 16.000000 14.000000 6.000000 5.000000 
+22.000000 59.000000 96.000000 112.000000 115.000000 117.000000 
+118.000000 114.000000 107.000000 108.000000 12.000000 10.000000 
+10.000000 8.000000 8.000000 13.000000 15.000000 14.000000 
+20.000000 31.000000 56.000000 98.000000 120.000000 108.000000 
+78.000000 60.000000 65.000000 85.000000 110.000000 128.000000 
+131.000000 128.000000 125.000000 125.000000 125.000000 123.000000 
+120.000000 121.000000 126.000000 130.000000 130.000000 130.000000 
+132.000000 134.000000 133.000000 130.000000 129.000000 131.000000 
+133.000000 132.000000 128.000000 124.000000 123.000000 120.000000 
+106.000000 77.000000 47.000000 36.000000 51.000000 71.000000 
+67.000000 39.000000 14.000000 17.000000 33.000000 38.000000 
+28.000000 14.000000 8.000000 7.000000 9.000000 9.000000 
+8.000000 7.000000 11.000000 22.000000 22.000000 26.000000 
+62.000000 99.000000 118.000000 125.000000 129.000000 126.000000 
+118.000000 114.000000 9.000000 9.000000 8.000000 7.000000 
+13.000000 20.000000 21.000000 16.000000 9.000000 23.000000 
+59.000000 79.000000 79.000000 64.000000 52.000000 53.000000 
+65.000000 85.000000 106.000000 118.000000 118.000000 115.000000 
+117.000000 122.000000 122.000000 116.000000 115.000000 121.000000 
+124.000000 122.000000 122.000000 128.000000 132.000000 129.000000 
+123.000000 125.000000 130.000000 130.000000 127.000000 125.000000 
+125.000000 122.000000 122.000000 127.000000 128.000000 110.000000 
+73.000000 44.000000 42.000000 59.000000 70.000000 61.000000 
+40.000000 19.000000 9.000000 12.000000 11.000000 10.000000 
+14.000000 10.000000 8.000000 11.000000 12.000000 14.000000 
+11.000000 9.000000 23.000000 31.000000 37.000000 69.000000 
+105.000000 120.000000 121.000000 121.000000 124.000000 125.000000 
+4.000000 6.000000 11.000000 16.000000 21.000000 27.000000 
+29.000000 17.000000 23.000000 66.000000 82.000000 73.000000 
+56.000000 44.000000 47.000000 61.000000 82.000000 104.000000 
+119.000000 123.000000 120.000000 118.000000 120.000000 120.000000 
+118.000000 115.000000 113.000000 112.000000 109.000000 109.000000 
+113.000000 119.000000 126.000000 132.000000 137.000000 139.000000 
+134.000000 125.000000 120.000000 122.000000 125.000000 122.000000 
+118.000000 121.000000 128.000000 122.000000 97.000000 68.000000 
+53.000000 54.000000 59.000000 54.000000 38.000000 22.000000 
+12.000000 9.000000 11.000000 13.000000 16.000000 16.000000 
+13.000000 10.000000 7.000000 5.000000 8.000000 11.000000 
+16.000000 29.000000 35.000000 36.000000 70.000000 112.000000 
+124.000000 116.000000 110.000000 114.000000 5.000000 8.000000 
+14.000000 17.000000 18.000000 24.000000 20.000000 29.000000 
+78.000000 105.000000 90.000000 58.000000 41.000000 44.000000 
+59.000000 79.000000 100.000000 118.000000 123.000000 119.000000 
+118.000000 123.000000 128.000000 125.000000 119.000000 114.000000 
+112.000000 110.000000 110.000000 113.000000 116.000000 118.000000 
+122.000000 127.000000 131.000000 129.000000 123.000000 119.000000 
+116.000000 114.000000 114.000000 118.000000 122.000000 124.000000 
+126.000000 127.000000 118.000000 95.000000 71.000000 63.000000 
+68.000000 66.000000 45.000000 20.000000 10.000000 10.000000 
+8.000000 10.000000 16.000000 22.000000 21.000000 20.000000 
+16.000000 8.000000 9.000000 13.000000 10.000000 10.000000 
+24.000000 29.000000 36.000000 66.000000 95.000000 110.000000 
+113.000000 113.000000 7.000000 11.000000 14.000000 8.000000 
+10.000000 18.000000 24.000000 63.000000 105.000000 107.000000 
+75.000000 39.000000 28.000000 45.000000 75.000000 103.000000 
+123.000000 129.000000 124.000000 118.000000 116.000000 117.000000 
+117.000000 117.000000 118.000000 118.000000 115.000000 109.000000 
+106.000000 108.000000 113.000000 121.000000 126.000000 125.000000 
+119.000000 115.000000 116.000000 121.000000 123.000000 122.000000 
+123.000000 127.000000 129.000000 124.000000 119.000000 121.000000 
+124.000000 113.000000 91.000000 74.000000 70.000000 69.000000 
+59.000000 34.000000 10.000000 7.000000 10.000000 11.000000 
+12.000000 7.000000 4.000000 9.000000 11.000000 6.000000 
+7.000000 9.000000 7.000000 8.000000 12.000000 17.000000 
+19.000000 29.000000 56.000000 77.000000 77.000000 79.000000 
+11.000000 11.000000 8.000000 8.000000 13.000000 22.000000 
+57.000000 105.000000 120.000000 95.000000 58.000000 38.000000 
+41.000000 60.000000 84.000000 105.000000 116.000000 116.000000 
+113.000000 114.000000 120.000000 123.000000 124.000000 124.000000 
+123.000000 120.000000 116.000000 115.000000 117.000000 120.000000 
+124.000000 128.000000 130.000000 129.000000 123.000000 118.000000 
+116.000000 118.000000 117.000000 114.000000 114.000000 121.000000 
+130.000000 133.000000 127.000000 123.000000 123.000000 120.000000 
+105.000000 84.000000 73.000000 73.000000 69.000000 47.000000 
+17.000000 7.000000 8.000000 9.000000 12.000000 11.000000 
+7.000000 6.000000 7.000000 8.000000 8.000000 7.000000 
+9.000000 12.000000 12.000000 13.000000 17.000000 17.000000 
+22.000000 35.000000 33.000000 34.000000 16.000000 18.000000 
+18.000000 15.000000 9.000000 23.000000 69.000000 101.000000 
+103.000000 80.000000 55.000000 43.000000 48.000000 68.000000 
+93.000000 113.000000 123.000000 125.000000 122.000000 116.000000 
+112.000000 113.000000 117.000000 121.000000 121.000000 117.000000 
+112.000000 110.000000 111.000000 116.000000 121.000000 123.000000 
+124.000000 124.000000 122.000000 116.000000 108.000000 106.000000 
+110.000000 116.000000 120.000000 120.000000 121.000000 123.000000 
+126.000000 129.000000 132.000000 130.000000 116.000000 94.000000 
+75.000000 68.000000 65.000000 56.000000 35.000000 10.000000 
+6.000000 9.000000 6.000000 6.000000 10.000000 9.000000 
+8.000000 8.000000 8.000000 8.000000 10.000000 13.000000 
+13.000000 10.000000 7.000000 9.000000 13.000000 18.000000 
+24.000000 16.000000 19.000000 21.000000 17.000000 9.000000 
+13.000000 44.000000 80.000000 102.000000 104.000000 87.000000 
+64.000000 54.000000 65.000000 92.000000 115.000000 122.000000 
+118.000000 114.000000 114.000000 115.000000 116.000000 114.000000 
+114.000000 117.000000 119.000000 118.000000 115.000000 115.000000 
+120.000000 124.000000 125.000000 124.000000 123.000000 123.000000 
+121.000000 117.000000 113.000000 112.000000 116.000000 121.000000 
+123.000000 119.000000 116.000000 120.000000 126.000000 127.000000 
+124.000000 124.000000 125.000000 114.000000 90.000000 67.000000 
+59.000000 61.000000 51.000000 26.000000 8.000000 4.000000 
+5.000000 7.000000 10.000000 9.000000 6.000000 4.000000 
+6.000000 7.000000 7.000000 8.000000 9.000000 9.000000 
+9.000000 10.000000 12.000000 12.000000 15.000000 21.000000 
+10.000000 12.000000 9.000000 10.000000 27.000000 48.000000 
+67.000000 89.000000 102.000000 91.000000 68.000000 60.000000 
+81.000000 110.000000 122.000000 118.000000 112.000000 114.000000 
+117.000000 118.000000 119.000000 121.000000 121.000000 121.000000 
+122.000000 121.000000 118.000000 116.000000 116.000000 120.000000 
+123.000000 123.000000 124.000000 124.000000 123.000000 121.000000 
+120.000000 121.000000 121.000000 122.000000 122.000000 121.000000 
+119.000000 119.000000 122.000000 123.000000 121.000000 119.000000 
+121.000000 121.000000 107.000000 84.000000 67.000000 62.000000 
+58.000000 42.000000 19.000000 7.000000 7.000000 9.000000 
+8.000000 7.000000 6.000000 5.000000 6.000000 8.000000 
+11.000000 11.000000 10.000000 10.000000 11.000000 11.000000 
+9.000000 9.000000 14.000000 17.000000 128.000000 143.000000 
+149.000000 134.000000 114.000000 116.000000 138.000000 144.000000 
+114.000000 67.000000 27.000000 6.000000 13.000000 26.000000 
+18.000000 7.000000 6.000000 7.000000 7.000000 8.000000 
+11.000000 12.000000 9.000000 9.000000 11.000000 13.000000 
+14.000000 15.000000 14.000000 10.000000 7.000000 8.000000 
+7.000000 6.000000 4.000000 5.000000 4.000000 7.000000 
+8.000000 6.000000 7.000000 9.000000 14.000000 17.000000 
+16.000000 12.000000 11.000000 10.000000 6.000000 7.000000 
+8.000000 6.000000 10.000000 11.000000 11.000000 24.000000 
+24.000000 8.000000 24.000000 53.000000 58.000000 49.000000 
+32.000000 19.000000 24.000000 29.000000 24.000000 22.000000 
+25.000000 25.000000 21.000000 22.000000 26.000000 27.000000 
+23.000000 20.000000 125.000000 126.000000 126.000000 130.000000 
+134.000000 135.000000 137.000000 138.000000 127.000000 99.000000 
+60.000000 26.000000 7.000000 7.000000 9.000000 8.000000 
+9.000000 4.000000 4.000000 7.000000 8.000000 6.000000 
+8.000000 9.000000 12.000000 13.000000 9.000000 8.000000 
+12.000000 15.000000 16.000000 15.000000 11.000000 4.000000 
+5.000000 10.000000 9.000000 6.000000 8.000000 10.000000 
+8.000000 14.000000 16.000000 12.000000 10.000000 11.000000 
+12.000000 9.000000 6.000000 8.000000 10.000000 6.000000 
+9.000000 12.000000 7.000000 13.000000 27.000000 24.000000 
+14.000000 24.000000 51.000000 57.000000 25.000000 14.000000 
+36.000000 34.000000 22.000000 22.000000 30.000000 34.000000 
+30.000000 27.000000 26.000000 24.000000 21.000000 25.000000 
+126.000000 126.000000 125.000000 128.000000 135.000000 135.000000 
+122.000000 108.000000 100.000000 92.000000 78.000000 55.000000 
+28.000000 10.000000 9.000000 10.000000 9.000000 11.000000 
+7.000000 7.000000 10.000000 13.000000 17.000000 11.000000 
+6.000000 7.000000 7.000000 11.000000 12.000000 11.000000 
+11.000000 10.000000 7.000000 5.000000 6.000000 9.000000 
+13.000000 9.000000 9.000000 13.000000 7.000000 10.000000 
+13.000000 11.000000 9.000000 7.000000 5.000000 4.000000 
+5.000000 8.000000 12.000000 10.000000 10.000000 6.000000 
+8.000000 21.000000 28.000000 16.000000 12.000000 38.000000 
+71.000000 74.000000 36.000000 23.000000 48.000000 53.000000 
+39.000000 28.000000 29.000000 35.000000 39.000000 40.000000 
+39.000000 33.000000 23.000000 16.000000 129.000000 131.000000 
+132.000000 131.000000 131.000000 129.000000 120.000000 108.000000 
+101.000000 95.000000 82.000000 61.000000 41.000000 27.000000 
+15.000000 7.000000 8.000000 12.000000 11.000000 5.000000 
+9.000000 9.000000 6.000000 8.000000 7.000000 7.000000 
+10.000000 10.000000 11.000000 12.000000 10.000000 9.000000 
+8.000000 7.000000 9.000000 8.000000 5.000000 9.000000 
+11.000000 10.000000 9.000000 9.000000 13.000000 14.000000 
+12.000000 9.000000 7.000000 6.000000 6.000000 6.000000 
+6.000000 9.000000 11.000000 11.000000 19.000000 20.000000 
+17.000000 21.000000 39.000000 70.000000 89.000000 77.000000 
+39.000000 27.000000 49.000000 62.000000 59.000000 46.000000 
+38.000000 36.000000 38.000000 40.000000 42.000000 42.000000 
+40.000000 34.000000 128.000000 129.000000 129.000000 129.000000 
+130.000000 131.000000 126.000000 117.000000 113.000000 111.000000 
+102.000000 80.000000 53.000000 38.000000 27.000000 12.000000 
+7.000000 9.000000 15.000000 12.000000 4.000000 10.000000 
+16.000000 14.000000 10.000000 10.000000 10.000000 6.000000 
+8.000000 10.000000 10.000000 11.000000 12.000000 10.000000 
+8.000000 11.000000 7.000000 9.000000 17.000000 15.000000 
+7.000000 10.000000 15.000000 15.000000 13.000000 11.000000 
+9.000000 9.000000 7.000000 6.000000 7.000000 11.000000 
+17.000000 20.000000 21.000000 17.000000 20.000000 28.000000 
+47.000000 76.000000 89.000000 72.000000 36.000000 17.000000 
+28.000000 46.000000 56.000000 56.000000 53.000000 53.000000 
+52.000000 48.000000 43.000000 40.000000 42.000000 45.000000 
+138.000000 139.000000 135.000000 128.000000 125.000000 129.000000 
+128.000000 119.000000 113.000000 116.000000 116.000000 99.000000 
+68.000000 48.000000 41.000000 23.000000 6.000000 11.000000 
+13.000000 17.000000 19.000000 18.000000 12.000000 12.000000 
+12.000000 10.000000 8.000000 8.000000 9.000000 8.000000 
+9.000000 13.000000 13.000000 10.000000 10.000000 9.000000 
+10.000000 15.000000 22.000000 21.000000 12.000000 9.000000 
+9.000000 9.000000 6.000000 5.000000 8.000000 12.000000 
+8.000000 8.000000 10.000000 12.000000 15.000000 15.000000 
+14.000000 18.000000 22.000000 23.000000 47.000000 81.000000 
+87.000000 62.000000 28.000000 9.000000 13.000000 32.000000 
+50.000000 61.000000 65.000000 66.000000 66.000000 61.000000 
+51.000000 40.000000 37.000000 39.000000 140.000000 139.000000 
+136.000000 129.000000 124.000000 127.000000 128.000000 121.000000 
+112.000000 117.000000 124.000000 115.000000 83.000000 51.000000 
+40.000000 33.000000 16.000000 18.000000 21.000000 18.000000 
+23.000000 24.000000 14.000000 11.000000 13.000000 14.000000 
+17.000000 18.000000 15.000000 11.000000 9.000000 12.000000 
+10.000000 12.000000 16.000000 10.000000 11.000000 17.000000 
+20.000000 17.000000 11.000000 6.000000 4.000000 8.000000 
+10.000000 8.000000 9.000000 13.000000 12.000000 10.000000 
+7.000000 10.000000 16.000000 21.000000 28.000000 34.000000 
+26.000000 27.000000 54.000000 77.000000 75.000000 54.000000 
+26.000000 10.000000 11.000000 26.000000 47.000000 62.000000 
+67.000000 67.000000 69.000000 73.000000 70.000000 59.000000 
+49.000000 43.000000 133.000000 135.000000 133.000000 128.000000 
+123.000000 127.000000 135.000000 134.000000 127.000000 123.000000 
+123.000000 116.000000 95.000000 71.000000 55.000000 44.000000 
+27.000000 19.000000 31.000000 34.000000 31.000000 26.000000 
+17.000000 10.000000 10.000000 9.000000 19.000000 23.000000 
+16.000000 8.000000 9.000000 8.000000 9.000000 13.000000 
+11.000000 9.000000 16.000000 20.000000 16.000000 12.000000 
+9.000000 8.000000 7.000000 7.000000 9.000000 8.000000 
+9.000000 8.000000 9.000000 8.000000 5.000000 10.000000 
+16.000000 23.000000 37.000000 47.000000 37.000000 47.000000 
+80.000000 85.000000 59.000000 30.000000 16.000000 13.000000 
+13.000000 14.000000 26.000000 46.000000 62.000000 68.000000 
+70.000000 72.000000 72.000000 65.000000 54.000000 45.000000 
+130.000000 131.000000 133.000000 131.000000 126.000000 123.000000 
+127.000000 133.000000 132.000000 125.000000 116.000000 107.000000 
+97.000000 86.000000 73.000000 59.000000 38.000000 16.000000 
+19.000000 33.000000 38.000000 33.000000 19.000000 12.000000 
+15.000000 11.000000 10.000000 14.000000 13.000000 9.000000 
+12.000000 11.000000 8.000000 9.000000 8.000000 9.000000 
+18.000000 25.000000 22.000000 15.000000 10.000000 9.000000 
+9.000000 8.000000 8.000000 8.000000 10.000000 8.000000 
+6.000000 7.000000 13.000000 21.000000 21.000000 19.000000 
+27.000000 39.000000 39.000000 59.000000 90.000000 86.000000 
+47.000000 15.000000 10.000000 17.000000 14.000000 8.000000 
+9.000000 16.000000 27.000000 43.000000 48.000000 43.000000 
+41.000000 44.000000 46.000000 42.000000 119.000000 121.000000 
+124.000000 126.000000 126.000000 126.000000 129.000000 135.000000 
+138.000000 135.000000 123.000000 107.000000 93.000000 84.000000 
+79.000000 70.000000 48.000000 19.000000 11.000000 29.000000 
+32.000000 25.000000 15.000000 11.000000 16.000000 16.000000 
+10.000000 7.000000 9.000000 9.000000 11.000000 9.000000 
+7.000000 10.000000 13.000000 13.000000 19.000000 27.000000 
+25.000000 16.000000 9.000000 11.000000 14.000000 15.000000 
+14.000000 12.000000 9.000000 8.000000 7.000000 5.000000 
+8.000000 14.000000 16.000000 18.000000 27.000000 32.000000 
+37.000000 59.000000 80.000000 75.000000 54.000000 43.000000 
+46.000000 46.000000 31.000000 10.000000 5.000000 10.000000 
+11.000000 13.000000 15.000000 13.000000 12.000000 21.000000 
+28.000000 25.000000 119.000000 120.000000 122.000000 125.000000 
+129.000000 131.000000 133.000000 137.000000 139.000000 134.000000 
+121.000000 106.000000 97.000000 94.000000 90.000000 76.000000 
+46.000000 14.000000 18.000000 34.000000 27.000000 12.000000 
+12.000000 15.000000 14.000000 16.000000 13.000000 7.000000 
+5.000000 4.000000 4.000000 3.000000 6.000000 11.000000 
+13.000000 15.000000 19.000000 19.000000 16.000000 14.000000 
+13.000000 17.000000 19.000000 16.000000 14.000000 14.000000 
+12.000000 8.000000 7.000000 9.000000 13.000000 15.000000 
+13.000000 14.000000 22.000000 31.000000 41.000000 59.000000 
+77.000000 83.000000 82.000000 88.000000 90.000000 82.000000 
+71.000000 52.000000 27.000000 13.000000 4.000000 0.000000 
+1.000000 6.000000 9.000000 16.000000 20.000000 15.000000 
+123.000000 123.000000 125.000000 128.000000 129.000000 129.000000 
+131.000000 133.000000 135.000000 132.000000 123.000000 109.000000 
+96.000000 90.000000 90.000000 83.000000 59.000000 26.000000 
+21.000000 25.000000 19.000000 11.000000 13.000000 18.000000 
+15.000000 14.000000 10.000000 6.000000 6.000000 9.000000 
+9.000000 7.000000 7.000000 7.000000 7.000000 12.000000 
+15.000000 12.000000 8.000000 11.000000 12.000000 12.000000 
+10.000000 9.000000 10.000000 12.000000 11.000000 9.000000 
+11.000000 16.000000 18.000000 18.000000 17.000000 14.000000 
+12.000000 21.000000 44.000000 71.000000 92.000000 100.000000 
+101.000000 100.000000 95.000000 94.000000 103.000000 101.000000 
+76.000000 48.000000 36.000000 33.000000 29.000000 23.000000 
+20.000000 16.000000 9.000000 7.000000 124.000000 122.000000 
+121.000000 119.000000 119.000000 123.000000 128.000000 131.000000 
+132.000000 136.000000 135.000000 120.000000 97.000000 82.000000 
+83.000000 88.000000 76.000000 48.000000 25.000000 20.000000 
+22.000000 24.000000 16.000000 16.000000 16.000000 7.000000 
+10.000000 12.000000 11.000000 10.000000 11.000000 11.000000 
+9.000000 12.000000 18.000000 23.000000 23.000000 19.000000 
+13.000000 9.000000 7.000000 10.000000 10.000000 10.000000 
+11.000000 10.000000 9.000000 11.000000 15.000000 15.000000 
+13.000000 12.000000 14.000000 15.000000 11.000000 21.000000 
+52.000000 84.000000 103.000000 108.000000 105.000000 99.000000 
+96.000000 102.000000 112.000000 110.000000 102.000000 98.000000 
+100.000000 99.000000 91.000000 84.000000 79.000000 71.000000 
+56.000000 46.000000 125.000000 123.000000 120.000000 117.000000 
+116.000000 123.000000 132.000000 136.000000 135.000000 137.000000 
+139.000000 130.000000 109.000000 92.000000 89.000000 92.000000 
+83.000000 60.000000 36.000000 22.000000 22.000000 27.000000 
+19.000000 20.000000 22.000000 13.000000 16.000000 17.000000 
+14.000000 15.000000 12.000000 7.000000 5.000000 11.000000 
+20.000000 24.000000 23.000000 17.000000 15.000000 11.000000 
+7.000000 8.000000 14.000000 15.000000 12.000000 10.000000 
+11.000000 12.000000 14.000000 15.000000 13.000000 14.000000 
+24.000000 31.000000 20.000000 27.000000 64.000000 96.000000 
+109.000000 112.000000 112.000000 109.000000 107.000000 109.000000 
+113.000000 115.000000 114.000000 115.000000 119.000000 123.000000 
+125.000000 129.000000 132.000000 130.000000 121.000000 106.000000 
+129.000000 126.000000 121.000000 118.000000 119.000000 124.000000 
+130.000000 136.000000 142.000000 147.000000 143.000000 127.000000 
+103.000000 88.000000 88.000000 92.000000 87.000000 68.000000 
+42.000000 22.000000 11.000000 11.000000 16.000000 19.000000 
+20.000000 19.000000 12.000000 11.000000 14.000000 18.000000 
+13.000000 5.000000 7.000000 6.000000 13.000000 23.000000 
+25.000000 18.000000 14.000000 13.000000 6.000000 3.000000 
+8.000000 13.000000 17.000000 18.000000 14.000000 15.000000 
+22.000000 24.000000 15.000000 15.000000 29.000000 44.000000 
+39.000000 37.000000 70.000000 106.000000 119.000000 119.000000 
+117.000000 114.000000 109.000000 108.000000 111.000000 118.000000 
+124.000000 125.000000 124.000000 123.000000 124.000000 126.000000 
+129.000000 128.000000 120.000000 110.000000 134.000000 129.000000 
+122.000000 121.000000 126.000000 129.000000 128.000000 127.000000 
+134.000000 143.000000 139.000000 118.000000 94.000000 87.000000 
+98.000000 107.000000 100.000000 75.000000 44.000000 23.000000 
+15.000000 10.000000 11.000000 10.000000 13.000000 17.000000 
+15.000000 18.000000 22.000000 20.000000 15.000000 12.000000 
+11.000000 9.000000 12.000000 16.000000 22.000000 21.000000 
+15.000000 9.000000 8.000000 10.000000 11.000000 15.000000 
+22.000000 23.000000 19.000000 22.000000 28.000000 29.000000 
+22.000000 19.000000 28.000000 41.000000 46.000000 59.000000 
+90.000000 114.000000 118.000000 113.000000 113.000000 117.000000 
+118.000000 114.000000 111.000000 114.000000 121.000000 125.000000 
+125.000000 121.000000 119.000000 120.000000 121.000000 118.000000 
+113.000000 109.000000 132.000000 132.000000 130.000000 127.000000 
+129.000000 132.000000 132.000000 130.000000 132.000000 136.000000 
+130.000000 109.000000 88.000000 88.000000 104.000000 114.000000 
+103.000000 75.000000 45.000000 36.000000 33.000000 24.000000 
+13.000000 7.000000 6.000000 10.000000 15.000000 26.000000 
+31.000000 26.000000 17.000000 14.000000 10.000000 10.000000 
+12.000000 8.000000 12.000000 24.000000 25.000000 16.000000 
+12.000000 14.000000 20.000000 22.000000 20.000000 17.000000 
+15.000000 15.000000 15.000000 19.000000 28.000000 32.000000 
+34.000000 36.000000 47.000000 74.000000 99.000000 107.000000 
+105.000000 106.000000 114.000000 122.000000 123.000000 119.000000 
+118.000000 121.000000 122.000000 119.000000 113.000000 111.000000 
+114.000000 115.000000 111.000000 107.000000 107.000000 111.000000 
+128.000000 133.000000 134.000000 131.000000 129.000000 128.000000 
+127.000000 127.000000 132.000000 135.000000 126.000000 100.000000 
+79.000000 84.000000 103.000000 113.000000 102.000000 78.000000 
+61.000000 58.000000 50.000000 36.000000 29.000000 25.000000 
+16.000000 9.000000 10.000000 20.000000 28.000000 24.000000 
+16.000000 12.000000 8.000000 9.000000 14.000000 15.000000 
+12.000000 21.000000 28.000000 24.000000 16.000000 15.000000 
+17.000000 18.000000 15.000000 10.000000 5.000000 6.000000 
+10.000000 20.000000 34.000000 41.000000 35.000000 36.000000 
+62.000000 93.000000 104.000000 101.000000 99.000000 109.000000 
+120.000000 122.000000 116.000000 115.000000 120.000000 125.000000 
+122.000000 115.000000 111.000000 110.000000 111.000000 109.000000 
+108.000000 108.000000 110.000000 114.000000 123.000000 129.000000 
+134.000000 135.000000 133.000000 128.000000 124.000000 126.000000 
+131.000000 128.000000 113.000000 90.000000 77.000000 88.000000 
+105.000000 112.000000 105.000000 88.000000 76.000000 71.000000 
+63.000000 50.000000 38.000000 34.000000 30.000000 22.000000 
+16.000000 12.000000 14.000000 17.000000 19.000000 17.000000 
+10.000000 13.000000 19.000000 20.000000 13.000000 14.000000 
+24.000000 29.000000 28.000000 28.000000 28.000000 21.000000 
+14.000000 19.000000 26.000000 23.000000 11.000000 0.000000 
+13.000000 33.000000 30.000000 45.000000 81.000000 105.000000 
+107.000000 98.000000 97.000000 107.000000 117.000000 118.000000 
+116.000000 116.000000 119.000000 121.000000 121.000000 119.000000 
+117.000000 116.000000 116.000000 115.000000 116.000000 116.000000 
+114.000000 114.000000 120.000000 122.000000 128.000000 133.000000 
+132.000000 127.000000 125.000000 131.000000 134.000000 124.000000 
+103.000000 83.000000 79.000000 92.000000 102.000000 102.000000 
+95.000000 85.000000 77.000000 70.000000 60.000000 48.000000 
+39.000000 34.000000 28.000000 21.000000 15.000000 7.000000 
+9.000000 27.000000 39.000000 40.000000 31.000000 27.000000 
+26.000000 23.000000 20.000000 21.000000 27.000000 33.000000 
+32.000000 31.000000 27.000000 15.000000 28.000000 63.000000 
+89.000000 109.000000 125.000000 108.000000 77.000000 47.000000 
+32.000000 59.000000 95.000000 102.000000 91.000000 88.000000 
+98.000000 108.000000 111.000000 112.000000 115.000000 116.000000 
+116.000000 119.000000 123.000000 121.000000 115.000000 114.000000 
+119.000000 124.000000 122.000000 117.000000 116.000000 119.000000 
+120.000000 118.000000 122.000000 129.000000 134.000000 133.000000 
+129.000000 126.000000 125.000000 120.000000 105.000000 89.000000 
+88.000000 101.000000 110.000000 108.000000 105.000000 109.000000 
+113.000000 100.000000 70.000000 45.000000 39.000000 40.000000 
+31.000000 17.000000 10.000000 13.000000 16.000000 24.000000 
+32.000000 34.000000 32.000000 26.000000 17.000000 12.000000 
+18.000000 21.000000 18.000000 15.000000 13.000000 16.000000 
+19.000000 28.000000 57.000000 83.000000 131.000000 220.000000 
+292.000000 279.000000 181.000000 90.000000 65.000000 81.000000 
+97.000000 99.000000 96.000000 100.000000 106.000000 105.000000 
+103.000000 108.000000 115.000000 118.000000 118.000000 117.000000 
+120.000000 121.000000 116.000000 111.000000 113.000000 119.000000 
+122.000000 119.000000 114.000000 112.000000 125.000000 125.000000 
+126.000000 126.000000 128.000000 131.000000 129.000000 122.000000 
+116.000000 109.000000 98.000000 93.000000 100.000000 108.000000 
+107.000000 108.000000 139.000000 202.000000 241.000000 211.000000 
+134.000000 68.000000 40.000000 32.000000 27.000000 18.000000 
+7.000000 14.000000 15.000000 6.000000 6.000000 7.000000 
+11.000000 14.000000 11.000000 4.000000 9.000000 13.000000 
+11.000000 5.000000 7.000000 17.000000 34.000000 55.000000 
+61.000000 74.000000 151.000000 260.000000 315.000000 282.000000 
+198.000000 127.000000 90.000000 79.000000 81.000000 92.000000 
+100.000000 99.000000 95.000000 94.000000 101.000000 110.000000 
+115.000000 118.000000 120.000000 120.000000 119.000000 117.000000 
+113.000000 107.000000 107.000000 114.000000 120.000000 119.000000 
+114.000000 109.000000 129.000000 131.000000 131.000000 126.000000 
+120.000000 117.000000 120.000000 121.000000 112.000000 96.000000 
+88.000000 96.000000 105.000000 98.000000 95.000000 132.000000 
+231.000000 359.000000 407.000000 328.000000 194.000000 102.000000 
+61.000000 33.000000 17.000000 8.000000 7.000000 12.000000 
+13.000000 14.000000 15.000000 12.000000 13.000000 15.000000 
+16.000000 9.000000 9.000000 13.000000 13.000000 17.000000 
+25.000000 31.000000 34.000000 35.000000 42.000000 96.000000 
+188.000000 265.000000 291.000000 273.000000 227.000000 160.000000 
+92.000000 55.000000 57.000000 76.000000 84.000000 81.000000 
+85.000000 99.000000 112.000000 115.000000 112.000000 112.000000 
+118.000000 121.000000 119.000000 116.000000 116.000000 116.000000 
+113.000000 109.000000 105.000000 105.000000 110.000000 114.000000 
+126.000000 130.000000 136.000000 138.000000 132.000000 124.000000 
+121.000000 116.000000 104.000000 93.000000 100.000000 112.000000 
+100.000000 77.000000 98.000000 187.000000 328.000000 442.000000 
+453.000000 360.000000 235.000000 143.000000 84.000000 46.000000 
+29.000000 21.000000 19.000000 16.000000 10.000000 8.000000 
+15.000000 15.000000 20.000000 21.000000 17.000000 18.000000 
+23.000000 24.000000 22.000000 24.000000 27.000000 28.000000 
+31.000000 32.000000 44.000000 95.000000 174.000000 246.000000 
+288.000000 288.000000 244.000000 170.000000 102.000000 69.000000 
+70.000000 79.000000 79.000000 77.000000 85.000000 102.000000 
+113.000000 116.000000 117.000000 119.000000 123.000000 125.000000 
+124.000000 122.000000 123.000000 121.000000 115.000000 108.000000 
+109.000000 114.000000 117.000000 114.000000 127.000000 130.000000 
+135.000000 138.000000 134.000000 127.000000 121.000000 112.000000 
+99.000000 95.000000 105.000000 113.000000 99.000000 85.000000 
+113.000000 188.000000 287.000000 364.000000 385.000000 352.000000 
+271.000000 167.000000 86.000000 51.000000 43.000000 42.000000 
+34.000000 24.000000 19.000000 14.000000 22.000000 29.000000 
+30.000000 26.000000 21.000000 23.000000 27.000000 31.000000 
+31.000000 28.000000 23.000000 21.000000 25.000000 35.000000 
+44.000000 67.000000 124.000000 203.000000 270.000000 284.000000 
+232.000000 148.000000 89.000000 80.000000 99.000000 108.000000 
+96.000000 81.000000 82.000000 95.000000 108.000000 114.000000 
+116.000000 117.000000 120.000000 123.000000 121.000000 116.000000 
+113.000000 113.000000 115.000000 115.000000 115.000000 117.000000 
+118.000000 118.000000 131.000000 130.000000 131.000000 129.000000 
+125.000000 121.000000 118.000000 110.000000 98.000000 92.000000 
+97.000000 108.000000 112.000000 106.000000 109.000000 131.000000 
+172.000000 233.000000 294.000000 306.000000 238.000000 131.000000 
+59.000000 37.000000 40.000000 46.000000 42.000000 39.000000 
+40.000000 41.000000 39.000000 34.000000 30.000000 28.000000 
+28.000000 27.000000 21.000000 23.000000 29.000000 34.000000 
+40.000000 42.000000 37.000000 33.000000 27.000000 39.000000 
+84.000000 136.000000 164.000000 158.000000 127.000000 91.000000 
+73.000000 80.000000 98.000000 104.000000 94.000000 83.000000 
+85.000000 97.000000 105.000000 106.000000 106.000000 108.000000 
+113.000000 115.000000 112.000000 107.000000 106.000000 112.000000 
+120.000000 125.000000 124.000000 121.000000 118.000000 116.000000 
+133.000000 134.000000 134.000000 132.000000 130.000000 130.000000 
+126.000000 113.000000 100.000000 98.000000 111.000000 126.000000 
+131.000000 121.000000 106.000000 102.000000 109.000000 133.000000 
+162.000000 161.000000 116.000000 58.000000 31.000000 39.000000 
+53.000000 53.000000 45.000000 43.000000 47.000000 49.000000 
+41.000000 31.000000 28.000000 36.000000 42.000000 39.000000 
+29.000000 21.000000 22.000000 28.000000 38.000000 44.000000 
+36.000000 21.000000 10.000000 20.000000 45.000000 68.000000 
+83.000000 86.000000 83.000000 80.000000 86.000000 104.000000 
+119.000000 117.000000 103.000000 90.000000 91.000000 100.000000 
+104.000000 102.000000 104.000000 109.000000 113.000000 111.000000 
+107.000000 107.000000 110.000000 115.000000 119.000000 122.000000 
+124.000000 124.000000 124.000000 122.000000 128.000000 126.000000 
+126.000000 127.000000 128.000000 126.000000 116.000000 103.000000 
+98.000000 107.000000 120.000000 126.000000 123.000000 119.000000 
+119.000000 119.000000 113.000000 97.000000 76.000000 60.000000 
+51.000000 48.000000 43.000000 43.000000 43.000000 43.000000 
+49.000000 52.000000 52.000000 51.000000 47.000000 44.000000 
+45.000000 49.000000 52.000000 47.000000 31.000000 17.000000 
+16.000000 23.000000 28.000000 27.000000 22.000000 20.000000 
+22.000000 25.000000 31.000000 48.000000 65.000000 73.000000 
+76.000000 83.000000 96.000000 108.000000 119.000000 125.000000 
+124.000000 113.000000 99.000000 93.000000 96.000000 104.000000 
+112.000000 115.000000 114.000000 112.000000 107.000000 106.000000 
+108.000000 113.000000 116.000000 117.000000 119.000000 124.000000 
+128.000000 129.000000 127.000000 126.000000 128.000000 130.000000 
+129.000000 122.000000 108.000000 99.000000 102.000000 115.000000 
+128.000000 133.000000 130.000000 122.000000 112.000000 105.000000 
+102.000000 98.000000 83.000000 61.000000 48.000000 49.000000 
+53.000000 48.000000 42.000000 46.000000 58.000000 65.000000 
+59.000000 47.000000 40.000000 40.000000 45.000000 51.000000 
+56.000000 57.000000 46.000000 27.000000 18.000000 22.000000 
+26.000000 24.000000 27.000000 39.000000 46.000000 34.000000 
+22.000000 30.000000 48.000000 61.000000 66.000000 74.000000 
+96.000000 122.000000 136.000000 137.000000 129.000000 116.000000 
+102.000000 94.000000 97.000000 103.000000 104.000000 102.000000 
+99.000000 98.000000 100.000000 107.000000 117.000000 124.000000 
+124.000000 119.000000 118.000000 122.000000 127.000000 127.000000 
+118.000000 116.000000 120.000000 127.000000 129.000000 122.000000 
+111.000000 108.000000 113.000000 120.000000 126.000000 132.000000 
+135.000000 130.000000 118.000000 108.000000 108.000000 103.000000 
+81.000000 51.000000 38.000000 44.000000 57.000000 60.000000 
+54.000000 50.000000 48.000000 49.000000 46.000000 29.000000 
+11.000000 7.000000 21.000000 40.000000 46.000000 44.000000 
+38.000000 33.000000 34.000000 36.000000 34.000000 33.000000 
+38.000000 46.000000 45.000000 33.000000 25.000000 19.000000 
+20.000000 29.000000 52.000000 81.000000 109.000000 134.000000 
+146.000000 145.000000 138.000000 130.000000 116.000000 100.000000 
+89.000000 87.000000 88.000000 91.000000 96.000000 101.000000 
+106.000000 111.000000 117.000000 123.000000 124.000000 120.000000 
+117.000000 119.000000 124.000000 126.000000 118.000000 117.000000 
+125.000000 133.000000 128.000000 110.000000 96.000000 100.000000 
+111.000000 118.000000 123.000000 131.000000 137.000000 128.000000 
+111.000000 103.000000 107.000000 107.000000 88.000000 57.000000 
+34.000000 27.000000 30.000000 38.000000 49.000000 50.000000 
+35.000000 28.000000 33.000000 39.000000 41.000000 39.000000 
+33.000000 33.000000 38.000000 36.000000 37.000000 39.000000 
+39.000000 39.000000 36.000000 31.000000 33.000000 44.000000 
+55.000000 62.000000 53.000000 22.000000 6.000000 4.000000 
+43.000000 99.000000 130.000000 137.000000 135.000000 133.000000 
+134.000000 133.000000 124.000000 110.000000 98.000000 89.000000 
+82.000000 74.000000 72.000000 82.000000 100.000000 113.000000 
+117.000000 118.000000 122.000000 124.000000 122.000000 118.000000 
+118.000000 120.000000 125.000000 128.000000 133.000000 130.000000 
+116.000000 99.000000 92.000000 97.000000 106.000000 115.000000 
+121.000000 126.000000 128.000000 122.000000 105.000000 90.000000 
+89.000000 99.000000 100.000000 82.000000 59.000000 44.000000 
+40.000000 40.000000 47.000000 48.000000 33.000000 23.000000 
+29.000000 104.000000 201.000000 243.000000 191.000000 99.000000 
+54.000000 49.000000 62.000000 57.000000 33.000000 22.000000 
+19.000000 23.000000 35.000000 55.000000 73.000000 80.000000 
+71.000000 48.000000 26.000000 11.000000 18.000000 53.000000 
+91.000000 111.000000 119.000000 125.000000 130.000000 129.000000 
+125.000000 119.000000 111.000000 99.000000 85.000000 74.000000 
+70.000000 75.000000 91.000000 112.000000 126.000000 126.000000 
+121.000000 119.000000 120.000000 118.000000 113.000000 112.000000 
+121.000000 131.000000 137.000000 125.000000 104.000000 92.000000 
+96.000000 103.000000 104.000000 109.000000 121.000000 131.000000 
+130.000000 116.000000 98.000000 84.000000 81.000000 81.000000 
+77.000000 63.000000 52.000000 57.000000 69.000000 77.000000 
+80.000000 80.000000 68.000000 47.000000 44.000000 168.000000 
+352.000000 458.000000 392.000000 209.000000 71.000000 41.000000 
+74.000000 96.000000 75.000000 42.000000 31.000000 44.000000 
+64.000000 82.000000 87.000000 79.000000 66.000000 57.000000 
+51.000000 45.000000 27.000000 19.000000 46.000000 87.000000 
+115.000000 127.000000 129.000000 128.000000 126.000000 119.000000 
+109.000000 97.000000 87.000000 82.000000 81.000000 87.000000 
+102.000000 120.000000 130.000000 124.000000 110.000000 105.000000 
+111.000000 120.000000 123.000000 125.000000 123.000000 132.000000 
+131.000000 119.000000 102.000000 95.000000 99.000000 106.000000 
+104.000000 99.000000 98.000000 104.000000 106.000000 95.000000 
+84.000000 86.000000 97.000000 103.000000 97.000000 85.000000 
+77.000000 75.000000 79.000000 87.000000 88.000000 72.000000 
+49.000000 44.000000 72.000000 177.000000 315.000000 390.000000 
+342.000000 214.000000 106.000000 67.000000 65.000000 69.000000 
+63.000000 59.000000 68.000000 81.000000 85.000000 84.000000 
+85.000000 89.000000 88.000000 85.000000 87.000000 86.000000 
+68.000000 35.000000 19.000000 51.000000 103.000000 133.000000 
+136.000000 131.000000 131.000000 128.000000 115.000000 96.000000 
+83.000000 79.000000 84.000000 98.000000 115.000000 126.000000 
+124.000000 115.000000 109.000000 110.000000 114.000000 119.000000 
+122.000000 124.000000 116.000000 126.000000 125.000000 117.000000 
+106.000000 98.000000 93.000000 91.000000 92.000000 94.000000 
+91.000000 79.000000 70.000000 74.000000 84.000000 98.000000 
+111.000000 117.000000 112.000000 101.000000 91.000000 83.000000 
+75.000000 70.000000 65.000000 54.000000 42.000000 48.000000 
+77.000000 149.000000 227.000000 254.000000 215.000000 146.000000 
+94.000000 72.000000 68.000000 67.000000 62.000000 61.000000 
+72.000000 91.000000 100.000000 95.000000 91.000000 96.000000 
+107.000000 116.000000 119.000000 110.000000 88.000000 59.000000 
+14.000000 23.000000 80.000000 119.000000 130.000000 127.000000 
+126.000000 130.000000 127.000000 109.000000 89.000000 84.000000 
+98.000000 115.000000 121.000000 118.000000 112.000000 113.000000 
+118.000000 121.000000 121.000000 121.000000 122.000000 124.000000 
+119.000000 110.000000 106.000000 104.000000 101.000000 95.000000 
+86.000000 77.000000 76.000000 82.000000 80.000000 52.000000 
+24.000000 36.000000 52.000000 66.000000 86.000000 96.000000 
+97.000000 94.000000 80.000000 63.000000 51.000000 49.000000 
+55.000000 60.000000 58.000000 58.000000 72.000000 102.000000 
+133.000000 138.000000 115.000000 87.000000 73.000000 70.000000 
+69.000000 65.000000 58.000000 58.000000 67.000000 83.000000 
+93.000000 87.000000 77.000000 80.000000 101.000000 123.000000 
+131.000000 125.000000 114.000000 92.000000 42.000000 21.000000 
+46.000000 76.000000 104.000000 124.000000 126.000000 127.000000 
+134.000000 131.000000 110.000000 91.000000 98.000000 117.000000 
+120.000000 108.000000 101.000000 111.000000 130.000000 138.000000 
+132.000000 121.000000 114.000000 115.000000 109.000000 93.000000 
+92.000000 98.000000 97.000000 91.000000 84.000000 83.000000 
+89.000000 93.000000 83.000000 59.000000 45.000000 51.000000 
+60.000000 84.000000 115.000000 117.000000 95.000000 70.000000 
+54.000000 56.000000 69.000000 76.000000 78.000000 82.000000 
+88.000000 91.000000 90.000000 88.000000 87.000000 87.000000 
+82.000000 76.000000 76.000000 80.000000 81.000000 75.000000 
+72.000000 72.000000 70.000000 64.000000 60.000000 63.000000 
+73.000000 84.000000 91.000000 97.000000 101.000000 107.000000 
+106.000000 91.000000 61.000000 35.000000 23.000000 29.000000 
+55.000000 88.000000 116.000000 129.000000 131.000000 129.000000 
+120.000000 104.000000 96.000000 108.000000 124.000000 127.000000 
+120.000000 118.000000 126.000000 134.000000 131.000000 123.000000 
+119.000000 119.000000 90.000000 81.000000 83.000000 85.000000 
+87.000000 87.000000 86.000000 91.000000 104.000000 108.000000 
+91.000000 74.000000 77.000000 78.000000 84.000000 115.000000 
+141.000000 134.000000 102.000000 73.000000 66.000000 79.000000 
+97.000000 113.000000 123.000000 126.000000 125.000000 123.000000 
+121.000000 115.000000 101.000000 85.000000 76.000000 79.000000 
+91.000000 107.000000 117.000000 118.000000 110.000000 101.000000 
+95.000000 87.000000 73.000000 65.000000 71.000000 84.000000 
+90.000000 86.000000 85.000000 89.000000 80.000000 61.000000 
+47.000000 34.000000 13.000000 13.000000 28.000000 43.000000 
+73.000000 104.000000 113.000000 105.000000 103.000000 106.000000 
+105.000000 104.000000 111.000000 119.000000 121.000000 120.000000 
+121.000000 125.000000 128.000000 125.000000 120.000000 113.000000 
+63.000000 58.000000 62.000000 75.000000 85.000000 84.000000 
+84.000000 94.000000 105.000000 111.000000 107.000000 97.000000 
+98.000000 106.000000 119.000000 130.000000 126.000000 110.000000 
+97.000000 96.000000 109.000000 125.000000 133.000000 133.000000 
+130.000000 128.000000 128.000000 129.000000 131.000000 130.000000 
+126.000000 121.000000 119.000000 123.000000 129.000000 135.000000 
+136.000000 132.000000 126.000000 123.000000 126.000000 128.000000 
+119.000000 102.000000 87.000000 83.000000 86.000000 92.000000 
+99.000000 96.000000 69.000000 26.000000 9.000000 14.000000 
+20.000000 15.000000 11.000000 11.000000 4.000000 21.000000 
+53.000000 62.000000 56.000000 60.000000 81.000000 101.000000 
+114.000000 123.000000 131.000000 135.000000 129.000000 120.000000 
+115.000000 114.000000 114.000000 110.000000 19.000000 26.000000 
+45.000000 61.000000 63.000000 70.000000 96.000000 119.000000 
+118.000000 112.000000 107.000000 94.000000 82.000000 88.000000 
+109.000000 117.000000 111.000000 107.000000 110.000000 122.000000 
+134.000000 140.000000 139.000000 132.000000 124.000000 120.000000 
+122.000000 126.000000 130.000000 133.000000 137.000000 140.000000 
+142.000000 140.000000 136.000000 132.000000 132.000000 135.000000 
+140.000000 142.000000 139.000000 134.000000 130.000000 122.000000 
+107.000000 85.000000 66.000000 59.000000 63.000000 65.000000 
+57.000000 43.000000 27.000000 14.000000 11.000000 18.000000 
+19.000000 11.000000 6.000000 6.000000 12.000000 18.000000 
+9.000000 0.000000 9.000000 40.000000 81.000000 111.000000 
+124.000000 126.000000 127.000000 127.000000 123.000000 117.000000 
+114.000000 117.000000 20.000000 19.000000 20.000000 19.000000 
+27.000000 55.000000 78.000000 72.000000 63.000000 74.000000 
+81.000000 80.000000 89.000000 102.000000 100.000000 86.000000 
+82.000000 100.000000 126.000000 140.000000 139.000000 132.000000 
+128.000000 127.000000 127.000000 127.000000 128.000000 128.000000 
+130.000000 135.000000 139.000000 139.000000 136.000000 132.000000 
+130.000000 130.000000 131.000000 134.000000 138.000000 138.000000 
+133.000000 131.000000 133.000000 130.000000 115.000000 89.000000 
+67.000000 61.000000 72.000000 85.000000 79.000000 54.000000 
+35.000000 24.000000 26.000000 37.000000 37.000000 21.000000 
+10.000000 10.000000 11.000000 9.000000 6.000000 10.000000 
+11.000000 14.000000 36.000000 73.000000 113.000000 134.000000 
+131.000000 120.000000 114.000000 115.000000 117.000000 118.000000 
+20.000000 8.000000 2.000000 10.000000 29.000000 47.000000 
+49.000000 33.000000 28.000000 54.000000 77.000000 82.000000 
+71.000000 57.000000 54.000000 63.000000 76.000000 91.000000 
+109.000000 122.000000 128.000000 127.000000 124.000000 123.000000 
+125.000000 127.000000 127.000000 126.000000 123.000000 122.000000 
+123.000000 125.000000 125.000000 126.000000 130.000000 135.000000 
+136.000000 131.000000 127.000000 128.000000 133.000000 136.000000 
+134.000000 131.000000 126.000000 116.000000 96.000000 70.000000 
+51.000000 53.000000 67.000000 70.000000 50.000000 25.000000 
+16.000000 20.000000 21.000000 15.000000 9.000000 8.000000 
+9.000000 10.000000 13.000000 14.000000 12.000000 22.000000 
+34.000000 41.000000 74.000000 115.000000 133.000000 132.000000 
+129.000000 125.000000 118.000000 112.000000 9.000000 9.000000 
+11.000000 22.000000 29.000000 16.000000 9.000000 40.000000 
+77.000000 98.000000 94.000000 74.000000 53.000000 46.000000 
+60.000000 79.000000 97.000000 112.000000 124.000000 133.000000 
+134.000000 130.000000 127.000000 125.000000 123.000000 120.000000 
+118.000000 117.000000 118.000000 119.000000 121.000000 125.000000 
+129.000000 134.000000 137.000000 136.000000 132.000000 127.000000 
+125.000000 126.000000 128.000000 126.000000 121.000000 119.000000 
+124.000000 129.000000 122.000000 99.000000 78.000000 71.000000 
+68.000000 64.000000 50.000000 28.000000 11.000000 9.000000 
+13.000000 7.000000 9.000000 22.000000 27.000000 23.000000 
+17.000000 15.000000 16.000000 22.000000 38.000000 42.000000 
+45.000000 86.000000 130.000000 144.000000 134.000000 118.000000 
+113.000000 113.000000 11.000000 6.000000 13.000000 33.000000 
+40.000000 36.000000 38.000000 67.000000 109.000000 122.000000 
+95.000000 53.000000 32.000000 41.000000 68.000000 94.000000 
+113.000000 127.000000 131.000000 126.000000 122.000000 121.000000 
+121.000000 121.000000 122.000000 125.000000 125.000000 119.000000 
+115.000000 114.000000 112.000000 110.000000 116.000000 129.000000 
+138.000000 136.000000 127.000000 123.000000 124.000000 125.000000 
+124.000000 123.000000 123.000000 123.000000 128.000000 136.000000 
+136.000000 121.000000 97.000000 77.000000 65.000000 58.000000 
+54.000000 42.000000 19.000000 8.000000 10.000000 14.000000 
+20.000000 25.000000 32.000000 32.000000 25.000000 13.000000 
+4.000000 14.000000 26.000000 31.000000 38.000000 59.000000 
+92.000000 123.000000 135.000000 127.000000 114.000000 106.000000 
+7.000000 13.000000 24.000000 30.000000 26.000000 21.000000 
+48.000000 101.000000 132.000000 123.000000 85.000000 49.000000 
+37.000000 50.000000 76.000000 102.000000 121.000000 128.000000 
+126.000000 121.000000 121.000000 124.000000 125.000000 124.000000 
+120.000000 118.000000 118.000000 118.000000 119.000000 117.000000 
+116.000000 117.000000 123.000000 129.000000 132.000000 129.000000 
+125.000000 122.000000 122.000000 124.000000 126.000000 127.000000 
+129.000000 127.000000 123.000000 123.000000 128.000000 126.000000 
+107.000000 80.000000 61.000000 59.000000 60.000000 48.000000 
+27.000000 12.000000 9.000000 8.000000 5.000000 5.000000 
+8.000000 6.000000 4.000000 6.000000 5.000000 5.000000 
+13.000000 22.000000 33.000000 45.000000 56.000000 86.000000 
+125.000000 144.000000 130.000000 108.000000 13.000000 15.000000 
+22.000000 30.000000 28.000000 32.000000 76.000000 126.000000 
+140.000000 113.000000 72.000000 44.000000 42.000000 63.000000 
+92.000000 116.000000 126.000000 126.000000 125.000000 126.000000 
+126.000000 125.000000 124.000000 125.000000 125.000000 124.000000 
+120.000000 115.000000 109.000000 105.000000 109.000000 118.000000 
+125.000000 125.000000 123.000000 122.000000 121.000000 118.000000 
+116.000000 120.000000 125.000000 130.000000 133.000000 134.000000 
+131.000000 128.000000 128.000000 128.000000 115.000000 87.000000 
+63.000000 57.000000 63.000000 61.000000 40.000000 17.000000 
+10.000000 11.000000 10.000000 7.000000 5.000000 7.000000 
+10.000000 11.000000 12.000000 10.000000 8.000000 12.000000 
+14.000000 18.000000 26.000000 49.000000 88.000000 117.000000 
+120.000000 110.000000 7.000000 15.000000 23.000000 27.000000 
+32.000000 56.000000 97.000000 127.000000 126.000000 100.000000 
+69.000000 54.000000 61.000000 79.000000 100.000000 117.000000 
+128.000000 131.000000 128.000000 123.000000 120.000000 120.000000 
+123.000000 125.000000 125.000000 125.000000 126.000000 127.000000 
+126.000000 124.000000 122.000000 123.000000 126.000000 126.000000 
+124.000000 120.000000 118.000000 116.000000 115.000000 119.000000 
+125.000000 129.000000 126.000000 119.000000 116.000000 119.000000 
+126.000000 130.000000 124.000000 104.000000 77.000000 58.000000 
+55.000000 55.000000 47.000000 30.000000 14.000000 9.000000 
+11.000000 12.000000 9.000000 6.000000 6.000000 8.000000 
+10.000000 13.000000 9.000000 9.000000 11.000000 8.000000 
+18.000000 30.000000 33.000000 47.000000 79.000000 99.000000 
+13.000000 16.000000 23.000000 29.000000 45.000000 69.000000 
+94.000000 113.000000 120.000000 107.000000 82.000000 65.000000 
+73.000000 101.000000 124.000000 128.000000 120.000000 116.000000 
+117.000000 119.000000 118.000000 117.000000 119.000000 125.000000 
+131.000000 131.000000 125.000000 119.000000 118.000000 121.000000 
+125.000000 126.000000 126.000000 125.000000 124.000000 121.000000 
+119.000000 121.000000 123.000000 122.000000 120.000000 120.000000 
+122.000000 124.000000 123.000000 121.000000 124.000000 131.000000 
+135.000000 123.000000 94.000000 68.000000 63.000000 71.000000 
+71.000000 52.000000 23.000000 8.000000 7.000000 6.000000 
+6.000000 9.000000 10.000000 9.000000 8.000000 7.000000 
+5.000000 7.000000 9.000000 9.000000 9.000000 14.000000 
+17.000000 18.000000 31.000000 52.000000 31.000000 33.000000 
+23.000000 29.000000 58.000000 83.000000 100.000000 112.000000 
+115.000000 102.000000 80.000000 73.000000 91.000000 118.000000 
+129.000000 124.000000 116.000000 114.000000 116.000000 117.000000 
+120.000000 125.000000 127.000000 126.000000 124.000000 123.000000 
+122.000000 122.000000 124.000000 125.000000 124.000000 123.000000 
+124.000000 125.000000 123.000000 120.000000 119.000000 119.000000 
+117.000000 113.000000 114.000000 120.000000 126.000000 127.000000 
+125.000000 121.000000 119.000000 118.000000 122.000000 124.000000 
+115.000000 101.000000 98.000000 107.000000 107.000000 83.000000 
+40.000000 9.000000 5.000000 10.000000 9.000000 9.000000 
+9.000000 7.000000 5.000000 8.000000 9.000000 9.000000 
+8.000000 9.000000 14.000000 10.000000 7.000000 10.000000 
+13.000000 20.000000 124.000000 128.000000 135.000000 139.000000 
+140.000000 142.000000 143.000000 135.000000 115.000000 83.000000 
+38.000000 11.000000 33.000000 44.000000 23.000000 10.000000 
+22.000000 19.000000 11.000000 10.000000 11.000000 10.000000 
+12.000000 14.000000 13.000000 8.000000 7.000000 11.000000 
+12.000000 11.000000 14.000000 16.000000 15.000000 11.000000 
+8.000000 5.000000 8.000000 10.000000 14.000000 13.000000 
+8.000000 15.000000 18.000000 8.000000 4.000000 5.000000 
+7.000000 6.000000 5.000000 8.000000 12.000000 8.000000 
+5.000000 6.000000 10.000000 13.000000 9.000000 25.000000 
+57.000000 74.000000 70.000000 51.000000 21.000000 16.000000 
+34.000000 37.000000 32.000000 32.000000 33.000000 35.000000 
+34.000000 31.000000 26.000000 21.000000 24.000000 33.000000 
+128.000000 135.000000 137.000000 133.000000 129.000000 130.000000 
+131.000000 123.000000 107.000000 90.000000 66.000000 33.000000 
+19.000000 25.000000 12.000000 12.000000 23.000000 11.000000 
+10.000000 8.000000 7.000000 12.000000 11.000000 11.000000 
+11.000000 7.000000 6.000000 7.000000 9.000000 13.000000 
+14.000000 15.000000 10.000000 6.000000 6.000000 8.000000 
+10.000000 9.000000 9.000000 7.000000 7.000000 14.000000 
+15.000000 9.000000 6.000000 9.000000 12.000000 11.000000 
+9.000000 11.000000 12.000000 9.000000 9.000000 9.000000 
+6.000000 6.000000 8.000000 17.000000 31.000000 45.000000 
+47.000000 24.000000 17.000000 46.000000 58.000000 46.000000 
+33.000000 29.000000 30.000000 34.000000 37.000000 36.000000 
+29.000000 23.000000 22.000000 27.000000 128.000000 131.000000 
+130.000000 127.000000 124.000000 121.000000 120.000000 119.000000 
+115.000000 103.000000 83.000000 51.000000 25.000000 23.000000 
+20.000000 11.000000 10.000000 12.000000 9.000000 9.000000 
+10.000000 9.000000 11.000000 12.000000 13.000000 14.000000 
+12.000000 8.000000 9.000000 12.000000 13.000000 13.000000 
+9.000000 8.000000 9.000000 11.000000 14.000000 11.000000 
+9.000000 8.000000 8.000000 8.000000 10.000000 9.000000 
+7.000000 10.000000 13.000000 11.000000 7.000000 8.000000 
+9.000000 11.000000 12.000000 8.000000 6.000000 8.000000 
+11.000000 12.000000 15.000000 26.000000 26.000000 5.000000 
+20.000000 52.000000 55.000000 42.000000 28.000000 21.000000 
+20.000000 21.000000 27.000000 37.000000 42.000000 42.000000 
+36.000000 29.000000 129.000000 128.000000 125.000000 126.000000 
+129.000000 128.000000 125.000000 127.000000 132.000000 124.000000 
+96.000000 60.000000 37.000000 32.000000 25.000000 14.000000 
+6.000000 11.000000 10.000000 6.000000 7.000000 8.000000 
+12.000000 15.000000 12.000000 11.000000 9.000000 6.000000 
+9.000000 11.000000 9.000000 8.000000 8.000000 7.000000 
+10.000000 12.000000 13.000000 10.000000 9.000000 9.000000 
+9.000000 7.000000 8.000000 7.000000 7.000000 11.000000 
+12.000000 9.000000 8.000000 10.000000 10.000000 10.000000 
+8.000000 12.000000 15.000000 14.000000 17.000000 14.000000 
+11.000000 14.000000 16.000000 18.000000 31.000000 42.000000 
+44.000000 41.000000 36.000000 29.000000 21.000000 19.000000 
+27.000000 39.000000 50.000000 55.000000 56.000000 50.000000 
+138.000000 141.000000 136.000000 131.000000 130.000000 130.000000 
+123.000000 115.000000 114.000000 118.000000 106.000000 74.000000 
+44.000000 38.000000 36.000000 23.000000 12.000000 9.000000 
+15.000000 13.000000 10.000000 12.000000 9.000000 7.000000 
+11.000000 11.000000 9.000000 8.000000 11.000000 13.000000 
+11.000000 11.000000 12.000000 11.000000 12.000000 12.000000 
+10.000000 7.000000 10.000000 9.000000 9.000000 11.000000 
+11.000000 11.000000 10.000000 9.000000 9.000000 9.000000 
+10.000000 11.000000 15.000000 11.000000 8.000000 17.000000 
+21.000000 16.000000 13.000000 10.000000 16.000000 24.000000 
+25.000000 26.000000 29.000000 29.000000 29.000000 31.000000 
+35.000000 36.000000 32.000000 31.000000 34.000000 39.000000 
+43.000000 45.000000 45.000000 45.000000 135.000000 139.000000 
+139.000000 134.000000 131.000000 131.000000 129.000000 118.000000 
+107.000000 107.000000 109.000000 94.000000 62.000000 45.000000 
+47.000000 39.000000 26.000000 17.000000 15.000000 22.000000 
+23.000000 20.000000 26.000000 22.000000 12.000000 9.000000 
+15.000000 16.000000 11.000000 7.000000 9.000000 11.000000 
+12.000000 14.000000 15.000000 12.000000 6.000000 7.000000 
+11.000000 10.000000 8.000000 9.000000 11.000000 11.000000 
+12.000000 9.000000 6.000000 5.000000 6.000000 9.000000 
+12.000000 9.000000 13.000000 24.000000 29.000000 19.000000 
+8.000000 14.000000 32.000000 45.000000 47.000000 40.000000 
+30.000000 18.000000 11.000000 13.000000 21.000000 33.000000 
+44.000000 51.000000 52.000000 51.000000 49.000000 45.000000 
+41.000000 38.000000 131.000000 134.000000 136.000000 135.000000 
+133.000000 133.000000 136.000000 135.000000 127.000000 117.000000 
+110.000000 102.000000 85.000000 67.000000 60.000000 55.000000 
+36.000000 15.000000 11.000000 18.000000 18.000000 15.000000 
+16.000000 16.000000 12.000000 11.000000 12.000000 15.000000 
+13.000000 7.000000 8.000000 6.000000 7.000000 9.000000 
+7.000000 8.000000 11.000000 17.000000 17.000000 13.000000 
+12.000000 9.000000 7.000000 7.000000 9.000000 10.000000 
+9.000000 8.000000 7.000000 8.000000 8.000000 5.000000 
+11.000000 22.000000 29.000000 26.000000 13.000000 22.000000 
+41.000000 44.000000 40.000000 35.000000 19.000000 10.000000 
+10.000000 7.000000 15.000000 33.000000 46.000000 51.000000 
+49.000000 43.000000 37.000000 30.000000 28.000000 31.000000 
+132.000000 137.000000 135.000000 132.000000 131.000000 133.000000 
+135.000000 136.000000 138.000000 133.000000 120.000000 102.000000 
+87.000000 77.000000 68.000000 57.000000 38.000000 15.000000 
+11.000000 27.000000 30.000000 24.000000 14.000000 15.000000 
+14.000000 14.000000 15.000000 14.000000 10.000000 8.000000 
+9.000000 11.000000 14.000000 15.000000 11.000000 6.000000 
+9.000000 13.000000 14.000000 13.000000 12.000000 11.000000 
+8.000000 10.000000 10.000000 7.000000 10.000000 10.000000 
+8.000000 8.000000 7.000000 8.000000 20.000000 31.000000 
+33.000000 22.000000 26.000000 51.000000 62.000000 44.000000 
+18.000000 4.000000 0.000000 5.000000 17.000000 16.000000 
+17.000000 34.000000 44.000000 35.000000 25.000000 28.000000 
+39.000000 43.000000 35.000000 28.000000 117.000000 115.000000 
+119.000000 124.000000 128.000000 131.000000 136.000000 142.000000 
+146.000000 142.000000 126.000000 102.000000 82.000000 74.000000 
+72.000000 63.000000 42.000000 18.000000 11.000000 36.000000 
+46.000000 34.000000 14.000000 13.000000 14.000000 11.000000 
+13.000000 10.000000 9.000000 8.000000 5.000000 8.000000 
+13.000000 16.000000 12.000000 11.000000 14.000000 11.000000 
+6.000000 7.000000 8.000000 9.000000 9.000000 12.000000 
+12.000000 8.000000 6.000000 8.000000 8.000000 8.000000 
+11.000000 19.000000 31.000000 35.000000 27.000000 16.000000 
+34.000000 65.000000 78.000000 74.000000 61.000000 50.000000 
+47.000000 47.000000 42.000000 26.000000 11.000000 13.000000 
+21.000000 19.000000 20.000000 31.000000 43.000000 43.000000 
+35.000000 34.000000 119.000000 118.000000 122.000000 128.000000 
+131.000000 132.000000 135.000000 138.000000 139.000000 133.000000 
+121.000000 105.000000 91.000000 83.000000 79.000000 69.000000 
+47.000000 19.000000 7.000000 33.000000 56.000000 60.000000 
+40.000000 16.000000 7.000000 8.000000 13.000000 11.000000 
+9.000000 8.000000 8.000000 9.000000 8.000000 10.000000 
+7.000000 11.000000 19.000000 16.000000 9.000000 8.000000 
+10.000000 9.000000 7.000000 10.000000 12.000000 9.000000 
+7.000000 9.000000 12.000000 15.000000 18.000000 24.000000 
+31.000000 30.000000 16.000000 15.000000 35.000000 55.000000 
+74.000000 99.000000 119.000000 123.000000 113.000000 94.000000 
+73.000000 51.000000 29.000000 11.000000 2.000000 5.000000 
+14.000000 22.000000 21.000000 18.000000 22.000000 28.000000 
+137.000000 136.000000 132.000000 127.000000 126.000000 128.000000 
+133.000000 136.000000 135.000000 130.000000 124.000000 115.000000 
+102.000000 89.000000 83.000000 78.000000 61.000000 28.000000 
+4.000000 23.000000 42.000000 49.000000 34.000000 14.000000 
+11.000000 15.000000 20.000000 13.000000 6.000000 6.000000 
+8.000000 14.000000 10.000000 9.000000 11.000000 11.000000 
+14.000000 13.000000 10.000000 10.000000 9.000000 7.000000 
+6.000000 8.000000 10.000000 10.000000 7.000000 9.000000 
+19.000000 22.000000 20.000000 19.000000 27.000000 30.000000 
+8.000000 17.000000 46.000000 62.000000 82.000000 110.000000 
+133.000000 135.000000 121.000000 107.000000 101.000000 89.000000 
+62.000000 34.000000 21.000000 20.000000 22.000000 20.000000 
+14.000000 10.000000 12.000000 13.000000 135.000000 131.000000 
+126.000000 123.000000 122.000000 125.000000 129.000000 134.000000 
+138.000000 137.000000 131.000000 121.000000 107.000000 92.000000 
+85.000000 84.000000 75.000000 48.000000 19.000000 17.000000 
+17.000000 15.000000 6.000000 9.000000 21.000000 23.000000 
+21.000000 13.000000 10.000000 7.000000 7.000000 12.000000 
+10.000000 9.000000 13.000000 14.000000 9.000000 7.000000 
+8.000000 7.000000 8.000000 12.000000 14.000000 13.000000 
+11.000000 8.000000 6.000000 11.000000 18.000000 20.000000 
+18.000000 13.000000 22.000000 30.000000 9.000000 18.000000 
+54.000000 83.000000 103.000000 115.000000 119.000000 116.000000 
+114.000000 119.000000 128.000000 124.000000 105.000000 82.000000 
+65.000000 56.000000 50.000000 45.000000 42.000000 37.000000 
+25.000000 13.000000 134.000000 131.000000 125.000000 118.000000 
+116.000000 119.000000 123.000000 128.000000 136.000000 142.000000 
+137.000000 118.000000 96.000000 83.000000 80.000000 82.000000 
+80.000000 65.000000 39.000000 16.000000 7.000000 8.000000 
+11.000000 13.000000 19.000000 18.000000 15.000000 13.000000 
+13.000000 8.000000 8.000000 8.000000 9.000000 13.000000 
+14.000000 13.000000 8.000000 7.000000 8.000000 9.000000 
+12.000000 17.000000 17.000000 14.000000 11.000000 8.000000 
+7.000000 7.000000 10.000000 14.000000 14.000000 16.000000 
+29.000000 37.000000 23.000000 23.000000 62.000000 103.000000 
+117.000000 113.000000 109.000000 111.000000 115.000000 119.000000 
+125.000000 131.000000 131.000000 123.000000 114.000000 110.000000 
+110.000000 112.000000 113.000000 105.000000 88.000000 67.000000 
+132.000000 134.000000 129.000000 117.000000 113.000000 121.000000 
+131.000000 135.000000 137.000000 141.000000 137.000000 116.000000 
+88.000000 77.000000 85.000000 93.000000 88.000000 69.000000 
+43.000000 21.000000 11.000000 7.000000 12.000000 17.000000 
+19.000000 16.000000 7.000000 4.000000 10.000000 13.000000 
+11.000000 7.000000 8.000000 12.000000 12.000000 11.000000 
+11.000000 10.000000 10.000000 10.000000 8.000000 12.000000 
+16.000000 12.000000 12.000000 18.000000 16.000000 11.000000 
+16.000000 19.000000 13.000000 15.000000 23.000000 31.000000 
+32.000000 45.000000 84.000000 115.000000 119.000000 113.000000 
+114.000000 117.000000 114.000000 109.000000 112.000000 121.000000 
+127.000000 128.000000 129.000000 134.000000 143.000000 149.000000 
+148.000000 137.000000 125.000000 120.000000 127.000000 132.000000 
+131.000000 123.000000 118.000000 124.000000 134.000000 139.000000 
+141.000000 141.000000 134.000000 113.000000 86.000000 79.000000 
+94.000000 107.000000 99.000000 70.000000 42.000000 25.000000 
+18.000000 10.000000 10.000000 16.000000 15.000000 10.000000 
+8.000000 6.000000 9.000000 12.000000 12.000000 12.000000 
+14.000000 13.000000 10.000000 9.000000 12.000000 14.000000 
+11.000000 12.000000 10.000000 10.000000 14.000000 15.000000 
+15.000000 14.000000 16.000000 23.000000 31.000000 25.000000 
+13.000000 8.000000 17.000000 35.000000 48.000000 69.000000 
+99.000000 117.000000 117.000000 115.000000 119.000000 119.000000 
+113.000000 109.000000 114.000000 123.000000 125.000000 121.000000 
+116.000000 115.000000 121.000000 130.000000 134.000000 131.000000 
+125.000000 120.000000 121.000000 125.000000 128.000000 128.000000 
+127.000000 127.000000 129.000000 133.000000 138.000000 141.000000 
+133.000000 111.000000 87.000000 80.000000 92.000000 108.000000 
+105.000000 80.000000 53.000000 36.000000 27.000000 21.000000 
+13.000000 10.000000 9.000000 7.000000 11.000000 13.000000 
+9.000000 9.000000 8.000000 15.000000 17.000000 12.000000 
+9.000000 5.000000 10.000000 15.000000 14.000000 16.000000 
+16.000000 10.000000 10.000000 13.000000 13.000000 12.000000 
+19.000000 26.000000 22.000000 16.000000 16.000000 22.000000 
+36.000000 49.000000 67.000000 93.000000 107.000000 103.000000 
+98.000000 109.000000 121.000000 123.000000 116.000000 114.000000 
+120.000000 125.000000 122.000000 115.000000 110.000000 111.000000 
+117.000000 121.000000 120.000000 117.000000 115.000000 114.000000 
+118.000000 122.000000 127.000000 129.000000 129.000000 129.000000 
+132.000000 135.000000 138.000000 138.000000 128.000000 106.000000 
+84.000000 81.000000 97.000000 113.000000 111.000000 93.000000 
+73.000000 58.000000 46.000000 31.000000 17.000000 11.000000 
+11.000000 12.000000 14.000000 19.000000 15.000000 12.000000 
+10.000000 9.000000 9.000000 5.000000 8.000000 10.000000 
+12.000000 14.000000 15.000000 14.000000 13.000000 18.000000 
+24.000000 21.000000 16.000000 16.000000 17.000000 14.000000 
+11.000000 19.000000 29.000000 33.000000 32.000000 47.000000 
+84.000000 114.000000 112.000000 96.000000 94.000000 107.000000 
+115.000000 116.000000 117.000000 119.000000 122.000000 124.000000 
+125.000000 122.000000 115.000000 111.000000 114.000000 120.000000 
+121.000000 117.000000 112.000000 113.000000 126.000000 127.000000 
+129.000000 130.000000 129.000000 128.000000 129.000000 133.000000 
+139.000000 140.000000 130.000000 105.000000 79.000000 79.000000 
+100.000000 119.000000 118.000000 101.000000 83.000000 73.000000 
+61.000000 44.000000 29.000000 19.000000 13.000000 11.000000 
+12.000000 17.000000 18.000000 18.000000 19.000000 11.000000 
+12.000000 12.000000 10.000000 16.000000 19.000000 17.000000 
+15.000000 13.000000 15.000000 24.000000 23.000000 19.000000 
+14.000000 7.000000 10.000000 14.000000 15.000000 21.000000 
+29.000000 28.000000 28.000000 60.000000 97.000000 107.000000 
+98.000000 95.000000 103.000000 110.000000 111.000000 112.000000 
+117.000000 123.000000 127.000000 130.000000 128.000000 121.000000 
+114.000000 113.000000 116.000000 120.000000 123.000000 123.000000 
+120.000000 113.000000 126.000000 127.000000 133.000000 138.000000 
+138.000000 132.000000 126.000000 128.000000 135.000000 140.000000 
+132.000000 108.000000 84.000000 84.000000 101.000000 115.000000 
+114.000000 97.000000 82.000000 78.000000 74.000000 63.000000 
+49.000000 34.000000 19.000000 13.000000 7.000000 9.000000 
+16.000000 18.000000 16.000000 10.000000 13.000000 17.000000 
+12.000000 10.000000 17.000000 21.000000 18.000000 18.000000 
+19.000000 20.000000 18.000000 10.000000 7.000000 22.000000 
+40.000000 39.000000 22.000000 11.000000 21.000000 40.000000 
+60.000000 80.000000 90.000000 85.000000 80.000000 85.000000 
+93.000000 103.000000 113.000000 121.000000 123.000000 124.000000 
+128.000000 129.000000 123.000000 115.000000 113.000000 119.000000 
+121.000000 117.000000 112.000000 111.000000 112.000000 111.000000 
+119.000000 125.000000 135.000000 141.000000 139.000000 131.000000 
+127.000000 130.000000 139.000000 140.000000 125.000000 100.000000 
+81.000000 89.000000 106.000000 113.000000 106.000000 92.000000 
+84.000000 84.000000 81.000000 68.000000 56.000000 46.000000 
+33.000000 27.000000 19.000000 16.000000 19.000000 17.000000 
+15.000000 18.000000 25.000000 24.000000 13.000000 9.000000 
+11.000000 17.000000 20.000000 19.000000 15.000000 13.000000 
+20.000000 24.000000 39.000000 76.000000 116.000000 149.000000 
+156.000000 126.000000 86.000000 72.000000 79.000000 84.000000 
+77.000000 70.000000 75.000000 88.000000 98.000000 104.000000 
+111.000000 120.000000 124.000000 121.000000 116.000000 115.000000 
+119.000000 121.000000 117.000000 114.000000 120.000000 128.000000 
+128.000000 118.000000 110.000000 112.000000 119.000000 126.000000 
+136.000000 142.000000 139.000000 129.000000 124.000000 129.000000 
+140.000000 142.000000 124.000000 97.000000 83.000000 93.000000 
+104.000000 106.000000 107.000000 109.000000 111.000000 106.000000 
+91.000000 71.000000 56.000000 40.000000 25.000000 25.000000 
+20.000000 26.000000 30.000000 23.000000 18.000000 22.000000 
+33.000000 28.000000 10.000000 11.000000 7.000000 13.000000 
+17.000000 16.000000 13.000000 11.000000 20.000000 42.000000 
+64.000000 100.000000 181.000000 279.000000 318.000000 265.000000 
+166.000000 97.000000 75.000000 68.000000 65.000000 70.000000 
+81.000000 91.000000 97.000000 99.000000 105.000000 115.000000 
+120.000000 119.000000 117.000000 120.000000 126.000000 126.000000 
+119.000000 115.000000 121.000000 129.000000 127.000000 118.000000 
+113.000000 115.000000 116.000000 127.000000 140.000000 146.000000 
+140.000000 129.000000 123.000000 129.000000 138.000000 136.000000 
+117.000000 97.000000 94.000000 102.000000 103.000000 105.000000 
+127.000000 177.000000 221.000000 209.000000 151.000000 90.000000 
+52.000000 26.000000 9.000000 11.000000 12.000000 27.000000 
+31.000000 19.000000 12.000000 8.000000 17.000000 18.000000 
+9.000000 8.000000 8.000000 12.000000 15.000000 11.000000 
+11.000000 21.000000 39.000000 49.000000 48.000000 96.000000 
+197.000000 287.000000 311.000000 267.000000 196.000000 133.000000 
+91.000000 71.000000 71.000000 80.000000 85.000000 85.000000 
+89.000000 99.000000 111.000000 115.000000 114.000000 116.000000 
+122.000000 127.000000 126.000000 123.000000 122.000000 121.000000 
+120.000000 116.000000 112.000000 112.000000 116.000000 120.000000 
+119.000000 131.000000 143.000000 144.000000 135.000000 125.000000 
+123.000000 131.000000 137.000000 128.000000 106.000000 92.000000 
+94.000000 97.000000 98.000000 117.000000 188.000000 315.000000 
+407.000000 374.000000 244.000000 122.000000 63.000000 33.000000 
+15.000000 13.000000 20.000000 25.000000 23.000000 15.000000 
+15.000000 14.000000 16.000000 20.000000 20.000000 15.000000 
+12.000000 15.000000 20.000000 19.000000 20.000000 28.000000 
+36.000000 31.000000 47.000000 128.000000 223.000000 278.000000 
+287.000000 266.000000 220.000000 158.000000 102.000000 72.000000 
+73.000000 83.000000 86.000000 87.000000 94.000000 105.000000 
+112.000000 112.000000 110.000000 112.000000 119.000000 123.000000 
+124.000000 124.000000 124.000000 122.000000 117.000000 112.000000 
+112.000000 117.000000 123.000000 127.000000 118.000000 129.000000 
+139.000000 139.000000 130.000000 122.000000 125.000000 134.000000 
+136.000000 125.000000 108.000000 97.000000 86.000000 73.000000 
+84.000000 143.000000 265.000000 412.000000 483.000000 429.000000 
+296.000000 175.000000 106.000000 60.000000 30.000000 22.000000 
+24.000000 22.000000 16.000000 14.000000 16.000000 23.000000 
+28.000000 31.000000 33.000000 33.000000 28.000000 22.000000 
+29.000000 39.000000 36.000000 28.000000 26.000000 23.000000 
+49.000000 113.000000 199.000000 276.000000 319.000000 304.000000 
+229.000000 135.000000 73.000000 55.000000 68.000000 81.000000 
+84.000000 87.000000 96.000000 102.000000 105.000000 108.000000 
+114.000000 117.000000 120.000000 123.000000 126.000000 125.000000 
+120.000000 115.000000 114.000000 114.000000 113.000000 113.000000 
+115.000000 117.000000 116.000000 121.000000 133.000000 139.000000 
+134.000000 129.000000 134.000000 139.000000 132.000000 117.000000 
+110.000000 109.000000 97.000000 79.000000 95.000000 165.000000 
+271.000000 367.000000 411.000000 389.000000 313.000000 208.000000 
+114.000000 64.000000 44.000000 40.000000 33.000000 17.000000 
+10.000000 18.000000 25.000000 34.000000 42.000000 40.000000 
+38.000000 42.000000 45.000000 35.000000 27.000000 32.000000 
+36.000000 31.000000 24.000000 27.000000 35.000000 62.000000 
+132.000000 223.000000 280.000000 270.000000 198.000000 112.000000 
+65.000000 67.000000 90.000000 102.000000 100.000000 99.000000 
+104.000000 108.000000 112.000000 119.000000 121.000000 119.000000 
+116.000000 116.000000 118.000000 118.000000 116.000000 117.000000 
+120.000000 121.000000 119.000000 116.000000 115.000000 117.000000 
+123.000000 127.000000 133.000000 134.000000 127.000000 122.000000 
+127.000000 134.000000 128.000000 114.000000 111.000000 121.000000 
+125.000000 115.000000 109.000000 134.000000 184.000000 246.000000 
+306.000000 330.000000 277.000000 166.000000 75.000000 47.000000 
+51.000000 64.000000 59.000000 44.000000 36.000000 38.000000 
+39.000000 37.000000 37.000000 38.000000 41.000000 43.000000 
+45.000000 45.000000 37.000000 33.000000 36.000000 39.000000 
+29.000000 17.000000 14.000000 38.000000 82.000000 119.000000 
+134.000000 128.000000 107.000000 80.000000 65.000000 76.000000 
+106.000000 127.000000 124.000000 107.000000 98.000000 101.000000 
+110.000000 114.000000 113.000000 114.000000 119.000000 122.000000 
+119.000000 117.000000 118.000000 120.000000 120.000000 121.000000 
+122.000000 123.000000 121.000000 119.000000 126.000000 128.000000 
+131.000000 131.000000 129.000000 129.000000 130.000000 129.000000 
+122.000000 110.000000 104.000000 108.000000 121.000000 127.000000 
+119.000000 104.000000 103.000000 130.000000 170.000000 182.000000 
+143.000000 81.000000 45.000000 47.000000 64.000000 73.000000 
+68.000000 63.000000 62.000000 60.000000 52.000000 41.000000 
+36.000000 40.000000 45.000000 42.000000 36.000000 36.000000 
+39.000000 41.000000 41.000000 42.000000 40.000000 28.000000 
+15.000000 14.000000 38.000000 71.000000 91.000000 93.000000 
+90.000000 89.000000 94.000000 106.000000 118.000000 119.000000 
+107.000000 94.000000 90.000000 97.000000 104.000000 109.000000 
+115.000000 122.000000 123.000000 118.000000 112.000000 113.000000 
+117.000000 119.000000 119.000000 120.000000 122.000000 122.000000 
+122.000000 124.000000 120.000000 124.000000 131.000000 136.000000 
+137.000000 138.000000 138.000000 130.000000 120.000000 113.000000 
+113.000000 115.000000 121.000000 129.000000 129.000000 117.000000 
+102.000000 88.000000 76.000000 63.000000 49.000000 45.000000 
+48.000000 54.000000 63.000000 62.000000 58.000000 57.000000 
+56.000000 57.000000 55.000000 48.000000 44.000000 48.000000 
+53.000000 49.000000 33.000000 23.000000 26.000000 36.000000 
+42.000000 42.000000 37.000000 24.000000 9.000000 7.000000 
+26.000000 57.000000 80.000000 84.000000 85.000000 97.000000 
+112.000000 117.000000 113.000000 112.000000 113.000000 111.000000 
+104.000000 98.000000 99.000000 107.000000 121.000000 129.000000 
+126.000000 117.000000 110.000000 111.000000 115.000000 118.000000 
+119.000000 120.000000 122.000000 121.000000 122.000000 126.000000 
+125.000000 126.000000 130.000000 129.000000 128.000000 132.000000 
+134.000000 128.000000 118.000000 111.000000 112.000000 116.000000 
+121.000000 126.000000 125.000000 113.000000 97.000000 86.000000 
+77.000000 61.000000 41.000000 36.000000 42.000000 48.000000 
+55.000000 61.000000 69.000000 71.000000 58.000000 44.000000 
+41.000000 47.000000 50.000000 49.000000 52.000000 56.000000 
+52.000000 40.000000 35.000000 35.000000 33.000000 28.000000 
+29.000000 33.000000 19.000000 11.000000 5.000000 24.000000 
+64.000000 95.000000 103.000000 105.000000 114.000000 123.000000 
+124.000000 120.000000 113.000000 104.000000 98.000000 97.000000 
+101.000000 105.000000 111.000000 120.000000 124.000000 117.000000 
+106.000000 104.000000 113.000000 119.000000 119.000000 118.000000 
+119.000000 120.000000 117.000000 118.000000 124.000000 117.000000 
+119.000000 126.000000 133.000000 135.000000 131.000000 123.000000 
+116.000000 113.000000 113.000000 116.000000 124.000000 131.000000 
+131.000000 119.000000 103.000000 92.000000 79.000000 60.000000 
+41.000000 39.000000 47.000000 50.000000 49.000000 49.000000 
+54.000000 56.000000 47.000000 29.000000 17.000000 20.000000 
+28.000000 33.000000 36.000000 40.000000 39.000000 35.000000 
+31.000000 29.000000 29.000000 29.000000 35.000000 46.000000 
+48.000000 26.000000 10.000000 23.000000 46.000000 68.000000 
+89.000000 107.000000 122.000000 133.000000 133.000000 123.000000 
+113.000000 107.000000 105.000000 105.000000 104.000000 102.000000 
+104.000000 108.000000 109.000000 104.000000 98.000000 96.000000 
+101.000000 111.000000 118.000000 123.000000 125.000000 124.000000 
+121.000000 119.000000 120.000000 112.000000 115.000000 126.000000 
+133.000000 133.000000 127.000000 122.000000 117.000000 111.000000 
+109.000000 119.000000 133.000000 137.000000 127.000000 112.000000 
+104.000000 101.000000 96.000000 82.000000 63.000000 49.000000 
+45.000000 50.000000 56.000000 54.000000 39.000000 27.000000 
+34.000000 50.000000 69.000000 72.000000 57.000000 43.000000 
+45.000000 44.000000 36.000000 30.000000 27.000000 24.000000 
+22.000000 26.000000 37.000000 54.000000 67.000000 63.000000 
+39.000000 32.000000 40.000000 51.000000 70.000000 94.000000 
+117.000000 133.000000 138.000000 132.000000 121.000000 113.000000 
+109.000000 108.000000 108.000000 106.000000 103.000000 98.000000 
+94.000000 94.000000 96.000000 98.000000 105.000000 118.000000 
+128.000000 127.000000 120.000000 117.000000 119.000000 120.000000 
+117.000000 119.000000 123.000000 130.000000 135.000000 133.000000 
+123.000000 110.000000 104.000000 106.000000 115.000000 125.000000 
+133.000000 130.000000 115.000000 98.000000 91.000000 94.000000 
+95.000000 91.000000 84.000000 77.000000 69.000000 58.000000 
+56.000000 60.000000 47.000000 29.000000 43.000000 145.000000 
+285.000000 342.000000 260.000000 131.000000 73.000000 75.000000 
+89.000000 78.000000 50.000000 33.000000 28.000000 29.000000 
+44.000000 70.000000 91.000000 92.000000 79.000000 62.000000 
+50.000000 46.000000 53.000000 77.000000 114.000000 141.000000 
+149.000000 143.000000 132.000000 118.000000 108.000000 108.000000 
+115.000000 117.000000 108.000000 94.000000 86.000000 84.000000 
+88.000000 100.000000 115.000000 125.000000 124.000000 118.000000 
+115.000000 116.000000 115.000000 114.000000 121.000000 129.000000 
+137.000000 136.000000 127.000000 117.000000 109.000000 106.000000 
+110.000000 119.000000 129.000000 135.000000 130.000000 115.000000 
+94.000000 82.000000 88.000000 105.000000 112.000000 103.000000 
+89.000000 86.000000 87.000000 87.000000 86.000000 81.000000 
+65.000000 52.000000 57.000000 189.000000 378.000000 466.000000 
+375.000000 192.000000 67.000000 42.000000 60.000000 69.000000 
+62.000000 57.000000 60.000000 65.000000 70.000000 81.000000 
+95.000000 99.000000 94.000000 83.000000 62.000000 39.000000 
+30.000000 61.000000 108.000000 137.000000 145.000000 143.000000 
+140.000000 134.000000 124.000000 113.000000 106.000000 104.000000 
+100.000000 92.000000 89.000000 97.000000 109.000000 115.000000 
+116.000000 115.000000 116.000000 119.000000 121.000000 119.000000 
+117.000000 120.000000 123.000000 136.000000 144.000000 138.000000 
+123.000000 109.000000 103.000000 102.000000 103.000000 107.000000 
+118.000000 129.000000 125.000000 102.000000 78.000000 74.000000 
+90.000000 108.000000 115.000000 108.000000 92.000000 81.000000 
+81.000000 87.000000 81.000000 56.000000 37.000000 48.000000 
+100.000000 203.000000 315.000000 357.000000 296.000000 182.000000 
+98.000000 64.000000 61.000000 63.000000 58.000000 58.000000 
+72.000000 89.000000 94.000000 88.000000 85.000000 92.000000 
+102.000000 113.000000 121.000000 104.000000 58.000000 40.000000 
+67.000000 108.000000 145.000000 159.000000 147.000000 134.000000 
+129.000000 123.000000 113.000000 104.000000 100.000000 94.000000 
+91.000000 100.000000 116.000000 124.000000 119.000000 113.000000 
+116.000000 119.000000 114.000000 108.000000 112.000000 123.000000 
+124.000000 127.000000 126.000000 123.000000 114.000000 101.000000 
+90.000000 85.000000 88.000000 97.000000 108.000000 115.000000 
+117.000000 111.000000 93.000000 75.000000 86.000000 110.000000 
+114.000000 102.000000 87.000000 79.000000 75.000000 73.000000 
+63.000000 45.000000 33.000000 47.000000 91.000000 158.000000 
+210.000000 214.000000 174.000000 123.000000 91.000000 76.000000 
+72.000000 64.000000 50.000000 46.000000 63.000000 84.000000 
+88.000000 77.000000 74.000000 91.000000 116.000000 135.000000 
+141.000000 128.000000 89.000000 26.000000 23.000000 83.000000 
+136.000000 154.000000 146.000000 136.000000 133.000000 129.000000 
+118.000000 109.000000 106.000000 106.000000 104.000000 105.000000 
+110.000000 117.000000 118.000000 117.000000 120.000000 124.000000 
+122.000000 118.000000 120.000000 129.000000 121.000000 123.000000 
+127.000000 127.000000 117.000000 102.000000 88.000000 79.000000 
+83.000000 103.000000 119.000000 113.000000 102.000000 100.000000 
+76.000000 42.000000 69.000000 114.000000 120.000000 101.000000 
+84.000000 79.000000 74.000000 64.000000 59.000000 60.000000 
+62.000000 63.000000 73.000000 97.000000 121.000000 123.000000 
+100.000000 75.000000 62.000000 62.000000 66.000000 65.000000 
+60.000000 57.000000 59.000000 65.000000 66.000000 66.000000 
+75.000000 96.000000 113.000000 117.000000 115.000000 115.000000 
+109.000000 71.000000 22.000000 43.000000 100.000000 136.000000 
+155.000000 154.000000 144.000000 136.000000 127.000000 113.000000 
+98.000000 93.000000 97.000000 104.000000 108.000000 113.000000 
+118.000000 122.000000 124.000000 123.000000 120.000000 118.000000 
+118.000000 121.000000 123.000000 115.000000 111.000000 108.000000 
+102.000000 95.000000 83.000000 74.000000 84.000000 112.000000 
+136.000000 135.000000 112.000000 85.000000 64.000000 72.000000 
+108.000000 117.000000 102.000000 89.000000 93.000000 103.000000 
+104.000000 99.000000 96.000000 98.000000 101.000000 100.000000 
+100.000000 96.000000 86.000000 79.000000 74.000000 70.000000 
+71.000000 80.000000 89.000000 90.000000 82.000000 73.000000 
+69.000000 66.000000 62.000000 63.000000 72.000000 87.000000 
+101.000000 102.000000 96.000000 96.000000 90.000000 63.000000 
+24.000000 39.000000 89.000000 125.000000 141.000000 137.000000 
+132.000000 136.000000 139.000000 129.000000 112.000000 102.000000 
+104.000000 109.000000 111.000000 112.000000 116.000000 123.000000 
+129.000000 132.000000 128.000000 123.000000 117.000000 113.000000 
+115.000000 104.000000 96.000000 91.000000 85.000000 75.000000 
+65.000000 70.000000 97.000000 127.000000 140.000000 135.000000 
+114.000000 85.000000 80.000000 109.000000 129.000000 121.000000 
+102.000000 97.000000 109.000000 122.000000 130.000000 137.000000 
+140.000000 134.000000 127.000000 129.000000 138.000000 136.000000 
+119.000000 102.000000 95.000000 100.000000 109.000000 121.000000 
+133.000000 138.000000 131.000000 122.000000 120.000000 114.000000 
+90.000000 63.000000 57.000000 71.000000 87.000000 88.000000 
+87.000000 92.000000 90.000000 59.000000 18.000000 33.000000 
+69.000000 86.000000 96.000000 103.000000 117.000000 135.000000 
+143.000000 135.000000 119.000000 106.000000 103.000000 108.000000 
+114.000000 118.000000 119.000000 123.000000 133.000000 139.000000 
+134.000000 123.000000 115.000000 115.000000 107.000000 102.000000 
+92.000000 87.000000 88.000000 84.000000 77.000000 86.000000 
+114.000000 138.000000 137.000000 115.000000 92.000000 88.000000 
+107.000000 122.000000 120.000000 112.000000 111.000000 123.000000 
+133.000000 133.000000 129.000000 129.000000 131.000000 131.000000 
+130.000000 131.000000 133.000000 133.000000 131.000000 130.000000 
+131.000000 134.000000 138.000000 142.000000 143.000000 140.000000 
+134.000000 135.000000 144.000000 151.000000 140.000000 112.000000 
+85.000000 78.000000 91.000000 105.000000 107.000000 90.000000 
+62.000000 39.000000 23.000000 20.000000 30.000000 40.000000 
+45.000000 54.000000 76.000000 96.000000 104.000000 105.000000 
+97.000000 93.000000 101.000000 115.000000 131.000000 140.000000 
+133.000000 124.000000 123.000000 128.000000 129.000000 126.000000 
+122.000000 119.000000 95.000000 85.000000 83.000000 89.000000 
+88.000000 84.000000 91.000000 109.000000 130.000000 143.000000 
+133.000000 109.000000 101.000000 114.000000 121.000000 108.000000 
+97.000000 108.000000 131.000000 141.000000 136.000000 129.000000 
+132.000000 135.000000 133.000000 128.000000 128.000000 130.000000 
+131.000000 134.000000 139.000000 139.000000 134.000000 129.000000 
+132.000000 136.000000 134.000000 130.000000 131.000000 137.000000 
+140.000000 140.000000 140.000000 137.000000 126.000000 106.000000 
+90.000000 85.000000 87.000000 84.000000 76.000000 69.000000 
+64.000000 63.000000 55.000000 32.000000 10.000000 2.000000 
+6.000000 10.000000 16.000000 28.000000 19.000000 19.000000 
+44.000000 76.000000 117.000000 140.000000 134.000000 121.000000 
+117.000000 121.000000 121.000000 118.000000 117.000000 120.000000 
+60.000000 60.000000 61.000000 63.000000 73.000000 94.000000 
+115.000000 123.000000 127.000000 131.000000 125.000000 108.000000 
+94.000000 86.000000 79.000000 77.000000 91.000000 116.000000 
+137.000000 139.000000 133.000000 130.000000 133.000000 132.000000 
+129.000000 128.000000 128.000000 125.000000 123.000000 124.000000 
+129.000000 133.000000 136.000000 137.000000 135.000000 129.000000 
+125.000000 127.000000 131.000000 128.000000 125.000000 133.000000 
+149.000000 153.000000 131.000000 96.000000 79.000000 95.000000 
+125.000000 138.000000 117.000000 83.000000 59.000000 50.000000 
+52.000000 46.000000 35.000000 26.000000 15.000000 8.000000 
+12.000000 22.000000 24.000000 14.000000 21.000000 46.000000 
+82.000000 126.000000 144.000000 131.000000 115.000000 114.000000 
+124.000000 129.000000 125.000000 120.000000 36.000000 38.000000 
+36.000000 33.000000 44.000000 66.000000 92.000000 125.000000 
+151.000000 151.000000 123.000000 87.000000 64.000000 58.000000 
+65.000000 79.000000 99.000000 120.000000 132.000000 134.000000 
+133.000000 134.000000 133.000000 131.000000 130.000000 130.000000 
+128.000000 125.000000 124.000000 126.000000 127.000000 128.000000 
+129.000000 131.000000 128.000000 125.000000 128.000000 135.000000 
+137.000000 131.000000 126.000000 127.000000 135.000000 144.000000 
+143.000000 130.000000 108.000000 89.000000 87.000000 97.000000 
+100.000000 78.000000 32.000000 18.000000 35.000000 43.000000 
+34.000000 20.000000 15.000000 15.000000 10.000000 6.000000 
+14.000000 21.000000 32.000000 28.000000 34.000000 91.000000 
+136.000000 138.000000 122.000000 113.000000 115.000000 119.000000 
+121.000000 123.000000 26.000000 21.000000 22.000000 47.000000 
+67.000000 61.000000 70.000000 113.000000 143.000000 137.000000 
+102.000000 65.000000 45.000000 46.000000 62.000000 89.000000 
+114.000000 128.000000 131.000000 129.000000 128.000000 128.000000 
+127.000000 127.000000 129.000000 129.000000 127.000000 125.000000 
+124.000000 124.000000 126.000000 129.000000 135.000000 138.000000 
+137.000000 134.000000 132.000000 130.000000 125.000000 121.000000 
+123.000000 131.000000 141.000000 141.000000 133.000000 121.000000 
+115.000000 112.000000 102.000000 85.000000 74.000000 73.000000 
+62.000000 21.000000 12.000000 27.000000 21.000000 15.000000 
+15.000000 10.000000 14.000000 19.000000 7.000000 10.000000 
+28.000000 31.000000 27.000000 58.000000 111.000000 136.000000 
+134.000000 124.000000 118.000000 119.000000 121.000000 123.000000 
+18.000000 10.000000 32.000000 52.000000 39.000000 22.000000 
+50.000000 106.000000 133.000000 125.000000 94.000000 62.000000 
+44.000000 49.000000 76.000000 111.000000 136.000000 141.000000 
+133.000000 128.000000 130.000000 134.000000 131.000000 126.000000 
+124.000000 127.000000 129.000000 128.000000 126.000000 126.000000 
+125.000000 124.000000 124.000000 126.000000 128.000000 129.000000 
+129.000000 129.000000 127.000000 127.000000 127.000000 126.000000 
+126.000000 128.000000 131.000000 131.000000 123.000000 111.000000 
+100.000000 90.000000 75.000000 58.000000 49.000000 37.000000 
+11.000000 4.000000 6.000000 9.000000 11.000000 10.000000 
+18.000000 24.000000 16.000000 9.000000 16.000000 27.000000 
+33.000000 41.000000 74.000000 115.000000 137.000000 137.000000 
+122.000000 109.000000 111.000000 122.000000 4.000000 8.000000 
+31.000000 62.000000 88.000000 104.000000 114.000000 122.000000 
+129.000000 121.000000 92.000000 59.000000 45.000000 59.000000 
+91.000000 121.000000 137.000000 137.000000 128.000000 121.000000 
+122.000000 125.000000 125.000000 122.000000 121.000000 123.000000 
+125.000000 123.000000 119.000000 114.000000 113.000000 119.000000 
+130.000000 140.000000 142.000000 136.000000 131.000000 130.000000 
+129.000000 126.000000 126.000000 131.000000 133.000000 129.000000 
+124.000000 127.000000 134.000000 135.000000 122.000000 100.000000 
+75.000000 51.000000 37.000000 35.000000 31.000000 19.000000 
+8.000000 6.000000 9.000000 13.000000 11.000000 11.000000 
+8.000000 6.000000 10.000000 17.000000 26.000000 34.000000 
+48.000000 72.000000 104.000000 130.000000 131.000000 120.000000 
+112.000000 109.000000 15.000000 12.000000 14.000000 44.000000 
+83.000000 106.000000 112.000000 116.000000 120.000000 110.000000 
+84.000000 61.000000 57.000000 79.000000 110.000000 132.000000 
+137.000000 135.000000 131.000000 128.000000 125.000000 125.000000 
+128.000000 131.000000 131.000000 128.000000 125.000000 123.000000 
+121.000000 118.000000 118.000000 122.000000 128.000000 131.000000 
+131.000000 130.000000 128.000000 127.000000 127.000000 127.000000 
+127.000000 128.000000 131.000000 133.000000 132.000000 128.000000 
+127.000000 126.000000 118.000000 101.000000 80.000000 61.000000 
+44.000000 36.000000 39.000000 34.000000 19.000000 15.000000 
+16.000000 9.000000 4.000000 8.000000 10.000000 6.000000 
+8.000000 14.000000 14.000000 20.000000 26.000000 37.000000 
+70.000000 104.000000 121.000000 128.000000 129.000000 122.000000 
+26.000000 24.000000 26.000000 58.000000 92.000000 106.000000 
+109.000000 118.000000 126.000000 115.000000 87.000000 65.000000 
+71.000000 99.000000 126.000000 134.000000 130.000000 127.000000 
+131.000000 134.000000 130.000000 125.000000 124.000000 124.000000 
+125.000000 126.000000 126.000000 125.000000 119.000000 113.000000 
+115.000000 123.000000 130.000000 131.000000 130.000000 129.000000 
+127.000000 125.000000 125.000000 129.000000 135.000000 136.000000 
+135.000000 134.000000 130.000000 125.000000 125.000000 132.000000 
+137.000000 123.000000 94.000000 67.000000 58.000000 57.000000 
+55.000000 46.000000 34.000000 20.000000 8.000000 4.000000 
+3.000000 7.000000 13.000000 10.000000 7.000000 13.000000 
+12.000000 10.000000 21.000000 28.000000 36.000000 70.000000 
+107.000000 126.000000 135.000000 136.000000 25.000000 23.000000 
+51.000000 104.000000 128.000000 119.000000 102.000000 104.000000 
+115.000000 106.000000 84.000000 72.000000 86.000000 112.000000 
+127.000000 128.000000 125.000000 127.000000 129.000000 127.000000 
+123.000000 120.000000 120.000000 120.000000 123.000000 126.000000 
+126.000000 125.000000 123.000000 122.000000 122.000000 125.000000 
+131.000000 135.000000 133.000000 125.000000 122.000000 126.000000 
+130.000000 130.000000 128.000000 126.000000 124.000000 121.000000 
+119.000000 121.000000 124.000000 128.000000 130.000000 125.000000 
+106.000000 81.000000 69.000000 75.000000 79.000000 70.000000 
+48.000000 27.000000 10.000000 4.000000 5.000000 9.000000 
+12.000000 7.000000 4.000000 8.000000 9.000000 8.000000 
+16.000000 18.000000 14.000000 38.000000 70.000000 83.000000 
+105.000000 129.000000 22.000000 34.000000 80.000000 127.000000 
+137.000000 112.000000 89.000000 95.000000 111.000000 106.000000 
+87.000000 82.000000 103.000000 125.000000 131.000000 128.000000 
+127.000000 128.000000 124.000000 119.000000 120.000000 125.000000 
+125.000000 122.000000 122.000000 126.000000 128.000000 126.000000 
+125.000000 125.000000 123.000000 121.000000 123.000000 127.000000 
+127.000000 122.000000 122.000000 127.000000 130.000000 127.000000 
+125.000000 127.000000 129.000000 127.000000 125.000000 125.000000 
+123.000000 120.000000 126.000000 137.000000 135.000000 111.000000 
+90.000000 95.000000 113.000000 111.000000 78.000000 38.000000 
+13.000000 6.000000 6.000000 9.000000 9.000000 6.000000 
+8.000000 13.000000 12.000000 11.000000 10.000000 9.000000 
+8.000000 17.000000 38.000000 47.000000 68.000000 102.000000 
+131.000000 132.000000 128.000000 125.000000 133.000000 146.000000 
+146.000000 127.000000 103.000000 82.000000 56.000000 40.000000 
+64.000000 69.000000 36.000000 11.000000 20.000000 13.000000 
+10.000000 7.000000 7.000000 9.000000 10.000000 14.000000 
+17.000000 13.000000 9.000000 10.000000 9.000000 5.000000 
+7.000000 9.000000 10.000000 12.000000 11.000000 8.000000 
+7.000000 9.000000 21.000000 27.000000 19.000000 8.000000 
+8.000000 8.000000 11.000000 13.000000 10.000000 8.000000 
+6.000000 8.000000 8.000000 6.000000 8.000000 10.000000 
+6.000000 5.000000 9.000000 23.000000 45.000000 59.000000 
+60.000000 37.000000 21.000000 42.000000 60.000000 51.000000 
+36.000000 27.000000 25.000000 24.000000 26.000000 27.000000 
+30.000000 36.000000 39.000000 43.000000 130.000000 130.000000 
+130.000000 129.000000 126.000000 127.000000 134.000000 140.000000 
+137.000000 119.000000 81.000000 44.000000 51.000000 62.000000 
+33.000000 12.000000 20.000000 8.000000 8.000000 8.000000 
+6.000000 7.000000 10.000000 13.000000 13.000000 12.000000 
+8.000000 7.000000 8.000000 6.000000 8.000000 13.000000 
+17.000000 16.000000 11.000000 10.000000 11.000000 9.000000 
+15.000000 21.000000 12.000000 6.000000 12.000000 10.000000 
+11.000000 13.000000 8.000000 5.000000 8.000000 14.000000 
+11.000000 6.000000 7.000000 8.000000 6.000000 11.000000 
+16.000000 13.000000 24.000000 43.000000 32.000000 19.000000 
+43.000000 70.000000 65.000000 41.000000 27.000000 24.000000 
+20.000000 15.000000 14.000000 19.000000 30.000000 37.000000 
+32.000000 27.000000 138.000000 139.000000 137.000000 137.000000 
+135.000000 133.000000 134.000000 141.000000 142.000000 124.000000 
+87.000000 49.000000 37.000000 41.000000 30.000000 14.000000 
+18.000000 18.000000 12.000000 10.000000 10.000000 10.000000 
+14.000000 16.000000 12.000000 10.000000 9.000000 9.000000 
+9.000000 9.000000 9.000000 11.000000 13.000000 11.000000 
+7.000000 8.000000 9.000000 5.000000 11.000000 18.000000 
+13.000000 7.000000 11.000000 10.000000 10.000000 11.000000 
+12.000000 11.000000 11.000000 15.000000 10.000000 9.000000 
+7.000000 3.000000 6.000000 22.000000 32.000000 17.000000 
+15.000000 24.000000 16.000000 25.000000 47.000000 45.000000 
+30.000000 19.000000 17.000000 23.000000 22.000000 14.000000 
+14.000000 23.000000 28.000000 25.000000 25.000000 30.000000 
+139.000000 140.000000 139.000000 139.000000 139.000000 134.000000 
+129.000000 130.000000 139.000000 134.000000 102.000000 58.000000 
+35.000000 40.000000 39.000000 24.000000 12.000000 13.000000 
+14.000000 11.000000 6.000000 6.000000 8.000000 10.000000 
+10.000000 9.000000 9.000000 9.000000 8.000000 8.000000 
+10.000000 9.000000 7.000000 6.000000 4.000000 6.000000 
+7.000000 4.000000 10.000000 13.000000 10.000000 7.000000 
+9.000000 10.000000 10.000000 8.000000 7.000000 9.000000 
+10.000000 8.000000 9.000000 12.000000 14.000000 16.000000 
+19.000000 24.000000 17.000000 15.000000 22.000000 20.000000 
+20.000000 21.000000 16.000000 13.000000 9.000000 6.000000 
+17.000000 27.000000 22.000000 15.000000 14.000000 13.000000 
+11.000000 12.000000 19.000000 25.000000 128.000000 134.000000 
+138.000000 138.000000 136.000000 134.000000 132.000000 127.000000 
+126.000000 130.000000 125.000000 102.000000 73.000000 53.000000 
+43.000000 39.000000 27.000000 13.000000 11.000000 13.000000 
+10.000000 17.000000 14.000000 6.000000 8.000000 12.000000 
+10.000000 9.000000 10.000000 11.000000 12.000000 11.000000 
+10.000000 9.000000 8.000000 9.000000 9.000000 8.000000 
+13.000000 14.000000 9.000000 8.000000 8.000000 8.000000 
+8.000000 7.000000 5.000000 7.000000 9.000000 10.000000 
+11.000000 12.000000 22.000000 29.000000 27.000000 17.000000 
+12.000000 19.000000 13.000000 10.000000 22.000000 21.000000 
+14.000000 12.000000 10.000000 8.000000 10.000000 13.000000 
+14.000000 14.000000 16.000000 16.000000 16.000000 16.000000 
+18.000000 19.000000 123.000000 129.000000 138.000000 143.000000 
+141.000000 133.000000 127.000000 126.000000 126.000000 124.000000 
+120.000000 112.000000 93.000000 68.000000 51.000000 46.000000 
+39.000000 22.000000 6.000000 15.000000 17.000000 19.000000 
+30.000000 29.000000 19.000000 8.000000 12.000000 12.000000 
+10.000000 14.000000 15.000000 13.000000 13.000000 15.000000 
+17.000000 16.000000 9.000000 7.000000 11.000000 14.000000 
+13.000000 11.000000 9.000000 11.000000 13.000000 13.000000 
+11.000000 7.000000 6.000000 10.000000 13.000000 16.000000 
+24.000000 24.000000 16.000000 14.000000 23.000000 26.000000 
+14.000000 9.000000 14.000000 12.000000 9.000000 14.000000 
+19.000000 21.000000 21.000000 24.000000 21.000000 11.000000 
+7.000000 13.000000 19.000000 19.000000 19.000000 18.000000 
+128.000000 135.000000 137.000000 134.000000 130.000000 126.000000 
+127.000000 131.000000 137.000000 134.000000 122.000000 107.000000 
+95.000000 84.000000 72.000000 59.000000 43.000000 24.000000 
+15.000000 16.000000 12.000000 18.000000 30.000000 34.000000 
+28.000000 13.000000 8.000000 8.000000 8.000000 9.000000 
+12.000000 12.000000 7.000000 7.000000 10.000000 13.000000 
+9.000000 8.000000 14.000000 16.000000 17.000000 13.000000 
+9.000000 8.000000 11.000000 10.000000 9.000000 10.000000 
+7.000000 4.000000 7.000000 13.000000 16.000000 12.000000 
+9.000000 13.000000 16.000000 13.000000 15.000000 21.000000 
+20.000000 11.000000 16.000000 36.000000 46.000000 47.000000 
+49.000000 47.000000 33.000000 20.000000 16.000000 18.000000 
+19.000000 13.000000 10.000000 13.000000 129.000000 129.000000 
+130.000000 131.000000 132.000000 134.000000 134.000000 131.000000 
+129.000000 131.000000 128.000000 111.000000 89.000000 72.000000 
+61.000000 52.000000 41.000000 22.000000 12.000000 38.000000 
+36.000000 27.000000 27.000000 28.000000 22.000000 13.000000 
+11.000000 11.000000 10.000000 8.000000 11.000000 15.000000 
+18.000000 18.000000 14.000000 9.000000 10.000000 14.000000 
+15.000000 12.000000 12.000000 13.000000 12.000000 11.000000 
+10.000000 6.000000 6.000000 11.000000 14.000000 10.000000 
+9.000000 11.000000 11.000000 10.000000 13.000000 16.000000 
+18.000000 16.000000 12.000000 9.000000 10.000000 17.000000 
+42.000000 77.000000 98.000000 101.000000 91.000000 70.000000 
+49.000000 38.000000 35.000000 32.000000 27.000000 13.000000 
+6.000000 21.000000 122.000000 120.000000 127.000000 135.000000 
+136.000000 131.000000 129.000000 130.000000 132.000000 132.000000 
+128.000000 115.000000 95.000000 78.000000 70.000000 61.000000 
+46.000000 30.000000 16.000000 22.000000 31.000000 27.000000 
+22.000000 20.000000 13.000000 6.000000 11.000000 9.000000 
+8.000000 8.000000 12.000000 14.000000 15.000000 16.000000 
+14.000000 9.000000 5.000000 8.000000 11.000000 12.000000 
+10.000000 9.000000 11.000000 14.000000 15.000000 12.000000 
+5.000000 6.000000 10.000000 12.000000 12.000000 11.000000 
+18.000000 26.000000 20.000000 14.000000 31.000000 51.000000 
+51.000000 46.000000 53.000000 71.000000 92.000000 105.000000 
+108.000000 108.000000 107.000000 100.000000 84.000000 66.000000 
+49.000000 35.000000 19.000000 10.000000 17.000000 36.000000 
+131.000000 130.000000 124.000000 122.000000 125.000000 131.000000 
+135.000000 135.000000 132.000000 128.000000 125.000000 119.000000 
+106.000000 89.000000 80.000000 76.000000 62.000000 42.000000 
+22.000000 10.000000 29.000000 42.000000 33.000000 16.000000 
+10.000000 15.000000 19.000000 11.000000 7.000000 5.000000 
+9.000000 10.000000 7.000000 5.000000 7.000000 10.000000 
+8.000000 9.000000 12.000000 13.000000 9.000000 5.000000 
+8.000000 11.000000 10.000000 8.000000 7.000000 9.000000 
+14.000000 22.000000 25.000000 12.000000 13.000000 29.000000 
+27.000000 13.000000 35.000000 73.000000 95.000000 110.000000 
+122.000000 128.000000 125.000000 118.000000 110.000000 100.000000 
+87.000000 74.000000 66.000000 61.000000 55.000000 42.000000 
+25.000000 24.000000 42.000000 58.000000 139.000000 130.000000 
+117.000000 110.000000 116.000000 128.000000 134.000000 131.000000 
+127.000000 128.000000 131.000000 124.000000 104.000000 82.000000 
+74.000000 76.000000 69.000000 43.000000 16.000000 10.000000 
+20.000000 28.000000 23.000000 17.000000 16.000000 19.000000 
+17.000000 11.000000 6.000000 5.000000 9.000000 15.000000 
+15.000000 10.000000 8.000000 10.000000 12.000000 14.000000 
+12.000000 12.000000 12.000000 10.000000 10.000000 8.000000 
+6.000000 8.000000 13.000000 20.000000 29.000000 33.000000 
+28.000000 12.000000 17.000000 38.000000 43.000000 29.000000 
+49.000000 92.000000 118.000000 128.000000 130.000000 127.000000 
+121.000000 118.000000 121.000000 117.000000 97.000000 70.000000 
+55.000000 57.000000 64.000000 60.000000 47.000000 43.000000 
+55.000000 70.000000 135.000000 133.000000 128.000000 122.000000 
+120.000000 124.000000 129.000000 132.000000 131.000000 133.000000 
+134.000000 124.000000 100.000000 76.000000 70.000000 77.000000 
+75.000000 52.000000 25.000000 12.000000 6.000000 5.000000 
+8.000000 13.000000 19.000000 18.000000 12.000000 10.000000 
+11.000000 9.000000 9.000000 11.000000 11.000000 11.000000 
+8.000000 7.000000 10.000000 13.000000 13.000000 12.000000 
+9.000000 11.000000 13.000000 11.000000 14.000000 15.000000 
+16.000000 19.000000 22.000000 26.000000 21.000000 5.000000 
+20.000000 49.000000 51.000000 39.000000 66.000000 114.000000 
+135.000000 130.000000 123.000000 122.000000 121.000000 121.000000 
+123.000000 126.000000 119.000000 106.000000 96.000000 94.000000 
+93.000000 85.000000 75.000000 66.000000 65.000000 71.000000 
+134.000000 138.000000 136.000000 127.000000 121.000000 123.000000 
+129.000000 133.000000 135.000000 135.000000 130.000000 114.000000 
+90.000000 72.000000 71.000000 82.000000 83.000000 62.000000 
+36.000000 24.000000 12.000000 6.000000 8.000000 11.000000 
+17.000000 18.000000 16.000000 14.000000 11.000000 8.000000 
+7.000000 8.000000 10.000000 10.000000 9.000000 8.000000 
+8.000000 10.000000 10.000000 10.000000 7.000000 8.000000 
+10.000000 12.000000 15.000000 15.000000 13.000000 13.000000 
+14.000000 15.000000 12.000000 12.000000 28.000000 47.000000 
+51.000000 53.000000 84.000000 119.000000 126.000000 120.000000 
+123.000000 129.000000 129.000000 126.000000 125.000000 124.000000 
+118.000000 115.000000 119.000000 124.000000 124.000000 122.000000 
+118.000000 110.000000 101.000000 100.000000 142.000000 141.000000 
+133.000000 123.000000 119.000000 124.000000 130.000000 133.000000 
+138.000000 142.000000 136.000000 115.000000 89.000000 74.000000 
+78.000000 89.000000 85.000000 62.000000 41.000000 35.000000 
+24.000000 14.000000 11.000000 9.000000 10.000000 12.000000 
+14.000000 14.000000 8.000000 5.000000 7.000000 10.000000 
+12.000000 12.000000 12.000000 12.000000 9.000000 10.000000 
+11.000000 10.000000 10.000000 11.000000 11.000000 11.000000 
+13.000000 14.000000 14.000000 15.000000 18.000000 10.000000 
+7.000000 23.000000 36.000000 44.000000 56.000000 79.000000 
+102.000000 106.000000 102.000000 107.000000 118.000000 126.000000 
+125.000000 121.000000 122.000000 123.000000 124.000000 125.000000 
+126.000000 128.000000 129.000000 129.000000 128.000000 128.000000 
+129.000000 133.000000 139.000000 137.000000 130.000000 125.000000 
+124.000000 127.000000 130.000000 132.000000 137.000000 144.000000 
+142.000000 123.000000 94.000000 77.000000 83.000000 99.000000 
+99.000000 77.000000 55.000000 47.000000 35.000000 23.000000 
+18.000000 13.000000 14.000000 12.000000 8.000000 11.000000 
+8.000000 5.000000 8.000000 10.000000 13.000000 15.000000 
+13.000000 10.000000 9.000000 8.000000 10.000000 12.000000 
+14.000000 16.000000 17.000000 15.000000 14.000000 14.000000 
+14.000000 16.000000 18.000000 8.000000 16.000000 30.000000 
+35.000000 50.000000 77.000000 97.000000 98.000000 88.000000 
+92.000000 108.000000 116.000000 115.000000 114.000000 118.000000 
+124.000000 128.000000 129.000000 127.000000 123.000000 119.000000 
+115.000000 115.000000 117.000000 122.000000 128.000000 129.000000 
+129.000000 129.000000 128.000000 128.000000 128.000000 126.000000 
+123.000000 124.000000 133.000000 143.000000 144.000000 126.000000 
+95.000000 77.000000 85.000000 109.000000 122.000000 104.000000 
+74.000000 59.000000 49.000000 36.000000 24.000000 18.000000 
+19.000000 15.000000 6.000000 13.000000 15.000000 8.000000 
+9.000000 11.000000 13.000000 11.000000 10.000000 9.000000 
+10.000000 5.000000 6.000000 10.000000 10.000000 11.000000 
+14.000000 13.000000 13.000000 15.000000 17.000000 19.000000 
+12.000000 6.000000 26.000000 40.000000 41.000000 68.000000 
+101.000000 106.000000 90.000000 83.000000 96.000000 114.000000 
+122.000000 122.000000 120.000000 121.000000 123.000000 126.000000 
+128.000000 128.000000 121.000000 114.000000 113.000000 119.000000 
+126.000000 128.000000 125.000000 124.000000 123.000000 126.000000 
+127.000000 127.000000 127.000000 125.000000 121.000000 125.000000 
+135.000000 144.000000 140.000000 120.000000 92.000000 80.000000 
+90.000000 108.000000 123.000000 113.000000 86.000000 72.000000 
+71.000000 63.000000 41.000000 20.000000 18.000000 17.000000 
+11.000000 12.000000 17.000000 11.000000 20.000000 23.000000 
+13.000000 4.000000 11.000000 8.000000 10.000000 13.000000 
+14.000000 11.000000 10.000000 13.000000 14.000000 9.000000 
+11.000000 15.000000 15.000000 19.000000 20.000000 26.000000 
+38.000000 44.000000 55.000000 79.000000 98.000000 98.000000 
+90.000000 89.000000 97.000000 109.000000 121.000000 129.000000 
+130.000000 125.000000 122.000000 125.000000 129.000000 126.000000 
+118.000000 113.000000 118.000000 127.000000 130.000000 128.000000 
+127.000000 129.000000 116.000000 121.000000 126.000000 128.000000 
+129.000000 128.000000 127.000000 130.000000 136.000000 141.000000 
+133.000000 112.000000 91.000000 89.000000 102.000000 113.000000 
+115.000000 104.000000 86.000000 78.000000 81.000000 73.000000 
+48.000000 27.000000 25.000000 18.000000 14.000000 11.000000 
+11.000000 10.000000 20.000000 30.000000 26.000000 15.000000 
+8.000000 15.000000 24.000000 27.000000 21.000000 11.000000 
+10.000000 14.000000 10.000000 8.000000 9.000000 10.000000 
+13.000000 24.000000 40.000000 51.000000 53.000000 58.000000 
+68.000000 74.000000 74.000000 76.000000 80.000000 86.000000 
+94.000000 106.000000 118.000000 124.000000 125.000000 125.000000 
+129.000000 131.000000 126.000000 120.000000 119.000000 126.000000 
+132.000000 133.000000 130.000000 128.000000 127.000000 127.000000 
+119.000000 122.000000 129.000000 132.000000 132.000000 134.000000 
+136.000000 135.000000 135.000000 136.000000 132.000000 115.000000 
+96.000000 95.000000 109.000000 117.000000 112.000000 98.000000 
+88.000000 88.000000 86.000000 69.000000 41.000000 30.000000 
+27.000000 13.000000 11.000000 15.000000 19.000000 20.000000 
+20.000000 20.000000 23.000000 22.000000 9.000000 25.000000 
+34.000000 23.000000 14.000000 10.000000 11.000000 17.000000 
+14.000000 9.000000 18.000000 35.000000 48.000000 49.000000 
+42.000000 42.000000 60.000000 79.000000 83.000000 71.000000 
+62.000000 63.000000 71.000000 78.000000 88.000000 104.000000 
+120.000000 123.000000 118.000000 120.000000 128.000000 133.000000 
+131.000000 127.000000 129.000000 132.000000 131.000000 130.000000 
+129.000000 126.000000 121.000000 121.000000 122.000000 126.000000 
+131.000000 136.000000 137.000000 134.000000 131.000000 133.000000 
+138.000000 139.000000 129.000000 112.000000 97.000000 98.000000 
+108.000000 113.000000 105.000000 92.000000 87.000000 92.000000 
+93.000000 75.000000 52.000000 37.000000 21.000000 11.000000 
+8.000000 15.000000 28.000000 30.000000 21.000000 14.000000 
+18.000000 20.000000 9.000000 19.000000 21.000000 14.000000 
+14.000000 19.000000 19.000000 18.000000 20.000000 23.000000 
+45.000000 85.000000 132.000000 166.000000 164.000000 132.000000 
+104.000000 95.000000 89.000000 74.000000 65.000000 68.000000 
+75.000000 78.000000 82.000000 95.000000 112.000000 118.000000 
+116.000000 114.000000 118.000000 125.000000 130.000000 130.000000 
+126.000000 124.000000 127.000000 130.000000 126.000000 118.000000 
+115.000000 121.000000 131.000000 136.000000 136.000000 137.000000 
+136.000000 129.000000 119.000000 121.000000 134.000000 141.000000 
+127.000000 104.000000 92.000000 97.000000 107.000000 108.000000 
+103.000000 98.000000 94.000000 91.000000 87.000000 74.000000 
+57.000000 35.000000 15.000000 15.000000 10.000000 22.000000 
+27.000000 20.000000 8.000000 14.000000 27.000000 26.000000 
+11.000000 11.000000 11.000000 19.000000 23.000000 18.000000 
+14.000000 11.000000 20.000000 40.000000 60.000000 112.000000 
+215.000000 312.000000 327.000000 253.000000 161.000000 107.000000 
+84.000000 72.000000 75.000000 84.000000 83.000000 80.000000 
+84.000000 97.000000 111.000000 117.000000 119.000000 120.000000 
+122.000000 124.000000 125.000000 123.000000 121.000000 123.000000 
+129.000000 131.000000 125.000000 118.000000 119.000000 126.000000 
+126.000000 132.000000 136.000000 135.000000 130.000000 124.000000 
+118.000000 120.000000 130.000000 139.000000 127.000000 100.000000 
+86.000000 93.000000 103.000000 105.000000 110.000000 142.000000 
+190.000000 204.000000 162.000000 97.000000 48.000000 24.000000 
+13.000000 11.000000 8.000000 22.000000 30.000000 23.000000 
+17.000000 17.000000 24.000000 29.000000 29.000000 22.000000 
+20.000000 22.000000 19.000000 11.000000 9.000000 21.000000 
+39.000000 44.000000 56.000000 135.000000 252.000000 326.000000 
+322.000000 261.000000 191.000000 128.000000 84.000000 74.000000 
+95.000000 112.000000 103.000000 86.000000 84.000000 100.000000 
+118.000000 122.000000 118.000000 117.000000 122.000000 127.000000 
+127.000000 121.000000 117.000000 117.000000 121.000000 126.000000 
+127.000000 124.000000 123.000000 126.000000 114.000000 122.000000 
+134.000000 140.000000 137.000000 127.000000 122.000000 125.000000 
+134.000000 137.000000 126.000000 107.000000 95.000000 93.000000 
+96.000000 109.000000 150.000000 253.000000 374.000000 401.000000 
+299.000000 152.000000 67.000000 40.000000 18.000000 9.000000 
+12.000000 17.000000 23.000000 23.000000 19.000000 17.000000 
+22.000000 32.000000 43.000000 48.000000 42.000000 32.000000 
+25.000000 19.000000 12.000000 15.000000 32.000000 22.000000 
+57.000000 157.000000 256.000000 311.000000 321.000000 296.000000 
+233.000000 148.000000 88.000000 82.000000 105.000000 117.000000 
+109.000000 93.000000 89.000000 103.000000 121.000000 127.000000 
+119.000000 113.000000 120.000000 132.000000 132.000000 120.000000 
+111.000000 115.000000 123.000000 126.000000 123.000000 121.000000 
+122.000000 124.000000 125.000000 130.000000 134.000000 134.000000 
+130.000000 123.000000 122.000000 128.000000 132.000000 131.000000 
+126.000000 120.000000 109.000000 86.000000 80.000000 121.000000 
+222.000000 368.000000 476.000000 465.000000 343.000000 199.000000 
+112.000000 58.000000 19.000000 12.000000 19.000000 21.000000 
+13.000000 7.000000 10.000000 16.000000 24.000000 36.000000 
+47.000000 47.000000 36.000000 24.000000 25.000000 35.000000 
+35.000000 16.000000 14.000000 7.000000 44.000000 129.000000 
+229.000000 310.000000 345.000000 307.000000 213.000000 122.000000 
+80.000000 85.000000 102.000000 106.000000 103.000000 100.000000 
+103.000000 113.000000 123.000000 126.000000 123.000000 122.000000 
+127.000000 130.000000 126.000000 118.000000 118.000000 124.000000 
+128.000000 121.000000 111.000000 108.000000 113.000000 119.000000 
+130.000000 129.000000 132.000000 134.000000 131.000000 123.000000 
+123.000000 131.000000 135.000000 127.000000 120.000000 117.000000 
+110.000000 93.000000 91.000000 140.000000 239.000000 351.000000 
+418.000000 414.000000 348.000000 250.000000 146.000000 66.000000 
+30.000000 21.000000 17.000000 14.000000 12.000000 16.000000 
+24.000000 31.000000 36.000000 40.000000 41.000000 33.000000 
+21.000000 16.000000 27.000000 45.000000 51.000000 37.000000 
+18.000000 16.000000 28.000000 79.000000 164.000000 247.000000 
+281.000000 247.000000 164.000000 85.000000 54.000000 70.000000 
+98.000000 112.000000 109.000000 105.000000 111.000000 118.000000 
+119.000000 117.000000 118.000000 123.000000 128.000000 128.000000 
+128.000000 129.000000 130.000000 128.000000 124.000000 119.000000 
+115.000000 115.000000 119.000000 122.000000 126.000000 125.000000 
+131.000000 137.000000 134.000000 127.000000 126.000000 135.000000 
+138.000000 129.000000 119.000000 121.000000 127.000000 124.000000 
+113.000000 120.000000 160.000000 229.000000 308.000000 352.000000 
+321.000000 220.000000 115.000000 68.000000 60.000000 55.000000 
+41.000000 27.000000 24.000000 34.000000 46.000000 54.000000 
+59.000000 59.000000 51.000000 40.000000 33.000000 33.000000 
+40.000000 48.000000 50.000000 42.000000 25.000000 12.000000 
+13.000000 46.000000 97.000000 137.000000 148.000000 134.000000 
+104.000000 76.000000 67.000000 81.000000 102.000000 113.000000 
+111.000000 106.000000 104.000000 105.000000 110.000000 115.000000 
+117.000000 116.000000 115.000000 120.000000 126.000000 129.000000 
+130.000000 130.000000 128.000000 125.000000 122.000000 124.000000 
+128.000000 129.000000 132.000000 130.000000 134.000000 135.000000 
+130.000000 123.000000 125.000000 132.000000 135.000000 132.000000 
+125.000000 124.000000 130.000000 134.000000 122.000000 100.000000 
+91.000000 117.000000 172.000000 211.000000 187.000000 114.000000 
+56.000000 47.000000 63.000000 76.000000 72.000000 63.000000 
+56.000000 59.000000 67.000000 73.000000 75.000000 74.000000 
+67.000000 56.000000 47.000000 43.000000 44.000000 49.000000 
+56.000000 55.000000 31.000000 8.000000 6.000000 26.000000 
+68.000000 98.000000 94.000000 75.000000 67.000000 77.000000 
+91.000000 105.000000 118.000000 127.000000 123.000000 110.000000 
+99.000000 99.000000 107.000000 113.000000 113.000000 114.000000 
+117.000000 120.000000 121.000000 123.000000 127.000000 130.000000 
+129.000000 127.000000 125.000000 124.000000 125.000000 129.000000 
+123.000000 124.000000 130.000000 134.000000 133.000000 130.000000 
+130.000000 132.000000 132.000000 126.000000 118.000000 114.000000 
+122.000000 136.000000 137.000000 120.000000 99.000000 84.000000 
+74.000000 70.000000 61.000000 48.000000 51.000000 54.000000 
+58.000000 68.000000 75.000000 79.000000 74.000000 65.000000 
+63.000000 63.000000 61.000000 58.000000 59.000000 61.000000 
+61.000000 54.000000 45.000000 40.000000 41.000000 41.000000 
+27.000000 18.000000 32.000000 39.000000 56.000000 85.000000 
+100.000000 95.000000 92.000000 104.000000 119.000000 122.000000 
+115.000000 110.000000 110.000000 111.000000 112.000000 111.000000 
+109.000000 107.000000 109.000000 115.000000 120.000000 121.000000 
+120.000000 120.000000 121.000000 121.000000 121.000000 124.000000 
+126.000000 126.000000 128.000000 134.000000 122.000000 124.000000 
+129.000000 133.000000 131.000000 128.000000 128.000000 131.000000 
+132.000000 124.000000 112.000000 107.000000 118.000000 134.000000 
+136.000000 117.000000 99.000000 96.000000 97.000000 86.000000 
+58.000000 37.000000 44.000000 60.000000 65.000000 63.000000 
+65.000000 68.000000 61.000000 47.000000 37.000000 38.000000 
+45.000000 54.000000 58.000000 55.000000 49.000000 41.000000 
+40.000000 42.000000 37.000000 30.000000 30.000000 29.000000 
+32.000000 48.000000 67.000000 85.000000 99.000000 99.000000 
+94.000000 99.000000 115.000000 125.000000 122.000000 113.000000 
+107.000000 105.000000 103.000000 101.000000 103.000000 109.000000 
+116.000000 118.000000 118.000000 118.000000 118.000000 118.000000 
+120.000000 122.000000 123.000000 122.000000 120.000000 119.000000 
+123.000000 128.000000 130.000000 122.000000 124.000000 130.000000 
+132.000000 130.000000 130.000000 131.000000 128.000000 117.000000 
+108.000000 112.000000 126.000000 136.000000 131.000000 118.000000 
+104.000000 94.000000 86.000000 75.000000 55.000000 38.000000 
+39.000000 48.000000 53.000000 51.000000 47.000000 46.000000 
+46.000000 39.000000 27.000000 23.000000 34.000000 48.000000 
+46.000000 37.000000 33.000000 35.000000 41.000000 41.000000 
+29.000000 20.000000 26.000000 41.000000 50.000000 60.000000 
+78.000000 95.000000 100.000000 96.000000 94.000000 102.000000 
+116.000000 128.000000 128.000000 122.000000 116.000000 113.000000 
+110.000000 107.000000 107.000000 112.000000 118.000000 124.000000 
+127.000000 125.000000 118.000000 113.000000 114.000000 122.000000 
+128.000000 128.000000 124.000000 122.000000 122.000000 124.000000 
+116.000000 113.000000 117.000000 123.000000 130.000000 135.000000 
+137.000000 135.000000 126.000000 114.000000 106.000000 111.000000 
+125.000000 133.000000 126.000000 112.000000 102.000000 97.000000 
+95.000000 89.000000 78.000000 65.000000 61.000000 61.000000 
+60.000000 51.000000 31.000000 18.000000 36.000000 72.000000 
+106.000000 113.000000 93.000000 76.000000 75.000000 67.000000 
+58.000000 43.000000 33.000000 26.000000 17.000000 16.000000 
+34.000000 63.000000 82.000000 83.000000 83.000000 89.000000 
+97.000000 99.000000 101.000000 107.000000 118.000000 130.000000 
+137.000000 137.000000 130.000000 121.000000 117.000000 117.000000 
+117.000000 114.000000 113.000000 117.000000 120.000000 112.000000 
+97.000000 88.000000 94.000000 109.000000 119.000000 122.000000 
+124.000000 128.000000 128.000000 123.000000 111.000000 115.000000 
+121.000000 125.000000 132.000000 139.000000 139.000000 129.000000 
+119.000000 116.000000 118.000000 124.000000 131.000000 129.000000 
+113.000000 95.000000 94.000000 106.000000 112.000000 105.000000 
+94.000000 94.000000 100.000000 99.000000 94.000000 83.000000 
+59.000000 34.000000 53.000000 178.000000 343.000000 405.000000 
+302.000000 140.000000 66.000000 55.000000 75.000000 80.000000 
+67.000000 56.000000 50.000000 46.000000 53.000000 74.000000 
+93.000000 94.000000 84.000000 85.000000 92.000000 95.000000 
+96.000000 104.000000 120.000000 134.000000 143.000000 144.000000 
+138.000000 126.000000 116.000000 115.000000 117.000000 117.000000 
+116.000000 118.000000 120.000000 113.000000 103.000000 99.000000 
+105.000000 112.000000 114.000000 117.000000 123.000000 126.000000 
+123.000000 118.000000 117.000000 125.000000 133.000000 135.000000 
+133.000000 132.000000 129.000000 124.000000 117.000000 114.000000 
+118.000000 124.000000 126.000000 116.000000 99.000000 87.000000 
+89.000000 98.000000 103.000000 100.000000 94.000000 88.000000 
+82.000000 78.000000 78.000000 74.000000 56.000000 42.000000 
+66.000000 209.000000 385.000000 453.000000 357.000000 183.000000 
+71.000000 49.000000 63.000000 68.000000 64.000000 68.000000 
+76.000000 81.000000 83.000000 88.000000 98.000000 104.000000 
+100.000000 97.000000 101.000000 103.000000 104.000000 113.000000 
+123.000000 131.000000 141.000000 148.000000 144.000000 133.000000 
+123.000000 118.000000 115.000000 111.000000 112.000000 116.000000 
+120.000000 119.000000 118.000000 117.000000 118.000000 116.000000 
+116.000000 119.000000 120.000000 115.000000 106.000000 106.000000 
+130.000000 130.000000 132.000000 136.000000 138.000000 132.000000 
+120.000000 113.000000 114.000000 120.000000 125.000000 124.000000 
+112.000000 94.000000 82.000000 81.000000 87.000000 93.000000 
+93.000000 86.000000 80.000000 80.000000 86.000000 92.000000 
+85.000000 62.000000 37.000000 38.000000 95.000000 205.000000 
+306.000000 328.000000 260.000000 158.000000 91.000000 65.000000 
+66.000000 70.000000 63.000000 56.000000 60.000000 79.000000 
+94.000000 95.000000 90.000000 88.000000 95.000000 108.000000 
+119.000000 112.000000 90.000000 82.000000 103.000000 130.000000 
+147.000000 147.000000 135.000000 127.000000 128.000000 127.000000 
+118.000000 112.000000 115.000000 123.000000 127.000000 128.000000 
+128.000000 123.000000 116.000000 113.000000 120.000000 125.000000 
+122.000000 115.000000 115.000000 123.000000 129.000000 131.000000 
+132.000000 136.000000 136.000000 130.000000 118.000000 108.000000 
+103.000000 103.000000 111.000000 124.000000 132.000000 125.000000 
+105.000000 85.000000 77.000000 81.000000 91.000000 99.000000 
+107.000000 111.000000 108.000000 98.000000 82.000000 61.000000 
+45.000000 52.000000 85.000000 145.000000 193.000000 193.000000 
+152.000000 108.000000 82.000000 70.000000 65.000000 58.000000 
+49.000000 47.000000 56.000000 68.000000 74.000000 78.000000 
+88.000000 98.000000 99.000000 104.000000 126.000000 148.000000 
+133.000000 88.000000 81.000000 109.000000 133.000000 139.000000 
+130.000000 124.000000 129.000000 137.000000 139.000000 133.000000 
+126.000000 123.000000 120.000000 118.000000 118.000000 122.000000 
+128.000000 135.000000 137.000000 132.000000 124.000000 123.000000 
+128.000000 132.000000 126.000000 123.000000 123.000000 126.000000 
+125.000000 120.000000 113.000000 106.000000 100.000000 101.000000 
+111.000000 126.000000 133.000000 124.000000 104.000000 93.000000 
+102.000000 113.000000 111.000000 103.000000 105.000000 115.000000 
+116.000000 106.000000 92.000000 84.000000 80.000000 82.000000 
+91.000000 105.000000 115.000000 110.000000 92.000000 75.000000 
+66.000000 64.000000 64.000000 63.000000 63.000000 63.000000 
+56.000000 47.000000 47.000000 64.000000 89.000000 105.000000 
+103.000000 90.000000 86.000000 99.000000 113.000000 106.000000 
+91.000000 105.000000 135.000000 148.000000 141.000000 126.000000 
+116.000000 115.000000 122.000000 129.000000 129.000000 125.000000 
+121.000000 125.000000 129.000000 127.000000 122.000000 120.000000 
+125.000000 133.000000 136.000000 133.000000 131.000000 128.000000 
+121.000000 120.000000 124.000000 124.000000 116.000000 102.000000 
+92.000000 92.000000 101.000000 112.000000 115.000000 110.000000 
+107.000000 107.000000 106.000000 110.000000 114.000000 109.000000 
+101.000000 103.000000 115.000000 125.000000 127.000000 127.000000 
+131.000000 135.000000 131.000000 122.000000 119.000000 119.000000 
+113.000000 98.000000 81.000000 72.000000 75.000000 87.000000 
+100.000000 104.000000 96.000000 86.000000 80.000000 75.000000 
+71.000000 72.000000 78.000000 85.000000 91.000000 91.000000 
+80.000000 61.000000 60.000000 102.000000 151.000000 163.000000 
+147.000000 134.000000 137.000000 136.000000 124.000000 120.000000 
+130.000000 139.000000 134.000000 118.000000 107.000000 110.000000 
+120.000000 123.000000 120.000000 123.000000 131.000000 135.000000 
+130.000000 124.000000 123.000000 126.000000 120.000000 118.000000 
+115.000000 113.000000 109.000000 102.000000 91.000000 83.000000 
+86.000000 101.000000 121.000000 127.000000 115.000000 103.000000 
+107.000000 126.000000 141.000000 137.000000 119.000000 107.000000 
+111.000000 120.000000 128.000000 133.000000 136.000000 134.000000 
+128.000000 125.000000 127.000000 126.000000 118.000000 111.000000 
+114.000000 123.000000 129.000000 133.000000 139.000000 143.000000 
+140.000000 131.000000 125.000000 118.000000 101.000000 79.000000 
+72.000000 85.000000 104.000000 109.000000 96.000000 71.000000 
+31.000000 41.000000 91.000000 119.000000 118.000000 119.000000 
+129.000000 130.000000 122.000000 123.000000 127.000000 125.000000 
+117.000000 112.000000 109.000000 109.000000 114.000000 122.000000 
+128.000000 130.000000 129.000000 127.000000 127.000000 127.000000 
+124.000000 119.000000 118.000000 118.000000 117.000000 113.000000 
+103.000000 92.000000 83.000000 81.000000 90.000000 105.000000 
+122.000000 132.000000 130.000000 117.000000 108.000000 110.000000 
+116.000000 117.000000 116.000000 119.000000 126.000000 129.000000 
+128.000000 129.000000 134.000000 137.000000 135.000000 129.000000 
+127.000000 128.000000 132.000000 134.000000 133.000000 130.000000 
+129.000000 131.000000 135.000000 137.000000 134.000000 130.000000 
+129.000000 134.000000 134.000000 118.000000 91.000000 77.000000 
+89.000000 108.000000 113.000000 99.000000 79.000000 60.000000 
+56.000000 78.000000 99.000000 103.000000 109.000000 125.000000 
+139.000000 139.000000 128.000000 119.000000 119.000000 124.000000 
+126.000000 124.000000 124.000000 127.000000 128.000000 125.000000 
+121.000000 123.000000 129.000000 130.000000 122.000000 114.000000 
+119.000000 116.000000 108.000000 102.000000 101.000000 96.000000 
+84.000000 80.000000 94.000000 114.000000 122.000000 114.000000 
+99.000000 87.000000 86.000000 97.000000 113.000000 126.000000 
+131.000000 131.000000 132.000000 136.000000 140.000000 138.000000 
+133.000000 128.000000 128.000000 130.000000 129.000000 126.000000 
+128.000000 134.000000 139.000000 139.000000 135.000000 132.000000 
+130.000000 130.000000 133.000000 137.000000 138.000000 139.000000 
+142.000000 144.000000 136.000000 116.000000 101.000000 104.000000 
+118.000000 120.000000 103.000000 88.000000 83.000000 77.000000 
+73.000000 74.000000 81.000000 93.000000 99.000000 88.000000 
+68.000000 58.000000 65.000000 81.000000 96.000000 117.000000 
+137.000000 142.000000 133.000000 126.000000 126.000000 131.000000 
+132.000000 127.000000 121.000000 119.000000 109.000000 100.000000 
+92.000000 94.000000 103.000000 105.000000 99.000000 97.000000 
+108.000000 121.000000 115.000000 91.000000 69.000000 63.000000 
+73.000000 91.000000 108.000000 121.000000 128.000000 128.000000 
+128.000000 133.000000 140.000000 140.000000 133.000000 127.000000 
+128.000000 131.000000 130.000000 127.000000 126.000000 129.000000 
+130.000000 129.000000 131.000000 134.000000 135.000000 132.000000 
+133.000000 137.000000 137.000000 132.000000 129.000000 134.000000 
+135.000000 121.000000 102.000000 102.000000 124.000000 139.000000 
+126.000000 106.000000 98.000000 88.000000 72.000000 56.000000 
+42.000000 32.000000 29.000000 26.000000 15.000000 10.000000 
+11.000000 12.000000 34.000000 77.000000 118.000000 142.000000 
+142.000000 131.000000 124.000000 126.000000 129.000000 127.000000 
+125.000000 127.000000 90.000000 79.000000 75.000000 75.000000 
+79.000000 88.000000 100.000000 117.000000 137.000000 137.000000 
+107.000000 66.000000 42.000000 47.000000 71.000000 98.000000 
+116.000000 124.000000 129.000000 136.000000 143.000000 146.000000 
+142.000000 134.000000 128.000000 125.000000 126.000000 128.000000 
+129.000000 130.000000 129.000000 127.000000 127.000000 130.000000 
+134.000000 133.000000 133.000000 135.000000 137.000000 133.000000 
+126.000000 121.000000 126.000000 135.000000 140.000000 134.000000 
+123.000000 120.000000 132.000000 142.000000 131.000000 102.000000 
+84.000000 84.000000 84.000000 78.000000 65.000000 44.000000 
+24.000000 11.000000 8.000000 18.000000 23.000000 22.000000 
+28.000000 33.000000 70.000000 127.000000 148.000000 135.000000 
+124.000000 128.000000 131.000000 122.000000 115.000000 117.000000 
+67.000000 63.000000 62.000000 73.000000 92.000000 110.000000 
+126.000000 145.000000 156.000000 138.000000 99.000000 65.000000 
+47.000000 49.000000 70.000000 103.000000 127.000000 131.000000 
+126.000000 128.000000 140.000000 147.000000 143.000000 132.000000 
+126.000000 125.000000 126.000000 125.000000 124.000000 123.000000 
+125.000000 128.000000 132.000000 137.000000 140.000000 138.000000 
+134.000000 128.000000 123.000000 121.000000 125.000000 134.000000 
+141.000000 141.000000 139.000000 139.000000 141.000000 136.000000 
+119.000000 95.000000 75.000000 69.000000 76.000000 85.000000 
+88.000000 86.000000 77.000000 60.000000 40.000000 24.000000 
+18.000000 15.000000 10.000000 14.000000 30.000000 23.000000 
+38.000000 100.000000 133.000000 131.000000 124.000000 125.000000 
+124.000000 117.000000 114.000000 120.000000 45.000000 47.000000 
+69.000000 96.000000 115.000000 125.000000 128.000000 130.000000 
+126.000000 111.000000 94.000000 73.000000 54.000000 53.000000 
+81.000000 121.000000 137.000000 130.000000 122.000000 127.000000 
+139.000000 142.000000 138.000000 130.000000 123.000000 118.000000 
+116.000000 117.000000 120.000000 124.000000 128.000000 131.000000 
+131.000000 131.000000 132.000000 133.000000 133.000000 131.000000 
+129.000000 129.000000 130.000000 131.000000 132.000000 134.000000 
+134.000000 133.000000 130.000000 127.000000 120.000000 107.000000 
+88.000000 74.000000 70.000000 70.000000 76.000000 84.000000 
+78.000000 58.000000 32.000000 24.000000 24.000000 11.000000 
+3.000000 7.000000 20.000000 30.000000 28.000000 57.000000 
+101.000000 122.000000 123.000000 119.000000 114.000000 113.000000 
+117.000000 121.000000 36.000000 36.000000 37.000000 66.000000 
+102.000000 111.000000 108.000000 102.000000 107.000000 122.000000 
+115.000000 80.000000 52.000000 61.000000 101.000000 130.000000 
+135.000000 129.000000 129.000000 135.000000 140.000000 140.000000 
+136.000000 129.000000 122.000000 118.000000 117.000000 118.000000 
+122.000000 124.000000 123.000000 122.000000 124.000000 131.000000 
+135.000000 131.000000 125.000000 124.000000 127.000000 127.000000 
+128.000000 133.000000 137.000000 136.000000 132.000000 131.000000 
+136.000000 139.000000 129.000000 105.000000 74.000000 60.000000 
+70.000000 71.000000 60.000000 69.000000 81.000000 64.000000 
+42.000000 39.000000 31.000000 12.000000 7.000000 6.000000 
+10.000000 25.000000 22.000000 25.000000 65.000000 110.000000 
+130.000000 126.000000 111.000000 105.000000 108.000000 114.000000 
+9.000000 34.000000 66.000000 92.000000 110.000000 109.000000 
+88.000000 83.000000 115.000000 131.000000 103.000000 62.000000 
+55.000000 89.000000 126.000000 139.000000 137.000000 136.000000 
+138.000000 139.000000 136.000000 133.000000 129.000000 124.000000 
+122.000000 124.000000 125.000000 124.000000 122.000000 121.000000 
+122.000000 123.000000 123.000000 124.000000 126.000000 126.000000 
+125.000000 124.000000 124.000000 126.000000 131.000000 134.000000 
+133.000000 127.000000 123.000000 124.000000 129.000000 133.000000 
+131.000000 117.000000 90.000000 63.000000 66.000000 84.000000 
+82.000000 61.000000 48.000000 35.000000 18.000000 22.000000 
+31.000000 19.000000 8.000000 8.000000 10.000000 15.000000 
+18.000000 14.000000 34.000000 79.000000 111.000000 122.000000 
+120.000000 115.000000 115.000000 116.000000 29.000000 46.000000 
+87.000000 102.000000 93.000000 88.000000 84.000000 97.000000 
+127.000000 122.000000 87.000000 63.000000 73.000000 109.000000 
+135.000000 142.000000 139.000000 137.000000 137.000000 135.000000 
+129.000000 123.000000 122.000000 123.000000 124.000000 124.000000 
+123.000000 123.000000 123.000000 123.000000 123.000000 125.000000 
+127.000000 126.000000 125.000000 125.000000 127.000000 133.000000 
+138.000000 140.000000 137.000000 131.000000 129.000000 130.000000 
+130.000000 127.000000 127.000000 136.000000 143.000000 134.000000 
+109.000000 83.000000 76.000000 85.000000 90.000000 76.000000 
+51.000000 29.000000 19.000000 21.000000 23.000000 18.000000 
+11.000000 6.000000 5.000000 8.000000 14.000000 16.000000 
+22.000000 48.000000 87.000000 121.000000 131.000000 122.000000 
+113.000000 118.000000 9.000000 32.000000 92.000000 122.000000 
+109.000000 79.000000 69.000000 96.000000 129.000000 115.000000 
+76.000000 64.000000 94.000000 130.000000 141.000000 134.000000 
+130.000000 134.000000 138.000000 135.000000 130.000000 126.000000 
+123.000000 121.000000 123.000000 127.000000 128.000000 127.000000 
+126.000000 127.000000 129.000000 130.000000 127.000000 124.000000 
+123.000000 123.000000 124.000000 125.000000 127.000000 130.000000 
+134.000000 133.000000 128.000000 125.000000 125.000000 128.000000 
+127.000000 128.000000 131.000000 130.000000 117.000000 95.000000 
+82.000000 88.000000 98.000000 95.000000 77.000000 50.000000 
+24.000000 11.000000 10.000000 9.000000 8.000000 11.000000 
+12.000000 11.000000 7.000000 15.000000 29.000000 31.000000 
+49.000000 96.000000 131.000000 132.000000 125.000000 127.000000 
+22.000000 41.000000 83.000000 101.000000 86.000000 67.000000 
+70.000000 100.000000 124.000000 110.000000 81.000000 77.000000 
+104.000000 132.000000 139.000000 131.000000 128.000000 131.000000 
+133.000000 131.000000 125.000000 119.000000 116.000000 120.000000 
+129.000000 133.000000 129.000000 124.000000 125.000000 128.000000 
+125.000000 119.000000 117.000000 120.000000 122.000000 122.000000 
+127.000000 134.000000 138.000000 139.000000 139.000000 136.000000 
+129.000000 122.000000 123.000000 131.000000 137.000000 136.000000 
+135.000000 134.000000 122.000000 102.000000 89.000000 97.000000 
+112.000000 114.000000 95.000000 62.000000 30.000000 14.000000 
+12.000000 10.000000 8.000000 10.000000 9.000000 10.000000 
+10.000000 9.000000 24.000000 30.000000 25.000000 54.000000 
+97.000000 114.000000 126.000000 135.000000 135.000000 134.000000 
+135.000000 136.000000 136.000000 138.000000 141.000000 138.000000 
+127.000000 100.000000 63.000000 60.000000 108.000000 120.000000 
+77.000000 22.000000 6.000000 12.000000 8.000000 8.000000 
+6.000000 10.000000 11.000000 7.000000 7.000000 12.000000 
+13.000000 11.000000 7.000000 6.000000 6.000000 6.000000 
+10.000000 12.000000 11.000000 11.000000 11.000000 10.000000 
+21.000000 34.000000 32.000000 19.000000 13.000000 6.000000 
+12.000000 13.000000 10.000000 11.000000 16.000000 22.000000 
+15.000000 10.000000 9.000000 9.000000 13.000000 18.000000 
+17.000000 19.000000 39.000000 56.000000 48.000000 24.000000 
+24.000000 49.000000 59.000000 48.000000 31.000000 21.000000 
+18.000000 17.000000 18.000000 24.000000 37.000000 48.000000 
+48.000000 46.000000 132.000000 130.000000 133.000000 135.000000 
+137.000000 140.000000 147.000000 151.000000 141.000000 115.000000 
+78.000000 62.000000 89.000000 105.000000 76.000000 26.000000 
+2.000000 16.000000 11.000000 8.000000 9.000000 10.000000 
+8.000000 8.000000 6.000000 7.000000 9.000000 10.000000 
+8.000000 7.000000 9.000000 9.000000 9.000000 8.000000 
+8.000000 8.000000 7.000000 13.000000 28.000000 40.000000 
+32.000000 12.000000 8.000000 8.000000 20.000000 21.000000 
+12.000000 7.000000 16.000000 25.000000 14.000000 7.000000 
+13.000000 14.000000 10.000000 17.000000 17.000000 6.000000 
+21.000000 45.000000 39.000000 24.000000 34.000000 52.000000 
+49.000000 34.000000 27.000000 28.000000 26.000000 19.000000 
+9.000000 4.000000 14.000000 27.000000 29.000000 26.000000 
+129.000000 131.000000 135.000000 140.000000 140.000000 131.000000 
+125.000000 134.000000 145.000000 135.000000 100.000000 68.000000 
+71.000000 85.000000 76.000000 48.000000 18.000000 10.000000 
+9.000000 11.000000 14.000000 12.000000 9.000000 11.000000 
+9.000000 8.000000 13.000000 14.000000 11.000000 11.000000 
+10.000000 8.000000 9.000000 6.000000 5.000000 5.000000 
+4.000000 12.000000 22.000000 25.000000 19.000000 7.000000 
+7.000000 12.000000 19.000000 18.000000 13.000000 10.000000 
+15.000000 17.000000 12.000000 10.000000 15.000000 19.000000 
+11.000000 14.000000 21.000000 19.000000 31.000000 45.000000 
+40.000000 27.000000 28.000000 34.000000 23.000000 12.000000 
+19.000000 30.000000 33.000000 25.000000 11.000000 2.000000 
+3.000000 8.000000 14.000000 17.000000 133.000000 137.000000 
+139.000000 141.000000 139.000000 130.000000 115.000000 111.000000 
+124.000000 138.000000 132.000000 104.000000 76.000000 61.000000 
+56.000000 49.000000 32.000000 17.000000 15.000000 12.000000 
+7.000000 9.000000 11.000000 12.000000 10.000000 9.000000 
+11.000000 11.000000 11.000000 9.000000 10.000000 10.000000 
+11.000000 9.000000 7.000000 9.000000 11.000000 16.000000 
+20.000000 18.000000 13.000000 11.000000 13.000000 11.000000 
+8.000000 7.000000 7.000000 11.000000 13.000000 15.000000 
+13.000000 10.000000 20.000000 27.000000 19.000000 16.000000 
+15.000000 23.000000 38.000000 39.000000 30.000000 23.000000 
+25.000000 29.000000 13.000000 3.000000 18.000000 33.000000 
+38.000000 36.000000 31.000000 27.000000 17.000000 8.000000 
+11.000000 15.000000 133.000000 135.000000 137.000000 139.000000 
+139.000000 135.000000 125.000000 116.000000 113.000000 116.000000 
+122.000000 126.000000 117.000000 89.000000 58.000000 40.000000 
+27.000000 14.000000 13.000000 11.000000 6.000000 12.000000 
+12.000000 10.000000 11.000000 10.000000 5.000000 7.000000 
+7.000000 8.000000 8.000000 9.000000 11.000000 13.000000 
+11.000000 10.000000 11.000000 19.000000 25.000000 19.000000 
+9.000000 9.000000 11.000000 7.000000 6.000000 7.000000 
+7.000000 8.000000 7.000000 10.000000 11.000000 14.000000 
+24.000000 25.000000 18.000000 15.000000 16.000000 20.000000 
+16.000000 19.000000 25.000000 20.000000 15.000000 6.000000 
+4.000000 26.000000 54.000000 71.000000 77.000000 78.000000 
+78.000000 71.000000 53.000000 30.000000 15.000000 14.000000 
+128.000000 126.000000 130.000000 136.000000 137.000000 128.000000 
+118.000000 117.000000 127.000000 133.000000 125.000000 109.000000 
+96.000000 82.000000 59.000000 41.000000 32.000000 20.000000 
+10.000000 7.000000 10.000000 22.000000 31.000000 30.000000 
+23.000000 18.000000 15.000000 16.000000 14.000000 13.000000 
+9.000000 6.000000 7.000000 9.000000 9.000000 7.000000 
+10.000000 20.000000 22.000000 14.000000 8.000000 9.000000 
+11.000000 11.000000 10.000000 11.000000 10.000000 8.000000 
+8.000000 9.000000 7.000000 8.000000 13.000000 13.000000 
+7.000000 8.000000 22.000000 27.000000 18.000000 11.000000 
+17.000000 27.000000 33.000000 44.000000 72.000000 103.000000 
+114.000000 110.000000 105.000000 102.000000 97.000000 85.000000 
+70.000000 57.000000 49.000000 48.000000 124.000000 118.000000 
+124.000000 133.000000 137.000000 132.000000 126.000000 128.000000 
+139.000000 145.000000 132.000000 104.000000 87.000000 84.000000 
+74.000000 56.000000 44.000000 28.000000 8.000000 9.000000 
+12.000000 26.000000 26.000000 15.000000 23.000000 22.000000 
+14.000000 8.000000 10.000000 10.000000 4.000000 4.000000 
+5.000000 6.000000 10.000000 12.000000 11.000000 11.000000 
+12.000000 6.000000 10.000000 13.000000 11.000000 10.000000 
+10.000000 9.000000 11.000000 8.000000 12.000000 19.000000 
+11.000000 7.000000 18.000000 19.000000 11.000000 10.000000 
+14.000000 18.000000 14.000000 7.000000 13.000000 30.000000 
+55.000000 89.000000 117.000000 126.000000 123.000000 121.000000 
+121.000000 117.000000 107.000000 95.000000 86.000000 83.000000 
+84.000000 84.000000 123.000000 123.000000 126.000000 128.000000 
+130.000000 134.000000 137.000000 135.000000 132.000000 131.000000 
+125.000000 106.000000 84.000000 81.000000 86.000000 74.000000 
+55.000000 46.000000 29.000000 15.000000 10.000000 14.000000 
+14.000000 20.000000 32.000000 21.000000 14.000000 16.000000 
+13.000000 11.000000 12.000000 17.000000 15.000000 12.000000 
+14.000000 20.000000 13.000000 6.000000 13.000000 9.000000 
+10.000000 11.000000 8.000000 8.000000 12.000000 9.000000 
+8.000000 5.000000 9.000000 13.000000 12.000000 18.000000 
+14.000000 15.000000 24.000000 22.000000 15.000000 5.000000 
+0.000000 11.000000 30.000000 53.000000 88.000000 118.000000 
+125.000000 114.000000 106.000000 113.000000 124.000000 126.000000 
+122.000000 116.000000 110.000000 108.000000 108.000000 107.000000 
+132.000000 131.000000 124.000000 120.000000 124.000000 133.000000 
+139.000000 138.000000 131.000000 125.000000 122.000000 111.000000 
+91.000000 82.000000 94.000000 86.000000 51.000000 33.000000 
+41.000000 26.000000 10.000000 16.000000 26.000000 30.000000 
+20.000000 14.000000 22.000000 25.000000 15.000000 10.000000 
+14.000000 16.000000 14.000000 9.000000 9.000000 11.000000 
+10.000000 11.000000 20.000000 18.000000 10.000000 8.000000 
+10.000000 14.000000 15.000000 6.000000 7.000000 11.000000 
+10.000000 6.000000 9.000000 13.000000 14.000000 27.000000 
+40.000000 36.000000 24.000000 33.000000 59.000000 86.000000 
+102.000000 111.000000 118.000000 120.000000 118.000000 122.000000 
+133.000000 141.000000 141.000000 135.000000 131.000000 129.000000 
+126.000000 126.000000 130.000000 134.000000 135.000000 135.000000 
+131.000000 128.000000 130.000000 134.000000 138.000000 138.000000 
+133.000000 128.000000 126.000000 121.000000 105.000000 93.000000 
+96.000000 90.000000 54.000000 23.000000 43.000000 38.000000 
+12.000000 23.000000 33.000000 20.000000 9.000000 17.000000 
+20.000000 13.000000 8.000000 6.000000 9.000000 5.000000 
+8.000000 11.000000 15.000000 14.000000 14.000000 17.000000 
+18.000000 15.000000 9.000000 9.000000 12.000000 12.000000 
+8.000000 10.000000 19.000000 18.000000 11.000000 13.000000 
+14.000000 12.000000 24.000000 46.000000 66.000000 61.000000 
+44.000000 71.000000 118.000000 136.000000 135.000000 129.000000 
+119.000000 110.000000 111.000000 124.000000 135.000000 135.000000 
+127.000000 119.000000 118.000000 118.000000 120.000000 125.000000 
+132.000000 134.000000 127.000000 126.000000 125.000000 128.000000 
+132.000000 135.000000 135.000000 132.000000 130.000000 131.000000 
+131.000000 123.000000 103.000000 88.000000 91.000000 94.000000 
+66.000000 34.000000 61.000000 64.000000 29.000000 25.000000 
+35.000000 20.000000 21.000000 23.000000 14.000000 4.000000 
+8.000000 9.000000 11.000000 14.000000 18.000000 18.000000 
+16.000000 16.000000 13.000000 10.000000 9.000000 11.000000 
+10.000000 9.000000 10.000000 9.000000 8.000000 14.000000 
+18.000000 17.000000 15.000000 14.000000 16.000000 22.000000 
+31.000000 52.000000 73.000000 64.000000 59.000000 91.000000 
+119.000000 121.000000 116.000000 116.000000 115.000000 116.000000 
+123.000000 131.000000 127.000000 113.000000 98.000000 90.000000 
+91.000000 97.000000 105.000000 115.000000 119.000000 115.000000 
+128.000000 126.000000 128.000000 132.000000 135.000000 135.000000 
+134.000000 134.000000 136.000000 137.000000 135.000000 125.000000 
+103.000000 84.000000 86.000000 98.000000 81.000000 46.000000 
+71.000000 91.000000 63.000000 41.000000 35.000000 18.000000 
+20.000000 18.000000 9.000000 6.000000 8.000000 9.000000 
+11.000000 15.000000 17.000000 13.000000 10.000000 11.000000 
+8.000000 5.000000 7.000000 10.000000 9.000000 8.000000 
+9.000000 9.000000 10.000000 9.000000 12.000000 19.000000 
+18.000000 9.000000 14.000000 25.000000 41.000000 61.000000 
+67.000000 56.000000 62.000000 86.000000 103.000000 110.000000 
+117.000000 121.000000 119.000000 115.000000 119.000000 126.000000 
+126.000000 117.000000 107.000000 100.000000 99.000000 100.000000 
+101.000000 103.000000 103.000000 104.000000 130.000000 131.000000 
+133.000000 131.000000 128.000000 126.000000 131.000000 137.000000 
+139.000000 138.000000 133.000000 124.000000 107.000000 90.000000 
+85.000000 93.000000 89.000000 63.000000 69.000000 102.000000 
+89.000000 54.000000 36.000000 25.000000 16.000000 13.000000 
+11.000000 7.000000 7.000000 11.000000 13.000000 14.000000 
+14.000000 9.000000 8.000000 10.000000 10.000000 9.000000 
+9.000000 9.000000 7.000000 8.000000 8.000000 8.000000 
+11.000000 12.000000 16.000000 17.000000 13.000000 16.000000 
+23.000000 30.000000 46.000000 65.000000 73.000000 72.000000 
+71.000000 76.000000 88.000000 106.000000 121.000000 125.000000 
+122.000000 118.000000 117.000000 119.000000 119.000000 116.000000 
+114.000000 115.000000 118.000000 116.000000 111.000000 107.000000 
+108.000000 111.000000 130.000000 133.000000 134.000000 130.000000 
+125.000000 125.000000 132.000000 138.000000 140.000000 139.000000 
+135.000000 127.000000 112.000000 99.000000 98.000000 106.000000 
+103.000000 80.000000 73.000000 104.000000 96.000000 65.000000 
+48.000000 35.000000 18.000000 14.000000 13.000000 9.000000 
+9.000000 14.000000 16.000000 15.000000 14.000000 10.000000 
+6.000000 8.000000 9.000000 9.000000 7.000000 5.000000 
+7.000000 10.000000 11.000000 12.000000 14.000000 15.000000 
+13.000000 8.000000 12.000000 23.000000 28.000000 36.000000 
+52.000000 72.000000 89.000000 93.000000 83.000000 80.000000 
+93.000000 109.000000 122.000000 130.000000 132.000000 128.000000 
+122.000000 120.000000 122.000000 121.000000 119.000000 120.000000 
+124.000000 126.000000 124.000000 123.000000 126.000000 127.000000 
+126.000000 132.000000 136.000000 136.000000 135.000000 136.000000 
+138.000000 140.000000 141.000000 140.000000 133.000000 119.000000 
+102.000000 95.000000 104.000000 122.000000 126.000000 97.000000 
+70.000000 86.000000 96.000000 84.000000 62.000000 40.000000 
+27.000000 18.000000 17.000000 16.000000 14.000000 14.000000 
+19.000000 19.000000 17.000000 11.000000 10.000000 11.000000 
+8.000000 5.000000 6.000000 6.000000 10.000000 13.000000 
+12.000000 13.000000 16.000000 14.000000 6.000000 5.000000 
+15.000000 24.000000 31.000000 44.000000 61.000000 79.000000 
+91.000000 86.000000 77.000000 84.000000 102.000000 114.000000 
+121.000000 130.000000 137.000000 134.000000 123.000000 115.000000 
+116.000000 121.000000 123.000000 122.000000 121.000000 122.000000 
+122.000000 123.000000 126.000000 128.000000 123.000000 130.000000 
+134.000000 135.000000 137.000000 139.000000 138.000000 134.000000 
+134.000000 137.000000 134.000000 118.000000 98.000000 86.000000 
+91.000000 109.000000 123.000000 106.000000 71.000000 68.000000 
+92.000000 97.000000 77.000000 52.000000 38.000000 22.000000 
+16.000000 19.000000 21.000000 18.000000 22.000000 31.000000 
+32.000000 23.000000 16.000000 12.000000 9.000000 8.000000 
+8.000000 8.000000 10.000000 10.000000 8.000000 11.000000 
+14.000000 9.000000 2.000000 9.000000 20.000000 30.000000 
+45.000000 58.000000 66.000000 72.000000 73.000000 69.000000 
+70.000000 83.000000 103.000000 117.000000 124.000000 129.000000 
+135.000000 135.000000 129.000000 121.000000 120.000000 125.000000 
+129.000000 124.000000 119.000000 119.000000 123.000000 124.000000 
+121.000000 123.000000 125.000000 133.000000 136.000000 134.000000 
+133.000000 133.000000 134.000000 134.000000 138.000000 143.000000 
+141.000000 125.000000 101.000000 88.000000 91.000000 103.000000 
+113.000000 103.000000 80.000000 69.000000 86.000000 98.000000 
+82.000000 52.000000 35.000000 23.000000 16.000000 23.000000 
+21.000000 20.000000 20.000000 27.000000 29.000000 20.000000 
+13.000000 7.000000 13.000000 18.000000 12.000000 6.000000 
+5.000000 13.000000 18.000000 16.000000 12.000000 11.000000 
+17.000000 27.000000 35.000000 47.000000 63.000000 73.000000 
+67.000000 56.000000 55.000000 65.000000 76.000000 88.000000 
+102.000000 114.000000 122.000000 128.000000 131.000000 132.000000 
+133.000000 134.000000 134.000000 134.000000 133.000000 129.000000 
+124.000000 123.000000 126.000000 126.000000 123.000000 126.000000 
+120.000000 126.000000 131.000000 133.000000 137.000000 141.000000 
+141.000000 139.000000 141.000000 145.000000 140.000000 123.000000 
+104.000000 97.000000 103.000000 112.000000 115.000000 105.000000 
+87.000000 76.000000 85.000000 98.000000 86.000000 56.000000 
+32.000000 20.000000 19.000000 24.000000 19.000000 16.000000 
+15.000000 15.000000 16.000000 12.000000 9.000000 13.000000 
+27.000000 29.000000 13.000000 12.000000 12.000000 14.000000 
+20.000000 15.000000 18.000000 28.000000 36.000000 44.000000 
+58.000000 76.000000 87.000000 83.000000 70.000000 62.000000 
+64.000000 73.000000 82.000000 87.000000 92.000000 101.000000 
+113.000000 120.000000 120.000000 121.000000 128.000000 135.000000 
+136.000000 132.000000 126.000000 123.000000 123.000000 128.000000 
+133.000000 134.000000 131.000000 128.000000 110.000000 120.000000 
+130.000000 136.000000 141.000000 146.000000 145.000000 140.000000 
+138.000000 143.000000 143.000000 130.000000 111.000000 102.000000 
+106.000000 113.000000 114.000000 108.000000 96.000000 85.000000 
+84.000000 92.000000 86.000000 60.000000 31.000000 23.000000 
+24.000000 22.000000 16.000000 14.000000 17.000000 15.000000 
+12.000000 18.000000 18.000000 20.000000 26.000000 26.000000 
+15.000000 23.000000 21.000000 10.000000 9.000000 14.000000 
+33.000000 55.000000 67.000000 66.000000 65.000000 76.000000 
+90.000000 92.000000 84.000000 80.000000 83.000000 84.000000 
+80.000000 76.000000 80.000000 95.000000 111.000000 116.000000 
+116.000000 120.000000 128.000000 131.000000 127.000000 121.000000 
+120.000000 124.000000 132.000000 138.000000 139.000000 135.000000 
+131.000000 130.000000 120.000000 131.000000 136.000000 133.000000 
+129.000000 129.000000 132.000000 135.000000 139.000000 143.000000 
+141.000000 128.000000 110.000000 102.000000 106.000000 112.000000 
+108.000000 97.000000 90.000000 88.000000 90.000000 89.000000 
+74.000000 48.000000 28.000000 30.000000 32.000000 24.000000 
+14.000000 12.000000 15.000000 14.000000 8.000000 21.000000 
+28.000000 25.000000 24.000000 24.000000 23.000000 24.000000 
+22.000000 15.000000 13.000000 25.000000 47.000000 93.000000 
+158.000000 200.000000 188.000000 140.000000 101.000000 87.000000 
+89.000000 93.000000 94.000000 90.000000 87.000000 88.000000 
+93.000000 102.000000 113.000000 121.000000 123.000000 120.000000 
+123.000000 128.000000 130.000000 126.000000 124.000000 130.000000 
+137.000000 136.000000 129.000000 124.000000 125.000000 129.000000 
+128.000000 133.000000 134.000000 131.000000 128.000000 126.000000 
+127.000000 129.000000 133.000000 137.000000 135.000000 126.000000 
+113.000000 104.000000 102.000000 104.000000 103.000000 96.000000 
+86.000000 82.000000 86.000000 86.000000 72.000000 51.000000 
+38.000000 30.000000 26.000000 27.000000 31.000000 23.000000 
+11.000000 7.000000 13.000000 30.000000 40.000000 40.000000 
+37.000000 31.000000 28.000000 27.000000 25.000000 18.000000 
+20.000000 31.000000 57.000000 136.000000 259.000000 353.000000 
+344.000000 241.000000 138.000000 91.000000 89.000000 99.000000 
+106.000000 106.000000 103.000000 101.000000 99.000000 106.000000 
+120.000000 130.000000 128.000000 120.000000 117.000000 120.000000 
+124.000000 126.000000 126.000000 127.000000 128.000000 127.000000 
+125.000000 125.000000 126.000000 127.000000 116.000000 126.000000 
+134.000000 136.000000 133.000000 131.000000 129.000000 127.000000 
+128.000000 132.000000 132.000000 121.000000 106.000000 98.000000 
+97.000000 97.000000 100.000000 122.000000 168.000000 198.000000 
+178.000000 122.000000 71.000000 45.000000 31.000000 18.000000 
+13.000000 23.000000 36.000000 34.000000 18.000000 6.000000 
+13.000000 35.000000 49.000000 47.000000 40.000000 36.000000 
+34.000000 34.000000 30.000000 17.000000 26.000000 26.000000 
+73.000000 186.000000 303.000000 355.000000 322.000000 245.000000 
+176.000000 122.000000 85.000000 82.000000 104.000000 116.000000 
+105.000000 87.000000 86.000000 103.000000 120.000000 125.000000 
+122.000000 119.000000 119.000000 120.000000 120.000000 119.000000 
+121.000000 126.000000 130.000000 129.000000 123.000000 119.000000 
+119.000000 121.000000 117.000000 130.000000 140.000000 140.000000 
+134.000000 129.000000 125.000000 125.000000 129.000000 134.000000 
+131.000000 117.000000 101.000000 94.000000 93.000000 101.000000 
+129.000000 205.000000 329.000000 404.000000 349.000000 205.000000 
+88.000000 46.000000 22.000000 10.000000 10.000000 17.000000 
+21.000000 21.000000 15.000000 13.000000 17.000000 33.000000 
+43.000000 42.000000 42.000000 43.000000 40.000000 38.000000 
+32.000000 17.000000 22.000000 17.000000 78.000000 198.000000 
+300.000000 344.000000 337.000000 294.000000 216.000000 129.000000 
+86.000000 98.000000 119.000000 117.000000 100.000000 90.000000 
+96.000000 109.000000 118.000000 122.000000 121.000000 120.000000 
+123.000000 127.000000 127.000000 125.000000 126.000000 132.000000 
+133.000000 123.000000 111.000000 109.000000 116.000000 124.000000 
+121.000000 124.000000 130.000000 135.000000 137.000000 132.000000 
+126.000000 126.000000 133.000000 135.000000 131.000000 124.000000 
+118.000000 106.000000 96.000000 123.000000 196.000000 318.000000 
+438.000000 472.000000 389.000000 245.000000 130.000000 72.000000 
+33.000000 13.000000 12.000000 13.000000 10.000000 9.000000 
+9.000000 18.000000 32.000000 42.000000 47.000000 43.000000 
+38.000000 37.000000 44.000000 54.000000 48.000000 28.000000 
+15.000000 17.000000 66.000000 163.000000 270.000000 347.000000 
+362.000000 299.000000 191.000000 109.000000 93.000000 111.000000 
+116.000000 103.000000 94.000000 99.000000 109.000000 114.000000 
+115.000000 115.000000 116.000000 118.000000 123.000000 127.000000 
+127.000000 127.000000 129.000000 132.000000 128.000000 118.000000 
+112.000000 114.000000 122.000000 127.000000 125.000000 121.000000 
+125.000000 135.000000 140.000000 134.000000 128.000000 132.000000 
+138.000000 136.000000 130.000000 130.000000 127.000000 105.000000 
+89.000000 121.000000 212.000000 331.000000 418.000000 436.000000 
+381.000000 279.000000 169.000000 82.000000 36.000000 16.000000 
+8.000000 10.000000 9.000000 8.000000 14.000000 30.000000 
+50.000000 59.000000 56.000000 49.000000 41.000000 40.000000 
+54.000000 66.000000 54.000000 24.000000 22.000000 14.000000 
+44.000000 122.000000 211.000000 264.000000 254.000000 196.000000 
+128.000000 83.000000 67.000000 74.000000 92.000000 105.000000 
+107.000000 102.000000 102.000000 109.000000 116.000000 117.000000 
+114.000000 116.000000 121.000000 124.000000 127.000000 130.000000 
+132.000000 128.000000 122.000000 117.000000 116.000000 120.000000 
+126.000000 129.000000 131.000000 128.000000 130.000000 133.000000 
+130.000000 122.000000 121.000000 130.000000 137.000000 136.000000 
+132.000000 133.000000 130.000000 110.000000 89.000000 95.000000 
+145.000000 227.000000 310.000000 363.000000 351.000000 268.000000 
+160.000000 90.000000 64.000000 46.000000 29.000000 24.000000 
+30.000000 39.000000 49.000000 59.000000 67.000000 67.000000 
+54.000000 43.000000 43.000000 53.000000 63.000000 59.000000 
+40.000000 17.000000 22.000000 17.000000 37.000000 87.000000 
+133.000000 150.000000 139.000000 120.000000 103.000000 88.000000 
+78.000000 86.000000 110.000000 127.000000 120.000000 105.000000 
+102.000000 112.000000 120.000000 117.000000 112.000000 113.000000 
+116.000000 119.000000 124.000000 132.000000 137.000000 134.000000 
+126.000000 120.000000 119.000000 121.000000 124.000000 126.000000 
+123.000000 120.000000 125.000000 130.000000 130.000000 127.000000 
+126.000000 126.000000 129.000000 131.000000 131.000000 129.000000 
+128.000000 127.000000 118.000000 98.000000 89.000000 116.000000 
+176.000000 227.000000 220.000000 155.000000 89.000000 70.000000 
+74.000000 70.000000 56.000000 47.000000 53.000000 68.000000 
+78.000000 72.000000 58.000000 52.000000 52.000000 49.000000 
+48.000000 50.000000 55.000000 57.000000 52.000000 34.000000 
+24.000000 41.000000 58.000000 74.000000 87.000000 86.000000 
+79.000000 82.000000 95.000000 108.000000 113.000000 117.000000 
+124.000000 130.000000 123.000000 112.000000 111.000000 120.000000 
+128.000000 125.000000 116.000000 112.000000 114.000000 118.000000 
+123.000000 128.000000 130.000000 127.000000 122.000000 120.000000 
+121.000000 124.000000 127.000000 131.000000 118.000000 116.000000 
+120.000000 124.000000 127.000000 131.000000 132.000000 129.000000 
+128.000000 131.000000 134.000000 130.000000 124.000000 123.000000 
+124.000000 114.000000 102.000000 95.000000 88.000000 84.000000 
+76.000000 56.000000 44.000000 49.000000 56.000000 58.000000 
+59.000000 61.000000 57.000000 56.000000 60.000000 60.000000 
+52.000000 46.000000 49.000000 57.000000 59.000000 55.000000 
+54.000000 55.000000 47.000000 23.000000 21.000000 39.000000 
+61.000000 83.000000 89.000000 81.000000 76.000000 83.000000 
+95.000000 109.000000 120.000000 122.000000 117.000000 113.000000 
+110.000000 110.000000 113.000000 116.000000 118.000000 117.000000 
+115.000000 115.000000 116.000000 118.000000 121.000000 123.000000 
+125.000000 124.000000 119.000000 113.000000 111.000000 115.000000 
+122.000000 129.000000 128.000000 124.000000 122.000000 123.000000 
+127.000000 132.000000 130.000000 127.000000 127.000000 130.000000 
+126.000000 120.000000 119.000000 125.000000 123.000000 110.000000 
+98.000000 103.000000 114.000000 109.000000 82.000000 48.000000 
+32.000000 39.000000 52.000000 54.000000 50.000000 47.000000 
+46.000000 42.000000 36.000000 36.000000 41.000000 47.000000 
+50.000000 51.000000 46.000000 41.000000 39.000000 35.000000 
+28.000000 23.000000 29.000000 50.000000 79.000000 97.000000 
+97.000000 89.000000 86.000000 92.000000 104.000000 120.000000 
+133.000000 133.000000 120.000000 106.000000 102.000000 107.000000 
+115.000000 120.000000 122.000000 122.000000 123.000000 124.000000 
+126.000000 125.000000 123.000000 123.000000 125.000000 124.000000 
+121.000000 116.000000 115.000000 118.000000 120.000000 122.000000 
+129.000000 121.000000 119.000000 125.000000 135.000000 139.000000 
+135.000000 130.000000 129.000000 127.000000 121.000000 117.000000 
+119.000000 124.000000 123.000000 117.000000 113.000000 110.000000 
+103.000000 94.000000 81.000000 63.000000 58.000000 62.000000 
+63.000000 54.000000 40.000000 31.000000 35.000000 45.000000 
+47.000000 43.000000 46.000000 62.000000 71.000000 63.000000 
+49.000000 40.000000 38.000000 32.000000 25.000000 25.000000 
+36.000000 58.000000 79.000000 91.000000 91.000000 86.000000 
+83.000000 88.000000 102.000000 120.000000 134.000000 137.000000 
+128.000000 115.000000 109.000000 112.000000 116.000000 118.000000 
+119.000000 121.000000 122.000000 120.000000 118.000000 120.000000 
+124.000000 124.000000 120.000000 119.000000 120.000000 121.000000 
+122.000000 122.000000 122.000000 121.000000 122.000000 118.000000 
+118.000000 123.000000 131.000000 135.000000 135.000000 134.000000 
+131.000000 123.000000 112.000000 108.000000 115.000000 122.000000 
+118.000000 107.000000 100.000000 101.000000 100.000000 95.000000 
+92.000000 91.000000 90.000000 87.000000 82.000000 75.000000 
+58.000000 35.000000 41.000000 96.000000 155.000000 165.000000 
+124.000000 87.000000 75.000000 73.000000 76.000000 69.000000 
+54.000000 41.000000 34.000000 35.000000 49.000000 72.000000 
+93.000000 103.000000 102.000000 95.000000 89.000000 91.000000 
+101.000000 116.000000 129.000000 132.000000 129.000000 123.000000 
+121.000000 119.000000 116.000000 118.000000 126.000000 131.000000 
+126.000000 119.000000 119.000000 125.000000 125.000000 118.000000 
+110.000000 111.000000 120.000000 126.000000 126.000000 124.000000 
+125.000000 127.000000 118.000000 120.000000 126.000000 133.000000 
+141.000000 141.000000 133.000000 124.000000 122.000000 119.000000 
+111.000000 107.000000 114.000000 121.000000 113.000000 93.000000 
+85.000000 93.000000 103.000000 102.000000 95.000000 94.000000 
+94.000000 90.000000 87.000000 83.000000 65.000000 44.000000 
+68.000000 205.000000 377.000000 433.000000 314.000000 134.000000 
+47.000000 43.000000 62.000000 66.000000 64.000000 73.000000 
+85.000000 85.000000 81.000000 90.000000 102.000000 103.000000 
+94.000000 87.000000 81.000000 78.000000 88.000000 114.000000 
+139.000000 146.000000 139.000000 135.000000 134.000000 128.000000 
+117.000000 112.000000 118.000000 123.000000 121.000000 124.000000 
+133.000000 137.000000 125.000000 106.000000 99.000000 106.000000 
+118.000000 125.000000 126.000000 123.000000 119.000000 117.000000 
+111.000000 114.000000 122.000000 127.000000 126.000000 122.000000 
+121.000000 124.000000 125.000000 121.000000 113.000000 105.000000 
+98.000000 94.000000 90.000000 91.000000 96.000000 98.000000 
+95.000000 89.000000 82.000000 81.000000 86.000000 92.000000 
+90.000000 76.000000 56.000000 47.000000 90.000000 223.000000 
+377.000000 426.000000 328.000000 170.000000 79.000000 59.000000 
+66.000000 65.000000 58.000000 63.000000 79.000000 87.000000 
+86.000000 82.000000 83.000000 91.000000 103.000000 112.000000 
+110.000000 94.000000 83.000000 95.000000 120.000000 140.000000 
+147.000000 144.000000 136.000000 125.000000 114.000000 107.000000 
+107.000000 109.000000 113.000000 119.000000 124.000000 122.000000 
+117.000000 114.000000 115.000000 116.000000 115.000000 113.000000 
+112.000000 111.000000 111.000000 114.000000 116.000000 119.000000 
+126.000000 130.000000 124.000000 113.000000 109.000000 114.000000 
+119.000000 116.000000 105.000000 94.000000 88.000000 85.000000 
+86.000000 90.000000 93.000000 93.000000 91.000000 91.000000 
+94.000000 95.000000 95.000000 95.000000 86.000000 62.000000 
+42.000000 50.000000 108.000000 218.000000 304.000000 310.000000 
+240.000000 151.000000 89.000000 58.000000 53.000000 54.000000 
+55.000000 56.000000 65.000000 76.000000 79.000000 76.000000 
+77.000000 88.000000 109.000000 131.000000 141.000000 133.000000 
+113.000000 106.000000 126.000000 144.000000 149.000000 145.000000 
+138.000000 129.000000 120.000000 113.000000 111.000000 115.000000 
+125.000000 134.000000 135.000000 128.000000 119.000000 117.000000 
+120.000000 123.000000 121.000000 115.000000 111.000000 113.000000 
+120.000000 127.000000 116.000000 118.000000 121.000000 123.000000 
+121.000000 114.000000 110.000000 110.000000 110.000000 105.000000 
+99.000000 99.000000 104.000000 107.000000 101.000000 92.000000 
+91.000000 100.000000 110.000000 110.000000 104.000000 97.000000 
+93.000000 94.000000 93.000000 79.000000 62.000000 63.000000 
+93.000000 150.000000 189.000000 180.000000 140.000000 99.000000 
+69.000000 52.000000 48.000000 53.000000 59.000000 59.000000 
+59.000000 63.000000 72.000000 82.000000 88.000000 92.000000 
+97.000000 110.000000 129.000000 142.000000 134.000000 114.000000 
+113.000000 130.000000 144.000000 144.000000 133.000000 122.000000 
+120.000000 122.000000 121.000000 120.000000 126.000000 137.000000 
+141.000000 136.000000 129.000000 125.000000 124.000000 122.000000 
+120.000000 118.000000 114.000000 111.000000 111.000000 117.000000 
+121.000000 118.000000 118.000000 118.000000 115.000000 112.000000 
+112.000000 116.000000 116.000000 109.000000 101.000000 97.000000 
+101.000000 109.000000 117.000000 121.000000 120.000000 117.000000 
+113.000000 113.000000 114.000000 111.000000 107.000000 106.000000 
+103.000000 97.000000 89.000000 89.000000 93.000000 103.000000 
+110.000000 102.000000 80.000000 61.000000 59.000000 70.000000 
+79.000000 79.000000 73.000000 69.000000 66.000000 62.000000 
+60.000000 64.000000 73.000000 81.000000 84.000000 92.000000 
+111.000000 132.000000 140.000000 131.000000 135.000000 146.000000 
+142.000000 130.000000 125.000000 126.000000 126.000000 126.000000 
+126.000000 130.000000 137.000000 143.000000 141.000000 131.000000 
+121.000000 121.000000 127.000000 132.000000 134.000000 130.000000 
+123.000000 115.000000 114.000000 121.000000 119.000000 117.000000 
+116.000000 118.000000 120.000000 121.000000 121.000000 120.000000 
+115.000000 107.000000 101.000000 102.000000 107.000000 108.000000 
+107.000000 110.000000 119.000000 125.000000 122.000000 115.000000 
+110.000000 110.000000 112.000000 116.000000 124.000000 134.000000 
+139.000000 136.000000 127.000000 113.000000 98.000000 86.000000 
+83.000000 84.000000 89.000000 101.000000 114.000000 120.000000 
+116.000000 110.000000 104.000000 93.000000 77.000000 70.000000 
+80.000000 97.000000 106.000000 103.000000 107.000000 126.000000 
+142.000000 137.000000 126.000000 120.000000 118.000000 128.000000 
+139.000000 134.000000 125.000000 125.000000 131.000000 134.000000 
+135.000000 135.000000 132.000000 127.000000 125.000000 128.000000 
+133.000000 133.000000 129.000000 126.000000 124.000000 124.000000 
+127.000000 130.000000 117.000000 116.000000 119.000000 122.000000 
+123.000000 119.000000 113.000000 110.000000 108.000000 108.000000 
+110.000000 115.000000 117.000000 113.000000 109.000000 110.000000 
+115.000000 118.000000 119.000000 119.000000 122.000000 128.000000 
+135.000000 141.000000 141.000000 137.000000 133.000000 132.000000 
+132.000000 128.000000 122.000000 118.000000 121.000000 126.000000 
+131.000000 135.000000 140.000000 141.000000 132.000000 125.000000 
+127.000000 134.000000 131.000000 116.000000 101.000000 103.000000 
+117.000000 127.000000 124.000000 109.000000 103.000000 104.000000 
+99.000000 96.000000 108.000000 124.000000 124.000000 113.000000 
+112.000000 123.000000 127.000000 124.000000 126.000000 133.000000 
+139.000000 139.000000 136.000000 132.000000 128.000000 126.000000 
+128.000000 132.000000 133.000000 133.000000 133.000000 130.000000 
+112.000000 111.000000 118.000000 127.000000 130.000000 123.000000 
+112.000000 103.000000 101.000000 103.000000 105.000000 105.000000 
+103.000000 98.000000 96.000000 98.000000 105.000000 112.000000 
+118.000000 124.000000 129.000000 134.000000 136.000000 134.000000 
+130.000000 128.000000 129.000000 132.000000 133.000000 130.000000 
+128.000000 128.000000 127.000000 127.000000 130.000000 136.000000 
+141.000000 143.000000 143.000000 142.000000 139.000000 135.000000 
+131.000000 126.000000 114.000000 99.000000 97.000000 110.000000 
+128.000000 130.000000 112.000000 96.000000 96.000000 102.000000 
+108.000000 110.000000 108.000000 108.000000 114.000000 118.000000 
+116.000000 117.000000 123.000000 127.000000 125.000000 126.000000 
+135.000000 140.000000 135.000000 127.000000 126.000000 129.000000 
+132.000000 132.000000 131.000000 128.000000 111.000000 118.000000 
+117.000000 112.000000 110.000000 108.000000 103.000000 98.000000 
+97.000000 101.000000 104.000000 100.000000 90.000000 83.000000 
+89.000000 106.000000 122.000000 127.000000 125.000000 126.000000 
+131.000000 135.000000 135.000000 135.000000 136.000000 137.000000 
+138.000000 136.000000 133.000000 130.000000 130.000000 131.000000 
+131.000000 130.000000 131.000000 132.000000 134.000000 135.000000 
+137.000000 141.000000 144.000000 145.000000 144.000000 137.000000 
+122.000000 105.000000 97.000000 108.000000 126.000000 132.000000 
+124.000000 117.000000 118.000000 117.000000 110.000000 107.000000 
+113.000000 122.000000 124.000000 118.000000 112.000000 112.000000 
+115.000000 112.000000 106.000000 113.000000 130.000000 139.000000 
+136.000000 129.000000 123.000000 119.000000 120.000000 126.000000 
+130.000000 126.000000 113.000000 113.000000 113.000000 114.000000 
+116.000000 109.000000 94.000000 83.000000 85.000000 94.000000 
+95.000000 84.000000 71.000000 68.000000 79.000000 99.000000 
+116.000000 124.000000 128.000000 130.000000 133.000000 135.000000 
+135.000000 135.000000 134.000000 134.000000 134.000000 136.000000 
+135.000000 130.000000 122.000000 117.000000 121.000000 128.000000 
+133.000000 132.000000 127.000000 125.000000 130.000000 135.000000 
+135.000000 132.000000 133.000000 139.000000 142.000000 135.000000 
+127.000000 133.000000 148.000000 151.000000 132.000000 111.000000 
+114.000000 127.000000 127.000000 111.000000 99.000000 101.000000 
+101.000000 87.000000 67.000000 54.000000 53.000000 61.000000 
+70.000000 87.000000 113.000000 130.000000 131.000000 125.000000 
+120.000000 121.000000 126.000000 132.000000 131.000000 125.000000 
+106.000000 108.000000 111.000000 109.000000 99.000000 86.000000 
+83.000000 93.000000 101.000000 98.000000 84.000000 66.000000 
+56.000000 59.000000 79.000000 107.000000 128.000000 134.000000 
+132.000000 130.000000 131.000000 131.000000 130.000000 129.000000 
+130.000000 132.000000 136.000000 139.000000 138.000000 133.000000 
+129.000000 129.000000 132.000000 132.000000 131.000000 129.000000 
+129.000000 131.000000 132.000000 132.000000 132.000000 131.000000 
+132.000000 134.000000 136.000000 134.000000 130.000000 128.000000 
+129.000000 123.000000 105.000000 90.000000 102.000000 132.000000 
+145.000000 128.000000 96.000000 73.000000 60.000000 46.000000 
+29.000000 15.000000 8.000000 15.000000 29.000000 58.000000 
+101.000000 129.000000 131.000000 123.000000 122.000000 127.000000 
+131.000000 128.000000 122.000000 122.000000 107.000000 101.000000 
+100.000000 109.000000 112.000000 105.000000 105.000000 115.000000 
+111.000000 94.000000 75.000000 58.000000 48.000000 52.000000 
+81.000000 119.000000 137.000000 135.000000 126.000000 125.000000 
+134.000000 140.000000 139.000000 134.000000 129.000000 129.000000 
+133.000000 136.000000 133.000000 127.000000 125.000000 128.000000 
+131.000000 132.000000 132.000000 132.000000 131.000000 128.000000 
+124.000000 122.000000 124.000000 127.000000 128.000000 127.000000 
+130.000000 137.000000 140.000000 132.000000 115.000000 96.000000 
+81.000000 71.000000 84.000000 116.000000 140.000000 136.000000 
+107.000000 71.000000 44.000000 33.000000 31.000000 24.000000 
+14.000000 13.000000 14.000000 32.000000 78.000000 115.000000 
+130.000000 129.000000 128.000000 131.000000 132.000000 125.000000 
+120.000000 123.000000 86.000000 86.000000 125.000000 156.000000 
+154.000000 138.000000 132.000000 121.000000 102.000000 93.000000 
+82.000000 59.000000 41.000000 50.000000 98.000000 132.000000 
+133.000000 123.000000 125.000000 138.000000 145.000000 142.000000 
+133.000000 125.000000 120.000000 121.000000 129.000000 136.000000 
+136.000000 132.000000 131.000000 133.000000 133.000000 133.000000 
+136.000000 138.000000 135.000000 129.000000 124.000000 125.000000 
+127.000000 129.000000 132.000000 134.000000 135.000000 136.000000 
+138.000000 135.000000 119.000000 94.000000 71.000000 60.000000 
+69.000000 94.000000 118.000000 128.000000 122.000000 106.000000 
+87.000000 65.000000 40.000000 19.000000 14.000000 16.000000 
+12.000000 15.000000 46.000000 85.000000 109.000000 118.000000 
+120.000000 126.000000 130.000000 126.000000 122.000000 125.000000 
+73.000000 105.000000 167.000000 194.000000 184.000000 164.000000 
+138.000000 98.000000 77.000000 83.000000 70.000000 45.000000 
+38.000000 76.000000 127.000000 143.000000 132.000000 123.000000 
+127.000000 133.000000 133.000000 133.000000 132.000000 129.000000 
+124.000000 125.000000 127.000000 126.000000 124.000000 124.000000 
+130.000000 133.000000 135.000000 138.000000 140.000000 137.000000 
+131.000000 128.000000 130.000000 131.000000 130.000000 129.000000 
+132.000000 136.000000 135.000000 132.000000 131.000000 131.000000 
+123.000000 106.000000 85.000000 72.000000 77.000000 94.000000 
+110.000000 125.000000 132.000000 120.000000 96.000000 71.000000 
+43.000000 16.000000 5.000000 9.000000 14.000000 6.000000 
+12.000000 55.000000 94.000000 118.000000 129.000000 133.000000 
+131.000000 126.000000 124.000000 125.000000 52.000000 139.000000 
+218.000000 233.000000 190.000000 140.000000 96.000000 65.000000 
+73.000000 81.000000 61.000000 43.000000 61.000000 109.000000 
+140.000000 140.000000 130.000000 126.000000 129.000000 133.000000 
+136.000000 134.000000 125.000000 118.000000 121.000000 130.000000 
+133.000000 129.000000 124.000000 124.000000 127.000000 129.000000 
+132.000000 134.000000 130.000000 123.000000 121.000000 126.000000 
+131.000000 128.000000 125.000000 129.000000 138.000000 141.000000 
+137.000000 132.000000 130.000000 132.000000 129.000000 114.000000 
+87.000000 65.000000 67.000000 86.000000 97.000000 104.000000 
+115.000000 109.000000 88.000000 70.000000 49.000000 22.000000 
+7.000000 7.000000 11.000000 10.000000 6.000000 21.000000 
+58.000000 93.000000 119.000000 129.000000 128.000000 127.000000 
+127.000000 123.000000 47.000000 141.000000 208.000000 205.000000 
+156.000000 110.000000 82.000000 77.000000 80.000000 65.000000 
+48.000000 50.000000 80.000000 117.000000 137.000000 137.000000 
+130.000000 127.000000 131.000000 135.000000 136.000000 133.000000 
+129.000000 128.000000 129.000000 128.000000 124.000000 119.000000 
+117.000000 120.000000 124.000000 127.000000 129.000000 132.000000 
+132.000000 130.000000 129.000000 131.000000 134.000000 134.000000 
+133.000000 132.000000 134.000000 137.000000 137.000000 134.000000 
+132.000000 133.000000 135.000000 128.000000 105.000000 82.000000 
+79.000000 97.000000 109.000000 100.000000 94.000000 85.000000 
+63.000000 50.000000 44.000000 21.000000 8.000000 14.000000 
+14.000000 15.000000 15.000000 8.000000 25.000000 74.000000 
+115.000000 132.000000 127.000000 121.000000 122.000000 124.000000 
+79.000000 150.000000 184.000000 156.000000 100.000000 70.000000 
+74.000000 90.000000 96.000000 78.000000 62.000000 68.000000 
+97.000000 127.000000 137.000000 131.000000 125.000000 125.000000 
+130.000000 131.000000 127.000000 125.000000 127.000000 129.000000 
+129.000000 125.000000 120.000000 117.000000 117.000000 120.000000 
+124.000000 129.000000 132.000000 132.000000 129.000000 126.000000 
+125.000000 128.000000 131.000000 134.000000 135.000000 134.000000 
+130.000000 126.000000 126.000000 127.000000 130.000000 133.000000 
+135.000000 132.000000 114.000000 90.000000 81.000000 98.000000 
+121.000000 116.000000 87.000000 63.000000 51.000000 43.000000 
+34.000000 22.000000 8.000000 9.000000 12.000000 11.000000 
+21.000000 21.000000 13.000000 37.000000 88.000000 115.000000 
+124.000000 127.000000 125.000000 118.000000 141.000000 171.000000 
+158.000000 114.000000 66.000000 42.000000 56.000000 85.000000 
+92.000000 74.000000 57.000000 69.000000 108.000000 140.000000 
+143.000000 131.000000 124.000000 127.000000 132.000000 135.000000 
+134.000000 131.000000 126.000000 122.000000 122.000000 125.000000 
+127.000000 126.000000 125.000000 125.000000 127.000000 129.000000 
+130.000000 128.000000 127.000000 129.000000 133.000000 135.000000 
+135.000000 135.000000 137.000000 137.000000 131.000000 125.000000 
+124.000000 128.000000 132.000000 134.000000 136.000000 133.000000 
+120.000000 101.000000 88.000000 92.000000 109.000000 121.000000 
+115.000000 93.000000 60.000000 27.000000 12.000000 12.000000 
+11.000000 10.000000 9.000000 9.000000 9.000000 13.000000 
+16.000000 20.000000 50.000000 89.000000 115.000000 124.000000 
+121.000000 118.000000 130.000000 129.000000 129.000000 125.000000 
+121.000000 127.000000 141.000000 142.000000 116.000000 76.000000 
+60.000000 82.000000 105.000000 110.000000 91.000000 55.000000 
+23.000000 13.000000 10.000000 9.000000 12.000000 13.000000 
+10.000000 7.000000 9.000000 11.000000 12.000000 12.000000 
+11.000000 10.000000 9.000000 10.000000 13.000000 14.000000 
+13.000000 10.000000 9.000000 11.000000 14.000000 23.000000 
+26.000000 17.000000 9.000000 5.000000 5.000000 7.000000 
+8.000000 8.000000 10.000000 12.000000 9.000000 13.000000 
+22.000000 22.000000 10.000000 17.000000 30.000000 47.000000 
+80.000000 96.000000 72.000000 34.000000 38.000000 68.000000 
+74.000000 51.000000 25.000000 18.000000 19.000000 12.000000 
+8.000000 11.000000 17.000000 25.000000 26.000000 22.000000 
+132.000000 127.000000 128.000000 132.000000 131.000000 126.000000 
+128.000000 137.000000 131.000000 104.000000 78.000000 83.000000 
+105.000000 107.000000 89.000000 58.000000 25.000000 8.000000 
+18.000000 17.000000 13.000000 10.000000 11.000000 12.000000 
+12.000000 13.000000 11.000000 9.000000 8.000000 8.000000 
+9.000000 9.000000 11.000000 10.000000 9.000000 10.000000 
+10.000000 8.000000 14.000000 19.000000 16.000000 11.000000 
+9.000000 8.000000 8.000000 9.000000 9.000000 8.000000 
+7.000000 5.000000 5.000000 13.000000 27.000000 30.000000 
+17.000000 21.000000 23.000000 26.000000 58.000000 76.000000 
+49.000000 26.000000 39.000000 50.000000 38.000000 21.000000 
+15.000000 21.000000 27.000000 22.000000 14.000000 10.000000 
+10.000000 12.000000 13.000000 11.000000 137.000000 137.000000 
+135.000000 133.000000 133.000000 128.000000 119.000000 118.000000 
+127.000000 130.000000 118.000000 104.000000 99.000000 97.000000 
+84.000000 59.000000 27.000000 7.000000 14.000000 16.000000 
+11.000000 10.000000 11.000000 13.000000 14.000000 13.000000 
+10.000000 8.000000 8.000000 8.000000 8.000000 8.000000 
+6.000000 7.000000 9.000000 10.000000 9.000000 8.000000 
+12.000000 12.000000 8.000000 13.000000 13.000000 7.000000 
+6.000000 5.000000 6.000000 7.000000 6.000000 4.000000 
+4.000000 15.000000 32.000000 34.000000 19.000000 32.000000 
+40.000000 24.000000 33.000000 45.000000 29.000000 20.000000 
+24.000000 23.000000 12.000000 0.000000 9.000000 29.000000 
+35.000000 32.000000 28.000000 26.000000 22.000000 18.000000 
+14.000000 5.000000 135.000000 139.000000 139.000000 136.000000 
+132.000000 127.000000 122.000000 118.000000 120.000000 125.000000 
+128.000000 122.000000 107.000000 89.000000 77.000000 66.000000 
+43.000000 14.000000 8.000000 12.000000 5.000000 8.000000 
+7.000000 8.000000 13.000000 12.000000 10.000000 9.000000 
+8.000000 8.000000 7.000000 5.000000 6.000000 7.000000 
+8.000000 9.000000 9.000000 10.000000 12.000000 8.000000 
+3.000000 7.000000 8.000000 3.000000 4.000000 6.000000 
+8.000000 8.000000 8.000000 7.000000 4.000000 12.000000 
+32.000000 34.000000 20.000000 33.000000 48.000000 33.000000 
+19.000000 15.000000 13.000000 9.000000 9.000000 13.000000 
+18.000000 26.000000 54.000000 92.000000 113.000000 115.000000 
+106.000000 93.000000 78.000000 64.000000 52.000000 42.000000 
+134.000000 134.000000 135.000000 138.000000 140.000000 138.000000 
+132.000000 129.000000 132.000000 136.000000 132.000000 121.000000 
+110.000000 98.000000 80.000000 64.000000 49.000000 26.000000 
+8.000000 10.000000 9.000000 7.000000 11.000000 11.000000 
+10.000000 11.000000 11.000000 10.000000 11.000000 14.000000 
+12.000000 7.000000 7.000000 5.000000 10.000000 14.000000 
+14.000000 13.000000 13.000000 14.000000 13.000000 14.000000 
+15.000000 13.000000 12.000000 13.000000 8.000000 10.000000 
+15.000000 10.000000 8.000000 19.000000 30.000000 27.000000 
+15.000000 19.000000 27.000000 26.000000 15.000000 5.000000 
+4.000000 8.000000 15.000000 28.000000 47.000000 81.000000 
+121.000000 154.000000 167.000000 158.000000 141.000000 129.000000 
+121.000000 114.000000 109.000000 111.000000 132.000000 132.000000 
+133.000000 134.000000 133.000000 133.000000 133.000000 134.000000 
+139.000000 145.000000 138.000000 115.000000 94.000000 92.000000 
+92.000000 71.000000 41.000000 27.000000 18.000000 9.000000 
+13.000000 18.000000 17.000000 18.000000 19.000000 17.000000 
+14.000000 11.000000 13.000000 17.000000 15.000000 10.000000 
+8.000000 9.000000 13.000000 17.000000 20.000000 24.000000 
+24.000000 17.000000 11.000000 10.000000 14.000000 16.000000 
+10.000000 10.000000 10.000000 10.000000 11.000000 7.000000 
+7.000000 18.000000 28.000000 23.000000 14.000000 13.000000 
+13.000000 11.000000 12.000000 13.000000 11.000000 19.000000 
+42.000000 70.000000 95.000000 115.000000 129.000000 137.000000 
+139.000000 136.000000 134.000000 134.000000 135.000000 133.000000 
+132.000000 130.000000 130.000000 125.000000 124.000000 126.000000 
+129.000000 131.000000 133.000000 134.000000 134.000000 133.000000 
+131.000000 122.000000 106.000000 103.000000 109.000000 87.000000 
+40.000000 30.000000 62.000000 50.000000 24.000000 22.000000 
+26.000000 16.000000 16.000000 21.000000 21.000000 18.000000 
+14.000000 12.000000 13.000000 11.000000 9.000000 10.000000 
+10.000000 10.000000 14.000000 20.000000 22.000000 11.000000 
+6.000000 7.000000 9.000000 9.000000 7.000000 9.000000 
+9.000000 8.000000 8.000000 7.000000 4.000000 11.000000 
+22.000000 28.000000 30.000000 30.000000 30.000000 34.000000 
+38.000000 31.000000 29.000000 49.000000 83.000000 110.000000 
+117.000000 112.000000 110.000000 115.000000 120.000000 122.000000 
+124.000000 128.000000 131.000000 133.000000 135.000000 131.000000 
+118.000000 116.000000 118.000000 126.000000 135.000000 138.000000 
+136.000000 133.000000 131.000000 130.000000 126.000000 118.000000 
+108.000000 103.000000 105.000000 94.000000 53.000000 38.000000 
+92.000000 86.000000 42.000000 27.000000 27.000000 15.000000 
+17.000000 21.000000 23.000000 22.000000 15.000000 10.000000 
+10.000000 17.000000 20.000000 13.000000 10.000000 14.000000 
+12.000000 9.000000 13.000000 9.000000 12.000000 16.000000 
+16.000000 11.000000 7.000000 5.000000 8.000000 11.000000 
+10.000000 10.000000 9.000000 16.000000 28.000000 37.000000 
+48.000000 56.000000 56.000000 52.000000 48.000000 50.000000 
+72.000000 102.000000 121.000000 121.000000 111.000000 111.000000 
+123.000000 131.000000 125.000000 117.000000 119.000000 126.000000 
+131.000000 132.000000 134.000000 136.000000 120.000000 120.000000 
+117.000000 116.000000 123.000000 134.000000 138.000000 131.000000 
+123.000000 121.000000 123.000000 126.000000 124.000000 116.000000 
+103.000000 86.000000 62.000000 60.000000 101.000000 111.000000 
+83.000000 48.000000 25.000000 17.000000 25.000000 26.000000 
+18.000000 14.000000 20.000000 23.000000 20.000000 20.000000 
+17.000000 12.000000 13.000000 15.000000 13.000000 13.000000 
+17.000000 14.000000 16.000000 20.000000 19.000000 14.000000 
+9.000000 13.000000 14.000000 11.000000 10.000000 10.000000 
+12.000000 19.000000 26.000000 36.000000 54.000000 67.000000 
+57.000000 49.000000 63.000000 95.000000 124.000000 134.000000 
+125.000000 109.000000 104.000000 116.000000 131.000000 132.000000 
+124.000000 120.000000 124.000000 130.000000 132.000000 130.000000 
+130.000000 130.000000 122.000000 120.000000 118.000000 118.000000 
+123.000000 131.000000 134.000000 132.000000 132.000000 136.000000 
+137.000000 131.000000 124.000000 117.000000 102.000000 80.000000 
+74.000000 97.000000 127.000000 142.000000 127.000000 90.000000 
+52.000000 22.000000 16.000000 21.000000 14.000000 12.000000 
+15.000000 23.000000 21.000000 14.000000 10.000000 8.000000 
+11.000000 14.000000 17.000000 17.000000 10.000000 11.000000 
+13.000000 13.000000 12.000000 8.000000 6.000000 14.000000 
+15.000000 11.000000 11.000000 8.000000 13.000000 19.000000 
+26.000000 47.000000 70.000000 68.000000 47.000000 55.000000 
+92.000000 123.000000 135.000000 127.000000 112.000000 103.000000 
+107.000000 116.000000 123.000000 124.000000 122.000000 120.000000 
+121.000000 126.000000 132.000000 135.000000 133.000000 129.000000 
+123.000000 121.000000 121.000000 121.000000 126.000000 131.000000 
+133.000000 130.000000 134.000000 144.000000 145.000000 129.000000 
+111.000000 105.000000 102.000000 87.000000 84.000000 126.000000 
+167.000000 176.000000 159.000000 127.000000 81.000000 30.000000 
+7.000000 15.000000 18.000000 18.000000 10.000000 15.000000 
+14.000000 12.000000 14.000000 13.000000 8.000000 15.000000 
+19.000000 16.000000 9.000000 8.000000 8.000000 5.000000 
+8.000000 10.000000 9.000000 10.000000 13.000000 15.000000 
+9.000000 9.000000 16.000000 25.000000 45.000000 71.000000 
+80.000000 66.000000 57.000000 71.000000 95.000000 112.000000 
+119.000000 118.000000 115.000000 113.000000 114.000000 116.000000 
+119.000000 121.000000 120.000000 117.000000 118.000000 124.000000 
+130.000000 127.000000 122.000000 121.000000 129.000000 131.000000 
+127.000000 123.000000 123.000000 128.000000 130.000000 128.000000 
+129.000000 141.000000 149.000000 136.000000 112.000000 102.000000 
+107.000000 99.000000 89.000000 130.000000 194.000000 217.000000 
+202.000000 160.000000 101.000000 42.000000 11.000000 13.000000 
+11.000000 14.000000 10.000000 9.000000 14.000000 18.000000 
+17.000000 15.000000 8.000000 16.000000 20.000000 17.000000 
+13.000000 8.000000 10.000000 10.000000 10.000000 10.000000 
+9.000000 10.000000 13.000000 13.000000 6.000000 12.000000 
+23.000000 34.000000 55.000000 75.000000 81.000000 77.000000 
+78.000000 85.000000 95.000000 109.000000 121.000000 127.000000 
+125.000000 122.000000 121.000000 120.000000 117.000000 115.000000 
+114.000000 116.000000 119.000000 119.000000 118.000000 116.000000 
+114.000000 114.000000 127.000000 126.000000 124.000000 121.000000 
+121.000000 123.000000 126.000000 130.000000 132.000000 137.000000 
+141.000000 131.000000 111.000000 99.000000 103.000000 104.000000 
+90.000000 107.000000 184.000000 244.000000 254.000000 210.000000 
+134.000000 62.000000 20.000000 11.000000 7.000000 14.000000 
+17.000000 13.000000 11.000000 17.000000 16.000000 12.000000 
+7.000000 11.000000 14.000000 12.000000 10.000000 12.000000 
+14.000000 14.000000 13.000000 12.000000 12.000000 13.000000 
+12.000000 9.000000 15.000000 30.000000 39.000000 49.000000 
+68.000000 82.000000 85.000000 84.000000 85.000000 89.000000 
+98.000000 113.000000 124.000000 130.000000 130.000000 128.000000 
+125.000000 121.000000 117.000000 116.000000 119.000000 122.000000 
+123.000000 121.000000 120.000000 121.000000 123.000000 121.000000 
+123.000000 120.000000 120.000000 123.000000 124.000000 125.000000 
+129.000000 134.000000 136.000000 133.000000 131.000000 126.000000 
+114.000000 102.000000 100.000000 105.000000 96.000000 90.000000 
+147.000000 238.000000 292.000000 271.000000 186.000000 89.000000 
+28.000000 10.000000 10.000000 15.000000 21.000000 20.000000 
+9.000000 11.000000 20.000000 19.000000 10.000000 5.000000 
+10.000000 14.000000 12.000000 10.000000 12.000000 7.000000 
+9.000000 13.000000 14.000000 13.000000 7.000000 10.000000 
+26.000000 38.000000 40.000000 53.000000 74.000000 84.000000 
+82.000000 79.000000 79.000000 84.000000 96.000000 111.000000 
+121.000000 126.000000 128.000000 127.000000 122.000000 117.000000 
+116.000000 120.000000 125.000000 127.000000 125.000000 121.000000 
+120.000000 123.000000 126.000000 127.000000 127.000000 125.000000 
+127.000000 132.000000 135.000000 135.000000 135.000000 136.000000 
+135.000000 132.000000 129.000000 125.000000 117.000000 108.000000 
+101.000000 102.000000 100.000000 86.000000 102.000000 196.000000 
+293.000000 317.000000 248.000000 139.000000 54.000000 14.000000 
+7.000000 11.000000 16.000000 15.000000 9.000000 18.000000 
+27.000000 19.000000 14.000000 17.000000 21.000000 22.000000 
+16.000000 8.000000 6.000000 5.000000 12.000000 11.000000 
+10.000000 9.000000 8.000000 14.000000 27.000000 38.000000 
+49.000000 62.000000 66.000000 62.000000 66.000000 76.000000 
+81.000000 85.000000 95.000000 109.000000 120.000000 129.000000 
+134.000000 131.000000 122.000000 115.000000 116.000000 120.000000 
+123.000000 126.000000 126.000000 123.000000 120.000000 121.000000 
+125.000000 129.000000 123.000000 128.000000 136.000000 139.000000 
+139.000000 138.000000 137.000000 135.000000 132.000000 129.000000 
+125.000000 119.000000 115.000000 112.000000 110.000000 108.000000 
+106.000000 94.000000 88.000000 139.000000 233.000000 295.000000 
+277.000000 192.000000 97.000000 36.000000 12.000000 14.000000 
+19.000000 14.000000 9.000000 22.000000 27.000000 16.000000 
+12.000000 21.000000 22.000000 15.000000 12.000000 10.000000 
+7.000000 14.000000 19.000000 13.000000 12.000000 9.000000 
+12.000000 22.000000 36.000000 55.000000 72.000000 74.000000 
+59.000000 50.000000 59.000000 70.000000 75.000000 84.000000 
+100.000000 114.000000 123.000000 132.000000 140.000000 141.000000 
+134.000000 123.000000 117.000000 120.000000 124.000000 125.000000 
+124.000000 124.000000 126.000000 125.000000 122.000000 121.000000 
+118.000000 130.000000 144.000000 148.000000 142.000000 137.000000 
+135.000000 134.000000 132.000000 130.000000 127.000000 120.000000 
+111.000000 110.000000 116.000000 120.000000 114.000000 98.000000 
+88.000000 107.000000 173.000000 242.000000 256.000000 204.000000 
+122.000000 59.000000 22.000000 14.000000 23.000000 24.000000 
+22.000000 21.000000 15.000000 16.000000 10.000000 19.000000 
+28.000000 18.000000 10.000000 9.000000 11.000000 17.000000 
+15.000000 13.000000 10.000000 5.000000 16.000000 39.000000 
+61.000000 76.000000 83.000000 76.000000 66.000000 68.000000 
+71.000000 65.000000 64.000000 77.000000 99.000000 116.000000 
+127.000000 133.000000 136.000000 136.000000 133.000000 128.000000 
+124.000000 123.000000 124.000000 124.000000 123.000000 125.000000 
+130.000000 130.000000 125.000000 121.000000 126.000000 132.000000 
+142.000000 148.000000 145.000000 139.000000 135.000000 134.000000 
+134.000000 134.000000 134.000000 130.000000 124.000000 120.000000 
+119.000000 117.000000 106.000000 88.000000 80.000000 99.000000 
+148.000000 199.000000 210.000000 172.000000 110.000000 54.000000 
+17.000000 10.000000 19.000000 23.000000 28.000000 26.000000 
+10.000000 6.000000 6.000000 25.000000 44.000000 43.000000 
+30.000000 16.000000 14.000000 17.000000 14.000000 14.000000 
+7.000000 13.000000 37.000000 64.000000 83.000000 83.000000 
+70.000000 66.000000 78.000000 88.000000 84.000000 77.000000 
+76.000000 81.000000 90.000000 106.000000 124.000000 133.000000 
+131.000000 126.000000 127.000000 132.000000 135.000000 131.000000 
+126.000000 123.000000 126.000000 131.000000 133.000000 133.000000 
+132.000000 132.000000 123.000000 137.000000 149.000000 151.000000 
+146.000000 139.000000 135.000000 135.000000 137.000000 141.000000 
+143.000000 142.000000 136.000000 126.000000 117.000000 111.000000 
+105.000000 98.000000 92.000000 96.000000 120.000000 152.000000 
+158.000000 126.000000 77.000000 35.000000 13.000000 11.000000 
+13.000000 14.000000 17.000000 18.000000 16.000000 20.000000 
+25.000000 24.000000 43.000000 59.000000 51.000000 33.000000 
+26.000000 18.000000 14.000000 11.000000 26.000000 61.000000 
+87.000000 87.000000 73.000000 65.000000 74.000000 85.000000 
+87.000000 80.000000 79.000000 85.000000 90.000000 89.000000 
+94.000000 109.000000 124.000000 127.000000 123.000000 121.000000 
+125.000000 132.000000 135.000000 133.000000 131.000000 130.000000 
+132.000000 134.000000 136.000000 136.000000 134.000000 131.000000 
+115.000000 135.000000 147.000000 144.000000 137.000000 136.000000 
+139.000000 138.000000 135.000000 138.000000 145.000000 142.000000 
+127.000000 110.000000 103.000000 107.000000 112.000000 110.000000 
+101.000000 94.000000 96.000000 110.000000 117.000000 99.000000 
+63.000000 30.000000 12.000000 10.000000 13.000000 14.000000 
+12.000000 13.000000 17.000000 38.000000 50.000000 33.000000 
+41.000000 62.000000 63.000000 56.000000 46.000000 21.000000 
+10.000000 11.000000 41.000000 110.000000 192.000000 232.000000 
+200.000000 138.000000 103.000000 97.000000 97.000000 90.000000 
+84.000000 83.000000 89.000000 100.000000 109.000000 117.000000 
+123.000000 125.000000 123.000000 120.000000 120.000000 123.000000 
+126.000000 126.000000 127.000000 132.000000 137.000000 135.000000 
+130.000000 129.000000 131.000000 131.000000 117.000000 126.000000 
+135.000000 137.000000 134.000000 134.000000 136.000000 135.000000 
+131.000000 131.000000 134.000000 132.000000 120.000000 107.000000 
+100.000000 98.000000 96.000000 93.000000 91.000000 89.000000 
+83.000000 75.000000 75.000000 77.000000 64.000000 35.000000 
+12.000000 15.000000 18.000000 18.000000 13.000000 11.000000 
+12.000000 32.000000 53.000000 55.000000 56.000000 67.000000 
+71.000000 62.000000 40.000000 18.000000 20.000000 17.000000 
+54.000000 165.000000 308.000000 392.000000 353.000000 232.000000 
+129.000000 93.000000 99.000000 109.000000 107.000000 95.000000 
+90.000000 95.000000 105.000000 112.000000 117.000000 122.000000 
+126.000000 126.000000 124.000000 122.000000 123.000000 124.000000 
+126.000000 129.000000 132.000000 129.000000 126.000000 128.000000 
+132.000000 132.000000 119.000000 127.000000 139.000000 142.000000 
+137.000000 131.000000 130.000000 129.000000 128.000000 128.000000 
+128.000000 125.000000 117.000000 109.000000 103.000000 95.000000 
+87.000000 97.000000 143.000000 201.000000 210.000000 156.000000 
+86.000000 53.000000 45.000000 35.000000 22.000000 21.000000 
+21.000000 19.000000 18.000000 12.000000 16.000000 35.000000 
+59.000000 72.000000 76.000000 79.000000 73.000000 55.000000 
+24.000000 15.000000 24.000000 24.000000 105.000000 243.000000 
+352.000000 374.000000 313.000000 232.000000 175.000000 136.000000 
+109.000000 102.000000 107.000000 102.000000 85.000000 79.000000 
+90.000000 108.000000 118.000000 122.000000 126.000000 129.000000 
+127.000000 123.000000 122.000000 125.000000 130.000000 131.000000 
+126.000000 120.000000 119.000000 123.000000 127.000000 128.000000 
+108.000000 123.000000 138.000000 142.000000 138.000000 132.000000 
+130.000000 131.000000 133.000000 134.000000 133.000000 127.000000 
+119.000000 108.000000 95.000000 93.000000 115.000000 175.000000 
+283.000000 384.000000 388.000000 282.000000 149.000000 75.000000 
+39.000000 21.000000 13.000000 15.000000 16.000000 15.000000 
+22.000000 22.000000 29.000000 43.000000 59.000000 72.000000 
+78.000000 75.000000 69.000000 59.000000 29.000000 18.000000 
+16.000000 35.000000 126.000000 254.000000 350.000000 378.000000 
+348.000000 279.000000 190.000000 119.000000 99.000000 114.000000 
+120.000000 106.000000 90.000000 93.000000 108.000000 119.000000 
+123.000000 125.000000 126.000000 126.000000 125.000000 126.000000 
+127.000000 127.000000 129.000000 129.000000 124.000000 119.000000 
+119.000000 123.000000 127.000000 128.000000 120.000000 126.000000 
+132.000000 135.000000 136.000000 133.000000 128.000000 128.000000 
+132.000000 133.000000 132.000000 133.000000 131.000000 113.000000 
+88.000000 97.000000 164.000000 283.000000 403.000000 453.000000 
+406.000000 289.000000 178.000000 111.000000 56.000000 16.000000 
+6.000000 11.000000 19.000000 20.000000 25.000000 31.000000 
+47.000000 57.000000 57.000000 57.000000 59.000000 62.000000 
+69.000000 69.000000 36.000000 16.000000 15.000000 33.000000 
+113.000000 230.000000 331.000000 375.000000 343.000000 254.000000 
+153.000000 92.000000 85.000000 103.000000 110.000000 104.000000 
+102.000000 108.000000 115.000000 117.000000 118.000000 120.000000 
+123.000000 125.000000 127.000000 126.000000 125.000000 125.000000 
+128.000000 128.000000 125.000000 121.000000 118.000000 117.000000 
+116.000000 119.000000 129.000000 122.000000 121.000000 126.000000 
+131.000000 128.000000 125.000000 129.000000 134.000000 133.000000 
+132.000000 137.000000 136.000000 112.000000 83.000000 99.000000 
+180.000000 306.000000 407.000000 435.000000 393.000000 304.000000 
+202.000000 114.000000 52.000000 21.000000 15.000000 16.000000 
+25.000000 25.000000 28.000000 43.000000 55.000000 58.000000 
+55.000000 52.000000 56.000000 65.000000 69.000000 59.000000 
+33.000000 17.000000 17.000000 31.000000 85.000000 168.000000 
+235.000000 248.000000 202.000000 139.000000 99.000000 83.000000 
+77.000000 81.000000 93.000000 105.000000 112.000000 112.000000 
+112.000000 115.000000 115.000000 113.000000 116.000000 124.000000 
+131.000000 131.000000 129.000000 128.000000 125.000000 120.000000 
+118.000000 122.000000 127.000000 125.000000 122.000000 122.000000 
+126.000000 120.000000 123.000000 127.000000 126.000000 124.000000 
+127.000000 132.000000 134.000000 130.000000 130.000000 136.000000 
+137.000000 117.000000 85.000000 79.000000 125.000000 209.000000 
+294.000000 347.000000 345.000000 281.000000 177.000000 90.000000 
+50.000000 39.000000 38.000000 40.000000 41.000000 45.000000 
+51.000000 54.000000 56.000000 58.000000 58.000000 52.000000 
+49.000000 52.000000 54.000000 49.000000 36.000000 22.000000 
+28.000000 48.000000 70.000000 97.000000 118.000000 117.000000 
+102.000000 92.000000 94.000000 96.000000 93.000000 92.000000 
+103.000000 115.000000 118.000000 116.000000 120.000000 125.000000 
+122.000000 115.000000 117.000000 125.000000 129.000000 126.000000 
+123.000000 125.000000 126.000000 123.000000 119.000000 118.000000 
+120.000000 123.000000 129.000000 135.000000 127.000000 118.000000 
+120.000000 124.000000 127.000000 128.000000 128.000000 127.000000 
+126.000000 129.000000 132.000000 132.000000 127.000000 122.000000 
+110.000000 90.000000 80.000000 103.000000 164.000000 227.000000 
+237.000000 177.000000 96.000000 49.000000 46.000000 52.000000 
+51.000000 56.000000 70.000000 81.000000 79.000000 66.000000 
+56.000000 59.000000 61.000000 55.000000 48.000000 53.000000 
+66.000000 69.000000 53.000000 24.000000 29.000000 59.000000 
+83.000000 89.000000 80.000000 67.000000 68.000000 81.000000 
+97.000000 109.000000 113.000000 110.000000 107.000000 105.000000 
+103.000000 108.000000 118.000000 124.000000 123.000000 120.000000 
+121.000000 125.000000 126.000000 123.000000 121.000000 121.000000 
+122.000000 120.000000 117.000000 115.000000 115.000000 119.000000 
+126.000000 133.000000 122.000000 119.000000 123.000000 126.000000 
+125.000000 127.000000 132.000000 134.000000 130.000000 127.000000 
+130.000000 131.000000 125.000000 118.000000 113.000000 104.000000 
+93.000000 86.000000 81.000000 89.000000 97.000000 80.000000 
+50.000000 32.000000 29.000000 40.000000 54.000000 63.000000 
+65.000000 64.000000 63.000000 59.000000 56.000000 57.000000 
+57.000000 53.000000 47.000000 47.000000 52.000000 54.000000 
+46.000000 31.000000 26.000000 48.000000 72.000000 77.000000 
+70.000000 66.000000 72.000000 83.000000 99.000000 117.000000 
+130.000000 128.000000 113.000000 100.000000 99.000000 109.000000 
+120.000000 124.000000 124.000000 123.000000 122.000000 121.000000 
+121.000000 121.000000 120.000000 120.000000 118.000000 116.000000 
+114.000000 115.000000 119.000000 122.000000 122.000000 122.000000 
+120.000000 120.000000 122.000000 123.000000 124.000000 128.000000 
+132.000000 132.000000 128.000000 126.000000 126.000000 124.000000 
+120.000000 115.000000 110.000000 102.000000 93.000000 93.000000 
+105.000000 115.000000 114.000000 94.000000 64.000000 42.000000 
+41.000000 50.000000 57.000000 59.000000 58.000000 60.000000 
+66.000000 71.000000 70.000000 66.000000 66.000000 69.000000 
+63.000000 50.000000 40.000000 35.000000 35.000000 36.000000 
+39.000000 58.000000 82.000000 94.000000 92.000000 83.000000 
+78.000000 85.000000 101.000000 119.000000 131.000000 129.000000 
+119.000000 110.000000 108.000000 115.000000 123.000000 126.000000 
+124.000000 122.000000 121.000000 122.000000 124.000000 124.000000 
+122.000000 119.000000 117.000000 117.000000 117.000000 118.000000 
+119.000000 119.000000 119.000000 119.000000 122.000000 122.000000 
+123.000000 125.000000 129.000000 129.000000 127.000000 128.000000 
+133.000000 137.000000 132.000000 120.000000 109.000000 107.000000 
+110.000000 109.000000 103.000000 101.000000 103.000000 106.000000 
+102.000000 89.000000 74.000000 70.000000 71.000000 62.000000 
+46.000000 39.000000 55.000000 76.000000 85.000000 81.000000 
+73.000000 76.000000 81.000000 81.000000 74.000000 60.000000 
+42.000000 33.000000 34.000000 40.000000 48.000000 60.000000 
+80.000000 101.000000 110.000000 102.000000 90.000000 87.000000 
+95.000000 111.000000 125.000000 132.000000 127.000000 116.000000 
+111.000000 115.000000 122.000000 123.000000 120.000000 120.000000 
+124.000000 126.000000 127.000000 129.000000 129.000000 125.000000 
+120.000000 120.000000 124.000000 128.000000 126.000000 122.000000 
+120.000000 120.000000 118.000000 120.000000 121.000000 123.000000 
+129.000000 133.000000 132.000000 129.000000 129.000000 131.000000 
+128.000000 119.000000 109.000000 99.000000 90.000000 86.000000 
+90.000000 100.000000 107.000000 111.000000 110.000000 101.000000 
+93.000000 92.000000 96.000000 93.000000 69.000000 37.000000 
+58.000000 131.000000 196.000000 197.000000 132.000000 76.000000 
+55.000000 54.000000 61.000000 67.000000 70.000000 68.000000 
+62.000000 57.000000 62.000000 79.000000 95.000000 104.000000 
+105.000000 97.000000 88.000000 87.000000 99.000000 116.000000 
+128.000000 130.000000 127.000000 126.000000 125.000000 122.000000 
+119.000000 120.000000 124.000000 127.000000 125.000000 122.000000 
+123.000000 127.000000 127.000000 124.000000 119.000000 116.000000 
+116.000000 118.000000 121.000000 120.000000 119.000000 119.000000 
+118.000000 124.000000 131.000000 136.000000 142.000000 144.000000 
+137.000000 125.000000 119.000000 123.000000 124.000000 117.000000 
+104.000000 95.000000 89.000000 88.000000 91.000000 94.000000 
+91.000000 87.000000 91.000000 99.000000 99.000000 89.000000 
+83.000000 83.000000 67.000000 45.000000 73.000000 221.000000 
+400.000000 458.000000 332.000000 143.000000 55.000000 52.000000 
+66.000000 60.000000 54.000000 66.000000 84.000000 92.000000 
+92.000000 95.000000 100.000000 100.000000 99.000000 101.000000 
+98.000000 92.000000 98.000000 121.000000 140.000000 139.000000 
+130.000000 128.000000 132.000000 128.000000 118.000000 116.000000 
+123.000000 127.000000 124.000000 124.000000 133.000000 137.000000 
+127.000000 111.000000 100.000000 101.000000 110.000000 122.000000 
+129.000000 127.000000 119.000000 114.000000 124.000000 125.000000 
+129.000000 133.000000 131.000000 123.000000 116.000000 116.000000 
+120.000000 125.000000 125.000000 117.000000 101.000000 84.000000 
+76.000000 82.000000 94.000000 98.000000 95.000000 90.000000 
+89.000000 92.000000 97.000000 96.000000 82.000000 60.000000 
+42.000000 50.000000 102.000000 231.000000 371.000000 413.000000 
+316.000000 163.000000 74.000000 53.000000 58.000000 51.000000 
+39.000000 43.000000 64.000000 81.000000 84.000000 81.000000 
+86.000000 98.000000 108.000000 114.000000 112.000000 103.000000 
+99.000000 111.000000 133.000000 145.000000 141.000000 131.000000 
+124.000000 119.000000 117.000000 121.000000 127.000000 129.000000 
+125.000000 125.000000 133.000000 142.000000 137.000000 119.000000 
+104.000000 104.000000 116.000000 127.000000 129.000000 124.000000 
+118.000000 113.000000 119.000000 117.000000 120.000000 129.000000 
+133.000000 125.000000 116.000000 116.000000 125.000000 129.000000 
+124.000000 111.000000 97.000000 85.000000 80.000000 85.000000 
+93.000000 98.000000 100.000000 106.000000 108.000000 98.000000 
+83.000000 76.000000 72.000000 59.000000 46.000000 59.000000 
+120.000000 231.000000 308.000000 300.000000 223.000000 135.000000 
+76.000000 52.000000 53.000000 56.000000 51.000000 47.000000 
+57.000000 74.000000 87.000000 91.000000 93.000000 100.000000 
+111.000000 119.000000 120.000000 112.000000 103.000000 107.000000 
+125.000000 143.000000 146.000000 135.000000 123.000000 121.000000 
+124.000000 126.000000 126.000000 125.000000 127.000000 128.000000 
+129.000000 131.000000 131.000000 125.000000 118.000000 116.000000 
+118.000000 120.000000 120.000000 120.000000 121.000000 121.000000 
+124.000000 116.000000 114.000000 120.000000 128.000000 128.000000 
+121.000000 117.000000 118.000000 122.000000 121.000000 111.000000 
+100.000000 95.000000 95.000000 97.000000 101.000000 108.000000 
+114.000000 116.000000 110.000000 101.000000 93.000000 91.000000 
+88.000000 74.000000 55.000000 57.000000 88.000000 148.000000 
+187.000000 174.000000 126.000000 84.000000 59.000000 52.000000 
+58.000000 64.000000 62.000000 59.000000 62.000000 72.000000 
+80.000000 82.000000 88.000000 99.000000 109.000000 109.000000 
+101.000000 92.000000 88.000000 95.000000 114.000000 135.000000 
+143.000000 134.000000 120.000000 114.000000 120.000000 127.000000 
+130.000000 131.000000 132.000000 133.000000 134.000000 134.000000 
+135.000000 133.000000 129.000000 125.000000 125.000000 125.000000 
+122.000000 119.000000 120.000000 126.000000 117.000000 115.000000 
+119.000000 125.000000 126.000000 123.000000 123.000000 124.000000 
+122.000000 114.000000 105.000000 99.000000 97.000000 97.000000 
+99.000000 101.000000 101.000000 103.000000 108.000000 116.000000 
+119.000000 114.000000 105.000000 102.000000 106.000000 109.000000 
+103.000000 93.000000 86.000000 84.000000 86.000000 79.000000 
+65.000000 58.000000 62.000000 71.000000 73.000000 73.000000 
+77.000000 86.000000 86.000000 74.000000 61.000000 64.000000 
+80.000000 96.000000 99.000000 94.000000 91.000000 93.000000 
+93.000000 94.000000 104.000000 118.000000 127.000000 123.000000 
+112.000000 108.000000 115.000000 128.000000 138.000000 140.000000 
+138.000000 134.000000 132.000000 132.000000 132.000000 131.000000 
+129.000000 128.000000 127.000000 125.000000 121.000000 118.000000 
+121.000000 129.000000 130.000000 127.000000 130.000000 132.000000 
+128.000000 123.000000 122.000000 123.000000 118.000000 109.000000 
+101.000000 98.000000 100.000000 103.000000 109.000000 116.000000 
+117.000000 114.000000 111.000000 116.000000 123.000000 129.000000 
+137.000000 145.000000 150.000000 145.000000 136.000000 132.000000 
+132.000000 126.000000 109.000000 94.000000 88.000000 89.000000 
+97.000000 111.000000 126.000000 132.000000 129.000000 128.000000 
+131.000000 127.000000 105.000000 76.000000 65.000000 78.000000 
+97.000000 105.000000 103.000000 102.000000 104.000000 105.000000 
+109.000000 120.000000 132.000000 132.000000 124.000000 120.000000 
+121.000000 122.000000 125.000000 135.000000 145.000000 145.000000 
+135.000000 125.000000 124.000000 126.000000 125.000000 124.000000 
+125.000000 128.000000 132.000000 133.000000 134.000000 136.000000 
+126.000000 126.000000 125.000000 123.000000 126.000000 131.000000 
+131.000000 125.000000 113.000000 99.000000 91.000000 95.000000 
+108.000000 119.000000 118.000000 107.000000 104.000000 116.000000 
+133.000000 138.000000 133.000000 131.000000 139.000000 149.000000 
+150.000000 142.000000 134.000000 129.000000 129.000000 129.000000 
+128.000000 125.000000 123.000000 128.000000 137.000000 142.000000 
+140.000000 134.000000 132.000000 131.000000 131.000000 129.000000 
+124.000000 114.000000 98.000000 88.000000 97.000000 112.000000 
+119.000000 117.000000 117.000000 123.000000 132.000000 139.000000 
+141.000000 135.000000 127.000000 123.000000 122.000000 120.000000 
+119.000000 123.000000 135.000000 144.000000 145.000000 138.000000 
+132.000000 130.000000 130.000000 127.000000 123.000000 123.000000 
+126.000000 130.000000 133.000000 133.000000 123.000000 124.000000 
+126.000000 127.000000 129.000000 132.000000 131.000000 123.000000 
+107.000000 94.000000 89.000000 94.000000 104.000000 110.000000 
+107.000000 106.000000 111.000000 119.000000 126.000000 132.000000 
+138.000000 143.000000 143.000000 137.000000 131.000000 130.000000 
+133.000000 134.000000 133.000000 131.000000 131.000000 131.000000 
+130.000000 131.000000 136.000000 141.000000 141.000000 138.000000 
+136.000000 137.000000 137.000000 134.000000 133.000000 133.000000 
+123.000000 101.000000 82.000000 88.000000 112.000000 134.000000 
+139.000000 135.000000 130.000000 130.000000 130.000000 125.000000 
+115.000000 108.000000 110.000000 114.000000 115.000000 120.000000 
+134.000000 147.000000 149.000000 144.000000 140.000000 141.000000 
+140.000000 134.000000 126.000000 121.000000 122.000000 127.000000 
+129.000000 127.000000 124.000000 120.000000 113.000000 110.000000 
+115.000000 120.000000 120.000000 114.000000 106.000000 100.000000 
+94.000000 86.000000 77.000000 74.000000 82.000000 97.000000 
+110.000000 120.000000 129.000000 138.000000 142.000000 140.000000 
+138.000000 137.000000 136.000000 133.000000 132.000000 131.000000 
+128.000000 125.000000 125.000000 129.000000 133.000000 132.000000 
+130.000000 130.000000 131.000000 132.000000 134.000000 136.000000 
+138.000000 138.000000 139.000000 141.000000 138.000000 127.000000 
+118.000000 123.000000 137.000000 142.000000 132.000000 120.000000 
+124.000000 134.000000 133.000000 118.000000 103.000000 98.000000 
+101.000000 99.000000 98.000000 110.000000 131.000000 145.000000 
+145.000000 141.000000 145.000000 150.000000 149.000000 141.000000 
+131.000000 123.000000 121.000000 125.000000 127.000000 126.000000 
+119.000000 112.000000 108.000000 114.000000 121.000000 121.000000 
+116.000000 112.000000 108.000000 99.000000 80.000000 61.000000 
+56.000000 70.000000 91.000000 108.000000 119.000000 127.000000 
+134.000000 137.000000 136.000000 135.000000 137.000000 142.000000 
+142.000000 139.000000 135.000000 133.000000 132.000000 132.000000 
+132.000000 134.000000 135.000000 133.000000 128.000000 122.000000 
+120.000000 124.000000 130.000000 135.000000 137.000000 138.000000 
+141.000000 142.000000 135.000000 124.000000 117.000000 122.000000 
+132.000000 134.000000 121.000000 103.000000 99.000000 113.000000 
+124.000000 119.000000 107.000000 103.000000 103.000000 96.000000 
+89.000000 94.000000 104.000000 108.000000 108.000000 112.000000 
+126.000000 139.000000 144.000000 140.000000 134.000000 131.000000 
+129.000000 126.000000 123.000000 123.000000 114.000000 113.000000 
+114.000000 114.000000 111.000000 107.000000 105.000000 106.000000 
+103.000000 90.000000 69.000000 51.000000 51.000000 70.000000 
+98.000000 121.000000 131.000000 130.000000 127.000000 126.000000 
+129.000000 132.000000 134.000000 136.000000 138.000000 138.000000 
+136.000000 133.000000 132.000000 134.000000 136.000000 137.000000 
+137.000000 135.000000 131.000000 128.000000 128.000000 130.000000 
+134.000000 138.000000 140.000000 138.000000 134.000000 131.000000 
+131.000000 135.000000 133.000000 123.000000 111.000000 100.000000 
+90.000000 80.000000 78.000000 95.000000 116.000000 118.000000 
+103.000000 94.000000 95.000000 84.000000 67.000000 66.000000 
+72.000000 71.000000 71.000000 84.000000 108.000000 130.000000 
+136.000000 132.000000 129.000000 133.000000 133.000000 128.000000 
+123.000000 129.000000 108.000000 109.000000 113.000000 116.000000 
+114.000000 111.000000 108.000000 109.000000 108.000000 96.000000 
+73.000000 51.000000 52.000000 76.000000 111.000000 134.000000 
+137.000000 130.000000 126.000000 127.000000 130.000000 132.000000 
+132.000000 132.000000 131.000000 130.000000 130.000000 133.000000 
+136.000000 137.000000 138.000000 140.000000 141.000000 140.000000 
+136.000000 131.000000 128.000000 126.000000 127.000000 128.000000 
+129.000000 129.000000 127.000000 124.000000 127.000000 136.000000 
+143.000000 137.000000 116.000000 88.000000 67.000000 59.000000 
+68.000000 92.000000 117.000000 127.000000 114.000000 94.000000 
+82.000000 75.000000 65.000000 53.000000 41.000000 29.000000 
+32.000000 58.000000 93.000000 118.000000 127.000000 130.000000 
+133.000000 138.000000 138.000000 131.000000 126.000000 127.000000 
+118.000000 121.000000 123.000000 114.000000 99.000000 95.000000 
+109.000000 125.000000 121.000000 95.000000 64.000000 47.000000 
+54.000000 85.000000 121.000000 139.000000 136.000000 127.000000 
+123.000000 125.000000 129.000000 131.000000 132.000000 133.000000 
+133.000000 132.000000 133.000000 133.000000 130.000000 127.000000 
+127.000000 133.000000 141.000000 144.000000 140.000000 134.000000 
+131.000000 132.000000 132.000000 130.000000 128.000000 129.000000 
+131.000000 131.000000 132.000000 137.000000 145.000000 145.000000 
+129.000000 97.000000 65.000000 46.000000 52.000000 84.000000 
+119.000000 135.000000 128.000000 114.000000 104.000000 93.000000 
+74.000000 51.000000 35.000000 22.000000 15.000000 33.000000 
+75.000000 111.000000 128.000000 129.000000 127.000000 130.000000 
+135.000000 132.000000 125.000000 122.000000 142.000000 137.000000 
+122.000000 107.000000 97.000000 103.000000 119.000000 126.000000 
+114.000000 84.000000 54.000000 44.000000 59.000000 88.000000 
+115.000000 129.000000 130.000000 129.000000 129.000000 132.000000 
+137.000000 139.000000 137.000000 133.000000 131.000000 132.000000 
+134.000000 132.000000 130.000000 131.000000 134.000000 138.000000 
+141.000000 140.000000 136.000000 132.000000 130.000000 132.000000 
+131.000000 126.000000 119.000000 118.000000 124.000000 130.000000 
+133.000000 134.000000 137.000000 140.000000 133.000000 111.000000 
+81.000000 58.000000 56.000000 78.000000 105.000000 120.000000 
+124.000000 124.000000 119.000000 101.000000 73.000000 51.000000 
+38.000000 26.000000 12.000000 20.000000 58.000000 94.000000 
+116.000000 126.000000 131.000000 130.000000 125.000000 121.000000 
+123.000000 131.000000 121.000000 126.000000 127.000000 114.000000 
+97.000000 105.000000 123.000000 123.000000 102.000000 67.000000 
+39.000000 40.000000 70.000000 108.000000 133.000000 139.000000 
+136.000000 129.000000 126.000000 128.000000 130.000000 128.000000 
+124.000000 126.000000 134.000000 140.000000 138.000000 132.000000 
+127.000000 127.000000 129.000000 134.000000 141.000000 143.000000 
+138.000000 131.000000 128.000000 131.000000 133.000000 132.000000 
+131.000000 130.000000 130.000000 129.000000 130.000000 134.000000 
+138.000000 143.000000 141.000000 125.000000 94.000000 62.000000 
+46.000000 58.000000 88.000000 118.000000 137.000000 140.000000 
+127.000000 106.000000 82.000000 57.000000 36.000000 24.000000 
+10.000000 9.000000 39.000000 71.000000 91.000000 105.000000 
+120.000000 129.000000 128.000000 127.000000 129.000000 131.000000 
+109.000000 125.000000 135.000000 126.000000 101.000000 80.000000 
+78.000000 87.000000 83.000000 61.000000 43.000000 53.000000 
+85.000000 118.000000 132.000000 130.000000 124.000000 124.000000 
+129.000000 134.000000 134.000000 131.000000 129.000000 129.000000 
+130.000000 129.000000 126.000000 124.000000 124.000000 125.000000 
+129.000000 134.000000 137.000000 136.000000 131.000000 129.000000 
+129.000000 129.000000 127.000000 125.000000 127.000000 132.000000 
+135.000000 132.000000 127.000000 125.000000 128.000000 136.000000 
+142.000000 134.000000 107.000000 71.000000 52.000000 63.000000 
+80.000000 90.000000 117.000000 152.000000 160.000000 140.000000 
+111.000000 78.000000 42.000000 16.000000 7.000000 9.000000 
+18.000000 41.000000 69.000000 92.000000 117.000000 134.000000 
+133.000000 125.000000 125.000000 129.000000 131.000000 145.000000 
+138.000000 115.000000 88.000000 75.000000 90.000000 103.000000 
+88.000000 61.000000 52.000000 73.000000 108.000000 133.000000 
+138.000000 130.000000 124.000000 127.000000 133.000000 137.000000 
+138.000000 137.000000 135.000000 129.000000 125.000000 125.000000 
+128.000000 127.000000 122.000000 120.000000 124.000000 129.000000 
+130.000000 127.000000 125.000000 124.000000 124.000000 130.000000 
+137.000000 141.000000 139.000000 134.000000 131.000000 128.000000 
+126.000000 128.000000 135.000000 142.000000 143.000000 136.000000 
+116.000000 84.000000 62.000000 74.000000 99.000000 101.000000 
+100.000000 129.000000 148.000000 125.000000 87.000000 59.000000 
+24.000000 9.000000 20.000000 14.000000 12.000000 24.000000 
+47.000000 73.000000 102.000000 127.000000 133.000000 131.000000 
+132.000000 128.000000 140.000000 148.000000 130.000000 88.000000 
+47.000000 41.000000 71.000000 94.000000 86.000000 67.000000 
+65.000000 91.000000 124.000000 139.000000 134.000000 123.000000 
+121.000000 125.000000 127.000000 127.000000 130.000000 134.000000 
+132.000000 124.000000 116.000000 117.000000 124.000000 127.000000 
+125.000000 122.000000 125.000000 131.000000 134.000000 131.000000 
+130.000000 131.000000 135.000000 137.000000 138.000000 135.000000 
+131.000000 128.000000 127.000000 127.000000 126.000000 128.000000 
+130.000000 134.000000 141.000000 146.000000 135.000000 101.000000 
+61.000000 52.000000 83.000000 105.000000 97.000000 111.000000 
+145.000000 131.000000 83.000000 59.000000 38.000000 20.000000 
+25.000000 26.000000 29.000000 22.000000 17.000000 40.000000 
+66.000000 93.000000 114.000000 125.000000 128.000000 122.000000 
+126.000000 126.000000 132.000000 133.000000 125.000000 120.000000 
+128.000000 134.000000 116.000000 83.000000 72.000000 87.000000 
+89.000000 80.000000 75.000000 70.000000 52.000000 30.000000 
+15.000000 7.000000 7.000000 14.000000 16.000000 10.000000 
+6.000000 8.000000 12.000000 14.000000 9.000000 5.000000 
+8.000000 9.000000 11.000000 12.000000 8.000000 9.000000 
+11.000000 11.000000 7.000000 16.000000 23.000000 19.000000 
+12.000000 11.000000 10.000000 6.000000 6.000000 10.000000 
+12.000000 10.000000 9.000000 15.000000 22.000000 19.000000 
+4.000000 26.000000 61.000000 76.000000 82.000000 79.000000 
+57.000000 37.000000 46.000000 66.000000 64.000000 43.000000 
+26.000000 19.000000 15.000000 10.000000 6.000000 3.000000 
+1.000000 4.000000 10.000000 14.000000 128.000000 127.000000 
+127.000000 131.000000 132.000000 128.000000 131.000000 141.000000 
+144.000000 124.000000 98.000000 88.000000 90.000000 88.000000 
+80.000000 67.000000 45.000000 21.000000 11.000000 12.000000 
+13.000000 16.000000 16.000000 13.000000 9.000000 10.000000 
+12.000000 13.000000 8.000000 9.000000 12.000000 9.000000 
+8.000000 8.000000 7.000000 6.000000 10.000000 16.000000 
+15.000000 17.000000 24.000000 24.000000 20.000000 16.000000 
+10.000000 9.000000 12.000000 15.000000 15.000000 12.000000 
+15.000000 22.000000 25.000000 28.000000 20.000000 23.000000 
+45.000000 69.000000 86.000000 83.000000 56.000000 37.000000 
+44.000000 44.000000 27.000000 8.000000 8.000000 25.000000 
+33.000000 30.000000 25.000000 22.000000 19.000000 14.000000 
+8.000000 5.000000 132.000000 131.000000 128.000000 127.000000 
+128.000000 131.000000 133.000000 135.000000 138.000000 134.000000 
+122.000000 109.000000 103.000000 101.000000 96.000000 78.000000 
+45.000000 14.000000 10.000000 14.000000 14.000000 15.000000 
+11.000000 10.000000 12.000000 15.000000 15.000000 12.000000 
+11.000000 12.000000 10.000000 8.000000 7.000000 10.000000 
+11.000000 10.000000 10.000000 12.000000 13.000000 11.000000 
+14.000000 18.000000 19.000000 15.000000 10.000000 9.000000 
+10.000000 12.000000 12.000000 8.000000 13.000000 19.000000 
+26.000000 38.000000 44.000000 46.000000 52.000000 64.000000 
+71.000000 53.000000 27.000000 21.000000 16.000000 10.000000 
+11.000000 16.000000 33.000000 60.000000 82.000000 94.000000 
+102.000000 105.000000 95.000000 78.000000 65.000000 56.000000 
+140.000000 138.000000 135.000000 131.000000 126.000000 124.000000 
+129.000000 137.000000 142.000000 137.000000 124.000000 110.000000 
+101.000000 93.000000 90.000000 87.000000 67.000000 26.000000 
+6.000000 14.000000 11.000000 12.000000 13.000000 7.000000 
+9.000000 12.000000 9.000000 11.000000 17.000000 17.000000 
+15.000000 12.000000 9.000000 9.000000 12.000000 10.000000 
+11.000000 11.000000 7.000000 7.000000 10.000000 10.000000 
+13.000000 13.000000 11.000000 9.000000 10.000000 13.000000 
+15.000000 11.000000 11.000000 16.000000 32.000000 42.000000 
+35.000000 43.000000 55.000000 50.000000 36.000000 17.000000 
+8.000000 7.000000 8.000000 19.000000 30.000000 43.000000 
+73.000000 114.000000 148.000000 161.000000 155.000000 141.000000 
+128.000000 121.000000 119.000000 116.000000 141.000000 140.000000 
+138.000000 136.000000 135.000000 133.000000 131.000000 134.000000 
+139.000000 136.000000 117.000000 96.000000 96.000000 108.000000 
+100.000000 73.000000 57.000000 57.000000 27.000000 0.000000 
+15.000000 28.000000 17.000000 7.000000 6.000000 9.000000 
+11.000000 10.000000 10.000000 17.000000 19.000000 13.000000 
+6.000000 6.000000 9.000000 10.000000 9.000000 6.000000 
+7.000000 10.000000 9.000000 8.000000 10.000000 8.000000 
+7.000000 5.000000 8.000000 13.000000 15.000000 12.000000 
+17.000000 30.000000 38.000000 34.000000 31.000000 46.000000 
+56.000000 43.000000 19.000000 7.000000 8.000000 9.000000 
+21.000000 48.000000 73.000000 94.000000 116.000000 138.000000 
+148.000000 144.000000 133.000000 125.000000 125.000000 127.000000 
+127.000000 124.000000 136.000000 140.000000 137.000000 134.000000 
+136.000000 139.000000 140.000000 138.000000 135.000000 131.000000 
+121.000000 107.000000 100.000000 110.000000 120.000000 87.000000 
+38.000000 87.000000 134.000000 98.000000 60.000000 41.000000 
+30.000000 21.000000 16.000000 12.000000 11.000000 15.000000 
+15.000000 15.000000 20.000000 18.000000 15.000000 11.000000 
+8.000000 7.000000 11.000000 16.000000 18.000000 17.000000 
+12.000000 7.000000 5.000000 9.000000 12.000000 9.000000 
+6.000000 10.000000 13.000000 8.000000 10.000000 20.000000 
+30.000000 33.000000 38.000000 48.000000 55.000000 49.000000 
+30.000000 15.000000 13.000000 27.000000 58.000000 95.000000 
+122.000000 132.000000 134.000000 133.000000 130.000000 125.000000 
+126.000000 129.000000 133.000000 133.000000 133.000000 132.000000 
+130.000000 135.000000 132.000000 129.000000 132.000000 142.000000 
+149.000000 150.000000 145.000000 135.000000 123.000000 114.000000 
+111.000000 110.000000 111.000000 99.000000 69.000000 97.000000 
+174.000000 187.000000 135.000000 72.000000 33.000000 24.000000 
+22.000000 15.000000 14.000000 12.000000 17.000000 20.000000 
+23.000000 28.000000 29.000000 16.000000 10.000000 11.000000 
+13.000000 18.000000 15.000000 12.000000 14.000000 19.000000 
+19.000000 16.000000 16.000000 13.000000 9.000000 11.000000 
+13.000000 8.000000 6.000000 11.000000 19.000000 25.000000 
+36.000000 56.000000 69.000000 58.000000 41.000000 42.000000 
+57.000000 82.000000 107.000000 124.000000 131.000000 132.000000 
+128.000000 121.000000 118.000000 124.000000 133.000000 135.000000 
+131.000000 130.000000 135.000000 137.000000 120.000000 117.000000 
+118.000000 124.000000 133.000000 139.000000 139.000000 138.000000 
+142.000000 144.000000 139.000000 132.000000 128.000000 112.000000 
+83.000000 81.000000 103.000000 110.000000 144.000000 195.000000 
+196.000000 136.000000 57.000000 20.000000 27.000000 25.000000 
+22.000000 15.000000 20.000000 27.000000 23.000000 24.000000 
+24.000000 15.000000 13.000000 11.000000 12.000000 16.000000 
+19.000000 16.000000 15.000000 20.000000 19.000000 14.000000 
+15.000000 11.000000 10.000000 10.000000 8.000000 8.000000 
+10.000000 11.000000 20.000000 39.000000 62.000000 75.000000 
+67.000000 51.000000 49.000000 70.000000 102.000000 128.000000 
+134.000000 126.000000 121.000000 122.000000 121.000000 116.000000 
+115.000000 120.000000 125.000000 128.000000 133.000000 138.000000 
+138.000000 133.000000 113.000000 113.000000 118.000000 125.000000 
+130.000000 131.000000 128.000000 130.000000 144.000000 156.000000 
+149.000000 131.000000 122.000000 111.000000 77.000000 60.000000 
+131.000000 181.000000 179.000000 181.000000 199.000000 176.000000 
+99.000000 28.000000 18.000000 18.000000 18.000000 19.000000 
+20.000000 15.000000 16.000000 22.000000 20.000000 18.000000 
+12.000000 10.000000 13.000000 16.000000 23.000000 22.000000 
+13.000000 10.000000 7.000000 10.000000 14.000000 9.000000 
+10.000000 10.000000 10.000000 10.000000 9.000000 15.000000 
+35.000000 66.000000 82.000000 74.000000 60.000000 55.000000 
+64.000000 87.000000 113.000000 127.000000 125.000000 119.000000 
+117.000000 120.000000 121.000000 122.000000 123.000000 124.000000 
+125.000000 128.000000 135.000000 141.000000 144.000000 143.000000 
+124.000000 125.000000 124.000000 123.000000 123.000000 126.000000 
+127.000000 129.000000 141.000000 156.000000 147.000000 118.000000 
+105.000000 113.000000 96.000000 56.000000 128.000000 251.000000 
+277.000000 235.000000 200.000000 178.000000 126.000000 50.000000 
+13.000000 15.000000 13.000000 15.000000 20.000000 13.000000 
+16.000000 22.000000 17.000000 15.000000 11.000000 10.000000 
+11.000000 12.000000 15.000000 14.000000 8.000000 10.000000 
+13.000000 14.000000 14.000000 9.000000 7.000000 10.000000 
+16.000000 14.000000 11.000000 26.000000 52.000000 71.000000 
+75.000000 67.000000 62.000000 69.000000 87.000000 108.000000 
+120.000000 121.000000 116.000000 115.000000 116.000000 118.000000 
+121.000000 123.000000 124.000000 128.000000 132.000000 135.000000 
+134.000000 136.000000 144.000000 151.000000 124.000000 123.000000 
+119.000000 113.000000 112.000000 121.000000 131.000000 130.000000 
+129.000000 140.000000 146.000000 128.000000 106.000000 106.000000 
+105.000000 74.000000 94.000000 233.000000 326.000000 322.000000 
+258.000000 196.000000 146.000000 84.000000 30.000000 16.000000 
+15.000000 12.000000 25.000000 22.000000 11.000000 20.000000 
+19.000000 16.000000 15.000000 14.000000 15.000000 14.000000 
+10.000000 13.000000 12.000000 8.000000 10.000000 11.000000 
+11.000000 11.000000 11.000000 11.000000 12.000000 11.000000 
+18.000000 40.000000 60.000000 71.000000 76.000000 80.000000 
+84.000000 89.000000 98.000000 110.000000 119.000000 123.000000 
+123.000000 124.000000 126.000000 125.000000 122.000000 119.000000 
+121.000000 124.000000 125.000000 126.000000 129.000000 134.000000 
+139.000000 143.000000 122.000000 125.000000 125.000000 121.000000 
+120.000000 126.000000 133.000000 133.000000 128.000000 131.000000 
+139.000000 130.000000 108.000000 99.000000 101.000000 86.000000 
+76.000000 171.000000 288.000000 339.000000 308.000000 235.000000 
+166.000000 102.000000 42.000000 24.000000 23.000000 8.000000 
+18.000000 19.000000 8.000000 17.000000 27.000000 26.000000 
+17.000000 12.000000 14.000000 13.000000 9.000000 9.000000 
+13.000000 7.000000 8.000000 9.000000 8.000000 11.000000 
+14.000000 13.000000 15.000000 17.000000 28.000000 51.000000 
+71.000000 78.000000 80.000000 86.000000 92.000000 94.000000 
+97.000000 108.000000 119.000000 124.000000 126.000000 129.000000 
+132.000000 130.000000 124.000000 121.000000 121.000000 122.000000 
+121.000000 123.000000 129.000000 134.000000 131.000000 126.000000 
+124.000000 125.000000 130.000000 134.000000 132.000000 129.000000 
+129.000000 130.000000 129.000000 129.000000 131.000000 124.000000 
+108.000000 98.000000 97.000000 88.000000 79.000000 132.000000 
+232.000000 300.000000 306.000000 258.000000 187.000000 115.000000 
+52.000000 29.000000 28.000000 14.000000 14.000000 20.000000 
+14.000000 12.000000 23.000000 27.000000 13.000000 9.000000 
+15.000000 14.000000 11.000000 6.000000 9.000000 12.000000 
+11.000000 11.000000 13.000000 11.000000 12.000000 17.000000 
+20.000000 15.000000 28.000000 60.000000 82.000000 83.000000 
+81.000000 84.000000 88.000000 93.000000 106.000000 120.000000 
+122.000000 118.000000 119.000000 124.000000 124.000000 122.000000 
+121.000000 123.000000 123.000000 121.000000 119.000000 120.000000 
+122.000000 123.000000 121.000000 118.000000 128.000000 123.000000 
+123.000000 125.000000 124.000000 122.000000 124.000000 129.000000 
+129.000000 128.000000 131.000000 131.000000 117.000000 100.000000 
+93.000000 91.000000 87.000000 117.000000 197.000000 269.000000 
+295.000000 274.000000 221.000000 153.000000 83.000000 34.000000 
+30.000000 25.000000 18.000000 22.000000 14.000000 15.000000 
+15.000000 16.000000 13.000000 11.000000 9.000000 11.000000 
+14.000000 11.000000 12.000000 14.000000 11.000000 8.000000 
+9.000000 8.000000 10.000000 12.000000 16.000000 26.000000 
+53.000000 76.000000 76.000000 71.000000 78.000000 89.000000 
+93.000000 99.000000 115.000000 125.000000 120.000000 115.000000 
+118.000000 121.000000 120.000000 119.000000 122.000000 124.000000 
+121.000000 119.000000 119.000000 118.000000 115.000000 115.000000 
+120.000000 123.000000 135.000000 126.000000 118.000000 119.000000 
+127.000000 132.000000 132.000000 132.000000 133.000000 133.000000 
+131.000000 126.000000 118.000000 111.000000 111.000000 108.000000 
+96.000000 98.000000 161.000000 249.000000 307.000000 310.000000 
+267.000000 199.000000 126.000000 66.000000 40.000000 26.000000 
+16.000000 24.000000 15.000000 11.000000 9.000000 11.000000 
+17.000000 10.000000 6.000000 10.000000 17.000000 15.000000 
+10.000000 8.000000 12.000000 15.000000 9.000000 7.000000 
+10.000000 17.000000 30.000000 57.000000 83.000000 82.000000 
+68.000000 73.000000 82.000000 77.000000 75.000000 93.000000 
+118.000000 126.000000 120.000000 120.000000 126.000000 130.000000 
+128.000000 126.000000 124.000000 121.000000 118.000000 119.000000 
+122.000000 122.000000 120.000000 120.000000 122.000000 123.000000 
+131.000000 128.000000 122.000000 121.000000 131.000000 142.000000 
+143.000000 136.000000 130.000000 130.000000 127.000000 121.000000 
+116.000000 118.000000 124.000000 123.000000 104.000000 83.000000 
+109.000000 197.000000 295.000000 351.000000 339.000000 274.000000 
+186.000000 112.000000 64.000000 34.000000 15.000000 20.000000 
+18.000000 7.000000 7.000000 20.000000 18.000000 9.000000 
+25.000000 31.000000 23.000000 13.000000 6.000000 3.000000 
+10.000000 15.000000 13.000000 11.000000 13.000000 34.000000 
+59.000000 74.000000 77.000000 74.000000 83.000000 96.000000 
+86.000000 66.000000 66.000000 88.000000 108.000000 114.000000 
+119.000000 126.000000 131.000000 133.000000 134.000000 132.000000 
+125.000000 118.000000 116.000000 117.000000 117.000000 117.000000 
+120.000000 125.000000 126.000000 123.000000 122.000000 122.000000 
+125.000000 127.000000 130.000000 138.000000 143.000000 139.000000 
+130.000000 127.000000 130.000000 130.000000 125.000000 118.000000 
+115.000000 112.000000 101.000000 87.000000 88.000000 139.000000 
+235.000000 335.000000 382.000000 346.000000 247.000000 142.000000 
+81.000000 46.000000 15.000000 15.000000 17.000000 12.000000 
+12.000000 14.000000 18.000000 18.000000 28.000000 30.000000 
+19.000000 7.000000 9.000000 11.000000 7.000000 5.000000 
+8.000000 9.000000 18.000000 46.000000 66.000000 67.000000 
+64.000000 76.000000 98.000000 103.000000 92.000000 84.000000 
+84.000000 85.000000 89.000000 104.000000 125.000000 134.000000 
+130.000000 126.000000 129.000000 131.000000 129.000000 124.000000 
+121.000000 121.000000 121.000000 125.000000 129.000000 131.000000 
+129.000000 128.000000 119.000000 116.000000 123.000000 132.000000 
+136.000000 139.000000 141.000000 140.000000 137.000000 134.000000 
+136.000000 134.000000 128.000000 122.000000 117.000000 110.000000 
+100.000000 94.000000 101.000000 129.000000 187.000000 263.000000 
+323.000000 324.000000 247.000000 135.000000 70.000000 48.000000 
+29.000000 34.000000 26.000000 13.000000 17.000000 15.000000 
+12.000000 24.000000 28.000000 23.000000 12.000000 7.000000 
+9.000000 13.000000 11.000000 12.000000 6.000000 7.000000 
+26.000000 52.000000 65.000000 63.000000 64.000000 77.000000 
+88.000000 89.000000 95.000000 104.000000 100.000000 88.000000 
+88.000000 107.000000 129.000000 138.000000 138.000000 134.000000 
+132.000000 132.000000 132.000000 130.000000 125.000000 121.000000 
+123.000000 127.000000 129.000000 129.000000 129.000000 129.000000 
+127.000000 123.000000 128.000000 133.000000 135.000000 135.000000 
+135.000000 135.000000 134.000000 134.000000 135.000000 133.000000 
+128.000000 120.000000 115.000000 112.000000 104.000000 92.000000 
+91.000000 116.000000 165.000000 216.000000 246.000000 238.000000 
+180.000000 95.000000 41.000000 31.000000 35.000000 39.000000 
+32.000000 19.000000 18.000000 27.000000 17.000000 29.000000 
+42.000000 30.000000 9.000000 10.000000 8.000000 10.000000 
+16.000000 21.000000 12.000000 38.000000 78.000000 93.000000 
+84.000000 75.000000 83.000000 88.000000 81.000000 77.000000 
+83.000000 95.000000 101.000000 99.000000 101.000000 112.000000 
+126.000000 137.000000 139.000000 135.000000 132.000000 135.000000 
+137.000000 133.000000 127.000000 126.000000 128.000000 129.000000 
+130.000000 133.000000 136.000000 132.000000 128.000000 131.000000 
+139.000000 141.000000 135.000000 128.000000 127.000000 128.000000 
+128.000000 127.000000 130.000000 135.000000 134.000000 124.000000 
+114.000000 113.000000 112.000000 98.000000 77.000000 76.000000 
+116.000000 170.000000 190.000000 161.000000 109.000000 61.000000 
+27.000000 9.000000 13.000000 18.000000 21.000000 25.000000 
+16.000000 24.000000 28.000000 36.000000 47.000000 35.000000 
+18.000000 16.000000 12.000000 11.000000 12.000000 19.000000 
+28.000000 110.000000 225.000000 275.000000 225.000000 138.000000 
+93.000000 92.000000 99.000000 96.000000 84.000000 78.000000 
+85.000000 95.000000 105.000000 113.000000 119.000000 122.000000 
+122.000000 123.000000 128.000000 133.000000 133.000000 130.000000 
+130.000000 134.000000 135.000000 134.000000 136.000000 141.000000 
+141.000000 134.000000 124.000000 128.000000 135.000000 138.000000 
+138.000000 136.000000 134.000000 131.000000 129.000000 130.000000 
+135.000000 140.000000 136.000000 124.000000 117.000000 115.000000 
+110.000000 97.000000 83.000000 80.000000 97.000000 117.000000 
+119.000000 101.000000 77.000000 56.000000 36.000000 18.000000 
+24.000000 25.000000 13.000000 22.000000 18.000000 20.000000 
+31.000000 30.000000 36.000000 40.000000 33.000000 15.000000 
+15.000000 23.000000 19.000000 28.000000 87.000000 219.000000 
+362.000000 419.000000 350.000000 216.000000 121.000000 97.000000 
+105.000000 107.000000 99.000000 88.000000 84.000000 95.000000 
+112.000000 122.000000 119.000000 113.000000 116.000000 125.000000 
+130.000000 127.000000 124.000000 126.000000 130.000000 131.000000 
+128.000000 125.000000 127.000000 131.000000 135.000000 135.000000 
+117.000000 119.000000 128.000000 139.000000 143.000000 140.000000 
+134.000000 133.000000 137.000000 141.000000 141.000000 133.000000 
+120.000000 109.000000 102.000000 95.000000 89.000000 96.000000 
+134.000000 198.000000 238.000000 208.000000 133.000000 82.000000 
+68.000000 58.000000 37.000000 25.000000 46.000000 42.000000 
+15.000000 15.000000 8.000000 15.000000 37.000000 41.000000 
+38.000000 44.000000 42.000000 19.000000 17.000000 30.000000 
+26.000000 46.000000 164.000000 310.000000 392.000000 377.000000 
+301.000000 226.000000 173.000000 127.000000 93.000000 87.000000 
+97.000000 101.000000 98.000000 106.000000 124.000000 132.000000 
+125.000000 121.000000 126.000000 132.000000 130.000000 128.000000 
+131.000000 134.000000 131.000000 125.000000 121.000000 120.000000 
+118.000000 117.000000 120.000000 131.000000 118.000000 124.000000 
+135.000000 139.000000 135.000000 127.000000 125.000000 131.000000 
+139.000000 141.000000 135.000000 128.000000 123.000000 114.000000 
+93.000000 78.000000 97.000000 159.000000 259.000000 354.000000 
+381.000000 311.000000 196.000000 114.000000 75.000000 54.000000 
+38.000000 25.000000 39.000000 36.000000 20.000000 21.000000 
+20.000000 33.000000 45.000000 49.000000 51.000000 55.000000 
+51.000000 25.000000 10.000000 14.000000 18.000000 59.000000 
+164.000000 294.000000 377.000000 384.000000 338.000000 263.000000 
+176.000000 108.000000 83.000000 87.000000 93.000000 92.000000 
+98.000000 115.000000 128.000000 125.000000 119.000000 122.000000 
+130.000000 133.000000 130.000000 130.000000 133.000000 134.000000 
+130.000000 124.000000 121.000000 120.000000 118.000000 114.000000 
+117.000000 129.000000 116.000000 121.000000 127.000000 131.000000 
+131.000000 130.000000 131.000000 133.000000 135.000000 132.000000 
+129.000000 132.000000 133.000000 116.000000 84.000000 77.000000 
+126.000000 239.000000 361.000000 419.000000 389.000000 300.000000 
+205.000000 141.000000 90.000000 45.000000 25.000000 27.000000 
+39.000000 40.000000 37.000000 43.000000 49.000000 49.000000 
+45.000000 43.000000 47.000000 52.000000 50.000000 33.000000 
+17.000000 17.000000 29.000000 62.000000 132.000000 238.000000 
+332.000000 366.000000 323.000000 228.000000 132.000000 84.000000 
+86.000000 100.000000 100.000000 96.000000 105.000000 120.000000 
+127.000000 125.000000 121.000000 121.000000 125.000000 129.000000 
+132.000000 133.000000 132.000000 130.000000 129.000000 128.000000 
+128.000000 127.000000 123.000000 120.000000 123.000000 131.000000 
+120.000000 120.000000 124.000000 131.000000 136.000000 135.000000 
+128.000000 127.000000 133.000000 136.000000 133.000000 129.000000 
+127.000000 110.000000 83.000000 83.000000 141.000000 257.000000 
+365.000000 408.000000 384.000000 317.000000 227.000000 139.000000 
+70.000000 30.000000 22.000000 33.000000 42.000000 46.000000 
+53.000000 59.000000 54.000000 47.000000 46.000000 51.000000 
+57.000000 62.000000 59.000000 45.000000 26.000000 27.000000 
+41.000000 62.000000 99.000000 162.000000 214.000000 210.000000 
+157.000000 105.000000 90.000000 101.000000 107.000000 98.000000 
+91.000000 99.000000 116.000000 125.000000 126.000000 125.000000 
+125.000000 124.000000 124.000000 128.000000 131.000000 131.000000 
+129.000000 130.000000 127.000000 123.000000 121.000000 124.000000 
+127.000000 126.000000 129.000000 137.000000 125.000000 120.000000 
+122.000000 129.000000 134.000000 133.000000 127.000000 127.000000 
+134.000000 139.000000 137.000000 134.000000 136.000000 127.000000 
+99.000000 79.000000 106.000000 183.000000 274.000000 330.000000 
+335.000000 286.000000 198.000000 106.000000 49.000000 36.000000 
+44.000000 55.000000 57.000000 59.000000 65.000000 68.000000 
+66.000000 65.000000 69.000000 70.000000 65.000000 63.000000 
+64.000000 54.000000 26.000000 13.000000 31.000000 64.000000 
+82.000000 93.000000 106.000000 108.000000 93.000000 83.000000 
+88.000000 103.000000 109.000000 102.000000 97.000000 104.000000 
+117.000000 123.000000 122.000000 122.000000 122.000000 121.000000 
+123.000000 129.000000 134.000000 132.000000 128.000000 126.000000 
+126.000000 124.000000 121.000000 119.000000 118.000000 117.000000 
+120.000000 128.000000 123.000000 123.000000 126.000000 128.000000 
+128.000000 130.000000 131.000000 129.000000 125.000000 126.000000 
+132.000000 138.000000 136.000000 125.000000 104.000000 81.000000 
+73.000000 96.000000 155.000000 220.000000 241.000000 194.000000 
+114.000000 54.000000 35.000000 45.000000 53.000000 61.000000 
+72.000000 80.000000 78.000000 67.000000 57.000000 57.000000 
+63.000000 62.000000 57.000000 59.000000 65.000000 63.000000 
+48.000000 27.000000 37.000000 70.000000 94.000000 92.000000 
+79.000000 75.000000 85.000000 99.000000 107.000000 110.000000 
+109.000000 104.000000 103.000000 108.000000 119.000000 128.000000 
+130.000000 127.000000 124.000000 122.000000 123.000000 127.000000 
+132.000000 132.000000 127.000000 119.000000 118.000000 121.000000 
+125.000000 124.000000 120.000000 117.000000 119.000000 125.000000 
+120.000000 121.000000 123.000000 124.000000 126.000000 127.000000 
+129.000000 127.000000 123.000000 122.000000 127.000000 135.000000 
+135.000000 124.000000 106.000000 89.000000 83.000000 87.000000 
+87.000000 93.000000 104.000000 97.000000 71.000000 41.000000 
+25.000000 32.000000 51.000000 62.000000 64.000000 67.000000 
+74.000000 74.000000 63.000000 50.000000 46.000000 48.000000 
+53.000000 59.000000 63.000000 58.000000 48.000000 40.000000 
+42.000000 65.000000 88.000000 95.000000 90.000000 82.000000 
+80.000000 88.000000 104.000000 119.000000 125.000000 120.000000 
+110.000000 108.000000 117.000000 130.000000 135.000000 132.000000 
+125.000000 121.000000 122.000000 125.000000 128.000000 130.000000 
+128.000000 122.000000 117.000000 118.000000 123.000000 126.000000 
+123.000000 120.000000 121.000000 124.000000 123.000000 121.000000 
+122.000000 125.000000 126.000000 126.000000 126.000000 128.000000 
+129.000000 128.000000 129.000000 133.000000 134.000000 126.000000 
+110.000000 94.000000 87.000000 91.000000 100.000000 110.000000 
+117.000000 113.000000 93.000000 65.000000 47.000000 45.000000 
+55.000000 64.000000 68.000000 76.000000 87.000000 90.000000 
+78.000000 61.000000 58.000000 67.000000 69.000000 56.000000 
+42.000000 35.000000 36.000000 39.000000 38.000000 49.000000 
+74.000000 100.000000 110.000000 97.000000 80.000000 77.000000 
+93.000000 111.000000 121.000000 120.000000 117.000000 118.000000 
+122.000000 125.000000 126.000000 124.000000 122.000000 123.000000 
+125.000000 128.000000 131.000000 131.000000 130.000000 126.000000 
+123.000000 122.000000 124.000000 125.000000 124.000000 122.000000 
+119.000000 119.000000 121.000000 116.000000 117.000000 122.000000 
+128.000000 130.000000 130.000000 129.000000 128.000000 128.000000 
+131.000000 134.000000 128.000000 111.000000 95.000000 89.000000 
+93.000000 98.000000 100.000000 103.000000 107.000000 106.000000 
+101.000000 96.000000 90.000000 77.000000 59.000000 55.000000 
+79.000000 102.000000 105.000000 92.000000 73.000000 70.000000 
+81.000000 88.000000 88.000000 81.000000 67.000000 54.000000 
+47.000000 43.000000 43.000000 48.000000 66.000000 90.000000 
+102.000000 96.000000 88.000000 94.000000 114.000000 127.000000 
+126.000000 117.000000 112.000000 114.000000 118.000000 121.000000 
+122.000000 121.000000 120.000000 120.000000 122.000000 125.000000 
+128.000000 129.000000 125.000000 120.000000 117.000000 118.000000 
+119.000000 120.000000 121.000000 123.000000 125.000000 125.000000 
+119.000000 121.000000 123.000000 124.000000 127.000000 132.000000 
+136.000000 135.000000 132.000000 131.000000 132.000000 129.000000 
+120.000000 105.000000 93.000000 92.000000 100.000000 106.000000 
+104.000000 99.000000 97.000000 95.000000 90.000000 89.000000 
+97.000000 104.000000 88.000000 61.000000 84.000000 149.000000 
+211.000000 214.000000 141.000000 73.000000 57.000000 64.000000 
+69.000000 68.000000 72.000000 78.000000 76.000000 70.000000 
+74.000000 92.000000 109.000000 112.000000 104.000000 95.000000 
+89.000000 93.000000 109.000000 126.000000 128.000000 119.000000 
+111.000000 116.000000 125.000000 128.000000 125.000000 122.000000 
+124.000000 124.000000 122.000000 122.000000 126.000000 129.000000 
+128.000000 124.000000 121.000000 121.000000 123.000000 128.000000 
+130.000000 127.000000 122.000000 121.000000 122.000000 125.000000 
+129.000000 130.000000 130.000000 132.000000 132.000000 129.000000 
+125.000000 125.000000 129.000000 129.000000 119.000000 103.000000 
+89.000000 84.000000 89.000000 95.000000 93.000000 88.000000 
+85.000000 87.000000 90.000000 93.000000 97.000000 93.000000 
+66.000000 37.000000 64.000000 217.000000 411.000000 473.000000 
+346.000000 147.000000 52.000000 51.000000 70.000000 62.000000 
+49.000000 59.000000 76.000000 81.000000 77.000000 78.000000 
+92.000000 110.000000 114.000000 104.000000 89.000000 84.000000 
+97.000000 118.000000 131.000000 129.000000 122.000000 125.000000 
+132.000000 130.000000 122.000000 117.000000 119.000000 121.000000 
+123.000000 124.000000 126.000000 126.000000 124.000000 120.000000 
+117.000000 114.000000 116.000000 123.000000 130.000000 129.000000 
+123.000000 120.000000 122.000000 123.000000 127.000000 130.000000 
+130.000000 127.000000 125.000000 126.000000 126.000000 125.000000 
+124.000000 120.000000 110.000000 95.000000 83.000000 79.000000 
+82.000000 86.000000 90.000000 94.000000 96.000000 95.000000 
+90.000000 82.000000 65.000000 40.000000 23.000000 40.000000 
+104.000000 241.000000 374.000000 403.000000 305.000000 162.000000 
+76.000000 51.000000 57.000000 56.000000 44.000000 41.000000 
+58.000000 77.000000 85.000000 84.000000 83.000000 94.000000 
+107.000000 108.000000 99.000000 92.000000 97.000000 116.000000 
+135.000000 140.000000 134.000000 126.000000 123.000000 120.000000 
+116.000000 115.000000 119.000000 125.000000 129.000000 131.000000 
+134.000000 136.000000 129.000000 111.000000 96.000000 96.000000 
+108.000000 119.000000 123.000000 125.000000 128.000000 129.000000 
+127.000000 125.000000 122.000000 123.000000 128.000000 130.000000 
+126.000000 119.000000 118.000000 123.000000 126.000000 120.000000 
+108.000000 96.000000 90.000000 90.000000 93.000000 98.000000 
+106.000000 112.000000 110.000000 96.000000 79.000000 69.000000 
+62.000000 46.000000 37.000000 55.000000 119.000000 227.000000 
+304.000000 298.000000 228.000000 145.000000 81.000000 50.000000 
+52.000000 61.000000 58.000000 48.000000 50.000000 66.000000 
+83.000000 89.000000 92.000000 101.000000 111.000000 110.000000 
+96.000000 84.000000 84.000000 98.000000 118.000000 135.000000 
+140.000000 134.000000 126.000000 124.000000 126.000000 127.000000 
+125.000000 124.000000 125.000000 127.000000 130.000000 136.000000 
+139.000000 130.000000 114.000000 105.000000 107.000000 116.000000 
+123.000000 125.000000 125.000000 124.000000 129.000000 121.000000 
+116.000000 120.000000 129.000000 131.000000 125.000000 120.000000 
+123.000000 129.000000 127.000000 114.000000 99.000000 89.000000 
+89.000000 94.000000 100.000000 102.000000 104.000000 108.000000 
+114.000000 112.000000 102.000000 91.000000 83.000000 73.000000 
+65.000000 71.000000 98.000000 148.000000 186.000000 179.000000 
+134.000000 88.000000 58.000000 49.000000 56.000000 66.000000 
+70.000000 69.000000 66.000000 66.000000 70.000000 75.000000 
+86.000000 99.000000 108.000000 106.000000 96.000000 91.000000 
+94.000000 105.000000 117.000000 123.000000 124.000000 121.000000 
+118.000000 121.000000 129.000000 134.000000 134.000000 131.000000 
+129.000000 132.000000 137.000000 137.000000 129.000000 118.000000 
+113.000000 114.000000 119.000000 122.000000 122.000000 122.000000 
+124.000000 128.000000 124.000000 122.000000 122.000000 123.000000 
+125.000000 127.000000 127.000000 125.000000 121.000000 117.000000 
+112.000000 105.000000 97.000000 94.000000 99.000000 106.000000 
+107.000000 104.000000 105.000000 109.000000 116.000000 118.000000 
+118.000000 117.000000 121.000000 126.000000 124.000000 113.000000 
+99.000000 93.000000 97.000000 102.000000 93.000000 77.000000 
+70.000000 76.000000 86.000000 91.000000 94.000000 100.000000 
+104.000000 94.000000 77.000000 67.000000 70.000000 80.000000 
+89.000000 96.000000 102.000000 105.000000 104.000000 101.000000 
+102.000000 109.000000 117.000000 118.000000 116.000000 117.000000 
+120.000000 124.000000 129.000000 134.000000 136.000000 136.000000 
+135.000000 135.000000 134.000000 131.000000 127.000000 124.000000 
+123.000000 125.000000 124.000000 118.000000 113.000000 114.000000 
+120.000000 115.000000 118.000000 125.000000 128.000000 125.000000 
+120.000000 118.000000 119.000000 119.000000 115.000000 106.000000 
+96.000000 94.000000 99.000000 103.000000 98.000000 91.000000 
+90.000000 99.000000 110.000000 120.000000 131.000000 142.000000 
+146.000000 140.000000 129.000000 124.000000 127.000000 130.000000 
+120.000000 103.000000 95.000000 102.000000 119.000000 133.000000 
+136.000000 134.000000 133.000000 134.000000 133.000000 123.000000 
+104.000000 81.000000 67.000000 67.000000 78.000000 93.000000 
+107.000000 117.000000 124.000000 121.000000 108.000000 102.000000 
+109.000000 117.000000 118.000000 119.000000 124.000000 129.000000 
+131.000000 131.000000 134.000000 139.000000 142.000000 141.000000 
+138.000000 138.000000 138.000000 135.000000 130.000000 126.000000 
+124.000000 123.000000 124.000000 128.000000 125.000000 121.000000 
+123.000000 126.000000 124.000000 120.000000 120.000000 127.000000 
+126.000000 112.000000 94.000000 87.000000 96.000000 108.000000 
+109.000000 103.000000 106.000000 122.000000 136.000000 139.000000 
+136.000000 139.000000 145.000000 148.000000 144.000000 137.000000 
+132.000000 132.000000 136.000000 141.000000 141.000000 135.000000 
+126.000000 123.000000 128.000000 134.000000 135.000000 133.000000 
+133.000000 135.000000 133.000000 127.000000 119.000000 111.000000 
+101.000000 88.000000 82.000000 88.000000 101.000000 115.000000 
+127.000000 134.000000 131.000000 119.000000 111.000000 112.000000 
+116.000000 121.000000 127.000000 130.000000 130.000000 129.000000 
+129.000000 131.000000 135.000000 138.000000 141.000000 142.000000 
+139.000000 133.000000 130.000000 127.000000 125.000000 124.000000 
+129.000000 136.000000 125.000000 128.000000 128.000000 125.000000 
+125.000000 129.000000 133.000000 129.000000 116.000000 102.000000 
+94.000000 93.000000 94.000000 93.000000 87.000000 87.000000 
+97.000000 112.000000 126.000000 139.000000 149.000000 152.000000 
+150.000000 146.000000 144.000000 141.000000 137.000000 135.000000 
+135.000000 136.000000 136.000000 137.000000 139.000000 138.000000 
+134.000000 131.000000 132.000000 134.000000 133.000000 132.000000 
+132.000000 132.000000 130.000000 131.000000 131.000000 121.000000 
+102.000000 93.000000 107.000000 131.000000 144.000000 142.000000 
+133.000000 125.000000 117.000000 112.000000 110.000000 114.000000 
+121.000000 126.000000 124.000000 124.000000 128.000000 133.000000 
+138.000000 145.000000 152.000000 152.000000 145.000000 136.000000 
+131.000000 130.000000 128.000000 123.000000 120.000000 121.000000 
+129.000000 128.000000 123.000000 121.000000 122.000000 126.000000 
+127.000000 119.000000 104.000000 89.000000 77.000000 69.000000 
+70.000000 84.000000 104.000000 118.000000 123.000000 125.000000 
+132.000000 143.000000 148.000000 144.000000 139.000000 138.000000 
+138.000000 135.000000 135.000000 138.000000 140.000000 136.000000 
+131.000000 131.000000 132.000000 129.000000 126.000000 127.000000 
+132.000000 134.000000 130.000000 127.000000 128.000000 131.000000 
+134.000000 139.000000 144.000000 138.000000 124.000000 111.000000 
+112.000000 123.000000 128.000000 122.000000 118.000000 119.000000 
+116.000000 107.000000 102.000000 105.000000 110.000000 112.000000 
+112.000000 118.000000 123.000000 127.000000 132.000000 139.000000 
+142.000000 138.000000 132.000000 131.000000 130.000000 125.000000 
+119.000000 119.000000 124.000000 127.000000 121.000000 120.000000 
+120.000000 118.000000 117.000000 116.000000 114.000000 110.000000 
+102.000000 90.000000 79.000000 70.000000 68.000000 78.000000 
+100.000000 125.000000 143.000000 147.000000 140.000000 134.000000 
+135.000000 138.000000 139.000000 140.000000 141.000000 143.000000 
+144.000000 142.000000 137.000000 131.000000 126.000000 125.000000 
+128.000000 131.000000 131.000000 128.000000 128.000000 129.000000 
+130.000000 131.000000 131.000000 132.000000 132.000000 133.000000 
+135.000000 137.000000 133.000000 121.000000 106.000000 96.000000 
+89.000000 86.000000 93.000000 110.000000 119.000000 109.000000 
+95.000000 90.000000 92.000000 96.000000 105.000000 116.000000 
+125.000000 131.000000 136.000000 140.000000 139.000000 137.000000 
+138.000000 140.000000 137.000000 131.000000 126.000000 126.000000 
+128.000000 129.000000 113.000000 112.000000 112.000000 115.000000 
+117.000000 116.000000 112.000000 107.000000 96.000000 79.000000 
+60.000000 52.000000 60.000000 82.000000 113.000000 146.000000 
+170.000000 171.000000 153.000000 134.000000 127.000000 132.000000 
+139.000000 140.000000 138.000000 138.000000 140.000000 142.000000 
+142.000000 138.000000 133.000000 129.000000 130.000000 134.000000 
+135.000000 133.000000 131.000000 133.000000 133.000000 131.000000 
+129.000000 131.000000 135.000000 135.000000 134.000000 138.000000 
+143.000000 135.000000 113.000000 88.000000 70.000000 63.000000 
+70.000000 91.000000 113.000000 113.000000 95.000000 86.000000 
+94.000000 105.000000 108.000000 110.000000 118.000000 126.000000 
+129.000000 124.000000 122.000000 127.000000 134.000000 136.000000 
+135.000000 135.000000 137.000000 136.000000 132.000000 130.000000 
+114.000000 111.000000 114.000000 121.000000 124.000000 120.000000 
+113.000000 108.000000 100.000000 84.000000 62.000000 52.000000 
+66.000000 97.000000 137.000000 172.000000 181.000000 167.000000 
+145.000000 133.000000 133.000000 138.000000 138.000000 134.000000 
+133.000000 136.000000 138.000000 138.000000 138.000000 139.000000 
+140.000000 139.000000 137.000000 137.000000 137.000000 136.000000 
+132.000000 128.000000 127.000000 126.000000 126.000000 126.000000 
+126.000000 127.000000 129.000000 134.000000 140.000000 136.000000 
+116.000000 87.000000 64.000000 54.000000 57.000000 71.000000 
+91.000000 103.000000 99.000000 92.000000 94.000000 98.000000 
+97.000000 99.000000 103.000000 107.000000 110.000000 116.000000 
+122.000000 128.000000 133.000000 136.000000 137.000000 136.000000 
+134.000000 131.000000 128.000000 129.000000 107.000000 105.000000 
+113.000000 123.000000 125.000000 120.000000 113.000000 108.000000 
+102.000000 90.000000 73.000000 67.000000 84.000000 123.000000 
+166.000000 184.000000 169.000000 139.000000 121.000000 120.000000 
+129.000000 135.000000 134.000000 131.000000 132.000000 135.000000 
+140.000000 141.000000 141.000000 141.000000 139.000000 136.000000 
+134.000000 135.000000 138.000000 141.000000 138.000000 134.000000 
+131.000000 131.000000 128.000000 123.000000 122.000000 127.000000 
+135.000000 141.000000 145.000000 145.000000 132.000000 104.000000 
+73.000000 54.000000 53.000000 67.000000 86.000000 102.000000 
+106.000000 101.000000 94.000000 89.000000 87.000000 87.000000 
+88.000000 85.000000 84.000000 92.000000 106.000000 120.000000 
+130.000000 135.000000 137.000000 136.000000 135.000000 132.000000 
+127.000000 124.000000 114.000000 119.000000 125.000000 126.000000 
+119.000000 111.000000 109.000000 108.000000 98.000000 79.000000 
+66.000000 74.000000 105.000000 145.000000 169.000000 166.000000 
+146.000000 128.000000 123.000000 128.000000 134.000000 136.000000 
+137.000000 137.000000 135.000000 131.000000 128.000000 131.000000 
+137.000000 141.000000 142.000000 141.000000 140.000000 139.000000 
+140.000000 141.000000 140.000000 134.000000 128.000000 124.000000 
+122.000000 119.000000 118.000000 121.000000 128.000000 135.000000 
+142.000000 146.000000 142.000000 122.000000 89.000000 60.000000 
+49.000000 60.000000 84.000000 105.000000 114.000000 110.000000 
+101.000000 94.000000 88.000000 79.000000 67.000000 60.000000 
+62.000000 72.000000 90.000000 110.000000 129.000000 140.000000 
+140.000000 134.000000 129.000000 125.000000 122.000000 123.000000 
+138.000000 141.000000 132.000000 116.000000 103.000000 100.000000 
+103.000000 102.000000 86.000000 63.000000 52.000000 67.000000 
+104.000000 139.000000 153.000000 144.000000 129.000000 126.000000 
+133.000000 139.000000 136.000000 129.000000 127.000000 129.000000 
+131.000000 132.000000 136.000000 139.000000 141.000000 140.000000 
+138.000000 138.000000 139.000000 139.000000 137.000000 136.000000 
+135.000000 135.000000 133.000000 130.000000 126.000000 124.000000 
+126.000000 131.000000 136.000000 139.000000 140.000000 144.000000 
+144.000000 128.000000 94.000000 58.000000 42.000000 54.000000 
+84.000000 110.000000 121.000000 115.000000 107.000000 101.000000 
+93.000000 77.000000 60.000000 49.000000 41.000000 46.000000 
+70.000000 99.000000 120.000000 132.000000 137.000000 135.000000 
+129.000000 121.000000 116.000000 118.000000 120.000000 115.000000 
+109.000000 98.000000 81.000000 67.000000 70.000000 84.000000 
+89.000000 77.000000 58.000000 57.000000 81.000000 114.000000 
+135.000000 139.000000 135.000000 133.000000 134.000000 134.000000 
+133.000000 131.000000 129.000000 126.000000 124.000000 127.000000 
+133.000000 138.000000 139.000000 138.000000 138.000000 139.000000 
+140.000000 139.000000 135.000000 132.000000 130.000000 129.000000 
+127.000000 126.000000 125.000000 125.000000 126.000000 130.000000 
+134.000000 137.000000 139.000000 144.000000 150.000000 143.000000 
+112.000000 69.000000 43.000000 50.000000 79.000000 105.000000 
+118.000000 122.000000 124.000000 122.000000 107.000000 77.000000 
+51.000000 38.000000 24.000000 19.000000 41.000000 73.000000 
+97.000000 115.000000 131.000000 139.000000 132.000000 120.000000 
+119.000000 126.000000 105.000000 86.000000 77.000000 79.000000 
+85.000000 84.000000 79.000000 77.000000 78.000000 75.000000 
+68.000000 74.000000 97.000000 120.000000 133.000000 137.000000 
+138.000000 138.000000 135.000000 131.000000 130.000000 131.000000 
+129.000000 125.000000 124.000000 129.000000 135.000000 137.000000 
+136.000000 135.000000 138.000000 140.000000 140.000000 136.000000 
+131.000000 125.000000 122.000000 124.000000 132.000000 137.000000 
+136.000000 130.000000 125.000000 125.000000 127.000000 128.000000 
+129.000000 135.000000 145.000000 145.000000 123.000000 83.000000 
+51.000000 54.000000 81.000000 101.000000 108.000000 119.000000 
+131.000000 122.000000 88.000000 55.000000 43.000000 32.000000 
+16.000000 5.000000 18.000000 53.000000 87.000000 104.000000 
+114.000000 124.000000 125.000000 119.000000 120.000000 127.000000 
+91.000000 89.000000 83.000000 74.000000 75.000000 81.000000 
+82.000000 79.000000 71.000000 64.000000 69.000000 90.000000 
+116.000000 127.000000 126.000000 124.000000 127.000000 132.000000 
+130.000000 126.000000 124.000000 126.000000 127.000000 124.000000 
+119.000000 121.000000 128.000000 134.000000 137.000000 134.000000 
+130.000000 127.000000 127.000000 130.000000 134.000000 134.000000 
+129.000000 126.000000 128.000000 130.000000 126.000000 122.000000 
+123.000000 129.000000 130.000000 126.000000 125.000000 134.000000 
+146.000000 145.000000 125.000000 89.000000 55.000000 50.000000 
+77.000000 103.000000 105.000000 112.000000 144.000000 157.000000 
+121.000000 78.000000 68.000000 59.000000 35.000000 17.000000 
+16.000000 36.000000 61.000000 82.000000 97.000000 114.000000 
+128.000000 130.000000 128.000000 128.000000 126.000000 130.000000 
+131.000000 129.000000 122.000000 119.000000 129.000000 143.000000 
+136.000000 105.000000 78.000000 75.000000 79.000000 77.000000 
+73.000000 75.000000 63.000000 32.000000 13.000000 13.000000 
+8.000000 8.000000 6.000000 5.000000 9.000000 13.000000 
+14.000000 14.000000 10.000000 8.000000 11.000000 11.000000 
+8.000000 9.000000 7.000000 5.000000 10.000000 11.000000 
+9.000000 11.000000 25.000000 36.000000 32.000000 19.000000 
+9.000000 6.000000 8.000000 7.000000 6.000000 8.000000 
+12.000000 16.000000 16.000000 15.000000 18.000000 31.000000 
+40.000000 36.000000 37.000000 39.000000 30.000000 28.000000 
+47.000000 66.000000 57.000000 23.000000 6.000000 9.000000 
+13.000000 17.000000 21.000000 22.000000 19.000000 15.000000 
+11.000000 11.000000 136.000000 138.000000 136.000000 132.000000 
+126.000000 120.000000 119.000000 124.000000 127.000000 120.000000 
+104.000000 96.000000 100.000000 101.000000 92.000000 80.000000 
+63.000000 39.000000 19.000000 11.000000 9.000000 12.000000 
+13.000000 12.000000 9.000000 11.000000 13.000000 12.000000 
+13.000000 12.000000 10.000000 9.000000 8.000000 6.000000 
+8.000000 8.000000 9.000000 9.000000 8.000000 7.000000 
+17.000000 25.000000 22.000000 14.000000 7.000000 9.000000 
+11.000000 9.000000 7.000000 10.000000 15.000000 15.000000 
+13.000000 21.000000 32.000000 42.000000 48.000000 43.000000 
+36.000000 27.000000 15.000000 22.000000 40.000000 37.000000 
+18.000000 12.000000 27.000000 46.000000 58.000000 68.000000 
+76.000000 79.000000 77.000000 74.000000 71.000000 66.000000 
+137.000000 141.000000 139.000000 136.000000 133.000000 128.000000 
+119.000000 112.000000 113.000000 117.000000 116.000000 113.000000 
+110.000000 103.000000 92.000000 79.000000 62.000000 41.000000 
+28.000000 22.000000 15.000000 12.000000 13.000000 13.000000 
+12.000000 12.000000 12.000000 12.000000 15.000000 15.000000 
+11.000000 7.000000 5.000000 7.000000 11.000000 10.000000 
+8.000000 7.000000 10.000000 10.000000 11.000000 14.000000 
+13.000000 8.000000 5.000000 8.000000 13.000000 13.000000 
+6.000000 6.000000 11.000000 11.000000 14.000000 23.000000 
+36.000000 52.000000 61.000000 62.000000 56.000000 37.000000 
+15.000000 11.000000 13.000000 12.000000 16.000000 34.000000 
+65.000000 94.000000 112.000000 119.000000 122.000000 122.000000 
+117.000000 113.000000 114.000000 115.000000 145.000000 149.000000 
+144.000000 133.000000 125.000000 126.000000 133.000000 136.000000 
+131.000000 116.000000 100.000000 94.000000 104.000000 112.000000 
+106.000000 90.000000 67.000000 31.000000 2.000000 7.000000 
+17.000000 13.000000 13.000000 22.000000 16.000000 7.000000 
+10.000000 15.000000 17.000000 12.000000 8.000000 7.000000 
+6.000000 9.000000 10.000000 9.000000 11.000000 8.000000 
+11.000000 12.000000 12.000000 15.000000 17.000000 14.000000 
+9.000000 6.000000 7.000000 12.000000 12.000000 12.000000 
+10.000000 10.000000 20.000000 34.000000 49.000000 56.000000 
+59.000000 64.000000 62.000000 40.000000 18.000000 11.000000 
+11.000000 21.000000 45.000000 75.000000 102.000000 120.000000 
+128.000000 131.000000 133.000000 133.000000 131.000000 128.000000 
+127.000000 127.000000 139.000000 137.000000 133.000000 131.000000 
+129.000000 125.000000 125.000000 134.000000 146.000000 144.000000 
+124.000000 101.000000 102.000000 120.000000 115.000000 78.000000 
+76.000000 124.000000 123.000000 91.000000 52.000000 18.000000 
+9.000000 17.000000 29.000000 18.000000 9.000000 9.000000 
+12.000000 20.000000 22.000000 15.000000 7.000000 11.000000 
+9.000000 8.000000 10.000000 4.000000 10.000000 10.000000 
+7.000000 10.000000 12.000000 12.000000 10.000000 9.000000 
+9.000000 9.000000 11.000000 11.000000 9.000000 15.000000 
+24.000000 38.000000 52.000000 58.000000 61.000000 65.000000 
+58.000000 41.000000 24.000000 17.000000 28.000000 58.000000 
+93.000000 118.000000 123.000000 122.000000 129.000000 138.000000 
+139.000000 134.000000 130.000000 129.000000 126.000000 122.000000 
+133.000000 131.000000 126.000000 130.000000 140.000000 145.000000 
+140.000000 138.000000 144.000000 150.000000 144.000000 130.000000 
+123.000000 127.000000 124.000000 94.000000 84.000000 182.000000 
+294.000000 309.000000 216.000000 85.000000 14.000000 27.000000 
+24.000000 35.000000 21.000000 13.000000 13.000000 16.000000 
+27.000000 33.000000 22.000000 16.000000 17.000000 11.000000 
+10.000000 10.000000 11.000000 12.000000 14.000000 17.000000 
+17.000000 17.000000 15.000000 11.000000 11.000000 10.000000 
+9.000000 7.000000 5.000000 10.000000 19.000000 29.000000 
+42.000000 54.000000 62.000000 60.000000 50.000000 42.000000 
+40.000000 53.000000 84.000000 112.000000 123.000000 121.000000 
+117.000000 118.000000 122.000000 126.000000 128.000000 129.000000 
+129.000000 128.000000 125.000000 123.000000 129.000000 131.000000 
+128.000000 126.000000 130.000000 140.000000 148.000000 147.000000 
+143.000000 139.000000 134.000000 131.000000 132.000000 130.000000 
+121.000000 115.000000 130.000000 196.000000 296.000000 347.000000 
+291.000000 154.000000 40.000000 25.000000 18.000000 23.000000 
+23.000000 13.000000 12.000000 17.000000 22.000000 31.000000 
+26.000000 21.000000 21.000000 11.000000 8.000000 12.000000 
+14.000000 15.000000 19.000000 21.000000 19.000000 19.000000 
+16.000000 13.000000 17.000000 17.000000 15.000000 11.000000 
+8.000000 8.000000 18.000000 33.000000 47.000000 57.000000 
+58.000000 56.000000 59.000000 63.000000 73.000000 101.000000 
+128.000000 133.000000 121.000000 113.000000 114.000000 117.000000 
+117.000000 117.000000 122.000000 128.000000 132.000000 134.000000 
+135.000000 134.000000 124.000000 132.000000 135.000000 131.000000 
+126.000000 128.000000 137.000000 145.000000 147.000000 138.000000 
+121.000000 115.000000 122.000000 118.000000 97.000000 118.000000 
+204.000000 247.000000 249.000000 259.000000 249.000000 179.000000 
+74.000000 14.000000 26.000000 15.000000 26.000000 24.000000 
+16.000000 21.000000 25.000000 23.000000 19.000000 16.000000 
+15.000000 10.000000 6.000000 9.000000 12.000000 16.000000 
+14.000000 14.000000 15.000000 15.000000 15.000000 15.000000 
+15.000000 13.000000 14.000000 15.000000 14.000000 11.000000 
+24.000000 45.000000 56.000000 58.000000 58.000000 61.000000 
+69.000000 80.000000 100.000000 120.000000 125.000000 115.000000 
+110.000000 116.000000 124.000000 126.000000 124.000000 123.000000 
+124.000000 128.000000 134.000000 139.000000 141.000000 139.000000 
+124.000000 132.000000 132.000000 126.000000 124.000000 128.000000 
+133.000000 140.000000 149.000000 151.000000 136.000000 117.000000 
+115.000000 116.000000 93.000000 98.000000 224.000000 330.000000 
+345.000000 316.000000 283.000000 224.000000 130.000000 38.000000 
+23.000000 24.000000 18.000000 29.000000 26.000000 20.000000 
+18.000000 10.000000 13.000000 12.000000 8.000000 8.000000 
+16.000000 22.000000 18.000000 15.000000 12.000000 12.000000 
+11.000000 9.000000 13.000000 13.000000 8.000000 11.000000 
+16.000000 16.000000 12.000000 21.000000 38.000000 55.000000 
+68.000000 73.000000 72.000000 69.000000 74.000000 92.000000 
+115.000000 127.000000 123.000000 114.000000 111.000000 116.000000 
+125.000000 129.000000 126.000000 121.000000 121.000000 126.000000 
+134.000000 141.000000 145.000000 146.000000 121.000000 131.000000 
+135.000000 126.000000 116.000000 116.000000 125.000000 134.000000 
+142.000000 149.000000 138.000000 111.000000 97.000000 103.000000 
+94.000000 81.000000 173.000000 312.000000 376.000000 367.000000 
+335.000000 272.000000 176.000000 72.000000 17.000000 31.000000 
+17.000000 14.000000 31.000000 37.000000 31.000000 15.000000 
+18.000000 19.000000 15.000000 15.000000 20.000000 26.000000 
+23.000000 17.000000 14.000000 12.000000 14.000000 10.000000 
+15.000000 14.000000 8.000000 13.000000 19.000000 12.000000 
+9.000000 30.000000 55.000000 71.000000 83.000000 88.000000 
+83.000000 80.000000 88.000000 106.000000 120.000000 126.000000 
+126.000000 122.000000 120.000000 122.000000 126.000000 128.000000 
+127.000000 127.000000 127.000000 126.000000 127.000000 132.000000 
+142.000000 147.000000 124.000000 132.000000 136.000000 129.000000 
+120.000000 121.000000 130.000000 137.000000 140.000000 139.000000 
+130.000000 111.000000 96.000000 94.000000 88.000000 84.000000 
+140.000000 242.000000 301.000000 310.000000 305.000000 275.000000 
+203.000000 110.000000 34.000000 26.000000 22.000000 13.000000 
+30.000000 45.000000 44.000000 34.000000 38.000000 35.000000 
+21.000000 17.000000 16.000000 15.000000 15.000000 20.000000 
+17.000000 12.000000 15.000000 11.000000 13.000000 15.000000 
+15.000000 17.000000 18.000000 9.000000 16.000000 44.000000 
+74.000000 91.000000 92.000000 88.000000 87.000000 93.000000 
+104.000000 117.000000 127.000000 130.000000 128.000000 127.000000 
+130.000000 130.000000 127.000000 125.000000 128.000000 132.000000 
+132.000000 129.000000 129.000000 134.000000 140.000000 142.000000 
+130.000000 128.000000 123.000000 119.000000 120.000000 128.000000 
+139.000000 141.000000 137.000000 134.000000 129.000000 118.000000 
+104.000000 98.000000 91.000000 87.000000 133.000000 225.000000 
+267.000000 248.000000 236.000000 245.000000 228.000000 165.000000 
+77.000000 23.000000 21.000000 16.000000 19.000000 23.000000 
+23.000000 32.000000 48.000000 43.000000 20.000000 12.000000 
+13.000000 11.000000 11.000000 16.000000 10.000000 9.000000 
+11.000000 8.000000 8.000000 10.000000 12.000000 18.000000 
+18.000000 10.000000 28.000000 62.000000 85.000000 91.000000 
+89.000000 93.000000 101.000000 107.000000 115.000000 124.000000 
+129.000000 127.000000 124.000000 127.000000 130.000000 128.000000 
+123.000000 124.000000 129.000000 133.000000 133.000000 131.000000 
+132.000000 133.000000 134.000000 133.000000 125.000000 121.000000 
+124.000000 125.000000 123.000000 123.000000 130.000000 136.000000 
+136.000000 135.000000 131.000000 116.000000 95.000000 88.000000 
+95.000000 96.000000 120.000000 204.000000 253.000000 232.000000 
+205.000000 215.000000 227.000000 197.000000 118.000000 39.000000 
+14.000000 11.000000 21.000000 15.000000 5.000000 14.000000 
+22.000000 23.000000 13.000000 8.000000 10.000000 12.000000 
+11.000000 13.000000 9.000000 6.000000 11.000000 11.000000 
+7.000000 10.000000 17.000000 19.000000 12.000000 11.000000 
+40.000000 75.000000 90.000000 86.000000 81.000000 86.000000 
+94.000000 103.000000 114.000000 123.000000 124.000000 124.000000 
+127.000000 128.000000 126.000000 126.000000 130.000000 132.000000 
+129.000000 127.000000 128.000000 130.000000 128.000000 124.000000 
+122.000000 123.000000 127.000000 127.000000 131.000000 134.000000 
+131.000000 127.000000 130.000000 137.000000 139.000000 137.000000 
+129.000000 113.000000 96.000000 93.000000 106.000000 110.000000 
+111.000000 165.000000 230.000000 241.000000 216.000000 200.000000 
+207.000000 204.000000 154.000000 73.000000 21.000000 10.000000 
+18.000000 22.000000 10.000000 8.000000 5.000000 5.000000 
+7.000000 9.000000 14.000000 21.000000 18.000000 16.000000 
+16.000000 10.000000 11.000000 10.000000 7.000000 15.000000 
+19.000000 13.000000 17.000000 32.000000 55.000000 78.000000 
+91.000000 89.000000 80.000000 72.000000 77.000000 98.000000 
+119.000000 124.000000 121.000000 125.000000 133.000000 136.000000 
+134.000000 135.000000 137.000000 133.000000 125.000000 123.000000 
+125.000000 126.000000 121.000000 116.000000 117.000000 120.000000 
+136.000000 131.000000 127.000000 127.000000 130.000000 133.000000 
+135.000000 135.000000 132.000000 127.000000 121.000000 114.000000 
+107.000000 105.000000 109.000000 107.000000 101.000000 132.000000 
+199.000000 233.000000 220.000000 197.000000 194.000000 200.000000 
+180.000000 126.000000 75.000000 46.000000 28.000000 22.000000 
+17.000000 10.000000 10.000000 10.000000 7.000000 22.000000 
+29.000000 31.000000 25.000000 13.000000 18.000000 18.000000 
+10.000000 10.000000 11.000000 13.000000 11.000000 14.000000 
+34.000000 55.000000 68.000000 77.000000 80.000000 80.000000 
+73.000000 66.000000 73.000000 94.000000 111.000000 116.000000 
+118.000000 121.000000 123.000000 127.000000 135.000000 140.000000 
+135.000000 124.000000 120.000000 123.000000 126.000000 124.000000 
+120.000000 119.000000 120.000000 120.000000 129.000000 121.000000 
+118.000000 124.000000 133.000000 140.000000 138.000000 130.000000 
+122.000000 122.000000 126.000000 125.000000 112.000000 96.000000 
+90.000000 89.000000 87.000000 102.000000 157.000000 208.000000 
+221.000000 217.000000 222.000000 234.000000 225.000000 185.000000 
+134.000000 94.000000 62.000000 48.000000 44.000000 28.000000 
+17.000000 12.000000 8.000000 22.000000 24.000000 13.000000 
+15.000000 12.000000 14.000000 17.000000 11.000000 10.000000 
+13.000000 14.000000 20.000000 40.000000 56.000000 59.000000 
+62.000000 68.000000 75.000000 81.000000 81.000000 78.000000 
+80.000000 89.000000 100.000000 113.000000 125.000000 128.000000 
+127.000000 129.000000 136.000000 137.000000 127.000000 117.000000 
+116.000000 120.000000 123.000000 124.000000 126.000000 126.000000 
+121.000000 117.000000 117.000000 114.000000 118.000000 128.000000 
+140.000000 147.000000 144.000000 131.000000 119.000000 120.000000 
+133.000000 141.000000 126.000000 97.000000 79.000000 79.000000 
+81.000000 82.000000 112.000000 169.000000 219.000000 248.000000 
+267.000000 288.000000 284.000000 232.000000 161.000000 105.000000 
+77.000000 87.000000 94.000000 79.000000 56.000000 44.000000 
+47.000000 55.000000 50.000000 24.000000 14.000000 11.000000 
+6.000000 14.000000 11.000000 10.000000 12.000000 22.000000 
+33.000000 44.000000 54.000000 53.000000 49.000000 56.000000 
+73.000000 89.000000 94.000000 89.000000 83.000000 86.000000 
+98.000000 115.000000 126.000000 128.000000 127.000000 130.000000 
+134.000000 134.000000 129.000000 125.000000 121.000000 119.000000 
+121.000000 127.000000 130.000000 124.000000 116.000000 113.000000 
+120.000000 120.000000 125.000000 132.000000 138.000000 142.000000 
+139.000000 128.000000 119.000000 121.000000 136.000000 148.000000 
+140.000000 115.000000 91.000000 82.000000 83.000000 84.000000 
+94.000000 134.000000 197.000000 260.000000 308.000000 331.000000 
+310.000000 243.000000 167.000000 111.000000 87.000000 103.000000 
+117.000000 117.000000 104.000000 92.000000 95.000000 107.000000 
+110.000000 90.000000 60.000000 36.000000 14.000000 25.000000 
+14.000000 12.000000 19.000000 15.000000 21.000000 24.000000 
+34.000000 52.000000 62.000000 66.000000 71.000000 78.000000 
+85.000000 86.000000 82.000000 81.000000 91.000000 107.000000 
+120.000000 123.000000 122.000000 121.000000 123.000000 129.000000 
+135.000000 135.000000 130.000000 125.000000 127.000000 131.000000 
+132.000000 126.000000 117.000000 113.000000 129.000000 124.000000 
+125.000000 131.000000 137.000000 139.000000 134.000000 127.000000 
+122.000000 126.000000 137.000000 145.000000 141.000000 125.000000 
+104.000000 87.000000 81.000000 88.000000 103.000000 131.000000 
+180.000000 246.000000 310.000000 333.000000 291.000000 204.000000 
+133.000000 109.000000 97.000000 99.000000 106.000000 115.000000 
+117.000000 108.000000 96.000000 92.000000 100.000000 109.000000 
+109.000000 91.000000 57.000000 42.000000 32.000000 27.000000 
+15.000000 26.000000 80.000000 116.000000 108.000000 88.000000 
+85.000000 88.000000 85.000000 78.000000 72.000000 76.000000 
+86.000000 95.000000 104.000000 117.000000 127.000000 130.000000 
+126.000000 125.000000 131.000000 137.000000 138.000000 135.000000 
+133.000000 134.000000 136.000000 133.000000 129.000000 126.000000 
+123.000000 119.000000 136.000000 127.000000 127.000000 133.000000 
+138.000000 136.000000 130.000000 125.000000 123.000000 126.000000 
+132.000000 138.000000 137.000000 125.000000 108.000000 94.000000 
+86.000000 81.000000 84.000000 110.000000 163.000000 221.000000 
+260.000000 259.000000 213.000000 138.000000 90.000000 89.000000 
+89.000000 89.000000 97.000000 109.000000 115.000000 106.000000 
+89.000000 81.000000 85.000000 90.000000 86.000000 79.000000 
+73.000000 55.000000 56.000000 68.000000 70.000000 149.000000 
+278.000000 342.000000 281.000000 158.000000 90.000000 89.000000 
+102.000000 98.000000 83.000000 77.000000 88.000000 103.000000 
+118.000000 129.000000 130.000000 123.000000 120.000000 127.000000 
+137.000000 140.000000 137.000000 136.000000 140.000000 142.000000 
+139.000000 132.000000 129.000000 130.000000 131.000000 127.000000 
+136.000000 134.000000 134.000000 134.000000 134.000000 131.000000 
+128.000000 125.000000 122.000000 124.000000 131.000000 137.000000 
+134.000000 123.000000 114.000000 109.000000 98.000000 78.000000 
+63.000000 86.000000 157.000000 220.000000 230.000000 191.000000 
+128.000000 73.000000 61.000000 70.000000 70.000000 74.000000 
+91.000000 104.000000 98.000000 82.000000 74.000000 82.000000 
+89.000000 79.000000 57.000000 43.000000 46.000000 51.000000 
+59.000000 97.000000 182.000000 302.000000 408.000000 431.000000 
+348.000000 218.000000 130.000000 103.000000 104.000000 108.000000 
+106.000000 97.000000 94.000000 107.000000 125.000000 129.000000 
+118.000000 114.000000 124.000000 135.000000 132.000000 123.000000 
+126.000000 136.000000 142.000000 138.000000 131.000000 128.000000 
+130.000000 133.000000 133.000000 130.000000 126.000000 130.000000 
+134.000000 136.000000 138.000000 136.000000 132.000000 126.000000 
+125.000000 130.000000 136.000000 138.000000 134.000000 128.000000 
+120.000000 108.000000 96.000000 101.000000 128.000000 187.000000 
+260.000000 280.000000 232.000000 163.000000 103.000000 54.000000 
+41.000000 39.000000 35.000000 42.000000 65.000000 74.000000 
+67.000000 65.000000 68.000000 65.000000 57.000000 49.000000 
+46.000000 47.000000 44.000000 38.000000 47.000000 103.000000 
+224.000000 349.000000 404.000000 377.000000 306.000000 237.000000 
+175.000000 124.000000 98.000000 99.000000 105.000000 99.000000 
+98.000000 111.000000 127.000000 128.000000 123.000000 128.000000 
+138.000000 138.000000 129.000000 125.000000 131.000000 137.000000 
+134.000000 126.000000 123.000000 125.000000 127.000000 125.000000 
+121.000000 122.000000 125.000000 130.000000 135.000000 136.000000 
+134.000000 131.000000 129.000000 129.000000 130.000000 133.000000 
+134.000000 132.000000 133.000000 129.000000 108.000000 84.000000 
+91.000000 148.000000 244.000000 329.000000 362.000000 322.000000 
+236.000000 167.000000 118.000000 62.000000 29.000000 16.000000 
+13.000000 18.000000 31.000000 32.000000 47.000000 69.000000 
+73.000000 62.000000 47.000000 28.000000 19.000000 37.000000 
+48.000000 50.000000 58.000000 99.000000 198.000000 314.000000 
+384.000000 388.000000 337.000000 246.000000 150.000000 94.000000 
+88.000000 102.000000 107.000000 107.000000 115.000000 126.000000 
+125.000000 120.000000 122.000000 133.000000 139.000000 138.000000 
+138.000000 142.000000 143.000000 134.000000 122.000000 117.000000 
+117.000000 118.000000 117.000000 118.000000 122.000000 129.000000 
+122.000000 124.000000 126.000000 127.000000 128.000000 131.000000 
+133.000000 134.000000 131.000000 126.000000 122.000000 127.000000 
+136.000000 128.000000 99.000000 80.000000 108.000000 198.000000 
+314.000000 382.000000 371.000000 306.000000 225.000000 163.000000 
+112.000000 59.000000 26.000000 24.000000 28.000000 17.000000 
+14.000000 17.000000 36.000000 45.000000 44.000000 51.000000 
+57.000000 43.000000 24.000000 34.000000 49.000000 57.000000 
+61.000000 74.000000 143.000000 254.000000 339.000000 350.000000 
+287.000000 191.000000 115.000000 91.000000 100.000000 111.000000 
+112.000000 116.000000 125.000000 131.000000 124.000000 115.000000 
+114.000000 123.000000 131.000000 135.000000 138.000000 142.000000 
+142.000000 135.000000 125.000000 120.000000 121.000000 124.000000 
+124.000000 123.000000 127.000000 134.000000 120.000000 120.000000 
+123.000000 127.000000 132.000000 134.000000 133.000000 133.000000 
+132.000000 127.000000 121.000000 123.000000 132.000000 128.000000 
+98.000000 77.000000 110.000000 207.000000 316.000000 371.000000 
+364.000000 310.000000 229.000000 144.000000 80.000000 48.000000 
+40.000000 41.000000 38.000000 30.000000 36.000000 48.000000 
+39.000000 24.000000 26.000000 45.000000 60.000000 59.000000 
+47.000000 40.000000 47.000000 57.000000 68.000000 81.000000 
+115.000000 172.000000 212.000000 191.000000 132.000000 92.000000 
+91.000000 105.000000 108.000000 102.000000 105.000000 122.000000 
+135.000000 133.000000 125.000000 122.000000 125.000000 126.000000 
+128.000000 133.000000 136.000000 136.000000 132.000000 129.000000 
+126.000000 122.000000 123.000000 126.000000 124.000000 119.000000 
+121.000000 131.000000 116.000000 115.000000 120.000000 125.000000 
+129.000000 129.000000 130.000000 132.000000 136.000000 136.000000 
+131.000000 129.000000 131.000000 129.000000 107.000000 80.000000 
+89.000000 147.000000 229.000000 293.000000 310.000000 272.000000 
+192.000000 101.000000 41.000000 19.000000 29.000000 49.000000 
+57.000000 63.000000 70.000000 66.000000 47.000000 31.000000 
+25.000000 28.000000 44.000000 61.000000 67.000000 55.000000 
+42.000000 48.000000 74.000000 98.000000 97.000000 94.000000 
+100.000000 95.000000 79.000000 76.000000 88.000000 102.000000 
+105.000000 101.000000 110.000000 131.000000 142.000000 136.000000 
+126.000000 123.000000 124.000000 125.000000 128.000000 134.000000 
+137.000000 132.000000 124.000000 121.000000 121.000000 119.000000 
+117.000000 118.000000 120.000000 119.000000 121.000000 128.000000 
+127.000000 123.000000 120.000000 120.000000 121.000000 125.000000 
+132.000000 136.000000 136.000000 133.000000 134.000000 139.000000 
+138.000000 127.000000 109.000000 90.000000 85.000000 95.000000 
+128.000000 179.000000 209.000000 185.000000 118.000000 55.000000 
+28.000000 25.000000 37.000000 55.000000 71.000000 82.000000 
+84.000000 74.000000 62.000000 53.000000 49.000000 49.000000 
+57.000000 72.000000 79.000000 69.000000 46.000000 29.000000 
+38.000000 69.000000 101.000000 114.000000 104.000000 86.000000 
+78.000000 83.000000 95.000000 106.000000 114.000000 120.000000 
+128.000000 134.000000 134.000000 129.000000 124.000000 119.000000 
+118.000000 123.000000 129.000000 133.000000 134.000000 134.000000 
+133.000000 129.000000 123.000000 120.000000 122.000000 123.000000 
+121.000000 120.000000 123.000000 128.000000 128.000000 127.000000 
+126.000000 123.000000 121.000000 122.000000 128.000000 135.000000 
+137.000000 131.000000 125.000000 129.000000 135.000000 128.000000 
+108.000000 93.000000 94.000000 105.000000 103.000000 90.000000 
+84.000000 81.000000 71.000000 59.000000 46.000000 46.000000 
+52.000000 54.000000 65.000000 84.000000 93.000000 85.000000 
+70.000000 66.000000 67.000000 66.000000 67.000000 68.000000 
+66.000000 60.000000 51.000000 42.000000 41.000000 53.000000 
+74.000000 99.000000 113.000000 108.000000 91.000000 82.000000 
+92.000000 111.000000 124.000000 125.000000 123.000000 127.000000 
+132.000000 131.000000 124.000000 117.000000 117.000000 122.000000 
+128.000000 131.000000 131.000000 128.000000 125.000000 121.000000 
+121.000000 124.000000 126.000000 124.000000 119.000000 118.000000 
+124.000000 131.000000 124.000000 123.000000 123.000000 122.000000 
+123.000000 128.000000 135.000000 139.000000 138.000000 131.000000 
+126.000000 127.000000 130.000000 124.000000 107.000000 90.000000 
+83.000000 88.000000 95.000000 99.000000 101.000000 104.000000 
+98.000000 79.000000 60.000000 55.000000 66.000000 79.000000 
+82.000000 85.000000 86.000000 78.000000 59.000000 47.000000 
+51.000000 67.000000 80.000000 71.000000 51.000000 39.000000 
+35.000000 35.000000 37.000000 43.000000 58.000000 82.000000 
+105.000000 113.000000 105.000000 98.000000 104.000000 118.000000 
+125.000000 121.000000 118.000000 125.000000 133.000000 133.000000 
+125.000000 119.000000 119.000000 124.000000 128.000000 129.000000 
+129.000000 126.000000 123.000000 123.000000 125.000000 128.000000 
+128.000000 125.000000 123.000000 124.000000 128.000000 131.000000 
+129.000000 123.000000 123.000000 125.000000 129.000000 134.000000 
+138.000000 138.000000 133.000000 128.000000 130.000000 133.000000 
+130.000000 118.000000 105.000000 96.000000 94.000000 92.000000 
+90.000000 89.000000 91.000000 93.000000 90.000000 81.000000 
+77.000000 81.000000 87.000000 90.000000 91.000000 85.000000 
+89.000000 93.000000 80.000000 65.000000 62.000000 75.000000 
+92.000000 96.000000 84.000000 69.000000 62.000000 61.000000 
+61.000000 65.000000 74.000000 82.000000 88.000000 88.000000 
+85.000000 89.000000 103.000000 115.000000 120.000000 120.000000 
+121.000000 124.000000 126.000000 126.000000 127.000000 126.000000 
+123.000000 122.000000 125.000000 129.000000 130.000000 128.000000 
+125.000000 124.000000 123.000000 124.000000 124.000000 123.000000 
+122.000000 123.000000 126.000000 126.000000 129.000000 128.000000 
+128.000000 128.000000 128.000000 130.000000 133.000000 132.000000 
+128.000000 124.000000 127.000000 131.000000 128.000000 115.000000 
+98.000000 87.000000 87.000000 93.000000 98.000000 96.000000 
+90.000000 85.000000 83.000000 86.000000 95.000000 97.000000 
+77.000000 58.000000 85.000000 151.000000 226.000000 240.000000 
+164.000000 80.000000 47.000000 52.000000 63.000000 65.000000 
+69.000000 78.000000 83.000000 75.000000 67.000000 76.000000 
+95.000000 104.000000 101.000000 93.000000 88.000000 91.000000 
+103.000000 117.000000 123.000000 120.000000 115.000000 117.000000 
+124.000000 127.000000 124.000000 121.000000 122.000000 126.000000 
+130.000000 132.000000 131.000000 126.000000 119.000000 117.000000 
+119.000000 123.000000 125.000000 126.000000 127.000000 127.000000 
+122.000000 116.000000 128.000000 130.000000 132.000000 132.000000 
+131.000000 130.000000 132.000000 133.000000 132.000000 129.000000 
+127.000000 126.000000 120.000000 107.000000 90.000000 80.000000 
+84.000000 93.000000 97.000000 93.000000 90.000000 92.000000 
+95.000000 91.000000 86.000000 73.000000 45.000000 22.000000 
+57.000000 219.000000 416.000000 483.000000 361.000000 163.000000 
+59.000000 50.000000 65.000000 57.000000 46.000000 57.000000 
+77.000000 85.000000 84.000000 86.000000 92.000000 95.000000 
+92.000000 89.000000 86.000000 83.000000 87.000000 106.000000 
+128.000000 134.000000 130.000000 128.000000 131.000000 129.000000 
+120.000000 114.000000 117.000000 123.000000 130.000000 137.000000 
+142.000000 138.000000 127.000000 120.000000 121.000000 125.000000 
+124.000000 123.000000 126.000000 131.000000 128.000000 121.000000 
+126.000000 126.000000 131.000000 134.000000 130.000000 125.000000 
+125.000000 130.000000 128.000000 122.000000 120.000000 126.000000 
+127.000000 114.000000 94.000000 83.000000 86.000000 95.000000 
+103.000000 106.000000 104.000000 95.000000 82.000000 70.000000 
+59.000000 42.000000 27.000000 36.000000 93.000000 227.000000 
+359.000000 397.000000 317.000000 187.000000 89.000000 48.000000 
+49.000000 53.000000 49.000000 44.000000 48.000000 61.000000 
+77.000000 90.000000 101.000000 105.000000 101.000000 94.000000 
+93.000000 97.000000 101.000000 107.000000 122.000000 135.000000 
+138.000000 131.000000 121.000000 116.000000 116.000000 118.000000 
+120.000000 126.000000 133.000000 138.000000 137.000000 134.000000 
+130.000000 127.000000 123.000000 119.000000 118.000000 119.000000 
+123.000000 128.000000 131.000000 129.000000 123.000000 128.000000 
+132.000000 136.000000 137.000000 136.000000 132.000000 124.000000 
+121.000000 125.000000 133.000000 135.000000 123.000000 102.000000 
+87.000000 87.000000 94.000000 101.000000 109.000000 116.000000 
+116.000000 106.000000 90.000000 79.000000 74.000000 62.000000 
+44.000000 49.000000 98.000000 207.000000 297.000000 303.000000 
+234.000000 144.000000 75.000000 45.000000 49.000000 58.000000 
+55.000000 47.000000 50.000000 65.000000 79.000000 87.000000 
+96.000000 109.000000 114.000000 106.000000 90.000000 83.000000 
+88.000000 99.000000 112.000000 124.000000 128.000000 123.000000 
+119.000000 120.000000 124.000000 125.000000 125.000000 129.000000 
+134.000000 137.000000 135.000000 134.000000 133.000000 129.000000 
+123.000000 123.000000 131.000000 137.000000 135.000000 131.000000 
+129.000000 130.000000 131.000000 129.000000 126.000000 128.000000 
+135.000000 139.000000 134.000000 123.000000 117.000000 125.000000 
+137.000000 138.000000 119.000000 94.000000 83.000000 90.000000 
+103.000000 106.000000 100.000000 101.000000 111.000000 117.000000 
+110.000000 98.000000 91.000000 87.000000 82.000000 80.000000 
+91.000000 127.000000 162.000000 163.000000 131.000000 90.000000 
+58.000000 52.000000 63.000000 74.000000 75.000000 69.000000 
+64.000000 62.000000 64.000000 71.000000 83.000000 98.000000 
+105.000000 103.000000 99.000000 100.000000 99.000000 98.000000 
+100.000000 111.000000 121.000000 123.000000 119.000000 120.000000 
+126.000000 131.000000 132.000000 130.000000 130.000000 132.000000 
+137.000000 144.000000 145.000000 138.000000 127.000000 120.000000 
+118.000000 118.000000 119.000000 123.000000 129.000000 132.000000 
+140.000000 132.000000 126.000000 126.000000 130.000000 129.000000 
+121.000000 112.000000 109.000000 115.000000 122.000000 118.000000 
+104.000000 90.000000 84.000000 88.000000 96.000000 97.000000 
+92.000000 89.000000 93.000000 100.000000 108.000000 120.000000 
+131.000000 137.000000 138.000000 132.000000 124.000000 113.000000 
+104.000000 99.000000 91.000000 84.000000 83.000000 86.000000 
+90.000000 91.000000 95.000000 102.000000 103.000000 92.000000 
+76.000000 67.000000 72.000000 86.000000 96.000000 99.000000 
+101.000000 104.000000 104.000000 97.000000 92.000000 102.000000 
+116.000000 122.000000 122.000000 126.000000 132.000000 134.000000 
+131.000000 125.000000 123.000000 124.000000 128.000000 132.000000 
+134.000000 131.000000 125.000000 121.000000 123.000000 130.000000 
+134.000000 129.000000 121.000000 119.000000 130.000000 126.000000 
+126.000000 128.000000 131.000000 131.000000 125.000000 120.000000 
+121.000000 124.000000 122.000000 111.000000 100.000000 93.000000 
+94.000000 98.000000 104.000000 107.000000 104.000000 99.000000 
+101.000000 114.000000 133.000000 146.000000 148.000000 146.000000 
+143.000000 141.000000 140.000000 135.000000 124.000000 111.000000 
+104.000000 108.000000 116.000000 122.000000 123.000000 126.000000 
+135.000000 139.000000 133.000000 120.000000 111.000000 104.000000 
+95.000000 87.000000 87.000000 93.000000 101.000000 106.000000 
+106.000000 104.000000 101.000000 104.000000 114.000000 123.000000 
+128.000000 133.000000 133.000000 130.000000 127.000000 128.000000 
+132.000000 134.000000 130.000000 130.000000 134.000000 138.000000 
+133.000000 124.000000 121.000000 127.000000 130.000000 126.000000 
+123.000000 127.000000 124.000000 129.000000 133.000000 134.000000 
+130.000000 123.000000 117.000000 117.000000 122.000000 122.000000 
+113.000000 100.000000 97.000000 105.000000 112.000000 112.000000 
+110.000000 117.000000 128.000000 135.000000 137.000000 138.000000 
+141.000000 141.000000 139.000000 138.000000 140.000000 140.000000 
+137.000000 135.000000 135.000000 135.000000 132.000000 129.000000 
+129.000000 131.000000 128.000000 124.000000 125.000000 128.000000 
+129.000000 125.000000 126.000000 131.000000 129.000000 113.000000 
+95.000000 90.000000 98.000000 107.000000 112.000000 113.000000 
+111.000000 110.000000 110.000000 111.000000 115.000000 125.000000 
+132.000000 130.000000 127.000000 126.000000 128.000000 127.000000 
+124.000000 126.000000 130.000000 129.000000 124.000000 122.000000 
+129.000000 133.000000 128.000000 118.000000 115.000000 121.000000 
+133.000000 134.000000 134.000000 132.000000 128.000000 122.000000 
+118.000000 119.000000 121.000000 117.000000 106.000000 95.000000 
+93.000000 103.000000 117.000000 124.000000 123.000000 119.000000 
+119.000000 128.000000 141.000000 147.000000 148.000000 145.000000 
+142.000000 140.000000 141.000000 144.000000 144.000000 139.000000 
+132.000000 129.000000 130.000000 132.000000 132.000000 132.000000 
+131.000000 129.000000 127.000000 126.000000 129.000000 133.000000 
+135.000000 139.000000 140.000000 128.000000 106.000000 90.000000 
+97.000000 120.000000 137.000000 132.000000 110.000000 91.000000 
+84.000000 88.000000 103.000000 123.000000 132.000000 131.000000 
+127.000000 129.000000 131.000000 131.000000 131.000000 133.000000 
+131.000000 124.000000 120.000000 124.000000 129.000000 126.000000 
+118.000000 114.000000 117.000000 124.000000 126.000000 127.000000 
+128.000000 128.000000 124.000000 120.000000 120.000000 124.000000 
+122.000000 110.000000 97.000000 93.000000 96.000000 99.000000 
+99.000000 109.000000 135.000000 160.000000 164.000000 152.000000 
+138.000000 133.000000 135.000000 138.000000 138.000000 137.000000 
+138.000000 142.000000 144.000000 144.000000 140.000000 135.000000 
+128.000000 125.000000 126.000000 132.000000 136.000000 136.000000 
+133.000000 132.000000 132.000000 133.000000 134.000000 138.000000 
+142.000000 140.000000 130.000000 117.000000 108.000000 112.000000 
+121.000000 124.000000 113.000000 96.000000 91.000000 101.000000 
+116.000000 123.000000 121.000000 122.000000 128.000000 133.000000 
+131.000000 128.000000 128.000000 128.000000 125.000000 122.000000 
+128.000000 138.000000 140.000000 130.000000 119.000000 117.000000 
+125.000000 133.000000 125.000000 126.000000 126.000000 122.000000 
+119.000000 120.000000 123.000000 123.000000 113.000000 99.000000 
+91.000000 91.000000 92.000000 86.000000 84.000000 104.000000 
+144.000000 172.000000 168.000000 146.000000 129.000000 129.000000 
+134.000000 133.000000 130.000000 132.000000 138.000000 142.000000 
+140.000000 137.000000 135.000000 133.000000 130.000000 127.000000 
+128.000000 130.000000 129.000000 125.000000 124.000000 131.000000 
+138.000000 136.000000 129.000000 125.000000 128.000000 131.000000 
+128.000000 120.000000 111.000000 102.000000 96.000000 96.000000 
+97.000000 94.000000 91.000000 98.000000 111.000000 120.000000 
+124.000000 125.000000 128.000000 129.000000 129.000000 128.000000 
+131.000000 133.000000 132.000000 127.000000 125.000000 128.000000 
+131.000000 130.000000 129.000000 129.000000 132.000000 135.000000 
+114.000000 115.000000 121.000000 126.000000 123.000000 117.000000 
+115.000000 116.000000 110.000000 96.000000 85.000000 81.000000 
+74.000000 60.000000 61.000000 95.000000 139.000000 160.000000 
+149.000000 126.000000 119.000000 129.000000 137.000000 136.000000 
+133.000000 134.000000 140.000000 146.000000 149.000000 144.000000 
+133.000000 122.000000 121.000000 127.000000 133.000000 134.000000 
+131.000000 129.000000 127.000000 126.000000 126.000000 128.000000 
+133.000000 136.000000 137.000000 138.000000 139.000000 137.000000 
+126.000000 104.000000 78.000000 64.000000 68.000000 77.000000 
+79.000000 78.000000 84.000000 94.000000 106.000000 119.000000 
+128.000000 130.000000 127.000000 124.000000 123.000000 124.000000 
+125.000000 125.000000 128.000000 133.000000 134.000000 131.000000 
+130.000000 130.000000 130.000000 127.000000 122.000000 122.000000 
+119.000000 118.000000 120.000000 121.000000 116.000000 108.000000 
+100.000000 95.000000 91.000000 84.000000 72.000000 67.000000 
+89.000000 125.000000 149.000000 143.000000 122.000000 115.000000 
+127.000000 138.000000 136.000000 129.000000 127.000000 132.000000 
+137.000000 141.000000 143.000000 139.000000 133.000000 128.000000 
+131.000000 135.000000 136.000000 134.000000 134.000000 134.000000 
+131.000000 127.000000 127.000000 130.000000 130.000000 126.000000 
+124.000000 129.000000 138.000000 143.000000 136.000000 111.000000 
+74.000000 48.000000 50.000000 71.000000 84.000000 81.000000 
+76.000000 82.000000 97.000000 114.000000 120.000000 117.000000 
+116.000000 122.000000 128.000000 129.000000 125.000000 123.000000 
+127.000000 133.000000 135.000000 134.000000 133.000000 133.000000 
+129.000000 125.000000 125.000000 127.000000 129.000000 131.000000 
+133.000000 128.000000 116.000000 101.000000 92.000000 90.000000 
+88.000000 81.000000 76.000000 90.000000 123.000000 148.000000 
+153.000000 138.000000 122.000000 123.000000 130.000000 132.000000 
+128.000000 126.000000 129.000000 134.000000 137.000000 138.000000 
+137.000000 134.000000 132.000000 132.000000 135.000000 137.000000 
+136.000000 135.000000 137.000000 139.000000 138.000000 133.000000 
+128.000000 125.000000 125.000000 128.000000 132.000000 137.000000 
+142.000000 145.000000 143.000000 127.000000 95.000000 59.000000 
+42.000000 52.000000 73.000000 82.000000 81.000000 82.000000 
+90.000000 101.000000 108.000000 112.000000 115.000000 120.000000 
+124.000000 125.000000 123.000000 122.000000 124.000000 127.000000 
+129.000000 130.000000 131.000000 131.000000 128.000000 124.000000 
+125.000000 124.000000 127.000000 129.000000 128.000000 122.000000 
+114.000000 108.000000 102.000000 96.000000 87.000000 84.000000 
+102.000000 139.000000 168.000000 171.000000 152.000000 128.000000 
+119.000000 123.000000 125.000000 124.000000 125.000000 131.000000 
+136.000000 138.000000 139.000000 141.000000 141.000000 137.000000 
+133.000000 133.000000 134.000000 134.000000 133.000000 133.000000 
+133.000000 133.000000 130.000000 128.000000 127.000000 128.000000 
+129.000000 128.000000 130.000000 137.000000 147.000000 154.000000 
+150.000000 134.000000 107.000000 73.000000 48.000000 47.000000 
+69.000000 92.000000 97.000000 89.000000 81.000000 86.000000 
+99.000000 107.000000 108.000000 110.000000 115.000000 120.000000 
+124.000000 129.000000 134.000000 136.000000 135.000000 134.000000 
+134.000000 134.000000 131.000000 127.000000 121.000000 120.000000 
+124.000000 129.000000 123.000000 109.000000 94.000000 87.000000 
+88.000000 89.000000 91.000000 107.000000 139.000000 166.000000 
+170.000000 152.000000 131.000000 121.000000 125.000000 129.000000 
+127.000000 125.000000 128.000000 134.000000 136.000000 135.000000 
+136.000000 140.000000 144.000000 145.000000 143.000000 140.000000 
+137.000000 135.000000 135.000000 135.000000 134.000000 130.000000 
+127.000000 125.000000 126.000000 130.000000 135.000000 137.000000 
+135.000000 138.000000 147.000000 155.000000 149.000000 129.000000 
+102.000000 73.000000 52.000000 50.000000 72.000000 102.000000 
+111.000000 97.000000 81.000000 82.000000 93.000000 97.000000 
+93.000000 91.000000 95.000000 102.000000 109.000000 117.000000 
+125.000000 131.000000 132.000000 131.000000 129.000000 124.000000 
+121.000000 119.000000 128.000000 141.000000 145.000000 136.000000 
+118.000000 96.000000 77.000000 69.000000 76.000000 89.000000 
+104.000000 124.000000 147.000000 161.000000 153.000000 133.000000 
+122.000000 127.000000 136.000000 134.000000 126.000000 122.000000 
+125.000000 130.000000 131.000000 132.000000 136.000000 139.000000 
+138.000000 138.000000 140.000000 141.000000 138.000000 137.000000 
+139.000000 139.000000 135.000000 127.000000 122.000000 120.000000 
+121.000000 125.000000 130.000000 132.000000 129.000000 130.000000 
+140.000000 151.000000 150.000000 133.000000 108.000000 83.000000 
+60.000000 49.000000 62.000000 92.000000 110.000000 99.000000 
+75.000000 67.000000 73.000000 74.000000 73.000000 78.000000 
+86.000000 92.000000 98.000000 106.000000 117.000000 130.000000 
+139.000000 139.000000 132.000000 122.000000 118.000000 120.000000 
+128.000000 138.000000 136.000000 118.000000 93.000000 71.000000 
+60.000000 66.000000 86.000000 106.000000 115.000000 115.000000 
+122.000000 139.000000 149.000000 142.000000 131.000000 129.000000 
+134.000000 135.000000 129.000000 127.000000 131.000000 134.000000 
+131.000000 129.000000 132.000000 139.000000 142.000000 141.000000 
+140.000000 140.000000 139.000000 136.000000 133.000000 131.000000 
+129.000000 128.000000 129.000000 130.000000 130.000000 132.000000 
+135.000000 136.000000 133.000000 129.000000 132.000000 142.000000 
+151.000000 143.000000 117.000000 83.000000 58.000000 53.000000 
+67.000000 89.000000 101.000000 92.000000 79.000000 78.000000 
+79.000000 68.000000 57.000000 61.000000 64.000000 58.000000 
+59.000000 81.000000 110.000000 130.000000 136.000000 133.000000 
+127.000000 121.000000 119.000000 123.000000 129.000000 116.000000 
+98.000000 88.000000 84.000000 77.000000 70.000000 76.000000 
+96.000000 115.000000 119.000000 117.000000 118.000000 128.000000 
+137.000000 137.000000 134.000000 136.000000 139.000000 136.000000 
+131.000000 130.000000 130.000000 128.000000 125.000000 125.000000 
+130.000000 134.000000 134.000000 132.000000 130.000000 131.000000 
+132.000000 132.000000 131.000000 130.000000 129.000000 127.000000 
+125.000000 124.000000 124.000000 124.000000 124.000000 125.000000 
+128.000000 132.000000 134.000000 139.000000 144.000000 142.000000 
+122.000000 86.000000 52.000000 42.000000 58.000000 85.000000 
+102.000000 106.000000 106.000000 107.000000 98.000000 79.000000 
+65.000000 64.000000 61.000000 49.000000 42.000000 52.000000 
+84.000000 118.000000 137.000000 141.000000 137.000000 127.000000 
+120.000000 123.000000 131.000000 133.000000 130.000000 126.000000 
+126.000000 124.000000 119.000000 120.000000 123.000000 117.000000 
+103.000000 100.000000 100.000000 92.000000 68.000000 46.000000 
+47.000000 43.000000 25.000000 13.000000 11.000000 11.000000 
+9.000000 10.000000 13.000000 12.000000 12.000000 11.000000 
+7.000000 7.000000 11.000000 12.000000 7.000000 7.000000 
+8.000000 9.000000 9.000000 6.000000 6.000000 9.000000 
+18.000000 27.000000 24.000000 15.000000 15.000000 15.000000 
+10.000000 10.000000 9.000000 10.000000 14.000000 17.000000 
+14.000000 28.000000 53.000000 63.000000 44.000000 18.000000 
+19.000000 30.000000 24.000000 15.000000 29.000000 40.000000 
+28.000000 15.000000 12.000000 11.000000 12.000000 16.000000 
+25.000000 34.000000 38.000000 39.000000 42.000000 48.000000 
+128.000000 135.000000 138.000000 135.000000 132.000000 131.000000 
+128.000000 120.000000 111.000000 108.000000 108.000000 105.000000 
+97.000000 86.000000 75.000000 65.000000 55.000000 41.000000 
+21.000000 6.000000 6.000000 9.000000 12.000000 15.000000 
+16.000000 13.000000 11.000000 10.000000 10.000000 12.000000 
+12.000000 10.000000 6.000000 8.000000 11.000000 12.000000 
+12.000000 12.000000 12.000000 6.000000 12.000000 22.000000 
+20.000000 10.000000 11.000000 10.000000 10.000000 10.000000 
+8.000000 9.000000 11.000000 14.000000 14.000000 28.000000 
+61.000000 81.000000 68.000000 46.000000 47.000000 48.000000 
+31.000000 14.000000 13.000000 19.000000 17.000000 17.000000 
+29.000000 48.000000 65.000000 79.000000 92.000000 104.000000 
+110.000000 109.000000 104.000000 102.000000 133.000000 140.000000 
+139.000000 132.000000 128.000000 133.000000 140.000000 142.000000 
+132.000000 115.000000 104.000000 102.000000 104.000000 103.000000 
+97.000000 84.000000 64.000000 42.000000 22.000000 11.000000 
+9.000000 9.000000 11.000000 11.000000 11.000000 8.000000 
+10.000000 13.000000 15.000000 15.000000 12.000000 8.000000 
+8.000000 9.000000 11.000000 14.000000 15.000000 13.000000 
+9.000000 7.000000 11.000000 24.000000 29.000000 19.000000 
+11.000000 8.000000 6.000000 5.000000 3.000000 4.000000 
+13.000000 21.000000 12.000000 31.000000 71.000000 88.000000 
+74.000000 67.000000 66.000000 47.000000 25.000000 11.000000 
+12.000000 20.000000 24.000000 41.000000 74.000000 102.000000 
+116.000000 125.000000 136.000000 146.000000 147.000000 139.000000 
+132.000000 126.000000 138.000000 141.000000 137.000000 129.000000 
+124.000000 127.000000 135.000000 140.000000 139.000000 129.000000 
+113.000000 104.000000 108.000000 109.000000 98.000000 86.000000 
+79.000000 59.000000 20.000000 0.000000 0.000000 5.000000 
+4.000000 15.000000 8.000000 2.000000 8.000000 9.000000 
+11.000000 11.000000 5.000000 5.000000 11.000000 9.000000 
+5.000000 9.000000 18.000000 18.000000 11.000000 9.000000 
+8.000000 18.000000 25.000000 18.000000 9.000000 6.000000 
+6.000000 6.000000 5.000000 10.000000 20.000000 14.000000 
+13.000000 43.000000 70.000000 69.000000 58.000000 64.000000 
+69.000000 51.000000 26.000000 14.000000 16.000000 25.000000 
+50.000000 93.000000 129.000000 136.000000 126.000000 125.000000 
+135.000000 144.000000 142.000000 134.000000 131.000000 131.000000 
+136.000000 132.000000 131.000000 133.000000 130.000000 123.000000 
+122.000000 132.000000 146.000000 147.000000 126.000000 100.000000 
+94.000000 98.000000 84.000000 61.000000 105.000000 193.000000 
+236.000000 200.000000 105.000000 32.000000 29.000000 21.000000 
+36.000000 25.000000 8.000000 2.000000 7.000000 10.000000 
+13.000000 9.000000 7.000000 13.000000 9.000000 5.000000 
+11.000000 12.000000 8.000000 6.000000 13.000000 19.000000 
+16.000000 13.000000 12.000000 11.000000 10.000000 8.000000 
+5.000000 10.000000 16.000000 11.000000 21.000000 47.000000 
+62.000000 61.000000 61.000000 73.000000 83.000000 76.000000 
+48.000000 33.000000 46.000000 72.000000 104.000000 131.000000 
+139.000000 133.000000 127.000000 129.000000 130.000000 128.000000 
+126.000000 127.000000 127.000000 125.000000 142.000000 136.000000 
+130.000000 132.000000 134.000000 127.000000 121.000000 128.000000 
+142.000000 149.000000 140.000000 119.000000 101.000000 98.000000 
+95.000000 82.000000 122.000000 268.000000 413.000000 413.000000 
+246.000000 55.000000 39.000000 30.000000 38.000000 56.000000 
+30.000000 12.000000 17.000000 15.000000 22.000000 30.000000 
+16.000000 10.000000 19.000000 15.000000 11.000000 13.000000 
+12.000000 11.000000 16.000000 15.000000 14.000000 14.000000 
+11.000000 13.000000 19.000000 17.000000 6.000000 5.000000 
+6.000000 12.000000 28.000000 46.000000 60.000000 69.000000 
+74.000000 80.000000 84.000000 76.000000 62.000000 72.000000 
+102.000000 123.000000 126.000000 124.000000 123.000000 121.000000 
+119.000000 121.000000 126.000000 130.000000 130.000000 127.000000 
+121.000000 117.000000 136.000000 135.000000 129.000000 126.000000 
+127.000000 129.000000 131.000000 132.000000 133.000000 135.000000 
+138.000000 140.000000 130.000000 106.000000 90.000000 113.000000 
+180.000000 277.000000 375.000000 395.000000 294.000000 130.000000 
+33.000000 30.000000 28.000000 48.000000 57.000000 39.000000 
+31.000000 24.000000 21.000000 28.000000 23.000000 13.000000 
+21.000000 21.000000 13.000000 12.000000 15.000000 15.000000 
+11.000000 12.000000 10.000000 10.000000 13.000000 18.000000 
+22.000000 19.000000 12.000000 10.000000 4.000000 9.000000 
+32.000000 58.000000 69.000000 67.000000 64.000000 70.000000 
+76.000000 74.000000 77.000000 99.000000 118.000000 119.000000 
+114.000000 119.000000 125.000000 124.000000 121.000000 126.000000 
+136.000000 141.000000 140.000000 138.000000 134.000000 127.000000 
+126.000000 132.000000 130.000000 123.000000 121.000000 125.000000 
+128.000000 131.000000 137.000000 141.000000 140.000000 135.000000 
+125.000000 98.000000 70.000000 110.000000 235.000000 340.000000 
+411.000000 441.000000 387.000000 247.000000 87.000000 33.000000 
+30.000000 26.000000 35.000000 28.000000 22.000000 23.000000 
+19.000000 27.000000 30.000000 16.000000 14.000000 17.000000 
+12.000000 14.000000 20.000000 17.000000 8.000000 16.000000 
+15.000000 11.000000 13.000000 12.000000 13.000000 14.000000 
+14.000000 14.000000 9.000000 13.000000 38.000000 71.000000 
+85.000000 77.000000 67.000000 69.000000 80.000000 91.000000 
+104.000000 116.000000 117.000000 112.000000 113.000000 121.000000 
+128.000000 129.000000 130.000000 132.000000 133.000000 131.000000 
+131.000000 136.000000 138.000000 135.000000 115.000000 125.000000 
+132.000000 132.000000 128.000000 126.000000 128.000000 134.000000 
+142.000000 144.000000 132.000000 115.000000 105.000000 93.000000 
+74.000000 110.000000 260.000000 403.000000 477.000000 482.000000 
+415.000000 279.000000 135.000000 45.000000 28.000000 26.000000 
+31.000000 25.000000 33.000000 53.000000 45.000000 27.000000 
+25.000000 14.000000 13.000000 17.000000 25.000000 28.000000 
+20.000000 19.000000 13.000000 19.000000 20.000000 13.000000 
+7.000000 15.000000 20.000000 14.000000 8.000000 9.000000 
+10.000000 15.000000 35.000000 68.000000 98.000000 105.000000 
+94.000000 85.000000 89.000000 104.000000 120.000000 129.000000 
+127.000000 120.000000 116.000000 120.000000 127.000000 133.000000 
+132.000000 129.000000 128.000000 129.000000 130.000000 132.000000 
+137.000000 141.000000 115.000000 123.000000 131.000000 134.000000 
+133.000000 135.000000 141.000000 142.000000 138.000000 130.000000 
+119.000000 112.000000 109.000000 101.000000 87.000000 116.000000 
+232.000000 347.000000 389.000000 386.000000 361.000000 286.000000 
+175.000000 78.000000 34.000000 22.000000 36.000000 35.000000 
+35.000000 59.000000 53.000000 28.000000 23.000000 22.000000 
+20.000000 14.000000 20.000000 21.000000 11.000000 14.000000 
+16.000000 17.000000 11.000000 11.000000 12.000000 24.000000 
+23.000000 12.000000 4.000000 4.000000 9.000000 29.000000 
+61.000000 92.000000 109.000000 105.000000 91.000000 87.000000 
+99.000000 117.000000 131.000000 135.000000 130.000000 122.000000 
+119.000000 121.000000 124.000000 127.000000 130.000000 133.000000 
+132.000000 128.000000 127.000000 133.000000 141.000000 144.000000 
+128.000000 131.000000 130.000000 126.000000 126.000000 134.000000 
+142.000000 141.000000 136.000000 130.000000 121.000000 114.000000 
+111.000000 105.000000 98.000000 118.000000 195.000000 275.000000 
+298.000000 298.000000 322.000000 313.000000 235.000000 124.000000 
+44.000000 20.000000 19.000000 24.000000 22.000000 35.000000 
+31.000000 21.000000 24.000000 30.000000 31.000000 16.000000 
+10.000000 11.000000 12.000000 15.000000 13.000000 12.000000 
+7.000000 7.000000 11.000000 16.000000 14.000000 12.000000 
+9.000000 12.000000 24.000000 50.000000 84.000000 107.000000 
+107.000000 93.000000 82.000000 85.000000 100.000000 118.000000 
+130.000000 134.000000 132.000000 132.000000 132.000000 128.000000 
+123.000000 124.000000 130.000000 131.000000 125.000000 118.000000 
+121.000000 131.000000 137.000000 135.000000 135.000000 139.000000 
+136.000000 127.000000 123.000000 130.000000 139.000000 137.000000 
+132.000000 129.000000 123.000000 111.000000 102.000000 99.000000 
+100.000000 115.000000 173.000000 241.000000 257.000000 247.000000 
+280.000000 317.000000 285.000000 182.000000 71.000000 24.000000 
+26.000000 30.000000 28.000000 23.000000 18.000000 17.000000 
+19.000000 24.000000 33.000000 19.000000 8.000000 13.000000 
+19.000000 21.000000 16.000000 12.000000 13.000000 14.000000 
+10.000000 15.000000 17.000000 13.000000 10.000000 21.000000 
+45.000000 73.000000 95.000000 104.000000 99.000000 88.000000 
+81.000000 82.000000 96.000000 115.000000 129.000000 132.000000 
+131.000000 132.000000 131.000000 127.000000 126.000000 132.000000 
+136.000000 131.000000 123.000000 123.000000 130.000000 133.000000 
+128.000000 124.000000 135.000000 139.000000 139.000000 131.000000 
+123.000000 127.000000 136.000000 137.000000 131.000000 129.000000 
+125.000000 112.000000 96.000000 92.000000 99.000000 111.000000 
+149.000000 205.000000 219.000000 196.000000 207.000000 268.000000 
+302.000000 253.000000 141.000000 47.000000 30.000000 36.000000 
+31.000000 15.000000 7.000000 14.000000 15.000000 13.000000 
+22.000000 23.000000 21.000000 14.000000 15.000000 22.000000 
+17.000000 9.000000 12.000000 14.000000 9.000000 11.000000 
+17.000000 17.000000 16.000000 25.000000 51.000000 84.000000 
+102.000000 99.000000 86.000000 76.000000 73.000000 80.000000 
+97.000000 118.000000 132.000000 136.000000 135.000000 131.000000 
+126.000000 123.000000 127.000000 131.000000 130.000000 128.000000 
+130.000000 137.000000 138.000000 130.000000 121.000000 119.000000 
+129.000000 134.000000 134.000000 127.000000 121.000000 126.000000 
+138.000000 142.000000 136.000000 132.000000 129.000000 117.000000 
+99.000000 91.000000 95.000000 101.000000 121.000000 173.000000 
+207.000000 189.000000 168.000000 203.000000 266.000000 280.000000 
+213.000000 112.000000 61.000000 55.000000 45.000000 26.000000 
+14.000000 4.000000 8.000000 7.000000 17.000000 31.000000 
+38.000000 29.000000 15.000000 19.000000 18.000000 10.000000 
+9.000000 8.000000 11.000000 14.000000 16.000000 24.000000 
+32.000000 37.000000 55.000000 80.000000 90.000000 80.000000 
+66.000000 63.000000 73.000000 89.000000 103.000000 115.000000 
+128.000000 139.000000 141.000000 134.000000 127.000000 126.000000 
+129.000000 127.000000 123.000000 123.000000 127.000000 131.000000 
+131.000000 129.000000 129.000000 129.000000 124.000000 124.000000 
+123.000000 123.000000 125.000000 131.000000 138.000000 141.000000 
+137.000000 131.000000 127.000000 118.000000 105.000000 95.000000 
+94.000000 94.000000 104.000000 147.000000 197.000000 203.000000 
+176.000000 172.000000 215.000000 258.000000 244.000000 183.000000 
+130.000000 107.000000 85.000000 71.000000 69.000000 46.000000 
+31.000000 33.000000 51.000000 52.000000 27.000000 21.000000 
+23.000000 15.000000 10.000000 9.000000 11.000000 12.000000 
+15.000000 17.000000 17.000000 29.000000 44.000000 49.000000 
+60.000000 81.000000 90.000000 81.000000 70.000000 70.000000 
+81.000000 96.000000 108.000000 117.000000 127.000000 133.000000 
+134.000000 131.000000 133.000000 135.000000 132.000000 124.000000 
+120.000000 122.000000 123.000000 123.000000 125.000000 132.000000 
+138.000000 136.000000 123.000000 118.000000 119.000000 125.000000 
+130.000000 134.000000 138.000000 139.000000 136.000000 129.000000 
+123.000000 119.000000 113.000000 106.000000 100.000000 93.000000 
+93.000000 121.000000 173.000000 203.000000 193.000000 170.000000 
+183.000000 233.000000 261.000000 232.000000 174.000000 130.000000 
+110.000000 123.000000 133.000000 111.000000 84.000000 88.000000 
+109.000000 108.000000 71.000000 43.000000 29.000000 16.000000 
+11.000000 6.000000 8.000000 7.000000 5.000000 17.000000 
+25.000000 32.000000 52.000000 61.000000 65.000000 77.000000 
+81.000000 82.000000 90.000000 96.000000 94.000000 94.000000 
+105.000000 121.000000 127.000000 123.000000 122.000000 128.000000 
+137.000000 137.000000 130.000000 122.000000 117.000000 114.000000 
+113.000000 117.000000 125.000000 133.000000 136.000000 133.000000 
+126.000000 121.000000 120.000000 125.000000 132.000000 140.000000 
+145.000000 141.000000 131.000000 124.000000 126.000000 130.000000 
+122.000000 107.000000 95.000000 83.000000 73.000000 90.000000 
+144.000000 199.000000 213.000000 191.000000 189.000000 248.000000 
+303.000000 281.000000 202.000000 137.000000 118.000000 138.000000 
+152.000000 145.000000 133.000000 140.000000 164.000000 178.000000 
+159.000000 102.000000 37.000000 23.000000 27.000000 23.000000 
+12.000000 20.000000 31.000000 38.000000 45.000000 40.000000 
+55.000000 74.000000 73.000000 65.000000 63.000000 78.000000 
+95.000000 92.000000 78.000000 75.000000 90.000000 112.000000 
+123.000000 123.000000 123.000000 127.000000 134.000000 137.000000 
+133.000000 126.000000 120.000000 116.000000 113.000000 117.000000 
+127.000000 135.000000 133.000000 125.000000 127.000000 121.000000 
+118.000000 124.000000 136.000000 143.000000 139.000000 131.000000 
+124.000000 124.000000 129.000000 131.000000 122.000000 106.000000 
+90.000000 76.000000 65.000000 73.000000 112.000000 178.000000 
+224.000000 235.000000 238.000000 278.000000 324.000000 303.000000 
+218.000000 141.000000 116.000000 129.000000 150.000000 159.000000 
+156.000000 159.000000 178.000000 199.000000 198.000000 160.000000 
+99.000000 66.000000 52.000000 57.000000 48.000000 33.000000 
+56.000000 43.000000 32.000000 43.000000 49.000000 63.000000 
+65.000000 55.000000 61.000000 83.000000 89.000000 75.000000 
+59.000000 63.000000 84.000000 109.000000 127.000000 134.000000 
+132.000000 130.000000 134.000000 139.000000 139.000000 134.000000 
+130.000000 128.000000 125.000000 124.000000 127.000000 132.000000 
+127.000000 116.000000 135.000000 131.000000 129.000000 132.000000 
+138.000000 139.000000 134.000000 127.000000 125.000000 129.000000 
+134.000000 137.000000 135.000000 123.000000 102.000000 79.000000 
+65.000000 68.000000 87.000000 137.000000 211.000000 269.000000 
+295.000000 305.000000 302.000000 265.000000 204.000000 145.000000 
+118.000000 123.000000 138.000000 149.000000 153.000000 148.000000 
+142.000000 147.000000 164.000000 177.000000 171.000000 155.000000 
+128.000000 99.000000 88.000000 66.000000 69.000000 51.000000 
+89.000000 160.000000 157.000000 107.000000 72.000000 70.000000 
+84.000000 87.000000 76.000000 67.000000 68.000000 82.000000 
+104.000000 124.000000 134.000000 130.000000 123.000000 123.000000 
+128.000000 132.000000 136.000000 140.000000 141.000000 136.000000 
+129.000000 126.000000 126.000000 124.000000 119.000000 115.000000 
+145.000000 139.000000 137.000000 135.000000 132.000000 131.000000 
+134.000000 138.000000 137.000000 136.000000 140.000000 147.000000 
+148.000000 139.000000 119.000000 96.000000 75.000000 65.000000 
+75.000000 120.000000 195.000000 270.000000 316.000000 320.000000 
+277.000000 204.000000 156.000000 142.000000 131.000000 125.000000 
+125.000000 132.000000 137.000000 130.000000 117.000000 113.000000 
+121.000000 138.000000 164.000000 187.000000 174.000000 111.000000 
+80.000000 97.000000 125.000000 175.000000 286.000000 360.000000 
+307.000000 176.000000 97.000000 95.000000 109.000000 96.000000 
+70.000000 65.000000 85.000000 110.000000 125.000000 130.000000 
+126.000000 120.000000 121.000000 129.000000 136.000000 137.000000 
+137.000000 138.000000 138.000000 137.000000 137.000000 137.000000 
+133.000000 127.000000 122.000000 122.000000 146.000000 142.000000 
+139.000000 135.000000 133.000000 133.000000 135.000000 136.000000 
+132.000000 132.000000 138.000000 146.000000 144.000000 136.000000 
+126.000000 110.000000 82.000000 55.000000 67.000000 143.000000 
+238.000000 302.000000 319.000000 301.000000 248.000000 167.000000 
+109.000000 109.000000 121.000000 125.000000 127.000000 124.000000 
+114.000000 104.000000 107.000000 121.000000 130.000000 133.000000 
+142.000000 153.000000 136.000000 83.000000 55.000000 93.000000 
+201.000000 331.000000 404.000000 392.000000 305.000000 199.000000 
+135.000000 106.000000 94.000000 90.000000 89.000000 92.000000 
+104.000000 123.000000 136.000000 132.000000 123.000000 122.000000 
+130.000000 136.000000 136.000000 135.000000 136.000000 136.000000 
+134.000000 133.000000 135.000000 134.000000 130.000000 127.000000 
+127.000000 126.000000 130.000000 136.000000 142.000000 141.000000 
+138.000000 138.000000 137.000000 132.000000 126.000000 128.000000 
+135.000000 139.000000 137.000000 132.000000 122.000000 103.000000 
+82.000000 80.000000 120.000000 213.000000 308.000000 343.000000 
+309.000000 251.000000 199.000000 141.000000 91.000000 82.000000 
+96.000000 108.000000 116.000000 115.000000 107.000000 104.000000 
+111.000000 124.000000 135.000000 142.000000 144.000000 135.000000 
+101.000000 64.000000 59.000000 116.000000 242.000000 359.000000 
+400.000000 369.000000 307.000000 238.000000 167.000000 113.000000 
+96.000000 106.000000 115.000000 113.000000 115.000000 129.000000 
+138.000000 134.000000 124.000000 122.000000 128.000000 132.000000 
+135.000000 137.000000 137.000000 132.000000 127.000000 125.000000 
+126.000000 125.000000 124.000000 125.000000 127.000000 129.000000 
+117.000000 126.000000 135.000000 138.000000 136.000000 135.000000 
+136.000000 134.000000 130.000000 129.000000 129.000000 129.000000 
+134.000000 135.000000 118.000000 90.000000 84.000000 130.000000 
+222.000000 311.000000 353.000000 331.000000 257.000000 182.000000 
+134.000000 91.000000 65.000000 60.000000 60.000000 72.000000 
+86.000000 99.000000 111.000000 122.000000 133.000000 144.000000 
+147.000000 138.000000 122.000000 103.000000 79.000000 68.000000 
+73.000000 109.000000 200.000000 313.000000 388.000000 391.000000 
+324.000000 215.000000 125.000000 93.000000 106.000000 121.000000 
+120.000000 117.000000 124.000000 131.000000 131.000000 126.000000 
+126.000000 131.000000 138.000000 143.000000 144.000000 141.000000 
+133.000000 125.000000 120.000000 117.000000 116.000000 117.000000 
+120.000000 123.000000 128.000000 134.000000 118.000000 119.000000 
+125.000000 133.000000 137.000000 137.000000 136.000000 137.000000 
+137.000000 131.000000 123.000000 120.000000 128.000000 131.000000 
+114.000000 90.000000 97.000000 158.000000 263.000000 346.000000 
+362.000000 317.000000 241.000000 166.000000 106.000000 55.000000 
+27.000000 27.000000 36.000000 51.000000 68.000000 86.000000 
+107.000000 124.000000 130.000000 123.000000 101.000000 73.000000 
+57.000000 60.000000 66.000000 68.000000 71.000000 94.000000 
+164.000000 264.000000 330.000000 321.000000 245.000000 151.000000 
+92.000000 83.000000 101.000000 117.000000 121.000000 123.000000 
+128.000000 132.000000 128.000000 120.000000 116.000000 123.000000 
+134.000000 143.000000 144.000000 139.000000 129.000000 121.000000 
+115.000000 115.000000 120.000000 125.000000 126.000000 125.000000 
+128.000000 134.000000 118.000000 120.000000 126.000000 132.000000 
+134.000000 133.000000 132.000000 135.000000 138.000000 134.000000 
+125.000000 122.000000 128.000000 129.000000 106.000000 82.000000 
+95.000000 161.000000 254.000000 320.000000 330.000000 291.000000 
+224.000000 146.000000 80.000000 40.000000 22.000000 20.000000 
+31.000000 43.000000 61.000000 82.000000 92.000000 86.000000 
+73.000000 61.000000 49.000000 34.000000 25.000000 34.000000 
+55.000000 62.000000 64.000000 81.000000 134.000000 199.000000 
+219.000000 176.000000 112.000000 83.000000 89.000000 102.000000 
+109.000000 113.000000 120.000000 129.000000 131.000000 127.000000 
+123.000000 120.000000 120.000000 124.000000 133.000000 141.000000 
+142.000000 137.000000 131.000000 126.000000 122.000000 120.000000 
+121.000000 124.000000 123.000000 122.000000 126.000000 135.000000 
+122.000000 122.000000 125.000000 129.000000 132.000000 131.000000 
+129.000000 128.000000 130.000000 130.000000 128.000000 129.000000 
+132.000000 129.000000 108.000000 83.000000 84.000000 121.000000 
+184.000000 247.000000 274.000000 250.000000 185.000000 110.000000 
+59.000000 41.000000 48.000000 62.000000 66.000000 60.000000 
+56.000000 54.000000 49.000000 38.000000 35.000000 46.000000 
+59.000000 65.000000 50.000000 26.000000 24.000000 35.000000 
+58.000000 84.000000 103.000000 121.000000 124.000000 98.000000 
+67.000000 59.000000 75.000000 96.000000 105.000000 107.000000 
+117.000000 133.000000 138.000000 129.000000 119.000000 117.000000 
+121.000000 127.000000 134.000000 139.000000 140.000000 136.000000 
+131.000000 130.000000 129.000000 128.000000 125.000000 121.000000 
+119.000000 121.000000 129.000000 135.000000 119.000000 119.000000 
+124.000000 130.000000 132.000000 131.000000 132.000000 135.000000 
+134.000000 129.000000 124.000000 125.000000 130.000000 129.000000 
+118.000000 101.000000 92.000000 101.000000 127.000000 166.000000 
+192.000000 177.000000 127.000000 77.000000 54.000000 54.000000 
+63.000000 75.000000 87.000000 92.000000 81.000000 58.000000 
+41.000000 35.000000 37.000000 41.000000 47.000000 59.000000 
+66.000000 52.000000 29.000000 24.000000 44.000000 74.000000 
+96.000000 106.000000 108.000000 102.000000 90.000000 77.000000 
+81.000000 99.000000 114.000000 118.000000 121.000000 128.000000 
+134.000000 133.000000 128.000000 124.000000 125.000000 129.000000 
+133.000000 136.000000 136.000000 134.000000 129.000000 125.000000 
+123.000000 123.000000 121.000000 119.000000 119.000000 123.000000 
+128.000000 132.000000 120.000000 118.000000 121.000000 127.000000 
+133.000000 136.000000 137.000000 135.000000 132.000000 129.000000 
+129.000000 132.000000 137.000000 136.000000 122.000000 104.000000 
+98.000000 113.000000 125.000000 117.000000 101.000000 87.000000 
+76.000000 68.000000 67.000000 74.000000 83.000000 90.000000 
+92.000000 91.000000 87.000000 78.000000 61.000000 46.000000 
+41.000000 44.000000 49.000000 54.000000 56.000000 53.000000 
+44.000000 37.000000 41.000000 55.000000 74.000000 93.000000 
+106.000000 108.000000 96.000000 81.000000 81.000000 98.000000 
+113.000000 119.000000 123.000000 130.000000 134.000000 130.000000 
+126.000000 127.000000 131.000000 129.000000 126.000000 127.000000 
+131.000000 131.000000 126.000000 122.000000 123.000000 123.000000 
+121.000000 121.000000 123.000000 127.000000 130.000000 133.000000 
+124.000000 123.000000 124.000000 128.000000 131.000000 133.000000 
+135.000000 136.000000 133.000000 128.000000 125.000000 132.000000 
+139.000000 135.000000 119.000000 103.000000 98.000000 101.000000 
+101.000000 96.000000 91.000000 89.000000 88.000000 85.000000 
+83.000000 86.000000 92.000000 89.000000 76.000000 69.000000 
+75.000000 79.000000 65.000000 42.000000 34.000000 50.000000 
+67.000000 64.000000 50.000000 44.000000 47.000000 51.000000 
+51.000000 55.000000 72.000000 95.000000 108.000000 102.000000 
+87.000000 79.000000 85.000000 101.000000 111.000000 114.000000 
+120.000000 129.000000 132.000000 129.000000 124.000000 124.000000 
+127.000000 128.000000 125.000000 125.000000 127.000000 130.000000 
+131.000000 129.000000 127.000000 126.000000 126.000000 125.000000 
+125.000000 127.000000 130.000000 131.000000 127.000000 126.000000 
+128.000000 131.000000 131.000000 131.000000 132.000000 133.000000 
+131.000000 126.000000 125.000000 131.000000 136.000000 131.000000 
+118.000000 103.000000 93.000000 86.000000 82.000000 80.000000 
+80.000000 78.000000 75.000000 79.000000 89.000000 96.000000 
+88.000000 74.000000 78.000000 91.000000 106.000000 108.000000 
+86.000000 63.000000 57.000000 63.000000 75.000000 83.000000 
+83.000000 78.000000 73.000000 69.000000 64.000000 63.000000 
+77.000000 97.000000 107.000000 102.000000 92.000000 88.000000 
+94.000000 106.000000 115.000000 120.000000 124.000000 125.000000 
+124.000000 124.000000 124.000000 123.000000 124.000000 127.000000 
+129.000000 128.000000 126.000000 127.000000 128.000000 127.000000 
+126.000000 128.000000 131.000000 129.000000 125.000000 123.000000 
+124.000000 124.000000 123.000000 127.000000 131.000000 133.000000 
+135.000000 134.000000 130.000000 126.000000 123.000000 122.000000 
+120.000000 120.000000 125.000000 125.000000 113.000000 95.000000 
+86.000000 89.000000 93.000000 88.000000 82.000000 80.000000 
+84.000000 89.000000 97.000000 99.000000 79.000000 50.000000 
+66.000000 136.000000 228.000000 263.000000 193.000000 92.000000 
+46.000000 45.000000 54.000000 56.000000 62.000000 74.000000 
+81.000000 79.000000 79.000000 88.000000 97.000000 93.000000 
+85.000000 85.000000 91.000000 96.000000 101.000000 112.000000 
+122.000000 124.000000 123.000000 126.000000 132.000000 131.000000 
+124.000000 120.000000 122.000000 127.000000 128.000000 127.000000 
+127.000000 126.000000 124.000000 122.000000 124.000000 127.000000 
+128.000000 127.000000 123.000000 120.000000 121.000000 124.000000 
+132.000000 134.000000 137.000000 139.000000 139.000000 135.000000 
+129.000000 127.000000 127.000000 128.000000 126.000000 126.000000 
+127.000000 125.000000 113.000000 97.000000 91.000000 95.000000 
+98.000000 96.000000 95.000000 100.000000 102.000000 92.000000 
+77.000000 61.000000 35.000000 18.000000 51.000000 205.000000 
+406.000000 489.000000 380.000000 181.000000 67.000000 53.000000 
+69.000000 58.000000 38.000000 38.000000 59.000000 77.000000 
+86.000000 96.000000 107.000000 108.000000 98.000000 87.000000 
+83.000000 85.000000 91.000000 104.000000 120.000000 127.000000 
+129.000000 131.000000 133.000000 129.000000 120.000000 116.000000 
+120.000000 126.000000 129.000000 133.000000 135.000000 132.000000 
+125.000000 117.000000 116.000000 118.000000 120.000000 120.000000 
+122.000000 123.000000 123.000000 122.000000 134.000000 131.000000 
+133.000000 134.000000 129.000000 121.000000 121.000000 129.000000 
+134.000000 130.000000 125.000000 126.000000 127.000000 118.000000 
+104.000000 94.000000 92.000000 95.000000 103.000000 111.000000 
+114.000000 108.000000 95.000000 79.000000 63.000000 45.000000 
+36.000000 51.000000 108.000000 230.000000 354.000000 398.000000 
+333.000000 214.000000 107.000000 56.000000 54.000000 57.000000 
+54.000000 46.000000 47.000000 59.000000 74.000000 89.000000 
+101.000000 107.000000 102.000000 89.000000 82.000000 88.000000 
+99.000000 108.000000 116.000000 123.000000 127.000000 128.000000 
+125.000000 120.000000 119.000000 122.000000 128.000000 132.000000 
+137.000000 138.000000 136.000000 129.000000 121.000000 117.000000 
+119.000000 122.000000 120.000000 117.000000 118.000000 126.000000 
+130.000000 125.000000 133.000000 129.000000 126.000000 126.000000 
+127.000000 128.000000 128.000000 129.000000 128.000000 126.000000 
+127.000000 129.000000 126.000000 111.000000 92.000000 82.000000 
+85.000000 92.000000 99.000000 111.000000 120.000000 120.000000 
+106.000000 89.000000 76.000000 62.000000 51.000000 53.000000 
+88.000000 191.000000 286.000000 302.000000 240.000000 152.000000 
+82.000000 44.000000 42.000000 52.000000 53.000000 46.000000 
+44.000000 56.000000 73.000000 87.000000 95.000000 103.000000 
+106.000000 100.000000 94.000000 96.000000 102.000000 105.000000 
+109.000000 118.000000 130.000000 135.000000 130.000000 123.000000 
+124.000000 130.000000 132.000000 130.000000 130.000000 132.000000 
+133.000000 128.000000 121.000000 117.000000 116.000000 118.000000 
+121.000000 122.000000 121.000000 119.000000 119.000000 121.000000 
+138.000000 137.000000 130.000000 123.000000 121.000000 124.000000 
+128.000000 129.000000 128.000000 130.000000 134.000000 132.000000 
+117.000000 94.000000 79.000000 82.000000 93.000000 100.000000 
+98.000000 96.000000 103.000000 112.000000 113.000000 110.000000 
+107.000000 103.000000 90.000000 78.000000 78.000000 106.000000 
+142.000000 149.000000 122.000000 83.000000 55.000000 47.000000 
+55.000000 64.000000 69.000000 70.000000 69.000000 64.000000 
+60.000000 62.000000 74.000000 90.000000 100.000000 100.000000 
+97.000000 95.000000 96.000000 98.000000 104.000000 115.000000 
+124.000000 126.000000 123.000000 124.000000 128.000000 132.000000 
+132.000000 132.000000 133.000000 130.000000 125.000000 124.000000 
+133.000000 140.000000 136.000000 126.000000 119.000000 120.000000 
+126.000000 132.000000 135.000000 132.000000 143.000000 138.000000 
+130.000000 124.000000 123.000000 126.000000 125.000000 121.000000 
+123.000000 131.000000 135.000000 124.000000 105.000000 91.000000 
+91.000000 94.000000 95.000000 96.000000 100.000000 101.000000 
+96.000000 95.000000 112.000000 136.000000 149.000000 147.000000 
+141.000000 139.000000 136.000000 122.000000 101.000000 84.000000 
+75.000000 74.000000 78.000000 87.000000 96.000000 103.000000 
+109.000000 112.000000 110.000000 100.000000 88.000000 79.000000 
+76.000000 79.000000 87.000000 99.000000 113.000000 120.000000 
+113.000000 97.000000 92.000000 103.000000 120.000000 130.000000 
+134.000000 135.000000 135.000000 133.000000 131.000000 130.000000 
+130.000000 128.000000 127.000000 129.000000 130.000000 128.000000 
+124.000000 122.000000 127.000000 133.000000 132.000000 125.000000 
+120.000000 121.000000 131.000000 127.000000 126.000000 128.000000 
+128.000000 126.000000 124.000000 122.000000 119.000000 118.000000 
+118.000000 113.000000 100.000000 88.000000 88.000000 103.000000 
+118.000000 120.000000 111.000000 103.000000 107.000000 122.000000 
+138.000000 146.000000 146.000000 142.000000 140.000000 143.000000 
+145.000000 140.000000 127.000000 115.000000 110.000000 112.000000 
+119.000000 126.000000 129.000000 130.000000 129.000000 127.000000 
+125.000000 123.000000 120.000000 114.000000 107.000000 101.000000 
+101.000000 105.000000 111.000000 114.000000 112.000000 103.000000 
+93.000000 94.000000 108.000000 123.000000 130.000000 128.000000 
+126.000000 130.000000 136.000000 138.000000 136.000000 130.000000 
+124.000000 120.000000 120.000000 125.000000 131.000000 133.000000 
+130.000000 126.000000 122.000000 119.000000 120.000000 122.000000 
+130.000000 129.000000 128.000000 128.000000 129.000000 128.000000 
+124.000000 121.000000 121.000000 123.000000 124.000000 117.000000 
+101.000000 86.000000 86.000000 100.000000 117.000000 124.000000 
+122.000000 120.000000 123.000000 128.000000 136.000000 144.000000 
+146.000000 145.000000 144.000000 146.000000 147.000000 144.000000 
+139.000000 135.000000 131.000000 127.000000 125.000000 129.000000 
+133.000000 134.000000 129.000000 125.000000 124.000000 125.000000 
+128.000000 133.000000 133.000000 121.000000 102.000000 91.000000 
+94.000000 103.000000 107.000000 102.000000 96.000000 97.000000 
+107.000000 120.000000 129.000000 132.000000 130.000000 129.000000 
+130.000000 133.000000 134.000000 133.000000 131.000000 132.000000 
+132.000000 130.000000 127.000000 124.000000 125.000000 126.000000 
+124.000000 119.000000 116.000000 121.000000 131.000000 131.000000 
+131.000000 134.000000 133.000000 126.000000 117.000000 118.000000 
+126.000000 128.000000 117.000000 101.000000 90.000000 87.000000 
+89.000000 99.000000 122.000000 152.000000 165.000000 155.000000 
+141.000000 136.000000 140.000000 142.000000 138.000000 135.000000 
+139.000000 147.000000 151.000000 150.000000 146.000000 142.000000 
+136.000000 129.000000 126.000000 125.000000 124.000000 120.000000 
+120.000000 128.000000 133.000000 131.000000 130.000000 136.000000 
+145.000000 137.000000 112.000000 94.000000 100.000000 117.000000 
+119.000000 104.000000 91.000000 94.000000 106.000000 118.000000 
+126.000000 131.000000 131.000000 128.000000 128.000000 133.000000 
+139.000000 141.000000 137.000000 133.000000 131.000000 128.000000 
+125.000000 124.000000 125.000000 127.000000 127.000000 124.000000 
+123.000000 124.000000 124.000000 124.000000 126.000000 130.000000 
+131.000000 125.000000 115.000000 113.000000 118.000000 118.000000 
+108.000000 98.000000 97.000000 95.000000 86.000000 88.000000 
+116.000000 155.000000 170.000000 152.000000 127.000000 121.000000 
+131.000000 136.000000 130.000000 126.000000 133.000000 143.000000 
+148.000000 147.000000 140.000000 131.000000 125.000000 126.000000 
+128.000000 126.000000 121.000000 122.000000 130.000000 137.000000 
+135.000000 130.000000 129.000000 135.000000 141.000000 138.000000 
+125.000000 111.000000 107.000000 118.000000 125.000000 114.000000 
+94.000000 90.000000 101.000000 116.000000 126.000000 130.000000 
+134.000000 136.000000 133.000000 131.000000 132.000000 136.000000 
+136.000000 131.000000 126.000000 127.000000 128.000000 127.000000 
+124.000000 125.000000 127.000000 127.000000 126.000000 129.000000 
+121.000000 123.000000 127.000000 127.000000 123.000000 120.000000 
+123.000000 127.000000 122.000000 107.000000 95.000000 96.000000 
+101.000000 98.000000 86.000000 84.000000 103.000000 127.000000 
+135.000000 129.000000 125.000000 130.000000 133.000000 131.000000 
+131.000000 136.000000 142.000000 143.000000 141.000000 139.000000 
+134.000000 125.000000 119.000000 122.000000 129.000000 132.000000 
+131.000000 132.000000 134.000000 133.000000 131.000000 129.000000 
+129.000000 129.000000 130.000000 136.000000 141.000000 137.000000 
+123.000000 115.000000 117.000000 113.000000 94.000000 80.000000 
+85.000000 104.000000 121.000000 125.000000 124.000000 123.000000 
+124.000000 127.000000 133.000000 136.000000 134.000000 130.000000 
+131.000000 133.000000 133.000000 128.000000 123.000000 122.000000 
+123.000000 127.000000 132.000000 137.000000 121.000000 121.000000 
+124.000000 128.000000 128.000000 127.000000 128.000000 126.000000 
+116.000000 103.000000 98.000000 101.000000 99.000000 86.000000 
+74.000000 81.000000 101.000000 118.000000 128.000000 134.000000 
+138.000000 139.000000 135.000000 132.000000 133.000000 136.000000 
+140.000000 142.000000 142.000000 139.000000 132.000000 129.000000 
+132.000000 136.000000 136.000000 130.000000 126.000000 127.000000 
+129.000000 127.000000 123.000000 121.000000 123.000000 127.000000 
+131.000000 136.000000 144.000000 146.000000 134.000000 110.000000 
+93.000000 88.000000 87.000000 83.000000 84.000000 97.000000 
+115.000000 126.000000 126.000000 123.000000 124.000000 127.000000 
+129.000000 128.000000 130.000000 134.000000 136.000000 135.000000 
+134.000000 134.000000 134.000000 132.000000 133.000000 136.000000 
+137.000000 133.000000 126.000000 124.000000 121.000000 120.000000 
+123.000000 129.000000 132.000000 127.000000 114.000000 101.000000 
+95.000000 94.000000 93.000000 87.000000 86.000000 95.000000 
+111.000000 125.000000 134.000000 139.000000 138.000000 132.000000 
+128.000000 130.000000 135.000000 136.000000 135.000000 136.000000 
+137.000000 134.000000 127.000000 123.000000 128.000000 137.000000 
+140.000000 135.000000 129.000000 129.000000 130.000000 130.000000 
+126.000000 124.000000 126.000000 130.000000 134.000000 135.000000 
+138.000000 142.000000 139.000000 121.000000 96.000000 78.000000 
+72.000000 71.000000 72.000000 82.000000 99.000000 113.000000 
+118.000000 121.000000 128.000000 135.000000 134.000000 127.000000 
+124.000000 126.000000 129.000000 130.000000 130.000000 133.000000 
+135.000000 134.000000 133.000000 133.000000 135.000000 135.000000 
+127.000000 126.000000 123.000000 121.000000 127.000000 135.000000 
+132.000000 113.000000 95.000000 95.000000 106.000000 109.000000 
+95.000000 81.000000 87.000000 110.000000 128.000000 133.000000 
+134.000000 137.000000 138.000000 133.000000 127.000000 126.000000 
+129.000000 130.000000 130.000000 132.000000 136.000000 134.000000 
+128.000000 126.000000 132.000000 139.000000 139.000000 135.000000 
+131.000000 130.000000 129.000000 127.000000 124.000000 123.000000 
+125.000000 130.000000 135.000000 136.000000 136.000000 139.000000 
+143.000000 135.000000 108.000000 78.000000 62.000000 63.000000 
+69.000000 77.000000 89.000000 104.000000 114.000000 118.000000 
+119.000000 121.000000 124.000000 125.000000 125.000000 126.000000 
+128.000000 128.000000 127.000000 128.000000 130.000000 131.000000 
+128.000000 127.000000 126.000000 125.000000 123.000000 120.000000 
+118.000000 121.000000 130.000000 136.000000 129.000000 110.000000 
+95.000000 97.000000 108.000000 116.000000 117.000000 117.000000 
+120.000000 126.000000 127.000000 124.000000 127.000000 131.000000 
+130.000000 124.000000 122.000000 128.000000 134.000000 135.000000 
+134.000000 135.000000 136.000000 135.000000 132.000000 132.000000 
+137.000000 140.000000 139.000000 135.000000 130.000000 126.000000 
+123.000000 123.000000 125.000000 127.000000 129.000000 132.000000 
+132.000000 127.000000 125.000000 135.000000 152.000000 155.000000 
+128.000000 86.000000 59.000000 59.000000 69.000000 77.000000 
+88.000000 98.000000 106.000000 114.000000 123.000000 126.000000 
+121.000000 116.000000 116.000000 121.000000 128.000000 133.000000 
+132.000000 130.000000 130.000000 129.000000 127.000000 124.000000 
+122.000000 122.000000 127.000000 126.000000 124.000000 126.000000 
+129.000000 125.000000 115.000000 106.000000 104.000000 107.000000 
+119.000000 144.000000 171.000000 177.000000 163.000000 143.000000 
+125.000000 120.000000 124.000000 127.000000 124.000000 122.000000 
+124.000000 130.000000 135.000000 136.000000 136.000000 137.000000 
+139.000000 140.000000 138.000000 137.000000 138.000000 140.000000 
+139.000000 135.000000 130.000000 126.000000 123.000000 122.000000 
+125.000000 128.000000 130.000000 132.000000 136.000000 135.000000 
+126.000000 124.000000 142.000000 160.000000 148.000000 105.000000 
+60.000000 49.000000 66.000000 82.000000 88.000000 92.000000 
+102.000000 114.000000 118.000000 112.000000 108.000000 114.000000 
+126.000000 132.000000 133.000000 133.000000 132.000000 129.000000 
+126.000000 124.000000 121.000000 118.000000 116.000000 117.000000 
+117.000000 117.000000 119.000000 122.000000 121.000000 114.000000 
+103.000000 91.000000 81.000000 84.000000 117.000000 173.000000 
+207.000000 195.000000 158.000000 129.000000 119.000000 122.000000 
+123.000000 121.000000 123.000000 130.000000 135.000000 133.000000 
+128.000000 124.000000 123.000000 127.000000 134.000000 138.000000 
+136.000000 133.000000 137.000000 144.000000 146.000000 140.000000 
+134.000000 131.000000 130.000000 129.000000 130.000000 133.000000 
+134.000000 134.000000 137.000000 137.000000 131.000000 127.000000 
+139.000000 162.000000 163.000000 122.000000 68.000000 45.000000 
+59.000000 82.000000 90.000000 91.000000 95.000000 103.000000 
+109.000000 108.000000 105.000000 111.000000 124.000000 135.000000 
+136.000000 131.000000 124.000000 123.000000 127.000000 133.000000 
+134.000000 131.000000 128.000000 125.000000 114.000000 126.000000 
+135.000000 131.000000 118.000000 105.000000 93.000000 75.000000 
+61.000000 73.000000 120.000000 172.000000 191.000000 168.000000 
+135.000000 123.000000 128.000000 131.000000 125.000000 119.000000 
+123.000000 131.000000 134.000000 129.000000 124.000000 124.000000 
+130.000000 136.000000 138.000000 137.000000 135.000000 136.000000 
+137.000000 138.000000 136.000000 133.000000 130.000000 128.000000 
+128.000000 130.000000 134.000000 135.000000 133.000000 129.000000 
+130.000000 134.000000 137.000000 133.000000 137.000000 154.000000 
+160.000000 130.000000 76.000000 37.000000 40.000000 66.000000 
+83.000000 86.000000 90.000000 102.000000 108.000000 100.000000 
+97.000000 112.000000 130.000000 135.000000 130.000000 127.000000 
+131.000000 133.000000 131.000000 129.000000 128.000000 124.000000 
+119.000000 118.000000 116.000000 127.000000 136.000000 130.000000 
+112.000000 94.000000 81.000000 72.000000 71.000000 90.000000 
+118.000000 141.000000 147.000000 138.000000 127.000000 122.000000 
+121.000000 123.000000 127.000000 129.000000 131.000000 131.000000 
+131.000000 128.000000 126.000000 125.000000 126.000000 126.000000 
+126.000000 129.000000 134.000000 136.000000 135.000000 137.000000 
+143.000000 145.000000 138.000000 130.000000 126.000000 130.000000 
+134.000000 134.000000 131.000000 129.000000 129.000000 132.000000 
+136.000000 139.000000 138.000000 135.000000 130.000000 112.000000 
+78.000000 47.000000 39.000000 50.000000 67.000000 80.000000 
+90.000000 98.000000 101.000000 102.000000 106.000000 110.000000 
+116.000000 119.000000 113.000000 100.000000 105.000000 128.000000 
+143.000000 139.000000 124.000000 111.000000 110.000000 119.000000 
+121.000000 121.000000 120.000000 121.000000 126.000000 129.000000 
+126.000000 118.000000 109.000000 102.000000 95.000000 87.000000 
+83.000000 83.000000 74.000000 49.000000 30.000000 34.000000 
+33.000000 18.000000 16.000000 21.000000 20.000000 17.000000 
+16.000000 14.000000 14.000000 12.000000 10.000000 11.000000 
+11.000000 10.000000 7.000000 9.000000 10.000000 9.000000 
+6.000000 6.000000 6.000000 5.000000 7.000000 7.000000 
+11.000000 15.000000 16.000000 15.000000 12.000000 12.000000 
+12.000000 12.000000 15.000000 15.000000 14.000000 32.000000 
+56.000000 57.000000 26.000000 17.000000 30.000000 39.000000 
+35.000000 11.000000 16.000000 29.000000 22.000000 20.000000 
+24.000000 34.000000 49.000000 64.000000 77.000000 88.000000 
+101.000000 113.000000 121.000000 121.000000 121.000000 124.000000 
+127.000000 129.000000 132.000000 138.000000 141.000000 133.000000 
+116.000000 101.000000 97.000000 95.000000 89.000000 82.000000 
+78.000000 64.000000 35.000000 16.000000 20.000000 17.000000 
+13.000000 13.000000 13.000000 15.000000 19.000000 17.000000 
+12.000000 8.000000 8.000000 9.000000 10.000000 6.000000 
+9.000000 11.000000 13.000000 9.000000 6.000000 9.000000 
+8.000000 7.000000 12.000000 10.000000 15.000000 23.000000 
+24.000000 20.000000 12.000000 8.000000 10.000000 13.000000 
+15.000000 14.000000 22.000000 45.000000 61.000000 53.000000 
+27.000000 24.000000 47.000000 55.000000 32.000000 8.000000 
+10.000000 24.000000 27.000000 28.000000 40.000000 64.000000 
+86.000000 104.000000 117.000000 128.000000 138.000000 146.000000 
+150.000000 146.000000 131.000000 135.000000 133.000000 128.000000 
+126.000000 129.000000 133.000000 134.000000 128.000000 118.000000 
+110.000000 107.000000 105.000000 99.000000 87.000000 71.000000 
+47.000000 25.000000 18.000000 13.000000 5.000000 2.000000 
+11.000000 13.000000 11.000000 12.000000 8.000000 10.000000 
+12.000000 10.000000 6.000000 4.000000 6.000000 10.000000 
+11.000000 9.000000 9.000000 11.000000 7.000000 6.000000 
+10.000000 13.000000 20.000000 25.000000 24.000000 23.000000 
+23.000000 21.000000 15.000000 12.000000 12.000000 10.000000 
+21.000000 47.000000 65.000000 58.000000 46.000000 51.000000 
+58.000000 47.000000 22.000000 9.000000 9.000000 13.000000 
+19.000000 42.000000 82.000000 112.000000 124.000000 129.000000 
+133.000000 134.000000 131.000000 129.000000 131.000000 131.000000 
+135.000000 136.000000 130.000000 121.000000 119.000000 125.000000 
+135.000000 140.000000 137.000000 126.000000 111.000000 106.000000 
+112.000000 112.000000 95.000000 75.000000 68.000000 64.000000 
+50.000000 33.000000 19.000000 15.000000 16.000000 9.000000 
+7.000000 7.000000 9.000000 8.000000 10.000000 8.000000 
+6.000000 3.000000 3.000000 6.000000 5.000000 6.000000 
+9.000000 7.000000 8.000000 10.000000 9.000000 9.000000 
+11.000000 13.000000 16.000000 19.000000 19.000000 15.000000 
+12.000000 14.000000 11.000000 7.000000 29.000000 60.000000 
+73.000000 63.000000 55.000000 63.000000 72.000000 68.000000 
+52.000000 35.000000 30.000000 38.000000 62.000000 100.000000 
+130.000000 137.000000 126.000000 119.000000 124.000000 131.000000 
+131.000000 126.000000 121.000000 120.000000 124.000000 127.000000 
+131.000000 130.000000 121.000000 115.000000 122.000000 139.000000 
+147.000000 137.000000 110.000000 90.000000 90.000000 95.000000 
+80.000000 64.000000 103.000000 185.000000 249.000000 232.000000 
+132.000000 32.000000 7.000000 17.000000 30.000000 21.000000 
+9.000000 11.000000 18.000000 13.000000 7.000000 9.000000 
+8.000000 9.000000 11.000000 8.000000 12.000000 12.000000 
+7.000000 9.000000 11.000000 10.000000 5.000000 5.000000 
+9.000000 9.000000 6.000000 5.000000 4.000000 11.000000 
+17.000000 25.000000 45.000000 65.000000 72.000000 70.000000 
+71.000000 75.000000 81.000000 83.000000 70.000000 56.000000 
+71.000000 108.000000 135.000000 139.000000 131.000000 124.000000 
+122.000000 123.000000 126.000000 130.000000 134.000000 133.000000 
+125.000000 116.000000 125.000000 128.000000 134.000000 138.000000 
+129.000000 114.000000 110.000000 123.000000 137.000000 133.000000 
+115.000000 96.000000 87.000000 85.000000 74.000000 72.000000 
+136.000000 273.000000 403.000000 420.000000 304.000000 141.000000 
+44.000000 22.000000 37.000000 45.000000 32.000000 24.000000 
+25.000000 16.000000 14.000000 22.000000 11.000000 18.000000 
+24.000000 15.000000 16.000000 19.000000 10.000000 13.000000 
+19.000000 10.000000 8.000000 7.000000 8.000000 12.000000 
+17.000000 19.000000 13.000000 12.000000 18.000000 30.000000 
+48.000000 65.000000 77.000000 83.000000 84.000000 81.000000 
+80.000000 78.000000 69.000000 74.000000 105.000000 133.000000 
+140.000000 135.000000 128.000000 124.000000 124.000000 127.000000 
+129.000000 131.000000 132.000000 133.000000 129.000000 122.000000 
+130.000000 132.000000 134.000000 133.000000 129.000000 121.000000 
+112.000000 105.000000 108.000000 117.000000 125.000000 123.000000 
+105.000000 81.000000 71.000000 101.000000 175.000000 302.000000 
+444.000000 508.000000 420.000000 228.000000 61.000000 44.000000 
+59.000000 47.000000 18.000000 17.000000 18.000000 13.000000 
+16.000000 24.000000 7.000000 18.000000 28.000000 26.000000 
+17.000000 14.000000 9.000000 14.000000 17.000000 10.000000 
+9.000000 8.000000 14.000000 22.000000 24.000000 20.000000 
+14.000000 7.000000 15.000000 29.000000 46.000000 69.000000 
+87.000000 93.000000 91.000000 88.000000 83.000000 78.000000 
+82.000000 104.000000 124.000000 126.000000 122.000000 126.000000 
+132.000000 130.000000 126.000000 128.000000 131.000000 130.000000 
+128.000000 131.000000 135.000000 134.000000 133.000000 136.000000 
+133.000000 130.000000 128.000000 125.000000 117.000000 114.000000 
+120.000000 130.000000 134.000000 125.000000 99.000000 63.000000 
+60.000000 129.000000 267.000000 429.000000 549.000000 540.000000 
+378.000000 160.000000 27.000000 44.000000 62.000000 53.000000 
+32.000000 13.000000 33.000000 41.000000 24.000000 12.000000 
+9.000000 15.000000 23.000000 26.000000 16.000000 12.000000 
+6.000000 10.000000 4.000000 12.000000 18.000000 15.000000 
+15.000000 16.000000 17.000000 15.000000 12.000000 6.000000 
+13.000000 35.000000 56.000000 79.000000 99.000000 108.000000 
+105.000000 95.000000 84.000000 82.000000 96.000000 116.000000 
+125.000000 122.000000 119.000000 121.000000 123.000000 125.000000 
+129.000000 134.000000 137.000000 134.000000 130.000000 131.000000 
+137.000000 139.000000 128.000000 132.000000 133.000000 133.000000 
+130.000000 124.000000 122.000000 129.000000 140.000000 141.000000 
+128.000000 106.000000 79.000000 54.000000 57.000000 149.000000 
+343.000000 494.000000 508.000000 395.000000 236.000000 112.000000 
+49.000000 40.000000 31.000000 52.000000 66.000000 25.000000 
+42.000000 65.000000 49.000000 24.000000 10.000000 10.000000 
+15.000000 11.000000 13.000000 17.000000 7.000000 15.000000 
+16.000000 19.000000 23.000000 15.000000 7.000000 9.000000 
+20.000000 30.000000 32.000000 23.000000 19.000000 34.000000 
+63.000000 94.000000 114.000000 113.000000 95.000000 75.000000 
+73.000000 88.000000 107.000000 119.000000 123.000000 122.000000 
+122.000000 127.000000 134.000000 136.000000 132.000000 132.000000 
+136.000000 137.000000 132.000000 129.000000 135.000000 141.000000 
+132.000000 137.000000 134.000000 126.000000 122.000000 127.000000 
+134.000000 138.000000 139.000000 136.000000 122.000000 98.000000 
+77.000000 73.000000 89.000000 151.000000 272.000000 360.000000 
+346.000000 279.000000 228.000000 177.000000 109.000000 55.000000 
+19.000000 29.000000 48.000000 28.000000 26.000000 49.000000 
+51.000000 36.000000 18.000000 15.000000 16.000000 11.000000 
+10.000000 18.000000 19.000000 19.000000 24.000000 16.000000 
+9.000000 7.000000 14.000000 20.000000 23.000000 30.000000 
+37.000000 39.000000 34.000000 37.000000 65.000000 103.000000 
+121.000000 105.000000 75.000000 62.000000 72.000000 94.000000 
+113.000000 124.000000 126.000000 121.000000 122.000000 133.000000 
+142.000000 138.000000 132.000000 135.000000 140.000000 138.000000 
+131.000000 131.000000 138.000000 141.000000 138.000000 139.000000 
+128.000000 117.000000 123.000000 138.000000 145.000000 141.000000 
+135.000000 131.000000 121.000000 101.000000 84.000000 83.000000 
+100.000000 135.000000 187.000000 237.000000 262.000000 281.000000 
+302.000000 268.000000 176.000000 89.000000 44.000000 31.000000 
+34.000000 28.000000 22.000000 28.000000 23.000000 19.000000 
+22.000000 25.000000 19.000000 15.000000 8.000000 18.000000 
+23.000000 14.000000 12.000000 10.000000 6.000000 5.000000 
+16.000000 23.000000 24.000000 27.000000 38.000000 54.000000 
+50.000000 48.000000 73.000000 105.000000 109.000000 88.000000 
+69.000000 68.000000 82.000000 103.000000 124.000000 134.000000 
+130.000000 122.000000 124.000000 132.000000 134.000000 131.000000 
+131.000000 136.000000 138.000000 134.000000 131.000000 134.000000 
+136.000000 134.000000 122.000000 123.000000 123.000000 129.000000 
+140.000000 144.000000 136.000000 124.000000 125.000000 133.000000 
+130.000000 111.000000 89.000000 81.000000 90.000000 119.000000 
+158.000000 193.000000 225.000000 271.000000 331.000000 344.000000 
+269.000000 150.000000 70.000000 46.000000 39.000000 29.000000 
+20.000000 16.000000 14.000000 10.000000 15.000000 22.000000 
+18.000000 17.000000 18.000000 20.000000 16.000000 12.000000 
+13.000000 12.000000 13.000000 16.000000 19.000000 21.000000 
+24.000000 28.000000 43.000000 62.000000 62.000000 66.000000 
+90.000000 108.000000 98.000000 76.000000 65.000000 74.000000 
+96.000000 120.000000 134.000000 134.000000 129.000000 129.000000 
+134.000000 136.000000 134.000000 131.000000 130.000000 129.000000 
+129.000000 130.000000 131.000000 128.000000 128.000000 132.000000 
+123.000000 129.000000 136.000000 141.000000 145.000000 143.000000 
+133.000000 122.000000 123.000000 132.000000 132.000000 113.000000 
+91.000000 86.000000 95.000000 109.000000 125.000000 146.000000 
+177.000000 230.000000 311.000000 372.000000 350.000000 247.000000 
+130.000000 70.000000 49.000000 33.000000 23.000000 9.000000 
+3.000000 2.000000 7.000000 11.000000 9.000000 17.000000 
+31.000000 30.000000 15.000000 12.000000 13.000000 13.000000 
+14.000000 17.000000 15.000000 15.000000 24.000000 37.000000 
+52.000000 61.000000 64.000000 81.000000 102.000000 102.000000 
+84.000000 72.000000 73.000000 87.000000 107.000000 125.000000 
+133.000000 130.000000 126.000000 127.000000 131.000000 134.000000 
+133.000000 128.000000 122.000000 119.000000 125.000000 135.000000 
+140.000000 134.000000 128.000000 128.000000 131.000000 137.000000 
+141.000000 139.000000 136.000000 135.000000 135.000000 134.000000 
+131.000000 128.000000 121.000000 109.000000 99.000000 96.000000 
+98.000000 97.000000 100.000000 116.000000 142.000000 175.000000 
+235.000000 315.000000 362.000000 327.000000 221.000000 125.000000 
+95.000000 89.000000 82.000000 61.000000 40.000000 30.000000 
+27.000000 31.000000 35.000000 35.000000 25.000000 20.000000 
+17.000000 15.000000 13.000000 10.000000 8.000000 7.000000 
+9.000000 11.000000 26.000000 45.000000 55.000000 58.000000 
+67.000000 89.000000 99.000000 86.000000 71.000000 73.000000 
+84.000000 91.000000 98.000000 114.000000 135.000000 143.000000 
+133.000000 121.000000 121.000000 126.000000 128.000000 124.000000 
+121.000000 122.000000 125.000000 130.000000 135.000000 136.000000 
+132.000000 125.000000 132.000000 133.000000 135.000000 134.000000 
+131.000000 133.000000 140.000000 142.000000 134.000000 124.000000 
+119.000000 119.000000 115.000000 106.000000 93.000000 85.000000 
+95.000000 123.000000 144.000000 147.000000 163.000000 226.000000 
+305.000000 334.000000 280.000000 187.000000 138.000000 136.000000 
+137.000000 135.000000 129.000000 109.000000 92.000000 100.000000 
+117.000000 109.000000 66.000000 31.000000 19.000000 9.000000 
+11.000000 11.000000 11.000000 12.000000 16.000000 12.000000 
+18.000000 41.000000 53.000000 56.000000 76.000000 99.000000 
+97.000000 79.000000 70.000000 77.000000 88.000000 95.000000 
+102.000000 118.000000 133.000000 134.000000 124.000000 118.000000 
+120.000000 123.000000 125.000000 126.000000 129.000000 128.000000 
+121.000000 117.000000 121.000000 129.000000 131.000000 125.000000 
+136.000000 136.000000 134.000000 130.000000 129.000000 136.000000 
+148.000000 149.000000 135.000000 122.000000 122.000000 127.000000 
+123.000000 108.000000 93.000000 82.000000 88.000000 114.000000 
+144.000000 156.000000 158.000000 182.000000 239.000000 292.000000 
+294.000000 239.000000 170.000000 138.000000 135.000000 147.000000 
+157.000000 147.000000 131.000000 138.000000 167.000000 181.000000 
+147.000000 76.000000 38.000000 28.000000 20.000000 25.000000 
+19.000000 17.000000 31.000000 25.000000 19.000000 35.000000 
+58.000000 64.000000 70.000000 86.000000 87.000000 79.000000 
+79.000000 84.000000 87.000000 90.000000 104.000000 124.000000 
+129.000000 121.000000 116.000000 123.000000 131.000000 132.000000 
+132.000000 135.000000 136.000000 128.000000 117.000000 115.000000 
+122.000000 130.000000 132.000000 128.000000 135.000000 129.000000 
+124.000000 122.000000 124.000000 134.000000 148.000000 150.000000 
+135.000000 120.000000 123.000000 132.000000 129.000000 115.000000 
+102.000000 88.000000 77.000000 84.000000 118.000000 162.000000 
+182.000000 185.000000 215.000000 269.000000 297.000000 268.000000 
+202.000000 146.000000 123.000000 128.000000 142.000000 143.000000 
+129.000000 127.000000 157.000000 193.000000 181.000000 118.000000 
+86.000000 74.000000 58.000000 67.000000 59.000000 23.000000 
+25.000000 33.000000 27.000000 38.000000 62.000000 86.000000 
+88.000000 78.000000 73.000000 81.000000 91.000000 90.000000 
+79.000000 74.000000 88.000000 113.000000 127.000000 128.000000 
+125.000000 126.000000 133.000000 138.000000 138.000000 136.000000 
+135.000000 132.000000 127.000000 122.000000 121.000000 126.000000 
+129.000000 129.000000 135.000000 128.000000 122.000000 121.000000 
+124.000000 131.000000 139.000000 139.000000 128.000000 121.000000 
+130.000000 140.000000 134.000000 114.000000 101.000000 94.000000 
+82.000000 74.000000 98.000000 154.000000 205.000000 226.000000 
+241.000000 279.000000 312.000000 284.000000 213.000000 148.000000 
+116.000000 121.000000 138.000000 139.000000 129.000000 130.000000 
+147.000000 165.000000 164.000000 147.000000 126.000000 104.000000 
+96.000000 106.000000 119.000000 95.000000 87.000000 64.000000 
+21.000000 63.000000 98.000000 102.000000 97.000000 82.000000 
+77.000000 85.000000 86.000000 74.000000 59.000000 66.000000 
+94.000000 121.000000 136.000000 136.000000 126.000000 120.000000 
+126.000000 136.000000 138.000000 134.000000 133.000000 134.000000 
+133.000000 127.000000 126.000000 130.000000 133.000000 129.000000 
+134.000000 136.000000 133.000000 129.000000 130.000000 135.000000 
+136.000000 132.000000 128.000000 129.000000 136.000000 138.000000 
+132.000000 121.000000 112.000000 101.000000 81.000000 67.000000 
+90.000000 157.000000 242.000000 300.000000 322.000000 339.000000 
+348.000000 303.000000 217.000000 143.000000 116.000000 129.000000 
+140.000000 132.000000 130.000000 140.000000 144.000000 139.000000 
+138.000000 145.000000 142.000000 141.000000 140.000000 126.000000 
+131.000000 151.000000 139.000000 98.000000 111.000000 201.000000 
+220.000000 146.000000 85.000000 76.000000 94.000000 97.000000 
+75.000000 51.000000 53.000000 82.000000 116.000000 137.000000 
+141.000000 130.000000 121.000000 124.000000 135.000000 142.000000 
+142.000000 140.000000 140.000000 140.000000 139.000000 137.000000 
+133.000000 126.000000 121.000000 120.000000 139.000000 135.000000 
+131.000000 130.000000 133.000000 139.000000 144.000000 144.000000 
+139.000000 132.000000 126.000000 125.000000 130.000000 135.000000 
+131.000000 109.000000 76.000000 59.000000 84.000000 161.000000 
+266.000000 357.000000 413.000000 426.000000 385.000000 292.000000 
+190.000000 127.000000 120.000000 136.000000 137.000000 129.000000 
+133.000000 139.000000 134.000000 130.000000 137.000000 146.000000 
+154.000000 167.000000 162.000000 129.000000 115.000000 122.000000 
+133.000000 186.000000 292.000000 344.000000 293.000000 187.000000 
+121.000000 109.000000 108.000000 91.000000 68.000000 65.000000 
+90.000000 121.000000 137.000000 138.000000 130.000000 124.000000 
+128.000000 137.000000 141.000000 140.000000 141.000000 146.000000 
+149.000000 148.000000 147.000000 143.000000 133.000000 121.000000 
+115.000000 117.000000 141.000000 137.000000 134.000000 133.000000 
+133.000000 136.000000 140.000000 141.000000 136.000000 127.000000 
+120.000000 121.000000 129.000000 135.000000 131.000000 111.000000 
+81.000000 62.000000 84.000000 165.000000 276.000000 371.000000 
+415.000000 392.000000 309.000000 203.000000 124.000000 104.000000 
+124.000000 137.000000 128.000000 121.000000 126.000000 124.000000 
+119.000000 124.000000 135.000000 145.000000 155.000000 161.000000 
+139.000000 104.000000 94.000000 113.000000 214.000000 338.000000 
+379.000000 334.000000 251.000000 184.000000 153.000000 128.000000 
+99.000000 80.000000 77.000000 91.000000 113.000000 131.000000 
+136.000000 127.000000 120.000000 126.000000 139.000000 144.000000 
+140.000000 137.000000 139.000000 142.000000 144.000000 145.000000 
+144.000000 138.000000 128.000000 122.000000 124.000000 125.000000 
+134.000000 141.000000 141.000000 138.000000 137.000000 138.000000 
+137.000000 133.000000 130.000000 129.000000 125.000000 122.000000 
+128.000000 136.000000 128.000000 100.000000 73.000000 72.000000 
+118.000000 206.000000 297.000000 352.000000 340.000000 266.000000 
+170.000000 104.000000 84.000000 102.000000 127.000000 133.000000 
+127.000000 125.000000 123.000000 116.000000 114.000000 122.000000 
+132.000000 142.000000 150.000000 142.000000 108.000000 82.000000 
+84.000000 114.000000 222.000000 346.000000 399.000000 371.000000 
+298.000000 214.000000 142.000000 102.000000 96.000000 104.000000 
+106.000000 107.000000 119.000000 133.000000 134.000000 124.000000 
+119.000000 128.000000 139.000000 142.000000 138.000000 136.000000 
+135.000000 132.000000 128.000000 129.000000 132.000000 134.000000 
+133.000000 132.000000 133.000000 132.000000 131.000000 131.000000 
+131.000000 132.000000 136.000000 138.000000 136.000000 133.000000 
+135.000000 135.000000 127.000000 119.000000 123.000000 130.000000 
+120.000000 94.000000 81.000000 108.000000 183.000000 270.000000 
+322.000000 324.000000 274.000000 187.000000 109.000000 82.000000 
+90.000000 103.000000 111.000000 113.000000 122.000000 132.000000 
+132.000000 126.000000 128.000000 136.000000 146.000000 153.000000 
+149.000000 120.000000 78.000000 64.000000 75.000000 107.000000 
+185.000000 293.000000 380.000000 400.000000 328.000000 202.000000 
+105.000000 82.000000 109.000000 127.000000 123.000000 120.000000 
+128.000000 133.000000 128.000000 122.000000 127.000000 137.000000 
+144.000000 145.000000 144.000000 139.000000 131.000000 124.000000 
+121.000000 122.000000 125.000000 130.000000 135.000000 138.000000 
+140.000000 138.000000 130.000000 124.000000 124.000000 128.000000 
+132.000000 132.000000 132.000000 134.000000 133.000000 127.000000 
+117.000000 116.000000 123.000000 126.000000 114.000000 97.000000 
+99.000000 135.000000 208.000000 285.000000 323.000000 311.000000 
+258.000000 181.000000 113.000000 75.000000 60.000000 65.000000 
+73.000000 90.000000 115.000000 131.000000 136.000000 136.000000 
+142.000000 147.000000 143.000000 128.000000 112.000000 92.000000 
+77.000000 75.000000 75.000000 99.000000 169.000000 255.000000 
+308.000000 296.000000 225.000000 141.000000 92.000000 86.000000 
+106.000000 122.000000 127.000000 127.000000 126.000000 124.000000 
+119.000000 117.000000 120.000000 126.000000 134.000000 142.000000 
+145.000000 143.000000 136.000000 131.000000 128.000000 126.000000 
+125.000000 124.000000 124.000000 126.000000 131.000000 139.000000 
+124.000000 125.000000 130.000000 131.000000 127.000000 125.000000 
+129.000000 135.000000 134.000000 125.000000 117.000000 118.000000 
+123.000000 123.000000 109.000000 90.000000 91.000000 123.000000 
+187.000000 259.000000 297.000000 282.000000 227.000000 155.000000 
+94.000000 52.000000 28.000000 26.000000 34.000000 62.000000 
+102.000000 131.000000 141.000000 139.000000 130.000000 116.000000 
+94.000000 65.000000 45.000000 53.000000 73.000000 82.000000 
+86.000000 98.000000 141.000000 201.000000 221.000000 177.000000 
+114.000000 81.000000 84.000000 101.000000 113.000000 118.000000 
+124.000000 131.000000 130.000000 124.000000 120.000000 118.000000 
+116.000000 119.000000 128.000000 140.000000 145.000000 140.000000 
+133.000000 126.000000 122.000000 120.000000 119.000000 119.000000 
+119.000000 121.000000 126.000000 132.000000 122.000000 123.000000 
+127.000000 130.000000 129.000000 125.000000 124.000000 126.000000 
+128.000000 125.000000 122.000000 121.000000 125.000000 126.000000 
+116.000000 97.000000 87.000000 102.000000 146.000000 208.000000 
+251.000000 243.000000 185.000000 115.000000 70.000000 55.000000 
+53.000000 52.000000 50.000000 55.000000 69.000000 85.000000 
+96.000000 93.000000 79.000000 61.000000 49.000000 41.000000 
+29.000000 26.000000 37.000000 56.000000 79.000000 95.000000 
+97.000000 105.000000 116.000000 110.000000 92.000000 79.000000 
+81.000000 96.000000 105.000000 107.000000 117.000000 131.000000 
+135.000000 129.000000 122.000000 120.000000 121.000000 122.000000 
+126.000000 133.000000 140.000000 141.000000 135.000000 127.000000 
+124.000000 125.000000 125.000000 122.000000 117.000000 118.000000 
+128.000000 137.000000 134.000000 128.000000 126.000000 128.000000 
+130.000000 128.000000 127.000000 128.000000 132.000000 132.000000 
+126.000000 121.000000 121.000000 124.000000 120.000000 104.000000 
+89.000000 93.000000 115.000000 147.000000 172.000000 166.000000 
+131.000000 90.000000 64.000000 61.000000 73.000000 89.000000 
+100.000000 96.000000 73.000000 52.000000 47.000000 47.000000 
+41.000000 31.000000 29.000000 40.000000 53.000000 48.000000 
+39.000000 45.000000 61.000000 79.000000 91.000000 90.000000 
+90.000000 98.000000 102.000000 94.000000 86.000000 88.000000 
+97.000000 111.000000 126.000000 134.000000 134.000000 131.000000 
+128.000000 126.000000 124.000000 123.000000 123.000000 127.000000 
+132.000000 136.000000 134.000000 129.000000 125.000000 123.000000 
+121.000000 119.000000 119.000000 122.000000 129.000000 132.000000 
+136.000000 132.000000 129.000000 129.000000 130.000000 129.000000 
+129.000000 129.000000 128.000000 125.000000 120.000000 118.000000 
+123.000000 129.000000 125.000000 106.000000 89.000000 90.000000 
+104.000000 113.000000 104.000000 85.000000 73.000000 73.000000 
+78.000000 83.000000 87.000000 93.000000 97.000000 95.000000 
+87.000000 76.000000 60.000000 43.000000 27.000000 17.000000 
+20.000000 38.000000 62.000000 76.000000 72.000000 65.000000 
+67.000000 73.000000 80.000000 84.000000 84.000000 84.000000 
+82.000000 80.000000 81.000000 90.000000 102.000000 115.000000 
+127.000000 133.000000 135.000000 133.000000 132.000000 132.000000 
+132.000000 132.000000 131.000000 130.000000 132.000000 132.000000 
+129.000000 124.000000 119.000000 116.000000 115.000000 117.000000 
+121.000000 125.000000 127.000000 128.000000 132.000000 135.000000 
+138.000000 136.000000 128.000000 122.000000 123.000000 128.000000 
+130.000000 126.000000 122.000000 125.000000 131.000000 130.000000 
+121.000000 106.000000 92.000000 84.000000 85.000000 92.000000 
+98.000000 98.000000 92.000000 89.000000 91.000000 91.000000 
+90.000000 90.000000 89.000000 90.000000 89.000000 86.000000 
+78.000000 61.000000 43.000000 40.000000 51.000000 64.000000 
+72.000000 74.000000 73.000000 75.000000 78.000000 77.000000 
+76.000000 80.000000 85.000000 87.000000 86.000000 86.000000 
+88.000000 94.000000 101.000000 109.000000 118.000000 123.000000 
+125.000000 127.000000 128.000000 127.000000 126.000000 125.000000 
+125.000000 125.000000 125.000000 126.000000 125.000000 121.000000 
+120.000000 122.000000 126.000000 125.000000 123.000000 125.000000 
+132.000000 135.000000 133.000000 133.000000 135.000000 137.000000 
+136.000000 133.000000 132.000000 133.000000 131.000000 126.000000 
+124.000000 128.000000 134.000000 134.000000 124.000000 108.000000 
+94.000000 83.000000 78.000000 81.000000 90.000000 95.000000 
+91.000000 85.000000 86.000000 90.000000 89.000000 82.000000 
+86.000000 94.000000 103.000000 98.000000 73.000000 47.000000 
+40.000000 53.000000 69.000000 81.000000 89.000000 88.000000 
+81.000000 77.000000 76.000000 74.000000 78.000000 87.000000 
+93.000000 91.000000 87.000000 88.000000 93.000000 99.000000 
+104.000000 113.000000 123.000000 128.000000 125.000000 123.000000 
+128.000000 134.000000 135.000000 129.000000 122.000000 120.000000 
+123.000000 126.000000 124.000000 121.000000 122.000000 128.000000 
+130.000000 126.000000 122.000000 125.000000 134.000000 139.000000 
+132.000000 132.000000 131.000000 131.000000 134.000000 137.000000 
+136.000000 131.000000 128.000000 127.000000 126.000000 128.000000 
+135.000000 139.000000 128.000000 106.000000 90.000000 89.000000 
+92.000000 90.000000 86.000000 87.000000 90.000000 89.000000 
+89.000000 89.000000 74.000000 50.000000 55.000000 116.000000 
+221.000000 275.000000 212.000000 104.000000 50.000000 47.000000 
+53.000000 49.000000 50.000000 66.000000 83.000000 86.000000 
+82.000000 83.000000 84.000000 78.000000 69.000000 69.000000 
+78.000000 88.000000 98.000000 107.000000 113.000000 116.000000 
+120.000000 124.000000 127.000000 127.000000 129.000000 135.000000 
+137.000000 131.000000 124.000000 125.000000 131.000000 133.000000 
+129.000000 124.000000 122.000000 122.000000 120.000000 121.000000 
+125.000000 127.000000 126.000000 123.000000 132.000000 130.000000 
+129.000000 131.000000 133.000000 133.000000 131.000000 129.000000 
+128.000000 126.000000 124.000000 123.000000 128.000000 131.000000 
+124.000000 106.000000 91.000000 88.000000 93.000000 99.000000 
+100.000000 101.000000 99.000000 88.000000 72.000000 57.000000 
+36.000000 28.000000 48.000000 188.000000 382.000000 478.000000 
+394.000000 205.000000 78.000000 51.000000 60.000000 50.000000 
+31.000000 32.000000 57.000000 83.000000 93.000000 95.000000 
+94.000000 92.000000 83.000000 72.000000 71.000000 78.000000 
+90.000000 107.000000 121.000000 128.000000 129.000000 130.000000 
+131.000000 130.000000 129.000000 130.000000 131.000000 132.000000 
+133.000000 136.000000 135.000000 128.000000 120.000000 119.000000 
+121.000000 122.000000 118.000000 115.000000 116.000000 117.000000 
+119.000000 120.000000 138.000000 136.000000 135.000000 134.000000 
+129.000000 126.000000 131.000000 141.000000 141.000000 132.000000 
+123.000000 125.000000 132.000000 129.000000 116.000000 99.000000 
+90.000000 91.000000 99.000000 109.000000 112.000000 103.000000 
+89.000000 74.000000 63.000000 56.000000 53.000000 65.000000 
+103.000000 208.000000 339.000000 406.000000 361.000000 245.000000 
+126.000000 58.000000 46.000000 47.000000 47.000000 45.000000 
+50.000000 70.000000 89.000000 100.000000 103.000000 99.000000 
+88.000000 79.000000 81.000000 92.000000 101.000000 103.000000 
+108.000000 120.000000 134.000000 136.000000 129.000000 121.000000 
+122.000000 127.000000 134.000000 140.000000 143.000000 139.000000 
+130.000000 123.000000 123.000000 125.000000 124.000000 122.000000 
+122.000000 121.000000 120.000000 122.000000 126.000000 127.000000 
+136.000000 143.000000 141.000000 135.000000 129.000000 128.000000 
+132.000000 139.000000 137.000000 130.000000 125.000000 130.000000 
+133.000000 124.000000 102.000000 85.000000 84.000000 96.000000 
+109.000000 115.000000 111.000000 105.000000 100.000000 93.000000 
+82.000000 69.000000 58.000000 61.000000 89.000000 177.000000 
+272.000000 298.000000 246.000000 163.000000 95.000000 57.000000 
+49.000000 53.000000 53.000000 47.000000 43.000000 50.000000 
+67.000000 86.000000 97.000000 97.000000 94.000000 93.000000 
+93.000000 94.000000 95.000000 99.000000 109.000000 122.000000 
+131.000000 132.000000 130.000000 129.000000 132.000000 136.000000 
+140.000000 140.000000 137.000000 133.000000 129.000000 127.000000 
+125.000000 123.000000 122.000000 122.000000 122.000000 122.000000 
+123.000000 127.000000 130.000000 128.000000 137.000000 138.000000 
+139.000000 138.000000 133.000000 128.000000 128.000000 132.000000 
+133.000000 130.000000 130.000000 135.000000 133.000000 116.000000 
+93.000000 81.000000 83.000000 90.000000 94.000000 94.000000 
+96.000000 103.000000 111.000000 117.000000 117.000000 106.000000 
+90.000000 79.000000 82.000000 98.000000 122.000000 129.000000 
+110.000000 78.000000 55.000000 58.000000 77.000000 90.000000 
+86.000000 73.000000 62.000000 59.000000 67.000000 80.000000 
+89.000000 90.000000 90.000000 93.000000 99.000000 101.000000 
+98.000000 97.000000 106.000000 119.000000 125.000000 125.000000 
+124.000000 126.000000 129.000000 133.000000 140.000000 141.000000 
+135.000000 126.000000 124.000000 127.000000 128.000000 124.000000 
+119.000000 118.000000 119.000000 121.000000 124.000000 131.000000 
+134.000000 129.000000 133.000000 141.000000 142.000000 135.000000 
+126.000000 122.000000 125.000000 126.000000 124.000000 121.000000 
+124.000000 125.000000 117.000000 100.000000 88.000000 90.000000 
+101.000000 107.000000 105.000000 99.000000 92.000000 90.000000 
+100.000000 118.000000 133.000000 136.000000 135.000000 137.000000 
+142.000000 139.000000 118.000000 89.000000 65.000000 53.000000 
+57.000000 75.000000 97.000000 113.000000 116.000000 113.000000 
+109.000000 99.000000 83.000000 69.000000 65.000000 71.000000 
+82.000000 96.000000 108.000000 112.000000 108.000000 101.000000 
+99.000000 105.000000 113.000000 120.000000 127.000000 134.000000 
+136.000000 134.000000 132.000000 134.000000 135.000000 133.000000 
+129.000000 123.000000 118.000000 118.000000 122.000000 126.000000 
+124.000000 119.000000 120.000000 124.000000 126.000000 124.000000 
+135.000000 137.000000 133.000000 128.000000 125.000000 126.000000 
+128.000000 127.000000 123.000000 121.000000 123.000000 123.000000 
+115.000000 100.000000 92.000000 99.000000 113.000000 123.000000 
+124.000000 124.000000 128.000000 133.000000 135.000000 134.000000 
+135.000000 138.000000 141.000000 144.000000 144.000000 140.000000 
+128.000000 114.000000 104.000000 104.000000 114.000000 126.000000 
+133.000000 133.000000 132.000000 131.000000 127.000000 122.000000 
+118.000000 119.000000 118.000000 113.000000 109.000000 110.000000 
+113.000000 109.000000 101.000000 94.000000 95.000000 104.000000 
+115.000000 124.000000 131.000000 133.000000 131.000000 128.000000 
+128.000000 131.000000 135.000000 135.000000 130.000000 125.000000 
+122.000000 124.000000 128.000000 129.000000 128.000000 127.000000 
+127.000000 125.000000 121.000000 121.000000 133.000000 133.000000 
+132.000000 132.000000 134.000000 132.000000 126.000000 118.000000 
+114.000000 117.000000 124.000000 126.000000 113.000000 89.000000 
+73.000000 82.000000 114.000000 148.000000 162.000000 150.000000 
+134.000000 131.000000 135.000000 140.000000 141.000000 140.000000 
+139.000000 139.000000 139.000000 138.000000 136.000000 136.000000 
+135.000000 133.000000 132.000000 133.000000 133.000000 130.000000 
+125.000000 122.000000 121.000000 120.000000 120.000000 124.000000 
+128.000000 125.000000 115.000000 105.000000 103.000000 106.000000 
+106.000000 100.000000 98.000000 105.000000 117.000000 126.000000 
+129.000000 130.000000 132.000000 133.000000 132.000000 132.000000 
+134.000000 137.000000 136.000000 131.000000 130.000000 132.000000 
+134.000000 131.000000 127.000000 126.000000 126.000000 122.000000 
+113.000000 109.000000 125.000000 126.000000 130.000000 136.000000 
+138.000000 133.000000 124.000000 119.000000 122.000000 127.000000 
+123.000000 110.000000 94.000000 77.000000 65.000000 70.000000 
+102.000000 146.000000 171.000000 161.000000 136.000000 123.000000 
+126.000000 131.000000 128.000000 123.000000 125.000000 133.000000 
+139.000000 142.000000 143.000000 141.000000 135.000000 129.000000 
+128.000000 129.000000 128.000000 122.000000 118.000000 120.000000 
+124.000000 127.000000 129.000000 132.000000 132.000000 123.000000 
+110.000000 100.000000 98.000000 101.000000 102.000000 100.000000 
+101.000000 108.000000 120.000000 131.000000 136.000000 135.000000 
+131.000000 131.000000 134.000000 138.000000 140.000000 138.000000 
+133.000000 130.000000 130.000000 133.000000 133.000000 130.000000 
+126.000000 123.000000 122.000000 119.000000 115.000000 118.000000 
+129.000000 130.000000 131.000000 131.000000 131.000000 129.000000 
+123.000000 121.000000 124.000000 125.000000 116.000000 98.000000 
+82.000000 73.000000 72.000000 81.000000 99.000000 120.000000 
+131.000000 129.000000 123.000000 123.000000 128.000000 131.000000 
+129.000000 129.000000 132.000000 135.000000 138.000000 141.000000 
+143.000000 139.000000 131.000000 126.000000 128.000000 133.000000 
+133.000000 127.000000 122.000000 122.000000 124.000000 122.000000 
+119.000000 118.000000 123.000000 129.000000 131.000000 130.000000 
+124.000000 115.000000 106.000000 102.000000 104.000000 110.000000 
+120.000000 130.000000 134.000000 132.000000 129.000000 130.000000 
+137.000000 143.000000 144.000000 140.000000 134.000000 131.000000 
+131.000000 133.000000 132.000000 130.000000 130.000000 130.000000 
+128.000000 126.000000 126.000000 129.000000 125.000000 122.000000 
+122.000000 126.000000 129.000000 127.000000 123.000000 122.000000 
+124.000000 122.000000 110.000000 95.000000 86.000000 83.000000 
+82.000000 90.000000 108.000000 126.000000 132.000000 127.000000 
+124.000000 125.000000 127.000000 129.000000 132.000000 137.000000 
+139.000000 138.000000 139.000000 142.000000 140.000000 130.000000 
+122.000000 123.000000 130.000000 133.000000 130.000000 127.000000 
+127.000000 129.000000 130.000000 129.000000 127.000000 122.000000 
+116.000000 115.000000 121.000000 129.000000 130.000000 119.000000 
+101.000000 91.000000 91.000000 95.000000 103.000000 115.000000 
+124.000000 130.000000 132.000000 133.000000 135.000000 138.000000 
+139.000000 137.000000 135.000000 133.000000 129.000000 124.000000 
+122.000000 127.000000 133.000000 132.000000 126.000000 123.000000 
+128.000000 135.000000 129.000000 129.000000 129.000000 130.000000 
+128.000000 124.000000 124.000000 127.000000 126.000000 116.000000 
+101.000000 89.000000 87.000000 90.000000 96.000000 105.000000 
+119.000000 132.000000 136.000000 133.000000 128.000000 125.000000 
+124.000000 126.000000 130.000000 132.000000 131.000000 132.000000 
+138.000000 142.000000 138.000000 128.000000 121.000000 123.000000 
+126.000000 125.000000 123.000000 127.000000 132.000000 130.000000 
+124.000000 122.000000 126.000000 128.000000 123.000000 118.000000 
+127.000000 145.000000 156.000000 143.000000 110.000000 82.000000 
+75.000000 83.000000 97.000000 111.000000 121.000000 127.000000 
+129.000000 129.000000 130.000000 135.000000 137.000000 136.000000 
+134.000000 133.000000 133.000000 130.000000 127.000000 128.000000 
+129.000000 129.000000 129.000000 132.000000 138.000000 138.000000 
+127.000000 130.000000 133.000000 128.000000 119.000000 119.000000 
+130.000000 138.000000 129.000000 110.000000 102.000000 108.000000 
+114.000000 111.000000 105.000000 112.000000 127.000000 137.000000 
+137.000000 135.000000 134.000000 133.000000 130.000000 129.000000 
+130.000000 132.000000 132.000000 133.000000 137.000000 140.000000 
+137.000000 129.000000 124.000000 127.000000 134.000000 137.000000 
+134.000000 131.000000 130.000000 128.000000 123.000000 119.000000 
+122.000000 126.000000 122.000000 113.000000 118.000000 144.000000 
+169.000000 165.000000 126.000000 81.000000 64.000000 75.000000 
+93.000000 109.000000 119.000000 121.000000 122.000000 125.000000 
+130.000000 131.000000 127.000000 124.000000 127.000000 134.000000 
+134.000000 129.000000 127.000000 129.000000 128.000000 124.000000 
+120.000000 124.000000 131.000000 134.000000 128.000000 133.000000 
+136.000000 131.000000 122.000000 121.000000 129.000000 133.000000 
+121.000000 102.000000 96.000000 110.000000 132.000000 144.000000 
+144.000000 142.000000 142.000000 137.000000 131.000000 130.000000 
+132.000000 130.000000 125.000000 123.000000 125.000000 130.000000 
+134.000000 136.000000 135.000000 132.000000 126.000000 122.000000 
+122.000000 127.000000 134.000000 138.000000 135.000000 128.000000 
+125.000000 127.000000 126.000000 120.000000 118.000000 124.000000 
+129.000000 125.000000 123.000000 142.000000 172.000000 185.000000 
+159.000000 108.000000 69.000000 66.000000 80.000000 97.000000 
+112.000000 122.000000 125.000000 123.000000 121.000000 123.000000 
+126.000000 130.000000 132.000000 133.000000 133.000000 134.000000 
+137.000000 136.000000 131.000000 125.000000 127.000000 131.000000 
+131.000000 127.000000 132.000000 132.000000 128.000000 125.000000 
+124.000000 125.000000 127.000000 126.000000 112.000000 89.000000 
+79.000000 96.000000 134.000000 162.000000 162.000000 143.000000 
+126.000000 120.000000 125.000000 132.000000 134.000000 131.000000 
+127.000000 126.000000 128.000000 132.000000 135.000000 137.000000 
+138.000000 139.000000 137.000000 132.000000 126.000000 122.000000 
+124.000000 130.000000 133.000000 130.000000 127.000000 127.000000 
+126.000000 122.000000 119.000000 125.000000 131.000000 126.000000 
+118.000000 132.000000 172.000000 205.000000 197.000000 144.000000 
+87.000000 67.000000 78.000000 92.000000 104.000000 114.000000 
+120.000000 123.000000 125.000000 127.000000 127.000000 125.000000 
+123.000000 125.000000 131.000000 137.000000 140.000000 137.000000 
+131.000000 126.000000 125.000000 128.000000 130.000000 128.000000 
+126.000000 126.000000 124.000000 123.000000 127.000000 134.000000 
+137.000000 129.000000 107.000000 85.000000 80.000000 97.000000 
+123.000000 138.000000 131.000000 116.000000 111.000000 116.000000 
+122.000000 125.000000 127.000000 131.000000 132.000000 129.000000 
+124.000000 124.000000 130.000000 138.000000 142.000000 139.000000 
+135.000000 135.000000 137.000000 138.000000 137.000000 138.000000 
+137.000000 133.000000 128.000000 129.000000 133.000000 132.000000 
+126.000000 124.000000 129.000000 128.000000 118.000000 120.000000 
+151.000000 195.000000 214.000000 185.000000 124.000000 80.000000 
+73.000000 80.000000 91.000000 105.000000 118.000000 126.000000 
+124.000000 118.000000 113.000000 112.000000 118.000000 126.000000 
+135.000000 141.000000 139.000000 134.000000 128.000000 127.000000 
+129.000000 130.000000 126.000000 121.000000 127.000000 129.000000 
+128.000000 126.000000 127.000000 129.000000 127.000000 114.000000 
+93.000000 75.000000 73.000000 87.000000 110.000000 128.000000 
+130.000000 123.000000 117.000000 117.000000 119.000000 122.000000 
+125.000000 129.000000 132.000000 132.000000 129.000000 124.000000 
+120.000000 122.000000 132.000000 140.000000 141.000000 137.000000 
+133.000000 132.000000 131.000000 133.000000 137.000000 139.000000 
+134.000000 127.000000 123.000000 126.000000 128.000000 129.000000 
+134.000000 134.000000 125.000000 119.000000 137.000000 182.000000 
+216.000000 201.000000 141.000000 87.000000 68.000000 71.000000 
+78.000000 90.000000 107.000000 122.000000 128.000000 123.000000 
+116.000000 116.000000 119.000000 122.000000 127.000000 132.000000 
+136.000000 138.000000 136.000000 131.000000 126.000000 126.000000 
+130.000000 131.000000 123.000000 122.000000 126.000000 129.000000 
+130.000000 128.000000 118.000000 96.000000 67.000000 52.000000 
+68.000000 109.000000 138.000000 141.000000 131.000000 122.000000 
+117.000000 115.000000 113.000000 116.000000 124.000000 129.000000 
+129.000000 128.000000 126.000000 125.000000 127.000000 133.000000 
+140.000000 141.000000 137.000000 134.000000 137.000000 141.000000 
+140.000000 136.000000 134.000000 133.000000 129.000000 127.000000 
+132.000000 137.000000 134.000000 128.000000 129.000000 135.000000 
+129.000000 118.000000 130.000000 174.000000 216.000000 209.000000 
+150.000000 87.000000 66.000000 71.000000 74.000000 80.000000 
+98.000000 119.000000 127.000000 120.000000 114.000000 118.000000 
+125.000000 128.000000 129.000000 132.000000 133.000000 132.000000 
+133.000000 133.000000 127.000000 117.000000 115.000000 122.000000 
+116.000000 122.000000 130.000000 132.000000 130.000000 124.000000 
+108.000000 76.000000 43.000000 38.000000 72.000000 122.000000 
+147.000000 141.000000 128.000000 122.000000 122.000000 119.000000 
+115.000000 118.000000 126.000000 130.000000 129.000000 126.000000 
+125.000000 126.000000 126.000000 128.000000 134.000000 141.000000 
+145.000000 141.000000 134.000000 131.000000 134.000000 139.000000 
+139.000000 133.000000 126.000000 126.000000 132.000000 135.000000 
+131.000000 126.000000 131.000000 138.000000 132.000000 117.000000 
+120.000000 159.000000 204.000000 204.000000 149.000000 82.000000 
+59.000000 67.000000 68.000000 68.000000 83.000000 108.000000 
+120.000000 116.000000 111.000000 115.000000 127.000000 136.000000 
+140.000000 143.000000 138.000000 129.000000 126.000000 133.000000 
+138.000000 132.000000 126.000000 125.000000 119.000000 118.000000 
+122.000000 130.000000 136.000000 131.000000 116.000000 104.000000 
+99.000000 100.000000 99.000000 98.000000 98.000000 89.000000 
+60.000000 18.000000 5.000000 26.000000 22.000000 20.000000 
+18.000000 17.000000 22.000000 21.000000 12.000000 9.000000 
+12.000000 11.000000 10.000000 10.000000 10.000000 13.000000 
+13.000000 11.000000 13.000000 11.000000 7.000000 6.000000 
+8.000000 11.000000 10.000000 10.000000 10.000000 10.000000 
+14.000000 18.000000 16.000000 7.000000 8.000000 19.000000 
+23.000000 20.000000 40.000000 72.000000 75.000000 28.000000 
+25.000000 58.000000 68.000000 56.000000 36.000000 18.000000 
+10.000000 10.000000 21.000000 32.000000 32.000000 36.000000 
+50.000000 70.000000 90.000000 107.000000 117.000000 127.000000 
+137.000000 143.000000 123.000000 124.000000 124.000000 124.000000 
+129.000000 136.000000 135.000000 118.000000 96.000000 86.000000 
+93.000000 108.000000 116.000000 112.000000 87.000000 44.000000 
+8.000000 13.000000 15.000000 10.000000 11.000000 13.000000 
+13.000000 11.000000 9.000000 10.000000 12.000000 11.000000 
+10.000000 9.000000 9.000000 10.000000 9.000000 9.000000 
+13.000000 13.000000 9.000000 8.000000 9.000000 12.000000 
+13.000000 8.000000 8.000000 15.000000 21.000000 20.000000 
+14.000000 8.000000 6.000000 10.000000 15.000000 19.000000 
+44.000000 74.000000 75.000000 42.000000 22.000000 35.000000 
+45.000000 36.000000 17.000000 12.000000 16.000000 18.000000 
+18.000000 24.000000 40.000000 68.000000 99.000000 120.000000 
+125.000000 127.000000 131.000000 136.000000 137.000000 134.000000 
+125.000000 123.000000 120.000000 118.000000 121.000000 130.000000 
+137.000000 135.000000 122.000000 105.000000 102.000000 115.000000 
+126.000000 124.000000 107.000000 74.000000 36.000000 16.000000 
+18.000000 17.000000 12.000000 6.000000 2.000000 6.000000 
+9.000000 11.000000 9.000000 8.000000 7.000000 7.000000 
+9.000000 10.000000 9.000000 6.000000 5.000000 5.000000 
+5.000000 8.000000 8.000000 6.000000 8.000000 8.000000 
+8.000000 13.000000 18.000000 15.000000 8.000000 5.000000 
+11.000000 14.000000 6.000000 15.000000 45.000000 69.000000 
+71.000000 52.000000 37.000000 46.000000 61.000000 60.000000 
+42.000000 29.000000 26.000000 27.000000 37.000000 60.000000 
+89.000000 115.000000 129.000000 131.000000 127.000000 126.000000 
+130.000000 133.000000 135.000000 134.000000 125.000000 122.000000 
+120.000000 120.000000 121.000000 122.000000 126.000000 133.000000 
+133.000000 118.000000 96.000000 94.000000 111.000000 122.000000 
+112.000000 85.000000 64.000000 59.000000 62.000000 59.000000 
+42.000000 23.000000 12.000000 8.000000 9.000000 5.000000 
+6.000000 6.000000 7.000000 8.000000 8.000000 9.000000 
+10.000000 10.000000 7.000000 3.000000 3.000000 6.000000 
+10.000000 8.000000 9.000000 11.000000 11.000000 12.000000 
+7.000000 17.000000 25.000000 18.000000 11.000000 14.000000 
+10.000000 23.000000 47.000000 61.000000 62.000000 54.000000 
+55.000000 74.000000 96.000000 103.000000 90.000000 63.000000 
+49.000000 68.000000 106.000000 136.000000 144.000000 136.000000 
+126.000000 121.000000 119.000000 119.000000 121.000000 124.000000 
+128.000000 127.000000 132.000000 126.000000 119.000000 116.000000 
+119.000000 123.000000 127.000000 131.000000 128.000000 112.000000 
+86.000000 73.000000 88.000000 107.000000 99.000000 80.000000 
+96.000000 147.000000 178.000000 162.000000 113.000000 64.000000 
+31.000000 13.000000 10.000000 11.000000 11.000000 10.000000 
+9.000000 8.000000 8.000000 9.000000 9.000000 11.000000 
+8.000000 3.000000 4.000000 6.000000 9.000000 11.000000 
+8.000000 10.000000 8.000000 14.000000 13.000000 18.000000 
+29.000000 29.000000 15.000000 8.000000 18.000000 37.000000 
+53.000000 58.000000 57.000000 62.000000 80.000000 101.000000 
+110.000000 103.000000 84.000000 66.000000 74.000000 107.000000 
+133.000000 141.000000 137.000000 129.000000 123.000000 120.000000 
+120.000000 124.000000 126.000000 122.000000 116.000000 113.000000 
+124.000000 120.000000 120.000000 122.000000 124.000000 126.000000 
+129.000000 128.000000 121.000000 110.000000 94.000000 72.000000 
+60.000000 69.000000 84.000000 101.000000 143.000000 230.000000 
+341.000000 403.000000 351.000000 208.000000 69.000000 21.000000 
+45.000000 53.000000 31.000000 19.000000 17.000000 11.000000 
+10.000000 22.000000 14.000000 7.000000 16.000000 17.000000 
+12.000000 15.000000 12.000000 9.000000 12.000000 16.000000 
+14.000000 17.000000 19.000000 19.000000 21.000000 20.000000 
+14.000000 14.000000 24.000000 40.000000 51.000000 53.000000 
+57.000000 72.000000 95.000000 110.000000 107.000000 91.000000 
+74.000000 73.000000 94.000000 115.000000 126.000000 131.000000 
+132.000000 127.000000 120.000000 119.000000 125.000000 131.000000 
+132.000000 131.000000 131.000000 130.000000 123.000000 121.000000 
+125.000000 131.000000 131.000000 125.000000 119.000000 118.000000 
+118.000000 113.000000 101.000000 83.000000 66.000000 56.000000 
+68.000000 111.000000 188.000000 332.000000 493.000000 542.000000 
+406.000000 185.000000 68.000000 58.000000 65.000000 46.000000 
+30.000000 19.000000 19.000000 24.000000 19.000000 19.000000 
+10.000000 6.000000 16.000000 24.000000 24.000000 23.000000 
+19.000000 18.000000 26.000000 28.000000 18.000000 8.000000 
+9.000000 16.000000 19.000000 10.000000 4.000000 10.000000 
+21.000000 23.000000 45.000000 76.000000 87.000000 88.000000 
+94.000000 102.000000 96.000000 80.000000 74.000000 87.000000 
+105.000000 116.000000 124.000000 134.000000 138.000000 131.000000 
+125.000000 127.000000 132.000000 132.000000 131.000000 133.000000 
+135.000000 132.000000 136.000000 133.000000 133.000000 134.000000 
+130.000000 117.000000 112.000000 120.000000 129.000000 120.000000 
+97.000000 80.000000 67.000000 57.000000 68.000000 147.000000 
+313.000000 481.000000 533.000000 426.000000 236.000000 95.000000 
+74.000000 72.000000 52.000000 52.000000 50.000000 19.000000 
+33.000000 46.000000 27.000000 18.000000 14.000000 13.000000 
+17.000000 15.000000 14.000000 20.000000 18.000000 16.000000 
+18.000000 19.000000 20.000000 19.000000 7.000000 12.000000 
+17.000000 22.000000 23.000000 25.000000 46.000000 43.000000 
+35.000000 67.000000 101.000000 108.000000 99.000000 84.000000 
+65.000000 56.000000 71.000000 99.000000 115.000000 116.000000 
+116.000000 123.000000 132.000000 137.000000 139.000000 139.000000 
+137.000000 134.000000 129.000000 128.000000 128.000000 127.000000 
+144.000000 145.000000 141.000000 131.000000 120.000000 118.000000 
+128.000000 140.000000 143.000000 132.000000 115.000000 94.000000 
+67.000000 53.000000 81.000000 205.000000 412.000000 515.000000 
+436.000000 267.000000 135.000000 86.000000 70.000000 42.000000 
+35.000000 58.000000 47.000000 9.000000 36.000000 44.000000 
+32.000000 27.000000 19.000000 17.000000 21.000000 18.000000 
+14.000000 14.000000 11.000000 12.000000 13.000000 15.000000 
+25.000000 22.000000 17.000000 23.000000 24.000000 48.000000 
+68.000000 71.000000 92.000000 100.000000 61.000000 42.000000 
+83.000000 111.000000 89.000000 55.000000 46.000000 65.000000 
+93.000000 113.000000 120.000000 122.000000 125.000000 129.000000 
+133.000000 137.000000 138.000000 137.000000 136.000000 134.000000 
+130.000000 128.000000 130.000000 133.000000 145.000000 149.000000 
+143.000000 129.000000 120.000000 125.000000 136.000000 141.000000 
+140.000000 132.000000 116.000000 93.000000 72.000000 68.000000 
+88.000000 156.000000 261.000000 305.000000 252.000000 165.000000 
+96.000000 54.000000 32.000000 20.000000 20.000000 34.000000 
+34.000000 21.000000 19.000000 22.000000 28.000000 28.000000 
+27.000000 25.000000 22.000000 24.000000 26.000000 19.000000 
+14.000000 17.000000 21.000000 19.000000 13.000000 14.000000 
+25.000000 32.000000 23.000000 35.000000 68.000000 105.000000 
+149.000000 162.000000 113.000000 75.000000 94.000000 99.000000 
+71.000000 58.000000 73.000000 96.000000 113.000000 121.000000 
+126.000000 129.000000 130.000000 130.000000 131.000000 132.000000 
+132.000000 133.000000 136.000000 140.000000 139.000000 135.000000 
+131.000000 133.000000 138.000000 141.000000 136.000000 126.000000 
+124.000000 133.000000 141.000000 142.000000 137.000000 128.000000 
+111.000000 92.000000 83.000000 91.000000 106.000000 121.000000 
+140.000000 159.000000 159.000000 138.000000 109.000000 74.000000 
+42.000000 28.000000 21.000000 25.000000 41.000000 41.000000 
+18.000000 14.000000 18.000000 18.000000 27.000000 25.000000 
+20.000000 25.000000 24.000000 13.000000 13.000000 15.000000 
+12.000000 12.000000 8.000000 9.000000 30.000000 39.000000 
+17.000000 27.000000 54.000000 105.000000 169.000000 173.000000 
+120.000000 100.000000 106.000000 94.000000 81.000000 87.000000 
+100.000000 109.000000 117.000000 125.000000 129.000000 128.000000 
+129.000000 132.000000 132.000000 129.000000 129.000000 132.000000 
+135.000000 136.000000 134.000000 134.000000 136.000000 140.000000 
+136.000000 133.000000 124.000000 120.000000 129.000000 144.000000 
+148.000000 140.000000 130.000000 128.000000 127.000000 115.000000 
+96.000000 89.000000 100.000000 114.000000 117.000000 114.000000 
+122.000000 146.000000 173.000000 167.000000 109.000000 48.000000 
+21.000000 24.000000 36.000000 26.000000 13.000000 18.000000 
+21.000000 10.000000 14.000000 20.000000 30.000000 37.000000 
+25.000000 16.000000 18.000000 15.000000 13.000000 10.000000 
+16.000000 17.000000 34.000000 37.000000 19.000000 44.000000 
+62.000000 92.000000 143.000000 142.000000 105.000000 90.000000 
+88.000000 85.000000 88.000000 95.000000 100.000000 109.000000 
+120.000000 128.000000 127.000000 127.000000 132.000000 138.000000 
+139.000000 138.000000 137.000000 134.000000 130.000000 128.000000 
+129.000000 129.000000 128.000000 132.000000 134.000000 126.000000 
+119.000000 124.000000 139.000000 150.000000 144.000000 128.000000 
+119.000000 126.000000 135.000000 124.000000 93.000000 72.000000 
+76.000000 89.000000 86.000000 72.000000 77.000000 132.000000 
+220.000000 267.000000 232.000000 148.000000 82.000000 56.000000 
+41.000000 34.000000 44.000000 46.000000 31.000000 17.000000 
+24.000000 29.000000 30.000000 28.000000 24.000000 28.000000 
+23.000000 19.000000 20.000000 14.000000 22.000000 28.000000 
+33.000000 25.000000 27.000000 52.000000 70.000000 96.000000 
+126.000000 121.000000 102.000000 89.000000 77.000000 72.000000 
+76.000000 86.000000 95.000000 105.000000 117.000000 124.000000 
+127.000000 130.000000 133.000000 135.000000 138.000000 142.000000 
+142.000000 134.000000 128.000000 131.000000 133.000000 127.000000 
+119.000000 121.000000 129.000000 123.000000 124.000000 135.000000 
+146.000000 149.000000 138.000000 122.000000 115.000000 124.000000 
+134.000000 126.000000 99.000000 76.000000 75.000000 88.000000 
+88.000000 76.000000 79.000000 140.000000 261.000000 360.000000 
+369.000000 296.000000 201.000000 133.000000 95.000000 95.000000 
+114.000000 108.000000 82.000000 74.000000 84.000000 86.000000 
+79.000000 73.000000 63.000000 40.000000 18.000000 18.000000 
+17.000000 13.000000 15.000000 17.000000 20.000000 19.000000 
+35.000000 49.000000 77.000000 113.000000 119.000000 96.000000 
+82.000000 78.000000 74.000000 72.000000 72.000000 76.000000 
+89.000000 110.000000 123.000000 123.000000 121.000000 127.000000 
+135.000000 136.000000 133.000000 131.000000 130.000000 126.000000 
+124.000000 126.000000 127.000000 126.000000 127.000000 131.000000 
+126.000000 130.000000 139.000000 148.000000 151.000000 146.000000 
+134.000000 121.000000 117.000000 124.000000 130.000000 125.000000 
+110.000000 95.000000 91.000000 92.000000 84.000000 72.000000 
+78.000000 137.000000 270.000000 394.000000 438.000000 392.000000 
+294.000000 203.000000 150.000000 133.000000 143.000000 144.000000 
+131.000000 127.000000 135.000000 141.000000 143.000000 138.000000 
+112.000000 63.000000 38.000000 35.000000 19.000000 6.000000 
+14.000000 20.000000 22.000000 15.000000 37.000000 51.000000 
+84.000000 124.000000 111.000000 72.000000 58.000000 59.000000 
+63.000000 68.000000 72.000000 76.000000 95.000000 122.000000 
+135.000000 129.000000 122.000000 126.000000 133.000000 135.000000 
+132.000000 130.000000 131.000000 130.000000 128.000000 125.000000 
+123.000000 124.000000 129.000000 134.000000 129.000000 134.000000 
+142.000000 143.000000 138.000000 134.000000 136.000000 136.000000 
+132.000000 130.000000 133.000000 134.000000 123.000000 111.000000 
+105.000000 100.000000 86.000000 74.000000 75.000000 117.000000 
+231.000000 354.000000 432.000000 432.000000 351.000000 238.000000 
+161.000000 134.000000 144.000000 147.000000 137.000000 133.000000 
+133.000000 133.000000 140.000000 152.000000 142.000000 104.000000 
+74.000000 56.000000 39.000000 23.000000 44.000000 54.000000 
+33.000000 7.000000 31.000000 64.000000 92.000000 110.000000 
+92.000000 67.000000 60.000000 60.000000 62.000000 67.000000 
+72.000000 76.000000 91.000000 113.000000 128.000000 130.000000 
+125.000000 123.000000 126.000000 127.000000 127.000000 127.000000 
+130.000000 134.000000 133.000000 129.000000 127.000000 128.000000 
+130.000000 127.000000 133.000000 135.000000 139.000000 136.000000 
+126.000000 122.000000 132.000000 145.000000 145.000000 137.000000 
+137.000000 140.000000 136.000000 122.000000 110.000000 101.000000 
+89.000000 82.000000 89.000000 122.000000 201.000000 300.000000 
+386.000000 425.000000 381.000000 274.000000 175.000000 137.000000 
+142.000000 145.000000 139.000000 133.000000 126.000000 124.000000 
+138.000000 158.000000 158.000000 135.000000 105.000000 85.000000 
+81.000000 70.000000 87.000000 95.000000 65.000000 38.000000 
+28.000000 69.000000 108.000000 95.000000 62.000000 53.000000 
+60.000000 71.000000 75.000000 71.000000 66.000000 68.000000 
+80.000000 97.000000 113.000000 124.000000 126.000000 122.000000 
+121.000000 126.000000 129.000000 128.000000 126.000000 128.000000 
+129.000000 126.000000 128.000000 136.000000 139.000000 130.000000 
+131.000000 134.000000 139.000000 137.000000 127.000000 121.000000 
+127.000000 138.000000 141.000000 134.000000 127.000000 126.000000 
+127.000000 122.000000 112.000000 101.000000 90.000000 88.000000 
+102.000000 139.000000 206.000000 291.000000 364.000000 401.000000 
+375.000000 290.000000 190.000000 135.000000 126.000000 134.000000 
+138.000000 132.000000 127.000000 133.000000 144.000000 148.000000 
+144.000000 140.000000 131.000000 122.000000 122.000000 120.000000 
+136.000000 143.000000 116.000000 72.000000 60.000000 126.000000 
+167.000000 122.000000 62.000000 50.000000 78.000000 97.000000 
+84.000000 64.000000 64.000000 85.000000 104.000000 108.000000 
+109.000000 117.000000 126.000000 130.000000 133.000000 138.000000 
+143.000000 141.000000 135.000000 131.000000 128.000000 126.000000 
+127.000000 130.000000 130.000000 125.000000 126.000000 126.000000 
+130.000000 132.000000 128.000000 125.000000 128.000000 133.000000 
+132.000000 127.000000 123.000000 122.000000 123.000000 121.000000 
+114.000000 102.000000 89.000000 82.000000 96.000000 145.000000 
+227.000000 308.000000 356.000000 366.000000 334.000000 263.000000 
+181.000000 127.000000 111.000000 118.000000 128.000000 131.000000 
+136.000000 141.000000 141.000000 138.000000 141.000000 142.000000 
+132.000000 131.000000 137.000000 141.000000 153.000000 145.000000 
+113.000000 115.000000 180.000000 253.000000 240.000000 157.000000 
+97.000000 88.000000 105.000000 103.000000 75.000000 62.000000 
+81.000000 112.000000 128.000000 128.000000 125.000000 125.000000 
+126.000000 130.000000 136.000000 141.000000 146.000000 148.000000 
+145.000000 137.000000 131.000000 130.000000 128.000000 121.000000 
+113.000000 114.000000 129.000000 124.000000 124.000000 127.000000 
+128.000000 129.000000 131.000000 133.000000 132.000000 128.000000 
+124.000000 125.000000 127.000000 126.000000 119.000000 103.000000 
+83.000000 71.000000 86.000000 139.000000 225.000000 301.000000 
+336.000000 326.000000 277.000000 200.000000 136.000000 116.000000 
+120.000000 124.000000 127.000000 136.000000 146.000000 144.000000 
+134.000000 131.000000 136.000000 134.000000 132.000000 141.000000 
+145.000000 138.000000 136.000000 126.000000 150.000000 240.000000 
+308.000000 306.000000 241.000000 166.000000 133.000000 113.000000 
+88.000000 71.000000 70.000000 89.000000 112.000000 125.000000 
+130.000000 132.000000 132.000000 130.000000 129.000000 131.000000 
+133.000000 134.000000 137.000000 141.000000 142.000000 141.000000 
+140.000000 138.000000 129.000000 115.000000 107.000000 108.000000 
+138.000000 132.000000 127.000000 125.000000 125.000000 128.000000 
+133.000000 137.000000 137.000000 130.000000 124.000000 124.000000 
+130.000000 132.000000 123.000000 103.000000 79.000000 70.000000 
+91.000000 152.000000 236.000000 303.000000 324.000000 286.000000 
+207.000000 128.000000 96.000000 113.000000 134.000000 140.000000 
+139.000000 142.000000 141.000000 131.000000 124.000000 126.000000 
+130.000000 132.000000 142.000000 154.000000 147.000000 132.000000 
+126.000000 128.000000 212.000000 320.000000 350.000000 301.000000 
+224.000000 171.000000 141.000000 108.000000 79.000000 72.000000 
+87.000000 112.000000 129.000000 135.000000 131.000000 125.000000 
+125.000000 131.000000 135.000000 134.000000 133.000000 137.000000 
+139.000000 135.000000 130.000000 132.000000 139.000000 141.000000 
+134.000000 124.000000 117.000000 111.000000 135.000000 136.000000 
+136.000000 132.000000 126.000000 127.000000 134.000000 139.000000 
+137.000000 130.000000 126.000000 128.000000 135.000000 140.000000 
+131.000000 107.000000 81.000000 76.000000 107.000000 177.000000 
+258.000000 310.000000 310.000000 253.000000 167.000000 104.000000 
+93.000000 106.000000 121.000000 129.000000 134.000000 138.000000 
+136.000000 130.000000 127.000000 127.000000 129.000000 136.000000 
+145.000000 143.000000 124.000000 106.000000 104.000000 108.000000 
+184.000000 308.000000 384.000000 370.000000 296.000000 206.000000 
+133.000000 101.000000 100.000000 107.000000 109.000000 114.000000 
+127.000000 135.000000 131.000000 121.000000 119.000000 127.000000 
+135.000000 136.000000 136.000000 138.000000 138.000000 132.000000 
+127.000000 128.000000 132.000000 136.000000 138.000000 138.000000 
+135.000000 129.000000 142.000000 138.000000 131.000000 124.000000 
+124.000000 130.000000 135.000000 134.000000 129.000000 124.000000 
+121.000000 122.000000 128.000000 136.000000 133.000000 114.000000 
+95.000000 99.000000 137.000000 206.000000 275.000000 314.000000 
+304.000000 242.000000 155.000000 101.000000 91.000000 102.000000 
+116.000000 124.000000 129.000000 136.000000 141.000000 141.000000 
+139.000000 138.000000 143.000000 153.000000 153.000000 131.000000 
+94.000000 73.000000 78.000000 105.000000 169.000000 269.000000 
+356.000000 380.000000 323.000000 220.000000 132.000000 100.000000 
+110.000000 123.000000 125.000000 127.000000 132.000000 133.000000 
+127.000000 121.000000 120.000000 121.000000 123.000000 132.000000 
+143.000000 145.000000 137.000000 128.000000 125.000000 127.000000 
+128.000000 130.000000 132.000000 134.000000 133.000000 133.000000 
+136.000000 128.000000 122.000000 124.000000 128.000000 130.000000 
+130.000000 130.000000 128.000000 122.000000 114.000000 113.000000 
+122.000000 129.000000 126.000000 110.000000 98.000000 105.000000 
+148.000000 219.000000 283.000000 305.000000 273.000000 198.000000 
+123.000000 89.000000 88.000000 106.000000 111.000000 113.000000 
+129.000000 147.000000 154.000000 151.000000 147.000000 147.000000 
+153.000000 156.000000 145.000000 117.000000 81.000000 64.000000 
+67.000000 97.000000 163.000000 240.000000 285.000000 274.000000 
+214.000000 145.000000 101.000000 90.000000 100.000000 113.000000 
+124.000000 130.000000 129.000000 124.000000 120.000000 121.000000 
+125.000000 126.000000 127.000000 133.000000 142.000000 146.000000 
+141.000000 133.000000 126.000000 123.000000 123.000000 125.000000 
+127.000000 129.000000 133.000000 137.000000 129.000000 129.000000 
+128.000000 128.000000 125.000000 123.000000 124.000000 129.000000 
+131.000000 125.000000 115.000000 112.000000 117.000000 125.000000 
+124.000000 108.000000 89.000000 93.000000 135.000000 208.000000 
+262.000000 259.000000 208.000000 145.000000 105.000000 78.000000 
+52.000000 49.000000 56.000000 89.000000 133.000000 158.000000 
+165.000000 160.000000 150.000000 141.000000 137.000000 126.000000 
+105.000000 91.000000 85.000000 82.000000 80.000000 90.000000 
+128.000000 183.000000 208.000000 174.000000 115.000000 82.000000 
+85.000000 99.000000 106.000000 112.000000 124.000000 133.000000 
+130.000000 125.000000 126.000000 130.000000 129.000000 127.000000 
+129.000000 133.000000 132.000000 130.000000 131.000000 133.000000 
+130.000000 124.000000 123.000000 125.000000 128.000000 130.000000 
+134.000000 138.000000 135.000000 139.000000 137.000000 131.000000 
+126.000000 123.000000 121.000000 121.000000 122.000000 124.000000 
+123.000000 119.000000 117.000000 118.000000 121.000000 111.000000 
+92.000000 85.000000 107.000000 157.000000 200.000000 198.000000 
+153.000000 103.000000 79.000000 68.000000 51.000000 37.000000 
+43.000000 69.000000 98.000000 120.000000 132.000000 129.000000 
+116.000000 105.000000 100.000000 87.000000 59.000000 43.000000 
+54.000000 72.000000 84.000000 87.000000 85.000000 90.000000 
+97.000000 93.000000 80.000000 72.000000 81.000000 97.000000 
+107.000000 114.000000 122.000000 126.000000 127.000000 129.000000 
+134.000000 138.000000 135.000000 127.000000 122.000000 124.000000 
+130.000000 134.000000 132.000000 127.000000 122.000000 119.000000 
+119.000000 121.000000 123.000000 127.000000 131.000000 135.000000 
+128.000000 138.000000 143.000000 140.000000 131.000000 125.000000 
+125.000000 125.000000 121.000000 115.000000 117.000000 123.000000 
+125.000000 121.000000 115.000000 107.000000 95.000000 87.000000 
+90.000000 101.000000 117.000000 123.000000 108.000000 84.000000 
+70.000000 75.000000 89.000000 100.000000 95.000000 75.000000 
+60.000000 59.000000 62.000000 61.000000 53.000000 44.000000 
+39.000000 37.000000 42.000000 47.000000 53.000000 66.000000 
+76.000000 77.000000 80.000000 84.000000 82.000000 78.000000 
+77.000000 78.000000 84.000000 93.000000 103.000000 115.000000 
+129.000000 136.000000 136.000000 133.000000 132.000000 134.000000 
+133.000000 128.000000 124.000000 127.000000 133.000000 135.000000 
+131.000000 127.000000 125.000000 124.000000 122.000000 121.000000 
+123.000000 127.000000 130.000000 132.000000 125.000000 134.000000 
+141.000000 141.000000 138.000000 135.000000 134.000000 133.000000 
+127.000000 120.000000 116.000000 119.000000 124.000000 125.000000 
+119.000000 107.000000 96.000000 89.000000 88.000000 89.000000 
+86.000000 83.000000 83.000000 87.000000 91.000000 93.000000 
+93.000000 93.000000 93.000000 88.000000 76.000000 56.000000 
+32.000000 20.000000 26.000000 40.000000 50.000000 51.000000 
+57.000000 73.000000 89.000000 94.000000 90.000000 84.000000 
+85.000000 89.000000 86.000000 80.000000 77.000000 81.000000 
+89.000000 97.000000 110.000000 125.000000 134.000000 133.000000 
+128.000000 128.000000 133.000000 136.000000 132.000000 126.000000 
+125.000000 130.000000 135.000000 134.000000 129.000000 124.000000 
+121.000000 118.000000 117.000000 118.000000 122.000000 126.000000 
+128.000000 128.000000 124.000000 124.000000 131.000000 140.000000 
+143.000000 134.000000 124.000000 122.000000 127.000000 132.000000 
+131.000000 128.000000 128.000000 127.000000 120.000000 109.000000 
+98.000000 91.000000 86.000000 83.000000 83.000000 84.000000 
+84.000000 87.000000 92.000000 95.000000 94.000000 88.000000 
+80.000000 76.000000 74.000000 69.000000 62.000000 55.000000 
+59.000000 70.000000 84.000000 91.000000 86.000000 78.000000 
+77.000000 75.000000 74.000000 75.000000 80.000000 86.000000 
+88.000000 84.000000 79.000000 79.000000 87.000000 99.000000 
+112.000000 121.000000 123.000000 122.000000 125.000000 132.000000 
+139.000000 137.000000 129.000000 124.000000 127.000000 132.000000 
+131.000000 127.000000 124.000000 124.000000 123.000000 118.000000 
+114.000000 115.000000 120.000000 126.000000 129.000000 129.000000 
+134.000000 129.000000 125.000000 128.000000 133.000000 133.000000 
+126.000000 122.000000 126.000000 130.000000 129.000000 124.000000 
+124.000000 126.000000 123.000000 110.000000 94.000000 83.000000 
+79.000000 77.000000 77.000000 79.000000 85.000000 91.000000 
+94.000000 91.000000 82.000000 71.000000 70.000000 76.000000 
+86.000000 91.000000 78.000000 57.000000 42.000000 45.000000 
+64.000000 84.000000 96.000000 93.000000 82.000000 75.000000 
+75.000000 76.000000 76.000000 80.000000 86.000000 86.000000 
+80.000000 78.000000 85.000000 97.000000 110.000000 118.000000 
+120.000000 120.000000 123.000000 130.000000 137.000000 137.000000 
+128.000000 119.000000 118.000000 124.000000 130.000000 132.000000 
+128.000000 123.000000 119.000000 117.000000 117.000000 119.000000 
+122.000000 126.000000 129.000000 130.000000 130.000000 131.000000 
+132.000000 131.000000 131.000000 129.000000 126.000000 125.000000 
+129.000000 135.000000 134.000000 129.000000 128.000000 132.000000 
+129.000000 113.000000 93.000000 82.000000 81.000000 82.000000 
+83.000000 88.000000 92.000000 90.000000 85.000000 79.000000 
+62.000000 40.000000 48.000000 104.000000 205.000000 268.000000 
+223.000000 122.000000 57.000000 47.000000 52.000000 43.000000 
+43.000000 61.000000 83.000000 92.000000 86.000000 80.000000 
+78.000000 78.000000 80.000000 85.000000 89.000000 89.000000 
+92.000000 101.000000 115.000000 122.000000 122.000000 125.000000 
+131.000000 133.000000 130.000000 127.000000 126.000000 125.000000 
+124.000000 127.000000 133.000000 134.000000 130.000000 126.000000 
+124.000000 123.000000 122.000000 124.000000 126.000000 126.000000 
+123.000000 121.000000 132.000000 135.000000 138.000000 138.000000 
+131.000000 123.000000 119.000000 120.000000 123.000000 124.000000 
+123.000000 124.000000 130.000000 135.000000 128.000000 110.000000 
+92.000000 84.000000 86.000000 92.000000 99.000000 103.000000 
+100.000000 87.000000 71.000000 58.000000 43.000000 38.000000 
+59.000000 176.000000 359.000000 466.000000 402.000000 228.000000 
+92.000000 45.000000 47.000000 45.000000 36.000000 40.000000 
+60.000000 79.000000 87.000000 90.000000 93.000000 93.000000 
+87.000000 81.000000 81.000000 85.000000 92.000000 105.000000 
+118.000000 124.000000 125.000000 127.000000 132.000000 134.000000 
+130.000000 126.000000 126.000000 131.000000 137.000000 140.000000 
+138.000000 131.000000 122.000000 118.000000 117.000000 117.000000 
+117.000000 117.000000 118.000000 120.000000 124.000000 127.000000 
+122.000000 121.000000 122.000000 126.000000 129.000000 127.000000 
+125.000000 127.000000 129.000000 128.000000 125.000000 127.000000 
+133.000000 135.000000 126.000000 107.000000 89.000000 82.000000 
+91.000000 108.000000 118.000000 114.000000 101.000000 89.000000 
+78.000000 65.000000 56.000000 73.000000 112.000000 206.000000 
+331.000000 401.000000 369.000000 266.000000 151.000000 67.000000 
+35.000000 38.000000 46.000000 47.000000 49.000000 58.000000 
+71.000000 82.000000 92.000000 98.000000 96.000000 86.000000 
+78.000000 81.000000 91.000000 101.000000 108.000000 115.000000 
+123.000000 128.000000 132.000000 137.000000 138.000000 132.000000 
+125.000000 124.000000 131.000000 136.000000 135.000000 128.000000 
+122.000000 119.000000 120.000000 122.000000 122.000000 120.000000 
+120.000000 123.000000 127.000000 126.000000 125.000000 125.000000 
+123.000000 124.000000 127.000000 127.000000 126.000000 127.000000 
+130.000000 129.000000 126.000000 126.000000 129.000000 126.000000 
+115.000000 100.000000 91.000000 91.000000 97.000000 104.000000 
+110.000000 108.000000 103.000000 101.000000 105.000000 107.000000 
+103.000000 101.000000 116.000000 181.000000 267.000000 295.000000 
+247.000000 172.000000 106.000000 66.000000 53.000000 55.000000 
+58.000000 56.000000 53.000000 56.000000 69.000000 84.000000 
+92.000000 97.000000 103.000000 109.000000 104.000000 88.000000 
+83.000000 97.000000 118.000000 130.000000 132.000000 132.000000 
+135.000000 136.000000 132.000000 130.000000 131.000000 132.000000 
+131.000000 130.000000 132.000000 131.000000 125.000000 120.000000 
+122.000000 126.000000 125.000000 122.000000 124.000000 130.000000 
+131.000000 123.000000 127.000000 129.000000 130.000000 129.000000 
+125.000000 122.000000 123.000000 126.000000 127.000000 125.000000 
+124.000000 125.000000 125.000000 118.000000 103.000000 89.000000 
+85.000000 89.000000 92.000000 93.000000 95.000000 101.000000 
+108.000000 113.000000 111.000000 105.000000 93.000000 79.000000 
+77.000000 88.000000 116.000000 130.000000 109.000000 73.000000 
+51.000000 56.000000 75.000000 87.000000 84.000000 73.000000 
+61.000000 57.000000 63.000000 74.000000 86.000000 95.000000 
+104.000000 114.000000 120.000000 115.000000 105.000000 103.000000 
+113.000000 121.000000 121.000000 123.000000 130.000000 137.000000 
+139.000000 136.000000 133.000000 132.000000 131.000000 128.000000 
+121.000000 114.000000 111.000000 115.000000 122.000000 125.000000 
+123.000000 121.000000 122.000000 124.000000 122.000000 119.000000 
+126.000000 130.000000 138.000000 142.000000 138.000000 130.000000 
+125.000000 124.000000 126.000000 127.000000 129.000000 131.000000 
+128.000000 115.000000 100.000000 91.000000 93.000000 97.000000 
+94.000000 87.000000 87.000000 103.000000 126.000000 140.000000 
+140.000000 132.000000 128.000000 133.000000 137.000000 131.000000 
+111.000000 90.000000 77.000000 74.000000 82.000000 99.000000 
+119.000000 130.000000 126.000000 113.000000 100.000000 92.000000 
+86.000000 82.000000 84.000000 91.000000 98.000000 105.000000 
+110.000000 110.000000 105.000000 101.000000 108.000000 119.000000 
+125.000000 126.000000 127.000000 131.000000 133.000000 131.000000 
+130.000000 131.000000 133.000000 129.000000 122.000000 117.000000 
+118.000000 121.000000 123.000000 123.000000 124.000000 124.000000 
+124.000000 122.000000 120.000000 118.000000 129.000000 128.000000 
+127.000000 128.000000 127.000000 125.000000 123.000000 121.000000 
+118.000000 114.000000 117.000000 122.000000 118.000000 102.000000 
+88.000000 91.000000 107.000000 116.000000 117.000000 117.000000 
+126.000000 135.000000 135.000000 130.000000 129.000000 132.000000 
+135.000000 135.000000 136.000000 137.000000 132.000000 121.000000 
+110.000000 106.000000 113.000000 125.000000 134.000000 135.000000 
+129.000000 124.000000 126.000000 134.000000 136.000000 126.000000 
+111.000000 104.000000 109.000000 115.000000 114.000000 108.000000 
+107.000000 112.000000 115.000000 116.000000 117.000000 121.000000 
+125.000000 129.000000 132.000000 136.000000 138.000000 135.000000 
+128.000000 124.000000 125.000000 128.000000 128.000000 123.000000 
+120.000000 118.000000 119.000000 122.000000 126.000000 127.000000 
+124.000000 118.000000 130.000000 126.000000 124.000000 125.000000 
+125.000000 122.000000 118.000000 120.000000 124.000000 125.000000 
+122.000000 118.000000 113.000000 99.000000 78.000000 72.000000 
+95.000000 138.000000 170.000000 166.000000 140.000000 122.000000 
+120.000000 128.000000 131.000000 130.000000 132.000000 139.000000 
+143.000000 141.000000 134.000000 129.000000 127.000000 128.000000 
+130.000000 132.000000 134.000000 133.000000 131.000000 131.000000 
+133.000000 132.000000 124.000000 115.000000 112.000000 116.000000 
+120.000000 115.000000 105.000000 98.000000 100.000000 107.000000 
+114.000000 118.000000 120.000000 121.000000 123.000000 126.000000 
+130.000000 135.000000 139.000000 141.000000 141.000000 139.000000 
+133.000000 126.000000 122.000000 123.000000 128.000000 130.000000 
+125.000000 120.000000 121.000000 123.000000 120.000000 112.000000 
+133.000000 136.000000 136.000000 132.000000 126.000000 123.000000 
+123.000000 126.000000 132.000000 133.000000 127.000000 114.000000 
+100.000000 85.000000 70.000000 67.000000 87.000000 125.000000 
+152.000000 150.000000 133.000000 122.000000 125.000000 130.000000 
+130.000000 129.000000 132.000000 136.000000 134.000000 131.000000 
+131.000000 130.000000 128.000000 127.000000 129.000000 132.000000 
+128.000000 119.000000 114.000000 118.000000 127.000000 132.000000 
+128.000000 122.000000 124.000000 134.000000 142.000000 135.000000 
+113.000000 91.000000 86.000000 94.000000 107.000000 120.000000 
+127.000000 129.000000 129.000000 130.000000 133.000000 136.000000 
+136.000000 135.000000 137.000000 137.000000 134.000000 129.000000 
+126.000000 127.000000 128.000000 124.000000 119.000000 120.000000 
+124.000000 126.000000 122.000000 120.000000 127.000000 128.000000 
+126.000000 123.000000 124.000000 125.000000 123.000000 121.000000 
+123.000000 127.000000 123.000000 108.000000 89.000000 77.000000 
+76.000000 87.000000 104.000000 119.000000 128.000000 133.000000 
+137.000000 138.000000 135.000000 131.000000 129.000000 130.000000 
+131.000000 132.000000 134.000000 134.000000 129.000000 122.000000 
+118.000000 122.000000 127.000000 128.000000 126.000000 125.000000 
+125.000000 127.000000 130.000000 132.000000 129.000000 118.000000 
+113.000000 129.000000 157.000000 166.000000 141.000000 92.000000 
+66.000000 78.000000 103.000000 120.000000 124.000000 125.000000 
+129.000000 135.000000 137.000000 137.000000 140.000000 146.000000 
+147.000000 139.000000 129.000000 126.000000 129.000000 132.000000 
+129.000000 124.000000 120.000000 117.000000 118.000000 121.000000 
+126.000000 130.000000 128.000000 127.000000 127.000000 129.000000 
+130.000000 129.000000 125.000000 125.000000 130.000000 131.000000 
+121.000000 102.000000 85.000000 84.000000 96.000000 108.000000 
+115.000000 117.000000 121.000000 127.000000 130.000000 130.000000 
+128.000000 129.000000 131.000000 134.000000 136.000000 136.000000 
+135.000000 132.000000 125.000000 119.000000 117.000000 122.000000 
+130.000000 135.000000 136.000000 134.000000 130.000000 125.000000 
+121.000000 122.000000 124.000000 120.000000 114.000000 125.000000 
+156.000000 182.000000 176.000000 134.000000 81.000000 70.000000 
+95.000000 117.000000 126.000000 130.000000 136.000000 137.000000 
+131.000000 126.000000 131.000000 139.000000 143.000000 141.000000 
+137.000000 132.000000 129.000000 129.000000 131.000000 130.000000 
+124.000000 119.000000 119.000000 122.000000 123.000000 124.000000 
+126.000000 126.000000 126.000000 125.000000 123.000000 122.000000 
+123.000000 128.000000 132.000000 126.000000 111.000000 98.000000 
+99.000000 110.000000 120.000000 119.000000 116.000000 119.000000 
+124.000000 127.000000 126.000000 128.000000 132.000000 133.000000 
+130.000000 129.000000 131.000000 136.000000 140.000000 138.000000 
+134.000000 129.000000 126.000000 127.000000 130.000000 131.000000 
+132.000000 133.000000 134.000000 130.000000 121.000000 117.000000 
+120.000000 123.000000 119.000000 117.000000 136.000000 167.000000 
+187.000000 176.000000 130.000000 89.000000 90.000000 108.000000 
+117.000000 124.000000 133.000000 137.000000 134.000000 130.000000 
+133.000000 141.000000 144.000000 141.000000 136.000000 133.000000 
+131.000000 129.000000 127.000000 126.000000 126.000000 126.000000 
+127.000000 128.000000 130.000000 133.000000 127.000000 128.000000 
+127.000000 126.000000 125.000000 124.000000 125.000000 132.000000 
+136.000000 125.000000 99.000000 82.000000 96.000000 139.000000 
+172.000000 170.000000 143.000000 121.000000 119.000000 132.000000 
+140.000000 136.000000 128.000000 125.000000 129.000000 132.000000 
+134.000000 134.000000 136.000000 136.000000 131.000000 124.000000 
+122.000000 127.000000 135.000000 140.000000 138.000000 133.000000 
+127.000000 124.000000 121.000000 119.000000 118.000000 120.000000 
+124.000000 131.000000 144.000000 161.000000 179.000000 187.000000 
+168.000000 128.000000 101.000000 98.000000 107.000000 122.000000 
+135.000000 140.000000 136.000000 132.000000 133.000000 139.000000 
+141.000000 136.000000 131.000000 129.000000 131.000000 132.000000 
+130.000000 128.000000 128.000000 129.000000 129.000000 128.000000 
+129.000000 131.000000 138.000000 134.000000 128.000000 126.000000 
+127.000000 124.000000 123.000000 130.000000 134.000000 120.000000 
+90.000000 73.000000 92.000000 136.000000 163.000000 152.000000 
+124.000000 108.000000 112.000000 121.000000 123.000000 121.000000 
+123.000000 128.000000 132.000000 132.000000 132.000000 132.000000 
+132.000000 131.000000 130.000000 129.000000 127.000000 126.000000 
+129.000000 132.000000 133.000000 132.000000 130.000000 127.000000 
+122.000000 116.000000 116.000000 124.000000 133.000000 136.000000 
+132.000000 129.000000 141.000000 164.000000 173.000000 155.000000 
+125.000000 103.000000 97.000000 108.000000 121.000000 127.000000 
+126.000000 126.000000 131.000000 133.000000 131.000000 128.000000 
+130.000000 133.000000 132.000000 128.000000 125.000000 125.000000 
+127.000000 128.000000 128.000000 129.000000 130.000000 128.000000 
+126.000000 128.000000 129.000000 128.000000 126.000000 124.000000 
+125.000000 128.000000 127.000000 111.000000 83.000000 62.000000 
+68.000000 95.000000 119.000000 122.000000 114.000000 113.000000 
+122.000000 131.000000 134.000000 135.000000 138.000000 141.000000 
+141.000000 139.000000 135.000000 132.000000 134.000000 138.000000 
+139.000000 136.000000 131.000000 129.000000 130.000000 131.000000 
+130.000000 130.000000 131.000000 130.000000 128.000000 125.000000 
+124.000000 124.000000 128.000000 134.000000 135.000000 130.000000 
+128.000000 143.000000 161.000000 161.000000 137.000000 105.000000 
+88.000000 96.000000 114.000000 125.000000 128.000000 131.000000 
+135.000000 135.000000 132.000000 128.000000 126.000000 124.000000 
+126.000000 131.000000 136.000000 135.000000 130.000000 127.000000 
+127.000000 129.000000 129.000000 127.000000 131.000000 134.000000 
+136.000000 133.000000 126.000000 124.000000 130.000000 136.000000 
+130.000000 107.000000 77.000000 58.000000 61.000000 81.000000 
+103.000000 116.000000 118.000000 118.000000 120.000000 124.000000 
+126.000000 128.000000 131.000000 135.000000 135.000000 131.000000 
+129.000000 129.000000 131.000000 132.000000 133.000000 134.000000 
+133.000000 130.000000 129.000000 130.000000 132.000000 133.000000 
+133.000000 131.000000 128.000000 127.000000 125.000000 123.000000 
+122.000000 125.000000 128.000000 128.000000 130.000000 140.000000 
+151.000000 151.000000 129.000000 92.000000 70.000000 79.000000 
+105.000000 120.000000 120.000000 121.000000 129.000000 136.000000 
+132.000000 125.000000 124.000000 127.000000 131.000000 133.000000 
+135.000000 133.000000 129.000000 125.000000 125.000000 127.000000 
+128.000000 127.000000 122.000000 121.000000 122.000000 126.000000 
+130.000000 132.000000 131.000000 125.000000 112.000000 94.000000 
+75.000000 67.000000 80.000000 107.000000 127.000000 130.000000 
+122.000000 119.000000 126.000000 133.000000 133.000000 129.000000 
+130.000000 132.000000 132.000000 131.000000 130.000000 130.000000 
+129.000000 128.000000 130.000000 131.000000 131.000000 129.000000 
+129.000000 130.000000 129.000000 126.000000 126.000000 130.000000 
+132.000000 131.000000 129.000000 131.000000 134.000000 135.000000 
+132.000000 127.000000 124.000000 129.000000 140.000000 145.000000 
+132.000000 99.000000 68.000000 66.000000 90.000000 112.000000 
+120.000000 121.000000 125.000000 128.000000 127.000000 125.000000 
+127.000000 133.000000 138.000000 139.000000 136.000000 133.000000 
+132.000000 132.000000 130.000000 127.000000 123.000000 122.000000 
+127.000000 129.000000 125.000000 126.000000 133.000000 139.000000 
+133.000000 118.000000 99.000000 76.000000 62.000000 72.000000 
+105.000000 135.000000 142.000000 128.000000 116.000000 118.000000 
+125.000000 124.000000 118.000000 118.000000 124.000000 127.000000 
+126.000000 126.000000 128.000000 132.000000 134.000000 135.000000 
+135.000000 134.000000 131.000000 129.000000 128.000000 127.000000 
+126.000000 127.000000 132.000000 135.000000 134.000000 129.000000 
+125.000000 127.000000 131.000000 134.000000 130.000000 122.000000 
+119.000000 130.000000 149.000000 157.000000 143.000000 108.000000 
+72.000000 63.000000 81.000000 105.000000 117.000000 122.000000 
+128.000000 134.000000 133.000000 126.000000 122.000000 123.000000 
+128.000000 130.000000 131.000000 132.000000 130.000000 123.000000 
+114.000000 113.000000 121.000000 131.000000 123.000000 123.000000 
+122.000000 125.000000 131.000000 134.000000 125.000000 105.000000 
+81.000000 67.000000 79.000000 115.000000 143.000000 146.000000 
+136.000000 124.000000 122.000000 124.000000 123.000000 123.000000 
+126.000000 131.000000 132.000000 128.000000 124.000000 124.000000 
+125.000000 128.000000 132.000000 133.000000 129.000000 124.000000 
+126.000000 131.000000 133.000000 129.000000 127.000000 129.000000 
+131.000000 130.000000 128.000000 129.000000 129.000000 129.000000 
+130.000000 132.000000 131.000000 125.000000 125.000000 141.000000 
+169.000000 180.000000 160.000000 120.000000 86.000000 72.000000 
+77.000000 89.000000 99.000000 111.000000 124.000000 133.000000 
+133.000000 128.000000 126.000000 127.000000 130.000000 131.000000 
+131.000000 132.000000 134.000000 132.000000 126.000000 120.000000 
+118.000000 121.000000 117.000000 118.000000 121.000000 127.000000 
+130.000000 124.000000 108.000000 95.000000 99.000000 109.000000 
+112.000000 116.000000 125.000000 122.000000 92.000000 45.000000 
+8.000000 7.000000 9.000000 15.000000 17.000000 14.000000 
+12.000000 11.000000 10.000000 9.000000 10.000000 12.000000 
+11.000000 7.000000 8.000000 9.000000 10.000000 9.000000 
+6.000000 9.000000 10.000000 7.000000 6.000000 5.000000 
+9.000000 14.000000 13.000000 10.000000 10.000000 9.000000 
+9.000000 9.000000 7.000000 10.000000 3.000000 14.000000 
+47.000000 69.000000 54.000000 28.000000 36.000000 59.000000 
+71.000000 70.000000 51.000000 21.000000 7.000000 6.000000 
+9.000000 15.000000 26.000000 45.000000 69.000000 94.000000 
+110.000000 118.000000 123.000000 129.000000 132.000000 133.000000 
+120.000000 121.000000 121.000000 126.000000 139.000000 145.000000 
+130.000000 101.000000 82.000000 82.000000 92.000000 104.000000 
+122.000000 136.000000 122.000000 73.000000 18.000000 7.000000 
+14.000000 10.000000 12.000000 9.000000 9.000000 9.000000 
+6.000000 7.000000 11.000000 13.000000 12.000000 9.000000 
+8.000000 9.000000 9.000000 6.000000 5.000000 6.000000 
+10.000000 9.000000 10.000000 13.000000 15.000000 13.000000 
+10.000000 8.000000 9.000000 8.000000 7.000000 8.000000 
+8.000000 9.000000 4.000000 19.000000 51.000000 68.000000 
+52.000000 26.000000 33.000000 56.000000 67.000000 63.000000 
+47.000000 34.000000 34.000000 37.000000 34.000000 41.000000 
+68.000000 101.000000 125.000000 132.000000 128.000000 125.000000 
+128.000000 134.000000 137.000000 136.000000 124.000000 125.000000 
+125.000000 128.000000 135.000000 139.000000 130.000000 110.000000 
+88.000000 78.000000 79.000000 89.000000 112.000000 137.000000 
+138.000000 98.000000 42.000000 14.000000 18.000000 15.000000 
+11.000000 6.000000 6.000000 7.000000 8.000000 8.000000 
+7.000000 6.000000 9.000000 10.000000 6.000000 6.000000 
+9.000000 10.000000 9.000000 7.000000 10.000000 10.000000 
+14.000000 14.000000 9.000000 8.000000 12.000000 14.000000 
+7.000000 6.000000 11.000000 10.000000 12.000000 10.000000 
+10.000000 29.000000 46.000000 46.000000 33.000000 24.000000 
+39.000000 67.000000 88.000000 96.000000 96.000000 91.000000 
+82.000000 72.000000 73.000000 96.000000 127.000000 142.000000 
+136.000000 122.000000 115.000000 118.000000 123.000000 125.000000 
+125.000000 124.000000 126.000000 125.000000 122.000000 120.000000 
+124.000000 132.000000 136.000000 128.000000 108.000000 87.000000 
+78.000000 84.000000 103.000000 123.000000 127.000000 106.000000 
+75.000000 57.000000 61.000000 65.000000 57.000000 40.000000 
+26.000000 18.000000 13.000000 9.000000 7.000000 7.000000 
+10.000000 11.000000 8.000000 8.000000 9.000000 13.000000 
+17.000000 14.000000 10.000000 8.000000 10.000000 11.000000 
+8.000000 8.000000 12.000000 18.000000 20.000000 24.000000 
+25.000000 15.000000 6.000000 4.000000 10.000000 24.000000 
+36.000000 36.000000 30.000000 36.000000 60.000000 89.000000 
+107.000000 111.000000 105.000000 99.000000 96.000000 95.000000 
+101.000000 117.000000 130.000000 130.000000 124.000000 121.000000 
+121.000000 118.000000 113.000000 113.000000 117.000000 118.000000 
+125.000000 118.000000 113.000000 113.000000 118.000000 125.000000 
+135.000000 141.000000 135.000000 114.000000 89.000000 77.000000 
+83.000000 96.000000 101.000000 106.000000 118.000000 133.000000 
+137.000000 132.000000 118.000000 93.000000 59.000000 26.000000 
+8.000000 14.000000 14.000000 13.000000 13.000000 12.000000 
+12.000000 14.000000 12.000000 9.000000 12.000000 14.000000 
+10.000000 7.000000 5.000000 8.000000 13.000000 15.000000 
+14.000000 13.000000 15.000000 20.000000 24.000000 26.000000 
+23.000000 17.000000 17.000000 33.000000 46.000000 46.000000 
+45.000000 55.000000 77.000000 95.000000 98.000000 92.000000 
+88.000000 90.000000 97.000000 105.000000 113.000000 120.000000 
+122.000000 120.000000 119.000000 122.000000 124.000000 123.000000 
+123.000000 123.000000 121.000000 117.000000 118.000000 113.000000 
+111.000000 111.000000 114.000000 126.000000 142.000000 150.000000 
+141.000000 118.000000 92.000000 70.000000 60.000000 64.000000 
+82.000000 114.000000 146.000000 183.000000 240.000000 281.000000 
+257.000000 171.000000 78.000000 31.000000 30.000000 36.000000 
+22.000000 16.000000 14.000000 8.000000 11.000000 16.000000 
+12.000000 11.000000 11.000000 13.000000 14.000000 14.000000 
+10.000000 8.000000 13.000000 19.000000 20.000000 18.000000 
+16.000000 19.000000 26.000000 28.000000 30.000000 52.000000 
+48.000000 11.000000 29.000000 75.000000 78.000000 71.000000 
+85.000000 99.000000 98.000000 89.000000 88.000000 95.000000 
+105.000000 114.000000 120.000000 122.000000 123.000000 125.000000 
+125.000000 123.000000 122.000000 125.000000 127.000000 125.000000 
+119.000000 119.000000 121.000000 120.000000 121.000000 119.000000 
+117.000000 120.000000 129.000000 140.000000 138.000000 115.000000 
+77.000000 45.000000 36.000000 51.000000 88.000000 133.000000 
+185.000000 291.000000 407.000000 434.000000 333.000000 181.000000 
+87.000000 51.000000 39.000000 25.000000 23.000000 20.000000 
+14.000000 8.000000 20.000000 26.000000 20.000000 10.000000 
+17.000000 21.000000 14.000000 9.000000 10.000000 8.000000 
+7.000000 12.000000 21.000000 21.000000 16.000000 24.000000 
+46.000000 62.000000 54.000000 45.000000 88.000000 102.000000 
+79.000000 48.000000 74.000000 93.000000 85.000000 81.000000 
+78.000000 76.000000 80.000000 95.000000 116.000000 128.000000 
+128.000000 123.000000 119.000000 120.000000 123.000000 129.000000 
+133.000000 131.000000 125.000000 121.000000 126.000000 134.000000 
+122.000000 127.000000 131.000000 130.000000 121.000000 115.000000 
+123.000000 137.000000 136.000000 108.000000 71.000000 48.000000 
+42.000000 51.000000 83.000000 143.000000 264.000000 411.000000 
+462.000000 372.000000 227.000000 141.000000 104.000000 71.000000 
+40.000000 31.000000 38.000000 21.000000 21.000000 23.000000 
+20.000000 18.000000 20.000000 13.000000 16.000000 15.000000 
+12.000000 12.000000 11.000000 16.000000 14.000000 15.000000 
+27.000000 32.000000 25.000000 26.000000 47.000000 61.000000 
+90.000000 98.000000 159.000000 246.000000 214.000000 92.000000 
+87.000000 114.000000 79.000000 52.000000 63.000000 83.000000 
+91.000000 99.000000 118.000000 135.000000 138.000000 130.000000 
+123.000000 125.000000 132.000000 138.000000 137.000000 130.000000 
+123.000000 123.000000 129.000000 134.000000 130.000000 142.000000 
+146.000000 137.000000 123.000000 118.000000 129.000000 138.000000 
+129.000000 106.000000 87.000000 73.000000 56.000000 42.000000 
+66.000000 166.000000 345.000000 449.000000 385.000000 229.000000 
+130.000000 121.000000 105.000000 71.000000 47.000000 53.000000 
+50.000000 16.000000 27.000000 33.000000 15.000000 14.000000 
+11.000000 14.000000 13.000000 10.000000 12.000000 15.000000 
+21.000000 23.000000 22.000000 28.000000 33.000000 32.000000 
+28.000000 35.000000 43.000000 58.000000 121.000000 182.000000 
+251.000000 315.000000 276.000000 181.000000 134.000000 103.000000 
+65.000000 60.000000 84.000000 96.000000 92.000000 96.000000 
+114.000000 129.000000 132.000000 131.000000 134.000000 141.000000 
+145.000000 142.000000 132.000000 126.000000 128.000000 129.000000 
+125.000000 121.000000 140.000000 152.000000 152.000000 140.000000 
+129.000000 128.000000 131.000000 134.000000 134.000000 126.000000 
+107.000000 85.000000 71.000000 68.000000 88.000000 152.000000 
+260.000000 299.000000 222.000000 120.000000 85.000000 93.000000 
+87.000000 56.000000 33.000000 33.000000 40.000000 23.000000 
+13.000000 14.000000 13.000000 15.000000 10.000000 17.000000 
+16.000000 12.000000 11.000000 15.000000 30.000000 22.000000 
+18.000000 28.000000 29.000000 27.000000 18.000000 37.000000 
+59.000000 71.000000 122.000000 189.000000 278.000000 320.000000 
+257.000000 178.000000 121.000000 71.000000 56.000000 75.000000 
+89.000000 84.000000 84.000000 102.000000 122.000000 127.000000 
+125.000000 127.000000 132.000000 136.000000 137.000000 135.000000 
+132.000000 132.000000 136.000000 133.000000 124.000000 121.000000 
+138.000000 145.000000 141.000000 131.000000 125.000000 130.000000 
+136.000000 139.000000 141.000000 138.000000 120.000000 92.000000 
+80.000000 94.000000 114.000000 122.000000 131.000000 132.000000 
+112.000000 86.000000 66.000000 51.000000 41.000000 26.000000 
+18.000000 12.000000 17.000000 29.000000 17.000000 7.000000 
+10.000000 12.000000 15.000000 21.000000 19.000000 14.000000 
+13.000000 13.000000 19.000000 19.000000 20.000000 23.000000 
+18.000000 18.000000 23.000000 41.000000 51.000000 52.000000 
+99.000000 181.000000 261.000000 280.000000 219.000000 142.000000 
+85.000000 62.000000 73.000000 85.000000 80.000000 75.000000 
+90.000000 115.000000 127.000000 127.000000 129.000000 130.000000 
+127.000000 126.000000 129.000000 135.000000 136.000000 135.000000 
+137.000000 138.000000 137.000000 134.000000 141.000000 140.000000 
+131.000000 120.000000 120.000000 130.000000 139.000000 142.000000 
+142.000000 139.000000 127.000000 105.000000 85.000000 84.000000 
+96.000000 101.000000 96.000000 94.000000 98.000000 97.000000 
+84.000000 71.000000 51.000000 34.000000 32.000000 29.000000 
+24.000000 24.000000 12.000000 10.000000 12.000000 11.000000 
+10.000000 15.000000 26.000000 32.000000 29.000000 15.000000 
+10.000000 16.000000 19.000000 15.000000 14.000000 19.000000 
+26.000000 29.000000 31.000000 33.000000 84.000000 183.000000 
+257.000000 242.000000 175.000000 110.000000 64.000000 59.000000 
+81.000000 92.000000 84.000000 83.000000 103.000000 125.000000 
+129.000000 127.000000 129.000000 129.000000 125.000000 125.000000 
+134.000000 142.000000 137.000000 129.000000 129.000000 135.000000 
+140.000000 140.000000 145.000000 137.000000 123.000000 116.000000 
+124.000000 135.000000 138.000000 134.000000 134.000000 139.000000 
+140.000000 127.000000 103.000000 84.000000 82.000000 89.000000 
+94.000000 87.000000 74.000000 66.000000 77.000000 101.000000 
+108.000000 87.000000 67.000000 61.000000 55.000000 48.000000 
+49.000000 66.000000 64.000000 50.000000 48.000000 52.000000 
+52.000000 44.000000 28.000000 16.000000 13.000000 11.000000 
+9.000000 8.000000 15.000000 34.000000 39.000000 26.000000 
+39.000000 45.000000 79.000000 177.000000 245.000000 207.000000 
+140.000000 91.000000 61.000000 59.000000 74.000000 82.000000 
+82.000000 90.000000 111.000000 125.000000 126.000000 126.000000 
+128.000000 125.000000 121.000000 128.000000 141.000000 142.000000 
+132.000000 124.000000 123.000000 126.000000 129.000000 134.000000 
+142.000000 131.000000 116.000000 113.000000 127.000000 140.000000 
+137.000000 125.000000 122.000000 134.000000 146.000000 139.000000 
+109.000000 80.000000 76.000000 91.000000 102.000000 89.000000 
+61.000000 56.000000 92.000000 140.000000 159.000000 142.000000 
+113.000000 101.000000 96.000000 98.000000 115.000000 130.000000 
+128.000000 119.000000 121.000000 117.000000 100.000000 83.000000 
+70.000000 58.000000 44.000000 26.000000 22.000000 20.000000 
+13.000000 41.000000 57.000000 34.000000 60.000000 77.000000 
+90.000000 167.000000 217.000000 174.000000 116.000000 80.000000 
+64.000000 64.000000 66.000000 69.000000 77.000000 97.000000 
+118.000000 128.000000 130.000000 131.000000 126.000000 116.000000 
+118.000000 134.000000 143.000000 137.000000 127.000000 126.000000 
+129.000000 126.000000 124.000000 129.000000 137.000000 123.000000 
+111.000000 117.000000 134.000000 142.000000 132.000000 117.000000 
+115.000000 129.000000 146.000000 142.000000 111.000000 74.000000 
+61.000000 75.000000 89.000000 79.000000 64.000000 88.000000 
+167.000000 256.000000 282.000000 242.000000 187.000000 152.000000 
+131.000000 125.000000 137.000000 147.000000 148.000000 147.000000 
+143.000000 131.000000 121.000000 123.000000 127.000000 112.000000 
+82.000000 47.000000 43.000000 35.000000 12.000000 45.000000 
+55.000000 25.000000 66.000000 99.000000 115.000000 168.000000 
+191.000000 153.000000 103.000000 67.000000 56.000000 61.000000 
+67.000000 73.000000 86.000000 110.000000 132.000000 141.000000 
+141.000000 134.000000 120.000000 111.000000 122.000000 142.000000 
+146.000000 135.000000 126.000000 128.000000 127.000000 122.000000 
+121.000000 128.000000 129.000000 115.000000 114.000000 131.000000 
+145.000000 142.000000 128.000000 116.000000 116.000000 128.000000 
+143.000000 147.000000 128.000000 95.000000 73.000000 71.000000 
+72.000000 61.000000 70.000000 114.000000 230.000000 368.000000 
+424.000000 375.000000 280.000000 198.000000 143.000000 128.000000 
+143.000000 149.000000 139.000000 132.000000 132.000000 128.000000 
+127.000000 135.000000 139.000000 126.000000 99.000000 83.000000 
+99.000000 78.000000 33.000000 69.000000 84.000000 64.000000 
+83.000000 117.000000 170.000000 210.000000 185.000000 125.000000 
+81.000000 67.000000 71.000000 74.000000 71.000000 70.000000 
+82.000000 104.000000 124.000000 134.000000 135.000000 126.000000 
+114.000000 118.000000 136.000000 150.000000 144.000000 130.000000 
+126.000000 130.000000 131.000000 127.000000 127.000000 132.000000 
+126.000000 122.000000 130.000000 142.000000 144.000000 139.000000 
+130.000000 125.000000 123.000000 127.000000 138.000000 148.000000 
+141.000000 117.000000 94.000000 83.000000 75.000000 74.000000 
+92.000000 131.000000 252.000000 398.000000 466.000000 429.000000 
+326.000000 215.000000 142.000000 123.000000 136.000000 138.000000 
+125.000000 121.000000 131.000000 141.000000 140.000000 135.000000 
+135.000000 132.000000 118.000000 126.000000 153.000000 128.000000 
+82.000000 102.000000 116.000000 111.000000 103.000000 156.000000 
+254.000000 283.000000 214.000000 124.000000 84.000000 86.000000 
+92.000000 85.000000 72.000000 65.000000 72.000000 87.000000 
+108.000000 127.000000 130.000000 118.000000 114.000000 131.000000 
+150.000000 150.000000 137.000000 129.000000 132.000000 133.000000 
+129.000000 126.000000 126.000000 123.000000 122.000000 124.000000 
+134.000000 140.000000 135.000000 126.000000 122.000000 126.000000 
+130.000000 132.000000 135.000000 137.000000 130.000000 119.000000 
+110.000000 101.000000 93.000000 99.000000 117.000000 151.000000 
+242.000000 349.000000 401.000000 380.000000 305.000000 207.000000 
+136.000000 118.000000 131.000000 141.000000 133.000000 129.000000 
+135.000000 139.000000 128.000000 117.000000 123.000000 132.000000 
+126.000000 126.000000 143.000000 142.000000 129.000000 118.000000 
+93.000000 92.000000 137.000000 230.000000 302.000000 289.000000 
+209.000000 136.000000 107.000000 95.000000 74.000000 61.000000 
+70.000000 87.000000 94.000000 97.000000 110.000000 126.000000 
+124.000000 112.000000 119.000000 142.000000 153.000000 141.000000 
+128.000000 131.000000 136.000000 129.000000 121.000000 124.000000 
+128.000000 122.000000 120.000000 117.000000 126.000000 135.000000 
+133.000000 128.000000 129.000000 135.000000 137.000000 133.000000 
+128.000000 124.000000 122.000000 124.000000 123.000000 115.000000 
+104.000000 108.000000 129.000000 163.000000 225.000000 289.000000 
+319.000000 311.000000 265.000000 195.000000 138.000000 124.000000 
+134.000000 143.000000 137.000000 135.000000 141.000000 138.000000 
+123.000000 117.000000 126.000000 132.000000 122.000000 116.000000 
+125.000000 139.000000 149.000000 128.000000 100.000000 140.000000 
+233.000000 287.000000 271.000000 206.000000 144.000000 108.000000 
+90.000000 75.000000 55.000000 51.000000 75.000000 107.000000 
+118.000000 114.000000 114.000000 120.000000 119.000000 119.000000 
+131.000000 145.000000 146.000000 137.000000 134.000000 142.000000 
+145.000000 138.000000 129.000000 127.000000 127.000000 122.000000 
+129.000000 126.000000 129.000000 130.000000 129.000000 132.000000 
+139.000000 143.000000 139.000000 129.000000 123.000000 123.000000 
+128.000000 130.000000 125.000000 115.000000 107.000000 114.000000 
+131.000000 166.000000 224.000000 271.000000 292.000000 284.000000 
+242.000000 182.000000 141.000000 132.000000 137.000000 139.000000 
+134.000000 138.000000 144.000000 139.000000 127.000000 123.000000 
+126.000000 125.000000 122.000000 122.000000 122.000000 128.000000 
+142.000000 133.000000 156.000000 252.000000 310.000000 285.000000 
+212.000000 150.000000 127.000000 109.000000 85.000000 68.000000 
+69.000000 85.000000 102.000000 113.000000 115.000000 113.000000 
+114.000000 119.000000 128.000000 137.000000 143.000000 142.000000 
+139.000000 140.000000 145.000000 150.000000 147.000000 138.000000 
+130.000000 126.000000 125.000000 121.000000 143.000000 136.000000 
+128.000000 121.000000 118.000000 123.000000 134.000000 140.000000 
+137.000000 127.000000 122.000000 126.000000 133.000000 135.000000 
+127.000000 115.000000 108.000000 110.000000 123.000000 160.000000 
+221.000000 275.000000 306.000000 298.000000 248.000000 182.000000 
+141.000000 130.000000 135.000000 135.000000 131.000000 131.000000 
+134.000000 133.000000 131.000000 129.000000 127.000000 125.000000 
+130.000000 135.000000 131.000000 132.000000 140.000000 132.000000 
+183.000000 292.000000 352.000000 317.000000 241.000000 185.000000 
+151.000000 119.000000 91.000000 81.000000 94.000000 113.000000 
+121.000000 118.000000 118.000000 124.000000 129.000000 132.000000 
+135.000000 140.000000 142.000000 138.000000 135.000000 135.000000 
+138.000000 136.000000 133.000000 132.000000 133.000000 132.000000 
+125.000000 118.000000 141.000000 131.000000 124.000000 119.000000 
+118.000000 122.000000 130.000000 135.000000 135.000000 130.000000 
+124.000000 124.000000 128.000000 131.000000 123.000000 109.000000 
+97.000000 99.000000 121.000000 167.000000 232.000000 297.000000 
+330.000000 307.000000 236.000000 155.000000 114.000000 112.000000 
+127.000000 136.000000 136.000000 133.000000 130.000000 128.000000 
+128.000000 129.000000 130.000000 137.000000 145.000000 143.000000 
+125.000000 116.000000 124.000000 131.000000 178.000000 279.000000 
+363.000000 379.000000 329.000000 237.000000 149.000000 105.000000 
+101.000000 109.000000 114.000000 118.000000 126.000000 131.000000 
+129.000000 126.000000 126.000000 131.000000 135.000000 140.000000 
+144.000000 145.000000 140.000000 134.000000 130.000000 130.000000 
+132.000000 134.000000 136.000000 134.000000 128.000000 122.000000 
+128.000000 127.000000 125.000000 121.000000 119.000000 121.000000 
+124.000000 127.000000 129.000000 127.000000 120.000000 113.000000 
+116.000000 124.000000 124.000000 114.000000 102.000000 105.000000 
+128.000000 178.000000 244.000000 299.000000 307.000000 254.000000 
+166.000000 103.000000 93.000000 110.000000 130.000000 142.000000 
+146.000000 145.000000 134.000000 122.000000 118.000000 124.000000 
+136.000000 149.000000 152.000000 131.000000 97.000000 79.000000 
+89.000000 118.000000 173.000000 250.000000 314.000000 326.000000 
+277.000000 188.000000 118.000000 99.000000 115.000000 126.000000 
+121.000000 114.000000 119.000000 126.000000 124.000000 118.000000 
+118.000000 124.000000 129.000000 133.000000 136.000000 138.000000 
+137.000000 133.000000 133.000000 134.000000 134.000000 132.000000 
+130.000000 131.000000 132.000000 133.000000 130.000000 131.000000 
+128.000000 122.000000 116.000000 113.000000 115.000000 120.000000 
+122.000000 120.000000 114.000000 113.000000 118.000000 125.000000 
+126.000000 119.000000 106.000000 99.000000 118.000000 169.000000 
+226.000000 252.000000 228.000000 166.000000 105.000000 79.000000 
+86.000000 108.000000 120.000000 133.000000 149.000000 158.000000 
+157.000000 151.000000 144.000000 142.000000 147.000000 150.000000 
+138.000000 110.000000 81.000000 70.000000 74.000000 95.000000 
+147.000000 221.000000 262.000000 238.000000 168.000000 107.000000 
+85.000000 95.000000 111.000000 119.000000 122.000000 125.000000 
+127.000000 126.000000 123.000000 121.000000 121.000000 123.000000 
+127.000000 130.000000 133.000000 135.000000 137.000000 137.000000 
+133.000000 127.000000 124.000000 125.000000 126.000000 126.000000 
+128.000000 132.000000 125.000000 116.000000 117.000000 120.000000 
+117.000000 111.000000 111.000000 118.000000 121.000000 116.000000 
+112.000000 115.000000 122.000000 125.000000 124.000000 116.000000 
+100.000000 87.000000 101.000000 146.000000 192.000000 197.000000 
+160.000000 118.000000 96.000000 77.000000 51.000000 48.000000 
+72.000000 124.000000 168.000000 184.000000 184.000000 182.000000 
+174.000000 164.000000 160.000000 154.000000 130.000000 97.000000 
+80.000000 79.000000 79.000000 83.000000 107.000000 151.000000 
+181.000000 159.000000 110.000000 84.000000 92.000000 109.000000 
+116.000000 117.000000 123.000000 127.000000 123.000000 121.000000 
+124.000000 127.000000 122.000000 117.000000 121.000000 131.000000 
+136.000000 135.000000 136.000000 137.000000 133.000000 125.000000 
+122.000000 125.000000 130.000000 133.000000 134.000000 135.000000 
+148.000000 137.000000 127.000000 118.000000 110.000000 107.000000 
+107.000000 109.000000 112.000000 116.000000 119.000000 121.000000 
+124.000000 130.000000 132.000000 123.000000 103.000000 87.000000 
+90.000000 108.000000 128.000000 134.000000 121.000000 104.000000 
+92.000000 74.000000 47.000000 35.000000 54.000000 96.000000 
+136.000000 159.000000 170.000000 174.000000 173.000000 168.000000 
+158.000000 138.000000 102.000000 63.000000 51.000000 65.000000 
+79.000000 86.000000 91.000000 91.000000 88.000000 84.000000 
+82.000000 84.000000 94.000000 108.000000 116.000000 120.000000 
+123.000000 124.000000 123.000000 123.000000 126.000000 129.000000 
+125.000000 119.000000 117.000000 122.000000 129.000000 134.000000 
+135.000000 134.000000 131.000000 127.000000 124.000000 126.000000 
+131.000000 136.000000 137.000000 136.000000 145.000000 148.000000 
+137.000000 115.000000 100.000000 103.000000 113.000000 118.000000 
+119.000000 122.000000 124.000000 123.000000 122.000000 127.000000 
+132.000000 121.000000 98.000000 80.000000 79.000000 90.000000 
+101.000000 104.000000 93.000000 72.000000 59.000000 58.000000 
+71.000000 84.000000 78.000000 67.000000 74.000000 88.000000 
+101.000000 109.000000 114.000000 109.000000 92.000000 69.000000 
+51.000000 46.000000 48.000000 55.000000 65.000000 72.000000 
+80.000000 84.000000 82.000000 85.000000 94.000000 94.000000 
+89.000000 92.000000 105.000000 120.000000 123.000000 122.000000 
+125.000000 134.000000 138.000000 132.000000 123.000000 119.000000 
+121.000000 127.000000 132.000000 136.000000 135.000000 131.000000 
+128.000000 126.000000 124.000000 122.000000 125.000000 131.000000 
+135.000000 134.000000 113.000000 118.000000 120.000000 117.000000 
+114.000000 115.000000 119.000000 125.000000 128.000000 127.000000 
+123.000000 121.000000 124.000000 128.000000 126.000000 113.000000 
+94.000000 82.000000 81.000000 87.000000 92.000000 91.000000 
+87.000000 84.000000 82.000000 82.000000 84.000000 87.000000 
+88.000000 82.000000 65.000000 47.000000 34.000000 33.000000 
+42.000000 53.000000 59.000000 59.000000 59.000000 61.000000 
+69.000000 76.000000 78.000000 77.000000 75.000000 72.000000 
+72.000000 78.000000 88.000000 93.000000 95.000000 100.000000 
+113.000000 124.000000 125.000000 120.000000 121.000000 130.000000 
+139.000000 138.000000 128.000000 119.000000 117.000000 123.000000 
+131.000000 133.000000 131.000000 129.000000 127.000000 124.000000 
+120.000000 118.000000 123.000000 131.000000 135.000000 133.000000 
+127.000000 119.000000 118.000000 126.000000 132.000000 129.000000 
+123.000000 122.000000 126.000000 130.000000 130.000000 127.000000 
+125.000000 125.000000 125.000000 119.000000 106.000000 90.000000 
+78.000000 74.000000 76.000000 82.000000 90.000000 97.000000 
+100.000000 96.000000 93.000000 95.000000 91.000000 77.000000 
+60.000000 51.000000 57.000000 69.000000 74.000000 72.000000 
+73.000000 83.000000 93.000000 90.000000 80.000000 71.000000 
+65.000000 60.000000 63.000000 72.000000 82.000000 85.000000 
+82.000000 80.000000 85.000000 97.000000 112.000000 124.000000 
+129.000000 128.000000 125.000000 126.000000 130.000000 133.000000 
+129.000000 123.000000 121.000000 125.000000 130.000000 131.000000 
+131.000000 130.000000 127.000000 123.000000 120.000000 124.000000 
+131.000000 134.000000 130.000000 125.000000 135.000000 131.000000 
+130.000000 131.000000 130.000000 128.000000 122.000000 117.000000 
+116.000000 121.000000 127.000000 129.000000 127.000000 126.000000 
+124.000000 117.000000 103.000000 87.000000 78.000000 77.000000 
+81.000000 85.000000 88.000000 90.000000 94.000000 95.000000 
+89.000000 75.000000 68.000000 71.000000 75.000000 75.000000 
+69.000000 56.000000 42.000000 34.000000 41.000000 61.000000 
+86.000000 97.000000 86.000000 66.000000 55.000000 59.000000 
+71.000000 83.000000 89.000000 85.000000 76.000000 72.000000 
+81.000000 99.000000 113.000000 119.000000 121.000000 123.000000 
+127.000000 129.000000 130.000000 130.000000 126.000000 122.000000 
+121.000000 124.000000 127.000000 129.000000 132.000000 132.000000 
+125.000000 117.000000 117.000000 125.000000 133.000000 132.000000 
+126.000000 123.000000 126.000000 127.000000 125.000000 122.000000 
+119.000000 120.000000 120.000000 120.000000 121.000000 124.000000 
+127.000000 130.000000 134.000000 136.000000 128.000000 110.000000 
+92.000000 84.000000 82.000000 82.000000 87.000000 98.000000 
+105.000000 98.000000 84.000000 71.000000 53.000000 32.000000 
+32.000000 88.000000 189.000000 261.000000 229.000000 129.000000 
+56.000000 41.000000 49.000000 42.000000 38.000000 52.000000 
+77.000000 95.000000 96.000000 87.000000 79.000000 73.000000 
+72.000000 74.000000 77.000000 80.000000 88.000000 103.000000 
+115.000000 119.000000 118.000000 121.000000 130.000000 135.000000 
+133.000000 125.000000 118.000000 112.000000 111.000000 118.000000 
+127.000000 131.000000 130.000000 126.000000 124.000000 123.000000 
+124.000000 126.000000 127.000000 126.000000 125.000000 126.000000 
+133.000000 129.000000 125.000000 123.000000 122.000000 121.000000 
+121.000000 124.000000 126.000000 126.000000 123.000000 123.000000 
+127.000000 131.000000 124.000000 106.000000 88.000000 84.000000 
+91.000000 101.000000 110.000000 113.000000 103.000000 83.000000 
+64.000000 52.000000 39.000000 31.000000 36.000000 139.000000 
+326.000000 452.000000 413.000000 252.000000 111.000000 58.000000 
+54.000000 52.000000 45.000000 45.000000 60.000000 78.000000 
+90.000000 97.000000 98.000000 90.000000 77.000000 73.000000 
+78.000000 86.000000 94.000000 107.000000 122.000000 127.000000 
+122.000000 119.000000 125.000000 131.000000 132.000000 125.000000 
+115.000000 109.000000 112.000000 125.000000 141.000000 143.000000 
+132.000000 121.000000 121.000000 126.000000 125.000000 121.000000 
+119.000000 123.000000 126.000000 127.000000 126.000000 119.000000 
+115.000000 121.000000 132.000000 135.000000 129.000000 122.000000 
+120.000000 123.000000 127.000000 131.000000 134.000000 133.000000 
+126.000000 109.000000 91.000000 83.000000 91.000000 104.000000 
+111.000000 112.000000 111.000000 106.000000 89.000000 63.000000 
+42.000000 46.000000 73.000000 160.000000 295.000000 389.000000 
+385.000000 294.000000 173.000000 80.000000 45.000000 43.000000 
+47.000000 48.000000 51.000000 62.000000 75.000000 86.000000 
+92.000000 97.000000 98.000000 91.000000 84.000000 86.000000 
+96.000000 110.000000 122.000000 128.000000 129.000000 129.000000 
+130.000000 133.000000 135.000000 134.000000 131.000000 129.000000 
+128.000000 130.000000 133.000000 132.000000 129.000000 126.000000 
+126.000000 129.000000 128.000000 123.000000 120.000000 122.000000 
+125.000000 125.000000 125.000000 120.000000 118.000000 125.000000 
+133.000000 132.000000 123.000000 115.000000 117.000000 123.000000 
+128.000000 131.000000 135.000000 134.000000 122.000000 105.000000 
+98.000000 104.000000 109.000000 103.000000 94.000000 99.000000 
+118.000000 134.000000 133.000000 118.000000 97.000000 84.000000 
+91.000000 141.000000 232.000000 284.000000 260.000000 186.000000 
+112.000000 65.000000 50.000000 54.000000 57.000000 52.000000 
+50.000000 59.000000 73.000000 83.000000 90.000000 99.000000 
+107.000000 108.000000 101.000000 92.000000 92.000000 103.000000 
+117.000000 125.000000 128.000000 128.000000 127.000000 127.000000 
+129.000000 133.000000 133.000000 125.000000 115.000000 113.000000 
+118.000000 123.000000 124.000000 123.000000 120.000000 122.000000 
+126.000000 127.000000 123.000000 118.000000 118.000000 125.000000 
+127.000000 124.000000 121.000000 122.000000 122.000000 116.000000 
+107.000000 106.000000 115.000000 127.000000 133.000000 133.000000 
+131.000000 127.000000 114.000000 98.000000 90.000000 96.000000 
+104.000000 103.000000 96.000000 93.000000 102.000000 115.000000 
+124.000000 121.000000 104.000000 80.000000 68.000000 74.000000 
+110.000000 141.000000 132.000000 98.000000 75.000000 75.000000 
+83.000000 88.000000 84.000000 77.000000 70.000000 68.000000 
+73.000000 85.000000 98.000000 108.000000 111.000000 109.000000 
+106.000000 105.000000 107.000000 112.000000 118.000000 120.000000 
+120.000000 127.000000 137.000000 142.000000 138.000000 133.000000 
+133.000000 136.000000 137.000000 130.000000 120.000000 115.000000 
+117.000000 123.000000 127.000000 124.000000 119.000000 118.000000 
+121.000000 123.000000 119.000000 113.000000 120.000000 127.000000 
+131.000000 125.000000 115.000000 114.000000 122.000000 131.000000 
+129.000000 118.000000 114.000000 122.000000 128.000000 122.000000 
+106.000000 95.000000 93.000000 95.000000 93.000000 86.000000 
+83.000000 92.000000 110.000000 132.000000 146.000000 148.000000 
+143.000000 143.000000 145.000000 137.000000 109.000000 73.000000 
+54.000000 63.000000 91.000000 117.000000 129.000000 126.000000 
+118.000000 113.000000 109.000000 104.000000 101.000000 106.000000 
+116.000000 121.000000 113.000000 102.000000 102.000000 109.000000 
+112.000000 108.000000 106.000000 111.000000 120.000000 128.000000 
+133.000000 135.000000 135.000000 135.000000 138.000000 141.000000 
+139.000000 129.000000 122.000000 123.000000 126.000000 124.000000 
+121.000000 119.000000 121.000000 122.000000 121.000000 118.000000 
+117.000000 117.000000 128.000000 127.000000 124.000000 124.000000 
+128.000000 130.000000 127.000000 121.000000 118.000000 121.000000 
+127.000000 131.000000 125.000000 106.000000 84.000000 75.000000 
+89.000000 115.000000 135.000000 137.000000 129.000000 126.000000 
+125.000000 125.000000 127.000000 130.000000 133.000000 133.000000 
+130.000000 129.000000 125.000000 118.000000 110.000000 110.000000 
+118.000000 127.000000 129.000000 129.000000 131.000000 136.000000 
+134.000000 125.000000 117.000000 120.000000 126.000000 124.000000 
+113.000000 100.000000 96.000000 98.000000 101.000000 106.000000 
+114.000000 122.000000 128.000000 128.000000 126.000000 126.000000 
+131.000000 136.000000 140.000000 139.000000 136.000000 134.000000 
+134.000000 131.000000 126.000000 123.000000 125.000000 129.000000 
+130.000000 127.000000 124.000000 122.000000 121.000000 118.000000 
+124.000000 126.000000 126.000000 128.000000 130.000000 129.000000 
+124.000000 120.000000 120.000000 122.000000 122.000000 124.000000 
+124.000000 113.000000 87.000000 68.000000 78.000000 115.000000 
+147.000000 146.000000 127.000000 116.000000 126.000000 138.000000 
+136.000000 125.000000 120.000000 125.000000 133.000000 135.000000 
+131.000000 125.000000 122.000000 122.000000 126.000000 129.000000 
+129.000000 126.000000 127.000000 135.000000 138.000000 129.000000 
+113.000000 116.000000 143.000000 167.000000 157.000000 110.000000 
+68.000000 69.000000 95.000000 116.000000 122.000000 122.000000 
+127.000000 133.000000 130.000000 125.000000 126.000000 133.000000 
+139.000000 143.000000 144.000000 142.000000 135.000000 128.000000 
+125.000000 129.000000 132.000000 129.000000 122.000000 117.000000 
+116.000000 118.000000 118.000000 118.000000 128.000000 125.000000 
+124.000000 124.000000 125.000000 127.000000 130.000000 131.000000 
+127.000000 121.000000 120.000000 121.000000 114.000000 96.000000 
+79.000000 78.000000 94.000000 111.000000 116.000000 115.000000 
+118.000000 126.000000 130.000000 129.000000 130.000000 133.000000 
+137.000000 135.000000 130.000000 126.000000 122.000000 121.000000 
+122.000000 125.000000 126.000000 127.000000 126.000000 125.000000 
+121.000000 119.000000 123.000000 124.000000 116.000000 109.000000 
+128.000000 164.000000 187.000000 171.000000 115.000000 69.000000 
+78.000000 111.000000 132.000000 136.000000 134.000000 135.000000 
+136.000000 136.000000 138.000000 140.000000 140.000000 140.000000 
+143.000000 146.000000 143.000000 137.000000 132.000000 132.000000 
+131.000000 125.000000 118.000000 116.000000 119.000000 123.000000 
+124.000000 124.000000 125.000000 122.000000 124.000000 129.000000 
+129.000000 126.000000 124.000000 124.000000 125.000000 124.000000 
+123.000000 121.000000 115.000000 104.000000 94.000000 95.000000 
+106.000000 118.000000 124.000000 128.000000 131.000000 131.000000 
+128.000000 125.000000 126.000000 130.000000 133.000000 133.000000 
+133.000000 129.000000 121.000000 114.000000 114.000000 121.000000 
+126.000000 126.000000 125.000000 124.000000 123.000000 123.000000 
+127.000000 132.000000 129.000000 120.000000 124.000000 152.000000 
+188.000000 200.000000 171.000000 111.000000 83.000000 105.000000 
+131.000000 138.000000 135.000000 135.000000 135.000000 132.000000 
+131.000000 136.000000 142.000000 144.000000 142.000000 141.000000 
+142.000000 140.000000 136.000000 130.000000 125.000000 121.000000 
+120.000000 124.000000 128.000000 128.000000 124.000000 122.000000 
+130.000000 130.000000 131.000000 129.000000 127.000000 129.000000 
+131.000000 129.000000 126.000000 128.000000 128.000000 116.000000 
+99.000000 94.000000 107.000000 126.000000 132.000000 124.000000 
+117.000000 119.000000 127.000000 130.000000 127.000000 120.000000 
+119.000000 124.000000 132.000000 136.000000 134.000000 131.000000 
+129.000000 127.000000 127.000000 128.000000 132.000000 134.000000 
+131.000000 126.000000 126.000000 127.000000 129.000000 127.000000 
+122.000000 119.000000 121.000000 131.000000 148.000000 166.000000 
+173.000000 151.000000 123.000000 122.000000 129.000000 127.000000 
+124.000000 126.000000 129.000000 130.000000 130.000000 134.000000 
+140.000000 143.000000 142.000000 139.000000 138.000000 138.000000 
+135.000000 128.000000 120.000000 115.000000 117.000000 122.000000 
+124.000000 122.000000 121.000000 128.000000 124.000000 126.000000 
+129.000000 127.000000 125.000000 125.000000 127.000000 127.000000 
+130.000000 133.000000 123.000000 96.000000 74.000000 90.000000 
+145.000000 189.000000 185.000000 152.000000 124.000000 117.000000 
+121.000000 124.000000 124.000000 125.000000 127.000000 128.000000 
+129.000000 128.000000 127.000000 126.000000 129.000000 131.000000 
+129.000000 126.000000 127.000000 131.000000 132.000000 130.000000 
+127.000000 125.000000 124.000000 122.000000 122.000000 126.000000 
+130.000000 130.000000 133.000000 145.000000 157.000000 147.000000 
+126.000000 116.000000 116.000000 118.000000 124.000000 129.000000 
+129.000000 124.000000 120.000000 124.000000 134.000000 142.000000 
+142.000000 138.000000 133.000000 131.000000 131.000000 128.000000 
+121.000000 116.000000 118.000000 124.000000 127.000000 124.000000 
+122.000000 126.000000 127.000000 128.000000 130.000000 130.000000 
+131.000000 130.000000 128.000000 129.000000 134.000000 135.000000 
+115.000000 83.000000 72.000000 100.000000 150.000000 179.000000 
+165.000000 131.000000 113.000000 118.000000 127.000000 129.000000 
+128.000000 129.000000 129.000000 128.000000 129.000000 133.000000 
+135.000000 133.000000 130.000000 130.000000 131.000000 131.000000 
+129.000000 127.000000 127.000000 127.000000 126.000000 125.000000 
+125.000000 125.000000 126.000000 127.000000 126.000000 124.000000 
+123.000000 126.000000 131.000000 126.000000 115.000000 115.000000 
+116.000000 112.000000 113.000000 118.000000 123.000000 124.000000 
+124.000000 129.000000 138.000000 144.000000 144.000000 139.000000 
+136.000000 134.000000 131.000000 127.000000 121.000000 119.000000 
+122.000000 128.000000 129.000000 128.000000 130.000000 135.000000 
+124.000000 121.000000 126.000000 133.000000 135.000000 128.000000 
+122.000000 124.000000 133.000000 135.000000 117.000000 87.000000 
+70.000000 82.000000 109.000000 129.000000 129.000000 119.000000 
+111.000000 110.000000 111.000000 114.000000 121.000000 129.000000 
+134.000000 135.000000 135.000000 135.000000 135.000000 133.000000 
+132.000000 131.000000 130.000000 130.000000 130.000000 131.000000 
+131.000000 130.000000 128.000000 125.000000 122.000000 122.000000 
+125.000000 129.000000 128.000000 125.000000 127.000000 133.000000 
+136.000000 124.000000 101.000000 89.000000 92.000000 104.000000 
+117.000000 125.000000 126.000000 125.000000 125.000000 129.000000 
+134.000000 135.000000 132.000000 126.000000 125.000000 130.000000 
+134.000000 132.000000 127.000000 123.000000 122.000000 122.000000 
+121.000000 121.000000 125.000000 128.000000 127.000000 129.000000 
+134.000000 137.000000 133.000000 125.000000 122.000000 129.000000 
+135.000000 128.000000 105.000000 82.000000 79.000000 95.000000 
+115.000000 129.000000 130.000000 120.000000 109.000000 107.000000 
+115.000000 126.000000 131.000000 133.000000 136.000000 140.000000 
+142.000000 140.000000 135.000000 131.000000 127.000000 125.000000 
+124.000000 126.000000 127.000000 127.000000 126.000000 127.000000 
+126.000000 122.000000 121.000000 124.000000 129.000000 129.000000 
+123.000000 120.000000 125.000000 135.000000 138.000000 126.000000 
+102.000000 85.000000 86.000000 100.000000 115.000000 126.000000 
+130.000000 131.000000 132.000000 134.000000 135.000000 135.000000 
+132.000000 129.000000 128.000000 130.000000 133.000000 134.000000 
+132.000000 130.000000 128.000000 127.000000 129.000000 131.000000 
+133.000000 130.000000 126.000000 130.000000 135.000000 136.000000 
+133.000000 131.000000 133.000000 137.000000 133.000000 117.000000 
+92.000000 71.000000 69.000000 89.000000 115.000000 131.000000 
+129.000000 122.000000 121.000000 127.000000 129.000000 127.000000 
+127.000000 130.000000 134.000000 132.000000 127.000000 124.000000 
+123.000000 122.000000 124.000000 128.000000 133.000000 134.000000 
+132.000000 129.000000 126.000000 124.000000 124.000000 124.000000 
+122.000000 120.000000 120.000000 123.000000 125.000000 125.000000 
+128.000000 135.000000 139.000000 129.000000 104.000000 79.000000 
+70.000000 80.000000 100.000000 121.000000 133.000000 133.000000 
+131.000000 130.000000 131.000000 129.000000 127.000000 128.000000 
+131.000000 132.000000 132.000000 135.000000 139.000000 138.000000 
+132.000000 126.000000 123.000000 126.000000 128.000000 127.000000 
+124.000000 129.000000 135.000000 138.000000 134.000000 128.000000 
+124.000000 125.000000 122.000000 107.000000 83.000000 66.000000 
+73.000000 99.000000 124.000000 132.000000 124.000000 118.000000 
+121.000000 127.000000 127.000000 126.000000 126.000000 127.000000 
+126.000000 123.000000 123.000000 125.000000 126.000000 126.000000 
+129.000000 133.000000 132.000000 127.000000 125.000000 126.000000 
+127.000000 124.000000 124.000000 129.000000 134.000000 134.000000 
+129.000000 126.000000 125.000000 126.000000 130.000000 138.000000 
+143.000000 135.000000 111.000000 85.000000 72.000000 75.000000 
+91.000000 111.000000 127.000000 132.000000 131.000000 130.000000 
+131.000000 131.000000 130.000000 129.000000 129.000000 129.000000 
+131.000000 136.000000 143.000000 142.000000 132.000000 123.000000 
+122.000000 125.000000 127.000000 126.000000 130.000000 130.000000 
+128.000000 130.000000 132.000000 134.000000 133.000000 129.000000 
+118.000000 96.000000 75.000000 70.000000 86.000000 109.000000 
+122.000000 124.000000 124.000000 126.000000 124.000000 121.000000 
+120.000000 123.000000 126.000000 126.000000 126.000000 128.000000 
+131.000000 131.000000 128.000000 126.000000 128.000000 129.000000 
+129.000000 128.000000 128.000000 128.000000 126.000000 124.000000 
+124.000000 126.000000 129.000000 129.000000 128.000000 128.000000 
+129.000000 132.000000 133.000000 135.000000 135.000000 128.000000 
+112.000000 90.000000 77.000000 77.000000 90.000000 107.000000 
+118.000000 120.000000 121.000000 126.000000 135.000000 138.000000 
+132.000000 127.000000 129.000000 135.000000 137.000000 136.000000 
+135.000000 135.000000 132.000000 125.000000 118.000000 116.000000 
+118.000000 121.000000 129.000000 127.000000 126.000000 127.000000 
+132.000000 135.000000 131.000000 118.000000 100.000000 81.000000 
+71.000000 80.000000 102.000000 124.000000 131.000000 124.000000 
+117.000000 115.000000 117.000000 120.000000 123.000000 128.000000 
+130.000000 129.000000 128.000000 128.000000 129.000000 127.000000 
+125.000000 123.000000 123.000000 124.000000 127.000000 130.000000 
+130.000000 129.000000 126.000000 127.000000 130.000000 132.000000 
+130.000000 125.000000 121.000000 120.000000 123.000000 130.000000 
+136.000000 138.000000 135.000000 130.000000 124.000000 114.000000 
+101.000000 92.000000 89.000000 94.000000 104.000000 114.000000 
+122.000000 128.000000 133.000000 133.000000 131.000000 131.000000 
+134.000000 136.000000 137.000000 135.000000 133.000000 130.000000 
+125.000000 121.000000 121.000000 124.000000 126.000000 124.000000 
+124.000000 129.000000 136.000000 138.000000 127.000000 104.000000 
+85.000000 83.000000 86.000000 84.000000 87.000000 109.000000 
+136.000000 132.000000 88.000000 32.000000 7.000000 14.000000 
+9.000000 9.000000 14.000000 16.000000 18.000000 14.000000 
+9.000000 11.000000 8.000000 8.000000 7.000000 6.000000 
+8.000000 9.000000 9.000000 6.000000 6.000000 7.000000 
+8.000000 8.000000 8.000000 7.000000 8.000000 8.000000 
+8.000000 10.000000 11.000000 12.000000 10.000000 10.000000 
+12.000000 12.000000 11.000000 16.000000 34.000000 50.000000 
+48.000000 42.000000 54.000000 77.000000 87.000000 74.000000 
+50.000000 33.000000 28.000000 29.000000 29.000000 35.000000 
+49.000000 74.000000 100.000000 116.000000 125.000000 128.000000 
+129.000000 133.000000 138.000000 139.000000 122.000000 128.000000 
+134.000000 137.000000 133.000000 116.000000 90.000000 72.000000 
+70.000000 72.000000 76.000000 94.000000 127.000000 142.000000 
+118.000000 68.000000 25.000000 8.000000 3.000000 4.000000 
+9.000000 10.000000 9.000000 7.000000 5.000000 8.000000 
+9.000000 8.000000 7.000000 6.000000 5.000000 6.000000 
+6.000000 6.000000 8.000000 9.000000 9.000000 9.000000 
+9.000000 8.000000 10.000000 8.000000 8.000000 8.000000 
+8.000000 9.000000 12.000000 14.000000 11.000000 5.000000 
+9.000000 15.000000 24.000000 31.000000 32.000000 42.000000 
+64.000000 81.000000 86.000000 83.000000 84.000000 88.000000 
+82.000000 71.000000 69.000000 78.000000 95.000000 117.000000 
+137.000000 141.000000 131.000000 121.000000 116.000000 115.000000 
+117.000000 121.000000 126.000000 129.000000 128.000000 127.000000 
+129.000000 127.000000 112.000000 92.000000 82.000000 80.000000 
+80.000000 91.000000 117.000000 139.000000 128.000000 85.000000 
+37.000000 10.000000 9.000000 12.000000 11.000000 9.000000 
+7.000000 6.000000 5.000000 4.000000 4.000000 6.000000 
+7.000000 7.000000 8.000000 9.000000 11.000000 11.000000 
+9.000000 9.000000 7.000000 6.000000 5.000000 10.000000 
+11.000000 6.000000 9.000000 8.000000 9.000000 11.000000 
+11.000000 11.000000 11.000000 13.000000 16.000000 21.000000 
+23.000000 22.000000 29.000000 51.000000 78.000000 94.000000 
+95.000000 92.000000 93.000000 89.000000 85.000000 91.000000 
+98.000000 101.000000 108.000000 121.000000 133.000000 133.000000 
+123.000000 116.000000 119.000000 126.000000 128.000000 122.000000 
+127.000000 125.000000 118.000000 116.000000 124.000000 137.000000 
+136.000000 116.000000 88.000000 69.000000 67.000000 79.000000 
+103.000000 127.000000 128.000000 101.000000 66.000000 44.000000 
+38.000000 36.000000 30.000000 27.000000 27.000000 24.000000 
+18.000000 14.000000 13.000000 13.000000 13.000000 9.000000 
+10.000000 11.000000 12.000000 11.000000 8.000000 5.000000 
+7.000000 9.000000 12.000000 14.000000 11.000000 10.000000 
+9.000000 7.000000 10.000000 6.000000 2.000000 2.000000 
+8.000000 17.000000 22.000000 12.000000 14.000000 37.000000 
+60.000000 72.000000 82.000000 95.000000 103.000000 99.000000 
+92.000000 85.000000 84.000000 90.000000 97.000000 107.000000 
+118.000000 122.000000 122.000000 122.000000 123.000000 123.000000 
+122.000000 125.000000 126.000000 124.000000 123.000000 119.000000 
+112.000000 109.000000 117.000000 136.000000 149.000000 140.000000 
+112.000000 84.000000 69.000000 69.000000 83.000000 105.000000 
+119.000000 116.000000 109.000000 109.000000 111.000000 107.000000 
+92.000000 68.000000 44.000000 25.000000 14.000000 17.000000 
+19.000000 13.000000 8.000000 5.000000 9.000000 10.000000 
+7.000000 10.000000 12.000000 12.000000 15.000000 16.000000 
+19.000000 19.000000 15.000000 13.000000 8.000000 6.000000 
+5.000000 17.000000 33.000000 42.000000 45.000000 28.000000 
+0.000000 5.000000 64.000000 85.000000 83.000000 90.000000 
+96.000000 100.000000 106.000000 107.000000 94.000000 78.000000 
+77.000000 89.000000 106.000000 118.000000 121.000000 119.000000 
+119.000000 122.000000 123.000000 122.000000 120.000000 120.000000 
+120.000000 123.000000 114.000000 110.000000 114.000000 118.000000 
+118.000000 122.000000 136.000000 146.000000 136.000000 107.000000 
+79.000000 65.000000 64.000000 81.000000 108.000000 132.000000 
+145.000000 152.000000 167.000000 185.000000 180.000000 144.000000 
+90.000000 42.000000 17.000000 18.000000 22.000000 21.000000 
+20.000000 19.000000 14.000000 10.000000 9.000000 11.000000 
+15.000000 18.000000 21.000000 25.000000 22.000000 12.000000 
+16.000000 20.000000 16.000000 13.000000 20.000000 44.000000 
+70.000000 89.000000 115.000000 172.000000 181.000000 140.000000 
+75.000000 56.000000 63.000000 65.000000 79.000000 89.000000 
+88.000000 88.000000 85.000000 85.000000 93.000000 104.000000 
+113.000000 114.000000 110.000000 108.000000 112.000000 121.000000 
+127.000000 127.000000 124.000000 122.000000 122.000000 124.000000 
+106.000000 111.000000 117.000000 114.000000 108.000000 119.000000 
+142.000000 153.000000 133.000000 94.000000 67.000000 59.000000 
+57.000000 66.000000 102.000000 145.000000 167.000000 194.000000 
+259.000000 293.000000 263.000000 189.000000 116.000000 66.000000 
+30.000000 31.000000 46.000000 40.000000 30.000000 22.000000 
+8.000000 10.000000 10.000000 11.000000 20.000000 21.000000 
+15.000000 17.000000 19.000000 12.000000 12.000000 21.000000 
+27.000000 28.000000 41.000000 48.000000 78.000000 155.000000 
+214.000000 250.000000 362.000000 389.000000 243.000000 132.000000 
+110.000000 77.000000 49.000000 62.000000 87.000000 95.000000 
+92.000000 100.000000 119.000000 125.000000 116.000000 108.000000 
+108.000000 115.000000 123.000000 132.000000 138.000000 133.000000 
+124.000000 120.000000 122.000000 125.000000 122.000000 123.000000 
+114.000000 103.000000 107.000000 126.000000 144.000000 145.000000 
+129.000000 104.000000 81.000000 66.000000 54.000000 53.000000 
+83.000000 130.000000 181.000000 291.000000 389.000000 382.000000 
+301.000000 212.000000 123.000000 71.000000 56.000000 47.000000 
+50.000000 31.000000 24.000000 18.000000 14.000000 25.000000 
+24.000000 11.000000 18.000000 18.000000 19.000000 7.000000 
+22.000000 35.000000 23.000000 20.000000 31.000000 34.000000 
+33.000000 34.000000 91.000000 215.000000 309.000000 317.000000 
+412.000000 481.000000 361.000000 215.000000 150.000000 81.000000 
+43.000000 72.000000 111.000000 108.000000 82.000000 92.000000 
+128.000000 141.000000 125.000000 109.000000 111.000000 123.000000 
+135.000000 139.000000 135.000000 128.000000 125.000000 128.000000 
+134.000000 141.000000 133.000000 127.000000 120.000000 122.000000 
+132.000000 135.000000 133.000000 133.000000 132.000000 116.000000 
+88.000000 70.000000 64.000000 61.000000 72.000000 111.000000 
+191.000000 327.000000 382.000000 333.000000 270.000000 211.000000 
+123.000000 73.000000 62.000000 45.000000 42.000000 31.000000 
+27.000000 18.000000 15.000000 23.000000 21.000000 10.000000 
+14.000000 24.000000 29.000000 9.000000 22.000000 37.000000 
+22.000000 18.000000 14.000000 26.000000 19.000000 43.000000 
+132.000000 205.000000 220.000000 279.000000 376.000000 392.000000 
+287.000000 177.000000 111.000000 60.000000 62.000000 98.000000 
+113.000000 93.000000 79.000000 103.000000 134.000000 138.000000 
+129.000000 123.000000 124.000000 127.000000 130.000000 128.000000 
+124.000000 125.000000 132.000000 137.000000 136.000000 135.000000 
+134.000000 131.000000 130.000000 136.000000 140.000000 135.000000 
+128.000000 130.000000 132.000000 116.000000 88.000000 75.000000 
+78.000000 76.000000 72.000000 100.000000 174.000000 252.000000 
+261.000000 224.000000 207.000000 190.000000 155.000000 120.000000 
+76.000000 50.000000 50.000000 48.000000 39.000000 28.000000 
+15.000000 13.000000 16.000000 15.000000 13.000000 24.000000 
+36.000000 28.000000 26.000000 19.000000 17.000000 20.000000 
+20.000000 32.000000 41.000000 101.000000 186.000000 163.000000 
+107.000000 182.000000 295.000000 308.000000 230.000000 145.000000 
+86.000000 72.000000 94.000000 111.000000 105.000000 87.000000 
+90.000000 113.000000 127.000000 130.000000 132.000000 134.000000 
+132.000000 132.000000 133.000000 128.000000 122.000000 123.000000 
+132.000000 134.000000 127.000000 122.000000 141.000000 139.000000 
+135.000000 133.000000 133.000000 134.000000 134.000000 135.000000 
+133.000000 121.000000 102.000000 89.000000 89.000000 92.000000 
+88.000000 95.000000 126.000000 147.000000 139.000000 126.000000 
+127.000000 140.000000 144.000000 109.000000 64.000000 40.000000 
+32.000000 33.000000 28.000000 27.000000 21.000000 23.000000 
+34.000000 34.000000 26.000000 28.000000 39.000000 36.000000 
+19.000000 8.000000 19.000000 27.000000 50.000000 62.000000 
+76.000000 127.000000 140.000000 111.000000 120.000000 203.000000 
+283.000000 272.000000 189.000000 112.000000 70.000000 78.000000 
+106.000000 108.000000 89.000000 79.000000 96.000000 120.000000 
+126.000000 121.000000 123.000000 128.000000 131.000000 131.000000 
+129.000000 125.000000 124.000000 130.000000 135.000000 132.000000 
+124.000000 122.000000 136.000000 140.000000 137.000000 131.000000 
+132.000000 138.000000 139.000000 132.000000 126.000000 124.000000 
+118.000000 102.000000 88.000000 90.000000 96.000000 100.000000 
+105.000000 104.000000 95.000000 82.000000 73.000000 74.000000 
+77.000000 72.000000 65.000000 51.000000 36.000000 30.000000 
+27.000000 26.000000 24.000000 28.000000 30.000000 27.000000 
+24.000000 27.000000 29.000000 12.000000 9.000000 9.000000 
+13.000000 27.000000 62.000000 89.000000 93.000000 110.000000 
+88.000000 119.000000 171.000000 233.000000 287.000000 257.000000 
+162.000000 83.000000 57.000000 73.000000 92.000000 90.000000 
+73.000000 73.000000 101.000000 127.000000 130.000000 123.000000 
+123.000000 126.000000 126.000000 124.000000 124.000000 127.000000 
+130.000000 135.000000 138.000000 138.000000 133.000000 127.000000 
+134.000000 139.000000 136.000000 130.000000 130.000000 130.000000 
+123.000000 114.000000 117.000000 131.000000 134.000000 113.000000 
+86.000000 77.000000 85.000000 97.000000 108.000000 116.000000 
+113.000000 95.000000 71.000000 60.000000 67.000000 82.000000 
+88.000000 80.000000 73.000000 71.000000 73.000000 69.000000 
+67.000000 71.000000 72.000000 67.000000 57.000000 45.000000 
+34.000000 26.000000 43.000000 45.000000 34.000000 32.000000 
+39.000000 57.000000 59.000000 86.000000 113.000000 157.000000 
+201.000000 249.000000 284.000000 237.000000 138.000000 68.000000 
+63.000000 82.000000 82.000000 69.000000 59.000000 74.000000 
+106.000000 125.000000 125.000000 121.000000 122.000000 121.000000 
+118.000000 120.000000 129.000000 136.000000 135.000000 132.000000 
+135.000000 142.000000 144.000000 136.000000 139.000000 136.000000 
+128.000000 126.000000 129.000000 127.000000 115.000000 106.000000 
+113.000000 134.000000 146.000000 134.000000 104.000000 79.000000 
+75.000000 86.000000 101.000000 114.000000 112.000000 96.000000 
+82.000000 81.000000 85.000000 86.000000 87.000000 93.000000 
+105.000000 116.000000 121.000000 119.000000 119.000000 123.000000 
+127.000000 126.000000 121.000000 106.000000 83.000000 73.000000 
+79.000000 81.000000 76.000000 70.000000 50.000000 31.000000 
+33.000000 63.000000 106.000000 147.000000 214.000000 275.000000 
+275.000000 202.000000 115.000000 73.000000 78.000000 87.000000 
+77.000000 58.000000 51.000000 76.000000 115.000000 129.000000 
+122.000000 116.000000 118.000000 122.000000 124.000000 128.000000 
+134.000000 136.000000 134.000000 132.000000 134.000000 139.000000 
+143.000000 142.000000 137.000000 126.000000 117.000000 119.000000 
+128.000000 131.000000 121.000000 110.000000 111.000000 128.000000 
+150.000000 153.000000 127.000000 89.000000 69.000000 76.000000 
+93.000000 99.000000 89.000000 83.000000 91.000000 101.000000 
+101.000000 96.000000 94.000000 103.000000 115.000000 126.000000 
+129.000000 129.000000 130.000000 134.000000 134.000000 136.000000 
+142.000000 140.000000 121.000000 106.000000 107.000000 103.000000 
+94.000000 86.000000 59.000000 38.000000 56.000000 67.000000 
+77.000000 148.000000 270.000000 342.000000 302.000000 185.000000 
+96.000000 74.000000 87.000000 85.000000 63.000000 47.000000 
+51.000000 83.000000 118.000000 130.000000 128.000000 126.000000 
+127.000000 126.000000 124.000000 125.000000 128.000000 132.000000 
+134.000000 132.000000 130.000000 130.000000 134.000000 135.000000 
+132.000000 120.000000 115.000000 121.000000 128.000000 129.000000 
+125.000000 120.000000 121.000000 129.000000 147.000000 158.000000 
+140.000000 98.000000 68.000000 72.000000 90.000000 90.000000 
+76.000000 80.000000 111.000000 143.000000 149.000000 132.000000 
+114.000000 105.000000 107.000000 114.000000 118.000000 123.000000 
+132.000000 141.000000 142.000000 140.000000 139.000000 131.000000 
+118.000000 125.000000 138.000000 129.000000 111.000000 89.000000 
+50.000000 48.000000 74.000000 87.000000 88.000000 199.000000 
+351.000000 408.000000 327.000000 179.000000 81.000000 70.000000 
+91.000000 88.000000 63.000000 44.000000 54.000000 88.000000 
+113.000000 123.000000 130.000000 136.000000 135.000000 129.000000 
+127.000000 128.000000 125.000000 122.000000 124.000000 128.000000 
+127.000000 125.000000 126.000000 127.000000 122.000000 115.000000 
+122.000000 132.000000 132.000000 125.000000 124.000000 129.000000 
+134.000000 135.000000 140.000000 147.000000 136.000000 107.000000 
+83.000000 83.000000 90.000000 85.000000 79.000000 97.000000 
+143.000000 203.000000 227.000000 203.000000 163.000000 130.000000 
+112.000000 110.000000 117.000000 127.000000 137.000000 142.000000 
+141.000000 138.000000 129.000000 114.000000 111.000000 132.000000 
+145.000000 136.000000 129.000000 121.000000 94.000000 78.000000 
+78.000000 93.000000 147.000000 265.000000 372.000000 378.000000 
+274.000000 144.000000 82.000000 84.000000 88.000000 71.000000 
+49.000000 45.000000 69.000000 98.000000 112.000000 121.000000 
+132.000000 137.000000 133.000000 128.000000 131.000000 133.000000 
+126.000000 117.000000 118.000000 126.000000 130.000000 128.000000 
+126.000000 127.000000 111.000000 107.000000 119.000000 136.000000 
+141.000000 134.000000 127.000000 128.000000 131.000000 132.000000 
+132.000000 130.000000 123.000000 112.000000 103.000000 96.000000 
+89.000000 85.000000 97.000000 124.000000 171.000000 242.000000 
+288.000000 279.000000 233.000000 175.000000 124.000000 114.000000 
+132.000000 145.000000 143.000000 135.000000 134.000000 135.000000 
+124.000000 113.000000 125.000000 147.000000 148.000000 130.000000 
+128.000000 138.000000 138.000000 119.000000 86.000000 123.000000 
+223.000000 300.000000 320.000000 269.000000 173.000000 102.000000 
+87.000000 86.000000 62.000000 30.000000 22.000000 46.000000 
+84.000000 112.000000 125.000000 131.000000 129.000000 122.000000 
+119.000000 124.000000 127.000000 124.000000 119.000000 122.000000 
+129.000000 132.000000 128.000000 123.000000 120.000000 121.000000 
+116.000000 109.000000 117.000000 131.000000 139.000000 135.000000 
+126.000000 122.000000 127.000000 136.000000 138.000000 129.000000 
+115.000000 105.000000 101.000000 97.000000 94.000000 100.000000 
+123.000000 149.000000 192.000000 255.000000 305.000000 308.000000 
+260.000000 183.000000 121.000000 126.000000 154.000000 155.000000 
+137.000000 129.000000 139.000000 141.000000 126.000000 121.000000 
+138.000000 151.000000 142.000000 128.000000 128.000000 143.000000 
+160.000000 143.000000 111.000000 196.000000 293.000000 309.000000 
+256.000000 178.000000 119.000000 98.000000 90.000000 67.000000 
+38.000000 28.000000 52.000000 86.000000 102.000000 110.000000 
+122.000000 131.000000 127.000000 118.000000 122.000000 136.000000 
+142.000000 133.000000 126.000000 131.000000 140.000000 140.000000 
+132.000000 124.000000 121.000000 121.000000 126.000000 126.000000 
+133.000000 134.000000 128.000000 122.000000 122.000000 127.000000 
+135.000000 141.000000 139.000000 125.000000 111.000000 106.000000 
+105.000000 99.000000 96.000000 110.000000 137.000000 163.000000 
+200.000000 260.000000 312.000000 310.000000 239.000000 145.000000 
+103.000000 132.000000 157.000000 145.000000 120.000000 123.000000 
+143.000000 144.000000 131.000000 128.000000 136.000000 141.000000 
+139.000000 135.000000 130.000000 137.000000 155.000000 137.000000 
+136.000000 242.000000 337.000000 331.000000 257.000000 180.000000 
+128.000000 100.000000 79.000000 59.000000 57.000000 81.000000 
+108.000000 117.000000 109.000000 103.000000 110.000000 123.000000 
+128.000000 127.000000 131.000000 141.000000 144.000000 138.000000 
+133.000000 138.000000 146.000000 146.000000 140.000000 132.000000 
+127.000000 121.000000 125.000000 127.000000 128.000000 123.000000 
+118.000000 120.000000 125.000000 129.000000 131.000000 131.000000 
+126.000000 116.000000 113.000000 120.000000 120.000000 107.000000 
+98.000000 108.000000 132.000000 158.000000 199.000000 263.000000 
+311.000000 289.000000 198.000000 111.000000 105.000000 139.000000 
+154.000000 141.000000 128.000000 133.000000 138.000000 130.000000 
+123.000000 127.000000 135.000000 140.000000 144.000000 140.000000 
+126.000000 126.000000 141.000000 138.000000 161.000000 256.000000 
+348.000000 365.000000 312.000000 221.000000 131.000000 80.000000 
+70.000000 79.000000 96.000000 112.000000 120.000000 118.000000 
+114.000000 115.000000 121.000000 125.000000 127.000000 130.000000 
+136.000000 141.000000 141.000000 140.000000 139.000000 136.000000 
+130.000000 126.000000 127.000000 130.000000 128.000000 120.000000 
+126.000000 123.000000 118.000000 112.000000 110.000000 113.000000 
+117.000000 124.000000 129.000000 128.000000 121.000000 117.000000 
+125.000000 133.000000 128.000000 113.000000 103.000000 108.000000 
+124.000000 153.000000 198.000000 250.000000 272.000000 227.000000 
+138.000000 90.000000 107.000000 132.000000 139.000000 133.000000 
+137.000000 143.000000 138.000000 127.000000 123.000000 127.000000 
+133.000000 140.000000 143.000000 133.000000 115.000000 108.000000 
+115.000000 124.000000 162.000000 245.000000 324.000000 339.000000 
+276.000000 173.000000 97.000000 76.000000 92.000000 112.000000 
+117.000000 115.000000 117.000000 122.000000 127.000000 129.000000 
+126.000000 122.000000 122.000000 128.000000 134.000000 136.000000 
+134.000000 133.000000 133.000000 132.000000 130.000000 132.000000 
+135.000000 134.000000 128.000000 122.000000 132.000000 127.000000 
+122.000000 119.000000 117.000000 113.000000 113.000000 118.000000 
+125.000000 127.000000 122.000000 120.000000 122.000000 127.000000 
+126.000000 118.000000 106.000000 101.000000 115.000000 153.000000 
+196.000000 218.000000 206.000000 154.000000 98.000000 87.000000 
+103.000000 119.000000 127.000000 133.000000 140.000000 141.000000 
+134.000000 129.000000 131.000000 134.000000 141.000000 150.000000 
+147.000000 126.000000 97.000000 78.000000 85.000000 111.000000 
+157.000000 220.000000 265.000000 248.000000 171.000000 94.000000 
+65.000000 82.000000 111.000000 123.000000 120.000000 118.000000 
+123.000000 128.000000 127.000000 120.000000 116.000000 119.000000 
+130.000000 138.000000 138.000000 134.000000 131.000000 130.000000 
+129.000000 127.000000 129.000000 134.000000 135.000000 132.000000 
+131.000000 135.000000 124.000000 124.000000 123.000000 122.000000 
+119.000000 113.000000 109.000000 113.000000 121.000000 126.000000 
+127.000000 125.000000 122.000000 120.000000 120.000000 115.000000 
+102.000000 92.000000 104.000000 139.000000 167.000000 167.000000 
+141.000000 108.000000 88.000000 81.000000 82.000000 97.000000 
+112.000000 135.000000 154.000000 157.000000 151.000000 144.000000 
+138.000000 137.000000 145.000000 150.000000 138.000000 110.000000 
+82.000000 65.000000 66.000000 89.000000 132.000000 180.000000 
+202.000000 177.000000 124.000000 88.000000 83.000000 95.000000 
+107.000000 113.000000 115.000000 118.000000 121.000000 123.000000 
+122.000000 120.000000 119.000000 122.000000 127.000000 130.000000 
+133.000000 136.000000 139.000000 138.000000 131.000000 123.000000 
+120.000000 122.000000 128.000000 134.000000 138.000000 139.000000 
+96.000000 107.000000 116.000000 116.000000 113.000000 113.000000 
+118.000000 122.000000 122.000000 122.000000 125.000000 131.000000 
+132.000000 127.000000 119.000000 111.000000 101.000000 93.000000 
+94.000000 107.000000 118.000000 116.000000 109.000000 106.000000 
+101.000000 71.000000 42.000000 47.000000 81.000000 137.000000 
+173.000000 180.000000 176.000000 173.000000 169.000000 167.000000 
+171.000000 169.000000 143.000000 102.000000 79.000000 73.000000 
+71.000000 75.000000 87.000000 112.000000 137.000000 135.000000 
+111.000000 93.000000 94.000000 106.000000 113.000000 117.000000 
+120.000000 120.000000 117.000000 117.000000 120.000000 122.000000 
+122.000000 121.000000 124.000000 130.000000 136.000000 141.000000 
+139.000000 133.000000 127.000000 127.000000 131.000000 132.000000 
+131.000000 130.000000 131.000000 134.000000 90.000000 90.000000 
+102.000000 111.000000 113.000000 113.000000 114.000000 117.000000 
+120.000000 119.000000 117.000000 117.000000 121.000000 125.000000 
+123.000000 115.000000 103.000000 92.000000 85.000000 85.000000 
+93.000000 99.000000 97.000000 92.000000 88.000000 76.000000 
+56.000000 47.000000 69.000000 116.000000 157.000000 176.000000 
+182.000000 183.000000 184.000000 188.000000 192.000000 183.000000 
+144.000000 87.000000 56.000000 57.000000 69.000000 77.000000 
+79.000000 76.000000 80.000000 87.000000 91.000000 92.000000 
+99.000000 112.000000 122.000000 125.000000 123.000000 119.000000 
+115.000000 115.000000 119.000000 124.000000 124.000000 122.000000 
+123.000000 130.000000 137.000000 137.000000 133.000000 129.000000 
+130.000000 134.000000 134.000000 129.000000 125.000000 128.000000 
+134.000000 135.000000 128.000000 97.000000 81.000000 90.000000 
+111.000000 124.000000 122.000000 119.000000 125.000000 133.000000 
+134.000000 127.000000 121.000000 122.000000 123.000000 116.000000 
+105.000000 93.000000 81.000000 74.000000 80.000000 98.000000 
+107.000000 96.000000 79.000000 76.000000 83.000000 88.000000 
+82.000000 83.000000 100.000000 117.000000 127.000000 132.000000 
+134.000000 129.000000 117.000000 102.000000 84.000000 71.000000 
+61.000000 48.000000 51.000000 61.000000 71.000000 79.000000 
+84.000000 89.000000 93.000000 95.000000 98.000000 107.000000 
+119.000000 125.000000 123.000000 122.000000 123.000000 125.000000 
+126.000000 128.000000 129.000000 128.000000 125.000000 126.000000 
+129.000000 130.000000 129.000000 128.000000 130.000000 132.000000 
+130.000000 125.000000 122.000000 123.000000 126.000000 128.000000 
+120.000000 100.000000 90.000000 99.000000 113.000000 121.000000 
+125.000000 125.000000 125.000000 128.000000 131.000000 131.000000 
+129.000000 126.000000 121.000000 113.000000 102.000000 92.000000 
+87.000000 83.000000 83.000000 90.000000 100.000000 101.000000 
+90.000000 79.000000 81.000000 88.000000 91.000000 88.000000 
+76.000000 61.000000 50.000000 47.000000 50.000000 52.000000 
+47.000000 44.000000 52.000000 70.000000 79.000000 70.000000 
+51.000000 45.000000 56.000000 73.000000 82.000000 86.000000 
+92.000000 101.000000 107.000000 111.000000 117.000000 124.000000 
+130.000000 133.000000 132.000000 130.000000 129.000000 127.000000 
+126.000000 125.000000 125.000000 126.000000 126.000000 127.000000 
+128.000000 128.000000 126.000000 122.000000 118.000000 120.000000 
+125.000000 130.000000 132.000000 131.000000 103.000000 103.000000 
+118.000000 128.000000 124.000000 116.000000 116.000000 121.000000 
+125.000000 127.000000 129.000000 131.000000 129.000000 123.000000 
+118.000000 113.000000 105.000000 96.000000 87.000000 81.000000 
+77.000000 78.000000 88.000000 101.000000 107.000000 102.000000 
+89.000000 78.000000 72.000000 73.000000 75.000000 75.000000 
+73.000000 70.000000 68.000000 67.000000 66.000000 66.000000 
+67.000000 65.000000 60.000000 56.000000 49.000000 47.000000 
+57.000000 75.000000 89.000000 91.000000 89.000000 91.000000 
+98.000000 109.000000 118.000000 124.000000 129.000000 131.000000 
+129.000000 125.000000 125.000000 127.000000 129.000000 127.000000 
+124.000000 123.000000 127.000000 131.000000 132.000000 129.000000 
+127.000000 125.000000 125.000000 126.000000 129.000000 130.000000 
+129.000000 128.000000 132.000000 134.000000 133.000000 128.000000 
+123.000000 122.000000 121.000000 118.000000 116.000000 121.000000 
+130.000000 136.000000 133.000000 125.000000 119.000000 114.000000 
+107.000000 97.000000 87.000000 82.000000 85.000000 93.000000 
+101.000000 102.000000 99.000000 95.000000 86.000000 71.000000 
+57.000000 56.000000 60.000000 64.000000 62.000000 51.000000 
+41.000000 35.000000 39.000000 53.000000 70.000000 79.000000 
+70.000000 61.000000 68.000000 81.000000 87.000000 88.000000 
+89.000000 91.000000 92.000000 91.000000 93.000000 103.000000 
+115.000000 120.000000 122.000000 125.000000 129.000000 129.000000 
+124.000000 120.000000 119.000000 122.000000 123.000000 123.000000 
+125.000000 131.000000 136.000000 136.000000 131.000000 125.000000 
+123.000000 126.000000 132.000000 134.000000 134.000000 132.000000 
+132.000000 132.000000 129.000000 127.000000 128.000000 130.000000 
+130.000000 128.000000 124.000000 123.000000 122.000000 123.000000 
+124.000000 127.000000 126.000000 117.000000 102.000000 90.000000 
+86.000000 88.000000 95.000000 105.000000 107.000000 94.000000 
+73.000000 58.000000 48.000000 37.000000 33.000000 77.000000 
+165.000000 239.000000 228.000000 140.000000 62.000000 40.000000 
+51.000000 57.000000 51.000000 54.000000 74.000000 100.000000 
+109.000000 98.000000 84.000000 78.000000 83.000000 91.000000 
+92.000000 88.000000 87.000000 99.000000 116.000000 127.000000 
+128.000000 128.000000 129.000000 129.000000 124.000000 118.000000 
+114.000000 114.000000 115.000000 115.000000 117.000000 121.000000 
+126.000000 129.000000 127.000000 124.000000 123.000000 126.000000 
+129.000000 130.000000 130.000000 132.000000 130.000000 126.000000 
+126.000000 127.000000 128.000000 127.000000 126.000000 123.000000 
+120.000000 118.000000 120.000000 122.000000 127.000000 132.000000 
+129.000000 114.000000 95.000000 83.000000 83.000000 91.000000 
+100.000000 105.000000 97.000000 76.000000 55.000000 47.000000 
+43.000000 38.000000 36.000000 109.000000 283.000000 430.000000 
+422.000000 270.000000 115.000000 56.000000 68.000000 81.000000 
+74.000000 59.000000 61.000000 81.000000 92.000000 94.000000 
+96.000000 98.000000 94.000000 88.000000 84.000000 85.000000 
+93.000000 105.000000 115.000000 120.000000 121.000000 125.000000 
+128.000000 126.000000 118.000000 111.000000 111.000000 115.000000 
+118.000000 120.000000 122.000000 125.000000 126.000000 127.000000 
+127.000000 125.000000 122.000000 121.000000 121.000000 124.000000 
+129.000000 136.000000 128.000000 124.000000 123.000000 125.000000 
+127.000000 127.000000 123.000000 119.000000 118.000000 121.000000 
+124.000000 128.000000 132.000000 134.000000 130.000000 121.000000 
+110.000000 101.000000 99.000000 103.000000 108.000000 108.000000 
+98.000000 83.000000 66.000000 53.000000 44.000000 44.000000 
+62.000000 128.000000 269.000000 392.000000 411.000000 320.000000 
+185.000000 78.000000 54.000000 67.000000 79.000000 79.000000 
+65.000000 59.000000 62.000000 71.000000 86.000000 103.000000 
+112.000000 109.000000 98.000000 91.000000 96.000000 111.000000 
+126.000000 135.000000 136.000000 132.000000 128.000000 125.000000 
+126.000000 127.000000 127.000000 123.000000 117.000000 112.000000 
+110.000000 114.000000 121.000000 129.000000 133.000000 132.000000 
+129.000000 125.000000 122.000000 121.000000 122.000000 122.000000 
+131.000000 126.000000 119.000000 118.000000 121.000000 123.000000 
+118.000000 112.000000 114.000000 122.000000 129.000000 130.000000 
+129.000000 126.000000 117.000000 100.000000 88.000000 90.000000 
+104.000000 115.000000 111.000000 97.000000 85.000000 82.000000 
+83.000000 78.000000 64.000000 55.000000 62.000000 117.000000 
+226.000000 292.000000 274.000000 201.000000 122.000000 65.000000 
+41.000000 45.000000 54.000000 52.000000 46.000000 46.000000 
+57.000000 74.000000 89.000000 101.000000 107.000000 107.000000 
+103.000000 98.000000 102.000000 114.000000 125.000000 128.000000 
+127.000000 127.000000 129.000000 127.000000 125.000000 129.000000 
+133.000000 127.000000 112.000000 100.000000 102.000000 112.000000 
+122.000000 125.000000 127.000000 131.000000 131.000000 125.000000 
+119.000000 119.000000 124.000000 129.000000 119.000000 121.000000 
+126.000000 130.000000 127.000000 117.000000 107.000000 104.000000 
+110.000000 121.000000 128.000000 128.000000 128.000000 129.000000 
+124.000000 111.000000 98.000000 96.000000 102.000000 103.000000 
+94.000000 86.000000 90.000000 100.000000 108.000000 114.000000 
+120.000000 120.000000 104.000000 80.000000 96.000000 132.000000 
+139.000000 111.000000 79.000000 62.000000 70.000000 82.000000 
+76.000000 58.000000 49.000000 58.000000 75.000000 86.000000 
+88.000000 88.000000 92.000000 96.000000 97.000000 98.000000 
+103.000000 111.000000 115.000000 114.000000 115.000000 127.000000 
+140.000000 139.000000 128.000000 122.000000 124.000000 127.000000 
+125.000000 121.000000 119.000000 119.000000 119.000000 122.000000 
+127.000000 127.000000 121.000000 117.000000 121.000000 126.000000 
+125.000000 120.000000 116.000000 121.000000 125.000000 125.000000 
+122.000000 117.000000 114.000000 116.000000 121.000000 123.000000 
+119.000000 114.000000 114.000000 116.000000 110.000000 99.000000 
+93.000000 97.000000 102.000000 104.000000 108.000000 116.000000 
+121.000000 119.000000 119.000000 126.000000 135.000000 140.000000 
+139.000000 131.000000 106.000000 73.000000 60.000000 71.000000 
+96.000000 114.000000 117.000000 118.000000 120.000000 115.000000 
+99.000000 94.000000 114.000000 138.000000 136.000000 104.000000 
+77.000000 75.000000 92.000000 105.000000 108.000000 110.000000 
+118.000000 126.000000 130.000000 131.000000 134.000000 138.000000 
+137.000000 133.000000 129.000000 128.000000 130.000000 129.000000 
+127.000000 126.000000 127.000000 129.000000 127.000000 120.000000 
+117.000000 122.000000 131.000000 132.000000 125.000000 115.000000 
+124.000000 126.000000 127.000000 129.000000 129.000000 124.000000 
+116.000000 112.000000 113.000000 118.000000 123.000000 130.000000 
+135.000000 126.000000 102.000000 80.000000 80.000000 108.000000 
+137.000000 142.000000 129.000000 119.000000 115.000000 116.000000 
+117.000000 122.000000 129.000000 133.000000 136.000000 135.000000 
+131.000000 123.000000 116.000000 117.000000 124.000000 130.000000 
+131.000000 132.000000 136.000000 134.000000 121.000000 110.000000 
+125.000000 156.000000 173.000000 157.000000 110.000000 65.000000 
+67.000000 91.000000 108.000000 118.000000 126.000000 132.000000 
+133.000000 131.000000 132.000000 135.000000 133.000000 127.000000 
+125.000000 127.000000 131.000000 132.000000 131.000000 131.000000 
+130.000000 127.000000 125.000000 125.000000 125.000000 125.000000 
+125.000000 124.000000 122.000000 117.000000 116.000000 116.000000 
+121.000000 127.000000 128.000000 125.000000 122.000000 122.000000 
+122.000000 122.000000 124.000000 129.000000 129.000000 115.000000 
+90.000000 69.000000 69.000000 91.000000 120.000000 133.000000 
+129.000000 119.000000 118.000000 123.000000 125.000000 122.000000 
+121.000000 127.000000 134.000000 135.000000 132.000000 131.000000 
+131.000000 130.000000 128.000000 129.000000 130.000000 127.000000 
+125.000000 129.000000 134.000000 132.000000 127.000000 139.000000 
+162.000000 177.000000 170.000000 131.000000 90.000000 90.000000 
+109.000000 113.000000 113.000000 123.000000 136.000000 139.000000 
+133.000000 129.000000 131.000000 133.000000 131.000000 127.000000 
+126.000000 128.000000 132.000000 136.000000 136.000000 133.000000 
+129.000000 127.000000 126.000000 122.000000 117.000000 118.000000 
+124.000000 127.000000 121.000000 121.000000 124.000000 129.000000 
+131.000000 131.000000 130.000000 132.000000 133.000000 130.000000 
+124.000000 120.000000 118.000000 110.000000 97.000000 87.000000 
+88.000000 101.000000 117.000000 127.000000 129.000000 125.000000 
+122.000000 123.000000 127.000000 128.000000 125.000000 124.000000 
+128.000000 135.000000 136.000000 132.000000 127.000000 125.000000 
+126.000000 125.000000 121.000000 115.000000 114.000000 120.000000 
+129.000000 132.000000 129.000000 129.000000 140.000000 159.000000 
+175.000000 171.000000 143.000000 122.000000 118.000000 114.000000 
+112.000000 120.000000 133.000000 137.000000 132.000000 131.000000 
+137.000000 140.000000 135.000000 130.000000 133.000000 142.000000 
+146.000000 140.000000 130.000000 125.000000 126.000000 128.000000 
+126.000000 122.000000 121.000000 123.000000 123.000000 120.000000 
+127.000000 121.000000 118.000000 118.000000 122.000000 126.000000 
+128.000000 127.000000 123.000000 122.000000 123.000000 121.000000 
+112.000000 104.000000 102.000000 105.000000 115.000000 122.000000 
+123.000000 118.000000 115.000000 117.000000 122.000000 128.000000 
+129.000000 127.000000 127.000000 129.000000 132.000000 130.000000 
+125.000000 120.000000 117.000000 119.000000 124.000000 127.000000 
+125.000000 123.000000 122.000000 125.000000 127.000000 127.000000 
+125.000000 126.000000 129.000000 132.000000 137.000000 137.000000 
+125.000000 116.000000 114.000000 111.000000 112.000000 121.000000 
+131.000000 134.000000 131.000000 128.000000 130.000000 133.000000 
+134.000000 135.000000 137.000000 140.000000 141.000000 140.000000 
+137.000000 132.000000 125.000000 118.000000 115.000000 117.000000 
+122.000000 125.000000 125.000000 124.000000 121.000000 123.000000 
+127.000000 128.000000 129.000000 132.000000 134.000000 129.000000 
+122.000000 125.000000 133.000000 127.000000 102.000000 83.000000 
+98.000000 145.000000 177.000000 167.000000 135.000000 116.000000 
+116.000000 123.000000 126.000000 124.000000 124.000000 126.000000 
+127.000000 127.000000 128.000000 127.000000 125.000000 122.000000 
+122.000000 123.000000 124.000000 123.000000 122.000000 122.000000 
+124.000000 127.000000 128.000000 128.000000 125.000000 124.000000 
+125.000000 127.000000 130.000000 130.000000 120.000000 110.000000 
+110.000000 113.000000 119.000000 128.000000 134.000000 135.000000 
+132.000000 130.000000 131.000000 132.000000 134.000000 135.000000 
+136.000000 137.000000 139.000000 140.000000 137.000000 127.000000 
+118.000000 114.000000 117.000000 121.000000 124.000000 124.000000 
+125.000000 127.000000 126.000000 130.000000 133.000000 127.000000 
+120.000000 123.000000 131.000000 130.000000 123.000000 122.000000 
+127.000000 119.000000 94.000000 84.000000 113.000000 162.000000 
+183.000000 162.000000 130.000000 117.000000 118.000000 116.000000 
+115.000000 121.000000 133.000000 138.000000 134.000000 128.000000 
+128.000000 129.000000 128.000000 125.000000 125.000000 126.000000 
+126.000000 125.000000 125.000000 125.000000 127.000000 129.000000 
+129.000000 128.000000 124.000000 121.000000 120.000000 126.000000 
+135.000000 138.000000 127.000000 110.000000 100.000000 101.000000 
+110.000000 123.000000 132.000000 135.000000 133.000000 131.000000 
+130.000000 131.000000 132.000000 133.000000 135.000000 136.000000 
+137.000000 136.000000 132.000000 127.000000 122.000000 119.000000 
+121.000000 125.000000 126.000000 121.000000 119.000000 125.000000 
+121.000000 121.000000 122.000000 125.000000 131.000000 136.000000 
+133.000000 126.000000 124.000000 129.000000 130.000000 116.000000 
+93.000000 87.000000 107.000000 129.000000 134.000000 125.000000 
+118.000000 122.000000 124.000000 119.000000 116.000000 121.000000 
+127.000000 128.000000 125.000000 127.000000 132.000000 134.000000 
+130.000000 126.000000 126.000000 127.000000 127.000000 127.000000 
+127.000000 128.000000 128.000000 125.000000 122.000000 120.000000 
+121.000000 126.000000 129.000000 133.000000 139.000000 141.000000 
+130.000000 107.000000 89.000000 88.000000 100.000000 114.000000 
+124.000000 129.000000 132.000000 134.000000 136.000000 136.000000 
+136.000000 136.000000 136.000000 137.000000 138.000000 139.000000 
+139.000000 133.000000 123.000000 116.000000 118.000000 124.000000 
+125.000000 121.000000 121.000000 129.000000 122.000000 121.000000 
+121.000000 125.000000 131.000000 131.000000 124.000000 121.000000 
+127.000000 131.000000 120.000000 96.000000 81.000000 90.000000 
+111.000000 124.000000 124.000000 123.000000 124.000000 126.000000 
+123.000000 118.000000 116.000000 116.000000 117.000000 120.000000 
+126.000000 131.000000 130.000000 127.000000 127.000000 129.000000 
+130.000000 129.000000 129.000000 131.000000 129.000000 126.000000 
+124.000000 126.000000 128.000000 127.000000 125.000000 124.000000 
+124.000000 124.000000 129.000000 139.000000 143.000000 129.000000 
+103.000000 88.000000 95.000000 114.000000 127.000000 131.000000 
+132.000000 135.000000 136.000000 133.000000 133.000000 137.000000 
+138.000000 133.000000 129.000000 131.000000 134.000000 132.000000 
+126.000000 122.000000 125.000000 126.000000 121.000000 117.000000 
+120.000000 126.000000 127.000000 126.000000 128.000000 134.000000 
+137.000000 131.000000 124.000000 126.000000 133.000000 133.000000 
+116.000000 91.000000 80.000000 94.000000 119.000000 137.000000 
+137.000000 127.000000 118.000000 117.000000 122.000000 129.000000 
+133.000000 133.000000 132.000000 131.000000 132.000000 134.000000 
+134.000000 134.000000 132.000000 128.000000 123.000000 121.000000 
+124.000000 129.000000 130.000000 125.000000 121.000000 122.000000 
+126.000000 125.000000 122.000000 123.000000 124.000000 125.000000 
+128.000000 137.000000 143.000000 132.000000 108.000000 90.000000 
+94.000000 111.000000 126.000000 130.000000 129.000000 129.000000 
+129.000000 130.000000 133.000000 135.000000 133.000000 129.000000 
+130.000000 137.000000 142.000000 141.000000 135.000000 127.000000 
+120.000000 118.000000 118.000000 120.000000 121.000000 120.000000 
+136.000000 133.000000 130.000000 131.000000 133.000000 131.000000 
+125.000000 123.000000 126.000000 125.000000 109.000000 87.000000 
+79.000000 95.000000 120.000000 136.000000 137.000000 130.000000 
+128.000000 130.000000 130.000000 126.000000 122.000000 122.000000 
+123.000000 122.000000 119.000000 122.000000 130.000000 137.000000 
+137.000000 131.000000 126.000000 126.000000 130.000000 133.000000 
+131.000000 127.000000 124.000000 123.000000 124.000000 125.000000 
+127.000000 128.000000 126.000000 126.000000 132.000000 143.000000 
+149.000000 136.000000 110.000000 90.000000 90.000000 105.000000 
+121.000000 129.000000 130.000000 130.000000 132.000000 136.000000 
+139.000000 138.000000 135.000000 134.000000 135.000000 136.000000 
+137.000000 136.000000 134.000000 131.000000 126.000000 119.000000 
+117.000000 121.000000 125.000000 124.000000 136.000000 130.000000 
+128.000000 133.000000 137.000000 133.000000 123.000000 120.000000 
+124.000000 122.000000 103.000000 83.000000 83.000000 104.000000 
+127.000000 135.000000 131.000000 127.000000 128.000000 129.000000 
+128.000000 127.000000 127.000000 125.000000 119.000000 117.000000 
+121.000000 129.000000 134.000000 134.000000 130.000000 126.000000 
+124.000000 122.000000 122.000000 122.000000 123.000000 126.000000 
+130.000000 131.000000 128.000000 127.000000 131.000000 135.000000 
+134.000000 129.000000 131.000000 142.000000 147.000000 133.000000 
+105.000000 83.000000 81.000000 95.000000 111.000000 122.000000 
+127.000000 128.000000 127.000000 129.000000 133.000000 135.000000 
+134.000000 131.000000 133.000000 138.000000 141.000000 140.000000 
+138.000000 134.000000 129.000000 121.000000 114.000000 114.000000 
+120.000000 126.000000 133.000000 127.000000 122.000000 128.000000 
+135.000000 133.000000 128.000000 127.000000 127.000000 114.000000 
+89.000000 72.000000 79.000000 102.000000 122.000000 128.000000 
+128.000000 128.000000 127.000000 123.000000 119.000000 121.000000 
+125.000000 127.000000 124.000000 122.000000 123.000000 127.000000 
+130.000000 129.000000 127.000000 127.000000 128.000000 128.000000 
+127.000000 125.000000 120.000000 117.000000 118.000000 124.000000 
+131.000000 134.000000 136.000000 137.000000 135.000000 131.000000 
+131.000000 138.000000 142.000000 129.000000 100.000000 76.000000 
+71.000000 84.000000 102.000000 115.000000 123.000000 127.000000 
+131.000000 135.000000 134.000000 130.000000 127.000000 129.000000 
+133.000000 136.000000 136.000000 136.000000 138.000000 136.000000 
+129.000000 121.000000 117.000000 117.000000 118.000000 121.000000 
+127.000000 126.000000 125.000000 126.000000 129.000000 129.000000 
+131.000000 135.000000 130.000000 110.000000 84.000000 74.000000 
+89.000000 114.000000 129.000000 130.000000 128.000000 126.000000 
+125.000000 124.000000 124.000000 126.000000 129.000000 130.000000 
+128.000000 127.000000 125.000000 124.000000 125.000000 125.000000 
+125.000000 124.000000 124.000000 124.000000 125.000000 127.000000 
+127.000000 125.000000 125.000000 127.000000 130.000000 131.000000 
+130.000000 129.000000 126.000000 122.000000 122.000000 132.000000 
+143.000000 138.000000 110.000000 82.000000 73.000000 79.000000 
+92.000000 105.000000 119.000000 130.000000 133.000000 129.000000 
+129.000000 135.000000 141.000000 139.000000 133.000000 132.000000 
+134.000000 136.000000 136.000000 137.000000 134.000000 128.000000 
+121.000000 119.000000 119.000000 121.000000 129.000000 127.000000 
+123.000000 112.000000 93.000000 77.000000 77.000000 85.000000 
+84.000000 73.000000 78.000000 116.000000 150.000000 137.000000 
+78.000000 20.000000 12.000000 10.000000 6.000000 17.000000 
+16.000000 13.000000 9.000000 4.000000 5.000000 8.000000 
+11.000000 10.000000 7.000000 6.000000 10.000000 11.000000 
+9.000000 7.000000 6.000000 6.000000 6.000000 9.000000 
+9.000000 11.000000 8.000000 6.000000 8.000000 10.000000 
+12.000000 11.000000 9.000000 9.000000 12.000000 15.000000 
+15.000000 9.000000 15.000000 40.000000 66.000000 78.000000 
+80.000000 83.000000 86.000000 88.000000 91.000000 92.000000 
+84.000000 72.000000 73.000000 84.000000 91.000000 101.000000 
+117.000000 131.000000 132.000000 122.000000 116.000000 119.000000 
+124.000000 124.000000 131.000000 135.000000 134.000000 127.000000 
+114.000000 92.000000 71.000000 65.000000 71.000000 73.000000 
+75.000000 94.000000 127.000000 135.000000 101.000000 51.000000 
+20.000000 19.000000 17.000000 12.000000 13.000000 13.000000 
+10.000000 9.000000 5.000000 8.000000 15.000000 15.000000 
+9.000000 7.000000 12.000000 13.000000 10.000000 10.000000 
+10.000000 10.000000 10.000000 9.000000 10.000000 10.000000 
+7.000000 6.000000 9.000000 13.000000 10.000000 9.000000 
+14.000000 16.000000 13.000000 11.000000 11.000000 8.000000 
+6.000000 18.000000 41.000000 66.000000 89.000000 106.000000 
+112.000000 108.000000 103.000000 91.000000 74.000000 75.000000 
+92.000000 100.000000 96.000000 100.000000 114.000000 124.000000 
+123.000000 118.000000 120.000000 123.000000 123.000000 120.000000 
+133.000000 125.000000 119.000000 127.000000 139.000000 134.000000 
+107.000000 73.000000 55.000000 63.000000 74.000000 81.000000 
+99.000000 117.000000 109.000000 69.000000 25.000000 14.000000 
+13.000000 12.000000 22.000000 17.000000 11.000000 11.000000 
+11.000000 12.000000 14.000000 14.000000 9.000000 5.000000 
+8.000000 11.000000 9.000000 8.000000 11.000000 11.000000 
+9.000000 9.000000 12.000000 17.000000 14.000000 10.000000 
+10.000000 11.000000 16.000000 12.000000 9.000000 10.000000 
+9.000000 11.000000 6.000000 4.000000 5.000000 21.000000 
+45.000000 72.000000 101.000000 121.000000 123.000000 116.000000 
+101.000000 83.000000 74.000000 83.000000 91.000000 93.000000 
+99.000000 110.000000 118.000000 120.000000 122.000000 128.000000 
+129.000000 124.000000 117.000000 113.000000 136.000000 132.000000 
+119.000000 109.000000 118.000000 149.000000 167.000000 141.000000 
+86.000000 52.000000 62.000000 92.000000 106.000000 104.000000 
+94.000000 72.000000 39.000000 14.000000 6.000000 1.000000 
+2.000000 10.000000 12.000000 10.000000 9.000000 9.000000 
+8.000000 11.000000 11.000000 10.000000 9.000000 7.000000 
+5.000000 8.000000 10.000000 7.000000 9.000000 14.000000 
+16.000000 17.000000 17.000000 21.000000 19.000000 18.000000 
+27.000000 21.000000 20.000000 20.000000 6.000000 0.000000 
+4.000000 24.000000 21.000000 33.000000 69.000000 91.000000 
+104.000000 123.000000 132.000000 121.000000 100.000000 87.000000 
+88.000000 89.000000 90.000000 101.000000 116.000000 120.000000 
+115.000000 116.000000 126.000000 133.000000 131.000000 126.000000 
+124.000000 123.000000 124.000000 130.000000 133.000000 126.000000 
+115.000000 122.000000 152.000000 173.000000 148.000000 94.000000 
+61.000000 72.000000 100.000000 105.000000 93.000000 82.000000 
+69.000000 64.000000 74.000000 71.000000 53.000000 37.000000 
+20.000000 10.000000 6.000000 6.000000 0.000000 2.000000 
+9.000000 9.000000 8.000000 6.000000 6.000000 8.000000 
+7.000000 11.000000 18.000000 22.000000 19.000000 12.000000 
+9.000000 12.000000 14.000000 21.000000 27.000000 39.000000 
+71.000000 92.000000 84.000000 57.000000 16.000000 0.000000 
+11.000000 53.000000 79.000000 99.000000 107.000000 116.000000 
+118.000000 103.000000 86.000000 79.000000 79.000000 82.000000 
+90.000000 103.000000 111.000000 111.000000 112.000000 120.000000 
+129.000000 134.000000 135.000000 135.000000 133.000000 128.000000 
+112.000000 109.000000 120.000000 136.000000 138.000000 125.000000 
+118.000000 132.000000 148.000000 130.000000 86.000000 57.000000 
+66.000000 95.000000 106.000000 100.000000 96.000000 105.000000 
+124.000000 139.000000 132.000000 104.000000 67.000000 37.000000 
+13.000000 13.000000 30.000000 27.000000 17.000000 13.000000 
+9.000000 9.000000 11.000000 12.000000 12.000000 14.000000 
+19.000000 28.000000 22.000000 10.000000 18.000000 18.000000 
+6.000000 12.000000 28.000000 54.000000 73.000000 105.000000 
+201.000000 320.000000 341.000000 228.000000 143.000000 126.000000 
+108.000000 98.000000 98.000000 94.000000 93.000000 93.000000 
+85.000000 75.000000 75.000000 85.000000 100.000000 110.000000 
+113.000000 112.000000 114.000000 122.000000 128.000000 131.000000 
+131.000000 134.000000 136.000000 137.000000 114.000000 108.000000 
+107.000000 117.000000 136.000000 148.000000 132.000000 106.000000 
+99.000000 111.000000 112.000000 84.000000 56.000000 71.000000 
+109.000000 125.000000 115.000000 111.000000 145.000000 170.000000 
+177.000000 162.000000 120.000000 75.000000 40.000000 24.000000 
+41.000000 46.000000 33.000000 19.000000 9.000000 12.000000 
+18.000000 22.000000 14.000000 20.000000 22.000000 19.000000 
+20.000000 22.000000 33.000000 34.000000 20.000000 26.000000 
+59.000000 66.000000 92.000000 184.000000 313.000000 475.000000 
+580.000000 501.000000 328.000000 225.000000 147.000000 77.000000 
+57.000000 76.000000 96.000000 90.000000 74.000000 81.000000 
+99.000000 107.000000 110.000000 116.000000 116.000000 109.000000 
+109.000000 117.000000 122.000000 121.000000 122.000000 131.000000 
+141.000000 146.000000 113.000000 114.000000 107.000000 104.000000 
+119.000000 141.000000 147.000000 130.000000 105.000000 92.000000 
+96.000000 92.000000 74.000000 74.000000 115.000000 140.000000 
+123.000000 158.000000 249.000000 278.000000 256.000000 216.000000 
+159.000000 106.000000 74.000000 38.000000 28.000000 39.000000 
+35.000000 22.000000 8.000000 12.000000 14.000000 20.000000 
+18.000000 24.000000 28.000000 22.000000 25.000000 28.000000 
+24.000000 31.000000 36.000000 62.000000 73.000000 78.000000 
+185.000000 348.000000 418.000000 474.000000 536.000000 469.000000 
+315.000000 194.000000 103.000000 53.000000 61.000000 96.000000 
+98.000000 72.000000 70.000000 100.000000 123.000000 120.000000 
+114.000000 112.000000 108.000000 104.000000 110.000000 117.000000 
+117.000000 119.000000 127.000000 132.000000 127.000000 127.000000 
+120.000000 118.000000 108.000000 104.000000 114.000000 131.000000 
+142.000000 145.000000 132.000000 99.000000 72.000000 73.000000 
+79.000000 81.000000 110.000000 138.000000 127.000000 192.000000 
+339.000000 375.000000 329.000000 260.000000 173.000000 104.000000 
+87.000000 49.000000 35.000000 45.000000 37.000000 22.000000 
+19.000000 23.000000 14.000000 12.000000 21.000000 21.000000 
+13.000000 19.000000 23.000000 21.000000 23.000000 26.000000 
+51.000000 87.000000 83.000000 131.000000 251.000000 309.000000 
+301.000000 386.000000 446.000000 363.000000 213.000000 107.000000 
+63.000000 64.000000 81.000000 93.000000 92.000000 95.000000 
+111.000000 124.000000 122.000000 117.000000 117.000000 117.000000 
+115.000000 118.000000 124.000000 123.000000 119.000000 120.000000 
+125.000000 123.000000 119.000000 124.000000 135.000000 131.000000 
+118.000000 111.000000 113.000000 117.000000 122.000000 134.000000 
+142.000000 129.000000 96.000000 73.000000 67.000000 61.000000 
+79.000000 121.000000 130.000000 181.000000 305.000000 362.000000 
+341.000000 277.000000 184.000000 140.000000 140.000000 87.000000 
+45.000000 48.000000 43.000000 25.000000 26.000000 35.000000 
+25.000000 15.000000 25.000000 35.000000 25.000000 17.000000 
+9.000000 13.000000 15.000000 22.000000 63.000000 80.000000 
+85.000000 179.000000 282.000000 244.000000 138.000000 228.000000 
+320.000000 277.000000 171.000000 95.000000 76.000000 89.000000 
+102.000000 104.000000 107.000000 114.000000 116.000000 112.000000 
+111.000000 115.000000 117.000000 120.000000 126.000000 132.000000 
+132.000000 127.000000 122.000000 117.000000 113.000000 115.000000 
+127.000000 140.000000 136.000000 137.000000 130.000000 123.000000 
+119.000000 113.000000 112.000000 122.000000 136.000000 133.000000 
+109.000000 83.000000 70.000000 52.000000 39.000000 84.000000 
+130.000000 162.000000 203.000000 251.000000 286.000000 270.000000 
+219.000000 190.000000 156.000000 90.000000 45.000000 52.000000 
+50.000000 33.000000 26.000000 26.000000 13.000000 12.000000 
+28.000000 52.000000 56.000000 28.000000 2.000000 9.000000 
+22.000000 39.000000 49.000000 62.000000 121.000000 224.000000 
+275.000000 175.000000 119.000000 211.000000 273.000000 232.000000 
+155.000000 95.000000 74.000000 96.000000 130.000000 136.000000 
+113.000000 87.000000 81.000000 98.000000 117.000000 120.000000 
+115.000000 118.000000 129.000000 137.000000 136.000000 129.000000 
+124.000000 122.000000 122.000000 126.000000 133.000000 138.000000 
+133.000000 136.000000 135.000000 132.000000 127.000000 121.000000 
+117.000000 121.000000 128.000000 126.000000 108.000000 86.000000 
+72.000000 58.000000 35.000000 44.000000 94.000000 129.000000 
+134.000000 157.000000 203.000000 220.000000 200.000000 159.000000 
+107.000000 71.000000 64.000000 74.000000 68.000000 54.000000 
+47.000000 42.000000 34.000000 37.000000 43.000000 49.000000 
+42.000000 22.000000 19.000000 29.000000 40.000000 51.000000 
+72.000000 130.000000 214.000000 251.000000 200.000000 119.000000 
+177.000000 284.000000 298.000000 217.000000 134.000000 80.000000 
+70.000000 97.000000 123.000000 123.000000 93.000000 65.000000 
+76.000000 110.000000 127.000000 121.000000 114.000000 119.000000 
+129.000000 134.000000 135.000000 132.000000 127.000000 123.000000 
+127.000000 136.000000 141.000000 139.000000 129.000000 130.000000 
+132.000000 129.000000 123.000000 115.000000 113.000000 121.000000 
+136.000000 143.000000 129.000000 97.000000 68.000000 57.000000 
+52.000000 44.000000 61.000000 89.000000 104.000000 119.000000 
+143.000000 154.000000 142.000000 110.000000 79.000000 67.000000 
+74.000000 84.000000 89.000000 88.000000 86.000000 84.000000 
+80.000000 77.000000 76.000000 71.000000 58.000000 46.000000 
+53.000000 55.000000 56.000000 79.000000 135.000000 189.000000 
+212.000000 180.000000 134.000000 193.000000 287.000000 337.000000 
+309.000000 209.000000 111.000000 62.000000 79.000000 110.000000 
+109.000000 90.000000 63.000000 63.000000 93.000000 116.000000 
+118.000000 116.000000 122.000000 130.000000 130.000000 127.000000 
+125.000000 124.000000 122.000000 122.000000 126.000000 133.000000 
+137.000000 134.000000 122.000000 122.000000 127.000000 130.000000 
+125.000000 117.000000 114.000000 120.000000 128.000000 134.000000 
+130.000000 112.000000 87.000000 68.000000 65.000000 70.000000 
+72.000000 78.000000 85.000000 93.000000 101.000000 102.000000 
+94.000000 80.000000 69.000000 68.000000 81.000000 100.000000 
+110.000000 111.000000 115.000000 120.000000 119.000000 120.000000 
+126.000000 124.000000 105.000000 88.000000 84.000000 80.000000 
+83.000000 105.000000 120.000000 124.000000 127.000000 121.000000 
+150.000000 268.000000 382.000000 406.000000 327.000000 193.000000 
+85.000000 64.000000 100.000000 115.000000 87.000000 48.000000 
+33.000000 65.000000 107.000000 122.000000 120.000000 121.000000 
+127.000000 128.000000 126.000000 124.000000 124.000000 126.000000 
+129.000000 132.000000 134.000000 133.000000 130.000000 124.000000 
+121.000000 121.000000 128.000000 131.000000 127.000000 122.000000 
+119.000000 114.000000 110.000000 117.000000 130.000000 132.000000 
+110.000000 78.000000 66.000000 75.000000 90.000000 97.000000 
+99.000000 96.000000 87.000000 75.000000 69.000000 71.000000 
+79.000000 93.000000 113.000000 124.000000 118.000000 114.000000 
+126.000000 137.000000 138.000000 141.000000 149.000000 141.000000 
+115.000000 107.000000 112.000000 104.000000 97.000000 93.000000 
+79.000000 81.000000 102.000000 142.000000 223.000000 335.000000 
+436.000000 449.000000 333.000000 167.000000 77.000000 83.000000 
+106.000000 93.000000 52.000000 20.000000 26.000000 65.000000 
+105.000000 121.000000 122.000000 123.000000 125.000000 124.000000 
+118.000000 114.000000 120.000000 131.000000 137.000000 134.000000 
+131.000000 132.000000 135.000000 131.000000 120.000000 119.000000 
+118.000000 119.000000 123.000000 128.000000 123.000000 111.000000 
+105.000000 121.000000 145.000000 149.000000 123.000000 86.000000 
+68.000000 76.000000 95.000000 106.000000 102.000000 91.000000 
+84.000000 83.000000 84.000000 88.000000 96.000000 115.000000 
+134.000000 133.000000 119.000000 117.000000 127.000000 128.000000 
+122.000000 128.000000 133.000000 122.000000 111.000000 127.000000 
+138.000000 122.000000 105.000000 93.000000 85.000000 95.000000 
+118.000000 179.000000 282.000000 373.000000 423.000000 387.000000 
+255.000000 121.000000 85.000000 96.000000 86.000000 59.000000 
+27.000000 29.000000 59.000000 86.000000 107.000000 119.000000 
+123.000000 122.000000 122.000000 123.000000 120.000000 114.000000 
+118.000000 129.000000 136.000000 132.000000 127.000000 131.000000 
+137.000000 138.000000 124.000000 121.000000 119.000000 122.000000 
+132.000000 137.000000 128.000000 116.000000 117.000000 129.000000 
+140.000000 140.000000 129.000000 114.000000 100.000000 94.000000 
+97.000000 99.000000 90.000000 76.000000 74.000000 87.000000 
+99.000000 100.000000 100.000000 115.000000 133.000000 137.000000 
+133.000000 132.000000 129.000000 122.000000 123.000000 135.000000 
+134.000000 119.000000 119.000000 137.000000 140.000000 127.000000 
+120.000000 110.000000 104.000000 109.000000 126.000000 195.000000 
+299.000000 365.000000 355.000000 265.000000 150.000000 93.000000 
+96.000000 93.000000 59.000000 25.000000 20.000000 52.000000 
+89.000000 105.000000 112.000000 121.000000 125.000000 121.000000 
+115.000000 116.000000 119.000000 121.000000 123.000000 129.000000 
+133.000000 131.000000 126.000000 126.000000 129.000000 133.000000 
+126.000000 123.000000 125.000000 132.000000 139.000000 136.000000 
+125.000000 122.000000 131.000000 138.000000 134.000000 127.000000 
+124.000000 123.000000 116.000000 105.000000 99.000000 100.000000 
+97.000000 91.000000 89.000000 96.000000 107.000000 110.000000 
+103.000000 106.000000 121.000000 135.000000 143.000000 143.000000 
+134.000000 128.000000 135.000000 143.000000 139.000000 131.000000 
+133.000000 138.000000 135.000000 137.000000 141.000000 131.000000 
+125.000000 125.000000 129.000000 208.000000 320.000000 361.000000 
+304.000000 202.000000 128.000000 104.000000 89.000000 62.000000 
+30.000000 10.000000 27.000000 66.000000 97.000000 112.000000 
+116.000000 116.000000 118.000000 121.000000 124.000000 127.000000 
+127.000000 124.000000 118.000000 115.000000 120.000000 128.000000 
+131.000000 125.000000 120.000000 124.000000 117.000000 120.000000 
+126.000000 135.000000 138.000000 131.000000 122.000000 125.000000 
+136.000000 138.000000 129.000000 121.000000 119.000000 117.000000 
+108.000000 97.000000 94.000000 99.000000 107.000000 115.000000 
+118.000000 120.000000 126.000000 128.000000 116.000000 100.000000 
+107.000000 127.000000 140.000000 141.000000 135.000000 139.000000 
+147.000000 145.000000 133.000000 128.000000 134.000000 139.000000 
+142.000000 146.000000 141.000000 127.000000 129.000000 122.000000 
+129.000000 232.000000 344.000000 364.000000 296.000000 210.000000 
+149.000000 106.000000 68.000000 38.000000 25.000000 36.000000 
+65.000000 95.000000 115.000000 122.000000 122.000000 123.000000 
+128.000000 132.000000 132.000000 132.000000 133.000000 131.000000 
+125.000000 122.000000 129.000000 138.000000 137.000000 127.000000 
+118.000000 122.000000 120.000000 133.000000 143.000000 143.000000 
+132.000000 118.000000 113.000000 119.000000 126.000000 128.000000 
+124.000000 122.000000 125.000000 125.000000 115.000000 101.000000 
+94.000000 99.000000 113.000000 127.000000 137.000000 145.000000 
+149.000000 145.000000 123.000000 95.000000 108.000000 136.000000 
+142.000000 134.000000 132.000000 144.000000 150.000000 139.000000 
+123.000000 119.000000 126.000000 134.000000 143.000000 145.000000 
+130.000000 116.000000 122.000000 120.000000 144.000000 246.000000 
+345.000000 360.000000 301.000000 214.000000 136.000000 82.000000 
+55.000000 47.000000 60.000000 87.000000 109.000000 116.000000 
+112.000000 107.000000 111.000000 123.000000 130.000000 129.000000 
+126.000000 130.000000 136.000000 137.000000 134.000000 135.000000 
+141.000000 143.000000 136.000000 129.000000 126.000000 126.000000 
+127.000000 133.000000 135.000000 126.000000 114.000000 109.000000 
+112.000000 117.000000 121.000000 127.000000 133.000000 133.000000 
+131.000000 127.000000 121.000000 113.000000 108.000000 108.000000 
+113.000000 122.000000 139.000000 156.000000 159.000000 145.000000 
+113.000000 93.000000 118.000000 142.000000 140.000000 129.000000 
+130.000000 137.000000 132.000000 121.000000 117.000000 122.000000 
+129.000000 140.000000 152.000000 150.000000 129.000000 117.000000 
+125.000000 136.000000 168.000000 245.000000 320.000000 328.000000 
+261.000000 159.000000 85.000000 63.000000 71.000000 86.000000 
+98.000000 111.000000 119.000000 117.000000 111.000000 111.000000 
+118.000000 122.000000 121.000000 123.000000 132.000000 141.000000 
+138.000000 130.000000 128.000000 134.000000 138.000000 137.000000 
+135.000000 134.000000 130.000000 124.000000 126.000000 126.000000 
+123.000000 115.000000 111.000000 114.000000 119.000000 125.000000 
+132.000000 136.000000 133.000000 124.000000 118.000000 117.000000 
+118.000000 116.000000 114.000000 114.000000 112.000000 115.000000 
+129.000000 144.000000 145.000000 125.000000 99.000000 97.000000 
+116.000000 127.000000 123.000000 120.000000 125.000000 129.000000 
+125.000000 119.000000 119.000000 126.000000 138.000000 151.000000 
+150.000000 131.000000 107.000000 99.000000 111.000000 133.000000 
+170.000000 221.000000 259.000000 241.000000 166.000000 89.000000 
+62.000000 77.000000 101.000000 112.000000 115.000000 120.000000 
+125.000000 128.000000 129.000000 128.000000 120.000000 114.000000 
+118.000000 133.000000 146.000000 145.000000 132.000000 120.000000 
+119.000000 125.000000 132.000000 138.000000 139.000000 135.000000 
+130.000000 128.000000 135.000000 128.000000 121.000000 117.000000 
+116.000000 115.000000 116.000000 120.000000 125.000000 126.000000 
+122.000000 120.000000 121.000000 126.000000 125.000000 119.000000 
+112.000000 106.000000 104.000000 110.000000 122.000000 129.000000 
+127.000000 110.000000 93.000000 93.000000 100.000000 108.000000 
+112.000000 118.000000 126.000000 130.000000 128.000000 123.000000 
+118.000000 122.000000 137.000000 147.000000 140.000000 117.000000 
+92.000000 76.000000 76.000000 98.000000 143.000000 189.000000 
+200.000000 163.000000 105.000000 77.000000 83.000000 95.000000 
+102.000000 107.000000 117.000000 126.000000 127.000000 122.000000 
+118.000000 116.000000 113.000000 117.000000 128.000000 139.000000 
+141.000000 133.000000 125.000000 121.000000 118.000000 118.000000 
+127.000000 140.000000 145.000000 140.000000 136.000000 137.000000 
+135.000000 131.000000 125.000000 125.000000 127.000000 122.000000 
+114.000000 112.000000 118.000000 126.000000 129.000000 129.000000 
+128.000000 127.000000 126.000000 121.000000 110.000000 103.000000 
+105.000000 112.000000 111.000000 102.000000 100.000000 100.000000 
+91.000000 66.000000 46.000000 60.000000 92.000000 133.000000 
+156.000000 157.000000 151.000000 145.000000 140.000000 139.000000 
+147.000000 153.000000 145.000000 121.000000 93.000000 71.000000 
+65.000000 78.000000 106.000000 140.000000 151.000000 132.000000 
+107.000000 98.000000 102.000000 105.000000 104.000000 107.000000 
+114.000000 119.000000 119.000000 120.000000 123.000000 123.000000 
+119.000000 119.000000 128.000000 136.000000 137.000000 131.000000 
+126.000000 124.000000 123.000000 123.000000 125.000000 128.000000 
+132.000000 135.000000 138.000000 138.000000 112.000000 135.000000 
+134.000000 125.000000 124.000000 125.000000 120.000000 115.000000 
+122.000000 131.000000 129.000000 119.000000 116.000000 122.000000 
+124.000000 115.000000 100.000000 95.000000 102.000000 109.000000 
+104.000000 89.000000 79.000000 78.000000 71.000000 46.000000 
+22.000000 30.000000 72.000000 136.000000 172.000000 176.000000 
+173.000000 172.000000 171.000000 173.000000 182.000000 188.000000 
+162.000000 108.000000 63.000000 49.000000 60.000000 78.000000 
+89.000000 104.000000 120.000000 119.000000 100.000000 84.000000 
+90.000000 106.000000 115.000000 117.000000 117.000000 120.000000 
+121.000000 123.000000 125.000000 123.000000 119.000000 119.000000 
+125.000000 133.000000 139.000000 141.000000 138.000000 132.000000 
+125.000000 122.000000 121.000000 121.000000 120.000000 122.000000 
+128.000000 135.000000 73.000000 106.000000 124.000000 125.000000 
+123.000000 123.000000 121.000000 117.000000 120.000000 123.000000 
+121.000000 116.000000 120.000000 131.000000 134.000000 119.000000 
+101.000000 95.000000 99.000000 102.000000 98.000000 90.000000 
+78.000000 63.000000 50.000000 46.000000 56.000000 59.000000 
+77.000000 114.000000 145.000000 162.000000 168.000000 170.000000 
+177.000000 191.000000 205.000000 198.000000 149.000000 74.000000 
+30.000000 23.000000 40.000000 64.000000 81.000000 96.000000 
+107.000000 107.000000 91.000000 76.000000 83.000000 105.000000 
+121.000000 122.000000 118.000000 117.000000 119.000000 119.000000 
+120.000000 120.000000 120.000000 120.000000 125.000000 133.000000 
+139.000000 139.000000 135.000000 133.000000 132.000000 129.000000 
+126.000000 124.000000 127.000000 131.000000 134.000000 131.000000 
+68.000000 72.000000 100.000000 130.000000 139.000000 128.000000 
+116.000000 116.000000 120.000000 122.000000 121.000000 122.000000 
+127.000000 130.000000 126.000000 115.000000 100.000000 90.000000 
+89.000000 91.000000 90.000000 85.000000 79.000000 71.000000 
+64.000000 59.000000 56.000000 59.000000 64.000000 76.000000 
+97.000000 117.000000 127.000000 135.000000 147.000000 154.000000 
+139.000000 108.000000 75.000000 55.000000 67.000000 61.000000 
+44.000000 45.000000 65.000000 90.000000 101.000000 95.000000 
+82.000000 78.000000 90.000000 112.000000 130.000000 134.000000 
+130.000000 128.000000 127.000000 124.000000 118.000000 115.000000 
+117.000000 121.000000 126.000000 131.000000 132.000000 129.000000 
+125.000000 126.000000 130.000000 132.000000 128.000000 121.000000 
+119.000000 119.000000 121.000000 123.000000 80.000000 74.000000 
+95.000000 121.000000 129.000000 121.000000 114.000000 118.000000 
+127.000000 132.000000 130.000000 127.000000 126.000000 125.000000 
+121.000000 108.000000 90.000000 79.000000 81.000000 88.000000 
+86.000000 79.000000 77.000000 80.000000 79.000000 70.000000 
+65.000000 70.000000 77.000000 74.000000 63.000000 55.000000 
+59.000000 66.000000 66.000000 57.000000 44.000000 44.000000 
+66.000000 90.000000 96.000000 87.000000 72.000000 66.000000 
+78.000000 91.000000 94.000000 86.000000 77.000000 78.000000 
+90.000000 108.000000 125.000000 133.000000 133.000000 128.000000 
+124.000000 122.000000 119.000000 116.000000 116.000000 118.000000 
+122.000000 124.000000 122.000000 118.000000 119.000000 125.000000 
+130.000000 128.000000 122.000000 119.000000 120.000000 123.000000 
+124.000000 124.000000 101.000000 116.000000 126.000000 122.000000 
+116.000000 114.000000 116.000000 118.000000 121.000000 125.000000 
+128.000000 126.000000 123.000000 125.000000 123.000000 111.000000 
+95.000000 87.000000 87.000000 86.000000 83.000000 84.000000 
+90.000000 95.000000 94.000000 97.000000 106.000000 104.000000 
+85.000000 63.000000 51.000000 51.000000 52.000000 47.000000 
+39.000000 47.000000 70.000000 90.000000 95.000000 86.000000 
+68.000000 54.000000 47.000000 56.000000 83.000000 106.000000 
+108.000000 95.000000 85.000000 87.000000 98.000000 110.000000 
+120.000000 127.000000 130.000000 129.000000 124.000000 120.000000 
+117.000000 117.000000 116.000000 117.000000 119.000000 121.000000 
+118.000000 114.000000 114.000000 121.000000 132.000000 136.000000 
+132.000000 126.000000 125.000000 129.000000 131.000000 128.000000 
+124.000000 129.000000 130.000000 125.000000 121.000000 120.000000 
+120.000000 120.000000 120.000000 121.000000 121.000000 122.000000 
+126.000000 129.000000 124.000000 111.000000 99.000000 94.000000 
+92.000000 92.000000 91.000000 93.000000 95.000000 93.000000 
+90.000000 86.000000 76.000000 61.000000 47.000000 45.000000 
+53.000000 61.000000 58.000000 48.000000 44.000000 44.000000 
+44.000000 46.000000 54.000000 67.000000 76.000000 74.000000 
+72.000000 77.000000 90.000000 99.000000 96.000000 87.000000 
+82.000000 86.000000 99.000000 115.000000 124.000000 126.000000 
+126.000000 127.000000 127.000000 123.000000 117.000000 113.000000 
+115.000000 121.000000 124.000000 123.000000 122.000000 122.000000 
+126.000000 131.000000 135.000000 134.000000 128.000000 124.000000 
+124.000000 128.000000 131.000000 131.000000 128.000000 125.000000 
+122.000000 125.000000 129.000000 129.000000 125.000000 122.000000 
+121.000000 121.000000 121.000000 126.000000 133.000000 133.000000 
+122.000000 102.000000 87.000000 83.000000 87.000000 94.000000 
+101.000000 106.000000 103.000000 92.000000 79.000000 69.000000 
+57.000000 40.000000 28.000000 59.000000 132.000000 203.000000 
+206.000000 137.000000 63.000000 35.000000 43.000000 56.000000 
+54.000000 48.000000 55.000000 73.000000 88.000000 93.000000 
+88.000000 84.000000 84.000000 87.000000 90.000000 95.000000 
+103.000000 113.000000 118.000000 119.000000 121.000000 127.000000 
+131.000000 126.000000 118.000000 114.000000 117.000000 123.000000 
+125.000000 124.000000 124.000000 126.000000 129.000000 130.000000 
+128.000000 123.000000 119.000000 120.000000 122.000000 125.000000 
+129.000000 133.000000 122.000000 123.000000 127.000000 132.000000 
+131.000000 128.000000 125.000000 123.000000 120.000000 119.000000 
+122.000000 127.000000 130.000000 129.000000 122.000000 110.000000 
+93.000000 82.000000 87.000000 104.000000 119.000000 119.000000 
+103.000000 78.000000 58.000000 50.000000 44.000000 28.000000 
+23.000000 78.000000 237.000000 399.000000 424.000000 289.000000 
+125.000000 47.000000 31.000000 42.000000 47.000000 46.000000 
+47.000000 54.000000 69.000000 90.000000 107.000000 105.000000 
+90.000000 83.000000 93.000000 106.000000 111.000000 111.000000 
+114.000000 120.000000 125.000000 128.000000 128.000000 125.000000 
+122.000000 122.000000 125.000000 126.000000 122.000000 119.000000 
+123.000000 129.000000 131.000000 131.000000 131.000000 129.000000 
+124.000000 117.000000 115.000000 120.000000 127.000000 132.000000 
+115.000000 112.000000 119.000000 131.000000 139.000000 135.000000 
+125.000000 115.000000 113.000000 119.000000 128.000000 131.000000 
+128.000000 124.000000 120.000000 114.000000 104.000000 99.000000 
+106.000000 122.000000 129.000000 118.000000 95.000000 72.000000 
+57.000000 45.000000 33.000000 24.000000 34.000000 91.000000 
+245.000000 395.000000 435.000000 345.000000 202.000000 89.000000 
+33.000000 31.000000 50.000000 63.000000 59.000000 47.000000 
+47.000000 65.000000 90.000000 104.000000 103.000000 98.000000 
+99.000000 106.000000 108.000000 109.000000 115.000000 125.000000 
+130.000000 128.000000 126.000000 127.000000 129.000000 131.000000 
+132.000000 128.000000 116.000000 105.000000 105.000000 117.000000 
+131.000000 138.000000 134.000000 127.000000 121.000000 122.000000 
+126.000000 130.000000 126.000000 120.000000 127.000000 125.000000 
+130.000000 139.000000 145.000000 142.000000 133.000000 125.000000 
+125.000000 127.000000 128.000000 129.000000 128.000000 124.000000 
+115.000000 104.000000 100.000000 105.000000 116.000000 123.000000 
+123.000000 117.000000 107.000000 96.000000 80.000000 59.000000 
+38.000000 40.000000 56.000000 108.000000 210.000000 285.000000 
+280.000000 213.000000 129.000000 63.000000 30.000000 28.000000 
+49.000000 80.000000 93.000000 87.000000 72.000000 61.000000 
+69.000000 94.000000 106.000000 95.000000 81.000000 87.000000 
+104.000000 114.000000 115.000000 119.000000 124.000000 125.000000 
+124.000000 125.000000 129.000000 131.000000 133.000000 130.000000 
+122.000000 109.000000 101.000000 106.000000 120.000000 133.000000 
+135.000000 130.000000 126.000000 125.000000 127.000000 130.000000 
+129.000000 123.000000 118.000000 120.000000 127.000000 132.000000 
+131.000000 126.000000 123.000000 124.000000 126.000000 126.000000 
+123.000000 123.000000 124.000000 121.000000 111.000000 102.000000 
+101.000000 104.000000 100.000000 88.000000 82.000000 91.000000 
+105.000000 111.000000 103.000000 94.000000 94.000000 91.000000 
+80.000000 68.000000 95.000000 143.000000 159.000000 126.000000 
+77.000000 52.000000 61.000000 67.000000 58.000000 61.000000 
+94.000000 138.000000 154.000000 128.000000 80.000000 74.000000 
+95.000000 103.000000 94.000000 91.000000 104.000000 117.000000 
+118.000000 118.000000 125.000000 133.000000 133.000000 127.000000 
+125.000000 129.000000 134.000000 135.000000 127.000000 113.000000 
+103.000000 105.000000 117.000000 130.000000 135.000000 134.000000 
+130.000000 125.000000 121.000000 121.000000 125.000000 127.000000 
+116.000000 123.000000 127.000000 128.000000 127.000000 123.000000 
+116.000000 111.000000 113.000000 117.000000 119.000000 123.000000 
+128.000000 127.000000 113.000000 99.000000 100.000000 112.000000 
+120.000000 114.000000 102.000000 106.000000 121.000000 129.000000 
+128.000000 126.000000 125.000000 126.000000 127.000000 128.000000 
+113.000000 89.000000 79.000000 84.000000 92.000000 97.000000 
+104.000000 117.000000 125.000000 115.000000 111.000000 132.000000 
+162.000000 189.000000 188.000000 140.000000 96.000000 94.000000 
+98.000000 91.000000 91.000000 106.000000 123.000000 130.000000 
+130.000000 132.000000 134.000000 132.000000 127.000000 125.000000 
+124.000000 125.000000 128.000000 129.000000 127.000000 123.000000 
+123.000000 130.000000 135.000000 133.000000 125.000000 119.000000 
+120.000000 123.000000 125.000000 122.000000 124.000000 128.000000 
+130.000000 131.000000 131.000000 124.000000 112.000000 107.000000 
+113.000000 121.000000 124.000000 123.000000 126.000000 125.000000 
+106.000000 78.000000 68.000000 95.000000 136.000000 154.000000 
+143.000000 125.000000 119.000000 124.000000 127.000000 125.000000 
+125.000000 130.000000 136.000000 134.000000 124.000000 111.000000 
+104.000000 107.000000 117.000000 126.000000 130.000000 134.000000 
+138.000000 136.000000 128.000000 124.000000 137.000000 158.000000 
+175.000000 178.000000 155.000000 128.000000 111.000000 97.000000 
+89.000000 100.000000 121.000000 134.000000 133.000000 129.000000 
+129.000000 131.000000 129.000000 123.000000 120.000000 121.000000 
+126.000000 129.000000 129.000000 127.000000 126.000000 129.000000 
+135.000000 135.000000 130.000000 123.000000 123.000000 127.000000 
+129.000000 127.000000 122.000000 118.000000 119.000000 123.000000 
+126.000000 123.000000 117.000000 116.000000 119.000000 122.000000 
+124.000000 122.000000 118.000000 111.000000 104.000000 96.000000 
+89.000000 86.000000 89.000000 98.000000 109.000000 120.000000 
+130.000000 136.000000 134.000000 126.000000 122.000000 126.000000 
+131.000000 132.000000 130.000000 128.000000 129.000000 129.000000 
+128.000000 127.000000 130.000000 132.000000 134.000000 136.000000 
+138.000000 136.000000 130.000000 126.000000 134.000000 150.000000 
+154.000000 141.000000 129.000000 119.000000 111.000000 110.000000 
+118.000000 128.000000 131.000000 129.000000 129.000000 134.000000 
+136.000000 130.000000 123.000000 122.000000 127.000000 131.000000 
+131.000000 131.000000 133.000000 138.000000 141.000000 137.000000 
+129.000000 122.000000 121.000000 126.000000 127.000000 124.000000 
+117.000000 116.000000 118.000000 118.000000 120.000000 125.000000 
+128.000000 127.000000 121.000000 118.000000 121.000000 125.000000 
+121.000000 111.000000 104.000000 105.000000 110.000000 113.000000 
+111.000000 111.000000 117.000000 124.000000 128.000000 128.000000 
+128.000000 126.000000 124.000000 125.000000 131.000000 137.000000 
+140.000000 135.000000 126.000000 119.000000 116.000000 120.000000 
+127.000000 132.000000 132.000000 130.000000 130.000000 131.000000 
+129.000000 120.000000 111.000000 113.000000 120.000000 119.000000 
+109.000000 101.000000 99.000000 110.000000 122.000000 125.000000 
+123.000000 126.000000 132.000000 135.000000 131.000000 125.000000 
+123.000000 125.000000 128.000000 129.000000 129.000000 129.000000 
+129.000000 130.000000 132.000000 132.000000 128.000000 122.000000 
+119.000000 122.000000 124.000000 122.000000 115.000000 121.000000 
+127.000000 126.000000 121.000000 123.000000 129.000000 131.000000 
+127.000000 125.000000 131.000000 133.000000 119.000000 95.000000 
+89.000000 115.000000 156.000000 179.000000 163.000000 134.000000 
+117.000000 117.000000 124.000000 128.000000 128.000000 126.000000 
+124.000000 125.000000 128.000000 129.000000 125.000000 117.000000 
+111.000000 113.000000 120.000000 126.000000 127.000000 126.000000 
+126.000000 128.000000 131.000000 131.000000 128.000000 123.000000 
+118.000000 119.000000 121.000000 114.000000 99.000000 87.000000 
+86.000000 102.000000 123.000000 134.000000 135.000000 134.000000 
+136.000000 137.000000 135.000000 132.000000 132.000000 132.000000 
+131.000000 133.000000 137.000000 141.000000 141.000000 137.000000 
+134.000000 129.000000 124.000000 121.000000 121.000000 121.000000 
+120.000000 122.000000 125.000000 122.000000 124.000000 128.000000 
+129.000000 124.000000 124.000000 127.000000 126.000000 124.000000 
+129.000000 134.000000 124.000000 99.000000 90.000000 121.000000 
+171.000000 187.000000 159.000000 123.000000 111.000000 118.000000 
+126.000000 128.000000 131.000000 134.000000 131.000000 128.000000 
+130.000000 134.000000 129.000000 117.000000 109.000000 113.000000 
+121.000000 124.000000 123.000000 123.000000 125.000000 128.000000 
+131.000000 132.000000 127.000000 119.000000 118.000000 127.000000 
+135.000000 130.000000 113.000000 98.000000 94.000000 103.000000 
+117.000000 127.000000 134.000000 137.000000 137.000000 135.000000 
+132.000000 129.000000 127.000000 125.000000 125.000000 129.000000 
+137.000000 142.000000 139.000000 132.000000 126.000000 123.000000 
+120.000000 116.000000 113.000000 115.000000 120.000000 124.000000 
+126.000000 126.000000 128.000000 131.000000 131.000000 127.000000 
+124.000000 122.000000 124.000000 128.000000 130.000000 122.000000 
+103.000000 87.000000 91.000000 113.000000 136.000000 140.000000 
+128.000000 119.000000 117.000000 116.000000 115.000000 119.000000 
+129.000000 135.000000 132.000000 129.000000 131.000000 134.000000 
+130.000000 121.000000 118.000000 124.000000 130.000000 128.000000 
+123.000000 123.000000 126.000000 129.000000 131.000000 131.000000 
+128.000000 123.000000 124.000000 136.000000 144.000000 133.000000 
+109.000000 92.000000 94.000000 109.000000 124.000000 129.000000 
+129.000000 128.000000 126.000000 125.000000 126.000000 130.000000 
+132.000000 131.000000 127.000000 126.000000 131.000000 138.000000 
+140.000000 133.000000 124.000000 120.000000 123.000000 126.000000 
+128.000000 126.000000 125.000000 124.000000 130.000000 133.000000 
+130.000000 125.000000 125.000000 129.000000 131.000000 129.000000 
+128.000000 131.000000 129.000000 116.000000 98.000000 91.000000 
+100.000000 114.000000 121.000000 121.000000 119.000000 120.000000 
+120.000000 119.000000 119.000000 120.000000 120.000000 122.000000 
+126.000000 131.000000 132.000000 127.000000 121.000000 119.000000 
+123.000000 131.000000 136.000000 135.000000 129.000000 124.000000 
+124.000000 128.000000 131.000000 129.000000 126.000000 126.000000 
+129.000000 135.000000 136.000000 130.000000 120.000000 114.000000 
+118.000000 126.000000 129.000000 128.000000 126.000000 128.000000 
+131.000000 133.000000 135.000000 137.000000 137.000000 133.000000 
+128.000000 129.000000 136.000000 141.000000 140.000000 134.000000 
+126.000000 120.000000 119.000000 120.000000 123.000000 124.000000 
+124.000000 126.000000 123.000000 126.000000 128.000000 130.000000 
+132.000000 133.000000 131.000000 128.000000 128.000000 130.000000 
+129.000000 116.000000 97.000000 87.000000 96.000000 115.000000 
+129.000000 129.000000 124.000000 120.000000 120.000000 125.000000 
+129.000000 129.000000 123.000000 118.000000 118.000000 122.000000 
+126.000000 125.000000 121.000000 120.000000 123.000000 127.000000 
+128.000000 126.000000 123.000000 123.000000 126.000000 129.000000 
+130.000000 130.000000 129.000000 126.000000 125.000000 130.000000 
+136.000000 137.000000 127.000000 116.000000 112.000000 116.000000 
+121.000000 122.000000 124.000000 128.000000 131.000000 130.000000 
+131.000000 134.000000 138.000000 137.000000 133.000000 133.000000 
+135.000000 138.000000 137.000000 136.000000 134.000000 130.000000 
+123.000000 118.000000 118.000000 121.000000 123.000000 126.000000 
+124.000000 124.000000 125.000000 126.000000 129.000000 131.000000 
+131.000000 127.000000 124.000000 124.000000 121.000000 111.000000 
+99.000000 97.000000 110.000000 125.000000 131.000000 128.000000 
+123.000000 121.000000 122.000000 123.000000 123.000000 123.000000 
+120.000000 118.000000 120.000000 128.000000 133.000000 131.000000 
+125.000000 122.000000 124.000000 127.000000 129.000000 129.000000 
+127.000000 126.000000 125.000000 124.000000 123.000000 124.000000 
+128.000000 131.000000 133.000000 132.000000 130.000000 130.000000 
+129.000000 124.000000 117.000000 114.000000 115.000000 118.000000 
+123.000000 128.000000 134.000000 135.000000 134.000000 134.000000 
+136.000000 138.000000 137.000000 136.000000 135.000000 134.000000 
+133.000000 132.000000 131.000000 129.000000 124.000000 121.000000 
+123.000000 127.000000 130.000000 130.000000 121.000000 119.000000 
+122.000000 126.000000 130.000000 133.000000 133.000000 133.000000 
+133.000000 129.000000 118.000000 102.000000 95.000000 106.000000 
+127.000000 138.000000 134.000000 122.000000 116.000000 118.000000 
+125.000000 130.000000 130.000000 127.000000 123.000000 121.000000 
+123.000000 127.000000 132.000000 135.000000 133.000000 128.000000 
+125.000000 126.000000 130.000000 132.000000 129.000000 126.000000 
+125.000000 128.000000 131.000000 133.000000 133.000000 129.000000 
+124.000000 125.000000 132.000000 140.000000 141.000000 133.000000 
+123.000000 116.000000 114.000000 115.000000 118.000000 126.000000 
+133.000000 135.000000 133.000000 131.000000 133.000000 138.000000 
+142.000000 140.000000 135.000000 132.000000 133.000000 136.000000 
+137.000000 133.000000 125.000000 119.000000 118.000000 121.000000 
+123.000000 121.000000 129.000000 127.000000 129.000000 135.000000 
+136.000000 131.000000 127.000000 128.000000 131.000000 128.000000 
+113.000000 96.000000 91.000000 105.000000 125.000000 135.000000 
+130.000000 123.000000 122.000000 124.000000 126.000000 126.000000 
+125.000000 124.000000 122.000000 119.000000 121.000000 126.000000 
+131.000000 132.000000 127.000000 122.000000 120.000000 123.000000 
+128.000000 131.000000 132.000000 130.000000 128.000000 125.000000 
+125.000000 129.000000 135.000000 134.000000 126.000000 121.000000 
+127.000000 136.000000 137.000000 128.000000 121.000000 119.000000 
+116.000000 114.000000 116.000000 125.000000 133.000000 133.000000 
+129.000000 131.000000 136.000000 140.000000 138.000000 135.000000 
+134.000000 137.000000 142.000000 145.000000 143.000000 137.000000 
+128.000000 122.000000 121.000000 122.000000 121.000000 121.000000 
+123.000000 126.000000 134.000000 142.000000 141.000000 130.000000 
+122.000000 124.000000 128.000000 121.000000 101.000000 85.000000 
+87.000000 105.000000 124.000000 132.000000 130.000000 126.000000 
+124.000000 124.000000 125.000000 126.000000 127.000000 125.000000 
+120.000000 117.000000 120.000000 128.000000 132.000000 130.000000 
+127.000000 127.000000 128.000000 129.000000 127.000000 125.000000 
+124.000000 122.000000 122.000000 123.000000 124.000000 124.000000 
+127.000000 128.000000 127.000000 127.000000 135.000000 147.000000 
+149.000000 132.000000 110.000000 102.000000 109.000000 118.000000 
+120.000000 121.000000 126.000000 132.000000 133.000000 131.000000 
+132.000000 137.000000 140.000000 140.000000 138.000000 137.000000 
+138.000000 138.000000 138.000000 137.000000 134.000000 130.000000 
+125.000000 120.000000 116.000000 116.000000 141.000000 138.000000 
+133.000000 132.000000 128.000000 122.000000 118.000000 122.000000 
+128.000000 119.000000 94.000000 73.000000 74.000000 96.000000 
+118.000000 128.000000 129.000000 128.000000 127.000000 124.000000 
+123.000000 126.000000 129.000000 127.000000 123.000000 123.000000 
+126.000000 125.000000 118.000000 113.000000 115.000000 122.000000 
+126.000000 127.000000 128.000000 128.000000 123.000000 116.000000 
+115.000000 123.000000 133.000000 136.000000 132.000000 127.000000 
+122.000000 121.000000 126.000000 138.000000 144.000000 131.000000 
+104.000000 87.000000 93.000000 114.000000 128.000000 129.000000 
+127.000000 130.000000 132.000000 132.000000 133.000000 136.000000 
+139.000000 138.000000 136.000000 136.000000 138.000000 136.000000 
+133.000000 130.000000 129.000000 128.000000 124.000000 122.000000 
+122.000000 123.000000 122.000000 117.000000 107.000000 92.000000 
+73.000000 63.000000 72.000000 94.000000 105.000000 94.000000 
+86.000000 100.000000 111.000000 87.000000 38.000000 19.000000 
+40.000000 26.000000 14.000000 22.000000 24.000000 20.000000 
+15.000000 9.000000 9.000000 10.000000 8.000000 8.000000 
+8.000000 6.000000 5.000000 7.000000 8.000000 8.000000 
+9.000000 8.000000 6.000000 9.000000 14.000000 16.000000 
+13.000000 10.000000 6.000000 4.000000 5.000000 9.000000 
+12.000000 10.000000 7.000000 6.000000 16.000000 32.000000 
+29.000000 10.000000 28.000000 56.000000 68.000000 76.000000 
+86.000000 95.000000 96.000000 89.000000 76.000000 67.000000 
+80.000000 105.000000 109.000000 92.000000 82.000000 91.000000 
+104.000000 112.000000 116.000000 121.000000 125.000000 125.000000 
+127.000000 122.000000 119.000000 126.000000 128.000000 119.000000 
+103.000000 95.000000 104.000000 111.000000 102.000000 99.000000 
+107.000000 92.000000 41.000000 21.000000 56.000000 35.000000 
+16.000000 27.000000 23.000000 16.000000 8.000000 7.000000 
+10.000000 10.000000 9.000000 11.000000 9.000000 9.000000 
+14.000000 13.000000 7.000000 6.000000 7.000000 8.000000 
+8.000000 8.000000 11.000000 15.000000 14.000000 9.000000 
+10.000000 9.000000 7.000000 11.000000 13.000000 11.000000 
+11.000000 11.000000 12.000000 19.000000 19.000000 7.000000 
+29.000000 63.000000 87.000000 102.000000 110.000000 114.000000 
+113.000000 101.000000 79.000000 68.000000 80.000000 97.000000 
+101.000000 102.000000 108.000000 115.000000 116.000000 117.000000 
+121.000000 125.000000 124.000000 121.000000 136.000000 127.000000 
+113.000000 116.000000 143.000000 171.000000 172.000000 143.000000 
+115.000000 106.000000 100.000000 91.000000 87.000000 74.000000 
+38.000000 33.000000 65.000000 45.000000 22.000000 14.000000 
+10.000000 11.000000 13.000000 20.000000 17.000000 9.000000 
+6.000000 7.000000 6.000000 6.000000 17.000000 16.000000 
+8.000000 9.000000 11.000000 9.000000 9.000000 9.000000 
+8.000000 10.000000 8.000000 8.000000 16.000000 22.000000 
+21.000000 9.000000 7.000000 7.000000 4.000000 17.000000 
+20.000000 17.000000 9.000000 13.000000 50.000000 86.000000 
+104.000000 118.000000 130.000000 131.000000 119.000000 100.000000 
+89.000000 95.000000 103.000000 107.000000 113.000000 124.000000 
+128.000000 122.000000 116.000000 116.000000 120.000000 119.000000 
+117.000000 117.000000 126.000000 129.000000 129.000000 129.000000 
+139.000000 162.000000 178.000000 165.000000 131.000000 104.000000 
+97.000000 90.000000 75.000000 55.000000 36.000000 35.000000 
+52.000000 48.000000 26.000000 6.000000 0.000000 4.000000 
+12.000000 26.000000 27.000000 16.000000 8.000000 9.000000 
+15.000000 11.000000 10.000000 16.000000 8.000000 11.000000 
+13.000000 5.000000 12.000000 14.000000 10.000000 7.000000 
+7.000000 15.000000 25.000000 30.000000 27.000000 17.000000 
+23.000000 30.000000 17.000000 7.000000 5.000000 4.000000 
+3.000000 15.000000 53.000000 85.000000 96.000000 113.000000 
+134.000000 130.000000 104.000000 86.000000 82.000000 85.000000 
+89.000000 100.000000 120.000000 132.000000 128.000000 119.000000 
+117.000000 122.000000 125.000000 121.000000 114.000000 113.000000 
+127.000000 126.000000 127.000000 129.000000 129.000000 132.000000 
+145.000000 156.000000 144.000000 116.000000 99.000000 102.000000 
+100.000000 75.000000 41.000000 20.000000 29.000000 53.000000 
+64.000000 59.000000 44.000000 30.000000 20.000000 15.000000 
+26.000000 31.000000 22.000000 13.000000 25.000000 18.000000 
+9.000000 24.000000 20.000000 14.000000 15.000000 11.000000 
+13.000000 15.000000 13.000000 7.000000 9.000000 17.000000 
+20.000000 22.000000 28.000000 45.000000 70.000000 78.000000 
+59.000000 36.000000 31.000000 31.000000 18.000000 33.000000 
+79.000000 100.000000 89.000000 97.000000 112.000000 103.000000 
+92.000000 91.000000 87.000000 73.000000 69.000000 86.000000 
+112.000000 126.000000 125.000000 123.000000 127.000000 129.000000 
+126.000000 121.000000 119.000000 119.000000 117.000000 114.000000 
+109.000000 113.000000 124.000000 131.000000 128.000000 125.000000 
+134.000000 138.000000 129.000000 119.000000 108.000000 85.000000 
+47.000000 16.000000 17.000000 58.000000 88.000000 84.000000 
+62.000000 40.000000 21.000000 14.000000 9.000000 42.000000 
+56.000000 31.000000 10.000000 18.000000 12.000000 15.000000 
+19.000000 22.000000 20.000000 10.000000 15.000000 24.000000 
+17.000000 17.000000 24.000000 12.000000 8.000000 26.000000 
+53.000000 80.000000 94.000000 132.000000 210.000000 277.000000 
+274.000000 216.000000 148.000000 116.000000 119.000000 110.000000 
+86.000000 84.000000 96.000000 92.000000 85.000000 87.000000 
+87.000000 84.000000 90.000000 109.000000 124.000000 122.000000 
+114.000000 114.000000 121.000000 124.000000 123.000000 124.000000 
+128.000000 129.000000 102.000000 101.000000 100.000000 105.000000 
+123.000000 139.000000 131.000000 110.000000 116.000000 151.000000 
+165.000000 142.000000 105.000000 77.000000 54.000000 30.000000 
+24.000000 83.000000 117.000000 102.000000 86.000000 92.000000 
+70.000000 34.000000 20.000000 32.000000 42.000000 46.000000 
+20.000000 13.000000 6.000000 7.000000 20.000000 27.000000 
+15.000000 8.000000 12.000000 26.000000 36.000000 38.000000 
+21.000000 16.000000 24.000000 49.000000 79.000000 86.000000 
+109.000000 192.000000 323.000000 434.000000 429.000000 326.000000 
+236.000000 175.000000 112.000000 75.000000 75.000000 93.000000 
+99.000000 88.000000 87.000000 92.000000 91.000000 91.000000 
+103.000000 122.000000 128.000000 119.000000 110.000000 109.000000 
+111.000000 116.000000 125.000000 133.000000 131.000000 124.000000 
+111.000000 101.000000 96.000000 108.000000 133.000000 145.000000 
+131.000000 103.000000 94.000000 122.000000 155.000000 148.000000 
+109.000000 70.000000 62.000000 50.000000 31.000000 97.000000 
+139.000000 141.000000 148.000000 179.000000 170.000000 108.000000 
+57.000000 22.000000 22.000000 51.000000 45.000000 25.000000 
+17.000000 12.000000 17.000000 24.000000 18.000000 16.000000 
+13.000000 23.000000 45.000000 37.000000 14.000000 19.000000 
+40.000000 74.000000 91.000000 99.000000 170.000000 281.000000 
+356.000000 375.000000 335.000000 254.000000 192.000000 138.000000 
+77.000000 55.000000 80.000000 105.000000 96.000000 85.000000 
+94.000000 98.000000 91.000000 95.000000 114.000000 126.000000 
+118.000000 105.000000 105.000000 110.000000 114.000000 121.000000 
+128.000000 126.000000 115.000000 115.000000 127.000000 114.000000 
+104.000000 111.000000 127.000000 130.000000 122.000000 114.000000 
+106.000000 106.000000 122.000000 129.000000 106.000000 67.000000 
+61.000000 63.000000 36.000000 99.000000 189.000000 232.000000 
+232.000000 221.000000 203.000000 152.000000 88.000000 41.000000 
+30.000000 49.000000 55.000000 50.000000 39.000000 21.000000 
+8.000000 18.000000 31.000000 22.000000 14.000000 26.000000 
+39.000000 35.000000 30.000000 41.000000 77.000000 108.000000 
+100.000000 138.000000 256.000000 352.000000 332.000000 274.000000 
+235.000000 190.000000 132.000000 73.000000 44.000000 60.000000 
+94.000000 97.000000 81.000000 86.000000 98.000000 97.000000 
+93.000000 100.000000 113.000000 115.000000 106.000000 104.000000 
+109.000000 112.000000 116.000000 123.000000 124.000000 114.000000 
+109.000000 123.000000 138.000000 129.000000 113.000000 101.000000 
+102.000000 112.000000 128.000000 141.000000 139.000000 128.000000 
+121.000000 115.000000 90.000000 56.000000 56.000000 76.000000 
+55.000000 76.000000 228.000000 316.000000 307.000000 256.000000 
+204.000000 143.000000 101.000000 60.000000 19.000000 27.000000 
+49.000000 57.000000 46.000000 31.000000 21.000000 28.000000 
+39.000000 30.000000 11.000000 23.000000 27.000000 32.000000 
+44.000000 71.000000 107.000000 112.000000 136.000000 238.000000 
+350.000000 335.000000 216.000000 184.000000 203.000000 173.000000 
+106.000000 60.000000 56.000000 76.000000 95.000000 97.000000 
+97.000000 100.000000 97.000000 97.000000 106.000000 117.000000 
+115.000000 107.000000 107.000000 114.000000 118.000000 118.000000 
+120.000000 122.000000 120.000000 118.000000 127.000000 140.000000 
+139.000000 137.000000 122.000000 103.000000 97.000000 111.000000 
+131.000000 139.000000 138.000000 138.000000 139.000000 127.000000 
+90.000000 44.000000 34.000000 88.000000 82.000000 55.000000 
+182.000000 299.000000 335.000000 316.000000 249.000000 170.000000 
+138.000000 86.000000 30.000000 36.000000 49.000000 50.000000 
+46.000000 43.000000 35.000000 39.000000 50.000000 40.000000 
+14.000000 21.000000 28.000000 35.000000 47.000000 63.000000 
+78.000000 99.000000 190.000000 307.000000 330.000000 235.000000 
+177.000000 211.000000 230.000000 183.000000 113.000000 77.000000 
+80.000000 91.000000 98.000000 104.000000 103.000000 90.000000 
+80.000000 93.000000 119.000000 131.000000 124.000000 115.000000 
+115.000000 117.000000 117.000000 121.000000 128.000000 129.000000 
+122.000000 122.000000 134.000000 142.000000 136.000000 135.000000 
+126.000000 111.000000 103.000000 107.000000 120.000000 134.000000 
+142.000000 137.000000 117.000000 98.000000 83.000000 55.000000 
+25.000000 65.000000 106.000000 87.000000 121.000000 225.000000 
+317.000000 337.000000 276.000000 203.000000 159.000000 105.000000 
+79.000000 91.000000 86.000000 72.000000 66.000000 60.000000 
+51.000000 60.000000 75.000000 64.000000 40.000000 38.000000 
+45.000000 49.000000 50.000000 55.000000 68.000000 127.000000 
+225.000000 277.000000 215.000000 183.000000 260.000000 304.000000 
+265.000000 190.000000 122.000000 84.000000 77.000000 87.000000 
+97.000000 87.000000 62.000000 49.000000 68.000000 104.000000 
+127.000000 126.000000 117.000000 114.000000 114.000000 117.000000 
+125.000000 132.000000 131.000000 122.000000 120.000000 128.000000 
+135.000000 130.000000 134.000000 130.000000 128.000000 124.000000 
+114.000000 106.000000 111.000000 131.000000 151.000000 142.000000 
+104.000000 68.000000 59.000000 61.000000 41.000000 28.000000 
+74.000000 116.000000 128.000000 182.000000 264.000000 288.000000 
+238.000000 174.000000 127.000000 104.000000 109.000000 117.000000 
+111.000000 99.000000 88.000000 77.000000 75.000000 87.000000 
+98.000000 90.000000 72.000000 65.000000 70.000000 73.000000 
+80.000000 93.000000 125.000000 202.000000 263.000000 236.000000 
+152.000000 218.000000 331.000000 339.000000 252.000000 156.000000 
+103.000000 92.000000 94.000000 92.000000 82.000000 59.000000 
+37.000000 45.000000 79.000000 109.000000 118.000000 117.000000 
+121.000000 126.000000 125.000000 125.000000 131.000000 134.000000 
+126.000000 118.000000 123.000000 135.000000 138.000000 128.000000 
+132.000000 129.000000 130.000000 130.000000 121.000000 112.000000 
+111.000000 121.000000 136.000000 140.000000 125.000000 93.000000 
+63.000000 54.000000 58.000000 46.000000 40.000000 78.000000 
+126.000000 165.000000 204.000000 210.000000 170.000000 117.000000 
+88.000000 88.000000 95.000000 99.000000 100.000000 105.000000 
+108.000000 105.000000 105.000000 111.000000 111.000000 100.000000 
+85.000000 84.000000 87.000000 87.000000 91.000000 109.000000 
+159.000000 233.000000 254.000000 172.000000 165.000000 292.000000 
+376.000000 334.000000 216.000000 111.000000 75.000000 97.000000 
+115.000000 97.000000 60.000000 32.000000 36.000000 65.000000 
+91.000000 104.000000 109.000000 115.000000 122.000000 124.000000 
+125.000000 127.000000 130.000000 127.000000 122.000000 122.000000 
+129.000000 134.000000 134.000000 132.000000 128.000000 125.000000 
+126.000000 127.000000 127.000000 126.000000 123.000000 119.000000 
+120.000000 129.000000 136.000000 122.000000 90.000000 71.000000 
+82.000000 98.000000 83.000000 57.000000 66.000000 98.000000 
+132.000000 142.000000 121.000000 86.000000 66.000000 73.000000 
+91.000000 102.000000 107.000000 112.000000 117.000000 118.000000 
+124.000000 132.000000 130.000000 115.000000 104.000000 105.000000 
+99.000000 85.000000 79.000000 91.000000 134.000000 186.000000 
+187.000000 141.000000 240.000000 379.000000 400.000000 299.000000 
+167.000000 89.000000 85.000000 106.000000 101.000000 66.000000 
+29.000000 17.000000 36.000000 70.000000 97.000000 110.000000 
+115.000000 114.000000 112.000000 110.000000 113.000000 118.000000 
+122.000000 122.000000 121.000000 122.000000 127.000000 132.000000 
+134.000000 134.000000 120.000000 117.000000 117.000000 122.000000 
+129.000000 130.000000 124.000000 115.000000 115.000000 124.000000 
+134.000000 130.000000 114.000000 99.000000 99.000000 113.000000 
+117.000000 96.000000 66.000000 62.000000 85.000000 107.000000 
+101.000000 77.000000 65.000000 84.000000 114.000000 127.000000 
+125.000000 120.000000 115.000000 116.000000 127.000000 138.000000 
+136.000000 127.000000 127.000000 130.000000 118.000000 102.000000 
+94.000000 93.000000 108.000000 140.000000 139.000000 177.000000 
+312.000000 410.000000 373.000000 250.000000 136.000000 99.000000 
+112.000000 107.000000 70.000000 35.000000 24.000000 34.000000 
+51.000000 75.000000 104.000000 122.000000 122.000000 113.000000 
+108.000000 112.000000 116.000000 117.000000 118.000000 119.000000 
+119.000000 117.000000 121.000000 132.000000 141.000000 137.000000 
+120.000000 122.000000 123.000000 125.000000 127.000000 123.000000 
+115.000000 112.000000 117.000000 123.000000 125.000000 126.000000 
+127.000000 120.000000 106.000000 101.000000 106.000000 111.000000 
+107.000000 95.000000 87.000000 89.000000 85.000000 76.000000 
+83.000000 108.000000 132.000000 141.000000 138.000000 130.000000 
+123.000000 124.000000 134.000000 140.000000 134.000000 129.000000 
+133.000000 132.000000 125.000000 122.000000 117.000000 102.000000 
+105.000000 128.000000 136.000000 217.000000 352.000000 405.000000 
+339.000000 227.000000 143.000000 115.000000 109.000000 85.000000 
+48.000000 27.000000 31.000000 49.000000 68.000000 86.000000 
+107.000000 122.000000 125.000000 120.000000 115.000000 115.000000 
+118.000000 123.000000 126.000000 124.000000 118.000000 115.000000 
+120.000000 132.000000 139.000000 135.000000 125.000000 129.000000 
+131.000000 130.000000 129.000000 123.000000 117.000000 115.000000 
+119.000000 122.000000 123.000000 124.000000 127.000000 125.000000 
+115.000000 102.000000 99.000000 105.000000 112.000000 108.000000 
+94.000000 80.000000 74.000000 79.000000 100.000000 124.000000 
+141.000000 146.000000 142.000000 131.000000 120.000000 118.000000 
+125.000000 132.000000 134.000000 134.000000 132.000000 129.000000 
+132.000000 138.000000 128.000000 108.000000 111.000000 129.000000 
+159.000000 256.000000 371.000000 395.000000 317.000000 209.000000 
+135.000000 106.000000 91.000000 68.000000 42.000000 28.000000 
+35.000000 59.000000 88.000000 110.000000 119.000000 121.000000 
+123.000000 125.000000 124.000000 120.000000 117.000000 117.000000 
+119.000000 120.000000 122.000000 125.000000 127.000000 130.000000 
+133.000000 135.000000 119.000000 125.000000 135.000000 139.000000 
+133.000000 120.000000 112.000000 115.000000 123.000000 127.000000 
+124.000000 121.000000 123.000000 125.000000 119.000000 103.000000 
+93.000000 97.000000 111.000000 114.000000 100.000000 78.000000 
+66.000000 74.000000 95.000000 116.000000 130.000000 139.000000 
+139.000000 130.000000 117.000000 110.000000 113.000000 120.000000 
+126.000000 131.000000 133.000000 134.000000 139.000000 142.000000 
+129.000000 109.000000 108.000000 123.000000 169.000000 266.000000 
+352.000000 352.000000 266.000000 164.000000 108.000000 92.000000 
+79.000000 59.000000 46.000000 52.000000 76.000000 102.000000 
+119.000000 123.000000 119.000000 116.000000 118.000000 121.000000 
+122.000000 123.000000 122.000000 121.000000 119.000000 121.000000 
+127.000000 134.000000 134.000000 131.000000 130.000000 133.000000 
+114.000000 128.000000 145.000000 148.000000 136.000000 120.000000 
+114.000000 116.000000 119.000000 119.000000 119.000000 123.000000 
+129.000000 131.000000 123.000000 107.000000 97.000000 107.000000 
+126.000000 133.000000 115.000000 88.000000 72.000000 76.000000 
+89.000000 102.000000 119.000000 138.000000 145.000000 138.000000 
+125.000000 120.000000 123.000000 125.000000 128.000000 131.000000 
+134.000000 135.000000 139.000000 140.000000 126.000000 103.000000 
+99.000000 123.000000 174.000000 247.000000 293.000000 268.000000 
+185.000000 110.000000 84.000000 82.000000 75.000000 65.000000 
+70.000000 92.000000 114.000000 123.000000 120.000000 113.000000 
+110.000000 112.000000 114.000000 117.000000 123.000000 133.000000 
+139.000000 135.000000 127.000000 123.000000 128.000000 134.000000 
+135.000000 131.000000 130.000000 132.000000 129.000000 134.000000 
+135.000000 128.000000 121.000000 119.000000 120.000000 119.000000 
+118.000000 122.000000 129.000000 135.000000 136.000000 133.000000 
+123.000000 110.000000 103.000000 110.000000 124.000000 128.000000 
+116.000000 98.000000 87.000000 82.000000 79.000000 86.000000 
+110.000000 136.000000 145.000000 137.000000 126.000000 122.000000 
+125.000000 128.000000 129.000000 129.000000 129.000000 131.000000 
+137.000000 137.000000 120.000000 96.000000 92.000000 116.000000 
+164.000000 212.000000 227.000000 190.000000 125.000000 80.000000 
+70.000000 73.000000 75.000000 82.000000 102.000000 123.000000 
+129.000000 120.000000 110.000000 111.000000 118.000000 119.000000 
+115.000000 118.000000 131.000000 142.000000 142.000000 132.000000 
+126.000000 131.000000 137.000000 136.000000 132.000000 132.000000 
+137.000000 141.000000 135.000000 130.000000 121.000000 114.000000 
+112.000000 113.000000 114.000000 119.000000 129.000000 138.000000 
+138.000000 133.000000 130.000000 127.000000 121.000000 108.000000 
+96.000000 94.000000 103.000000 110.000000 107.000000 98.000000 
+90.000000 83.000000 75.000000 79.000000 95.000000 115.000000 
+127.000000 129.000000 126.000000 125.000000 126.000000 128.000000 
+127.000000 125.000000 128.000000 132.000000 132.000000 125.000000 
+110.000000 94.000000 86.000000 97.000000 131.000000 169.000000 
+177.000000 145.000000 103.000000 83.000000 84.000000 90.000000 
+91.000000 95.000000 109.000000 124.000000 129.000000 124.000000 
+118.000000 115.000000 115.000000 118.000000 125.000000 136.000000 
+139.000000 133.000000 123.000000 123.000000 130.000000 138.000000 
+139.000000 135.000000 132.000000 131.000000 132.000000 135.000000 
+127.000000 121.000000 116.000000 115.000000 117.000000 117.000000 
+113.000000 113.000000 120.000000 130.000000 130.000000 122.000000 
+116.000000 120.000000 126.000000 121.000000 106.000000 97.000000 
+106.000000 119.000000 121.000000 111.000000 100.000000 87.000000 
+69.000000 54.000000 50.000000 67.000000 100.000000 130.000000 
+144.000000 142.000000 134.000000 127.000000 127.000000 133.000000 
+143.000000 148.000000 141.000000 123.000000 100.000000 80.000000 
+71.000000 77.000000 100.000000 126.000000 133.000000 118.000000 
+99.000000 94.000000 101.000000 107.000000 106.000000 108.000000 
+114.000000 118.000000 117.000000 116.000000 119.000000 121.000000 
+119.000000 118.000000 126.000000 136.000000 138.000000 132.000000 
+124.000000 119.000000 119.000000 122.000000 128.000000 133.000000 
+135.000000 135.000000 134.000000 134.000000 135.000000 131.000000 
+129.000000 127.000000 121.000000 113.000000 108.000000 109.000000 
+114.000000 123.000000 130.000000 131.000000 129.000000 127.000000 
+126.000000 116.000000 101.000000 93.000000 104.000000 121.000000 
+120.000000 100.000000 82.000000 75.000000 58.000000 23.000000 
+8.000000 22.000000 56.000000 127.000000 164.000000 159.000000 
+139.000000 131.000000 140.000000 155.000000 165.000000 166.000000 
+154.000000 127.000000 89.000000 58.000000 50.000000 67.000000 
+92.000000 106.000000 107.000000 102.000000 98.000000 98.000000 
+102.000000 107.000000 110.000000 113.000000 117.000000 116.000000 
+113.000000 113.000000 119.000000 124.000000 124.000000 122.000000 
+124.000000 129.000000 134.000000 135.000000 131.000000 122.000000 
+116.000000 118.000000 127.000000 133.000000 131.000000 127.000000 
+129.000000 139.000000 140.000000 140.000000 129.000000 121.000000 
+117.000000 111.000000 108.000000 113.000000 125.000000 132.000000 
+130.000000 125.000000 125.000000 125.000000 122.000000 109.000000 
+95.000000 91.000000 101.000000 113.000000 111.000000 95.000000 
+77.000000 73.000000 66.000000 37.000000 20.000000 25.000000 
+20.000000 97.000000 164.000000 189.000000 180.000000 163.000000 
+158.000000 171.000000 187.000000 187.000000 160.000000 112.000000 
+57.000000 23.000000 25.000000 55.000000 88.000000 108.000000 
+115.000000 111.000000 98.000000 92.000000 99.000000 109.000000 
+115.000000 116.000000 115.000000 114.000000 113.000000 116.000000 
+121.000000 124.000000 121.000000 115.000000 115.000000 123.000000 
+135.000000 139.000000 132.000000 122.000000 117.000000 120.000000 
+124.000000 126.000000 124.000000 123.000000 126.000000 132.000000 
+116.000000 136.000000 132.000000 120.000000 118.000000 122.000000 
+122.000000 121.000000 127.000000 134.000000 130.000000 120.000000 
+117.000000 126.000000 133.000000 123.000000 104.000000 95.000000 
+99.000000 105.000000 100.000000 86.000000 77.000000 72.000000 
+64.000000 49.000000 32.000000 38.000000 42.000000 68.000000 
+124.000000 170.000000 185.000000 176.000000 166.000000 172.000000 
+185.000000 172.000000 119.000000 55.000000 25.000000 10.000000 
+7.000000 31.000000 62.000000 93.000000 114.000000 112.000000 
+96.000000 89.000000 99.000000 113.000000 120.000000 122.000000 
+122.000000 122.000000 119.000000 116.000000 117.000000 119.000000 
+118.000000 116.000000 117.000000 123.000000 129.000000 131.000000 
+128.000000 125.000000 123.000000 122.000000 118.000000 114.000000 
+115.000000 121.000000 126.000000 125.000000 94.000000 111.000000 
+124.000000 127.000000 124.000000 124.000000 127.000000 127.000000 
+125.000000 123.000000 122.000000 123.000000 126.000000 133.000000 
+134.000000 121.000000 103.000000 97.000000 106.000000 115.000000 
+106.000000 86.000000 79.000000 81.000000 74.000000 61.000000 
+58.000000 66.000000 67.000000 55.000000 74.000000 109.000000 
+133.000000 137.000000 131.000000 126.000000 118.000000 99.000000 
+67.000000 38.000000 49.000000 46.000000 27.000000 30.000000 
+57.000000 93.000000 107.000000 94.000000 78.000000 79.000000 
+98.000000 117.000000 127.000000 129.000000 130.000000 129.000000 
+124.000000 118.000000 115.000000 117.000000 119.000000 120.000000 
+121.000000 123.000000 125.000000 127.000000 129.000000 133.000000 
+134.000000 131.000000 125.000000 119.000000 116.000000 116.000000 
+118.000000 119.000000 93.000000 98.000000 120.000000 135.000000 
+131.000000 122.000000 123.000000 130.000000 131.000000 127.000000 
+123.000000 122.000000 123.000000 125.000000 123.000000 111.000000 
+94.000000 90.000000 102.000000 114.000000 108.000000 88.000000 
+78.000000 77.000000 74.000000 74.000000 81.000000 89.000000 
+90.000000 79.000000 62.000000 54.000000 58.000000 61.000000 
+56.000000 47.000000 39.000000 47.000000 78.000000 99.000000 
+81.000000 48.000000 43.000000 43.000000 70.000000 105.000000 
+113.000000 95.000000 77.000000 79.000000 100.000000 121.000000 
+132.000000 135.000000 133.000000 130.000000 124.000000 116.000000 
+111.000000 112.000000 116.000000 119.000000 119.000000 118.000000 
+117.000000 116.000000 116.000000 119.000000 125.000000 127.000000 
+124.000000 119.000000 116.000000 117.000000 119.000000 120.000000 
+107.000000 113.000000 121.000000 124.000000 124.000000 126.000000 
+129.000000 129.000000 127.000000 125.000000 125.000000 122.000000 
+122.000000 125.000000 124.000000 109.000000 86.000000 79.000000 
+90.000000 104.000000 100.000000 81.000000 69.000000 73.000000 
+85.000000 98.000000 100.000000 88.000000 72.000000 60.000000 
+54.000000 53.000000 55.000000 53.000000 48.000000 49.000000 
+62.000000 83.000000 98.000000 94.000000 65.000000 23.000000 
+17.000000 28.000000 73.000000 113.000000 121.000000 105.000000 
+86.000000 84.000000 101.000000 119.000000 126.000000 127.000000 
+126.000000 125.000000 123.000000 119.000000 115.000000 112.000000 
+113.000000 114.000000 114.000000 111.000000 109.000000 111.000000 
+117.000000 122.000000 124.000000 125.000000 126.000000 126.000000 
+124.000000 123.000000 122.000000 119.000000 118.000000 122.000000 
+123.000000 119.000000 117.000000 117.000000 119.000000 121.000000 
+122.000000 124.000000 123.000000 121.000000 122.000000 127.000000 
+127.000000 116.000000 97.000000 82.000000 83.000000 96.000000 
+109.000000 109.000000 97.000000 85.000000 80.000000 77.000000 
+66.000000 50.000000 38.000000 39.000000 48.000000 56.000000 
+54.000000 46.000000 41.000000 39.000000 37.000000 36.000000 
+43.000000 57.000000 77.000000 92.000000 85.000000 76.000000 
+84.000000 97.000000 104.000000 103.000000 96.000000 93.000000 
+105.000000 124.000000 131.000000 123.000000 113.000000 112.000000 
+117.000000 119.000000 115.000000 111.000000 115.000000 125.000000 
+128.000000 122.000000 114.000000 113.000000 121.000000 129.000000 
+133.000000 130.000000 124.000000 119.000000 120.000000 126.000000 
+131.000000 130.000000 132.000000 129.000000 124.000000 121.000000 
+119.000000 117.000000 116.000000 120.000000 124.000000 124.000000 
+123.000000 122.000000 125.000000 126.000000 119.000000 106.000000 
+95.000000 91.000000 96.000000 105.000000 115.000000 122.000000 
+117.000000 95.000000 68.000000 50.000000 43.000000 38.000000 
+32.000000 50.000000 105.000000 165.000000 175.000000 123.000000 
+61.000000 38.000000 37.000000 39.000000 33.000000 33.000000 
+52.000000 78.000000 95.000000 99.000000 97.000000 98.000000 
+98.000000 94.000000 91.000000 96.000000 111.000000 125.000000 
+130.000000 125.000000 120.000000 120.000000 121.000000 114.000000 
+106.000000 106.000000 113.000000 120.000000 122.000000 121.000000 
+122.000000 121.000000 120.000000 121.000000 125.000000 127.000000 
+124.000000 121.000000 123.000000 127.000000 129.000000 129.000000 
+127.000000 123.000000 123.000000 125.000000 123.000000 117.000000 
+113.000000 114.000000 118.000000 119.000000 120.000000 125.000000 
+133.000000 135.000000 127.000000 111.000000 103.000000 107.000000 
+117.000000 122.000000 119.000000 111.000000 95.000000 70.000000 
+48.000000 41.000000 45.000000 41.000000 38.000000 67.000000 
+200.000000 363.000000 410.000000 297.000000 132.000000 50.000000 
+43.000000 59.000000 65.000000 59.000000 51.000000 51.000000 
+65.000000 88.000000 108.000000 112.000000 99.000000 86.000000 
+87.000000 103.000000 120.000000 130.000000 132.000000 128.000000 
+124.000000 123.000000 124.000000 124.000000 122.000000 121.000000 
+126.000000 131.000000 132.000000 127.000000 121.000000 116.000000 
+115.000000 120.000000 130.000000 134.000000 128.000000 120.000000 
+117.000000 120.000000 124.000000 127.000000 120.000000 122.000000 
+126.000000 129.000000 128.000000 121.000000 116.000000 117.000000 
+122.000000 126.000000 127.000000 128.000000 130.000000 129.000000 
+121.000000 111.000000 108.000000 114.000000 120.000000 120.000000 
+112.000000 96.000000 76.000000 57.000000 43.000000 35.000000 
+33.000000 35.000000 49.000000 94.000000 243.000000 409.000000 
+472.000000 384.000000 215.000000 71.000000 43.000000 73.000000 
+101.000000 101.000000 78.000000 58.000000 51.000000 72.000000 
+105.000000 118.000000 114.000000 104.000000 96.000000 95.000000 
+103.000000 116.000000 124.000000 125.000000 121.000000 119.000000 
+121.000000 124.000000 126.000000 127.000000 128.000000 129.000000 
+126.000000 119.000000 113.000000 110.000000 111.000000 116.000000 
+121.000000 125.000000 125.000000 123.000000 124.000000 126.000000 
+126.000000 124.000000 125.000000 137.000000 143.000000 142.000000 
+135.000000 127.000000 119.000000 117.000000 121.000000 126.000000 
+125.000000 125.000000 129.000000 131.000000 122.000000 104.000000 
+96.000000 104.000000 114.000000 113.000000 103.000000 88.000000 
+72.000000 59.000000 53.000000 52.000000 48.000000 42.000000 
+47.000000 93.000000 201.000000 289.000000 292.000000 221.000000 
+127.000000 50.000000 25.000000 54.000000 112.000000 154.000000 
+168.000000 162.000000 115.000000 88.000000 110.000000 130.000000 
+120.000000 97.000000 87.000000 97.000000 110.000000 118.000000 
+121.000000 121.000000 120.000000 119.000000 121.000000 123.000000 
+126.000000 129.000000 136.000000 140.000000 135.000000 121.000000 
+108.000000 103.000000 108.000000 116.000000 122.000000 127.000000 
+131.000000 132.000000 130.000000 128.000000 125.000000 120.000000 
+125.000000 122.000000 123.000000 130.000000 134.000000 129.000000 
+121.000000 120.000000 123.000000 123.000000 119.000000 119.000000 
+126.000000 129.000000 115.000000 97.000000 95.000000 107.000000 
+114.000000 104.000000 87.000000 80.000000 89.000000 102.000000 
+104.000000 98.000000 96.000000 94.000000 88.000000 74.000000 
+107.000000 172.000000 197.000000 159.000000 97.000000 57.000000 
+40.000000 43.000000 75.000000 111.000000 147.000000 192.000000 
+216.000000 175.000000 115.000000 124.000000 143.000000 124.000000 
+98.000000 97.000000 109.000000 112.000000 110.000000 117.000000 
+128.000000 132.000000 127.000000 125.000000 124.000000 121.000000 
+121.000000 129.000000 133.000000 120.000000 99.000000 95.000000 
+114.000000 135.000000 139.000000 132.000000 126.000000 128.000000 
+133.000000 134.000000 131.000000 125.000000 122.000000 128.000000 
+131.000000 131.000000 127.000000 120.000000 115.000000 116.000000 
+121.000000 121.000000 118.000000 121.000000 131.000000 134.000000 
+116.000000 91.000000 88.000000 114.000000 141.000000 142.000000 
+114.000000 89.000000 97.000000 124.000000 142.000000 140.000000 
+130.000000 123.000000 118.000000 109.000000 92.000000 75.000000 
+71.000000 71.000000 70.000000 79.000000 102.000000 122.000000 
+120.000000 104.000000 96.000000 105.000000 133.000000 158.000000 
+155.000000 144.000000 144.000000 131.000000 106.000000 90.000000 
+97.000000 113.000000 120.000000 120.000000 124.000000 129.000000 
+130.000000 127.000000 123.000000 118.000000 116.000000 121.000000 
+129.000000 127.000000 113.000000 102.000000 108.000000 125.000000 
+138.000000 138.000000 131.000000 126.000000 126.000000 125.000000 
+123.000000 121.000000 117.000000 119.000000 123.000000 122.000000 
+119.000000 118.000000 119.000000 119.000000 119.000000 122.000000 
+125.000000 123.000000 116.000000 110.000000 107.000000 103.000000 
+102.000000 117.000000 142.000000 153.000000 142.000000 127.000000 
+116.000000 115.000000 119.000000 122.000000 123.000000 125.000000 
+128.000000 127.000000 123.000000 113.000000 104.000000 103.000000 
+109.000000 118.000000 127.000000 136.000000 143.000000 142.000000 
+131.000000 118.000000 119.000000 136.000000 148.000000 142.000000 
+130.000000 120.000000 105.000000 93.000000 97.000000 114.000000 
+126.000000 125.000000 123.000000 127.000000 133.000000 129.000000 
+124.000000 126.000000 134.000000 134.000000 125.000000 119.000000 
+122.000000 126.000000 126.000000 128.000000 137.000000 145.000000 
+143.000000 133.000000 127.000000 128.000000 126.000000 118.000000 
+125.000000 129.000000 135.000000 136.000000 128.000000 119.000000 
+120.000000 128.000000 130.000000 125.000000 122.000000 125.000000 
+125.000000 114.000000 103.000000 105.000000 116.000000 130.000000 
+136.000000 132.000000 129.000000 128.000000 127.000000 127.000000 
+128.000000 130.000000 129.000000 126.000000 124.000000 125.000000 
+127.000000 126.000000 124.000000 123.000000 123.000000 125.000000 
+128.000000 129.000000 131.000000 134.000000 134.000000 128.000000 
+121.000000 117.000000 120.000000 123.000000 117.000000 105.000000 
+91.000000 84.000000 95.000000 112.000000 122.000000 126.000000 
+129.000000 134.000000 138.000000 137.000000 131.000000 128.000000 
+129.000000 127.000000 125.000000 125.000000 128.000000 130.000000 
+131.000000 135.000000 139.000000 137.000000 127.000000 119.000000 
+121.000000 129.000000 132.000000 125.000000 115.000000 117.000000 
+126.000000 136.000000 137.000000 129.000000 124.000000 125.000000 
+129.000000 128.000000 126.000000 126.000000 125.000000 112.000000 
+91.000000 87.000000 120.000000 168.000000 186.000000 165.000000 
+136.000000 120.000000 118.000000 120.000000 118.000000 116.000000 
+119.000000 125.000000 130.000000 133.000000 131.000000 126.000000 
+121.000000 118.000000 120.000000 124.000000 125.000000 123.000000 
+123.000000 124.000000 127.000000 125.000000 122.000000 123.000000 
+128.000000 124.000000 103.000000 77.000000 65.000000 74.000000 
+97.000000 119.000000 131.000000 135.000000 135.000000 132.000000 
+130.000000 128.000000 126.000000 123.000000 121.000000 124.000000 
+129.000000 129.000000 127.000000 129.000000 136.000000 140.000000 
+135.000000 128.000000 126.000000 129.000000 129.000000 125.000000 
+121.000000 121.000000 118.000000 120.000000 122.000000 123.000000 
+126.000000 128.000000 129.000000 130.000000 129.000000 126.000000 
+125.000000 130.000000 130.000000 113.000000 93.000000 96.000000 
+134.000000 170.000000 169.000000 142.000000 120.000000 119.000000 
+125.000000 123.000000 115.000000 111.000000 115.000000 121.000000 
+127.000000 130.000000 129.000000 124.000000 120.000000 117.000000 
+117.000000 116.000000 114.000000 115.000000 119.000000 127.000000 
+131.000000 130.000000 127.000000 129.000000 135.000000 135.000000 
+121.000000 101.000000 93.000000 98.000000 107.000000 111.000000 
+114.000000 124.000000 134.000000 135.000000 132.000000 131.000000 
+131.000000 128.000000 124.000000 126.000000 132.000000 136.000000 
+134.000000 134.000000 137.000000 140.000000 136.000000 128.000000 
+123.000000 123.000000 124.000000 124.000000 125.000000 127.000000 
+120.000000 119.000000 118.000000 120.000000 122.000000 122.000000 
+122.000000 122.000000 123.000000 122.000000 125.000000 129.000000 
+122.000000 100.000000 80.000000 85.000000 114.000000 138.000000 
+138.000000 124.000000 118.000000 121.000000 124.000000 123.000000 
+124.000000 128.000000 130.000000 129.000000 129.000000 130.000000 
+127.000000 120.000000 116.000000 116.000000 117.000000 116.000000 
+115.000000 116.000000 118.000000 120.000000 121.000000 123.000000 
+124.000000 127.000000 134.000000 142.000000 138.000000 116.000000 
+97.000000 97.000000 114.000000 130.000000 132.000000 129.000000 
+132.000000 137.000000 137.000000 131.000000 127.000000 123.000000 
+119.000000 117.000000 121.000000 129.000000 134.000000 135.000000 
+133.000000 131.000000 126.000000 120.000000 116.000000 118.000000 
+123.000000 126.000000 124.000000 121.000000 124.000000 121.000000 
+120.000000 123.000000 124.000000 124.000000 125.000000 127.000000 
+128.000000 132.000000 136.000000 133.000000 115.000000 94.000000 
+88.000000 100.000000 119.000000 128.000000 128.000000 126.000000 
+124.000000 122.000000 122.000000 127.000000 132.000000 130.000000 
+123.000000 120.000000 123.000000 125.000000 120.000000 115.000000 
+117.000000 124.000000 127.000000 124.000000 122.000000 123.000000 
+127.000000 129.000000 130.000000 129.000000 125.000000 119.000000 
+122.000000 133.000000 142.000000 132.000000 109.000000 96.000000 
+105.000000 125.000000 139.000000 138.000000 133.000000 133.000000 
+135.000000 132.000000 127.000000 123.000000 124.000000 126.000000 
+126.000000 128.000000 134.000000 142.000000 146.000000 143.000000 
+136.000000 128.000000 122.000000 122.000000 125.000000 129.000000 
+129.000000 126.000000 126.000000 123.000000 122.000000 124.000000 
+127.000000 128.000000 129.000000 131.000000 130.000000 129.000000 
+132.000000 131.000000 117.000000 94.000000 83.000000 93.000000 
+114.000000 127.000000 127.000000 124.000000 125.000000 127.000000 
+127.000000 126.000000 124.000000 122.000000 120.000000 123.000000 
+130.000000 134.000000 132.000000 126.000000 124.000000 124.000000 
+126.000000 127.000000 127.000000 127.000000 126.000000 125.000000 
+127.000000 130.000000 130.000000 128.000000 129.000000 135.000000 
+139.000000 132.000000 115.000000 104.000000 110.000000 126.000000 
+135.000000 134.000000 129.000000 130.000000 134.000000 134.000000 
+133.000000 131.000000 131.000000 129.000000 124.000000 122.000000 
+126.000000 133.000000 137.000000 137.000000 133.000000 128.000000 
+123.000000 120.000000 119.000000 116.000000 115.000000 120.000000 
+131.000000 128.000000 125.000000 126.000000 131.000000 134.000000 
+131.000000 126.000000 123.000000 126.000000 130.000000 127.000000 
+113.000000 94.000000 88.000000 103.000000 126.000000 136.000000 
+131.000000 122.000000 121.000000 124.000000 125.000000 124.000000 
+125.000000 125.000000 122.000000 119.000000 122.000000 126.000000 
+126.000000 121.000000 118.000000 120.000000 124.000000 126.000000 
+125.000000 125.000000 126.000000 126.000000 126.000000 127.000000 
+125.000000 121.000000 122.000000 130.000000 139.000000 138.000000 
+125.000000 111.000000 109.000000 120.000000 131.000000 135.000000 
+133.000000 131.000000 131.000000 130.000000 129.000000 129.000000 
+132.000000 135.000000 133.000000 128.000000 127.000000 132.000000 
+140.000000 142.000000 136.000000 125.000000 118.000000 118.000000 
+122.000000 124.000000 123.000000 124.000000 121.000000 123.000000 
+125.000000 126.000000 129.000000 133.000000 131.000000 123.000000 
+121.000000 127.000000 128.000000 114.000000 93.000000 82.000000 
+90.000000 106.000000 119.000000 124.000000 126.000000 130.000000 
+132.000000 131.000000 127.000000 125.000000 127.000000 128.000000 
+126.000000 123.000000 122.000000 125.000000 127.000000 127.000000 
+125.000000 125.000000 125.000000 123.000000 121.000000 122.000000 
+125.000000 126.000000 124.000000 123.000000 123.000000 123.000000 
+125.000000 130.000000 138.000000 139.000000 130.000000 118.000000 
+116.000000 127.000000 139.000000 141.000000 134.000000 128.000000 
+130.000000 133.000000 134.000000 130.000000 127.000000 126.000000 
+126.000000 127.000000 128.000000 128.000000 130.000000 133.000000 
+135.000000 135.000000 129.000000 123.000000 120.000000 121.000000 
+124.000000 126.000000 120.000000 121.000000 129.000000 135.000000 
+133.000000 126.000000 121.000000 119.000000 121.000000 125.000000 
+122.000000 109.000000 93.000000 91.000000 104.000000 118.000000 
+123.000000 120.000000 119.000000 123.000000 128.000000 129.000000 
+127.000000 125.000000 124.000000 124.000000 123.000000 123.000000 
+124.000000 126.000000 125.000000 120.000000 118.000000 121.000000 
+129.000000 132.000000 130.000000 127.000000 127.000000 129.000000 
+127.000000 125.000000 126.000000 127.000000 126.000000 127.000000 
+131.000000 137.000000 134.000000 123.000000 118.000000 128.000000 
+142.000000 145.000000 133.000000 122.000000 120.000000 126.000000 
+130.000000 131.000000 134.000000 136.000000 136.000000 134.000000 
+132.000000 133.000000 137.000000 141.000000 141.000000 135.000000 
+127.000000 121.000000 120.000000 120.000000 117.000000 115.000000 
+124.000000 128.000000 133.000000 135.000000 132.000000 128.000000 
+127.000000 129.000000 131.000000 129.000000 121.000000 108.000000 
+100.000000 101.000000 112.000000 125.000000 129.000000 125.000000 
+121.000000 122.000000 125.000000 124.000000 121.000000 121.000000 
+124.000000 125.000000 123.000000 123.000000 124.000000 124.000000 
+120.000000 116.000000 114.000000 118.000000 125.000000 128.000000 
+128.000000 125.000000 123.000000 124.000000 128.000000 132.000000 
+133.000000 133.000000 131.000000 131.000000 135.000000 141.000000 
+138.000000 125.000000 114.000000 116.000000 129.000000 139.000000 
+138.000000 133.000000 131.000000 130.000000 128.000000 127.000000 
+133.000000 140.000000 143.000000 139.000000 135.000000 135.000000 
+137.000000 139.000000 140.000000 136.000000 128.000000 119.000000 
+115.000000 118.000000 122.000000 123.000000 125.000000 129.000000 
+131.000000 130.000000 128.000000 127.000000 128.000000 130.000000 
+131.000000 126.000000 115.000000 104.000000 103.000000 113.000000 
+126.000000 133.000000 129.000000 123.000000 121.000000 124.000000 
+127.000000 128.000000 128.000000 125.000000 120.000000 118.000000 
+121.000000 128.000000 132.000000 128.000000 120.000000 114.000000 
+115.000000 121.000000 127.000000 127.000000 123.000000 120.000000 
+120.000000 124.000000 128.000000 128.000000 126.000000 124.000000 
+125.000000 129.000000 134.000000 139.000000 137.000000 125.000000 
+112.000000 111.000000 123.000000 138.000000 142.000000 135.000000 
+127.000000 126.000000 129.000000 131.000000 131.000000 131.000000 
+134.000000 138.000000 140.000000 139.000000 134.000000 129.000000 
+127.000000 127.000000 127.000000 126.000000 122.000000 119.000000 
+118.000000 119.000000 123.000000 124.000000 129.000000 132.000000 
+128.000000 122.000000 120.000000 122.000000 126.000000 127.000000 
+120.000000 110.000000 103.000000 105.000000 115.000000 126.000000 
+132.000000 131.000000 127.000000 123.000000 121.000000 121.000000 
+123.000000 122.000000 119.000000 118.000000 122.000000 127.000000 
+127.000000 123.000000 120.000000 120.000000 123.000000 127.000000 
+129.000000 129.000000 126.000000 123.000000 123.000000 126.000000 
+129.000000 131.000000 132.000000 130.000000 126.000000 125.000000 
+131.000000 138.000000 137.000000 123.000000 104.000000 98.000000 
+106.000000 121.000000 133.000000 137.000000 136.000000 130.000000 
+126.000000 127.000000 132.000000 136.000000 136.000000 136.000000 
+139.000000 142.000000 140.000000 133.000000 126.000000 124.000000 
+125.000000 126.000000 125.000000 123.000000 120.000000 119.000000 
+102.000000 102.000000 113.000000 111.000000 101.000000 95.000000 
+107.000000 133.000000 139.000000 118.000000 95.000000 86.000000 
+72.000000 36.000000 20.000000 51.000000 50.000000 33.000000 
+34.000000 61.000000 75.000000 72.000000 54.000000 29.000000 
+23.000000 22.000000 14.000000 13.000000 13.000000 12.000000 
+8.000000 9.000000 9.000000 7.000000 7.000000 9.000000 
+10.000000 7.000000 9.000000 11.000000 8.000000 8.000000 
+8.000000 11.000000 16.000000 19.000000 17.000000 11.000000 
+8.000000 11.000000 21.000000 33.000000 44.000000 43.000000 
+19.000000 21.000000 52.000000 70.000000 76.000000 85.000000 
+97.000000 103.000000 99.000000 87.000000 79.000000 82.000000 
+88.000000 92.000000 99.000000 109.000000 113.000000 113.000000 
+115.000000 119.000000 124.000000 128.000000 107.000000 94.000000 
+105.000000 137.000000 168.000000 171.000000 154.000000 147.000000 
+150.000000 141.000000 114.000000 86.000000 61.000000 32.000000 
+31.000000 73.000000 64.000000 27.000000 33.000000 56.000000 
+60.000000 54.000000 42.000000 35.000000 33.000000 23.000000 
+22.000000 23.000000 17.000000 10.000000 8.000000 12.000000 
+14.000000 9.000000 5.000000 6.000000 8.000000 9.000000 
+11.000000 10.000000 9.000000 12.000000 10.000000 12.000000 
+19.000000 19.000000 12.000000 8.000000 7.000000 12.000000 
+24.000000 32.000000 37.000000 30.000000 8.000000 33.000000 
+79.000000 97.000000 98.000000 106.000000 119.000000 114.000000 
+98.000000 90.000000 95.000000 102.000000 103.000000 103.000000 
+107.000000 111.000000 112.000000 114.000000 118.000000 123.000000 
+125.000000 128.000000 123.000000 112.000000 105.000000 120.000000 
+149.000000 166.000000 154.000000 129.000000 118.000000 119.000000 
+114.000000 90.000000 52.000000 23.000000 40.000000 79.000000 
+69.000000 40.000000 46.000000 42.000000 31.000000 31.000000 
+30.000000 35.000000 27.000000 12.000000 16.000000 19.000000 
+14.000000 7.000000 11.000000 17.000000 16.000000 12.000000 
+10.000000 9.000000 12.000000 17.000000 20.000000 15.000000 
+8.000000 10.000000 11.000000 15.000000 20.000000 17.000000 
+14.000000 12.000000 5.000000 11.000000 22.000000 32.000000 
+36.000000 24.000000 25.000000 57.000000 90.000000 106.000000 
+115.000000 122.000000 119.000000 103.000000 91.000000 93.000000 
+97.000000 98.000000 102.000000 112.000000 116.000000 113.000000 
+112.000000 119.000000 127.000000 129.000000 125.000000 123.000000 
+129.000000 126.000000 117.000000 109.000000 109.000000 114.000000 
+112.000000 98.000000 89.000000 97.000000 106.000000 87.000000 
+46.000000 21.000000 50.000000 77.000000 70.000000 44.000000 
+31.000000 33.000000 27.000000 21.000000 22.000000 19.000000 
+10.000000 16.000000 31.000000 35.000000 27.000000 13.000000 
+7.000000 14.000000 13.000000 8.000000 9.000000 12.000000 
+17.000000 17.000000 18.000000 14.000000 3.000000 4.000000 
+6.000000 17.000000 30.000000 37.000000 42.000000 39.000000 
+23.000000 11.000000 16.000000 31.000000 38.000000 31.000000 
+51.000000 84.000000 94.000000 102.000000 123.000000 126.000000 
+98.000000 78.000000 80.000000 81.000000 79.000000 87.000000 
+105.000000 117.000000 117.000000 115.000000 122.000000 131.000000 
+133.000000 128.000000 120.000000 117.000000 127.000000 124.000000 
+126.000000 124.000000 113.000000 103.000000 96.000000 87.000000 
+78.000000 82.000000 95.000000 93.000000 58.000000 26.000000 
+53.000000 80.000000 75.000000 48.000000 25.000000 21.000000 
+13.000000 7.000000 7.000000 10.000000 11.000000 27.000000 
+48.000000 56.000000 44.000000 24.000000 13.000000 15.000000 
+12.000000 7.000000 4.000000 8.000000 8.000000 6.000000 
+8.000000 13.000000 17.000000 19.000000 15.000000 20.000000 
+36.000000 52.000000 54.000000 45.000000 39.000000 40.000000 
+47.000000 51.000000 50.000000 50.000000 65.000000 79.000000 
+83.000000 103.000000 120.000000 98.000000 78.000000 92.000000 
+97.000000 74.000000 58.000000 75.000000 109.000000 125.000000 
+119.000000 113.000000 117.000000 124.000000 125.000000 123.000000 
+125.000000 127.000000 121.000000 123.000000 127.000000 122.000000 
+106.000000 90.000000 81.000000 79.000000 82.000000 85.000000 
+86.000000 84.000000 63.000000 28.000000 41.000000 73.000000 
+77.000000 67.000000 45.000000 14.000000 3.000000 17.000000 
+6.000000 2.000000 14.000000 23.000000 28.000000 38.000000 
+38.000000 26.000000 16.000000 8.000000 25.000000 34.000000 
+21.000000 9.000000 9.000000 5.000000 12.000000 31.000000 
+35.000000 16.000000 23.000000 41.000000 60.000000 67.000000 
+73.000000 92.000000 113.000000 132.000000 140.000000 125.000000 
+91.000000 74.000000 69.000000 57.000000 67.000000 98.000000 
+103.000000 82.000000 86.000000 104.000000 93.000000 65.000000 
+58.000000 81.000000 115.000000 130.000000 125.000000 114.000000 
+108.000000 109.000000 117.000000 125.000000 127.000000 128.000000 
+114.000000 115.000000 116.000000 115.000000 111.000000 103.000000 
+89.000000 82.000000 91.000000 100.000000 94.000000 80.000000 
+64.000000 37.000000 24.000000 57.000000 77.000000 86.000000 
+82.000000 52.000000 45.000000 68.000000 63.000000 43.000000 
+26.000000 21.000000 29.000000 35.000000 34.000000 19.000000 
+19.000000 19.000000 26.000000 27.000000 18.000000 15.000000 
+26.000000 30.000000 31.000000 39.000000 29.000000 9.000000 
+28.000000 52.000000 61.000000 72.000000 115.000000 176.000000 
+213.000000 226.000000 220.000000 180.000000 114.000000 64.000000 
+52.000000 61.000000 81.000000 94.000000 82.000000 76.000000 
+84.000000 79.000000 61.000000 61.000000 86.000000 109.000000 
+115.000000 115.000000 120.000000 124.000000 120.000000 113.000000 
+117.000000 122.000000 120.000000 120.000000 116.000000 104.000000 
+100.000000 112.000000 129.000000 130.000000 108.000000 87.000000 
+90.000000 111.000000 123.000000 108.000000 80.000000 50.000000 
+22.000000 48.000000 73.000000 79.000000 86.000000 87.000000 
+93.000000 116.000000 134.000000 106.000000 46.000000 26.000000 
+33.000000 64.000000 70.000000 36.000000 12.000000 35.000000 
+36.000000 30.000000 29.000000 41.000000 51.000000 60.000000 
+57.000000 43.000000 33.000000 40.000000 55.000000 64.000000 
+64.000000 92.000000 152.000000 205.000000 223.000000 213.000000 
+190.000000 150.000000 96.000000 53.000000 44.000000 65.000000 
+86.000000 88.000000 79.000000 80.000000 79.000000 62.000000 
+50.000000 68.000000 104.000000 122.000000 115.000000 107.000000 
+114.000000 124.000000 123.000000 117.000000 117.000000 121.000000 
+122.000000 123.000000 121.000000 110.000000 104.000000 110.000000 
+126.000000 132.000000 115.000000 91.000000 89.000000 115.000000 
+145.000000 139.000000 98.000000 56.000000 34.000000 41.000000 
+61.000000 67.000000 80.000000 101.000000 114.000000 143.000000 
+178.000000 150.000000 71.000000 21.000000 16.000000 63.000000 
+92.000000 65.000000 24.000000 37.000000 32.000000 26.000000 
+31.000000 35.000000 42.000000 49.000000 50.000000 36.000000 
+31.000000 49.000000 71.000000 77.000000 79.000000 130.000000 
+219.000000 283.000000 282.000000 239.000000 181.000000 119.000000 
+76.000000 64.000000 70.000000 88.000000 102.000000 94.000000 
+82.000000 79.000000 72.000000 59.000000 60.000000 84.000000 
+114.000000 128.000000 126.000000 120.000000 118.000000 116.000000 
+115.000000 120.000000 128.000000 129.000000 125.000000 123.000000 
+123.000000 122.000000 119.000000 116.000000 119.000000 127.000000 
+128.000000 121.000000 119.000000 135.000000 160.000000 157.000000 
+107.000000 46.000000 25.000000 29.000000 44.000000 79.000000 
+122.000000 166.000000 180.000000 190.000000 203.000000 180.000000 
+114.000000 41.000000 10.000000 29.000000 65.000000 73.000000 
+47.000000 37.000000 33.000000 25.000000 27.000000 20.000000 
+22.000000 33.000000 36.000000 36.000000 43.000000 66.000000 
+77.000000 67.000000 105.000000 209.000000 332.000000 375.000000 
+314.000000 241.000000 183.000000 108.000000 65.000000 72.000000 
+93.000000 110.000000 108.000000 86.000000 69.000000 59.000000 
+52.000000 62.000000 91.000000 121.000000 132.000000 124.000000 
+116.000000 115.000000 115.000000 113.000000 115.000000 121.000000 
+122.000000 118.000000 120.000000 129.000000 130.000000 129.000000 
+124.000000 118.000000 117.000000 125.000000 134.000000 133.000000 
+123.000000 123.000000 138.000000 138.000000 103.000000 48.000000 
+18.000000 30.000000 41.000000 70.000000 161.000000 238.000000 
+255.000000 238.000000 215.000000 184.000000 136.000000 69.000000 
+19.000000 15.000000 42.000000 65.000000 52.000000 41.000000 
+46.000000 50.000000 48.000000 30.000000 15.000000 16.000000 
+25.000000 39.000000 61.000000 79.000000 71.000000 90.000000 
+182.000000 298.000000 370.000000 336.000000 206.000000 125.000000 
+118.000000 94.000000 73.000000 86.000000 104.000000 100.000000 
+81.000000 67.000000 60.000000 48.000000 47.000000 77.000000 
+120.000000 143.000000 133.000000 115.000000 107.000000 107.000000 
+106.000000 109.000000 116.000000 118.000000 112.000000 113.000000 
+127.000000 141.000000 127.000000 131.000000 131.000000 124.000000 
+118.000000 124.000000 134.000000 130.000000 108.000000 94.000000 
+97.000000 105.000000 96.000000 68.000000 30.000000 27.000000 
+46.000000 48.000000 164.000000 261.000000 297.000000 287.000000 
+247.000000 202.000000 165.000000 114.000000 72.000000 50.000000 
+45.000000 60.000000 72.000000 72.000000 68.000000 68.000000 
+66.000000 51.000000 35.000000 32.000000 38.000000 54.000000 
+76.000000 80.000000 78.000000 146.000000 249.000000 312.000000 
+301.000000 234.000000 138.000000 93.000000 117.000000 129.000000 
+110.000000 97.000000 94.000000 89.000000 80.000000 71.000000 
+55.000000 40.000000 52.000000 88.000000 120.000000 128.000000 
+119.000000 115.000000 116.000000 113.000000 112.000000 119.000000 
+124.000000 119.000000 115.000000 124.000000 136.000000 135.000000 
+126.000000 136.000000 137.000000 124.000000 112.000000 116.000000 
+130.000000 138.000000 132.000000 115.000000 91.000000 75.000000 
+71.000000 65.000000 40.000000 16.000000 52.000000 63.000000 
+135.000000 242.000000 324.000000 334.000000 278.000000 221.000000 
+187.000000 154.000000 133.000000 115.000000 92.000000 81.000000 
+83.000000 87.000000 87.000000 87.000000 86.000000 79.000000 
+72.000000 73.000000 75.000000 88.000000 107.000000 105.000000 
+118.000000 203.000000 282.000000 284.000000 232.000000 198.000000 
+177.000000 154.000000 151.000000 147.000000 124.000000 103.000000 
+92.000000 85.000000 74.000000 54.000000 37.000000 41.000000 
+67.000000 98.000000 118.000000 121.000000 118.000000 114.000000 
+112.000000 113.000000 118.000000 122.000000 121.000000 118.000000 
+122.000000 132.000000 137.000000 129.000000 138.000000 144.000000 
+136.000000 119.000000 107.000000 106.000000 115.000000 131.000000 
+148.000000 145.000000 111.000000 71.000000 53.000000 56.000000 
+49.000000 21.000000 27.000000 69.000000 104.000000 194.000000 
+302.000000 331.000000 273.000000 208.000000 177.000000 161.000000 
+152.000000 142.000000 124.000000 102.000000 90.000000 93.000000 
+107.000000 121.000000 124.000000 116.000000 107.000000 97.000000 
+88.000000 89.000000 103.000000 104.000000 146.000000 255.000000 
+310.000000 255.000000 210.000000 231.000000 236.000000 196.000000 
+144.000000 109.000000 104.000000 115.000000 110.000000 79.000000 
+43.000000 24.000000 31.000000 58.000000 87.000000 109.000000 
+119.000000 122.000000 119.000000 113.000000 110.000000 114.000000 
+120.000000 120.000000 118.000000 121.000000 132.000000 137.000000 
+133.000000 124.000000 142.000000 144.000000 135.000000 123.000000 
+114.000000 111.000000 112.000000 120.000000 134.000000 144.000000 
+135.000000 106.000000 76.000000 65.000000 72.000000 67.000000 
+39.000000 37.000000 62.000000 141.000000 238.000000 277.000000 
+235.000000 164.000000 130.000000 136.000000 136.000000 122.000000 
+110.000000 107.000000 108.000000 107.000000 110.000000 122.000000 
+136.000000 141.000000 136.000000 123.000000 104.000000 88.000000 
+85.000000 86.000000 150.000000 265.000000 307.000000 233.000000 
+222.000000 273.000000 270.000000 209.000000 136.000000 89.000000 
+94.000000 113.000000 103.000000 67.000000 35.000000 29.000000 
+45.000000 69.000000 92.000000 105.000000 108.000000 108.000000 
+110.000000 116.000000 122.000000 124.000000 123.000000 119.000000 
+118.000000 123.000000 131.000000 135.000000 131.000000 124.000000 
+131.000000 127.000000 125.000000 125.000000 123.000000 120.000000 
+118.000000 118.000000 120.000000 125.000000 130.000000 125.000000 
+109.000000 97.000000 102.000000 112.000000 101.000000 63.000000 
+52.000000 94.000000 161.000000 202.000000 184.000000 133.000000 
+93.000000 103.000000 123.000000 122.000000 117.000000 121.000000 
+128.000000 126.000000 118.000000 115.000000 118.000000 125.000000 
+130.000000 133.000000 127.000000 108.000000 88.000000 79.000000 
+134.000000 221.000000 243.000000 205.000000 243.000000 297.000000 
+275.000000 194.000000 113.000000 84.000000 94.000000 98.000000 
+81.000000 53.000000 33.000000 35.000000 51.000000 69.000000 
+87.000000 102.000000 110.000000 108.000000 107.000000 115.000000 
+126.000000 129.000000 122.000000 116.000000 118.000000 125.000000 
+130.000000 131.000000 130.000000 129.000000 119.000000 120.000000 
+124.000000 127.000000 125.000000 121.000000 118.000000 116.000000 
+113.000000 110.000000 113.000000 124.000000 134.000000 133.000000 
+124.000000 119.000000 118.000000 107.000000 80.000000 63.000000 
+87.000000 118.000000 131.000000 117.000000 91.000000 88.000000 
+109.000000 124.000000 126.000000 125.000000 128.000000 135.000000 
+141.000000 135.000000 120.000000 110.000000 116.000000 127.000000 
+126.000000 114.000000 97.000000 82.000000 108.000000 158.000000 
+172.000000 187.000000 253.000000 292.000000 251.000000 161.000000 
+95.000000 89.000000 97.000000 84.000000 60.000000 41.000000 
+30.000000 31.000000 47.000000 69.000000 87.000000 100.000000 
+111.000000 115.000000 116.000000 118.000000 123.000000 127.000000 
+125.000000 120.000000 119.000000 124.000000 127.000000 129.000000 
+130.000000 130.000000 122.000000 130.000000 134.000000 134.000000 
+132.000000 128.000000 121.000000 115.000000 113.000000 114.000000 
+114.000000 114.000000 121.000000 131.000000 133.000000 127.000000 
+117.000000 106.000000 93.000000 81.000000 72.000000 75.000000 
+87.000000 89.000000 83.000000 81.000000 91.000000 110.000000 
+123.000000 122.000000 117.000000 119.000000 129.000000 131.000000 
+121.000000 113.000000 116.000000 123.000000 125.000000 126.000000 
+120.000000 102.000000 98.000000 121.000000 152.000000 200.000000 
+252.000000 260.000000 206.000000 129.000000 101.000000 105.000000 
+97.000000 70.000000 43.000000 36.000000 49.000000 64.000000 
+76.000000 88.000000 97.000000 105.000000 114.000000 121.000000 
+122.000000 118.000000 114.000000 116.000000 120.000000 120.000000 
+118.000000 121.000000 127.000000 129.000000 126.000000 125.000000 
+120.000000 123.000000 129.000000 135.000000 138.000000 133.000000 
+124.000000 119.000000 121.000000 126.000000 123.000000 117.000000 
+117.000000 125.000000 128.000000 118.000000 102.000000 95.000000 
+97.000000 99.000000 91.000000 81.000000 81.000000 88.000000 
+91.000000 91.000000 94.000000 107.000000 122.000000 128.000000 
+123.000000 116.000000 116.000000 117.000000 115.000000 115.000000 
+119.000000 123.000000 127.000000 133.000000 131.000000 109.000000 
+89.000000 99.000000 140.000000 192.000000 222.000000 205.000000 
+152.000000 114.000000 109.000000 103.000000 82.000000 60.000000 
+50.000000 64.000000 92.000000 115.000000 117.000000 107.000000 
+103.000000 112.000000 125.000000 130.000000 126.000000 120.000000 
+115.000000 113.000000 113.000000 116.000000 120.000000 125.000000 
+128.000000 126.000000 122.000000 122.000000 123.000000 128.000000 
+133.000000 132.000000 128.000000 126.000000 125.000000 123.000000 
+122.000000 122.000000 125.000000 127.000000 131.000000 134.000000 
+129.000000 116.000000 101.000000 91.000000 85.000000 81.000000 
+80.000000 82.000000 89.000000 94.000000 94.000000 95.000000 
+104.000000 117.000000 124.000000 124.000000 118.000000 116.000000 
+116.000000 114.000000 111.000000 116.000000 125.000000 130.000000 
+131.000000 131.000000 123.000000 102.000000 83.000000 90.000000 
+121.000000 155.000000 168.000000 148.000000 116.000000 106.000000 
+107.000000 95.000000 76.000000 69.000000 86.000000 115.000000 
+131.000000 130.000000 118.000000 109.000000 110.000000 117.000000 
+121.000000 121.000000 124.000000 133.000000 140.000000 134.000000 
+121.000000 114.000000 120.000000 129.000000 130.000000 128.000000 
+129.000000 132.000000 132.000000 140.000000 136.000000 125.000000 
+117.000000 120.000000 126.000000 126.000000 120.000000 115.000000 
+115.000000 121.000000 128.000000 131.000000 129.000000 121.000000 
+110.000000 99.000000 91.000000 88.000000 95.000000 104.000000 
+105.000000 92.000000 76.000000 79.000000 98.000000 116.000000 
+121.000000 117.000000 116.000000 121.000000 126.000000 123.000000 
+120.000000 123.000000 130.000000 136.000000 140.000000 140.000000 
+130.000000 107.000000 89.000000 91.000000 107.000000 121.000000 
+124.000000 114.000000 104.000000 101.000000 98.000000 92.000000 
+87.000000 95.000000 118.000000 135.000000 132.000000 113.000000 
+101.000000 109.000000 122.000000 126.000000 122.000000 123.000000 
+131.000000 139.000000 138.000000 131.000000 124.000000 126.000000 
+131.000000 133.000000 131.000000 129.000000 133.000000 138.000000 
+138.000000 130.000000 120.000000 113.000000 110.000000 113.000000 
+119.000000 124.000000 125.000000 123.000000 120.000000 122.000000 
+128.000000 133.000000 129.000000 116.000000 95.000000 81.000000 
+81.000000 93.000000 111.000000 122.000000 119.000000 99.000000 
+77.000000 72.000000 79.000000 95.000000 112.000000 123.000000 
+127.000000 127.000000 128.000000 130.000000 134.000000 137.000000 
+137.000000 136.000000 134.000000 132.000000 126.000000 109.000000 
+88.000000 80.000000 89.000000 105.000000 112.000000 112.000000 
+112.000000 111.000000 102.000000 93.000000 94.000000 107.000000 
+121.000000 123.000000 114.000000 105.000000 106.000000 115.000000 
+122.000000 122.000000 122.000000 130.000000 139.000000 140.000000 
+131.000000 122.000000 122.000000 127.000000 130.000000 127.000000 
+125.000000 129.000000 135.000000 137.000000 131.000000 118.000000 
+112.000000 118.000000 125.000000 126.000000 121.000000 118.000000 
+118.000000 120.000000 120.000000 119.000000 121.000000 128.000000 
+134.000000 127.000000 104.000000 85.000000 84.000000 98.000000 
+112.000000 110.000000 102.000000 94.000000 76.000000 55.000000 
+55.000000 68.000000 96.000000 121.000000 128.000000 124.000000 
+120.000000 124.000000 131.000000 135.000000 135.000000 132.000000 
+128.000000 119.000000 107.000000 91.000000 74.000000 72.000000 
+87.000000 107.000000 118.000000 118.000000 113.000000 109.000000 
+105.000000 101.000000 102.000000 109.000000 115.000000 113.000000 
+108.000000 109.000000 116.000000 120.000000 120.000000 122.000000 
+128.000000 133.000000 132.000000 130.000000 129.000000 129.000000 
+127.000000 125.000000 124.000000 124.000000 125.000000 128.000000 
+129.000000 130.000000 131.000000 128.000000 126.000000 124.000000 
+125.000000 126.000000 125.000000 119.000000 113.000000 114.000000 
+122.000000 128.000000 128.000000 126.000000 124.000000 115.000000 
+101.000000 92.000000 98.000000 117.000000 124.000000 101.000000 
+71.000000 63.000000 49.000000 12.000000 20.000000 39.000000 
+56.000000 99.000000 132.000000 140.000000 137.000000 138.000000 
+146.000000 153.000000 151.000000 143.000000 131.000000 112.000000 
+82.000000 49.000000 37.000000 59.000000 92.000000 108.000000 
+112.000000 112.000000 105.000000 100.000000 102.000000 106.000000 
+108.000000 112.000000 115.000000 115.000000 116.000000 120.000000 
+125.000000 126.000000 122.000000 122.000000 129.000000 137.000000 
+140.000000 138.000000 135.000000 131.000000 126.000000 122.000000 
+122.000000 125.000000 127.000000 127.000000 129.000000 134.000000 
+137.000000 135.000000 131.000000 126.000000 119.000000 113.000000 
+112.000000 114.000000 117.000000 118.000000 119.000000 122.000000 
+128.000000 132.000000 129.000000 110.000000 88.000000 82.000000 
+97.000000 123.000000 129.000000 98.000000 61.000000 52.000000 
+45.000000 18.000000 29.000000 49.000000 40.000000 65.000000 
+132.000000 190.000000 210.000000 196.000000 180.000000 181.000000 
+185.000000 162.000000 113.000000 73.000000 34.000000 18.000000 
+23.000000 38.000000 59.000000 74.000000 96.000000 112.000000 
+103.000000 92.000000 96.000000 107.000000 114.000000 114.000000 
+111.000000 108.000000 112.000000 120.000000 126.000000 126.000000 
+121.000000 117.000000 118.000000 127.000000 137.000000 141.000000 
+137.000000 129.000000 122.000000 120.000000 123.000000 125.000000 
+124.000000 122.000000 125.000000 130.000000 129.000000 132.000000 
+126.000000 121.000000 117.000000 114.000000 113.000000 117.000000 
+123.000000 125.000000 120.000000 114.000000 116.000000 125.000000 
+127.000000 111.000000 89.000000 86.000000 105.000000 131.000000 
+126.000000 87.000000 63.000000 65.000000 46.000000 25.000000 
+24.000000 36.000000 43.000000 42.000000 77.000000 137.000000 
+180.000000 187.000000 175.000000 164.000000 154.000000 121.000000 
+68.000000 32.000000 10.000000 21.000000 33.000000 34.000000 
+38.000000 60.000000 93.000000 106.000000 92.000000 82.000000 
+90.000000 105.000000 114.000000 118.000000 117.000000 114.000000 
+114.000000 118.000000 123.000000 125.000000 121.000000 115.000000 
+115.000000 121.000000 128.000000 130.000000 127.000000 124.000000 
+126.000000 128.000000 125.000000 117.000000 113.000000 117.000000 
+125.000000 130.000000 115.000000 128.000000 123.000000 116.000000 
+117.000000 122.000000 122.000000 121.000000 124.000000 127.000000 
+123.000000 114.000000 112.000000 121.000000 125.000000 113.000000 
+92.000000 88.000000 108.000000 131.000000 122.000000 74.000000 
+40.000000 56.000000 61.000000 62.000000 61.000000 53.000000 
+50.000000 53.000000 54.000000 67.000000 91.000000 109.000000 
+116.000000 110.000000 91.000000 64.000000 34.000000 22.000000 
+38.000000 53.000000 57.000000 53.000000 55.000000 67.000000 
+83.000000 90.000000 86.000000 85.000000 97.000000 113.000000 
+121.000000 122.000000 121.000000 119.000000 118.000000 119.000000 
+122.000000 123.000000 120.000000 117.000000 115.000000 117.000000 
+118.000000 120.000000 121.000000 126.000000 131.000000 133.000000 
+127.000000 118.000000 114.000000 117.000000 121.000000 121.000000 
+102.000000 117.000000 133.000000 134.000000 126.000000 124.000000 
+127.000000 127.000000 122.000000 119.000000 121.000000 123.000000 
+124.000000 125.000000 122.000000 110.000000 94.000000 95.000000 
+118.000000 141.000000 128.000000 79.000000 39.000000 42.000000 
+64.000000 89.000000 91.000000 76.000000 64.000000 65.000000 
+70.000000 67.000000 59.000000 56.000000 58.000000 62.000000 
+62.000000 59.000000 59.000000 64.000000 70.000000 75.000000 
+76.000000 73.000000 67.000000 63.000000 66.000000 76.000000 
+81.000000 85.000000 99.000000 119.000000 130.000000 129.000000 
+124.000000 122.000000 120.000000 118.000000 116.000000 116.000000 
+117.000000 117.000000 114.000000 113.000000 114.000000 119.000000 
+126.000000 130.000000 127.000000 120.000000 115.000000 115.000000 
+119.000000 124.000000 128.000000 132.000000 107.000000 118.000000 
+135.000000 134.000000 120.000000 117.000000 129.000000 138.000000 
+132.000000 119.000000 115.000000 117.000000 119.000000 121.000000 
+120.000000 114.000000 106.000000 106.000000 120.000000 132.000000 
+126.000000 102.000000 74.000000 58.000000 66.000000 76.000000 
+74.000000 64.000000 55.000000 53.000000 54.000000 54.000000 
+53.000000 52.000000 52.000000 51.000000 49.000000 47.000000 
+50.000000 61.000000 70.000000 70.000000 67.000000 72.000000 
+82.000000 73.000000 61.000000 63.000000 70.000000 81.000000 
+101.000000 118.000000 125.000000 125.000000 125.000000 125.000000 
+121.000000 114.000000 107.000000 109.000000 116.000000 120.000000 
+118.000000 115.000000 116.000000 122.000000 127.000000 127.000000 
+122.000000 117.000000 116.000000 121.000000 124.000000 125.000000 
+126.000000 127.000000 119.000000 124.000000 125.000000 122.000000 
+119.000000 119.000000 120.000000 122.000000 125.000000 125.000000 
+121.000000 118.000000 120.000000 124.000000 121.000000 110.000000 
+100.000000 97.000000 101.000000 108.000000 113.000000 114.000000 
+110.000000 100.000000 86.000000 73.000000 60.000000 47.000000 
+37.000000 34.000000 40.000000 48.000000 51.000000 47.000000 
+39.000000 31.000000 27.000000 21.000000 19.000000 36.000000 
+73.000000 104.000000 96.000000 61.000000 44.000000 37.000000 
+56.000000 79.000000 82.000000 83.000000 101.000000 122.000000 
+129.000000 126.000000 122.000000 121.000000 118.000000 114.000000 
+111.000000 111.000000 113.000000 115.000000 117.000000 119.000000 
+121.000000 125.000000 127.000000 125.000000 119.000000 114.000000 
+114.000000 119.000000 127.000000 132.000000 134.000000 132.000000 
+124.000000 124.000000 121.000000 119.000000 119.000000 116.000000 
+114.000000 118.000000 125.000000 126.000000 118.000000 115.000000 
+123.000000 132.000000 128.000000 114.000000 108.000000 112.000000 
+115.000000 107.000000 96.000000 94.000000 96.000000 91.000000 
+75.000000 59.000000 49.000000 44.000000 36.000000 40.000000 
+76.000000 126.000000 145.000000 112.000000 60.000000 33.000000 
+34.000000 45.000000 46.000000 43.000000 55.000000 78.000000 
+93.000000 85.000000 63.000000 53.000000 64.000000 78.000000 
+86.000000 90.000000 105.000000 127.000000 138.000000 131.000000 
+121.000000 119.000000 117.000000 112.000000 108.000000 111.000000 
+116.000000 116.000000 113.000000 114.000000 120.000000 123.000000 
+119.000000 114.000000 114.000000 118.000000 122.000000 124.000000 
+125.000000 125.000000 127.000000 127.000000 129.000000 127.000000 
+123.000000 121.000000 118.000000 116.000000 116.000000 118.000000 
+121.000000 125.000000 129.000000 134.000000 138.000000 137.000000 
+126.000000 113.000000 109.000000 117.000000 124.000000 117.000000 
+101.000000 89.000000 82.000000 72.000000 58.000000 50.000000 
+48.000000 40.000000 31.000000 43.000000 159.000000 315.000000 
+381.000000 305.000000 170.000000 89.000000 70.000000 81.000000 
+89.000000 85.000000 77.000000 81.000000 94.000000 110.000000 
+129.000000 136.000000 122.000000 106.000000 107.000000 117.000000 
+126.000000 131.000000 132.000000 126.000000 118.000000 116.000000 
+121.000000 121.000000 116.000000 115.000000 122.000000 129.000000 
+127.000000 122.000000 119.000000 115.000000 108.000000 107.000000 
+115.000000 126.000000 128.000000 123.000000 118.000000 119.000000 
+121.000000 123.000000 133.000000 134.000000 132.000000 126.000000 
+115.000000 107.000000 107.000000 114.000000 121.000000 127.000000 
+132.000000 136.000000 136.000000 128.000000 114.000000 104.000000 
+105.000000 113.000000 121.000000 120.000000 109.000000 91.000000 
+72.000000 60.000000 56.000000 57.000000 51.000000 37.000000 
+40.000000 59.000000 216.000000 407.000000 492.000000 418.000000 
+268.000000 172.000000 150.000000 162.000000 175.000000 166.000000 
+146.000000 125.000000 103.000000 93.000000 99.000000 113.000000 
+119.000000 113.000000 106.000000 113.000000 125.000000 128.000000 
+124.000000 120.000000 117.000000 116.000000 118.000000 124.000000 
+127.000000 126.000000 127.000000 130.000000 130.000000 124.000000 
+115.000000 108.000000 105.000000 107.000000 116.000000 125.000000 
+127.000000 120.000000 116.000000 121.000000 128.000000 128.000000 
+132.000000 136.000000 135.000000 128.000000 116.000000 104.000000 
+102.000000 112.000000 127.000000 134.000000 130.000000 127.000000 
+129.000000 129.000000 120.000000 108.000000 103.000000 106.000000 
+109.000000 111.000000 111.000000 102.000000 82.000000 65.000000 
+64.000000 70.000000 67.000000 51.000000 51.000000 82.000000 
+193.000000 296.000000 308.000000 232.000000 139.000000 95.000000 
+105.000000 163.000000 223.000000 246.000000 223.000000 166.000000 
+116.000000 100.000000 99.000000 105.000000 114.000000 109.000000 
+93.000000 87.000000 104.000000 124.000000 128.000000 118.000000 
+112.000000 113.000000 116.000000 119.000000 125.000000 129.000000 
+127.000000 125.000000 127.000000 132.000000 127.000000 114.000000 
+104.000000 107.000000 121.000000 133.000000 136.000000 129.000000 
+120.000000 117.000000 121.000000 124.000000 130.000000 135.000000 
+134.000000 124.000000 111.000000 105.000000 110.000000 120.000000 
+127.000000 127.000000 123.000000 121.000000 124.000000 127.000000 
+120.000000 103.000000 89.000000 94.000000 113.000000 129.000000 
+127.000000 109.000000 91.000000 85.000000 83.000000 78.000000 
+73.000000 63.000000 64.000000 62.000000 115.000000 199.000000 
+242.000000 212.000000 135.000000 63.000000 22.000000 39.000000 
+71.000000 111.000000 154.000000 171.000000 149.000000 120.000000 
+111.000000 112.000000 105.000000 90.000000 81.000000 88.000000 
+103.000000 116.000000 120.000000 121.000000 121.000000 119.000000 
+117.000000 117.000000 121.000000 123.000000 125.000000 127.000000 
+132.000000 134.000000 125.000000 110.000000 102.000000 111.000000 
+128.000000 137.000000 133.000000 126.000000 127.000000 132.000000 
+129.000000 118.000000 129.000000 130.000000 126.000000 119.000000 
+116.000000 120.000000 125.000000 126.000000 125.000000 123.000000 
+123.000000 123.000000 124.000000 123.000000 113.000000 92.000000 
+78.000000 99.000000 153.000000 198.000000 196.000000 158.000000 
+130.000000 129.000000 136.000000 133.000000 123.000000 118.000000 
+119.000000 115.000000 96.000000 73.000000 65.000000 67.000000 
+69.000000 73.000000 82.000000 85.000000 82.000000 75.000000 
+68.000000 64.000000 62.000000 59.000000 59.000000 67.000000 
+73.000000 75.000000 80.000000 93.000000 112.000000 127.000000 
+131.000000 130.000000 130.000000 132.000000 131.000000 127.000000 
+123.000000 120.000000 118.000000 118.000000 125.000000 133.000000 
+131.000000 116.000000 100.000000 99.000000 113.000000 130.000000 
+139.000000 140.000000 135.000000 129.000000 121.000000 114.000000 
+124.000000 120.000000 118.000000 121.000000 127.000000 130.000000 
+129.000000 126.000000 124.000000 123.000000 122.000000 123.000000 
+128.000000 127.000000 111.000000 88.000000 83.000000 116.000000 
+168.000000 197.000000 183.000000 152.000000 134.000000 128.000000 
+124.000000 124.000000 123.000000 122.000000 120.000000 120.000000 
+118.000000 109.000000 92.000000 80.000000 87.000000 108.000000 
+125.000000 131.000000 128.000000 124.000000 124.000000 128.000000 
+131.000000 126.000000 109.000000 90.000000 79.000000 78.000000 
+83.000000 94.000000 109.000000 121.000000 124.000000 119.000000 
+117.000000 126.000000 135.000000 132.000000 121.000000 114.000000 
+117.000000 123.000000 129.000000 134.000000 135.000000 125.000000 
+110.000000 104.000000 116.000000 133.000000 139.000000 134.000000 
+128.000000 125.000000 120.000000 111.000000 117.000000 119.000000 
+126.000000 130.000000 128.000000 124.000000 126.000000 133.000000 
+138.000000 132.000000 119.000000 115.000000 124.000000 128.000000 
+109.000000 81.000000 77.000000 113.000000 160.000000 178.000000 
+161.000000 136.000000 124.000000 122.000000 119.000000 114.000000 
+113.000000 116.000000 120.000000 125.000000 127.000000 125.000000 
+119.000000 116.000000 119.000000 127.000000 132.000000 135.000000 
+137.000000 138.000000 136.000000 132.000000 132.000000 134.000000 
+124.000000 99.000000 74.000000 70.000000 86.000000 110.000000 
+126.000000 131.000000 129.000000 126.000000 126.000000 133.000000 
+141.000000 141.000000 133.000000 125.000000 124.000000 127.000000 
+127.000000 123.000000 121.000000 122.000000 123.000000 120.000000 
+120.000000 126.000000 134.000000 134.000000 126.000000 119.000000 
+116.000000 115.000000 125.000000 119.000000 116.000000 119.000000 
+124.000000 125.000000 124.000000 124.000000 125.000000 123.000000 
+120.000000 121.000000 126.000000 122.000000 103.000000 81.000000 
+85.000000 115.000000 145.000000 148.000000 127.000000 112.000000 
+116.000000 123.000000 119.000000 110.000000 109.000000 120.000000 
+129.000000 127.000000 119.000000 116.000000 118.000000 124.000000 
+128.000000 129.000000 127.000000 125.000000 126.000000 129.000000 
+129.000000 128.000000 130.000000 137.000000 136.000000 119.000000 
+94.000000 81.000000 86.000000 97.000000 109.000000 118.000000 
+127.000000 131.000000 128.000000 126.000000 130.000000 134.000000 
+133.000000 129.000000 129.000000 133.000000 135.000000 131.000000 
+129.000000 131.000000 135.000000 135.000000 132.000000 130.000000 
+130.000000 128.000000 123.000000 119.000000 119.000000 121.000000 
+126.000000 125.000000 122.000000 120.000000 124.000000 130.000000 
+129.000000 124.000000 121.000000 124.000000 130.000000 134.000000 
+130.000000 117.000000 99.000000 89.000000 95.000000 111.000000 
+122.000000 122.000000 119.000000 123.000000 128.000000 125.000000 
+116.000000 113.000000 120.000000 128.000000 130.000000 127.000000 
+124.000000 125.000000 126.000000 125.000000 122.000000 120.000000 
+119.000000 118.000000 117.000000 119.000000 121.000000 121.000000 
+123.000000 131.000000 139.000000 135.000000 115.000000 93.000000 
+88.000000 98.000000 116.000000 129.000000 132.000000 132.000000 
+130.000000 126.000000 125.000000 131.000000 138.000000 139.000000 
+134.000000 130.000000 130.000000 133.000000 131.000000 127.000000 
+126.000000 130.000000 135.000000 136.000000 132.000000 127.000000 
+123.000000 120.000000 118.000000 118.000000 120.000000 121.000000 
+121.000000 121.000000 122.000000 125.000000 126.000000 123.000000 
+117.000000 115.000000 120.000000 126.000000 126.000000 115.000000 
+101.000000 97.000000 106.000000 119.000000 124.000000 121.000000 
+120.000000 123.000000 125.000000 123.000000 122.000000 126.000000 
+132.000000 132.000000 126.000000 119.000000 116.000000 115.000000 
+115.000000 115.000000 114.000000 112.000000 114.000000 120.000000 
+126.000000 127.000000 124.000000 119.000000 119.000000 123.000000 
+133.000000 138.000000 130.000000 108.000000 89.000000 92.000000 
+116.000000 139.000000 145.000000 137.000000 128.000000 126.000000 
+127.000000 127.000000 127.000000 130.000000 135.000000 139.000000 
+138.000000 132.000000 125.000000 122.000000 125.000000 131.000000 
+135.000000 135.000000 130.000000 124.000000 118.000000 117.000000 
+119.000000 120.000000 119.000000 112.000000 110.000000 116.000000 
+124.000000 129.000000 129.000000 125.000000 121.000000 121.000000 
+127.000000 130.000000 121.000000 104.000000 94.000000 100.000000 
+116.000000 127.000000 128.000000 123.000000 120.000000 121.000000 
+124.000000 127.000000 130.000000 130.000000 128.000000 127.000000 
+130.000000 132.000000 129.000000 121.000000 117.000000 118.000000 
+119.000000 118.000000 119.000000 123.000000 128.000000 130.000000 
+131.000000 132.000000 133.000000 133.000000 134.000000 136.000000 
+132.000000 118.000000 101.000000 96.000000 105.000000 121.000000 
+132.000000 134.000000 130.000000 125.000000 123.000000 124.000000 
+129.000000 131.000000 130.000000 130.000000 133.000000 135.000000 
+133.000000 131.000000 131.000000 134.000000 136.000000 134.000000 
+131.000000 127.000000 122.000000 119.000000 118.000000 119.000000 
+123.000000 118.000000 116.000000 121.000000 127.000000 128.000000 
+124.000000 122.000000 125.000000 128.000000 128.000000 121.000000 
+109.000000 98.000000 96.000000 104.000000 117.000000 126.000000 
+127.000000 122.000000 118.000000 119.000000 122.000000 124.000000 
+122.000000 120.000000 119.000000 121.000000 124.000000 125.000000 
+124.000000 123.000000 123.000000 124.000000 122.000000 120.000000 
+117.000000 118.000000 124.000000 130.000000 133.000000 132.000000 
+128.000000 127.000000 131.000000 138.000000 139.000000 130.000000 
+115.000000 104.000000 107.000000 122.000000 134.000000 137.000000 
+133.000000 128.000000 126.000000 127.000000 129.000000 130.000000 
+130.000000 129.000000 129.000000 130.000000 129.000000 127.000000 
+128.000000 135.000000 141.000000 137.000000 125.000000 116.000000 
+117.000000 121.000000 120.000000 117.000000 128.000000 128.000000 
+130.000000 131.000000 129.000000 126.000000 123.000000 121.000000 
+121.000000 126.000000 132.000000 128.000000 110.000000 89.000000 
+84.000000 99.000000 121.000000 133.000000 130.000000 124.000000 
+124.000000 128.000000 131.000000 129.000000 126.000000 124.000000 
+122.000000 119.000000 119.000000 121.000000 122.000000 121.000000 
+119.000000 118.000000 119.000000 121.000000 121.000000 120.000000 
+121.000000 124.000000 129.000000 132.000000 130.000000 127.000000 
+128.000000 132.000000 135.000000 127.000000 113.000000 102.000000 
+106.000000 120.000000 132.000000 133.000000 130.000000 131.000000 
+136.000000 138.000000 132.000000 125.000000 122.000000 126.000000 
+130.000000 129.000000 126.000000 125.000000 129.000000 135.000000 
+137.000000 132.000000 125.000000 122.000000 122.000000 120.000000 
+115.000000 112.000000 127.000000 126.000000 128.000000 129.000000 
+128.000000 127.000000 126.000000 124.000000 121.000000 124.000000 
+133.000000 134.000000 120.000000 99.000000 91.000000 105.000000 
+125.000000 131.000000 123.000000 117.000000 122.000000 132.000000 
+135.000000 129.000000 123.000000 121.000000 122.000000 123.000000 
+123.000000 121.000000 119.000000 119.000000 120.000000 122.000000 
+122.000000 120.000000 119.000000 121.000000 123.000000 124.000000 
+127.000000 130.000000 131.000000 129.000000 126.000000 128.000000 
+130.000000 128.000000 118.000000 107.000000 105.000000 113.000000 
+122.000000 127.000000 129.000000 134.000000 140.000000 137.000000 
+126.000000 118.000000 120.000000 131.000000 136.000000 132.000000 
+126.000000 126.000000 132.000000 137.000000 138.000000 133.000000 
+126.000000 123.000000 124.000000 126.000000 124.000000 122.000000 
+117.000000 125.000000 131.000000 130.000000 126.000000 126.000000 
+128.000000 129.000000 131.000000 138.000000 145.000000 142.000000 
+123.000000 102.000000 97.000000 111.000000 127.000000 128.000000 
+119.000000 113.000000 117.000000 123.000000 126.000000 125.000000 
+125.000000 124.000000 123.000000 124.000000 129.000000 132.000000 
+130.000000 123.000000 120.000000 123.000000 129.000000 130.000000 
+127.000000 123.000000 122.000000 125.000000 130.000000 133.000000 
+133.000000 130.000000 128.000000 129.000000 132.000000 129.000000 
+119.000000 110.000000 108.000000 114.000000 121.000000 125.000000 
+128.000000 133.000000 138.000000 136.000000 131.000000 128.000000 
+131.000000 134.000000 132.000000 126.000000 124.000000 129.000000 
+137.000000 141.000000 138.000000 130.000000 123.000000 120.000000 
+119.000000 117.000000 114.000000 116.000000 128.000000 130.000000 
+133.000000 136.000000 136.000000 133.000000 127.000000 123.000000 
+124.000000 131.000000 139.000000 138.000000 127.000000 114.000000 
+110.000000 119.000000 127.000000 126.000000 120.000000 117.000000 
+120.000000 123.000000 124.000000 125.000000 129.000000 130.000000 
+126.000000 120.000000 120.000000 123.000000 124.000000 120.000000 
+120.000000 125.000000 131.000000 131.000000 128.000000 125.000000 
+125.000000 126.000000 126.000000 126.000000 128.000000 130.000000 
+135.000000 141.000000 143.000000 135.000000 120.000000 110.000000 
+112.000000 119.000000 123.000000 122.000000 123.000000 131.000000 
+140.000000 141.000000 133.000000 127.000000 128.000000 132.000000 
+132.000000 128.000000 127.000000 133.000000 142.000000 145.000000 
+141.000000 132.000000 125.000000 122.000000 122.000000 122.000000 
+120.000000 121.000000 128.000000 131.000000 134.000000 135.000000 
+132.000000 128.000000 124.000000 121.000000 120.000000 124.000000 
+131.000000 134.000000 126.000000 113.000000 110.000000 119.000000 
+129.000000 130.000000 123.000000 117.000000 116.000000 120.000000 
+124.000000 126.000000 126.000000 124.000000 122.000000 121.000000 
+121.000000 120.000000 119.000000 120.000000 122.000000 124.000000 
+125.000000 124.000000 124.000000 126.000000 129.000000 128.000000 
+125.000000 124.000000 124.000000 126.000000 130.000000 135.000000 
+138.000000 135.000000 124.000000 115.000000 112.000000 114.000000 
+119.000000 122.000000 125.000000 127.000000 129.000000 132.000000 
+133.000000 133.000000 133.000000 131.000000 132.000000 136.000000 
+141.000000 144.000000 142.000000 137.000000 132.000000 130.000000 
+129.000000 127.000000 122.000000 116.000000 111.000000 110.000000 
+135.000000 134.000000 132.000000 129.000000 126.000000 125.000000 
+124.000000 119.000000 113.000000 114.000000 122.000000 130.000000 
+125.000000 113.000000 109.000000 118.000000 128.000000 127.000000 
+117.000000 112.000000 117.000000 125.000000 127.000000 126.000000 
+126.000000 126.000000 126.000000 125.000000 124.000000 120.000000 
+116.000000 115.000000 121.000000 129.000000 131.000000 125.000000 
+118.000000 116.000000 120.000000 123.000000 125.000000 128.000000 
+134.000000 136.000000 135.000000 134.000000 136.000000 136.000000 
+127.000000 114.000000 110.000000 115.000000 124.000000 129.000000 
+129.000000 129.000000 130.000000 131.000000 132.000000 132.000000 
+132.000000 134.000000 136.000000 139.000000 140.000000 138.000000 
+136.000000 136.000000 136.000000 132.000000 124.000000 117.000000 
+114.000000 116.000000 120.000000 123.000000 113.000000 124.000000 
+148.000000 162.000000 155.000000 138.000000 142.000000 154.000000 
+143.000000 114.000000 84.000000 54.000000 35.000000 49.000000 
+45.000000 30.000000 29.000000 25.000000 45.000000 104.000000 
+137.000000 120.000000 82.000000 56.000000 30.000000 4.000000 
+0.000000 6.000000 8.000000 13.000000 10.000000 9.000000 
+11.000000 11.000000 11.000000 9.000000 8.000000 6.000000 
+8.000000 10.000000 9.000000 5.000000 4.000000 6.000000 
+12.000000 18.000000 22.000000 27.000000 35.000000 53.000000 
+68.000000 68.000000 60.000000 52.000000 42.000000 20.000000 
+31.000000 66.000000 89.000000 105.000000 114.000000 106.000000 
+92.000000 89.000000 100.000000 115.000000 113.000000 93.000000 
+80.000000 86.000000 100.000000 112.000000 121.000000 128.000000 
+129.000000 127.000000 108.000000 105.000000 122.000000 148.000000 
+154.000000 129.000000 107.000000 113.000000 125.000000 116.000000 
+90.000000 61.000000 42.000000 45.000000 46.000000 38.000000 
+42.000000 39.000000 34.000000 92.000000 137.000000 130.000000 
+104.000000 82.000000 55.000000 38.000000 30.000000 14.000000 
+11.000000 26.000000 25.000000 17.000000 12.000000 13.000000 
+11.000000 10.000000 9.000000 12.000000 11.000000 9.000000 
+11.000000 7.000000 3.000000 5.000000 12.000000 17.000000 
+29.000000 39.000000 39.000000 72.000000 106.000000 97.000000 
+75.000000 62.000000 46.000000 27.000000 33.000000 67.000000 
+95.000000 114.000000 128.000000 122.000000 99.000000 94.000000 
+112.000000 123.000000 110.000000 94.000000 88.000000 96.000000 
+106.000000 110.000000 116.000000 125.000000 131.000000 130.000000 
+110.000000 101.000000 90.000000 87.000000 92.000000 97.000000 
+102.000000 109.000000 115.000000 107.000000 89.000000 67.000000 
+42.000000 37.000000 60.000000 51.000000 30.000000 26.000000 
+32.000000 67.000000 93.000000 118.000000 129.000000 116.000000 
+94.000000 81.000000 66.000000 33.000000 9.000000 18.000000 
+26.000000 21.000000 15.000000 15.000000 15.000000 17.000000 
+13.000000 12.000000 11.000000 11.000000 13.000000 12.000000 
+12.000000 6.000000 12.000000 27.000000 40.000000 34.000000 
+31.000000 74.000000 111.000000 81.000000 48.000000 58.000000 
+63.000000 54.000000 38.000000 52.000000 91.000000 120.000000 
+123.000000 100.000000 88.000000 102.000000 117.000000 115.000000 
+106.000000 103.000000 101.000000 106.000000 116.000000 122.000000 
+126.000000 127.000000 127.000000 126.000000 117.000000 104.000000 
+86.000000 73.000000 78.000000 98.000000 112.000000 112.000000 
+107.000000 99.000000 88.000000 72.000000 42.000000 34.000000 
+84.000000 71.000000 24.000000 15.000000 17.000000 44.000000 
+54.000000 83.000000 116.000000 123.000000 109.000000 80.000000 
+70.000000 65.000000 42.000000 27.000000 24.000000 20.000000 
+13.000000 12.000000 11.000000 14.000000 16.000000 14.000000 
+12.000000 10.000000 8.000000 14.000000 26.000000 25.000000 
+16.000000 21.000000 29.000000 21.000000 22.000000 39.000000 
+43.000000 28.000000 31.000000 54.000000 60.000000 50.000000 
+35.000000 51.000000 99.000000 124.000000 101.000000 81.000000 
+89.000000 94.000000 91.000000 91.000000 102.000000 112.000000 
+103.000000 98.000000 115.000000 134.000000 136.000000 122.000000 
+112.000000 113.000000 127.000000 121.000000 105.000000 87.000000 
+79.000000 85.000000 92.000000 96.000000 99.000000 95.000000 
+84.000000 67.000000 43.000000 40.000000 87.000000 92.000000 
+58.000000 44.000000 26.000000 18.000000 36.000000 59.000000 
+85.000000 95.000000 91.000000 70.000000 59.000000 69.000000 
+62.000000 40.000000 18.000000 17.000000 28.000000 28.000000 
+17.000000 13.000000 16.000000 17.000000 11.000000 8.000000 
+9.000000 12.000000 16.000000 21.000000 11.000000 3.000000 
+7.000000 14.000000 21.000000 25.000000 24.000000 29.000000 
+45.000000 57.000000 56.000000 34.000000 28.000000 62.000000 
+82.000000 62.000000 58.000000 89.000000 105.000000 81.000000 
+57.000000 70.000000 107.000000 129.000000 120.000000 107.000000 
+116.000000 132.000000 131.000000 117.000000 111.000000 118.000000 
+119.000000 131.000000 131.000000 114.000000 91.000000 78.000000 
+81.000000 95.000000 104.000000 94.000000 69.000000 51.000000 
+35.000000 31.000000 69.000000 81.000000 63.000000 44.000000 
+29.000000 7.000000 12.000000 25.000000 41.000000 55.000000 
+69.000000 67.000000 46.000000 40.000000 45.000000 35.000000 
+18.000000 19.000000 19.000000 30.000000 34.000000 21.000000 
+12.000000 16.000000 22.000000 28.000000 26.000000 14.000000 
+12.000000 17.000000 23.000000 31.000000 45.000000 56.000000 
+56.000000 53.000000 58.000000 62.000000 57.000000 47.000000 
+41.000000 22.000000 21.000000 36.000000 36.000000 45.000000 
+78.000000 99.000000 85.000000 56.000000 41.000000 65.000000 
+113.000000 145.000000 145.000000 124.000000 109.000000 115.000000 
+127.000000 127.000000 121.000000 122.000000 117.000000 123.000000 
+127.000000 126.000000 115.000000 96.000000 83.000000 85.000000 
+92.000000 81.000000 51.000000 30.000000 29.000000 39.000000 
+61.000000 62.000000 48.000000 37.000000 39.000000 48.000000 
+57.000000 75.000000 99.000000 106.000000 89.000000 54.000000 
+28.000000 26.000000 30.000000 22.000000 36.000000 47.000000 
+31.000000 25.000000 28.000000 30.000000 29.000000 28.000000 
+38.000000 49.000000 39.000000 12.000000 13.000000 17.000000 
+24.000000 46.000000 77.000000 99.000000 99.000000 89.000000 
+85.000000 81.000000 64.000000 39.000000 24.000000 14.000000 
+13.000000 20.000000 40.000000 82.000000 111.000000 101.000000 
+76.000000 61.000000 59.000000 70.000000 101.000000 137.000000 
+156.000000 148.000000 125.000000 115.000000 126.000000 134.000000 
+126.000000 120.000000 125.000000 116.000000 111.000000 118.000000 
+124.000000 115.000000 97.000000 84.000000 77.000000 71.000000 
+56.000000 31.000000 26.000000 48.000000 56.000000 59.000000 
+46.000000 33.000000 44.000000 77.000000 100.000000 114.000000 
+134.000000 127.000000 81.000000 46.000000 34.000000 33.000000 
+32.000000 22.000000 36.000000 46.000000 44.000000 39.000000 
+43.000000 56.000000 61.000000 53.000000 52.000000 51.000000 
+30.000000 8.000000 13.000000 30.000000 68.000000 110.000000 
+131.000000 124.000000 113.000000 115.000000 109.000000 87.000000 
+68.000000 46.000000 23.000000 14.000000 14.000000 26.000000 
+57.000000 91.000000 106.000000 96.000000 80.000000 76.000000 
+84.000000 90.000000 96.000000 113.000000 135.000000 145.000000 
+133.000000 116.000000 118.000000 131.000000 133.000000 124.000000 
+123.000000 117.000000 110.000000 111.000000 121.000000 130.000000 
+122.000000 94.000000 67.000000 65.000000 75.000000 59.000000 
+33.000000 40.000000 59.000000 66.000000 55.000000 42.000000 
+52.000000 76.000000 82.000000 79.000000 105.000000 112.000000 
+80.000000 58.000000 55.000000 44.000000 37.000000 27.000000 
+24.000000 31.000000 34.000000 40.000000 51.000000 56.000000 
+42.000000 46.000000 61.000000 60.000000 38.000000 22.000000 
+23.000000 42.000000 90.000000 150.000000 185.000000 172.000000 
+139.000000 131.000000 124.000000 86.000000 42.000000 31.000000 
+26.000000 22.000000 26.000000 39.000000 63.000000 83.000000 
+83.000000 72.000000 69.000000 82.000000 99.000000 106.000000 
+103.000000 106.000000 118.000000 124.000000 117.000000 113.000000 
+120.000000 132.000000 134.000000 125.000000 131.000000 130.000000 
+119.000000 111.000000 123.000000 141.000000 138.000000 111.000000 
+87.000000 89.000000 107.000000 104.000000 67.000000 36.000000 
+42.000000 56.000000 50.000000 54.000000 68.000000 75.000000 
+74.000000 85.000000 120.000000 141.000000 126.000000 85.000000 
+62.000000 46.000000 26.000000 24.000000 22.000000 31.000000 
+37.000000 38.000000 39.000000 31.000000 14.000000 31.000000 
+56.000000 59.000000 49.000000 44.000000 39.000000 36.000000 
+70.000000 150.000000 238.000000 271.000000 232.000000 188.000000 
+154.000000 89.000000 22.000000 20.000000 38.000000 42.000000 
+43.000000 51.000000 66.000000 70.000000 58.000000 48.000000 
+61.000000 92.000000 112.000000 114.000000 115.000000 123.000000 
+128.000000 121.000000 113.000000 117.000000 126.000000 129.000000 
+125.000000 123.000000 132.000000 131.000000 126.000000 122.000000 
+127.000000 135.000000 132.000000 116.000000 97.000000 93.000000 
+107.000000 127.000000 117.000000 67.000000 26.000000 28.000000 
+42.000000 49.000000 67.000000 96.000000 122.000000 144.000000 
+162.000000 169.000000 161.000000 121.000000 65.000000 38.000000 
+20.000000 13.000000 28.000000 29.000000 32.000000 39.000000 
+41.000000 35.000000 28.000000 37.000000 48.000000 47.000000 
+49.000000 56.000000 42.000000 50.000000 115.000000 218.000000 
+313.000000 329.000000 253.000000 162.000000 97.000000 49.000000 
+29.000000 37.000000 52.000000 55.000000 49.000000 51.000000 
+61.000000 64.000000 65.000000 67.000000 78.000000 101.000000 
+116.000000 114.000000 112.000000 118.000000 122.000000 117.000000 
+109.000000 109.000000 115.000000 124.000000 130.000000 130.000000 
+121.000000 123.000000 128.000000 130.000000 127.000000 127.000000 
+130.000000 121.000000 92.000000 71.000000 83.000000 116.000000 
+130.000000 101.000000 50.000000 17.000000 30.000000 30.000000 
+58.000000 123.000000 174.000000 200.000000 204.000000 187.000000 
+172.000000 150.000000 98.000000 73.000000 56.000000 17.000000 
+2.000000 12.000000 29.000000 46.000000 56.000000 54.000000 
+46.000000 39.000000 33.000000 40.000000 65.000000 72.000000 
+53.000000 102.000000 192.000000 282.000000 330.000000 286.000000 
+165.000000 58.000000 28.000000 34.000000 44.000000 51.000000 
+59.000000 59.000000 54.000000 57.000000 60.000000 60.000000 
+71.000000 86.000000 92.000000 98.000000 106.000000 114.000000 
+116.000000 112.000000 109.000000 110.000000 108.000000 105.000000 
+109.000000 125.000000 139.000000 135.000000 129.000000 128.000000 
+132.000000 131.000000 125.000000 126.000000 136.000000 135.000000 
+111.000000 85.000000 83.000000 101.000000 112.000000 107.000000 
+80.000000 31.000000 12.000000 18.000000 64.000000 153.000000 
+215.000000 247.000000 245.000000 206.000000 160.000000 147.000000 
+140.000000 145.000000 144.000000 112.000000 68.000000 56.000000 
+54.000000 54.000000 59.000000 70.000000 79.000000 75.000000 
+62.000000 64.000000 86.000000 87.000000 75.000000 157.000000 
+256.000000 307.000000 299.000000 221.000000 98.000000 30.000000 
+50.000000 68.000000 55.000000 47.000000 53.000000 55.000000 
+56.000000 62.000000 67.000000 71.000000 79.000000 91.000000 
+101.000000 106.000000 115.000000 127.000000 130.000000 118.000000 
+105.000000 103.000000 108.000000 114.000000 121.000000 129.000000 
+132.000000 126.000000 140.000000 135.000000 133.000000 130.000000 
+125.000000 122.000000 123.000000 127.000000 127.000000 122.000000 
+109.000000 96.000000 86.000000 82.000000 76.000000 42.000000 
+7.000000 21.000000 73.000000 187.000000 283.000000 315.000000 
+289.000000 241.000000 189.000000 144.000000 125.000000 140.000000 
+170.000000 175.000000 160.000000 141.000000 128.000000 119.000000 
+112.000000 114.000000 121.000000 122.000000 116.000000 112.000000 
+116.000000 110.000000 109.000000 204.000000 300.000000 309.000000 
+259.000000 184.000000 88.000000 58.000000 73.000000 64.000000 
+47.000000 49.000000 56.000000 52.000000 49.000000 56.000000 
+66.000000 75.000000 87.000000 102.000000 119.000000 130.000000 
+132.000000 129.000000 122.000000 114.000000 106.000000 104.000000 
+108.000000 116.000000 123.000000 126.000000 123.000000 119.000000 
+136.000000 137.000000 134.000000 125.000000 117.000000 116.000000 
+120.000000 125.000000 134.000000 143.000000 137.000000 112.000000 
+84.000000 72.000000 72.000000 60.000000 33.000000 37.000000 
+81.000000 197.000000 326.000000 374.000000 321.000000 249.000000 
+204.000000 149.000000 116.000000 121.000000 141.000000 149.000000 
+149.000000 159.000000 173.000000 179.000000 170.000000 155.000000 
+145.000000 137.000000 130.000000 128.000000 135.000000 133.000000 
+145.000000 252.000000 340.000000 306.000000 226.000000 178.000000 
+114.000000 74.000000 67.000000 60.000000 64.000000 75.000000 
+70.000000 55.000000 45.000000 44.000000 53.000000 68.000000 
+87.000000 108.000000 127.000000 135.000000 134.000000 126.000000 
+116.000000 108.000000 106.000000 109.000000 114.000000 116.000000 
+117.000000 118.000000 118.000000 116.000000 130.000000 134.000000 
+132.000000 119.000000 107.000000 109.000000 123.000000 134.000000 
+138.000000 140.000000 139.000000 130.000000 116.000000 104.000000 
+95.000000 84.000000 67.000000 63.000000 102.000000 187.000000 
+299.000000 360.000000 317.000000 222.000000 170.000000 153.000000 
+146.000000 136.000000 130.000000 136.000000 146.000000 158.000000 
+161.000000 156.000000 149.000000 147.000000 149.000000 146.000000 
+138.000000 136.000000 141.000000 136.000000 152.000000 271.000000 
+365.000000 314.000000 211.000000 180.000000 144.000000 93.000000 
+76.000000 90.000000 104.000000 96.000000 72.000000 50.000000 
+38.000000 38.000000 48.000000 65.000000 86.000000 109.000000 
+124.000000 129.000000 129.000000 128.000000 123.000000 114.000000 
+108.000000 111.000000 119.000000 125.000000 125.000000 121.000000 
+116.000000 112.000000 129.000000 132.000000 134.000000 130.000000 
+123.000000 117.000000 118.000000 123.000000 128.000000 131.000000 
+130.000000 127.000000 124.000000 123.000000 118.000000 107.000000 
+84.000000 63.000000 84.000000 145.000000 227.000000 286.000000 
+263.000000 178.000000 127.000000 135.000000 140.000000 127.000000 
+116.000000 130.000000 154.000000 164.000000 156.000000 142.000000 
+132.000000 131.000000 134.000000 136.000000 134.000000 132.000000 
+131.000000 118.000000 124.000000 229.000000 322.000000 293.000000 
+199.000000 159.000000 136.000000 111.000000 106.000000 116.000000 
+115.000000 94.000000 63.000000 38.000000 26.000000 30.000000 
+44.000000 58.000000 73.000000 91.000000 109.000000 120.000000 
+124.000000 125.000000 124.000000 120.000000 115.000000 114.000000 
+120.000000 128.000000 130.000000 125.000000 121.000000 121.000000 
+124.000000 128.000000 134.000000 141.000000 142.000000 133.000000 
+119.000000 113.000000 117.000000 124.000000 127.000000 123.000000 
+123.000000 130.000000 138.000000 132.000000 100.000000 56.000000 
+50.000000 89.000000 146.000000 178.000000 160.000000 112.000000 
+79.000000 91.000000 103.000000 107.000000 109.000000 123.000000 
+139.000000 141.000000 134.000000 128.000000 123.000000 123.000000 
+125.000000 126.000000 122.000000 116.000000 108.000000 88.000000 
+81.000000 151.000000 220.000000 218.000000 174.000000 127.000000 
+99.000000 103.000000 121.000000 123.000000 100.000000 70.000000 
+47.000000 35.000000 35.000000 45.000000 63.000000 82.000000 
+94.000000 98.000000 104.000000 114.000000 122.000000 122.000000 
+119.000000 120.000000 122.000000 122.000000 120.000000 123.000000 
+128.000000 130.000000 128.000000 124.000000 119.000000 123.000000 
+132.000000 138.000000 136.000000 128.000000 121.000000 117.000000 
+117.000000 120.000000 123.000000 124.000000 128.000000 136.000000 
+142.000000 135.000000 111.000000 80.000000 61.000000 65.000000 
+79.000000 81.000000 77.000000 77.000000 75.000000 86.000000 
+93.000000 99.000000 103.000000 108.000000 115.000000 117.000000 
+119.000000 115.000000 110.000000 113.000000 123.000000 128.000000 
+124.000000 117.000000 107.000000 85.000000 74.000000 109.000000 
+140.000000 146.000000 135.000000 105.000000 89.000000 107.000000 
+125.000000 112.000000 76.000000 51.000000 50.000000 66.000000 
+84.000000 94.000000 101.000000 110.000000 118.000000 121.000000 
+118.000000 117.000000 122.000000 128.000000 130.000000 129.000000 
+126.000000 123.000000 121.000000 120.000000 120.000000 122.000000 
+122.000000 121.000000 128.000000 131.000000 132.000000 131.000000 
+125.000000 119.000000 115.000000 110.000000 109.000000 113.000000 
+119.000000 123.000000 126.000000 129.000000 130.000000 123.000000 
+110.000000 98.000000 88.000000 81.000000 72.000000 64.000000 
+67.000000 79.000000 93.000000 107.000000 117.000000 118.000000 
+110.000000 103.000000 105.000000 114.000000 120.000000 117.000000 
+111.000000 111.000000 116.000000 121.000000 121.000000 115.000000 
+102.000000 84.000000 79.000000 98.000000 111.000000 107.000000 
+97.000000 86.000000 88.000000 105.000000 109.000000 90.000000 
+72.000000 74.000000 95.000000 115.000000 121.000000 116.000000 
+112.000000 113.000000 118.000000 118.000000 115.000000 115.000000 
+123.000000 131.000000 132.000000 123.000000 117.000000 121.000000 
+129.000000 129.000000 121.000000 115.000000 117.000000 123.000000 
+129.000000 136.000000 135.000000 127.000000 116.000000 110.000000 
+110.000000 114.000000 118.000000 122.000000 125.000000 128.000000 
+128.000000 123.000000 118.000000 113.000000 107.000000 99.000000 
+96.000000 98.000000 96.000000 89.000000 82.000000 80.000000 
+91.000000 105.000000 112.000000 108.000000 102.000000 101.000000 
+109.000000 117.000000 121.000000 121.000000 116.000000 112.000000 
+113.000000 120.000000 125.000000 120.000000 105.000000 91.000000 
+84.000000 90.000000 92.000000 83.000000 77.000000 82.000000 
+93.000000 102.000000 100.000000 94.000000 97.000000 115.000000 
+134.000000 136.000000 119.000000 104.000000 105.000000 117.000000 
+125.000000 122.000000 119.000000 123.000000 132.000000 138.000000 
+135.000000 128.000000 125.000000 127.000000 127.000000 124.000000 
+119.000000 118.000000 123.000000 127.000000 126.000000 131.000000 
+129.000000 121.000000 113.000000 113.000000 119.000000 123.000000 
+120.000000 116.000000 119.000000 124.000000 127.000000 127.000000 
+128.000000 130.000000 125.000000 111.000000 94.000000 88.000000 
+92.000000 95.000000 90.000000 81.000000 73.000000 73.000000 
+79.000000 84.000000 88.000000 95.000000 109.000000 123.000000 
+127.000000 119.000000 108.000000 106.000000 114.000000 123.000000 
+123.000000 115.000000 109.000000 109.000000 106.000000 94.000000 
+84.000000 82.000000 85.000000 91.000000 95.000000 97.000000 
+97.000000 101.000000 111.000000 125.000000 133.000000 125.000000 
+109.000000 100.000000 109.000000 125.000000 132.000000 126.000000 
+120.000000 125.000000 137.000000 144.000000 139.000000 130.000000 
+126.000000 126.000000 126.000000 124.000000 123.000000 123.000000 
+122.000000 121.000000 127.000000 122.000000 118.000000 117.000000 
+120.000000 123.000000 124.000000 121.000000 115.000000 112.000000 
+115.000000 121.000000 123.000000 124.000000 125.000000 125.000000 
+118.000000 106.000000 97.000000 97.000000 100.000000 92.000000 
+68.000000 50.000000 54.000000 56.000000 66.000000 78.000000 
+84.000000 89.000000 97.000000 108.000000 113.000000 111.000000 
+107.000000 108.000000 112.000000 115.000000 109.000000 97.000000 
+90.000000 91.000000 90.000000 78.000000 70.000000 73.000000 
+87.000000 100.000000 96.000000 88.000000 90.000000 98.000000 
+106.000000 116.000000 122.000000 117.000000 107.000000 105.000000 
+111.000000 119.000000 122.000000 120.000000 120.000000 124.000000 
+130.000000 134.000000 133.000000 129.000000 124.000000 121.000000 
+120.000000 123.000000 126.000000 126.000000 122.000000 120.000000 
+120.000000 121.000000 125.000000 127.000000 126.000000 125.000000 
+123.000000 119.000000 115.000000 114.000000 118.000000 123.000000 
+125.000000 125.000000 124.000000 123.000000 120.000000 115.000000 
+114.000000 120.000000 118.000000 87.000000 33.000000 4.000000 
+29.000000 32.000000 33.000000 50.000000 68.000000 82.000000 
+93.000000 105.000000 115.000000 122.000000 125.000000 125.000000 
+122.000000 114.000000 95.000000 64.000000 38.000000 32.000000 
+35.000000 31.000000 25.000000 36.000000 67.000000 92.000000 
+89.000000 79.000000 85.000000 101.000000 113.000000 115.000000 
+114.000000 114.000000 114.000000 115.000000 118.000000 120.000000 
+119.000000 117.000000 120.000000 128.000000 137.000000 141.000000 
+138.000000 129.000000 120.000000 116.000000 119.000000 122.000000 
+120.000000 116.000000 116.000000 125.000000 127.000000 125.000000 
+129.000000 135.000000 135.000000 128.000000 119.000000 114.000000 
+115.000000 121.000000 125.000000 124.000000 123.000000 129.000000 
+135.000000 131.000000 117.000000 111.000000 121.000000 135.000000 
+125.000000 81.000000 31.000000 9.000000 17.000000 13.000000 
+2.000000 18.000000 45.000000 72.000000 97.000000 121.000000 
+138.000000 148.000000 156.000000 163.000000 155.000000 123.000000 
+65.000000 17.000000 3.000000 6.000000 11.000000 7.000000 
+9.000000 38.000000 71.000000 81.000000 75.000000 72.000000 
+84.000000 105.000000 120.000000 122.000000 115.000000 111.000000 
+114.000000 118.000000 119.000000 119.000000 118.000000 117.000000 
+117.000000 122.000000 131.000000 137.000000 134.000000 127.000000 
+122.000000 122.000000 125.000000 125.000000 123.000000 123.000000 
+126.000000 129.000000 134.000000 127.000000 130.000000 135.000000 
+129.000000 118.000000 114.000000 120.000000 126.000000 126.000000 
+124.000000 122.000000 121.000000 125.000000 130.000000 123.000000 
+106.000000 99.000000 114.000000 134.000000 127.000000 86.000000 
+39.000000 22.000000 32.000000 41.000000 36.000000 27.000000 
+26.000000 31.000000 45.000000 65.000000 93.000000 121.000000 
+138.000000 131.000000 105.000000 64.000000 31.000000 29.000000 
+52.000000 57.000000 41.000000 20.000000 28.000000 58.000000 
+83.000000 87.000000 80.000000 82.000000 96.000000 112.000000 
+120.000000 119.000000 114.000000 112.000000 115.000000 116.000000 
+114.000000 111.000000 110.000000 111.000000 116.000000 122.000000 
+127.000000 128.000000 125.000000 124.000000 126.000000 127.000000 
+124.000000 118.000000 118.000000 121.000000 124.000000 123.000000 
+133.000000 130.000000 119.000000 117.000000 120.000000 122.000000 
+121.000000 121.000000 124.000000 124.000000 119.000000 115.000000 
+115.000000 118.000000 122.000000 123.000000 120.000000 116.000000 
+121.000000 130.000000 125.000000 95.000000 58.000000 37.000000 
+55.000000 85.000000 77.000000 44.000000 29.000000 33.000000 
+40.000000 33.000000 29.000000 33.000000 36.000000 29.000000 
+18.000000 6.000000 23.000000 51.000000 74.000000 91.000000 
+90.000000 64.000000 47.000000 62.000000 85.000000 90.000000 
+82.000000 82.000000 97.000000 116.000000 125.000000 121.000000 
+115.000000 114.000000 116.000000 115.000000 112.000000 112.000000 
+116.000000 120.000000 120.000000 120.000000 123.000000 125.000000 
+123.000000 120.000000 122.000000 126.000000 129.000000 129.000000 
+127.000000 125.000000 123.000000 120.000000 121.000000 133.000000 
+131.000000 122.000000 121.000000 127.000000 128.000000 124.000000 
+121.000000 124.000000 127.000000 126.000000 122.000000 121.000000 
+122.000000 119.000000 110.000000 104.000000 110.000000 120.000000 
+118.000000 100.000000 80.000000 62.000000 54.000000 74.000000 
+84.000000 78.000000 78.000000 84.000000 79.000000 71.000000 
+66.000000 66.000000 63.000000 52.000000 40.000000 40.000000 
+47.000000 50.000000 60.000000 72.000000 73.000000 64.000000 
+40.000000 54.000000 78.000000 80.000000 76.000000 82.000000 
+98.000000 118.000000 131.000000 133.000000 127.000000 118.000000 
+112.000000 109.000000 110.000000 114.000000 118.000000 119.000000 
+119.000000 118.000000 117.000000 116.000000 118.000000 122.000000 
+124.000000 122.000000 122.000000 127.000000 133.000000 132.000000 
+124.000000 117.000000 109.000000 120.000000 129.000000 127.000000 
+124.000000 127.000000 131.000000 127.000000 120.000000 119.000000 
+125.000000 128.000000 126.000000 123.000000 123.000000 123.000000 
+118.000000 113.000000 114.000000 117.000000 115.000000 110.000000 
+106.000000 102.000000 89.000000 72.000000 64.000000 62.000000 
+64.000000 67.000000 68.000000 68.000000 65.000000 60.000000 
+58.000000 54.000000 52.000000 59.000000 80.000000 105.000000 
+111.000000 78.000000 24.000000 26.000000 20.000000 28.000000 
+76.000000 97.000000 90.000000 91.000000 101.000000 114.000000 
+125.000000 131.000000 129.000000 122.000000 115.000000 111.000000 
+111.000000 114.000000 118.000000 118.000000 115.000000 113.000000 
+117.000000 124.000000 127.000000 124.000000 120.000000 117.000000 
+120.000000 125.000000 128.000000 126.000000 124.000000 122.000000 
+116.000000 121.000000 123.000000 125.000000 126.000000 125.000000 
+124.000000 126.000000 129.000000 127.000000 122.000000 120.000000 
+123.000000 126.000000 122.000000 117.000000 117.000000 122.000000 
+125.000000 120.000000 115.000000 117.000000 125.000000 124.000000 
+104.000000 74.000000 51.000000 41.000000 38.000000 38.000000 
+39.000000 41.000000 40.000000 31.000000 24.000000 26.000000 
+33.000000 30.000000 24.000000 42.000000 83.000000 113.000000 
+86.000000 33.000000 20.000000 39.000000 94.000000 128.000000 
+117.000000 103.000000 111.000000 126.000000 133.000000 130.000000 
+124.000000 120.000000 117.000000 115.000000 114.000000 115.000000 
+119.000000 121.000000 119.000000 118.000000 123.000000 130.000000 
+131.000000 125.000000 118.000000 114.000000 116.000000 120.000000 
+125.000000 128.000000 126.000000 126.000000 123.000000 123.000000 
+123.000000 125.000000 125.000000 120.000000 117.000000 121.000000 
+125.000000 122.000000 114.000000 115.000000 128.000000 139.000000 
+137.000000 126.000000 120.000000 122.000000 125.000000 120.000000 
+111.000000 105.000000 101.000000 90.000000 71.000000 52.000000 
+39.000000 34.000000 31.000000 36.000000 64.000000 102.000000 
+122.000000 105.000000 66.000000 37.000000 35.000000 48.000000 
+52.000000 51.000000 64.000000 94.000000 109.000000 101.000000 
+94.000000 99.000000 116.000000 127.000000 118.000000 103.000000 
+107.000000 125.000000 134.000000 128.000000 119.000000 113.000000 
+109.000000 106.000000 107.000000 112.000000 115.000000 114.000000 
+114.000000 120.000000 127.000000 127.000000 119.000000 113.000000 
+114.000000 119.000000 121.000000 121.000000 122.000000 125.000000 
+128.000000 128.000000 127.000000 123.000000 121.000000 121.000000 
+121.000000 120.000000 119.000000 121.000000 124.000000 125.000000 
+127.000000 129.000000 134.000000 140.000000 140.000000 131.000000 
+122.000000 122.000000 126.000000 118.000000 102.000000 90.000000 
+91.000000 92.000000 86.000000 83.000000 88.000000 93.000000 
+89.000000 92.000000 152.000000 278.000000 362.000000 333.000000 
+232.000000 150.000000 120.000000 115.000000 108.000000 92.000000 
+72.000000 66.000000 74.000000 96.000000 131.000000 153.000000 
+151.000000 138.000000 124.000000 116.000000 116.000000 122.000000 
+129.000000 124.000000 112.000000 104.000000 105.000000 109.000000 
+114.000000 120.000000 127.000000 130.000000 128.000000 124.000000 
+117.000000 109.000000 104.000000 108.000000 117.000000 125.000000 
+129.000000 131.000000 133.000000 133.000000 129.000000 126.000000 
+125.000000 119.000000 117.000000 120.000000 124.000000 126.000000 
+125.000000 121.000000 119.000000 122.000000 126.000000 128.000000 
+129.000000 129.000000 128.000000 121.000000 114.000000 117.000000 
+124.000000 122.000000 109.000000 99.000000 104.000000 121.000000 
+141.000000 163.000000 186.000000 206.000000 217.000000 213.000000 
+270.000000 434.000000 548.000000 521.000000 414.000000 333.000000 
+295.000000 251.000000 200.000000 168.000000 139.000000 102.000000 
+75.000000 75.000000 95.000000 114.000000 117.000000 112.000000 
+115.000000 124.000000 126.000000 122.000000 120.000000 119.000000 
+113.000000 105.000000 105.000000 112.000000 121.000000 127.000000 
+131.000000 135.000000 131.000000 122.000000 113.000000 110.000000 
+112.000000 118.000000 121.000000 122.000000 120.000000 121.000000 
+122.000000 122.000000 121.000000 122.000000 128.000000 124.000000 
+121.000000 120.000000 119.000000 115.000000 113.000000 117.000000 
+125.000000 127.000000 124.000000 124.000000 131.000000 134.000000 
+124.000000 111.000000 113.000000 126.000000 133.000000 125.000000 
+117.000000 123.000000 147.000000 185.000000 224.000000 248.000000 
+244.000000 217.000000 190.000000 186.000000 259.000000 372.000000 
+410.000000 354.000000 274.000000 221.000000 215.000000 234.000000 
+228.000000 190.000000 157.000000 133.000000 101.000000 69.000000 
+64.000000 85.000000 108.000000 113.000000 106.000000 108.000000 
+119.000000 124.000000 119.000000 112.000000 110.000000 112.000000 
+115.000000 117.000000 121.000000 125.000000 127.000000 128.000000 
+127.000000 123.000000 115.000000 108.000000 106.000000 110.000000 
+118.000000 128.000000 133.000000 131.000000 124.000000 121.000000 
+124.000000 128.000000 129.000000 128.000000 129.000000 126.000000 
+117.000000 109.000000 112.000000 124.000000 136.000000 136.000000 
+129.000000 123.000000 122.000000 121.000000 117.000000 114.000000 
+115.000000 116.000000 117.000000 129.000000 158.000000 202.000000 
+239.000000 245.000000 219.000000 182.000000 144.000000 106.000000 
+77.000000 70.000000 116.000000 201.000000 246.000000 215.000000 
+134.000000 61.000000 31.000000 45.000000 72.000000 92.000000 
+104.000000 106.000000 93.000000 67.000000 49.000000 57.000000 
+80.000000 94.000000 94.000000 96.000000 108.000000 122.000000 
+128.000000 126.000000 122.000000 118.000000 114.000000 111.000000 
+114.000000 124.000000 136.000000 140.000000 131.000000 119.000000 
+112.000000 113.000000 116.000000 117.000000 121.000000 127.000000 
+131.000000 131.000000 128.000000 126.000000 126.000000 123.000000 
+131.000000 132.000000 126.000000 117.000000 109.000000 110.000000 
+120.000000 129.000000 133.000000 130.000000 127.000000 125.000000 
+122.000000 119.000000 117.000000 112.000000 101.000000 93.000000 
+112.000000 171.000000 234.000000 254.000000 221.000000 166.000000 
+130.000000 115.000000 102.000000 84.000000 73.000000 72.000000 
+69.000000 68.000000 74.000000 77.000000 69.000000 58.000000 
+53.000000 58.000000 69.000000 75.000000 74.000000 73.000000 
+65.000000 51.000000 45.000000 58.000000 80.000000 92.000000 
+91.000000 92.000000 107.000000 125.000000 133.000000 130.000000 
+127.000000 125.000000 124.000000 122.000000 124.000000 129.000000 
+130.000000 128.000000 128.000000 131.000000 127.000000 113.000000 
+98.000000 96.000000 112.000000 131.000000 140.000000 137.000000 
+130.000000 124.000000 118.000000 112.000000 119.000000 123.000000 
+127.000000 127.000000 121.000000 116.000000 118.000000 124.000000 
+129.000000 128.000000 124.000000 122.000000 125.000000 127.000000 
+118.000000 93.000000 72.000000 84.000000 127.000000 173.000000 
+190.000000 161.000000 115.000000 100.000000 111.000000 114.000000 
+108.000000 103.000000 104.000000 109.000000 109.000000 98.000000 
+85.000000 78.000000 80.000000 89.000000 102.000000 113.000000 
+120.000000 125.000000 129.000000 126.000000 113.000000 95.000000 
+82.000000 80.000000 84.000000 86.000000 88.000000 97.000000 
+113.000000 127.000000 133.000000 131.000000 128.000000 124.000000 
+120.000000 117.000000 121.000000 129.000000 133.000000 128.000000 
+121.000000 121.000000 127.000000 128.000000 120.000000 111.000000 
+111.000000 123.000000 135.000000 139.000000 133.000000 124.000000 
+116.000000 110.000000 117.000000 121.000000 125.000000 123.000000 
+116.000000 114.000000 123.000000 134.000000 138.000000 132.000000 
+126.000000 124.000000 126.000000 122.000000 109.000000 89.000000 
+75.000000 78.000000 91.000000 106.000000 112.000000 109.000000 
+112.000000 120.000000 121.000000 115.000000 109.000000 115.000000 
+131.000000 143.000000 140.000000 125.000000 112.000000 111.000000 
+121.000000 131.000000 135.000000 134.000000 134.000000 135.000000 
+137.000000 140.000000 140.000000 134.000000 117.000000 95.000000 
+82.000000 82.000000 90.000000 101.000000 112.000000 122.000000 
+128.000000 127.000000 123.000000 123.000000 129.000000 131.000000 
+127.000000 123.000000 125.000000 128.000000 126.000000 122.000000 
+123.000000 124.000000 118.000000 106.000000 103.000000 116.000000 
+134.000000 139.000000 130.000000 118.000000 111.000000 109.000000 
+115.000000 118.000000 123.000000 127.000000 131.000000 135.000000 
+137.000000 135.000000 129.000000 124.000000 124.000000 129.000000 
+133.000000 128.000000 111.000000 89.000000 77.000000 85.000000 
+105.000000 120.000000 123.000000 121.000000 123.000000 127.000000 
+129.000000 128.000000 128.000000 132.000000 135.000000 136.000000 
+133.000000 127.000000 122.000000 120.000000 124.000000 131.000000 
+135.000000 134.000000 134.000000 135.000000 134.000000 130.000000 
+131.000000 137.000000 136.000000 116.000000 86.000000 74.000000 
+83.000000 103.000000 117.000000 121.000000 124.000000 132.000000 
+136.000000 133.000000 128.000000 126.000000 126.000000 126.000000 
+127.000000 129.000000 130.000000 128.000000 125.000000 128.000000 
+132.000000 131.000000 126.000000 124.000000 130.000000 135.000000 
+131.000000 120.000000 113.000000 113.000000 123.000000 124.000000 
+121.000000 121.000000 126.000000 131.000000 131.000000 127.000000 
+123.000000 122.000000 124.000000 128.000000 129.000000 121.000000 
+103.000000 87.000000 85.000000 99.000000 117.000000 128.000000 
+129.000000 129.000000 128.000000 125.000000 119.000000 116.000000 
+118.000000 123.000000 125.000000 123.000000 120.000000 121.000000 
+124.000000 124.000000 123.000000 122.000000 124.000000 126.000000 
+125.000000 121.000000 118.000000 117.000000 119.000000 129.000000 
+141.000000 138.000000 112.000000 78.000000 71.000000 98.000000 
+133.000000 148.000000 141.000000 133.000000 135.000000 137.000000 
+132.000000 126.000000 128.000000 133.000000 135.000000 131.000000 
+128.000000 128.000000 127.000000 125.000000 124.000000 127.000000 
+133.000000 137.000000 134.000000 128.000000 120.000000 114.000000 
+111.000000 110.000000 123.000000 123.000000 120.000000 122.000000 
+126.000000 128.000000 127.000000 121.000000 116.000000 114.000000 
+117.000000 123.000000 124.000000 115.000000 100.000000 90.000000 
+92.000000 103.000000 115.000000 124.000000 126.000000 128.000000 
+130.000000 130.000000 127.000000 122.000000 118.000000 116.000000 
+117.000000 117.000000 116.000000 116.000000 116.000000 117.000000 
+118.000000 120.000000 123.000000 126.000000 127.000000 127.000000 
+126.000000 123.000000 120.000000 122.000000 129.000000 133.000000 
+124.000000 103.000000 86.000000 90.000000 109.000000 121.000000 
+121.000000 116.000000 119.000000 127.000000 132.000000 132.000000 
+133.000000 137.000000 139.000000 135.000000 130.000000 130.000000 
+131.000000 131.000000 131.000000 137.000000 142.000000 139.000000 
+129.000000 122.000000 122.000000 122.000000 118.000000 112.000000 
+118.000000 121.000000 124.000000 126.000000 129.000000 132.000000 
+132.000000 125.000000 118.000000 119.000000 127.000000 132.000000 
+123.000000 106.000000 93.000000 91.000000 99.000000 112.000000 
+122.000000 125.000000 123.000000 122.000000 126.000000 129.000000 
+128.000000 126.000000 125.000000 128.000000 130.000000 130.000000 
+129.000000 128.000000 127.000000 122.000000 118.000000 118.000000 
+122.000000 125.000000 126.000000 129.000000 132.000000 134.000000 
+132.000000 131.000000 135.000000 139.000000 133.000000 117.000000 
+101.000000 99.000000 107.000000 118.000000 126.000000 132.000000 
+136.000000 135.000000 131.000000 129.000000 130.000000 131.000000 
+132.000000 135.000000 138.000000 137.000000 131.000000 126.000000 
+129.000000 138.000000 144.000000 141.000000 132.000000 124.000000 
+120.000000 118.000000 116.000000 114.000000 120.000000 120.000000 
+122.000000 123.000000 123.000000 124.000000 123.000000 120.000000 
+118.000000 121.000000 132.000000 137.000000 127.000000 104.000000 
+89.000000 93.000000 108.000000 120.000000 125.000000 125.000000 
+126.000000 128.000000 129.000000 129.000000 128.000000 125.000000 
+123.000000 122.000000 124.000000 127.000000 129.000000 129.000000 
+126.000000 121.000000 116.000000 115.000000 118.000000 122.000000 
+125.000000 128.000000 130.000000 131.000000 127.000000 124.000000 
+127.000000 134.000000 133.000000 121.000000 106.000000 103.000000 
+111.000000 124.000000 133.000000 137.000000 137.000000 134.000000 
+130.000000 128.000000 129.000000 132.000000 134.000000 134.000000 
+134.000000 132.000000 127.000000 125.000000 128.000000 133.000000 
+135.000000 132.000000 127.000000 124.000000 123.000000 123.000000 
+121.000000 118.000000 120.000000 117.000000 118.000000 121.000000 
+121.000000 118.000000 118.000000 119.000000 118.000000 118.000000 
+123.000000 127.000000 118.000000 96.000000 83.000000 95.000000 
+119.000000 132.000000 126.000000 117.000000 118.000000 124.000000 
+126.000000 122.000000 120.000000 120.000000 119.000000 119.000000 
+123.000000 128.000000 130.000000 126.000000 121.000000 121.000000 
+123.000000 124.000000 122.000000 120.000000 119.000000 121.000000 
+126.000000 131.000000 131.000000 128.000000 128.000000 133.000000 
+135.000000 127.000000 116.000000 111.000000 117.000000 127.000000 
+132.000000 130.000000 127.000000 128.000000 133.000000 136.000000 
+134.000000 131.000000 131.000000 133.000000 132.000000 129.000000 
+128.000000 129.000000 129.000000 128.000000 128.000000 129.000000 
+128.000000 124.000000 119.000000 119.000000 120.000000 119.000000 
+121.000000 120.000000 122.000000 124.000000 125.000000 124.000000 
+120.000000 115.000000 114.000000 122.000000 134.000000 137.000000 
+126.000000 110.000000 104.000000 113.000000 124.000000 127.000000 
+121.000000 116.000000 118.000000 123.000000 126.000000 126.000000 
+122.000000 118.000000 119.000000 122.000000 125.000000 124.000000 
+120.000000 115.000000 115.000000 120.000000 125.000000 128.000000 
+129.000000 128.000000 127.000000 126.000000 127.000000 130.000000 
+131.000000 129.000000 129.000000 133.000000 137.000000 134.000000 
+123.000000 115.000000 118.000000 129.000000 137.000000 135.000000 
+129.000000 126.000000 126.000000 127.000000 127.000000 130.000000 
+135.000000 138.000000 134.000000 127.000000 125.000000 128.000000 
+133.000000 134.000000 133.000000 132.000000 131.000000 128.000000 
+124.000000 120.000000 117.000000 118.000000 127.000000 127.000000 
+126.000000 124.000000 124.000000 124.000000 124.000000 122.000000 
+123.000000 134.000000 148.000000 150.000000 130.000000 106.000000 
+101.000000 115.000000 126.000000 124.000000 116.000000 114.000000 
+122.000000 129.000000 131.000000 127.000000 122.000000 119.000000 
+119.000000 122.000000 125.000000 123.000000 119.000000 117.000000 
+120.000000 127.000000 132.000000 131.000000 127.000000 124.000000 
+123.000000 124.000000 126.000000 129.000000 130.000000 132.000000 
+134.000000 137.000000 136.000000 125.000000 111.000000 105.000000 
+113.000000 127.000000 135.000000 134.000000 129.000000 128.000000 
+130.000000 131.000000 129.000000 127.000000 125.000000 126.000000 
+127.000000 125.000000 120.000000 117.000000 121.000000 129.000000 
+133.000000 129.000000 122.000000 118.000000 117.000000 118.000000 
+118.000000 118.000000 121.000000 125.000000 127.000000 127.000000 
+127.000000 130.000000 133.000000 128.000000 118.000000 114.000000 
+123.000000 134.000000 129.000000 109.000000 100.000000 113.000000 
+130.000000 132.000000 122.000000 117.000000 123.000000 131.000000 
+131.000000 126.000000 121.000000 121.000000 124.000000 127.000000 
+126.000000 121.000000 117.000000 117.000000 122.000000 127.000000 
+129.000000 129.000000 129.000000 128.000000 126.000000 123.000000 
+123.000000 125.000000 126.000000 127.000000 131.000000 137.000000 
+137.000000 127.000000 111.000000 102.000000 105.000000 118.000000 
+132.000000 139.000000 138.000000 134.000000 132.000000 132.000000 
+131.000000 127.000000 123.000000 123.000000 123.000000 122.000000 
+120.000000 121.000000 124.000000 130.000000 134.000000 132.000000 
+126.000000 120.000000 120.000000 122.000000 122.000000 118.000000 
+123.000000 124.000000 127.000000 129.000000 130.000000 129.000000 
+128.000000 126.000000 124.000000 121.000000 122.000000 124.000000 
+124.000000 119.000000 114.000000 115.000000 120.000000 122.000000 
+116.000000 109.000000 110.000000 116.000000 122.000000 122.000000 
+119.000000 117.000000 118.000000 119.000000 120.000000 119.000000 
+118.000000 120.000000 124.000000 128.000000 126.000000 120.000000 
+117.000000 119.000000 122.000000 122.000000 123.000000 127.000000 
+132.000000 133.000000 134.000000 136.000000 139.000000 133.000000 
+120.000000 108.000000 108.000000 118.000000 130.000000 136.000000 
+135.000000 131.000000 128.000000 127.000000 128.000000 130.000000 
+131.000000 133.000000 132.000000 131.000000 130.000000 130.000000 
+131.000000 133.000000 134.000000 132.000000 125.000000 118.000000 
+114.000000 114.000000 115.000000 117.000000 116.000000 121.000000 
+127.000000 130.000000 130.000000 129.000000 129.000000 127.000000 
+123.000000 120.000000 121.000000 122.000000 118.000000 114.000000 
+112.000000 118.000000 128.000000 130.000000 122.000000 114.000000 
+114.000000 122.000000 127.000000 127.000000 124.000000 123.000000 
+121.000000 117.000000 114.000000 112.000000 114.000000 117.000000 
+120.000000 123.000000 126.000000 125.000000 121.000000 120.000000 
+122.000000 124.000000 127.000000 130.000000 134.000000 137.000000 
+136.000000 134.000000 133.000000 131.000000 123.000000 111.000000 
+105.000000 109.000000 121.000000 132.000000 137.000000 136.000000 
+131.000000 127.000000 125.000000 129.000000 134.000000 136.000000 
+135.000000 135.000000 136.000000 137.000000 134.000000 131.000000 
+132.000000 133.000000 130.000000 122.000000 117.000000 116.000000 
+119.000000 120.000000 97.000000 119.000000 147.000000 152.000000 
+124.000000 96.000000 94.000000 106.000000 104.000000 88.000000 
+75.000000 63.000000 52.000000 39.000000 23.000000 16.000000 
+12.000000 33.000000 53.000000 84.000000 111.000000 120.000000 
+101.000000 73.000000 48.000000 19.000000 2.000000 14.000000 
+27.000000 31.000000 24.000000 13.000000 7.000000 16.000000 
+18.000000 14.000000 9.000000 4.000000 10.000000 6.000000 
+9.000000 19.000000 16.000000 16.000000 19.000000 20.000000 
+36.000000 58.000000 62.000000 59.000000 71.000000 92.000000 
+103.000000 92.000000 79.000000 76.000000 65.000000 38.000000 
+41.000000 80.000000 123.000000 147.000000 140.000000 119.000000 
+128.000000 158.000000 172.000000 160.000000 133.000000 106.000000 
+95.000000 102.000000 117.000000 126.000000 123.000000 117.000000 
+90.000000 89.000000 102.000000 114.000000 108.000000 91.000000 
+83.000000 90.000000 97.000000 87.000000 71.000000 59.000000 
+55.000000 64.000000 66.000000 44.000000 17.000000 15.000000 
+42.000000 69.000000 122.000000 157.000000 136.000000 91.000000 
+61.000000 40.000000 32.000000 29.000000 30.000000 45.000000 
+57.000000 46.000000 16.000000 13.000000 20.000000 18.000000 
+17.000000 11.000000 6.000000 5.000000 7.000000 13.000000 
+12.000000 6.000000 10.000000 37.000000 75.000000 90.000000 
+86.000000 109.000000 141.000000 153.000000 148.000000 126.000000 
+101.000000 99.000000 97.000000 55.000000 26.000000 71.000000 
+135.000000 151.000000 122.000000 108.000000 134.000000 157.000000 
+149.000000 118.000000 90.000000 82.000000 92.000000 108.000000 
+118.000000 124.000000 126.000000 125.000000 112.000000 100.000000 
+87.000000 81.000000 81.000000 89.000000 100.000000 99.000000 
+93.000000 86.000000 71.000000 52.000000 48.000000 76.000000 
+94.000000 68.000000 25.000000 8.000000 33.000000 61.000000 
+124.000000 193.000000 192.000000 133.000000 88.000000 87.000000 
+82.000000 56.000000 33.000000 33.000000 56.000000 67.000000 
+59.000000 48.000000 40.000000 32.000000 30.000000 30.000000 
+21.000000 17.000000 17.000000 18.000000 11.000000 4.000000 
+16.000000 48.000000 83.000000 96.000000 109.000000 147.000000 
+175.000000 166.000000 139.000000 113.000000 97.000000 95.000000 
+86.000000 29.000000 19.000000 76.000000 117.000000 112.000000 
+105.000000 129.000000 151.000000 146.000000 123.000000 97.000000 
+78.000000 76.000000 89.000000 110.000000 126.000000 132.000000 
+132.000000 127.000000 108.000000 97.000000 91.000000 86.000000 
+86.000000 105.000000 129.000000 120.000000 86.000000 66.000000 
+62.000000 45.000000 35.000000 64.000000 91.000000 74.000000 
+37.000000 13.000000 10.000000 51.000000 91.000000 182.000000 
+234.000000 202.000000 145.000000 119.000000 93.000000 59.000000 
+37.000000 30.000000 31.000000 39.000000 51.000000 61.000000 
+57.000000 47.000000 40.000000 40.000000 37.000000 35.000000 
+28.000000 14.000000 15.000000 19.000000 17.000000 35.000000 
+64.000000 70.000000 69.000000 82.000000 91.000000 85.000000 
+69.000000 57.000000 60.000000 64.000000 48.000000 14.000000 
+29.000000 58.000000 59.000000 68.000000 104.000000 135.000000 
+136.000000 119.000000 103.000000 89.000000 75.000000 69.000000 
+82.000000 107.000000 125.000000 128.000000 125.000000 121.000000 
+102.000000 96.000000 88.000000 87.000000 100.000000 126.000000 
+148.000000 142.000000 101.000000 55.000000 37.000000 38.000000 
+32.000000 62.000000 93.000000 88.000000 57.000000 40.000000 
+25.000000 24.000000 59.000000 124.000000 201.000000 222.000000 
+180.000000 125.000000 86.000000 57.000000 43.000000 37.000000 
+23.000000 26.000000 39.000000 50.000000 49.000000 42.000000 
+30.000000 29.000000 33.000000 14.000000 21.000000 21.000000 
+27.000000 23.000000 9.000000 22.000000 30.000000 20.000000 
+22.000000 29.000000 32.000000 39.000000 50.000000 57.000000 
+56.000000 44.000000 22.000000 14.000000 20.000000 30.000000 
+48.000000 79.000000 101.000000 101.000000 93.000000 93.000000 
+96.000000 92.000000 82.000000 80.000000 92.000000 111.000000 
+121.000000 119.000000 115.000000 116.000000 108.000000 116.000000 
+109.000000 96.000000 90.000000 91.000000 98.000000 113.000000 
+109.000000 67.000000 23.000000 19.000000 38.000000 70.000000 
+87.000000 74.000000 58.000000 63.000000 59.000000 32.000000 
+35.000000 69.000000 133.000000 188.000000 188.000000 140.000000 
+87.000000 60.000000 48.000000 43.000000 34.000000 23.000000 
+25.000000 28.000000 28.000000 31.000000 25.000000 14.000000 
+13.000000 15.000000 45.000000 51.000000 19.000000 15.000000 
+5.000000 0.000000 6.000000 20.000000 31.000000 29.000000 
+24.000000 30.000000 41.000000 49.000000 50.000000 43.000000 
+29.000000 16.000000 13.000000 33.000000 62.000000 78.000000 
+79.000000 72.000000 72.000000 86.000000 107.000000 119.000000 
+113.000000 99.000000 95.000000 107.000000 120.000000 125.000000 
+122.000000 120.000000 107.000000 123.000000 134.000000 125.000000 
+98.000000 72.000000 68.000000 87.000000 100.000000 77.000000 
+34.000000 10.000000 31.000000 64.000000 77.000000 74.000000 
+61.000000 50.000000 42.000000 38.000000 43.000000 84.000000 
+124.000000 145.000000 152.000000 135.000000 94.000000 70.000000 
+51.000000 41.000000 45.000000 31.000000 17.000000 18.000000 
+25.000000 28.000000 21.000000 14.000000 30.000000 56.000000 
+66.000000 37.000000 13.000000 17.000000 29.000000 36.000000 
+32.000000 33.000000 49.000000 50.000000 36.000000 25.000000 
+26.000000 40.000000 49.000000 48.000000 44.000000 34.000000 
+30.000000 41.000000 57.000000 67.000000 63.000000 50.000000 
+50.000000 73.000000 112.000000 147.000000 154.000000 136.000000 
+116.000000 114.000000 124.000000 130.000000 129.000000 127.000000 
+117.000000 123.000000 133.000000 135.000000 117.000000 90.000000 
+77.000000 81.000000 87.000000 81.000000 58.000000 28.000000 
+16.000000 31.000000 68.000000 79.000000 62.000000 37.000000 
+30.000000 44.000000 68.000000 101.000000 120.000000 102.000000 
+70.000000 57.000000 70.000000 76.000000 65.000000 48.000000 
+52.000000 50.000000 37.000000 36.000000 46.000000 46.000000 
+28.000000 34.000000 67.000000 77.000000 42.000000 9.000000 
+19.000000 34.000000 81.000000 131.000000 131.000000 93.000000 
+66.000000 52.000000 41.000000 34.000000 38.000000 54.000000 
+65.000000 53.000000 37.000000 38.000000 51.000000 64.000000 
+71.000000 71.000000 64.000000 56.000000 59.000000 77.000000 
+113.000000 152.000000 169.000000 155.000000 127.000000 113.000000 
+118.000000 123.000000 123.000000 125.000000 123.000000 126.000000 
+132.000000 136.000000 127.000000 104.000000 77.000000 65.000000 
+67.000000 70.000000 65.000000 54.000000 28.000000 10.000000 
+49.000000 65.000000 55.000000 39.000000 36.000000 55.000000 
+80.000000 100.000000 111.000000 100.000000 59.000000 21.000000 
+23.000000 56.000000 57.000000 38.000000 47.000000 58.000000 
+52.000000 45.000000 46.000000 49.000000 48.000000 60.000000 
+73.000000 55.000000 35.000000 34.000000 30.000000 46.000000 
+82.000000 128.000000 162.000000 156.000000 115.000000 71.000000 
+41.000000 30.000000 34.000000 44.000000 46.000000 40.000000 
+33.000000 39.000000 60.000000 79.000000 80.000000 68.000000 
+57.000000 56.000000 63.000000 82.000000 110.000000 132.000000 
+131.000000 116.000000 108.000000 110.000000 111.000000 108.000000 
+113.000000 129.000000 122.000000 126.000000 128.000000 130.000000 
+132.000000 129.000000 116.000000 99.000000 81.000000 60.000000 
+52.000000 69.000000 55.000000 19.000000 24.000000 41.000000 
+48.000000 47.000000 48.000000 58.000000 69.000000 79.000000 
+98.000000 117.000000 110.000000 72.000000 27.000000 21.000000 
+28.000000 22.000000 25.000000 30.000000 43.000000 41.000000 
+34.000000 41.000000 56.000000 70.000000 67.000000 41.000000 
+32.000000 31.000000 40.000000 69.000000 91.000000 107.000000 
+133.000000 154.000000 141.000000 105.000000 65.000000 34.000000 
+28.000000 39.000000 44.000000 40.000000 38.000000 47.000000 
+66.000000 81.000000 78.000000 65.000000 53.000000 46.000000 
+43.000000 53.000000 95.000000 136.000000 136.000000 104.000000 
+76.000000 80.000000 108.000000 125.000000 129.000000 136.000000 
+128.000000 125.000000 120.000000 120.000000 128.000000 138.000000 
+138.000000 117.000000 80.000000 46.000000 47.000000 93.000000 
+98.000000 57.000000 21.000000 20.000000 40.000000 50.000000 
+48.000000 51.000000 58.000000 69.000000 92.000000 117.000000 
+129.000000 110.000000 68.000000 33.000000 29.000000 32.000000 
+26.000000 12.000000 35.000000 52.000000 49.000000 40.000000 
+37.000000 47.000000 54.000000 34.000000 21.000000 36.000000 
+66.000000 82.000000 107.000000 142.000000 171.000000 179.000000 
+151.000000 107.000000 72.000000 39.000000 31.000000 43.000000 
+53.000000 48.000000 41.000000 46.000000 59.000000 71.000000 
+74.000000 63.000000 48.000000 44.000000 47.000000 56.000000 
+84.000000 127.000000 152.000000 140.000000 107.000000 85.000000 
+94.000000 118.000000 133.000000 136.000000 133.000000 123.000000 
+115.000000 117.000000 128.000000 143.000000 143.000000 114.000000 
+67.000000 40.000000 61.000000 114.000000 128.000000 94.000000 
+50.000000 27.000000 29.000000 34.000000 30.000000 46.000000 
+78.000000 109.000000 131.000000 138.000000 144.000000 145.000000 
+116.000000 79.000000 68.000000 66.000000 45.000000 17.000000 
+18.000000 16.000000 28.000000 38.000000 33.000000 25.000000 
+17.000000 14.000000 28.000000 71.000000 84.000000 65.000000 
+112.000000 182.000000 221.000000 210.000000 148.000000 90.000000 
+62.000000 37.000000 30.000000 33.000000 35.000000 33.000000 
+36.000000 45.000000 51.000000 59.000000 66.000000 60.000000 
+45.000000 39.000000 57.000000 88.000000 102.000000 104.000000 
+111.000000 126.000000 139.000000 129.000000 103.000000 95.000000 
+111.000000 125.000000 133.000000 129.000000 125.000000 124.000000 
+127.000000 134.000000 138.000000 122.000000 85.000000 56.000000 
+64.000000 102.000000 131.000000 128.000000 98.000000 53.000000 
+21.000000 18.000000 25.000000 64.000000 109.000000 152.000000 
+180.000000 179.000000 169.000000 166.000000 141.000000 116.000000 
+125.000000 124.000000 92.000000 81.000000 98.000000 85.000000 
+63.000000 45.000000 24.000000 4.000000 5.000000 44.000000 
+85.000000 113.000000 97.000000 73.000000 147.000000 226.000000 
+246.000000 214.000000 132.000000 60.000000 45.000000 30.000000 
+23.000000 28.000000 30.000000 34.000000 45.000000 53.000000 
+62.000000 73.000000 79.000000 73.000000 58.000000 52.000000 
+71.000000 104.000000 122.000000 116.000000 103.000000 104.000000 
+113.000000 116.000000 113.000000 112.000000 115.000000 114.000000 
+134.000000 130.000000 127.000000 128.000000 127.000000 125.000000 
+125.000000 125.000000 113.000000 94.000000 88.000000 101.000000 
+119.000000 123.000000 105.000000 71.000000 40.000000 34.000000 
+51.000000 93.000000 139.000000 191.000000 220.000000 206.000000 
+173.000000 149.000000 122.000000 111.000000 125.000000 127.000000 
+124.000000 154.000000 210.000000 228.000000 186.000000 128.000000 
+93.000000 82.000000 97.000000 128.000000 158.000000 166.000000 
+117.000000 94.000000 186.000000 258.000000 250.000000 200.000000 
+118.000000 42.000000 26.000000 22.000000 25.000000 32.000000 
+33.000000 40.000000 56.000000 71.000000 82.000000 92.000000 
+100.000000 100.000000 88.000000 79.000000 88.000000 109.000000 
+123.000000 124.000000 120.000000 121.000000 121.000000 113.000000 
+104.000000 106.000000 114.000000 117.000000 127.000000 124.000000 
+126.000000 131.000000 131.000000 128.000000 127.000000 127.000000 
+127.000000 128.000000 132.000000 128.000000 111.000000 87.000000 
+67.000000 61.000000 65.000000 79.000000 102.000000 128.000000 
+179.000000 242.000000 265.000000 238.000000 179.000000 129.000000 
+90.000000 80.000000 95.000000 97.000000 107.000000 134.000000 
+175.000000 196.000000 181.000000 158.000000 157.000000 170.000000 
+173.000000 169.000000 169.000000 165.000000 106.000000 112.000000 
+228.000000 287.000000 245.000000 182.000000 112.000000 47.000000 
+24.000000 35.000000 49.000000 49.000000 42.000000 42.000000 
+46.000000 56.000000 74.000000 88.000000 94.000000 93.000000 
+87.000000 79.000000 83.000000 103.000000 125.000000 130.000000 
+118.000000 107.000000 107.000000 110.000000 110.000000 111.000000 
+112.000000 113.000000 131.000000 135.000000 135.000000 127.000000 
+119.000000 119.000000 123.000000 124.000000 122.000000 127.000000 
+139.000000 144.000000 131.000000 102.000000 74.000000 59.000000 
+70.000000 108.000000 137.000000 160.000000 231.000000 303.000000 
+310.000000 269.000000 194.000000 112.000000 69.000000 72.000000 
+89.000000 85.000000 78.000000 88.000000 115.000000 129.000000 
+120.000000 115.000000 131.000000 150.000000 153.000000 146.000000 
+145.000000 135.000000 81.000000 144.000000 275.000000 312.000000 
+234.000000 170.000000 129.000000 78.000000 52.000000 66.000000 
+83.000000 73.000000 51.000000 40.000000 36.000000 34.000000 
+41.000000 58.000000 71.000000 71.000000 70.000000 78.000000 
+93.000000 109.000000 121.000000 125.000000 117.000000 104.000000 
+100.000000 109.000000 122.000000 124.000000 114.000000 105.000000 
+137.000000 136.000000 131.000000 120.000000 114.000000 121.000000 
+132.000000 134.000000 129.000000 125.000000 125.000000 126.000000 
+126.000000 122.000000 110.000000 88.000000 77.000000 106.000000 
+146.000000 186.000000 286.000000 364.000000 334.000000 253.000000 
+181.000000 103.000000 64.000000 65.000000 76.000000 78.000000 
+74.000000 85.000000 114.000000 131.000000 125.000000 118.000000 
+125.000000 136.000000 133.000000 122.000000 121.000000 112.000000 
+78.000000 172.000000 310.000000 335.000000 237.000000 163.000000 
+144.000000 130.000000 119.000000 115.000000 105.000000 76.000000 
+39.000000 23.000000 33.000000 46.000000 48.000000 48.000000 
+56.000000 69.000000 84.000000 97.000000 106.000000 111.000000 
+113.000000 118.000000 123.000000 125.000000 123.000000 124.000000 
+129.000000 126.000000 114.000000 103.000000 127.000000 131.000000 
+136.000000 129.000000 117.000000 115.000000 123.000000 130.000000 
+131.000000 129.000000 121.000000 110.000000 106.000000 116.000000 
+124.000000 110.000000 82.000000 88.000000 143.000000 213.000000 
+313.000000 376.000000 314.000000 183.000000 111.000000 86.000000 
+70.000000 61.000000 67.000000 81.000000 87.000000 99.000000 
+120.000000 136.000000 133.000000 122.000000 119.000000 122.000000 
+112.000000 94.000000 87.000000 81.000000 69.000000 177.000000 
+315.000000 339.000000 256.000000 183.000000 151.000000 140.000000 
+141.000000 124.000000 84.000000 49.000000 33.000000 41.000000 
+57.000000 72.000000 78.000000 72.000000 72.000000 86.000000 
+103.000000 110.000000 111.000000 114.000000 121.000000 127.000000 
+128.000000 127.000000 127.000000 128.000000 125.000000 118.000000 
+110.000000 110.000000 123.000000 136.000000 142.000000 131.000000 
+118.000000 115.000000 117.000000 117.000000 116.000000 117.000000 
+118.000000 116.000000 116.000000 125.000000 133.000000 123.000000 
+93.000000 75.000000 118.000000 189.000000 267.000000 308.000000 
+245.000000 113.000000 40.000000 64.000000 81.000000 75.000000 
+61.000000 64.000000 74.000000 91.000000 111.000000 125.000000 
+129.000000 125.000000 119.000000 108.000000 88.000000 67.000000 
+59.000000 54.000000 53.000000 163.000000 289.000000 306.000000 
+235.000000 170.000000 134.000000 114.000000 106.000000 89.000000 
+58.000000 42.000000 62.000000 97.000000 113.000000 110.000000 
+105.000000 106.000000 111.000000 117.000000 122.000000 123.000000 
+124.000000 127.000000 132.000000 131.000000 123.000000 117.000000 
+118.000000 119.000000 113.000000 105.000000 107.000000 118.000000 
+123.000000 129.000000 130.000000 127.000000 127.000000 126.000000 
+121.000000 114.000000 107.000000 103.000000 106.000000 115.000000 
+129.000000 138.000000 144.000000 143.000000 125.000000 90.000000 
+79.000000 105.000000 153.000000 181.000000 158.000000 97.000000 
+46.000000 60.000000 83.000000 82.000000 60.000000 50.000000 
+61.000000 85.000000 101.000000 108.000000 112.000000 116.000000 
+114.000000 104.000000 89.000000 73.000000 60.000000 55.000000 
+66.000000 153.000000 242.000000 246.000000 181.000000 123.000000 
+98.000000 84.000000 77.000000 74.000000 73.000000 85.000000 
+112.000000 136.000000 138.000000 125.000000 116.000000 120.000000 
+127.000000 129.000000 125.000000 122.000000 121.000000 123.000000 
+127.000000 128.000000 126.000000 122.000000 120.000000 118.000000 
+115.000000 112.000000 114.000000 119.000000 129.000000 134.000000 
+131.000000 126.000000 123.000000 123.000000 122.000000 118.000000 
+112.000000 109.000000 111.000000 119.000000 126.000000 129.000000 
+134.000000 140.000000 137.000000 114.000000 80.000000 70.000000 
+84.000000 98.000000 100.000000 88.000000 73.000000 67.000000 
+74.000000 70.000000 57.000000 49.000000 61.000000 84.000000 
+103.000000 118.000000 126.000000 124.000000 118.000000 112.000000 
+103.000000 88.000000 72.000000 74.000000 94.000000 143.000000 
+188.000000 173.000000 116.000000 87.000000 76.000000 64.000000 
+62.000000 77.000000 105.000000 135.000000 150.000000 145.000000 
+127.000000 112.000000 112.000000 120.000000 123.000000 122.000000 
+123.000000 128.000000 131.000000 128.000000 126.000000 130.000000 
+134.000000 132.000000 124.000000 118.000000 119.000000 122.000000 
+121.000000 118.000000 133.000000 138.000000 131.000000 123.000000 
+120.000000 120.000000 121.000000 122.000000 122.000000 120.000000 
+119.000000 120.000000 123.000000 126.000000 130.000000 137.000000 
+139.000000 126.000000 104.000000 90.000000 95.000000 101.000000 
+91.000000 79.000000 82.000000 82.000000 77.000000 71.000000 
+66.000000 60.000000 64.000000 88.000000 112.000000 127.000000 
+129.000000 123.000000 118.000000 118.000000 115.000000 102.000000 
+94.000000 92.000000 92.000000 99.000000 120.000000 114.000000 
+84.000000 70.000000 69.000000 66.000000 69.000000 92.000000 
+126.000000 148.000000 147.000000 132.000000 118.000000 112.000000 
+117.000000 123.000000 122.000000 117.000000 116.000000 126.000000 
+140.000000 143.000000 138.000000 132.000000 131.000000 128.000000 
+123.000000 120.000000 123.000000 127.000000 128.000000 127.000000 
+124.000000 124.000000 124.000000 123.000000 122.000000 120.000000 
+122.000000 126.000000 124.000000 119.000000 115.000000 120.000000 
+127.000000 132.000000 136.000000 141.000000 140.000000 128.000000 
+112.000000 104.000000 101.000000 91.000000 75.000000 69.000000 
+74.000000 72.000000 67.000000 69.000000 80.000000 79.000000 
+69.000000 80.000000 103.000000 118.000000 119.000000 112.000000 
+103.000000 96.000000 91.000000 91.000000 95.000000 92.000000 
+74.000000 55.000000 53.000000 64.000000 79.000000 76.000000 
+71.000000 82.000000 95.000000 109.000000 125.000000 135.000000 
+127.000000 111.000000 102.000000 106.000000 115.000000 119.000000 
+118.000000 117.000000 118.000000 125.000000 137.000000 145.000000 
+143.000000 134.000000 125.000000 121.000000 121.000000 124.000000 
+127.000000 128.000000 125.000000 123.000000 122.000000 124.000000 
+126.000000 123.000000 116.000000 113.000000 118.000000 121.000000 
+119.000000 116.000000 118.000000 123.000000 123.000000 122.000000 
+125.000000 129.000000 128.000000 123.000000 119.000000 115.000000 
+104.000000 84.000000 63.000000 46.000000 35.000000 30.000000 
+24.000000 23.000000 37.000000 55.000000 64.000000 66.000000 
+81.000000 105.000000 122.000000 116.000000 90.000000 59.000000 
+42.000000 39.000000 43.000000 48.000000 45.000000 28.000000 
+26.000000 56.000000 87.000000 90.000000 77.000000 84.000000 
+101.000000 115.000000 126.000000 131.000000 123.000000 108.000000 
+100.000000 107.000000 116.000000 116.000000 111.000000 111.000000 
+118.000000 128.000000 138.000000 143.000000 141.000000 132.000000 
+123.000000 118.000000 118.000000 120.000000 124.000000 125.000000 
+123.000000 123.000000 122.000000 120.000000 123.000000 124.000000 
+121.000000 118.000000 116.000000 115.000000 116.000000 119.000000 
+122.000000 121.000000 119.000000 123.000000 132.000000 136.000000 
+132.000000 126.000000 126.000000 127.000000 117.000000 96.000000 
+73.000000 52.000000 36.000000 25.000000 17.000000 10.000000 
+4.000000 9.000000 31.000000 59.000000 83.000000 100.000000 
+105.000000 92.000000 63.000000 37.000000 22.000000 22.000000 
+25.000000 19.000000 8.000000 2.000000 22.000000 66.000000 
+98.000000 93.000000 74.000000 74.000000 90.000000 109.000000 
+122.000000 120.000000 110.000000 103.000000 108.000000 121.000000 
+127.000000 124.000000 116.000000 114.000000 122.000000 134.000000 
+141.000000 140.000000 131.000000 123.000000 119.000000 118.000000 
+118.000000 120.000000 125.000000 131.000000 133.000000 132.000000 
+128.000000 125.000000 128.000000 128.000000 124.000000 120.000000 
+119.000000 120.000000 119.000000 118.000000 118.000000 117.000000 
+116.000000 120.000000 128.000000 132.000000 129.000000 127.000000 
+126.000000 123.000000 112.000000 96.000000 79.000000 58.000000 
+41.000000 42.000000 36.000000 21.000000 12.000000 8.000000 
+13.000000 33.000000 55.000000 61.000000 50.000000 32.000000 
+11.000000 4.000000 9.000000 30.000000 46.000000 49.000000 
+46.000000 40.000000 47.000000 79.000000 104.000000 98.000000 
+90.000000 96.000000 109.000000 122.000000 130.000000 125.000000 
+114.000000 107.000000 108.000000 111.000000 111.000000 110.000000 
+111.000000 115.000000 121.000000 128.000000 134.000000 134.000000 
+127.000000 120.000000 120.000000 124.000000 126.000000 124.000000 
+122.000000 122.000000 123.000000 123.000000 139.000000 135.000000 
+129.000000 125.000000 121.000000 117.000000 115.000000 117.000000 
+122.000000 124.000000 121.000000 117.000000 118.000000 121.000000 
+122.000000 121.000000 121.000000 124.000000 127.000000 123.000000 
+116.000000 112.000000 100.000000 70.000000 40.000000 40.000000 
+41.000000 37.000000 44.000000 48.000000 44.000000 40.000000 
+36.000000 25.000000 17.000000 26.000000 36.000000 42.000000 
+47.000000 48.000000 42.000000 44.000000 58.000000 50.000000 
+46.000000 83.000000 115.000000 117.000000 112.000000 111.000000 
+115.000000 124.000000 132.000000 130.000000 118.000000 108.000000 
+107.000000 112.000000 115.000000 115.000000 115.000000 117.000000 
+119.000000 121.000000 123.000000 124.000000 124.000000 126.000000 
+128.000000 127.000000 125.000000 122.000000 121.000000 121.000000 
+122.000000 126.000000 130.000000 133.000000 125.000000 121.000000 
+124.000000 126.000000 122.000000 119.000000 121.000000 125.000000 
+126.000000 125.000000 123.000000 122.000000 121.000000 122.000000 
+124.000000 125.000000 125.000000 127.000000 129.000000 124.000000 
+106.000000 84.000000 71.000000 76.000000 83.000000 79.000000 
+75.000000 78.000000 83.000000 86.000000 85.000000 83.000000 
+77.000000 69.000000 69.000000 83.000000 102.000000 102.000000 
+69.000000 33.000000 32.000000 28.000000 34.000000 76.000000 
+110.000000 119.000000 118.000000 115.000000 115.000000 122.000000 
+128.000000 127.000000 120.000000 115.000000 117.000000 119.000000 
+117.000000 115.000000 116.000000 120.000000 122.000000 121.000000 
+120.000000 121.000000 122.000000 123.000000 123.000000 121.000000 
+119.000000 121.000000 123.000000 124.000000 123.000000 125.000000 
+118.000000 126.000000 126.000000 124.000000 128.000000 132.000000 
+132.000000 128.000000 127.000000 131.000000 135.000000 132.000000 
+126.000000 120.000000 116.000000 115.000000 117.000000 121.000000 
+126.000000 132.000000 132.000000 121.000000 105.000000 100.000000 
+111.000000 119.000000 110.000000 86.000000 64.000000 54.000000 
+55.000000 55.000000 54.000000 54.000000 55.000000 49.000000 
+44.000000 53.000000 77.000000 109.000000 126.000000 107.000000 
+55.000000 32.000000 43.000000 80.000000 116.000000 129.000000 
+128.000000 122.000000 120.000000 125.000000 130.000000 125.000000 
+114.000000 107.000000 109.000000 114.000000 116.000000 117.000000 
+118.000000 118.000000 115.000000 115.000000 119.000000 122.000000 
+120.000000 116.000000 114.000000 115.000000 116.000000 117.000000 
+119.000000 121.000000 124.000000 128.000000 111.000000 122.000000 
+129.000000 130.000000 125.000000 118.000000 115.000000 120.000000 
+130.000000 135.000000 131.000000 125.000000 124.000000 128.000000 
+128.000000 124.000000 118.000000 120.000000 126.000000 129.000000 
+126.000000 123.000000 127.000000 134.000000 128.000000 104.000000 
+71.000000 47.000000 41.000000 41.000000 40.000000 36.000000 
+33.000000 32.000000 34.000000 31.000000 28.000000 30.000000 
+29.000000 47.000000 83.000000 111.000000 109.000000 85.000000 
+77.000000 97.000000 124.000000 134.000000 129.000000 123.000000 
+123.000000 126.000000 127.000000 124.000000 121.000000 119.000000 
+117.000000 116.000000 116.000000 117.000000 120.000000 122.000000 
+121.000000 120.000000 119.000000 120.000000 120.000000 119.000000 
+119.000000 121.000000 122.000000 122.000000 123.000000 125.000000 
+128.000000 129.000000 118.000000 119.000000 124.000000 129.000000 
+127.000000 120.000000 117.000000 123.000000 131.000000 130.000000 
+123.000000 121.000000 125.000000 129.000000 130.000000 130.000000 
+131.000000 133.000000 132.000000 129.000000 125.000000 123.000000 
+120.000000 107.000000 84.000000 60.000000 46.000000 41.000000 
+35.000000 34.000000 48.000000 78.000000 105.000000 104.000000 
+80.000000 59.000000 52.000000 52.000000 47.000000 39.000000 
+49.000000 74.000000 96.000000 108.000000 117.000000 129.000000 
+140.000000 142.000000 134.000000 127.000000 129.000000 134.000000 
+133.000000 125.000000 115.000000 111.000000 113.000000 116.000000 
+117.000000 117.000000 117.000000 118.000000 120.000000 121.000000 
+122.000000 120.000000 117.000000 113.000000 113.000000 118.000000 
+126.000000 130.000000 128.000000 124.000000 125.000000 130.000000 
+127.000000 125.000000 124.000000 125.000000 126.000000 126.000000 
+126.000000 125.000000 120.000000 118.000000 119.000000 123.000000 
+126.000000 130.000000 135.000000 136.000000 131.000000 125.000000 
+124.000000 121.000000 113.000000 106.000000 105.000000 100.000000 
+81.000000 60.000000 57.000000 73.000000 91.000000 111.000000 
+158.000000 248.000000 308.000000 280.000000 199.000000 136.000000 
+108.000000 99.000000 82.000000 57.000000 46.000000 55.000000 
+74.000000 97.000000 113.000000 123.000000 131.000000 134.000000 
+133.000000 133.000000 131.000000 128.000000 120.000000 112.000000 
+108.000000 110.000000 112.000000 112.000000 112.000000 115.000000 
+121.000000 126.000000 123.000000 119.000000 116.000000 113.000000 
+110.000000 110.000000 115.000000 122.000000 126.000000 126.000000 
+125.000000 126.000000 126.000000 125.000000 126.000000 126.000000 
+130.000000 130.000000 125.000000 122.000000 124.000000 125.000000 
+122.000000 119.000000 120.000000 125.000000 133.000000 137.000000 
+134.000000 126.000000 119.000000 120.000000 127.000000 127.000000 
+114.000000 98.000000 92.000000 96.000000 103.000000 112.000000 
+130.000000 176.000000 240.000000 292.000000 344.000000 456.000000 
+533.000000 493.000000 393.000000 301.000000 212.000000 161.000000 
+138.000000 100.000000 58.000000 36.000000 40.000000 67.000000 
+87.000000 97.000000 109.000000 123.000000 132.000000 136.000000 
+134.000000 127.000000 119.000000 115.000000 114.000000 117.000000 
+120.000000 122.000000 121.000000 120.000000 122.000000 127.000000 
+130.000000 125.000000 117.000000 111.000000 110.000000 111.000000 
+112.000000 115.000000 120.000000 125.000000 130.000000 131.000000 
+130.000000 125.000000 128.000000 127.000000 126.000000 128.000000 
+128.000000 124.000000 119.000000 120.000000 126.000000 126.000000 
+121.000000 120.000000 133.000000 144.000000 141.000000 126.000000 
+115.000000 115.000000 119.000000 116.000000 102.000000 86.000000 
+83.000000 107.000000 165.000000 223.000000 247.000000 271.000000 
+327.000000 388.000000 435.000000 498.000000 526.000000 492.000000 
+435.000000 364.000000 266.000000 177.000000 146.000000 132.000000 
+88.000000 42.000000 28.000000 41.000000 60.000000 75.000000 
+93.000000 115.000000 131.000000 133.000000 128.000000 124.000000 
+119.000000 114.000000 112.000000 114.000000 115.000000 113.000000 
+113.000000 118.000000 125.000000 128.000000 126.000000 122.000000 
+120.000000 121.000000 124.000000 122.000000 112.000000 104.000000 
+106.000000 118.000000 129.000000 130.000000 126.000000 124.000000 
+138.000000 135.000000 132.000000 130.000000 128.000000 122.000000 
+116.000000 116.000000 124.000000 133.000000 135.000000 132.000000 
+129.000000 131.000000 134.000000 131.000000 127.000000 125.000000 
+118.000000 100.000000 81.000000 95.000000 159.000000 215.000000 
+227.000000 203.000000 163.000000 112.000000 86.000000 112.000000 
+179.000000 246.000000 256.000000 200.000000 130.000000 89.000000 
+74.000000 69.000000 57.000000 46.000000 28.000000 27.000000 
+36.000000 40.000000 52.000000 74.000000 97.000000 117.000000 
+131.000000 134.000000 128.000000 121.000000 119.000000 119.000000 
+115.000000 109.000000 110.000000 119.000000 130.000000 136.000000 
+138.000000 134.000000 126.000000 116.000000 113.000000 119.000000 
+127.000000 123.000000 109.000000 98.000000 101.000000 114.000000 
+127.000000 129.000000 123.000000 119.000000 137.000000 135.000000 
+129.000000 123.000000 117.000000 114.000000 115.000000 120.000000 
+127.000000 130.000000 128.000000 125.000000 126.000000 129.000000 
+131.000000 132.000000 129.000000 119.000000 100.000000 90.000000 
+110.000000 150.000000 173.000000 155.000000 98.000000 40.000000 
+53.000000 75.000000 83.000000 78.000000 76.000000 91.000000 
+103.000000 88.000000 53.000000 30.000000 30.000000 51.000000 
+65.000000 68.000000 67.000000 67.000000 63.000000 54.000000 
+46.000000 52.000000 74.000000 98.000000 110.000000 110.000000 
+114.000000 125.000000 133.000000 132.000000 124.000000 122.000000 
+128.000000 136.000000 137.000000 133.000000 129.000000 125.000000 
+122.000000 124.000000 128.000000 128.000000 117.000000 97.000000 
+86.000000 93.000000 108.000000 122.000000 133.000000 136.000000 
+130.000000 120.000000 129.000000 130.000000 126.000000 121.000000 
+115.000000 115.000000 122.000000 131.000000 136.000000 133.000000 
+128.000000 124.000000 122.000000 122.000000 128.000000 135.000000 
+133.000000 114.000000 91.000000 85.000000 95.000000 104.000000 
+98.000000 91.000000 114.000000 141.000000 134.000000 101.000000 
+73.000000 77.000000 94.000000 92.000000 66.000000 42.000000 
+39.000000 53.000000 71.000000 84.000000 97.000000 109.000000 
+113.000000 106.000000 90.000000 75.000000 69.000000 75.000000 
+92.000000 107.000000 112.000000 111.000000 114.000000 124.000000 
+131.000000 130.000000 126.000000 124.000000 124.000000 125.000000 
+127.000000 131.000000 133.000000 129.000000 121.000000 117.000000 
+121.000000 127.000000 128.000000 123.000000 118.000000 118.000000 
+124.000000 129.000000 130.000000 126.000000 122.000000 120.000000 
+120.000000 117.000000 118.000000 119.000000 117.000000 114.000000 
+115.000000 122.000000 129.000000 130.000000 125.000000 120.000000 
+122.000000 128.000000 131.000000 122.000000 105.000000 92.000000 
+90.000000 99.000000 108.000000 115.000000 125.000000 135.000000 
+136.000000 128.000000 119.000000 118.000000 121.000000 117.000000 
+104.000000 88.000000 81.000000 85.000000 95.000000 107.000000 
+115.000000 120.000000 123.000000 128.000000 133.000000 136.000000 
+131.000000 119.000000 107.000000 100.000000 104.000000 110.000000 
+115.000000 121.000000 128.000000 134.000000 137.000000 134.000000 
+125.000000 118.000000 119.000000 124.000000 128.000000 130.000000 
+132.000000 131.000000 126.000000 121.000000 123.000000 127.000000 
+122.000000 106.000000 96.000000 104.000000 125.000000 137.000000 
+133.000000 121.000000 112.000000 111.000000 115.000000 123.000000 
+127.000000 123.000000 120.000000 122.000000 128.000000 129.000000 
+126.000000 121.000000 117.000000 115.000000 118.000000 122.000000 
+120.000000 108.000000 93.000000 88.000000 97.000000 113.000000 
+126.000000 129.000000 126.000000 124.000000 125.000000 127.000000 
+128.000000 129.000000 129.000000 129.000000 126.000000 122.000000 
+118.000000 117.000000 118.000000 119.000000 124.000000 134.000000 
+142.000000 140.000000 134.000000 132.000000 136.000000 137.000000 
+125.000000 107.000000 97.000000 101.000000 114.000000 130.000000 
+139.000000 137.000000 132.000000 129.000000 125.000000 121.000000 
+122.000000 125.000000 127.000000 129.000000 131.000000 130.000000 
+126.000000 124.000000 128.000000 131.000000 124.000000 106.000000 
+96.000000 107.000000 130.000000 143.000000 135.000000 120.000000 
+115.000000 118.000000 124.000000 130.000000 123.000000 118.000000 
+124.000000 135.000000 139.000000 130.000000 121.000000 120.000000 
+125.000000 130.000000 129.000000 121.000000 111.000000 100.000000 
+92.000000 94.000000 105.000000 118.000000 126.000000 126.000000 
+122.000000 121.000000 122.000000 124.000000 123.000000 121.000000 
+122.000000 126.000000 131.000000 132.000000 129.000000 124.000000 
+123.000000 125.000000 128.000000 131.000000 131.000000 130.000000 
+129.000000 131.000000 135.000000 138.000000 132.000000 116.000000 
+97.000000 95.000000 109.000000 126.000000 137.000000 137.000000 
+134.000000 135.000000 135.000000 132.000000 125.000000 120.000000 
+118.000000 119.000000 123.000000 128.000000 131.000000 130.000000 
+130.000000 133.000000 135.000000 133.000000 129.000000 129.000000 
+133.000000 133.000000 125.000000 117.000000 115.000000 116.000000 
+129.000000 126.000000 124.000000 126.000000 130.000000 132.000000 
+132.000000 127.000000 122.000000 122.000000 127.000000 133.000000 
+130.000000 118.000000 104.000000 95.000000 91.000000 95.000000 
+106.000000 119.000000 125.000000 124.000000 120.000000 121.000000 
+123.000000 123.000000 120.000000 117.000000 116.000000 117.000000 
+120.000000 123.000000 125.000000 122.000000 120.000000 121.000000 
+123.000000 127.000000 129.000000 130.000000 129.000000 126.000000 
+124.000000 129.000000 135.000000 129.000000 108.000000 87.000000 
+80.000000 89.000000 105.000000 119.000000 126.000000 132.000000 
+134.000000 129.000000 122.000000 122.000000 126.000000 127.000000 
+124.000000 124.000000 129.000000 134.000000 132.000000 125.000000 
+124.000000 131.000000 138.000000 137.000000 129.000000 122.000000 
+118.000000 115.000000 112.000000 112.000000 126.000000 127.000000 
+130.000000 132.000000 132.000000 130.000000 128.000000 127.000000 
+127.000000 127.000000 127.000000 125.000000 121.000000 109.000000 
+96.000000 90.000000 96.000000 111.000000 123.000000 124.000000 
+120.000000 119.000000 122.000000 126.000000 128.000000 127.000000 
+125.000000 123.000000 122.000000 123.000000 124.000000 124.000000 
+122.000000 121.000000 121.000000 123.000000 125.000000 126.000000 
+126.000000 128.000000 131.000000 134.000000 133.000000 132.000000 
+134.000000 133.000000 121.000000 96.000000 77.000000 80.000000 
+101.000000 122.000000 130.000000 130.000000 130.000000 132.000000 
+133.000000 130.000000 125.000000 123.000000 126.000000 129.000000 
+131.000000 131.000000 129.000000 126.000000 124.000000 125.000000 
+128.000000 131.000000 132.000000 129.000000 123.000000 119.000000 
+119.000000 119.000000 121.000000 127.000000 129.000000 129.000000 
+130.000000 127.000000 120.000000 116.000000 123.000000 135.000000 
+139.000000 131.000000 114.000000 99.000000 93.000000 94.000000 
+104.000000 118.000000 125.000000 123.000000 120.000000 123.000000 
+129.000000 131.000000 129.000000 129.000000 130.000000 129.000000 
+125.000000 125.000000 127.000000 130.000000 130.000000 129.000000 
+128.000000 127.000000 123.000000 119.000000 118.000000 122.000000 
+128.000000 130.000000 129.000000 130.000000 136.000000 141.000000 
+131.000000 106.000000 81.000000 78.000000 95.000000 118.000000 
+130.000000 130.000000 127.000000 127.000000 130.000000 131.000000 
+131.000000 130.000000 131.000000 135.000000 137.000000 135.000000 
+129.000000 125.000000 125.000000 126.000000 127.000000 126.000000 
+126.000000 126.000000 124.000000 123.000000 121.000000 117.000000 
+122.000000 121.000000 116.000000 116.000000 124.000000 130.000000 
+126.000000 119.000000 126.000000 154.000000 181.000000 182.000000 
+151.000000 112.000000 95.000000 97.000000 107.000000 115.000000 
+119.000000 122.000000 125.000000 128.000000 129.000000 127.000000 
+122.000000 118.000000 117.000000 120.000000 121.000000 121.000000 
+120.000000 121.000000 123.000000 125.000000 125.000000 123.000000 
+121.000000 119.000000 118.000000 120.000000 124.000000 128.000000 
+130.000000 129.000000 131.000000 134.000000 133.000000 119.000000 
+101.000000 91.000000 98.000000 116.000000 131.000000 136.000000 
+135.000000 134.000000 134.000000 134.000000 132.000000 133.000000 
+135.000000 136.000000 135.000000 132.000000 129.000000 128.000000 
+128.000000 127.000000 127.000000 128.000000 130.000000 130.000000 
+126.000000 119.000000 116.000000 114.000000 115.000000 119.000000 
+123.000000 125.000000 129.000000 134.000000 130.000000 117.000000 
+111.000000 130.000000 163.000000 173.000000 147.000000 107.000000 
+89.000000 96.000000 108.000000 112.000000 112.000000 115.000000 
+120.000000 123.000000 122.000000 120.000000 119.000000 119.000000 
+119.000000 120.000000 121.000000 120.000000 120.000000 122.000000 
+125.000000 125.000000 121.000000 117.000000 113.000000 114.000000 
+119.000000 127.000000 133.000000 135.000000 132.000000 131.000000 
+132.000000 133.000000 127.000000 116.000000 106.000000 101.000000 
+105.000000 114.000000 125.000000 133.000000 134.000000 131.000000 
+127.000000 128.000000 134.000000 142.000000 146.000000 142.000000 
+135.000000 128.000000 127.000000 130.000000 133.000000 133.000000 
+129.000000 125.000000 125.000000 126.000000 125.000000 120.000000 
+117.000000 117.000000 123.000000 122.000000 123.000000 124.000000 
+126.000000 129.000000 129.000000 124.000000 122.000000 138.000000 
+162.000000 169.000000 149.000000 115.000000 98.000000 105.000000 
+118.000000 124.000000 122.000000 119.000000 119.000000 121.000000 
+124.000000 127.000000 126.000000 122.000000 120.000000 123.000000 
+126.000000 124.000000 119.000000 118.000000 120.000000 122.000000 
+122.000000 119.000000 116.000000 113.000000 111.000000 116.000000 
+124.000000 130.000000 129.000000 128.000000 132.000000 136.000000 
+131.000000 116.000000 104.000000 104.000000 113.000000 119.000000 
+117.000000 115.000000 121.000000 131.000000 135.000000 132.000000 
+130.000000 133.000000 136.000000 133.000000 126.000000 120.000000 
+122.000000 127.000000 130.000000 132.000000 133.000000 134.000000 
+133.000000 129.000000 122.000000 116.000000 114.000000 117.000000 
+127.000000 131.000000 132.000000 129.000000 126.000000 128.000000 
+131.000000 127.000000 119.000000 120.000000 136.000000 147.000000 
+137.000000 111.000000 95.000000 101.000000 118.000000 128.000000 
+125.000000 120.000000 121.000000 126.000000 125.000000 120.000000 
+115.000000 116.000000 120.000000 126.000000 129.000000 128.000000 
+122.000000 117.000000 119.000000 124.000000 124.000000 120.000000 
+118.000000 121.000000 125.000000 125.000000 126.000000 127.000000 
+127.000000 127.000000 131.000000 136.000000 133.000000 117.000000 
+101.000000 101.000000 116.000000 129.000000 129.000000 122.000000 
+120.000000 125.000000 130.000000 131.000000 131.000000 132.000000 
+135.000000 134.000000 131.000000 127.000000 125.000000 124.000000 
+124.000000 126.000000 129.000000 132.000000 131.000000 126.000000 
+118.000000 112.000000 110.000000 113.000000 128.000000 125.000000 
+126.000000 130.000000 132.000000 129.000000 124.000000 124.000000 
+126.000000 131.000000 134.000000 131.000000 117.000000 98.000000 
+90.000000 100.000000 119.000000 127.000000 121.000000 115.000000 
+116.000000 122.000000 123.000000 120.000000 120.000000 121.000000 
+120.000000 119.000000 119.000000 120.000000 117.000000 113.000000 
+114.000000 118.000000 120.000000 120.000000 119.000000 121.000000 
+122.000000 122.000000 125.000000 131.000000 133.000000 128.000000 
+125.000000 133.000000 141.000000 132.000000 108.000000 92.000000 
+101.000000 122.000000 135.000000 131.000000 122.000000 123.000000 
+131.000000 135.000000 130.000000 123.000000 122.000000 126.000000 
+129.000000 127.000000 123.000000 122.000000 126.000000 131.000000 
+134.000000 133.000000 129.000000 124.000000 120.000000 120.000000 
+120.000000 121.000000 128.000000 126.000000 124.000000 123.000000 
+123.000000 124.000000 126.000000 127.000000 126.000000 121.000000 
+114.000000 102.000000 87.000000 78.000000 84.000000 104.000000 
+123.000000 129.000000 123.000000 118.000000 120.000000 125.000000 
+124.000000 120.000000 117.000000 118.000000 118.000000 117.000000 
+117.000000 118.000000 119.000000 119.000000 118.000000 118.000000 
+120.000000 121.000000 121.000000 122.000000 124.000000 127.000000 
+130.000000 131.000000 128.000000 124.000000 125.000000 132.000000 
+137.000000 128.000000 107.000000 93.000000 99.000000 118.000000 
+131.000000 129.000000 122.000000 122.000000 129.000000 133.000000 
+132.000000 133.000000 136.000000 138.000000 135.000000 129.000000 
+128.000000 130.000000 132.000000 135.000000 138.000000 140.000000 
+133.000000 122.000000 117.000000 120.000000 126.000000 126.000000 
+119.000000 135.000000 139.000000 123.000000 107.000000 99.000000 
+92.000000 76.000000 58.000000 54.000000 59.000000 62.000000 
+66.000000 60.000000 42.000000 20.000000 15.000000 44.000000 
+79.000000 101.000000 102.000000 101.000000 103.000000 96.000000 
+70.000000 38.000000 15.000000 6.000000 25.000000 32.000000 
+30.000000 24.000000 12.000000 9.000000 19.000000 30.000000 
+30.000000 20.000000 17.000000 25.000000 22.000000 23.000000 
+26.000000 25.000000 34.000000 39.000000 49.000000 71.000000 
+92.000000 108.000000 119.000000 123.000000 112.000000 82.000000 
+52.000000 55.000000 76.000000 81.000000 43.000000 23.000000 
+78.000000 139.000000 133.000000 82.000000 80.000000 132.000000 
+162.000000 146.000000 108.000000 78.000000 74.000000 92.000000 
+108.000000 112.000000 113.000000 119.000000 92.000000 92.000000 
+99.000000 103.000000 102.000000 100.000000 98.000000 83.000000 
+58.000000 46.000000 50.000000 50.000000 65.000000 85.000000 
+78.000000 45.000000 14.000000 17.000000 57.000000 91.000000 
+102.000000 118.000000 128.000000 109.000000 91.000000 84.000000 
+50.000000 6.000000 31.000000 42.000000 42.000000 37.000000 
+21.000000 21.000000 41.000000 58.000000 60.000000 46.000000 
+29.000000 26.000000 25.000000 25.000000 34.000000 39.000000 
+40.000000 50.000000 71.000000 84.000000 91.000000 109.000000 
+133.000000 135.000000 105.000000 61.000000 43.000000 57.000000 
+78.000000 83.000000 39.000000 25.000000 79.000000 110.000000 
+85.000000 69.000000 97.000000 129.000000 128.000000 102.000000 
+74.000000 65.000000 79.000000 103.000000 118.000000 120.000000 
+121.000000 123.000000 90.000000 91.000000 109.000000 117.000000 
+109.000000 101.000000 99.000000 87.000000 60.000000 39.000000 
+40.000000 42.000000 49.000000 63.000000 63.000000 56.000000 
+44.000000 21.000000 24.000000 50.000000 88.000000 140.000000 
+157.000000 114.000000 83.000000 122.000000 108.000000 52.000000 
+27.000000 33.000000 37.000000 40.000000 38.000000 41.000000 
+52.000000 58.000000 59.000000 61.000000 63.000000 65.000000 
+56.000000 29.000000 37.000000 50.000000 53.000000 77.000000 
+114.000000 138.000000 150.000000 163.000000 171.000000 148.000000 
+92.000000 49.000000 51.000000 76.000000 87.000000 71.000000 
+30.000000 28.000000 63.000000 75.000000 75.000000 98.000000 
+120.000000 114.000000 90.000000 64.000000 51.000000 57.000000 
+78.000000 101.000000 114.000000 117.000000 117.000000 119.000000 
+110.000000 101.000000 115.000000 127.000000 126.000000 129.000000 
+122.000000 90.000000 52.000000 33.000000 32.000000 33.000000 
+34.000000 37.000000 39.000000 49.000000 50.000000 34.000000 
+24.000000 39.000000 85.000000 154.000000 193.000000 160.000000 
+92.000000 110.000000 139.000000 98.000000 32.000000 23.000000 
+34.000000 28.000000 21.000000 21.000000 23.000000 28.000000 
+42.000000 64.000000 77.000000 68.000000 41.000000 33.000000 
+50.000000 62.000000 84.000000 121.000000 151.000000 171.000000 
+184.000000 184.000000 160.000000 110.000000 63.000000 47.000000 
+60.000000 79.000000 81.000000 56.000000 26.000000 24.000000 
+39.000000 54.000000 77.000000 97.000000 104.000000 93.000000 
+71.000000 47.000000 36.000000 44.000000 68.000000 98.000000 
+122.000000 128.000000 120.000000 113.000000 122.000000 97.000000 
+81.000000 88.000000 108.000000 125.000000 127.000000 100.000000 
+53.000000 24.000000 31.000000 33.000000 31.000000 41.000000 
+53.000000 53.000000 43.000000 36.000000 37.000000 47.000000 
+67.000000 123.000000 184.000000 188.000000 130.000000 96.000000 
+124.000000 114.000000 66.000000 37.000000 25.000000 18.000000 
+25.000000 31.000000 31.000000 32.000000 42.000000 58.000000 
+52.000000 30.000000 33.000000 50.000000 48.000000 52.000000 
+76.000000 101.000000 114.000000 116.000000 119.000000 112.000000 
+82.000000 52.000000 47.000000 60.000000 69.000000 61.000000 
+39.000000 20.000000 11.000000 12.000000 28.000000 51.000000 
+65.000000 65.000000 64.000000 69.000000 69.000000 57.000000 
+40.000000 36.000000 57.000000 96.000000 128.000000 138.000000 
+131.000000 123.000000 113.000000 103.000000 92.000000 94.000000 
+106.000000 115.000000 120.000000 112.000000 73.000000 25.000000 
+15.000000 31.000000 38.000000 55.000000 72.000000 72.000000 
+63.000000 62.000000 57.000000 47.000000 43.000000 82.000000 
+143.000000 169.000000 152.000000 111.000000 99.000000 117.000000 
+109.000000 70.000000 40.000000 36.000000 33.000000 27.000000 
+26.000000 27.000000 24.000000 21.000000 29.000000 41.000000 
+56.000000 42.000000 49.000000 69.000000 72.000000 59.000000 
+48.000000 50.000000 55.000000 43.000000 31.000000 36.000000 
+48.000000 63.000000 69.000000 51.000000 24.000000 10.000000 
+7.000000 10.000000 28.000000 45.000000 48.000000 45.000000 
+49.000000 61.000000 69.000000 67.000000 53.000000 43.000000 
+53.000000 82.000000 111.000000 130.000000 136.000000 135.000000 
+107.000000 100.000000 100.000000 106.000000 114.000000 118.000000 
+114.000000 111.000000 100.000000 61.000000 15.000000 6.000000 
+23.000000 41.000000 52.000000 58.000000 61.000000 61.000000 
+54.000000 46.000000 46.000000 71.000000 115.000000 142.000000 
+143.000000 123.000000 108.000000 131.000000 134.000000 92.000000 
+61.000000 54.000000 35.000000 24.000000 23.000000 22.000000 
+20.000000 31.000000 54.000000 63.000000 32.000000 23.000000 
+66.000000 107.000000 116.000000 95.000000 58.000000 32.000000 
+23.000000 24.000000 32.000000 47.000000 65.000000 82.000000 
+79.000000 54.000000 39.000000 38.000000 34.000000 31.000000 
+30.000000 30.000000 30.000000 33.000000 44.000000 62.000000 
+80.000000 87.000000 80.000000 66.000000 57.000000 58.000000 
+75.000000 97.000000 108.000000 116.000000 112.000000 100.000000 
+96.000000 94.000000 95.000000 98.000000 100.000000 104.000000 
+107.000000 96.000000 64.000000 29.000000 18.000000 35.000000 
+51.000000 50.000000 46.000000 44.000000 41.000000 36.000000 
+40.000000 66.000000 95.000000 109.000000 111.000000 120.000000 
+133.000000 139.000000 131.000000 111.000000 82.000000 47.000000 
+47.000000 57.000000 50.000000 34.000000 32.000000 56.000000 
+62.000000 28.000000 32.000000 62.000000 87.000000 110.000000 
+132.000000 139.000000 116.000000 78.000000 56.000000 56.000000 
+56.000000 51.000000 66.000000 89.000000 85.000000 56.000000 
+34.000000 31.000000 44.000000 59.000000 57.000000 47.000000 
+40.000000 38.000000 49.000000 74.000000 103.000000 122.000000 
+121.000000 98.000000 70.000000 58.000000 69.000000 83.000000 
+85.000000 91.000000 123.000000 123.000000 119.000000 109.000000 
+96.000000 86.000000 75.000000 66.000000 70.000000 89.000000 
+99.000000 79.000000 42.000000 25.000000 32.000000 47.000000 
+54.000000 50.000000 42.000000 39.000000 52.000000 75.000000 
+85.000000 89.000000 87.000000 94.000000 120.000000 124.000000 
+106.000000 109.000000 95.000000 41.000000 48.000000 69.000000 
+64.000000 49.000000 40.000000 36.000000 20.000000 7.000000 
+45.000000 51.000000 67.000000 97.000000 118.000000 128.000000 
+127.000000 108.000000 83.000000 71.000000 71.000000 69.000000 
+76.000000 88.000000 77.000000 50.000000 16.000000 21.000000 
+60.000000 80.000000 72.000000 62.000000 58.000000 63.000000 
+78.000000 103.000000 129.000000 139.000000 125.000000 100.000000 
+88.000000 93.000000 94.000000 80.000000 73.000000 86.000000 
+135.000000 134.000000 124.000000 112.000000 109.000000 108.000000 
+98.000000 77.000000 59.000000 59.000000 73.000000 79.000000 
+64.000000 36.000000 22.000000 33.000000 46.000000 45.000000 
+36.000000 36.000000 58.000000 83.000000 97.000000 106.000000 
+104.000000 89.000000 86.000000 94.000000 95.000000 103.000000 
+93.000000 45.000000 18.000000 50.000000 59.000000 54.000000 
+32.000000 20.000000 33.000000 50.000000 42.000000 20.000000 
+55.000000 101.000000 120.000000 123.000000 124.000000 110.000000 
+80.000000 67.000000 79.000000 86.000000 83.000000 77.000000 
+62.000000 31.000000 14.000000 44.000000 81.000000 88.000000 
+80.000000 72.000000 64.000000 59.000000 76.000000 124.000000 
+179.000000 207.000000 203.000000 180.000000 146.000000 101.000000 
+66.000000 62.000000 77.000000 96.000000 134.000000 135.000000 
+127.000000 119.000000 119.000000 124.000000 119.000000 99.000000 
+68.000000 42.000000 37.000000 52.000000 62.000000 57.000000 
+43.000000 29.000000 20.000000 15.000000 16.000000 30.000000 
+58.000000 81.000000 94.000000 105.000000 118.000000 117.000000 
+98.000000 86.000000 87.000000 92.000000 87.000000 62.000000 
+23.000000 22.000000 36.000000 40.000000 18.000000 17.000000 
+59.000000 63.000000 38.000000 51.000000 79.000000 95.000000 
+100.000000 114.000000 128.000000 111.000000 78.000000 71.000000 
+75.000000 73.000000 66.000000 58.000000 42.000000 9.000000 
+22.000000 69.000000 88.000000 82.000000 84.000000 88.000000 
+80.000000 64.000000 67.000000 113.000000 167.000000 198.000000 
+214.000000 230.000000 233.000000 189.000000 121.000000 87.000000 
+90.000000 106.000000 136.000000 135.000000 125.000000 121.000000 
+127.000000 131.000000 124.000000 106.000000 80.000000 55.000000 
+49.000000 67.000000 77.000000 71.000000 63.000000 55.000000 
+37.000000 18.000000 15.000000 29.000000 46.000000 55.000000 
+65.000000 92.000000 128.000000 142.000000 129.000000 112.000000 
+107.000000 103.000000 85.000000 51.000000 21.000000 8.000000 
+16.000000 22.000000 17.000000 16.000000 27.000000 28.000000 
+47.000000 88.000000 96.000000 78.000000 66.000000 101.000000 
+140.000000 122.000000 81.000000 80.000000 76.000000 55.000000 
+40.000000 33.000000 21.000000 19.000000 50.000000 85.000000 
+95.000000 87.000000 87.000000 93.000000 94.000000 85.000000 
+71.000000 78.000000 102.000000 117.000000 117.000000 125.000000 
+154.000000 173.000000 150.000000 108.000000 94.000000 107.000000 
+134.000000 127.000000 115.000000 116.000000 128.000000 138.000000 
+135.000000 116.000000 89.000000 74.000000 88.000000 117.000000 
+120.000000 95.000000 76.000000 79.000000 86.000000 72.000000 
+59.000000 61.000000 59.000000 59.000000 75.000000 97.000000 
+117.000000 130.000000 124.000000 111.000000 102.000000 99.000000 
+93.000000 79.000000 69.000000 72.000000 68.000000 63.000000 
+56.000000 49.000000 42.000000 61.000000 113.000000 141.000000 
+118.000000 75.000000 38.000000 93.000000 165.000000 159.000000 
+93.000000 65.000000 61.000000 45.000000 26.000000 15.000000 
+17.000000 45.000000 69.000000 82.000000 94.000000 96.000000 
+90.000000 85.000000 84.000000 80.000000 73.000000 75.000000 
+90.000000 98.000000 90.000000 74.000000 66.000000 76.000000 
+92.000000 106.000000 115.000000 118.000000 119.000000 113.000000 
+112.000000 121.000000 129.000000 129.000000 122.000000 111.000000 
+95.000000 84.000000 94.000000 116.000000 124.000000 111.000000 
+92.000000 86.000000 99.000000 109.000000 108.000000 102.000000 
+87.000000 98.000000 130.000000 144.000000 139.000000 127.000000 
+105.000000 78.000000 75.000000 84.000000 102.000000 118.000000 
+126.000000 131.000000 133.000000 128.000000 126.000000 130.000000 
+132.000000 142.000000 165.000000 167.000000 123.000000 51.000000 
+33.000000 97.000000 172.000000 184.000000 114.000000 42.000000 
+30.000000 34.000000 27.000000 26.000000 42.000000 65.000000 
+74.000000 81.000000 96.000000 100.000000 84.000000 68.000000 
+63.000000 61.000000 63.000000 69.000000 75.000000 80.000000 
+88.000000 103.000000 114.000000 111.000000 105.000000 110.000000 
+119.000000 122.000000 120.000000 115.000000 118.000000 125.000000 
+122.000000 116.000000 118.000000 128.000000 127.000000 110.000000 
+98.000000 103.000000 109.000000 101.000000 82.000000 68.000000 
+77.000000 101.000000 111.000000 94.000000 82.000000 134.000000 
+190.000000 203.000000 173.000000 126.000000 79.000000 56.000000 
+76.000000 89.000000 92.000000 94.000000 109.000000 133.000000 
+141.000000 135.000000 135.000000 145.000000 151.000000 149.000000 
+147.000000 146.000000 119.000000 54.000000 81.000000 141.000000 
+180.000000 185.000000 138.000000 58.000000 21.000000 19.000000 
+33.000000 52.000000 62.000000 72.000000 78.000000 79.000000 
+83.000000 85.000000 76.000000 60.000000 50.000000 47.000000 
+52.000000 61.000000 75.000000 93.000000 110.000000 120.000000 
+118.000000 108.000000 105.000000 112.000000 118.000000 112.000000 
+122.000000 117.000000 120.000000 124.000000 120.000000 113.000000 
+116.000000 126.000000 131.000000 127.000000 126.000000 130.000000 
+123.000000 97.000000 71.000000 62.000000 71.000000 88.000000 
+90.000000 76.000000 101.000000 189.000000 243.000000 228.000000 
+164.000000 99.000000 56.000000 47.000000 69.000000 78.000000 
+70.000000 65.000000 82.000000 104.000000 108.000000 99.000000 
+99.000000 112.000000 126.000000 127.000000 120.000000 117.000000 
+105.000000 84.000000 138.000000 202.000000 207.000000 183.000000 
+144.000000 88.000000 52.000000 52.000000 78.000000 89.000000 
+68.000000 51.000000 52.000000 60.000000 66.000000 67.000000 
+63.000000 57.000000 51.000000 49.000000 56.000000 74.000000 
+97.000000 111.000000 115.000000 115.000000 120.000000 125.000000 
+124.000000 119.000000 113.000000 106.000000 122.000000 120.000000 
+123.000000 126.000000 122.000000 118.000000 118.000000 119.000000 
+119.000000 120.000000 128.000000 134.000000 135.000000 130.000000 
+120.000000 103.000000 87.000000 89.000000 91.000000 95.000000 
+161.000000 254.000000 286.000000 244.000000 157.000000 76.000000 
+42.000000 51.000000 73.000000 71.000000 52.000000 45.000000 
+59.000000 70.000000 69.000000 68.000000 78.000000 100.000000 
+117.000000 112.000000 95.000000 87.000000 82.000000 91.000000 
+182.000000 259.000000 236.000000 168.000000 137.000000 125.000000 
+118.000000 119.000000 116.000000 95.000000 62.000000 39.000000 
+40.000000 54.000000 61.000000 55.000000 54.000000 63.000000 
+73.000000 72.000000 69.000000 77.000000 99.000000 120.000000 
+126.000000 119.000000 114.000000 113.000000 114.000000 112.000000 
+107.000000 103.000000 127.000000 131.000000 131.000000 121.000000 
+113.000000 119.000000 128.000000 128.000000 122.000000 123.000000 
+125.000000 123.000000 126.000000 135.000000 139.000000 124.000000 
+110.000000 114.000000 127.000000 168.000000 275.000000 347.000000 
+320.000000 235.000000 137.000000 63.000000 41.000000 53.000000 
+68.000000 61.000000 50.000000 56.000000 74.000000 86.000000 
+82.000000 73.000000 73.000000 83.000000 88.000000 78.000000 
+69.000000 77.000000 82.000000 114.000000 234.000000 319.000000 
+269.000000 161.000000 124.000000 127.000000 124.000000 115.000000 
+95.000000 66.000000 44.000000 39.000000 53.000000 69.000000 
+74.000000 73.000000 78.000000 90.000000 100.000000 102.000000 
+102.000000 107.000000 116.000000 124.000000 126.000000 121.000000 
+114.000000 109.000000 107.000000 105.000000 103.000000 101.000000 
+127.000000 129.000000 123.000000 109.000000 102.000000 114.000000 
+129.000000 131.000000 125.000000 123.000000 121.000000 114.000000 
+111.000000 120.000000 128.000000 119.000000 112.000000 134.000000 
+182.000000 278.000000 403.000000 429.000000 321.000000 184.000000 
+111.000000 73.000000 59.000000 49.000000 49.000000 52.000000 
+57.000000 68.000000 91.000000 112.000000 112.000000 93.000000 
+76.000000 73.000000 71.000000 66.000000 61.000000 74.000000 
+76.000000 133.000000 287.000000 378.000000 314.000000 192.000000 
+133.000000 111.000000 91.000000 77.000000 68.000000 59.000000 
+60.000000 77.000000 97.000000 106.000000 108.000000 116.000000 
+122.000000 117.000000 108.000000 110.000000 123.000000 133.000000 
+133.000000 129.000000 123.000000 117.000000 113.000000 113.000000 
+115.000000 112.000000 107.000000 107.000000 127.000000 126.000000 
+121.000000 112.000000 110.000000 115.000000 120.000000 122.000000 
+124.000000 125.000000 119.000000 110.000000 112.000000 125.000000 
+134.000000 121.000000 98.000000 108.000000 169.000000 269.000000 
+374.000000 381.000000 251.000000 102.000000 72.000000 71.000000 
+68.000000 54.000000 42.000000 47.000000 58.000000 69.000000 
+90.000000 115.000000 124.000000 106.000000 76.000000 58.000000 
+53.000000 62.000000 63.000000 72.000000 58.000000 131.000000 
+299.000000 395.000000 338.000000 222.000000 150.000000 115.000000 
+86.000000 67.000000 73.000000 96.000000 119.000000 134.000000 
+137.000000 129.000000 119.000000 114.000000 111.000000 107.000000 
+107.000000 117.000000 129.000000 131.000000 124.000000 119.000000 
+121.000000 122.000000 120.000000 117.000000 117.000000 114.000000 
+110.000000 109.000000 130.000000 129.000000 123.000000 122.000000 
+126.000000 126.000000 120.000000 117.000000 120.000000 124.000000 
+124.000000 124.000000 126.000000 131.000000 139.000000 145.000000 
+131.000000 102.000000 89.000000 111.000000 165.000000 186.000000 
+132.000000 49.000000 36.000000 54.000000 69.000000 61.000000 
+42.000000 41.000000 55.000000 74.000000 95.000000 117.000000 
+130.000000 118.000000 85.000000 60.000000 58.000000 71.000000 
+73.000000 64.000000 44.000000 126.000000 292.000000 384.000000 
+332.000000 213.000000 134.000000 104.000000 93.000000 92.000000 
+108.000000 133.000000 148.000000 143.000000 127.000000 115.000000 
+113.000000 115.000000 112.000000 110.000000 115.000000 127.000000 
+136.000000 137.000000 132.000000 127.000000 124.000000 122.000000 
+120.000000 120.000000 121.000000 120.000000 116.000000 109.000000 
+132.000000 130.000000 127.000000 128.000000 128.000000 124.000000 
+120.000000 121.000000 123.000000 118.000000 114.000000 118.000000 
+125.000000 127.000000 132.000000 150.000000 162.000000 140.000000 
+91.000000 54.000000 46.000000 55.000000 69.000000 67.000000 
+60.000000 69.000000 76.000000 63.000000 48.000000 44.000000 
+49.000000 71.000000 98.000000 118.000000 125.000000 113.000000 
+88.000000 74.000000 82.000000 98.000000 95.000000 73.000000 
+57.000000 115.000000 244.000000 308.000000 255.000000 156.000000 
+102.000000 96.000000 105.000000 120.000000 135.000000 143.000000 
+143.000000 134.000000 119.000000 108.000000 107.000000 115.000000 
+123.000000 125.000000 126.000000 131.000000 138.000000 142.000000 
+140.000000 134.000000 128.000000 124.000000 122.000000 119.000000 
+116.000000 116.000000 119.000000 122.000000 130.000000 126.000000 
+124.000000 126.000000 126.000000 122.000000 121.000000 124.000000 
+125.000000 119.000000 111.000000 111.000000 119.000000 124.000000 
+123.000000 128.000000 146.000000 160.000000 147.000000 113.000000 
+77.000000 62.000000 70.000000 79.000000 72.000000 64.000000 
+59.000000 56.000000 56.000000 53.000000 51.000000 61.000000 
+80.000000 97.000000 107.000000 102.000000 83.000000 71.000000 
+78.000000 93.000000 97.000000 86.000000 61.000000 70.000000 
+124.000000 144.000000 122.000000 95.000000 83.000000 85.000000 
+95.000000 111.000000 130.000000 136.000000 125.000000 110.000000 
+105.000000 113.000000 122.000000 127.000000 127.000000 124.000000 
+122.000000 127.000000 139.000000 149.000000 147.000000 136.000000 
+124.000000 117.000000 114.000000 116.000000 119.000000 121.000000 
+121.000000 120.000000 124.000000 124.000000 126.000000 127.000000 
+124.000000 122.000000 121.000000 121.000000 119.000000 115.000000 
+111.000000 112.000000 120.000000 130.000000 132.000000 128.000000 
+132.000000 148.000000 155.000000 143.000000 116.000000 80.000000 
+54.000000 47.000000 32.000000 19.000000 18.000000 27.000000 
+39.000000 43.000000 44.000000 45.000000 53.000000 73.000000 
+89.000000 86.000000 69.000000 52.000000 45.000000 46.000000 
+49.000000 45.000000 27.000000 29.000000 38.000000 48.000000 
+61.000000 68.000000 70.000000 77.000000 92.000000 113.000000 
+128.000000 127.000000 113.000000 104.000000 107.000000 118.000000 
+125.000000 126.000000 122.000000 115.000000 112.000000 118.000000 
+132.000000 142.000000 139.000000 127.000000 117.000000 116.000000 
+120.000000 123.000000 124.000000 123.000000 122.000000 124.000000 
+124.000000 127.000000 127.000000 124.000000 122.000000 122.000000 
+121.000000 117.000000 111.000000 109.000000 110.000000 113.000000 
+119.000000 129.000000 138.000000 139.000000 136.000000 137.000000 
+143.000000 145.000000 135.000000 107.000000 64.000000 37.000000 
+28.000000 21.000000 19.000000 20.000000 27.000000 32.000000 
+28.000000 17.000000 15.000000 29.000000 49.000000 56.000000 
+50.000000 41.000000 37.000000 34.000000 24.000000 13.000000 
+10.000000 2.000000 17.000000 55.000000 77.000000 80.000000 
+79.000000 85.000000 104.000000 124.000000 128.000000 115.000000 
+101.000000 102.000000 113.000000 119.000000 116.000000 112.000000 
+113.000000 115.000000 117.000000 124.000000 132.000000 134.000000 
+129.000000 121.000000 116.000000 117.000000 121.000000 126.000000 
+128.000000 128.000000 129.000000 133.000000 131.000000 132.000000 
+131.000000 129.000000 126.000000 124.000000 122.000000 118.000000 
+115.000000 116.000000 120.000000 122.000000 123.000000 126.000000 
+131.000000 134.000000 131.000000 124.000000 123.000000 130.000000 
+134.000000 119.000000 80.000000 41.000000 27.000000 31.000000 
+37.000000 41.000000 39.000000 35.000000 26.000000 16.000000 
+11.000000 14.000000 30.000000 41.000000 41.000000 38.000000 
+34.000000 27.000000 13.000000 5.000000 12.000000 17.000000 
+49.000000 83.000000 93.000000 90.000000 89.000000 96.000000 
+110.000000 122.000000 123.000000 114.000000 105.000000 108.000000 
+115.000000 118.000000 113.000000 107.000000 108.000000 116.000000 
+125.000000 132.000000 134.000000 130.000000 125.000000 122.000000 
+122.000000 124.000000 125.000000 124.000000 122.000000 121.000000 
+123.000000 124.000000 135.000000 132.000000 127.000000 125.000000 
+126.000000 127.000000 127.000000 125.000000 123.000000 124.000000 
+126.000000 125.000000 120.000000 118.000000 122.000000 127.000000 
+128.000000 125.000000 128.000000 135.000000 136.000000 122.000000 
+97.000000 68.000000 42.000000 37.000000 56.000000 78.000000 
+91.000000 88.000000 76.000000 64.000000 58.000000 62.000000 
+65.000000 62.000000 62.000000 67.000000 74.000000 76.000000 
+68.000000 44.000000 25.000000 34.000000 56.000000 79.000000 
+87.000000 85.000000 93.000000 110.000000 125.000000 128.000000 
+124.000000 119.000000 116.000000 115.000000 114.000000 115.000000 
+117.000000 118.000000 117.000000 117.000000 120.000000 125.000000 
+127.000000 126.000000 122.000000 120.000000 118.000000 118.000000 
+121.000000 126.000000 129.000000 126.000000 123.000000 122.000000 
+128.000000 123.000000 119.000000 124.000000 130.000000 128.000000 
+122.000000 121.000000 125.000000 126.000000 122.000000 119.000000 
+118.000000 120.000000 121.000000 122.000000 122.000000 123.000000 
+127.000000 132.000000 134.000000 126.000000 106.000000 80.000000 
+61.000000 73.000000 110.000000 129.000000 126.000000 108.000000 
+90.000000 82.000000 87.000000 92.000000 86.000000 77.000000 
+72.000000 83.000000 111.000000 138.000000 140.000000 113.000000 
+75.000000 53.000000 59.000000 75.000000 86.000000 92.000000 
+103.000000 118.000000 129.000000 130.000000 125.000000 119.000000 
+115.000000 115.000000 116.000000 119.000000 122.000000 123.000000 
+121.000000 116.000000 111.000000 111.000000 118.000000 125.000000 
+127.000000 124.000000 118.000000 115.000000 116.000000 122.000000 
+129.000000 132.000000 131.000000 129.000000 119.000000 124.000000 
+124.000000 127.000000 132.000000 130.000000 122.000000 120.000000 
+127.000000 132.000000 129.000000 123.000000 122.000000 124.000000 
+123.000000 123.000000 124.000000 127.000000 127.000000 126.000000 
+123.000000 111.000000 91.000000 79.000000 93.000000 114.000000 
+114.000000 91.000000 63.000000 45.000000 43.000000 45.000000 
+45.000000 45.000000 42.000000 39.000000 40.000000 52.000000 
+82.000000 115.000000 134.000000 137.000000 126.000000 110.000000 
+101.000000 98.000000 98.000000 107.000000 119.000000 124.000000 
+122.000000 122.000000 125.000000 125.000000 121.000000 116.000000 
+117.000000 119.000000 119.000000 118.000000 119.000000 120.000000 
+117.000000 115.000000 117.000000 121.000000 122.000000 117.000000 
+115.000000 117.000000 119.000000 119.000000 121.000000 124.000000 
+125.000000 125.000000 115.000000 129.000000 130.000000 121.000000 
+119.000000 125.000000 130.000000 130.000000 130.000000 132.000000 
+132.000000 129.000000 126.000000 125.000000 126.000000 125.000000 
+122.000000 122.000000 125.000000 130.000000 130.000000 125.000000 
+117.000000 113.000000 111.000000 104.000000 85.000000 62.000000 
+48.000000 47.000000 49.000000 46.000000 39.000000 35.000000 
+38.000000 41.000000 40.000000 34.000000 35.000000 53.000000 
+86.000000 119.000000 135.000000 126.000000 111.000000 105.000000 
+109.000000 116.000000 118.000000 117.000000 119.000000 123.000000 
+126.000000 125.000000 122.000000 121.000000 121.000000 118.000000 
+113.000000 110.000000 114.000000 120.000000 121.000000 118.000000 
+117.000000 118.000000 119.000000 119.000000 121.000000 123.000000 
+123.000000 121.000000 121.000000 125.000000 129.000000 129.000000 
+110.000000 117.000000 125.000000 127.000000 125.000000 121.000000 
+122.000000 126.000000 130.000000 129.000000 126.000000 126.000000 
+128.000000 129.000000 127.000000 124.000000 123.000000 122.000000 
+123.000000 125.000000 129.000000 133.000000 133.000000 125.000000 
+106.000000 84.000000 65.000000 52.000000 45.000000 41.000000 
+49.000000 66.000000 81.000000 80.000000 65.000000 51.000000 
+42.000000 33.000000 24.000000 30.000000 58.000000 95.000000 
+115.000000 111.000000 100.000000 100.000000 109.000000 116.000000 
+118.000000 119.000000 125.000000 133.000000 138.000000 138.000000 
+134.000000 126.000000 120.000000 116.000000 119.000000 123.000000 
+124.000000 120.000000 117.000000 116.000000 118.000000 117.000000 
+116.000000 117.000000 121.000000 126.000000 126.000000 122.000000 
+121.000000 124.000000 124.000000 120.000000 133.000000 126.000000 
+126.000000 128.000000 125.000000 122.000000 124.000000 128.000000 
+126.000000 118.000000 115.000000 120.000000 126.000000 127.000000 
+125.000000 125.000000 128.000000 132.000000 134.000000 131.000000 
+126.000000 126.000000 130.000000 127.000000 108.000000 77.000000 
+51.000000 41.000000 42.000000 64.000000 114.000000 180.000000 
+220.000000 198.000000 138.000000 93.000000 73.000000 59.000000 
+38.000000 31.000000 50.000000 78.000000 96.000000 102.000000 
+102.000000 104.000000 108.000000 116.000000 127.000000 137.000000 
+138.000000 131.000000 125.000000 123.000000 122.000000 118.000000 
+116.000000 117.000000 120.000000 121.000000 122.000000 125.000000 
+125.000000 123.000000 120.000000 115.000000 111.000000 109.000000 
+110.000000 114.000000 117.000000 119.000000 122.000000 127.000000 
+130.000000 128.000000 131.000000 131.000000 131.000000 129.000000 
+129.000000 132.000000 132.000000 127.000000 122.000000 124.000000 
+129.000000 131.000000 127.000000 123.000000 122.000000 125.000000 
+130.000000 137.000000 139.000000 134.000000 124.000000 115.000000 
+111.000000 107.000000 91.000000 66.000000 39.000000 44.000000 
+88.000000 171.000000 269.000000 361.000000 404.000000 370.000000 
+295.000000 214.000000 141.000000 93.000000 58.000000 43.000000 
+52.000000 73.000000 90.000000 94.000000 86.000000 85.000000 
+98.000000 117.000000 131.000000 137.000000 135.000000 127.000000 
+118.000000 115.000000 120.000000 128.000000 131.000000 126.000000 
+118.000000 114.000000 119.000000 128.000000 133.000000 131.000000 
+123.000000 115.000000 110.000000 112.000000 116.000000 116.000000 
+114.000000 114.000000 120.000000 128.000000 129.000000 121.000000 
+119.000000 129.000000 137.000000 137.000000 132.000000 127.000000 
+124.000000 126.000000 129.000000 127.000000 120.000000 119.000000 
+124.000000 127.000000 125.000000 125.000000 130.000000 132.000000 
+126.000000 119.000000 112.000000 94.000000 72.000000 62.000000 
+61.000000 55.000000 30.000000 42.000000 166.000000 333.000000 
+451.000000 519.000000 542.000000 532.000000 495.000000 385.000000 
+219.000000 103.000000 68.000000 67.000000 66.000000 65.000000 
+67.000000 66.000000 59.000000 66.000000 97.000000 128.000000 
+139.000000 136.000000 134.000000 132.000000 123.000000 113.000000 
+114.000000 121.000000 125.000000 123.000000 123.000000 122.000000 
+120.000000 120.000000 128.000000 135.000000 130.000000 118.000000 
+110.000000 111.000000 113.000000 111.000000 109.000000 113.000000 
+121.000000 128.000000 128.000000 124.000000 132.000000 137.000000 
+134.000000 126.000000 120.000000 118.000000 121.000000 124.000000 
+125.000000 124.000000 125.000000 128.000000 133.000000 136.000000 
+135.000000 130.000000 123.000000 119.000000 121.000000 123.000000 
+110.000000 79.000000 53.000000 54.000000 74.000000 82.000000 
+55.000000 27.000000 71.000000 161.000000 265.000000 352.000000 
+366.000000 310.000000 232.000000 157.000000 88.000000 51.000000 
+49.000000 62.000000 68.000000 63.000000 50.000000 42.000000 
+44.000000 59.000000 85.000000 115.000000 140.000000 150.000000 
+146.000000 131.000000 118.000000 116.000000 121.000000 122.000000 
+119.000000 117.000000 119.000000 123.000000 125.000000 127.000000 
+130.000000 125.000000 116.000000 117.000000 131.000000 135.000000 
+111.000000 78.000000 70.000000 94.000000 126.000000 138.000000 
+130.000000 123.000000 132.000000 131.000000 129.000000 125.000000 
+124.000000 125.000000 126.000000 123.000000 120.000000 122.000000 
+128.000000 131.000000 130.000000 128.000000 128.000000 128.000000 
+131.000000 134.000000 130.000000 112.000000 88.000000 75.000000 
+77.000000 78.000000 70.000000 67.000000 69.000000 72.000000 
+70.000000 67.000000 91.000000 138.000000 152.000000 117.000000 
+71.000000 52.000000 50.000000 59.000000 68.000000 69.000000 
+66.000000 59.000000 47.000000 35.000000 34.000000 48.000000 
+80.000000 118.000000 141.000000 139.000000 126.000000 123.000000 
+131.000000 134.000000 126.000000 120.000000 124.000000 133.000000 
+132.000000 125.000000 122.000000 126.000000 129.000000 127.000000 
+128.000000 132.000000 133.000000 119.000000 95.000000 86.000000 
+95.000000 110.000000 127.000000 137.000000 135.000000 129.000000 
+133.000000 132.000000 126.000000 122.000000 121.000000 122.000000 
+121.000000 120.000000 124.000000 128.000000 130.000000 128.000000 
+125.000000 124.000000 124.000000 124.000000 123.000000 117.000000 
+106.000000 94.000000 89.000000 99.000000 115.000000 128.000000 
+131.000000 124.000000 108.000000 90.000000 79.000000 83.000000 
+87.000000 74.000000 49.000000 30.000000 28.000000 35.000000 
+47.000000 62.000000 79.000000 92.000000 92.000000 78.000000 
+68.000000 69.000000 72.000000 76.000000 86.000000 102.000000 
+120.000000 132.000000 134.000000 132.000000 132.000000 131.000000 
+128.000000 126.000000 126.000000 131.000000 137.000000 140.000000 
+136.000000 127.000000 123.000000 126.000000 130.000000 128.000000 
+116.000000 105.000000 107.000000 113.000000 112.000000 113.000000 
+121.000000 126.000000 126.000000 121.000000 118.000000 119.000000 
+125.000000 130.000000 127.000000 121.000000 119.000000 125.000000 
+132.000000 131.000000 127.000000 123.000000 123.000000 126.000000 
+129.000000 128.000000 118.000000 100.000000 86.000000 87.000000 
+101.000000 115.000000 125.000000 131.000000 137.000000 137.000000 
+129.000000 115.000000 104.000000 100.000000 96.000000 83.000000 
+62.000000 46.000000 50.000000 71.000000 95.000000 110.000000 
+119.000000 130.000000 136.000000 127.000000 104.000000 92.000000 
+103.000000 122.000000 130.000000 119.000000 110.000000 115.000000 
+128.000000 136.000000 137.000000 135.000000 130.000000 120.000000 
+114.000000 119.000000 133.000000 142.000000 142.000000 133.000000 
+125.000000 122.000000 125.000000 130.000000 132.000000 127.000000 
+117.000000 110.000000 113.000000 121.000000 125.000000 123.000000 
+119.000000 118.000000 118.000000 123.000000 128.000000 129.000000 
+125.000000 122.000000 123.000000 125.000000 125.000000 122.000000 
+121.000000 127.000000 133.000000 130.000000 117.000000 102.000000 
+94.000000 93.000000 97.000000 106.000000 117.000000 125.000000 
+128.000000 128.000000 127.000000 125.000000 121.000000 119.000000 
+122.000000 126.000000 122.000000 110.000000 98.000000 94.000000 
+100.000000 111.000000 123.000000 132.000000 134.000000 132.000000 
+134.000000 136.000000 133.000000 123.000000 123.000000 135.000000 
+144.000000 140.000000 130.000000 129.000000 141.000000 148.000000 
+141.000000 128.000000 122.000000 122.000000 121.000000 121.000000 
+128.000000 138.000000 143.000000 135.000000 122.000000 118.000000 
+129.000000 141.000000 132.000000 102.000000 76.000000 83.000000 
+114.000000 136.000000 130.000000 115.000000 111.000000 117.000000 
+126.000000 126.000000 123.000000 119.000000 118.000000 119.000000 
+122.000000 124.000000 122.000000 115.000000 110.000000 114.000000 
+124.000000 130.000000 124.000000 108.000000 95.000000 92.000000 
+101.000000 117.000000 126.000000 128.000000 127.000000 126.000000 
+126.000000 126.000000 127.000000 129.000000 128.000000 125.000000 
+119.000000 115.000000 116.000000 119.000000 123.000000 126.000000 
+130.000000 134.000000 134.000000 129.000000 125.000000 126.000000 
+128.000000 122.000000 113.000000 116.000000 131.000000 150.000000 
+161.000000 159.000000 152.000000 145.000000 137.000000 129.000000 
+124.000000 121.000000 123.000000 127.000000 131.000000 133.000000 
+131.000000 126.000000 123.000000 125.000000 131.000000 135.000000 
+128.000000 116.000000 108.000000 110.000000 119.000000 127.000000 
+125.000000 118.000000 113.000000 113.000000 116.000000 125.000000 
+130.000000 126.000000 119.000000 117.000000 119.000000 120.000000 
+121.000000 120.000000 119.000000 115.000000 111.000000 112.000000 
+114.000000 106.000000 98.000000 104.000000 119.000000 128.000000 
+127.000000 124.000000 125.000000 127.000000 124.000000 121.000000 
+122.000000 123.000000 118.000000 112.000000 111.000000 115.000000 
+115.000000 113.000000 116.000000 123.000000 128.000000 127.000000 
+126.000000 125.000000 124.000000 126.000000 132.000000 137.000000 
+130.000000 120.000000 125.000000 145.000000 160.000000 154.000000 
+137.000000 126.000000 130.000000 136.000000 134.000000 129.000000 
+128.000000 127.000000 124.000000 121.000000 122.000000 126.000000 
+130.000000 129.000000 127.000000 126.000000 127.000000 129.000000 
+133.000000 134.000000 132.000000 128.000000 125.000000 121.000000 
+117.000000 115.000000 124.000000 132.000000 133.000000 127.000000 
+126.000000 131.000000 134.000000 129.000000 120.000000 115.000000 
+117.000000 122.000000 123.000000 119.000000 114.000000 112.000000 
+117.000000 126.000000 128.000000 122.000000 118.000000 123.000000 
+131.000000 133.000000 129.000000 126.000000 127.000000 127.000000 
+122.000000 117.000000 114.000000 115.000000 115.000000 114.000000 
+116.000000 119.000000 121.000000 120.000000 122.000000 127.000000 
+131.000000 131.000000 132.000000 133.000000 128.000000 115.000000 
+111.000000 127.000000 145.000000 147.000000 134.000000 123.000000 
+125.000000 136.000000 139.000000 132.000000 127.000000 128.000000 
+129.000000 125.000000 122.000000 123.000000 128.000000 131.000000 
+132.000000 129.000000 125.000000 122.000000 124.000000 132.000000 
+137.000000 132.000000 122.000000 115.000000 112.000000 111.000000 
+123.000000 126.000000 128.000000 129.000000 131.000000 133.000000 
+133.000000 131.000000 131.000000 139.000000 154.000000 158.000000 
+144.000000 125.000000 112.000000 110.000000 117.000000 120.000000 
+120.000000 120.000000 125.000000 131.000000 132.000000 129.000000 
+124.000000 121.000000 124.000000 128.000000 128.000000 127.000000 
+125.000000 126.000000 126.000000 122.000000 119.000000 118.000000 
+119.000000 119.000000 118.000000 121.000000 127.000000 130.000000 
+129.000000 130.000000 131.000000 129.000000 122.000000 125.000000 
+134.000000 138.000000 135.000000 129.000000 128.000000 134.000000 
+137.000000 133.000000 128.000000 126.000000 125.000000 121.000000 
+119.000000 123.000000 131.000000 133.000000 131.000000 129.000000 
+128.000000 128.000000 129.000000 133.000000 134.000000 127.000000 
+114.000000 107.000000 108.000000 111.000000 123.000000 123.000000 
+120.000000 119.000000 127.000000 139.000000 136.000000 113.000000 
+98.000000 115.000000 153.000000 167.000000 142.000000 106.000000 
+90.000000 103.000000 122.000000 129.000000 129.000000 129.000000 
+132.000000 134.000000 133.000000 129.000000 124.000000 121.000000 
+122.000000 127.000000 130.000000 130.000000 131.000000 132.000000 
+130.000000 122.000000 117.000000 119.000000 123.000000 123.000000 
+120.000000 120.000000 125.000000 128.000000 127.000000 127.000000 
+130.000000 132.000000 128.000000 127.000000 131.000000 135.000000 
+136.000000 134.000000 130.000000 131.000000 134.000000 133.000000 
+130.000000 126.000000 126.000000 126.000000 126.000000 124.000000 
+124.000000 127.000000 132.000000 134.000000 131.000000 126.000000 
+124.000000 128.000000 130.000000 125.000000 119.000000 118.000000 
+119.000000 116.000000 121.000000 121.000000 120.000000 119.000000 
+122.000000 127.000000 125.000000 115.000000 112.000000 127.000000 
+152.000000 163.000000 142.000000 108.000000 96.000000 109.000000 
+127.000000 129.000000 121.000000 118.000000 124.000000 130.000000 
+128.000000 122.000000 119.000000 120.000000 122.000000 122.000000 
+121.000000 122.000000 124.000000 127.000000 129.000000 128.000000 
+125.000000 122.000000 121.000000 123.000000 125.000000 126.000000 
+128.000000 129.000000 126.000000 123.000000 124.000000 127.000000 
+126.000000 120.000000 121.000000 129.000000 138.000000 140.000000 
+132.000000 127.000000 132.000000 137.000000 134.000000 127.000000 
+128.000000 132.000000 132.000000 125.000000 122.000000 128.000000 
+135.000000 136.000000 130.000000 125.000000 125.000000 127.000000 
+127.000000 123.000000 119.000000 114.000000 110.000000 109.000000 
+126.000000 125.000000 124.000000 125.000000 127.000000 126.000000 
+119.000000 109.000000 105.000000 115.000000 130.000000 138.000000 
+127.000000 106.000000 94.000000 100.000000 116.000000 127.000000 
+126.000000 122.000000 121.000000 124.000000 126.000000 125.000000 
+124.000000 124.000000 124.000000 123.000000 123.000000 125.000000 
+125.000000 126.000000 125.000000 124.000000 124.000000 126.000000 
+126.000000 123.000000 118.000000 118.000000 125.000000 130.000000 
+128.000000 124.000000 128.000000 136.000000 134.000000 121.000000 
+115.000000 125.000000 141.000000 147.000000 138.000000 131.000000 
+136.000000 144.000000 143.000000 134.000000 131.000000 133.000000 
+135.000000 135.000000 135.000000 137.000000 139.000000 138.000000 
+135.000000 131.000000 127.000000 124.000000 121.000000 120.000000 
+117.000000 115.000000 113.000000 111.000000 127.000000 126.000000 
+123.000000 121.000000 124.000000 129.000000 128.000000 122.000000 
+121.000000 128.000000 135.000000 131.000000 114.000000 98.000000 
+96.000000 109.000000 122.000000 128.000000 128.000000 126.000000 
+125.000000 126.000000 125.000000 124.000000 124.000000 125.000000 
+126.000000 128.000000 127.000000 125.000000 124.000000 125.000000 
+128.000000 129.000000 127.000000 125.000000 127.000000 129.000000 
+127.000000 123.000000 122.000000 124.000000 125.000000 126.000000 
+131.000000 138.000000 135.000000 119.000000 110.000000 121.000000 
+143.000000 154.000000 146.000000 131.000000 129.000000 139.000000 
+145.000000 143.000000 136.000000 134.000000 132.000000 130.000000 
+129.000000 132.000000 138.000000 140.000000 134.000000 125.000000 
+120.000000 122.000000 125.000000 124.000000 117.000000 110.000000 
+110.000000 115.000000 132.000000 131.000000 127.000000 125.000000 
+126.000000 124.000000 117.000000 113.000000 120.000000 136.000000 
+144.000000 130.000000 106.000000 92.000000 97.000000 110.000000 
+120.000000 123.000000 121.000000 117.000000 117.000000 122.000000 
+128.000000 129.000000 127.000000 124.000000 125.000000 125.000000 
+123.000000 121.000000 121.000000 123.000000 124.000000 125.000000 
+126.000000 128.000000 127.000000 126.000000 123.000000 123.000000 
+127.000000 131.000000 132.000000 127.000000 123.000000 127.000000 
+132.000000 123.000000 104.000000 99.000000 119.000000 147.000000 
+159.000000 147.000000 131.000000 129.000000 138.000000 140.000000 
+135.000000 132.000000 133.000000 133.000000 129.000000 127.000000 
+130.000000 134.000000 132.000000 128.000000 127.000000 129.000000 
+129.000000 123.000000 117.000000 116.000000 118.000000 119.000000 
+125.000000 119.000000 119.000000 126.000000 135.000000 137.000000 
+131.000000 132.000000 145.000000 157.000000 146.000000 112.000000 
+84.000000 83.000000 98.000000 112.000000 121.000000 127.000000 
+130.000000 128.000000 123.000000 121.000000 121.000000 120.000000 
+118.000000 118.000000 119.000000 118.000000 116.000000 117.000000 
+121.000000 123.000000 122.000000 121.000000 125.000000 129.000000 
+129.000000 126.000000 126.000000 129.000000 133.000000 134.000000 
+133.000000 130.000000 128.000000 130.000000 133.000000 127.000000 
+110.000000 93.000000 93.000000 111.000000 133.000000 142.000000 
+138.000000 131.000000 128.000000 129.000000 128.000000 127.000000 
+128.000000 129.000000 127.000000 124.000000 124.000000 128.000000 
+131.000000 131.000000 129.000000 128.000000 125.000000 121.000000 
+118.000000 120.000000 124.000000 125.000000 143.000000 164.000000 
+154.000000 129.000000 111.000000 91.000000 65.000000 39.000000 
+21.000000 17.000000 28.000000 56.000000 68.000000 56.000000 
+54.000000 57.000000 31.000000 13.000000 55.000000 78.000000 
+85.000000 91.000000 91.000000 77.000000 57.000000 35.000000 
+22.000000 23.000000 21.000000 19.000000 28.000000 30.000000 
+19.000000 16.000000 23.000000 29.000000 31.000000 32.000000 
+30.000000 38.000000 52.000000 58.000000 51.000000 45.000000 
+35.000000 27.000000 48.000000 76.000000 92.000000 101.000000 
+110.000000 119.000000 109.000000 70.000000 18.000000 28.000000 
+70.000000 96.000000 91.000000 42.000000 21.000000 59.000000 
+82.000000 71.000000 69.000000 94.000000 119.000000 123.000000 
+107.000000 88.000000 78.000000 71.000000 67.000000 75.000000 
+97.000000 125.000000 89.000000 95.000000 115.000000 135.000000 
+141.000000 120.000000 79.000000 39.000000 21.000000 21.000000 
+25.000000 37.000000 47.000000 44.000000 44.000000 53.000000 
+36.000000 12.000000 39.000000 74.000000 101.000000 121.000000 
+127.000000 116.000000 95.000000 69.000000 40.000000 22.000000 
+19.000000 12.000000 21.000000 34.000000 33.000000 29.000000 
+34.000000 41.000000 45.000000 47.000000 49.000000 54.000000 
+52.000000 45.000000 37.000000 16.000000 14.000000 35.000000 
+75.000000 101.000000 104.000000 106.000000 117.000000 120.000000 
+99.000000 43.000000 18.000000 50.000000 89.000000 100.000000 
+76.000000 21.000000 18.000000 51.000000 59.000000 67.000000 
+95.000000 120.000000 122.000000 105.000000 82.000000 68.000000 
+68.000000 75.000000 80.000000 83.000000 90.000000 102.000000 
+88.000000 76.000000 94.000000 119.000000 127.000000 116.000000 
+87.000000 43.000000 14.000000 20.000000 27.000000 29.000000 
+30.000000 24.000000 37.000000 62.000000 59.000000 38.000000 
+41.000000 76.000000 111.000000 133.000000 148.000000 149.000000 
+138.000000 131.000000 113.000000 68.000000 20.000000 0.000000 
+13.000000 17.000000 14.000000 16.000000 20.000000 27.000000 
+36.000000 45.000000 53.000000 55.000000 47.000000 34.000000 
+11.000000 4.000000 30.000000 66.000000 94.000000 111.000000 
+123.000000 135.000000 138.000000 116.000000 62.000000 19.000000 
+35.000000 74.000000 96.000000 88.000000 53.000000 19.000000 
+20.000000 38.000000 58.000000 88.000000 113.000000 117.000000 
+104.000000 83.000000 65.000000 59.000000 65.000000 79.000000 
+96.000000 104.000000 103.000000 100.000000 102.000000 77.000000 
+76.000000 99.000000 118.000000 115.000000 91.000000 55.000000 
+18.000000 5.000000 21.000000 21.000000 12.000000 10.000000 
+23.000000 49.000000 58.000000 49.000000 46.000000 66.000000 
+96.000000 129.000000 158.000000 166.000000 154.000000 151.000000 
+161.000000 146.000000 100.000000 54.000000 27.000000 11.000000 
+8.000000 17.000000 27.000000 30.000000 30.000000 37.000000 
+40.000000 38.000000 40.000000 23.000000 10.000000 45.000000 
+97.000000 135.000000 156.000000 169.000000 176.000000 164.000000 
+127.000000 76.000000 20.000000 24.000000 65.000000 90.000000 
+92.000000 74.000000 45.000000 22.000000 14.000000 26.000000 
+55.000000 80.000000 88.000000 85.000000 78.000000 69.000000 
+64.000000 65.000000 75.000000 93.000000 109.000000 113.000000 
+107.000000 104.000000 106.000000 90.000000 81.000000 93.000000 
+115.000000 128.000000 122.000000 97.000000 57.000000 17.000000 
+8.000000 18.000000 14.000000 9.000000 9.000000 24.000000 
+38.000000 41.000000 38.000000 42.000000 66.000000 106.000000 
+140.000000 152.000000 141.000000 129.000000 136.000000 153.000000 
+150.000000 114.000000 68.000000 51.000000 39.000000 18.000000 
+30.000000 40.000000 29.000000 14.000000 20.000000 26.000000 
+19.000000 12.000000 40.000000 101.000000 157.000000 185.000000 
+187.000000 182.000000 171.000000 138.000000 83.000000 28.000000 
+7.000000 38.000000 77.000000 83.000000 61.000000 35.000000 
+21.000000 13.000000 15.000000 33.000000 54.000000 67.000000 
+67.000000 61.000000 58.000000 62.000000 69.000000 72.000000 
+75.000000 93.000000 119.000000 137.000000 132.000000 116.000000 
+121.000000 117.000000 109.000000 112.000000 131.000000 147.000000 
+143.000000 126.000000 101.000000 60.000000 22.000000 10.000000 
+10.000000 10.000000 14.000000 27.000000 40.000000 43.000000 
+38.000000 38.000000 55.000000 86.000000 126.000000 148.000000 
+141.000000 117.000000 108.000000 119.000000 128.000000 128.000000 
+123.000000 110.000000 79.000000 36.000000 14.000000 20.000000 
+20.000000 14.000000 25.000000 21.000000 5.000000 30.000000 
+79.000000 134.000000 174.000000 180.000000 165.000000 145.000000 
+121.000000 85.000000 35.000000 14.000000 25.000000 38.000000 
+46.000000 44.000000 26.000000 9.000000 9.000000 24.000000 
+39.000000 45.000000 49.000000 59.000000 69.000000 73.000000 
+76.000000 82.000000 84.000000 81.000000 78.000000 84.000000 
+100.000000 116.000000 123.000000 122.000000 125.000000 114.000000 
+101.000000 102.000000 118.000000 127.000000 125.000000 129.000000 
+124.000000 94.000000 54.000000 24.000000 14.000000 14.000000 
+17.000000 24.000000 32.000000 37.000000 38.000000 33.000000 
+29.000000 65.000000 107.000000 137.000000 146.000000 138.000000 
+127.000000 124.000000 135.000000 155.000000 155.000000 124.000000 
+91.000000 65.000000 28.000000 8.000000 18.000000 32.000000 
+32.000000 17.000000 23.000000 67.000000 107.000000 133.000000 
+153.000000 157.000000 140.000000 114.000000 82.000000 41.000000 
+7.000000 12.000000 42.000000 56.000000 44.000000 29.000000 
+20.000000 11.000000 16.000000 34.000000 53.000000 61.000000 
+58.000000 59.000000 70.000000 86.000000 102.000000 107.000000 
+96.000000 76.000000 67.000000 73.000000 78.000000 76.000000 
+80.000000 99.000000 124.000000 116.000000 94.000000 71.000000 
+66.000000 78.000000 98.000000 121.000000 129.000000 120.000000 
+100.000000 72.000000 43.000000 24.000000 19.000000 19.000000 
+20.000000 25.000000 29.000000 19.000000 9.000000 50.000000 
+82.000000 106.000000 132.000000 152.000000 146.000000 129.000000 
+142.000000 165.000000 156.000000 118.000000 94.000000 69.000000 
+38.000000 31.000000 22.000000 32.000000 32.000000 19.000000 
+31.000000 75.000000 121.000000 142.000000 151.000000 147.000000 
+128.000000 99.000000 70.000000 39.000000 22.000000 25.000000 
+51.000000 80.000000 72.000000 43.000000 28.000000 12.000000 
+21.000000 45.000000 57.000000 64.000000 74.000000 86.000000 
+98.000000 108.000000 110.000000 100.000000 83.000000 69.000000 
+68.000000 72.000000 66.000000 52.000000 52.000000 75.000000 
+120.000000 114.000000 96.000000 68.000000 49.000000 55.000000 
+77.000000 96.000000 111.000000 121.000000 117.000000 97.000000 
+73.000000 53.000000 39.000000 28.000000 17.000000 12.000000 
+16.000000 13.000000 13.000000 38.000000 68.000000 96.000000 
+125.000000 147.000000 144.000000 126.000000 134.000000 151.000000 
+151.000000 142.000000 135.000000 106.000000 67.000000 65.000000 
+35.000000 26.000000 45.000000 56.000000 77.000000 110.000000 
+133.000000 140.000000 147.000000 161.000000 160.000000 120.000000 
+64.000000 35.000000 39.000000 51.000000 58.000000 63.000000 
+59.000000 38.000000 18.000000 20.000000 40.000000 57.000000 
+66.000000 76.000000 92.000000 111.000000 121.000000 113.000000 
+96.000000 86.000000 88.000000 92.000000 89.000000 80.000000 
+68.000000 58.000000 57.000000 73.000000 122.000000 114.000000 
+102.000000 86.000000 77.000000 83.000000 95.000000 102.000000 
+105.000000 108.000000 105.000000 100.000000 94.000000 82.000000 
+57.000000 31.000000 13.000000 5.000000 7.000000 12.000000 
+25.000000 41.000000 64.000000 93.000000 118.000000 135.000000 
+141.000000 132.000000 120.000000 113.000000 119.000000 142.000000 
+159.000000 138.000000 90.000000 52.000000 32.000000 56.000000 
+93.000000 110.000000 118.000000 124.000000 124.000000 125.000000 
+138.000000 161.000000 160.000000 114.000000 45.000000 27.000000 
+53.000000 75.000000 70.000000 49.000000 38.000000 26.000000 
+7.000000 30.000000 65.000000 76.000000 81.000000 95.000000 
+112.000000 122.000000 128.000000 133.000000 142.000000 156.000000 
+168.000000 169.000000 153.000000 124.000000 90.000000 68.000000 
+66.000000 75.000000 124.000000 122.000000 115.000000 108.000000 
+106.000000 103.000000 98.000000 91.000000 90.000000 95.000000 
+95.000000 85.000000 73.000000 66.000000 61.000000 52.000000 
+36.000000 17.000000 9.000000 21.000000 36.000000 53.000000 
+78.000000 104.000000 122.000000 132.000000 137.000000 132.000000 
+118.000000 103.000000 97.000000 107.000000 121.000000 113.000000 
+89.000000 62.000000 53.000000 83.000000 115.000000 118.000000 
+108.000000 109.000000 114.000000 120.000000 123.000000 126.000000 
+122.000000 87.000000 35.000000 39.000000 63.000000 66.000000 
+51.000000 41.000000 32.000000 16.000000 30.000000 72.000000 
+104.000000 111.000000 108.000000 108.000000 109.000000 113.000000 
+140.000000 192.000000 237.000000 241.000000 213.000000 205.000000 
+234.000000 247.000000 202.000000 130.000000 88.000000 85.000000 
+128.000000 124.000000 119.000000 119.000000 117.000000 104.000000 
+85.000000 71.000000 67.000000 65.000000 57.000000 50.000000 
+50.000000 52.000000 59.000000 75.000000 86.000000 75.000000 
+58.000000 70.000000 83.000000 82.000000 90.000000 112.000000 
+132.000000 147.000000 153.000000 147.000000 129.000000 107.000000 
+87.000000 75.000000 78.000000 84.000000 89.000000 91.000000 
+79.000000 68.000000 72.000000 82.000000 101.000000 123.000000 
+125.000000 107.000000 94.000000 109.000000 129.000000 102.000000 
+42.000000 37.000000 51.000000 47.000000 35.000000 34.000000 
+17.000000 17.000000 73.000000 129.000000 142.000000 132.000000 
+128.000000 124.000000 114.000000 116.000000 154.000000 213.000000 
+241.000000 216.000000 172.000000 149.000000 166.000000 200.000000 
+203.000000 158.000000 113.000000 97.000000 137.000000 128.000000 
+118.000000 115.000000 117.000000 117.000000 110.000000 97.000000 
+76.000000 57.000000 53.000000 63.000000 70.000000 63.000000 
+61.000000 78.000000 103.000000 108.000000 92.000000 97.000000 
+109.000000 92.000000 76.000000 87.000000 112.000000 133.000000 
+137.000000 123.000000 109.000000 103.000000 94.000000 78.000000 
+66.000000 72.000000 88.000000 95.000000 88.000000 77.000000 
+72.000000 84.000000 108.000000 121.000000 112.000000 88.000000 
+76.000000 101.000000 132.000000 119.000000 60.000000 22.000000 
+30.000000 39.000000 34.000000 21.000000 14.000000 53.000000 
+116.000000 152.000000 147.000000 128.000000 127.000000 137.000000 
+136.000000 128.000000 138.000000 164.000000 170.000000 146.000000 
+112.000000 83.000000 63.000000 65.000000 85.000000 104.000000 
+118.000000 118.000000 136.000000 127.000000 114.000000 105.000000 
+106.000000 113.000000 118.000000 110.000000 96.000000 95.000000 
+111.000000 122.000000 109.000000 89.000000 81.000000 83.000000 
+86.000000 89.000000 90.000000 89.000000 74.000000 51.000000 
+60.000000 89.000000 116.000000 115.000000 89.000000 69.000000 
+80.000000 102.000000 103.000000 86.000000 86.000000 104.000000 
+119.000000 118.000000 106.000000 96.000000 87.000000 85.000000 
+93.000000 103.000000 102.000000 86.000000 69.000000 86.000000 
+122.000000 124.000000 75.000000 15.000000 7.000000 25.000000 
+32.000000 29.000000 46.000000 82.000000 117.000000 134.000000 
+130.000000 121.000000 127.000000 141.000000 138.000000 114.000000 
+93.000000 94.000000 102.000000 94.000000 73.000000 63.000000 
+78.000000 99.000000 110.000000 119.000000 129.000000 133.000000 
+139.000000 126.000000 113.000000 109.000000 113.000000 119.000000 
+120.000000 116.000000 112.000000 115.000000 122.000000 122.000000 
+113.000000 97.000000 79.000000 67.000000 68.000000 80.000000 
+87.000000 71.000000 39.000000 49.000000 92.000000 129.000000 
+140.000000 112.000000 65.000000 53.000000 68.000000 81.000000 
+81.000000 73.000000 95.000000 126.000000 133.000000 122.000000 
+111.000000 103.000000 92.000000 86.000000 96.000000 112.000000 
+115.000000 92.000000 72.000000 89.000000 121.000000 131.000000 
+106.000000 65.000000 45.000000 54.000000 69.000000 80.000000 
+87.000000 92.000000 103.000000 113.000000 117.000000 112.000000 
+104.000000 96.000000 89.000000 82.000000 70.000000 58.000000 
+55.000000 63.000000 79.000000 97.000000 113.000000 126.000000 
+135.000000 136.000000 128.000000 118.000000 135.000000 119.000000 
+112.000000 120.000000 130.000000 134.000000 133.000000 132.000000 
+126.000000 114.000000 104.000000 104.000000 104.000000 92.000000 
+70.000000 55.000000 58.000000 68.000000 67.000000 49.000000 
+44.000000 101.000000 146.000000 153.000000 130.000000 90.000000 
+56.000000 61.000000 70.000000 67.000000 60.000000 59.000000 
+81.000000 103.000000 105.000000 96.000000 92.000000 93.000000 
+98.000000 105.000000 112.000000 113.000000 104.000000 86.000000 
+88.000000 105.000000 112.000000 113.000000 109.000000 97.000000 
+88.000000 93.000000 105.000000 107.000000 94.000000 86.000000 
+91.000000 99.000000 98.000000 81.000000 59.000000 47.000000 
+49.000000 54.000000 50.000000 45.000000 57.000000 81.000000 
+109.000000 129.000000 133.000000 129.000000 124.000000 118.000000 
+110.000000 102.000000 126.000000 119.000000 124.000000 129.000000 
+128.000000 124.000000 127.000000 133.000000 127.000000 113.000000 
+110.000000 121.000000 128.000000 120.000000 100.000000 81.000000 
+71.000000 72.000000 73.000000 68.000000 91.000000 154.000000 
+188.000000 168.000000 118.000000 74.000000 57.000000 61.000000 
+64.000000 58.000000 47.000000 51.000000 68.000000 80.000000 
+83.000000 80.000000 75.000000 78.000000 92.000000 103.000000 
+98.000000 87.000000 87.000000 96.000000 113.000000 126.000000 
+121.000000 108.000000 101.000000 92.000000 84.000000 92.000000 
+103.000000 95.000000 71.000000 57.000000 59.000000 63.000000 
+58.000000 49.000000 51.000000 63.000000 66.000000 52.000000 
+40.000000 53.000000 89.000000 119.000000 127.000000 125.000000 
+123.000000 117.000000 104.000000 93.000000 94.000000 100.000000 
+120.000000 126.000000 134.000000 133.000000 123.000000 118.000000 
+121.000000 121.000000 113.000000 106.000000 108.000000 116.000000 
+124.000000 129.000000 128.000000 118.000000 109.000000 108.000000 
+105.000000 103.000000 145.000000 221.000000 252.000000 200.000000 
+111.000000 60.000000 51.000000 52.000000 50.000000 44.000000 
+47.000000 60.000000 66.000000 68.000000 73.000000 76.000000 
+69.000000 63.000000 70.000000 79.000000 77.000000 77.000000 
+96.000000 113.000000 127.000000 160.000000 166.000000 142.000000 
+127.000000 111.000000 85.000000 71.000000 72.000000 69.000000 
+57.000000 51.000000 55.000000 60.000000 60.000000 67.000000 
+85.000000 99.000000 97.000000 80.000000 73.000000 85.000000 
+107.000000 123.000000 123.000000 115.000000 110.000000 105.000000 
+98.000000 93.000000 93.000000 97.000000 115.000000 126.000000 
+130.000000 123.000000 119.000000 123.000000 127.000000 122.000000 
+116.000000 115.000000 114.000000 112.000000 116.000000 126.000000 
+129.000000 126.000000 135.000000 153.000000 167.000000 205.000000 
+280.000000 324.000000 297.000000 208.000000 94.000000 42.000000 
+43.000000 56.000000 53.000000 41.000000 47.000000 68.000000 
+83.000000 85.000000 82.000000 73.000000 58.000000 44.000000 
+43.000000 56.000000 68.000000 74.000000 88.000000 90.000000 
+145.000000 233.000000 244.000000 183.000000 145.000000 126.000000 
+90.000000 56.000000 50.000000 63.000000 75.000000 82.000000 
+90.000000 98.000000 105.000000 114.000000 120.000000 120.000000 
+116.000000 116.000000 120.000000 119.000000 116.000000 117.000000 
+122.000000 122.000000 116.000000 108.000000 103.000000 102.000000 
+101.000000 99.000000 124.000000 134.000000 130.000000 117.000000 
+112.000000 120.000000 129.000000 130.000000 127.000000 123.000000 
+115.000000 109.000000 112.000000 124.000000 128.000000 121.000000 
+128.000000 169.000000 241.000000 369.000000 470.000000 425.000000 
+277.000000 151.000000 84.000000 60.000000 55.000000 59.000000 
+58.000000 52.000000 49.000000 61.000000 89.000000 117.000000 
+121.000000 96.000000 64.000000 46.000000 49.000000 65.000000 
+75.000000 70.000000 64.000000 61.000000 181.000000 324.000000 
+348.000000 262.000000 198.000000 166.000000 113.000000 67.000000 
+59.000000 84.000000 110.000000 121.000000 124.000000 124.000000 
+123.000000 125.000000 129.000000 128.000000 124.000000 125.000000 
+130.000000 130.000000 125.000000 122.000000 125.000000 122.000000 
+112.000000 107.000000 113.000000 120.000000 115.000000 104.000000 
+128.000000 126.000000 124.000000 123.000000 121.000000 119.000000 
+122.000000 126.000000 126.000000 121.000000 111.000000 100.000000 
+99.000000 114.000000 135.000000 138.000000 124.000000 135.000000 
+195.000000 323.000000 429.000000 372.000000 190.000000 67.000000 
+68.000000 78.000000 75.000000 60.000000 56.000000 59.000000 
+57.000000 63.000000 95.000000 137.000000 152.000000 124.000000 
+81.000000 55.000000 50.000000 63.000000 75.000000 70.000000 
+53.000000 52.000000 197.000000 390.000000 461.000000 374.000000 
+253.000000 168.000000 111.000000 86.000000 92.000000 119.000000 
+137.000000 132.000000 119.000000 117.000000 123.000000 125.000000 
+123.000000 120.000000 117.000000 119.000000 128.000000 137.000000 
+137.000000 131.000000 126.000000 122.000000 118.000000 117.000000 
+122.000000 126.000000 120.000000 110.000000 124.000000 113.000000 
+115.000000 126.000000 129.000000 120.000000 113.000000 117.000000 
+124.000000 124.000000 118.000000 113.000000 113.000000 122.000000 
+136.000000 144.000000 132.000000 112.000000 106.000000 131.000000 
+173.000000 156.000000 89.000000 45.000000 52.000000 64.000000 
+63.000000 47.000000 43.000000 50.000000 62.000000 82.000000 
+110.000000 134.000000 138.000000 117.000000 85.000000 61.000000 
+59.000000 81.000000 101.000000 87.000000 57.000000 54.000000 
+189.000000 381.000000 475.000000 401.000000 238.000000 124.000000 
+91.000000 104.000000 120.000000 133.000000 142.000000 140.000000 
+128.000000 119.000000 121.000000 123.000000 117.000000 110.000000 
+110.000000 119.000000 130.000000 137.000000 134.000000 126.000000 
+120.000000 123.000000 131.000000 132.000000 125.000000 117.000000 
+115.000000 117.000000 122.000000 123.000000 124.000000 123.000000 
+120.000000 118.000000 117.000000 117.000000 115.000000 113.000000 
+113.000000 118.000000 123.000000 127.000000 127.000000 127.000000 
+133.000000 138.000000 131.000000 104.000000 70.000000 58.000000 
+66.000000 68.000000 64.000000 63.000000 49.000000 41.000000 
+41.000000 41.000000 48.000000 69.000000 93.000000 105.000000 
+101.000000 79.000000 49.000000 36.000000 54.000000 94.000000 
+117.000000 108.000000 90.000000 97.000000 166.000000 258.000000 
+293.000000 242.000000 152.000000 92.000000 81.000000 103.000000 
+125.000000 129.000000 131.000000 138.000000 138.000000 125.000000 
+113.000000 110.000000 111.000000 113.000000 118.000000 127.000000 
+135.000000 136.000000 131.000000 125.000000 122.000000 122.000000 
+126.000000 129.000000 126.000000 121.000000 120.000000 124.000000 
+119.000000 124.000000 124.000000 121.000000 120.000000 123.000000 
+123.000000 115.000000 106.000000 104.000000 111.000000 117.000000 
+121.000000 124.000000 126.000000 127.000000 135.000000 148.000000 
+154.000000 143.000000 120.000000 95.000000 78.000000 77.000000 
+71.000000 59.000000 54.000000 68.000000 74.000000 57.000000 
+37.000000 35.000000 49.000000 68.000000 73.000000 55.000000 
+23.000000 9.000000 23.000000 50.000000 67.000000 77.000000 
+90.000000 100.000000 101.000000 97.000000 75.000000 49.000000 
+49.000000 74.000000 99.000000 117.000000 125.000000 123.000000 
+121.000000 123.000000 125.000000 120.000000 114.000000 115.000000 
+119.000000 119.000000 117.000000 120.000000 128.000000 132.000000 
+131.000000 129.000000 126.000000 122.000000 118.000000 118.000000 
+124.000000 127.000000 126.000000 123.000000 122.000000 119.000000 
+116.000000 117.000000 120.000000 123.000000 123.000000 118.000000 
+113.000000 110.000000 112.000000 116.000000 122.000000 127.000000 
+129.000000 130.000000 132.000000 137.000000 146.000000 150.000000 
+140.000000 107.000000 70.000000 64.000000 64.000000 54.000000 
+56.000000 72.000000 79.000000 69.000000 50.000000 40.000000 
+53.000000 80.000000 96.000000 87.000000 60.000000 31.000000 
+12.000000 2.000000 0.000000 12.000000 36.000000 46.000000 
+47.000000 40.000000 33.000000 39.000000 58.000000 87.000000 
+116.000000 134.000000 132.000000 116.000000 105.000000 110.000000 
+122.000000 125.000000 116.000000 110.000000 109.000000 109.000000 
+108.000000 115.000000 127.000000 133.000000 127.000000 119.000000 
+120.000000 125.000000 125.000000 121.000000 119.000000 123.000000 
+127.000000 127.000000 132.000000 129.000000 128.000000 131.000000 
+134.000000 129.000000 118.000000 109.000000 107.000000 112.000000 
+117.000000 118.000000 118.000000 120.000000 124.000000 129.000000 
+130.000000 128.000000 128.000000 135.000000 138.000000 121.000000 
+85.000000 61.000000 55.000000 44.000000 48.000000 57.000000 
+61.000000 59.000000 58.000000 67.000000 86.000000 104.000000 
+109.000000 101.000000 90.000000 77.000000 67.000000 60.000000 
+38.000000 18.000000 17.000000 15.000000 29.000000 56.000000 
+70.000000 73.000000 83.000000 107.000000 128.000000 133.000000 
+123.000000 113.000000 112.000000 118.000000 122.000000 117.000000 
+108.000000 103.000000 102.000000 105.000000 112.000000 120.000000 
+126.000000 127.000000 124.000000 123.000000 124.000000 125.000000 
+123.000000 119.000000 116.000000 116.000000 118.000000 121.000000 
+129.000000 128.000000 128.000000 129.000000 129.000000 126.000000 
+122.000000 117.000000 113.000000 111.000000 114.000000 118.000000 
+120.000000 120.000000 122.000000 125.000000 125.000000 119.000000 
+116.000000 125.000000 138.000000 134.000000 104.000000 67.000000 
+42.000000 37.000000 60.000000 81.000000 85.000000 78.000000 
+67.000000 61.000000 65.000000 80.000000 92.000000 93.000000 
+89.000000 94.000000 105.000000 108.000000 94.000000 61.000000 
+34.000000 35.000000 59.000000 76.000000 77.000000 78.000000 
+95.000000 119.000000 130.000000 123.000000 113.000000 112.000000 
+118.000000 122.000000 121.000000 119.000000 117.000000 116.000000 
+115.000000 115.000000 117.000000 119.000000 120.000000 123.000000 
+126.000000 124.000000 119.000000 117.000000 122.000000 130.000000 
+134.000000 132.000000 127.000000 124.000000 127.000000 131.000000 
+133.000000 131.000000 126.000000 121.000000 120.000000 119.000000 
+117.000000 116.000000 119.000000 123.000000 121.000000 114.000000 
+111.000000 115.000000 121.000000 123.000000 127.000000 137.000000 
+146.000000 139.000000 111.000000 74.000000 47.000000 47.000000 
+67.000000 83.000000 85.000000 74.000000 64.000000 63.000000 
+67.000000 67.000000 60.000000 52.000000 57.000000 86.000000 
+119.000000 132.000000 117.000000 89.000000 73.000000 81.000000 
+91.000000 88.000000 80.000000 85.000000 103.000000 120.000000 
+124.000000 122.000000 122.000000 126.000000 126.000000 124.000000 
+122.000000 119.000000 114.000000 109.000000 108.000000 112.000000 
+117.000000 119.000000 118.000000 115.000000 113.000000 115.000000 
+120.000000 124.000000 124.000000 125.000000 131.000000 135.000000 
+131.000000 121.000000 122.000000 124.000000 124.000000 127.000000 
+131.000000 128.000000 120.000000 118.000000 123.000000 128.000000 
+127.000000 123.000000 119.000000 117.000000 117.000000 120.000000 
+123.000000 125.000000 125.000000 126.000000 125.000000 115.000000 
+94.000000 75.000000 66.000000 68.000000 72.000000 70.000000 
+64.000000 58.000000 58.000000 61.000000 65.000000 61.000000 
+51.000000 42.000000 46.000000 64.000000 89.000000 110.000000 
+122.000000 114.000000 91.000000 82.000000 81.000000 73.000000 
+73.000000 87.000000 105.000000 119.000000 125.000000 126.000000 
+128.000000 130.000000 128.000000 122.000000 117.000000 115.000000 
+115.000000 117.000000 120.000000 125.000000 125.000000 121.000000 
+118.000000 117.000000 117.000000 120.000000 125.000000 128.000000 
+127.000000 125.000000 125.000000 126.000000 121.000000 112.000000 
+110.000000 119.000000 121.000000 123.000000 129.000000 130.000000 
+125.000000 121.000000 122.000000 126.000000 125.000000 122.000000 
+123.000000 126.000000 128.000000 128.000000 127.000000 126.000000 
+125.000000 127.000000 129.000000 121.000000 100.000000 76.000000 
+65.000000 69.000000 71.000000 63.000000 52.000000 48.000000 
+52.000000 55.000000 51.000000 45.000000 42.000000 40.000000 
+31.000000 26.000000 36.000000 65.000000 98.000000 111.000000 
+91.000000 64.000000 59.000000 70.000000 88.000000 106.000000 
+117.000000 125.000000 129.000000 128.000000 127.000000 126.000000 
+126.000000 121.000000 116.000000 113.000000 115.000000 119.000000 
+123.000000 126.000000 125.000000 122.000000 121.000000 125.000000 
+129.000000 128.000000 123.000000 121.000000 123.000000 127.000000 
+129.000000 128.000000 124.000000 119.000000 99.000000 114.000000 
+125.000000 128.000000 124.000000 124.000000 126.000000 127.000000 
+128.000000 129.000000 131.000000 131.000000 130.000000 130.000000 
+130.000000 131.000000 130.000000 129.000000 129.000000 129.000000 
+127.000000 121.000000 111.000000 98.000000 86.000000 76.000000 
+65.000000 51.000000 40.000000 37.000000 40.000000 47.000000 
+47.000000 44.000000 43.000000 45.000000 42.000000 35.000000 
+32.000000 42.000000 62.000000 80.000000 86.000000 81.000000 
+79.000000 89.000000 107.000000 123.000000 130.000000 128.000000 
+125.000000 124.000000 126.000000 125.000000 121.000000 115.000000 
+113.000000 118.000000 124.000000 125.000000 123.000000 121.000000 
+120.000000 121.000000 120.000000 118.000000 117.000000 118.000000 
+123.000000 127.000000 128.000000 124.000000 120.000000 120.000000 
+123.000000 124.000000 127.000000 125.000000 127.000000 127.000000 
+122.000000 117.000000 117.000000 122.000000 126.000000 125.000000 
+122.000000 122.000000 126.000000 131.000000 133.000000 131.000000 
+129.000000 132.000000 137.000000 137.000000 131.000000 127.000000 
+127.000000 122.000000 104.000000 78.000000 59.000000 50.000000 
+46.000000 52.000000 76.000000 113.000000 143.000000 144.000000 
+116.000000 82.000000 58.000000 48.000000 45.000000 53.000000 
+70.000000 84.000000 89.000000 87.000000 90.000000 99.000000 
+109.000000 118.000000 128.000000 134.000000 134.000000 128.000000 
+125.000000 127.000000 130.000000 128.000000 122.000000 119.000000 
+121.000000 125.000000 126.000000 124.000000 121.000000 120.000000 
+117.000000 112.000000 107.000000 108.000000 115.000000 122.000000 
+124.000000 121.000000 119.000000 121.000000 126.000000 129.000000 
+131.000000 133.000000 140.000000 141.000000 134.000000 125.000000 
+121.000000 125.000000 128.000000 129.000000 129.000000 130.000000 
+132.000000 131.000000 127.000000 125.000000 129.000000 137.000000 
+143.000000 141.000000 135.000000 131.000000 132.000000 128.000000 
+115.000000 90.000000 63.000000 56.000000 77.000000 133.000000 
+206.000000 267.000000 297.000000 285.000000 238.000000 171.000000 
+107.000000 64.000000 44.000000 52.000000 78.000000 97.000000 
+105.000000 103.000000 98.000000 100.000000 108.000000 122.000000 
+136.000000 140.000000 134.000000 129.000000 127.000000 130.000000 
+135.000000 137.000000 134.000000 127.000000 119.000000 117.000000 
+122.000000 126.000000 126.000000 122.000000 116.000000 109.000000 
+102.000000 103.000000 112.000000 121.000000 120.000000 112.000000 
+107.000000 114.000000 124.000000 126.000000 123.000000 128.000000 
+131.000000 132.000000 135.000000 134.000000 130.000000 127.000000 
+130.000000 135.000000 137.000000 138.000000 138.000000 133.000000 
+122.000000 117.000000 125.000000 136.000000 139.000000 135.000000 
+130.000000 122.000000 111.000000 112.000000 120.000000 105.000000 
+63.000000 45.000000 105.000000 263.000000 402.000000 467.000000 
+485.000000 486.000000 458.000000 349.000000 178.000000 53.000000 
+31.000000 73.000000 110.000000 118.000000 113.000000 101.000000 
+88.000000 83.000000 97.000000 120.000000 132.000000 128.000000 
+125.000000 126.000000 121.000000 114.000000 115.000000 127.000000 
+134.000000 128.000000 119.000000 120.000000 126.000000 130.000000 
+129.000000 126.000000 122.000000 114.000000 108.000000 111.000000 
+117.000000 121.000000 120.000000 118.000000 118.000000 120.000000 
+120.000000 116.000000 122.000000 130.000000 130.000000 130.000000 
+132.000000 135.000000 134.000000 132.000000 131.000000 129.000000 
+125.000000 124.000000 127.000000 131.000000 131.000000 129.000000 
+127.000000 126.000000 126.000000 125.000000 117.000000 101.000000 
+89.000000 95.000000 105.000000 94.000000 64.000000 50.000000 
+111.000000 233.000000 360.000000 480.000000 556.000000 539.000000 
+431.000000 281.000000 143.000000 69.000000 72.000000 98.000000 
+109.000000 108.000000 98.000000 80.000000 66.000000 70.000000 
+96.000000 122.000000 133.000000 135.000000 136.000000 134.000000 
+127.000000 123.000000 127.000000 131.000000 128.000000 122.000000 
+122.000000 124.000000 121.000000 118.000000 123.000000 129.000000 
+126.000000 116.000000 114.000000 122.000000 125.000000 116.000000 
+108.000000 112.000000 123.000000 128.000000 123.000000 119.000000 
+132.000000 134.000000 132.000000 130.000000 132.000000 135.000000 
+134.000000 129.000000 124.000000 126.000000 131.000000 131.000000 
+125.000000 120.000000 122.000000 127.000000 129.000000 128.000000 
+124.000000 115.000000 100.000000 86.000000 80.000000 83.000000 
+94.000000 105.000000 103.000000 80.000000 50.000000 41.000000 
+97.000000 190.000000 234.000000 192.000000 103.000000 46.000000 
+55.000000 69.000000 69.000000 67.000000 69.000000 75.000000 
+77.000000 72.000000 69.000000 81.000000 101.000000 120.000000 
+130.000000 130.000000 126.000000 127.000000 135.000000 141.000000 
+137.000000 129.000000 126.000000 129.000000 127.000000 120.000000 
+118.000000 127.000000 135.000000 131.000000 123.000000 125.000000 
+137.000000 140.000000 119.000000 86.000000 67.000000 75.000000 
+100.000000 122.000000 131.000000 130.000000 134.000000 134.000000 
+130.000000 126.000000 123.000000 123.000000 125.000000 127.000000 
+130.000000 133.000000 134.000000 129.000000 121.000000 117.000000 
+118.000000 122.000000 124.000000 119.000000 109.000000 98.000000 
+92.000000 92.000000 94.000000 94.000000 94.000000 94.000000 
+90.000000 78.000000 64.000000 59.000000 60.000000 54.000000 
+42.000000 33.000000 37.000000 45.000000 47.000000 51.000000 
+62.000000 77.000000 79.000000 66.000000 61.000000 71.000000 
+86.000000 99.000000 107.000000 116.000000 130.000000 138.000000 
+134.000000 130.000000 132.000000 136.000000 133.000000 126.000000 
+123.000000 126.000000 131.000000 131.000000 127.000000 123.000000 
+123.000000 125.000000 127.000000 123.000000 114.000000 100.000000 
+89.000000 93.000000 101.000000 104.000000 109.000000 118.000000 
+125.000000 126.000000 122.000000 126.000000 129.000000 127.000000 
+122.000000 117.000000 117.000000 121.000000 128.000000 133.000000 
+134.000000 131.000000 127.000000 126.000000 128.000000 129.000000 
+127.000000 122.000000 119.000000 119.000000 120.000000 121.000000 
+124.000000 125.000000 126.000000 126.000000 121.000000 109.000000 
+90.000000 74.000000 63.000000 55.000000 45.000000 35.000000 
+35.000000 50.000000 70.000000 85.000000 95.000000 108.000000 
+119.000000 116.000000 100.000000 87.000000 92.000000 110.000000 
+126.000000 132.000000 133.000000 131.000000 128.000000 128.000000 
+133.000000 137.000000 133.000000 124.000000 116.000000 117.000000 
+125.000000 135.000000 138.000000 131.000000 123.000000 120.000000 
+122.000000 124.000000 125.000000 128.000000 131.000000 129.000000 
+118.000000 108.000000 112.000000 124.000000 126.000000 119.000000 
+122.000000 123.000000 121.000000 121.000000 123.000000 122.000000 
+121.000000 122.000000 128.000000 131.000000 125.000000 116.000000 
+115.000000 126.000000 137.000000 135.000000 123.000000 117.000000 
+121.000000 129.000000 130.000000 127.000000 128.000000 134.000000 
+138.000000 135.000000 126.000000 115.000000 107.000000 100.000000 
+94.000000 86.000000 76.000000 63.000000 57.000000 67.000000 
+88.000000 107.000000 118.000000 123.000000 126.000000 127.000000 
+125.000000 124.000000 124.000000 119.000000 110.000000 107.000000 
+116.000000 125.000000 125.000000 122.000000 123.000000 126.000000 
+126.000000 121.000000 118.000000 123.000000 134.000000 144.000000 
+146.000000 139.000000 129.000000 125.000000 132.000000 140.000000 
+133.000000 116.000000 106.000000 111.000000 120.000000 121.000000 
+115.000000 113.000000 119.000000 125.000000 119.000000 122.000000 
+122.000000 121.000000 121.000000 121.000000 122.000000 127.000000 
+129.000000 125.000000 114.000000 109.000000 115.000000 125.000000 
+126.000000 119.000000 118.000000 127.000000 133.000000 131.000000 
+128.000000 129.000000 132.000000 130.000000 126.000000 124.000000 
+124.000000 121.000000 118.000000 117.000000 115.000000 106.000000 
+92.000000 82.000000 86.000000 101.000000 117.000000 128.000000 
+131.000000 130.000000 131.000000 131.000000 127.000000 122.000000 
+122.000000 127.000000 130.000000 122.000000 111.000000 111.000000 
+118.000000 121.000000 121.000000 120.000000 119.000000 119.000000 
+122.000000 129.000000 136.000000 140.000000 138.000000 134.000000 
+128.000000 122.000000 122.000000 131.000000 135.000000 122.000000 
+101.000000 96.000000 113.000000 131.000000 131.000000 119.000000 
+114.000000 119.000000 119.000000 122.000000 123.000000 122.000000 
+122.000000 124.000000 125.000000 125.000000 130.000000 139.000000 
+143.000000 135.000000 123.000000 118.000000 119.000000 125.000000 
+132.000000 134.000000 131.000000 125.000000 124.000000 129.000000 
+134.000000 130.000000 123.000000 121.000000 124.000000 126.000000 
+123.000000 119.000000 112.000000 102.000000 91.000000 89.000000 
+99.000000 114.000000 127.000000 132.000000 132.000000 128.000000 
+126.000000 128.000000 131.000000 128.000000 122.000000 122.000000 
+132.000000 143.000000 139.000000 125.000000 118.000000 122.000000 
+131.000000 133.000000 128.000000 123.000000 124.000000 129.000000 
+133.000000 134.000000 132.000000 129.000000 128.000000 127.000000 
+125.000000 123.000000 122.000000 120.000000 121.000000 126.000000 
+134.000000 136.000000 128.000000 116.000000 112.000000 117.000000 
+113.000000 121.000000 127.000000 126.000000 124.000000 125.000000 
+128.000000 127.000000 126.000000 130.000000 134.000000 130.000000 
+122.000000 121.000000 132.000000 142.000000 140.000000 129.000000 
+120.000000 120.000000 126.000000 130.000000 131.000000 129.000000 
+126.000000 123.000000 122.000000 123.000000 123.000000 121.000000 
+114.000000 105.000000 97.000000 98.000000 108.000000 120.000000 
+128.000000 129.000000 127.000000 125.000000 123.000000 123.000000 
+127.000000 129.000000 126.000000 122.000000 126.000000 141.000000 
+153.000000 151.000000 140.000000 132.000000 132.000000 134.000000 
+131.000000 126.000000 124.000000 126.000000 131.000000 133.000000 
+130.000000 126.000000 122.000000 125.000000 131.000000 134.000000 
+130.000000 127.000000 129.000000 137.000000 139.000000 132.000000 
+121.000000 113.000000 112.000000 112.000000 126.000000 130.000000 
+132.000000 129.000000 127.000000 128.000000 132.000000 131.000000 
+125.000000 119.000000 119.000000 120.000000 120.000000 121.000000 
+125.000000 128.000000 126.000000 120.000000 121.000000 129.000000 
+135.000000 133.000000 128.000000 123.000000 122.000000 123.000000 
+125.000000 126.000000 125.000000 122.000000 118.000000 115.000000 
+113.000000 113.000000 118.000000 126.000000 132.000000 130.000000 
+126.000000 124.000000 125.000000 126.000000 127.000000 127.000000 
+126.000000 124.000000 128.000000 141.000000 153.000000 152.000000 
+139.000000 129.000000 131.000000 137.000000 138.000000 130.000000 
+123.000000 122.000000 125.000000 127.000000 127.000000 126.000000 
+126.000000 127.000000 128.000000 126.000000 121.000000 120.000000 
+125.000000 131.000000 130.000000 122.000000 115.000000 113.000000 
+115.000000 116.000000 129.000000 130.000000 126.000000 122.000000 
+120.000000 120.000000 116.000000 107.000000 99.000000 99.000000 
+106.000000 113.000000 116.000000 116.000000 117.000000 123.000000 
+128.000000 128.000000 129.000000 129.000000 130.000000 129.000000 
+126.000000 123.000000 123.000000 124.000000 126.000000 125.000000 
+123.000000 123.000000 123.000000 123.000000 121.000000 119.000000 
+120.000000 124.000000 128.000000 130.000000 130.000000 127.000000 
+126.000000 127.000000 129.000000 128.000000 125.000000 124.000000 
+130.000000 141.000000 151.000000 150.000000 141.000000 132.000000 
+130.000000 134.000000 135.000000 130.000000 124.000000 125.000000 
+130.000000 134.000000 131.000000 126.000000 124.000000 126.000000 
+126.000000 125.000000 122.000000 120.000000 121.000000 126.000000 
+130.000000 129.000000 125.000000 120.000000 115.000000 112.000000 
+127.000000 127.000000 124.000000 121.000000 121.000000 124.000000 
+122.000000 114.000000 104.000000 99.000000 105.000000 116.000000 
+120.000000 119.000000 118.000000 120.000000 125.000000 131.000000 
+133.000000 131.000000 128.000000 125.000000 122.000000 119.000000 
+121.000000 126.000000 130.000000 126.000000 120.000000 117.000000 
+119.000000 120.000000 120.000000 119.000000 120.000000 124.000000 
+125.000000 125.000000 124.000000 124.000000 124.000000 123.000000 
+121.000000 120.000000 122.000000 127.000000 131.000000 136.000000 
+140.000000 142.000000 140.000000 136.000000 132.000000 130.000000 
+132.000000 133.000000 133.000000 134.000000 133.000000 130.000000 
+127.000000 126.000000 128.000000 129.000000 130.000000 131.000000 
+132.000000 130.000000 126.000000 123.000000 125.000000 128.000000 
+125.000000 116.000000 107.000000 104.000000 125.000000 125.000000 
+123.000000 123.000000 126.000000 126.000000 117.000000 105.000000 
+100.000000 110.000000 123.000000 123.000000 108.000000 97.000000 
+102.000000 115.000000 125.000000 129.000000 127.000000 125.000000 
+125.000000 126.000000 128.000000 128.000000 126.000000 125.000000 
+126.000000 127.000000 127.000000 126.000000 125.000000 124.000000 
+122.000000 119.000000 120.000000 126.000000 130.000000 129.000000 
+124.000000 121.000000 122.000000 123.000000 123.000000 121.000000 
+123.000000 130.000000 136.000000 137.000000 136.000000 136.000000 
+137.000000 134.000000 128.000000 123.000000 124.000000 126.000000 
+124.000000 122.000000 123.000000 126.000000 128.000000 130.000000 
+133.000000 136.000000 133.000000 126.000000 122.000000 122.000000 
+125.000000 124.000000 122.000000 122.000000 122.000000 117.000000 
+110.000000 106.000000 126.000000 125.000000 125.000000 127.000000 
+128.000000 126.000000 121.000000 117.000000 120.000000 127.000000 
+129.000000 113.000000 94.000000 92.000000 109.000000 125.000000 
+131.000000 130.000000 131.000000 134.000000 132.000000 126.000000 
+123.000000 124.000000 127.000000 127.000000 127.000000 129.000000 
+129.000000 125.000000 120.000000 119.000000 122.000000 126.000000 
+129.000000 131.000000 132.000000 131.000000 128.000000 125.000000 
+124.000000 121.000000 118.000000 118.000000 125.000000 134.000000 
+139.000000 138.000000 136.000000 139.000000 143.000000 141.000000 
+136.000000 132.000000 133.000000 134.000000 133.000000 133.000000 
+135.000000 137.000000 136.000000 132.000000 129.000000 130.000000 
+133.000000 133.000000 131.000000 125.000000 121.000000 120.000000 
+123.000000 125.000000 122.000000 119.000000 117.000000 117.000000 
+129.000000 128.000000 126.000000 123.000000 122.000000 120.000000 
+116.000000 120.000000 135.000000 149.000000 138.000000 104.000000 
+78.000000 85.000000 111.000000 129.000000 130.000000 126.000000 
+126.000000 129.000000 128.000000 126.000000 128.000000 130.000000 
+128.000000 124.000000 123.000000 125.000000 125.000000 123.000000 
+118.000000 116.000000 116.000000 119.000000 123.000000 126.000000 
+129.000000 131.000000 130.000000 128.000000 125.000000 125.000000 
+125.000000 122.000000 119.000000 124.000000 133.000000 137.000000 
+132.000000 131.000000 143.000000 158.000000 159.000000 145.000000 
+133.000000 134.000000 142.000000 145.000000 142.000000 138.000000 
+136.000000 133.000000 128.000000 129.000000 134.000000 136.000000 
+132.000000 124.000000 122.000000 125.000000 128.000000 126.000000 
+123.000000 123.000000 122.000000 115.000000 126.000000 126.000000 
+126.000000 128.000000 129.000000 123.000000 115.000000 122.000000 
+145.000000 161.000000 142.000000 97.000000 69.000000 84.000000 
+116.000000 130.000000 126.000000 121.000000 123.000000 124.000000 
+123.000000 124.000000 126.000000 126.000000 124.000000 124.000000 
+127.000000 127.000000 123.000000 121.000000 123.000000 125.000000 
+123.000000 119.000000 121.000000 128.000000 133.000000 132.000000 
+126.000000 124.000000 126.000000 129.000000 129.000000 125.000000 
+121.000000 127.000000 136.000000 134.000000 118.000000 110.000000 
+128.000000 160.000000 174.000000 162.000000 142.000000 136.000000 
+145.000000 150.000000 148.000000 142.000000 138.000000 133.000000 
+126.000000 124.000000 128.000000 132.000000 128.000000 121.000000 
+121.000000 126.000000 128.000000 124.000000 120.000000 119.000000 
+119.000000 116.000000 152.000000 172.000000 163.000000 138.000000 
+117.000000 91.000000 43.000000 8.000000 26.000000 33.000000 
+23.000000 24.000000 31.000000 33.000000 41.000000 55.000000 
+57.000000 49.000000 40.000000 35.000000 24.000000 16.000000 
+17.000000 15.000000 14.000000 18.000000 23.000000 18.000000 
+13.000000 16.000000 17.000000 14.000000 28.000000 26.000000 
+6.000000 11.000000 21.000000 36.000000 52.000000 53.000000 
+40.000000 43.000000 45.000000 43.000000 28.000000 13.000000 
+31.000000 60.000000 87.000000 111.000000 121.000000 112.000000 
+87.000000 45.000000 12.000000 26.000000 67.000000 101.000000 
+109.000000 88.000000 42.000000 18.000000 41.000000 68.000000 
+82.000000 96.000000 114.000000 126.000000 119.000000 103.000000 
+96.000000 94.000000 90.000000 92.000000 102.000000 113.000000 
+100.000000 98.000000 110.000000 122.000000 118.000000 100.000000 
+69.000000 29.000000 12.000000 11.000000 13.000000 17.000000 
+23.000000 16.000000 11.000000 35.000000 41.000000 41.000000 
+43.000000 45.000000 41.000000 37.000000 35.000000 28.000000 
+22.000000 18.000000 17.000000 24.000000 26.000000 18.000000 
+10.000000 9.000000 15.000000 16.000000 8.000000 18.000000 
+31.000000 35.000000 38.000000 33.000000 27.000000 39.000000 
+42.000000 33.000000 23.000000 35.000000 71.000000 100.000000 
+117.000000 131.000000 132.000000 109.000000 72.000000 26.000000 
+16.000000 53.000000 92.000000 105.000000 90.000000 55.000000 
+22.000000 5.000000 14.000000 44.000000 84.000000 117.000000 
+122.000000 99.000000 68.000000 57.000000 72.000000 83.000000 
+70.000000 51.000000 53.000000 86.000000 98.000000 81.000000 
+87.000000 107.000000 120.000000 114.000000 89.000000 57.000000 
+28.000000 11.000000 10.000000 18.000000 22.000000 13.000000 
+9.000000 26.000000 32.000000 33.000000 38.000000 46.000000 
+58.000000 73.000000 83.000000 82.000000 68.000000 53.000000 
+44.000000 37.000000 23.000000 4.000000 0.000000 0.000000 
+0.000000 5.000000 11.000000 17.000000 25.000000 22.000000 
+11.000000 13.000000 21.000000 26.000000 26.000000 35.000000 
+57.000000 79.000000 101.000000 121.000000 136.000000 145.000000 
+141.000000 110.000000 60.000000 12.000000 24.000000 70.000000 
+100.000000 99.000000 71.000000 38.000000 18.000000 10.000000 
+22.000000 55.000000 86.000000 101.000000 98.000000 82.000000 
+70.000000 73.000000 88.000000 108.000000 114.000000 99.000000 
+77.000000 80.000000 99.000000 77.000000 77.000000 99.000000 
+121.000000 122.000000 106.000000 89.000000 68.000000 41.000000 
+19.000000 11.000000 12.000000 17.000000 16.000000 14.000000 
+25.000000 32.000000 35.000000 43.000000 58.000000 79.000000 
+108.000000 131.000000 135.000000 126.000000 113.000000 100.000000 
+84.000000 64.000000 46.000000 41.000000 38.000000 26.000000 
+7.000000 13.000000 18.000000 13.000000 6.000000 8.000000 
+13.000000 23.000000 49.000000 81.000000 104.000000 116.000000 
+122.000000 132.000000 142.000000 142.000000 122.000000 84.000000 
+29.000000 19.000000 61.000000 94.000000 97.000000 74.000000 
+40.000000 20.000000 12.000000 21.000000 44.000000 66.000000 
+81.000000 87.000000 86.000000 84.000000 87.000000 91.000000 
+96.000000 109.000000 126.000000 130.000000 115.000000 99.000000 
+113.000000 95.000000 87.000000 98.000000 119.000000 132.000000 
+127.000000 110.000000 92.000000 71.000000 45.000000 21.000000 
+10.000000 13.000000 14.000000 12.000000 20.000000 28.000000 
+32.000000 29.000000 32.000000 72.000000 117.000000 149.000000 
+157.000000 147.000000 132.000000 126.000000 137.000000 151.000000 
+151.000000 139.000000 115.000000 73.000000 27.000000 15.000000 
+17.000000 20.000000 30.000000 30.000000 35.000000 52.000000 
+85.000000 128.000000 145.000000 135.000000 130.000000 132.000000 
+129.000000 116.000000 87.000000 49.000000 5.000000 22.000000 
+68.000000 81.000000 58.000000 25.000000 12.000000 20.000000 
+22.000000 25.000000 39.000000 56.000000 72.000000 82.000000 
+88.000000 95.000000 105.000000 110.000000 107.000000 107.000000 
+118.000000 132.000000 131.000000 118.000000 129.000000 121.000000 
+109.000000 110.000000 125.000000 134.000000 125.000000 115.000000 
+107.000000 89.000000 63.000000 41.000000 27.000000 20.000000 
+14.000000 10.000000 11.000000 20.000000 30.000000 29.000000 
+22.000000 61.000000 115.000000 148.000000 156.000000 149.000000 
+136.000000 128.000000 141.000000 165.000000 172.000000 157.000000 
+144.000000 124.000000 88.000000 53.000000 38.000000 30.000000 
+16.000000 23.000000 62.000000 102.000000 123.000000 141.000000 
+155.000000 147.000000 136.000000 135.000000 132.000000 106.000000 
+62.000000 19.000000 19.000000 44.000000 56.000000 42.000000 
+19.000000 11.000000 13.000000 17.000000 26.000000 33.000000 
+43.000000 57.000000 75.000000 93.000000 109.000000 123.000000 
+131.000000 128.000000 116.000000 111.000000 119.000000 129.000000 
+127.000000 118.000000 128.000000 122.000000 117.000000 118.000000 
+116.000000 110.000000 111.000000 118.000000 115.000000 102.000000 
+91.000000 79.000000 63.000000 39.000000 20.000000 12.000000 
+6.000000 10.000000 29.000000 37.000000 29.000000 52.000000 
+103.000000 138.000000 156.000000 162.000000 156.000000 152.000000 
+163.000000 166.000000 144.000000 139.000000 171.000000 183.000000 
+153.000000 112.000000 86.000000 68.000000 41.000000 33.000000 
+59.000000 105.000000 135.000000 144.000000 148.000000 150.000000 
+153.000000 154.000000 135.000000 82.000000 25.000000 6.000000 
+37.000000 66.000000 53.000000 23.000000 16.000000 16.000000 
+10.000000 12.000000 27.000000 46.000000 63.000000 81.000000 
+99.000000 117.000000 131.000000 137.000000 132.000000 119.000000 
+113.000000 116.000000 114.000000 100.000000 85.000000 86.000000 
+138.000000 133.000000 116.000000 93.000000 77.000000 83.000000 
+109.000000 123.000000 118.000000 115.000000 117.000000 110.000000 
+87.000000 60.000000 46.000000 44.000000 34.000000 25.000000 
+40.000000 50.000000 39.000000 38.000000 88.000000 134.000000 
+156.000000 158.000000 148.000000 145.000000 154.000000 146.000000 
+125.000000 142.000000 180.000000 187.000000 151.000000 106.000000 
+81.000000 76.000000 84.000000 96.000000 116.000000 138.000000 
+147.000000 142.000000 139.000000 151.000000 170.000000 156.000000 
+95.000000 34.000000 10.000000 28.000000 52.000000 58.000000 
+38.000000 18.000000 19.000000 15.000000 11.000000 21.000000 
+43.000000 67.000000 86.000000 110.000000 135.000000 144.000000 
+133.000000 119.000000 115.000000 120.000000 123.000000 112.000000 
+88.000000 68.000000 65.000000 81.000000 142.000000 139.000000 
+109.000000 67.000000 46.000000 61.000000 97.000000 119.000000 
+127.000000 133.000000 134.000000 124.000000 103.000000 81.000000 
+64.000000 44.000000 24.000000 25.000000 29.000000 35.000000 
+31.000000 25.000000 85.000000 135.000000 152.000000 150.000000 
+142.000000 138.000000 141.000000 136.000000 132.000000 142.000000 
+153.000000 150.000000 130.000000 106.000000 92.000000 94.000000 
+107.000000 130.000000 154.000000 163.000000 146.000000 121.000000 
+115.000000 136.000000 151.000000 115.000000 52.000000 18.000000 
+19.000000 51.000000 68.000000 42.000000 16.000000 10.000000 
+16.000000 27.000000 33.000000 47.000000 78.000000 111.000000 
+132.000000 141.000000 141.000000 131.000000 117.000000 115.000000 
+123.000000 129.000000 118.000000 93.000000 72.000000 69.000000 
+80.000000 92.000000 133.000000 125.000000 104.000000 81.000000 
+74.000000 89.000000 109.000000 122.000000 134.000000 151.000000 
+159.000000 147.000000 123.000000 102.000000 83.000000 50.000000 
+13.000000 10.000000 20.000000 28.000000 15.000000 40.000000 
+114.000000 153.000000 153.000000 141.000000 137.000000 140.000000 
+146.000000 147.000000 140.000000 134.000000 136.000000 140.000000 
+139.000000 137.000000 138.000000 143.000000 144.000000 136.000000 
+125.000000 117.000000 112.000000 111.000000 123.000000 136.000000 
+123.000000 81.000000 47.000000 31.000000 31.000000 47.000000 
+49.000000 37.000000 26.000000 20.000000 27.000000 45.000000 
+68.000000 99.000000 126.000000 144.000000 157.000000 148.000000 
+117.000000 94.000000 98.000000 118.000000 128.000000 121.000000 
+104.000000 90.000000 84.000000 85.000000 91.000000 98.000000 
+116.000000 108.000000 100.000000 99.000000 105.000000 111.000000 
+108.000000 106.000000 121.000000 144.000000 154.000000 144.000000 
+128.000000 113.000000 94.000000 68.000000 44.000000 38.000000 
+46.000000 34.000000 24.000000 81.000000 134.000000 150.000000 
+139.000000 125.000000 124.000000 133.000000 142.000000 141.000000 
+132.000000 124.000000 122.000000 123.000000 124.000000 126.000000 
+133.000000 139.000000 134.000000 118.000000 106.000000 106.000000 
+115.000000 128.000000 140.000000 139.000000 120.000000 91.000000 
+66.000000 41.000000 32.000000 28.000000 24.000000 33.000000 
+33.000000 33.000000 54.000000 85.000000 113.000000 135.000000 
+142.000000 140.000000 135.000000 123.000000 112.000000 117.000000 
+134.000000 141.000000 127.000000 106.000000 113.000000 145.000000 
+161.000000 141.000000 109.000000 100.000000 117.000000 118.000000 
+119.000000 120.000000 117.000000 106.000000 92.000000 90.000000 
+106.000000 119.000000 118.000000 111.000000 104.000000 95.000000 
+82.000000 78.000000 90.000000 107.000000 92.000000 50.000000 
+73.000000 125.000000 129.000000 120.000000 117.000000 121.000000 
+126.000000 129.000000 134.000000 138.000000 135.000000 125.000000 
+118.000000 117.000000 116.000000 115.000000 117.000000 119.000000 
+117.000000 113.000000 112.000000 119.000000 131.000000 137.000000 
+132.000000 121.000000 107.000000 92.000000 71.000000 46.000000 
+22.000000 17.000000 27.000000 31.000000 27.000000 47.000000 
+92.000000 130.000000 143.000000 139.000000 136.000000 130.000000 
+117.000000 117.000000 146.000000 188.000000 203.000000 178.000000 
+133.000000 105.000000 114.000000 151.000000 188.000000 180.000000 
+138.000000 114.000000 142.000000 142.000000 137.000000 132.000000 
+127.000000 116.000000 103.000000 95.000000 91.000000 89.000000 
+88.000000 85.000000 78.000000 71.000000 72.000000 79.000000 
+87.000000 91.000000 74.000000 59.000000 87.000000 98.000000 
+83.000000 85.000000 103.000000 117.000000 124.000000 130.000000 
+136.000000 140.000000 135.000000 125.000000 121.000000 125.000000 
+126.000000 120.000000 114.000000 114.000000 119.000000 121.000000 
+121.000000 126.000000 135.000000 136.000000 122.000000 101.000000 
+84.000000 73.000000 56.000000 24.000000 14.000000 24.000000 
+29.000000 32.000000 49.000000 89.000000 131.000000 154.000000 
+154.000000 146.000000 143.000000 137.000000 126.000000 135.000000 
+182.000000 233.000000 229.000000 170.000000 114.000000 98.000000 
+96.000000 87.000000 95.000000 115.000000 133.000000 135.000000 
+145.000000 134.000000 123.000000 121.000000 124.000000 125.000000 
+119.000000 107.000000 95.000000 92.000000 97.000000 95.000000 
+81.000000 67.000000 67.000000 71.000000 69.000000 62.000000 
+62.000000 79.000000 90.000000 78.000000 62.000000 69.000000 
+93.000000 102.000000 99.000000 112.000000 129.000000 134.000000 
+128.000000 119.000000 119.000000 127.000000 132.000000 128.000000 
+118.000000 110.000000 105.000000 105.000000 113.000000 121.000000 
+123.000000 118.000000 105.000000 90.000000 81.000000 75.000000 
+61.000000 32.000000 30.000000 45.000000 52.000000 63.000000 
+89.000000 120.000000 145.000000 157.000000 154.000000 151.000000 
+153.000000 147.000000 134.000000 137.000000 172.000000 205.000000 
+192.000000 140.000000 96.000000 90.000000 97.000000 87.000000 
+76.000000 89.000000 115.000000 120.000000 140.000000 125.000000 
+118.000000 121.000000 125.000000 124.000000 120.000000 116.000000 
+115.000000 120.000000 128.000000 123.000000 102.000000 85.000000 
+78.000000 81.000000 85.000000 89.000000 100.000000 110.000000 
+104.000000 88.000000 80.000000 80.000000 87.000000 82.000000 
+69.000000 86.000000 104.000000 104.000000 93.000000 95.000000 
+118.000000 137.000000 141.000000 130.000000 112.000000 95.000000 
+90.000000 99.000000 114.000000 116.000000 103.000000 92.000000 
+87.000000 83.000000 75.000000 66.000000 64.000000 71.000000 
+79.000000 86.000000 93.000000 96.000000 100.000000 106.000000 
+116.000000 123.000000 124.000000 124.000000 131.000000 137.000000 
+130.000000 115.000000 113.000000 122.000000 129.000000 121.000000 
+99.000000 93.000000 110.000000 119.000000 118.000000 116.000000 
+113.000000 108.000000 134.000000 124.000000 124.000000 128.000000 
+125.000000 119.000000 118.000000 122.000000 125.000000 124.000000 
+121.000000 116.000000 106.000000 93.000000 80.000000 72.000000 
+73.000000 83.000000 91.000000 83.000000 64.000000 62.000000 
+83.000000 91.000000 78.000000 56.000000 44.000000 65.000000 
+78.000000 72.000000 62.000000 81.000000 113.000000 125.000000 
+119.000000 105.000000 88.000000 76.000000 82.000000 105.000000 
+121.000000 110.000000 81.000000 66.000000 70.000000 80.000000 
+81.000000 74.000000 72.000000 82.000000 95.000000 98.000000 
+89.000000 75.000000 66.000000 68.000000 75.000000 82.000000 
+87.000000 91.000000 98.000000 104.000000 101.000000 82.000000 
+64.000000 67.000000 87.000000 99.000000 92.000000 92.000000 
+113.000000 133.000000 133.000000 117.000000 107.000000 108.000000 
+130.000000 124.000000 123.000000 123.000000 121.000000 122.000000 
+129.000000 134.000000 132.000000 121.000000 111.000000 106.000000 
+105.000000 99.000000 84.000000 70.000000 68.000000 76.000000 
+74.000000 51.000000 35.000000 66.000000 107.000000 114.000000 
+84.000000 48.000000 37.000000 53.000000 63.000000 58.000000 
+53.000000 71.000000 92.000000 97.000000 92.000000 85.000000 
+75.000000 68.000000 79.000000 102.000000 112.000000 93.000000 
+64.000000 52.000000 62.000000 82.000000 98.000000 104.000000 
+96.000000 81.000000 69.000000 61.000000 54.000000 48.000000 
+48.000000 54.000000 61.000000 64.000000 65.000000 67.000000 
+69.000000 71.000000 71.000000 65.000000 57.000000 57.000000 
+66.000000 78.000000 89.000000 101.000000 115.000000 125.000000 
+123.000000 111.000000 103.000000 104.000000 128.000000 125.000000 
+121.000000 118.000000 120.000000 127.000000 132.000000 130.000000 
+123.000000 117.000000 115.000000 114.000000 115.000000 117.000000 
+113.000000 103.000000 96.000000 95.000000 90.000000 77.000000 
+87.000000 135.000000 156.000000 136.000000 91.000000 53.000000 
+46.000000 62.000000 68.000000 57.000000 49.000000 57.000000 
+71.000000 79.000000 79.000000 70.000000 54.000000 47.000000 
+65.000000 93.000000 105.000000 89.000000 66.000000 57.000000 
+67.000000 87.000000 101.000000 102.000000 92.000000 74.000000 
+53.000000 42.000000 41.000000 44.000000 47.000000 52.000000 
+60.000000 62.000000 59.000000 59.000000 68.000000 81.000000 
+87.000000 78.000000 63.000000 58.000000 70.000000 92.000000 
+112.000000 121.000000 122.000000 120.000000 114.000000 106.000000 
+101.000000 102.000000 124.000000 129.000000 129.000000 125.000000 
+121.000000 123.000000 126.000000 126.000000 123.000000 118.000000 
+114.000000 115.000000 121.000000 125.000000 122.000000 120.000000 
+134.000000 153.000000 158.000000 160.000000 190.000000 225.000000 
+213.000000 147.000000 78.000000 50.000000 56.000000 75.000000 
+69.000000 53.000000 48.000000 63.000000 76.000000 79.000000 
+75.000000 64.000000 46.000000 35.000000 51.000000 83.000000 
+99.000000 86.000000 64.000000 59.000000 84.000000 125.000000 
+144.000000 131.000000 111.000000 97.000000 82.000000 64.000000 
+51.000000 49.000000 56.000000 69.000000 86.000000 95.000000 
+96.000000 98.000000 105.000000 113.000000 113.000000 104.000000 
+96.000000 96.000000 105.000000 118.000000 127.000000 125.000000 
+119.000000 114.000000 112.000000 109.000000 106.000000 106.000000 
+123.000000 131.000000 135.000000 130.000000 124.000000 120.000000 
+121.000000 126.000000 131.000000 126.000000 116.000000 114.000000 
+122.000000 128.000000 119.000000 115.000000 141.000000 191.000000 
+243.000000 287.000000 328.000000 311.000000 239.000000 143.000000 
+60.000000 42.000000 58.000000 75.000000 60.000000 38.000000 
+41.000000 72.000000 98.000000 104.000000 95.000000 80.000000 
+60.000000 47.000000 53.000000 76.000000 87.000000 75.000000 
+55.000000 56.000000 101.000000 171.000000 210.000000 201.000000 
+182.000000 170.000000 135.000000 81.000000 52.000000 66.000000 
+100.000000 124.000000 130.000000 126.000000 123.000000 123.000000 
+124.000000 123.000000 122.000000 125.000000 130.000000 134.000000 
+133.000000 130.000000 127.000000 123.000000 117.000000 113.000000 
+111.000000 113.000000 117.000000 119.000000 112.000000 119.000000 
+124.000000 123.000000 120.000000 122.000000 126.000000 129.000000 
+127.000000 121.000000 114.000000 112.000000 118.000000 126.000000 
+125.000000 115.000000 118.000000 163.000000 265.000000 401.000000 
+461.000000 367.000000 199.000000 98.000000 57.000000 53.000000 
+62.000000 63.000000 53.000000 46.000000 53.000000 78.000000 
+113.000000 139.000000 139.000000 108.000000 68.000000 43.000000 
+44.000000 64.000000 80.000000 77.000000 59.000000 45.000000 
+88.000000 204.000000 310.000000 329.000000 288.000000 239.000000 
+164.000000 92.000000 76.000000 105.000000 137.000000 140.000000 
+126.000000 119.000000 120.000000 119.000000 116.000000 115.000000 
+119.000000 123.000000 128.000000 135.000000 137.000000 131.000000 
+121.000000 117.000000 120.000000 122.000000 117.000000 115.000000 
+118.000000 121.000000 118.000000 116.000000 112.000000 109.000000 
+111.000000 119.000000 127.000000 128.000000 122.000000 117.000000 
+117.000000 117.000000 115.000000 120.000000 128.000000 126.000000 
+116.000000 127.000000 185.000000 288.000000 332.000000 241.000000 
+97.000000 49.000000 62.000000 72.000000 67.000000 52.000000 
+49.000000 54.000000 56.000000 67.000000 103.000000 149.000000 
+166.000000 133.000000 79.000000 41.000000 34.000000 54.000000 
+84.000000 100.000000 77.000000 46.000000 63.000000 214.000000 
+406.000000 485.000000 409.000000 274.000000 161.000000 120.000000 
+125.000000 127.000000 124.000000 122.000000 125.000000 130.000000 
+130.000000 123.000000 115.000000 111.000000 113.000000 122.000000 
+133.000000 139.000000 135.000000 126.000000 121.000000 123.000000 
+126.000000 124.000000 121.000000 120.000000 120.000000 117.000000 
+126.000000 123.000000 122.000000 123.000000 125.000000 124.000000 
+121.000000 119.000000 116.000000 116.000000 119.000000 121.000000 
+121.000000 121.000000 124.000000 128.000000 128.000000 121.000000 
+110.000000 93.000000 89.000000 66.000000 44.000000 45.000000 
+51.000000 56.000000 49.000000 42.000000 42.000000 45.000000 
+51.000000 69.000000 102.000000 132.000000 133.000000 102.000000 
+61.000000 37.000000 45.000000 73.000000 104.000000 108.000000 
+76.000000 57.000000 77.000000 204.000000 361.000000 423.000000 
+350.000000 216.000000 132.000000 120.000000 128.000000 125.000000 
+120.000000 126.000000 134.000000 131.000000 123.000000 117.000000 
+113.000000 108.000000 109.000000 119.000000 132.000000 135.000000 
+130.000000 128.000000 129.000000 128.000000 124.000000 125.000000 
+129.000000 126.000000 118.000000 114.000000 122.000000 123.000000 
+126.000000 127.000000 126.000000 123.000000 117.000000 114.000000 
+114.000000 118.000000 120.000000 120.000000 121.000000 122.000000 
+122.000000 125.000000 132.000000 138.000000 133.000000 109.000000 
+77.000000 59.000000 59.000000 62.000000 60.000000 53.000000 
+47.000000 47.000000 48.000000 47.000000 48.000000 58.000000 
+77.000000 94.000000 95.000000 75.000000 45.000000 40.000000 
+66.000000 93.000000 101.000000 91.000000 78.000000 74.000000 
+85.000000 133.000000 168.000000 153.000000 117.000000 101.000000 
+111.000000 119.000000 118.000000 118.000000 126.000000 136.000000 
+138.000000 129.000000 122.000000 120.000000 119.000000 114.000000 
+112.000000 118.000000 126.000000 128.000000 125.000000 124.000000 
+125.000000 125.000000 124.000000 126.000000 128.000000 125.000000 
+121.000000 122.000000 125.000000 125.000000 125.000000 125.000000 
+126.000000 127.000000 122.000000 115.000000 114.000000 118.000000 
+120.000000 117.000000 116.000000 121.000000 125.000000 125.000000 
+124.000000 126.000000 129.000000 126.000000 113.000000 95.000000 
+85.000000 83.000000 70.000000 49.000000 38.000000 42.000000 
+52.000000 57.000000 55.000000 50.000000 49.000000 55.000000 
+64.000000 67.000000 62.000000 67.000000 75.000000 71.000000 
+61.000000 62.000000 80.000000 90.000000 74.000000 38.000000 
+15.000000 18.000000 58.000000 102.000000 122.000000 124.000000 
+122.000000 120.000000 121.000000 125.000000 129.000000 130.000000 
+126.000000 122.000000 117.000000 114.000000 115.000000 123.000000 
+131.000000 133.000000 128.000000 122.000000 122.000000 124.000000 
+126.000000 123.000000 120.000000 119.000000 121.000000 123.000000 
+126.000000 127.000000 126.000000 125.000000 126.000000 126.000000 
+125.000000 123.000000 121.000000 119.000000 117.000000 114.000000 
+114.000000 121.000000 130.000000 132.000000 128.000000 127.000000 
+136.000000 150.000000 153.000000 131.000000 97.000000 72.000000 
+58.000000 44.000000 40.000000 42.000000 45.000000 47.000000 
+49.000000 55.000000 64.000000 71.000000 72.000000 66.000000 
+62.000000 57.000000 50.000000 47.000000 51.000000 62.000000 
+71.000000 70.000000 63.000000 50.000000 42.000000 54.000000 
+86.000000 117.000000 130.000000 128.000000 124.000000 122.000000 
+120.000000 119.000000 121.000000 121.000000 117.000000 113.000000 
+112.000000 116.000000 118.000000 118.000000 118.000000 120.000000 
+122.000000 124.000000 125.000000 125.000000 125.000000 123.000000 
+120.000000 120.000000 122.000000 124.000000 127.000000 125.000000 
+124.000000 126.000000 128.000000 126.000000 122.000000 118.000000 
+118.000000 119.000000 118.000000 116.000000 115.000000 117.000000 
+120.000000 123.000000 124.000000 124.000000 127.000000 138.000000 
+147.000000 141.000000 110.000000 71.000000 52.000000 46.000000 
+49.000000 50.000000 45.000000 43.000000 49.000000 63.000000 
+76.000000 85.000000 86.000000 84.000000 83.000000 89.000000 
+96.000000 95.000000 79.000000 57.000000 43.000000 41.000000 
+47.000000 53.000000 60.000000 76.000000 100.000000 122.000000 
+130.000000 128.000000 123.000000 122.000000 124.000000 126.000000 
+126.000000 123.000000 119.000000 117.000000 118.000000 120.000000 
+121.000000 120.000000 120.000000 120.000000 120.000000 120.000000 
+121.000000 123.000000 126.000000 129.000000 130.000000 128.000000 
+125.000000 122.000000 129.000000 132.000000 132.000000 132.000000 
+132.000000 128.000000 123.000000 121.000000 122.000000 123.000000 
+120.000000 115.000000 113.000000 115.000000 119.000000 124.000000 
+127.000000 124.000000 118.000000 117.000000 124.000000 131.000000 
+125.000000 102.000000 71.000000 53.000000 53.000000 57.000000 
+61.000000 64.000000 69.000000 74.000000 78.000000 79.000000 
+80.000000 83.000000 92.000000 104.000000 115.000000 114.000000 
+99.000000 77.000000 60.000000 54.000000 58.000000 66.000000 
+74.000000 89.000000 109.000000 125.000000 130.000000 128.000000 
+126.000000 126.000000 127.000000 128.000000 125.000000 120.000000 
+116.000000 116.000000 118.000000 121.000000 122.000000 120.000000 
+120.000000 121.000000 121.000000 122.000000 123.000000 122.000000 
+123.000000 128.000000 135.000000 137.000000 129.000000 117.000000 
+119.000000 122.000000 124.000000 129.000000 134.000000 131.000000 
+123.000000 117.000000 117.000000 118.000000 115.000000 111.000000 
+111.000000 115.000000 121.000000 125.000000 125.000000 126.000000 
+131.000000 139.000000 137.000000 116.000000 82.000000 58.000000 
+51.000000 59.000000 71.000000 75.000000 73.000000 71.000000 
+70.000000 69.000000 64.000000 56.000000 50.000000 54.000000 
+68.000000 87.000000 105.000000 112.000000 102.000000 82.000000 
+68.000000 68.000000 79.000000 91.000000 99.000000 107.000000 
+116.000000 122.000000 122.000000 123.000000 128.000000 130.000000 
+124.000000 116.000000 114.000000 117.000000 119.000000 118.000000 
+119.000000 122.000000 122.000000 119.000000 119.000000 123.000000 
+125.000000 124.000000 121.000000 122.000000 127.000000 132.000000 
+137.000000 138.000000 133.000000 123.000000 106.000000 115.000000 
+116.000000 120.000000 127.000000 131.000000 130.000000 126.000000 
+126.000000 125.000000 123.000000 121.000000 121.000000 123.000000 
+122.000000 122.000000 123.000000 125.000000 126.000000 126.000000 
+127.000000 123.000000 109.000000 88.000000 68.000000 61.000000 
+65.000000 70.000000 69.000000 62.000000 57.000000 57.000000 
+58.000000 54.000000 47.000000 41.000000 42.000000 55.000000 
+77.000000 100.000000 109.000000 94.000000 69.000000 58.000000 
+67.000000 86.000000 104.000000 116.000000 122.000000 125.000000 
+124.000000 123.000000 124.000000 125.000000 123.000000 120.000000 
+120.000000 121.000000 121.000000 121.000000 123.000000 124.000000 
+120.000000 115.000000 117.000000 123.000000 126.000000 123.000000 
+119.000000 119.000000 119.000000 118.000000 119.000000 124.000000 
+127.000000 125.000000 86.000000 101.000000 116.000000 126.000000 
+129.000000 130.000000 130.000000 131.000000 132.000000 132.000000 
+128.000000 124.000000 122.000000 124.000000 128.000000 131.000000 
+132.000000 132.000000 133.000000 135.000000 134.000000 124.000000 
+106.000000 86.000000 72.000000 65.000000 58.000000 51.000000 
+47.000000 49.000000 53.000000 54.000000 51.000000 49.000000 
+49.000000 48.000000 44.000000 40.000000 41.000000 54.000000 
+71.000000 80.000000 76.000000 62.000000 57.000000 72.000000 
+99.000000 122.000000 130.000000 128.000000 126.000000 127.000000 
+127.000000 123.000000 119.000000 118.000000 119.000000 120.000000 
+120.000000 121.000000 122.000000 121.000000 118.000000 117.000000 
+119.000000 122.000000 123.000000 123.000000 126.000000 130.000000 
+131.000000 128.000000 126.000000 127.000000 129.000000 130.000000 
+98.000000 96.000000 108.000000 123.000000 131.000000 133.000000 
+132.000000 130.000000 129.000000 127.000000 124.000000 121.000000 
+121.000000 124.000000 128.000000 132.000000 134.000000 135.000000 
+134.000000 135.000000 133.000000 122.000000 102.000000 81.000000 
+67.000000 60.000000 53.000000 44.000000 41.000000 46.000000 
+53.000000 60.000000 69.000000 82.000000 92.000000 84.000000 
+61.000000 39.000000 29.000000 35.000000 43.000000 46.000000 
+50.000000 60.000000 72.000000 86.000000 104.000000 122.000000 
+135.000000 138.000000 135.000000 130.000000 126.000000 120.000000 
+115.000000 115.000000 118.000000 121.000000 120.000000 119.000000 
+120.000000 122.000000 124.000000 124.000000 122.000000 117.000000 
+114.000000 115.000000 119.000000 123.000000 125.000000 126.000000 
+127.000000 128.000000 131.000000 134.000000 136.000000 129.000000 
+123.000000 122.000000 122.000000 121.000000 121.000000 121.000000 
+124.000000 125.000000 122.000000 118.000000 121.000000 129.000000 
+134.000000 131.000000 125.000000 125.000000 131.000000 136.000000 
+134.000000 126.000000 114.000000 96.000000 75.000000 60.000000 
+59.000000 63.000000 81.000000 120.000000 157.000000 172.000000 
+172.000000 177.000000 186.000000 176.000000 133.000000 73.000000 
+38.000000 43.000000 76.000000 91.000000 76.000000 64.000000 
+74.000000 95.000000 111.000000 119.000000 126.000000 134.000000 
+138.000000 137.000000 133.000000 130.000000 128.000000 125.000000 
+121.000000 116.000000 114.000000 118.000000 125.000000 128.000000 
+124.000000 120.000000 121.000000 122.000000 119.000000 112.000000 
+109.000000 110.000000 113.000000 114.000000 116.000000 119.000000 
+123.000000 126.000000 131.000000 133.000000 138.000000 142.000000 
+142.000000 136.000000 129.000000 124.000000 123.000000 124.000000 
+125.000000 128.000000 134.000000 137.000000 133.000000 127.000000 
+125.000000 131.000000 135.000000 134.000000 127.000000 120.000000 
+110.000000 100.000000 90.000000 80.000000 86.000000 109.000000 
+162.000000 269.000000 345.000000 349.000000 332.000000 350.000000 
+388.000000 377.000000 278.000000 141.000000 63.000000 56.000000 
+89.000000 114.000000 106.000000 84.000000 80.000000 97.000000 
+119.000000 133.000000 137.000000 137.000000 138.000000 140.000000 
+140.000000 136.000000 129.000000 124.000000 124.000000 125.000000 
+126.000000 129.000000 134.000000 135.000000 131.000000 123.000000 
+118.000000 114.000000 110.000000 108.000000 108.000000 112.000000 
+117.000000 119.000000 118.000000 118.000000 121.000000 123.000000 
+127.000000 130.000000 129.000000 131.000000 135.000000 135.000000 
+133.000000 133.000000 131.000000 123.000000 116.000000 120.000000 
+130.000000 133.000000 129.000000 126.000000 127.000000 124.000000 
+122.000000 127.000000 131.000000 117.000000 98.000000 103.000000 
+119.000000 101.000000 67.000000 96.000000 204.000000 353.000000 
+421.000000 400.000000 402.000000 479.000000 524.000000 438.000000 
+265.000000 129.000000 91.000000 105.000000 117.000000 118.000000 
+111.000000 94.000000 79.000000 85.000000 108.000000 126.000000 
+128.000000 128.000000 137.000000 142.000000 133.000000 122.000000 
+122.000000 128.000000 126.000000 123.000000 128.000000 136.000000 
+133.000000 123.000000 119.000000 123.000000 125.000000 120.000000 
+113.000000 114.000000 119.000000 124.000000 125.000000 122.000000 
+118.000000 118.000000 121.000000 121.000000 135.000000 132.000000 
+126.000000 126.000000 133.000000 137.000000 133.000000 126.000000 
+125.000000 127.000000 126.000000 124.000000 125.000000 130.000000 
+132.000000 128.000000 124.000000 125.000000 131.000000 130.000000 
+116.000000 94.000000 83.000000 92.000000 116.000000 131.000000 
+118.000000 84.000000 56.000000 78.000000 127.000000 177.000000 
+193.000000 202.000000 194.000000 135.000000 88.000000 97.000000 
+92.000000 89.000000 104.000000 123.000000 126.000000 108.000000 
+87.000000 85.000000 103.000000 123.000000 132.000000 132.000000 
+132.000000 136.000000 139.000000 140.000000 139.000000 137.000000 
+132.000000 129.000000 130.000000 132.000000 133.000000 133.000000 
+133.000000 131.000000 125.000000 122.000000 126.000000 135.000000 
+133.000000 118.000000 103.000000 99.000000 106.000000 114.000000 
+116.000000 115.000000 122.000000 121.000000 128.000000 136.000000 
+139.000000 135.000000 128.000000 124.000000 124.000000 125.000000 
+123.000000 118.000000 116.000000 118.000000 119.000000 118.000000 
+118.000000 123.000000 129.000000 130.000000 128.000000 128.000000 
+121.000000 108.000000 97.000000 99.000000 106.000000 104.000000 
+90.000000 74.000000 68.000000 64.000000 52.000000 40.000000 
+42.000000 61.000000 82.000000 85.000000 86.000000 96.000000 
+106.000000 99.000000 84.000000 81.000000 98.000000 119.000000 
+128.000000 129.000000 130.000000 130.000000 130.000000 134.000000 
+139.000000 139.000000 130.000000 122.000000 124.000000 132.000000 
+135.000000 130.000000 122.000000 119.000000 122.000000 128.000000 
+132.000000 126.000000 113.000000 103.000000 94.000000 87.000000 
+92.000000 99.000000 105.000000 114.000000 120.000000 120.000000 
+123.000000 125.000000 130.000000 132.000000 127.000000 123.000000 
+123.000000 126.000000 127.000000 128.000000 129.000000 126.000000 
+118.000000 113.000000 116.000000 121.000000 118.000000 110.000000 
+114.000000 134.000000 151.000000 149.000000 134.000000 121.000000 
+118.000000 118.000000 112.000000 104.000000 92.000000 79.000000 
+65.000000 49.000000 35.000000 28.000000 31.000000 47.000000 
+68.000000 85.000000 98.000000 108.000000 109.000000 101.000000 
+92.000000 95.000000 110.000000 123.000000 126.000000 124.000000 
+121.000000 121.000000 121.000000 122.000000 123.000000 126.000000 
+126.000000 124.000000 121.000000 121.000000 125.000000 132.000000 
+136.000000 132.000000 126.000000 126.000000 132.000000 133.000000 
+122.000000 108.000000 106.000000 115.000000 123.000000 119.000000 
+115.000000 121.000000 129.000000 129.000000 126.000000 128.000000 
+129.000000 127.000000 123.000000 122.000000 124.000000 126.000000 
+129.000000 132.000000 130.000000 119.000000 102.000000 92.000000 
+100.000000 118.000000 135.000000 144.000000 144.000000 138.000000 
+130.000000 122.000000 121.000000 125.000000 128.000000 124.000000 
+117.000000 109.000000 101.000000 90.000000 76.000000 63.000000 
+55.000000 54.000000 61.000000 72.000000 84.000000 95.000000 
+109.000000 124.000000 131.000000 124.000000 115.000000 116.000000 
+125.000000 124.000000 106.000000 83.000000 76.000000 90.000000 
+109.000000 122.000000 126.000000 127.000000 128.000000 127.000000 
+123.000000 117.000000 117.000000 126.000000 137.000000 138.000000 
+129.000000 120.000000 119.000000 123.000000 124.000000 121.000000 
+118.000000 116.000000 114.000000 112.000000 112.000000 119.000000 
+127.000000 129.000000 123.000000 124.000000 126.000000 127.000000 
+125.000000 122.000000 120.000000 120.000000 121.000000 116.000000 
+108.000000 106.000000 110.000000 117.000000 122.000000 126.000000 
+135.000000 141.000000 135.000000 121.000000 113.000000 117.000000 
+126.000000 126.000000 120.000000 115.000000 116.000000 119.000000 
+117.000000 108.000000 94.000000 80.000000 69.000000 62.000000 
+61.000000 72.000000 92.000000 114.000000 126.000000 129.000000 
+127.000000 125.000000 123.000000 122.000000 123.000000 126.000000 
+126.000000 116.000000 101.000000 91.000000 96.000000 112.000000 
+127.000000 132.000000 129.000000 124.000000 122.000000 125.000000 
+128.000000 132.000000 134.000000 134.000000 129.000000 124.000000 
+126.000000 134.000000 134.000000 117.000000 96.000000 92.000000 
+104.000000 118.000000 121.000000 117.000000 119.000000 125.000000 
+123.000000 128.000000 130.000000 129.000000 128.000000 130.000000 
+129.000000 122.000000 116.000000 114.000000 116.000000 120.000000 
+125.000000 135.000000 142.000000 138.000000 130.000000 125.000000 
+126.000000 129.000000 128.000000 125.000000 125.000000 127.000000 
+131.000000 134.000000 134.000000 129.000000 119.000000 111.000000 
+102.000000 88.000000 72.000000 63.000000 69.000000 87.000000 
+106.000000 120.000000 128.000000 131.000000 128.000000 124.000000 
+122.000000 123.000000 128.000000 134.000000 135.000000 126.000000 
+107.000000 94.000000 97.000000 113.000000 129.000000 131.000000 
+125.000000 120.000000 122.000000 128.000000 133.000000 137.000000 
+138.000000 136.000000 131.000000 125.000000 122.000000 125.000000 
+130.000000 125.000000 112.000000 103.000000 110.000000 123.000000 
+126.000000 118.000000 112.000000 116.000000 117.000000 127.000000 
+134.000000 133.000000 130.000000 127.000000 125.000000 125.000000 
+123.000000 118.000000 116.000000 128.000000 150.000000 160.000000 
+145.000000 127.000000 121.000000 128.000000 137.000000 134.000000 
+126.000000 129.000000 136.000000 135.000000 125.000000 118.000000 
+119.000000 121.000000 119.000000 117.000000 115.000000 104.000000 
+86.000000 76.000000 85.000000 105.000000 122.000000 127.000000 
+130.000000 131.000000 128.000000 123.000000 124.000000 130.000000 
+135.000000 136.000000 134.000000 125.000000 108.000000 90.000000 
+87.000000 102.000000 119.000000 128.000000 128.000000 127.000000 
+130.000000 134.000000 136.000000 138.000000 139.000000 136.000000 
+131.000000 127.000000 125.000000 124.000000 122.000000 123.000000 
+127.000000 131.000000 132.000000 130.000000 126.000000 121.000000 
+117.000000 116.000000 121.000000 126.000000 132.000000 132.000000 
+128.000000 123.000000 122.000000 120.000000 112.000000 104.000000 
+118.000000 161.000000 195.000000 181.000000 139.000000 115.000000 
+117.000000 132.000000 139.000000 134.000000 129.000000 132.000000 
+133.000000 127.000000 120.000000 119.000000 121.000000 119.000000 
+115.000000 116.000000 119.000000 114.000000 102.000000 96.000000 
+102.000000 116.000000 125.000000 128.000000 129.000000 130.000000 
+127.000000 121.000000 120.000000 126.000000 134.000000 137.000000 
+133.000000 124.000000 114.000000 99.000000 89.000000 94.000000 
+110.000000 127.000000 132.000000 130.000000 129.000000 133.000000 
+136.000000 135.000000 134.000000 133.000000 132.000000 128.000000 
+126.000000 125.000000 124.000000 122.000000 123.000000 128.000000 
+131.000000 129.000000 124.000000 121.000000 120.000000 119.000000 
+129.000000 124.000000 120.000000 120.000000 123.000000 128.000000 
+131.000000 126.000000 115.000000 115.000000 147.000000 205.000000 
+227.000000 189.000000 136.000000 114.000000 118.000000 131.000000 
+136.000000 132.000000 125.000000 122.000000 122.000000 126.000000 
+131.000000 134.000000 131.000000 125.000000 121.000000 122.000000 
+124.000000 122.000000 115.000000 111.000000 116.000000 125.000000 
+132.000000 134.000000 130.000000 124.000000 119.000000 119.000000 
+123.000000 127.000000 128.000000 126.000000 124.000000 125.000000 
+125.000000 118.000000 105.000000 98.000000 106.000000 120.000000 
+128.000000 128.000000 125.000000 127.000000 131.000000 133.000000 
+134.000000 135.000000 133.000000 130.000000 129.000000 132.000000 
+134.000000 130.000000 124.000000 122.000000 122.000000 121.000000 
+118.000000 116.000000 113.000000 112.000000 128.000000 124.000000 
+117.000000 112.000000 117.000000 130.000000 137.000000 125.000000 
+107.000000 115.000000 171.000000 235.000000 239.000000 182.000000 
+129.000000 119.000000 132.000000 143.000000 142.000000 134.000000 
+128.000000 125.000000 126.000000 129.000000 133.000000 134.000000 
+132.000000 130.000000 128.000000 128.000000 124.000000 116.000000 
+107.000000 104.000000 108.000000 117.000000 124.000000 129.000000 
+130.000000 128.000000 125.000000 121.000000 119.000000 121.000000 
+125.000000 128.000000 128.000000 127.000000 123.000000 113.000000 
+102.000000 99.000000 107.000000 118.000000 125.000000 125.000000 
+125.000000 128.000000 129.000000 129.000000 128.000000 129.000000 
+130.000000 131.000000 132.000000 133.000000 133.000000 130.000000 
+127.000000 125.000000 124.000000 124.000000 121.000000 117.000000 
+111.000000 108.000000 121.000000 116.000000 116.000000 117.000000 
+120.000000 125.000000 125.000000 115.000000 109.000000 133.000000 
+197.000000 243.000000 224.000000 169.000000 134.000000 127.000000 
+129.000000 133.000000 134.000000 132.000000 128.000000 124.000000 
+123.000000 126.000000 129.000000 130.000000 130.000000 129.000000 
+127.000000 122.000000 118.000000 114.000000 110.000000 112.000000 
+120.000000 131.000000 137.000000 136.000000 131.000000 128.000000 
+129.000000 132.000000 131.000000 127.000000 125.000000 125.000000 
+127.000000 129.000000 129.000000 126.000000 121.000000 118.000000 
+116.000000 117.000000 122.000000 130.000000 135.000000 133.000000 
+126.000000 123.000000 126.000000 131.000000 130.000000 127.000000 
+126.000000 129.000000 129.000000 126.000000 124.000000 127.000000 
+130.000000 127.000000 119.000000 115.000000 116.000000 119.000000 
+126.000000 121.000000 119.000000 122.000000 129.000000 131.000000 
+122.000000 109.000000 112.000000 155.000000 226.000000 252.000000 
+210.000000 151.000000 126.000000 126.000000 131.000000 132.000000 
+129.000000 126.000000 123.000000 122.000000 124.000000 128.000000 
+132.000000 134.000000 135.000000 135.000000 131.000000 124.000000 
+118.000000 119.000000 126.000000 134.000000 137.000000 136.000000 
+133.000000 131.000000 128.000000 126.000000 126.000000 129.000000 
+129.000000 127.000000 125.000000 126.000000 127.000000 126.000000 
+127.000000 128.000000 129.000000 128.000000 124.000000 123.000000 
+128.000000 132.000000 131.000000 128.000000 127.000000 129.000000 
+132.000000 131.000000 129.000000 129.000000 133.000000 134.000000 
+130.000000 123.000000 119.000000 121.000000 125.000000 125.000000 
+121.000000 116.000000 115.000000 114.000000 128.000000 129.000000 
+128.000000 128.000000 130.000000 130.000000 123.000000 115.000000 
+127.000000 177.000000 233.000000 233.000000 176.000000 126.000000 
+120.000000 127.000000 133.000000 133.000000 132.000000 133.000000 
+132.000000 129.000000 127.000000 128.000000 131.000000 134.000000 
+134.000000 131.000000 127.000000 121.000000 116.000000 117.000000 
+125.000000 134.000000 139.000000 139.000000 134.000000 130.000000 
+128.000000 128.000000 129.000000 129.000000 126.000000 122.000000 
+123.000000 130.000000 132.000000 124.000000 117.000000 120.000000 
+134.000000 143.000000 135.000000 123.000000 123.000000 129.000000 
+135.000000 135.000000 132.000000 131.000000 132.000000 131.000000 
+128.000000 125.000000 125.000000 126.000000 126.000000 125.000000 
+125.000000 125.000000 124.000000 122.000000 119.000000 118.000000 
+118.000000 117.000000 131.000000 130.000000 127.000000 124.000000 
+124.000000 123.000000 116.000000 113.000000 133.000000 186.000000 
+232.000000 213.000000 151.000000 113.000000 116.000000 126.000000 
+127.000000 121.000000 119.000000 124.000000 129.000000 130.000000 
+129.000000 129.000000 130.000000 132.000000 131.000000 126.000000 
+119.000000 117.000000 118.000000 122.000000 127.000000 129.000000 
+129.000000 128.000000 129.000000 131.000000 134.000000 136.000000 
+137.000000 134.000000 127.000000 121.000000 124.000000 133.000000 
+134.000000 123.000000 116.000000 128.000000 156.000000 177.000000 
+165.000000 135.000000 120.000000 125.000000 136.000000 140.000000 
+136.000000 132.000000 130.000000 130.000000 131.000000 132.000000 
+132.000000 129.000000 123.000000 120.000000 123.000000 129.000000 
+131.000000 130.000000 127.000000 124.000000 119.000000 113.000000 
+144.000000 142.000000 133.000000 121.000000 96.000000 61.000000 
+32.000000 18.000000 7.000000 5.000000 11.000000 10.000000 
+17.000000 19.000000 20.000000 15.000000 10.000000 7.000000 
+20.000000 25.000000 15.000000 21.000000 44.000000 51.000000 
+45.000000 37.000000 40.000000 46.000000 51.000000 59.000000 
+57.000000 46.000000 36.000000 36.000000 41.000000 44.000000 
+42.000000 35.000000 26.000000 17.000000 12.000000 11.000000 
+15.000000 21.000000 20.000000 20.000000 23.000000 26.000000 
+37.000000 41.000000 39.000000 39.000000 39.000000 28.000000 
+9.000000 25.000000 54.000000 68.000000 69.000000 62.000000 
+51.000000 35.000000 20.000000 27.000000 56.000000 86.000000 
+111.000000 122.000000 110.000000 86.000000 75.000000 86.000000 
+105.000000 104.000000 83.000000 65.000000 99.000000 90.000000 
+101.000000 119.000000 120.000000 97.000000 71.000000 50.000000 
+30.000000 21.000000 20.000000 16.000000 22.000000 27.000000 
+20.000000 11.000000 12.000000 19.000000 31.000000 25.000000 
+10.000000 32.000000 55.000000 55.000000 38.000000 20.000000 
+14.000000 19.000000 35.000000 48.000000 52.000000 48.000000 
+35.000000 21.000000 23.000000 28.000000 27.000000 25.000000 
+21.000000 16.000000 8.000000 8.000000 10.000000 15.000000 
+19.000000 23.000000 36.000000 56.000000 74.000000 78.000000 
+67.000000 55.000000 47.000000 26.000000 12.000000 31.000000 
+60.000000 73.000000 64.000000 43.000000 24.000000 16.000000 
+15.000000 29.000000 60.000000 94.000000 112.000000 106.000000 
+85.000000 72.000000 75.000000 85.000000 87.000000 80.000000 
+79.000000 90.000000 86.000000 82.000000 100.000000 122.000000 
+126.000000 111.000000 94.000000 85.000000 75.000000 55.000000 
+32.000000 18.000000 16.000000 17.000000 14.000000 17.000000 
+22.000000 25.000000 27.000000 25.000000 18.000000 23.000000 
+47.000000 73.000000 83.000000 71.000000 45.000000 23.000000 
+14.000000 12.000000 8.000000 8.000000 10.000000 5.000000 
+5.000000 4.000000 4.000000 14.000000 18.000000 16.000000 
+6.000000 7.000000 12.000000 16.000000 33.000000 60.000000 
+87.000000 103.000000 105.000000 97.000000 78.000000 55.000000 
+42.000000 22.000000 21.000000 39.000000 53.000000 57.000000 
+42.000000 19.000000 13.000000 19.000000 21.000000 29.000000 
+52.000000 78.000000 92.000000 97.000000 97.000000 98.000000 
+100.000000 104.000000 104.000000 97.000000 92.000000 99.000000 
+105.000000 101.000000 108.000000 119.000000 127.000000 125.000000 
+115.000000 107.000000 102.000000 91.000000 65.000000 36.000000 
+19.000000 11.000000 10.000000 13.000000 14.000000 24.000000 
+37.000000 33.000000 16.000000 31.000000 85.000000 138.000000 
+161.000000 142.000000 102.000000 70.000000 64.000000 72.000000 
+78.000000 77.000000 73.000000 65.000000 54.000000 34.000000 
+17.000000 15.000000 24.000000 16.000000 4.000000 7.000000 
+15.000000 42.000000 70.000000 85.000000 106.000000 127.000000 
+126.000000 106.000000 82.000000 55.000000 33.000000 14.000000 
+17.000000 32.000000 28.000000 17.000000 13.000000 18.000000 
+25.000000 20.000000 19.000000 31.000000 49.000000 70.000000 
+91.000000 107.000000 116.000000 120.000000 120.000000 117.000000 
+113.000000 106.000000 98.000000 101.000000 112.000000 100.000000 
+95.000000 105.000000 126.000000 135.000000 122.000000 111.000000 
+112.000000 112.000000 91.000000 56.000000 28.000000 13.000000 
+13.000000 23.000000 30.000000 36.000000 42.000000 48.000000 
+35.000000 22.000000 93.000000 145.000000 151.000000 130.000000 
+116.000000 128.000000 151.000000 163.000000 159.000000 146.000000 
+139.000000 134.000000 117.000000 87.000000 55.000000 32.000000 
+32.000000 44.000000 70.000000 95.000000 95.000000 111.000000 
+141.000000 139.000000 121.000000 120.000000 125.000000 112.000000 
+80.000000 45.000000 26.000000 13.000000 5.000000 9.000000 
+18.000000 20.000000 16.000000 15.000000 16.000000 17.000000 
+20.000000 33.000000 60.000000 88.000000 105.000000 111.000000 
+114.000000 121.000000 127.000000 124.000000 114.000000 106.000000 
+105.000000 110.000000 129.000000 107.000000 88.000000 95.000000 
+119.000000 131.000000 123.000000 114.000000 114.000000 115.000000 
+103.000000 78.000000 50.000000 27.000000 15.000000 20.000000 
+31.000000 36.000000 41.000000 51.000000 41.000000 13.000000 
+90.000000 141.000000 150.000000 139.000000 141.000000 166.000000 
+187.000000 176.000000 143.000000 134.000000 156.000000 173.000000 
+164.000000 136.000000 103.000000 75.000000 67.000000 90.000000 
+132.000000 162.000000 162.000000 155.000000 165.000000 170.000000 
+159.000000 144.000000 131.000000 110.000000 72.000000 30.000000 
+11.000000 14.000000 15.000000 13.000000 22.000000 29.000000 
+18.000000 4.000000 8.000000 27.000000 42.000000 55.000000 
+78.000000 102.000000 116.000000 124.000000 131.000000 135.000000 
+133.000000 126.000000 123.000000 124.000000 127.000000 126.000000 
+131.000000 110.000000 91.000000 90.000000 104.000000 115.000000 
+115.000000 114.000000 118.000000 124.000000 122.000000 108.000000 
+88.000000 63.000000 33.000000 13.000000 24.000000 35.000000 
+40.000000 61.000000 57.000000 25.000000 93.000000 158.000000 
+171.000000 154.000000 142.000000 151.000000 162.000000 146.000000 
+122.000000 130.000000 157.000000 169.000000 163.000000 146.000000 
+129.000000 118.000000 119.000000 134.000000 144.000000 139.000000 
+126.000000 121.000000 134.000000 156.000000 172.000000 161.000000 
+124.000000 81.000000 44.000000 13.000000 7.000000 14.000000 
+21.000000 18.000000 16.000000 15.000000 11.000000 2.000000 
+18.000000 57.000000 78.000000 89.000000 112.000000 129.000000 
+128.000000 124.000000 130.000000 138.000000 136.000000 123.000000 
+112.000000 109.000000 111.000000 114.000000 136.000000 119.000000 
+91.000000 71.000000 70.000000 85.000000 106.000000 122.000000 
+130.000000 134.000000 136.000000 131.000000 119.000000 100.000000 
+72.000000 40.000000 27.000000 38.000000 50.000000 61.000000 
+58.000000 28.000000 90.000000 160.000000 174.000000 154.000000 
+135.000000 133.000000 136.000000 131.000000 132.000000 145.000000 
+155.000000 156.000000 152.000000 150.000000 150.000000 147.000000 
+141.000000 133.000000 128.000000 120.000000 110.000000 105.000000 
+115.000000 139.000000 157.000000 142.000000 90.000000 36.000000 
+15.000000 19.000000 33.000000 29.000000 15.000000 10.000000 
+16.000000 26.000000 24.000000 21.000000 53.000000 103.000000 
+127.000000 133.000000 139.000000 138.000000 127.000000 123.000000 
+130.000000 137.000000 132.000000 118.000000 103.000000 96.000000 
+96.000000 101.000000 135.000000 126.000000 100.000000 72.000000 
+59.000000 69.000000 96.000000 119.000000 130.000000 141.000000 
+153.000000 152.000000 131.000000 105.000000 83.000000 60.000000 
+47.000000 63.000000 79.000000 85.000000 74.000000 33.000000 
+88.000000 157.000000 175.000000 158.000000 137.000000 132.000000 
+134.000000 133.000000 129.000000 127.000000 131.000000 138.000000 
+139.000000 137.000000 138.000000 145.000000 144.000000 127.000000 
+110.000000 107.000000 116.000000 123.000000 126.000000 132.000000 
+137.000000 125.000000 86.000000 41.000000 18.000000 20.000000 
+28.000000 21.000000 11.000000 21.000000 43.000000 58.000000 
+63.000000 82.000000 116.000000 141.000000 153.000000 156.000000 
+148.000000 133.000000 124.000000 126.000000 134.000000 137.000000 
+129.000000 113.000000 98.000000 92.000000 96.000000 103.000000 
+129.000000 125.000000 106.000000 78.000000 60.000000 68.000000 
+95.000000 119.000000 129.000000 134.000000 141.000000 142.000000 
+132.000000 116.000000 100.000000 83.000000 77.000000 84.000000 
+88.000000 93.000000 76.000000 61.000000 113.000000 159.000000 
+165.000000 151.000000 139.000000 136.000000 132.000000 120.000000 
+107.000000 107.000000 119.000000 134.000000 137.000000 125.000000 
+111.000000 110.000000 114.000000 113.000000 107.000000 110.000000 
+123.000000 133.000000 132.000000 123.000000 116.000000 108.000000 
+92.000000 65.000000 29.000000 9.000000 17.000000 24.000000 
+27.000000 44.000000 68.000000 91.000000 118.000000 143.000000 
+154.000000 146.000000 138.000000 137.000000 136.000000 130.000000 
+124.000000 123.000000 127.000000 131.000000 126.000000 111.000000 
+93.000000 82.000000 84.000000 95.000000 129.000000 131.000000 
+117.000000 87.000000 66.000000 70.000000 90.000000 108.000000 
+119.000000 128.000000 134.000000 133.000000 129.000000 125.000000 
+118.000000 103.000000 94.000000 99.000000 101.000000 81.000000 
+51.000000 81.000000 131.000000 145.000000 140.000000 136.000000 
+139.000000 138.000000 126.000000 113.000000 109.000000 118.000000 
+131.000000 141.000000 140.000000 126.000000 111.000000 111.000000 
+122.000000 128.000000 124.000000 119.000000 124.000000 136.000000 
+140.000000 130.000000 116.000000 108.000000 96.000000 66.000000 
+17.000000 15.000000 38.000000 49.000000 60.000000 77.000000 
+99.000000 126.000000 149.000000 156.000000 147.000000 134.000000 
+125.000000 122.000000 118.000000 110.000000 108.000000 116.000000 
+124.000000 125.000000 122.000000 129.000000 139.000000 134.000000 
+111.000000 96.000000 139.000000 141.000000 120.000000 89.000000 
+74.000000 81.000000 94.000000 102.000000 111.000000 121.000000 
+129.000000 132.000000 134.000000 133.000000 124.000000 107.000000 
+94.000000 93.000000 91.000000 76.000000 62.000000 79.000000 
+93.000000 94.000000 99.000000 114.000000 127.000000 127.000000 
+122.000000 120.000000 122.000000 124.000000 128.000000 135.000000 
+139.000000 133.000000 127.000000 135.000000 148.000000 150.000000 
+137.000000 128.000000 135.000000 146.000000 139.000000 119.000000 
+105.000000 99.000000 89.000000 62.000000 25.000000 31.000000 
+54.000000 76.000000 98.000000 115.000000 129.000000 143.000000 
+150.000000 150.000000 146.000000 140.000000 130.000000 117.000000 
+107.000000 106.000000 114.000000 123.000000 124.000000 114.000000 
+107.000000 119.000000 158.000000 190.000000 176.000000 140.000000 
+146.000000 141.000000 124.000000 106.000000 96.000000 97.000000 
+109.000000 118.000000 121.000000 117.000000 113.000000 119.000000 
+130.000000 130.000000 114.000000 95.000000 84.000000 78.000000 
+75.000000 76.000000 83.000000 80.000000 62.000000 51.000000 
+64.000000 91.000000 109.000000 117.000000 124.000000 130.000000 
+131.000000 124.000000 118.000000 120.000000 127.000000 133.000000 
+140.000000 146.000000 148.000000 141.000000 133.000000 133.000000 
+140.000000 139.000000 125.000000 107.000000 95.000000 85.000000 
+71.000000 55.000000 51.000000 62.000000 84.000000 105.000000 
+117.000000 124.000000 131.000000 137.000000 139.000000 140.000000 
+142.000000 138.000000 125.000000 114.000000 126.000000 153.000000 
+164.000000 150.000000 127.000000 113.000000 106.000000 100.000000 
+109.000000 137.000000 159.000000 155.000000 132.000000 128.000000 
+137.000000 144.000000 132.000000 112.000000 107.000000 111.000000 
+110.000000 107.000000 111.000000 114.000000 105.000000 90.000000 
+83.000000 88.000000 85.000000 71.000000 66.000000 85.000000 
+116.000000 125.000000 106.000000 82.000000 76.000000 85.000000 
+100.000000 117.000000 130.000000 131.000000 125.000000 122.000000 
+123.000000 123.000000 122.000000 121.000000 125.000000 133.000000 
+137.000000 138.000000 138.000000 137.000000 131.000000 119.000000 
+104.000000 89.000000 77.000000 67.000000 63.000000 69.000000 
+82.000000 100.000000 114.000000 117.000000 118.000000 124.000000 
+129.000000 134.000000 140.000000 144.000000 140.000000 125.000000 
+114.000000 127.000000 171.000000 212.000000 205.000000 153.000000 
+107.000000 97.000000 107.000000 108.000000 97.000000 93.000000 
+106.000000 120.000000 132.000000 124.000000 126.000000 130.000000 
+130.000000 127.000000 123.000000 118.000000 114.000000 119.000000 
+125.000000 117.000000 94.000000 76.000000 78.000000 86.000000 
+83.000000 73.000000 78.000000 97.000000 118.000000 121.000000 
+106.000000 90.000000 84.000000 86.000000 100.000000 120.000000 
+127.000000 122.000000 118.000000 124.000000 134.000000 140.000000 
+136.000000 126.000000 118.000000 119.000000 126.000000 133.000000 
+139.000000 139.000000 128.000000 102.000000 73.000000 52.000000 
+46.000000 49.000000 60.000000 76.000000 85.000000 85.000000 
+83.000000 86.000000 98.000000 111.000000 116.000000 121.000000 
+133.000000 146.000000 144.000000 126.000000 115.000000 136.000000 
+186.000000 220.000000 195.000000 132.000000 86.000000 83.000000 
+99.000000 111.000000 118.000000 124.000000 121.000000 113.000000 
+138.000000 128.000000 121.000000 123.000000 132.000000 137.000000 
+135.000000 130.000000 132.000000 136.000000 127.000000 111.000000 
+103.000000 102.000000 97.000000 85.000000 81.000000 91.000000 
+100.000000 91.000000 72.000000 60.000000 57.000000 58.000000 
+63.000000 68.000000 83.000000 102.000000 107.000000 104.000000 
+105.000000 118.000000 132.000000 140.000000 136.000000 125.000000 
+114.000000 109.000000 114.000000 122.000000 126.000000 122.000000 
+107.000000 85.000000 65.000000 55.000000 56.000000 60.000000 
+62.000000 63.000000 63.000000 59.000000 54.000000 55.000000 
+63.000000 73.000000 84.000000 96.000000 109.000000 121.000000 
+125.000000 123.000000 121.000000 132.000000 154.000000 163.000000 
+143.000000 108.000000 86.000000 93.000000 112.000000 120.000000 
+118.000000 117.000000 117.000000 114.000000 135.000000 131.000000 
+132.000000 137.000000 139.000000 137.000000 132.000000 127.000000 
+122.000000 113.000000 105.000000 106.000000 111.000000 108.000000 
+98.000000 88.000000 86.000000 86.000000 75.000000 58.000000 
+48.000000 54.000000 60.000000 56.000000 50.000000 48.000000 
+62.000000 79.000000 80.000000 72.000000 75.000000 95.000000 
+116.000000 124.000000 117.000000 101.000000 87.000000 81.000000 
+89.000000 107.000000 118.000000 111.000000 88.000000 68.000000 
+63.000000 70.000000 73.000000 68.000000 61.000000 58.000000 
+63.000000 68.000000 65.000000 59.000000 56.000000 56.000000 
+60.000000 67.000000 78.000000 91.000000 101.000000 103.000000 
+98.000000 95.000000 92.000000 90.000000 92.000000 92.000000 
+90.000000 103.000000 123.000000 130.000000 124.000000 115.000000 
+110.000000 111.000000 125.000000 127.000000 133.000000 133.000000 
+127.000000 126.000000 128.000000 126.000000 118.000000 110.000000 
+110.000000 113.000000 113.000000 104.000000 91.000000 82.000000 
+77.000000 70.000000 62.000000 57.000000 65.000000 85.000000 
+89.000000 71.000000 51.000000 44.000000 55.000000 68.000000 
+65.000000 54.000000 53.000000 69.000000 84.000000 90.000000 
+88.000000 79.000000 67.000000 63.000000 74.000000 97.000000 
+113.000000 106.000000 82.000000 62.000000 59.000000 70.000000 
+79.000000 78.000000 70.000000 63.000000 58.000000 54.000000 
+49.000000 47.000000 47.000000 48.000000 49.000000 49.000000 
+51.000000 58.000000 65.000000 69.000000 67.000000 58.000000 
+49.000000 53.000000 74.000000 94.000000 101.000000 107.000000 
+118.000000 125.000000 121.000000 109.000000 104.000000 112.000000 
+119.000000 121.000000 124.000000 127.000000 129.000000 130.000000 
+129.000000 128.000000 127.000000 125.000000 121.000000 119.000000 
+121.000000 118.000000 105.000000 98.000000 108.000000 123.000000 
+129.000000 123.000000 124.000000 137.000000 128.000000 91.000000 
+57.000000 47.000000 60.000000 69.000000 60.000000 45.000000 
+40.000000 48.000000 60.000000 72.000000 79.000000 72.000000 
+55.000000 47.000000 61.000000 91.000000 113.000000 109.000000 
+86.000000 67.000000 64.000000 78.000000 93.000000 95.000000 
+90.000000 85.000000 77.000000 61.000000 45.000000 43.000000 
+51.000000 60.000000 64.000000 62.000000 61.000000 63.000000 
+67.000000 76.000000 85.000000 80.000000 69.000000 71.000000 
+90.000000 114.000000 124.000000 119.000000 114.000000 117.000000 
+118.000000 110.000000 105.000000 114.000000 118.000000 119.000000 
+122.000000 130.000000 137.000000 136.000000 131.000000 133.000000 
+138.000000 134.000000 125.000000 126.000000 131.000000 123.000000 
+103.000000 109.000000 160.000000 236.000000 267.000000 252.000000 
+236.000000 209.000000 158.000000 90.000000 49.000000 45.000000 
+67.000000 74.000000 57.000000 41.000000 42.000000 58.000000 
+76.000000 89.000000 87.000000 71.000000 51.000000 42.000000 
+59.000000 93.000000 120.000000 117.000000 89.000000 65.000000 
+68.000000 96.000000 123.000000 127.000000 119.000000 119.000000 
+120.000000 98.000000 60.000000 46.000000 66.000000 100.000000 
+116.000000 106.000000 96.000000 100.000000 112.000000 121.000000 
+121.000000 115.000000 112.000000 117.000000 126.000000 130.000000 
+127.000000 122.000000 121.000000 122.000000 120.000000 115.000000 
+113.000000 117.000000 117.000000 123.000000 132.000000 138.000000 
+132.000000 120.000000 115.000000 123.000000 133.000000 130.000000 
+122.000000 124.000000 130.000000 126.000000 109.000000 102.000000 
+133.000000 223.000000 323.000000 394.000000 392.000000 288.000000 
+158.000000 84.000000 50.000000 49.000000 61.000000 64.000000 
+53.000000 46.000000 49.000000 70.000000 101.000000 123.000000 
+119.000000 93.000000 66.000000 53.000000 61.000000 89.000000 
+115.000000 114.000000 92.000000 72.000000 72.000000 103.000000 
+144.000000 175.000000 196.000000 208.000000 201.000000 153.000000 
+93.000000 79.000000 103.000000 129.000000 137.000000 132.000000 
+128.000000 129.000000 130.000000 129.000000 128.000000 128.000000 
+128.000000 129.000000 130.000000 129.000000 123.000000 120.000000 
+125.000000 128.000000 124.000000 118.000000 119.000000 124.000000 
+119.000000 126.000000 130.000000 124.000000 116.000000 115.000000 
+119.000000 120.000000 119.000000 118.000000 121.000000 122.000000 
+122.000000 125.000000 126.000000 117.000000 107.000000 132.000000 
+238.000000 369.000000 373.000000 227.000000 86.000000 57.000000 
+50.000000 55.000000 49.000000 48.000000 54.000000 56.000000 
+53.000000 67.000000 102.000000 143.000000 155.000000 127.000000 
+87.000000 62.000000 64.000000 85.000000 106.000000 108.000000 
+94.000000 73.000000 61.000000 91.000000 190.000000 301.000000 
+364.000000 367.000000 305.000000 194.000000 126.000000 126.000000 
+137.000000 134.000000 125.000000 123.000000 130.000000 132.000000 
+123.000000 111.000000 109.000000 118.000000 129.000000 133.000000 
+129.000000 124.000000 122.000000 123.000000 123.000000 122.000000 
+121.000000 124.000000 128.000000 127.000000 123.000000 125.000000 
+125.000000 121.000000 121.000000 124.000000 123.000000 115.000000 
+109.000000 116.000000 132.000000 135.000000 123.000000 114.000000 
+119.000000 129.000000 130.000000 126.000000 134.000000 158.000000 
+142.000000 79.000000 39.000000 39.000000 50.000000 55.000000 
+47.000000 45.000000 52.000000 56.000000 52.000000 62.000000 
+93.000000 134.000000 149.000000 121.000000 76.000000 54.000000 
+64.000000 85.000000 97.000000 98.000000 87.000000 64.000000 
+51.000000 87.000000 235.000000 383.000000 425.000000 359.000000 
+249.000000 154.000000 123.000000 126.000000 123.000000 121.000000 
+127.000000 132.000000 130.000000 126.000000 123.000000 115.000000 
+107.000000 110.000000 125.000000 138.000000 137.000000 127.000000 
+119.000000 120.000000 123.000000 126.000000 127.000000 125.000000 
+120.000000 116.000000 123.000000 118.000000 118.000000 124.000000 
+129.000000 127.000000 119.000000 113.000000 114.000000 122.000000 
+128.000000 126.000000 121.000000 117.000000 121.000000 130.000000 
+137.000000 135.000000 117.000000 81.000000 53.000000 45.000000 
+47.000000 48.000000 50.000000 49.000000 50.000000 53.000000 
+56.000000 55.000000 51.000000 56.000000 80.000000 111.000000 
+119.000000 98.000000 71.000000 64.000000 78.000000 87.000000 
+79.000000 67.000000 60.000000 57.000000 59.000000 82.000000 
+157.000000 220.000000 210.000000 150.000000 112.000000 119.000000 
+129.000000 123.000000 118.000000 125.000000 135.000000 135.000000 
+123.000000 112.000000 109.000000 108.000000 109.000000 117.000000 
+131.000000 140.000000 137.000000 127.000000 122.000000 126.000000 
+130.000000 130.000000 124.000000 118.000000 116.000000 119.000000 
+123.000000 126.000000 129.000000 133.000000 135.000000 130.000000 
+119.000000 113.000000 117.000000 124.000000 124.000000 119.000000 
+119.000000 124.000000 129.000000 130.000000 131.000000 132.000000 
+123.000000 103.000000 79.000000 63.000000 60.000000 60.000000 
+56.000000 49.000000 47.000000 51.000000 58.000000 58.000000 
+54.000000 53.000000 62.000000 76.000000 80.000000 75.000000 
+68.000000 74.000000 83.000000 80.000000 67.000000 62.000000 
+71.000000 81.000000 78.000000 61.000000 57.000000 60.000000 
+63.000000 84.000000 116.000000 130.000000 125.000000 117.000000 
+119.000000 128.000000 132.000000 128.000000 121.000000 118.000000 
+116.000000 113.000000 112.000000 117.000000 128.000000 135.000000 
+135.000000 130.000000 127.000000 128.000000 130.000000 127.000000 
+123.000000 120.000000 121.000000 123.000000 129.000000 131.000000 
+129.000000 128.000000 129.000000 127.000000 122.000000 120.000000 
+123.000000 125.000000 122.000000 118.000000 116.000000 121.000000 
+127.000000 132.000000 132.000000 129.000000 125.000000 122.000000 
+118.000000 109.000000 93.000000 76.000000 63.000000 54.000000 
+50.000000 52.000000 57.000000 61.000000 59.000000 53.000000 
+49.000000 50.000000 52.000000 50.000000 49.000000 58.000000 
+67.000000 68.000000 67.000000 73.000000 89.000000 99.000000 
+92.000000 69.000000 45.000000 43.000000 69.000000 103.000000 
+123.000000 126.000000 123.000000 123.000000 127.000000 130.000000 
+130.000000 128.000000 126.000000 124.000000 121.000000 119.000000 
+120.000000 122.000000 124.000000 126.000000 126.000000 127.000000 
+125.000000 121.000000 119.000000 120.000000 123.000000 124.000000 
+126.000000 128.000000 125.000000 122.000000 123.000000 130.000000 
+134.000000 132.000000 127.000000 123.000000 121.000000 119.000000 
+116.000000 112.000000 110.000000 114.000000 122.000000 129.000000 
+129.000000 124.000000 128.000000 145.000000 160.000000 153.000000 
+120.000000 82.000000 60.000000 54.000000 54.000000 56.000000 
+57.000000 57.000000 56.000000 53.000000 51.000000 50.000000 
+48.000000 44.000000 45.000000 54.000000 67.000000 76.000000 
+76.000000 69.000000 62.000000 57.000000 55.000000 53.000000 
+59.000000 75.000000 98.000000 118.000000 128.000000 128.000000 
+127.000000 126.000000 127.000000 128.000000 130.000000 130.000000 
+128.000000 124.000000 121.000000 119.000000 119.000000 120.000000 
+121.000000 123.000000 125.000000 126.000000 126.000000 123.000000 
+119.000000 117.000000 119.000000 123.000000 125.000000 127.000000 
+127.000000 127.000000 128.000000 131.000000 134.000000 131.000000 
+122.000000 116.000000 118.000000 124.000000 124.000000 119.000000 
+113.000000 111.000000 113.000000 115.000000 118.000000 126.000000 
+137.000000 147.000000 149.000000 139.000000 117.000000 91.000000 
+70.000000 57.000000 53.000000 54.000000 55.000000 57.000000 
+60.000000 64.000000 65.000000 61.000000 58.000000 64.000000 
+79.000000 91.000000 91.000000 80.000000 68.000000 58.000000 
+51.000000 49.000000 51.000000 56.000000 69.000000 91.000000 
+116.000000 130.000000 131.000000 125.000000 122.000000 123.000000 
+126.000000 128.000000 128.000000 127.000000 123.000000 120.000000 
+119.000000 121.000000 121.000000 121.000000 122.000000 123.000000 
+123.000000 123.000000 126.000000 128.000000 126.000000 122.000000 
+121.000000 124.000000 127.000000 128.000000 127.000000 131.000000 
+132.000000 134.000000 133.000000 126.000000 117.000000 114.000000 
+117.000000 120.000000 117.000000 115.000000 116.000000 120.000000 
+122.000000 125.000000 129.000000 133.000000 135.000000 133.000000 
+128.000000 116.000000 97.000000 73.000000 56.000000 49.000000 
+53.000000 60.000000 66.000000 69.000000 71.000000 70.000000 
+67.000000 63.000000 65.000000 78.000000 99.000000 117.000000 
+121.000000 107.000000 83.000000 61.000000 48.000000 52.000000 
+66.000000 83.000000 100.000000 114.000000 123.000000 124.000000 
+123.000000 125.000000 129.000000 130.000000 129.000000 128.000000 
+128.000000 125.000000 120.000000 116.000000 119.000000 125.000000 
+128.000000 125.000000 122.000000 121.000000 123.000000 124.000000 
+125.000000 125.000000 122.000000 120.000000 122.000000 129.000000 
+135.000000 131.000000 119.000000 126.000000 125.000000 124.000000 
+123.000000 123.000000 124.000000 129.000000 131.000000 127.000000 
+123.000000 122.000000 123.000000 122.000000 122.000000 126.000000 
+132.000000 134.000000 132.000000 134.000000 138.000000 132.000000 
+109.000000 80.000000 62.000000 57.000000 60.000000 65.000000 
+71.000000 75.000000 71.000000 63.000000 57.000000 56.000000 
+57.000000 59.000000 68.000000 85.000000 102.000000 103.000000 
+86.000000 68.000000 64.000000 78.000000 102.000000 120.000000 
+129.000000 131.000000 130.000000 129.000000 129.000000 131.000000 
+131.000000 127.000000 121.000000 118.000000 121.000000 123.000000 
+121.000000 119.000000 118.000000 119.000000 117.000000 114.000000 
+113.000000 115.000000 118.000000 120.000000 123.000000 126.000000 
+125.000000 122.000000 121.000000 124.000000 127.000000 126.000000 
+87.000000 105.000000 119.000000 124.000000 122.000000 120.000000 
+123.000000 128.000000 134.000000 138.000000 137.000000 131.000000 
+123.000000 121.000000 126.000000 134.000000 136.000000 131.000000 
+128.000000 133.000000 140.000000 137.000000 121.000000 99.000000 
+82.000000 70.000000 59.000000 50.000000 44.000000 43.000000 
+42.000000 41.000000 40.000000 42.000000 44.000000 41.000000 
+37.000000 42.000000 56.000000 68.000000 67.000000 63.000000 
+68.000000 84.000000 105.000000 120.000000 129.000000 135.000000 
+138.000000 137.000000 131.000000 125.000000 123.000000 121.000000 
+118.000000 116.000000 117.000000 121.000000 125.000000 127.000000 
+126.000000 124.000000 121.000000 119.000000 117.000000 116.000000 
+117.000000 118.000000 121.000000 123.000000 126.000000 128.000000 
+127.000000 123.000000 120.000000 123.000000 77.000000 90.000000 
+112.000000 128.000000 130.000000 126.000000 125.000000 129.000000 
+134.000000 135.000000 132.000000 129.000000 130.000000 134.000000 
+138.000000 138.000000 134.000000 132.000000 134.000000 139.000000 
+139.000000 127.000000 105.000000 82.000000 65.000000 56.000000 
+54.000000 52.000000 49.000000 46.000000 42.000000 39.000000 
+38.000000 44.000000 53.000000 61.000000 59.000000 49.000000 
+39.000000 37.000000 40.000000 42.000000 46.000000 58.000000 
+80.000000 104.000000 121.000000 129.000000 133.000000 135.000000 
+135.000000 132.000000 129.000000 125.000000 118.000000 114.000000 
+116.000000 119.000000 120.000000 119.000000 121.000000 126.000000 
+129.000000 126.000000 122.000000 118.000000 114.000000 113.000000 
+117.000000 126.000000 131.000000 129.000000 123.000000 121.000000 
+125.000000 129.000000 128.000000 116.000000 111.000000 115.000000 
+121.000000 123.000000 127.000000 134.000000 139.000000 135.000000 
+129.000000 129.000000 134.000000 139.000000 140.000000 135.000000 
+129.000000 125.000000 128.000000 135.000000 136.000000 120.000000 
+90.000000 65.000000 58.000000 64.000000 72.000000 85.000000 
+104.000000 119.000000 116.000000 98.000000 85.000000 94.000000 
+125.000000 151.000000 149.000000 115.000000 73.000000 49.000000 
+45.000000 49.000000 53.000000 54.000000 65.000000 91.000000 
+116.000000 126.000000 124.000000 128.000000 136.000000 138.000000 
+129.000000 119.000000 116.000000 119.000000 122.000000 121.000000 
+119.000000 120.000000 124.000000 129.000000 130.000000 126.000000 
+122.000000 120.000000 119.000000 119.000000 122.000000 126.000000 
+130.000000 129.000000 124.000000 122.000000 123.000000 124.000000 
+120.000000 115.000000 117.000000 123.000000 129.000000 129.000000 
+125.000000 124.000000 125.000000 123.000000 119.000000 120.000000 
+129.000000 138.000000 139.000000 133.000000 126.000000 124.000000 
+130.000000 137.000000 135.000000 114.000000 81.000000 53.000000 
+54.000000 86.000000 122.000000 169.000000 236.000000 292.000000 
+287.000000 223.000000 157.000000 162.000000 245.000000 324.000000 
+330.000000 262.000000 177.000000 122.000000 86.000000 62.000000 
+59.000000 59.000000 66.000000 88.000000 114.000000 128.000000 
+129.000000 126.000000 128.000000 135.000000 138.000000 133.000000 
+125.000000 121.000000 122.000000 125.000000 130.000000 133.000000 
+133.000000 130.000000 126.000000 124.000000 124.000000 123.000000 
+120.000000 114.000000 109.000000 111.000000 117.000000 124.000000 
+125.000000 122.000000 121.000000 121.000000 121.000000 120.000000 
+124.000000 132.000000 141.000000 142.000000 135.000000 127.000000 
+123.000000 126.000000 129.000000 130.000000 132.000000 136.000000 
+140.000000 140.000000 135.000000 129.000000 125.000000 123.000000 
+117.000000 105.000000 89.000000 72.000000 60.000000 79.000000 
+125.000000 211.000000 346.000000 435.000000 379.000000 221.000000 
+103.000000 158.000000 326.000000 438.000000 413.000000 301.000000 
+198.000000 151.000000 130.000000 105.000000 81.000000 71.000000 
+75.000000 89.000000 108.000000 123.000000 132.000000 133.000000 
+132.000000 129.000000 127.000000 126.000000 127.000000 132.000000 
+134.000000 133.000000 133.000000 135.000000 138.000000 135.000000 
+128.000000 124.000000 123.000000 121.000000 115.000000 111.000000 
+113.000000 119.000000 122.000000 119.000000 118.000000 123.000000 
+128.000000 124.000000 127.000000 138.000000 140.000000 132.000000 
+125.000000 125.000000 128.000000 127.000000 121.000000 118.000000 
+120.000000 124.000000 127.000000 127.000000 127.000000 127.000000 
+120.000000 109.000000 105.000000 116.000000 130.000000 128.000000 
+107.000000 95.000000 97.000000 100.000000 93.000000 86.000000 
+133.000000 202.000000 208.000000 137.000000 76.000000 107.000000 
+200.000000 256.000000 220.000000 150.000000 121.000000 118.000000 
+113.000000 108.000000 111.000000 115.000000 107.000000 92.000000 
+87.000000 99.000000 118.000000 131.000000 138.000000 141.000000 
+141.000000 136.000000 131.000000 128.000000 126.000000 124.000000 
+127.000000 132.000000 133.000000 125.000000 116.000000 116.000000 
+118.000000 116.000000 113.000000 120.000000 132.000000 135.000000 
+123.000000 110.000000 108.000000 112.000000 115.000000 115.000000 
+124.000000 127.000000 130.000000 133.000000 132.000000 127.000000 
+124.000000 128.000000 133.000000 135.000000 132.000000 125.000000 
+115.000000 108.000000 115.000000 129.000000 132.000000 119.000000 
+106.000000 111.000000 132.000000 146.000000 136.000000 118.000000 
+114.000000 124.000000 131.000000 122.000000 104.000000 85.000000 
+73.000000 63.000000 50.000000 30.000000 13.000000 19.000000 
+46.000000 76.000000 91.000000 97.000000 100.000000 98.000000 
+97.000000 99.000000 107.000000 114.000000 112.000000 109.000000 
+117.000000 130.000000 137.000000 136.000000 135.000000 136.000000 
+131.000000 121.000000 117.000000 125.000000 136.000000 138.000000 
+134.000000 133.000000 135.000000 134.000000 128.000000 119.000000 
+116.000000 118.000000 116.000000 100.000000 82.000000 80.000000 
+95.000000 112.000000 120.000000 119.000000 131.000000 130.000000 
+129.000000 130.000000 129.000000 123.000000 119.000000 122.000000 
+127.000000 128.000000 124.000000 116.000000 108.000000 105.000000 
+108.000000 113.000000 120.000000 131.000000 139.000000 136.000000 
+132.000000 131.000000 128.000000 131.000000 135.000000 130.000000 
+115.000000 99.000000 93.000000 94.000000 95.000000 87.000000 
+68.000000 46.000000 40.000000 56.000000 79.000000 91.000000 
+92.000000 93.000000 98.000000 104.000000 109.000000 115.000000 
+120.000000 113.000000 95.000000 85.000000 95.000000 118.000000 
+134.000000 135.000000 133.000000 136.000000 135.000000 128.000000 
+122.000000 126.000000 132.000000 129.000000 119.000000 117.000000 
+126.000000 135.000000 130.000000 113.000000 100.000000 100.000000 
+108.000000 113.000000 113.000000 109.000000 107.000000 115.000000 
+127.000000 128.000000 123.000000 127.000000 134.000000 140.000000 
+136.000000 127.000000 121.000000 122.000000 124.000000 118.000000 
+107.000000 99.000000 106.000000 119.000000 130.000000 141.000000 
+150.000000 151.000000 138.000000 123.000000 118.000000 123.000000 
+129.000000 130.000000 128.000000 128.000000 126.000000 121.000000 
+113.000000 107.000000 100.000000 88.000000 71.000000 57.000000 
+61.000000 80.000000 97.000000 107.000000 114.000000 123.000000 
+130.000000 131.000000 132.000000 132.000000 131.000000 126.000000 
+120.000000 113.000000 109.000000 110.000000 117.000000 129.000000 
+139.000000 139.000000 132.000000 125.000000 121.000000 121.000000 
+125.000000 133.000000 140.000000 137.000000 129.000000 125.000000 
+126.000000 123.000000 115.000000 115.000000 127.000000 138.000000 
+136.000000 121.000000 103.000000 99.000000 110.000000 117.000000 
+126.000000 127.000000 129.000000 128.000000 126.000000 126.000000 
+129.000000 129.000000 125.000000 119.000000 113.000000 113.000000 
+132.000000 166.000000 191.000000 183.000000 151.000000 118.000000 
+103.000000 113.000000 129.000000 136.000000 134.000000 133.000000 
+134.000000 130.000000 124.000000 126.000000 133.000000 130.000000 
+107.000000 79.000000 65.000000 73.000000 90.000000 101.000000 
+106.000000 112.000000 122.000000 127.000000 124.000000 121.000000 
+122.000000 125.000000 128.000000 131.000000 135.000000 137.000000 
+131.000000 120.000000 112.000000 115.000000 125.000000 134.000000 
+134.000000 127.000000 121.000000 120.000000 125.000000 132.000000 
+136.000000 135.000000 132.000000 133.000000 137.000000 132.000000 
+116.000000 101.000000 109.000000 129.000000 134.000000 126.000000 
+115.000000 111.000000 119.000000 127.000000 132.000000 136.000000 
+135.000000 129.000000 124.000000 125.000000 126.000000 127.000000 
+125.000000 120.000000 117.000000 133.000000 183.000000 232.000000 
+230.000000 182.000000 141.000000 124.000000 127.000000 134.000000 
+133.000000 130.000000 128.000000 128.000000 125.000000 124.000000 
+129.000000 134.000000 130.000000 114.000000 89.000000 67.000000 
+58.000000 64.000000 78.000000 91.000000 103.000000 114.000000 
+121.000000 122.000000 120.000000 120.000000 124.000000 129.000000 
+133.000000 136.000000 139.000000 136.000000 126.000000 111.000000 
+101.000000 105.000000 118.000000 129.000000 130.000000 123.000000 
+121.000000 130.000000 138.000000 138.000000 132.000000 130.000000 
+131.000000 129.000000 127.000000 129.000000 134.000000 126.000000 
+107.000000 97.000000 104.000000 116.000000 122.000000 118.000000 
+114.000000 120.000000 127.000000 134.000000 131.000000 126.000000 
+124.000000 125.000000 126.000000 126.000000 125.000000 118.000000 
+114.000000 146.000000 220.000000 262.000000 234.000000 172.000000 
+129.000000 121.000000 132.000000 137.000000 132.000000 126.000000 
+126.000000 126.000000 124.000000 126.000000 132.000000 131.000000 
+120.000000 105.000000 93.000000 83.000000 71.000000 65.000000 
+69.000000 84.000000 101.000000 114.000000 121.000000 125.000000 
+125.000000 125.000000 126.000000 127.000000 128.000000 130.000000 
+131.000000 132.000000 127.000000 114.000000 105.000000 106.000000 
+119.000000 131.000000 133.000000 128.000000 126.000000 131.000000 
+135.000000 132.000000 130.000000 134.000000 137.000000 131.000000 
+121.000000 119.000000 128.000000 134.000000 126.000000 113.000000 
+111.000000 122.000000 131.000000 129.000000 121.000000 120.000000 
+119.000000 119.000000 123.000000 128.000000 129.000000 125.000000 
+125.000000 131.000000 131.000000 117.000000 114.000000 167.000000 
+246.000000 261.000000 208.000000 146.000000 113.000000 112.000000 
+124.000000 125.000000 118.000000 114.000000 117.000000 122.000000 
+127.000000 132.000000 135.000000 133.000000 128.000000 122.000000 
+110.000000 94.000000 80.000000 77.000000 87.000000 103.000000 
+118.000000 127.000000 131.000000 133.000000 134.000000 134.000000 
+133.000000 132.000000 133.000000 131.000000 125.000000 122.000000 
+125.000000 123.000000 114.000000 105.000000 108.000000 121.000000 
+132.000000 132.000000 129.000000 131.000000 138.000000 139.000000 
+134.000000 129.000000 127.000000 126.000000 125.000000 126.000000 
+128.000000 127.000000 125.000000 126.000000 132.000000 134.000000 
+129.000000 119.000000 113.000000 112.000000 128.000000 120.000000 
+120.000000 129.000000 134.000000 129.000000 127.000000 130.000000 
+125.000000 110.000000 123.000000 191.000000 249.000000 239.000000 
+180.000000 125.000000 106.000000 117.000000 130.000000 128.000000 
+122.000000 122.000000 125.000000 126.000000 130.000000 136.000000 
+138.000000 133.000000 124.000000 117.000000 114.000000 109.000000 
+104.000000 102.000000 107.000000 118.000000 129.000000 134.000000 
+132.000000 128.000000 129.000000 134.000000 135.000000 132.000000 
+130.000000 129.000000 127.000000 128.000000 137.000000 141.000000 
+127.000000 107.000000 97.000000 109.000000 129.000000 136.000000 
+130.000000 126.000000 131.000000 137.000000 136.000000 133.000000 
+130.000000 130.000000 130.000000 131.000000 131.000000 129.000000 
+125.000000 125.000000 129.000000 131.000000 129.000000 122.000000 
+117.000000 117.000000 133.000000 127.000000 125.000000 128.000000 
+129.000000 131.000000 136.000000 136.000000 119.000000 103.000000 
+133.000000 201.000000 235.000000 208.000000 150.000000 109.000000 
+109.000000 129.000000 133.000000 121.000000 114.000000 118.000000 
+125.000000 127.000000 130.000000 135.000000 137.000000 133.000000 
+127.000000 122.000000 118.000000 113.000000 109.000000 107.000000 
+111.000000 117.000000 124.000000 129.000000 130.000000 130.000000 
+132.000000 132.000000 127.000000 123.000000 126.000000 132.000000 
+130.000000 129.000000 142.000000 156.000000 152.000000 136.000000 
+108.000000 96.000000 115.000000 136.000000 141.000000 135.000000 
+128.000000 127.000000 129.000000 130.000000 127.000000 124.000000 
+127.000000 133.000000 135.000000 128.000000 117.000000 112.000000 
+117.000000 125.000000 129.000000 129.000000 124.000000 119.000000 
+130.000000 127.000000 128.000000 130.000000 132.000000 134.000000 
+134.000000 126.000000 108.000000 106.000000 150.000000 201.000000 
+211.000000 181.000000 135.000000 109.000000 118.000000 136.000000 
+137.000000 126.000000 121.000000 126.000000 130.000000 128.000000 
+125.000000 126.000000 129.000000 130.000000 129.000000 126.000000 
+121.000000 116.000000 112.000000 111.000000 114.000000 121.000000 
+129.000000 133.000000 130.000000 127.000000 130.000000 132.000000 
+127.000000 120.000000 123.000000 132.000000 131.000000 124.000000 
+136.000000 159.000000 170.000000 161.000000 126.000000 94.000000 
+107.000000 133.000000 139.000000 131.000000 127.000000 133.000000 
+136.000000 130.000000 123.000000 124.000000 131.000000 135.000000 
+131.000000 126.000000 125.000000 130.000000 134.000000 131.000000 
+125.000000 121.000000 121.000000 120.000000 126.000000 126.000000 
+126.000000 125.000000 127.000000 134.000000 131.000000 112.000000 
+89.000000 97.000000 157.000000 202.000000 194.000000 156.000000 
+123.000000 115.000000 128.000000 134.000000 127.000000 117.000000 
+117.000000 125.000000 130.000000 132.000000 133.000000 133.000000 
+131.000000 129.000000 129.000000 129.000000 129.000000 130.000000 
+129.000000 125.000000 119.000000 121.000000 132.000000 141.000000 
+140.000000 134.000000 134.000000 137.000000 132.000000 123.000000 
+122.000000 129.000000 126.000000 116.000000 129.000000 165.000000 
+196.000000 202.000000 164.000000 104.000000 95.000000 124.000000 
+137.000000 132.000000 130.000000 137.000000 140.000000 132.000000 
+123.000000 125.000000 134.000000 137.000000 132.000000 125.000000 
+123.000000 125.000000 127.000000 126.000000 125.000000 123.000000 
+120.000000 114.000000 127.000000 127.000000 127.000000 126.000000 
+130.000000 134.000000 126.000000 101.000000 86.000000 114.000000 
+173.000000 197.000000 178.000000 145.000000 124.000000 121.000000 
+128.000000 126.000000 119.000000 117.000000 124.000000 130.000000 
+131.000000 132.000000 135.000000 136.000000 133.000000 129.000000 
+126.000000 124.000000 122.000000 122.000000 124.000000 125.000000 
+126.000000 129.000000 135.000000 139.000000 138.000000 135.000000 
+134.000000 132.000000 124.000000 117.000000 121.000000 132.000000 
+131.000000 115.000000 119.000000 157.000000 206.000000 236.000000 
+214.000000 139.000000 95.000000 114.000000 138.000000 138.000000 
+133.000000 136.000000 140.000000 135.000000 128.000000 129.000000 
+136.000000 137.000000 130.000000 122.000000 120.000000 124.000000 
+129.000000 133.000000 131.000000 124.000000 115.000000 110.000000 
+131.000000 133.000000 130.000000 124.000000 124.000000 128.000000 
+122.000000 103.000000 92.000000 125.000000 179.000000 192.000000 
+166.000000 133.000000 117.000000 121.000000 130.000000 127.000000 
+120.000000 119.000000 126.000000 132.000000 134.000000 134.000000 
+135.000000 135.000000 135.000000 133.000000 131.000000 126.000000 
+118.000000 114.000000 117.000000 123.000000 126.000000 130.000000 
+135.000000 142.000000 143.000000 138.000000 134.000000 131.000000 
+128.000000 125.000000 127.000000 136.000000 137.000000 127.000000 
+125.000000 149.000000 193.000000 233.000000 229.000000 167.000000 
+109.000000 110.000000 132.000000 139.000000 140.000000 142.000000 
+143.000000 135.000000 124.000000 120.000000 123.000000 124.000000 
+121.000000 119.000000 122.000000 128.000000 130.000000 128.000000 
+127.000000 124.000000 119.000000 114.000000 142.000000 125.000000 
+106.000000 108.000000 120.000000 110.000000 75.000000 39.000000 
+28.000000 30.000000 27.000000 20.000000 16.000000 12.000000 
+11.000000 21.000000 17.000000 21.000000 38.000000 36.000000 
+51.000000 88.000000 119.000000 139.000000 147.000000 146.000000 
+138.000000 118.000000 100.000000 106.000000 125.000000 138.000000 
+138.000000 130.000000 124.000000 121.000000 117.000000 102.000000 
+69.000000 44.000000 50.000000 46.000000 25.000000 20.000000 
+29.000000 36.000000 41.000000 38.000000 27.000000 14.000000 
+8.000000 10.000000 8.000000 5.000000 10.000000 18.000000 
+20.000000 19.000000 24.000000 29.000000 30.000000 28.000000 
+23.000000 23.000000 34.000000 56.000000 85.000000 111.000000 
+120.000000 106.000000 87.000000 83.000000 101.000000 118.000000 
+108.000000 76.000000 105.000000 94.000000 98.000000 116.000000 
+124.000000 114.000000 96.000000 84.000000 75.000000 65.000000 
+48.000000 29.000000 17.000000 9.000000 7.000000 26.000000 
+33.000000 37.000000 37.000000 28.000000 53.000000 88.000000 
+115.000000 131.000000 135.000000 129.000000 117.000000 101.000000 
+93.000000 105.000000 125.000000 135.000000 133.000000 117.000000 
+98.000000 93.000000 95.000000 92.000000 66.000000 39.000000 
+52.000000 58.000000 44.000000 41.000000 46.000000 40.000000 
+29.000000 24.000000 26.000000 24.000000 13.000000 9.000000 
+13.000000 9.000000 8.000000 17.000000 22.000000 13.000000 
+7.000000 7.000000 12.000000 16.000000 16.000000 25.000000 
+41.000000 56.000000 74.000000 94.000000 107.000000 109.000000 
+105.000000 103.000000 106.000000 109.000000 101.000000 85.000000 
+70.000000 69.000000 89.000000 111.000000 121.000000 124.000000 
+126.000000 124.000000 113.000000 91.000000 68.000000 51.000000 
+34.000000 17.000000 10.000000 18.000000 25.000000 31.000000 
+43.000000 49.000000 67.000000 79.000000 89.000000 121.000000 
+139.000000 134.000000 119.000000 105.000000 99.000000 95.000000 
+91.000000 92.000000 97.000000 93.000000 76.000000 63.000000 
+58.000000 52.000000 34.000000 36.000000 59.000000 70.000000 
+64.000000 46.000000 20.000000 15.000000 19.000000 19.000000 
+25.000000 36.000000 28.000000 8.000000 11.000000 15.000000 
+12.000000 12.000000 11.000000 8.000000 10.000000 14.000000 
+20.000000 25.000000 22.000000 23.000000 38.000000 56.000000 
+72.000000 88.000000 103.000000 112.000000 115.000000 115.000000 
+109.000000 98.000000 90.000000 95.000000 94.000000 80.000000 
+85.000000 103.000000 123.000000 135.000000 137.000000 137.000000 
+133.000000 115.000000 84.000000 62.000000 51.000000 38.000000 
+25.000000 17.000000 25.000000 39.000000 54.000000 73.000000 
+91.000000 82.000000 95.000000 151.000000 173.000000 156.000000 
+133.000000 127.000000 129.000000 123.000000 116.000000 120.000000 
+129.000000 125.000000 106.000000 80.000000 56.000000 37.000000 
+20.000000 25.000000 41.000000 53.000000 40.000000 14.000000 
+20.000000 42.000000 50.000000 41.000000 40.000000 52.000000 
+47.000000 22.000000 10.000000 10.000000 10.000000 9.000000 
+12.000000 20.000000 25.000000 24.000000 21.000000 20.000000 
+21.000000 26.000000 44.000000 71.000000 94.000000 109.000000 
+118.000000 121.000000 120.000000 120.000000 116.000000 105.000000 
+96.000000 108.000000 111.000000 90.000000 87.000000 104.000000 
+125.000000 134.000000 132.000000 133.000000 138.000000 129.000000 
+103.000000 80.000000 75.000000 67.000000 47.000000 29.000000 
+35.000000 60.000000 79.000000 93.000000 94.000000 72.000000 
+102.000000 159.000000 169.000000 151.000000 145.000000 155.000000 
+156.000000 140.000000 130.000000 137.000000 144.000000 137.000000 
+124.000000 110.000000 91.000000 62.000000 33.000000 17.000000 
+17.000000 33.000000 43.000000 57.000000 101.000000 131.000000 
+125.000000 92.000000 60.000000 56.000000 52.000000 31.000000 
+10.000000 5.000000 6.000000 12.000000 26.000000 38.000000 
+28.000000 12.000000 6.000000 5.000000 15.000000 40.000000 
+70.000000 95.000000 115.000000 131.000000 140.000000 140.000000 
+139.000000 137.000000 131.000000 115.000000 100.000000 103.000000 
+115.000000 95.000000 85.000000 98.000000 121.000000 134.000000 
+130.000000 124.000000 127.000000 131.000000 125.000000 110.000000 
+102.000000 97.000000 83.000000 69.000000 67.000000 78.000000 
+91.000000 105.000000 103.000000 77.000000 101.000000 148.000000 
+154.000000 141.000000 142.000000 152.000000 148.000000 135.000000 
+132.000000 139.000000 139.000000 135.000000 134.000000 139.000000 
+137.000000 121.000000 99.000000 89.000000 95.000000 104.000000 
+107.000000 112.000000 126.000000 141.000000 142.000000 112.000000 
+53.000000 33.000000 51.000000 43.000000 17.000000 8.000000 
+10.000000 11.000000 21.000000 20.000000 14.000000 17.000000 
+14.000000 20.000000 48.000000 78.000000 108.000000 129.000000 
+133.000000 129.000000 131.000000 141.000000 147.000000 140.000000 
+124.000000 109.000000 99.000000 100.000000 120.000000 95.000000 
+77.000000 82.000000 102.000000 117.000000 117.000000 112.000000 
+114.000000 123.000000 129.000000 124.000000 115.000000 112.000000 
+110.000000 104.000000 98.000000 100.000000 111.000000 124.000000 
+109.000000 71.000000 92.000000 133.000000 141.000000 137.000000 
+141.000000 145.000000 140.000000 137.000000 144.000000 148.000000 
+139.000000 128.000000 125.000000 129.000000 135.000000 135.000000 
+132.000000 133.000000 137.000000 134.000000 124.000000 116.000000 
+116.000000 122.000000 124.000000 107.000000 57.000000 17.000000 
+34.000000 44.000000 27.000000 17.000000 20.000000 21.000000 
+22.000000 25.000000 43.000000 58.000000 52.000000 69.000000 
+107.000000 123.000000 127.000000 134.000000 131.000000 120.000000 
+124.000000 143.000000 151.000000 138.000000 119.000000 112.000000 
+114.000000 114.000000 133.000000 111.000000 87.000000 78.000000 
+84.000000 98.000000 109.000000 112.000000 113.000000 123.000000 
+140.000000 146.000000 136.000000 122.000000 113.000000 110.000000 
+111.000000 121.000000 136.000000 141.000000 116.000000 78.000000 
+90.000000 114.000000 121.000000 128.000000 142.000000 147.000000 
+140.000000 134.000000 137.000000 136.000000 127.000000 118.000000 
+115.000000 117.000000 118.000000 113.000000 107.000000 106.000000 
+111.000000 117.000000 121.000000 122.000000 118.000000 112.000000 
+105.000000 92.000000 60.000000 13.000000 25.000000 47.000000 
+44.000000 32.000000 25.000000 28.000000 42.000000 66.000000 
+85.000000 86.000000 91.000000 119.000000 146.000000 148.000000 
+135.000000 130.000000 132.000000 133.000000 135.000000 139.000000 
+140.000000 136.000000 130.000000 127.000000 124.000000 119.000000 
+148.000000 127.000000 96.000000 77.000000 78.000000 92.000000 
+111.000000 120.000000 121.000000 127.000000 138.000000 141.000000 
+135.000000 127.000000 125.000000 126.000000 131.000000 142.000000 
+147.000000 131.000000 94.000000 79.000000 105.000000 118.000000 
+113.000000 113.000000 124.000000 131.000000 130.000000 129.000000 
+129.000000 125.000000 122.000000 129.000000 140.000000 141.000000 
+126.000000 105.000000 95.000000 102.000000 116.000000 126.000000 
+129.000000 123.000000 111.000000 99.000000 92.000000 84.000000 
+63.000000 28.000000 27.000000 50.000000 61.000000 56.000000 
+51.000000 61.000000 84.000000 102.000000 106.000000 107.000000 
+121.000000 138.000000 144.000000 135.000000 123.000000 124.000000 
+136.000000 141.000000 136.000000 129.000000 131.000000 129.000000 
+115.000000 99.000000 98.000000 112.000000 144.000000 131.000000 
+100.000000 76.000000 76.000000 97.000000 123.000000 136.000000 
+135.000000 132.000000 130.000000 125.000000 120.000000 123.000000 
+131.000000 137.000000 139.000000 145.000000 146.000000 127.000000 
+98.000000 98.000000 118.000000 117.000000 106.000000 106.000000 
+114.000000 119.000000 120.000000 122.000000 122.000000 117.000000 
+116.000000 128.000000 145.000000 142.000000 113.000000 86.000000 
+88.000000 113.000000 132.000000 131.000000 123.000000 119.000000 
+119.000000 117.000000 115.000000 110.000000 87.000000 32.000000 
+21.000000 51.000000 69.000000 75.000000 87.000000 102.000000 
+111.000000 114.000000 118.000000 126.000000 131.000000 132.000000 
+131.000000 126.000000 116.000000 110.000000 115.000000 124.000000 
+129.000000 131.000000 131.000000 122.000000 100.000000 76.000000 
+70.000000 88.000000 141.000000 143.000000 124.000000 98.000000 
+93.000000 108.000000 130.000000 145.000000 145.000000 134.000000 
+126.000000 122.000000 124.000000 129.000000 135.000000 139.000000 
+138.000000 130.000000 117.000000 103.000000 102.000000 111.000000 
+113.000000 105.000000 100.000000 107.000000 117.000000 123.000000 
+122.000000 121.000000 121.000000 121.000000 123.000000 126.000000 
+130.000000 128.000000 118.000000 112.000000 121.000000 136.000000 
+142.000000 135.000000 127.000000 127.000000 132.000000 135.000000 
+135.000000 128.000000 95.000000 34.000000 35.000000 65.000000 
+74.000000 84.000000 101.000000 112.000000 111.000000 110.000000 
+118.000000 129.000000 134.000000 131.000000 128.000000 128.000000 
+124.000000 114.000000 108.000000 116.000000 130.000000 136.000000 
+128.000000 111.000000 97.000000 88.000000 81.000000 77.000000 
+144.000000 151.000000 136.000000 109.000000 93.000000 102.000000 
+123.000000 138.000000 134.000000 120.000000 115.000000 123.000000 
+135.000000 138.000000 133.000000 127.000000 122.000000 114.000000 
+107.000000 105.000000 109.000000 109.000000 99.000000 88.000000 
+85.000000 93.000000 108.000000 120.000000 122.000000 120.000000 
+123.000000 130.000000 136.000000 135.000000 130.000000 129.000000 
+134.000000 144.000000 149.000000 144.000000 132.000000 122.000000 
+121.000000 130.000000 143.000000 150.000000 144.000000 121.000000 
+84.000000 61.000000 74.000000 88.000000 91.000000 100.000000 
+110.000000 109.000000 104.000000 108.000000 121.000000 134.000000 
+142.000000 139.000000 127.000000 118.000000 117.000000 119.000000 
+120.000000 124.000000 132.000000 134.000000 117.000000 96.000000 
+101.000000 139.000000 167.000000 151.000000 136.000000 143.000000 
+137.000000 114.000000 89.000000 87.000000 112.000000 137.000000 
+140.000000 126.000000 116.000000 125.000000 144.000000 149.000000 
+133.000000 112.000000 103.000000 105.000000 105.000000 99.000000 
+92.000000 87.000000 80.000000 67.000000 58.000000 64.000000 
+88.000000 114.000000 126.000000 126.000000 127.000000 133.000000 
+139.000000 143.000000 142.000000 137.000000 133.000000 134.000000 
+137.000000 135.000000 127.000000 123.000000 130.000000 141.000000 
+142.000000 129.000000 106.000000 85.000000 74.000000 83.000000 
+97.000000 102.000000 104.000000 111.000000 114.000000 108.000000 
+104.000000 113.000000 129.000000 142.000000 145.000000 141.000000 
+130.000000 117.000000 110.000000 117.000000 127.000000 128.000000 
+122.000000 118.000000 113.000000 104.000000 106.000000 135.000000 
+169.000000 171.000000 123.000000 125.000000 135.000000 134.000000 
+110.000000 84.000000 88.000000 121.000000 151.000000 150.000000 
+138.000000 132.000000 135.000000 140.000000 136.000000 119.000000 
+100.000000 83.000000 66.000000 53.000000 56.000000 71.000000 
+94.000000 108.000000 103.000000 97.000000 102.000000 108.000000 
+113.000000 118.000000 125.000000 133.000000 138.000000 139.000000 
+138.000000 136.000000 136.000000 141.000000 145.000000 144.000000 
+142.000000 144.000000 152.000000 151.000000 129.000000 97.000000 
+77.000000 72.000000 74.000000 80.000000 84.000000 82.000000 
+81.000000 93.000000 113.000000 126.000000 127.000000 123.000000 
+128.000000 139.000000 144.000000 136.000000 123.000000 113.000000 
+118.000000 136.000000 149.000000 140.000000 116.000000 98.000000 
+100.000000 112.000000 115.000000 113.000000 118.000000 122.000000 
+117.000000 114.000000 122.000000 130.000000 129.000000 117.000000 
+99.000000 90.000000 101.000000 125.000000 151.000000 151.000000 
+124.000000 106.000000 108.000000 112.000000 93.000000 66.000000 
+52.000000 54.000000 64.000000 67.000000 79.000000 101.000000 
+115.000000 120.000000 120.000000 114.000000 109.000000 115.000000 
+127.000000 133.000000 134.000000 131.000000 130.000000 131.000000 
+137.000000 144.000000 148.000000 150.000000 154.000000 157.000000 
+152.000000 131.000000 104.000000 88.000000 89.000000 89.000000 
+77.000000 62.000000 52.000000 53.000000 66.000000 93.000000 
+122.000000 137.000000 132.000000 118.000000 116.000000 128.000000 
+136.000000 125.000000 113.000000 125.000000 163.000000 190.000000 
+175.000000 129.000000 90.000000 79.000000 89.000000 106.000000 
+122.000000 133.000000 130.000000 116.000000 123.000000 119.000000 
+116.000000 122.000000 135.000000 144.000000 140.000000 129.000000 
+123.000000 123.000000 120.000000 114.000000 108.000000 102.000000 
+90.000000 78.000000 70.000000 65.000000 61.000000 57.000000 
+54.000000 52.000000 51.000000 56.000000 72.000000 95.000000 
+115.000000 123.000000 124.000000 127.000000 133.000000 138.000000 
+140.000000 139.000000 137.000000 134.000000 134.000000 137.000000 
+141.000000 149.000000 160.000000 163.000000 148.000000 115.000000 
+83.000000 69.000000 72.000000 76.000000 70.000000 53.000000 
+40.000000 45.000000 67.000000 93.000000 111.000000 118.000000 
+117.000000 118.000000 123.000000 126.000000 125.000000 121.000000 
+131.000000 166.000000 209.000000 220.000000 178.000000 111.000000 
+65.000000 62.000000 85.000000 109.000000 120.000000 121.000000 
+117.000000 112.000000 126.000000 123.000000 123.000000 128.000000 
+132.000000 135.000000 142.000000 155.000000 155.000000 131.000000 
+103.000000 97.000000 106.000000 106.000000 88.000000 69.000000 
+67.000000 70.000000 64.000000 55.000000 53.000000 57.000000 
+61.000000 67.000000 76.000000 93.000000 110.000000 122.000000 
+127.000000 127.000000 124.000000 125.000000 131.000000 133.000000 
+129.000000 123.000000 122.000000 127.000000 136.000000 144.000000 
+148.000000 146.000000 131.000000 107.000000 83.000000 66.000000 
+59.000000 60.000000 61.000000 58.000000 51.000000 50.000000 
+59.000000 72.000000 80.000000 84.000000 90.000000 101.000000 
+108.000000 106.000000 106.000000 123.000000 153.000000 182.000000 
+193.000000 174.000000 134.000000 95.000000 70.000000 68.000000 
+85.000000 111.000000 127.000000 129.000000 124.000000 121.000000 
+124.000000 120.000000 123.000000 129.000000 132.000000 137.000000 
+138.000000 130.000000 112.000000 104.000000 115.000000 128.000000 
+119.000000 95.000000 80.000000 76.000000 75.000000 63.000000 
+53.000000 54.000000 63.000000 64.000000 56.000000 56.000000 
+66.000000 79.000000 99.000000 115.000000 120.000000 112.000000 
+101.000000 97.000000 101.000000 107.000000 109.000000 106.000000 
+105.000000 112.000000 127.000000 138.000000 139.000000 134.000000 
+121.000000 99.000000 76.000000 64.000000 62.000000 64.000000 
+65.000000 62.000000 59.000000 60.000000 64.000000 66.000000 
+66.000000 63.000000 62.000000 67.000000 76.000000 84.000000 
+93.000000 110.000000 129.000000 136.000000 128.000000 109.000000 
+90.000000 84.000000 90.000000 102.000000 114.000000 124.000000 
+128.000000 126.000000 122.000000 121.000000 122.000000 116.000000 
+116.000000 118.000000 123.000000 132.000000 141.000000 142.000000 
+133.000000 124.000000 119.000000 118.000000 110.000000 96.000000 
+88.000000 95.000000 103.000000 102.000000 90.000000 73.000000 
+70.000000 77.000000 71.000000 60.000000 60.000000 72.000000 
+92.000000 97.000000 84.000000 69.000000 63.000000 64.000000 
+70.000000 82.000000 93.000000 93.000000 91.000000 96.000000 
+116.000000 137.000000 145.000000 139.000000 121.000000 94.000000 
+74.000000 71.000000 79.000000 82.000000 78.000000 73.000000 
+74.000000 75.000000 68.000000 59.000000 58.000000 66.000000 
+76.000000 79.000000 82.000000 89.000000 96.000000 99.000000 
+99.000000 96.000000 89.000000 86.000000 95.000000 111.000000 
+123.000000 124.000000 120.000000 119.000000 121.000000 120.000000 
+117.000000 116.000000 129.000000 125.000000 119.000000 119.000000 
+124.000000 127.000000 131.000000 137.000000 139.000000 131.000000 
+119.000000 114.000000 111.000000 98.000000 86.000000 106.000000 
+177.000000 248.000000 246.000000 191.000000 141.000000 115.000000 
+92.000000 63.000000 49.000000 63.000000 82.000000 77.000000 
+56.000000 41.000000 40.000000 47.000000 63.000000 86.000000 
+98.000000 89.000000 72.000000 70.000000 94.000000 123.000000 
+137.000000 129.000000 108.000000 86.000000 80.000000 88.000000 
+100.000000 104.000000 99.000000 95.000000 96.000000 96.000000 
+87.000000 74.000000 67.000000 75.000000 93.000000 105.000000 
+106.000000 104.000000 103.000000 100.000000 98.000000 96.000000 
+95.000000 101.000000 114.000000 128.000000 131.000000 125.000000 
+121.000000 125.000000 128.000000 123.000000 116.000000 116.000000 
+129.000000 130.000000 131.000000 133.000000 131.000000 124.000000 
+122.000000 131.000000 139.000000 132.000000 118.000000 116.000000 
+124.000000 117.000000 94.000000 90.000000 160.000000 276.000000 
+354.000000 366.000000 303.000000 191.000000 103.000000 54.000000 
+35.000000 56.000000 66.000000 59.000000 48.000000 42.000000 
+43.000000 57.000000 87.000000 119.000000 124.000000 97.000000 
+68.000000 61.000000 80.000000 108.000000 125.000000 120.000000 
+99.000000 79.000000 77.000000 89.000000 97.000000 95.000000 
+103.000000 146.000000 209.000000 242.000000 215.000000 148.000000 
+109.000000 107.000000 117.000000 126.000000 132.000000 134.000000 
+131.000000 121.000000 110.000000 101.000000 103.000000 114.000000 
+128.000000 135.000000 130.000000 124.000000 125.000000 131.000000 
+132.000000 127.000000 122.000000 122.000000 115.000000 123.000000 
+131.000000 131.000000 124.000000 116.000000 117.000000 125.000000 
+133.000000 133.000000 125.000000 119.000000 121.000000 126.000000 
+120.000000 99.000000 97.000000 161.000000 294.000000 385.000000 
+319.000000 153.000000 63.000000 41.000000 45.000000 63.000000 
+59.000000 61.000000 67.000000 61.000000 47.000000 57.000000 
+97.000000 137.000000 141.000000 111.000000 79.000000 65.000000 
+71.000000 90.000000 109.000000 113.000000 97.000000 75.000000 
+65.000000 68.000000 84.000000 137.000000 203.000000 296.000000 
+407.000000 426.000000 306.000000 176.000000 132.000000 135.000000 
+138.000000 129.000000 125.000000 135.000000 143.000000 136.000000 
+123.000000 116.000000 116.000000 120.000000 128.000000 136.000000 
+135.000000 128.000000 124.000000 128.000000 131.000000 129.000000 
+125.000000 123.000000 114.000000 122.000000 129.000000 128.000000 
+121.000000 118.000000 120.000000 123.000000 124.000000 124.000000 
+123.000000 120.000000 114.000000 113.000000 113.000000 116.000000 
+121.000000 133.000000 168.000000 180.000000 123.000000 46.000000 
+37.000000 45.000000 58.000000 55.000000 55.000000 67.000000 
+75.000000 64.000000 48.000000 59.000000 97.000000 135.000000 
+146.000000 122.000000 82.000000 56.000000 59.000000 79.000000 
+95.000000 95.000000 87.000000 73.000000 57.000000 49.000000 
+96.000000 227.000000 340.000000 374.000000 350.000000 274.000000 
+166.000000 116.000000 112.000000 110.000000 112.000000 117.000000 
+121.000000 126.000000 128.000000 121.000000 110.000000 108.000000 
+119.000000 135.000000 140.000000 132.000000 123.000000 120.000000 
+122.000000 124.000000 124.000000 123.000000 123.000000 123.000000 
+125.000000 126.000000 128.000000 129.000000 125.000000 120.000000 
+118.000000 118.000000 118.000000 120.000000 123.000000 125.000000 
+121.000000 115.000000 118.000000 133.000000 149.000000 148.000000 
+117.000000 72.000000 45.000000 50.000000 64.000000 70.000000 
+61.000000 50.000000 46.000000 51.000000 52.000000 47.000000 
+46.000000 61.000000 91.000000 122.000000 135.000000 114.000000 
+75.000000 55.000000 65.000000 83.000000 85.000000 71.000000 
+65.000000 65.000000 58.000000 58.000000 90.000000 171.000000 
+240.000000 219.000000 129.000000 80.000000 103.000000 121.000000 
+111.000000 109.000000 122.000000 136.000000 134.000000 123.000000 
+117.000000 116.000000 112.000000 112.000000 124.000000 137.000000 
+136.000000 123.000000 118.000000 126.000000 133.000000 126.000000 
+116.000000 116.000000 123.000000 127.000000 134.000000 134.000000 
+134.000000 132.000000 131.000000 128.000000 123.000000 119.000000 
+119.000000 124.000000 126.000000 122.000000 116.000000 116.000000 
+125.000000 134.000000 137.000000 131.000000 116.000000 95.000000 
+77.000000 68.000000 66.000000 64.000000 59.000000 54.000000 
+49.000000 50.000000 53.000000 55.000000 56.000000 64.000000 
+81.000000 102.000000 109.000000 92.000000 66.000000 56.000000 
+63.000000 72.000000 66.000000 51.000000 48.000000 50.000000 
+51.000000 52.000000 53.000000 74.000000 98.000000 100.000000 
+105.000000 123.000000 127.000000 115.000000 112.000000 127.000000 
+147.000000 147.000000 130.000000 113.000000 109.000000 113.000000 
+116.000000 120.000000 128.000000 135.000000 136.000000 131.000000 
+130.000000 132.000000 132.000000 127.000000 122.000000 120.000000 
+122.000000 121.000000 125.000000 130.000000 135.000000 138.000000 
+139.000000 136.000000 133.000000 130.000000 128.000000 125.000000 
+121.000000 118.000000 118.000000 121.000000 122.000000 124.000000 
+127.000000 129.000000 122.000000 108.000000 97.000000 90.000000 
+83.000000 70.000000 55.000000 48.000000 51.000000 58.000000 
+62.000000 62.000000 59.000000 56.000000 59.000000 66.000000 
+69.000000 61.000000 53.000000 56.000000 69.000000 74.000000 
+68.000000 63.000000 65.000000 71.000000 68.000000 56.000000 
+44.000000 39.000000 47.000000 74.000000 104.000000 120.000000 
+121.000000 120.000000 125.000000 134.000000 136.000000 131.000000 
+123.000000 118.000000 117.000000 119.000000 123.000000 126.000000 
+127.000000 127.000000 130.000000 134.000000 134.000000 129.000000 
+124.000000 123.000000 126.000000 130.000000 131.000000 129.000000 
+127.000000 127.000000 126.000000 129.000000 134.000000 136.000000 
+133.000000 128.000000 124.000000 121.000000 119.000000 119.000000 
+122.000000 126.000000 127.000000 124.000000 122.000000 125.000000 
+126.000000 124.000000 121.000000 118.000000 111.000000 91.000000 
+61.000000 40.000000 41.000000 57.000000 69.000000 74.000000 
+69.000000 61.000000 55.000000 50.000000 44.000000 43.000000 
+49.000000 57.000000 64.000000 69.000000 76.000000 88.000000 
+94.000000 88.000000 76.000000 65.000000 63.000000 73.000000 
+90.000000 106.000000 118.000000 124.000000 125.000000 128.000000 
+130.000000 131.000000 127.000000 125.000000 125.000000 126.000000 
+125.000000 124.000000 124.000000 126.000000 125.000000 122.000000 
+122.000000 126.000000 129.000000 127.000000 123.000000 123.000000 
+128.000000 131.000000 130.000000 128.000000 123.000000 123.000000 
+124.000000 127.000000 129.000000 129.000000 126.000000 124.000000 
+124.000000 124.000000 124.000000 121.000000 120.000000 122.000000 
+124.000000 124.000000 122.000000 122.000000 131.000000 145.000000 
+149.000000 138.000000 117.000000 96.000000 79.000000 67.000000 
+60.000000 66.000000 77.000000 88.000000 86.000000 72.000000 
+63.000000 57.000000 52.000000 54.000000 64.000000 69.000000 
+67.000000 65.000000 74.000000 87.000000 87.000000 70.000000 
+52.000000 50.000000 66.000000 88.000000 106.000000 118.000000 
+124.000000 124.000000 123.000000 124.000000 129.000000 131.000000 
+126.000000 122.000000 122.000000 126.000000 128.000000 128.000000 
+125.000000 121.000000 118.000000 118.000000 119.000000 123.000000 
+125.000000 125.000000 123.000000 123.000000 122.000000 123.000000 
+122.000000 122.000000 124.000000 124.000000 129.000000 136.000000 
+138.000000 135.000000 131.000000 128.000000 125.000000 121.000000 
+119.000000 122.000000 125.000000 128.000000 127.000000 125.000000 
+123.000000 121.000000 126.000000 141.000000 155.000000 152.000000 
+127.000000 100.000000 81.000000 71.000000 66.000000 69.000000 
+85.000000 103.000000 101.000000 80.000000 62.000000 55.000000 
+57.000000 68.000000 83.000000 97.000000 99.000000 85.000000 
+67.000000 57.000000 55.000000 52.000000 52.000000 62.000000 
+84.000000 105.000000 118.000000 122.000000 124.000000 127.000000 
+128.000000 127.000000 126.000000 127.000000 125.000000 122.000000 
+119.000000 121.000000 125.000000 126.000000 123.000000 121.000000 
+122.000000 126.000000 127.000000 126.000000 125.000000 124.000000 
+122.000000 119.000000 119.000000 124.000000 128.000000 127.000000 
+123.000000 128.000000 130.000000 132.000000 135.000000 132.000000 
+127.000000 124.000000 123.000000 122.000000 120.000000 121.000000 
+124.000000 125.000000 124.000000 123.000000 127.000000 131.000000 
+132.000000 135.000000 140.000000 141.000000 128.000000 102.000000 
+74.000000 57.000000 53.000000 61.000000 77.000000 90.000000 
+89.000000 76.000000 62.000000 59.000000 69.000000 84.000000 
+93.000000 94.000000 90.000000 80.000000 64.000000 48.000000 
+41.000000 53.000000 78.000000 104.000000 119.000000 122.000000 
+122.000000 124.000000 129.000000 133.000000 132.000000 131.000000 
+131.000000 130.000000 128.000000 126.000000 125.000000 126.000000 
+129.000000 131.000000 129.000000 125.000000 123.000000 122.000000 
+122.000000 121.000000 123.000000 125.000000 125.000000 121.000000 
+118.000000 118.000000 122.000000 124.000000 99.000000 121.000000 
+132.000000 132.000000 126.000000 122.000000 121.000000 123.000000 
+125.000000 129.000000 131.000000 132.000000 130.000000 128.000000 
+128.000000 130.000000 132.000000 134.000000 136.000000 138.000000 
+137.000000 132.000000 122.000000 106.000000 85.000000 64.000000 
+53.000000 53.000000 61.000000 67.000000 70.000000 69.000000 
+65.000000 61.000000 57.000000 54.000000 54.000000 58.000000 
+61.000000 58.000000 47.000000 36.000000 40.000000 66.000000 
+101.000000 127.000000 136.000000 134.000000 131.000000 130.000000 
+129.000000 128.000000 128.000000 127.000000 124.000000 121.000000 
+119.000000 121.000000 122.000000 124.000000 126.000000 129.000000 
+128.000000 122.000000 117.000000 117.000000 121.000000 124.000000 
+123.000000 119.000000 118.000000 121.000000 125.000000 124.000000 
+121.000000 120.000000 75.000000 89.000000 110.000000 126.000000 
+129.000000 126.000000 126.000000 129.000000 133.000000 135.000000 
+135.000000 133.000000 130.000000 130.000000 134.000000 138.000000 
+138.000000 136.000000 136.000000 138.000000 136.000000 125.000000 
+109.000000 92.000000 77.000000 65.000000 55.000000 47.000000 
+40.000000 37.000000 38.000000 42.000000 44.000000 46.000000 
+48.000000 51.000000 51.000000 50.000000 48.000000 45.000000 
+42.000000 41.000000 47.000000 65.000000 91.000000 114.000000 
+127.000000 132.000000 133.000000 134.000000 134.000000 132.000000 
+129.000000 124.000000 119.000000 117.000000 119.000000 122.000000 
+122.000000 123.000000 127.000000 130.000000 129.000000 125.000000 
+121.000000 120.000000 119.000000 118.000000 116.000000 117.000000 
+119.000000 120.000000 119.000000 118.000000 121.000000 128.000000 
+95.000000 96.000000 109.000000 124.000000 128.000000 124.000000 
+123.000000 130.000000 138.000000 141.000000 137.000000 133.000000 
+136.000000 143.000000 145.000000 140.000000 131.000000 124.000000 
+124.000000 129.000000 132.000000 125.000000 107.000000 86.000000 
+78.000000 85.000000 98.000000 107.000000 107.000000 100.000000 
+85.000000 63.000000 46.000000 46.000000 66.000000 95.000000 
+119.000000 124.000000 114.000000 96.000000 77.000000 59.000000 
+50.000000 52.000000 68.000000 96.000000 124.000000 139.000000 
+140.000000 136.000000 135.000000 136.000000 135.000000 128.000000 
+121.000000 121.000000 124.000000 126.000000 127.000000 129.000000 
+132.000000 131.000000 126.000000 124.000000 125.000000 126.000000 
+123.000000 119.000000 119.000000 124.000000 126.000000 123.000000 
+120.000000 120.000000 123.000000 126.000000 124.000000 123.000000 
+122.000000 121.000000 123.000000 129.000000 131.000000 130.000000 
+132.000000 137.000000 141.000000 143.000000 147.000000 147.000000 
+140.000000 128.000000 116.000000 112.000000 115.000000 117.000000 
+117.000000 111.000000 103.000000 101.000000 121.000000 166.000000 
+227.000000 286.000000 317.000000 296.000000 221.000000 125.000000 
+58.000000 51.000000 113.000000 210.000000 286.000000 312.000000 
+292.000000 237.000000 166.000000 100.000000 58.000000 46.000000 
+60.000000 93.000000 126.000000 144.000000 146.000000 139.000000 
+132.000000 126.000000 124.000000 126.000000 134.000000 142.000000 
+142.000000 135.000000 130.000000 129.000000 130.000000 129.000000 
+126.000000 122.000000 122.000000 123.000000 124.000000 123.000000 
+121.000000 120.000000 121.000000 122.000000 121.000000 121.000000 
+123.000000 125.000000 116.000000 107.000000 104.000000 112.000000 
+127.000000 137.000000 135.000000 125.000000 120.000000 126.000000 
+134.000000 136.000000 131.000000 124.000000 121.000000 124.000000 
+130.000000 137.000000 139.000000 130.000000 113.000000 100.000000 
+97.000000 109.000000 139.000000 200.000000 282.000000 357.000000 
+385.000000 344.000000 250.000000 150.000000 73.000000 48.000000 
+130.000000 284.000000 412.000000 438.000000 364.000000 255.000000 
+170.000000 118.000000 82.000000 59.000000 62.000000 85.000000 
+116.000000 138.000000 144.000000 137.000000 126.000000 120.000000 
+122.000000 129.000000 135.000000 138.000000 137.000000 134.000000 
+129.000000 129.000000 134.000000 137.000000 133.000000 125.000000 
+122.000000 126.000000 131.000000 129.000000 124.000000 120.000000 
+122.000000 126.000000 130.000000 134.000000 133.000000 127.000000 
+125.000000 128.000000 134.000000 140.000000 139.000000 133.000000 
+127.000000 125.000000 130.000000 136.000000 140.000000 138.000000 
+128.000000 116.000000 109.000000 116.000000 130.000000 143.000000 
+149.000000 145.000000 136.000000 126.000000 115.000000 102.000000 
+83.000000 74.000000 95.000000 157.000000 222.000000 236.000000 
+185.000000 114.000000 61.000000 70.000000 169.000000 267.000000 
+308.000000 269.000000 185.000000 131.000000 105.000000 92.000000 
+85.000000 80.000000 88.000000 97.000000 106.000000 119.000000 
+130.000000 133.000000 128.000000 124.000000 126.000000 132.000000 
+133.000000 129.000000 127.000000 128.000000 130.000000 131.000000 
+128.000000 124.000000 121.000000 122.000000 123.000000 120.000000 
+115.000000 115.000000 121.000000 124.000000 118.000000 113.000000 
+122.000000 134.000000 133.000000 120.000000 136.000000 131.000000 
+126.000000 128.000000 131.000000 129.000000 124.000000 120.000000 
+121.000000 126.000000 130.000000 127.000000 112.000000 95.000000 
+96.000000 125.000000 166.000000 192.000000 189.000000 166.000000 
+144.000000 130.000000 120.000000 113.000000 109.000000 116.000000 
+133.000000 137.000000 113.000000 80.000000 65.000000 72.000000 
+96.000000 112.000000 108.000000 95.000000 85.000000 92.000000 
+110.000000 118.000000 106.000000 85.000000 82.000000 107.000000 
+139.000000 150.000000 134.000000 118.000000 122.000000 136.000000 
+140.000000 133.000000 129.000000 132.000000 134.000000 129.000000 
+125.000000 128.000000 132.000000 132.000000 129.000000 130.000000 
+136.000000 136.000000 126.000000 117.000000 119.000000 127.000000 
+125.000000 107.000000 89.000000 93.000000 114.000000 129.000000 
+128.000000 120.000000 127.000000 131.000000 135.000000 134.000000 
+129.000000 123.000000 118.000000 116.000000 119.000000 127.000000 
+135.000000 130.000000 115.000000 109.000000 139.000000 200.000000 
+246.000000 246.000000 206.000000 161.000000 135.000000 126.000000 
+125.000000 119.000000 113.000000 114.000000 118.000000 117.000000 
+109.000000 97.000000 88.000000 95.000000 99.000000 84.000000 
+69.000000 68.000000 76.000000 83.000000 88.000000 97.000000 
+109.000000 119.000000 123.000000 124.000000 126.000000 123.000000 
+114.000000 105.000000 107.000000 118.000000 131.000000 137.000000 
+138.000000 136.000000 132.000000 126.000000 124.000000 128.000000 
+134.000000 133.000000 129.000000 129.000000 135.000000 133.000000 
+118.000000 103.000000 107.000000 120.000000 115.000000 89.000000 
+73.000000 84.000000 106.000000 119.000000 117.000000 110.000000 
+132.000000 137.000000 137.000000 132.000000 125.000000 122.000000 
+123.000000 124.000000 125.000000 129.000000 130.000000 120.000000 
+111.000000 139.000000 217.000000 280.000000 279.000000 217.000000 
+146.000000 114.000000 118.000000 132.000000 134.000000 127.000000 
+123.000000 122.000000 121.000000 118.000000 113.000000 107.000000 
+98.000000 85.000000 69.000000 56.000000 55.000000 65.000000 
+82.000000 100.000000 116.000000 127.000000 130.000000 125.000000 
+119.000000 122.000000 128.000000 132.000000 128.000000 123.000000 
+118.000000 113.000000 113.000000 120.000000 132.000000 140.000000 
+139.000000 132.000000 128.000000 129.000000 134.000000 138.000000 
+136.000000 132.000000 130.000000 129.000000 123.000000 114.000000 
+118.000000 139.000000 152.000000 138.000000 113.000000 93.000000 
+88.000000 98.000000 108.000000 110.000000 143.000000 149.000000 
+145.000000 135.000000 125.000000 120.000000 118.000000 118.000000 
+123.000000 131.000000 132.000000 122.000000 130.000000 193.000000 
+268.000000 283.000000 231.000000 158.000000 115.000000 114.000000 
+131.000000 137.000000 131.000000 129.000000 133.000000 133.000000 
+130.000000 128.000000 126.000000 117.000000 101.000000 86.000000 
+75.000000 70.000000 76.000000 92.000000 110.000000 122.000000 
+130.000000 134.000000 135.000000 131.000000 128.000000 130.000000 
+132.000000 127.000000 120.000000 122.000000 129.000000 127.000000 
+112.000000 101.000000 106.000000 122.000000 134.000000 136.000000 
+133.000000 132.000000 133.000000 137.000000 140.000000 140.000000 
+138.000000 137.000000 134.000000 120.000000 104.000000 111.000000 
+140.000000 154.000000 141.000000 118.000000 102.000000 102.000000 
+116.000000 125.000000 135.000000 147.000000 143.000000 129.000000 
+120.000000 120.000000 122.000000 126.000000 135.000000 136.000000 
+121.000000 108.000000 139.000000 217.000000 264.000000 238.000000 
+169.000000 114.000000 106.000000 122.000000 131.000000 126.000000 
+123.000000 131.000000 138.000000 135.000000 130.000000 132.000000 
+136.000000 130.000000 108.000000 82.000000 68.000000 74.000000 
+98.000000 121.000000 130.000000 127.000000 123.000000 125.000000 
+127.000000 123.000000 122.000000 129.000000 136.000000 132.000000 
+118.000000 115.000000 130.000000 142.000000 134.000000 107.000000 
+91.000000 105.000000 128.000000 137.000000 132.000000 127.000000 
+130.000000 137.000000 141.000000 140.000000 136.000000 130.000000 
+125.000000 123.000000 120.000000 111.000000 109.000000 121.000000 
+125.000000 119.000000 116.000000 113.000000 114.000000 121.000000 
+133.000000 138.000000 138.000000 136.000000 132.000000 125.000000 
+119.000000 125.000000 135.000000 125.000000 100.000000 98.000000 
+145.000000 204.000000 217.000000 176.000000 122.000000 108.000000 
+127.000000 138.000000 129.000000 115.000000 119.000000 132.000000 
+139.000000 135.000000 130.000000 131.000000 132.000000 124.000000 
+104.000000 82.000000 72.000000 76.000000 88.000000 102.000000 
+113.000000 121.000000 124.000000 124.000000 126.000000 127.000000 
+126.000000 126.000000 128.000000 126.000000 115.000000 112.000000 
+134.000000 159.000000 156.000000 124.000000 85.000000 85.000000 
+116.000000 136.000000 133.000000 127.000000 132.000000 138.000000 
+138.000000 137.000000 136.000000 129.000000 118.000000 119.000000 
+133.000000 140.000000 123.000000 102.000000 101.000000 118.000000 
+134.000000 134.000000 125.000000 122.000000 130.000000 129.000000 
+126.000000 127.000000 129.000000 125.000000 122.000000 128.000000 
+130.000000 114.000000 95.000000 105.000000 145.000000 177.000000 
+170.000000 134.000000 112.000000 123.000000 138.000000 136.000000 
+126.000000 123.000000 131.000000 136.000000 136.000000 134.000000 
+134.000000 135.000000 133.000000 124.000000 106.000000 88.000000 
+79.000000 83.000000 92.000000 103.000000 116.000000 129.000000 
+137.000000 136.000000 133.000000 129.000000 126.000000 127.000000 
+132.000000 132.000000 121.000000 114.000000 135.000000 169.000000 
+183.000000 163.000000 115.000000 87.000000 109.000000 138.000000 
+140.000000 133.000000 132.000000 136.000000 135.000000 130.000000 
+128.000000 125.000000 122.000000 123.000000 132.000000 137.000000 
+129.000000 119.000000 119.000000 130.000000 134.000000 126.000000 
+118.000000 119.000000 119.000000 110.000000 109.000000 118.000000 
+125.000000 125.000000 127.000000 134.000000 132.000000 115.000000 
+103.000000 118.000000 149.000000 162.000000 142.000000 116.000000 
+117.000000 134.000000 139.000000 131.000000 125.000000 130.000000 
+135.000000 132.000000 129.000000 129.000000 129.000000 127.000000 
+125.000000 123.000000 116.000000 104.000000 94.000000 91.000000 
+95.000000 103.000000 115.000000 128.000000 136.000000 136.000000 
+133.000000 130.000000 128.000000 129.000000 133.000000 135.000000 
+128.000000 121.000000 140.000000 176.000000 202.000000 208.000000 
+176.000000 119.000000 103.000000 121.000000 131.000000 133.000000 
+138.000000 143.000000 140.000000 131.000000 125.000000 127.000000 
+129.000000 128.000000 127.000000 127.000000 127.000000 128.000000 
+130.000000 134.000000 133.000000 128.000000 121.000000 119.000000 
+119.000000 115.000000 118.000000 121.000000 118.000000 117.000000 
+122.000000 126.000000 119.000000 106.000000 107.000000 122.000000 
+136.000000 132.000000 116.000000 111.000000 121.000000 130.000000 
+129.000000 125.000000 128.000000 133.000000 134.000000 130.000000 
+126.000000 125.000000 127.000000 130.000000 132.000000 129.000000 
+119.000000 109.000000 105.000000 106.000000 108.000000 113.000000 
+125.000000 136.000000 138.000000 133.000000 132.000000 135.000000 
+131.000000 122.000000 121.000000 130.000000 136.000000 133.000000 
+142.000000 173.000000 216.000000 248.000000 227.000000 162.000000 
+126.000000 132.000000 137.000000 132.000000 131.000000 136.000000 
+137.000000 132.000000 128.000000 128.000000 129.000000 128.000000 
+126.000000 125.000000 122.000000 120.000000 120.000000 123.000000 
+124.000000 121.000000 116.000000 113.000000 125.000000 122.000000 
+120.000000 120.000000 122.000000 127.000000 130.000000 125.000000 
+112.000000 103.000000 105.000000 117.000000 124.000000 121.000000 
+116.000000 116.000000 122.000000 128.000000 128.000000 127.000000 
+127.000000 128.000000 127.000000 124.000000 122.000000 122.000000 
+124.000000 126.000000 129.000000 130.000000 126.000000 120.000000 
+115.000000 114.000000 115.000000 122.000000 132.000000 140.000000 
+142.000000 137.000000 132.000000 128.000000 124.000000 122.000000 
+126.000000 136.000000 141.000000 135.000000 133.000000 154.000000 
+202.000000 254.000000 255.000000 195.000000 142.000000 132.000000 
+136.000000 135.000000 135.000000 137.000000 137.000000 132.000000 
+126.000000 125.000000 127.000000 126.000000 123.000000 122.000000 
+127.000000 131.000000 131.000000 127.000000 122.000000 121.000000 
+122.000000 121.000000 125.000000 126.000000 123.000000 115.000000 
+112.000000 119.000000 127.000000 122.000000 108.000000 102.000000 
+114.000000 132.000000 136.000000 125.000000 117.000000 120.000000 
+128.000000 131.000000 129.000000 127.000000 128.000000 129.000000 
+128.000000 127.000000 130.000000 135.000000 138.000000 136.000000 
+130.000000 124.000000 120.000000 117.000000 114.000000 113.000000 
+117.000000 128.000000 139.000000 146.000000 144.000000 140.000000 
+137.000000 135.000000 130.000000 124.000000 124.000000 130.000000 
+136.000000 135.000000 134.000000 144.000000 183.000000 244.000000 
+265.000000 218.000000 160.000000 134.000000 129.000000 129.000000 
+132.000000 133.000000 130.000000 126.000000 125.000000 128.000000 
+133.000000 132.000000 127.000000 123.000000 125.000000 130.000000 
+132.000000 129.000000 125.000000 122.000000 121.000000 120.000000 
+125.000000 130.000000 132.000000 126.000000 117.000000 113.000000 
+112.000000 105.000000 95.000000 97.000000 113.000000 131.000000 
+136.000000 130.000000 125.000000 126.000000 127.000000 129.000000 
+130.000000 132.000000 131.000000 130.000000 130.000000 133.000000 
+136.000000 137.000000 136.000000 133.000000 130.000000 128.000000 
+127.000000 127.000000 127.000000 129.000000 134.000000 138.000000 
+140.000000 142.000000 143.000000 143.000000 138.000000 131.000000 
+125.000000 122.000000 124.000000 133.000000 143.000000 144.000000 
+136.000000 133.000000 164.000000 226.000000 257.000000 223.000000 
+168.000000 137.000000 128.000000 129.000000 132.000000 132.000000 
+128.000000 122.000000 125.000000 133.000000 137.000000 132.000000 
+122.000000 119.000000 124.000000 127.000000 126.000000 124.000000 
+124.000000 122.000000 116.000000 110.000000 119.000000 121.000000 
+124.000000 124.000000 123.000000 125.000000 123.000000 113.000000 
+102.000000 100.000000 112.000000 126.000000 131.000000 129.000000 
+126.000000 125.000000 126.000000 127.000000 126.000000 125.000000 
+125.000000 126.000000 130.000000 134.000000 136.000000 137.000000 
+139.000000 141.000000 139.000000 132.000000 124.000000 119.000000 
+121.000000 128.000000 137.000000 143.000000 145.000000 144.000000 
+143.000000 143.000000 142.000000 139.000000 133.000000 129.000000 
+129.000000 134.000000 140.000000 140.000000 131.000000 124.000000 
+145.000000 201.000000 244.000000 231.000000 179.000000 138.000000 
+123.000000 126.000000 130.000000 128.000000 123.000000 123.000000 
+127.000000 131.000000 131.000000 130.000000 129.000000 129.000000 
+128.000000 126.000000 123.000000 123.000000 125.000000 125.000000 
+122.000000 116.000000 113.000000 111.000000 105.000000 109.000000 
+119.000000 123.000000 122.000000 117.000000 113.000000 108.000000 
+101.000000 85.000000 65.000000 39.000000 15.000000 19.000000 
+31.000000 43.000000 57.000000 79.000000 104.000000 118.000000 
+119.000000 120.000000 125.000000 129.000000 128.000000 122.000000 
+116.000000 119.000000 129.000000 138.000000 138.000000 131.000000 
+129.000000 131.000000 129.000000 116.000000 108.000000 116.000000 
+123.000000 121.000000 127.000000 143.000000 146.000000 136.000000 
+126.000000 116.000000 96.000000 73.000000 57.000000 45.000000 
+32.000000 22.000000 20.000000 16.000000 16.000000 20.000000 
+18.000000 16.000000 13.000000 10.000000 10.000000 13.000000 
+20.000000 38.000000 68.000000 96.000000 109.000000 111.000000 
+108.000000 102.000000 97.000000 100.000000 108.000000 105.000000 
+89.000000 71.000000 83.000000 113.000000 132.000000 134.000000 
+136.000000 141.000000 139.000000 126.000000 112.000000 98.000000 
+77.000000 54.000000 40.000000 35.000000 45.000000 57.000000 
+68.000000 86.000000 99.000000 101.000000 110.000000 128.000000 
+140.000000 141.000000 132.000000 118.000000 111.000000 118.000000 
+135.000000 145.000000 144.000000 138.000000 139.000000 144.000000 
+136.000000 115.000000 99.000000 108.000000 125.000000 133.000000 
+135.000000 135.000000 129.000000 122.000000 123.000000 123.000000 
+106.000000 76.000000 52.000000 41.000000 35.000000 30.000000 
+27.000000 25.000000 23.000000 23.000000 20.000000 14.000000 
+10.000000 11.000000 14.000000 15.000000 21.000000 37.000000 
+62.000000 91.000000 109.000000 112.000000 108.000000 105.000000 
+107.000000 113.000000 126.000000 131.000000 68.000000 55.000000 
+75.000000 104.000000 117.000000 119.000000 125.000000 134.000000 
+136.000000 126.000000 113.000000 109.000000 103.000000 89.000000 
+76.000000 72.000000 80.000000 93.000000 104.000000 108.000000 
+99.000000 89.000000 102.000000 127.000000 140.000000 138.000000 
+127.000000 116.000000 115.000000 123.000000 133.000000 139.000000 
+140.000000 136.000000 133.000000 134.000000 134.000000 119.000000 
+100.000000 103.000000 122.000000 134.000000 131.000000 117.000000 
+101.000000 91.000000 98.000000 107.000000 98.000000 73.000000 
+61.000000 60.000000 51.000000 38.000000 32.000000 28.000000 
+22.000000 22.000000 21.000000 13.000000 9.000000 11.000000 
+13.000000 20.000000 33.000000 51.000000 71.000000 94.000000 
+118.000000 129.000000 125.000000 119.000000 118.000000 119.000000 
+113.000000 105.000000 85.000000 81.000000 93.000000 109.000000 
+117.000000 120.000000 125.000000 136.000000 147.000000 146.000000 
+131.000000 118.000000 111.000000 103.000000 98.000000 100.000000 
+109.000000 120.000000 128.000000 125.000000 106.000000 84.000000 
+92.000000 117.000000 126.000000 125.000000 128.000000 137.000000 
+141.000000 133.000000 121.000000 114.000000 116.000000 120.000000 
+123.000000 122.000000 119.000000 111.000000 99.000000 97.000000 
+105.000000 112.000000 113.000000 109.000000 100.000000 86.000000 
+77.000000 84.000000 88.000000 76.000000 75.000000 84.000000 
+81.000000 66.000000 50.000000 36.000000 21.000000 10.000000 
+11.000000 14.000000 16.000000 13.000000 8.000000 22.000000 
+54.000000 78.000000 96.000000 118.000000 136.000000 138.000000 
+132.000000 130.000000 133.000000 130.000000 115.000000 101.000000 
+96.000000 85.000000 92.000000 110.000000 127.000000 131.000000 
+131.000000 135.000000 144.000000 144.000000 134.000000 120.000000 
+113.000000 111.000000 112.000000 116.000000 123.000000 131.000000 
+138.000000 134.000000 113.000000 89.000000 100.000000 124.000000 
+130.000000 131.000000 140.000000 149.000000 145.000000 132.000000 
+122.000000 118.000000 119.000000 123.000000 127.000000 129.000000 
+128.000000 120.000000 108.000000 98.000000 99.000000 107.000000 
+114.000000 115.000000 112.000000 99.000000 79.000000 55.000000 
+52.000000 70.000000 91.000000 104.000000 102.000000 87.000000 
+64.000000 46.000000 33.000000 25.000000 26.000000 34.000000 
+34.000000 21.000000 13.000000 42.000000 92.000000 125.000000 
+135.000000 140.000000 142.000000 135.000000 132.000000 138.000000 
+134.000000 116.000000 102.000000 112.000000 104.000000 79.000000 
+73.000000 88.000000 110.000000 121.000000 122.000000 124.000000 
+130.000000 132.000000 133.000000 134.000000 132.000000 124.000000 
+117.000000 120.000000 130.000000 138.000000 139.000000 133.000000 
+114.000000 92.000000 96.000000 119.000000 132.000000 137.000000 
+143.000000 146.000000 140.000000 129.000000 122.000000 121.000000 
+119.000000 114.000000 108.000000 110.000000 119.000000 125.000000 
+122.000000 113.000000 112.000000 123.000000 135.000000 132.000000 
+118.000000 106.000000 92.000000 57.000000 20.000000 56.000000 
+108.000000 131.000000 129.000000 109.000000 85.000000 71.000000 
+70.000000 71.000000 71.000000 70.000000 67.000000 55.000000 
+60.000000 93.000000 125.000000 141.000000 141.000000 133.000000 
+129.000000 134.000000 142.000000 143.000000 129.000000 106.000000 
+92.000000 106.000000 111.000000 82.000000 67.000000 77.000000 
+100.000000 117.000000 121.000000 119.000000 125.000000 134.000000 
+135.000000 130.000000 126.000000 122.000000 117.000000 117.000000 
+124.000000 134.000000 141.000000 138.000000 115.000000 87.000000 
+88.000000 111.000000 124.000000 129.000000 138.000000 145.000000 
+142.000000 131.000000 127.000000 129.000000 128.000000 118.000000 
+111.000000 112.000000 117.000000 120.000000 117.000000 113.000000 
+113.000000 122.000000 135.000000 138.000000 130.000000 117.000000 
+104.000000 79.000000 38.000000 58.000000 106.000000 133.000000 
+134.000000 121.000000 108.000000 104.000000 108.000000 110.000000 
+108.000000 105.000000 99.000000 97.000000 113.000000 138.000000 
+150.000000 148.000000 139.000000 130.000000 129.000000 139.000000 
+144.000000 138.000000 130.000000 124.000000 115.000000 110.000000 
+119.000000 87.000000 61.000000 64.000000 88.000000 116.000000 
+130.000000 125.000000 122.000000 129.000000 132.000000 126.000000 
+120.000000 123.000000 126.000000 124.000000 127.000000 137.000000 
+144.000000 134.000000 110.000000 94.000000 99.000000 111.000000 
+118.000000 126.000000 133.000000 134.000000 129.000000 125.000000 
+132.000000 141.000000 139.000000 131.000000 126.000000 130.000000 
+136.000000 133.000000 124.000000 116.000000 114.000000 119.000000 
+127.000000 132.000000 131.000000 121.000000 102.000000 82.000000 
+65.000000 77.000000 108.000000 128.000000 128.000000 121.000000 
+116.000000 115.000000 115.000000 115.000000 116.000000 115.000000 
+110.000000 109.000000 121.000000 134.000000 138.000000 138.000000 
+140.000000 141.000000 141.000000 141.000000 137.000000 132.000000 
+131.000000 133.000000 130.000000 117.000000 137.000000 113.000000 
+85.000000 77.000000 93.000000 120.000000 135.000000 132.000000 
+127.000000 133.000000 141.000000 137.000000 124.000000 118.000000 
+123.000000 132.000000 138.000000 142.000000 138.000000 125.000000 
+113.000000 109.000000 109.000000 114.000000 123.000000 133.000000 
+134.000000 127.000000 120.000000 120.000000 123.000000 124.000000 
+125.000000 132.000000 142.000000 146.000000 143.000000 139.000000 
+134.000000 126.000000 120.000000 118.000000 119.000000 122.000000 
+127.000000 127.000000 122.000000 106.000000 86.000000 88.000000 
+112.000000 124.000000 120.000000 118.000000 120.000000 117.000000 
+109.000000 109.000000 117.000000 121.000000 113.000000 105.000000 
+108.000000 118.000000 126.000000 134.000000 143.000000 148.000000 
+141.000000 131.000000 131.000000 135.000000 133.000000 123.000000 
+117.000000 118.000000 136.000000 121.000000 98.000000 87.000000 
+98.000000 116.000000 126.000000 126.000000 127.000000 136.000000 
+147.000000 145.000000 133.000000 124.000000 128.000000 140.000000 
+144.000000 137.000000 126.000000 119.000000 118.000000 112.000000 
+103.000000 109.000000 126.000000 134.000000 129.000000 120.000000 
+118.000000 118.000000 112.000000 107.000000 116.000000 137.000000 
+152.000000 144.000000 118.000000 99.000000 99.000000 109.000000 
+119.000000 121.000000 119.000000 124.000000 134.000000 146.000000 
+154.000000 139.000000 94.000000 80.000000 102.000000 109.000000 
+106.000000 113.000000 120.000000 113.000000 105.000000 110.000000 
+123.000000 129.000000 123.000000 115.000000 116.000000 126.000000 
+137.000000 140.000000 139.000000 136.000000 132.000000 129.000000 
+129.000000 129.000000 117.000000 97.000000 84.000000 92.000000 
+133.000000 121.000000 100.000000 85.000000 90.000000 108.000000 
+122.000000 127.000000 128.000000 135.000000 144.000000 145.000000 
+137.000000 132.000000 136.000000 142.000000 139.000000 130.000000 
+124.000000 122.000000 114.000000 100.000000 106.000000 123.000000 
+127.000000 117.000000 108.000000 111.000000 117.000000 117.000000 
+117.000000 123.000000 136.000000 142.000000 134.000000 115.000000 
+97.000000 90.000000 100.000000 117.000000 129.000000 131.000000 
+130.000000 139.000000 154.000000 163.000000 160.000000 131.000000 
+77.000000 67.000000 94.000000 106.000000 109.000000 112.000000 
+112.000000 110.000000 115.000000 123.000000 128.000000 130.000000 
+132.000000 134.000000 133.000000 127.000000 121.000000 118.000000 
+120.000000 124.000000 128.000000 130.000000 128.000000 119.000000 
+100.000000 77.000000 65.000000 71.000000 137.000000 137.000000 
+125.000000 104.000000 92.000000 100.000000 115.000000 125.000000 
+127.000000 127.000000 129.000000 133.000000 136.000000 137.000000 
+135.000000 130.000000 128.000000 128.000000 127.000000 119.000000 
+111.000000 120.000000 136.000000 132.000000 105.000000 82.000000 
+87.000000 110.000000 124.000000 124.000000 124.000000 130.000000 
+134.000000 130.000000 121.000000 117.000000 119.000000 126.000000 
+134.000000 142.000000 146.000000 148.000000 153.000000 163.000000 
+167.000000 160.000000 141.000000 108.000000 65.000000 60.000000 
+89.000000 107.000000 106.000000 103.000000 106.000000 116.000000 
+124.000000 127.000000 126.000000 129.000000 139.000000 147.000000 
+141.000000 122.000000 108.000000 110.000000 122.000000 131.000000 
+136.000000 135.000000 124.000000 101.000000 83.000000 89.000000 
+114.000000 129.000000 139.000000 141.000000 134.000000 115.000000 
+93.000000 82.000000 89.000000 104.000000 115.000000 119.000000 
+119.000000 123.000000 130.000000 134.000000 132.000000 127.000000 
+121.000000 116.000000 110.000000 104.000000 114.000000 132.000000 
+129.000000 98.000000 62.000000 48.000000 67.000000 103.000000 
+128.000000 135.000000 132.000000 124.000000 114.000000 108.000000 
+115.000000 132.000000 146.000000 148.000000 145.000000 145.000000 
+148.000000 148.000000 144.000000 138.000000 130.000000 124.000000 
+118.000000 104.000000 81.000000 75.000000 92.000000 100.000000 
+96.000000 98.000000 111.000000 122.000000 124.000000 121.000000 
+123.000000 132.000000 142.000000 145.000000 135.000000 118.000000 
+109.000000 114.000000 128.000000 138.000000 141.000000 138.000000 
+121.000000 91.000000 74.000000 102.000000 166.000000 200.000000 
+138.000000 137.000000 134.000000 123.000000 101.000000 81.000000 
+80.000000 97.000000 116.000000 124.000000 122.000000 119.000000 
+123.000000 132.000000 138.000000 133.000000 116.000000 98.000000 
+86.000000 82.000000 81.000000 82.000000 82.000000 82.000000 
+87.000000 99.000000 117.000000 138.000000 148.000000 147.000000 
+145.000000 141.000000 130.000000 119.000000 119.000000 130.000000 
+142.000000 144.000000 142.000000 144.000000 149.000000 148.000000 
+139.000000 129.000000 122.000000 118.000000 115.000000 108.000000 
+98.000000 96.000000 102.000000 102.000000 101.000000 110.000000 
+121.000000 125.000000 124.000000 124.000000 129.000000 136.000000 
+138.000000 130.000000 116.000000 106.000000 105.000000 115.000000 
+130.000000 138.000000 130.000000 113.000000 100.000000 95.000000 
+97.000000 106.000000 130.000000 150.000000 126.000000 126.000000 
+130.000000 133.000000 126.000000 106.000000 83.000000 77.000000 
+101.000000 134.000000 147.000000 141.000000 131.000000 132.000000 
+143.000000 142.000000 120.000000 93.000000 74.000000 60.000000 
+49.000000 49.000000 59.000000 82.000000 110.000000 134.000000 
+152.000000 161.000000 156.000000 147.000000 143.000000 143.000000 
+140.000000 133.000000 129.000000 129.000000 130.000000 134.000000 
+140.000000 145.000000 145.000000 142.000000 140.000000 137.000000 
+129.000000 117.000000 106.000000 102.000000 104.000000 104.000000 
+97.000000 88.000000 93.000000 113.000000 130.000000 135.000000 
+131.000000 128.000000 128.000000 131.000000 130.000000 122.000000 
+108.000000 99.000000 112.000000 139.000000 155.000000 137.000000 
+94.000000 61.000000 62.000000 89.000000 114.000000 119.000000 
+108.000000 100.000000 122.000000 119.000000 118.000000 126.000000 
+140.000000 142.000000 127.000000 112.000000 104.000000 111.000000 
+134.000000 141.000000 139.000000 136.000000 133.000000 126.000000 
+114.000000 99.000000 84.000000 69.000000 55.000000 47.000000 
+45.000000 56.000000 77.000000 100.000000 122.000000 135.000000 
+138.000000 137.000000 133.000000 131.000000 131.000000 133.000000 
+132.000000 128.000000 128.000000 134.000000 140.000000 141.000000 
+138.000000 139.000000 137.000000 126.000000 110.000000 102.000000 
+103.000000 108.000000 102.000000 86.000000 73.000000 74.000000 
+94.000000 118.000000 134.000000 140.000000 137.000000 128.000000 
+123.000000 125.000000 131.000000 130.000000 129.000000 145.000000 
+180.000000 201.000000 184.000000 133.000000 88.000000 73.000000 
+77.000000 89.000000 103.000000 119.000000 132.000000 131.000000 
+125.000000 121.000000 120.000000 124.000000 130.000000 143.000000 
+168.000000 182.000000 147.000000 88.000000 72.000000 85.000000 
+108.000000 118.000000 102.000000 90.000000 90.000000 85.000000 
+75.000000 61.000000 51.000000 44.000000 41.000000 48.000000 
+65.000000 91.000000 113.000000 125.000000 129.000000 130.000000 
+133.000000 138.000000 141.000000 141.000000 136.000000 131.000000 
+130.000000 132.000000 131.000000 131.000000 137.000000 150.000000 
+155.000000 141.000000 114.000000 95.000000 94.000000 103.000000 
+98.000000 77.000000 62.000000 65.000000 83.000000 101.000000 
+111.000000 113.000000 111.000000 109.000000 113.000000 129.000000 
+148.000000 162.000000 189.000000 241.000000 282.000000 269.000000 
+206.000000 141.000000 115.000000 120.000000 121.000000 111.000000 
+110.000000 122.000000 134.000000 131.000000 122.000000 119.000000 
+124.000000 128.000000 128.000000 133.000000 144.000000 143.000000 
+121.000000 97.000000 87.000000 90.000000 85.000000 73.000000 
+67.000000 79.000000 80.000000 61.000000 47.000000 48.000000 
+56.000000 60.000000 56.000000 57.000000 69.000000 92.000000 
+115.000000 127.000000 132.000000 133.000000 136.000000 138.000000 
+140.000000 139.000000 138.000000 135.000000 130.000000 126.000000 
+127.000000 135.000000 143.000000 149.000000 151.000000 147.000000 
+131.000000 105.000000 82.000000 76.000000 79.000000 78.000000 
+64.000000 48.000000 48.000000 59.000000 69.000000 72.000000 
+76.000000 93.000000 123.000000 154.000000 178.000000 204.000000 
+242.000000 281.000000 291.000000 256.000000 196.000000 141.000000 
+111.000000 103.000000 107.000000 114.000000 123.000000 131.000000 
+133.000000 128.000000 122.000000 116.000000 114.000000 119.000000 
+128.000000 137.000000 133.000000 116.000000 100.000000 98.000000 
+111.000000 120.000000 108.000000 87.000000 83.000000 106.000000 
+130.000000 130.000000 104.000000 73.000000 60.000000 58.000000 
+58.000000 61.000000 73.000000 100.000000 125.000000 135.000000 
+135.000000 132.000000 128.000000 121.000000 117.000000 123.000000 
+133.000000 134.000000 126.000000 121.000000 128.000000 141.000000 
+150.000000 152.000000 149.000000 142.000000 130.000000 113.000000 
+93.000000 74.000000 62.000000 59.000000 58.000000 56.000000 
+54.000000 58.000000 70.000000 83.000000 99.000000 127.000000 
+163.000000 194.000000 219.000000 240.000000 250.000000 232.000000 
+188.000000 142.000000 114.000000 108.000000 112.000000 114.000000 
+115.000000 117.000000 121.000000 123.000000 121.000000 119.000000 
+122.000000 114.000000 113.000000 119.000000 125.000000 129.000000 
+136.000000 144.000000 137.000000 116.000000 102.000000 105.000000 
+106.000000 97.000000 103.000000 160.000000 255.000000 296.000000 
+247.000000 167.000000 116.000000 85.000000 61.000000 52.000000 
+71.000000 113.000000 135.000000 126.000000 110.000000 103.000000 
+98.000000 89.000000 89.000000 106.000000 126.000000 128.000000 
+116.000000 108.000000 114.000000 126.000000 135.000000 142.000000 
+143.000000 125.000000 94.000000 71.000000 67.000000 66.000000 
+56.000000 59.000000 79.000000 105.000000 123.000000 128.000000 
+133.000000 152.000000 182.000000 212.000000 233.000000 245.000000 
+247.000000 232.000000 193.000000 138.000000 90.000000 72.000000 
+89.000000 116.000000 129.000000 129.000000 130.000000 134.000000 
+133.000000 125.000000 118.000000 117.000000 127.000000 121.000000 
+121.000000 127.000000 129.000000 130.000000 134.000000 139.000000 
+137.000000 129.000000 123.000000 118.000000 107.000000 92.000000 
+91.000000 142.000000 260.000000 345.000000 362.000000 325.000000 
+240.000000 136.000000 67.000000 39.000000 75.000000 117.000000 
+126.000000 109.000000 89.000000 74.000000 69.000000 68.000000 
+82.000000 107.000000 120.000000 112.000000 93.000000 87.000000 
+100.000000 118.000000 129.000000 133.000000 124.000000 100.000000 
+69.000000 54.000000 59.000000 62.000000 49.000000 72.000000 
+163.000000 287.000000 364.000000 351.000000 287.000000 253.000000 
+256.000000 257.000000 239.000000 216.000000 192.000000 159.000000 
+121.000000 93.000000 87.000000 98.000000 116.000000 132.000000 
+138.000000 135.000000 135.000000 140.000000 141.000000 132.000000 
+122.000000 121.000000 131.000000 131.000000 129.000000 126.000000 
+123.000000 124.000000 124.000000 125.000000 126.000000 126.000000 
+123.000000 120.000000 127.000000 130.000000 106.000000 78.000000 
+115.000000 210.000000 312.000000 313.000000 195.000000 83.000000 
+47.000000 53.000000 87.000000 93.000000 88.000000 87.000000 
+81.000000 64.000000 55.000000 66.000000 102.000000 132.000000 
+133.000000 111.000000 86.000000 79.000000 92.000000 111.000000 
+123.000000 119.000000 98.000000 72.000000 53.000000 50.000000 
+61.000000 78.000000 117.000000 184.000000 309.000000 443.000000 
+472.000000 385.000000 288.000000 235.000000 203.000000 170.000000 
+132.000000 107.000000 103.000000 110.000000 117.000000 120.000000 
+122.000000 123.000000 128.000000 137.000000 143.000000 141.000000 
+135.000000 136.000000 138.000000 133.000000 125.000000 123.000000 
+127.000000 129.000000 128.000000 127.000000 125.000000 123.000000 
+118.000000 117.000000 122.000000 124.000000 122.000000 120.000000 
+126.000000 129.000000 121.000000 105.000000 98.000000 124.000000 
+160.000000 138.000000 69.000000 34.000000 42.000000 66.000000 
+78.000000 72.000000 64.000000 60.000000 58.000000 50.000000 
+46.000000 65.000000 105.000000 138.000000 143.000000 122.000000 
+88.000000 63.000000 62.000000 82.000000 102.000000 102.000000 
+87.000000 74.000000 61.000000 52.000000 55.000000 91.000000 
+199.000000 302.000000 334.000000 285.000000 190.000000 107.000000 
+81.000000 82.000000 77.000000 85.000000 103.000000 113.000000 
+116.000000 122.000000 128.000000 129.000000 128.000000 132.000000 
+137.000000 138.000000 134.000000 129.000000 130.000000 133.000000 
+130.000000 124.000000 121.000000 123.000000 132.000000 130.000000 
+127.000000 128.000000 130.000000 128.000000 124.000000 123.000000 
+124.000000 123.000000 120.000000 118.000000 117.000000 116.000000 
+121.000000 131.000000 140.000000 132.000000 108.000000 84.000000 
+67.000000 60.000000 61.000000 68.000000 71.000000 67.000000 
+54.000000 41.000000 42.000000 48.000000 58.000000 77.000000 
+101.000000 124.000000 133.000000 119.000000 92.000000 68.000000 
+61.000000 68.000000 73.000000 71.000000 69.000000 71.000000 
+60.000000 49.000000 55.000000 89.000000 174.000000 229.000000 
+178.000000 82.000000 51.000000 77.000000 90.000000 87.000000 
+94.000000 111.000000 123.000000 123.000000 118.000000 118.000000 
+121.000000 121.000000 126.000000 134.000000 136.000000 127.000000 
+117.000000 117.000000 126.000000 127.000000 119.000000 114.000000 
+118.000000 124.000000 129.000000 128.000000 129.000000 130.000000 
+128.000000 126.000000 128.000000 131.000000 130.000000 125.000000 
+121.000000 121.000000 123.000000 124.000000 125.000000 128.000000 
+133.000000 133.000000 122.000000 101.000000 78.000000 64.000000 
+62.000000 67.000000 69.000000 61.000000 48.000000 43.000000 
+51.000000 59.000000 63.000000 68.000000 85.000000 111.000000 
+124.000000 114.000000 93.000000 76.000000 66.000000 57.000000 
+51.000000 52.000000 61.000000 64.000000 55.000000 48.000000 
+55.000000 66.000000 91.000000 114.000000 102.000000 95.000000 
+106.000000 110.000000 112.000000 125.000000 139.000000 144.000000 
+141.000000 136.000000 129.000000 121.000000 115.000000 117.000000 
+127.000000 133.000000 130.000000 124.000000 123.000000 127.000000 
+130.000000 127.000000 124.000000 125.000000 130.000000 133.000000 
+130.000000 129.000000 131.000000 131.000000 129.000000 128.000000 
+129.000000 130.000000 129.000000 128.000000 128.000000 129.000000 
+128.000000 127.000000 126.000000 127.000000 129.000000 129.000000 
+122.000000 107.000000 88.000000 73.000000 66.000000 66.000000 
+64.000000 58.000000 53.000000 53.000000 60.000000 63.000000 
+60.000000 60.000000 72.000000 88.000000 89.000000 72.000000 
+59.000000 61.000000 69.000000 68.000000 55.000000 52.000000 
+60.000000 62.000000 53.000000 43.000000 43.000000 49.000000 
+50.000000 57.000000 85.000000 116.000000 130.000000 130.000000 
+130.000000 136.000000 141.000000 138.000000 132.000000 130.000000 
+131.000000 128.000000 124.000000 123.000000 124.000000 126.000000 
+128.000000 133.000000 138.000000 136.000000 127.000000 121.000000 
+121.000000 126.000000 131.000000 133.000000 130.000000 128.000000 
+129.000000 129.000000 129.000000 128.000000 128.000000 130.000000 
+132.000000 131.000000 127.000000 125.000000 127.000000 131.000000 
+130.000000 124.000000 123.000000 129.000000 133.000000 123.000000 
+104.000000 90.000000 85.000000 81.000000 68.000000 53.000000 
+49.000000 60.000000 74.000000 80.000000 75.000000 65.000000 
+59.000000 55.000000 50.000000 44.000000 45.000000 53.000000 
+63.000000 65.000000 61.000000 57.000000 56.000000 58.000000 
+60.000000 59.000000 57.000000 59.000000 68.000000 84.000000 
+106.000000 126.000000 134.000000 131.000000 126.000000 126.000000 
+128.000000 127.000000 123.000000 120.000000 123.000000 129.000000 
+131.000000 129.000000 127.000000 128.000000 132.000000 136.000000 
+136.000000 133.000000 129.000000 129.000000 130.000000 129.000000 
+126.000000 124.000000 131.000000 129.000000 126.000000 124.000000 
+126.000000 129.000000 131.000000 131.000000 130.000000 128.000000 
+127.000000 127.000000 129.000000 130.000000 126.000000 121.000000 
+120.000000 126.000000 133.000000 133.000000 125.000000 111.000000 
+96.000000 82.000000 67.000000 57.000000 55.000000 67.000000 
+84.000000 95.000000 91.000000 74.000000 57.000000 49.000000 
+50.000000 55.000000 57.000000 56.000000 57.000000 65.000000 
+83.000000 96.000000 89.000000 74.000000 68.000000 69.000000 
+72.000000 76.000000 86.000000 103.000000 121.000000 129.000000 
+127.000000 124.000000 123.000000 124.000000 124.000000 124.000000 
+121.000000 116.000000 115.000000 120.000000 125.000000 126.000000 
+123.000000 123.000000 127.000000 132.000000 132.000000 127.000000 
+124.000000 127.000000 131.000000 131.000000 125.000000 119.000000 
+133.000000 127.000000 123.000000 123.000000 127.000000 129.000000 
+130.000000 132.000000 133.000000 133.000000 132.000000 131.000000 
+128.000000 124.000000 123.000000 125.000000 126.000000 122.000000 
+124.000000 137.000000 150.000000 144.000000 121.000000 98.000000 
+86.000000 78.000000 67.000000 64.000000 75.000000 90.000000 
+90.000000 74.000000 57.000000 51.000000 54.000000 59.000000 
+61.000000 62.000000 64.000000 73.000000 88.000000 95.000000 
+85.000000 64.000000 53.000000 61.000000 80.000000 98.000000 
+112.000000 121.000000 124.000000 119.000000 117.000000 123.000000 
+130.000000 130.000000 124.000000 121.000000 121.000000 121.000000 
+121.000000 123.000000 127.000000 130.000000 130.000000 131.000000 
+133.000000 133.000000 131.000000 128.000000 125.000000 123.000000 
+124.000000 127.000000 127.000000 125.000000 126.000000 125.000000 
+123.000000 124.000000 126.000000 128.000000 128.000000 130.000000 
+130.000000 127.000000 124.000000 126.000000 130.000000 130.000000 
+128.000000 128.000000 128.000000 127.000000 127.000000 138.000000 
+153.000000 157.000000 136.000000 100.000000 69.000000 56.000000 
+60.000000 74.000000 89.000000 93.000000 83.000000 68.000000 
+59.000000 57.000000 59.000000 64.000000 70.000000 70.000000 
+61.000000 51.000000 48.000000 50.000000 53.000000 54.000000 
+63.000000 82.000000 99.000000 109.000000 115.000000 122.000000 
+124.000000 120.000000 115.000000 118.000000 126.000000 129.000000 
+124.000000 117.000000 116.000000 121.000000 126.000000 128.000000 
+127.000000 125.000000 126.000000 129.000000 131.000000 129.000000 
+125.000000 124.000000 127.000000 129.000000 127.000000 124.000000 
+124.000000 125.000000 115.000000 130.000000 135.000000 133.000000 
+130.000000 129.000000 130.000000 132.000000 133.000000 130.000000 
+126.000000 123.000000 125.000000 131.000000 135.000000 134.000000 
+133.000000 135.000000 139.000000 139.000000 133.000000 126.000000 
+117.000000 104.000000 82.000000 60.000000 52.000000 62.000000 
+78.000000 86.000000 84.000000 76.000000 68.000000 63.000000 
+63.000000 68.000000 70.000000 64.000000 55.000000 50.000000 
+50.000000 49.000000 46.000000 52.000000 75.000000 104.000000 
+124.000000 130.000000 130.000000 129.000000 127.000000 124.000000 
+120.000000 120.000000 123.000000 124.000000 121.000000 115.000000 
+114.000000 119.000000 126.000000 131.000000 131.000000 127.000000 
+125.000000 125.000000 125.000000 122.000000 119.000000 120.000000 
+125.000000 129.000000 128.000000 125.000000 124.000000 126.000000 
+88.000000 110.000000 130.000000 135.000000 127.000000 121.000000 
+123.000000 128.000000 132.000000 133.000000 131.000000 128.000000 
+126.000000 129.000000 135.000000 138.000000 135.000000 132.000000 
+129.000000 127.000000 123.000000 113.000000 101.000000 89.000000 
+74.000000 59.000000 47.000000 40.000000 37.000000 44.000000 
+55.000000 60.000000 59.000000 57.000000 57.000000 56.000000 
+50.000000 45.000000 47.000000 54.000000 53.000000 46.000000 
+43.000000 63.000000 102.000000 132.000000 138.000000 134.000000 
+132.000000 136.000000 137.000000 132.000000 125.000000 119.000000 
+116.000000 116.000000 117.000000 116.000000 115.000000 120.000000 
+130.000000 138.000000 138.000000 132.000000 126.000000 123.000000 
+120.000000 116.000000 114.000000 117.000000 122.000000 123.000000 
+122.000000 123.000000 128.000000 132.000000 99.000000 97.000000 
+108.000000 121.000000 126.000000 121.000000 117.000000 122.000000 
+134.000000 142.000000 141.000000 138.000000 136.000000 137.000000 
+139.000000 139.000000 135.000000 126.000000 115.000000 113.000000 
+118.000000 120.000000 113.000000 105.000000 109.000000 121.000000 
+128.000000 115.000000 91.000000 73.000000 67.000000 63.000000 
+56.000000 52.000000 54.000000 64.000000 79.000000 100.000000 
+122.000000 132.000000 119.000000 87.000000 61.000000 60.000000 
+82.000000 107.000000 122.000000 129.000000 136.000000 144.000000 
+146.000000 138.000000 126.000000 119.000000 120.000000 123.000000 
+123.000000 121.000000 120.000000 123.000000 129.000000 132.000000 
+132.000000 130.000000 126.000000 122.000000 119.000000 120.000000 
+124.000000 127.000000 127.000000 122.000000 117.000000 115.000000 
+120.000000 127.000000 137.000000 138.000000 134.000000 129.000000 
+127.000000 125.000000 123.000000 126.000000 135.000000 146.000000 
+149.000000 146.000000 141.000000 138.000000 135.000000 130.000000 
+122.000000 117.000000 117.000000 123.000000 137.000000 155.000000 
+172.000000 196.000000 237.000000 289.000000 328.000000 322.000000 
+261.000000 172.000000 102.000000 68.000000 54.000000 48.000000 
+53.000000 84.000000 150.000000 229.000000 285.000000 297.000000 
+263.000000 202.000000 136.000000 86.000000 63.000000 74.000000 
+106.000000 136.000000 149.000000 149.000000 140.000000 130.000000 
+124.000000 123.000000 125.000000 129.000000 131.000000 128.000000 
+125.000000 125.000000 130.000000 135.000000 134.000000 131.000000 
+128.000000 126.000000 122.000000 117.000000 116.000000 121.000000 
+130.000000 138.000000 140.000000 135.000000 128.000000 124.000000 
+134.000000 131.000000 127.000000 123.000000 117.000000 116.000000 
+124.000000 136.000000 144.000000 144.000000 139.000000 135.000000 
+132.000000 126.000000 117.000000 113.000000 114.000000 120.000000 
+134.000000 155.000000 186.000000 228.000000 279.000000 332.000000 
+374.000000 393.000000 384.000000 345.000000 272.000000 184.000000 
+108.000000 61.000000 42.000000 41.000000 56.000000 101.000000 
+195.000000 314.000000 391.000000 381.000000 304.000000 219.000000 
+160.000000 125.000000 101.000000 93.000000 107.000000 127.000000 
+132.000000 129.000000 127.000000 128.000000 127.000000 128.000000 
+133.000000 139.000000 139.000000 133.000000 128.000000 131.000000 
+135.000000 135.000000 132.000000 131.000000 134.000000 136.000000 
+133.000000 125.000000 117.000000 115.000000 120.000000 128.000000 
+136.000000 138.000000 135.000000 127.000000 131.000000 128.000000 
+124.000000 121.000000 122.000000 127.000000 133.000000 135.000000 
+133.000000 134.000000 136.000000 136.000000 134.000000 131.000000 
+126.000000 118.000000 122.000000 152.000000 204.000000 257.000000 
+287.000000 292.000000 281.000000 265.000000 250.000000 246.000000 
+250.000000 242.000000 204.000000 150.000000 104.000000 76.000000 
+65.000000 66.000000 88.000000 141.000000 204.000000 266.000000 
+284.000000 243.000000 183.000000 141.000000 124.000000 126.000000 
+128.000000 105.000000 87.000000 102.000000 128.000000 139.000000 
+132.000000 121.000000 118.000000 123.000000 127.000000 130.000000 
+132.000000 134.000000 136.000000 139.000000 139.000000 136.000000 
+132.000000 130.000000 129.000000 126.000000 121.000000 118.000000 
+118.000000 119.000000 122.000000 130.000000 137.000000 136.000000 
+127.000000 119.000000 129.000000 127.000000 127.000000 129.000000 
+134.000000 138.000000 135.000000 130.000000 131.000000 135.000000 
+134.000000 129.000000 130.000000 136.000000 134.000000 132.000000 
+173.000000 261.000000 336.000000 344.000000 285.000000 207.000000 
+152.000000 119.000000 109.000000 116.000000 122.000000 110.000000 
+85.000000 69.000000 79.000000 93.000000 97.000000 108.000000 
+135.000000 155.000000 141.000000 98.000000 62.000000 60.000000 
+71.000000 68.000000 71.000000 97.000000 121.000000 116.000000 
+95.000000 91.000000 110.000000 124.000000 117.000000 110.000000 
+120.000000 136.000000 138.000000 130.000000 128.000000 131.000000 
+130.000000 125.000000 126.000000 133.000000 138.000000 136.000000 
+132.000000 134.000000 138.000000 134.000000 119.000000 102.000000 
+102.000000 120.000000 138.000000 140.000000 129.000000 119.000000 
+132.000000 124.000000 118.000000 123.000000 132.000000 132.000000 
+124.000000 118.000000 122.000000 128.000000 136.000000 144.000000 
+142.000000 123.000000 111.000000 161.000000 270.000000 339.000000 
+324.000000 240.000000 147.000000 102.000000 100.000000 102.000000 
+103.000000 109.000000 116.000000 113.000000 101.000000 97.000000 
+108.000000 126.000000 141.000000 141.000000 125.000000 102.000000 
+78.000000 73.000000 94.000000 107.000000 109.000000 118.000000 
+135.000000 142.000000 123.000000 94.000000 89.000000 109.000000 
+128.000000 123.000000 104.000000 97.000000 113.000000 133.000000 
+141.000000 134.000000 127.000000 127.000000 130.000000 128.000000 
+127.000000 128.000000 130.000000 125.000000 115.000000 111.000000 
+114.000000 107.000000 85.000000 68.000000 80.000000 108.000000 
+128.000000 132.000000 125.000000 120.000000 127.000000 123.000000 
+128.000000 136.000000 137.000000 131.000000 130.000000 132.000000 
+131.000000 129.000000 133.000000 131.000000 114.000000 101.000000 
+137.000000 220.000000 269.000000 246.000000 170.000000 101.000000 
+92.000000 116.000000 119.000000 114.000000 117.000000 127.000000 
+132.000000 126.000000 116.000000 108.000000 101.000000 94.000000 
+84.000000 70.000000 61.000000 69.000000 96.000000 125.000000 
+136.000000 129.000000 120.000000 120.000000 128.000000 132.000000 
+123.000000 108.000000 108.000000 130.000000 148.000000 142.000000 
+115.000000 84.000000 90.000000 123.000000 142.000000 136.000000 
+125.000000 127.000000 134.000000 134.000000 130.000000 128.000000 
+130.000000 130.000000 125.000000 122.000000 125.000000 123.000000 
+107.000000 92.000000 86.000000 89.000000 102.000000 118.000000 
+126.000000 125.000000 130.000000 135.000000 135.000000 131.000000 
+130.000000 136.000000 139.000000 131.000000 122.000000 127.000000 
+136.000000 126.000000 106.000000 117.000000 166.000000 206.000000 
+193.000000 137.000000 93.000000 104.000000 129.000000 128.000000 
+118.000000 125.000000 142.000000 147.000000 140.000000 137.000000 
+140.000000 134.000000 113.000000 85.000000 63.000000 58.000000 
+72.000000 97.000000 119.000000 126.000000 126.000000 132.000000 
+140.000000 137.000000 130.000000 133.000000 139.000000 131.000000 
+113.000000 124.000000 158.000000 179.000000 165.000000 115.000000 
+80.000000 99.000000 132.000000 140.000000 134.000000 130.000000 
+131.000000 130.000000 126.000000 127.000000 133.000000 137.000000 
+130.000000 121.000000 122.000000 134.000000 138.000000 124.000000 
+98.000000 86.000000 99.000000 120.000000 129.000000 121.000000 
+132.000000 139.000000 138.000000 135.000000 137.000000 140.000000 
+137.000000 131.000000 130.000000 131.000000 121.000000 105.000000 
+106.000000 132.000000 156.000000 154.000000 126.000000 103.000000 
+114.000000 134.000000 134.000000 122.000000 123.000000 139.000000 
+146.000000 140.000000 135.000000 137.000000 135.000000 122.000000 
+101.000000 86.000000 81.000000 80.000000 89.000000 107.000000 
+125.000000 128.000000 124.000000 124.000000 130.000000 128.000000 
+122.000000 125.000000 135.000000 130.000000 112.000000 117.000000 
+162.000000 205.000000 212.000000 172.000000 106.000000 85.000000 
+118.000000 143.000000 141.000000 135.000000 138.000000 143.000000 
+141.000000 135.000000 136.000000 136.000000 131.000000 120.000000 
+117.000000 129.000000 143.000000 135.000000 110.000000 96.000000 
+103.000000 116.000000 126.000000 125.000000 141.000000 137.000000 
+131.000000 130.000000 133.000000 132.000000 123.000000 119.000000 
+124.000000 128.000000 120.000000 110.000000 116.000000 130.000000 
+135.000000 126.000000 120.000000 129.000000 140.000000 139.000000 
+131.000000 130.000000 138.000000 140.000000 133.000000 123.000000 
+120.000000 124.000000 128.000000 125.000000 114.000000 97.000000 
+85.000000 84.000000 97.000000 115.000000 129.000000 133.000000 
+133.000000 135.000000 136.000000 129.000000 118.000000 115.000000 
+126.000000 135.000000 125.000000 115.000000 136.000000 181.000000 
+222.000000 228.000000 177.000000 118.000000 120.000000 148.000000 
+149.000000 135.000000 130.000000 137.000000 142.000000 137.000000 
+130.000000 128.000000 129.000000 132.000000 132.000000 127.000000 
+121.000000 117.000000 113.000000 109.000000 106.000000 107.000000 
+115.000000 125.000000 135.000000 133.000000 130.000000 130.000000 
+131.000000 129.000000 125.000000 126.000000 128.000000 126.000000 
+121.000000 120.000000 126.000000 129.000000 126.000000 123.000000 
+126.000000 131.000000 130.000000 127.000000 130.000000 138.000000 
+139.000000 132.000000 124.000000 122.000000 125.000000 132.000000 
+140.000000 140.000000 126.000000 104.000000 92.000000 97.000000 
+110.000000 120.000000 130.000000 139.000000 142.000000 134.000000 
+127.000000 127.000000 130.000000 128.000000 127.000000 132.000000 
+135.000000 130.000000 131.000000 156.000000 205.000000 248.000000 
+233.000000 174.000000 142.000000 146.000000 142.000000 131.000000 
+128.000000 135.000000 140.000000 137.000000 131.000000 128.000000 
+124.000000 121.000000 125.000000 135.000000 138.000000 129.000000 
+113.000000 102.000000 105.000000 115.000000 125.000000 128.000000 
+126.000000 121.000000 118.000000 118.000000 119.000000 120.000000 
+121.000000 124.000000 127.000000 129.000000 128.000000 126.000000 
+127.000000 131.000000 134.000000 136.000000 137.000000 135.000000 
+131.000000 129.000000 132.000000 134.000000 131.000000 123.000000 
+121.000000 123.000000 126.000000 124.000000 125.000000 126.000000 
+121.000000 108.000000 96.000000 95.000000 104.000000 114.000000 
+123.000000 133.000000 140.000000 139.000000 131.000000 125.000000 
+125.000000 127.000000 131.000000 137.000000 143.000000 137.000000 
+125.000000 128.000000 172.000000 229.000000 241.000000 201.000000 
+156.000000 136.000000 132.000000 132.000000 134.000000 134.000000 
+132.000000 128.000000 125.000000 124.000000 123.000000 121.000000 
+123.000000 131.000000 139.000000 137.000000 127.000000 119.000000 
+120.000000 127.000000 130.000000 127.000000 132.000000 122.000000 
+114.000000 113.000000 119.000000 127.000000 132.000000 131.000000 
+130.000000 130.000000 128.000000 127.000000 129.000000 134.000000 
+138.000000 135.000000 129.000000 127.000000 131.000000 137.000000 
+140.000000 137.000000 131.000000 125.000000 123.000000 126.000000 
+130.000000 128.000000 124.000000 124.000000 130.000000 132.000000 
+128.000000 121.000000 121.000000 128.000000 135.000000 138.000000 
+136.000000 133.000000 129.000000 125.000000 122.000000 122.000000 
+126.000000 133.000000 141.000000 142.000000 130.000000 123.000000 
+150.000000 201.000000 229.000000 214.000000 176.000000 139.000000 
+119.000000 118.000000 126.000000 133.000000 135.000000 133.000000 
+132.000000 131.000000 129.000000 124.000000 121.000000 123.000000 
+128.000000 127.000000 121.000000 117.000000 120.000000 126.000000 
+129.000000 128.000000 119.000000 113.000000 109.000000 109.000000 
+115.000000 122.000000 127.000000 126.000000 125.000000 125.000000 
+124.000000 125.000000 131.000000 138.000000 140.000000 135.000000 
+129.000000 129.000000 135.000000 138.000000 134.000000 128.000000 
+124.000000 122.000000 123.000000 127.000000 130.000000 129.000000 
+123.000000 119.000000 121.000000 122.000000 121.000000 120.000000 
+127.000000 135.000000 136.000000 130.000000 125.000000 126.000000 
+129.000000 128.000000 127.000000 128.000000 131.000000 134.000000 
+138.000000 136.000000 123.000000 111.000000 128.000000 169.000000 
+202.000000 201.000000 169.000000 134.000000 120.000000 126.000000 
+130.000000 125.000000 121.000000 126.000000 133.000000 133.000000 
+128.000000 124.000000 124.000000 124.000000 120.000000 113.000000 
+111.000000 117.000000 125.000000 130.000000 128.000000 122.000000 
+125.000000 128.000000 123.000000 111.000000 104.000000 109.000000 
+118.000000 117.000000 109.000000 106.000000 111.000000 118.000000 
+122.000000 125.000000 128.000000 129.000000 129.000000 130.000000 
+132.000000 136.000000 136.000000 135.000000 132.000000 130.000000 
+130.000000 134.000000 138.000000 137.000000 131.000000 124.000000 
+124.000000 128.000000 129.000000 127.000000 127.000000 131.000000 
+134.000000 135.000000 137.000000 139.000000 138.000000 133.000000 
+129.000000 128.000000 131.000000 137.000000 142.000000 142.000000 
+132.000000 117.000000 120.000000 145.000000 171.000000 176.000000 
+156.000000 129.000000 118.000000 123.000000 130.000000 133.000000 
+132.000000 130.000000 126.000000 124.000000 127.000000 131.000000 
+131.000000 125.000000 118.000000 115.000000 119.000000 125.000000 
+127.000000 125.000000 120.000000 117.000000 130.000000 130.000000 
+127.000000 120.000000 113.000000 110.000000 109.000000 104.000000 
+97.000000 98.000000 112.000000 131.000000 140.000000 138.000000 
+132.000000 130.000000 132.000000 133.000000 135.000000 138.000000 
+140.000000 137.000000 133.000000 132.000000 135.000000 137.000000 
+134.000000 128.000000 127.000000 129.000000 130.000000 129.000000 
+129.000000 132.000000 137.000000 138.000000 135.000000 132.000000 
+132.000000 136.000000 140.000000 142.000000 139.000000 132.000000 
+128.000000 132.000000 141.000000 143.000000 134.000000 123.000000 
+124.000000 139.000000 154.000000 158.000000 149.000000 135.000000 
+129.000000 131.000000 135.000000 137.000000 135.000000 130.000000 
+126.000000 126.000000 130.000000 133.000000 128.000000 118.000000 
+113.000000 117.000000 125.000000 130.000000 127.000000 121.000000 
+115.000000 113.000000 124.000000 123.000000 131.000000 138.000000 
+134.000000 122.000000 109.000000 100.000000 96.000000 99.000000 
+108.000000 120.000000 131.000000 136.000000 136.000000 134.000000 
+131.000000 130.000000 133.000000 137.000000 138.000000 137.000000 
+135.000000 132.000000 129.000000 127.000000 126.000000 128.000000 
+129.000000 129.000000 129.000000 130.000000 132.000000 133.000000 
+136.000000 138.000000 138.000000 135.000000 131.000000 130.000000 
+130.000000 132.000000 133.000000 134.000000 136.000000 141.000000 
+147.000000 147.000000 136.000000 121.000000 116.000000 126.000000 
+134.000000 131.000000 123.000000 117.000000 124.000000 136.000000 
+139.000000 137.000000 133.000000 130.000000 127.000000 127.000000 
+129.000000 130.000000 128.000000 125.000000 123.000000 122.000000 
+122.000000 123.000000 125.000000 125.000000 123.000000 121.000000 
+90.000000 108.000000 126.000000 138.000000 136.000000 121.000000 
+111.000000 118.000000 126.000000 126.000000 125.000000 128.000000 
+128.000000 121.000000 111.000000 105.000000 106.000000 109.000000 
+113.000000 113.000000 103.000000 97.000000 108.000000 123.000000 
+129.000000 128.000000 123.000000 122.000000 125.000000 129.000000 
+132.000000 135.000000 136.000000 130.000000 122.000000 121.000000 
+126.000000 132.000000 137.000000 139.000000 135.000000 131.000000 
+135.000000 138.000000 130.000000 122.000000 124.000000 130.000000 
+120.000000 102.000000 108.000000 125.000000 119.000000 96.000000 
+81.000000 73.000000 57.000000 40.000000 29.000000 24.000000 
+20.000000 16.000000 13.000000 9.000000 10.000000 18.000000 
+32.000000 57.000000 85.000000 103.000000 109.000000 107.000000 
+102.000000 96.000000 91.000000 84.000000 87.000000 83.000000 
+103.000000 129.000000 137.000000 124.000000 116.000000 123.000000 
+134.000000 132.000000 122.000000 115.000000 116.000000 123.000000 
+129.000000 131.000000 129.000000 128.000000 128.000000 122.000000 
+107.000000 100.000000 112.000000 125.000000 128.000000 124.000000 
+124.000000 127.000000 127.000000 123.000000 124.000000 133.000000 
+137.000000 131.000000 123.000000 122.000000 123.000000 123.000000 
+130.000000 139.000000 140.000000 135.000000 134.000000 133.000000 
+123.000000 113.000000 115.000000 123.000000 115.000000 98.000000 
+111.000000 143.000000 153.000000 132.000000 106.000000 87.000000 
+69.000000 47.000000 24.000000 10.000000 8.000000 10.000000 
+16.000000 18.000000 10.000000 19.000000 45.000000 67.000000 
+87.000000 107.000000 119.000000 117.000000 111.000000 113.000000 
+123.000000 129.000000 73.000000 58.000000 80.000000 109.000000 
+119.000000 118.000000 123.000000 136.000000 146.000000 143.000000 
+134.000000 129.000000 128.000000 124.000000 121.000000 122.000000 
+124.000000 126.000000 126.000000 121.000000 109.000000 101.000000 
+107.000000 116.000000 120.000000 121.000000 124.000000 125.000000 
+121.000000 118.000000 119.000000 124.000000 126.000000 124.000000 
+125.000000 130.000000 127.000000 110.000000 95.000000 101.000000 
+117.000000 124.000000 123.000000 118.000000 112.000000 104.000000 
+106.000000 118.000000 119.000000 108.000000 122.000000 155.000000 
+165.000000 144.000000 115.000000 96.000000 82.000000 63.000000 
+36.000000 13.000000 7.000000 15.000000 31.000000 27.000000 
+11.000000 37.000000 81.000000 101.000000 114.000000 124.000000 
+126.000000 126.000000 130.000000 131.000000 125.000000 119.000000 
+52.000000 49.000000 73.000000 105.000000 125.000000 128.000000 
+123.000000 126.000000 138.000000 146.000000 143.000000 133.000000 
+124.000000 118.000000 116.000000 118.000000 121.000000 126.000000 
+128.000000 124.000000 119.000000 112.000000 110.000000 119.000000 
+127.000000 126.000000 122.000000 122.000000 127.000000 128.000000 
+124.000000 121.000000 121.000000 123.000000 126.000000 128.000000 
+127.000000 118.000000 102.000000 96.000000 106.000000 118.000000 
+118.000000 111.000000 108.000000 108.000000 110.000000 116.000000 
+123.000000 127.000000 142.000000 166.000000 174.000000 160.000000 
+138.000000 121.000000 109.000000 94.000000 75.000000 54.000000 
+41.000000 46.000000 53.000000 36.000000 38.000000 87.000000 
+126.000000 132.000000 135.000000 135.000000 129.000000 130.000000 
+142.000000 144.000000 129.000000 112.000000 77.000000 61.000000 
+68.000000 93.000000 122.000000 134.000000 129.000000 128.000000 
+138.000000 146.000000 140.000000 127.000000 119.000000 119.000000 
+124.000000 128.000000 129.000000 127.000000 124.000000 126.000000 
+127.000000 119.000000 112.000000 119.000000 122.000000 117.000000 
+119.000000 131.000000 141.000000 140.000000 132.000000 125.000000 
+121.000000 118.000000 119.000000 122.000000 123.000000 122.000000 
+120.000000 120.000000 119.000000 117.000000 113.000000 111.000000 
+116.000000 123.000000 126.000000 125.000000 128.000000 137.000000 
+150.000000 161.000000 163.000000 153.000000 138.000000 126.000000 
+118.000000 108.000000 96.000000 88.000000 87.000000 83.000000 
+68.000000 62.000000 92.000000 133.000000 147.000000 140.000000 
+134.000000 134.000000 133.000000 130.000000 127.000000 126.000000 
+125.000000 124.000000 74.000000 53.000000 61.000000 86.000000 
+112.000000 124.000000 127.000000 134.000000 142.000000 143.000000 
+137.000000 131.000000 128.000000 125.000000 123.000000 124.000000 
+126.000000 125.000000 125.000000 130.000000 130.000000 120.000000 
+113.000000 117.000000 118.000000 115.000000 119.000000 128.000000 
+134.000000 137.000000 140.000000 140.000000 133.000000 126.000000 
+125.000000 130.000000 130.000000 122.000000 112.000000 110.000000 
+115.000000 118.000000 117.000000 116.000000 118.000000 120.000000 
+123.000000 122.000000 121.000000 126.000000 136.000000 142.000000 
+138.000000 131.000000 126.000000 127.000000 128.000000 121.000000 
+110.000000 108.000000 108.000000 95.000000 82.000000 102.000000 
+138.000000 153.000000 146.000000 133.000000 131.000000 137.000000 
+140.000000 131.000000 116.000000 109.000000 113.000000 120.000000 
+101.000000 61.000000 56.000000 80.000000 106.000000 125.000000 
+134.000000 137.000000 139.000000 138.000000 134.000000 128.000000 
+124.000000 122.000000 121.000000 125.000000 133.000000 138.000000 
+138.000000 135.000000 127.000000 114.000000 107.000000 113.000000 
+119.000000 121.000000 124.000000 128.000000 131.000000 132.000000 
+134.000000 138.000000 141.000000 140.000000 136.000000 134.000000 
+132.000000 129.000000 122.000000 114.000000 115.000000 122.000000 
+130.000000 132.000000 127.000000 122.000000 126.000000 127.000000 
+120.000000 118.000000 125.000000 127.000000 123.000000 123.000000 
+129.000000 134.000000 132.000000 122.000000 113.000000 108.000000 
+103.000000 98.000000 107.000000 129.000000 144.000000 144.000000 
+136.000000 130.000000 133.000000 141.000000 139.000000 131.000000 
+125.000000 123.000000 121.000000 123.000000 130.000000 84.000000 
+56.000000 69.000000 104.000000 135.000000 143.000000 135.000000 
+131.000000 136.000000 139.000000 132.000000 123.000000 119.000000 
+123.000000 130.000000 137.000000 141.000000 142.000000 138.000000 
+129.000000 118.000000 116.000000 122.000000 127.000000 129.000000 
+131.000000 135.000000 137.000000 132.000000 128.000000 129.000000 
+134.000000 136.000000 133.000000 130.000000 129.000000 129.000000 
+124.000000 116.000000 113.000000 122.000000 135.000000 140.000000 
+135.000000 129.000000 134.000000 141.000000 133.000000 118.000000 
+117.000000 118.000000 116.000000 120.000000 124.000000 118.000000 
+107.000000 104.000000 111.000000 113.000000 110.000000 113.000000 
+127.000000 136.000000 135.000000 133.000000 136.000000 139.000000 
+138.000000 134.000000 131.000000 129.000000 134.000000 140.000000 
+137.000000 125.000000 114.000000 90.000000 75.000000 80.000000 
+101.000000 120.000000 129.000000 128.000000 128.000000 132.000000 
+136.000000 132.000000 121.000000 115.000000 120.000000 131.000000 
+140.000000 145.000000 145.000000 139.000000 127.000000 118.000000 
+119.000000 123.000000 124.000000 124.000000 126.000000 126.000000 
+122.000000 117.000000 116.000000 119.000000 123.000000 128.000000 
+133.000000 135.000000 131.000000 123.000000 113.000000 108.000000 
+113.000000 123.000000 130.000000 132.000000 131.000000 133.000000 
+138.000000 142.000000 131.000000 116.000000 111.000000 109.000000 
+109.000000 116.000000 119.000000 110.000000 101.000000 109.000000 
+125.000000 132.000000 126.000000 121.000000 123.000000 129.000000 
+130.000000 131.000000 137.000000 142.000000 139.000000 132.000000 
+130.000000 132.000000 131.000000 129.000000 130.000000 127.000000 
+111.000000 91.000000 74.000000 72.000000 83.000000 102.000000 
+117.000000 120.000000 122.000000 129.000000 136.000000 137.000000 
+130.000000 123.000000 123.000000 129.000000 136.000000 139.000000 
+137.000000 129.000000 120.000000 116.000000 118.000000 120.000000 
+117.000000 116.000000 119.000000 119.000000 116.000000 112.000000 
+109.000000 110.000000 122.000000 144.000000 163.000000 160.000000 
+137.000000 112.000000 103.000000 109.000000 119.000000 126.000000 
+127.000000 127.000000 128.000000 132.000000 136.000000 135.000000 
+123.000000 110.000000 104.000000 103.000000 107.000000 115.000000 
+115.000000 110.000000 112.000000 123.000000 131.000000 129.000000 
+125.000000 123.000000 125.000000 127.000000 127.000000 129.000000 
+133.000000 136.000000 134.000000 129.000000 127.000000 127.000000 
+120.000000 105.000000 94.000000 96.000000 125.000000 104.000000 
+75.000000 66.000000 79.000000 97.000000 107.000000 113.000000 
+119.000000 125.000000 130.000000 132.000000 132.000000 130.000000 
+128.000000 129.000000 132.000000 132.000000 128.000000 121.000000 
+117.000000 119.000000 121.000000 118.000000 112.000000 107.000000 
+108.000000 117.000000 130.000000 135.000000 128.000000 120.000000 
+125.000000 148.000000 170.000000 169.000000 142.000000 115.000000 
+111.000000 125.000000 133.000000 126.000000 115.000000 115.000000 
+129.000000 143.000000 147.000000 138.000000 120.000000 106.000000 
+104.000000 110.000000 117.000000 115.000000 108.000000 108.000000 
+120.000000 133.000000 134.000000 127.000000 125.000000 132.000000 
+139.000000 137.000000 131.000000 132.000000 137.000000 140.000000 
+136.000000 129.000000 126.000000 124.000000 115.000000 95.000000 
+70.000000 59.000000 138.000000 126.000000 104.000000 89.000000 
+87.000000 94.000000 103.000000 116.000000 121.000000 117.000000 
+116.000000 125.000000 134.000000 134.000000 125.000000 117.000000 
+117.000000 120.000000 121.000000 120.000000 120.000000 123.000000 
+123.000000 119.000000 107.000000 93.000000 86.000000 97.000000 
+121.000000 140.000000 142.000000 131.000000 121.000000 124.000000 
+136.000000 144.000000 136.000000 123.000000 124.000000 137.000000 
+142.000000 135.000000 131.000000 142.000000 160.000000 165.000000 
+151.000000 130.000000 111.000000 102.000000 109.000000 119.000000 
+118.000000 111.000000 110.000000 119.000000 131.000000 137.000000 
+136.000000 133.000000 135.000000 140.000000 142.000000 136.000000 
+128.000000 129.000000 135.000000 138.000000 136.000000 134.000000 
+133.000000 125.000000 107.000000 89.000000 85.000000 91.000000 
+138.000000 141.000000 137.000000 118.000000 93.000000 85.000000 
+95.000000 106.000000 110.000000 111.000000 119.000000 130.000000 
+133.000000 129.000000 126.000000 128.000000 129.000000 122.000000 
+113.000000 113.000000 123.000000 134.000000 138.000000 131.000000 
+113.000000 95.000000 88.000000 94.000000 108.000000 123.000000 
+131.000000 128.000000 119.000000 112.000000 116.000000 127.000000 
+134.000000 132.000000 132.000000 143.000000 159.000000 170.000000 
+171.000000 165.000000 155.000000 140.000000 124.000000 113.000000 
+109.000000 108.000000 111.000000 112.000000 109.000000 111.000000 
+119.000000 127.000000 129.000000 127.000000 128.000000 136.000000 
+145.000000 147.000000 138.000000 124.000000 115.000000 116.000000 
+125.000000 131.000000 135.000000 140.000000 138.000000 117.000000 
+86.000000 77.000000 110.000000 163.000000 136.000000 146.000000 
+153.000000 138.000000 102.000000 71.000000 66.000000 80.000000 
+99.000000 117.000000 127.000000 129.000000 128.000000 127.000000 
+130.000000 138.000000 141.000000 132.000000 116.000000 109.000000 
+115.000000 128.000000 134.000000 124.000000 104.000000 91.000000 
+99.000000 128.000000 160.000000 171.000000 158.000000 133.000000 
+113.000000 108.000000 115.000000 128.000000 138.000000 142.000000 
+144.000000 154.000000 167.000000 172.000000 162.000000 145.000000 
+134.000000 128.000000 121.000000 110.000000 102.000000 101.000000 
+105.000000 108.000000 109.000000 113.000000 120.000000 125.000000 
+123.000000 119.000000 121.000000 131.000000 141.000000 140.000000 
+130.000000 118.000000 111.000000 113.000000 122.000000 130.000000 
+126.000000 111.000000 94.000000 83.000000 73.000000 76.000000 
+107.000000 157.000000 136.000000 136.000000 142.000000 141.000000 
+122.000000 87.000000 63.000000 66.000000 92.000000 119.000000 
+129.000000 128.000000 127.000000 133.000000 138.000000 137.000000 
+130.000000 120.000000 111.000000 103.000000 96.000000 88.000000 
+82.000000 80.000000 87.000000 102.000000 129.000000 164.000000 
+188.000000 187.000000 166.000000 140.000000 124.000000 123.000000 
+131.000000 138.000000 139.000000 138.000000 141.000000 147.000000 
+149.000000 144.000000 134.000000 127.000000 125.000000 123.000000 
+119.000000 111.000000 104.000000 103.000000 108.000000 115.000000 
+117.000000 121.000000 128.000000 134.000000 131.000000 120.000000 
+112.000000 115.000000 123.000000 125.000000 119.000000 115.000000 
+120.000000 128.000000 139.000000 153.000000 165.000000 154.000000 
+117.000000 81.000000 69.000000 84.000000 103.000000 115.000000 
+128.000000 129.000000 133.000000 135.000000 130.000000 117.000000 
+108.000000 111.000000 123.000000 133.000000 137.000000 129.000000 
+121.000000 123.000000 135.000000 140.000000 134.000000 122.000000 
+111.000000 102.000000 89.000000 75.000000 70.000000 81.000000 
+106.000000 133.000000 154.000000 161.000000 156.000000 146.000000 
+140.000000 138.000000 138.000000 139.000000 139.000000 136.000000 
+131.000000 129.000000 134.000000 146.000000 154.000000 146.000000 
+127.000000 112.000000 109.000000 110.000000 110.000000 112.000000 
+117.000000 120.000000 119.000000 118.000000 121.000000 129.000000 
+133.000000 127.000000 117.000000 110.000000 114.000000 124.000000 
+131.000000 132.000000 139.000000 160.000000 192.000000 226.000000 
+253.000000 266.000000 259.000000 227.000000 173.000000 118.000000 
+96.000000 105.000000 118.000000 124.000000 122.000000 131.000000 
+139.000000 139.000000 134.000000 134.000000 144.000000 162.000000 
+177.000000 175.000000 151.000000 126.000000 108.000000 95.000000 
+97.000000 109.000000 115.000000 107.000000 94.000000 83.000000 
+77.000000 77.000000 85.000000 98.000000 113.000000 126.000000 
+133.000000 137.000000 141.000000 142.000000 139.000000 135.000000 
+130.000000 125.000000 121.000000 122.000000 125.000000 127.000000 
+135.000000 153.000000 168.000000 161.000000 138.000000 119.000000 
+118.000000 125.000000 121.000000 110.000000 106.000000 108.000000 
+105.000000 102.000000 109.000000 121.000000 122.000000 109.000000 
+102.000000 114.000000 135.000000 148.000000 155.000000 179.000000 
+230.000000 286.000000 323.000000 342.000000 343.000000 311.000000 
+238.000000 151.000000 99.000000 97.000000 117.000000 127.000000 
+123.000000 119.000000 122.000000 127.000000 134.000000 138.000000 
+139.000000 143.000000 144.000000 137.000000 129.000000 128.000000 
+135.000000 149.000000 157.000000 136.000000 109.000000 95.000000 
+84.000000 65.000000 49.000000 49.000000 57.000000 59.000000 
+57.000000 59.000000 73.000000 92.000000 109.000000 126.000000 
+135.000000 135.000000 132.000000 130.000000 125.000000 118.000000 
+117.000000 125.000000 134.000000 136.000000 139.000000 149.000000 
+163.000000 167.000000 159.000000 149.000000 145.000000 146.000000 
+139.000000 123.000000 105.000000 88.000000 71.000000 61.000000 
+73.000000 99.000000 121.000000 129.000000 134.000000 140.000000 
+154.000000 184.000000 236.000000 301.000000 347.000000 350.000000 
+313.000000 264.000000 216.000000 168.000000 120.000000 83.000000 
+75.000000 92.000000 112.000000 124.000000 127.000000 127.000000 
+124.000000 121.000000 122.000000 124.000000 126.000000 133.000000 
+138.000000 122.000000 90.000000 76.000000 103.000000 155.000000 
+209.000000 241.000000 250.000000 243.000000 217.000000 167.000000 
+109.000000 69.000000 55.000000 50.000000 47.000000 52.000000 
+66.000000 89.000000 111.000000 125.000000 130.000000 132.000000 
+134.000000 132.000000 127.000000 125.000000 129.000000 133.000000 
+132.000000 132.000000 138.000000 148.000000 153.000000 152.000000 
+149.000000 148.000000 147.000000 141.000000 129.000000 111.000000 
+87.000000 58.000000 35.000000 28.000000 47.000000 86.000000 
+130.000000 157.000000 165.000000 184.000000 235.000000 313.000000 
+377.000000 381.000000 316.000000 218.000000 135.000000 90.000000 
+74.000000 68.000000 75.000000 98.000000 123.000000 135.000000 
+133.000000 126.000000 121.000000 118.000000 125.000000 122.000000 
+118.000000 117.000000 120.000000 129.000000 137.000000 137.000000 
+124.000000 104.000000 90.000000 92.000000 120.000000 185.000000 
+281.000000 364.000000 381.000000 326.000000 242.000000 168.000000 
+109.000000 64.000000 40.000000 48.000000 84.000000 124.000000 
+144.000000 142.000000 136.000000 137.000000 139.000000 133.000000 
+127.000000 131.000000 140.000000 142.000000 129.000000 117.000000 
+121.000000 134.000000 144.000000 145.000000 136.000000 118.000000 
+96.000000 75.000000 65.000000 64.000000 62.000000 59.000000 
+71.000000 114.000000 176.000000 226.000000 253.000000 268.000000 
+292.000000 339.000000 387.000000 394.000000 340.000000 236.000000 
+123.000000 50.000000 29.000000 37.000000 58.000000 86.000000 
+115.000000 135.000000 141.000000 136.000000 127.000000 119.000000 
+114.000000 112.000000 131.000000 125.000000 119.000000 117.000000 
+121.000000 130.000000 136.000000 134.000000 127.000000 117.000000 
+101.000000 78.000000 60.000000 68.000000 127.000000 227.000000 
+302.000000 328.000000 318.000000 264.000000 166.000000 75.000000 
+38.000000 58.000000 106.000000 146.000000 159.000000 153.000000 
+140.000000 133.000000 128.000000 125.000000 127.000000 133.000000 
+138.000000 135.000000 125.000000 114.000000 111.000000 119.000000 
+136.000000 151.000000 144.000000 110.000000 70.000000 43.000000 
+37.000000 41.000000 52.000000 87.000000 157.000000 260.000000 
+357.000000 399.000000 393.000000 381.000000 376.000000 349.000000 
+286.000000 201.000000 119.000000 62.000000 38.000000 50.000000 
+74.000000 89.000000 103.000000 125.000000 144.000000 145.000000 
+132.000000 122.000000 118.000000 114.000000 108.000000 109.000000 
+139.000000 134.000000 129.000000 127.000000 126.000000 123.000000 
+121.000000 127.000000 135.000000 136.000000 126.000000 113.000000 
+103.000000 84.000000 68.000000 97.000000 169.000000 247.000000 
+263.000000 194.000000 100.000000 44.000000 53.000000 94.000000 
+121.000000 136.000000 140.000000 132.000000 114.000000 99.000000 
+97.000000 108.000000 124.000000 133.000000 131.000000 125.000000 
+119.000000 113.000000 110.000000 118.000000 138.000000 153.000000 
+139.000000 102.000000 66.000000 53.000000 53.000000 56.000000 
+82.000000 150.000000 234.000000 277.000000 273.000000 255.000000 
+246.000000 233.000000 187.000000 113.000000 49.000000 25.000000 
+40.000000 67.000000 94.000000 116.000000 129.000000 132.000000 
+129.000000 129.000000 129.000000 126.000000 124.000000 125.000000 
+125.000000 121.000000 117.000000 118.000000 129.000000 129.000000 
+130.000000 128.000000 124.000000 120.000000 118.000000 123.000000 
+127.000000 127.000000 124.000000 122.000000 121.000000 112.000000 
+94.000000 84.000000 103.000000 129.000000 122.000000 82.000000 
+50.000000 41.000000 58.000000 88.000000 112.000000 118.000000 
+104.000000 86.000000 77.000000 79.000000 90.000000 106.000000 
+124.000000 137.000000 139.000000 130.000000 117.000000 106.000000 
+102.000000 113.000000 133.000000 143.000000 134.000000 106.000000 
+71.000000 50.000000 60.000000 99.000000 171.000000 245.000000 
+259.000000 187.000000 101.000000 66.000000 64.000000 66.000000 
+62.000000 59.000000 67.000000 91.000000 119.000000 130.000000 
+130.000000 129.000000 130.000000 129.000000 128.000000 127.000000 
+126.000000 127.000000 129.000000 130.000000 126.000000 119.000000 
+116.000000 120.000000 125.000000 126.000000 127.000000 127.000000 
+127.000000 126.000000 126.000000 128.000000 130.000000 131.000000 
+128.000000 124.000000 120.000000 119.000000 123.000000 128.000000 
+127.000000 115.000000 101.000000 86.000000 69.000000 61.000000 
+72.000000 95.000000 108.000000 96.000000 69.000000 50.000000 
+56.000000 77.000000 97.000000 111.000000 123.000000 134.000000 
+139.000000 131.000000 113.000000 95.000000 88.000000 95.000000 
+108.000000 118.000000 122.000000 111.000000 81.000000 51.000000 
+53.000000 90.000000 163.000000 210.000000 167.000000 81.000000 
+55.000000 69.000000 72.000000 72.000000 87.000000 110.000000 
+122.000000 125.000000 129.000000 136.000000 138.000000 132.000000 
+128.000000 132.000000 136.000000 132.000000 125.000000 126.000000 
+133.000000 133.000000 125.000000 118.000000 118.000000 121.000000 
+132.000000 130.000000 128.000000 128.000000 129.000000 131.000000 
+134.000000 133.000000 130.000000 125.000000 124.000000 126.000000 
+128.000000 130.000000 130.000000 129.000000 128.000000 122.000000 
+112.000000 101.000000 92.000000 88.000000 91.000000 92.000000 
+86.000000 71.000000 54.000000 46.000000 61.000000 87.000000 
+105.000000 112.000000 118.000000 129.000000 138.000000 137.000000 
+121.000000 98.000000 80.000000 71.000000 74.000000 86.000000 
+100.000000 101.000000 82.000000 58.000000 48.000000 50.000000 
+73.000000 97.000000 87.000000 75.000000 88.000000 103.000000 
+111.000000 121.000000 135.000000 144.000000 142.000000 131.000000 
+122.000000 122.000000 125.000000 125.000000 122.000000 122.000000 
+126.000000 130.000000 133.000000 134.000000 133.000000 130.000000 
+125.000000 122.000000 124.000000 128.000000 134.000000 130.000000 
+132.000000 132.000000 129.000000 127.000000 129.000000 130.000000 
+127.000000 121.000000 121.000000 125.000000 130.000000 130.000000 
+127.000000 125.000000 124.000000 121.000000 113.000000 103.000000 
+95.000000 87.000000 82.000000 79.000000 75.000000 66.000000 
+56.000000 54.000000 64.000000 81.000000 91.000000 96.000000 
+106.000000 119.000000 123.000000 117.000000 105.000000 92.000000 
+77.000000 58.000000 47.000000 58.000000 81.000000 92.000000 
+79.000000 60.000000 52.000000 54.000000 53.000000 53.000000 
+73.000000 104.000000 125.000000 130.000000 131.000000 135.000000 
+138.000000 137.000000 134.000000 133.000000 131.000000 126.000000 
+122.000000 121.000000 123.000000 125.000000 126.000000 129.000000 
+132.000000 133.000000 131.000000 130.000000 129.000000 127.000000 
+126.000000 127.000000 138.000000 133.000000 132.000000 133.000000 
+133.000000 133.000000 132.000000 131.000000 128.000000 126.000000 
+128.000000 130.000000 127.000000 120.000000 119.000000 126.000000 
+133.000000 130.000000 116.000000 99.000000 84.000000 74.000000 
+68.000000 68.000000 67.000000 62.000000 58.000000 60.000000 
+67.000000 72.000000 73.000000 75.000000 84.000000 93.000000 
+89.000000 77.000000 71.000000 72.000000 69.000000 55.000000 
+41.000000 44.000000 62.000000 72.000000 68.000000 64.000000 
+61.000000 60.000000 64.000000 79.000000 102.000000 123.000000 
+130.000000 126.000000 123.000000 125.000000 127.000000 126.000000 
+126.000000 129.000000 132.000000 131.000000 129.000000 128.000000 
+130.000000 131.000000 129.000000 130.000000 135.000000 139.000000 
+137.000000 130.000000 125.000000 127.000000 132.000000 133.000000 
+136.000000 133.000000 129.000000 127.000000 127.000000 129.000000 
+129.000000 128.000000 128.000000 130.000000 130.000000 130.000000 
+129.000000 127.000000 124.000000 121.000000 124.000000 129.000000 
+129.000000 117.000000 100.000000 86.000000 76.000000 67.000000 
+58.000000 52.000000 55.000000 63.000000 70.000000 70.000000 
+64.000000 60.000000 63.000000 68.000000 65.000000 57.000000 
+53.000000 58.000000 67.000000 69.000000 66.000000 62.000000 
+61.000000 63.000000 62.000000 62.000000 63.000000 67.000000 
+76.000000 93.000000 112.000000 124.000000 126.000000 122.000000 
+119.000000 118.000000 119.000000 121.000000 124.000000 126.000000 
+127.000000 125.000000 124.000000 127.000000 130.000000 131.000000 
+131.000000 133.000000 138.000000 140.000000 137.000000 133.000000 
+132.000000 134.000000 133.000000 127.000000 139.000000 138.000000 
+133.000000 130.000000 129.000000 130.000000 130.000000 129.000000 
+127.000000 124.000000 123.000000 126.000000 131.000000 131.000000 
+123.000000 116.000000 117.000000 124.000000 130.000000 128.000000 
+119.000000 109.000000 104.000000 103.000000 97.000000 81.000000 
+64.000000 57.000000 59.000000 62.000000 61.000000 58.000000 
+57.000000 58.000000 57.000000 53.000000 50.000000 52.000000 
+63.000000 80.000000 100.000000 104.000000 87.000000 64.000000 
+53.000000 58.000000 71.000000 84.000000 96.000000 109.000000 
+119.000000 123.000000 123.000000 124.000000 124.000000 122.000000 
+118.000000 117.000000 120.000000 125.000000 129.000000 130.000000 
+127.000000 124.000000 127.000000 134.000000 139.000000 137.000000 
+132.000000 129.000000 131.000000 135.000000 136.000000 134.000000 
+132.000000 128.000000 137.000000 139.000000 136.000000 133.000000 
+131.000000 129.000000 130.000000 131.000000 129.000000 126.000000 
+125.000000 126.000000 125.000000 122.000000 122.000000 127.000000 
+132.000000 133.000000 133.000000 140.000000 150.000000 147.000000 
+123.000000 93.000000 69.000000 53.000000 49.000000 54.000000 
+60.000000 66.000000 66.000000 60.000000 55.000000 53.000000 
+54.000000 53.000000 49.000000 46.000000 55.000000 76.000000 
+96.000000 98.000000 79.000000 59.000000 56.000000 73.000000 
+93.000000 106.000000 114.000000 121.000000 125.000000 125.000000 
+125.000000 129.000000 132.000000 130.000000 124.000000 122.000000 
+122.000000 124.000000 125.000000 128.000000 129.000000 128.000000 
+127.000000 130.000000 135.000000 134.000000 128.000000 123.000000 
+123.000000 124.000000 126.000000 128.000000 131.000000 132.000000 
+125.000000 130.000000 131.000000 130.000000 130.000000 132.000000 
+132.000000 128.000000 125.000000 124.000000 124.000000 121.000000 
+120.000000 123.000000 128.000000 132.000000 131.000000 131.000000 
+135.000000 140.000000 138.000000 126.000000 109.000000 90.000000 
+73.000000 62.000000 56.000000 56.000000 59.000000 63.000000 
+65.000000 64.000000 59.000000 53.000000 51.000000 55.000000 
+58.000000 54.000000 49.000000 49.000000 54.000000 56.000000 
+52.000000 51.000000 67.000000 98.000000 128.000000 142.000000 
+138.000000 129.000000 123.000000 122.000000 122.000000 123.000000 
+124.000000 122.000000 120.000000 120.000000 122.000000 127.000000 
+129.000000 127.000000 123.000000 122.000000 126.000000 133.000000 
+136.000000 133.000000 128.000000 125.000000 125.000000 124.000000 
+123.000000 125.000000 128.000000 130.000000 103.000000 120.000000 
+133.000000 135.000000 133.000000 131.000000 130.000000 128.000000 
+125.000000 126.000000 129.000000 130.000000 129.000000 130.000000 
+134.000000 137.000000 139.000000 140.000000 140.000000 133.000000 
+118.000000 102.000000 95.000000 98.000000 94.000000 83.000000 
+71.000000 64.000000 66.000000 73.000000 76.000000 68.000000 
+55.000000 49.000000 55.000000 63.000000 62.000000 53.000000 
+46.000000 49.000000 55.000000 55.000000 51.000000 61.000000 
+90.000000 119.000000 134.000000 135.000000 131.000000 129.000000 
+128.000000 126.000000 122.000000 120.000000 119.000000 119.000000 
+119.000000 119.000000 119.000000 122.000000 128.000000 131.000000 
+132.000000 131.000000 129.000000 127.000000 123.000000 119.000000 
+118.000000 120.000000 122.000000 122.000000 122.000000 125.000000 
+130.000000 133.000000 99.000000 101.000000 114.000000 128.000000 
+134.000000 132.000000 127.000000 129.000000 133.000000 134.000000 
+133.000000 136.000000 141.000000 143.000000 139.000000 135.000000 
+132.000000 127.000000 121.000000 119.000000 115.000000 102.000000 
+91.000000 99.000000 123.000000 147.000000 144.000000 118.000000 
+92.000000 81.000000 73.000000 59.000000 44.000000 39.000000 
+49.000000 56.000000 58.000000 66.000000 89.000000 121.000000 
+138.000000 126.000000 105.000000 98.000000 112.000000 134.000000 
+141.000000 136.000000 133.000000 135.000000 135.000000 127.000000 
+120.000000 122.000000 128.000000 128.000000 123.000000 119.000000 
+121.000000 129.000000 136.000000 141.000000 141.000000 136.000000 
+129.000000 122.000000 118.000000 119.000000 123.000000 125.000000 
+122.000000 117.000000 115.000000 120.000000 130.000000 136.000000 
+116.000000 119.000000 118.000000 121.000000 125.000000 126.000000 
+123.000000 121.000000 125.000000 131.000000 135.000000 137.000000 
+139.000000 141.000000 142.000000 140.000000 133.000000 124.000000 
+120.000000 128.000000 144.000000 161.000000 179.000000 217.000000 
+265.000000 288.000000 255.000000 184.000000 119.000000 84.000000 
+69.000000 63.000000 59.000000 57.000000 61.000000 61.000000 
+67.000000 98.000000 165.000000 239.000000 279.000000 265.000000 
+215.000000 153.000000 106.000000 90.000000 101.000000 122.000000 
+140.000000 143.000000 133.000000 122.000000 121.000000 127.000000 
+131.000000 125.000000 117.000000 117.000000 124.000000 128.000000 
+126.000000 123.000000 122.000000 121.000000 121.000000 123.000000 
+129.000000 136.000000 135.000000 131.000000 127.000000 128.000000 
+131.000000 131.000000 126.000000 123.000000 139.000000 144.000000 
+140.000000 135.000000 131.000000 130.000000 128.000000 125.000000 
+125.000000 131.000000 137.000000 136.000000 133.000000 134.000000 
+142.000000 147.000000 141.000000 127.000000 121.000000 137.000000 
+178.000000 239.000000 305.000000 353.000000 361.000000 325.000000 
+257.000000 177.000000 107.000000 75.000000 74.000000 79.000000 
+71.000000 56.000000 53.000000 70.000000 96.000000 125.000000 
+183.000000 273.000000 350.000000 372.000000 334.000000 262.000000 
+187.000000 129.000000 103.000000 105.000000 121.000000 136.000000 
+142.000000 142.000000 141.000000 138.000000 131.000000 121.000000 
+115.000000 117.000000 124.000000 133.000000 137.000000 137.000000 
+136.000000 138.000000 142.000000 141.000000 132.000000 119.000000 
+112.000000 118.000000 131.000000 142.000000 143.000000 134.000000 
+124.000000 122.000000 132.000000 141.000000 139.000000 127.000000 
+118.000000 118.000000 124.000000 128.000000 129.000000 131.000000 
+135.000000 139.000000 142.000000 145.000000 146.000000 141.000000 
+127.000000 118.000000 144.000000 212.000000 286.000000 333.000000 
+342.000000 326.000000 305.000000 284.000000 246.000000 184.000000 
+117.000000 71.000000 58.000000 66.000000 60.000000 43.000000 
+36.000000 49.000000 78.000000 107.000000 152.000000 232.000000 
+306.000000 335.000000 322.000000 287.000000 237.000000 182.000000 
+138.000000 112.000000 99.000000 103.000000 120.000000 133.000000 
+137.000000 136.000000 135.000000 134.000000 130.000000 127.000000 
+131.000000 140.000000 146.000000 141.000000 134.000000 136.000000 
+141.000000 137.000000 124.000000 116.000000 121.000000 131.000000 
+133.000000 131.000000 131.000000 134.000000 134.000000 129.000000 
+134.000000 140.000000 138.000000 128.000000 118.000000 114.000000 
+118.000000 126.000000 137.000000 145.000000 145.000000 136.000000 
+131.000000 135.000000 137.000000 126.000000 115.000000 141.000000 
+222.000000 295.000000 311.000000 268.000000 196.000000 131.000000 
+102.000000 106.000000 107.000000 97.000000 92.000000 100.000000 
+99.000000 82.000000 59.000000 42.000000 42.000000 50.000000 
+60.000000 72.000000 75.000000 56.000000 33.000000 32.000000 
+58.000000 96.000000 129.000000 143.000000 143.000000 140.000000 
+117.000000 77.000000 64.000000 87.000000 121.000000 142.000000 
+147.000000 143.000000 139.000000 136.000000 134.000000 134.000000 
+134.000000 131.000000 128.000000 129.000000 132.000000 134.000000 
+133.000000 129.000000 122.000000 113.000000 111.000000 121.000000 
+136.000000 142.000000 134.000000 123.000000 131.000000 128.000000 
+123.000000 121.000000 128.000000 133.000000 130.000000 126.000000 
+129.000000 137.000000 144.000000 144.000000 139.000000 124.000000 
+103.000000 96.000000 131.000000 187.000000 219.000000 199.000000 
+139.000000 81.000000 80.000000 119.000000 141.000000 144.000000 
+139.000000 131.000000 123.000000 120.000000 122.000000 121.000000 
+108.000000 85.000000 65.000000 51.000000 56.000000 87.000000 
+116.000000 131.000000 133.000000 133.000000 132.000000 114.000000 
+93.000000 109.000000 162.000000 206.000000 199.000000 141.000000 
+66.000000 57.000000 109.000000 150.000000 155.000000 144.000000 
+138.000000 135.000000 133.000000 131.000000 131.000000 129.000000 
+127.000000 132.000000 143.000000 144.000000 127.000000 101.000000 
+81.000000 84.000000 110.000000 130.000000 133.000000 125.000000 
+121.000000 125.000000 127.000000 120.000000 122.000000 132.000000 
+136.000000 134.000000 133.000000 135.000000 134.000000 128.000000 
+125.000000 127.000000 125.000000 115.000000 111.000000 125.000000 
+141.000000 142.000000 121.000000 96.000000 96.000000 114.000000 
+124.000000 122.000000 121.000000 125.000000 131.000000 133.000000 
+132.000000 135.000000 140.000000 137.000000 114.000000 81.000000 
+58.000000 65.000000 101.000000 133.000000 142.000000 130.000000 
+118.000000 121.000000 133.000000 134.000000 115.000000 102.000000 
+130.000000 179.000000 213.000000 215.000000 172.000000 97.000000 
+88.000000 128.000000 144.000000 134.000000 127.000000 132.000000 
+134.000000 128.000000 122.000000 122.000000 122.000000 124.000000 
+133.000000 139.000000 126.000000 97.000000 81.000000 91.000000 
+114.000000 130.000000 134.000000 135.000000 134.000000 126.000000 
+131.000000 131.000000 131.000000 128.000000 128.000000 133.000000 
+139.000000 136.000000 127.000000 123.000000 129.000000 134.000000 
+132.000000 126.000000 127.000000 129.000000 125.000000 119.000000 
+120.000000 127.000000 129.000000 121.000000 118.000000 126.000000 
+135.000000 132.000000 123.000000 121.000000 126.000000 134.000000 
+137.000000 128.000000 107.000000 83.000000 78.000000 99.000000 
+126.000000 140.000000 137.000000 130.000000 127.000000 122.000000 
+120.000000 126.000000 130.000000 122.000000 118.000000 145.000000 
+192.000000 233.000000 236.000000 182.000000 126.000000 126.000000 
+139.000000 129.000000 119.000000 129.000000 142.000000 137.000000 
+125.000000 124.000000 132.000000 137.000000 134.000000 134.000000 
+134.000000 123.000000 103.000000 88.000000 93.000000 111.000000 
+129.000000 135.000000 131.000000 124.000000 132.000000 130.000000 
+129.000000 132.000000 137.000000 141.000000 138.000000 132.000000 
+126.000000 123.000000 124.000000 127.000000 130.000000 132.000000 
+133.000000 131.000000 128.000000 127.000000 129.000000 130.000000 
+128.000000 124.000000 124.000000 127.000000 126.000000 124.000000 
+126.000000 131.000000 133.000000 132.000000 129.000000 124.000000 
+116.000000 103.000000 96.000000 107.000000 128.000000 141.000000 
+138.000000 130.000000 126.000000 123.000000 121.000000 124.000000 
+131.000000 131.000000 122.000000 123.000000 143.000000 183.000000 
+225.000000 228.000000 184.000000 147.000000 136.000000 132.000000 
+131.000000 138.000000 144.000000 137.000000 127.000000 122.000000 
+125.000000 125.000000 122.000000 124.000000 134.000000 139.000000 
+126.000000 105.000000 97.000000 107.000000 121.000000 130.000000 
+130.000000 127.000000 129.000000 129.000000 134.000000 136.000000 
+132.000000 127.000000 124.000000 127.000000 129.000000 128.000000 
+124.000000 122.000000 125.000000 130.000000 134.000000 133.000000 
+130.000000 129.000000 129.000000 132.000000 133.000000 131.000000 
+126.000000 121.000000 119.000000 125.000000 135.000000 141.000000 
+139.000000 132.000000 126.000000 123.000000 119.000000 114.000000 
+114.000000 121.000000 131.000000 137.000000 136.000000 130.000000 
+126.000000 124.000000 125.000000 127.000000 130.000000 135.000000 
+135.000000 128.000000 120.000000 130.000000 172.000000 211.000000 
+208.000000 177.000000 148.000000 132.000000 129.000000 130.000000 
+131.000000 132.000000 134.000000 134.000000 130.000000 127.000000 
+128.000000 130.000000 130.000000 124.000000 114.000000 106.000000 
+106.000000 111.000000 116.000000 119.000000 122.000000 127.000000 
+126.000000 125.000000 131.000000 136.000000 134.000000 128.000000 
+125.000000 125.000000 124.000000 121.000000 119.000000 123.000000 
+132.000000 140.000000 142.000000 136.000000 128.000000 127.000000 
+130.000000 133.000000 130.000000 125.000000 121.000000 122.000000 
+126.000000 130.000000 131.000000 128.000000 124.000000 119.000000 
+115.000000 112.000000 111.000000 114.000000 120.000000 126.000000 
+130.000000 132.000000 131.000000 126.000000 124.000000 127.000000 
+131.000000 131.000000 128.000000 131.000000 140.000000 139.000000 
+119.000000 104.000000 129.000000 175.000000 199.000000 189.000000 
+162.000000 141.000000 135.000000 134.000000 131.000000 129.000000 
+134.000000 140.000000 140.000000 134.000000 128.000000 127.000000 
+130.000000 134.000000 135.000000 129.000000 117.000000 104.000000 
+96.000000 99.000000 108.000000 119.000000 133.000000 131.000000 
+128.000000 127.000000 128.000000 131.000000 132.000000 128.000000 
+121.000000 116.000000 116.000000 121.000000 130.000000 138.000000 
+140.000000 135.000000 131.000000 131.000000 132.000000 134.000000 
+134.000000 132.000000 127.000000 122.000000 120.000000 122.000000 
+124.000000 123.000000 122.000000 121.000000 117.000000 109.000000 
+103.000000 106.000000 118.000000 129.000000 132.000000 130.000000 
+128.000000 130.000000 132.000000 133.000000 132.000000 129.000000 
+130.000000 135.000000 140.000000 134.000000 115.000000 102.000000 
+116.000000 145.000000 165.000000 164.000000 146.000000 132.000000 
+129.000000 131.000000 128.000000 125.000000 128.000000 135.000000 
+137.000000 133.000000 130.000000 131.000000 134.000000 134.000000 
+131.000000 126.000000 121.000000 113.000000 108.000000 110.000000 
+115.000000 118.000000 133.000000 123.000000 110.000000 107.000000 
+116.000000 126.000000 130.000000 128.000000 126.000000 125.000000 
+125.000000 124.000000 124.000000 126.000000 129.000000 131.000000 
+132.000000 134.000000 137.000000 140.000000 141.000000 135.000000 
+127.000000 124.000000 130.000000 137.000000 139.000000 134.000000 
+128.000000 123.000000 118.000000 115.000000 118.000000 129.000000 
+138.000000 138.000000 132.000000 128.000000 128.000000 129.000000 
+130.000000 130.000000 130.000000 128.000000 126.000000 131.000000 
+140.000000 141.000000 129.000000 116.000000 119.000000 134.000000 
+146.000000 143.000000 130.000000 122.000000 125.000000 130.000000 
+131.000000 129.000000 127.000000 124.000000 121.000000 123.000000 
+130.000000 135.000000 133.000000 126.000000 124.000000 127.000000 
+127.000000 118.000000 107.000000 104.000000 110.000000 120.000000 
+131.000000 121.000000 109.000000 107.000000 116.000000 126.000000 
+128.000000 125.000000 123.000000 127.000000 130.000000 129.000000 
+127.000000 127.000000 128.000000 130.000000 133.000000 137.000000 
+137.000000 135.000000 134.000000 133.000000 132.000000 130.000000 
+132.000000 136.000000 137.000000 132.000000 125.000000 126.000000 
+131.000000 134.000000 135.000000 136.000000 135.000000 132.000000 
+127.000000 125.000000 127.000000 131.000000 134.000000 135.000000 
+133.000000 128.000000 125.000000 128.000000 134.000000 135.000000 
+129.000000 124.000000 129.000000 139.000000 140.000000 130.000000 
+123.000000 127.000000 134.000000 136.000000 133.000000 132.000000 
+135.000000 137.000000 134.000000 129.000000 128.000000 130.000000 
+131.000000 129.000000 128.000000 129.000000 126.000000 119.000000 
+111.000000 110.000000 117.000000 125.000000 121.000000 117.000000 
+107.000000 100.000000 104.000000 114.000000 121.000000 122.000000 
+124.000000 129.000000 132.000000 131.000000 130.000000 131.000000 
+132.000000 131.000000 132.000000 136.000000 140.000000 140.000000 
+137.000000 135.000000 136.000000 135.000000 133.000000 131.000000 
+129.000000 125.000000 123.000000 126.000000 131.000000 133.000000 
+131.000000 134.000000 140.000000 146.000000 144.000000 139.000000 
+137.000000 139.000000 141.000000 141.000000 138.000000 134.000000 
+133.000000 135.000000 138.000000 136.000000 132.000000 132.000000 
+134.000000 133.000000 124.000000 116.000000 118.000000 127.000000 
+132.000000 131.000000 131.000000 133.000000 133.000000 128.000000 
+123.000000 125.000000 130.000000 130.000000 126.000000 124.000000 
+127.000000 130.000000 127.000000 124.000000 122.000000 124.000000 
+126.000000 125.000000 120.000000 118.000000 117.000000 117.000000 
+114.000000 109.000000 106.000000 108.000000 113.000000 119.000000 
+127.000000 133.000000 135.000000 132.000000 128.000000 127.000000 
+130.000000 131.000000 129.000000 129.000000 132.000000 136.000000 
+135.000000 132.000000 128.000000 127.000000 127.000000 127.000000 
+128.000000 130.000000 132.000000 133.000000 132.000000 130.000000 
+129.000000 130.000000 130.000000 131.000000 131.000000 132.000000 
+135.000000 138.000000 138.000000 133.000000 129.000000 129.000000 
+132.000000 133.000000 134.000000 138.000000 143.000000 140.000000 
+127.000000 117.000000 119.000000 129.000000 134.000000 134.000000 
+135.000000 138.000000 137.000000 128.000000 120.000000 121.000000 
+125.000000 125.000000 121.000000 120.000000 124.000000 128.000000 
+128.000000 125.000000 125.000000 127.000000 126.000000 122.000000 
+122.000000 122.000000 123.000000 125.000000 125.000000 116.000000 
+105.000000 100.000000 108.000000 121.000000 131.000000 137.000000 
+139.000000 137.000000 132.000000 127.000000 125.000000 127.000000 
+130.000000 137.000000 143.000000 142.000000 135.000000 128.000000 
+127.000000 129.000000 129.000000 126.000000 124.000000 126.000000 
+128.000000 126.000000 125.000000 127.000000 130.000000 133.000000 
+134.000000 133.000000 131.000000 129.000000 130.000000 134.000000 
+135.000000 130.000000 125.000000 127.000000 135.000000 139.000000 
+137.000000 137.000000 141.000000 143.000000 136.000000 124.000000 
+120.000000 127.000000 134.000000 135.000000 131.000000 130.000000 
+131.000000 131.000000 129.000000 127.000000 126.000000 125.000000 
+124.000000 124.000000 126.000000 128.000000 126.000000 125.000000 
+127.000000 131.000000 131.000000 127.000000 60.000000 123.000000 
+189.000000 206.000000 175.000000 135.000000 121.000000 125.000000 
+123.000000 115.000000 116.000000 122.000000 122.000000 114.000000 
+114.000000 126.000000 135.000000 129.000000 111.000000 103.000000 
+113.000000 122.000000 118.000000 113.000000 113.000000 115.000000 
+116.000000 117.000000 122.000000 126.000000 129.000000 131.000000 
+133.000000 132.000000 127.000000 120.000000 117.000000 118.000000 
+121.000000 122.000000 125.000000 128.000000 127.000000 125.000000 
+126.000000 132.000000 136.000000 135.000000 129.000000 123.000000 
+127.000000 143.000000 152.000000 145.000000 130.000000 120.000000 
+114.000000 107.000000 94.000000 73.000000 45.000000 19.000000 
+8.000000 11.000000 17.000000 11.000000 15.000000 45.000000 
+69.000000 73.000000 78.000000 91.000000 100.000000 102.000000 
+98.000000 88.000000 38.000000 59.000000 113.000000 159.000000 
+168.000000 142.000000 117.000000 118.000000 132.000000 134.000000 
+124.000000 117.000000 116.000000 117.000000 118.000000 123.000000 
+127.000000 122.000000 112.000000 117.000000 128.000000 123.000000 
+112.000000 109.000000 113.000000 115.000000 117.000000 122.000000 
+128.000000 129.000000 128.000000 130.000000 134.000000 136.000000 
+134.000000 129.000000 127.000000 134.000000 146.000000 149.000000 
+140.000000 130.000000 126.000000 126.000000 125.000000 126.000000 
+130.000000 135.000000 136.000000 135.000000 139.000000 147.000000 
+150.000000 144.000000 131.000000 118.000000 108.000000 98.000000 
+86.000000 74.000000 60.000000 46.000000 39.000000 48.000000 
+57.000000 20.000000 16.000000 78.000000 115.000000 110.000000 
+100.000000 104.000000 113.000000 122.000000 130.000000 129.000000 
+56.000000 41.000000 77.000000 131.000000 159.000000 148.000000 
+126.000000 118.000000 128.000000 136.000000 127.000000 114.000000 
+110.000000 116.000000 123.000000 124.000000 118.000000 112.000000 
+112.000000 120.000000 126.000000 124.000000 118.000000 114.000000 
+113.000000 116.000000 120.000000 124.000000 126.000000 127.000000 
+129.000000 131.000000 135.000000 139.000000 143.000000 141.000000 
+133.000000 128.000000 134.000000 142.000000 140.000000 130.000000 
+124.000000 124.000000 123.000000 121.000000 121.000000 129.000000 
+139.000000 144.000000 145.000000 146.000000 145.000000 140.000000 
+135.000000 131.000000 125.000000 113.000000 99.000000 86.000000 
+76.000000 66.000000 64.000000 70.000000 60.000000 37.000000 
+70.000000 134.000000 153.000000 135.000000 119.000000 122.000000 
+136.000000 143.000000 138.000000 128.000000 31.000000 31.000000 
+72.000000 121.000000 150.000000 154.000000 144.000000 131.000000 
+128.000000 134.000000 133.000000 123.000000 116.000000 118.000000 
+120.000000 118.000000 116.000000 119.000000 124.000000 130.000000 
+136.000000 134.000000 121.000000 113.000000 117.000000 121.000000 
+124.000000 128.000000 133.000000 133.000000 131.000000 132.000000 
+136.000000 139.000000 139.000000 136.000000 132.000000 127.000000 
+121.000000 117.000000 116.000000 116.000000 117.000000 120.000000 
+125.000000 129.000000 129.000000 128.000000 136.000000 146.000000 
+145.000000 135.000000 128.000000 127.000000 127.000000 125.000000 
+123.000000 122.000000 116.000000 102.000000 88.000000 78.000000 
+75.000000 69.000000 63.000000 89.000000 137.000000 160.000000 
+149.000000 130.000000 123.000000 131.000000 143.000000 143.000000 
+126.000000 107.000000 63.000000 47.000000 60.000000 91.000000 
+124.000000 143.000000 144.000000 137.000000 133.000000 133.000000 
+133.000000 129.000000 124.000000 122.000000 124.000000 128.000000 
+132.000000 128.000000 123.000000 128.000000 137.000000 130.000000 
+114.000000 112.000000 120.000000 124.000000 127.000000 133.000000 
+136.000000 133.000000 132.000000 134.000000 137.000000 139.000000 
+140.000000 140.000000 135.000000 127.000000 120.000000 117.000000 
+120.000000 124.000000 122.000000 119.000000 120.000000 126.000000 
+132.000000 133.000000 139.000000 147.000000 141.000000 121.000000 
+106.000000 109.000000 119.000000 122.000000 119.000000 118.000000 
+120.000000 122.000000 117.000000 101.000000 81.000000 75.000000 
+95.000000 131.000000 153.000000 150.000000 136.000000 128.000000 
+131.000000 135.000000 133.000000 128.000000 123.000000 121.000000 
+132.000000 64.000000 44.000000 72.000000 106.000000 123.000000 
+127.000000 128.000000 131.000000 136.000000 143.000000 144.000000 
+136.000000 124.000000 120.000000 127.000000 135.000000 136.000000 
+133.000000 137.000000 139.000000 131.000000 121.000000 119.000000 
+121.000000 124.000000 125.000000 124.000000 122.000000 125.000000 
+128.000000 131.000000 131.000000 134.000000 136.000000 132.000000 
+124.000000 117.000000 117.000000 122.000000 126.000000 128.000000 
+126.000000 124.000000 125.000000 130.000000 136.000000 136.000000 
+138.000000 142.000000 135.000000 117.000000 105.000000 113.000000 
+127.000000 132.000000 127.000000 123.000000 125.000000 127.000000 
+123.000000 110.000000 101.000000 104.000000 118.000000 131.000000 
+135.000000 132.000000 130.000000 136.000000 143.000000 140.000000 
+129.000000 124.000000 131.000000 138.000000 201.000000 119.000000 
+61.000000 53.000000 75.000000 102.000000 115.000000 124.000000 
+134.000000 139.000000 138.000000 135.000000 132.000000 128.000000 
+128.000000 133.000000 139.000000 141.000000 140.000000 142.000000 
+143.000000 137.000000 127.000000 119.000000 120.000000 123.000000 
+123.000000 122.000000 125.000000 130.000000 132.000000 130.000000 
+128.000000 129.000000 129.000000 125.000000 119.000000 115.000000 
+115.000000 116.000000 118.000000 120.000000 123.000000 125.000000 
+126.000000 131.000000 139.000000 144.000000 141.000000 137.000000 
+131.000000 123.000000 122.000000 128.000000 134.000000 133.000000 
+125.000000 117.000000 111.000000 106.000000 106.000000 114.000000 
+125.000000 131.000000 130.000000 128.000000 131.000000 134.000000 
+135.000000 135.000000 135.000000 132.000000 129.000000 129.000000 
+134.000000 137.000000 182.000000 144.000000 97.000000 67.000000 
+68.000000 89.000000 110.000000 126.000000 139.000000 143.000000 
+139.000000 132.000000 129.000000 129.000000 131.000000 133.000000 
+137.000000 139.000000 136.000000 132.000000 130.000000 128.000000 
+124.000000 118.000000 112.000000 110.000000 114.000000 123.000000 
+133.000000 138.000000 138.000000 134.000000 129.000000 127.000000 
+129.000000 135.000000 138.000000 131.000000 118.000000 115.000000 
+123.000000 132.000000 131.000000 123.000000 122.000000 130.000000 
+141.000000 147.000000 141.000000 127.000000 114.000000 110.000000 
+119.000000 131.000000 136.000000 127.000000 114.000000 106.000000 
+108.000000 112.000000 115.000000 118.000000 124.000000 130.000000 
+135.000000 137.000000 140.000000 143.000000 142.000000 134.000000 
+127.000000 127.000000 133.000000 136.000000 131.000000 123.000000 
+104.000000 100.000000 88.000000 77.000000 78.000000 93.000000 
+111.000000 123.000000 129.000000 137.000000 144.000000 143.000000 
+132.000000 123.000000 121.000000 126.000000 133.000000 138.000000 
+137.000000 130.000000 125.000000 122.000000 120.000000 116.000000 
+110.000000 110.000000 115.000000 122.000000 127.000000 127.000000 
+122.000000 118.000000 121.000000 128.000000 133.000000 135.000000 
+137.000000 135.000000 123.000000 111.000000 114.000000 128.000000 
+137.000000 133.000000 130.000000 134.000000 138.000000 136.000000 
+130.000000 123.000000 115.000000 113.000000 118.000000 123.000000 
+121.000000 114.000000 111.000000 114.000000 122.000000 127.000000 
+123.000000 115.000000 112.000000 120.000000 135.000000 146.000000 
+149.000000 145.000000 137.000000 131.000000 130.000000 136.000000 
+143.000000 142.000000 134.000000 125.000000 78.000000 67.000000 
+62.000000 65.000000 78.000000 99.000000 118.000000 124.000000 
+122.000000 122.000000 131.000000 140.000000 140.000000 131.000000 
+124.000000 124.000000 129.000000 131.000000 128.000000 124.000000 
+123.000000 122.000000 119.000000 114.000000 114.000000 116.000000 
+116.000000 113.000000 113.000000 115.000000 116.000000 119.000000 
+127.000000 143.000000 154.000000 152.000000 139.000000 126.000000 
+117.000000 110.000000 110.000000 120.000000 133.000000 136.000000 
+132.000000 131.000000 134.000000 132.000000 127.000000 126.000000 
+127.000000 125.000000 122.000000 119.000000 116.000000 114.000000 
+117.000000 122.000000 125.000000 125.000000 122.000000 117.000000 
+115.000000 123.000000 138.000000 151.000000 151.000000 142.000000 
+134.000000 131.000000 133.000000 135.000000 133.000000 126.000000 
+112.000000 97.000000 84.000000 62.000000 54.000000 62.000000 
+80.000000 100.000000 112.000000 115.000000 116.000000 121.000000 
+130.000000 138.000000 140.000000 134.000000 124.000000 117.000000 
+117.000000 121.000000 127.000000 132.000000 135.000000 135.000000 
+132.000000 129.000000 125.000000 118.000000 109.000000 105.000000 
+109.000000 121.000000 130.000000 129.000000 126.000000 134.000000 
+151.000000 155.000000 135.000000 113.000000 111.000000 122.000000 
+130.000000 130.000000 128.000000 127.000000 124.000000 124.000000 
+131.000000 137.000000 132.000000 124.000000 121.000000 120.000000 
+120.000000 121.000000 121.000000 117.000000 117.000000 125.000000 
+136.000000 138.000000 131.000000 124.000000 122.000000 126.000000 
+133.000000 140.000000 141.000000 138.000000 136.000000 140.000000 
+144.000000 138.000000 121.000000 97.000000 74.000000 55.000000 
+114.000000 89.000000 63.000000 60.000000 80.000000 97.000000 
+107.000000 113.000000 118.000000 123.000000 129.000000 131.000000 
+133.000000 133.000000 130.000000 124.000000 115.000000 110.000000 
+112.000000 119.000000 127.000000 134.000000 139.000000 136.000000 
+126.000000 118.000000 119.000000 123.000000 123.000000 122.000000 
+124.000000 125.000000 121.000000 116.000000 112.000000 106.000000 
+100.000000 106.000000 125.000000 137.000000 132.000000 122.000000 
+121.000000 131.000000 137.000000 131.000000 129.000000 137.000000 
+136.000000 120.000000 107.000000 107.000000 114.000000 118.000000 
+115.000000 114.000000 122.000000 135.000000 140.000000 135.000000 
+126.000000 124.000000 126.000000 126.000000 126.000000 132.000000 
+138.000000 138.000000 132.000000 131.000000 135.000000 131.000000 
+114.000000 93.000000 81.000000 77.000000 138.000000 128.000000 
+104.000000 79.000000 79.000000 99.000000 116.000000 127.000000 
+126.000000 116.000000 115.000000 123.000000 130.000000 134.000000 
+134.000000 128.000000 116.000000 105.000000 102.000000 109.000000 
+119.000000 128.000000 133.000000 132.000000 127.000000 127.000000 
+132.000000 130.000000 122.000000 123.000000 128.000000 124.000000 
+109.000000 84.000000 65.000000 69.000000 80.000000 97.000000 
+119.000000 137.000000 150.000000 154.000000 146.000000 141.000000 
+141.000000 139.000000 135.000000 132.000000 125.000000 109.000000 
+96.000000 100.000000 113.000000 119.000000 114.000000 114.000000 
+121.000000 126.000000 124.000000 121.000000 123.000000 131.000000 
+138.000000 139.000000 135.000000 133.000000 137.000000 139.000000 
+131.000000 123.000000 124.000000 125.000000 110.000000 88.000000 
+85.000000 105.000000 138.000000 147.000000 145.000000 113.000000 
+83.000000 95.000000 127.000000 146.000000 144.000000 126.000000 
+111.000000 114.000000 128.000000 135.000000 132.000000 126.000000 
+122.000000 121.000000 123.000000 126.000000 130.000000 134.000000 
+136.000000 135.000000 127.000000 111.000000 88.000000 76.000000 
+91.000000 119.000000 127.000000 106.000000 81.000000 64.000000 
+67.000000 84.000000 94.000000 100.000000 113.000000 136.000000 
+162.000000 173.000000 158.000000 135.000000 124.000000 128.000000 
+134.000000 131.000000 121.000000 108.000000 99.000000 100.000000 
+108.000000 114.000000 117.000000 122.000000 124.000000 118.000000 
+109.000000 112.000000 127.000000 137.000000 139.000000 138.000000 
+136.000000 128.000000 116.000000 114.000000 129.000000 147.000000 
+143.000000 111.000000 73.000000 52.000000 59.000000 114.000000 
+135.000000 147.000000 156.000000 139.000000 101.000000 89.000000 
+134.000000 193.000000 211.000000 178.000000 123.000000 92.000000 
+103.000000 129.000000 143.000000 141.000000 137.000000 134.000000 
+129.000000 124.000000 126.000000 133.000000 134.000000 124.000000 
+107.000000 87.000000 73.000000 79.000000 105.000000 122.000000 
+111.000000 90.000000 80.000000 89.000000 104.000000 113.000000 
+118.000000 127.000000 137.000000 142.000000 141.000000 137.000000 
+133.000000 126.000000 123.000000 126.000000 128.000000 124.000000 
+115.000000 110.000000 111.000000 114.000000 116.000000 119.000000 
+123.000000 126.000000 123.000000 115.000000 109.000000 115.000000 
+128.000000 135.000000 129.000000 120.000000 116.000000 118.000000 
+135.000000 173.000000 234.000000 285.000000 273.000000 193.000000 
+121.000000 91.000000 82.000000 106.000000 132.000000 133.000000 
+137.000000 144.000000 131.000000 92.000000 85.000000 152.000000 
+246.000000 282.000000 239.000000 163.000000 112.000000 107.000000 
+124.000000 136.000000 138.000000 135.000000 131.000000 124.000000 
+116.000000 110.000000 107.000000 103.000000 96.000000 88.000000 
+87.000000 95.000000 107.000000 114.000000 113.000000 112.000000 
+116.000000 122.000000 127.000000 131.000000 135.000000 140.000000 
+144.000000 142.000000 134.000000 124.000000 119.000000 118.000000 
+121.000000 127.000000 126.000000 117.000000 108.000000 108.000000 
+117.000000 128.000000 133.000000 134.000000 132.000000 123.000000 
+114.000000 112.000000 120.000000 125.000000 121.000000 112.000000 
+113.000000 124.000000 137.000000 167.000000 224.000000 289.000000 
+333.000000 333.000000 286.000000 218.000000 167.000000 137.000000 
+116.000000 104.000000 132.000000 131.000000 132.000000 136.000000 
+127.000000 99.000000 74.000000 98.000000 206.000000 329.000000 
+362.000000 298.000000 207.000000 140.000000 109.000000 105.000000 
+113.000000 122.000000 125.000000 123.000000 115.000000 106.000000 
+100.000000 97.000000 88.000000 72.000000 64.000000 71.000000 
+87.000000 105.000000 123.000000 137.000000 143.000000 138.000000 
+128.000000 123.000000 124.000000 130.000000 141.000000 152.000000 
+149.000000 130.000000 110.000000 103.000000 112.000000 126.000000 
+131.000000 129.000000 123.000000 117.000000 114.000000 113.000000 
+117.000000 126.000000 135.000000 134.000000 125.000000 113.000000 
+106.000000 114.000000 135.000000 159.000000 188.000000 211.000000 
+221.000000 232.000000 250.000000 258.000000 232.000000 173.000000 
+110.000000 77.000000 79.000000 99.000000 121.000000 131.000000 
+132.000000 139.000000 145.000000 138.000000 120.000000 109.000000 
+110.000000 103.000000 123.000000 192.000000 264.000000 312.000000 
+318.000000 272.000000 193.000000 128.000000 99.000000 92.000000 
+89.000000 90.000000 93.000000 89.000000 81.000000 75.000000 
+69.000000 73.000000 89.000000 110.000000 125.000000 130.000000 
+129.000000 129.000000 127.000000 120.000000 109.000000 103.000000 
+108.000000 122.000000 141.000000 158.000000 157.000000 134.000000 
+107.000000 99.000000 112.000000 128.000000 133.000000 127.000000 
+120.000000 116.000000 113.000000 113.000000 118.000000 128.000000 
+135.000000 127.000000 111.000000 117.000000 154.000000 214.000000 
+277.000000 307.000000 289.000000 236.000000 183.000000 156.000000 
+144.000000 129.000000 103.000000 79.000000 72.000000 79.000000 
+94.000000 110.000000 120.000000 125.000000 125.000000 129.000000 
+136.000000 141.000000 140.000000 126.000000 99.000000 67.000000 
+45.000000 50.000000 96.000000 184.000000 286.000000 351.000000 
+347.000000 290.000000 218.000000 162.000000 133.000000 118.000000 
+96.000000 62.000000 39.000000 42.000000 69.000000 103.000000 
+130.000000 144.000000 147.000000 141.000000 130.000000 117.000000 
+104.000000 98.000000 99.000000 105.000000 115.000000 125.000000 
+136.000000 144.000000 138.000000 121.000000 108.000000 107.000000 
+107.000000 102.000000 101.000000 111.000000 121.000000 119.000000 
+105.000000 92.000000 91.000000 109.000000 139.000000 169.000000 
+205.000000 268.000000 340.000000 376.000000 350.000000 271.000000 
+175.000000 105.000000 79.000000 73.000000 63.000000 53.000000 
+57.000000 75.000000 97.000000 112.000000 122.000000 126.000000 
+121.000000 117.000000 128.000000 131.000000 130.000000 131.000000 
+139.000000 145.000000 133.000000 98.000000 61.000000 44.000000 
+43.000000 62.000000 132.000000 249.000000 353.000000 378.000000 
+327.000000 266.000000 235.000000 205.000000 152.000000 101.000000 
+66.000000 53.000000 81.000000 122.000000 148.000000 150.000000 
+143.000000 138.000000 135.000000 125.000000 107.000000 98.000000 
+103.000000 113.000000 120.000000 128.000000 138.000000 145.000000 
+140.000000 122.000000 104.000000 92.000000 76.000000 60.000000 
+64.000000 89.000000 105.000000 90.000000 76.000000 91.000000 
+138.000000 205.000000 267.000000 309.000000 338.000000 346.000000 
+318.000000 253.000000 167.000000 93.000000 50.000000 54.000000 
+85.000000 102.000000 98.000000 92.000000 98.000000 110.000000 
+118.000000 118.000000 116.000000 115.000000 116.000000 114.000000 
+135.000000 133.000000 129.000000 125.000000 128.000000 141.000000 
+150.000000 139.000000 108.000000 72.000000 52.000000 48.000000 
+58.000000 103.000000 178.000000 242.000000 266.000000 257.000000 
+227.000000 178.000000 122.000000 92.000000 83.000000 78.000000 
+95.000000 131.000000 154.000000 149.000000 135.000000 132.000000 
+136.000000 134.000000 126.000000 120.000000 122.000000 127.000000 
+130.000000 134.000000 142.000000 149.000000 151.000000 142.000000 
+117.000000 82.000000 51.000000 41.000000 45.000000 56.000000 
+71.000000 85.000000 118.000000 164.000000 217.000000 265.000000 
+277.000000 254.000000 210.000000 155.000000 99.000000 52.000000 
+32.000000 48.000000 81.000000 106.000000 123.000000 132.000000 
+130.000000 124.000000 125.000000 130.000000 130.000000 125.000000 
+120.000000 118.000000 116.000000 115.000000 135.000000 128.000000 
+121.000000 119.000000 116.000000 115.000000 122.000000 135.000000 
+140.000000 123.000000 93.000000 68.000000 59.000000 62.000000 
+88.000000 137.000000 183.000000 192.000000 153.000000 99.000000 
+62.000000 50.000000 60.000000 82.000000 112.000000 142.000000 
+154.000000 146.000000 135.000000 131.000000 133.000000 133.000000 
+133.000000 135.000000 136.000000 137.000000 139.000000 139.000000 
+137.000000 139.000000 151.000000 159.000000 142.000000 102.000000 
+65.000000 50.000000 50.000000 61.000000 97.000000 158.000000 
+199.000000 178.000000 124.000000 86.000000 68.000000 68.000000 
+73.000000 70.000000 62.000000 56.000000 66.000000 97.000000 
+133.000000 154.000000 155.000000 146.000000 136.000000 132.000000 
+132.000000 132.000000 131.000000 129.000000 126.000000 124.000000 
+122.000000 124.000000 140.000000 132.000000 124.000000 120.000000 
+119.000000 116.000000 117.000000 128.000000 143.000000 147.000000 
+134.000000 116.000000 105.000000 104.000000 112.000000 121.000000 
+125.000000 117.000000 96.000000 73.000000 58.000000 54.000000 
+67.000000 99.000000 132.000000 148.000000 144.000000 132.000000 
+124.000000 123.000000 126.000000 130.000000 135.000000 138.000000 
+140.000000 141.000000 144.000000 142.000000 136.000000 135.000000 
+144.000000 152.000000 143.000000 111.000000 73.000000 57.000000 
+76.000000 131.000000 203.000000 245.000000 220.000000 140.000000 
+73.000000 64.000000 80.000000 85.000000 75.000000 68.000000 
+77.000000 94.000000 110.000000 128.000000 146.000000 152.000000 
+143.000000 134.000000 132.000000 130.000000 122.000000 115.000000 
+118.000000 129.000000 134.000000 130.000000 124.000000 123.000000 
+136.000000 131.000000 127.000000 125.000000 125.000000 126.000000 
+130.000000 130.000000 128.000000 127.000000 130.000000 132.000000 
+129.000000 126.000000 131.000000 137.000000 132.000000 116.000000 
+95.000000 80.000000 72.000000 77.000000 102.000000 134.000000 
+146.000000 132.000000 107.000000 94.000000 98.000000 112.000000 
+125.000000 132.000000 134.000000 136.000000 139.000000 144.000000 
+145.000000 142.000000 136.000000 132.000000 134.000000 142.000000 
+147.000000 131.000000 93.000000 63.000000 78.000000 151.000000 
+242.000000 269.000000 191.000000 79.000000 38.000000 64.000000 
+94.000000 98.000000 93.000000 103.000000 123.000000 137.000000 
+138.000000 137.000000 136.000000 130.000000 119.000000 117.000000 
+125.000000 130.000000 125.000000 121.000000 124.000000 130.000000 
+130.000000 123.000000 117.000000 118.000000 130.000000 125.000000 
+127.000000 131.000000 133.000000 132.000000 130.000000 127.000000 
+124.000000 126.000000 131.000000 134.000000 133.000000 129.000000 
+126.000000 124.000000 126.000000 129.000000 130.000000 124.000000 
+116.000000 118.000000 131.000000 138.000000 127.000000 99.000000 
+73.000000 66.000000 80.000000 102.000000 119.000000 127.000000 
+132.000000 138.000000 143.000000 145.000000 144.000000 142.000000 
+135.000000 124.000000 115.000000 122.000000 138.000000 138.000000 
+115.000000 86.000000 73.000000 78.000000 94.000000 99.000000 
+69.000000 52.000000 75.000000 103.000000 119.000000 123.000000 
+125.000000 134.000000 146.000000 148.000000 138.000000 125.000000 
+120.000000 123.000000 125.000000 125.000000 127.000000 131.000000 
+131.000000 125.000000 123.000000 126.000000 130.000000 127.000000 
+123.000000 125.000000 133.000000 125.000000 127.000000 133.000000 
+136.000000 134.000000 131.000000 130.000000 129.000000 127.000000 
+127.000000 129.000000 132.000000 134.000000 133.000000 130.000000 
+124.000000 119.000000 122.000000 129.000000 134.000000 135.000000 
+129.000000 117.000000 97.000000 75.000000 59.000000 59.000000 
+77.000000 102.000000 121.000000 133.000000 139.000000 141.000000 
+142.000000 143.000000 145.000000 139.000000 121.000000 97.000000 
+84.000000 99.000000 126.000000 139.000000 124.000000 96.000000 
+75.000000 67.000000 63.000000 61.000000 70.000000 90.000000 
+112.000000 130.000000 141.000000 141.000000 133.000000 125.000000 
+125.000000 131.000000 134.000000 128.000000 122.000000 122.000000 
+127.000000 132.000000 133.000000 132.000000 131.000000 129.000000 
+128.000000 129.000000 130.000000 129.000000 126.000000 125.000000 
+132.000000 123.000000 121.000000 126.000000 131.000000 133.000000 
+130.000000 125.000000 123.000000 125.000000 128.000000 131.000000 
+133.000000 135.000000 139.000000 140.000000 132.000000 119.000000 
+111.000000 115.000000 120.000000 118.000000 108.000000 92.000000 
+75.000000 63.000000 57.000000 62.000000 78.000000 99.000000 
+116.000000 128.000000 134.000000 139.000000 142.000000 142.000000 
+134.000000 120.000000 98.000000 74.000000 60.000000 67.000000 
+92.000000 116.000000 122.000000 111.000000 94.000000 79.000000 
+69.000000 70.000000 84.000000 106.000000 125.000000 130.000000 
+126.000000 123.000000 125.000000 126.000000 127.000000 130.000000 
+132.000000 130.000000 126.000000 127.000000 133.000000 136.000000 
+130.000000 125.000000 127.000000 134.000000 135.000000 128.000000 
+124.000000 126.000000 131.000000 129.000000 130.000000 127.000000 
+125.000000 126.000000 128.000000 130.000000 130.000000 128.000000 
+126.000000 124.000000 125.000000 126.000000 129.000000 132.000000 
+133.000000 132.000000 131.000000 126.000000 116.000000 106.000000 
+103.000000 101.000000 92.000000 75.000000 56.000000 46.000000 
+50.000000 62.000000 78.000000 94.000000 108.000000 118.000000 
+124.000000 127.000000 127.000000 123.000000 116.000000 106.000000 
+93.000000 74.000000 58.000000 56.000000 72.000000 90.000000 
+99.000000 97.000000 92.000000 87.000000 86.000000 90.000000 
+99.000000 112.000000 120.000000 122.000000 123.000000 127.000000 
+131.000000 131.000000 131.000000 134.000000 135.000000 130.000000 
+124.000000 125.000000 132.000000 135.000000 132.000000 131.000000 
+138.000000 144.000000 139.000000 128.000000 124.000000 129.000000 
+134.000000 129.000000 144.000000 140.000000 134.000000 129.000000 
+127.000000 129.000000 133.000000 135.000000 133.000000 127.000000 
+124.000000 126.000000 132.000000 132.000000 128.000000 121.000000 
+117.000000 114.000000 110.000000 104.000000 98.000000 93.000000 
+90.000000 89.000000 85.000000 71.000000 56.000000 55.000000 
+66.000000 78.000000 83.000000 84.000000 92.000000 103.000000 
+106.000000 101.000000 95.000000 91.000000 84.000000 76.000000 
+70.000000 69.000000 70.000000 73.000000 76.000000 81.000000 
+83.000000 77.000000 75.000000 89.000000 112.000000 128.000000 
+128.000000 122.000000 122.000000 127.000000 130.000000 127.000000 
+125.000000 128.000000 132.000000 133.000000 130.000000 128.000000 
+127.000000 127.000000 127.000000 129.000000 134.000000 138.000000 
+135.000000 129.000000 127.000000 129.000000 129.000000 125.000000 
+142.000000 140.000000 135.000000 130.000000 127.000000 126.000000 
+129.000000 133.000000 135.000000 132.000000 133.000000 136.000000 
+137.000000 133.000000 129.000000 130.000000 132.000000 130.000000 
+126.000000 121.000000 114.000000 103.000000 96.000000 98.000000 
+98.000000 83.000000 60.000000 49.000000 55.000000 62.000000 
+56.000000 49.000000 55.000000 69.000000 75.000000 68.000000 
+61.000000 63.000000 71.000000 86.000000 98.000000 97.000000 
+80.000000 62.000000 55.000000 64.000000 77.000000 83.000000 
+90.000000 104.000000 119.000000 125.000000 124.000000 124.000000 
+127.000000 128.000000 125.000000 122.000000 123.000000 124.000000 
+126.000000 129.000000 129.000000 127.000000 126.000000 129.000000 
+132.000000 132.000000 130.000000 130.000000 133.000000 134.000000 
+131.000000 129.000000 127.000000 128.000000 134.000000 137.000000 
+133.000000 127.000000 125.000000 129.000000 134.000000 136.000000 
+133.000000 130.000000 132.000000 134.000000 132.000000 130.000000 
+132.000000 137.000000 137.000000 130.000000 125.000000 130.000000 
+135.000000 129.000000 114.000000 103.000000 100.000000 97.000000 
+84.000000 64.000000 54.000000 55.000000 56.000000 50.000000 
+41.000000 42.000000 47.000000 51.000000 52.000000 55.000000 
+66.000000 84.000000 97.000000 93.000000 73.000000 52.000000 
+48.000000 65.000000 89.000000 109.000000 120.000000 124.000000 
+124.000000 121.000000 117.000000 117.000000 122.000000 126.000000 
+126.000000 126.000000 127.000000 127.000000 127.000000 128.000000 
+129.000000 129.000000 128.000000 128.000000 129.000000 131.000000 
+131.000000 131.000000 131.000000 131.000000 130.000000 128.000000 
+127.000000 127.000000 125.000000 125.000000 125.000000 121.000000 
+120.000000 125.000000 132.000000 134.000000 133.000000 131.000000 
+129.000000 128.000000 131.000000 136.000000 140.000000 139.000000 
+135.000000 131.000000 130.000000 127.000000 118.000000 107.000000 
+100.000000 99.000000 103.000000 106.000000 98.000000 85.000000 
+77.000000 77.000000 78.000000 69.000000 51.000000 42.000000 
+50.000000 65.000000 69.000000 66.000000 76.000000 97.000000 
+108.000000 94.000000 72.000000 64.000000 77.000000 97.000000 
+111.000000 121.000000 127.000000 132.000000 131.000000 128.000000 
+126.000000 127.000000 127.000000 126.000000 126.000000 125.000000 
+123.000000 122.000000 125.000000 128.000000 127.000000 124.000000 
+122.000000 125.000000 126.000000 125.000000 122.000000 123.000000 
+124.000000 126.000000 126.000000 124.000000 124.000000 125.000000 
+117.000000 113.000000 113.000000 120.000000 129.000000 135.000000 
+137.000000 138.000000 141.000000 139.000000 133.000000 128.000000 
+132.000000 140.000000 144.000000 140.000000 133.000000 127.000000 
+122.000000 117.000000 110.000000 99.000000 88.000000 81.000000 
+85.000000 96.000000 100.000000 92.000000 78.000000 77.000000 
+89.000000 96.000000 86.000000 73.000000 78.000000 99.000000 
+111.000000 103.000000 94.000000 107.000000 133.000000 143.000000 
+129.000000 113.000000 113.000000 122.000000 125.000000 123.000000 
+128.000000 140.000000 144.000000 137.000000 127.000000 125.000000 
+127.000000 126.000000 122.000000 123.000000 126.000000 127.000000 
+126.000000 124.000000 125.000000 127.000000 130.000000 131.000000 
+128.000000 124.000000 123.000000 126.000000 128.000000 125.000000 
+121.000000 121.000000 129.000000 136.000000 114.000000 104.000000 
+99.000000 107.000000 122.000000 131.000000 132.000000 132.000000 
+132.000000 132.000000 131.000000 133.000000 138.000000 140.000000 
+139.000000 139.000000 140.000000 136.000000 127.000000 114.000000 
+102.000000 94.000000 93.000000 107.000000 127.000000 132.000000 
+118.000000 92.000000 76.000000 97.000000 126.000000 134.000000 
+120.000000 106.000000 110.000000 121.000000 115.000000 97.000000 
+98.000000 137.000000 194.000000 228.000000 221.000000 186.000000 
+149.000000 123.000000 109.000000 107.000000 117.000000 128.000000 
+129.000000 124.000000 124.000000 132.000000 138.000000 135.000000 
+124.000000 117.000000 115.000000 116.000000 117.000000 119.000000 
+123.000000 126.000000 127.000000 129.000000 133.000000 139.000000 
+140.000000 133.000000 123.000000 118.000000 122.000000 131.000000 
+135.000000 132.000000 121.000000 123.000000 121.000000 126.000000 
+137.000000 144.000000 138.000000 123.000000 111.000000 114.000000 
+129.000000 144.000000 147.000000 143.000000 141.000000 143.000000 
+140.000000 128.000000 110.000000 102.000000 111.000000 134.000000 
+159.000000 174.000000 169.000000 148.000000 120.000000 100.000000 
+103.000000 121.000000 139.000000 145.000000 135.000000 121.000000 
+117.000000 120.000000 119.000000 113.000000 113.000000 140.000000 
+197.000000 267.000000 317.000000 318.000000 268.000000 197.000000 
+135.000000 101.000000 97.000000 105.000000 111.000000 118.000000 
+133.000000 145.000000 145.000000 131.000000 116.000000 111.000000 
+114.000000 119.000000 123.000000 127.000000 130.000000 133.000000 
+138.000000 143.000000 141.000000 133.000000 123.000000 121.000000 
+128.000000 137.000000 140.000000 134.000000 127.000000 125.000000 
+139.000000 141.000000 137.000000 126.000000 117.000000 120.000000 
+132.000000 138.000000 129.000000 114.000000 113.000000 126.000000 
+138.000000 140.000000 137.000000 130.000000 121.000000 111.000000 
+110.000000 128.000000 154.000000 167.000000 164.000000 156.000000 
+154.000000 150.000000 135.000000 111.000000 100.000000 112.000000 
+129.000000 138.000000 132.000000 119.000000 117.000000 121.000000 
+115.000000 95.000000 89.000000 119.000000 177.000000 250.000000 
+311.000000 337.000000 328.000000 294.000000 243.000000 173.000000 
+102.000000 82.000000 104.000000 130.000000 140.000000 138.000000 
+133.000000 129.000000 126.000000 120.000000 118.000000 123.000000 
+130.000000 131.000000 126.000000 125.000000 131.000000 135.000000 
+133.000000 130.000000 132.000000 137.000000 134.000000 125.000000 
+121.000000 125.000000 131.000000 129.000000 130.000000 133.000000 
+131.000000 124.000000 116.000000 115.000000 126.000000 139.000000 
+144.000000 140.000000 133.000000 133.000000 140.000000 144.000000 
+139.000000 126.000000 112.000000 108.000000 119.000000 137.000000 
+151.000000 151.000000 135.000000 118.000000 118.000000 127.000000 
+129.000000 124.000000 123.000000 127.000000 124.000000 114.000000 
+106.000000 104.000000 103.000000 92.000000 80.000000 81.000000 
+97.000000 111.000000 112.000000 110.000000 125.000000 166.000000 
+220.000000 269.000000 296.000000 276.000000 204.000000 117.000000 
+86.000000 105.000000 129.000000 140.000000 143.000000 143.000000 
+140.000000 136.000000 135.000000 135.000000 132.000000 127.000000 
+125.000000 128.000000 131.000000 132.000000 130.000000 127.000000 
+125.000000 125.000000 127.000000 130.000000 131.000000 127.000000 
+123.000000 122.000000 128.000000 123.000000 119.000000 120.000000 
+124.000000 124.000000 120.000000 118.000000 121.000000 125.000000 
+125.000000 124.000000 124.000000 127.000000 130.000000 129.000000 
+130.000000 134.000000 138.000000 137.000000 129.000000 120.000000 
+118.000000 126.000000 138.000000 144.000000 140.000000 129.000000 
+119.000000 113.000000 104.000000 90.000000 79.000000 75.000000 
+78.000000 84.000000 92.000000 99.000000 102.000000 107.000000 
+118.000000 129.000000 131.000000 122.000000 124.000000 154.000000 
+200.000000 238.000000 244.000000 206.000000 147.000000 125.000000 
+135.000000 138.000000 135.000000 137.000000 141.000000 137.000000 
+130.000000 130.000000 133.000000 132.000000 128.000000 129.000000 
+139.000000 142.000000 131.000000 113.000000 106.000000 113.000000 
+126.000000 132.000000 129.000000 126.000000 126.000000 129.000000 
+134.000000 132.000000 128.000000 124.000000 122.000000 123.000000 
+124.000000 124.000000 124.000000 126.000000 129.000000 130.000000 
+130.000000 131.000000 134.000000 135.000000 131.000000 128.000000 
+131.000000 136.000000 135.000000 128.000000 123.000000 126.000000 
+131.000000 134.000000 134.000000 135.000000 137.000000 139.000000 
+133.000000 118.000000 93.000000 72.000000 69.000000 79.000000 
+103.000000 124.000000 130.000000 127.000000 126.000000 131.000000 
+135.000000 134.000000 130.000000 129.000000 140.000000 162.000000 
+195.000000 219.000000 206.000000 172.000000 154.000000 147.000000 
+140.000000 137.000000 139.000000 137.000000 129.000000 122.000000 
+123.000000 126.000000 122.000000 117.000000 119.000000 120.000000 
+110.000000 102.000000 108.000000 121.000000 131.000000 132.000000 
+130.000000 130.000000 129.000000 122.000000 133.000000 129.000000 
+126.000000 126.000000 128.000000 130.000000 132.000000 131.000000 
+129.000000 128.000000 127.000000 125.000000 125.000000 127.000000 
+130.000000 133.000000 134.000000 134.000000 133.000000 133.000000 
+133.000000 134.000000 135.000000 132.000000 128.000000 127.000000 
+132.000000 136.000000 132.000000 125.000000 125.000000 130.000000 
+126.000000 108.000000 89.000000 87.000000 107.000000 129.000000 
+136.000000 131.000000 128.000000 129.000000 132.000000 136.000000 
+140.000000 141.000000 135.000000 129.000000 142.000000 176.000000 
+200.000000 195.000000 175.000000 156.000000 139.000000 128.000000 
+130.000000 136.000000 135.000000 126.000000 123.000000 129.000000 
+135.000000 131.000000 122.000000 120.000000 124.000000 124.000000 
+122.000000 124.000000 133.000000 143.000000 144.000000 137.000000 
+129.000000 124.000000 126.000000 130.000000 130.000000 126.000000 
+124.000000 126.000000 130.000000 130.000000 127.000000 124.000000 
+124.000000 125.000000 127.000000 129.000000 130.000000 130.000000 
+128.000000 128.000000 131.000000 134.000000 134.000000 129.000000 
+123.000000 119.000000 124.000000 132.000000 137.000000 137.000000 
+133.000000 131.000000 131.000000 129.000000 122.000000 113.000000 
+109.000000 115.000000 124.000000 131.000000 132.000000 129.000000 
+125.000000 125.000000 132.000000 139.000000 142.000000 140.000000 
+133.000000 121.000000 116.000000 133.000000 160.000000 175.000000 
+172.000000 155.000000 135.000000 123.000000 123.000000 127.000000 
+128.000000 124.000000 119.000000 116.000000 117.000000 122.000000 
+126.000000 127.000000 125.000000 123.000000 122.000000 124.000000 
+128.000000 134.000000 137.000000 136.000000 131.000000 125.000000 
+136.000000 132.000000 128.000000 126.000000 126.000000 126.000000 
+127.000000 130.000000 130.000000 126.000000 122.000000 124.000000 
+132.000000 136.000000 131.000000 122.000000 119.000000 126.000000 
+135.000000 141.000000 140.000000 134.000000 128.000000 126.000000 
+128.000000 129.000000 127.000000 124.000000 124.000000 126.000000 
+125.000000 122.000000 124.000000 129.000000 132.000000 131.000000 
+128.000000 129.000000 131.000000 129.000000 127.000000 128.000000 
+132.000000 135.000000 135.000000 135.000000 137.000000 133.000000 
+124.000000 123.000000 138.000000 156.000000 160.000000 147.000000 
+129.000000 122.000000 126.000000 132.000000 132.000000 130.000000 
+129.000000 130.000000 131.000000 130.000000 128.000000 126.000000 
+125.000000 123.000000 121.000000 121.000000 127.000000 133.000000 
+134.000000 130.000000 126.000000 125.000000 134.000000 131.000000 
+129.000000 128.000000 129.000000 126.000000 123.000000 123.000000 
+125.000000 129.000000 130.000000 130.000000 130.000000 131.000000 
+132.000000 134.000000 138.000000 143.000000 145.000000 141.000000 
+130.000000 119.000000 116.000000 120.000000 123.000000 122.000000 
+119.000000 123.000000 134.000000 140.000000 133.000000 118.000000 
+109.000000 115.000000 128.000000 135.000000 133.000000 127.000000 
+125.000000 126.000000 129.000000 134.000000 136.000000 133.000000 
+129.000000 130.000000 136.000000 137.000000 131.000000 126.000000 
+129.000000 138.000000 140.000000 132.000000 126.000000 127.000000 
+131.000000 130.000000 125.000000 121.000000 122.000000 124.000000 
+125.000000 128.000000 131.000000 132.000000 129.000000 125.000000 
+125.000000 127.000000 128.000000 128.000000 126.000000 123.000000 
+121.000000 121.000000 122.000000 121.000000 119.000000 112.000000 
+107.000000 110.000000 119.000000 128.000000 133.000000 132.000000 
+128.000000 127.000000 129.000000 132.000000 134.000000 132.000000 
+129.000000 129.000000 131.000000 136.000000 139.000000 137.000000 
+129.000000 124.000000 125.000000 128.000000 127.000000 122.000000 
+122.000000 129.000000 133.000000 125.000000 115.000000 115.000000 
+124.000000 131.000000 130.000000 127.000000 126.000000 127.000000 
+127.000000 132.000000 137.000000 136.000000 127.000000 121.000000 
+125.000000 133.000000 137.000000 134.000000 133.000000 134.000000 
+132.000000 129.000000 129.000000 134.000000 135.000000 131.000000 
+126.000000 129.000000 135.000000 136.000000 132.000000 128.000000 
+126.000000 127.000000 130.000000 130.000000 127.000000 122.000000 
+122.000000 123.000000 121.000000 115.000000 113.000000 119.000000 
+128.000000 136.000000 130.000000 111.000000 97.000000 102.000000 
+120.000000 134.000000 138.000000 133.000000 128.000000 127.000000 
+131.000000 136.000000 139.000000 137.000000 133.000000 130.000000 
+129.000000 130.000000 131.000000 130.000000 129.000000 129.000000 
+132.000000 135.000000 136.000000 133.000000 133.000000 132.000000 
+126.000000 115.000000 108.000000 115.000000 129.000000 140.000000 
+141.000000 137.000000 131.000000 125.000000 124.000000 127.000000 
+131.000000 132.000000 130.000000 130.000000 132.000000 133.000000 
+133.000000 135.000000 137.000000 133.000000 125.000000 122.000000 
+131.000000 140.000000 139.000000 132.000000 129.000000 135.000000 
+140.000000 136.000000 129.000000 124.000000 125.000000 126.000000 
+127.000000 128.000000 130.000000 134.000000 136.000000 133.000000 
+124.000000 113.000000 112.000000 121.000000 139.000000 136.000000 
+128.000000 112.000000 98.000000 96.000000 112.000000 134.000000 
+143.000000 136.000000 126.000000 124.000000 129.000000 135.000000 
+137.000000 135.000000 133.000000 131.000000 130.000000 132.000000 
+137.000000 139.000000 137.000000 135.000000 134.000000 134.000000 
+131.000000 128.000000 124.000000 122.000000 122.000000 125.000000 
+128.000000 130.000000 131.000000 132.000000 134.000000 135.000000 
+130.000000 123.000000 122.000000 128.000000 132.000000 130.000000 
+127.000000 127.000000 131.000000 133.000000 132.000000 133.000000 
+134.000000 134.000000 133.000000 136.000000 139.000000 138.000000 
+130.000000 124.000000 127.000000 134.000000 136.000000 132.000000 
+129.000000 130.000000 131.000000 127.000000 121.000000 118.000000 
+122.000000 129.000000 130.000000 121.000000 107.000000 99.000000 
+102.000000 112.000000 129.000000 114.000000 101.000000 92.000000 
+87.000000 86.000000 95.000000 113.000000 128.000000 130.000000 
+127.000000 128.000000 132.000000 133.000000 132.000000 130.000000 
+133.000000 137.000000 139.000000 137.000000 135.000000 134.000000 
+136.000000 137.000000 136.000000 133.000000 128.000000 125.000000 
+124.000000 125.000000 129.000000 132.000000 133.000000 132.000000 
+131.000000 134.000000 137.000000 136.000000 131.000000 129.000000 
+130.000000 133.000000 133.000000 132.000000 134.000000 137.000000 
+135.000000 131.000000 129.000000 129.000000 130.000000 131.000000 
+134.000000 138.000000 139.000000 134.000000 129.000000 131.000000 
+137.000000 142.000000 141.000000 136.000000 130.000000 124.000000 
+121.000000 122.000000 125.000000 127.000000 127.000000 129.000000 
+130.000000 123.000000 110.000000 104.000000 113.000000 126.000000 
+136.000000 121.000000 101.000000 89.000000 85.000000 85.000000 
+87.000000 95.000000 110.000000 123.000000 130.000000 131.000000 
+131.000000 130.000000 129.000000 130.000000 130.000000 130.000000 
+129.000000 129.000000 134.000000 140.000000 140.000000 136.000000 
+134.000000 135.000000 132.000000 125.000000 119.000000 121.000000 
+127.000000 131.000000 129.000000 128.000000 130.000000 133.000000 
+132.000000 128.000000 128.000000 131.000000 135.000000 135.000000 
+134.000000 136.000000 141.000000 141.000000 136.000000 131.000000 
+131.000000 133.000000 133.000000 130.000000 127.000000 129.000000 
+132.000000 132.000000 130.000000 130.000000 135.000000 138.000000 
+136.000000 130.000000 125.000000 126.000000 128.000000 129.000000 
+126.000000 123.000000 123.000000 124.000000 125.000000 123.000000 
+116.000000 109.000000 109.000000 116.000000 120.000000 106.000000 
+89.000000 83.000000 92.000000 101.000000 103.000000 104.000000 
+114.000000 124.000000 127.000000 126.000000 126.000000 130.000000 
+133.000000 132.000000 132.000000 134.000000 138.000000 139.000000 
+139.000000 137.000000 133.000000 129.000000 130.000000 136.000000 
+138.000000 133.000000 128.000000 128.000000 131.000000 131.000000 
+129.000000 129.000000 131.000000 130.000000 126.000000 125.000000 
+130.000000 133.000000 131.000000 129.000000 132.000000 138.000000 
+138.000000 134.000000 131.000000 131.000000 131.000000 127.000000 
+126.000000 128.000000 131.000000 132.000000 128.000000 123.000000 
+122.000000 130.000000 140.000000 146.000000 145.000000 140.000000 
+138.000000 138.000000 134.000000 126.000000 121.000000 125.000000 
+133.000000 135.000000 129.000000 121.000000 114.000000 112.000000 
+116.000000 124.000000 87.000000 160.000000 216.000000 213.000000 
+171.000000 141.000000 136.000000 135.000000 127.000000 116.000000 
+112.000000 113.000000 116.000000 118.000000 120.000000 122.000000 
+124.000000 120.000000 112.000000 115.000000 129.000000 134.000000 
+125.000000 117.000000 115.000000 114.000000 112.000000 110.000000 
+111.000000 119.000000 129.000000 135.000000 135.000000 134.000000 
+134.000000 133.000000 129.000000 128.000000 130.000000 132.000000 
+133.000000 132.000000 128.000000 123.000000 123.000000 128.000000 
+132.000000 136.000000 143.000000 146.000000 139.000000 128.000000 
+122.000000 118.000000 117.000000 122.000000 132.000000 137.000000 
+135.000000 129.000000 118.000000 102.000000 88.000000 76.000000 
+69.000000 73.000000 60.000000 19.000000 44.000000 118.000000 
+140.000000 117.000000 93.000000 93.000000 105.000000 113.000000 
+29.000000 85.000000 174.000000 222.000000 208.000000 165.000000 
+137.000000 136.000000 142.000000 135.000000 124.000000 118.000000 
+118.000000 118.000000 119.000000 122.000000 125.000000 122.000000 
+119.000000 124.000000 130.000000 127.000000 119.000000 113.000000 
+109.000000 108.000000 109.000000 112.000000 116.000000 122.000000 
+129.000000 133.000000 134.000000 135.000000 134.000000 128.000000 
+123.000000 129.000000 145.000000 153.000000 144.000000 130.000000 
+126.000000 129.000000 132.000000 132.000000 129.000000 128.000000 
+133.000000 140.000000 141.000000 134.000000 127.000000 124.000000 
+127.000000 134.000000 140.000000 141.000000 139.000000 137.000000 
+132.000000 114.000000 87.000000 65.000000 64.000000 71.000000 
+56.000000 55.000000 109.000000 162.000000 165.000000 141.000000 
+124.000000 124.000000 126.000000 116.000000 29.000000 37.000000 
+104.000000 174.000000 203.000000 188.000000 156.000000 135.000000 
+137.000000 142.000000 134.000000 123.000000 117.000000 117.000000 
+119.000000 121.000000 121.000000 121.000000 123.000000 123.000000 
+121.000000 120.000000 120.000000 115.000000 106.000000 102.000000 
+108.000000 118.000000 126.000000 128.000000 128.000000 130.000000 
+133.000000 134.000000 131.000000 126.000000 127.000000 135.000000 
+152.000000 162.000000 148.000000 126.000000 118.000000 127.000000 
+136.000000 133.000000 125.000000 124.000000 131.000000 139.000000 
+138.000000 129.000000 122.000000 126.000000 135.000000 138.000000 
+136.000000 135.000000 137.000000 137.000000 128.000000 106.000000 
+82.000000 71.000000 74.000000 76.000000 81.000000 113.000000 
+149.000000 158.000000 149.000000 139.000000 134.000000 133.000000 
+127.000000 115.000000 17.000000 19.000000 57.000000 117.000000 
+166.000000 180.000000 160.000000 134.000000 126.000000 132.000000 
+130.000000 120.000000 116.000000 123.000000 128.000000 126.000000 
+123.000000 126.000000 133.000000 138.000000 136.000000 131.000000 
+123.000000 118.000000 118.000000 118.000000 119.000000 123.000000 
+130.000000 132.000000 128.000000 125.000000 125.000000 125.000000 
+124.000000 125.000000 128.000000 127.000000 122.000000 119.000000 
+115.000000 113.000000 116.000000 121.000000 126.000000 128.000000 
+131.000000 132.000000 132.000000 132.000000 133.000000 132.000000 
+131.000000 133.000000 138.000000 139.000000 136.000000 135.000000 
+139.000000 140.000000 130.000000 106.000000 82.000000 74.000000 
+83.000000 101.000000 124.000000 141.000000 144.000000 142.000000 
+141.000000 138.000000 133.000000 129.000000 127.000000 123.000000 
+202.000000 134.000000 77.000000 80.000000 125.000000 145.000000 
+128.000000 112.000000 118.000000 132.000000 132.000000 122.000000 
+118.000000 123.000000 126.000000 123.000000 123.000000 128.000000 
+134.000000 138.000000 140.000000 134.000000 124.000000 121.000000 
+125.000000 127.000000 126.000000 128.000000 134.000000 138.000000 
+138.000000 134.000000 125.000000 117.000000 115.000000 121.000000 
+129.000000 128.000000 119.000000 110.000000 109.000000 116.000000 
+123.000000 123.000000 121.000000 124.000000 131.000000 136.000000 
+133.000000 126.000000 121.000000 123.000000 130.000000 135.000000 
+133.000000 128.000000 127.000000 130.000000 135.000000 135.000000 
+125.000000 109.000000 99.000000 101.000000 109.000000 119.000000 
+128.000000 137.000000 144.000000 146.000000 142.000000 134.000000 
+130.000000 132.000000 136.000000 133.000000 335.000000 257.000000 
+159.000000 99.000000 89.000000 102.000000 107.000000 107.000000 
+120.000000 138.000000 144.000000 134.000000 120.000000 114.000000 
+118.000000 125.000000 128.000000 123.000000 120.000000 126.000000 
+134.000000 131.000000 123.000000 121.000000 122.000000 120.000000 
+120.000000 127.000000 135.000000 141.000000 142.000000 140.000000 
+134.000000 127.000000 122.000000 120.000000 119.000000 118.000000 
+117.000000 118.000000 120.000000 121.000000 123.000000 126.000000 
+129.000000 133.000000 134.000000 133.000000 130.000000 126.000000 
+122.000000 121.000000 126.000000 131.000000 128.000000 120.000000 
+118.000000 121.000000 121.000000 113.000000 106.000000 106.000000 
+114.000000 120.000000 117.000000 114.000000 121.000000 137.000000 
+149.000000 149.000000 142.000000 135.000000 134.000000 136.000000 
+136.000000 136.000000 204.000000 234.000000 216.000000 165.000000 
+110.000000 90.000000 101.000000 116.000000 128.000000 135.000000 
+136.000000 130.000000 123.000000 122.000000 128.000000 132.000000 
+128.000000 125.000000 129.000000 137.000000 137.000000 131.000000 
+127.000000 127.000000 126.000000 124.000000 125.000000 127.000000 
+131.000000 136.000000 139.000000 136.000000 128.000000 122.000000 
+121.000000 122.000000 118.000000 111.000000 111.000000 120.000000 
+132.000000 136.000000 131.000000 127.000000 133.000000 143.000000 
+145.000000 139.000000 134.000000 135.000000 136.000000 133.000000 
+131.000000 132.000000 132.000000 126.000000 120.000000 119.000000 
+118.000000 112.000000 108.000000 110.000000 115.000000 114.000000 
+110.000000 113.000000 125.000000 135.000000 140.000000 142.000000 
+142.000000 138.000000 128.000000 122.000000 129.000000 141.000000 
+105.000000 158.000000 196.000000 190.000000 161.000000 133.000000 
+121.000000 124.000000 132.000000 137.000000 138.000000 134.000000 
+129.000000 126.000000 125.000000 125.000000 126.000000 128.000000 
+131.000000 131.000000 127.000000 127.000000 129.000000 131.000000 
+130.000000 130.000000 127.000000 124.000000 124.000000 127.000000 
+128.000000 122.000000 113.000000 111.000000 117.000000 120.000000 
+118.000000 112.000000 112.000000 122.000000 137.000000 144.000000 
+138.000000 129.000000 132.000000 143.000000 151.000000 148.000000 
+141.000000 141.000000 142.000000 138.000000 132.000000 133.000000 
+135.000000 132.000000 123.000000 116.000000 117.000000 122.000000 
+125.000000 123.000000 121.000000 119.000000 121.000000 129.000000 
+139.000000 143.000000 140.000000 137.000000 137.000000 135.000000 
+126.000000 118.000000 122.000000 133.000000 89.000000 107.000000 
+149.000000 177.000000 181.000000 167.000000 145.000000 129.000000 
+127.000000 134.000000 138.000000 134.000000 124.000000 116.000000 
+115.000000 119.000000 121.000000 120.000000 120.000000 124.000000 
+129.000000 130.000000 125.000000 120.000000 118.000000 119.000000 
+119.000000 115.000000 111.000000 114.000000 120.000000 123.000000 
+124.000000 129.000000 134.000000 134.000000 130.000000 127.000000 
+126.000000 128.000000 132.000000 138.000000 140.000000 136.000000 
+132.000000 135.000000 141.000000 142.000000 137.000000 134.000000 
+131.000000 128.000000 126.000000 129.000000 132.000000 129.000000 
+124.000000 123.000000 126.000000 130.000000 130.000000 128.000000 
+126.000000 127.000000 132.000000 140.000000 146.000000 148.000000 
+143.000000 135.000000 131.000000 132.000000 133.000000 129.000000 
+122.000000 113.000000 74.000000 71.000000 100.000000 144.000000 
+172.000000 178.000000 158.000000 129.000000 114.000000 120.000000 
+131.000000 134.000000 128.000000 120.000000 114.000000 111.000000 
+109.000000 110.000000 117.000000 128.000000 137.000000 137.000000 
+129.000000 119.000000 115.000000 119.000000 124.000000 117.000000 
+103.000000 103.000000 122.000000 144.000000 156.000000 161.000000 
+159.000000 153.000000 149.000000 147.000000 139.000000 131.000000 
+130.000000 136.000000 140.000000 135.000000 124.000000 123.000000 
+133.000000 141.000000 135.000000 124.000000 118.000000 119.000000 
+123.000000 126.000000 124.000000 120.000000 120.000000 125.000000 
+129.000000 127.000000 121.000000 117.000000 121.000000 130.000000 
+140.000000 147.000000 147.000000 143.000000 136.000000 128.000000 
+122.000000 124.000000 130.000000 130.000000 116.000000 94.000000 
+89.000000 65.000000 62.000000 105.000000 155.000000 183.000000 
+175.000000 138.000000 105.000000 102.000000 118.000000 131.000000 
+131.000000 124.000000 115.000000 108.000000 104.000000 107.000000 
+117.000000 126.000000 131.000000 130.000000 126.000000 118.000000 
+111.000000 112.000000 120.000000 125.000000 125.000000 129.000000 
+147.000000 170.000000 182.000000 176.000000 156.000000 131.000000 
+114.000000 110.000000 116.000000 130.000000 141.000000 141.000000 
+133.000000 129.000000 131.000000 136.000000 142.000000 145.000000 
+139.000000 124.000000 117.000000 121.000000 127.000000 126.000000 
+122.000000 118.000000 117.000000 122.000000 127.000000 129.000000 
+125.000000 119.000000 120.000000 132.000000 145.000000 151.000000 
+146.000000 137.000000 130.000000 124.000000 122.000000 125.000000 
+126.000000 119.000000 100.000000 78.000000 122.000000 91.000000 
+58.000000 74.000000 138.000000 187.000000 192.000000 157.000000 
+113.000000 95.000000 108.000000 128.000000 131.000000 121.000000 
+112.000000 110.000000 113.000000 117.000000 123.000000 127.000000 
+127.000000 126.000000 126.000000 122.000000 115.000000 112.000000 
+118.000000 127.000000 133.000000 140.000000 156.000000 175.000000 
+175.000000 147.000000 104.000000 74.000000 73.000000 83.000000 
+92.000000 98.000000 107.000000 120.000000 133.000000 141.000000 
+142.000000 140.000000 138.000000 137.000000 135.000000 125.000000 
+113.000000 110.000000 117.000000 125.000000 126.000000 123.000000 
+124.000000 129.000000 134.000000 132.000000 124.000000 118.000000 
+122.000000 134.000000 146.000000 148.000000 139.000000 129.000000 
+124.000000 126.000000 131.000000 135.000000 129.000000 113.000000 
+92.000000 74.000000 137.000000 122.000000 83.000000 60.000000 
+111.000000 193.000000 230.000000 205.000000 147.000000 106.000000 
+101.000000 120.000000 133.000000 129.000000 120.000000 119.000000 
+119.000000 115.000000 113.000000 116.000000 124.000000 131.000000 
+134.000000 130.000000 124.000000 121.000000 123.000000 126.000000 
+128.000000 130.000000 134.000000 134.000000 124.000000 98.000000 
+70.000000 57.000000 64.000000 95.000000 112.000000 117.000000 
+122.000000 133.000000 154.000000 162.000000 147.000000 130.000000 
+129.000000 138.000000 140.000000 128.000000 112.000000 106.000000 
+114.000000 123.000000 125.000000 121.000000 120.000000 122.000000 
+123.000000 120.000000 117.000000 119.000000 123.000000 130.000000 
+138.000000 141.000000 137.000000 131.000000 130.000000 135.000000 
+140.000000 136.000000 122.000000 102.000000 84.000000 74.000000 
+144.000000 144.000000 121.000000 77.000000 79.000000 169.000000 
+256.000000 268.000000 208.000000 137.000000 100.000000 104.000000 
+128.000000 140.000000 134.000000 124.000000 119.000000 115.000000 
+111.000000 111.000000 121.000000 133.000000 137.000000 132.000000 
+126.000000 119.000000 109.000000 99.000000 101.000000 114.000000 
+120.000000 104.000000 82.000000 69.000000 73.000000 79.000000 
+74.000000 80.000000 94.000000 115.000000 134.000000 139.000000 
+146.000000 151.000000 144.000000 135.000000 132.000000 135.000000 
+136.000000 132.000000 129.000000 127.000000 124.000000 119.000000 
+116.000000 117.000000 116.000000 111.000000 105.000000 111.000000 
+126.000000 135.000000 130.000000 125.000000 131.000000 139.000000 
+134.000000 119.000000 119.000000 147.000000 184.000000 194.000000 
+161.000000 108.000000 67.000000 62.000000 145.000000 138.000000 
+127.000000 95.000000 63.000000 103.000000 213.000000 292.000000 
+289.000000 220.000000 145.000000 107.000000 110.000000 128.000000 
+135.000000 128.000000 122.000000 125.000000 127.000000 126.000000 
+126.000000 132.000000 137.000000 137.000000 133.000000 123.000000 
+103.000000 79.000000 66.000000 72.000000 86.000000 82.000000 
+68.000000 67.000000 85.000000 102.000000 97.000000 81.000000 
+78.000000 92.000000 109.000000 119.000000 122.000000 125.000000 
+130.000000 134.000000 134.000000 128.000000 123.000000 124.000000 
+128.000000 127.000000 122.000000 119.000000 120.000000 121.000000 
+118.000000 114.000000 115.000000 123.000000 132.000000 136.000000 
+133.000000 128.000000 127.000000 125.000000 116.000000 120.000000 
+160.000000 229.000000 289.000000 301.000000 256.000000 195.000000 
+145.000000 98.000000 141.000000 133.000000 115.000000 92.000000 
+63.000000 55.000000 119.000000 226.000000 308.000000 320.000000 
+254.000000 161.000000 112.000000 116.000000 132.000000 133.000000 
+123.000000 124.000000 135.000000 144.000000 141.000000 133.000000 
+126.000000 121.000000 116.000000 109.000000 97.000000 81.000000 
+63.000000 54.000000 58.000000 65.000000 73.000000 87.000000 
+106.000000 121.000000 124.000000 119.000000 117.000000 121.000000 
+121.000000 117.000000 116.000000 122.000000 131.000000 135.000000 
+133.000000 130.000000 126.000000 120.000000 117.000000 116.000000 
+120.000000 126.000000 128.000000 124.000000 120.000000 126.000000 
+138.000000 139.000000 129.000000 123.000000 127.000000 130.000000 
+120.000000 105.000000 110.000000 154.000000 223.000000 280.000000 
+296.000000 276.000000 247.000000 232.000000 217.000000 163.000000 
+140.000000 143.000000 132.000000 111.000000 82.000000 49.000000 
+45.000000 108.000000 220.000000 320.000000 339.000000 274.000000 
+196.000000 152.000000 132.000000 128.000000 131.000000 135.000000 
+133.000000 126.000000 120.000000 113.000000 105.000000 92.000000 
+82.000000 78.000000 76.000000 71.000000 65.000000 64.000000 
+73.000000 89.000000 103.000000 114.000000 124.000000 135.000000 
+140.000000 134.000000 126.000000 128.000000 136.000000 137.000000 
+132.000000 125.000000 123.000000 123.000000 121.000000 122.000000 
+125.000000 127.000000 125.000000 123.000000 123.000000 126.000000 
+128.000000 129.000000 129.000000 128.000000 126.000000 125.000000 
+129.000000 134.000000 135.000000 127.000000 117.000000 121.000000 
+143.000000 166.000000 173.000000 168.000000 156.000000 142.000000 
+131.000000 129.000000 133.000000 135.000000 135.000000 144.000000 
+150.000000 141.000000 112.000000 70.000000 39.000000 48.000000 
+112.000000 204.000000 277.000000 300.000000 271.000000 211.000000 
+148.000000 115.000000 115.000000 124.000000 123.000000 113.000000 
+103.000000 89.000000 68.000000 48.000000 38.000000 43.000000 
+59.000000 73.000000 80.000000 87.000000 100.000000 114.000000 
+119.000000 114.000000 112.000000 117.000000 121.000000 122.000000 
+123.000000 131.000000 141.000000 143.000000 128.000000 109.000000 
+105.000000 112.000000 122.000000 130.000000 136.000000 141.000000 
+140.000000 134.000000 128.000000 124.000000 118.000000 108.000000 
+101.000000 107.000000 127.000000 149.000000 162.000000 164.000000 
+155.000000 141.000000 130.000000 133.000000 144.000000 146.000000 
+127.000000 98.000000 78.000000 74.000000 76.000000 77.000000 
+83.000000 95.000000 133.000000 141.000000 151.000000 154.000000 
+140.000000 108.000000 70.000000 43.000000 47.000000 85.000000 
+147.000000 212.000000 251.000000 237.000000 183.000000 140.000000 
+134.000000 152.000000 186.000000 207.000000 191.000000 145.000000 
+90.000000 51.000000 35.000000 44.000000 70.000000 99.000000 
+117.000000 123.000000 120.000000 113.000000 103.000000 89.000000 
+75.000000 72.000000 84.000000 106.000000 128.000000 130.000000 
+113.000000 98.000000 94.000000 97.000000 103.000000 106.000000 
+114.000000 128.000000 143.000000 150.000000 148.000000 138.000000 
+122.000000 108.000000 104.000000 111.000000 126.000000 149.000000 
+174.000000 184.000000 174.000000 156.000000 144.000000 136.000000 
+126.000000 118.000000 119.000000 122.000000 113.000000 91.000000 
+74.000000 78.000000 100.000000 119.000000 126.000000 123.000000 
+128.000000 132.000000 140.000000 151.000000 157.000000 144.000000 
+111.000000 71.000000 40.000000 38.000000 68.000000 116.000000 
+165.000000 196.000000 203.000000 203.000000 204.000000 198.000000 
+211.000000 233.000000 229.000000 197.000000 147.000000 95.000000 
+71.000000 83.000000 109.000000 132.000000 143.000000 143.000000 
+130.000000 110.000000 92.000000 81.000000 71.000000 63.000000 
+69.000000 96.000000 130.000000 141.000000 120.000000 96.000000 
+96.000000 98.000000 82.000000 61.000000 61.000000 87.000000 
+117.000000 125.000000 114.000000 100.000000 94.000000 99.000000 
+119.000000 151.000000 175.000000 176.000000 161.000000 146.000000 
+135.000000 126.000000 115.000000 108.000000 112.000000 118.000000 
+119.000000 110.000000 98.000000 91.000000 94.000000 105.000000 
+118.000000 128.000000 132.000000 133.000000 127.000000 127.000000 
+126.000000 129.000000 136.000000 142.000000 142.000000 126.000000 
+98.000000 72.000000 62.000000 70.000000 91.000000 120.000000 
+149.000000 169.000000 168.000000 149.000000 135.000000 139.000000 
+140.000000 122.000000 93.000000 70.000000 78.000000 108.000000 
+134.000000 144.000000 144.000000 143.000000 137.000000 119.000000 
+100.000000 89.000000 86.000000 84.000000 90.000000 110.000000 
+138.000000 150.000000 136.000000 105.000000 82.000000 78.000000 
+64.000000 48.000000 48.000000 67.000000 92.000000 101.000000 
+92.000000 80.000000 83.000000 100.000000 112.000000 114.000000 
+113.000000 106.000000 97.000000 93.000000 95.000000 99.000000 
+105.000000 120.000000 135.000000 138.000000 128.000000 115.000000 
+110.000000 116.000000 123.000000 125.000000 124.000000 125.000000 
+127.000000 131.000000 124.000000 128.000000 130.000000 124.000000 
+115.000000 116.000000 129.000000 144.000000 147.000000 136.000000 
+118.000000 101.000000 89.000000 86.000000 91.000000 100.000000 
+104.000000 102.000000 101.000000 96.000000 82.000000 61.000000 
+50.000000 65.000000 99.000000 129.000000 143.000000 146.000000 
+149.000000 150.000000 144.000000 131.000000 120.000000 111.000000 
+106.000000 107.000000 115.000000 131.000000 146.000000 156.000000 
+155.000000 131.000000 92.000000 75.000000 77.000000 87.000000 
+104.000000 127.000000 155.000000 177.000000 172.000000 136.000000 
+93.000000 73.000000 75.000000 82.000000 84.000000 83.000000 
+79.000000 69.000000 64.000000 75.000000 105.000000 133.000000 
+140.000000 131.000000 123.000000 125.000000 131.000000 133.000000 
+128.000000 123.000000 120.000000 118.000000 118.000000 119.000000 
+130.000000 130.000000 129.000000 124.000000 119.000000 116.000000 
+119.000000 128.000000 139.000000 145.000000 141.000000 125.000000 
+108.000000 98.000000 100.000000 102.000000 97.000000 88.000000 
+77.000000 67.000000 63.000000 62.000000 75.000000 100.000000 
+121.000000 132.000000 137.000000 142.000000 147.000000 147.000000 
+146.000000 146.000000 146.000000 139.000000 128.000000 122.000000 
+124.000000 133.000000 144.000000 153.000000 158.000000 150.000000 
+124.000000 92.000000 82.000000 106.000000 165.000000 246.000000 
+307.000000 307.000000 241.000000 144.000000 75.000000 58.000000 
+63.000000 64.000000 62.000000 67.000000 71.000000 71.000000 
+75.000000 94.000000 120.000000 130.000000 123.000000 116.000000 
+122.000000 133.000000 138.000000 134.000000 128.000000 123.000000 
+117.000000 115.000000 119.000000 124.000000 138.000000 134.000000 
+130.000000 127.000000 124.000000 124.000000 125.000000 128.000000 
+130.000000 131.000000 132.000000 132.000000 132.000000 127.000000 
+119.000000 111.000000 109.000000 109.000000 100.000000 81.000000 
+68.000000 77.000000 105.000000 131.000000 137.000000 134.000000 
+132.000000 132.000000 129.000000 128.000000 134.000000 143.000000 
+145.000000 142.000000 140.000000 141.000000 142.000000 142.000000 
+143.000000 144.000000 142.000000 139.000000 134.000000 119.000000 
+99.000000 103.000000 155.000000 235.000000 281.000000 242.000000 
+144.000000 59.000000 40.000000 63.000000 73.000000 68.000000 
+75.000000 96.000000 108.000000 107.000000 107.000000 115.000000 
+121.000000 116.000000 112.000000 123.000000 139.000000 142.000000 
+134.000000 130.000000 132.000000 131.000000 123.000000 118.000000 
+124.000000 131.000000 138.000000 136.000000 135.000000 136.000000 
+138.000000 136.000000 130.000000 124.000000 124.000000 130.000000 
+131.000000 127.000000 122.000000 121.000000 125.000000 128.000000 
+127.000000 122.000000 117.000000 114.000000 115.000000 125.000000 
+137.000000 143.000000 142.000000 136.000000 125.000000 113.000000 
+110.000000 118.000000 129.000000 134.000000 133.000000 132.000000 
+136.000000 141.000000 144.000000 144.000000 141.000000 134.000000 
+130.000000 133.000000 139.000000 134.000000 116.000000 99.000000 
+94.000000 100.000000 100.000000 78.000000 48.000000 48.000000 
+75.000000 101.000000 115.000000 118.000000 121.000000 130.000000 
+140.000000 143.000000 138.000000 133.000000 129.000000 128.000000 
+128.000000 129.000000 132.000000 135.000000 132.000000 127.000000 
+124.000000 124.000000 124.000000 124.000000 126.000000 129.000000 
+140.000000 130.000000 127.000000 133.000000 136.000000 132.000000 
+125.000000 120.000000 122.000000 127.000000 129.000000 128.000000 
+125.000000 124.000000 125.000000 126.000000 123.000000 120.000000 
+123.000000 131.000000 137.000000 140.000000 140.000000 138.000000 
+128.000000 111.000000 95.000000 91.000000 101.000000 117.000000 
+128.000000 133.000000 132.000000 130.000000 127.000000 127.000000 
+130.000000 132.000000 130.000000 123.000000 121.000000 132.000000 
+147.000000 150.000000 132.000000 101.000000 75.000000 63.000000 
+64.000000 71.000000 77.000000 86.000000 102.000000 121.000000 
+134.000000 134.000000 126.000000 120.000000 120.000000 126.000000 
+132.000000 134.000000 135.000000 132.000000 128.000000 125.000000 
+129.000000 135.000000 137.000000 131.000000 124.000000 123.000000 
+125.000000 125.000000 123.000000 124.000000 137.000000 127.000000 
+123.000000 126.000000 132.000000 136.000000 133.000000 126.000000 
+122.000000 124.000000 128.000000 130.000000 129.000000 128.000000 
+128.000000 128.000000 127.000000 124.000000 119.000000 119.000000 
+123.000000 131.000000 134.000000 124.000000 102.000000 81.000000 
+72.000000 80.000000 97.000000 117.000000 132.000000 139.000000 
+137.000000 130.000000 128.000000 133.000000 141.000000 140.000000 
+128.000000 112.000000 105.000000 112.000000 127.000000 137.000000 
+139.000000 129.000000 110.000000 86.000000 71.000000 72.000000 
+86.000000 102.000000 116.000000 124.000000 129.000000 129.000000 
+124.000000 117.000000 116.000000 125.000000 134.000000 138.000000 
+136.000000 132.000000 130.000000 130.000000 131.000000 133.000000 
+134.000000 131.000000 126.000000 124.000000 127.000000 128.000000 
+126.000000 125.000000 132.000000 124.000000 119.000000 123.000000 
+132.000000 136.000000 132.000000 123.000000 119.000000 120.000000 
+124.000000 128.000000 131.000000 130.000000 127.000000 126.000000 
+127.000000 127.000000 125.000000 124.000000 128.000000 131.000000 
+121.000000 101.000000 81.000000 71.000000 70.000000 80.000000 
+99.000000 123.000000 140.000000 144.000000 138.000000 133.000000 
+136.000000 145.000000 151.000000 146.000000 125.000000 98.000000 
+82.000000 84.000000 99.000000 117.000000 128.000000 132.000000 
+124.000000 105.000000 88.000000 85.000000 97.000000 114.000000 
+125.000000 127.000000 126.000000 125.000000 122.000000 120.000000 
+122.000000 128.000000 131.000000 131.000000 130.000000 131.000000 
+132.000000 132.000000 131.000000 133.000000 136.000000 135.000000 
+131.000000 131.000000 135.000000 135.000000 131.000000 126.000000 
+135.000000 129.000000 123.000000 124.000000 129.000000 132.000000 
+130.000000 125.000000 122.000000 123.000000 128.000000 133.000000 
+134.000000 132.000000 128.000000 128.000000 127.000000 122.000000 
+116.000000 117.000000 123.000000 121.000000 102.000000 76.000000 
+62.000000 63.000000 72.000000 82.000000 97.000000 119.000000 
+136.000000 139.000000 134.000000 133.000000 139.000000 146.000000 
+148.000000 141.000000 119.000000 89.000000 67.000000 64.000000 
+77.000000 97.000000 115.000000 124.000000 119.000000 97.000000 
+74.000000 72.000000 93.000000 118.000000 129.000000 124.000000 
+120.000000 124.000000 128.000000 127.000000 125.000000 129.000000 
+135.000000 136.000000 133.000000 132.000000 134.000000 137.000000 
+136.000000 134.000000 133.000000 132.000000 129.000000 127.000000 
+130.000000 133.000000 130.000000 125.000000 141.000000 139.000000 
+132.000000 125.000000 121.000000 122.000000 125.000000 128.000000 
+129.000000 131.000000 136.000000 142.000000 143.000000 137.000000 
+130.000000 126.000000 123.000000 116.000000 108.000000 106.000000 
+106.000000 101.000000 91.000000 85.000000 80.000000 71.000000 
+63.000000 67.000000 86.000000 110.000000 120.000000 118.000000 
+115.000000 119.000000 123.000000 124.000000 124.000000 120.000000 
+108.000000 87.000000 65.000000 58.000000 66.000000 84.000000 
+99.000000 105.000000 98.000000 84.000000 77.000000 87.000000 
+106.000000 120.000000 122.000000 120.000000 122.000000 127.000000 
+127.000000 124.000000 120.000000 120.000000 125.000000 132.000000 
+138.000000 139.000000 136.000000 133.000000 132.000000 132.000000 
+132.000000 132.000000 130.000000 129.000000 130.000000 131.000000 
+132.000000 131.000000 140.000000 137.000000 133.000000 130.000000 
+129.000000 128.000000 128.000000 130.000000 132.000000 133.000000 
+134.000000 134.000000 132.000000 130.000000 130.000000 133.000000 
+133.000000 127.000000 120.000000 115.000000 109.000000 100.000000 
+96.000000 97.000000 95.000000 83.000000 69.000000 69.000000 
+83.000000 97.000000 99.000000 95.000000 91.000000 90.000000 
+91.000000 94.000000 99.000000 102.000000 99.000000 93.000000 
+88.000000 83.000000 78.000000 73.000000 71.000000 74.000000 
+80.000000 86.000000 97.000000 111.000000 121.000000 123.000000 
+124.000000 127.000000 129.000000 128.000000 124.000000 122.000000 
+123.000000 124.000000 128.000000 133.000000 135.000000 133.000000 
+129.000000 131.000000 136.000000 137.000000 133.000000 127.000000 
+129.000000 134.000000 136.000000 133.000000 128.000000 127.000000 
+140.000000 137.000000 132.000000 127.000000 122.000000 119.000000 
+122.000000 128.000000 131.000000 133.000000 134.000000 135.000000 
+133.000000 130.000000 131.000000 136.000000 136.000000 131.000000 
+127.000000 128.000000 124.000000 110.000000 94.000000 90.000000 
+96.000000 98.000000 90.000000 85.000000 89.000000 98.000000 
+103.000000 99.000000 92.000000 91.000000 98.000000 110.000000 
+115.000000 108.000000 100.000000 102.000000 112.000000 116.000000 
+103.000000 81.000000 65.000000 70.000000 88.000000 106.000000 
+120.000000 128.000000 130.000000 127.000000 125.000000 126.000000 
+128.000000 128.000000 126.000000 126.000000 126.000000 127.000000 
+127.000000 127.000000 123.000000 120.000000 122.000000 131.000000 
+138.000000 136.000000 128.000000 121.000000 120.000000 124.000000 
+128.000000 130.000000 127.000000 124.000000 136.000000 132.000000 
+128.000000 126.000000 127.000000 130.000000 133.000000 135.000000 
+135.000000 136.000000 138.000000 137.000000 135.000000 134.000000 
+137.000000 139.000000 134.000000 126.000000 122.000000 122.000000 
+114.000000 96.000000 78.000000 74.000000 82.000000 89.000000 
+89.000000 89.000000 97.000000 112.000000 124.000000 123.000000 
+113.000000 106.000000 112.000000 128.000000 135.000000 122.000000 
+102.000000 97.000000 108.000000 117.000000 109.000000 92.000000 
+86.000000 94.000000 103.000000 111.000000 121.000000 132.000000 
+136.000000 131.000000 124.000000 124.000000 126.000000 127.000000 
+125.000000 124.000000 123.000000 124.000000 127.000000 131.000000 
+132.000000 129.000000 126.000000 127.000000 131.000000 132.000000 
+129.000000 123.000000 120.000000 122.000000 127.000000 128.000000 
+126.000000 124.000000 123.000000 113.000000 107.000000 113.000000 
+125.000000 133.000000 133.000000 133.000000 137.000000 140.000000 
+137.000000 132.000000 132.000000 136.000000 137.000000 135.000000 
+133.000000 131.000000 123.000000 107.000000 92.000000 85.000000 
+89.000000 96.000000 99.000000 93.000000 87.000000 95.000000 
+118.000000 143.000000 153.000000 145.000000 131.000000 125.000000 
+131.000000 138.000000 134.000000 118.000000 100.000000 92.000000 
+95.000000 104.000000 117.000000 132.000000 144.000000 144.000000 
+129.000000 115.000000 114.000000 127.000000 139.000000 138.000000 
+132.000000 131.000000 136.000000 137.000000 129.000000 121.000000 
+121.000000 129.000000 134.000000 134.000000 129.000000 125.000000 
+124.000000 127.000000 133.000000 135.000000 131.000000 126.000000 
+124.000000 123.000000 120.000000 117.000000 121.000000 129.000000 
+107.000000 110.000000 120.000000 131.000000 139.000000 141.000000 
+136.000000 129.000000 123.000000 123.000000 130.000000 138.000000 
+142.000000 140.000000 137.000000 138.000000 139.000000 131.000000 
+114.000000 95.000000 84.000000 85.000000 96.000000 109.000000 
+115.000000 113.000000 111.000000 115.000000 128.000000 141.000000 
+144.000000 139.000000 134.000000 131.000000 131.000000 131.000000 
+130.000000 123.000000 106.000000 93.000000 100.000000 125.000000 
+154.000000 171.000000 172.000000 163.000000 149.000000 137.000000 
+126.000000 116.000000 109.000000 110.000000 124.000000 142.000000 
+152.000000 144.000000 129.000000 119.000000 121.000000 126.000000 
+129.000000 131.000000 132.000000 133.000000 135.000000 138.000000 
+142.000000 140.000000 131.000000 121.000000 120.000000 127.000000 
+133.000000 135.000000 134.000000 132.000000 113.000000 118.000000 
+123.000000 124.000000 123.000000 123.000000 125.000000 126.000000 
+128.000000 130.000000 133.000000 137.000000 141.000000 143.000000 
+143.000000 140.000000 134.000000 124.000000 119.000000 122.000000 
+132.000000 142.000000 145.000000 140.000000 135.000000 133.000000 
+132.000000 128.000000 126.000000 134.000000 145.000000 149.000000 
+141.000000 133.000000 134.000000 138.000000 135.000000 121.000000 
+104.000000 101.000000 111.000000 122.000000 132.000000 148.000000 
+176.000000 202.000000 201.000000 170.000000 133.000000 114.000000 
+117.000000 127.000000 130.000000 126.000000 121.000000 123.000000 
+129.000000 130.000000 124.000000 121.000000 127.000000 136.000000 
+139.000000 133.000000 126.000000 120.000000 116.000000 116.000000 
+124.000000 135.000000 141.000000 139.000000 133.000000 130.000000 
+130.000000 131.000000 120.000000 125.000000 130.000000 131.000000 
+126.000000 121.000000 121.000000 126.000000 131.000000 136.000000 
+139.000000 140.000000 141.000000 139.000000 134.000000 130.000000 
+131.000000 136.000000 143.000000 143.000000 137.000000 131.000000 
+131.000000 136.000000 141.000000 141.000000 134.000000 124.000000 
+120.000000 127.000000 139.000000 142.000000 136.000000 127.000000 
+127.000000 130.000000 125.000000 114.000000 110.000000 119.000000 
+128.000000 131.000000 130.000000 137.000000 154.000000 177.000000 
+194.000000 196.000000 178.000000 149.000000 128.000000 124.000000 
+127.000000 129.000000 130.000000 131.000000 132.000000 130.000000 
+124.000000 121.000000 123.000000 125.000000 125.000000 126.000000 
+131.000000 136.000000 134.000000 129.000000 127.000000 133.000000 
+138.000000 139.000000 136.000000 134.000000 133.000000 133.000000 
+129.000000 129.000000 128.000000 127.000000 127.000000 127.000000 
+124.000000 119.000000 115.000000 117.000000 124.000000 131.000000 
+136.000000 137.000000 138.000000 138.000000 141.000000 142.000000 
+139.000000 132.000000 127.000000 127.000000 131.000000 134.000000 
+135.000000 132.000000 128.000000 126.000000 129.000000 135.000000 
+135.000000 130.000000 126.000000 127.000000 132.000000 134.000000 
+132.000000 133.000000 135.000000 135.000000 133.000000 132.000000 
+133.000000 132.000000 124.000000 121.000000 135.000000 161.000000 
+179.000000 176.000000 159.000000 143.000000 134.000000 129.000000 
+124.000000 122.000000 124.000000 125.000000 127.000000 131.000000 
+134.000000 134.000000 131.000000 129.000000 131.000000 131.000000 
+125.000000 118.000000 118.000000 127.000000 135.000000 136.000000 
+132.000000 131.000000 133.000000 133.000000 133.000000 130.000000 
+125.000000 124.000000 127.000000 126.000000 121.000000 118.000000 
+122.000000 130.000000 134.000000 134.000000 132.000000 134.000000 
+137.000000 138.000000 137.000000 134.000000 132.000000 132.000000 
+133.000000 134.000000 133.000000 133.000000 135.000000 138.000000 
+135.000000 127.000000 122.000000 123.000000 127.000000 126.000000 
+119.000000 114.000000 110.000000 109.000000 119.000000 132.000000 
+134.000000 131.000000 132.000000 139.000000 145.000000 142.000000 
+131.000000 118.000000 113.000000 122.000000 143.000000 163.000000 
+169.000000 160.000000 146.000000 133.000000 126.000000 123.000000 
+122.000000 126.000000 134.000000 141.000000 141.000000 137.000000 
+134.000000 133.000000 129.000000 119.000000 111.000000 114.000000 
+124.000000 132.000000 136.000000 135.000000 131.000000 127.000000 
+126.000000 128.000000 129.000000 131.000000 129.000000 127.000000 
+126.000000 125.000000 125.000000 125.000000 124.000000 123.000000 
+125.000000 130.000000 135.000000 139.000000 138.000000 134.000000 
+131.000000 132.000000 135.000000 136.000000 129.000000 120.000000 
+115.000000 119.000000 127.000000 133.000000 134.000000 133.000000 
+133.000000 137.000000 144.000000 148.000000 140.000000 121.000000 
+105.000000 104.000000 118.000000 131.000000 132.000000 126.000000 
+128.000000 138.000000 147.000000 147.000000 141.000000 133.000000 
+124.000000 117.000000 122.000000 138.000000 151.000000 149.000000 
+138.000000 129.000000 130.000000 131.000000 124.000000 117.000000 
+119.000000 131.000000 144.000000 146.000000 136.000000 122.000000 
+112.000000 110.000000 113.000000 118.000000 122.000000 128.000000 
+134.000000 139.000000 139.000000 134.000000 129.000000 127.000000 
+126.000000 125.000000 123.000000 122.000000 123.000000 125.000000 
+127.000000 128.000000 129.000000 128.000000 128.000000 132.000000 
+138.000000 143.000000 141.000000 134.000000 129.000000 131.000000 
+135.000000 134.000000 128.000000 120.000000 118.000000 121.000000 
+126.000000 128.000000 128.000000 130.000000 135.000000 142.000000 
+145.000000 141.000000 133.000000 124.000000 119.000000 122.000000 
+132.000000 140.000000 139.000000 134.000000 131.000000 134.000000 
+140.000000 142.000000 140.000000 137.000000 132.000000 126.000000 
+126.000000 133.000000 140.000000 137.000000 127.000000 121.000000 
+127.000000 140.000000 146.000000 141.000000 133.000000 129.000000 
+129.000000 129.000000 128.000000 125.000000 123.000000 120.000000 
+119.000000 119.000000 124.000000 131.000000 138.000000 140.000000 
+137.000000 131.000000 125.000000 123.000000 124.000000 124.000000 
+124.000000 125.000000 128.000000 134.000000 138.000000 136.000000 
+133.000000 131.000000 132.000000 136.000000 140.000000 140.000000 
+139.000000 135.000000 132.000000 133.000000 136.000000 138.000000 
+135.000000 130.000000 128.000000 128.000000 130.000000 130.000000 
+128.000000 126.000000 126.000000 130.000000 138.000000 143.000000 
+139.000000 131.000000 126.000000 128.000000 135.000000 139.000000 
+139.000000 136.000000 133.000000 132.000000 131.000000 130.000000 
+130.000000 131.000000 134.000000 134.000000 133.000000 132.000000 
+131.000000 130.000000 129.000000 130.000000 133.000000 136.000000 
+136.000000 136.000000 136.000000 136.000000 135.000000 133.000000 
+130.000000 125.000000 120.000000 119.000000 124.000000 130.000000 
+128.000000 122.000000 122.000000 130.000000 139.000000 139.000000 
+131.000000 122.000000 134.000000 126.000000 116.000000 109.000000 
+112.000000 125.000000 138.000000 143.000000 138.000000 129.000000 
+125.000000 129.000000 135.000000 137.000000 134.000000 131.000000 
+131.000000 133.000000 134.000000 133.000000 131.000000 130.000000 
+130.000000 130.000000 128.000000 124.000000 123.000000 125.000000 
+128.000000 130.000000 135.000000 143.000000 146.000000 139.000000 
+128.000000 123.000000 129.000000 138.000000 141.000000 137.000000 
+133.000000 132.000000 133.000000 133.000000 131.000000 129.000000 
+129.000000 133.000000 139.000000 141.000000 137.000000 130.000000 
+129.000000 134.000000 137.000000 135.000000 132.000000 134.000000 
+137.000000 134.000000 127.000000 119.000000 114.000000 114.000000 
+121.000000 131.000000 136.000000 132.000000 125.000000 122.000000 
+124.000000 126.000000 126.000000 128.000000 133.000000 134.000000 
+126.000000 117.000000 106.000000 98.000000 96.000000 106.000000 
+123.000000 138.000000 140.000000 133.000000 127.000000 128.000000 
+134.000000 137.000000 137.000000 136.000000 134.000000 132.000000 
+131.000000 131.000000 130.000000 128.000000 129.000000 131.000000 
+130.000000 124.000000 120.000000 125.000000 135.000000 137.000000 
+131.000000 126.000000 129.000000 133.000000 132.000000 127.000000 
+126.000000 129.000000 133.000000 132.000000 129.000000 126.000000 
+127.000000 130.000000 132.000000 132.000000 133.000000 137.000000 
+141.000000 139.000000 131.000000 125.000000 128.000000 134.000000 
+136.000000 132.000000 128.000000 129.000000 130.000000 129.000000 
+126.000000 123.000000 122.000000 124.000000 127.000000 129.000000 
+125.000000 118.000000 116.000000 120.000000 124.000000 126.000000 
+128.000000 135.000000 142.000000 140.000000 116.000000 104.000000 
+86.000000 69.000000 66.000000 81.000000 107.000000 125.000000 
+130.000000 127.000000 126.000000 126.000000 125.000000 126.000000 
+130.000000 133.000000 135.000000 134.000000 133.000000 135.000000 
+137.000000 136.000000 133.000000 127.000000 123.000000 124.000000 
+128.000000 130.000000 130.000000 130.000000 132.000000 132.000000 
+129.000000 124.000000 125.000000 131.000000 137.000000 138.000000 
+138.000000 136.000000 133.000000 128.000000 125.000000 126.000000 
+129.000000 129.000000 129.000000 132.000000 136.000000 137.000000 
+134.000000 133.000000 135.000000 137.000000 138.000000 136.000000 
+134.000000 132.000000 133.000000 135.000000 135.000000 131.000000 
+126.000000 125.000000 128.000000 132.000000 130.000000 124.000000 
+119.000000 122.000000 130.000000 136.000000 136.000000 131.000000 
+126.000000 126.000000 115.000000 113.000000 117.000000 113.000000 
+98.000000 86.000000 90.000000 111.000000 128.000000 132.000000 
+130.000000 130.000000 132.000000 133.000000 133.000000 135.000000 
+137.000000 137.000000 136.000000 135.000000 138.000000 140.000000 
+138.000000 133.000000 128.000000 123.000000 119.000000 118.000000 
+122.000000 131.000000 139.000000 140.000000 136.000000 132.000000 
+134.000000 139.000000 141.000000 137.000000 133.000000 131.000000 
+131.000000 131.000000 128.000000 126.000000 127.000000 134.000000 
+140.000000 142.000000 138.000000 132.000000 128.000000 128.000000 
+130.000000 133.000000 136.000000 136.000000 135.000000 134.000000 
+135.000000 135.000000 133.000000 129.000000 128.000000 131.000000 
+134.000000 133.000000 131.000000 128.000000 127.000000 124.000000 
+124.000000 126.000000 132.000000 134.000000 130.000000 124.000000 
+128.000000 115.000000 99.000000 91.000000 89.000000 90.000000 
+92.000000 100.000000 114.000000 126.000000 131.000000 132.000000 
+134.000000 136.000000 135.000000 131.000000 130.000000 134.000000 
+137.000000 136.000000 131.000000 127.000000 128.000000 132.000000 
+135.000000 134.000000 130.000000 126.000000 126.000000 127.000000 
+128.000000 126.000000 125.000000 124.000000 125.000000 130.000000 
+136.000000 138.000000 136.000000 133.000000 135.000000 138.000000 
+138.000000 134.000000 132.000000 135.000000 137.000000 133.000000 
+129.000000 131.000000 136.000000 138.000000 135.000000 131.000000 
+132.000000 134.000000 133.000000 130.000000 129.000000 129.000000 
+129.000000 129.000000 131.000000 135.000000 136.000000 134.000000 
+129.000000 125.000000 126.000000 130.000000 134.000000 132.000000 
+124.000000 115.000000 111.000000 116.000000 136.000000 127.000000 
+107.000000 94.000000 96.000000 103.000000 105.000000 107.000000 
+117.000000 131.000000 139.000000 138.000000 135.000000 135.000000 
+134.000000 132.000000 131.000000 132.000000 136.000000 139.000000 
+139.000000 137.000000 134.000000 130.000000 128.000000 128.000000 
+128.000000 127.000000 127.000000 129.000000 132.000000 130.000000 
+127.000000 127.000000 130.000000 133.000000 133.000000 130.000000 
+128.000000 127.000000 128.000000 130.000000 131.000000 131.000000 
+132.000000 134.000000 139.000000 140.000000 136.000000 134.000000 
+137.000000 140.000000 139.000000 135.000000 129.000000 123.000000 
+121.000000 125.000000 135.000000 145.000000 149.000000 145.000000 
+138.000000 132.000000 127.000000 125.000000 125.000000 124.000000 
+121.000000 120.000000 124.000000 128.000000 128.000000 123.000000 
+116.000000 113.000000 124.000000 113.000000 96.000000 87.000000 
+95.000000 108.000000 114.000000 113.000000 116.000000 126.000000 
+135.000000 138.000000 137.000000 136.000000 134.000000 129.000000 
+127.000000 130.000000 135.000000 138.000000 137.000000 135.000000 
+133.000000 130.000000 128.000000 129.000000 134.000000 135.000000 
+131.000000 126.000000 124.000000 126.000000 129.000000 130.000000 
+130.000000 130.000000 132.000000 136.000000 138.000000 140.000000 
+141.000000 142.000000 142.000000 141.000000 139.000000 136.000000 
+134.000000 132.000000 131.000000 133.000000 137.000000 140.000000 
+141.000000 139.000000 134.000000 126.000000 116.000000 111.000000 
+116.000000 126.000000 134.000000 137.000000 135.000000 133.000000 
+131.000000 130.000000 129.000000 130.000000 131.000000 134.000000 
+135.000000 131.000000 125.000000 118.000000 115.000000 116.000000 
+69.000000 104.000000 130.000000 137.000000 128.000000 120.000000 
+126.000000 138.000000 143.000000 137.000000 126.000000 118.000000 
+113.000000 112.000000 114.000000 117.000000 117.000000 117.000000 
+118.000000 122.000000 127.000000 134.000000 140.000000 136.000000 
+126.000000 121.000000 120.000000 114.000000 105.000000 103.000000 
+113.000000 125.000000 132.000000 133.000000 134.000000 133.000000 
+129.000000 124.000000 122.000000 122.000000 123.000000 126.000000 
+127.000000 127.000000 129.000000 133.000000 136.000000 135.000000 
+133.000000 131.000000 129.000000 129.000000 133.000000 136.000000 
+134.000000 129.000000 129.000000 134.000000 139.000000 141.000000 
+142.000000 143.000000 138.000000 121.000000 93.000000 74.000000 
+73.000000 71.000000 56.000000 78.000000 135.000000 168.000000 
+166.000000 136.000000 96.000000 79.000000 46.000000 89.000000 
+147.000000 182.000000 174.000000 146.000000 131.000000 130.000000 
+131.000000 127.000000 122.000000 120.000000 119.000000 117.000000 
+116.000000 116.000000 114.000000 112.000000 114.000000 121.000000 
+130.000000 138.000000 137.000000 129.000000 122.000000 120.000000 
+119.000000 113.000000 108.000000 111.000000 118.000000 121.000000 
+124.000000 128.000000 130.000000 127.000000 123.000000 126.000000 
+133.000000 136.000000 132.000000 129.000000 129.000000 130.000000 
+131.000000 132.000000 132.000000 131.000000 131.000000 130.000000 
+127.000000 124.000000 130.000000 139.000000 139.000000 131.000000 
+130.000000 139.000000 145.000000 142.000000 136.000000 129.000000 
+118.000000 102.000000 88.000000 86.000000 89.000000 87.000000 
+97.000000 128.000000 151.000000 149.000000 136.000000 127.000000 
+122.000000 112.000000 43.000000 77.000000 140.000000 199.000000 
+210.000000 185.000000 160.000000 146.000000 135.000000 124.000000 
+117.000000 114.000000 113.000000 113.000000 116.000000 122.000000 
+126.000000 125.000000 126.000000 130.000000 134.000000 131.000000 
+123.000000 117.000000 117.000000 118.000000 118.000000 117.000000 
+119.000000 124.000000 127.000000 130.000000 131.000000 130.000000 
+123.000000 113.000000 110.000000 126.000000 153.000000 168.000000 
+157.000000 138.000000 130.000000 129.000000 130.000000 131.000000 
+132.000000 131.000000 130.000000 132.000000 132.000000 127.000000 
+124.000000 131.000000 138.000000 137.000000 135.000000 137.000000 
+142.000000 141.000000 131.000000 118.000000 104.000000 95.000000 
+96.000000 105.000000 110.000000 113.000000 124.000000 136.000000 
+142.000000 137.000000 132.000000 130.000000 130.000000 124.000000 
+46.000000 70.000000 127.000000 190.000000 212.000000 188.000000 
+153.000000 133.000000 128.000000 126.000000 121.000000 119.000000 
+121.000000 123.000000 126.000000 128.000000 131.000000 134.000000 
+138.000000 140.000000 133.000000 124.000000 119.000000 120.000000 
+117.000000 112.000000 113.000000 123.000000 135.000000 141.000000 
+143.000000 144.000000 144.000000 140.000000 131.000000 125.000000 
+124.000000 130.000000 140.000000 148.000000 144.000000 135.000000 
+132.000000 132.000000 132.000000 135.000000 138.000000 139.000000 
+137.000000 138.000000 139.000000 134.000000 125.000000 125.000000 
+133.000000 139.000000 139.000000 137.000000 136.000000 133.000000 
+124.000000 108.000000 96.000000 96.000000 105.000000 114.000000 
+120.000000 125.000000 135.000000 144.000000 148.000000 144.000000 
+136.000000 129.000000 123.000000 120.000000 153.000000 133.000000 
+128.000000 152.000000 174.000000 162.000000 133.000000 116.000000 
+119.000000 124.000000 121.000000 115.000000 118.000000 129.000000 
+135.000000 132.000000 129.000000 135.000000 144.000000 147.000000 
+141.000000 136.000000 132.000000 124.000000 112.000000 106.000000 
+113.000000 129.000000 142.000000 146.000000 145.000000 143.000000 
+139.000000 133.000000 126.000000 123.000000 123.000000 123.000000 
+121.000000 120.000000 121.000000 126.000000 133.000000 137.000000 
+137.000000 136.000000 135.000000 132.000000 130.000000 134.000000 
+139.000000 138.000000 129.000000 123.000000 126.000000 131.000000 
+130.000000 126.000000 122.000000 116.000000 109.000000 101.000000 
+99.000000 100.000000 105.000000 113.000000 125.000000 136.000000 
+142.000000 142.000000 139.000000 137.000000 134.000000 131.000000 
+129.000000 128.000000 312.000000 339.000000 296.000000 222.000000 
+161.000000 135.000000 135.000000 135.000000 132.000000 127.000000 
+120.000000 115.000000 117.000000 126.000000 134.000000 135.000000 
+132.000000 131.000000 133.000000 135.000000 138.000000 139.000000 
+133.000000 122.000000 116.000000 120.000000 126.000000 128.000000 
+127.000000 131.000000 137.000000 137.000000 129.000000 123.000000 
+124.000000 129.000000 130.000000 124.000000 117.000000 117.000000 
+122.000000 127.000000 129.000000 131.000000 134.000000 135.000000 
+133.000000 130.000000 127.000000 129.000000 132.000000 134.000000 
+132.000000 127.000000 126.000000 128.000000 127.000000 123.000000 
+117.000000 110.000000 104.000000 104.000000 106.000000 107.000000 
+109.000000 117.000000 131.000000 143.000000 146.000000 141.000000 
+135.000000 133.000000 133.000000 133.000000 131.000000 128.000000 
+239.000000 374.000000 428.000000 361.000000 232.000000 137.000000 
+118.000000 132.000000 138.000000 132.000000 129.000000 132.000000 
+131.000000 125.000000 122.000000 126.000000 130.000000 126.000000 
+120.000000 118.000000 122.000000 123.000000 119.000000 116.000000 
+119.000000 128.000000 133.000000 131.000000 130.000000 134.000000 
+135.000000 127.000000 118.000000 119.000000 129.000000 144.000000 
+149.000000 139.000000 122.000000 116.000000 126.000000 136.000000 
+135.000000 129.000000 130.000000 137.000000 138.000000 133.000000 
+132.000000 136.000000 136.000000 132.000000 130.000000 131.000000 
+131.000000 128.000000 126.000000 123.000000 118.000000 112.000000 
+110.000000 110.000000 113.000000 116.000000 120.000000 125.000000 
+129.000000 133.000000 138.000000 143.000000 143.000000 138.000000 
+131.000000 126.000000 123.000000 122.000000 78.000000 171.000000 
+324.000000 387.000000 312.000000 179.000000 103.000000 103.000000 
+128.000000 140.000000 138.000000 137.000000 136.000000 126.000000 
+115.000000 112.000000 119.000000 125.000000 124.000000 119.000000 
+114.000000 111.000000 111.000000 114.000000 122.000000 131.000000 
+135.000000 131.000000 131.000000 137.000000 141.000000 139.000000 
+138.000000 153.000000 176.000000 186.000000 173.000000 151.000000 
+143.000000 146.000000 149.000000 147.000000 140.000000 134.000000 
+134.000000 140.000000 142.000000 136.000000 132.000000 135.000000 
+136.000000 128.000000 122.000000 123.000000 128.000000 128.000000 
+124.000000 121.000000 123.000000 126.000000 128.000000 127.000000 
+124.000000 123.000000 124.000000 124.000000 125.000000 128.000000 
+134.000000 142.000000 144.000000 139.000000 132.000000 129.000000 
+131.000000 136.000000 45.000000 53.000000 173.000000 316.000000 
+325.000000 228.000000 137.000000 107.000000 116.000000 136.000000 
+140.000000 133.000000 129.000000 127.000000 120.000000 111.000000 
+110.000000 116.000000 121.000000 120.000000 119.000000 119.000000 
+117.000000 113.000000 113.000000 120.000000 123.000000 120.000000 
+119.000000 134.000000 161.000000 179.000000 196.000000 219.000000 
+232.000000 219.000000 181.000000 149.000000 145.000000 155.000000 
+155.000000 143.000000 134.000000 136.000000 139.000000 141.000000 
+141.000000 139.000000 136.000000 134.000000 135.000000 134.000000 
+129.000000 126.000000 123.000000 121.000000 121.000000 126.000000 
+132.000000 133.000000 128.000000 123.000000 119.000000 118.000000 
+121.000000 127.000000 132.000000 135.000000 137.000000 138.000000 
+137.000000 134.000000 132.000000 132.000000 129.000000 124.000000 
+57.000000 47.000000 103.000000 244.000000 308.000000 265.000000 
+177.000000 113.000000 96.000000 117.000000 138.000000 133.000000 
+120.000000 118.000000 120.000000 117.000000 113.000000 119.000000 
+130.000000 137.000000 137.000000 131.000000 125.000000 119.000000 
+114.000000 110.000000 112.000000 121.000000 129.000000 143.000000 
+176.000000 225.000000 273.000000 279.000000 233.000000 171.000000 
+128.000000 111.000000 112.000000 122.000000 130.000000 133.000000 
+133.000000 135.000000 138.000000 140.000000 141.000000 141.000000 
+135.000000 127.000000 124.000000 126.000000 127.000000 126.000000 
+125.000000 124.000000 126.000000 130.000000 134.000000 133.000000 
+127.000000 122.000000 123.000000 126.000000 131.000000 139.000000 
+143.000000 141.000000 135.000000 134.000000 136.000000 135.000000 
+128.000000 123.000000 118.000000 103.000000 74.000000 43.000000 
+62.000000 177.000000 282.000000 288.000000 200.000000 114.000000 
+88.000000 103.000000 131.000000 137.000000 124.000000 116.000000 
+119.000000 118.000000 114.000000 119.000000 135.000000 145.000000 
+137.000000 123.000000 118.000000 119.000000 112.000000 103.000000 
+111.000000 134.000000 155.000000 159.000000 183.000000 235.000000 
+265.000000 231.000000 155.000000 95.000000 80.000000 91.000000 
+104.000000 113.000000 121.000000 125.000000 127.000000 133.000000 
+142.000000 147.000000 146.000000 141.000000 132.000000 119.000000 
+112.000000 115.000000 123.000000 125.000000 123.000000 121.000000 
+122.000000 125.000000 130.000000 131.000000 127.000000 122.000000 
+124.000000 133.000000 142.000000 146.000000 143.000000 136.000000 
+131.000000 130.000000 135.000000 138.000000 130.000000 117.000000 
+105.000000 89.000000 101.000000 62.000000 43.000000 114.000000 
+240.000000 295.000000 244.000000 154.000000 104.000000 97.000000 
+119.000000 139.000000 134.000000 120.000000 116.000000 119.000000 
+118.000000 116.000000 122.000000 130.000000 130.000000 124.000000 
+120.000000 115.000000 109.000000 110.000000 122.000000 141.000000 
+160.000000 178.000000 204.000000 211.000000 179.000000 140.000000 
+110.000000 93.000000 84.000000 73.000000 70.000000 94.000000 
+128.000000 143.000000 140.000000 137.000000 141.000000 144.000000 
+139.000000 135.000000 134.000000 128.000000 115.000000 109.000000 
+114.000000 120.000000 117.000000 112.000000 115.000000 122.000000 
+125.000000 121.000000 116.000000 117.000000 125.000000 136.000000 
+143.000000 142.000000 134.000000 127.000000 126.000000 125.000000 
+125.000000 126.000000 127.000000 120.000000 100.000000 72.000000 
+118.000000 92.000000 55.000000 68.000000 175.000000 275.000000 
+283.000000 211.000000 134.000000 108.000000 120.000000 138.000000 
+136.000000 120.000000 114.000000 120.000000 124.000000 120.000000 
+119.000000 126.000000 134.000000 134.000000 123.000000 109.000000 
+106.000000 118.000000 137.000000 155.000000 172.000000 190.000000 
+195.000000 163.000000 109.000000 83.000000 101.000000 132.000000 
+138.000000 120.000000 107.000000 107.000000 132.000000 174.000000 
+183.000000 155.000000 130.000000 126.000000 129.000000 129.000000 
+131.000000 133.000000 127.000000 116.000000 110.000000 113.000000 
+120.000000 126.000000 130.000000 132.000000 128.000000 122.000000 
+120.000000 125.000000 134.000000 141.000000 142.000000 137.000000 
+128.000000 125.000000 128.000000 132.000000 131.000000 130.000000 
+131.000000 127.000000 107.000000 79.000000 131.000000 109.000000 
+71.000000 49.000000 107.000000 217.000000 278.000000 251.000000 
+175.000000 121.000000 111.000000 125.000000 134.000000 131.000000 
+122.000000 118.000000 117.000000 117.000000 121.000000 129.000000 
+139.000000 141.000000 132.000000 114.000000 103.000000 114.000000 
+142.000000 169.000000 179.000000 171.000000 149.000000 125.000000 
+118.000000 115.000000 123.000000 135.000000 143.000000 148.000000 
+152.000000 130.000000 116.000000 148.000000 168.000000 149.000000 
+123.000000 120.000000 134.000000 140.000000 134.000000 131.000000 
+133.000000 132.000000 127.000000 124.000000 125.000000 127.000000 
+128.000000 127.000000 125.000000 124.000000 126.000000 130.000000 
+135.000000 135.000000 135.000000 134.000000 131.000000 126.000000 
+121.000000 120.000000 126.000000 145.000000 167.000000 169.000000 
+140.000000 99.000000 139.000000 122.000000 93.000000 62.000000 
+75.000000 153.000000 231.000000 251.000000 206.000000 139.000000 
+104.000000 110.000000 134.000000 144.000000 136.000000 125.000000 
+124.000000 131.000000 135.000000 131.000000 129.000000 132.000000 
+134.000000 128.000000 119.000000 120.000000 133.000000 143.000000 
+140.000000 130.000000 117.000000 117.000000 137.000000 153.000000 
+148.000000 129.000000 114.000000 108.000000 108.000000 107.000000 
+105.000000 117.000000 132.000000 134.000000 127.000000 127.000000 
+138.000000 145.000000 137.000000 127.000000 126.000000 130.000000 
+129.000000 123.000000 119.000000 117.000000 118.000000 121.000000 
+124.000000 127.000000 131.000000 136.000000 140.000000 138.000000 
+133.000000 130.000000 124.000000 114.000000 112.000000 132.000000 
+176.000000 227.000000 262.000000 262.000000 225.000000 169.000000 
+135.000000 134.000000 120.000000 84.000000 58.000000 87.000000 
+157.000000 215.000000 221.000000 175.000000 121.000000 101.000000 
+114.000000 134.000000 144.000000 143.000000 141.000000 141.000000 
+136.000000 124.000000 113.000000 109.000000 114.000000 120.000000 
+123.000000 123.000000 122.000000 117.000000 106.000000 93.000000 
+82.000000 80.000000 89.000000 102.000000 115.000000 123.000000 
+118.000000 105.000000 94.000000 92.000000 96.000000 104.000000 
+118.000000 131.000000 135.000000 131.000000 129.000000 133.000000 
+134.000000 133.000000 131.000000 128.000000 122.000000 117.000000 
+117.000000 121.000000 123.000000 125.000000 132.000000 143.000000 
+147.000000 142.000000 134.000000 131.000000 129.000000 125.000000 
+120.000000 122.000000 141.000000 175.000000 209.000000 231.000000 
+244.000000 265.000000 286.000000 276.000000 129.000000 135.000000 
+129.000000 102.000000 65.000000 49.000000 79.000000 140.000000 
+187.000000 191.000000 164.000000 134.000000 123.000000 126.000000 
+133.000000 135.000000 133.000000 131.000000 131.000000 132.000000 
+129.000000 121.000000 112.000000 105.000000 107.000000 112.000000 
+112.000000 106.000000 96.000000 80.000000 63.000000 57.000000 
+64.000000 81.000000 102.000000 113.000000 111.000000 97.000000 
+88.000000 91.000000 101.000000 108.000000 115.000000 127.000000 
+140.000000 142.000000 134.000000 128.000000 128.000000 132.000000 
+132.000000 127.000000 123.000000 122.000000 125.000000 126.000000 
+127.000000 128.000000 134.000000 142.000000 146.000000 141.000000 
+134.000000 130.000000 129.000000 128.000000 130.000000 140.000000 
+149.000000 145.000000 126.000000 105.000000 99.000000 117.000000 
+153.000000 194.000000 129.000000 132.000000 135.000000 130.000000 
+110.000000 75.000000 50.000000 60.000000 101.000000 145.000000 
+168.000000 166.000000 152.000000 136.000000 129.000000 131.000000 
+137.000000 140.000000 143.000000 156.000000 175.000000 182.000000 
+167.000000 139.000000 118.000000 103.000000 87.000000 73.000000 
+69.000000 73.000000 85.000000 94.000000 97.000000 100.000000 
+109.000000 115.000000 108.000000 93.000000 86.000000 90.000000 
+97.000000 96.000000 98.000000 110.000000 128.000000 137.000000 
+132.000000 125.000000 129.000000 137.000000 137.000000 128.000000 
+122.000000 126.000000 131.000000 132.000000 131.000000 132.000000 
+130.000000 127.000000 127.000000 131.000000 137.000000 137.000000 
+130.000000 122.000000 122.000000 131.000000 136.000000 124.000000 
+99.000000 76.000000 62.000000 45.000000 25.000000 36.000000 
+129.000000 134.000000 143.000000 151.000000 144.000000 120.000000 
+86.000000 61.000000 61.000000 84.000000 109.000000 121.000000 
+119.000000 113.000000 116.000000 126.000000 132.000000 138.000000 
+162.000000 204.000000 253.000000 269.000000 233.000000 171.000000 
+122.000000 91.000000 70.000000 61.000000 66.000000 87.000000 
+110.000000 116.000000 104.000000 93.000000 92.000000 95.000000 
+92.000000 90.000000 89.000000 85.000000 75.000000 63.000000 
+64.000000 82.000000 100.000000 110.000000 120.000000 134.000000 
+148.000000 151.000000 141.000000 128.000000 123.000000 127.000000 
+132.000000 130.000000 127.000000 127.000000 127.000000 125.000000 
+124.000000 130.000000 136.000000 132.000000 122.000000 117.000000 
+124.000000 137.000000 140.000000 121.000000 88.000000 65.000000 
+69.000000 93.000000 100.000000 73.000000 128.000000 130.000000 
+131.000000 134.000000 138.000000 137.000000 128.000000 114.000000 
+99.000000 91.000000 87.000000 87.000000 87.000000 87.000000 
+84.000000 81.000000 88.000000 122.000000 183.000000 231.000000 
+244.000000 215.000000 161.000000 113.000000 83.000000 67.000000 
+62.000000 74.000000 98.000000 120.000000 121.000000 103.000000 
+79.000000 60.000000 51.000000 52.000000 62.000000 81.000000 
+97.000000 95.000000 82.000000 71.000000 65.000000 72.000000 
+82.000000 87.000000 94.000000 108.000000 122.000000 133.000000 
+138.000000 138.000000 136.000000 131.000000 124.000000 120.000000 
+121.000000 127.000000 134.000000 136.000000 134.000000 132.000000 
+130.000000 127.000000 127.000000 132.000000 133.000000 123.000000 
+111.000000 106.000000 109.000000 113.000000 114.000000 119.000000 
+125.000000 116.000000 128.000000 131.000000 127.000000 123.000000 
+126.000000 135.000000 140.000000 134.000000 123.000000 109.000000 
+94.000000 83.000000 78.000000 75.000000 70.000000 71.000000 
+89.000000 126.000000 157.000000 156.000000 124.000000 86.000000 
+62.000000 59.000000 57.000000 57.000000 71.000000 99.000000 
+124.000000 134.000000 126.000000 104.000000 78.000000 57.000000 
+43.000000 39.000000 53.000000 86.000000 117.000000 121.000000 
+95.000000 69.000000 61.000000 76.000000 103.000000 121.000000 
+129.000000 132.000000 135.000000 139.000000 144.000000 142.000000 
+128.000000 114.000000 114.000000 123.000000 125.000000 123.000000 
+125.000000 132.000000 131.000000 119.000000 111.000000 113.000000 
+119.000000 117.000000 107.000000 104.000000 119.000000 142.000000 
+151.000000 142.000000 129.000000 132.000000 142.000000 140.000000 
+135.000000 136.000000 131.000000 126.000000 128.000000 134.000000 
+135.000000 127.000000 116.000000 108.000000 104.000000 96.000000 
+83.000000 69.000000 63.000000 77.000000 103.000000 114.000000 
+103.000000 83.000000 71.000000 71.000000 68.000000 60.000000 
+61.000000 79.000000 106.000000 128.000000 142.000000 147.000000 
+140.000000 117.000000 88.000000 69.000000 61.000000 58.000000 
+63.000000 88.000000 125.000000 147.000000 135.000000 103.000000 
+86.000000 97.000000 133.000000 187.000000 248.000000 292.000000 
+286.000000 228.000000 158.000000 109.000000 89.000000 90.000000 
+96.000000 97.000000 92.000000 92.000000 101.000000 111.000000 
+111.000000 101.000000 96.000000 103.000000 110.000000 103.000000 
+98.000000 114.000000 143.000000 160.000000 154.000000 135.000000 
+124.000000 129.000000 139.000000 139.000000 144.000000 142.000000 
+137.000000 129.000000 122.000000 120.000000 124.000000 128.000000 
+125.000000 117.000000 113.000000 115.000000 115.000000 100.000000 
+78.000000 69.000000 76.000000 81.000000 76.000000 65.000000 
+58.000000 63.000000 76.000000 90.000000 105.000000 120.000000 
+128.000000 132.000000 137.000000 145.000000 147.000000 135.000000 
+111.000000 91.000000 83.000000 81.000000 85.000000 102.000000 
+127.000000 144.000000 143.000000 127.000000 109.000000 102.000000 
+117.000000 165.000000 241.000000 310.000000 322.000000 254.000000 
+145.000000 77.000000 66.000000 76.000000 77.000000 69.000000 
+70.000000 82.000000 92.000000 92.000000 85.000000 83.000000 
+87.000000 95.000000 101.000000 105.000000 119.000000 140.000000 
+154.000000 154.000000 144.000000 131.000000 123.000000 124.000000 
+132.000000 137.000000 136.000000 136.000000 135.000000 134.000000 
+131.000000 125.000000 121.000000 120.000000 122.000000 123.000000 
+118.000000 115.000000 116.000000 118.000000 114.000000 101.000000 
+89.000000 87.000000 85.000000 77.000000 75.000000 88.000000 
+114.000000 132.000000 134.000000 132.000000 133.000000 137.000000 
+141.000000 144.000000 147.000000 143.000000 133.000000 123.000000 
+120.000000 125.000000 132.000000 136.000000 140.000000 141.000000 
+140.000000 133.000000 122.000000 112.000000 113.000000 130.000000 
+158.000000 174.000000 155.000000 106.000000 58.000000 61.000000 
+77.000000 78.000000 76.000000 87.000000 107.000000 112.000000 
+102.000000 93.000000 94.000000 100.000000 104.000000 107.000000 
+113.000000 123.000000 133.000000 140.000000 144.000000 144.000000 
+140.000000 134.000000 131.000000 129.000000 131.000000 134.000000 
+140.000000 139.000000 135.000000 131.000000 130.000000 128.000000 
+123.000000 120.000000 122.000000 127.000000 131.000000 128.000000 
+123.000000 124.000000 130.000000 136.000000 133.000000 117.000000 
+99.000000 95.000000 109.000000 128.000000 134.000000 131.000000 
+129.000000 134.000000 141.000000 140.000000 135.000000 135.000000 
+138.000000 139.000000 134.000000 128.000000 129.000000 140.000000 
+150.000000 150.000000 140.000000 132.000000 135.000000 143.000000 
+144.000000 133.000000 117.000000 102.000000 93.000000 81.000000 
+58.000000 36.000000 37.000000 56.000000 77.000000 92.000000 
+97.000000 97.000000 100.000000 105.000000 111.000000 116.000000 
+120.000000 121.000000 120.000000 121.000000 126.000000 132.000000 
+135.000000 134.000000 132.000000 130.000000 129.000000 129.000000 
+131.000000 131.000000 128.000000 126.000000 141.000000 133.000000 
+125.000000 125.000000 129.000000 131.000000 128.000000 123.000000 
+120.000000 125.000000 135.000000 145.000000 144.000000 132.000000 
+119.000000 114.000000 113.000000 113.000000 112.000000 118.000000 
+129.000000 133.000000 128.000000 123.000000 125.000000 131.000000 
+133.000000 129.000000 126.000000 130.000000 137.000000 136.000000 
+123.000000 108.000000 103.000000 114.000000 129.000000 137.000000 
+136.000000 134.000000 134.000000 139.000000 144.000000 139.000000 
+117.000000 85.000000 61.000000 60.000000 70.000000 70.000000 
+65.000000 69.000000 89.000000 109.000000 110.000000 101.000000 
+102.000000 116.000000 127.000000 124.000000 120.000000 126.000000 
+136.000000 133.000000 121.000000 120.000000 133.000000 145.000000 
+141.000000 127.000000 120.000000 123.000000 128.000000 127.000000 
+122.000000 122.000000 152.000000 146.000000 138.000000 132.000000 
+129.000000 128.000000 125.000000 121.000000 117.000000 117.000000 
+124.000000 134.000000 141.000000 140.000000 135.000000 129.000000 
+124.000000 119.000000 115.000000 115.000000 121.000000 130.000000 
+134.000000 131.000000 123.000000 117.000000 115.000000 116.000000 
+120.000000 127.000000 135.000000 137.000000 130.000000 119.000000 
+114.000000 117.000000 122.000000 126.000000 130.000000 132.000000 
+132.000000 130.000000 133.000000 138.000000 135.000000 116.000000 
+87.000000 72.000000 77.000000 90.000000 103.000000 113.000000 
+123.000000 131.000000 132.000000 131.000000 129.000000 127.000000 
+123.000000 121.000000 126.000000 135.000000 135.000000 127.000000 
+121.000000 126.000000 137.000000 140.000000 132.000000 124.000000 
+123.000000 130.000000 136.000000 135.000000 129.000000 125.000000 
+143.000000 137.000000 132.000000 131.000000 132.000000 130.000000 
+125.000000 121.000000 120.000000 123.000000 131.000000 140.000000 
+145.000000 142.000000 133.000000 125.000000 124.000000 127.000000 
+130.000000 131.000000 133.000000 134.000000 132.000000 122.000000 
+107.000000 96.000000 97.000000 107.000000 120.000000 132.000000 
+139.000000 139.000000 130.000000 116.000000 107.000000 109.000000 
+122.000000 135.000000 139.000000 132.000000 123.000000 120.000000 
+126.000000 136.000000 144.000000 143.000000 129.000000 107.000000 
+93.000000 91.000000 96.000000 106.000000 117.000000 127.000000 
+132.000000 132.000000 129.000000 128.000000 131.000000 133.000000 
+133.000000 129.000000 127.000000 127.000000 129.000000 130.000000 
+132.000000 131.000000 129.000000 128.000000 128.000000 130.000000 
+130.000000 128.000000 124.000000 123.000000 136.000000 133.000000 
+131.000000 129.000000 128.000000 128.000000 128.000000 128.000000 
+127.000000 129.000000 135.000000 143.000000 147.000000 146.000000 
+140.000000 132.000000 129.000000 130.000000 131.000000 129.000000 
+128.000000 128.000000 123.000000 111.000000 98.000000 92.000000 
+96.000000 106.000000 114.000000 123.000000 132.000000 133.000000 
+126.000000 115.000000 110.000000 115.000000 127.000000 137.000000 
+134.000000 122.000000 110.000000 108.000000 115.000000 122.000000 
+128.000000 134.000000 134.000000 119.000000 96.000000 82.000000 
+92.000000 111.000000 120.000000 118.000000 119.000000 128.000000 
+135.000000 133.000000 127.000000 127.000000 133.000000 135.000000 
+134.000000 133.000000 133.000000 132.000000 130.000000 128.000000 
+129.000000 131.000000 133.000000 134.000000 133.000000 130.000000 
+127.000000 127.000000 140.000000 138.000000 132.000000 127.000000 
+126.000000 128.000000 130.000000 130.000000 130.000000 131.000000 
+133.000000 136.000000 139.000000 140.000000 138.000000 135.000000 
+132.000000 130.000000 126.000000 120.000000 116.000000 111.000000 
+96.000000 79.000000 70.000000 75.000000 85.000000 94.000000 
+105.000000 121.000000 133.000000 134.000000 123.000000 114.000000 
+116.000000 126.000000 133.000000 131.000000 123.000000 113.000000 
+107.000000 105.000000 108.000000 115.000000 122.000000 128.000000 
+126.000000 115.000000 101.000000 96.000000 103.000000 113.000000 
+116.000000 115.000000 116.000000 123.000000 128.000000 128.000000 
+126.000000 127.000000 131.000000 135.000000 136.000000 135.000000 
+133.000000 130.000000 128.000000 129.000000 130.000000 130.000000 
+131.000000 134.000000 137.000000 136.000000 129.000000 124.000000 
+138.000000 136.000000 132.000000 129.000000 128.000000 128.000000 
+127.000000 127.000000 128.000000 130.000000 133.000000 135.000000 
+136.000000 134.000000 133.000000 131.000000 131.000000 129.000000 
+123.000000 113.000000 102.000000 91.000000 81.000000 77.000000 
+74.000000 73.000000 76.000000 89.000000 111.000000 131.000000 
+137.000000 134.000000 126.000000 121.000000 124.000000 134.000000 
+143.000000 143.000000 128.000000 111.000000 98.000000 92.000000 
+92.000000 102.000000 116.000000 125.000000 123.000000 115.000000 
+109.000000 110.000000 112.000000 111.000000 113.000000 120.000000 
+124.000000 122.000000 119.000000 120.000000 123.000000 125.000000 
+125.000000 129.000000 136.000000 139.000000 138.000000 134.000000 
+133.000000 133.000000 133.000000 132.000000 129.000000 127.000000 
+126.000000 127.000000 129.000000 131.000000 140.000000 139.000000 
+133.000000 127.000000 124.000000 126.000000 129.000000 128.000000 
+124.000000 122.000000 125.000000 132.000000 138.000000 140.000000 
+141.000000 139.000000 132.000000 122.000000 114.000000 112.000000 
+110.000000 100.000000 86.000000 82.000000 90.000000 100.000000 
+106.000000 112.000000 122.000000 133.000000 138.000000 135.000000 
+127.000000 123.000000 127.000000 140.000000 150.000000 147.000000 
+130.000000 109.000000 98.000000 94.000000 91.000000 91.000000 
+98.000000 108.000000 112.000000 106.000000 104.000000 112.000000 
+121.000000 121.000000 114.000000 113.000000 120.000000 128.000000 
+129.000000 124.000000 119.000000 117.000000 120.000000 128.000000 
+134.000000 133.000000 129.000000 128.000000 131.000000 133.000000 
+131.000000 127.000000 125.000000 126.000000 128.000000 129.000000 
+127.000000 124.000000 132.000000 128.000000 127.000000 130.000000 
+134.000000 134.000000 131.000000 128.000000 127.000000 129.000000 
+134.000000 138.000000 140.000000 140.000000 138.000000 133.000000 
+125.000000 117.000000 117.000000 123.000000 124.000000 112.000000 
+95.000000 88.000000 93.000000 101.000000 108.000000 118.000000 
+134.000000 148.000000 147.000000 136.000000 127.000000 125.000000 
+131.000000 138.000000 142.000000 139.000000 127.000000 115.000000 
+109.000000 106.000000 99.000000 89.000000 84.000000 86.000000 
+90.000000 95.000000 106.000000 120.000000 129.000000 128.000000 
+122.000000 121.000000 125.000000 129.000000 129.000000 125.000000 
+121.000000 118.000000 120.000000 126.000000 132.000000 132.000000 
+128.000000 127.000000 131.000000 137.000000 135.000000 127.000000 
+120.000000 120.000000 126.000000 128.000000 123.000000 117.000000 
+136.000000 128.000000 121.000000 119.000000 123.000000 124.000000 
+122.000000 123.000000 129.000000 138.000000 142.000000 142.000000 
+139.000000 137.000000 133.000000 128.000000 124.000000 123.000000 
+122.000000 116.000000 106.000000 99.000000 104.000000 118.000000 
+130.000000 133.000000 133.000000 135.000000 138.000000 139.000000 
+137.000000 133.000000 130.000000 128.000000 127.000000 127.000000 
+127.000000 125.000000 124.000000 125.000000 125.000000 117.000000 
+104.000000 94.000000 90.000000 91.000000 94.000000 101.000000 
+116.000000 130.000000 135.000000 129.000000 122.000000 121.000000 
+124.000000 127.000000 129.000000 129.000000 126.000000 123.000000 
+122.000000 123.000000 123.000000 121.000000 119.000000 122.000000 
+130.000000 135.000000 132.000000 127.000000 125.000000 127.000000 
+128.000000 125.000000 121.000000 122.000000 124.000000 122.000000 
+123.000000 125.000000 128.000000 128.000000 128.000000 130.000000 
+134.000000 137.000000 139.000000 143.000000 145.000000 141.000000 
+133.000000 127.000000 127.000000 127.000000 122.000000 116.000000 
+118.000000 129.000000 141.000000 148.000000 152.000000 150.000000 
+143.000000 137.000000 135.000000 138.000000 137.000000 133.000000 
+130.000000 131.000000 135.000000 136.000000 132.000000 129.000000 
+128.000000 125.000000 119.000000 108.000000 99.000000 99.000000 
+106.000000 115.000000 117.000000 117.000000 122.000000 131.000000 
+135.000000 128.000000 119.000000 120.000000 130.000000 137.000000 
+135.000000 127.000000 122.000000 123.000000 127.000000 130.000000 
+127.000000 118.000000 112.000000 117.000000 128.000000 136.000000 
+136.000000 132.000000 129.000000 130.000000 133.000000 136.000000 
+135.000000 130.000000 116.000000 121.000000 127.000000 128.000000 
+127.000000 123.000000 118.000000 116.000000 122.000000 134.000000 
+143.000000 142.000000 138.000000 135.000000 136.000000 136.000000 
+133.000000 130.000000 130.000000 136.000000 143.000000 144.000000 
+142.000000 140.000000 140.000000 139.000000 136.000000 133.000000 
+133.000000 135.000000 135.000000 133.000000 132.000000 130.000000 
+129.000000 130.000000 133.000000 139.000000 142.000000 137.000000 
+126.000000 117.000000 117.000000 120.000000 117.000000 109.000000 
+106.000000 114.000000 129.000000 137.000000 133.000000 125.000000 
+126.000000 134.000000 139.000000 136.000000 130.000000 122.000000 
+118.000000 121.000000 131.000000 141.000000 141.000000 132.000000 
+124.000000 123.000000 126.000000 128.000000 129.000000 132.000000 
+135.000000 137.000000 137.000000 138.000000 136.000000 131.000000 
+121.000000 123.000000 122.000000 120.000000 120.000000 123.000000 
+124.000000 125.000000 127.000000 132.000000 135.000000 133.000000 
+134.000000 140.000000 145.000000 138.000000 128.000000 126.000000 
+134.000000 139.000000 134.000000 129.000000 130.000000 136.000000 
+137.000000 133.000000 129.000000 130.000000 132.000000 135.000000 
+138.000000 139.000000 136.000000 130.000000 127.000000 130.000000 
+135.000000 137.000000 137.000000 137.000000 138.000000 137.000000 
+136.000000 136.000000 132.000000 122.000000 115.000000 117.000000 
+125.000000 130.000000 128.000000 127.000000 130.000000 133.000000 
+130.000000 124.000000 120.000000 120.000000 123.000000 126.000000 
+129.000000 134.000000 134.000000 131.000000 127.000000 127.000000 
+129.000000 130.000000 128.000000 127.000000 130.000000 135.000000 
+139.000000 139.000000 137.000000 135.000000 125.000000 129.000000 
+132.000000 131.000000 128.000000 126.000000 125.000000 122.000000 
+119.000000 119.000000 124.000000 131.000000 136.000000 138.000000 
+137.000000 136.000000 137.000000 138.000000 138.000000 136.000000 
+132.000000 130.000000 127.000000 125.000000 125.000000 127.000000 
+131.000000 132.000000 134.000000 136.000000 139.000000 141.000000 
+142.000000 144.000000 144.000000 141.000000 135.000000 130.000000 
+130.000000 133.000000 136.000000 140.000000 142.000000 139.000000 
+131.000000 125.000000 126.000000 130.000000 134.000000 134.000000 
+134.000000 133.000000 132.000000 132.000000 129.000000 122.000000 
+113.000000 110.000000 118.000000 131.000000 139.000000 139.000000 
+138.000000 139.000000 139.000000 136.000000 130.000000 126.000000 
+128.000000 133.000000 138.000000 139.000000 136.000000 130.000000 
+125.000000 124.000000 138.000000 144.000000 144.000000 135.000000 
+124.000000 118.000000 118.000000 119.000000 120.000000 121.000000 
+124.000000 130.000000 135.000000 139.000000 140.000000 142.000000 
+143.000000 142.000000 139.000000 134.000000 129.000000 124.000000 
+121.000000 122.000000 125.000000 127.000000 127.000000 127.000000 
+130.000000 136.000000 140.000000 144.000000 149.000000 153.000000 
+150.000000 142.000000 136.000000 138.000000 140.000000 134.000000 
+128.000000 129.000000 136.000000 140.000000 134.000000 127.000000 
+124.000000 127.000000 131.000000 131.000000 129.000000 125.000000 
+121.000000 122.000000 131.000000 137.000000 134.000000 126.000000 
+124.000000 130.000000 134.000000 134.000000 135.000000 140.000000 
+145.000000 139.000000 128.000000 123.000000 126.000000 134.000000 
+137.000000 136.000000 133.000000 130.000000 129.000000 129.000000 
+134.000000 136.000000 134.000000 129.000000 125.000000 125.000000 
+125.000000 125.000000 124.000000 126.000000 129.000000 130.000000 
+130.000000 133.000000 139.000000 144.000000 143.000000 137.000000 
+133.000000 131.000000 129.000000 126.000000 121.000000 121.000000 
+125.000000 128.000000 128.000000 125.000000 124.000000 128.000000 
+140.000000 151.000000 152.000000 142.000000 129.000000 124.000000 
+131.000000 139.000000 135.000000 124.000000 121.000000 129.000000 
+137.000000 137.000000 132.000000 127.000000 128.000000 133.000000 
+137.000000 136.000000 130.000000 121.000000 118.000000 124.000000 
+132.000000 132.000000 124.000000 119.000000 123.000000 132.000000 
+135.000000 132.000000 129.000000 130.000000 131.000000 129.000000 
+124.000000 123.000000 128.000000 136.000000 142.000000 142.000000 
+137.000000 130.000000 126.000000 126.000000 131.000000 132.000000 
+129.000000 123.000000 118.000000 118.000000 123.000000 129.000000 
+131.000000 130.000000 130.000000 132.000000 135.000000 137.000000 
+140.000000 141.000000 139.000000 137.000000 137.000000 132.000000 
+124.000000 117.000000 120.000000 130.000000 135.000000 130.000000 
+121.000000 115.000000 117.000000 125.000000 134.000000 139.000000 
+135.000000 124.000000 119.000000 128.000000 142.000000 146.000000 
+137.000000 126.000000 124.000000 130.000000 135.000000 133.000000 
+130.000000 130.000000 135.000000 137.000000 135.000000 130.000000 
+126.000000 124.000000 125.000000 130.000000 134.000000 136.000000 
+134.000000 130.000000 126.000000 125.000000 126.000000 126.000000 
+124.000000 121.000000 122.000000 124.000000 125.000000 125.000000 
+129.000000 135.000000 139.000000 136.000000 128.000000 123.000000 
+126.000000 132.000000 118.000000 118.000000 125.000000 124.000000 
+117.000000 114.000000 122.000000 130.000000 132.000000 130.000000 
+133.000000 137.000000 137.000000 134.000000 133.000000 136.000000 
+137.000000 133.000000 130.000000 131.000000 133.000000 134.000000 
+131.000000 127.000000 122.000000 118.000000 118.000000 119.000000 
+121.000000 125.000000 136.000000 147.000000 148.000000 138.000000 
+129.000000 128.000000 135.000000 140.000000 137.000000 132.000000 
+128.000000 128.000000 131.000000 132.000000 131.000000 131.000000 
+136.000000 143.000000 144.000000 137.000000 128.000000 126.000000 
+131.000000 135.000000 134.000000 133.000000 134.000000 135.000000 
+133.000000 127.000000 123.000000 123.000000 124.000000 127.000000 
+130.000000 130.000000 126.000000 121.000000 121.000000 128.000000 
+134.000000 135.000000 133.000000 132.000000 132.000000 131.000000 
+117.000000 121.000000 124.000000 119.000000 114.000000 118.000000 
+130.000000 135.000000 128.000000 121.000000 124.000000 132.000000 
+135.000000 133.000000 134.000000 138.000000 138.000000 134.000000 
+131.000000 134.000000 138.000000 135.000000 128.000000 125.000000 
+127.000000 130.000000 130.000000 129.000000 130.000000 130.000000 
+133.000000 139.000000 142.000000 138.000000 132.000000 129.000000 
+133.000000 139.000000 139.000000 134.000000 128.000000 127.000000 
+132.000000 136.000000 135.000000 132.000000 132.000000 136.000000 
+139.000000 137.000000 130.000000 124.000000 121.000000 122.000000 
+126.000000 131.000000 134.000000 133.000000 131.000000 130.000000 
+129.000000 126.000000 122.000000 119.000000 120.000000 123.000000 
+128.000000 132.000000 132.000000 130.000000 130.000000 134.000000 
+139.000000 139.000000 134.000000 130.000000 130.000000 119.000000 
+105.000000 95.000000 95.000000 105.000000 115.000000 120.000000 
+121.000000 123.000000 128.000000 132.000000 135.000000 137.000000 
+139.000000 139.000000 137.000000 135.000000 133.000000 132.000000 
+131.000000 130.000000 130.000000 131.000000 133.000000 135.000000 
+136.000000 135.000000 134.000000 132.000000 129.000000 129.000000 
+132.000000 135.000000 136.000000 133.000000 132.000000 137.000000 
+142.000000 143.000000 138.000000 133.000000 132.000000 133.000000 
+133.000000 134.000000 137.000000 141.000000 141.000000 137.000000 
+131.000000 126.000000 124.000000 126.000000 131.000000 137.000000 
+141.000000 141.000000 137.000000 132.000000 126.000000 122.000000 
+119.000000 119.000000 121.000000 124.000000 128.000000 132.000000 
+134.000000 132.000000 128.000000 126.000000 128.000000 132.000000 
+134.000000 133.000000 117.000000 114.000000 102.000000 88.000000 
+83.000000 91.000000 104.000000 116.000000 123.000000 126.000000 
+127.000000 128.000000 132.000000 138.000000 140.000000 136.000000 
+130.000000 129.000000 131.000000 134.000000 135.000000 136.000000 
+137.000000 139.000000 139.000000 136.000000 131.000000 128.000000 
+127.000000 130.000000 131.000000 130.000000 129.000000 131.000000 
+132.000000 133.000000 135.000000 139.000000 142.000000 140.000000 
+134.000000 132.000000 134.000000 135.000000 133.000000 129.000000 
+130.000000 135.000000 139.000000 137.000000 132.000000 130.000000 
+132.000000 136.000000 138.000000 137.000000 134.000000 131.000000 
+131.000000 132.000000 132.000000 131.000000 128.000000 123.000000 
+118.000000 117.000000 121.000000 125.000000 124.000000 119.000000 
+115.000000 119.000000 128.000000 134.000000 136.000000 133.000000 
+106.000000 116.000000 122.000000 118.000000 110.000000 105.000000 
+106.000000 116.000000 126.000000 130.000000 130.000000 131.000000 
+137.000000 139.000000 134.000000 127.000000 127.000000 134.000000 
+140.000000 140.000000 136.000000 134.000000 135.000000 138.000000 
+140.000000 139.000000 134.000000 128.000000 127.000000 130.000000 
+132.000000 129.000000 125.000000 126.000000 133.000000 139.000000 
+140.000000 137.000000 134.000000 135.000000 135.000000 136.000000 
+135.000000 133.000000 132.000000 133.000000 136.000000 137.000000 
+135.000000 131.000000 129.000000 130.000000 134.000000 141.000000 
+142.000000 138.000000 131.000000 128.000000 129.000000 132.000000 
+132.000000 128.000000 124.000000 122.000000 120.000000 121.000000 
+126.000000 133.000000 135.000000 131.000000 125.000000 124.000000 
+126.000000 127.000000 126.000000 126.000000 121.000000 124.000000 
+121.000000 119.000000 122.000000 122.000000 119.000000 121.000000 
+130.000000 137.000000 137.000000 135.000000 138.000000 141.000000 
+137.000000 131.000000 130.000000 136.000000 140.000000 140.000000 
+137.000000 136.000000 136.000000 135.000000 134.000000 133.000000 
+130.000000 126.000000 126.000000 131.000000 135.000000 133.000000 
+125.000000 121.000000 123.000000 128.000000 131.000000 132.000000 
+134.000000 136.000000 137.000000 137.000000 137.000000 136.000000 
+134.000000 132.000000 133.000000 136.000000 140.000000 140.000000 
+135.000000 131.000000 134.000000 141.000000 142.000000 135.000000 
+128.000000 128.000000 134.000000 137.000000 132.000000 124.000000 
+119.000000 118.000000 120.000000 125.000000 136.000000 144.000000 
+144.000000 135.000000 130.000000 132.000000 136.000000 134.000000 
+130.000000 130.000000 126.000000 121.000000 123.000000 128.000000 
+129.000000 123.000000 118.000000 119.000000 126.000000 133.000000 
+135.000000 132.000000 131.000000 132.000000 133.000000 133.000000 
+131.000000 132.000000 136.000000 140.000000 142.000000 140.000000 
+138.000000 134.000000 128.000000 122.000000 122.000000 128.000000 
+133.000000 131.000000 126.000000 123.000000 127.000000 130.000000 
+129.000000 126.000000 125.000000 126.000000 126.000000 128.000000 
+134.000000 142.000000 148.000000 146.000000 138.000000 129.000000 
+127.000000 131.000000 136.000000 138.000000 135.000000 135.000000 
+138.000000 140.000000 135.000000 125.000000 115.000000 111.000000 
+115.000000 122.000000 127.000000 128.000000 126.000000 124.000000 
+125.000000 127.000000 128.000000 127.000000 122.000000 118.000000 
+119.000000 122.000000 126.000000 127.000000 127.000000 126.000000 
+132.000000 135.000000 128.000000 119.000000 115.000000 119.000000 
+124.000000 126.000000 127.000000 130.000000 133.000000 135.000000 
+136.000000 138.000000 139.000000 134.000000 128.000000 126.000000 
+133.000000 143.000000 147.000000 144.000000 137.000000 130.000000 
+127.000000 127.000000 129.000000 129.000000 128.000000 126.000000 
+128.000000 131.000000 132.000000 127.000000 122.000000 123.000000 
+129.000000 136.000000 135.000000 131.000000 131.000000 136.000000 
+139.000000 136.000000 129.000000 127.000000 130.000000 134.000000 
+133.000000 130.000000 128.000000 128.000000 127.000000 126.000000 
+127.000000 129.000000 126.000000 118.000000 111.000000 112.000000 
+119.000000 126.000000 128.000000 129.000000 128.000000 127.000000 
+123.000000 121.000000 125.000000 131.000000 132.000000 127.000000 
+121.000000 118.000000 119.000000 122.000000 90.000000 101.000000 
+106.000000 113.000000 120.000000 121.000000 119.000000 121.000000 
+129.000000 134.000000 131.000000 127.000000 128.000000 130.000000 
+127.000000 117.000000 106.000000 104.000000 116.000000 131.000000 
+136.000000 133.000000 130.000000 128.000000 127.000000 129.000000 
+130.000000 128.000000 122.000000 120.000000 122.000000 125.000000 
+126.000000 126.000000 128.000000 129.000000 129.000000 129.000000 
+128.000000 127.000000 125.000000 124.000000 123.000000 121.000000 
+123.000000 129.000000 134.000000 133.000000 130.000000 128.000000 
+129.000000 131.000000 136.000000 141.000000 140.000000 136.000000 
+135.000000 132.000000 128.000000 128.000000 134.000000 139.000000 
+135.000000 127.000000 120.000000 117.000000 117.000000 117.000000 
+109.000000 93.000000 85.000000 109.000000 151.000000 178.000000 
+172.000000 131.000000 68.000000 92.000000 109.000000 114.000000 
+118.000000 127.000000 135.000000 134.000000 126.000000 123.000000 
+128.000000 130.000000 127.000000 124.000000 125.000000 123.000000 
+113.000000 105.000000 108.000000 124.000000 139.000000 141.000000 
+135.000000 129.000000 129.000000 130.000000 128.000000 123.000000 
+122.000000 122.000000 121.000000 119.000000 119.000000 123.000000 
+124.000000 123.000000 124.000000 128.000000 126.000000 121.000000 
+119.000000 127.000000 132.000000 128.000000 123.000000 127.000000 
+134.000000 135.000000 133.000000 135.000000 137.000000 136.000000 
+136.000000 140.000000 144.000000 142.000000 138.000000 137.000000 
+133.000000 127.000000 124.000000 126.000000 126.000000 122.000000 
+122.000000 124.000000 122.000000 116.000000 111.000000 115.000000 
+128.000000 139.000000 140.000000 140.000000 139.000000 132.000000 
+95.000000 105.000000 117.000000 128.000000 133.000000 129.000000 
+119.000000 109.000000 108.000000 114.000000 121.000000 125.000000 
+126.000000 129.000000 134.000000 135.000000 126.000000 116.000000 
+116.000000 127.000000 139.000000 138.000000 130.000000 126.000000 
+125.000000 127.000000 128.000000 128.000000 127.000000 127.000000 
+128.000000 131.000000 133.000000 131.000000 122.000000 108.000000 
+105.000000 119.000000 142.000000 152.000000 136.000000 126.000000 
+132.000000 133.000000 127.000000 128.000000 137.000000 143.000000 
+139.000000 135.000000 137.000000 138.000000 137.000000 139.000000 
+142.000000 141.000000 136.000000 135.000000 134.000000 128.000000 
+119.000000 112.000000 112.000000 115.000000 119.000000 120.000000 
+119.000000 118.000000 124.000000 134.000000 141.000000 141.000000 
+137.000000 134.000000 132.000000 127.000000 124.000000 128.000000 
+137.000000 150.000000 150.000000 131.000000 110.000000 104.000000 
+112.000000 121.000000 123.000000 125.000000 127.000000 127.000000 
+127.000000 129.000000 131.000000 132.000000 132.000000 132.000000 
+131.000000 130.000000 131.000000 130.000000 125.000000 121.000000 
+123.000000 129.000000 134.000000 138.000000 138.000000 136.000000 
+133.000000 128.000000 118.000000 104.000000 99.000000 115.000000 
+148.000000 167.000000 148.000000 120.000000 121.000000 133.000000 
+136.000000 133.000000 137.000000 144.000000 142.000000 137.000000 
+137.000000 140.000000 138.000000 134.000000 133.000000 134.000000 
+138.000000 138.000000 132.000000 121.000000 113.000000 112.000000 
+113.000000 113.000000 112.000000 114.000000 120.000000 126.000000 
+130.000000 135.000000 139.000000 139.000000 135.000000 127.000000 
+117.000000 111.000000 106.000000 131.000000 165.000000 181.000000 
+168.000000 142.000000 124.000000 119.000000 118.000000 117.000000 
+120.000000 125.000000 131.000000 132.000000 127.000000 121.000000 
+121.000000 129.000000 139.000000 141.000000 136.000000 133.000000 
+133.000000 132.000000 125.000000 118.000000 114.000000 115.000000 
+123.000000 137.000000 150.000000 153.000000 142.000000 127.000000 
+119.000000 118.000000 118.000000 123.000000 131.000000 135.000000 
+130.000000 121.000000 123.000000 133.000000 138.000000 139.000000 
+141.000000 144.000000 142.000000 133.000000 127.000000 128.000000 
+131.000000 134.000000 137.000000 139.000000 138.000000 132.000000 
+123.000000 115.000000 111.000000 113.000000 116.000000 118.000000 
+122.000000 128.000000 132.000000 131.000000 131.000000 136.000000 
+141.000000 137.000000 126.000000 121.000000 122.000000 124.000000 
+156.000000 210.000000 250.000000 239.000000 186.000000 134.000000 
+116.000000 118.000000 121.000000 123.000000 128.000000 134.000000 
+134.000000 128.000000 119.000000 112.000000 116.000000 127.000000 
+138.000000 144.000000 142.000000 139.000000 133.000000 125.000000 
+118.000000 116.000000 118.000000 119.000000 125.000000 138.000000 
+152.000000 156.000000 145.000000 131.000000 131.000000 151.000000 
+182.000000 192.000000 170.000000 137.000000 116.000000 117.000000 
+130.000000 140.000000 141.000000 137.000000 133.000000 133.000000 
+130.000000 122.000000 117.000000 121.000000 128.000000 131.000000 
+132.000000 132.000000 131.000000 127.000000 121.000000 115.000000 
+110.000000 107.000000 107.000000 113.000000 123.000000 131.000000 
+133.000000 131.000000 132.000000 140.000000 145.000000 139.000000 
+127.000000 122.000000 130.000000 143.000000 214.000000 313.000000 
+368.000000 321.000000 206.000000 120.000000 111.000000 130.000000 
+135.000000 129.000000 131.000000 140.000000 139.000000 124.000000 
+111.000000 113.000000 122.000000 127.000000 127.000000 128.000000 
+133.000000 136.000000 131.000000 122.000000 119.000000 123.000000 
+125.000000 122.000000 124.000000 133.000000 140.000000 138.000000 
+132.000000 144.000000 178.000000 219.000000 242.000000 229.000000 
+188.000000 148.000000 126.000000 125.000000 132.000000 136.000000 
+134.000000 131.000000 129.000000 130.000000 131.000000 128.000000 
+124.000000 124.000000 127.000000 130.000000 130.000000 131.000000 
+135.000000 137.000000 130.000000 119.000000 111.000000 108.000000 
+109.000000 115.000000 123.000000 130.000000 131.000000 131.000000 
+132.000000 137.000000 139.000000 137.000000 133.000000 131.000000 
+134.000000 140.000000 170.000000 270.000000 361.000000 350.000000 
+236.000000 128.000000 107.000000 126.000000 139.000000 136.000000 
+133.000000 137.000000 137.000000 125.000000 116.000000 118.000000 
+125.000000 127.000000 123.000000 120.000000 123.000000 126.000000 
+125.000000 120.000000 121.000000 126.000000 127.000000 125.000000 
+129.000000 136.000000 136.000000 126.000000 140.000000 194.000000 
+263.000000 290.000000 252.000000 185.000000 140.000000 129.000000 
+131.000000 129.000000 125.000000 124.000000 126.000000 129.000000 
+131.000000 129.000000 128.000000 130.000000 132.000000 128.000000 
+122.000000 118.000000 117.000000 121.000000 128.000000 132.000000 
+129.000000 123.000000 121.000000 122.000000 122.000000 122.000000 
+124.000000 127.000000 128.000000 127.000000 129.000000 134.000000 
+139.000000 139.000000 134.000000 128.000000 126.000000 130.000000 
+103.000000 155.000000 246.000000 294.000000 245.000000 153.000000 
+108.000000 110.000000 126.000000 139.000000 139.000000 134.000000 
+132.000000 131.000000 126.000000 122.000000 123.000000 129.000000 
+132.000000 130.000000 128.000000 127.000000 125.000000 119.000000 
+114.000000 113.000000 121.000000 135.000000 145.000000 143.000000 
+138.000000 170.000000 235.000000 296.000000 317.000000 270.000000 
+177.000000 106.000000 90.000000 106.000000 121.000000 125.000000 
+127.000000 131.000000 135.000000 137.000000 135.000000 132.000000 
+127.000000 126.000000 127.000000 123.000000 113.000000 107.000000 
+110.000000 117.000000 122.000000 124.000000 125.000000 127.000000 
+128.000000 126.000000 123.000000 121.000000 122.000000 125.000000 
+125.000000 125.000000 128.000000 133.000000 134.000000 130.000000 
+125.000000 126.000000 130.000000 128.000000 87.000000 93.000000 
+152.000000 225.000000 237.000000 188.000000 132.000000 107.000000 
+114.000000 135.000000 140.000000 131.000000 130.000000 137.000000 
+136.000000 122.000000 112.000000 119.000000 135.000000 141.000000 
+133.000000 124.000000 124.000000 124.000000 117.000000 109.000000 
+118.000000 141.000000 156.000000 156.000000 184.000000 260.000000 
+321.000000 315.000000 242.000000 141.000000 71.000000 63.000000 
+88.000000 111.000000 124.000000 133.000000 140.000000 143.000000 
+143.000000 144.000000 145.000000 143.000000 133.000000 123.000000 
+121.000000 122.000000 119.000000 114.000000 115.000000 123.000000 
+129.000000 128.000000 126.000000 124.000000 122.000000 119.000000 
+118.000000 122.000000 128.000000 132.000000 131.000000 129.000000 
+128.000000 129.000000 127.000000 122.000000 118.000000 117.000000 
+113.000000 98.000000 96.000000 76.000000 105.000000 183.000000 
+236.000000 215.000000 149.000000 104.000000 107.000000 132.000000 
+140.000000 132.000000 126.000000 126.000000 123.000000 111.000000 
+107.000000 119.000000 135.000000 136.000000 125.000000 115.000000 
+117.000000 123.000000 125.000000 127.000000 134.000000 146.000000 
+161.000000 199.000000 263.000000 301.000000 275.000000 204.000000 
+120.000000 60.000000 47.000000 61.000000 89.000000 123.000000 
+143.000000 145.000000 138.000000 133.000000 136.000000 140.000000 
+143.000000 144.000000 140.000000 132.000000 122.000000 117.000000 
+115.000000 115.000000 117.000000 121.000000 126.000000 127.000000 
+125.000000 120.000000 116.000000 115.000000 121.000000 129.000000 
+133.000000 130.000000 127.000000 128.000000 130.000000 130.000000 
+128.000000 127.000000 124.000000 116.000000 100.000000 79.000000 
+109.000000 80.000000 87.000000 154.000000 223.000000 223.000000 
+160.000000 101.000000 94.000000 118.000000 138.000000 137.000000 
+127.000000 124.000000 124.000000 118.000000 113.000000 116.000000 
+125.000000 130.000000 128.000000 126.000000 124.000000 119.000000 
+117.000000 124.000000 137.000000 152.000000 192.000000 260.000000 
+304.000000 266.000000 163.000000 82.000000 82.000000 118.000000 
+124.000000 88.000000 57.000000 66.000000 117.000000 144.000000 
+138.000000 134.000000 145.000000 153.000000 148.000000 141.000000 
+143.000000 143.000000 132.000000 118.000000 113.000000 115.000000 
+116.000000 114.000000 112.000000 116.000000 121.000000 122.000000 
+117.000000 115.000000 123.000000 136.000000 140.000000 133.000000 
+125.000000 125.000000 131.000000 132.000000 127.000000 126.000000 
+133.000000 135.000000 121.000000 91.000000 120.000000 95.000000 
+79.000000 108.000000 171.000000 205.000000 174.000000 118.000000 
+92.000000 106.000000 128.000000 132.000000 127.000000 131.000000 
+140.000000 137.000000 125.000000 120.000000 124.000000 129.000000 
+132.000000 137.000000 142.000000 139.000000 129.000000 125.000000 
+143.000000 187.000000 249.000000 278.000000 249.000000 175.000000 
+95.000000 63.000000 97.000000 191.000000 259.000000 281.000000 
+253.000000 176.000000 131.000000 137.000000 142.000000 139.000000 
+143.000000 152.000000 148.000000 135.000000 132.000000 137.000000 
+134.000000 123.000000 119.000000 124.000000 126.000000 122.000000 
+114.000000 109.000000 107.000000 108.000000 112.000000 120.000000 
+130.000000 139.000000 141.000000 134.000000 124.000000 121.000000 
+126.000000 129.000000 128.000000 128.000000 135.000000 139.000000 
+127.000000 98.000000 127.000000 114.000000 90.000000 82.000000 
+116.000000 164.000000 175.000000 144.000000 110.000000 101.000000 
+113.000000 129.000000 134.000000 132.000000 132.000000 133.000000 
+130.000000 129.000000 131.000000 136.000000 137.000000 135.000000 
+138.000000 145.000000 147.000000 148.000000 171.000000 223.000000 
+261.000000 230.000000 152.000000 104.000000 124.000000 166.000000 
+162.000000 166.000000 235.000000 332.000000 360.000000 274.000000 
+155.000000 113.000000 125.000000 135.000000 130.000000 129.000000 
+135.000000 135.000000 127.000000 121.000000 120.000000 117.000000 
+116.000000 121.000000 126.000000 125.000000 121.000000 116.000000 
+110.000000 106.000000 110.000000 123.000000 134.000000 137.000000 
+134.000000 133.000000 131.000000 126.000000 124.000000 130.000000 
+137.000000 136.000000 131.000000 128.000000 129.000000 124.000000 
+135.000000 135.000000 121.000000 97.000000 91.000000 115.000000 
+144.000000 145.000000 121.000000 101.000000 103.000000 121.000000 
+135.000000 134.000000 128.000000 128.000000 128.000000 128.000000 
+132.000000 137.000000 137.000000 128.000000 124.000000 135.000000 
+155.000000 173.000000 191.000000 205.000000 195.000000 150.000000 
+97.000000 89.000000 143.000000 189.000000 172.000000 113.000000 
+110.000000 173.000000 220.000000 207.000000 155.000000 111.000000 
+110.000000 124.000000 122.000000 119.000000 131.000000 144.000000 
+136.000000 118.000000 111.000000 113.000000 115.000000 117.000000 
+121.000000 124.000000 126.000000 126.000000 125.000000 121.000000 
+119.000000 124.000000 133.000000 134.000000 130.000000 128.000000 
+130.000000 129.000000 127.000000 130.000000 137.000000 140.000000 
+145.000000 165.000000 189.000000 197.000000 130.000000 138.000000 
+140.000000 122.000000 94.000000 83.000000 98.000000 118.000000 
+124.000000 117.000000 111.000000 117.000000 129.000000 134.000000 
+131.000000 127.000000 129.000000 132.000000 131.000000 127.000000 
+126.000000 131.000000 145.000000 168.000000 194.000000 211.000000 
+203.000000 166.000000 117.000000 76.000000 57.000000 62.000000 
+83.000000 101.000000 107.000000 99.000000 84.000000 110.000000 
+156.000000 191.000000 193.000000 156.000000 120.000000 114.000000 
+120.000000 122.000000 126.000000 135.000000 136.000000 123.000000 
+111.000000 113.000000 122.000000 130.000000 134.000000 136.000000 
+135.000000 131.000000 128.000000 127.000000 125.000000 126.000000 
+132.000000 136.000000 130.000000 120.000000 117.000000 121.000000 
+126.000000 131.000000 135.000000 139.000000 152.000000 187.000000 
+235.000000 262.000000 128.000000 138.000000 151.000000 149.000000 
+125.000000 95.000000 87.000000 105.000000 125.000000 128.000000 
+121.000000 121.000000 132.000000 141.000000 139.000000 131.000000 
+129.000000 130.000000 127.000000 125.000000 137.000000 174.000000 
+226.000000 267.000000 279.000000 259.000000 210.000000 144.000000 
+84.000000 50.000000 40.000000 42.000000 48.000000 62.000000 
+84.000000 95.000000 85.000000 85.000000 117.000000 167.000000 
+194.000000 172.000000 126.000000 103.000000 113.000000 128.000000 
+129.000000 126.000000 128.000000 129.000000 124.000000 124.000000 
+131.000000 134.000000 131.000000 126.000000 126.000000 129.000000 
+130.000000 134.000000 135.000000 131.000000 125.000000 128.000000 
+134.000000 132.000000 124.000000 121.000000 127.000000 133.000000 
+135.000000 133.000000 122.000000 110.000000 120.000000 161.000000 
+138.000000 143.000000 150.000000 154.000000 146.000000 127.000000 
+111.000000 107.000000 113.000000 116.000000 118.000000 125.000000 
+136.000000 141.000000 137.000000 135.000000 139.000000 138.000000 
+132.000000 140.000000 182.000000 251.000000 310.000000 316.000000 
+268.000000 202.000000 147.000000 105.000000 75.000000 59.000000 
+54.000000 57.000000 63.000000 77.000000 95.000000 104.000000 
+95.000000 78.000000 79.000000 107.000000 140.000000 157.000000 
+154.000000 132.000000 113.000000 113.000000 125.000000 132.000000 
+134.000000 136.000000 136.000000 132.000000 128.000000 126.000000 
+125.000000 126.000000 132.000000 137.000000 139.000000 141.000000 
+144.000000 142.000000 132.000000 127.000000 132.000000 134.000000 
+127.000000 123.000000 131.000000 134.000000 118.000000 98.000000 
+87.000000 73.000000 43.000000 36.000000 133.000000 134.000000 
+136.000000 142.000000 144.000000 134.000000 115.000000 99.000000 
+95.000000 100.000000 109.000000 120.000000 125.000000 124.000000 
+124.000000 128.000000 130.000000 130.000000 135.000000 164.000000 
+208.000000 242.000000 231.000000 173.000000 112.000000 78.000000 
+67.000000 65.000000 65.000000 72.000000 80.000000 88.000000 
+99.000000 112.000000 120.000000 119.000000 109.000000 89.000000 
+65.000000 59.000000 92.000000 143.000000 183.000000 190.000000 
+158.000000 118.000000 106.000000 121.000000 137.000000 140.000000 
+133.000000 124.000000 122.000000 130.000000 138.000000 140.000000 
+141.000000 145.000000 147.000000 140.000000 132.000000 132.000000 
+138.000000 140.000000 135.000000 127.000000 121.000000 121.000000 
+129.000000 131.000000 114.000000 91.000000 82.000000 85.000000 
+72.000000 41.000000 129.000000 130.000000 130.000000 130.000000 
+127.000000 118.000000 108.000000 104.000000 104.000000 101.000000 
+92.000000 81.000000 79.000000 89.000000 105.000000 109.000000 
+99.000000 98.000000 121.000000 152.000000 157.000000 130.000000 
+85.000000 50.000000 41.000000 47.000000 52.000000 62.000000 
+80.000000 104.000000 117.000000 114.000000 104.000000 98.000000 
+98.000000 97.000000 99.000000 101.000000 94.000000 74.000000 
+73.000000 108.000000 159.000000 204.000000 216.000000 183.000000 
+138.000000 121.000000 130.000000 135.000000 125.000000 112.000000 
+114.000000 127.000000 136.000000 132.000000 125.000000 127.000000 
+132.000000 130.000000 125.000000 128.000000 137.000000 139.000000 
+129.000000 120.000000 119.000000 123.000000 127.000000 129.000000 
+123.000000 109.000000 101.000000 106.000000 111.000000 93.000000 
+138.000000 138.000000 134.000000 127.000000 121.000000 119.000000 
+118.000000 115.000000 110.000000 105.000000 94.000000 75.000000 
+59.000000 59.000000 69.000000 77.000000 84.000000 97.000000 
+113.000000 120.000000 110.000000 89.000000 81.000000 83.000000 
+71.000000 52.000000 51.000000 74.000000 108.000000 127.000000 
+122.000000 98.000000 71.000000 52.000000 45.000000 52.000000 
+74.000000 100.000000 112.000000 98.000000 70.000000 76.000000 
+127.000000 200.000000 259.000000 270.000000 232.000000 174.000000 
+136.000000 121.000000 115.000000 106.000000 103.000000 110.000000 
+122.000000 125.000000 120.000000 118.000000 122.000000 128.000000 
+133.000000 138.000000 142.000000 137.000000 120.000000 105.000000 
+107.000000 123.000000 138.000000 142.000000 136.000000 126.000000 
+124.000000 134.000000 143.000000 129.000000 139.000000 142.000000 
+143.000000 138.000000 131.000000 127.000000 121.000000 108.000000 
+97.000000 98.000000 107.000000 110.000000 97.000000 74.000000 
+56.000000 61.000000 89.000000 124.000000 137.000000 124.000000 
+106.000000 97.000000 92.000000 83.000000 71.000000 68.000000 
+78.000000 97.000000 115.000000 124.000000 114.000000 92.000000 
+66.000000 47.000000 38.000000 40.000000 56.000000 84.000000 
+110.000000 115.000000 95.000000 70.000000 86.000000 153.000000 
+233.000000 277.000000 266.000000 215.000000 159.000000 121.000000 
+101.000000 101.000000 114.000000 130.000000 139.000000 136.000000 
+127.000000 125.000000 130.000000 133.000000 128.000000 125.000000 
+129.000000 128.000000 116.000000 108.000000 122.000000 145.000000 
+157.000000 153.000000 142.000000 134.000000 132.000000 138.000000 
+143.000000 136.000000 138.000000 140.000000 144.000000 144.000000 
+139.000000 129.000000 120.000000 112.000000 106.000000 104.000000 
+110.000000 123.000000 124.000000 98.000000 61.000000 51.000000 
+79.000000 125.000000 144.000000 122.000000 91.000000 78.000000 
+78.000000 78.000000 83.000000 98.000000 114.000000 125.000000 
+130.000000 135.000000 134.000000 117.000000 87.000000 63.000000 
+55.000000 56.000000 66.000000 89.000000 113.000000 120.000000 
+104.000000 80.000000 73.000000 99.000000 146.000000 184.000000 
+190.000000 163.000000 125.000000 103.000000 101.000000 115.000000 
+128.000000 129.000000 124.000000 121.000000 127.000000 135.000000 
+137.000000 130.000000 119.000000 113.000000 114.000000 113.000000 
+111.000000 117.000000 136.000000 153.000000 156.000000 148.000000 
+142.000000 137.000000 132.000000 130.000000 132.000000 131.000000 
+139.000000 136.000000 141.000000 147.000000 145.000000 131.000000 
+116.000000 112.000000 115.000000 113.000000 108.000000 112.000000 
+121.000000 119.000000 102.000000 84.000000 82.000000 95.000000 
+108.000000 108.000000 98.000000 91.000000 96.000000 111.000000 
+125.000000 132.000000 132.000000 134.000000 139.000000 145.000000 
+146.000000 136.000000 116.000000 91.000000 77.000000 77.000000 
+91.000000 113.000000 128.000000 129.000000 125.000000 122.000000 
+109.000000 88.000000 86.000000 102.000000 108.000000 96.000000 
+84.000000 94.000000 121.000000 136.000000 124.000000 109.000000 
+112.000000 128.000000 138.000000 130.000000 112.000000 97.000000 
+88.000000 88.000000 97.000000 110.000000 119.000000 125.000000 
+131.000000 139.000000 143.000000 139.000000 136.000000 138.000000 
+137.000000 132.000000 130.000000 131.000000 143.000000 137.000000 
+133.000000 134.000000 134.000000 129.000000 119.000000 114.000000 
+118.000000 126.000000 125.000000 112.000000 100.000000 99.000000 
+107.000000 115.000000 116.000000 114.000000 119.000000 128.000000 
+135.000000 134.000000 126.000000 122.000000 125.000000 129.000000 
+132.000000 132.000000 133.000000 136.000000 138.000000 134.000000 
+123.000000 105.000000 94.000000 98.000000 115.000000 132.000000 
+138.000000 136.000000 133.000000 132.000000 125.000000 107.000000 
+87.000000 83.000000 89.000000 92.000000 89.000000 90.000000 
+104.000000 120.000000 123.000000 115.000000 115.000000 124.000000 
+128.000000 119.000000 106.000000 98.000000 95.000000 92.000000 
+96.000000 110.000000 125.000000 130.000000 130.000000 130.000000 
+134.000000 138.000000 140.000000 141.000000 137.000000 129.000000 
+125.000000 129.000000 139.000000 138.000000 136.000000 133.000000 
+130.000000 131.000000 133.000000 132.000000 130.000000 132.000000 
+132.000000 123.000000 104.000000 90.000000 95.000000 112.000000 
+124.000000 124.000000 122.000000 126.000000 136.000000 143.000000 
+141.000000 133.000000 128.000000 129.000000 131.000000 130.000000 
+126.000000 127.000000 131.000000 132.000000 123.000000 106.000000 
+97.000000 103.000000 121.000000 137.000000 140.000000 135.000000 
+132.000000 135.000000 137.000000 128.000000 107.000000 86.000000 
+77.000000 77.000000 81.000000 88.000000 97.000000 103.000000 
+99.000000 86.000000 76.000000 79.000000 90.000000 101.000000 
+109.000000 115.000000 119.000000 119.000000 120.000000 125.000000 
+131.000000 135.000000 135.000000 136.000000 133.000000 128.000000 
+126.000000 133.000000 140.000000 139.000000 133.000000 133.000000 
+148.000000 146.000000 144.000000 142.000000 136.000000 129.000000 
+126.000000 126.000000 126.000000 126.000000 128.000000 131.000000 
+128.000000 123.000000 119.000000 122.000000 124.000000 120.000000 
+112.000000 110.000000 118.000000 125.000000 125.000000 123.000000 
+124.000000 126.000000 125.000000 122.000000 121.000000 129.000000 
+139.000000 142.000000 126.000000 103.000000 90.000000 99.000000 
+119.000000 134.000000 137.000000 135.000000 137.000000 141.000000 
+142.000000 137.000000 123.000000 104.000000 92.000000 96.000000 
+108.000000 113.000000 106.000000 99.000000 102.000000 109.000000 
+112.000000 111.000000 108.000000 103.000000 98.000000 101.000000 
+114.000000 128.000000 133.000000 131.000000 131.000000 134.000000 
+135.000000 133.000000 130.000000 128.000000 127.000000 128.000000 
+133.000000 134.000000 131.000000 129.000000 145.000000 144.000000 
+142.000000 139.000000 134.000000 129.000000 128.000000 128.000000 
+129.000000 133.000000 137.000000 138.000000 134.000000 127.000000 
+125.000000 129.000000 133.000000 132.000000 130.000000 131.000000 
+131.000000 128.000000 125.000000 126.000000 128.000000 126.000000 
+123.000000 122.000000 125.000000 132.000000 139.000000 137.000000 
+121.000000 101.000000 93.000000 105.000000 126.000000 137.000000 
+133.000000 126.000000 126.000000 132.000000 135.000000 135.000000 
+133.000000 125.000000 111.000000 103.000000 103.000000 103.000000 
+101.000000 100.000000 107.000000 117.000000 120.000000 116.000000 
+116.000000 120.000000 122.000000 122.000000 126.000000 134.000000 
+136.000000 128.000000 121.000000 126.000000 136.000000 140.000000 
+137.000000 133.000000 132.000000 132.000000 132.000000 129.000000 
+124.000000 122.000000 141.000000 140.000000 137.000000 133.000000 
+128.000000 125.000000 123.000000 123.000000 124.000000 128.000000 
+134.000000 138.000000 135.000000 127.000000 122.000000 124.000000 
+132.000000 137.000000 137.000000 133.000000 129.000000 128.000000 
+126.000000 121.000000 115.000000 112.000000 114.000000 120.000000 
+126.000000 132.000000 136.000000 132.000000 117.000000 99.000000 
+93.000000 104.000000 122.000000 132.000000 129.000000 122.000000 
+120.000000 123.000000 125.000000 127.000000 133.000000 139.000000 
+134.000000 118.000000 98.000000 88.000000 92.000000 104.000000 
+113.000000 117.000000 120.000000 123.000000 125.000000 127.000000 
+127.000000 130.000000 134.000000 135.000000 129.000000 123.000000 
+122.000000 129.000000 136.000000 138.000000 137.000000 135.000000 
+132.000000 130.000000 127.000000 125.000000 122.000000 122.000000 
+137.000000 134.000000 131.000000 131.000000 133.000000 132.000000 
+127.000000 124.000000 127.000000 134.000000 137.000000 132.000000 
+126.000000 123.000000 126.000000 130.000000 133.000000 131.000000 
+126.000000 125.000000 128.000000 129.000000 122.000000 109.000000 
+103.000000 108.000000 117.000000 119.000000 117.000000 122.000000 
+133.000000 136.000000 123.000000 106.000000 100.000000 109.000000 
+124.000000 133.000000 130.000000 124.000000 123.000000 124.000000 
+124.000000 122.000000 123.000000 126.000000 127.000000 120.000000 
+107.000000 99.000000 99.000000 107.000000 114.000000 118.000000 
+123.000000 129.000000 133.000000 132.000000 129.000000 129.000000 
+135.000000 140.000000 140.000000 137.000000 134.000000 132.000000 
+132.000000 134.000000 135.000000 136.000000 134.000000 131.000000 
+128.000000 127.000000 127.000000 127.000000 130.000000 129.000000 
+131.000000 131.000000 129.000000 125.000000 121.000000 120.000000 
+125.000000 132.000000 133.000000 129.000000 128.000000 131.000000 
+135.000000 136.000000 135.000000 134.000000 132.000000 127.000000 
+119.000000 110.000000 105.000000 105.000000 112.000000 123.000000 
+129.000000 127.000000 124.000000 129.000000 134.000000 126.000000 
+109.000000 97.000000 101.000000 115.000000 130.000000 135.000000 
+132.000000 128.000000 127.000000 129.000000 130.000000 127.000000 
+122.000000 121.000000 124.000000 128.000000 126.000000 119.000000 
+113.000000 112.000000 117.000000 123.000000 128.000000 132.000000 
+132.000000 128.000000 123.000000 121.000000 125.000000 131.000000 
+135.000000 138.000000 137.000000 134.000000 132.000000 132.000000 
+132.000000 131.000000 128.000000 124.000000 121.000000 121.000000 
+122.000000 124.000000 127.000000 133.000000 133.000000 127.000000 
+123.000000 124.000000 129.000000 132.000000 133.000000 130.000000 
+125.000000 123.000000 126.000000 133.000000 138.000000 137.000000 
+133.000000 127.000000 120.000000 110.000000 102.000000 99.000000 
+103.000000 112.000000 124.000000 131.000000 131.000000 128.000000 
+129.000000 136.000000 138.000000 131.000000 118.000000 110.000000 
+114.000000 125.000000 135.000000 139.000000 138.000000 134.000000 
+131.000000 127.000000 120.000000 115.000000 117.000000 128.000000 
+136.000000 133.000000 122.000000 113.000000 111.000000 113.000000 
+112.000000 110.000000 115.000000 123.000000 130.000000 131.000000 
+126.000000 119.000000 118.000000 124.000000 135.000000 142.000000 
+140.000000 134.000000 132.000000 136.000000 138.000000 133.000000 
+123.000000 120.000000 125.000000 131.000000 130.000000 127.000000 
+133.000000 129.000000 124.000000 124.000000 126.000000 129.000000 
+131.000000 134.000000 135.000000 133.000000 129.000000 128.000000 
+129.000000 130.000000 133.000000 137.000000 137.000000 129.000000 
+115.000000 109.000000 112.000000 117.000000 122.000000 128.000000 
+136.000000 139.000000 133.000000 124.000000 122.000000 127.000000 
+130.000000 130.000000 129.000000 130.000000 133.000000 135.000000 
+138.000000 141.000000 142.000000 139.000000 132.000000 123.000000 
+112.000000 102.000000 103.000000 114.000000 122.000000 116.000000 
+107.000000 105.000000 110.000000 116.000000 120.000000 125.000000 
+133.000000 137.000000 133.000000 129.000000 128.000000 128.000000 
+125.000000 125.000000 131.000000 135.000000 132.000000 126.000000 
+128.000000 138.000000 143.000000 134.000000 119.000000 115.000000 
+123.000000 131.000000 131.000000 126.000000 132.000000 128.000000 
+124.000000 123.000000 125.000000 128.000000 131.000000 133.000000 
+134.000000 134.000000 133.000000 130.000000 128.000000 130.000000 
+133.000000 135.000000 134.000000 128.000000 124.000000 123.000000 
+124.000000 123.000000 121.000000 126.000000 135.000000 142.000000 
+144.000000 142.000000 141.000000 140.000000 135.000000 130.000000 
+128.000000 130.000000 131.000000 130.000000 132.000000 138.000000 
+144.000000 143.000000 136.000000 126.000000 116.000000 106.000000 
+100.000000 99.000000 100.000000 102.000000 108.000000 116.000000 
+124.000000 127.000000 124.000000 123.000000 126.000000 131.000000 
+133.000000 134.000000 135.000000 134.000000 133.000000 133.000000 
+132.000000 129.000000 125.000000 124.000000 130.000000 137.000000 
+140.000000 135.000000 128.000000 125.000000 126.000000 127.000000 
+127.000000 126.000000 137.000000 136.000000 132.000000 129.000000 
+131.000000 133.000000 131.000000 126.000000 126.000000 132.000000 
+136.000000 132.000000 128.000000 133.000000 144.000000 150.000000 
+147.000000 138.000000 126.000000 118.000000 117.000000 125.000000 
+137.000000 145.000000 145.000000 142.000000 142.000000 143.000000 
+140.000000 134.000000 130.000000 131.000000 134.000000 133.000000 
+126.000000 121.000000 121.000000 127.000000 134.000000 139.000000 
+140.000000 140.000000 136.000000 128.000000 115.000000 104.000000 
+100.000000 102.000000 108.000000 114.000000 118.000000 121.000000 
+122.000000 124.000000 128.000000 134.000000 136.000000 135.000000 
+132.000000 128.000000 129.000000 131.000000 128.000000 119.000000 
+113.000000 119.000000 132.000000 142.000000 142.000000 137.000000 
+132.000000 131.000000 130.000000 129.000000 125.000000 120.000000 
+139.000000 135.000000 133.000000 132.000000 132.000000 130.000000 
+125.000000 120.000000 120.000000 125.000000 130.000000 134.000000 
+138.000000 144.000000 148.000000 146.000000 139.000000 134.000000 
+136.000000 138.000000 137.000000 133.000000 132.000000 134.000000 
+136.000000 136.000000 136.000000 138.000000 142.000000 142.000000 
+139.000000 136.000000 135.000000 134.000000 131.000000 128.000000 
+130.000000 134.000000 135.000000 133.000000 132.000000 133.000000 
+136.000000 139.000000 140.000000 136.000000 124.000000 109.000000 
+104.000000 112.000000 123.000000 126.000000 124.000000 131.000000 
+144.000000 150.000000 141.000000 124.000000 115.000000 120.000000 
+130.000000 134.000000 131.000000 126.000000 127.000000 134.000000 
+142.000000 144.000000 139.000000 131.000000 127.000000 132.000000 
+138.000000 140.000000 134.000000 127.000000 128.000000 125.000000 
+130.000000 137.000000 137.000000 127.000000 114.000000 109.000000 
+114.000000 125.000000 137.000000 144.000000 144.000000 137.000000 
+129.000000 128.000000 134.000000 139.000000 139.000000 135.000000 
+132.000000 130.000000 128.000000 129.000000 131.000000 134.000000 
+134.000000 132.000000 131.000000 132.000000 132.000000 130.000000 
+128.000000 127.000000 127.000000 128.000000 129.000000 129.000000 
+127.000000 125.000000 129.000000 138.000000 143.000000 139.000000 
+131.000000 129.000000 129.000000 124.000000 115.000000 108.000000 
+109.000000 121.000000 133.000000 137.000000 133.000000 125.000000 
+120.000000 120.000000 125.000000 131.000000 134.000000 135.000000 
+133.000000 132.000000 134.000000 137.000000 136.000000 132.000000 
+130.000000 133.000000 139.000000 142.000000 138.000000 133.000000 
+131.000000 130.000000 123.000000 126.000000 129.000000 126.000000 
+119.000000 116.000000 122.000000 134.000000 143.000000 145.000000 
+143.000000 144.000000 148.000000 150.000000 143.000000 132.000000 
+127.000000 130.000000 136.000000 136.000000 131.000000 128.000000 
+128.000000 127.000000 123.000000 122.000000 127.000000 134.000000 
+136.000000 133.000000 129.000000 127.000000 127.000000 129.000000 
+134.000000 140.000000 141.000000 135.000000 127.000000 124.000000 
+128.000000 135.000000 143.000000 148.000000 146.000000 136.000000 
+125.000000 121.000000 125.000000 129.000000 126.000000 122.000000 
+124.000000 127.000000 125.000000 120.000000 121.000000 128.000000 
+132.000000 127.000000 123.000000 127.000000 136.000000 139.000000 
+136.000000 133.000000 134.000000 134.000000 131.000000 129.000000 
+133.000000 138.000000 139.000000 135.000000 129.000000 122.000000 
+131.000000 132.000000 130.000000 124.000000 116.000000 113.000000 
+117.000000 127.000000 136.000000 138.000000 135.000000 133.000000 
+134.000000 134.000000 130.000000 126.000000 126.000000 129.000000 
+130.000000 127.000000 124.000000 123.000000 123.000000 120.000000 
+115.000000 115.000000 121.000000 128.000000 131.000000 130.000000 
+131.000000 136.000000 146.000000 154.000000 154.000000 147.000000 
+138.000000 131.000000 125.000000 123.000000 125.000000 132.000000 
+141.000000 148.000000 149.000000 146.000000 141.000000 137.000000 
+134.000000 129.000000 125.000000 124.000000 129.000000 134.000000 
+136.000000 132.000000 129.000000 128.000000 128.000000 125.000000 
+124.000000 128.000000 135.000000 138.000000 136.000000 131.000000 
+129.000000 129.000000 129.000000 128.000000 130.000000 133.000000 
+135.000000 135.000000 134.000000 135.000000 131.000000 133.000000 
+132.000000 122.000000 110.000000 107.000000 116.000000 132.000000 
+139.000000 133.000000 126.000000 128.000000 137.000000 144.000000 
+142.000000 135.000000 132.000000 133.000000 132.000000 128.000000 
+124.000000 121.000000 119.000000 115.000000 112.000000 116.000000 
+126.000000 132.000000 130.000000 124.000000 125.000000 133.000000 
+142.000000 144.000000 140.000000 134.000000 131.000000 129.000000 
+126.000000 123.000000 123.000000 127.000000 132.000000 135.000000 
+135.000000 134.000000 133.000000 133.000000 134.000000 134.000000 
+133.000000 130.000000 123.000000 119.000000 122.000000 130.000000 
+137.000000 137.000000 131.000000 124.000000 121.000000 125.000000 
+129.000000 131.000000 130.000000 129.000000 129.000000 131.000000 
+132.000000 129.000000 126.000000 127.000000 131.000000 135.000000 
+137.000000 136.000000 126.000000 130.000000 132.000000 123.000000 
+106.000000 100.000000 113.000000 133.000000 141.000000 135.000000 
+130.000000 131.000000 136.000000 139.000000 139.000000 137.000000 
+134.000000 132.000000 133.000000 132.000000 128.000000 123.000000 
+119.000000 116.000000 113.000000 114.000000 121.000000 129.000000 
+132.000000 131.000000 137.000000 150.000000 157.000000 150.000000 
+136.000000 130.000000 134.000000 136.000000 131.000000 125.000000 
+123.000000 126.000000 132.000000 138.000000 140.000000 135.000000 
+128.000000 125.000000 130.000000 135.000000 135.000000 129.000000 
+121.000000 115.000000 119.000000 132.000000 145.000000 146.000000 
+135.000000 122.000000 121.000000 128.000000 131.000000 128.000000 
+127.000000 133.000000 139.000000 142.000000 139.000000 136.000000 
+133.000000 131.000000 130.000000 131.000000 132.000000 133.000000 
+129.000000 132.000000 132.000000 122.000000 109.000000 105.000000 
+113.000000 123.000000 127.000000 128.000000 130.000000 132.000000 
+132.000000 134.000000 141.000000 147.000000 144.000000 137.000000 
+133.000000 134.000000 132.000000 126.000000 118.000000 115.000000 
+118.000000 123.000000 126.000000 128.000000 130.000000 134.000000 
+139.000000 143.000000 141.000000 132.000000 126.000000 128.000000 
+133.000000 136.000000 134.000000 130.000000 126.000000 124.000000 
+125.000000 129.000000 133.000000 135.000000 135.000000 134.000000 
+133.000000 132.000000 131.000000 128.000000 124.000000 123.000000 
+127.000000 136.000000 142.000000 141.000000 132.000000 122.000000 
+119.000000 121.000000 125.000000 128.000000 131.000000 133.000000 
+135.000000 137.000000 139.000000 140.000000 137.000000 132.000000 
+129.000000 131.000000 137.000000 139.000000 121.000000 124.000000 
+127.000000 125.000000 118.000000 113.000000 113.000000 118.000000 
+123.000000 126.000000 128.000000 134.000000 142.000000 149.000000 
+150.000000 144.000000 135.000000 129.000000 131.000000 136.000000 
+137.000000 132.000000 125.000000 124.000000 127.000000 129.000000 
+131.000000 135.000000 139.000000 137.000000 132.000000 130.000000 
+134.000000 140.000000 143.000000 144.000000 145.000000 145.000000 
+140.000000 133.000000 127.000000 125.000000 126.000000 125.000000 
+125.000000 128.000000 134.000000 138.000000 138.000000 135.000000 
+129.000000 124.000000 121.000000 124.000000 133.000000 140.000000 
+143.000000 140.000000 136.000000 131.000000 128.000000 126.000000 
+125.000000 124.000000 124.000000 127.000000 133.000000 136.000000 
+135.000000 133.000000 133.000000 136.000000 136.000000 133.000000 
+130.000000 129.000000 127.000000 125.000000 120.000000 115.000000 
+114.000000 117.000000 120.000000 124.000000 128.000000 130.000000 
+130.000000 133.000000 139.000000 145.000000 146.000000 140.000000 
+136.000000 135.000000 136.000000 133.000000 128.000000 127.000000 
+131.000000 138.000000 140.000000 139.000000 137.000000 136.000000 
+135.000000 135.000000 135.000000 135.000000 133.000000 132.000000 
+134.000000 139.000000 142.000000 142.000000 137.000000 132.000000 
+129.000000 128.000000 129.000000 130.000000 131.000000 133.000000 
+136.000000 138.000000 137.000000 134.000000 129.000000 124.000000 
+119.000000 119.000000 123.000000 131.000000 137.000000 138.000000 
+135.000000 132.000000 126.000000 117.000000 109.000000 108.000000 
+116.000000 128.000000 136.000000 136.000000 133.000000 132.000000 
+134.000000 136.000000 137.000000 135.000000 132.000000 129.000000 
+125.000000 114.000000 111.000000 121.000000 131.000000 132.000000 
+128.000000 129.000000 132.000000 134.000000 134.000000 137.000000 
+142.000000 143.000000 138.000000 133.000000 133.000000 136.000000 
+138.000000 137.000000 136.000000 135.000000 135.000000 134.000000 
+135.000000 136.000000 132.000000 126.000000 123.000000 126.000000 
+132.000000 135.000000 133.000000 132.000000 134.000000 135.000000 
+135.000000 134.000000 136.000000 137.000000 135.000000 133.000000 
+132.000000 133.000000 133.000000 133.000000 136.000000 139.000000 
+138.000000 132.000000 126.000000 121.000000 120.000000 124.000000 
+132.000000 140.000000 143.000000 135.000000 124.000000 122.000000 
+126.000000 128.000000 123.000000 115.000000 111.000000 112.000000 
+116.000000 119.000000 122.000000 127.000000 132.000000 133.000000 
+132.000000 133.000000 135.000000 133.000000 107.000000 116.000000 
+131.000000 137.000000 130.000000 120.000000 119.000000 128.000000 
+136.000000 135.000000 128.000000 126.000000 132.000000 138.000000 
+139.000000 134.000000 129.000000 128.000000 131.000000 135.000000 
+138.000000 139.000000 140.000000 139.000000 136.000000 131.000000 
+128.000000 126.000000 127.000000 129.000000 131.000000 132.000000 
+129.000000 128.000000 131.000000 135.000000 135.000000 132.000000 
+131.000000 133.000000 134.000000 131.000000 127.000000 128.000000 
+132.000000 136.000000 136.000000 136.000000 135.000000 133.000000 
+130.000000 128.000000 127.000000 127.000000 127.000000 128.000000 
+128.000000 126.000000 125.000000 126.000000 127.000000 122.000000 
+114.000000 109.000000 114.000000 124.000000 132.000000 134.000000 
+132.000000 133.000000 136.000000 139.000000 137.000000 132.000000 
+129.000000 128.000000 106.000000 120.000000 125.000000 122.000000 
+122.000000 127.000000 133.000000 135.000000 134.000000 130.000000 
+128.000000 130.000000 137.000000 142.000000 142.000000 134.000000 
+128.000000 128.000000 132.000000 135.000000 136.000000 135.000000 
+135.000000 135.000000 135.000000 133.000000 128.000000 125.000000 
+125.000000 127.000000 128.000000 129.000000 130.000000 132.000000 
+132.000000 129.000000 126.000000 125.000000 125.000000 126.000000 
+127.000000 130.000000 135.000000 136.000000 134.000000 130.000000 
+127.000000 125.000000 125.000000 128.000000 130.000000 130.000000 
+129.000000 132.000000 139.000000 145.000000 140.000000 126.000000 
+111.000000 108.000000 118.000000 130.000000 134.000000 128.000000 
+121.000000 121.000000 125.000000 126.000000 125.000000 128.000000 
+134.000000 136.000000 132.000000 130.000000 133.000000 135.000000 
+124.000000 131.000000 132.000000 131.000000 128.000000 126.000000 
+126.000000 130.000000 134.000000 135.000000 133.000000 132.000000 
+133.000000 134.000000 134.000000 133.000000 132.000000 131.000000 
+131.000000 134.000000 139.000000 143.000000 142.000000 137.000000 
+132.000000 128.000000 126.000000 125.000000 126.000000 128.000000 
+129.000000 130.000000 131.000000 131.000000 130.000000 128.000000 
+129.000000 131.000000 130.000000 126.000000 124.000000 128.000000 
+135.000000 137.000000 135.000000 133.000000 135.000000 137.000000 
+136.000000 134.000000 133.000000 132.000000 128.000000 126.000000 
+130.000000 138.000000 140.000000 131.000000 114.000000 104.000000 
+109.000000 124.000000 134.000000 130.000000 123.000000 122.000000 
+126.000000 127.000000 123.000000 121.000000 124.000000 130.000000 
+132.000000 132.000000 130.000000 127.000000 124.000000 127.000000 
+129.000000 128.000000 123.000000 122.000000 129.000000 137.000000 
+140.000000 133.000000 125.000000 123.000000 130.000000 136.000000 
+135.000000 130.000000 127.000000 129.000000 132.000000 135.000000 
+137.000000 137.000000 136.000000 133.000000 129.000000 125.000000 
+123.000000 124.000000 127.000000 128.000000 127.000000 126.000000 
+127.000000 128.000000 129.000000 129.000000 131.000000 135.000000 
+136.000000 134.000000 131.000000 133.000000 138.000000 141.000000 
+140.000000 136.000000 133.000000 131.000000 130.000000 133.000000 
+137.000000 138.000000 136.000000 137.000000 141.000000 143.000000 
+134.000000 116.000000 102.000000 101.000000 113.000000 126.000000 
+132.000000 129.000000 123.000000 118.000000 117.000000 120.000000 
+123.000000 124.000000 125.000000 128.000000 131.000000 133.000000 
+131.000000 127.000000 107.000000 113.000000 117.000000 120.000000 
+118.000000 112.000000 111.000000 118.000000 127.000000 132.000000 
+132.000000 134.000000 137.000000 137.000000 130.000000 118.000000 
+110.000000 110.000000 114.000000 121.000000 127.000000 132.000000 
+135.000000 136.000000 136.000000 138.000000 138.000000 132.000000 
+124.000000 121.000000 126.000000 131.000000 131.000000 131.000000 
+130.000000 127.000000 122.000000 118.000000 120.000000 123.000000 
+119.000000 112.000000 113.000000 124.000000 136.000000 139.000000 
+136.000000 133.000000 134.000000 136.000000 134.000000 129.000000 
+126.000000 130.000000 135.000000 140.000000 143.000000 145.000000 
+145.000000 140.000000 132.000000 124.000000 118.000000 116.000000 
+119.000000 123.000000 123.000000 120.000000 120.000000 126.000000 
+127.000000 113.000000 101.000000 118.000000 154.000000 169.000000 
+102.000000 115.000000 119.000000 115.000000 115.000000 123.000000 
+131.000000 129.000000 119.000000 115.000000 122.000000 134.000000 
+138.000000 135.000000 128.000000 122.000000 116.000000 112.000000 
+118.000000 130.000000 139.000000 141.000000 137.000000 134.000000 
+132.000000 134.000000 138.000000 141.000000 141.000000 137.000000 
+132.000000 128.000000 127.000000 128.000000 126.000000 121.000000 
+117.000000 115.000000 112.000000 110.000000 115.000000 124.000000 
+128.000000 128.000000 130.000000 135.000000 141.000000 141.000000 
+138.000000 137.000000 137.000000 134.000000 130.000000 130.000000 
+135.000000 140.000000 143.000000 143.000000 142.000000 140.000000 
+134.000000 123.000000 113.000000 110.000000 119.000000 130.000000 
+131.000000 121.000000 116.000000 124.000000 131.000000 127.000000 
+121.000000 122.000000 131.000000 135.000000 109.000000 115.000000 
+119.000000 121.000000 119.000000 118.000000 118.000000 116.000000 
+111.000000 110.000000 116.000000 127.000000 134.000000 134.000000 
+132.000000 129.000000 125.000000 123.000000 126.000000 136.000000 
+144.000000 143.000000 133.000000 123.000000 120.000000 127.000000 
+138.000000 145.000000 145.000000 140.000000 134.000000 130.000000 
+129.000000 126.000000 117.000000 107.000000 106.000000 116.000000 
+127.000000 128.000000 113.000000 106.000000 117.000000 124.000000 
+121.000000 123.000000 134.000000 141.000000 138.000000 133.000000 
+134.000000 137.000000 139.000000 140.000000 140.000000 138.000000 
+137.000000 134.000000 130.000000 125.000000 119.000000 113.000000 
+109.000000 112.000000 119.000000 123.000000 121.000000 121.000000 
+129.000000 140.000000 142.000000 135.000000 127.000000 123.000000 
+121.000000 119.000000 117.000000 112.000000 111.000000 117.000000 
+118.000000 113.000000 107.000000 110.000000 116.000000 119.000000 
+119.000000 121.000000 125.000000 130.000000 136.000000 141.000000 
+140.000000 134.000000 130.000000 133.000000 140.000000 141.000000 
+136.000000 128.000000 125.000000 128.000000 134.000000 137.000000 
+136.000000 135.000000 137.000000 137.000000 135.000000 131.000000 
+127.000000 119.000000 114.000000 131.000000 172.000000 204.000000 
+191.000000 149.000000 127.000000 126.000000 127.000000 129.000000 
+137.000000 146.000000 145.000000 137.000000 133.000000 133.000000 
+133.000000 133.000000 133.000000 130.000000 127.000000 125.000000 
+118.000000 107.000000 103.000000 108.000000 116.000000 117.000000 
+111.000000 109.000000 116.000000 129.000000 141.000000 147.000000 
+146.000000 141.000000 134.000000 128.000000 122.000000 115.000000 
+128.000000 120.000000 113.000000 113.000000 118.000000 119.000000 
+116.000000 117.000000 124.000000 129.000000 126.000000 120.000000 
+118.000000 122.000000 128.000000 132.000000 135.000000 137.000000 
+137.000000 135.000000 132.000000 131.000000 133.000000 130.000000 
+123.000000 120.000000 123.000000 130.000000 136.000000 140.000000 
+142.000000 141.000000 132.000000 120.000000 119.000000 135.000000 
+174.000000 202.000000 197.000000 170.000000 144.000000 127.000000 
+126.000000 132.000000 134.000000 132.000000 135.000000 141.000000 
+142.000000 137.000000 131.000000 125.000000 121.000000 123.000000 
+130.000000 133.000000 128.000000 121.000000 118.000000 116.000000 
+113.000000 114.000000 115.000000 113.000000 111.000000 114.000000 
+125.000000 137.000000 144.000000 146.000000 144.000000 136.000000 
+127.000000 123.000000 123.000000 121.000000 125.000000 132.000000 
+138.000000 140.000000 132.000000 118.000000 111.000000 116.000000 
+123.000000 123.000000 120.000000 121.000000 125.000000 125.000000 
+122.000000 122.000000 127.000000 131.000000 130.000000 126.000000 
+124.000000 127.000000 130.000000 129.000000 122.000000 114.000000 
+113.000000 119.000000 126.000000 131.000000 137.000000 142.000000 
+138.000000 128.000000 132.000000 171.000000 251.000000 303.000000 
+256.000000 156.000000 90.000000 87.000000 117.000000 134.000000 
+128.000000 121.000000 127.000000 138.000000 138.000000 129.000000 
+120.000000 118.000000 121.000000 126.000000 132.000000 134.000000 
+129.000000 121.000000 118.000000 118.000000 115.000000 109.000000 
+108.000000 113.000000 119.000000 123.000000 123.000000 124.000000 
+127.000000 130.000000 131.000000 129.000000 127.000000 126.000000 
+127.000000 127.000000 126.000000 145.000000 167.000000 169.000000 
+139.000000 106.000000 104.000000 121.000000 125.000000 120.000000 
+122.000000 131.000000 135.000000 128.000000 119.000000 116.000000 
+115.000000 117.000000 123.000000 133.000000 139.000000 136.000000 
+130.000000 124.000000 121.000000 122.000000 125.000000 124.000000 
+121.000000 125.000000 132.000000 130.000000 121.000000 129.000000 
+171.000000 221.000000 254.000000 250.000000 187.000000 121.000000 
+100.000000 110.000000 125.000000 127.000000 123.000000 127.000000 
+138.000000 146.000000 141.000000 128.000000 118.000000 121.000000 
+129.000000 132.000000 130.000000 127.000000 127.000000 128.000000 
+126.000000 121.000000 115.000000 113.000000 117.000000 127.000000 
+131.000000 129.000000 126.000000 127.000000 128.000000 127.000000 
+126.000000 128.000000 129.000000 125.000000 122.000000 128.000000 
+140.000000 171.000000 201.000000 194.000000 150.000000 107.000000 
+103.000000 119.000000 127.000000 128.000000 134.000000 139.000000 
+135.000000 124.000000 118.000000 119.000000 123.000000 124.000000 
+126.000000 131.000000 136.000000 141.000000 135.000000 121.000000 
+114.000000 122.000000 132.000000 130.000000 126.000000 127.000000 
+125.000000 110.000000 108.000000 144.000000 196.000000 219.000000 
+185.000000 111.000000 64.000000 70.000000 104.000000 127.000000 
+125.000000 119.000000 128.000000 145.000000 151.000000 145.000000 
+135.000000 126.000000 121.000000 122.000000 124.000000 125.000000 
+122.000000 122.000000 128.000000 134.000000 133.000000 125.000000 
+120.000000 122.000000 128.000000 132.000000 130.000000 126.000000 
+127.000000 133.000000 138.000000 137.000000 133.000000 132.000000 
+130.000000 123.000000 118.000000 126.000000 139.000000 174.000000 
+200.000000 188.000000 145.000000 108.000000 103.000000 120.000000 
+135.000000 139.000000 138.000000 133.000000 127.000000 121.000000 
+118.000000 121.000000 123.000000 118.000000 111.000000 116.000000 
+134.000000 148.000000 139.000000 119.000000 113.000000 122.000000 
+129.000000 127.000000 125.000000 121.000000 109.000000 104.000000 
+130.000000 170.000000 186.000000 157.000000 91.000000 50.000000 
+66.000000 101.000000 124.000000 125.000000 120.000000 125.000000 
+140.000000 153.000000 151.000000 137.000000 123.000000 117.000000 
+116.000000 116.000000 116.000000 116.000000 118.000000 123.000000 
+129.000000 134.000000 134.000000 129.000000 125.000000 125.000000 
+127.000000 129.000000 131.000000 131.000000 126.000000 122.000000 
+125.000000 133.000000 136.000000 130.000000 122.000000 119.000000 
+122.000000 121.000000 132.000000 151.000000 166.000000 161.000000 
+139.000000 120.000000 116.000000 121.000000 128.000000 132.000000 
+130.000000 125.000000 121.000000 119.000000 120.000000 121.000000 
+117.000000 111.000000 111.000000 123.000000 136.000000 138.000000 
+130.000000 126.000000 128.000000 127.000000 122.000000 121.000000 
+123.000000 120.000000 123.000000 142.000000 171.000000 187.000000 
+166.000000 103.000000 46.000000 52.000000 93.000000 123.000000 
+132.000000 128.000000 128.000000 136.000000 146.000000 149.000000 
+143.000000 132.000000 124.000000 123.000000 126.000000 121.000000 
+111.000000 105.000000 112.000000 125.000000 134.000000 135.000000 
+134.000000 132.000000 127.000000 120.000000 119.000000 128.000000 
+140.000000 144.000000 134.000000 125.000000 125.000000 131.000000 
+131.000000 124.000000 118.000000 116.000000 111.000000 94.000000 
+133.000000 133.000000 137.000000 148.000000 153.000000 147.000000 
+129.000000 112.000000 113.000000 124.000000 127.000000 125.000000 
+126.000000 130.000000 130.000000 123.000000 118.000000 120.000000 
+123.000000 121.000000 119.000000 123.000000 133.000000 138.000000 
+133.000000 125.000000 124.000000 127.000000 135.000000 154.000000 
+179.000000 186.000000 170.000000 158.000000 155.000000 147.000000 
+135.000000 114.000000 90.000000 91.000000 116.000000 139.000000 
+142.000000 136.000000 136.000000 141.000000 140.000000 134.000000 
+127.000000 125.000000 125.000000 120.000000 111.000000 105.000000 
+109.000000 119.000000 126.000000 126.000000 124.000000 124.000000 
+125.000000 124.000000 122.000000 124.000000 130.000000 133.000000 
+132.000000 131.000000 132.000000 130.000000 123.000000 119.000000 
+124.000000 128.000000 116.000000 86.000000 136.000000 125.000000 
+126.000000 143.000000 158.000000 155.000000 133.000000 110.000000 
+107.000000 118.000000 123.000000 123.000000 128.000000 136.000000 
+137.000000 127.000000 120.000000 120.000000 120.000000 115.000000 
+115.000000 124.000000 134.000000 137.000000 133.000000 129.000000 
+130.000000 150.000000 196.000000 237.000000 242.000000 205.000000 
+148.000000 122.000000 145.000000 201.000000 234.000000 217.000000 
+170.000000 126.000000 115.000000 128.000000 137.000000 132.000000 
+130.000000 135.000000 140.000000 138.000000 133.000000 128.000000 
+122.000000 115.000000 116.000000 120.000000 120.000000 113.000000 
+109.000000 114.000000 121.000000 122.000000 122.000000 123.000000 
+125.000000 125.000000 126.000000 128.000000 130.000000 127.000000 
+123.000000 120.000000 118.000000 117.000000 123.000000 133.000000 
+131.000000 104.000000 133.000000 129.000000 132.000000 140.000000 
+147.000000 147.000000 136.000000 118.000000 108.000000 110.000000 
+114.000000 118.000000 126.000000 134.000000 138.000000 134.000000 
+127.000000 121.000000 120.000000 127.000000 130.000000 125.000000 
+122.000000 132.000000 143.000000 141.000000 153.000000 216.000000 
+291.000000 305.000000 250.000000 172.000000 123.000000 119.000000 
+135.000000 193.000000 295.000000 383.000000 382.000000 274.000000 
+150.000000 105.000000 118.000000 130.000000 121.000000 115.000000 
+125.000000 136.000000 138.000000 133.000000 125.000000 115.000000 
+113.000000 121.000000 128.000000 123.000000 111.000000 106.000000 
+109.000000 113.000000 112.000000 112.000000 117.000000 123.000000 
+129.000000 134.000000 138.000000 133.000000 124.000000 118.000000 
+118.000000 120.000000 122.000000 127.000000 127.000000 109.000000 
+139.000000 139.000000 139.000000 139.000000 140.000000 134.000000 
+125.000000 116.000000 110.000000 109.000000 112.000000 120.000000 
+131.000000 137.000000 136.000000 131.000000 123.000000 119.000000 
+125.000000 137.000000 139.000000 129.000000 123.000000 133.000000 
+148.000000 173.000000 231.000000 304.000000 324.000000 270.000000 
+174.000000 101.000000 95.000000 113.000000 123.000000 140.000000 
+253.000000 394.000000 408.000000 280.000000 155.000000 106.000000 
+110.000000 125.000000 124.000000 119.000000 125.000000 134.000000 
+131.000000 122.000000 117.000000 113.000000 110.000000 113.000000 
+122.000000 126.000000 122.000000 116.000000 112.000000 109.000000 
+106.000000 110.000000 120.000000 127.000000 129.000000 133.000000 
+138.000000 135.000000 125.000000 116.000000 116.000000 123.000000 
+129.000000 131.000000 125.000000 112.000000 142.000000 145.000000 
+148.000000 149.000000 141.000000 124.000000 108.000000 103.000000 
+104.000000 107.000000 111.000000 119.000000 130.000000 136.000000 
+135.000000 129.000000 125.000000 126.000000 131.000000 133.000000 
+132.000000 133.000000 139.000000 154.000000 188.000000 244.000000 
+299.000000 301.000000 241.000000 156.000000 96.000000 83.000000 
+99.000000 105.000000 96.000000 75.000000 111.000000 215.000000 
+266.000000 232.000000 181.000000 138.000000 111.000000 118.000000 
+134.000000 136.000000 130.000000 127.000000 127.000000 123.000000 
+119.000000 118.000000 117.000000 115.000000 114.000000 117.000000 
+122.000000 124.000000 121.000000 112.000000 106.000000 114.000000 
+132.000000 143.000000 138.000000 129.000000 128.000000 130.000000 
+127.000000 123.000000 127.000000 134.000000 131.000000 119.000000 
+121.000000 145.000000 139.000000 144.000000 154.000000 155.000000 
+144.000000 125.000000 112.000000 108.000000 110.000000 113.000000 
+115.000000 119.000000 123.000000 126.000000 125.000000 124.000000 
+129.000000 138.000000 144.000000 140.000000 136.000000 142.000000 
+174.000000 230.000000 294.000000 327.000000 300.000000 221.000000 
+136.000000 85.000000 81.000000 96.000000 92.000000 73.000000 
+52.000000 43.000000 41.000000 110.000000 211.000000 265.000000 
+246.000000 188.000000 129.000000 104.000000 117.000000 132.000000 
+136.000000 136.000000 134.000000 126.000000 115.000000 115.000000 
+124.000000 129.000000 127.000000 124.000000 123.000000 121.000000 
+118.000000 118.000000 121.000000 126.000000 133.000000 135.000000 
+129.000000 121.000000 124.000000 132.000000 135.000000 131.000000 
+128.000000 129.000000 123.000000 118.000000 140.000000 183.000000 
+143.000000 145.000000 150.000000 156.000000 157.000000 149.000000 
+136.000000 123.000000 118.000000 119.000000 119.000000 117.000000 
+116.000000 116.000000 117.000000 120.000000 128.000000 140.000000 
+144.000000 136.000000 134.000000 170.000000 239.000000 309.000000 
+329.000000 278.000000 190.000000 118.000000 76.000000 67.000000 
+78.000000 87.000000 81.000000 65.000000 55.000000 57.000000 
+54.000000 72.000000 153.000000 239.000000 265.000000 234.000000 
+176.000000 121.000000 106.000000 128.000000 148.000000 150.000000 
+140.000000 126.000000 114.000000 113.000000 126.000000 141.000000 
+144.000000 137.000000 131.000000 128.000000 130.000000 136.000000 
+139.000000 133.000000 124.000000 121.000000 125.000000 128.000000 
+128.000000 127.000000 127.000000 125.000000 122.000000 125.000000 
+132.000000 141.000000 144.000000 143.000000 143.000000 142.000000 
+140.000000 145.000000 152.000000 152.000000 140.000000 124.000000 
+114.000000 109.000000 108.000000 111.000000 120.000000 126.000000 
+129.000000 132.000000 135.000000 133.000000 119.000000 110.000000 
+132.000000 189.000000 238.000000 240.000000 185.000000 113.000000 
+68.000000 55.000000 56.000000 59.000000 66.000000 79.000000 
+87.000000 83.000000 76.000000 79.000000 83.000000 67.000000 
+85.000000 168.000000 249.000000 275.000000 243.000000 183.000000 
+131.000000 121.000000 134.000000 141.000000 136.000000 129.000000 
+123.000000 119.000000 123.000000 134.000000 142.000000 142.000000 
+135.000000 131.000000 130.000000 132.000000 134.000000 133.000000 
+127.000000 124.000000 131.000000 137.000000 131.000000 121.000000 
+123.000000 135.000000 142.000000 138.000000 131.000000 120.000000 
+102.000000 80.000000 139.000000 135.000000 131.000000 130.000000 
+129.000000 123.000000 117.000000 116.000000 116.000000 109.000000 
+105.000000 118.000000 138.000000 146.000000 140.000000 136.000000 
+137.000000 131.000000 117.000000 117.000000 142.000000 162.000000 
+147.000000 100.000000 54.000000 41.000000 55.000000 63.000000 
+64.000000 63.000000 66.000000 76.000000 85.000000 87.000000 
+81.000000 78.000000 79.000000 78.000000 60.000000 93.000000 
+191.000000 277.000000 295.000000 248.000000 177.000000 131.000000 
+126.000000 139.000000 141.000000 132.000000 122.000000 116.000000 
+117.000000 124.000000 134.000000 138.000000 133.000000 127.000000 
+124.000000 122.000000 122.000000 127.000000 129.000000 126.000000 
+123.000000 126.000000 128.000000 129.000000 133.000000 144.000000 
+147.000000 133.000000 112.000000 102.000000 95.000000 77.000000 
+138.000000 139.000000 137.000000 133.000000 127.000000 119.000000 
+114.000000 116.000000 121.000000 121.000000 114.000000 114.000000 
+126.000000 141.000000 150.000000 148.000000 141.000000 135.000000 
+133.000000 134.000000 132.000000 121.000000 96.000000 70.000000 
+58.000000 58.000000 62.000000 65.000000 61.000000 60.000000 
+66.000000 74.000000 84.000000 97.000000 104.000000 98.000000 
+88.000000 83.000000 72.000000 61.000000 113.000000 208.000000 
+282.000000 289.000000 232.000000 156.000000 120.000000 131.000000 
+147.000000 142.000000 128.000000 122.000000 123.000000 125.000000 
+128.000000 130.000000 128.000000 122.000000 120.000000 120.000000 
+120.000000 121.000000 127.000000 133.000000 131.000000 125.000000 
+125.000000 132.000000 142.000000 147.000000 142.000000 128.000000 
+112.000000 108.000000 112.000000 104.000000 137.000000 142.000000 
+139.000000 130.000000 125.000000 127.000000 127.000000 121.000000 
+117.000000 119.000000 119.000000 110.000000 107.000000 121.000000 
+147.000000 162.000000 157.000000 145.000000 138.000000 137.000000 
+134.000000 124.000000 113.000000 104.000000 95.000000 84.000000 
+80.000000 84.000000 87.000000 88.000000 87.000000 85.000000 
+82.000000 80.000000 82.000000 88.000000 94.000000 93.000000 
+80.000000 57.000000 55.000000 111.000000 199.000000 256.000000 
+238.000000 166.000000 117.000000 118.000000 138.000000 147.000000 
+141.000000 134.000000 129.000000 124.000000 121.000000 124.000000 
+129.000000 125.000000 118.000000 117.000000 123.000000 130.000000 
+134.000000 136.000000 133.000000 126.000000 123.000000 127.000000 
+134.000000 134.000000 131.000000 131.000000 135.000000 138.000000 
+140.000000 134.000000 138.000000 141.000000 137.000000 128.000000 
+121.000000 123.000000 131.000000 132.000000 119.000000 106.000000 
+110.000000 120.000000 121.000000 113.000000 109.000000 120.000000 
+143.000000 163.000000 166.000000 155.000000 141.000000 126.000000 
+114.000000 105.000000 99.000000 95.000000 97.000000 108.000000 
+122.000000 127.000000 120.000000 103.000000 81.000000 54.000000 
+37.000000 42.000000 65.000000 86.000000 84.000000 69.000000 
+56.000000 67.000000 112.000000 162.000000 178.000000 152.000000 
+123.000000 118.000000 130.000000 144.000000 147.000000 137.000000 
+126.000000 123.000000 126.000000 127.000000 125.000000 121.000000 
+119.000000 123.000000 131.000000 136.000000 136.000000 133.000000 
+128.000000 122.000000 119.000000 126.000000 139.000000 147.000000 
+145.000000 136.000000 134.000000 141.000000 147.000000 144.000000 
+140.000000 139.000000 138.000000 135.000000 128.000000 122.000000 
+127.000000 136.000000 130.000000 111.000000 99.000000 110.000000 
+126.000000 118.000000 91.000000 85.000000 114.000000 155.000000 
+174.000000 158.000000 131.000000 116.000000 111.000000 107.000000 
+104.000000 107.000000 116.000000 124.000000 130.000000 137.000000 
+141.000000 128.000000 97.000000 60.000000 38.000000 40.000000 
+60.000000 86.000000 101.000000 101.000000 91.000000 77.000000 
+76.000000 94.000000 112.000000 115.000000 114.000000 123.000000 
+130.000000 129.000000 127.000000 130.000000 136.000000 137.000000 
+131.000000 122.000000 117.000000 120.000000 127.000000 132.000000 
+132.000000 133.000000 134.000000 133.000000 128.000000 122.000000 
+123.000000 136.000000 156.000000 168.000000 161.000000 139.000000 
+122.000000 121.000000 127.000000 127.000000 138.000000 135.000000 
+134.000000 134.000000 133.000000 129.000000 128.000000 132.000000 
+136.000000 132.000000 122.000000 116.000000 114.000000 107.000000 
+99.000000 104.000000 119.000000 130.000000 133.000000 127.000000 
+127.000000 131.000000 133.000000 130.000000 128.000000 132.000000 
+137.000000 139.000000 139.000000 145.000000 152.000000 146.000000 
+117.000000 79.000000 56.000000 57.000000 79.000000 110.000000 
+129.000000 125.000000 107.000000 95.000000 89.000000 87.000000 
+90.000000 101.000000 120.000000 134.000000 128.000000 115.000000 
+114.000000 126.000000 135.000000 131.000000 119.000000 116.000000 
+126.000000 135.000000 135.000000 129.000000 124.000000 125.000000 
+128.000000 129.000000 129.000000 128.000000 131.000000 138.000000 
+148.000000 152.000000 145.000000 131.000000 120.000000 120.000000 
+127.000000 131.000000 140.000000 138.000000 133.000000 130.000000 
+129.000000 130.000000 129.000000 128.000000 130.000000 136.000000 
+136.000000 124.000000 106.000000 95.000000 100.000000 113.000000 
+116.000000 107.000000 103.000000 116.000000 136.000000 138.000000 
+121.000000 107.000000 110.000000 126.000000 136.000000 135.000000 
+132.000000 139.000000 148.000000 145.000000 121.000000 87.000000 
+65.000000 68.000000 93.000000 122.000000 136.000000 133.000000 
+124.000000 116.000000 111.000000 107.000000 108.000000 114.000000 
+121.000000 123.000000 120.000000 122.000000 128.000000 130.000000 
+124.000000 115.000000 112.000000 116.000000 121.000000 122.000000 
+121.000000 122.000000 121.000000 118.000000 117.000000 123.000000 
+131.000000 135.000000 136.000000 141.000000 145.000000 145.000000 
+139.000000 130.000000 120.000000 114.000000 117.000000 125.000000 
+133.000000 132.000000 132.000000 131.000000 126.000000 123.000000 
+124.000000 126.000000 127.000000 127.000000 128.000000 123.000000 
+111.000000 99.000000 99.000000 108.000000 115.000000 114.000000 
+117.000000 128.000000 138.000000 136.000000 127.000000 122.000000 
+126.000000 131.000000 132.000000 131.000000 131.000000 135.000000 
+141.000000 140.000000 124.000000 96.000000 76.000000 81.000000 
+107.000000 131.000000 135.000000 126.000000 117.000000 114.000000 
+113.000000 112.000000 108.000000 103.000000 98.000000 101.000000 
+112.000000 122.000000 125.000000 119.000000 113.000000 109.000000 
+106.000000 100.000000 91.000000 86.000000 93.000000 113.000000 
+130.000000 136.000000 134.000000 134.000000 134.000000 131.000000 
+131.000000 137.000000 145.000000 145.000000 140.000000 136.000000 
+131.000000 124.000000 121.000000 129.000000 130.000000 126.000000 
+128.000000 132.000000 130.000000 126.000000 126.000000 131.000000 
+134.000000 136.000000 136.000000 132.000000 117.000000 98.000000 
+89.000000 94.000000 104.000000 109.000000 112.000000 116.000000 
+117.000000 115.000000 116.000000 120.000000 123.000000 126.000000 
+127.000000 129.000000 127.000000 127.000000 132.000000 135.000000 
+122.000000 92.000000 70.000000 78.000000 108.000000 131.000000 
+132.000000 127.000000 129.000000 132.000000 128.000000 122.000000 
+121.000000 121.000000 117.000000 115.000000 122.000000 131.000000 
+130.000000 120.000000 112.000000 110.000000 105.000000 97.000000 
+92.000000 96.000000 104.000000 109.000000 112.000000 119.000000 
+130.000000 138.000000 137.000000 130.000000 127.000000 134.000000 
+141.000000 140.000000 132.000000 130.000000 133.000000 133.000000 
+128.000000 129.000000 129.000000 128.000000 129.000000 129.000000 
+128.000000 126.000000 126.000000 127.000000 129.000000 132.000000 
+133.000000 129.000000 118.000000 106.000000 102.000000 104.000000 
+110.000000 117.000000 124.000000 129.000000 126.000000 120.000000 
+115.000000 115.000000 117.000000 120.000000 124.000000 127.000000 
+128.000000 131.000000 136.000000 136.000000 118.000000 90.000000 
+75.000000 88.000000 116.000000 133.000000 131.000000 127.000000 
+132.000000 139.000000 136.000000 127.000000 124.000000 129.000000 
+131.000000 126.000000 122.000000 122.000000 121.000000 116.000000 
+108.000000 104.000000 104.000000 104.000000 102.000000 101.000000 
+106.000000 116.000000 125.000000 128.000000 125.000000 122.000000 
+125.000000 133.000000 138.000000 138.000000 137.000000 136.000000 
+135.000000 135.000000 136.000000 135.000000 130.000000 128.000000 
+138.000000 137.000000 132.000000 128.000000 127.000000 128.000000 
+127.000000 123.000000 124.000000 129.000000 130.000000 122.000000 
+111.000000 106.000000 113.000000 123.000000 131.000000 133.000000 
+134.000000 134.000000 132.000000 128.000000 125.000000 122.000000 
+120.000000 119.000000 119.000000 121.000000 124.000000 129.000000 
+135.000000 133.000000 116.000000 92.000000 81.000000 92.000000 
+118.000000 135.000000 135.000000 130.000000 130.000000 135.000000 
+137.000000 133.000000 128.000000 126.000000 124.000000 118.000000 
+110.000000 102.000000 99.000000 101.000000 106.000000 111.000000 
+113.000000 115.000000 116.000000 117.000000 118.000000 121.000000 
+127.000000 131.000000 129.000000 125.000000 128.000000 136.000000 
+139.000000 135.000000 130.000000 133.000000 138.000000 139.000000 
+135.000000 129.000000 128.000000 130.000000 132.000000 133.000000 
+130.000000 128.000000 128.000000 131.000000 131.000000 131.000000 
+132.000000 132.000000 125.000000 113.000000 105.000000 111.000000 
+124.000000 135.000000 136.000000 134.000000 133.000000 134.000000 
+132.000000 129.000000 124.000000 120.000000 119.000000 123.000000 
+127.000000 126.000000 122.000000 122.000000 129.000000 131.000000 
+118.000000 94.000000 80.000000 89.000000 115.000000 133.000000 
+135.000000 130.000000 130.000000 131.000000 129.000000 124.000000 
+123.000000 126.000000 127.000000 123.000000 115.000000 104.000000 
+93.000000 92.000000 102.000000 115.000000 121.000000 119.000000 
+118.000000 122.000000 125.000000 126.000000 127.000000 130.000000 
+133.000000 135.000000 137.000000 138.000000 135.000000 130.000000 
+127.000000 129.000000 133.000000 133.000000 131.000000 129.000000 
+128.000000 127.000000 134.000000 133.000000 132.000000 133.000000 
+134.000000 131.000000 127.000000 128.000000 132.000000 131.000000 
+123.000000 115.000000 118.000000 130.000000 143.000000 145.000000 
+138.000000 129.000000 127.000000 129.000000 128.000000 123.000000 
+117.000000 114.000000 117.000000 124.000000 128.000000 126.000000 
+123.000000 127.000000 134.000000 134.000000 118.000000 97.000000 
+86.000000 98.000000 122.000000 134.000000 129.000000 121.000000 
+122.000000 127.000000 128.000000 126.000000 125.000000 126.000000 
+126.000000 125.000000 122.000000 114.000000 100.000000 92.000000 
+97.000000 110.000000 119.000000 122.000000 125.000000 129.000000 
+129.000000 126.000000 126.000000 131.000000 137.000000 138.000000 
+136.000000 135.000000 136.000000 135.000000 133.000000 131.000000 
+129.000000 127.000000 127.000000 129.000000 130.000000 128.000000 
+136.000000 137.000000 137.000000 135.000000 132.000000 130.000000 
+131.000000 132.000000 129.000000 122.000000 116.000000 119.000000 
+129.000000 140.000000 144.000000 137.000000 127.000000 121.000000 
+121.000000 121.000000 115.000000 108.000000 108.000000 121.000000 
+138.000000 145.000000 140.000000 131.000000 129.000000 135.000000 
+141.000000 135.000000 117.000000 99.000000 95.000000 110.000000 
+129.000000 135.000000 129.000000 123.000000 123.000000 126.000000 
+125.000000 121.000000 116.000000 114.000000 116.000000 124.000000 
+131.000000 127.000000 114.000000 102.000000 102.000000 109.000000 
+116.000000 121.000000 126.000000 129.000000 127.000000 125.000000 
+127.000000 132.000000 133.000000 130.000000 132.000000 141.000000 
+146.000000 141.000000 132.000000 128.000000 129.000000 131.000000 
+130.000000 127.000000 122.000000 119.000000 135.000000 138.000000 
+138.000000 134.000000 131.000000 133.000000 135.000000 132.000000 
+123.000000 115.000000 115.000000 124.000000 134.000000 137.000000 
+131.000000 124.000000 120.000000 118.000000 116.000000 116.000000 
+121.000000 129.000000 138.000000 145.000000 147.000000 148.000000 
+145.000000 139.000000 135.000000 136.000000 139.000000 137.000000 
+129.000000 121.000000 118.000000 123.000000 130.000000 135.000000 
+138.000000 139.000000 138.000000 133.000000 123.000000 112.000000 
+105.000000 108.000000 116.000000 121.000000 123.000000 124.000000 
+124.000000 121.000000 115.000000 112.000000 118.000000 127.000000 
+132.000000 131.000000 129.000000 126.000000 123.000000 121.000000 
+123.000000 129.000000 135.000000 136.000000 134.000000 133.000000 
+134.000000 133.000000 131.000000 128.000000 127.000000 125.000000 
+121.000000 118.000000 128.000000 130.000000 133.000000 133.000000 
+130.000000 127.000000 125.000000 124.000000 127.000000 132.000000 
+136.000000 135.000000 129.000000 124.000000 123.000000 123.000000 
+123.000000 121.000000 122.000000 124.000000 128.000000 134.000000 
+139.000000 143.000000 145.000000 146.000000 145.000000 140.000000 
+135.000000 134.000000 135.000000 135.000000 134.000000 132.000000 
+131.000000 130.000000 130.000000 130.000000 132.000000 137.000000 
+142.000000 142.000000 133.000000 119.000000 110.000000 110.000000 
+116.000000 121.000000 123.000000 123.000000 121.000000 114.000000 
+106.000000 107.000000 119.000000 131.000000 132.000000 130.000000 
+131.000000 134.000000 130.000000 122.000000 120.000000 124.000000 
+126.000000 123.000000 123.000000 130.000000 137.000000 139.000000 
+135.000000 130.000000 126.000000 123.000000 119.000000 117.000000 
+133.000000 131.000000 126.000000 125.000000 129.000000 129.000000 
+120.000000 112.000000 117.000000 131.000000 143.000000 144.000000 
+135.000000 124.000000 117.000000 118.000000 130.000000 146.000000 
+151.000000 144.000000 136.000000 134.000000 137.000000 135.000000 
+130.000000 130.000000 137.000000 146.000000 151.000000 150.000000 
+145.000000 139.000000 135.000000 131.000000 127.000000 123.000000 
+124.000000 129.000000 135.000000 135.000000 134.000000 134.000000 
+137.000000 134.000000 123.000000 110.000000 105.000000 111.000000 
+120.000000 123.000000 120.000000 120.000000 123.000000 128.000000 
+128.000000 124.000000 123.000000 128.000000 135.000000 139.000000 
+137.000000 131.000000 123.000000 115.000000 112.000000 118.000000 
+130.000000 137.000000 135.000000 128.000000 125.000000 127.000000 
+129.000000 124.000000 116.000000 114.000000 135.000000 127.000000 
+123.000000 127.000000 132.000000 127.000000 112.000000 103.000000 
+110.000000 127.000000 138.000000 135.000000 126.000000 123.000000 
+134.000000 151.000000 159.000000 153.000000 138.000000 128.000000 
+130.000000 138.000000 142.000000 137.000000 131.000000 131.000000 
+137.000000 141.000000 139.000000 133.000000 131.000000 132.000000 
+133.000000 129.000000 126.000000 130.000000 136.000000 137.000000 
+130.000000 126.000000 132.000000 141.000000 142.000000 132.000000 
+121.000000 118.000000 120.000000 118.000000 115.000000 113.000000 
+115.000000 118.000000 119.000000 121.000000 124.000000 128.000000 
+132.000000 132.000000 128.000000 123.000000 124.000000 129.000000 
+130.000000 124.000000 119.000000 122.000000 129.000000 134.000000 
+134.000000 136.000000 137.000000 134.000000 128.000000 122.000000 
+121.000000 126.000000 137.000000 132.000000 127.000000 126.000000 
+127.000000 127.000000 123.000000 118.000000 112.000000 110.000000 
+113.000000 122.000000 138.000000 149.000000 150.000000 145.000000 
+141.000000 139.000000 138.000000 136.000000 133.000000 132.000000 
+131.000000 128.000000 124.000000 122.000000 123.000000 125.000000 
+128.000000 131.000000 133.000000 135.000000 134.000000 132.000000 
+131.000000 133.000000 137.000000 138.000000 131.000000 121.000000 
+118.000000 124.000000 133.000000 138.000000 142.000000 144.000000 
+142.000000 137.000000 128.000000 119.000000 113.000000 111.000000 
+117.000000 126.000000 133.000000 133.000000 130.000000 129.000000 
+132.000000 136.000000 137.000000 133.000000 127.000000 120.000000 
+119.000000 126.000000 135.000000 138.000000 136.000000 134.000000 
+134.000000 137.000000 137.000000 131.000000 123.000000 120.000000 
+130.000000 134.000000 139.000000 140.000000 134.000000 122.000000 
+111.000000 108.000000 114.000000 127.000000 140.000000 149.000000 
+150.000000 142.000000 132.000000 129.000000 134.000000 136.000000 
+134.000000 130.000000 131.000000 134.000000 133.000000 127.000000 
+122.000000 124.000000 128.000000 131.000000 132.000000 131.000000 
+128.000000 126.000000 126.000000 130.000000 135.000000 137.000000 
+133.000000 127.000000 120.000000 118.000000 124.000000 132.000000 
+139.000000 142.000000 139.000000 135.000000 133.000000 137.000000 
+143.000000 141.000000 130.000000 119.000000 119.000000 130.000000 
+138.000000 135.000000 129.000000 132.000000 139.000000 141.000000 
+134.000000 127.000000 126.000000 128.000000 130.000000 131.000000 
+130.000000 129.000000 129.000000 133.000000 140.000000 145.000000 
+140.000000 130.000000 123.000000 126.000000 133.000000 138.000000 
+137.000000 132.000000 127.000000 120.000000 113.000000 114.000000 
+127.000000 139.000000 138.000000 131.000000 129.000000 134.000000 
+138.000000 136.000000 135.000000 137.000000 137.000000 132.000000 
+126.000000 125.000000 126.000000 123.000000 119.000000 118.000000 
+123.000000 129.000000 133.000000 134.000000 132.000000 130.000000 
+133.000000 141.000000 147.000000 143.000000 132.000000 120.000000 
+116.000000 120.000000 128.000000 136.000000 141.000000 142.000000 
+140.000000 138.000000 135.000000 131.000000 128.000000 127.000000 
+128.000000 131.000000 132.000000 129.000000 123.000000 122.000000 
+127.000000 135.000000 136.000000 129.000000 123.000000 123.000000 
+129.000000 133.000000 133.000000 133.000000 131.000000 127.000000 
+127.000000 133.000000 141.000000 142.000000 136.000000 128.000000 
+123.000000 121.000000 133.000000 144.000000 152.000000 146.000000 
+127.000000 110.000000 110.000000 123.000000 134.000000 135.000000 
+134.000000 137.000000 142.000000 142.000000 138.000000 135.000000 
+136.000000 135.000000 131.000000 126.000000 124.000000 124.000000 
+122.000000 117.000000 112.000000 114.000000 124.000000 137.000000 
+142.000000 134.000000 126.000000 130.000000 142.000000 148.000000 
+139.000000 127.000000 123.000000 124.000000 122.000000 118.000000 
+120.000000 131.000000 141.000000 144.000000 140.000000 135.000000 
+134.000000 135.000000 134.000000 129.000000 124.000000 122.000000 
+122.000000 124.000000 125.000000 126.000000 127.000000 130.000000 
+132.000000 132.000000 132.000000 132.000000 132.000000 132.000000 
+132.000000 130.000000 123.000000 120.000000 126.000000 138.000000 
+143.000000 138.000000 131.000000 129.000000 129.000000 127.000000 
+130.000000 138.000000 142.000000 133.000000 118.000000 114.000000 
+123.000000 129.000000 125.000000 121.000000 125.000000 135.000000 
+141.000000 141.000000 143.000000 147.000000 146.000000 139.000000 
+130.000000 125.000000 124.000000 122.000000 119.000000 117.000000 
+118.000000 119.000000 121.000000 127.000000 133.000000 135.000000 
+136.000000 140.000000 144.000000 145.000000 140.000000 137.000000 
+136.000000 132.000000 125.000000 120.000000 124.000000 133.000000 
+135.000000 132.000000 130.000000 135.000000 141.000000 140.000000 
+135.000000 134.000000 136.000000 133.000000 123.000000 115.000000 
+119.000000 132.000000 139.000000 133.000000 125.000000 124.000000 
+128.000000 131.000000 129.000000 125.000000 126.000000 128.000000 
+131.000000 131.000000 130.000000 129.000000 130.000000 132.000000 
+135.000000 134.000000 131.000000 128.000000 122.000000 131.000000 
+137.000000 131.000000 122.000000 122.000000 129.000000 134.000000 
+132.000000 128.000000 131.000000 137.000000 140.000000 139.000000 
+138.000000 140.000000 141.000000 138.000000 133.000000 131.000000 
+129.000000 126.000000 122.000000 121.000000 122.000000 124.000000 
+128.000000 134.000000 137.000000 137.000000 135.000000 135.000000 
+138.000000 140.000000 139.000000 138.000000 139.000000 136.000000 
+127.000000 119.000000 118.000000 126.000000 133.000000 133.000000 
+131.000000 133.000000 141.000000 147.000000 147.000000 141.000000 
+133.000000 124.000000 114.000000 109.000000 116.000000 128.000000 
+135.000000 131.000000 122.000000 119.000000 125.000000 132.000000 
+134.000000 132.000000 131.000000 131.000000 130.000000 128.000000 
+127.000000 130.000000 133.000000 132.000000 129.000000 127.000000 
+129.000000 131.000000 134.000000 129.000000 125.000000 124.000000 
+125.000000 128.000000 130.000000 132.000000 134.000000 134.000000 
+132.000000 130.000000 131.000000 135.000000 139.000000 140.000000 
+137.000000 133.000000 132.000000 130.000000 123.000000 118.000000 
+119.000000 126.000000 130.000000 128.000000 126.000000 131.000000 
+137.000000 141.000000 142.000000 142.000000 142.000000 141.000000 
+139.000000 139.000000 139.000000 136.000000 133.000000 133.000000 
+134.000000 133.000000 129.000000 127.000000 130.000000 136.000000 
+141.000000 141.000000 138.000000 134.000000 131.000000 126.000000 
+120.000000 117.000000 121.000000 130.000000 135.000000 134.000000 
+130.000000 129.000000 131.000000 132.000000 130.000000 128.000000 
+131.000000 138.000000 141.000000 138.000000 133.000000 130.000000 
+133.000000 136.000000 135.000000 131.000000 131.000000 132.000000 
+127.000000 126.000000 125.000000 126.000000 131.000000 135.000000 
+135.000000 132.000000 130.000000 131.000000 130.000000 127.000000 
+127.000000 131.000000 136.000000 136.000000 133.000000 132.000000 
+132.000000 131.000000 128.000000 129.000000 134.000000 137.000000 
+132.000000 126.000000 126.000000 130.000000 132.000000 132.000000 
+134.000000 136.000000 135.000000 130.000000 125.000000 127.000000 
+133.000000 137.000000 138.000000 137.000000 133.000000 129.000000 
+126.000000 129.000000 134.000000 139.000000 142.000000 142.000000 
+138.000000 133.000000 130.000000 128.000000 125.000000 122.000000 
+122.000000 128.000000 132.000000 131.000000 128.000000 128.000000 
+131.000000 132.000000 129.000000 126.000000 128.000000 131.000000 
+132.000000 129.000000 128.000000 130.000000 135.000000 137.000000 
+136.000000 133.000000 130.000000 129.000000 124.000000 116.000000 
+119.000000 126.000000 131.000000 131.000000 130.000000 129.000000 
+130.000000 130.000000 129.000000 128.000000 132.000000 139.000000 
+144.000000 142.000000 137.000000 131.000000 129.000000 131.000000 
+135.000000 141.000000 143.000000 140.000000 133.000000 128.000000 
+126.000000 127.000000 129.000000 133.000000 135.000000 135.000000 
+133.000000 133.000000 138.000000 143.000000 144.000000 144.000000 
+144.000000 142.000000 137.000000 129.000000 124.000000 126.000000 
+131.000000 135.000000 137.000000 138.000000 137.000000 135.000000 
+136.000000 138.000000 138.000000 135.000000 130.000000 128.000000 
+130.000000 135.000000 136.000000 133.000000 128.000000 127.000000 
+131.000000 135.000000 132.000000 124.000000 118.000000 120.000000 
+130.000000 137.000000 138.000000 134.000000 130.000000 129.000000 
+131.000000 131.000000 122.000000 126.000000 132.000000 134.000000 
+133.000000 132.000000 132.000000 132.000000 128.000000 125.000000 
+126.000000 131.000000 137.000000 142.000000 143.000000 141.000000 
+137.000000 134.000000 133.000000 135.000000 137.000000 138.000000 
+138.000000 136.000000 132.000000 129.000000 126.000000 125.000000 
+124.000000 124.000000 126.000000 128.000000 129.000000 129.000000 
+131.000000 133.000000 134.000000 134.000000 133.000000 134.000000 
+135.000000 131.000000 128.000000 128.000000 132.000000 134.000000 
+131.000000 127.000000 128.000000 131.000000 133.000000 131.000000 
+131.000000 135.000000 139.000000 137.000000 128.000000 120.000000 
+120.000000 123.000000 125.000000 121.000000 117.000000 117.000000 
+121.000000 126.000000 130.000000 134.000000 139.000000 142.000000 
+139.000000 133.000000 128.000000 126.000000 126.000000 127.000000 
+135.000000 138.000000 133.000000 126.000000 125.000000 131.000000 
+137.000000 137.000000 132.000000 128.000000 127.000000 130.000000 
+133.000000 136.000000 136.000000 133.000000 129.000000 127.000000 
+130.000000 137.000000 142.000000 140.000000 136.000000 133.000000 
+133.000000 133.000000 131.000000 127.000000 125.000000 125.000000 
+128.000000 131.000000 134.000000 134.000000 133.000000 132.000000 
+130.000000 129.000000 128.000000 129.000000 129.000000 129.000000 
+129.000000 128.000000 130.000000 131.000000 132.000000 132.000000 
+132.000000 134.000000 134.000000 133.000000 132.000000 134.000000 
+140.000000 144.000000 141.000000 132.000000 123.000000 116.000000 
+111.000000 110.000000 116.000000 128.000000 137.000000 138.000000 
+132.000000 128.000000 129.000000 132.000000 131.000000 130.000000 
+132.000000 135.000000 136.000000 132.000000 134.000000 128.000000 
+125.000000 129.000000 134.000000 133.000000 129.000000 128.000000 
+131.000000 132.000000 129.000000 126.000000 127.000000 132.000000 
+136.000000 136.000000 132.000000 129.000000 131.000000 135.000000 
+138.000000 139.000000 136.000000 133.000000 130.000000 128.000000 
+127.000000 126.000000 124.000000 124.000000 125.000000 129.000000 
+134.000000 135.000000 133.000000 131.000000 132.000000 132.000000 
+129.000000 123.000000 122.000000 130.000000 138.000000 140.000000 
+133.000000 129.000000 131.000000 136.000000 138.000000 134.000000 
+130.000000 129.000000 131.000000 131.000000 130.000000 129.000000 
+129.000000 128.000000 125.000000 118.000000 112.000000 110.000000 
+113.000000 119.000000 121.000000 121.000000 126.000000 134.000000 
+138.000000 137.000000 134.000000 133.000000 133.000000 131.000000 
+128.000000 129.000000 130.000000 128.000000 131.000000 136.000000 
+135.000000 129.000000 127.000000 130.000000 133.000000 132.000000 
+127.000000 125.000000 128.000000 132.000000 133.000000 133.000000 
+135.000000 137.000000 138.000000 137.000000 136.000000 135.000000 
+133.000000 130.000000 127.000000 126.000000 126.000000 126.000000 
+127.000000 128.000000 130.000000 131.000000 129.000000 127.000000 
+127.000000 131.000000 135.000000 136.000000 133.000000 131.000000 
+131.000000 134.000000 137.000000 136.000000 132.000000 131.000000 
+132.000000 133.000000 129.000000 123.000000 121.000000 125.000000 
+132.000000 135.000000 132.000000 131.000000 136.000000 140.000000 
+131.000000 109.000000 92.000000 96.000000 116.000000 131.000000 
+131.000000 123.000000 122.000000 127.000000 130.000000 128.000000 
+128.000000 130.000000 132.000000 131.000000 131.000000 131.000000 
+115.000000 123.000000 120.000000 112.000000 111.000000 115.000000 
+117.000000 118.000000 121.000000 125.000000 131.000000 134.000000 
+137.000000 138.000000 132.000000 124.000000 117.000000 115.000000 
+117.000000 122.000000 130.000000 137.000000 136.000000 130.000000 
+124.000000 124.000000 128.000000 131.000000 133.000000 134.000000 
+134.000000 132.000000 130.000000 126.000000 123.000000 120.000000 
+123.000000 128.000000 130.000000 124.000000 116.000000 112.000000 
+114.000000 117.000000 122.000000 128.000000 135.000000 141.000000 
+145.000000 145.000000 138.000000 130.000000 126.000000 127.000000 
+132.000000 136.000000 141.000000 146.000000 146.000000 137.000000 
+123.000000 113.000000 112.000000 118.000000 124.000000 124.000000 
+122.000000 120.000000 119.000000 119.000000 123.000000 123.000000 
+111.000000 95.000000 96.000000 127.000000 104.000000 105.000000 
+105.000000 105.000000 108.000000 115.000000 122.000000 125.000000 
+122.000000 119.000000 122.000000 126.000000 127.000000 127.000000 
+127.000000 128.000000 128.000000 125.000000 124.000000 126.000000 
+130.000000 131.000000 130.000000 130.000000 132.000000 134.000000 
+134.000000 135.000000 140.000000 144.000000 142.000000 135.000000 
+128.000000 125.000000 122.000000 118.000000 117.000000 120.000000 
+122.000000 120.000000 118.000000 120.000000 127.000000 130.000000 
+131.000000 132.000000 137.000000 140.000000 139.000000 137.000000 
+138.000000 139.000000 136.000000 132.000000 132.000000 137.000000 
+142.000000 143.000000 140.000000 134.000000 125.000000 119.000000 
+118.000000 122.000000 130.000000 134.000000 130.000000 122.000000 
+118.000000 123.000000 130.000000 130.000000 121.000000 115.000000 
+122.000000 136.000000 104.000000 100.000000 104.000000 111.000000 
+113.000000 110.000000 109.000000 109.000000 111.000000 117.000000 
+125.000000 132.000000 133.000000 131.000000 131.000000 131.000000 
+129.000000 127.000000 129.000000 134.000000 140.000000 143.000000 
+142.000000 139.000000 135.000000 133.000000 137.000000 141.000000 
+144.000000 144.000000 141.000000 138.000000 132.000000 126.000000 
+122.000000 120.000000 119.000000 115.000000 113.000000 118.000000 
+127.000000 136.000000 140.000000 134.000000 125.000000 124.000000 
+137.000000 150.000000 152.000000 143.000000 138.000000 140.000000 
+140.000000 133.000000 125.000000 126.000000 134.000000 138.000000 
+135.000000 130.000000 124.000000 120.000000 119.000000 121.000000 
+124.000000 126.000000 124.000000 122.000000 124.000000 129.000000 
+135.000000 137.000000 135.000000 129.000000 124.000000 123.000000 
+115.000000 109.000000 108.000000 111.000000 112.000000 108.000000 
+101.000000 99.000000 105.000000 116.000000 124.000000 127.000000 
+129.000000 132.000000 137.000000 139.000000 137.000000 133.000000 
+129.000000 129.000000 133.000000 137.000000 137.000000 131.000000 
+126.000000 127.000000 134.000000 138.000000 140.000000 142.000000 
+145.000000 142.000000 132.000000 124.000000 125.000000 129.000000 
+130.000000 138.000000 158.000000 188.000000 205.000000 193.000000 
+161.000000 133.000000 122.000000 125.000000 133.000000 142.000000 
+146.000000 142.000000 133.000000 132.000000 137.000000 138.000000 
+131.000000 128.000000 134.000000 138.000000 130.000000 114.000000 
+105.000000 110.000000 118.000000 121.000000 119.000000 117.000000 
+120.000000 126.000000 132.000000 135.000000 136.000000 135.000000 
+133.000000 127.000000 121.000000 118.000000 115.000000 113.000000 
+112.000000 112.000000 114.000000 115.000000 115.000000 112.000000 
+110.000000 110.000000 113.000000 118.000000 125.000000 131.000000 
+136.000000 138.000000 137.000000 131.000000 122.000000 117.000000 
+119.000000 127.000000 133.000000 134.000000 133.000000 135.000000 
+137.000000 139.000000 139.000000 139.000000 140.000000 142.000000 
+141.000000 128.000000 111.000000 109.000000 152.000000 214.000000 
+227.000000 176.000000 130.000000 126.000000 131.000000 133.000000 
+127.000000 124.000000 128.000000 134.000000 138.000000 140.000000 
+136.000000 127.000000 125.000000 129.000000 132.000000 129.000000 
+127.000000 126.000000 121.000000 112.000000 109.000000 115.000000 
+124.000000 127.000000 126.000000 126.000000 129.000000 133.000000 
+137.000000 138.000000 133.000000 127.000000 126.000000 128.000000 
+126.000000 121.000000 129.000000 123.000000 118.000000 116.000000 
+117.000000 121.000000 123.000000 120.000000 115.000000 114.000000 
+117.000000 121.000000 122.000000 123.000000 127.000000 132.000000 
+133.000000 130.000000 126.000000 125.000000 126.000000 125.000000 
+126.000000 131.000000 139.000000 139.000000 135.000000 136.000000 
+140.000000 139.000000 135.000000 135.000000 139.000000 128.000000 
+114.000000 125.000000 182.000000 264.000000 264.000000 156.000000 
+66.000000 47.000000 88.000000 127.000000 128.000000 121.000000 
+130.000000 146.000000 149.000000 140.000000 131.000000 125.000000 
+120.000000 120.000000 126.000000 131.000000 127.000000 122.000000 
+122.000000 124.000000 121.000000 115.000000 113.000000 117.000000 
+121.000000 122.000000 125.000000 134.000000 141.000000 137.000000 
+124.000000 113.000000 114.000000 123.000000 130.000000 130.000000 
+139.000000 133.000000 125.000000 119.000000 118.000000 119.000000 
+120.000000 121.000000 122.000000 124.000000 126.000000 128.000000 
+129.000000 128.000000 128.000000 128.000000 128.000000 127.000000 
+127.000000 132.000000 135.000000 131.000000 125.000000 125.000000 
+127.000000 127.000000 126.000000 125.000000 126.000000 129.000000 
+135.000000 137.000000 134.000000 129.000000 141.000000 168.000000 
+179.000000 176.000000 148.000000 105.000000 90.000000 92.000000 
+110.000000 126.000000 129.000000 131.000000 138.000000 147.000000 
+146.000000 132.000000 120.000000 118.000000 123.000000 126.000000 
+126.000000 126.000000 125.000000 125.000000 127.000000 128.000000 
+123.000000 113.000000 106.000000 108.000000 117.000000 125.000000 
+131.000000 136.000000 137.000000 132.000000 125.000000 120.000000 
+119.000000 123.000000 127.000000 128.000000 124.000000 119.000000 
+121.000000 124.000000 119.000000 106.000000 98.000000 105.000000 
+119.000000 127.000000 129.000000 131.000000 135.000000 135.000000 
+128.000000 117.000000 110.000000 109.000000 113.000000 122.000000 
+133.000000 141.000000 140.000000 129.000000 117.000000 117.000000 
+125.000000 125.000000 121.000000 126.000000 139.000000 141.000000 
+127.000000 124.000000 146.000000 165.000000 147.000000 97.000000 
+59.000000 69.000000 107.000000 133.000000 132.000000 123.000000 
+125.000000 138.000000 145.000000 142.000000 136.000000 130.000000 
+127.000000 125.000000 125.000000 123.000000 118.000000 117.000000 
+122.000000 128.000000 127.000000 122.000000 120.000000 119.000000 
+117.000000 117.000000 122.000000 131.000000 136.000000 133.000000 
+128.000000 126.000000 128.000000 129.000000 126.000000 120.000000 
+119.000000 125.000000 115.000000 118.000000 127.000000 127.000000 
+117.000000 105.000000 105.000000 116.000000 126.000000 130.000000 
+132.000000 134.000000 134.000000 129.000000 123.000000 122.000000 
+123.000000 119.000000 113.000000 116.000000 129.000000 138.000000 
+133.000000 120.000000 116.000000 122.000000 126.000000 125.000000 
+129.000000 140.000000 140.000000 126.000000 116.000000 129.000000 
+148.000000 136.000000 99.000000 72.000000 81.000000 116.000000 
+141.000000 142.000000 131.000000 125.000000 128.000000 138.000000 
+144.000000 140.000000 130.000000 124.000000 123.000000 121.000000 
+119.000000 118.000000 119.000000 120.000000 122.000000 125.000000 
+125.000000 122.000000 121.000000 123.000000 124.000000 122.000000 
+122.000000 125.000000 126.000000 123.000000 121.000000 123.000000 
+124.000000 121.000000 113.000000 106.000000 107.000000 117.000000 
+114.000000 121.000000 124.000000 122.000000 118.000000 119.000000 
+124.000000 130.000000 130.000000 124.000000 117.000000 116.000000 
+119.000000 123.000000 126.000000 128.000000 127.000000 122.000000 
+120.000000 125.000000 130.000000 128.000000 123.000000 123.000000 
+126.000000 124.000000 118.000000 120.000000 133.000000 142.000000 
+132.000000 114.000000 115.000000 142.000000 165.000000 147.000000 
+97.000000 64.000000 74.000000 112.000000 142.000000 147.000000 
+140.000000 136.000000 136.000000 137.000000 139.000000 136.000000 
+128.000000 120.000000 117.000000 116.000000 115.000000 115.000000 
+120.000000 123.000000 124.000000 125.000000 127.000000 128.000000 
+124.000000 121.000000 121.000000 126.000000 130.000000 130.000000 
+126.000000 125.000000 127.000000 127.000000 122.000000 114.000000 
+111.000000 113.000000 111.000000 100.000000 114.000000 113.000000 
+113.000000 116.000000 121.000000 123.000000 121.000000 119.000000 
+118.000000 114.000000 109.000000 108.000000 115.000000 127.000000 
+132.000000 126.000000 118.000000 117.000000 126.000000 132.000000 
+130.000000 126.000000 130.000000 135.000000 134.000000 125.000000 
+120.000000 125.000000 131.000000 128.000000 119.000000 113.000000 
+122.000000 149.000000 183.000000 196.000000 176.000000 139.000000 
+115.000000 117.000000 131.000000 139.000000 140.000000 138.000000 
+137.000000 136.000000 134.000000 129.000000 121.000000 112.000000 
+109.000000 112.000000 114.000000 113.000000 113.000000 117.000000 
+121.000000 122.000000 120.000000 119.000000 120.000000 121.000000 
+125.000000 131.000000 135.000000 134.000000 130.000000 130.000000 
+133.000000 133.000000 126.000000 118.000000 119.000000 127.000000 
+127.000000 106.000000 125.000000 122.000000 120.000000 121.000000 
+123.000000 124.000000 123.000000 121.000000 118.000000 116.000000 
+117.000000 121.000000 127.000000 132.000000 134.000000 131.000000 
+125.000000 121.000000 124.000000 131.000000 135.000000 133.000000 
+130.000000 132.000000 135.000000 130.000000 122.000000 120.000000 
+129.000000 135.000000 127.000000 118.000000 127.000000 161.000000 
+205.000000 242.000000 254.000000 236.000000 202.000000 166.000000 
+137.000000 129.000000 135.000000 141.000000 139.000000 131.000000 
+124.000000 122.000000 121.000000 114.000000 104.000000 100.000000 
+104.000000 109.000000 110.000000 109.000000 108.000000 110.000000 
+113.000000 116.000000 119.000000 122.000000 125.000000 127.000000 
+131.000000 133.000000 132.000000 128.000000 125.000000 125.000000 
+125.000000 123.000000 121.000000 125.000000 130.000000 122.000000 
+131.000000 129.000000 129.000000 131.000000 132.000000 134.000000 
+131.000000 123.000000 116.000000 114.000000 119.000000 125.000000 
+130.000000 133.000000 136.000000 136.000000 130.000000 123.000000 
+124.000000 132.000000 136.000000 131.000000 126.000000 129.000000 
+130.000000 125.000000 127.000000 147.000000 165.000000 166.000000 
+144.000000 116.000000 109.000000 128.000000 167.000000 232.000000 
+288.000000 289.000000 231.000000 146.000000 107.000000 117.000000 
+138.000000 145.000000 141.000000 136.000000 134.000000 131.000000 
+126.000000 118.000000 112.000000 107.000000 106.000000 110.000000 
+115.000000 119.000000 118.000000 116.000000 117.000000 119.000000 
+120.000000 119.000000 121.000000 125.000000 129.000000 129.000000 
+129.000000 130.000000 129.000000 125.000000 120.000000 119.000000 
+124.000000 131.000000 135.000000 128.000000 138.000000 135.000000 
+134.000000 139.000000 147.000000 148.000000 137.000000 120.000000 
+111.000000 111.000000 114.000000 119.000000 127.000000 135.000000 
+139.000000 135.000000 130.000000 129.000000 132.000000 133.000000 
+128.000000 125.000000 128.000000 132.000000 136.000000 154.000000 
+187.000000 215.000000 207.000000 171.000000 136.000000 120.000000 
+115.000000 108.000000 111.000000 163.000000 228.000000 247.000000 
+201.000000 128.000000 105.000000 120.000000 135.000000 138.000000 
+140.000000 144.000000 141.000000 132.000000 122.000000 118.000000 
+115.000000 110.000000 107.000000 113.000000 123.000000 128.000000 
+125.000000 118.000000 113.000000 111.000000 113.000000 117.000000 
+124.000000 127.000000 123.000000 118.000000 122.000000 132.000000 
+137.000000 132.000000 123.000000 120.000000 125.000000 132.000000 
+133.000000 122.000000 142.000000 134.000000 131.000000 140.000000 
+154.000000 155.000000 141.000000 125.000000 116.000000 110.000000 
+106.000000 110.000000 121.000000 133.000000 136.000000 131.000000 
+127.000000 125.000000 127.000000 132.000000 136.000000 133.000000 
+126.000000 133.000000 167.000000 215.000000 247.000000 235.000000 
+186.000000 140.000000 127.000000 136.000000 134.000000 111.000000 
+83.000000 90.000000 138.000000 186.000000 195.000000 167.000000 
+133.000000 121.000000 125.000000 133.000000 139.000000 140.000000 
+136.000000 130.000000 125.000000 120.000000 113.000000 106.000000 
+105.000000 112.000000 119.000000 119.000000 115.000000 113.000000 
+112.000000 111.000000 111.000000 116.000000 125.000000 128.000000 
+123.000000 118.000000 119.000000 125.000000 129.000000 129.000000 
+128.000000 128.000000 129.000000 125.000000 118.000000 115.000000 
+140.000000 138.000000 136.000000 138.000000 144.000000 147.000000 
+143.000000 132.000000 117.000000 104.000000 100.000000 107.000000 
+118.000000 129.000000 135.000000 136.000000 130.000000 124.000000 
+127.000000 137.000000 136.000000 121.000000 121.000000 157.000000 
+197.000000 214.000000 200.000000 163.000000 132.000000 123.000000 
+129.000000 134.000000 127.000000 102.000000 68.000000 55.000000 
+94.000000 161.000000 205.000000 197.000000 153.000000 124.000000 
+121.000000 127.000000 133.000000 136.000000 139.000000 139.000000 
+133.000000 123.000000 117.000000 118.000000 123.000000 126.000000 
+123.000000 118.000000 116.000000 118.000000 122.000000 120.000000 
+116.000000 116.000000 125.000000 133.000000 130.000000 119.000000 
+114.000000 120.000000 131.000000 137.000000 134.000000 129.000000 
+124.000000 120.000000 121.000000 130.000000 139.000000 142.000000 
+139.000000 136.000000 136.000000 141.000000 140.000000 129.000000 
+111.000000 99.000000 99.000000 107.000000 118.000000 128.000000 
+136.000000 139.000000 136.000000 136.000000 138.000000 132.000000 
+116.000000 111.000000 143.000000 184.000000 183.000000 146.000000 
+109.000000 99.000000 114.000000 129.000000 131.000000 130.000000 
+127.000000 108.000000 75.000000 48.000000 61.000000 118.000000 
+181.000000 213.000000 202.000000 165.000000 133.000000 121.000000 
+127.000000 139.000000 145.000000 144.000000 138.000000 130.000000 
+122.000000 123.000000 130.000000 135.000000 131.000000 123.000000 
+120.000000 124.000000 127.000000 122.000000 116.000000 117.000000 
+123.000000 129.000000 128.000000 122.000000 118.000000 122.000000 
+129.000000 134.000000 133.000000 130.000000 127.000000 126.000000 
+127.000000 126.000000 137.000000 139.000000 137.000000 134.000000 
+131.000000 127.000000 123.000000 116.000000 110.000000 105.000000 
+103.000000 103.000000 107.000000 115.000000 124.000000 131.000000 
+137.000000 143.000000 142.000000 130.000000 118.000000 129.000000 
+157.000000 164.000000 137.000000 98.000000 83.000000 93.000000 
+106.000000 109.000000 111.000000 118.000000 118.000000 96.000000 
+63.000000 44.000000 44.000000 76.000000 134.000000 194.000000 
+228.000000 212.000000 162.000000 125.000000 120.000000 135.000000 
+147.000000 149.000000 142.000000 132.000000 123.000000 123.000000 
+131.000000 137.000000 131.000000 124.000000 126.000000 131.000000 
+130.000000 123.000000 121.000000 125.000000 126.000000 123.000000 
+124.000000 129.000000 130.000000 125.000000 121.000000 122.000000 
+126.000000 132.000000 135.000000 133.000000 119.000000 98.000000 
+140.000000 147.000000 147.000000 139.000000 127.000000 121.000000 
+124.000000 125.000000 118.000000 107.000000 99.000000 98.000000 
+103.000000 110.000000 117.000000 123.000000 128.000000 133.000000 
+137.000000 140.000000 144.000000 146.000000 140.000000 124.000000 
+105.000000 97.000000 100.000000 99.000000 90.000000 81.000000 
+84.000000 96.000000 99.000000 81.000000 58.000000 51.000000 
+54.000000 61.000000 84.000000 132.000000 190.000000 220.000000 
+197.000000 150.000000 118.000000 117.000000 132.000000 140.000000 
+136.000000 130.000000 127.000000 127.000000 130.000000 134.000000 
+137.000000 135.000000 128.000000 124.000000 123.000000 123.000000 
+126.000000 131.000000 130.000000 125.000000 122.000000 127.000000 
+130.000000 124.000000 117.000000 122.000000 134.000000 141.000000 
+139.000000 131.000000 118.000000 95.000000 140.000000 146.000000 
+147.000000 140.000000 132.000000 131.000000 135.000000 137.000000 
+134.000000 125.000000 113.000000 106.000000 114.000000 131.000000 
+143.000000 141.000000 133.000000 130.000000 133.000000 136.000000 
+137.000000 137.000000 133.000000 123.000000 112.000000 105.000000 
+103.000000 101.000000 94.000000 85.000000 79.000000 78.000000 
+82.000000 85.000000 86.000000 85.000000 85.000000 76.000000 
+71.000000 84.000000 121.000000 170.000000 189.000000 164.000000 
+124.000000 106.000000 117.000000 133.000000 135.000000 128.000000 
+125.000000 125.000000 122.000000 121.000000 127.000000 131.000000 
+124.000000 114.000000 115.000000 126.000000 137.000000 141.000000 
+141.000000 136.000000 127.000000 123.000000 126.000000 129.000000 
+129.000000 132.000000 140.000000 144.000000 137.000000 129.000000 
+126.000000 118.000000 143.000000 148.000000 145.000000 135.000000 
+127.000000 125.000000 126.000000 128.000000 134.000000 134.000000 
+124.000000 111.000000 110.000000 124.000000 140.000000 147.000000 
+147.000000 144.000000 138.000000 130.000000 127.000000 132.000000 
+140.000000 141.000000 131.000000 118.000000 108.000000 105.000000 
+104.000000 101.000000 94.000000 85.000000 82.000000 90.000000 
+103.000000 109.000000 106.000000 95.000000 83.000000 77.000000 
+86.000000 116.000000 145.000000 147.000000 122.000000 104.000000 
+114.000000 135.000000 139.000000 126.000000 115.000000 117.000000 
+124.000000 124.000000 122.000000 124.000000 125.000000 120.000000 
+118.000000 126.000000 138.000000 146.000000 147.000000 143.000000 
+134.000000 123.000000 121.000000 131.000000 145.000000 149.000000 
+146.000000 139.000000 133.000000 130.000000 134.000000 135.000000 
+137.000000 135.000000 131.000000 128.000000 127.000000 130.000000 
+134.000000 134.000000 125.000000 114.000000 109.000000 111.000000 
+112.000000 107.000000 107.000000 120.000000 135.000000 135.000000 
+124.000000 120.000000 130.000000 140.000000 138.000000 129.000000 
+123.000000 124.000000 123.000000 116.000000 113.000000 120.000000 
+131.000000 127.000000 104.000000 79.000000 74.000000 88.000000 
+104.000000 104.000000 89.000000 77.000000 79.000000 89.000000 
+103.000000 114.000000 115.000000 119.000000 128.000000 137.000000 
+139.000000 127.000000 110.000000 106.000000 118.000000 131.000000 
+136.000000 136.000000 134.000000 127.000000 121.000000 122.000000 
+131.000000 135.000000 132.000000 128.000000 126.000000 124.000000 
+122.000000 128.000000 142.000000 155.000000 155.000000 144.000000 
+133.000000 128.000000 130.000000 133.000000 139.000000 128.000000 
+121.000000 125.000000 133.000000 134.000000 133.000000 134.000000 
+133.000000 130.000000 129.000000 130.000000 129.000000 123.000000 
+118.000000 119.000000 123.000000 120.000000 113.000000 112.000000 
+117.000000 125.000000 128.000000 128.000000 128.000000 126.000000 
+120.000000 113.000000 116.000000 133.000000 148.000000 142.000000 
+109.000000 69.000000 49.000000 61.000000 83.000000 99.000000 
+102.000000 94.000000 87.000000 90.000000 100.000000 114.000000 
+129.000000 136.000000 136.000000 133.000000 129.000000 124.000000 
+117.000000 116.000000 121.000000 126.000000 124.000000 119.000000 
+119.000000 125.000000 130.000000 128.000000 125.000000 125.000000 
+127.000000 128.000000 125.000000 121.000000 123.000000 134.000000 
+151.000000 163.000000 156.000000 137.000000 122.000000 118.000000 
+120.000000 122.000000 142.000000 131.000000 123.000000 125.000000 
+131.000000 132.000000 127.000000 125.000000 128.000000 132.000000 
+132.000000 132.000000 132.000000 129.000000 119.000000 109.000000 
+108.000000 115.000000 122.000000 126.000000 131.000000 136.000000 
+138.000000 133.000000 126.000000 125.000000 127.000000 131.000000 
+134.000000 141.000000 147.000000 140.000000 117.000000 84.000000 
+59.000000 56.000000 74.000000 107.000000 130.000000 130.000000 
+120.000000 119.000000 129.000000 135.000000 134.000000 129.000000 
+129.000000 127.000000 118.000000 111.000000 111.000000 114.000000 
+113.000000 111.000000 113.000000 121.000000 130.000000 136.000000 
+134.000000 124.000000 117.000000 118.000000 127.000000 132.000000 
+130.000000 125.000000 126.000000 133.000000 142.000000 147.000000 
+145.000000 134.000000 122.000000 117.000000 120.000000 126.000000 
+137.000000 135.000000 133.000000 131.000000 130.000000 130.000000 
+128.000000 126.000000 123.000000 123.000000 126.000000 132.000000 
+136.000000 130.000000 117.000000 107.000000 104.000000 105.000000 
+109.000000 119.000000 130.000000 135.000000 128.000000 119.000000 
+118.000000 125.000000 130.000000 130.000000 130.000000 136.000000 
+145.000000 144.000000 124.000000 91.000000 67.000000 61.000000 
+80.000000 112.000000 130.000000 130.000000 125.000000 126.000000 
+126.000000 120.000000 114.000000 118.000000 127.000000 126.000000 
+117.000000 110.000000 112.000000 114.000000 112.000000 115.000000 
+127.000000 138.000000 136.000000 127.000000 120.000000 119.000000 
+119.000000 120.000000 124.000000 128.000000 128.000000 124.000000 
+127.000000 137.000000 146.000000 145.000000 139.000000 132.000000 
+126.000000 121.000000 121.000000 129.000000 140.000000 142.000000 
+141.000000 135.000000 127.000000 123.000000 125.000000 126.000000 
+125.000000 124.000000 131.000000 138.000000 136.000000 128.000000 
+121.000000 121.000000 122.000000 120.000000 121.000000 128.000000 
+134.000000 132.000000 124.000000 119.000000 122.000000 127.000000 
+130.000000 129.000000 129.000000 134.000000 141.000000 142.000000 
+123.000000 90.000000 66.000000 69.000000 98.000000 128.000000 
+136.000000 128.000000 122.000000 126.000000 133.000000 132.000000 
+126.000000 118.000000 112.000000 109.000000 113.000000 121.000000 
+126.000000 127.000000 129.000000 133.000000 135.000000 132.000000 
+124.000000 118.000000 116.000000 118.000000 120.000000 119.000000 
+119.000000 124.000000 129.000000 133.000000 135.000000 137.000000 
+141.000000 143.000000 142.000000 140.000000 135.000000 126.000000 
+121.000000 124.000000 134.000000 136.000000 134.000000 129.000000 
+124.000000 125.000000 129.000000 130.000000 127.000000 124.000000 
+126.000000 129.000000 128.000000 121.000000 117.000000 118.000000 
+122.000000 126.000000 130.000000 135.000000 136.000000 133.000000 
+126.000000 121.000000 120.000000 123.000000 129.000000 131.000000 
+128.000000 130.000000 138.000000 143.000000 127.000000 93.000000 
+68.000000 73.000000 104.000000 129.000000 130.000000 120.000000 
+119.000000 127.000000 134.000000 133.000000 127.000000 117.000000 
+107.000000 104.000000 113.000000 127.000000 134.000000 133.000000 
+132.000000 135.000000 137.000000 135.000000 132.000000 130.000000 
+124.000000 116.000000 115.000000 128.000000 144.000000 149.000000 
+141.000000 132.000000 131.000000 133.000000 135.000000 134.000000 
+134.000000 131.000000 128.000000 127.000000 131.000000 137.000000 
+128.000000 127.000000 124.000000 123.000000 127.000000 130.000000 
+129.000000 124.000000 121.000000 122.000000 127.000000 130.000000 
+127.000000 119.000000 111.000000 107.000000 109.000000 115.000000 
+124.000000 132.000000 134.000000 130.000000 123.000000 117.000000 
+117.000000 122.000000 130.000000 133.000000 130.000000 128.000000 
+132.000000 133.000000 117.000000 87.000000 65.000000 73.000000 
+105.000000 130.000000 132.000000 124.000000 123.000000 130.000000 
+135.000000 134.000000 132.000000 128.000000 119.000000 108.000000 
+108.000000 121.000000 135.000000 140.000000 135.000000 131.000000 
+130.000000 128.000000 123.000000 120.000000 124.000000 131.000000 
+134.000000 135.000000 136.000000 139.000000 137.000000 132.000000 
+129.000000 134.000000 141.000000 144.000000 141.000000 134.000000 
+130.000000 128.000000 129.000000 130.000000 140.000000 132.000000 
+127.000000 127.000000 129.000000 128.000000 127.000000 128.000000 
+131.000000 133.000000 133.000000 133.000000 129.000000 120.000000 
+111.000000 109.000000 113.000000 119.000000 124.000000 127.000000 
+127.000000 127.000000 125.000000 124.000000 123.000000 125.000000 
+129.000000 132.000000 132.000000 135.000000 139.000000 136.000000 
+115.000000 84.000000 69.000000 83.000000 115.000000 136.000000 
+136.000000 126.000000 123.000000 126.000000 129.000000 128.000000 
+125.000000 119.000000 114.000000 114.000000 119.000000 126.000000 
+131.000000 134.000000 134.000000 128.000000 120.000000 119.000000 
+124.000000 129.000000 130.000000 130.000000 131.000000 129.000000 
+125.000000 123.000000 127.000000 133.000000 137.000000 139.000000 
+142.000000 143.000000 140.000000 135.000000 133.000000 134.000000 
+134.000000 133.000000 136.000000 132.000000 131.000000 132.000000 
+131.000000 129.000000 129.000000 131.000000 133.000000 133.000000 
+129.000000 123.000000 116.000000 112.000000 114.000000 121.000000 
+128.000000 132.000000 134.000000 133.000000 132.000000 130.000000 
+129.000000 126.000000 122.000000 121.000000 123.000000 124.000000 
+124.000000 127.000000 134.000000 131.000000 113.000000 88.000000 
+77.000000 90.000000 116.000000 134.000000 136.000000 131.000000 
+127.000000 125.000000 123.000000 121.000000 119.000000 117.000000 
+118.000000 119.000000 121.000000 120.000000 117.000000 115.000000 
+113.000000 114.000000 118.000000 123.000000 126.000000 125.000000 
+125.000000 129.000000 133.000000 132.000000 129.000000 129.000000 
+132.000000 134.000000 132.000000 132.000000 137.000000 141.000000 
+141.000000 136.000000 134.000000 134.000000 134.000000 133.000000 
+131.000000 130.000000 130.000000 130.000000 130.000000 129.000000 
+130.000000 134.000000 137.000000 135.000000 125.000000 115.000000 
+113.000000 121.000000 131.000000 135.000000 131.000000 127.000000 
+125.000000 126.000000 130.000000 137.000000 141.000000 138.000000 
+131.000000 127.000000 128.000000 128.000000 128.000000 130.000000 
+132.000000 126.000000 108.000000 91.000000 86.000000 101.000000 
+123.000000 137.000000 138.000000 130.000000 121.000000 118.000000 
+120.000000 123.000000 124.000000 125.000000 124.000000 123.000000 
+123.000000 121.000000 118.000000 113.000000 107.000000 106.000000 
+112.000000 122.000000 130.000000 134.000000 133.000000 131.000000 
+127.000000 124.000000 125.000000 129.000000 133.000000 132.000000 
+130.000000 131.000000 135.000000 138.000000 137.000000 135.000000 
+135.000000 133.000000 129.000000 124.000000 128.000000 131.000000 
+134.000000 135.000000 133.000000 129.000000 126.000000 126.000000 
+124.000000 117.000000 110.000000 111.000000 121.000000 131.000000 
+134.000000 134.000000 133.000000 132.000000 126.000000 119.000000 
+119.000000 129.000000 137.000000 136.000000 132.000000 131.000000 
+132.000000 129.000000 126.000000 129.000000 135.000000 131.000000 
+115.000000 100.000000 100.000000 115.000000 133.000000 140.000000 
+135.000000 125.000000 119.000000 117.000000 118.000000 120.000000 
+122.000000 122.000000 121.000000 120.000000 120.000000 122.000000 
+122.000000 118.000000 111.000000 108.000000 111.000000 119.000000 
+127.000000 131.000000 131.000000 128.000000 127.000000 128.000000 
+130.000000 130.000000 129.000000 131.000000 139.000000 143.000000 
+139.000000 131.000000 127.000000 131.000000 136.000000 133.000000 
+125.000000 119.000000 130.000000 133.000000 134.000000 131.000000 
+127.000000 126.000000 127.000000 126.000000 119.000000 110.000000 
+107.000000 113.000000 123.000000 130.000000 133.000000 136.000000 
+139.000000 133.000000 117.000000 108.000000 115.000000 135.000000 
+149.000000 148.000000 139.000000 132.000000 129.000000 125.000000 
+124.000000 128.000000 134.000000 132.000000 121.000000 109.000000 
+106.000000 116.000000 130.000000 138.000000 133.000000 125.000000 
+123.000000 129.000000 131.000000 125.000000 116.000000 111.000000 
+112.000000 115.000000 120.000000 128.000000 132.000000 126.000000 
+116.000000 111.000000 115.000000 121.000000 125.000000 128.000000 
+131.000000 132.000000 129.000000 127.000000 128.000000 129.000000 
+127.000000 127.000000 129.000000 132.000000 132.000000 131.000000 
+130.000000 130.000000 129.000000 126.000000 122.000000 118.000000 
+136.000000 136.000000 134.000000 127.000000 119.000000 119.000000 
+126.000000 129.000000 123.000000 114.000000 114.000000 124.000000 
+133.000000 133.000000 127.000000 121.000000 119.000000 117.000000 
+114.000000 118.000000 127.000000 137.000000 143.000000 144.000000 
+141.000000 138.000000 136.000000 136.000000 137.000000 140.000000 
+141.000000 140.000000 135.000000 130.000000 128.000000 131.000000 
+137.000000 138.000000 133.000000 128.000000 128.000000 135.000000 
+139.000000 132.000000 118.000000 108.000000 109.000000 118.000000 
+126.000000 129.000000 127.000000 124.000000 117.000000 111.000000 
+111.000000 117.000000 124.000000 128.000000 130.000000 131.000000 
+130.000000 125.000000 122.000000 123.000000 127.000000 128.000000 
+127.000000 126.000000 129.000000 131.000000 132.000000 133.000000 
+132.000000 128.000000 121.000000 116.000000 134.000000 135.000000 
+135.000000 132.000000 130.000000 130.000000 128.000000 121.000000 
+114.000000 114.000000 124.000000 136.000000 142.000000 137.000000 
+126.000000 119.000000 120.000000 129.000000 137.000000 135.000000 
+129.000000 126.000000 129.000000 132.000000 130.000000 127.000000 
+129.000000 134.000000 137.000000 136.000000 136.000000 136.000000 
+134.000000 131.000000 128.000000 130.000000 132.000000 133.000000 
+131.000000 130.000000 130.000000 133.000000 135.000000 133.000000 
+124.000000 116.000000 113.000000 119.000000 125.000000 129.000000 
+129.000000 128.000000 124.000000 119.000000 117.000000 121.000000 
+128.000000 134.000000 135.000000 132.000000 127.000000 124.000000 
+125.000000 128.000000 128.000000 127.000000 130.000000 135.000000 
+137.000000 132.000000 127.000000 127.000000 128.000000 126.000000 
+122.000000 121.000000 133.000000 134.000000 130.000000 126.000000 
+130.000000 139.000000 139.000000 127.000000 114.000000 113.000000 
+119.000000 120.000000 116.000000 117.000000 128.000000 140.000000 
+144.000000 140.000000 130.000000 121.000000 121.000000 129.000000 
+137.000000 136.000000 129.000000 124.000000 127.000000 134.000000 
+139.000000 138.000000 133.000000 129.000000 128.000000 128.000000 
+127.000000 128.000000 132.000000 135.000000 134.000000 126.000000 
+121.000000 125.000000 134.000000 139.000000 139.000000 133.000000 
+125.000000 117.000000 114.000000 118.000000 123.000000 122.000000 
+117.000000 114.000000 117.000000 121.000000 123.000000 123.000000 
+122.000000 122.000000 125.000000 132.000000 138.000000 137.000000 
+128.000000 120.000000 121.000000 128.000000 135.000000 140.000000 
+142.000000 140.000000 132.000000 123.000000 119.000000 119.000000 
+140.000000 138.000000 131.000000 128.000000 131.000000 130.000000 
+120.000000 111.000000 114.000000 121.000000 124.000000 126.000000 
+134.000000 143.000000 145.000000 137.000000 127.000000 125.000000 
+128.000000 129.000000 129.000000 132.000000 134.000000 132.000000 
+126.000000 124.000000 128.000000 132.000000 132.000000 128.000000 
+128.000000 131.000000 131.000000 125.000000 121.000000 127.000000 
+140.000000 145.000000 135.000000 118.000000 111.000000 119.000000 
+130.000000 134.000000 132.000000 129.000000 128.000000 125.000000 
+121.000000 118.000000 118.000000 118.000000 116.000000 114.000000 
+117.000000 125.000000 131.000000 134.000000 131.000000 130.000000 
+132.000000 133.000000 131.000000 128.000000 129.000000 131.000000 
+130.000000 128.000000 131.000000 140.000000 147.000000 144.000000 
+135.000000 125.000000 120.000000 117.000000 137.000000 134.000000 
+136.000000 140.000000 138.000000 130.000000 123.000000 123.000000 
+129.000000 133.000000 134.000000 136.000000 138.000000 138.000000 
+136.000000 136.000000 138.000000 138.000000 134.000000 129.000000 
+130.000000 133.000000 134.000000 130.000000 124.000000 119.000000 
+117.000000 120.000000 127.000000 133.000000 133.000000 130.000000 
+127.000000 127.000000 128.000000 131.000000 136.000000 137.000000 
+128.000000 115.000000 112.000000 121.000000 134.000000 140.000000 
+137.000000 133.000000 134.000000 135.000000 130.000000 122.000000 
+117.000000 121.000000 128.000000 134.000000 133.000000 130.000000 
+127.000000 129.000000 131.000000 131.000000 131.000000 131.000000 
+130.000000 127.000000 125.000000 126.000000 129.000000 130.000000 
+130.000000 134.000000 140.000000 143.000000 138.000000 128.000000 
+123.000000 126.000000 131.000000 129.000000 132.000000 135.000000 
+133.000000 127.000000 125.000000 128.000000 131.000000 132.000000 
+131.000000 132.000000 136.000000 141.000000 144.000000 141.000000 
+138.000000 135.000000 132.000000 126.000000 121.000000 120.000000 
+124.000000 129.000000 130.000000 127.000000 126.000000 126.000000 
+129.000000 132.000000 133.000000 131.000000 130.000000 129.000000 
+129.000000 130.000000 131.000000 131.000000 129.000000 128.000000 
+129.000000 131.000000 136.000000 139.000000 137.000000 133.000000 
+132.000000 133.000000 134.000000 137.000000 142.000000 146.000000 
+146.000000 139.000000 128.000000 123.000000 128.000000 137.000000 
+139.000000 132.000000 125.000000 123.000000 125.000000 125.000000 
+124.000000 125.000000 127.000000 129.000000 129.000000 131.000000 
+136.000000 140.000000 138.000000 130.000000 123.000000 123.000000 
+121.000000 127.000000 132.000000 130.000000 126.000000 127.000000 
+134.000000 139.000000 136.000000 129.000000 126.000000 131.000000 
+138.000000 141.000000 139.000000 136.000000 135.000000 133.000000 
+129.000000 123.000000 121.000000 124.000000 127.000000 127.000000 
+124.000000 123.000000 126.000000 131.000000 134.000000 134.000000 
+133.000000 132.000000 129.000000 125.000000 124.000000 129.000000 
+138.000000 140.000000 134.000000 127.000000 126.000000 127.000000 
+128.000000 131.000000 134.000000 137.000000 138.000000 134.000000 
+132.000000 132.000000 132.000000 130.000000 131.000000 136.000000 
+141.000000 140.000000 132.000000 128.000000 129.000000 130.000000 
+127.000000 126.000000 128.000000 130.000000 128.000000 126.000000 
+127.000000 129.000000 131.000000 132.000000 133.000000 133.000000 
+132.000000 129.000000 128.000000 129.000000 133.000000 136.000000 
+135.000000 130.000000 125.000000 123.000000 125.000000 128.000000 
+129.000000 127.000000 124.000000 126.000000 132.000000 138.000000 
+142.000000 142.000000 142.000000 140.000000 136.000000 129.000000 
+124.000000 123.000000 125.000000 127.000000 128.000000 127.000000 
+128.000000 130.000000 133.000000 133.000000 131.000000 129.000000 
+127.000000 127.000000 127.000000 130.000000 134.000000 135.000000 
+132.000000 129.000000 131.000000 134.000000 133.000000 127.000000 
+125.000000 129.000000 133.000000 134.000000 134.000000 138.000000 
+139.000000 131.000000 119.000000 116.000000 126.000000 139.000000 
+142.000000 136.000000 128.000000 128.000000 131.000000 133.000000 
+133.000000 130.000000 129.000000 129.000000 131.000000 134.000000 
+137.000000 137.000000 137.000000 136.000000 134.000000 130.000000 
+126.000000 126.000000 133.000000 136.000000 134.000000 128.000000 
+124.000000 126.000000 132.000000 135.000000 133.000000 128.000000 
+128.000000 134.000000 140.000000 142.000000 141.000000 139.000000 
+138.000000 138.000000 136.000000 131.000000 127.000000 124.000000 
+124.000000 125.000000 127.000000 129.000000 132.000000 136.000000 
+140.000000 142.000000 140.000000 136.000000 132.000000 130.000000 
+129.000000 132.000000 137.000000 139.000000 135.000000 129.000000 
+127.000000 130.000000 131.000000 128.000000 124.000000 125.000000 
+132.000000 138.000000 139.000000 134.000000 129.000000 125.000000 
+120.000000 117.000000 120.000000 130.000000 140.000000 140.000000 
+129.000000 120.000000 122.000000 131.000000 135.000000 131.000000 
+126.000000 127.000000 131.000000 133.000000 132.000000 131.000000 
+131.000000 131.000000 133.000000 135.000000 136.000000 132.000000 
+132.000000 130.000000 126.000000 123.000000 124.000000 129.000000 
+133.000000 133.000000 131.000000 129.000000 130.000000 133.000000 
+139.000000 143.000000 143.000000 140.000000 135.000000 132.000000 
+131.000000 131.000000 130.000000 128.000000 125.000000 125.000000 
+128.000000 134.000000 139.000000 141.000000 141.000000 141.000000 
+141.000000 141.000000 139.000000 134.000000 130.000000 130.000000 
+135.000000 139.000000 140.000000 138.000000 134.000000 130.000000 
+127.000000 125.000000 125.000000 128.000000 133.000000 139.000000 
+140.000000 136.000000 128.000000 123.000000 123.000000 127.000000 
+132.000000 134.000000 132.000000 128.000000 122.000000 120.000000 
+122.000000 128.000000 134.000000 135.000000 134.000000 132.000000 
+131.000000 129.000000 125.000000 124.000000 128.000000 134.000000 
+135.000000 130.000000 127.000000 128.000000 127.000000 130.000000 
+135.000000 132.000000 125.000000 124.000000 128.000000 132.000000 
+130.000000 127.000000 128.000000 134.000000 140.000000 142.000000 
+140.000000 137.000000 135.000000 135.000000 136.000000 134.000000 
+130.000000 127.000000 131.000000 138.000000 141.000000 139.000000 
+134.000000 132.000000 131.000000 130.000000 129.000000 129.000000 
+131.000000 133.000000 135.000000 137.000000 140.000000 142.000000 
+143.000000 140.000000 134.000000 130.000000 130.000000 133.000000 
+134.000000 132.000000 133.000000 138.000000 141.000000 140.000000 
+136.000000 132.000000 130.000000 127.000000 127.000000 130.000000 
+132.000000 130.000000 127.000000 126.000000 126.000000 126.000000 
+128.000000 132.000000 136.000000 135.000000 132.000000 132.000000 
+133.000000 133.000000 133.000000 134.000000 133.000000 130.000000 
+127.000000 127.000000 133.000000 132.000000 130.000000 126.000000 
+124.000000 130.000000 139.000000 141.000000 133.000000 124.000000 
+125.000000 133.000000 139.000000 139.000000 135.000000 133.000000 
+131.000000 129.000000 128.000000 128.000000 129.000000 131.000000 
+134.000000 136.000000 136.000000 135.000000 133.000000 131.000000 
+129.000000 130.000000 132.000000 132.000000 129.000000 127.000000 
+128.000000 131.000000 133.000000 134.000000 134.000000 133.000000 
+134.000000 136.000000 136.000000 134.000000 129.000000 127.000000 
+132.000000 138.000000 139.000000 136.000000 132.000000 133.000000 
+132.000000 127.000000 122.000000 124.000000 134.000000 145.000000 
+146.000000 139.000000 130.000000 127.000000 133.000000 139.000000 
+136.000000 131.000000 131.000000 138.000000 142.000000 137.000000 
+127.000000 122.000000 126.000000 134.000000 137.000000 133.000000 
+135.000000 135.000000 133.000000 128.000000 126.000000 129.000000 
+132.000000 134.000000 131.000000 129.000000 129.000000 132.000000 
+135.000000 138.000000 139.000000 139.000000 136.000000 133.000000 
+132.000000 134.000000 137.000000 138.000000 136.000000 132.000000 
+130.000000 132.000000 136.000000 137.000000 133.000000 127.000000 
+125.000000 130.000000 134.000000 135.000000 133.000000 131.000000 
+130.000000 129.000000 129.000000 131.000000 132.000000 133.000000 
+131.000000 131.000000 132.000000 133.000000 132.000000 129.000000 
+129.000000 133.000000 139.000000 141.000000 138.000000 133.000000 
+130.000000 131.000000 132.000000 132.000000 131.000000 132.000000 
+132.000000 129.000000 126.000000 124.000000 128.000000 133.000000 
+137.000000 139.000000 139.000000 138.000000 135.000000 130.000000 
+126.000000 127.000000 131.000000 135.000000 139.000000 139.000000 
+129.000000 119.000000 116.000000 122.000000 128.000000 130.000000 
+129.000000 130.000000 133.000000 137.000000 139.000000 140.000000 
+138.000000 134.000000 130.000000 129.000000 132.000000 135.000000 
+136.000000 134.000000 134.000000 135.000000 136.000000 133.000000 
+130.000000 130.000000 131.000000 129.000000 123.000000 121.000000 
+127.000000 137.000000 142.000000 138.000000 132.000000 128.000000 
+128.000000 128.000000 129.000000 131.000000 133.000000 132.000000 
+131.000000 132.000000 135.000000 136.000000 135.000000 134.000000 
+133.000000 133.000000 131.000000 131.000000 132.000000 131.000000 
+131.000000 134.000000 139.000000 136.000000 124.000000 111.000000 
+110.000000 121.000000 132.000000 135.000000 133.000000 133.000000 
+135.000000 137.000000 135.000000 130.000000 126.000000 125.000000 
+129.000000 135.000000 130.000000 130.000000 128.000000 124.000000 
+123.000000 125.000000 128.000000 132.000000 135.000000 136.000000 
+134.000000 130.000000 129.000000 132.000000 135.000000 135.000000 
+133.000000 132.000000 133.000000 135.000000 135.000000 133.000000 
+132.000000 133.000000 136.000000 136.000000 132.000000 126.000000 
+123.000000 126.000000 131.000000 134.000000 132.000000 132.000000 
+133.000000 136.000000 136.000000 133.000000 128.000000 125.000000 
+123.000000 123.000000 127.000000 132.000000 135.000000 133.000000 
+129.000000 129.000000 132.000000 135.000000 135.000000 133.000000 
+130.000000 130.000000 130.000000 134.000000 141.000000 144.000000 
+138.000000 123.000000 110.000000 110.000000 121.000000 129.000000 
+130.000000 128.000000 131.000000 135.000000 137.000000 136.000000 
+131.000000 126.000000 122.000000 124.000000 129.000000 133.000000 
+125.000000 127.000000 131.000000 133.000000 132.000000 130.000000 
+131.000000 134.000000 137.000000 135.000000 132.000000 131.000000 
+132.000000 133.000000 130.000000 127.000000 128.000000 133.000000 
+138.000000 139.000000 137.000000 136.000000 135.000000 132.000000 
+128.000000 125.000000 125.000000 128.000000 130.000000 131.000000 
+131.000000 133.000000 133.000000 134.000000 134.000000 136.000000 
+138.000000 138.000000 133.000000 128.000000 125.000000 125.000000 
+125.000000 127.000000 131.000000 138.000000 141.000000 137.000000 
+131.000000 126.000000 126.000000 130.000000 134.000000 136.000000 
+136.000000 135.000000 134.000000 132.000000 128.000000 124.000000 
+124.000000 129.000000 132.000000 131.000000 129.000000 130.000000 
+134.000000 135.000000 131.000000 128.000000 129.000000 131.000000 
+131.000000 127.000000 124.000000 125.000000 113.000000 118.000000 
+114.000000 109.000000 108.000000 114.000000 124.000000 130.000000 
+129.000000 121.000000 118.000000 123.000000 131.000000 134.000000 
+133.000000 129.000000 124.000000 121.000000 123.000000 127.000000 
+128.000000 127.000000 131.000000 136.000000 135.000000 130.000000 
+127.000000 128.000000 129.000000 129.000000 129.000000 129.000000 
+130.000000 130.000000 129.000000 128.000000 127.000000 127.000000 
+128.000000 127.000000 125.000000 121.000000 119.000000 119.000000 
+123.000000 130.000000 137.000000 141.000000 142.000000 140.000000 
+134.000000 126.000000 124.000000 126.000000 131.000000 134.000000 
+139.000000 145.000000 147.000000 143.000000 134.000000 123.000000 
+111.000000 107.000000 112.000000 122.000000 126.000000 126.000000 
+126.000000 129.000000 131.000000 130.000000 127.000000 122.000000 
+110.000000 95.000000 112.000000 115.000000 109.000000 101.000000 
+104.000000 116.000000 125.000000 122.000000 116.000000 116.000000 
+123.000000 131.000000 132.000000 133.000000 135.000000 134.000000 
+129.000000 126.000000 128.000000 130.000000 132.000000 137.000000 
+141.000000 139.000000 133.000000 131.000000 134.000000 138.000000 
+139.000000 137.000000 134.000000 132.000000 132.000000 132.000000 
+130.000000 127.000000 125.000000 126.000000 128.000000 128.000000 
+128.000000 129.000000 131.000000 131.000000 130.000000 133.000000 
+140.000000 145.000000 143.000000 135.000000 130.000000 127.000000 
+124.000000 123.000000 127.000000 134.000000 139.000000 139.000000 
+137.000000 134.000000 128.000000 122.000000 117.000000 118.000000 
+124.000000 130.000000 130.000000 126.000000 124.000000 128.000000 
+134.000000 137.000000 136.000000 130.000000 116.000000 102.000000 
+106.000000 109.000000 111.000000 109.000000 109.000000 113.000000 
+112.000000 106.000000 103.000000 111.000000 122.000000 127.000000 
+130.000000 134.000000 137.000000 133.000000 124.000000 120.000000 
+123.000000 129.000000 137.000000 143.000000 145.000000 142.000000 
+138.000000 137.000000 140.000000 144.000000 148.000000 147.000000 
+145.000000 142.000000 140.000000 136.000000 129.000000 125.000000 
+123.000000 119.000000 116.000000 120.000000 134.000000 148.000000 
+151.000000 144.000000 136.000000 137.000000 143.000000 149.000000 
+146.000000 137.000000 130.000000 131.000000 132.000000 128.000000 
+125.000000 127.000000 132.000000 134.000000 133.000000 130.000000 
+124.000000 118.000000 114.000000 115.000000 118.000000 121.000000 
+124.000000 128.000000 129.000000 128.000000 128.000000 131.000000 
+136.000000 136.000000 129.000000 120.000000 100.000000 102.000000 
+111.000000 116.000000 112.000000 106.000000 104.000000 105.000000 
+109.000000 112.000000 117.000000 122.000000 130.000000 138.000000 
+142.000000 139.000000 134.000000 131.000000 130.000000 130.000000 
+132.000000 134.000000 136.000000 134.000000 130.000000 128.000000 
+130.000000 134.000000 143.000000 152.000000 155.000000 148.000000 
+137.000000 130.000000 127.000000 124.000000 118.000000 112.000000 
+115.000000 126.000000 141.000000 147.000000 139.000000 129.000000 
+129.000000 137.000000 145.000000 147.000000 145.000000 140.000000 
+136.000000 136.000000 133.000000 126.000000 119.000000 120.000000 
+126.000000 128.000000 123.000000 117.000000 114.000000 111.000000 
+110.000000 112.000000 118.000000 124.000000 128.000000 130.000000 
+130.000000 128.000000 127.000000 129.000000 132.000000 130.000000 
+126.000000 124.000000 114.000000 112.000000 119.000000 122.000000 
+118.000000 110.000000 107.000000 108.000000 110.000000 113.000000 
+118.000000 126.000000 133.000000 138.000000 142.000000 145.000000 
+144.000000 138.000000 129.000000 122.000000 121.000000 124.000000 
+129.000000 131.000000 134.000000 135.000000 133.000000 133.000000 
+140.000000 149.000000 150.000000 142.000000 135.000000 133.000000 
+130.000000 120.000000 112.000000 112.000000 125.000000 128.000000 
+110.000000 102.000000 113.000000 130.000000 142.000000 146.000000 
+144.000000 140.000000 141.000000 144.000000 141.000000 133.000000 
+128.000000 127.000000 127.000000 124.000000 122.000000 123.000000 
+123.000000 121.000000 118.000000 116.000000 115.000000 116.000000 
+118.000000 124.000000 131.000000 136.000000 137.000000 135.000000 
+130.000000 127.000000 126.000000 125.000000 123.000000 121.000000 
+119.000000 124.000000 129.000000 129.000000 124.000000 119.000000 
+116.000000 113.000000 109.000000 110.000000 115.000000 124.000000 
+133.000000 137.000000 137.000000 134.000000 133.000000 130.000000 
+125.000000 121.000000 121.000000 125.000000 130.000000 134.000000 
+139.000000 142.000000 143.000000 143.000000 146.000000 148.000000 
+145.000000 140.000000 142.000000 147.000000 141.000000 128.000000 
+123.000000 149.000000 196.000000 201.000000 151.000000 111.000000 
+109.000000 124.000000 130.000000 130.000000 135.000000 146.000000 
+152.000000 149.000000 144.000000 137.000000 130.000000 127.000000 
+127.000000 127.000000 127.000000 130.000000 136.000000 137.000000 
+128.000000 114.000000 108.000000 112.000000 121.000000 128.000000 
+131.000000 134.000000 138.000000 139.000000 132.000000 123.000000 
+120.000000 125.000000 128.000000 123.000000 121.000000 126.000000 
+128.000000 126.000000 125.000000 123.000000 118.000000 112.000000 
+110.000000 113.000000 118.000000 124.000000 133.000000 138.000000 
+133.000000 124.000000 120.000000 124.000000 128.000000 126.000000 
+122.000000 123.000000 128.000000 133.000000 133.000000 131.000000 
+130.000000 134.000000 138.000000 141.000000 145.000000 145.000000 
+141.000000 137.000000 136.000000 137.000000 131.000000 127.000000 
+135.000000 136.000000 130.000000 124.000000 126.000000 132.000000 
+131.000000 127.000000 130.000000 141.000000 149.000000 144.000000 
+136.000000 132.000000 126.000000 117.000000 115.000000 123.000000 
+132.000000 134.000000 131.000000 129.000000 126.000000 119.000000 
+112.000000 112.000000 118.000000 121.000000 120.000000 120.000000 
+125.000000 129.000000 126.000000 119.000000 119.000000 124.000000 
+126.000000 120.000000 136.000000 137.000000 131.000000 128.000000 
+129.000000 128.000000 121.000000 117.000000 119.000000 124.000000 
+126.000000 127.000000 128.000000 127.000000 123.000000 120.000000 
+122.000000 126.000000 126.000000 124.000000 122.000000 124.000000 
+128.000000 130.000000 129.000000 127.000000 129.000000 136.000000 
+143.000000 146.000000 144.000000 138.000000 134.000000 133.000000 
+133.000000 124.000000 103.000000 79.000000 71.000000 84.000000 
+107.000000 124.000000 131.000000 136.000000 141.000000 142.000000 
+139.000000 135.000000 136.000000 137.000000 131.000000 122.000000 
+115.000000 113.000000 115.000000 121.000000 127.000000 129.000000 
+126.000000 125.000000 126.000000 126.000000 122.000000 118.000000 
+118.000000 120.000000 123.000000 126.000000 127.000000 124.000000 
+118.000000 117.000000 120.000000 119.000000 115.000000 116.000000 
+140.000000 135.000000 128.000000 128.000000 130.000000 129.000000 
+126.000000 126.000000 125.000000 122.000000 120.000000 123.000000 
+123.000000 120.000000 118.000000 123.000000 128.000000 127.000000 
+123.000000 124.000000 130.000000 134.000000 131.000000 129.000000 
+127.000000 125.000000 121.000000 123.000000 132.000000 143.000000 
+143.000000 132.000000 125.000000 133.000000 137.000000 115.000000 
+77.000000 55.000000 73.000000 114.000000 142.000000 142.000000 
+131.000000 126.000000 132.000000 141.000000 143.000000 136.000000 
+128.000000 126.000000 128.000000 126.000000 122.000000 120.000000 
+119.000000 118.000000 117.000000 119.000000 125.000000 128.000000 
+128.000000 125.000000 122.000000 122.000000 124.000000 125.000000 
+126.000000 129.000000 130.000000 126.000000 118.000000 111.000000 
+110.000000 112.000000 116.000000 123.000000 143.000000 132.000000 
+125.000000 125.000000 129.000000 130.000000 130.000000 130.000000 
+127.000000 120.000000 116.000000 118.000000 124.000000 130.000000 
+131.000000 127.000000 122.000000 122.000000 129.000000 138.000000 
+141.000000 138.000000 133.000000 128.000000 121.000000 115.000000 
+113.000000 117.000000 128.000000 139.000000 140.000000 129.000000 
+124.000000 143.000000 174.000000 178.000000 142.000000 104.000000 
+97.000000 115.000000 136.000000 139.000000 135.000000 135.000000 
+138.000000 137.000000 133.000000 129.000000 124.000000 120.000000 
+118.000000 122.000000 126.000000 126.000000 121.000000 114.000000 
+109.000000 110.000000 114.000000 119.000000 123.000000 124.000000 
+127.000000 132.000000 135.000000 133.000000 129.000000 127.000000 
+126.000000 124.000000 117.000000 110.000000 110.000000 116.000000 
+121.000000 120.000000 133.000000 125.000000 118.000000 119.000000 
+125.000000 133.000000 136.000000 135.000000 132.000000 126.000000 
+120.000000 117.000000 121.000000 130.000000 136.000000 132.000000 
+125.000000 126.000000 133.000000 136.000000 134.000000 129.000000 
+128.000000 126.000000 122.000000 117.000000 119.000000 127.000000 
+137.000000 140.000000 132.000000 124.000000 133.000000 165.000000 
+205.000000 220.000000 200.000000 171.000000 149.000000 132.000000 
+123.000000 125.000000 133.000000 143.000000 145.000000 138.000000 
+130.000000 126.000000 125.000000 121.000000 114.000000 111.000000 
+113.000000 116.000000 115.000000 112.000000 111.000000 112.000000 
+113.000000 115.000000 118.000000 121.000000 124.000000 129.000000 
+134.000000 136.000000 137.000000 137.000000 132.000000 121.000000 
+112.000000 113.000000 122.000000 127.000000 123.000000 114.000000 
+123.000000 121.000000 121.000000 126.000000 133.000000 137.000000 
+138.000000 135.000000 130.000000 123.000000 119.000000 119.000000 
+123.000000 130.000000 135.000000 135.000000 134.000000 133.000000 
+132.000000 129.000000 126.000000 127.000000 131.000000 134.000000 
+133.000000 129.000000 129.000000 131.000000 132.000000 129.000000 
+125.000000 125.000000 135.000000 161.000000 196.000000 218.000000 
+215.000000 184.000000 141.000000 112.000000 109.000000 124.000000 
+137.000000 140.000000 136.000000 137.000000 138.000000 136.000000 
+127.000000 117.000000 109.000000 107.000000 110.000000 115.000000 
+119.000000 115.000000 106.000000 99.000000 101.000000 111.000000 
+121.000000 124.000000 123.000000 124.000000 127.000000 132.000000 
+135.000000 137.000000 135.000000 125.000000 114.000000 114.000000 
+124.000000 133.000000 129.000000 120.000000 133.000000 135.000000 
+138.000000 139.000000 138.000000 135.000000 132.000000 127.000000 
+120.000000 114.000000 113.000000 115.000000 122.000000 127.000000 
+128.000000 125.000000 126.000000 132.000000 137.000000 135.000000 
+132.000000 133.000000 138.000000 139.000000 137.000000 136.000000 
+135.000000 131.000000 123.000000 119.000000 123.000000 129.000000 
+134.000000 146.000000 163.000000 177.000000 172.000000 146.000000 
+116.000000 107.000000 117.000000 131.000000 136.000000 135.000000 
+135.000000 140.000000 145.000000 140.000000 127.000000 114.000000 
+111.000000 115.000000 119.000000 122.000000 122.000000 117.000000 
+108.000000 101.000000 103.000000 112.000000 121.000000 126.000000 
+128.000000 130.000000 133.000000 136.000000 140.000000 140.000000 
+135.000000 127.000000 120.000000 121.000000 126.000000 133.000000 
+138.000000 135.000000 138.000000 139.000000 139.000000 137.000000 
+133.000000 130.000000 127.000000 123.000000 121.000000 118.000000 
+113.000000 110.000000 113.000000 120.000000 124.000000 124.000000 
+127.000000 134.000000 140.000000 141.000000 136.000000 132.000000 
+131.000000 133.000000 136.000000 137.000000 134.000000 130.000000 
+126.000000 124.000000 125.000000 127.000000 126.000000 119.000000 
+109.000000 110.000000 125.000000 139.000000 141.000000 132.000000 
+124.000000 123.000000 126.000000 131.000000 138.000000 144.000000 
+143.000000 135.000000 125.000000 119.000000 119.000000 119.000000 
+118.000000 118.000000 119.000000 119.000000 116.000000 111.000000 
+108.000000 109.000000 115.000000 124.000000 131.000000 131.000000 
+128.000000 128.000000 133.000000 136.000000 132.000000 124.000000 
+119.000000 116.000000 118.000000 125.000000 135.000000 135.000000 
+136.000000 136.000000 137.000000 137.000000 134.000000 128.000000 
+126.000000 128.000000 127.000000 121.000000 114.000000 114.000000 
+120.000000 126.000000 128.000000 131.000000 135.000000 138.000000 
+139.000000 137.000000 132.000000 126.000000 121.000000 122.000000 
+128.000000 136.000000 142.000000 144.000000 136.000000 123.000000 
+116.000000 120.000000 119.000000 102.000000 82.000000 84.000000 
+115.000000 147.000000 152.000000 132.000000 113.000000 111.000000 
+122.000000 134.000000 142.000000 143.000000 139.000000 131.000000 
+127.000000 126.000000 123.000000 117.000000 114.000000 116.000000 
+121.000000 121.000000 115.000000 107.000000 102.000000 104.000000 
+113.000000 125.000000 133.000000 134.000000 131.000000 127.000000 
+125.000000 126.000000 129.000000 133.000000 129.000000 120.000000 
+114.000000 118.000000 124.000000 121.000000 132.000000 133.000000 
+138.000000 142.000000 139.000000 133.000000 129.000000 128.000000 
+125.000000 120.000000 116.000000 116.000000 119.000000 122.000000 
+126.000000 130.000000 132.000000 131.000000 131.000000 131.000000 
+129.000000 122.000000 114.000000 118.000000 133.000000 150.000000 
+155.000000 144.000000 127.000000 118.000000 122.000000 129.000000 
+127.000000 110.000000 89.000000 81.000000 98.000000 125.000000 
+142.000000 136.000000 120.000000 111.000000 117.000000 130.000000 
+140.000000 140.000000 135.000000 129.000000 125.000000 127.000000 
+128.000000 126.000000 121.000000 118.000000 121.000000 123.000000 
+119.000000 113.000000 110.000000 113.000000 119.000000 125.000000 
+132.000000 136.000000 134.000000 128.000000 124.000000 127.000000 
+134.000000 138.000000 135.000000 130.000000 130.000000 131.000000 
+128.000000 124.000000 135.000000 137.000000 141.000000 145.000000 
+144.000000 138.000000 130.000000 123.000000 119.000000 118.000000 
+116.000000 116.000000 116.000000 117.000000 119.000000 122.000000 
+124.000000 127.000000 133.000000 135.000000 131.000000 122.000000 
+117.000000 125.000000 137.000000 143.000000 141.000000 137.000000 
+137.000000 140.000000 138.000000 136.000000 133.000000 121.000000 
+97.000000 78.000000 85.000000 117.000000 147.000000 152.000000 
+136.000000 120.000000 116.000000 120.000000 126.000000 130.000000 
+134.000000 133.000000 130.000000 127.000000 129.000000 131.000000 
+127.000000 123.000000 123.000000 126.000000 127.000000 121.000000 
+116.000000 117.000000 123.000000 129.000000 132.000000 131.000000 
+129.000000 126.000000 127.000000 133.000000 136.000000 132.000000 
+128.000000 130.000000 139.000000 141.000000 131.000000 119.000000 
+142.000000 144.000000 144.000000 141.000000 138.000000 138.000000 
+138.000000 130.000000 115.000000 104.000000 105.000000 117.000000 
+125.000000 123.000000 117.000000 116.000000 122.000000 132.000000 
+138.000000 137.000000 129.000000 122.000000 121.000000 122.000000 
+118.000000 115.000000 123.000000 140.000000 151.000000 144.000000 
+131.000000 127.000000 129.000000 119.000000 91.000000 67.000000 
+69.000000 97.000000 132.000000 152.000000 151.000000 140.000000 
+128.000000 120.000000 119.000000 123.000000 127.000000 129.000000 
+128.000000 126.000000 123.000000 124.000000 126.000000 127.000000 
+127.000000 126.000000 127.000000 127.000000 124.000000 119.000000 
+119.000000 125.000000 131.000000 131.000000 129.000000 130.000000 
+133.000000 133.000000 131.000000 130.000000 133.000000 135.000000 
+135.000000 135.000000 133.000000 128.000000 142.000000 147.000000 
+147.000000 140.000000 133.000000 133.000000 138.000000 137.000000 
+127.000000 114.000000 107.000000 108.000000 115.000000 125.000000 
+133.000000 135.000000 133.000000 130.000000 129.000000 129.000000 
+126.000000 125.000000 125.000000 126.000000 125.000000 126.000000 
+131.000000 136.000000 132.000000 119.000000 107.000000 101.000000 
+100.000000 96.000000 84.000000 72.000000 70.000000 81.000000 
+108.000000 137.000000 150.000000 147.000000 136.000000 128.000000 
+128.000000 132.000000 130.000000 122.000000 115.000000 114.000000 
+117.000000 122.000000 125.000000 127.000000 127.000000 126.000000 
+125.000000 127.000000 128.000000 124.000000 119.000000 120.000000 
+126.000000 130.000000 130.000000 129.000000 129.000000 129.000000 
+129.000000 133.000000 141.000000 144.000000 138.000000 131.000000 
+131.000000 127.000000 146.000000 153.000000 150.000000 142.000000 
+134.000000 129.000000 126.000000 125.000000 127.000000 128.000000 
+121.000000 108.000000 102.000000 109.000000 124.000000 131.000000 
+127.000000 121.000000 124.000000 131.000000 132.000000 128.000000 
+127.000000 134.000000 141.000000 140.000000 135.000000 132.000000 
+127.000000 113.000000 87.000000 67.000000 69.000000 87.000000 
+100.000000 97.000000 87.000000 84.000000 98.000000 121.000000 
+134.000000 134.000000 131.000000 131.000000 133.000000 134.000000 
+131.000000 125.000000 117.000000 116.000000 120.000000 125.000000 
+124.000000 120.000000 121.000000 128.000000 135.000000 136.000000 
+132.000000 124.000000 120.000000 121.000000 125.000000 128.000000 
+128.000000 128.000000 130.000000 130.000000 129.000000 131.000000 
+139.000000 146.000000 143.000000 134.000000 125.000000 121.000000 
+149.000000 153.000000 148.000000 138.000000 132.000000 131.000000 
+132.000000 130.000000 127.000000 127.000000 127.000000 122.000000 
+112.000000 104.000000 104.000000 111.000000 116.000000 121.000000 
+127.000000 131.000000 130.000000 123.000000 119.000000 123.000000 
+129.000000 130.000000 128.000000 127.000000 126.000000 116.000000 
+94.000000 73.000000 72.000000 91.000000 115.000000 124.000000 
+115.000000 98.000000 85.000000 87.000000 99.000000 108.000000 
+116.000000 122.000000 123.000000 120.000000 118.000000 119.000000 
+122.000000 122.000000 120.000000 116.000000 115.000000 118.000000 
+125.000000 134.000000 137.000000 132.000000 124.000000 121.000000 
+123.000000 126.000000 127.000000 127.000000 127.000000 127.000000 
+127.000000 127.000000 127.000000 129.000000 135.000000 142.000000 
+146.000000 142.000000 133.000000 128.000000 150.000000 147.000000 
+141.000000 134.000000 128.000000 129.000000 135.000000 139.000000 
+136.000000 133.000000 135.000000 137.000000 131.000000 120.000000 
+112.000000 114.000000 119.000000 123.000000 125.000000 125.000000 
+126.000000 126.000000 123.000000 121.000000 124.000000 132.000000 
+136.000000 134.000000 127.000000 122.000000 118.000000 111.000000 
+99.000000 93.000000 102.000000 119.000000 130.000000 123.000000 
+101.000000 82.000000 80.000000 94.000000 114.000000 129.000000 
+134.000000 130.000000 125.000000 121.000000 117.000000 112.000000 
+107.000000 106.000000 112.000000 121.000000 127.000000 127.000000 
+122.000000 114.000000 113.000000 118.000000 124.000000 125.000000 
+124.000000 125.000000 123.000000 119.000000 118.000000 127.000000 
+140.000000 145.000000 141.000000 138.000000 139.000000 140.000000 
+135.000000 127.000000 145.000000 142.000000 136.000000 132.000000 
+131.000000 130.000000 128.000000 125.000000 127.000000 136.000000 
+146.000000 145.000000 134.000000 121.000000 112.000000 111.000000 
+113.000000 117.000000 122.000000 126.000000 129.000000 128.000000 
+124.000000 122.000000 126.000000 133.000000 137.000000 134.000000 
+129.000000 133.000000 143.000000 144.000000 124.000000 92.000000 
+73.000000 81.000000 106.000000 127.000000 127.000000 115.000000 
+109.000000 115.000000 129.000000 139.000000 140.000000 135.000000 
+129.000000 125.000000 121.000000 115.000000 109.000000 110.000000 
+118.000000 125.000000 123.000000 118.000000 119.000000 125.000000 
+129.000000 128.000000 126.000000 126.000000 127.000000 126.000000 
+122.000000 120.000000 126.000000 137.000000 143.000000 141.000000 
+135.000000 132.000000 129.000000 123.000000 120.000000 123.000000 
+140.000000 142.000000 140.000000 136.000000 130.000000 123.000000 
+120.000000 124.000000 133.000000 140.000000 139.000000 134.000000 
+128.000000 124.000000 120.000000 115.000000 114.000000 116.000000 
+121.000000 124.000000 126.000000 127.000000 125.000000 121.000000 
+118.000000 119.000000 123.000000 128.000000 133.000000 138.000000 
+143.000000 143.000000 126.000000 92.000000 60.000000 54.000000 
+75.000000 107.000000 125.000000 127.000000 126.000000 130.000000 
+132.000000 128.000000 122.000000 122.000000 125.000000 125.000000 
+119.000000 113.000000 112.000000 114.000000 119.000000 119.000000 
+115.000000 115.000000 123.000000 134.000000 135.000000 126.000000 
+120.000000 124.000000 133.000000 135.000000 134.000000 133.000000 
+134.000000 136.000000 137.000000 137.000000 136.000000 133.000000 
+127.000000 120.000000 118.000000 123.000000 138.000000 141.000000 
+138.000000 134.000000 132.000000 130.000000 125.000000 122.000000 
+124.000000 128.000000 129.000000 128.000000 127.000000 127.000000 
+125.000000 121.000000 118.000000 119.000000 124.000000 129.000000 
+131.000000 130.000000 130.000000 130.000000 130.000000 126.000000 
+124.000000 126.000000 131.000000 136.000000 141.000000 142.000000 
+128.000000 99.000000 73.000000 68.000000 91.000000 125.000000 
+141.000000 137.000000 130.000000 130.000000 129.000000 123.000000 
+117.000000 119.000000 124.000000 122.000000 115.000000 113.000000 
+116.000000 118.000000 115.000000 111.000000 111.000000 118.000000 
+124.000000 127.000000 126.000000 123.000000 120.000000 120.000000 
+122.000000 126.000000 130.000000 131.000000 130.000000 132.000000 
+137.000000 142.000000 137.000000 128.000000 121.000000 122.000000 
+124.000000 123.000000 138.000000 139.000000 137.000000 134.000000 
+130.000000 128.000000 129.000000 128.000000 126.000000 127.000000 
+131.000000 131.000000 124.000000 115.000000 113.000000 118.000000 
+120.000000 117.000000 119.000000 127.000000 134.000000 134.000000 
+130.000000 131.000000 136.000000 136.000000 130.000000 123.000000 
+122.000000 130.000000 142.000000 145.000000 128.000000 96.000000 
+74.000000 75.000000 101.000000 128.000000 134.000000 127.000000 
+124.000000 127.000000 129.000000 126.000000 123.000000 124.000000 
+123.000000 120.000000 120.000000 124.000000 127.000000 124.000000 
+115.000000 112.000000 118.000000 126.000000 128.000000 127.000000 
+129.000000 137.000000 140.000000 132.000000 121.000000 120.000000 
+130.000000 138.000000 135.000000 128.000000 129.000000 135.000000 
+136.000000 130.000000 124.000000 124.000000 126.000000 124.000000 
+131.000000 132.000000 131.000000 128.000000 125.000000 127.000000 
+130.000000 132.000000 133.000000 137.000000 141.000000 136.000000 
+122.000000 111.000000 112.000000 122.000000 125.000000 120.000000 
+116.000000 118.000000 127.000000 134.000000 134.000000 130.000000 
+126.000000 126.000000 130.000000 132.000000 132.000000 135.000000 
+142.000000 144.000000 127.000000 94.000000 70.000000 75.000000 
+104.000000 130.000000 134.000000 124.000000 121.000000 127.000000 
+130.000000 127.000000 122.000000 120.000000 119.000000 120.000000 
+122.000000 127.000000 129.000000 128.000000 126.000000 125.000000 
+123.000000 121.000000 123.000000 131.000000 138.000000 138.000000 
+134.000000 134.000000 138.000000 140.000000 136.000000 131.000000 
+131.000000 133.000000 135.000000 137.000000 138.000000 135.000000 
+130.000000 126.000000 126.000000 128.000000 130.000000 132.000000 
+133.000000 132.000000 133.000000 134.000000 132.000000 128.000000 
+128.000000 132.000000 134.000000 130.000000 124.000000 119.000000 
+120.000000 123.000000 127.000000 129.000000 128.000000 127.000000 
+128.000000 132.000000 135.000000 133.000000 126.000000 123.000000 
+126.000000 132.000000 137.000000 142.000000 146.000000 141.000000 
+118.000000 87.000000 68.000000 79.000000 110.000000 132.000000 
+132.000000 124.000000 122.000000 127.000000 130.000000 129.000000 
+125.000000 124.000000 124.000000 127.000000 131.000000 133.000000 
+131.000000 125.000000 122.000000 122.000000 123.000000 125.000000 
+128.000000 135.000000 137.000000 133.000000 128.000000 133.000000 
+145.000000 149.000000 138.000000 125.000000 125.000000 136.000000 
+145.000000 143.000000 135.000000 129.000000 126.000000 125.000000 
+125.000000 128.000000 142.000000 138.000000 134.000000 132.000000 
+132.000000 131.000000 130.000000 131.000000 133.000000 135.000000 
+136.000000 134.000000 127.000000 119.000000 116.000000 120.000000 
+128.000000 132.000000 131.000000 130.000000 131.000000 130.000000 
+128.000000 127.000000 126.000000 124.000000 124.000000 128.000000 
+135.000000 142.000000 147.000000 141.000000 119.000000 90.000000 
+76.000000 88.000000 113.000000 128.000000 128.000000 125.000000 
+127.000000 131.000000 130.000000 126.000000 126.000000 128.000000 
+128.000000 128.000000 127.000000 124.000000 122.000000 125.000000 
+132.000000 134.000000 129.000000 125.000000 126.000000 130.000000 
+131.000000 130.000000 129.000000 131.000000 134.000000 137.000000 
+140.000000 139.000000 134.000000 133.000000 137.000000 137.000000 
+130.000000 125.000000 127.000000 130.000000 128.000000 127.000000 
+136.000000 133.000000 131.000000 129.000000 128.000000 128.000000 
+129.000000 132.000000 136.000000 139.000000 139.000000 133.000000 
+123.000000 119.000000 124.000000 128.000000 129.000000 126.000000 
+123.000000 124.000000 127.000000 129.000000 129.000000 126.000000 
+123.000000 123.000000 126.000000 130.000000 134.000000 139.000000 
+144.000000 140.000000 120.000000 93.000000 81.000000 94.000000 
+117.000000 129.000000 126.000000 122.000000 123.000000 124.000000 
+121.000000 116.000000 115.000000 118.000000 120.000000 122.000000 
+124.000000 126.000000 127.000000 129.000000 132.000000 134.000000 
+132.000000 129.000000 128.000000 130.000000 131.000000 131.000000 
+131.000000 132.000000 134.000000 134.000000 135.000000 134.000000 
+130.000000 130.000000 133.000000 137.000000 138.000000 137.000000 
+137.000000 136.000000 131.000000 128.000000 136.000000 134.000000 
+129.000000 125.000000 126.000000 129.000000 130.000000 131.000000 
+136.000000 140.000000 135.000000 121.000000 113.000000 119.000000 
+130.000000 131.000000 123.000000 119.000000 122.000000 128.000000 
+129.000000 131.000000 133.000000 135.000000 132.000000 130.000000 
+130.000000 131.000000 131.000000 133.000000 137.000000 134.000000 
+114.000000 90.000000 83.000000 97.000000 119.000000 130.000000 
+129.000000 126.000000 123.000000 121.000000 118.000000 117.000000 
+118.000000 117.000000 117.000000 120.000000 126.000000 131.000000 
+132.000000 132.000000 131.000000 129.000000 126.000000 125.000000 
+127.000000 130.000000 130.000000 127.000000 123.000000 124.000000 
+129.000000 134.000000 136.000000 134.000000 130.000000 127.000000 
+128.000000 132.000000 135.000000 138.000000 139.000000 136.000000 
+131.000000 127.000000 136.000000 134.000000 132.000000 132.000000 
+131.000000 127.000000 125.000000 130.000000 136.000000 133.000000 
+121.000000 112.000000 115.000000 126.000000 132.000000 130.000000 
+127.000000 127.000000 129.000000 127.000000 124.000000 127.000000 
+134.000000 142.000000 144.000000 142.000000 136.000000 129.000000 
+127.000000 132.000000 139.000000 134.000000 115.000000 95.000000 
+89.000000 103.000000 125.000000 137.000000 136.000000 129.000000 
+124.000000 123.000000 123.000000 122.000000 119.000000 117.000000 
+119.000000 123.000000 128.000000 130.000000 128.000000 125.000000 
+123.000000 122.000000 123.000000 125.000000 129.000000 131.000000 
+131.000000 129.000000 127.000000 127.000000 128.000000 130.000000 
+132.000000 133.000000 131.000000 127.000000 126.000000 129.000000 
+134.000000 137.000000 136.000000 133.000000 128.000000 124.000000 
+130.000000 134.000000 135.000000 132.000000 126.000000 125.000000 
+128.000000 133.000000 132.000000 125.000000 119.000000 121.000000 
+127.000000 130.000000 129.000000 128.000000 129.000000 128.000000 
+125.000000 125.000000 131.000000 141.000000 146.000000 142.000000 
+135.000000 130.000000 129.000000 131.000000 135.000000 138.000000 
+135.000000 124.000000 109.000000 101.000000 102.000000 112.000000 
+125.000000 132.000000 132.000000 129.000000 128.000000 127.000000 
+125.000000 121.000000 121.000000 123.000000 123.000000 121.000000 
+122.000000 127.000000 128.000000 122.000000 114.000000 112.000000 
+117.000000 122.000000 125.000000 127.000000 129.000000 128.000000 
+128.000000 131.000000 134.000000 133.000000 126.000000 121.000000 
+122.000000 126.000000 130.000000 133.000000 137.000000 142.000000 
+141.000000 135.000000 128.000000 122.000000 134.000000 137.000000 
+136.000000 130.000000 124.000000 124.000000 130.000000 135.000000 
+131.000000 122.000000 117.000000 119.000000 126.000000 131.000000 
+133.000000 131.000000 127.000000 124.000000 123.000000 127.000000 
+135.000000 142.000000 143.000000 137.000000 133.000000 132.000000 
+131.000000 132.000000 133.000000 137.000000 138.000000 130.000000 
+114.000000 106.000000 109.000000 120.000000 131.000000 136.000000 
+138.000000 138.000000 135.000000 130.000000 126.000000 125.000000 
+127.000000 126.000000 124.000000 127.000000 134.000000 139.000000 
+136.000000 128.000000 122.000000 122.000000 124.000000 123.000000 
+119.000000 117.000000 119.000000 123.000000 124.000000 125.000000 
+125.000000 125.000000 124.000000 123.000000 123.000000 125.000000 
+126.000000 127.000000 130.000000 134.000000 134.000000 128.000000 
+122.000000 119.000000 135.000000 139.000000 137.000000 131.000000 
+126.000000 126.000000 127.000000 122.000000 117.000000 118.000000 
+124.000000 128.000000 130.000000 132.000000 134.000000 136.000000 
+138.000000 139.000000 139.000000 139.000000 137.000000 135.000000 
+133.000000 134.000000 137.000000 141.000000 142.000000 139.000000 
+131.000000 125.000000 126.000000 130.000000 129.000000 125.000000 
+125.000000 130.000000 135.000000 136.000000 135.000000 135.000000 
+133.000000 127.000000 122.000000 120.000000 121.000000 123.000000 
+125.000000 129.000000 132.000000 132.000000 126.000000 119.000000 
+116.000000 116.000000 117.000000 116.000000 117.000000 121.000000 
+126.000000 128.000000 128.000000 128.000000 129.000000 131.000000 
+133.000000 132.000000 128.000000 122.000000 121.000000 125.000000 
+130.000000 130.000000 124.000000 120.000000 120.000000 122.000000 
+136.000000 137.000000 138.000000 137.000000 133.000000 127.000000 
+120.000000 118.000000 125.000000 133.000000 133.000000 127.000000 
+125.000000 132.000000 140.000000 139.000000 133.000000 129.000000 
+131.000000 133.000000 132.000000 131.000000 131.000000 129.000000 
+126.000000 125.000000 128.000000 132.000000 130.000000 123.000000 
+120.000000 124.000000 130.000000 130.000000 127.000000 127.000000 
+132.000000 137.000000 134.000000 126.000000 122.000000 129.000000 
+140.000000 142.000000 136.000000 127.000000 124.000000 128.000000 
+132.000000 133.000000 130.000000 126.000000 124.000000 125.000000 
+124.000000 120.000000 117.000000 119.000000 126.000000 131.000000 
+131.000000 130.000000 131.000000 133.000000 132.000000 128.000000 
+126.000000 125.000000 122.000000 123.000000 130.000000 137.000000 
+138.000000 131.000000 125.000000 122.000000 142.000000 143.000000 
+142.000000 140.000000 133.000000 122.000000 116.000000 121.000000 
+131.000000 132.000000 125.000000 122.000000 127.000000 135.000000 
+139.000000 137.000000 135.000000 137.000000 138.000000 134.000000 
+131.000000 129.000000 128.000000 127.000000 126.000000 128.000000 
+131.000000 133.000000 133.000000 128.000000 124.000000 125.000000 
+130.000000 133.000000 131.000000 130.000000 134.000000 139.000000 
+137.000000 127.000000 120.000000 123.000000 131.000000 137.000000 
+140.000000 143.000000 146.000000 142.000000 131.000000 122.000000 
+119.000000 122.000000 124.000000 124.000000 123.000000 122.000000 
+120.000000 119.000000 123.000000 127.000000 128.000000 127.000000 
+128.000000 132.000000 135.000000 133.000000 128.000000 123.000000 
+124.000000 131.000000 137.000000 137.000000 132.000000 126.000000 
+125.000000 127.000000 136.000000 134.000000 136.000000 137.000000 
+132.000000 123.000000 119.000000 123.000000 129.000000 132.000000 
+130.000000 128.000000 132.000000 137.000000 138.000000 135.000000 
+132.000000 131.000000 132.000000 134.000000 134.000000 133.000000 
+130.000000 126.000000 125.000000 127.000000 129.000000 131.000000 
+133.000000 133.000000 130.000000 125.000000 123.000000 123.000000 
+125.000000 130.000000 135.000000 137.000000 132.000000 124.000000 
+123.000000 130.000000 136.000000 136.000000 131.000000 130.000000 
+133.000000 134.000000 127.000000 120.000000 119.000000 124.000000 
+130.000000 133.000000 133.000000 129.000000 124.000000 123.000000 
+127.000000 133.000000 135.000000 133.000000 130.000000 130.000000 
+132.000000 135.000000 137.000000 136.000000 132.000000 130.000000 
+131.000000 133.000000 133.000000 131.000000 127.000000 124.000000 
+136.000000 131.000000 128.000000 126.000000 124.000000 127.000000 
+132.000000 136.000000 138.000000 138.000000 136.000000 134.000000 
+134.000000 134.000000 135.000000 136.000000 138.000000 140.000000 
+138.000000 134.000000 128.000000 125.000000 124.000000 124.000000 
+125.000000 127.000000 130.000000 133.000000 136.000000 137.000000 
+135.000000 130.000000 125.000000 124.000000 129.000000 136.000000 
+138.000000 135.000000 131.000000 130.000000 131.000000 130.000000 
+128.000000 128.000000 129.000000 133.000000 135.000000 134.000000 
+128.000000 122.000000 119.000000 119.000000 122.000000 127.000000 
+130.000000 129.000000 125.000000 123.000000 125.000000 129.000000 
+129.000000 128.000000 130.000000 134.000000 134.000000 131.000000 
+129.000000 130.000000 135.000000 140.000000 143.000000 142.000000 
+136.000000 127.000000 120.000000 120.000000 128.000000 129.000000 
+132.000000 133.000000 131.000000 127.000000 126.000000 127.000000 
+129.000000 131.000000 133.000000 134.000000 133.000000 131.000000 
+132.000000 136.000000 139.000000 137.000000 132.000000 129.000000 
+127.000000 126.000000 123.000000 121.000000 122.000000 124.000000 
+127.000000 130.000000 133.000000 134.000000 133.000000 130.000000 
+127.000000 126.000000 127.000000 131.000000 137.000000 137.000000 
+132.000000 129.000000 133.000000 135.000000 131.000000 123.000000 
+118.000000 121.000000 127.000000 131.000000 130.000000 129.000000 
+129.000000 130.000000 132.000000 133.000000 131.000000 126.000000 
+123.000000 124.000000 127.000000 129.000000 128.000000 129.000000 
+131.000000 133.000000 134.000000 133.000000 131.000000 132.000000 
+136.000000 142.000000 146.000000 143.000000 137.000000 131.000000 
+128.000000 130.000000 127.000000 128.000000 131.000000 131.000000 
+126.000000 122.000000 123.000000 129.000000 132.000000 129.000000 
+123.000000 121.000000 128.000000 136.000000 140.000000 138.000000 
+137.000000 139.000000 140.000000 134.000000 126.000000 122.000000 
+125.000000 130.000000 131.000000 131.000000 134.000000 137.000000 
+136.000000 132.000000 129.000000 130.000000 131.000000 129.000000 
+128.000000 130.000000 136.000000 140.000000 137.000000 134.000000 
+133.000000 133.000000 130.000000 123.000000 118.000000 120.000000 
+129.000000 139.000000 141.000000 136.000000 130.000000 126.000000 
+127.000000 130.000000 132.000000 132.000000 132.000000 131.000000 
+128.000000 125.000000 128.000000 133.000000 137.000000 135.000000 
+131.000000 127.000000 127.000000 133.000000 140.000000 143.000000 
+140.000000 134.000000 132.000000 132.000000 128.000000 125.000000 
+122.000000 126.000000 134.000000 138.000000 134.000000 130.000000 
+130.000000 133.000000 134.000000 134.000000 133.000000 135.000000 
+138.000000 141.000000 142.000000 141.000000 138.000000 135.000000 
+133.000000 130.000000 126.000000 122.000000 123.000000 128.000000 
+136.000000 140.000000 142.000000 142.000000 141.000000 138.000000 
+133.000000 129.000000 125.000000 122.000000 121.000000 123.000000 
+129.000000 132.000000 132.000000 135.000000 140.000000 141.000000 
+135.000000 125.000000 116.000000 115.000000 121.000000 130.000000 
+137.000000 137.000000 132.000000 124.000000 120.000000 125.000000 
+135.000000 143.000000 143.000000 135.000000 126.000000 120.000000 
+123.000000 131.000000 135.000000 131.000000 127.000000 129.000000 
+137.000000 142.000000 138.000000 131.000000 130.000000 133.000000 
+135.000000 133.000000 127.000000 126.000000 125.000000 131.000000 
+133.000000 127.000000 122.000000 126.000000 135.000000 137.000000 
+131.000000 125.000000 128.000000 135.000000 139.000000 136.000000 
+133.000000 135.000000 140.000000 143.000000 139.000000 131.000000 
+122.000000 117.000000 119.000000 125.000000 131.000000 134.000000 
+135.000000 134.000000 132.000000 130.000000 131.000000 132.000000 
+133.000000 132.000000 133.000000 134.000000 135.000000 134.000000 
+133.000000 133.000000 134.000000 134.000000 132.000000 131.000000 
+131.000000 131.000000 134.000000 138.000000 141.000000 139.000000 
+133.000000 124.000000 119.000000 120.000000 125.000000 129.000000 
+128.000000 125.000000 122.000000 122.000000 124.000000 126.000000 
+126.000000 125.000000 126.000000 129.000000 131.000000 131.000000 
+130.000000 128.000000 128.000000 130.000000 133.000000 136.000000 
+137.000000 136.000000 132.000000 128.000000 128.000000 131.000000 
+132.000000 132.000000 132.000000 133.000000 132.000000 131.000000 
+132.000000 135.000000 137.000000 135.000000 132.000000 134.000000 
+137.000000 139.000000 138.000000 138.000000 138.000000 137.000000 
+133.000000 131.000000 135.000000 139.000000 138.000000 132.000000 
+127.000000 127.000000 130.000000 130.000000 128.000000 126.000000 
+129.000000 133.000000 136.000000 139.000000 142.000000 142.000000 
+137.000000 133.000000 132.000000 133.000000 130.000000 126.000000 
+127.000000 134.000000 139.000000 138.000000 132.000000 128.000000 
+128.000000 130.000000 133.000000 133.000000 130.000000 124.000000 
+119.000000 117.000000 119.000000 121.000000 123.000000 126.000000 
+130.000000 133.000000 134.000000 134.000000 133.000000 133.000000 
+133.000000 134.000000 135.000000 133.000000 132.000000 133.000000 
+126.000000 128.000000 131.000000 133.000000 135.000000 134.000000 
+134.000000 134.000000 135.000000 133.000000 130.000000 128.000000 
+130.000000 136.000000 141.000000 141.000000 137.000000 134.000000 
+133.000000 134.000000 134.000000 135.000000 136.000000 137.000000 
+136.000000 132.000000 128.000000 126.000000 126.000000 127.000000 
+129.000000 130.000000 131.000000 134.000000 137.000000 138.000000 
+134.000000 130.000000 130.000000 134.000000 137.000000 139.000000 
+142.000000 145.000000 145.000000 141.000000 133.000000 127.000000 
+128.000000 133.000000 139.000000 139.000000 135.000000 132.000000 
+133.000000 134.000000 130.000000 126.000000 122.000000 121.000000 
+120.000000 120.000000 123.000000 129.000000 133.000000 133.000000 
+131.000000 131.000000 129.000000 125.000000 123.000000 125.000000 
+130.000000 132.000000 128.000000 125.000000 132.000000 134.000000 
+133.000000 129.000000 129.000000 132.000000 134.000000 133.000000 
+129.000000 127.000000 128.000000 131.000000 134.000000 138.000000 
+139.000000 139.000000 138.000000 137.000000 140.000000 143.000000 
+144.000000 142.000000 138.000000 135.000000 134.000000 133.000000 
+133.000000 131.000000 128.000000 125.000000 122.000000 121.000000 
+122.000000 127.000000 133.000000 137.000000 136.000000 132.000000 
+129.000000 126.000000 126.000000 128.000000 133.000000 138.000000 
+140.000000 139.000000 136.000000 133.000000 130.000000 127.000000 
+127.000000 132.000000 138.000000 139.000000 134.000000 129.000000 
+128.000000 130.000000 132.000000 128.000000 123.000000 121.000000 
+123.000000 127.000000 131.000000 135.000000 135.000000 132.000000 
+126.000000 123.000000 125.000000 127.000000 128.000000 128.000000 
+131.000000 136.000000 130.000000 133.000000 132.000000 129.000000 
+130.000000 134.000000 135.000000 132.000000 128.000000 127.000000 
+129.000000 129.000000 129.000000 131.000000 136.000000 140.000000 
+137.000000 132.000000 132.000000 137.000000 143.000000 142.000000 
+138.000000 137.000000 139.000000 139.000000 136.000000 132.000000 
+132.000000 133.000000 131.000000 128.000000 128.000000 132.000000 
+133.000000 132.000000 131.000000 132.000000 133.000000 132.000000 
+132.000000 132.000000 132.000000 131.000000 132.000000 137.000000 
+140.000000 138.000000 134.000000 132.000000 134.000000 136.000000 
+137.000000 136.000000 134.000000 133.000000 133.000000 131.000000 
+127.000000 122.000000 119.000000 121.000000 127.000000 130.000000 
+130.000000 130.000000 130.000000 130.000000 128.000000 126.000000 
+126.000000 126.000000 125.000000 127.000000 132.000000 137.000000 
+129.000000 129.000000 129.000000 129.000000 131.000000 133.000000 
+135.000000 133.000000 132.000000 131.000000 132.000000 133.000000 
+135.000000 135.000000 133.000000 131.000000 131.000000 131.000000 
+134.000000 138.000000 141.000000 142.000000 139.000000 136.000000 
+132.000000 128.000000 127.000000 128.000000 130.000000 130.000000 
+127.000000 126.000000 130.000000 134.000000 135.000000 135.000000 
+134.000000 133.000000 129.000000 126.000000 129.000000 135.000000 
+137.000000 133.000000 130.000000 131.000000 134.000000 134.000000 
+132.000000 131.000000 132.000000 129.000000 127.000000 128.000000 
+134.000000 138.000000 137.000000 135.000000 135.000000 135.000000 
+134.000000 134.000000 138.000000 141.000000 138.000000 131.000000 
+126.000000 126.000000 127.000000 127.000000 126.000000 126.000000 
+128.000000 131.000000 132.000000 132.000000 129.000000 131.000000 
+132.000000 130.000000 127.000000 127.000000 128.000000 128.000000 
+129.000000 131.000000 135.000000 136.000000 134.000000 133.000000 
+134.000000 136.000000 134.000000 132.000000 134.000000 139.000000 
+142.000000 141.000000 137.000000 134.000000 133.000000 132.000000 
+130.000000 127.000000 124.000000 124.000000 127.000000 134.000000 
+139.000000 138.000000 135.000000 133.000000 133.000000 133.000000 
+131.000000 128.000000 128.000000 129.000000 129.000000 129.000000 
+131.000000 134.000000 137.000000 135.000000 130.000000 124.000000 
+123.000000 125.000000 130.000000 133.000000 134.000000 135.000000 
+134.000000 130.000000 124.000000 120.000000 121.000000 128.000000 
+134.000000 137.000000 134.000000 131.000000 131.000000 132.000000 
+134.000000 132.000000 130.000000 127.000000 125.000000 123.000000 
+122.000000 123.000000 115.000000 117.000000 117.000000 117.000000 
+119.000000 124.000000 131.000000 135.000000 131.000000 121.000000 
+117.000000 122.000000 129.000000 131.000000 130.000000 129.000000 
+129.000000 129.000000 130.000000 131.000000 133.000000 134.000000 
+134.000000 133.000000 132.000000 132.000000 134.000000 135.000000 
+135.000000 132.000000 130.000000 129.000000 125.000000 121.000000 
+120.000000 122.000000 127.000000 127.000000 124.000000 121.000000 
+121.000000 122.000000 124.000000 128.000000 135.000000 142.000000 
+147.000000 148.000000 146.000000 140.000000 132.000000 129.000000 
+131.000000 130.000000 124.000000 123.000000 132.000000 140.000000 
+139.000000 130.000000 124.000000 121.000000 119.000000 116.000000 
+116.000000 120.000000 123.000000 125.000000 125.000000 129.000000 
+133.000000 136.000000 136.000000 132.000000 125.000000 115.000000 
+109.000000 103.000000 100.000000 101.000000 107.000000 115.000000 
+120.000000 118.000000 112.000000 110.000000 115.000000 120.000000 
+123.000000 127.000000 133.000000 136.000000 134.000000 130.000000 
+129.000000 133.000000 138.000000 141.000000 139.000000 133.000000 
+128.000000 127.000000 127.000000 128.000000 131.000000 135.000000 
+137.000000 134.000000 129.000000 127.000000 129.000000 133.000000 
+133.000000 129.000000 123.000000 123.000000 128.000000 133.000000 
+132.000000 129.000000 130.000000 136.000000 141.000000 143.000000 
+143.000000 140.000000 133.000000 127.000000 124.000000 127.000000 
+131.000000 131.000000 130.000000 132.000000 135.000000 133.000000 
+126.000000 120.000000 116.000000 113.000000 112.000000 117.000000 
+125.000000 130.000000 131.000000 133.000000 138.000000 141.000000 
+139.000000 135.000000 129.000000 116.000000 99.000000 103.000000 
+109.000000 110.000000 110.000000 112.000000 112.000000 109.000000 
+109.000000 113.000000 119.000000 123.000000 126.000000 129.000000 
+132.000000 133.000000 132.000000 129.000000 128.000000 131.000000 
+139.000000 143.000000 141.000000 136.000000 134.000000 134.000000 
+132.000000 130.000000 133.000000 138.000000 139.000000 136.000000 
+133.000000 135.000000 138.000000 137.000000 132.000000 127.000000 
+122.000000 119.000000 121.000000 127.000000 133.000000 135.000000 
+135.000000 135.000000 138.000000 142.000000 144.000000 140.000000 
+135.000000 133.000000 133.000000 133.000000 131.000000 128.000000 
+126.000000 126.000000 128.000000 129.000000 126.000000 120.000000 
+115.000000 113.000000 113.000000 115.000000 120.000000 127.000000 
+133.000000 136.000000 136.000000 134.000000 130.000000 128.000000 
+126.000000 122.000000 106.000000 107.000000 109.000000 110.000000 
+113.000000 116.000000 116.000000 117.000000 118.000000 119.000000 
+121.000000 126.000000 134.000000 142.000000 146.000000 143.000000 
+136.000000 128.000000 123.000000 125.000000 129.000000 132.000000 
+132.000000 133.000000 136.000000 136.000000 134.000000 134.000000 
+140.000000 144.000000 142.000000 137.000000 136.000000 138.000000 
+137.000000 134.000000 133.000000 130.000000 124.000000 116.000000 
+118.000000 130.000000 140.000000 141.000000 138.000000 139.000000 
+142.000000 147.000000 149.000000 149.000000 144.000000 136.000000 
+129.000000 126.000000 126.000000 127.000000 126.000000 123.000000 
+121.000000 122.000000 124.000000 122.000000 116.000000 115.000000 
+117.000000 119.000000 122.000000 128.000000 135.000000 135.000000 
+130.000000 126.000000 127.000000 129.000000 128.000000 126.000000 
+122.000000 122.000000 116.000000 111.000000 114.000000 118.000000 
+117.000000 113.000000 111.000000 112.000000 117.000000 123.000000 
+132.000000 141.000000 144.000000 142.000000 134.000000 126.000000 
+121.000000 120.000000 120.000000 122.000000 127.000000 134.000000 
+140.000000 140.000000 141.000000 144.000000 148.000000 147.000000 
+140.000000 135.000000 133.000000 133.000000 133.000000 133.000000 
+129.000000 121.000000 110.000000 110.000000 119.000000 133.000000 
+140.000000 136.000000 130.000000 136.000000 148.000000 153.000000 
+147.000000 140.000000 137.000000 136.000000 132.000000 129.000000 
+129.000000 130.000000 129.000000 127.000000 128.000000 128.000000 
+126.000000 120.000000 115.000000 113.000000 115.000000 120.000000 
+126.000000 132.000000 134.000000 132.000000 127.000000 123.000000 
+121.000000 121.000000 121.000000 121.000000 137.000000 134.000000 
+127.000000 124.000000 124.000000 119.000000 111.000000 110.000000 
+115.000000 120.000000 122.000000 126.000000 133.000000 137.000000 
+136.000000 134.000000 133.000000 130.000000 123.000000 116.000000 
+115.000000 123.000000 133.000000 140.000000 140.000000 138.000000 
+137.000000 138.000000 140.000000 139.000000 137.000000 133.000000 
+132.000000 139.000000 146.000000 136.000000 116.000000 108.000000 
+139.000000 189.000000 202.000000 167.000000 132.000000 122.000000 
+126.000000 130.000000 134.000000 139.000000 142.000000 138.000000 
+135.000000 138.000000 141.000000 136.000000 126.000000 120.000000 
+123.000000 128.000000 129.000000 124.000000 116.000000 109.000000 
+106.000000 109.000000 117.000000 127.000000 134.000000 136.000000 
+133.000000 127.000000 125.000000 125.000000 124.000000 122.000000 
+120.000000 120.000000 140.000000 137.000000 133.000000 133.000000 
+132.000000 124.000000 117.000000 117.000000 122.000000 124.000000 
+127.000000 131.000000 135.000000 134.000000 131.000000 129.000000 
+128.000000 126.000000 123.000000 120.000000 118.000000 119.000000 
+124.000000 130.000000 134.000000 135.000000 134.000000 133.000000 
+136.000000 141.000000 142.000000 139.000000 138.000000 142.000000 
+144.000000 130.000000 108.000000 97.000000 116.000000 152.000000 
+164.000000 145.000000 126.000000 125.000000 133.000000 135.000000 
+131.000000 129.000000 133.000000 137.000000 135.000000 131.000000 
+127.000000 121.000000 116.000000 116.000000 120.000000 124.000000 
+125.000000 124.000000 121.000000 113.000000 108.000000 112.000000 
+126.000000 134.000000 132.000000 125.000000 121.000000 119.000000 
+117.000000 119.000000 126.000000 130.000000 126.000000 121.000000 
+136.000000 139.000000 139.000000 134.000000 127.000000 124.000000 
+124.000000 124.000000 121.000000 118.000000 123.000000 131.000000 
+132.000000 127.000000 121.000000 119.000000 117.000000 115.000000 
+115.000000 122.000000 130.000000 134.000000 133.000000 131.000000 
+131.000000 132.000000 130.000000 131.000000 137.000000 143.000000 
+142.000000 134.000000 132.000000 136.000000 133.000000 111.000000 
+82.000000 68.000000 74.000000 92.000000 106.000000 116.000000 
+125.000000 130.000000 131.000000 132.000000 135.000000 136.000000 
+134.000000 133.000000 134.000000 131.000000 119.000000 108.000000 
+106.000000 114.000000 124.000000 127.000000 126.000000 127.000000 
+127.000000 123.000000 117.000000 117.000000 124.000000 129.000000 
+125.000000 116.000000 112.000000 112.000000 113.000000 115.000000 
+119.000000 122.000000 120.000000 119.000000 138.000000 144.000000 
+142.000000 132.000000 123.000000 120.000000 124.000000 125.000000 
+120.000000 118.000000 122.000000 127.000000 126.000000 120.000000 
+115.000000 114.000000 115.000000 116.000000 120.000000 127.000000 
+134.000000 137.000000 133.000000 128.000000 125.000000 126.000000 
+128.000000 133.000000 142.000000 149.000000 144.000000 125.000000 
+110.000000 117.000000 138.000000 138.000000 101.000000 61.000000 
+53.000000 85.000000 123.000000 136.000000 131.000000 127.000000 
+128.000000 130.000000 132.000000 135.000000 136.000000 132.000000 
+128.000000 125.000000 122.000000 117.000000 115.000000 117.000000 
+121.000000 126.000000 129.000000 128.000000 126.000000 123.000000 
+120.000000 117.000000 115.000000 115.000000 117.000000 119.000000 
+120.000000 119.000000 118.000000 114.000000 109.000000 107.000000 
+112.000000 120.000000 134.000000 136.000000 134.000000 130.000000 
+127.000000 127.000000 126.000000 123.000000 120.000000 119.000000 
+119.000000 119.000000 120.000000 123.000000 128.000000 126.000000 
+121.000000 120.000000 125.000000 131.000000 132.000000 133.000000 
+135.000000 135.000000 128.000000 120.000000 120.000000 126.000000 
+135.000000 142.000000 141.000000 128.000000 114.000000 123.000000 
+173.000000 223.000000 216.000000 162.000000 116.000000 110.000000 
+127.000000 134.000000 127.000000 124.000000 132.000000 136.000000 
+133.000000 130.000000 130.000000 126.000000 119.000000 117.000000 
+122.000000 126.000000 123.000000 116.000000 116.000000 122.000000 
+128.000000 127.000000 124.000000 122.000000 121.000000 119.000000 
+116.000000 114.000000 117.000000 121.000000 123.000000 119.000000 
+115.000000 111.000000 108.000000 107.000000 112.000000 120.000000 
+135.000000 132.000000 127.000000 124.000000 127.000000 134.000000 
+135.000000 129.000000 121.000000 118.000000 120.000000 120.000000 
+119.000000 123.000000 130.000000 131.000000 128.000000 127.000000 
+130.000000 130.000000 128.000000 132.000000 140.000000 140.000000 
+130.000000 119.000000 119.000000 126.000000 132.000000 131.000000 
+126.000000 121.000000 130.000000 162.000000 219.000000 267.000000 
+260.000000 199.000000 138.000000 113.000000 114.000000 120.000000 
+122.000000 124.000000 128.000000 132.000000 135.000000 135.000000 
+132.000000 125.000000 117.000000 119.000000 126.000000 127.000000 
+116.000000 105.000000 105.000000 113.000000 118.000000 120.000000 
+124.000000 127.000000 127.000000 125.000000 127.000000 130.000000 
+132.000000 130.000000 129.000000 126.000000 120.000000 115.000000 
+115.000000 118.000000 122.000000 123.000000 132.000000 122.000000 
+115.000000 118.000000 126.000000 134.000000 134.000000 130.000000 
+126.000000 125.000000 125.000000 122.000000 121.000000 124.000000 
+126.000000 126.000000 128.000000 134.000000 139.000000 138.000000 
+134.000000 135.000000 139.000000 138.000000 131.000000 126.000000 
+126.000000 125.000000 124.000000 121.000000 115.000000 114.000000 
+129.000000 161.000000 195.000000 202.000000 163.000000 113.000000 
+96.000000 109.000000 123.000000 127.000000 128.000000 132.000000 
+137.000000 137.000000 134.000000 133.000000 133.000000 127.000000 
+117.000000 113.000000 118.000000 125.000000 125.000000 119.000000 
+111.000000 108.000000 111.000000 119.000000 129.000000 134.000000 
+132.000000 127.000000 129.000000 136.000000 140.000000 138.000000 
+133.000000 130.000000 127.000000 126.000000 129.000000 132.000000 
+132.000000 131.000000 125.000000 120.000000 120.000000 126.000000 
+133.000000 136.000000 133.000000 129.000000 127.000000 125.000000 
+120.000000 116.000000 118.000000 126.000000 129.000000 128.000000 
+129.000000 134.000000 138.000000 137.000000 136.000000 138.000000 
+139.000000 137.000000 135.000000 134.000000 131.000000 126.000000 
+120.000000 118.000000 122.000000 131.000000 144.000000 149.000000 
+136.000000 113.000000 96.000000 101.000000 123.000000 132.000000 
+127.000000 124.000000 131.000000 140.000000 144.000000 141.000000 
+135.000000 128.000000 124.000000 124.000000 123.000000 120.000000 
+121.000000 127.000000 132.000000 129.000000 117.000000 108.000000 
+110.000000 121.000000 130.000000 131.000000 129.000000 127.000000 
+127.000000 132.000000 137.000000 139.000000 131.000000 118.000000 
+113.000000 122.000000 136.000000 141.000000 138.000000 134.000000 
+132.000000 135.000000 135.000000 133.000000 133.000000 135.000000 
+137.000000 135.000000 127.000000 118.000000 111.000000 113.000000 
+122.000000 129.000000 128.000000 124.000000 125.000000 130.000000 
+134.000000 134.000000 131.000000 129.000000 129.000000 131.000000 
+135.000000 138.000000 140.000000 140.000000 134.000000 125.000000 
+123.000000 132.000000 144.000000 137.000000 107.000000 83.000000 
+91.000000 116.000000 129.000000 123.000000 117.000000 125.000000 
+136.000000 138.000000 135.000000 137.000000 139.000000 135.000000 
+127.000000 125.000000 130.000000 132.000000 129.000000 124.000000 
+120.000000 113.000000 105.000000 105.000000 113.000000 123.000000 
+130.000000 132.000000 132.000000 129.000000 126.000000 127.000000 
+133.000000 137.000000 134.000000 127.000000 122.000000 120.000000 
+122.000000 125.000000 126.000000 123.000000 128.000000 133.000000 
+137.000000 135.000000 130.000000 129.000000 133.000000 136.000000 
+132.000000 123.000000 114.000000 113.000000 120.000000 127.000000 
+128.000000 124.000000 120.000000 120.000000 124.000000 128.000000 
+127.000000 125.000000 127.000000 130.000000 133.000000 135.000000 
+139.000000 143.000000 139.000000 128.000000 123.000000 128.000000 
+133.000000 122.000000 96.000000 77.000000 82.000000 102.000000 
+118.000000 123.000000 126.000000 133.000000 138.000000 139.000000 
+136.000000 135.000000 136.000000 134.000000 130.000000 127.000000 
+127.000000 129.000000 130.000000 127.000000 119.000000 111.000000 
+107.000000 110.000000 117.000000 122.000000 127.000000 132.000000 
+134.000000 132.000000 129.000000 130.000000 132.000000 131.000000 
+130.000000 132.000000 135.000000 132.000000 124.000000 121.000000 
+122.000000 120.000000 127.000000 134.000000 138.000000 136.000000 
+133.000000 133.000000 131.000000 126.000000 121.000000 120.000000 
+123.000000 122.000000 118.000000 116.000000 120.000000 126.000000 
+127.000000 122.000000 118.000000 118.000000 122.000000 124.000000 
+125.000000 125.000000 125.000000 128.000000 132.000000 134.000000 
+131.000000 128.000000 131.000000 138.000000 141.000000 129.000000 
+106.000000 87.000000 87.000000 106.000000 124.000000 129.000000 
+123.000000 122.000000 130.000000 139.000000 138.000000 131.000000 
+126.000000 128.000000 132.000000 133.000000 133.000000 136.000000 
+138.000000 135.000000 126.000000 119.000000 118.000000 119.000000 
+119.000000 119.000000 125.000000 134.000000 138.000000 135.000000 
+130.000000 128.000000 128.000000 127.000000 128.000000 131.000000 
+135.000000 134.000000 132.000000 131.000000 132.000000 131.000000 
+131.000000 137.000000 139.000000 136.000000 133.000000 133.000000 
+131.000000 122.000000 111.000000 108.000000 117.000000 129.000000 
+131.000000 125.000000 120.000000 122.000000 128.000000 131.000000 
+125.000000 120.000000 120.000000 123.000000 124.000000 121.000000 
+120.000000 122.000000 125.000000 125.000000 125.000000 125.000000 
+128.000000 134.000000 139.000000 137.000000 121.000000 100.000000 
+93.000000 106.000000 124.000000 130.000000 124.000000 121.000000 
+127.000000 134.000000 134.000000 129.000000 127.000000 128.000000 
+127.000000 126.000000 127.000000 130.000000 131.000000 128.000000 
+125.000000 125.000000 126.000000 125.000000 123.000000 123.000000 
+130.000000 139.000000 143.000000 138.000000 130.000000 127.000000 
+128.000000 129.000000 128.000000 129.000000 133.000000 132.000000 
+127.000000 125.000000 132.000000 139.000000 132.000000 136.000000 
+142.000000 143.000000 140.000000 135.000000 130.000000 124.000000 
+119.000000 115.000000 114.000000 119.000000 131.000000 143.000000 
+144.000000 134.000000 125.000000 125.000000 130.000000 132.000000 
+130.000000 128.000000 128.000000 129.000000 132.000000 134.000000 
+133.000000 131.000000 129.000000 128.000000 129.000000 133.000000 
+136.000000 132.000000 116.000000 97.000000 92.000000 103.000000 
+121.000000 131.000000 130.000000 127.000000 127.000000 128.000000 
+129.000000 129.000000 128.000000 123.000000 115.000000 110.000000 
+109.000000 111.000000 114.000000 119.000000 125.000000 126.000000 
+122.000000 120.000000 121.000000 123.000000 125.000000 131.000000 
+137.000000 138.000000 131.000000 125.000000 126.000000 130.000000 
+130.000000 126.000000 123.000000 124.000000 124.000000 126.000000 
+134.000000 142.000000 142.000000 139.000000 138.000000 140.000000 
+142.000000 136.000000 128.000000 126.000000 131.000000 129.000000 
+116.000000 107.000000 115.000000 133.000000 141.000000 134.000000 
+123.000000 121.000000 127.000000 132.000000 129.000000 123.000000 
+122.000000 129.000000 139.000000 146.000000 145.000000 140.000000 
+134.000000 129.000000 126.000000 123.000000 119.000000 110.000000 
+99.000000 92.000000 94.000000 103.000000 111.000000 116.000000 
+119.000000 122.000000 123.000000 121.000000 119.000000 119.000000 
+118.000000 114.000000 109.000000 109.000000 111.000000 112.000000 
+110.000000 111.000000 116.000000 122.000000 122.000000 118.000000 
+116.000000 116.000000 118.000000 125.000000 133.000000 135.000000 
+128.000000 121.000000 124.000000 132.000000 134.000000 128.000000 
+124.000000 126.000000 131.000000 130.000000 125.000000 124.000000 
+151.000000 148.000000 141.000000 136.000000 132.000000 126.000000 
+124.000000 128.000000 130.000000 123.000000 110.000000 104.000000 
+110.000000 117.000000 121.000000 124.000000 127.000000 129.000000 
+126.000000 123.000000 123.000000 123.000000 122.000000 121.000000 
+126.000000 136.000000 143.000000 143.000000 137.000000 127.000000 
+111.000000 93.000000 82.000000 80.000000 84.000000 86.000000 
+91.000000 100.000000 109.000000 115.000000 118.000000 122.000000 
+123.000000 120.000000 116.000000 116.000000 118.000000 115.000000 
+106.000000 102.000000 108.000000 113.000000 110.000000 106.000000 
+112.000000 126.000000 133.000000 126.000000 116.000000 114.000000 
+118.000000 124.000000 128.000000 131.000000 133.000000 135.000000 
+137.000000 138.000000 134.000000 128.000000 128.000000 130.000000 
+129.000000 121.000000 117.000000 123.000000 151.000000 149.000000 
+144.000000 140.000000 134.000000 130.000000 130.000000 132.000000 
+131.000000 124.000000 117.000000 114.000000 115.000000 118.000000 
+120.000000 124.000000 128.000000 128.000000 125.000000 125.000000 
+129.000000 130.000000 125.000000 118.000000 120.000000 132.000000 
+144.000000 145.000000 138.000000 129.000000 117.000000 100.000000 
+83.000000 75.000000 79.000000 89.000000 96.000000 98.000000 
+100.000000 107.000000 116.000000 123.000000 126.000000 126.000000 
+127.000000 128.000000 128.000000 122.000000 111.000000 103.000000 
+105.000000 112.000000 117.000000 119.000000 122.000000 128.000000 
+132.000000 127.000000 119.000000 115.000000 117.000000 121.000000 
+124.000000 128.000000 132.000000 136.000000 136.000000 134.000000 
+132.000000 131.000000 130.000000 129.000000 126.000000 123.000000 
+121.000000 122.000000 143.000000 141.000000 138.000000 136.000000 
+136.000000 138.000000 141.000000 141.000000 137.000000 132.000000 
+126.000000 122.000000 119.000000 118.000000 121.000000 123.000000 
+120.000000 116.000000 114.000000 116.000000 120.000000 121.000000 
+119.000000 119.000000 125.000000 134.000000 139.000000 137.000000 
+132.000000 131.000000 133.000000 130.000000 121.000000 110.000000 
+106.000000 111.000000 116.000000 115.000000 109.000000 105.000000 
+105.000000 110.000000 121.000000 132.000000 137.000000 137.000000 
+133.000000 127.000000 118.000000 107.000000 104.000000 111.000000 
+122.000000 127.000000 125.000000 122.000000 123.000000 124.000000 
+122.000000 120.000000 121.000000 123.000000 125.000000 127.000000 
+129.000000 129.000000 125.000000 121.000000 124.000000 130.000000 
+134.000000 133.000000 131.000000 129.000000 124.000000 114.000000 
+145.000000 140.000000 133.000000 130.000000 132.000000 136.000000 
+133.000000 125.000000 122.000000 127.000000 132.000000 129.000000 
+122.000000 120.000000 126.000000 128.000000 124.000000 119.000000 
+117.000000 119.000000 121.000000 122.000000 123.000000 127.000000 
+130.000000 132.000000 131.000000 129.000000 128.000000 131.000000 
+134.000000 136.000000 130.000000 119.000000 111.000000 109.000000 
+116.000000 126.000000 129.000000 120.000000 111.000000 111.000000 
+120.000000 129.000000 132.000000 129.000000 125.000000 121.000000 
+117.000000 113.000000 111.000000 111.000000 112.000000 113.000000 
+116.000000 122.000000 130.000000 135.000000 134.000000 127.000000 
+121.000000 121.000000 127.000000 131.000000 127.000000 119.000000 
+117.000000 124.000000 132.000000 135.000000 134.000000 131.000000 
+128.000000 125.000000 121.000000 114.000000 148.000000 140.000000 
+134.000000 133.000000 132.000000 127.000000 123.000000 127.000000 
+135.000000 138.000000 136.000000 130.000000 126.000000 125.000000 
+123.000000 120.000000 121.000000 123.000000 124.000000 125.000000 
+126.000000 128.000000 131.000000 133.000000 132.000000 130.000000 
+128.000000 129.000000 129.000000 131.000000 139.000000 143.000000 
+129.000000 97.000000 69.000000 66.000000 92.000000 123.000000 
+133.000000 122.000000 114.000000 120.000000 130.000000 134.000000 
+130.000000 124.000000 117.000000 110.000000 109.000000 117.000000 
+121.000000 116.000000 107.000000 105.000000 116.000000 132.000000 
+140.000000 141.000000 136.000000 125.000000 113.000000 109.000000 
+115.000000 123.000000 124.000000 122.000000 125.000000 133.000000 
+135.000000 128.000000 120.000000 120.000000 124.000000 126.000000 
+125.000000 124.000000 146.000000 142.000000 142.000000 143.000000 
+139.000000 132.000000 129.000000 131.000000 133.000000 130.000000 
+128.000000 128.000000 129.000000 125.000000 120.000000 117.000000 
+117.000000 118.000000 121.000000 126.000000 130.000000 130.000000 
+130.000000 132.000000 133.000000 130.000000 126.000000 123.000000 
+124.000000 130.000000 141.000000 146.000000 133.000000 101.000000 
+71.000000 69.000000 96.000000 126.000000 135.000000 127.000000 
+123.000000 129.000000 134.000000 131.000000 125.000000 122.000000 
+120.000000 115.000000 111.000000 113.000000 118.000000 118.000000 
+111.000000 108.000000 119.000000 132.000000 135.000000 128.000000 
+122.000000 122.000000 123.000000 119.000000 115.000000 118.000000 
+125.000000 128.000000 126.000000 125.000000 129.000000 132.000000 
+132.000000 128.000000 127.000000 126.000000 125.000000 123.000000 
+139.000000 134.000000 131.000000 130.000000 133.000000 134.000000 
+133.000000 128.000000 124.000000 124.000000 126.000000 127.000000 
+125.000000 122.000000 121.000000 121.000000 116.000000 111.000000 
+113.000000 121.000000 127.000000 129.000000 129.000000 131.000000 
+132.000000 130.000000 129.000000 128.000000 129.000000 134.000000 
+142.000000 146.000000 130.000000 97.000000 71.000000 72.000000 
+99.000000 123.000000 127.000000 121.000000 123.000000 132.000000 
+133.000000 125.000000 117.000000 117.000000 120.000000 119.000000 
+115.000000 115.000000 119.000000 121.000000 118.000000 115.000000 
+117.000000 125.000000 130.000000 126.000000 121.000000 122.000000 
+129.000000 130.000000 122.000000 118.000000 123.000000 131.000000 
+133.000000 130.000000 132.000000 137.000000 138.000000 135.000000 
+131.000000 129.000000 125.000000 121.000000 134.000000 133.000000 
+134.000000 138.000000 142.000000 142.000000 138.000000 133.000000 
+132.000000 133.000000 135.000000 134.000000 129.000000 123.000000 
+120.000000 119.000000 117.000000 114.000000 114.000000 118.000000 
+126.000000 132.000000 135.000000 135.000000 135.000000 134.000000 
+133.000000 133.000000 134.000000 136.000000 142.000000 143.000000 
+127.000000 96.000000 71.000000 73.000000 102.000000 131.000000 
+137.000000 129.000000 124.000000 126.000000 125.000000 121.000000 
+118.000000 121.000000 122.000000 118.000000 114.000000 116.000000 
+124.000000 129.000000 128.000000 123.000000 119.000000 121.000000 
+125.000000 128.000000 127.000000 127.000000 129.000000 128.000000 
+124.000000 121.000000 124.000000 128.000000 128.000000 125.000000 
+127.000000 134.000000 138.000000 134.000000 126.000000 123.000000 
+124.000000 125.000000 133.000000 130.000000 133.000000 140.000000 
+144.000000 144.000000 138.000000 133.000000 131.000000 131.000000 
+133.000000 133.000000 129.000000 124.000000 121.000000 122.000000 
+123.000000 122.000000 121.000000 125.000000 131.000000 135.000000 
+136.000000 136.000000 137.000000 137.000000 134.000000 131.000000 
+132.000000 138.000000 146.000000 143.000000 122.000000 91.000000 
+70.000000 78.000000 106.000000 130.000000 133.000000 126.000000 
+122.000000 125.000000 125.000000 121.000000 118.000000 119.000000 
+118.000000 115.000000 115.000000 121.000000 127.000000 128.000000 
+125.000000 125.000000 125.000000 124.000000 123.000000 126.000000 
+133.000000 135.000000 132.000000 128.000000 130.000000 137.000000 
+138.000000 130.000000 123.000000 125.000000 134.000000 142.000000 
+141.000000 134.000000 126.000000 123.000000 126.000000 130.000000 
+137.000000 132.000000 130.000000 132.000000 138.000000 143.000000 
+142.000000 137.000000 132.000000 130.000000 129.000000 125.000000 
+123.000000 127.000000 133.000000 135.000000 130.000000 124.000000 
+123.000000 126.000000 129.000000 131.000000 134.000000 137.000000 
+138.000000 136.000000 132.000000 130.000000 135.000000 142.000000 
+148.000000 142.000000 121.000000 94.000000 78.000000 85.000000 
+107.000000 125.000000 129.000000 127.000000 126.000000 125.000000 
+121.000000 115.000000 115.000000 118.000000 119.000000 118.000000 
+119.000000 122.000000 124.000000 124.000000 126.000000 129.000000 
+128.000000 123.000000 121.000000 125.000000 130.000000 129.000000 
+126.000000 127.000000 135.000000 143.000000 143.000000 136.000000 
+131.000000 132.000000 136.000000 135.000000 133.000000 132.000000 
+132.000000 129.000000 124.000000 125.000000 132.000000 127.000000 
+125.000000 128.000000 134.000000 140.000000 141.000000 138.000000 
+136.000000 136.000000 134.000000 128.000000 125.000000 128.000000 
+133.000000 133.000000 130.000000 128.000000 129.000000 128.000000 
+125.000000 127.000000 134.000000 141.000000 141.000000 136.000000 
+130.000000 127.000000 128.000000 135.000000 142.000000 140.000000 
+117.000000 85.000000 70.000000 80.000000 105.000000 123.000000 
+127.000000 127.000000 129.000000 129.000000 124.000000 119.000000 
+118.000000 120.000000 121.000000 121.000000 121.000000 121.000000 
+120.000000 119.000000 121.000000 126.000000 129.000000 129.000000 
+129.000000 129.000000 128.000000 124.000000 123.000000 128.000000 
+135.000000 138.000000 136.000000 130.000000 128.000000 130.000000 
+131.000000 129.000000 126.000000 129.000000 132.000000 129.000000 
+121.000000 118.000000 133.000000 130.000000 128.000000 128.000000 
+130.000000 133.000000 138.000000 142.000000 143.000000 139.000000 
+131.000000 126.000000 127.000000 130.000000 131.000000 127.000000 
+123.000000 124.000000 127.000000 128.000000 127.000000 128.000000 
+133.000000 136.000000 135.000000 131.000000 129.000000 129.000000 
+129.000000 133.000000 138.000000 135.000000 112.000000 82.000000 
+69.000000 86.000000 113.000000 127.000000 124.000000 122.000000 
+128.000000 132.000000 127.000000 120.000000 118.000000 121.000000 
+122.000000 120.000000 119.000000 120.000000 121.000000 121.000000 
+123.000000 125.000000 127.000000 128.000000 127.000000 126.000000 
+124.000000 126.000000 130.000000 131.000000 129.000000 128.000000 
+130.000000 133.000000 132.000000 128.000000 127.000000 130.000000 
+133.000000 133.000000 132.000000 130.000000 124.000000 119.000000 
+134.000000 137.000000 136.000000 133.000000 131.000000 131.000000 
+136.000000 143.000000 146.000000 139.000000 128.000000 125.000000 
+133.000000 142.000000 142.000000 134.000000 127.000000 124.000000 
+122.000000 121.000000 124.000000 132.000000 137.000000 133.000000 
+127.000000 126.000000 129.000000 130.000000 129.000000 132.000000 
+136.000000 132.000000 113.000000 90.000000 82.000000 95.000000 
+115.000000 128.000000 130.000000 128.000000 129.000000 130.000000 
+127.000000 126.000000 126.000000 125.000000 121.000000 118.000000 
+121.000000 128.000000 132.000000 131.000000 126.000000 124.000000 
+123.000000 126.000000 128.000000 129.000000 127.000000 129.000000 
+132.000000 134.000000 128.000000 120.000000 119.000000 124.000000 
+128.000000 126.000000 125.000000 129.000000 134.000000 135.000000 
+132.000000 128.000000 123.000000 119.000000 136.000000 136.000000 
+133.000000 130.000000 129.000000 131.000000 133.000000 130.000000 
+125.000000 121.000000 126.000000 136.000000 143.000000 140.000000 
+129.000000 120.000000 119.000000 124.000000 129.000000 132.000000 
+132.000000 133.000000 133.000000 131.000000 129.000000 127.000000 
+126.000000 126.000000 127.000000 132.000000 136.000000 130.000000 
+111.000000 91.000000 87.000000 102.000000 123.000000 133.000000 
+131.000000 128.000000 129.000000 131.000000 129.000000 125.000000 
+124.000000 121.000000 117.000000 117.000000 123.000000 129.000000 
+130.000000 127.000000 124.000000 123.000000 120.000000 117.000000 
+121.000000 129.000000 134.000000 131.000000 127.000000 125.000000 
+123.000000 120.000000 122.000000 128.000000 129.000000 124.000000 
+121.000000 126.000000 136.000000 139.000000 134.000000 129.000000 
+129.000000 133.000000 129.000000 135.000000 140.000000 138.000000 
+133.000000 131.000000 130.000000 123.000000 115.000000 116.000000 
+130.000000 143.000000 146.000000 140.000000 132.000000 129.000000 
+129.000000 131.000000 132.000000 132.000000 131.000000 131.000000 
+132.000000 133.000000 130.000000 127.000000 126.000000 126.000000 
+127.000000 129.000000 130.000000 125.000000 110.000000 96.000000 
+95.000000 106.000000 123.000000 132.000000 130.000000 125.000000 
+122.000000 123.000000 124.000000 127.000000 129.000000 128.000000 
+128.000000 130.000000 134.000000 132.000000 126.000000 120.000000 
+119.000000 120.000000 119.000000 115.000000 115.000000 119.000000 
+122.000000 123.000000 124.000000 125.000000 123.000000 121.000000 
+123.000000 129.000000 128.000000 118.000000 112.000000 121.000000 
+137.000000 144.000000 137.000000 129.000000 129.000000 134.000000 
+131.000000 137.000000 139.000000 137.000000 134.000000 132.000000 
+129.000000 125.000000 122.000000 124.000000 130.000000 136.000000 
+139.000000 137.000000 134.000000 132.000000 133.000000 135.000000 
+135.000000 133.000000 134.000000 137.000000 136.000000 131.000000 
+126.000000 129.000000 131.000000 128.000000 121.000000 120.000000 
+125.000000 125.000000 114.000000 103.000000 102.000000 115.000000 
+130.000000 138.000000 138.000000 135.000000 131.000000 130.000000 
+129.000000 130.000000 129.000000 127.000000 124.000000 123.000000 
+124.000000 125.000000 125.000000 122.000000 118.000000 118.000000 
+121.000000 124.000000 121.000000 115.000000 113.000000 121.000000 
+131.000000 135.000000 130.000000 123.000000 122.000000 128.000000 
+133.000000 130.000000 123.000000 121.000000 127.000000 136.000000 
+142.000000 139.000000 133.000000 128.000000 129.000000 128.000000 
+130.000000 132.000000 134.000000 135.000000 135.000000 131.000000 
+125.000000 119.000000 121.000000 128.000000 134.000000 135.000000 
+135.000000 136.000000 137.000000 136.000000 133.000000 130.000000 
+130.000000 129.000000 127.000000 127.000000 132.000000 140.000000 
+143.000000 139.000000 134.000000 133.000000 137.000000 135.000000 
+127.000000 118.000000 117.000000 123.000000 129.000000 130.000000 
+129.000000 127.000000 127.000000 127.000000 130.000000 133.000000 
+133.000000 129.000000 126.000000 128.000000 132.000000 134.000000 
+129.000000 122.000000 117.000000 116.000000 118.000000 121.000000 
+122.000000 123.000000 127.000000 132.000000 134.000000 134.000000 
+133.000000 134.000000 135.000000 132.000000 128.000000 125.000000 
+124.000000 126.000000 129.000000 133.000000 135.000000 132.000000 
+129.000000 127.000000 135.000000 136.000000 139.000000 142.000000 
+142.000000 136.000000 130.000000 129.000000 130.000000 130.000000 
+126.000000 125.000000 131.000000 140.000000 143.000000 139.000000 
+136.000000 137.000000 138.000000 134.000000 127.000000 123.000000 
+124.000000 126.000000 128.000000 130.000000 133.000000 135.000000 
+133.000000 132.000000 134.000000 134.000000 128.000000 120.000000 
+120.000000 129.000000 139.000000 139.000000 131.000000 124.000000 
+124.000000 130.000000 135.000000 137.000000 136.000000 133.000000 
+129.000000 127.000000 126.000000 125.000000 125.000000 126.000000 
+127.000000 129.000000 129.000000 129.000000 129.000000 128.000000 
+127.000000 126.000000 124.000000 122.000000 121.000000 123.000000 
+129.000000 134.000000 134.000000 128.000000 123.000000 124.000000 
+129.000000 132.000000 128.000000 123.000000 122.000000 127.000000 
+139.000000 135.000000 136.000000 141.000000 143.000000 137.000000 
+129.000000 127.000000 133.000000 137.000000 136.000000 132.000000 
+131.000000 134.000000 138.000000 139.000000 138.000000 138.000000 
+137.000000 133.000000 129.000000 127.000000 126.000000 123.000000 
+124.000000 131.000000 139.000000 142.000000 136.000000 130.000000 
+130.000000 135.000000 136.000000 130.000000 127.000000 133.000000 
+141.000000 140.000000 132.000000 124.000000 124.000000 126.000000 
+126.000000 128.000000 134.000000 138.000000 139.000000 137.000000 
+136.000000 133.000000 127.000000 120.000000 120.000000 126.000000 
+132.000000 130.000000 126.000000 123.000000 123.000000 124.000000 
+125.000000 126.000000 130.000000 134.000000 137.000000 135.000000 
+129.000000 123.000000 121.000000 126.000000 132.000000 135.000000 
+131.000000 126.000000 125.000000 129.000000 132.000000 132.000000 
+138.000000 143.000000 141.000000 134.000000 127.000000 126.000000 
+129.000000 134.000000 138.000000 141.000000 141.000000 138.000000 
+136.000000 134.000000 133.000000 132.000000 130.000000 129.000000 
+128.000000 124.000000 118.000000 116.000000 121.000000 130.000000 
+137.000000 138.000000 136.000000 133.000000 131.000000 129.000000 
+126.000000 124.000000 126.000000 131.000000 136.000000 138.000000 
+134.000000 129.000000 126.000000 124.000000 125.000000 129.000000 
+134.000000 136.000000 135.000000 132.000000 132.000000 131.000000 
+128.000000 125.000000 125.000000 127.000000 128.000000 124.000000 
+118.000000 117.000000 122.000000 127.000000 127.000000 125.000000 
+127.000000 131.000000 134.000000 134.000000 132.000000 128.000000 
+124.000000 122.000000 125.000000 132.000000 136.000000 135.000000 
+132.000000 130.000000 128.000000 127.000000 130.000000 134.000000 
+136.000000 134.000000 131.000000 130.000000 131.000000 131.000000 
+132.000000 135.000000 137.000000 137.000000 136.000000 137.000000 
+139.000000 139.000000 134.000000 129.000000 126.000000 124.000000 
+123.000000 123.000000 126.000000 132.000000 139.000000 143.000000 
+143.000000 139.000000 132.000000 126.000000 123.000000 123.000000 
+125.000000 128.000000 133.000000 135.000000 134.000000 132.000000 
+132.000000 134.000000 135.000000 132.000000 128.000000 125.000000 
+126.000000 129.000000 132.000000 132.000000 130.000000 128.000000 
+126.000000 124.000000 123.000000 123.000000 125.000000 127.000000 
+126.000000 123.000000 125.000000 130.000000 135.000000 136.000000 
+133.000000 130.000000 130.000000 133.000000 136.000000 139.000000 
+141.000000 140.000000 136.000000 132.000000 129.000000 128.000000 
+128.000000 130.000000 133.000000 131.000000 128.000000 129.000000 
+135.000000 139.000000 138.000000 133.000000 130.000000 128.000000 
+129.000000 133.000000 137.000000 141.000000 143.000000 141.000000 
+138.000000 131.000000 123.000000 118.000000 119.000000 125.000000 
+131.000000 134.000000 137.000000 140.000000 141.000000 135.000000 
+128.000000 126.000000 130.000000 132.000000 131.000000 131.000000 
+133.000000 134.000000 132.000000 129.000000 131.000000 134.000000 
+135.000000 131.000000 128.000000 126.000000 127.000000 130.000000 
+134.000000 136.000000 132.000000 126.000000 124.000000 125.000000 
+128.000000 127.000000 126.000000 127.000000 129.000000 128.000000 
+128.000000 131.000000 135.000000 137.000000 133.000000 127.000000 
+123.000000 126.000000 133.000000 138.000000 135.000000 132.000000 
+132.000000 134.000000 132.000000 127.000000 134.000000 132.000000 
+130.000000 130.000000 131.000000 133.000000 132.000000 130.000000 
+126.000000 125.000000 125.000000 129.000000 132.000000 137.000000 
+140.000000 141.000000 139.000000 133.000000 127.000000 124.000000 
+126.000000 131.000000 133.000000 132.000000 128.000000 127.000000 
+131.000000 137.000000 140.000000 135.000000 128.000000 126.000000 
+128.000000 129.000000 127.000000 127.000000 131.000000 134.000000 
+134.000000 135.000000 138.000000 139.000000 133.000000 124.000000 
+120.000000 125.000000 132.000000 136.000000 137.000000 134.000000 
+130.000000 124.000000 122.000000 125.000000 128.000000 130.000000 
+131.000000 130.000000 128.000000 127.000000 130.000000 134.000000 
+136.000000 132.000000 130.000000 132.000000 137.000000 139.000000 
+137.000000 133.000000 131.000000 131.000000 131.000000 129.000000 
+124.000000 123.000000 126.000000 125.000000 129.000000 136.000000 
+141.000000 140.000000 134.000000 128.000000 125.000000 127.000000 
+131.000000 134.000000 136.000000 138.000000 141.000000 143.000000 
+142.000000 135.000000 127.000000 124.000000 128.000000 130.000000 
+129.000000 126.000000 127.000000 131.000000 136.000000 139.000000 
+140.000000 138.000000 135.000000 132.000000 132.000000 132.000000 
+133.000000 134.000000 134.000000 134.000000 133.000000 135.000000 
+139.000000 141.000000 139.000000 133.000000 127.000000 128.000000 
+132.000000 135.000000 135.000000 131.000000 127.000000 127.000000 
+129.000000 131.000000 130.000000 127.000000 124.000000 124.000000 
+126.000000 128.000000 128.000000 127.000000 128.000000 130.000000 
+134.000000 138.000000 140.000000 138.000000 133.000000 131.000000 
+133.000000 136.000000 136.000000 133.000000 130.000000 128.000000 
+132.000000 133.000000 137.000000 139.000000 137.000000 135.000000 
+134.000000 133.000000 132.000000 132.000000 134.000000 136.000000 
+135.000000 130.000000 127.000000 131.000000 136.000000 137.000000 
+133.000000 130.000000 134.000000 138.000000 137.000000 131.000000 
+128.000000 131.000000 134.000000 132.000000 128.000000 128.000000 
+132.000000 132.000000 128.000000 127.000000 132.000000 137.000000 
+136.000000 132.000000 133.000000 137.000000 139.000000 137.000000 
+134.000000 134.000000 134.000000 135.000000 136.000000 137.000000 
+135.000000 129.000000 124.000000 124.000000 127.000000 131.000000 
+132.000000 130.000000 125.000000 122.000000 123.000000 127.000000 
+130.000000 129.000000 125.000000 125.000000 130.000000 138.000000 
+143.000000 142.000000 135.000000 128.000000 125.000000 126.000000 
+129.000000 130.000000 132.000000 133.000000 125.000000 129.000000 
+135.000000 138.000000 137.000000 136.000000 137.000000 135.000000 
+129.000000 125.000000 126.000000 131.000000 133.000000 134.000000 
+135.000000 136.000000 136.000000 134.000000 132.000000 130.000000 
+129.000000 131.000000 134.000000 132.000000 125.000000 121.000000 
+125.000000 131.000000 132.000000 128.000000 124.000000 126.000000 
+130.000000 135.000000 136.000000 135.000000 132.000000 130.000000 
+132.000000 136.000000 137.000000 132.000000 127.000000 127.000000 
+132.000000 135.000000 135.000000 133.000000 133.000000 135.000000 
+136.000000 135.000000 133.000000 131.000000 132.000000 129.000000 
+122.000000 117.000000 119.000000 126.000000 129.000000 127.000000 
+124.000000 124.000000 127.000000 129.000000 130.000000 129.000000 
+127.000000 124.000000 125.000000 130.000000 133.000000 133.000000 
+129.000000 124.000000 122.000000 126.000000 134.000000 136.000000 
+136.000000 135.000000 135.000000 133.000000 127.000000 124.000000 
+126.000000 132.000000 135.000000 136.000000 136.000000 134.000000 
+132.000000 133.000000 138.000000 141.000000 139.000000 134.000000 
+132.000000 132.000000 131.000000 129.000000 128.000000 129.000000 
+129.000000 126.000000 125.000000 130.000000 136.000000 140.000000 
+138.000000 134.000000 132.000000 131.000000 130.000000 130.000000 
+130.000000 132.000000 133.000000 131.000000 129.000000 129.000000 
+130.000000 131.000000 131.000000 132.000000 134.000000 135.000000 
+136.000000 135.000000 134.000000 130.000000 127.000000 126.000000 
+130.000000 135.000000 135.000000 132.000000 127.000000 123.000000 
+123.000000 130.000000 142.000000 148.000000 142.000000 130.000000 
+125.000000 129.000000 133.000000 131.000000 126.000000 125.000000 
+127.000000 129.000000 129.000000 127.000000 129.000000 133.000000 
+135.000000 133.000000 130.000000 128.000000 129.000000 130.000000 
+133.000000 135.000000 136.000000 135.000000 132.000000 130.000000 
+131.000000 133.000000 135.000000 135.000000 135.000000 134.000000 
+133.000000 132.000000 130.000000 127.000000 126.000000 126.000000 
+127.000000 128.000000 131.000000 133.000000 134.000000 136.000000 
+136.000000 136.000000 135.000000 135.000000 135.000000 137.000000 
+135.000000 131.000000 127.000000 129.000000 136.000000 143.000000 
+143.000000 139.000000 135.000000 133.000000 135.000000 137.000000 
+136.000000 130.000000 126.000000 127.000000 133.000000 138.000000 
+137.000000 132.000000 128.000000 127.000000 127.000000 129.000000 
+132.000000 133.000000 131.000000 126.000000 124.000000 127.000000 
+133.000000 136.000000 133.000000 128.000000 123.000000 126.000000 
+131.000000 136.000000 136.000000 134.000000 134.000000 136.000000 
+138.000000 138.000000 135.000000 134.000000 134.000000 134.000000 
+133.000000 131.000000 129.000000 129.000000 131.000000 136.000000 
+141.000000 143.000000 141.000000 138.000000 136.000000 134.000000 
+132.000000 132.000000 133.000000 133.000000 130.000000 126.000000 
+125.000000 129.000000 133.000000 134.000000 132.000000 130.000000 
+131.000000 135.000000 137.000000 136.000000 134.000000 133.000000 
+135.000000 139.000000 142.000000 141.000000 137.000000 135.000000 
+133.000000 131.000000 130.000000 131.000000 132.000000 132.000000 
+130.000000 128.000000 128.000000 129.000000 130.000000 130.000000 
+129.000000 126.000000 126.000000 127.000000 129.000000 129.000000 
+128.000000 127.000000 126.000000 125.000000 126.000000 130.000000 
+135.000000 135.000000 124.000000 125.000000 129.000000 132.000000 
+130.000000 127.000000 128.000000 133.000000 137.000000 137.000000 
+135.000000 136.000000 140.000000 140.000000 138.000000 134.000000 
+131.000000 131.000000 133.000000 137.000000 140.000000 139.000000 
+138.000000 137.000000 137.000000 134.000000 130.000000 126.000000 
+126.000000 128.000000 130.000000 132.000000 133.000000 134.000000 
+136.000000 137.000000 136.000000 134.000000 131.000000 130.000000 
+131.000000 133.000000 133.000000 131.000000 130.000000 132.000000 
+138.000000 141.000000 139.000000 133.000000 130.000000 129.000000 
+130.000000 131.000000 133.000000 137.000000 139.000000 138.000000 
+135.000000 133.000000 132.000000 130.000000 128.000000 126.000000 
+124.000000 124.000000 124.000000 126.000000 128.000000 126.000000 
+122.000000 121.000000 125.000000 131.000000 133.000000 130.000000 
+110.000000 114.000000 118.000000 116.000000 111.000000 113.000000 
+126.000000 137.000000 130.000000 114.000000 111.000000 121.000000 
+129.000000 129.000000 129.000000 134.000000 139.000000 138.000000 
+134.000000 132.000000 132.000000 134.000000 137.000000 136.000000 
+133.000000 131.000000 134.000000 140.000000 144.000000 144.000000 
+142.000000 136.000000 129.000000 123.000000 120.000000 118.000000 
+117.000000 116.000000 117.000000 120.000000 123.000000 125.000000 
+127.000000 128.000000 129.000000 133.000000 141.000000 147.000000 
+146.000000 136.000000 123.000000 117.000000 122.000000 129.000000 
+131.000000 128.000000 126.000000 130.000000 135.000000 133.000000 
+125.000000 117.000000 115.000000 116.000000 115.000000 114.000000 
+117.000000 125.000000 132.000000 135.000000 137.000000 138.000000 
+136.000000 124.000000 111.000000 107.000000 110.000000 111.000000 
+116.000000 112.000000 103.000000 102.000000 112.000000 118.000000 
+116.000000 112.000000 117.000000 123.000000 126.000000 126.000000 
+128.000000 132.000000 135.000000 136.000000 137.000000 138.000000 
+141.000000 144.000000 142.000000 135.000000 128.000000 128.000000 
+133.000000 138.000000 142.000000 144.000000 141.000000 134.000000 
+129.000000 128.000000 130.000000 129.000000 125.000000 122.000000 
+121.000000 123.000000 123.000000 122.000000 125.000000 131.000000 
+137.000000 140.000000 143.000000 148.000000 148.000000 140.000000 
+130.000000 127.000000 130.000000 131.000000 129.000000 129.000000 
+132.000000 135.000000 134.000000 128.000000 120.000000 113.000000 
+112.000000 113.000000 115.000000 117.000000 123.000000 132.000000 
+138.000000 141.000000 143.000000 142.000000 135.000000 122.000000 
+113.000000 113.000000 107.000000 106.000000 108.000000 110.000000 
+113.000000 115.000000 116.000000 118.000000 120.000000 119.000000 
+116.000000 112.000000 114.000000 121.000000 131.000000 137.000000 
+139.000000 138.000000 136.000000 138.000000 144.000000 146.000000 
+140.000000 134.000000 133.000000 135.000000 137.000000 136.000000 
+137.000000 137.000000 133.000000 127.000000 127.000000 132.000000 
+134.000000 128.000000 119.000000 115.000000 117.000000 121.000000 
+123.000000 123.000000 126.000000 133.000000 142.000000 145.000000 
+143.000000 144.000000 148.000000 148.000000 139.000000 130.000000 
+130.000000 133.000000 132.000000 129.000000 130.000000 130.000000 
+125.000000 118.000000 113.000000 111.000000 111.000000 109.000000 
+106.000000 108.000000 115.000000 126.000000 136.000000 139.000000 
+138.000000 134.000000 127.000000 120.000000 120.000000 127.000000 
+114.000000 108.000000 107.000000 112.000000 115.000000 110.000000 
+106.000000 113.000000 125.000000 130.000000 124.000000 117.000000 
+119.000000 127.000000 134.000000 137.000000 136.000000 136.000000 
+138.000000 143.000000 146.000000 143.000000 135.000000 131.000000 
+136.000000 143.000000 145.000000 143.000000 141.000000 139.000000 
+135.000000 131.000000 129.000000 128.000000 127.000000 125.000000 
+123.000000 118.000000 110.000000 107.000000 113.000000 127.000000 
+136.000000 135.000000 131.000000 131.000000 135.000000 140.000000 
+145.000000 147.000000 141.000000 132.000000 129.000000 131.000000 
+131.000000 127.000000 123.000000 121.000000 120.000000 117.000000 
+116.000000 116.000000 117.000000 117.000000 117.000000 117.000000 
+120.000000 125.000000 130.000000 131.000000 128.000000 124.000000 
+122.000000 121.000000 125.000000 133.000000 138.000000 130.000000 
+117.000000 109.000000 108.000000 110.000000 112.000000 115.000000 
+122.000000 130.000000 132.000000 129.000000 127.000000 128.000000 
+130.000000 131.000000 132.000000 132.000000 131.000000 128.000000 
+125.000000 122.000000 122.000000 126.000000 134.000000 142.000000 
+148.000000 150.000000 147.000000 141.000000 136.000000 135.000000 
+135.000000 135.000000 133.000000 132.000000 132.000000 127.000000 
+120.000000 119.000000 124.000000 131.000000 135.000000 132.000000 
+128.000000 131.000000 139.000000 144.000000 144.000000 142.000000 
+140.000000 136.000000 132.000000 130.000000 128.000000 124.000000 
+119.000000 119.000000 122.000000 125.000000 126.000000 124.000000 
+122.000000 119.000000 118.000000 120.000000 124.000000 129.000000 
+134.000000 135.000000 131.000000 123.000000 118.000000 120.000000 
+126.000000 130.000000 142.000000 140.000000 130.000000 118.000000 
+112.000000 114.000000 120.000000 125.000000 127.000000 128.000000 
+128.000000 128.000000 127.000000 124.000000 124.000000 130.000000 
+135.000000 132.000000 123.000000 115.000000 113.000000 115.000000 
+118.000000 121.000000 125.000000 133.000000 141.000000 143.000000 
+141.000000 138.000000 138.000000 136.000000 136.000000 140.000000 
+147.000000 146.000000 134.000000 126.000000 149.000000 194.000000 
+211.000000 179.000000 138.000000 123.000000 130.000000 140.000000 
+145.000000 145.000000 143.000000 139.000000 136.000000 133.000000 
+132.000000 129.000000 124.000000 121.000000 121.000000 124.000000 
+125.000000 122.000000 120.000000 120.000000 122.000000 123.000000 
+121.000000 122.000000 126.000000 129.000000 126.000000 122.000000 
+121.000000 120.000000 118.000000 118.000000 122.000000 126.000000 
+136.000000 137.000000 133.000000 126.000000 119.000000 115.000000 
+118.000000 125.000000 129.000000 129.000000 129.000000 130.000000 
+130.000000 126.000000 124.000000 128.000000 133.000000 133.000000 
+130.000000 125.000000 120.000000 116.000000 116.000000 121.000000 
+130.000000 136.000000 137.000000 136.000000 138.000000 141.000000 
+137.000000 125.000000 121.000000 129.000000 139.000000 135.000000 
+119.000000 112.000000 130.000000 164.000000 173.000000 149.000000 
+128.000000 126.000000 132.000000 136.000000 135.000000 136.000000 
+138.000000 139.000000 136.000000 136.000000 138.000000 134.000000 
+125.000000 120.000000 123.000000 127.000000 126.000000 122.000000 
+121.000000 122.000000 123.000000 123.000000 122.000000 122.000000 
+124.000000 123.000000 116.000000 107.000000 106.000000 116.000000 
+127.000000 129.000000 125.000000 124.000000 140.000000 140.000000 
+139.000000 136.000000 131.000000 124.000000 121.000000 124.000000 
+126.000000 125.000000 125.000000 129.000000 132.000000 130.000000 
+127.000000 127.000000 128.000000 128.000000 127.000000 126.000000 
+127.000000 128.000000 127.000000 129.000000 133.000000 136.000000 
+136.000000 138.000000 143.000000 146.000000 137.000000 121.000000 
+113.000000 120.000000 128.000000 116.000000 87.000000 63.000000 
+59.000000 76.000000 99.000000 118.000000 128.000000 130.000000 
+128.000000 126.000000 130.000000 137.000000 142.000000 140.000000 
+135.000000 133.000000 133.000000 129.000000 121.000000 117.000000 
+121.000000 126.000000 127.000000 127.000000 127.000000 125.000000 
+120.000000 118.000000 121.000000 123.000000 118.000000 110.000000 
+105.000000 102.000000 103.000000 110.000000 122.000000 128.000000 
+124.000000 118.000000 139.000000 143.000000 142.000000 140.000000 
+136.000000 131.000000 128.000000 126.000000 125.000000 126.000000 
+127.000000 126.000000 121.000000 119.000000 121.000000 124.000000 
+122.000000 118.000000 117.000000 124.000000 132.000000 136.000000 
+132.000000 125.000000 121.000000 126.000000 134.000000 139.000000 
+138.000000 136.000000 137.000000 133.000000 124.000000 118.000000 
+135.000000 161.000000 155.000000 116.000000 82.000000 75.000000 
+99.000000 130.000000 138.000000 130.000000 125.000000 130.000000 
+136.000000 140.000000 141.000000 140.000000 136.000000 126.000000 
+119.000000 118.000000 122.000000 124.000000 124.000000 126.000000 
+130.000000 132.000000 129.000000 123.000000 121.000000 121.000000 
+122.000000 118.000000 111.000000 106.000000 106.000000 107.000000 
+109.000000 112.000000 119.000000 124.000000 124.000000 121.000000 
+135.000000 138.000000 134.000000 129.000000 128.000000 133.000000 
+137.000000 132.000000 124.000000 123.000000 126.000000 125.000000 
+118.000000 116.000000 121.000000 123.000000 118.000000 114.000000 
+120.000000 129.000000 133.000000 133.000000 133.000000 132.000000 
+128.000000 127.000000 132.000000 136.000000 135.000000 132.000000 
+132.000000 130.000000 124.000000 129.000000 166.000000 231.000000 
+260.000000 215.000000 144.000000 114.000000 116.000000 124.000000 
+121.000000 115.000000 121.000000 134.000000 142.000000 140.000000 
+136.000000 132.000000 125.000000 117.000000 112.000000 113.000000 
+114.000000 114.000000 115.000000 120.000000 124.000000 125.000000 
+124.000000 124.000000 122.000000 119.000000 115.000000 114.000000 
+114.000000 113.000000 110.000000 109.000000 113.000000 119.000000 
+125.000000 127.000000 126.000000 123.000000 132.000000 133.000000 
+133.000000 129.000000 127.000000 131.000000 137.000000 138.000000 
+133.000000 128.000000 127.000000 123.000000 119.000000 120.000000 
+125.000000 127.000000 127.000000 126.000000 126.000000 125.000000 
+126.000000 133.000000 143.000000 147.000000 143.000000 136.000000 
+132.000000 133.000000 137.000000 138.000000 130.000000 120.000000 
+128.000000 161.000000 198.000000 222.000000 202.000000 137.000000 
+110.000000 128.000000 142.000000 134.000000 118.000000 115.000000 
+124.000000 135.000000 142.000000 142.000000 138.000000 129.000000 
+119.000000 114.000000 115.000000 116.000000 110.000000 106.000000 
+109.000000 117.000000 123.000000 127.000000 127.000000 126.000000 
+119.000000 114.000000 116.000000 122.000000 123.000000 116.000000 
+109.000000 110.000000 113.000000 110.000000 106.000000 109.000000 
+120.000000 130.000000 139.000000 136.000000 132.000000 129.000000 
+130.000000 133.000000 133.000000 129.000000 127.000000 128.000000 
+130.000000 127.000000 123.000000 123.000000 126.000000 131.000000 
+136.000000 135.000000 131.000000 127.000000 129.000000 137.000000 
+143.000000 147.000000 146.000000 141.000000 131.000000 125.000000 
+127.000000 129.000000 126.000000 126.000000 143.000000 162.000000 
+159.000000 126.000000 83.000000 67.000000 98.000000 129.000000 
+137.000000 131.000000 129.000000 134.000000 140.000000 140.000000 
+139.000000 138.000000 135.000000 129.000000 123.000000 123.000000 
+127.000000 126.000000 121.000000 115.000000 114.000000 116.000000 
+122.000000 129.000000 132.000000 128.000000 119.000000 116.000000 
+123.000000 129.000000 128.000000 124.000000 121.000000 118.000000 
+111.000000 105.000000 105.000000 112.000000 122.000000 134.000000 
+139.000000 136.000000 129.000000 127.000000 133.000000 139.000000 
+136.000000 126.000000 119.000000 121.000000 126.000000 126.000000 
+124.000000 123.000000 123.000000 125.000000 128.000000 132.000000 
+136.000000 138.000000 139.000000 139.000000 139.000000 140.000000 
+140.000000 136.000000 131.000000 128.000000 127.000000 124.000000 
+124.000000 133.000000 145.000000 140.000000 111.000000 77.000000 
+70.000000 99.000000 122.000000 122.000000 117.000000 122.000000 
+134.000000 139.000000 139.000000 140.000000 141.000000 137.000000 
+129.000000 122.000000 121.000000 124.000000 124.000000 121.000000 
+116.000000 112.000000 110.000000 110.000000 112.000000 116.000000 
+124.000000 131.000000 131.000000 126.000000 123.000000 125.000000 
+131.000000 132.000000 126.000000 113.000000 105.000000 110.000000 
+124.000000 132.000000 129.000000 126.000000 127.000000 132.000000 
+132.000000 131.000000 131.000000 133.000000 131.000000 124.000000 
+119.000000 119.000000 120.000000 120.000000 123.000000 127.000000 
+126.000000 122.000000 121.000000 124.000000 129.000000 129.000000 
+126.000000 124.000000 126.000000 128.000000 129.000000 129.000000 
+131.000000 134.000000 136.000000 131.000000 127.000000 133.000000 
+147.000000 149.000000 128.000000 100.000000 94.000000 108.000000 
+122.000000 122.000000 119.000000 125.000000 134.000000 134.000000 
+129.000000 132.000000 140.000000 141.000000 134.000000 128.000000 
+128.000000 128.000000 125.000000 119.000000 113.000000 107.000000 
+105.000000 111.000000 118.000000 122.000000 124.000000 132.000000 
+139.000000 137.000000 127.000000 123.000000 128.000000 130.000000 
+124.000000 116.000000 117.000000 124.000000 128.000000 128.000000 
+128.000000 127.000000 129.000000 133.000000 134.000000 132.000000 
+131.000000 132.000000 131.000000 125.000000 119.000000 116.000000 
+117.000000 120.000000 124.000000 127.000000 130.000000 130.000000 
+129.000000 126.000000 122.000000 118.000000 115.000000 114.000000 
+116.000000 119.000000 122.000000 123.000000 126.000000 131.000000 
+134.000000 130.000000 127.000000 133.000000 144.000000 143.000000 
+125.000000 104.000000 100.000000 113.000000 124.000000 123.000000 
+122.000000 129.000000 140.000000 142.000000 134.000000 128.000000 
+131.000000 136.000000 134.000000 128.000000 127.000000 132.000000 
+135.000000 131.000000 121.000000 110.000000 106.000000 112.000000 
+123.000000 131.000000 132.000000 130.000000 131.000000 133.000000 
+133.000000 131.000000 131.000000 130.000000 129.000000 128.000000 
+129.000000 130.000000 128.000000 125.000000 124.000000 124.000000 
+137.000000 136.000000 135.000000 133.000000 134.000000 137.000000 
+138.000000 133.000000 122.000000 113.000000 113.000000 120.000000 
+125.000000 124.000000 121.000000 123.000000 130.000000 133.000000 
+129.000000 124.000000 120.000000 118.000000 117.000000 119.000000 
+123.000000 127.000000 132.000000 135.000000 134.000000 129.000000 
+127.000000 129.000000 130.000000 121.000000 108.000000 103.000000 
+112.000000 122.000000 123.000000 117.000000 115.000000 123.000000 
+133.000000 138.000000 137.000000 133.000000 130.000000 127.000000 
+123.000000 119.000000 118.000000 122.000000 129.000000 132.000000 
+128.000000 120.000000 117.000000 119.000000 126.000000 132.000000 
+134.000000 132.000000 127.000000 124.000000 128.000000 134.000000 
+136.000000 133.000000 128.000000 125.000000 128.000000 132.000000 
+133.000000 129.000000 124.000000 122.000000 135.000000 128.000000 
+127.000000 133.000000 137.000000 135.000000 131.000000 131.000000 
+127.000000 117.000000 110.000000 115.000000 128.000000 132.000000 
+123.000000 115.000000 119.000000 129.000000 134.000000 130.000000 
+122.000000 118.000000 116.000000 119.000000 127.000000 136.000000 
+141.000000 137.000000 130.000000 128.000000 130.000000 132.000000 
+130.000000 126.000000 123.000000 122.000000 119.000000 119.000000 
+121.000000 123.000000 123.000000 124.000000 126.000000 131.000000 
+136.000000 137.000000 134.000000 127.000000 118.000000 114.000000 
+118.000000 125.000000 130.000000 131.000000 129.000000 127.000000 
+126.000000 126.000000 126.000000 127.000000 129.000000 132.000000 
+133.000000 132.000000 131.000000 135.000000 137.000000 134.000000 
+127.000000 123.000000 127.000000 131.000000 130.000000 124.000000 
+120.000000 121.000000 131.000000 127.000000 130.000000 137.000000 
+139.000000 133.000000 129.000000 129.000000 129.000000 123.000000 
+117.000000 118.000000 126.000000 129.000000 120.000000 111.000000 
+113.000000 124.000000 134.000000 135.000000 128.000000 122.000000 
+121.000000 123.000000 128.000000 135.000000 140.000000 140.000000 
+135.000000 132.000000 133.000000 134.000000 131.000000 126.000000 
+122.000000 119.000000 120.000000 122.000000 126.000000 128.000000 
+128.000000 128.000000 131.000000 135.000000 136.000000 134.000000 
+130.000000 123.000000 112.000000 106.000000 111.000000 123.000000 
+128.000000 125.000000 121.000000 125.000000 131.000000 129.000000 
+121.000000 116.000000 122.000000 134.000000 141.000000 139.000000 
+134.000000 129.000000 127.000000 126.000000 126.000000 127.000000 
+127.000000 123.000000 117.000000 115.000000 117.000000 123.000000 
+135.000000 139.000000 142.000000 139.000000 135.000000 132.000000 
+130.000000 127.000000 122.000000 121.000000 124.000000 127.000000 
+125.000000 119.000000 113.000000 112.000000 119.000000 129.000000 
+136.000000 137.000000 132.000000 128.000000 127.000000 130.000000 
+133.000000 136.000000 139.000000 142.000000 142.000000 139.000000 
+133.000000 127.000000 119.000000 109.000000 100.000000 98.000000 
+107.000000 120.000000 127.000000 124.000000 120.000000 119.000000 
+124.000000 129.000000 130.000000 128.000000 124.000000 119.000000 
+111.000000 104.000000 103.000000 107.000000 111.000000 112.000000 
+112.000000 116.000000 121.000000 123.000000 122.000000 121.000000 
+126.000000 131.000000 134.000000 135.000000 134.000000 131.000000 
+126.000000 122.000000 124.000000 128.000000 130.000000 127.000000 
+122.000000 118.000000 118.000000 122.000000 138.000000 138.000000 
+137.000000 137.000000 134.000000 127.000000 118.000000 116.000000 
+122.000000 129.000000 130.000000 124.000000 119.000000 117.000000 
+115.000000 117.000000 123.000000 129.000000 132.000000 131.000000 
+129.000000 129.000000 129.000000 129.000000 130.000000 136.000000 
+141.000000 142.000000 140.000000 135.000000 126.000000 116.000000 
+103.000000 88.000000 77.000000 74.000000 84.000000 103.000000 
+120.000000 123.000000 117.000000 114.000000 118.000000 126.000000 
+131.000000 131.000000 126.000000 119.000000 112.000000 106.000000 
+103.000000 103.000000 107.000000 111.000000 113.000000 113.000000 
+113.000000 117.000000 121.000000 123.000000 121.000000 121.000000 
+125.000000 131.000000 134.000000 132.000000 127.000000 125.000000 
+127.000000 130.000000 131.000000 129.000000 125.000000 122.000000 
+121.000000 124.000000 147.000000 143.000000 138.000000 136.000000 
+136.000000 132.000000 129.000000 129.000000 133.000000 132.000000 
+125.000000 117.000000 111.000000 109.000000 109.000000 114.000000 
+121.000000 123.000000 122.000000 122.000000 124.000000 124.000000 
+118.000000 114.000000 118.000000 130.000000 139.000000 141.000000 
+138.000000 134.000000 128.000000 118.000000 103.000000 83.000000 
+67.000000 62.000000 73.000000 96.000000 115.000000 117.000000 
+109.000000 106.000000 114.000000 127.000000 136.000000 134.000000 
+125.000000 116.000000 109.000000 107.000000 109.000000 112.000000 
+113.000000 114.000000 117.000000 123.000000 128.000000 127.000000 
+118.000000 108.000000 106.000000 114.000000 126.000000 132.000000 
+132.000000 128.000000 122.000000 118.000000 118.000000 123.000000 
+128.000000 130.000000 127.000000 123.000000 120.000000 120.000000 
+152.000000 151.000000 144.000000 137.000000 133.000000 134.000000 
+139.000000 141.000000 137.000000 131.000000 126.000000 123.000000 
+118.000000 111.000000 110.000000 115.000000 121.000000 122.000000 
+121.000000 123.000000 125.000000 123.000000 116.000000 113.000000 
+119.000000 127.000000 131.000000 134.000000 138.000000 142.000000 
+143.000000 137.000000 127.000000 112.000000 98.000000 92.000000 
+99.000000 112.000000 119.000000 116.000000 112.000000 116.000000 
+127.000000 135.000000 135.000000 129.000000 121.000000 113.000000 
+109.000000 112.000000 117.000000 122.000000 120.000000 115.000000 
+114.000000 120.000000 126.000000 126.000000 120.000000 116.000000 
+116.000000 121.000000 125.000000 131.000000 137.000000 140.000000 
+131.000000 115.000000 109.000000 117.000000 129.000000 130.000000 
+122.000000 116.000000 117.000000 118.000000 150.000000 148.000000 
+144.000000 138.000000 132.000000 128.000000 127.000000 128.000000 
+128.000000 129.000000 130.000000 131.000000 129.000000 122.000000 
+116.000000 113.000000 114.000000 117.000000 119.000000 120.000000 
+120.000000 122.000000 124.000000 125.000000 127.000000 130.000000 
+133.000000 134.000000 134.000000 137.000000 143.000000 148.000000 
+144.000000 132.000000 120.000000 117.000000 122.000000 129.000000 
+130.000000 124.000000 120.000000 124.000000 133.000000 138.000000 
+134.000000 124.000000 115.000000 112.000000 115.000000 120.000000 
+122.000000 120.000000 116.000000 114.000000 119.000000 126.000000 
+129.000000 129.000000 130.000000 132.000000 129.000000 118.000000 
+110.000000 113.000000 126.000000 135.000000 133.000000 122.000000 
+115.000000 118.000000 124.000000 125.000000 118.000000 113.000000 
+115.000000 118.000000 147.000000 147.000000 146.000000 146.000000 
+143.000000 138.000000 135.000000 134.000000 132.000000 128.000000 
+123.000000 121.000000 120.000000 119.000000 119.000000 117.000000 
+115.000000 116.000000 119.000000 121.000000 120.000000 119.000000 
+120.000000 126.000000 135.000000 141.000000 138.000000 128.000000 
+120.000000 126.000000 141.000000 150.000000 138.000000 110.000000 
+88.000000 88.000000 104.000000 123.000000 131.000000 127.000000 
+124.000000 127.000000 133.000000 134.000000 127.000000 118.000000 
+112.000000 112.000000 117.000000 122.000000 123.000000 119.000000 
+114.000000 114.000000 123.000000 133.000000 135.000000 129.000000 
+124.000000 122.000000 117.000000 112.000000 111.000000 117.000000 
+128.000000 135.000000 133.000000 128.000000 123.000000 121.000000 
+121.000000 123.000000 123.000000 125.000000 127.000000 129.000000 
+143.000000 143.000000 143.000000 145.000000 141.000000 130.000000 
+122.000000 123.000000 132.000000 137.000000 133.000000 126.000000 
+122.000000 124.000000 124.000000 120.000000 116.000000 117.000000 
+122.000000 128.000000 131.000000 131.000000 133.000000 136.000000 
+139.000000 140.000000 135.000000 128.000000 123.000000 127.000000 
+141.000000 149.000000 137.000000 104.000000 73.000000 69.000000 
+92.000000 121.000000 134.000000 129.000000 125.000000 129.000000 
+134.000000 130.000000 119.000000 111.000000 109.000000 111.000000 
+115.000000 119.000000 122.000000 119.000000 115.000000 115.000000 
+124.000000 133.000000 134.000000 125.000000 116.000000 114.000000 
+117.000000 120.000000 123.000000 128.000000 133.000000 134.000000 
+129.000000 125.000000 125.000000 127.000000 126.000000 123.000000 
+123.000000 128.000000 134.000000 133.000000 142.000000 138.000000 
+135.000000 136.000000 136.000000 133.000000 130.000000 130.000000 
+134.000000 136.000000 133.000000 131.000000 128.000000 123.000000 
+118.000000 115.000000 114.000000 114.000000 115.000000 119.000000 
+126.000000 133.000000 136.000000 136.000000 136.000000 138.000000 
+137.000000 130.000000 123.000000 126.000000 139.000000 151.000000 
+140.000000 107.000000 77.000000 75.000000 102.000000 128.000000 
+132.000000 122.000000 117.000000 125.000000 131.000000 126.000000 
+116.000000 111.000000 112.000000 114.000000 116.000000 119.000000 
+119.000000 116.000000 112.000000 115.000000 125.000000 133.000000 
+133.000000 125.000000 117.000000 116.000000 121.000000 127.000000 
+131.000000 132.000000 131.000000 126.000000 122.000000 123.000000 
+127.000000 131.000000 128.000000 124.000000 125.000000 131.000000 
+134.000000 128.000000 138.000000 134.000000 135.000000 139.000000 
+140.000000 136.000000 130.000000 128.000000 129.000000 132.000000 
+133.000000 132.000000 126.000000 118.000000 114.000000 115.000000 
+119.000000 121.000000 123.000000 127.000000 133.000000 139.000000 
+141.000000 139.000000 137.000000 140.000000 142.000000 140.000000 
+135.000000 135.000000 144.000000 150.000000 136.000000 104.000000 
+78.000000 80.000000 106.000000 127.000000 129.000000 121.000000 
+121.000000 128.000000 131.000000 124.000000 116.000000 116.000000 
+119.000000 117.000000 110.000000 109.000000 113.000000 116.000000 
+115.000000 114.000000 118.000000 124.000000 126.000000 122.000000 
+118.000000 118.000000 120.000000 122.000000 126.000000 131.000000 
+133.000000 129.000000 125.000000 125.000000 130.000000 131.000000 
+127.000000 124.000000 124.000000 126.000000 128.000000 129.000000 
+132.000000 135.000000 141.000000 144.000000 140.000000 137.000000 
+136.000000 134.000000 131.000000 131.000000 137.000000 143.000000 
+139.000000 128.000000 119.000000 118.000000 120.000000 122.000000 
+123.000000 123.000000 127.000000 132.000000 138.000000 139.000000 
+135.000000 134.000000 136.000000 138.000000 137.000000 136.000000 
+143.000000 146.000000 130.000000 98.000000 76.000000 84.000000 
+112.000000 130.000000 130.000000 125.000000 127.000000 132.000000 
+130.000000 122.000000 118.000000 119.000000 117.000000 110.000000 
+104.000000 105.000000 108.000000 110.000000 109.000000 111.000000 
+118.000000 125.000000 125.000000 120.000000 119.000000 123.000000 
+124.000000 121.000000 121.000000 126.000000 128.000000 122.000000 
+116.000000 120.000000 131.000000 136.000000 131.000000 126.000000 
+127.000000 131.000000 135.000000 136.000000 132.000000 135.000000 
+138.000000 137.000000 134.000000 136.000000 139.000000 140.000000 
+136.000000 134.000000 136.000000 139.000000 136.000000 131.000000 
+127.000000 123.000000 120.000000 118.000000 117.000000 119.000000 
+121.000000 125.000000 131.000000 136.000000 136.000000 135.000000 
+133.000000 133.000000 133.000000 137.000000 145.000000 144.000000 
+122.000000 90.000000 72.000000 84.000000 114.000000 133.000000 
+132.000000 126.000000 128.000000 132.000000 130.000000 123.000000 
+120.000000 122.000000 122.000000 116.000000 109.000000 107.000000 
+108.000000 109.000000 110.000000 114.000000 120.000000 125.000000 
+124.000000 121.000000 118.000000 119.000000 121.000000 122.000000 
+125.000000 129.000000 132.000000 130.000000 126.000000 124.000000 
+129.000000 133.000000 134.000000 134.000000 133.000000 130.000000 
+125.000000 123.000000 132.000000 129.000000 126.000000 128.000000 
+135.000000 140.000000 139.000000 135.000000 135.000000 139.000000 
+141.000000 138.000000 132.000000 126.000000 121.000000 119.000000 
+123.000000 129.000000 129.000000 123.000000 121.000000 127.000000 
+132.000000 130.000000 124.000000 124.000000 131.000000 135.000000 
+132.000000 132.000000 138.000000 138.000000 118.000000 88.000000 
+72.000000 85.000000 115.000000 135.000000 136.000000 127.000000 
+125.000000 127.000000 127.000000 122.000000 118.000000 120.000000 
+123.000000 124.000000 121.000000 118.000000 116.000000 116.000000 
+117.000000 120.000000 123.000000 125.000000 127.000000 129.000000 
+128.000000 123.000000 118.000000 119.000000 126.000000 137.000000 
+144.000000 145.000000 141.000000 133.000000 126.000000 122.000000 
+123.000000 127.000000 131.000000 132.000000 129.000000 127.000000 
+132.000000 124.000000 121.000000 125.000000 133.000000 139.000000 
+141.000000 141.000000 140.000000 140.000000 137.000000 134.000000 
+130.000000 126.000000 121.000000 119.000000 123.000000 128.000000 
+128.000000 123.000000 121.000000 125.000000 131.000000 129.000000 
+123.000000 122.000000 127.000000 130.000000 130.000000 131.000000 
+137.000000 136.000000 117.000000 89.000000 73.000000 84.000000 
+111.000000 131.000000 133.000000 127.000000 124.000000 124.000000 
+121.000000 117.000000 117.000000 121.000000 124.000000 124.000000 
+122.000000 120.000000 119.000000 118.000000 119.000000 124.000000 
+129.000000 129.000000 127.000000 124.000000 123.000000 125.000000 
+125.000000 122.000000 119.000000 122.000000 130.000000 138.000000 
+137.000000 130.000000 125.000000 127.000000 130.000000 130.000000 
+128.000000 128.000000 127.000000 123.000000 131.000000 127.000000 
+122.000000 122.000000 128.000000 137.000000 143.000000 144.000000 
+142.000000 138.000000 136.000000 135.000000 134.000000 131.000000 
+125.000000 121.000000 122.000000 126.000000 128.000000 127.000000 
+128.000000 131.000000 135.000000 136.000000 134.000000 131.000000 
+129.000000 129.000000 130.000000 132.000000 135.000000 131.000000 
+114.000000 90.000000 77.000000 88.000000 112.000000 129.000000 
+128.000000 121.000000 121.000000 125.000000 124.000000 119.000000 
+118.000000 123.000000 127.000000 127.000000 126.000000 129.000000 
+129.000000 125.000000 121.000000 120.000000 120.000000 118.000000 
+117.000000 120.000000 127.000000 132.000000 133.000000 127.000000 
+122.000000 121.000000 127.000000 130.000000 128.000000 122.000000 
+122.000000 126.000000 128.000000 128.000000 128.000000 130.000000 
+130.000000 124.000000 129.000000 129.000000 127.000000 128.000000 
+132.000000 137.000000 142.000000 144.000000 142.000000 137.000000 
+131.000000 129.000000 132.000000 134.000000 132.000000 129.000000 
+130.000000 135.000000 140.000000 138.000000 132.000000 127.000000 
+126.000000 126.000000 127.000000 128.000000 128.000000 130.000000 
+134.000000 142.000000 145.000000 135.000000 110.000000 85.000000 
+78.000000 94.000000 120.000000 131.000000 126.000000 118.000000 
+120.000000 125.000000 126.000000 121.000000 119.000000 121.000000 
+123.000000 123.000000 123.000000 124.000000 124.000000 122.000000 
+121.000000 121.000000 120.000000 117.000000 116.000000 121.000000 
+129.000000 134.000000 132.000000 126.000000 122.000000 121.000000 
+123.000000 124.000000 123.000000 122.000000 125.000000 130.000000 
+131.000000 131.000000 130.000000 127.000000 121.000000 115.000000 
+127.000000 130.000000 135.000000 137.000000 135.000000 131.000000 
+129.000000 127.000000 127.000000 128.000000 130.000000 132.000000 
+132.000000 134.000000 135.000000 137.000000 137.000000 136.000000 
+133.000000 131.000000 130.000000 130.000000 128.000000 125.000000 
+123.000000 124.000000 128.000000 130.000000 131.000000 133.000000 
+134.000000 126.000000 105.000000 85.000000 84.000000 103.000000 
+123.000000 132.000000 130.000000 129.000000 128.000000 123.000000 
+115.000000 115.000000 123.000000 132.000000 132.000000 128.000000 
+126.000000 125.000000 122.000000 121.000000 125.000000 130.000000 
+128.000000 122.000000 118.000000 121.000000 127.000000 129.000000 
+130.000000 128.000000 123.000000 119.000000 119.000000 123.000000 
+124.000000 121.000000 120.000000 125.000000 131.000000 134.000000 
+132.000000 129.000000 127.000000 125.000000 123.000000 121.000000 
+124.000000 133.000000 139.000000 135.000000 123.000000 115.000000 
+118.000000 130.000000 140.000000 142.000000 137.000000 135.000000 
+138.000000 142.000000 144.000000 140.000000 134.000000 129.000000 
+126.000000 125.000000 124.000000 125.000000 129.000000 132.000000 
+131.000000 126.000000 122.000000 127.000000 134.000000 129.000000 
+111.000000 92.000000 91.000000 107.000000 127.000000 137.000000 
+137.000000 134.000000 132.000000 130.000000 128.000000 131.000000 
+137.000000 141.000000 138.000000 131.000000 126.000000 123.000000 
+122.000000 122.000000 125.000000 129.000000 129.000000 123.000000 
+119.000000 118.000000 123.000000 128.000000 131.000000 131.000000 
+127.000000 124.000000 127.000000 131.000000 132.000000 125.000000 
+119.000000 120.000000 126.000000 132.000000 133.000000 132.000000 
+131.000000 129.000000 128.000000 131.000000 135.000000 137.000000 
+136.000000 132.000000 128.000000 129.000000 130.000000 131.000000 
+133.000000 136.000000 139.000000 141.000000 139.000000 138.000000 
+141.000000 143.000000 139.000000 132.000000 129.000000 129.000000 
+125.000000 120.000000 122.000000 130.000000 136.000000 132.000000 
+126.000000 127.000000 132.000000 129.000000 113.000000 100.000000 
+100.000000 113.000000 128.000000 137.000000 138.000000 132.000000 
+126.000000 125.000000 128.000000 131.000000 132.000000 130.000000 
+129.000000 130.000000 130.000000 126.000000 122.000000 121.000000 
+123.000000 125.000000 128.000000 128.000000 127.000000 124.000000 
+124.000000 126.000000 126.000000 124.000000 123.000000 125.000000 
+127.000000 127.000000 124.000000 123.000000 124.000000 127.000000 
+131.000000 133.000000 132.000000 129.000000 127.000000 128.000000 
+135.000000 140.000000 146.000000 146.000000 139.000000 129.000000 
+123.000000 121.000000 123.000000 127.000000 132.000000 135.000000 
+137.000000 137.000000 136.000000 138.000000 142.000000 143.000000 
+140.000000 133.000000 128.000000 125.000000 123.000000 124.000000 
+127.000000 133.000000 138.000000 138.000000 133.000000 129.000000 
+128.000000 126.000000 119.000000 110.000000 108.000000 116.000000 
+130.000000 138.000000 135.000000 128.000000 125.000000 127.000000 
+131.000000 133.000000 133.000000 134.000000 133.000000 128.000000 
+122.000000 118.000000 121.000000 127.000000 130.000000 128.000000 
+125.000000 123.000000 123.000000 126.000000 130.000000 133.000000 
+132.000000 128.000000 125.000000 125.000000 125.000000 125.000000 
+122.000000 120.000000 121.000000 126.000000 133.000000 136.000000 
+131.000000 124.000000 120.000000 123.000000 135.000000 134.000000 
+133.000000 133.000000 132.000000 126.000000 120.000000 122.000000 
+130.000000 136.000000 134.000000 128.000000 127.000000 131.000000 
+137.000000 139.000000 138.000000 137.000000 135.000000 130.000000 
+122.000000 117.000000 118.000000 123.000000 129.000000 133.000000 
+133.000000 132.000000 130.000000 130.000000 130.000000 127.000000 
+121.000000 117.000000 118.000000 127.000000 136.000000 142.000000 
+141.000000 136.000000 132.000000 129.000000 130.000000 132.000000 
+134.000000 133.000000 129.000000 124.000000 121.000000 123.000000 
+129.000000 134.000000 134.000000 128.000000 122.000000 122.000000 
+127.000000 131.000000 131.000000 129.000000 127.000000 128.000000 
+127.000000 126.000000 126.000000 127.000000 127.000000 126.000000 
+127.000000 131.000000 136.000000 137.000000 132.000000 127.000000 
+125.000000 125.000000 135.000000 134.000000 133.000000 133.000000 
+133.000000 130.000000 128.000000 132.000000 137.000000 141.000000 
+140.000000 136.000000 135.000000 135.000000 137.000000 138.000000 
+139.000000 136.000000 132.000000 129.000000 128.000000 129.000000 
+128.000000 127.000000 128.000000 130.000000 132.000000 132.000000 
+131.000000 132.000000 131.000000 128.000000 123.000000 120.000000 
+123.000000 129.000000 133.000000 135.000000 134.000000 132.000000 
+129.000000 127.000000 128.000000 133.000000 135.000000 132.000000 
+126.000000 123.000000 125.000000 129.000000 131.000000 128.000000 
+122.000000 119.000000 120.000000 126.000000 129.000000 128.000000 
+125.000000 125.000000 129.000000 133.000000 135.000000 132.000000 
+127.000000 122.000000 120.000000 122.000000 127.000000 134.000000 
+138.000000 137.000000 131.000000 124.000000 121.000000 123.000000 
+136.000000 135.000000 135.000000 134.000000 132.000000 129.000000 
+127.000000 126.000000 127.000000 129.000000 131.000000 131.000000 
+130.000000 131.000000 135.000000 139.000000 142.000000 142.000000 
+139.000000 133.000000 129.000000 130.000000 132.000000 130.000000 
+126.000000 126.000000 131.000000 136.000000 135.000000 129.000000 
+126.000000 126.000000 126.000000 127.000000 129.000000 132.000000 
+134.000000 135.000000 134.000000 132.000000 130.000000 126.000000 
+123.000000 122.000000 123.000000 125.000000 127.000000 128.000000 
+128.000000 128.000000 126.000000 125.000000 122.000000 118.000000 
+114.000000 116.000000 121.000000 127.000000 128.000000 128.000000 
+128.000000 130.000000 131.000000 129.000000 126.000000 125.000000 
+125.000000 125.000000 125.000000 128.000000 135.000000 141.000000 
+139.000000 131.000000 126.000000 126.000000 127.000000 134.000000 
+141.000000 141.000000 136.000000 131.000000 130.000000 130.000000 
+130.000000 130.000000 128.000000 127.000000 125.000000 127.000000 
+133.000000 139.000000 141.000000 137.000000 132.000000 128.000000 
+128.000000 129.000000 129.000000 129.000000 129.000000 131.000000 
+134.000000 136.000000 136.000000 132.000000 125.000000 121.000000 
+121.000000 126.000000 131.000000 134.000000 136.000000 138.000000 
+138.000000 138.000000 137.000000 136.000000 132.000000 127.000000 
+123.000000 124.000000 128.000000 132.000000 133.000000 132.000000 
+130.000000 128.000000 125.000000 122.000000 124.000000 126.000000 
+127.000000 126.000000 127.000000 131.000000 134.000000 131.000000 
+125.000000 122.000000 124.000000 127.000000 126.000000 124.000000 
+127.000000 135.000000 138.000000 134.000000 128.000000 127.000000 
+130.000000 131.000000 132.000000 135.000000 141.000000 145.000000 
+142.000000 134.000000 128.000000 126.000000 127.000000 128.000000 
+128.000000 129.000000 131.000000 133.000000 133.000000 134.000000 
+136.000000 138.000000 139.000000 136.000000 131.000000 126.000000 
+126.000000 129.000000 132.000000 133.000000 134.000000 136.000000 
+135.000000 128.000000 122.000000 122.000000 126.000000 129.000000 
+127.000000 126.000000 130.000000 135.000000 136.000000 135.000000 
+136.000000 136.000000 131.000000 123.000000 117.000000 120.000000 
+128.000000 136.000000 138.000000 134.000000 129.000000 125.000000 
+125.000000 126.000000 126.000000 127.000000 129.000000 131.000000 
+130.000000 131.000000 135.000000 136.000000 132.000000 127.000000 
+126.000000 128.000000 129.000000 128.000000 128.000000 130.000000 
+132.000000 130.000000 128.000000 125.000000 124.000000 126.000000 
+137.000000 136.000000 137.000000 138.000000 138.000000 136.000000 
+132.000000 130.000000 132.000000 135.000000 136.000000 135.000000 
+133.000000 133.000000 135.000000 137.000000 137.000000 137.000000 
+137.000000 139.000000 139.000000 138.000000 136.000000 135.000000 
+134.000000 134.000000 134.000000 133.000000 130.000000 127.000000 
+126.000000 127.000000 127.000000 126.000000 126.000000 130.000000 
+135.000000 135.000000 133.000000 133.000000 138.000000 140.000000 
+137.000000 133.000000 132.000000 135.000000 137.000000 137.000000 
+136.000000 134.000000 133.000000 132.000000 131.000000 127.000000 
+122.000000 122.000000 125.000000 130.000000 132.000000 132.000000 
+131.000000 131.000000 128.000000 125.000000 125.000000 129.000000 
+134.000000 136.000000 132.000000 126.000000 123.000000 125.000000 
+129.000000 129.000000 125.000000 124.000000 136.000000 135.000000 
+136.000000 137.000000 137.000000 138.000000 136.000000 130.000000 
+124.000000 124.000000 131.000000 138.000000 136.000000 130.000000 
+129.000000 133.000000 136.000000 136.000000 134.000000 131.000000 
+131.000000 132.000000 133.000000 133.000000 133.000000 132.000000 
+131.000000 130.000000 128.000000 128.000000 129.000000 129.000000 
+126.000000 123.000000 126.000000 135.000000 143.000000 143.000000 
+138.000000 132.000000 129.000000 128.000000 126.000000 125.000000 
+126.000000 130.000000 135.000000 136.000000 133.000000 128.000000 
+126.000000 128.000000 129.000000 131.000000 132.000000 133.000000 
+129.000000 125.000000 124.000000 128.000000 129.000000 127.000000 
+127.000000 131.000000 133.000000 132.000000 130.000000 130.000000 
+129.000000 127.000000 127.000000 131.000000 136.000000 137.000000 
+132.000000 126.000000 130.000000 132.000000 132.000000 131.000000 
+132.000000 133.000000 135.000000 134.000000 134.000000 134.000000 
+134.000000 133.000000 135.000000 138.000000 140.000000 139.000000 
+137.000000 137.000000 138.000000 137.000000 132.000000 128.000000 
+126.000000 126.000000 126.000000 127.000000 127.000000 127.000000 
+126.000000 127.000000 131.000000 134.000000 133.000000 131.000000 
+132.000000 135.000000 136.000000 133.000000 130.000000 130.000000 
+131.000000 130.000000 128.000000 129.000000 133.000000 136.000000 
+136.000000 134.000000 134.000000 134.000000 132.000000 127.000000 
+125.000000 128.000000 133.000000 133.000000 131.000000 129.000000 
+129.000000 129.000000 129.000000 128.000000 128.000000 129.000000 
+130.000000 131.000000 130.000000 128.000000 129.000000 132.000000 
+135.000000 132.000000 127.000000 126.000000 130.000000 132.000000 
+129.000000 129.000000 130.000000 131.000000 135.000000 140.000000 
+143.000000 141.000000 135.000000 129.000000 127.000000 129.000000 
+132.000000 131.000000 128.000000 127.000000 131.000000 138.000000 
+141.000000 138.000000 135.000000 136.000000 137.000000 133.000000 
+129.000000 130.000000 133.000000 135.000000 134.000000 131.000000 
+129.000000 127.000000 127.000000 128.000000 130.000000 128.000000 
+126.000000 125.000000 128.000000 131.000000 131.000000 129.000000 
+125.000000 123.000000 124.000000 130.000000 138.000000 142.000000 
+138.000000 130.000000 125.000000 125.000000 129.000000 132.000000 
+133.000000 131.000000 128.000000 126.000000 127.000000 129.000000 
+129.000000 128.000000 127.000000 129.000000 132.000000 134.000000 
+132.000000 129.000000 126.000000 125.000000 123.000000 122.000000 
+123.000000 127.000000 130.000000 129.000000 127.000000 134.000000 
+138.000000 138.000000 135.000000 133.000000 132.000000 132.000000 
+134.000000 138.000000 138.000000 133.000000 130.000000 132.000000 
+135.000000 134.000000 132.000000 134.000000 137.000000 137.000000 
+133.000000 131.000000 133.000000 133.000000 130.000000 129.000000 
+132.000000 134.000000 132.000000 128.000000 128.000000 133.000000 
+138.000000 140.000000 137.000000 133.000000 131.000000 132.000000 
+132.000000 130.000000 125.000000 125.000000 131.000000 137.000000 
+138.000000 135.000000 135.000000 139.000000 141.000000 136.000000 
+128.000000 124.000000 126.000000 133.000000 138.000000 140.000000 
+136.000000 132.000000 130.000000 131.000000 132.000000 132.000000 
+132.000000 133.000000 135.000000 135.000000 132.000000 129.000000 
+126.000000 125.000000 126.000000 128.000000 130.000000 130.000000 
+129.000000 129.000000 124.000000 127.000000 134.000000 140.000000 
+139.000000 135.000000 132.000000 131.000000 132.000000 133.000000 
+131.000000 130.000000 132.000000 135.000000 136.000000 133.000000 
+131.000000 135.000000 141.000000 141.000000 134.000000 127.000000 
+125.000000 126.000000 128.000000 129.000000 132.000000 133.000000 
+132.000000 129.000000 129.000000 133.000000 136.000000 136.000000 
+133.000000 132.000000 131.000000 130.000000 131.000000 134.000000 
+137.000000 136.000000 132.000000 129.000000 130.000000 136.000000 
+139.000000 139.000000 136.000000 131.000000 127.000000 126.000000 
+127.000000 131.000000 132.000000 131.000000 129.000000 130.000000 
+134.000000 137.000000 137.000000 134.000000 131.000000 130.000000 
+129.000000 128.000000 130.000000 133.000000 133.000000 129.000000 
+125.000000 126.000000 130.000000 132.000000 129.000000 125.000000 
+126.000000 129.000000 134.000000 138.000000 137.000000 133.000000 
+132.000000 136.000000 138.000000 136.000000 134.000000 134.000000 
+138.000000 138.000000 135.000000 133.000000 133.000000 135.000000 
+137.000000 138.000000 136.000000 131.000000 126.000000 125.000000 
+127.000000 129.000000 128.000000 126.000000 129.000000 135.000000 
+139.000000 136.000000 132.000000 130.000000 131.000000 133.000000 
+134.000000 133.000000 132.000000 132.000000 131.000000 131.000000 
+132.000000 134.000000 136.000000 135.000000 134.000000 134.000000 
+134.000000 132.000000 128.000000 125.000000 126.000000 131.000000 
+134.000000 134.000000 132.000000 131.000000 131.000000 133.000000 
+134.000000 134.000000 132.000000 131.000000 133.000000 137.000000 
+137.000000 134.000000 131.000000 130.000000 129.000000 126.000000 
+123.000000 123.000000 126.000000 128.000000 117.000000 118.000000 
+116.000000 115.000000 117.000000 121.000000 122.000000 123.000000 
+123.000000 123.000000 121.000000 121.000000 123.000000 127.000000 
+130.000000 132.000000 136.000000 142.000000 146.000000 145.000000 
+138.000000 134.000000 134.000000 137.000000 137.000000 133.000000 
+129.000000 130.000000 136.000000 141.000000 142.000000 138.000000 
+134.000000 129.000000 126.000000 123.000000 118.000000 115.000000 
+116.000000 121.000000 125.000000 126.000000 125.000000 127.000000 
+131.000000 134.000000 137.000000 142.000000 145.000000 141.000000 
+131.000000 123.000000 121.000000 124.000000 125.000000 126.000000 
+129.000000 134.000000 134.000000 127.000000 119.000000 117.000000 
+118.000000 117.000000 115.000000 117.000000 124.000000 129.000000 
+126.000000 123.000000 128.000000 137.000000 138.000000 130.000000 
+119.000000 113.000000 105.000000 107.000000 112.000000 114.000000 
+109.000000 101.000000 99.000000 105.000000 116.000000 125.000000 
+127.000000 128.000000 130.000000 131.000000 129.000000 128.000000 
+131.000000 139.000000 144.000000 143.000000 139.000000 136.000000 
+135.000000 134.000000 135.000000 134.000000 135.000000 136.000000 
+139.000000 142.000000 144.000000 142.000000 139.000000 135.000000 
+133.000000 130.000000 125.000000 119.000000 117.000000 123.000000 
+129.000000 130.000000 126.000000 126.000000 131.000000 137.000000 
+140.000000 141.000000 142.000000 139.000000 135.000000 132.000000 
+132.000000 132.000000 127.000000 122.000000 121.000000 126.000000 
+132.000000 130.000000 120.000000 112.000000 113.000000 118.000000 
+119.000000 117.000000 119.000000 123.000000 125.000000 127.000000 
+136.000000 147.000000 146.000000 131.000000 114.000000 108.000000 
+106.000000 105.000000 107.000000 110.000000 111.000000 110.000000 
+109.000000 114.000000 121.000000 125.000000 127.000000 130.000000 
+134.000000 134.000000 133.000000 134.000000 140.000000 145.000000 
+145.000000 142.000000 138.000000 132.000000 125.000000 123.000000 
+127.000000 134.000000 139.000000 140.000000 142.000000 143.000000 
+144.000000 143.000000 139.000000 138.000000 138.000000 137.000000 
+130.000000 119.000000 111.000000 114.000000 123.000000 128.000000 
+128.000000 129.000000 136.000000 145.000000 150.000000 149.000000 
+145.000000 141.000000 137.000000 134.000000 131.000000 126.000000 
+121.000000 121.000000 128.000000 132.000000 131.000000 125.000000 
+122.000000 122.000000 122.000000 122.000000 122.000000 122.000000 
+125.000000 129.000000 131.000000 129.000000 128.000000 131.000000 
+133.000000 124.000000 113.000000 110.000000 114.000000 114.000000 
+116.000000 117.000000 116.000000 115.000000 117.000000 119.000000 
+121.000000 124.000000 128.000000 130.000000 129.000000 127.000000 
+130.000000 137.000000 145.000000 149.000000 148.000000 146.000000 
+140.000000 132.000000 124.000000 120.000000 123.000000 131.000000 
+139.000000 144.000000 146.000000 145.000000 141.000000 134.000000 
+125.000000 121.000000 125.000000 135.000000 137.000000 126.000000 
+109.000000 104.000000 111.000000 122.000000 127.000000 126.000000 
+128.000000 138.000000 147.000000 148.000000 143.000000 138.000000 
+137.000000 137.000000 136.000000 133.000000 128.000000 122.000000 
+121.000000 126.000000 129.000000 128.000000 125.000000 125.000000 
+125.000000 122.000000 118.000000 117.000000 120.000000 127.000000 
+135.000000 136.000000 129.000000 119.000000 113.000000 115.000000 
+120.000000 122.000000 128.000000 126.000000 126.000000 124.000000 
+120.000000 119.000000 120.000000 121.000000 122.000000 124.000000 
+126.000000 125.000000 125.000000 126.000000 128.000000 130.000000 
+134.000000 136.000000 135.000000 134.000000 132.000000 129.000000 
+123.000000 119.000000 123.000000 132.000000 143.000000 149.000000 
+149.000000 146.000000 142.000000 140.000000 137.000000 132.000000 
+132.000000 136.000000 137.000000 131.000000 125.000000 128.000000 
+135.000000 134.000000 126.000000 121.000000 124.000000 135.000000 
+144.000000 145.000000 142.000000 137.000000 135.000000 137.000000 
+138.000000 135.000000 128.000000 120.000000 114.000000 116.000000 
+124.000000 128.000000 125.000000 122.000000 125.000000 129.000000 
+125.000000 119.000000 119.000000 126.000000 130.000000 131.000000 
+128.000000 123.000000 117.000000 117.000000 126.000000 134.000000 
+138.000000 132.000000 125.000000 119.000000 115.000000 113.000000 
+118.000000 124.000000 127.000000 124.000000 124.000000 127.000000 
+130.000000 125.000000 120.000000 120.000000 124.000000 127.000000 
+130.000000 134.000000 132.000000 123.000000 114.000000 114.000000 
+123.000000 131.000000 137.000000 142.000000 144.000000 140.000000 
+136.000000 136.000000 141.000000 144.000000 141.000000 135.000000 
+134.000000 141.000000 164.000000 197.000000 205.000000 174.000000 
+138.000000 124.000000 130.000000 140.000000 141.000000 137.000000 
+136.000000 137.000000 136.000000 133.000000 132.000000 130.000000 
+125.000000 122.000000 119.000000 117.000000 119.000000 125.000000 
+129.000000 128.000000 125.000000 124.000000 127.000000 130.000000 
+132.000000 128.000000 120.000000 115.000000 118.000000 124.000000 
+123.000000 115.000000 112.000000 122.000000 142.000000 137.000000 
+128.000000 121.000000 115.000000 114.000000 120.000000 129.000000 
+133.000000 129.000000 123.000000 121.000000 125.000000 130.000000 
+131.000000 129.000000 127.000000 129.000000 133.000000 133.000000 
+126.000000 119.000000 117.000000 119.000000 123.000000 129.000000 
+136.000000 139.000000 139.000000 137.000000 136.000000 130.000000 
+123.000000 123.000000 125.000000 125.000000 119.000000 117.000000 
+137.000000 170.000000 175.000000 152.000000 131.000000 127.000000 
+134.000000 138.000000 136.000000 133.000000 134.000000 132.000000 
+127.000000 124.000000 125.000000 126.000000 122.000000 117.000000 
+116.000000 120.000000 124.000000 128.000000 129.000000 126.000000 
+122.000000 122.000000 126.000000 126.000000 121.000000 117.000000 
+116.000000 116.000000 117.000000 119.000000 122.000000 119.000000 
+112.000000 115.000000 133.000000 137.000000 137.000000 132.000000 
+124.000000 116.000000 115.000000 120.000000 126.000000 126.000000 
+122.000000 121.000000 129.000000 139.000000 138.000000 131.000000 
+125.000000 125.000000 124.000000 122.000000 125.000000 131.000000 
+131.000000 126.000000 124.000000 132.000000 140.000000 140.000000 
+137.000000 141.000000 147.000000 138.000000 118.000000 107.000000 
+123.000000 145.000000 140.000000 111.000000 82.000000 77.000000 
+95.000000 119.000000 132.000000 135.000000 136.000000 135.000000 
+134.000000 137.000000 143.000000 145.000000 140.000000 133.000000 
+128.000000 124.000000 118.000000 113.000000 116.000000 125.000000 
+133.000000 135.000000 132.000000 127.000000 122.000000 120.000000 
+118.000000 116.000000 114.000000 115.000000 119.000000 121.000000 
+119.000000 119.000000 122.000000 127.000000 126.000000 121.000000 
+129.000000 134.000000 139.000000 138.000000 130.000000 123.000000 
+121.000000 125.000000 128.000000 126.000000 124.000000 123.000000 
+123.000000 122.000000 121.000000 123.000000 125.000000 127.000000 
+129.000000 132.000000 137.000000 139.000000 139.000000 135.000000 
+128.000000 127.000000 134.000000 142.000000 143.000000 140.000000 
+142.000000 145.000000 136.000000 118.000000 119.000000 166.000000 
+210.000000 198.000000 137.000000 90.000000 92.000000 119.000000 
+134.000000 133.000000 131.000000 137.000000 144.000000 144.000000 
+142.000000 137.000000 126.000000 115.000000 110.000000 111.000000 
+114.000000 117.000000 122.000000 128.000000 132.000000 133.000000 
+131.000000 127.000000 121.000000 114.000000 111.000000 114.000000 
+118.000000 118.000000 114.000000 111.000000 114.000000 119.000000 
+122.000000 120.000000 115.000000 111.000000 128.000000 127.000000 
+128.000000 129.000000 129.000000 129.000000 128.000000 126.000000 
+124.000000 127.000000 130.000000 125.000000 113.000000 108.000000 
+115.000000 126.000000 130.000000 133.000000 138.000000 143.000000 
+141.000000 136.000000 136.000000 136.000000 130.000000 126.000000 
+131.000000 141.000000 144.000000 137.000000 127.000000 123.000000 
+124.000000 131.000000 146.000000 183.000000 215.000000 186.000000 
+124.000000 107.000000 119.000000 130.000000 128.000000 119.000000 
+123.000000 141.000000 153.000000 150.000000 140.000000 131.000000 
+121.000000 112.000000 106.000000 108.000000 115.000000 122.000000 
+128.000000 133.000000 133.000000 129.000000 124.000000 123.000000 
+123.000000 120.000000 116.000000 115.000000 116.000000 115.000000 
+108.000000 102.000000 106.000000 117.000000 121.000000 115.000000 
+107.000000 109.000000 125.000000 122.000000 123.000000 126.000000 
+131.000000 136.000000 134.000000 127.000000 120.000000 122.000000 
+127.000000 127.000000 121.000000 117.000000 117.000000 120.000000 
+124.000000 128.000000 134.000000 138.000000 139.000000 140.000000 
+138.000000 136.000000 134.000000 132.000000 129.000000 128.000000 
+133.000000 137.000000 127.000000 111.000000 112.000000 133.000000 
+154.000000 152.000000 129.000000 98.000000 90.000000 114.000000 
+134.000000 133.000000 122.000000 118.000000 127.000000 141.000000 
+148.000000 144.000000 135.000000 127.000000 124.000000 121.000000 
+118.000000 116.000000 116.000000 121.000000 127.000000 130.000000 
+130.000000 128.000000 125.000000 121.000000 118.000000 119.000000 
+123.000000 124.000000 122.000000 118.000000 112.000000 106.000000 
+103.000000 105.000000 108.000000 111.000000 118.000000 129.000000 
+133.000000 130.000000 127.000000 128.000000 133.000000 138.000000 
+136.000000 131.000000 127.000000 124.000000 120.000000 117.000000 
+118.000000 122.000000 123.000000 122.000000 124.000000 126.000000 
+129.000000 134.000000 139.000000 142.000000 141.000000 139.000000 
+139.000000 133.000000 124.000000 121.000000 130.000000 139.000000 
+136.000000 129.000000 130.000000 134.000000 122.000000 97.000000 
+78.000000 89.000000 120.000000 136.000000 133.000000 126.000000 
+123.000000 125.000000 130.000000 137.000000 140.000000 136.000000 
+129.000000 123.000000 121.000000 120.000000 119.000000 118.000000 
+119.000000 121.000000 124.000000 126.000000 126.000000 125.000000 
+123.000000 119.000000 116.000000 122.000000 132.000000 134.000000 
+127.000000 120.000000 119.000000 114.000000 106.000000 102.000000 
+108.000000 119.000000 129.000000 136.000000 138.000000 137.000000 
+131.000000 127.000000 129.000000 131.000000 128.000000 126.000000 
+129.000000 130.000000 124.000000 118.000000 119.000000 125.000000 
+129.000000 129.000000 126.000000 123.000000 123.000000 127.000000 
+133.000000 136.000000 136.000000 137.000000 140.000000 137.000000 
+129.000000 125.000000 132.000000 143.000000 145.000000 139.000000 
+127.000000 112.000000 91.000000 73.000000 75.000000 96.000000 
+116.000000 121.000000 118.000000 122.000000 131.000000 135.000000 
+134.000000 136.000000 139.000000 135.000000 129.000000 127.000000 
+130.000000 132.000000 128.000000 125.000000 122.000000 121.000000 
+119.000000 120.000000 123.000000 125.000000 124.000000 123.000000 
+121.000000 123.000000 128.000000 130.000000 126.000000 122.000000 
+122.000000 122.000000 117.000000 110.000000 112.000000 121.000000 
+130.000000 134.000000 133.000000 135.000000 135.000000 131.000000 
+128.000000 129.000000 131.000000 133.000000 135.000000 135.000000 
+131.000000 126.000000 120.000000 117.000000 121.000000 129.000000 
+132.000000 128.000000 120.000000 117.000000 120.000000 124.000000 
+128.000000 132.000000 135.000000 134.000000 132.000000 133.000000 
+139.000000 141.000000 138.000000 136.000000 138.000000 134.000000 
+117.000000 94.000000 84.000000 96.000000 114.000000 123.000000 
+124.000000 126.000000 134.000000 140.000000 140.000000 139.000000 
+139.000000 135.000000 129.000000 127.000000 130.000000 134.000000 
+134.000000 129.000000 123.000000 118.000000 114.000000 114.000000 
+120.000000 126.000000 130.000000 132.000000 131.000000 125.000000 
+119.000000 118.000000 120.000000 121.000000 123.000000 126.000000 
+126.000000 121.000000 115.000000 117.000000 124.000000 128.000000 
+129.000000 134.000000 137.000000 132.000000 126.000000 128.000000 
+137.000000 139.000000 130.000000 122.000000 124.000000 129.000000 
+127.000000 118.000000 116.000000 125.000000 135.000000 133.000000 
+123.000000 114.000000 113.000000 116.000000 121.000000 127.000000 
+130.000000 128.000000 128.000000 133.000000 138.000000 135.000000 
+130.000000 134.000000 146.000000 147.000000 128.000000 102.000000 
+95.000000 108.000000 124.000000 129.000000 129.000000 131.000000 
+135.000000 134.000000 131.000000 131.000000 133.000000 133.000000 
+129.000000 127.000000 127.000000 129.000000 130.000000 129.000000 
+126.000000 121.000000 117.000000 117.000000 121.000000 128.000000 
+134.000000 140.000000 141.000000 133.000000 122.000000 116.000000 
+119.000000 123.000000 124.000000 126.000000 130.000000 132.000000 
+130.000000 127.000000 124.000000 121.000000 135.000000 138.000000 
+136.000000 131.000000 129.000000 131.000000 135.000000 133.000000 
+125.000000 120.000000 122.000000 129.000000 132.000000 128.000000 
+123.000000 121.000000 122.000000 122.000000 121.000000 120.000000 
+118.000000 117.000000 120.000000 124.000000 126.000000 124.000000 
+123.000000 125.000000 129.000000 130.000000 129.000000 130.000000 
+131.000000 125.000000 112.000000 102.000000 105.000000 112.000000 
+118.000000 119.000000 122.000000 129.000000 132.000000 129.000000 
+126.000000 127.000000 132.000000 133.000000 128.000000 122.000000 
+121.000000 124.000000 128.000000 128.000000 124.000000 118.000000 
+116.000000 120.000000 125.000000 130.000000 137.000000 142.000000 
+141.000000 131.000000 123.000000 124.000000 130.000000 130.000000 
+127.000000 127.000000 131.000000 133.000000 131.000000 129.000000 
+127.000000 124.000000 134.000000 133.000000 133.000000 135.000000 
+136.000000 134.000000 129.000000 126.000000 125.000000 127.000000 
+128.000000 127.000000 124.000000 121.000000 119.000000 118.000000 
+120.000000 125.000000 130.000000 130.000000 125.000000 118.000000 
+115.000000 115.000000 116.000000 119.000000 125.000000 131.000000 
+132.000000 129.000000 127.000000 129.000000 130.000000 129.000000 
+127.000000 125.000000 122.000000 119.000000 120.000000 123.000000 
+127.000000 127.000000 128.000000 131.000000 134.000000 136.000000 
+135.000000 131.000000 123.000000 116.000000 113.000000 115.000000 
+118.000000 118.000000 115.000000 112.000000 114.000000 119.000000 
+125.000000 127.000000 128.000000 130.000000 131.000000 130.000000 
+128.000000 128.000000 128.000000 123.000000 116.000000 117.000000 
+128.000000 137.000000 135.000000 127.000000 120.000000 116.000000 
+132.000000 133.000000 135.000000 134.000000 132.000000 130.000000 
+129.000000 127.000000 124.000000 124.000000 126.000000 126.000000 
+120.000000 114.000000 112.000000 115.000000 119.000000 125.000000 
+132.000000 135.000000 130.000000 121.000000 115.000000 115.000000 
+119.000000 128.000000 134.000000 134.000000 129.000000 126.000000 
+130.000000 135.000000 133.000000 125.000000 121.000000 121.000000 
+120.000000 120.000000 122.000000 127.000000 128.000000 125.000000 
+125.000000 132.000000 137.000000 134.000000 127.000000 122.000000 
+120.000000 117.000000 113.000000 112.000000 115.000000 117.000000 
+116.000000 112.000000 109.000000 111.000000 119.000000 127.000000 
+130.000000 128.000000 127.000000 132.000000 137.000000 135.000000 
+126.000000 118.000000 117.000000 124.000000 132.000000 135.000000 
+134.000000 129.000000 124.000000 118.000000 131.000000 134.000000 
+134.000000 132.000000 132.000000 133.000000 133.000000 131.000000 
+128.000000 128.000000 125.000000 119.000000 115.000000 115.000000 
+117.000000 117.000000 115.000000 117.000000 124.000000 130.000000 
+129.000000 126.000000 123.000000 125.000000 130.000000 137.000000 
+138.000000 133.000000 127.000000 127.000000 133.000000 136.000000 
+131.000000 120.000000 109.000000 102.000000 101.000000 108.000000 
+120.000000 126.000000 124.000000 119.000000 119.000000 127.000000 
+132.000000 129.000000 121.000000 115.000000 114.000000 119.000000 
+124.000000 126.000000 124.000000 121.000000 115.000000 109.000000 
+105.000000 107.000000 117.000000 129.000000 136.000000 135.000000 
+131.000000 132.000000 135.000000 132.000000 126.000000 122.000000 
+126.000000 131.000000 134.000000 133.000000 132.000000 134.000000 
+132.000000 126.000000 128.000000 130.000000 133.000000 136.000000 
+135.000000 130.000000 124.000000 122.000000 126.000000 129.000000 
+126.000000 122.000000 120.000000 121.000000 119.000000 118.000000 
+122.000000 128.000000 129.000000 125.000000 124.000000 127.000000 
+130.000000 130.000000 130.000000 132.000000 133.000000 131.000000 
+131.000000 134.000000 136.000000 133.000000 122.000000 105.000000 
+87.000000 75.000000 79.000000 100.000000 121.000000 126.000000 
+118.000000 111.000000 114.000000 122.000000 127.000000 126.000000 
+120.000000 112.000000 108.000000 110.000000 115.000000 120.000000 
+121.000000 118.000000 113.000000 108.000000 106.000000 109.000000 
+117.000000 124.000000 128.000000 131.000000 136.000000 136.000000 
+130.000000 123.000000 121.000000 122.000000 123.000000 122.000000 
+124.000000 130.000000 133.000000 132.000000 128.000000 123.000000 
+142.000000 144.000000 145.000000 143.000000 139.000000 131.000000 
+124.000000 123.000000 127.000000 129.000000 129.000000 126.000000 
+123.000000 119.000000 118.000000 124.000000 132.000000 133.000000 
+127.000000 120.000000 118.000000 122.000000 126.000000 128.000000 
+129.000000 130.000000 130.000000 129.000000 130.000000 133.000000 
+136.000000 134.000000 125.000000 105.000000 82.000000 68.000000 
+73.000000 92.000000 108.000000 113.000000 111.000000 111.000000 
+118.000000 127.000000 131.000000 126.000000 118.000000 113.000000 
+112.000000 110.000000 105.000000 103.000000 110.000000 122.000000 
+127.000000 122.000000 115.000000 113.000000 115.000000 115.000000 
+116.000000 122.000000 130.000000 135.000000 134.000000 129.000000 
+125.000000 121.000000 119.000000 123.000000 128.000000 129.000000 
+125.000000 122.000000 123.000000 124.000000 147.000000 154.000000 
+158.000000 155.000000 147.000000 141.000000 139.000000 140.000000 
+137.000000 132.000000 127.000000 124.000000 121.000000 119.000000 
+122.000000 129.000000 134.000000 133.000000 126.000000 117.000000 
+113.000000 116.000000 121.000000 124.000000 122.000000 122.000000 
+130.000000 137.000000 138.000000 135.000000 137.000000 142.000000 
+143.000000 132.000000 114.000000 99.000000 93.000000 96.000000 
+102.000000 109.000000 116.000000 120.000000 125.000000 133.000000 
+136.000000 129.000000 117.000000 111.000000 113.000000 115.000000 
+112.000000 107.000000 109.000000 119.000000 129.000000 134.000000 
+132.000000 125.000000 116.000000 108.000000 109.000000 116.000000 
+126.000000 135.000000 142.000000 142.000000 133.000000 120.000000 
+113.000000 118.000000 126.000000 126.000000 120.000000 117.000000 
+120.000000 123.000000 148.000000 152.000000 150.000000 143.000000 
+135.000000 134.000000 143.000000 151.000000 149.000000 138.000000 
+128.000000 124.000000 122.000000 121.000000 120.000000 123.000000 
+129.000000 130.000000 121.000000 110.000000 109.000000 121.000000 
+132.000000 132.000000 123.000000 120.000000 127.000000 132.000000 
+132.000000 133.000000 141.000000 150.000000 150.000000 140.000000 
+129.000000 122.000000 117.000000 112.000000 112.000000 118.000000 
+124.000000 124.000000 121.000000 121.000000 122.000000 119.000000 
+110.000000 104.000000 108.000000 115.000000 119.000000 119.000000 
+118.000000 120.000000 123.000000 126.000000 128.000000 127.000000 
+122.000000 117.000000 113.000000 115.000000 124.000000 137.000000 
+145.000000 142.000000 131.000000 119.000000 115.000000 117.000000 
+119.000000 120.000000 121.000000 124.000000 125.000000 123.000000 
+151.000000 146.000000 138.000000 134.000000 137.000000 142.000000 
+143.000000 143.000000 143.000000 138.000000 130.000000 122.000000 
+117.000000 115.000000 117.000000 122.000000 127.000000 126.000000 
+117.000000 109.000000 110.000000 121.000000 131.000000 133.000000 
+132.000000 130.000000 129.000000 125.000000 122.000000 128.000000 
+142.000000 150.000000 143.000000 124.000000 108.000000 103.000000 
+106.000000 110.000000 113.000000 117.000000 121.000000 121.000000 
+118.000000 115.000000 116.000000 115.000000 110.000000 106.000000 
+110.000000 118.000000 122.000000 119.000000 116.000000 119.000000 
+125.000000 128.000000 127.000000 126.000000 122.000000 115.000000 
+105.000000 103.000000 113.000000 126.000000 133.000000 132.000000 
+130.000000 128.000000 126.000000 124.000000 123.000000 124.000000 
+128.000000 128.000000 126.000000 126.000000 143.000000 140.000000 
+141.000000 142.000000 140.000000 136.000000 135.000000 140.000000 
+146.000000 148.000000 142.000000 132.000000 120.000000 113.000000 
+112.000000 117.000000 122.000000 125.000000 126.000000 126.000000 
+127.000000 132.000000 137.000000 139.000000 136.000000 132.000000 
+130.000000 129.000000 129.000000 133.000000 144.000000 153.000000 
+142.000000 110.000000 78.000000 69.000000 86.000000 111.000000 
+124.000000 127.000000 128.000000 129.000000 130.000000 126.000000 
+120.000000 116.000000 112.000000 110.000000 113.000000 118.000000 
+120.000000 115.000000 112.000000 118.000000 131.000000 140.000000 
+136.000000 127.000000 120.000000 116.000000 113.000000 111.000000 
+115.000000 122.000000 127.000000 126.000000 126.000000 127.000000 
+129.000000 126.000000 123.000000 122.000000 123.000000 126.000000 
+129.000000 132.000000 140.000000 140.000000 141.000000 137.000000 
+130.000000 127.000000 132.000000 139.000000 141.000000 139.000000 
+134.000000 128.000000 120.000000 114.000000 113.000000 117.000000 
+122.000000 126.000000 126.000000 126.000000 126.000000 130.000000 
+136.000000 138.000000 137.000000 137.000000 139.000000 138.000000 
+131.000000 130.000000 142.000000 153.000000 142.000000 105.000000 
+71.000000 69.000000 98.000000 129.000000 140.000000 133.000000 
+125.000000 125.000000 127.000000 123.000000 115.000000 109.000000 
+107.000000 109.000000 111.000000 112.000000 112.000000 111.000000 
+111.000000 116.000000 124.000000 131.000000 133.000000 129.000000 
+119.000000 111.000000 109.000000 116.000000 127.000000 133.000000 
+131.000000 123.000000 120.000000 123.000000 129.000000 129.000000 
+124.000000 121.000000 123.000000 126.000000 126.000000 124.000000 
+128.000000 131.000000 140.000000 144.000000 139.000000 133.000000 
+132.000000 135.000000 137.000000 136.000000 132.000000 127.000000 
+122.000000 120.000000 121.000000 122.000000 121.000000 120.000000 
+122.000000 128.000000 134.000000 135.000000 131.000000 127.000000 
+128.000000 136.000000 144.000000 143.000000 135.000000 132.000000 
+142.000000 151.000000 141.000000 109.000000 81.000000 81.000000 
+106.000000 129.000000 133.000000 124.000000 119.000000 123.000000 
+127.000000 124.000000 118.000000 114.000000 113.000000 110.000000 
+106.000000 105.000000 110.000000 115.000000 117.000000 116.000000 
+117.000000 124.000000 133.000000 136.000000 129.000000 118.000000 
+113.000000 121.000000 134.000000 141.000000 134.000000 122.000000 
+116.000000 119.000000 126.000000 130.000000 128.000000 123.000000 
+117.000000 114.000000 114.000000 119.000000 126.000000 129.000000 
+134.000000 134.000000 131.000000 131.000000 135.000000 138.000000 
+136.000000 136.000000 137.000000 138.000000 132.000000 123.000000 
+116.000000 116.000000 118.000000 120.000000 122.000000 124.000000 
+127.000000 129.000000 130.000000 129.000000 127.000000 129.000000 
+134.000000 138.000000 140.000000 143.000000 150.000000 151.000000 
+133.000000 101.000000 80.000000 87.000000 112.000000 132.000000 
+131.000000 121.000000 119.000000 124.000000 126.000000 123.000000 
+119.000000 117.000000 114.000000 109.000000 107.000000 110.000000 
+115.000000 116.000000 112.000000 112.000000 118.000000 125.000000 
+127.000000 124.000000 122.000000 121.000000 119.000000 117.000000 
+117.000000 121.000000 122.000000 119.000000 118.000000 121.000000 
+124.000000 125.000000 124.000000 124.000000 124.000000 123.000000 
+124.000000 129.000000 128.000000 129.000000 128.000000 127.000000 
+129.000000 135.000000 140.000000 140.000000 137.000000 135.000000 
+137.000000 137.000000 131.000000 122.000000 117.000000 118.000000 
+121.000000 121.000000 122.000000 125.000000 128.000000 127.000000 
+125.000000 125.000000 126.000000 128.000000 129.000000 130.000000 
+132.000000 138.000000 146.000000 147.000000 128.000000 97.000000 
+75.000000 82.000000 113.000000 139.000000 141.000000 129.000000 
+121.000000 120.000000 121.000000 120.000000 120.000000 121.000000 
+118.000000 113.000000 111.000000 114.000000 118.000000 120.000000 
+119.000000 116.000000 115.000000 118.000000 122.000000 123.000000 
+120.000000 118.000000 121.000000 127.000000 130.000000 129.000000 
+126.000000 122.000000 118.000000 116.000000 121.000000 129.000000 
+134.000000 134.000000 133.000000 132.000000 128.000000 126.000000 
+131.000000 131.000000 130.000000 132.000000 137.000000 140.000000 
+140.000000 141.000000 143.000000 144.000000 142.000000 137.000000 
+132.000000 127.000000 122.000000 118.000000 117.000000 118.000000 
+120.000000 125.000000 132.000000 137.000000 135.000000 130.000000 
+127.000000 129.000000 131.000000 128.000000 124.000000 129.000000 
+141.000000 144.000000 124.000000 91.000000 70.000000 81.000000 
+115.000000 140.000000 140.000000 127.000000 120.000000 124.000000 
+129.000000 128.000000 124.000000 123.000000 123.000000 120.000000 
+115.000000 114.000000 120.000000 129.000000 132.000000 127.000000 
+122.000000 122.000000 126.000000 127.000000 123.000000 120.000000 
+123.000000 129.000000 132.000000 132.000000 135.000000 139.000000 
+137.000000 128.000000 122.000000 124.000000 130.000000 132.000000 
+132.000000 133.000000 132.000000 127.000000 133.000000 129.000000 
+125.000000 127.000000 133.000000 140.000000 142.000000 139.000000 
+135.000000 135.000000 138.000000 138.000000 132.000000 123.000000 
+116.000000 116.000000 121.000000 127.000000 130.000000 128.000000 
+128.000000 130.000000 132.000000 130.000000 126.000000 126.000000 
+130.000000 131.000000 130.000000 133.000000 139.000000 135.000000 
+112.000000 84.000000 73.000000 91.000000 123.000000 141.000000 
+140.000000 129.000000 124.000000 128.000000 131.000000 130.000000 
+125.000000 120.000000 118.000000 115.000000 114.000000 115.000000 
+118.000000 120.000000 121.000000 122.000000 126.000000 129.000000 
+128.000000 126.000000 126.000000 125.000000 122.000000 119.000000 
+123.000000 135.000000 147.000000 147.000000 135.000000 124.000000 
+120.000000 124.000000 130.000000 133.000000 134.000000 133.000000 
+129.000000 123.000000 141.000000 138.000000 134.000000 131.000000 
+131.000000 132.000000 135.000000 136.000000 133.000000 127.000000 
+124.000000 125.000000 129.000000 132.000000 131.000000 125.000000 
+119.000000 117.000000 121.000000 127.000000 131.000000 133.000000 
+133.000000 131.000000 128.000000 126.000000 125.000000 127.000000 
+131.000000 137.000000 141.000000 134.000000 112.000000 88.000000 
+79.000000 94.000000 120.000000 136.000000 137.000000 133.000000 
+133.000000 133.000000 129.000000 121.000000 117.000000 118.000000 
+118.000000 115.000000 114.000000 119.000000 124.000000 125.000000 
+123.000000 124.000000 126.000000 127.000000 125.000000 124.000000 
+126.000000 129.000000 130.000000 126.000000 121.000000 124.000000 
+138.000000 150.000000 146.000000 130.000000 117.000000 118.000000 
+130.000000 138.000000 137.000000 133.000000 131.000000 128.000000 
+136.000000 134.000000 131.000000 130.000000 132.000000 133.000000 
+132.000000 131.000000 129.000000 126.000000 127.000000 132.000000 
+138.000000 141.000000 136.000000 129.000000 126.000000 127.000000 
+129.000000 128.000000 128.000000 129.000000 133.000000 136.000000 
+135.000000 131.000000 126.000000 123.000000 126.000000 133.000000 
+139.000000 132.000000 112.000000 90.000000 84.000000 98.000000 
+122.000000 137.000000 139.000000 136.000000 137.000000 135.000000 
+126.000000 117.000000 116.000000 123.000000 128.000000 123.000000 
+116.000000 115.000000 119.000000 123.000000 125.000000 125.000000 
+121.000000 116.000000 117.000000 125.000000 131.000000 132.000000 
+130.000000 131.000000 132.000000 124.000000 114.000000 115.000000 
+125.000000 133.000000 130.000000 123.000000 120.000000 128.000000 
+134.000000 133.000000 128.000000 124.000000 130.000000 130.000000 
+130.000000 129.000000 128.000000 127.000000 125.000000 120.000000 
+116.000000 118.000000 125.000000 135.000000 141.000000 138.000000 
+131.000000 129.000000 133.000000 138.000000 136.000000 127.000000 
+119.000000 120.000000 126.000000 129.000000 128.000000 124.000000 
+123.000000 124.000000 127.000000 133.000000 138.000000 130.000000 
+107.000000 83.000000 78.000000 95.000000 121.000000 137.000000 
+139.000000 136.000000 132.000000 127.000000 121.000000 120.000000 
+125.000000 129.000000 128.000000 123.000000 120.000000 122.000000 
+124.000000 122.000000 120.000000 123.000000 128.000000 129.000000 
+126.000000 121.000000 120.000000 123.000000 125.000000 126.000000 
+124.000000 120.000000 115.000000 112.000000 116.000000 130.000000 
+144.000000 147.000000 136.000000 124.000000 122.000000 125.000000 
+125.000000 121.000000 125.000000 126.000000 127.000000 129.000000 
+132.000000 133.000000 131.000000 127.000000 126.000000 132.000000 
+140.000000 146.000000 146.000000 141.000000 136.000000 133.000000 
+134.000000 133.000000 128.000000 124.000000 123.000000 125.000000 
+126.000000 126.000000 127.000000 131.000000 133.000000 129.000000 
+125.000000 126.000000 131.000000 125.000000 103.000000 81.000000 
+80.000000 101.000000 127.000000 138.000000 135.000000 129.000000 
+128.000000 127.000000 125.000000 124.000000 128.000000 131.000000 
+127.000000 120.000000 118.000000 120.000000 121.000000 120.000000 
+122.000000 127.000000 129.000000 123.000000 116.000000 116.000000 
+123.000000 128.000000 129.000000 127.000000 124.000000 121.000000 
+119.000000 118.000000 118.000000 120.000000 124.000000 130.000000 
+135.000000 134.000000 129.000000 125.000000 127.000000 129.000000 
+131.000000 132.000000 134.000000 134.000000 132.000000 131.000000 
+130.000000 130.000000 132.000000 135.000000 139.000000 138.000000 
+133.000000 130.000000 132.000000 136.000000 138.000000 133.000000 
+125.000000 121.000000 122.000000 124.000000 126.000000 129.000000 
+133.000000 136.000000 134.000000 128.000000 125.000000 131.000000 
+138.000000 130.000000 108.000000 88.000000 89.000000 109.000000 
+130.000000 137.000000 133.000000 128.000000 126.000000 124.000000 
+122.000000 122.000000 127.000000 133.000000 134.000000 131.000000 
+127.000000 123.000000 118.000000 117.000000 121.000000 128.000000 
+130.000000 124.000000 118.000000 119.000000 127.000000 135.000000 
+137.000000 133.000000 125.000000 120.000000 120.000000 123.000000 
+127.000000 128.000000 124.000000 123.000000 127.000000 134.000000 
+135.000000 130.000000 126.000000 127.000000 134.000000 136.000000 
+142.000000 145.000000 140.000000 130.000000 125.000000 127.000000 
+133.000000 136.000000 134.000000 130.000000 130.000000 131.000000 
+135.000000 139.000000 141.000000 138.000000 132.000000 126.000000 
+124.000000 125.000000 125.000000 124.000000 127.000000 134.000000 
+141.000000 143.000000 140.000000 137.000000 133.000000 122.000000 
+106.000000 95.000000 98.000000 114.000000 128.000000 132.000000 
+131.000000 131.000000 132.000000 129.000000 125.000000 123.000000 
+123.000000 123.000000 123.000000 123.000000 121.000000 116.000000 
+112.000000 116.000000 124.000000 128.000000 125.000000 119.000000 
+116.000000 118.000000 124.000000 130.000000 135.000000 132.000000 
+126.000000 122.000000 123.000000 124.000000 124.000000 124.000000 
+128.000000 134.000000 137.000000 135.000000 131.000000 129.000000 
+127.000000 126.000000 140.000000 143.000000 142.000000 140.000000 
+139.000000 136.000000 131.000000 126.000000 124.000000 127.000000 
+132.000000 135.000000 135.000000 135.000000 138.000000 143.000000 
+144.000000 137.000000 128.000000 123.000000 125.000000 127.000000 
+126.000000 124.000000 126.000000 131.000000 136.000000 139.000000 
+143.000000 146.000000 142.000000 126.000000 106.000000 95.000000 
+103.000000 120.000000 134.000000 136.000000 131.000000 127.000000 
+126.000000 124.000000 121.000000 119.000000 123.000000 128.000000 
+130.000000 128.000000 124.000000 123.000000 125.000000 128.000000 
+130.000000 129.000000 126.000000 121.000000 118.000000 117.000000 
+121.000000 127.000000 131.000000 130.000000 127.000000 126.000000 
+128.000000 128.000000 126.000000 126.000000 130.000000 135.000000 
+135.000000 133.000000 131.000000 132.000000 133.000000 132.000000 
+135.000000 131.000000 130.000000 132.000000 133.000000 130.000000 
+126.000000 124.000000 124.000000 125.000000 127.000000 133.000000 
+137.000000 138.000000 137.000000 136.000000 138.000000 140.000000 
+136.000000 128.000000 122.000000 121.000000 124.000000 128.000000 
+132.000000 136.000000 139.000000 139.000000 138.000000 136.000000 
+131.000000 120.000000 107.000000 101.000000 111.000000 127.000000 
+136.000000 136.000000 134.000000 134.000000 132.000000 124.000000 
+119.000000 121.000000 127.000000 132.000000 131.000000 132.000000 
+135.000000 138.000000 137.000000 134.000000 131.000000 129.000000 
+128.000000 126.000000 126.000000 130.000000 133.000000 135.000000 
+133.000000 129.000000 127.000000 129.000000 130.000000 127.000000 
+122.000000 119.000000 120.000000 126.000000 134.000000 138.000000 
+137.000000 130.000000 124.000000 121.000000 128.000000 128.000000 
+131.000000 135.000000 136.000000 132.000000 125.000000 121.000000 
+121.000000 124.000000 128.000000 132.000000 134.000000 136.000000 
+137.000000 138.000000 138.000000 136.000000 132.000000 128.000000 
+126.000000 128.000000 130.000000 133.000000 135.000000 136.000000 
+134.000000 130.000000 126.000000 126.000000 125.000000 119.000000 
+108.000000 103.000000 109.000000 122.000000 133.000000 139.000000 
+139.000000 136.000000 130.000000 123.000000 120.000000 120.000000 
+123.000000 125.000000 129.000000 133.000000 136.000000 134.000000 
+128.000000 122.000000 119.000000 117.000000 119.000000 123.000000 
+129.000000 132.000000 129.000000 124.000000 120.000000 122.000000 
+127.000000 128.000000 124.000000 118.000000 117.000000 120.000000 
+125.000000 130.000000 136.000000 139.000000 133.000000 123.000000 
+119.000000 122.000000 128.000000 131.000000 138.000000 141.000000 
+136.000000 128.000000 123.000000 123.000000 126.000000 130.000000 
+132.000000 132.000000 132.000000 134.000000 138.000000 141.000000 
+142.000000 139.000000 135.000000 132.000000 130.000000 127.000000 
+125.000000 126.000000 131.000000 134.000000 134.000000 133.000000 
+134.000000 135.000000 130.000000 118.000000 107.000000 104.000000 
+112.000000 123.000000 132.000000 136.000000 137.000000 135.000000 
+134.000000 132.000000 129.000000 125.000000 122.000000 120.000000 
+121.000000 124.000000 128.000000 130.000000 126.000000 119.000000 
+115.000000 118.000000 122.000000 125.000000 130.000000 136.000000 
+141.000000 139.000000 132.000000 127.000000 125.000000 124.000000 
+120.000000 117.000000 117.000000 119.000000 124.000000 131.000000 
+137.000000 137.000000 131.000000 127.000000 127.000000 127.000000 
+142.000000 138.000000 136.000000 135.000000 133.000000 128.000000 
+123.000000 122.000000 125.000000 129.000000 131.000000 132.000000 
+136.000000 141.000000 142.000000 138.000000 132.000000 129.000000 
+132.000000 133.000000 132.000000 129.000000 129.000000 132.000000 
+133.000000 132.000000 131.000000 135.000000 140.000000 139.000000 
+129.000000 115.000000 106.000000 108.000000 118.000000 128.000000 
+135.000000 138.000000 138.000000 136.000000 132.000000 129.000000 
+130.000000 130.000000 129.000000 128.000000 128.000000 131.000000 
+131.000000 127.000000 122.000000 121.000000 125.000000 128.000000 
+127.000000 125.000000 126.000000 130.000000 133.000000 132.000000 
+131.000000 131.000000 131.000000 130.000000 128.000000 127.000000 
+127.000000 128.000000 130.000000 131.000000 130.000000 129.000000 
+128.000000 126.000000 123.000000 121.000000 141.000000 139.000000 
+137.000000 138.000000 140.000000 140.000000 136.000000 132.000000 
+132.000000 134.000000 134.000000 133.000000 133.000000 135.000000 
+138.000000 139.000000 138.000000 138.000000 136.000000 133.000000 
+130.000000 128.000000 129.000000 131.000000 132.000000 132.000000 
+131.000000 131.000000 130.000000 130.000000 129.000000 127.000000 
+122.000000 119.000000 123.000000 131.000000 140.000000 142.000000 
+137.000000 133.000000 134.000000 138.000000 140.000000 138.000000 
+132.000000 128.000000 128.000000 132.000000 134.000000 132.000000 
+128.000000 125.000000 126.000000 128.000000 128.000000 126.000000 
+127.000000 128.000000 128.000000 125.000000 121.000000 120.000000 
+121.000000 123.000000 127.000000 130.000000 131.000000 130.000000 
+128.000000 127.000000 127.000000 130.000000 130.000000 127.000000 
+122.000000 121.000000 134.000000 135.000000 141.000000 144.000000 
+142.000000 139.000000 139.000000 141.000000 140.000000 136.000000 
+132.000000 130.000000 128.000000 129.000000 133.000000 136.000000 
+136.000000 134.000000 133.000000 135.000000 135.000000 131.000000 
+125.000000 123.000000 126.000000 130.000000 132.000000 130.000000 
+126.000000 128.000000 132.000000 133.000000 128.000000 122.000000 
+122.000000 129.000000 138.000000 140.000000 136.000000 131.000000 
+128.000000 128.000000 129.000000 131.000000 132.000000 132.000000 
+133.000000 135.000000 138.000000 136.000000 130.000000 122.000000 
+117.000000 120.000000 128.000000 136.000000 136.000000 128.000000 
+118.000000 117.000000 123.000000 129.000000 131.000000 131.000000 
+133.000000 134.000000 131.000000 126.000000 122.000000 123.000000 
+128.000000 132.000000 131.000000 128.000000 127.000000 129.000000 
+129.000000 131.000000 137.000000 141.000000 140.000000 138.000000 
+137.000000 137.000000 136.000000 135.000000 134.000000 134.000000 
+132.000000 131.000000 131.000000 134.000000 136.000000 137.000000 
+136.000000 136.000000 137.000000 140.000000 139.000000 135.000000 
+130.000000 131.000000 134.000000 136.000000 133.000000 130.000000 
+130.000000 131.000000 129.000000 125.000000 126.000000 130.000000 
+133.000000 132.000000 131.000000 132.000000 134.000000 133.000000 
+129.000000 124.000000 123.000000 127.000000 132.000000 133.000000 
+131.000000 129.000000 129.000000 128.000000 124.000000 122.000000 
+126.000000 134.000000 135.000000 129.000000 122.000000 121.000000 
+125.000000 127.000000 128.000000 130.000000 134.000000 135.000000 
+132.000000 127.000000 125.000000 129.000000 135.000000 136.000000 
+134.000000 130.000000 130.000000 132.000000 133.000000 136.000000 
+137.000000 139.000000 140.000000 142.000000 140.000000 136.000000 
+133.000000 133.000000 133.000000 131.000000 131.000000 134.000000 
+134.000000 132.000000 131.000000 132.000000 136.000000 138.000000 
+140.000000 140.000000 135.000000 128.000000 126.000000 132.000000 
+139.000000 139.000000 134.000000 133.000000 136.000000 139.000000 
+139.000000 137.000000 134.000000 130.000000 125.000000 123.000000 
+128.000000 133.000000 133.000000 128.000000 125.000000 126.000000 
+129.000000 130.000000 130.000000 132.000000 132.000000 132.000000 
+132.000000 130.000000 126.000000 123.000000 125.000000 130.000000 
+133.000000 131.000000 127.000000 124.000000 123.000000 125.000000 
+128.000000 131.000000 133.000000 131.000000 127.000000 122.000000 
+123.000000 128.000000 132.000000 131.000000 127.000000 125.000000 
+128.000000 130.000000 128.000000 134.000000 139.000000 140.000000 
+137.000000 133.000000 130.000000 129.000000 130.000000 130.000000 
+129.000000 126.000000 124.000000 127.000000 131.000000 135.000000 
+135.000000 135.000000 135.000000 136.000000 136.000000 136.000000 
+133.000000 130.000000 127.000000 127.000000 129.000000 133.000000 
+136.000000 136.000000 134.000000 132.000000 131.000000 131.000000 
+131.000000 130.000000 129.000000 130.000000 129.000000 126.000000 
+123.000000 125.000000 131.000000 134.000000 134.000000 132.000000 
+131.000000 131.000000 131.000000 131.000000 131.000000 128.000000 
+124.000000 123.000000 124.000000 125.000000 127.000000 129.000000 
+133.000000 135.000000 133.000000 131.000000 131.000000 132.000000 
+132.000000 131.000000 130.000000 130.000000 133.000000 136.000000 
+137.000000 136.000000 133.000000 132.000000 132.000000 131.000000 
+130.000000 132.000000 135.000000 137.000000 134.000000 130.000000 
+125.000000 124.000000 126.000000 129.000000 131.000000 130.000000 
+130.000000 133.000000 138.000000 139.000000 134.000000 129.000000 
+129.000000 133.000000 137.000000 138.000000 136.000000 133.000000 
+130.000000 128.000000 127.000000 129.000000 132.000000 134.000000 
+137.000000 140.000000 140.000000 136.000000 129.000000 127.000000 
+131.000000 136.000000 136.000000 133.000000 131.000000 132.000000 
+129.000000 125.000000 124.000000 132.000000 140.000000 142.000000 
+137.000000 134.000000 133.000000 132.000000 127.000000 122.000000 
+122.000000 127.000000 130.000000 130.000000 129.000000 128.000000 
+130.000000 132.000000 131.000000 128.000000 127.000000 128.000000 
+131.000000 132.000000 131.000000 130.000000 132.000000 135.000000 
+134.000000 131.000000 128.000000 126.000000 124.000000 127.000000 
+134.000000 138.000000 137.000000 133.000000 132.000000 135.000000 
+136.000000 133.000000 128.000000 125.000000 127.000000 131.000000 
+135.000000 138.000000 139.000000 138.000000 137.000000 137.000000 
+136.000000 135.000000 132.000000 131.000000 130.000000 127.000000 
+125.000000 125.000000 129.000000 133.000000 134.000000 132.000000 
+131.000000 131.000000 131.000000 132.000000 133.000000 134.000000 
+135.000000 135.000000 134.000000 132.000000 130.000000 130.000000 
+133.000000 136.000000 137.000000 137.000000 137.000000 136.000000 
+133.000000 130.000000 129.000000 131.000000 135.000000 137.000000 
+135.000000 132.000000 130.000000 130.000000 131.000000 131.000000 
+131.000000 132.000000 133.000000 133.000000 132.000000 130.000000 
+128.000000 127.000000 128.000000 128.000000 128.000000 127.000000 
+126.000000 127.000000 108.000000 112.000000 116.000000 119.000000 
+120.000000 119.000000 119.000000 119.000000 120.000000 122.000000 
+125.000000 130.000000 134.000000 134.000000 131.000000 130.000000 
+135.000000 141.000000 142.000000 141.000000 141.000000 143.000000 
+143.000000 140.000000 132.000000 124.000000 119.000000 122.000000 
+129.000000 136.000000 137.000000 132.000000 126.000000 121.000000 
+119.000000 117.000000 114.000000 113.000000 116.000000 122.000000 
+127.000000 131.000000 135.000000 139.000000 139.000000 136.000000 
+137.000000 144.000000 148.000000 143.000000 130.000000 119.000000 
+112.000000 110.000000 113.000000 122.000000 131.000000 134.000000 
+129.000000 123.000000 117.000000 114.000000 112.000000 112.000000 
+111.000000 113.000000 119.000000 128.000000 132.000000 130.000000 
+127.000000 126.000000 127.000000 125.000000 122.000000 122.000000 
+115.000000 118.000000 117.000000 115.000000 118.000000 121.000000 
+120.000000 117.000000 118.000000 123.000000 128.000000 128.000000 
+126.000000 126.000000 129.000000 133.000000 137.000000 140.000000 
+141.000000 142.000000 145.000000 147.000000 144.000000 138.000000 
+129.000000 122.000000 121.000000 125.000000 132.000000 138.000000 
+142.000000 142.000000 140.000000 138.000000 136.000000 133.000000 
+128.000000 120.000000 117.000000 122.000000 130.000000 135.000000 
+136.000000 136.000000 140.000000 143.000000 144.000000 145.000000 
+147.000000 145.000000 136.000000 123.000000 114.000000 110.000000 
+111.000000 115.000000 122.000000 131.000000 135.000000 130.000000 
+122.000000 116.000000 114.000000 113.000000 112.000000 115.000000 
+123.000000 131.000000 134.000000 133.000000 131.000000 129.000000 
+126.000000 121.000000 120.000000 123.000000 121.000000 119.000000 
+113.000000 109.000000 112.000000 116.000000 118.000000 118.000000 
+121.000000 130.000000 137.000000 137.000000 133.000000 129.000000 
+132.000000 138.000000 141.000000 138.000000 136.000000 139.000000 
+144.000000 147.000000 141.000000 131.000000 123.000000 122.000000 
+127.000000 135.000000 142.000000 146.000000 148.000000 147.000000 
+145.000000 143.000000 142.000000 140.000000 134.000000 125.000000 
+119.000000 119.000000 125.000000 132.000000 136.000000 136.000000 
+138.000000 143.000000 150.000000 151.000000 144.000000 133.000000 
+125.000000 122.000000 121.000000 121.000000 122.000000 124.000000 
+124.000000 125.000000 125.000000 127.000000 127.000000 126.000000 
+121.000000 115.000000 112.000000 116.000000 124.000000 130.000000 
+132.000000 130.000000 127.000000 126.000000 125.000000 123.000000 
+121.000000 120.000000 117.000000 118.000000 120.000000 120.000000 
+118.000000 117.000000 119.000000 124.000000 130.000000 135.000000 
+134.000000 128.000000 124.000000 127.000000 134.000000 139.000000 
+142.000000 143.000000 143.000000 143.000000 141.000000 136.000000 
+128.000000 120.000000 117.000000 123.000000 133.000000 140.000000 
+142.000000 142.000000 143.000000 143.000000 143.000000 139.000000 
+136.000000 135.000000 135.000000 132.000000 124.000000 112.000000 
+108.000000 114.000000 125.000000 133.000000 136.000000 137.000000 
+139.000000 140.000000 138.000000 132.000000 128.000000 126.000000 
+127.000000 129.000000 131.000000 130.000000 125.000000 120.000000 
+119.000000 121.000000 123.000000 122.000000 119.000000 115.000000 
+114.000000 118.000000 125.000000 131.000000 133.000000 132.000000 
+129.000000 122.000000 116.000000 118.000000 124.000000 127.000000 
+127.000000 126.000000 123.000000 119.000000 118.000000 121.000000 
+126.000000 132.000000 134.000000 133.000000 131.000000 129.000000 
+126.000000 121.000000 120.000000 126.000000 136.000000 143.000000 
+144.000000 143.000000 142.000000 136.000000 125.000000 117.000000 
+119.000000 128.000000 137.000000 143.000000 145.000000 144.000000 
+143.000000 141.000000 137.000000 133.000000 131.000000 130.000000 
+129.000000 124.000000 125.000000 134.000000 141.000000 137.000000 
+130.000000 125.000000 128.000000 135.000000 139.000000 140.000000 
+137.000000 132.000000 128.000000 127.000000 129.000000 130.000000 
+130.000000 128.000000 123.000000 120.000000 120.000000 123.000000 
+125.000000 126.000000 126.000000 121.000000 115.000000 115.000000 
+123.000000 132.000000 132.000000 126.000000 124.000000 125.000000 
+124.000000 121.000000 123.000000 126.000000 136.000000 134.000000 
+129.000000 121.000000 115.000000 116.000000 125.000000 134.000000 
+133.000000 128.000000 127.000000 130.000000 131.000000 125.000000 
+121.000000 124.000000 133.000000 140.000000 143.000000 142.000000 
+136.000000 128.000000 124.000000 126.000000 130.000000 136.000000 
+142.000000 145.000000 142.000000 138.000000 138.000000 139.000000 
+137.000000 135.000000 135.000000 135.000000 132.000000 130.000000 
+148.000000 185.000000 198.000000 168.000000 136.000000 125.000000 
+128.000000 134.000000 136.000000 134.000000 133.000000 133.000000 
+133.000000 135.000000 134.000000 128.000000 121.000000 118.000000 
+123.000000 128.000000 129.000000 128.000000 128.000000 129.000000 
+129.000000 127.000000 124.000000 123.000000 126.000000 129.000000 
+126.000000 118.000000 115.000000 120.000000 124.000000 121.000000 
+116.000000 115.000000 134.000000 128.000000 125.000000 122.000000 
+116.000000 116.000000 121.000000 125.000000 125.000000 125.000000 
+128.000000 131.000000 132.000000 132.000000 132.000000 132.000000 
+135.000000 140.000000 141.000000 136.000000 128.000000 126.000000 
+130.000000 132.000000 132.000000 136.000000 141.000000 142.000000 
+138.000000 135.000000 134.000000 129.000000 121.000000 120.000000 
+127.000000 135.000000 134.000000 128.000000 132.000000 152.000000 
+156.000000 141.000000 132.000000 133.000000 135.000000 134.000000 
+135.000000 138.000000 140.000000 138.000000 138.000000 140.000000 
+136.000000 123.000000 110.000000 111.000000 123.000000 133.000000 
+133.000000 131.000000 134.000000 135.000000 130.000000 126.000000 
+125.000000 126.000000 123.000000 120.000000 121.000000 123.000000 
+121.000000 120.000000 121.000000 123.000000 122.000000 120.000000 
+138.000000 134.000000 127.000000 119.000000 115.000000 116.000000 
+118.000000 119.000000 124.000000 129.000000 131.000000 130.000000 
+128.000000 129.000000 130.000000 130.000000 133.000000 138.000000 
+139.000000 133.000000 130.000000 134.000000 139.000000 138.000000 
+134.000000 132.000000 135.000000 139.000000 141.000000 141.000000 
+139.000000 133.000000 125.000000 118.000000 122.000000 145.000000 
+173.000000 180.000000 157.000000 123.000000 108.000000 118.000000 
+137.000000 148.000000 148.000000 142.000000 138.000000 138.000000 
+141.000000 142.000000 141.000000 137.000000 130.000000 120.000000 
+114.000000 115.000000 122.000000 129.000000 134.000000 137.000000 
+137.000000 132.000000 123.000000 121.000000 125.000000 127.000000 
+125.000000 122.000000 121.000000 117.000000 112.000000 112.000000 
+119.000000 126.000000 127.000000 122.000000 137.000000 131.000000 
+126.000000 124.000000 124.000000 122.000000 118.000000 117.000000 
+122.000000 128.000000 129.000000 126.000000 123.000000 122.000000 
+124.000000 125.000000 126.000000 131.000000 138.000000 143.000000 
+143.000000 139.000000 135.000000 132.000000 129.000000 127.000000 
+131.000000 140.000000 147.000000 146.000000 143.000000 142.000000 
+138.000000 129.000000 128.000000 161.000000 215.000000 227.000000 
+172.000000 113.000000 100.000000 117.000000 132.000000 135.000000 
+135.000000 139.000000 142.000000 141.000000 139.000000 137.000000 
+129.000000 120.000000 116.000000 120.000000 122.000000 118.000000 
+116.000000 125.000000 138.000000 140.000000 128.000000 116.000000 
+113.000000 118.000000 123.000000 123.000000 123.000000 124.000000 
+121.000000 112.000000 102.000000 103.000000 113.000000 120.000000 
+118.000000 113.000000 132.000000 124.000000 121.000000 122.000000 
+124.000000 123.000000 123.000000 123.000000 125.000000 129.000000 
+132.000000 131.000000 125.000000 119.000000 117.000000 118.000000 
+121.000000 127.000000 136.000000 144.000000 145.000000 139.000000 
+133.000000 128.000000 126.000000 129.000000 135.000000 142.000000 
+146.000000 147.000000 145.000000 138.000000 130.000000 130.000000 
+140.000000 155.000000 167.000000 137.000000 88.000000 83.000000 
+109.000000 127.000000 128.000000 122.000000 127.000000 139.000000 
+147.000000 145.000000 137.000000 129.000000 122.000000 116.000000 
+116.000000 120.000000 124.000000 124.000000 126.000000 133.000000 
+137.000000 133.000000 123.000000 116.000000 114.000000 116.000000 
+118.000000 122.000000 127.000000 126.000000 116.000000 103.000000 
+100.000000 108.000000 118.000000 121.000000 118.000000 115.000000 
+131.000000 129.000000 128.000000 126.000000 125.000000 125.000000 
+124.000000 123.000000 123.000000 127.000000 130.000000 125.000000 
+116.000000 111.000000 111.000000 113.000000 115.000000 119.000000 
+126.000000 132.000000 135.000000 135.000000 133.000000 131.000000 
+131.000000 134.000000 134.000000 135.000000 138.000000 144.000000 
+142.000000 133.000000 127.000000 132.000000 138.000000 128.000000 
+100.000000 71.000000 72.000000 102.000000 128.000000 135.000000 
+129.000000 127.000000 133.000000 139.000000 139.000000 135.000000 
+132.000000 131.000000 129.000000 124.000000 121.000000 120.000000 
+120.000000 121.000000 125.000000 130.000000 132.000000 129.000000 
+124.000000 120.000000 119.000000 122.000000 128.000000 131.000000 
+127.000000 117.000000 106.000000 100.000000 103.000000 110.000000 
+115.000000 119.000000 122.000000 124.000000 133.000000 137.000000 
+133.000000 130.000000 133.000000 135.000000 129.000000 122.000000 
+121.000000 126.000000 128.000000 120.000000 113.000000 112.000000 
+116.000000 120.000000 120.000000 119.000000 118.000000 120.000000 
+126.000000 133.000000 136.000000 135.000000 132.000000 127.000000 
+123.000000 124.000000 132.000000 140.000000 138.000000 131.000000 
+129.000000 127.000000 113.000000 91.000000 74.000000 84.000000 
+113.000000 130.000000 132.000000 128.000000 127.000000 129.000000 
+131.000000 131.000000 130.000000 129.000000 133.000000 136.000000 
+135.000000 129.000000 123.000000 117.000000 114.000000 114.000000 
+117.000000 123.000000 129.000000 132.000000 129.000000 124.000000 
+122.000000 126.000000 132.000000 129.000000 119.000000 113.000000 
+112.000000 111.000000 107.000000 105.000000 111.000000 121.000000 
+125.000000 125.000000 130.000000 130.000000 125.000000 125.000000 
+131.000000 136.000000 135.000000 133.000000 133.000000 128.000000 
+118.000000 111.000000 112.000000 115.000000 117.000000 120.000000 
+124.000000 124.000000 119.000000 118.000000 125.000000 133.000000 
+135.000000 133.000000 132.000000 130.000000 125.000000 124.000000 
+131.000000 137.000000 137.000000 136.000000 135.000000 121.000000 
+90.000000 61.000000 62.000000 94.000000 126.000000 134.000000 
+126.000000 123.000000 127.000000 130.000000 127.000000 127.000000 
+131.000000 133.000000 135.000000 139.000000 141.000000 136.000000 
+124.000000 117.000000 117.000000 121.000000 124.000000 125.000000 
+125.000000 126.000000 128.000000 132.000000 131.000000 126.000000 
+122.000000 119.000000 117.000000 118.000000 122.000000 122.000000 
+115.000000 109.000000 112.000000 122.000000 127.000000 124.000000 
+130.000000 129.000000 130.000000 129.000000 128.000000 128.000000 
+131.000000 134.000000 131.000000 126.000000 126.000000 128.000000 
+127.000000 120.000000 116.000000 122.000000 129.000000 127.000000 
+121.000000 119.000000 122.000000 124.000000 124.000000 128.000000 
+133.000000 131.000000 125.000000 125.000000 131.000000 134.000000 
+130.000000 130.000000 135.000000 132.000000 111.000000 86.000000 
+84.000000 108.000000 132.000000 132.000000 119.000000 115.000000 
+125.000000 134.000000 132.000000 129.000000 132.000000 136.000000 
+136.000000 134.000000 133.000000 131.000000 129.000000 128.000000 
+126.000000 122.000000 116.000000 114.000000 119.000000 125.000000 
+129.000000 135.000000 137.000000 132.000000 121.000000 115.000000 
+115.000000 119.000000 125.000000 129.000000 126.000000 119.000000 
+115.000000 121.000000 128.000000 125.000000 134.000000 136.000000 
+138.000000 135.000000 129.000000 130.000000 134.000000 134.000000 
+128.000000 126.000000 131.000000 135.000000 133.000000 127.000000 
+126.000000 128.000000 126.000000 121.000000 118.000000 116.000000 
+114.000000 117.000000 125.000000 132.000000 130.000000 122.000000 
+119.000000 125.000000 131.000000 130.000000 126.000000 127.000000 
+131.000000 129.000000 116.000000 103.000000 104.000000 118.000000 
+130.000000 127.000000 118.000000 117.000000 128.000000 137.000000 
+137.000000 133.000000 135.000000 139.000000 136.000000 127.000000 
+122.000000 124.000000 129.000000 129.000000 126.000000 121.000000 
+115.000000 114.000000 121.000000 132.000000 139.000000 139.000000 
+137.000000 132.000000 122.000000 113.000000 113.000000 120.000000 
+129.000000 132.000000 130.000000 124.000000 120.000000 121.000000 
+124.000000 123.000000 133.000000 132.000000 131.000000 133.000000 
+135.000000 135.000000 133.000000 130.000000 126.000000 123.000000 
+121.000000 120.000000 121.000000 123.000000 124.000000 122.000000 
+120.000000 120.000000 122.000000 122.000000 121.000000 123.000000 
+127.000000 130.000000 129.000000 124.000000 119.000000 119.000000 
+122.000000 127.000000 132.000000 134.000000 130.000000 122.000000 
+112.000000 107.000000 109.000000 114.000000 119.000000 122.000000 
+124.000000 126.000000 129.000000 132.000000 133.000000 132.000000 
+131.000000 131.000000 130.000000 125.000000 119.000000 114.000000 
+112.000000 113.000000 116.000000 118.000000 119.000000 120.000000 
+125.000000 133.000000 140.000000 142.000000 139.000000 132.000000 
+122.000000 113.000000 112.000000 118.000000 124.000000 126.000000 
+125.000000 125.000000 124.000000 123.000000 122.000000 122.000000 
+136.000000 138.000000 138.000000 137.000000 136.000000 133.000000 
+129.000000 124.000000 121.000000 122.000000 125.000000 127.000000 
+125.000000 120.000000 119.000000 123.000000 128.000000 129.000000 
+127.000000 126.000000 126.000000 123.000000 122.000000 124.000000 
+128.000000 129.000000 124.000000 119.000000 120.000000 124.000000 
+126.000000 125.000000 124.000000 125.000000 126.000000 125.000000 
+119.000000 114.000000 115.000000 121.000000 127.000000 129.000000 
+129.000000 129.000000 130.000000 130.000000 125.000000 121.000000 
+120.000000 122.000000 118.000000 113.000000 109.000000 111.000000 
+111.000000 110.000000 111.000000 117.000000 125.000000 130.000000 
+130.000000 132.000000 136.000000 137.000000 130.000000 120.000000 
+114.000000 115.000000 119.000000 123.000000 126.000000 129.000000 
+129.000000 126.000000 123.000000 121.000000 132.000000 140.000000 
+145.000000 142.000000 136.000000 132.000000 131.000000 132.000000 
+133.000000 131.000000 128.000000 125.000000 123.000000 123.000000 
+124.000000 124.000000 123.000000 124.000000 124.000000 124.000000 
+123.000000 121.000000 119.000000 118.000000 120.000000 125.000000 
+131.000000 134.000000 132.000000 128.000000 126.000000 125.000000 
+124.000000 121.000000 120.000000 121.000000 121.000000 121.000000 
+120.000000 122.000000 126.000000 128.000000 129.000000 128.000000 
+127.000000 124.000000 120.000000 117.000000 117.000000 120.000000 
+122.000000 123.000000 120.000000 116.000000 112.000000 109.000000 
+108.000000 113.000000 119.000000 124.000000 126.000000 129.000000 
+134.000000 136.000000 132.000000 123.000000 117.000000 116.000000 
+121.000000 128.000000 135.000000 138.000000 134.000000 127.000000 
+120.000000 118.000000 134.000000 140.000000 139.000000 134.000000 
+130.000000 129.000000 130.000000 132.000000 136.000000 138.000000 
+135.000000 127.000000 122.000000 122.000000 125.000000 124.000000 
+121.000000 120.000000 124.000000 127.000000 126.000000 121.000000 
+118.000000 118.000000 119.000000 122.000000 126.000000 131.000000 
+136.000000 140.000000 141.000000 139.000000 132.000000 122.000000 
+112.000000 108.000000 110.000000 114.000000 119.000000 120.000000 
+119.000000 119.000000 125.000000 134.000000 135.000000 125.000000 
+115.000000 114.000000 118.000000 120.000000 118.000000 119.000000 
+123.000000 122.000000 116.000000 108.000000 105.000000 109.000000 
+117.000000 124.000000 128.000000 130.000000 132.000000 133.000000 
+133.000000 131.000000 128.000000 124.000000 121.000000 123.000000 
+128.000000 133.000000 135.000000 134.000000 131.000000 125.000000 
+138.000000 144.000000 145.000000 140.000000 135.000000 130.000000 
+127.000000 126.000000 128.000000 132.000000 134.000000 131.000000 
+125.000000 124.000000 128.000000 130.000000 126.000000 122.000000 
+123.000000 125.000000 125.000000 124.000000 125.000000 126.000000 
+127.000000 126.000000 126.000000 127.000000 131.000000 137.000000 
+145.000000 148.000000 137.000000 114.000000 88.000000 76.000000 
+81.000000 95.000000 109.000000 113.000000 112.000000 114.000000 
+126.000000 139.000000 141.000000 131.000000 117.000000 111.000000 
+111.000000 113.000000 114.000000 119.000000 127.000000 132.000000 
+126.000000 113.000000 102.000000 101.000000 107.000000 115.000000 
+121.000000 125.000000 129.000000 135.000000 136.000000 133.000000 
+126.000000 121.000000 119.000000 120.000000 124.000000 129.000000 
+132.000000 133.000000 133.000000 130.000000 134.000000 139.000000 
+146.000000 150.000000 144.000000 132.000000 125.000000 126.000000 
+131.000000 133.000000 129.000000 126.000000 128.000000 131.000000 
+130.000000 127.000000 126.000000 128.000000 127.000000 122.000000 
+121.000000 125.000000 129.000000 128.000000 124.000000 124.000000 
+128.000000 131.000000 131.000000 133.000000 141.000000 147.000000 
+140.000000 117.000000 87.000000 68.000000 69.000000 86.000000 
+104.000000 112.000000 113.000000 116.000000 125.000000 134.000000 
+136.000000 127.000000 113.000000 103.000000 103.000000 110.000000 
+116.000000 117.000000 118.000000 124.000000 128.000000 122.000000 
+108.000000 96.000000 94.000000 101.000000 110.000000 121.000000 
+134.000000 142.000000 141.000000 133.000000 125.000000 122.000000 
+120.000000 119.000000 121.000000 126.000000 129.000000 130.000000 
+131.000000 131.000000 139.000000 141.000000 142.000000 142.000000 
+138.000000 130.000000 126.000000 130.000000 138.000000 141.000000 
+136.000000 129.000000 127.000000 127.000000 125.000000 123.000000 
+125.000000 129.000000 128.000000 122.000000 117.000000 119.000000 
+124.000000 127.000000 124.000000 120.000000 122.000000 131.000000 
+140.000000 141.000000 139.000000 140.000000 142.000000 138.000000 
+122.000000 101.000000 94.000000 104.000000 115.000000 117.000000 
+110.000000 108.000000 115.000000 126.000000 130.000000 124.000000 
+115.000000 112.000000 115.000000 117.000000 114.000000 111.000000 
+111.000000 115.000000 117.000000 115.000000 113.000000 111.000000 
+110.000000 109.000000 112.000000 123.000000 138.000000 146.000000 
+143.000000 134.000000 126.000000 120.000000 115.000000 113.000000 
+115.000000 120.000000 126.000000 129.000000 129.000000 127.000000 
+142.000000 141.000000 137.000000 133.000000 128.000000 126.000000 
+128.000000 135.000000 140.000000 142.000000 140.000000 137.000000 
+132.000000 123.000000 115.000000 114.000000 121.000000 128.000000 
+125.000000 115.000000 109.000000 115.000000 126.000000 130.000000 
+125.000000 118.000000 119.000000 128.000000 135.000000 138.000000 
+139.000000 140.000000 141.000000 138.000000 132.000000 127.000000 
+126.000000 127.000000 124.000000 115.000000 108.000000 108.000000 
+114.000000 121.000000 122.000000 118.000000 116.000000 118.000000 
+122.000000 122.000000 118.000000 116.000000 116.000000 117.000000 
+115.000000 115.000000 118.000000 122.000000 123.000000 121.000000 
+120.000000 125.000000 133.000000 141.000000 143.000000 139.000000 
+132.000000 127.000000 124.000000 122.000000 121.000000 123.000000 
+126.000000 127.000000 125.000000 123.000000 143.000000 135.000000 
+127.000000 122.000000 123.000000 128.000000 134.000000 137.000000 
+135.000000 134.000000 138.000000 141.000000 137.000000 124.000000 
+111.000000 110.000000 120.000000 131.000000 130.000000 119.000000 
+111.000000 115.000000 125.000000 130.000000 125.000000 117.000000 
+118.000000 125.000000 132.000000 135.000000 140.000000 147.000000 
+145.000000 132.000000 118.000000 113.000000 117.000000 120.000000 
+120.000000 119.000000 121.000000 124.000000 126.000000 125.000000 
+121.000000 112.000000 105.000000 105.000000 112.000000 119.000000 
+123.000000 123.000000 123.000000 122.000000 120.000000 120.000000 
+122.000000 122.000000 119.000000 114.000000 112.000000 116.000000 
+124.000000 133.000000 138.000000 135.000000 131.000000 131.000000 
+133.000000 132.000000 128.000000 127.000000 130.000000 131.000000 
+128.000000 125.000000 138.000000 136.000000 133.000000 129.000000 
+127.000000 132.000000 140.000000 145.000000 141.000000 136.000000 
+134.000000 133.000000 127.000000 117.000000 109.000000 110.000000 
+119.000000 128.000000 132.000000 131.000000 127.000000 126.000000 
+129.000000 132.000000 130.000000 127.000000 127.000000 130.000000 
+131.000000 133.000000 141.000000 149.000000 144.000000 119.000000 
+91.000000 81.000000 95.000000 118.000000 129.000000 127.000000 
+120.000000 119.000000 120.000000 121.000000 118.000000 110.000000 
+102.000000 99.000000 104.000000 115.000000 127.000000 132.000000 
+131.000000 128.000000 126.000000 127.000000 126.000000 121.000000 
+113.000000 108.000000 107.000000 107.000000 110.000000 115.000000 
+117.000000 116.000000 115.000000 119.000000 127.000000 131.000000 
+127.000000 121.000000 121.000000 126.000000 132.000000 135.000000 
+134.000000 130.000000 132.000000 133.000000 130.000000 131.000000 
+138.000000 146.000000 145.000000 136.000000 129.000000 126.000000 
+123.000000 117.000000 112.000000 115.000000 123.000000 131.000000 
+134.000000 133.000000 131.000000 132.000000 133.000000 133.000000 
+133.000000 136.000000 139.000000 138.000000 133.000000 131.000000 
+140.000000 149.000000 140.000000 108.000000 75.000000 67.000000 
+89.000000 120.000000 133.000000 128.000000 119.000000 119.000000 
+123.000000 123.000000 118.000000 111.000000 104.000000 99.000000 
+98.000000 106.000000 119.000000 127.000000 125.000000 123.000000 
+126.000000 132.000000 129.000000 119.000000 110.000000 107.000000 
+109.000000 112.000000 117.000000 125.000000 129.000000 126.000000 
+121.000000 122.000000 128.000000 129.000000 123.000000 116.000000 
+117.000000 124.000000 131.000000 131.000000 126.000000 124.000000 
+129.000000 134.000000 135.000000 136.000000 140.000000 144.000000 
+141.000000 134.000000 132.000000 133.000000 132.000000 127.000000 
+123.000000 125.000000 128.000000 128.000000 125.000000 123.000000 
+125.000000 127.000000 125.000000 123.000000 126.000000 134.000000 
+141.000000 140.000000 132.000000 129.000000 140.000000 152.000000 
+142.000000 107.000000 74.000000 73.000000 102.000000 130.000000 
+136.000000 126.000000 123.000000 127.000000 128.000000 121.000000 
+111.000000 106.000000 104.000000 102.000000 101.000000 104.000000 
+113.000000 122.000000 127.000000 126.000000 124.000000 120.000000 
+117.000000 117.000000 119.000000 120.000000 120.000000 119.000000 
+125.000000 137.000000 145.000000 141.000000 128.000000 119.000000 
+120.000000 124.000000 124.000000 121.000000 120.000000 121.000000 
+122.000000 121.000000 123.000000 121.000000 123.000000 129.000000 
+136.000000 140.000000 141.000000 139.000000 138.000000 140.000000 
+145.000000 148.000000 142.000000 132.000000 125.000000 126.000000 
+127.000000 124.000000 120.000000 122.000000 126.000000 128.000000 
+126.000000 125.000000 127.000000 130.000000 131.000000 127.000000 
+123.000000 128.000000 143.000000 152.000000 136.000000 100.000000 
+73.000000 80.000000 111.000000 136.000000 137.000000 126.000000 
+123.000000 126.000000 127.000000 123.000000 119.000000 118.000000 
+115.000000 112.000000 112.000000 116.000000 120.000000 122.000000 
+123.000000 123.000000 121.000000 118.000000 116.000000 118.000000 
+122.000000 124.000000 125.000000 123.000000 121.000000 124.000000 
+133.000000 142.000000 144.000000 137.000000 126.000000 119.000000 
+121.000000 126.000000 126.000000 122.000000 121.000000 124.000000 
+127.000000 125.000000 124.000000 125.000000 127.000000 127.000000 
+128.000000 130.000000 134.000000 139.000000 142.000000 143.000000 
+138.000000 129.000000 124.000000 126.000000 130.000000 129.000000 
+125.000000 123.000000 123.000000 124.000000 123.000000 123.000000 
+125.000000 127.000000 128.000000 128.000000 129.000000 134.000000 
+143.000000 145.000000 129.000000 98.000000 76.000000 80.000000 
+108.000000 131.000000 134.000000 125.000000 120.000000 123.000000 
+125.000000 123.000000 120.000000 119.000000 119.000000 118.000000 
+116.000000 116.000000 118.000000 123.000000 126.000000 125.000000 
+121.000000 119.000000 122.000000 125.000000 124.000000 122.000000 
+122.000000 125.000000 125.000000 123.000000 121.000000 119.000000 
+118.000000 120.000000 125.000000 129.000000 131.000000 131.000000 
+130.000000 126.000000 122.000000 122.000000 136.000000 133.000000 
+130.000000 130.000000 132.000000 132.000000 132.000000 135.000000 
+139.000000 141.000000 141.000000 140.000000 136.000000 130.000000 
+126.000000 127.000000 131.000000 130.000000 127.000000 125.000000 
+126.000000 127.000000 125.000000 123.000000 124.000000 129.000000 
+133.000000 133.000000 131.000000 134.000000 141.000000 140.000000 
+119.000000 87.000000 68.000000 81.000000 113.000000 135.000000 
+134.000000 123.000000 120.000000 126.000000 132.000000 131.000000 
+126.000000 122.000000 119.000000 119.000000 122.000000 127.000000 
+130.000000 131.000000 130.000000 128.000000 124.000000 120.000000 
+118.000000 120.000000 122.000000 126.000000 130.000000 129.000000 
+124.000000 119.000000 119.000000 122.000000 124.000000 124.000000 
+126.000000 131.000000 135.000000 134.000000 130.000000 127.000000 
+125.000000 124.000000 138.000000 136.000000 134.000000 133.000000 
+132.000000 133.000000 135.000000 138.000000 138.000000 135.000000 
+133.000000 133.000000 132.000000 128.000000 124.000000 123.000000 
+126.000000 130.000000 131.000000 129.000000 126.000000 124.000000 
+123.000000 123.000000 125.000000 127.000000 129.000000 128.000000 
+128.000000 132.000000 141.000000 139.000000 118.000000 85.000000 
+67.000000 79.000000 112.000000 137.000000 141.000000 134.000000 
+131.000000 134.000000 133.000000 128.000000 122.000000 119.000000 
+118.000000 119.000000 121.000000 125.000000 126.000000 124.000000 
+126.000000 132.000000 134.000000 127.000000 117.000000 116.000000 
+123.000000 130.000000 131.000000 128.000000 126.000000 126.000000 
+126.000000 128.000000 131.000000 131.000000 129.000000 129.000000 
+133.000000 135.000000 132.000000 127.000000 126.000000 126.000000 
+134.000000 133.000000 131.000000 128.000000 124.000000 121.000000 
+121.000000 124.000000 129.000000 132.000000 132.000000 131.000000 
+130.000000 128.000000 124.000000 120.000000 120.000000 125.000000 
+131.000000 132.000000 130.000000 129.000000 129.000000 129.000000 
+127.000000 126.000000 128.000000 130.000000 131.000000 135.000000 
+139.000000 133.000000 112.000000 83.000000 71.000000 85.000000 
+115.000000 136.000000 139.000000 132.000000 129.000000 130.000000 
+128.000000 121.000000 114.000000 113.000000 114.000000 115.000000 
+115.000000 118.000000 122.000000 126.000000 128.000000 127.000000 
+125.000000 125.000000 124.000000 123.000000 124.000000 128.000000 
+132.000000 130.000000 124.000000 124.000000 130.000000 135.000000 
+132.000000 124.000000 123.000000 131.000000 139.000000 139.000000 
+134.000000 132.000000 133.000000 134.000000 137.000000 139.000000 
+138.000000 134.000000 129.000000 127.000000 127.000000 126.000000 
+127.000000 129.000000 133.000000 138.000000 140.000000 140.000000 
+137.000000 133.000000 130.000000 129.000000 127.000000 125.000000 
+124.000000 128.000000 133.000000 134.000000 132.000000 129.000000 
+130.000000 130.000000 130.000000 133.000000 137.000000 131.000000 
+110.000000 86.000000 79.000000 97.000000 121.000000 136.000000 
+137.000000 134.000000 132.000000 129.000000 124.000000 123.000000 
+124.000000 125.000000 122.000000 116.000000 112.000000 113.000000 
+116.000000 121.000000 122.000000 123.000000 126.000000 132.000000 
+137.000000 136.000000 129.000000 123.000000 122.000000 123.000000 
+123.000000 124.000000 131.000000 138.000000 139.000000 137.000000 
+136.000000 140.000000 141.000000 134.000000 126.000000 123.000000 
+126.000000 128.000000 129.000000 129.000000 131.000000 132.000000 
+129.000000 127.000000 128.000000 132.000000 134.000000 134.000000 
+133.000000 135.000000 136.000000 135.000000 132.000000 128.000000 
+128.000000 132.000000 135.000000 135.000000 131.000000 130.000000 
+131.000000 131.000000 130.000000 128.000000 125.000000 122.000000 
+122.000000 129.000000 137.000000 131.000000 107.000000 82.000000 
+78.000000 97.000000 121.000000 133.000000 135.000000 133.000000 
+130.000000 125.000000 121.000000 122.000000 126.000000 127.000000 
+125.000000 123.000000 121.000000 118.000000 115.000000 115.000000 
+116.000000 119.000000 123.000000 128.000000 130.000000 129.000000 
+127.000000 126.000000 126.000000 125.000000 120.000000 116.000000 
+117.000000 119.000000 118.000000 118.000000 124.000000 136.000000 
+143.000000 138.000000 126.000000 119.000000 121.000000 125.000000 
+129.000000 132.000000 133.000000 131.000000 128.000000 127.000000 
+129.000000 130.000000 128.000000 126.000000 128.000000 134.000000 
+142.000000 145.000000 142.000000 135.000000 132.000000 132.000000 
+132.000000 128.000000 124.000000 126.000000 133.000000 137.000000 
+135.000000 134.000000 133.000000 132.000000 130.000000 132.000000 
+135.000000 127.000000 101.000000 76.000000 74.000000 98.000000 
+127.000000 140.000000 136.000000 130.000000 131.000000 134.000000 
+134.000000 133.000000 133.000000 132.000000 128.000000 124.000000 
+123.000000 122.000000 117.000000 113.000000 112.000000 115.000000 
+116.000000 116.000000 117.000000 119.000000 121.000000 123.000000 
+128.000000 133.000000 132.000000 125.000000 119.000000 121.000000 
+125.000000 129.000000 134.000000 141.000000 146.000000 140.000000 
+129.000000 122.000000 123.000000 127.000000 126.000000 133.000000 
+135.000000 133.000000 131.000000 132.000000 133.000000 133.000000 
+133.000000 133.000000 134.000000 136.000000 140.000000 142.000000 
+140.000000 136.000000 131.000000 128.000000 124.000000 122.000000 
+125.000000 133.000000 139.000000 140.000000 141.000000 141.000000 
+138.000000 130.000000 127.000000 134.000000 141.000000 130.000000 
+101.000000 76.000000 79.000000 108.000000 139.000000 147.000000 
+137.000000 128.000000 129.000000 133.000000 132.000000 129.000000 
+129.000000 133.000000 134.000000 129.000000 125.000000 122.000000 
+120.000000 118.000000 118.000000 120.000000 122.000000 121.000000 
+120.000000 121.000000 125.000000 131.000000 137.000000 138.000000 
+132.000000 122.000000 117.000000 118.000000 125.000000 130.000000 
+132.000000 131.000000 131.000000 129.000000 129.000000 130.000000 
+130.000000 128.000000 131.000000 134.000000 138.000000 139.000000 
+135.000000 129.000000 126.000000 130.000000 135.000000 138.000000 
+138.000000 136.000000 136.000000 137.000000 137.000000 135.000000 
+130.000000 125.000000 121.000000 122.000000 126.000000 130.000000 
+131.000000 132.000000 132.000000 133.000000 131.000000 128.000000 
+131.000000 139.000000 141.000000 127.000000 98.000000 76.000000 
+78.000000 102.000000 127.000000 136.000000 133.000000 127.000000 
+127.000000 128.000000 128.000000 128.000000 131.000000 133.000000 
+132.000000 129.000000 126.000000 123.000000 118.000000 112.000000 
+109.000000 112.000000 116.000000 117.000000 114.000000 113.000000 
+118.000000 126.000000 134.000000 137.000000 135.000000 126.000000 
+116.000000 114.000000 120.000000 129.000000 133.000000 130.000000 
+127.000000 129.000000 134.000000 136.000000 133.000000 128.000000 
+129.000000 131.000000 133.000000 134.000000 133.000000 133.000000 
+136.000000 138.000000 136.000000 131.000000 127.000000 130.000000 
+137.000000 142.000000 143.000000 141.000000 137.000000 133.000000 
+129.000000 126.000000 125.000000 124.000000 123.000000 126.000000 
+132.000000 137.000000 137.000000 136.000000 139.000000 145.000000 
+144.000000 127.000000 101.000000 84.000000 89.000000 110.000000 
+129.000000 134.000000 130.000000 129.000000 132.000000 133.000000 
+129.000000 126.000000 126.000000 128.000000 126.000000 122.000000 
+120.000000 123.000000 128.000000 130.000000 128.000000 123.000000 
+119.000000 118.000000 120.000000 122.000000 122.000000 122.000000 
+126.000000 129.000000 129.000000 124.000000 119.000000 119.000000 
+124.000000 130.000000 134.000000 133.000000 135.000000 138.000000 
+138.000000 132.000000 126.000000 128.000000 125.000000 128.000000 
+131.000000 132.000000 129.000000 127.000000 129.000000 131.000000 
+131.000000 130.000000 132.000000 134.000000 136.000000 136.000000 
+138.000000 142.000000 144.000000 142.000000 137.000000 130.000000 
+124.000000 120.000000 121.000000 125.000000 129.000000 132.000000 
+134.000000 134.000000 133.000000 137.000000 138.000000 128.000000 
+104.000000 84.000000 87.000000 110.000000 129.000000 131.000000 
+128.000000 130.000000 135.000000 132.000000 122.000000 117.000000 
+123.000000 128.000000 127.000000 124.000000 125.000000 127.000000 
+127.000000 126.000000 124.000000 122.000000 120.000000 120.000000 
+123.000000 125.000000 127.000000 128.000000 130.000000 129.000000 
+128.000000 128.000000 128.000000 123.000000 118.000000 120.000000 
+129.000000 136.000000 136.000000 131.000000 127.000000 125.000000 
+125.000000 128.000000 118.000000 122.000000 126.000000 129.000000 
+130.000000 132.000000 133.000000 133.000000 131.000000 129.000000 
+129.000000 130.000000 132.000000 135.000000 139.000000 141.000000 
+141.000000 139.000000 134.000000 128.000000 123.000000 122.000000 
+124.000000 126.000000 130.000000 134.000000 135.000000 132.000000 
+129.000000 129.000000 131.000000 125.000000 109.000000 94.000000 
+95.000000 111.000000 125.000000 130.000000 130.000000 133.000000 
+136.000000 132.000000 124.000000 121.000000 125.000000 130.000000 
+131.000000 130.000000 132.000000 132.000000 127.000000 122.000000 
+122.000000 126.000000 128.000000 128.000000 129.000000 134.000000 
+135.000000 131.000000 125.000000 124.000000 126.000000 126.000000 
+122.000000 117.000000 118.000000 123.000000 131.000000 137.000000 
+140.000000 138.000000 134.000000 128.000000 125.000000 123.000000 
+125.000000 129.000000 132.000000 134.000000 134.000000 131.000000 
+130.000000 130.000000 130.000000 129.000000 128.000000 129.000000 
+133.000000 137.000000 140.000000 141.000000 140.000000 139.000000 
+138.000000 137.000000 137.000000 133.000000 128.000000 124.000000 
+127.000000 132.000000 133.000000 130.000000 131.000000 136.000000 
+135.000000 119.000000 96.000000 86.000000 98.000000 121.000000 
+136.000000 138.000000 134.000000 134.000000 134.000000 131.000000 
+124.000000 119.000000 119.000000 122.000000 124.000000 127.000000 
+130.000000 132.000000 128.000000 122.000000 120.000000 123.000000 
+128.000000 131.000000 132.000000 131.000000 128.000000 126.000000 
+127.000000 128.000000 127.000000 123.000000 119.000000 119.000000 
+123.000000 128.000000 131.000000 129.000000 127.000000 127.000000 
+127.000000 127.000000 125.000000 123.000000 129.000000 128.000000 
+132.000000 136.000000 136.000000 132.000000 129.000000 129.000000 
+130.000000 129.000000 128.000000 130.000000 133.000000 138.000000 
+142.000000 141.000000 136.000000 132.000000 133.000000 137.000000 
+139.000000 135.000000 130.000000 128.000000 129.000000 129.000000 
+126.000000 125.000000 130.000000 133.000000 127.000000 109.000000 
+90.000000 85.000000 97.000000 117.000000 132.000000 138.000000 
+138.000000 136.000000 132.000000 128.000000 125.000000 123.000000 
+122.000000 124.000000 130.000000 136.000000 137.000000 131.000000 
+122.000000 119.000000 123.000000 129.000000 133.000000 133.000000 
+131.000000 128.000000 124.000000 124.000000 128.000000 132.000000 
+132.000000 126.000000 118.000000 114.000000 116.000000 119.000000 
+122.000000 128.000000 134.000000 137.000000 132.000000 123.000000 
+118.000000 121.000000 130.000000 133.000000 136.000000 135.000000 
+133.000000 132.000000 130.000000 126.000000 123.000000 124.000000 
+131.000000 137.000000 138.000000 134.000000 132.000000 133.000000 
+135.000000 134.000000 133.000000 133.000000 137.000000 140.000000 
+138.000000 133.000000 129.000000 130.000000 130.000000 129.000000 
+130.000000 130.000000 124.000000 106.000000 87.000000 84.000000 
+99.000000 122.000000 138.000000 142.000000 138.000000 132.000000 
+128.000000 127.000000 128.000000 127.000000 123.000000 122.000000 
+126.000000 132.000000 134.000000 130.000000 126.000000 123.000000 
+121.000000 122.000000 129.000000 138.000000 140.000000 133.000000 
+124.000000 123.000000 130.000000 134.000000 130.000000 125.000000 
+125.000000 127.000000 125.000000 120.000000 120.000000 126.000000 
+133.000000 133.000000 127.000000 121.000000 119.000000 125.000000 
+139.000000 133.000000 129.000000 131.000000 135.000000 134.000000 
+127.000000 122.000000 125.000000 133.000000 139.000000 136.000000 
+132.000000 131.000000 135.000000 137.000000 135.000000 133.000000 
+132.000000 133.000000 132.000000 131.000000 130.000000 129.000000 
+129.000000 129.000000 126.000000 122.000000 124.000000 129.000000 
+128.000000 113.000000 93.000000 88.000000 104.000000 128.000000 
+140.000000 136.000000 127.000000 124.000000 127.000000 130.000000 
+130.000000 130.000000 130.000000 131.000000 134.000000 139.000000 
+139.000000 133.000000 126.000000 121.000000 121.000000 124.000000 
+129.000000 134.000000 136.000000 132.000000 127.000000 125.000000 
+126.000000 129.000000 131.000000 132.000000 131.000000 128.000000 
+124.000000 123.000000 126.000000 131.000000 134.000000 135.000000 
+133.000000 130.000000 125.000000 123.000000 133.000000 135.000000 
+138.000000 138.000000 136.000000 132.000000 129.000000 128.000000 
+131.000000 133.000000 131.000000 130.000000 132.000000 135.000000 
+138.000000 138.000000 138.000000 140.000000 142.000000 142.000000 
+141.000000 139.000000 137.000000 133.000000 130.000000 129.000000 
+129.000000 127.000000 126.000000 127.000000 125.000000 115.000000 
+104.000000 104.000000 118.000000 133.000000 139.000000 135.000000 
+130.000000 130.000000 132.000000 131.000000 128.000000 125.000000 
+126.000000 130.000000 135.000000 137.000000 133.000000 129.000000 
+126.000000 126.000000 126.000000 126.000000 126.000000 128.000000 
+130.000000 131.000000 129.000000 126.000000 124.000000 126.000000 
+130.000000 131.000000 126.000000 121.000000 120.000000 122.000000 
+124.000000 128.000000 134.000000 137.000000 135.000000 132.000000 
+133.000000 135.000000 128.000000 128.000000 129.000000 134.000000 
+139.000000 139.000000 134.000000 131.000000 132.000000 135.000000 
+134.000000 130.000000 129.000000 132.000000 136.000000 137.000000 
+137.000000 137.000000 138.000000 139.000000 138.000000 135.000000 
+133.000000 131.000000 133.000000 134.000000 133.000000 131.000000 
+131.000000 132.000000 132.000000 128.000000 126.000000 127.000000 
+129.000000 128.000000 123.000000 120.000000 121.000000 125.000000 
+129.000000 130.000000 130.000000 128.000000 126.000000 124.000000 
+126.000000 130.000000 133.000000 133.000000 129.000000 126.000000 
+126.000000 129.000000 129.000000 125.000000 124.000000 125.000000 
+127.000000 127.000000 128.000000 129.000000 128.000000 124.000000 
+121.000000 123.000000 126.000000 124.000000 120.000000 123.000000 
+132.000000 138.000000 134.000000 127.000000 127.000000 133.000000 
+135.000000 139.000000 140.000000 137.000000 132.000000 130.000000 
+132.000000 133.000000 132.000000 132.000000 134.000000 137.000000 
+135.000000 132.000000 131.000000 135.000000 140.000000 141.000000 
+139.000000 136.000000 136.000000 137.000000 136.000000 133.000000 
+130.000000 131.000000 133.000000 133.000000 129.000000 125.000000 
+126.000000 129.000000 133.000000 137.000000 139.000000 137.000000 
+132.000000 125.000000 120.000000 121.000000 127.000000 131.000000 
+132.000000 132.000000 133.000000 135.000000 133.000000 130.000000 
+127.000000 128.000000 131.000000 130.000000 128.000000 125.000000 
+125.000000 125.000000 125.000000 125.000000 127.000000 129.000000 
+129.000000 129.000000 130.000000 132.000000 133.000000 128.000000 
+122.000000 119.000000 121.000000 127.000000 131.000000 131.000000 
+128.000000 127.000000 129.000000 131.000000 133.000000 132.000000 
+131.000000 129.000000 127.000000 127.000000 129.000000 128.000000 
+128.000000 131.000000 134.000000 134.000000 132.000000 132.000000 
+135.000000 136.000000 136.000000 135.000000 136.000000 137.000000 
+135.000000 131.000000 126.000000 121.000000 119.000000 121.000000 
+124.000000 126.000000 125.000000 124.000000 125.000000 126.000000 
+127.000000 129.000000 134.000000 137.000000 135.000000 131.000000 
+127.000000 126.000000 125.000000 126.000000 130.000000 134.000000 
+137.000000 137.000000 135.000000 132.000000 130.000000 131.000000 
+133.000000 132.000000 125.000000 120.000000 120.000000 124.000000 
+124.000000 124.000000 127.000000 134.000000 138.000000 136.000000 
+130.000000 127.000000 125.000000 122.000000 120.000000 120.000000 
+121.000000 124.000000 129.000000 134.000000 136.000000 134.000000 
+131.000000 131.000000 140.000000 141.000000 137.000000 133.000000 
+132.000000 134.000000 135.000000 132.000000 128.000000 127.000000 
+129.000000 131.000000 131.000000 129.000000 129.000000 131.000000 
+135.000000 137.000000 138.000000 136.000000 135.000000 134.000000 
+134.000000 133.000000 132.000000 131.000000 129.000000 128.000000 
+129.000000 128.000000 127.000000 127.000000 131.000000 136.000000 
+137.000000 132.000000 127.000000 125.000000 125.000000 126.000000 
+126.000000 128.000000 129.000000 128.000000 127.000000 130.000000 
+136.000000 140.000000 137.000000 129.000000 122.000000 118.000000 
+117.000000 120.000000 123.000000 124.000000 124.000000 124.000000 
+126.000000 128.000000 130.000000 131.000000 131.000000 129.000000 
+127.000000 128.000000 130.000000 131.000000 129.000000 127.000000 
+127.000000 129.000000 131.000000 131.000000 130.000000 128.000000 
+
+VECTORS vectors float
+-0.004378 0.002406 0.001180 0.002841 0.001646 -0.006205 
+0.004199 0.000289 -0.011100 0.013644 -0.004274 -0.005507 
+0.001925 -0.002267 -0.001242 0.005098 0.000196 0.003922 
+0.000982 -0.005947 0.001546 0.004328 -0.003793 -0.000486 
+0.004758 -0.007544 -0.004990 0.004271 -0.006469 -0.017942 
+-0.001333 -0.002632 -0.013162 -0.003988 0.004950 -0.001376 
+0.000545 0.001598 0.001416 0.001481 -0.001598 -0.000156 
+0.003744 -0.000763 -0.002124 0.009997 0.002312 -0.007691 
+0.012328 -0.001952 0.002228 0.003674 -0.005631 -0.008021 
+-0.000687 -0.001388 -0.008669 -0.004658 0.000272 -0.002492 
+-0.001002 0.000630 0.001774 0.003051 0.000085 -0.000254 
+0.000987 0.000347 -0.002462 -0.001716 -0.011177 0.003865 
+-0.006541 -0.018701 -0.009884 0.003824 -0.016494 -0.004037 
+0.001131 -0.014476 -0.003036 0.003871 -0.005951 0.000273 
+0.008946 0.000875 0.000965 0.008623 0.008298 -0.002284 
+0.009421 0.004412 -0.006569 0.004290 0.007436 -0.008980 
+0.008069 0.014393 -0.010656 0.017337 0.025461 -0.019208 
+0.017721 0.035034 -0.017449 -0.000196 0.021519 -0.002104 
+-0.000177 0.006715 0.002804 0.001716 -0.001689 -0.001115 
+0.003078 -0.002279 -0.002715 0.002480 -0.000159 0.002763 
+0.002559 0.002684 0.007287 0.000569 0.004843 0.003482 
+0.000048 -0.000774 -0.000025 0.004918 -0.003667 -0.004465 
+0.001310 0.002784 -0.002670 0.007967 0.001012 -0.005311 
+0.019998 -0.006336 0.000159 0.016009 -0.005072 0.002331 
+-0.001627 -0.038194 0.002604 0.006586 -0.025592 0.010967 
+0.017019 0.002534 -0.023410 0.002938 -0.000154 -0.021624 
+-0.000590 -0.001009 -0.009239 -0.008727 0.001328 0.005735 
+-0.002597 0.001227 0.008279 0.002154 0.003772 0.001113 
+-0.003126 0.010236 0.001500 0.003586 0.031095 0.009018 
+0.043273 0.004291 -0.006985 0.021158 -0.015276 -0.010279 
+-0.014217 -0.044231 0.018640 0.019189 -0.007504 -0.026076 
+0.017697 0.035525 -0.106399 0.004913 0.027317 -0.030527 
+-0.002391 0.013032 -0.001548 -0.008743 0.003811 -0.001215 
+-0.009077 -0.000926 0.002800 -0.008869 -0.003186 0.011540 
+-0.002979 -0.001980 0.003817 -0.000535 0.016975 -0.012692 
+-0.000392 0.017298 0.003224 0.002995 0.000749 0.000303 
+-0.011322 -0.002189 0.020133 -0.001641 -0.011970 0.015467 
+-0.000142 -0.003788 0.000464 0.000624 0.003840 -0.002214 
+0.003279 0.002632 0.002186 0.003771 -0.003384 -0.002528 
+0.005453 -0.003099 -0.003086 0.009251 -0.000344 0.001615 
+0.012732 0.004233 0.002387 0.009630 0.010594 -0.001443 
+0.002073 0.007424 -0.002807 -0.014651 0.000944 -0.003776 
+-0.014640 -0.008044 -0.000924 -0.006670 -0.006774 -0.000597 
+-0.001872 -0.000052 -0.001003 -0.001248 0.003871 -0.000031 
+0.001824 0.005079 0.000434 0.002723 0.007021 -0.005807 
+0.001029 0.013480 -0.012917 0.010328 0.014882 -0.027154 
+0.008666 0.020096 -0.003224 0.002811 -0.004045 0.004693 
+0.001625 -0.007123 -0.002578 0.001267 -0.004724 -0.005526 
+0.004464 -0.000566 -0.007089 -0.000161 0.001130 -0.001292 
+-0.001414 -0.003823 0.009074 -0.005305 -0.010858 -0.001820 
+-0.002337 -0.003439 -0.010274 -0.000886 0.001618 -0.006022 
+0.002955 -0.002908 -0.005698 0.014907 0.004001 -0.002655 
+0.014762 0.002356 -0.003193 0.004971 -0.000291 -0.000549 
+-0.006454 -0.000669 0.004011 -0.009154 -0.001568 0.005793 
+-0.003074 0.000669 0.002320 -0.001318 0.007211 0.004208 
+0.003619 0.003799 0.004921 -0.002462 0.007068 -0.000588 
+-0.000860 0.009529 -0.001151 -0.004141 0.004155 -0.002304 
+-0.003370 -0.002910 -0.001751 0.000497 -0.007812 0.000552 
+-0.005552 -0.010278 0.004166 0.002530 -0.006953 0.003292 
+0.001996 -0.004021 0.001734 -0.005681 0.005214 0.005777 
+-0.016276 0.005970 0.006913 -0.023817 0.014603 0.011127 
+-0.010737 0.023457 0.009219 0.015836 0.005898 0.002601 
+0.022995 -0.009317 -0.009409 0.006032 -0.002348 -0.018144 
+-0.005248 0.005827 -0.006601 -0.004305 0.006303 0.000623 
+-0.002366 0.002297 0.001430 -0.003827 -0.000203 0.000070 
+-0.000795 0.001750 0.001638 -0.002956 0.011857 -0.005502 
+-0.002715 0.006317 -0.002451 -0.005034 0.000039 0.000460 
+-0.012330 0.000011 0.007479 -0.011479 -0.026205 0.019475 
+0.001689 -0.049899 0.047901 -0.042188 -0.029416 0.017802 
+-0.011961 0.006593 -0.046007 0.004552 0.005115 -0.014245 
+-0.000057 -0.000185 0.000342 -0.000294 0.002120 -0.000583 
+0.000309 0.002502 0.001815 0.006778 0.001273 -0.000972 
+0.013765 0.009224 -0.013094 0.015312 0.017026 -0.023177 
+0.008261 0.005229 -0.018073 0.000734 -0.002771 -0.003144 
+0.002116 -0.003517 -0.000699 -0.000860 -0.000808 0.007383 
+0.000596 0.006530 -0.001132 0.001076 0.005430 -0.003140 
+-0.000650 -0.002989 0.000552 0.002175 -0.003860 -0.002555 
+-0.000948 -0.002057 -0.002541 0.001574 0.001400 0.000745 
+0.003057 0.004364 -0.001499 0.002211 0.005343 -0.002466 
+0.001619 -0.000016 -0.003855 -0.003946 -0.008260 -0.000491 
+-0.007214 -0.008333 -0.002405 -0.002030 -0.003623 -0.001274 
+-0.000533 0.002598 -0.000033 0.005972 0.011762 -0.007829 
+0.007957 0.004545 -0.014647 0.000865 0.005392 -0.012757 
+0.003990 0.014381 -0.005345 0.002509 -0.000364 -0.003230 
+-0.011538 0.007128 -0.016544 -0.000275 0.002801 -0.009033 
+0.000857 0.004474 -0.002799 0.002363 -0.001111 0.000741 
+-0.002126 -0.007593 0.000902 -0.003552 -0.009857 0.004075 
+0.000424 0.004746 0.002424 0.000135 0.010595 0.002730 
+0.000427 0.002284 0.004873 0.005867 -0.003099 0.005987 
+0.001729 -0.000088 0.006784 0.001230 -0.005238 0.004761 
+0.010516 -0.009257 0.003691 0.005490 -0.000448 -0.013770 
+0.009331 0.000957 -0.010323 -0.002337 -0.001632 0.010347 
+0.003871 -0.007035 0.012612 0.009935 -0.002857 -0.000302 
+0.017372 0.007705 0.008158 0.015033 0.020607 -0.009191 
+0.004331 0.008755 -0.021535 -0.006891 0.000374 -0.006962 
+-0.008611 -0.004965 0.000621 -0.003261 -0.000354 -0.003444 
+0.000158 0.002409 -0.009492 -0.000554 0.002632 -0.011261 
+0.001986 -0.001324 -0.004294 0.005474 -0.003128 0.005000 
+0.007098 -0.001498 0.001563 0.009231 0.009096 0.003830 
+0.002990 0.008809 0.009921 0.007530 0.007226 0.016217 
+0.006348 0.003262 0.006564 -0.003789 0.003945 -0.001035 
+-0.005533 0.003302 -0.003398 -0.003179 0.003735 -0.000680 
+-0.001636 0.004550 0.001572 -0.005723 0.000186 0.001604 
+-0.001849 -0.004721 0.004398 0.001736 -0.005781 -0.000181 
+-0.001435 -0.008213 -0.004941 0.005670 -0.006838 -0.001209 
+0.000577 -0.007808 0.003692 0.002353 -0.014096 0.002236 
+-0.003958 -0.020388 -0.015507 0.007567 -0.007329 -0.027994 
+0.016966 0.005646 -0.019845 -0.002557 0.016335 0.018040 
+0.007160 0.003549 0.015031 0.006715 -0.010032 0.009453 
+0.000791 -0.002289 0.000216 0.003089 -0.001817 -0.001471 
+0.010372 0.002626 -0.011819 0.007922 0.002812 -0.004532 
+0.004493 0.000730 0.004059 0.005273 0.002204 0.001929 
+0.007876 0.002598 -0.009447 0.003055 0.001265 -0.009087 
+0.000607 -0.000869 -0.000766 0.000319 -0.000833 0.001059 
+0.002096 0.010717 -0.002746 0.003612 0.006306 0.005073 
+0.009034 0.001731 -0.000104 0.005784 -0.007526 0.005010 
+0.000842 -0.012111 0.012287 -0.004599 -0.012183 0.008249 
+-0.005167 -0.000275 0.001417 -0.004544 0.001140 0.002186 
+-0.000889 -0.005797 -0.000362 0.005510 -0.004155 0.001507 
+0.016792 0.004944 -0.003695 0.020862 0.009622 -0.013938 
+0.015073 0.007460 -0.009613 0.000510 0.008140 0.000408 
+-0.002600 -0.000519 0.000326 0.009772 0.000884 -0.011072 
+0.027515 -0.001831 -0.020173 -0.003581 0.023691 -0.011956 
+0.004821 0.013100 -0.013304 0.002237 0.003950 -0.004593 
+0.004289 -0.007093 0.002564 -0.009740 -0.009186 0.003801 
+-0.018288 -0.002599 0.013379 0.001624 -0.016029 0.010118 
+-0.000697 -0.011328 0.005151 0.001609 -0.003504 0.000369 
+-0.004107 -0.000612 0.006323 0.002167 0.004222 0.007813 
+0.010605 0.014504 0.002040 0.013221 0.026579 -0.003680 
+0.036253 0.036441 -0.008140 0.001736 -0.002480 0.005217 
+0.024987 0.004196 0.020832 0.026256 0.007432 0.008021 
+0.017273 0.012727 -0.001818 0.000751 0.018938 -0.014629 
+-0.024853 0.015696 -0.029444 -0.002631 -0.003488 -0.047796 
+-0.005189 -0.001793 -0.015945 0.000454 0.001915 -0.012977 
+0.003422 -0.001390 -0.018649 0.002610 -0.002745 -0.021775 
+0.006957 -0.009112 -0.015701 -0.003434 -0.003028 -0.018682 
+-0.013259 -0.001203 -0.016959 -0.010592 -0.001184 -0.007920 
+-0.004775 0.001852 0.003682 -0.002588 0.005049 0.012920 
+0.004060 -0.007911 0.007507 0.003553 0.005902 0.002268 
+0.001136 0.003078 0.001807 0.002670 -0.001124 0.001406 
+0.000991 -0.002011 -0.000747 -0.000486 -0.003763 0.003130 
+0.001472 -0.002685 0.000113 0.002592 -0.005065 -0.000775 
+-0.003108 -0.008698 0.000489 -0.007436 -0.003734 0.005730 
+-0.005065 0.002863 0.007194 0.001971 -0.003459 -0.004427 
+0.022052 -0.005913 -0.018957 0.009615 -0.013333 -0.009696 
+-0.012921 -0.014836 -0.009025 0.000630 -0.013902 -0.009797 
+0.002181 -0.009547 0.001720 0.005241 0.003586 0.004113 
+0.000939 0.006973 0.000020 -0.003482 0.005840 -0.001246 
+-0.005598 0.003942 0.002692 -0.003387 0.000423 0.006615 
+0.003926 0.002277 0.003023 0.009109 0.005690 -0.005650 
+0.003056 0.001033 -0.009064 -0.005326 0.003243 -0.002022 
+-0.003221 0.002981 0.001507 -0.001581 0.001521 0.000173 
+0.004259 0.000217 -0.000271 0.000357 -0.004444 0.004888 
+-0.003875 -0.010068 0.010307 -0.006051 -0.009451 0.005537 
+0.001862 0.003519 0.001483 0.001371 0.005998 0.003190 
+0.005530 0.009013 0.000378 0.005331 0.007971 -0.006128 
+0.010630 0.002805 -0.008891 0.018343 0.003859 -0.002815 
+0.009586 0.004876 -0.000021 -0.000670 0.000000 -0.000089 
+-0.006089 -0.001771 -0.002858 -0.004731 -0.003743 -0.004292 
+-0.012857 -0.003601 -0.002161 -0.006267 -0.001238 0.002940 
+-0.003130 0.005769 0.009087 -0.013382 0.013529 0.009853 
+-0.005052 -0.008561 0.004523 -0.009705 -0.010500 0.001933 
+-0.005902 -0.011765 0.002623 -0.001576 -0.015393 -0.000829 
+-0.005114 -0.016549 0.004389 -0.000708 0.000189 0.001291 
+0.004049 0.009030 -0.007643 0.006384 0.013151 -0.005476 
+0.003679 0.006394 -0.003681 -0.006772 0.000527 0.006700 
+-0.006450 -0.002692 0.011518 -0.001396 -0.000622 0.007863 
+0.006571 0.000707 -0.007072 0.010250 -0.001205 -0.003408 
+0.009474 0.005947 0.008495 0.005186 0.002830 0.001816 
+0.001960 -0.000633 -0.001027 0.008750 0.008281 -0.009219 
+0.020431 0.021065 -0.006523 0.010492 -0.001071 0.003854 
+-0.001324 0.000953 -0.000477 0.002483 -0.009301 0.001853 
+-0.013751 -0.019531 -0.015918 -0.025425 -0.029048 -0.015891 
+-0.048632 -0.001579 0.035053 -0.007959 0.014913 0.029781 
+0.006992 -0.002282 0.014028 0.002345 -0.000862 0.002929 
+-0.012439 0.001523 -0.000055 -0.005515 -0.007184 0.002468 
+-0.000111 0.002896 -0.002813 0.001435 -0.000267 0.004092 
+0.000779 -0.002550 0.002008 -0.001289 -0.002831 -0.000528 
+-0.000379 -0.002524 0.001675 0.002493 -0.003440 -0.001321 
+0.001799 -0.003230 -0.003652 0.004505 -0.004309 -0.014773 
+0.014552 0.013324 -0.016111 0.007189 0.007657 -0.006785 
+0.004788 0.004525 -0.006022 0.010602 0.005175 -0.005671 
+0.022791 0.004230 -0.001065 0.024227 0.003377 -0.004597 
+0.014327 0.008532 -0.008934 -0.000105 0.013158 0.000737 
+0.009329 0.007492 0.002610 0.001863 0.007574 -0.006207 
+-0.003205 0.002766 -0.006390 -0.003467 0.000227 -0.003880 
+-0.002225 -0.001965 -0.000861 -0.000844 -0.002370 -0.000416 
+-0.000446 -0.000696 -0.000867 -0.000673 -0.000435 -0.000744 
+-0.002895 0.000041 0.001481 -0.000837 0.001034 0.002860 
+0.000530 -0.000379 0.000927 -0.002578 -0.000348 -0.002868 
+0.001875 -0.002985 0.002559 -0.000022 -0.003776 0.002776 
+-0.001618 -0.007365 0.002968 -0.000056 -0.006763 0.000736 
+0.000914 0.001244 0.000368 0.003111 0.006861 -0.000131 
+0.005982 0.009419 -0.007235 0.010658 0.009001 -0.013843 
+0.014310 0.001313 -0.005758 0.004319 -0.005648 -0.002525 
+0.008149 0.009643 -0.004156 0.003605 -0.002871 0.008079 
+-0.003167 -0.010182 0.018464 -0.005241 -0.011190 0.011721 
+-0.007763 -0.003202 -0.002890 -0.005466 0.002308 0.001608 
+-0.005346 -0.001210 0.003473 -0.004316 -0.004351 0.000241 
+0.014793 -0.001775 -0.006558 0.013569 0.010870 0.008552 
+0.013569 0.005781 0.005257 0.001409 -0.011874 0.010384 
+-0.005533 -0.022839 0.015862 -0.007924 -0.021151 0.012291 
+0.001048 0.004222 -0.013825 0.005150 0.013331 -0.016949 
+0.003429 0.010087 -0.014588 0.000684 0.005188 -0.007503 
+0.002453 0.003371 -0.002379 0.000525 -0.005495 -0.005232 
+-0.000124 -0.003261 -0.006960 0.002052 0.000708 -0.004244 
+-0.000296 -0.000365 -0.000049 -0.001635 0.000642 0.001620 
+0.001618 0.001649 0.000670 0.006161 0.003119 -0.002523 
+0.010706 0.003568 -0.001431 -0.001800 0.001357 0.002802 
+-0.004438 0.002036 0.001874 -0.005754 -0.000563 0.001457 
+-0.011292 -0.005358 -0.002685 -0.014372 -0.002623 -0.002590 
+-0.006673 -0.004314 0.011593 -0.002583 -0.009930 0.024300 
+-0.001867 -0.013997 0.022157 -0.000022 -0.009968 0.009090 
+-0.002399 -0.003486 -0.000928 -0.001872 -0.003262 0.002464 
+-0.005626 -0.010075 0.011579 0.002356 -0.010244 0.006008 
+-0.003642 -0.009207 -0.000953 -0.008175 -0.005529 -0.001295 
+-0.005637 0.002496 -0.000109 0.000595 -0.000807 -0.003179 
+0.008629 -0.012269 -0.005133 0.038535 -0.017003 -0.017713 
+0.027580 0.006668 -0.025305 0.012643 0.005510 -0.013449 
+0.005456 0.008110 -0.012269 0.016943 0.016915 -0.011541 
+0.013579 0.019947 0.007947 0.013255 0.013304 0.003799 
+0.014761 0.014419 -0.007764 0.013278 0.015415 -0.009818 
+0.006935 0.008363 -0.014077 -0.000642 -0.019581 -0.031460 
+-0.015276 -0.011779 -0.013657 -0.007368 -0.007570 -0.001467 
+-0.002325 -0.003093 0.000145 -0.000362 -0.002936 0.001061 
+0.001280 -0.004195 -0.001559 -0.001918 -0.000819 -0.000380 
+-0.004072 -0.000724 0.001258 -0.004923 0.001107 0.000870 
+-0.000429 0.000229 -0.000457 0.000880 0.000855 -0.000209 
+0.010605 -0.000950 -0.008864 0.009717 0.002220 -0.011644 
+-0.009430 -0.003812 0.000150 -0.015744 -0.013493 0.008244 
+-0.007435 -0.003864 0.000834 0.003816 0.009524 -0.006287 
+0.015571 0.012125 -0.010472 0.020528 0.010068 -0.005143 
+0.009508 0.006761 0.000535 0.000506 0.005740 0.000844 
+-0.001558 0.004865 -0.000774 0.000133 -0.000643 -0.001440 
+-0.001963 -0.001383 -0.003502 -0.002826 -0.000883 -0.003216 
+-0.002795 -0.002450 0.001840 -0.003858 -0.005393 0.003081 
+-0.002979 0.003081 0.000181 0.003920 0.000035 -0.000373 
+0.014922 -0.002503 -0.007019 0.018691 0.003453 -0.013897 
+0.013562 -0.012209 -0.012202 0.036217 0.005296 -0.007850 
+0.023612 0.015390 -0.011413 0.005683 0.001801 0.003780 
+-0.000426 0.001011 0.000376 -0.010444 -0.001134 0.000206 
+-0.012362 0.005991 0.000569 -0.007179 0.000000 -0.011026 
+-0.004076 0.008187 -0.010201 -0.003809 -0.000179 -0.002708 
+-0.005612 -0.001343 0.001699 -0.008603 0.002113 -0.000251 
+-0.005881 0.001462 -0.007336 -0.000481 0.012967 0.002118 
+0.015524 0.017813 0.001167 0.013695 0.016046 -0.003683 
+0.003152 0.003166 0.000417 -0.002321 -0.002669 -0.003565 
+0.002582 -0.002587 0.001576 -0.002881 0.004400 0.001711 
+-0.004613 0.005475 0.013259 0.003655 0.002730 0.002624 
+0.010331 0.008479 -0.016800 0.008852 0.019481 -0.021259 
+0.000988 0.002403 0.000674 -0.004870 -0.019318 0.025974 
+0.001268 -0.019325 0.015881 -0.004954 -0.005390 0.001763 
+-0.000001 0.001289 0.004309 -0.009273 -0.003030 0.003394 
+-0.002484 -0.005766 0.002236 -0.004052 -0.005375 0.001065 
+-0.000167 0.000123 0.000074 -0.000594 0.000998 -0.001500 
+0.000072 0.003158 0.001558 0.020912 -0.011078 0.025936 
+-0.016151 0.001508 0.000079 0.007271 -0.001459 -0.003746 
+0.046365 0.019069 -0.001870 0.009771 0.047663 -0.010315 
+-0.005971 0.020385 -0.003418 0.006807 0.017585 -0.007412 
+0.002362 -0.000269 -0.005180 -0.018379 -0.006103 0.011344 
+-0.013628 -0.001798 0.007902 -0.013535 -0.002433 -0.002180 
+-0.003507 0.000984 -0.006665 0.000683 0.002609 -0.000997 
+-0.000103 -0.000236 -0.000010 -0.000782 -0.001206 -0.000309 
+0.000058 -0.001458 0.000165 0.002220 -0.000980 0.000134 
+0.003844 0.000351 -0.001271 0.003794 0.002781 -0.001165 
+0.003630 0.006478 0.000266 0.006872 0.006278 0.002672 
+0.003000 -0.007286 0.001714 -0.001276 -0.017276 0.004281 
+-0.004211 -0.015421 -0.009789 -0.002601 0.009312 -0.010938 
+0.003103 0.017995 -0.014316 0.007134 0.018219 -0.010049 
+0.010933 0.011255 -0.001720 0.005750 0.004879 -0.000342 
+-0.006940 0.006413 -0.000848 -0.014707 0.010404 0.001434 
+-0.006221 0.009031 0.005905 -0.004153 -0.005045 -0.005339 
+-0.004319 -0.000852 -0.001859 0.012098 0.004907 -0.010519 
+0.003369 0.007901 -0.016034 -0.000091 0.004524 -0.000590 
+-0.003292 -0.007985 0.003129 -0.011965 -0.013523 0.010282 
+-0.007089 -0.010166 0.007327 0.004320 0.004517 0.001381 
+0.011628 0.009157 -0.001703 0.004562 0.009983 -0.004928 
+-0.000945 0.005607 0.000932 0.001946 0.001761 0.000410 
+-0.002262 -0.002849 0.015594 -0.004624 -0.007305 0.017953 
+-0.005048 -0.002555 0.004762 0.000738 0.010743 -0.005774 
+0.003156 0.009933 0.000660 0.004809 -0.000069 -0.000429 
+-0.002854 -0.014031 0.007272 0.002455 -0.008821 0.021051 
+-0.011117 -0.009037 0.004960 0.004155 0.004663 -0.009018 
+0.011826 0.004273 -0.003366 0.008587 -0.000305 -0.006056 
+-0.005415 -0.001921 0.000236 -0.004241 -0.005347 -0.001217 
+-0.002334 -0.011077 0.008495 -0.000919 -0.012072 0.006604 
+-0.001699 0.002321 0.002615 -0.005174 0.004220 0.004324 
+-0.001327 0.003045 0.003179 0.009049 0.011637 -0.017446 
+0.006049 0.006409 -0.003265 0.004609 -0.015115 0.005089 
+0.006717 -0.016211 0.008332 -0.008669 -0.011924 -0.000680 
+-0.001295 -0.007655 0.002612 -0.018970 -0.012114 0.004640 
+-0.001226 -0.005353 -0.003462 -0.001494 0.000262 -0.001534 
+0.005723 0.001627 -0.003709 0.000484 0.004943 -0.003850 
+-0.001934 -0.004421 -0.001723 -0.020271 -0.039371 0.034104 
+-0.012137 -0.001100 0.028752 0.013848 0.001793 -0.006749 
+0.004451 -0.004696 0.008891 0.002440 -0.010183 -0.003225 
+-0.008232 -0.012071 0.001919 -0.006477 -0.004504 0.005799 
+-0.027957 -0.012796 0.001183 -0.021765 -0.001471 0.022941 
+-0.013750 -0.013750 0.000000 0.001697 0.014000 -0.007352 
+-0.003847 0.030804 -0.013860 -0.002478 0.020441 -0.008856 
+-0.000802 0.010973 -0.004507 -0.000859 0.005335 -0.002645 
+-0.001328 -0.000649 -0.000233 -0.001572 -0.006533 0.002278 
+-0.001008 -0.009190 0.002081 -0.001417 -0.003378 -0.000876 
+0.001867 0.000955 0.002428 0.004092 0.001256 -0.000501 
+-0.006328 -0.006258 0.009025 -0.006479 -0.006105 0.006367 
+0.001507 0.002240 -0.003158 0.010536 0.001428 -0.000960 
+0.000181 -0.001355 0.000342 -0.008775 -0.006522 -0.001161 
+-0.016426 -0.003111 0.000821 -0.014655 0.002905 0.004951 
+-0.014484 0.005325 0.002784 -0.012891 -0.005494 0.006687 
+-0.004722 -0.015180 0.006747 0.008835 -0.003625 0.006002 
+0.010073 -0.005147 -0.004707 0.007555 -0.005210 -0.010685 
+0.006100 -0.001588 0.001684 -0.002785 0.004681 0.001949 
+-0.004849 0.008881 -0.001607 0.011608 0.009094 -0.024766 
+-0.005238 0.010476 -0.022619 0.005882 -0.002139 -0.010870 
+0.002932 0.001056 0.002808 -0.002831 -0.004201 0.011538 
+0.004929 0.003154 0.000086 0.014023 0.026092 -0.019080 
+0.009980 0.033724 -0.009132 0.003038 0.007178 0.004663 
+0.001786 0.001090 -0.004477 -0.000207 0.005071 -0.009890 
+-0.001089 0.004171 -0.006306 -0.002203 0.000531 -0.001209 
+0.004075 0.006057 -0.003830 0.016838 0.004057 -0.006857 
+-0.004286 0.007381 -0.010000 0.000493 0.006623 -0.002798 
+0.008560 -0.002109 0.002713 -0.001553 0.000603 0.001380 
+-0.001094 0.006565 0.003879 -0.006822 0.014304 -0.009337 
+-0.000026 0.010495 -0.007063 -0.000632 0.002172 0.000545 
+0.002507 0.000042 0.000681 0.011164 0.004543 -0.004927 
+0.008307 0.011461 -0.017831 -0.002112 0.006758 -0.018947 
+0.010115 0.007438 -0.011131 -0.000247 0.006775 -0.001347 
+0.003853 0.006719 0.001540 0.003004 0.002725 -0.003174 
+-0.000396 -0.001097 0.000877 -0.005395 -0.005104 -0.005177 
+-0.006343 0.000470 -0.011422 -0.003195 -0.000587 -0.003458 
+0.009195 -0.001204 -0.003420 0.003001 0.001322 -0.008807 
+0.000450 0.002342 -0.002636 0.004921 0.002646 0.006878 
+0.007490 0.008547 0.018739 0.001988 0.011755 0.013494 
+-0.022200 -0.003176 0.002428 -0.032511 -0.035573 0.011175 
+0.001148 -0.019933 0.015372 0.018400 -0.004280 -0.012840 
+0.005628 0.007287 -0.001233 -0.013454 0.005956 0.014005 
+-0.022828 0.007374 0.003232 -0.000651 0.015000 0.000586 
+-0.023958 0.009375 -0.012083 -0.007727 0.005863 -0.016112 
+-0.005768 -0.002688 -0.005387 -0.001282 0.002136 -0.003292 
+0.006144 0.006108 -0.003782 0.005575 0.003982 -0.001094 
+0.002379 -0.002179 0.002012 0.001417 -0.005660 0.001323 
+0.000728 -0.004054 -0.000600 0.000828 -0.002054 -0.000823 
+-0.002148 0.002404 -0.002419 0.001222 0.003419 -0.000849 
+0.002882 0.004959 0.002585 0.008308 0.004501 -0.008930 
+-0.001010 -0.006519 -0.001405 -0.008372 -0.013023 -0.005581 
+-0.018240 -0.009979 -0.002822 -0.002506 -0.007500 0.002864 
+0.005789 -0.007895 -0.011053 0.013083 -0.008316 -0.001983 
+-0.005308 -0.011316 -0.003213 -0.010146 -0.007388 -0.006666 
+-0.004533 -0.002769 -0.006862 0.003107 -0.002047 0.000048 
+0.000638 -0.000533 -0.000338 -0.009292 -0.003086 0.001166 
+-0.012064 -0.001802 -0.003882 -0.002416 0.002242 0.000740 
+-0.002133 0.003707 0.004747 -0.002921 0.002433 0.005547 
+0.002140 0.001015 0.004639 0.005579 0.002169 0.005400 
+0.007141 0.001790 0.002343 0.006347 0.004922 -0.010851 
+0.006194 0.011366 -0.020151 0.006934 0.008452 -0.013690 
+0.002612 -0.001668 0.006376 -0.007500 -0.008750 0.020625 
+-0.013572 -0.004509 0.019777 -0.006370 0.010238 0.008644 
+-0.006380 0.002181 -0.004117 0.019712 0.003416 -0.010176 
+0.007750 -0.006494 -0.007576 0.001257 -0.003210 0.001187 
+0.008038 -0.005102 0.006056 0.004934 -0.003934 -0.000400 
+0.001001 0.002728 -0.002044 -0.002423 0.002299 0.000011 
+0.001022 0.003367 0.002690 0.002669 0.006547 0.002818 
+0.005793 0.006237 -0.000876 0.004785 0.001701 -0.004971 
+0.003162 -0.000204 -0.008432 0.003736 0.004016 -0.012174 
+-0.000303 0.007677 -0.008434 -0.001885 -0.000721 -0.001515 
+0.000786 -0.006034 0.006319 0.009516 -0.010448 0.006080 
+0.001543 -0.004726 0.001839 -0.005327 0.005876 -0.012194 
+-0.009597 0.012546 -0.009291 -0.005047 0.008603 -0.003665 
+0.000618 0.003643 -0.001541 0.002498 -0.001111 -0.002408 
+0.002515 -0.006417 -0.002082 -0.000095 -0.009611 -0.004326 
+0.003085 -0.003635 -0.000847 -0.003211 0.000376 0.000350 
+-0.012829 -0.006793 0.008458 -0.012558 -0.015603 0.018013 
+-0.000867 -0.002533 0.005933 0.002702 0.000933 -0.004335 
+-0.000817 0.002708 0.003921 -0.006452 0.000000 -0.001290 
+-0.009190 -0.002500 0.000438 0.000217 0.000225 -0.000023 
+0.001278 0.003064 -0.000434 -0.009500 -0.001999 -0.003008 
+-0.014157 -0.001503 0.017504 -0.012442 -0.002490 0.017384 
+-0.004939 -0.004296 0.007359 0.000406 0.000376 -0.000084 
+0.001889 0.002023 -0.000337 0.002264 0.000384 0.000721 
+0.001304 -0.001087 0.000922 0.000454 -0.000487 0.000243 
+0.001498 -0.000966 0.002349 0.003579 -0.006673 0.003721 
+0.009250 0.003716 0.004803 0.005583 0.005134 0.005564 
+-0.013882 -0.011539 0.000836 -0.018994 0.008460 0.005154 
+-0.018682 -0.014440 0.020599 -0.000254 -0.002032 0.004884 
+0.009458 0.007147 -0.012979 0.004167 -0.000784 -0.000196 
+-0.016579 0.002579 -0.006474 -0.017885 -0.002697 -0.004691 
+-0.005633 -0.003283 -0.002458 0.005061 0.001373 0.002954 
+0.011719 0.003313 0.002767 0.013644 0.002819 -0.003390 
+0.011656 -0.004123 -0.003370 0.004909 -0.006729 -0.003911 
+-0.001199 -0.005558 -0.005616 -0.002981 -0.003726 -0.001192 
+-0.002409 -0.001695 0.000657 -0.004730 0.000434 0.001388 
+-0.006238 0.001248 0.005770 -0.006418 -0.000954 0.004857 
+-0.003850 -0.001392 0.001306 0.000103 -0.000022 0.000092 
+-0.000600 0.000098 0.000788 -0.001653 0.004273 0.006685 
+-0.003581 0.002412 0.001800 0.003443 -0.007524 0.005590 
+0.007406 0.005788 -0.000927 0.013220 0.005081 0.001439 
+0.010612 -0.003108 -0.003330 0.004888 -0.001719 -0.000946 
+0.005028 0.003828 -0.003936 0.001777 -0.000212 -0.004196 
+0.000130 -0.000207 0.003590 0.006350 -0.001498 0.010324 
+0.002477 0.001930 0.005118 0.002055 0.008445 0.000353 
+0.006715 0.007677 -0.002694 0.006668 -0.005505 -0.001492 
+-0.007265 -0.011925 0.001357 -0.009928 -0.014841 0.015451 
+-0.008125 -0.008125 0.016250 0.008701 -0.009664 0.005890 
+0.007539 -0.004244 0.005621 0.006122 -0.001248 0.000312 
+0.003956 0.002137 0.003152 -0.001155 0.002230 -0.006371 
+-0.006635 -0.003481 -0.004811 -0.013434 -0.006327 0.000612 
+-0.011558 0.001830 0.007003 -0.006014 0.007988 -0.002705 
+-0.005278 0.006811 -0.012006 -0.001350 0.003200 -0.002125 
+0.006704 -0.002113 0.002689 0.012802 -0.000133 -0.008064 
+0.007498 0.002248 -0.012814 0.002185 0.004338 -0.000554 
+-0.001890 0.004095 0.011341 0.002548 0.002183 0.012918 
+-0.009089 -0.027574 -0.003055 -0.012727 -0.031632 0.002751 
+-0.018187 -0.020815 0.005513 -0.016288 -0.004048 0.009948 
+-0.000362 0.007754 -0.001884 0.011567 0.016878 -0.003552 
+0.000066 0.011195 -0.001921 -0.013649 -0.001246 0.017091 
+-0.024755 -0.010574 0.025125 -0.011840 -0.014266 0.019251 
+-0.000044 -0.005357 0.007663 0.001010 -0.001125 0.001996 
+-0.002614 -0.002110 0.001600 -0.005450 -0.002787 0.002997 
+0.000797 0.001158 0.005438 0.005043 -0.006526 0.005297 
+0.009973 0.001638 0.005555 0.001727 0.021449 0.011594 
+0.001257 0.000021 0.007694 0.004094 -0.001998 0.002037 
+-0.007585 0.003044 0.003090 -0.008236 -0.001277 0.011187 
+-0.001053 -0.001204 -0.000500 0.003447 0.012499 -0.010561 
+0.010225 0.014716 0.002618 0.007378 0.008760 -0.005074 
+0.004360 -0.007625 0.010227 0.002390 -0.008640 0.003656 
+-0.000526 -0.004671 0.001384 0.001573 -0.002779 0.000203 
+-0.003548 -0.002255 -0.002805 -0.008774 0.002742 -0.006580 
+0.010395 0.013725 -0.003438 0.009058 0.004996 -0.017935 
+0.005832 -0.000995 -0.002847 0.003811 -0.004080 0.004279 
+0.000384 -0.000320 0.000005 -0.004986 -0.001321 0.002262 
+-0.001065 -0.001152 0.001362 0.001900 0.005028 -0.003686 
+-0.002381 0.003714 -0.000190 0.000614 0.001505 0.004752 
+0.007570 0.002269 0.009187 0.003805 0.003961 0.005726 
+-0.002775 -0.003607 0.002439 -0.001581 0.000810 -0.001889 
+0.002412 0.004788 0.001768 0.005776 0.009409 0.001589 
+-0.000271 0.009999 0.003754 -0.002355 0.004477 0.012238 
+-0.002140 0.001795 0.010700 -0.001239 0.006535 0.004399 
+-0.002454 0.013239 -0.000330 -0.003031 0.013509 -0.000842 
+-0.002506 0.006114 0.000150 -0.002057 -0.000912 -0.000072 
+-0.004190 -0.003048 0.001905 -0.002395 -0.002450 0.006531 
+0.002715 0.000610 0.003525 0.006120 -0.003270 0.001373 
+0.007414 -0.002929 -0.001314 0.001404 -0.000761 -0.010109 
+-0.005233 0.000233 -0.008721 -0.003613 -0.003793 -0.002593 
+-0.000947 -0.001762 -0.001254 -0.000667 -0.004709 -0.000549 
+-0.000638 -0.001347 0.002114 -0.005902 0.010028 -0.008270 
+-0.003836 0.021580 0.004116 -0.006906 0.015554 -0.010295 
+-0.003185 0.005398 -0.002267 0.006038 -0.003381 -0.003156 
+0.007701 -0.010676 -0.006010 0.003563 -0.001393 0.000194 
+-0.006328 0.006675 -0.002563 -0.011521 -0.000006 0.001153 
+-0.000184 -0.004063 0.002632 0.010181 -0.008604 0.001757 
+0.012663 -0.018160 -0.002833 0.002419 -0.008735 0.001053 
+-0.006501 0.002320 -0.004089 -0.004737 0.002054 0.000980 
+-0.001803 0.000052 0.002766 -0.010130 -0.012440 0.007641 
+-0.001364 -0.035000 -0.001364 -0.003432 -0.024741 0.009660 
+0.001973 -0.007995 0.008202 -0.001323 -0.009088 0.005829 
+0.000304 -0.007206 0.008176 0.005524 -0.002720 0.005041 
+-0.000618 0.002543 0.002601 -0.001053 0.001754 -0.000526 
+0.005535 -0.012051 0.016388 0.016088 -0.017855 0.020894 
+0.004586 -0.015894 -0.003892 -0.008562 -0.015860 0.036174 
+-0.005063 -0.027160 0.015787 -0.015734 -0.018465 0.001659 
+-0.003551 -0.005478 -0.003274 0.005346 0.002954 -0.006045 
+0.003038 0.001774 -0.000593 -0.004172 -0.004949 0.005046 
+-0.002164 -0.007076 0.001374 0.003674 -0.001649 0.003604 
+0.005607 -0.003316 0.006291 -0.005561 -0.010903 0.010046 
+-0.009277 -0.014673 0.002402 -0.009397 -0.001081 -0.002367 
+-0.000998 0.005397 -0.008251 0.009267 0.012556 -0.007644 
+0.000309 0.003426 0.006460 -0.000396 0.003270 0.003284 
+-0.003551 -0.000114 -0.001222 -0.003536 0.000559 0.000617 
+0.002967 0.003864 0.000894 0.002668 0.003830 0.000270 
+-0.009526 -0.004610 0.008393 -0.014932 -0.016401 0.023045 
+-0.015962 -0.015890 0.015795 0.007541 -0.004632 0.001293 
+0.009512 -0.005782 -0.011266 -0.001149 0.002790 -0.006644 
+-0.002532 0.005741 -0.002814 -0.003519 0.004602 0.001993 
+-0.001303 0.002183 0.003755 -0.002420 -0.002231 0.012479 
+0.002735 0.003932 0.004701 0.000238 0.005476 0.001667 
+-0.005094 0.009578 -0.012494 -0.008462 -0.000261 -0.008629 
+-0.004738 -0.006330 -0.003854 -0.002431 -0.003966 0.002037 
+-0.003179 0.004266 -0.006021 -0.006970 0.001332 -0.010101 
+-0.004661 0.006804 -0.007103 0.001864 -0.000996 0.001005 
+0.005915 -0.008041 0.001638 0.010297 -0.014220 -0.003924 
+0.015876 -0.015965 -0.009776 0.001024 -0.004956 0.001483 
+-0.002742 0.000916 -0.004210 0.004352 -0.000418 0.000119 
+0.002585 -0.001505 -0.003850 0.000906 -0.003318 -0.003329 
+0.010766 0.008008 -0.010728 -0.001500 0.011750 -0.017500 
+-0.008924 0.009834 -0.011475 -0.006683 0.009720 -0.008710 
+0.002533 0.011067 -0.016133 0.002744 0.000326 0.002724 
+-0.008828 0.000790 -0.002548 -0.018206 -0.000323 0.004965 
+-0.010754 0.003016 0.009246 0.004014 -0.003793 -0.005352 
+0.009062 0.009844 -0.009844 0.012126 0.002529 -0.017184 
+0.001526 0.011143 -0.009180 -0.001711 0.014868 -0.005000 
+-0.009215 0.008807 0.003869 -0.011658 0.001102 0.009699 
+-0.010252 0.002207 0.016374 -0.004523 0.004219 0.012589 
+-0.002652 0.005307 0.004513 -0.000378 0.001328 0.000875 
+-0.001132 -0.005566 -0.001517 0.001088 -0.008614 -0.004194 
+-0.000543 0.003918 0.000762 -0.005144 0.004665 0.001947 
+-0.008948 -0.007080 0.002552 -0.009106 -0.009147 0.005804 
+-0.016465 -0.008789 -0.002069 -0.045275 -0.018901 0.000842 
+-0.038323 -0.014695 0.049491 -0.002121 -0.023920 0.020891 
+-0.004974 -0.005930 -0.000556 -0.001965 -0.004100 -0.001358 
+0.001887 -0.000195 -0.008457 0.002118 0.002644 -0.002896 
+-0.000845 0.001371 0.001773 0.005543 -0.008706 0.004677 
+0.007767 -0.008533 0.010633 0.008619 -0.007706 0.009126 
+0.008222 -0.001845 0.002108 0.008370 0.002740 -0.004085 
+0.012609 0.016304 -0.003696 0.005929 0.017036 -0.002417 
+0.002254 0.012268 -0.004631 -0.002676 0.004443 -0.003193 
+-0.007010 -0.002991 -0.000477 -0.004554 -0.004042 0.000506 
+0.001891 -0.001859 -0.000370 0.001287 -0.004704 0.000705 
+-0.007346 -0.014324 0.012584 -0.017116 -0.024232 0.005399 
+-0.006220 -0.006551 -0.009116 -0.004912 -0.002420 -0.008825 
+-0.001344 -0.001372 -0.007297 -0.001176 0.000098 -0.004216 
+0.001215 0.005132 -0.002860 0.004659 0.003146 -0.003927 
+0.002474 -0.001571 -0.002929 -0.000280 0.000455 0.004485 
+-0.004474 -0.000469 0.002817 -0.002610 0.004098 -0.003783 
+-0.003044 -0.005806 -0.005037 0.001307 -0.012081 -0.001578 
+0.003274 -0.012505 0.002170 0.004587 -0.005928 0.001255 
+0.002391 -0.000323 -0.006903 0.007315 0.007266 -0.009656 
+-0.004129 0.004520 -0.004491 0.004000 0.006000 -0.004000 
+-0.002450 0.002965 -0.012523 -0.012509 0.005757 -0.027303 
+-0.001749 0.001401 0.005583 0.002815 -0.002750 0.005236 
+-0.001685 0.000567 -0.001581 -0.000394 0.003174 0.000396 
+-0.001200 0.000162 0.002493 0.001632 -0.002923 0.012768 
+-0.007579 -0.012966 0.007046 0.004323 -0.003195 -0.009286 
+-0.007536 -0.000970 -0.012273 -0.003723 0.008307 -0.000047 
+-0.005458 0.008861 0.002695 0.005838 0.004686 0.009455 
+-0.002286 0.001088 0.000973 -0.009853 -0.004563 0.005922 
+0.000000 0.003103 0.002759 -0.004828 0.008220 -0.001370 
+-0.006748 -0.003212 -0.007390 0.003598 -0.016191 -0.003750 
+-0.011111 -0.007556 0.002111 0.004799 0.032091 -0.010888 
+-0.003670 0.024545 -0.003806 -0.004496 0.008282 0.000599 
+-0.005609 0.002029 0.001237 -0.004612 0.002797 0.004571 
+0.003879 0.004485 0.000121 0.004000 0.002000 0.000000 
+-0.007917 -0.008169 -0.001841 -0.016056 -0.016254 0.013290 
+-0.003273 -0.002364 0.000545 -0.008107 -0.002670 0.003786 
+-0.008636 -0.003547 0.005356 -0.002165 0.002500 0.000590 
+0.009341 0.016098 -0.011345 0.014827 0.040512 -0.017815 
+0.017104 0.025884 0.017443 -0.009784 0.005978 0.033737 
+0.001455 -0.012401 0.014557 0.001589 -0.003076 0.002215 
+-0.002414 -0.002187 0.002172 -0.006678 -0.007234 0.003498 
+-0.015885 -0.012924 0.001903 -0.023254 -0.014330 0.001172 
+-0.010302 -0.019598 0.015828 0.002415 -0.003348 0.009298 
+0.008428 0.000386 0.001527 0.007466 0.008312 -0.003804 
+0.005743 0.011838 -0.005300 0.001103 0.005753 -0.005350 
+-0.002107 0.002448 -0.005123 -0.000346 0.003149 -0.006598 
+-0.000440 0.005236 -0.007049 -0.000349 0.006292 -0.004754 
+-0.001168 0.004875 -0.002269 -0.003089 0.001833 0.002710 
+0.000821 -0.005736 0.005460 0.007846 -0.005496 0.008237 
+0.002707 -0.002814 0.002220 -0.001988 0.001879 -0.000389 
+-0.003148 0.004727 0.002224 0.003305 0.004097 0.001354 
+0.005023 0.006415 -0.007311 0.007202 -0.003297 0.002113 
+0.006308 0.006678 0.007668 -0.002594 0.000288 0.000000 
+-0.006875 0.001780 0.001071 -0.004684 0.006736 -0.000845 
+0.000194 -0.001430 0.000971 0.004085 -0.004383 0.004887 
+0.005180 -0.004584 -0.002550 0.000309 0.007795 -0.013668 
+0.008458 -0.001161 -0.003332 -0.008229 0.010117 0.004829 
+-0.006024 0.009263 0.004951 -0.001750 0.003713 0.004237 
+0.000938 0.007660 0.000718 -0.036283 0.005085 0.013261 
+-0.007660 0.013996 0.013395 0.002367 0.004911 0.009941 
+0.001256 -0.000461 0.000081 -0.001041 -0.004411 0.006503 
+0.002398 -0.005265 0.013254 0.007907 -0.003343 0.005071 
+-0.000766 -0.002941 0.008819 0.000183 -0.002784 -0.003443 
+0.002981 -0.002054 -0.009183 -0.004317 0.006960 -0.007446 
+-0.001029 0.005647 -0.004408 0.000381 0.003221 0.000075 
+-0.002475 -0.000621 0.000412 -0.003606 -0.002020 0.001913 
+-0.007894 -0.001730 0.004239 -0.009760 -0.001852 0.010098 
+-0.018203 -0.009263 0.004793 -0.021335 -0.010314 0.001789 
+-0.013720 0.001870 -0.003760 -0.011480 0.010323 -0.006327 
+-0.004082 0.008605 -0.003896 0.001483 0.003606 -0.001509 
+0.008579 0.001315 -0.001645 0.009464 -0.001164 0.000436 
+0.003648 -0.002314 0.002136 -0.000723 -0.004885 -0.002276 
+-0.001076 -0.007172 -0.002122 -0.000246 -0.005951 -0.001888 
+0.000252 -0.004403 -0.004654 0.003168 -0.001258 -0.002385 
+0.002436 0.001412 0.002114 0.005304 0.004216 0.003332 
+0.007019 0.002791 0.004325 -0.000310 0.002875 0.001060 
+-0.011811 0.008868 -0.015271 -0.131696 0.020478 0.034258 
+-0.004399 0.001929 0.011666 -0.002695 -0.000192 0.010228 
+0.000111 -0.007274 0.008952 -0.004291 -0.005883 -0.001075 
+-0.011653 -0.006243 -0.000183 -0.006721 -0.007214 0.009208 
+0.002642 -0.014038 0.018387 -0.000707 -0.015051 0.030808 
+-0.012458 -0.025759 0.018281 -0.013377 -0.009868 0.002864 
+-0.000973 0.006900 -0.006063 0.007350 0.005771 -0.009576 
+0.009108 0.004616 -0.011835 0.002239 0.007046 -0.014152 
+-0.001954 0.004886 -0.011669 -0.003862 0.003817 -0.008199 
+-0.010515 0.004710 -0.004731 -0.009936 0.011213 0.004953 
+-0.012117 0.001423 0.005103 -0.006326 0.005530 0.004735 
+0.000313 0.008224 0.004945 0.002400 0.008000 0.001200 
+-0.002379 0.004746 -0.000476 -0.003250 0.000883 0.001437 
+0.004812 0.003151 -0.002372 0.014884 0.006765 -0.007755 
+0.005699 -0.000155 -0.010314 -0.001446 0.000044 -0.001992 
+-0.007743 -0.003977 -0.000866 -0.005918 -0.007215 0.003473 
+0.003579 0.004210 -0.006602 0.013086 0.003635 -0.017209 
+0.000000 0.009362 -0.022979 -0.006738 -0.004963 -0.013690 
+-0.007543 -0.003008 -0.006244 -0.008405 0.001849 -0.000154 
+-0.006377 0.001386 0.000433 -0.002067 -0.001303 0.003267 
+-0.003435 -0.006974 0.003123 -0.001685 0.000215 -0.000745 
+0.002310 0.002747 0.004081 0.004073 0.002089 0.001674 
+-0.001800 -0.005529 0.008190 0.002094 -0.003577 0.009607 
+0.009222 -0.011795 0.005076 -0.003038 0.000314 0.006574 
+-0.000633 0.000626 0.000093 -0.009397 -0.002542 0.000591 
+-0.005406 -0.007777 0.007651 -0.003989 -0.005436 0.002192 
+-0.004147 -0.000162 -0.009039 -0.009914 -0.016395 -0.004830 
+-0.019701 -0.013405 -0.003000 -0.012791 -0.001204 0.003664 
+0.007918 0.000408 -0.001959 0.010799 -0.004462 -0.007484 
+-0.000011 -0.002263 -0.007558 -0.011728 0.000332 -0.010066 
+-0.012532 -0.001573 -0.019218 -0.009002 -0.008177 -0.015866 
+0.000221 -0.001597 0.000183 0.002372 -0.006382 0.005166 
+0.004902 -0.008913 0.008673 0.005791 -0.000268 0.005387 
+-0.001085 0.001271 -0.000498 -0.006037 -0.000191 -0.002055 
+0.002208 0.002203 -0.001178 0.007066 0.003717 -0.006780 
+-0.010448 -0.001748 -0.002323 -0.003128 0.000856 -0.000549 
+0.002516 0.005574 0.002419 0.005700 0.006272 0.002961 
+0.002257 0.001566 0.002642 0.001195 -0.001480 0.000138 
+0.006595 0.018168 -0.006908 -0.018367 0.020935 -0.020138 
+0.000883 0.028893 -0.014336 0.008839 0.007306 0.004928 
+0.009013 0.001186 0.009645 0.008817 0.007362 0.001425 
+-0.000203 0.000721 -0.000818 -0.002481 0.000341 0.008172 
+-0.007093 -0.000473 0.022500 -0.011906 -0.032593 0.018882 
+-0.023113 -0.030192 0.007991 -0.011687 -0.018607 0.000769 
+0.011197 -0.000144 0.001123 0.020112 -0.001676 -0.002236 
+0.007033 -0.000374 -0.004325 -0.006988 0.009370 -0.002843 
+-0.011423 0.013151 -0.014804 0.003497 0.008648 -0.015720 
+0.006529 0.008382 -0.005265 -0.000692 0.007138 -0.003249 
+-0.006801 0.006094 -0.001663 -0.006686 0.007887 0.002763 
+-0.000638 0.009920 0.003448 0.000631 0.002448 -0.006318 
+-0.000891 0.000624 -0.005943 -0.001845 0.000735 -0.003314 
+0.001718 0.004330 -0.001586 0.006791 0.007074 0.004527 
+0.005219 0.012461 0.005304 0.006167 0.008176 -0.005946 
+0.001259 0.002466 -0.003152 0.002571 0.001743 -0.005496 
+0.008389 0.007837 -0.012609 0.011076 0.005595 -0.022209 
+-0.004303 0.005073 -0.019113 -0.006583 0.004513 -0.007323 
+-0.001914 0.002923 -0.000852 0.000725 0.000725 -0.001311 
+0.003702 -0.002027 -0.003369 0.007716 -0.002451 -0.005294 
+-0.002891 -0.009998 -0.000974 0.002520 -0.007022 -0.001554 
+0.006739 -0.001547 0.000853 0.002802 0.006299 -0.007552 
+-0.005236 0.007968 0.000449 -0.003253 0.006813 0.007275 
+0.006926 -0.018317 0.009707 -0.001120 0.000126 -0.001555 
+-0.005750 0.001624 -0.000723 -0.000319 -0.001211 -0.000494 
+-0.000262 0.000544 0.000688 0.002193 0.000057 -0.001552 
+-0.004718 -0.003172 -0.003521 -0.013630 -0.000829 -0.008515 
+-0.004788 -0.006978 -0.003875 -0.000938 0.001487 0.000116 
+0.013774 -0.000398 -0.000458 0.018251 0.004878 -0.006316 
+0.005635 -0.002773 -0.006560 0.008378 -0.007921 0.005281 
+-0.002803 0.002545 -0.003340 0.002000 0.007615 -0.001171 
+-0.000046 -0.000865 0.000175 -0.017568 -0.017027 0.000000 
+0.000552 -0.014255 -0.002503 0.000757 -0.006152 -0.000266 
+-0.002770 -0.001249 -0.000600 -0.007219 -0.000953 0.001692 
+-0.006756 0.001675 0.001474 -0.003237 0.006560 -0.000213 
+-0.002171 0.002227 -0.004370 -0.000884 0.002819 -0.002773 
+0.000737 0.002413 -0.000633 0.002934 -0.002452 0.000671 
+0.010694 -0.005261 0.002510 0.031891 -0.000839 0.001888 
+0.018876 -0.007687 -0.004686 -0.000387 0.000285 -0.000102 
+-0.012459 0.000578 -0.024485 -0.007778 -0.008174 -0.003269 
+0.005701 0.001081 0.014671 0.008104 0.002618 -0.006225 
+0.004379 0.001654 -0.014317 -0.006049 0.001964 -0.008796 
+-0.019407 -0.008322 -0.019364 -0.016779 -0.005140 0.000711 
+-0.025899 -0.019074 0.069471 -0.014062 -0.020932 0.029654 
+0.014731 -0.020985 0.021516 0.014949 -0.013543 0.029490 
+-0.025425 -0.010332 0.034591 0.005018 0.010938 0.002861 
+-0.009053 0.004415 0.002720 0.007241 0.005112 0.005963 
+0.005683 0.018550 -0.000322 0.009372 0.010289 0.001434 
+0.009202 0.010400 -0.000876 0.010435 0.014996 -0.002608 
+0.009268 0.008186 0.000213 0.000981 0.003491 -0.003206 
+-0.001272 -0.002566 -0.000288 0.005188 -0.002398 -0.005403 
+0.000913 0.005964 -0.006358 0.006516 0.004612 -0.000045 
+0.003695 0.004251 -0.005372 -0.002539 0.001446 0.000072 
+0.003610 0.005095 0.005571 -0.000340 0.005089 -0.005172 
+0.003860 0.000551 -0.004682 0.000383 0.001200 -0.005289 
+-0.001957 0.003628 -0.002296 -0.002862 -0.000925 -0.006095 
+-0.001626 0.000777 -0.005973 0.004366 -0.002522 -0.014545 
+0.013000 -0.006687 -0.025439 0.004166 -0.014824 -0.011838 
+0.004154 -0.006268 0.001238 0.004867 -0.008510 0.003389 
+0.005246 -0.005352 0.000571 0.000083 0.002498 0.005001 
+0.002680 0.009234 0.003483 -0.009807 -0.014670 -0.007444 
+0.001168 -0.028542 -0.006903 0.006721 -0.018262 0.007126 
+0.005835 -0.004407 0.003573 0.007114 0.005239 0.000426 
+0.013665 0.008459 -0.001650 0.019560 0.015883 -0.006113 
+0.016331 0.022990 -0.010446 0.009810 0.015677 -0.002653 
+-0.008951 -0.003798 -0.014810 -0.006555 -0.003889 -0.013685 
+0.006845 0.004595 0.001299 0.008885 -0.002941 -0.007782 
+0.000679 -0.014286 -0.001075 -0.002021 -0.012257 -0.009462 
+0.009472 -0.020669 -0.000647 -0.000954 -0.014952 0.008494 
+-0.009524 -0.010799 0.003857 -0.010000 -0.005679 -0.000355 
+-0.002587 -0.007211 -0.002139 -0.001117 -0.012006 0.002872 
+-0.005970 -0.013415 0.008729 -0.004693 -0.008973 0.006744 
+0.004558 0.001039 -0.000342 0.006674 0.012089 -0.004584 
+0.005688 0.009250 0.000379 0.014513 0.022061 -0.003406 
+0.003176 0.022276 -0.009763 -0.004428 0.000729 -0.003216 
+-0.004922 -0.019980 0.008443 -0.000431 -0.027876 0.013962 
+-0.000877 -0.024339 0.007179 -0.001949 -0.009302 -0.008036 
+-0.012382 -0.007491 -0.020249 -0.034386 -0.016680 -0.015594 
+-0.038466 -0.020852 0.002783 0.002539 -0.003292 -0.004326 
+0.017001 0.007791 -0.005395 0.020682 0.029134 -0.010370 
+-0.053182 0.029545 -0.105455 0.004450 -0.051452 -0.097585 
+-0.076769 -0.034308 0.023846 0.005546 -0.019832 0.023025 
+-0.014755 -0.019620 0.024326 -0.016324 -0.071176 0.036569 
+-0.040065 -0.051169 0.069026 -0.004103 -0.003558 0.024744 
+0.005351 0.005880 0.007173 -0.010271 0.004796 0.007421 
+0.000234 0.000100 -0.008065 -0.002849 0.004505 -0.009376 
+0.003869 0.010900 -0.002652 0.002942 0.006606 0.001874 
+-0.001677 0.008812 0.001679 -0.008253 0.004042 0.010162 
+-0.003134 -0.002506 0.006135 0.002792 0.001663 -0.003068 
+0.008916 -0.001046 -0.015042 0.009145 0.006097 -0.018333 
+-0.000251 0.009741 -0.013656 0.009609 0.011328 -0.011398 
+0.008924 0.002474 -0.010250 0.002511 -0.000853 -0.005485 
+0.001664 -0.001012 -0.002418 0.002500 0.001080 -0.001579 
+0.005104 0.007060 -0.002442 0.001712 0.011218 -0.002565 
+-0.002917 0.000031 -0.000338 0.005469 -0.011659 -0.001116 
+0.007783 -0.003891 -0.000832 0.004862 -0.000519 0.003033 
+0.006824 -0.001972 0.000215 0.004868 -0.005373 0.002415 
+0.011076 -0.001124 0.002495 0.005746 -0.005126 -0.000226 
+-0.000126 0.000296 0.000939 0.001320 0.004858 0.004730 
+-0.000340 -0.005464 -0.001479 0.004008 -0.010151 -0.001260 
+-0.000722 -0.001643 -0.000933 0.005581 0.005818 -0.002756 
+0.015074 0.010475 -0.015787 0.020548 0.008687 -0.029977 
+0.015293 0.014431 -0.046559 0.006372 0.035237 -0.030744 
+-0.006019 0.011456 -0.011578 0.001481 -0.000833 0.000648 
+0.003391 -0.004182 0.001413 -0.003735 -0.002536 0.005187 
+-0.008906 -0.007305 0.001270 0.001395 -0.010589 -0.005695 
+0.014069 -0.008473 -0.010099 0.016244 -0.011086 -0.010573 
+0.022611 0.001218 -0.009002 0.009586 0.012664 0.000473 
+0.003702 -0.003262 0.001810 -0.002403 -0.008450 -0.001606 
+-0.004330 -0.002292 -0.000228 0.004384 0.007500 -0.000258 
+0.015630 0.006809 -0.002605 0.016304 -0.000384 0.000230 
+0.004415 0.007125 -0.002117 0.008688 0.014406 -0.000424 
+0.005112 0.010244 0.000002 -0.001045 -0.003702 0.002834 
+-0.004497 -0.016824 0.014485 -0.002906 -0.024501 0.017095 
+-0.001375 -0.023875 0.011250 -0.005938 -0.019565 -0.001335 
+-0.014028 -0.021577 -0.017984 -0.007531 -0.031055 -0.004028 
+-0.005241 -0.004230 0.019931 0.000526 -0.004726 -0.002100 
+-0.006931 -0.012268 -0.003550 -0.009845 -0.029817 0.012939 
+0.006053 -0.024649 0.032455 -0.092732 -0.073881 0.051206 
+0.015510 -0.021106 0.052290 0.005712 0.000731 0.010920 
+-0.003002 -0.002854 0.003874 -0.004094 -0.022582 0.005602 
+0.001108 0.003463 0.006580 -0.017171 -0.020430 0.026654 
+-0.007552 -0.013864 0.014851 -0.005119 -0.008917 0.003742 
+-0.001818 0.001597 -0.007052 0.007961 -0.006572 -0.001265 
+0.011815 -0.001803 0.009628 0.011971 0.008761 0.013209 
+0.007150 0.014006 0.007424 0.002588 0.012700 0.000032 
+0.006327 -0.000344 -0.007101 0.001811 0.004418 -0.016655 
+0.000729 0.008470 -0.015938 0.005333 0.016556 -0.005556 
+0.012470 0.019256 -0.010655 0.002691 0.006695 -0.016254 
+0.000528 0.000028 -0.008193 0.000195 -0.001112 -0.002613 
+0.002589 -0.000188 0.002467 0.010776 0.004361 -0.000990 
+0.010867 0.010170 -0.008888 0.013935 0.010451 -0.015091 
+0.009524 0.000000 -0.010476 0.004788 -0.004346 0.002760 
+0.004152 -0.002503 0.005694 0.004384 0.001672 0.003218 
+0.003013 0.006495 0.000608 0.000032 0.005402 -0.002258 
+0.011857 -0.005532 -0.003508 0.012630 -0.003762 0.001292 
+0.001275 0.000079 -0.001531 0.002691 0.017045 0.009420 
+-0.001256 0.009649 0.009764 0.002300 -0.003990 0.000139 
+-0.002646 -0.001801 -0.000533 -0.000406 0.003151 0.001709 
+-0.000902 0.008133 -0.020111 0.001398 0.008347 -0.005567 
+-0.011574 -0.013761 -0.009320 -0.007657 0.004392 -0.006328 
+0.003374 0.014272 -0.003113 -0.001112 0.001060 -0.001643 
+-0.007431 -0.002258 0.012067 -0.017321 -0.002242 0.012024 
+-0.004426 0.001197 -0.005395 0.005553 0.005162 -0.007393 
+0.006657 -0.000750 -0.003993 0.005653 -0.010944 -0.007002 
+0.014534 -0.000896 -0.010950 -0.001427 0.002075 -0.013747 
+-0.003076 0.006667 -0.003332 -0.000112 0.004314 -0.000227 
+0.000816 0.005714 0.000000 0.002373 0.010280 0.000565 
+0.001860 0.008765 0.001381 -0.003830 0.000979 0.000367 
+0.001007 0.005410 -0.001050 0.000975 -0.000794 0.000249 
+0.003616 -0.002634 -0.000128 0.001641 -0.005409 0.002354 
+0.000070 -0.008332 0.009872 -0.005408 -0.010387 0.012490 
+-0.006454 -0.015118 0.004523 -0.005952 -0.007179 -0.010708 
+-0.020602 0.001667 -0.024684 0.038824 0.034979 -0.023786 
+0.001509 0.024777 -0.017458 0.006443 -0.001904 0.006087 
+0.000029 -0.014137 0.009390 -0.004488 -0.028694 0.002588 
+-0.074467 -0.071267 0.040667 -0.042415 0.022224 0.280639 
+-0.001362 0.017683 -0.001175 0.005565 0.004785 0.004759 
+-0.000478 0.000871 -0.001751 -0.009489 0.016307 0.001848 
+-0.021113 0.014640 -0.004007 -0.007204 -0.011597 -0.017934 
+0.001654 0.002549 0.007568 0.007357 0.005148 -0.007938 
+0.013650 0.009203 -0.011209 0.014441 0.008042 0.006605 
+0.015704 -0.002107 0.012939 0.014570 0.001482 0.007685 
+0.011564 0.006672 0.000872 0.008947 0.008083 -0.006640 
+0.002053 0.011745 -0.009349 -0.000907 -0.004719 -0.005808 
+0.004931 -0.002190 -0.009449 0.005821 0.004263 -0.007157 
+0.001434 0.010038 -0.007170 0.001698 0.006920 -0.001599 
+0.000477 0.000733 0.000427 -0.000102 -0.001263 0.000168 
+0.003340 0.001599 0.000111 0.008329 0.005040 -0.001163 
+0.011121 0.001324 -0.001805 0.006300 -0.003659 -0.007235 
+-0.003708 -0.002682 -0.005650 -0.006832 -0.000129 -0.004519 
+-0.001463 -0.001127 -0.002227 -0.000038 -0.000005 -0.000095 
+0.000482 -0.000217 0.000319 0.002239 -0.002802 0.001128 
+0.004616 -0.007783 0.006680 0.008976 -0.005394 0.005994 
+0.015771 -0.000263 -0.000933 0.018199 0.007133 -0.003137 
+0.008875 -0.001890 0.001253 0.005375 -0.006668 0.002483 
+0.001108 -0.007183 -0.001842 -0.005646 -0.003619 0.004076 
+-0.002860 0.004533 0.007720 -0.014060 0.011424 -0.000776 
+0.000750 -0.001799 -0.000310 0.012113 -0.004069 -0.001209 
+0.005271 0.004093 -0.000424 -0.008452 0.006764 -0.002602 
+-0.012421 0.008369 -0.000165 -0.005449 0.003900 -0.001716 
+0.013287 -0.005854 -0.008548 0.005636 0.000840 -0.020123 
+-0.023326 -0.014712 -0.006194 -0.021758 -0.015186 -0.005634 
+-0.007441 -0.007115 -0.004504 0.004149 -0.007393 -0.003503 
+0.002039 0.021091 -0.005331 0.006935 0.014843 -0.002744 
+0.003927 0.003899 0.000985 -0.000934 -0.000967 -0.001278 
+-0.004694 -0.001590 -0.003976 -0.007755 -0.002020 -0.000673 
+-0.004868 0.002313 -0.001365 -0.005106 0.003807 -0.001303 
+-0.001690 0.006054 -0.003371 -0.001088 0.004342 -0.003527 
+-0.003643 0.001167 -0.000077 -0.005692 -0.006368 0.001484 
+-0.002893 -0.003811 -0.002422 -0.006846 0.020113 -0.012142 
+0.001871 0.038796 -0.008792 0.021731 0.013070 0.000608 
+0.020184 0.003372 0.005688 -0.006759 0.003241 -0.006334 
+-0.021346 0.002528 0.005493 -0.002935 0.002409 -0.007480 
+0.007796 0.001623 -0.004294 0.003333 -0.004459 0.014490 
+0.011381 0.013966 -0.031552 0.008364 0.021030 -0.011470 
+-0.000069 0.000172 -0.010000 0.012846 -0.022481 0.022500 
+0.009444 0.042778 -0.052222 -0.031756 -0.022724 0.089247 
+-0.023802 -0.018791 0.022549 0.002186 -0.001267 -0.013019 
+0.019098 0.015069 -0.010475 0.001514 -0.001631 0.016769 
+0.007080 -0.001882 0.009747 0.004933 0.000195 0.001675 
+0.005905 0.005647 -0.003880 0.007932 0.010168 -0.005297 
+0.008014 0.013109 -0.001424 0.007901 0.010371 -0.001640 
+0.006052 0.007113 -0.004594 0.004589 0.005879 -0.007872 
+0.005833 0.005833 -0.005833 0.005627 0.007313 -0.000279 
+0.005243 0.004348 0.000079 0.001683 0.003997 -0.003003 
+0.000972 0.006204 -0.005039 0.004827 0.006321 -0.002903 
+0.007598 0.001925 -0.000547 0.003575 -0.000111 -0.000771 
+-0.002398 0.007168 -0.004973 -0.005406 0.010860 -0.017885 
+-0.005977 0.000208 -0.014215 0.001996 -0.002886 -0.005052 
+-0.000711 0.000497 0.000715 -0.001271 0.000990 0.000571 
+-0.000936 0.002418 -0.011752 0.035744 0.017440 -0.031220 
+0.039542 0.022758 -0.011319 0.011543 0.002298 0.007527 
+0.000377 0.000126 0.000392 -0.002747 -0.000162 -0.001493 
+0.001186 -0.002084 -0.000773 -0.001851 -0.006669 0.000469 
+-0.010526 -0.004254 0.006528 -0.005464 0.006048 0.005785 
+0.010262 0.016269 0.003975 0.019540 0.020880 0.004751 
+0.021629 0.012423 0.000483 -0.000300 0.011883 0.005587 
+-0.021962 0.003906 0.028565 -0.018141 0.017928 0.016431 
+0.054331 0.039331 -0.036024 0.031031 -0.012576 -0.048594 
+0.011637 -0.020463 -0.010906 -0.013806 -0.003000 -0.012206 
+-0.009652 0.013396 -0.018583 0.000350 0.022589 -0.010445 
+0.009083 0.017484 -0.003649 0.008583 0.011722 0.001391 
+0.004034 0.007719 0.002996 0.001853 0.002430 0.003059 
+0.008382 0.003801 -0.000585 -0.000763 -0.000385 0.002927 
+0.001417 0.005585 -0.006747 -0.004289 0.004976 -0.003053 
+-0.011632 0.002848 0.002006 -0.013801 0.000937 0.002435 
+-0.010000 -0.001301 0.001301 -0.002736 -0.005331 0.000578 
+-0.001983 -0.004181 0.001143 -0.004929 0.005909 -0.009699 
+-0.014731 0.018881 -0.008299 -0.002896 0.015243 0.010887 
+-0.007520 0.009743 0.013268 -0.008306 0.004143 -0.006174 
+0.015271 -0.010011 0.017995 0.024760 -0.012360 0.026084 
+0.019147 -0.008298 0.026809 0.012663 -0.004123 0.018492 
+0.002124 -0.003383 0.007873 -0.006706 -0.013400 -0.002459 
+-0.001613 -0.029279 0.004483 -0.000417 0.014462 -0.018689 
+-0.027769 -0.018489 -0.067049 -0.001288 0.046364 0.029621 
+-0.007483 0.039333 -0.003207 0.024556 0.062556 -0.043556 
+0.014321 0.044805 -0.045536 0.002913 0.012190 -0.004907 
+0.000746 0.006925 -0.004127 0.004892 0.004939 -0.003157 
+0.007238 0.006581 -0.005230 0.007207 0.006425 -0.004567 
+0.009468 0.005609 -0.002451 0.011689 0.005970 -0.004532 
+0.011236 0.005388 -0.006173 0.007288 0.007788 -0.006030 
+0.005964 0.011980 0.002739 0.008241 0.006847 0.001473 
+0.006722 0.000641 0.002739 0.001875 0.004932 -0.004735 
+0.001879 0.005290 -0.009348 0.005083 0.002911 -0.007963 
+0.005994 0.001279 -0.005040 0.000558 0.002701 -0.005309 
+-0.001384 0.006564 -0.013704 0.007100 0.006440 -0.024538 
+0.013847 0.004538 -0.029341 0.009520 0.006134 -0.021449 
+-0.003611 0.004134 -0.007245 -0.008388 0.005250 -0.007046 
+-0.010180 0.012012 -0.021074 0.007053 -0.017163 -0.078883 
+0.037497 0.033689 -0.043357 -0.001341 -0.001784 -0.002335 
+-0.005492 -0.004917 -0.004210 -0.008179 -0.003036 -0.000234 
+-0.002252 0.000104 0.002335 0.000568 0.004768 -0.004749 
+0.001535 0.007391 -0.004297 -0.007013 0.005096 0.005344 
+-0.008333 0.006409 0.004532 0.002161 0.005952 0.003425 
+0.002615 0.005703 0.004225 0.008502 0.006586 -0.003939 
+-0.003898 -0.001487 0.007875 -0.009688 -0.006667 -0.001845 
+0.022963 0.017761 -0.027956 0.007887 0.003920 -0.017521 
+0.009057 0.003702 0.003580 -0.015813 -0.000769 0.012187 
+-0.008892 -0.026138 -0.010091 -0.006290 -0.012604 0.001581 
+-0.003718 -0.010535 0.000654 -0.003392 -0.008323 -0.003597 
+-0.002374 -0.006085 -0.003385 0.002040 -0.003609 0.000083 
+-0.000332 0.001081 0.000416 0.004483 0.001284 0.013020 
+0.005155 0.008230 -0.013861 -0.003189 0.009455 -0.003309 
+-0.010261 0.004820 0.000089 -0.007272 0.001496 -0.001148 
+-0.000327 0.002558 -0.003039 0.002097 0.002934 -0.000285 
+0.005642 -0.002274 0.002871 0.008538 -0.008858 0.014434 
+0.020325 -0.025971 0.026676 -0.003561 -0.035116 0.070382 
+0.004725 -0.001669 0.012162 0.015092 -0.012571 0.015367 
+3.650350 -2.335664 2.734266 4.376471 -2.629412 3.511765 
+4.269231 -2.134615 3.506410 0.020384 -0.015072 0.036098 
+0.007343 -0.008436 0.019941 0.002447 -0.020022 0.004097 
+-0.000436 -0.014981 -0.010658 0.048000 0.056000 -0.082143 
+0.015556 -0.030139 -0.032361 0.046154 -0.030000 -0.099231 
+0.041966 0.020940 -0.062735 0.020467 0.004093 -0.035000 
+-0.003214 0.010000 -0.043214 -0.006969 0.020289 -0.079347 
+-0.010633 -0.001707 -0.016965 -0.015014 -0.011121 0.000889 
+-0.014535 0.001042 0.008069 -0.010598 0.006191 0.000240 
+-0.002961 0.003270 -0.006330 0.005566 0.004013 -0.002542 
+0.003871 -0.000242 0.005580 0.001886 -0.005532 0.009830 
+0.001653 -0.007595 0.005134 0.001733 -0.004176 0.000829 
+0.003132 -0.001051 -0.000692 0.002366 0.001625 -0.005164 
+-0.004449 0.003704 -0.009332 -0.009775 0.001919 -0.010488 
+-0.007766 0.000784 -0.006516 -0.009748 -0.000993 0.002799 
+-0.013753 -0.004185 0.014031 -0.015178 -0.003202 0.012980 
+-0.006651 0.001430 -0.004894 0.005372 0.008360 -0.024161 
+0.007682 0.007539 -0.033288 0.001155 -0.003740 -0.016489 
+-0.002388 -0.001564 -0.002774 -0.017983 -0.017784 0.002299 
+-0.007071 -0.004904 0.035524 0.006149 0.007762 0.004255 
+0.004648 0.006238 -0.008185 -0.009844 -0.005862 0.004223 
+-0.013001 -0.008611 0.008399 -0.003788 0.002171 0.003377 
+0.005744 0.004434 -0.000959 0.002817 0.000728 0.000443 
+0.003858 0.001765 0.003748 0.009182 -0.001040 0.003618 
+0.013152 -0.004854 0.003001 0.014446 -0.004463 -0.006459 
+0.008832 0.001091 -0.014181 -0.008378 -0.010589 -0.002403 
+-0.012572 -0.004489 0.012144 0.000218 0.003262 -0.002662 
+0.005876 -0.001387 0.004759 0.003890 -0.000362 0.009040 
+-0.000312 -0.004755 0.011486 -0.005022 0.000996 0.004502 
+0.001030 -0.019716 0.011377 -0.002752 -0.009112 0.001338 
+-0.001220 0.002861 -0.001604 0.004128 0.002727 0.000751 
+0.001626 0.000118 0.001735 -0.007089 -0.005762 0.003273 
+-0.002398 0.005185 -0.004560 -0.007032 0.007739 -0.006085 
+-0.001215 0.005629 -0.006239 0.001598 -0.000466 -0.001377 
+0.003416 -0.001248 0.002204 0.001937 0.001843 0.005153 
+0.005207 -0.000287 0.011288 0.023616 -0.015556 0.027893 
+-0.004091 -0.049870 0.037338 0.003651 0.002927 0.025810 
+0.015563 -0.015722 0.016641 3.456000 -2.376000 2.680000 
+5.322034 -3.372881 3.872881 6.609524 -3.695238 5.104762 
+6.907217 -2.649485 5.226804 6.032967 -1.428571 4.274725 
+0.027770 -0.016329 0.038508 0.017851 -0.015954 0.021387 
+0.006116 -0.016087 -0.004571 0.034000 0.014078 -0.056314 
+0.018750 -0.003750 -0.078750 -0.003462 -0.065989 0.013901 
+0.002887 -0.094528 -0.013830 -0.010316 0.000526 -0.016789 
+0.008889 -0.054017 -0.018120 -0.038333 0.030000 -0.024167 
+0.000189 0.001071 -0.000569 -0.005356 -0.004415 -0.005718 
+-0.013619 0.004839 -0.010922 -0.003721 0.014184 -0.002358 
+-0.022105 0.012024 -0.008016 -0.010781 -0.005620 -0.008687 
+-0.005566 -0.003702 -0.002527 -0.006824 -0.005439 0.005158 
+-0.009213 -0.006522 0.007039 -0.006573 -0.000548 0.001740 
+-0.005142 0.003343 -0.003193 -0.007383 0.005695 -0.005448 
+-0.009047 0.006214 0.000653 -0.017056 -0.001731 0.000680 
+-0.006846 -0.008795 0.010420 0.000691 -0.015449 0.020153 
+-0.005464 -0.028224 0.027358 -0.014205 -0.020829 0.036927 
+-0.017479 0.012209 0.032062 -0.006193 0.011251 0.013323 
+-0.003083 -0.007607 -0.012614 -0.042604 -0.014769 0.027941 
+-0.016303 0.001642 0.020474 -0.001107 -0.001208 0.003314 
+0.003254 -0.000127 0.003985 0.028744 0.010093 0.010908 
+0.076367 0.067282 -0.013571 0.014998 0.006241 -0.014231 
+-0.004723 -0.011063 -0.007118 -0.005919 -0.003951 -0.004294 
+-0.005606 -0.000765 0.000716 -0.004433 -0.003654 0.001527 
+-0.006656 -0.008416 0.001883 0.005581 -0.005562 0.002342 
+0.020531 -0.002129 -0.002496 0.013617 -0.003641 -0.008234 
+-0.003587 -0.011024 -0.000788 0.003060 -0.037382 0.017239 
+-0.000611 0.015499 0.009863 0.001970 0.008644 -0.002568 
+0.005655 0.001464 0.003260 -0.000080 0.008943 0.000887 
+0.000172 0.013084 0.000798 -0.011939 0.007129 -0.004332 
+-0.021727 0.007119 0.007160 -0.004793 0.003321 0.011681 
+0.004738 0.006446 -0.001546 -0.000283 0.008999 -0.008076 
+-0.005685 0.004315 -0.007767 0.001176 0.001279 -0.006730 
+0.002535 0.005995 -0.013795 -0.000268 -0.001346 -0.015877 
+-0.000501 -0.002543 -0.011049 0.001435 -0.002948 -0.005452 
+0.003515 -0.003888 -0.001337 0.008169 -0.002522 0.010935 
+0.014151 -0.000804 0.019257 0.035614 -0.005614 -0.041228 
+0.004773 -0.014359 -0.025362 0.007115 -0.006149 0.007781 
+0.023955 -0.022693 0.022580 4.408333 -3.541667 3.125000 
+5.818182 -4.717172 4.707071 6.428571 -4.535714 6.011905 
+5.690476 -2.880952 5.880952 0.047861 -0.012562 0.048839 
+0.029055 -0.015226 0.043841 0.021198 -0.006572 0.029054 
+0.006069 -0.001204 0.004749 0.051804 -0.138516 -0.064498 
+0.019986 -0.035260 -0.000715 0.048924 -0.028145 0.062209 
+0.047971 0.021801 -0.012198 0.045333 -0.022667 0.007778 
+-0.005761 0.009935 -0.030194 -0.003753 -0.007483 -0.006247 
+-0.012225 -0.002436 -0.004711 -0.006172 -0.003310 -0.004448 
+-0.005984 -0.005685 -0.006315 -0.019711 -0.010456 -0.003059 
+-0.028744 -0.025744 -0.000419 -0.004114 0.002771 -0.000857 
+0.003828 -0.004655 0.002833 0.032039 0.003284 0.014200 
+0.019015 -0.009013 0.000506 0.004431 -0.002179 0.001815 
+-0.017558 0.001171 -0.006364 -0.008042 -0.000899 -0.008836 
+-0.000718 -0.000440 -0.000023 0.001937 -0.007967 -0.003898 
+0.008765 -0.009938 0.005432 -0.006514 -0.019099 0.032357 
+-0.001364 -0.022467 0.032296 -0.023224 -0.007942 0.032140 
+-0.020373 0.009797 0.007458 -0.013248 -0.010085 -0.002636 
+-0.021000 -0.011000 0.002000 0.000116 -0.011062 -0.002814 
+0.002322 0.005551 -0.013854 0.013000 0.014302 -0.018573 
+0.015198 0.016130 -0.008815 0.002751 -0.006839 0.005002 
+-0.005141 -0.016079 0.013736 -0.002833 -0.005221 0.003865 
+-0.002896 0.004591 -0.002442 -0.003002 0.007468 -0.000861 
+0.005455 0.004597 -0.005128 0.004392 0.011798 -0.002543 
+0.001916 0.002053 -0.000452 -0.006369 -0.003713 0.000082 
+-0.003122 0.004829 0.000800 -0.000554 0.003890 0.002919 
+-0.008334 -0.002456 0.011761 -0.009574 -0.015548 0.015058 
+0.011779 -0.010899 -0.023206 0.002043 0.002731 0.001982 
+0.000397 -0.000031 0.002908 -0.001805 0.001721 0.001569 
+-0.003334 0.003287 0.001453 -0.004153 0.000076 0.003912 
+-0.006448 -0.005798 -0.002696 -0.008617 -0.008760 0.000356 
+-0.005445 -0.005396 0.001987 -0.001822 -0.004903 -0.003138 
+-0.001091 -0.002599 -0.007408 -0.003039 0.003409 -0.003725 
+0.003981 0.006231 0.002111 0.008864 0.002880 -0.000603 
+0.003765 -0.000336 -0.006271 -0.002893 0.001755 -0.009414 
+-0.004978 0.000249 -0.011608 0.000519 -0.001685 -0.001019 
+0.041758 0.051667 -0.023663 -0.013685 0.022342 -0.059226 
+-0.004123 0.000736 -0.006979 0.011456 -0.008675 0.012399 
+0.025778 -0.009750 0.027288 3.954955 -3.810811 2.963964 
+4.284211 -4.747368 4.515790 3.802469 -4.629630 6.098765 
+0.039088 -0.010733 0.064818 0.028632 -0.006234 0.060288 
+0.024207 0.002963 0.045079 0.016296 0.006359 0.019215 
+-0.019330 -0.017852 -0.005576 0.052213 -0.018651 -0.043818 
+0.016905 -0.016905 0.034286 0.026969 -0.004578 0.006824 
+0.019615 0.015534 0.021686 0.016440 0.020154 0.072156 
+0.004722 0.013056 0.017778 -0.010000 -0.001077 -0.039385 
+-0.017721 0.005777 -0.025698 -0.019732 -0.004178 -0.012212 
+-0.020000 -0.011275 -0.001367 -0.013460 -0.018326 0.005892 
+-0.013865 -0.014066 -0.000222 0.004501 -0.002540 -0.001088 
+0.011414 -0.009899 0.004691 0.008461 -0.014500 0.004620 
+-0.002872 -0.009716 0.008955 -0.004494 0.001250 0.007191 
+-0.010175 0.007782 0.001597 -0.008333 0.007339 0.001646 
+0.004429 0.005355 0.001412 0.005307 -0.003760 -0.006175 
+0.001328 -0.024000 -0.001569 -0.005008 -0.044874 0.064867 
+-0.022222 0.011111 0.087778 -0.062236 0.021056 0.117453 
+0.004203 -0.004526 0.000000 0.009790 -0.001943 -0.014857 
+0.003829 0.033896 -0.000562 0.008478 -0.010610 -0.020487 
+0.005095 -0.006158 -0.014613 0.013394 0.005096 -0.011116 
+0.011875 0.014829 -0.006069 -0.004793 0.010622 0.001345 
+-0.011540 -0.000283 0.008829 -0.008264 -0.003355 0.003281 
+-0.003933 -0.000440 -0.000339 -0.000459 0.004401 -0.002444 
+0.012280 0.011771 -0.003317 0.016126 0.015508 -0.005700 
+-0.001910 0.004142 0.000626 -0.010391 -0.005320 0.000388 
+-0.017429 -0.012985 0.001943 -0.004894 -0.004643 0.006501 
+0.003597 -0.005227 0.001922 -0.003562 -0.005413 0.004814 
+-0.026643 -0.024336 0.008252 0.000649 0.001184 0.001221 
+-0.000021 0.005080 0.009583 -0.007978 0.012591 0.013754 
+0.004683 0.008999 0.025202 0.046526 -0.001795 -0.013132 
+-0.011721 -0.012446 -0.000198 -0.027576 -0.012076 0.001227 
+-0.022613 -0.004973 0.002367 -0.005205 -0.003597 -0.000706 
+0.001222 -0.002037 -0.006697 -0.000113 -0.001030 -0.005296 
+0.004774 -0.000396 -0.003891 0.005738 -0.001804 0.003366 
+0.004267 -0.000778 0.008998 0.005332 -0.000658 0.007107 
+-0.002152 -0.011106 -0.009859 -0.017072 -0.002757 0.002570 
+-0.008771 0.039887 -0.041495 -0.015217 0.024117 -0.015572 
+0.000059 0.008514 0.002355 0.012873 -0.006964 0.011743 
+0.024623 -0.013946 0.019677 0.034659 -0.015625 0.028977 
+0.033079 -0.006736 0.048419 0.016766 0.000830 0.073861 
+0.009500 -0.000216 0.067333 0.010222 0.002400 0.038756 
+0.009065 0.009880 0.018385 0.007185 0.016754 0.007086 
+0.033576 -0.020242 0.002446 -0.003322 -0.033040 0.003339 
+0.001236 -0.001922 -0.009063 0.011430 0.011473 -0.011691 
+0.004610 0.029382 -0.014886 0.002551 0.033951 0.005648 
+-0.047506 0.005446 0.094104 -0.022370 -0.033519 -0.011370 
+-0.012249 -0.017200 -0.011112 -0.024383 -0.011454 -0.009476 
+-0.018313 -0.003404 -0.003217 -0.004412 -0.005310 -0.000295 
+0.006471 -0.009227 -0.005767 0.000029 -0.010029 -0.003143 
+-0.022950 -0.023985 0.026820 -0.036975 -0.021686 0.032707 
+-0.024255 -0.014098 0.007104 -0.007397 0.006669 -0.003653 
+-0.002804 0.008485 -0.001927 0.002422 0.008058 0.000540 
+0.009951 0.003077 -0.009121 -0.005281 -0.004151 0.006935 
+-0.015585 -0.008213 0.021930 -0.004134 -0.007533 0.016993 
+0.012755 0.006759 -0.036782 0.010228 0.001024 0.020085 
+0.001439 0.000729 0.000482 -0.033261 -0.013478 0.033261 
+-0.015056 -0.024252 0.013238 0.005724 -0.016933 -0.003551 
+-0.000302 -0.010009 -0.002843 0.000352 0.001126 -0.003913 
+0.002158 0.006503 -0.011897 0.002782 0.010821 -0.004947 
+-0.010828 -0.000901 0.007345 -0.012381 -0.009068 0.011480 
+-0.009936 -0.005506 0.008386 -0.012577 -0.001648 0.000674 
+-0.012657 -0.002572 -0.004215 -0.010523 -0.001579 -0.003636 
+-0.001594 0.001724 -0.000965 0.002448 0.004236 0.000505 
+-0.002010 0.006386 -0.003073 -0.002020 0.005215 0.001112 
+0.008651 0.001543 0.005680 0.002154 0.006857 -0.003231 
+-0.019041 -0.017015 -0.002230 -0.051931 -0.005569 -0.014488 
+0.021748 0.055507 0.009797 0.021333 0.073650 0.003069 
+0.044481 0.047718 -0.020586 0.026637 -0.023807 0.010404 
+-0.046098 -0.002152 0.005000 -0.019551 -0.008644 -0.002664 
+-0.015823 -0.000638 -0.004203 -0.017647 -0.003830 0.006092 
+-0.006271 0.007895 0.009241 -0.000803 0.004904 0.001576 
+0.001274 -0.001981 -0.009098 -0.004682 0.000365 -0.001757 
+-0.003707 0.002294 0.002443 0.004053 0.001595 0.003504 
+0.011273 0.011429 0.004352 0.001413 0.024080 -0.011047 
+-0.005473 0.021012 -0.025184 -0.007471 0.009244 -0.009234 
+0.000164 0.003213 0.001059 0.004179 -0.003605 0.000209 
+0.005795 -0.006794 -0.000402 0.007553 -0.009785 -0.002454 
+0.027410 0.003900 0.019433 -0.007673 0.036220 0.024639 
+-0.008776 -0.002730 0.015679 -0.001609 -0.003817 0.006202 
+-0.000923 0.000532 -0.001714 -0.000686 0.016514 -0.015967 
+0.008092 0.051693 -0.026399 -0.011460 0.009243 0.001619 
+-0.031311 -0.006210 0.020443 -0.021814 -0.007280 0.013874 
+0.004138 -0.001655 0.008400 0.007137 -0.020045 0.000051 
+-0.007877 -0.047341 -0.003399 0.025613 -0.027283 -0.040462 
+-0.001251 -0.006988 -0.032012 -0.013313 0.001964 -0.016956 
+-0.008288 0.006180 -0.003712 -0.006309 0.004941 -0.000182 
+-0.003827 0.002530 0.001866 -0.001637 0.001305 0.000777 
+0.008427 0.010585 -0.007778 0.019885 0.026277 -0.011312 
+0.022792 0.039221 -0.010195 0.021436 0.033172 -0.015264 
+0.015347 0.015806 -0.016448 0.013144 0.006641 -0.009221 
+0.019415 0.002859 -0.002305 0.023890 0.012220 0.000366 
+0.027212 0.006538 -0.001252 0.018520 -0.000288 -0.011046 
+0.012837 -0.003096 -0.009023 0.007397 0.009997 -0.000400 
+-0.015077 0.009532 -0.006182 -0.005263 0.002105 0.010175 
+-0.014029 0.003907 -0.013872 0.003628 0.014793 -0.009038 
+0.002472 -0.004318 -0.010866 -0.000965 -0.002635 -0.007590 
+0.003960 0.003866 0.000337 0.001412 0.005772 0.002662 
+-0.003009 0.002601 0.001991 -0.013262 -0.005382 0.011970 
+-0.011596 -0.016632 0.012650 -0.006885 -0.018310 0.005979 
+-0.024226 -0.004348 0.005479 -0.023635 -0.014202 -0.003106 
+-0.015948 -0.012946 -0.000909 0.006191 0.002600 0.001830 
+0.022000 0.017977 0.006052 0.007315 0.000592 0.011327 
+-0.005578 -0.022312 0.008966 -0.011421 0.001512 -0.009144 
+-0.010811 0.003792 0.003209 0.010395 0.012093 -0.012582 
+0.021243 0.019635 -0.007686 0.020491 0.007084 -0.013393 
+0.015601 0.004021 -0.012767 0.008887 0.004574 -0.006075 
+0.002412 -0.002080 0.003719 0.008682 -0.002878 0.012802 
+0.033092 0.007480 0.006677 0.019583 -0.006303 -0.011600 
+-0.001213 0.002579 -0.001758 -0.001682 0.002353 0.000831 
+-0.001402 -0.014888 -0.016138 -0.022467 -0.011027 -0.015881 
+-0.008961 0.012867 0.001093 0.011478 0.046322 -0.016295 
+-0.026975 0.002875 0.013871 -0.020605 0.004384 0.024303 
+-0.001883 0.002570 -0.000088 -0.003012 -0.004103 -0.004465 
+-0.004328 -0.002478 0.001061 -0.000898 0.004002 -0.002533 
+-0.000921 0.008157 -0.011515 -0.001996 0.016403 -0.024995 
+0.013600 0.017189 -0.030940 0.003942 0.000471 -0.008353 
+0.003521 -0.002590 -0.004629 0.005230 -0.001735 -0.000075 
+-0.003221 -0.006266 0.000995 -0.000596 0.001947 -0.003897 
+0.006531 0.022703 -0.022520 0.011749 0.017810 -0.030062 
+0.005172 -0.001081 -0.006866 0.001526 -0.003669 -0.002078 
+0.002932 -0.005451 0.005883 0.003095 -0.004126 -0.007368 
+0.004375 -0.006875 -0.004375 -0.005299 -0.002403 -0.009340 
+-0.008271 0.019730 -0.015618 0.001867 0.023250 -0.016172 
+0.003831 0.015894 -0.012772 0.002281 0.007122 -0.006449 
+0.000323 0.001195 -0.001001 0.000382 0.004968 -0.003030 
+0.003537 0.003897 -0.012270 0.004783 0.000870 -0.007391 
+0.003039 -0.001429 -0.000358 0.000952 -0.004714 0.001571 
+-0.004876 -0.001636 0.004896 -0.007413 0.002508 0.011993 
+0.006091 0.009204 0.012660 0.005005 0.007307 0.008886 
+0.008797 0.001240 0.004169 0.002965 -0.000245 -0.001679 
+-0.003593 -0.008373 0.003092 -0.005252 -0.011982 0.006838 
+-0.001805 0.000481 -0.001293 0.015333 -0.004225 -0.020178 
+0.020401 0.006787 -0.018403 -0.019093 -0.000892 -0.004084 
+-0.016681 0.021364 0.005004 0.011950 0.006940 -0.002785 
+0.000989 0.003648 0.000473 0.000939 -0.009176 0.014654 
+-0.000370 -0.009540 0.012675 -0.011350 -0.006198 0.010405 
+-0.019304 -0.012431 0.006689 -0.025741 -0.021678 0.002660 
+-0.029121 -0.022243 -0.001274 -0.029856 -0.017540 -0.001866 
+-0.025730 -0.016158 -0.002355 -0.020539 -0.013805 -0.002023 
+-0.009578 -0.009606 0.000659 0.010539 -0.000656 0.006647 
+-0.015474 -0.011242 0.009064 -0.026121 -0.020030 -0.006395 
+-0.007917 -0.003749 0.001985 0.002635 0.006091 -0.008179 
+0.004828 -0.002069 -0.005517 0.003099 -0.023024 -0.003160 
+0.005034 -0.015366 -0.006892 0.007869 -0.005621 -0.008841 
+0.000860 -0.006302 -0.009943 0.001054 -0.005617 0.001651 
+-0.006113 -0.000799 0.014568 -0.000207 0.000257 -0.000921 
+-0.000270 0.000144 -0.000003 -0.002779 0.001000 0.002190 
+0.000511 0.022274 -0.041003 0.000622 0.013906 -0.021032 
+0.000257 -0.003190 0.005784 0.001659 -0.002915 0.014853 
+0.001066 0.000347 0.004990 -0.000937 0.002689 0.002640 
+0.001120 -0.000398 0.000677 0.000014 -0.002647 0.001639 
+0.000722 -0.000191 0.000048 0.001131 0.003912 -0.005695 
+0.004991 0.007679 -0.005896 -0.001677 -0.000441 -0.000272 
+-0.004661 0.004104 0.002251 0.001291 0.009123 0.000528 
+0.002626 0.003515 -0.005226 0.003045 0.001268 -0.007217 
+0.007164 -0.001364 -0.010149 0.003851 -0.004487 -0.014663 
+0.007193 0.013950 -0.004504 0.000638 0.000232 -0.001765 
+-0.008619 -0.017097 0.006465 -0.007662 -0.005782 0.013430 
+0.000180 0.011050 -0.002962 0.015439 0.029851 -0.004576 
+0.009800 0.002126 -0.002311 0.005000 -0.005000 0.010000 
+0.006517 -0.002073 0.006247 0.002273 0.001364 0.000909 
+-0.001396 0.006753 -0.005642 0.003876 0.014501 -0.003446 
+0.014998 0.019554 -0.007008 0.007647 0.014624 -0.013297 
+0.013939 -0.002879 0.011061 -0.002917 -0.005945 -0.004756 
+-0.022628 -0.025613 0.000593 -0.017094 -0.024369 0.012730 
+-0.018846 -0.003462 0.018462 0.031736 0.027397 -0.028079 
+0.007276 0.035050 -0.001846 0.006966 0.012695 0.005107 
+0.005962 0.002871 -0.000141 0.001974 -0.000462 -0.003433 
+0.002232 0.003006 -0.007761 -0.006087 0.006902 0.001793 
+-0.008779 0.014487 -0.002953 -0.000760 0.007027 0.001079 
+-0.001281 0.003411 0.002787 -0.000928 -0.000832 0.004029 
+0.002143 0.011071 -0.008214 -0.005826 0.007507 -0.001321 
+-0.003853 0.001758 0.005509 -0.000233 -0.002059 0.005343 
+-0.004076 -0.008297 0.004330 -0.004191 -0.003093 0.002007 
+-0.009428 -0.003842 0.000255 -0.023718 -0.008475 0.001050 
+-0.034630 -0.019308 0.006580 -0.024678 -0.027440 0.004135 
+-0.005805 -0.019959 -0.004161 -0.020644 -0.009287 -0.004034 
+-0.014645 -0.012864 -0.006463 -0.003657 0.000749 -0.004787 
+0.068409 0.032411 0.010851 -0.005267 -0.009610 0.011760 
+-0.014780 -0.008728 0.001379 -0.007167 -0.007690 0.017864 
+0.000816 -0.001837 -0.004082 -0.001048 0.003619 -0.006351 
+-0.001241 -0.003224 -0.000008 -0.006137 0.003464 0.001150 
+-0.000935 0.001342 -0.007103 -0.001991 0.001031 0.010964 
+-0.000362 0.003071 0.017385 0.001517 0.001025 0.012335 
+0.004682 0.001547 0.003561 -0.000484 0.003798 -0.001385 
+0.008275 -0.009115 -0.011550 0.008953 -0.009735 -0.008784 
+-0.000746 -0.005095 -0.003115 -0.005381 -0.004644 -0.001125 
+-0.000817 0.000274 -0.000128 0.007621 0.005943 -0.011170 
+0.005416 0.007078 -0.009192 -0.001611 -0.002540 0.002370 
+-0.002640 -0.010342 0.014193 -0.001128 -0.011253 0.012056 
+0.001299 -0.005906 0.004437 0.003782 -0.000640 -0.000709 
+0.001028 0.003508 -0.004743 -0.007894 0.006185 -0.004156 
+-0.022002 0.001014 -0.018398 -0.014400 -0.012166 -0.008273 
+-0.005148 -0.001116 -0.001736 -0.001600 -0.001266 -0.000355 
+0.003949 -0.002962 -0.005307 0.001178 -0.001953 -0.002155 
+-0.007033 -0.008791 0.007473 -0.023152 -0.001085 -0.003328 
+0.001516 0.010335 -0.019453 0.025195 0.012740 -0.027185 
+0.039541 0.037192 -0.029166 0.018309 0.026732 -0.038358 
+-0.000244 0.010840 -0.019756 -0.008145 0.004274 -0.010629 
+-0.007802 -0.005551 -0.004780 -0.010693 -0.011048 0.004878 
+-0.004647 -0.007015 0.008263 0.001474 -0.002921 0.001616 
+0.008789 0.010811 -0.000337 0.010796 0.020203 -0.003113 
+0.007012 0.018419 -0.004822 0.010923 0.021000 -0.016385 
+0.009619 0.017607 -0.025765 -0.008090 0.012944 -0.100000 
+-0.001887 0.005392 -0.046842 0.003018 -0.009952 -0.009435 
+0.003761 -0.007440 0.000654 0.012910 0.006209 -0.018232 
+0.013990 0.018132 -0.032835 0.020108 0.026667 -0.009280 
+-0.005269 0.023751 0.001135 -0.001558 0.016428 -0.008596 
+0.007500 0.005500 -0.011500 -0.001707 -0.000395 -0.010116 
+0.019733 0.007553 -0.015684 0.005855 -0.005598 0.001218 
+0.001878 -0.011173 0.006337 -0.000463 -0.007785 -0.006397 
+-0.005349 0.003631 -0.015105 0.003848 0.001429 -0.010773 
+0.002837 0.001671 -0.000454 -0.007774 -0.004923 0.003655 
+-0.015740 -0.012152 0.005908 -0.017356 -0.018869 0.007863 
+-0.015672 -0.022504 0.000893 -0.017936 -0.021168 -0.004292 
+-0.019576 -0.019625 -0.004345 -0.020700 -0.020584 -0.004317 
+-0.016959 -0.013412 -0.006606 0.033028 0.046139 0.006940 
+-0.016584 -0.015272 0.000099 0.003270 -0.000983 -0.004252 
+0.039907 0.058155 -0.060662 -0.004690 0.000410 -0.029080 
+0.011220 0.002896 -0.015926 0.005019 -0.001795 -0.004653 
+0.002664 -0.002678 0.004363 0.001723 0.003738 0.010618 
+0.003626 0.006411 0.007401 0.006565 0.003913 0.000954 
+0.001562 0.002731 0.006666 0.002053 -0.000099 0.002351 
+0.012540 -0.001261 -0.006809 0.009827 -0.001039 -0.005895 
+0.000072 -0.003070 -0.001631 -0.001345 0.000138 0.001223 
+-0.002649 0.001961 -0.000390 -0.020858 -0.003293 0.005238 
+0.002320 -0.004450 0.009693 0.005226 0.004808 0.005331 
+-0.007089 -0.005936 0.005568 -0.012050 -0.008994 0.019426 
+-0.006192 -0.007194 0.017234 -0.002402 -0.002485 0.006307 
+-0.004507 -0.009362 0.006241 -0.036570 -0.009040 0.019262 
+0.002660 -0.023228 0.011942 0.019323 0.001475 -0.013455 
+0.007385 0.009797 -0.002977 -0.004381 0.004077 0.010930 
+-0.013540 0.003777 0.001063 -0.023849 -0.009610 -0.007849 
+-0.021289 -0.012647 -0.011367 -0.012266 -0.001422 -0.013867 
+-0.007947 0.014483 -0.004541 -0.004720 0.014853 0.012213 
+-0.006438 0.012105 0.014716 0.010693 0.030771 -0.045385 
+0.009314 0.014928 -0.052821 -0.009037 -0.001481 -0.020130 
+-0.007372 -0.005449 -0.006410 -0.001091 -0.008727 -0.012727 
+-0.000741 -0.010370 -0.003704 0.003095 -0.006270 -0.010476 
+-0.002417 -0.006833 -0.016083 -0.003704 0.022751 -0.005291 
+-0.004641 0.029725 -0.019243 0.005294 0.044248 -0.051307 
+0.034615 0.006923 -0.078824 0.001728 0.022325 -0.042957 
+0.006382 -0.019096 -0.009605 0.003012 -0.014054 -0.007368 
+0.011401 0.000419 -0.011349 0.009746 0.014958 -0.022030 
+0.020494 0.026831 -0.017662 0.002449 0.015642 0.002898 
+0.001904 0.000307 0.002286 0.007570 -0.002763 0.001370 
+0.014256 0.003070 0.002607 0.009133 -0.002299 0.004964 
+0.011950 -0.001338 -0.018549 0.004865 0.002999 -0.005192 
+-0.011869 -0.007284 0.008312 -0.013379 -0.002766 -0.004036 
+-0.011590 0.005019 0.001600 -0.003229 0.002468 0.003480 
+0.001927 0.001243 0.001166 -0.003746 -0.004741 -0.001171 
+-0.004995 -0.008162 -0.001392 -0.009811 -0.010513 0.001810 
+-0.014688 -0.017314 0.003336 -0.014290 -0.022347 -0.001647 
+-0.022916 -0.015684 -0.007809 -0.007246 -0.017414 -0.005430 
+-0.014787 -0.017240 -0.014147 -0.030002 -0.011276 -0.020778 
+0.011412 0.015492 0.004396 -0.003243 0.009568 -0.007351 
+-0.010306 0.010816 0.001939 -0.001069 -0.009162 -0.003177 
+0.000304 -0.005413 -0.001226 0.005105 -0.005225 -0.004259 
+0.005900 -0.004703 -0.001849 0.006048 0.005594 -0.001273 
+0.007693 0.005469 0.002500 0.008209 0.003261 0.004082 
+0.004220 0.002513 0.008011 0.006312 0.005574 0.004662 
+0.003526 0.002335 -0.001702 0.003386 0.002536 0.001321 
+0.004180 0.002719 -0.004578 0.001251 -0.000985 -0.010727 
+-0.007905 -0.007819 -0.012375 -0.006737 0.002295 -0.010730 
+0.001248 0.006251 -0.003342 0.005371 -0.001077 0.010760 
+0.000527 -0.001290 0.025994 -0.000329 0.007400 0.025489 
+-0.007569 0.003300 0.007098 -0.007399 0.008984 -0.010000 
+-0.010076 -0.000499 -0.009151 0.007839 -0.000785 -0.005377 
+-0.002998 0.014990 -0.018462 -0.000581 -0.002100 -0.007232 
+0.002591 0.003235 -0.002714 0.000073 0.001367 0.000889 
+0.004029 0.003249 0.004448 0.013441 0.002764 0.001345 
+0.013357 0.001273 -0.011023 0.002351 0.005746 -0.017297 
+-0.002657 0.013891 -0.006254 -0.017789 -0.001885 0.040606 
+-0.028647 -0.019098 0.009549 -0.027403 -0.002066 -0.019900 
+-0.021603 0.018410 -0.004884 -0.010713 0.009225 -0.008836 
+-0.011733 0.023556 0.011845 0.012463 -0.001302 -0.004045 
+0.013333 -0.002275 -0.014106 0.000822 -0.002433 -0.012029 
+-0.002380 -0.001646 -0.009751 0.004711 0.005193 -0.018913 
+0.012374 0.012395 -0.027933 0.002226 0.002691 -0.018655 
+-0.013125 -0.002885 -0.014423 -0.013360 0.005634 -0.014646 
+0.002067 -0.002914 -0.009252 -0.003599 -0.006298 -0.012121 
+-0.000551 0.003363 -0.012473 0.004991 0.007492 -0.008450 
+0.011289 0.006433 -0.003347 0.007461 -0.007509 -0.008768 
+0.001265 0.000097 -0.010511 0.007949 -0.015656 0.020235 
+0.014016 -0.003292 0.013334 0.005694 -0.002181 0.005664 
+0.000004 0.000968 -0.007116 -0.001267 0.003403 -0.007597 
+0.003546 0.004539 -0.003407 -0.000223 0.002135 -0.000130 
+0.002835 -0.005224 0.002933 -0.001452 -0.007721 -0.010397 
+0.003747 -0.001528 -0.007138 -0.001288 -0.005629 0.000614 
+-0.004245 -0.009026 -0.002877 -0.005009 -0.009586 -0.005441 
+-0.007916 -0.010772 -0.003182 -0.012383 -0.012308 -0.001401 
+-0.021545 -0.006731 -0.003382 -0.003612 0.006592 -0.003035 
+-0.006775 -0.008866 -0.020221 -0.047443 -0.014137 -0.040305 
+-0.006598 -0.006104 0.001091 -0.010146 0.001711 0.002646 
+-0.037626 0.010249 -0.006086 -0.004315 -0.009272 -0.002079 
+-0.002461 0.003915 -0.013263 0.004229 0.018056 -0.013106 
+0.014670 0.017835 -0.015973 0.009637 -0.000107 -0.017003 
+-0.019067 -0.012870 0.002767 -0.003361 -0.001490 0.002252 
+0.003042 0.001541 0.000996 0.004120 0.001633 0.002439 
+0.002789 0.004870 0.001508 0.004310 0.008782 -0.004871 
+0.001773 0.011551 -0.006210 0.013143 0.012262 -0.000961 
+0.016661 0.010234 -0.002473 0.005912 0.010299 -0.003894 
+-0.005385 0.001833 -0.003396 -0.016199 0.007578 0.012395 
+-0.022970 -0.004424 0.024241 -0.002610 -0.018607 0.010728 
+0.001233 -0.008385 0.002680 0.003684 -0.001469 0.002625 
+0.010811 0.001583 -0.004190 0.007950 0.005598 -0.015625 
+-0.007571 0.022307 -0.015954 -0.008626 0.013654 -0.007708 
+-0.000790 0.001041 0.006139 -0.000012 -0.003693 0.000988 
+-0.000352 0.001704 -0.001619 0.004937 0.004885 -0.004065 
+0.008492 -0.000258 -0.010456 0.011559 -0.001496 -0.019945 
+0.022738 0.008095 -0.033452 0.038014 0.026842 -0.034846 
+0.018431 0.012157 -0.006275 0.008807 0.001345 -0.002319 
+-0.004987 -0.000471 -0.010638 -0.005741 0.012123 -0.020901 
+-0.001421 0.001552 -0.010566 0.003693 -0.002636 0.002166 
+0.002237 -0.003142 -0.002727 -0.004006 -0.008109 -0.004647 
+-0.008434 -0.007952 -0.002048 -0.010994 -0.004581 -0.001488 
+-0.007298 -0.003378 -0.003439 -0.003568 -0.003667 -0.004285 
+-0.006887 -0.002068 -0.001460 -0.006836 0.000891 0.005822 
+0.002622 0.000308 0.000769 0.010457 0.013729 -0.020786 
+0.021814 0.009629 -0.036509 0.011128 0.020957 -0.015282 
+-0.015674 -0.006421 -0.008465 -0.012658 -0.003673 -0.006442 
+0.001043 -0.006574 -0.001036 0.012758 -0.011075 0.014822 
+0.001580 0.002273 0.005003 -0.001294 0.005917 -0.002851 
+-0.002257 0.006114 -0.002548 -0.002921 0.005036 -0.003508 
+-0.002720 0.000679 0.003402 -0.004023 -0.003498 0.012958 
+-0.007917 -0.010909 0.024471 -0.016741 -0.031004 0.016496 
+0.005569 0.005537 -0.015757 -0.000698 0.003898 -0.006616 
+-0.002232 -0.000235 -0.003088 0.002667 -0.001164 -0.002716 
+0.003316 0.000478 -0.001916 -0.009775 -0.006272 0.001763 
+-0.022080 -0.010146 0.003063 -0.025279 0.006406 0.000509 
+-0.004109 -0.002405 -0.016507 -0.043150 -0.022634 -0.036367 
+-0.052306 -0.016505 0.004448 -0.016912 -0.004158 0.006490 
+-0.014317 -0.009180 0.005303 -0.019223 -0.022472 0.005036 
+0.000105 -0.016119 -0.011119 0.021692 0.002998 0.002321 
+0.015647 0.003790 0.004349 0.006366 -0.002106 0.000838 
+0.001067 0.000183 -0.000996 -0.000219 -0.004114 -0.013634 
+0.002381 -0.000437 -0.010751 0.009021 -0.001508 -0.007201 
+-0.005211 0.004773 -0.004347 0.000099 0.009120 -0.010507 
+0.001719 0.004263 -0.010645 0.000077 0.004533 -0.007026 
+-0.000594 0.003662 -0.003632 -0.000246 0.001150 -0.000263 
+0.003579 -0.001517 0.008568 0.012492 -0.005067 0.007862 
+0.012847 0.002407 0.030780 -0.010564 -0.022977 0.004446 
+-0.016658 -0.010206 0.014234 -0.000537 0.000203 -0.000869 
+0.009758 0.001512 -0.003792 -0.001518 -0.011002 -0.009811 
+-0.023076 0.009417 -0.014415 -0.015188 -0.003478 -0.008903 
+-0.005922 -0.008049 0.005755 -0.004370 -0.001435 0.009263 
+-0.004445 0.000222 0.010882 0.001158 0.002272 0.008446 
+0.010921 -0.001041 0.007204 0.018890 -0.010145 0.003852 
+0.007267 -0.006758 -0.017079 0.030103 0.004767 -0.027103 
+-0.007966 0.003566 -0.015560 -0.008510 0.010494 -0.022249 
+-0.003475 0.005421 -0.018824 -0.001140 -0.001823 -0.007920 
+0.000941 -0.002489 -0.000359 -0.000564 -0.006208 0.004303 
+0.002337 -0.003484 0.004924 0.008310 -0.002817 -0.002252 
+0.014537 0.007268 -0.005122 0.003876 -0.003876 -0.001938 
+-0.009921 -0.008955 -0.002809 -0.004917 -0.019668 0.001282 
+-0.006612 -0.009469 0.014652 -0.012381 0.000000 0.010476 
+0.002808 0.002407 0.011795 0.019436 0.029154 -0.001333 
+0.044462 0.033502 -0.021298 0.011897 -0.003007 0.003504 
+0.007264 0.003348 0.009009 0.004573 -0.002084 0.002952 
+0.004442 0.007742 0.003702 -0.001407 0.008979 -0.000759 
+0.002811 0.006049 -0.001130 -0.000750 -0.000622 0.000003 
+-0.003208 -0.002315 0.001603 -0.007161 -0.002273 0.004868 
+-0.009787 -0.001621 0.007902 -0.006446 -0.002021 0.003470 
+0.002336 0.015765 0.001293 -0.003674 0.004363 0.006957 
+-0.006370 0.013101 -0.002370 0.001144 0.003560 -0.004715 
+0.003290 0.003653 -0.007097 0.004054 0.005563 -0.011039 
+0.000105 0.000933 -0.003319 -0.014615 -0.003192 0.007677 
+-0.023293 -0.006735 0.009359 -0.025118 -0.005808 0.001510 
+-0.024689 0.003955 -0.015438 -0.041882 -0.013884 -0.035187 
+-0.042804 -0.012514 0.011092 -0.020182 -0.004923 0.018080 
+-0.024913 -0.006093 0.004502 -0.016352 -0.009401 -0.002110 
+0.003096 -0.002717 0.004756 0.162115 -0.063886 0.094828 
+0.034090 0.034393 -0.031517 0.004563 0.009063 -0.010194 
+-0.000915 -0.000454 -0.001152 0.006163 -0.001192 -0.000385 
+0.003333 0.008213 -0.002527 -0.004153 0.007151 -0.013817 
+-0.000794 0.013334 -0.001188 -0.003540 0.008603 -0.002758 
+-0.003153 0.001189 -0.011772 0.005679 -0.006407 -0.012949 
+0.013688 -0.002409 -0.002664 0.001307 0.002267 0.013947 
+-0.004338 -0.003231 0.028982 -0.016415 -0.003967 0.031467 
+-0.009880 -0.002903 0.016243 -0.007992 -0.009008 0.001423 
+0.036949 -0.057085 -0.034915 0.012568 -0.006347 -0.037848 
+-0.000890 -0.011620 0.002936 -0.000499 -0.002915 -0.001156 
+-0.001949 -0.003683 0.003320 0.000012 -0.001940 -0.000733 
+0.003965 0.003495 0.003182 0.012132 0.007604 -0.001187 
+0.009015 0.001158 0.004069 0.004248 -0.015825 0.000205 
+-0.002420 -0.029557 0.015433 -0.003280 -0.002963 -0.001323 
+0.010103 -0.005283 0.000327 0.011208 -0.005395 -0.007868 
+0.009938 -0.004075 -0.003490 0.004988 -0.001480 0.002765 
+-0.008303 -0.012117 -0.008864 0.004614 -0.017297 0.008839 
+0.004675 -0.008598 -0.002191 0.004573 0.007548 -0.000992 
+0.009495 0.011694 -0.016261 0.012068 0.009331 -0.019290 
+0.014840 0.010271 -0.015737 0.008324 0.005773 -0.006176 
+-0.001339 0.001213 -0.001226 -0.015448 -0.010784 0.007631 
+-0.015070 -0.011604 0.011287 0.001456 0.001267 -0.002041 
+0.009800 -0.000817 -0.002455 0.004932 0.001702 0.001364 
+-0.006777 -0.001336 0.002794 -0.005953 -0.002454 -0.003756 
+-0.000898 0.001746 -0.009030 0.001419 -0.000484 -0.000419 
+-0.000696 -0.000377 0.004699 0.000585 0.005643 -0.005936 
+0.011986 -0.000484 -0.014403 0.002077 0.022292 -0.014123 
+0.003557 0.011182 0.000484 -0.000763 0.005065 -0.000113 
+-0.003909 0.003491 0.000057 -0.003005 0.004973 -0.005044 
+-0.003235 0.007474 -0.001869 0.000345 0.000107 -0.000415 
+0.006727 0.006718 0.004806 0.022131 0.006649 0.002462 
+0.025457 0.011097 -0.006471 0.011688 0.009390 -0.003575 
+-0.003308 -0.010517 0.003348 -0.012442 -0.021923 0.027781 
+-0.016047 -0.000364 0.010033 -0.010718 -0.004434 -0.004210 
+-0.024197 -0.004521 -0.010562 -0.044131 -0.007447 -0.016411 
+-0.029717 -0.008718 0.013195 -0.001518 -0.002098 0.002013 
+-0.007995 0.005363 0.003550 -0.015407 -0.001585 -0.006294 
+-0.013331 -0.003054 -0.008239 0.000347 -0.004728 0.005389 
+0.102955 -0.008804 0.034558 0.007665 0.061533 -0.013547 
+0.007954 0.028451 -0.009997 0.002521 0.022817 -0.005834 
+0.004459 0.013925 -0.004850 -0.001770 0.004239 -0.006213 
+-0.011273 -0.001283 0.006476 -0.003364 0.003215 0.000748 
+-0.006280 -0.002584 -0.012421 -0.008748 -0.002678 -0.002696 
+0.002583 -0.005072 0.004837 0.004183 0.001314 0.007918 
+-0.004981 0.005598 0.005907 -0.007946 0.001927 0.004779 
+-0.005742 -0.001350 0.001523 0.000366 0.000259 -0.002154 
+0.000698 0.005057 -0.010199 0.000785 -0.011033 0.015372 
+-0.004973 -0.023611 0.018410 -0.007656 -0.006406 0.003437 
+-0.011282 -0.008568 -0.005406 -0.023321 -0.010618 0.004242 
+-0.023459 0.002060 0.002327 -0.008659 0.000327 -0.000490 
+0.000751 -0.003832 -0.003402 -0.001940 -0.010314 -0.010500 
+-0.006129 -0.005766 -0.011466 0.003497 -0.002162 -0.003715 
+0.005244 -0.005122 -0.004756 0.004107 -0.001896 0.001692 
+0.010601 0.007202 0.003613 0.000917 0.007476 -0.005411 
+0.000218 0.000336 0.004309 0.000078 -0.003547 -0.001177 
+0.002345 -0.005444 0.000807 0.002948 0.001489 -0.006349 
+-0.001235 0.001899 -0.006011 -0.000907 0.000040 -0.001326 
+-0.000400 0.000693 0.000402 0.000174 -0.000370 0.000136 
+-0.007381 -0.005090 0.009606 -0.015348 -0.010303 0.013060 
+-0.018072 -0.012800 0.013999 -0.016199 -0.009655 0.008508 
+-0.010771 -0.004370 0.002693 -0.009176 -0.002080 0.005205 
+-0.004038 0.000244 0.008618 0.009340 0.003651 0.007928 
+0.008250 -0.002868 0.006258 0.002141 0.000991 0.005036 
+-0.002978 -0.009730 -0.005109 0.013764 0.002873 -0.005892 
+0.033186 0.030842 -0.022426 0.019181 0.032470 -0.010978 
+0.005709 0.014288 -0.003675 0.002426 0.008324 -0.002117 
+0.005288 0.012478 -0.018602 0.010428 0.003133 -0.031036 
+-0.005333 0.003733 -0.008206 -0.009145 0.001710 -0.001823 
+-0.008603 -0.003544 0.005843 -0.001752 -0.003854 0.011538 
+-0.013719 0.005787 0.005344 -0.008536 -0.001101 0.012850 
+-0.003980 -0.004698 0.002686 0.002284 -0.003196 -0.008108 
+0.003565 0.004038 -0.021233 0.007327 -0.007594 -0.009677 
+-0.009037 0.000125 0.000947 -0.019177 -0.002852 0.001890 
+-0.004387 0.009924 0.003796 0.001558 0.002625 -0.001744 
+-0.004835 -0.006020 0.004269 -0.016282 -0.001592 0.007154 
+-0.018564 -0.004964 -0.004030 -0.017693 -0.008514 -0.004419 
+-0.013391 -0.010192 0.001029 0.039765 -0.005723 0.021658 
+-0.008368 0.022766 0.000702 0.002352 0.002989 -0.010272 
+0.007530 0.001469 -0.010158 0.002604 -0.001684 -0.000529 
+0.003821 -0.003900 -0.017510 0.006853 -0.004294 -0.003088 
+0.003027 0.000107 0.008011 -0.006069 0.003069 0.020413 
+-0.005661 0.007792 0.007884 0.000110 -0.000916 -0.000106 
+0.004385 -0.003992 0.001303 0.008252 -0.008089 0.000081 
+0.007884 -0.003608 -0.004321 -0.001764 -0.002395 0.003768 
+-0.000488 -0.002720 0.009433 -0.004471 -0.008212 0.035129 
+0.003622 0.011323 0.063632 -0.002957 0.003060 0.019785 
+-0.004875 -0.009267 0.005681 -0.008173 -0.016794 0.008509 
+-0.002126 -0.019170 0.007768 0.003002 -0.008931 0.003161 
+0.001227 -0.004786 -0.001858 -0.003091 -0.001270 -0.006718 
+-0.005474 0.000107 0.000050 -0.003041 -0.004461 0.009198 
+0.000576 -0.007800 0.008089 0.006317 -0.002777 0.002400 
+0.005562 0.001140 0.009625 0.005175 -0.000133 0.004423 
+-0.005294 -0.007607 0.005533 -0.012841 0.003132 0.004339 
+-0.009597 0.004974 -0.000851 -0.003072 0.003449 0.000615 
+-0.003116 0.001801 0.002928 -0.000142 0.005603 0.004762 
+-0.004014 0.002010 0.002026 -0.003330 -0.001364 0.001981 
+-0.016542 -0.016959 0.011382 -0.015962 -0.022892 0.022556 
+-2.390532 -2.195266 1.881657 -0.025052 -0.014398 0.017094 
+-0.014489 -0.014832 0.013225 -0.003531 -0.007629 0.003406 
+-0.007131 -0.007764 -0.004486 -0.004331 -0.001186 0.000620 
+0.006530 0.002622 -0.005802 0.008547 0.006812 -0.006278 
+0.000922 0.006629 -0.004017 -0.022465 -0.009261 -0.007425 
+-0.020911 -0.016315 0.006770 0.003656 -0.012751 0.004089 
+-0.000778 -0.005686 0.005630 -0.002202 0.001905 -0.002351 
+-0.015145 -0.001395 -0.000533 -0.013600 -0.004038 -0.001915 
+-0.007443 0.002220 0.000675 -0.004097 -0.003179 0.000736 
+-0.011498 -0.000227 0.003126 -0.017876 0.008687 0.012790 
+-0.013430 0.009562 0.024398 -0.003406 0.003246 0.031183 
+-0.000956 -0.008580 0.022920 0.007307 -0.009379 0.006435 
+-0.000378 -0.004219 -0.002896 -0.009970 -0.015861 0.011614 
+-0.017449 0.015033 0.012144 0.024356 0.029172 -0.006959 
+-0.002303 0.014098 -0.001733 -0.008225 0.006561 0.009260 
+-0.003162 -0.002335 0.004629 -0.005463 -0.005409 0.002677 
+-0.011263 -0.007067 0.006797 -0.020329 -0.006742 -0.002625 
+-0.018348 -0.014424 0.001303 -0.020690 -0.020835 0.005744 
+-0.027453 -0.039510 0.003426 -0.049493 -0.050158 -0.011680 
+0.026689 0.016116 -0.014956 -0.003939 0.009411 0.005825 
+-0.016168 0.000848 0.006161 -0.019315 0.006210 0.011395 
+-0.009158 0.002134 0.000343 -0.001946 0.000243 0.000949 
+-0.008046 -0.001409 0.003900 -0.001429 -0.003857 -0.006714 
+-0.013302 -0.013306 -0.009311 -0.003117 -0.001426 -0.000634 
+0.006504 0.002486 -0.000969 -0.009282 -0.004205 0.007071 
+-0.014195 -0.004058 0.022975 0.000355 0.001156 0.015118 
+0.002520 -0.000137 0.003053 -0.016850 -0.003235 0.005649 
+-0.026570 -0.000869 0.004687 -0.027405 -0.002549 0.008857 
+-0.018557 0.000527 -0.003957 -0.003521 0.013475 -0.002143 
+-0.002050 0.005497 0.001176 -0.002407 0.000215 -0.003452 
+0.002496 -0.002747 -0.006142 -0.002173 -0.000731 -0.000616 
+-0.007940 -0.011598 0.009145 -0.005911 -0.018363 0.013500 
+-0.006691 -0.010543 0.010595 0.001823 -0.000210 -0.000673 
+-0.001863 0.002904 -0.007042 -0.005465 0.002118 -0.002063 
+-0.001914 0.001352 0.004117 -0.001360 0.000616 0.005589 
+-0.004597 -0.000403 0.002097 -0.005551 -0.002369 0.005620 
+-0.005579 0.004270 -0.000523 -0.011753 -0.003618 0.006329 
+-0.019419 -0.015901 0.022018 -0.018797 -0.025495 0.028173 
+-3.107785 -2.550898 2.089820 -3.096591 -2.460227 1.897727 
+-0.014028 -0.027388 0.017957 -0.011730 -0.021073 0.006700 
+-0.011145 -0.006782 -0.002828 -0.000244 0.001707 -0.002020 
+0.002378 0.003925 -0.004254 0.001908 0.008182 -0.009776 
+0.002298 0.007292 -0.014926 0.004114 -0.000316 -0.009786 
+0.005678 0.000404 -0.004322 0.010286 0.004760 -0.000180 
+0.014606 0.004716 0.003341 0.004933 0.015333 0.002733 
+0.000000 0.009800 0.001800 0.000122 0.000211 0.000337 
+0.003333 0.001301 -0.000081 0.010092 0.004833 0.004727 
+0.008974 0.007303 0.005477 0.004375 0.001571 0.003469 
+0.001964 0.000394 0.001398 0.005306 0.004980 0.002490 
+0.003499 0.004655 -0.001704 0.011533 0.007124 -0.003199 
+0.009260 -0.006877 -0.009836 -0.023792 -0.017143 0.000454 
+-0.021531 -0.015721 -0.001952 0.048874 0.033662 -0.031644 
+0.002078 -0.004874 -0.007603 0.001758 -0.004431 -0.009559 
+0.001191 0.001619 -0.006897 -0.004474 0.005962 0.004195 
+-0.004595 -0.004568 0.007957 -0.016319 -0.013553 0.005891 
+-0.025520 -0.002370 -0.000737 -0.005553 -0.008360 -0.006964 
+-0.003519 -0.009533 -0.002250 -0.008254 -0.006883 -0.000881 
+-0.002399 -0.005219 -0.014856 -0.003012 -0.001009 -0.012193 
+0.003347 -0.003932 -0.000068 -0.004358 -0.005165 -0.004139 
+-0.013996 -0.011931 -0.002409 -0.011531 -0.016083 0.003247 
+-0.008608 -0.016391 0.002976 -0.012380 -0.011391 0.003837 
+-0.002989 -0.008267 -0.000556 0.004898 -0.003138 0.001802 
+0.010889 -0.001741 -0.000387 0.015025 -0.001930 -0.005217 
+0.003322 -0.005764 -0.001886 -0.003705 -0.001076 -0.004443 
+-0.008484 -0.003471 0.007328 -0.001410 -0.013716 0.025255 
+0.008377 -0.014768 0.056402 -0.001419 0.003981 0.078790 
+0.007643 0.030875 -0.007522 -0.007715 0.026789 -0.022400 
+-0.008577 0.009078 -0.014352 -0.002135 0.003336 -0.010135 
+0.000823 0.002251 -0.004610 -0.000503 0.001579 -0.002397 
+0.001531 0.001396 0.002458 0.001347 -0.001157 0.006302 
+0.010585 -0.003278 0.000465 0.009796 -0.005961 -0.006230 
+0.006704 -0.004293 -0.004268 0.006416 0.002453 -0.004971 
+-0.001366 0.001450 -0.003194 -0.005586 -0.003124 -0.000966 
+-0.007451 -0.004548 0.000302 -0.004510 -0.007267 0.000167 
+-0.000998 -0.001796 0.002951 0.000972 0.002163 0.008602 
+-0.001809 -0.004769 0.017867 -0.007275 -0.016841 0.023279 
+-2.784314 -2.071895 1.836601 -2.956250 -2.162500 1.512500 
+-0.007796 -0.024485 0.012701 -0.014325 -0.018818 0.009963 
+-0.012118 -0.013749 0.006884 -0.007413 -0.004873 0.009619 
+-0.001183 0.000717 -0.000528 0.001931 -0.001192 -0.004277 
+0.012632 0.001024 -0.003286 0.015585 0.008264 -0.006269 
+0.007009 0.004714 -0.007342 0.002408 0.000467 -0.002887 
+0.007150 -0.000036 -0.005241 0.017250 0.002545 0.001997 
+0.009854 0.002538 0.003800 0.001480 -0.001872 0.000623 
+-0.003303 -0.005512 0.000569 -0.002547 -0.007462 0.001668 
+0.000360 -0.004074 -0.000138 0.010663 0.006677 -0.002360 
+0.013665 0.006972 -0.003214 0.002309 -0.008434 -0.001739 
+-0.009838 -0.017854 -0.001336 -0.002966 -0.009872 0.001362 
+-0.001150 0.004037 -0.004680 0.001842 0.004528 -0.000038 
+-0.002394 -0.002934 0.001370 -0.006086 -0.009956 0.012992 
+0.007844 0.007970 -0.008161 0.001892 0.002621 -0.004855 
+0.000691 -0.004072 0.002514 -0.002710 0.002436 -0.000920 
+-0.009262 0.006480 0.001835 -0.016706 0.004389 -0.012114 
+-0.016593 0.004973 0.000659 -0.009653 -0.019127 -0.002953 
+-0.026459 -0.021492 0.004955 -0.023028 -0.006049 0.019781 
+-0.002044 -0.001261 0.008547 -0.000864 -0.003808 0.000916 
+0.012093 0.002885 -0.001803 0.008605 0.002986 -0.002715 
+-0.000357 0.000387 -0.000234 -0.014183 -0.006075 0.006511 
+-0.023638 -0.011916 0.013030 -0.023930 -0.011088 0.000351 
+0.000388 -0.003951 -0.003485 0.004739 -0.009091 0.003792 
+0.011064 -0.008009 0.002288 0.006284 -0.001464 -0.003013 
+0.000792 0.004760 0.005851 -0.004095 0.004389 0.009014 
+-0.004709 -0.000762 0.008499 0.001225 -0.007842 0.003529 
+-0.005245 -0.000942 -0.016409 -0.076235 0.096942 -0.025455 
+-0.009037 0.009461 -0.000867 -0.001025 0.003138 -0.002357 
+-0.000412 0.004667 -0.008985 0.000530 0.003123 -0.012515 
+0.001803 -0.000164 -0.008953 -0.000438 -0.003771 -0.001374 
+-0.005084 -0.000665 0.001765 -0.001199 0.001828 0.005374 
+0.001709 0.002089 0.004685 0.005046 0.001789 0.002715 
+0.007012 0.001852 -0.004101 0.005897 0.002267 -0.003297 
+0.003671 0.000297 -0.000742 -0.001084 -0.000301 0.000385 
+-0.003117 -0.001932 0.000256 0.000325 0.000546 -0.002799 
+0.007825 0.002262 -0.006237 -0.000744 0.009673 0.002109 
+0.001424 -0.004185 0.009847 -0.007158 -0.018672 0.017369 
+-0.018579 -0.026006 0.020160 -3.070513 -2.493590 2.282051 
+-3.311258 -2.867550 1.920530 -0.024730 -0.031150 0.017785 
+-0.025260 -0.023721 0.006324 -0.021327 -0.009733 -0.005542 
+-0.010447 -0.006942 -0.008694 -0.008252 -0.007518 -0.004210 
+-0.005592 -0.006327 0.000705 -0.000781 -0.002214 0.001463 
+0.000227 0.002166 0.000078 -0.002907 0.004587 -0.003733 
+-0.004161 0.008700 -0.006619 -0.006917 0.010300 -0.003245 
+-0.005410 0.012154 -0.004563 -0.011219 0.006273 0.002702 
+-0.013643 -0.001468 0.013849 -0.002945 -0.003305 0.009225 
+0.007469 0.005026 -0.003146 0.003992 0.006236 -0.003991 
+-0.004415 -0.007460 0.001066 -0.009804 -0.013922 0.000000 
+-0.012083 -0.010289 0.002709 -0.002109 -0.002938 0.000648 
+0.009892 0.009431 -0.004852 0.011189 0.004295 -0.003248 
+0.010996 -0.009328 0.000152 0.000164 0.001879 0.008821 
+0.029663 0.010679 -0.018462 0.009409 0.043139 -0.048100 
+0.001234 0.004045 -0.001849 -0.006653 -0.005350 0.005413 
+-0.005776 0.003496 0.003057 -0.011220 0.005074 0.012505 
+-2.329787 -3.989362 5.765957 -0.008440 -0.015837 0.034408 
+-0.008793 -0.003338 0.019023 -0.007226 -0.004202 0.017459 
+-0.002166 -0.010675 0.024865 -0.002382 -0.002268 0.013939 
+0.003202 -0.005745 0.004237 -0.005676 0.000148 -0.000016 
+-0.009395 -0.002105 -0.001342 -0.018947 -0.015263 0.000000 
+-0.017817 -0.024922 0.008548 0.001026 -0.012692 0.008590 
+0.014059 0.006183 0.004259 0.013478 0.010205 -0.008647 
+0.002598 0.012797 -0.010448 -0.005674 0.021181 -0.007079 
+-0.009933 0.012877 -0.003727 -0.000807 0.000268 -0.000082 
+0.001729 0.007316 -0.003924 0.002409 -0.002123 0.010836 
+0.009660 -0.017724 0.010301 -0.017869 0.013954 0.000456 
+-0.004182 0.001933 0.001893 -0.001033 0.001841 -0.002314 
+-0.001708 0.001548 -0.004563 0.001650 -0.000976 -0.001502 
+0.003183 0.002220 -0.001995 0.001214 0.001641 0.001034 
+0.000831 0.001477 0.001944 -0.001968 0.000666 0.000336 
+-0.004558 0.000318 0.002661 -0.001609 -0.000286 0.001002 
+0.000476 0.001151 -0.003624 0.000903 -0.001814 -0.005264 
+0.001425 -0.002772 -0.003162 -0.002616 -0.004160 -0.001592 
+-0.009307 -0.004760 0.000372 -0.007550 -0.002220 0.003551 
+-0.000829 -0.000466 0.001969 0.003067 0.001984 0.001677 
+-0.000647 -0.002040 0.000050 -0.009921 -0.015719 0.016865 
+-0.016323 -0.019009 0.018221 -0.021214 -0.019592 0.017197 
+-0.022460 -0.017564 0.019267 -0.016300 -0.019308 0.018504 
+-0.013197 -0.020831 0.011279 -0.019790 -0.019423 0.003207 
+-0.016989 -0.011612 -0.009491 -0.009527 -0.010011 -0.006363 
+-0.004093 -0.007246 -0.003295 0.002179 -0.002842 -0.007388 
+0.005077 0.003615 -0.013416 0.008340 0.009289 -0.012468 
+0.004204 0.013716 -0.007857 0.006914 0.006961 -0.011580 
+0.001874 0.010982 -0.012640 -0.005351 0.008022 -0.009582 
+-0.007179 0.007179 0.001795 -0.007950 -0.000882 0.004543 
+-0.004103 -0.006324 0.002552 -0.003818 -0.005455 0.004000 
+-0.006879 -0.005836 0.009376 -0.008934 -0.006768 0.012860 
+-0.008074 -0.006197 0.005837 -0.002587 -0.000186 0.000811 
+0.008057 -0.006125 -0.004042 0.018435 -0.010898 0.001154 
+0.005564 -0.003345 0.006613 -0.000519 -0.008081 -0.005021 
+-0.001489 0.000023 -0.001010 0.003124 0.000802 0.000956 
+0.011878 0.008163 -0.007985 0.007763 -0.001144 0.004272 
+-0.018779 0.007127 -0.006696 -0.026942 0.003241 0.046991 
+-0.005531 -0.032503 0.044989 -1.314286 -2.442857 4.050000 
+0.009880 0.000263 0.032915 0.013780 -0.003535 0.024935 
+0.010496 -0.005513 0.023168 0.003794 -0.009366 0.013680 
+-0.004995 -0.006839 -0.012284 -0.004886 -0.001793 -0.003082 
+-0.010698 0.000578 0.000241 -0.013538 -0.004828 0.000863 
+-0.000683 -0.010976 0.000341 0.017155 -0.005433 -0.005031 
+0.022647 -0.000982 -0.009031 0.017222 0.005447 -0.006809 
+0.003348 -0.001133 0.002349 -0.001502 -0.012295 -0.000573 
+-0.001617 -0.004653 0.000449 0.006000 -0.000145 0.001164 
+-0.001717 0.005228 0.003646 0.012391 0.027286 0.005740 
+-0.007677 0.017215 -0.012325 -0.005521 0.002972 0.003548 
+-0.003194 -0.000044 0.007402 0.000351 0.000044 0.002652 
+-0.001718 -0.005149 -0.003901 0.000979 -0.003627 -0.000431 
+0.003670 0.000733 -0.000892 0.002458 -0.000265 -0.000130 
+-0.000428 -0.000514 0.003210 0.001267 0.000783 0.003017 
+-0.002609 0.000000 0.002391 -0.005526 0.006389 0.002587 
+-0.000421 -0.000583 0.000874 0.001915 -0.001915 0.006170 
+-0.001184 -0.005193 0.005785 -0.001900 -0.000072 0.000573 
+-0.002154 0.004205 0.000179 -0.002469 -0.000107 -0.000906 
+-0.002857 -0.001503 -0.002671 -0.004695 -0.003907 -0.001856 
+-0.004261 -0.003034 0.001387 -0.004157 -0.004784 0.001373 
+-0.004999 -0.008507 0.014920 -0.008790 -0.010918 0.017011 
+-0.008711 -0.008935 0.017063 -0.006397 -0.005801 0.012305 
+-0.010873 -0.004572 0.006329 -0.016903 -0.011848 -0.004250 
+-0.017965 -0.010754 -0.012474 -0.022722 -0.011008 -0.012486 
+-0.022905 -0.011962 -0.010056 -0.014457 -0.010772 -0.009546 
+-0.002539 -0.005208 -0.009937 0.006750 0.005620 -0.004516 
+0.008118 0.018492 0.001224 -0.001711 0.023493 -0.003215 
+0.015495 0.034590 -0.029498 -0.001020 0.023231 -0.022285 
+-0.001719 0.009844 -0.015040 0.007858 0.008402 -0.002440 
+0.014118 0.007588 -0.002529 0.005678 0.000179 -0.000754 
+-0.002818 -0.002273 0.007091 -0.008026 -0.005733 -0.003030 
+-0.002255 0.002229 -0.005846 0.001713 0.007527 0.001422 
+-0.000772 0.008674 0.003140 0.005533 0.011317 -0.000672 
+0.011793 -0.004055 0.006725 0.003658 0.016135 0.001682 
+0.001736 0.011968 -0.002710 -0.002579 0.008730 -0.000055 
+0.002116 -0.000347 -0.005439 0.004869 -0.010170 -0.014206 
+-0.002186 -0.044575 -0.017045 0.009576 -0.030276 0.032693 
+-0.012386 -0.025454 0.029143 -0.010424 -0.016198 0.029766 
+-0.004063 -0.012240 0.031925 0.004396 -0.010424 0.030915 
+0.005600 -0.009065 0.025067 0.000174 -0.011593 0.011008 
+0.001369 0.000158 0.000592 0.003023 -0.002865 -0.000973 
+0.006166 -0.005927 -0.000037 -0.001906 -0.012620 0.005188 
+-0.007151 -0.011221 0.020856 0.002565 -0.002842 0.019969 
+0.001179 -0.000393 0.008214 0.000262 0.000719 0.001156 
+-0.000421 0.001432 0.000547 -0.002793 0.005746 0.000214 
+0.000880 0.005652 0.003959 -0.005119 -0.000054 0.000576 
+-0.000938 0.001284 -0.001614 -0.001357 0.007044 -0.005229 
+0.002088 0.003199 -0.008949 0.003154 -0.003305 -0.002482 
+0.002991 -0.002442 0.001716 0.000652 0.001508 0.002517 
+-0.000820 0.003559 0.003351 0.002763 0.004724 0.003118 
+0.003517 -0.000496 0.001532 0.002925 -0.000276 -0.000310 
+0.000194 -0.001748 -0.000583 0.000129 -0.001660 -0.000733 
+0.001541 0.000064 -0.001220 0.001469 0.003309 -0.003679 
+0.006254 0.000543 -0.002994 0.000256 -0.000037 0.000476 
+-0.000657 0.000785 -0.001611 0.001062 -0.001625 -0.002062 
+-0.005917 -0.005333 -0.000583 -0.001716 -0.001984 -0.000897 
+0.002607 0.008863 -0.000920 0.010497 0.013978 -0.000825 
+0.012584 0.009094 -0.008826 0.003610 0.005788 -0.011265 
+-0.004568 0.003337 -0.005580 -0.004996 0.002527 0.001797 
+-0.004628 0.003469 0.004048 -0.006279 0.000491 0.001829 
+-0.013842 -0.009446 0.004982 -0.010692 -0.020749 0.001244 
+-0.014614 -0.022957 -0.010282 -0.019193 -0.023210 -0.015208 
+-0.021306 -0.021253 -0.016215 -0.020929 -0.018328 -0.012691 
+-0.017359 -0.017326 -0.007439 -0.012438 -0.015777 -0.001895 
+-0.003765 -0.006138 0.002336 0.003829 0.013666 -0.000587 
+0.000147 0.020736 -0.008156 0.012979 0.011393 -0.007932 
+-0.004470 -0.003914 0.001627 -0.012789 -0.005625 0.009034 
+-0.013185 -0.004495 0.004295 -0.003079 0.002500 -0.003558 
+-0.001167 0.006300 0.001633 -0.001879 0.003158 0.007194 
+0.000151 -0.002683 0.000135 -0.004311 -0.004839 0.002616 
+0.003914 -0.012354 -0.002280 0.005465 -0.007074 -0.012919 
+0.006316 -0.002429 -0.003363 0.009818 0.005737 0.003900 
+0.013199 0.005658 0.002679 0.009938 0.004498 0.000443 
+0.007647 0.007405 -0.004039 0.011263 0.002848 -0.013204 
+0.011065 -0.002965 -0.012121 -0.001827 -0.002460 -0.001018 
+-0.006402 -0.021998 0.018432 -0.014274 -0.020627 0.028217 
+-0.008678 -0.014748 0.023421 0.001123 -0.012452 0.014582 
+-0.003965 -0.006943 0.005600 -0.005547 -0.006235 0.003183 
+0.005117 0.014942 -0.004401 0.000220 0.001772 -0.001206 
+-0.007412 -0.004911 0.012741 -0.010270 -0.007297 0.022703 
+-0.006000 -0.013782 0.003445 0.006085 0.007062 0.013426 
+-0.002095 0.006476 0.012452 -0.009869 0.005831 0.011598 
+-0.008189 0.003768 0.011885 -0.003524 0.004077 0.007399 
+0.010631 0.000525 -0.009023 0.003648 -0.006812 -0.006248 
+0.010456 0.005492 -0.005063 0.001434 0.003205 -0.006146 
+-0.002019 0.002267 -0.000690 -0.000342 0.001620 0.003286 
+0.000412 -0.003448 -0.000393 -0.006177 -0.006519 0.001104 
+-0.003304 -0.001835 0.002370 0.002305 0.000668 -0.000776 
+0.000736 0.005005 0.000949 -0.003891 0.003744 -0.000421 
+-0.005580 0.001864 0.002229 -0.003502 0.002576 0.001679 
+0.000631 0.004250 0.000154 -0.002267 0.004411 0.000833 
+-0.004045 0.002946 0.002357 -0.004939 0.001768 0.001883 
+-0.000678 -0.000513 0.000348 0.001260 0.002149 0.001333 
+-0.001322 0.000346 0.001297 -0.004261 -0.005155 -0.002279 
+-0.004551 -0.010691 -0.000211 -0.002198 -0.006868 -0.000824 
+-0.003206 0.001674 0.000847 -0.001608 0.001475 0.003828 
+0.000723 0.000273 0.000400 0.003450 0.000750 -0.002381 
+0.005353 0.000568 -0.000861 0.002667 -0.001373 0.002997 
+-0.003304 -0.003981 0.002930 -0.006806 -0.002594 0.004634 
+-0.006867 -0.011758 -0.000394 -0.015192 -0.022668 -0.004897 
+-1.847561 -3.402439 -0.560976 -1.792350 -3.797814 -0.524590 
+-1.529412 -3.241176 -0.329412 -0.011041 -0.021593 -0.001251 
+-0.003231 -0.010138 -0.001573 -0.001588 -0.006398 -0.005843 
+0.005087 -0.028246 -0.016681 0.019794 0.003758 0.004331 
+0.027391 0.015853 -0.010569 0.004249 -0.006836 -0.009155 
+-0.011250 -0.001532 -0.002228 -0.007216 -0.008039 0.010314 
+-0.002077 -0.009041 0.005420 0.006353 -0.007619 0.000509 
+0.005684 -0.007032 -0.008937 0.014824 0.008449 -0.007334 
+0.001060 0.005133 0.001078 0.000324 0.006973 0.002947 
+0.002191 0.012819 0.003236 0.006916 0.018745 0.001666 
+0.003272 0.014304 0.005576 0.003737 0.009017 0.004955 
+0.007293 0.009977 -0.001745 0.000119 0.007771 -0.001553 
+0.001371 0.005579 0.000734 0.008115 -0.002699 0.001740 
+0.002145 -0.001483 0.002556 0.000977 0.007752 -0.005116 
+0.001657 0.006798 -0.005172 0.000136 -0.000275 0.000335 
+-0.001308 -0.004425 0.004975 -0.001459 -0.002866 0.004944 
+0.002201 -0.001703 -0.002520 0.004060 -0.006767 -0.003459 
+-0.001842 -0.008392 -0.000646 -0.004982 -0.015472 0.004673 
+-0.004099 -0.010450 0.016802 -0.001848 -0.008144 0.006644 
+0.000233 0.000430 -0.005150 -0.001361 0.002668 -0.013232 
+0.004076 0.005749 -0.011154 0.001308 0.006705 0.002540 
+-0.003297 -0.000103 -0.001442 -0.011458 -0.012047 0.015052 
+-0.003266 0.002337 0.001916 -0.003698 0.002802 -0.001824 
+-0.002518 0.001193 0.000863 -0.001225 0.004565 0.004498 
+0.001598 0.002584 -0.002549 0.001974 0.003768 -0.003727 
+0.003195 0.004221 -0.003638 0.000555 0.004117 -0.004147 
+-0.002557 0.004174 -0.002369 -0.003846 0.002793 0.001017 
+-0.004721 -0.000303 0.006355 -0.008297 -0.008297 0.005604 
+-0.005576 -0.005859 0.002141 0.000121 0.002335 -0.002583 
+0.005294 0.003028 -0.010597 -0.003170 0.001383 -0.001153 
+-0.000834 0.005345 0.001002 0.002856 0.002851 0.000258 
+0.005694 0.002095 0.000690 0.004606 0.002438 0.002125 
+0.000191 0.002825 0.000712 -0.001424 0.000417 -0.000582 
+0.001542 0.000058 0.000234 0.006597 0.004309 -0.002869 
+0.006258 0.009964 -0.005797 0.002443 0.008177 -0.006562 
+-0.005825 -0.000320 -0.001436 -0.000098 -0.002540 0.007913 
+0.001136 0.000461 0.001845 0.003129 0.004437 -0.003708 
+-0.001463 0.001369 0.002295 -0.015077 -0.015025 0.000310 
+-0.025503 -0.029732 0.002599 -1.568047 -4.325444 -0.236686 
+-1.237288 -3.926554 -0.502825 -0.007851 -0.029508 -0.005690 
+-0.004853 -0.015306 -0.005050 0.003540 0.008629 0.003036 
+0.006592 0.031645 -0.013297 0.080393 0.096698 0.016179 
+0.104425 0.058494 -0.038081 0.014934 0.056689 -0.017832 
+0.030657 0.026626 -0.020980 0.008606 -0.024788 0.003030 
+-0.002097 -0.000422 0.006445 0.005086 0.013635 0.007253 
+0.001842 0.003145 0.002516 0.001308 -0.011680 -0.006114 
+-0.002884 -0.017006 0.002278 0.002675 -0.005501 0.001887 
+0.007153 0.003702 -0.000640 0.010081 0.002330 0.004744 
+0.014118 -0.004449 0.006510 0.012920 -0.005390 0.004305 
+0.005989 0.000234 -0.001581 0.001392 0.003211 -0.000833 
+-0.002213 -0.004398 -0.001078 -0.002505 -0.002725 -0.006076 
+0.001380 -0.008268 -0.005510 -0.004137 -0.001976 -0.004483 
+-0.004329 0.003250 -0.006103 -0.000075 0.003675 -0.004092 
+0.001801 -0.002207 0.001495 0.000110 -0.006002 0.009811 
+0.002215 -0.000247 0.000861 0.010245 0.000417 -0.002561 
+0.009182 0.001866 -0.008384 0.000434 0.007941 -0.004773 
+0.009442 0.006714 -0.004226 -0.000570 -0.002064 0.001595 
+-0.000678 -0.005079 0.006944 0.001571 -0.003143 0.002321 
+0.000165 -0.000521 -0.001149 0.006415 0.009060 0.008182 
+0.023614 0.008644 -0.014768 0.002986 -0.002128 -0.001321 
+0.000313 -0.001385 0.002904 -0.000951 0.000304 0.001360 
+-0.003012 -0.000514 -0.000327 -0.003389 -0.002135 0.001672 
+-0.001742 -0.004231 -0.000436 -0.002609 -0.006357 0.002852 
+-0.002322 -0.004044 0.005209 -0.000247 -0.000222 0.001811 
+-0.002483 0.001282 -0.004162 0.001667 0.001111 -0.008556 
+-0.004304 0.005662 -0.004077 -0.002982 0.003427 -0.000772 
+0.000189 -0.000787 -0.004532 -0.000586 0.000610 -0.003317 
+-0.002432 -0.000912 -0.000521 -0.001659 -0.000814 0.000129 
+0.001308 -0.001393 -0.001108 0.003491 -0.000621 -0.001608 
+0.000903 -0.001266 -0.001085 -0.003410 -0.000414 -0.000988 
+-0.002328 -0.000480 -0.000365 -0.000330 -0.002066 0.001033 
+0.001099 -0.003348 0.005262 0.000673 -0.004120 0.006264 
+-0.002826 -0.003903 0.002484 -0.003723 -0.000202 0.001785 
+0.001381 0.000502 -0.001948 0.001512 0.000000 -0.004070 
+0.003531 0.008052 -0.002095 0.001109 0.011676 -0.002569 
+-0.001122 0.012973 0.000957 -0.002424 -0.002964 0.000193 
+-0.018371 -0.028988 0.001474 -0.936620 -5.169014 0.373239 
+-0.782353 -4.911765 0.194118 -0.005567 -0.036539 0.000995 
+-0.006275 -0.017784 0.000640 0.001576 0.003675 0.000765 
+0.003684 0.013263 -0.014450 -0.033521 -0.074671 -0.021242 
+-0.101843 -0.065510 0.028902 0.001146 -0.004753 0.031475 
+-0.028848 -0.008496 0.034183 -0.008235 -0.001636 0.010558 
+0.000746 -0.007485 -0.010740 -0.002238 -0.006929 0.001294 
+-0.000252 -0.012912 0.006920 0.003054 -0.004419 0.003305 
+-0.000178 0.006117 -0.008570 -0.003904 0.001507 -0.004802 
+-0.007893 0.000300 -0.003423 -0.015000 -0.002624 -0.002062 
+-0.002549 -0.008786 -0.001757 0.015577 -0.000273 0.000114 
+0.023494 0.003886 -0.009127 0.018060 0.004659 -0.012452 
+0.013854 0.002439 -0.006927 0.003645 -0.004933 -0.006331 
+-0.002855 -0.001280 -0.005218 -0.010942 0.001367 -0.001225 
+-0.008352 0.007883 -0.000368 0.000577 0.014523 -0.010892 
+0.006177 0.005447 -0.020566 -0.000905 -0.002077 -0.011716 
+0.006690 0.002290 -0.007474 0.003848 -0.004760 0.001852 
+0.008571 -0.003739 0.002244 0.007146 -0.006199 -0.001205 
+0.010648 -0.005710 -0.004322 0.007825 -0.007286 0.001703 
+0.000580 -0.009085 0.001378 0.000379 -0.001346 -0.000631 
+-0.003611 0.005623 0.001599 -0.010686 0.006360 0.001337 
+-0.006377 0.001535 0.006549 -0.000695 0.000825 0.001054 
+0.000395 0.000534 0.000912 0.004572 0.002179 0.000993 
+0.004320 0.004393 -0.000882 0.003238 0.004891 0.001644 
+0.002099 0.003884 0.001304 0.002264 0.000631 -0.000354 
+0.001908 -0.001009 -0.000489 0.000396 -0.000842 -0.000446 
+-0.000051 -0.000137 0.000729 -0.000710 -0.001118 0.001629 
+-0.004565 0.000326 0.001087 -0.003250 0.001881 0.000285 
+-0.000994 0.002168 -0.001279 -0.000526 0.000526 -0.005053 
+0.002144 0.003814 -0.005572 0.004163 0.005508 -0.004340 
+0.005042 0.004491 -0.001075 0.003474 0.000168 -0.000126 
+0.000390 -0.002624 -0.000922 -0.002161 -0.000041 0.001162 
+-0.000182 -0.001379 0.000757 0.003812 -0.000638 -0.000507 
+0.003302 0.000285 -0.001089 0.000320 0.000724 -0.000679 
+0.001062 0.000830 -0.000797 0.002801 0.002768 -0.001812 
+0.003886 0.003746 -0.001389 0.003187 0.001992 -0.000568 
+-0.000347 -0.000276 0.000891 -0.002252 -0.001966 0.002521 
+-0.005050 -0.002802 0.002516 -0.012195 0.004024 0.006829 
+-0.002903 -0.019269 0.007289 -0.015219 -0.041552 0.006007 
+-0.203947 -5.013158 0.217105 0.008341 -0.027990 0.014725 
+0.004938 -0.017776 -0.002992 0.001870 -0.000021 -0.011402 
+-0.002533 -0.000464 -0.015530 -0.020490 -0.014990 -0.020253 
+-0.007949 -0.018136 0.024593 0.002210 -0.008683 0.010147 
+-0.003640 0.002600 0.005152 0.005679 0.001218 -0.000159 
+-0.001410 -0.016655 -0.007755 -0.005564 -0.010878 0.007505 
+0.000775 -0.000847 0.001518 0.007690 0.002919 -0.000818 
+-0.002262 -0.012258 0.007925 0.000443 -0.017061 0.001525 
+-0.014845 -0.009925 0.000003 -0.007160 0.005759 0.002038 
+0.006370 0.015401 -0.011054 0.014812 0.014277 -0.008620 
+0.012273 0.004671 -0.002766 0.011008 0.001938 -0.002868 
+-0.000293 0.001788 0.000352 -0.001613 0.004216 -0.008273 
+-0.001767 0.000116 -0.001953 0.000938 -0.000265 -0.000208 
+0.003013 0.001431 -0.000357 0.004347 0.002204 -0.000905 
+0.000960 -0.000329 -0.000378 -0.006099 0.000274 -0.004775 
+-0.000498 -0.004415 0.001159 -0.003711 0.001264 0.005525 
+-0.000452 0.007198 -0.002956 -0.003299 0.003961 -0.001240 
+-0.010106 0.001719 0.002852 -0.006335 -0.014253 0.004681 
+-0.000538 -0.005000 0.002692 0.004595 0.007027 0.000000 
+-0.006076 0.007797 -0.004138 -0.016688 -0.003770 0.000360 
+-0.014773 -0.006444 0.011967 -0.003420 -0.000292 0.006214 
+0.006774 -0.002238 -0.009048 0.015651 -0.012016 -0.006598 
+0.012816 -0.021900 0.001541 -0.001162 -0.027738 0.011959 
+-0.020290 -0.028406 -0.004058 -0.013094 -0.005041 -0.011643 
+-0.004024 -0.000736 -0.002218 0.012214 -0.001354 0.002139 
+0.022700 0.004179 0.003069 0.017497 0.001512 -0.006399 
+0.001842 -0.008034 0.009465 0.002917 -0.009213 0.030032 
+-0.036000 -0.006923 0.004615 -0.019973 -0.000246 0.005464 
+-0.010209 -0.012715 -0.040844 -0.010035 -0.029112 -0.051597 
+-0.007178 0.000234 -0.007729 -0.000061 -0.001957 -0.000062 
+0.000902 -0.004352 0.000037 -0.003415 -0.001225 0.002523 
+0.001132 0.010460 -0.001572 0.009317 0.031055 -0.008500 
+-0.017654 0.014568 -0.006173 -0.005201 0.009954 -0.001233 
+-0.019313 -0.014362 -0.006114 -0.002199 -0.007950 -0.005151 
+0.003075 -0.002954 -0.000373 0.011997 -0.003880 0.002575 
+0.013857 0.001432 0.001910 0.007873 0.003040 -0.002746 
+0.009606 -0.000248 -0.007629 0.032922 -0.005844 -0.021336 
+0.016294 0.006274 0.011076 0.011871 0.032342 -0.009449 
+0.015250 0.009770 -0.005856 0.004612 -0.002100 -0.003167 
+-0.004796 -0.002780 -0.002494 -0.008016 0.002004 0.001017 
+-0.009345 0.005726 -0.000927 -0.007515 0.005916 0.000972 
+-0.003697 0.003009 -0.001047 -0.003670 -0.000169 -0.002522 
+-0.001506 -0.002178 0.000926 0.002705 -0.002955 -0.001297 
+0.005231 -0.005590 -0.000076 0.006792 -0.008933 0.007236 
+-0.007172 -0.012626 0.015051 -0.055179 0.009209 0.036804 
+-0.050092 0.005716 -0.003359 0.048241 -0.024330 -0.055278 
+0.039446 0.019991 -0.021681 0.002597 0.001603 -0.004187 
+0.002010 -0.005786 -0.003512 -0.021044 -0.018218 0.021793 
+-0.022661 -0.016568 -0.009213 -0.010716 0.007455 -0.006639 
+-0.015487 0.003628 -0.009477 -0.002356 0.001089 -0.005079 
+0.013083 -0.001377 0.011000 0.004509 -0.012126 0.023944 
+-0.007898 -0.011755 0.019735 -0.000551 -0.003965 0.004158 
+0.001249 0.000035 -0.003624 -0.001734 0.002135 -0.002784 
+-0.001415 0.002242 0.001583 0.001351 0.007572 0.002773 
+-0.002889 -0.001173 -0.000880 -0.005443 -0.009792 -0.002512 
+0.003155 -0.004242 0.001535 0.014053 0.006214 -0.008467 
+0.033127 0.025022 -0.004123 0.034524 0.025861 0.004564 
+0.019877 0.021672 -0.017371 0.003751 0.014325 -0.023685 
+0.000000 0.007749 -0.014391 0.000676 -0.004204 0.002887 
+-0.001494 -0.008485 -0.000883 -0.001173 -0.007499 -0.000376 
+0.011576 0.001847 -0.008389 0.006079 0.020079 -0.007474 
+-0.011130 0.010616 -0.014317 -0.017489 0.004969 -0.008957 
+-0.016598 0.002798 -0.003218 -0.003752 0.008997 -0.000650 
+0.010846 0.019155 -0.005746 0.011971 0.015083 -0.021175 
+0.010436 0.011977 -0.027749 -0.009789 -0.009131 -0.010505 
+-0.005173 -0.008794 -0.015810 0.002702 -0.006528 -0.005557 
+0.011978 -0.000667 -0.005036 0.024942 0.005817 -0.008436 
+0.021291 -0.007922 -0.003733 0.008128 0.001255 0.003082 
+0.008913 0.003459 -0.004874 -0.000005 0.006783 -0.008757 
+-0.010676 0.017743 -0.005066 -0.004137 0.022914 0.002054 
+-0.006418 0.015268 0.011242 -0.061525 0.013072 -0.002625 
+-0.040296 0.012820 -0.012144 -0.010376 0.010097 -0.007822 
+-0.002053 0.006523 -0.001811 -0.002935 0.005203 -0.000328 
+-0.004005 -0.000617 0.001281 -0.004632 -0.010250 0.004671 
+-0.005092 -0.018914 0.005011 -0.003816 -0.011370 -0.001057 
+-0.000035 0.000874 -0.001189 0.005699 0.000045 -0.002353 
+0.005451 0.001372 -0.000210 0.007486 0.003457 0.002862 
+0.013659 0.000390 0.000234 0.018489 0.004082 -0.011046 
+0.008014 0.006539 -0.001719 -0.002692 -0.002399 -0.000547 
+-0.009825 -0.001028 -0.000420 -0.004694 0.000051 0.000493 
+0.004769 0.000561 -0.001362 0.012473 -0.003527 -0.006908 
+0.026884 -0.005386 -0.015681 0.014783 -0.009914 0.002045 
+0.010265 -0.004549 -0.003937 0.001341 0.001279 0.001325 
+-0.003983 -0.008959 0.008716 -0.018072 -0.028399 0.018889 
+0.006801 -0.036359 0.058859 -0.052330 -0.043143 0.040190 
+-0.025054 -0.005573 0.029799 -0.031239 -0.009958 0.008837 
+-0.021695 -0.002731 -0.011841 -0.012983 -0.003977 -0.012719 
+-0.007028 0.000656 -0.007512 -0.001762 0.000437 -0.002570 
+0.010294 0.009142 -0.002712 0.015483 0.014856 -0.001342 
+0.001991 -0.000467 -0.002184 0.001143 -0.004822 -0.002233 
+0.000823 0.001042 -0.005938 0.002302 0.009247 -0.006190 
+-0.003097 -0.000435 0.000840 -0.013863 -0.002316 0.003990 
+-0.018825 -0.004805 0.002112 -0.012870 0.000119 0.001925 
+-0.002607 0.010458 -0.004296 0.006396 0.017390 -0.004934 
+0.008447 0.012710 -0.002880 -0.001250 0.001250 -0.000250 
+-0.011303 0.000393 0.016169 -0.018372 0.000998 0.005849 
+-0.006959 0.010508 -0.003359 -0.001269 0.010126 -0.002737 
+-0.001662 0.009513 -0.002896 -0.003421 0.007962 0.002028 
+-0.002933 -0.007355 -0.001495 -0.015222 -0.026778 -0.011667 
+-0.010961 -0.018730 -0.010763 -0.003450 -0.002882 -0.002930 
+-0.008360 0.001708 -0.004188 -0.005633 0.004367 0.000043 
+0.006342 0.004048 -0.002466 0.016915 -0.002441 -0.012486 
+0.020000 -0.004376 -0.003890 0.008505 -0.005071 0.021324 
+0.005577 -0.001771 0.008841 0.000699 0.001810 0.000393 
+0.005164 0.005275 -0.000631 0.011434 0.006857 -0.009564 
+0.005312 0.007540 -0.017067 -0.015672 0.001848 -0.013345 
+-0.010223 0.001889 -0.000835 -0.005877 -0.003943 0.014632 
+-0.018668 -0.014883 0.020259 -0.010000 -0.002890 0.001360 
+-0.003000 0.012300 0.000600 -0.010631 0.006071 -0.001857 
+-0.001319 0.010522 -0.000687 0.001618 0.011953 -0.004943 
+-0.000867 0.000056 -0.000710 -0.003132 -0.000388 -0.001042 
+-0.002758 -0.000006 0.000715 -0.002870 -0.005059 0.005797 
+-0.003472 -0.012569 0.021535 0.004672 -0.013050 0.038589 
+0.002857 -0.035000 0.046429 0.020065 -0.022494 0.004948 
+-0.002294 -0.016926 -0.005166 -0.041079 -0.027879 0.015297 
+-0.004560 -0.000275 0.016702 0.010518 0.021860 -0.024211 
+0.006193 0.029797 -0.009972 0.003332 0.006243 0.002076 
+-0.001383 -0.002917 -0.001210 -0.004722 -0.005374 -0.001996 
+0.001062 -0.006404 -0.001947 0.000807 -0.009207 -0.001838 
+0.000205 -0.004925 -0.004138 -0.001357 -0.001563 -0.001240 
+0.015324 0.010386 -0.010735 0.007297 0.009571 -0.028144 
+0.001378 0.014293 -0.027638 0.000557 0.002446 0.002260 
+-0.026212 -0.011237 0.006237 -0.005315 0.007559 0.030469 
+0.028355 -0.018487 0.011908 0.034567 -0.038436 0.027533 
+-0.002699 -0.000902 -0.002033 -0.001223 -0.006674 -0.001794 
+-0.000552 -0.001307 -0.001190 0.002946 0.000427 -0.001311 
+0.009818 0.009889 -0.008895 0.011552 0.011772 -0.010216 
+0.007335 -0.000217 -0.002298 0.000071 -0.005210 0.003978 
+-0.000571 -0.000341 0.001762 -0.001107 0.002933 -0.003841 
+0.002435 0.013428 -0.002024 -0.001803 0.008510 -0.001058 
+-0.007313 -0.000365 0.003047 -0.004392 -0.002250 0.003466 
+0.005297 0.005061 -0.002123 0.011040 0.013327 0.000259 
+0.018611 0.012873 -0.001170 0.023201 0.010116 -0.009132 
+0.023187 0.017950 -0.012229 0.016535 0.028868 -0.004955 
+0.001781 0.015964 -0.002979 -0.000238 -0.003598 0.001269 
+0.002149 -0.008111 0.005249 0.004976 0.007552 0.000410 
+0.024063 0.024135 0.001458 0.037426 0.029815 -0.010782 
+0.015600 0.019000 0.002300 -0.005437 -0.001298 -0.001399 
+0.010860 0.002573 0.003731 -0.001653 -0.000155 -0.000341 
+-0.003000 -0.004680 0.002035 -0.003713 -0.010687 -0.000209 
+-0.009527 0.004085 0.006581 0.001954 0.006613 0.014480 
+0.002733 0.000150 0.004357 0.003129 0.002200 0.000299 
+0.010192 0.003718 -0.003666 0.008426 0.004856 -0.011431 
+0.003270 0.011291 -0.010779 -0.010229 0.003426 -0.013993 
+-0.011527 -0.001178 -0.006638 0.005613 0.007954 -0.000347 
+0.026758 0.013030 -0.011970 0.016492 -0.013161 0.003440 
+0.007893 -0.016550 0.002108 0.000926 -0.005874 0.001082 
+-0.011899 0.014777 -0.023565 0.013422 0.023209 -0.044599 
+0.007443 0.020345 -0.020422 -0.006763 -0.008477 0.005631 
+-0.003537 -0.007884 0.015444 -0.001020 -0.002296 0.008112 
+-0.003788 0.007121 0.003030 -0.017641 -0.008014 0.024857 
+-0.040881 -0.013979 -0.014973 -0.000258 -0.015935 -0.030935 
+0.023977 -0.015280 -0.032780 0.030948 -0.001715 -0.023701 
+0.004098 0.003915 0.000248 -0.038374 -0.011355 0.011565 
+-0.015335 0.006258 -0.012261 -0.001354 0.006025 -0.000276 
+0.004929 0.002431 0.002994 0.005511 -0.002052 -0.001916 
+-0.002955 -0.010533 0.001199 -0.006097 -0.015619 0.013661 
+-0.012191 -0.011880 0.011376 0.000644 -0.002295 0.001810 
+0.007793 0.000645 -0.004028 0.008722 0.000974 -0.010848 
+0.012407 0.000022 -0.009933 0.024986 0.004667 0.001562 
+0.020426 -0.003059 0.009841 0.003309 -0.006309 -0.005344 
+0.018646 -0.016485 -0.026580 0.050804 -0.050491 0.008478 
+-0.000625 0.006472 -0.001553 0.002514 0.002362 0.001522 
+0.002361 0.003821 0.001314 0.005207 0.003579 0.002337 
+0.006995 0.003551 -0.000335 0.001228 0.000812 0.004265 
+-0.005451 -0.001833 0.003675 -0.003161 0.003456 -0.001885 
+-0.001135 0.003676 -0.010233 -0.003535 0.001815 -0.008695 
+-0.004779 -0.000880 -0.000356 -0.013909 -0.010114 0.008850 
+-0.014407 -0.010568 0.010777 -0.006071 0.001905 0.000640 
+-0.004176 0.007742 0.002041 -0.004372 0.007911 0.002003 
+0.002786 0.010607 0.001321 0.017532 0.014787 -0.002433 
+0.032005 0.015107 -0.010723 0.029631 0.009392 -0.011495 
+0.008376 0.005047 0.006920 0.002407 0.011473 0.010302 
+0.007436 0.013674 0.006517 0.016074 0.020807 0.006467 
+0.028090 0.023781 0.001082 0.027307 0.023204 -0.007539 
+0.010776 0.017720 -0.005987 -0.004556 -0.003973 0.006367 
+0.008192 -0.010158 0.006292 0.040986 0.004984 0.006447 
+0.033332 -0.000278 0.009981 -0.003769 -0.022365 0.007675 
+-0.017890 -0.016300 0.002181 -0.013220 -0.006827 0.001210 
+0.000969 0.000132 0.000199 0.008422 0.003187 -0.001027 
+0.013254 0.003398 -0.003171 0.011430 0.004898 -0.005957 
+-0.003119 0.005283 0.000136 -0.020582 -0.001931 -0.009523 
+-0.022504 -0.002106 -0.003431 -0.009766 -0.003892 0.003690 
+0.006856 0.005991 0.005782 0.021200 -0.003671 -0.006096 
+0.008813 -0.006642 0.000395 -0.004121 0.010697 0.003788 
+-0.000355 0.021586 0.021986 -0.005874 0.002028 0.000699 
+0.001151 0.011125 -0.023913 0.000464 0.006007 -0.004589 
+0.003497 0.003939 0.002331 -0.001856 0.003274 0.010614 
+-0.015218 -0.005994 0.000697 -0.019117 -0.001533 -0.006943 
+-0.005151 0.001067 -0.006063 0.002173 -0.004378 -0.004221 
+0.003038 -0.004651 -0.004900 0.012910 0.000099 -0.010060 
+0.011287 0.017494 -0.015278 0.042451 0.003431 -0.017451 
+-0.007430 0.001360 -0.004736 -0.004258 0.002169 -0.002888 
+-0.001128 0.008836 -0.000469 0.008512 0.010995 -0.005892 
+0.000200 0.002426 -0.003122 0.000690 -0.011387 0.016555 
+-0.019622 -0.021497 0.030804 -0.019339 -0.021562 0.025500 
+-0.011731 -0.002988 0.018210 -0.020645 -0.009801 0.027555 
+0.002458 -0.020131 0.008654 0.014357 -0.009761 0.000287 
+-0.022099 -0.026155 0.008989 -0.028349 -0.009323 0.005137 
+-0.014364 -0.013964 0.005636 -0.053804 0.018413 0.018174 
+-0.019588 -0.003853 -0.010159 -0.008402 0.000631 -0.005907 
+-0.001751 0.003565 -0.002408 0.002122 0.001020 0.000382 
+0.002411 -0.002508 -0.000156 -0.002261 -0.001959 0.000380 
+-0.005492 0.000165 0.003126 -0.000490 0.001821 0.002146 
+0.000537 0.000170 0.000779 0.003270 -0.000438 0.000332 
+0.027635 0.009143 -0.019629 0.039407 0.010017 -0.005859 
+0.029079 0.006717 0.008068 0.016363 0.001935 0.005648 
+0.007365 -0.003333 0.001151 -0.003538 -0.011172 0.001798 
+-0.012449 -0.013832 0.006086 -0.016129 -0.011538 0.006919 
+-0.011412 -0.008795 0.001486 0.002435 0.002655 0.002058 
+0.012745 0.006546 0.009095 0.016648 0.009086 0.007571 
+0.011566 0.007066 0.003105 0.003601 -0.001332 0.000448 
+0.001290 -0.005997 0.000733 0.012062 0.004683 -0.006086 
+0.023561 0.020094 -0.010783 0.016180 0.020207 0.008075 
+0.010641 0.016010 0.014490 0.001179 0.006924 0.002691 
+0.006811 0.000093 -0.000450 0.023742 -0.006754 0.002230 
+0.019298 -0.007479 0.008926 0.004023 -0.006495 0.014436 
+0.008129 -0.002716 0.006202 0.009310 0.001572 -0.000823 
+0.014432 0.010496 -0.001828 0.009757 0.004246 0.001974 
+0.000116 -0.005526 0.000587 -0.000908 -0.000637 -0.000649 
+0.002465 0.004680 0.001514 0.011368 0.004116 -0.000697 
+0.004149 0.003855 -0.000993 -0.003813 -0.005019 0.000062 
+-0.001950 -0.004879 -0.000038 -0.000655 0.000066 -0.000079 
+0.004561 0.003516 -0.000047 0.002090 0.005869 0.004545 
+0.001204 0.000683 0.001652 0.005734 -0.007980 -0.004115 
+0.009521 -0.009544 -0.003822 0.005135 -0.003378 -0.003659 
+-0.000503 0.002787 0.005414 0.005370 0.003357 0.004433 
+0.010404 -0.002323 0.004040 0.006451 -0.003958 0.004877 
+0.003466 0.000846 0.001933 0.003484 0.007762 -0.000176 
+0.011403 0.012026 -0.009566 0.001918 -0.000054 0.000040 
+-0.000120 -0.003199 -0.001154 0.000544 -0.008836 0.001184 
+-0.002531 -0.003778 0.003722 0.005097 -0.004503 -0.004651 
+0.008548 -0.009364 0.000941 0.015418 -0.010735 0.003335 
+0.005714 -0.011209 0.018901 -0.008782 -0.008209 0.015378 
+-0.003372 0.030000 0.003832 0.004778 0.047312 -0.006881 
+0.025524 0.016762 0.016952 0.009765 0.019022 0.003330 
+-0.011563 0.003125 0.003098 -0.031683 0.002876 -0.014695 
+-0.019428 0.003955 0.006010 -0.049772 -0.023195 0.034033 
+-0.119231 0.006923 0.006923 -0.042144 -0.026464 -0.012124 
+0.000821 -0.001737 0.001489 0.006383 0.000209 0.002985 
+0.005123 -0.003562 0.002938 0.002137 -0.005963 0.000397 
+0.000557 -0.003831 -0.001795 0.001589 -0.003691 -0.002504 
+-0.000294 -0.003331 -0.001811 -0.000594 -0.001266 -0.001124 
+0.005275 0.011335 -0.009822 0.003134 0.004803 -0.020830 
+0.005799 -0.004422 -0.004255 0.003462 -0.000255 -0.000466 
+0.004291 -0.001816 0.000072 0.005161 0.007087 -0.003471 
+0.006325 0.019757 -0.008278 0.005714 0.022555 -0.012444 
+0.004702 0.009895 -0.007889 0.005631 0.002644 -0.000359 
+0.005648 0.000926 0.003796 0.004865 -0.005811 0.005811 
+0.000494 -0.006342 0.002255 0.003181 0.000756 -0.001060 
+0.003234 0.017040 -0.003893 -0.008623 0.007185 0.002575 
+-0.018527 -0.005163 0.001109 -0.021675 0.000018 0.008443 
+-0.010070 0.009961 0.015350 -0.007696 0.005803 0.011147 
+-0.010002 0.001916 0.000430 -0.009655 -0.000542 -0.007041 
+0.001420 -0.001641 -0.014660 0.014370 -0.006228 -0.013656 
+0.006422 -0.008675 -0.002466 -0.002728 -0.005843 -0.003301 
+-0.008763 -0.002058 -0.002773 -0.006601 0.003429 0.001039 
+-0.000111 0.001184 -0.001075 0.006192 -0.001417 0.003108 
+0.003047 -0.004611 0.008185 -0.003896 -0.007747 0.014033 
+-0.016860 -0.003721 0.016860 -0.010142 0.010142 0.019217 
+0.012790 0.019800 0.005100 0.038153 0.026201 -0.010819 
+0.019216 0.036674 -0.006198 -0.002488 0.016919 -0.006282 
+-0.000319 0.003933 0.000403 -0.005968 -0.004646 -0.001970 
+-0.006332 -0.012760 -0.000579 -0.000667 -0.011143 0.000472 
+0.003238 -0.000976 -0.001388 0.001257 0.001676 -0.002726 
+-0.001633 0.000931 -0.006400 0.001831 -0.007107 -0.007548 
+0.003126 -0.001681 0.001126 0.008086 0.009585 -0.000387 
+-0.003043 0.007518 0.000442 -0.013007 -0.007868 0.006142 
+-0.000855 -0.000085 -0.000855 0.003485 0.007595 -0.007327 
+0.001509 0.001022 -0.008858 -0.003087 -0.012201 -0.003571 
+-0.002909 -0.024163 -0.004553 -0.014988 0.012015 -0.005316 
+0.000044 0.000765 0.005457 0.001790 -0.001796 -0.002991 
+0.000097 -0.003047 0.001984 0.038481 0.003394 -0.049121 
+0.016648 -0.028366 -0.010997 0.006463 0.002248 0.002826 
+-0.001338 0.004152 0.004653 -0.001396 0.004817 0.012435 
+-0.005888 0.001638 0.008254 -0.013555 -0.020755 0.011441 
+-0.031340 -0.048894 0.051394 -0.133790 -0.049753 -0.001491 
+-0.034263 -0.038214 -0.004212 -0.007313 -0.005788 -0.000807 
+-0.002989 -0.002215 -0.000101 -0.000968 -0.003743 0.001327 
+0.001370 -0.003817 0.001225 0.002052 -0.002262 0.000093 
+0.000845 -0.001533 -0.000282 0.000481 -0.002282 -0.000105 
+-0.009094 -0.008038 0.002904 -0.010064 -0.006397 0.000120 
+-0.002007 -0.015914 0.003018 0.000206 -0.009575 0.021655 
+-0.021174 -0.002074 0.004681 -0.003255 0.020235 -0.006894 
+0.027661 0.032913 -0.015434 0.048526 0.044280 -0.020595 
+0.033743 0.045613 -0.007927 0.006026 0.011609 -0.003391 
+-0.002570 -0.001789 -0.003314 -0.001316 0.000789 -0.006842 
+0.010211 0.001259 -0.012868 0.007161 -0.004995 -0.006299 
+0.000172 0.005125 0.003344 0.004250 0.009824 0.002456 
+0.004942 -0.001258 -0.002214 -0.004847 -0.008676 -0.013652 
+-0.004686 0.000563 -0.011055 -0.000794 0.000175 -0.003298 
+-0.003860 -0.000148 0.005270 -0.015020 -0.015187 0.011942 
+-0.017233 -0.022228 0.008055 -0.013116 -0.013533 0.007587 
+-0.006389 -0.008873 0.006826 -0.005000 0.000222 0.000111 
+-0.006719 0.009234 -0.009065 0.001676 0.027423 -0.019320 
+0.016709 0.037516 -0.017264 0.017907 0.021761 0.001561 
+0.011798 -0.005230 0.013029 0.001251 -0.014014 0.015230 
+-0.001960 -0.007416 0.000836 -0.000456 -0.004610 -0.002153 
+0.000950 -0.004285 -0.004708 -0.005594 -0.004596 0.001837 
+-0.003330 0.004921 0.005889 0.006970 0.003054 0.005769 
+0.000043 -0.005152 0.000031 -0.007988 -0.012335 -0.000128 
+-0.001779 -0.013161 0.002147 0.009619 -0.011143 0.000794 
+0.006161 -0.008053 0.001579 -0.005935 0.000952 -0.003038 
+-0.007540 0.006209 -0.003441 -0.001292 0.002477 0.001740 
+0.013281 0.008604 0.002188 0.012628 0.008448 -0.009831 
+0.004950 0.007232 -0.009018 -0.002118 0.007489 -0.006154 
+-0.000750 0.008300 -0.013567 -0.008541 0.005403 -0.018233 
+-0.006158 0.005419 -0.015025 -0.004144 -0.003371 -0.003409 
+0.004327 -0.017562 0.001870 -0.001140 -0.023659 -0.000998 
+-0.027255 -0.014943 0.004887 -0.018311 -0.007058 -0.002140 
+0.007435 -0.026195 -0.031221 0.013075 -0.010415 -0.041435 
+-0.015743 -0.041891 -0.000027 0.010559 -0.022092 0.001300 
+0.008440 -0.007839 0.002761 0.002862 -0.001299 0.000149 
+0.001145 0.006206 -0.005799 -0.002206 0.009765 -0.012463 
+-0.008889 0.005833 0.011944 -0.046578 0.000222 -0.004844 
+-0.011667 0.011767 -0.000501 -0.002998 0.012471 -0.002502 
+-0.017736 -0.004615 -0.001339 -0.018123 -0.012468 0.001217 
+-0.003365 -0.002001 -0.000410 0.004931 0.004300 0.000384 
+0.006688 0.004196 0.000338 0.004531 0.003415 -0.001920 
+0.001383 -0.000755 0.000468 0.007256 0.002370 0.001277 
+0.009554 -0.000522 0.006220 -0.000857 -0.010038 0.001304 
+-0.005969 -0.020893 0.020893 -0.018457 -0.005058 0.000775 
+0.002869 0.014746 0.009012 0.004444 0.014759 0.013119 
+0.004198 0.007607 0.007494 -0.007609 0.005870 -0.000435 
+-0.006211 -0.010342 0.006182 0.000163 0.000188 0.000751 
+0.000091 0.006541 -0.002044 -0.002727 0.007253 0.000853 
+-0.002077 0.006676 0.000271 0.005071 0.012879 -0.004699 
+0.014286 0.017407 -0.026110 0.024130 0.024120 -0.018099 
+0.003583 0.013446 -0.016579 -0.011210 0.004523 -0.004877 
+-0.022948 -0.003040 0.005623 -0.017011 -0.011133 0.017427 
+-0.012825 -0.010625 0.020150 0.000976 -0.011358 0.016521 
+0.014739 -0.006100 0.012650 0.020089 -0.004634 0.015049 
+0.014734 -0.007941 0.009637 -0.001187 -0.000355 0.001619 
+-0.002020 0.004594 0.006884 0.008676 0.002718 0.008079 
+0.018545 0.003657 0.006965 0.019582 0.014464 0.002768 
+0.015620 0.018517 -0.012509 0.009805 0.010227 -0.011018 
+0.001921 -0.007658 0.002460 -0.013284 -0.024980 0.000235 
+-0.018827 -0.023020 -0.004037 -0.012378 -0.014504 -0.002968 
+-0.005945 -0.005141 -0.000623 -0.004179 -0.000590 -0.000409 
+-0.002406 -0.005526 -0.000073 0.004615 -0.015976 -0.003195 
+0.019136 -0.018988 -0.004228 0.003803 0.010204 -0.001485 
+0.008550 0.022469 -0.014864 0.012706 0.017507 -0.013532 
+0.015349 0.002768 -0.007309 0.017575 -0.013248 -0.003239 
+0.012453 -0.014063 -0.009993 0.005693 -0.002098 -0.014286 
+0.000605 -0.002380 -0.013431 -0.006749 0.001723 -0.007884 
+0.004344 0.013490 -0.008324 0.007905 0.011262 -0.019853 
+-0.006405 0.006962 -0.009318 -0.000994 0.000078 -0.004844 
+-0.006694 -0.040218 -0.000077 0.023111 -0.030912 0.024533 
+0.012848 -0.041377 0.038623 -0.012340 -0.035761 -0.009089 
+0.008514 -0.009669 0.011895 0.005432 -0.011458 0.022404 
+-0.006966 -0.009578 0.013514 0.002045 -0.004890 0.009407 
+0.004857 -0.004108 0.000292 0.002915 0.001139 -0.003861 
+-0.012509 -0.005000 -0.002274 -0.006452 -0.001362 -0.006654 
+0.009476 0.012483 0.008137 0.008741 0.022543 0.003414 
+-0.004503 0.032000 0.000538 0.003575 0.030914 -0.008233 
+0.008682 0.011955 -0.002378 0.010418 0.010196 -0.001858 
+0.008770 0.006012 -0.001673 0.003282 0.001442 -0.001032 
+0.002880 0.002564 -0.001421 0.006346 0.008745 0.000258 
+0.011325 0.015925 0.000155 0.009946 0.017287 -0.002317 
+-0.000629 0.001493 -0.000719 -0.013839 0.001146 -0.004075 
+-0.020001 0.006841 0.005287 -0.009288 0.004842 0.005650 
+0.010183 0.008085 -0.003019 0.011975 0.012859 -0.018485 
+-0.004792 -0.004792 -0.017083 -0.012739 -0.006326 -0.012891 
+-0.008281 -0.000010 -0.007434 -0.001543 0.005501 -0.005061 
+0.000840 0.007101 -0.003914 -0.003163 0.004617 0.000822 
+0.004375 0.000250 -0.000500 -0.004183 0.014987 -0.003951 
+-0.005935 0.018811 -0.005016 -0.009256 0.012449 -0.004207 
+-0.010647 0.000507 -0.000676 -0.007887 -0.008226 -0.003670 
+0.002501 0.000847 0.004208 0.007139 -0.002496 0.013226 
+0.009437 0.002082 0.006107 0.015803 0.010158 -0.007328 
+0.018919 0.013393 -0.014856 0.009000 0.002396 -0.009106 
+-0.004695 0.004323 0.007006 -0.005870 0.005307 0.003184 
+-0.001257 0.003205 0.001367 -0.000170 0.004223 0.000303 
+-0.006927 0.001843 0.001117 -0.007886 -0.010571 0.003747 
+-0.008835 -0.016286 0.000442 -0.009147 -0.019701 -0.001616 
+-0.004594 -0.013796 -0.002001 0.005598 0.010407 0.001971 
+0.012035 0.025906 0.006398 0.009803 0.017674 0.000537 
+-0.001025 0.003315 -0.001213 -0.003816 -0.006177 0.000899 
+0.006966 -0.016419 -0.006277 0.006140 -0.018142 -0.006648 
+0.000404 0.003766 -0.003881 -0.005599 0.009912 -0.012355 
+-0.000687 0.003660 -0.003011 0.010793 -0.007864 0.003184 
+0.008789 -0.000323 0.006287 -0.009597 -0.000466 0.005629 
+-0.011744 -0.020383 -0.001141 -0.005143 -0.001009 0.000278 
+-0.001111 0.010168 -0.003050 0.000138 0.013891 -0.005441 
+-0.003161 0.014007 -0.008866 -0.004787 0.009191 0.000990 
+-0.003238 -0.003381 0.001141 0.004592 -0.018979 -0.010668 
+0.010600 -0.029628 -0.016309 0.009680 -0.018845 -0.004994 
+0.009195 -0.011064 0.002473 -0.008214 -0.009874 -0.002141 
+-0.003611 -0.008812 0.024394 -0.011824 -0.006774 0.022201 
+-0.048211 -0.001056 0.008915 -0.033172 0.024028 -0.016364 
+-0.002087 0.010248 0.001838 0.005942 -0.002038 0.005039 
+0.004721 -0.003906 0.003240 0.019869 -0.000396 -0.006479 
+0.043521 0.012129 -0.027825 0.068894 0.025346 -0.021764 
+0.022623 0.015177 -0.000877 0.001713 0.002913 -0.000865 
+0.005801 0.002101 0.000221 0.010680 -0.000253 -0.000094 
+-0.000204 0.000907 0.001173 -0.000625 -0.002155 -0.000432 
+0.000674 -0.000641 0.000660 0.001322 0.007848 -0.003643 
+-0.000763 0.018499 -0.005206 -0.000450 0.006126 -0.006577 
+-0.015258 0.000607 -0.003638 -0.004928 -0.000773 0.005688 
+0.003981 -0.004357 -0.005724 0.006279 -0.002246 -0.006311 
+-0.011489 -0.004472 0.002271 -0.033083 -0.003657 -0.000623 
+0.008696 0.008696 0.001304 0.025352 0.031436 -0.007846 
+0.015062 0.016813 -0.000490 -0.003344 -0.002806 -0.001934 
+-0.005590 0.000213 -0.003371 -0.003966 0.004120 0.001709 
+0.002196 0.005371 0.001763 0.006507 0.009124 0.002031 
+0.003258 0.011875 0.000698 -0.000386 0.007551 -0.000035 
+-0.000109 0.002245 -0.000008 0.004243 0.001157 0.000842 
+0.003695 0.002637 0.000054 -0.003790 0.008857 -0.000453 
+-0.004980 0.006218 0.003341 -0.008512 -0.004254 0.002230 
+-0.008894 -0.009886 -0.000104 -0.006429 -0.005084 0.000598 
+-0.007646 0.002275 0.001446 -0.011423 0.001316 0.003607 
+-0.015397 -0.007491 0.000022 -0.008786 -0.011713 -0.005240 
+-0.007081 -0.009275 -0.003625 -0.001664 -0.002627 -0.000691 
+0.013053 0.002748 -0.005096 0.024392 0.006417 -0.000645 
+0.022942 0.010877 0.009857 0.005713 0.014681 0.004791 
+-0.012648 -0.005017 -0.000307 -0.018825 -0.016310 -0.002930 
+-0.015779 -0.013662 -0.005590 -0.006073 -0.013033 -0.005450 
+0.003807 -0.003537 -0.016427 0.004049 -0.005005 -0.008627 
+0.005380 -0.000964 0.006969 0.007060 -0.000330 0.007560 
+0.004718 -0.006183 -0.000868 0.002455 -0.017161 0.003185 
+0.003118 -0.017182 -0.000268 0.005023 -0.000495 0.000475 
+-0.000553 0.007343 0.002655 -0.002355 0.001951 0.002717 
+0.006284 0.002310 -0.010339 0.034694 0.009220 -0.007559 
+0.039622 0.013651 0.006781 0.021519 0.009155 0.004310 
+0.001188 0.005399 0.008941 0.014347 -0.002642 0.015330 
+0.010094 -0.028951 0.014875 -0.006681 -0.030908 0.016903 
+-0.010387 -0.025082 0.013475 -0.004501 0.004039 0.003422 
+-0.040369 0.030654 0.010752 -0.015862 0.025367 -0.000297 
+-0.001261 0.008926 0.013007 0.000433 0.005633 0.003667 
+0.003356 0.008322 -0.001289 0.017783 0.014131 -0.005534 
+0.023424 0.010793 -0.023776 0.026979 0.010281 -0.024560 
+0.022190 -0.002122 -0.007675 0.005009 -0.001111 0.000455 
+-0.001914 -0.004886 0.001948 -0.001798 -0.005952 0.003182 
+0.005355 0.002678 0.004973 0.000294 -0.000941 -0.000443 
+0.000387 -0.008362 -0.000440 0.000874 -0.010147 0.002950 
+0.001592 -0.005055 0.005399 -0.019957 0.007737 0.011099 
+-0.015913 -0.014699 0.005070 -0.024969 -0.021650 0.010529 
+-0.014210 -0.013040 -0.000431 0.005839 0.001314 0.004575 
+0.023252 0.012042 -0.005798 0.016829 0.012752 -0.000851 
+-0.001139 -0.000511 -0.000206 -0.008000 -0.003846 0.016000 
+0.000974 -0.000093 0.000531 -0.000106 0.001586 0.000212 
+-0.004607 -0.003380 -0.002653 -0.007242 -0.008947 -0.002424 
+0.001828 -0.002634 0.000210 0.007020 0.003324 0.001745 
+0.011814 -0.001488 -0.002961 0.009574 0.002301 -0.001952 
+0.006712 0.004558 0.000316 0.013542 0.005570 0.000100 
+0.017447 0.003718 -0.003647 0.010407 -0.005620 0.004653 
+-0.001883 -0.013905 0.015056 -0.008610 -0.019987 0.013076 
+-0.004986 -0.015275 0.005507 -0.000833 -0.002576 0.000152 
+0.004127 0.005377 -0.001477 0.003342 0.002942 0.000229 
+-0.003124 -0.005961 -0.002323 -0.003885 -0.012182 -0.004043 
+0.000682 -0.010351 -0.001566 0.000821 -0.005897 0.000043 
+-0.003185 -0.003717 -0.001261 -0.002629 0.003387 0.001174 
+0.003996 0.011169 0.005938 0.006328 0.015244 0.005220 
+-0.005426 0.003916 0.002473 -0.008159 -0.008349 -0.005515 
+-0.001897 -0.010202 -0.003918 0.005094 -0.004718 -0.001964 
+0.002207 -0.000826 -0.002454 -0.005123 0.002142 0.001955 
+-0.006424 -0.000334 -0.003750 -0.008896 -0.011109 0.001288 
+0.004403 0.001410 -0.008702 0.011440 0.009739 -0.013016 
+0.000719 -0.002106 0.000055 0.000751 -0.001172 0.000062 
+0.004845 0.007234 0.000485 -0.001684 0.006738 -0.004318 
+0.003442 0.006686 -0.005307 0.011464 -0.002391 -0.010872 
+0.013628 -0.007725 -0.012369 0.014057 -0.002914 -0.006629 
+0.005359 0.010086 0.004885 0.001304 0.010505 -0.001751 
+-0.005833 0.006686 -0.003821 -0.012685 0.011356 -0.004641 
+-0.014937 0.000979 0.001931 -0.012340 -0.014701 -0.016373 
+0.000459 -0.013852 -0.023117 0.003079 -0.000229 -0.000579 
+-0.000629 -0.017360 0.007979 0.002572 0.006773 -0.010345 
+0.014459 0.010611 -0.002354 0.007979 -0.009036 0.003286 
+0.000457 -0.021190 0.026852 0.010984 -0.008918 0.007793 
+0.006838 -0.005229 -0.006398 0.008914 -0.002826 -0.007864 
+0.003797 0.002374 -0.000845 -0.009079 0.002476 -0.001367 
+0.012199 0.012794 0.002503 0.007710 0.010794 0.002203 
+-0.001565 0.003173 0.000209 -0.005720 -0.006365 -0.000834 
+-0.005767 -0.011470 0.002531 -0.003891 -0.004806 0.001844 
+-0.003007 0.007549 -0.018399 -0.027665 -0.005780 0.013817 
+-0.023686 -0.010243 0.054652 0.001711 0.004152 0.006733 
+0.016667 0.012157 -0.000196 0.014422 0.018078 0.004792 
+0.008464 0.012707 0.003994 -0.005357 0.008929 0.003571 
+-0.002485 0.009140 -0.001300 0.001763 0.007610 0.000413 
+0.004589 0.004040 -0.000104 0.005332 0.000338 0.000346 
+0.004158 0.001079 0.000557 -0.000250 -0.000816 0.001230 
+-0.003864 -0.002855 0.001073 -0.003774 -0.001992 0.000362 
+0.002000 -0.001408 -0.000391 0.008999 -0.001811 -0.002784 
+0.011147 -0.007923 -0.000814 0.002567 -0.018652 0.010273 
+-0.009486 -0.022893 0.018552 -0.010258 -0.017124 0.017704 
+-0.004115 -0.009098 0.009130 0.000503 -0.003328 0.002002 
+-0.000254 0.000778 0.000412 0.004000 0.000494 0.000338 
+0.005872 0.001443 0.000985 0.002826 0.002171 0.000835 
+0.000854 -0.000152 -0.000201 0.001508 -0.001984 -0.000873 
+0.003066 -0.002875 0.000819 -0.000945 0.003008 -0.002183 
+-0.004222 0.009739 -0.006817 -0.005441 0.009425 0.001354 
+-0.002471 0.003749 0.001253 0.003590 -0.003424 0.000303 
+0.006078 -0.005676 0.001081 0.011062 -0.004576 -0.003885 
+0.007264 -0.003666 -0.000327 -0.001869 -0.002271 -0.001681 
+-0.015490 -0.012601 0.002965 -0.004637 0.002368 0.005330 
+-0.001510 -0.001794 -0.011649 -0.005585 -0.010585 -0.004620 
+-0.004929 -0.005383 -0.003450 -0.004532 -0.008190 -0.000652 
+0.010856 -0.002403 -0.002034 0.024878 -0.006241 -0.006307 
+0.007525 0.012772 -0.010545 0.000704 0.000323 0.000843 
+0.004846 -0.001117 -0.005762 0.009534 0.003896 -0.014218 
+0.016752 0.019265 -0.010540 0.011171 0.036500 -0.002482 
+-0.001053 0.038563 -0.008570 -0.028668 0.025595 -0.025141 
+-0.010416 0.012546 -0.037177 -0.017282 0.005436 -0.014959 
+-0.014861 -0.005034 -0.000856 -0.005057 -0.008745 0.005265 
+0.001620 -0.000046 -0.003148 0.017411 0.022566 -0.016487 
+0.013589 0.002638 0.000670 0.011186 -0.023174 0.007337 
+0.016869 -0.005986 0.004421 0.005778 -0.004849 -0.004608 
+-0.006313 -0.005092 -0.007117 -0.010717 -0.008622 -0.002167 
+-0.006794 -0.005556 -0.001851 0.002414 0.001617 0.004230 
+0.011755 0.013566 0.005427 0.006979 0.017316 0.003707 
+-0.001766 0.011165 0.001135 -0.006325 0.000646 -0.001699 
+-0.005451 -0.009141 0.001025 -0.000730 -0.010263 0.004771 
+0.003539 0.005988 -0.002172 0.013476 0.034581 -0.014239 
+0.000508 0.043607 0.024497 -0.018663 -0.019070 0.011925 
+-0.003046 -0.000832 0.005537 0.002950 -0.004045 0.011485 
+-0.003142 -0.000365 0.002888 0.005264 0.006880 0.000653 
+-0.003095 -0.000078 -0.001037 -0.004547 -0.004083 -0.000699 
+-0.005610 -0.001246 -0.000052 -0.010370 0.000985 -0.000174 
+-0.012162 0.000769 -0.002462 -0.004229 0.000588 -0.004448 
+0.002440 0.001840 -0.000880 0.004464 -0.000377 0.001563 
+0.001047 -0.003739 0.001245 0.001764 -0.006699 0.001007 
+0.006270 -0.006307 -0.000795 0.002801 -0.000129 -0.000347 
+-0.007586 0.006913 0.000277 -0.014401 0.004138 -0.003840 
+-0.012562 -0.007934 -0.007934 -0.009129 -0.007960 -0.004070 
+0.002170 0.000132 0.001087 0.013235 0.006625 -0.001326 
+0.011062 0.007878 -0.001667 -0.000546 -0.003140 -0.000379 
+-0.011254 -0.015129 -0.001020 -0.010542 -0.016783 0.005641 
+0.003237 -0.003884 0.012821 0.005153 -0.003651 0.011116 
+0.006482 -0.000792 0.002181 0.004519 0.004241 0.000685 
+0.006481 0.005287 0.001705 0.009430 0.002916 -0.005197 
+0.008257 -0.001446 -0.002885 -0.008834 -0.000653 0.001574 
+-0.015012 -0.007376 -0.003017 -0.012590 -0.001730 -0.001005 
+-0.003274 0.003645 -0.001888 -0.006789 -0.001578 -0.020293 
+-0.027879 -0.027576 -0.000606 -0.002772 -0.012696 -0.007739 
+0.000085 -0.007273 -0.003218 0.006027 -0.004377 -0.003594 
+0.015024 -0.008280 -0.013030 0.028870 -0.018028 -0.016673 
+0.010246 0.004056 -0.027494 0.008516 0.022286 -0.004414 
+0.007230 0.014968 -0.017294 -0.006095 0.010524 0.001667 
+-0.016749 -0.010782 0.022140 -0.026795 -0.035831 0.012829 
+-0.008929 -0.027218 0.005122 0.008209 -0.000722 0.008610 
+0.002318 0.002781 -0.007264 0.000508 0.004203 -0.002737 
+-0.002103 -0.001802 -0.007960 0.000999 0.010954 -0.001963 
+-0.003351 0.032267 0.002108 0.007180 0.016307 -0.002312 
+0.008625 -0.032265 0.007655 0.009473 -0.030728 0.006627 
+0.007136 -0.001730 0.004168 0.005157 0.007579 0.004260 
+-0.000984 0.005810 0.001492 -0.016531 -0.004141 0.003874 
+-0.017095 -0.004348 -0.006616 -0.007198 0.001262 -0.003136 
+0.001806 -0.001224 -0.000745 -0.008794 0.004095 0.008228 
+-0.009038 0.005304 0.007437 -0.001761 0.000161 -0.000049 
+0.000720 -0.005759 0.001701 0.000336 -0.011189 0.001557 
+-0.002803 -0.010929 -0.000608 -0.006494 -0.000696 -0.006752 
+-0.003622 0.012236 -0.018203 -0.004639 -0.023933 0.009514 
+-0.009699 -0.002105 0.000561 0.000385 -0.003280 0.023615 
+0.003018 -0.001545 0.001132 0.005486 0.010883 0.003712 
+0.010121 0.009091 0.003566 0.013555 0.006000 -0.002057 
+0.004781 -0.000783 -0.000695 -0.009691 -0.002885 0.003958 
+-0.003828 0.007881 -0.003568 0.000363 0.002681 -0.000769 
+0.001799 -0.006326 0.003372 0.008018 -0.004593 0.006398 
+0.007581 -0.008706 0.006561 0.005158 -0.005596 0.001053 
+0.010903 0.003643 -0.001106 0.010959 0.003309 0.000048 
+0.008225 0.002837 0.000677 0.004659 0.002610 0.001910 
+-0.003560 -0.010353 -0.001846 -0.011719 -0.023135 0.004597 
+-0.008532 -0.021453 0.008848 0.000969 -0.009974 0.005552 
+0.003349 0.005594 0.002106 -0.001234 0.007005 -0.000057 
+0.008571 0.000223 -0.005246 0.002004 -0.001703 -0.003828 
+-0.000391 -0.000048 0.000528 0.007872 -0.002497 -0.002188 
+0.015205 0.012398 0.008313 0.004934 0.011139 0.008643 
+0.011399 0.007382 0.004533 -0.001376 0.007531 0.002432 
+-0.002676 0.004682 -0.005652 0.013044 0.031693 -0.008703 
+-0.007261 0.008659 -0.005605 -0.012178 -0.005258 -0.000477 
+0.002575 -0.005079 -0.002380 0.015168 -0.020358 0.023552 
+0.007712 -0.033304 0.008252 -0.000041 -0.004489 -0.000708 
+0.006479 0.002463 0.001117 0.012717 0.004832 -0.011329 
+-0.000845 0.003083 -0.010194 -0.003200 0.000728 0.000104 
+-0.008442 0.004532 -0.012263 0.005676 0.017262 -0.010549 
+-0.005353 0.015534 -0.019289 -0.017326 0.016243 -0.001739 
+-0.030686 0.004510 0.021667 -0.055154 -0.057156 0.025520 
+-0.058364 -0.081545 0.014455 -0.016198 -0.065877 0.011753 
+-0.003128 -0.008587 0.002548 -0.000470 0.008912 -0.022987 
+0.008408 0.007628 -0.026006 0.003920 0.009241 -0.016311 
+-0.000290 -0.000290 0.002899 -0.001678 -0.000402 -0.000388 
+0.011046 -0.012099 -0.004040 0.006368 -0.002057 0.001663 
+-0.004545 -0.008828 0.000702 -0.005486 -0.016048 0.009716 
+-0.002014 -0.006612 0.004120 -0.005053 0.010000 -0.000297 
+-0.006264 0.010592 0.000249 -0.002238 0.008313 -0.003175 
+0.003977 -0.011259 0.002300 -0.002645 -0.011726 -0.003360 
+-0.012187 -0.006042 0.005180 -0.003539 0.000582 0.001380 
+0.001891 0.005016 0.001778 -0.000343 0.005150 0.000820 
+0.004882 -0.000473 0.002232 0.004768 -0.007133 0.001912 
+0.006773 0.001543 -0.000160 0.007853 0.022922 -0.004192 
+-0.003685 -0.003944 -0.003879 -0.121465 -0.079834 0.126730 
+-0.011965 0.011212 -0.008442 -0.009597 0.009107 -0.004780 
+-0.007954 -0.000307 0.001906 0.001604 -0.006998 0.004009 
+0.013689 -0.010528 0.001050 0.024217 0.004060 -0.000256 
+0.015450 0.023256 0.003553 0.011370 0.010071 0.001509 
+-0.012449 -0.005612 0.003818 -0.025463 -0.021052 0.021819 
+-0.011284 -0.017298 0.018501 0.010632 0.012943 -0.004435 
+0.016329 0.022078 -0.003124 0.013056 0.004115 -0.001195 
+0.006857 -0.015824 0.003165 0.007778 -0.006160 -0.001120 
+0.005332 0.002492 0.000818 -0.000217 -0.000330 -0.000196 
+-0.006729 -0.001321 -0.003041 -0.011584 -0.000587 -0.004310 
+-0.008100 0.003310 -0.001910 -0.000179 0.013297 -0.003692 
+0.002549 0.014906 -0.002129 -0.000283 0.008997 0.002672 
+-0.003313 0.001872 0.003799 -0.000465 -0.001661 -0.001339 
+0.004774 -0.006099 -0.004665 0.002050 -0.003626 0.001895 
+-0.005071 -0.002908 0.008262 -0.016481 -0.007769 0.015741 
+-0.033826 -0.002759 0.005100 -0.014911 0.002312 -0.001784 
+-0.000764 -0.002281 -0.001384 0.006858 0.003001 -0.001692 
+0.019766 0.014354 -0.027422 0.020358 -0.000807 -0.004439 
+-0.003849 -0.016623 -0.007956 -0.003245 -0.000254 -0.001937 
+-0.007482 0.002118 -0.000230 -0.001742 0.001546 0.001267 
+-0.000527 -0.004724 -0.005061 -0.024074 -0.008524 0.003196 
+-0.019160 0.006579 -0.004950 0.000656 0.023039 -0.008399 
+0.002938 0.021521 -0.012883 -0.011518 -0.006997 0.018467 
+-0.058374 -0.055333 0.021890 -0.054415 -0.039415 -0.012511 
+-0.039508 -0.017035 -0.012196 -0.019463 -0.006993 -0.010066 
+-0.003752 0.005771 0.000913 0.005672 0.015728 0.000402 
+0.010096 0.020835 -0.006318 0.006451 0.011045 0.001944 
+0.009077 0.000341 -0.002770 0.017338 0.000798 -0.005884 
+0.022798 0.005028 -0.005190 0.011140 0.006163 -0.000879 
+-0.008511 -0.004566 -0.000538 -0.008812 -0.009797 -0.000888 
+-0.000798 0.005085 -0.002220 -0.000835 0.019807 -0.002448 
+0.006254 0.020573 -0.002683 0.011554 0.008477 -0.007704 
+0.000723 -0.005701 -0.001890 -0.001307 -0.008184 -0.000458 
+-0.005496 -0.005799 0.000850 -0.001420 0.001621 0.000842 
+0.005723 0.003669 0.003352 0.008949 0.009483 0.003729 
+0.010066 0.013013 -0.001944 0.004000 0.013463 -0.004297 
+-0.002809 0.015320 -0.002721 -0.005493 0.027595 -0.006848 
+-0.000653 0.019455 -0.011723 0.015019 0.002989 0.028506 
+-0.006057 0.020514 -0.006971 -0.004670 0.019986 -0.016447 
+-0.006583 0.001723 0.001098 -0.013859 -0.025216 0.023749 
+-0.014186 -0.012918 0.011115 0.018340 0.003217 0.017254 
+0.006657 0.022248 -0.003130 0.014520 0.011562 -0.009284 
+0.000197 -0.004586 0.002414 -0.022567 -0.009464 0.009828 
+-0.010625 0.012156 0.003647 -0.000401 0.002927 -0.001420 
+-0.005489 -0.003983 0.001943 -0.000459 -0.001784 0.001196 
+0.003399 0.002832 -0.000334 0.002623 -0.005772 0.002623 
+0.007506 -0.001677 0.003029 0.010693 0.004604 0.007588 
+0.013886 0.006862 0.009929 0.010925 0.016329 0.006473 
+-0.001222 0.010884 -0.000983 -0.010324 -0.001538 0.000169 
+-0.012715 -0.006016 0.001174 -0.010440 -0.003251 0.001830 
+-0.005427 0.002954 0.003497 0.005238 0.000093 0.000244 
+0.014291 -0.003516 -0.005438 0.017959 0.000087 -0.000655 
+0.003432 0.001788 -0.001023 -0.011892 0.003371 -0.000182 
+-0.015165 0.006995 -0.001420 -0.011379 0.002647 0.000195 
+-0.002903 -0.008942 0.007909 0.015955 -0.010095 -0.009698 
+0.026824 0.034063 -0.018436 -0.006918 0.011931 0.005410 
+0.003948 0.000601 0.003673 0.000099 0.004681 0.004214 
+-0.009435 -0.005051 0.019134 -0.001547 0.007576 0.010226 
+-0.022696 0.006485 0.009321 -0.024489 -0.008033 0.000888 
+-0.010448 -0.003993 -0.000494 0.002992 0.001262 -0.000463 
+0.008477 0.002970 -0.002663 -0.018515 -0.023540 0.006084 
+-0.035882 -0.050588 0.000000 0.005292 -0.014044 0.000635 
+-0.006415 0.014209 0.004621 0.004889 -0.001190 0.000197 
+0.016545 0.002947 -0.000571 0.008759 -0.002414 -0.002690 
+0.003192 -0.024877 0.007692 -0.004728 -0.018757 0.012385 
+-0.002644 0.005069 -0.002243 0.003830 0.024324 -0.003007 
+0.007879 0.021371 -0.003613 0.008331 0.010512 -0.001430 
+0.009028 0.010440 0.002280 0.001319 0.011944 0.001781 
+-0.004304 0.003125 -0.001350 -0.001058 -0.006287 0.001982 
+-0.000172 -0.007485 0.003780 -0.001816 -0.011152 0.000412 
+-0.008829 0.003132 0.001676 -0.008820 0.000343 0.002654 
+-0.003297 -0.001752 0.000439 0.004194 -0.001729 -0.000303 
+0.012246 0.000348 -0.000251 0.013810 0.001195 -0.000299 
+0.008867 0.004738 0.000199 -0.000556 0.008840 0.000245 
+-0.008204 0.009624 -0.001510 -0.012779 0.016151 -0.007698 
+-0.013104 0.003658 -0.009744 0.008284 0.011766 -0.011182 
+0.010737 -0.012105 -0.014158 0.027222 0.006516 -0.034751 
+-0.001742 -0.003274 0.014138 -0.004849 0.010049 0.019863 
+0.014263 -0.000865 0.006955 0.008337 0.019118 0.003354 
+0.006934 0.000178 0.007184 0.007333 0.008231 0.012804 
+-0.002377 0.001277 0.004605 0.018451 -0.008967 0.012531 
+0.016282 0.000934 0.001718 0.007782 0.001818 -0.004214 
+0.000814 -0.004670 -0.002641 -0.003077 -0.001625 -0.000301 
+-0.005861 0.023228 -0.003943 -0.007895 -0.002369 -0.003736 
+0.002643 -0.003909 0.004133 0.001111 0.002233 0.003613 
+0.013115 0.004166 -0.003750 0.005132 0.013750 0.000678 
+0.012667 0.015392 -0.009193 0.015360 0.008450 -0.000418 
+0.002498 -0.000810 0.000455 0.001650 -0.002381 0.000479 
+-0.000130 0.001579 0.002331 0.002714 0.000458 0.002596 
+0.005974 0.001357 0.002226 0.008018 0.002401 0.000087 
+0.010062 0.003236 -0.001831 0.012479 0.008238 -0.001129 
+0.012757 0.006832 -0.011433 0.005526 -0.000706 -0.018792 
+-0.012692 0.016817 -0.026065 0.006049 -0.001864 0.001228 
+-0.009449 0.008100 0.004130 -0.006270 0.007114 0.005045 
+0.004993 0.001550 0.005111 0.001331 -0.002554 -0.000879 
+-0.001101 -0.002306 0.001166 0.002180 0.003766 -0.007863 
+-0.023542 0.011531 0.026841 0.003977 0.017273 -0.004432 
+0.006895 0.019540 -0.000320 0.007230 0.013115 -0.000574 
+0.019131 0.020284 -0.004974 0.031017 0.025722 -0.007590 
+0.000977 0.008620 0.001457 -0.011747 0.002017 -0.007797 
+-0.007762 0.007369 -0.009061 -0.006568 0.011858 -0.005088 
+0.008673 0.010000 -0.000620 -0.000741 -0.010595 0.001754 
+-0.011511 -0.040459 0.016968 -0.009943 -0.047237 0.010110 
+-0.003917 -0.021379 -0.001119 -0.009596 -0.002662 0.000408 
+-0.008572 0.009822 0.004045 0.009600 0.018104 0.004260 
+0.018737 0.010776 0.014017 0.016557 0.000189 0.006428 
+-0.008640 -0.026258 0.005429 -0.019043 -0.039255 0.018397 
+-0.005275 -0.022562 0.009604 -0.000690 -0.006225 -0.002955 
+-0.007396 0.003714 -0.000993 -0.008636 0.001376 -0.000229 
+-0.002165 -0.003884 -0.000672 0.004741 -0.009167 0.000108 
+0.005429 -0.009979 0.001382 0.006620 -0.003521 0.001268 
+0.007442 0.005739 0.003895 0.006744 0.008173 0.005404 
+0.004666 0.000666 0.000254 -0.008662 -0.006494 0.001535 
+-0.013135 0.001274 -0.003434 -0.015349 0.021717 -0.009995 
+-0.016000 0.046000 -0.032000 0.008231 0.009109 -0.002646 
+-0.050315 -0.055944 0.072832 -0.026016 -0.015714 0.020813 
+-0.002021 -0.009514 -0.000556 -0.010239 -0.036585 0.012174 
+-0.018357 -0.011935 0.013116 -0.013860 -0.018565 0.022488 
+-0.009104 -0.012160 0.010372 0.008580 0.008879 0.011823 
+0.032257 0.004058 0.003018 0.043100 0.016719 0.014614 
+0.038587 0.002383 0.004791 0.025121 0.006904 -0.000287 
+0.010887 0.008849 0.001589 0.018384 0.002761 0.004623 
+0.014268 0.012271 0.008934 0.003128 0.012285 0.003288 
+0.003833 0.002333 -0.008667 0.003997 0.007796 -0.008116 
+0.009894 0.000461 -0.019532 0.006385 -0.004720 -0.015034 
+0.005320 -0.001997 -0.010822 0.006422 -0.001963 -0.002107 
+0.006078 -0.003427 0.001132 0.000660 0.000197 0.000332 
+-0.003121 0.004852 0.000396 0.001197 0.002826 0.001810 
+0.005938 0.007081 -0.008974 0.000173 0.002050 -0.001514 
+-0.001277 -0.016895 0.010589 0.016640 -0.008140 -0.009293 
+-0.018512 0.005877 -0.001134 -0.003712 0.002859 0.000621 
+0.000523 -0.001398 -0.003771 -0.002353 -0.002638 -0.002149 
+-0.001526 -0.004314 0.003653 0.000413 -0.001490 0.001653 
+0.000930 -0.001520 0.000088 0.003687 -0.002869 -0.006281 
+-0.007156 -0.015036 0.015127 0.020906 -0.000546 0.005076 
+0.009496 -0.003060 0.002897 0.021530 0.013700 -0.000244 
+0.039181 0.023758 -0.000726 0.058322 0.028050 -0.005169 
+-0.003881 0.036446 -0.020789 -0.007812 -0.002571 -0.016266 
+-0.002782 -0.006696 -0.004000 0.003045 -0.002636 -0.000530 
+0.001194 -0.007897 0.005027 -0.002551 -0.019567 0.013432 
+0.002833 -0.018898 0.002381 0.013195 0.000244 0.003590 
+0.012726 0.015965 0.004551 0.013939 0.025476 -0.001820 
+0.014149 0.009468 -0.000327 0.012746 -0.003394 -0.003496 
+0.012210 -0.011386 -0.003457 0.007275 -0.017420 0.003801 
+-0.006856 -0.027364 0.007524 -0.017523 -0.032258 -0.005533 
+-0.005159 -0.027344 -0.005262 -0.005826 -0.027185 -0.001804 
+-0.005170 0.001665 -0.001547 -0.001340 0.002713 -0.000714 
+0.002857 -0.002117 0.000260 -0.001273 -0.009768 0.002823 
+-0.004687 -0.012009 0.003746 -0.002249 -0.007467 -0.000519 
+-0.000537 -0.000255 -0.000317 0.002552 0.004369 0.001110 
+-0.002503 -0.001204 -0.000562 -0.015631 -0.006832 -0.003558 
+-0.008632 -0.001556 -0.004303 0.006877 0.005664 0.011395 
+-0.000709 0.010747 0.005797 -0.000537 0.011976 0.001487 
+-0.081863 -0.049118 0.056667 -0.043046 -0.025337 0.015575 
+-0.041308 0.005551 0.035865 0.005379 -0.000232 0.036374 
+-0.008739 0.005128 0.005682 0.000299 0.002122 0.000816 
+-0.003772 -0.000035 -0.018930 0.002448 0.000653 0.004000 
+0.004428 0.017492 -0.004299 0.010782 0.036711 -0.005007 
+0.010989 0.020993 -0.014996 -0.015049 -0.015713 0.015414 
+-0.045372 -0.054849 0.027606 -0.017408 -0.025407 -0.002582 
+0.000901 0.027511 0.001109 -0.001701 0.024540 -0.003196 
+-0.001532 0.020194 -0.003728 0.010580 -0.001683 -0.002103 
+0.012727 0.012727 -0.019394 0.002500 0.009351 -0.014026 
+-0.000362 0.001325 -0.002771 0.001467 -0.006910 0.002151 
+0.002359 -0.008818 0.000646 0.003936 -0.000257 0.000157 
+0.005167 0.010338 -0.003809 0.007138 0.010866 -0.006067 
+0.004930 0.002535 -0.007465 0.001240 0.003857 -0.008967 
+0.011343 -0.000119 -0.006869 0.011108 -0.002620 0.005568 
+0.010319 0.000985 0.008649 0.004979 -0.000864 0.000134 
+0.005254 -0.003521 -0.003803 0.008451 0.001103 -0.009414 
+0.010190 -0.002230 -0.007471 0.007342 -0.008581 0.006975 
+0.004956 -0.009327 0.007159 0.016509 -0.017025 -0.024243 
+0.023423 -0.008960 -0.010372 -0.001283 0.004929 0.003186 
+-0.005260 -0.001136 0.000302 0.010742 -0.025011 0.005841 
+0.028606 0.000145 0.005291 0.036320 -0.005202 -0.036313 
+0.075477 0.017934 -0.019482 0.015357 0.025153 -0.003424 
+0.009862 0.009541 0.000750 0.004382 -0.003008 0.001450 
+-0.006860 -0.011399 0.006851 -0.019276 -0.019231 0.004819 
+-0.012894 -0.008519 -0.003582 0.005961 0.019407 -0.005895 
+0.023720 0.023029 -0.013640 0.024806 0.016130 -0.007268 
+0.021973 0.004277 0.004213 0.024047 -0.006953 -0.000139 
+0.017743 0.000439 -0.003671 0.013564 0.013943 0.001910 
+0.009867 0.014274 0.009420 0.008365 0.001656 0.004768 
+0.007898 -0.001305 0.000838 -0.008769 -0.010359 -0.001638 
+0.003787 0.005192 -0.001659 0.006992 0.003739 -0.002178 
+0.004366 -0.001249 0.000920 -0.001537 -0.002145 0.001318 
+-0.004521 0.000575 -0.000024 -0.002112 -0.001024 -0.001013 
+0.000028 -0.008046 0.000589 -0.004276 -0.012332 0.000583 
+-0.013266 -0.000801 -0.001851 -0.020687 0.012116 -0.008529 
+-0.005611 0.004548 -0.005190 0.044373 0.012469 -0.008701 
+0.014669 0.008274 0.004627 0.002549 0.006870 -0.054065 
+-1.005535 0.238279 -1.309529 -0.086795 0.054535 -0.241953 
+-0.030296 0.018374 -0.029680 -0.006919 0.007924 -0.005500 
+-0.010778 0.001316 0.007094 -0.005155 0.004235 0.009933 
+-0.018036 0.003690 -0.022679 -0.010478 -0.000144 0.010431 
+0.010385 0.006281 -0.022571 0.003202 0.011940 -0.032074 
+0.004090 0.020263 -0.030873 -0.015148 -0.001560 0.000178 
+-0.037362 -0.029482 -0.000058 -0.027426 -0.028333 -0.007493 
+-0.008525 -0.001785 -0.004283 -0.005602 -0.002184 -0.002427 
+0.002844 0.008093 -0.006562 0.012419 0.014517 -0.017283 
+0.011694 0.010233 -0.018401 0.005408 0.001187 -0.004634 
+-0.006258 -0.008786 0.009123 -0.008724 -0.013689 0.009896 
+-0.006805 -0.007881 0.004627 -0.002191 -0.000678 0.000694 
+-0.000039 0.007599 -0.002864 0.001736 0.011522 -0.005562 
+0.005012 0.007509 -0.003103 0.006765 0.001617 0.001985 
+0.005129 -0.006481 0.000288 0.004035 -0.003407 0.000104 
+0.002347 0.002761 0.001500 -0.001272 -0.000174 0.000226 
+-0.001365 -0.004567 0.002450 0.002766 -0.004948 -0.001485 
+0.008189 -0.000146 -0.006548 0.023630 0.009132 -0.012931 
+0.039055 0.022018 -0.030091 0.071381 0.005840 -0.003611 
+0.018171 -0.029325 -0.002518 -0.001508 -0.007096 -0.003861 
+0.002941 0.001702 -0.000200 0.003467 -0.013679 -0.005963 
+0.020707 -0.042469 0.023453 0.018850 -0.061026 0.015744 
+-0.016000 -0.000941 -0.000235 0.007049 0.041290 0.003714 
+0.026603 0.029539 -0.000102 0.004206 0.009149 -0.006754 
+-0.008415 0.000394 -0.001569 0.000734 0.011827 -0.013726 
+-0.006368 0.011200 -0.038205 -0.007817 0.011049 -0.031166 
+-0.018375 0.002871 -0.004628 -0.000621 0.004152 -0.002972 
+0.008722 0.015531 -0.004494 0.009607 0.019403 -0.003556 
+0.011511 0.021409 -0.001648 0.009347 0.021780 0.004245 
+-0.007611 0.011831 0.001302 0.007978 0.004627 0.007855 
+0.028296 0.012561 0.002538 0.013153 0.010514 -0.003408 
+0.001870 0.005290 -0.001148 0.001548 0.003253 -0.001318 
+0.003091 0.002087 -0.000556 0.000551 0.005375 -0.002322 
+-0.004324 0.006149 -0.004932 -0.007644 -0.001290 -0.001995 
+-0.007972 -0.012115 0.004394 -0.009128 -0.013294 0.004017 
+-0.017079 -0.002908 -0.001395 -0.010280 -0.002615 -0.003581 
+0.006470 -0.020738 -0.000284 -0.020581 -0.030245 -0.053587 
+-0.009109 0.007456 -0.000796 0.020061 -0.004606 0.001343 
+0.028752 -0.000083 0.003049 0.024158 0.007598 -0.007778 
+0.013251 0.017928 -0.021654 -0.004730 0.016596 -0.021690 
+-0.006013 -0.013000 -0.020293 0.008750 -0.023750 -0.008750 
+-0.162456 -0.102845 -0.010013 -0.040833 -0.022500 0.009167 
+-0.010677 -0.006195 -0.007762 -0.004467 -0.019166 -0.005023 
+0.004716 -0.001954 -0.015357 0.031591 0.047227 0.018727 
+0.044547 0.061818 -0.001310 0.009891 -0.014293 0.002539 
+-0.013072 -0.032113 0.007015 -0.000554 -0.014292 0.008370 
+0.010530 0.006498 -0.001725 0.012885 0.013181 -0.004792 
+0.003385 0.004434 -0.001027 -0.004185 -0.002734 0.000330 
+-0.003904 -0.000220 0.000651 -0.000923 0.008030 -0.003176 
+0.000040 0.011317 -0.006988 -0.006439 0.006998 -0.003342 
+-0.012362 0.004140 -0.000002 -0.008394 0.008675 0.000338 
+0.005873 0.012829 -0.002007 0.014214 0.009025 -0.000817 
+0.006848 0.004660 -0.000168 -0.001750 0.002593 -0.003498 
+-0.005663 0.003635 -0.005345 -0.004970 0.002263 -0.001894 
+-0.002492 -0.005108 0.007973 -0.004247 -0.008923 0.011146 
+0.000270 0.011402 0.005203 -0.018455 0.061904 -0.028684 
+0.052987 0.045282 -0.010495 0.019387 -0.006080 0.006753 
+0.001970 -0.010066 -0.001271 -0.009194 -0.022045 -0.003198 
+-0.014091 -0.010960 -0.000184 -0.004192 0.006872 0.007524 
+0.005288 0.013120 0.008529 -0.015260 -0.008309 -0.006083 
+-0.012771 -0.019314 -0.014143 0.010909 -0.023182 -0.010909 
+0.012957 -0.006867 -0.004434 0.015357 0.026132 -0.006381 
+0.018076 0.007714 0.019726 0.028349 0.006534 -0.020533 
+0.028891 0.008222 -0.019595 -0.002905 -0.000766 0.005261 
+0.019633 0.011905 0.004120 0.016660 0.149499 -0.041503 
+-0.017486 0.048393 -0.060357 -0.016287 0.022603 -0.032367 
+-0.001292 0.018655 -0.016309 -0.000998 0.010126 -0.009777 
+-0.001124 -0.002216 -0.000077 -0.005815 -0.007615 -0.000470 
+-0.013502 -0.004016 -0.000228 -0.006796 -0.004073 0.007489 
+-0.004859 0.003491 0.002053 -0.004549 -0.001110 0.002695 
+0.000998 0.000568 -0.000050 0.002172 0.004812 0.000983 
+-0.000819 0.004610 -0.004883 -0.008392 0.001272 -0.000390 
+-0.007228 -0.004482 0.003012 0.001797 -0.002895 0.002132 
+0.001812 0.003523 0.001021 0.008755 -0.001123 0.012959 
+0.001371 -0.058861 0.017779 -0.001287 -0.018073 -0.054715 
+0.011290 -0.014848 0.020651 3.793548 -1.870968 3.090322 
+3.468421 -1.752632 3.368421 2.920732 -1.390244 2.896342 
+0.016828 -0.007090 0.019746 -0.000182 -0.002717 0.001155 
+-0.004834 0.002325 -0.011320 0.003967 0.009119 0.005821 
+-0.025619 -0.070095 -0.016190 0.028667 0.086000 -0.011667 
+-0.003096 0.033750 -0.040243 0.003759 0.012603 -0.036372 
+0.051164 0.030172 -0.006121 0.046412 0.006290 -0.014265 
+0.021136 0.004755 -0.002686 0.011365 -0.023000 -0.004190 
+0.006578 -0.000188 0.002172 0.024232 0.018005 -0.001412 
+0.027039 0.023932 -0.012170 0.021480 0.014448 -0.004652 
+0.007276 0.008872 -0.002241 0.002684 0.007852 -0.002239 
+0.001336 0.005119 -0.001979 0.005144 0.001588 -0.002272 
+0.000973 0.009236 -0.005903 -0.010828 0.014219 -0.011306 
+-0.015537 0.010650 -0.009237 -0.012887 0.005198 -0.001077 
+0.002246 0.001300 -0.000933 0.023069 0.006165 -0.004440 
+0.011643 0.009842 -0.004828 -0.005675 0.000664 -0.002666 
+-0.012249 -0.002020 0.004462 -0.008358 0.001862 -0.000275 
+0.007574 0.009962 -0.012129 0.013211 0.007295 -0.007962 
+0.005539 0.013146 0.001310 0.036315 0.050571 0.027331 
+-0.046800 -0.050000 0.062400 0.004342 -0.039964 0.014858 
+0.007958 0.007173 0.000735 0.003121 0.005030 -0.000783 
+-0.002700 -0.006265 0.001875 -0.002238 -0.003841 0.000330 
+0.001875 0.002054 0.000520 -0.002511 0.000088 0.001412 
+0.000238 -0.017561 -0.009040 0.006947 -0.022158 -0.008350 
+0.014729 -0.008650 -0.005192 0.028888 0.010238 -0.024961 
+0.016205 -0.007367 -0.006313 -0.006937 -0.009306 0.010009 
+0.004127 -0.000765 -0.001599 0.004092 0.001364 0.000456 
+0.015556 0.008481 -0.005131 0.044252 0.021944 -0.001422 
+-0.065984 -0.042941 0.108573 -0.023201 0.014521 0.058922 
+-0.008748 0.030076 -0.005487 -0.008922 0.019331 -0.005172 
+0.002893 0.007390 0.007586 0.000388 -0.012960 0.001259 
+0.001972 -0.002943 0.001005 -0.000600 0.002488 -0.002323 
+0.001184 0.000602 -0.002300 0.000772 0.003745 -0.002771 
+-0.003723 0.004488 -0.002923 0.005704 0.009854 -0.006648 
+0.003421 0.002509 -0.007393 0.001387 0.002030 -0.001939 
+-0.001198 0.001552 -0.000322 0.000607 0.005207 0.005261 
+0.008483 0.001879 0.015101 0.025667 -0.011105 0.014969 
+0.005921 -0.005580 0.000211 0.012549 -0.007011 0.012667 
+0.019978 -0.025666 0.024508 3.971098 -2.959538 3.820809 
+4.053763 -3.026882 4.526882 3.987180 -2.519231 4.448718 
+0.033084 -0.016615 0.039831 0.021089 -0.003592 0.024223 
+0.004197 -0.000633 0.004910 0.008711 -0.043439 0.015420 
+-0.113869 0.004556 0.130576 -0.039669 -0.008537 0.127797 
+-0.008127 -0.028060 0.031107 0.051494 0.001423 -0.011947 
+0.044320 0.013541 -0.079526 0.028433 0.059373 -0.044843 
+0.004572 0.007870 0.003233 0.007511 0.006007 0.005955 
+0.020366 0.006381 -0.008269 0.005736 -0.013114 0.003553 
+0.100558 -0.052598 0.054285 0.036234 0.023943 0.012874 
+0.012033 0.011058 0.003496 0.012330 0.013128 -0.003072 
+0.009047 0.017345 -0.008764 0.006768 0.020124 -0.007250 
+-0.012357 0.018819 -0.005545 -0.015932 0.010944 -0.008168 
+-0.009974 0.000648 0.000337 0.001255 -0.006384 0.011650 
+0.013402 -0.004809 0.006540 0.012174 0.001376 -0.003143 
+0.003472 0.000417 -0.001635 -0.016103 -0.014022 0.019153 
+-0.005990 -0.025037 0.020514 0.011105 -0.016415 0.005115 
+0.019406 0.017793 -0.002544 0.011495 0.017840 -0.022020 
+0.000092 0.004016 -0.000433 -0.005424 -0.005852 0.001075 
+-0.028879 -0.028175 0.016577 -0.004782 -0.029948 0.021808 
+0.024393 -0.010100 0.007304 0.030231 -0.020966 -0.002507 
+0.023258 0.033862 -0.016062 0.004337 0.002650 0.000759 
+-0.006598 -0.028499 0.008657 -0.016520 -0.014420 0.000017 
+-0.001548 -0.000197 0.000319 0.008534 0.007546 -0.002494 
+0.013640 0.002841 -0.009914 0.024387 -0.002591 -0.019090 
+0.000532 -0.017980 -0.009617 -0.010666 -0.009081 0.009984 
+0.002928 -0.000129 -0.002853 0.005912 0.000508 -0.004634 
+0.003879 0.001394 0.001161 0.001675 -0.002888 0.013127 
+0.000202 -0.008563 0.021938 -0.018018 -0.007365 0.013078 
+-0.013896 0.007405 -0.012129 0.000824 0.016010 -0.020219 
+0.001018 0.008522 -0.013192 -0.002024 0.003742 -0.002381 
+0.001213 0.005903 -0.006677 0.002728 0.006924 -0.004485 
+0.004777 0.003356 -0.004335 0.005003 0.000883 0.000948 
+0.004157 0.006406 -0.000427 -0.000229 0.002557 -0.007155 
+-0.001276 0.001071 -0.000102 0.000571 -0.000720 -0.001285 
+0.002771 -0.003073 -0.000555 0.006977 -0.003342 0.004247 
+0.024820 0.001566 0.021368 -0.008223 0.019002 -0.002123 
+-0.002739 0.005199 0.000080 0.012149 -0.016157 0.016809 
+3.396342 -2.280488 2.890244 4.393333 -3.720000 4.566667 
+4.992308 -4.384615 6.130769 4.878261 -3.304348 6.139131 
+4.147059 -1.323529 4.509804 0.029037 0.002683 0.026613 
+0.004758 0.018178 0.007116 -0.032701 0.008784 -0.029284 
+-0.059095 -0.018115 0.082332 -0.053182 -0.066259 0.047328 
+-0.027887 -0.050219 -0.007332 -0.109167 0.049583 -0.059583 
+-0.021620 0.020270 -0.018749 -0.036040 0.050800 0.004720 
+0.007772 0.019318 0.000556 -0.017678 0.001403 -0.015648 
+-0.010336 -0.002971 0.011280 0.022766 0.017252 -0.032112 
+0.062099 -0.008293 0.026806 -0.008591 0.010508 0.000977 
+0.003212 -0.001021 0.003828 0.005371 -0.001150 0.003561 
+0.010541 0.007890 -0.006722 0.006409 0.013305 -0.002275 
+-0.003959 -0.000419 0.000576 -0.011332 -0.024488 0.020334 
+-0.007259 -0.041570 0.037128 -0.001278 -0.038643 0.034087 
+-0.014444 -0.002222 0.005111 0.041485 0.001962 -0.010238 
+0.002828 -0.000707 0.000707 -0.013780 -0.031733 0.026986 
+0.014464 0.015302 0.015618 0.032414 -0.002172 0.006517 
+0.010000 0.007026 0.012295 -0.004842 -0.007006 -0.001752 
+0.002054 0.004138 -0.010275 0.004186 0.000252 -0.006878 
+0.003425 0.008426 -0.012340 -0.006707 0.011035 -0.007226 
+-0.011154 -0.002261 0.001332 -0.014112 -0.009414 0.004422 
+-0.001632 0.007419 -0.007260 0.015057 0.003605 -0.013911 
+0.007023 0.009944 0.005403 -0.008108 -0.008108 0.003243 
+-0.012692 -0.011146 0.011055 0.007500 0.006667 -0.008750 
+0.031538 0.031538 -0.007308 0.018336 0.008116 -0.006763 
+-0.041736 -0.017807 0.018926 -0.026562 -0.007586 0.013965 
+0.005667 -0.002985 -0.007357 -0.005781 -0.006731 -0.001248 
+0.000403 -0.001446 0.006121 0.003909 -0.007378 0.004432 
+0.000473 -0.004123 0.002846 -0.001310 0.002739 0.003256 
+-0.007951 0.004190 -0.003707 -0.005846 -0.000798 -0.000030 
+-0.001882 0.000379 0.000187 -0.001727 0.008500 -0.005968 
+-0.001473 0.012054 -0.005315 0.001488 0.008099 -0.003071 
+0.000802 -0.001310 -0.001008 0.000800 -0.001443 -0.003368 
+0.000225 0.000415 -0.000557 0.001639 -0.002455 0.003206 
+0.001527 -0.001221 0.001827 0.001573 -0.003114 -0.002368 
+0.004650 -0.011675 -0.003434 0.003859 -0.025291 -0.006131 
+0.005833 0.036230 -0.036290 -0.018987 0.018696 -0.017292 
+0.003691 -0.002166 0.007263 -0.000507 0.001020 0.012404 
+3.815287 -2.490446 2.866242 4.553957 -3.647482 4.841727 
+4.517241 -4.198276 6.870690 3.690000 -3.380000 7.230000 
+0.044937 -0.002478 0.035623 0.026659 -0.001425 0.021953 
+0.003456 0.008655 0.002380 0.011572 0.053247 -0.011226 
+0.044800 0.051781 -0.024339 0.012718 0.016389 -0.003033 
+0.000105 0.006418 -0.002484 -0.084495 0.036737 -0.113273 
+-0.009910 -0.009131 -0.008477 -0.005921 -0.009493 0.001813 
+-0.031752 -0.017354 0.031495 -0.035751 0.014101 -0.027656 
+-0.088483 -0.066108 0.016920 -0.022497 0.011501 -0.013172 
+-0.015532 0.002081 -0.011572 -0.000421 0.004395 -0.001808 
+-0.012196 0.003688 0.006062 -0.011355 -0.017646 0.007087 
+-0.007688 -0.022999 0.009699 0.004231 -0.015889 0.014445 
+0.009456 -0.024680 0.036751 0.022143 -0.019048 0.005317 
+0.025767 -0.005239 -0.001990 -0.020453 -0.040259 0.020280 
+-0.072804 -0.032475 0.077280 0.083160 -0.072554 -0.007576 
+0.006722 -0.091778 0.038056 -0.037450 -0.071140 0.040270 
+-0.010874 0.000845 0.012414 0.008462 0.007152 0.008453 
+0.002000 -0.003280 -0.004373 -0.006170 -0.021779 0.002350 
+-0.001547 0.002049 -0.007962 -0.002123 0.010259 -0.014943 
+0.003343 0.018623 -0.011745 -0.011720 0.004163 0.004169 
+-0.016607 -0.007354 0.008361 -0.014247 -0.009999 0.007077 
+-0.014529 -0.011468 0.007126 -0.017602 -0.010331 0.002804 
+-0.009573 -0.001693 -0.009492 0.004254 0.002500 0.001401 
+-0.006998 0.002852 0.002729 0.003045 0.003603 0.008808 
+0.010058 -0.004641 0.007471 0.003459 0.003462 0.008310 
+-0.025763 -0.017772 0.025004 -0.016134 -0.003576 0.001075 
+0.032574 0.007771 -0.017381 0.001126 -0.002909 -0.005137 
+0.001371 0.000060 0.001429 -0.000623 0.000733 0.000279 
+0.001557 0.000231 -0.007182 0.026510 0.005381 -0.008189 
+0.002160 0.001485 -0.001519 -0.003562 -0.005827 0.002766 
+0.001599 -0.005460 0.001752 0.004940 -0.000177 -0.003084 
+0.001926 0.001439 -0.002581 0.000278 0.001249 -0.000417 
+-0.001225 0.000294 -0.003625 0.002934 0.001125 -0.002203 
+0.007564 0.002158 -0.002395 0.007044 -0.003703 -0.004708 
+0.004013 -0.004356 -0.001001 0.002228 -0.008527 -0.002257 
+0.001530 -0.013759 -0.001390 -0.006578 0.005402 -0.002850 
+-0.022640 0.007146 -0.024538 -0.006089 -0.002162 -0.008106 
+-0.000179 -0.008626 0.005901 0.011082 0.001580 0.011379 
+0.027481 -0.002835 0.019667 0.034970 -0.008007 0.041930 
+0.031654 -0.012499 0.063529 0.025164 -0.003806 0.053934 
+0.021610 0.006645 0.025633 0.011045 -0.002493 0.006833 
+-0.003333 -0.018959 -0.001807 -0.016091 -0.021053 -0.000614 
+-0.001425 0.008637 -0.016156 0.008139 0.002509 -0.022888 
+0.011796 0.010734 -0.011917 0.012231 -0.000154 -0.055504 
+-0.008167 0.039367 -0.044321 -0.013946 -0.015201 0.016476 
+0.058390 -0.099107 -0.026438 -0.059733 0.015000 -0.008533 
+-0.026220 -0.002597 -0.009771 -0.033755 -0.031667 -0.007876 
+-0.018367 -0.013469 0.006880 -0.017679 -0.014793 0.008241 
+-0.011004 -0.002898 -0.001782 -0.002663 -0.009718 0.001411 
+-0.011266 -0.023325 0.011629 -0.013635 -0.022868 0.028711 
+-0.026910 -0.052674 0.029028 0.031619 -0.007365 0.001905 
+0.062551 0.009129 -0.007306 0.014799 -0.025663 -0.006116 
+0.021852 -0.033185 -0.005852 0.055556 0.001978 -0.013844 
+0.014797 -0.018645 0.008266 0.009644 -0.017000 -0.003616 
+0.042460 0.001977 -0.019747 0.009774 -0.002537 0.002530 
+0.060853 -0.000409 -0.017850 0.006231 -0.010989 -0.014095 
+-0.000599 0.002490 -0.006561 0.007793 0.008197 -0.003031 
+-0.010154 0.005209 0.005199 -0.028910 -0.011672 0.012806 
+-0.027091 -0.021814 0.019187 -0.020391 -0.021061 0.015693 
+-2.471154 -1.879808 0.528846 -2.748792 -1.879227 0.188406 
+-0.029988 -0.019336 -0.000768 -0.023140 -0.013251 -0.002034 
+-0.001126 -0.000380 0.002143 -0.001255 0.005082 0.006564 
+-0.018523 -0.001751 0.008838 -0.011184 -0.014804 0.013738 
+-0.000940 -0.002713 0.004899 -0.000216 0.006509 -0.005985 
+-0.008670 0.001789 0.004363 -0.001297 0.000853 0.001435 
+0.000325 0.002223 -0.000301 0.006005 0.002866 0.004527 
+0.002928 -0.005049 0.004701 -0.002714 -0.012124 0.010481 
+-0.002672 -0.007264 0.003899 -0.001147 -0.003750 -0.000159 
+0.000133 0.001314 0.000215 -0.005235 0.003711 0.001394 
+-0.005039 0.002131 0.001878 0.001282 0.001313 -0.001093 
+-0.005660 0.000929 -0.000316 -0.006507 -0.001047 -0.000047 
+-0.005352 -0.002111 -0.002760 -0.005806 -0.002029 -0.003295 
+-0.004369 -0.000503 -0.001896 0.003151 -0.002131 0.000857 
+0.011880 -0.000789 0.002860 0.010178 0.009591 -0.006255 
+-0.006193 0.009645 -0.002104 -0.000453 0.005299 -0.001228 
+0.000186 -0.002551 0.004003 0.006549 -0.000189 0.005585 
+0.016557 -0.003496 0.006679 0.023615 0.000394 0.018582 
+0.018222 0.009037 0.023636 0.012180 0.008765 0.004705 
+0.003452 0.006964 0.003359 -0.006870 0.001572 -0.003083 
+-0.018333 -0.019996 -0.008194 -0.037501 -0.023337 0.017447 
+-0.012517 0.008889 -0.002906 -0.001384 -0.006955 -0.010438 
+0.008130 0.000012 -0.018965 0.003966 -0.001937 -0.008382 
+0.002985 -0.004222 0.026059 -0.025215 -0.028708 0.034785 
+0.104879 -0.035923 -0.100819 -0.004923 -0.007309 -0.009517 
+-0.012107 -0.015480 -0.011102 0.003152 -0.014171 -0.004810 
+0.017418 -0.002647 0.000816 0.004107 0.000886 -0.000486 
+-0.016044 0.028622 -0.003281 -0.025508 0.003557 0.003720 
+-0.022727 -0.027856 0.031571 -0.021061 -0.074317 0.017124 
+-0.005253 -0.049166 -0.011477 -0.007203 -0.019001 -0.009347 
+-0.011915 -0.008522 0.001492 0.002007 -0.004828 -0.004384 
+0.090535 0.013719 0.002746 0.042794 -0.016513 -0.020777 
+0.037903 0.011911 0.012841 0.071512 -0.006294 0.062195 
+0.094877 -0.013399 0.037389 -0.026569 0.028020 0.012332 
+0.002792 0.027884 -0.023125 0.009897 0.007766 -0.022616 
+0.013843 0.004631 -0.010374 0.008599 0.006280 0.001981 
+-0.007899 0.007022 0.011435 -0.026156 -0.009222 0.015550 
+-0.031812 -0.024379 0.018315 -3.746269 -2.917910 0.955224 
+-3.546961 -2.701658 0.447514 -3.381166 -2.313901 0.076233 
+-3.275556 -2.084445 -0.217778 -2.994444 -1.900000 -0.516667 
+-0.021328 -0.011348 -0.005529 -0.003364 -0.001755 -0.004653 
+0.002376 0.002959 0.001590 -0.001054 -0.002012 0.005463 
+0.004152 0.000247 0.003408 0.002057 0.007419 0.003366 
+-0.007846 -0.004387 0.004981 -0.002865 -0.008886 0.001703 
+-0.001384 -0.005385 0.000156 0.000874 -0.007168 0.000437 
+0.001969 -0.004347 0.001757 0.001077 0.000489 -0.000437 
+0.001940 0.001837 0.000239 0.001865 0.006090 0.002883 
+-0.011083 0.003888 0.001698 -0.019884 -0.006180 0.007159 
+-0.017900 -0.009660 0.007886 -0.004400 -0.003434 0.004417 
+-0.007250 -0.000108 -0.000653 -0.008752 -0.003312 -0.000058 
+-0.006675 -0.001002 0.000761 -0.006852 0.002963 -0.000132 
+-0.004107 0.003686 -0.000844 -0.001629 0.004906 -0.000920 
+0.004105 0.011630 -0.002394 0.009642 0.014372 -0.010802 
+-0.003819 0.001181 -0.002639 0.003431 0.009673 -0.000489 
+0.001429 -0.000296 0.000710 -0.000986 0.005027 0.005866 
+0.001942 0.004934 0.002664 0.005047 0.000216 0.000115 
+0.000154 -0.002622 0.001009 -0.006968 -0.002052 0.003212 
+-0.013259 -0.002909 -0.003385 -0.013864 -0.003767 -0.008969 
+-0.015043 -0.009807 -0.002268 -0.014516 -0.009529 0.006352 
+-0.001080 0.003466 0.003429 0.002474 -0.001362 -0.004562 
+-0.000951 0.003328 -0.001200 0.003230 -0.000286 0.011495 
+0.105000 0.022000 -0.011000 0.039645 0.022308 -0.059467 
+0.011005 0.023541 -0.016890 0.010984 -0.001613 -0.031957 
+-0.001933 -0.021789 -0.021303 -0.002139 -0.006207 -0.003317 
+-0.007948 -0.000793 0.003732 -0.032773 0.016757 0.020613 
+-0.047588 -0.001882 0.024588 -0.004704 0.006277 0.036868 
+0.059259 0.056296 -0.039259 0.006481 0.041907 -0.012852 
+0.004588 0.026588 0.001118 0.010761 0.016290 0.003671 
+0.009359 0.005719 -0.001223 0.007276 0.008422 -0.001237 
+0.005182 0.006384 0.000179 0.002179 -0.004487 -0.003333 
+0.013960 -0.031211 -0.008447 0.112249 0.028708 -0.008708 
+-0.027222 0.016389 0.059444 -0.034116 0.004737 0.029064 
+0.007696 -0.012414 0.003627 0.009046 -0.005887 -0.004277 
+0.001225 -0.002922 -0.001818 0.001710 0.000970 0.000091 
+0.009244 0.008370 0.000333 -0.003942 -0.001240 0.006054 
+-0.017227 -0.018920 0.011558 -0.028026 -0.028181 0.013582 
+-3.787234 -3.085106 0.929078 -3.873494 -2.957831 0.403614 
+-3.671569 -2.651961 -0.176471 -3.455752 -2.433628 -0.539823 
+-3.188406 -2.120773 -0.589372 -0.022737 -0.016402 -0.006165 
+-0.004913 -0.003950 -0.002997 0.006957 0.010000 -0.000870 
+0.002065 -0.005504 -0.002608 0.004393 -0.005802 -0.005562 
+0.001657 -0.005851 -0.003914 -0.004038 -0.007465 0.000665 
+-0.010052 -0.008442 -0.000649 -0.009546 -0.012961 -0.001624 
+0.002146 -0.004969 -0.001931 0.006281 0.001805 -0.000026 
+0.003341 0.000571 0.003127 0.001766 -0.003888 0.000119 
+-0.003748 -0.010846 0.001882 -0.002535 -0.007796 0.003370 
+-0.004312 -0.006766 0.005238 -0.002970 -0.004210 0.006550 
+-0.004536 -0.008876 -0.003320 -0.001720 -0.008257 -0.001944 
+-0.002646 -0.004597 -0.000928 -0.006271 -0.003220 -0.000992 
+-0.011132 -0.005783 -0.001116 -0.007833 -0.004564 -0.001349 
+0.002151 -0.002532 -0.001111 0.023563 0.011153 -0.020228 
+0.015121 0.024985 -0.002446 0.015499 0.021675 -0.006194 
+0.006478 0.013192 -0.011117 -0.003994 0.000579 -0.009549 
+-0.003265 -0.001949 -0.000358 0.001906 0.001493 -0.002001 
+0.000336 -0.002679 -0.004698 -0.013058 -0.005570 0.001077 
+-0.006941 -0.004472 0.010278 -0.001275 -0.002324 0.002150 
+0.004484 0.000794 -0.012129 0.001902 0.004863 -0.009819 
+-0.000344 -0.000496 0.002454 0.002112 0.000891 0.014803 
+0.014964 0.017691 0.014513 0.027193 0.014386 0.012807 
+0.013560 0.004347 0.015876 -0.090260 0.041948 -0.017792 
+-0.042777 0.013484 -0.039522 -0.018310 -0.007060 -0.012748 
+-0.000024 -0.020745 0.003108 0.003666 -0.017479 0.011465 
+0.004915 0.006329 -0.007988 -0.016938 0.038486 0.001539 
+-0.016420 -0.006432 -0.033145 -0.013561 -0.028017 -0.025270 
+0.034761 0.071140 -0.028870 0.005762 0.049143 -0.065952 
+0.002260 0.005672 -0.004441 -0.000329 -0.001316 0.001469 
+-0.001594 0.001702 -0.002330 0.003141 0.004192 -0.001676 
+-0.000714 -0.012857 -0.003571 0.005472 -0.014456 -0.011592 
+0.024555 -0.033547 -0.028186 0.110034 -0.069966 0.008013 
+-0.003665 0.008777 -0.012357 -0.004340 0.009357 -0.013213 
+-0.000100 0.001880 -0.001348 0.007742 0.004921 -0.002605 
+0.006474 0.008361 -0.001369 0.009271 0.005438 -0.001483 
+0.009744 0.004315 -0.001905 -0.003449 -0.002496 0.003266 
+-0.009488 -0.007222 0.019153 -0.019463 -0.019381 0.012365 
+-0.034675 -0.025497 0.008485 -4.070423 -3.457747 0.929577 
+-4.189189 -3.601351 0.439189 -3.954545 -3.210227 -0.204545 
+-3.733010 -2.747573 -0.500000 -3.441176 -2.245098 -0.593137 
+-0.026933 -0.017922 -0.008581 -0.012266 -0.008671 -0.008324 
+0.002150 0.003451 -0.007787 -0.007302 -0.034317 0.000730 
+-0.012951 -0.007059 0.009510 0.007904 0.008160 0.000808 
+0.008541 -0.004102 -0.005236 -0.003736 -0.014420 -0.008125 
+-0.004776 -0.008799 -0.003406 0.001758 0.000824 0.001025 
+0.000601 0.000430 0.001166 0.008319 -0.000723 0.000393 
+0.015879 0.005615 -0.012548 0.005237 0.001546 -0.007122 
+0.002789 0.001761 -0.005149 -0.000410 0.000923 -0.001402 
+0.020000 -0.003310 -0.001936 0.018640 -0.002058 -0.004334 
+0.006122 -0.004772 -0.003418 -0.008155 -0.003118 -0.002315 
+-0.013575 0.004156 0.002646 -0.003843 0.008009 0.005563 
+-0.015255 0.013302 0.002886 0.030515 0.026125 -0.022027 
+0.023872 0.025197 0.002464 0.012379 0.006766 -0.004387 
+0.001527 0.001252 -0.001825 -0.005639 0.003977 -0.004418 
+-0.004808 0.005661 -0.009977 0.002830 0.009952 -0.015868 
+0.004611 0.014870 -0.016483 0.000411 0.007364 -0.010977 
+-0.000340 0.000233 -0.001002 0.000394 -0.001951 0.010225 
+-0.003345 -0.005252 0.004673 0.000028 -0.013873 0.009190 
+0.009467 -0.021278 0.008226 -0.033822 -0.026978 0.017556 
+-0.011564 -0.010174 0.010148 0.003806 0.002842 -0.000433 
+-0.002945 0.015056 -0.013652 0.015474 -0.066000 0.042555 
+0.065055 0.050549 0.037363 0.016681 0.021979 -0.010023 
+-0.010285 0.014994 -0.006829 -0.031722 0.006367 0.013466 
+0.012214 0.041393 -0.006169 -0.010055 0.014813 -0.014193 
+-0.028583 0.009191 -0.017766 -0.010526 0.010526 0.005263 
+-0.007673 -0.013315 0.000952 -0.047317 -0.010183 0.049512 
+0.047613 0.050323 0.034065 0.004099 0.022179 -0.054722 
+-0.007192 0.048128 -0.029458 -0.008372 0.022444 -0.001271 
+-0.003172 0.000482 -0.005272 0.010250 0.002656 -0.007219 
+0.009338 0.013775 -0.007528 0.012500 0.075833 -0.050000 
+0.066253 0.074192 -0.060047 0.000139 0.006371 -0.002052 
+-0.001077 0.000782 -0.001230 -0.003538 0.003806 -0.001101 
+0.006295 0.009192 -0.004161 0.010967 -0.000740 -0.005140 
+0.008416 -0.000398 -0.006126 0.000195 -0.001064 0.002805 
+-0.006433 -0.003472 0.023174 -0.016041 -0.010609 0.024011 
+-0.027576 -0.021874 0.010131 -3.719697 -2.848485 0.590909 
+-4.242647 -3.316176 0.669118 -4.311111 -3.296296 0.400000 
+-4.087500 -2.837500 -0.325000 -3.898477 -2.436548 -0.746193 
+-3.671569 -2.161765 -0.750000 -0.030236 -0.020852 -0.008086 
+-0.017805 -0.016255 -0.002346 -0.000989 -0.001346 0.002940 
+-0.037932 0.041191 0.023599 0.003162 0.003818 -0.003970 
+0.020953 -0.000345 -0.008603 0.017793 0.002243 -0.017207 
+0.006389 0.002847 -0.009931 0.000471 -0.001412 -0.005062 
+-0.002471 0.001277 -0.000269 0.002399 0.011303 -0.003667 
+-0.002930 0.005270 0.002515 0.001312 0.000869 0.007271 
+-0.000179 0.002040 0.004129 0.000162 0.000198 0.000434 
+0.001930 0.017644 0.008897 -0.035556 0.016914 0.009901 
+-0.043591 -0.008434 0.004437 -0.006533 0.000853 0.002058 
+0.025164 0.008713 0.004448 0.018354 0.003655 0.007212 
+-0.019265 0.014056 -0.007624 -0.022209 0.013414 -0.011180 
+0.036964 0.026357 0.014679 0.026008 0.000766 -0.002590 
+0.010728 0.004651 -0.005026 -0.004951 0.012787 -0.012599 
+-0.000212 0.013629 -0.019198 0.000253 0.002865 -0.011538 
+0.005066 0.009616 -0.016143 0.000746 0.012837 -0.005816 
+-0.006897 0.007296 -0.005071 0.010345 0.002688 0.001523 
+0.000000 -0.000507 -0.000971 -0.002350 0.003037 -0.000774 
+0.000000 -0.020000 -0.017222 -0.009294 -0.004378 0.018148 
+-0.011587 -0.017937 0.020489 0.000574 -0.005903 0.010865 
+0.004095 0.011671 -0.025470 0.032985 0.029091 -0.046179 
+-0.003919 -0.013403 -0.010516 -0.096963 -0.038037 -0.022098 
+-0.077045 0.003249 -0.016791 -0.044454 0.001598 -0.005842 
+-0.012468 -0.006715 -0.007083 -0.006311 0.006855 0.001006 
+-0.005657 0.006904 -0.001314 -0.005455 0.001818 0.012727 
+-0.030637 -0.006814 0.000686 -0.015867 0.002267 -0.011333 
+0.011000 -0.010600 0.021200 -0.020468 0.025650 -0.097941 
+-0.009806 -0.003293 -0.045196 0.009605 -0.009302 -0.023697 
+0.021716 0.000247 -0.022951 0.006857 -0.005143 -0.017500 
+0.013730 0.012106 -0.036657 0.021837 0.038032 -0.042868 
+-0.008730 0.006190 -0.004762 -0.002702 0.005195 -0.005000 
+0.004894 0.011186 -0.010882 0.012152 0.001864 -0.008667 
+0.000228 0.003313 -0.002847 0.000033 -0.000642 0.000724 
+0.006398 0.003629 -0.004055 0.002315 0.006130 0.000282 
+-0.000640 0.000885 -0.001283 -0.008395 -0.001390 0.006299 
+-0.013633 -0.010384 0.012911 -0.021100 -0.018918 0.003809 
+-0.027103 -0.026535 0.003784 -3.719178 -3.260274 0.130137 
+-4.213333 -3.566667 -0.033333 -4.245509 -3.251497 -0.502994 
+-3.937824 -2.797927 -0.839378 -3.487310 -2.421320 -0.873096 
+-0.029180 -0.021335 -0.008336 -0.020888 -0.018363 -0.008243 
+-0.010496 -0.011951 -0.003274 0.006327 -0.003490 -0.000748 
+0.009161 -0.011409 0.004925 -0.001471 0.004412 -0.015588 
+0.029277 -0.000191 -0.006973 0.007669 -0.006095 -0.007798 
+-0.001325 -0.010662 -0.006450 -0.004337 0.008329 -0.007070 
+-0.001071 0.012190 0.000673 0.004103 0.008313 0.004278 
+0.005891 0.003169 0.007902 0.005507 0.000200 0.008130 
+-0.003201 -0.000293 0.000198 -0.013273 0.003294 -0.009182 
+0.004341 0.000377 -0.000869 0.031111 0.002592 -0.001970 
+0.044915 0.018956 -0.014541 0.041511 0.025404 -0.026377 
+0.015805 -0.025582 -0.028041 -0.010923 -0.009697 -0.020857 
+-0.015396 0.002287 0.012551 0.003127 -0.002618 0.021927 
+-0.006943 -0.010896 0.028228 0.017840 -0.004865 0.009167 
+0.021408 -0.017882 -0.026005 0.007182 -0.011215 -0.003086 
+-0.002776 0.005823 0.002056 0.000914 0.008226 0.004778 
+-0.006094 0.014915 -0.007128 -0.005923 0.030586 -0.008894 
+-0.010392 0.006062 0.010952 -0.037982 -0.014662 0.018659 
+0.002041 -0.001570 0.005337 0.004293 -0.007475 0.000253 
+0.001034 -0.001349 0.000273 -0.006400 0.004533 -0.008380 
+-0.013071 -0.017525 -0.030575 -0.078000 -0.030591 0.011124 
+0.149833 -0.091333 -0.041667 0.010256 -0.051282 -0.007500 
+-0.004286 -0.006506 -0.020156 0.014566 -0.002469 -0.009958 
+0.027832 0.008323 -0.013323 0.034305 -0.003919 -0.000193 
+0.025119 0.002078 -0.018761 -0.034634 0.004055 -0.029482 
+-0.049717 0.014174 -0.077993 -0.011170 0.014491 -0.024226 
+0.017879 -0.021943 -0.005181 -0.006429 0.020571 -0.009000 
+-0.013819 0.015307 -0.008943 -0.017105 0.002293 0.000598 
+0.006085 0.012007 -0.003196 0.014185 0.047483 -0.037424 
+0.048464 0.067986 -0.065338 -0.035694 0.028536 -0.018378 
+-0.016480 0.013658 -0.023478 -0.003429 0.000623 -0.015517 
+-0.000459 0.030024 -0.025984 -0.010154 0.013210 -0.017006 
+0.000062 -0.000021 -0.000782 0.002148 -0.002632 0.000311 
+-0.000833 -0.006578 0.001072 -0.000944 -0.006655 -0.005130 
+-0.008787 -0.003127 0.000042 -0.003181 0.002304 -0.001362 
+0.001529 0.007199 0.011248 -0.007367 -0.006161 0.004930 
+-0.015839 -0.019542 -0.004588 -0.021007 -0.026697 0.001540 
+-3.253165 -2.715190 0.272152 -4.019481 -3.110390 0.376623 
+-4.518750 -3.250000 -0.150000 -4.468926 -2.971751 -0.796610 
+-4.093567 -2.526316 -1.198830 -0.035989 -0.021745 -0.016682 
+-0.032545 -0.016753 -0.010864 -0.021501 -0.008177 -0.005820 
+-0.012209 -0.008106 -0.014149 -0.009177 -0.002664 0.000640 
+-0.004935 -0.003372 0.002959 -0.007500 -0.015300 0.011475 
+-0.007752 -0.003442 -0.016100 0.003268 0.008290 -0.007154 
+0.004322 0.005897 0.001567 0.004733 0.006762 0.002923 
+0.000919 0.004755 0.005669 0.005219 0.000629 -0.002184 
+0.004858 0.001901 0.000498 0.005615 0.008547 0.012745 
+0.004942 0.009331 0.010727 0.002009 -0.000758 -0.001649 
+0.009872 -0.009077 -0.012455 0.008400 -0.013386 -0.014023 
+-0.010367 -0.005717 -0.011143 -0.000269 -0.001076 0.003143 
+0.003529 0.009269 0.006741 0.011482 0.005894 0.000184 
+0.007003 -0.007822 0.003332 0.002291 -0.017524 0.001092 
+0.000879 -0.009853 0.000946 -0.000762 0.001934 -0.001030 
+0.000987 0.000235 0.000054 0.000428 0.005463 0.004076 
+0.008694 0.005480 0.005865 0.012088 0.002747 0.002198 
+-0.010370 0.013779 0.013159 -0.029758 0.016045 0.015788 
+-0.016273 0.010830 -0.001688 -0.007227 -0.002662 -0.002314 
+0.002527 -0.009077 -0.009889 0.003167 -0.015538 -0.017877 
+0.032021 -0.017198 0.011563 0.027892 0.006606 -0.028417 
+0.023802 0.052562 -0.043140 -0.017124 0.018126 0.058479 
+-0.006635 0.013661 0.004885 0.005926 0.001068 0.004270 
+-0.000341 -0.000956 0.008741 0.004600 -0.000600 -0.000400 
+0.015771 0.003470 -0.025108 0.031759 0.015893 -0.043725 
+0.020970 0.023441 -0.039491 -0.006772 0.006445 -0.026564 
+-0.021680 -0.002795 -0.006034 -0.006255 0.011925 0.001715 
+0.000733 0.002298 -0.003275 -0.011507 0.005517 -0.013648 
+0.001820 0.021950 -0.019825 0.018518 0.042879 -0.054576 
+-0.027692 0.042659 -0.006563 0.000239 0.039058 0.010084 
+0.002058 0.032846 -0.000679 0.008411 0.023698 0.000491 
+-0.004981 0.003691 0.000473 -0.005373 0.006602 -0.000089 
+-0.002324 0.014012 -0.004991 -0.002634 -0.001791 -0.005759 
+-0.007877 0.007037 0.000905 -0.009948 -0.000800 0.015817 
+-0.006845 0.003438 0.016068 0.001611 0.006944 0.005806 
+0.012128 0.016915 0.005638 0.010947 0.024499 -0.004168 
+-0.000976 0.002902 -0.009645 -0.011332 -0.014224 -0.008596 
+-0.020405 -0.021533 -0.003536 -3.192308 -2.352564 -0.403846 
+-3.934640 -2.647059 -0.464052 -4.452055 -2.657534 -0.890411 
+-4.820144 -2.669065 -1.179856 -4.816000 -2.832000 -0.904000 
+-0.042590 -0.028645 -0.008058 -0.039165 -0.015972 -0.005700 
+-0.023254 -0.000924 -0.000077 -0.009675 -0.003178 0.001895 
+-0.007108 -0.021446 -0.007832 0.005295 -0.023856 -0.005228 
+0.039333 0.061255 0.000361 0.010428 0.017959 -0.000781 
+-0.001349 -0.000452 0.004850 0.002083 0.002352 0.003226 
+0.010045 0.006681 -0.001240 0.013048 -0.001228 0.000816 
+0.004217 -0.014416 0.004814 0.009369 0.005639 0.006337 
+0.016196 0.014719 0.001585 0.007099 0.012630 0.003007 
+-0.005818 -0.000882 -0.000298 -0.002845 -0.004018 -0.016162 
+-0.003078 0.003855 -0.005987 0.003790 0.009646 0.011210 
+-0.007736 0.009253 0.017534 -0.012756 0.004881 -0.005759 
+-0.002065 0.007954 -0.006416 0.004282 -0.007796 0.004146 
+0.019518 0.003531 -0.003173 0.026457 0.036086 -0.027429 
+0.010549 0.002172 -0.007116 -0.014394 -0.006061 0.000455 
+-0.013348 -0.031348 -0.000269 -0.031429 -0.017857 -0.002857 
+-0.013545 -0.013545 -0.009030 -0.009800 0.006335 0.000513 
+0.002331 0.013120 0.002091 -0.004930 0.002200 0.003999 
+-0.004470 -0.006421 0.011665 -0.026897 -0.006650 0.026798 
+-0.026110 0.019853 -0.000722 -0.014211 0.000081 -0.001700 
+-0.034465 0.002100 0.014868 0.003519 -0.001846 -0.017705 
+-0.008963 0.003176 -0.007540 -0.006088 -0.004617 -0.002549 
+-0.012000 -0.009400 -0.006635 -0.020000 -0.003810 -0.008163 
+-0.011918 -0.001636 -0.009347 0.009655 0.005515 -0.012430 
+0.021323 0.011923 -0.009706 0.025296 0.001858 -0.012759 
+0.016958 -0.006942 -0.023916 0.012441 -0.006539 -0.026953 
+0.015561 -0.000354 -0.020510 0.010724 -0.007619 -0.017638 
+0.018972 -0.005591 -0.021935 0.030619 0.027556 -0.026722 
+-0.014383 0.052352 0.007766 0.001239 0.032857 0.000908 
+0.004763 0.012976 0.001279 0.005762 -0.002667 0.003918 
+0.010144 -0.003322 0.006409 0.007595 0.003269 0.003990 
+-0.000243 -0.000477 0.000840 -0.011663 -0.002129 0.008198 
+-0.011896 -0.005019 0.014588 -0.007182 -0.010913 0.014081 
+-0.004245 0.002353 -0.000722 0.000599 -0.007586 -0.010249 
+0.005031 -0.002889 -0.005295 0.005700 0.011943 -0.007148 
+0.011864 0.016459 -0.000534 -0.001505 0.000180 -0.005247 
+-0.019416 -0.012566 -0.004200 -0.028651 -0.014704 -0.005213 
+-0.031492 -0.013916 -0.009911 -0.033374 -0.012602 -0.015775 
+-0.038552 -0.015676 -0.018866 -4.847457 -2.576271 -1.042373 
+-5.148148 -2.629630 -1.879630 -0.043222 -0.008976 0.003992 
+-0.027301 -0.005752 0.001075 -0.018458 -0.007482 -0.005703 
+-0.022128 -0.015708 -0.010368 -0.048133 -0.045879 0.003057 
+0.000676 -0.078571 0.000483 0.006815 -0.012371 0.002440 
+0.015456 0.011712 -0.017060 0.003775 0.000320 -0.006842 
+0.006371 0.000584 -0.006760 0.007831 -0.001458 -0.004719 
+0.000647 0.000290 0.000379 -0.004813 -0.002564 -0.000604 
+-0.007551 0.000270 -0.000111 -0.005805 0.003236 0.001026 
+-0.001857 0.005262 -0.001477 -0.001609 0.007818 -0.014603 
+-0.009788 0.007719 -0.011539 -0.005710 0.018957 -0.001636 
+-0.003255 0.007820 0.046886 -0.050987 0.005923 0.006180 
+-0.009261 -0.009069 -0.006286 -0.003724 -0.008303 -0.000794 
+-0.000476 0.003810 -0.007619 0.011754 0.016917 -0.021216 
+0.009064 0.004927 -0.033107 0.008183 -0.002956 -0.002124 
+0.005837 0.001861 0.012577 0.003371 -0.003943 0.010176 
+-0.003154 -0.003377 0.001166 -0.005465 0.000582 -0.002229 
+-0.006013 0.001017 0.003129 -0.007341 -0.001730 0.007956 
+-0.017592 -0.004043 0.004635 -0.015573 0.005491 0.013155 
+-0.008353 0.008760 0.004512 -0.005501 0.006238 0.001191 
+-0.008043 0.000074 0.002328 -0.006874 -0.005427 -0.000702 
+0.007178 -0.003541 -0.002888 0.007172 -0.002276 0.004390 
+0.000238 -0.000057 0.000549 -0.008954 0.001328 0.000170 
+-0.018282 -0.004085 0.002238 -0.019946 -0.005794 0.004301 
+-0.011316 -0.001766 0.002397 0.008969 0.005104 -0.010611 
+0.016234 0.004943 -0.017097 0.006093 0.000912 -0.007900 
+0.006440 0.004662 -0.000299 0.013488 0.021754 -0.013923 
+0.028780 0.026180 -0.030454 0.035899 0.003776 -0.011283 
+0.001564 0.001544 0.008045 0.005816 -0.000986 0.002062 
+0.004843 0.009391 0.014883 -0.002505 0.009158 0.006959 
+-0.001935 0.003136 -0.000392 0.002046 0.006143 -0.008483 
+-0.008691 -0.002749 0.006971 -0.026195 -0.021641 0.031193 
+-0.006289 -0.018875 0.028838 0.015135 -0.002943 0.002749 
+0.010683 0.024403 0.008104 -0.002749 0.019691 0.000833 
+-0.001269 0.003262 -0.002568 0.004191 0.003178 0.001595 
+0.011125 0.002702 -0.000996 0.008617 -0.001098 0.002402 
+-0.010035 -0.005130 0.011528 -0.028111 -0.012507 0.006639 
+-0.033383 -0.017030 0.001806 -0.036095 -0.017750 -0.003541 
+-0.039285 -0.020076 -0.008430 -0.045904 -0.023556 -0.001642 
+-4.965517 -2.310345 -1.112069 -4.648855 -2.312977 -0.511450 
+-0.037252 -0.010058 0.008664 -0.030925 -0.010201 0.000172 
+-0.025001 -0.014496 -0.001383 -0.023072 -0.022725 0.004353 
+-0.050718 -0.077880 0.047054 -0.049384 -0.035049 0.017497 
+-0.026978 -0.025680 0.017753 0.011769 0.037981 -0.031088 
+-0.005360 -0.003928 -0.001083 -0.014872 -0.005329 0.009496 
+-0.013708 -0.036144 0.005235 -0.008166 -0.023257 0.004316 
+-0.007805 -0.008311 0.002458 -0.009292 0.002292 0.004167 
+-0.005854 0.003266 0.008243 -0.005555 -0.000260 0.009821 
+-0.006075 0.001897 0.000888 0.002083 0.000000 0.000000 
+0.014515 -0.000752 0.001735 0.025891 -0.000364 0.004836 
+0.011486 0.005429 -0.001257 0.022130 -0.022632 0.004016 
+-0.012990 -0.035305 0.029401 0.010263 -0.005382 0.017988 
+-0.002733 -0.000845 0.009760 0.001840 -0.000725 0.000136 
+0.010197 0.002840 0.007327 -0.000174 0.004868 0.017941 
+0.001958 -0.008685 0.005496 0.000000 0.002091 -0.002613 
+-0.009198 -0.002839 0.008004 -0.021402 -0.040000 0.008026 
+-0.025906 -0.021914 0.042554 -0.009723 0.002636 0.020207 
+-0.007852 0.005384 0.003476 -0.000308 0.008068 0.002638 
+0.009474 0.012136 0.003034 0.009456 0.000077 -0.014836 
+0.004645 -0.000441 -0.000688 -0.003005 -0.001009 0.001573 
+0.003583 0.007506 -0.009085 0.011279 0.011441 -0.016172 
+0.001190 0.000584 -0.000955 -0.012764 -0.015042 0.012224 
+-0.019545 -0.021572 0.018984 -0.020036 -0.019189 0.017862 
+-0.014350 -0.011995 0.009497 -0.005140 -0.002451 -0.002966 
+0.000131 0.003936 -0.014516 0.023736 0.018530 -0.035079 
+0.043819 0.011376 -0.054879 0.020829 0.014012 -0.048410 
+-0.005573 0.004726 -0.012074 -0.010423 0.002744 0.000026 
+-0.005576 -0.003670 -0.001878 0.011500 0.008310 -0.014127 
+0.001014 0.006712 -0.024700 0.029948 0.020555 -0.021320 
+0.024743 0.015882 -0.011832 -0.017862 -0.027033 0.001895 
+0.027406 -0.010337 0.008297 0.014957 0.005491 0.021407 
+0.010663 -0.010000 0.006272 -0.001940 -0.015923 0.005163 
+-0.018449 -0.014886 0.003093 -0.021892 -0.002427 0.008496 
+-0.008027 0.006431 0.008122 -0.000781 0.023371 0.005143 
+0.001511 0.018956 0.002610 -0.007970 -0.010919 0.010532 
+-0.014629 -0.009355 0.000790 -0.016992 -0.011914 -0.000645 
+-0.027534 -0.012745 0.002716 -0.038751 -0.015049 0.000476 
+-0.044420 -0.023524 0.005224 -4.348485 -2.250000 0.189394 
+-3.520000 -1.617143 -0.234286 -2.930348 -1.353234 -0.492537 
+-0.027071 -0.011826 -0.001950 -0.022610 -0.015130 -0.002004 
+-0.025540 -0.019254 -0.000974 -0.098994 -0.094771 0.029650 
+-0.091515 0.004848 0.065152 0.023838 0.039028 0.028847 
+0.000944 0.008892 0.002125 0.001629 -0.007182 -0.001524 
+-0.008528 -0.005166 -0.007082 -0.000508 0.002063 0.000889 
+-0.003140 0.000206 0.005457 -0.003403 0.003189 0.001058 
+-0.003613 0.001317 0.003934 -0.002800 -0.010072 0.001185 
+0.003071 -0.009425 -0.000323 -0.001445 -0.002695 -0.001525 
+-0.007838 0.005418 0.004892 0.009909 0.009547 0.003457 
+0.013315 0.028967 -0.007011 0.007834 0.023307 0.016622 
+0.011576 0.038688 -0.014016 0.000700 0.009213 -0.005388 
+0.002195 0.003919 -0.004445 0.001868 0.002599 -0.006397 
+0.004902 0.002278 -0.005985 0.011023 0.000406 -0.008361 
+0.024798 -0.001713 -0.021326 0.036926 -0.009695 -0.031622 
+0.020624 -0.001741 -0.005836 0.011636 0.000857 -0.004648 
+0.013652 0.004340 -0.009606 0.014437 0.001792 -0.010515 
+0.012493 -0.001833 -0.009836 0.007958 0.003191 -0.014987 
+0.006500 0.003077 -0.007158 0.005969 -0.004144 -0.002382 
+0.004066 -0.006427 0.000511 -0.000732 0.000143 0.001096 
+-0.007277 -0.001933 -0.003528 -0.001363 -0.001706 -0.002987 
+-0.004948 -0.011786 0.012832 -0.022154 -0.024028 0.026391 
+-2.628205 -2.480769 2.519231 -2.410256 -2.153846 2.225641 
+-0.014551 -0.020740 0.012512 -0.005028 -0.009117 0.006542 
+0.000007 0.000073 0.000654 -0.003742 -0.004227 0.000058 
+0.003444 0.002615 -0.007378 0.021632 0.005132 -0.015415 
+0.019806 0.010877 -0.004136 0.001472 -0.008002 0.012163 
+-0.048055 -0.041792 0.018329 -0.042993 -0.004078 0.015181 
+0.003619 0.003641 -0.023860 0.014268 -0.012900 -0.017983 
+0.029696 0.000104 -0.012907 0.006187 0.003716 0.007847 
+-0.020651 -0.001805 -0.001944 -0.032945 0.001046 -0.019590 
+-0.010340 0.010646 0.010442 0.007218 0.012884 -0.005669 
+0.018003 0.012897 -0.007333 0.007139 0.012244 -0.019815 
+0.003736 -0.000587 -0.011849 0.000183 -0.001278 0.001957 
+-0.014952 -0.001697 0.003513 -0.017159 -0.015662 0.010745 
+-0.008575 -0.000389 -0.002016 -0.010958 -0.008327 -0.005023 
+-0.021186 -0.009500 0.004394 -0.022692 -0.007909 0.000362 
+-0.029892 -0.012159 0.003990 -0.025867 -0.020205 0.015191 
+-0.014526 -0.022043 0.007913 -2.856502 -1.206278 0.112108 
+-2.683128 -1.518519 0.028807 -2.657408 -1.791667 -0.009259 
+-0.024951 -0.017517 -0.001261 -0.022853 -0.012726 -0.003319 
+-0.017830 -0.005978 -0.005635 -0.005515 -0.000376 0.005646 
+-0.006294 0.008905 0.002273 0.009039 0.013721 -0.001166 
+0.005537 0.004598 0.020059 0.000256 0.010256 0.010256 
+-0.000352 0.000775 0.012571 -0.001448 -0.001566 0.007397 
+-0.016768 -0.002816 0.005581 -0.032573 0.006890 -0.002506 
+-0.024610 -0.000971 -0.009732 -0.014170 -0.035627 0.004804 
+-0.009955 -0.031183 0.009769 0.009402 -0.015869 -0.003673 
+0.014445 0.007894 -0.022600 0.024135 0.033248 -0.006486 
+0.008979 0.012360 -0.013352 0.007347 0.016590 -0.013017 
+0.024007 0.002584 -0.003418 0.012889 0.002436 -0.022058 
+-0.001508 0.011537 -0.021388 -0.013688 0.007575 -0.026312 
+-0.011250 0.019092 -0.007651 0.002281 -0.001027 0.002368 
+0.005648 -0.003658 0.002196 -0.000167 -0.003313 0.005732 
+-0.001575 -0.004694 0.004134 0.004172 -0.000998 0.003675 
+0.004566 0.000275 0.003911 0.000879 -0.003475 0.004072 
+-0.006860 -0.005633 0.005825 -0.011837 -0.005612 0.004954 
+-0.002586 -0.001744 0.006539 -0.001864 -0.005359 0.001865 
+0.000286 0.000334 0.002025 0.004636 0.008783 0.002098 
+0.004992 0.006377 -0.001895 -0.023912 -0.018290 0.019533 
+-2.971014 -3.028986 3.021739 -3.042105 -2.915789 2.810526 
+-2.659686 -2.293194 2.329843 -0.005099 -0.014259 0.014718 
+0.002545 0.005393 -0.000232 0.000752 0.004815 -0.009580 
+-0.004903 0.005544 -0.004665 0.002958 0.008363 -0.007603 
+0.013401 0.014109 -0.013364 0.010129 0.007010 -0.016718 
+-0.001672 0.002068 -0.006513 -0.005816 -0.000804 -0.002641 
+-0.002695 0.001769 -0.005872 -0.001946 0.002144 -0.004408 
+0.001428 -0.000299 -0.002670 -0.004499 0.002291 0.001174 
+-0.006800 0.004579 0.002976 -0.003784 0.002681 0.004236 
+-0.003834 -0.001266 0.003551 -0.017802 -0.011123 0.011292 
+0.057637 0.041633 -0.008722 0.041790 0.041000 0.019288 
+0.007246 -0.008271 0.010254 0.003211 -0.004266 0.008234 
+0.000722 -0.001251 0.001676 -0.010752 0.007710 0.003861 
+0.000016 0.012325 0.002450 -0.002668 -0.003032 -0.017405 
+-0.008009 -0.004773 0.005435 -0.005924 -0.005389 0.002150 
+-0.013681 -0.003971 0.003887 -0.022053 -0.004071 0.007323 
+-0.021904 -0.010335 0.010223 -0.023417 -0.015275 0.008847 
+-2.922330 -1.723301 1.072816 -3.117391 -2.052174 1.213043 
+-2.885845 -1.922374 0.840183 -0.020567 -0.015657 -0.000900 
+-0.016341 -0.010123 -0.005324 -0.012206 -0.012095 -0.006891 
+0.002401 -0.010085 -0.002949 -0.000040 0.005014 -0.000220 
+0.008177 0.011524 -0.000155 0.010294 0.004176 -0.008353 
+0.008231 0.002334 -0.007248 0.001906 -0.000075 -0.000251 
+-0.005760 0.003296 0.001981 -0.016692 0.001137 0.002448 
+-0.032159 -0.027664 0.014022 -0.030431 -0.028668 0.014494 
+-0.005420 -0.008109 0.002857 0.004473 0.004805 -0.001223 
+0.010816 0.008497 -0.001812 0.010333 0.001086 0.002293 
+-0.005253 0.007400 -0.010726 -0.003976 0.000536 0.000047 
+0.007068 0.000108 0.004923 0.018840 -0.006007 0.013516 
+0.014322 -0.022757 0.008918 -0.007161 -0.001245 0.007070 
+-0.010327 0.014753 -0.002217 -0.009859 0.010192 -0.002560 
+-0.003901 0.003294 -0.001788 -0.001415 0.000424 0.000947 
+0.001807 -0.001296 0.003952 0.003050 -0.005037 0.009016 
+-0.002718 -0.012525 0.014702 -0.000907 -0.010553 0.014115 
+-0.000027 -0.003930 0.012821 -0.004006 0.000233 0.008384 
+-0.005499 -0.001214 0.001425 -0.005245 0.012135 -0.010078 
+0.011481 0.012126 0.001230 0.014666 0.010894 -0.001939 
+-0.004141 -0.001206 0.004794 -0.024269 -0.018648 0.022956 
+-2.953846 -2.961539 3.261539 -3.397661 -3.116959 3.005848 
+-3.250000 -2.836957 2.576087 -2.582822 -2.177914 1.846626 
+-0.011462 -0.013140 0.009105 -0.000078 -0.000920 -0.004373 
+0.001808 0.001436 -0.004005 0.001064 -0.001218 0.000611 
+-0.001169 -0.001424 0.002504 0.000017 -0.000795 0.000894 
+-0.000287 0.000923 0.000069 0.003467 0.000749 -0.005344 
+0.009306 0.005763 -0.011931 0.016212 0.015303 -0.006212 
+-0.000206 0.009231 -0.002437 -0.004415 0.002475 -0.001973 
+0.003696 0.003514 -0.004438 0.006239 0.003620 -0.007395 
+-0.005694 -0.008356 0.006004 -0.029018 -0.010705 0.008170 
+-0.022417 0.004852 0.014937 0.000769 0.016342 0.015434 
+0.007439 0.028345 0.006689 0.001173 0.019365 -0.003312 
+-0.001877 -0.000150 -0.000300 -0.001287 -0.009112 0.004491 
+-0.009832 -0.005064 0.005713 -0.041945 -0.027758 0.019420 
+-0.018516 -0.027131 0.038502 -0.003265 0.000468 0.008003 
+-0.012998 -0.009232 0.002560 -0.012350 -0.006739 -0.004483 
+-0.004664 -0.006618 -0.002666 -0.015609 -0.005884 0.003198 
+-0.034428 -0.011366 0.014762 -3.317919 -2.884393 2.763006 
+-2.952381 -2.404762 1.933333 -2.452736 -1.696517 0.781095 
+-0.006324 -0.012023 -0.012585 -0.013584 -0.032205 -0.004450 
+0.089671 0.019613 0.030841 -0.009405 0.002371 -0.002912 
+0.004624 0.006274 0.002467 0.002435 0.003626 -0.000113 
+0.004460 0.007975 -0.000842 0.008457 0.012088 0.000781 
+0.006281 0.007229 -0.002173 -0.005865 -0.006061 0.005027 
+-0.031294 -0.019639 0.013983 -0.037444 -0.007956 -0.006927 
+-0.006191 0.001345 -0.001927 0.001845 0.009797 -0.000115 
+0.002772 0.019355 0.001155 -0.008214 0.012953 -0.000186 
+-0.005000 -0.000685 -0.005483 -0.002335 0.007256 0.000195 
+-0.003563 0.004095 -0.001991 -0.023828 0.036347 -0.006352 
+-0.011791 0.029964 -0.017022 -0.003603 0.015544 -0.023656 
+-0.003794 0.007390 -0.024021 -0.006280 0.005645 -0.009724 
+-0.004476 0.003341 -0.001483 -0.000346 0.000110 0.004147 
+0.001632 -0.002080 0.009159 -0.000496 -0.007036 0.011176 
+-0.005238 0.000889 0.006222 -0.002256 0.002531 0.001022 
+-0.000957 -0.000072 -0.000601 0.000503 -0.000609 -0.004237 
+-0.001005 0.000165 -0.000069 -0.000421 0.003811 -0.002840 
+0.003037 0.014321 -0.004547 0.002225 0.019515 -0.003407 
+0.016393 -0.000757 -0.008322 -0.005889 -0.004256 0.017308 
+-0.018924 -0.017891 0.027288 -2.623188 -2.318841 2.833333 
+-2.976048 -2.712575 2.760479 -2.684211 -2.701754 2.292398 
+-0.016450 -0.021202 0.017045 -0.006798 -0.010057 0.004577 
+0.004657 -0.005300 -0.001152 0.006000 -0.000676 0.000767 
+0.003095 -0.000034 -0.001242 0.001327 0.002465 -0.001853 
+0.003206 0.003707 -0.002647 0.003661 0.003695 -0.001480 
+0.004668 0.003786 -0.000356 0.009206 0.005052 -0.009431 
+0.008692 0.009121 -0.010719 -0.005159 0.000913 0.000332 
+-0.006519 -0.013314 0.008573 0.008388 -0.007045 0.002070 
+0.027598 0.007330 -0.000914 0.034138 0.009193 -0.001393 
+0.024522 0.006904 -0.001929 0.006356 0.009139 0.000385 
+0.002597 0.009628 0.000052 0.015835 0.004587 -0.004156 
+0.031524 0.007840 -0.002858 0.012606 0.011110 -0.005020 
+-0.001469 0.002232 -0.002633 -0.004003 -0.004882 0.001216 
+-0.003027 -0.002959 -0.000513 -0.013199 -0.012679 0.010914 
+-0.009453 -0.006178 0.001109 0.004534 0.005513 -0.005015 
+0.001322 0.004343 -0.000428 0.000710 -0.002153 0.001407 
+-0.015769 -0.014136 0.015439 -2.527027 -3.135135 3.290540 
+-2.175258 -2.479382 2.922680 0.003960 -0.012889 0.000167 
+-0.004972 -0.020949 -0.001548 -0.019649 -0.027625 0.019478 
+-0.019976 -0.012448 0.014300 -0.001865 -0.013083 0.017244 
+0.019769 0.012123 0.001277 -0.007949 -0.001704 0.005347 
+-0.036276 -0.026314 0.018671 -0.023195 -0.018363 -0.007806 
+-0.008363 -0.007769 -0.006316 -0.007047 -0.002332 -0.002968 
+-0.007129 -0.002760 -0.002043 -0.011730 -0.013838 -0.005128 
+-0.020683 -0.029747 0.000091 -0.022903 -0.025806 0.000000 
+-0.006876 -0.003310 -0.004312 -0.001187 0.000950 0.003947 
+0.000217 -0.000678 0.000786 -0.000392 0.000650 -0.000470 
+0.007085 0.014442 -0.005674 0.017036 0.022784 -0.025684 
+0.000037 0.009913 -0.010898 -0.002361 0.005602 -0.007129 
+0.000548 0.003075 -0.009265 -0.000766 0.003414 -0.007694 
+-0.003542 0.004186 -0.001279 -0.005531 0.001920 0.005812 
+-0.003593 -0.002445 0.004421 0.001517 -0.000771 -0.001144 
+0.002865 -0.000994 -0.000692 -0.001006 0.000661 0.000048 
+-0.003112 0.001945 -0.002205 -0.000391 0.001559 -0.004868 
+-0.000218 0.000880 -0.000091 0.000976 -0.001179 0.000870 
+-0.004317 -0.002154 -0.000414 -0.001849 0.004787 -0.005159 
+0.002367 0.008303 -0.007980 0.004927 0.001218 0.001273 
+-0.009502 -0.015857 0.021857 -0.019552 -0.029002 0.028907 
+-2.770492 -2.614754 3.147541 -0.022288 -0.023793 0.026053 
+-0.010700 -0.018092 0.016878 0.000630 -0.009081 0.002711 
+0.013313 0.005601 -0.009026 0.015456 0.016835 -0.008884 
+0.009897 0.014861 -0.003664 0.004251 0.007775 -0.001314 
+-0.001484 0.001706 -0.000334 -0.000928 -0.002618 -0.002767 
+0.000683 0.003376 -0.009825 0.001634 0.010726 -0.016450 
+0.006264 0.014799 -0.024227 0.020440 0.024721 -0.022229 
+0.015435 0.022846 -0.009361 -0.001671 0.005375 0.000252 
+-0.006894 -0.002781 -0.000060 0.005769 -0.015955 0.007557 
+0.012203 -0.017501 0.010330 0.017557 -0.012857 0.001463 
+0.017064 -0.005279 -0.007207 0.021684 -0.001152 -0.010166 
+0.082469 -0.010716 -0.022989 0.066431 0.048659 0.010525 
+0.020765 0.034383 -0.039945 0.004405 0.018100 -0.023296 
+0.009971 0.008527 0.002305 0.011237 0.007034 -0.005306 
+0.035294 0.008824 -0.013077 0.009840 0.037317 -0.011415 
+0.003495 -0.002648 0.009219 -0.000168 -0.003904 0.002272 
+0.001688 -0.004525 0.007580 -0.040735 -0.024440 0.028515 
+-2.277108 -2.753012 3.662651 -1.648352 -2.461539 3.846154 
+-1.244755 -2.454545 4.510489 0.013432 -0.030038 0.025335 
+0.006513 -0.019990 0.031353 0.003799 -0.015351 0.035004 
+-0.001753 0.002845 0.000815 -0.014782 -0.004355 0.005653 
+0.001554 -0.008550 -0.000856 0.005891 -0.006862 0.004043 
+0.003155 -0.003297 -0.001212 -0.001310 -0.005243 0.000403 
+-0.003693 -0.000660 0.002072 -0.005572 0.007331 -0.000587 
+-0.001168 0.009945 -0.003373 0.001603 0.000672 0.000915 
+0.004759 -0.008493 0.000160 0.005789 -0.005027 0.001109 
+0.006856 0.004209 0.002518 0.010998 0.000189 0.002044 
+0.004406 -0.004825 0.001245 0.001741 0.003836 -0.004713 
+-0.001119 0.005159 -0.005292 -0.004234 0.001736 -0.002474 
+-0.000297 -0.000103 0.000132 0.003746 0.000607 -0.002897 
+0.003981 0.001686 -0.004900 0.003262 0.000203 -0.005661 
+0.000282 -0.000192 -0.001392 -0.000402 0.001499 0.004429 
+0.000502 0.001128 0.004999 -0.002383 0.001657 0.000110 
+-0.004314 0.002224 -0.007369 -0.000558 0.004025 -0.010057 
+0.000186 0.005309 -0.004588 -0.003430 0.000573 -0.005432 
+0.002307 0.002323 -0.006545 0.006222 0.008415 -0.004950 
+0.002413 0.009680 -0.008346 0.000399 0.003978 -0.008987 
+-0.007176 -0.007224 0.000194 -0.009875 -0.012705 0.007689 
+-0.010785 -0.012703 0.011615 -0.010841 -0.012853 0.015140 
+-0.006256 -0.014412 0.014473 -0.000530 -0.011815 0.004254 
+0.007903 0.000188 -0.002151 0.008772 0.005905 0.001286 
+0.007962 0.004848 0.000394 0.006234 0.000821 0.000348 
+0.003710 -0.001153 0.000946 0.002222 -0.001843 0.000369 
+0.000190 -0.001618 -0.003233 -0.002658 -0.002009 -0.007046 
+-0.002279 -0.002000 -0.005581 -0.001535 -0.010913 0.009544 
+-0.009792 -0.014504 0.011500 0.017891 0.013075 -0.000237 
+0.022999 0.033043 -0.015306 0.032369 0.050972 -0.046622 
+0.018178 0.043394 -0.002895 -0.002274 0.005857 -0.003364 
+0.000177 -0.002244 -0.000236 -0.004942 -0.003281 -0.000766 
+-0.014663 -0.004131 0.002613 -0.024307 -0.005060 0.012081 
+-0.038644 -0.018804 0.019622 0.007943 -0.030261 -0.002621 
+0.010526 -0.000901 0.032178 0.004464 0.004023 0.015812 
+0.001343 0.003544 0.002854 -0.005366 -0.003566 0.003086 
+0.002311 -0.006051 0.011944 -0.012015 -0.008593 0.017308 
+-0.017059 -0.001397 0.004851 -0.032854 -0.013040 0.012462 
+-0.031636 -0.022727 0.047037 -1.736842 -2.954887 4.766917 
+-1.013793 -2.593103 4.344828 0.006203 -0.009189 0.033762 
+0.000017 -0.011866 0.027222 -0.003914 -0.008265 0.020978 
+-0.010734 0.008432 0.001869 -0.005667 0.009639 0.003551 
+-0.006572 -0.004154 -0.000973 -0.013305 -0.015986 0.010219 
+-0.010167 -0.010281 0.009434 0.000012 -0.009388 0.005774 
+0.004707 -0.013487 0.005090 0.009448 -0.011940 0.002191 
+0.009899 -0.000673 0.009731 -0.000234 -0.001553 -0.006503 
+-0.001591 0.002727 -0.006591 0.006657 0.006840 -0.001732 
+0.006439 0.008422 0.004855 -0.002608 -0.008472 0.004299 
+-0.006493 -0.011123 0.012998 -0.003283 -0.003852 0.006116 
+-0.000227 0.000346 -0.000279 0.001973 0.003078 -0.001152 
+0.002773 0.002759 -0.001506 0.005437 0.000671 -0.000496 
+0.000184 -0.002334 -0.005097 0.000173 -0.001936 -0.005246 
+0.002419 -0.000494 -0.000431 -0.000160 0.000456 0.000625 
+0.000770 -0.000700 -0.000852 0.007884 0.002538 -0.010603 
+0.005203 0.003615 0.000225 -0.002744 0.004237 -0.008727 
+-0.002659 -0.004360 0.000101 -0.003738 -0.007694 0.006819 
+-0.001555 -0.000256 0.003657 0.003570 0.001201 -0.003405 
+0.005038 -0.003358 -0.007927 0.003379 0.004939 -0.007191 
+0.002262 0.002282 -0.001981 -0.007588 -0.005119 0.003674 
+-0.018116 -0.008054 0.014640 -0.006552 -0.019766 0.017693 
+0.004106 -0.010932 0.000347 0.000191 -0.000162 -0.000467 
+0.001374 -0.001336 -0.003533 0.000792 0.000750 0.000612 
+0.000528 0.006503 0.001355 -0.000688 0.005878 0.000628 
+-0.004277 0.001890 -0.000453 -0.005564 -0.001455 -0.000484 
+0.002127 -0.000194 -0.001237 0.006906 0.008119 -0.003141 
+0.002949 0.007746 -0.002328 -0.000266 -0.002785 0.000991 
+-0.000317 0.012063 0.013810 0.000771 0.003327 -0.004288 
+-0.010259 -0.010724 0.002795 -0.002297 -0.015275 0.010566 
+-0.000234 -0.004832 0.002233 0.003645 0.012920 -0.006731 
+0.003767 0.015186 -0.010821 0.000887 0.012771 -0.007044 
+-0.003089 0.012121 0.000618 0.005603 0.005045 -0.000560 
+0.014489 0.000046 -0.002992 0.004165 -0.003711 -0.004611 
+-0.006022 -0.006028 -0.000864 -0.007791 -0.012763 0.011654 
+-0.018647 -0.020581 0.010808 -0.012994 -0.023610 -0.000007 
+-0.015878 -0.012060 0.002967 -0.005283 0.002162 0.019779 
+-0.021800 -0.001000 0.012600 -0.035752 -0.031362 0.032615 
+-0.027953 -0.029386 0.042366 -0.022938 -0.021041 0.039982 
+-0.008847 -0.010785 0.035980 0.000743 -0.001453 0.028027 
+0.006186 -0.000687 0.019121 0.004771 -0.009432 0.013220 
+-0.000633 0.003691 -0.000005 -0.007498 0.009153 0.004125 
+-0.012277 0.005587 0.004708 -0.020025 -0.004643 -0.000834 
+-0.010259 -0.014579 0.000909 0.001635 -0.018861 0.006413 
+-0.002513 -0.012736 0.000586 -0.003036 0.001296 0.001498 
+-0.007581 0.008272 0.008628 -0.009081 0.002666 0.015412 
+-0.003420 -0.001937 0.000462 0.011388 -0.001407 0.000562 
+0.011789 -0.005129 -0.003677 0.002824 -0.006244 0.002180 
+0.003659 -0.001752 -0.002713 -0.000171 0.002251 -0.004983 
+0.001803 0.004415 -0.001626 -0.000020 0.000745 -0.000056 
+-0.001659 -0.002097 -0.001449 -0.001453 -0.001333 -0.003029 
+0.001990 -0.001210 -0.003790 0.005175 0.001474 -0.004065 
+0.004962 -0.000468 -0.004756 0.002949 -0.001053 -0.005339 
+0.008651 0.001865 -0.002460 0.000480 0.005619 -0.008018 
+-0.001128 0.003948 -0.006170 0.001822 0.002809 -0.004933 
+0.000294 0.002054 -0.003444 0.000094 0.002089 -0.002225 
+-0.001320 0.001409 -0.001055 -0.002127 -0.000183 -0.000812 
+-0.003453 -0.002399 0.000254 -0.002849 -0.002724 -0.000656 
+-0.001109 -0.001512 -0.002643 0.000915 0.001073 -0.004417 
+0.001269 0.001866 -0.002529 -0.000594 -0.000087 0.000316 
+-0.003159 -0.002246 0.002484 -0.002219 -0.002676 0.001917 
+0.002554 0.002747 -0.001813 0.010271 0.006834 -0.009507 
+0.011474 0.005157 0.001393 0.000475 0.009892 0.004529 
+-0.001783 0.001934 0.000264 0.000335 -0.005699 -0.001375 
+0.004246 -0.004927 -0.002391 0.006304 0.002410 -0.002304 
+0.005393 0.011692 0.000684 0.005116 0.024882 -0.006609 
+-0.013386 -0.005238 -0.031234 -0.030897 -0.098889 -0.002575 
+0.007347 -0.003351 0.005728 -0.010750 0.021500 -0.015625 
+0.015921 0.052588 0.025691 -0.008122 0.058000 -0.053508 
+-0.003097 -0.000497 -0.002747 0.008270 -0.016551 0.001741 
+0.012904 -0.012523 -0.004009 0.013188 0.001509 -0.003108 
+0.012353 0.008741 0.003084 0.010998 0.007647 0.000991 
+0.017314 0.003971 -0.004943 0.037300 0.003471 -0.000785 
+0.030367 0.000470 0.012026 0.018166 -0.003226 0.012637 
+0.011386 -0.008566 0.006978 -0.008045 -0.001283 0.010185 
+0.010568 0.010227 -0.010227 0.045143 0.104416 -0.031985 
+0.010080 -0.024514 0.036305 -0.011200 -0.025206 0.027078 
+-0.007454 -0.016199 0.012941 0.003535 -0.003342 0.004467 
+0.003640 0.003698 -0.007573 0.003500 0.010456 -0.011104 
+-0.005103 -0.014063 0.000308 0.003038 -0.002932 0.001068 
+0.007060 0.012935 -0.003283 0.006861 0.025579 -0.002791 
+0.006874 0.018899 0.003436 0.000366 0.000291 0.000213 
+0.003321 -0.001734 -0.002086 0.007633 -0.002816 0.001837 
+0.005409 -0.002309 0.001085 0.000432 -0.002459 0.002886 
+-0.002643 -0.007436 0.006372 -0.002591 -0.012336 0.011650 
+-0.002447 -0.010606 0.011932 0.000490 -0.005353 0.006308 
+0.003721 -0.000867 0.002457 0.003351 0.001511 -0.000422 
+0.000165 0.003169 0.000328 -0.002210 0.003096 -0.000837 
+-0.001609 0.000019 -0.000761 0.000704 -0.002463 0.000075 
+0.003168 -0.002083 -0.001379 0.003964 0.000642 -0.003128 
+0.003943 0.003508 -0.002912 -0.001663 -0.001075 -0.002523 
+0.000342 0.000863 -0.004479 0.001139 0.001146 -0.002854 
+0.000925 -0.001771 -0.004024 -0.000553 -0.000374 -0.004092 
+-0.000986 0.001863 -0.001613 -0.000087 -0.003114 0.002430 
+-0.001324 -0.008630 0.004303 -0.002464 -0.002391 0.002391 
+0.000492 0.003481 -0.004483 0.002565 0.005676 -0.005367 
+-0.000882 0.003039 0.000132 -0.001012 0.000556 0.000753 
+0.001064 0.000155 -0.002217 0.003595 0.002686 -0.005767 
+0.004140 0.002119 -0.004610 0.002338 -0.001180 -0.002694 
+0.004555 0.000569 -0.002050 0.009754 0.005096 -0.004387 
+0.011857 0.002218 -0.004517 0.003307 0.000423 -0.000033 
+-0.007714 -0.005382 -0.002637 -0.012515 -0.013756 -0.004200 
+-0.009185 -0.014413 -0.002405 0.003457 -0.004303 -0.003559 
+0.013642 0.015960 -0.007572 0.007319 0.020586 -0.007457 
+-0.005710 -0.012872 0.004558 -0.012652 -0.025627 0.010458 
+0.013776 0.014755 0.002727 0.001619 0.000931 -0.002470 
+0.000129 -0.001398 0.000828 -0.010545 -0.000893 0.011836 
+-0.003028 0.004852 -0.000795 -0.003242 -0.000295 -0.000858 
+-0.001557 -0.006428 -0.000552 -0.011562 -0.012812 0.003437 
+-0.003345 -0.017684 -0.001779 0.003274 -0.007560 -0.001642 
+0.014663 0.007470 -0.000741 0.006324 0.009568 0.008583 
+-0.003868 0.009139 0.006225 -0.001092 -0.002322 -0.001443 
+0.000181 -0.005309 0.000784 0.014929 0.005467 -0.006468 
+0.031681 0.024023 -0.010645 0.043953 0.017817 0.001078 
+0.013663 0.001831 0.007775 -0.000682 -0.007272 0.001338 
+-0.005003 -0.006305 0.000148 -0.001993 -0.001660 0.000930 
+0.002086 0.001079 -0.001578 0.004499 0.001185 -0.004262 
+0.008842 0.016656 -0.001968 -0.000339 0.012160 -0.007492 
+0.000744 0.004147 -0.003881 -0.004336 -0.020000 -0.005420 
+0.004502 -0.003213 0.006015 -0.004108 0.001965 0.016341 
+-0.000609 0.000304 0.009565 0.000283 0.000141 -0.003464 
+0.002966 0.004932 -0.008882 0.003489 0.001823 -0.001583 
+-0.000879 -0.007209 0.005177 -0.007414 -0.007255 0.011031 
+-0.005497 0.000759 0.007302 -0.003263 -0.000296 -0.004216 
+-0.001922 -0.002420 -0.001619 0.000240 -0.000045 -0.000041 
+-0.001116 0.001256 0.000794 -0.001289 0.002665 0.000505 
+0.001518 0.004389 -0.001559 0.001853 0.001612 -0.001849 
+-0.000785 -0.004049 0.001903 -0.003234 -0.008317 0.003465 
+0.001760 -0.002962 0.001848 0.000558 -0.001534 0.000663 
+0.000012 -0.001183 0.001347 0.000732 -0.001388 0.001502 
+0.000274 -0.000133 0.000289 0.002800 -0.002969 -0.001632 
+0.006241 -0.003555 -0.004712 0.001212 0.001900 -0.005536 
+0.003411 0.003098 -0.002253 0.004494 0.000605 -0.003042 
+0.000122 -0.001868 -0.002315 -0.000864 -0.000991 -0.001532 
+0.001878 -0.003819 0.000558 0.004486 -0.005721 0.002630 
+0.004487 -0.005181 0.007319 -0.000287 0.001219 0.001792 
+0.000089 -0.000405 -0.000138 0.001770 -0.000617 -0.006295 
+0.002341 0.001540 -0.004576 0.001953 0.001302 0.000110 
+0.000802 0.001498 0.003480 -0.005112 0.004524 -0.003185 
+-0.011310 -0.004207 -0.002385 -0.008611 -0.014127 -0.003139 
+-0.004854 -0.018577 -0.001071 -0.001344 -0.016722 -0.001264 
+-0.001031 -0.009239 -0.002474 0.000661 0.002955 -0.005234 
+-0.002179 0.017668 -0.011956 -0.003111 0.028416 -0.026542 
+0.044670 0.029049 -0.009542 -0.006996 0.013539 -0.015967 
+0.012570 0.017718 -0.018383 0.008802 0.012361 -0.008643 
+0.002442 0.005519 -0.001700 0.001690 0.003718 -0.004298 
+0.001478 -0.000367 -0.003343 0.016630 0.006543 -0.009406 
+0.027016 0.003349 0.003644 0.015585 0.000617 0.001924 
+0.000588 0.007387 0.002814 -0.009789 0.012102 0.018568 
+-0.003904 0.007788 0.006588 0.008443 0.004411 0.002233 
+0.010889 0.019573 -0.003140 0.001253 0.019710 -0.009202 
+-0.004265 0.002848 0.001565 0.004604 0.002608 0.003305 
+0.016337 0.001498 0.000462 0.010276 0.009455 -0.001327 
+-0.000519 0.015646 -0.010710 -0.000893 0.012810 -0.015080 
+0.005221 0.005914 -0.015612 0.008441 -0.004782 -0.002293 
+0.009702 -0.011127 -0.005009 0.002972 -0.030492 -0.005842 
+0.000466 -0.019149 -0.013345 0.000393 -0.000445 -0.004349 
+-0.000229 0.006330 -0.004893 0.005079 0.005116 -0.006281 
+0.005318 0.004753 -0.004431 0.000848 0.002128 -0.001890 
+-0.003362 -0.003039 0.003500 -0.004617 -0.003901 0.005346 
+-0.001494 0.001040 0.000284 0.000095 0.004157 -0.005136 
+-0.001250 0.003336 0.001437 0.000880 0.002786 -0.000603 
+-0.002379 -0.002860 0.002347 -0.003926 -0.005495 0.005139 
+-0.003268 -0.004804 0.004160 0.000408 -0.001633 0.001020 
+0.003599 0.000910 -0.001164 0.003706 0.000803 -0.002039 
+-0.002468 -0.002094 -0.001515 -0.002386 -0.002698 0.000914 
+-0.002968 0.001258 0.003549 -0.001596 0.003651 0.003380 
+-0.001526 0.003166 0.001052 0.003452 0.002924 -0.000995 
+0.001753 0.001438 -0.005978 0.001785 -0.001671 -0.004993 
+0.000419 -0.001819 -0.002937 -0.002978 -0.000458 -0.002250 
+-0.003309 0.000447 -0.002178 -0.003082 0.000170 0.000809 
+-0.002948 0.000919 0.004218 -0.001506 -0.007289 0.002892 
+0.000119 -0.002877 0.006473 0.004891 -0.002499 0.002658 
+0.007407 0.000915 -0.001144 0.005060 0.006265 -0.001205 
+0.004207 0.005438 -0.003044 0.001964 0.006776 0.001079 
+-0.000165 0.003264 0.004419 0.002580 -0.001459 0.004207 
+0.003104 0.005089 0.002230 0.003332 0.006520 0.000097 
+-0.000908 0.000103 -0.002486 -0.006886 -0.011026 0.000390 
+-0.009133 -0.019182 0.001278 -0.006734 -0.015972 0.000949 
+0.001626 0.000660 -0.000744 0.010469 0.013419 -0.003320 
+-0.000945 0.004768 -0.004822 -0.023621 -0.043997 -0.000131 
+-0.001786 -0.016810 -0.015762 -0.003462 0.026591 -0.021288 
+0.002050 0.005487 -0.009690 0.000667 0.017667 0.000667 
+0.011060 0.006027 -0.015438 0.024558 0.012059 -0.010256 
+0.009687 -0.007693 0.009942 -0.005693 -0.019276 0.012284 
+-0.001310 0.001638 0.014571 -0.012258 0.003576 -0.000579 
+-0.010918 0.003322 -0.001383 -0.008900 0.000885 -0.002389 
+-0.007231 -0.002066 -0.001377 0.003720 -0.000684 -0.001692 
+0.009746 0.002696 -0.005165 0.010768 0.002879 -0.000243 
+0.003761 0.002225 0.004615 -0.001605 0.002887 0.002382 
+-0.013612 -0.004337 0.004881 -0.014785 -0.007630 0.003665 
+-0.006528 -0.008565 0.000456 0.001165 -0.010853 0.006867 
+0.001013 -0.002382 0.016987 0.010297 -0.002245 0.001229 
+-0.014150 -0.011709 0.001839 -0.004822 -0.013733 0.020935 
+-0.006550 -0.014284 0.012282 -0.010979 -0.010095 0.010822 
+-0.004610 -0.003654 0.005152 0.005786 0.004564 -0.007821 
+0.009268 0.009142 -0.014982 0.005184 0.007777 -0.010302 
+-0.001134 0.001661 -0.001229 -0.002442 -0.001724 0.001683 
+0.001313 0.000913 -0.000440 0.003769 0.000316 -0.003279 
+0.004737 0.001599 -0.001481 0.002525 -0.000076 0.000337 
+0.001970 -0.001313 0.000305 0.000904 -0.002079 0.000103 
+-0.002976 -0.004784 0.002870 -0.003710 -0.007204 0.002347 
+-0.000972 -0.004190 0.000339 -0.000789 0.000286 -0.000554 
+0.001979 0.002981 -0.001193 0.001101 0.000275 -0.001277 
+-0.003211 0.000719 0.004026 -0.005540 0.002329 0.007746 
+-0.000240 0.003956 0.008512 -0.001090 0.004503 0.003176 
+-0.000166 0.001978 -0.002413 0.006369 0.003921 -0.004900 
+-0.001228 0.005490 -0.000925 -0.003378 0.003496 -0.002867 
+0.004167 -0.000927 -0.006490 0.000811 0.005429 -0.004373 
+-0.000087 0.003482 -0.000911 -0.000097 0.002439 -0.002283 
+0.006864 0.007858 -0.002982 0.005503 0.009077 -0.005693 
+0.002824 0.004847 -0.004424 0.003733 -0.001682 0.002988 
+0.003864 -0.007790 0.001416 0.002228 -0.004797 -0.001313 
+0.002590 -0.000077 -0.001487 0.004253 0.003363 -0.004036 
+0.006360 0.005824 -0.004636 0.006749 0.008234 -0.005017 
+0.003861 0.006661 -0.005848 -0.000806 -0.000150 -0.000195 
+-0.000496 -0.011598 0.000843 -0.001703 -0.014527 -0.000879 
+-0.002934 -0.007599 -0.000522 0.000665 0.000278 -0.000817 
+0.000240 0.005620 -0.008136 -0.001401 -0.000769 -0.001496 
+0.019054 -0.024279 0.052116 0.030251 0.022987 0.023420 
+0.006115 0.027065 -0.001266 -0.006678 0.033400 0.013354 
+-0.027784 -0.007174 0.043591 -0.034895 -0.037838 -0.036156 
+0.001367 -0.000378 0.011168 0.001191 -0.007147 0.003333 
+-0.004434 -0.018016 0.002301 -0.009883 -0.020060 0.004839 
+0.002856 -0.011754 0.001662 0.008123 0.003690 0.000510 
+0.005706 0.009484 -0.004801 0.001940 0.007545 -0.005793 
+0.008576 0.006568 -0.004520 0.014416 -0.002249 0.004504 
+0.002082 -0.008828 0.004080 0.006114 -0.004865 0.004565 
+0.010517 0.003457 -0.000365 0.010815 0.002241 -0.002237 
+0.007013 0.001222 -0.002684 0.011742 0.011439 -0.000152 
+-0.001537 0.028716 0.002432 -0.003281 0.015927 0.003416 
+0.000105 -0.002000 0.005683 -0.001474 0.002640 0.009884 
+-0.007209 0.005077 -0.001828 -0.003600 0.000000 0.005200 
+-0.004040 -0.000600 0.000280 -0.002384 0.000599 -0.002851 
+0.005263 -0.003528 -0.007499 0.005334 -0.006702 -0.010124 
+0.031869 0.019867 -0.017996 0.014637 0.016273 0.004133 
+0.002558 0.006129 0.002238 0.003023 0.002419 0.002372 
+0.002099 -0.002325 0.005739 0.003498 -0.007329 0.013728 
+-0.008668 -0.010099 0.029835 -0.020000 0.010479 -0.003930 
+-0.022072 0.018192 0.009703 -0.025379 0.004126 0.002876 
+-0.024314 -0.009429 -0.001343 -0.007971 -0.013034 0.002412 
+0.009775 0.006772 0.000817 0.024604 0.014798 -0.005283 
+0.032066 0.010438 -0.014592 0.027626 -0.005644 -0.000498 
+0.021000 0.005465 0.012980 0.009921 0.009406 0.010750 
+0.013072 0.007478 0.005126 0.016346 0.001729 0.004325 
+0.008593 -0.003668 0.004358 0.009316 0.011189 0.009321 
+0.015090 0.014248 0.003423 0.010556 0.014722 -0.000556 
+0.002455 0.018845 0.005282 -0.002043 0.008192 0.016033 
+-0.007812 -0.003388 0.035413 -0.011446 -0.054000 0.091569 
+0.004125 -0.010367 -0.007510 0.000131 -0.004594 -0.003150 
+0.003251 0.000797 0.002298 0.001786 -0.000811 -0.000052 
+0.010407 0.002899 -0.001399 0.026574 0.013083 -0.006156 
+0.029519 0.011909 -0.012007 0.004921 -0.009841 -0.012302 
+0.000397 -0.003618 -0.016983 0.001392 0.009349 -0.008571 
+0.001658 0.002769 -0.000767 -0.012086 -0.003117 0.010492 
+-0.003069 -0.019644 0.026734 -0.034581 -0.076636 0.045360 
+-0.024338 -0.014489 0.001698 -0.004333 0.006683 -0.007702 
+-0.002408 0.006573 -0.006892 -0.007152 0.004518 -0.006096 
+-0.013432 0.002785 -0.000459 -0.012871 0.003302 0.004134 
+-0.004131 -0.001827 0.010159 0.003718 -0.019978 0.002783 
+0.009389 0.003360 -0.015511 0.013170 0.038761 -0.016556 
+0.007796 0.009027 0.005905 0.000651 0.001603 0.001659 
+0.015242 -0.005547 -0.004937 0.018382 -0.003925 -0.014205 
+0.000679 0.000080 0.001857 -0.003978 0.009477 0.023593 
+-0.019242 0.003745 0.015712 -0.009594 -0.000162 -0.011031 
+0.008266 0.006523 0.005655 0.012629 0.005098 0.003276 
+0.011460 0.004899 0.005099 0.006844 -0.001180 0.008438 
+-0.001345 0.001454 -0.000661 -0.000902 0.005262 -0.007583 
+-0.002180 0.004934 -0.006725 -0.000893 0.005556 -0.000526 
+0.004304 -0.000365 0.001605 0.002355 0.004647 -0.005256 
+0.003251 0.000188 -0.007498 -0.002260 0.004821 -0.014012 
+0.000130 0.007782 -0.011812 -0.002110 0.005135 -0.008743 
+0.002071 0.001990 -0.006767 0.012692 0.021538 0.002692 
+0.010302 0.004677 0.010299 0.013629 0.008745 0.008533 
+0.010501 0.015348 -0.003904 -0.001573 0.000007 0.001523 
+-0.005511 0.004072 0.010998 -0.004956 0.009885 0.005593 
+0.008902 0.016956 0.011728 -0.002030 0.000902 0.017500 
+-0.000170 0.012810 -0.002146 0.003198 0.013016 0.000135 
+0.015062 0.009383 -0.003086 0.011389 0.003947 -0.006003 
+0.001205 0.017681 -0.009343 0.011350 0.014250 -0.031779 
+0.015412 0.003853 -0.017500 -0.005165 0.005018 -0.004579 
+-0.008868 -0.014238 0.002852 0.017253 0.003846 -0.005155 
+0.058760 0.032232 -0.032470 -0.038669 -0.027278 0.034045 
+-0.007024 -0.028452 0.025179 0.000965 -0.023546 0.002445 
+-0.002802 -0.010719 0.004427 -0.008988 -0.001535 0.002913 
+-0.017000 0.000833 0.010500 -0.017401 0.000824 0.012849 
+-0.016496 -0.002405 0.015751 -0.020500 0.002600 0.005200 
+-0.000324 -0.010955 -0.004407 0.003862 0.000247 0.002752 
+0.015876 0.003437 0.000829 0.006957 -0.008126 0.001969 
+-0.007214 -0.027735 0.006631 -0.003991 -0.030051 0.004273 
+0.012519 -0.010376 -0.003816 0.023560 0.008071 -0.000470 
+-0.007200 0.023400 -0.001800 0.008538 0.003604 -0.008802 
+-0.003335 -0.003590 -0.007663 0.001004 -0.000437 -0.004442 
+0.009342 -0.009636 0.000233 -0.000495 -0.012752 0.008301 
+0.019345 -0.013244 -0.002994 -0.008187 -0.028155 0.002839 
+0.006023 -0.015109 0.005340 0.002833 -0.015353 0.006076 
+0.001842 -0.019805 0.014359 0.016400 -0.019255 0.001464 
+0.002911 -0.007150 -0.001790 -0.008849 -0.002346 0.012375 
+-0.012778 0.003716 0.009025 -0.004026 0.001610 0.005494 
+-0.011439 0.036174 -0.008660 -0.007347 0.012815 0.026143 
+0.010814 0.003848 0.000271 -0.036087 -0.025490 0.016154 
+-0.057059 -0.001376 0.022010 -0.028491 0.013509 0.005895 
+-0.007062 -0.001123 -0.037235 -0.019936 0.032728 -0.022422 
+-0.007755 -0.021326 -0.003382 0.003684 -0.006234 0.000247 
+0.005131 0.000799 0.001932 0.003732 0.002189 0.006000 
+-0.001801 -0.000878 0.004666 -0.003997 -0.001442 0.004559 
+-0.001922 -0.003402 0.001148 0.001068 0.002411 -0.001680 
+-0.008697 0.011709 -0.004900 0.000734 0.009838 -0.003976 
+0.004387 0.009371 -0.003500 0.003739 0.013296 -0.012147 
+0.003959 0.020147 -0.015677 0.004780 0.013951 -0.003703 
+0.004073 0.003818 0.002873 0.002637 0.005143 0.003415 
+0.004471 0.002455 -0.008710 0.001521 0.004336 -0.014137 
+0.016987 0.007202 -0.017183 0.036500 0.007909 -0.008349 
+0.031157 0.022017 -0.002783 0.007241 0.020172 0.002931 
+0.016620 0.007483 -0.008348 0.006857 0.008286 -0.001029 
+0.000807 0.016839 -0.003201 0.019152 0.046671 -0.028930 
+0.005088 0.041644 -0.018467 -0.010146 0.016736 -0.003057 
+-0.019872 -0.001062 0.005012 -0.010100 0.001165 -0.000777 
+-0.001263 0.000614 0.001287 0.001204 0.000372 0.019201 
+-0.019003 0.001729 0.004208 -0.023086 -0.005625 0.004897 
+-0.011724 -0.005397 -0.000411 -0.011322 -0.015842 -0.015257 
+0.004242 -0.010091 -0.007328 0.013137 -0.000312 0.002960 
+0.002493 0.001738 -0.001425 -0.015648 0.001625 0.006755 
+-0.029899 0.001432 0.019024 -0.036162 -0.000018 0.009102 
+-0.019580 0.011681 -0.027311 0.015648 0.005093 -0.005185 
+0.020550 0.025142 -0.024307 0.009433 0.031710 -0.030155 
+0.006792 0.030050 -0.015313 0.014311 0.019119 -0.001730 
+0.017250 0.003289 -0.000798 0.007862 -0.015082 0.004084 
+-0.011447 -0.029121 0.027414 -0.012495 -0.008854 0.022507 
+-0.002155 0.001444 0.007973 0.007084 -0.005056 -0.011837 
+0.007838 -0.006816 -0.014386 -0.006093 -0.006152 -0.004131 
+-0.006053 0.003967 -0.002935 0.012474 0.017001 0.007147 
+0.034044 0.021978 -0.007758 0.009928 -0.013284 -0.001283 
+0.002540 -0.003647 -0.000153 0.004728 0.000094 0.001038 
+0.014432 0.000211 -0.004754 0.016305 0.000362 -0.012527 
+-0.001507 -0.001943 -0.001404 -0.015128 0.025072 -0.004755 
+-0.006561 0.020749 -0.010190 0.005852 -0.002485 -0.001734 
+0.016095 -0.037691 0.007391 0.037855 -0.036875 -0.015773 
+0.055627 -0.025627 -0.007387 0.009333 -0.018667 0.019333 
+-0.000174 -0.011057 -0.003383 -0.070667 0.010000 -0.027000 
+0.001785 0.037020 -0.011651 -0.004697 -0.018607 -0.001945 
+-0.016687 -0.018053 -0.009353 -0.003520 0.002452 -0.002358 
+0.007403 0.006514 0.002386 0.009714 0.002280 0.001013 
+0.003646 -0.000313 0.000282 0.002185 -0.001055 0.004832 
+0.003335 -0.000929 0.002699 0.001640 -0.001033 0.000900 
+0.003839 -0.009550 0.001124 0.008887 0.005895 0.001632 
+0.007521 0.013443 -0.008303 -0.008047 0.016987 -0.013888 
+-0.018104 0.019310 -0.002523 -0.011845 0.011310 0.000673 
+0.019911 0.024463 -0.001527 0.039950 0.018229 -0.027467 
+0.024270 -0.013860 -0.017254 0.015439 0.012727 0.006176 
+0.013363 -0.006369 -0.012583 0.017391 0.013021 0.006944 
+0.018995 0.035855 -0.004638 0.017577 0.022380 -0.015620 
+0.010246 0.006471 -0.008550 -0.000077 0.007597 0.003735 
+-0.001347 -0.011707 0.007434 -0.008586 -0.026994 0.024301 
+-0.046553 -0.035833 0.009976 -0.047788 -0.040697 -0.002381 
+-0.014087 0.008760 -0.005864 -0.012258 0.002409 -0.008129 
+-0.005824 -0.009921 -0.001008 0.000340 0.003801 -0.003287 
+0.011500 0.014257 -0.005280 0.013532 0.017916 -0.000238 
+0.007467 0.010197 0.004132 0.006481 0.002455 0.002208 
+0.007217 0.003006 0.003116 0.000167 0.005773 0.003626 
+-0.009913 -0.006690 0.013972 -0.022951 -0.031812 0.020773 
+-0.055245 -0.063138 0.033636 -0.001948 0.016468 -0.039662 
+-0.002662 0.012500 -0.018637 0.010093 0.001852 -0.013796 
+0.007216 -0.016007 0.003150 0.004209 -0.014791 -0.006349 
+-0.001284 -0.002510 -0.002156 0.004509 0.001143 0.002019 
+0.019488 -0.002136 -0.001217 0.023727 -0.010884 -0.010231 
+0.014937 -0.022751 0.000207 -0.008051 0.014564 0.007436 
+-0.033071 0.030349 0.033275 -0.022492 0.025267 0.015360 
+-0.011109 0.011650 0.006817 -0.003374 0.001313 0.001596 
+-0.005070 0.002751 -0.003798 -0.002328 0.001383 -0.000208 
+-0.006166 -0.003366 0.004203 0.013393 -0.001214 0.013192 
+0.006995 -0.001140 0.002765 -0.002340 -0.004278 -0.002248 
+-0.004710 -0.006854 -0.001118 -0.005554 -0.006871 0.003073 
+-0.004765 -0.003390 0.002900 0.001392 0.009787 0.002941 
+0.005405 0.024487 -0.011017 0.017070 0.011602 -0.022897 
+0.022697 -0.015303 -0.009242 -0.010444 -0.007778 -0.006556 
+-0.016301 0.011780 -0.011684 -0.013761 0.026137 -0.011111 
+0.006020 0.021172 -0.011313 0.027148 0.022594 0.027206 
+-0.062605 -0.010252 0.007479 -0.014052 -0.069978 0.008095 
+-0.002200 -0.005266 0.000678 0.003516 0.011905 -0.003920 
+0.004095 0.011481 -0.002845 -0.000366 0.003160 -0.000730 
+-0.004032 -0.007762 -0.000864 -0.000277 -0.008393 -0.001086 
+0.000917 0.000573 0.000695 -0.000390 0.004546 0.001972 
+-0.023815 -0.014585 0.001958 -0.015697 -0.006596 0.002583 
+-0.008381 0.004715 -0.001991 -0.009336 0.001791 -0.000228 
+-0.008850 -0.004623 -0.000688 -0.004338 0.003459 -0.000979 
+-0.008261 0.009316 -0.004051 -0.015581 -0.001471 -0.002144 
+-0.001609 -0.002229 -0.003466 0.001026 -0.000092 -0.006167 
+0.027985 0.006582 -0.002889 0.025217 0.024757 -0.008651 
+-0.004917 -0.011361 0.000714 -0.049744 -0.064744 0.018077 
+-0.024544 -0.037383 0.015860 0.015753 0.024096 -0.011965 
+0.005556 0.016667 -0.010000 0.010533 0.003641 -0.000704 
+0.009189 -0.002172 0.007828 0.000376 -0.009048 0.012062 
+0.006635 -0.012500 -0.004423 -0.009128 0.001903 0.000311 
+0.003135 0.064822 -0.024047 0.012998 0.036378 -0.020496 
+0.015694 0.023280 -0.010356 0.009488 0.011512 -0.001315 
+0.004714 0.005000 -0.000571 0.002722 0.006663 -0.002584 
+0.006811 0.002713 -0.003059 0.002797 -0.013636 0.000559 
+-0.014218 -0.003912 -0.001526 -0.031465 -0.009038 0.014631 
+-0.028604 -0.013592 0.017050 0.003142 0.001675 -0.021053 
+0.020989 0.014733 -0.033048 -0.005714 0.010179 -0.019107 
+0.038608 0.033782 -0.033782 0.002450 0.009219 -0.036016 
+0.007543 -0.010086 -0.015171 0.005398 -0.010066 -0.001876 
+0.001681 -0.005591 0.001738 0.001966 0.012411 -0.007288 
+-0.010704 0.023328 0.003064 -0.008955 0.009758 -0.028352 
+-0.012423 0.010680 -0.020919 -0.004992 0.014384 0.001530 
+0.003953 0.009276 0.001904 0.011053 0.013758 -0.006713 
+-0.005825 0.014821 -0.005975 0.012190 0.004156 0.028598 
+0.010305 -0.011692 0.018610 0.001824 -0.000952 0.001917 
+0.002663 -0.000879 0.001416 0.000089 -0.002211 -0.001514 
+-0.011232 -0.007997 0.010844 -0.001459 -0.011079 0.002380 
+0.001587 0.004068 -0.000169 0.008363 0.011472 -0.009727 
+0.001942 0.015067 -0.008487 0.017922 0.019968 -0.044987 
+0.111357 0.020857 -0.041786 0.121409 0.052645 -0.021950 
+0.014848 0.031212 -0.023030 -0.141000 -0.101434 0.009221 
+-0.053853 -0.049524 -0.038225 0.001358 -0.003801 -0.046975 
+0.034067 -0.006333 -0.032867 0.058889 0.036667 0.012222 
+0.054072 0.034609 -0.000782 0.007036 -0.009447 0.009950 
+0.004481 0.005743 -0.000893 0.002251 0.000103 0.000777 
+-0.001256 -0.006476 0.001919 -0.003423 -0.008784 0.001124 
+-0.002682 -0.004278 0.000279 -0.000997 0.001049 -0.000589 
+-0.021160 -0.005024 -0.001655 -0.009105 0.003585 -0.019413 
+-0.004497 0.011961 0.009252 -0.007195 0.045515 0.011514 
+-0.001065 0.048033 0.003040 -0.002475 0.031162 -0.007172 
+-0.019504 0.014393 -0.004419 -0.034397 -0.011402 -0.015072 
+0.001301 -0.003333 0.002818 0.008281 0.006031 0.013681 
+0.018611 0.009583 -0.000605 0.021598 0.011159 -0.004708 
+0.003885 0.008274 0.000544 -0.026813 0.003631 0.012740 
+-0.010854 0.015722 0.007342 0.020144 0.042779 0.009567 
+0.008817 0.021795 -0.015800 0.006581 0.010904 -0.003384 
+0.005476 -0.002557 0.009963 -0.033142 -0.025172 0.021379 
+-0.065745 -0.006056 -0.001731 -0.016739 0.000895 -0.023721 
+0.009180 -0.004947 -0.014868 0.021137 -0.001400 0.002575 
+0.023913 0.010831 0.017020 0.015118 -0.002202 0.009897 
+0.003651 -0.000964 0.006349 0.002907 0.001091 0.000206 
+0.007659 -0.000549 0.004058 0.015888 -0.000981 0.005069 
+0.020866 0.004399 0.003866 0.024121 0.006350 -0.000369 
+0.023709 0.007348 -0.012710 0.008108 0.009462 -0.004015 
+0.004568 -0.003438 0.025430 -0.025084 0.006036 0.047378 
+0.028121 0.004217 0.028261 -0.006169 0.005850 -0.006314 
+0.002707 0.004233 0.002111 0.002042 0.029793 0.000763 
+0.010837 0.062588 -0.008982 0.017688 0.062042 0.005453 
+-0.002783 0.020755 0.004943 0.002318 0.004676 0.004990 
+0.021693 0.015450 0.009312 0.031663 0.015542 0.004175 
+0.015592 0.000262 0.003320 -0.002029 -0.010501 0.005070 
+-0.030791 -0.049564 0.066766 0.010992 -0.007603 0.003058 
+-0.006288 0.003033 -0.004995 -0.006513 -0.002074 -0.007761 
+-0.005076 -0.000988 -0.004505 0.000881 -0.000815 -0.001067 
+0.000413 -0.001365 0.004196 0.003137 -0.005054 0.006853 
+0.014100 0.004797 -0.012248 0.012384 0.007918 -0.015200 
+0.001476 -0.023301 0.012004 0.005000 0.011294 -0.002824 
+-0.003187 0.011752 -0.081265 0.064470 0.027496 -0.039547 
+-0.009000 -0.075000 -0.075000 -0.014925 -0.012878 -0.112239 
+-0.018275 -0.015871 -0.041199 0.012390 -0.014207 -0.026955 
+0.030727 0.036909 -0.038182 0.012117 0.047800 -0.009292 
+0.036619 0.082896 -0.035615 -0.034943 -0.070642 -0.000981 
+-0.012974 -0.057241 0.021210 -0.004993 -0.024045 0.010832 
+-0.005681 -0.012189 0.004240 -0.008247 -0.004798 0.000219 
+-0.005332 -0.000353 -0.000564 0.003265 0.003929 -0.001529 
+-0.005288 0.000363 -0.002129 -0.003848 0.006396 -0.009674 
+0.001549 0.006607 -0.014165 0.004204 0.004072 -0.000086 
+0.007671 0.021231 -0.004947 0.007794 0.020326 -0.005745 
+-0.040784 -0.015342 -0.007506 -0.005159 -0.002631 -0.011002 
+-0.001288 -0.007209 0.026011 0.004190 -0.003810 0.019048 
+0.032324 0.003333 -0.009946 0.039443 0.011273 -0.016904 
+0.036444 0.020192 -0.007880 0.031839 0.027092 0.003724 
+0.044276 0.050966 -0.035517 0.049120 0.022238 -0.042153 
+0.009900 -0.002699 -0.013505 0.007380 -0.004439 0.001509 
+-0.000989 -0.004550 0.012633 -0.021134 -0.003840 0.007622 
+-0.030940 -0.002883 0.004148 -0.016607 0.003034 0.007179 
+-0.000101 -0.004208 0.012739 0.005135 -0.001424 0.007121 
+0.008254 0.003762 0.002154 0.011190 0.010995 0.006901 
+0.011948 0.024200 0.006433 0.028908 0.014879 0.009140 
+0.022193 0.013912 0.006735 0.013941 0.011948 0.002717 
+0.006550 0.009110 -0.000254 -0.001165 0.007479 -0.002252 
+-0.007286 0.003902 0.002833 0.001730 0.004519 0.001973 
+0.042022 0.044823 -0.030000 0.073953 0.030569 -0.045381 
+-0.009693 0.002836 -0.024125 -0.010581 0.043970 0.003105 
+0.016011 0.027339 0.000335 0.028123 0.022308 -0.013321 
+0.045428 0.024520 -0.012225 0.030478 0.015742 0.008038 
+0.017074 0.008561 0.008541 0.013797 0.002077 0.003123 
+0.002486 -0.009257 -0.001615 -0.005241 -0.011111 0.000437 
+0.005926 -0.005556 0.001852 -0.000523 -0.020813 0.011787 
+0.040928 0.001388 -0.026297 0.000007 0.024710 0.009674 
+-0.014682 0.008755 -0.017064 -0.008985 -0.002600 -0.014130 
+-0.009513 -0.005622 -0.013021 0.001650 0.004988 -0.003696 
+-0.000170 -0.000932 -0.005715 0.002506 -0.009231 0.009488 
+0.007285 0.010896 -0.023479 0.038971 0.026723 0.003258 
+0.018139 0.005844 0.028615 0.007627 0.007033 -0.017166 
+-0.006364 -0.021914 -0.025567 0.016003 0.002257 -0.013997 
+0.015934 0.003516 0.001429 0.007691 0.004837 0.007102 
+-0.001377 -0.003172 -0.001766 0.013441 -0.003846 -0.003666 
+-0.010060 -0.007127 -0.073149 -0.026055 -0.012595 -0.022017 
+0.017826 0.002391 0.000652 0.010339 -0.006017 -0.004056 
+0.018182 -0.056001 0.016391 -0.009246 -0.027941 0.012339 
+-0.022710 -0.017458 0.002053 -0.015937 0.000070 -0.003721 
+-0.011866 0.007271 -0.003816 -0.008360 0.006034 -0.002398 
+0.001139 0.004123 -0.002095 0.005117 0.008247 -0.003380 
+0.007874 0.011685 -0.004349 0.003076 0.005452 -0.002067 
+-0.001564 -0.008436 0.005840 -0.005745 -0.001642 0.015000 
+-0.005255 0.004083 0.006760 -0.006325 0.005632 -0.004547 
+-0.001384 -0.004021 -0.003525 -0.004660 -0.006269 0.004727 
+0.003577 0.000141 -0.000364 0.012673 0.015812 0.001121 
+0.034196 0.031794 -0.007746 0.023133 0.055417 -0.041639 
+0.049737 0.031211 -0.047789 0.015350 0.043182 0.013303 
+-0.006386 0.008668 -0.001367 0.007161 -0.005860 -0.020846 
+0.017727 0.000000 -0.014545 -0.000581 -0.001316 -0.001268 
+-0.014146 -0.003174 -0.001428 -0.014898 0.001420 -0.002601 
+-0.003704 0.000741 -0.004593 0.000569 -0.003945 0.001499 
+-0.002914 -0.002259 0.003092 -0.005453 -0.002832 0.005539 
+-0.007651 -0.001407 0.007630 0.002745 0.002195 -0.000227 
+-0.001337 -0.006497 -0.008503 0.018644 0.011069 -0.033648 
+0.007323 0.007902 -0.007017 -0.000719 -0.011016 0.010148 
+-0.002541 -0.021549 0.010912 0.001218 -0.009202 -0.000536 
+0.021005 0.009620 -0.007828 0.033735 0.022180 -0.024496 
+0.017884 0.051323 -0.043545 0.031366 0.047786 -0.036024 
+0.009795 0.021871 -0.003450 -0.019307 -0.004987 0.001867 
+-0.040378 -0.009721 0.013957 0.005714 0.000226 0.003308 
+0.002055 0.007475 0.007118 0.014914 0.023806 0.007684 
+0.006897 0.009165 -0.000655 0.001143 -0.005785 0.000647 
+0.013521 0.000317 -0.001812 0.028836 0.019687 -0.016833 
+0.092268 0.023629 -0.002383 -0.004456 0.003044 -0.033877 
+-0.002866 0.004163 0.001207 0.000047 -0.001408 0.004456 
+-0.004738 -0.004718 0.002199 -0.002936 0.000009 -0.001115 
+-0.000513 0.000435 -0.000117 0.000645 0.003720 0.002229 
+0.003333 0.003623 -0.001159 0.000542 -0.004243 -0.001099 
+-0.008750 -0.008125 -0.004375 -0.020435 0.001800 -0.014286 
+-0.012470 0.016626 -0.020000 -0.012537 0.003805 0.005213 
+-0.013229 -0.003748 -0.000890 0.022026 -0.045885 -0.000949 
+0.017334 -0.033337 0.021410 0.027036 0.012322 -0.049920 
+0.017705 0.018164 -0.107453 0.036941 -0.010018 -0.028175 
+0.015341 0.028072 0.022332 0.000486 0.033869 0.019981 
+-0.030532 0.039776 0.044155 -0.243098 0.066196 -0.015645 
+-0.003997 0.018070 -0.006507 0.012648 0.019254 0.000012 
+0.008274 0.021923 -0.002592 -0.003778 0.017084 -0.002932 
+-0.001703 0.001252 0.000522 0.001012 0.004232 -0.000681 
+0.002661 0.008650 -0.003311 0.004259 0.006107 -0.001058 
+0.004485 -0.008982 0.007731 -0.002598 -0.017494 0.004341 
+-0.002565 -0.005649 -0.001234 0.016946 0.007551 -0.002278 
+0.015110 0.014935 -0.002084 -0.000199 -0.007278 0.001179 
+-0.008999 -0.011532 -0.007171 -0.013056 -0.001503 -0.000137 
+0.000631 0.020000 -0.000450 -0.000838 0.037577 -0.001723 
+-0.018161 0.032811 0.014286 -0.015475 0.020988 -0.005339 
+-0.003083 0.010615 -0.006153 0.005969 0.013805 -0.017285 
+0.015867 0.008428 -0.024460 0.010827 0.006539 -0.015373 
+-0.000877 -0.005320 0.001390 -0.013514 -0.009967 -0.000906 
+-0.012140 -0.006051 -0.003474 0.000778 0.003819 -0.002931 
+0.007819 0.006740 -0.000988 0.002644 -0.001565 -0.000593 
+-0.006887 -0.009660 -0.001431 -0.011995 -0.014576 -0.004195 
+-0.000329 -0.006006 -0.007440 0.016090 -0.002568 -0.005713 
+0.014455 0.006317 -0.006251 0.003913 0.004349 -0.001686 
+-0.003153 -0.010421 0.002622 -0.004198 -0.020535 0.003164 
+-0.013050 -0.022000 0.006960 0.000102 -0.021740 -0.001821 
+0.016894 -0.010625 -0.014295 0.001117 0.015387 0.002722 
+-0.003554 0.018023 0.004596 -0.023130 0.018471 0.007423 
+-0.020009 0.004898 0.008291 0.006774 -0.004837 -0.006829 
+0.021562 -0.014400 -0.010800 0.025945 -0.012450 -0.008425 
+0.023987 -0.007762 -0.005732 0.017710 -0.004145 -0.000975 
+0.017367 0.004758 -0.001639 0.028435 0.009385 0.005448 
+0.014234 -0.012832 -0.004817 0.004881 -0.006025 -0.001945 
+-0.003509 0.002508 0.002326 -0.006727 0.007566 0.005296 
+-0.004742 0.003883 0.005910 -0.001923 0.001049 0.001997 
+-0.004505 0.000651 -0.003663 0.001391 0.000420 -0.004850 
+0.005565 -0.008621 -0.004845 -0.002970 0.000683 -0.006294 
+-0.027173 0.002736 -0.010142 -0.040563 -0.005029 -0.013465 
+-0.026409 -0.010303 0.008402 0.001389 -0.000694 0.000694 
+0.005967 -0.000099 -0.000776 0.026647 -0.007522 -0.009729 
+-0.004491 -0.014551 0.018875 0.028925 -0.001808 -0.025385 
+0.085369 0.038804 -0.141538 -0.002680 0.025556 -0.002977 
+-0.011126 -0.000158 -0.001680 -0.008591 0.003091 0.013142 
+0.021412 0.010749 -0.011427 -0.007500 -0.002323 -0.017032 
+-0.004322 0.000378 -0.002371 0.011453 0.024850 0.006789 
+0.020496 0.015786 0.002419 0.003456 -0.000072 -0.000098 
+0.001175 0.002262 0.003052 -0.001744 0.004991 0.001949 
+-0.003069 0.004232 -0.001543 -0.001437 0.001439 -0.001605 
+0.000004 -0.004980 0.001920 -0.000914 -0.021691 -0.003777 
+-0.003236 -0.020879 -0.023085 0.021481 0.002004 -0.008017 
+0.012242 0.013663 0.011295 0.020187 0.020727 0.003551 
+0.011087 0.003110 0.002313 0.003603 -0.004549 -0.007888 
+-0.002942 -0.004300 -0.003734 -0.003199 -0.003789 -0.000839 
+-0.019205 0.023226 0.000554 -0.015239 0.019291 0.000705 
+-0.011122 0.011978 0.004991 -0.002606 0.004031 0.004936 
+0.004696 -0.000297 -0.009302 0.010039 0.008183 -0.001389 
+0.001982 -0.012219 -0.003617 0.008284 -0.009012 -0.002865 
+0.002876 0.001961 0.001085 -0.004833 0.008201 0.002636 
+-0.004878 0.006001 -0.001044 -0.002035 0.001190 -0.000521 
+-0.001578 -0.003025 0.001700 -0.002208 -0.008895 0.002987 
+-0.007615 -0.020323 0.002992 -0.013699 -0.033254 0.000560 
+-0.010792 -0.037642 -0.006571 -0.010707 -0.031579 -0.009048 
+-0.014116 -0.003853 -0.006844 -0.005023 0.017836 -0.007034 
+0.004245 0.012964 -0.006449 0.000240 0.003265 0.000052 
+-0.001836 0.007683 0.012860 -0.005579 0.009724 0.027655 
+-0.002482 0.019175 0.018119 -0.006422 0.021152 0.007100 
+-0.004839 0.009476 0.005040 0.004102 -0.001903 -0.002197 
+0.004811 -0.016817 -0.002506 0.002203 -0.031647 0.005790 
+-0.011159 -0.039768 0.001068 0.005119 -0.003202 -0.000968 
+0.001042 -0.004630 0.006916 0.005135 -0.001844 0.004896 
+0.012672 -0.000494 0.007268 0.009396 0.004985 0.002302 
+0.002000 -0.000226 -0.000614 -0.012980 0.004022 -0.005197 
+-0.020056 0.016362 -0.015306 -0.007110 0.004174 -0.010961 
+0.024381 -0.005474 -0.004816 0.023500 -0.003182 -0.006864 
+-0.000167 0.002333 -0.005667 -0.014353 0.008922 0.015323 
+0.003311 -0.017500 0.019865 -0.036545 -0.041455 0.001636 
+-0.005782 -0.018784 -0.003615 -0.006934 0.014476 -0.011742 
+-0.002682 0.022180 -0.019073 0.017875 0.041443 -0.107801 
+-0.038750 0.005000 -0.075000 -0.024014 -0.193672 0.123778 
+0.125952 -0.079405 -0.013690 0.011160 -0.003822 0.015885 
+0.005544 -0.031781 0.011720 0.010730 -0.018347 0.004716 
+0.023509 -0.004954 -0.000074 0.013875 -0.005685 -0.012898 
+0.017909 -0.010000 -0.027364 0.001895 -0.014313 0.000105 
+0.021732 -0.005984 0.008553 0.000874 -0.020057 0.008623 
+0.003134 0.003095 0.003018 0.001566 0.002070 -0.000055 
+0.004048 0.000280 0.001230 0.002072 0.004445 0.001069 
+0.002115 0.013955 -0.002146 0.004500 0.025908 -0.004510 
+0.018271 0.004661 -0.001197 0.013487 -0.001073 -0.001533 
+0.011114 -0.001775 0.005163 -0.002816 0.013692 0.014664 
+0.001976 0.006361 -0.008625 0.007010 0.003128 -0.004071 
+0.015027 0.009532 -0.002083 0.021624 0.017916 -0.009105 
+0.012103 0.004213 -0.023248 0.002577 0.009591 -0.014460 
+-0.008315 0.003149 -0.009823 -0.005097 0.006338 -0.006251 
+0.012581 -0.002713 -0.010854 -0.000588 -0.006566 -0.015189 
+0.001392 -0.002498 -0.000448 0.011068 0.004451 0.000306 
+0.012500 0.004545 -0.004545 0.006744 0.002093 -0.004419 
+0.005786 0.005860 -0.003872 0.013068 0.000846 -0.004488 
+0.016923 -0.012495 0.002610 0.006481 -0.027960 0.012904 
+-0.001391 -0.018355 0.003423 0.000245 0.004284 0.001007 
+0.006250 0.003980 0.001751 0.007240 -0.000251 -0.000824 
+-0.001333 0.005333 0.000000 -0.003871 0.006968 -0.003484 
+-0.003103 0.004545 -0.001721 -0.006876 -0.001341 0.001242 
+-0.012222 -0.000285 -0.000032 -0.007336 0.011446 0.001101 
+0.002815 0.011181 0.008063 0.004279 -0.000088 0.005765 
+-0.003586 -0.000734 0.002731 -0.000105 0.004974 -0.008173 
+0.006802 0.013899 -0.013074 0.002563 0.009615 -0.000488 
+-0.008714 -0.003452 -0.007708 0.000379 -0.002161 0.004414 
+0.005806 -0.003126 0.006878 0.002400 -0.013000 -0.000800 
+-0.013594 -0.027968 0.011802 -0.021046 -0.023511 0.012316 
+-0.007100 -0.005488 0.002261 0.007295 0.008485 -0.002415 
+0.014829 0.003143 0.001195 0.019361 0.022669 -0.017030 
+0.000362 0.029011 -0.007135 0.016441 0.016136 -0.030447 
+0.026304 0.011565 0.013394 -0.005000 -0.003611 -0.006944 
+0.001976 -0.002360 -0.029083 0.017346 0.004731 -0.026500 
+0.028618 0.008103 -0.007873 0.014040 0.024354 -0.007865 
+-0.016500 0.010633 -0.001100 -0.022000 0.020029 0.033382 
+-0.013648 -0.003323 0.008203 -0.019084 -0.000667 0.009660 
+-0.018182 -0.001641 0.005106 -0.016414 -0.011791 -0.009690 
+-0.027037 -0.023508 0.010109 0.002087 -0.026812 0.017594 
+0.022427 0.003716 0.014597 0.004224 -0.019280 0.013466 
+-0.008750 0.001058 0.005288 -0.010062 -0.050031 0.023385 
+0.008576 -0.006301 0.013274 0.032567 -0.007152 -0.002152 
+-0.000432 -0.002512 -0.002380 0.001572 -0.001347 -0.003239 
+0.007781 0.001126 -0.000388 0.004838 0.008514 0.003233 
+0.004723 0.012193 -0.000578 -0.001714 0.007336 -0.004952 
+-0.016347 -0.002706 -0.002625 -0.010855 0.000195 -0.000458 
+-0.014838 0.001923 0.000375 -0.006831 0.005539 0.002882 
+0.001567 0.005900 -0.002599 0.003676 0.010691 -0.002035 
+0.008870 0.014451 0.001271 0.003273 0.013987 -0.002046 
+0.002312 0.008350 -0.016377 0.007987 -0.000306 -0.017513 
+-0.009746 0.014443 -0.016303 -0.013843 0.011353 -0.003481 
+-0.003929 -0.001643 -0.003277 -0.000874 -0.000274 -0.001151 
+-0.005166 0.003475 -0.000851 -0.004658 0.004106 0.001644 
+0.004627 0.004876 -0.001732 0.012926 0.006506 -0.005192 
+0.009183 0.004490 -0.010126 0.004592 0.007267 -0.008161 
+0.003687 -0.003548 -0.000557 0.017808 -0.022889 0.002120 
+0.031879 -0.022064 0.014807 0.017410 -0.001067 0.009850 
+0.003577 0.010416 -0.002539 -0.001579 0.008120 -0.000733 
+-0.009904 -0.008402 0.005737 -0.014603 -0.023333 0.005154 
+-0.009688 -0.016364 0.001816 -0.010747 -0.001429 -0.000566 
+-0.009959 0.000875 -0.002754 -0.003352 -0.002308 -0.001832 
+-0.002427 -0.002650 -0.001671 -0.008320 -0.001140 0.000798 
+-0.001909 0.009168 -0.002580 0.006998 0.015820 -0.013553 
+0.011015 0.005235 -0.000304 -0.001100 -0.004063 -0.002065 
+-0.004662 0.001900 -0.001973 -0.009129 0.003363 -0.001201 
+-0.009654 -0.006304 0.000767 -0.008806 -0.007419 0.004579 
+-0.022109 -0.010668 0.010946 -0.027851 -0.003865 -0.001014 
+-0.008881 -0.009126 -0.015804 -0.001873 -0.004323 -0.004610 
+0.010449 0.000449 0.004844 0.014070 0.011550 -0.012768 
+0.011843 0.003989 -0.015359 0.001307 -0.010143 -0.015437 
+0.000257 -0.006008 -0.017613 0.000714 0.002418 -0.003626 
+0.002452 -0.003626 0.005920 0.004390 -0.003841 0.000274 
+0.006203 0.003170 -0.003293 -0.005400 0.006275 0.004433 
+-0.012143 0.016369 0.032679 -0.011393 0.000712 0.120000 
+-0.027094 0.005852 0.041293 -0.001802 0.020933 -0.010801 
+-0.002429 0.012239 -0.009103 0.003913 0.010501 -0.010100 
+0.000408 0.008333 -0.001734 -0.012851 -0.017149 0.012895 
+-0.006405 -0.003045 0.015294 0.005719 -0.009811 0.009861 
+-0.036081 -0.019607 -0.017333 -0.036388 -0.038132 0.020645 
+-0.004289 -0.023750 0.011438 0.005759 -0.022455 0.002589 
+0.003486 -0.001360 -0.002140 0.000441 -0.001276 -0.001149 
+-0.000419 0.001040 0.000919 0.001129 0.006538 0.000268 
+0.004936 0.008474 -0.001706 0.004063 0.008145 -0.004021 
+0.003129 0.009100 -0.005687 0.006645 0.013525 -0.007916 
+0.009300 0.017223 -0.012466 0.010715 0.013279 -0.011616 
+0.006359 0.000910 -0.001652 0.000037 0.000988 0.000715 
+0.003763 -0.001217 0.000467 0.011185 -0.006760 0.004282 
+0.010430 -0.013578 0.011132 0.004377 -0.010390 0.008397 
+-0.013967 -0.010160 0.000332 -0.017399 -0.009687 -0.008030 
+-0.008851 -0.000542 -0.005735 -0.003201 0.001804 -0.001314 
+-0.003272 -0.000753 -0.000317 -0.004040 -0.000122 0.001267 
+0.007304 0.009544 -0.004220 0.022559 0.020128 -0.016385 
+0.022445 0.017613 -0.023095 0.011850 0.005485 -0.005214 
+0.012949 -0.005166 0.003074 0.025071 0.002251 0.003744 
+0.030848 0.005615 0.002665 0.016613 -0.000898 0.000973 
+-0.009286 -0.011065 0.001475 -0.022670 -0.014796 -0.003725 
+-0.022683 -0.012186 -0.008463 -0.023304 -0.013839 -0.008608 
+-0.020181 -0.014773 -0.006921 -0.005145 -0.007203 -0.004766 
+0.009558 0.000754 0.002252 0.009619 0.002106 0.004858 
+0.002489 0.005007 0.002498 -0.001250 0.012491 0.003945 
+0.008533 0.019389 0.006388 0.015932 0.020705 0.006699 
+0.010774 0.011308 0.004781 0.001637 0.008108 0.001805 
+-0.003441 0.009459 -0.001087 -0.010392 0.003500 -0.000547 
+-0.014939 -0.003158 0.005533 -0.011228 -0.002791 0.006273 
+-0.007759 0.006107 0.001313 0.005645 -0.008380 0.016120 
+0.005423 -0.009814 0.000782 -0.001026 0.000443 0.002774 
+-0.002271 0.002669 0.007890 -0.003525 0.006682 0.010453 
+-0.012658 0.001157 0.012349 -0.014690 -0.006635 0.001589 
+0.012020 0.001177 -0.007811 0.017131 0.000693 -0.037402 
+0.022527 -0.015330 -0.019505 -0.005556 -0.045979 0.041381 
+0.012676 -0.023990 0.021523 0.008247 -0.001187 0.012949 
+0.006123 0.000988 0.005531 -0.008330 0.000410 0.002900 
+-0.010511 0.002006 0.004265 -0.001243 0.010820 -0.003545 
+0.011012 0.003197 0.009324 0.004646 0.009235 0.016193 
+0.004815 0.004528 0.004774 0.002094 0.004872 -0.015674 
+-0.002336 0.000210 -0.009283 -0.015134 -0.007412 -0.013233 
+-0.021604 -0.018177 -0.009312 -0.005511 -0.014395 -0.008754 
+0.013303 0.001210 -0.001978 0.024718 -0.012365 0.016985 
+0.004699 0.001056 -0.001188 -0.002691 0.002040 0.002463 
+-0.008877 -0.000984 0.007369 -0.008351 -0.001649 0.002990 
+0.000625 0.001977 -0.000605 0.005125 0.008250 -0.001404 
+0.003978 0.007413 -0.000059 0.000895 0.003857 0.000228 
+0.002283 0.003860 -0.000416 0.005482 0.003297 -0.000479 
+0.004055 0.005791 -0.000253 -0.003472 0.013054 0.002697 
+0.002230 0.003542 0.007843 0.033276 -0.027821 0.076575 
+-0.010202 -0.048680 0.022640 -0.014128 -0.027566 0.010082 
+-0.018013 -0.024845 0.003298 -0.012447 -0.019159 0.003836 
+-0.002471 -0.003487 0.001643 0.007161 0.011264 -0.010636 
+0.014876 0.012053 -0.015699 0.012434 0.013377 -0.013053 
+0.006645 0.008037 -0.006158 0.008011 0.000458 -0.004316 
+0.014165 -0.005072 -0.001567 0.009386 -0.017187 0.004690 
+0.012154 -0.013913 0.007596 0.010961 -0.004117 0.005390 
+0.010380 0.006238 0.002670 0.003398 0.008236 0.002737 
+-0.003200 0.006004 0.001729 -0.004966 0.002915 0.000837 
+-0.002703 0.003136 0.001437 -0.002756 0.006856 0.002744 
+-0.009640 0.002410 0.001205 -0.008822 -0.007359 -0.003923 
+-0.001530 -0.008889 -0.003587 -0.001146 -0.004370 -0.001468 
+-0.002549 0.000784 -0.000252 -0.003205 0.005268 0.000969 
+-0.003010 0.005610 0.002311 -0.002152 0.004984 0.003472 
+-0.001832 0.012366 0.002691 -0.008709 0.018831 -0.013161 
+0.002169 0.017236 -0.017768 0.002387 0.014001 -0.010405 
+-0.003499 0.001368 0.001108 0.001771 -0.009446 0.004318 
+-0.022435 -0.002461 0.021738 0.011949 -0.023510 -0.000608 
+0.010996 -0.015210 -0.005681 0.005579 -0.002527 -0.009490 
+-0.003577 0.009919 -0.000650 -0.006736 0.003733 0.000711 
+-0.007837 0.009963 -0.007897 -0.005958 0.003133 0.000643 
+-0.001894 -0.004231 0.000826 0.007649 0.007282 -0.001257 
+0.004261 0.008113 0.003889 -0.000077 -0.012912 -0.020268 
+0.005718 -0.039761 -0.012919 0.002138 -0.009506 0.009556 
+0.003405 -0.003728 0.004418 -0.007677 -0.006566 0.000101 
+-0.002188 -0.002907 0.000389 0.004872 0.015513 -0.001667 
+-0.002088 0.021209 0.003736 -0.024011 -0.010481 -0.013797 
+0.004151 -0.011609 -0.000832 0.001381 -0.013814 0.077619 
+0.011460 -0.005773 0.012614 -0.000278 -0.003611 -0.000278 
+-0.002794 -0.006418 -0.002297 0.002969 -0.005543 -0.006292 
+0.002184 -0.002866 -0.005426 0.014444 -0.009845 0.000856 
+-0.004898 -0.000403 0.000833 -0.008716 0.003259 0.005727 
+-0.012828 0.000425 0.010517 -0.014085 -0.002284 0.007097 
+-0.005249 -0.002422 -0.003290 -0.004293 -0.002150 -0.004908 
+-0.004124 -0.000859 -0.004084 0.009072 -0.001092 0.000440 
+0.007058 -0.001548 -0.002192 -0.000195 -0.002015 0.000423 
+0.000431 0.004962 -0.000788 -0.000248 0.025878 0.000145 
+-0.007594 0.047632 0.009484 -0.027643 -0.040540 -0.027317 
+-0.032343 0.003409 0.000060 -0.011395 0.017126 0.004435 
+0.001229 -0.011388 0.000718 -0.012738 -0.052096 0.033225 
+-0.018872 0.014147 -0.035528 -0.001582 0.005719 -0.017961 
+0.009993 0.012978 -0.049109 0.031860 0.019432 -0.030322 
+0.008891 0.007320 -0.010643 -0.001245 -0.024969 0.011063 
+-0.010536 -0.064423 0.033852 0.015577 -0.044939 0.019113 
+0.012727 -0.015091 0.004691 0.019872 0.009487 0.000128 
+0.019695 0.010526 0.002123 0.007535 -0.011509 0.011385 
+0.008413 -0.022842 0.008195 0.011442 -0.012250 0.002145 
+0.018508 0.002492 -0.000843 0.016767 0.010335 -0.002320 
+0.005420 0.005556 -0.001291 -0.011298 -0.012941 0.001255 
+-0.009550 -0.024718 0.005402 0.004262 -0.012002 0.011230 
+0.009384 0.002239 0.006105 0.005883 0.008203 0.001460 
+0.000612 0.005557 -0.000505 -0.003065 0.001074 0.003026 
+-0.001459 0.002121 0.000613 -0.003520 0.004507 0.004677 
+-0.006676 -0.018630 0.020741 0.014141 0.001293 0.001794 
+0.004892 0.008660 -0.015506 -0.001041 0.003200 -0.010011 
+-0.030068 -0.043967 -0.037471 0.000476 -0.018437 -0.017425 
+0.002918 -0.010446 -0.005824 0.007094 0.005491 -0.016362 
+-0.003077 0.003336 -0.018183 -0.006284 0.011961 -0.030885 
+0.013017 0.026517 -0.038088 0.015266 0.016152 -0.002923 
+0.002642 -0.021968 0.015702 -0.012749 -0.039727 0.043977 
+0.000764 -0.041971 0.060281 -0.019340 -0.011186 0.012580 
+-0.000211 -0.009956 -0.022242 -0.017059 -0.023529 0.001176 
+-0.021840 -0.017479 0.021892 -0.008451 -0.008006 0.018010 
+-0.006933 0.004333 0.016467 0.001903 -0.002039 0.005890 
+0.003899 0.002464 -0.012818 0.040657 -0.001657 -0.049366 
+0.052508 0.001077 -0.006886 0.056942 -0.037343 0.054261 
+-0.000912 -0.042610 0.034520 -0.014663 -0.034944 0.015913 
+-0.012757 -0.007025 0.001026 -0.001143 0.001735 0.000108 
+0.003777 -0.008449 -0.001988 -0.007248 -0.018744 0.002075 
+-0.001305 0.003776 0.000043 0.002553 0.006564 0.000365 
+-0.001294 0.004969 0.002122 -0.005864 0.001298 0.003074 
+-0.004000 0.001412 -0.000588 -0.000978 -0.000502 -0.000840 
+0.010231 0.007295 0.002332 0.022962 0.010463 -0.004269 
+0.013062 0.005776 -0.003745 -0.002125 0.004236 0.000728 
+-0.007334 0.006102 -0.002768 -0.006656 0.007038 -0.005693 
+-0.004698 0.022038 -0.007276 -0.008267 0.010556 -0.009539 
+-0.038535 0.016868 -0.002052 -0.010874 0.019680 0.007839 
+0.045240 0.014348 0.013616 0.042944 0.005159 0.024571 
+0.031547 0.069702 -0.004746 -0.000088 0.100526 0.033421 
+0.278647 0.188402 -0.102030 0.098391 0.045828 -0.044733 
+0.067745 0.009984 -0.011522 -0.001136 0.004084 -0.000729 
+0.006897 0.021429 -0.002956 -0.024062 0.004228 -0.037915 
+0.013457 -0.025974 0.031808 0.013890 -0.010268 0.005828 
+0.018638 0.008180 0.003268 0.009724 0.010118 0.010841 
+0.006743 -0.001120 0.008830 -0.000724 -0.015621 0.003326 
+-0.005320 -0.022930 0.009095 -0.008547 -0.019976 0.012061 
+-0.002117 -0.005226 0.001651 0.010509 0.007429 -0.000420 
+0.016471 0.007008 0.001107 0.016125 0.001756 0.005013 
+0.009874 0.001147 0.008300 0.005799 0.009935 -0.000074 
+0.000828 0.014086 -0.010262 -0.003431 0.014100 -0.009715 
+-0.000250 0.007259 -0.002031 -0.003231 -0.003097 -0.004272 
+0.002731 -0.004527 -0.002227 -0.002049 -0.029544 0.015711 
+0.033721 -0.042123 0.000361 -0.019697 0.093712 -0.088788 
+-0.017466 0.011155 -0.053238 -0.000642 -0.002631 -0.006017 
+-0.003489 -0.006582 -0.001404 0.003278 -0.004008 -0.006656 
+0.000840 0.003845 -0.021420 0.040411 -0.020172 -0.025627 
+0.006012 -0.055014 0.018955 -0.020909 -0.030102 0.005898 
+-0.030587 -0.029368 0.046906 -0.057561 -0.040550 0.093892 
+-0.068201 -0.069751 0.083184 -0.007813 -0.031094 0.019336 
+-0.006145 -0.005915 -0.009361 -0.002770 -0.011185 -0.027056 
+-0.023689 -0.006475 -0.011924 0.004632 -0.000526 0.013895 
+-0.002857 -0.022637 0.020879 -0.002798 -0.008141 0.004253 
+0.017105 0.008863 -0.005309 0.033955 0.026937 -0.005722 
+0.034732 0.028792 -0.010663 0.035305 -0.001909 -0.023219 
+0.032955 0.022686 0.001991 0.020337 0.020572 -0.001022 
+0.004145 -0.002249 0.008064 0.000389 0.006494 0.000600 
+-0.006811 -0.003853 -0.000101 -0.013158 -0.004474 -0.002449 
+0.003713 -0.005296 0.001457 0.003789 -0.010579 0.000544 
+-0.000712 -0.006268 -0.000142 -0.004378 -0.000953 0.000328 
+-0.005773 0.002153 -0.000603 -0.000461 0.005927 -0.000261 
+0.009973 0.010064 -0.000502 0.015714 0.009649 0.000124 
+0.010209 0.002499 0.001146 -0.004350 -0.001862 -0.001416 
+-0.012985 -0.001643 -0.006838 -0.016000 0.004641 -0.013238 
+-0.004490 0.042486 -0.041382 0.003306 0.027463 -0.019325 
+-0.018214 -0.013197 -0.001933 -0.001756 0.002776 0.001617 
+-0.002381 -0.024071 0.033047 0.003821 -0.024127 0.015932 
+0.022763 -0.001655 0.009840 0.060566 0.034399 -0.050200 
+0.054259 0.025035 -0.087573 0.023160 0.127400 -0.062120 
+0.084678 0.041984 -0.008633 0.021995 0.039104 0.022240 
+0.009956 0.061711 -0.041404 -0.077273 0.006573 0.009860 
+-0.004069 -0.003215 0.003755 0.003134 -0.020634 0.017430 
+-0.006445 -0.020486 -0.006905 -0.007714 -0.001582 -0.006626 
+-0.004266 0.003741 0.002143 -0.007160 0.002124 0.003250 
+-0.006660 -0.017812 0.003700 0.016709 -0.009957 -0.000921 
+0.025136 0.009103 0.007766 0.024241 0.018824 0.008432 
+0.016541 0.010000 0.003676 0.008609 0.002230 0.001893 
+0.008984 0.001484 0.002908 0.017442 0.012759 0.001343 
+0.008563 0.019299 -0.014144 -0.007175 0.006099 0.001865 
+-0.006441 0.003671 0.001710 0.006150 -0.001214 0.000057 
+0.012980 -0.002524 -0.008069 0.017744 -0.026319 -0.001249 
+0.047977 0.020126 0.017920 -0.009388 0.004235 0.000561 
+-0.014983 0.008346 -0.009084 -0.011012 0.003892 -0.009549 
+-0.003992 0.005489 -0.011277 0.009009 -0.002597 -0.029260 
+-0.005821 -0.001085 0.010754 0.003750 -0.027846 -0.003481 
+0.002359 -0.038496 -0.002705 -0.064071 -0.030856 0.015575 
+-0.072359 -0.034472 0.028305 -0.076572 -0.000792 0.014918 
+0.001712 0.010856 0.010710 0.001504 -0.009333 0.006391 
+-0.013856 0.004484 -0.013089 -0.012068 0.002400 -0.000939 
+0.010436 0.000537 -0.002005 0.005904 0.004537 0.001759 
+-0.010990 -0.012539 0.004036 -0.006957 -0.013288 0.008305 
+-0.002358 0.002146 -0.000858 -0.000834 0.014800 0.000093 
+-0.007787 0.023385 0.005992 -0.015336 0.014280 0.023997 
+0.026177 0.006001 0.008926 0.021951 0.019280 0.023526 
+0.011062 0.012894 0.013960 0.003590 0.013333 0.007949 
+-0.002864 -0.001863 0.002392 -0.004870 -0.004248 -0.000322 
+-0.002727 -0.010246 0.001281 -0.004706 -0.013220 0.000621 
+-0.003282 -0.005665 -0.000149 0.001090 0.000192 -0.000109 
+0.003492 0.000117 -0.000116 0.002872 -0.000701 0.000581 
+0.000055 -0.000118 0.000029 -0.002353 0.001740 -0.000318 
+-0.002827 0.001316 -0.000089 -0.003480 -0.001423 -0.000125 
+-0.006110 0.001728 -0.002243 -0.008532 0.012033 -0.009210 
+-0.014204 0.028422 -0.019249 -0.014818 0.013726 -0.005085 
+-0.004882 -0.006141 0.027719 0.002291 -0.012875 0.013724 
+-0.015887 -0.020013 0.020544 -0.019692 -0.028386 0.007378 
+-0.006760 -0.018672 0.004019 0.004819 -0.007152 0.004685 
+-0.005492 -0.005758 0.000346 -0.012884 -0.008539 -0.013188 
+-0.000857 -0.008857 -0.002857 -0.005263 -0.015425 0.000121 
+-0.014343 -0.041010 0.006162 0.052834 -0.048182 0.013209 
+0.037000 0.008100 0.024300 0.022419 -0.014457 0.061950 
+0.010845 -0.036177 0.031706 0.010283 -0.012797 0.004313 
+0.012593 -0.003005 0.001129 0.016727 0.002439 -0.005107 
+0.015404 -0.000090 -0.010963 0.021517 -0.004339 -0.010830 
+0.020000 -0.002994 -0.006320 0.011085 -0.004437 -0.004288 
+-0.004557 -0.003830 0.000936 -0.002712 -0.001880 -0.000100 
+0.013637 -0.001667 0.002407 0.023386 -0.000884 -0.004930 
+0.015303 0.004852 -0.005680 0.010420 0.024395 0.001035 
+-0.005487 -0.000720 -0.001851 -0.002778 -0.004202 0.004638 
+0.017121 -0.010425 -0.051475 0.010307 -0.005438 0.019073 
+-0.010958 0.008870 0.005476 -0.009552 0.007756 0.003636 
+-0.012615 0.003854 0.000827 -0.012492 -0.005500 0.007495 
+-0.000410 0.012821 -0.009688 0.021831 0.035406 -0.046771 
+-0.004000 0.021951 0.027439 -0.056714 -0.020976 0.023929 
+-0.045417 -0.009944 0.020111 -0.033150 -0.032850 -0.000047 
+0.019804 -0.014954 0.006395 0.001445 0.020756 0.035076 
+-0.014540 -0.004200 0.020919 -0.008689 0.016920 0.007471 
+0.003260 0.006033 0.004410 0.008270 0.000727 0.004353 
+0.011082 -0.001240 -0.001848 0.008426 0.001418 -0.006321 
+0.000252 -0.003674 0.001492 0.015970 -0.004576 -0.000697 
+0.022277 0.014322 0.005753 0.013015 0.011250 -0.000723 
+-0.022273 0.008182 0.000000 -0.021383 -0.001366 -0.010984 
+-0.022615 -0.010695 -0.008949 -0.015118 -0.001764 0.000103 
+-0.009629 0.007503 -0.001847 -0.007410 -0.013103 0.005502 
+-0.019993 -0.009192 0.017232 0.001031 -0.008374 0.015841 
+0.000286 -0.004617 0.000192 -0.006659 -0.003245 0.000457 
+-0.005399 0.002293 0.000029 -0.000575 0.002165 -0.000264 
+0.000921 -0.004138 0.000147 0.000822 -0.009512 0.003039 
+-0.002474 -0.008403 0.001417 -0.006046 -0.001922 -0.001159 
+-0.005617 0.003478 0.000669 -0.002237 0.004984 0.000701 
+-0.001817 0.003921 -0.000765 -0.006429 0.000372 -0.004001 
+-0.015020 0.003110 -0.012843 -0.039942 0.042439 -0.037663 
+-0.023854 -0.062729 0.046526 -0.011728 -0.018325 0.038847 
+-0.018173 -0.011961 0.011617 0.004104 -0.012214 -0.001564 
+0.000331 -0.006859 -0.004855 -0.021546 -0.002985 -0.007442 
+-0.016848 -0.001004 -0.003143 0.000173 -0.013252 0.001645 
+-0.001796 -0.029505 0.018731 -0.018561 -0.022737 -0.007888 
+-0.041632 -0.032889 -0.010976 0.028086 -0.095311 -0.068421 
+-0.015370 0.020926 -0.018148 0.021461 0.089393 0.024300 
+0.024638 0.046869 0.020748 0.011343 0.017804 0.010851 
+0.012934 0.009844 0.006008 0.008355 0.002406 -0.001160 
+-0.005037 -0.003402 -0.000332 -0.007599 -0.002100 -0.000937 
+-0.002947 -0.000445 0.000424 0.000302 -0.002395 -0.001344 
+0.005555 -0.014969 -0.002546 -0.008089 -0.006835 -0.000397 
+-0.014761 -0.002345 -0.007680 -0.007667 -0.005585 -0.003415 
+-0.005772 -0.000855 0.002084 0.012214 0.018040 0.000357 
+0.009587 0.026429 -0.011279 -0.011354 -0.000869 -0.001981 
+0.008189 -0.001942 -0.022659 0.000349 -0.003589 0.016727 
+-0.002142 0.001953 0.004262 -0.001599 0.004598 0.000810 
+-0.003868 -0.005748 0.008417 -0.002585 -0.010509 0.019125 
+-0.001933 -0.005168 0.002522 0.011973 0.017790 0.019032 
+0.014878 0.000594 0.009828 -0.002457 -0.040147 -0.006830 
+-0.080000 -0.148889 0.000000 -0.016003 -0.033456 -0.011902 
+0.011725 0.001970 0.006981 0.012283 0.001540 0.012454 
+0.017662 0.000260 0.011688 0.019628 0.023871 0.001592 
+0.022156 0.035432 0.001818 0.023429 0.018049 -0.004270 
+0.010985 -0.001827 -0.004276 -0.013119 -0.011506 0.029961 
+-0.018116 -0.020514 0.014084 0.031713 0.015747 0.015828 
+0.033937 0.048564 0.006383 0.032295 0.043354 -0.023292 
+0.008776 0.016329 -0.014441 -0.001891 -0.006875 0.005955 
+0.005254 -0.001863 0.002897 -0.003451 0.005748 -0.005338 
+-0.009205 -0.007581 -0.002435 -0.021527 -0.013571 0.002340 
+-0.015670 -0.011725 0.007025 -0.003309 -0.014056 0.007639 
+0.003089 -0.008668 0.002527 -0.002032 -0.012577 0.004719 
+-0.003849 -0.012894 0.003178 -0.003668 -0.010618 0.000535 
+-0.003293 -0.006644 -0.000492 -0.002484 -0.003912 0.000640 
+-0.001344 -0.001553 0.000466 -0.000811 -0.001381 0.000425 
+-0.002573 -0.004856 0.000467 -0.008340 -0.004440 -0.000503 
+-0.009541 -0.001470 -0.002869 -0.010929 0.000274 -0.008388 
+-0.013994 0.012355 -0.010450 0.004759 0.002546 0.004285 
+0.006917 -0.002010 -0.037001 0.006681 -0.001659 0.016013 
+-0.008992 -0.014696 0.024550 0.003421 -0.021871 0.022308 
+-0.012563 -0.030061 0.021395 -0.052704 -0.021684 0.058878 
+-0.080439 -0.005351 0.021462 -0.029177 -0.021955 -0.010226 
+-0.010667 0.006359 0.031795 0.000487 0.010325 0.002948 
+-0.010669 0.016009 0.004150 -0.026050 0.005042 0.025210 
+0.002310 -0.086667 -0.023102 -0.027270 -0.004697 -0.001145 
+0.005516 0.049973 -0.044590 0.006191 0.022490 -0.003519 
+0.005895 0.006798 0.000741 0.006697 0.001136 0.000375 
+0.005823 0.004655 -0.001028 0.003677 0.011618 -0.001594 
+0.001601 0.007046 -0.001754 -0.003252 -0.005090 0.001232 
+-0.008339 -0.026208 -0.000773 -0.013358 -0.031733 -0.003907 
+-0.017439 -0.011434 -0.006530 -0.005142 -0.002147 -0.003568 
+-0.003386 -0.003261 0.001157 -0.004513 -0.008626 0.004396 
+-0.007875 -0.008390 -0.010690 0.006997 0.000385 0.007570 
+0.007475 0.001172 0.011320 0.006051 -0.002093 0.003593 
+0.002810 -0.004845 -0.000477 -0.002773 -0.005760 0.010394 
+-0.009141 -0.000847 0.024271 -0.008398 -0.003235 0.031468 
+0.005007 0.001248 0.001445 -0.001837 0.006922 0.004759 
+0.003228 0.024492 0.015579 -0.015831 -0.031427 0.063790 
+0.018350 0.000000 0.002294 0.011420 0.036883 0.020216 
+-0.011838 0.013805 0.002801 0.015775 0.015446 -0.001789 
+0.024895 0.000296 0.039117 0.035928 0.013793 0.015721 
+0.011645 0.015417 -0.007905 0.000375 0.012491 -0.012509 
+-0.000962 0.001222 -0.000496 -0.013814 -0.040816 0.009733 
+0.009690 -0.023707 -0.004586 0.029460 0.009340 0.001184 
+0.033286 0.011161 -0.027782 0.025902 0.012693 -0.033380 
+-0.014745 0.009314 -0.003333 -0.039200 0.070912 -0.045466 
+-0.015733 0.112473 -0.063388 0.009149 0.054746 0.001349 
+0.008812 0.011612 -0.015318 0.000880 -0.003192 0.001569 
+0.004189 -0.013997 0.007522 0.016146 -0.014138 0.004037 
+-0.002247 -0.000024 0.000367 0.002591 -0.001519 0.000298 
+0.006201 -0.003403 0.001653 0.008080 -0.004415 0.002150 
+0.007222 -0.003519 -0.000617 0.005861 -0.002439 -0.002230 
+0.000089 -0.002672 0.000468 -0.001479 -0.003962 0.000497 
+-0.001452 -0.002976 -0.000042 -0.005983 -0.004519 -0.002670 
+-0.008208 -0.005205 -0.007985 -0.007921 0.002235 -0.006393 
+0.049277 0.097725 -0.037523 0.016232 -0.001860 -0.016110 
+0.021730 0.025034 -0.056984 0.062819 0.108694 -0.248226 
+0.010310 0.047289 -0.102058 0.008658 0.002098 -0.028278 
+-0.011098 -0.010152 0.002208 0.005122 -0.025000 0.006402 
+-0.003985 -0.021453 -0.006354 -0.005846 -0.005928 0.004791 
+-0.007231 0.003476 0.008552 -0.029902 -0.004020 0.029098 
+-0.021696 0.022531 0.027538 0.010383 0.012526 0.026182 
+0.034781 0.106923 0.056842 -0.135849 0.025613 0.051840 
+0.018785 -0.078897 0.034615 -0.001227 -0.027109 0.015025 
+-0.009067 -0.017889 0.010656 -0.001605 0.003100 -0.003222 
+0.002877 0.013843 -0.011214 0.001161 0.009087 -0.007468 
+-0.002037 -0.004363 0.004545 -0.007632 -0.014039 0.010079 
+-0.008442 -0.014658 0.003694 -0.002426 -0.002274 -0.000469 
+0.002694 0.004731 0.001034 0.000626 -0.011601 0.006327 
+-0.008092 -0.011754 0.015119 -0.012950 -0.015234 0.009639 
+-0.003334 -0.012983 -0.002494 0.003734 -0.004169 -0.000767 
+0.002574 -0.002055 -0.000097 0.001504 -0.000046 -0.000381 
+-0.003636 -0.003864 0.005682 0.003129 -0.005523 0.000358 
+0.034275 0.024073 -0.040493 0.088889 0.065034 -0.011477 
+0.027114 0.057100 -0.027900 0.020369 0.004875 -0.018630 
+0.005356 -0.013808 0.015356 -0.033574 -0.008522 0.020329 
+0.014133 -0.003021 -0.007797 -0.003647 -0.017814 -0.019778 
+0.001852 -0.006172 -0.001818 0.002627 0.001376 0.007405 
+0.012071 0.013922 0.040156 0.108480 0.031725 0.024357 
+0.004853 -0.010385 0.013782 -0.036829 -0.005843 -0.018562 
+-0.027675 -0.004692 -0.013291 0.014159 -0.010060 -0.019896 
+0.031695 0.002158 -0.020609 0.006328 -0.000424 -0.022071 
+0.019797 0.010257 -0.041572 0.021105 -0.002645 -0.011076 
+0.000000 0.000000 0.035000 -0.087888 0.042974 -0.001293 
+-0.095863 0.054302 -0.085136 -0.006346 0.001034 -0.035268 
+0.014421 -0.001370 -0.024276 0.012687 0.011757 0.004187 
+0.008143 0.001071 -0.004071 0.005136 0.006073 -0.012811 
+-0.002178 -0.002558 0.001025 -0.000067 -0.000022 0.000025 
+0.005003 0.000436 0.000362 0.009576 0.003131 0.000871 
+0.007488 0.006328 -0.000849 0.002612 0.003072 -0.000711 
+-0.001527 -0.005525 0.000466 0.001397 -0.008339 -0.000111 
+0.003637 0.000847 0.001749 -0.007012 0.009540 -0.003330 
+-0.009861 0.009236 -0.010486 -0.026664 -0.002698 -0.033415 
+0.000192 -0.008086 -0.027690 0.015561 -0.009208 0.010740 
+0.023440 -0.009438 0.020666 0.022440 -0.009080 0.021022 
+0.016303 -0.001099 0.008662 0.002224 0.007995 -0.005793 
+-0.009753 -0.006778 -0.006514 0.009184 -0.025606 0.008999 
+0.033525 0.010064 -0.007503 0.019574 0.025244 0.000039 
+-0.019091 0.011591 0.011591 0.010341 -0.019609 0.023905 
+0.013585 -0.045282 0.007857 0.019197 -0.036410 -0.033436 
+-0.095169 0.035508 0.028814 -0.061961 0.018748 0.029204 
+0.000265 0.015333 -0.000295 0.049892 0.025699 -0.005554 
+0.025924 0.001080 0.002970 -0.009088 -0.006999 0.009071 
+-0.020616 -0.008424 0.006956 -0.013151 -0.007126 0.004731 
+0.001479 -0.013331 0.006295 -0.001046 -0.009251 0.005056 
+-0.002163 0.000181 -0.002025 0.003940 0.006679 0.000480 
+0.003125 0.006000 -0.001125 -0.006486 -0.004627 0.004353 
+-0.015920 -0.024423 0.019476 -0.010110 -0.028242 0.018654 
+0.000589 -0.015580 0.011713 0.000917 -0.010827 0.008276 
+-0.004223 -0.008199 0.009018 -0.012102 0.002437 0.003026 
+-0.002184 0.007730 -0.005261 0.033620 0.029785 0.001220 
+0.065091 -0.001082 -0.011062 0.056561 0.048481 -0.048636 
+0.005716 0.011219 0.004065 0.000952 -0.007460 0.027143 
+0.052763 0.014952 0.025160 0.021993 0.023449 -0.009607 
+-0.023329 -0.040974 0.000879 0.012024 -0.014881 -0.014395 
+0.029290 0.009829 0.004432 0.024969 -0.004321 0.020031 
+0.043155 0.002976 -0.016369 0.033333 0.020135 0.003356 
+0.005000 0.020000 0.018333 -0.002500 0.009500 -0.021000 
+0.002327 0.002565 -0.003709 0.012968 0.007104 -0.007648 
+0.015693 0.011017 -0.007129 0.004508 0.004466 -0.006460 
+0.008569 0.004154 -0.014641 0.039997 -0.002741 -0.043820 
+0.049149 0.009869 -0.061276 0.034961 0.001187 -0.044703 
+0.005394 0.002882 -0.018031 0.006621 0.013545 -0.018934 
+0.019993 0.015059 -0.004645 0.001358 0.020471 -0.003166 
+0.028230 0.032644 -0.054920 0.016663 0.023240 -0.043013 
+-0.003752 -0.002161 0.000866 -0.001239 -0.005895 -0.001242 
+-0.000877 -0.006186 -0.002429 -0.001399 0.001138 -0.000298 
+0.002341 0.009765 -0.000234 0.000523 0.006549 -0.001679 
+0.000806 -0.003464 0.002049 0.001542 -0.010327 0.005149 
+0.003662 -0.004254 0.004117 -0.005129 0.008497 0.002370 
+-0.027947 0.020839 -0.004502 -0.025860 0.027377 -0.014017 
+0.004263 -0.002185 0.006716 0.019806 -0.016808 0.027181 
+3.108696 -2.121739 3.891304 2.920502 -1.928870 4.213389 
+2.344445 -1.294444 3.661111 0.015878 -0.005479 0.020538 
+0.004449 0.002576 0.004449 0.002687 -0.020116 0.014008 
+-0.001764 -0.046154 -0.000529 -0.006967 0.011203 0.002251 
+-0.025167 -0.014395 0.007960 -0.019412 -0.002706 0.005412 
+0.005980 -0.009388 -0.000082 0.042193 -0.011674 -0.104733 
+0.023269 -0.161474 -0.126923 -0.003671 -0.068000 0.004282 
+0.005023 0.016561 -0.014389 0.000000 0.062857 -0.042857 
+0.055577 0.058942 -0.057981 -0.008991 -0.021228 0.011930 
+-0.007240 -0.038290 0.017170 0.003848 -0.024562 0.005167 
+0.014858 0.014737 0.002562 0.009561 0.005544 0.003270 
+-0.002309 -0.014728 0.007096 -0.010546 -0.012274 0.006386 
+-0.009510 0.001275 0.001239 0.004416 0.008819 -0.006030 
+0.013510 -0.017740 0.001662 0.004174 -0.059253 0.034398 
+-0.006916 -0.033863 0.030899 -0.015642 -0.012637 0.017501 
+-0.045429 -0.002286 0.026143 0.021370 -0.033395 0.044166 
+-0.001804 -0.007675 0.003029 -0.014582 -0.009226 -0.010746 
+-0.010270 -0.007819 -0.003273 0.000914 0.002168 -0.000080 
+0.004960 -0.015405 0.008123 -0.004822 -0.015565 0.014364 
+0.013286 0.013368 -0.012824 0.036997 0.005268 -0.005751 
+-0.013203 0.019697 0.006503 -0.007576 -0.004376 -0.004708 
+-0.009964 -0.003930 0.004415 0.006750 0.027549 0.014613 
+-0.177463 0.015648 0.031963 -0.009413 0.033828 0.012942 
+-0.002888 0.014978 0.016698 -0.003882 -0.003098 0.014282 
+0.003896 -0.005232 -0.003380 0.013160 0.001886 -0.008182 
+0.006603 -0.000512 0.003009 -0.007728 -0.002674 0.010650 
+-0.002406 0.000519 0.018401 0.023558 0.001665 0.009721 
+0.023707 -0.001139 -0.008803 0.007118 -0.000675 -0.005785 
+-0.004420 0.005459 -0.002733 0.000324 0.006398 -0.002480 
+0.005493 0.009801 -0.001924 0.010335 0.014866 -0.007097 
+0.006417 0.004890 -0.010269 0.003450 0.001582 -0.004439 
+0.001044 -0.005520 0.002916 0.002076 -0.001806 -0.000180 
+0.001977 0.004275 0.000475 0.002118 0.011529 0.000000 
+0.005680 0.007917 -0.000506 0.002321 0.003939 0.001520 
+0.001281 -0.000387 0.000538 -0.000810 0.001482 -0.003334 
+-0.001285 0.000810 -0.002124 -0.007239 0.010386 -0.000017 
+-0.008699 0.022619 -0.001452 0.004002 -0.005915 -0.000385 
+0.010455 -0.010643 0.014092 2.803109 -1.601036 3.010363 
+4.098039 -2.573529 4.779412 4.405263 -2.694737 5.778947 
+4.078948 -1.888158 5.453948 0.035585 -0.008751 0.034318 
+0.018712 0.003410 0.017752 0.005529 0.024468 -0.003276 
+-0.007119 -0.032641 0.039089 -0.016809 0.000383 0.042780 
+0.022102 -0.006143 0.004794 -0.008679 -0.008211 -0.009274 
+-0.004408 0.014811 -0.089219 0.069295 -0.098738 -0.036085 
+0.069412 -0.062118 0.013412 -0.006914 -0.006767 -0.009008 
+0.000523 -0.000104 0.000426 0.004552 -0.004448 0.000045 
+-0.012551 0.015483 -0.010330 -0.034017 -0.011197 -0.005812 
+-0.007692 -0.020769 -0.003846 0.011339 -0.031553 -0.002731 
+0.021111 -0.002460 0.002302 0.033555 0.018166 -0.007338 
+0.025929 0.024786 -0.014643 0.002529 0.030889 -0.024469 
+-0.003748 0.029891 -0.026865 -0.002794 0.023752 -0.021703 
+0.003603 -0.009591 0.002694 0.001304 -0.047392 0.005499 
+-0.015319 -0.040649 0.022043 0.023131 -0.014141 0.017980 
+-0.045909 0.105584 0.024481 -0.022857 0.091571 -0.015286 
+-0.006401 -0.035455 0.070410 -0.004027 -0.040104 0.006857 
+-0.014933 -0.025204 0.008808 0.001847 -0.001914 0.000126 
+0.000838 0.008161 -0.003400 -0.010112 -0.009157 0.005947 
+-0.014189 -0.015750 0.014074 -0.028092 -0.016645 0.023654 
+-0.039004 -0.012062 0.026937 -0.035887 -0.004382 0.011684 
+-0.035046 -0.021927 -0.000004 -0.066695 -0.018416 0.013221 
+-0.052818 0.004601 0.013555 0.004068 0.009635 0.020004 
+0.006556 0.015316 0.023774 0.003033 0.007328 0.023499 
+0.011821 0.014318 -0.010176 0.003030 0.009035 -0.003320 
+-0.006232 -0.001211 0.008791 -0.013620 0.000798 0.005238 
+-0.001990 0.002781 0.003119 0.014568 0.005060 -0.003810 
+0.001277 0.003710 -0.007916 0.007750 0.004639 0.006607 
+0.003882 0.003275 -0.002588 0.001550 -0.000642 0.000110 
+-0.006460 -0.004058 0.002090 -0.012498 -0.005070 0.007599 
+-0.010059 -0.000131 0.010744 -0.004288 0.002379 0.001598 
+0.003153 -0.002208 0.003786 0.002309 0.001543 -0.002574 
+0.001700 0.008075 -0.002732 -0.002522 0.002921 -0.000696 
+0.000911 0.000627 -0.006953 -0.000976 0.002097 -0.002947 
+-0.001463 -0.000274 -0.002706 0.001321 -0.001448 0.000527 
+0.003985 -0.001804 0.003388 -0.030043 -0.006995 -0.008012 
+-0.012885 0.009408 -0.015331 0.004293 -0.002227 0.006298 
+0.006148 -0.014563 0.024644 3.063415 -2.453659 3.721951 
+4.167568 -3.237838 5.286487 4.715190 -3.094937 6.284810 
+4.050000 -1.842857 5.842857 2.715517 -0.706897 4.551724 
+0.019607 0.000009 0.020372 0.001660 0.005646 0.000339 
+-0.009167 -0.004583 0.027083 0.012970 0.016767 0.021090 
+0.009087 -0.004778 0.036700 0.006062 -0.013495 0.008464 
+-0.037589 -0.078652 -0.142695 -0.045714 -0.069357 -0.053071 
+0.072190 -0.034810 0.042053 0.026923 -0.016833 -0.004208 
+0.048339 -0.004134 -0.002438 -0.020509 -0.002619 0.026722 
+0.004706 0.008235 0.000000 0.023362 0.012664 -0.003033 
+0.016722 0.014340 0.019799 0.012617 0.005937 0.009896 
+0.014028 -0.000694 -0.003611 0.016893 0.010464 -0.030571 
+0.032727 0.037273 -0.037818 0.001993 0.053633 -0.025356 
+-0.055991 0.029270 -0.022377 -0.003016 0.000953 0.000310 
+0.032307 0.034119 0.060614 0.017515 0.026272 0.026154 
+-0.000603 0.011681 -0.005388 -0.004375 -0.054251 0.031408 
+-0.036313 -0.038119 0.045380 -0.070859 0.007450 -0.043660 
+-0.027787 -0.021114 0.053346 -0.008182 -0.013636 0.037727 
+0.004566 0.011415 -0.011379 0.012287 0.008092 -0.018435 
+-0.007790 -0.003169 0.006964 -0.012807 -0.009676 0.010983 
+-0.014749 -0.010806 0.011657 -0.019423 -0.013708 0.012098 
+-0.023898 -0.020677 0.011267 -0.025285 -0.024047 0.011481 
+-0.005053 -0.003981 -0.008047 0.064606 0.030155 -0.019520 
+0.001370 0.050928 -0.017797 -0.001042 0.006477 -0.002794 
+0.013975 0.006926 0.001890 0.020855 0.011814 -0.007715 
+0.005785 0.023368 -0.008537 -0.007868 0.002933 0.005309 
+-0.008782 0.000457 0.003419 -0.005509 0.003441 -0.000003 
+-0.002784 0.006108 -0.002549 -0.002540 0.003105 0.000561 
+-0.000704 0.003028 0.004956 0.001184 0.012665 -0.003694 
+0.000501 0.003050 -0.002522 0.003903 0.003069 -0.002665 
+0.003280 0.007323 -0.002945 0.007101 0.009182 -0.008883 
+0.000192 0.008578 -0.005053 -0.000967 0.004364 -0.000792 
+0.006776 0.006263 -0.000600 0.000426 0.003869 0.000658 
+-0.002055 -0.001999 -0.006102 0.001914 -0.001589 -0.001615 
+-0.002751 -0.000474 0.001447 -0.000893 0.003939 -0.004182 
+-0.001537 0.001245 -0.000260 0.004531 -0.005530 0.001480 
+0.004166 -0.013440 0.001812 -0.005043 0.005549 -0.006316 
+-0.004693 0.001226 -0.007397 0.003264 -0.005392 0.006267 
+0.006795 -0.006587 0.025566 2.413174 -3.389222 3.802395 
+3.178808 -4.000000 5.629139 3.224806 -3.348837 6.720930 
+2.409091 -1.927273 6.327273 0.029437 0.007491 0.026830 
+0.014105 -0.001355 0.010132 -0.003125 -0.007830 -0.002696 
+-0.001063 0.001054 -0.001223 0.011714 0.010095 0.006857 
+0.011685 -0.002541 0.021274 0.020473 -0.016810 0.023098 
+0.016348 -0.045361 0.036509 0.027955 -0.075455 0.106136 
+-0.023975 -0.018720 0.044583 0.013363 -0.004434 0.010187 
+0.005393 0.012135 0.012135 -0.070519 0.021926 -0.065185 
+-0.025219 -0.034821 0.005139 -0.011988 -0.003782 0.018945 
+0.014918 -0.000099 0.001766 0.030898 -0.006802 -0.021444 
+0.027369 0.001825 -0.033529 0.014228 0.007577 -0.022499 
+0.001618 -0.002500 -0.000404 -0.022277 0.016083 0.009280 
+-0.044357 0.037800 0.023529 0.011176 0.005243 0.033068 
+0.069503 0.028634 0.002733 -0.007489 -0.001861 0.009827 
+-0.017258 -0.006811 0.016966 -0.022277 -0.008412 0.014083 
+-0.019933 -0.034371 0.025144 -0.018175 -0.033828 0.039848 
+-0.005270 -0.013731 0.009026 0.034168 -0.009803 -0.032022 
+0.011896 0.020345 -0.024535 -0.001583 0.004906 -0.000478 
+-0.017238 -0.015210 0.026809 -2.896552 -2.275862 2.165517 
+-2.771028 -2.102804 1.728972 -2.927757 -2.197719 1.498099 
+-3.164706 -2.509804 1.309804 -3.068063 -2.602094 0.848168 
+-0.021111 -0.019053 -0.000900 0.014572 0.015934 -0.014098 
+0.043943 0.022166 0.007329 -0.013261 -0.042713 0.017579 
+0.001904 0.004199 -0.004402 0.008722 0.000039 -0.005541 
+-0.004569 0.007001 -0.001539 -0.005203 -0.008750 0.000800 
+0.000598 -0.004446 -0.001894 -0.000147 0.003666 0.001472 
+-0.003363 0.013137 -0.001466 -0.002683 0.005615 -0.004210 
+-0.033003 0.003656 0.003986 -0.005071 0.011790 -0.004268 
+-0.000807 0.002551 -0.000817 -0.000893 0.000065 -0.000341 
+0.000224 0.005175 -0.001216 0.003464 0.009364 -0.006658 
+0.002111 0.005221 -0.004057 0.001568 0.000995 -0.001213 
+0.005254 -0.001137 -0.002355 -0.000137 -0.002694 -0.002124 
+-0.002051 -0.002087 -0.003999 -0.003145 -0.002107 -0.004098 
+0.005859 0.002469 -0.006537 0.006075 0.002120 -0.003974 
+0.001495 -0.001798 0.000397 -0.000051 -0.004330 -0.000160 
+-0.008894 0.001393 -0.003761 -0.007498 0.011535 -0.014611 
+-0.001983 0.005865 -0.005359 0.002364 0.001206 0.000884 
+0.008284 -0.002627 0.005366 0.014166 -0.007030 0.019210 
+0.016186 -0.010240 0.046990 0.009687 -0.008900 0.058741 
+0.004683 0.006451 0.035703 0.009159 0.002294 0.008570 
+0.002143 -0.000884 0.001567 -0.003431 0.006785 -0.000782 
+-0.002196 0.008966 -0.001183 -0.006313 -0.003917 -0.007512 
+0.005135 -0.019047 -0.009840 -0.001463 -0.022143 0.013171 
+-0.007595 -0.027960 0.122192 0.104046 -0.071412 0.106679 
+-0.067315 0.006374 0.014554 0.004220 0.052402 -0.017422 
+0.023075 0.057123 -0.065635 0.103185 0.022593 -0.093407 
+0.045000 0.007264 0.002075 0.030000 0.000000 0.006667 
+0.002800 -0.000154 0.000950 0.000806 -0.041528 0.026056 
+-0.000607 -0.022622 0.012229 0.067483 0.056034 -0.029724 
+0.024544 0.023921 -0.002018 -0.009845 -0.001938 0.005310 
+0.009503 -0.010442 -0.000331 0.009023 -0.016692 -0.023008 
+0.006988 -0.024363 0.005936 -0.004252 -0.010896 0.008587 
+-0.016300 -0.007633 0.008027 -0.024505 -0.002766 0.004196 
+-0.010469 0.003654 0.003457 0.000096 0.007539 -0.003917 
+-0.004910 0.013580 -0.011091 0.016968 0.015068 -0.029095 
+0.000039 0.013608 -0.016643 -0.005731 0.005706 0.009961 
+-0.019478 -0.015796 0.026849 -3.588652 -2.886525 2.659575 
+-4.024242 -3.521212 2.587879 -4.186869 -3.636364 2.146465 
+-4.243590 -3.649573 1.568376 -4.016807 -3.508403 0.941176 
+-3.326531 -3.010204 0.321429 -0.025020 -0.020712 0.000112 
+-0.014994 -0.011810 0.002082 -0.000745 -0.005505 -0.005164 
+-0.002199 -0.009775 0.004363 -0.000452 -0.001464 0.004533 
+0.007679 0.000263 0.000693 -0.001617 0.004255 0.001066 
+-0.005259 0.001471 0.002113 -0.000405 0.005577 0.001231 
+0.006348 0.012163 -0.008373 0.005173 0.006719 -0.008964 
+-0.002819 -0.001278 0.002327 -0.002132 -0.000896 0.001471 
+0.000760 0.001601 -0.000241 -0.002939 0.000174 -0.002625 
+-0.003854 0.004284 -0.001580 -0.000080 0.004263 -0.002521 
+0.001314 0.001137 -0.001323 0.004850 0.003380 -0.001875 
+0.000423 -0.001983 -0.001143 -0.003860 0.001252 -0.000288 
+-0.006280 0.003560 -0.001374 -0.005100 0.004714 -0.001374 
+0.003948 0.001902 -0.001562 0.004823 -0.003627 -0.003110 
+0.001946 -0.004162 -0.001171 -0.002161 -0.001226 -0.000849 
+-0.005322 0.002949 -0.003181 -0.004253 0.007260 0.002062 
+0.003051 0.003058 -0.000900 0.002666 0.001323 -0.004731 
+-0.002160 -0.000613 -0.006184 -0.003333 0.002035 -0.002375 
+0.003168 0.000517 0.002016 -0.002606 -0.005102 0.006113 
+-0.000614 0.000578 -0.000043 -0.005916 0.001336 -0.005032 
+-0.005373 0.004539 -0.005435 -0.005933 0.011149 0.003748 
+-0.006150 0.001986 -0.002932 -0.007390 0.008699 -0.004134 
+0.003070 0.003784 -0.009449 -0.010803 -0.003431 -0.030633 
+-0.005385 -0.040073 0.043716 -0.009154 -0.014615 0.022538 
+0.019286 0.014643 -0.038929 0.015262 0.013145 -0.038163 
+0.013856 0.003464 -0.032778 0.009690 0.006947 0.005940 
+0.026957 0.043382 0.007219 0.151233 0.122096 -0.120863 
+-0.027169 0.012470 -0.008414 -0.045602 0.033646 0.043936 
+-0.039925 -0.010113 0.074267 0.071143 -0.104571 -0.082286 
+0.007693 -0.033291 0.038942 -0.028651 -0.020896 0.011613 
+-0.024444 -0.012222 0.006111 0.001020 -0.036245 -0.103633 
+-0.007133 0.009196 0.000944 -0.009057 0.002086 0.013934 
+0.017183 0.017867 -0.002907 0.018180 0.025431 -0.003197 
+0.013815 0.017633 -0.003289 0.006096 0.008750 -0.000590 
+-0.002600 0.002422 -0.003578 0.003739 -0.000315 -0.005176 
+0.006010 -0.000595 -0.008357 -0.000986 0.006494 -0.000362 
+-0.019021 -0.008242 0.020072 -0.036718 -0.021810 0.022219 
+-3.955882 -3.882353 2.426471 -4.241379 -4.413793 2.200000 
+-4.186440 -4.033898 1.474576 -4.063348 -3.529412 0.678733 
+-3.801688 -3.135021 0.063291 -3.322115 -2.730769 -0.307692 
+-0.025909 -0.022284 -0.004448 -0.016432 -0.014404 -0.004224 
+-0.001328 -0.002172 -0.001853 0.001225 -0.002434 0.009150 
+-0.000467 0.001960 0.003073 -0.000443 -0.006071 0.000308 
+-0.002311 -0.005643 0.000780 -0.003217 -0.004255 0.003125 
+-0.001813 -0.002045 0.003744 0.001189 0.003527 -0.003360 
+0.001044 0.003365 -0.003099 -0.000395 -0.001535 0.001162 
+0.001119 -0.003726 0.000113 0.001222 -0.002189 -0.001026 
+0.003501 0.003147 -0.000959 -0.000445 0.002647 -0.000313 
+-0.002505 0.000287 0.000803 0.000300 0.000719 0.000116 
+-0.009880 -0.001369 -0.002652 -0.010165 0.000601 0.000866 
+-0.000950 0.004537 -0.000406 0.004598 0.005816 -0.001338 
+0.002673 0.003998 -0.000094 -0.000687 0.002827 0.000187 
+-0.003255 0.004603 0.000643 -0.002983 0.004866 0.000407 
+-0.001404 0.002549 0.000143 -0.000668 0.000186 -0.000450 
+0.001000 -0.000528 -0.003696 0.001067 -0.000157 -0.006180 
+-0.004187 -0.001385 -0.005842 -0.002455 -0.003889 -0.004986 
+0.002591 0.000877 -0.002860 -0.003036 0.002362 -0.000183 
+-0.004674 0.004065 -0.002235 -0.005050 0.003174 -0.002966 
+-0.004527 0.003924 0.000913 -0.008120 0.006944 0.007693 
+-0.010136 0.007687 -0.006463 0.004949 0.023081 0.003283 
+0.004571 0.009257 -0.007314 0.003303 -0.000835 0.001337 
+-0.014249 0.001670 -0.004515 -0.002865 0.002788 0.002846 
+-0.004711 -0.004456 -0.002301 -0.005517 0.001272 0.001526 
+-0.000687 0.003777 0.011250 -0.044670 -0.016224 0.030161 
+-0.018053 -0.032629 0.015144 0.101570 -0.033991 -0.042439 
+0.021242 -0.008470 -0.042685 0.020776 0.033753 -0.019993 
+0.027840 0.085905 -0.000256 -0.006848 -0.017680 0.009159 
+-0.043599 -0.033006 0.032801 -0.003586 -0.005123 0.003586 
+0.002985 0.009898 0.003954 0.063461 -0.095281 -0.071438 
+0.016000 -0.032000 0.013846 -0.026732 -0.036588 0.037466 
+0.026077 -0.010791 -0.010579 0.039763 0.016935 -0.002752 
+0.014698 0.006291 -0.005896 -0.008590 -0.008380 0.002305 
+-0.002263 -0.005257 0.006423 0.000217 0.007380 -0.003661 
+0.003961 0.007673 -0.004468 -0.000645 0.002025 -0.000034 
+-0.007276 0.001010 0.003424 -0.019136 -0.007822 0.018910 
+-0.029692 -0.024148 0.017007 -3.699187 -3.723577 1.276423 
+-4.202899 -3.971014 1.065217 -4.192983 -3.713450 0.660819 
+-4.036866 -3.451613 0.092166 -3.847107 -3.214876 -0.326446 
+-3.508929 -2.776786 -0.464286 -3.030120 -2.006024 -0.403614 
+-0.022032 -0.018923 -0.002696 -0.026781 -0.022313 -0.003130 
+-0.015453 -0.019852 0.001207 -0.002994 -0.006327 -0.000493 
+0.002368 -0.001250 -0.000922 -0.001571 0.002535 0.001240 
+-0.003128 -0.000306 0.002762 -0.001474 -0.003288 0.000462 
+0.000031 -0.000991 -0.000529 -0.001855 0.001524 0.000301 
+-0.000830 0.002837 0.000035 0.000827 0.004389 -0.000423 
+0.007005 0.005590 -0.005672 0.004654 0.005436 -0.007220 
+0.002684 0.006258 -0.004192 0.000602 0.005139 -0.002870 
+0.002323 -0.001393 -0.000426 -0.001256 -0.001475 0.000808 
+-0.001016 -0.000026 0.000064 0.000279 0.003254 -0.001464 
+-0.002402 0.003690 -0.002128 -0.005526 0.002318 -0.001122 
+-0.003791 0.002859 -0.001050 -0.000349 0.003132 0.000740 
+0.003070 -0.000508 0.002409 0.009870 -0.006129 0.003080 
+0.006931 0.000716 0.001916 -0.004639 -0.006829 0.002886 
+-0.002562 -0.000750 -0.000789 0.004927 0.013600 -0.014501 
+0.008401 0.008224 -0.017271 -0.002186 0.000089 -0.005345 
+-0.002813 0.005115 -0.002296 0.000079 0.002980 -0.005120 
+0.018579 -0.005373 -0.000769 0.011488 0.010512 0.000366 
+0.017021 0.027927 -0.030706 0.014110 0.019342 -0.026298 
+0.014953 0.019779 -0.018654 -0.002000 0.031546 -0.014888 
+-0.017709 0.045792 -0.018425 -0.014248 0.054887 -0.030602 
+0.038109 0.007311 -0.025168 0.033087 0.013823 0.001523 
+0.040988 0.017589 -0.015957 0.043065 0.017172 -0.024258 
+0.058182 -0.033155 -0.019893 -0.001111 -0.018444 -0.042444 
+-0.003396 -0.006487 -0.002776 0.016938 -0.007114 0.009485 
+-0.043365 -0.036936 -0.013383 -0.053223 -0.027161 -0.001760 
+-0.036281 -0.022645 -0.024298 0.083106 0.019924 -0.014091 
+0.004547 -0.002184 0.004239 0.001952 0.007606 0.003812 
+0.004774 -0.023122 -0.040939 0.007147 -0.000397 -0.030000 
+-0.014187 -0.005333 -0.010640 -0.005804 0.024667 -0.001451 
+-0.032684 0.023997 0.000172 -0.008396 -0.015370 -0.000092 
+0.002269 0.002601 0.000167 0.008541 0.007056 -0.006499 
+0.007243 0.001025 -0.009989 0.008620 0.002588 -0.009825 
+0.012722 0.004516 -0.002024 0.003292 0.005717 0.006837 
+-0.016592 -0.014020 0.021392 -0.032655 -0.034438 0.017086 
+-4.702479 -4.363636 1.231405 -5.090909 -4.659091 0.946970 
+-4.528302 -4.188679 0.459119 -3.887255 -3.480392 -0.156863 
+-3.539095 -2.893004 -0.600823 -3.436214 -2.485597 -0.810700 
+-3.366492 -2.120419 -0.816754 -0.025888 -0.023425 -0.006482 
+-0.020977 -0.014697 -0.007336 -0.009322 -0.013345 0.001204 
+-0.008086 0.002113 0.005748 0.001017 0.008434 0.005070 
+0.008624 0.008100 0.003298 0.010871 0.005450 0.000623 
+0.006422 0.001893 0.000495 0.001543 0.001136 0.002061 
+-0.000376 0.001615 0.001432 0.003392 0.004361 -0.001159 
+0.003203 0.003423 -0.002793 0.000354 0.001163 -0.000685 
+-0.000422 -0.000862 -0.000048 0.002149 0.000805 -0.000162 
+0.002660 0.001918 -0.001157 0.003890 0.001837 -0.001353 
+0.002020 0.000627 -0.000320 0.000442 0.000212 -0.000004 
+-0.000651 0.000010 -0.000107 -0.001666 0.004118 -0.000530 
+-0.003555 0.008211 0.001000 -0.001472 0.011550 0.004596 
+0.008349 0.011425 0.013727 0.012926 -0.000572 0.014318 
+0.009542 -0.015082 0.002617 0.003147 -0.014056 -0.005352 
+0.007836 0.001107 -0.009031 0.003421 -0.000247 -0.001732 
+-0.004815 -0.002165 0.001937 -0.004744 -0.005695 -0.001478 
+-0.010913 0.000128 -0.005049 -0.005804 0.001020 -0.006409 
+0.013200 0.005703 0.002315 0.003497 0.003474 -0.003484 
+0.024280 0.011817 -0.014989 0.022768 0.012859 -0.007883 
+0.006885 0.010591 0.001153 -0.001328 0.015385 -0.002509 
+-0.011231 0.011244 -0.005604 -0.008757 0.036199 0.009225 
+-0.013588 0.051723 -0.020522 -0.005333 0.010667 0.023333 
+0.037205 0.033795 -0.020466 0.030453 0.043061 -0.021002 
+0.000605 0.042236 -0.010529 -0.030595 0.033044 -0.016481 
+-0.108333 0.007992 0.009590 0.064211 -0.009737 -0.005789 
+-0.027155 -0.004704 0.015303 -0.030480 -0.031681 0.025465 
+-0.015738 -0.048197 0.013607 -0.040714 -0.063571 0.011429 
+-0.000393 -0.023313 0.049772 -0.007548 0.000968 -0.027613 
+-0.002449 -0.011046 -0.027326 0.029905 0.008677 -0.018173 
+0.002986 0.015397 0.001522 0.002762 0.020952 -0.008690 
+-0.003795 0.012695 -0.008483 -0.016190 -0.005691 0.004553 
+-0.003191 -0.000766 0.013337 -0.000670 -0.007297 0.003686 
+-0.000229 -0.003375 -0.000937 0.009052 0.007173 -0.006515 
+0.012857 0.009975 -0.003935 0.004043 0.003066 -0.001434 
+-0.010579 -0.009094 0.007425 -0.020498 -0.022312 0.013885 
+-0.030668 -0.032727 0.006636 -4.520325 -3.723577 0.544715 
+-5.014706 -4.073529 0.544118 -4.573248 -3.783439 0.229299 
+-3.949749 -3.236181 -0.396985 -3.679167 -2.870833 -0.862500 
+-3.462151 -2.573705 -1.039841 -3.158654 -2.225961 -1.057692 
+-0.023465 -0.019557 -0.011328 -0.020150 -0.014369 -0.006548 
+-0.020814 -0.029220 0.000296 -0.019081 -0.003365 0.002460 
+-0.000784 0.002715 0.003151 0.008616 0.009579 0.004741 
+0.002441 0.004515 0.004403 -0.002451 0.000881 0.001884 
+-0.001270 -0.004312 -0.002845 0.002440 -0.003392 -0.002611 
+0.000323 0.000050 -0.000152 -0.002780 0.000451 0.002743 
+-0.002568 -0.001004 0.002695 -0.000702 0.000521 -0.000453 
+-0.000160 0.002138 0.000504 -0.003850 -0.000828 -0.000103 
+-0.005899 -0.004294 -0.001493 -0.003599 -0.004283 -0.001827 
+0.003344 -0.000130 0.000165 0.007258 0.001643 0.003664 
+0.003631 0.002610 0.003437 0.009752 0.006927 0.007531 
+0.047688 0.023261 0.005342 0.010468 -0.009207 0.001562 
+0.008611 -0.005985 -0.003922 -0.004492 -0.014108 -0.001245 
+-0.014417 -0.020243 -0.008425 -0.014453 -0.027959 -0.005687 
+0.007536 -0.007271 -0.002435 0.003244 0.001618 -0.004862 
+-0.008444 -0.007979 0.000660 -0.003819 -0.002678 -0.001107 
+0.002658 0.002957 0.001917 0.008303 -0.000938 0.008146 
+0.005547 -0.005661 -0.000367 -0.008640 -0.009023 0.005088 
+-0.014702 -0.012261 0.001446 -0.010255 -0.011883 -0.004115 
+0.018465 0.049494 -0.037276 -0.048894 0.001915 -0.025213 
+-0.058951 0.091049 -0.008025 0.023639 0.047534 -0.109303 
+0.011486 -0.009857 -0.055029 -0.024678 -0.001405 -0.020149 
+-0.031023 -0.008634 -0.008097 -0.059256 -0.005410 -0.005879 
+0.040337 0.000312 -0.037877 0.015628 -0.000173 -0.019062 
+0.010262 0.014202 -0.013570 -0.006940 0.011270 -0.011736 
+-0.019328 -0.009322 -0.010672 -0.046668 -0.018379 0.008994 
+-0.003206 0.022479 -0.005378 0.002946 0.014815 0.011293 
+0.000531 -0.001403 0.001405 -0.005910 0.003956 0.001027 
+-0.006453 0.008879 -0.012082 0.035639 0.035819 -0.008876 
+0.024017 0.042271 -0.040109 -0.005000 0.002733 -0.014467 
+-0.002555 -0.000982 -0.002445 -0.008527 -0.005482 -0.001538 
+0.000932 -0.001206 -0.002783 0.000948 0.005480 -0.011079 
+0.008391 0.007727 -0.018215 0.007246 0.015942 0.000290 
+-0.000875 0.010162 -0.002470 -0.007265 0.000887 0.003733 
+-0.014305 -0.017687 0.012153 -0.025235 -0.029755 0.000697 
+-4.160839 -3.160839 -0.132867 -4.768212 -3.649007 -0.304636 
+-4.535948 -3.666667 -0.503268 -3.841808 -3.276836 -0.689266 
+-3.493088 -2.949309 -0.838710 -3.397490 -2.723849 -0.966527 
+-3.305164 -2.478873 -1.089202 -0.027734 -0.021192 -0.012408 
+-0.019324 -0.013044 -0.011087 -0.027171 -0.009815 -0.012818 
+-0.004060 -0.009988 -0.002534 0.017575 0.005325 -0.009530 
+0.015712 0.005435 0.000709 0.006261 0.004506 0.005872 
+-0.002622 0.004893 0.004341 0.000360 0.000736 0.000372 
+0.002151 0.001991 0.000573 0.001681 -0.000875 0.004610 
+0.003717 -0.003690 0.001977 0.002903 0.000659 0.001143 
+0.003931 -0.003468 -0.003023 -0.001185 -0.001866 -0.000883 
+-0.005602 -0.001135 -0.000954 -0.007312 0.002580 0.000538 
+-0.010130 0.006181 0.002388 -0.004353 0.000623 -0.001079 
+0.023059 -0.021319 -0.011236 0.019161 0.000349 -0.010742 
+0.000985 -0.004654 0.009159 -0.006905 -0.008595 0.006876 
+-0.009496 0.006388 -0.000818 -0.012279 0.005764 -0.000262 
+-0.001044 -0.002436 -0.002376 0.012650 0.017584 -0.021368 
+-0.001102 0.022732 -0.026435 0.008053 0.018898 -0.019297 
+0.000851 0.013931 -0.003141 0.006396 0.004649 0.004751 
+0.009524 0.012252 0.007736 0.008405 0.016722 -0.012754 
+-0.012013 0.011298 -0.006566 -0.009894 0.004791 0.002475 
+-0.002681 0.006192 -0.001045 -0.000534 0.005345 -0.001626 
+-0.009204 -0.016529 0.001975 -0.010958 -0.028290 0.006060 
+0.018908 0.014595 -0.008936 0.035292 0.027182 -0.065811 
+0.055897 0.025525 -0.041681 0.031761 0.020551 -0.005000 
+-0.010594 0.013870 -0.038027 -0.077213 0.050603 -0.066745 
+-0.000502 0.000334 -0.033478 0.001667 0.004630 -0.007778 
+-0.006551 0.000579 -0.007176 -0.046065 -0.020442 -0.003052 
+-0.025244 -0.006644 0.003978 -0.012461 -0.016539 -0.007646 
+-0.029913 0.011825 0.029757 0.001446 0.015904 -0.009478 
+-0.011176 0.002353 0.000000 -0.000069 -0.001047 -0.021629 
+0.050644 0.014940 -0.025463 0.015067 0.027866 -0.015672 
+0.018298 0.015648 -0.010306 0.003324 0.002666 0.003534 
+-0.016200 0.008800 0.001400 -0.009817 -0.006909 0.016769 
+-0.000435 0.001748 0.000157 -0.001824 0.003121 -0.002088 
+0.001665 0.001855 -0.009454 0.004407 0.000000 -0.008136 
+0.003512 0.001171 -0.000583 0.004926 0.003704 0.002970 
+0.007789 0.005204 0.003087 -0.017071 -0.010666 0.010434 
+-0.034050 -0.028963 0.000215 -4.275862 -3.324138 -0.048276 
+-4.331326 -3.572289 -0.277108 -4.192771 -3.740964 -0.578313 
+-4.017544 -3.596491 -0.836257 -3.862245 -3.142857 -0.994898 
+-3.710407 -2.719457 -1.099548 -3.574879 -2.449275 -1.217391 
+-3.266667 -2.200000 -1.293333 -0.026882 -0.020880 -0.006740 
+-0.018397 -0.017339 0.013895 0.021808 0.002848 -0.004224 
+0.019275 0.008703 0.003407 0.007946 0.013066 0.006421 
+0.002617 0.003912 0.001102 -0.000882 0.000030 0.001242 
+-0.000750 -0.000875 -0.001562 -0.000143 0.000031 -0.000440 
+-0.000409 -0.001478 -0.000723 -0.000822 -0.001130 -0.001898 
+0.003039 0.002836 0.002762 -0.001277 0.000237 0.000819 
+-0.001619 0.002885 0.002757 0.003185 0.013771 0.020507 
+-0.480125 0.223840 0.067731 -0.025330 -0.132089 0.019694 
+0.029747 -0.038759 -0.051645 0.005024 -0.001292 0.015598 
+0.000273 -0.015968 0.021230 -0.000319 -0.002367 0.024965 
+-0.001427 0.001817 0.007282 0.053248 -0.012866 -0.058695 
+0.033121 0.103633 0.005572 0.001343 0.013077 -0.014103 
+0.004367 0.002412 -0.004224 0.001487 -0.000174 -0.000360 
+0.003117 0.000511 0.001696 0.004029 0.002216 0.003812 
+0.000638 0.007465 0.005019 0.015864 0.013388 -0.003255 
+0.018253 0.004192 -0.004245 0.002051 -0.001538 -0.002051 
+0.000176 0.003629 0.005213 0.003453 0.002158 0.002355 
+0.009422 -0.004371 0.001232 0.022183 0.007438 0.010280 
+0.037462 0.038881 -0.044888 -0.004789 0.050189 -0.014827 
+0.015348 0.037615 -0.002783 -0.011317 0.002860 -0.001213 
+-0.014973 0.007952 0.004376 -0.007748 0.000899 -0.000833 
+-0.004476 -0.003793 -0.012082 -0.001163 -0.001073 -0.020333 
+-0.010551 -0.004016 -0.024133 -0.022273 0.005172 -0.012069 
+-0.005606 0.003598 0.002689 0.004615 0.000754 -0.005277 
+0.011865 -0.002044 -0.010020 0.042468 0.014156 -0.014156 
+0.005282 0.012596 -0.027359 -0.001364 0.012667 -0.000779 
+-0.024121 -0.023352 0.011484 -0.010462 -0.008462 0.005231 
+0.001866 -0.008312 -0.021259 0.001008 -0.006810 -0.013437 
+0.015872 0.012988 -0.014423 -0.007354 0.007582 -0.016104 
+-0.004160 -0.000371 -0.006182 -0.000905 0.003189 -0.003406 
+-0.001588 0.005386 -0.009076 0.006957 0.003854 -0.016429 
+0.004885 0.003418 -0.004197 -0.002464 -0.003573 0.008513 
+0.006010 0.000868 0.008957 0.008488 0.010717 0.007915 
+-0.012855 -0.010900 0.011423 -0.025389 -0.024498 -0.004979 
+-3.568493 -2.623288 -0.445205 -3.845714 -3.314286 -0.342857 
+-4.045977 -3.678161 -0.402299 -3.987952 -3.493976 -0.813253 
+-3.817647 -2.988235 -1.358824 -3.635870 -2.625000 -1.570652 
+-3.433155 -2.491979 -1.288770 -3.339623 -2.465409 -0.817610 
+-0.034694 -0.026639 -0.006550 -0.037101 -0.028550 0.007109 
+-0.015382 -0.029144 0.028150 -0.009973 -0.014328 0.002832 
+0.031183 -0.008772 -0.013335 -0.004570 -0.003107 0.000670 
+-0.005995 -0.005916 -0.004630 -0.003072 -0.001374 -0.005643 
+0.002289 0.001496 0.002183 0.006320 0.001130 0.002321 
+0.005154 -0.018996 -0.003917 -0.001015 -0.011764 0.008315 
+-0.000959 -0.015916 0.007816 -0.007310 0.003578 0.012620 
+0.019763 0.001041 0.013402 0.011445 0.003643 0.009931 
+0.002233 0.005737 0.003714 0.003915 -0.004840 0.003644 
+0.005308 0.002088 0.023219 0.010641 0.007161 0.024704 
+0.111036 -0.027321 -0.051143 0.042418 0.019451 0.041607 
+0.020129 -0.026484 -0.004429 0.004712 0.005028 -0.013537 
+-0.003072 -0.005780 -0.000839 0.003395 -0.000415 -0.001906 
+0.010283 -0.004752 -0.001137 0.002966 -0.003820 -0.005782 
+-0.001800 -0.003553 0.004955 -0.031412 -0.002362 0.021656 
+-0.025992 -0.008505 0.023069 -0.004286 -0.001168 0.005319 
+0.007928 0.003280 0.004252 -0.037382 -0.005607 0.007639 
+-0.021633 0.003492 -0.000777 -0.012606 0.011051 0.014848 
+-0.013423 0.017381 0.015247 -0.011015 0.003271 0.000602 
+0.002852 0.004038 0.002914 -0.001786 0.001578 -0.000364 
+-0.002720 -0.003711 -0.011222 0.002674 -0.000068 -0.001238 
+-0.000827 0.003261 -0.004637 -0.007687 0.004494 -0.010668 
+-0.008314 0.002278 -0.013373 0.005692 0.001672 -0.007172 
+0.022496 0.000177 0.004152 0.007971 -0.001259 -0.006711 
+-0.002063 0.005127 0.003079 0.003112 0.013394 -0.005524 
+-0.008426 0.032308 -0.021907 0.007273 0.044462 -0.015692 
+0.013850 0.025389 -0.021403 -0.000784 0.003333 -0.002549 
+0.011505 0.022199 0.035324 -0.036667 0.004510 -0.018039 
+-0.016073 0.006699 -0.026635 -0.003373 0.009081 -0.004265 
+0.009769 0.008628 -0.010122 -0.003326 0.004802 -0.006921 
+-0.008377 -0.002524 0.014659 0.004256 -0.004866 0.010752 
+-0.048141 -0.028405 -0.052198 -0.015908 -0.012987 0.005494 
+-0.001241 -0.002955 0.004881 0.006511 0.002339 -0.000274 
+-0.002000 0.013778 -0.004000 -0.017155 -0.010114 -0.008682 
+-0.033426 -0.027167 -0.011184 -3.657343 -2.643357 -0.916084 
+-3.453552 -2.601093 -0.803279 -3.452514 -2.843575 -0.670391 
+-3.764706 -3.457516 -0.477124 -4.054054 -3.837838 -0.378378 
+-4.000000 -3.482353 -0.558824 -3.906593 -2.967033 -0.923077 
+-3.930818 -2.578616 -1.169811 -0.041058 -0.021989 -0.007175 
+-0.034311 -0.020578 -0.000051 -0.016191 -0.010153 0.001332 
+0.008685 0.003792 0.005679 0.037313 -0.013129 0.031088 
+0.025266 0.019302 -0.013885 -0.002755 -0.006247 -0.003910 
+-0.007392 -0.005058 -0.000176 -0.002289 0.000346 0.000951 
+0.011021 0.009637 0.002612 0.018269 0.003479 -0.002273 
+0.012052 0.002996 -0.002323 -0.006215 0.003913 0.001124 
+-0.018333 0.012290 -0.000384 -0.014442 0.009971 -0.002014 
+-0.005497 0.000383 0.001315 0.005000 -0.003333 0.000000 
+-0.004982 0.031161 0.013006 0.012656 0.059287 0.001141 
+0.023204 -0.003178 0.017907 -0.008074 0.029700 -0.010156 
+-0.009380 0.023105 -0.020007 -0.008851 0.011373 -0.006234 
+-0.010342 0.002822 -0.000834 -0.016467 -0.002223 0.006254 
+-0.005534 0.000541 0.001509 0.010115 0.011408 -0.008974 
+0.007302 0.009809 -0.012698 -0.022726 -0.024162 0.023112 
+-0.150490 -0.090883 0.026345 -0.106250 0.012684 0.021140 
+0.093825 -0.006960 -0.111087 0.067754 0.023220 -0.031596 
+0.049800 0.039850 -0.004000 -0.017544 0.040307 0.055482 
+-0.014706 0.018866 0.011787 -0.007307 -0.008464 0.023873 
+-0.005380 -0.003375 0.009064 0.001919 0.003934 -0.010955 
+0.006761 0.014203 -0.024707 0.000797 0.001444 -0.001191 
+-0.008665 -0.009392 0.007141 -0.013629 -0.016421 0.012754 
+-0.018283 -0.019138 0.019796 -0.022560 -0.015773 0.019502 
+-0.020348 -0.012096 0.009340 -0.007953 -0.005999 0.001483 
+0.002818 0.003849 -0.002436 0.019412 0.011647 -0.011000 
+-0.008833 0.001554 -0.008667 -0.034337 -0.000132 0.005619 
+-0.039990 -0.008753 0.009092 -0.020899 -0.007771 -0.012774 
+-0.024624 0.005820 -0.017141 -0.016795 0.006147 -0.015197 
+-0.008247 -0.002733 -0.012720 -0.003701 -0.001520 0.002996 
+-0.008380 0.007823 0.007639 -0.022046 0.042314 0.007552 
+-0.010677 -0.009323 -0.010832 0.037714 -0.013661 -0.051077 
+0.122877 0.036986 0.019224 0.021630 -0.007132 0.035602 
+-0.000391 0.004379 -0.006581 0.011736 0.011098 -0.011189 
+0.005153 0.002307 -0.023165 0.004079 -0.003678 -0.007914 
+-0.011008 -0.011207 -0.004313 -0.026905 -0.024478 -0.006337 
+-0.034247 -0.024665 -0.006933 -3.674847 -2.791411 -0.601227 
+-3.803681 -3.331288 -0.300613 -3.750000 -3.644737 -0.098684 
+-3.614865 -3.587838 -0.310811 -3.597561 -3.347561 -0.725610 
+-3.686486 -3.118919 -1.016216 -3.624309 -2.801105 -1.232044 
+-0.035710 -0.016183 -0.008970 -0.024726 -0.011487 -0.006404 
+-0.008095 -0.003492 -0.005238 0.038669 0.025658 -0.005522 
+0.059596 0.007827 0.007214 -0.041879 -0.029626 0.011362 
+-0.024049 -0.009961 -0.006237 -0.012278 -0.005438 -0.012405 
+0.005891 -0.002214 -0.014669 0.032876 0.021998 -0.020668 
+0.026954 0.017245 0.001350 0.002407 -0.010093 0.001214 
+-0.010689 -0.020955 0.015128 -0.020319 -0.003413 0.006810 
+-0.002781 -0.002637 0.002582 0.019258 0.013258 -0.005879 
+0.017501 0.042202 0.002700 0.018023 0.015452 0.004299 
+-0.045366 -0.011615 -0.000468 -0.049879 -0.020042 -0.024977 
+-0.004357 -0.009412 -0.006368 0.004765 -0.005752 0.013592 
+0.003380 -0.006154 0.009126 0.005239 -0.006892 0.006339 
+0.005350 -0.009354 0.001848 0.012241 -0.004108 -0.012552 
+0.000403 0.006811 -0.027065 0.032047 -0.031404 -0.036550 
+0.028314 -0.003839 -0.036475 0.015528 0.001341 -0.009113 
+0.018854 0.004315 -0.009837 0.028516 0.017369 -0.020818 
+0.002913 0.009094 -0.016748 -0.004339 0.002675 -0.006225 
+0.004236 0.002996 -0.010465 0.001654 0.001991 -0.004352 
+-0.000775 -0.000080 0.000882 0.000139 0.001662 -0.001995 
+0.007610 0.002709 -0.009065 0.000432 0.007069 0.001899 
+-0.016253 -0.010795 0.015387 -2.135294 -2.100000 2.317647 
+-2.293839 -2.327014 2.336493 -2.057895 -2.010526 1.936842 
+-0.011414 -0.011685 0.008051 0.003115 0.002066 -0.008909 
+0.001548 0.010727 -0.012502 -0.002947 0.002477 -0.003207 
+-0.006341 -0.000485 0.000564 -0.007439 -0.002917 0.003664 
+0.000353 0.003240 -0.004857 0.007100 0.017974 -0.027873 
+0.001956 0.013138 -0.033962 -0.001173 -0.003954 -0.018124 
+-0.004744 -0.013339 -0.005163 0.006063 -0.013504 -0.005328 
+-0.012416 0.006127 -0.002765 -0.012808 -0.004056 0.014381 
+-0.009950 -0.005646 -0.000610 -0.014864 -0.012033 0.002656 
+-0.017514 0.000394 0.003740 -0.023917 -0.003179 0.014596 
+-0.014606 -0.012571 0.006528 -0.009846 -0.009965 0.003661 
+-0.014244 -0.001337 -0.006698 -0.016424 0.007709 0.006673 
+0.005838 0.005083 0.003926 0.006453 0.000343 -0.016865 
+-0.018181 -0.012253 -0.019593 -0.032551 -0.021455 -0.011050 
+-3.770833 -3.062500 -0.381944 -4.092715 -3.523179 0.079470 
+-3.944828 -3.662069 0.268966 -3.466216 -3.668919 0.222973 
+-3.325444 -3.467456 0.053254 -3.518135 -3.170985 -0.046632 
+-3.458128 -2.763547 -0.133005 -2.842105 -2.110526 -0.463158 
+-0.021926 -0.011852 -0.007917 -0.011722 -0.004260 -0.007362 
+0.014120 0.009224 0.005025 0.013429 0.023980 0.034167 
+-0.045107 -0.036883 0.043824 -0.030440 -0.015660 0.013460 
+-0.007105 0.000888 0.007273 0.011220 -0.000907 0.007673 
+0.018078 0.009070 0.009059 0.001543 -0.005432 -0.001914 
+0.004898 -0.023389 -0.005943 0.008934 -0.010963 -0.002809 
+-0.004098 0.007500 -0.000878 0.005865 0.016015 0.008271 
+0.003423 0.006036 0.010952 0.004145 -0.003379 -0.004966 
+-0.012430 -0.014948 -0.007482 -0.022741 0.004788 -0.001995 
+-0.004878 0.001865 0.011978 0.001122 -0.002983 0.019921 
+-0.001864 -0.007486 0.009181 0.000767 0.002386 -0.003715 
+-0.002638 0.014499 -0.013119 -0.044252 0.019238 0.030785 
+-0.028983 0.013938 0.002755 -0.014455 0.022561 -0.007692 
+-0.003812 0.000472 0.009536 -0.003451 0.001716 0.000348 
+0.000229 0.004748 -0.005043 -0.001175 0.005042 -0.005073 
+-0.003729 -0.000458 -0.000669 0.000893 -0.000483 0.000818 
+0.005023 0.002158 -0.000030 0.003883 0.002560 0.000327 
+-0.001951 -0.002633 0.000852 -0.005162 -0.006524 0.002327 
+-0.000023 -0.001774 -0.000158 -0.001416 0.003226 0.000409 
+-0.014337 -0.010752 0.018873 -2.412903 -2.290323 2.496774 
+-2.504504 -2.563063 2.490991 -2.348018 -2.440529 2.273128 
+-0.012165 -0.021047 0.016498 -0.004159 -0.006041 0.001437 
+0.003367 0.003695 -0.013904 -0.002983 0.004325 -0.005741 
+-0.002632 0.002221 -0.003178 0.004570 0.003553 -0.006777 
+0.006752 0.003464 -0.009092 0.003648 0.002445 -0.005159 
+-0.001050 -0.000032 -0.000514 -0.001856 -0.001376 -0.001355 
+0.002336 0.003591 -0.006572 0.003501 -0.001691 -0.003432 
+-0.007594 -0.002433 -0.013883 -0.012432 -0.000728 -0.000416 
+-0.006735 0.000854 -0.001462 0.004383 -0.001452 0.003256 
+0.000446 -0.004233 0.003788 -0.002000 -0.000706 -0.015591 
+0.026904 0.037666 -0.028182 0.002955 0.008855 -0.003931 
+-0.009307 -0.018165 0.011835 0.001626 -0.018183 0.012242 
+-0.001921 -0.001297 0.000707 -0.000107 0.003278 -0.007566 
+0.007870 -0.006903 -0.024935 -0.022879 -0.018653 -0.021040 
+-0.034840 -0.027171 -0.007726 -0.039024 -0.026847 -0.001851 
+-3.304965 -3.319149 0.475177 -3.034014 -3.292517 0.435374 
+-3.193548 -3.303226 0.690323 -3.372093 -3.372093 1.127907 
+-3.184615 -3.200000 0.994872 -2.787440 -2.729469 0.338164 
+-2.393939 -2.055556 -0.368687 -0.022804 -0.014775 -0.007360 
+-0.023089 -0.014361 -0.007351 -0.018740 -0.014875 0.001496 
+-0.031307 0.013000 0.055215 -0.033648 -0.105115 0.060121 
+0.001318 0.014429 0.006079 0.012609 0.002810 0.005889 
+0.002038 -0.007464 -0.003034 -0.022503 -0.030595 0.018986 
+-0.028806 -0.027188 0.025353 0.006644 0.013423 0.010455 
+0.019321 0.040661 0.021148 0.013736 0.034661 0.014634 
+0.005204 0.013221 0.003014 0.001911 0.005716 -0.001414 
+0.003867 0.012696 -0.007018 -0.001715 0.011734 -0.012643 
+0.004246 0.013765 -0.017782 0.009804 0.005098 -0.007647 
+0.001178 0.001459 0.006341 -0.004689 -0.010167 0.011184 
+0.002124 0.002542 -0.002161 -0.012903 0.016872 -0.011339 
+-0.022436 0.017948 -0.015330 -0.020464 0.010663 -0.026461 
+-0.004682 0.010842 -0.017778 -0.000013 -0.001882 -0.002501 
+-0.005313 0.000447 -0.000729 0.000623 -0.005423 0.005167 
+-0.000288 -0.001693 0.008307 0.002152 0.004879 -0.003515 
+0.005003 0.005140 -0.007141 0.006104 0.004768 -0.007326 
+0.009091 0.003671 -0.016518 0.003838 -0.008708 -0.014121 
+-0.006906 0.003117 -0.008040 -0.001339 0.007117 -0.006409 
+-0.010452 -0.007966 0.014841 -2.133803 -2.345070 2.830986 
+-2.685864 -3.062827 3.193717 -2.961905 -3.228571 3.157143 
+-2.601036 -2.637306 2.378238 -0.012996 -0.015024 0.010307 
+0.001403 0.001058 -0.004245 0.004333 0.008191 -0.007989 
+-0.000622 0.001866 -0.003049 0.000355 0.001212 -0.003562 
+0.004309 0.005660 -0.004730 -0.000253 0.006667 -0.005561 
+0.003605 0.003763 -0.008464 0.002628 0.005662 -0.005476 
+-0.002699 0.008830 0.000188 -0.004342 0.009322 0.001717 
+-0.001816 0.008512 -0.001362 0.004450 0.010796 -0.005793 
+0.014452 0.020566 -0.009828 0.019028 0.021766 -0.011788 
+0.020185 0.018367 -0.008896 0.020026 0.014649 -0.012312 
+0.035508 0.034001 -0.017383 -0.010543 0.109573 -0.118609 
+-0.049833 0.050499 -0.077434 -0.002270 -0.016391 0.017959 
+-0.027154 -0.013086 0.013041 -0.030368 -0.036291 0.025449 
+0.029812 0.018158 0.023759 0.016986 0.009200 -0.007821 
+-0.011938 -0.008412 -0.008342 -0.029845 -0.020079 -0.003904 
+-0.036604 -0.025381 -0.001755 -3.520000 -3.264000 0.744000 
+-3.750000 -3.388158 1.559211 -3.584795 -3.543860 2.070175 
+-3.191860 -3.523256 2.215116 -2.756250 -3.125000 1.787500 
+-0.027483 -0.010034 0.009384 -0.019430 -0.018141 0.002516 
+-0.021718 -0.016937 0.001416 -0.019500 -0.027531 0.005810 
+-0.018877 -0.044421 0.025485 -0.044886 -0.037694 0.049920 
+0.007465 -0.040762 0.024011 -0.002732 -0.033934 0.017551 
+-0.003377 -0.020996 0.011342 0.009098 0.004119 -0.004582 
+0.017650 0.013906 0.000650 0.002757 0.011452 0.002395 
+0.001268 -0.005322 0.000428 0.010994 -0.016694 0.012067 
+0.012027 -0.009302 0.002269 0.004819 -0.001510 -0.002772 
+0.004296 0.031704 -0.005481 -0.002475 0.025104 -0.019452 
+0.002593 0.012992 -0.014012 0.001251 0.001555 -0.000627 
+-0.006712 -0.009136 -0.000923 0.000062 -0.004147 0.001928 
+0.008075 0.013593 -0.008748 -0.004978 0.020449 -0.015588 
+-0.012592 0.020589 -0.018362 -0.009824 0.010211 -0.011313 
+-0.005647 0.004224 -0.005794 -0.002479 0.001880 0.000299 
+-0.000336 0.001410 0.004068 0.001331 -0.002764 0.010744 
+-0.008275 -0.009240 0.011355 -0.009556 -0.004444 -0.004778 
+0.000189 0.002556 -0.007711 0.000530 0.003632 -0.004276 
+0.001208 0.002801 -0.004995 0.006711 0.004648 -0.010846 
+0.013240 0.008268 -0.017360 0.014616 0.012461 -0.008862 
+-0.004079 -0.002614 0.010073 -0.020538 -0.016245 0.026925 
+-2.457516 -2.901961 3.542484 -2.933702 -3.176795 3.635359 
+-2.508021 -2.737968 2.882353 -0.012651 -0.017444 0.019556 
+-0.002946 -0.007289 0.006319 0.003010 0.001866 -0.004784 
+0.006000 0.003394 -0.004526 0.005544 0.001585 -0.000177 
+0.006527 -0.000443 -0.000830 0.004325 -0.000544 -0.004538 
+0.003574 0.003786 -0.007428 0.007895 0.010059 -0.012262 
+0.013108 0.022215 -0.014627 0.021320 0.031988 -0.013711 
+0.027466 0.004578 -0.019687 0.021989 0.016080 -0.003039 
+0.014057 0.003222 -0.003718 -0.004201 -0.014305 0.008040 
+-0.014400 -0.026771 0.005577 -0.004800 -0.019970 -0.004793 
+0.004546 -0.002629 -0.002615 0.011843 0.019301 -0.002094 
+0.022224 0.048399 -0.027450 0.107667 0.166977 -0.099499 
+-0.006237 0.018120 -0.016114 -0.002929 -0.075934 0.002329 
+-0.023869 -0.009162 -0.002275 0.011200 0.001000 0.005600 
+-0.012614 -0.001721 0.033462 -0.001317 -0.000970 0.003721 
+-0.006950 -0.004219 -0.023265 -0.023876 -0.022980 -0.014414 
+-0.033748 -0.031384 0.008735 -3.766871 -3.214724 2.042945 
+-3.760870 -3.358696 2.875000 -3.615385 -3.326923 3.173077 
+-0.023998 -0.031827 0.015841 -0.016895 -0.019815 0.010788 
+-0.016511 -0.020812 -0.005166 0.001983 -0.028653 0.001794 
+-0.004002 -0.045684 0.016452 -0.023574 -0.010539 -0.013207 
+0.005629 0.014908 0.009799 0.005000 0.024636 -0.004106 
+-0.016750 0.018090 -0.006648 -0.018238 0.016552 -0.003420 
+-0.010138 0.013793 0.003379 -0.008889 0.003421 0.005551 
+0.006554 -0.004775 -0.002013 0.005413 -0.016653 0.026653 
+-0.006926 -0.022716 0.020742 -0.017366 -0.020685 0.010981 
+-0.018848 -0.010308 -0.016492 -0.006747 0.006219 -0.011555 
+-0.006192 0.007946 0.003877 -0.014170 0.010978 0.001749 
+-0.020412 0.000264 0.003905 -0.007394 -0.009979 0.008790 
+-0.004380 -0.004547 0.004993 -0.006881 0.002157 -0.002300 
+-0.006214 0.009436 -0.011422 -0.002735 0.005995 -0.014113 
+-0.004145 0.000585 -0.004164 -0.007148 -0.005874 0.003557 
+-0.006139 -0.006803 0.010995 -0.008206 -0.005275 0.010775 
+-0.005507 -0.000877 0.007456 -0.000906 0.000373 -0.000909 
+-0.000315 0.003385 -0.007924 -0.000132 0.004283 -0.008056 
+0.000339 0.005226 -0.007864 0.006552 0.009533 -0.008984 
+0.007885 0.015062 -0.007980 0.008834 0.014810 -0.007155 
+0.015372 0.002134 -0.001825 -0.009054 -0.003107 0.020010 
+-0.022498 -0.017340 0.034700 -2.491667 -2.933333 3.375000 
+-0.020224 -0.023809 0.029331 -0.007725 -0.019505 0.017427 
+0.005697 -0.009976 0.000355 0.017349 0.007858 -0.011425 
+0.008016 0.012052 -0.005257 0.003245 0.002430 -0.000307 
+0.001302 -0.000340 0.000653 0.000566 0.002906 -0.001024 
+0.000271 -0.001768 -0.001330 0.001546 0.000684 -0.007170 
+0.001028 0.005405 -0.006380 0.002124 0.014699 -0.009803 
+0.002504 0.025873 -0.012917 -0.002980 0.017515 -0.010397 
+0.006958 -0.005874 -0.003042 0.049617 -0.001725 0.009884 
+0.003855 -0.025301 0.023203 -0.008834 -0.040784 0.022478 
+-0.002223 -0.025295 0.021649 0.000326 -0.008469 0.001951 
+-0.019582 -0.008845 0.021656 -0.086162 -0.075221 -0.015676 
+-0.122222 -0.066111 -0.061667 -0.028764 -0.020397 -0.034023 
+-0.000880 -0.009472 -0.006240 -0.017990 -0.018090 0.007482 
+-0.019048 -0.031310 0.002262 0.001703 0.002353 0.007278 
+0.001046 0.000872 0.010637 0.000102 -0.000162 -0.008600 
+-0.011516 -0.013170 -0.015874 -0.028751 -0.023825 0.005734 
+-3.340136 -2.911565 2.068027 -3.291667 -3.083333 2.851191 
+-2.678161 -2.764368 3.005747 -1.875706 -2.276836 2.819209 
+-1.625731 -2.350877 3.005848 -1.696000 -3.040000 3.808000 
+-0.027844 -0.010472 0.016182 -0.011791 -0.005677 0.008633 
+-0.009648 -0.002013 -0.002076 -0.004086 0.000215 -0.000538 
+0.000674 -0.005191 -0.002346 0.002936 -0.003793 -0.002097 
+0.002676 0.003328 -0.002524 -0.002268 -0.001995 0.000238 
+-0.006482 -0.008720 -0.003031 -0.006932 -0.018712 -0.000723 
+-0.004866 -0.019736 0.003038 0.005169 0.002108 0.006128 
+-0.002582 0.002242 0.003113 -0.002926 0.004655 -0.000881 
+-0.007227 0.005037 0.000803 -0.011259 0.002297 0.001496 
+-0.001205 -0.001206 0.001450 0.000953 -0.003501 0.002194 
+-0.004818 -0.005836 0.003214 -0.009336 -0.006057 0.001366 
+-0.005238 0.005000 -0.000476 0.001711 0.008340 0.001256 
+0.009654 0.009178 -0.007596 0.003977 0.002667 -0.006869 
+-0.003100 -0.002870 -0.002077 -0.004434 -0.001526 0.003040 
+-0.001154 -0.001618 0.003416 0.001508 -0.001713 0.003887 
+0.000938 -0.000521 0.001479 0.000185 -0.000088 -0.005610 
+0.000000 0.003256 -0.011744 0.010454 0.001888 -0.009401 
+0.010211 0.008807 -0.002629 0.005432 0.008919 -0.006478 
+-0.000320 0.003386 -0.004964 -0.007064 -0.009152 -0.000719 
+-0.021288 -0.007574 0.008937 -0.020385 -0.013801 0.023085 
+-0.012398 -0.012720 0.019689 -0.001660 -0.007696 0.006876 
+0.008440 -0.001635 -0.005730 0.014519 0.001068 -0.010559 
+0.011176 0.001369 -0.005302 0.005686 -0.000442 0.001245 
+0.005545 -0.001278 0.003814 0.007930 0.001437 0.004482 
+0.007101 0.001305 0.003595 0.002776 0.002371 -0.000396 
+0.004533 0.009027 -0.004177 0.004184 0.016850 -0.015353 
+-0.003570 0.011510 -0.017601 -0.008966 0.003417 -0.014883 
+0.008524 0.007019 -0.038614 0.040000 0.016429 -0.010000 
+-0.038971 -0.021275 -0.005435 -0.035316 -0.074348 0.012296 
+-0.007497 -0.040006 0.030215 0.030996 -0.001508 -0.002544 
+0.033864 0.016525 -0.018345 0.039070 0.064168 -0.019819 
+-0.039164 0.085714 -0.048955 0.003710 0.018521 -0.014849 
+0.028740 0.019593 -0.012195 0.036334 -0.005863 0.009709 
+0.015332 0.009146 -0.012905 -0.018825 -0.018707 -0.012313 
+0.004265 -0.009001 -0.005924 -0.006280 -0.012942 0.007777 
+-0.015144 -0.016962 -0.001343 -0.021699 -0.011547 -0.004302 
+-0.024465 -0.012162 0.008007 -0.032066 -0.015008 0.024479 
+-2.759494 -2.873418 3.841772 -2.367021 -2.893617 4.085106 
+-1.842365 -2.463054 3.852217 -1.225433 -2.190752 3.624277 
+-0.012468 -0.018635 0.031177 0.007633 -0.016479 0.027345 
+-0.010821 -0.019900 0.013079 -0.010207 -0.013586 0.011310 
+-0.011223 -0.013063 0.000736 -0.019086 -0.005052 0.000702 
+-0.021368 0.001368 0.002966 -0.006366 0.007242 0.001723 
+0.016388 0.010412 -0.000703 0.024644 0.007674 0.000432 
+0.003328 -0.008485 -0.012354 0.000030 0.000457 -0.010540 
+0.002991 -0.002844 0.001470 0.004104 -0.003604 -0.000936 
+0.007567 0.004657 -0.008978 0.005704 0.005171 -0.006952 
+0.000168 0.000668 -0.000462 -0.002999 0.000450 0.001349 
+-0.000165 0.001301 0.000195 0.001976 0.000524 -0.002859 
+0.003282 0.000352 -0.001432 0.000879 0.000854 -0.000209 
+0.000455 0.002471 0.004744 -0.002867 -0.002600 0.004376 
+0.001185 -0.004021 0.004198 0.003294 -0.004039 0.003732 
+0.000693 -0.003038 0.003708 -0.004284 0.001289 0.003778 
+-0.008381 0.002970 0.000324 -0.007240 -0.000512 -0.004551 
+-0.005159 0.005569 -0.005541 -0.003112 0.006787 0.000202 
+0.003783 0.005472 -0.002876 0.001495 0.006019 -0.003814 
+0.002784 0.003814 -0.001546 0.003528 0.000535 0.002522 
+0.002912 -0.005303 0.004478 -0.001820 -0.006515 0.002791 
+0.000805 -0.003333 -0.001495 -0.001686 -0.000274 -0.007704 
+-0.003463 0.001283 -0.006768 -0.001157 0.003086 -0.006295 
+0.002027 0.004878 -0.006760 0.001034 0.002688 -0.004588 
+-0.004783 -0.002779 0.002886 -0.006792 -0.002730 0.010921 
+-0.001009 -0.008367 0.008656 0.003020 -0.001868 0.004699 
+0.004250 -0.000997 0.000310 0.001144 0.000095 0.002845 
+0.002480 0.003025 0.000389 0.004848 0.008028 -0.000742 
+0.003271 0.046551 -0.023169 -0.013333 -0.020000 0.000000 
+0.006427 -0.010099 -0.002851 0.031854 0.008738 -0.013822 
+0.020797 0.032026 -0.027203 -0.021552 0.014556 -0.010061 
+-0.036932 0.013826 0.010279 -0.041106 0.032494 0.040102 
+-0.019500 0.018665 0.010029 -0.028103 -0.000974 -0.023744 
+-0.011648 0.002244 0.009221 -0.005751 0.012847 0.010876 
+0.007585 0.012852 -0.001866 -0.002434 0.002487 -0.009114 
+0.006327 -0.008744 -0.010020 0.012144 0.001425 -0.007184 
+0.011849 0.004556 0.017060 -0.016809 -0.017502 0.025970 
+-0.029118 -0.011583 0.017006 -0.036519 -0.008613 0.022974 
+-0.036665 -0.014076 0.042302 -2.017241 -3.362069 4.353448 
+-0.010599 -0.016013 0.039581 -0.004337 -0.019955 0.027995 
+-0.005959 -0.019356 0.015863 -0.001209 -0.005405 0.003407 
+0.021332 0.002288 0.002524 0.015007 0.003343 0.004063 
+-0.001285 -0.012817 0.005847 -0.009105 -0.015754 0.008615 
+-0.006459 -0.002918 0.002235 0.004430 0.014162 -0.005356 
+0.005417 0.012331 -0.000949 0.000006 -0.001663 -0.002481 
+-0.004324 -0.002033 0.016122 -0.006984 -0.000445 0.010579 
+-0.005476 0.003634 0.000694 -0.004658 0.007332 -0.003671 
+-0.002392 0.007223 -0.004177 -0.001772 0.007183 -0.003483 
+0.002433 0.006016 0.001923 -0.009359 -0.002943 0.000179 
+-0.012930 -0.009014 0.004275 -0.009891 -0.008200 0.000998 
+-0.000415 0.000648 0.002730 0.003559 -0.000406 -0.000861 
+0.001968 0.000923 -0.003366 0.001165 -0.000018 -0.000749 
+-0.000948 -0.001061 -0.000265 -0.003751 -0.000312 -0.002499 
+0.000008 -0.000468 0.001020 0.000043 0.000459 -0.001024 
+0.003403 0.006126 -0.001191 0.000952 0.001459 -0.008882 
+-0.004632 -0.000323 -0.006176 -0.005722 -0.001664 -0.000994 
+-0.001899 -0.001739 -0.000358 0.003551 -0.001955 -0.002487 
+0.006070 -0.002996 -0.004063 0.005109 -0.001326 -0.000231 
+0.003931 0.004000 -0.001426 0.004195 0.005656 -0.002920 
+0.002696 0.004981 -0.002786 0.000889 0.001048 -0.000824 
+0.000260 -0.000418 0.000268 -0.001333 0.000495 -0.001002 
+-0.000830 -0.000433 0.000031 -0.000845 -0.001176 0.000793 
+-0.001836 0.000976 -0.002538 0.000463 0.004999 -0.010304 
+0.004975 0.001463 -0.011207 0.002530 0.008188 -0.001300 
+-0.000333 0.000925 -0.000874 -0.004750 -0.000740 0.002264 
+-0.001544 0.005235 0.007382 0.001652 0.000441 0.004635 
+-0.000601 0.011305 -0.009186 -0.019740 -0.008896 0.003961 
+-0.008933 -0.025333 0.007467 -0.000740 -0.006451 0.004359 
+0.002392 0.000392 0.003804 -0.031888 0.019483 0.004072 
+-0.023598 -0.007172 -0.017959 -0.022538 -0.007000 -0.007308 
+-0.004879 -0.005459 -0.002415 0.002619 0.005057 0.002789 
+0.007989 0.012147 0.013587 0.002990 0.005074 0.013275 
+0.000769 0.003077 -0.001538 -0.004384 -0.002938 0.010139 
+-0.005383 -0.003072 0.007372 -0.005160 -0.003870 0.005000 
+0.000009 -0.004618 -0.003727 0.002793 -0.005552 -0.005433 
+-0.052582 -0.014225 0.031930 -0.036936 -0.010674 0.031035 
+-0.037592 -0.006704 0.030744 -0.027564 -0.003946 0.032133 
+-0.008652 -0.002001 0.028341 0.004200 -0.008162 0.016099 
+0.000116 -0.004604 0.002803 -0.002711 0.004613 0.008484 
+0.016921 -0.007808 0.001735 0.019486 -0.014624 0.000002 
+0.015079 -0.008302 0.001336 -0.010459 -0.015514 0.013108 
+-0.014068 -0.027029 0.013453 0.005957 -0.009774 0.004222 
+0.006723 -0.005324 -0.009655 0.010291 -0.001849 -0.005088 
+-0.003333 -0.008333 0.010833 -0.007465 -0.002634 0.009827 
+-0.000976 0.004465 -0.002257 0.005580 0.005430 -0.005147 
+0.007792 0.003901 -0.002999 0.005766 0.000977 -0.000669 
+0.002421 -0.001547 0.000067 -0.000873 -0.001389 0.000913 
+-0.003208 0.001017 -0.000676 -0.002600 0.001677 -0.000593 
+-0.000314 -0.000352 -0.000358 0.001653 -0.000818 0.000242 
+0.002303 0.000363 0.000643 0.002228 0.001728 -0.001690 
+0.005386 0.004663 0.002200 0.008678 0.001993 -0.000136 
+0.006894 -0.000402 -0.000144 0.003152 -0.000054 -0.000707 
+-0.001720 0.001244 -0.006841 -0.002990 0.003381 -0.006156 
+-0.002397 0.001273 -0.003558 -0.000984 0.002293 -0.000071 
+-0.000179 0.000670 0.000291 0.000699 -0.003554 -0.002134 
+-0.000395 -0.007892 -0.003584 -0.001747 -0.008503 -0.001422 
+-0.001069 -0.003293 0.000247 0.000355 0.000228 -0.000074 
+0.001681 -0.003321 0.000508 0.000059 -0.008581 0.000676 
+-0.003293 -0.007290 0.003116 -0.003532 -0.003947 0.003449 
+-0.001394 -0.003738 0.002963 -0.001402 -0.002705 0.001910 
+0.000237 -0.000167 0.000266 0.002363 0.003939 -0.002829 
+0.003410 0.005451 -0.006195 0.004430 0.002791 -0.003951 
+0.001088 -0.000027 -0.000550 -0.006339 0.001601 0.000571 
+-0.006579 0.007874 -0.004465 -0.005074 0.010495 -0.006374 
+-0.001408 0.017616 -0.013528 0.012606 0.025600 0.009284 
+-0.012500 -0.012500 0.017500 -0.003825 -0.011063 0.003628 
+-0.005173 0.000896 -0.001748 0.006913 0.016113 -0.004756 
+-0.001667 -0.001250 0.004583 0.003023 -0.021661 0.021087 
+-0.001950 0.014659 0.027618 0.000883 0.006709 0.022688 
+0.013242 0.012790 0.007005 0.013054 0.015204 -0.003355 
+0.005238 0.006905 -0.001190 0.004822 -0.003375 -0.006268 
+0.002196 0.006314 -0.021686 -0.002183 -0.001355 -0.003970 
+-0.002430 -0.015237 0.004447 -0.019582 -0.012309 0.000970 
+-0.001160 -0.019166 0.021917 0.009810 -0.006679 0.022858 
+-0.024772 -0.038819 0.060808 -0.014831 -0.016488 0.028206 
+-0.002193 -0.006165 0.015671 0.006690 -0.001966 0.003369 
+0.011436 -0.001045 -0.003187 0.009152 -0.002241 -0.008283 
+-0.003841 -0.008986 -0.000942 -0.017979 -0.014895 -0.000135 
+-0.014194 -0.007040 -0.002106 0.001822 0.005932 0.004157 
+0.009073 -0.002781 0.000405 0.007435 0.000498 -0.022810 
+0.006330 -0.000360 -0.007668 0.002001 -0.002385 0.000235 
+0.001869 -0.000512 -0.000544 0.001864 0.001113 -0.001545 
+0.000555 -0.001576 0.000637 0.000524 -0.003477 0.000679 
+0.003144 -0.002979 -0.002317 0.010044 0.002595 -0.003943 
+0.012692 0.001331 -0.000053 0.010918 0.000543 0.003439 
+0.005242 -0.000868 0.003208 0.001886 -0.001350 0.000316 
+0.001575 -0.003494 -0.001184 -0.000042 -0.005213 0.000006 
+-0.002286 -0.001533 0.003225 -0.005001 0.004091 0.003861 
+-0.002750 0.008643 0.001866 -0.001021 0.003328 -0.000221 
+0.002130 -0.000715 -0.000636 0.000861 0.001213 -0.000757 
+0.002569 -0.003059 -0.004098 0.000685 -0.004996 -0.002726 
+-0.001734 -0.003584 0.000175 0.000543 -0.000146 0.000459 
+0.000252 0.005479 -0.000315 0.000665 0.005862 -0.001094 
+0.002161 0.000680 -0.001608 0.001813 -0.003019 -0.000140 
+-0.000605 -0.001741 0.000877 -0.001703 0.002579 -0.001217 
+-0.002111 0.003700 -0.002878 -0.002835 0.001692 -0.000220 
+-0.002733 -0.002034 0.002671 -0.000621 -0.001172 0.003050 
+0.003784 0.001083 -0.001358 0.006351 0.000386 -0.007123 
+0.001274 0.004484 -0.006984 0.003536 0.004885 -0.004120 
+0.005265 0.002888 -0.002207 0.003106 0.001934 0.000112 
+-0.004514 0.003465 0.004078 -0.014216 0.005352 0.007532 
+-0.011218 0.004077 0.012237 0.002364 0.004069 0.001606 
+0.005105 0.004926 0.003722 0.010871 -0.005159 0.029803 
+-0.012857 0.000286 0.026571 0.010367 0.018988 -0.016340 
+0.017523 0.010408 -0.009881 0.006294 0.018776 0.009900 
+-0.021096 -0.006492 0.000161 -0.024720 -0.000916 -0.034792 
+-0.004153 -0.004797 -0.009909 0.001976 -0.003239 -0.002750 
+0.002011 0.001743 -0.003909 0.009390 0.009164 -0.013189 
+0.012577 0.005644 0.011190 0.011447 -0.012893 -0.002562 
+0.011055 -0.006270 0.004044 -0.008825 -0.012720 0.001613 
+-0.023773 -0.022309 0.017971 -0.018028 -0.011393 0.012639 
+0.003249 0.024081 0.003058 0.041464 0.019632 0.043506 
+0.022020 0.019192 0.031616 -0.018751 -0.033659 0.036978 
+0.014014 0.017036 -0.009720 0.016743 0.025511 -0.010717 
+0.020932 0.015319 -0.005928 0.021213 0.002019 -0.007169 
+0.001555 -0.000280 0.001080 -0.012027 0.003940 0.023021 
+-0.006454 -0.000510 0.014269 0.003964 -0.001437 -0.000321 
+0.006989 -0.004696 -0.007135 0.011518 -0.002504 -0.014519 
+0.013292 0.000722 -0.011070 0.008600 -0.000317 -0.005283 
+0.001583 -0.000719 -0.000498 -0.000466 -0.001105 0.001338 
+0.002554 -0.000892 -0.000184 -0.001075 -0.000920 -0.002364 
+0.005182 -0.002515 -0.003383 -0.002068 -0.004875 -0.002085 
+-0.003109 -0.002276 -0.002615 -0.000877 -0.001647 -0.001583 
+0.003475 -0.002134 0.001032 0.007531 0.003331 -0.000049 
+0.006793 0.001839 -0.002052 0.003895 0.001236 -0.002478 
+0.002266 0.002790 -0.001311 0.001691 -0.001403 0.000629 
+-0.002179 -0.005129 0.004184 -0.004015 -0.002803 0.003813 
+0.003216 0.001608 0.002268 0.000694 0.001840 -0.005069 
+-0.001684 -0.000737 -0.002421 -0.001634 -0.004404 -0.003102 
+0.000405 -0.005710 -0.000412 0.001183 -0.001321 0.001725 
+0.004515 0.002392 -0.001102 0.001844 0.001498 -0.001441 
+-0.000409 -0.000886 0.000404 0.001028 -0.001699 -0.000191 
+0.003873 0.000416 -0.000358 0.002240 0.001120 -0.000747 
+0.000222 -0.000667 0.000778 -0.000449 0.000449 -0.000225 
+-0.000885 0.000406 -0.000698 0.000158 0.003652 0.002778 
+-0.000560 0.006013 0.004424 -0.000879 0.004164 0.004822 
+0.000767 0.001377 0.002243 -0.000333 0.001607 0.001920 
+0.002809 0.000898 0.001167 0.000853 -0.001108 -0.001397 
+-0.002238 -0.004696 -0.000445 -0.008084 -0.005897 0.003981 
+-0.011693 -0.001394 0.005287 -0.003627 0.000480 -0.000474 
+0.000938 0.006664 -0.009475 -0.000336 0.011446 -0.014249 
+-0.022325 0.044697 -0.089292 -0.014722 0.016944 -0.046389 
+0.001197 -0.006986 0.004079 0.009060 -0.005889 -0.005346 
+0.006510 -0.007581 -0.001084 -0.002121 -0.001485 -0.000515 
+-0.002982 0.002516 -0.002330 0.001674 -0.004764 -0.005311 
+-0.003608 -0.008961 -0.005067 0.007762 -0.009275 -0.007361 
+0.003340 -0.008354 -0.003625 -0.001392 -0.007096 -0.007699 
+-0.008057 -0.023199 -0.000880 0.000677 -0.024231 -0.000279 
+-0.005459 -0.006000 -0.001365 -0.009834 0.001737 -0.003760 
+-0.000005 0.001600 0.001200 0.009363 0.004673 -0.000203 
+0.013052 -0.003921 -0.010843 0.027367 -0.039798 0.011097 
+-0.004420 -0.004922 0.000401 -0.000213 -0.000200 -0.004276 
+-0.000460 0.000457 0.003377 -0.005203 -0.002205 0.007561 
+0.011815 -0.021947 0.001826 0.007114 -0.002305 0.002862 
+-0.005371 -0.001131 0.002977 -0.006459 0.000327 0.001134 
+0.001592 -0.002545 0.002955 0.003652 -0.005134 0.003716 
+0.001847 -0.003472 0.003160 0.000555 -0.001458 0.001631 
+0.000707 0.000130 0.000156 0.000043 -0.000860 0.000097 
+0.001132 -0.002209 0.001987 -0.002805 -0.005700 0.000219 
+-0.002280 -0.004630 -0.001232 -0.000315 -0.003272 -0.000881 
+0.001338 -0.001534 -0.000047 0.002061 -0.000830 -0.001133 
+0.001305 -0.002799 -0.000128 0.006025 -0.001576 -0.000364 
+0.003299 0.006024 -0.000918 0.000360 0.006867 -0.008140 
+0.003027 0.002990 -0.007531 0.001980 0.002999 -0.001769 
+0.001992 0.003987 -0.001496 -0.000894 0.006184 -0.002198 
+0.001137 0.003507 -0.002062 -0.001087 -0.001109 0.001102 
+0.001415 -0.003837 0.003735 0.007863 -0.000965 0.004005 
+0.011222 0.001342 0.001534 0.006678 0.002747 -0.001336 
+-0.002143 0.002109 -0.001200 -0.005985 0.001176 -0.001373 
+-0.002837 0.002125 -0.001450 0.000722 0.001522 0.000029 
+-0.001661 -0.001379 0.000195 -0.007986 -0.004062 0.001239 
+-0.007567 -0.002500 -0.001892 -0.003104 0.003768 0.000720 
+0.001734 0.001859 0.002820 0.003167 0.000500 -0.001112 
+-0.000668 -0.003035 -0.000546 -0.001875 -0.001441 0.000229 
+0.003664 0.004629 -0.001939 0.008389 0.008889 -0.008389 
+0.012835 0.007470 -0.002848 0.006184 0.000304 -0.002720 
+-0.003738 -0.003674 0.001524 -0.007148 0.000885 0.002818 
+0.000508 0.002625 0.004776 0.006309 0.004821 -0.004965 
+0.002005 0.013241 -0.005820 0.002474 0.014105 -0.004032 
+-0.002480 -0.007739 0.001510 -0.007349 -0.027879 -0.007095 
+-0.005563 -0.008715 -0.001217 0.006562 -0.001771 -0.005082 
+0.020501 0.008369 -0.027447 0.018891 0.054168 -0.018981 
+-0.000572 0.015377 -0.011701 -0.003624 -0.014039 -0.002629 
+-0.023288 -0.005960 0.012182 -0.017193 -0.000579 0.020912 
+0.004656 -0.004664 0.005327 0.003425 -0.002262 0.005969 
+-0.002468 -0.004722 -0.000176 -0.003944 -0.003377 0.000783 
+0.000013 -0.003619 0.000208 -0.004504 -0.006925 0.000570 
+-0.008638 -0.000985 -0.004297 -0.016437 -0.003597 0.001687 
+-0.008910 -0.018073 0.001226 -0.005662 -0.068316 -0.019473 
+0.052090 -0.081493 -0.030199 0.005860 0.009721 0.004406 
+-0.006175 -0.007439 0.004973 -0.008219 0.000878 0.006397 
+0.015311 -0.012332 0.004393 0.002458 -0.008339 0.005796 
+-0.000693 -0.006666 0.005362 0.001107 -0.004888 0.003093 
+0.001649 -0.002059 0.001179 0.000204 0.000625 -0.000662 
+-0.001562 0.001424 -0.002490 -0.000446 0.002666 -0.001802 
+-0.002549 0.004246 -0.000166 0.001716 0.005119 -0.000703 
+0.003884 0.002119 0.000694 0.004251 0.000105 0.000301 
+0.002741 0.002388 0.000632 -0.001198 0.005661 0.000207 
+-0.001841 0.003905 -0.002413 0.000285 -0.000190 0.002247 
+0.001119 -0.004021 0.005734 0.007612 -0.001946 0.001238 
+0.009105 -0.000212 -0.002118 0.001831 0.001672 0.003026 
+-0.004998 -0.006874 0.011719 -0.009156 -0.007610 0.009036 
+-0.003130 -0.006992 0.000599 0.000625 -0.002083 0.000208 
+0.000172 -0.001456 0.000741 0.001841 -0.001988 -0.000467 
+0.002675 -0.004723 -0.003740 0.004614 -0.005320 -0.002020 
+0.007024 -0.002056 -0.002570 0.002775 0.003169 -0.001987 
+0.001290 0.004194 -0.002043 0.003425 0.004316 0.000527 
+0.000594 0.001684 0.000123 -0.003019 -0.002529 -0.000403 
+-0.001428 -0.004204 -0.000333 0.005230 -0.002420 -0.001852 
+0.005288 -0.002320 0.004824 -0.001894 -0.002160 0.010305 
+-0.007312 -0.004938 0.014240 -0.005696 0.001266 0.009494 
+-0.000129 0.004945 -0.000504 0.002909 0.009456 -0.008313 
+0.010038 0.010690 -0.009126 0.010669 0.013081 -0.004823 
+0.006772 0.010042 -0.002841 0.001998 0.004308 -0.000730 
+-0.003707 0.002395 0.000393 -0.005660 0.003482 0.001189 
+-0.005409 0.003349 0.001908 0.000000 0.001143 0.007143 
+0.000759 -0.002550 0.002924 0.000094 -0.000727 0.000825 
+0.009230 0.032549 -0.012072 0.023333 0.000342 0.000513 
+-0.003516 -0.023743 0.017026 -0.002444 -0.002631 0.003280 
+0.008333 0.000000 -0.002778 0.018336 -0.011706 -0.000986 
+0.013214 0.000357 0.012143 -0.001701 0.007816 0.020391 
+0.005642 -0.000835 0.024137 -0.002648 0.010484 0.004451 
+0.003685 0.009065 0.003652 -0.005644 -0.004123 -0.006396 
+-0.006923 -0.013414 -0.000081 0.002706 -0.014674 0.004504 
+0.017236 -0.008171 -0.000783 0.001322 0.003305 0.001028 
+-0.001343 0.007565 0.000426 0.002537 0.004105 0.000295 
+0.013704 -0.011596 -0.010941 -0.004639 -0.041824 0.001534 
+-0.030888 -0.020959 0.027837 0.008544 0.009685 -0.004787 
+-0.001753 -0.004191 -0.002801 0.014657 0.007439 -0.008170 
+0.005046 0.002987 0.001850 0.006047 0.001435 0.003300 
+0.009885 0.002047 -0.001068 0.006946 0.002663 -0.000774 
+-0.002660 0.002329 -0.000413 -0.008853 0.000330 -0.001262 
+-0.006770 -0.000125 0.003301 0.000974 0.000581 -0.002000 
+-0.004174 0.003370 0.014286 -0.008417 0.050228 0.067260 
+0.049250 0.008250 -0.015000 0.009033 0.003132 -0.002766 
+0.012239 -0.002574 0.011911 0.001995 0.002585 -0.004332 
+0.000331 0.002831 -0.011066 0.033317 -0.005519 0.032397 
+0.061897 -0.024759 0.027000 -0.019669 0.005054 -0.036196 
+0.005246 0.009560 -0.012112 0.009414 0.004459 -0.008367 
+0.000819 0.004435 -0.001789 -0.000010 0.015538 0.001948 
+0.010583 0.016185 -0.000406 0.003607 -0.000133 0.003407 
+-0.000302 -0.001463 0.000423 -0.001008 -0.004975 0.004944 
+0.003762 -0.006729 0.008922 0.004045 -0.006667 0.006469 
+0.002348 -0.003663 0.003689 -0.001749 0.002693 -0.000365 
+0.024344 0.059111 -0.017945 0.053253 0.066188 -0.004678 
+0.022316 0.034769 0.013377 0.020719 0.029286 0.002825 
+0.026418 0.070707 0.015762 -0.005765 0.008471 0.003529 
+0.026244 -0.002512 0.003537 0.012942 -0.025694 -0.008819 
+0.067339 -0.026898 -0.017681 0.018671 -0.057273 -0.001334 
+0.001000 0.039371 0.002812 -0.026364 0.087687 0.027402 
+-0.040000 0.003765 0.015059 0.001653 0.013620 -0.010050 
+-0.003575 0.011817 -0.017079 0.004688 0.003055 0.005463 
+0.001375 -0.001201 0.000267 -0.014053 -0.013161 0.001884 
+-0.018528 -0.008519 0.006617 -0.004473 -0.005610 0.017566 
+0.010468 -0.057881 -0.003079 -0.017274 -0.005067 -0.000978 
+-0.013483 -0.005438 -0.000176 -0.006114 -0.013009 0.007329 
+0.006359 -0.012797 0.013757 0.016111 -0.006212 0.016313 
+0.013563 -0.009943 0.017184 0.007290 -0.015810 0.021355 
+-0.005008 0.004715 0.016650 0.035690 0.023131 -0.001828 
+0.029445 0.014798 -0.012800 0.006238 -0.002206 -0.006299 
+0.005792 -0.001521 -0.000902 0.010110 -0.000320 0.006307 
+0.011101 -0.000551 0.011265 0.009335 -0.003286 0.010094 
+0.007707 -0.002451 0.018577 -0.044442 0.024505 0.004982 
+0.008044 0.084400 -0.039244 0.043442 -0.007350 0.035154 
+-0.009185 -0.016941 0.017182 0.000108 -0.005418 0.009295 
+0.001541 0.011806 0.003491 -0.000320 0.009098 0.003495 
+0.003161 0.004648 0.003195 0.006581 0.003415 0.001655 
+0.022439 0.019486 -0.002657 0.025185 0.022462 -0.001775 
+0.021273 0.013494 -0.002693 0.008401 0.007448 -0.007222 
+-0.000615 0.007566 -0.006095 -0.011080 0.009072 -0.010642 
+-0.007282 0.003850 -0.016613 -0.008824 0.019897 -0.016264 
+0.001539 0.008061 0.009317 -0.032652 -0.005414 0.032161 
+-0.007487 0.005171 0.011896 -0.003411 0.008538 0.009052 
+-0.001899 0.006126 0.001190 -0.003978 0.013054 -0.016473 
+0.007988 0.013874 -0.026592 0.007880 0.003337 -0.010321 
+0.038834 0.035541 -0.018110 0.100576 0.058394 -0.027576 
+0.008183 0.021079 -0.024822 0.018742 0.017494 -0.017706 
+0.010263 0.007252 0.005062 -0.001058 0.002414 -0.000397 
+-0.011645 -0.013101 0.019654 -0.016732 0.000080 0.022576 
+-0.008870 0.003975 0.033234 0.009465 0.012387 0.016770 
+0.012953 0.004006 0.005848 0.002746 -0.000906 0.000137 
+-0.004140 0.003163 0.001976 0.007991 -0.001425 -0.004222 
+0.059347 0.009184 -0.012878 0.045817 0.011635 -0.003636 
+0.003865 0.014597 0.000976 0.037738 0.105676 0.005033 
+0.060267 -0.113369 -0.035401 0.005000 0.083462 -0.029231 
+0.043832 0.033405 -0.017763 -0.002069 -0.000884 0.004871 
+-0.015905 0.037692 0.027834 -0.113789 0.008447 0.038634 
+0.013969 -0.026706 -0.003376 0.028836 -0.005845 0.007339 
+0.025963 -0.004976 0.003914 0.006145 0.007135 0.008634 
+0.002956 0.017718 -0.004130 0.001594 0.006581 -0.003883 
+0.001909 -0.001409 0.001072 -0.001549 -0.011220 0.004631 
+-0.009000 -0.019166 0.008109 -0.001233 -0.015966 0.004285 
+-0.004258 -0.003258 -0.006895 0.028486 0.021047 -0.033800 
+0.003946 0.009950 0.006502 0.002817 -0.014321 0.003363 
+0.004693 -0.019450 0.006022 0.007189 -0.004500 -0.001917 
+0.014660 0.019429 -0.001210 0.010087 0.022947 -0.015728 
+0.006213 0.006269 -0.005541 -0.005483 0.013391 0.002136 
+0.022476 -0.004495 0.025625 0.011471 0.009856 0.038051 
+-0.016619 0.005771 0.025509 -0.006241 -0.001449 0.001751 
+0.002899 0.004169 0.002490 0.002073 0.008533 0.009900 
+0.003895 0.019509 0.013305 0.005749 0.016477 0.004251 
+0.009692 -0.005923 0.005231 0.043308 0.000700 0.005527 
+0.019447 0.018778 -0.005344 -0.001392 0.021750 -0.008965 
+0.003013 0.010237 0.001346 0.005193 0.009540 0.004260 
+0.008140 0.007842 0.003903 0.006924 0.003881 0.000415 
+-0.004471 0.018800 -0.036193 0.012945 0.015681 -0.019199 
+0.026135 0.011824 -0.013195 0.012392 0.007486 -0.021943 
+-0.010918 0.018123 -0.020334 -0.020348 0.008995 -0.024380 
+-0.010727 -0.002878 -0.011677 -0.004031 -0.006085 0.001248 
+-0.005504 0.007322 0.003772 -0.006768 0.000093 0.009782 
+-0.007305 -0.028410 0.014611 0.034930 -0.011041 -0.022396 
+0.025499 0.012764 -0.001953 0.015933 -0.006140 -0.000383 
+-0.009551 -0.005212 -0.000986 -0.035507 -0.009037 0.009685 
+-0.019164 -0.013305 0.012430 -0.002923 -0.001600 -0.003415 
+-0.032727 0.009650 -0.006434 -0.023450 0.006899 -0.028971 
+0.008699 0.007028 -0.003852 0.012154 0.006927 0.012400 
+0.011635 -0.010081 0.018808 -0.001706 -0.015106 -0.002036 
+-0.007916 -0.023189 0.002439 0.009354 -0.005481 0.005965 
+0.022444 0.007481 -0.012593 0.006753 0.006688 -0.026818 
+0.010205 0.017166 -0.008012 -0.000075 0.009721 0.004617 
+-0.026989 -0.034803 -0.001326 -0.017441 -0.032659 -0.024828 
+0.017917 -0.033750 0.010000 -0.008974 0.010769 0.003590 
+0.022546 -0.012176 -0.031343 0.066181 0.020413 0.006255 
+0.075959 0.058000 -0.033759 -0.004065 0.035691 -0.032642 
+-0.051667 0.000000 -0.008333 -0.071397 -0.000564 -0.053971 
+-0.030829 -0.003748 -0.015093 0.004337 0.010663 -0.000703 
+0.024175 0.029469 -0.011495 0.041867 0.059067 -0.032000 
+0.050943 0.039149 -0.046966 0.031225 0.022232 -0.017713 
+0.009168 0.009154 -0.004918 0.002007 0.012842 -0.008347 
+0.000739 0.011195 -0.010050 -0.003311 0.002877 0.003156 
+0.005766 -0.017121 0.009434 0.006683 0.004365 0.030286 
+0.016517 0.000020 0.012422 0.008187 -0.003069 0.003480 
+0.016084 -0.004935 -0.001335 0.020286 0.007143 -0.006000 
+-0.007849 0.017957 -0.016882 0.001105 -0.002075 -0.007106 
+0.004181 -0.003942 -0.001255 0.013682 -0.029907 -0.004120 
+-0.035957 -0.013140 0.086989 -0.166513 -0.023282 0.064205 
+-0.000440 0.005330 -0.017747 0.002095 -0.025995 -0.043183 
+-0.016422 -0.021587 -0.024779 -0.022667 0.012232 0.012997 
+-0.000105 0.040862 0.030629 0.020156 0.000522 0.019844 
+-0.114899 -0.025426 0.035202 -0.100926 -0.089074 0.000370 
+-0.006273 0.002287 -0.001382 0.022669 0.026671 0.008290 
+0.001133 0.006052 0.000030 -0.001283 0.002569 -0.001567 
+-0.000033 0.002672 -0.001413 0.000786 0.001347 -0.000469 
+0.030381 0.029095 -0.003120 0.015880 0.035118 -0.010627 
+0.019406 0.032832 -0.022133 0.007585 0.016885 -0.038254 
+-0.001713 0.027299 -0.040896 0.034728 0.044390 -0.043606 
+0.027227 0.062807 -0.014387 0.020791 0.034168 -0.009307 
+0.007748 0.023096 -0.007630 0.007120 0.013896 0.000540 
+0.001645 0.005683 -0.023178 0.005059 0.004186 0.001035 
+0.027364 0.026059 0.003803 0.006091 0.010102 0.003383 
+0.004500 0.004500 -0.003000 -0.003864 0.018585 -0.010259 
+0.004511 0.006963 -0.002470 -0.001702 -0.001568 -0.004121 
+0.003669 0.002675 0.001148 0.019937 -0.022311 0.037230 
+-0.005960 -0.002600 0.028720 -0.023927 -0.022161 0.011536 
+-0.027413 -0.029936 0.025245 -0.002148 -0.046727 0.020887 
+0.006000 -0.036179 0.004341 0.002308 -0.004545 0.000734 
+-0.005827 0.012222 -0.002266 0.002878 0.012069 0.000151 
+0.007516 0.001356 -0.001666 -0.004161 -0.002547 -0.000311 
+-0.019895 -0.003883 0.000636 -0.031880 -0.006856 0.004855 
+-0.034196 -0.021961 0.026196 -0.008697 -0.035840 0.033403 
+0.000864 -0.003765 -0.000802 0.007792 0.008312 0.001169 
+0.006536 0.019788 -0.013612 -0.021578 0.014262 -0.018327 
+0.091818 0.004727 -0.002364 0.077239 0.018906 0.010683 
+0.040745 0.056667 -0.002910 0.047273 0.066238 -0.008280 
+0.034652 0.022288 0.010152 0.004167 0.003616 0.006509 
+0.000833 -0.050000 -0.050000 0.015934 -0.015552 0.004055 
+0.005717 0.014231 0.001651 -0.001955 0.005769 -0.008796 
+0.000323 0.006406 -0.001531 -0.002959 -0.006263 -0.003318 
+0.010223 -0.001655 0.002353 0.015556 -0.004993 0.008511 
+0.001457 -0.000781 0.000820 -0.002817 0.001950 -0.008958 
+-0.003726 0.006892 -0.012940 -0.004020 0.009382 -0.017545 
+-0.006943 0.003821 -0.022379 0.001209 -0.001287 -0.016622 
+-0.006206 0.007968 -0.007063 0.014372 -0.008485 -0.007359 
+0.047692 0.055385 0.087692 0.056723 0.016004 0.033932 
+-0.043750 0.008750 -0.061250 -0.050046 0.040277 -0.058341 
+-0.043535 -0.024141 -0.005859 -0.007941 0.003154 0.021373 
+0.012231 0.007608 0.009597 0.001319 0.000022 0.006659 
+-0.005327 0.009212 0.012486 -0.024366 0.008098 0.011912 
+-0.041037 -0.008224 -0.000326 0.010823 -0.004022 0.005073 
+0.000622 0.023137 -0.006869 -0.002653 0.001356 -0.001212 
+-0.010516 -0.012998 0.003521 -0.009884 -0.012411 0.003877 
+0.009506 0.000600 -0.010550 0.029201 -0.012865 0.000932 
+0.023483 -0.005655 0.013808 0.010456 -0.002568 0.003487 
+-0.014752 0.005167 -0.021338 -0.060706 0.003183 -0.019213 
+-0.030052 -0.002900 0.034665 -0.024385 -0.004349 0.035490 
+-0.018302 -0.009655 0.027454 -0.017874 0.006440 0.013800 
+0.002722 0.042702 0.005930 0.009377 0.037656 -0.000073 
+-0.098435 -0.072279 0.004484 -0.058260 -0.053022 -0.001963 
+0.010527 -0.000374 -0.002894 0.041512 0.024438 -0.037992 
+0.013016 0.046311 -0.014044 0.012947 0.005841 0.007847 
+0.025339 0.015450 -0.011744 0.015037 0.018639 0.003556 
+0.012012 -0.005212 0.015184 0.051111 -0.014444 0.000000 
+0.002590 0.002972 -0.005733 -0.002323 0.015263 0.005808 
+-0.001739 0.017391 0.012174 0.026828 0.028800 0.010731 
+0.021087 0.022246 -0.000267 0.009467 0.015710 -0.002870 
+0.005768 0.015566 -0.003919 0.001989 0.020057 0.002185 
+0.001492 0.011199 0.005102 -0.007727 -0.003625 0.002604 
+-0.036077 -0.015235 0.016963 -0.078082 -0.012015 0.043534 
+-0.036502 0.013706 0.028950 0.005263 -0.002526 0.001263 
+0.017778 0.022778 0.004444 -0.009347 0.030611 -0.019722 
+0.017175 0.014513 -0.003701 0.056838 0.007778 0.003504 
+0.043003 0.004777 0.007764 0.026627 0.016875 0.011095 
+0.000671 -0.003122 -0.001671 0.010127 -0.019004 -0.020380 
+0.002882 -0.036095 -0.038896 0.008971 -0.038914 -0.025143 
+0.011907 -0.008412 0.001424 0.005353 0.007177 0.001678 
+-0.009032 0.002776 0.001525 -0.010952 0.005519 -0.005035 
+0.028241 -0.014896 -0.007913 -0.008627 0.004783 -0.007988 
+-0.009686 -0.004337 -0.010944 -0.001447 -0.001129 -0.006640 
+0.001315 0.004609 -0.004772 -0.004114 0.007291 -0.008431 
+-0.001126 0.006308 -0.008121 -0.013836 0.008172 0.019858 
+-0.084309 -0.066884 0.078807 -0.061017 -0.092944 0.022446 
+0.076033 -0.025933 -0.004833 0.079000 -0.079000 -0.054000 
+0.026029 0.038897 -0.000147 0.000918 0.084184 0.126735 
+-0.012000 0.007778 0.006000 0.000000 -0.121111 -0.003333 
+0.051782 -0.054901 0.008267 0.006750 -0.006275 0.023575 
+-0.003929 0.003929 -0.001429 0.021320 0.013421 0.006509 
+0.010498 0.046220 0.011599 -0.017733 0.015779 -0.001456 
+-0.001317 -0.018081 0.007761 0.005863 -0.001271 0.002370 
+-0.014802 -0.010968 0.005737 -0.028324 -0.022356 0.013766 
+-0.005434 -0.000337 -0.003017 0.004852 0.000347 0.004899 
+0.024187 0.017277 0.010567 -0.003768 -0.005714 0.008793 
+-0.077629 -0.053316 0.004479 -0.092709 -0.048200 -0.016185 
+-0.012150 -0.032525 0.008600 0.007617 -0.002717 -0.012018 
+0.008312 -0.003036 -0.008232 -0.005062 -0.006537 0.001112 
+-0.010698 -0.016124 0.006139 -0.010270 -0.061622 0.038000 
+-0.118527 -0.144747 0.032642 -0.047220 -0.077988 0.031777 
+0.014408 0.005163 -0.006033 -0.000684 0.021424 -0.022969 
+-0.001692 0.019820 -0.019700 0.012500 0.002969 0.002969 
+0.001231 0.016002 -0.001852 0.005414 -0.000301 0.010977 
+-0.000123 -0.015358 0.015309 0.009025 -0.000894 -0.003293 
+0.002785 -0.000848 -0.002000 0.001020 0.004869 0.014040 
+0.006364 0.018000 0.009000 0.021323 0.018283 -0.012192 
+0.025714 0.019823 -0.005971 0.017200 0.001872 -0.000561 
+-0.006588 -0.012680 0.003188 -0.023893 -0.025959 0.010302 
+-0.015012 -0.021260 0.014379 -0.004345 -0.007043 0.002904 
+-0.007029 -0.002029 -0.002588 -0.008932 -0.007448 -0.004969 
+-0.000083 0.000019 0.000524 -0.003369 0.022854 -0.002841 
+-0.012870 0.011574 -0.010949 0.024621 -0.010441 -0.013616 
+-0.013923 -0.020847 -0.004960 0.031116 0.007229 0.001617 
+0.053636 0.033273 0.011091 0.024807 0.015696 0.036789 
+0.002954 0.004295 0.003907 -0.002519 0.004772 -0.004895 
+0.001667 0.010832 -0.009478 0.007754 -0.005729 -0.009102 
+-0.008546 -0.018235 -0.014770 -0.018029 -0.015942 -0.001732 
+-0.015508 0.003877 0.018636 -0.046285 0.024686 0.036471 
+0.019711 0.035588 0.012892 0.007582 -0.012099 0.008604 
+-0.005085 -0.014415 -0.010066 -0.003933 -0.003483 -0.006743 
+-0.008594 0.000442 0.007072 -0.000253 0.002399 0.007768 
+-0.007314 0.008082 0.000013 -0.059770 0.009971 0.023711 
+-0.061636 0.026032 0.021514 -0.054708 0.011494 0.064210 
+-0.043058 -0.026942 0.005372 -0.048105 -0.118562 -0.010065 
+-0.025962 0.005192 -0.002000 -0.022923 -0.001769 0.001308 
+0.018245 -0.015506 -0.018648 0.010782 -0.012680 -0.006063 
+0.002601 -0.000155 0.039455 0.011499 -0.011397 0.034961 
+-0.005308 -0.000558 0.008104 -0.011808 0.007337 -0.003956 
+-0.004448 0.035974 -0.010072 -0.003464 0.039510 0.016389 
+-0.049081 -0.008371 -0.008581 -0.015092 0.007629 -0.007912 
+0.012611 0.003473 -0.001580 -0.008250 -0.023300 0.009349 
+0.002288 0.000432 0.000914 0.005091 0.002475 0.001600 
+0.006887 0.005359 0.000016 0.007060 0.002862 0.001950 
+0.002935 -0.012651 0.041184 0.021913 0.010552 0.025974 
+0.005882 0.012036 0.011946 0.002484 0.020477 -0.005785 
+0.007698 0.010966 -0.008736 0.000671 0.002532 -0.001498 
+-0.003890 -0.014676 0.003672 0.005169 -0.000371 -0.004864 
+0.019168 -0.013273 -0.008709 0.006208 -0.000608 -0.006064 
+-0.000995 -0.000041 0.000469 -0.006547 -0.006441 0.003141 
+0.000000 0.001250 0.004688 0.011146 0.005104 -0.003021 
+0.009617 0.005785 -0.001893 0.003382 0.003636 0.005444 
+-0.007768 0.007259 0.008202 -0.006632 0.008645 0.002220 
+0.004616 -0.000680 0.000618 0.010320 0.004762 -0.001524 
+0.016845 0.010643 -0.001118 0.039429 0.017143 -0.001714 
+0.031984 0.029444 0.001270 0.026577 0.010735 0.003928 
+-0.003333 -0.011711 0.002509 -0.011938 -0.008010 0.004544 
+0.005797 -0.006625 -0.000621 0.013286 0.002951 0.001641 
+0.002197 0.010346 -0.003964 0.002500 0.010494 -0.004770 
+0.006240 0.011600 -0.012480 0.005578 0.018937 -0.021208 
+0.034286 0.017143 -0.011429 -0.002729 0.000000 -0.002122 
+-0.003272 -0.002961 -0.002649 -0.014450 0.007853 0.008965 
+-0.007637 0.012824 0.025375 0.007164 0.005472 0.013829 
+0.006374 0.008187 0.004795 -0.005506 -0.008681 0.007178 
+-0.014599 -0.013270 0.012131 -0.002826 -0.016043 0.011652 
+0.001688 -0.003125 0.003375 -0.010126 -0.012482 0.018247 
+0.007164 0.002001 0.020754 0.003205 0.011094 0.010847 
+-0.030976 0.031166 0.000269 0.008793 -0.006710 0.015426 
+0.004940 -0.006732 -0.000163 0.001783 -0.003000 -0.005732 
+0.001887 0.004151 -0.000566 -0.001020 0.006823 0.004749 
+-0.003731 0.024688 0.004969 -0.027888 0.032651 -0.015582 
+-0.006032 0.007050 0.000073 0.013705 0.004848 -0.014640 
+0.037619 0.083883 0.017289 -0.033636 -0.022727 0.000000 
+-0.105562 -0.145325 0.042840 -0.001837 -0.063529 -0.014697 
+-0.022622 -0.021675 -0.020226 -0.015286 -0.030576 -0.041496 
+-0.013732 -0.023943 -0.001057 0.004432 -0.000618 -0.002789 
+0.019425 0.003861 -0.025192 0.029600 0.006549 -0.022397 
+0.021707 0.009187 0.008767 0.042851 0.051330 -0.036971 
+0.049684 0.026947 -0.021053 -0.037648 -0.047975 0.010512 
+0.146368 0.020775 0.027155 0.059496 0.015098 0.015209 
+0.001408 0.003390 0.000931 -0.000334 -0.000099 -0.000087 
+-0.000612 -0.001872 0.001283 0.004320 0.000199 0.002642 
+0.010825 0.003947 0.004205 0.003513 -0.005365 0.008365 
+0.006640 -0.013567 0.013351 -0.027218 -0.001911 0.039755 
+-0.007394 -0.007049 0.010249 0.016243 0.004279 0.000594 
+0.012696 0.011777 -0.002561 0.010112 0.004003 -0.008497 
+0.020408 0.008385 -0.007313 0.015143 -0.004194 -0.002271 
+0.003604 -0.013271 -0.002000 0.001523 -0.005871 -0.000516 
+-0.011983 0.023313 0.009224 -0.011071 0.017084 0.001527 
+-0.006110 0.002065 0.000881 0.007033 0.000830 -0.003494 
+0.024426 0.012633 -0.001941 0.007118 0.034376 0.005713 
+0.002802 0.028317 -0.002508 0.008682 0.013315 0.004358 
+0.018901 0.016678 -0.002950 0.030243 0.025171 -0.011719 
+0.021804 0.020269 -0.011510 -0.009363 -0.014422 0.008054 
+0.017381 0.028571 -0.005000 0.011152 0.037200 0.004779 
+0.019252 0.025916 -0.000494 0.000909 0.008636 0.000000 
+-0.009960 -0.011691 -0.001339 -0.016978 -0.005141 -0.003037 
+0.007469 -0.007494 -0.005605 0.004723 -0.003981 -0.015167 
+0.001273 0.008733 0.014071 0.011143 0.003571 0.033429 
+-0.001053 -0.005526 0.003421 -0.012827 0.003732 -0.015081 
+-0.021306 0.004277 -0.017040 0.001556 -0.010222 -0.011778 
+0.011419 -0.007003 -0.022533 0.005220 -0.025376 -0.012373 
+-0.012941 -0.026946 -0.012248 0.000033 -0.018567 -0.003667 
+-0.007966 -0.012843 0.011299 -0.006240 -0.005727 0.012492 
+0.004286 -0.008571 0.000952 -0.005851 0.007529 -0.021425 
+0.002086 0.000287 -0.014489 0.009100 -0.005987 0.000238 
+0.002059 -0.000675 0.005825 -0.001514 0.001924 0.001252 
+-0.000342 0.009912 -0.008382 -0.005245 0.013907 -0.004486 
+-0.007188 0.009687 -0.041875 -0.009540 -0.017573 -0.019520 
+-0.006372 0.003238 -0.008461 -0.005100 0.001736 0.003077 
+0.001310 -0.002412 -0.003838 0.007698 -0.014841 -0.004127 
+-0.042008 -0.003447 -0.004470 -0.004714 -0.003429 -0.009857 
+0.002778 -0.000056 -0.028167 0.012529 -0.061647 -0.042853 
+0.028444 -0.067378 -0.063644 0.023524 -0.022953 -0.052224 
+0.019474 0.020921 -0.003421 0.003475 -0.003655 -0.004227 
+0.007321 -0.015728 -0.003582 -0.030055 -0.064000 -0.004098 
+-0.003482 -0.045951 0.031081 0.163602 0.043039 -0.068968 
+-0.014301 0.015648 0.015506 0.020761 -0.017314 -0.002455 
+-0.001246 -0.001168 0.001053 -0.004218 -0.003482 0.001047 
+-0.000395 -0.003889 0.000961 0.003079 -0.001372 0.002934 
+0.002333 -0.001557 0.003239 -0.004085 -0.012970 0.001936 
+-0.028312 -0.066789 0.012746 -0.047840 -0.119153 0.059252 
+-0.001684 -0.052904 0.025816 -0.019927 -0.044430 -0.001728 
+-0.016197 -0.010443 0.000481 -0.010619 0.002016 0.004167 
+-0.018522 -0.008880 0.003915 -0.008338 -0.014638 0.003801 
+0.005987 0.004169 -0.002134 -0.001482 0.012308 -0.018865 
+-0.015974 0.009062 -0.003514 -0.010480 0.011384 0.005522 
+-0.007931 0.005257 0.002402 0.011612 0.007796 -0.001502 
+0.019303 0.014318 0.002199 0.010313 0.009123 0.006386 
+-0.002663 -0.001356 -0.004035 0.014604 0.020011 -0.011357 
+0.012369 0.001549 -0.002366 -0.006784 -0.018306 0.007481 
+-0.020922 -0.021079 0.012714 0.004412 0.014412 -0.002353 
+0.003648 0.044288 -0.021504 0.019444 0.027947 -0.013062 
+0.017177 0.013918 -0.013850 0.015823 0.013035 -0.010448 
+0.034802 0.032905 -0.006680 0.019161 0.022092 -0.003727 
+0.004231 0.002736 -0.000966 -0.012235 -0.012942 0.007196 
+-0.023077 -0.004291 0.027159 -0.004644 0.011331 0.020093 
+-0.009206 0.033294 0.004516 -0.014107 0.049268 -0.006377 
+-0.010855 0.040747 -0.019014 -0.007273 0.007832 -0.010070 
+0.006380 -0.011653 0.013769 0.025714 -0.028335 0.016528 
+0.015269 -0.005427 0.005826 -0.005300 -0.001870 0.011066 
+-0.013946 -0.005681 0.018602 -0.030302 -0.029713 0.006237 
+0.006111 -0.032222 -0.010000 0.002687 -0.011356 -0.005249 
+-0.000293 -0.001470 -0.003904 -0.001392 0.003333 -0.005103 
+0.003286 0.000047 -0.004177 -0.009413 0.004397 0.008310 
+-0.007735 0.009804 0.018247 -0.009169 0.015469 0.018236 
+0.062162 0.037906 -0.082838 -0.021920 0.040844 -0.067743 
+-0.017792 0.001121 -0.028720 0.006909 0.007448 -0.009048 
+0.012161 -0.014600 -0.019730 0.087649 0.007773 -0.054428 
+0.045527 0.107193 0.007272 -0.037222 0.043333 -0.037222 
+0.054211 0.023120 -0.046504 0.045000 0.030854 -0.003428 
+0.010721 0.041627 -0.043678 0.085885 -0.000144 -0.085024 
+0.042532 -0.025258 -0.073086 0.028659 -0.011436 -0.003645 
+0.009055 -0.006265 -0.000579 -0.052344 -0.043397 -0.004969 
+0.010351 -0.007617 -0.008287 0.040023 0.020880 -0.109045 
+-0.003258 -0.000008 0.000741 -0.041867 -0.003940 0.013135 
+-0.000057 0.000179 0.000409 0.002429 0.000301 -0.002903 
+0.004383 -0.002150 0.000911 0.004789 -0.003381 0.004110 
+0.001516 -0.007985 0.003038 -0.008667 -0.008547 0.000829 
+-0.014214 -0.004869 0.000988 -0.011116 -0.008287 0.006673 
+-0.007374 -0.007490 0.002100 -0.006775 -0.003502 -0.001707 
+-0.016000 0.019082 -0.015902 -0.015835 0.004099 0.006519 
+-0.008135 -0.004160 0.007737 0.009462 -0.001287 -0.001617 
+0.023727 0.006225 -0.005317 0.014524 0.015151 -0.000781 
+0.001029 0.012513 -0.004542 0.001282 0.003635 -0.014540 
+0.005619 0.004063 -0.000882 0.011373 0.004314 0.009020 
+0.000699 0.002957 -0.001828 0.002012 0.009576 -0.005297 
+-0.005346 0.009891 -0.000344 0.011067 0.008346 -0.000339 
+0.008215 0.005190 -0.005292 -0.008564 -0.016049 0.010014 
+-0.075573 -0.076281 0.061515 -0.037193 -0.015841 0.011815 
+0.034286 0.047238 -0.012190 0.017820 0.004622 -0.001699 
+0.018678 -0.001502 -0.001790 0.027929 0.026446 0.000445 
+0.029996 0.038107 0.007377 0.020588 0.008403 0.001064 
+-0.004286 -0.022571 0.007524 -0.017693 -0.036372 0.009128 
+-0.003814 -0.021680 -0.002254 0.008261 -0.006652 -0.002217 
+0.005909 0.000975 0.000375 0.001268 0.004526 0.001098 
+0.002968 0.008052 0.001630 0.008056 0.002403 -0.002034 
+0.001483 -0.018487 0.000368 0.032063 -0.032914 0.016201 
+0.000104 -0.001671 0.047368 -0.008380 0.013396 0.023539 
+-0.015758 0.007273 0.009697 -0.011389 -0.000180 0.002721 
+0.001900 -0.001355 0.000096 0.003104 0.000260 0.002896 
+-0.001314 -0.000549 0.000992 -0.001776 0.000464 -0.001977 
+0.002706 -0.000340 0.001169 0.000110 0.004281 0.014503 
+0.000028 0.001708 0.036253 -0.010035 -0.023075 0.051925 
+0.004807 -0.004564 -0.008503 0.032571 0.025286 -0.030143 
+-0.002391 0.021304 -0.049565 0.014356 0.034255 -0.021889 
+0.024806 0.023537 0.011045 0.001990 0.027755 0.033622 
+-0.063169 0.010710 0.047468 -0.031689 0.024541 0.030656 
+0.006765 0.007432 -0.010411 0.036155 0.013721 -0.028183 
+0.040708 0.028590 -0.023082 0.032106 0.036879 -0.011716 
+0.027517 -0.012313 0.010680 0.035714 -0.007436 0.002789 
+0.047506 -0.004351 0.011377 0.037692 0.018185 -0.024246 
+0.007814 -0.004811 -0.010305 -0.009768 -0.015353 -0.000715 
+0.001992 0.003569 -0.002146 -0.013141 0.000472 0.013013 
+-0.001109 0.000117 0.000275 0.005233 0.001586 0.000381 
+0.006570 0.003479 0.003325 0.005530 0.002558 0.002221 
+0.002937 -0.001919 0.001473 -0.000598 0.000396 -0.000248 
+-0.003665 0.005077 -0.003673 -0.006686 0.001386 -0.004357 
+-0.004500 0.002935 -0.004476 0.003615 0.011384 -0.009832 
+-0.004612 -0.000815 0.004123 -0.004161 -0.002683 0.007084 
+0.007278 0.001931 0.000000 0.018666 0.008435 0.009007 
+0.017738 -0.007782 0.015414 -0.006431 -0.009940 0.005022 
+-0.008959 -0.013069 0.007122 -0.013693 -0.016108 0.022144 
+-0.018939 -0.007879 0.011061 0.001565 -0.017356 0.014169 
+-0.001799 -0.000453 0.003661 0.018908 0.023402 -0.002758 
+0.008969 0.022420 -0.014291 0.005154 0.008001 -0.002879 
+0.004250 0.000733 -0.002621 0.011609 0.006669 -0.008408 
+-0.014957 -0.024350 0.009632 -0.048241 -0.051620 -0.021157 
+-0.005673 0.003660 -0.000732 0.002150 -0.002804 -0.001268 
+0.038641 0.004454 0.006091 0.057640 0.022466 0.020170 
+0.044258 0.031000 0.010213 0.018095 0.005238 0.000000 
+0.002356 -0.007713 -0.001368 0.011134 -0.017634 0.002397 
+0.019566 -0.013591 0.009615 0.033065 -0.013943 0.012520 
+0.035548 -0.013805 0.005135 0.016883 -0.010910 -0.001469 
+0.000545 -0.012744 -0.004080 -0.009460 -0.021902 -0.001426 
+-0.012672 -0.013043 -0.000200 0.012452 0.009446 0.012569 
+0.007969 0.003670 0.013480 0.000611 0.004196 0.000348 
+-0.002368 0.000533 -0.000567 0.004783 -0.005979 -0.000664 
+0.014449 -0.015951 0.001386 0.010977 -0.006497 0.011501 
+0.007523 -0.002324 0.009755 0.005526 0.006342 0.004026 
+-0.000531 -0.000221 -0.000599 0.008046 -0.002743 -0.002121 
+0.002729 -0.005657 0.008753 0.012808 -0.032899 0.069566 
+-0.043320 0.013646 0.070136 0.026538 -0.008620 0.010735 
+0.023695 -0.003775 0.018410 0.004921 -0.015556 0.021270 
+0.007190 -0.008910 0.022822 0.024921 0.000574 -0.038386 
+-0.025342 0.012137 -0.027479 -0.027584 0.049594 -0.013023 
+-0.006206 0.021056 -0.015514 0.005417 0.000161 -0.028856 
+0.024178 0.015994 -0.030078 0.000962 -0.000377 -0.018789 
+-0.022600 -0.020470 0.044472 -0.019286 -0.011092 0.035000 
+-0.001147 -0.005715 0.010415 0.006421 0.004281 0.020870 
+-0.004679 -0.000142 0.006074 0.007899 -0.025069 0.015396 
+-0.022957 -0.008950 0.023736 -0.021262 0.003908 0.036431 
+0.003768 0.002667 0.000401 0.002751 0.004466 0.001438 
+0.003033 0.002533 0.002333 0.000652 0.002327 0.002540 
+-0.001915 0.002424 -0.000252 -0.006082 -0.001455 0.000364 
+-0.008788 -0.001499 0.000322 -0.008715 0.000172 -0.001554 
+-0.005533 0.005556 -0.003450 -0.001620 0.007738 -0.006396 
+-0.005118 0.001598 0.001416 -0.001853 -0.004829 0.003708 
+0.006204 -0.001105 0.011828 0.010957 -0.002177 0.023524 
+0.017753 -0.007970 0.004706 0.001233 -0.000506 0.000445 
+-0.002773 -0.010714 0.016879 -0.002323 -0.024644 0.040493 
+-0.007501 -0.016248 0.027267 0.005294 -0.011271 0.012728 
+0.011288 0.002194 -0.004507 0.011463 0.018133 -0.006192 
+0.016860 0.018591 -0.015212 0.002937 0.000377 0.001301 
+-0.008577 -0.013055 0.010101 -0.010916 -0.030732 0.015698 
+-0.024614 -0.052459 0.018878 -0.060286 -0.044190 -0.021429 
+-0.008740 -0.016757 -0.011786 -0.004996 0.005610 0.001035 
+0.008929 0.007922 0.003897 0.027456 0.008373 -0.009736 
+0.021579 -0.001134 -0.000648 0.004648 0.003962 0.006095 
+-0.000558 0.007695 0.011682 -0.004899 -0.001663 0.008551 
+0.066198 -0.015901 -0.025888 0.073363 -0.006369 0.038274 
+0.040086 -0.006540 0.024201 0.007784 -0.003938 0.002711 
+-0.019292 -0.012350 0.012183 -0.001736 -0.010099 0.018588 
+0.029130 -0.009833 0.014749 0.039991 0.002530 0.020417 
+0.022580 0.003937 0.007168 -0.001099 0.000824 -0.000275 
+-0.006264 -0.000818 0.002122 -0.002244 -0.006143 0.010977 
+0.003118 -0.003484 0.039059 -0.012086 -0.009468 0.029433 
+-0.011077 0.005252 0.010486 -0.001936 0.000419 -0.000026 
+0.005209 0.005128 -0.004926 -0.000389 -0.001703 -0.005657 
+0.003597 -0.006321 0.001602 -0.011025 -0.016207 0.031246 
+0.007850 0.001638 0.012150 0.013481 -0.001921 -0.002746 
+0.001974 0.000996 -0.002117 0.015467 -0.050953 0.031301 
+0.021474 -0.079669 0.071474 0.007992 0.006977 0.017474 
+0.022442 -0.031837 0.013827 0.000087 0.006662 -0.011336 
+0.010140 0.018301 -0.018519 0.011250 0.016958 -0.010175 
+0.017056 -0.008075 -0.009681 0.003512 -0.016627 -0.024797 
+-0.001361 0.000360 0.001687 -0.018090 -0.014915 0.026930 
+0.006959 -0.020236 0.000256 -0.002808 -0.022137 0.016260 
+-0.014323 -0.024341 0.005640 0.012789 -0.021784 -0.014326 
+0.011474 -0.018912 -0.015088 -0.001670 -0.003204 -0.019634 
+-0.002433 0.007053 0.002366 -0.002917 0.008209 0.001368 
+-0.003326 0.005017 0.000005 -0.002180 0.001105 0.001095 
+-0.003990 -0.000469 0.002804 -0.004704 -0.000270 0.001335 
+-0.002338 0.000894 -0.000454 0.000209 0.002540 0.000728 
+0.001108 0.002285 0.001222 0.003958 0.003656 -0.003615 
+-0.000443 0.000988 0.000344 0.001553 0.002117 0.002039 
+0.007979 0.003670 0.014849 0.011999 0.007519 0.030705 
+-0.001483 0.001274 -0.004759 0.000000 -0.006462 0.009692 
+0.016668 -0.016001 0.017000 0.017969 -0.021102 0.020928 
+-0.014255 -0.040788 0.028840 -0.010324 -0.027818 0.015856 
+-0.006441 -0.000617 0.000601 -0.004463 0.031181 -0.009907 
+0.020847 0.044193 -0.027074 -0.057771 -0.037762 0.035275 
+-0.026283 -0.027947 0.081802 0.036113 -0.029817 0.064861 
+-0.033796 -0.046489 0.021431 -0.032451 -0.062441 -0.000176 
+0.015294 -0.034706 0.015294 0.009608 -0.020155 0.027535 
+-0.004267 -0.007667 -0.002133 -0.017614 -0.004828 0.016309 
+-0.015179 0.002857 0.006964 -0.010330 0.016883 0.005313 
+-0.011156 0.024624 0.008435 -0.004852 0.023714 0.011734 
+0.032622 0.024622 0.002326 0.021517 0.016401 0.005636 
+-0.000655 0.001343 -0.000460 -0.015940 -0.018239 0.013381 
+-0.007358 -0.025768 0.025766 0.031659 -0.021956 0.000392 
+0.050617 0.004136 0.008827 0.022562 0.018740 0.019438 
+0.008910 0.017166 0.013256 0.000370 0.015318 0.000806 
+0.002876 0.014489 -0.004396 0.001155 -0.025848 0.031155 
+-0.008047 -0.014269 0.005164 0.014676 0.004598 -0.017468 
+0.009737 0.009864 -0.010776 -0.002561 0.004423 -0.003026 
+-0.005835 0.002774 0.015464 -0.007309 -0.005770 0.012117 
+-0.000667 -0.009173 0.001787 0.005144 -0.011010 -0.002514 
+0.006531 -0.009082 0.003878 0.002004 -0.007700 0.035175 
+0.019530 -0.033815 0.070538 -0.024330 -0.099890 0.080703 
+0.026952 0.007456 0.053048 0.006429 -0.018143 -0.003714 
+0.015852 -0.035953 0.001609 0.015637 -0.004643 0.009057 
+0.010190 0.002568 0.011291 0.007285 -0.003000 0.009106 
+0.007381 -0.013690 0.007113 0.006875 -0.023438 0.000000 
+0.006726 -0.009985 0.026488 0.008937 -0.003972 0.021849 
+-0.003762 -0.003041 0.017950 -0.018067 0.010532 -0.000343 
+-0.036024 0.003490 -0.006055 0.010531 -0.024108 -0.013942 
+0.048587 -0.003267 -0.053695 0.042670 0.029711 -0.045359 
+-0.001783 -0.001187 0.000238 -0.001300 0.000009 0.000466 
+-0.003639 -0.000075 0.001075 -0.004323 -0.000303 0.002162 
+-0.001950 0.001827 0.002559 0.000590 0.003617 0.002413 
+0.001344 0.001555 0.002349 0.002044 -0.002317 0.000436 
+0.000114 -0.005759 -0.002063 0.000954 -0.002193 -0.000387 
+-0.000433 0.002697 0.000005 0.003912 0.006247 0.002774 
+0.006773 0.007276 0.007502 0.010487 -0.002699 0.011360 
+0.103791 -0.076310 -0.052756 0.052308 0.018462 -0.047692 
+0.009093 0.013946 -0.036381 -0.083294 -0.103060 0.038320 
+-0.030323 -0.085372 0.012213 -0.049094 0.050724 -0.017467 
+-0.054751 0.036360 -0.006656 -0.026848 0.020417 0.006741 
+-0.000684 0.098918 0.052278 -0.095934 -0.040769 -0.006593 
+0.081654 0.026466 -0.000752 0.089269 0.112571 -0.085330 
+-0.007692 -0.033846 0.009231 0.007312 -0.025827 0.014718 
+0.017691 -0.021579 0.019657 0.011458 -0.020000 0.011458 
+-0.004775 -0.023911 0.009566 -0.003274 -0.014053 0.003786 
+-0.002400 -0.001848 -0.000132 -0.010376 0.002906 -0.000444 
+-0.020700 -0.003827 0.000615 -0.018901 -0.003539 0.004415 
+-0.008593 0.004517 0.002901 0.002253 0.008196 0.000099 
+0.019812 0.014850 -0.004952 0.059933 0.005378 -0.002801 
+0.055261 -0.024977 0.007458 0.027668 -0.022430 -0.001392 
+-0.000211 -0.011610 -0.005871 -0.014238 -0.001640 -0.007775 
+-0.007625 0.005438 -0.003269 0.000711 0.008292 -0.001260 
+-0.007766 -0.009107 0.011797 0.036885 -0.031557 -0.031660 
+0.045731 0.033439 -0.080316 0.014593 0.011538 -0.024321 
+0.000103 -0.000586 -0.005278 -0.006610 0.003040 -0.002512 
+-0.007022 0.006538 0.001810 -0.002466 0.007002 -0.001887 
+0.007797 0.006101 -0.007382 0.005694 -0.002344 -0.000694 
+-0.000895 -0.015241 0.015811 -0.021882 -0.036717 0.061831 
+-0.039107 -0.101786 0.054821 -0.078966 -0.040962 0.073053 
+-0.046410 -0.059744 -0.006667 -0.037965 -0.046414 -0.010435 
+0.001800 -0.017477 -0.001360 0.006406 -0.002823 0.004417 
+0.004496 -0.002264 0.000816 -0.006442 -0.009231 0.001923 
+0.000598 -0.000744 -0.000666 0.004286 0.003508 0.016914 
+0.003978 0.005518 0.025827 0.015091 -0.001105 0.005960 
+0.015300 -0.020400 0.004000 0.014614 -0.004229 -0.001648 
+0.009961 0.015517 0.006920 0.001113 0.020357 0.000865 
+0.007636 0.008485 0.003818 -0.005858 -0.011287 -0.007907 
+0.000681 -0.002106 -0.000131 -0.003186 -0.005000 0.000989 
+-0.003841 -0.003792 -0.000187 -0.001897 -0.000062 -0.000143 
+0.000851 0.001277 0.000851 0.000957 0.000900 0.001107 
+-0.000153 -0.000159 -0.000148 -0.004039 -0.001729 -0.000477 
+-0.000937 0.001060 0.000014 0.000740 -0.000771 -0.000595 
+0.003001 0.000615 0.000546 0.004031 0.002614 0.003985 
+0.007292 0.007443 0.007976 -0.002444 -0.003333 -0.002603 
+0.038423 -0.068333 -0.230541 0.201624 0.087094 -0.115726 
+0.097500 0.014754 0.017705 -0.027964 0.026828 0.056421 
+-0.008902 0.007965 0.033544 -0.039689 0.024656 0.024312 
+-0.031261 0.017536 0.022678 -0.031111 0.004270 0.017081 
+-0.026511 -0.000902 0.026096 -0.013114 -0.005586 0.013609 
+0.043658 0.017253 -0.021031 0.041578 0.006565 -0.035020 
+-0.085595 0.001548 0.061190 0.030024 -0.048900 0.017440 
+0.001424 -0.027059 0.009965 0.011000 -0.019400 0.006800 
+-0.004486 -0.014621 -0.008324 -0.014319 -0.015073 -0.006104 
+0.001523 -0.005726 -0.000870 -0.004158 -0.001643 -0.001218 
+-0.017993 -0.011765 0.004844 -0.030875 -0.018479 0.013582 
+-0.031550 -0.011440 0.013014 -0.011276 0.016509 0.003624 
+0.021693 0.032772 0.010931 0.034895 0.004685 0.010490 
+0.024634 -0.001844 0.005064 0.010120 0.002623 0.001055 
+-0.006185 -0.000808 0.001799 -0.021065 -0.010370 0.013380 
+-0.013600 -0.016467 0.010292 -0.006081 -0.014654 0.013495 
+-0.012372 -0.012060 0.029190 0.022138 0.168333 -0.077484 
+-0.010261 0.019101 -0.036572 0.002754 0.000263 0.009352 
+-0.004067 0.011173 0.006209 -0.006009 0.005277 0.003008 
+0.001425 0.014557 -0.014154 0.011050 0.007307 -0.034504 
+0.020978 0.003614 -0.016087 0.004307 -0.017786 0.018325 
+-0.014183 -0.048301 0.015621 -0.052048 -0.043690 0.016976 
+-0.065333 -0.017600 0.008800 -0.100119 -0.032262 0.066190 
+-0.026727 0.008909 0.005455 0.028205 -0.041026 -0.091026 
+0.000253 0.009913 0.003681 -0.003343 0.018377 -0.006449 
+0.027976 0.010298 -0.001845 -0.001096 0.003596 0.001648 
+0.001947 0.005292 0.017631 -0.010952 0.014048 0.031905 
+-0.031446 -0.008519 0.011777 -0.024167 -0.025208 -0.004167 
+0.007262 -0.035976 -0.011937 -0.003763 -0.018218 -0.013149 
+-0.008418 -0.010977 -0.005065 0.002768 -0.002103 0.001249 
+0.001081 -0.007961 -0.017429 -0.009673 -0.031304 0.001707 
+-0.000219 -0.001201 0.000156 -0.000766 -0.004128 0.000573 
+0.000649 -0.006105 0.001439 0.001029 -0.006310 0.003201 
+0.000319 -0.006150 0.001448 -0.001024 -0.004023 -0.000282 
+-0.002024 0.001424 -0.000158 0.001263 0.010343 -0.004373 
+0.006348 0.012611 -0.006849 0.006968 0.001258 0.002866 
+0.004966 -0.000016 0.004566 0.004932 0.002026 0.004445 
+0.004836 0.010266 0.003778 -0.005008 0.011802 -0.009004 
+-0.000663 -0.058159 -0.007172 0.016647 -0.073400 -0.006694 
+-0.007688 0.005713 -0.002108 -0.010795 0.005776 0.004311 
+-0.007722 0.000102 0.001390 -0.006831 -0.003657 0.002009 
+-0.014665 -0.013041 0.005398 -0.008576 -0.017377 0.005071 
+-0.009559 -0.014015 0.002595 -0.004298 -0.002865 -0.004298 
+-0.006398 0.009841 -0.007851 0.009633 0.007110 -0.001471 
+0.023980 0.023224 -0.006483 0.016396 -0.005104 0.020958 
+0.002807 -0.027193 0.026667 0.003255 -0.013198 0.012290 
+0.010762 -0.002280 0.005991 -0.000455 0.001734 0.002089 
+-0.017540 -0.003888 0.003034 -0.027104 -0.006038 0.004646 
+-0.026888 -0.010176 0.007873 -0.008895 -0.000833 0.002372 
+0.011069 0.004646 -0.001352 0.010449 0.007749 0.003505 
+-0.002511 0.015965 0.004879 -0.000227 0.015710 0.006193 
+0.020262 0.021693 -0.000524 0.011989 0.017379 -0.013011 
+-0.018774 -0.008764 0.026700 0.002810 0.011046 0.034641 
+-0.002069 0.006866 -0.001580 -0.012413 0.004933 0.005302 
+-0.010922 0.011255 0.015216 -0.033996 0.072254 -0.020868 
+-0.005787 0.009589 0.000330 0.001509 -0.002080 0.002312 
+0.003990 0.009480 0.004301 0.000928 0.004199 -0.008737 
+0.011232 -0.003486 -0.023805 0.020722 -0.047863 -0.030073 
+0.005643 -0.071857 0.018918 0.003817 0.000222 -0.002529 
+-0.024095 0.015143 0.012381 -0.001215 -0.007846 0.023262 
+-0.076745 -0.062144 -0.004172 -0.086782 0.009051 -0.007066 
+-0.046902 0.021098 0.003686 -0.025306 -0.032820 0.012783 
+-0.015176 -0.017706 0.004444 0.017211 0.012516 -0.005474 
+0.033235 0.000772 -0.014295 0.011658 -0.004880 -0.021761 
+0.013941 0.032031 -0.033574 -0.013083 0.012000 -0.002379 
+0.005980 0.003922 0.005392 0.021343 0.004281 0.019517 
+0.018261 -0.010435 0.013043 -0.005050 -0.021836 0.012060 
+-0.010666 -0.012192 0.006476 -0.006297 -0.012449 -0.007551 
+-0.009366 0.002535 -0.003873 -0.007087 0.000560 0.004593 
+-0.001491 0.000129 0.000272 -0.000504 -0.003046 0.000094 
+0.000229 -0.004364 -0.000391 0.001646 -0.004466 0.000150 
+0.001427 -0.002920 0.000716 -0.000622 -0.000904 -0.000099 
+-0.002672 0.002227 -0.000507 -0.002227 0.004198 0.000782 
+-0.000827 0.001976 0.001732 -0.000070 0.004975 0.005242 
+0.003831 0.014860 0.002240 0.001230 0.012364 -0.003730 
+-0.007728 0.008594 -0.007844 -0.016503 -0.003441 -0.010102 
+-0.018678 -0.058464 0.021423 0.006996 -0.014311 0.019992 
+0.004772 -0.007989 0.009011 -0.003274 -0.001279 0.004889 
+-0.002384 -0.001734 -0.000244 0.003933 -0.007803 0.004053 
+0.001795 -0.014957 -0.005408 -0.004668 -0.015212 -0.019430 
+0.000533 0.001194 -0.012805 0.006746 -0.001111 -0.006270 
+0.000315 0.004168 0.002350 0.004057 0.014865 0.005406 
+0.009949 0.008876 0.005328 0.011085 0.000053 -0.011296 
+0.002509 -0.001964 0.002836 0.002765 -0.002627 0.003779 
+0.014054 0.003378 0.006622 0.015453 0.000792 -0.008347 
+-0.000178 -0.010424 0.000728 -0.007924 -0.007359 0.002345 
+-0.005798 0.004418 0.000875 -0.001696 0.009899 0.003051 
+0.008519 0.009070 0.003298 -0.001154 0.006351 0.002352 
+-0.004299 0.013906 0.000743 0.003135 0.029927 -0.007645 
+0.014775 0.032468 -0.016658 0.016714 0.022671 -0.007432 
+0.007304 0.001327 0.000978 -0.013972 -0.009048 0.001643 
+-0.012089 -0.033856 0.014664 0.006334 -0.051565 0.006602 
+0.074200 0.042000 -0.070600 0.001183 -0.002150 0.002350 
+-0.001541 0.003672 0.007189 0.003693 -0.001533 0.004774 
+0.010227 -0.007237 0.004325 0.008204 -0.007957 -0.010704 
+0.028128 -0.013336 -0.069352 0.008243 -0.028880 0.012355 
+-0.032346 -0.018765 0.027160 0.027609 -0.038470 0.018921 
+0.017172 0.005051 0.007071 0.085622 0.016961 -0.035945 
+0.050374 -0.019121 -0.055516 0.017888 0.015483 0.001034 
+-0.017298 0.089529 0.001578 -0.034892 0.037608 -0.000123 
+-0.023767 -0.033795 0.007180 -0.016105 0.026283 -0.033717 
+-0.019576 -0.003290 -0.000200 -0.024072 -0.043312 0.027592 
+-0.025710 -0.050004 -0.001350 0.002728 0.024415 -0.002410 
+0.026651 0.044499 -0.008278 0.023889 0.002667 -0.002000 
+0.024012 -0.030827 0.039718 0.014500 -0.008214 0.024697 
+-0.007583 0.003892 -0.036681 -0.003559 0.011036 -0.003334 
+-0.000779 0.004600 0.005926 0.008008 0.006959 0.000198 
+-0.005634 0.004194 -0.001075 -0.005046 0.000745 0.000161 
+0.000058 -0.000116 -0.000016 0.004491 0.000842 0.000318 
+0.004798 -0.000401 0.000815 0.002004 -0.003108 -0.000130 
+-0.001383 -0.003134 -0.000706 -0.001998 0.001318 -0.000478 
+0.003584 0.007738 0.002788 0.003208 0.011375 -0.002195 
+-0.000355 0.004227 -0.002206 -0.002668 0.003214 -0.002160 
+-0.008285 0.003786 -0.006068 -0.014851 0.004971 -0.012070 
+-0.009548 0.008781 -0.006746 0.007640 -0.014080 0.000314 
+0.000033 -0.020683 0.006617 -0.006144 -0.009100 -0.005839 
+-0.000812 -0.003939 -0.004661 0.004418 -0.013282 0.006928 
+-0.001968 -0.006602 0.007510 -0.004146 0.015475 -0.012620 
+-0.012738 0.009313 -0.002694 -0.005230 -0.002537 -0.003734 
+0.015717 0.004080 0.003155 0.018878 0.026265 0.006540 
+0.073226 0.070493 -0.008288 0.009048 -0.010179 0.030000 
+0.011159 -0.020137 0.002758 -0.004518 -0.019583 0.006134 
+-0.005321 -0.011828 0.010645 0.004239 -0.025682 0.023358 
+0.021852 -0.015025 0.016181 0.034198 -0.005862 0.010259 
+0.022000 0.007963 0.002986 0.003418 0.015487 -0.000945 
+-0.002411 0.021006 -0.012118 0.001647 0.017901 -0.006286 
+0.002729 0.015517 0.000331 -0.004086 0.007303 0.002440 
+-0.006697 -0.000401 0.000712 0.015637 -0.006733 0.005249 
+-0.013763 0.016238 -0.016499 0.008403 0.011808 -0.012515 
+0.029132 -0.010717 -0.017635 -0.015490 0.000235 0.005325 
+-0.012968 -0.000060 -0.044110 0.009749 -0.020799 -0.035749 
+0.009824 -0.009478 -0.003666 -0.005762 -0.004221 0.003618 
+-0.002145 -0.003205 0.021941 0.028279 -0.048851 -0.006878 
+0.175714 0.021429 -0.072857 0.005145 -0.015248 -0.019402 
+0.029422 -0.061824 -0.057416 0.026229 -0.126176 0.034420 
+-0.015155 -0.073168 0.020186 -0.008877 0.035508 -0.060000 
+0.004269 0.018129 0.011520 0.021403 0.002500 -0.019457 
+0.015617 -0.014495 -0.007554 0.032133 0.032267 0.009667 
+0.048538 0.045723 0.009009 0.040653 0.045180 -0.000266 
+0.008862 0.040538 -0.016815 0.021360 0.026567 -0.009532 
+0.031988 0.001075 -0.003024 0.020769 0.003462 -0.005769 
+-0.011522 0.020833 0.001773 -0.033903 0.041551 -0.003187 
+-0.062023 -0.043856 0.038217 0.080437 -0.104927 0.029053 
+0.006393 -0.023685 -0.037935 0.001268 -0.003545 0.008202 
+0.008810 -0.003980 0.008865 0.005453 -0.002687 0.002885 
+-0.002964 0.001869 -0.000150 -0.003700 0.000705 0.000237 
+0.000760 0.000687 -0.000210 0.005481 0.000158 0.000792 
+0.006024 -0.001944 0.002609 0.002614 -0.004773 0.001477 
+-0.001024 -0.005757 0.000473 -0.001361 -0.004548 0.000207 
+0.002439 -0.001270 0.000406 0.004121 -0.001123 -0.002601 
+0.002316 0.000807 -0.001763 0.001091 0.001692 0.001022 
+-0.003488 0.002300 -0.002226 -0.013087 0.001112 -0.015378 
+-0.035163 -0.033946 -0.042864 -0.011594 -0.029626 0.016207 
+-0.013758 -0.000671 -0.008567 -0.006667 0.000798 -0.007781 
+-0.009487 -0.002608 -0.009325 -0.012608 -0.012373 -0.007126 
+0.001588 -0.011545 0.002530 0.008668 -0.005430 0.004663 
+0.004330 -0.000345 0.001998 -0.004564 0.005314 -0.000944 
+0.010208 0.019000 0.001856 0.055036 0.045135 -0.013826 
+0.077757 0.088981 -0.087689 -0.011226 0.000411 0.018413 
+-0.010429 -0.014381 0.030190 -0.013196 -0.022942 0.037458 
+-0.031950 -0.035732 0.042377 -0.086726 0.035952 -0.007873 
+-0.016088 -0.064561 0.024554 0.013854 -0.031905 0.016042 
+0.005020 -0.014945 0.002785 0.012009 0.008179 -0.008321 
+0.045577 0.026487 -0.038563 0.049500 0.055804 -0.022268 
+0.011695 0.020553 0.003529 0.019561 -0.008615 -0.001300 
+-0.000288 0.004071 0.005661 -0.002236 0.000630 0.024976 
+-0.054706 -0.016863 -0.065196 0.024084 0.017714 -0.052807 
+0.008345 0.003955 -0.017724 0.002109 -0.002694 0.010628 
+0.001641 0.007056 0.010642 0.018114 0.007126 0.002241 
+0.023229 0.015208 -0.023229 0.001655 -0.003046 -0.006410 
+-0.009411 0.017214 0.006920 0.009174 -0.023865 -0.007317 
+0.128196 0.049685 0.036792 0.019330 -0.022100 0.027900 
+-0.007967 0.001985 -0.000367 -0.018462 -0.040386 0.024853 
+-0.043290 -0.075238 0.026797 -0.017944 0.020611 -0.003056 
+-0.017689 0.026030 -0.011228 -0.025333 -0.003366 0.000306 
+-0.003339 -0.024607 -0.022066 0.020217 -0.023912 -0.015747 
+0.011837 -0.007500 -0.002537 -0.015455 0.010000 0.015455 
+0.037667 0.032333 0.002667 0.142222 0.087778 0.000000 
+0.045272 0.099296 -0.011680 -0.036561 -0.005264 -0.025544 
+-0.055000 -0.004687 -0.014062 -0.022657 -0.037832 -0.030140 
+-0.011200 0.005600 0.022000 0.022530 -0.031493 0.044690 
+0.010120 -0.014216 0.021589 0.001953 -0.005658 0.013636 
+-0.001744 -0.001381 0.003746 0.000559 0.006729 -0.015030 
+-0.002635 -0.002568 0.000980 -0.002443 -0.002627 0.001456 
+0.000958 -0.002961 -0.000111 0.006623 -0.001515 0.000547 
+0.007569 0.003269 0.001700 0.004947 0.006421 0.000421 
+0.000094 0.003405 -0.000331 -0.003955 -0.002548 -0.000150 
+-0.003187 -0.003432 0.002308 0.000353 -0.000240 -0.000067 
+-0.002805 -0.001005 -0.001872 -0.003396 0.000412 -0.003911 
+-0.001418 -0.002298 -0.003430 -0.019520 -0.019655 -0.025375 
+-0.019477 0.025642 -0.076242 -0.048583 -0.008838 -0.006122 
+-0.046364 -0.045989 -0.011497 0.002052 -0.021729 0.001865 
+0.000131 -0.014811 -0.020142 0.000817 -0.018905 -0.003080 
+-0.007648 -0.012237 -0.003059 -0.003214 -0.002976 -0.006762 
+-0.002388 -0.006965 -0.010308 0.011702 -0.018385 -0.009072 
+-0.000617 -0.011543 -0.008457 0.014564 0.010685 -0.022578 
+0.019749 0.036133 -0.017227 0.023409 0.032739 -0.009607 
+0.011587 0.013736 0.006531 0.004483 0.013762 0.011163 
+0.098779 0.039361 -0.042186 0.029359 0.075854 0.017309 
+0.004888 -0.046667 0.001117 -0.010306 -0.037967 0.007357 
+-0.001906 -0.025361 0.007845 0.022683 -0.018318 -0.002334 
+0.058987 0.030854 -0.011756 -0.042667 0.017333 -0.063667 
+0.004944 0.010959 -0.000033 0.013418 0.005397 0.014372 
+0.012400 -0.005187 -0.000403 -0.016204 -0.004457 0.011836 
+-0.018066 0.000457 0.015201 0.006798 -0.005205 0.015173 
+0.007615 -0.008310 0.006817 0.004153 0.005593 0.004153 
+0.012987 0.004164 -0.007444 0.004419 -0.006095 0.007848 
+0.006662 -0.004674 -0.003586 -0.000538 -0.003484 -0.016054 
+-0.004024 -0.023103 0.037626 -0.085374 0.003152 -0.012072 
+0.034149 0.055979 0.026381 -0.011697 0.010477 0.006095 
+0.003609 0.015062 -0.013558 -0.002025 0.026879 -0.009625 
+-0.016523 -0.009283 -0.026918 0.000441 -0.005255 -0.017070 
+-0.028519 -0.050074 -0.003481 -0.044852 -0.026721 0.006361 
+-0.020835 -0.009238 0.012777 0.008088 -0.019638 -0.006163 
+-0.021686 -0.012500 0.018588 -0.015000 0.007500 0.080000 
+0.001606 0.003365 0.036863 0.042754 -0.029178 -0.038679 
+0.012315 -0.029979 -0.007762 -0.041000 0.036667 0.032333 
+-0.086936 -0.044851 0.079872 -0.069084 -0.072281 0.080787 
+0.026395 -0.038119 0.033229 0.020731 0.001010 -0.045722 
+0.005220 0.001479 -0.007801 0.004476 -0.003105 0.003832 
+0.014305 0.003253 0.012028 0.010962 0.001484 -0.008697 
+0.000482 -0.002130 0.000315 0.002215 -0.001980 -0.000343 
+0.005408 0.000406 0.000174 0.008397 0.002552 0.001382 
+0.008122 0.003039 0.001703 0.004149 0.003480 0.001125 
+0.001009 0.005026 -0.000632 0.001334 0.004276 -0.002685 
+0.004344 0.003616 -0.002242 0.002357 0.003783 0.002769 
+-0.003335 -0.000032 -0.003373 -0.005300 -0.001875 -0.006227 
+-0.007119 -0.014158 -0.010534 -0.016667 0.005113 -0.006489 
+0.010671 0.005014 -0.041289 -0.003146 0.004282 -0.014679 
+-0.004897 0.002007 -0.007715 -0.000852 0.003560 -0.014771 
+-0.005411 0.000484 -0.006562 -0.009310 0.002069 -0.004828 
+-0.020938 0.006106 -0.018321 -0.000260 0.022597 -0.044156 
+0.009487 0.019690 -0.012402 -0.010000 0.000000 0.002941 
+-0.013416 -0.024178 0.011879 0.005386 0.002320 -0.003575 
+0.024186 0.002093 -0.005607 0.032259 -0.001935 -0.007374 
+0.031823 0.005114 -0.003189 0.014099 0.013594 -0.020634 
+0.056048 0.026883 -0.027279 0.061940 0.006131 -0.021552 
+-0.005404 -0.008456 0.001963 0.042950 -0.016493 0.010959 
+-0.018125 -0.025047 0.013915 -0.017566 -0.011567 -0.004037 
+-0.019098 -0.010537 -0.017963 -0.005782 -0.024927 -0.034026 
+0.018000 -0.021879 -0.016044 0.022084 -0.004689 0.019981 
+0.014515 0.000353 0.003028 -0.008623 -0.002599 0.000840 
+-0.001569 -0.002650 0.000311 0.004437 0.002272 0.002187 
+0.012434 0.005036 -0.007586 0.008364 0.001436 -0.021947 
+0.002897 0.005517 -0.026117 -0.007169 0.004734 -0.002502 
+-0.030936 0.001810 -0.013286 -0.048025 0.004279 -0.016608 
+-0.017778 -0.029095 -0.031519 -0.075714 0.053716 0.013783 
+-0.003679 0.045579 0.050381 0.012125 0.015205 -0.002145 
+0.019648 -0.010006 0.006004 0.000260 -0.000325 0.001104 
+-0.020588 0.004353 -0.005765 -0.009568 0.005259 -0.028853 
+-0.009056 -0.089406 -0.029995 0.088230 -0.088136 -0.035198 
+-0.058836 -0.007719 0.025901 0.076795 -0.028718 0.019359 
+0.058696 0.001341 0.022246 -0.013995 0.014423 0.026503 
+0.010810 0.008046 0.016727 0.022857 0.010432 0.003968 
+0.037666 0.030821 -0.001998 0.061974 0.025195 -0.056163 
+0.012458 -0.001604 -0.013444 0.022208 -0.005097 0.007597 
+0.039030 -0.004356 -0.002928 0.026540 -0.001234 -0.016942 
+0.016758 0.003607 -0.009449 0.022885 0.008350 0.000388 
+0.019616 0.003862 -0.005881 -0.004317 0.005753 -0.001580 
+0.002708 -0.001856 -0.000088 0.005158 0.001107 0.000079 
+0.006364 0.004042 0.000132 0.005518 0.005620 0.000882 
+0.005897 0.004279 0.000326 0.005239 0.002172 -0.000404 
+0.002429 -0.001039 0.000045 -0.000844 -0.004959 -0.001583 
+0.004662 -0.002226 0.002256 0.002300 -0.001856 0.002334 
+-0.004124 0.003385 -0.003216 -0.016928 0.005715 -0.010046 
+-0.071324 -0.020000 0.037212 0.008534 -0.002369 0.019702 
+0.018663 -0.014462 0.032962 2.134021 -1.030928 3.273196 
+1.809783 -0.663043 2.614130 0.012810 -0.001498 0.013593 
+-0.000158 -0.002306 0.002337 -0.010120 -0.026558 -0.002146 
+-0.012442 -0.017224 -0.010253 -0.002024 0.006819 -0.021308 
+0.003056 0.017111 0.004889 -0.007820 0.019511 0.014323 
+-0.006042 0.021037 0.018664 0.007581 0.005994 -0.002580 
+0.009031 -0.000722 -0.002890 0.004065 -0.005315 -0.002264 
+0.008065 -0.003346 -0.003579 -0.001398 -0.004576 -0.004067 
+-0.000179 -0.001612 -0.009062 -0.009372 -0.025239 0.019173 
+-0.031519 -0.042524 0.028907 0.156357 -0.085891 -0.074217 
+-0.008289 0.033333 -0.017762 -0.007346 0.011746 -0.015289 
+-0.013508 0.000517 -0.013389 0.003828 0.003909 0.000576 
+0.005265 -0.001683 -0.003369 -0.005467 -0.045211 0.013818 
+-0.031490 -0.013371 0.018139 0.008068 -0.012645 0.012307 
+0.002726 -0.023898 0.021989 -0.007951 -0.015351 0.020995 
+-0.008065 -0.001915 0.006418 -0.006637 0.003191 -0.001928 
+-0.025455 0.022273 0.000909 -0.083453 0.049463 -0.013226 
+-0.080411 0.028337 0.008789 -0.017952 0.010995 -0.005621 
+0.004699 0.002983 -0.005893 0.025503 0.006324 -0.005847 
+0.060067 0.007891 -0.027927 0.046748 -0.009333 -0.014917 
+0.044681 -0.035583 0.007574 0.008717 -0.021866 0.014776 
+0.007667 -0.002333 0.030667 -0.004057 0.002116 0.020932 
+0.005780 0.026976 -0.024286 0.023293 0.027387 -0.025467 
+0.047503 -0.038663 -0.001581 0.046823 -0.055565 0.003113 
+0.023241 -0.013345 0.006625 -0.010141 0.000232 0.016410 
+0.005042 -0.002189 0.012860 0.011966 0.005712 0.007186 
+0.021467 0.028229 -0.003845 0.100663 0.016893 -0.030402 
+0.056835 -0.002835 -0.031699 0.044617 0.015277 -0.009053 
+0.012936 0.018858 -0.014336 -0.003429 0.004766 -0.002840 
+-0.005756 -0.006462 0.005872 -0.004406 -0.009017 0.005150 
+-0.005794 -0.001922 0.002415 -0.004267 0.005526 -0.001910 
+-0.001127 0.003106 0.000235 0.003918 0.006926 0.000407 
+0.005694 0.007813 0.000316 0.004019 0.006955 -0.001994 
+0.002426 0.006180 -0.002891 0.001692 0.005041 -0.001785 
+-0.000712 0.000449 -0.000777 0.000457 -0.001649 -0.000688 
+-0.001452 -0.000920 -0.001643 0.000421 -0.000019 0.000307 
+-0.006869 0.008837 -0.002988 -0.033738 0.014471 -0.028924 
+-0.014506 0.012186 -0.000281 0.017718 -0.009407 0.028718 
+2.862385 -1.866972 4.486238 3.107143 -1.903571 4.878572 
+3.011811 -1.590551 4.488189 2.497110 -1.052023 3.335260 
+0.010843 -0.006526 0.020269 0.002306 -0.015105 0.012448 
+0.001471 -0.000235 0.000793 -0.011047 0.008225 0.008195 
+0.000309 -0.022205 0.011954 -0.011052 -0.005085 0.016680 
+0.006923 0.031086 0.051810 -0.024967 0.023637 0.042036 
+-0.025752 0.013879 0.021941 -0.007975 0.015456 0.021046 
+0.009800 0.006943 0.006030 0.027404 0.008126 0.010028 
+0.028529 0.022394 0.017748 0.012295 0.023913 0.004729 
+-0.000667 -0.000667 0.000333 -0.010001 -0.000520 -0.009867 
+0.032158 0.001461 -0.026309 0.000259 0.000603 -0.004500 
+-0.000037 -0.014198 0.022702 -0.002884 -0.021279 0.022455 
+0.009405 -0.007022 0.003710 0.010369 -0.002699 -0.006448 
+-0.016171 -0.007187 0.010714 -0.003077 0.003077 0.048462 
+0.001467 -0.005391 0.029379 -0.004898 -0.013462 0.023670 
+-0.022458 -0.013132 0.001142 0.009721 -0.015945 0.002268 
+-0.001132 -0.006730 0.001157 -0.050273 0.100000 -0.006703 
+-0.006950 0.053551 -0.018802 -0.003466 0.005317 -0.000478 
+-0.004587 -0.006069 0.005321 -0.004629 -0.006097 0.006316 
+0.002583 0.002122 -0.002536 0.002388 0.004550 -0.007100 
+-0.001230 0.002409 -0.008529 -0.003039 -0.001275 0.002157 
+0.010394 -0.004752 0.013905 0.011111 0.000000 -0.011667 
+0.005487 0.018524 -0.004436 -0.002286 0.039428 -0.020883 
+0.008254 -0.002914 -0.027995 0.004866 -0.005542 -0.030478 
+0.007242 0.007137 -0.018381 0.010368 0.001250 -0.006849 
+0.007746 0.001924 0.006294 0.004222 -0.004093 0.010008 
+0.001607 -0.009995 0.011527 0.001231 -0.022033 0.021057 
+0.045888 -0.082110 0.036374 -0.004190 -0.015769 0.007075 
+-0.003488 0.003375 0.000808 0.004564 0.004554 -0.006006 
+0.001600 0.001256 -0.000835 -0.006700 -0.004195 0.000671 
+-0.010345 -0.002211 0.003275 -0.002433 0.003022 -0.001234 
+0.001684 0.005789 0.000000 0.005122 0.003480 0.000092 
+0.010091 0.004583 -0.003562 0.010049 0.006433 -0.005060 
+0.002833 0.003106 0.000675 -0.002886 0.002030 0.000487 
+-0.003953 0.002846 0.002095 -0.002505 0.003216 -0.002302 
+-0.001819 0.005410 -0.002175 -0.004243 0.004186 -0.001654 
+-0.027961 0.011349 -0.003626 -0.008899 0.012329 -0.012243 
+0.008278 -0.007601 0.007194 2.256410 -1.246154 2.482051 
+3.370536 -2.209821 4.254464 4.219178 -2.630137 5.630137 
+4.361257 -2.062827 5.785340 3.242038 -0.936306 4.560510 
+0.018514 -0.002834 0.023613 0.005480 0.001510 0.008199 
+0.007222 -0.003306 0.011355 -0.048747 -0.004355 0.049168 
+-0.007482 -0.036541 0.024180 -0.007565 -0.022604 0.003692 
+-0.005264 -0.033984 0.001199 -0.100479 -0.043107 0.050187 
+-0.066111 0.011556 0.023111 -0.043748 0.006279 0.031497 
+0.016782 0.018465 0.036657 0.010793 0.012584 0.000208 
+0.029406 0.024056 0.001783 0.024498 0.064287 -0.007139 
+0.003580 0.018231 0.000024 -0.011573 -0.008187 0.006267 
+-0.010374 -0.006147 -0.011273 0.003436 0.010734 0.001078 
+-0.002767 -0.012402 0.016829 -0.004564 -0.027948 0.031248 
+0.024310 0.008517 0.002322 -0.011818 0.004896 -0.041026 
+0.020877 -0.000877 -0.016491 0.010778 0.025444 0.007111 
+0.025520 0.036580 -0.021190 -0.004837 0.010619 -0.001331 
+-0.004405 -0.007332 0.005793 0.017563 -0.006599 0.009311 
+0.017831 0.017252 -0.000665 0.057488 0.000329 -0.027880 
+-0.009903 0.031048 -0.026980 -0.008459 -0.000896 0.010609 
+-0.011406 -0.011250 0.011860 -0.014001 -0.015044 0.013448 
+-2.098446 -2.119171 1.699482 -2.881119 -2.678322 2.230769 
+-0.033165 -0.034217 0.020906 -0.087236 -0.078177 0.076858 
+0.000350 -0.000301 -0.000309 -0.054571 0.020689 -0.120706 
+0.054353 0.030000 -0.046588 0.017368 0.039457 -0.018717 
+-0.023152 0.008106 -0.007939 0.007926 -0.011440 -0.015104 
+0.013431 0.009655 -0.018575 0.009109 0.007614 -0.014169 
+0.002543 0.004936 -0.007132 -0.002700 -0.003905 0.005045 
+-0.005772 -0.007854 0.015260 0.006448 -0.001065 0.005783 
+0.012307 0.013422 -0.019082 0.002657 0.006913 -0.009924 
+0.000255 -0.005726 0.004537 0.003694 -0.003245 0.000319 
+0.003463 0.000788 0.003036 -0.000562 0.001651 0.000426 
+0.003038 0.005215 -0.004209 -0.000503 0.001909 -0.001298 
+0.007084 0.001355 -0.002532 0.006211 0.001828 -0.000487 
+0.008816 0.004695 -0.002317 0.008000 0.001744 0.000758 
+0.000498 -0.002160 -0.001272 -0.000088 -0.004106 -0.005012 
+0.000752 -0.001784 -0.007638 0.005719 0.002906 -0.006951 
+0.002333 0.002935 0.001662 -0.003564 -0.002296 -0.003137 
+-0.013393 0.006964 0.005759 -0.009688 0.001366 -0.016707 
+0.005079 -0.005874 0.009728 2.073733 -1.557604 2.474654 
+2.978992 -2.373950 4.096639 3.781395 -2.637209 5.558139 
+3.869565 -1.842391 5.923913 2.758170 -0.718954 4.993464 
+0.018927 -0.000603 0.027458 0.003608 -0.002822 0.007329 
+-0.003726 -0.016526 0.001770 0.001633 0.033163 0.102755 
+-0.002883 -0.000777 0.045574 0.015158 -0.012605 0.003949 
+-0.013769 -0.058856 0.018913 -0.065741 -0.118182 -0.020760 
+-0.074172 -0.065283 -0.039844 -0.054361 -0.043308 -0.039925 
+-0.056962 0.012321 0.104689 -0.000386 0.010006 0.009956 
+0.009061 0.009655 -0.000409 0.005129 0.025558 -0.010208 
+0.001227 0.018656 -0.007249 0.000768 -0.004519 -0.001565 
+0.005295 -0.011606 -0.003699 0.004150 0.003715 -0.001581 
+0.002203 0.002184 -0.003582 0.004085 -0.032684 0.053333 
+0.010745 0.021782 -0.041182 0.013173 0.013569 -0.026629 
+-0.008947 -0.013158 -0.007368 -0.005231 0.002143 -0.002989 
+0.023818 0.008384 -0.034216 -0.004216 -0.003319 0.006395 
+-0.004586 -0.012836 0.007743 0.007043 -0.004355 0.006705 
+0.013344 0.014562 0.002344 0.019319 0.021969 -0.030904 
+0.003296 0.022910 -0.025822 -0.012225 0.001948 0.013355 
+-0.020931 -0.015959 0.023097 -2.365079 -2.170635 2.158730 
+-2.731148 -2.550820 2.101639 -3.255556 -3.011111 2.100000 
+-3.901163 -3.622093 2.116279 -0.050441 -0.044332 0.021768 
+0.012094 0.004174 -0.024738 0.130254 0.024131 -0.084376 
+0.080588 0.064706 -0.064706 0.028141 0.035183 -0.013704 
+-0.001959 0.008060 0.002808 -0.003217 -0.012626 0.009455 
+0.001974 0.000251 -0.002751 0.002636 0.002476 -0.003999 
+0.001059 0.001880 -0.002029 0.000955 0.000750 0.004500 
+-0.001222 -0.003600 0.005122 -0.001042 -0.004744 0.004227 
+0.004756 -0.000071 -0.001889 0.005424 0.004969 -0.005907 
+-0.001237 0.002314 -0.000775 -0.000442 0.001571 0.003116 
+-0.001307 0.002394 0.002391 -0.001061 0.001221 0.000496 
+0.000126 0.004221 -0.005952 -0.002224 0.004248 -0.005257 
+0.003737 0.002013 -0.001533 0.004524 -0.000986 0.001769 
+0.002599 0.004229 0.002250 0.001510 0.002386 0.002006 
+-0.000801 0.000413 -0.000130 -0.000166 0.002169 0.000793 
+-0.000059 0.003644 -0.008384 0.004483 0.001234 -0.000864 
+0.008034 -0.003502 0.005503 0.002689 -0.003217 0.002387 
+-0.013076 0.002226 -0.017885 -0.005979 0.005221 -0.005662 
+0.004112 -0.001973 0.005867 0.009363 -0.006429 0.025672 
+1.801282 -2.673077 4.288462 2.263514 -2.682432 5.709459 
+2.210145 -1.702899 5.362319 0.023771 0.007921 0.027730 
+0.014129 -0.000129 0.017109 0.001054 -0.004178 0.001339 
+0.001565 0.002509 -0.007712 0.022423 0.008866 0.009846 
+0.012839 0.031580 0.004426 0.015683 0.009037 0.006264 
+0.008864 -0.017549 0.002665 0.008371 -0.034138 0.012285 
+0.023362 -0.023223 0.015018 0.028599 0.008067 -0.005683 
+-0.042540 -0.002888 -0.017227 0.062786 0.044971 -0.030225 
+0.045911 0.024929 -0.040835 0.026681 0.006909 -0.013846 
+0.000518 0.006198 0.001723 0.009218 0.004626 0.006156 
+0.009528 0.006586 0.019022 0.010611 -0.014178 0.012429 
+0.015452 -0.020327 0.005519 -0.153426 -0.095324 0.011620 
+0.006948 0.032804 -0.021856 0.026370 0.040236 -0.000962 
+-0.007270 0.017341 0.001434 -0.000232 0.011381 -0.005315 
+0.008680 -0.011985 0.004183 0.000735 -0.020280 0.006372 
+0.002143 -0.027429 0.006429 -0.008608 -0.015784 -0.004667 
+0.000357 0.003393 0.001607 0.016440 0.039649 -0.019508 
+-0.001641 0.018550 -0.003101 -0.020144 -0.005816 0.021642 
+-3.112583 -2.245033 3.231788 -3.521531 -3.004785 2.937799 
+-3.712644 -3.360153 2.513410 -3.944444 -3.677778 2.188889 
+-3.964758 -3.775330 1.823789 -3.118012 -2.925466 1.173913 
+-0.013707 -0.008256 0.004248 0.006628 0.008689 0.005754 
+0.015805 0.041886 -0.003145 0.011142 0.035045 -0.053648 
+0.008249 -0.012896 0.003660 -0.002605 -0.014323 0.009432 
+-0.010525 -0.003507 0.009648 -0.006696 -0.002452 0.004299 
+-0.002241 0.002711 0.001530 0.002163 0.010125 -0.001442 
+0.003524 0.007815 -0.003413 0.003970 0.000848 -0.000791 
+0.004255 -0.001445 -0.000323 0.003899 -0.000523 -0.001492 
+-0.000984 -0.000691 -0.002699 -0.001483 0.002668 -0.003133 
+-0.003910 0.005017 -0.001926 -0.001934 0.004605 -0.001850 
+-0.001339 0.002582 -0.000031 0.003015 0.004898 0.000955 
+0.002405 -0.000053 -0.000606 0.003901 0.001611 -0.002237 
+0.004262 0.003682 0.001315 0.004085 0.004995 0.003016 
+0.004181 0.007152 0.002245 -0.000065 0.006623 -0.012922 
+-0.003223 0.002831 -0.006820 0.002886 0.003657 -0.000453 
+0.003381 0.000730 0.002731 0.003613 0.005922 -0.000418 
+-0.005114 0.006259 -0.000745 0.006045 0.009166 0.001949 
+0.007700 -0.002443 0.003679 0.008721 -0.004201 0.014400 
+0.007623 0.000600 0.025298 -0.000128 0.002920 0.028011 
+0.000540 0.002602 0.019274 0.003484 0.002114 0.009849 
+0.003875 -0.001713 0.001353 0.002490 -0.005265 -0.003512 
+0.002389 0.004167 -0.019111 0.023330 0.012531 -0.026291 
+0.000640 0.013496 -0.012201 0.009822 0.014140 0.012962 
+-0.019710 -0.012478 0.007177 -0.016166 -0.045833 0.028527 
+-0.003333 -0.041780 0.014921 0.000417 -0.010000 0.000042 
+0.008057 0.013814 0.002071 -0.006841 0.014215 -0.022981 
+-0.000833 -0.012667 -0.025333 0.025857 0.006414 -0.013829 
+0.025284 -0.003986 0.000967 0.023523 -0.015701 0.020992 
+0.013951 -0.004393 0.015256 0.008436 -0.004267 -0.013287 
+-0.013333 -0.020000 -0.066667 -0.011260 0.023381 -0.036076 
+-0.006124 0.002308 0.004763 0.001302 -0.009503 -0.002857 
+-0.006914 -0.005329 0.000837 -0.018016 -0.008436 0.015939 
+-0.011133 -0.012071 0.028077 -0.014027 -0.019124 0.022876 
+-0.012101 -0.021231 0.011187 -0.005980 -0.017682 0.000772 
+0.001654 0.002730 0.000305 0.010013 0.026018 -0.025298 
+0.002846 0.016642 -0.005169 -0.009820 0.000114 0.017311 
+-0.027275 -0.015769 0.029093 -3.581699 -3.241830 2.954248 
+-4.005076 -3.878173 2.406091 -4.262712 -4.156780 1.991525 
+-4.317269 -4.060241 1.558233 -3.934211 -3.460526 1.078947 
+-3.028249 -2.474576 0.661017 -0.016020 -0.014342 0.006260 
+0.002128 0.005385 0.004089 -0.015556 0.006035 -0.096567 
+0.010476 0.000020 -0.016952 0.005349 0.012597 -0.009409 
+0.006177 0.009689 -0.004720 0.007063 0.007159 -0.002252 
+0.008452 0.008394 0.001554 0.010693 0.014875 -0.001395 
+0.008917 0.014368 -0.005508 0.005701 0.007584 -0.004676 
+0.002894 0.006270 -0.003844 -0.001466 0.006895 -0.001393 
+-0.003370 0.002774 -0.006713 -0.000910 0.003305 -0.005063 
+0.003610 0.002032 -0.003273 0.001870 0.002170 -0.004189 
+0.002058 0.005370 -0.001963 0.004377 0.003254 -0.002347 
+0.003933 0.003005 -0.000661 0.002866 0.006887 -0.000288 
+0.002974 0.009817 0.000996 0.005079 0.009542 0.001585 
+0.008383 0.005505 0.000121 0.006956 -0.001253 -0.006378 
+0.001127 -0.002107 -0.005962 0.002462 -0.003694 -0.000352 
+0.002730 0.000555 0.002249 0.007822 0.006559 0.002486 
+0.007507 0.006780 -0.001292 0.003184 0.000606 0.000466 
+-0.001839 0.000569 -0.001291 -0.000235 0.000096 -0.000841 
+0.004082 -0.000255 0.000663 0.001871 -0.000892 -0.000744 
+0.003472 0.004402 -0.001091 -0.002697 -0.001292 -0.004117 
+-0.002324 -0.006595 -0.014184 0.006071 -0.011198 -0.012735 
+0.014413 -0.012789 -0.001419 -0.003675 -0.002638 0.000397 
+-0.009404 -0.004218 0.009130 -0.008261 -0.004324 0.005894 
+0.009980 -0.014291 0.015729 0.017500 0.000000 0.009500 
+0.015045 -0.013321 -0.010109 0.023571 0.007357 -0.015964 
+0.016675 0.012980 -0.030887 0.017588 -0.000132 -0.026053 
+0.031074 -0.022314 -0.016198 0.031856 -0.034065 -0.030228 
+-0.043137 0.005980 -0.002647 -0.023798 0.004760 0.028750 
+-0.032753 -0.003900 0.039519 -0.005112 -0.021781 0.040739 
+0.020119 -0.007042 0.004167 0.012328 -0.027261 -0.043083 
+-0.006356 -0.007778 -0.026178 -0.007500 -0.007500 0.005000 
+0.005341 0.028977 -0.016591 0.008682 0.036517 -0.027197 
+0.005557 0.015429 -0.013892 0.001900 0.002028 0.000269 
+-0.005586 0.001660 0.000837 -0.003188 0.011372 -0.011899 
+-0.002805 0.018974 -0.001967 -0.001906 0.003925 -0.001584 
+0.001006 0.002133 -0.002252 -0.001016 0.006807 0.009012 
+-0.012457 -0.004333 0.029570 -0.038461 -0.020563 0.034527 
+-4.726619 -4.143885 2.712230 -4.959799 -4.507538 2.060302 
+-4.861111 -4.388889 1.523810 -4.518383 -3.963235 0.867647 
+-3.963115 -3.327869 0.159836 -3.168539 -2.393258 -0.505618 
+-0.010778 -0.014147 -0.006018 0.016724 0.006104 -0.010882 
+0.035588 -0.059118 0.012353 0.001686 -0.004615 -0.010185 
+0.013683 0.011205 -0.008003 0.007974 0.006864 -0.001624 
+0.001188 -0.001430 -0.000720 0.000000 -0.002750 0.000000 
+0.001626 0.004154 -0.002857 0.001516 0.006959 -0.003091 
+-0.001653 0.002128 -0.004980 0.002177 0.002250 -0.007085 
+-0.001089 -0.001294 -0.005072 -0.001427 -0.002892 -0.002779 
+-0.006773 -0.006206 0.005082 -0.000440 -0.001369 0.000684 
+0.001188 0.004817 -0.003077 0.001622 0.006565 -0.002302 
+0.001729 0.003104 0.001414 0.006572 0.003039 0.000187 
+0.005153 0.003629 0.001548 0.003671 0.001110 0.001770 
+0.004332 -0.002527 0.001348 0.002286 -0.001620 -0.000289 
+0.001560 0.000584 -0.000455 0.001051 0.001402 0.000263 
+-0.001075 0.000991 -0.001124 -0.004068 -0.003108 -0.001891 
+-0.002728 -0.004973 -0.004874 -0.002494 -0.000394 -0.002380 
+-0.002759 0.000514 0.001151 0.001684 0.000219 -0.000993 
+-0.000157 0.007326 -0.002361 -0.000789 0.002736 0.001373 
+0.000115 0.003038 0.000605 -0.001680 0.002869 -0.002467 
+-0.007416 0.001431 -0.012614 -0.032131 -0.015104 -0.012210 
+-0.015009 -0.014613 0.009374 0.004784 -0.011344 0.004972 
+0.006805 0.002796 0.000412 -0.001935 -0.005806 -0.015161 
+-0.005283 0.000455 -0.018491 -0.014928 0.006081 -0.005715 
+0.002858 0.007474 -0.015080 0.025909 0.018357 -0.012238 
+0.005060 0.007861 -0.017139 -0.021775 -0.044329 -0.021385 
+-0.018742 -0.030606 0.005742 0.165386 0.014106 -0.055314 
+-0.000932 -0.005551 0.023164 0.005756 -0.008770 0.027266 
+0.011212 -0.001055 0.026382 0.012530 -0.000470 0.024983 
+0.014747 0.002511 0.011450 0.001470 0.002447 -0.001975 
+-0.034621 0.002222 0.027696 -0.064907 0.002963 0.058981 
+-0.023471 0.001176 -0.007824 0.006734 0.004380 0.009299 
+0.034193 0.016091 -0.016427 0.017330 -0.002005 0.008505 
+0.003823 0.009042 0.013340 -0.025426 -0.018148 0.007609 
+-0.007254 -0.014823 -0.002921 0.001921 0.002369 0.005480 
+0.007992 0.016737 0.001085 0.014684 0.007409 0.000641 
+0.000379 -0.002158 0.008126 -0.023791 -0.010285 0.026134 
+-0.049326 -0.037566 0.030315 -5.279412 -4.492647 2.110294 
+-5.074627 -4.378109 1.258706 -4.888889 -4.206349 0.658730 
+-4.577778 -3.877778 0.162963 -3.944000 -3.300000 -0.260000 
+-2.984615 -2.507692 -0.620513 -0.016951 -0.014819 -0.001292 
+-0.024496 -0.019288 -0.000969 -0.052830 0.012411 -0.043356 
+0.003885 0.006691 -0.004296 0.002802 0.002229 -0.002389 
+0.002027 0.000548 -0.001192 0.001981 0.005767 -0.003573 
+0.003226 0.007472 -0.010273 0.004923 0.005342 -0.009401 
+0.001377 -0.000287 -0.005357 0.002541 -0.003663 -0.001491 
+0.000458 -0.008681 -0.002772 -0.008246 -0.008527 -0.003788 
+-0.010329 0.002401 0.001976 -0.003483 0.006966 -0.003258 
+-0.002048 0.006369 -0.001424 -0.000392 0.003518 0.001897 
+0.003281 0.006082 -0.000292 0.007846 0.006322 -0.003452 
+0.005989 0.003804 -0.000665 0.001751 0.000639 0.000897 
+-0.000038 -0.000260 -0.000031 0.002007 0.002868 -0.001180 
+0.004996 0.007510 -0.003561 0.002527 0.008537 -0.001034 
+0.000069 0.003000 0.000030 0.002859 -0.006120 0.000447 
+0.007447 -0.012118 0.000453 0.002773 -0.001615 0.010542 
+-0.028833 -0.029255 0.014016 -0.003812 -0.011648 0.003579 
+0.004253 0.004370 0.003754 0.009332 0.001902 0.004828 
+0.000137 -0.000282 -0.000036 0.000265 0.012202 -0.006209 
+0.004201 0.016650 -0.009313 0.009925 -0.003738 -0.000300 
+0.011271 -0.015607 0.005074 0.000000 0.000000 0.010256 
+0.001363 0.002858 -0.001263 0.005740 0.020435 -0.009840 
+-0.012779 0.023714 -0.009734 -0.030584 -0.002739 -0.012372 
+-0.075549 0.041429 -0.015110 0.129113 0.007456 -0.012820 
+-0.020909 0.021136 -0.083864 -0.033797 -0.004645 0.045623 
+-0.060150 -0.019606 0.021129 -0.048143 -0.000891 0.015347 
+0.010625 -0.010245 0.000910 0.016925 0.031735 -0.001786 
+0.032464 0.010697 -0.009080 0.000361 -0.000360 -0.000647 
+-0.001862 -0.013186 -0.009163 -0.005062 -0.016080 -0.004906 
+-0.043101 -0.003413 -0.059174 -0.003740 0.060988 -0.097907 
+-0.032434 -0.029455 -0.020644 -0.011932 -0.002925 -0.010983 
+0.019296 0.005605 -0.012310 0.011605 0.011975 0.006173 
+-0.002316 -0.011132 0.003270 -0.027826 -0.038438 0.021141 
+0.007763 -0.016487 0.008429 0.000462 -0.003748 0.000930 
+0.010179 0.015009 -0.001754 0.010970 0.012777 -0.008072 
+-0.003337 -0.000682 0.000227 -0.017537 -0.017676 0.006272 
+-0.029180 -0.040377 0.021083 -0.048590 -0.045535 0.023026 
+-5.378788 -4.598485 1.257576 -5.372340 -4.388298 0.563830 
+-5.008474 -3.974576 0.055085 -4.400749 -3.505618 -0.325843 
+-3.837736 -3.128302 -0.550943 -3.495455 -2.904546 -0.809091 
+-3.457143 -2.885714 -1.285714 -0.038150 -0.027611 -0.017520 
+-0.019627 0.000667 -0.008489 0.002288 0.007496 -0.006089 
+0.001436 0.011132 -0.005109 0.000389 0.011676 -0.005968 
+0.005709 0.011844 -0.004397 0.009576 0.006550 -0.000546 
+0.006085 0.000095 0.001602 0.000323 -0.000364 -0.000468 
+-0.004568 -0.000728 -0.002556 0.000144 0.005528 -0.005992 
+0.000505 -0.000049 -0.006060 0.001316 -0.001162 -0.002204 
+0.000097 -0.000341 -0.000336 -0.001118 0.001970 -0.000715 
+-0.004391 0.002135 -0.000039 0.000988 0.005719 -0.006089 
+0.004823 0.011789 0.001702 0.000205 0.007760 0.002977 
+-0.002378 0.000468 -0.001261 -0.002723 0.002275 0.000032 
+0.001598 0.005262 -0.002367 0.002996 0.006691 0.001890 
+0.001957 0.004049 0.003075 0.003788 -0.000953 0.002962 
+0.008508 -0.022771 0.005950 -0.026972 0.002254 0.004924 
+-0.019123 0.000455 -0.002874 -0.004592 0.000279 -0.002629 
+0.001703 -0.001958 0.004779 0.000688 0.000863 0.002096 
+0.000072 0.006652 -0.003166 0.000663 0.009627 -0.005736 
+0.001421 0.003843 -0.001693 -0.000737 -0.005236 0.004331 
+-0.005571 -0.007494 0.007532 -0.013549 -0.006623 0.001812 
+-0.016384 -0.010890 -0.002872 -0.020643 -0.012722 -0.009495 
+-0.022435 -0.000470 -0.014268 -0.000032 0.021210 -0.009992 
+0.021454 0.022135 -0.007567 0.006331 0.027842 -0.012149 
+-0.003384 0.030118 -0.006402 0.011845 0.016077 -0.001183 
+-0.009048 0.009420 0.014179 -0.009443 -0.012227 0.011879 
+-0.005011 -0.016485 0.006216 -0.001708 -0.015069 -0.008077 
+-0.000991 -0.017608 -0.024138 -0.042943 -0.012714 -0.012029 
+-0.029565 -0.033598 0.000495 0.006127 -0.018564 0.000963 
+0.031138 0.008862 0.007797 0.034868 -0.001570 0.002592 
+0.015835 0.035835 0.002460 0.028159 0.024418 -0.017120 
+-0.026857 -0.032286 0.056429 -0.011826 -0.027500 0.044940 
+-0.011781 -0.003355 0.015638 -0.009191 0.008923 0.006056 
+-0.001427 -0.004883 0.001481 -0.006974 -0.008018 -0.004587 
+0.001770 0.000899 0.000368 -0.000347 0.004705 0.000988 
+-0.005429 0.002931 -0.005105 -0.008477 0.000821 -0.001166 
+-0.016222 -0.016814 0.002562 -0.030926 -0.028544 0.018135 
+-0.046019 -0.039240 0.014992 -5.363636 -4.009091 0.354545 
+-5.184524 -3.976191 -0.142857 -4.778761 -3.734513 -0.362832 
+-4.466166 -3.462406 -0.624060 -4.279412 -3.250000 -0.959559 
+-4.075000 -3.062500 -1.300000 -3.843575 -2.882682 -1.586592 
+-0.035448 -0.023713 -0.016516 -0.024551 -0.007311 -0.005244 
+-0.007901 -0.005545 0.003081 -0.003100 -0.004165 0.000183 
+0.002719 0.000058 -0.000183 0.008339 0.002115 0.001164 
+0.008448 0.000021 0.001714 0.007857 -0.000018 0.000294 
+0.011300 0.006230 -0.004110 0.005516 0.008053 -0.008337 
+0.001075 0.004053 -0.003970 0.002577 0.000417 -0.002275 
+-0.001013 0.003143 -0.000481 -0.001298 0.005098 -0.000485 
+-0.004182 -0.003977 0.004765 0.000735 -0.001404 0.000465 
+0.001138 -0.000285 0.000640 0.002024 -0.001426 -0.000481 
+0.003061 0.002098 -0.009225 0.004176 0.003118 -0.004561 
+0.001483 0.001915 0.000600 0.003564 0.001678 0.002360 
+0.009679 0.001445 0.006265 0.009882 -0.001166 0.002644 
+-0.003838 -0.006247 0.016223 -0.001769 0.001691 -0.001606 
+0.001822 0.000953 -0.008050 0.002051 0.006071 -0.008618 
+-0.003875 0.004211 -0.007275 0.000276 0.003541 -0.003182 
+0.000455 -0.002986 0.000037 -0.000048 -0.008739 -0.006124 
+0.005788 -0.006700 0.000831 -0.001219 0.001346 0.001045 
+-0.013742 -0.009908 0.003761 -0.010366 -0.001977 0.001274 
+-0.016987 -0.002786 -0.008676 -0.021121 -0.009392 -0.012346 
+-0.016073 -0.005732 -0.009126 0.017345 0.017766 -0.022182 
+0.010932 0.010421 -0.004086 -0.006155 -0.041105 0.013570 
+0.017608 -0.061830 0.021757 0.053068 0.055972 -0.084637 
+0.005241 0.022900 -0.004840 0.012751 0.007860 -0.004715 
+-0.012753 0.003478 -0.005714 -0.003750 -0.013333 -0.024583 
+-0.026641 -0.036463 0.009957 -0.012040 -0.013719 0.011821 
+-0.020203 -0.012030 -0.009284 -0.031559 0.001447 -0.002304 
+-0.002727 0.024969 -0.009512 0.029264 0.014748 -0.009134 
+0.031915 0.024480 -0.001750 0.039695 -0.029984 0.012597 
+0.006447 -0.017375 0.016811 -0.025049 -0.006198 -0.002531 
+-0.017210 -0.002314 -0.017024 -0.015779 0.005160 0.001589 
+-0.005466 -0.013600 0.011616 0.000077 -0.003823 -0.002495 
+0.011742 0.013792 -0.015781 -0.005001 0.004913 -0.012724 
+-0.000322 0.003593 0.001218 0.005725 0.011358 -0.003521 
+-0.000853 0.001401 -0.008468 -0.005744 -0.004560 0.000019 
+-0.019830 -0.003318 -0.001445 -0.039858 -0.044318 -0.001062 
+-5.920792 -4.297029 -0.029703 -5.857143 -4.103896 -0.298701 
+-5.402913 -3.859223 -0.635922 -4.872000 -3.668000 -0.928000 
+-4.483517 -3.472528 -1.135531 -4.318007 -3.302682 -1.310345 
+-4.172897 -3.144860 -1.448598 -3.385621 -2.705882 -1.450980 
+-0.020958 -0.011255 -0.009187 -0.007300 -0.003635 -0.001666 
+-0.002667 -0.001993 -0.000696 -0.000550 -0.000159 -0.000142 
+0.001429 0.003798 0.001867 0.008223 0.008753 0.001045 
+0.015895 0.011373 -0.005169 0.016390 0.011328 -0.003723 
+0.014234 0.007430 -0.000171 0.008307 0.003292 -0.001111 
+-0.000303 0.001598 0.000295 -0.001763 0.002655 0.004145 
+0.006966 0.002856 0.001855 0.001314 0.003996 0.003374 
+0.000737 0.002947 0.001447 -0.002521 -0.002614 -0.000375 
+-0.004545 -0.001425 0.000780 -0.002470 0.001892 0.001223 
+-0.000667 0.002754 0.001948 0.002759 0.001986 0.004474 
+0.006834 -0.000730 0.014894 0.002914 -0.009121 0.027828 
+-0.011781 -0.000027 0.015142 -0.007273 0.008325 0.004650 
+-0.010045 0.010032 0.004347 -0.003033 0.006418 0.003262 
+0.005373 0.008425 -0.013658 0.008174 0.005506 -0.016225 
+-0.004331 0.004493 -0.005972 -0.003042 -0.001280 -0.008804 
+-0.003648 0.004416 -0.004609 -0.028176 -0.007850 0.006449 
+-0.004614 -0.013777 0.004292 -0.001901 -0.004050 -0.000620 
+-0.003384 0.007656 -0.001491 -0.005840 0.006287 -0.007635 
+-0.009209 -0.003952 -0.001062 -0.006461 -0.018904 0.005424 
+0.008760 -0.024165 0.010068 0.007523 -0.022172 0.020428 
+0.043382 -0.000448 0.003406 0.051818 -0.024545 0.002727 
+0.020600 -0.026067 -0.013668 0.043716 -0.005463 -0.062848 
+0.017768 0.050106 -0.018265 -0.014395 -0.007531 -0.006506 
+-0.019157 0.007663 -0.017222 -0.018429 0.013357 0.003214 
+-0.055398 -0.046031 0.043993 -0.016135 -0.019901 -0.002779 
+0.014204 0.013460 -0.011086 0.014751 0.013678 -0.004408 
+0.019182 0.011638 -0.014793 0.054522 0.008281 -0.022086 
+0.028571 0.064762 -0.017143 0.010758 0.048464 -0.021730 
+-0.005764 0.006949 -0.000844 -0.008264 -0.004725 0.007680 
+-0.009012 -0.015679 0.000208 0.003411 -0.008886 -0.010135 
+-0.000056 0.000905 -0.001540 0.001943 0.002793 0.000425 
+0.009111 -0.001517 -0.002425 0.011355 -0.001267 -0.006752 
+0.008671 0.006430 -0.008101 0.001121 0.002127 -0.001235 
+-0.003917 -0.002021 0.003399 -0.010051 -0.019161 0.002962 
+-0.049922 -0.040599 -0.000537 -6.621053 -4.210526 -0.736842 
+-6.113475 -4.127660 -0.886525 -5.537634 -3.951613 -0.881720 
+-5.184685 -3.752252 -0.972973 -4.838710 -3.487903 -1.221774 
+-4.392996 -3.225681 -1.439689 -4.069565 -3.082609 -1.491304 
+-3.746988 -2.951807 -1.331325 -0.028858 -0.024543 -0.008518 
+-0.017469 -0.012135 -0.001414 -0.010533 -0.005786 0.000878 
+-0.001368 -0.002763 0.000054 0.010506 0.003418 -0.000630 
+0.017722 0.008346 0.001221 0.010282 0.010680 0.005417 
+-0.001884 0.007053 0.006232 -0.004143 0.002804 0.006173 
+-0.000201 0.000427 0.003427 0.000758 -0.000409 0.000578 
+0.000123 -0.005928 -0.007093 -0.004103 -0.006236 -0.004741 
+-0.005744 -0.003466 -0.001225 -0.001759 -0.000583 -0.000348 
+0.001747 0.002535 0.001580 0.003671 0.004002 0.003996 
+0.009560 0.002606 0.007400 0.022485 -0.005329 0.019344 
+0.020245 -0.032397 0.020098 0.011658 -0.039282 0.036264 
+-0.028668 0.014504 0.025681 -0.010661 0.014925 0.019012 
+0.025155 -0.004690 -0.009719 0.012441 0.018259 -0.020843 
+-0.000124 -0.003496 -0.003251 0.002883 0.000679 -0.002139 
+0.008308 -0.003231 -0.008680 0.009709 -0.003666 -0.009852 
+0.002103 -0.001264 -0.000123 -0.012823 -0.009309 0.005235 
+-0.004628 -0.008429 0.004244 0.010267 0.004997 -0.002695 
+0.007001 0.001596 -0.000535 -0.005339 0.002436 0.008785 
+0.009476 -0.005396 0.008831 0.016729 -0.021975 0.015878 
+0.021179 -0.041810 0.042601 -0.062736 -0.106771 0.060866 
+0.026835 -0.034613 0.024579 0.025464 0.000710 0.013437 
+0.025325 -0.015844 0.013701 0.009019 -0.001409 0.004631 
+-0.005608 0.000935 0.003333 -0.018573 0.000954 -0.000249 
+-0.027433 -0.006284 -0.009051 -0.029293 -0.011869 0.007778 
+0.000009 0.000472 0.002505 0.001708 -0.006194 -0.009525 
+0.034763 0.041903 -0.005553 0.027636 0.025161 -0.011963 
+0.013655 0.007690 0.001149 0.005490 0.009324 0.021441 
+-0.026429 0.006190 0.026429 -0.003122 -0.004856 0.028261 
+-0.000961 0.001345 0.001921 0.001221 0.008001 0.002581 
+-0.010625 0.020823 -0.001856 0.001165 0.013991 0.001696 
+0.002690 -0.012524 0.004246 -0.003503 -0.007534 0.010610 
+-0.002482 0.001220 0.005103 -0.008519 0.008393 0.002597 
+-0.007890 -0.000510 0.001422 0.003553 -0.004286 0.009843 
+0.006004 0.000272 0.004678 -0.000542 -0.000120 0.000542 
+-0.013108 -0.005615 -0.001872 -0.027663 -0.031720 -0.009039 
+-5.099010 -3.693069 -1.009901 -5.600000 -3.900000 -1.114286 
+-5.530120 -3.807229 -1.144578 -4.989362 -3.606383 -1.148936 
+-4.419355 -3.396313 -1.082949 -4.137500 -3.245833 -1.075000 
+-4.017168 -3.090129 -1.240343 -3.849462 -2.822581 -1.500000 
+-0.030847 -0.018798 -0.015763 -0.011531 -0.000820 -0.007830 
+-0.004923 -0.004896 -0.000702 -0.005459 -0.006822 -0.003860 
+-0.003080 -0.001967 -0.001306 0.004338 0.006285 0.006184 
+0.007879 0.006630 0.004546 0.006759 0.005023 -0.000988 
+0.003940 0.006258 -0.003167 0.003793 0.005039 -0.000343 
+-0.003898 -0.002965 -0.027698 -0.008524 -0.007134 -0.013123 
+-0.007966 -0.003592 -0.005789 0.005460 -0.005976 -0.004384 
+0.029441 -0.015048 -0.006046 0.031524 -0.011902 -0.005081 
+-0.003064 0.002670 0.012660 -0.010980 0.002138 -0.012354 
+0.000219 0.013799 -0.001144 0.006257 0.007559 0.013365 
+0.003243 0.022744 0.051723 -0.031698 0.009938 0.130048 
+0.017632 -0.024527 -0.136447 0.008251 0.008489 -0.003617 
+-0.005587 -0.001609 0.005604 0.000400 -0.000802 0.003679 
+0.008201 -0.000478 -0.008862 0.027598 0.004431 -0.027992 
+0.011045 -0.000597 -0.000397 -0.035191 -0.019423 0.045129 
+-0.043395 -0.006864 0.047118 -0.017895 -0.000129 0.003734 
+0.008631 -0.000938 -0.020044 -0.014726 -0.007185 -0.008090 
+-0.014283 0.000268 -0.001487 -0.001254 -0.007774 -0.003260 
+0.011215 0.001841 0.003971 0.013885 0.002462 0.001346 
+0.015984 -0.008178 0.016830 -0.012801 0.001176 0.015225 
+-0.013636 -0.018836 0.078713 -0.001404 -0.008276 0.012357 
+-0.012045 -0.017201 0.021470 -0.018638 -0.028575 0.031315 
+-0.015955 -0.027290 0.036644 0.004743 -0.006471 0.018254 
+0.005059 0.000364 0.000866 -0.006039 -0.000543 -0.004132 
+-0.035637 -0.008409 -0.034102 -0.022253 0.026835 -0.016582 
+0.008139 0.018111 0.002483 0.007083 0.005542 -0.000792 
+0.014158 0.013810 0.009911 0.063057 0.005075 -0.027532 
+0.021392 0.018212 0.002023 -0.019285 0.013117 0.018921 
+-0.013860 0.000540 0.016830 0.003827 0.018533 -0.002216 
+0.003217 0.014579 0.000251 0.007631 -0.011627 0.001854 
+-0.016364 -0.005345 -0.007424 -0.035471 -0.002812 0.005783 
+-0.011687 0.020068 0.007437 -0.018863 0.000161 0.001335 
+0.017113 0.005322 0.006143 0.017420 0.012788 0.000177 
+0.003765 0.001840 0.000867 -0.018625 -0.006983 -0.004067 
+-0.043742 -0.034296 -0.006362 -5.519608 -3.803921 -1.147059 
+-5.360000 -3.620000 -1.013333 -5.235955 -3.483146 -0.882023 
+-5.196721 -3.415301 -0.721311 -4.806283 -3.240838 -0.643979 
+-4.213953 -3.000000 -0.809302 -3.890295 -2.848101 -0.991561 
+-4.045455 -2.863636 -1.013636 -4.560000 -2.800000 -0.846667 
+-0.033515 -0.028005 -0.011222 -0.017338 0.002807 -0.009959 
+-0.009049 -0.002385 -0.001900 0.014204 0.003744 0.000771 
+0.011163 0.006959 -0.001717 0.000148 0.004606 0.005336 
+-0.001981 0.001313 0.005418 -0.000618 0.001179 0.003156 
+0.031135 0.035708 -0.024876 0.025809 0.026617 -0.055049 
+0.004790 0.002816 -0.018375 0.003702 0.002009 -0.004494 
+0.058994 -0.004022 -0.005048 0.075183 -0.003732 0.006437 
+0.024834 0.006364 0.028973 0.000378 0.015688 -0.008820 
+0.006447 0.001301 0.000226 0.007661 -0.008507 0.021666 
+-0.002334 0.004702 0.001141 -0.043500 0.040833 0.014500 
+-0.020143 0.042829 -0.052086 0.085331 -0.010883 -0.137224 
+0.041806 0.033181 -0.038153 0.014165 0.005312 -0.005185 
+-0.004484 0.008614 0.000715 0.117632 0.033745 -0.043178 
+0.032072 0.048402 0.034696 0.000667 0.018081 0.022602 
+-0.042516 -0.033092 0.024360 -0.049118 -0.009415 0.025193 
+-0.017908 0.000858 0.003447 -0.018482 -0.002553 0.003983 
+-0.013333 0.002452 -0.001778 -0.006061 0.005504 -0.002954 
+0.000118 0.000026 -0.000076 0.002959 -0.008276 0.005781 
+0.006516 -0.000279 -0.000465 0.019461 -0.003592 -0.025779 
+-0.003639 0.012790 -0.023997 -0.006238 -0.009320 0.014765 
+-1.707182 -1.994475 2.629834 -1.865741 -2.236111 2.995370 
+-1.695187 -2.058824 2.673797 -0.011078 -0.011479 0.015039 
+-0.000034 -0.000053 0.001892 0.003846 0.003132 -0.001151 
+0.000346 -0.010394 0.011484 -0.014003 -0.030782 0.035277 
+-0.003964 -0.002396 0.003808 -0.001908 0.000887 -0.001390 
+-0.015191 -0.013013 0.009141 0.051474 -0.011705 0.023105 
+-0.012836 0.001605 0.020824 -0.025676 0.003071 -0.003449 
+-0.001000 0.008006 -0.004927 0.009220 0.013906 -0.010137 
+-0.004335 -0.001498 0.007296 0.005807 -0.013306 0.009303 
+-0.002262 -0.014250 0.022125 -0.005550 0.008889 -0.004036 
+-0.055631 0.035155 0.012417 -0.077776 -0.017169 -0.017867 
+-0.022929 -0.004137 -0.042633 0.016727 0.031009 -0.017510 
+0.029421 0.026395 -0.015270 0.011808 0.004648 -0.012562 
+-0.011282 -0.007432 -0.002813 -0.028492 -0.027517 -0.006755 
+-5.205883 -2.990196 -0.784314 -5.263158 -3.177632 -0.796053 
+-5.054645 -3.213115 -0.814208 -4.834225 -3.187166 -0.828877 
+-4.497238 -2.983425 -0.812155 -3.989418 -2.777778 -0.751323 
+-3.625592 -2.748815 -0.701422 -3.562212 -2.884793 -0.617512 
+-3.870056 -3.192091 -0.468927 -0.042682 -0.036084 -0.003706 
+-0.033515 -0.020578 -0.005169 0.017085 0.024159 -0.024325 
+0.013885 0.008907 -0.004384 -0.003135 -0.006047 -0.004215 
+-0.000018 0.000590 0.000927 0.002836 0.000091 0.001376 
+0.029967 0.009244 0.012574 0.027088 -0.000469 0.006998 
+0.020252 0.014986 0.021466 -0.006803 0.021537 0.015020 
+-0.012302 0.018064 0.009555 -0.010055 0.018832 0.005893 
+-0.002500 0.017241 0.006897 0.004375 -0.002312 -0.006937 
+-0.005208 0.022292 0.008542 0.016179 0.029337 0.009103 
+0.036022 0.041111 -0.040025 0.023898 0.022938 -0.063409 
+-0.026765 -0.156176 0.196324 0.012248 -0.013227 0.010667 
+-0.009466 0.027473 0.008761 -0.006920 0.008763 -0.001614 
+-0.022527 -0.008963 0.033174 -0.039727 -0.023288 0.017515 
+-0.006846 0.009775 -0.007583 0.012879 0.019798 -0.020908 
+0.002585 0.007301 -0.022556 0.003700 0.002223 -0.011812 
+0.001821 0.004429 -0.010249 -0.003082 0.002951 -0.004512 
+-0.001814 -0.004322 0.003607 0.007437 -0.004666 0.005722 
+0.014384 -0.002661 -0.002868 0.001025 0.004728 0.000395 
+0.003077 0.005287 -0.002203 0.009067 0.009155 -0.008944 
+0.019430 0.026492 -0.025664 -0.004870 -0.001015 0.009641 
+-2.023952 -2.514970 3.263473 -2.307692 -2.796154 3.261539 
+-2.259124 -2.708029 2.901460 -1.830000 -2.240000 2.115000 
+-0.005507 -0.007959 0.003798 0.007088 0.005352 -0.005951 
+-0.001089 -0.002774 0.008059 0.000194 -0.005841 0.011893 
+0.006952 -0.001223 0.006384 0.015016 0.007195 -0.005407 
+0.015330 0.004633 -0.009894 0.005953 -0.000615 0.002075 
+0.004128 -0.000937 0.007692 -0.000135 0.008296 -0.005333 
+0.011286 0.042272 -0.017353 -0.065789 0.055442 -0.024864 
+-0.004713 0.003708 -0.024580 -0.001527 -0.000223 -0.005512 
+0.004744 0.001737 0.000304 0.014359 0.013025 0.001439 
+0.019722 0.005111 0.005611 0.026634 0.005707 -0.008261 
+0.028082 0.031817 -0.084101 -0.096961 0.030907 -0.027392 
+-0.007662 -0.012013 0.012338 0.036369 0.038174 -0.013267 
+0.009071 0.008576 -0.003243 -0.006994 -0.008156 -0.008651 
+-0.031682 -0.027487 -0.010286 -0.043225 -0.042295 -0.011716 
+-5.084967 -2.986928 -0.575163 -4.587940 -2.824121 -0.331658 
+-4.556098 -2.907317 -0.073171 -4.719577 -3.026455 0.132275 
+-4.494444 -2.933333 0.166667 -3.963542 -2.932292 0.151042 
+-3.769608 -3.142157 0.181373 -3.645833 -3.187500 0.151042 
+-3.082278 -2.632911 -0.063291 -0.022514 -0.013218 -0.001836 
+-0.004388 -0.006248 0.007481 0.023919 -0.025100 0.022422 
+-0.014601 -0.023479 -0.014083 -0.002712 -0.005491 -0.006340 
+-0.002509 0.018886 -0.039687 0.015767 0.014815 -0.027831 
+0.017180 -0.001770 -0.019731 0.008314 -0.001410 -0.006570 
+-0.005987 0.012857 0.003592 -0.000470 0.007991 -0.001880 
+0.008556 0.035111 -0.016111 -0.003959 0.037461 -0.013270 
+0.000356 0.020000 0.000071 -0.007363 -0.008454 0.012481 
+-0.009731 -0.039568 0.024201 0.001262 -0.010859 -0.064523 
+-0.002196 0.014404 -0.051578 -0.005242 0.003234 0.000953 
+-0.000276 0.027331 -0.010037 0.011099 0.035718 0.000348 
+-0.044132 -0.071300 0.073121 0.000374 -0.004420 0.004682 
+-0.002373 0.013448 -0.014488 -0.004118 0.028680 -0.029669 
+-0.013452 0.015767 -0.018214 -0.008076 0.012486 -0.006670 
+-0.006334 0.009779 -0.000799 0.000582 0.007820 -0.002108 
+0.000233 0.000123 0.001425 0.001195 -0.002390 -0.002390 
+0.009730 0.004713 -0.004957 -0.001156 -0.000444 -0.003422 
+0.005133 0.014267 -0.009667 0.001721 0.009574 -0.011561 
+0.003863 0.000957 -0.009558 -0.004121 -0.007365 0.006894 
+-0.027510 -0.022719 0.028348 -2.641791 -3.233831 3.726368 
+-2.683333 -3.454167 3.562500 -2.197309 -3.094170 2.744395 
+-0.013470 -0.016564 0.010948 -0.001123 -0.002752 -0.002108 
+-0.000260 -0.002445 -0.001074 0.000890 -0.001783 0.003795 
+-0.000459 -0.001418 -0.002345 0.001806 0.001574 -0.002924 
+0.003566 0.001947 0.001627 -0.002165 -0.003075 0.002685 
+-0.001144 -0.006000 0.002746 0.009373 0.008031 -0.011399 
+0.021548 0.009427 -0.034478 0.016830 0.000533 -0.049268 
+-0.012880 -0.003176 -0.027070 0.004094 0.029334 -0.021634 
+0.005488 0.010131 -0.014413 0.003849 -0.013024 -0.000711 
+-0.000130 -0.019491 -0.001461 0.021880 -0.009291 -0.003837 
+0.001985 0.010920 -0.018182 0.050710 0.039224 -0.058947 
+-0.005284 0.079748 -0.033362 0.010222 0.017749 -0.006836 
+0.016839 0.031028 -0.025231 0.000837 0.003118 -0.024053 
+-0.007491 -0.013280 -0.012981 -0.026108 -0.020182 -0.013276 
+-0.047421 -0.034253 -0.009859 -5.412214 -2.931298 -0.488550 
+-5.229947 -2.967914 0.080214 -4.940092 -2.995392 0.433180 
+-4.535211 -2.906103 0.586854 -4.110526 -2.873684 0.757895 
+-3.706215 -3.056497 0.932203 -3.178947 -2.910526 0.636842 
+-2.600000 -2.371428 0.042857 -2.302885 -2.149039 -0.067308 
+-0.024540 -0.021795 0.003664 -0.018455 -0.027585 0.011874 
+0.005004 -0.031168 0.022039 -0.003120 -0.019130 -0.017793 
+-0.011595 0.007123 -0.013362 -0.011815 0.011038 -0.000337 
+-0.009148 -0.001296 0.005037 0.019412 -0.005294 0.000000 
+0.036740 0.009056 -0.004631 0.033778 0.045111 -0.022444 
+0.016667 0.052162 0.008694 -0.028697 0.015704 -0.012887 
+-0.031746 0.011185 -0.002091 0.027381 -0.013890 0.005911 
+0.009973 -0.026154 0.044878 0.006687 -0.011744 0.028801 
+0.006998 -0.003402 0.007900 0.002791 -0.002542 -0.009806 
+-0.001269 0.001203 -0.002136 0.004012 -0.012288 0.012405 
+0.005367 0.000489 -0.001997 0.001968 0.013829 -0.006695 
+0.002874 0.036749 -0.016577 0.017084 0.035290 -0.039803 
+-0.006128 0.008456 -0.009002 -0.003665 0.005049 0.000347 
+-0.001816 0.001128 0.000094 0.000340 -0.000740 0.000853 
+0.000199 -0.000283 0.000455 -0.000830 0.000397 -0.001170 
+-0.003965 0.002150 0.003338 -0.004154 -0.000065 0.000182 
+0.000601 0.005221 -0.007667 0.011217 0.012586 -0.012847 
+0.008082 0.002864 -0.013095 -0.002577 -0.007817 0.008165 
+-0.015258 -0.023337 0.030496 -2.453416 -2.962733 3.906832 
+-2.637255 -3.191176 3.823529 -2.295238 -3.061905 3.104762 
+-0.010074 -0.022727 0.022727 -0.000146 -0.013680 0.005479 
+0.006750 -0.001917 -0.003934 0.007287 0.001230 -0.002060 
+-0.002920 -0.000202 -0.000713 -0.008012 -0.000054 -0.003230 
+0.001052 0.007874 -0.005040 0.008072 0.014055 -0.015712 
+0.015510 0.013790 -0.013458 0.008116 0.008909 -0.012949 
+0.007695 0.012471 -0.017145 0.009644 0.013592 -0.016223 
+0.004787 0.008996 -0.006927 0.006903 -0.000090 -0.013505 
+-0.014147 0.004346 -0.012844 -0.020901 0.004442 -0.002352 
+0.001735 -0.007849 0.022521 0.026923 -0.019231 0.050769 
+0.014972 0.005444 0.022941 -0.001521 -0.010734 0.016398 
+0.017905 0.028095 -0.002762 0.016610 0.021071 -0.010819 
+-0.018020 -0.023853 -0.000348 -0.008373 -0.009608 0.014922 
+0.007347 -0.000057 0.021100 -0.006745 -0.005513 -0.009639 
+-0.008086 -0.015212 -0.028290 -0.029921 -0.030357 -0.021303 
+-5.026786 -2.633929 -0.741071 -4.782353 -2.747059 0.129412 
+-4.373206 -2.693780 0.827751 -4.019324 -2.541063 1.434783 
+-3.491620 -2.212291 1.620112 -2.722543 -1.901734 1.075145 
+-2.405797 -2.159420 0.647343 -2.472574 -2.662447 0.780591 
+-2.490196 -2.965686 1.058824 -0.017385 -0.031437 0.014696 
+-0.011414 -0.022011 0.012528 -0.006089 -0.007657 0.014601 
+-0.017680 -0.022207 0.017374 -0.019118 -0.038249 0.015024 
+-0.026001 -0.019436 -0.000631 -0.001999 0.000254 -0.000137 
+0.011176 -0.005063 -0.000422 0.018722 0.038551 -0.001761 
+0.024357 -0.002500 -0.018429 0.036000 -0.066940 -0.080328 
+0.055216 0.010111 -0.022261 0.053783 0.102533 -0.026053 
+0.014292 0.033846 -0.016814 -0.012628 0.002016 0.023508 
+-0.002361 0.000881 0.017348 0.000624 -0.000434 -0.001513 
+0.001800 0.000299 -0.002699 -0.002147 -0.002725 0.002700 
+-0.000206 0.002713 -0.000025 -0.001743 0.010803 -0.003423 
+-0.002308 0.013048 -0.013936 -0.003737 0.006405 -0.013091 
+-0.004028 0.002778 -0.003889 -0.004948 0.001562 -0.002273 
+-0.002392 0.006089 -0.001773 -0.001981 0.009746 -0.008140 
+0.004565 0.011412 -0.006190 -0.001702 0.001316 0.002947 
+-0.001514 0.000117 0.004531 0.001020 0.001842 -0.002682 
+0.009153 0.010222 -0.008816 0.013114 0.015928 -0.012601 
+0.009959 0.011869 -0.008968 -0.000737 -0.001928 0.000397 
+-0.018005 -0.014088 0.017104 -0.024411 -0.026262 0.032737 
+-2.634921 -3.206349 3.873016 -2.288889 -3.444444 3.548148 
+-0.011227 -0.027156 0.024518 0.005290 -0.013611 0.003274 
+0.019965 0.006703 -0.015141 0.015833 0.015954 -0.015941 
+-0.001284 0.008193 -0.007476 -0.003416 0.004963 -0.005639 
+0.002076 0.006030 -0.005536 0.004621 0.001508 0.000680 
+0.000025 -0.000135 -0.000056 0.001735 0.005409 -0.001586 
+0.010212 0.021545 -0.011073 0.010186 0.024673 -0.011792 
+-0.002522 0.013092 -0.010906 -0.009033 -0.004700 -0.025578 
+0.018722 -0.023248 0.004587 -0.001882 -0.035698 0.031087 
+-0.066052 -0.066187 0.062442 -0.043333 -0.029883 -0.001868 
+0.011686 0.014687 0.017546 -0.006652 -0.001540 0.038925 
+-0.009347 -0.022870 0.030455 0.006939 -0.052959 0.021122 
+-0.016272 -0.008070 0.049342 0.005654 0.005934 0.003412 
+0.004385 0.005657 0.017101 -0.010047 -0.003473 0.017739 
+-0.020595 -0.019449 -0.009735 -0.020861 -0.026473 -0.010588 
+-0.032925 -0.033481 -0.010076 -0.042336 -0.030912 -0.002890 
+-4.384106 -2.410596 0.503311 -4.062857 -2.377143 1.297143 
+-3.743017 -2.379888 1.826816 -3.358289 -2.465241 2.085562 
+-2.857143 -2.660714 2.133929 -2.466667 -2.913725 2.101961 
+-2.204545 -3.222727 2.050000 -2.275000 -4.050000 2.083333 
+-0.016197 -0.056498 0.028436 -0.021824 -0.028458 0.009517 
+-0.008659 0.005936 -0.002618 -0.001669 -0.022871 -0.010684 
+0.006477 -0.019624 -0.010275 0.006211 0.011973 0.002791 
+-0.007241 0.023030 0.007122 -0.010087 0.009548 0.006485 
+0.002484 -0.006536 -0.000131 -0.002394 0.002406 -0.001109 
+0.001064 -0.010524 0.000548 0.023099 0.020647 0.021495 
+-0.022303 0.021342 -0.001871 -0.000438 0.000020 0.001056 
+0.002098 -0.000511 -0.003216 0.000505 0.003822 -0.003203 
+0.001333 0.000869 -0.000212 0.007437 0.004013 0.002202 
+0.010429 0.007426 -0.000743 0.005535 0.000631 -0.006657 
+0.003743 -0.001036 -0.004205 0.003787 -0.002802 -0.004047 
+0.003452 -0.005416 -0.000570 0.001005 -0.003159 0.002871 
+-0.000778 0.001653 0.003990 0.001504 -0.001753 0.002771 
+0.006298 -0.004291 0.002614 0.003493 -0.001670 -0.000100 
+-0.001344 0.001810 -0.000461 -0.001071 0.004870 -0.000521 
+0.003408 0.008131 -0.005266 0.008784 0.003441 -0.010799 
+0.011003 0.008122 -0.008917 0.002834 0.005678 -0.006633 
+-0.008705 -0.003163 -0.001417 -0.022532 -0.003391 0.016986 
+-0.021850 -0.013279 0.031335 -0.015004 -0.017761 0.028462 
+-0.002585 -0.012301 0.009478 0.008152 0.001471 -0.010538 
+0.002497 0.004642 -0.013576 -0.013692 -0.001171 0.002469 
+-0.011615 -0.001306 0.012028 -0.000027 0.002376 0.001399 
+0.007190 0.006759 -0.005266 0.005343 0.002338 -0.003228 
+-0.000523 -0.000567 -0.000192 0.002796 0.004839 -0.005083 
+0.005656 0.009651 -0.005181 -0.000888 0.008969 -0.002141 
+-0.004926 0.006048 -0.009124 -0.006552 0.006904 -0.018259 
+-0.009814 -0.029764 0.004249 0.098333 -0.007671 -0.020457 
+0.021286 -0.024545 0.017029 -0.000935 -0.006086 -0.003130 
+0.005166 -0.005290 0.005851 0.039153 0.002800 -0.009788 
+0.003164 -0.002488 0.010453 0.007261 -0.019091 0.030858 
+-0.217678 0.024794 -0.043633 0.008817 0.024520 -0.049286 
+0.000145 -0.018189 -0.004737 -0.022439 -0.019799 -0.015000 
+-0.021709 -0.009658 -0.001197 0.001188 -0.000435 0.002692 
+-0.009645 -0.003538 -0.011199 -0.017107 -0.014513 -0.015417 
+-0.033642 -0.021035 -0.003590 -0.044759 -0.022056 0.009280 
+-4.551181 -2.913386 2.062992 -4.031250 -3.075000 2.931250 
+-3.086758 -2.963470 3.118721 -2.350000 -2.861538 2.992308 
+-1.869369 -3.004504 2.959460 -1.779661 -3.627119 3.440678 
+-0.030626 -0.042108 0.044784 -0.020382 -0.023848 0.007798 
+-0.026836 0.030309 -0.004087 -0.031667 0.012188 0.000717 
+-0.031949 -0.002174 0.006846 -0.025050 -0.011096 0.006800 
+-0.015931 0.010693 0.008874 -0.003778 0.008522 0.026489 
+-0.005715 -0.005407 0.005753 0.044767 0.039313 -0.025871 
+-0.010284 0.016312 -0.020124 0.005653 -0.011481 0.005931 
+0.000343 -0.009587 0.009915 -0.004071 -0.005879 0.010367 
+-0.003000 -0.003819 0.006771 0.000268 -0.001043 0.000587 
+0.002547 0.002863 -0.006999 0.001226 -0.000153 0.000153 
+-0.001403 0.000118 -0.001799 -0.005038 -0.002574 0.004189 
+-0.006336 -0.007619 0.007174 -0.002370 -0.003403 0.002582 
+0.005976 0.003885 -0.004167 0.005710 0.001691 -0.008078 
+0.003898 0.000436 -0.002202 0.001537 -0.001125 0.000964 
+0.002666 -0.001168 0.001216 0.005728 -0.001688 0.000453 
+0.007590 -0.001885 -0.000579 0.005470 -0.000233 -0.000058 
+-0.000247 0.001863 -0.001118 -0.002916 0.001573 -0.006521 
+-0.003557 0.001282 -0.001522 0.003643 -0.001276 -0.002916 
+0.001823 0.002247 -0.001493 -0.001000 0.000678 -0.000915 
+-0.002548 0.002123 -0.000863 0.003038 0.005190 -0.002405 
+0.007080 0.005027 -0.005868 0.008533 0.002822 -0.000111 
+0.004049 -0.001055 0.004404 -0.000446 -0.006090 0.008337 
+0.001110 -0.007554 0.008641 0.004064 -0.003251 0.004877 
+0.004168 0.001656 0.000032 0.003517 -0.001132 -0.000675 
+-0.001093 0.003632 0.000518 0.002500 0.007668 -0.000878 
+0.005617 -0.000267 0.000447 0.001839 0.001410 0.003014 
+0.006022 0.009049 -0.000887 0.002753 0.008831 -0.004276 
+0.000358 0.020740 -0.016777 -0.001031 -0.015771 0.017114 
+0.003053 -0.028885 -0.002642 0.017143 -0.019121 -0.044176 
+0.027220 -0.007992 -0.054942 0.012941 -0.002715 -0.021719 
+-0.008509 0.007733 0.012640 0.001702 0.017766 0.018989 
+-0.061069 0.026172 -0.034000 0.006273 -0.042120 0.007172 
+0.007312 0.006846 0.010111 0.010028 -0.004160 0.002568 
+0.003004 0.002207 0.006342 -0.002227 -0.030656 0.027439 
+-0.038136 -0.022007 0.018767 -0.013288 -0.019194 -0.005588 
+-0.019973 -0.018705 -0.005107 -0.030101 -0.015865 -0.000441 
+-0.042528 -0.012903 0.011064 -4.228814 -3.067797 3.203390 
+-3.281879 -2.979866 3.557047 -2.247126 -2.568965 3.281609 
+-1.809524 -2.523809 3.190476 -0.023995 -0.032345 0.029242 
+-0.022890 -0.023202 0.012446 0.018353 0.003232 -0.007596 
+-0.025455 -0.045909 0.052727 -0.013997 -0.016335 0.035469 
+-0.012073 -0.004575 0.010402 -0.014124 -0.021586 0.013058 
+-0.024889 -0.059889 0.032444 -0.026869 -0.055108 0.022611 
+-0.011954 -0.012031 0.000787 0.010892 -0.002409 0.000170 
+0.009053 0.001181 -0.023551 0.000146 -0.007022 0.007647 
+-0.007755 -0.008857 0.016569 -0.003806 0.000408 0.003962 
+0.001576 0.006952 -0.007143 0.006590 0.008061 -0.003556 
+0.001418 0.006473 -0.006227 -0.002422 0.005339 -0.003595 
+-0.002663 0.004281 -0.004096 -0.000316 0.002778 -0.002096 
+0.001262 -0.003133 -0.001803 0.003278 0.001003 -0.002176 
+0.007934 -0.000654 -0.006319 0.007005 0.001891 -0.013318 
+0.006096 0.006135 -0.013360 0.002444 0.004444 -0.005667 
+-0.001449 -0.000207 0.001007 -0.001719 -0.001268 0.002590 
+-0.000204 -0.000163 0.000286 -0.000220 -0.000149 0.000111 
+-0.004407 0.001898 -0.001128 -0.005991 0.003620 -0.004523 
+-0.003751 0.002795 -0.005332 -0.002347 0.000801 -0.002461 
+0.000060 0.000079 -0.001624 -0.001275 0.001720 -0.002013 
+0.000647 0.006112 -0.004535 0.003470 0.009751 -0.002389 
+0.007747 0.006437 0.000298 0.009085 0.005601 -0.003609 
+0.005394 0.007180 -0.005298 0.003303 0.005853 -0.004142 
+0.000033 0.001812 -0.001843 -0.003289 -0.000443 -0.001014 
+-0.002503 0.002544 -0.005280 0.002659 0.006589 -0.009723 
+0.004653 0.006114 -0.003974 0.003465 0.000406 0.006619 
+-0.000172 -0.003239 0.012136 -0.002167 -0.001916 0.006560 
+-0.003946 -0.002373 -0.002504 -0.003023 -0.005373 -0.005429 
+-0.004518 0.011842 -0.011042 0.002491 -0.003622 0.003759 
+-0.002106 -0.018306 0.057344 0.010000 0.008529 0.032409 
+0.038333 0.025500 0.012333 0.022690 0.006140 -0.020643 
+0.001889 -0.027756 0.009156 -0.076833 -0.041334 0.014590 
+-0.047768 -0.014928 0.023884 -0.000456 0.009008 0.012996 
+0.002916 0.010937 0.003333 0.005057 0.007979 0.002641 
+0.016417 0.004572 0.006501 0.013947 -0.000691 -0.002127 
+-0.015677 -0.006764 0.002729 -0.046758 -0.024124 0.023230 
+-0.041549 -0.023246 0.005431 -0.015966 -0.008426 -0.000899 
+-0.019504 -0.007119 0.009340 -0.041410 -0.010137 0.024609 
+-0.044904 -0.011335 0.032226 -0.022607 -0.009558 0.030212 
+-0.006302 -0.013311 0.016189 -0.004308 -0.002793 0.003403 
+-0.007428 0.002444 0.005489 0.005991 -0.004031 -0.002029 
+0.039390 0.007619 -0.025829 0.017857 0.010523 -0.013153 
+0.006253 -0.009356 0.005793 0.008909 -0.029272 0.008306 
+-0.014915 -0.013633 0.005255 -0.028675 -0.009102 -0.007363 
+-0.009916 0.014212 0.007138 -0.001047 -0.000159 -0.006264 
+0.003648 -0.001593 -0.013079 0.003308 -0.002412 -0.000727 
+-0.000244 -0.001062 0.001811 0.000425 0.002243 -0.002506 
+0.000674 0.004450 -0.000716 -0.000169 0.002330 -0.004079 
+0.001290 0.006603 -0.004223 0.001179 0.012231 0.001547 
+0.001915 0.010087 -0.000245 0.001454 0.002414 0.000425 
+0.001545 -0.000252 0.003358 -0.000628 0.000488 0.003721 
+-0.002407 0.000643 0.000717 -0.000562 0.000124 -0.000139 
+0.001584 -0.002120 0.001558 -0.000330 -0.003721 0.003436 
+-0.003883 -0.003146 0.005221 -0.005450 -0.001365 0.005905 
+-0.005095 -0.002373 0.004327 -0.003587 -0.002542 0.003813 
+-0.002146 -0.001411 -0.001391 0.002855 -0.003796 -0.002985 
+0.007397 0.000179 -0.002545 0.006001 0.002019 -0.003851 
+0.000618 0.001677 -0.001385 -0.002694 0.001639 -0.000694 
+-0.001258 0.001727 -0.000089 0.003774 0.001681 0.001793 
+0.009199 0.000417 0.002729 0.005413 -0.002699 0.000718 
+-0.001555 0.001035 0.001367 -0.001097 0.003429 0.000570 
+-0.002955 0.002859 -0.001075 -0.000984 -0.001285 0.000567 
+0.000231 -0.002139 0.002882 0.000995 0.001441 -0.001056 
+0.002827 0.007615 -0.008541 0.003445 0.011394 -0.011562 
+-0.000830 0.004720 -0.006924 -0.003276 0.000031 0.006303 
+-0.004151 0.000519 0.016078 0.005741 -0.000263 0.014696 
+0.005601 0.006021 0.009083 0.019907 0.032602 -0.035201 
+-0.008309 -0.006509 -0.016555 -0.000464 -0.012743 -0.005184 
+-0.000190 -0.003763 -0.008024 0.005216 0.003741 -0.010902 
+-0.031732 0.010407 0.006597 -0.042319 0.006691 0.027488 
+-0.042686 -0.000638 0.040391 -0.030596 0.016475 0.001538 
+0.006248 0.011550 -0.007876 -0.007391 -0.005409 -0.009272 
+-0.019523 0.000586 -0.008977 -0.027953 -0.021012 0.006085 
+-0.007179 -0.014577 -0.003542 -0.003155 0.006137 -0.000050 
+-0.015257 0.005927 0.014221 -0.012144 0.000322 0.033710 
+-0.019101 -0.014009 0.037788 -0.013723 -0.011917 0.011257 
+-0.014962 -0.009649 0.013581 -0.016770 -0.006792 0.017222 
+-0.015246 -0.009496 0.018776 -0.013210 -0.009656 0.012961 
+-0.002722 0.000577 0.002143 0.010122 0.019473 -0.008499 
+-0.010808 -0.036692 -0.010354 -0.015083 -0.026833 -0.013750 
+-0.043935 -0.049231 -0.008787 -0.064615 -0.043077 0.000000 
+-0.034515 0.016642 -0.007599 -0.007933 0.005756 0.013978 
+-0.003553 -0.000215 0.013672 -0.003434 -0.003087 0.012112 
+-0.002721 -0.003910 0.007747 -0.000388 -0.000180 0.000564 
+0.001988 0.002216 -0.004523 0.001718 -0.000318 0.000891 
+0.002055 -0.000654 -0.002440 0.003764 0.000377 -0.002334 
+0.002150 0.005132 0.001759 0.002620 0.004878 0.001684 
+0.004270 0.002864 0.001540 0.003551 -0.000587 0.000847 
+0.000805 0.000000 -0.003793 -0.002874 0.002816 -0.002816 
+0.000890 0.002431 -0.006880 -0.000960 0.003359 -0.007935 
+-0.000039 0.002538 -0.006585 0.003943 0.001239 -0.003623 
+0.002739 0.001785 0.002918 0.000461 -0.001194 0.003961 
+-0.000310 -0.000224 0.000550 0.000380 -0.000380 -0.001739 
+0.001643 0.004468 -0.001511 0.000657 0.005399 -0.001527 
+0.002873 0.005705 -0.002003 0.005632 0.005253 -0.001643 
+0.005196 0.003644 0.000810 0.003819 0.001890 0.001768 
+0.005875 -0.000575 0.001553 0.007041 -0.003503 -0.000354 
+0.004615 -0.004221 -0.000675 0.002793 -0.001991 -0.000030 
+0.000987 0.001158 0.000330 -0.000009 -0.000474 -0.001108 
+0.002165 -0.000722 -0.002165 0.005353 0.003999 0.002338 
+0.008822 0.006504 -0.000234 0.007346 0.008307 -0.000587 
+0.003238 0.008264 -0.003283 0.001355 0.004932 -0.004419 
+0.000708 0.001986 -0.001254 0.001238 0.002147 0.001604 
+0.002566 0.002378 -0.001314 0.000044 0.004868 -0.002569 
+0.002414 0.009145 -0.005246 0.004698 0.020851 -0.019637 
+-0.013529 0.000000 0.000000 -0.016666 -0.021352 0.006648 
+-0.001378 -0.007046 0.003408 0.007319 0.002963 -0.004705 
+0.012112 0.010621 -0.009876 -0.001667 0.007949 -0.006282 
+0.003781 0.000550 0.001134 0.012827 0.007173 -0.007268 
+0.015830 0.010951 -0.018806 0.029581 0.020248 -0.042711 
+0.049720 0.089161 -0.009720 0.001743 0.041846 -0.020932 
+-0.001229 -0.002114 0.000543 -0.026284 -0.017576 0.031397 
+-0.030078 -0.025028 0.053063 -0.023031 -0.037159 0.036462 
+-0.017886 -0.025810 0.029640 -0.012514 0.001088 0.027778 
+-0.017842 -0.007369 -0.000635 -0.000389 -0.000285 0.000359 
+0.012583 0.004815 -0.005478 0.016977 0.007106 -0.008053 
+0.018501 0.011751 -0.011885 0.020878 0.011785 -0.020825 
+0.013257 0.001771 0.002441 0.054502 -0.005393 -0.039057 
+0.076104 0.001205 -0.059229 0.027854 0.007559 -0.040813 
+-0.004860 0.002567 0.003742 -0.001434 -0.003975 0.006342 
+0.002588 0.000020 -0.002612 0.001248 0.003937 -0.005951 
+-0.002415 0.003942 -0.003137 -0.004100 0.002454 0.000060 
+-0.001216 -0.006006 -0.001252 0.001093 -0.006577 0.009000 
+-0.002310 -0.010348 0.017079 -0.010568 -0.007618 0.004915 
+0.000192 0.003000 0.000038 0.005537 0.005434 0.003683 
+0.005411 0.002184 0.004405 0.002480 0.000766 0.001598 
+-0.001842 0.000070 -0.000844 0.000307 -0.000920 -0.006136 
+0.004648 0.000970 -0.002819 0.005174 0.000658 -0.002551 
+0.002098 0.004035 -0.000198 -0.001317 0.002252 0.003460 
+-0.004300 0.001100 0.000100 0.000956 -0.001195 -0.002449 
+0.002060 -0.001910 -0.002662 0.004086 0.000004 -0.000030 
+0.003699 0.003621 0.002283 0.000975 0.003246 0.000948 
+-0.000761 0.000937 0.000232 -0.000603 -0.000661 -0.000352 
+0.001541 0.000119 0.000408 0.004835 0.004945 0.000230 
+0.006325 0.009672 -0.003051 0.004358 0.009570 0.000272 
+0.000885 0.003857 0.003393 -0.000174 0.000845 0.003458 
+0.002069 0.003286 0.004107 0.002051 0.004709 -0.000289 
+0.001521 0.004624 -0.001217 -0.000783 0.002619 -0.001469 
+0.001236 0.001094 -0.000515 -0.000591 0.000341 -0.001143 
+-0.003081 -0.002491 -0.001820 -0.004498 -0.004541 -0.001172 
+-0.002131 -0.001412 0.000209 0.004974 0.001465 -0.001703 
+0.001429 0.002453 -0.007008 -0.001467 0.006618 -0.007842 
+0.002446 0.013830 -0.010125 0.010189 0.050354 -0.033813 
+0.000000 0.032500 -0.045833 0.003687 -0.005891 0.006435 
+0.016596 -0.002686 0.002395 0.009375 0.012723 -0.005872 
+0.011994 0.017068 0.000346 -0.006667 0.000580 0.007246 
+-0.014465 0.003208 -0.001195 0.004628 0.007752 -0.012901 
+-0.000789 0.012421 -0.020895 0.008927 0.014365 -0.017194 
+0.006656 0.003570 -0.010022 0.008278 -0.007304 -0.001216 
+0.013043 -0.002030 0.000888 -0.007631 -0.006446 0.004718 
+-0.034037 -0.009331 0.013552 -0.029669 -0.021951 0.008305 
+-0.000212 -0.015450 0.030053 0.012393 -0.030071 0.026536 
+0.030918 0.024080 0.019378 0.006755 0.030609 0.036308 
+0.008795 0.015506 0.007101 0.009758 0.013576 -0.001273 
+0.003230 0.010917 -0.000200 -0.000904 0.005100 0.008531 
+-0.004094 0.005353 -0.011338 -0.006910 0.000201 -0.011009 
+-0.013954 -0.001363 -0.001231 -0.019659 -0.001808 0.015765 
+-0.007082 -0.002565 0.016702 0.004507 -0.007595 0.010035 
+0.003926 -0.010711 0.008153 0.000958 -0.007733 0.004709 
+0.000871 -0.001882 0.000237 0.001559 -0.000994 -0.000504 
+0.002558 -0.002562 -0.000209 0.001545 -0.004470 0.002581 
+-0.000731 -0.002469 0.002377 0.000116 0.000648 0.000314 
+0.000735 -0.001593 -0.001216 0.002863 -0.003116 -0.001552 
+0.003076 -0.002712 -0.000839 0.000905 -0.000795 -0.000139 
+-0.002093 0.000547 -0.000091 -0.002520 0.002312 0.002781 
+-0.002310 0.002682 0.000847 0.000302 0.002794 -0.000308 
+0.001874 -0.000518 0.000193 0.004243 -0.002160 -0.003315 
+0.003325 -0.000949 -0.007606 -0.002120 0.002972 -0.005071 
+-0.001604 0.003731 -0.000821 -0.001972 0.002630 0.001972 
+-0.004175 -0.000139 0.002922 0.002965 0.001093 0.000281 
+0.009012 0.005052 0.001015 0.010745 0.008912 -0.005067 
+0.005839 0.003167 -0.004907 0.002958 -0.000656 -0.000140 
+0.002506 -0.001080 0.001514 0.001532 0.000105 0.001072 
+-0.000258 0.000286 -0.000192 0.001361 0.001623 -0.002010 
+0.002595 0.005599 -0.003237 0.004594 0.008421 -0.000967 
+0.004930 0.005970 -0.000306 0.004687 0.001686 -0.001555 
+0.004952 0.000843 -0.001907 0.005238 0.002884 -0.000692 
+0.006143 0.005286 0.001393 0.005878 0.007165 -0.000096 
+0.005917 0.008070 -0.007525 0.007871 0.009558 -0.010704 
+0.006082 0.005938 -0.003549 -0.002775 -0.002998 0.002147 
+-0.005526 -0.007827 0.002867 -0.005065 -0.005000 -0.004221 
+-0.004548 0.013357 -0.018798 0.024242 -0.026894 -0.042992 
+0.018136 0.044778 -0.007963 0.001993 -0.002381 0.000249 
+0.024099 0.008135 -0.004767 0.020157 0.015240 -0.010681 
+-0.012206 -0.003303 0.004103 -0.034407 -0.012215 0.016750 
+0.006682 -0.005012 0.032353 0.008693 -0.007557 -0.003127 
+0.013929 -0.002825 -0.006216 0.006351 0.007492 0.000245 
+-0.008817 0.002359 0.003896 0.005526 -0.012973 0.000450 
+0.004430 -0.020512 0.005462 -0.003551 -0.008551 0.002793 
+0.002451 0.010000 -0.001471 0.011649 0.020000 -0.005295 
+0.011917 0.025195 -0.006807 0.014628 0.005151 -0.027197 
+0.010332 -0.001999 -0.020133 -0.000405 0.002162 -0.000135 
+-0.001495 -0.009714 -0.004893 -0.002859 0.001274 0.003419 
+0.001027 -0.003195 -0.007373 0.012525 -0.005086 -0.004589 
+0.004527 -0.000580 -0.004656 -0.000668 0.000850 -0.001055 
+0.001927 -0.000588 -0.000314 0.006143 -0.000503 -0.002104 
+0.008508 0.002016 -0.002698 0.004521 0.004684 -0.001695 
+-0.003400 0.004288 0.000934 -0.006489 0.003249 -0.001396 
+-0.001881 0.001364 -0.002966 0.001555 0.000880 -0.003826 
+0.003768 -0.000154 -0.000011 0.001645 -0.001363 0.000346 
+0.001814 -0.000199 0.001485 0.003700 0.001771 0.002340 
+0.000963 0.001348 0.004023 -0.003185 -0.003968 0.001891 
+-0.003200 -0.001450 0.002997 0.000971 0.001583 -0.002599 
+0.006168 0.000351 -0.001705 0.003502 -0.000332 0.001717 
+0.002959 0.002802 0.000012 0.000066 0.002564 -0.001411 
+0.001026 0.002333 -0.004012 0.004995 0.002870 -0.002143 
+0.005121 -0.001063 -0.002693 0.001853 -0.001693 -0.002467 
+-0.000674 -0.001983 0.003305 -0.004824 -0.003789 0.004685 
+-0.005145 -0.003659 0.006113 -0.000845 -0.002218 0.002782 
+0.004970 0.001665 -0.002878 0.006653 0.007252 -0.000120 
+0.002390 0.008406 0.002301 0.003266 0.007352 0.001707 
+0.002086 0.002413 0.000560 -0.000762 0.000847 -0.000059 
+-0.003181 0.001012 -0.000024 -0.005393 0.001955 0.000652 
+-0.004149 0.003413 0.001786 0.000620 0.004950 0.000928 
+0.002841 0.003575 0.000933 0.001500 0.000603 0.001436 
+0.002504 -0.004065 0.002975 0.002468 -0.002903 0.003350 
+0.002847 0.004316 0.005235 -0.001524 0.008760 0.002283 
+0.010181 -0.002762 0.001638 0.001402 -0.001758 -0.005624 
+-0.008597 -0.010704 0.002854 -0.001055 -0.007413 0.005717 
+0.013759 0.023096 -0.001997 -0.019121 0.007640 -0.025759 
+0.008244 -0.073693 0.025696 0.022514 -0.033793 0.010773 
+0.029917 -0.011901 -0.027025 0.089741 0.006296 -0.058259 
+0.052853 0.061303 -0.026945 0.016431 0.002730 0.012249 
+0.020667 -0.009829 -0.002805 0.013861 -0.006128 -0.003794 
+-0.016232 -0.008890 0.020875 -0.017154 -0.028551 0.025295 
+-0.036490 -0.028192 0.015702 -0.046776 -0.028636 0.024502 
+-0.069453 -0.038724 0.038985 -0.040129 -0.016794 -0.002745 
+0.011954 -0.022683 -0.014501 0.020738 -0.017056 -0.025944 
+0.005241 -0.009561 -0.000680 0.008940 0.020314 -0.022449 
+0.013679 0.015191 -0.006804 0.008112 0.006297 0.004294 
+0.000488 0.002173 0.003798 -0.001157 0.001791 -0.000899 
+-0.001038 -0.002678 0.005774 -0.001429 -0.003753 0.004939 
+-0.001884 -0.004463 0.005050 -0.003677 -0.003229 0.005262 
+-0.004172 0.001198 0.003069 -0.002236 0.005452 0.001045 
+-0.001123 0.006332 0.001195 0.001352 0.004564 0.001909 
+0.005991 0.005354 -0.001232 0.001218 0.007561 -0.003858 
+-0.002779 0.002266 0.002760 -0.006668 -0.005673 -0.002731 
+0.001358 -0.002116 -0.000153 0.000048 0.000190 0.000270 
+-0.001441 -0.000097 -0.001287 -0.000944 -0.000340 0.000707 
+0.002657 -0.003287 0.001306 0.005372 -0.001673 -0.000471 
+0.006804 0.000914 -0.001599 0.005021 0.003821 0.000667 
+0.003811 -0.000435 0.000953 0.004367 -0.000193 -0.004966 
+0.001015 0.002337 -0.005301 0.001650 0.004272 -0.004272 
+-0.001082 0.004071 -0.001565 -0.001544 0.000261 -0.003535 
+0.000996 -0.002610 -0.003355 0.006982 0.002552 -0.000626 
+0.002130 0.003948 -0.000559 -0.002675 -0.002354 0.002525 
+-0.002807 -0.004240 0.004981 -0.001013 -0.002480 0.001674 
+0.000601 -0.000479 -0.000017 -0.001341 -0.002445 -0.003135 
+-0.002268 -0.001753 -0.004524 -0.001025 -0.000394 -0.002287 
+-0.000078 0.000547 0.000453 0.000257 0.000889 0.000522 
+0.000665 -0.000550 -0.000215 0.000723 -0.002627 0.000122 
+0.001057 -0.002322 0.000336 0.002101 0.000372 0.000190 
+0.004194 -0.000741 -0.000659 0.005458 0.001677 0.000156 
+0.002965 0.001806 0.000468 0.001469 -0.000597 0.002579 
+0.000413 -0.000104 0.000884 0.001698 -0.002153 -0.003975 
+0.003014 0.001507 -0.004058 -0.000191 -0.000567 0.000013 
+-0.001157 -0.000398 -0.000498 -0.003460 0.000266 -0.003973 
+-0.008027 -0.001323 -0.007190 0.007004 -0.030039 0.030778 
+-0.007000 0.042500 0.037750 0.013805 0.019243 -0.003416 
+-0.001722 0.003539 0.041994 -0.134852 -0.029443 0.027913 
+-0.036060 0.041354 -0.055768 -0.001181 0.005501 0.001656 
+-0.003110 0.003852 -0.001084 0.000928 0.003983 -0.008485 
+0.005000 -0.000227 -0.009773 -0.007699 0.000588 0.001079 
+-0.022000 0.017500 0.002000 -0.013175 0.023532 0.016627 
+0.012262 0.009881 0.008601 0.009180 -0.012663 0.006489 
+0.010508 -0.009422 0.000811 -0.006914 -0.009497 0.001064 
+-0.006257 -0.005481 -0.006544 0.001456 0.001377 -0.002337 
+0.009821 0.004884 0.000309 -0.000011 0.007364 0.000347 
+-0.010779 -0.011285 0.010660 -0.001400 -0.001453 0.001330 
+0.001521 -0.003347 0.010193 0.001653 0.000149 -0.000727 
+0.001920 0.004914 -0.007806 0.006282 0.011417 -0.009734 
+0.016413 0.017762 -0.003185 0.007200 0.018000 -0.010800 
+0.005281 0.020749 -0.015267 0.019528 0.018571 -0.012017 
+0.003036 0.015029 -0.011236 0.005091 0.002176 -0.007699 
+0.004491 -0.003308 -0.005765 -0.001353 -0.000684 -0.000852 
+0.003008 0.009937 0.000008 0.015943 0.016417 0.001718 
+-0.021867 0.010933 -0.024667 -0.003121 0.037424 -0.028515 
+0.014566 0.038298 -0.020217 0.062607 -0.002735 0.198761 
+-0.007073 -0.022682 -0.014173 0.006336 0.008835 0.001678 
+0.005714 0.040549 0.027033 0.025476 -0.009960 0.005427 
+0.014421 -0.005466 0.026406 0.006563 -0.000867 0.007337 
+0.003062 0.011595 0.003731 -0.012161 0.008822 0.001454 
+-0.027644 0.003063 0.002031 -0.050133 -0.025059 0.012285 
+-0.084667 -0.071293 0.045996 -0.088690 -0.111287 0.014876 
+-0.089078 -0.084375 0.074232 -0.007570 0.000939 -0.000009 
+0.006090 -0.018147 0.015254 0.043239 0.053754 -0.019850 
+-0.038556 0.065903 -0.021069 0.007000 0.021000 0.011333 
+-0.011650 -0.011310 -0.006080 -0.014377 -0.003930 0.000623 
+0.019702 0.009346 0.010092 0.038593 0.026110 -0.004574 
+0.105102 0.052296 -0.000765 0.022348 0.031255 -0.018138 
+0.007865 -0.002514 -0.016351 -0.003258 -0.017647 -0.016290 
+-0.012736 -0.024995 -0.008677 -0.012907 -0.019402 -0.010996 
+-0.024102 -0.040081 0.005615 -0.052498 -0.037746 0.034675 
+-0.168684 -0.016978 0.000646 -0.016199 0.018483 -0.007275 
+0.035185 0.031649 -0.016993 -0.061000 0.000183 -0.001646 
+-0.021448 -0.024237 -0.022628 0.009483 0.017936 -0.021833 
+0.011300 0.014152 -0.016660 0.004352 0.001103 -0.001590 
+-0.007827 -0.007436 0.008871 -0.018832 -0.012649 0.035549 
+-0.042406 -0.031344 0.066370 0.003749 0.007380 0.013756 
+0.011797 0.013108 -0.002360 0.001762 0.004486 0.003242 
+0.001273 0.003307 0.003793 0.000714 0.003287 0.004629 
+-0.000192 -0.000969 -0.003692 0.005656 0.010710 -0.023902 
+0.004307 0.015123 -0.023149 0.004554 0.008087 0.006029 
+-0.005554 -0.005398 -0.000013 -0.008171 -0.019137 0.020363 
+-0.001847 -0.005486 0.014639 0.004297 -0.019604 0.013875 
+0.006307 -0.021648 0.010885 0.002954 -0.008331 0.001757 
+-0.000958 -0.000125 -0.000195 -0.001820 0.002756 -0.000887 
+0.013824 -0.016899 0.039328 0.025921 -0.014496 0.015584 
+0.029063 0.019471 -0.006272 0.050473 0.042860 -0.001523 
+0.063888 0.054033 -0.004132 0.018872 0.053026 -0.017436 
+0.000860 -0.000501 0.000672 0.007222 -0.001835 -0.000519 
+0.032197 0.002064 0.008436 0.016609 0.015550 -0.023428 
+0.002023 -0.003269 -0.004199 0.001308 -0.002078 -0.000611 
+0.006978 -0.003960 0.005783 0.002355 0.003001 0.001097 
+-0.000463 0.009243 -0.017575 -0.013512 0.011900 -0.012568 
+0.002500 -0.000610 -0.004270 -0.009386 -0.052915 0.043357 
+-0.052518 -0.045766 0.028823 -0.013566 -0.028456 0.046544 
+0.014229 -0.014206 0.007129 0.007535 -0.009762 -0.002812 
+0.019531 -0.001033 -0.013982 0.035000 0.003889 -0.015556 
+0.026151 0.003637 0.010410 0.008438 -0.009943 0.000572 
+-0.006474 -0.017895 0.001743 0.006422 -0.013930 -0.001118 
+0.017267 -0.011194 -0.001012 -0.009580 -0.038112 0.009510 
+-0.005829 -0.004371 -0.005714 0.003769 -0.001531 -0.010364 
+0.014709 0.023518 -0.006870 0.024211 0.014918 -0.037296 
+0.043060 0.014366 -0.028752 0.036871 0.005439 -0.004240 
+-0.006394 -0.004211 0.014199 -0.011439 -0.013270 0.026091 
+-0.000323 -0.004546 0.020795 0.003543 0.000821 0.020337 
+0.037801 0.060482 0.007143 -0.004702 -0.027179 0.038683 
+-0.043630 -0.021597 0.022908 0.013294 -0.012059 0.033706 
+0.028684 -0.003622 -0.003569 0.026150 -0.020436 0.005359 
+-0.024861 -0.046713 0.001548 -0.065818 -0.040135 -0.015547 
+-0.002362 -0.014746 -0.011256 0.006451 -0.013587 -0.004238 
+-0.009154 -0.015415 0.001462 -0.008150 0.004000 -0.014200 
+0.004153 0.017799 -0.019431 0.004106 0.011232 0.003460 
+0.012133 -0.002042 0.005013 0.004078 -0.004643 0.005345 
+0.002065 -0.000407 0.000682 0.000653 0.001862 0.005096 
+-0.007134 -0.004128 0.011596 -0.003518 -0.014312 -0.012127 
+0.019204 -0.009985 -0.017430 0.019287 0.000947 -0.000923 
+0.028352 0.001832 0.001904 0.022932 0.002298 -0.003814 
+-0.004995 -0.003478 -0.000659 -0.010833 -0.011333 0.011833 
+0.006158 0.004094 0.003901 0.016915 0.023468 0.004142 
+-0.006572 0.000410 0.000980 -0.024583 -0.026307 0.008441 
+0.002642 -0.004982 -0.000853 0.007932 -0.005903 0.042249 
+0.036016 -0.003598 0.006777 -0.001573 0.020573 -0.008184 
+-0.013311 0.004461 -0.003582 -0.025364 -0.002666 -0.001610 
+0.017053 0.010021 0.006695 0.006786 0.013684 0.005528 
+0.017958 0.011680 0.009598 0.047075 0.024432 -0.002019 
+0.059563 0.039008 -0.022424 0.067852 0.024296 -0.009630 
+0.028710 0.009839 0.021774 0.050297 0.011739 0.005589 
+0.038325 0.024067 -0.009091 -0.022204 0.001150 -0.037902 
+-0.004077 -0.008844 -0.003549 -0.003118 -0.001032 0.001093 
+0.001947 0.002976 0.000379 -0.001846 0.004832 -0.003701 
+-0.010788 -0.021848 -0.023388 0.061379 -0.092428 -0.042243 
+-0.003511 -0.012686 -0.004401 0.007317 0.004334 -0.005199 
+-0.002458 -0.014386 0.000480 0.004323 -0.046842 0.017406 
+0.004423 0.002949 0.019167 0.036131 0.017065 0.004012 
+0.035522 0.019052 -0.003411 0.022937 0.002397 -0.001141 
+0.017147 -0.031079 0.011491 0.003415 -0.036125 0.018306 
+-0.016745 -0.020205 0.011600 -0.009606 -0.007857 0.003842 
+-0.002308 0.000769 0.000000 0.074193 0.007672 -0.012791 
+0.017083 -0.017083 -0.003333 -0.000882 0.018824 0.029118 
+-0.015990 0.018935 0.038922 0.008770 0.012567 0.010374 
+0.013322 -0.011760 0.008087 -0.001655 0.001862 0.005556 
+0.024286 -0.041905 0.162143 -0.003333 0.001000 0.018667 
+-0.000808 0.002042 0.003196 0.008806 -0.018324 -0.000219 
+-0.002723 -0.023065 0.008868 -0.015347 0.023469 -0.071306 
+-0.010692 0.019322 -0.029555 0.012500 0.019474 -0.025038 
+0.022945 0.038877 -0.063096 0.014427 0.041031 -0.059427 
+-0.018763 0.025934 -0.027435 -0.010851 -0.009997 -0.031881 
+0.011973 -0.010340 -0.020272 0.005787 -0.002199 0.000116 
+0.005253 -0.003603 -0.019360 -0.002099 0.009075 -0.022822 
+0.015894 -0.020583 0.002671 0.005358 -0.004166 -0.001476 
+-0.003226 0.001209 -0.002512 -0.012874 -0.000917 -0.000577 
+-0.016608 0.000846 0.009008 -0.011359 0.001289 0.005973 
+-0.008390 0.007610 -0.001169 -0.000762 0.005331 -0.016538 
+-0.007971 -0.012429 -0.032943 0.079952 -0.022366 0.001978 
+0.048241 0.012037 -0.043426 0.013287 0.006096 -0.010725 
+0.012449 -0.001057 -0.004026 0.016169 0.003062 0.002843 
+0.025727 0.007830 0.008824 0.038586 0.005613 0.000101 
+0.024656 -0.014956 -0.008910 0.014267 -0.014274 -0.005288 
+0.012365 0.004180 0.015732 -0.023801 0.007377 0.040644 
+-0.022785 0.098977 0.006480 -0.008402 0.119564 -0.022604 
+0.015006 0.076110 -0.029113 0.003240 0.020771 -0.009349 
+0.008986 -0.024712 -0.040000 -0.000580 0.004188 -0.016790 
+-0.000104 0.007382 -0.016322 0.018100 0.020886 -0.029114 
+0.029082 0.046256 -0.053870 0.057143 0.034286 -0.043810 
+0.019233 -0.005833 -0.004967 0.009565 -0.000698 -0.000508 
+-0.020110 -0.002734 0.010921 -0.044229 -0.005896 -0.015423 
+0.012226 -0.002231 -0.025320 0.005520 -0.002111 -0.003874 
+0.003703 -0.002625 0.000051 0.001819 -0.005602 0.002367 
+-0.001205 -0.000650 -0.001718 0.018985 -0.007279 -0.012685 
+-0.013550 -0.015380 -0.002789 -0.011765 -0.015882 -0.031765 
+0.011559 0.004187 -0.003914 0.022955 0.013217 -0.011783 
+0.023374 0.028866 -0.023043 0.017020 0.035844 -0.019223 
+-0.009524 0.005952 -0.013095 -0.004495 -0.005289 0.000052 
+-0.022949 -0.006384 0.006626 -0.006145 0.010377 0.001826 
+-0.011250 0.020625 0.009375 -0.023945 0.001836 0.005198 
+-0.048673 -0.021395 -0.000917 -0.034642 -0.023775 -0.009722 
+-0.038077 -0.005385 -0.010000 -0.003644 -0.000162 -0.001377 
+0.035289 -0.009778 0.005422 0.011524 -0.021429 0.008286 
+-0.019524 -0.027238 0.041619 0.005481 -0.000815 0.005259 
+0.033150 -0.015558 -0.033856 0.021765 -0.006470 -0.052951 
+0.006491 0.001236 -0.033377 -0.021441 0.010688 -0.008129 
+-0.024848 -0.014882 -0.029801 0.000214 0.086966 0.035085 
+0.028161 0.088333 0.011264 -0.033750 0.027500 0.000000 
+-0.141515 0.086515 0.091212 -0.026800 0.048960 -0.030280 
+-0.005940 0.029150 -0.051700 0.000470 0.009361 -0.020639 
+-0.007007 0.011824 -0.008757 0.003415 0.006426 -0.010638 
+-0.000973 0.009211 0.009887 0.036132 0.014505 -0.036220 
+-0.005154 0.015150 -0.002765 -0.002622 0.001251 -0.005034 
+-0.000008 0.003591 -0.008615 -0.002897 0.001255 -0.006373 
+-0.001507 -0.003188 -0.002602 -0.002384 0.002943 0.002013 
+-0.000641 0.000255 0.002467 0.000595 -0.001046 0.004336 
+0.025193 0.029353 -0.006934 -0.014683 0.014951 0.003336 
+-0.003846 -0.016041 -0.007120 0.004068 -0.005178 -0.004068 
+0.043620 0.026886 0.005734 0.014615 0.019385 0.009692 
+0.000259 0.013972 0.009574 0.070011 0.031032 0.017319 
+0.126072 0.062198 0.042802 0.047199 -0.012695 0.000115 
+-0.075556 -0.122523 -0.020420 0.000337 -0.012141 0.071158 
+0.013737 0.013767 0.009940 0.038270 0.050714 0.001733 
+0.104839 0.100549 -0.035264 0.144797 0.144207 0.017967 
+-0.000320 -0.000172 0.000055 -0.028802 -0.023271 0.015748 
+-0.012240 -0.012182 0.020347 -0.005559 -0.003232 -0.016579 
+0.013728 0.012938 -0.005758 0.008366 0.007268 -0.002805 
+-0.003651 -0.007619 0.000106 0.001428 -0.007779 -0.007870 
+0.002539 -0.002410 -0.005105 0.009482 0.006211 -0.007085 
+0.025171 0.005190 -0.015722 0.001625 -0.001820 -0.001801 
+0.003121 -0.002903 -0.001148 0.003488 -0.006413 0.001404 
+0.005758 0.000172 0.006703 0.007618 0.025096 -0.013438 
+-0.011197 -0.009928 -0.023550 -0.007527 0.001487 -0.007945 
+0.003638 0.002267 0.009920 0.000421 0.010404 0.010930 
+0.012228 0.017030 -0.007748 -0.000368 0.037895 -0.027895 
+0.020556 0.025000 0.000000 0.021706 0.005000 0.004824 
+0.026500 -0.011226 -0.003208 0.009553 0.004883 0.003957 
+-0.000822 0.021480 0.008345 -0.006141 0.016307 0.005372 
+-0.018492 -0.006671 -0.001061 -0.051974 -0.021466 -0.010833 
+-0.079373 -0.017312 -0.010979 -0.073967 -0.008579 0.004820 
+-0.048235 -0.009262 0.021125 -0.022667 -0.002667 0.020000 
+-0.013874 0.016235 0.004976 0.001611 0.022661 0.009558 
+0.004155 0.036274 -0.000303 0.010931 0.016985 -0.048064 
+-0.033305 0.027060 -0.012667 0.049798 -0.067116 -0.048350 
+0.075537 -0.061695 -0.102034 0.038066 0.057049 0.053902 
+0.020282 0.072978 0.027762 0.022933 0.018583 0.009252 
+0.018076 0.014185 0.009784 0.033662 -0.009620 -0.008511 
+-0.007540 -0.012518 -0.013230 -0.015484 -0.032049 0.010696 
+-0.028744 -0.017216 0.013103 -0.014587 0.003951 -0.003277 
+-0.015129 0.031526 0.006759 0.042791 0.024326 0.029674 
+-0.001430 0.000118 -0.003428 -0.001422 0.004593 0.003008 
+-0.010335 -0.002102 0.002365 -0.001724 0.004138 0.009310 
+-0.003559 0.014820 -0.001982 0.010608 0.037971 -0.068292 
+0.037067 -0.025330 -0.010994 -0.112593 -0.106481 0.050185 
+0.032952 0.074635 0.006984 0.020000 0.015248 0.012475 
+0.012595 0.016360 0.019009 -0.017623 0.015000 0.021148 
+-0.025760 -0.004000 0.034347 -0.004868 0.008289 -0.007632 
+0.049973 0.010394 0.006777 0.015217 -0.006693 -0.001523 
+0.011111 0.079911 0.132044 0.007444 -0.082944 -0.013611 
+0.017370 -0.005917 0.004058 0.054450 -0.047505 0.017965 
+0.051471 -0.012214 0.029443 0.048130 0.020110 0.001901 
+0.012902 0.002380 0.004718 0.004985 -0.000498 -0.000083 
+0.006553 0.004712 -0.002823 0.008281 0.002387 0.002490 
+0.004271 -0.007497 0.013297 0.000381 -0.016930 0.022001 
+0.014192 -0.014751 0.026915 -0.018815 -0.012139 0.034143 
+-0.018624 -0.014387 0.002283 -0.011730 -0.007625 -0.005132 
+0.005739 0.004266 -0.003826 0.008089 0.008418 -0.011456 
+0.026419 0.026197 0.016117 0.005601 -0.006054 -0.006009 
+0.002219 -0.004805 -0.001722 0.001186 -0.003032 -0.000281 
+0.002699 -0.005556 0.002263 -0.003740 -0.005947 0.000244 
+0.021125 -0.010122 -0.016576 0.018462 0.000008 -0.000054 
+0.006720 -0.014640 0.014400 0.010377 0.005991 0.002264 
+0.025637 0.008352 0.005374 0.039800 0.038320 -0.015240 
+0.028224 0.018082 -0.001763 -0.001276 -0.011283 -0.003367 
+-0.019145 -0.023815 0.002374 0.009829 -0.019472 0.010555 
+0.026574 -0.002685 0.000185 0.023717 -0.007635 0.008304 
+-0.007730 -0.014588 0.015444 -0.009047 -0.010563 -0.005358 
+-0.009500 -0.000175 -0.008532 -0.012903 -0.003037 -0.000552 
+-0.014307 -0.011451 0.007702 -0.005505 -0.002189 0.003378 
+0.017629 0.025420 0.001641 0.020192 0.047143 -0.004038 
+-0.006300 0.018168 -0.024029 -0.018361 0.015639 -0.012253 
+-0.074941 -0.057500 -0.064235 0.030000 -0.129971 0.028882 
+0.253472 -0.011222 -0.174639 0.093765 -0.016506 -0.088321 
+0.020390 -0.037207 -0.004294 0.004716 0.024368 0.010742 
+0.002948 0.000356 0.001275 -0.013467 -0.014000 -0.011924 
+-0.025340 -0.014581 -0.011632 -0.015936 -0.018509 -0.007719 
+-0.011889 0.003586 -0.013397 -0.030743 0.007663 0.001018 
+-0.016662 -0.005556 -0.040465 0.001238 -0.007897 -0.020328 
+0.002281 -0.000019 -0.009602 0.000168 0.010111 -0.008266 
+-0.001673 0.007988 -0.000981 -0.000778 0.002204 0.012553 
+0.003059 -0.010012 0.016667 0.012250 -0.044812 -0.011622 
+0.010667 -0.021333 -0.005000 -0.049073 -0.017794 0.021704 
+-0.075714 -0.083313 0.043849 0.023525 -0.018665 0.002071 
+0.041960 0.021842 -0.038798 -0.059000 0.007200 -0.014400 
+-0.003689 -0.033541 -0.037344 0.014670 -0.016574 -0.009071 
+0.013035 0.000302 0.006876 -0.022039 -0.024452 0.019224 
+-0.028670 0.037978 -0.011066 -0.005524 0.003748 -0.003902 
+0.002040 -0.010091 -0.004508 0.021092 0.003527 0.000582 
+0.030255 0.014794 0.010489 0.031852 0.031024 -0.022440 
+0.011142 0.023191 -0.004546 0.034270 0.007351 -0.012914 
+0.004098 0.003041 -0.002644 0.003897 0.000785 0.000833 
+0.001016 -0.001521 0.002578 -0.000584 -0.003273 0.003453 
+-0.000285 -0.007908 0.010549 -0.026406 -0.092327 0.114270 
+-0.000193 -0.000540 0.000573 0.002226 -0.004547 -0.010402 
+-0.017752 0.006352 -0.021294 -0.022099 0.034777 -0.009069 
+-0.061875 0.014284 0.031029 0.013025 -0.026991 -0.001752 
+-0.002736 -0.015167 0.002238 -0.013333 -0.015822 0.003673 
+-0.004341 -0.013445 0.006451 0.018320 0.006259 -0.012169 
+-0.011616 0.013283 0.002929 -0.009200 -0.004000 -0.023600 
+-0.023852 -0.011926 0.011111 0.004538 -0.009077 0.030000 
+0.004606 -0.005054 0.031216 0.035227 -0.004684 0.010758 
+0.031585 -0.011552 -0.002897 0.005520 -0.027321 -0.016639 
+-0.022828 -0.059826 -0.003002 -0.043130 0.054052 -0.004481 
+-0.021210 -0.002768 0.014679 -0.009819 -0.028517 0.017016 
+-0.002189 0.047398 0.023316 0.017778 0.062222 0.015556 
+0.051602 0.027592 0.009680 0.034095 0.006435 0.007874 
+-0.007500 -0.003333 0.001667 -0.026415 -0.012389 0.004125 
+-0.018963 -0.017724 -0.002059 0.014440 -0.003534 -0.009871 
+0.024378 -0.003889 -0.021911 -0.010000 0.000000 -0.020667 
+-0.030528 -0.002041 0.007611 -0.043114 0.001013 0.037955 
+0.025521 0.031786 0.073085 0.028145 -0.027661 -0.054597 
+0.002232 -0.031652 -0.054296 -0.006958 0.002946 -0.006689 
+-0.000259 -0.018803 0.003605 0.003124 -0.029733 -0.007602 
+-0.006676 -0.016234 -0.003303 -0.019647 0.002353 0.003144 
+-0.012032 0.020254 0.015079 0.021074 -0.005852 0.024815 
+0.018255 -0.012798 -0.016371 0.006687 -0.004226 -0.014074 
+0.002802 0.002081 -0.006297 0.006174 0.005909 -0.000088 
+0.001838 0.005077 -0.005310 -0.003628 -0.014194 0.013066 
+0.003234 -0.031538 0.029910 -0.037079 -0.089982 0.005197 
+-0.045091 0.008727 -0.018909 -0.017781 0.036543 -0.014470 
+-0.002105 0.016842 -0.007368 0.035335 0.018007 -0.021158 
+0.027542 0.034739 -0.007941 -0.022603 0.006957 -0.040241 
+-0.008905 0.018200 -0.061571 -0.000300 0.002828 -0.010775 
+-0.010800 0.005000 0.007714 -0.013658 -0.039991 0.012074 
+-0.078023 -0.096628 -0.083023 -0.018568 0.041679 -0.019489 
+-0.031707 0.014940 0.014498 -0.036373 -0.011134 0.000965 
+-0.015410 -0.019119 -0.001629 0.000962 -0.030513 0.007949 
+0.012548 -0.017643 -0.013095 0.034429 0.012866 0.012502 
+-0.001372 -0.001117 0.002347 0.000545 0.001394 0.004225 
+0.002926 -0.001167 0.003748 0.001587 -0.004169 0.006394 
+0.000249 -0.007594 0.008713 0.002797 -0.008700 0.012052 
+0.019917 0.001446 0.006556 0.027780 0.034706 -0.022556 
+0.013918 0.056810 -0.036863 0.016434 0.049004 -0.054573 
+0.006515 0.013551 -0.016763 0.009406 -0.009134 0.000976 
+0.004874 -0.012556 0.003065 0.009954 -0.014915 0.005339 
+0.009135 -0.011813 0.015003 -0.000960 0.001688 0.009854 
+-0.022168 0.014761 0.013189 -0.011166 0.002057 0.006869 
+-0.003147 -0.017281 0.003817 0.009838 -0.015097 -0.000649 
+-0.001534 -0.011323 0.003598 0.004142 0.000539 0.009435 
+0.004895 0.004872 0.009772 -0.003684 -0.002896 -0.000672 
+-0.005853 -0.026054 -0.005172 -0.006914 0.002790 0.009959 
+0.031619 -0.013238 0.014524 0.014775 -0.023078 0.020566 
+0.000462 -0.008527 0.007789 0.014000 0.009150 0.003050 
+0.012632 -0.007838 0.013717 0.001614 -0.018536 0.017041 
+-0.004436 -0.010376 0.001654 0.006538 0.013133 -0.002814 
+0.055134 0.023564 -0.023624 0.078748 0.031708 -0.050420 
+0.030000 0.014444 -0.028889 -0.000500 0.003000 0.015500 
+-0.035810 -0.015031 0.046685 -0.047415 -0.034591 0.034028 
+-0.013571 0.018902 0.015122 -0.006652 -0.011830 -0.021071 
+0.009444 -0.009958 -0.018255 0.025000 0.006212 0.000888 
+0.003086 -0.014568 0.018086 0.011515 -0.004137 0.029513 
+-0.022474 -0.035548 0.021430 0.012636 -0.030388 0.020271 
+0.047272 0.021112 0.012881 -0.002584 0.006664 0.001268 
+0.001014 -0.000534 -0.007024 0.002250 -0.000289 -0.005721 
+0.010625 0.008145 -0.003423 0.017243 0.010993 -0.011741 
+0.014913 0.011058 -0.018000 0.003901 -0.006457 -0.000684 
+0.005354 -0.030088 0.045650 0.006082 -0.022018 0.046176 
+0.009630 0.009704 0.008370 0.002994 -0.014667 -0.000855 
+-0.006856 0.002417 -0.005721 -0.044062 -0.000313 0.020000 
+-0.001486 -0.016115 -0.023171 0.080704 0.011052 -0.034674 
+0.017947 0.010994 -0.014309 -0.022548 -0.020189 -0.003703 
+-0.003231 0.004154 0.010952 -0.034693 -0.021970 -0.001155 
+-0.014555 0.005225 0.003920 -0.031392 0.002628 0.031782 
+-0.047721 -0.031202 0.027145 -0.040374 -0.037513 0.010046 
+-0.023469 -0.029593 0.013750 -0.002388 -0.011365 0.017275 
+0.016984 0.007579 0.011230 0.024062 0.006250 0.024062 
+0.005414 0.003211 -0.002697 0.003447 0.001453 0.000369 
+-0.000048 -0.000990 0.004763 0.002304 -0.005032 0.003108 
+-0.000844 -0.007641 0.003825 -0.000571 -0.003237 0.001885 
+0.003677 0.002099 -0.000672 0.005311 0.002184 -0.000654 
+0.007016 0.001873 -0.001110 0.010069 0.003009 -0.003271 
+0.012286 0.004859 -0.004074 0.010685 0.007341 -0.002247 
+0.007153 0.005738 0.000364 0.002621 -0.004915 0.000927 
+0.009165 -0.014935 0.003165 -0.004195 -0.014893 0.032590 
+0.020826 0.017691 -0.000856 0.028656 0.006384 0.000612 
+0.012375 0.002354 -0.014751 -0.000595 -0.000159 -0.016087 
+-0.006658 -0.001325 -0.016825 -0.010785 0.007529 -0.000356 
+0.000410 0.008554 0.012713 -0.023224 -0.017177 0.025025 
+-0.009363 -0.018873 0.024829 -0.025667 -0.049333 0.025667 
+-0.025939 -0.042498 0.063471 0.018947 -0.021579 0.015263 
+0.005263 -0.027895 -0.010526 0.016701 -0.034925 0.024487 
+-0.009286 -0.021698 0.039057 -0.035066 -0.037543 0.022685 
+-0.013400 -0.006700 -0.011500 0.013264 0.022190 -0.037707 
+0.065043 0.035086 -0.061461 0.072482 0.019884 -0.066645 
+0.053333 -0.013333 -0.016667 -0.071778 -0.021836 0.058887 
+0.022855 0.010667 -0.023162 0.028528 0.035262 0.013406 
+0.002294 0.004509 0.005982 0.001913 -0.011086 -0.010956 
+0.000000 0.003333 -0.033333 0.000836 0.003344 -0.021579 
+-0.005176 0.008382 0.000618 0.003012 -0.000800 0.000753 
+0.021853 -0.002098 -0.022727 0.051796 -0.008418 -0.041390 
+-0.016500 -0.038000 -0.016500 -0.003875 -0.004257 -0.006486 
+-0.001295 -0.002089 -0.000532 0.000421 -0.003187 0.002852 
+0.005451 -0.001221 -0.000472 0.002401 0.001600 -0.004743 
+-0.001676 0.002123 -0.004398 -0.004372 0.003385 0.021071 
+0.017185 0.012097 0.061749 0.013146 0.034964 0.064474 
+0.017812 -0.017812 0.068125 -0.015073 -0.015696 -0.000534 
+0.002829 0.015561 0.013439 -0.053596 -0.018571 0.133990 
+0.016000 0.050000 -0.008000 0.057320 0.048333 -0.051588 
+0.020729 0.007767 -0.010093 0.009545 -0.015455 0.000909 
+0.011633 -0.043901 -0.014071 0.010331 -0.038297 0.008060 
+0.010413 -0.017458 -0.004903 0.005631 -0.006329 0.002803 
+-0.006563 -0.009469 0.003156 -0.004016 -0.001395 -0.000366 
+0.003120 0.005706 -0.002358 0.006275 0.008408 -0.001945 
+0.000372 0.002299 0.001004 -0.023508 -0.023551 0.013415 
+0.003410 0.000484 0.003599 0.003859 0.002018 0.003898 
+-0.000808 -0.000645 0.003413 0.000701 -0.002934 -0.001005 
+-0.001151 -0.001140 -0.000309 0.000567 0.000954 -0.000252 
+0.005353 0.001580 -0.000135 0.005324 0.002249 -0.000920 
+0.003777 0.005105 -0.002238 0.006061 0.010037 -0.002540 
+0.008652 0.010768 -0.001147 0.005537 0.002990 -0.000401 
+-0.003104 -0.006720 0.002265 -0.008286 -0.016053 0.000781 
+0.006559 -0.027287 0.009052 -0.021369 -0.050584 0.044320 
+0.001319 0.015242 -0.000006 -0.006829 0.008372 -0.006548 
+0.006638 -0.006779 -0.015748 -0.007046 -0.003986 -0.012173 
+-0.008889 -0.000547 -0.004376 -0.000541 -0.002973 -0.002973 
+-0.000273 -0.002386 0.001311 -0.010240 0.001457 0.008433 
+-0.023275 0.002306 0.014119 -0.019290 0.032861 -0.023705 
+0.008298 -0.004130 0.035293 0.012730 -0.001803 0.005145 
+0.001211 -0.007895 0.003632 0.010853 -0.048236 0.001202 
+-0.065377 -0.035416 0.015662 -0.037494 -0.006190 0.035173 
+-0.017619 -0.006349 -0.016190 -0.020916 0.007695 0.010096 
+-0.008249 -0.034793 0.012673 -0.025503 -0.060611 0.011551 
+-0.054434 -0.081250 0.034640 -0.146531 -0.026796 0.037345 
+0.010155 0.112752 -0.007403 -0.003097 0.036016 -0.009147 
+0.008078 0.007749 0.020113 0.035000 0.000000 0.017000 
+0.014044 -0.005801 0.001831 -0.029288 -0.028359 0.000743 
+-0.008219 -0.020594 -0.002709 0.007264 -0.006015 -0.000817 
+0.020706 0.014118 -0.013294 0.015745 0.032024 -0.000608 
+-0.022649 0.014831 -0.012498 -0.006539 0.022304 -0.011982 
+0.015834 0.022595 -0.013678 0.020733 0.009499 -0.013670 
+0.007508 0.000271 -0.002381 -0.003277 -0.007131 0.014298 
+-0.010185 -0.006484 0.036347 0.026097 0.016097 0.050633 
+-0.011066 0.026240 0.010719 -0.026247 0.057052 0.048577 
+-0.030571 0.005714 0.068286 0.022994 0.000800 0.031326 
+0.011016 0.017871 0.005215 -0.003258 0.004451 0.040606 
+0.013470 -0.021589 0.007892 0.006285 0.013602 -0.006281 
+0.026623 0.034348 -0.005605 -0.003535 0.027307 0.003711 
+0.027820 0.001488 -0.043218 -0.006692 -0.039023 -0.007068 
+-0.006402 -0.030492 0.011584 -0.012772 -0.021378 -0.000683 
+-0.001910 -0.020139 -0.004340 0.010977 -0.020395 -0.006854 
+0.014036 -0.022065 -0.011903 0.004942 -0.012424 -0.009963 
+-0.006155 -0.000853 0.015844 -0.036140 -0.000175 0.035965 
+0.002061 0.005019 -0.000852 -0.004068 0.001036 0.001622 
+-0.004596 -0.000201 0.010765 -0.003654 0.000920 0.006410 
+-0.000043 -0.000411 -0.000243 -0.001727 0.000323 -0.001814 
+-0.000076 0.002336 -0.002246 0.001617 0.004537 -0.002222 
+0.002196 0.007099 0.000071 0.003112 0.006183 0.000652 
+0.001892 -0.000478 0.000291 -0.001896 -0.003389 0.004720 
+-0.003556 -0.004567 0.002654 -0.002514 -0.007472 -0.001404 
+0.001360 -0.018167 0.000506 -0.002540 -0.029146 0.004314 
+0.016211 0.002842 0.009387 0.005737 0.001317 0.002366 
+0.007559 0.012241 -0.008840 0.010378 0.023512 -0.015098 
+0.006339 0.020765 -0.027250 0.009715 0.006964 -0.022126 
+0.013747 0.001543 -0.010006 -0.011054 -0.005980 0.008938 
+-0.090907 -0.032838 0.028264 -0.109837 -0.051528 -0.095057 
+-0.064032 -0.094140 0.086505 -0.049983 0.017083 0.039649 
+0.025471 -0.018227 0.015055 -0.013836 -0.043545 0.020145 
+-0.024735 0.002617 -0.009657 -0.031682 0.023410 -0.017949 
+-0.029767 0.057880 0.016867 -0.012353 0.041481 0.016592 
+-0.006244 -0.012081 -0.014027 0.002268 -0.008973 -0.019491 
+-0.004763 -0.002279 0.005839 -0.092991 -0.029212 0.010641 
+-0.172830 0.094867 -0.003680 -0.017485 -0.021132 -0.014207 
+0.017435 -0.005496 0.014377 0.008143 0.009483 0.002538 
+-0.011155 -0.007478 0.019775 0.000000 -0.003333 -0.003333 
+-0.002413 0.003889 -0.002896 0.001066 0.008322 -0.001610 
+-0.025341 0.009744 0.012516 -0.057331 0.001330 0.008181 
+-0.014619 0.013414 -0.001819 -0.003539 0.005065 -0.000487 
+0.007582 -0.007665 -0.007830 0.029789 0.002804 -0.002593 
+0.004583 0.014839 0.007995 -0.009359 0.002122 0.000187 
+-0.028974 -0.016469 0.019270 0.006482 -0.026461 0.040774 
+0.044375 -0.039375 0.042500 -0.142719 0.071316 0.118947 
+0.021683 -0.027856 0.035101 -0.030992 -0.095794 0.053532 
+-0.037805 -0.028248 0.082195 -0.002036 -0.077353 -0.059287 
+0.041300 -0.066123 -0.036454 0.031531 0.016504 -0.018177 
+0.032964 0.034862 0.000632 0.012357 0.048964 -0.019679 
+-0.002176 0.015931 0.003259 0.006028 -0.018219 0.007207 
+-0.019384 -0.007747 0.024046 -0.013677 -0.001563 0.017977 
+-0.017227 0.005819 0.000914 -0.004645 0.002454 -0.012101 
+0.027210 -0.011703 -0.023700 0.036287 -0.002078 -0.028015 
+0.003140 0.000546 -0.005465 -0.003626 -0.008864 0.009992 
+0.001581 0.002601 -0.000060 -0.000336 0.002293 -0.000442 
+-0.001712 0.004167 0.001535 -0.002091 0.003237 0.003596 
+-0.001658 0.001409 0.001591 -0.002260 -0.000175 0.000514 
+-0.002531 -0.002070 0.000633 0.001103 -0.000070 0.002542 
+0.002859 -0.001310 0.002402 0.001380 0.000283 0.000231 
+-0.000141 -0.005156 0.001654 -0.003534 0.004526 0.002457 
+-0.001162 0.003540 -0.001984 -0.001760 0.005507 -0.001381 
+-0.000025 0.000779 0.000536 0.021255 -0.002185 -0.023043 
+-0.005725 0.003889 -0.003146 0.033077 0.006752 -0.009231 
+0.037798 0.015160 -0.014473 0.026637 0.007812 -0.012294 
+0.007532 0.001806 -0.006675 -0.013638 -0.016659 0.033728 
+-0.018626 -0.027409 0.046544 -0.023781 0.000885 0.001272 
+-0.003702 -0.015008 -0.006803 0.007707 0.034066 0.012909 
+-0.026777 -0.037231 0.153512 -0.108101 -0.019850 0.063438 
+-0.016921 -0.051873 0.036063 -0.014579 -0.001396 -0.005674 
+0.000595 -0.008742 -0.006835 0.003172 -0.005728 -0.004110 
+0.018195 0.012945 0.000489 0.004296 0.005381 -0.000354 
+-0.003294 -0.001111 0.000732 0.013672 0.001212 -0.007986 
+0.012143 -0.018714 -0.014000 -0.062698 0.090621 0.039816 
+-0.044211 0.045622 -0.002675 0.016393 -0.063202 -0.012287 
+0.016617 -0.025141 0.004727 0.019630 0.008816 0.001165 
+0.018648 -0.010472 -0.008589 -0.020952 -0.019480 -0.021103 
+-0.043636 -0.013198 -0.012255 -0.033930 -0.019524 0.010440 
+0.000690 0.000345 -0.001149 0.026028 -0.010414 -0.006151 
+0.007418 -0.018669 0.009844 -0.002531 0.001865 0.018065 
+-0.010522 0.004689 -0.000789 -0.006864 -0.004455 -0.004356 
+0.005535 -0.008567 -0.009183 0.004764 -0.010880 -0.005638 
+-0.001765 -0.020294 0.006176 -0.000334 -0.000354 0.000717 
+0.001723 0.000181 -0.001823 -0.027597 0.000270 0.014091 
+-0.015312 -0.020522 -0.001421 0.028358 -0.033136 0.029591 
+-0.018286 -0.011429 -0.025143 0.006105 -0.039895 -0.005632 
+0.016265 0.012367 -0.030245 0.010031 0.012426 -0.017892 
+0.019365 0.022222 -0.016825 0.021127 0.019619 0.005390 
+0.002500 -0.013821 -0.024877 -0.003000 -0.005000 -0.001000 
+-0.013799 -0.013549 0.020365 -0.018416 -0.007933 0.003093 
+-0.014298 0.011904 -0.002593 0.014254 0.011947 -0.017093 
+0.042278 0.026708 -0.038344 0.075756 0.048285 -0.052209 
+-0.003094 0.001000 0.010830 -0.017778 -0.027556 0.058222 
+-0.002267 0.001437 0.000128 -0.003773 0.000275 -0.000314 
+-0.001611 0.000113 -0.000380 0.001666 0.001169 0.000500 
+0.006587 0.004074 -0.000957 0.006955 0.006523 -0.004104 
+-0.001076 0.001760 0.000449 0.000088 0.001308 0.002139 
+0.002513 -0.001978 0.002678 -0.001995 -0.002831 0.000974 
+-0.000062 0.000782 -0.001456 -0.004300 -0.000256 0.003005 
+-0.001372 -0.001060 -0.001364 0.003922 -0.003086 0.004096 
+0.012417 -0.013084 0.023747 -0.009206 -0.039184 0.014093 
+-0.032606 -0.024073 0.006894 0.003342 -0.008662 0.027281 
+0.013339 -0.003510 0.018000 -0.024427 0.012598 -0.042120 
+-0.096667 -0.041733 0.055644 -0.116078 -0.138367 0.002477 
+-0.010814 0.003508 0.065169 0.030113 0.044339 -0.053417 
+0.025698 0.042748 -0.105428 0.074703 0.059568 -0.012126 
+0.086028 0.010099 0.009289 -0.017662 -0.034334 0.023137 
+0.000138 -0.030692 0.030484 0.012727 0.002273 0.015000 
+0.004839 0.010284 0.004753 0.004348 0.016957 0.003043 
+0.012134 0.012683 -0.002574 0.009620 -0.011199 -0.005205 
+0.002679 -0.011928 -0.002305 -0.007203 0.035162 0.001271 
+0.007754 0.086000 -0.006031 -0.008493 0.057757 -0.004926 
+0.042035 0.064836 0.019592 0.018546 0.013772 0.011471 
+0.016574 -0.006098 0.008502 0.019500 -0.001500 -0.004500 
+-0.004665 -0.028226 -0.004548 -0.002195 -0.018577 -0.006754 
+-0.007347 -0.002903 0.005715 -0.008199 0.020794 0.000583 
+-0.017733 0.029867 0.004667 -0.005323 0.022258 0.001899 
+0.006262 0.006024 -0.006285 -0.001699 -0.001365 0.005369 
+-0.009472 0.001592 0.001577 -0.001712 0.008463 -0.004301 
+0.011790 0.004769 -0.014592 0.011763 -0.001849 -0.010315 
+0.006749 -0.002035 -0.001638 0.005904 -0.005767 0.003799 
+0.007206 -0.010975 0.000838 0.011071 -0.013684 -0.006813 
+0.027948 0.020466 -0.038511 0.018880 0.060000 0.014160 
+-0.008182 -0.026856 -0.008057 -0.011914 -0.002857 -0.050029 
+0.017639 -0.055139 0.018194 0.012328 -0.033267 0.018003 
+0.004818 -0.026498 0.006667 0.004580 -0.013207 0.016242 
+-0.014808 -0.008462 0.007083 -0.003392 -0.026257 -0.003626 
+0.015037 -0.002425 0.000728 0.014748 0.000289 0.006963 
+0.033100 0.002331 -0.009977 0.007745 0.012908 -0.005000 
+0.034248 0.015752 -0.025894 -0.000833 0.003306 0.002594 
+-0.000936 0.004281 0.012090 -0.010437 -0.002935 0.019882 
+0.002232 0.006790 -0.000377 0.000207 0.002865 0.000677 
+0.000056 -0.000748 0.000026 -0.000389 -0.002436 0.000786 
+-0.001745 -0.001415 0.001663 0.000074 0.002560 -0.000677 
+0.000687 0.001982 0.001462 0.001412 0.002262 0.000768 
+0.004165 0.005287 -0.002072 0.001886 -0.000140 -0.010729 
+-0.003016 0.001442 -0.004896 0.001788 0.003996 -0.001975 
+-0.000196 -0.000202 -0.000193 0.000734 -0.008203 0.000125 
+0.013874 -0.032522 0.010313 -0.033036 -0.059983 0.147789 
+-0.019105 0.016970 0.095416 0.013649 -0.003519 0.069577 
+0.013204 0.023867 0.008591 -0.110303 -0.035455 0.047879 
+0.003053 -0.058506 0.021932 -0.001845 0.000340 0.003078 
+-0.024428 0.015747 -0.009237 0.023450 0.028450 -0.029657 
+0.027854 0.023555 -0.009102 -0.004102 -0.002295 -0.000017 
+-0.006001 -0.017518 0.010372 0.002832 -0.051254 0.031326 
+-0.001805 -0.046041 0.053149 0.008333 -0.008333 0.051667 
+-0.003600 0.022200 0.022200 0.009505 0.017150 0.025260 
+0.026550 0.015523 0.014434 0.035822 0.013023 -0.003529 
+0.021189 0.002405 -0.007495 0.019506 0.024496 -0.001361 
+0.064270 0.036750 0.007536 0.078017 0.009587 -0.049256 
+0.047624 -0.004762 -0.051000 0.022844 -0.001022 -0.031778 
+0.003922 -0.003137 -0.006275 0.000231 -0.012058 -0.004327 
+0.023208 -0.004098 0.011742 0.036811 0.011900 -0.008554 
+0.027024 0.005115 -0.026590 -0.000995 0.007276 -0.006724 
+-0.018794 0.019405 -0.011823 -0.023985 0.039887 0.029286 
+0.039597 0.028036 -0.009538 0.030345 0.022672 -0.018491 
+0.014514 0.004605 -0.015978 0.003794 0.014091 -0.012465 
+-0.007057 0.021508 -0.012114 -0.017457 0.002206 0.004483 
+-0.022967 -0.015440 0.028242 -0.032308 -0.035769 0.035769 
+-0.028343 -0.021318 0.037912 0.007793 -0.000708 0.001429 
+-0.001802 0.004176 -0.015473 -0.012679 0.014163 0.030574 
+-0.032055 -0.029195 0.017158 -0.212000 -0.016320 -0.089760 
+-0.029779 -0.075147 -0.114853 -0.003240 -0.039258 -0.027898 
+0.005704 -0.014699 -0.014845 -0.003518 0.002827 0.014166 
+-0.020817 -0.028635 0.032120 -0.011364 -0.022727 0.030000 
+0.001103 0.007851 0.006992 0.010092 0.004615 0.007569 
+0.008418 -0.008367 0.001633 0.000526 -0.002820 -0.001911 
+0.015733 -0.004750 -0.026868 0.003628 -0.020240 -0.012081 
+0.004283 -0.009869 -0.003214 -0.001543 -0.002767 -0.002377 
+-0.004037 -0.006282 -0.001950 -0.004545 -0.004693 -0.001997 
+-0.004109 -0.001594 0.000115 -0.003262 -0.001595 0.000861 
+-0.001722 -0.003434 0.000687 0.002643 -0.001051 0.000177 
+0.005966 0.001066 0.001065 0.006982 0.002033 0.001157 
+0.003799 0.001064 0.000602 0.001383 -0.003937 -0.003308 
+-0.000092 -0.003878 0.000294 0.001084 -0.000024 0.000641 
+-0.001064 0.006738 0.000408 -0.003955 0.005081 -0.003673 
+-0.011107 -0.024266 -0.015947 0.017093 -0.085078 -0.056589 
+0.026483 -0.089449 -0.042119 0.002551 -0.057963 0.057751 
+0.047897 0.029039 -0.044225 -0.005121 0.027548 -0.033491 
+0.018472 -0.004134 -0.000523 -0.003869 -0.002710 0.013353 
+-0.018682 0.008154 -0.003225 0.003793 0.003293 0.006074 
+0.007114 -0.001544 -0.001878 -0.003377 -0.004019 0.003450 
+-0.003988 -0.013514 0.009275 0.004114 -0.011337 0.006749 
+-0.000941 -0.001611 0.015712 -0.017982 0.005183 0.001457 
+-0.012897 0.013786 0.002477 -0.009111 0.010889 0.003556 
+0.003086 0.003957 -0.007598 0.018459 -0.020536 -0.000142 
+0.021652 -0.040709 0.000816 0.005673 -0.027306 -0.007965 
+0.005100 0.002719 0.001303 0.020483 0.025034 -0.019724 
+0.028751 0.018318 -0.010103 0.004537 -0.003519 0.011574 
+-0.011612 -0.042941 -0.001659 -0.002484 -0.015852 0.005077 
+0.031635 0.008238 -0.011270 0.041746 0.012600 -0.018311 
+0.012486 0.002730 -0.008154 -0.031653 -0.000792 0.007562 
+0.023231 0.020782 -0.010986 0.029675 0.006233 0.010360 
+0.035286 0.011526 0.005230 0.007000 0.012719 0.002553 
+0.000818 -0.004107 -0.000549 0.003508 -0.001762 -0.002553 
+-0.008556 0.003635 0.004666 0.037703 0.042708 -0.031312 
+0.082857 0.062521 0.015630 0.080169 0.020090 -0.020005 
+-0.018286 -0.028629 -0.005543 -0.008087 -0.084848 -0.049640 
+0.006633 -0.001330 -0.035842 -0.000487 0.013933 -0.011423 
+0.005420 -0.006555 -0.001218 0.005714 -0.004911 -0.023327 
+0.000244 -0.013958 -0.007866 0.008972 -0.001255 0.005519 
+0.005015 -0.014953 0.004223 -0.003658 -0.002448 0.000839 
+-0.002295 0.005846 0.007948 0.003930 0.007607 0.012848 
+0.019252 0.003173 0.015179 0.022670 -0.004139 0.004175 
+0.018884 0.003734 -0.013133 -0.007246 0.003822 -0.007087 
+0.004800 -0.028500 -0.014400 0.021102 -0.019174 -0.039652 
+-0.000158 0.010031 -0.026341 0.004989 0.012704 -0.002204 
+-0.005954 -0.003496 -0.000336 -0.009903 -0.003500 -0.000333 
+-0.009193 0.000433 0.001778 -0.006202 0.003433 0.003442 
+-0.003736 0.002939 0.001152 -0.001189 -0.001461 -0.000336 
+0.000249 -0.001656 -0.000172 0.001208 -0.000949 0.000062 
+0.000338 -0.002049 -0.001197 -0.003097 -0.000190 0.003720 
+-0.005630 -0.001643 0.005158 -0.000834 0.001568 0.000248 
+-0.001646 0.007383 -0.001046 -0.002337 0.016012 -0.006242 
+-0.002605 0.027274 -0.016971 -0.007470 0.056146 -0.047073 
+0.053927 -0.006626 -0.049991 -0.004125 0.000136 0.015636 
+-0.001776 0.002107 -0.007329 -0.001795 0.002294 -0.008978 
+-0.004446 -0.001663 0.002889 -0.017528 0.002690 0.017605 
+-0.026548 -0.009338 0.008100 -0.017807 -0.006891 -0.007001 
+-0.016437 0.003218 -0.013218 -0.004275 0.003556 -0.021813 
+-0.010758 -0.004350 -0.005538 0.017073 0.004165 -0.009156 
+0.016996 0.010602 -0.001245 0.017423 0.009154 -0.000074 
+0.018039 0.015333 -0.004510 0.013317 0.016269 -0.021943 
+0.013743 0.003366 -0.026505 0.032126 -0.013395 0.005664 
+0.001727 -0.052922 0.024161 -0.061548 -0.033476 0.022405 
+-0.000308 0.004564 0.012923 0.000886 -0.004652 -0.006234 
+0.017070 -0.004249 -0.017015 0.009375 0.016100 -0.012075 
+-0.050000 -0.038824 0.008824 -0.057176 -0.049804 0.030866 
+-0.017987 -0.010075 0.010616 0.015882 -0.005739 0.007174 
+0.000702 -0.014614 0.013057 0.038452 0.036904 -0.033678 
+0.016111 0.013889 -0.046111 0.003938 0.015489 -0.006324 
+-0.000430 0.001909 0.017554 0.008591 0.018435 0.019704 
+-0.003704 0.002495 -0.000613 -0.023279 -0.010661 0.016666 
+-0.010565 -0.005700 0.021761 0.074689 0.035162 -0.057230 
+0.014545 0.059166 -0.032043 0.033500 -0.003000 -0.006000 
+0.028243 0.021048 0.003062 0.041395 0.042605 -0.013309 
+0.088333 0.088333 -0.173333 -0.015911 -0.015795 -0.040068 
+-0.007446 -0.014803 -0.010924 0.037333 0.001258 -0.024751 
+0.014501 0.078235 -0.015709 0.020051 0.008081 0.000556 
+0.008454 -0.031427 0.035243 0.027560 -0.008136 0.015746 
+-0.000052 0.000027 0.021111 -0.043887 0.010424 0.009595 
+0.023417 -0.006997 0.001119 0.066794 0.015588 -0.068580 
+0.072881 0.049741 -0.043116 -0.010347 -0.046887 0.053597 
+-0.009198 -0.032654 0.036975 -0.000625 -0.008750 0.006458 
+0.011461 0.006270 -0.020816 0.012931 0.020610 -0.020574 
+0.003402 0.007091 -0.001554 0.003219 0.006056 -0.002176 
+0.002476 0.003727 -0.001459 0.000672 0.002011 -0.000293 
+-0.002250 0.002439 0.000586 -0.003606 0.001982 -0.000209 
+-0.004336 0.000096 -0.001355 -0.004765 -0.001382 -0.002821 
+-0.003330 -0.001034 -0.002594 -0.003781 -0.001281 0.001378 
+-0.004220 -0.003887 0.003998 -0.002326 -0.003918 0.001194 
+-0.003153 0.001616 -0.002119 -0.005224 0.008925 -0.008640 
+-0.004793 0.015716 -0.012112 0.010274 0.014268 -0.006261 
+0.003341 -0.002735 0.008213 0.002974 0.001870 0.009178 
+-0.002818 0.002075 0.003063 0.003320 -0.021653 0.003167 
+0.007513 -0.028214 -0.001999 0.000967 -0.021772 0.005142 
+-0.006410 0.017436 0.030256 0.008815 0.036248 -0.077355 
+0.000996 -0.005574 0.001426 -0.014789 -0.007474 0.005263 
+0.000885 -0.012678 0.006252 -0.009990 -0.020572 0.049812 
+-0.003730 -0.006531 0.004522 0.006377 0.019868 -0.003452 
+0.018537 0.018537 -0.003902 0.015221 0.008996 -0.011978 
+0.011116 0.018417 -0.000884 0.016277 0.011062 0.030846 
+0.002004 0.009129 0.012636 -0.022963 -0.012657 0.021843 
+0.003820 -0.012929 0.004262 0.013571 -0.032216 -0.012994 
+-0.054072 0.003316 -0.023891 -0.043724 0.012535 -0.022396 
+-0.062986 -0.009213 -0.012962 -0.075000 0.011236 0.007022 
+-0.074167 -0.087647 0.021912 -0.050365 -0.060853 0.064290 
+-0.026894 -0.237816 0.024949 0.037709 -0.048958 -0.029247 
+-0.014244 0.034622 -0.026513 -0.012750 0.009336 -0.002897 
+0.021629 0.009002 0.027149 0.019131 0.005684 0.012944 
+-0.006036 -0.013332 0.009192 -0.009145 -0.021690 0.044871 
+-0.008889 -0.111107 0.048182 -0.020000 0.000000 -0.112000 
+0.000000 -0.016364 -0.009091 -0.005448 -0.037516 0.033306 
+-0.018333 -0.011654 0.019424 0.015675 0.006661 0.022450 
+0.006663 0.022375 -0.015959 -0.009341 -0.045714 0.046703 
+-0.038530 -0.004141 0.014607 0.015340 0.016333 0.004359 
+0.007172 0.042195 -0.015928 0.065539 0.043466 -0.037014 
+-0.004877 0.016123 -0.067479 0.021310 0.021488 0.053631 
+-0.001160 0.111881 0.071092 -0.043810 0.006190 0.112381 
+-0.017659 -0.070794 0.037163 0.029907 -0.098241 -0.032037 
+0.032492 -0.131056 0.131238 -0.010518 -0.045224 0.028172 
+0.006466 0.006018 -0.013568 -0.003716 0.003703 0.000018 
+-0.011316 -0.008008 0.007776 -0.005036 -0.020224 0.011313 
+0.003725 0.005158 -0.001844 0.004590 0.002358 -0.001086 
+0.003130 -0.001439 0.000668 0.001668 -0.001652 0.000674 
+0.003043 0.001992 0.000004 0.003048 0.005413 -0.000324 
+-0.001837 0.005161 -0.001267 -0.003857 0.001119 -0.002186 
+-0.002951 -0.002699 -0.000707 -0.005863 -0.004727 0.005140 
+0.000287 -0.002247 0.005975 -0.001461 -0.001481 0.003465 
+-0.005290 -0.000293 -0.002123 -0.006828 0.000312 -0.006345 
+-0.009409 -0.004220 -0.012330 0.005477 -0.024313 -0.016810 
+0.000068 -0.001167 0.000611 0.006494 -0.005790 0.005540 
+0.003346 -0.007247 0.001578 0.000808 -0.012857 -0.010798 
+-0.014755 -0.014323 -0.008245 0.001145 -0.007366 0.008113 
+0.007003 -0.008289 0.013833 0.005778 0.031620 -0.040544 
+0.000963 -0.008688 0.001272 -0.006117 -0.014027 -0.003544 
+-0.002268 -0.002435 -0.005197 -0.019097 -0.016894 0.061513 
+0.002577 -0.002132 0.001871 0.001340 0.001160 0.002305 
+-0.011429 -0.006743 -0.005057 -0.024430 -0.008464 0.002340 
+-0.020400 0.008676 0.019522 -0.008494 0.013740 0.023283 
+-0.009661 0.049673 -0.017470 -0.032832 0.015440 -0.030938 
+0.019424 0.018600 0.033708 -0.025309 0.090983 0.000801 
+-0.079778 0.022222 -0.048444 -0.018750 0.004583 -0.017500 
+0.001714 0.000826 0.003549 0.006552 0.002765 0.025310 
+0.008047 -0.041206 0.070863 -0.017500 -0.013720 0.033321 
+0.045143 -0.009799 -0.013857 0.002427 -0.001826 0.014831 
+0.002281 -0.000652 0.018182 0.011019 0.017879 0.025648 
+0.012177 0.016504 0.021375 0.004552 0.004059 0.000149 
+0.024027 -0.022555 0.002710 0.010286 0.008857 0.024571 
+-0.015699 -0.032445 0.036930 0.070011 0.000761 -0.020545 
+0.087706 -0.012529 -0.032353 0.004561 -0.005439 0.004386 
+-0.012677 0.012222 0.007525 0.008760 0.010423 0.025073 
+0.017443 -0.029640 0.068062 0.037215 -0.037456 0.084035 
+0.036324 -0.027766 0.021828 0.028230 0.000287 -0.039139 
+0.017989 0.039550 -0.060423 0.065351 0.067719 -0.070088 
+0.064305 0.096883 -0.065013 -0.003263 0.055700 -0.037949 
+0.023398 0.003484 -0.000066 0.152178 0.022975 0.007507 
+0.083538 -0.020223 0.012291 0.049009 -0.007368 0.039928 
+0.028082 -0.043867 0.057582 0.035991 -0.014446 -0.014847 
+0.020374 -0.004935 -0.025183 0.014682 0.020301 -0.004983 
+-0.001961 -0.010366 0.004830 -0.003760 -0.021847 -0.010807 
+-0.001008 -0.000444 0.000361 -0.001475 -0.001169 0.000285 
+0.000179 -0.000621 -0.000067 0.002323 0.002030 0.000123 
+0.004045 0.001921 0.000286 0.001932 -0.000478 0.000128 
+-0.002775 -0.000605 -0.000428 -0.003129 0.001844 -0.002091 
+0.001135 0.003571 -0.000569 0.001581 -0.000214 -0.001135 
+-0.000074 -0.001265 0.003267 -0.002484 0.001367 0.001781 
+-0.004840 0.004938 -0.000758 -0.007661 0.005102 -0.005538 
+-0.009476 -0.014418 -0.020866 0.011875 -0.013867 -0.047544 
+-0.002724 0.004158 -0.018867 -0.005222 0.003970 -0.015264 
+-0.001496 0.003059 -0.008005 0.002129 -0.001402 -0.002439 
+0.005132 0.007604 -0.007272 -0.001905 0.002556 -0.000301 
+-0.006703 0.001915 -0.001436 -0.007111 0.010707 -0.004239 
+0.006232 -0.006129 -0.005246 -0.001210 -0.002120 -0.002858 
+-0.001095 0.007184 -0.002015 -0.001758 -0.001855 0.002468 
+0.011780 0.000929 0.019126 0.010263 -0.010954 0.006612 
+-0.018842 -0.010225 0.022864 -0.017929 -0.036553 0.023945 
+-0.002282 -0.009956 0.042730 -0.020738 0.009535 0.011620 
+0.011358 -0.007228 0.008950 -0.043241 0.018252 -0.016978 
+0.111667 -0.143049 0.015894 -0.101606 0.048013 0.132491 
+-0.031575 0.020737 -0.002543 0.003028 -0.005305 -0.001552 
+0.020759 0.000635 0.010168 0.017835 0.016494 0.011126 
+0.022440 0.004421 0.001043 0.017581 -0.001713 -0.016828 
+0.020292 -0.006090 -0.006037 0.004374 0.002443 -0.001712 
+0.008503 -0.050781 -0.008476 0.004472 0.010627 0.006901 
+0.004798 0.015618 0.010602 0.000357 0.003194 -0.000992 
+0.009092 -0.047223 -0.015004 -0.071795 -0.029487 -0.004615 
+0.015438 0.009695 -0.015078 0.007086 0.006675 -0.014310 
+0.026800 -0.006000 0.014800 0.004951 0.019167 -0.019804 
+-0.016999 0.038843 -0.015192 -0.058798 0.113714 -0.051933 
+0.033480 0.051993 -0.019054 0.048236 -0.033442 -0.014243 
+0.024248 -0.018399 0.023758 0.015292 -0.015593 0.019792 
+-0.007931 0.000148 0.005484 -0.020909 0.005000 -0.005909 
+0.003015 0.010154 -0.016338 0.001089 0.012995 -0.017587 
+0.000000 0.000000 0.000000 -0.014768 0.022978 -0.012303 
+-0.000400 0.007810 -0.036248 0.010632 0.000037 -0.002690 
+0.014781 -0.015656 0.004862 0.015105 -0.016714 0.002878 
+0.012558 -0.009877 0.005174 0.011326 0.002880 0.011836 
+0.012829 -0.000463 0.006219 -0.002047 0.011518 -0.007897 
+-0.003940 -0.007121 0.002156 -0.006953 -0.003721 0.002644 
+-0.002764 0.001240 0.004276 0.000188 0.001352 0.002178 
+0.001283 0.000463 0.000092 0.001495 -0.001317 0.000245 
+0.000104 -0.000789 0.000245 -0.000131 0.001043 -0.000221 
+0.001920 0.002168 0.000746 0.004644 -0.000361 0.001944 
+0.004653 -0.000502 -0.000779 -0.000743 0.000026 -0.001483 
+-0.004970 0.003683 -0.003468 -0.008165 -0.000046 -0.007454 
+-0.018857 -0.018190 -0.011045 -0.087492 -0.035016 -0.064017 
+-0.000854 -0.000205 -0.000340 -0.125697 -0.219990 -0.406439 
+0.000721 -0.000803 0.002133 -0.003046 -0.002167 0.000657 
+-0.001088 -0.001123 -0.009982 -0.005678 0.001212 -0.024597 
+-0.013956 -0.003719 -0.018252 -0.017698 -0.006423 -0.010143 
+0.001818 -0.008884 -0.007517 0.011035 0.007365 -0.004194 
+-0.001702 -0.000654 0.001084 -0.016036 -0.008637 0.002782 
+-0.036751 0.008900 0.021258 -0.000576 -0.016158 0.007671 
+-0.014777 -0.007405 0.009846 0.005954 -0.008397 0.004580 
+0.010766 -0.010589 0.023223 -0.036055 0.058710 0.044988 
+-0.063586 -0.000253 0.095758 0.029706 -0.068147 0.003275 
+0.080988 -0.035706 -0.092160 0.005000 -0.005000 0.034348 
+-0.015809 -0.015746 -0.010043 -0.014293 -0.028384 0.006616 
+0.016697 -0.012743 0.012385 0.022804 0.002942 -0.000881 
+-0.001070 0.006129 -0.009630 0.002275 0.005592 0.004346 
+0.011714 0.010720 0.003026 0.019014 0.014399 -0.011279 
+0.023088 0.012275 0.000824 -0.006218 0.003063 -0.003440 
+0.005056 0.005548 -0.004377 0.000405 0.003467 -0.011434 
+0.009080 -0.022394 -0.013051 0.011623 -0.056753 -0.033961 
+0.021172 -0.037297 0.003014 -0.011983 -0.004655 -0.011315 
+-0.003084 -0.001961 0.000024 0.033960 -0.002606 -0.021562 
+-0.012394 0.030629 -0.025814 -0.049792 0.025667 -0.046792 
+-0.035959 -0.010504 0.007426 -0.033701 -0.040987 0.021147 
+-0.009080 -0.011996 0.001833 0.007241 -0.016379 -0.000431 
+-0.039530 -0.002283 -0.011880 -0.071714 -0.016580 0.005011 
+-0.027368 -0.010414 -0.011158 -0.022212 -0.003846 -0.008365 
+-0.055523 -0.027556 0.002228 -0.080406 -0.010114 0.019501 
+-0.014952 0.031911 0.010559 0.034067 0.045263 -0.009463 
+0.025421 0.019171 -0.012486 0.017538 0.003442 -0.009630 
+0.005795 -0.006083 0.002217 0.000011 -0.007008 0.006709 
+0.005735 -0.002491 0.001608 0.011403 0.002018 -0.007612 
+0.001645 0.000347 0.000188 0.001153 -0.001552 0.000440 
+-0.003704 0.001991 0.000111 -0.010859 -0.005295 0.006379 
+-0.003211 -0.002860 0.004220 0.002325 0.002825 -0.001770 
+0.000855 0.004831 0.000257 -0.001454 0.001510 -0.000607 
+0.000502 -0.001652 -0.000268 0.000548 -0.002831 -0.001035 
+-0.005025 -0.000588 -0.005809 -0.007472 -0.000753 -0.005444 
+-0.005907 0.002296 -0.002502 -0.001934 -0.010009 -0.000294 
+0.000019 -0.002759 0.012964 0.003803 -0.001740 0.017732 
+-0.000090 -0.003481 0.020785 0.002746 -0.004331 0.018522 
+0.004935 0.000512 0.004081 0.006954 -0.007978 -0.008354 
+0.004629 0.004163 -0.034080 0.006078 0.006667 -0.025490 
+-0.033034 -0.017265 0.002245 0.002230 0.004770 0.004572 
+0.000676 -0.008789 0.001014 0.007018 0.001130 -0.017522 
+-0.003680 0.008510 -0.006433 0.019968 0.006492 -0.005147 
+-0.006351 -0.003763 0.001474 -0.007500 -0.000857 0.000429 
+0.019045 -0.002307 -0.001136 0.014120 -0.011151 -0.001200 
+0.006018 0.002104 0.013839 -0.016151 0.044667 -0.056528 
+-0.022091 -0.007727 0.006909 0.025959 -0.025180 0.019125 
+0.020569 -0.012500 0.026446 0.003810 0.017086 -0.027764 
+0.003196 0.015088 -0.030287 0.032799 -0.015368 -0.011434 
+-0.014545 0.001374 -0.028852 0.019957 0.007240 -0.030972 
+0.006712 0.018968 -0.010944 0.003016 -0.000422 0.002374 
+-0.002775 -0.001439 -0.000399 -0.005720 -0.002618 0.002932 
+-0.008675 -0.005834 0.001130 -0.002652 0.005833 0.005181 
+-0.006688 0.011628 -0.004777 -0.009608 0.025312 -0.045795 
+0.201376 0.110432 -0.175000 0.091824 -0.064165 0.053437 
+0.027466 -0.015829 0.035200 -0.023922 -0.041636 0.005360 
+0.007759 -0.011431 0.016121 -0.004167 -0.004795 -0.012785 
+-0.001195 0.001164 0.003992 0.015206 0.004986 0.006125 
+-0.008930 0.053750 -0.003091 -0.055827 -0.057055 0.009651 
+-0.008806 -0.053338 -0.005606 -0.016480 0.032062 -0.001655 
+0.058164 0.096437 -0.021004 0.213566 0.022227 -0.005952 
+0.155879 0.101393 -0.084618 0.004695 0.022898 -0.013132 
+-0.037525 -0.018618 0.016374 -0.040117 -0.031038 0.012524 
+-0.006471 -0.003317 0.002146 0.016160 0.025363 -0.029727 
+0.002021 0.002542 -0.004110 0.002341 -0.002228 0.001288 
+0.001882 -0.000621 -0.000252 0.003052 0.002925 -0.003073 
+0.007286 0.005664 -0.004610 0.005812 0.002430 -0.005693 
+0.004193 0.002404 0.001688 0.003527 0.000874 0.001037 
+0.002382 -0.002294 0.000441 -0.001671 -0.002892 0.001626 
+-0.002327 0.001527 0.001336 0.001023 0.003441 0.002339 
+-0.000865 0.001912 0.000597 -0.001360 0.000273 -0.002267 
+0.001320 -0.001752 0.001046 0.002369 -0.003727 -0.000411 
+-0.001785 -0.005811 -0.003367 -0.008972 0.001173 -0.005130 
+-0.023634 0.009322 -0.005049 -0.003491 0.003593 0.006156 
+0.018256 -0.010725 0.032287 2.165919 -1.430493 3.941704 
+2.058366 -1.361868 3.859922 1.740741 -1.089947 3.291005 
+0.008886 -0.007385 0.022004 -0.008189 -0.013903 0.002333 
+-0.019770 -0.014122 0.001500 -0.023960 -0.034484 -0.011356 
+-0.044211 -0.054737 0.033684 -0.003125 -0.003125 0.064375 
+-0.008022 -0.001536 0.042760 -0.003780 -0.001119 0.009616 
+0.013086 0.006447 -0.020401 0.023155 0.010309 -0.027080 
+0.023972 0.022137 -0.028164 0.023746 0.022859 -0.020698 
+0.021796 0.014708 -0.026500 0.001291 0.007862 -0.007805 
+0.003619 0.004571 -0.006476 0.051866 0.063420 -0.041081 
+0.082720 0.002514 -0.118674 -0.002410 -0.008861 -0.012486 
+-0.031122 -0.048767 0.028012 -0.021438 -0.016233 0.011972 
+0.063573 0.095114 -0.039136 0.017858 0.039231 0.004762 
+-0.120576 0.025576 -0.033216 -0.015687 -0.019368 0.040604 
+-0.001953 -0.016958 0.003802 -0.002405 -0.007749 -0.000606 
+-0.011848 -0.009036 0.008805 -0.017532 -0.012755 0.031403 
+-0.014470 0.007424 0.012481 0.002963 0.008069 0.004097 
+0.005497 0.011041 -0.002714 -0.001125 -0.001047 0.000921 
+-0.023462 -0.009898 0.009400 -0.016859 -0.004579 0.004597 
+-0.000513 -0.009048 0.019772 -0.049865 -0.061410 0.095579 
+-0.074278 -0.168591 0.102354 -0.007449 -0.012776 0.024741 
+-0.029444 0.002863 0.022906 -0.022153 0.031205 0.016180 
+0.021993 0.163860 -0.034233 0.022315 0.024986 -0.014673 
+-0.007514 -0.043212 0.004885 0.030820 0.036061 -0.032590 
+0.022459 -0.004752 -0.013545 0.020155 -0.002812 -0.003883 
+0.021779 0.006379 -0.016436 0.009556 0.011652 -0.019906 
+-0.005556 0.002555 -0.001806 -0.008742 -0.003525 0.001985 
+-0.005490 -0.001027 0.001781 0.002229 0.002175 -0.003970 
+0.003370 0.000722 -0.003536 0.002412 0.000122 -0.001662 
+0.002569 0.000847 -0.001576 0.004123 0.002924 -0.001024 
+0.004141 0.004590 -0.001176 0.002549 0.003001 -0.003637 
+0.006382 0.004897 0.000356 0.009818 0.006175 -0.003840 
+0.009829 0.005887 -0.001503 0.004819 0.003888 0.002119 
+0.000460 0.002207 0.001769 -0.000667 0.001479 0.001356 
+0.001285 -0.000208 0.000352 0.000467 -0.000654 0.000252 
+-0.000120 -0.001352 0.000395 0.003816 -0.002871 0.004133 
+0.003905 0.004018 0.006588 -0.010887 0.010656 -0.000862 
+-0.008734 0.019387 -0.024766 0.007976 -0.006585 0.007443 
+2.597015 -1.253731 3.611940 3.200692 -1.740484 4.858131 
+3.273927 -1.702970 5.174918 3.004292 -1.317597 4.811159 
+0.019163 -0.008113 0.037048 0.002391 -0.013343 0.016888 
+-0.008904 -0.032783 0.008886 -0.008543 -0.062913 0.022848 
+-0.017828 -0.044859 -0.004544 -0.063182 0.011244 0.017058 
+-0.018786 -0.020789 0.044918 -0.007370 -0.010148 0.043370 
+-0.018744 -0.003408 -0.022500 0.007145 -0.004708 -0.049642 
+0.025522 0.005710 -0.045159 0.025228 0.013764 -0.036724 
+0.011737 0.015756 -0.014125 0.003558 -0.003830 0.002697 
+0.002954 -0.007612 0.007369 0.012065 0.011106 -0.018627 
+0.015320 0.018503 -0.035946 0.034571 0.027656 -0.036087 
+0.029014 0.045882 -0.048356 0.146449 0.050242 -0.054643 
+0.016946 -0.018304 0.020163 -0.058214 0.013393 0.021071 
+-0.060058 0.002400 -0.008166 -0.023739 0.005386 0.008928 
+-0.001215 -0.001661 0.003690 -0.006317 -0.007572 0.004712 
+-0.008267 0.005401 0.008609 0.005332 -0.005390 0.026256 
+-0.040653 0.059946 -0.042789 0.076465 0.091178 -0.051338 
+0.005584 0.015313 -0.005586 -0.008886 -0.010814 0.010792 
+-0.015658 -0.019601 0.020688 -2.371258 -2.694611 2.395210 
+-0.027362 -0.024544 0.027920 -0.029214 -0.024983 0.030479 
+-0.046000 -0.034826 0.039053 -0.018893 -0.046640 0.057866 
+-0.101198 -0.050985 -0.027038 -0.037930 -0.045565 0.029274 
+0.007036 0.024802 -0.022926 -0.021132 -0.004311 0.003146 
+-0.020257 0.003590 -0.002862 0.010324 -0.003507 -0.014717 
+0.005344 -0.006720 -0.007367 0.000973 -0.003382 -0.008528 
+0.005330 0.002750 -0.009524 0.002708 0.008448 -0.007068 
+0.000416 0.007842 -0.005476 -0.004133 0.001204 -0.000591 
+-0.006257 -0.003482 0.004353 -0.001943 -0.002073 0.002229 
+0.002154 0.000030 -0.000914 0.004473 0.002639 -0.000303 
+-0.000032 0.000161 0.000406 -0.000132 0.000052 -0.001363 
+-0.001921 0.004153 -0.001715 -0.001701 -0.001885 -0.001287 
+-0.004085 0.000016 0.002337 0.000412 0.001143 -0.000020 
+0.000184 0.002032 0.000256 -0.000034 0.006173 -0.001422 
+0.002856 0.007993 -0.003426 0.005192 0.004489 0.001427 
+0.003637 0.000759 0.001825 0.000008 0.003002 0.001592 
+-0.002047 -0.000974 -0.000656 -0.001122 -0.002363 -0.000520 
+-0.006552 0.002904 -0.004387 0.001990 0.014888 -0.010574 
+-0.001296 0.003410 0.000446 0.012589 -0.007664 0.021437 
+2.489960 -1.489960 3.566265 3.527132 -2.104651 5.089147 
+4.137339 -2.025751 6.021459 3.832461 -1.230366 5.623037 
+2.420690 -0.310345 4.186207 0.015466 0.001923 0.022684 
+0.004263 0.003304 0.005072 0.006134 -0.011700 0.013421 
+0.020639 0.005198 0.014808 -0.001871 0.005232 0.009141 
+-0.014027 -0.024434 0.016652 0.027832 -0.003497 0.038322 
+0.018431 0.004608 0.013333 0.016162 -0.005202 -0.031465 
+0.014052 -0.002571 -0.025649 0.011247 -0.008579 -0.007271 
+-0.000995 -0.001122 -0.000613 0.003876 0.017655 -0.004043 
+0.000194 0.012803 -0.007238 0.001679 0.001250 -0.002286 
+0.007202 0.000238 -0.013690 0.011915 0.006287 -0.030249 
+-0.000264 0.003746 -0.011343 0.074444 -0.018333 0.030556 
+-0.005333 -0.011333 0.024000 -0.004912 -0.002281 0.014386 
+0.002353 -0.002353 0.000000 0.005620 0.017742 -0.019898 
+-0.010227 0.007850 0.002972 -0.015050 0.009358 0.006849 
+-0.005930 -0.007913 0.027033 0.003611 -0.002441 0.001876 
+0.015662 0.016990 -0.028769 0.006340 0.065579 -0.092227 
+0.002913 0.024839 -0.010319 -0.014463 -0.011717 0.017393 
+-2.050420 -2.100840 2.302521 -2.451411 -2.579937 2.595611 
+-2.834437 -2.970199 2.741722 -3.129534 -3.217617 2.683938 
+-0.020760 -0.031219 0.022628 0.017454 0.025848 -0.004658 
+-0.022881 -0.092967 0.026741 -0.017828 -0.008695 0.011231 
+0.009557 0.021080 -0.000563 -0.002084 0.016968 0.014195 
+0.012620 0.013177 -0.005702 0.012639 0.008100 -0.015900 
+0.004027 -0.001086 -0.011987 0.006364 0.003977 -0.002088 
+0.007915 0.001292 -0.003521 0.003300 0.003133 0.000027 
+-0.000405 0.001100 -0.000209 -0.000272 0.001452 -0.000742 
+0.000639 0.002722 -0.001297 -0.000248 0.001157 -0.000164 
+0.000553 -0.000408 0.000165 0.001882 -0.000586 -0.002565 
+0.001880 -0.000555 -0.006618 0.007810 0.002368 0.000415 
+0.007388 0.005946 -0.007209 0.000954 0.006759 -0.001473 
+-0.006135 0.000021 0.006143 -0.004397 0.000038 0.001058 
+-0.000092 0.001641 0.000105 0.001657 0.004930 -0.001882 
+-0.000479 0.002152 -0.000132 -0.000503 -0.001156 -0.000768 
+-0.000825 -0.003768 -0.001906 0.005152 -0.000169 -0.004207 
+0.002052 0.000382 -0.000249 0.001761 -0.001604 0.001149 
+-0.008045 -0.000423 -0.004767 -0.001973 0.009912 -0.012359 
+-0.000064 0.001261 -0.000128 0.008016 -0.007097 0.018589 
+2.149573 -1.978632 3.508547 3.032922 -2.415638 5.271605 
+3.418919 -2.018018 6.148649 2.882353 -0.967914 5.518717 
+2.079137 0.043165 3.899281 0.012303 0.003728 0.020872 
+0.004114 -0.004521 0.003409 0.000234 -0.013261 0.001488 
+-0.007084 -0.006018 0.017916 -0.009360 -0.013143 0.025233 
+-0.002858 -0.014626 0.025244 -0.003194 -0.009163 0.022509 
+-0.005784 -0.005847 0.017651 -0.013812 -0.019243 0.021329 
+0.007850 0.020564 0.004090 0.009212 0.008817 0.015375 
+0.001873 -0.000447 0.004285 0.008933 0.006333 -0.017867 
+0.019217 0.016970 -0.008869 0.006332 0.013056 0.002374 
+-0.003622 -0.001443 0.010966 -0.001181 -0.021455 0.023545 
+-0.020627 -0.036551 0.052021 -0.017252 0.010211 0.010522 
+-0.005880 0.001452 0.001924 0.004426 0.015765 -0.008297 
+0.020714 0.017143 -0.036071 0.004411 -0.005986 -0.003941 
+0.008329 -0.013105 0.016539 0.002433 -0.014007 -0.003788 
+0.015417 -0.019309 -0.004620 0.012964 0.009989 -0.007296 
+-0.002182 0.012449 -0.003466 -0.005369 0.015139 -0.009919 
+-0.010710 0.009220 0.007782 -0.023507 -0.013219 0.028639 
+-3.051064 -2.795745 3.404255 -3.426282 -3.429487 3.330128 
+-3.657895 -3.809211 3.190789 -3.577982 -3.825688 2.871560 
+-0.025316 -0.019353 0.015297 0.017518 0.014950 -0.000614 
+0.089341 0.093376 -0.056486 0.068303 0.060156 0.028929 
+-0.077370 -0.008557 0.015382 0.009095 0.014256 0.002685 
+0.028180 0.038486 -0.039387 -0.000294 0.002326 -0.000907 
+-0.000844 0.002386 -0.004765 0.000698 -0.002067 -0.000527 
+0.008206 0.003825 -0.001365 0.006804 0.007485 -0.006983 
+0.003336 0.006267 -0.004316 0.002345 0.003874 -0.002307 
+0.004363 0.003046 -0.001291 0.003599 -0.000964 -0.007307 
+0.002052 0.002773 -0.009650 -0.001141 0.001966 -0.008746 
+-0.000557 0.004634 -0.001289 0.004216 0.007125 -0.002254 
+0.009086 0.001817 -0.008878 0.003228 0.012593 -0.002884 
+-0.006447 -0.004948 0.004298 -0.004985 -0.002765 0.000003 
+0.001383 -0.001088 -0.000853 0.004654 -0.001036 -0.000418 
+0.002575 -0.001339 0.000586 -0.003751 -0.000055 -0.002108 
+-0.003969 0.000211 0.000732 0.005030 0.005632 -0.008076 
+0.004439 0.002431 0.002868 0.006475 0.001547 0.004661 
+0.000908 0.002706 0.000037 -0.001525 0.003833 -0.015529 
+-0.001190 0.005157 -0.007292 0.008162 0.001130 0.004437 
+0.012336 -0.004306 0.027589 1.732394 -2.232394 4.654930 
+1.620000 -1.653333 5.193333 1.164384 -0.616438 4.294520 
+0.011823 0.002830 0.027101 0.003989 -0.000398 0.009387 
+-0.003367 -0.016735 -0.015102 -0.007078 -0.015584 -0.009156 
+-0.010597 -0.008348 0.012346 -0.012241 0.003030 0.006108 
+-0.004358 0.009439 0.000384 -0.002676 0.007601 0.000613 
+0.001636 -0.004078 0.000415 -0.006320 -0.014435 0.003328 
+-0.002781 -0.008889 0.012051 -0.006692 0.000830 0.018308 
+0.026009 0.015928 0.007663 0.018051 0.004873 0.006706 
+-0.004158 -0.002773 0.008494 -0.023433 0.002443 0.032427 
+-0.013799 0.009536 0.052382 0.017562 -0.003997 0.077821 
+0.010391 0.020155 -0.026882 0.005962 0.003798 -0.004208 
+-0.005594 -0.010000 0.001119 -0.001090 0.008893 -0.006116 
+0.000048 0.009903 -0.016860 0.002717 -0.001481 -0.000919 
+0.005846 -0.011427 0.004651 -0.002020 -0.002778 -0.000657 
+0.010473 -0.000509 -0.007491 0.016957 0.019130 0.009565 
+0.009715 0.068571 -0.025467 0.002464 0.034043 -0.006023 
+-0.011902 0.006486 0.021619 -2.307143 -1.571429 3.707143 
+-3.597015 -3.169154 3.592040 -4.116279 -3.961240 3.263566 
+-4.241877 -4.368231 3.032491 -3.783784 -3.972973 2.478765 
+-2.676190 -2.652381 1.438095 -0.010073 -0.011249 0.001618 
+0.038159 0.019115 -0.032039 0.142455 0.071179 -0.115791 
+-0.083757 -0.015463 0.023573 -0.002266 0.033886 -0.002925 
+0.004618 0.019482 -0.026349 -0.000482 0.001058 0.000279 
+-0.007011 -0.000978 0.003158 -0.001900 -0.000272 0.006513 
+0.003421 -0.000395 0.004605 0.002037 0.000672 -0.002711 
+0.002240 0.001875 -0.004907 0.003138 0.004638 -0.004993 
+0.004516 0.006015 -0.000578 0.004151 0.002960 0.001850 
+0.002991 -0.000122 -0.000306 0.000584 -0.000953 0.000163 
+-0.000365 0.001301 -0.000319 0.000786 0.005796 -0.002269 
+0.009416 0.004073 -0.001470 0.004206 0.004733 0.002728 
+-0.004372 -0.003114 -0.001643 -0.000656 -0.002219 -0.000221 
+0.000705 0.000598 -0.000216 0.004591 0.002184 0.000620 
+0.004193 0.002939 0.002530 0.001521 0.004480 0.001516 
+0.005504 0.005783 -0.004666 0.002318 0.003636 0.001271 
+0.001686 0.002145 0.000849 -0.000156 0.000152 -0.000138 
+-0.004391 0.002010 -0.003701 -0.002987 0.003324 -0.007986 
+-0.003244 -0.001683 -0.002780 0.000610 0.000194 0.001123 
+0.003517 0.000599 0.002739 0.000685 0.001940 0.005496 
+0.002138 0.000916 0.005645 0.006314 -0.000548 -0.001705 
+0.001165 -0.000924 -0.010776 -0.002732 0.003766 -0.020553 
+0.000037 0.000390 -0.030000 0.008788 0.012977 -0.016756 
+0.022117 0.018895 -0.006343 0.003440 0.016963 0.010475 
+-0.018124 0.011116 0.005213 -0.013500 0.000450 0.001350 
+0.009661 -0.004242 0.020446 0.024296 -0.008637 -0.000281 
+0.015100 -0.027320 -0.013485 -0.033333 -0.075000 0.041667 
+-0.055882 0.013971 0.040000 -0.085632 0.036394 0.058513 
+-0.065373 -0.015193 0.063329 -0.057268 -0.011111 0.040183 
+0.014000 -0.000500 -0.008750 0.049851 -0.000566 -0.032951 
+0.004023 0.019932 0.000512 -0.008375 -0.016544 -0.022304 
+-0.004120 -0.001660 -0.003494 0.005668 0.007866 -0.015500 
+0.009087 0.003269 -0.013907 -0.002567 -0.001017 -0.000132 
+-0.009003 -0.001784 0.002704 -0.015931 -0.002112 0.014397 
+-0.015060 0.003370 0.012457 0.000550 0.012105 -0.001342 
+0.017167 0.017250 -0.017322 0.001251 0.008904 0.002292 
+-0.009338 0.006505 0.022298 -0.024828 -0.007437 0.041001 
+-4.007936 -3.015873 4.007936 -4.418478 -4.163043 3.016304 
+-4.417004 -4.429150 2.526316 -4.244604 -4.086331 2.039568 
+-3.713726 -3.313725 1.317647 -2.755435 -2.315217 0.375000 
+-0.006313 -0.012690 -0.003182 0.020355 0.001944 -0.017296 
+0.192549 0.115693 -0.047106 0.035026 0.082251 -0.043721 
+0.021203 0.030007 -0.017742 0.011433 0.012871 -0.001565 
+0.001964 0.010488 0.001536 0.001157 0.007980 -0.006335 
+0.001099 0.000960 -0.004015 0.003127 0.004225 -0.005115 
+0.005409 0.003487 -0.005516 0.005576 0.003915 -0.007406 
+0.006041 0.002912 -0.005896 0.002342 0.003333 -0.000991 
+0.000454 0.001885 0.001048 -0.000374 0.001343 0.000793 
+0.001330 -0.000050 -0.000297 0.005532 0.001024 -0.003279 
+0.005994 0.002340 -0.008333 0.009424 0.006035 -0.004523 
+-0.001941 0.007354 -0.002009 0.000175 0.005117 0.001793 
+0.004573 0.003009 0.000609 0.003901 0.001464 0.000045 
+0.002413 -0.000528 0.000917 0.001457 -0.000805 0.001476 
+0.002176 0.001332 -0.001069 -0.000869 0.002444 -0.003386 
+0.000783 0.002796 -0.000280 -0.001010 -0.002646 -0.000056 
+-0.002533 -0.005490 0.000783 -0.001228 -0.004114 0.000630 
+0.003486 -0.005018 0.000282 0.003606 -0.004955 -0.003301 
+0.000015 -0.006214 -0.003523 0.004492 0.000469 -0.003004 
+0.010859 0.003774 -0.004994 -0.003924 -0.000249 -0.009451 
+-0.005559 0.002695 -0.011234 -0.004105 -0.000674 -0.008942 
+-0.017204 -0.016028 0.003853 -0.012950 -0.011273 0.011417 
+0.002058 -0.001241 0.000711 -0.006460 0.002500 -0.005653 
+-0.006461 -0.016092 0.004938 -0.011429 -0.038476 -0.009714 
+0.018956 -0.012637 -0.010714 -0.026852 -0.022590 -0.007057 
+-0.025033 -0.011699 0.003673 -0.036563 -0.047522 0.021931 
+-0.053479 -0.034108 0.006371 -0.108182 0.038509 -0.009295 
+-0.071818 -0.087130 0.056824 -0.030899 -0.020245 0.036405 
+-0.000731 -0.007367 0.007633 0.004545 -0.009103 0.003479 
+0.037596 -0.008018 0.030662 0.017143 0.032714 -0.132429 
+-0.060598 -0.075607 0.069094 -0.037696 -0.030829 0.029078 
+-0.030629 -0.017793 -0.021799 -0.019594 -0.013592 -0.019824 
+-0.005234 -0.008861 -0.000021 -0.007082 -0.003146 0.006985 
+0.003510 -0.003983 0.008222 0.002525 -0.002232 -0.007275 
+-0.021013 0.026831 -0.013233 0.000184 0.033636 0.001778 
+0.009852 0.024997 0.010316 0.001391 0.006752 0.028446 
+-0.028451 -0.009837 0.036946 -3.892562 -3.652893 3.016529 
+-4.340659 -4.010989 2.395604 -4.373391 -3.896996 1.931330 
+-4.052631 -3.570850 1.388664 -3.488479 -3.101382 0.875576 
+-0.027021 -0.025894 0.006387 -0.019643 -0.017802 0.004396 
+-0.018606 -0.014689 0.003842 0.010587 0.015578 0.063773 
+0.032186 0.034272 -0.003899 0.024846 0.021822 -0.014431 
+0.008209 0.010226 -0.003581 0.003038 0.003439 -0.000068 
+0.001179 0.002529 0.000363 0.006367 0.002461 -0.002757 
+0.003763 0.002654 -0.003320 0.000305 0.003061 -0.000505 
+-0.000328 0.002494 0.000788 -0.000295 0.000182 0.000734 
+0.000270 -0.003259 0.002950 0.002665 -0.004683 0.005722 
+0.004824 -0.001117 0.002497 0.004256 0.002649 -0.002048 
+0.003982 0.000289 -0.005540 0.003673 0.000510 -0.003673 
+-0.001564 -0.004567 -0.000302 -0.000174 -0.000438 -0.000008 
+0.005528 0.000709 -0.004637 0.003101 -0.000998 -0.002931 
+0.000278 -0.003820 -0.000376 -0.002427 -0.000485 0.000000 
+-0.000328 0.002760 -0.006754 0.002961 0.000760 -0.005703 
+0.002702 0.005456 -0.003478 0.000474 0.003351 0.000654 
+0.003111 0.001643 0.002538 0.009256 -0.000740 0.002050 
+0.007877 -0.001486 0.001159 0.002739 -0.000587 -0.000050 
+0.000985 -0.001273 -0.003044 0.005947 0.005387 -0.008106 
+0.008074 0.004353 -0.008058 0.004197 -0.000768 -0.005033 
+-0.003662 -0.005214 -0.006960 -0.017035 -0.008070 0.002487 
+-0.018408 -0.009387 0.000684 0.000079 -0.004113 0.001812 
+-0.000487 0.002302 0.001607 0.001460 -0.010564 -0.003484 
+0.003267 -0.001006 0.002464 -0.007581 -0.003464 0.004292 
+-0.028762 -0.012662 0.003953 -0.036996 -0.020965 0.006830 
+-0.027320 -0.015981 0.008041 -0.006674 0.000040 0.000903 
+-0.018107 -0.010354 0.001297 -0.037447 -0.027968 0.010136 
+-0.036977 -0.047774 0.037562 0.008182 0.020690 0.051724 
+0.017241 0.026332 0.000686 0.041091 0.048697 0.021303 
+0.052843 0.005743 0.001157 0.089065 0.009371 0.021443 
+0.034102 0.004396 0.007927 0.046038 0.045645 0.039517 
+0.009560 0.068544 0.208819 0.000550 -0.007775 0.039939 
+0.002678 0.005020 0.004190 0.009987 0.005917 -0.000558 
+0.005629 0.000884 0.004283 0.001799 0.007155 -0.011915 
+-0.015947 0.013067 0.000773 0.014047 0.036851 -0.003774 
+0.025500 0.013092 -0.006625 0.018759 0.002353 -0.000306 
+-0.002523 -0.002559 0.014197 -0.028392 -0.021701 0.022430 
+-0.039140 -0.028912 0.020678 -3.706250 -3.568750 1.531250 
+-3.649746 -3.522843 1.000000 -3.473430 -3.130435 0.468599 
+-3.053191 -2.515957 -0.111702 -0.020472 -0.022199 0.001147 
+-0.013590 -0.015558 -0.001592 -0.025313 0.000586 0.030246 
+-0.010249 -0.018483 0.031933 0.028878 0.026249 -0.024964 
+0.018678 0.016190 -0.011478 0.014491 0.006689 -0.005217 
+0.009413 0.002552 -0.002301 0.004480 0.002083 -0.002902 
+0.000384 -0.000849 -0.001155 -0.001837 -0.002843 0.000951 
+-0.001669 -0.002290 0.000359 0.000379 0.000274 -0.000372 
+0.001079 0.001573 0.001009 0.005834 0.002586 0.002163 
+0.007762 0.003762 0.001342 0.004903 0.004204 -0.001489 
+-0.002189 0.002852 -0.002802 -0.005638 0.002731 -0.002314 
+0.000322 -0.005135 -0.000630 -0.003438 -0.005070 0.000153 
+-0.006160 -0.000921 -0.000902 -0.006044 0.003054 -0.000852 
+-0.002836 0.003151 0.001459 0.001228 0.003969 0.000595 
+-0.000582 0.007142 -0.005113 -0.001754 0.002485 -0.005591 
+-0.000759 0.001970 -0.002136 0.001304 -0.002923 0.000696 
+0.006715 -0.007320 0.001949 0.008659 -0.005177 0.002554 
+-0.000230 0.000182 -0.002872 0.002030 0.004740 -0.012805 
+-0.002453 0.002760 -0.005310 -0.000650 -0.003238 0.001959 
+0.002852 -0.007204 0.001403 0.002802 -0.004812 -0.001739 
+0.001757 -0.002089 -0.001219 0.001235 -0.004577 -0.002591 
+0.003178 -0.005041 -0.006575 0.005199 -0.004440 -0.011600 
+0.028304 0.018363 -0.029825 0.029479 0.011029 -0.035283 
+0.015291 -0.001575 -0.009162 -0.000925 -0.004896 0.001592 
+-0.005654 -0.013763 0.000654 -0.008685 -0.023962 0.000600 
+-0.009410 -0.001647 -0.000128 -0.020991 -0.009842 0.008059 
+-0.039480 -0.018392 0.016864 -0.034656 -0.027613 0.019289 
+-0.007938 -0.018069 0.006554 -0.007957 -0.010108 -0.011828 
+0.018421 -0.025895 -0.012947 0.005121 -0.024210 -0.025700 
+-0.003733 0.012514 -0.016165 -0.002963 0.018191 -0.019217 
+0.035496 0.036688 0.003643 0.071901 0.146983 0.088983 
+0.090974 0.027294 -0.075380 0.019145 -0.012812 -0.030544 
+0.011925 -0.004912 -0.014986 -0.001821 0.004814 0.004024 
+-0.019793 0.006250 0.011696 -0.015852 -0.013540 0.005551 
+0.000379 -0.017309 0.006669 0.004413 -0.004165 0.001990 
+0.030218 0.019262 -0.015341 0.022790 0.028077 -0.009872 
+0.013337 0.022408 -0.010044 0.009419 0.007484 -0.003142 
+-0.018858 -0.010939 0.010555 -0.037321 -0.025439 0.018427 
+-3.414062 -3.726562 1.117188 -3.286585 -3.097561 0.152439 
+-2.883978 -2.469613 -0.563536 -0.022603 -0.022788 0.000082 
+-0.019467 -0.022002 -0.003305 -0.020494 -0.020980 -0.006520 
+-0.028669 -0.016980 -0.007054 -0.020452 -0.000366 0.003126 
+-0.000040 -0.001326 0.001485 0.002692 0.006968 -0.003190 
+0.009984 0.014491 0.001010 0.013750 0.017242 -0.000315 
+0.012940 0.015145 -0.003258 0.010387 0.007860 -0.003480 
+0.006277 0.002278 -0.000969 0.002542 0.000709 0.001722 
+0.001457 0.000575 0.001078 0.002048 0.000476 0.001183 
+0.000778 0.006959 -0.001924 0.004023 0.001469 0.002108 
+-0.001039 0.000647 -0.000162 -0.000854 0.000216 -0.000454 
+-0.001771 -0.003542 -0.001771 0.001899 -0.002764 -0.001010 
+0.002183 0.000405 -0.003237 -0.000158 0.002370 -0.000711 
+-0.003537 0.003658 -0.000231 -0.002713 0.005963 0.002524 
+-0.002435 0.008470 -0.003376 0.000794 0.005736 -0.004371 
+0.001030 0.002902 0.001739 0.005676 -0.002311 0.006179 
+0.012284 -0.010525 0.009119 -0.002866 -0.021967 0.012177 
+-0.012361 -0.015214 -0.008786 -0.015372 -0.012012 -0.003903 
+-0.008315 -0.009771 -0.007350 -0.002027 -0.005148 -0.009053 
+-0.000019 -0.001607 -0.008511 0.008702 0.002749 -0.010427 
+-0.001323 0.000464 -0.005012 0.001403 -0.002399 -0.002235 
+-0.004695 0.002021 -0.002495 -0.010425 0.003244 -0.000803 
+-0.004147 0.000360 -0.009532 -0.005299 0.001727 -0.006610 
+-0.002000 0.001629 0.000543 -0.009387 0.003001 0.001195 
+-0.012312 0.008355 -0.004836 -0.009772 -0.012728 -0.007883 
+0.004462 -0.003749 -0.008441 0.000000 -0.021500 0.016500 
+-0.009359 -0.007618 0.006256 0.004391 0.000104 -0.005962 
+-0.000820 -0.006133 -0.010340 -0.037150 -0.003644 -0.009787 
+-0.027167 0.019296 -0.028168 -0.000777 0.017666 -0.015905 
+0.003985 0.009355 -0.004839 -0.007639 0.007791 -0.004727 
+-0.009237 0.006296 -0.016776 -0.000423 0.032751 -0.026561 
+0.006735 -0.026791 0.022735 -0.016275 -0.032549 0.032549 
+-0.021738 -0.032774 0.019869 -0.013114 -0.003615 0.013053 
+-0.004678 0.006049 0.002838 -0.003832 0.005076 0.000489 
+-0.004151 -0.010380 0.013644 -0.019742 0.005507 0.025933 
+-0.009506 0.008628 0.011087 -0.010213 0.007490 -0.005398 
+-0.005338 0.011315 -0.009274 0.000654 -0.003509 -0.002950 
+0.007187 -0.001639 0.001311 -0.008974 -0.005204 -0.002522 
+-0.026593 -0.018022 0.006889 -0.028497 -0.027073 0.003151 
+-2.980263 -2.657895 -0.046053 -2.788043 -2.597826 -0.282609 
+-2.659575 -2.553191 -0.484043 -2.700599 -2.634731 -0.598802 
+-0.030242 -0.024347 -0.008903 -0.030692 -0.015978 -0.007431 
+-0.021118 -0.004837 -0.000623 -0.005119 0.000287 0.003792 
+0.010150 0.002451 0.004077 0.016849 -0.003144 0.005843 
+0.014628 0.013686 -0.001413 0.014396 0.004374 -0.000013 
+0.006806 -0.000689 -0.002666 0.000727 -0.002335 -0.002447 
+-0.002138 -0.000640 0.000002 -0.000083 0.000121 0.001665 
+-0.000623 0.005103 0.000142 0.000655 0.004555 0.000931 
+0.001189 0.003505 0.000866 0.000999 0.003180 0.000657 
+-0.001352 -0.000091 -0.005410 -0.000821 -0.001132 -0.005821 
+-0.000381 0.002067 -0.002373 -0.000779 0.002325 -0.001821 
+-0.001127 0.003002 -0.003565 -0.001298 0.002665 -0.005124 
+0.001164 0.002654 -0.003798 -0.000302 0.000221 0.000100 
+0.001359 -0.000018 0.001284 0.005390 -0.003652 0.002561 
+0.013909 0.003202 0.004684 0.023405 0.004123 -0.013673 
+0.021227 -0.002084 -0.014683 -0.000425 -0.004524 -0.028925 
+-0.002966 0.005193 -0.022141 -0.002046 0.000405 -0.010015 
+-0.000092 0.001494 -0.000069 0.000968 -0.001524 0.000269 
+0.001514 -0.001784 0.002873 -0.002866 -0.001423 0.005239 
+-0.005777 -0.003090 -0.005755 -0.007282 0.002249 -0.007353 
+0.005131 0.000649 -0.017867 0.000378 0.009225 -0.016545 
+-0.000444 0.010556 -0.011444 0.010208 0.026785 -0.002803 
+0.051709 0.025739 -0.029841 0.039674 0.002863 -0.022155 
+0.011846 -0.008923 -0.013610 0.007676 -0.003747 0.013159 
+0.009066 -0.021429 0.034615 0.004965 0.009236 -0.013117 
+-0.010313 0.022336 -0.038950 0.000125 0.021846 -0.015140 
+0.000854 0.002439 0.003049 -0.002923 -0.007795 0.006624 
+0.002593 0.000000 0.001111 -0.007391 -0.003751 -0.004762 
+-0.020340 0.009259 -0.008269 -0.011920 0.001171 -0.014275 
+-0.008282 -0.046992 0.024232 -0.020184 0.018709 0.030606 
+0.002967 0.002782 0.039200 0.002922 0.001088 0.004529 
+-0.006289 0.023597 -0.007277 -0.002059 0.023449 -0.012461 
+-0.001283 0.009523 -0.005598 0.000453 0.005698 -0.004897 
+0.002456 0.004386 -0.011404 0.008614 -0.001332 -0.007977 
+0.009757 -0.001964 0.000467 0.010727 0.015753 0.009925 
+0.021347 0.020412 -0.010464 0.012302 0.004241 -0.011875 
+0.003038 0.002462 0.002001 -0.008985 -0.009473 0.001337 
+-0.017972 -0.020894 -0.002704 -0.027655 -0.024604 -0.003300 
+-3.171271 -2.911602 -0.657459 -3.442786 -2.935323 -0.736318 
+-3.358209 -2.870647 -0.915423 -3.021622 -2.648649 -1.108108 
+-0.025591 -0.020754 -0.011668 -0.018383 -0.014699 -0.008460 
+-0.008509 -0.008678 -0.006020 0.001970 0.000228 -0.005878 
+0.008363 0.013212 -0.006679 0.017349 0.007905 0.003342 
+0.013954 0.006696 0.000450 0.010118 0.003072 -0.000839 
+0.010411 0.001754 -0.004398 0.006884 0.002952 -0.007002 
+0.001378 0.001929 -0.004118 0.001078 0.000294 -0.000196 
+0.002511 0.002565 0.004221 0.005377 0.006322 0.005062 
+0.002188 0.001214 -0.002761 0.001351 0.001012 -0.000080 
+-0.001595 0.003298 0.000522 -0.002438 0.005718 -0.001921 
+-0.001424 0.005183 -0.005420 -0.002393 0.002558 -0.004364 
+0.000675 -0.001734 -0.004026 0.001348 -0.000318 0.001094 
+-0.002291 0.006459 0.006974 -0.014505 0.006486 0.007933 
+-0.004038 0.002092 0.007210 -0.004456 0.004444 0.003962 
+-0.004795 0.010646 -0.001194 0.000603 0.014771 -0.010852 
+0.001319 0.002308 0.003599 0.000783 0.002808 -0.001814 
+0.003454 -0.000142 -0.002250 0.004723 -0.003724 0.002874 
+0.002558 -0.010513 0.021550 -0.021037 -0.026726 0.044400 
+-0.019807 -0.026604 0.013729 -0.007829 -0.001029 -0.005806 
+-0.003314 0.007078 -0.012128 -0.004192 0.006321 -0.004042 
+0.001376 -0.000578 -0.003496 0.009277 0.008223 -0.010547 
+0.005932 0.019007 -0.020888 0.005467 -0.010933 -0.045333 
+0.046813 -0.009560 -0.125604 -0.056250 0.101250 -0.123750 
+-0.023708 0.004257 0.002862 0.000810 -0.007156 0.009406 
+0.019151 0.001233 -0.022387 0.000221 -0.004214 -0.013533 
+-0.021583 -0.006417 0.002917 0.023831 -0.025261 0.013041 
+0.047147 -0.116641 -0.007357 0.053917 0.027199 -0.009916 
+0.020218 0.024296 -0.020899 -0.008333 0.010054 -0.000860 
+-0.000074 -0.004988 -0.003018 0.051097 0.032569 -0.070844 
+0.117097 0.136564 -0.049395 0.028293 0.041951 0.005701 
+0.002589 0.009120 0.005835 -0.007446 0.003525 0.003614 
+-0.004738 -0.009773 -0.003722 -0.007909 -0.001166 -0.006085 
+0.002442 0.001583 -0.000439 0.001770 0.007065 0.003670 
+-0.000660 0.005492 0.003721 -0.002390 0.009296 -0.001488 
+0.002720 0.003997 -0.011941 0.030316 0.012545 -0.018220 
+0.025669 0.019337 -0.002432 0.006970 0.008602 0.000134 
+-0.004380 -0.006034 -0.003313 -0.020418 -0.014255 -0.003080 
+-0.033708 -0.022550 -0.002977 -3.856322 -3.040230 -0.844828 
+-4.162791 -3.172093 -1.004651 -4.256302 -3.239496 -1.184874 
+-4.157895 -3.105263 -1.464912 -3.732984 -2.581152 -1.811518 
+-0.024508 -0.024939 -0.014222 -0.018464 -0.014962 -0.012390 
+-0.017374 -0.010573 -0.002406 -0.013010 -0.010212 0.003568 
+-0.001571 -0.001537 -0.000041 0.011713 0.009931 -0.000490 
+0.013698 0.012332 -0.007670 0.005273 0.009437 -0.000740 
+0.002337 0.007314 0.001218 0.003483 0.007749 -0.004341 
+0.003075 -0.001575 -0.000882 0.003337 0.001221 0.001551 
+0.001609 -0.001979 -0.004180 0.000341 -0.004184 -0.004640 
+0.001830 -0.002035 -0.002088 0.002589 0.001571 0.000319 
+0.000689 0.002094 0.001333 -0.001069 -0.000411 -0.001187 
+-0.001437 -0.004275 -0.008504 -0.000226 -0.007747 -0.016725 
+-0.004480 0.002486 0.000797 0.004339 0.004002 0.019715 
+-0.002204 -0.005349 0.005764 -0.000734 -0.002548 0.008201 
+0.004738 0.000112 -0.004331 0.002433 0.011542 -0.015992 
+-0.000032 0.008822 -0.005501 0.010063 0.009864 -0.008555 
+0.019459 0.011144 -0.017401 0.032730 0.006772 -0.023475 
+0.032208 -0.012219 0.003181 -0.023519 -0.047439 0.031643 
+-0.024060 -0.055338 0.030827 -0.009213 -0.008915 0.003871 
+-0.005437 -0.001680 -0.001016 -0.005739 -0.003286 0.001835 
+-0.003454 -0.001185 0.002893 0.003427 -0.005038 0.000247 
+-0.001119 -0.006820 0.001372 0.004431 0.010756 -0.014460 
+0.014711 0.013008 -0.047039 0.027972 0.045102 -0.047846 
+-0.010268 -0.016944 0.012237 -0.012305 -0.028308 0.029228 
+-0.033551 -0.031102 0.050244 -0.044523 -0.031053 0.067075 
+-0.071121 -0.019793 0.042425 0.040557 0.001869 -0.000557 
+0.017706 0.009986 -0.023988 0.012772 0.026448 -0.040997 
+-0.010760 0.049339 -0.039137 0.024799 0.024680 -0.016692 
+0.030851 0.014262 -0.006456 -0.005293 -0.050255 -0.060128 
+-0.088464 -0.017002 -0.008234 0.015524 -0.039097 0.022137 
+0.005586 -0.004475 0.013714 0.010819 0.003147 0.003511 
+0.003786 -0.006546 -0.004846 0.002359 -0.003331 -0.000302 
+0.000239 0.005490 -0.018859 0.004165 0.005189 -0.012248 
+-0.000289 0.002719 0.006430 -0.007262 0.006710 0.015775 
+-0.007657 0.010622 0.022985 0.006011 -0.001039 -0.004436 
+0.043694 0.022072 0.003394 0.020961 0.012053 0.007118 
+0.010314 0.006197 0.002943 -0.007178 -0.003693 0.001014 
+-0.027242 -0.016570 0.002004 -4.133333 -3.550000 -0.291667 
+-4.879518 -4.006024 -0.704819 -4.796460 -3.769912 -1.079646 
+-4.429630 -3.437037 -1.344444 -4.113971 -3.187500 -1.507353 
+-3.854701 -2.940171 -1.547009 -3.508380 -2.581006 -1.368715 
+-0.029598 -0.020044 -0.008830 -0.021790 -0.010470 -0.002061 
+-0.008506 -0.002419 0.000131 0.005271 0.001865 -0.003867 
+0.012161 0.007456 -0.007375 0.012158 0.007229 -0.003741 
+0.007121 0.005398 -0.001184 0.008511 0.005827 -0.001539 
+0.013505 0.006225 -0.002993 0.010007 0.009576 -0.008748 
+0.013820 -0.004654 -0.030621 0.006994 -0.006197 -0.016852 
+0.006018 -0.003911 -0.008218 0.004599 -0.001123 -0.002335 
+0.004709 0.000297 0.001719 0.004131 -0.001220 0.000878 
+-0.000666 -0.005257 -0.009310 -0.005341 -0.008188 -0.024080 
+0.017044 -0.007044 0.010036 0.025619 -0.020476 0.021505 
+0.028450 -0.021197 0.040534 0.058476 0.002454 0.010615 
+-0.001112 -0.000925 -0.004457 0.000156 -0.007434 0.007804 
+0.006444 -0.002176 -0.000858 0.013362 -0.002066 -0.010731 
+0.011710 -0.014154 -0.000453 0.003007 -0.042479 0.053147 
+0.112294 0.028208 0.056308 0.020000 -0.068000 -0.092000 
+0.065140 -0.027480 -0.017100 0.014294 0.063629 -0.112629 
+0.012095 0.028769 -0.069216 -0.008258 0.007256 -0.021391 
+-0.010073 0.013376 0.009909 -0.015584 -0.006811 0.026455 
+-0.013763 -0.011045 0.017606 -0.002956 -0.003138 0.004777 
+-0.002413 0.009463 -0.014910 0.054955 0.064209 -0.043869 
+-0.010702 -0.007842 0.012388 -0.016692 -0.017685 0.026150 
+-1.475138 -1.933702 3.077348 -1.445026 -2.020942 2.848168 
+-0.007985 -0.015443 0.019413 0.007015 0.007547 -0.004712 
+0.019745 0.036019 -0.028602 0.001764 0.019852 -0.015686 
+-0.009660 0.009414 -0.012025 0.032718 0.027459 -0.025580 
+0.031881 0.015856 -0.026025 0.010609 0.013305 -0.031061 
+-0.006390 -0.013785 0.026791 -0.012468 -0.017487 0.021097 
+0.018340 0.015897 0.002764 0.010489 0.000435 -0.002145 
+-0.013341 0.003586 0.000723 0.007497 0.011218 0.010434 
+-0.002149 0.002773 0.010528 0.001024 -0.005743 -0.001087 
+0.002862 -0.010686 -0.006400 0.003868 -0.004291 0.014714 
+-0.028424 -0.038403 0.039660 -0.007621 0.012177 0.009516 
+-0.051796 -0.018726 0.032605 0.002296 -0.042043 0.029223 
+0.067923 0.028487 0.025368 0.011154 0.009748 0.001582 
+-0.008235 -0.007563 -0.003483 -0.025580 -0.017701 -0.008626 
+-4.025641 -3.042735 -1.247863 -4.821656 -3.700637 -1.324841 
+-4.791667 -3.574074 -1.333333 -4.543071 -3.344569 -1.322097 
+-4.334495 -3.254355 -1.236934 -4.140222 -3.273063 -1.107011 
+-3.852018 -3.183856 -0.986547 -3.195266 -2.609468 -0.863905 
+-0.022449 -0.010667 -0.005024 -0.009430 -0.004236 -0.002600 
+-0.002542 -0.000761 -0.001340 0.001239 -0.000352 0.000637 
+0.004065 0.000708 0.000386 0.002050 0.004617 0.004766 
+0.003653 0.005648 0.005917 0.005880 0.004907 0.001866 
+-0.020228 -0.031176 -0.037605 0.000342 -0.001880 -0.005165 
+-0.002659 -0.001883 -0.008575 -0.002654 -0.000523 -0.010620 
+0.028215 -0.002907 -0.029238 0.032488 0.003057 -0.042816 
+0.022459 0.002482 -0.017572 -0.000831 0.006377 0.012194 
+-0.039357 -0.015131 0.055839 -0.057543 -0.018887 0.109592 
+0.057438 -0.006889 0.112641 0.011231 0.061692 0.067077 
+-0.003404 -0.009438 0.025067 -0.003608 0.003484 0.004595 
+0.000891 0.004485 0.001932 -0.005200 0.002361 -0.006593 
+-0.026477 -0.002866 -0.025390 -0.042808 0.029608 -0.020535 
+0.015764 -0.007363 0.005305 0.014000 0.028177 -0.029351 
+0.025442 0.028362 -0.037551 0.013291 0.000356 -0.010414 
+0.005183 -0.000609 -0.001129 -0.000934 -0.004941 0.005776 
+0.002621 -0.011633 0.012630 0.006103 -0.017401 0.010951 
+-0.005081 -0.005859 0.007638 0.002316 0.002780 0.004058 
+0.006018 0.010174 -0.007566 0.016177 0.002212 -0.020662 
+-0.003605 0.010471 0.001176 -1.661654 -2.338346 3.969925 
+-1.964143 -2.741036 3.876494 -1.946844 -2.681063 3.504983 
+-1.728395 -2.296296 2.864197 -0.008123 -0.014050 0.014353 
+0.003992 0.004451 -0.006846 -0.003720 0.001684 -0.002539 
+-0.005574 -0.004332 0.008493 -0.001552 -0.004160 0.003570 
+0.004559 0.010053 -0.007443 0.007103 0.008390 -0.009547 
+0.004549 0.003040 -0.002460 -0.001296 -0.004242 0.002213 
+0.010637 0.028689 -0.009486 0.042464 0.087648 -0.006834 
+-0.002037 -0.025292 -0.060981 0.002653 0.018660 -0.017506 
+0.001248 0.000787 -0.001908 -0.009034 0.001698 -0.001888 
+-0.007374 -0.012027 -0.010543 -0.005517 -0.005292 -0.001250 
+-0.015758 -0.001174 0.005644 -0.004968 0.005417 -0.000994 
+0.022697 0.010267 0.017679 0.017983 0.015326 0.035456 
+0.043465 0.075258 -0.008854 0.025026 0.045543 -0.016173 
+0.006466 0.006722 0.000820 -0.009083 -0.004860 -0.006424 
+-0.028246 -0.009353 -0.007698 -4.644860 -3.000000 -1.112149 
+-5.768116 -4.065217 -0.927536 -5.502591 -4.134715 -0.917098 
+-4.872000 -3.840000 -0.952000 -4.286713 -3.489511 -0.905594 
+-3.912892 -3.264808 -0.745645 -3.775100 -3.200803 -0.550201 
+-3.718919 -3.070270 -0.378378 -0.029262 -0.027627 -0.002029 
+-0.021181 -0.018384 -0.003434 -0.015163 -0.012176 -0.003325 
+-0.006204 -0.005852 -0.000805 0.008638 0.000801 -0.001643 
+0.009708 0.005170 -0.002273 0.004906 0.005594 0.005660 
+-0.009177 -0.011135 -0.021094 0.000869 0.020137 -0.006061 
+-0.015175 -0.005977 0.007356 -0.011791 -0.015887 0.036191 
+-0.001961 -0.018983 -0.012446 -0.057587 0.013794 -0.103175 
+-0.003297 -0.012024 0.023593 -0.016190 0.009546 0.017183 
+0.009409 -0.020257 0.016770 -0.036922 -0.035000 0.058020 
+0.107872 0.016115 0.019527 0.015233 -0.008155 -0.017902 
+0.021598 0.025427 -0.027321 0.021066 0.025213 -0.010879 
+-0.000801 0.020534 -0.010868 0.008380 0.009265 -0.004942 
+0.009475 0.003842 -0.005420 0.008560 0.015280 -0.016092 
+0.006542 0.020944 -0.025405 0.008253 0.026418 -0.032473 
+0.009835 0.014740 -0.028749 -0.003175 0.006391 -0.008741 
+-0.003469 0.006215 -0.001960 -0.004554 0.003217 0.002131 
+-0.002851 -0.004302 0.003435 -0.000583 0.000482 0.004544 
+-0.002122 0.007154 -0.002223 0.001807 0.011393 -0.012247 
+-0.000933 0.013620 -0.014223 -0.000997 0.007803 -0.011934 
+-0.005357 0.005507 0.003956 -2.274194 -2.451613 4.483871 
+-2.416268 -3.315789 4.698565 -2.265683 -3.328413 4.036901 
+-2.086792 -3.075472 3.203773 -1.550725 -2.396135 2.000000 
+-0.007924 -0.012147 0.006004 -0.000797 -0.003789 0.000062 
+-0.002468 -0.000599 0.004377 -0.002734 -0.001436 0.001552 
+0.000852 0.000356 -0.003200 0.002777 0.001508 -0.003897 
+-0.000562 -0.000157 -0.004259 0.003080 0.005744 -0.008422 
+0.013314 0.007924 -0.018057 0.020090 0.019489 -0.019824 
+0.030106 0.029930 -0.013556 0.009839 0.040926 -0.020901 
+-0.015986 0.034422 0.016599 0.000179 0.001844 -0.003278 
+-0.007534 -0.003801 0.001197 -0.004025 -0.017959 -0.004541 
+0.014485 -0.008515 -0.023879 0.022093 0.020432 -0.026021 
+0.059970 0.008223 -0.045060 0.037692 0.064304 0.040190 
+-0.050000 0.018333 -0.016667 0.013820 0.031495 -0.024098 
+0.043441 0.039969 0.009595 0.016113 0.012426 0.002204 
+-0.007069 -0.005946 -0.001485 -0.024122 -0.023277 -0.007721 
+-4.596491 -2.815789 -0.973684 -5.453238 -3.237410 -0.906475 
+-5.348315 -3.432584 -0.516854 -4.964758 -3.599119 -0.185022 
+-4.589744 -3.663004 -0.043956 -4.230240 -3.556701 -0.010309 
+-3.923954 -3.399240 0.015209 -3.730000 -3.260000 -0.005000 
+-3.407408 -2.866667 -0.177778 -0.023983 -0.020914 -0.004048 
+-0.013410 -0.014394 -0.003092 -0.000131 -0.009385 -0.000525 
+0.010368 0.003554 0.000830 0.010551 0.005317 0.004049 
+-0.002672 0.004104 0.002798 0.044396 0.033604 -0.002815 
+0.027039 0.028706 -0.003484 -0.019846 -0.014057 0.007534 
+-0.016004 -0.009015 0.013390 0.010217 0.003942 -0.005203 
+0.054545 0.000000 -0.023636 0.051652 0.005142 0.000057 
+0.015180 -0.015968 0.004731 -0.038343 -0.040131 0.002748 
+0.022595 -0.020603 0.128293 -0.006372 -0.006017 0.015515 
+0.008783 0.016717 -0.019859 -0.004354 0.006083 -0.018443 
+0.008542 0.002530 -0.008225 0.002194 -0.000672 0.000092 
+0.001618 0.004034 -0.003219 0.004096 0.012595 -0.015292 
+0.001770 0.018062 -0.031053 -0.007486 0.031230 -0.032616 
+-0.008013 0.025668 -0.017538 -0.004500 0.007580 -0.008159 
+-0.003745 -0.003553 -0.004506 -0.001878 -0.005216 0.004037 
+0.002296 -0.003687 0.004099 0.002128 -0.002713 0.003921 
+0.001567 0.000365 0.000200 -0.004536 0.005826 -0.007324 
+0.001249 0.013802 -0.015851 0.011301 0.011074 -0.018369 
+0.002271 0.000917 -0.005220 -0.014439 -0.015256 0.027162 
+-2.032258 -3.025806 4.464516 -2.360577 -3.461539 4.466346 
+-2.152174 -3.434783 3.713043 -1.441176 -2.813725 2.455882 
+-0.002531 -0.015039 0.009442 0.004566 -0.002066 -0.004655 
+0.003072 0.000098 -0.001385 -0.000636 -0.004377 0.005040 
+-0.000874 -0.002713 0.004885 0.004017 -0.003345 -0.004723 
+-0.002545 0.002539 -0.016118 0.004479 0.016388 -0.018103 
+0.004286 0.014374 -0.011364 0.005681 0.012914 -0.007715 
+0.008750 0.010626 -0.007080 0.010935 0.002814 0.001371 
+0.009600 0.002772 0.004270 0.007141 0.014783 -0.003332 
+-0.005455 0.005634 -0.003303 -0.002828 -0.025763 0.008579 
+-0.008631 -0.050283 0.023130 0.028788 0.005394 -0.018667 
+0.051330 0.039158 0.003855 0.034444 0.060000 0.004444 
+0.036655 0.034032 -0.017377 0.007428 0.005376 -0.077606 
+0.027593 0.052963 -0.025370 0.033593 0.029610 -0.012625 
+0.014056 0.018531 -0.015339 -0.001808 0.002360 -0.012036 
+-0.025724 -0.011902 -0.009396 -0.048700 -0.027044 -0.005029 
+-6.072000 -3.856000 -0.312000 -6.116564 -3.846626 0.202454 
+-5.262673 -3.580645 0.470046 -4.394052 -3.412639 0.572491 
+-3.868687 -3.414141 0.646465 -3.628975 -3.438163 0.689046 
+-3.466960 -3.387665 0.722467 -3.250000 -3.276316 0.861842 
+-0.023914 -0.032791 0.014262 0.007868 -0.017245 0.001905 
+-0.000565 -0.011305 -0.006834 0.000829 0.001143 0.001172 
+-0.022381 0.003437 -0.007226 -0.001680 0.011759 -0.000672 
+0.023467 0.017074 -0.031459 0.023185 0.028620 -0.052288 
+0.004206 0.039087 -0.018492 -0.027556 0.001778 -0.025778 
+0.022785 0.013520 0.001749 -0.047774 0.059122 0.065392 
+-0.043944 -0.018944 0.011434 0.013699 -0.024110 0.018082 
+-0.012550 -0.007287 0.031409 -0.012023 0.003810 0.006271 
+-0.004398 0.003746 -0.003347 0.000478 -0.000586 0.000153 
+0.000130 -0.000485 0.000231 -0.001118 -0.000705 0.001187 
+0.001089 -0.000678 0.000014 -0.001411 0.003415 -0.008513 
+-0.004341 0.010541 -0.013914 -0.003176 0.018887 -0.014397 
+0.005922 0.019801 -0.016598 0.001234 0.005979 -0.013763 
+0.005374 0.002350 -0.008329 0.001655 -0.002645 -0.005328 
+0.005508 -0.006226 0.003048 0.006966 -0.011302 0.002682 
+0.001223 -0.005100 0.005218 0.000156 0.004658 -0.007268 
+0.005448 0.014829 -0.019255 0.007745 0.018946 -0.017944 
+0.006115 0.009170 -0.007642 -0.009504 -0.009177 0.015496 
+-0.019500 -0.031902 0.040601 -2.356589 -3.775194 4.534883 
+-2.048611 -3.583333 3.881944 -0.013168 -0.024973 0.030528 
+-0.005343 -0.014162 0.014463 0.001242 0.000014 -0.001136 
+0.000842 0.004938 -0.000929 -0.002049 -0.005890 0.001459 
+0.000224 -0.003364 0.004010 0.001505 0.003342 -0.002418 
+0.000732 0.004617 -0.001523 0.000953 0.000735 0.001249 
+0.003378 0.004399 -0.004477 0.008204 0.014099 -0.010651 
+0.010014 0.020700 -0.015358 0.009625 0.018916 -0.012834 
+0.010143 0.011590 -0.002187 0.004179 -0.007594 0.012281 
+0.003184 -0.001461 -0.003242 0.006067 0.004370 -0.005261 
+0.044126 0.002981 -0.016440 0.045714 -0.003238 -0.009810 
+0.008697 -0.044112 -0.025473 -0.019802 -0.033633 -0.042659 
+-0.057778 -0.006667 0.002222 0.005092 0.006550 -0.010166 
+0.045443 0.005123 -0.032114 0.001818 -0.010455 -0.061818 
+-0.019972 -0.012954 -0.014172 0.013582 0.009295 0.005319 
+-0.011210 -0.007256 -0.004810 -0.024574 -0.017022 -0.004075 
+-0.040860 -0.020527 -0.001831 -5.315790 -3.236842 -0.061404 
+-5.650685 -3.479452 0.712329 -5.010050 -3.351759 1.311558 
+-4.318898 -3.216535 1.559055 -3.826389 -3.177083 1.482639 
+-3.510791 -3.266187 1.327338 -3.462264 -3.518868 1.405660 
+-3.949152 -4.322034 1.923729 -0.017093 -0.057392 0.055499 
+0.016208 -0.020822 0.076078 -0.007217 -0.002989 -0.008935 
+0.047609 0.096902 -0.056576 0.034227 0.043478 -0.019430 
+0.033648 0.006465 -0.009036 0.000868 0.033082 -0.014795 
+0.031429 0.056429 -0.031429 0.019978 0.062684 0.004307 
+0.014630 0.037130 -0.007870 0.036161 -0.000179 -0.072232 
+0.025842 0.078947 -0.052158 -0.059142 0.057447 0.071817 
+0.000818 -0.036239 0.016089 -0.007874 -0.005843 0.017766 
+-0.007263 -0.001852 0.016753 -0.000653 0.000312 0.000718 
+0.002144 0.002300 -0.008650 0.007285 0.007848 -0.001402 
+0.005831 0.004054 -0.008990 0.002913 0.004609 -0.009366 
+-0.002409 0.001174 -0.002530 0.008007 0.005249 -0.006428 
+0.010630 0.004706 -0.003918 0.006261 0.007898 -0.001853 
+-0.000039 0.003226 0.000020 -0.000724 0.000085 0.007319 
+0.001138 -0.003628 0.004437 0.003620 -0.000970 -0.000975 
+0.000347 0.004266 -0.004777 -0.002258 0.006947 -0.006387 
+0.000848 0.006753 -0.008138 0.005296 0.007153 -0.005728 
+0.001743 0.005169 -0.000845 0.001222 -0.001247 0.002167 
+-0.000687 -0.002599 0.014540 -0.011053 -0.017144 0.024111 
+-0.012141 -0.024167 0.025329 -0.004808 -0.024213 0.018913 
+0.004943 -0.014901 0.001252 0.007004 0.001131 -0.009314 
+-0.005961 0.000856 -0.005065 -0.012955 -0.002442 0.002538 
+-0.003139 0.000271 -0.002400 0.002279 0.009854 -0.010065 
+0.008158 0.014951 -0.011916 0.011439 0.011228 0.000241 
+0.005490 0.011693 0.007760 0.000244 0.006494 -0.007013 
+0.009872 0.011866 -0.012142 0.004252 0.014484 -0.006160 
+-0.001760 0.008588 -0.007009 -0.001364 0.008093 -0.008447 
+-0.009145 0.004015 -0.019314 0.164737 -0.078158 -0.020439 
+-0.003992 -0.002395 -0.034286 0.020738 0.004775 -0.032553 
+0.001074 0.008290 -0.030542 -0.021941 0.000128 -0.016200 
+-0.023730 -0.046030 -0.004291 0.041675 0.019806 0.043325 
+0.148686 0.182000 0.105086 0.010772 0.014117 0.018908 
+-0.038800 -0.009880 0.015089 -0.024494 0.018272 -0.003309 
+0.000370 0.025052 -0.070879 -0.007536 -0.001614 -0.010605 
+-0.020988 -0.010961 -0.004252 -0.036495 -0.016989 0.002448 
+-5.204082 -3.561224 0.489796 -5.677419 -3.572581 1.379032 
+-4.569832 -2.988827 1.670391 -3.622881 -2.864407 1.716102 
+-3.184000 -3.148000 1.948000 -3.074257 -3.707921 2.425743 
+-3.803571 -4.482143 3.669643 -0.056976 -0.059627 0.085854 
+-0.013555 -0.133061 0.106729 0.012773 -0.007310 0.038292 
+-0.059200 -0.005714 0.008457 -0.073218 -0.015352 0.027899 
+-0.052519 0.015717 -0.005969 -0.013333 0.069167 0.000000 
+0.006121 0.010045 0.020530 0.024454 -0.000966 0.017689 
+0.009111 0.012827 -0.016144 0.044681 0.053609 -0.049488 
+0.002857 -0.002857 -0.067143 -0.007844 -0.025126 0.024641 
+-0.001314 0.000668 0.000829 0.000796 -0.004813 0.004990 
+0.002259 -0.002708 0.001032 0.001081 0.003712 0.003168 
+0.013893 0.006932 -0.003455 0.011687 0.000631 -0.001352 
+0.006759 0.005904 -0.002253 0.005569 0.003699 -0.001870 
+0.005871 -0.000820 -0.004729 0.007639 -0.000150 -0.001937 
+0.006335 0.001574 -0.001580 0.002535 0.000000 -0.000704 
+0.000430 0.002835 -0.004170 0.005383 0.004461 -0.005991 
+0.010568 0.005656 -0.006203 0.010003 0.003757 -0.004704 
+0.002736 0.000359 -0.001718 -0.001045 -0.000194 0.000757 
+-0.002277 0.000698 -0.000271 -0.002198 0.002109 -0.001386 
+-0.001311 0.001596 -0.004559 -0.001122 0.002776 -0.000006 
+-0.001352 0.000635 -0.000087 -0.003359 -0.003316 0.003325 
+-0.001412 -0.001773 0.009336 0.002125 -0.000052 -0.000613 
+0.005894 0.002976 -0.009122 0.006051 0.005697 -0.008071 
+0.003788 0.005027 -0.004622 0.001948 0.002702 -0.002003 
+0.001309 0.001449 -0.001043 0.005937 0.002937 -0.001274 
+0.004099 -0.000501 -0.003084 0.000727 0.002085 0.002228 
+0.000902 0.000582 -0.004022 0.006385 0.003618 -0.007566 
+0.008205 0.003399 0.001949 0.002118 0.002827 0.003979 
+-0.000271 -0.004954 -0.000935 -0.005969 -0.007640 -0.003064 
+-0.002089 0.003194 -0.006587 0.013204 0.027278 -0.002148 
+0.018254 0.058730 0.011111 -0.019467 0.029060 -0.011473 
+-0.036151 0.023317 -0.024402 -0.022408 0.010455 0.003735 
+-0.001825 0.046087 -0.023576 0.007500 0.007230 0.004338 
+-0.032644 -0.007333 0.006995 -0.008952 -0.007124 0.017295 
+0.014180 -0.011140 0.009019 0.027975 -0.025040 -0.010082 
+0.002833 -0.038757 0.041269 -0.038534 -0.066434 0.075639 
+-0.027073 -0.019083 -0.017961 -0.018434 -0.018826 -0.000485 
+-0.027456 -0.025510 0.006593 -4.790476 -2.942857 1.619048 
+-5.174603 -3.222222 2.031746 -4.078313 -2.668675 2.186747 
+-3.248619 -2.585635 2.447514 -2.712230 -3.158273 2.546763 
+-0.049679 -0.003885 0.038746 -0.266234 0.257014 0.154855 
+0.014000 -0.185189 -0.030865 -0.005233 0.004393 0.002658 
+-0.016277 -0.012855 -0.013280 -0.017925 -0.006238 -0.010253 
+-0.000341 -0.007276 -0.006139 0.000855 0.002355 0.002752 
+0.004634 0.034634 0.006545 -0.009123 0.040910 -0.015305 
+0.006319 0.045687 -0.023654 0.095135 -0.006279 0.012795 
+0.030745 -0.015476 -0.032369 0.006269 -0.007317 0.001099 
+-0.006926 -0.005070 0.015152 -0.008991 -0.001329 0.009309 
+-0.002891 -0.000460 0.002902 0.000596 -0.000337 -0.000216 
+0.004893 -0.001149 0.001191 0.001733 0.004070 0.000097 
+0.002216 0.004685 -0.000281 -0.000162 0.002947 -0.000990 
+-0.003647 0.004165 0.003650 0.000904 0.004157 -0.000994 
+-0.002720 0.006965 -0.001974 0.000276 0.003945 -0.003148 
+0.002375 0.002197 -0.003374 0.005880 0.004034 -0.003449 
+0.006667 0.007042 -0.003521 0.004991 0.005924 -0.004823 
+0.005236 0.004228 -0.005469 0.005466 0.004860 -0.001680 
+0.000361 0.004345 -0.000122 -0.001187 0.003874 -0.003537 
+-0.000497 0.006536 -0.008418 0.003779 0.003414 -0.014082 
+0.007123 0.005632 -0.010947 0.007195 0.006189 -0.004426 
+0.007264 0.004835 -0.003250 0.007601 0.006406 -0.005662 
+0.006341 0.008604 -0.006926 0.006124 0.009590 -0.004246 
+0.006619 0.007244 -0.002166 0.005760 0.003095 -0.000497 
+0.003805 0.002540 -0.000765 0.004720 0.005420 -0.003192 
+0.012489 0.012908 -0.006515 0.018327 0.010003 -0.014362 
+-0.000470 0.007982 -0.004333 0.004356 0.002222 0.003670 
+0.001921 -0.000728 0.002613 0.005343 -0.003635 -0.007912 
+0.005016 0.003317 0.002456 0.006794 0.008292 0.002115 
+0.006251 -0.001283 0.013363 0.005290 -0.009979 0.049930 
+0.048236 0.003445 -0.066250 -0.008245 0.003502 -0.086179 
+0.001350 0.035644 -0.018602 0.014058 0.020960 -0.014662 
+0.009898 0.035987 0.005245 -0.003557 0.033978 -0.058880 
+-0.003265 -0.035102 -0.049796 -0.004305 -0.004379 -0.007514 
+0.027147 0.004160 -0.006585 0.010675 0.003948 0.001766 
+0.008972 -0.002107 0.013668 -0.003175 0.003042 -0.014683 
+-0.025700 -0.031787 -0.011498 -0.035350 -0.022489 -0.008052 
+-0.018502 -0.013381 -0.005181 -0.017932 -0.016613 -0.000423 
+-0.024866 -0.021688 0.006032 -0.036838 -0.019635 0.018011 
+-3.556391 -2.436090 2.473684 -0.031952 -0.024347 0.024956 
+-0.024928 -0.018132 0.019951 -0.019529 -0.016920 0.015360 
+-0.036267 0.014552 0.016103 0.005870 -0.004086 0.004096 
+0.018373 0.006720 0.008200 0.003681 0.002060 0.001456 
+-0.019796 -0.005306 0.010136 -0.011013 -0.002112 0.017851 
+0.018267 -0.014170 0.004378 0.083522 0.002978 -0.028630 
+0.009969 0.018000 0.017446 -0.004438 0.006456 -0.000269 
+-0.004442 0.006685 0.000946 -0.004813 0.000627 0.006061 
+-0.003141 -0.002289 0.005242 -0.000433 -0.001860 0.002214 
+0.003645 0.004745 0.005125 0.003093 0.007318 -0.002742 
+0.007042 0.007635 0.000364 0.003859 0.005717 0.000015 
+0.004111 0.002477 -0.001799 0.002159 0.001430 -0.001660 
+0.000021 -0.000223 -0.001296 -0.002777 0.002154 -0.000191 
+-0.006432 -0.000644 0.005000 -0.006793 -0.002836 0.005768 
+-0.003196 -0.000880 0.001359 0.000398 0.002003 -0.000140 
+-0.001237 -0.000875 -0.000067 -0.003645 -0.003456 -0.000577 
+-0.001342 -0.000497 0.001029 0.005805 0.000973 -0.000706 
+0.002742 -0.001815 -0.001074 0.000948 0.013657 -0.007999 
+0.000665 0.007867 -0.010094 -0.003762 0.003977 -0.004013 
+-0.004484 0.002685 -0.002114 -0.001010 0.004473 -0.006461 
+0.003055 0.007273 -0.009266 0.002875 0.007001 -0.003199 
+0.000653 -0.000506 0.000123 0.000322 -0.005317 0.000454 
+0.004811 -0.002676 -0.001760 0.006034 0.003162 -0.004902 
+0.000297 0.005027 -0.003969 -0.003077 0.003441 -0.005118 
+-0.000377 0.006460 -0.006945 0.008331 0.009825 -0.006951 
+0.011329 0.003196 -0.001227 0.002668 -0.005014 -0.000213 
+0.001305 0.001294 0.004217 -0.000913 -0.000141 0.005231 
+0.001236 0.001693 0.001998 -0.002664 0.010187 -0.001838 
+-0.005703 0.018897 -0.014945 -0.003312 0.016786 -0.027751 
+0.000566 0.002816 -0.009531 -0.006731 -0.002933 0.009952 
+-0.037182 -0.008109 -0.001021 -0.027517 -0.017511 -0.004211 
+0.001000 0.002000 -0.006500 0.075531 0.079579 -0.055842 
+0.021187 0.031059 -0.040315 -0.004416 -0.050519 0.063766 
+0.008987 0.009733 0.017329 -0.031129 0.005944 0.009982 
+-0.016158 -0.008511 0.010279 0.001195 -0.028613 0.031169 
+0.002245 -0.022816 0.010157 -0.017844 -0.000036 0.004457 
+-0.013877 -0.006164 -0.005755 -0.018311 -0.017625 0.014987 
+-0.018942 -0.014363 0.011893 -0.019024 -0.009451 0.009024 
+-0.016780 -0.004750 0.009386 -0.013613 -0.001012 0.008859 
+-0.012134 0.008987 0.006084 -0.012504 0.023815 0.006922 
+0.013171 -0.007972 0.014992 0.007684 -0.012616 0.019150 
+-0.011563 -0.020000 0.011563 0.019789 -0.008211 0.034737 
+0.017363 0.009121 0.062088 0.017118 -0.021397 0.086364 
+-0.035690 -0.013966 0.007371 -0.003091 0.001596 0.000087 
+-0.002685 0.000973 -0.003429 -0.003443 0.001902 -0.009893 
+0.002963 -0.000401 -0.006966 0.004681 -0.004477 -0.002151 
+0.001286 -0.002369 0.000349 -0.001425 -0.001573 -0.000530 
+-0.006087 -0.006513 0.006181 -0.006675 -0.008443 0.004123 
+-0.000306 0.002287 0.001707 0.003704 0.002824 0.001759 
+0.003681 0.005690 -0.003147 -0.001854 0.000744 -0.001665 
+0.000111 0.000106 -0.002788 0.000364 -0.000221 0.000214 
+0.001632 -0.000980 -0.000418 0.003800 0.001126 -0.002428 
+0.004107 0.003436 -0.000716 0.002381 0.005354 0.000661 
+0.002369 0.007579 0.000987 0.005630 0.007790 0.001613 
+0.005200 0.003357 0.001218 -0.000619 0.000979 0.000979 
+-0.002351 0.001355 0.000892 -0.000887 -0.000183 0.000280 
+0.000122 -0.002704 0.001827 -0.001581 -0.003671 0.003480 
+-0.005128 -0.002603 0.004304 -0.004952 0.000898 0.000616 
+0.000296 0.006963 -0.004843 0.006982 0.012714 -0.004556 
+0.010524 0.011310 -0.001008 0.009228 0.006908 -0.000974 
+0.003712 0.002566 -0.000931 -0.002137 0.000309 0.000743 
+-0.003094 0.001391 0.004258 -0.000256 -0.003817 0.002498 
+-0.001303 -0.001115 -0.000208 0.002555 0.006968 -0.006067 
+0.007987 0.013807 -0.009794 -0.002488 0.008464 -0.007132 
+0.003643 -0.002648 -0.003234 0.002295 0.001680 0.006761 
+-0.004668 0.000878 0.001281 -0.002983 0.003323 -0.002715 
+-0.001371 0.001951 -0.008029 -0.001624 0.002266 -0.023468 
+-0.017571 0.009471 -0.004674 0.007290 0.027464 -0.013928 
+-0.007480 -0.001209 0.000450 -0.060909 -0.042727 -0.017273 
+-0.029703 -0.043923 -0.001896 -0.035294 0.000850 -0.005528 
+-0.054923 -0.008831 0.004962 -0.022455 0.018161 -0.014940 
+-0.000762 0.001524 -0.041905 0.019710 0.008774 -0.051839 
+0.012805 0.029917 -0.036263 0.050786 0.044780 0.041321 
+0.010674 0.034791 -0.003707 -0.011027 0.009136 -0.006502 
+-0.006600 -0.005000 0.003630 0.006939 -0.011833 0.018562 
+-0.007787 -0.003542 0.018829 -0.010721 -0.008250 0.011968 
+-0.013768 -0.007298 0.007983 -0.019928 -0.002730 0.007197 
+-0.012400 -0.005419 0.007983 0.028043 0.013460 -0.000056 
+-0.006003 0.026254 0.003622 0.006503 0.005322 -0.006657 
+-0.004444 -0.012613 0.002102 -0.019496 -0.010420 -0.013782 
+-0.042667 -0.042667 0.000000 -0.004823 -0.000382 -0.010177 
+0.036368 -0.010186 0.002567 0.003683 -0.000969 -0.006787 
+0.001604 -0.000861 -0.000076 -0.000081 -0.001544 0.004708 
+-0.000419 -0.003292 0.007467 -0.000319 -0.001704 0.005821 
+-0.000987 -0.002166 0.000416 0.001745 0.001262 -0.001301 
+0.000335 0.004574 -0.001310 -0.005627 0.007690 0.002688 
+-0.009034 0.006176 0.003170 -0.004571 0.003143 0.000286 
+0.000898 0.004425 -0.001319 0.000176 0.008104 -0.005851 
+0.002416 0.009666 -0.006039 -0.002421 0.008685 -0.003552 
+-0.006130 0.006188 -0.003096 -0.006003 0.005915 -0.002594 
+-0.000654 0.003050 0.000926 -0.000086 0.003488 -0.001787 
+-0.000206 -0.000206 0.000412 -0.000684 -0.001049 -0.000502 
+-0.003380 0.001481 -0.000105 0.005031 0.001441 -0.001835 
+0.006832 0.002667 -0.003794 0.003064 0.000938 -0.001209 
+-0.000491 0.001347 -0.000523 0.005505 0.002115 -0.005251 
+0.001519 0.002777 -0.011890 0.009314 0.006610 -0.006410 
+0.002904 0.005752 -0.000653 -0.002031 0.001456 -0.001250 
+-0.002286 -0.000263 -0.001220 -0.000299 0.000783 0.001428 
+0.001574 0.002563 0.002388 0.000352 0.003005 0.001414 
+-0.001212 0.001014 0.000290 -0.001379 -0.001181 0.000222 
+-0.001660 0.000158 -0.000186 -0.001575 0.000969 -0.001907 
+-0.001387 -0.000033 -0.002354 -0.000638 -0.002522 0.001533 
+-0.000798 -0.003989 0.006852 0.002381 0.002363 -0.003567 
+0.006969 0.007131 -0.006994 -0.001931 0.008177 -0.002852 
+0.000285 0.011128 -0.006739 0.002326 0.052407 -0.037942 
+-0.019423 0.007170 -0.048711 -0.124229 -0.062176 0.017782 
+-0.101430 -0.077533 0.012191 -0.010923 0.029755 0.001337 
+0.007444 0.080148 0.024551 0.000227 0.016944 0.007097 
+-0.014771 0.007715 0.005407 -0.013056 -0.003822 0.001242 
+-0.002667 -0.014667 -0.009333 -0.020000 -0.021579 0.023158 
+-0.012222 -0.002222 0.034444 0.020335 0.004550 0.004952 
+0.029445 0.020555 0.000808 0.015682 -0.000166 0.005004 
+0.005466 -0.022883 0.021289 -0.000927 -0.026700 -0.001437 
+-0.018967 -0.018316 0.021500 -0.003610 0.010868 0.034078 
+-0.068573 0.010938 -0.026669 -0.027778 0.049306 -0.063194 
+0.008521 -0.043542 0.017916 0.010843 -0.013019 0.003670 
+0.010690 -0.004150 0.002184 -0.006722 -0.000411 -0.003911 
+0.022781 0.023182 0.007995 0.007304 0.023547 0.025577 
+-0.019335 0.014207 0.004875 -0.002988 0.005482 -0.007071 
+0.007884 0.000782 -0.013217 0.003724 -0.000427 -0.008337 
+-0.001434 0.000988 -0.000659 -0.002333 0.001179 0.000754 
+-0.000281 0.001338 0.001937 0.003565 0.008319 -0.004605 
+0.003583 0.004090 -0.002209 -0.000905 -0.003914 0.001244 
+-0.001668 -0.005175 0.003802 -0.001108 -0.002204 0.003629 
+0.001188 -0.001425 -0.000475 0.002294 -0.001973 0.001909 
+0.005631 -0.004236 0.001433 0.001856 -0.006373 0.000339 
+0.000237 -0.000349 -0.000422 0.000377 0.005219 -0.000899 
+0.000413 0.007704 -0.001321 0.001664 0.007846 -0.002639 
+0.003919 0.007838 -0.003939 0.006888 0.008265 -0.002296 
+0.000850 0.005119 -0.006820 0.002085 0.005676 -0.002258 
+0.002893 0.002985 -0.001722 0.002804 -0.001122 -0.001538 
+0.000428 0.001277 0.001143 -0.000220 -0.001543 0.002651 
+-0.003032 -0.003642 0.001313 0.000618 -0.002857 -0.000292 
+0.002715 0.000590 -0.000729 0.000269 0.001379 0.000168 
+-0.006170 0.000407 -0.000887 -0.004188 -0.000396 -0.003618 
+-0.001428 -0.000045 -0.001181 0.000630 -0.000455 -0.000023 
+-0.006190 -0.004170 0.002826 -0.007819 -0.007477 0.007714 
+-0.005075 -0.006212 0.002873 -0.000374 0.000028 -0.000308 
+0.001100 0.001220 0.000808 -0.001471 0.002620 0.000094 
+-0.001827 0.001218 -0.001522 0.000129 -0.000110 0.000260 
+-0.001019 -0.001499 0.000964 -0.008348 -0.005082 0.005143 
+-0.008053 -0.013328 0.008516 -0.001664 -0.007446 -0.001736 
+0.001449 -0.004849 0.006803 0.003711 -0.001635 0.007419 
+-0.014581 -0.001993 -0.018517 -0.022500 -0.022500 0.000000 
+0.009286 -0.006429 0.008571 -0.012956 -0.019138 -0.020445 
+-0.010386 -0.021142 -0.011712 -0.005952 -0.009619 -0.001067 
+-0.009050 0.011071 0.001293 -0.007681 0.024253 0.001985 
+-0.006818 0.010455 -0.005000 -0.013636 -0.012197 -0.002159 
+-0.019040 -0.026400 0.009520 -0.010181 -0.025652 0.011635 
+-0.013661 -0.018729 0.013000 -0.022281 -0.017500 0.008102 
+0.010677 -0.015123 0.017615 0.017333 0.009583 0.010708 
+0.019294 0.026471 0.009647 -0.005707 0.025485 0.017768 
+-0.009684 0.011611 0.020620 -0.005751 0.004989 0.023929 
+0.001001 0.004049 0.001466 0.002623 -0.027777 0.027006 
+-0.025801 -0.049177 0.024892 -0.037872 0.016082 0.021399 
+0.006064 -0.008747 0.012873 -0.002190 0.002497 0.000580 
+-0.004347 0.002326 -0.010804 -0.001380 0.004840 -0.012054 
+-0.001737 0.002304 -0.003339 -0.000551 0.000184 0.001679 
+0.000471 0.000042 0.001496 0.005814 0.009355 -0.001293 
+0.004675 0.012765 -0.006645 -0.000133 0.005733 0.000533 
+-0.002284 0.001714 0.000215 -0.000052 0.002517 -0.000367 
+0.000773 -0.000642 -0.000141 0.000235 -0.003857 -0.000026 
+0.000207 -0.002883 -0.003529 0.001023 -0.000526 0.000324 
+0.003223 -0.001424 0.000438 0.003512 -0.001409 -0.000477 
+-0.000202 -0.001498 0.001567 -0.003024 -0.001196 0.002673 
+-0.001540 0.001240 0.001667 0.000000 0.002900 0.000600 
+0.006910 0.003528 0.000219 0.005048 0.002224 0.000512 
+-0.000729 0.001979 -0.001979 -0.004283 -0.000787 -0.002015 
+-0.004845 -0.000557 -0.001113 -0.002009 0.000266 -0.000113 
+0.001771 0.001936 0.000242 0.005407 0.003158 -0.001878 
+0.006178 0.001633 -0.001953 0.004940 -0.000802 -0.001103 
+0.002847 0.000680 -0.001265 0.003987 0.002808 0.001669 
+0.001660 0.001515 0.001665 -0.001025 0.000512 -0.000231 
+-0.003796 -0.003554 -0.001696 -0.007660 -0.004628 0.000992 
+-0.002626 -0.000902 0.003018 -0.000596 -0.000315 0.000627 
+-0.001983 -0.001229 0.000293 -0.003225 -0.002107 -0.001898 
+-0.002830 0.000039 -0.006681 -0.002708 0.005393 -0.002311 
+-0.001091 0.000430 -0.000521 -0.000936 -0.004841 0.004414 
+-0.002194 -0.003873 0.003921 0.000973 0.001114 -0.005450 
+-0.000343 0.000286 -0.008254 0.000356 -0.002260 0.000936 
+-0.003340 -0.006416 0.003419 -0.003413 -0.000010 -0.003889 
+-0.007145 0.011538 -0.021757 -0.007717 0.002418 -0.014843 
+0.013199 0.026765 -0.005551 0.079824 0.045172 -0.006975 
+0.019459 0.009861 0.023497 0.001699 -0.021821 0.032552 
+-0.013031 -0.021034 0.043402 0.011253 -0.016247 0.034965 
+0.012067 -0.007548 -0.018606 0.034655 0.037780 0.012072 
+0.048527 0.048721 0.009123 0.050370 0.027975 -0.001681 
+-0.009271 0.003542 0.004896 -0.004889 0.009778 0.030556 
+-0.047474 -0.003479 0.016217 -0.022608 -0.000686 0.003255 
+-0.005294 -0.004189 -0.001795 0.006065 0.006247 0.012373 
+0.009347 0.019629 0.004985 0.000754 0.012627 0.012929 
+0.046852 0.013942 -0.014923 0.037500 -0.000846 -0.000515 
+-0.004216 0.011102 0.003982 0.013574 -0.003172 -0.000631 
+-0.045000 0.011250 0.033750 -0.002570 0.001265 0.002703 
+-0.002329 0.002375 -0.006692 -0.002638 0.001380 -0.003517 
+-0.001758 0.003524 0.002552 -0.002353 0.000549 0.000241 
+0.000396 -0.003503 0.000478 0.002930 -0.004551 0.001663 
+-0.000593 -0.000947 0.000138 -0.006188 0.001658 -0.001271 
+-0.005647 0.003762 0.002318 -0.002625 0.004428 -0.000436 
+0.002768 0.004084 -0.004118 0.001694 -0.001127 0.000849 
+0.002756 -0.000941 0.001919 0.000088 -0.000466 -0.000956 
+0.003430 0.001618 -0.004810 0.003468 -0.001169 -0.001701 
+0.001886 -0.004299 0.001088 0.000794 -0.003789 0.000761 
+-0.002443 0.000666 0.000793 -0.003558 0.003420 0.002752 
+-0.003766 0.003992 -0.000422 0.000742 0.004833 -0.001117 
+0.001119 0.007901 -0.002307 -0.000690 0.008285 -0.001591 
+0.002268 -0.001179 0.000181 0.001994 0.005845 0.002717 
+0.000475 0.003118 -0.001187 0.001026 0.003980 -0.003426 
+-0.000700 0.004254 -0.003035 -0.000304 0.003070 -0.002796 
+-0.000207 0.005021 -0.002256 -0.002911 0.001017 -0.004228 
+-0.002047 -0.001633 -0.005107 -0.002450 -0.002399 -0.002677 
+-0.001356 -0.004097 -0.001135 -0.002040 -0.002544 0.000031 
+-0.000201 -0.000515 0.000053 0.001749 -0.001125 -0.000775 
+0.001221 -0.000581 -0.000315 -0.000755 0.002912 -0.000796 
+0.002350 0.006470 -0.001021 0.005138 0.008283 -0.002055 
+0.008587 0.007996 -0.001615 0.005946 0.007968 0.000773 
+0.001236 0.006936 -0.002001 0.000644 0.001989 -0.001225 
+-0.000673 0.000092 0.004961 0.003367 0.003980 0.002816 
+0.009189 0.000673 -0.004711 0.008942 0.010218 -0.003925 
+0.004586 0.007105 -0.002659 -0.000934 0.006751 -0.005709 
+-0.013490 0.028253 -0.044366 -0.018095 -0.014143 -0.018381 
+0.001954 -0.003256 -0.002143 -0.004167 -0.015833 -0.002917 
+0.025000 0.025000 -0.014000 -0.005848 0.012734 0.003377 
+0.005736 0.017910 0.018917 0.022764 0.034843 0.012365 
+0.012222 -0.004099 0.001537 -0.001916 -0.022431 0.006748 
+0.000526 -0.001631 -0.001500 0.023000 0.029148 -0.020686 
+0.030000 0.036250 -0.012500 -0.013636 -0.014545 0.020000 
+-0.012004 -0.040045 0.017317 0.011162 0.011111 -0.000101 
+0.000000 0.018333 -0.001111 0.000829 -0.002666 0.004017 
+0.009831 0.000925 -0.004211 0.004608 0.000847 0.000778 
+-0.005265 0.009055 0.002226 -0.001829 -0.000045 -0.001559 
+0.003369 -0.001550 0.003047 0.003072 0.000682 0.005438 
+0.007435 0.009282 0.002984 0.003289 0.010934 -0.004281 
+0.002866 0.005426 -0.001827 0.004335 -0.000503 0.000865 
+0.006178 0.002332 0.000100 0.006796 0.005764 -0.001728 
+0.004068 0.006106 0.000463 0.002946 0.003036 -0.002081 
+0.002351 -0.000854 -0.001035 0.003658 0.001925 -0.003112 
+0.002360 0.001603 0.001952 0.004098 0.002135 0.003049 
+0.004660 0.002047 0.002728 0.000117 0.001463 -0.000586 
+-0.002477 0.001449 0.001994 -0.002250 0.000921 0.004040 
+-0.001301 -0.001319 0.003030 0.000475 -0.000187 -0.000190 
+0.002020 0.002568 -0.000963 0.000196 0.004622 -0.004671 
+-0.001410 0.007500 -0.000470 -0.000789 0.004011 -0.000537 
+-0.002565 -0.001678 0.001183 -0.006994 -0.003561 0.004325 
+-0.008609 -0.002112 0.003983 -0.003314 0.001003 -0.000219 
+0.003460 0.003855 -0.005602 0.005478 0.005813 -0.008899 
+0.005716 0.005740 -0.007872 -0.000498 0.001927 -0.000214 
+-0.001228 -0.003043 -0.003437 -0.000225 -0.001566 -0.002042 
+-0.002552 0.001665 0.000093 -0.002660 0.000855 0.001025 
+0.000812 0.001280 0.000431 0.003771 0.000764 -0.000276 
+0.006000 0.002068 -0.001491 0.007424 0.005262 -0.002080 
+0.007212 0.004479 0.000835 0.002370 0.004241 0.003136 
+0.001746 0.006715 0.002562 0.002093 0.008542 0.000644 
+0.003750 0.007869 0.000926 0.004171 0.006252 0.001334 
+0.005743 0.004434 0.002276 0.006172 0.003334 0.003253 
+0.001294 0.003151 0.001078 -0.004767 -0.000214 -0.003513 
+-0.003211 -0.001569 -0.004567 -0.003611 0.000556 -0.002577 
+-0.000533 0.003846 -0.003991 -0.002414 0.005039 -0.006369 
+-0.011622 -0.019801 -0.002566 0.012208 -0.002597 -0.000260 
+0.011211 -0.007702 0.032264 -0.012842 -0.030749 0.024727 
+-0.005061 -0.011542 0.016545 0.009517 0.003346 0.012566 
+0.013502 0.001784 -0.004076 0.007107 -0.026973 -0.000256 
+-0.013333 -0.046667 0.050000 0.004688 -0.023077 0.021095 
+-0.016055 0.023506 -0.004020 -0.017301 -0.003871 -0.008769 
+-0.016152 -0.021379 -0.009515 -0.016947 -0.062753 0.003664 
+0.005617 -0.041560 0.019433 0.002057 -0.006364 0.017225 
+-0.004350 0.001145 0.017571 0.003363 0.000240 0.013213 
+0.003640 0.002031 -0.003057 0.004661 -0.001197 0.002149 
+-0.000192 0.009255 -0.000076 0.003286 0.005176 0.006741 
+-0.004771 -0.009846 0.002737 0.000417 -0.000080 0.000006 
+0.008796 0.012135 -0.014667 0.007468 0.020767 -0.038619 
+0.002246 0.036466 -0.050094 -0.008559 0.030039 -0.020662 
+-0.070531 0.008257 0.003988 -0.074078 0.017870 0.014765 
+-0.005387 0.002096 -0.019154 0.005124 -0.011783 0.021837 
+0.003136 0.002577 0.004926 0.004497 0.004801 0.001234 
+0.001252 0.007445 -0.002198 0.000209 0.007791 -0.007584 
+0.002090 0.006039 -0.006511 -0.061403 -0.042818 0.038655 
+-0.020017 -0.029439 0.020408 0.007879 -0.002759 -0.004896 
+0.005083 -0.005583 0.002667 -0.011235 -0.006568 0.014951 
+-0.001796 -0.027469 0.008259 -0.008000 -0.017600 0.008800 
+-0.021692 -0.014462 -0.008000 -0.011341 -0.019724 -0.010848 
+0.001282 -0.012821 -0.001795 -0.032139 -0.019038 0.021643 
+-0.079660 -0.051511 0.000532 -0.004034 -0.147143 -0.004706 
+-0.023475 -0.150795 0.024270 -0.052733 -0.089200 0.011333 
+-0.037500 -0.021572 0.009588 0.011656 0.012887 -0.007908 
+0.013436 0.018667 -0.020154 0.018667 0.006000 0.006000 
+-0.008010 -0.001295 0.005662 -0.027636 -0.012986 0.004051 
+-0.017736 -0.022500 0.012669 -0.031316 -0.035789 0.004474 
+-0.020000 -0.031754 0.042338 0.003465 -0.000347 -0.037500 
+0.005000 0.000000 -0.088333 0.016275 0.043333 0.004069 
+0.060769 -0.003564 -0.004356 0.116152 0.032695 -0.021755 
+0.080891 0.088630 -0.055217 0.004233 0.045503 -0.012487 
+0.028689 0.041667 -0.023907 -0.082976 -0.092381 -0.119762 
+-0.004730 -0.021354 0.005622 0.000106 -0.002873 -0.000294 
+-0.000752 -0.004203 -0.001797 0.003729 0.059663 -0.058333 
+-0.001822 0.037549 -0.034748 -0.002986 -0.005529 -0.004357 
+-0.006595 -0.002966 0.009681 -0.020233 -0.008209 0.015557 
+-0.018571 -0.015174 -0.002529 -0.008667 -0.016175 -0.019410 
+0.015281 -0.020474 0.007937 -0.000380 0.002271 0.000266 
+0.000375 0.003609 -0.003276 -0.000870 -0.003378 0.001693 
+-0.003694 -0.001800 -0.001098 -0.000571 0.000741 0.000484 
+-0.002281 0.003072 0.000869 0.000117 0.002564 -0.008729 
+0.005493 0.005983 -0.029607 0.004835 0.006761 -0.013700 
+0.014341 0.010557 -0.016546 0.016544 0.006436 -0.007266 
+0.017647 0.008336 -0.009108 0.018481 0.021093 -0.001058 
+0.010818 0.012352 0.010441 -0.001340 0.002023 0.018274 
+-0.005718 -0.001956 0.006169 -0.019093 -0.037191 -0.006028 
+0.005992 0.007856 -0.018255 0.019441 0.013024 -0.033718 
+0.022848 0.010121 -0.021515 0.009298 0.002059 -0.005672 
+-0.014961 0.007961 0.009608 0.050345 -0.016207 0.043103 
+0.061590 -0.061874 0.073965 0.039167 -0.066622 -0.011104 
+0.004178 0.020778 0.040200 0.018436 0.021719 0.060886 
+0.002740 0.004927 0.002715 0.003716 0.001970 -0.002278 
+-0.001405 -0.000048 -0.001699 -0.002988 -0.002273 -0.006134 
+-0.012267 -0.022249 0.004226 -0.119955 -0.027436 -0.009730 
+0.001561 -0.017083 0.007635 -0.002655 -0.000286 0.009328 
+0.004600 -0.001781 0.006607 0.006940 0.006182 0.000877 
+-0.003951 -0.004768 0.005768 -0.017195 -0.005231 0.016072 
+-0.008897 -0.009793 0.018989 -0.013843 -0.008235 0.024824 
+-0.019812 -0.011232 0.019448 0.054532 -0.008977 -0.010585 
+-0.069321 0.023117 -0.004599 -0.005250 0.001909 0.014615 
+0.012143 0.000000 0.003571 0.066923 0.005788 -0.052092 
+-0.102719 -0.033976 0.084147 -0.025299 -0.013120 0.008248 
+0.010000 0.044538 0.005567 0.008960 0.028053 0.008533 
+-0.020475 -0.008101 -0.001491 -0.028143 -0.052714 -0.000714 
+-0.032947 -0.033825 0.022842 0.004802 0.006927 0.002282 
+0.033524 0.028667 0.004762 0.094734 0.027693 -0.011366 
+0.081525 0.019325 -0.053747 0.010352 0.016720 0.027736 
+0.062647 0.053235 0.004706 0.033533 0.002293 -0.058947 
+0.018611 0.016389 -0.051389 -0.019977 0.019297 -0.015492 
+0.043041 -0.017953 -0.001228 0.057691 0.014322 0.010440 
+0.042351 -0.010456 0.010807 0.024660 0.024873 -0.006980 
+0.010260 0.020260 -0.012208 0.020000 0.006667 0.026667 
+0.015076 -0.042868 0.037100 -0.044557 -0.032105 -0.007863 
+-0.047366 0.005579 0.007211 -0.016884 0.009869 0.014862 
+-0.003330 0.004987 0.017932 -0.000492 0.001106 0.011105 
+0.010044 0.014131 0.002522 0.004922 -0.006641 -0.010290 
+-0.001331 -0.007478 -0.004293 0.006397 0.001393 0.000238 
+0.008356 -0.000488 0.002505 -0.005404 -0.001898 -0.008484 
+-0.004663 0.009125 -0.013266 0.018071 -0.007089 -0.011109 
+0.006388 0.000137 -0.007483 -0.005052 -0.000448 0.012854 
+-0.003241 -0.005787 0.012269 0.006104 -0.007470 0.011922 
+0.014971 -0.013471 0.013100 0.014542 -0.003445 0.000405 
+-0.027542 0.001055 -0.007419 -0.007050 0.007473 0.016924 
+-0.053961 -0.032458 0.037790 -0.055266 -0.049301 -0.020742 
+0.022429 0.053743 -0.068343 0.077358 0.057143 0.022102 
+0.024011 -0.004106 0.004392 0.016667 -0.006667 0.000000 
+0.035556 -0.007289 -0.005467 0.048768 -0.013551 -0.025072 
+0.011443 -0.034075 -0.011330 -0.003713 0.034167 -0.000857 
+0.089610 -0.005396 -0.022520 0.004666 0.015038 -0.009396 
+-0.005851 -0.017933 0.015801 -0.003852 -0.011060 0.006680 
+-0.001512 -0.004852 0.001503 0.001215 0.002418 -0.000206 
+0.003955 0.006477 0.002331 0.000972 0.002839 0.002006 
+0.024667 0.006619 -0.022381 0.005215 0.000873 -0.007026 
+0.012571 0.002810 -0.001286 0.000400 0.005450 0.001465 
+-0.005637 -0.010469 0.005000 -0.037228 -0.025432 0.031715 
+-0.019899 -0.038990 0.057677 0.029298 -0.008480 0.062456 
+0.039318 0.014432 0.008295 0.007720 -0.002107 0.005123 
+-0.026795 -0.000646 -0.023930 0.002407 -0.001852 -0.001481 
+0.004038 -0.005192 0.012143 0.047179 -0.047829 0.025538 
+0.013354 0.003816 0.025556 0.003456 0.014959 0.016391 
+0.017599 0.026891 -0.001266 0.003083 0.008647 -0.008045 
+-0.026531 -0.017225 0.015048 -0.020246 -0.045461 0.020123 
+-0.028852 -0.011527 -0.000725 0.018422 0.032082 -0.015456 
+0.004703 0.047592 -0.028667 -0.009798 0.017373 0.000227 
+0.028099 0.018807 -0.009627 0.011981 0.040516 -0.003049 
+0.033489 -0.041957 -0.016880 0.038750 -0.005473 -0.032838 
+0.044821 0.062411 -0.132768 -0.044289 -0.033242 0.051621 
+-0.003072 -0.052434 0.022633 0.024195 0.002060 0.005695 
+0.030478 -0.002626 -0.010792 0.001335 -0.005000 -0.030498 
+-0.012649 0.009436 0.000752 0.007572 0.014910 0.012783 
+-0.003533 -0.024245 0.018063 0.006542 -0.009944 0.008073 
+0.004733 -0.002829 0.005868 0.003075 -0.001596 0.003633 
+-0.000638 -0.010285 0.005116 0.005365 -0.001720 0.014045 
+-0.005417 -0.004497 0.010769 -0.007748 -0.029424 0.029301 
+0.054732 0.014948 0.014188 0.035246 0.008938 0.006027 
+-0.010588 0.005323 0.004436 0.015632 0.001724 -0.025517 
+0.014350 0.037670 -0.028276 0.021197 0.023419 -0.011966 
+0.008365 0.006318 0.006786 -0.007591 -0.005559 -0.000353 
+-0.001524 0.002095 0.003286 -0.001000 0.009644 0.004733 
+0.001289 0.024581 0.000828 0.028394 -0.021606 0.010182 
+0.032010 0.001492 -0.021024 0.016667 0.016667 -0.032778 
+0.032840 0.022400 -0.047644 0.037682 0.024486 -0.067882 
+0.047387 0.028577 -0.040845 0.030830 0.011111 -0.031094 
+0.024253 0.000433 -0.013872 0.011152 0.001848 0.007788 
+0.003191 -0.014212 0.002973 -0.017904 -0.035879 0.016646 
+-0.009300 -0.016946 0.005980 0.094167 0.071486 0.011914 
+0.039222 -0.002159 0.027090 0.018610 0.028053 -0.041850 
+-0.001740 -0.008328 0.002946 -0.000437 -0.005831 -0.000212 
+-0.001620 -0.005070 0.001600 0.000630 -0.004426 0.003247 
+-0.000351 -0.002921 0.000011 0.005945 -0.008040 -0.016318 
+0.000659 -0.000779 0.046316 -0.002203 -0.013642 0.005194 
+0.006402 -0.004356 -0.006023 0.003352 0.010506 -0.018497 
+0.003778 0.029778 -0.004444 0.017359 0.010333 -0.008197 
+0.011393 0.012388 -0.009163 0.030133 0.019320 -0.028201 
+0.029714 0.019857 0.026429 -0.009041 0.002265 -0.009490 
+0.019417 -0.005958 -0.008958 0.005532 -0.020311 -0.029478 
+-0.087965 -0.114242 -0.105671 0.061429 0.008919 -0.053514 
+0.036700 -0.014680 -0.112857 0.018659 0.013716 -0.057893 
+0.010909 0.000000 -0.010909 -0.010995 0.005339 0.019005 
+-0.009064 0.007836 0.021602 -0.004689 0.004869 0.009665 
+-0.023495 0.018858 -0.023183 0.012538 0.042000 -0.051154 
+-0.034576 0.034627 -0.055373 0.031796 0.041238 -0.055307 
+0.018261 -0.003434 -0.011448 0.010977 0.003279 0.024824 
+-0.014747 -0.143535 -0.035253 -0.042222 0.003333 -0.003333 
+0.071429 -0.020000 0.017143 -0.017450 -0.120500 -0.077150 
+-0.003316 -0.008814 0.000834 0.006020 0.026187 0.002965 
+0.026044 0.003538 0.006469 0.031599 0.001959 -0.008740 
+0.001658 -0.025017 0.004132 -0.014978 0.016136 -0.007182 
+-0.014272 0.028535 -0.021439 0.000372 -0.001165 -0.000527 
+-0.001078 0.001109 0.000941 -0.002255 -0.000183 -0.003876 
+-0.005026 0.002861 -0.011610 0.000899 -0.000495 -0.008057 
+0.013433 -0.010482 0.007734 0.006455 -0.009843 0.021701 
+0.019865 0.036000 -0.014189 0.009304 0.007656 -0.005729 
+-0.040586 -0.018858 -0.005432 0.013322 0.014352 0.010399 
+0.049089 0.064069 0.011576 0.020635 0.019628 0.004889 
+0.004937 0.015861 0.004434 0.005115 0.013133 -0.003573 
+0.004992 0.003122 -0.000155 0.000684 0.000365 0.000597 
+-0.009620 0.014325 -0.007289 0.002188 0.032000 -0.028447 
+0.043066 0.031573 0.039719 0.009402 -0.001127 -0.020872 
+0.022748 0.034094 -0.011353 0.019841 0.063657 -0.023911 
+-0.001670 -0.002975 0.003282 -0.004860 -0.005907 0.004746 
+-0.014365 -0.014218 0.008509 -0.027441 -0.031375 0.015799 
+-0.011092 -0.091984 0.052620 -0.070000 -0.092144 0.056310 
+0.052740 0.046480 0.005530 0.020173 -0.001669 0.006181 
+0.008876 -0.009306 0.002644 0.002765 -0.012304 0.016738 
+-0.003228 -0.002455 0.006530 -0.000414 -0.003545 -0.001089 
+0.000022 -0.004283 -0.001200 -0.000594 -0.005897 -0.001388 
+-0.000945 -0.008742 -0.001412 -0.018860 -0.021081 0.030228 
+-0.044333 -0.036733 0.040533 -0.010522 -0.021244 0.007445 
+0.008534 0.014202 -0.009203 0.032619 0.017156 -0.009920 
+-0.072041 -0.117579 0.045706 -0.008661 -0.014627 0.037017 
+-0.013692 0.003231 0.022923 -0.059254 0.007746 0.022075 
+-0.018739 -0.030000 -0.005766 0.001825 0.000159 0.001746 
+0.006204 -0.003602 0.004312 -0.015332 -0.016317 -0.004540 
+-0.017802 -0.029738 -0.021815 0.032352 -0.050742 -0.039220 
+0.016020 -0.022041 -0.019490 -0.001244 -0.013152 -0.013276 
+0.002522 -0.004176 -0.004491 0.046800 0.020477 -0.025154 
+0.063831 0.020584 -0.084935 0.082770 0.029797 -0.114223 
+-0.009661 0.038072 -0.019801 -0.002570 0.025533 0.003824 
+-0.010139 0.012790 0.016999 0.008947 0.024737 -0.019474 
+-0.000530 0.039150 0.015915 0.026079 -0.113547 0.011015 
+0.080866 -0.032035 0.052251 -0.013333 -0.007778 0.000000 
+0.028571 0.001429 0.027143 0.258889 -0.042698 -0.045397 
+-0.005750 -0.035100 -0.040700 -0.005006 -0.010607 -0.005028 
+0.005005 0.002900 0.003650 0.002862 0.002803 -0.002568 
+-0.002084 0.009528 -0.012180 0.017954 -0.026718 -0.009344 
+0.014660 -0.022747 0.010440 0.001512 -0.000761 0.003232 
+-0.000841 0.000649 -0.000158 0.001480 -0.002430 -0.011715 
+0.002486 -0.015672 -0.019631 0.000871 -0.049116 -0.058843 
+0.021429 -0.075714 -0.048810 -0.009819 0.027027 -0.045475 
+-0.021301 0.011475 0.008590 -0.015122 0.003240 0.040952 
+0.005765 -0.035479 0.030710 0.085388 0.011667 0.032021 
+0.057745 0.065686 0.006667 0.001657 0.028100 0.017173 
+-0.000260 0.014764 0.006762 0.017253 0.011922 0.003309 
+0.021970 -0.003621 0.013955 0.030361 -0.009794 0.013255 
+0.003226 -0.012114 -0.007040 -0.038406 -0.018894 0.037480 
+0.008518 -0.014196 -0.002839 0.009479 -0.010541 0.011210 
+0.013415 -0.007326 0.018745 0.006029 0.002783 0.018319 
+0.005330 0.001557 -0.003009 0.005840 0.003015 -0.002077 
+0.002145 0.001079 0.000358 0.001043 0.001212 -0.000448 
+0.001810 0.008194 -0.006782 -0.012098 0.016851 -0.022062 
+-0.042266 0.020397 -0.026569 -0.070256 -0.049103 0.040641 
+-0.152811 -0.158756 0.180829 -0.140631 -0.119903 0.153010 
+-0.034154 -0.004567 0.031164 -0.004038 -0.005620 0.004392 
+0.003167 0.001309 -0.000983 -0.000386 0.007930 -0.001334 
+0.000323 0.012469 -0.001727 -0.006745 -0.001901 0.023520 
+-0.004187 -0.034678 0.037591 0.005758 -0.022727 0.022424 
+-0.001382 -0.001330 -0.000292 0.008874 0.029163 -0.039953 
+0.005784 -0.006925 -0.021963 0.023817 -0.005336 -0.027513 
+-0.028077 -0.093333 0.018718 -0.088492 -0.021627 -0.066468 
+0.001113 0.008000 0.000495 0.064138 0.035931 -0.007103 
+-0.053584 0.002279 -0.037749 0.003274 0.001772 0.003703 
+0.017148 0.003226 0.001889 0.020190 -0.019901 -0.016862 
+0.003042 -0.056687 -0.017261 -0.007966 -0.065861 -0.009630 
+-0.004891 -0.062880 -0.005290 0.029885 -0.026602 -0.012573 
+0.037850 0.005287 -0.020441 0.058701 0.006623 -0.027143 
+0.050466 -0.063082 0.036364 0.021601 -0.074268 0.034101 
+0.012297 -0.057883 0.006914 0.009487 -0.026039 -0.004289 
+0.013381 0.005556 0.004181 0.017720 0.010280 0.006510 
+0.024178 0.029520 -0.030787 -0.012487 0.017354 0.010582 
+-0.004492 -0.025059 -0.014326 0.032005 -0.047226 -0.009785 
+-0.019288 -0.024898 -0.029969 -0.013910 -0.011225 -0.018721 
+-0.008304 0.003198 -0.018115 0.004062 -0.001250 -0.043108 
+0.051981 0.088811 0.013055 -0.008472 0.023569 0.034715 
+0.002268 -0.003255 0.000580 0.000026 0.006570 -0.000265 
+-0.000353 0.002335 -0.004184 -0.001300 0.000256 0.005261 
+0.013718 -0.034817 0.012499 0.007155 0.036974 -0.001790 
+-0.026885 0.053642 -0.036358 -0.016721 0.004406 0.024140 
+0.000544 -0.006385 0.008965 0.006032 -0.004776 0.013019 
+0.001583 0.000183 0.003867 -0.011420 0.014987 -0.024655 
+-0.002532 0.009795 -0.010189 0.008133 -0.012705 -0.001865 
+0.024739 0.009392 -0.000145 0.036630 0.000323 0.016276 
+0.032843 0.009625 0.032797 -0.010403 -0.030037 0.017619 
+0.003914 -0.020925 0.052322 -0.003499 -0.012613 0.037038 
+-0.004617 -0.011218 0.017293 0.000493 0.024381 0.009935 
+0.025139 0.013694 0.055389 -0.035625 -0.090000 0.035625 
+0.000081 0.002686 0.000312 0.005728 0.003446 -0.005036 
+0.002223 0.003027 0.002375 0.001061 -0.003593 0.007310 
+-0.000873 -0.008196 0.008161 -0.003363 -0.008209 0.006145 
+-0.004882 -0.002873 0.001990 0.013030 0.006215 -0.005181 
+0.018702 0.007558 -0.006603 0.002669 0.002541 -0.002182 
+-0.003213 -0.014155 0.009716 -0.002861 -0.013766 0.007667 
+0.000649 -0.005877 0.002138 0.000726 0.003999 -0.001068 
+0.001062 0.013806 -0.007191 0.002897 0.023529 -0.009743 
+0.026297 0.008195 0.017375 -0.000612 0.009834 -0.015603 
+-0.004571 0.006476 -0.003619 -0.008246 0.027462 -0.009300 
+-0.007287 0.043774 -0.012561 -0.011232 0.005076 -0.013813 
+-0.038618 -0.016764 0.022900 -0.025233 -0.004194 0.012043 
+0.053114 -0.037259 0.028143 0.006000 0.016667 0.033333 
+0.002222 -0.004090 0.025904 0.021210 -0.014286 -0.023688 
+0.009780 -0.011121 0.000286 0.008016 0.003700 0.012400 
+-0.014071 -0.010464 0.005893 -0.029765 -0.041647 0.017059 
+-0.059921 -0.045385 0.027793 -0.090217 -0.056701 0.051766 
+0.072056 0.076028 -0.044028 0.106000 0.038031 0.004754 
+-0.001344 -0.006290 -0.014140 -0.023310 -0.044867 0.014337 
+-0.009342 -0.016709 -0.023221 -0.005250 0.001250 -0.000500 
+-0.019375 -0.028125 -0.023750 0.019608 -0.023922 -0.103333 
+0.035513 0.021178 -0.057988 0.007929 0.014143 0.006786 
+-0.002752 -0.066919 -0.041802 -0.026305 -0.041833 -0.039557 
+-0.029745 -0.005849 -0.007802 0.005429 0.048786 -0.030357 
+0.006461 0.049906 -0.069576 0.010665 0.028700 -0.040337 
+-0.010787 0.008796 -0.003981 -0.017601 0.007399 -0.008859 
+-0.008896 -0.001804 -0.002576 0.005646 0.001763 -0.001940 
+0.003843 -0.000808 -0.001934 -0.006797 -0.002604 0.014073 
+0.004233 -0.000458 0.027342 -0.015386 0.048952 -0.023689 
+-0.034440 0.082530 -0.007445 0.000484 0.006508 -0.017831 
+-0.032186 0.009424 -0.005112 -0.042453 0.003096 0.028426 
+-0.026054 0.001361 -0.017823 -0.004808 0.008989 -0.035641 
+0.006925 0.012500 -0.022012 0.004448 0.022936 -0.025639 
+-0.010118 -0.007388 -0.043964 -0.008300 -0.014176 -0.022129 
+-0.037497 -0.013226 0.032401 -0.007744 0.024413 -0.001910 
+-0.004821 0.002722 -0.016492 0.010301 0.003863 -0.011714 
+0.001643 -0.001643 0.006983 0.007091 -0.007782 0.011242 
+0.037287 -0.004368 0.008356 0.023423 -0.010622 -0.015093 
+0.004260 0.000328 -0.001780 0.006306 0.000300 -0.001051 
+0.004926 -0.001121 0.000185 0.003962 -0.000305 0.005224 
+0.004193 -0.001351 0.004158 0.005104 0.000530 0.000771 
+0.007091 0.002464 -0.001431 0.009700 0.003794 -0.001169 
+0.011545 0.005526 -0.002392 0.009365 0.004077 -0.004002 
+0.007084 0.001588 -0.003596 0.004597 0.000186 -0.001862 
+0.003516 0.000981 0.000121 -0.000240 0.003260 -0.001359 
+-0.000368 0.004434 -0.012758 0.012419 -0.016732 -0.052953 
+-0.010385 0.006538 -0.008462 0.018706 0.018746 -0.023347 
+0.039704 0.029445 -0.009849 0.033325 0.046306 -0.010726 
+0.044728 0.047484 -0.008577 0.041599 0.005612 -0.017415 
+0.011515 0.004694 0.014509 -0.007503 -0.002968 0.006257 
+0.034451 0.004608 -0.002602 -0.002971 0.024507 -0.025246 
+0.013778 -0.005236 0.006592 0.039983 0.011980 -0.014193 
+0.037500 0.025000 -0.012500 0.009908 -0.009289 0.014866 
+-0.017570 -0.007626 0.034809 -0.011064 0.015730 0.014885 
+-0.018539 0.027680 0.013498 -0.092658 0.016365 0.021465 
+-0.085694 0.046249 0.013202 0.157547 -0.010739 0.024740 
+0.002857 -0.022143 0.001429 0.000667 -0.036331 0.032294 
+0.010714 -0.087500 0.052500 0.016991 -0.061863 0.029812 
+-0.001596 -0.014958 0.006248 0.001439 -0.007576 -0.013712 
+0.031671 0.030959 -0.037370 0.042350 0.015908 -0.036761 
+0.023037 -0.036963 -0.027852 -0.006842 -0.061579 0.000000 
+0.028866 -0.026467 -0.001542 0.104907 -0.024488 -0.064093 
+0.170010 0.089557 -0.050848 0.000600 0.002019 0.001105 
+-0.009019 0.004276 -0.011154 -0.015238 0.003576 -0.008910 
+-0.010369 0.002415 -0.002185 0.002948 0.003465 -0.001791 
+0.009155 -0.000050 -0.009412 0.013226 0.002493 -0.014214 
+-0.002376 0.049231 -0.001425 -0.009816 0.035474 -0.007289 
+-0.018205 0.023113 -0.008760 -0.041348 0.019950 -0.006242 
+-0.073728 0.011798 0.002939 -0.071854 -0.031087 0.005579 
+0.014054 0.009611 -0.017648 0.012705 0.018792 -0.018232 
+-0.005556 0.003889 -0.008889 -0.000337 0.002101 -0.007962 
+0.003365 0.011031 -0.002188 0.014449 -0.041633 0.021102 
+-0.049202 -0.061092 0.055857 -0.001602 -0.013168 0.000197 
+-0.000978 -0.006628 -0.003403 -0.003778 -0.008667 -0.002667 
+-0.001029 -0.012067 -0.000184 -0.003043 -0.017483 -0.000017 
+0.005667 0.010400 -0.002221 0.009502 0.038009 -0.010000 
+0.003996 -0.001282 0.000186 0.002285 0.002025 0.004084 
+0.001275 0.000830 0.005646 -0.000815 0.000501 0.005078 
+0.001382 0.001263 0.001309 0.002552 0.002881 0.000692 
+0.003962 0.001381 -0.000092 0.001413 -0.002148 0.002189 
+0.000000 -0.002149 0.002356 0.002891 0.001076 -0.001403 
+0.005515 0.003755 -0.002806 0.003761 0.001716 0.000378 
+0.001142 -0.001052 0.000611 0.000321 0.000262 0.000503 
+-0.000748 -0.002981 -0.002378 0.001636 -0.017518 -0.020886 
+-0.057273 0.051818 0.000000 0.001333 0.000348 -0.006004 
+0.003606 -0.004733 -0.005318 -0.010569 0.002719 -0.007097 
+-0.006067 0.004800 -0.007000 0.002941 -0.003508 0.004349 
+-0.016208 0.001163 0.005661 -0.001103 0.019248 -0.003246 
+0.035902 0.064533 -0.007196 0.038171 0.043892 -0.006378 
+0.014366 0.008698 -0.003572 0.000744 -0.011366 -0.003595 
+0.014918 -0.027381 -0.012660 0.006583 -0.004494 0.013642 
+0.007870 -0.006481 0.013426 0.003100 -0.003025 -0.002966 
+0.024689 0.014779 -0.004947 0.026967 0.023724 -0.010871 
+-0.055189 -0.017941 0.016693 0.000450 -0.036102 -0.006242 
+0.017262 -0.057643 0.086619 0.019111 -0.009556 0.046667 
+0.009394 -0.044667 -0.001152 0.039780 -0.007143 -0.059670 
+-0.000739 -0.011429 -0.001847 0.016139 0.013048 0.019343 
+0.012909 0.026818 0.006455 0.015543 0.029143 -0.027848 
+-0.012315 -0.004093 -0.028741 0.016850 -0.043922 0.010600 
+0.059727 -0.116331 0.003727 0.113902 -0.094918 0.050000 
+0.025573 -0.034015 -0.012015 -0.005263 0.013216 -0.031116 
+-0.005591 -0.006989 -0.009570 -0.008580 -0.012663 0.001847 
+-0.006447 -0.005273 0.005155 -0.000418 -0.000012 0.000824 
+-0.001067 -0.001356 0.007172 -0.019508 -0.004121 0.032760 
+-0.003110 -0.007718 -0.013016 0.016418 0.024014 -0.018317 
+0.013187 -0.012143 0.010055 0.018075 -0.068736 0.066954 
+-0.022222 -0.028889 0.095556 0.000787 0.045225 -0.015993 
+0.016899 0.029487 -0.029821 0.001079 0.012675 -0.000709 
+0.000242 0.000121 -0.003939 0.001238 -0.014794 0.002715 
+-0.000948 -0.043747 0.007307 -0.012661 -0.045337 0.019161 
+0.015168 -0.004235 0.011070 0.010654 -0.026722 0.006172 
+-0.008667 -0.025403 0.007770 -0.003872 0.001489 -0.002500 
+0.000622 0.007380 -0.015093 0.013136 0.009837 -0.014796 
+0.003774 0.001398 -0.006704 0.010811 -0.000811 -0.019370 
+-0.001452 -0.005726 0.003367 -0.004805 -0.007757 0.005565 
+-0.007726 -0.001284 0.003705 -0.002967 0.000486 0.001185 
+0.001237 -0.001482 -0.003696 0.002411 -0.004583 -0.003432 
+0.002698 -0.000755 -0.004547 0.000178 -0.000462 -0.001061 
+-0.002221 -0.001001 0.001637 -0.000194 0.000139 0.000076 
+0.002600 -0.000955 0.000564 0.003574 0.000339 0.001036 
+0.003126 0.003185 0.001575 0.001088 0.000212 0.001458 
+0.003069 -0.011225 0.005852 0.005193 -0.027766 0.010068 
+-0.012709 0.059933 0.014047 0.002688 0.029286 0.003404 
+-0.007389 0.009667 -0.008398 -0.024922 0.000153 0.008138 
+-0.010113 -0.000952 0.007972 0.022480 -0.004365 -0.005020 
+0.012710 -0.008818 0.001554 -0.006889 -0.000256 0.005838 
+0.030914 0.014778 -0.076063 0.028884 0.050406 0.073768 
+0.001553 0.000739 0.028667 0.005145 0.000475 -0.007677 
+-0.014920 -0.013318 0.001465 -0.030526 -0.015789 0.023158 
+-0.019127 0.003941 0.011973 -0.005244 0.006603 -0.000776 
+0.013280 -0.001647 -0.017999 -0.001491 0.007895 -0.002263 
+0.009407 -0.008074 -0.034963 -0.011953 -0.024882 -0.026834 
+-0.025455 -0.027818 0.055636 -0.060459 0.006120 0.028428 
+-0.024286 0.013905 0.000857 0.018603 0.004746 -0.050683 
+-0.020272 0.017589 -0.027844 -0.009206 0.014921 -0.006032 
+-0.006310 0.002586 -0.004293 -0.005752 0.008039 0.006307 
+-0.008689 0.026250 0.006951 -0.030313 -0.002984 0.022250 
+-0.008527 -0.015995 -0.001783 -0.072750 0.024250 -0.025000 
+-0.006714 0.012914 0.043364 -0.001538 0.007692 0.030909 
+0.011396 0.008543 0.005739 0.006435 0.003377 -0.012215 
+0.001124 0.002872 -0.015297 0.003137 0.000409 -0.015754 
+-0.000672 0.000016 0.001006 -0.012258 -0.001378 0.025434 
+-0.005958 -0.005452 0.007857 0.014190 0.003987 -0.069395 
+0.007240 -0.027597 0.012435 0.012928 -0.039399 0.015039 
+-0.054169 -0.015415 -0.004891 -0.004685 -0.000070 -0.007133 
+0.003811 -0.004095 -0.013819 0.002652 0.015663 -0.026272 
+0.014015 0.018324 0.005629 -0.006527 -0.002091 -0.004689 
+0.013051 -0.047772 -0.011124 -0.011795 -0.061026 -0.018205 
+-0.035780 -0.009557 -0.037855 -0.003942 -0.008312 -0.003550 
+-0.006895 -0.007377 0.001321 -0.002906 0.000657 0.000415 
+0.006980 0.014497 -0.013199 0.018840 0.019844 -0.008993 
+0.013769 0.003383 -0.013431 0.005239 -0.030067 -0.019023 
+-0.002208 -0.003247 0.000397 -0.002471 -0.003934 -0.000063 
+-0.000274 0.000225 -0.000075 -0.001151 0.001726 -0.002261 
+0.003446 0.007171 -0.008008 0.003359 0.005628 -0.010148 
+0.001111 0.004269 -0.009605 -0.001143 0.000862 -0.007473 
+-0.001711 0.000876 -0.002203 0.000206 -0.000026 0.002352 
+0.000399 0.000593 0.001433 0.002243 0.001776 -0.001573 
+0.003369 0.003592 0.001662 -0.001574 -0.000177 -0.003456 
+0.001213 -0.009710 -0.004253 0.000440 -0.039391 0.004626 
+-0.002621 -0.044375 -0.000570 -0.017653 -0.035817 0.008233 
+-0.003750 0.001243 -0.000518 0.005652 0.009756 -0.004451 
+-0.001121 -0.010384 0.006543 -0.002918 -0.021486 0.026587 
+0.050528 -0.027846 0.014315 0.024547 -0.036173 0.045733 
+0.019481 -0.039416 -0.079286 0.036667 -0.000167 0.000333 
+0.001020 -0.001175 -0.003769 0.002805 0.011260 -0.019593 
+0.013431 0.005506 -0.008036 -0.026015 0.005833 0.000394 
+-0.032554 0.026121 0.019645 -0.038630 0.023784 0.016866 
+-0.022037 0.004519 -0.003963 -0.026562 0.006875 -0.026562 
+-0.001123 0.015241 -0.005455 0.050588 0.012353 -0.050588 
+0.090104 0.035521 -0.027292 0.072292 -0.021042 0.030208 
+-0.030720 0.030299 0.013675 -0.099705 0.012651 0.014150 
+-0.019413 -0.019798 0.007753 -0.025154 -0.016451 -0.002654 
+-0.010621 0.006373 -0.020000 0.019333 -0.004385 -0.021923 
+0.042339 0.063129 -0.010205 0.043895 0.020552 -0.007471 
+-0.006419 -0.005551 -0.002549 0.013286 -0.001534 -0.037483 
+0.043356 -0.008254 -0.021702 0.007947 0.065323 0.014146 
+0.070330 0.027663 -0.003829 0.026709 0.017757 -0.023069 
+-0.003561 0.013333 -0.023106 -0.003000 -0.003000 -0.013500 
+0.006222 0.009222 0.002889 -0.002565 -0.001468 -0.017255 
+-0.018421 0.009358 -0.043543 -0.000952 -0.003095 -0.024762 
+-0.053756 -0.031344 0.092278 -0.010010 0.004969 -0.000890 
+-0.026398 0.026366 -0.085784 -0.005548 -0.026667 0.019971 
+-0.003045 -0.013477 -0.004701 0.019536 0.010555 -0.001019 
+-0.011404 0.026363 0.008191 -0.024672 0.065224 -0.011663 
+0.017747 0.084902 -0.024072 0.038051 0.033245 -0.058079 
+0.005885 0.021786 -0.059160 -0.009702 0.009267 -0.030350 
+-0.004325 0.000546 -0.001197 -0.004542 -0.004119 0.017655 
+-0.012208 0.002328 0.012158 0.009890 0.004798 -0.026536 
+0.013189 0.017956 -0.022278 0.008574 -0.003504 -0.009888 
+-0.000149 0.005407 0.006082 0.000277 0.005378 0.004763 
+0.001857 0.001840 -0.000004 0.002223 0.003502 -0.001273 
+0.000232 0.005321 -0.002339 -0.000688 0.004422 -0.004281 
+0.000903 0.002348 -0.003391 0.000499 0.002847 -0.002466 
+0.000112 0.003077 -0.003851 -0.002348 0.001087 -0.001761 
+-0.000062 -0.000384 -0.001607 0.000471 -0.000174 -0.000113 
+-0.000103 0.001575 -0.001538 -0.001904 0.002452 -0.004435 
+-0.002341 0.001915 -0.006352 0.003773 -0.010617 0.005749 
+-0.099724 -0.084005 0.043312 -0.043060 -0.059640 0.020886 
+-0.014774 -0.009998 0.000803 0.006889 0.000148 -0.002466 
+0.004994 -0.035783 0.005616 0.004701 -0.076752 0.053248 
+0.004821 -0.104821 0.043857 0.049068 -0.020396 -0.051282 
+-0.008778 -0.018161 -0.044980 0.011217 -0.009947 -0.049101 
+0.035610 0.002107 -0.034663 0.024319 0.011500 -0.015977 
+0.007430 0.011625 0.002320 -0.002730 -0.008091 -0.008579 
+-0.009756 0.007805 -0.007273 -0.032316 0.004105 -0.033684 
+-0.014138 0.021429 -0.035345 -0.006667 0.005333 -0.005333 
+0.020495 -0.002802 -0.004835 0.053187 -0.000440 -0.025934 
+0.017955 0.019432 -0.031402 0.018765 0.001383 -0.025877 
+-0.015991 -0.013502 0.071244 -0.041667 -0.118333 0.005000 
+0.019778 0.027889 0.037222 0.001522 0.026087 0.011739 
+0.008444 0.000222 -0.002222 -0.014470 -0.029439 0.009106 
+-0.018885 0.014161 -0.006688 0.000379 0.034985 -0.013538 
+0.000326 0.006587 0.004327 0.007199 -0.002327 0.006253 
+0.009039 0.005328 -0.000101 0.026683 0.029231 -0.008875 
+0.063023 0.036045 0.007948 0.006173 -0.019638 0.001474 
+-0.017082 -0.032599 -0.010350 -0.043467 -0.031844 0.015667 
+-0.025115 -0.027828 0.039080 0.015062 -0.017473 0.012396 
+0.014286 0.004860 -0.012636 -0.029333 -0.016667 0.046000 
+-0.033223 0.013686 0.115306 -0.012706 -0.003176 0.064000 
+-0.027506 0.015062 0.017358 -0.005658 -0.007593 -0.004020 
+-0.004222 -0.002311 0.002622 -0.011624 -0.007525 0.034140 
+-0.005103 0.003909 -0.006461 0.007940 0.000354 -0.003320 
+-0.007266 -0.004603 -0.022774 -0.011060 0.003163 -0.016992 
+-0.004545 -0.008636 -0.003831 -0.000827 -0.006692 -0.010451 
+0.009973 -0.001096 -0.013700 0.006148 -0.005452 -0.020181 
+0.003197 0.001045 0.006352 -0.035096 0.006450 0.055259 
+-0.003699 0.010741 0.018227 0.016667 0.005524 0.016571 
+0.003750 0.003316 0.003781 -0.001765 0.002326 0.005615 
+-0.001405 -0.002017 -0.000510 -0.000116 -0.003836 -0.001334 
+-0.001403 -0.002107 -0.000998 -0.001437 0.000812 -0.000005 
+-0.000589 0.002322 -0.000806 -0.000872 -0.000701 -0.000330 
+-0.000845 -0.001818 0.000471 0.000720 -0.000019 -0.000334 
+0.001331 0.002430 -0.000853 0.001213 0.003173 -0.001368 
+-0.001010 0.003471 -0.003109 -0.000361 0.004313 -0.001949 
+-0.000082 0.009485 0.000300 -0.014583 0.055833 0.010833 
+0.004242 0.025606 -0.017121 -0.028571 -0.028571 -0.047143 
+0.002143 -0.006714 -0.006571 -0.012279 -0.013795 0.003057 
+-0.001569 -0.033333 0.022549 0.024131 -0.057997 0.027875 
+0.011517 -0.045626 0.006202 0.032403 0.000319 -0.039076 
+0.005064 -0.015926 -0.027032 -0.003220 0.006208 0.013181 
+-0.000689 -0.008152 0.012987 -0.005011 -0.018627 0.015404 
+-0.002739 -0.022478 0.016150 -0.009026 -0.008852 0.025337 
+-0.015442 0.007653 0.013635 -0.006504 0.002428 0.003960 
+0.012222 0.006222 -0.004444 0.000317 -0.024087 0.004563 
+-0.023227 -0.049680 0.019141 -0.005624 -0.006702 0.002114 
+-0.004444 0.065778 -0.028444 -0.011927 0.014966 -0.062789 
+0.119036 0.020103 -0.061893 0.076998 -0.056467 -0.021676 
+0.016465 -0.003658 0.014840 0.026964 0.008381 0.020162 
+0.032045 0.044932 -0.007818 0.007596 0.018571 -0.000422 
+-0.009023 -0.008223 -0.002572 0.011142 0.009865 0.007824 
+0.036709 0.041186 -0.020146 0.031721 0.025656 -0.009860 
+0.018592 0.001111 0.006619 -0.000517 0.007374 0.001141 
+0.048244 0.014701 -0.021649 0.032778 -0.009396 0.005845 
+0.006788 -0.007032 0.005975 0.003368 -0.007848 0.011653 
+-0.001886 -0.017134 0.025087 -0.033845 -0.039360 0.049037 
+-0.048318 -0.077773 0.022273 0.001070 0.010000 0.000267 
+0.019812 0.014295 -0.058307 0.024934 -0.004259 -0.020066 
+0.012976 -0.000595 0.007381 0.003790 -0.020591 0.010858 
+-0.068602 -0.037157 0.027639 -0.013829 -0.022395 0.016823 
+-0.007983 -0.003614 -0.010242 -0.009447 -0.013564 -0.008850 
+-0.009338 -0.015966 -0.002772 -0.003426 -0.012825 0.007437 
+0.006876 -0.019114 0.016779 0.027210 0.005429 0.002185 
+0.024456 0.033719 -0.008596 0.044035 0.021719 -0.024807 
+0.007536 0.007861 -0.004049 0.021518 -0.009196 -0.003036 
+0.002645 -0.035323 0.035536 0.019038 0.010372 -0.004870 
+0.001273 -0.002002 0.002113 0.006145 -0.000880 -0.001003 
+0.005058 0.000813 -0.002832 0.003829 0.000324 -0.000707 
+0.000929 0.000619 0.000487 0.000642 0.002805 0.001033 
+0.000441 0.006508 -0.002824 0.000072 0.003400 -0.001661 
+0.000953 -0.002956 0.001697 0.003680 -0.004520 0.001447 
+-0.001958 -0.001905 -0.000126 -0.000345 0.002066 -0.004340 
+-0.002222 0.003274 -0.001059 -0.000774 0.000809 -0.001160 
+-0.002382 -0.004157 -0.002721 0.000771 0.030513 -0.006912 
+0.108235 0.061000 -0.027059 -0.001522 0.021635 -0.009730 
+-0.011378 -0.023479 0.021268 -0.022779 -0.028486 0.031114 
+-0.032718 -0.032297 0.028743 -0.023492 -0.028968 0.015238 
+-0.002245 0.018190 -0.011103 0.050793 0.044509 -0.050619 
+0.011201 0.040534 -0.004585 -0.003775 -0.001773 0.004440 
+0.008842 -0.005161 -0.000804 0.015213 -0.009817 0.000784 
+0.008232 -0.008757 0.005603 -0.014270 -0.014010 0.009455 
+-0.015644 -0.007403 0.000908 -0.001730 0.002233 0.003222 
+0.001348 0.003594 0.001348 0.001437 0.005710 0.001260 
+0.016489 0.004504 -0.004087 0.068182 0.028364 0.009455 
+0.045262 -0.029656 -0.026543 0.047400 -0.015800 -0.032667 
+0.048356 -0.014370 -0.039803 0.012819 -0.004826 0.004674 
+0.012891 -0.022509 -0.010273 0.019890 0.021298 -0.023335 
+0.034588 0.071765 -0.044471 0.062308 0.064053 0.012811 
+0.027431 0.025882 0.014771 0.012500 0.014000 -0.006500 
+-0.003586 0.021609 -0.008115 -0.007857 0.017655 -0.020177 
+0.013253 0.008533 -0.010773 0.033319 0.029038 -0.000221 
+0.019983 0.016156 0.019218 0.007487 -0.017910 0.008397 
+0.045911 -0.034139 -0.012950 0.013004 -0.006221 0.019802 
+0.011164 -0.006976 0.062766 0.026698 0.046327 0.057006 
+-0.024403 0.015181 -0.009647 0.015633 0.009499 -0.025251 
+0.053414 0.021131 0.000586 -0.002122 0.009735 0.016286 
+0.006111 0.008889 0.014444 0.010248 0.009339 0.006529 
+-0.001250 -0.012000 -0.006000 -0.017860 -0.012220 -0.015508 
+-0.019304 -0.022696 0.005860 -0.001782 -0.006489 0.006480 
+0.003825 -0.016275 0.011577 0.002046 -0.024659 0.004953 
+0.002507 -0.011579 -0.004513 0.009686 0.028592 -0.016176 
+0.003531 0.025504 -0.015782 0.031755 0.010856 -0.000832 
+0.090504 0.013361 -0.007899 0.105613 0.030007 -0.046386 
+0.056637 0.030823 0.010981 0.020580 0.056930 -0.002742 
+0.001390 0.000207 0.000150 0.003482 -0.001257 0.001735 
+0.004680 0.000455 0.000746 0.003034 0.001829 0.001217 
+0.001358 -0.001377 -0.000750 0.003542 -0.000958 -0.001959 
+0.005483 0.002043 -0.003339 0.002747 0.005570 -0.000725 
+-0.000367 0.002725 -0.003046 -0.001809 -0.004311 -0.002184 
+-0.001291 -0.005246 -0.003992 -0.000314 -0.003200 -0.000537 
+-0.000352 0.001211 0.000618 -0.001114 0.005275 -0.000602 
+-0.003071 0.009636 -0.006169 0.000204 0.026819 -0.022711 
+-0.006354 0.012756 -0.017407 0.008238 0.010983 -0.021510 
+-0.000732 -0.006146 0.004814 -0.005373 -0.014635 0.009025 
+-0.004012 -0.015596 0.010184 -0.002332 -0.005186 0.000186 
+0.000962 0.024678 -0.016745 0.058239 0.120765 -0.014371 
+-0.002011 -0.017097 0.006667 -0.008626 -0.008571 0.006593 
+-0.009314 -0.001827 -0.002109 0.005314 0.004292 0.012953 
+0.025016 -0.003020 -0.011084 0.048152 0.025382 -0.012878 
+0.036818 0.031077 0.003349 0.022099 0.007721 0.001753 
+-0.004908 -0.004877 0.001843 -0.000087 -0.004892 -0.001445 
+0.037453 0.003442 -0.012609 0.001568 -0.003024 -0.003876 
+-0.010327 0.011622 0.003233 -0.006402 0.004519 -0.000484 
+0.004371 -0.001229 -0.005872 -0.000614 -0.016173 -0.003753 
+0.030556 -0.017222 -0.005556 0.042500 -0.007500 -0.001250 
+0.056875 0.021900 0.029200 0.044062 0.033125 0.014687 
+0.011973 -0.020216 0.049919 -0.014667 -0.025069 0.060166 
+-0.030963 -0.022370 -0.002148 -0.025108 0.014830 0.041455 
+-0.040541 0.047692 -0.006757 0.006967 0.002149 0.011890 
+0.007567 -0.000967 0.003353 0.002382 0.008838 -0.016532 
+0.004196 -0.005979 -0.019305 -0.105098 0.065490 0.092157 
+0.211176 0.084265 0.098824 0.023153 0.062949 -0.037313 
+0.018896 0.026758 -0.014437 0.013862 0.026772 0.033704 
+0.006199 -0.034118 0.034129 0.062836 -0.167562 0.127000 
+0.091161 -0.003571 0.032768 0.047111 0.141333 -0.076667 
+-0.028545 0.079818 -0.005818 0.023383 -0.015672 0.059950 
+-0.050801 -0.100391 0.049666 -0.040953 -0.055577 0.023246 
+-0.020263 -0.030747 0.033671 0.003983 -0.001659 0.031739 
+-0.000141 0.000277 0.000105 -0.001558 0.000519 -0.006234 
+-0.099773 -0.041932 0.026023 -0.001821 -0.017307 -0.025046 
+0.010386 -0.019299 -0.030826 0.050699 0.007605 -0.040714 
+0.054836 0.006660 -0.026895 0.009363 0.007044 0.003668 
+0.000073 -0.001625 0.000113 -0.002499 -0.004274 0.001926 
+-0.002074 -0.004835 0.002417 -0.000209 -0.000594 0.000282 
+0.000570 0.003200 -0.001933 0.000829 0.002167 -0.001829 
+-0.000598 -0.000019 0.000289 -0.000056 -0.000240 -0.000037 
+-0.000420 0.000343 -0.000974 -0.000442 -0.000506 -0.002576 
+0.000074 -0.000857 -0.001425 -0.000380 -0.003170 0.002027 
+0.000392 -0.001708 0.000019 -0.000815 0.001381 -0.000791 
+-0.004191 0.005412 -0.005241 -0.008344 0.006896 -0.010817 
+-0.011409 0.005159 -0.005972 -0.000977 0.003584 -0.012061 
+0.001404 -0.005696 -0.005855 0.004264 -0.004134 0.004784 
+-0.001194 -0.003371 0.016576 -0.004745 -0.005073 0.009012 
+-0.001067 -0.009170 -0.021640 -0.015504 0.001248 -0.013489 
+-0.013145 0.004331 0.026595 -0.001770 -0.002160 0.015223 
+0.002521 -0.003689 0.012543 0.007465 -0.015578 0.008438 
+-0.014248 -0.056316 0.019284 0.021185 0.013926 0.002815 
+0.021968 0.033570 0.003017 0.014094 0.046959 -0.014606 
+0.013704 0.043704 -0.011481 0.009837 0.011634 0.007614 
+-0.005520 0.005125 0.008280 -0.010539 0.009737 0.005039 
+-0.019997 -0.005771 0.026153 -0.010712 -0.003343 0.006452 
+-0.000489 0.001606 -0.000985 -0.003000 0.005500 -0.006500 
+0.008746 0.000091 -0.039538 0.025130 -0.001883 0.009740 
+-0.001806 -0.022475 0.040234 0.014281 0.006321 0.006355 
+0.028025 -0.013160 0.034840 -0.051939 -0.008138 0.134515 
+0.032930 -0.056630 0.083773 -0.002344 0.026603 0.008086 
+-0.004026 0.033595 0.002693 0.022071 0.006571 0.001786 
+0.029375 0.020622 -0.007598 0.040199 0.075905 -0.090523 
+-0.040556 0.056111 0.015556 -0.020422 -0.011173 0.034480 
+0.009091 0.008680 0.024303 0.015455 -0.010182 -0.005091 
+0.000909 0.000000 0.011818 0.012751 0.095967 0.072191 
+0.036747 0.096747 0.014833 0.042170 -0.136064 0.033340 
+0.050903 -0.037625 0.030494 0.009530 0.032403 -0.035898 
+-0.018628 -0.019705 0.000957 -0.032547 -0.022217 0.025189 
+-0.026874 0.084680 0.029087 -0.069452 0.018510 -0.041676 
+-0.058889 0.028444 0.060889 0.020128 0.009487 0.039103 
+0.042420 -0.009409 0.007174 -0.133275 -0.160726 -0.002745 
+-0.016864 -0.054674 0.096780 0.025631 -0.009950 -0.058902 
+0.025207 -0.010579 -0.024499 0.000535 0.007041 -0.010410 
+0.003400 -0.015039 -0.003111 0.026051 -0.015796 0.002971 
+-0.002964 -0.005603 0.001976 -0.002494 -0.005455 0.003725 
+0.000110 -0.001827 0.001754 0.004662 0.003231 -0.001388 
+0.005682 0.004683 -0.004592 0.001084 0.006540 -0.000065 
+-0.005328 0.005016 0.002508 -0.004620 0.004355 0.000003 
+-0.001537 -0.000921 -0.001657 -0.003439 -0.004466 -0.004318 
+-0.006355 -0.009454 0.004069 -0.000700 -0.005687 0.003377 
+-0.001811 -0.003885 0.002126 -0.004245 -0.003782 -0.001276 
+-0.007050 -0.003125 -0.006494 -0.003801 0.003295 -0.006235 
+0.001845 0.009289 0.007570 0.001408 0.002690 0.000119 
+-0.000219 -0.009602 0.005092 0.003727 -0.020690 0.003356 
+-0.005491 -0.018635 0.011217 -0.023935 -0.003058 -0.005589 
+-0.019830 0.018026 -0.020187 -0.008466 0.011910 -0.014729 
+0.001590 -0.000695 -0.010000 0.014481 0.002148 -0.004074 
+0.008711 0.012004 -0.020047 0.006538 0.016448 -0.031900 
+-0.022302 -0.082540 0.040437 -0.008083 -0.030265 -0.013322 
+-0.003357 -0.020385 -0.011187 0.012033 -0.009093 -0.004102 
+0.037500 0.010319 -0.004422 0.020000 -0.005789 0.013684 
+-0.021266 0.017989 0.059687 -0.008525 0.007104 0.058095 
+0.001689 0.001933 -0.003097 0.020563 0.012786 -0.005897 
+0.004310 0.011388 0.005654 -0.011645 0.018308 -0.008308 
+-0.008929 -0.015000 0.008929 0.006731 -0.010637 0.011717 
+-0.008115 -0.004790 0.007967 -0.015745 -0.022728 0.004354 
+-0.007742 0.017097 -0.021613 -0.027534 -0.030286 0.070800 
+0.027622 -0.002434 0.048863 -0.015646 -0.042273 0.026962 
+-0.002738 0.009643 -0.024881 -0.001698 0.000943 -0.030714 
+0.025157 0.000792 -0.010863 0.055329 0.036731 -0.055638 
+0.050726 0.047484 -0.035306 0.001008 0.018613 -0.019958 
+-0.006465 -0.002828 -0.002020 0.008308 -0.029231 -0.016615 
+0.050569 -0.079797 0.041870 0.017169 -0.047967 0.017486 
+-0.008002 0.010345 -0.004636 -0.048176 0.016793 -0.000836 
+-0.016996 -0.021441 0.005913 0.006710 -0.007941 0.004511 
+0.013006 0.010172 0.000739 0.008834 -0.001774 0.003112 
+0.015210 -0.011933 -0.011471 0.005128 -0.001189 -0.005511 
+-0.006887 -0.007426 0.004552 0.002833 -0.010535 0.017343 
+0.075385 -0.085154 0.091205 -0.034012 -0.086499 0.041243 
+0.001235 0.020412 -0.018087 0.040219 0.051452 -0.037972 
+0.014144 0.004379 -0.004954 0.015795 -0.018716 0.010239 
+0.015468 -0.013107 0.034137 -0.036180 -0.010895 0.108642 
+-0.006662 -0.003892 0.004903 -0.002305 -0.001767 0.001658 
+0.004540 0.000728 -0.001149 0.002207 0.004550 0.000644 
+0.003140 0.002307 0.002452 0.001830 -0.000088 0.000732 
+-0.001101 -0.000744 -0.000396 -0.002655 -0.002179 -0.001258 
+-0.004448 -0.003370 -0.002574 -0.006662 -0.002852 -0.002955 
+0.000035 -0.000806 0.000127 -0.000572 -0.001011 -0.002651 
+-0.001383 -0.001651 -0.001990 -0.001314 0.000255 -0.007267 
+-0.003069 0.003736 -0.009263 -0.001380 0.001898 -0.006730 
+0.023135 -0.004433 -0.004921 0.004146 0.002599 -0.000656 
+-0.008410 0.003914 -0.008298 -0.006000 -0.001905 -0.013335 
+0.001316 0.004261 -0.012072 0.008398 0.003394 -0.013881 
+0.009048 0.009221 -0.014985 0.005405 0.011035 -0.007289 
+0.014740 0.000312 -0.010977 0.011383 0.000636 -0.004055 
+0.001165 -0.001219 -0.004886 0.011530 0.011156 -0.002939 
+0.045632 0.004598 0.036552 0.014865 0.028034 0.007394 
+0.021365 0.012565 0.004847 0.034920 -0.017529 -0.008741 
+0.005105 -0.029327 0.036213 -0.009191 -0.032169 0.019914 
+-0.007019 0.001604 0.011766 -0.002972 0.002992 -0.001510 
+-0.002960 -0.002434 0.000938 0.005685 -0.010716 -0.004065 
+0.012424 -0.027931 -0.011510 -0.003626 0.053601 -0.056830 
+0.000968 0.014919 0.012204 -0.001103 0.001725 0.003874 
+0.005683 -0.007306 -0.004001 0.000724 -0.021708 0.010291 
+-0.003973 -0.001870 0.010500 0.001667 0.002000 0.004000 
+0.015583 0.015917 0.000167 -0.008540 0.006146 0.015400 
+-0.001343 0.009864 0.028480 -0.002234 0.001399 0.009607 
+0.000938 -0.004047 0.003092 0.007500 0.016200 -0.009100 
+0.085966 0.010114 -0.039189 0.057647 0.015000 0.015000 
+-0.003469 -0.006020 -0.040510 0.028485 -0.010606 0.012424 
+0.003730 -0.042685 0.098216 -0.035542 -0.055065 0.026531 
+-0.035022 -0.062674 0.025543 -0.026071 -0.029715 0.008069 
+-0.005107 0.001218 -0.000703 0.026207 0.005000 0.002184 
+0.052702 0.004357 0.007438 0.056594 -0.000734 -0.004624 
+0.009610 -0.009817 -0.003128 -0.017548 -0.016210 0.001127 
+-0.011290 -0.009470 -0.003088 -0.000827 0.002160 -0.000034 
+0.027076 0.027513 0.003079 0.080855 0.040632 -0.015763 
+0.027955 0.066370 -0.014507 0.018897 0.081195 -0.015332 
+0.014128 0.034739 -0.008192 0.010334 -0.002258 0.001812 
+0.008330 0.016280 -0.011156 -0.017287 0.010113 0.003132 
+-0.005487 0.001062 0.001416 -0.001994 0.000192 0.002663 
+-0.000593 -0.000286 0.001844 -0.000407 0.000264 0.004494 
+0.002731 0.003195 0.004689 0.005993 0.003498 0.000960 
+0.004729 0.003665 -0.000794 -0.000141 0.002844 -0.001333 
+-0.001912 0.003379 -0.002563 0.002506 0.006362 -0.002904 
+-0.000078 0.004274 0.000923 0.001254 0.000581 0.000673 
+0.001266 -0.000616 -0.000657 0.000423 -0.002785 -0.002938 
+-0.001596 0.000197 -0.002108 0.001318 -0.008851 -0.005634 
+0.022957 -0.005793 -0.012675 -0.023529 -0.020766 0.020155 
+-0.031144 -0.010567 -0.001044 -0.005853 0.006686 -0.020128 
+0.003886 0.009283 -0.017919 0.011622 0.005289 -0.009760 
+-0.001176 0.000296 -0.005858 -0.002811 0.004279 -0.003389 
+0.000231 0.000546 -0.001786 -0.005169 -0.002619 -0.000841 
+-0.006878 0.005025 0.000288 -0.003704 -0.003704 0.003704 
+0.003280 0.005720 0.018710 -0.015763 -0.000808 -0.000520 
+0.021331 0.020443 0.000950 0.001612 -0.014662 -0.004114 
+-0.032143 -0.036429 0.049286 -0.027292 -0.027292 0.027292 
+0.005450 -0.002945 -0.006327 0.012593 0.000598 -0.000240 
+0.005700 -0.006421 -0.000421 0.010649 -0.013654 -0.008482 
+0.032093 -0.005748 -0.010216 -0.043588 0.032255 -0.016854 
+0.040207 -0.003059 0.010003 0.028312 0.005492 0.025593 
+0.014643 -0.010714 0.023929 0.002493 -0.019413 0.012757 
+-0.001408 -0.005259 0.000467 0.013396 0.005011 -0.002284 
+0.001556 0.036288 -0.024366 0.000366 0.094444 0.000041 
+-0.005167 -0.004253 -0.011331 -0.001109 -0.002414 -0.008870 
+0.014828 -0.001766 0.003161 -0.001594 0.008116 0.000725 
+0.020689 0.035362 -0.015130 -0.011074 0.011413 -0.018757 
+0.075471 0.025633 -0.118669 -0.004176 0.019298 -0.003466 
+-0.003302 -0.054744 0.012512 -0.014793 0.018244 -0.000585 
+-0.007455 0.019493 -0.011879 0.005595 0.002342 -0.001015 
+0.019022 -0.002634 0.006633 0.044200 0.007743 0.001876 
+0.080351 0.015912 0.007490 0.095423 0.052204 -0.002479 
+0.039765 0.045147 -0.007923 -0.020023 -0.013706 0.001914 
+-0.020744 -0.043884 0.002652 0.052346 0.052311 -0.008722 
+0.036976 0.098658 -0.036513 -0.005661 0.014551 -0.006666 
+-0.014631 -0.029805 0.018816 -0.011060 0.003535 -0.000657 
+-0.010414 0.022089 -0.024558 -0.003370 0.019544 -0.023638 
+0.006305 0.009267 -0.015107 0.002613 0.001788 -0.004836 
+0.000435 0.003863 -0.000312 -0.000956 0.003999 0.002535 
+-0.005222 0.000922 0.003380 -0.002825 -0.001000 0.001126 
+0.001367 0.001276 -0.000673 0.002885 0.003302 -0.002266 
+0.002408 0.003679 -0.001221 0.000047 0.002589 -0.000653 
+0.000864 0.001245 0.000234 0.001919 0.000170 0.001843 
+0.001146 -0.001874 0.000699 -0.005135 0.001580 0.000220 
+-0.006140 0.001691 -0.003950 -0.003757 -0.003168 -0.005227 
+-0.001776 0.001356 -0.001786 -0.010186 0.007731 -0.016114 
+-0.000808 -0.000126 -0.000503 -0.000720 0.000000 -0.000560 
+-0.000130 -0.000269 -0.000505 -0.002006 -0.027862 -0.005676 
+0.003044 0.009167 -0.018733 -0.006907 -0.004146 -0.010080 
+-0.023667 0.002726 0.004878 -0.009689 0.003164 0.005286 
+0.006659 -0.003232 0.001210 0.006341 0.005220 0.002236 
+-0.022560 -0.020209 0.032410 -0.025207 0.010592 0.006615 
+-0.006469 -0.027443 0.008912 -0.051313 -0.042317 0.016725 
+0.005120 -0.000271 0.002348 0.008874 0.014156 0.004873 
+0.004470 0.038377 -0.030714 0.060000 0.030000 0.000000 
+0.023752 0.003860 -0.005528 0.020966 -0.002237 0.001537 
+-0.005044 -0.020647 -0.034900 -0.041000 -0.006000 0.081000 
+0.005945 -0.031613 0.025248 0.005750 0.014719 -0.009398 
+0.000895 0.009019 -0.007867 -0.019130 -0.005707 0.014864 
+0.004275 -0.007250 0.015130 -0.009697 0.041771 -0.014582 
+-0.005270 -0.025975 0.006099 -0.020944 0.010089 -0.001528 
+0.038672 0.071963 0.004506 -0.005590 -0.014542 -0.057464 
+-0.010261 -0.014168 -0.025433 0.021353 0.016715 -0.012995 
+0.034474 -0.009005 0.001286 0.050958 -0.003983 0.005153 
+0.027670 -0.013839 0.027598 -0.006272 0.007840 0.110000 
+-0.088870 0.060058 0.054783 0.014088 0.004816 -0.028320 
+0.026551 -0.048221 -0.010807 0.031042 0.013728 -0.031903 
+0.018350 0.025717 -0.014941 0.014160 0.020904 -0.013405 
+0.015270 0.009167 -0.007545 0.006521 0.008267 -0.003832 
+-0.008132 0.013545 -0.009599 -0.001161 0.033130 -0.021629 
+0.013728 0.040534 -0.033633 0.014396 0.029134 -0.028678 
+0.015829 0.016057 -0.016316 0.001290 0.006621 -0.007274 
+-0.007146 0.004896 -0.002208 -0.000323 -0.002026 0.001450 
+-0.001107 -0.003075 0.002521 -0.004873 -0.004140 0.006228 
+-0.003265 -0.000898 0.003622 0.004168 0.001576 -0.004510 
+0.011559 0.007078 -0.009263 0.010103 0.006719 -0.003583 
+-0.000355 0.005781 0.001868 -0.000604 0.000086 -0.000247 
+-0.001997 -0.003336 0.000971 0.001091 -0.002409 0.000757 
+0.000942 -0.003494 0.000324 -0.003162 -0.003162 0.000000 
+-0.002334 -0.000828 -0.000753 0.002096 -0.002615 -0.001757 
+0.002805 -0.003208 0.000199 0.001676 -0.000583 0.001757 
+-0.000853 0.002290 -0.000352 -0.005029 0.005615 -0.002818 
+-0.005292 0.000133 -0.003530 0.001805 -0.003211 -0.000751 
+0.010756 0.002786 0.000186 0.008155 -0.002324 0.012516 
+0.005306 -0.002683 0.018815 0.002904 -0.002639 0.012021 
+-0.007551 -0.005546 0.009013 -0.018343 -0.014536 0.007372 
+-0.001023 0.002339 -0.000417 -0.018880 -0.002056 -0.022699 
+-0.041319 -0.004677 0.003947 -0.045350 -0.012082 0.032110 
+-0.006536 -0.001486 0.005743 0.008672 0.011801 0.009194 
+-0.004744 0.020641 0.007949 -0.009622 -0.002408 0.019218 
+0.004194 -0.000216 -0.000152 0.010663 0.000525 0.006356 
+0.025410 0.015109 -0.009385 0.032667 0.023833 -0.031250 
+0.010398 0.002888 0.021835 -0.027257 0.002068 -0.030147 
+0.005891 -0.081551 -0.071460 0.006671 -0.021273 -0.056643 
+0.001254 -0.009858 0.001766 0.005990 0.031538 -0.007188 
+-0.016190 -0.000952 0.020952 -0.023797 0.011049 0.016260 
+-0.018567 0.008381 0.005945 -0.024973 0.001824 -0.002475 
+-0.027561 0.015666 -0.009531 0.033264 0.050447 0.031597 
+0.011270 -0.045475 -0.016195 -0.011679 0.024036 -0.006842 
+0.003350 0.049597 -0.068418 0.014379 0.016418 -0.038057 
+-0.008699 -0.001179 0.001427 -0.025184 -0.014413 0.012486 
+0.003888 -0.024840 0.056460 0.000321 0.000578 -0.001066 
+-0.000026 0.000154 -0.000711 0.049687 0.005936 0.092438 
+-0.012343 0.014574 0.021466 -0.018166 0.000519 0.003633 
+0.016083 0.012057 -0.020100 0.015569 0.003896 -0.010735 
+-0.003146 -0.000975 0.001153 0.002399 0.006505 -0.002097 
+0.009469 0.008767 -0.001600 0.000419 0.005261 -0.000643 
+-0.008185 0.001919 -0.000340 -0.006890 -0.004108 0.003916 
+-0.005058 -0.003018 0.002888 -0.003408 0.006115 -0.002631 
+-0.003069 0.007141 -0.004781 -0.004613 -0.002337 0.001491 
+-0.004900 -0.013047 0.008503 -0.000170 -0.009648 0.006075 
+0.001062 -0.003322 0.002137 0.000412 -0.002587 0.002710 
+0.001763 -0.001951 0.000251 0.005652 0.002095 -0.000762 
+0.001303 0.002919 0.002535 0.002720 0.002842 0.003319 
+-0.001161 -0.001182 -0.000709 0.000946 -0.002875 0.000151 
+0.002467 -0.001194 -0.000491 0.001282 0.001303 -0.000162 
+-0.000785 0.001818 -0.000077 0.000059 0.000737 0.000855 
+0.000711 -0.000840 -0.000371 0.000738 -0.002374 -0.001350 
+-0.000364 -0.000154 -0.000561 -0.001144 0.002949 0.001941 
+0.004222 0.002970 0.000594 0.004662 0.003555 0.003713 
+-0.007094 0.004901 -0.003733 -0.002258 0.007092 -0.001127 
+0.012339 -0.005634 0.027567 1.838710 -1.048387 4.586021 
+2.007326 -0.989011 4.443223 1.779528 -0.862205 3.740157 
+0.011909 -0.008211 0.025275 0.000317 -0.012267 0.011110 
+-0.006942 -0.028996 0.020518 -0.002795 -0.020843 0.008048 
+-0.014733 0.039973 0.031551 -0.016914 0.025886 0.031857 
+0.004903 0.004711 0.017596 0.005048 0.006653 -0.019607 
+0.015484 0.024516 -0.014516 0.000000 0.000000 -0.016429 
+0.007455 -0.022858 -0.000938 0.010348 -0.013478 0.002435 
+0.007390 -0.013634 0.009735 0.014310 -0.010477 0.035812 
+0.020762 0.018174 0.044149 0.033018 -0.032485 -0.039763 
+0.017968 -0.030517 -0.053856 0.018113 -0.006329 0.005165 
+0.007143 -0.028571 0.014286 0.074800 -0.007400 0.036000 
+-0.005604 0.025495 -0.065824 -0.001732 0.018946 -0.021339 
+0.000440 0.028956 0.004493 -0.015210 0.058286 0.023264 
+0.005000 -0.012500 0.044167 0.012943 -0.012913 -0.003560 
+0.022555 -0.000122 -0.009510 0.066650 -0.017104 -0.023546 
+0.005046 -0.005755 -0.006166 -0.019218 -0.020906 0.025220 
+-0.015521 -0.014025 0.022217 -0.015635 -0.013247 0.020822 
+-0.022811 -0.021559 0.031543 -0.035348 -0.015822 0.017296 
+-0.043618 -0.013733 0.003253 -0.026528 -0.010844 -0.008644 
+-0.007482 -0.008170 -0.028573 0.015155 -0.014357 -0.011964 
+0.027607 -0.006274 -0.016940 0.024601 0.001200 -0.010988 
+0.003095 -0.005893 -0.000472 0.006380 -0.000136 -0.000203 
+0.008667 0.006511 0.001843 0.012831 0.014707 -0.005620 
+0.005114 0.011299 -0.011042 0.002230 0.002682 -0.003643 
+-0.001968 -0.004339 0.003444 -0.005686 -0.005726 0.004532 
+-0.003760 -0.000703 0.002948 -0.005023 -0.000162 0.001960 
+-0.003804 -0.003288 0.002499 0.001368 -0.001664 0.002124 
+0.006391 -0.000724 -0.003094 0.005073 -0.001814 -0.004481 
+0.002732 -0.001995 -0.002211 0.001825 -0.001769 0.000753 
+-0.000301 -0.000729 0.001888 -0.001001 0.001184 0.001363 
+0.002932 -0.003673 -0.002861 0.004943 -0.000595 -0.000736 
+0.003633 -0.000257 0.000195 0.001705 0.002106 0.000717 
+-0.000220 0.003214 0.000027 -0.000454 0.000280 -0.000230 
+0.000053 0.000476 -0.000401 -0.001669 0.000165 -0.002087 
+-0.004105 0.001750 -0.003145 -0.005907 -0.002064 -0.000851 
+-0.000382 0.000873 -0.000129 -0.005042 0.004461 -0.000242 
+0.007876 0.001053 -0.002194 -0.005309 0.002266 -0.010639 
+0.016590 -0.007928 0.032596 2.530909 -1.392727 5.160000 
+2.885196 -1.471299 5.812689 2.979310 -1.279310 5.624138 
+2.750000 -0.869792 4.411458 0.012716 -0.001849 0.025919 
+0.001618 -0.006236 0.011232 -0.005001 -0.038170 0.062663 
+0.067500 0.029167 0.115833 -0.015504 -0.004496 -0.002001 
+-0.006010 0.020505 0.007228 0.018227 0.008423 -0.024049 
+0.014061 0.003765 -0.016732 0.006131 -0.003502 -0.004524 
+0.008966 0.003748 -0.002915 0.018615 0.004874 -0.014870 
+0.010797 -0.007726 0.003308 0.010299 -0.008360 0.010472 
+0.005377 0.002775 -0.000638 0.013683 0.008321 -0.007207 
+0.014395 0.011109 0.000834 -0.000765 0.008500 0.003059 
+0.028684 -0.028574 0.033574 -0.125622 0.011014 0.050691 
+-0.001061 0.011953 -0.000894 -0.004534 -0.000471 0.002967 
+-0.027963 0.018009 0.004259 -0.029138 0.032503 0.033064 
+-0.007472 0.004380 -0.005412 -0.002650 0.002093 -0.003411 
+-0.004833 0.002778 -0.009667 0.024267 0.031330 -0.023095 
+0.000298 0.002693 -0.000456 -0.028347 -0.019640 0.029486 
+-0.016242 -0.015582 0.025139 -1.831731 -1.778846 2.548077 
+-2.269103 -2.245847 2.900332 -2.617162 -2.759076 3.155116 
+-2.682692 -2.975961 3.038461 -0.013286 -0.029174 0.015256 
+0.010124 0.018298 -0.049225 0.011200 0.050367 0.002320 
+-0.001702 0.010790 0.004814 0.000563 0.002245 -0.004718 
+-0.000921 -0.000670 0.000072 0.011508 0.004200 0.000083 
+0.016740 0.018321 -0.008682 0.007479 0.010918 -0.012254 
+-0.002686 0.006769 -0.010183 -0.001558 0.010505 -0.008875 
+-0.004886 0.005129 -0.003758 -0.004112 -0.000023 -0.002099 
+-0.003183 0.000424 -0.003694 -0.002192 0.002886 -0.004933 
+-0.003201 0.002651 -0.002069 -0.002043 0.001925 0.001851 
+0.001429 0.004470 0.002883 -0.001326 0.002732 0.002824 
+-0.000086 -0.001124 0.001379 -0.000024 -0.003338 -0.003075 
+-0.001833 -0.001055 -0.004202 0.000153 0.000020 -0.001610 
+-0.004310 -0.006500 0.003586 -0.002057 -0.005304 0.001191 
+0.000859 0.000423 0.000015 0.000647 0.005918 -0.000574 
+0.002144 0.006736 -0.003303 0.001972 0.004741 -0.001114 
+-0.002076 0.000969 -0.002472 -0.003470 0.002958 -0.003434 
+0.000184 0.005813 -0.005787 0.000397 0.001269 -0.000694 
+-0.000123 0.002064 -0.000222 -0.016001 0.011865 -0.008610 
+-0.012612 0.013764 -0.018595 0.006287 -0.004482 0.008334 
+2.008547 -1.132479 2.816239 2.827586 -1.641379 4.434483 
+3.342561 -1.788927 5.820069 3.461225 -1.453061 6.408163 
+2.973262 -0.764706 5.561497 0.021830 -0.002716 0.033770 
+0.006529 -0.002348 0.012234 -0.004848 -0.021821 0.006638 
+-0.015285 -0.005815 0.010282 -0.056068 0.015391 0.032982 
+-0.043529 -0.021448 0.038607 -0.012224 -0.019520 0.006020 
+0.001273 -0.004993 -0.003678 0.012851 0.013954 -0.000779 
+0.012389 0.010576 -0.015524 0.014071 0.009659 -0.027864 
+0.032235 0.001176 0.003176 0.019363 0.003086 0.008679 
+0.006350 0.003692 0.008639 0.000377 0.002118 -0.000692 
+-0.003888 0.011609 -0.015822 0.009690 -0.008644 -0.005229 
+0.136000 0.013000 0.000000 -0.036981 0.016809 0.002500 
+-0.030848 -0.013515 -0.014788 -0.001686 0.023098 -0.009765 
+-0.015783 0.019308 -0.025958 -0.000688 -0.004128 -0.010455 
+-0.027929 -0.001761 0.007883 -0.015635 -0.008822 0.012302 
+-0.007105 -0.007206 0.004862 -0.018010 -0.005313 0.007544 
+0.003817 0.038920 -0.013402 0.023083 0.048416 -0.030393 
+-0.015272 -0.006122 0.021383 -2.525000 -2.066667 3.362500 
+-2.902857 -2.671429 3.585714 -3.146974 -3.227666 3.654179 
+-3.251064 -3.714894 3.493617 -0.020500 -0.028565 0.017474 
+0.017761 0.040619 0.019146 0.026065 0.024862 0.054937 
+-0.008056 -0.020981 -0.000356 0.000895 0.000844 0.003162 
+0.013829 0.009178 0.002197 0.016371 0.014635 -0.009214 
+0.004344 0.001282 -0.002844 0.007540 0.000327 0.000559 
+0.011042 0.004666 -0.016952 0.010656 0.014844 -0.021031 
+0.005337 0.008409 -0.007530 -0.001865 0.001183 0.002050 
+-0.001958 -0.001378 0.003730 -0.001101 -0.000826 0.000000 
+-0.001868 0.000602 -0.000054 -0.003014 -0.000720 0.000422 
+-0.001211 0.000277 -0.000213 -0.000263 0.001495 -0.001010 
+-0.002941 0.000842 -0.002995 -0.002424 -0.002190 -0.003063 
+-0.000833 -0.002083 -0.001250 0.000551 -0.000919 -0.005521 
+-0.002611 -0.003126 0.004702 -0.000723 0.000051 0.000261 
+0.002999 0.003621 0.000231 0.003684 0.005567 -0.001113 
+0.004351 0.000722 -0.001271 0.001475 -0.002173 -0.001744 
+-0.000695 -0.001533 -0.001766 -0.000271 0.000188 0.000005 
+0.002929 -0.002945 -0.008916 0.006669 0.005484 0.001306 
+0.002848 0.002680 0.001622 -0.004201 0.015403 -0.014437 
+-0.012135 0.009634 -0.015670 0.002402 -0.002205 0.004282 
+1.478261 -1.323671 2.454106 2.434263 -1.796813 4.414342 
+2.952381 -1.761905 5.936508 2.850679 -1.162896 6.434389 
+2.204545 -0.289773 5.573864 0.022958 0.005302 0.031207 
+0.008326 0.001535 0.012559 -0.001654 -0.010047 -0.000594 
+-0.025926 -0.002700 0.013032 -0.002748 0.006985 0.023768 
+-0.002130 -0.018349 0.033093 0.003758 -0.044259 0.031185 
+-0.001846 -0.070000 -0.000615 0.008474 0.002251 -0.005376 
+0.012408 0.005881 0.002530 0.014825 0.002745 -0.017200 
+0.030729 0.005344 -0.025926 0.039833 0.009637 -0.025689 
+0.021250 0.000887 -0.015077 0.003567 0.000647 -0.006127 
+-0.004192 0.005855 0.005700 0.039905 0.028381 0.036810 
+-0.014718 0.016779 -0.026788 -0.027345 0.009651 -0.004444 
+-0.022892 0.000656 -0.010216 0.008193 -0.010251 -0.013215 
+0.033640 0.007529 -0.019838 0.020345 0.003750 -0.022888 
+0.005370 -0.015741 -0.005265 0.016992 -0.028469 0.009283 
+-0.003706 -0.008526 0.008147 -0.007872 0.005636 0.013004 
+0.019006 0.013610 -0.002241 0.000261 0.016738 -0.007161 
+-0.020233 -0.009092 0.033138 -2.986486 -2.441442 4.085586 
+-3.216667 -3.266667 4.043334 -3.548173 -3.933555 3.867110 
+-3.826271 -3.983051 3.330508 -3.077922 -2.480520 2.123377 
+-0.002015 0.001143 0.004413 0.026133 0.028479 -0.016013 
+-0.005752 -0.005033 0.027083 -0.013030 -0.011535 0.001207 
+0.009286 0.004897 0.000169 0.013695 0.010530 -0.005034 
+0.001722 0.000216 -0.001003 0.002448 -0.002362 0.000026 
+0.006527 0.000924 -0.008819 0.001443 0.002190 -0.008967 
+0.003745 0.002321 -0.004951 0.003638 -0.000940 -0.002544 
+0.001743 -0.002400 -0.001001 -0.000490 -0.000799 -0.000509 
+-0.005351 -0.006493 0.003495 0.002033 -0.002281 0.000548 
+0.000942 -0.000118 -0.006036 -0.002196 0.004906 -0.000608 
+-0.004458 0.002321 -0.002661 -0.003078 0.000385 -0.004088 
+-0.003307 0.000920 0.000183 -0.000385 0.001410 -0.008081 
+0.003672 0.002284 -0.001645 0.001481 0.001538 0.000262 
+-0.000319 0.001326 0.000480 0.000406 -0.000137 0.000009 
+0.001117 -0.001022 0.000387 -0.000435 -0.001121 -0.001630 
+-0.000879 -0.002211 -0.002624 0.001992 0.003068 -0.010268 
+0.002460 0.000606 -0.007634 0.000907 0.002094 0.000024 
+-0.003048 0.004116 -0.001993 -0.002997 0.008557 -0.005802 
+-0.004420 0.002539 -0.008952 0.003613 0.005476 -0.004775 
+0.004190 -0.001017 0.008701 0.007247 -0.002625 0.031309 
+1.346667 -1.193333 4.720000 1.403846 -0.647436 5.012821 
+0.018300 0.009922 0.035879 0.011124 0.006306 0.020867 
+-0.004828 0.002041 -0.005423 -0.005698 -0.000079 -0.009750 
+0.004538 -0.002458 0.008004 0.003627 -0.008409 0.007392 
+0.007610 -0.002709 0.007395 0.007232 0.002330 0.008711 
+0.008627 0.006192 0.014565 0.000426 0.003408 -0.020769 
+0.001474 0.000842 -0.006526 0.018874 0.008044 0.027542 
+0.021082 0.014589 -0.016729 0.008031 0.001510 -0.008061 
+0.010237 -0.000427 -0.005556 -0.010842 -0.001579 -0.002211 
+-0.008956 0.028454 0.017260 -0.018979 0.008479 -0.008609 
+-0.018856 0.015441 -0.006903 -0.000663 -0.021724 -0.003316 
+-0.032333 -0.002400 0.007200 -0.012005 0.007226 -0.007249 
+0.006120 0.020401 -0.013005 0.011301 -0.006411 -0.010423 
+0.017179 -0.000160 0.000783 0.015150 0.001922 -0.002344 
+0.025500 0.007000 -0.018500 0.018389 -0.002029 -0.007230 
+0.039316 0.060891 -0.049386 -0.004415 0.021368 0.006578 
+-0.022057 -0.006474 0.040137 -3.208333 -2.726191 4.666667 
+-3.741228 -3.710526 4.135965 -4.212121 -4.136364 3.678030 
+-4.241379 -3.923372 3.206897 -3.276995 -2.934272 2.380282 
+-0.008190 -0.010937 0.003408 0.040499 0.049388 -0.014783 
+0.016902 0.157778 -0.012493 -0.018643 0.000216 0.011839 
+0.004547 0.001295 0.000074 0.015299 0.011102 -0.003984 
+0.003883 0.004262 -0.005130 0.000606 -0.000852 -0.002361 
+-0.006866 0.000081 -0.000404 -0.006907 0.002015 0.002750 
+-0.001961 0.005169 0.000051 0.002628 0.005252 -0.000906 
+0.002078 0.002490 -0.000513 -0.000544 -0.000398 0.000729 
+-0.002215 -0.000588 0.004920 -0.003031 -0.000823 0.005178 
+0.000486 -0.000042 0.002390 -0.000467 0.001012 0.000275 
+-0.000909 0.001527 -0.001802 0.000604 0.002857 -0.003507 
+-0.000419 0.002498 -0.004342 -0.000154 0.002897 -0.004726 
+-0.001397 0.000444 -0.000063 0.003711 0.000979 -0.000567 
+0.003440 0.002091 -0.001187 0.003433 0.002786 0.003259 
+-0.000058 0.003435 0.001766 -0.000175 0.007814 -0.000753 
+0.005204 0.005902 -0.003873 0.000234 -0.001304 0.000059 
+-0.002787 0.000322 0.001608 -0.000187 -0.000298 -0.000163 
+-0.001296 -0.001888 -0.000366 -0.002211 -0.001657 -0.000168 
+-0.002082 0.000108 0.000253 -0.001915 0.001699 0.005474 
+-0.000610 0.003280 0.009006 -0.000645 0.003180 0.009533 
+0.000605 0.001506 0.007894 0.003182 0.000049 0.003485 
+-0.000285 -0.000120 -0.001046 -0.006841 0.001679 -0.008433 
+-0.008966 -0.005110 -0.019993 -0.010995 0.001970 -0.010175 
+0.007667 -0.009000 -0.005000 0.002414 0.000812 0.000013 
+-0.005678 0.002147 -0.001241 -0.010071 0.000753 -0.014353 
+-0.008159 0.008593 -0.036931 -0.019124 -0.005811 -0.025306 
+-0.025583 -0.008242 -0.006267 -0.016264 -0.012762 0.021062 
+-0.000599 0.013148 -0.055730 -0.024059 0.000957 -0.018912 
+0.097411 0.057768 -0.061071 0.023493 0.011752 -0.019822 
+-0.004389 -0.004987 0.001673 -0.013636 0.007813 -0.001302 
+-0.007037 0.013122 -0.015026 0.022339 0.004615 -0.037599 
+0.008591 0.004834 -0.019736 -0.042767 -0.022766 0.012567 
+-0.018025 -0.021349 -0.014385 -0.002548 0.000301 -0.010106 
+-0.000248 -0.000039 -0.000959 0.003794 0.004691 0.005499 
+0.001414 -0.004258 -0.016067 0.035041 -0.009054 -0.024071 
+0.005589 0.049262 -0.043572 0.005330 0.022211 0.005951 
+-0.012733 0.005437 0.025970 -0.035410 -0.008248 0.030914 
+-3.512820 -3.519231 3.724359 -3.820388 -3.936893 3.194175 
+-3.536170 -3.608511 2.697872 -2.554545 -2.472727 1.777273 
+-0.010008 -0.008392 0.006044 0.013268 0.003804 -0.010009 
+0.039217 0.000237 -0.048388 -0.059319 0.108147 -0.078891 
+0.100666 0.070851 -0.031066 0.023438 0.038357 -0.026317 
+0.001626 0.007172 -0.004844 0.000364 -0.001359 -0.000534 
+-0.003340 -0.001754 0.001295 -0.000899 -0.000899 0.006067 
+-0.006354 0.004151 0.007676 -0.002065 0.005773 0.007021 
+-0.001253 0.004143 0.001349 -0.000847 0.000449 -0.001594 
+0.001872 0.005615 -0.003303 0.006416 0.001825 -0.004093 
+0.002788 -0.001774 -0.004545 0.000206 -0.001853 -0.001338 
+-0.002322 -0.000688 0.000172 -0.003387 0.000808 0.000695 
+0.000215 0.002597 -0.002543 0.003594 0.003764 -0.004960 
+0.003273 0.007822 -0.001054 0.000128 0.005083 0.000457 
+-0.001144 0.002532 0.000754 0.000558 0.001624 0.001057 
+0.004031 0.003921 0.000813 0.006664 0.005689 -0.002616 
+0.002211 0.002100 -0.000126 -0.002597 -0.001947 -0.001468 
+-0.006576 -0.000514 0.000379 -0.006391 -0.004193 0.000186 
+0.001779 -0.007317 -0.000530 0.001886 -0.004050 -0.001235 
+-0.004547 -0.001774 -0.003869 -0.006037 -0.003518 -0.002876 
+-0.003256 -0.002117 -0.001999 0.000806 -0.000096 0.000482 
+0.001454 -0.000808 -0.001135 0.001793 -0.000123 -0.008414 
+-0.001396 0.001186 -0.009143 -0.002674 -0.002019 -0.005354 
+-0.015964 -0.012000 0.006291 -0.020773 -0.011089 0.009709 
+-0.012876 -0.021131 0.002863 -0.004649 -0.027154 0.013155 
+-0.019905 -0.039241 0.044573 -0.022381 0.017381 0.006190 
+-0.013690 0.011188 -0.008614 -0.007222 0.004321 -0.010418 
+-0.011487 0.003816 -0.010475 -0.003941 0.008539 -0.015547 
+0.004299 0.012482 -0.017343 0.009653 0.013295 -0.013509 
+0.007691 0.006120 -0.001829 0.014284 0.003851 0.005297 
+0.016479 -0.000319 -0.005564 0.018805 0.001538 -0.003582 
+0.000074 0.023533 -0.008624 0.010413 0.049716 -0.034570 
+-0.045484 -0.017056 0.009476 -0.005461 -0.035249 0.083654 
+-0.003192 -0.035625 0.014896 -0.008962 -0.012914 -0.006321 
+-0.008659 -0.010358 -0.001139 -0.010852 -0.008489 0.004565 
+-0.006593 -0.010719 -0.001993 -0.008720 -0.000196 -0.011970 
+0.034542 0.024653 -0.007179 0.017547 0.022613 -0.009341 
+-0.000300 0.005134 0.020728 -0.019945 -0.001860 0.033153 
+-0.031164 -0.003777 0.032495 -2.503937 -3.220472 2.866142 
+-2.348684 -2.736842 1.835526 -0.018888 -0.015158 0.014166 
+-0.012556 -0.011875 0.007264 -0.007010 -0.009214 0.002123 
+0.005011 -0.006815 -0.007745 0.025429 0.010428 -0.019074 
+0.064306 0.040790 -0.027823 0.027861 0.037456 -0.025543 
+0.010223 0.007670 -0.011181 0.003217 -0.004842 -0.007443 
+-0.001303 -0.004117 -0.005263 -0.001051 -0.000538 -0.001068 
+-0.004297 -0.002989 0.006538 -0.000953 -0.003335 0.008788 
+0.002893 -0.003765 0.006945 -0.000660 0.000660 0.009623 
+0.000000 0.002075 0.000000 0.001567 0.002126 0.001967 
+0.001026 -0.000127 0.000749 0.002920 0.001795 0.000484 
+0.003787 0.001167 -0.000559 0.005205 0.002377 -0.001419 
+0.006764 0.003665 -0.002043 0.004813 0.003639 -0.000748 
+0.004704 0.007992 -0.002883 0.004034 0.003417 0.000708 
+0.003039 0.002676 0.000749 0.004075 0.005671 -0.000980 
+0.001503 0.003607 -0.004008 0.001480 0.001787 0.000474 
+-0.001024 -0.002225 -0.001060 -0.006584 -0.002158 -0.004534 
+-0.004956 0.003866 -0.005004 -0.003606 0.004319 -0.000846 
+-0.000741 0.003679 0.001411 0.001413 -0.000024 0.000988 
+-0.004770 -0.004622 -0.004873 -0.009211 -0.006271 -0.004205 
+-0.004118 -0.003213 -0.008914 -0.003716 -0.002474 -0.010272 
+-0.002788 -0.001036 -0.007544 0.000098 0.000350 -0.007102 
+0.000811 0.003792 -0.008607 0.003266 0.002612 -0.001578 
+-0.001498 -0.004106 0.001401 -0.005456 0.000122 0.004767 
+-0.003497 -0.002075 -0.004938 -0.005900 -0.005031 0.001560 
+0.003278 -0.000073 0.006443 0.007586 -0.002632 0.014474 
+-0.003101 0.000986 0.000521 0.004185 0.019226 -0.001938 
+0.006462 0.018190 -0.003701 0.008351 0.008734 -0.004315 
+0.004057 -0.003142 -0.000949 -0.002000 -0.004352 -0.000218 
+-0.003377 -0.004116 -0.001956 -0.004627 -0.006970 -0.000937 
+-0.013715 0.000744 -0.001855 -0.001494 -0.000626 0.000789 
+0.002382 -0.001444 0.000292 0.001379 -0.001744 0.002790 
+0.012237 -0.002070 0.006653 0.024053 0.015501 -0.002506 
+0.031103 0.024698 0.005922 0.030430 0.008876 -0.007896 
+0.007132 0.004250 -0.004343 -0.000315 0.005200 0.001899 
+-0.009590 0.005133 -0.007305 -0.013773 -0.005715 -0.017680 
+-0.020208 -0.010810 -0.048728 -0.006480 0.004602 -0.023263 
+0.001798 0.001587 0.007399 -0.008304 -0.001332 0.016081 
+-0.018946 0.003151 0.011405 -0.026878 0.001107 0.014681 
+-0.022236 -0.010341 0.014083 -0.011479 -0.008132 0.004313 
+-0.004029 -0.004775 0.001869 0.000236 -0.001473 0.000056 
+0.002370 0.003906 0.000057 0.004514 0.005297 0.000562 
+0.005125 0.001131 -0.003546 0.004267 0.011651 -0.007145 
+0.011545 0.013350 -0.004549 0.015157 0.006902 -0.004956 
+0.011452 -0.000046 -0.005770 0.003850 -0.002753 -0.005009 
+-0.003070 -0.004488 -0.001134 -0.003363 -0.004364 0.004964 
+-0.000585 -0.001687 0.006371 -0.001055 0.001055 0.004220 
+-0.000231 0.000202 -0.000426 0.000132 0.005109 -0.000764 
+-0.001079 0.003492 -0.002413 -0.000895 0.000302 0.001477 
+0.003550 0.000246 0.000551 0.005598 -0.000878 0.001242 
+0.005437 -0.001068 0.000097 0.001186 0.000209 -0.002096 
+-0.000214 -0.000179 -0.000131 0.001110 0.001701 0.000746 
+0.002219 0.003069 0.000142 -0.001079 0.002780 0.000462 
+-0.000212 0.002439 -0.000288 0.003244 0.002168 0.000359 
+0.003828 -0.000147 -0.000956 0.002660 -0.000804 -0.001921 
+0.001195 0.000387 -0.002233 -0.000922 0.002940 -0.001892 
+-0.001373 0.001496 -0.000901 0.001628 -0.003996 -0.000309 
+-0.000876 -0.011059 -0.005369 -0.002795 0.000461 0.000935 
+0.015284 0.002432 0.002435 0.011936 -0.005751 -0.007475 
+0.005033 0.000648 0.000415 0.001165 -0.005213 0.005950 
+0.004430 -0.004353 0.003364 -0.007885 -0.005157 -0.004386 
+-0.001424 -0.008622 0.001678 -0.005406 -0.004210 -0.010890 
+-0.005118 -0.007601 0.002126 0.000122 -0.004198 0.000524 
+0.004946 -0.005954 0.004390 -0.002655 -0.016737 0.010752 
+0.004709 -0.033581 -0.003206 -0.018179 -0.001819 -0.002070 
+-0.024611 -0.003835 0.002996 -0.019425 -0.001721 0.003729 
+-0.014862 -0.000009 0.001648 -0.009860 0.004137 0.000924 
+-0.001083 -0.001990 -0.001213 -0.007856 -0.009712 0.006154 
+-0.002929 -0.004205 0.006435 -0.004701 -0.005184 0.009724 
+-0.002600 -0.003769 0.013225 -0.009308 -0.004055 0.006797 
+-0.001894 -0.001279 -0.002141 -0.002092 0.007157 -0.004129 
+0.013615 0.004944 -0.000087 0.014106 -0.001453 -0.009058 
+0.002905 -0.000788 -0.004185 0.000664 0.001610 -0.000752 
+-0.002778 0.005047 -0.005232 -0.002870 -0.003438 -0.005727 
+-0.002266 -0.003141 -0.004573 0.002944 0.005035 -0.001618 
+0.010945 0.013633 0.007090 0.011578 0.013401 0.003041 
+0.011446 0.006608 -0.001708 0.009661 -0.001736 -0.002341 
+0.002602 -0.005972 -0.005137 -0.006797 -0.005178 0.000094 
+-0.008100 -0.003716 -0.000702 -0.003922 0.000418 -0.000125 
+0.001856 0.003402 -0.000742 0.004684 0.005196 -0.001319 
+0.003924 0.002669 -0.000827 0.002430 -0.000372 -0.001346 
+0.006055 -0.000530 -0.002169 0.011180 0.002912 -0.003223 
+0.011316 -0.001106 -0.005301 0.006205 -0.003063 -0.006939 
+0.002037 -0.000276 -0.002155 0.000029 0.003585 0.001997 
+0.000664 0.005050 0.002595 0.002004 0.002811 0.001921 
+-0.000170 0.000277 -0.000006 -0.000220 0.001849 -0.001255 
+0.001286 0.005238 0.000429 0.001109 0.003572 0.004047 
+-0.000536 0.003478 0.003448 -0.000295 0.002488 0.001407 
+0.000267 -0.001224 -0.000669 0.000355 -0.003289 -0.000891 
+-0.000738 0.000442 -0.000280 0.002706 -0.002640 0.000066 
+0.007039 -0.002987 0.003022 0.002066 -0.005151 0.001076 
+0.006046 0.000002 -0.001679 0.005267 0.003585 -0.000500 
+0.002671 0.005723 -0.007086 0.003201 -0.000619 0.002019 
+0.007328 0.005678 0.001019 0.005725 0.004305 0.003616 
+0.002680 0.005727 0.001437 -0.003589 0.004393 -0.004710 
+-0.036676 -0.015629 -0.026961 0.031942 -0.000861 -0.009659 
+0.012645 -0.005576 0.067336 -0.003064 0.007877 0.011668 
+-0.006572 0.006431 0.001015 -0.000339 -0.000148 -0.003469 
+0.001471 0.002822 -0.003285 0.000338 0.000300 0.000471 
+-0.002148 0.002990 0.000203 -0.005351 -0.003779 -0.001809 
+-0.003077 0.001554 -0.004218 0.004740 -0.000812 -0.003251 
+0.004667 -0.000334 -0.004009 -0.000458 0.000750 -0.003659 
+-0.001442 -0.002222 -0.005974 -0.000449 -0.014872 -0.008846 
+0.004023 -0.003739 -0.009173 0.022582 0.010185 -0.018299 
+0.014733 0.004382 -0.007439 0.005096 0.002557 0.002777 
+0.000691 0.004959 0.007088 0.013185 0.001738 0.004225 
+0.007848 -0.003709 0.002100 -0.003786 0.002857 0.001500 
+-0.007859 -0.004328 0.009343 -0.006363 -0.005975 0.002434 
+0.001453 0.000701 0.005863 0.006096 0.001783 0.002336 
+0.007377 0.001668 0.002089 0.009404 0.005057 -0.001501 
+0.008561 0.010773 0.000558 0.007390 0.007467 0.001379 
+0.001215 0.001311 0.003070 0.000447 0.000099 0.000292 
+-0.000400 -0.006892 0.000934 -0.005176 -0.004176 -0.000765 
+-0.007599 0.004576 -0.014138 0.004926 0.010541 -0.024516 
+0.015595 0.004832 -0.018256 0.017285 0.002639 -0.009326 
+0.013980 0.004748 -0.004053 0.007902 0.005137 -0.001186 
+0.003490 0.004281 -0.004659 0.004312 0.004127 -0.001660 
+0.006062 -0.003845 -0.000535 0.001682 -0.006509 -0.000331 
+-0.000453 0.000176 0.000040 0.004904 0.007739 0.001533 
+0.009692 0.007516 0.003042 0.008434 0.003241 0.001293 
+0.002097 0.006378 -0.004555 0.007048 0.006910 -0.003274 
+0.013061 0.005462 -0.008575 0.012211 0.004394 -0.007328 
+0.005597 0.002350 -0.002119 -0.000983 0.000015 0.000685 
+-0.003355 -0.000851 0.000932 -0.002634 0.000869 0.000308 
+-0.000408 0.002259 0.000823 0.000289 0.002627 0.001572 
+-0.000408 0.003659 0.001663 -0.001947 0.006672 -0.003428 
+-0.002953 0.004038 -0.005425 0.002533 0.010000 -0.007600 
+-0.002676 -0.003070 -0.004057 0.003023 -0.005971 -0.010718 
+0.003910 -0.006529 -0.009450 0.006058 0.000967 -0.011777 
+0.000219 0.004521 -0.001650 0.000296 0.002489 0.000240 
+0.002347 0.002709 -0.001823 0.000414 0.001923 0.000771 
+0.002435 -0.000446 0.000377 0.005091 -0.002296 0.001712 
+0.005366 -0.002748 0.004090 -0.002143 -0.004945 0.009104 
+-0.003402 -0.001021 -0.003856 -0.004163 0.003098 -0.008821 
+-0.012979 -0.001038 0.006852 -0.004877 0.009078 0.003214 
+-0.006774 0.000561 -0.004183 -0.008722 -0.002022 0.003918 
+0.004251 -0.004880 0.004089 0.015372 -0.017408 -0.003129 
+0.005355 -0.000428 0.001927 0.000854 0.008564 -0.005501 
+-0.008556 0.006813 -0.006613 0.000953 0.004055 -0.000991 
+-0.003976 0.000401 -0.016830 -0.001367 0.007150 -0.000053 
+0.003279 0.017427 -0.002566 0.018664 0.024001 -0.017133 
+0.033598 0.023188 -0.018408 0.034500 0.023000 -0.011500 
+0.032389 -0.001194 -0.013194 0.033446 -0.002018 -0.028371 
+0.047179 0.014403 -0.001244 -0.046267 0.005117 -0.021921 
+-0.036784 0.012502 -0.032531 -0.019881 0.000746 -0.028396 
+0.019080 0.012735 -0.007380 0.016503 0.013365 -0.004414 
+0.011160 0.002104 -0.003339 0.003783 -0.011627 -0.003024 
+-0.002539 -0.002598 -0.002844 0.007028 0.002371 0.004858 
+0.020838 0.000940 0.005798 0.023919 0.004806 -0.007484 
+0.001257 0.000782 -0.005248 -0.008432 -0.012409 -0.002508 
+-0.000397 0.000029 -0.005361 -0.005555 -0.001648 -0.006737 
+-0.002470 -0.004946 -0.008478 -0.000626 -0.004263 -0.010824 
+-0.002076 -0.000519 -0.006863 -0.005170 0.003639 0.002483 
+-0.013402 -0.002788 0.001471 -0.008084 0.000504 -0.005557 
+0.001357 0.009635 -0.007661 0.006213 0.012126 -0.001428 
+0.008461 0.004833 0.000055 0.003402 -0.002065 -0.000562 
+-0.000454 -0.004250 -0.000429 -0.001329 -0.000960 -0.000137 
+-0.000204 0.001527 0.000282 0.002005 0.001650 0.000603 
+0.006168 0.001363 0.000629 0.011457 -0.000303 -0.001136 
+0.009523 -0.004689 -0.007348 0.007257 0.003650 -0.001806 
+-0.002246 0.001508 0.002157 -0.004296 0.000741 0.002815 
+-0.001469 -0.000730 -0.000078 -0.001414 -0.003418 -0.002604 
+-0.003044 -0.004094 -0.004087 -0.008000 -0.005263 -0.002632 
+-0.001116 -0.000291 0.008439 -0.001554 0.001036 0.004851 
+-0.001562 0.001818 0.003892 -0.001600 0.006277 0.004339 
+0.002147 -0.000114 -0.003653 -0.000811 -0.000164 -0.005892 
+-0.000248 -0.000627 -0.004212 0.000362 0.000329 -0.006611 
+-0.001526 0.004929 -0.010125 -0.001304 0.007350 -0.001867 
+0.003319 0.002587 0.001237 0.000654 0.002636 0.002307 
+0.001550 -0.000547 -0.000195 0.004958 -0.003259 -0.002517 
+0.008024 -0.000719 0.000099 0.006935 0.001028 0.000017 
+0.000253 0.005766 -0.003389 -0.003121 0.008358 -0.004794 
+-0.010875 -0.000075 0.004330 -0.009898 -0.014770 0.013921 
+-0.001036 -0.004811 0.005999 0.001413 0.005870 -0.009045 
+0.002289 0.004826 -0.016242 0.002431 -0.002403 -0.010778 
+-0.001112 -0.000379 -0.003856 -0.015812 -0.005959 -0.001118 
+-0.020330 0.007726 -0.013859 -0.015078 -0.000932 -0.003278 
+-0.001190 0.006068 -0.000405 0.005844 0.017349 0.002342 
+0.006039 0.019408 0.006790 0.000257 0.020586 -0.017562 
+0.041176 0.033411 -0.020560 0.024249 0.004108 -0.013987 
+0.003717 -0.011794 0.015761 0.015582 -0.007818 0.016059 
+0.057070 0.008757 -0.006371 -0.085890 -0.005287 -0.056741 
+0.010061 0.006372 -0.101616 -0.027504 0.012061 -0.072142 
+-0.035926 0.027407 0.004510 -0.056230 0.021088 0.010272 
+0.000000 -0.004091 -0.008182 0.005528 0.042004 -0.039886 
+0.017158 0.052323 -0.121441 -0.000718 -0.007953 -0.009282 
+-0.060450 -0.025582 -0.018836 -0.033617 -0.008793 0.061026 
+0.007357 0.009683 0.004302 0.006363 0.016761 0.002943 
+0.010754 0.006935 0.003663 -0.004583 0.005103 0.006464 
+-0.018445 0.001328 0.004332 -0.015080 -0.001622 0.006112 
+-0.007863 0.000942 0.006558 -0.005077 -0.000985 0.005693 
+-0.002794 0.001093 0.008636 0.010871 0.003116 0.001621 
+0.014891 0.010832 -0.007393 0.008200 0.007348 -0.003445 
+0.001385 0.001717 -0.000835 -0.001610 0.002034 -0.000472 
+-0.001365 0.001442 -0.000080 -0.002708 -0.003309 -0.000526 
+-0.005362 -0.007676 -0.001802 -0.007215 -0.009927 -0.003685 
+-0.008098 -0.010986 -0.005311 -0.008471 -0.009833 -0.005358 
+-0.008531 -0.004455 -0.000837 -0.005113 0.003524 0.007604 
+0.001198 0.003860 -0.001043 0.008267 0.009983 0.001701 
+0.008349 0.005838 -0.000435 0.003970 0.003982 0.000607 
+0.001976 0.004483 0.000336 0.002256 0.003299 -0.002506 
+0.000071 0.000941 0.001366 0.002357 -0.000811 0.001221 
+-0.000220 -0.000916 -0.001744 -0.004614 -0.003982 -0.001345 
+0.005746 0.001874 -0.005260 0.003683 0.002634 -0.002074 
+0.003214 0.003572 0.001009 0.001179 0.001528 0.001534 
+-0.002007 0.000314 -0.001358 -0.004296 0.001134 -0.004014 
+-0.006070 0.001734 -0.004581 -0.008380 0.001757 -0.003765 
+-0.009130 0.001384 -0.004379 -0.001153 0.001939 -0.012699 
+-0.002461 -0.007506 0.016507 0.022914 -0.020304 0.068017 
+0.022526 0.001501 0.001699 -0.003169 0.033212 -0.051031 
+-0.014262 0.045072 -0.008960 0.002722 -0.016501 0.003981 
+0.053273 0.011390 -0.023181 0.066133 0.029689 -0.048964 
+0.002040 -0.013016 0.041495 -0.010217 -0.017793 0.018170 
+-0.001918 0.027148 0.015934 -0.020434 0.059425 0.010726 
+-0.036429 0.095000 -0.036429 -0.017827 -0.018572 -0.014499 
+-0.008000 -0.002896 -0.002917 0.002003 0.009958 -0.003985 
+0.006990 0.010240 -0.005942 -0.002486 0.015850 -0.014701 
+0.052732 0.032454 -0.045669 0.007327 0.004330 -0.012396 
+-0.013007 -0.013382 0.019445 -0.015813 -0.022428 0.024167 
+-0.016998 -0.030370 0.032496 -0.012268 -0.030970 0.040966 
+-0.004743 -0.016729 0.035024 0.060812 0.021706 -0.040440 
+0.021436 0.024404 -0.048923 0.006577 0.009032 -0.009525 
+0.005532 0.004206 -0.003940 0.027599 0.019848 -0.027503 
+0.061677 0.056744 -0.078941 -0.027183 -0.013940 0.048092 
+-0.026462 -0.033669 0.074552 0.049472 -0.028259 0.068441 
+0.010273 -0.016212 0.018393 -0.002334 0.001818 -0.003700 
+0.000542 0.003572 -0.004260 0.003566 0.003863 -0.023278 
+0.017920 0.022770 -0.015563 0.006165 0.006150 -0.006379 
+-0.001083 -0.007520 -0.002244 0.009630 -0.009468 -0.009027 
+0.022465 -0.011875 -0.022240 0.026029 -0.000348 0.009022 
+0.002671 0.014096 0.030451 -0.006281 -0.005162 0.012738 
+-0.006992 0.003199 -0.009924 0.000699 0.010256 -0.010502 
+0.005390 0.005033 -0.001305 -0.002835 -0.005502 0.000568 
+-0.014200 -0.010458 -0.005723 -0.018751 -0.010815 -0.007215 
+-0.015729 -0.012771 -0.006082 -0.012423 -0.014882 -0.006021 
+-0.012504 -0.015758 -0.005811 -0.012674 -0.012734 -0.004736 
+-0.006674 -0.004760 -0.002936 0.005125 0.000082 -0.005353 
+0.008317 0.003684 -0.013345 0.010272 0.007237 -0.009606 
+0.008604 0.003020 -0.002704 0.006856 -0.000805 -0.002279 
+0.003386 -0.000046 -0.002818 0.000734 0.000062 -0.001300 
+0.002687 0.000080 -0.002446 0.002761 0.006474 -0.005431 
+0.015352 0.000138 -0.017250 0.009056 -0.001077 -0.008739 
+0.002184 -0.000674 -0.001419 -0.001030 0.001253 0.002063 
+-0.000542 0.002137 0.004503 0.000804 0.002085 0.006152 
+-0.002172 0.001838 0.001410 -0.008834 0.003747 -0.018250 
+-0.006893 0.008874 -0.009671 -0.002857 0.002857 -0.002857 
+-0.015372 -0.033650 -0.000605 0.043697 -0.102857 0.010924 
+-0.056162 -0.029201 0.096231 -0.013425 0.016161 -0.016342 
+0.006391 -0.000720 0.006144 0.013190 0.006559 -0.001850 
+0.023643 0.027042 -0.019201 0.036574 0.037990 -0.024726 
+-0.090006 -0.022335 0.037041 -0.024183 0.007659 0.010075 
+-0.015420 -0.004789 0.017634 -0.012776 0.001642 0.000192 
+-0.013742 0.005129 -0.010659 -0.025759 0.000199 -0.006541 
+-0.014810 0.001573 -0.000604 0.009823 -0.005544 -0.005536 
+0.007994 -0.006108 -0.004161 0.009837 0.000521 0.002620 
+0.009664 0.003308 -0.021721 -0.002288 0.012785 0.003620 
+-0.017697 -0.015054 0.033843 -1.995238 -2.480952 4.000000 
+-2.052632 -2.887719 4.119298 -2.078652 -2.865169 3.790262 
+-1.660920 -2.120690 2.672414 -0.002526 -0.002354 0.002088 
+0.009777 0.007311 -0.012417 0.003498 -0.002541 0.001595 
+-0.000849 -0.008747 0.005396 0.002462 0.003002 -0.000062 
+-0.001450 0.012012 -0.017724 -0.015194 0.007418 -0.008587 
+-0.021585 -0.021642 0.032923 -0.013143 -0.029221 0.033538 
+-0.006379 -0.024987 0.028541 -0.008593 -0.071713 0.014281 
+-0.654150 -0.056235 0.725283 0.006869 0.037474 -0.032646 
+0.001112 0.014673 -0.002010 0.003262 0.002322 0.007651 
+0.005573 -0.007595 0.007891 -0.000681 0.001923 -0.002483 
+-0.013956 -0.046250 -0.026361 0.054093 -0.070985 -0.023052 
+-0.019104 -0.015800 0.007783 -0.011805 0.045767 0.005102 
+0.009941 0.000846 -0.031091 0.009119 0.023201 -0.039436 
+0.019709 0.011064 0.003155 0.006403 0.008674 -0.000162 
+-0.004982 -0.000079 -0.006408 -0.013117 -0.009476 -0.009370 
+-0.020079 -0.017396 -0.007793 -2.211640 -2.195767 -1.386243 
+-2.450867 -2.352601 -1.341040 -0.025061 -0.021792 -0.008577 
+-0.023012 -0.014707 -0.007111 -0.017479 -0.010222 -0.005223 
+-0.008671 -0.006997 -0.005027 0.002234 -0.000067 -0.004690 
+0.006354 0.011722 -0.002160 0.009107 0.010706 0.002535 
+0.008766 0.006031 -0.000386 0.001941 0.000346 -0.001328 
+-0.001601 -0.002841 -0.000485 0.000657 -0.002037 -0.002672 
+0.018931 0.016196 -0.070079 0.019702 0.004685 -0.048715 
+0.006696 -0.002181 -0.024117 -0.000477 -0.002335 -0.009910 
+0.010494 -0.003001 -0.008163 0.017586 0.000874 -0.005513 
+-0.020562 -0.014943 0.021700 -0.047201 -0.056767 0.033911 
+-0.058606 -0.036061 0.090182 -0.011587 0.035159 0.014683 
+0.022484 0.012176 0.000144 -0.003077 0.018345 -0.014414 
+-0.024229 0.009618 0.021979 0.021742 -0.016801 -0.026151 
+0.019404 -0.000398 -0.009525 -0.000559 0.003256 -0.003427 
+-0.013261 0.006957 -0.006957 -0.008326 0.018453 -0.018185 
+-0.002473 0.022716 -0.028662 -0.014322 0.017182 -0.011951 
+-0.021966 0.009442 0.004871 -0.014401 0.008895 0.000922 
+-0.008323 0.004375 -0.005850 -0.001863 0.002198 -0.009774 
+0.001034 0.004245 -0.007967 0.000376 0.001789 -0.001653 
+-0.000128 0.003582 -0.001946 0.008390 0.010590 -0.008345 
+0.013601 0.015047 0.002062 0.013349 0.026362 -0.032389 
+-0.017520 -0.013511 0.025821 -2.052083 -3.072917 4.604167 
+-2.228956 -3.286195 4.457912 -2.319620 -3.237342 4.056962 
+-2.093117 -2.825911 3.255061 -0.009327 -0.018430 0.016283 
+-0.000944 -0.002944 -0.003422 0.004115 -0.002387 -0.007939 
+-0.003532 0.001902 -0.002650 -0.009595 0.000105 -0.004216 
+-0.007140 0.004950 -0.005098 -0.003653 0.001295 -0.000459 
+-0.003721 -0.003084 0.002718 -0.003045 -0.005118 0.000480 
+-0.005230 -0.004574 -0.000740 -0.006912 0.002839 -0.013139 
+0.023825 -0.010490 0.026969 0.019463 -0.007311 -0.003749 
+0.019564 0.032046 -0.030076 0.025555 0.006002 -0.012056 
+0.003200 -0.002277 -0.002910 0.000451 0.005977 0.003448 
+0.008261 0.033976 0.006555 0.031667 0.038333 -0.011667 
+0.026864 0.023277 0.011399 0.027230 -0.000880 -0.016359 
+0.023476 0.003617 0.015585 0.024615 -0.008077 -0.041154 
+0.055561 0.064189 0.005602 0.006248 0.013767 -0.001399 
+-0.003299 0.000232 -0.007116 -0.012422 -0.009663 -0.008245 
+-0.021606 -0.017173 -0.007831 -2.753846 -2.246154 -0.743590 
+-3.089286 -2.500000 -0.477679 -3.130631 -2.630631 -0.243243 
+-2.928934 -2.619289 -0.218274 -0.025959 -0.023299 -0.005387 
+-0.020879 -0.019462 -0.006228 -0.015005 -0.012601 -0.004840 
+-0.006185 -0.004634 -0.001686 0.001921 0.004730 -0.003918 
+0.005052 0.014079 -0.001654 0.009098 0.012607 -0.000999 
+0.006876 0.007093 -0.002515 0.002078 0.003026 0.000071 
+0.014229 -0.001685 -0.001918 -0.001818 -0.000071 0.001702 
+-0.046358 -0.019297 0.034691 -0.060832 -0.012297 0.034931 
+-0.027964 0.007095 -0.009286 0.004408 0.063499 0.007989 
+0.019236 0.050230 -0.023689 0.004204 0.006667 0.004729 
+-0.006220 0.004325 0.011832 0.007500 0.015417 0.060417 
+-0.047400 0.019000 0.142200 -0.009276 -0.002395 0.023503 
+0.004139 -0.014431 0.019214 -0.007940 -0.012853 0.002004 
+0.006264 0.004501 -0.010674 0.004195 0.007019 -0.010484 
+0.001558 0.009832 -0.009070 -0.001805 0.013303 -0.014759 
+0.000431 0.022168 -0.026177 0.007720 0.029332 -0.031437 
+0.009961 0.024655 -0.024405 0.002753 0.018107 -0.018319 
+-0.000479 0.010927 -0.017413 0.004412 0.013144 -0.008089 
+0.003872 0.006642 -0.011038 0.000734 0.004448 -0.007262 
+0.003955 0.006733 -0.010182 -0.005244 -0.002451 -0.010459 
+-0.009832 0.003443 -0.016219 -0.004605 0.004706 -0.007987 
+-0.006906 -0.017947 0.029003 -2.335526 -3.986842 5.118421 
+-2.450450 -4.279279 5.328829 -2.386719 -4.085938 4.820312 
+-1.987069 -3.538793 3.754310 -0.008518 -0.022696 0.018413 
+0.008125 -0.001401 -0.010218 0.015422 0.015430 -0.029993 
+0.005059 0.006238 -0.012760 -0.001159 -0.000171 0.006026 
+-0.000490 0.001411 0.000691 0.002440 0.001975 0.002971 
+-0.000317 0.009206 -0.000200 0.000896 0.017455 -0.007987 
+-0.000523 0.018074 -0.018155 -0.001913 0.008192 -0.016753 
+-0.008836 -0.001081 -0.001173 -0.009173 -0.014744 0.009762 
+0.001185 -0.007957 0.001508 0.000778 0.005947 0.007562 
+-0.011683 0.000555 0.003490 -0.022715 0.000903 0.013989 
+0.002277 0.027615 -0.019713 0.003704 0.067593 -0.074074 
+0.034712 0.029179 0.002501 0.037329 0.035110 -0.026972 
+0.021717 0.017083 -0.053567 0.047826 0.016304 -0.038587 
+0.033547 0.023767 0.025253 0.032872 0.024898 0.005926 
+0.010512 0.010465 -0.002669 -0.006848 0.000791 -0.005912 
+-0.018369 -0.006519 -0.008272 -0.026867 -0.016781 -0.007086 
+-3.206349 -2.507936 -0.497355 -3.521739 -2.834783 -0.282609 
+-3.475410 -2.926229 -0.102459 -3.141593 -2.858407 0.092920 
+-2.563158 -2.578947 0.110526 -0.017950 -0.020386 -0.001006 
+-0.008962 -0.013212 -0.001175 -0.001898 -0.003337 0.000538 
+0.000256 0.005412 0.000183 0.003107 0.003604 -0.000385 
+0.006644 -0.000656 -0.002218 0.007549 -0.000815 -0.000395 
+0.005981 0.018000 -0.006479 -0.041735 -0.028959 0.015224 
+-0.005333 -0.009333 -0.014667 -0.006190 -0.006190 0.006190 
+-0.019298 0.034211 0.030702 -0.028095 0.071952 -0.031524 
+0.018000 0.036000 -0.033846 0.009375 -0.001129 -0.015812 
+-0.037541 0.013250 0.003077 -0.112273 -0.039182 -0.005273 
+-0.028123 0.037516 -0.011304 -0.005474 0.003568 0.010525 
+0.002694 -0.008056 0.008083 0.000726 -0.004321 0.002431 
+0.002578 -0.001598 -0.008959 0.000841 0.002308 -0.002795 
+-0.003139 0.006315 -0.002449 -0.002953 0.014124 -0.009475 
+0.006031 0.021078 -0.023503 0.006438 0.019011 -0.030804 
+0.006443 0.018031 -0.023055 0.005142 0.014790 -0.013755 
+-0.000738 0.008441 -0.009641 0.001262 0.001921 -0.006952 
+0.000843 0.005378 -0.003896 0.003882 0.005758 -0.008579 
+-0.002265 0.007161 -0.013027 -0.003111 0.006373 -0.016567 
+-0.001438 0.006472 -0.018383 -0.002383 0.005437 -0.007429 
+-0.012576 -0.007687 0.013006 -2.529412 -3.323529 4.509804 
+-2.848485 -4.666667 5.590909 -2.450980 -4.647059 5.071896 
+-1.622378 -3.727273 3.573426 -0.000227 -0.015791 0.010452 
+0.014410 0.009334 -0.017076 0.009709 0.021284 -0.030114 
+0.013135 0.004378 -0.007297 0.009690 0.006533 0.000067 
+0.005655 0.003974 -0.000973 -0.001735 -0.001290 0.001073 
+-0.006140 -0.001260 0.002613 -0.003292 0.001750 -0.000014 
+-0.003457 0.005694 -0.005135 -0.006798 0.004976 -0.006741 
+-0.005456 0.005245 -0.006203 -0.000614 0.007306 -0.005835 
+-0.001388 0.006260 -0.006184 0.004220 0.012172 -0.006284 
+0.001386 0.017894 -0.011413 0.000778 -0.013698 0.011270 
+-0.015294 -0.039351 0.017489 -0.005408 -0.022959 0.020204 
+-0.022083 -0.009583 -0.007917 -0.007643 -0.012926 0.008880 
+-0.000186 -0.009625 0.021331 0.002769 -0.018923 0.008308 
+0.004244 -0.016824 -0.000091 0.099632 0.069338 -0.070588 
+0.041342 0.084155 -0.054177 0.010550 0.023228 -0.016324 
+-0.004886 0.000474 -0.005219 -0.020528 -0.013634 -0.002524 
+-0.032253 -0.023768 -0.000701 -3.532164 -2.976608 0.023392 
+-3.440758 -3.061611 0.151659 -3.237885 -3.057269 0.202643 
+-3.111628 -3.046512 0.274419 -2.939891 -2.923497 0.398907 
+-0.021890 -0.024093 0.007929 -0.006440 -0.009515 0.005499 
+-0.000718 0.000616 -0.004804 0.019072 0.004769 0.003696 
+0.018971 0.003433 0.001452 0.011264 -0.001811 0.001424 
+0.013886 0.009711 0.005859 0.064426 0.010700 0.023585 
+0.058571 0.005835 0.004774 -0.006429 -0.003049 -0.002439 
+-0.077460 -0.005794 0.032937 -0.048205 0.025641 0.030513 
+0.004385 0.089000 -0.002923 -0.000266 0.019734 -0.032446 
+-0.049273 -0.114727 -0.021818 -0.051784 0.038175 0.081142 
+-0.005449 0.005069 0.020445 0.006123 -0.002178 -0.002895 
+0.021880 0.007501 -0.018292 0.005719 -0.002059 -0.008860 
+0.000854 -0.001784 -0.000577 0.002921 0.000788 -0.000801 
+0.000393 0.001321 -0.004279 0.003657 0.006637 -0.007572 
+-0.001715 0.005365 0.000144 0.006685 0.013198 -0.017655 
+0.000686 0.008677 0.000634 -0.002692 -0.001821 -0.007487 
+0.001635 -0.001090 -0.008889 0.004016 -0.000378 0.001274 
+0.000950 -0.000040 -0.000097 -0.001900 -0.002670 0.001688 
+0.001929 -0.001250 0.000209 0.004288 0.003192 -0.009216 
+0.002131 0.004666 -0.013586 0.001546 0.005915 -0.007490 
+0.001411 -0.003673 0.003235 0.004597 -0.011683 0.024245 
+-0.015738 -0.028079 0.049611 -0.022451 -0.038660 0.048380 
+-0.014765 -0.029042 0.027973 -0.003309 -0.010068 0.006264 
+0.008545 0.004600 -0.006829 0.010084 0.010399 -0.014130 
+-0.006420 -0.003225 -0.000261 -0.021339 -0.019776 0.014073 
+-0.016690 -0.023633 0.009531 -0.011974 -0.011604 0.008559 
+-0.002996 -0.006265 0.007573 -0.001905 -0.004109 0.003639 
+-0.002872 -0.004561 0.000354 -0.000611 -0.001027 0.001610 
+-0.002521 0.000312 0.000609 -0.003482 -0.004187 0.002348 
+-0.005292 -0.011543 0.005976 -0.003329 -0.014444 0.008645 
+0.005336 -0.005016 0.016150 -0.009612 -0.005301 0.032650 
+-0.010227 -0.043674 0.050492 0.003497 0.069290 -0.036976 
+-0.021970 -0.024129 -0.029621 0.000160 0.028000 0.000120 
+0.023636 0.000000 0.060909 0.050308 -0.004000 0.033538 
+0.018080 -0.015865 0.012545 0.035690 -0.012795 0.003872 
+0.032844 0.021968 0.018235 0.075420 0.057975 -0.000489 
+0.025721 0.007769 0.011752 -0.000806 0.001386 -0.002288 
+-0.019378 -0.010730 -0.004522 -0.028547 -0.020836 -0.000646 
+-3.331081 -2.608108 0.364865 -3.395604 -2.802198 0.587912 
+-3.122449 -2.770408 0.632653 -2.604520 -2.542373 0.508475 
+-0.016482 -0.020359 0.008476 -0.004592 -0.009439 0.004795 
+0.002498 0.002758 -0.009454 0.002214 0.000588 0.001784 
+-0.000544 0.003270 0.002673 -0.005106 0.000953 0.000509 
+0.047404 -0.005226 0.014930 -0.027333 -0.013585 0.001235 
+-0.096798 -0.019286 0.038719 -0.034965 -0.009231 0.028531 
+0.001091 0.020000 0.000545 0.021162 0.023662 0.017929 
+0.017089 0.014449 -0.000377 0.000606 -0.015758 0.016970 
+0.008580 -0.026477 0.051770 0.030015 -0.025881 0.016720 
+0.004095 -0.005070 0.006562 -0.001970 -0.000598 0.006577 
+-0.002770 0.002065 0.007877 0.003934 0.001450 0.007019 
+0.000445 -0.002438 0.001705 -0.003534 0.001350 0.000533 
+-0.000883 0.001798 -0.000622 0.000927 0.000404 -0.000441 
+-0.002567 0.003293 -0.002700 0.001723 0.003786 -0.009634 
+0.002353 -0.001971 -0.000853 0.004056 0.006282 0.003627 
+0.007100 0.006375 -0.001259 0.001298 0.008044 -0.004941 
+0.001299 0.009143 -0.005968 0.005331 0.007537 -0.007027 
+0.006944 0.007552 -0.008607 0.003580 0.008026 -0.009690 
+0.000794 -0.000841 -0.005794 -0.002900 0.002653 0.000600 
+-0.002321 -0.004482 0.008219 -0.004359 -0.013972 0.013863 
+-0.007469 -0.011044 0.014300 -0.008038 -0.008249 0.009406 
+-0.006254 -0.005569 0.010781 -0.005930 -0.005507 0.007954 
+-0.005662 0.000755 -0.000029 -0.000393 0.004084 -0.006815 
+0.004935 0.008075 -0.009870 0.007802 0.009815 -0.008873 
+0.009704 0.008941 -0.005739 0.008280 0.008181 -0.005151 
+-0.002143 0.002286 -0.002929 -0.003491 -0.006566 0.001321 
+-0.002411 -0.011411 0.004631 -0.000006 -0.004703 0.002467 
+0.000536 0.004562 -0.001713 -0.001938 0.006744 0.000337 
+-0.002310 0.002617 -0.001947 -0.001981 -0.005404 -0.000341 
+-0.001644 -0.007768 0.002427 0.003199 0.011999 0.003998 
+-0.018903 0.044107 -0.004545 -0.007424 0.051970 -0.029697 
+-0.000380 0.050380 -0.014503 0.018069 0.055004 -0.004978 
+0.022875 0.044118 0.014557 0.033765 0.016704 -0.010898 
+0.007333 0.000000 0.007333 0.014459 0.002410 0.015000 
+0.025193 0.003092 0.008989 0.001480 -0.020132 -0.002271 
+-0.038899 -0.007884 0.041876 0.008448 0.004278 0.004280 
+-0.007125 -0.003173 -0.004943 -0.013313 -0.011493 -0.000029 
+-0.023642 -0.020376 0.004584 -0.030777 -0.026711 0.008394 
+-3.301282 -2.801282 0.980769 -3.137255 -2.633987 1.013072 
+-0.026487 -0.022991 0.012856 -0.012351 -0.012796 0.006839 
+0.026611 0.017522 -0.024487 0.021005 0.000033 0.005267 
+-0.007169 -0.009153 -0.001781 -0.013833 -0.012220 -0.002084 
+0.033566 0.019720 -0.017762 0.058205 0.011026 -0.014103 
+0.025714 0.016978 0.011319 -0.015385 0.000000 0.050000 
+-0.004643 0.027143 0.049643 -0.014118 0.050667 0.008471 
+-0.028201 0.036867 -0.007930 0.030417 0.061667 0.000417 
+-0.010773 -0.042798 0.047519 0.003878 -0.015145 0.016113 
+0.007101 -0.001879 -0.004204 0.004705 -0.000423 -0.005289 
+0.004006 0.001973 0.006790 -0.001000 -0.001664 0.001688 
+0.002329 0.004261 -0.009328 0.006081 0.011880 -0.014962 
+0.002936 0.008853 -0.003738 0.001004 0.003392 0.000152 
+0.002463 0.000452 0.001055 0.006325 0.003386 -0.006900 
+0.005638 0.003203 -0.003899 0.002592 0.001743 -0.002690 
+-0.000539 -0.000154 0.000485 -0.001224 -0.002067 0.003899 
+-0.001561 -0.002848 0.004632 -0.001687 -0.002253 0.002796 
+-0.000798 -0.000808 0.000864 0.000090 -0.000610 0.000136 
+0.001669 0.000473 0.002954 0.000786 0.002327 0.002607 
+0.001245 0.006415 -0.002305 0.002494 0.007970 -0.006429 
+0.001042 0.005333 -0.005771 -0.002060 0.002431 -0.004252 
+-0.003511 0.003334 -0.006205 -0.001337 0.006120 -0.008998 
+0.002343 0.005705 -0.007794 0.002451 0.003199 -0.003359 
+0.001582 0.000716 -0.000231 0.000963 -0.000155 0.000502 
+0.001892 -0.000092 0.000650 0.005226 0.000596 0.001851 
+0.009637 0.003519 0.002769 0.015149 0.002713 -0.002995 
+0.004679 0.012661 0.001978 0.003618 0.010487 -0.001888 
+0.001319 0.003091 -0.003300 -0.001641 -0.000623 -0.003025 
+-0.002558 -0.000657 -0.003023 -0.002157 0.005075 -0.005006 
+-0.003258 -0.002259 -0.004690 -0.000741 -0.014726 -0.008186 
+-0.002111 -0.006667 -0.006333 -0.017614 -0.035795 -0.017045 
+-0.037087 0.018728 -0.010445 -0.022037 0.129423 -0.072582 
+0.032114 0.073340 -0.092758 0.019595 0.010014 -0.001484 
+-0.020372 0.019056 0.007415 -0.013120 0.038023 0.029457 
+-0.019161 0.007234 -0.005533 0.006689 -0.024783 0.001806 
+0.025060 -0.016021 -0.030719 -0.015000 -0.010000 -0.055000 
+0.002087 0.049178 -0.057189 0.008756 0.005823 0.003088 
+-0.010877 -0.012586 0.003984 -0.016007 -0.015896 0.005159 
+-0.021017 -0.012796 0.006971 -0.023017 -0.011315 0.009163 
+-0.023128 -0.012802 0.009174 -0.016793 -0.010671 0.008178 
+-0.000850 -0.001808 0.002824 0.004496 0.007609 0.004255 
+-0.012372 0.012577 0.001600 0.005533 0.023610 -0.005910 
+0.006177 -0.003263 -0.005361 0.077861 0.043636 -0.019465 
+0.028315 0.035272 0.020036 -0.001286 0.014286 -0.000429 
+-0.029793 -0.012817 0.012367 -0.063900 0.000479 0.063600 
+-0.043469 -0.040204 0.096735 0.039894 -0.055727 0.045327 
+0.006238 -0.006881 -0.007747 0.004640 0.004433 -0.013537 
+0.002662 0.001390 -0.007507 -0.001308 -0.000332 0.003489 
+-0.006337 -0.005322 0.006402 0.002774 0.007052 -0.000799 
+0.014154 0.015564 -0.004639 0.008399 0.003771 -0.000223 
+0.003614 -0.004035 0.000927 0.001749 -0.001836 0.000454 
+0.002095 -0.003213 -0.006615 0.006091 0.001036 -0.004359 
+0.002979 -0.001064 -0.000512 0.001332 -0.000242 -0.000408 
+0.000799 0.001084 -0.001533 -0.000289 0.001266 -0.001380 
+-0.001173 0.001075 -0.000021 -0.001721 -0.001921 0.000843 
+-0.001737 -0.004620 -0.004541 0.002859 -0.002478 -0.004002 
+0.000390 -0.003599 -0.003302 -0.004125 -0.000112 -0.000820 
+-0.002266 0.005225 -0.002855 0.003642 0.011407 -0.005056 
+0.007681 0.012124 -0.008010 0.005663 0.006161 -0.007169 
+0.000785 0.000330 -0.000622 -0.001843 -0.003336 0.004851 
+0.002055 -0.003905 0.005878 0.007115 -0.001887 0.002292 
+0.007788 0.000385 -0.000588 0.003939 0.001600 -0.002098 
+-0.000433 0.001504 -0.002497 -0.000640 0.001173 -0.001729 
+0.004627 0.003252 -0.000171 0.012025 0.005446 0.001384 
+0.008521 0.001243 0.008796 0.004356 0.000508 0.002143 
+-0.001227 -0.004708 0.005576 0.000108 -0.000122 0.004493 
+0.001019 0.002959 0.000750 0.000141 0.000943 -0.000401 
+0.000313 -0.002361 0.004199 0.001641 -0.013949 -0.010252 
+-0.033091 -0.016545 -0.014545 -0.019086 -0.016734 0.030847 
+-0.038308 -0.060000 0.025538 -0.111357 -0.013127 -0.036032 
+0.099655 -0.036293 0.076897 0.017778 -0.107022 0.080267 
+-0.190682 -0.129318 -0.024545 0.016917 -0.021654 -0.014211 
+-0.010172 -0.013666 0.098693 -0.058763 -0.018125 0.066531 
+-0.006560 -0.016667 0.032799 0.025579 -0.013672 0.007001 
+0.020507 0.009067 -0.018347 0.011406 0.000436 -0.001372 
+-0.024393 -0.027041 0.021857 -0.013956 -0.012524 0.004769 
+-0.017223 -0.012353 0.006599 -0.021278 -0.015061 0.011454 
+-0.021972 -0.015697 0.014456 -0.019966 -0.013289 0.014408 
+-0.011590 -0.001187 0.007978 -0.000227 -0.002878 -0.003122 
+-0.027739 -0.039736 0.019026 -0.006580 0.000449 0.002137 
+0.055244 0.007500 -0.006138 -0.000449 0.046837 0.023250 
+0.002000 0.012991 0.009279 0.007335 0.015957 -0.004007 
+-0.025079 0.010952 0.001905 0.021275 0.028725 0.037255 
+-0.023193 0.055010 -0.007136 -0.005496 0.027519 -0.031388 
+0.003872 0.014460 -0.027080 0.003244 0.003111 -0.011374 
+0.001166 -0.003999 0.000168 -0.006464 -0.008431 0.004548 
+-0.007953 -0.004325 0.005334 -0.002547 0.001769 0.001412 
+0.000924 -0.000294 -0.000556 -0.003040 -0.001836 -0.003462 
+-0.002643 -0.000070 -0.002741 0.000644 -0.000823 0.000061 
+0.002083 -0.003628 0.000170 0.002548 -0.003572 0.000647 
+0.000181 -0.001168 0.000840 -0.001385 0.000044 0.000574 
+-0.000789 0.000255 0.000099 0.000006 0.001319 -0.001318 
+-0.002456 0.001593 -0.002684 -0.004126 0.001456 -0.003155 
+-0.006101 0.001017 0.001287 -0.003627 -0.005588 0.002941 
+-0.001456 -0.004835 0.003709 -0.000703 -0.003909 0.001453 
+-0.001662 -0.002220 0.000595 -0.001040 -0.000261 0.000379 
+0.001159 0.000449 -0.001146 0.001710 0.000929 -0.001409 
+0.002144 0.001446 -0.000528 0.001464 0.000761 -0.000326 
+0.002034 0.000947 -0.000984 0.005491 0.004538 -0.002680 
+0.007965 0.008836 -0.001964 0.005923 0.007619 0.001042 
+0.000950 0.004075 0.000558 -0.001160 -0.001256 0.000217 
+0.001275 -0.000955 0.002093 0.007616 0.004549 -0.000173 
+0.009020 0.007928 -0.002959 0.003006 0.003245 -0.005170 
+-0.000234 -0.000463 0.000537 0.004572 0.004744 -0.002904 
+0.009902 0.005031 -0.012617 -0.004534 0.002200 -0.010142 
+0.000337 -0.002306 0.001101 0.000716 -0.001039 -0.002467 
+-0.024999 -0.002702 0.000406 0.067436 0.028718 -0.038718 
+0.071712 -0.093784 0.081171 0.028462 0.026895 -0.033684 
+-0.018605 0.040031 -0.007054 0.010383 -0.012775 0.009569 
+-0.003054 -0.020155 0.036238 -0.033600 -0.016800 0.042667 
+-0.065087 0.018499 0.025350 0.005843 -0.001744 0.007994 
+0.051012 0.059474 -0.034008 0.005656 -0.002905 0.001730 
+0.045470 0.004548 -0.019099 0.037129 -0.030353 0.009553 
+-0.013367 -0.022755 0.027449 -0.033512 -0.024087 0.010473 
+-0.033794 -0.017425 0.003655 -0.031546 -0.010888 0.006415 
+-0.027739 -0.006967 0.010029 -0.030110 -0.020147 0.019502 
+-0.021908 -0.042765 0.020506 0.009031 -0.006195 0.012331 
+0.004726 -0.001447 -0.013953 0.015088 0.002953 -0.004686 
+0.052625 -0.014247 -0.010953 -0.008797 -0.004130 -0.017236 
+-0.009412 0.027353 -0.027353 0.006763 0.007845 -0.030976 
+-0.063457 -0.039877 -0.047160 -0.030210 -0.005221 0.016207 
+0.015303 -0.002511 -0.014778 -0.000358 0.003187 -0.007570 
+0.009819 -0.004367 -0.010904 0.005859 -0.003013 -0.009291 
+0.002813 0.002686 0.000767 -0.003794 0.001331 0.000291 
+-0.006898 0.001818 0.001576 -0.005663 -0.002861 0.002374 
+-0.002955 -0.005927 0.005980 0.001626 -0.001884 0.004336 
+0.000141 0.001681 0.001246 -0.002249 0.001258 -0.002477 
+-0.002231 0.000800 0.002299 -0.005094 -0.001856 0.005328 
+-0.005326 -0.000664 0.003855 -0.004432 0.000701 0.002382 
+-0.004615 -0.001019 0.000195 -0.002006 -0.002104 -0.002071 
+0.002280 -0.000868 0.000424 0.003732 0.002737 0.002382 
+-0.004376 0.006168 -0.005669 -0.002018 0.004884 -0.000797 
+-0.002450 0.000767 -0.000585 -0.003373 -0.001715 0.000796 
+-0.000084 0.000140 -0.000028 0.003351 0.002075 -0.004058 
+0.004526 0.004259 -0.007544 0.006800 0.003400 -0.008455 
+0.002829 0.003731 -0.010291 0.005568 0.003712 -0.006239 
+0.003056 -0.001329 -0.004696 0.001387 -0.004362 -0.004395 
+-0.000474 -0.003249 -0.003881 -0.001524 0.000119 -0.005736 
+0.008447 0.002112 -0.008000 0.011448 0.010510 -0.005844 
+0.010799 0.012140 -0.004164 0.007125 0.008478 -0.001159 
+0.001022 -0.000826 0.002317 -0.001528 -0.011633 0.007145 
+0.001693 -0.009021 0.010130 0.000325 0.000886 0.001230 
+0.001330 0.000707 -0.002310 -0.001557 -0.000559 -0.005465 
+-0.004343 -0.014710 0.000052 -0.037590 -0.029399 -0.012861 
+-0.058712 0.028921 -0.016200 -0.008499 0.029142 -0.013353 
+0.005075 0.045603 -0.005737 -0.001240 0.078496 0.012553 
+-0.035196 -0.021962 0.056876 -0.019410 -0.077441 0.062917 
+-0.001905 -0.007619 0.006667 -0.008471 0.014706 -0.025412 
+-0.008623 -0.000664 -0.004754 0.018630 0.010685 -0.003796 
+-0.006410 0.004274 0.027222 -0.009509 0.038964 0.062080 
+-0.037988 0.048876 0.016272 0.002333 0.032878 -0.001811 
+0.011299 0.002880 0.004225 -0.003067 -0.010201 0.019636 
+-0.014953 -0.000017 0.015047 0.008264 0.027939 -0.034526 
+0.043933 0.090275 -0.064858 0.017813 0.059797 -0.023934 
+-0.009601 -0.032237 -0.003115 -0.000259 -0.016009 0.009553 
+-0.000604 -0.014566 0.005673 -0.005372 -0.017235 0.008032 
+0.016955 -0.003341 0.007193 0.026392 -0.054994 0.028326 
+-0.009613 -0.040446 0.031287 -0.043778 0.020356 0.002511 
+-0.002875 0.027847 -0.060499 -0.001920 0.001819 -0.001920 
+0.004492 0.000236 -0.012205 0.004034 -0.002608 -0.005234 
+0.001644 -0.000584 0.002962 -0.002858 0.003067 0.002117 
+-0.000681 0.008121 -0.002304 0.005531 0.011084 -0.003545 
+0.003387 0.002584 -0.000408 -0.001163 -0.005738 0.000310 
+0.001371 -0.006242 -0.002145 0.001749 -0.005661 -0.005637 
+0.002582 -0.001221 -0.010469 0.002129 0.001324 -0.005848 
+-0.000348 0.000598 -0.000045 -0.001138 -0.000383 0.001598 
+-0.001071 -0.000371 0.000339 -0.001639 0.001695 0.000022 
+-0.003725 0.002580 0.001515 -0.003967 0.001604 0.001688 
+-0.001522 -0.000046 -0.000712 0.000608 -0.002253 -0.001906 
+0.006200 -0.001961 -0.001743 0.007104 0.001065 -0.003552 
+0.002465 0.000900 -0.001308 -0.002407 -0.000093 -0.000093 
+-0.000920 -0.003461 0.001675 -0.000177 -0.003299 0.003853 
+-0.000934 -0.002936 0.001701 -0.001248 0.000299 0.002470 
+0.000094 0.001792 0.001792 0.003563 0.002134 0.001139 
+0.005577 0.001313 0.000263 0.003942 0.000351 -0.000671 
+0.001283 -0.000618 -0.000336 -0.000861 -0.000255 -0.000236 
+0.000281 0.002135 -0.000919 0.003863 0.001237 -0.002179 
+0.003896 0.001468 -0.002597 0.003265 0.001199 0.000723 
+-0.000199 -0.000315 0.000006 -0.001099 -0.002523 0.001079 
+0.001454 -0.001512 0.003983 0.000563 0.001479 -0.003156 
+0.002628 0.011820 -0.008201 -0.005000 0.006944 -0.001528 
+-0.001668 -0.004823 0.003269 -0.011135 -0.024399 0.015219 
+-0.002956 -0.003699 -0.002168 -0.042006 0.076409 -0.024266 
+-0.018857 -0.042206 0.022834 -0.014286 -0.155714 0.014286 
+0.003056 0.011944 -0.004444 -0.039519 0.062252 -0.029281 
+-0.012356 0.035510 -0.018015 -0.020269 -0.000627 -0.019731 
+-0.036097 0.004387 -0.015328 -0.016414 0.005351 0.006914 
+0.001737 -0.003151 -0.000298 0.018722 -0.006611 0.006389 
+-0.010130 -0.036948 0.030195 -0.028223 -0.066794 0.057010 
+-0.076866 -0.099719 0.062004 -0.124094 -0.106529 0.022697 
+-0.114022 -0.046812 -0.020680 0.003500 -0.009857 0.004643 
+-0.021013 -0.010957 -0.004803 -0.033636 -0.033740 0.023618 
+-0.021420 -0.067692 0.032130 -0.022594 -0.031507 0.033165 
+-0.001034 -0.012750 0.020445 0.009096 -0.000221 0.003529 
+0.044242 0.086061 -0.065758 -0.009773 0.015682 0.037273 
+-0.017825 0.013314 0.033945 -0.009259 0.004479 0.013985 
+-0.006080 -0.000325 0.014064 -0.001138 0.000569 0.002699 
+-0.000921 0.002384 0.002377 0.000933 0.001945 0.000706 
+-0.004638 -0.006134 0.003251 -0.003994 -0.005397 0.003448 
+-0.001651 -0.002253 -0.000838 -0.004781 -0.005782 -0.000549 
+-0.005999 -0.010781 0.001428 -0.005700 -0.008280 -0.002372 
+-0.002261 -0.000379 -0.003582 -0.004819 0.001319 0.003930 
+-0.005173 -0.001255 0.003032 -0.001116 0.002714 -0.001198 
+0.002857 0.007658 -0.005058 0.005762 0.006536 -0.002867 
+-0.001596 -0.000092 -0.000899 -0.002065 0.000437 -0.001910 
+-0.003980 0.000318 -0.001617 -0.005103 0.000182 0.001184 
+-0.000231 0.000637 0.001009 0.002532 0.000961 0.001474 
+0.002449 -0.000367 0.001291 0.005108 -0.003225 -0.000560 
+0.001107 -0.001473 -0.002455 -0.005316 -0.005269 0.004493 
+-0.002529 -0.004455 0.006624 -0.001346 -0.000180 0.000962 
+-0.000727 0.003091 -0.000455 -0.003326 0.004477 -0.004221 
+-0.005755 0.004082 -0.004884 -0.002525 0.005416 -0.003371 
+0.003095 0.004751 -0.000994 0.005207 0.000649 0.001519 
+0.003642 -0.002097 0.000408 0.000915 0.000556 -0.000719 
+-0.001755 0.003137 -0.000637 0.001522 0.005511 -0.004024 
+0.005414 0.006384 -0.002222 0.002920 0.002774 0.000555 
+-0.000895 0.000229 -0.000802 -0.002044 -0.002248 0.000066 
+-0.001430 -0.000507 -0.000908 0.001388 0.005777 -0.006353 
+-0.003157 0.009677 -0.002631 -0.001466 0.006196 -0.004122 
+-0.003318 -0.000563 -0.001846 -0.002550 0.001113 -0.003396 
+0.008524 0.021170 -0.008839 -0.010387 -0.041532 0.020017 
+-0.090595 -0.032976 0.152381 -0.133713 0.204883 -0.026959 
+-0.047249 0.039149 0.014464 0.088087 0.032102 0.000685 
+0.027000 -0.008890 -0.004041 0.014074 -0.025017 -0.002189 
+0.004847 -0.034013 0.011957 0.005030 -0.014788 0.005879 
+0.009611 -0.014139 0.000266 0.023418 -0.027092 -0.014976 
+0.033098 -0.017073 -0.045902 0.070800 -0.035400 -0.036000 
+0.058824 -0.040098 -0.001324 0.063965 -0.035642 -0.002091 
+0.053459 -0.036541 -0.002820 0.030000 -0.011538 0.011538 
+0.020647 -0.021226 0.010541 0.021429 -0.001274 -0.000212 
+0.027567 -0.007567 -0.003194 0.007227 -0.010626 0.002739 
+-0.028294 -0.028963 0.009766 -0.026500 -0.003786 0.037857 
+-0.024367 0.010357 -0.003084 0.006021 0.007039 0.015724 
+0.010498 -0.003284 0.008136 0.002830 0.001365 0.007454 
+0.002156 0.006665 0.005591 0.003655 0.004577 0.001681 
+0.000207 0.003534 0.000744 -0.004463 0.002867 -0.001396 
+-0.004608 0.004145 -0.000241 -0.001739 0.005649 0.000892 
+0.001905 0.006957 -0.000363 0.004113 0.007521 -0.002140 
+0.001859 0.005845 0.000092 -0.003775 0.002270 -0.000838 
+-0.000154 0.000630 0.000247 -0.000859 -0.000537 0.002352 
+0.001301 0.001954 -0.002658 0.004912 0.004005 -0.004884 
+0.004669 0.003086 -0.000645 0.001106 -0.004468 -0.000882 
+-0.001188 -0.005572 -0.003548 -0.001428 -0.007778 -0.000571 
+-0.001150 -0.005307 0.003133 -0.000170 -0.000272 0.000068 
+0.000810 0.002683 0.000561 0.002886 0.001425 0.001193 
+0.004489 0.000392 0.001438 0.002792 0.000142 -0.000777 
+-0.000031 -0.000294 0.000165 -0.002005 -0.001102 0.002595 
+-0.004529 -0.002500 0.001510 -0.001326 -0.001595 -0.000411 
+-0.000872 -0.001652 0.000010 0.000818 -0.000711 -0.000648 
+0.000760 -0.000090 -0.000351 0.000441 0.000770 0.000179 
+0.000576 0.001859 0.000673 -0.001101 0.002352 -0.000689 
+-0.002232 0.001800 -0.001752 -0.001356 0.000446 -0.000200 
+0.001299 -0.000697 0.001953 0.005000 0.001682 0.000327 
+0.005293 0.003166 0.002764 0.004107 0.003369 0.002178 
+0.000611 0.006000 0.000841 0.001181 0.004034 -0.001992 
+0.001143 0.003945 -0.002327 0.001422 0.004675 -0.002708 
+0.002344 0.003125 -0.002969 0.000402 0.002599 -0.000972 
+-0.001020 0.003718 -0.001380 0.000891 0.005325 -0.004636 
+0.001543 0.006257 -0.005504 -0.003500 -0.007714 0.006750 
+0.055775 0.058042 -0.049273 0.154771 0.050743 -0.082714 
+0.090674 0.030000 -0.020150 -0.004167 0.006833 0.000333 
+-0.001562 0.023500 0.012313 -0.029247 0.011647 0.010612 
+-0.054762 -0.006667 0.024048 -0.095882 -0.032500 0.023971 
+-0.082359 -0.055628 0.000271 -0.015595 -0.018405 -0.012048 
+-0.006863 -0.000392 -0.004314 -0.017222 -0.006667 -0.004444 
+-0.046863 -0.005098 0.023137 -0.037134 -0.001317 0.054054 
+0.055381 0.035811 0.009717 0.042780 0.000317 -0.020439 
+-0.059294 -0.017471 -0.071471 -0.053855 -0.003872 -0.018429 
+-0.062344 -0.002934 -0.011782 -0.023367 0.001945 0.001530 
+0.015530 0.000692 0.006767 0.024811 0.007555 0.006703 
+0.003205 -0.005411 -0.007569 -0.001710 0.001006 -0.004653 
+0.002042 -0.002497 -0.001158 0.012086 0.002488 0.000399 
+0.008938 0.004990 -0.002113 -0.006914 0.002520 -0.001503 
+-0.000191 0.001168 0.000360 0.003319 -0.003326 0.000383 
+0.003140 0.001191 -0.000704 -0.000128 0.006522 0.000022 
+-0.005288 0.001428 0.000813 -0.008323 -0.009262 0.004130 
+-0.005637 -0.011692 -0.001537 0.001909 -0.000764 0.002609 
+-0.002542 0.001284 0.004512 -0.003253 0.002177 0.002107 
+-0.002563 0.002944 0.000887 -0.000436 0.003872 0.000889 
+0.001048 0.002662 0.001210 0.001974 -0.003003 0.000079 
+-0.000621 -0.009612 -0.000044 -0.003038 -0.008213 -0.001946 
+0.000637 -0.005294 0.000637 0.001103 -0.001221 0.003979 
+0.003147 0.000222 0.002634 0.001793 0.000192 0.000730 
+-0.002082 0.001212 -0.000164 -0.004124 0.004407 0.000192 
+-0.003789 0.005053 0.000000 -0.002908 0.002077 0.001731 
+-0.002879 -0.000706 0.004004 -0.002629 -0.000770 0.003977 
+-0.002037 -0.000826 0.001046 -0.000489 0.000022 -0.000341 
+0.000773 -0.000906 -0.000713 -0.000571 0.000286 0.000571 
+-0.003749 0.000330 0.001449 -0.003433 -0.000633 0.003670 
+-0.001858 0.001106 0.001372 -0.002173 0.001529 0.000100 
+-0.001435 -0.001964 -0.002166 0.000150 -0.001204 0.002179 
+0.001447 -0.001653 0.005858 -0.001243 -0.000076 0.002440 
+0.000303 0.001119 -0.000487 -0.000374 0.003791 -0.001224 
+0.000094 0.004509 -0.003360 0.001433 0.003869 -0.001986 
+0.000317 0.000717 -0.000983 0.000029 -0.003968 0.000003 
+-0.003330 -0.001192 -0.003645 0.002499 0.001905 -0.006070 
+0.004254 0.007313 -0.002395 0.009536 0.009987 0.004559 
+0.015810 0.008795 0.015573 0.017878 0.022772 0.015111 
+0.016923 0.008182 0.025385 0.043130 -0.009805 0.031338 
+0.029021 -0.011640 0.023439 0.012716 0.018685 0.018879 
+0.058231 0.044711 -0.001229 0.068727 0.026637 -0.014776 
+0.027692 -0.018570 -0.004127 0.009573 -0.035654 -0.004292 
+-0.002864 -0.043529 -0.000260 0.009375 -0.011125 0.022250 
+0.043102 0.028717 -0.023957 0.000000 0.045789 -0.043684 
+0.024762 -0.008864 -0.013297 0.032132 0.008895 -0.032269 
+0.020668 -0.014193 -0.016056 0.004726 -0.012461 0.004636 
+-0.002512 0.001751 -0.001010 0.003361 0.000271 -0.001851 
+0.011023 0.001051 -0.004358 0.016179 0.003360 0.000468 
+0.000865 -0.002493 -0.000526 0.002794 0.004428 0.002586 
+0.005153 0.004656 -0.000348 0.002973 0.010066 -0.001614 
+0.000263 0.009870 0.006069 0.004402 0.001717 0.007650 
+0.008486 -0.000423 0.001929 0.001572 -0.004061 0.000893 
+-0.003044 -0.005147 -0.000117 -0.002515 -0.005715 -0.000139 
+0.002515 0.000961 -0.000750 0.006610 0.009238 0.002543 
+-0.007186 0.006685 -0.000900 -0.004165 0.007414 -0.002434 
+-0.002475 0.001866 0.002427 -0.003056 0.000122 0.002451 
+-0.002490 0.000882 0.000524 0.000182 0.000455 0.000203 
+0.003500 -0.000656 -0.000492 0.006040 -0.000734 -0.000294 
+0.003162 0.002631 0.001628 0.000286 0.002966 0.001445 
+0.000521 0.002111 0.001759 0.000412 0.001031 0.001031 
+0.000822 -0.002454 -0.000405 -0.002527 -0.004398 -0.002129 
+-0.006780 -0.005351 0.001213 -0.004362 -0.003191 0.005426 
+-0.001024 -0.000207 0.002338 -0.000095 0.000083 -0.001923 
+-0.000870 -0.001134 -0.003165 -0.000991 -0.002072 -0.003243 
+0.000637 -0.003191 -0.002843 0.001168 -0.003741 -0.001430 
+0.001337 -0.003557 -0.000553 0.003580 -0.003278 -0.001221 
+0.003618 -0.001103 -0.004582 0.003906 -0.001888 -0.004467 
+0.000320 -0.003343 -0.002803 -0.002143 -0.001250 -0.002500 
+0.000158 -0.000049 -0.001622 0.000000 0.005648 -0.004259 
+0.000741 0.003535 -0.007629 -0.005283 0.005239 -0.002891 
+-0.006180 -0.001549 0.002949 -0.005183 -0.001503 -0.001393 
+-0.002437 0.001894 -0.001940 -0.001070 0.005076 -0.003875 
+-0.000975 0.003520 -0.003802 -0.000988 -0.000395 -0.002569 
+-0.001282 -0.000611 -0.000196 -0.002763 0.000201 -0.000852 
+-0.000477 0.002500 0.001014 0.000410 0.003375 -0.002625 
+0.003962 0.003515 0.001503 0.028360 0.022259 0.010269 
+0.003829 0.044650 -0.020044 0.002359 0.017578 -0.029787 
+0.009490 0.008847 -0.024612 0.012208 -0.004419 -0.017739 
+0.009366 -0.003760 -0.006874 0.011786 -0.007857 -0.003929 
+0.016410 -0.013692 -0.006410 0.015181 -0.006810 -0.001312 
+0.021984 0.032422 -0.011925 0.028112 0.014953 -0.010726 
+0.027068 -0.012127 0.007206 -0.003786 0.003329 0.027771 
+-0.019272 -0.008939 0.020465 -0.013080 0.000181 0.001123 
+0.002410 -0.001517 0.011601 0.008744 0.000261 0.018531 
+0.002498 0.005901 -0.000505 0.006804 0.005308 0.000967 
+0.005425 0.009413 0.000372 0.005491 0.007794 -0.009399 
+0.054785 0.012538 0.005860 0.070217 0.027029 -0.030652 
+-0.008869 0.002207 -0.006606 -0.093354 0.006098 0.019938 
+-0.028518 0.028169 -0.021831 -0.047778 -0.031042 0.035477 
+-0.016857 -0.086286 0.093429 0.020000 0.000000 0.005833 
+0.026400 0.005000 -0.008800 0.000156 0.008000 0.000728 
+0.002432 -0.001499 0.003330 0.004207 0.001203 0.002198 
+0.005946 0.001870 -0.002578 0.000276 -0.000524 -0.002616 
+-0.008650 -0.022719 0.006746 -0.048291 0.012992 0.049294 
+-0.000711 0.005781 0.006825 -0.006791 -0.013251 0.012650 
+0.003297 -0.026570 0.000581 0.088016 0.009841 -0.025476 
+0.004899 0.026619 0.002773 0.001293 0.021172 0.021495 
+-0.007708 0.004701 0.028518 -0.046056 -0.027911 0.006989 
+-0.087582 -0.021895 0.032222 -0.033333 -0.017778 0.010000 
+-0.031250 -0.012371 0.005302 0.011996 -0.000453 0.001584 
+0.018118 -0.014495 0.020000 0.002000 -0.032000 0.016000 
+-0.101264 -0.039945 -0.085934 -0.013663 0.019550 -0.012691 
+-0.015442 0.016866 0.000285 -0.001346 -0.005288 0.000032 
+-0.045095 -0.082466 -0.048645 0.004974 -0.028783 -0.015503 
+0.014502 -0.004729 0.007330 0.028667 -0.008598 -0.021494 
+0.018692 -0.038785 0.005723 0.030095 -0.045048 0.052476 
+0.052708 -0.029583 -0.006458 0.037857 0.091429 -0.069286 
+0.047589 0.088458 -0.016166 0.031778 0.076222 0.011111 
+0.040513 -0.016239 0.002051 0.139689 -0.019956 0.118889 
+-0.060786 0.074819 0.052218 -0.073042 0.091083 0.051042 
+-0.061123 0.026605 0.008988 -0.046980 0.046933 -0.004476 
+0.005194 -0.014888 0.005919 -0.014238 -0.125619 0.038524 
+-0.020150 -0.048611 0.033167 -0.007859 -0.008816 0.003051 
+-0.006480 0.000311 0.000674 0.007008 -0.005198 -0.002460 
+0.017519 -0.013687 0.002834 0.006810 -0.015653 0.007767 
+-0.014235 -0.023000 0.018615 0.000734 -0.000272 0.002455 
+-0.001454 0.001679 0.001445 -0.001704 0.001545 0.001777 
+-0.003731 0.001024 0.001843 -0.002208 0.003238 0.000632 
+-0.003631 0.003606 -0.005228 -0.013937 0.006798 -0.022032 
+-0.003070 0.008730 0.002339 -0.000066 0.001257 0.000633 
+0.005930 -0.001930 0.011357 0.005465 0.006612 0.015721 
+-0.009948 0.000503 0.007807 -0.000903 -0.000913 0.001259 
+0.012563 -0.004711 -0.009268 0.006716 -0.010791 -0.019715 
+0.002597 0.000097 0.001943 0.010675 0.030248 0.008833 
+-0.066483 -0.031833 0.020867 0.038343 0.063081 -0.043566 
+0.063326 0.067043 -0.112978 -0.112130 -0.034352 -0.059630 
+0.002467 0.015819 -0.064727 -0.005606 0.027491 -0.003369 
+-0.020549 0.030083 -0.003147 0.047208 0.024675 0.000714 
+0.022737 -0.007907 0.001832 -0.002539 0.008947 -0.010839 
+0.003553 0.004027 0.005455 0.000566 -0.002380 0.001456 
+-0.003960 -0.001692 0.002192 0.000192 -0.001452 -0.002871 
+-0.001638 0.000685 -0.025708 -0.000936 0.006404 -0.005271 
+0.009961 0.003513 0.030328 -0.005863 0.003469 0.004289 
+-0.017181 0.001153 0.007962 0.011649 -0.003117 -0.003270 
+0.012815 0.009884 0.004138 0.017423 0.031579 0.006969 
+0.029950 0.024010 0.000251 0.020205 0.036513 0.028718 
+0.006294 0.031469 0.018182 0.000500 -0.002500 -0.002000 
+0.011531 -0.048265 -0.002347 0.010200 0.003400 -0.010000 
+-0.001026 0.002051 0.005128 -0.018969 0.011116 0.032260 
+-0.026944 0.016389 0.015556 0.027742 0.047655 0.021053 
+0.031578 0.025267 0.009827 -0.012222 -0.006923 -0.004615 
+-0.039626 0.014144 -0.038690 -0.008718 0.005641 -0.011795 
+-0.008838 -0.008473 -0.013165 -0.008525 -0.011667 0.007104 
+0.004194 -0.012787 -0.009513 0.017940 0.001789 0.013171 
+0.015920 0.010014 -0.002204 -0.018175 -0.026386 0.074175 
+-0.033701 0.034675 -0.010584 -0.003433 0.023018 0.022512 
+0.016429 0.000714 0.049286 -0.021744 -0.007904 0.038219 
+-0.059261 -0.069830 0.010795 0.033843 0.012985 0.002612 
+0.049000 0.045000 -0.001000 0.053636 0.034260 0.019688 
+-0.031474 0.008421 -0.005579 -0.017658 0.080179 0.061088 
+-0.013776 0.152517 0.115455 0.038857 0.013714 0.045714 
+0.011733 -0.004429 0.018123 -0.002438 0.001406 0.015517 
+0.001745 -0.000338 0.010278 0.006897 0.009128 0.003493 
+-0.023596 -0.004805 0.009017 -0.006222 -0.018654 0.000996 
+0.000450 -0.001980 -0.001941 0.008724 0.002188 -0.002477 
+0.004178 -0.000670 0.002885 -0.001897 -0.003077 -0.008492 
+0.008396 -0.011095 0.004375 0.017961 0.008357 0.023256 
+0.004933 0.003933 0.015515 -0.006667 0.005413 0.009973 
+0.000327 -0.001782 0.005927 -0.001416 -0.006608 0.008824 
+-0.011795 0.000584 0.006427 -0.005944 0.002709 0.002276 
+-0.011632 0.005324 0.001545 -0.029902 0.016134 0.007517 
+-0.054183 -0.012946 -0.015367 -0.058287 -0.017711 0.001694 
+-0.000757 0.009456 -0.005013 0.008335 0.020571 -0.010360 
+0.011067 0.018659 -0.007242 -0.023905 -0.016973 0.004334 
+-0.063809 -0.032221 -0.001117 -0.048038 0.017866 -0.006947 
+-0.002423 -0.039311 -0.089056 -0.009220 0.042000 -0.082976 
+-0.001316 -0.007762 -0.007377 0.000166 -0.001304 0.004220 
+0.000631 -0.005431 0.002029 0.000770 0.001423 0.000036 
+0.000689 0.003126 -0.001008 0.003470 -0.000143 -0.007734 
+0.003722 -0.005131 -0.020226 0.023244 -0.046372 -0.048115 
+-0.003907 -0.018291 0.002220 -0.000704 -0.011487 0.005783 
+-0.004688 -0.007471 0.007766 0.000903 0.000846 -0.001268 
+0.024446 -0.013934 -0.005134 -0.029436 -0.025026 -0.002923 
+-0.012922 -0.001303 -0.000055 0.005032 -0.008104 -0.003337 
+0.008246 0.073594 -0.003812 0.000000 0.070000 -0.025000 
+0.000356 -0.038600 0.023444 -0.013789 -0.011761 -0.007233 
+-0.007692 -0.001846 -0.000923 0.015833 0.045000 -0.015833 
+0.000000 0.030833 -0.010833 0.007623 -0.013144 -0.000786 
+0.040526 -0.002008 -0.016065 0.037023 0.012557 -0.033398 
+0.127067 0.039816 -0.053874 0.050833 0.028333 0.031667 
+0.038513 0.061706 -0.001312 0.010726 0.010548 -0.004148 
+0.003474 -0.004651 -0.000882 0.002891 0.009354 0.021769 
+-0.015123 -0.003539 0.000684 -0.023125 0.004629 0.008331 
+0.006317 0.006777 -0.021714 -0.009214 0.017991 -0.016248 
+-0.048851 0.019540 -0.120000 -0.117273 -0.057727 0.057727 
+0.008538 -0.167281 0.116053 0.129679 -0.060716 0.046568 
+0.022163 0.012197 0.036443 -0.001258 0.003256 -0.004810 
+0.020068 0.035669 -0.009759 -0.045953 0.001336 0.023549 
+0.000583 -0.051609 0.112375 0.023705 0.007805 0.044863 
+0.003102 0.008629 0.011365 -0.003195 0.001083 -0.000112 
+-0.004975 -0.003273 -0.001506 0.005917 -0.008735 -0.005139 
+-0.001372 -0.009689 0.004129 -0.038377 -0.019932 0.011852 
+-0.005739 -0.006083 -0.000857 0.003224 -0.000282 -0.000654 
+-0.002381 -0.001142 -0.002521 0.001506 -0.005636 -0.009763 
+0.017510 -0.002708 0.005375 0.009061 0.003400 0.009630 
+0.006305 0.008455 -0.003511 -0.012080 -0.001969 0.005428 
+-0.015633 -0.012308 0.002134 -0.004689 -0.009504 0.009184 
+-0.002469 0.001586 0.000055 0.012585 -0.003673 -0.012534 
+-0.005892 0.004844 -0.015291 -0.026099 -0.049011 0.019725 
+-0.041333 -0.042667 0.000000 -0.007934 -0.052875 0.000600 
+0.012771 0.011100 -0.011560 0.005723 0.011225 -0.011915 
+-0.000501 -0.000023 -0.000074 0.005986 -0.020557 0.014965 
+0.020754 -0.028221 0.021537 0.025773 0.006501 0.022566 
+-0.094957 0.033913 0.072348 -0.037401 0.013862 0.066040 
+-0.015557 -0.005040 0.035595 -0.011779 -0.009600 0.008977 
+0.002389 -0.001256 0.005750 0.000447 -0.001990 0.000574 
+0.003443 0.000455 0.001089 0.003987 0.005105 -0.008273 
+0.000830 0.018156 -0.016805 0.000000 0.060909 -0.046364 
+0.000394 0.000108 0.001846 0.036532 0.030606 -0.029839 
+0.005377 0.026562 0.018852 -0.016745 0.013805 0.043201 
+-0.014713 0.001563 0.003205 -0.056448 -0.009119 0.008498 
+-0.024322 -0.021360 0.010363 -0.045839 0.003908 -0.029433 
+-0.037652 -0.007045 -0.016515 -0.048278 -0.007889 0.016722 
+0.007818 -0.015636 0.050909 -0.044000 -0.025714 0.025143 
+-0.000030 0.000637 0.000135 0.019118 0.022745 0.051422 
+0.019083 0.057250 0.020000 0.025045 0.035063 0.006000 
+-0.010251 -0.014236 0.036441 -0.013158 -0.015263 0.029474 
+-0.011653 -0.003473 0.006695 0.008981 0.034667 -0.002566 
+0.021590 0.025026 -0.040564 0.030714 0.000484 0.000846 
+0.021086 -0.002814 -0.007137 0.010570 -0.005570 -0.002690 
+0.003626 -0.015907 -0.002027 0.003707 -0.006429 -0.001589 
+-0.019560 0.032879 0.000835 -0.028995 0.019471 0.027090 
+-0.029766 0.018538 0.001696 -0.026389 -0.099306 0.046528 
+-0.050857 -0.067143 0.101714 0.023158 0.094208 0.021328 
+-0.011161 0.064768 0.000299 0.014127 -0.003120 0.005769 
+0.032359 0.069047 -0.032064 0.008687 -0.010725 0.030579 
+-0.020561 -0.037971 0.066866 0.003640 -0.004527 0.001596 
+-0.000902 0.007286 0.000313 0.003153 0.004163 -0.003827 
+-0.001263 0.002423 -0.003525 -0.000606 0.011675 -0.014970 
+0.000032 0.024655 0.018555 -0.002236 0.036680 0.004324 
+0.016921 0.012256 -0.002535 -0.003344 0.000485 0.000744 
+0.002752 -0.000805 0.000648 0.003423 -0.011488 0.012285 
+0.005667 -0.009939 0.001018 0.007024 0.004533 0.006003 
+0.015002 0.003585 -0.008480 0.018436 0.007562 -0.003729 
+0.017384 -0.004759 -0.007575 0.015713 -0.010000 -0.010878 
+0.014551 0.016349 -0.006485 0.009862 0.024232 0.011558 
+-0.026471 -0.030882 0.031250 -0.011438 -0.035359 0.019346 
+0.009333 -0.026667 0.009333 0.027389 -0.012275 0.006504 
+-0.003006 -0.002587 0.002647 -0.005575 -0.007489 0.005977 
+-0.005098 -0.009524 0.006927 -0.000883 -0.007155 0.006623 
+0.011013 0.003810 0.004974 0.029354 0.058048 -0.021046 
+-0.000263 0.000258 -0.000142 0.003333 0.093962 -0.052201 
+0.000660 0.000497 -0.000394 0.060721 -0.041947 -0.014695 
+-0.002219 -0.004015 0.006579 0.000383 -0.000479 -0.000468 
+0.001231 -0.005185 -0.001870 0.003144 -0.002956 -0.002963 
+-0.000122 0.005204 -0.011281 -0.003287 0.011449 -0.030719 
+0.002184 -0.003332 0.006680 0.016842 0.016597 -0.001660 
+-0.003108 0.015720 -0.015877 -0.018052 -0.055455 0.023507 
+-0.086453 0.025334 0.055102 -0.013498 -0.005665 -0.012956 
+-0.031589 -0.048154 0.027063 -0.040289 -0.047889 0.042578 
+-0.025714 -0.027143 -0.050000 -0.029655 -0.037759 -0.002672 
+-0.015455 -0.001818 0.000000 -0.013333 -0.013362 0.005345 
+-0.018601 -0.023776 0.026014 -0.046000 -0.054000 0.027000 
+-0.034685 -0.052308 0.030559 -0.014545 -0.005266 0.012288 
+-0.034038 -0.003908 0.026978 -0.033760 -0.001883 0.058240 
+-0.064318 -0.029752 0.099318 -0.066667 -0.011918 -0.041714 
+-0.057345 -0.031172 -0.097241 -0.066707 -0.055610 0.105640 
+-0.011047 -0.002609 0.014711 0.000604 -0.000464 -0.000697 
+-0.007831 0.000767 0.005450 0.000221 -0.018603 0.018897 
+0.024524 0.015952 0.020238 0.045000 -0.003571 0.000000 
+0.010857 0.005000 0.021714 -0.020268 0.030565 0.017161 
+-0.036296 -0.034074 0.038519 0.024358 -0.016746 -0.007612 
+0.073167 0.002068 -0.010779 0.063410 0.015076 0.003019 
+-0.003135 0.009603 -0.010873 0.001370 0.000730 -0.003902 
+0.005714 -0.000173 0.009004 -0.015462 -0.002598 -0.004623 
+-0.002058 0.003532 -0.001194 0.008228 0.007472 -0.007449 
+-0.006879 0.008990 -0.000942 0.001931 0.016000 0.000286 
+-0.012912 0.009176 -0.023956 0.013793 0.047639 -0.014394 
+0.031664 0.002282 -0.007048 0.021712 -0.009224 -0.026712 
+0.010780 0.074610 -0.066312 0.007084 0.023531 -0.032675 
+-0.002834 -0.002480 0.000265 -0.000890 -0.006220 -0.001575 
+0.013495 0.002395 0.010541 -0.002999 0.026286 0.000742 
+-0.003610 0.011764 -0.015026 0.002302 0.001058 0.004788 
+-0.014515 -0.013776 0.015995 -0.021088 -0.022845 0.024600 
+-0.039562 -0.027946 0.004377 0.005492 -0.000253 -0.024335 
+-0.003396 0.003686 0.004612 -0.000040 -0.011590 0.012518 
+-0.006438 -0.005080 0.002044 -0.003284 -0.005746 0.006484 
+0.000991 -0.003466 0.008758 0.003909 -0.000408 0.004184 
+0.004420 0.004359 -0.002467 0.005193 0.010325 -0.009779 
+0.004075 0.010925 -0.013170 0.002183 0.003002 -0.004132 
+0.003602 -0.002110 0.002043 -0.003607 -0.007766 0.008410 
+-0.006614 -0.001318 0.003120 -0.004210 0.004994 -0.002409 
+-0.000334 0.003911 -0.008720 0.004959 0.002499 -0.007425 
+0.003733 0.004277 -0.010127 0.002997 0.019786 -0.003589 
+0.017142 -0.015393 0.046388 -0.017901 -0.013923 0.017143 
+-0.021774 -0.017097 0.012419 -0.029306 -0.011220 0.004938 
+-0.032550 -0.011398 0.009035 -0.059436 -0.028154 0.015333 
+-0.010826 -0.013405 0.030805 0.032701 -0.013346 0.018796 
+0.011035 -0.033719 0.010088 0.030052 0.106987 0.029091 
+-0.024620 0.029410 0.003487 0.004934 0.013728 0.077434 
+-0.020978 0.022921 0.105022 -0.057273 -0.019596 0.099495 
+-0.066667 -0.056667 0.090000 -0.101136 -0.040455 0.040455 
+-0.032418 0.040000 0.006484 0.016888 0.109779 0.010321 
+-0.015000 -0.105000 0.015000 -0.052314 -0.080642 -0.014544 
+0.005231 -0.010585 0.005138 -0.001849 0.009202 0.046892 
+-0.008455 0.002818 0.014545 -0.000714 0.006857 -0.009929 
+0.007295 -0.000851 -0.002675 -0.003839 -0.004520 0.015418 
+0.006337 -0.000461 0.049776 -0.016296 0.068148 0.051852 
+0.005385 -0.003590 0.020000 -0.006531 -0.084490 0.043878 
+-0.050406 -0.075726 -0.027735 -0.011046 -0.048182 -0.003156 
+0.010902 -0.008893 0.001299 -0.031860 0.067860 0.006233 
+-0.042287 -0.026710 0.008529 -0.029420 -0.021378 0.009945 
+-0.005838 -0.004876 -0.000782 -0.009675 -0.004446 -0.000693 
+-0.010102 -0.009055 0.003921 -0.000603 -0.005583 0.005198 
+0.004598 -0.001596 -0.003456 -0.003026 0.010044 0.009210 
+0.000093 0.000402 -0.010500 -0.005729 -0.030229 -0.000792 
+-0.065054 -0.042914 0.036978 -0.037572 -0.000762 -0.002045 
+-0.029467 0.044393 -0.005404 -0.013916 0.022770 0.014548 
+-0.017922 0.004703 0.005623 0.005209 0.007497 0.000014 
+0.010937 0.010876 0.004479 0.009309 0.010853 0.020829 
+0.004967 0.017425 0.017414 0.006087 0.008117 0.006314 
+0.028867 0.006667 -0.015533 0.015632 0.036374 -0.025852 
+0.019171 0.008851 -0.022148 0.003999 0.003327 -0.006837 
+0.012822 0.006432 -0.009951 0.027692 0.019072 0.003897 
+-0.003463 -0.003015 0.002535 -0.000570 -0.000273 0.000192 
+0.005574 0.003492 0.002581 0.007074 0.001259 -0.002158 
+0.004169 0.002986 -0.002319 0.000042 0.001825 -0.001732 
+-0.000162 0.002438 -0.002241 0.001948 0.003021 -0.002993 
+0.002827 0.002732 -0.002410 0.001773 0.002906 -0.002220 
+-0.000836 0.001666 -0.000833 -0.003524 0.001611 -0.000614 
+-0.003125 0.002577 -0.003643 0.001019 0.003903 -0.002219 
+0.001120 0.000863 -0.003291 -0.001436 -0.007385 0.006771 
+0.005000 0.069375 0.079375 0.000582 -0.017547 0.037181 
+-0.006409 -0.017527 0.029914 -0.003419 -0.002393 0.011624 
+-0.005057 -0.003034 0.004146 -0.006788 -0.009301 0.001840 
+-0.011655 -0.005343 -0.013839 -0.016683 -0.001240 -0.018180 
+-0.013134 0.074521 -0.053321 0.070307 0.016015 -0.047165 
+0.016010 -0.008052 -0.002644 -0.024587 -0.032730 0.049127 
+-0.001818 0.040255 0.053673 -0.042725 0.023849 0.066160 
+-0.037193 0.032602 0.052193 0.103766 -0.119351 -0.018815 
+-0.092250 -0.094516 -0.109136 -0.041414 -0.101717 -0.081010 
+0.063559 -0.026742 -0.027177 0.035556 -0.060486 0.081736 
+0.008172 0.003614 0.047228 0.017382 -0.000945 0.022182 
+0.000297 -0.005127 0.021327 0.000848 -0.002789 0.004270 
+0.051731 0.018077 -0.021442 0.053317 0.052341 0.009049 
+0.034064 0.031358 0.036610 0.062873 0.008596 -0.011294 
+0.039035 0.003804 -0.011049 0.051627 -0.033135 -0.021730 
+0.095000 0.055000 0.000000 -0.094822 0.018904 0.018986 
+-0.208031 0.035483 0.068880 -0.118589 0.032928 0.031287 
+-0.100300 -0.084856 -0.032566 -0.153549 -0.156697 -0.039017 
+-0.059036 -0.104768 -0.002101 -0.001559 -0.019649 0.004550 
+0.001802 0.000934 0.000138 -0.012473 -0.004402 0.004231 
+-0.003220 0.000293 0.004643 0.002031 -0.003184 -0.001054 
+0.000228 0.005577 -0.009561 -0.028131 -0.052484 0.045556 
+-0.002448 -0.027832 0.006261 0.004558 0.037322 0.016809 
+-0.008765 -0.001358 -0.019753 -0.009153 0.006144 -0.015551 
+0.004240 0.013416 -0.025778 0.010179 0.002500 -0.003393 
+0.014266 -0.002149 0.002258 0.011721 -0.001990 0.005564 
+-0.007702 0.000877 -0.008798 -0.004545 -0.017005 -0.005241 
+-0.001252 0.002501 -0.000547 0.016209 0.008132 0.005242 
+0.016426 0.004361 0.009851 -0.000800 0.001067 -0.006667 
+0.010091 0.007326 0.002749 0.002890 0.000557 0.001642 
+-0.001092 -0.004303 0.004379 0.001975 -0.005104 0.001052 
+0.001693 -0.001821 0.002514 0.001685 -0.000207 -0.001718 
+0.001444 0.003058 0.000641 0.001151 0.004856 0.000835 
+0.002546 0.003482 0.001399 0.006717 0.001034 -0.000851 
+0.006836 0.001621 -0.001477 0.003846 0.002445 -0.001864 
+0.001523 0.001898 -0.001297 -0.001891 -0.001526 -0.001537 
+-0.001633 -0.001122 -0.004637 -0.000485 0.005562 -0.005523 
+0.002957 0.018817 -0.003908 0.010475 0.032042 0.009984 
+-0.010796 0.014994 -0.005597 0.002863 0.009905 -0.015173 
+-0.004231 -0.006111 0.001154 -0.009839 -0.005233 -0.014504 
+0.001232 -0.003735 -0.005939 -0.001751 -0.006127 0.006127 
+-0.009002 -0.008270 0.004623 -0.002202 0.002449 -0.002016 
+0.001905 0.043977 -0.025890 -0.011728 0.006515 0.071875 
+0.001372 0.003928 0.026997 -0.004762 -0.015238 0.030476 
+-0.005076 -0.008258 0.003333 -0.019181 -0.009965 0.012317 
+-0.032728 0.013031 0.028541 0.020343 -0.028645 -0.022487 
+-0.016162 -0.014141 0.022222 0.041000 -0.041000 -0.148000 
+0.004026 0.075455 -0.026494 0.000684 -0.003419 0.042222 
+0.054856 -0.032701 0.051954 0.035593 -0.058631 0.068504 
+0.015065 -0.019740 0.042597 0.006405 0.030850 0.024837 
+0.005235 0.016980 0.023893 0.034602 -0.011642 0.014309 
+0.073529 -0.007832 -0.012531 0.039657 0.010381 -0.024495 
+-0.000103 0.001712 0.003828 -0.013378 0.005878 0.011233 
+0.060083 0.124483 -0.025133 0.035714 0.000000 0.044286 
+-0.062818 0.043566 0.030400 -0.028229 0.017405 -0.000634 
+-0.024943 0.001952 -0.003163 -0.000340 -0.002731 -0.002370 
+0.011547 -0.019633 -0.011732 0.006449 -0.018089 -0.010209 
+-0.013170 -0.018337 -0.004834 -0.013836 0.007740 0.004965 
+-0.004589 0.000671 -0.015887 0.002912 0.021234 -0.028392 
+-0.001859 0.012086 0.070833 0.124400 -0.094000 0.062200 
+0.007826 0.052101 -0.025381 0.004795 0.066471 -0.017263 
+0.011201 -0.000662 -0.013309 0.008189 0.004571 -0.002340 
+0.010758 0.009233 -0.021134 -0.004643 0.000096 0.000862 
+-0.004972 -0.005835 0.010446 -0.004412 -0.003974 0.001104 
+-0.007965 -0.001290 -0.004685 -0.004537 -0.006574 -0.011574 
+-0.021832 0.000371 -0.001208 0.011625 0.010335 0.005706 
+0.033232 0.005600 -0.003498 0.013302 -0.015569 0.023781 
+-0.000528 -0.006415 -0.007334 -0.015837 -0.011186 -0.020689 
+-0.001965 -0.003702 0.000217 -0.003940 -0.000235 0.003625 
+0.001751 0.002278 0.004896 -0.003679 0.002582 -0.000032 
+-0.000340 0.001697 -0.001060 0.001194 -0.000734 -0.002257 
+0.003818 -0.001955 -0.001398 -0.000388 -0.001152 0.002133 
+-0.003402 -0.007799 0.003714 -0.005319 -0.007016 0.002708 
+-0.002960 -0.000080 0.000308 -0.000809 0.001434 -0.004772 
+-0.003235 0.003401 -0.003556 -0.001278 0.003870 -0.005380 
+0.000853 0.005359 -0.003773 0.002659 0.013226 -0.011530 
+-0.008194 -0.007639 0.000278 0.000083 0.000640 0.002269 
+0.011233 -0.004700 -0.003311 0.006194 -0.009205 0.005702 
+-0.001198 -0.015313 -0.000499 -0.001449 -0.012875 -0.006101 
+0.000746 -0.020223 -0.004677 0.025084 -0.022435 0.005991 
+0.043854 0.014167 -0.015521 0.018373 -0.022881 0.045988 
+-0.010085 -0.013836 -0.004456 -0.022812 -0.011439 0.019920 
+-0.008540 -0.022300 0.008780 -0.017317 -0.016578 0.014297 
+-0.027720 0.012354 0.020704 -0.069056 0.002861 0.028194 
+-0.133318 -0.069781 0.054255 -0.068915 -0.137884 -0.029550 
+-0.002372 0.027883 0.054184 0.040875 0.039764 0.032256 
+0.039111 -0.023222 0.042778 0.103889 0.093889 -0.039556 
+0.058073 0.008909 -0.054691 -0.000698 -0.004419 -0.005581 
+-0.012083 -0.002708 -0.032917 -0.007205 0.002088 -0.006684 
+0.006192 -0.013981 -0.017173 0.015443 -0.003670 -0.008869 
+-0.012810 -0.017149 0.014876 -0.030737 -0.065320 0.069157 
+-0.015589 0.023249 -0.040820 0.103333 0.072424 -0.087879 
+0.011831 0.016957 -0.065167 -0.007603 0.012707 -0.001456 
+0.000861 0.010840 0.007299 0.007600 0.010975 0.005597 
+0.017487 0.018344 0.006967 0.016877 0.018620 0.001181 
+0.006984 0.009174 -0.008651 0.002987 0.032230 -0.028426 
+-0.012164 0.011896 -0.051371 -0.013326 -0.017111 0.053201 
+0.002429 0.077857 0.004857 -0.007391 -0.027787 -0.127708 
+-0.015714 -0.079643 -0.151429 0.010136 0.028723 0.007455 
+0.015633 0.034902 0.019337 0.009419 0.006569 -0.024378 
+-0.002649 -0.013481 -0.006501 0.006693 -0.005747 -0.003653 
+0.002931 -0.002010 0.003217 0.011262 -0.009725 0.005945 
+0.011063 -0.007795 -0.002444 -0.038921 -0.028724 0.011108 
+-0.009942 -0.014424 -0.003624 -0.003008 0.004411 -0.000312 
+0.002644 0.003013 -0.005076 0.016687 -0.008832 -0.007268 
+0.014452 -0.019307 0.024384 -0.000967 -0.110670 0.033989 
+0.000849 -0.002566 0.001116 -0.003739 -0.002195 -0.000059 
+-0.005367 0.002415 0.005827 -0.003908 0.001675 0.004444 
+0.000864 0.006247 0.000080 0.001923 0.001940 -0.003429 
+0.002088 -0.000824 -0.004505 0.004288 -0.001756 -0.000015 
+0.004445 -0.001207 0.000445 0.000847 -0.003336 0.002265 
+-0.000495 -0.001144 0.001787 0.002401 0.003358 -0.001374 
+0.003151 0.006574 -0.007507 0.001650 0.008624 -0.010313 
+-0.000046 0.005990 -0.013306 -0.002003 0.002597 -0.023931 
+0.022662 -0.000534 -0.026657 0.007851 0.000781 0.006549 
+0.023088 0.010760 -0.008295 0.024320 0.015544 -0.013350 
+0.006384 0.006633 -0.006166 -0.003229 0.000687 0.000523 
+0.004170 -0.018288 -0.004472 0.015564 -0.073616 -0.028175 
+0.072327 0.046545 -0.040836 0.002778 0.001667 0.021111 
+-0.004247 -0.007475 0.006116 0.000308 0.000615 -0.025769 
+0.006949 0.010944 -0.026922 0.024339 0.028347 -0.016612 
+0.037004 0.042598 0.001936 0.019507 0.034480 0.035661 
+-0.029280 0.020184 0.035155 -0.014832 0.003844 0.001990 
+0.069063 0.011775 0.000198 0.169391 0.020309 -0.048290 
+-0.014333 -0.009667 -0.004667 0.019802 0.073175 -0.003016 
+0.000714 0.023929 -0.023929 -0.009841 -0.009683 0.007302 
+-0.031895 -0.017692 -0.025516 -0.026475 0.005325 -0.036000 
+0.006667 0.021933 -0.002633 0.027302 -0.013492 -0.000317 
+0.015559 -0.010538 -0.006151 0.005392 0.004850 -0.056601 
+0.013556 0.014439 0.032807 0.015584 0.060390 0.009740 
+0.000312 0.022911 0.018118 0.003979 0.027383 0.000378 
+0.014000 0.018000 -0.016667 0.021773 0.005604 -0.017804 
+0.022655 0.007696 -0.006201 0.011613 0.000000 -0.001290 
+-0.003197 0.009270 -0.010869 0.058153 0.041826 -0.062932 
+-0.002922 0.059294 0.004863 -0.005979 -0.047491 0.042509 
+-0.095278 0.028889 -0.020278 -0.108437 0.136092 -0.143854 
+0.049686 -0.064591 0.034780 0.028011 -0.047212 -0.031315 
+-0.002969 0.037826 -0.000767 -0.007738 0.007468 -0.002262 
+-0.002099 -0.007402 -0.007906 0.004872 0.003432 -0.008087 
+0.001550 -0.001939 0.000474 0.001439 -0.001410 0.001389 
+-0.013215 -0.024031 -0.000079 0.027348 -0.051515 0.032121 
+-0.033609 -0.109323 0.060827 -0.046027 -0.066474 0.073050 
+-0.017542 -0.034036 0.036011 0.049117 0.014925 -0.031779 
+0.022603 0.063953 -0.054141 -0.013467 0.002539 0.001950 
+-0.000797 -0.000149 0.002987 0.001185 -0.001102 0.001267 
+-0.004648 -0.000531 0.001613 0.000177 0.002243 0.001660 
+-0.000792 0.003835 0.000135 0.001767 0.004604 -0.005701 
+-0.000299 0.000922 -0.007472 0.000866 -0.001683 -0.003007 
+-0.002734 -0.001301 0.003032 -0.004040 -0.004151 0.008716 
+-0.001613 -0.008095 0.007586 -0.001199 0.000426 0.004405 
+-0.001455 0.001639 -0.003567 -0.001410 0.006908 -0.005762 
+-0.002064 0.003809 -0.008385 0.003789 -0.022044 -0.004631 
+-0.056620 -0.168944 0.144084 0.093325 -0.000169 0.070233 
+0.081631 0.028768 -0.035547 0.038061 0.013641 -0.019829 
+0.015412 0.012101 -0.027495 0.003612 -0.000446 -0.022913 
+-0.005419 -0.020479 -0.018342 -0.018559 -0.009189 -0.025586 
+0.079474 0.100789 -0.028684 0.024335 0.027376 0.015216 
+0.039751 0.019695 -0.018199 0.029565 0.012391 -0.012826 
+0.002800 0.001120 0.000560 -0.001271 -0.000769 0.001438 
+0.014850 0.011529 -0.004298 0.022221 0.011965 -0.002279 
+0.038320 0.013686 -0.013686 0.058562 0.033079 -0.016876 
+0.002857 0.087143 0.000000 0.061457 0.074884 -0.015752 
+-0.026051 0.104650 -0.010598 -0.044188 -0.008803 -0.002991 
+0.006422 0.002444 0.000156 -0.017139 -0.020566 0.035455 
+-0.005517 -0.018723 -0.016317 -0.007769 -0.017118 -0.010501 
+0.004921 -0.000238 -0.002381 0.026458 -0.005833 -0.014792 
+0.062115 0.004950 -0.047185 0.043134 0.011343 -0.111990 
+0.056837 0.038673 -0.065918 0.010954 0.005729 0.032987 
+-0.012314 0.018943 -0.010610 -0.029045 0.007862 -0.002875 
+0.026500 0.014294 -0.023824 0.037475 0.010078 -0.017951 
+0.002395 0.002880 -0.009140 -0.003612 0.000254 0.001360 
+0.004068 0.010202 -0.011537 0.015972 0.016899 -0.022044 
+-0.014286 -0.042984 0.057524 -0.078003 0.006764 -0.024753 
+-0.043333 0.110634 0.023707 -0.011487 0.069009 -0.017259 
+-0.008137 0.004706 0.001863 0.002328 -0.004302 -0.001728 
+-0.004118 0.004252 -0.010379 -0.006810 0.013708 -0.006178 
+-0.001348 0.001744 -0.001164 0.003920 -0.001874 0.003254 
+0.019202 -0.002981 -0.016451 0.008889 0.012751 -0.001063 
+0.003529 0.018261 -0.019713 0.006931 0.017685 -0.017386 
+0.002963 -0.005259 -0.001074 -0.019756 -0.017118 0.019941 
+-0.017576 -0.024506 0.028765 -0.025134 -0.025931 0.019629 
+0.015000 -0.010800 -0.005400 0.032839 0.042258 -0.002065 
+0.002067 0.002216 0.001034 -0.001322 0.001306 0.002612 
+-0.004288 0.000553 0.002629 -0.002750 -0.001133 0.000850 
+0.000528 0.000472 0.000028 0.003223 0.002479 -0.003471 
+0.000697 0.001697 -0.002269 -0.001140 -0.003270 -0.000577 
+0.002007 -0.005083 0.000298 -0.011574 -0.006325 0.006352 
+-0.001546 -0.009820 0.002238 0.000743 -0.001815 0.001374 
+-0.001410 0.001129 0.006344 0.000982 0.000229 0.004016 
+0.000991 -0.002576 0.003747 -0.003995 -0.013203 0.001021 
+-0.066032 -0.076825 0.021587 0.030638 -0.003699 0.001760 
+0.025000 0.113617 0.008115 0.002979 -0.007340 0.000106 
+-0.000285 -0.013758 -0.014423 0.022315 -0.011715 -0.035843 
+0.022632 0.004211 -0.024737 0.020131 0.008075 -0.024795 
+0.009150 -0.000485 -0.019175 0.028413 -0.065079 -0.054444 
+-0.017298 0.006402 0.014736 0.004888 0.009177 -0.004550 
+0.011421 -0.002292 -0.002661 -0.001378 0.014348 0.004824 
+-0.011297 0.017075 0.009192 0.007222 0.025000 0.016667 
+0.009928 0.019952 0.023230 -0.000596 0.040456 -0.036877 
+0.007865 0.036672 -0.078587 -0.029699 0.048849 -0.097050 
+0.011071 0.075464 -0.043607 0.031250 0.016250 0.047500 
+0.088333 0.035556 0.029444 -0.019067 -0.054752 -0.024927 
+-0.016204 -0.055527 -0.011452 -0.021053 -0.021579 -0.022368 
+-0.007081 -0.015434 -0.028434 -0.026191 0.007280 -0.020732 
+0.012893 0.004678 0.005983 0.041157 0.007810 -0.019628 
+0.023370 0.011775 0.009783 0.007168 0.027369 0.005095 
+-0.014858 0.018610 -0.019114 -0.015000 -0.002533 -0.022795 
+0.014629 0.027066 -0.023119 -0.035991 -0.017877 0.021014 
+-0.004851 -0.036844 0.009101 0.001019 -0.007392 -0.010194 
+-0.002088 0.018032 -0.011473 -0.000959 0.005917 -0.002049 
+-0.028061 -0.058633 -0.003421 -0.065860 -0.011917 -0.011207 
+-0.052222 -0.044828 0.017931 -0.025148 -0.096763 0.069907 
+-0.037333 -0.072451 0.009056 -0.010340 0.018600 0.011020 
+0.024528 0.010587 0.010236 -0.030728 -0.020940 0.016830 
+-0.016348 -0.001724 0.004387 0.063571 0.057258 -0.054244 
+0.053975 0.058053 -0.009229 0.020036 0.014030 0.002363 
+0.002229 0.003142 -0.005085 0.005750 0.012540 -0.034884 
+0.022017 0.018403 -0.077143 0.013422 -0.032015 -0.061279 
+-0.008865 -0.029795 -0.025499 -0.010000 0.001333 0.005333 
+0.013312 -0.033161 -0.010626 0.030885 -0.069410 0.004617 
+0.002137 -0.001381 0.000276 -0.002348 -0.002111 0.000480 
+-0.007318 -0.004965 0.003779 -0.005962 -0.002408 0.005022 
+-0.003551 0.000164 0.001015 -0.000932 0.003626 0.000904 
+-0.000088 0.007204 -0.001413 0.002294 0.005910 -0.000156 
+0.002762 0.004358 -0.000503 0.002515 -0.000070 -0.000470 
+0.000049 -0.001046 0.000290 -0.000451 -0.003786 0.001582 
+-0.002894 -0.001810 0.003799 0.000879 -0.000424 0.002139 
+0.002117 0.000397 0.002692 -0.001180 -0.001172 -0.000752 
+-0.018191 0.016350 -0.030568 -0.062857 -0.000162 -0.001216 
+-0.004234 -0.001674 -0.004749 -0.005358 0.001494 0.000574 
+-0.018965 0.011315 0.005281 -0.005619 0.009674 -0.026775 
+0.014668 0.020657 -0.032482 0.020292 0.009329 -0.007036 
+0.002652 -0.003106 -0.033187 -0.021275 0.019068 -0.034373 
+-0.012000 0.006000 0.011000 0.002588 -0.002118 -0.000588 
+0.009439 -0.012908 0.005459 0.011132 -0.017665 -0.001699 
+0.006079 -0.009669 0.002004 0.015592 0.016551 0.000087 
+0.035625 0.039106 0.022346 -0.003530 0.027153 0.026066 
+-0.009762 0.015119 0.008810 0.045000 0.059744 -0.089615 
+0.010350 0.025125 0.055675 0.003857 -0.000714 0.005571 
+0.021043 -0.019478 0.002826 -0.030363 -0.086169 0.045605 
+-0.035000 -0.070000 -0.005833 0.003571 0.000000 -0.002143 
+0.023627 -0.053039 -0.019608 0.004143 -0.073714 -0.011429 
+0.024167 -0.078333 -0.054167 0.011296 0.083037 -0.109593 
+0.054696 0.107955 -0.042895 0.038832 0.107531 -0.006245 
+0.003390 0.027153 -0.003964 -0.003461 -0.003718 -0.003164 
+-0.003610 -0.003209 0.003209 -0.006370 -0.012912 0.014714 
+0.004960 0.001379 -0.002481 0.018953 0.009549 -0.026766 
+0.020378 0.003774 -0.027034 0.025181 -0.010000 -0.045327 
+0.058822 -0.003533 -0.010716 0.061853 -0.007626 -0.008473 
+0.028444 -0.022169 0.003045 -0.004160 -0.035462 0.004496 
+0.000000 -0.051538 0.012308 -0.009864 0.005147 -0.016871 
+0.021788 0.037092 -0.020362 -0.005724 -0.009483 -0.009034 
+-0.043750 0.000000 0.000000 -0.046794 0.029299 -0.016319 
+-0.055006 -0.006904 -0.023081 -0.035873 -0.028170 0.017914 
+0.001621 -0.001442 0.012797 0.015896 -0.010208 0.005650 
+0.004267 -0.006007 0.004453 -0.013932 0.031824 -0.045243 
+-0.015556 -0.034444 -0.042222 0.068708 0.017597 -0.051783 
+-0.002302 -0.036349 0.007937 0.060875 -0.022290 -0.022952 
+-0.002777 -0.008776 0.001995 -0.000929 -0.008698 0.001831 
+-0.002027 -0.007121 0.001399 -0.004416 -0.004743 -0.000481 
+-0.004148 -0.001417 -0.001728 -0.000228 0.002571 -0.000303 
+0.003502 0.004729 -0.003285 0.005360 0.004988 -0.001486 
+0.005611 0.006639 -0.001240 0.005674 0.006986 -0.002589 
+0.001462 0.006132 -0.001981 0.000562 0.004045 -0.003071 
+0.001167 0.003600 -0.003383 -0.000102 0.004471 -0.001014 
+0.000949 0.004058 0.000750 0.000937 0.001030 0.001017 
+-0.010586 0.013204 -0.011210 -0.006377 0.029855 -0.042464 
+0.017525 0.001211 -0.028783 0.024033 0.006447 -0.015089 
+-0.004465 0.000821 0.000702 -0.016000 -0.004108 -0.000685 
+-0.021794 -0.012337 -0.006497 -0.015332 -0.015760 -0.025975 
+-0.011593 0.000300 -0.022385 0.004518 -0.010459 0.031177 
+0.004106 -0.000500 0.003160 -0.000640 -0.006405 -0.001377 
+-0.006848 0.008768 0.001290 -0.021997 0.016766 -0.003806 
+-0.013804 -0.019333 -0.003451 -0.001765 0.003245 0.001298 
+0.006659 0.012494 -0.008015 0.016154 -0.008077 -0.010385 
+-0.057345 0.001130 0.035537 -0.007011 0.003978 0.001258 
+0.010264 -0.020989 -0.031560 0.070223 0.006957 -0.041280 
+-0.051101 0.009256 0.024345 -0.033216 0.017122 -0.004338 
+-0.002785 -0.007785 -0.003963 0.020470 0.008012 0.008122 
+0.002784 -0.009344 -0.021720 -0.056119 -0.030261 -0.007338 
+0.070921 -0.041905 -0.070381 0.091111 0.087778 -0.087778 
+-0.000509 0.021928 0.031004 -0.039473 0.019898 0.065680 
+-0.006337 0.000110 0.056703 -0.027257 -0.032005 0.025808 
+-0.030574 -0.017926 0.022204 -0.002545 -0.000027 0.012804 
+-0.003796 0.011843 -0.018295 0.007504 0.008563 -0.081393 
+0.007889 0.017300 -0.033388 0.007387 0.004081 -0.018223 
+0.033899 0.010569 -0.011633 0.037228 0.013052 0.008177 
+0.040122 0.007779 0.011654 0.022308 -0.003840 -0.000800 
+-0.003416 0.022189 -0.035416 0.001709 -0.003166 -0.016433 
+0.026637 0.034008 -0.024310 0.005927 0.032418 -0.038273 
+-0.056311 -0.018446 -0.007982 -0.107958 -0.005789 -0.025470 
+-0.067790 -0.003559 -0.017207 -0.012941 0.000471 0.000235 
+0.032209 -0.000116 -0.016206 0.043772 -0.012233 -0.065339 
+0.022914 0.010650 -0.094885 0.017218 0.076692 -0.042782 
+-0.021150 0.048208 -0.034935 0.013184 0.010136 -0.022154 
+-0.038673 -0.031515 -0.045220 -0.027003 0.026801 -0.094310 
+0.003572 0.000225 0.000459 0.002958 -0.000531 -0.000242 
+0.002661 -0.000023 -0.000001 0.000766 0.000749 0.000163 
+-0.000218 0.000656 0.000031 -0.001213 0.001831 -0.001434 
+0.000137 0.000483 -0.001198 0.002491 0.005381 0.000243 
+0.002003 0.005623 0.002803 0.002107 0.003298 0.003311 
+-0.000822 0.001684 -0.004071 -0.003142 0.003581 -0.006699 
+-0.002362 0.003849 -0.006591 -0.000460 0.003883 -0.001004 
+0.000168 0.005716 -0.000296 -0.006040 0.025524 -0.011590 
+0.004742 0.089635 -0.028114 0.022442 0.046136 -0.059280 
+-0.001361 0.001182 -0.012785 -0.000562 -0.003574 -0.004601 
+-0.002303 -0.016611 -0.006124 -0.014917 -0.003201 0.004994 
+-0.033793 -0.033103 0.000690 -0.009331 -0.002738 -0.002473 
+0.016870 0.003602 -0.024434 -0.000005 -0.008243 0.016519 
+0.006495 -0.007977 0.009919 0.004501 -0.004927 -0.007746 
+0.014737 -0.019903 -0.013726 -0.017130 0.001852 -0.007870 
+-0.018857 0.001429 -0.013048 -0.006496 0.017222 0.000812 
+0.012627 0.047692 -0.007365 -0.031818 0.069364 -0.009909 
+0.032462 0.016154 0.029692 -0.002143 0.010394 0.025985 
+0.014051 0.004872 0.017333 0.034537 -0.006863 -0.004951 
+0.003133 0.000430 0.001202 -0.009333 -0.000736 -0.001839 
+0.004857 0.006952 -0.030571 -0.003127 -0.010031 -0.028793 
+0.000057 -0.012286 -0.015314 0.006138 -0.000207 -0.017198 
+0.034622 0.055736 -0.059940 0.010714 0.063571 -0.005714 
+-0.031515 -0.183939 0.089394 -0.033129 -0.066699 0.082158 
+-0.060499 -0.016471 0.003781 -0.050989 -0.008847 -0.009448 
+-0.021071 -0.016429 0.011786 0.013408 0.021622 -0.012571 
+0.008054 -0.012081 -0.077647 -0.017397 -0.056947 -0.026888 
+-0.038310 0.011548 0.072798 0.021921 0.043589 0.020402 
+-0.000751 0.004130 0.002253 0.012796 0.017241 0.014001 
+0.044000 -0.056000 0.000000 -0.008675 -0.056780 0.012938 
+-0.011581 -0.027979 0.027430 -0.009647 -0.019354 0.016130 
+0.021778 0.038548 -0.007630 0.030289 0.074706 0.001044 
+0.009748 0.066212 0.009952 -0.007825 0.053649 0.013860 
+-0.023773 0.025227 0.002182 0.000000 0.015909 -0.005000 
+0.012500 0.020417 0.000000 0.005633 0.038423 -0.013994 
+0.005559 0.033060 -0.009242 -0.001818 -0.034425 0.019125 
+-0.017513 -0.022931 0.063533 -0.011471 -0.035042 0.031914 
+-0.023846 -0.078846 0.010385 -0.024356 -0.050000 0.018267 
+-0.000019 -0.006310 -0.000790 -0.002490 -0.006529 0.001501 
+0.000851 -0.002358 -0.000106 0.003869 0.001989 0.001223 
+0.002465 0.003674 0.001060 0.001069 0.005486 -0.000103 
+-0.002092 -0.000523 -0.003095 0.001258 0.003363 -0.000890 
+0.001465 0.003621 0.001930 0.003270 0.002375 0.002703 
+-0.000419 0.000446 0.001424 -0.000182 -0.001301 -0.001290 
+0.001997 -0.002802 -0.001980 -0.002221 -0.003737 -0.001302 
+-0.004796 -0.000594 -0.007009 -0.005652 0.018655 -0.024362 
+0.019950 0.058487 -0.055761 -0.008034 0.051681 -0.016564 
+0.000830 0.001810 -0.000362 -0.008318 -0.004685 0.011791 
+0.000745 -0.000591 -0.005543 0.028090 0.058586 -0.041744 
+0.037335 0.050140 -0.021969 0.002121 -0.004218 -0.003466 
+0.022488 0.009569 -0.018356 0.023244 -0.000188 -0.022210 
+0.017341 -0.005269 -0.014893 0.018584 -0.015724 -0.017729 
+0.030550 -0.077225 -0.040310 0.081367 -0.057551 -0.055898 
+-0.012359 -0.044267 -0.044940 0.005000 0.029706 0.011176 
+0.012518 0.017735 0.009702 -0.030179 0.021909 0.014694 
+0.007343 0.025133 0.005561 -0.001683 0.031100 0.024494 
+-0.010821 0.010718 0.026080 0.009582 -0.000902 0.009692 
+0.026338 0.019331 -0.008134 0.000078 0.031744 -0.010269 
+0.015983 0.016661 0.014358 0.042810 0.013595 -0.014405 
+0.035171 0.033115 -0.035399 0.026090 0.061356 -0.004938 
+-0.008613 0.045407 -0.027474 -0.059993 -0.064338 -0.030782 
+0.022803 -0.078356 -0.056038 -0.004444 -0.017222 -0.018333 
+-0.013774 0.010915 0.004724 -0.026421 0.000181 0.011763 
+0.019439 -0.004258 0.001076 0.060367 0.049779 -0.036188 
+-0.005810 0.041758 -0.008322 0.043167 0.042133 0.015767 
+0.065833 -0.028667 0.014333 -0.004630 -0.029463 0.047352 
+-0.006496 -0.022737 0.012992 0.012842 -0.017532 0.013014 
+-0.023970 -0.045638 0.031513 -0.042847 -0.047937 0.042528 
+-0.029743 -0.033343 0.044531 -0.019440 -0.030524 0.008238 
+-0.001678 -0.003672 -0.000108 0.014363 0.037234 0.002915 
+0.038740 0.065727 0.006319 0.001472 0.040578 0.003514 
+-0.016907 0.015263 0.002113 -0.014879 0.003691 -0.000586 
+-0.002917 0.004307 0.000893 0.016407 0.012651 0.001288 
+-0.008469 0.015727 0.000129 -0.053568 -0.006219 0.015141 
+-0.017057 -0.012429 0.019707 -0.018080 -0.017552 0.009858 
+-0.029946 -0.042571 0.012388 -0.050133 -0.009204 0.000436 
+-0.001000 -0.000904 0.001258 0.001797 -0.001551 -0.000812 
+0.002574 -0.005731 0.003302 0.005154 -0.002717 0.003585 
+0.004305 0.002669 -0.000658 0.002990 0.007194 -0.004030 
+0.000961 0.007262 -0.006289 0.000694 0.003924 -0.004671 
+-0.001166 0.000617 -0.003270 -0.003087 -0.000571 -0.003896 
+-0.001835 0.002680 -0.001196 -0.000829 -0.003329 -0.000372 
+-0.003614 -0.005802 0.001889 0.000189 -0.002297 -0.002963 
+-0.002622 0.000626 -0.008182 -0.003955 0.008713 -0.010994 
+-0.002408 0.009882 -0.004106 0.012604 0.003354 0.005301 
+0.001164 -0.007027 0.001746 -0.000523 0.000697 0.017436 
+-0.007466 -0.026501 0.004105 -0.003487 0.009568 -0.018852 
+0.032174 0.031409 -0.057987 -0.001069 0.001566 -0.014438 
+0.016014 0.017653 -0.000149 0.020251 0.010700 -0.019133 
+0.018909 0.021812 -0.038596 -0.001501 0.001876 0.036923 
+-0.002364 0.006364 -0.004727 0.006111 -0.022222 -0.038333 
+0.023025 -0.048012 -0.078385 0.014413 0.040810 -0.000972 
+0.018590 0.003071 0.003118 0.011298 0.007137 0.007714 
+0.001227 0.001646 0.010071 0.009776 -0.010387 0.016000 
+0.004204 -0.004109 0.005436 0.009807 0.018920 -0.000521 
+-0.005179 0.018862 -0.006470 -0.008431 0.016592 -0.018772 
+0.042867 0.034056 -0.002937 0.017379 -0.014398 -0.010223 
+0.011450 -0.012065 -0.009478 0.007262 -0.000920 0.003805 
+-0.000973 0.012137 0.001034 0.013083 -0.004727 0.012630 
+-0.014409 -0.012136 -0.017636 -0.017440 0.013637 -0.000915 
+-0.016156 -0.018792 0.044256 -0.007489 -0.013135 0.031132 
+0.021908 0.001191 0.002250 0.018994 0.033346 0.009012 
+-0.017212 0.047607 -0.002198 0.039718 0.084075 -0.046677 
+0.076071 -0.025101 0.040929 -0.009473 -0.076683 0.080112 
+-0.012958 -0.017592 0.017756 -0.015188 -0.015806 0.010923 
+-0.020753 -0.015905 0.004081 -0.015122 -0.003957 -0.001088 
+-0.009669 0.000625 -0.001381 -0.007310 -0.003379 -0.001521 
+-0.002305 -0.009748 0.000304 -0.002653 -0.013571 0.004016 
+-0.005773 0.005815 -0.003151 0.017500 0.014584 -0.009499 
+0.038154 0.001621 -0.002412 0.022527 -0.012992 0.008927 
+-0.017296 -0.032294 0.017656 0.018000 -0.036722 0.018980 
+0.008202 -0.034462 0.018958 -0.018853 0.005593 0.002612 
+0.000108 0.009226 -0.005461 -0.013698 0.007239 -0.004333 
+-0.028550 -0.002291 -0.007368 -0.029841 0.007029 -0.004598 
+0.000019 0.002000 -0.000008 0.000754 0.000228 -0.001420 
+0.002092 -0.000236 -0.001292 0.002434 -0.002236 0.001098 
+-0.001684 -0.001747 0.003693 -0.000598 -0.000335 0.000486 
+0.002214 0.002233 -0.000673 -0.000016 0.004209 -0.000608 
+-0.000835 0.003092 -0.002580 -0.001187 0.001720 -0.002574 
+-0.004284 0.003505 -0.001669 -0.003474 -0.003202 0.000350 
+-0.004727 -0.001891 0.002389 -0.000034 0.000267 -0.000916 
+-0.001309 -0.002306 -0.007529 -0.001699 -0.010673 -0.009722 
+0.007819 -0.006141 -0.001482 0.002084 -0.000293 0.003380 
+-0.001516 0.002653 -0.008958 -0.006134 -0.000729 -0.001073 
+-0.008211 -0.004684 -0.007411 -0.011113 0.003512 0.000004 
+-0.006066 0.003858 0.004224 0.025107 0.016072 -0.006397 
+0.021926 0.034558 -0.023475 0.019906 0.025104 -0.028192 
+0.026665 0.018640 -0.033835 -0.036744 -0.018953 0.042287 
+-0.072636 -0.031636 0.069091 -0.062435 -0.049627 0.011006 
+0.048364 0.028249 -0.072327 0.012790 0.018734 -0.002342 
+0.012110 0.028087 -0.004063 0.011503 0.002543 -0.018497 
+0.020691 -0.006968 -0.016467 0.020625 -0.008750 -0.012505 
+0.014392 -0.002751 -0.006561 0.004129 -0.001709 -0.010819 
+-0.003981 0.011101 -0.022816 0.021303 0.029576 -0.028697 
+0.009954 -0.012685 0.004630 0.010756 -0.010781 0.001164 
+0.006310 -0.011310 -0.004167 0.005996 -0.022710 0.010037 
+0.028519 -0.067977 0.018264 0.049167 0.064741 -0.035967 
+0.001735 0.009898 0.014490 0.004617 -0.045868 0.033432 
+-0.000829 -0.042527 0.028951 0.003204 -0.024311 0.019693 
+0.003058 -0.001205 0.006619 0.001725 0.002103 0.008316 
+-0.020245 0.009216 -0.006422 0.032992 -0.028314 -0.080507 
+-0.043025 -0.010533 -0.002676 -0.115804 -0.021294 0.025804 
+-0.012840 -0.011358 0.002716 0.002633 -0.002068 -0.001297 
+-0.001753 0.006669 0.000722 0.004205 0.007923 0.000216 
+0.000929 0.005603 -0.000364 -0.006145 0.004175 -0.000479 
+0.001451 0.003305 -0.001819 0.012402 0.008568 -0.008092 
+0.018563 0.014974 -0.012540 0.016763 0.016463 -0.012366 
+0.012592 0.011935 -0.009768 0.005926 0.007541 -0.006885 
+-0.000957 0.001668 -0.001465 0.000387 -0.004315 0.003726 
+0.001543 -0.001971 0.001803 -0.001142 0.004173 -0.003016 
+-0.006717 0.006196 -0.002912 -0.010125 0.005921 -0.004154 
+-0.008637 0.003855 -0.003953 -0.003589 -0.000501 0.002270 
+-0.002371 -0.000642 -0.001647 -0.001675 0.000045 -0.003633 
+-0.001827 0.002528 -0.002620 0.000922 0.000159 0.001123 
+-0.005826 -0.001606 0.007668 -0.006017 -0.004304 0.002911 
+-0.002998 -0.004315 0.000382 -0.002698 -0.001558 -0.001069 
+-0.000749 0.000443 -0.001742 -0.000564 0.002258 -0.001865 
+-0.000746 0.005914 -0.000950 0.006681 0.003796 -0.004178 
+0.002525 0.001025 -0.002611 0.002121 -0.003661 -0.000879 
+-0.003498 -0.019902 -0.002525 -0.009692 -0.028981 -0.001192 
+-0.010235 -0.000034 -0.017678 -0.365923 0.098906 -0.204442 
+-0.034871 -0.013420 -0.054844 -0.001623 0.003103 -0.029388 
+-0.001284 0.012964 -0.021020 0.013595 0.009039 0.002850 
+0.005520 0.016201 0.000229 0.004921 0.023439 -0.011784 
+0.010291 0.049537 -0.020935 0.048058 0.068883 -0.039515 
+0.014396 0.007405 0.001514 -0.002194 -0.002603 -0.002571 
+-0.024832 -0.001615 0.031980 -0.012100 -0.010587 0.008182 
+-0.067912 0.161264 0.046209 -0.003047 -0.000848 0.026494 
+0.002964 0.000915 -0.003536 0.009591 0.004684 -0.012702 
+0.004843 0.000319 -0.016392 0.003685 -0.001997 0.001205 
+0.005943 0.004450 -0.018883 0.002508 -0.007265 -0.007871 
+-0.002003 -0.016167 -0.014094 0.040468 -0.020087 -0.019645 
+0.018635 -0.008495 0.006573 0.000159 -0.011102 0.015079 
+0.010250 0.008588 0.021516 0.024637 0.008720 -0.025363 
+0.074797 -0.098881 -0.008811 0.067624 0.088626 -0.001105 
+-0.006437 0.013317 -0.004767 0.013760 -0.009932 -0.008587 
+0.004510 -0.003502 -0.002797 -0.005869 -0.003635 0.000096 
+0.009222 -0.004202 0.008003 0.031834 -0.032591 0.074564 
+0.000000 -0.052222 0.016667 -0.008273 0.002881 -0.028329 
+-0.005187 0.003090 -0.008451 -0.028873 -0.057164 0.013581 
+-0.026029 -0.031621 0.024609 0.000424 0.009526 -0.002882 
+0.006391 0.009449 -0.005143 0.011801 -0.003861 0.001089 
+0.001873 -0.015116 0.008415 -0.007427 -0.013379 0.010318 
+-0.003603 -0.006452 0.004976 0.005830 0.002899 -0.002750 
+0.009363 0.009329 -0.004520 0.004742 0.010443 -0.003248 
+-0.000328 0.007347 -0.001626 -0.001452 0.002681 -0.000241 
+0.000843 0.001210 -0.000431 0.003827 0.003291 -0.001222 
+0.005904 0.006686 -0.001821 0.004491 0.009649 -0.002567 
+0.002292 0.011662 -0.004498 0.002143 0.010711 -0.007752 
+0.003516 0.005794 -0.006861 0.003514 -0.000338 -0.001322 
+0.000351 -0.000668 -0.000236 -0.001560 -0.001123 0.000151 
+-0.003571 -0.001579 0.001128 -0.003426 -0.002320 0.001832 
+-0.001732 -0.001570 0.002171 0.001397 -0.000986 -0.001582 
+0.003618 0.000140 -0.002616 -0.000983 -0.000267 -0.000474 
+-0.001572 0.002785 0.000328 -0.000116 0.003152 0.000003 
+0.003183 0.008224 -0.005362 0.004710 0.013568 -0.007092 
+0.001809 -0.003290 -0.001883 0.001434 -0.003963 -0.003968 
+0.000793 -0.010263 0.000819 -0.000672 -0.009417 0.005661 
+-0.019638 -0.006899 -0.008140 -0.872490 -0.048450 -0.350163 
+-1.019853 0.144620 -0.149756 -0.011935 0.013124 -0.035613 
+0.013255 0.019749 -0.029816 0.020226 0.003550 -0.014219 
+0.006005 -0.004250 -0.003154 0.004361 0.000361 -0.007556 
+0.000563 0.009230 -0.001810 -0.009387 0.007434 0.023193 
+-0.019980 0.013223 0.023743 -0.015515 0.003864 0.000198 
+-0.025789 -0.007735 0.007052 -0.029240 -0.028733 0.020554 
+-0.026628 -0.005803 0.037895 0.005506 0.004990 0.021681 
+-0.007291 -0.014771 0.021945 -0.010416 -0.009323 0.001530 
+-0.006842 0.000728 0.000993 -0.006697 0.003798 -0.010569 
+0.013826 -0.008069 -0.007429 0.018320 -0.012791 0.030407 
+0.001990 -0.009754 0.009109 0.006213 -0.004435 -0.009058 
+0.003185 0.000441 -0.001956 -0.001271 -0.004797 0.008197 
+-0.001644 -0.005648 0.020450 -0.003779 -0.003314 -0.037676 
+-0.006488 0.024048 -0.067560 0.029974 -0.040130 0.016442 
+0.009379 -0.020485 0.019573 -0.001900 -0.006296 0.010423 
+-0.005100 -0.007224 0.014097 0.001205 0.003749 0.022093 
+0.005923 0.013173 0.002741 0.010012 0.006737 0.015006 
+0.044594 0.035635 -0.083432 0.048927 0.020715 -0.019155 
+-0.021789 0.000122 0.029214 0.003274 -0.026071 0.033869 
+-0.001422 -0.001553 0.004407 -0.010294 0.013793 -0.007182 
+-0.000344 0.010741 -0.007336 0.005394 0.001696 -0.002286 
+0.002605 -0.004477 0.002073 -0.004492 -0.005805 0.002696 
+-0.006159 -0.001873 0.001545 -0.003682 0.001161 0.000146 
+-0.003660 0.001834 -0.000513 -0.004178 0.003367 -0.000875 
+-0.001899 0.005645 -0.000498 0.001143 0.003990 -0.000628 
+0.000692 -0.001068 -0.000083 -0.002846 -0.005007 -0.000521 
+-0.001607 -0.004005 -0.001888 0.002344 -0.001548 0.000046 
+0.000779 0.000047 -0.005155 0.000499 -0.001801 -0.007121 
+0.007280 -0.002377 -0.007650 0.007720 0.002620 -0.003999 
+0.002521 -0.000619 -0.001599 0.001066 -0.002034 0.000048 
+0.001784 -0.002142 0.001448 0.001603 -0.000455 0.000569 
+0.001832 0.001475 -0.002511 0.005665 0.002581 -0.004532 
+0.003714 -0.003419 -0.008725 -0.000179 -0.002658 -0.006788 
+-0.002733 0.001538 -0.001763 -0.006749 0.004499 0.004623 
+-0.004259 0.005385 0.005324 0.001584 0.003960 -0.001980 
+-0.002329 0.001616 -0.004713 0.002967 -0.007357 -0.006645 
+0.012146 0.005108 -0.001916 0.003933 -0.001810 0.003411 
+0.001633 -0.002211 0.018059 0.001130 -0.002451 0.016070 
+0.006481 0.000015 0.008043 0.006465 0.003443 0.003828 
+0.004719 0.033983 -0.019827 0.031081 0.004209 -0.019569 
+0.000939 -0.001115 -0.003186 -0.005472 -0.006612 0.019608 
+-0.001477 -0.014894 0.007022 -0.001671 -0.007400 0.020285 
+-0.023256 -0.014584 0.009066 -0.006423 -0.017944 0.008689 
+-0.005797 -0.005994 -0.006014 -0.028028 -0.019965 0.016379 
+-0.025080 -0.024083 0.016437 -0.015179 -0.023214 -0.027232 
+-0.030997 -0.009672 -0.014293 -0.036174 0.005478 0.027826 
+-0.037626 0.013233 0.042811 -0.041795 0.025613 0.037468 
+0.018506 0.000491 0.005975 -0.005953 0.006060 -0.009401 
+0.002350 -0.004404 -0.004406 -0.010757 0.007028 0.014972 
+-0.002451 0.006332 0.005673 -0.000089 0.001958 0.001016 
+0.003568 -0.006746 -0.000183 0.010150 -0.034215 0.023020 
+0.006970 -0.029291 0.036959 0.019866 0.003777 -0.015156 
+0.000967 -0.008592 0.003471 -0.006497 -0.015492 0.017519 
+-0.012556 -0.017359 0.029969 -0.016772 -0.018233 0.036638 
+-0.012215 -0.013239 0.027699 -0.003551 -0.003532 0.007886 
+0.008156 0.010509 -0.019980 0.005432 0.036859 -0.013816 
+0.002523 0.007362 0.015829 0.006671 -0.011766 0.032679 
+0.000122 0.001163 -0.000629 0.002102 0.001071 -0.002027 
+-0.002679 -0.001156 0.001481 -0.002150 0.000025 0.000249 
+0.000427 0.004189 -0.000608 -0.000340 0.003773 0.001715 
+-0.000501 0.000834 0.000756 -0.000126 0.000562 0.000299 
+0.000320 0.001970 0.000911 -0.000361 0.002981 0.001815 
+0.003570 0.003640 -0.001234 0.000859 0.002364 -0.000380 
+0.003865 -0.003258 -0.000269 0.006922 -0.005410 0.002121 
+0.002656 -0.007791 0.001430 -0.004092 -0.006188 0.007846 
+0.002221 -0.003014 0.004757 0.004442 -0.004339 0.003115 
+0.007184 -0.001541 -0.000168 0.003350 0.002909 0.000690 
+0.001546 0.002489 -0.000306 0.002095 0.001431 -0.001793 
+0.000579 0.000920 -0.000701 -0.002528 0.000745 0.000173 
+-0.002397 0.001562 -0.001648 -0.002497 0.001753 -0.000892 
+-0.000599 -0.000851 -0.001817 -0.003343 0.003667 -0.000316 
+-0.004990 0.010841 -0.004678 -0.001187 0.009085 -0.005771 
+0.001735 0.002352 -0.001344 0.006444 -0.003718 -0.003465 
+0.001741 -0.006303 -0.011274 -0.003759 -0.003607 -0.004018 
+0.003829 -0.004073 0.008189 1.780488 -0.506098 3.750000 
+2.054744 -0.649635 4.459854 2.107383 -0.647651 4.187920 
+1.958525 -0.682028 3.529954 0.007876 -0.005919 0.025763 
+-0.005127 -0.018203 0.010194 0.003788 0.015816 0.010583 
+-0.001675 0.021227 0.014188 -0.017204 0.001554 0.004807 
+0.004231 0.000701 0.002805 0.016731 0.005000 -0.006731 
+-0.008684 0.002401 0.012882 -0.020865 -0.014778 0.018133 
+-0.011422 -0.013565 0.002498 0.005682 -0.010000 0.005682 
+-0.001677 -0.003214 0.005960 -0.006065 -0.006948 -0.014263 
+-0.007692 -0.038462 -0.094167 0.017500 -0.017500 -0.090000 
+-0.014193 -0.024823 0.008528 -0.003147 -0.036545 0.019739 
+-0.013773 0.003939 -0.008540 0.024741 -0.054148 -0.044815 
+0.008272 0.026155 0.016702 -0.003517 0.005091 0.044198 
+-0.018181 0.000947 0.022508 -0.014739 0.007420 0.010055 
+-0.045419 0.016097 0.002533 -0.032454 0.008113 0.053546 
+-0.006541 -0.017568 0.030703 0.016790 0.014257 -0.017352 
+-0.003481 -0.005835 0.003521 -0.014450 -0.018571 0.020495 
+-0.016725 -0.020371 0.032925 -2.455497 -2.361257 3.534031 
+-2.600858 -2.738197 3.763948 -2.554456 -3.074257 3.811881 
+-0.026178 -0.034090 0.036727 0.005494 0.000390 -0.027652 
+-0.023773 0.047729 -0.040806 -0.017750 -0.024311 0.061518 
+-0.002513 -0.001716 0.001118 -0.013451 -0.010720 0.001229 
+-0.006834 -0.007227 0.004137 0.001945 0.006432 -0.001770 
+-0.001164 0.010993 -0.006612 -0.005601 0.008192 -0.005016 
+0.007388 0.000116 -0.004014 0.003912 0.002185 -0.001469 
+-0.001380 0.000440 -0.000187 -0.003671 0.001063 -0.006280 
+-0.003469 -0.002936 -0.003333 -0.003843 -0.003477 0.004125 
+-0.002235 0.000143 0.006676 0.001643 -0.003580 -0.000464 
+0.003722 -0.001618 -0.001654 0.001515 0.001794 -0.005287 
+0.000625 0.001949 -0.006961 0.000562 0.002812 -0.005755 
+-0.000384 -0.001209 -0.002390 0.000780 -0.001000 -0.001040 
+-0.003171 0.005059 -0.000472 -0.000503 0.004152 -0.002866 
+-0.001782 0.000727 0.000689 -0.000115 0.003116 0.000725 
+-0.000084 0.003690 0.002228 -0.001873 0.003913 -0.000806 
+-0.000162 0.005091 0.000016 0.000641 0.003476 0.001631 
+-0.001120 0.006140 0.001580 0.003029 0.010563 -0.003759 
+0.001594 0.006474 0.000072 0.000047 -0.000983 -0.001117 
+-0.008189 0.001478 -0.014563 -0.005096 0.005462 -0.015598 
+0.008613 -0.004017 0.025233 2.178988 -0.937743 4.929961 
+2.600575 -1.341954 5.954023 2.769679 -1.463557 6.247813 
+2.756000 -1.248000 5.740000 2.154930 -0.542253 4.169014 
+0.008133 0.002801 0.018724 -0.001111 -0.008646 0.007063 
+-0.016461 -0.009758 -0.001133 -0.007671 -0.013900 -0.003282 
+-0.003462 -0.026466 -0.004179 0.009444 -0.024402 0.002991 
+0.005444 0.002126 -0.004182 -0.011525 -0.007086 0.003488 
+-0.008570 -0.005464 -0.004428 -0.002271 -0.001356 -0.000126 
+-0.001220 -0.001341 0.001341 0.002358 0.003262 0.015919 
+0.007563 0.008948 0.004581 0.033647 -0.001241 -0.041729 
+0.050572 -0.016807 -0.046143 0.015082 -0.012568 -0.033333 
+-0.007013 -0.014241 -0.019808 0.031045 0.007585 0.029538 
+-0.016354 -0.012050 0.016929 -0.047825 -0.012451 0.002639 
+-0.025044 0.022098 0.010000 -0.006153 0.016212 0.026125 
+-0.005054 0.023548 0.017634 0.001206 0.002738 -0.007262 
+0.008524 0.001206 -0.010952 -0.003024 -0.007967 0.004854 
+-0.023855 -0.013787 0.016961 -0.020615 -0.022656 0.039966 
+-2.652695 -1.922156 3.682635 -2.438312 -2.058442 3.600649 
+-2.396325 -2.438320 3.716535 -2.556634 -2.967638 3.889968 
+-1.980263 -2.953947 3.302632 0.020418 0.028956 -0.023047 
+-0.022953 -0.025951 -0.009923 -0.008261 -0.016162 -0.009877 
+-0.011289 -0.006834 -0.013634 -0.013965 -0.019065 -0.002789 
+0.003577 0.002275 -0.005318 0.004686 0.007241 -0.005683 
+-0.004164 0.004501 -0.003935 -0.005435 0.001333 -0.007665 
+-0.001518 0.007391 -0.001980 -0.000213 0.009215 -0.004678 
+-0.007478 0.003090 -0.000623 -0.003892 -0.000622 0.000901 
+-0.000399 -0.000052 -0.000066 0.000734 -0.000518 0.001447 
+0.000125 -0.000615 0.005986 -0.001961 0.001782 0.007665 
+-0.000549 0.000377 0.005296 -0.000556 0.000500 0.000752 
+-0.004282 0.001374 -0.005029 -0.006946 -0.000155 -0.011408 
+-0.009958 -0.000345 -0.004432 0.005893 -0.001344 -0.004577 
+0.005180 0.001532 -0.006982 0.004028 0.002314 -0.007489 
+0.006658 0.001322 -0.000280 0.002278 0.000320 0.003481 
+-0.000077 0.000652 0.000317 0.002380 0.001799 -0.003918 
+0.000740 0.004995 -0.003884 -0.002513 0.000817 -0.004218 
+0.003881 -0.001763 -0.006696 0.005203 0.003396 -0.000520 
+0.002170 0.000174 0.001728 -0.003789 0.001126 -0.004423 
+-0.007986 0.011042 -0.025346 -0.003847 0.005609 -0.005113 
+0.011218 -0.003733 0.025799 2.254355 -1.094077 4.327526 
+2.821212 -1.463636 5.633333 3.055921 -1.375000 6.384869 
+2.790795 -0.748954 6.050209 1.964286 0.125000 4.535714 
+0.011567 0.007640 0.023035 0.000318 0.007337 -0.004601 
+-0.001432 -0.076154 -0.001370 -0.025718 -0.051731 0.005490 
+-0.023745 -0.028990 0.017419 -0.014633 -0.019190 0.009777 
+-0.004643 -0.019153 0.002993 0.000575 -0.016150 -0.005479 
+-0.000505 -0.012020 -0.011616 -0.003406 -0.004397 -0.007697 
+0.002588 -0.000101 0.000344 0.004498 -0.002299 0.003324 
+-0.000150 -0.011137 0.007741 -0.010296 -0.010215 0.010868 
+-0.002453 -0.011751 0.014332 0.001440 -0.008060 0.018205 
+0.023005 -0.020566 0.013415 0.015062 -0.004568 0.055679 
+0.027941 0.049412 0.102059 -0.055113 -0.010789 0.018759 
+-0.005980 -0.017402 -0.008431 0.004027 -0.012371 -0.001224 
+-0.010514 0.000965 -0.006482 0.005332 -0.026860 -0.002012 
+0.009234 0.003741 -0.010933 0.006814 0.004338 0.006355 
+-0.009992 -0.000013 0.013781 -0.026076 -0.014032 0.038179 
+-3.142132 -2.309645 4.345178 -3.051282 -2.708333 4.333333 
+-3.017595 -3.126100 4.258065 -3.113636 -3.583333 4.166667 
+-0.020219 -0.023069 0.025990 0.009402 0.010991 -0.004181 
+0.008438 0.011553 -0.009495 0.038849 -0.007374 0.032410 
+-0.057119 0.002664 0.006147 0.035979 0.051174 -0.050062 
+0.012737 0.011663 -0.017073 0.000887 0.003689 0.000474 
+-0.001218 0.002942 0.003798 0.000581 -0.001300 0.006110 
+0.003242 0.004968 -0.002433 0.001326 0.012347 -0.008566 
+-0.003045 0.010416 -0.009016 0.001326 -0.000277 -0.003102 
+0.001457 0.000339 0.000014 -0.003694 -0.000095 0.002528 
+-0.005549 0.001319 0.004284 -0.005470 0.002362 0.001677 
+-0.002414 0.001207 -0.004144 0.002982 0.002427 -0.009655 
+-0.000478 -0.000992 -0.007126 -0.002798 0.000299 -0.001869 
+-0.001257 -0.002043 0.000052 0.002816 -0.002935 -0.002428 
+-0.000319 -0.001905 0.000806 0.002375 0.000133 -0.003537 
+0.004773 -0.001615 -0.001118 -0.001173 -0.000731 -0.002973 
+-0.000171 0.000918 -0.000027 0.005975 -0.000491 0.001310 
+0.003054 -0.001737 0.002427 -0.000891 0.001030 -0.003959 
+-0.000671 0.007307 0.000420 -0.001646 0.001408 -0.003496 
+-0.000940 -0.003958 0.001321 -0.005831 -0.003797 -0.002967 
+-0.006303 0.002648 -0.025700 -0.005385 0.007157 -0.008787 
+0.008573 -0.001444 0.015122 1.892704 -1.158798 3.828326 
+2.465201 -1.388278 5.619048 2.639405 -0.933086 6.353160 
+2.353712 -0.052402 5.751091 1.820359 0.712575 4.137724 
+0.008156 0.008143 0.019284 -0.001273 0.001910 -0.002666 
+-0.004067 -0.011696 0.006825 -0.001038 -0.008327 0.041281 
+-0.016727 -0.012480 0.032513 -0.022117 -0.018875 0.008188 
+-0.017028 -0.016766 -0.001678 -0.009176 -0.015293 -0.003625 
+-0.012917 0.000644 0.000937 0.018294 0.000830 -0.011509 
+0.026064 0.000634 -0.011320 0.011260 0.000483 -0.002368 
+-0.002532 0.000836 -0.001912 0.001733 -0.008608 0.006788 
+0.008267 -0.016533 0.010000 0.002630 -0.000986 0.043000 
+0.013690 -0.070119 0.055595 -0.020089 -0.000651 0.001509 
+0.079162 0.065659 0.050215 0.049234 -0.009349 -0.016897 
+-0.026379 -0.007379 -0.007234 -0.025939 -0.003106 -0.020015 
+-0.005197 -0.006283 0.011908 -0.005611 -0.011873 0.000996 
+0.003956 0.003432 -0.003799 0.010163 0.015445 -0.003880 
+0.000917 0.013452 -0.002453 -0.024103 -0.006250 0.033237 
+-2.876405 -2.129214 5.000000 -3.200787 -2.972441 4.771654 
+-3.232639 -3.500000 4.291667 -3.121771 -3.453875 3.697417 
+-2.672897 -2.504673 2.785047 -0.006143 -0.002927 0.009469 
+0.027748 0.036455 -0.029302 0.004762 0.031587 -0.005714 
+0.027549 0.017375 -0.017875 0.028268 0.012920 -0.028319 
+0.012689 0.006405 -0.011852 0.010008 0.001400 -0.006070 
+0.009067 -0.001458 -0.003048 0.006408 0.005439 0.002459 
+0.001915 -0.001182 -0.000478 0.001549 -0.000034 -0.003081 
+0.000627 0.004749 -0.004345 -0.000348 0.004555 0.000712 
+-0.000843 -0.000261 0.002537 -0.005214 -0.002387 0.003689 
+-0.005268 -0.002733 0.002170 -0.001138 -0.001968 -0.001447 
+0.000351 0.002518 -0.003337 0.000031 0.006512 -0.006543 
+0.005018 0.005421 -0.007527 -0.001675 0.005466 -0.006382 
+-0.000694 0.000481 -0.000678 0.002433 -0.003485 -0.000234 
+-0.005513 -0.001550 0.006211 -0.001621 0.000008 0.000686 
+0.002208 -0.000775 -0.000310 0.001656 -0.001672 -0.001133 
+0.002004 -0.001114 0.000946 0.001400 -0.004388 -0.000696 
+-0.000238 -0.003253 -0.001063 -0.000469 0.002040 -0.001185 
+-0.001821 0.004363 0.002539 -0.001776 0.002816 0.004098 
+-0.002375 -0.003685 0.000381 -0.003145 -0.003920 0.000035 
+-0.002541 0.000190 -0.001910 0.001959 0.006286 -0.001334 
+0.006809 0.002681 -0.000649 0.006622 -0.001987 0.015954 
+0.007097 0.001136 0.036941 1.096045 -0.468927 4.632768 
+0.971910 0.033708 4.410112 0.012675 0.009095 0.029489 
+0.001833 0.002443 0.009078 0.002528 -0.008118 -0.013365 
+0.003090 -0.007780 -0.005963 -0.002025 0.004056 0.002824 
+0.002414 0.004545 -0.000966 0.007960 -0.003594 0.010738 
+0.008116 -0.010537 0.005400 0.002794 -0.014782 -0.003400 
+0.000027 0.000220 0.000148 0.028562 -0.001505 0.008261 
+0.027731 0.022637 -0.016961 0.009896 0.007257 -0.009565 
+0.007215 -0.000629 -0.005762 -0.006165 0.013168 0.000699 
+-0.002203 0.002019 -0.006950 -0.052483 -0.019223 0.013320 
+-0.024697 0.037744 0.015836 0.000065 0.064211 0.000038 
+0.018221 0.070000 -0.000868 0.009498 0.019090 -0.000443 
+-0.017932 -0.014136 -0.002177 -0.035857 -0.006429 -0.034000 
+-0.017293 0.009837 0.024515 -0.014194 0.007993 0.006685 
+-0.003799 0.025079 -0.022057 0.018729 0.018484 -0.010311 
+0.003232 0.023444 0.007163 -0.016435 0.005957 0.036072 
+-2.136055 -1.224490 4.721088 -2.686275 -2.431373 4.598039 
+-3.033473 -3.188285 4.092050 -3.168724 -3.296296 3.407408 
+-2.483092 -2.376812 2.227053 -0.002382 -0.001684 0.002434 
+0.021811 0.025678 -0.020824 0.039677 0.121429 -0.052642 
+0.048831 0.045527 -0.023877 0.017769 0.013327 -0.008368 
+0.015025 0.002917 -0.003254 0.014533 -0.001499 -0.007379 
+0.006243 0.003035 -0.003979 -0.000976 -0.001362 0.002126 
+-0.003489 -0.002334 0.005944 -0.000102 -0.004724 0.003976 
+-0.000657 -0.002511 0.001365 -0.001572 -0.001446 -0.000448 
+-0.004820 -0.001731 0.000139 -0.005008 0.000376 -0.000400 
+-0.001660 0.001274 0.000694 -0.002420 -0.001030 0.004569 
+-0.001394 -0.000005 0.002331 -0.002390 0.000126 -0.000629 
+0.000975 0.004572 -0.004680 0.000604 0.003985 -0.007142 
+-0.001088 0.001339 -0.004470 0.000254 -0.001288 0.001058 
+0.001101 -0.000465 -0.000281 0.000800 -0.001360 -0.000364 
+0.001867 0.000779 0.000622 0.003622 0.004350 0.001232 
+0.003241 0.004381 0.001386 0.001724 0.001684 0.000644 
+0.001845 0.001472 -0.000416 0.002457 -0.000562 -0.000923 
+0.000059 -0.000356 0.003860 0.000168 0.002816 0.003918 
+0.002211 0.001279 0.001082 0.001432 0.000746 0.000648 
+0.000830 0.000147 0.000618 -0.000976 0.000810 0.006351 
+-0.003210 -0.005284 0.006237 -0.003313 -0.002568 0.004483 
+-0.004267 -0.000486 -0.001468 -0.006129 0.000690 0.001128 
+-0.008785 0.004216 0.005992 -0.007697 0.005622 0.005887 
+0.001805 -0.002617 -0.001044 0.002308 -0.011538 -0.016923 
+0.015420 0.016556 -0.027084 0.021031 0.003938 -0.007719 
+0.007950 -0.001771 -0.003876 0.000396 -0.004012 -0.008452 
+-0.004846 -0.010039 -0.017113 -0.020934 -0.019764 -0.023255 
+-0.036712 -0.035524 0.003434 -0.032352 -0.019195 0.015816 
+-0.001815 -0.000136 -0.001592 0.005625 -0.000064 0.000141 
+-0.005814 0.007174 0.000818 0.005533 0.020784 -0.005769 
+0.006693 0.001156 -0.001536 0.010769 0.003022 0.002709 
+0.024583 0.015478 -0.013659 0.027538 -0.008923 -0.027692 
+0.041764 -0.008426 -0.001099 0.010764 0.024000 -0.044655 
+-0.009062 0.032606 -0.023589 -0.004711 0.005652 0.000651 
+0.002004 -0.000329 0.000282 0.005440 -0.006588 -0.010755 
+0.002337 -0.004107 -0.029315 -0.003785 0.018423 -0.009607 
+0.010277 0.021179 -0.006404 -0.004087 0.006593 0.022140 
+-0.014731 -0.005001 0.031883 -1.409091 -1.993507 3.766234 
+-1.901163 -2.796512 3.517442 -2.058480 -2.847953 2.625731 
+-0.009750 -0.012942 0.012315 0.006978 0.004597 -0.004956 
+0.017827 0.014256 -0.012957 0.019765 0.014957 -0.007265 
+0.011886 0.005965 -0.006988 0.009636 0.008468 -0.003301 
+0.007645 0.007578 -0.002129 0.005080 0.010242 -0.003917 
+0.001656 0.012490 -0.002834 -0.002516 0.009672 -0.001575 
+0.000421 -0.000178 -0.000877 0.000840 0.002797 -0.003133 
+0.000446 0.003610 0.001235 0.000636 0.000327 -0.001409 
+0.002062 0.002329 -0.004886 0.005006 0.005632 -0.008073 
+0.006607 0.009643 -0.009643 0.005492 0.008763 -0.009288 
+0.003208 0.003204 -0.004272 0.001334 -0.002806 -0.000193 
+0.000020 -0.003740 0.001625 -0.001026 -0.002416 0.001260 
+0.000837 -0.000591 0.001735 0.003998 0.000941 0.002234 
+0.007598 0.005273 -0.002031 0.006116 0.001356 -0.002621 
+0.003000 0.000263 -0.000040 0.000053 0.000553 0.000051 
+-0.001194 0.000458 -0.000245 -0.001767 -0.000963 -0.001164 
+-0.002431 -0.001236 -0.002040 -0.002856 -0.001493 -0.001791 
+-0.002501 -0.001159 -0.000972 -0.000422 -0.001294 -0.000815 
+0.002155 -0.003839 -0.001851 0.003959 -0.003644 0.002201 
+0.000568 -0.001964 0.001587 -0.001066 -0.002478 0.000096 
+0.002667 -0.001598 -0.001414 0.001477 -0.005265 -0.001579 
+0.001559 -0.005767 -0.001851 0.000155 -0.004056 -0.005099 
+-0.002815 -0.000500 -0.004538 -0.004600 0.002846 0.007577 
+-0.008648 -0.003374 0.006443 0.012129 0.010157 -0.000645 
+0.012412 0.014895 -0.002976 0.006282 -0.018418 0.011564 
+-0.000465 -0.011522 -0.005237 -0.013754 -0.005202 0.004833 
+0.005846 0.012794 -0.022904 0.009608 0.000918 -0.047189 
+0.005375 -0.001290 -0.040000 -0.013734 0.000460 -0.019105 
+-0.007257 -0.001009 -0.005530 0.007626 -0.002284 -0.002873 
+0.007839 0.002691 0.000471 0.013458 -0.003945 0.000779 
+0.005243 0.000021 -0.003013 0.005576 0.001864 0.003760 
+0.006777 0.008937 0.004800 -0.000218 -0.000185 -0.006875 
+0.019598 -0.000753 0.008950 0.017252 0.001426 -0.023455 
+0.001581 0.001268 -0.010017 -0.001857 -0.001406 0.015023 
+0.003154 -0.005095 0.016250 0.008601 -0.001401 0.003581 
+0.010632 -0.000051 -0.005946 0.008999 0.003712 -0.016142 
+0.016072 0.003462 -0.022784 0.004376 0.003965 -0.005059 
+-0.002208 0.001369 0.012118 -0.006792 0.000647 0.019188 
+-0.010062 0.000124 0.020248 -0.011526 -0.005825 0.017240 
+-0.006408 -0.004418 0.004484 0.000893 0.006314 -0.002530 
+0.006564 0.008395 -0.003285 -0.001584 0.002803 0.002737 
+-0.008928 0.001630 0.016344 -0.010112 0.003917 0.004486 
+-0.005565 0.002775 0.000110 -0.000963 0.005908 -0.002641 
+0.004833 0.008030 -0.005678 0.001093 0.004146 -0.006424 
+-0.000544 0.003712 -0.000059 -0.004211 0.002422 -0.000908 
+-0.003715 0.002607 -0.002440 -0.000795 0.002448 -0.000490 
+-0.000454 -0.000421 -0.007330 0.000168 0.000189 -0.001092 
+-0.001371 0.001315 0.000862 0.000089 0.000915 -0.001044 
+-0.001955 -0.000364 -0.002150 -0.003165 -0.004008 0.000332 
+-0.004712 -0.003496 0.001190 -0.004403 -0.000007 -0.000735 
+-0.002315 0.002563 -0.002942 -0.000989 0.002636 -0.005755 
+0.001127 0.003304 -0.000215 0.002609 0.001640 0.000130 
+0.003405 -0.000123 0.000584 0.002548 -0.001379 0.000204 
+-0.000006 -0.000218 -0.001112 -0.003532 0.002826 0.000377 
+-0.004867 0.003614 -0.001360 -0.002700 0.001873 -0.000769 
+0.003468 0.000438 -0.000246 0.005375 -0.000434 -0.003298 
+-0.000065 -0.000206 0.000124 -0.005355 -0.000192 0.001145 
+-0.001771 0.000440 -0.000674 0.001192 0.001470 0.001171 
+0.003283 -0.001919 -0.000482 0.005500 0.000795 0.000261 
+-0.002665 0.001507 -0.001784 -0.000412 -0.004792 -0.006861 
+0.005229 -0.005157 -0.008454 -0.000178 -0.000903 0.001546 
+-0.004389 -0.009683 0.001361 -0.000683 -0.011250 -0.000057 
+-0.004900 -0.008660 -0.000370 -0.006462 -0.004379 0.004642 
+-0.003562 -0.000660 0.000930 0.004519 -0.000389 -0.008466 
+0.004465 -0.001960 -0.015893 0.000876 0.000683 -0.015837 
+-0.002758 0.002545 -0.007821 -0.001263 0.000524 -0.004225 
+0.007452 0.003918 -0.001623 0.012415 0.003055 -0.004753 
+0.007969 -0.009645 -0.005681 -0.000245 -0.010539 0.005392 
+-0.014152 -0.012860 0.002011 -0.013077 -0.004114 -0.002244 
+-0.002162 -0.001892 -0.002432 0.015505 0.010219 -0.013743 
+0.019858 0.010115 -0.016661 -0.007381 -0.002832 0.003381 
+-0.005478 -0.008834 0.015340 -0.002075 -0.016045 0.008531 
+-0.003264 -0.005860 0.002870 -0.000278 0.000741 0.002870 
+-0.000605 -0.000370 0.003259 0.002165 0.006889 -0.012421 
+0.021136 0.012727 -0.038409 0.020362 0.018411 -0.008548 
+0.006246 0.006677 0.004522 -0.003843 -0.000555 0.003894 
+-0.005033 -0.004177 0.001484 -0.002864 -0.002555 0.000333 
+-0.002503 0.000817 0.000633 -0.004284 0.002860 -0.000326 
+-0.003328 0.005327 0.000516 -0.001422 0.002431 0.001292 
+-0.006063 -0.001604 -0.000473 -0.003970 -0.002008 0.004443 
+-0.005256 -0.005467 0.002570 -0.001455 -0.004033 0.001120 
+0.000922 0.000500 -0.000255 -0.001002 0.001984 -0.000826 
+-0.006815 -0.000381 0.002812 -0.009322 -0.002417 0.002843 
+-0.004690 -0.004000 0.001379 -0.000064 0.000071 -0.000045 
+-0.000757 0.000698 -0.003564 -0.000136 -0.000283 -0.001361 
+-0.001197 -0.000972 0.002812 -0.000944 0.002384 0.002205 
+0.000013 0.001279 -0.001111 -0.002677 -0.002045 0.000210 
+-0.000144 -0.003142 -0.003804 -0.003761 -0.000775 -0.000766 
+-0.002482 0.002182 -0.001391 -0.001621 0.003359 -0.002222 
+0.001058 -0.000789 0.000132 0.001252 0.000822 0.001317 
+0.000378 -0.000986 -0.001822 0.003176 0.001241 -0.005967 
+0.004579 0.003566 0.002800 0.002812 -0.001247 -0.000146 
+0.006257 0.000369 -0.007978 0.010450 0.001535 -0.007675 
+0.007315 -0.001561 -0.005550 0.005615 0.001470 -0.005423 
+0.003272 0.003043 -0.001013 -0.000195 0.001754 0.000583 
+-0.001697 0.001695 0.000246 -0.002821 0.001690 -0.000814 
+-0.004537 0.000331 -0.001035 0.007291 -0.000247 -0.003966 
+0.000828 -0.002223 -0.001585 -0.006875 -0.002462 -0.005101 
+-0.011177 -0.008095 -0.003265 -0.012546 -0.003261 -0.002879 
+-0.007456 0.003846 -0.005306 -0.010048 0.004970 -0.004592 
+-0.017580 -0.006911 0.002812 -0.001170 -0.007893 0.014326 
+0.002277 -0.004058 0.004784 0.000866 -0.000027 -0.000360 
+0.004961 0.003491 0.000674 -0.002950 -0.000578 -0.000667 
+-0.013265 -0.001407 -0.000804 -0.002754 0.000036 -0.001200 
+0.009297 -0.007226 0.004592 0.011772 -0.001454 0.008454 
+0.004935 0.005290 -0.002355 -0.005300 0.003295 -0.004631 
+-0.015212 -0.012108 -0.001821 -0.023797 -0.022138 -0.001107 
+-0.015006 -0.005938 0.014683 0.002916 -0.008971 0.002467 
+0.010066 0.006000 0.001007 0.016521 0.018220 -0.013493 
+0.007231 0.012902 -0.005046 -0.004564 0.000303 -0.000217 
+-0.001994 -0.003620 -0.006804 0.004655 -0.002186 -0.015034 
+-0.000859 -0.001342 -0.018092 0.005816 -0.003310 -0.013638 
+-0.004461 -0.005761 -0.005094 -0.012182 0.013502 -0.006405 
+0.011350 0.017815 -0.006615 0.007677 0.012555 -0.004940 
+0.003641 0.003753 -0.003115 -0.001815 -0.002187 -0.001550 
+0.000139 0.000143 -0.001616 -0.003407 -0.001219 0.003445 
+-0.005236 -0.002328 0.002176 -0.002015 0.000187 0.000132 
+0.001794 0.002217 -0.000262 0.002614 0.001491 -0.002155 
+0.000486 -0.001992 -0.001019 -0.002424 -0.004324 0.000072 
+-0.002697 -0.003278 0.000724 -0.001811 0.000591 -0.000260 
+-0.002492 0.001385 -0.000671 -0.004212 -0.001371 0.000893 
+-0.005744 -0.002250 0.003077 -0.005497 -0.000759 0.006208 
+-0.003885 0.001872 0.004962 -0.000908 0.002056 0.001211 
+0.000560 -0.001219 -0.003107 0.003441 -0.000316 -0.002314 
+0.001430 0.008687 0.001686 0.004174 0.008510 -0.007937 
+0.002961 0.004909 0.000683 0.002540 -0.001680 -0.000256 
+0.001671 0.001206 0.001145 0.001319 0.000301 0.002623 
+-0.000621 0.000289 -0.000597 0.001418 -0.001295 0.000360 
+0.002896 -0.001385 -0.000991 0.001129 0.000691 -0.004285 
+-0.000187 0.001288 -0.004946 0.002157 0.001154 -0.005426 
+0.006111 0.001274 -0.002742 0.006192 -0.000354 -0.000855 
+0.006074 -0.000994 -0.003496 0.007165 0.005376 -0.003893 
+0.001574 0.000945 0.001001 -0.001102 -0.001448 -0.001661 
+-0.003251 -0.001395 -0.002805 -0.002375 -0.000137 -0.001217 
+0.005294 -0.009063 0.006437 0.004609 -0.017074 0.008022 
+-0.005394 -0.007562 0.001861 -0.004639 0.000320 -0.005214 
+0.005877 0.003985 -0.003643 0.004746 0.009371 -0.009506 
+-0.001893 0.008953 -0.007233 -0.002919 0.002438 0.000512 
+0.000754 0.002116 0.000725 0.002482 0.007431 0.005165 
+0.002382 0.001197 0.005118 0.011027 0.002085 0.004103 
+0.010270 0.003265 0.004245 0.002943 -0.001634 -0.001149 
+-0.009592 -0.003608 -0.005825 -0.008405 -0.002438 -0.001433 
+-0.000583 0.003072 0.005278 -0.005011 0.000142 0.008723 
+-0.007040 -0.000051 0.007210 -0.005161 0.002114 -0.000977 
+-0.003333 -0.005000 -0.005000 -0.009000 -0.005000 -0.004500 
+-0.005109 -0.019660 -0.001549 -0.018994 -0.014188 -0.001526 
+-0.006990 0.001750 0.001718 0.001159 0.004666 -0.004779 
+0.009682 0.004560 0.000466 0.010867 -0.008333 0.021733 
+-0.006800 -0.024000 0.025600 -0.009422 -0.017990 0.004458 
+-0.006400 -0.002746 -0.013826 -0.007392 -0.004947 -0.009871 
+0.003233 -0.003725 -0.010635 0.002248 0.000574 -0.005688 
+0.001987 -0.003255 -0.005472 0.000101 0.001802 -0.011597 
+-0.003519 -0.004754 -0.007728 -0.007359 -0.001631 -0.003901 
+-0.005056 0.002727 -0.001040 -0.002330 0.004393 -0.003263 
+0.001447 0.002796 -0.002599 0.002185 -0.002668 0.003140 
+0.002486 -0.000324 0.005370 -0.003102 0.000142 0.001976 
+-0.007099 -0.003280 0.002901 -0.011393 -0.006309 0.004613 
+-0.014208 -0.008979 0.003940 -0.010232 -0.010551 0.001972 
+-0.004468 -0.006762 0.001340 -0.001250 -0.000383 0.000142 
+-0.000584 0.002494 -0.001039 -0.001669 0.002359 -0.000207 
+-0.002745 0.003445 0.000775 -0.001802 0.005538 0.000467 
+-0.003204 0.003809 0.000937 -0.002131 -0.001096 0.000366 
+-0.002066 -0.002146 -0.000391 0.001810 -0.000442 -0.000276 
+0.004177 0.001460 0.003466 0.007378 0.003378 0.003829 
+0.004149 0.003499 -0.001635 -0.002301 -0.002624 0.001834 
+-0.001658 0.004985 -0.001499 -0.000996 0.008604 -0.006141 
+0.003812 -0.003687 -0.006697 -0.001748 -0.000742 -0.006190 
+0.000156 0.002953 -0.007054 -0.000363 0.004147 -0.005937 
+-0.001173 0.001862 -0.004360 -0.000062 0.000014 0.000071 
+0.001556 -0.000948 0.001204 0.000155 0.001450 0.001741 
+-0.002916 0.003104 -0.000091 -0.006590 0.004403 -0.006156 
+0.011005 -0.005093 -0.044383 -0.006376 0.003744 -0.009432 
+0.007709 0.000021 0.008157 0.001768 -0.003619 0.008720 
+-0.001879 -0.001480 0.005062 -0.015011 -0.000945 0.001051 
+-0.006472 -0.001776 0.001048 0.000155 0.001069 -0.002724 
+0.001886 -0.001263 -0.003252 -0.004553 0.002263 -0.004266 
+-0.011337 0.004786 -0.006142 -0.005882 0.003232 -0.003373 
+-0.003412 -0.001030 0.002325 -0.002292 0.002519 0.007022 
+-0.001529 0.006015 0.008717 -0.017394 0.015448 -0.006461 
+0.004315 0.014445 0.009350 -0.002587 0.015804 -0.000710 
+0.004167 0.003598 -0.002434 0.015418 -0.002299 0.010217 
+0.041958 0.005591 -0.006785 -0.009734 0.041647 -0.052184 
+0.020193 0.025032 -0.016520 0.008228 0.002981 0.003579 
+-0.011376 -0.020752 0.003476 0.002842 -0.006990 0.004800 
+0.003717 0.003949 -0.005459 0.006028 -0.002578 0.000523 
+0.005248 -0.002880 -0.001301 -0.002158 -0.000034 -0.000685 
+-0.000223 -0.001741 -0.001205 -0.023333 -0.005500 0.005500 
+-0.022456 -0.007594 -0.005055 -0.010042 -0.002300 -0.006907 
+0.003678 0.004546 -0.005976 0.008182 0.004150 0.003495 
+0.006259 -0.004232 -0.008839 -0.001019 -0.003711 -0.013788 
+0.001731 -0.011077 -0.002084 -0.014824 0.001588 0.005667 
+-0.007723 -0.000861 0.010779 0.000216 0.005081 -0.003449 
+0.011854 0.016455 -0.010391 0.007469 0.010566 -0.008142 
+-0.001456 -0.000422 0.000831 -0.006750 0.001391 0.007787 
+-0.007065 -0.003472 0.001337 -0.002675 -0.006186 -0.002910 
+-0.001396 -0.006386 -0.003896 -0.003704 -0.006299 -0.001165 
+-0.008085 -0.005532 0.000963 -0.006665 -0.006822 0.001557 
+-0.003843 -0.007176 -0.000472 -0.000199 -0.006084 -0.001915 
+0.000999 -0.005076 -0.001679 -0.001385 -0.003808 -0.001227 
+-0.001757 -0.000522 -0.000276 0.002114 0.003066 0.001039 
+0.007693 -0.000336 0.000668 0.005963 0.001650 0.001725 
+-0.001671 0.002985 0.003463 -0.003561 0.002608 -0.000110 
+-0.003235 0.001203 0.000315 -0.004315 -0.002520 0.003401 
+-0.002889 0.003111 -0.000648 0.000074 -0.000447 -0.002760 
+0.003025 -0.001753 -0.003500 0.004063 -0.002544 -0.007473 
+0.003939 0.004523 -0.012514 0.004489 0.008111 -0.006411 
+0.002119 0.001994 -0.000195 0.001195 -0.001024 -0.001012 
+0.002473 -0.001331 0.002201 0.000587 -0.000449 0.000920 
+-0.005721 0.004440 -0.000953 -0.022583 0.001583 0.001833 
+0.001076 0.004178 0.000309 0.000731 0.006917 -0.007013 
+-0.004271 0.001983 -0.000200 0.006189 -0.002703 0.003411 
+0.009711 0.005440 -0.021896 0.057668 0.124289 -0.211126 
+0.009363 0.003463 0.013308 0.009569 -0.000124 0.006614 
+0.006339 0.000764 -0.008822 0.002525 0.005004 -0.008780 
+-0.012338 0.026043 -0.024423 -0.011025 0.011536 -0.016455 
+-0.007764 -0.000893 -0.002393 -0.024387 -0.001344 0.034901 
+-0.035600 -0.005647 0.009412 -0.007569 0.009056 -0.041819 
+0.014258 0.048708 -0.127033 -0.002826 -0.001893 0.003671 
+-0.011797 -0.025488 0.032571 -0.011102 -0.034514 0.050393 
+-0.009940 -0.035563 0.062716 0.010445 0.004588 -0.006470 
+0.014552 0.013793 -0.024997 0.019826 0.017572 -0.019344 
+0.008094 0.003098 -0.004684 0.007294 -0.002244 0.002698 
+0.015488 0.008229 0.006478 0.029327 -0.013821 0.038484 
+-0.013077 0.026936 0.028860 -0.028588 0.010230 0.016193 
+-0.020684 0.009210 0.003801 -0.025722 0.009713 -0.011890 
+-0.029474 -0.000737 0.000105 -0.017641 -0.016624 0.004966 
+-0.012734 -0.004638 -0.006496 -0.003918 0.002050 -0.008750 
+-0.003552 -0.000760 -0.005691 0.003441 -0.000703 -0.007191 
+0.000894 0.002707 -0.002039 -0.003452 0.007333 0.006407 
+-0.015947 0.004199 0.012463 -0.018046 -0.004709 0.009949 
+-0.011029 -0.005294 0.003983 -0.001019 -0.007498 0.002559 
+0.007759 -0.019195 0.010346 0.005671 0.008830 0.001701 
+0.019502 0.007258 -0.015664 0.009641 0.006056 -0.008108 
+0.002038 -0.000169 -0.003205 -0.001596 -0.003499 -0.004387 
+-0.003569 -0.003276 -0.007113 -0.005413 -0.002446 -0.008755 
+-0.003680 -0.004059 -0.005498 0.000824 -0.003240 -0.003072 
+0.002242 -0.003001 -0.002373 0.001878 -0.001803 -0.000945 
+0.001905 0.002379 0.000274 0.000856 0.008084 -0.000423 
+0.002207 0.010875 -0.002982 0.006855 0.003686 -0.000786 
+0.000653 -0.001632 0.007979 0.000453 0.001844 0.007042 
+-0.004316 0.001342 0.001420 -0.001400 -0.001284 -0.002601 
+0.007360 0.004529 -0.005283 0.000302 0.003002 -0.001496 
+0.000448 -0.000279 0.000305 0.000495 -0.000215 0.001490 
+0.000746 0.001404 0.000283 -0.001641 0.002161 0.000903 
+-0.002242 0.000352 -0.001823 0.001761 -0.002539 -0.005204 
+0.004285 -0.002412 -0.005037 -0.006501 0.001697 0.005699 
+0.000000 -0.012041 0.022362 -0.014120 0.027992 0.047559 
+-0.011430 -0.020137 0.018503 0.003030 0.008485 0.015152 
+-0.012402 -0.014317 0.004572 -0.032260 0.002503 0.023445 
+-0.017298 -0.005969 0.011627 -0.022244 -0.027593 0.030043 
+-0.024535 -0.033562 0.012175 -0.017710 0.011580 0.000681 
+0.041136 -0.009712 -0.019017 0.011538 0.018933 -0.049227 
+0.022359 0.003844 -0.018565 -0.008577 0.001362 -0.021576 
+-0.004574 0.000677 -0.004728 0.004603 -0.005750 0.008569 
+0.004896 -0.010663 0.009122 0.003920 0.000428 -0.000425 
+0.021471 0.037455 -0.051543 -0.000983 0.006326 0.000302 
+-1.700000 -2.664286 4.035714 -1.655172 -2.827586 4.047414 
+-1.563433 -2.645522 3.690299 -1.530000 -2.395000 3.175000 
+-0.007734 -0.012647 0.011868 0.011563 0.019399 -0.031587 
+-0.002354 0.014290 -0.014141 -0.003658 -0.002681 0.002565 
+-0.006066 -0.008341 0.003999 -0.008053 -0.009143 0.008964 
+-0.002539 -0.012233 0.035589 0.012552 -0.016244 0.025625 
+0.005886 -0.004574 0.009921 -0.007679 0.005972 -0.010956 
+-0.010159 -0.007208 0.007990 0.005819 -0.007944 0.030389 
+-0.036724 0.063448 -0.020086 0.015777 0.019502 -0.017406 
+0.008177 0.010881 -0.001824 0.008221 0.006959 -0.001194 
+-0.000381 0.002860 -0.002860 -0.000805 -0.000605 -0.003351 
+0.008606 -0.006097 -0.003542 0.013909 0.002318 -0.002107 
+0.002373 -0.000795 0.002957 -0.010321 0.008564 -0.005578 
+-0.002829 -0.014529 -0.002445 0.000317 -0.010511 0.015087 
+-0.003903 -0.002841 0.003682 0.013400 0.003926 -0.002921 
+0.012458 0.003874 -0.003485 0.002500 0.001815 -0.000043 
+-0.000956 0.001172 -0.001967 0.000456 0.001961 -0.001219 
+0.003795 0.000866 -0.000145 0.005408 0.003797 0.001477 
+0.008318 0.005292 -0.001111 0.010986 0.006570 -0.001328 
+0.009060 0.007116 -0.000460 0.003734 0.005273 -0.001243 
+0.000195 -0.000238 0.000175 0.000000 -0.001371 0.002878 
+0.002552 -0.000799 0.000525 0.001204 -0.000327 0.000702 
+0.000038 0.001784 0.001396 0.000861 0.001870 0.000118 
+0.005565 0.001384 -0.002699 -0.002515 -0.000368 0.004520 
+-0.001448 0.001078 0.005639 0.003358 0.001444 0.004476 
+0.005218 -0.000512 0.003584 0.004497 -0.001473 0.003480 
+0.002845 -0.001746 0.005622 0.006207 -0.005475 0.005042 
+0.028791 -0.014019 -0.003497 -0.003533 -0.011954 0.014027 
+-0.000182 0.002957 0.008519 0.002095 -0.006095 0.004095 
+0.003044 -0.000571 0.000262 0.018995 -0.002350 -0.009809 
+0.007929 -0.001629 0.009919 -0.010170 0.000023 0.005196 
+0.001407 0.004618 -0.005911 0.005673 0.007395 -0.005027 
+0.001041 0.009295 -0.006881 0.008526 0.019063 -0.022556 
+0.002614 0.007446 -0.034052 -0.005788 0.005419 -0.032763 
+-0.002946 0.005275 -0.019038 -0.006917 0.001555 -0.001949 
+-0.012199 -0.004669 0.007259 -0.008489 0.001934 0.003334 
+0.003148 0.003390 -0.004839 0.004736 0.006380 -0.016325 
+-0.012429 0.016546 -0.029282 -0.006516 0.004717 0.021244 
+-2.394161 -3.043796 4.832117 -1.975439 -3.196491 4.571930 
+-1.796247 -3.117962 4.211796 -1.740741 -3.030864 3.839506 
+-1.640625 -2.708333 3.067708 -0.007561 -0.009189 0.007514 
+0.002314 0.000835 0.000275 -0.000609 0.002149 -0.002053 
+-0.000986 -0.002007 -0.000051 -0.001931 0.000629 -0.005190 
+0.001813 0.003602 -0.005692 0.001502 0.001683 -0.002700 
+-0.002856 0.001826 -0.003534 -0.003408 0.000090 -0.004504 
+0.000047 -0.000876 0.000619 0.004059 -0.013956 0.007624 
+0.006467 -0.022695 0.018699 0.025073 -0.011530 -0.003549 
+0.002105 0.002681 -0.008574 0.003558 0.003370 0.006060 
+0.006622 -0.005597 0.005677 -0.000014 -0.002190 -0.003013 
+0.001812 0.004741 0.006059 0.007778 0.003961 0.008837 
+0.012485 -0.010573 -0.020199 -0.000479 0.017135 0.003530 
+-0.020096 -0.023220 0.009279 -0.037280 -0.022921 0.009843 
+-0.010742 -0.004388 0.005416 0.001961 0.001658 -0.001105 
+-0.001293 -0.000024 0.000506 -0.003621 -0.001984 -0.000744 
+0.001940 0.009998 -0.000821 0.006940 0.006194 0.000130 
+0.008430 0.002065 0.000659 0.005336 0.003151 0.000128 
+-0.001437 0.006101 -0.002438 0.002121 0.004590 -0.003804 
+0.005452 0.006642 -0.000874 0.010278 0.006709 -0.002324 
+0.009828 0.005245 0.000406 0.003345 0.004614 0.000873 
+-0.001568 0.000926 -0.000157 -0.003955 -0.001458 0.000535 
+-0.002878 0.000020 0.002798 -0.001444 -0.001041 0.001915 
+-0.137510 -0.042265 -0.015600 -0.039807 -0.008195 0.019710 
+-0.010000 0.001512 0.011513 -0.002641 0.001905 0.005970 
+-0.000562 0.000569 0.001596 0.014622 -0.005154 0.002199 
+-0.000018 0.000020 -0.000148 -0.069417 -0.030884 -0.039170 
+-0.028859 -0.003587 -0.016413 -0.018703 -0.020528 -0.001521 
+0.015235 -0.004168 -0.019978 0.007422 0.005203 -0.001526 
+-0.000616 -0.003495 0.001455 0.001187 -0.008807 0.003606 
+-0.001316 -0.003917 0.006245 0.000193 0.001656 -0.001943 
+0.004347 0.007906 -0.006950 -0.000022 0.008314 -0.014605 
+-0.000387 0.007368 -0.028914 -0.004186 0.015345 -0.035412 
+-0.007605 0.017704 -0.027815 -0.012797 0.011459 -0.021571 
+-0.008469 0.006702 -0.013869 -0.004543 0.002969 -0.003691 
+0.005873 0.003316 0.003177 0.003897 0.008016 -0.005185 
+0.007859 0.010793 -0.020045 0.023763 0.022491 -0.050074 
+0.014138 0.037966 -0.043898 0.002104 0.014679 -0.009832 
+-1.137681 -1.869565 3.753623 -1.758772 -3.166667 4.947369 
+-1.883959 -3.494880 4.853242 -1.916084 -3.454545 4.311189 
+-1.646226 -2.839623 3.202830 -0.003520 -0.008203 0.008008 
+0.005361 0.013438 -0.021113 0.007759 0.002657 -0.020407 
+0.006144 0.000763 -0.006566 0.007180 -0.002113 -0.002052 
+0.005977 0.000299 0.000299 -0.002262 -0.000061 0.003386 
+-0.007448 -0.004601 0.002745 0.000226 0.003889 -0.007075 
+0.008086 0.017083 -0.014439 0.008959 0.020107 -0.014369 
+-0.003703 0.009171 -0.005892 -0.016245 -0.001474 0.003875 
+-0.011124 -0.002907 0.004479 0.000980 0.004916 0.005810 
+0.002440 -0.003955 0.004986 0.005325 0.008994 -0.030303 
+-0.064850 0.078643 0.052382 0.060379 0.022990 0.112046 
+0.031767 0.038681 -0.004750 0.003296 0.007005 0.015000 
+-0.019347 -0.008003 -0.009534 -0.006603 -0.010457 -0.009112 
+0.046201 0.033450 -0.025998 0.011305 0.013721 0.003189 
+0.000032 0.002103 0.006789 -0.000916 -0.000415 0.005203 
+-0.000227 -0.001545 0.000604 0.002013 0.006385 -0.000687 
+0.004637 0.010242 -0.000134 0.006263 0.010159 0.000455 
+0.008446 0.009079 0.000596 0.011316 0.010587 -0.000400 
+0.013053 0.009682 -0.007156 0.013000 0.002734 -0.001116 
+0.009913 0.004156 0.002105 0.004519 0.003991 0.002779 
+0.000256 0.000142 0.000005 -0.001008 -0.003837 0.000650 
+0.000046 -0.000165 -0.000053 0.002909 0.003604 0.000589 
+0.080031 0.081998 -0.051003 0.060000 -0.008558 -0.012837 
+0.037313 -0.006010 -0.036373 0.021647 -0.008703 -0.022159 
+-0.009411 -0.010632 -0.006232 -0.027301 0.005787 -0.009310 
+-0.050510 -0.013106 0.045116 -0.060746 -0.000932 0.086247 
+-0.055030 0.017721 0.036776 0.002946 -0.048982 -0.022036 
+0.084286 -0.159643 -0.109405 -0.003211 -0.019678 0.011211 
+0.000228 -0.004615 0.001471 -0.000848 -0.001627 -0.000899 
+-0.002768 -0.003686 0.005398 0.001361 0.000743 -0.001908 
+0.000610 0.007339 -0.004702 -0.000938 0.010372 -0.011780 
+0.006348 0.017956 -0.016855 0.013464 0.017912 -0.025174 
+0.008630 0.017714 -0.024967 0.001111 0.019169 -0.020003 
+-0.001965 0.014268 -0.018953 0.004156 0.009974 -0.014154 
+0.006518 0.004436 -0.013096 0.005238 0.009434 -0.009763 
+0.008762 0.008390 -0.017122 0.007348 0.007752 -0.040919 
+-0.008121 0.012404 -0.034568 -0.001091 0.008473 0.000087 
+-0.015293 -0.017393 0.032908 -2.087500 -3.443750 4.987500 
+-2.004878 -3.858536 5.034146 -1.686275 -3.627451 4.284314 
+-1.173333 -2.806667 2.920000 0.001938 -0.003534 -0.000028 
+0.009700 0.016771 -0.022492 -0.000385 0.003264 0.000558 
+-0.005748 -0.007525 0.000060 -0.004332 -0.003743 -0.000745 
+-0.001233 -0.001245 -0.001511 -0.004067 0.001706 0.001749 
+-0.004226 0.001555 -0.001030 -0.004640 0.002686 -0.004351 
+-0.005969 0.004412 -0.012561 -0.009612 0.007558 -0.013894 
+-0.010328 0.008919 -0.009978 -0.003412 0.008025 -0.007217 
+0.002781 0.006598 -0.002354 0.001657 0.000436 0.001342 
+-0.000936 0.002402 0.002454 -0.042391 0.039762 0.017417 
+0.022801 0.031898 -0.005856 0.038194 0.003889 -0.045972 
+-0.014922 0.020752 0.037618 -0.056304 -0.028654 0.033346 
+-0.006811 -0.001649 0.008946 -0.014444 0.000400 0.000578 
+-0.097557 -0.071695 0.052874 -0.071796 -0.040143 0.038053 
+-0.015817 -0.001792 -0.007183 0.011443 0.008069 -0.012449 
+0.003677 0.002221 0.000983 0.001799 0.000554 0.000485 
+0.000654 0.000565 0.000069 0.001140 0.000601 0.000040 
+0.001892 0.003276 -0.000076 0.002054 0.008972 -0.000773 
+0.004707 0.013437 -0.003513 0.011056 0.010349 -0.008314 
+0.018020 0.006812 -0.003717 0.011835 0.009226 -0.006137 
+0.006598 0.004740 -0.004856 0.002771 -0.000110 -0.001658 
+0.002632 -0.003949 0.000146 0.004756 -0.002866 -0.000761 
+0.038056 -0.040556 -0.043056 0.114620 0.078827 -0.022200 
+0.022903 0.018436 -0.007007 0.005160 -0.002809 -0.007590 
+-0.012946 0.003659 -0.035316 0.009097 -0.000268 -0.068478 
+-0.010909 0.004415 -0.023547 -0.079824 -0.035495 0.032549 
+-0.068913 -0.035254 -0.012622 -0.065629 -0.030287 0.018425 
+-0.044797 -0.016139 0.061214 0.005683 0.012236 0.019393 
+0.003424 0.009388 0.010523 -0.002903 -0.000339 0.012035 
+-0.000486 -0.003090 0.005048 -0.000167 0.002184 -0.001207 
+0.001500 0.005584 -0.007179 -0.005337 0.004196 -0.004930 
+-0.002148 0.009093 -0.002621 0.002270 0.011903 -0.004021 
+0.000638 0.009990 -0.002900 -0.003193 0.007488 -0.003003 
+0.001464 0.005302 -0.004210 0.001790 0.000516 -0.002035 
+-0.002374 0.000135 -0.000828 -0.004532 0.000964 -0.002034 
+-0.001270 0.000810 -0.004770 -0.001950 -0.000463 -0.005070 
+-0.010705 0.003160 -0.006236 -0.006839 0.007613 -0.001159 
+-0.005080 -0.001599 0.012147 -0.011397 -0.005042 0.031298 
+-1.513514 -3.459460 4.054054 -0.012754 -0.023268 0.044166 
+-0.004406 -0.011998 0.016360 0.007054 0.012283 -0.012012 
+0.001039 0.020701 -0.017584 -0.001268 0.015855 -0.005304 
+-0.000290 0.007288 0.001298 0.006176 0.002084 -0.001557 
+0.001573 0.000066 -0.002763 -0.005154 -0.001335 0.002161 
+-0.004391 0.001440 0.007816 -0.001851 -0.000917 0.006703 
+-0.002281 -0.000047 -0.007855 0.005495 0.003851 -0.014745 
+0.003019 0.007592 -0.006748 -0.004898 0.003205 -0.003441 
+-0.007725 -0.003444 -0.004592 -0.010100 -0.011878 -0.005786 
+-0.011213 -0.056567 -0.001702 -0.040123 -0.049938 0.121235 
+-0.044176 0.049011 -0.029670 0.029643 -0.009345 -0.053036 
+-0.014444 -0.000444 -0.007111 0.018353 -0.015000 -0.030588 
+0.123594 0.012899 -0.046116 0.031137 -0.031941 0.015511 
+0.007234 -0.041333 0.002972 -0.110667 -0.078667 0.039333 
+-0.069006 -0.038270 -0.009617 0.013034 0.023560 -0.004972 
+0.009241 -0.002569 0.008228 0.009433 0.002259 0.002174 
+0.008747 0.004400 0.000476 -0.000568 0.001124 -0.000185 
+-0.010155 -0.002669 -0.000103 -0.012600 -0.002433 0.000854 
+-0.006390 0.003488 0.000317 0.004093 0.011066 -0.002107 
+0.003898 0.006035 0.000206 -0.000769 -0.004458 -0.001807 
+0.001977 -0.005452 -0.003365 0.003545 -0.002169 -0.002476 
+0.000759 -0.002566 -0.001871 -0.001301 -0.000435 -0.003404 
+0.030211 0.009578 0.008290 0.028593 -0.035741 0.005385 
+0.035902 -0.001129 0.023370 0.034444 0.012222 0.003333 
+-0.001000 -0.018000 -0.032000 -0.048254 0.035397 -0.049841 
+-0.048471 -0.066000 0.012118 0.066062 -0.048695 -0.099945 
+0.028921 -0.013146 -0.047325 0.020048 0.007524 -0.038095 
+-0.016699 0.002665 -0.018968 -0.003379 0.005931 0.001978 
+0.005002 -0.007674 0.005752 0.001995 -0.014068 0.000972 
+0.000808 0.000540 0.001950 0.003137 0.003054 -0.001672 
+0.001866 -0.000097 -0.000450 0.001695 -0.001282 0.002384 
+0.000389 -0.000541 0.001944 -0.000242 0.001271 -0.001345 
+0.000358 0.006082 -0.001574 0.002739 0.006849 0.002968 
+0.001937 0.001856 -0.005631 0.001075 0.004855 -0.006830 
+-0.000205 0.005763 -0.005871 -0.001267 0.003045 -0.003292 
+-0.002999 -0.000761 -0.001262 -0.004700 -0.001632 -0.001324 
+-0.006596 0.000172 -0.000641 -0.003053 0.007765 0.004437 
+-0.003288 0.004499 0.001615 0.005253 -0.003440 0.016085 
+0.009322 0.000060 0.025100 -0.001355 0.005518 0.019676 
+-0.001700 -0.003650 0.001807 0.005788 0.009938 -0.007069 
+0.008986 0.019173 -0.008058 0.007968 0.014066 -0.005897 
+0.004680 0.007249 -0.004152 0.000877 0.002621 -0.001945 
+-0.000896 -0.001289 0.000855 0.002297 0.000029 0.002613 
+-0.003095 -0.002176 0.009436 -0.004189 -0.005115 0.006434 
+0.000246 0.000605 -0.000248 0.001404 0.004051 -0.002369 
+0.000733 0.002153 -0.002841 -0.006110 0.003902 -0.000933 
+-0.006906 -0.002724 -0.003584 -0.006132 -0.006240 -0.002697 
+-0.002395 -0.013450 0.006723 0.008420 -0.026346 0.042642 
+0.021636 -0.017273 -0.043273 -0.034086 -0.056237 -0.041183 
+-0.099736 -0.014917 0.001279 0.004316 -0.022684 0.055105 
+0.144444 -0.016000 0.048000 0.116045 -0.059843 0.031135 
+0.049937 -0.060940 0.025956 0.048344 -0.002543 0.016397 
+0.000000 -0.008857 0.004429 -0.084762 0.023175 -0.003968 
+-0.011940 0.017094 -0.036376 0.006135 0.016832 -0.010983 
+-0.006592 0.008614 -0.006694 -0.007634 0.003680 -0.003130 
+-0.007150 0.000274 -0.000871 -0.008570 0.000541 0.000397 
+-0.004731 0.007142 0.000031 0.010248 0.014784 -0.003388 
+0.020393 0.011570 0.001214 0.008023 0.005847 -0.001185 
+-0.000995 -0.004259 -0.002855 -0.003847 -0.006577 -0.003319 
+-0.000032 -0.003307 -0.001735 0.002744 -0.001515 0.000401 
+-0.178636 -0.087424 0.083636 0.030556 -0.070278 0.071806 
+0.013105 -0.037671 0.040395 0.068513 0.013210 0.002063 
+0.059410 0.025000 0.025992 0.033354 0.012180 0.000899 
+0.018262 -0.025973 -0.003246 0.006349 -0.020454 0.030467 
+-0.006554 -0.010541 0.013530 0.001159 0.002474 0.007485 
+0.007687 0.002251 0.014299 0.004191 0.001321 0.010821 
+-0.001509 -0.007337 0.004076 -0.006655 0.000907 0.002118 
+-0.000789 0.010353 -0.000509 0.007589 0.008776 -0.010200 
+0.007377 -0.001421 -0.010760 0.003304 -0.001625 -0.004236 
+0.000880 -0.000603 -0.001464 0.000289 0.003627 -0.007035 
+0.003343 0.004257 -0.009185 0.009318 0.004019 -0.006710 
+0.009768 0.002284 -0.004179 0.004834 0.002587 -0.002044 
+-0.001099 0.002356 -0.000154 -0.004955 0.000179 0.000015 
+-0.004682 0.001219 -0.001707 -0.000086 0.002119 -0.005702 
+0.003135 0.005076 -0.008560 0.002937 0.011564 -0.007434 
+0.008520 0.011506 -0.004132 0.008202 0.011589 -0.008180 
+0.004192 0.010963 -0.010301 0.000133 0.009096 -0.009294 
+-0.002468 0.006308 -0.005819 -0.001548 0.002998 -0.003102 
+0.002464 0.002139 -0.002151 0.008171 0.004443 -0.004721 
+0.010121 0.007255 -0.008067 0.008444 0.008089 -0.006933 
+0.003730 0.005896 -0.003391 -0.001795 -0.000051 -0.001790 
+-0.004365 -0.003110 -0.000608 0.000000 0.002863 -0.003499 
+0.002148 0.010715 -0.005707 0.003684 0.007982 -0.003094 
+-0.001369 -0.003357 0.000862 -0.003273 -0.009315 0.002913 
+-0.004079 -0.005934 -0.002759 -0.001019 -0.001496 -0.001889 
+0.004748 0.022196 -0.008246 -0.005986 -0.006278 -0.030718 
+-0.022338 -0.101299 -0.047662 0.004494 -0.018363 0.003082 
+0.036667 0.003385 0.000923 0.100488 -0.054739 -0.001498 
+0.009500 -0.028500 0.003750 -0.024191 0.009655 -0.033918 
+-0.013561 0.000163 -0.011772 0.005414 0.001015 -0.013195 
+0.039148 0.013296 -0.026296 -0.008750 0.035000 0.008750 
+0.005760 0.014996 0.003347 0.037632 0.034971 -0.007603 
+0.007004 -0.000817 0.005750 -0.012871 -0.011385 0.003537 
+-0.027414 -0.014915 0.003799 -0.024510 -0.013465 0.004225 
+-0.014664 -0.011794 0.004240 -0.002454 -0.002904 0.001156 
+0.026110 0.016251 -0.016602 0.037733 0.019940 0.001871 
+0.011852 0.008662 -0.000536 0.002110 0.000307 -0.000303 
+-0.003409 -0.000629 -0.000312 -0.007240 0.001701 -0.001036 
+-0.016904 -0.086179 0.034282 -0.004048 -0.009167 0.003452 
+0.009099 0.021766 0.008819 0.008511 0.018511 0.015013 
+0.017130 0.088957 -0.006261 0.021111 -0.017067 -0.022756 
+0.001258 -0.027935 -0.009161 -0.000530 -0.005834 -0.037647 
+0.005121 -0.021325 -0.018420 0.007317 -0.005863 -0.000070 
+0.003048 -0.001686 0.000429 0.009826 -0.002504 -0.000615 
+0.005402 -0.002931 0.001541 -0.004722 -0.002325 0.004832 
+-0.003662 0.002297 0.001969 -0.001660 -0.000520 0.002841 
+0.001482 -0.000826 -0.000404 0.003068 -0.002432 0.002026 
+0.003117 -0.000856 -0.006677 0.005294 0.003584 -0.004658 
+0.001263 0.004185 -0.002352 -0.000188 0.003049 -0.001781 
+0.002891 0.003254 -0.003280 0.005443 0.003866 -0.004743 
+0.002782 0.000734 -0.000464 -0.002880 0.000837 0.000498 
+-0.006840 -0.000576 0.001939 -0.005065 -0.003841 0.000646 
+-0.001113 -0.005824 0.004240 -0.001103 -0.002898 0.002283 
+0.000258 0.002109 -0.001870 0.001972 0.003634 -0.003891 
+0.002005 -0.000106 -0.000299 0.001584 -0.003942 0.004518 
+0.002067 -0.004194 0.003705 0.003362 0.000323 -0.000348 
+0.003364 0.003503 -0.003269 0.001819 0.002027 -0.002384 
+-0.000464 -0.001546 0.001674 -0.001897 -0.004779 0.003189 
+-0.001923 -0.004987 0.002492 -0.001549 -0.002277 0.001266 
+0.000913 0.002440 -0.001919 0.003293 0.005914 -0.004197 
+0.001586 0.000518 -0.000731 -0.001490 -0.010635 0.003515 
+-0.004907 -0.017019 0.008267 -0.006615 -0.007112 0.006911 
+0.000284 -0.001695 -0.003267 -0.003810 0.000854 -0.006260 
+-0.003745 -0.001953 -0.010634 -0.001085 0.003139 -0.005008 
+0.026949 0.014823 0.046937 0.081669 0.037260 -0.023649 
+0.044005 0.091550 -0.028527 0.008421 0.027303 -0.051118 
+-0.015065 0.040779 0.027532 0.003412 -0.020888 0.013219 
+-0.015455 -0.039444 0.016904 0.000000 -0.034706 0.015882 
+0.021872 0.024080 0.009096 0.128127 0.028669 0.012093 
+-0.004900 -0.020341 -0.013705 -0.168143 -0.005536 -0.046821 
+0.074228 -0.030183 -0.047079 0.127817 0.086538 0.009011 
+0.017649 0.005238 0.003518 -0.015062 -0.017116 0.004043 
+-0.008040 -0.003796 0.001096 0.014922 0.028997 -0.008996 
+0.024480 0.044845 -0.010942 0.012132 0.003230 0.014667 
+-0.010091 -0.007309 0.003378 -0.000947 -0.002063 -0.000468 
+-0.002952 -0.003733 -0.001059 -0.003742 -0.006755 -0.002929 
+-0.035714 -0.085357 -0.063571 0.021586 0.001276 -0.015552 
+0.056364 0.102727 0.046364 0.008606 0.052061 -0.006970 
+-0.020634 -0.016289 -0.001242 -0.018462 0.000000 0.053077 
+0.026360 -0.061007 0.012688 0.018157 -0.057231 0.022065 
+0.009479 -0.013938 -0.003886 -0.000230 -0.003038 -0.009994 
+-0.002499 -0.000071 -0.002841 -0.005012 0.001420 0.001221 
+-0.004146 0.000588 0.005183 -0.000823 0.001937 -0.001404 
+0.003241 -0.002655 -0.001141 -0.001739 -0.004157 -0.001134 
+-0.003862 0.002456 -0.001583 -0.003606 0.004019 -0.007515 
+0.001421 0.002535 -0.005900 -0.000746 -0.001457 0.001712 
+-0.004661 -0.002727 0.005657 -0.006738 -0.002686 0.004911 
+-0.000291 0.001782 0.000697 -0.000492 0.000679 0.000313 
+0.003989 -0.000336 -0.004829 0.003937 0.003025 -0.009366 
+0.000056 0.002470 -0.007466 -0.001786 0.001389 -0.001853 
+-0.000700 0.000783 0.000606 0.000294 -0.000816 0.000391 
+0.001692 0.000444 -0.000768 0.001511 0.001495 -0.000888 
+0.000166 0.001464 -0.000480 -0.001698 -0.000532 -0.000174 
+-0.003529 -0.003487 0.001029 -0.004086 -0.004124 0.002618 
+-0.002380 -0.001551 0.001523 0.001843 0.000638 -0.000880 
+0.005033 0.003249 -0.000407 0.003258 0.004583 -0.002029 
+0.001246 0.005749 -0.003262 0.001071 0.006608 -0.003472 
+0.002304 0.006342 -0.002743 0.001855 0.004147 -0.001882 
+-0.001264 -0.001524 0.000141 -0.004519 -0.004185 0.004852 
+-0.000134 0.001154 -0.001597 0.006294 0.008214 -0.003763 
+0.008374 0.005862 -0.001395 0.000555 0.000251 0.002331 
+-0.000205 -0.009400 -0.001089 0.007466 -0.023368 0.034781 
+0.100000 -0.070096 0.046731 0.030814 0.075362 -0.003924 
+0.155897 0.077631 -0.069805 -0.000833 -0.057824 0.067461 
+-0.072898 -0.064790 0.063979 -0.018182 0.005455 0.016364 
+-0.067692 -0.018590 0.035769 -0.018083 -0.032293 -0.003233 
+0.010628 -0.016431 -0.009671 0.012798 -0.002133 0.002133 
+-0.017500 -0.000573 -0.001051 -0.032402 -0.000103 -0.005590 
+-0.010906 -0.025137 -0.020203 0.000255 -0.039707 -0.008625 
+-0.002143 -0.019286 0.003214 0.014850 0.009870 -0.006811 
+0.018315 0.032397 -0.013537 0.017652 0.051729 -0.014868 
+0.059210 0.038341 -0.003373 -0.006068 0.002995 -0.000387 
+-0.103700 -0.081770 0.008077 0.002925 0.006222 0.002314 
+0.001487 0.001405 0.000529 0.004228 -0.001435 -0.000779 
+-0.018738 -0.057156 -0.068399 -0.030859 0.033157 -0.043990 
+-0.017726 0.012989 0.000789 0.022646 0.057549 -0.035853 
+-0.003750 0.040000 -0.036250 -0.049876 -0.017355 0.070124 
+-0.022107 0.005746 0.054654 -0.002166 0.003684 0.009588 
+0.003788 -0.004554 -0.005245 0.005646 -0.010980 0.003580 
+0.000188 -0.019957 0.005545 -0.007354 -0.015311 0.012863 
+-0.004241 -0.005965 0.005249 -0.004057 -0.004212 0.000007 
+0.002581 0.000623 0.008323 0.001740 0.000412 0.005847 
+0.005190 -0.002360 -0.003912 0.005823 -0.006641 -0.003815 
+0.001485 -0.001594 -0.001242 -0.001497 0.002636 -0.000723 
+-0.001085 0.005280 -0.002242 -0.002665 0.002039 -0.000077 
+-0.001148 0.000106 -0.001926 0.003269 0.000000 -0.004038 
+0.006051 -0.003013 -0.004506 0.005776 -0.003933 -0.004818 
+0.006102 -0.001937 -0.002107 0.003424 0.002234 -0.000267 
+-0.000363 0.001879 0.000219 -0.000534 0.001180 -0.000342 
+-0.000596 -0.000495 -0.000020 -0.002126 -0.002027 -0.000432 
+-0.004153 -0.001104 0.000296 -0.002787 -0.000102 0.000939 
+0.000616 0.000548 0.000236 0.001347 0.001258 0.000869 
+0.005455 -0.000923 -0.000615 0.005281 0.001395 -0.006010 
+0.000360 -0.000540 -0.002342 -0.003433 0.001834 -0.000455 
+-0.000944 -0.002342 0.009404 -0.005622 -0.004955 0.007495 
+-0.002159 -0.002363 0.000751 -0.000743 0.001546 -0.002722 
+-0.001573 0.000391 -0.003067 -0.003881 -0.003494 -0.001902 
+-0.000390 -0.002059 -0.004140 0.001527 0.007257 -0.002852 
+0.004096 0.006344 -0.002948 -0.000926 0.004966 -0.005007 
+0.000486 0.007911 -0.012856 0.003680 0.006135 0.012750 
+0.041538 0.098718 -0.020513 -0.010258 0.084029 -0.059585 
+-0.005605 0.013642 -0.003163 0.008336 0.006225 -0.004568 
+0.009203 0.043788 -0.002650 0.024191 0.016159 -0.066550 
+0.072308 0.005489 -0.000915 0.058506 -0.012922 0.015195 
+0.041481 0.013926 0.034519 0.026811 0.020938 0.002107 
+0.025017 0.029395 -0.021622 0.031853 0.045645 -0.045061 
+0.004932 0.017239 -0.051733 0.010498 0.001346 0.003501 
+-0.008404 -0.004877 0.023211 -0.014546 -0.017432 0.063933 
+-0.123578 -0.055660 0.059003 -0.056254 0.166761 0.021405 
+0.088121 0.082758 -0.006450 -0.012008 0.000738 -0.014536 
+-0.019029 0.009607 -0.011232 -0.015402 -0.006845 0.006000 
+-0.015793 0.002792 0.015597 -0.001374 0.004334 0.016566 
+0.008462 -0.020385 0.020385 -0.025644 0.010189 0.023182 
+0.034150 0.066682 -0.081318 0.070535 0.145267 0.040905 
+0.011278 -0.001085 -0.034121 -0.014833 -0.006677 0.041611 
+-0.006366 0.000736 0.006945 0.001630 0.002867 -0.007080 
+0.000000 -0.001782 0.002291 0.000704 -0.004708 0.000748 
+0.007189 0.000174 -0.003682 0.020300 0.006840 -0.014239 
+0.012966 0.001383 0.001188 0.008846 -0.003993 0.008522 
+0.006824 -0.005788 0.005125 -0.005089 -0.007182 0.002480 
+-0.003109 0.000752 -0.002138 -0.003710 0.003363 0.003231 
+-0.004493 0.003657 0.004267 -0.005125 0.002429 0.003924 
+-0.007329 -0.001834 0.001440 -0.002680 -0.004428 -0.000013 
+-0.001404 -0.001990 0.001305 -0.001103 0.003695 -0.001599 
+-0.004174 0.006095 -0.003652 -0.003252 0.005492 -0.005888 
+-0.001224 0.004184 0.000000 -0.000182 0.004356 -0.000818 
+0.001776 0.005626 -0.000879 0.004968 0.003266 0.000428 
+0.002969 0.001928 0.001416 0.001528 0.000932 0.000783 
+0.000561 -0.000935 0.000561 0.002138 -0.001447 -0.000692 
+0.003745 0.003170 0.000519 0.003809 0.008528 -0.002217 
+0.000217 0.008015 -0.006586 -0.002634 0.004573 0.001293 
+0.000120 0.004114 -0.000871 -0.002233 0.000427 -0.002408 
+-0.002430 0.000132 0.000033 -0.001533 0.001831 0.001142 
+-0.002193 0.002193 0.000000 -0.000964 0.000397 -0.001094 
+-0.001452 -0.000424 -0.001314 -0.001312 -0.000554 -0.001050 
+0.000649 0.000268 0.000379 -0.002124 0.004432 -0.000499 
+0.004343 0.003882 -0.002869 0.000104 -0.000091 -0.010147 
+0.000872 0.010120 -0.010056 -0.000012 0.000572 -0.001113 
+0.036340 0.029511 -0.046703 0.004470 0.054529 -0.000412 
+0.008912 0.012262 0.021413 0.010016 0.008921 0.013764 
+-0.005575 0.028162 0.012437 0.015919 0.015459 0.012899 
+-0.005753 -0.016312 0.004468 0.014375 0.008750 0.014375 
+-0.005418 0.002166 0.000994 -0.017183 -0.010278 0.006366 
+-0.005978 -0.000825 -0.000337 0.001333 0.007508 -0.013138 
+-0.008810 -0.008452 0.009167 -0.022527 -0.024121 0.006978 
+0.049385 -0.069237 0.038589 0.035129 0.024340 -0.021183 
+0.048899 0.123201 -0.075942 0.007145 0.119581 -0.048547 
+-0.004594 0.016551 0.010101 -0.044901 -0.060506 0.060123 
+-0.053136 -0.062263 0.038647 -0.015079 -0.061508 -0.003175 
+0.013151 0.014844 -0.004217 0.002701 0.020987 -0.020675 
+0.003338 0.075000 -0.001908 0.034005 0.110146 0.000904 
+0.034181 0.004482 0.023067 0.003311 -0.005023 -0.017974 
+0.005603 -0.004916 0.001120 0.010145 -0.006311 -0.001946 
+0.008218 -0.006647 0.001695 0.005352 -0.004571 0.001617 
+0.000420 -0.006430 -0.000960 -0.003146 -0.008475 0.001584 
+-0.003105 -0.004914 0.002806 -0.011348 -0.003267 0.000530 
+-0.008040 -0.000958 -0.002230 -0.002331 -0.004927 0.000865 
+0.000746 -0.000225 0.001745 -0.002688 0.002794 0.001430 
+-0.005651 0.003236 0.002410 -0.004056 0.003964 -0.000964 
+-0.000127 0.005421 -0.004717 0.002700 0.003747 -0.002534 
+-0.001441 -0.000901 0.000180 -0.004950 -0.003083 0.001231 
+-0.003460 -0.002358 -0.000441 -0.000495 0.002430 -0.000297 
+-0.000483 0.004423 -0.000414 0.001560 0.008384 -0.003782 
+0.006000 0.003697 -0.009241 -0.001051 0.001577 -0.004554 
+0.002510 0.002964 -0.001442 -0.001413 -0.000471 0.000481 
+-0.005251 -0.002617 0.001057 -0.004921 -0.004049 0.003087 
+-0.001612 -0.003499 0.002870 0.002399 -0.001497 0.001196 
+0.004695 -0.000213 -0.002476 0.004848 0.002421 -0.006056 
+0.004810 0.006055 -0.008229 0.003684 0.007368 0.000000 
+-0.001286 0.000514 -0.006667 -0.002971 0.000795 -0.002638 
+-0.001214 0.001257 -0.000130 0.001170 0.002509 0.000237 
+0.002161 0.002905 0.001251 0.001513 0.001024 0.000745 
+-0.000227 0.001458 -0.001089 -0.000451 0.002513 -0.002868 
+-0.001176 0.000756 -0.001819 -0.004464 -0.003814 -0.000034 
+-0.002566 -0.003343 0.004586 -0.001989 -0.000091 -0.004505 
+-0.001639 -0.001599 -0.001293 -0.001348 -0.003918 0.007883 
+0.008641 0.008465 0.009293 -0.004882 0.086585 -0.049872 
+0.023017 -0.030347 -0.100042 0.031222 0.015686 0.004148 
+0.010667 -0.006667 -0.013333 0.032781 -0.007807 0.021872 
+0.001585 0.013698 0.025160 0.024048 0.017262 0.004405 
+0.008376 0.015983 -0.020171 0.020745 0.019727 -0.040218 
+0.040553 0.002684 0.024447 -0.002976 0.008095 0.052381 
+0.003571 -0.002143 0.002857 -0.013762 0.035911 0.007777 
+-0.009847 0.049634 -0.015071 -0.008810 0.050595 -0.065952 
+-0.036638 0.015000 -0.014655 -0.029218 -0.028601 -0.079733 
+-0.013388 0.024628 0.015537 0.012840 0.028313 -0.004537 
+0.015039 0.018976 0.004733 -0.004473 0.007500 -0.002684 
+-0.030209 -0.020423 0.007659 -0.022771 -0.028902 -0.004671 
+0.020000 -0.004769 -0.009538 0.007101 -0.013846 -0.035503 
+-0.005583 -0.008214 -0.030482 -0.004293 0.001940 -0.005253 
+0.002143 0.012558 0.002715 0.018106 0.020669 -0.001538 
+0.018807 0.017776 0.005748 0.000482 0.009231 0.001920 
+-0.006790 -0.007494 -0.002707 -0.010595 -0.009124 0.004415 
+-0.000455 -0.008111 0.002855 0.004027 -0.001921 -0.001443 
+0.003558 0.002775 -0.003818 0.006696 0.003877 -0.002538 
+-0.000133 0.007342 0.001939 -0.001496 0.002825 -0.002662 
+-0.000522 0.002788 -0.003868 -0.000446 0.003565 -0.002610 
+-0.001690 0.001627 -0.000580 -0.000170 -0.001219 -0.000865 
+0.000773 -0.003863 -0.000536 -0.002368 -0.003412 -0.000284 
+-0.002646 -0.001431 -0.001151 -0.002752 -0.000095 -0.001222 
+-0.001694 0.001080 -0.001002 0.001900 0.004516 -0.004041 
+0.005712 0.008868 -0.005436 0.006408 0.004818 -0.000803 
+0.003199 -0.002718 -0.000337 -0.001503 -0.004847 0.001122 
+-0.002465 -0.002184 0.005579 -0.000956 0.000660 0.002438 
+0.001832 0.000859 -0.001153 0.001708 0.000518 -0.000252 
+0.000834 0.003356 -0.001797 -0.001126 0.005230 -0.003575 
+-0.002460 0.005612 -0.002229 -0.003090 0.001520 -0.004292 
+-0.002494 -0.001961 -0.006628 0.001635 -0.001906 -0.007624 
+-0.001546 0.007925 -0.001030 -0.002473 0.007817 -0.008214 
+-0.000291 -0.000883 -0.002650 0.003394 0.000457 -0.005233 
+0.003214 -0.000704 -0.002528 -0.005692 -0.001823 -0.002206 
+-0.006779 -0.007193 -0.000987 -0.004957 -0.006533 -0.000332 
+-0.002970 0.001828 -0.002802 -0.001593 -0.000240 0.003265 
+-0.004111 -0.003889 0.007472 -0.000882 -0.003885 0.007661 
+0.002958 0.002659 0.003412 0.020422 0.027840 0.009121 
+-0.081215 -0.070785 -0.024336 -0.026993 0.040490 -0.096364 
+-0.078291 0.037845 -0.065287 -0.014600 0.004867 -0.022667 
+0.030000 0.000000 -0.002941 0.020974 -0.033558 0.022000 
+0.000512 -0.011710 0.039194 -0.028451 0.038397 -0.014457 
+-0.035074 0.001250 -0.007794 -0.021525 -0.070085 0.020525 
+-0.043026 -0.018974 -0.008821 0.022626 -0.023207 0.002323 
+-0.061163 -0.092171 -0.018605 -0.045473 -0.026849 -0.047512 
+0.046765 0.002620 0.043337 0.075593 -0.036079 -0.048967 
+0.075000 -0.007954 -0.047722 0.049725 0.009945 -0.030000 
+0.097333 0.000000 -0.035333 0.097857 -0.007335 -0.031173 
+0.077634 0.021859 -0.031906 0.043917 0.052701 -0.032632 
+0.032547 -0.002689 0.007217 -0.023600 0.007556 -0.012978 
+0.006362 -0.027469 -0.010842 0.010190 -0.039350 -0.000702 
+0.003582 -0.038096 0.003907 -0.001634 -0.006620 -0.005943 
+-0.005374 0.016156 -0.004154 0.002804 0.018398 0.005549 
+0.001602 0.010416 -0.004006 0.000125 0.004508 -0.001628 
+0.000900 0.000889 -0.000168 -0.000988 -0.006049 0.000062 
+-0.000646 -0.011931 -0.002875 0.005560 -0.006829 0.000030 
+0.001812 -0.002193 -0.000911 0.000200 0.000507 -0.001004 
+-0.000698 0.001008 -0.000041 -0.001663 0.000698 0.000599 
+-0.001822 0.000970 0.000891 -0.001327 0.001376 -0.000016 
+-0.000365 0.000455 -0.000055 0.000304 -0.002251 -0.000140 
+0.001041 -0.003655 -0.000523 0.001052 -0.001915 -0.000523 
+0.003958 0.002193 -0.000856 0.004542 0.004081 -0.000024 
+0.000643 0.000795 0.000223 -0.001495 -0.003654 -0.000575 
+-0.001185 -0.002962 0.002455 0.001040 -0.000281 -0.001213 
+0.003161 0.001841 -0.005308 0.005314 0.003171 -0.001061 
+0.003176 -0.000012 -0.000640 0.002531 0.000978 -0.001331 
+0.004613 0.002360 -0.004292 0.000649 0.003288 -0.008209 
+-0.000041 0.001998 -0.004882 -0.000042 0.000238 0.001368 
+-0.007075 -0.003868 0.001415 -0.005884 -0.000631 0.004554 
+-0.003364 0.000168 -0.000252 -0.000426 0.000797 -0.001529 
+0.001306 0.001850 -0.000490 0.000485 0.003527 0.001219 
+-0.000064 0.001465 0.003632 -0.001138 0.000000 -0.000379 
+0.000200 -0.001488 0.001205 0.001378 0.003182 -0.000847 
+0.002348 0.008700 -0.004324 -0.001918 0.008361 -0.000639 
+-0.001759 0.000110 -0.001963 -0.006648 -0.000173 0.003920 
+-0.001876 -0.003072 0.000697 -0.004908 -0.008632 0.005297 
+-0.000548 -0.001597 0.004219 -0.025572 0.018478 -0.045920 
+-0.006024 0.014762 -0.053619 0.010680 0.008000 -0.014240 
+0.001377 0.010580 -0.006431 -0.000988 0.006790 0.000617 
+-0.083587 0.025761 0.026812 -0.048301 0.065337 0.000351 
+-0.030105 0.075895 0.007632 0.047928 0.102222 -0.007988 
+0.055556 0.052968 -0.019863 0.027350 0.007778 0.005470 
+0.010776 0.002661 0.004035 0.014801 0.040893 0.018027 
+0.001327 0.005561 0.019337 0.022231 -0.007692 -0.035923 
+0.013595 0.019935 -0.012680 -0.005657 -0.015303 0.005330 
+-0.064039 -0.013762 0.081470 0.112365 -0.013988 0.055345 
+0.017150 -0.002393 -0.057273 0.021321 -0.001481 -0.009783 
+-0.008999 0.025405 0.007010 -0.012138 0.001618 -0.009172 
+-0.004725 0.000720 -0.001440 -0.005906 0.001559 -0.001282 
+-0.005287 0.004405 0.000270 -0.001345 0.006237 0.008724 
+0.000705 0.000332 0.000240 0.003182 -0.012362 0.001285 
+0.005657 -0.007634 0.003191 -0.000020 0.001789 -0.000793 
+-0.005187 0.003021 -0.003167 -0.011503 -0.004652 0.004079 
+-0.011715 0.001954 -0.001560 0.001410 -0.000940 0.007974 
+0.001660 -0.004580 0.005664 0.001205 -0.003783 0.001460 
+-0.000274 -0.004200 0.000434 -0.001583 -0.004260 -0.001018 
+-0.000308 -0.003273 -0.001278 -0.000251 -0.003409 -0.000526 
+-0.003009 -0.005023 -0.000837 -0.002462 -0.005467 -0.003321 
+-0.000780 -0.005907 0.000149 0.000095 -0.003905 0.000476 
+-0.001187 -0.001499 -0.002093 -0.004762 -0.002839 -0.001896 
+-0.005490 -0.003327 -0.001040 -0.002648 -0.001900 0.000806 
+0.002125 0.001593 -0.001505 0.004403 0.001254 -0.002378 
+-0.000454 -0.002460 -0.002174 -0.004071 -0.003118 -0.003354 
+-0.005280 -0.002426 -0.001631 -0.002707 0.000899 -0.000772 
+-0.000573 0.000250 0.000196 -0.000333 -0.000061 -0.001851 
+0.000738 0.001189 -0.003525 0.000641 -0.002051 -0.000353 
+0.000673 -0.003572 -0.004348 0.000172 -0.003943 -0.001371 
+-0.003048 -0.004505 0.002139 0.000227 -0.000742 -0.000864 
+-0.000354 0.003774 -0.000191 0.007453 0.007739 0.000018 
+0.008266 0.007364 -0.007730 0.003196 0.004475 -0.003913 
+0.001025 0.000459 0.001466 0.000874 -0.003114 0.003726 
+-0.002260 -0.005548 0.002055 -0.006495 -0.001734 -0.003931 
+-0.002262 0.006892 -0.009144 0.006737 0.010306 -0.007182 
+0.002656 0.000096 -0.008062 0.005212 0.004954 0.003001 
+0.002450 0.001031 0.004189 0.003055 0.010977 -0.023741 
+0.052991 -0.000085 -0.013034 0.030353 0.007765 0.037765 
+0.009434 0.008396 0.010236 -0.008854 -0.002221 0.007716 
+-0.049353 -0.009441 0.031543 -0.119418 -0.042182 0.036836 
+-0.113580 -0.019136 0.026543 -0.051405 0.027000 -0.008568 
+-0.026444 -0.106444 -0.033222 -0.054329 -0.060000 -0.006037 
+-0.109259 -0.087609 0.040640 -0.051061 -0.039242 -0.045152 
+-0.011882 -0.009961 -0.020271 0.012169 -0.010398 -0.016454 
+0.023542 0.010417 -0.028542 -0.000267 0.010917 0.004453 
+0.004617 0.005646 0.013203 0.006129 0.001868 0.010467 
+0.002894 0.001477 0.005290 -0.002127 -0.001712 -0.001991 
+0.005330 -0.014326 0.007218 0.008214 0.002053 0.003679 
+0.004055 0.006295 0.001531 -0.003390 0.003115 -0.000726 
+-0.007348 0.002658 -0.003710 -0.000362 0.006168 0.001364 
+0.007833 0.005140 0.000663 0.006168 -0.000276 -0.002425 
+0.000303 -0.003209 0.000285 -0.001224 -0.001743 0.001089 
+-0.004016 -0.000605 -0.008363 -0.002492 -0.003547 -0.013644 
+0.002078 -0.004598 -0.007816 0.003650 -0.005087 -0.000379 
+0.001917 -0.004527 0.001889 -0.001452 -0.002506 0.001421 
+-0.003846 -0.000306 -0.000115 -0.001552 -0.000635 -0.000436 
+0.004317 0.000032 -0.004254 0.005900 0.002810 -0.006319 
+0.001962 0.000395 0.000590 -0.001128 0.005269 0.000430 
+-0.001350 0.005252 -0.000010 0.001017 0.003768 0.000682 
+0.003883 0.003464 -0.000577 0.003462 0.003435 -0.001527 
+0.001057 0.003046 -0.001281 -0.001166 0.001278 -0.000865 
+-0.002079 0.000097 -0.000044 -0.002446 -0.000295 0.001186 
+-0.001358 -0.001897 0.000933 -0.000719 -0.001409 0.000525 
+0.001229 0.000485 -0.000861 0.004141 0.002051 0.002588 
+0.000856 0.001071 0.001355 -0.000499 -0.001841 -0.000972 
+-0.000343 -0.001371 -0.001359 0.000268 0.003046 -0.000213 
+-0.000500 0.005982 -0.001000 0.000091 0.004136 -0.003955 
+-0.003509 -0.001654 -0.001989 -0.004688 -0.000874 0.002307 
+-0.004952 0.000415 0.003732 -0.005109 0.001340 -0.000544 
+-0.004526 -0.004312 -0.003578 -0.003279 -0.002505 -0.001622 
+-0.000174 -0.000435 -0.000435 -0.000545 0.002413 -0.002243 
+-0.001284 0.001109 -0.002519 0.001429 0.002595 -0.000775 
+0.000911 0.007519 0.001587 0.006639 0.005008 -0.004035 
+-0.001028 0.003255 -0.005639 -0.006105 -0.000778 -0.004856 
+-0.004611 0.001528 -0.009479 0.010376 0.027803 -0.023402 
+-0.045881 -0.042051 0.003864 -0.034596 -0.091351 -0.010854 
+-0.034255 -0.018719 -0.008723 -0.052544 -0.016119 0.035902 
+-0.055852 -0.032459 0.053585 -0.090947 -0.056864 0.086391 
+-0.044461 -0.008864 0.013851 0.090667 -0.000889 0.017778 
+0.066364 -0.030374 -0.007594 0.065333 -0.037778 -0.021778 
+-0.004123 0.003989 -0.008166 -0.009035 0.011250 -0.021942 
+-0.002321 0.005216 -0.000894 -0.008928 0.008856 0.007104 
+0.009420 0.009861 0.028443 -0.007293 0.015619 0.010170 
+0.001188 0.006218 0.004334 -0.001193 0.006108 0.005670 
+0.004790 0.000494 0.002050 0.003850 0.004296 0.001788 
+0.015738 0.020974 -0.008105 0.007327 0.009727 -0.002159 
+0.008498 -0.011849 0.001989 0.000818 -0.035160 0.005601 
+-0.109099 -0.090857 -0.015266 -0.169911 -0.048948 -0.017906 
+0.127350 0.133996 -0.031284 0.016325 0.039516 -0.070032 
+-0.001016 -0.003540 -0.020781 0.008926 -0.000759 -0.012537 
+0.008776 -0.026735 -0.014898 0.009038 -0.003186 0.001233 
+0.000042 -0.000689 -0.000242 -0.001696 -0.001981 -0.000682 
+-0.008166 -0.008427 -0.004029 -0.010407 -0.015585 -0.005207 
+0.001710 0.011875 -0.000997 0.020548 0.012410 -0.017201 
+-0.096875 -0.017500 -0.096875 -0.005749 0.072247 -0.037753 
+0.090238 0.047381 -0.068810 -0.004364 0.011818 0.001455 
+-0.033045 0.046987 0.051635 -0.037250 0.012417 0.060000 
+-0.039231 -0.028462 -0.017692 -0.027143 -0.033117 -0.036104 
+0.000866 -0.024080 0.095022 0.007143 -0.010385 0.006923 
+-0.002222 0.001111 -0.001111 -0.010000 0.000862 -0.000345 
+-0.007579 0.014841 0.044206 -0.045909 -0.001727 0.051091 
+0.044667 0.034333 0.020667 0.005694 0.006944 0.008194 
+0.016503 -0.004196 0.011329 -0.006111 -0.018889 0.003889 
+-0.078333 0.019167 0.059167 -0.077238 -0.012048 -0.014524 
+-0.088571 0.065397 -0.071746 0.007574 -0.014265 0.013824 
+0.004431 -0.010284 0.010033 -0.000894 0.014307 -0.007750 
+-0.034000 -0.026000 -0.106000 0.097011 -0.100435 -0.168533 
+-0.003333 -0.036667 -0.031667 -0.005135 -0.060000 -0.030811 
+0.040000 0.000000 -0.006667 0.009231 -0.006154 0.034444 
+0.039286 -0.072738 0.139643 0.122105 0.012632 0.117895 
+0.013216 0.054035 0.031228 -0.022230 0.035895 0.021863 
+0.024009 0.009738 0.002081 0.010626 0.027051 -0.031013 
+-0.009057 -0.004096 -0.010938 -0.010845 -0.006769 -0.011836 
+-0.008208 0.010504 -0.005765 -0.001248 0.012650 -0.006575 
+-0.007730 0.007987 -0.003203 -0.006684 0.001629 -0.019188 
+-0.000913 -0.001423 -0.008116 0.000346 -0.000882 -0.002435 
+-0.001500 0.000235 -0.001743 0.000580 0.002675 -0.003581 
+-0.001277 0.006218 -0.011727 -0.004308 0.007724 -0.020758 
+-0.001523 0.005415 -0.002962 -0.000091 0.001180 -0.002820 
+-0.005655 -0.004748 0.000781 0.001525 -0.008787 -0.002251 
+0.005171 -0.002689 0.003805 0.006166 0.001809 -0.010721 
+0.006069 0.007029 -0.027855 0.011505 0.008415 -0.020194 
+0.005208 0.011856 -0.002400 -0.000079 0.000317 0.000079 
+0.001633 -0.000790 0.000516 0.004797 -0.005990 0.002656 
+-0.005055 -0.016497 0.004954 -0.028487 -0.021381 0.006505 
+-0.043284 -0.033855 0.014208 -0.020114 -0.035977 0.013439 
+-0.006250 -0.016799 0.003632 -0.027333 -0.010667 0.000000 
+0.013229 0.009813 -0.008157 0.003768 0.001368 0.010211 
+0.002940 -0.007078 -0.000212 0.003624 0.002382 0.001337 
+0.006455 0.006296 0.001949 0.001908 0.002673 0.000062 
+0.007378 0.008098 -0.012106 -0.020455 0.012000 -0.010091 
+-0.074615 0.027593 0.047302 -0.056741 -0.000593 0.026517 
+-0.063155 -0.012097 -0.022086 -0.042367 -0.023267 0.000833 
+0.097947 0.021291 -0.004788 -0.019250 -0.015833 -0.006417 
+-0.042269 -0.009412 -0.005168 -0.072168 -0.042168 0.038112 
+-0.011667 0.012500 -0.014167 -0.014056 -0.046364 0.009371 
+-0.016714 -0.033429 0.039286 0.030769 -0.059231 0.026154 
+-0.029091 0.050909 -0.014545 0.049298 0.034298 -0.066877 
+-0.053422 0.111661 -0.022625 0.150000 0.000000 -0.018000 
+-0.018707 0.009830 -0.025680 -0.003216 -0.005439 -0.025965 
+-0.008769 0.005846 0.051000 -0.033091 0.016545 0.075455 
+-0.030606 -0.052121 0.056667 -0.004309 -0.005556 0.003078 
+-0.051111 0.067222 0.016111 -0.009480 0.014718 -0.009827 
+-0.013257 0.003840 -0.005361 0.021723 0.023201 0.015247 
+-0.067919 -0.132927 0.049969 0.022198 -0.022527 0.043407 
+-0.038159 -0.002611 0.014219 0.033812 0.070223 0.027959 
+-0.009265 -0.002426 0.009926 -0.000591 0.005320 0.002217 
+-0.009780 0.026584 -0.067218 0.079764 0.053789 -0.032457 
+0.101131 0.083384 -0.068798 -0.001967 0.002117 -0.017393 
+-0.008663 -0.024545 -0.011070 0.012653 -0.030408 0.013469 
+-0.057386 -0.026144 0.018170 0.001196 0.000952 -0.010146 
+-0.000323 -0.007220 -0.022864 -0.011498 0.009723 0.008334 
+-0.005421 0.023008 0.026852 0.003496 0.005619 -0.018212 
+0.000861 0.000557 -0.009494 0.003167 -0.001875 -0.004570 
+0.000736 -0.003115 -0.000766 0.000259 -0.000014 0.002461 
+-0.007325 0.007986 -0.026150 0.094545 0.026738 -0.106952 
+0.001575 -0.003459 -0.000025 -0.003098 -0.001971 0.003030 
+-0.000569 -0.000085 -0.000595 -0.001804 0.000777 0.000575 
+0.001743 -0.002133 -0.006839 0.010222 -0.007433 -0.005579 
+-0.080983 -0.033571 0.039872 -0.011741 -0.012407 0.020148 
+-0.008417 -0.000977 0.013880 -0.005456 0.001691 0.005476 
+-0.001714 -0.003099 0.001665 -0.006175 -0.001779 0.000249 
+-0.009638 -0.001178 -0.000878 -0.009244 0.003521 -0.004261 
+-0.004912 0.008560 -0.006184 0.000775 -0.002274 0.000915 
+0.021805 -0.032976 0.007405 0.101041 -0.044041 0.006801 
+0.096143 -0.031478 -0.014838 -0.016114 -0.022408 0.015883 
+0.002825 -0.006912 0.006592 -0.001733 0.015285 -0.003756 
+0.003878 0.016351 -0.000063 0.007238 0.002036 -0.003700 
+-0.006676 -0.018068 -0.000873 0.023636 -0.042121 0.028788 
+-0.002067 0.014029 -0.005658 -0.003260 0.001800 0.002396 
+0.006410 0.000883 -0.005647 0.000683 -0.026236 -0.023784 
+-0.020000 -0.142667 0.071333 0.021067 0.056344 -0.020415 
+0.010722 0.021110 -0.016726 -0.057475 -0.001441 0.016592 
+-0.102364 -0.004909 -0.087636 -0.077154 -0.034308 0.018221 
+-0.084901 -0.073439 0.028972 -0.061096 -0.015921 0.034430 
+-0.011281 0.024351 0.041719 -0.012708 0.036042 -0.005833 
+0.001778 -0.030000 0.003556 0.006782 -0.039368 -0.014598 
+-0.055930 -0.056842 -0.020105 -0.061131 -0.061333 0.005094 
+-0.023466 -0.035457 0.033372 0.005043 -0.014545 -0.017650 
+-0.067922 -0.024805 -0.006494 -0.024073 0.027927 0.010277 
+-0.037278 0.024994 0.014843 0.008378 -0.002833 0.005303 
+0.009305 -0.009337 0.012546 0.014362 -0.006879 -0.054309 
+-0.002529 -0.024444 0.006322 -0.027125 0.003014 0.032857 
+0.033702 0.019231 -0.024183 0.001673 0.016005 -0.010148 
+-0.012571 -0.012810 -0.013286 -0.002338 -0.052286 -0.021325 
+-0.010364 0.031091 -0.029364 -0.016463 0.010618 -0.000195 
+0.002305 0.001548 -0.003712 0.017619 0.046667 -0.110952 
+-0.016080 0.005605 -0.035562 0.012560 -0.026429 0.018631 
+0.003217 -0.005387 -0.000248 0.001291 -0.006682 -0.012093 
+-0.004202 -0.009732 -0.003247 -0.003416 0.008571 0.004336 
+-0.008285 0.020113 -0.008648 -0.001448 -0.006445 0.003653 
+0.004311 -0.000057 -0.003994 0.009078 -0.001247 -0.000730 
+0.002792 -0.002113 0.001196 0.002045 -0.000449 0.007920 
+0.007273 -0.013636 -0.002727 0.012291 -0.008916 0.000168 
+0.003401 -0.007104 0.003502 -0.021225 -0.022440 0.041712 
+-0.028978 -0.024228 0.048408 -0.014565 0.004551 0.023684 
+0.002916 0.031838 0.020075 0.018827 0.051416 -0.003432 
+0.016432 0.039951 -0.013108 0.036325 0.042099 -0.032498 
+0.013741 0.023476 -0.015836 0.000635 0.006561 0.002750 
+-0.000970 -0.000912 0.000727 0.002226 0.002163 -0.001056 
+0.003476 0.003719 -0.000921 0.000759 -0.003189 0.001267 
+-0.003418 -0.008582 0.001851 -0.007959 -0.001474 -0.001870 
+0.006217 0.007598 -0.003078 0.035522 -0.007502 0.007123 
+0.037883 -0.018853 0.008724 0.012510 0.002833 -0.003982 
+0.012349 0.007405 -0.011589 0.003269 0.009364 0.010417 
+-0.000836 0.000155 -0.000433 -0.007070 -0.001026 0.000545 
+-0.018683 -0.016255 0.016429 -0.053411 -0.060104 0.066594 
+0.024172 0.040088 0.005073 -0.001940 -0.005569 -0.006032 
+-0.015869 -0.015752 -0.000214 -0.009450 -0.011126 -0.010448 
+-0.009059 0.010987 -0.043699 0.066667 -0.046667 0.056667 
+0.097333 0.011333 -0.074667 0.029231 0.060192 0.018910 
+0.000270 -0.002973 0.002703 0.009387 -0.017450 -0.024131 
+0.002482 -0.027509 0.013527 -0.007368 -0.021579 0.000000 
+0.000000 -0.012500 0.026250 -0.015491 -0.004328 0.067545 
+0.017143 -0.041008 -0.010252 -0.044160 -0.066809 -0.002390 
+0.028889 -0.148575 0.031837 0.031946 -0.007081 -0.003046 
+-0.027630 0.033361 -0.018505 -0.032185 0.057065 -0.035295 
+-0.030726 0.012611 -0.044637 -0.004772 0.008590 -0.016471 
+-0.007362 0.002041 -0.022528 0.008882 0.027196 -0.026510 
+-0.018088 -0.014219 0.048671 0.048889 -0.040205 -0.005026 
+0.041154 -0.012962 -0.038615 -0.029000 0.087000 -0.180000 
+-0.030308 0.206000 -0.151538 -0.025556 -0.006667 -0.026667 
+0.035184 -0.024054 -0.086880 -0.032480 -0.042276 -0.064187 
+-0.001220 -0.009721 -0.023136 -0.003908 -0.015281 0.006745 
+-0.029483 -0.021500 0.011793 0.005460 -0.006641 0.019187 
+0.000511 -0.015788 0.004174 0.025346 -0.062115 0.034538 
+-0.003002 -0.000710 -0.007882 0.001851 0.005957 -0.001124 
+0.003401 -0.007444 -0.000217 0.004131 0.006598 -0.024565 
+0.004136 0.000313 -0.011984 -0.006044 -0.005835 0.002646 
+0.010178 -0.003271 -0.004435 0.013874 -0.005304 -0.002333 
+0.006992 -0.008357 -0.007401 -0.000890 0.000751 0.000453 
+0.011447 0.014083 0.038460 -0.006745 0.010348 0.014893 
+0.002925 0.007153 0.004424 0.011920 0.014194 -0.000553 
+0.006288 0.005635 -0.002654 0.001444 0.022556 -0.004222 
+0.002594 0.027640 0.007774 0.009606 0.011736 0.004331 
+0.000814 -0.016944 0.002205 -0.000379 -0.015004 0.021394 
+-0.000089 0.004840 -0.001081 0.007711 0.006052 -0.009846 
+-0.002157 -0.003902 0.003687 0.000753 -0.000604 0.002829 
+0.004418 0.006299 0.000657 0.005869 0.009187 -0.001381 
+-0.000698 0.007295 -0.003486 -0.004372 0.005696 -0.003530 
+-0.002647 -0.000518 0.000344 -0.004637 -0.011075 0.006791 
+-0.007006 -0.013075 0.007529 -0.001970 0.000480 -0.000162 
+0.001262 0.003399 -0.007358 0.004282 0.001487 -0.006974 
+0.001316 -0.000856 -0.003813 -0.010210 -0.011750 0.000779 
+-0.014080 -0.003343 0.007392 -0.001662 -0.005668 0.006165 
+0.014241 -0.016863 0.010207 -0.008119 -0.018314 -0.006616 
+0.002497 -0.008548 0.000337 -0.010975 -0.001860 -0.011152 
+-0.000848 0.008208 -0.006718 0.005265 -0.009538 0.015515 
+0.025802 0.015481 0.013636 0.037399 0.025580 -0.031471 
+-0.022202 -0.007380 0.015517 0.001219 -0.049614 0.042346 
+0.005714 -0.043361 0.010840 0.024715 -0.008618 0.021463 
+0.015786 -0.010143 0.027071 -0.024444 0.006838 0.011966 
+-0.006863 -0.009520 -0.011480 -0.008760 -0.021488 -0.010083 
+0.054327 -0.031667 0.010865 0.029811 0.011818 -0.037689 
+-0.058081 0.009192 0.022424 -0.054474 -0.050789 0.008684 
+-0.030121 -0.026012 0.031479 -0.005575 -0.015146 0.003973 
+0.002582 -0.004203 -0.017444 0.013887 -0.013449 -0.010133 
+0.012960 0.055657 0.017960 -0.003516 0.026703 0.010659 
+-0.011436 -0.022556 -0.005086 -0.011868 -0.005086 -0.013333 
+-0.044055 0.052195 0.010854 -0.006000 0.052000 0.001000 
+0.030148 0.036650 -0.042562 0.014906 0.006274 0.008892 
+0.005369 -0.016501 0.012178 -0.028025 -0.020211 -0.019565 
+-0.025714 -0.004029 -0.028200 -0.020791 -0.023977 0.005366 
+-0.030662 -0.059656 0.037853 -0.062927 -0.072218 0.010981 
+-0.008565 0.019931 -0.025419 0.010413 0.003962 -0.001271 
+0.009076 -0.005749 -0.000577 0.029811 -0.009263 -0.029411 
+-0.008056 -0.013947 0.000602 -0.006343 -0.006138 -0.001806 
+-0.005794 -0.005497 -0.004808 -0.021942 -0.009831 -0.016182 
+-0.017082 -0.017745 -0.046420 -0.006615 0.007629 -0.001676 
+-0.006670 0.002880 0.028452 -0.016964 -0.009643 0.017821 
+-0.011756 -0.006916 0.015443 -0.005827 -0.004197 0.009631 
+0.002598 -0.005450 0.004526 0.002183 0.005144 0.001056 
+0.000169 0.038647 -0.013900 0.015900 0.051765 -0.025115 
+0.001704 0.016326 -0.008207 -0.007127 -0.000465 0.006210 
+-0.000967 0.002386 -0.000043 0.006037 0.006098 -0.001463 
+0.000732 -0.000215 0.000942 -0.000398 0.000356 0.000235 
+0.000106 0.004366 -0.002319 -0.000458 0.001646 -0.003058 
+-0.004105 -0.000400 -0.000424 -0.003654 -0.000831 0.000501 
+0.002897 0.000023 0.000128 0.009687 0.000701 -0.000256 
+0.009967 0.001342 -0.003392 0.002296 0.002898 -0.005377 
+-0.003253 0.003666 -0.004565 -0.001533 0.000771 -0.006192 
+0.001479 0.002667 -0.008720 0.000583 -0.002291 -0.010040 
+0.011862 -0.006354 -0.010425 -0.000479 0.004387 -0.019160 
+-0.017448 -0.076567 0.014570 -0.004091 -0.016091 -0.002182 
+0.000611 -0.003529 -0.000407 0.001111 0.000185 -0.005000 
+-0.003943 -0.012323 0.007392 -0.033986 -0.044829 0.031797 
+-0.004939 0.003122 0.001959 -0.012359 0.010634 -0.003232 
+-0.033765 0.000787 0.002825 -0.025881 -0.007096 0.001252 
+-0.005066 -0.002012 0.000687 0.007567 0.003907 -0.006842 
+-0.006415 0.022950 -0.077116 -0.013125 0.044250 -0.088500 
+0.005317 0.068651 -0.042063 0.005069 -0.004518 0.008154 
+-0.024339 0.010582 -0.043386 -0.002857 0.017714 0.035429 
+0.062370 0.012593 -0.000296 -0.068036 0.075357 -0.015179 
+0.003233 -0.039586 0.058985 0.013402 -0.020672 0.022284 
+0.009148 0.013409 -0.008897 0.029530 0.012785 -0.052970 
+-0.032217 -0.014163 0.034299 -0.058920 -0.054086 0.081935 
+0.003333 0.000000 -0.095833 -0.092121 -0.088788 -0.003333 
+0.009259 -0.000370 0.018148 -0.044444 0.011111 0.053333 
+0.005119 0.158095 0.068810 0.020667 0.054667 0.006667 
+0.013452 0.003810 0.032738 -0.000799 -0.008779 0.047078 
+0.000131 -0.001182 0.024615 0.025606 -0.006401 0.010588 
+0.001037 0.045185 0.017037 -0.043505 0.003854 0.008187 
+-0.019947 0.038091 -0.009334 0.011865 0.042067 -0.002078 
+-0.009072 0.030064 -0.017120 -0.003455 0.034554 -0.024000 
+0.074324 0.033899 -0.019716 0.005095 0.018739 0.007043 
+-0.005941 -0.013941 -0.006219 -0.041861 -0.060170 -0.024046 
+-0.016793 -0.009192 0.034933 -0.001000 0.010674 0.005714 
+-0.005292 -0.008395 0.004440 -0.008946 -0.012665 -0.006049 
+0.000341 -0.012194 -0.003154 -0.001016 -0.010845 0.005419 
+0.006623 -0.011948 0.004026 0.003636 -0.009358 -0.005615 
+-0.005909 -0.004510 0.003007 -0.003724 0.010614 -0.009753 
+0.020540 0.027587 -0.002698 0.020746 0.031526 -0.025323 
+-0.005939 0.009502 -0.018214 0.010937 -0.001018 -0.009158 
+0.001004 0.000624 -0.004759 0.002310 0.000876 -0.000199 
+0.001169 -0.000454 -0.000585 0.001420 -0.000844 0.005129 
+-0.003160 0.000649 0.007115 -0.006103 -0.001872 0.005441 
+-0.003007 -0.000646 -0.000900 0.003004 -0.000306 -0.003761 
+0.005902 -0.006905 -0.001240 -0.000231 -0.004518 0.000534 
+0.000341 0.000868 -0.004236 -0.002347 -0.000494 -0.006342 
+-0.000579 0.002842 -0.008679 0.000436 0.001729 -0.009005 
+-0.003353 -0.008671 0.003793 0.014627 -0.002100 0.045965 
+-0.004442 0.068121 -0.052819 -0.001445 0.008578 -0.002098 
+0.003917 -0.003013 -0.010948 0.013186 -0.003242 -0.013780 
+-0.017757 -0.023920 0.000679 -0.035785 -0.025327 -0.011920 
+0.004530 -0.003183 -0.001025 0.011789 -0.009331 -0.016371 
+0.001429 0.005714 -0.001905 -0.009584 -0.002593 0.006161 
+-0.001464 0.001291 -0.001709 0.007103 0.006089 -0.006422 
+0.032817 -0.013096 -0.037183 0.014301 0.047378 -0.092517 
+-0.093802 0.096157 0.021116 -0.047778 0.016858 0.006743 
+-0.041993 0.102937 -0.123252 0.069674 0.098279 -0.101953 
+0.031250 0.150000 -0.031250 -0.010273 -0.035738 0.068197 
+0.110091 -0.051909 0.087273 0.001364 -0.028295 0.029205 
+0.007424 -0.004892 0.031710 0.033333 -0.020606 0.046061 
+0.053459 -0.085535 0.058805 -0.013286 0.042143 0.056571 
+-0.006807 -0.081891 -0.090966 -0.017778 -0.026889 -0.080667 
+0.016143 0.048429 0.058571 -0.021333 -0.010667 0.121667 
+0.031346 0.028750 0.047019 -0.022716 0.016420 0.059383 
+-0.005897 -0.126752 0.093590 -0.001750 0.052500 0.003500 
+0.016188 0.029184 -0.021980 -0.038770 -0.031230 0.005027 
+0.002538 -0.070000 0.013537 0.138115 0.036995 -0.110164 
+-0.006449 0.006887 -0.024333 0.001238 -0.010738 -0.004048 
+-0.001726 0.002981 0.020625 -0.018793 -0.002222 -0.001342 
+0.033228 0.012862 -0.009992 0.031727 0.018066 0.004427 
+-0.009411 0.020674 0.002211 -0.037052 0.051312 0.000094 
+-0.011959 0.019230 -0.031395 -0.007654 0.009376 -0.014723 
+0.000708 -0.003499 -0.005308 -0.006483 -0.003568 -0.004769 
+0.000872 -0.001904 -0.002678 -0.000147 -0.002859 -0.003212 
+-0.001708 0.009599 -0.005336 0.009772 0.016339 -0.000730 
+-0.004500 0.002332 -0.000424 0.010018 -0.013423 0.009337 
+0.010000 -0.014143 0.018857 0.001257 0.003070 0.000336 
+0.000863 0.004099 -0.004667 -0.006882 0.005155 0.000979 
+0.003568 0.004509 -0.003273 -0.001783 -0.000388 0.001774 
+-0.002169 0.000839 0.004268 -0.000482 0.004110 0.002155 
+-0.000952 0.001590 -0.001527 -0.002464 0.002534 0.003094 
+0.000336 0.001392 0.001074 0.000452 -0.002263 0.004066 
+0.000186 -0.004150 0.003369 0.000198 -0.002813 0.003743 
+-0.001737 -0.000824 0.000663 -0.001877 -0.000480 -0.003288 
+-0.001983 0.000104 -0.003144 0.001193 0.003930 -0.002376 
+0.003170 0.007987 0.002419 -0.000896 -0.007546 0.013736 
+0.004671 -0.009477 -0.007988 -0.001880 -0.006068 0.002479 
+0.005606 -0.002302 0.000632 0.006218 -0.000561 -0.009740 
+0.012146 0.009404 -0.015974 0.014565 0.011532 -0.014786 
+-0.084136 -0.036028 -0.018086 -0.019998 -0.008657 -0.005259 
+-0.006250 -0.026250 -0.015000 -0.033721 -0.011068 0.017605 
+-0.008176 -0.002702 -0.002009 -0.000154 -0.002593 0.000120 
+-0.001608 -0.017632 -0.003801 0.011315 -0.134187 0.002941 
+-0.023333 0.077778 -0.023333 -0.147453 0.079133 0.088103 
+0.005262 -0.026154 -0.007015 -0.033787 -0.001746 -0.044467 
+0.029637 0.012904 -0.012266 0.082157 -0.026667 -0.020539 
+0.000000 -0.041000 0.139000 -0.056667 0.061667 -0.013333 
+0.016252 0.068154 -0.014796 0.094551 0.096667 -0.018910 
+-0.091131 -0.042560 0.109405 -0.087691 -0.006829 0.082840 
+-0.044667 -0.004721 0.013219 0.009983 0.013901 -0.032701 
+-0.104276 -0.063216 0.080493 -0.054311 0.015088 0.107118 
+0.078418 -0.085663 0.139362 0.004302 -0.156792 0.103811 
+-0.005556 -0.014444 -0.005556 0.010000 0.086959 0.014493 
+-0.023333 0.069778 -0.036222 -0.060582 0.030645 -0.044189 
+-0.046000 0.005303 -0.001446 0.026232 -0.015149 -0.012810 
+-0.004008 0.000972 -0.031336 0.001387 0.000756 0.009327 
+0.026035 -0.035390 0.033184 0.067279 0.010731 -0.034259 
+0.062495 0.016806 -0.011554 0.073757 0.016377 0.022477 
+0.006250 0.009821 -0.001133 -0.005559 0.010324 -0.023750 
+-0.001712 -0.008099 -0.010725 0.015339 0.000000 -0.003409 
+-0.003454 0.002621 -0.023098 -0.012342 0.006251 -0.007998 
+-0.023209 -0.009781 -0.004884 -0.000478 -0.014565 0.009043 
+0.035217 0.000000 0.004783 0.011146 -0.000593 0.003518 
+-0.016184 -0.005110 0.009539 -0.017580 -0.022381 0.020510 
+-0.019906 -0.012282 0.002118 0.001481 -0.037037 0.047407 
+-0.023727 -0.009949 0.019595 -0.012826 -0.006119 -0.010574 
+-0.000043 -0.000610 -0.004036 -0.005281 -0.000311 0.001083 
+-0.005753 0.001395 0.003427 -0.002117 0.003652 0.002690 
+-0.000192 -0.000278 -0.000419 0.002969 -0.003032 -0.003168 
+0.001522 -0.002147 -0.002746 0.002624 -0.001879 0.000440 
+0.000859 -0.001443 0.000089 0.003072 0.000118 -0.000954 
+-0.000176 -0.003044 0.000671 -0.000545 -0.003762 0.001192 
+-0.001009 -0.000954 -0.000783 -0.001390 0.002690 -0.003763 
+-0.000785 0.008820 -0.010896 0.002975 0.011670 -0.020132 
+-0.015154 -0.004902 0.007437 -0.007135 -0.002556 0.003954 
+0.011120 -0.003854 0.006441 0.025634 -0.010666 0.006189 
+0.021743 0.002241 -0.005940 0.034056 0.048266 -0.002589 
+-0.032595 -0.040612 -0.018650 0.004856 0.005897 0.000338 
+-0.013428 -0.000250 -0.008119 0.000473 0.007743 -0.012573 
+-0.008383 0.006357 -0.010539 -0.003332 0.013945 -0.009523 
+0.018776 -0.014532 -0.034145 -0.009721 -0.047854 -0.045984 
+-0.008182 0.001033 0.005680 -0.006667 0.000417 -0.002083 
+-0.000165 -0.009256 -0.003140 -0.012154 0.014743 0.033538 
+0.060139 -0.002361 0.028889 0.101063 -0.079614 -0.088792 
+-0.004462 0.060000 -0.022308 -0.024810 0.018981 -0.008819 
+0.038222 0.057111 -0.018889 0.081292 0.131340 -0.125072 
+-0.038056 0.018889 -0.028611 -0.000271 -0.002357 -0.007155 
+0.001286 -0.009000 0.003333 0.001071 -0.006851 -0.003052 
+-0.013932 -0.036557 0.010455 0.067347 0.020267 -0.004364 
+0.083571 -0.012857 0.051429 0.029973 -0.046923 0.074934 
+0.004074 0.068148 -0.038148 -0.010454 0.048738 0.001158 
+0.003660 -0.001267 0.000905 0.013297 0.012670 0.009773 
+0.003125 0.046380 0.012649 -0.010581 0.019406 0.006737 
+0.004583 0.005750 0.001917 -0.011107 0.009347 -0.003589 
+-0.001791 -0.022156 0.002130 0.031770 -0.003151 -0.000744 
+0.022857 0.031482 0.006807 0.051266 0.068686 0.004287 
+0.047354 0.032806 -0.023742 0.003687 -0.009259 -0.023765 
+-0.006972 0.000734 -0.002769 -0.012435 0.004539 -0.004920 
+-0.016639 -0.004079 0.006523 -0.003100 0.004020 0.010559 
+-0.007324 -0.003089 0.006106 0.008700 0.007361 -0.001816 
+0.021560 0.025809 0.002083 0.005227 0.025856 -0.000424 
+-0.002745 0.003137 -0.001961 -0.002091 -0.032061 0.008554 
+0.000160 -0.042938 -0.005387 -0.015423 -0.026112 0.000789 
+-0.015625 0.007875 0.010500 -0.018313 -0.023347 -0.004717 
+-0.004661 0.000437 0.002234 -0.002422 0.003906 -0.000469 
+0.000760 -0.001032 0.001864 -0.000044 0.001721 0.000699 
+0.001199 0.003514 -0.007996 -0.001110 0.002573 -0.009632 
+-0.002600 -0.001400 -0.000700 -0.005547 -0.000183 -0.001664 
+0.001041 -0.003673 0.003122 0.001420 -0.002661 -0.000890 
+0.002358 0.000813 -0.006271 0.004321 0.002015 -0.004303 
+-0.001826 0.000684 -0.001581 -0.000742 -0.000225 -0.003127 
+-0.001023 -0.005655 -0.004294 -0.001312 -0.013122 -0.020011 
+-0.012106 0.017482 -0.048847 -0.048200 -0.079754 0.097394 
+-0.040237 -0.092665 0.050904 -0.034836 -0.066445 0.038491 
+0.001841 -0.015730 0.005406 -0.001435 0.020000 -0.000478 
+0.030373 0.008850 -0.006063 0.004287 0.045874 -0.045447 
+-0.022135 0.011981 -0.026606 -0.071657 0.003081 0.014212 
+-0.006114 -0.013310 -0.013381 -0.006753 0.011062 -0.001994 
+0.024057 0.015443 -0.001013 0.038889 0.004462 0.003470 
+0.041743 -0.010286 -0.003229 0.007307 0.029226 -0.002105 
+-0.015833 0.063333 0.049167 -0.048776 0.029306 0.155959 
+0.034926 -0.044039 0.015567 -0.021105 -0.061263 0.011842 
+0.004321 0.022832 0.011007 0.016571 0.011524 0.010952 
+0.008989 -0.003228 -0.003302 0.015455 0.025455 -0.012727 
+0.016169 0.077922 -0.046169 0.023065 0.049839 -0.025383 
+0.014597 -0.009873 0.008252 0.069469 -0.030793 0.007605 
+0.049259 -0.013981 -0.008519 0.008462 0.000000 -0.008462 
+-0.019363 0.018333 -0.011618 -0.007967 0.006639 -0.019000 
+-0.030508 -0.081525 0.039298 -0.047079 0.023033 -0.058679 
+-0.015112 0.005416 -0.022555 -0.004814 -0.018786 0.000998 
+0.006667 -0.010588 -0.002353 0.000541 -0.008323 -0.007105 
+0.004096 0.006469 -0.007589 0.001154 -0.016077 -0.010615 
+-0.047143 -0.066458 0.024922 -0.020021 -0.038981 0.008109 
+-0.008347 0.003533 -0.000457 0.027479 0.021947 -0.004161 
+0.056212 0.004442 -0.008393 0.027532 -0.010017 -0.006078 
+-0.004110 0.003446 -0.005538 -0.039252 -0.000012 0.009073 
+-0.011069 -0.017256 0.002736 0.001745 -0.008168 0.008912 
+0.004132 -0.004576 0.010345 0.006781 -0.000723 0.005465 
+0.003542 0.015492 -0.001327 0.001311 0.023097 -0.007882 
+-0.001636 0.010045 -0.003775 -0.002687 -0.013288 -0.002074 
+-0.001884 -0.017126 -0.004949 0.003699 -0.021602 -0.005157 
+-0.002620 -0.028500 0.000349 -0.026864 -0.036701 0.011687 
+-0.004300 -0.001302 0.003169 -0.000330 0.002205 0.004906 
+0.002226 0.002674 0.002526 0.001100 -0.001095 -0.000013 
+0.000311 0.000118 -0.000323 -0.001967 -0.000685 0.000761 
+-0.004381 -0.000818 -0.000022 -0.002603 -0.001573 -0.000623 
+-0.000347 -0.002587 0.000048 -0.000034 -0.000609 -0.001156 
+-0.000677 0.000079 -0.002480 -0.000002 0.000928 -0.001795 
+-0.000559 -0.000276 0.000488 0.000346 -0.002235 0.000905 
+-0.001491 -0.003540 -0.001624 -0.010502 -0.005549 -0.013309 
+-0.039421 -0.001718 -0.032473 0.014518 0.048394 0.011667 
+0.050036 0.026831 -0.041333 0.023261 -0.006910 -0.020045 
+-0.080000 0.012857 0.072143 -0.008226 -0.016869 0.013593 
+-0.018102 0.000706 -0.004429 -0.012347 0.014226 -0.019593 
+0.013801 -0.013847 0.007866 -0.019746 0.018063 0.021014 
+-0.001517 0.001787 -0.013248 0.001717 -0.002626 -0.004579 
+0.004841 0.010079 0.000099 0.022105 0.018421 -0.022105 
+0.034643 0.025339 -0.034321 0.028920 0.015000 -0.023136 
+0.036762 0.045823 0.000854 0.021301 0.039104 0.042146 
+0.036159 0.018697 0.004829 -0.030857 0.083571 0.039571 
+0.000909 0.025455 0.020000 -0.030233 0.005291 0.001702 
+-0.034000 0.034000 -0.021000 -0.032063 0.035238 -0.041587 
+0.050227 0.085341 -0.041591 0.004427 0.051000 0.001362 
+-0.039501 0.020328 0.004181 -0.012727 -0.000979 -0.001469 
+-0.024539 0.013609 -0.012376 -0.011255 0.005392 0.004451 
+0.000542 -0.079286 0.001355 -0.006667 -0.004762 0.043810 
+-0.170000 -0.006667 0.033333 0.020055 -0.069266 -0.145358 
+0.000000 0.034667 -0.042000 -0.025936 -0.004727 -0.014524 
+-0.011056 -0.013441 -0.021678 0.018904 -0.008259 -0.012536 
+0.012249 0.012736 -0.035051 0.001333 -0.009000 -0.004167 
+-0.011666 -0.017633 0.008778 -0.021214 -0.017701 0.005085 
+-0.040289 -0.048886 0.012401 -0.010983 -0.032906 0.002019 
+0.040424 0.008502 -0.006123 0.003813 -0.011187 0.000922 
+-0.008328 -0.019740 0.017870 0.009233 -0.013400 0.002911 
+0.000158 0.020718 -0.012415 -0.046641 -0.009103 -0.000564 
+-0.004010 -0.006436 0.020839 0.009415 0.003630 0.003045 
+-0.000157 -0.007433 0.016627 -0.000217 0.006927 0.022438 
+0.004275 0.010875 0.019037 0.006575 0.005895 0.011699 
+0.021819 -0.028282 0.005311 0.000748 -0.024553 -0.012323 
+0.009219 -0.002169 -0.004432 0.011057 -0.030071 -0.018532 
+-0.000499 -0.000199 0.004132 0.002878 0.000405 0.001887 
+0.005431 0.005416 0.000012 0.003621 0.002241 0.000000 
+-0.002440 -0.000654 0.002397 -0.006726 0.000009 0.002506 
+-0.003541 -0.000026 -0.001878 -0.001201 0.001053 -0.001445 
+-0.001138 -0.006164 -0.000657 -0.002984 -0.012951 -0.000619 
+-0.005018 -0.009461 0.006910 -0.001582 -0.005808 0.000200 
+-0.003139 -0.005106 0.000759 -0.001537 -0.005520 -0.000143 
+-0.005108 -0.003053 -0.003704 -0.010833 0.006258 -0.012747 
+-0.014762 0.024048 -0.025476 -0.019193 0.075000 -0.021326 
+-0.091486 0.057146 -0.023066 0.137706 0.119502 -0.035087 
+-0.009981 0.017056 0.035603 -0.009412 0.000000 0.001176 
+-0.009739 0.001711 0.015473 -0.009605 0.005565 -0.004830 
+0.000703 -0.006512 0.009000 -0.013079 0.003407 0.009548 
+-0.006743 0.010471 0.002213 -0.000976 0.000274 -0.006588 
+0.014586 -0.020566 -0.012982 -0.035380 -0.011705 0.026513 
+-0.008792 0.002898 -0.006393 0.005951 0.002097 0.008302 
+0.005924 0.009884 0.013595 0.000389 0.024914 0.015280 
+-0.000629 0.048182 0.000420 0.051000 0.053000 0.001000 
+0.008148 0.010741 0.014815 -0.024940 -0.032798 -0.034762 
+0.002000 0.024069 -0.060172 0.070000 0.054000 -0.108000 
+0.002077 -0.005692 -0.008769 -0.008723 0.007587 -0.002707 
+-0.020799 0.007402 -0.004282 -0.021274 0.004093 0.003822 
+-0.002033 -0.005861 0.017344 0.010213 -0.044767 0.002384 
+0.000000 -0.054167 0.026667 0.024651 -0.027490 0.044525 
+0.009242 0.008106 0.048965 0.017745 -0.001275 0.002275 
+0.032078 0.009950 -0.004845 -0.015077 0.016941 -0.032829 
+-0.010422 0.011577 -0.026028 -0.001876 0.004995 -0.001524 
+0.004506 0.018874 -0.028355 0.000525 -0.030197 -0.013541 
+-0.000847 0.001504 0.001236 -0.013091 -0.000009 0.003492 
+-0.025659 -0.016252 -0.000427 -0.023490 0.006816 -0.007810 
+0.002829 0.019300 -0.000922 0.002803 -0.003152 -0.011197 
+-0.002963 -0.009259 0.002593 0.021821 0.012773 0.001064 
+-0.026667 -0.049726 -0.022603 -0.149833 -0.056333 -0.052500 
+0.022236 -0.010342 0.041025 -0.010082 0.009645 -0.011544 
+-0.028994 -0.013695 0.006967 -0.016000 -0.014064 0.019473 
+0.005489 -0.006778 0.019689 0.005196 0.010686 0.002745 
+0.005465 -0.016499 0.009858 0.000990 -0.009901 -0.019091 
+-0.010000 0.000000 -0.021429 0.026342 0.047708 0.054731 
+0.005303 0.000833 -0.001515 0.002295 0.000035 0.001228 
+-0.002459 -0.003243 0.003219 -0.004456 -0.002922 0.003807 
+-0.002099 -0.000569 0.001285 0.000000 0.002189 -0.000313 
+-0.000783 0.001243 -0.000893 -0.001304 -0.002478 -0.001630 
+-0.002613 -0.006970 -0.002072 -0.002682 -0.008889 -0.001073 
+-0.002816 -0.006966 0.003285 0.000186 -0.002843 -0.000320 
+-0.003200 0.001721 -0.001938 -0.004005 -0.001893 -0.002032 
+-0.002513 0.000033 -0.003209 -0.003325 -0.000717 -0.003919 
+-0.010166 -0.007625 -0.010801 -0.039477 -0.079702 0.023626 
+-0.138182 0.017389 0.098536 -0.004604 -0.000783 0.006707 
+-0.005228 -0.003325 0.065096 -0.019772 0.020575 -0.014154 
+-0.004444 -0.004444 -0.016667 0.098123 -0.022400 -0.038615 
+-0.009571 -0.013738 0.037250 -0.021771 -0.018262 0.015513 
+0.002939 -0.009642 -0.002823 0.001492 0.007764 -0.014034 
+0.038501 0.055681 -0.038316 -0.033834 0.019059 -0.014600 
+0.001958 -0.032526 0.027030 0.007929 0.001269 0.024739 
+-0.007766 0.008945 0.027527 -0.011972 0.011423 0.025225 
+0.005132 -0.002751 0.006772 0.007778 -0.004444 0.002222 
+0.085132 0.122275 0.041481 0.009293 -0.031630 -0.052989 
+0.006138 -0.021484 -0.025333 0.007657 0.002747 -0.014323 
+0.006032 -0.007540 -0.003016 -0.004226 -0.022891 -0.011976 
+0.005909 -0.011524 -0.020168 0.009161 -0.013730 -0.019213 
+0.021086 -0.016349 -0.013191 0.012549 0.008000 0.003137 
+0.064837 0.037732 -0.033860 0.030762 -0.002619 -0.002524 
+0.036222 0.027556 -0.018889 -0.013342 -0.057924 -0.000202 
+-0.001172 0.003593 -0.000070 -0.010635 0.014028 -0.002058 
+-0.007453 0.010888 0.010492 -0.027983 0.034711 0.011378 
+0.011091 -0.002909 -0.016273 -0.014118 0.003922 0.017255 
+-0.024053 0.010559 0.018085 0.001057 0.013064 -0.002187 
+0.009766 0.026291 -0.001991 0.013649 0.022189 -0.002543 
+-0.014799 0.005523 -0.008277 -0.024768 -0.006693 0.001206 
+-0.007901 0.030764 -0.015202 0.000617 0.004674 -0.014552 
+0.006086 0.008510 0.000055 -0.034247 0.002099 0.023753 
+-0.018842 0.021399 0.018527 -0.050197 -0.006303 0.007316 
+-0.033932 -0.018381 0.031105 0.011648 -0.002747 -0.002527 
+0.019077 -0.000308 0.007692 -0.007575 0.023253 -0.000059 
+-0.013522 0.035596 -0.007873 -0.000028 -0.036565 0.025303 
+-0.006727 -0.005909 0.016091 -0.043333 0.072444 0.036222 
+-0.001270 0.000285 0.000140 -0.001563 -0.002799 0.002305 
+-0.003582 -0.003667 0.002950 -0.001885 -0.005366 -0.001942 
+-0.000239 -0.001652 -0.002561 0.001500 -0.001416 -0.001187 
+0.000369 -0.000524 0.000071 -0.000911 -0.000922 -0.000245 
+0.000073 0.001426 -0.001633 0.001941 0.005334 -0.002637 
+0.000348 0.005067 -0.001943 -0.000944 0.001174 -0.001513 
+-0.002598 0.000442 -0.003011 -0.002543 -0.002509 -0.002717 
+-0.001866 -0.001804 -0.003064 -0.000182 -0.001686 -0.000162 
+0.002010 -0.002816 0.008129 -0.032583 0.000944 0.014292 
+-0.002292 -0.005275 -0.008152 0.011743 -0.002516 -0.015832 
+-0.027531 -0.010859 0.028025 -0.021758 0.014075 0.010244 
+-0.013524 -0.017214 0.009223 0.013512 0.002886 0.003876 
+0.002085 -0.001066 -0.000829 0.007641 -0.005343 -0.008021 
+-0.000119 -0.010896 0.000944 -0.010360 -0.042200 0.015480 
+0.006084 0.097972 -0.079720 0.008958 0.029792 -0.047708 
+0.001186 0.003149 -0.016278 0.028341 -0.003296 -0.007906 
+0.021344 0.014040 -0.048206 0.015143 0.013257 -0.042914 
+0.014286 -0.012857 -0.026429 0.055455 0.066705 -0.048864 
+0.115594 0.045248 -0.041064 0.047371 0.003143 -0.068400 
+-0.002741 -0.035251 0.010582 -0.032589 0.007054 0.044018 
+-0.036619 -0.010952 -0.004619 -0.005628 -0.027511 -0.028918 
+0.009862 0.001578 -0.055227 0.019220 -0.000341 -0.036390 
+0.044135 0.033284 -0.057302 0.051409 0.040181 -0.042480 
+0.025015 0.042015 0.008379 0.011765 0.009412 0.036471 
+-0.005689 0.002858 0.011441 -0.022290 0.020482 0.054817 
+-0.001949 -0.027020 0.020242 -0.018018 0.001093 0.006368 
+-0.033494 0.012059 0.008368 -0.032841 0.025922 0.025592 
+0.005030 0.020242 0.006061 0.003699 -0.018084 0.033709 
+-0.020325 -0.017600 0.017886 -0.006762 0.003097 0.001778 
+-0.003390 0.008061 -0.001726 0.001103 0.000498 0.000372 
+-0.010252 -0.028357 -0.003858 -0.050712 -0.020143 0.004927 
+-0.009335 0.050131 -0.012470 0.006533 0.028278 -0.005295 
+0.006856 -0.013069 0.002762 -0.018957 0.006373 0.000208 
+-0.039245 -0.033511 0.003255 -0.030057 -0.019943 -0.000632 
+-0.068828 0.037482 -0.013325 -0.010213 0.050005 -0.026777 
+0.099564 0.013002 -0.059855 0.037949 0.010427 -0.018291 
+0.005340 0.005217 -0.004094 0.002483 -0.011851 0.016609 
+0.014401 -0.003893 0.012415 0.007555 -0.017318 0.031675 
+-0.005224 -0.006046 0.000504 -0.005075 -0.007090 -0.001269 
+0.001486 -0.002325 0.003238 0.000837 -0.001912 -0.000968 
+-0.000639 -0.000214 -0.003407 -0.001349 0.003887 -0.000792 
+-0.001845 0.006233 -0.002394 -0.003603 0.003537 -0.004316 
+0.001701 0.003696 -0.001670 0.002413 0.002185 0.001526 
+0.000637 -0.000720 0.001716 -0.000124 0.003272 -0.000006 
+-0.000523 0.003230 -0.002023 -0.001883 0.001574 -0.001085 
+-0.002540 0.000086 -0.003067 -0.004825 -0.000317 -0.006014 
+-0.006991 0.006937 -0.011533 -0.006100 0.012551 0.006298 
+-0.003574 0.009560 0.004553 0.002622 -0.003677 -0.008176 
+-0.001693 0.009175 -0.009195 0.003980 0.014082 -0.001531 
+0.000291 0.015529 -0.008201 -0.014571 -0.023143 0.033714 
+-0.009789 -0.011366 0.012539 -0.001379 0.001345 -0.000448 
+0.009456 -0.000583 -0.004157 -0.032143 0.012429 0.086571 
+0.059729 0.017729 -0.016598 0.044166 0.046422 -0.000940 
+0.032207 0.080517 -0.095000 0.075683 -0.194192 -0.073140 
+-0.117926 -0.084926 -0.030185 0.011022 -0.113333 -0.008267 
+0.038095 0.140119 -0.021310 -0.006253 0.024809 0.067766 
+0.040879 -0.006289 0.070667 0.019210 0.000382 -0.012329 
+-0.022083 0.003441 -0.021893 0.006795 -0.002265 -0.009060 
+0.008806 0.011383 -0.017753 0.035556 -0.002222 -0.037778 
+0.036711 -0.021034 -0.015455 0.015137 -0.003794 -0.000847 
+0.027857 -0.002967 -0.004451 0.039467 0.008103 0.011426 
+-0.011186 0.008980 0.015321 -0.016001 0.012553 0.040578 
+-0.025444 0.017315 0.032518 0.000836 -0.008271 0.006023 
+0.028846 -0.018910 0.043297 0.018019 -0.007692 0.034827 
+0.029744 0.037949 -0.097436 0.011859 0.060833 0.002372 
+-0.007005 0.032995 0.017326 0.010681 -0.010971 0.032449 
+-0.011587 -0.024791 0.017291 -0.015131 -0.005706 0.008457 
+-0.018559 -0.004668 0.001481 -0.009772 0.008394 -0.004487 
+0.008497 -0.000111 0.002089 0.018786 -0.027256 0.008994 
+0.013053 -0.003541 0.000885 0.019022 -0.008883 0.007045 
+0.008421 -0.031548 0.018059 -0.008236 -0.024455 0.010060 
+-0.016931 -0.019397 0.008461 -0.005874 0.013913 -0.007222 
+-0.022072 0.037152 -0.022462 -0.003521 0.023235 -0.014925 
+0.040500 0.013494 -0.009343 0.014998 -0.001370 0.000258 
+-0.000120 -0.013869 0.006950 0.000578 -0.008949 0.006535 
+0.001660 -0.007509 0.006090 0.000733 -0.018015 0.013083 
+-0.000960 -0.002025 -0.000799 -0.001448 0.000429 -0.000043 
+0.001281 0.000867 0.002951 0.002333 -0.002033 0.002408 
+-0.000569 -0.000603 0.001569 -0.004107 0.000418 0.000055 
+-0.004648 0.001316 -0.001296 -0.001926 0.003829 -0.000195 
+-0.000065 0.004162 0.000303 0.001798 0.003036 0.000664 
+0.001399 -0.002569 0.002521 0.002652 -0.001237 0.004244 
+-0.000327 -0.002867 0.000829 -0.001346 0.001667 -0.001539 
+-0.002740 0.002037 -0.006399 -0.005497 0.002739 -0.010446 
+-0.011093 0.008162 -0.011995 0.019091 0.011195 -0.010396 
+-0.001863 0.017519 -0.007175 -0.001478 0.009084 -0.002742 
+-0.005479 -0.001229 -0.007917 -0.005736 0.026477 -0.017897 
+0.002406 -0.006127 -0.021662 -0.003750 0.003750 0.022500 
+-0.007989 -0.015217 0.008940 0.009068 0.004114 -0.006378 
+0.025889 0.003849 -0.038453 0.071864 -0.001045 0.030650 
+0.008521 0.008289 -0.005261 0.021181 0.011029 -0.006779 
+0.022973 0.009203 0.001124 0.019574 0.006450 -0.017132 
+-0.046683 -0.030713 -0.044842 -0.065161 -0.052359 -0.083382 
+0.000682 -0.012416 -0.033121 -0.016465 0.026344 -0.023077 
+-0.001227 0.001210 0.000250 0.008022 -0.002702 -0.001655 
+0.005255 -0.014275 -0.015325 0.022557 -0.017104 -0.007783 
+0.019074 -0.003228 -0.006164 0.020035 -0.021940 0.008395 
+0.012948 -0.014601 -0.010386 0.023207 -0.011035 -0.009798 
+0.026484 0.017236 -0.025118 -0.015838 0.038851 -0.034963 
+-0.070258 -0.021274 0.041067 -0.005750 -0.004192 0.015508 
+-0.004920 0.004955 0.005426 0.000973 0.005843 0.008470 
+-0.030326 -0.041777 0.044872 0.000130 -0.001694 -0.018635 
+0.059817 0.035705 -0.046992 0.003206 0.100289 -0.042588 
+-0.016934 0.040329 -0.033066 0.023322 -0.032006 0.046890 
+-0.010426 -0.011863 0.038971 -0.019268 -0.005582 0.015358 
+-0.014247 -0.003231 0.000274 -0.002363 0.001530 -0.001203 
+0.010334 0.015910 -0.006636 0.011011 0.009770 -0.009645 
+0.008730 0.001932 -0.003865 0.003259 0.002613 -0.001452 
+-0.001700 0.001488 -0.001266 -0.002308 -0.002784 0.001704 
+-0.000874 -0.001574 0.001308 -0.002956 0.001008 -0.000352 
+-0.003054 0.003003 -0.002029 -0.003153 0.003851 -0.002859 
+-0.002056 0.001709 -0.001293 0.003094 0.003658 -0.002308 
+-0.002511 0.003903 -0.002568 -0.006532 -0.000630 0.001203 
+-0.004361 -0.005589 0.001626 -0.004639 -0.009699 0.001379 
+0.000965 -0.000546 -0.000202 0.002145 0.000163 0.001585 
+0.003577 0.001655 0.002035 0.001012 0.000812 -0.000428 
+0.001594 -0.000642 -0.002094 0.003340 -0.000006 -0.002208 
+0.003499 0.002570 -0.001209 0.000720 0.002776 0.000158 
+0.000010 0.003158 0.001424 0.000122 0.005379 0.001255 
+0.000220 0.003939 -0.000077 -0.002300 0.002322 -0.001636 
+-0.004249 -0.002553 -0.002026 -0.000336 -0.002003 0.001054 
+0.000490 -0.004886 -0.004328 -0.001638 -0.001491 -0.003354 
+-0.000247 0.011661 -0.002036 0.046887 0.011056 -0.030621 
+0.011962 0.020373 -0.006571 0.001110 0.000606 -0.001224 
+0.010729 -0.006452 0.006705 0.001765 0.006183 -0.001685 
+0.008158 0.008158 -0.020526 0.006996 0.015584 -0.004961 
+0.007331 -0.000745 -0.004110 0.032638 0.011759 -0.012782 
+0.003099 0.019094 -0.011747 -0.007521 0.000940 -0.013162 
+0.030733 0.037970 -0.030019 -0.003195 0.009764 0.019972 
+-0.000426 0.008252 -0.007582 0.007811 -0.003565 -0.009760 
+0.018043 0.006807 0.001217 0.014577 0.008738 0.009431 
+0.021200 0.002906 -0.015156 0.019769 0.000015 -0.027224 
+0.013277 -0.005977 -0.021559 0.022575 0.004040 -0.022020 
+0.005732 -0.019804 -0.026054 0.009384 -0.008663 0.000714 
+0.029927 -0.004807 -0.023490 -0.058929 -0.032857 0.040357 
+-0.002948 0.002515 0.022067 0.043245 0.012237 -0.011405 
+0.011434 -0.016573 -0.031993 0.018195 -0.022506 0.042773 
+-0.054712 0.036541 0.061034 -0.013300 0.036902 0.003653 
+0.006533 0.010333 0.002733 0.020454 0.001400 -0.015632 
+0.016259 0.007557 -0.033637 -0.007457 0.007037 -0.009452 
+0.000784 0.013746 0.010863 0.003501 -0.008437 0.005491 
+-0.026923 -0.034244 0.015805 0.016584 -0.019900 0.024876 
+0.002696 -0.007304 0.014902 -0.002215 0.003765 0.001107 
+-0.004389 -0.000214 0.000932 -0.005562 -0.007651 0.003468 
+0.000527 -0.007384 0.005198 0.004145 -0.003122 0.000491 
+0.001891 0.002821 -0.001493 -0.000703 0.006461 -0.002039 
+-0.000515 0.005799 -0.002788 0.003221 0.004647 -0.003145 
+0.005544 0.003808 -0.002791 0.002247 0.002662 -0.001377 
+-0.003793 0.002218 -0.000860 -0.007777 0.001403 -0.000735 
+-0.006122 0.001632 -0.000928 -0.000864 0.003847 -0.002718 
+0.003461 0.007587 -0.005480 0.004540 0.011072 -0.004286 
+0.001371 0.009151 -0.002095 -0.001193 0.006761 -0.004519 
+0.002555 -0.001574 0.000389 0.000822 -0.005396 0.002520 
+0.001420 -0.000720 0.001410 -0.000833 0.000933 0.001470 
+-0.000556 -0.000920 0.000882 0.000642 -0.002725 0.000584 
+0.000012 0.000201 0.000453 -0.001320 0.000242 0.002926 
+-0.001920 0.000591 0.005695 0.000018 -0.000343 0.003645 
+-0.005987 -0.003864 -0.002541 -0.006007 0.001573 -0.003575 
+-0.001516 0.002661 -0.001745 0.006355 -0.003412 -0.006482 
+0.001308 -0.003780 0.001163 0.001671 0.001087 0.001222 
+-0.001835 0.002364 -0.002026 0.002055 -0.012001 -0.004165 
+0.009942 0.014234 -0.014431 0.006795 0.011220 -0.004377 
+0.006964 0.005022 0.001138 0.007179 0.001786 0.002393 
+-0.001706 0.001746 -0.001891 0.005525 0.011265 0.002227 
+0.002052 0.008586 0.006359 0.002731 0.008874 0.001024 
+-0.003544 0.013889 0.011517 -0.037571 0.083886 -0.034657 
+0.059861 0.018056 -0.068889 0.015270 0.058582 0.006017 
+0.005462 0.016266 0.013296 0.005907 0.010298 -0.000679 
+0.009022 0.007488 -0.006159 0.016726 0.002262 -0.012202 
+0.026638 -0.007537 -0.017857 0.022170 -0.012933 -0.014571 
+0.010278 -0.003472 -0.017083 0.002338 -0.002085 0.004572 
+0.007520 0.003395 0.016892 -0.028333 -0.012778 -0.048889 
+0.129714 -0.041429 -0.154857 -0.008361 0.016587 0.026870 
+0.010111 0.030778 0.020444 0.018935 -0.011876 0.010920 
+0.029658 -0.020233 -0.053976 0.003926 -0.005970 0.081052 
+0.005109 0.008777 0.027401 -0.013239 0.010411 0.003484 
+0.003600 -0.002520 -0.004052 -0.001029 0.000232 -0.012162 
+-0.011820 -0.007795 -0.004768 0.001427 -0.002963 0.022827 
+0.006959 0.018519 0.017182 0.001943 0.027373 0.019698 
+-0.029414 -0.016187 0.015746 -0.000931 -0.005957 0.008537 
+0.004740 0.006878 -0.013157 0.001306 0.005493 -0.001625 
+-0.009323 0.000696 0.003040 -0.011368 -0.002738 0.003659 
+-0.005798 -0.005490 0.004006 0.000754 -0.004011 0.001437 
+0.002504 0.001760 -0.000613 0.001503 0.005706 -0.000988 
+0.002221 0.005916 -0.001681 0.003915 0.006222 -0.001803 
+0.002494 0.006586 -0.000924 -0.000432 0.004460 -0.000857 
+-0.001561 0.001257 -0.000314 -0.000682 0.000518 -0.000008 
+0.003548 0.003957 -0.001850 0.005539 0.007765 -0.000696 
+0.000721 0.006640 0.000691 -0.002713 0.005396 -0.001203 
+0.002802 0.009637 -0.002232 0.004668 0.004296 -0.007135 
+0.001393 -0.007180 0.003590 -0.000790 -0.000011 -0.001563 
+0.002288 0.002932 -0.004104 -0.001555 0.002951 -0.000095 
+-0.003892 -0.001159 0.005093 -0.005535 -0.003867 0.004832 
+-0.000862 -0.004025 0.003452 -0.001708 -0.001201 0.003026 
+-0.001771 -0.000696 0.002396 -0.002425 0.001684 0.001594 
+-0.004206 0.002991 0.000000 -0.001575 0.003923 -0.003933 
+0.002220 -0.001499 -0.005105 0.003364 -0.003130 -0.007487 
+-0.004724 -0.004992 -0.006867 -0.007047 0.004073 -0.006717 
+-0.003469 0.004492 -0.004593 -0.002713 -0.023667 0.001903 
+-0.019545 -0.026455 -0.004364 -0.009138 -0.016161 0.002992 
+-0.001713 0.007439 0.000103 0.010782 -0.002239 -0.010420 
+-0.017612 -0.004890 -0.008428 -0.015452 0.011795 -0.008923 
+-0.007513 0.010547 0.001102 -0.004231 -0.000962 0.008654 
+0.000760 -0.005878 0.013598 0.018368 -0.006785 0.003118 
+0.041541 -0.042397 0.009328 0.041218 0.051262 -0.014699 
+0.034631 0.024332 -0.021221 0.009725 0.008206 0.035547 
+0.001710 0.013067 0.009933 0.005910 -0.003990 -0.002525 
+0.017356 0.015712 0.003250 0.022447 0.020965 -0.041571 
+0.029866 0.000412 -0.038414 0.006649 -0.002414 0.003664 
+0.008416 0.022327 0.045429 -0.024161 0.015577 -0.057219 
+-0.009717 -0.002312 -0.026524 0.010724 -0.003866 -0.010066 
+-0.006663 -0.006710 0.006193 -0.008462 0.001599 -0.012737 
+0.192315 0.189011 -0.150217 -0.005941 0.005281 -0.048571 
+0.000462 -0.004385 0.009346 0.002722 -0.004152 0.000347 
+0.001533 -0.002840 0.000683 -0.010228 -0.003565 0.010817 
+-0.010737 0.001196 0.022063 0.006466 0.004060 0.013655 
+0.001946 -0.008301 0.003882 0.026523 0.040502 0.006452 
+-0.009823 -0.007355 0.044702 -0.009084 -0.015102 0.011785 
+0.001272 -0.005697 -0.002553 0.001210 -0.000374 -0.000701 
+0.000964 0.002483 -0.000966 0.000916 0.004678 -0.001831 
+-0.001011 0.003260 -0.000989 -0.002404 0.002090 -0.000380 
+-0.000401 0.003876 -0.000290 0.003447 0.005512 0.000020 
+0.003514 0.003967 0.001504 -0.001331 0.003898 0.003278 
+-0.005045 0.004645 0.002474 -0.005122 0.002402 0.000698 
+-0.001604 0.000259 0.000837 0.002620 0.000930 -0.001758 
+0.003629 -0.000650 0.000783 -0.000199 -0.001324 -0.001822 
+-0.002729 -0.000031 -0.002996 -0.000498 0.005025 0.001317 
+0.000601 0.000219 -0.001184 0.001471 -0.002209 0.002072 
+0.004220 0.003019 -0.000221 0.003789 0.004430 -0.001822 
+0.003204 0.003557 -0.002525 0.002596 0.002570 -0.001362 
+0.001130 0.003539 -0.000141 0.002519 0.002824 0.000305 
+0.002629 0.001275 -0.005617 0.004154 0.005100 -0.006468 
+0.004648 0.004375 -0.005806 0.001574 0.006072 -0.004305 
+-0.001437 0.000514 -0.003096 0.000929 -0.000304 -0.000338 
+-0.001576 -0.000944 -0.002749 -0.002490 -0.005708 -0.010433 
+-0.001272 -0.007068 -0.011548 -0.002445 -0.006345 0.000553 
+0.002000 -0.004238 0.007886 -0.014420 -0.003413 -0.002261 
+-0.051643 0.018133 -0.043446 -0.036008 0.029774 -0.009944 
+-0.002753 0.010820 -0.015899 -0.002551 0.006967 -0.001668 
+0.004601 0.008091 -0.005355 -0.006398 0.012120 -0.006023 
+-0.027579 0.005119 0.008095 0.001063 -0.032791 0.031019 
+0.023527 0.003915 0.025845 0.009291 -0.014047 0.038270 
+0.004541 -0.030846 0.005229 0.018421 0.005794 -0.001696 
+0.032034 0.014670 -0.008356 -0.016084 -0.013138 0.016968 
+-0.007050 -0.008855 0.006881 0.000604 -0.000226 -0.004756 
+0.002063 0.015134 -0.020880 0.004667 0.027529 -0.032471 
+-0.010815 0.033852 -0.018848 0.059208 -0.023377 0.043958 
+-0.013014 0.012998 -0.020826 -0.004242 -0.005800 -0.021602 
+0.002477 -0.004364 -0.003574 -0.010183 -0.006311 -0.002231 
+-0.017506 -0.027458 0.019090 0.031835 0.091794 -0.037144 
+0.064649 0.035614 -0.135877 0.012115 0.009496 -0.026384 
+-0.010076 -0.004752 0.012375 -0.011741 -0.009258 0.017562 
+-0.004724 -0.012891 0.020384 0.004511 0.000342 0.007282 
+-0.057716 0.047867 -0.196104 0.052303 -0.005604 -0.111610 
+0.034103 0.011966 -0.027322 0.020324 0.006482 0.008781 
+-0.016859 0.001090 0.003397 -0.022056 -0.010425 0.011293 
+-0.003792 -0.014195 -0.003520 0.005786 -0.004942 -0.005180 
+0.002758 -0.002140 -0.002255 0.002044 0.000849 -0.001404 
+0.001930 0.003226 0.001489 0.000272 0.003089 0.002140 
+-0.001404 0.000180 -0.000203 -0.003350 -0.002319 -0.001065 
+-0.005417 -0.000450 -0.001053 -0.005724 0.000253 0.000375 
+-0.004016 -0.000804 0.000622 -0.002023 -0.002220 0.000142 
+-0.001106 -0.001702 -0.000396 -0.001559 -0.000683 -0.000975 
+-0.003620 -0.001137 -0.003426 -0.005681 0.000732 -0.003529 
+0.002565 0.007010 -0.004598 0.003604 0.000565 -0.007838 
+0.001249 -0.000620 -0.006902 0.006208 0.003746 -0.008883 
+-0.000316 0.000392 0.000061 -0.001813 -0.001707 0.000027 
+-0.001251 -0.000268 -0.002949 -0.000023 0.002138 -0.003210 
+0.001450 0.005225 -0.002255 0.002158 0.001339 0.001503 
+0.003243 0.000408 -0.005632 -0.001355 -0.000256 -0.008491 
+-0.002695 0.003346 -0.008549 -0.001275 0.002996 -0.002708 
+-0.000563 -0.001198 0.003944 0.005185 -0.001164 0.002790 
+0.000560 -0.001208 -0.002450 -0.001656 -0.005585 -0.005546 
+0.010521 -0.004755 -0.004773 0.011323 -0.006798 0.002982 
+0.006726 -0.001750 0.012769 -0.003268 -0.000591 0.014332 
+-0.006289 -0.003239 0.010091 0.002648 0.001855 -0.000689 
+0.004878 0.017036 -0.008129 0.010773 -0.002504 -0.012758 
+0.011311 -0.012450 -0.009943 0.009125 -0.011765 -0.022160 
+-0.012777 0.037204 -0.026306 -0.001161 -0.008429 0.012261 
+0.001071 0.000537 0.006255 -0.015851 -0.011905 0.007375 
+-0.056326 -0.043425 0.064200 -0.008859 -0.045329 0.033812 
+0.002688 -0.021911 0.004390 -0.009349 0.026012 0.000663 
+-0.027224 -0.001079 0.004441 -0.024695 0.000869 0.013400 
+-0.017348 -0.005390 0.024712 -0.039375 -0.036250 -0.004375 
+-0.044813 -0.033722 0.044749 0.085319 -0.096312 0.051064 
+-0.001757 0.008441 0.001301 -0.000225 0.000675 0.005250 
+-0.001154 -0.006398 0.007233 -0.008335 -0.010027 0.010647 
+-0.006181 0.004342 0.006702 0.041044 0.026062 -0.018456 
+0.002554 0.024083 -0.064330 0.000651 0.005061 -0.004426 
+-0.010093 -0.010083 0.017498 -0.013545 -0.019438 0.031725 
+-0.020200 -0.026914 0.042888 -0.021601 -0.023265 0.043317 
+-0.029147 -0.017677 0.037792 -0.008295 -0.004547 0.018762 
+-0.001664 0.003406 0.031669 0.016189 -0.015441 0.012578 
+0.018747 -0.003983 0.025541 0.050785 0.057327 -0.028533 
+0.017299 0.011695 -0.020573 0.003436 -0.004114 -0.003895 
+-0.002673 -0.003783 0.001805 -0.004200 0.000502 0.000690 
+0.000264 0.000088 0.001145 0.005243 -0.000899 -0.002223 
+0.003807 -0.001231 -0.004431 -0.002539 -0.003577 -0.000294 
+-0.006514 -0.001202 -0.001887 -0.005802 -0.001042 -0.002651 
+-0.003136 -0.005337 -0.004368 0.002690 -0.006015 -0.004967 
+0.005405 -0.003319 -0.002113 0.004160 0.000919 0.000034 
+-0.000561 -0.000267 0.000207 -0.002951 -0.002164 0.002821 
+-0.001604 -0.000426 0.001118 0.005505 0.003028 -0.004128 
+0.008535 0.004371 -0.015092 0.018209 0.007462 -0.007539 
+-0.003127 -0.001112 0.001123 -0.000109 -0.000651 0.000798 
+0.000646 -0.001243 0.000302 0.001946 -0.001010 0.000231 
+0.001837 0.001416 0.001651 0.000887 0.002503 0.000223 
+-0.001414 0.002831 -0.000283 -0.004762 -0.000105 -0.002443 
+-0.004513 0.002134 -0.007349 -0.001263 0.004132 -0.003892 
+0.003585 0.004423 0.003423 0.005116 -0.001546 -0.000258 
+0.004706 -0.002339 -0.003069 -0.005603 -0.008964 -0.013745 
+0.000580 -0.000935 -0.001302 0.011102 -0.003835 0.029442 
+1.461224 -0.559184 4.306122 1.550820 -0.642623 4.531147 
+1.565892 -0.635659 4.193799 0.010282 -0.003912 0.033935 
+0.003121 -0.008641 0.014542 -0.013004 -0.020408 -0.001458 
+-0.012500 -0.007364 0.006382 -0.022088 -0.011876 0.006948 
+-0.009788 -0.000119 -0.004602 -0.001459 0.008623 -0.011098 
+-0.003562 -0.004076 0.006581 -0.016541 0.004637 0.008824 
+-0.022058 -0.002393 0.006919 -0.025274 -0.011280 0.013485 
+-0.010842 -0.018660 0.030640 0.033695 0.040026 -0.022481 
+0.004498 0.011004 -0.005388 -0.056865 -0.018890 0.018977 
+-0.011856 -0.030611 0.052024 -0.004671 -0.003628 0.023855 
+-0.003232 -0.015514 0.007757 -0.016033 0.015384 -0.084288 
+-0.017459 -0.005678 0.044216 -0.010157 0.008135 0.046165 
+0.000997 0.002038 0.021773 -0.006868 0.001347 0.005387 
+-0.012597 0.005496 0.006420 -0.006273 -0.002107 0.011436 
+0.000806 0.002947 -0.005173 -0.006116 -0.003628 0.007389 
+-0.017622 -0.006368 0.017666 -0.021043 -0.023996 0.032986 
+-2.233831 -2.447761 4.124378 -2.443396 -2.462264 4.128931 
+-2.389881 -2.553571 4.276786 -2.519048 -2.942857 4.561905 
+-0.025819 -0.041750 0.055874 -0.010716 -0.044065 0.162812 
+-0.033960 -0.025916 0.015387 0.020640 0.010628 -0.007779 
+0.011847 0.014324 -0.010817 0.012277 0.015457 -0.011427 
+0.009167 0.008428 -0.005931 0.001409 -0.001932 -0.002750 
+0.000045 -0.003738 -0.004788 0.010393 -0.003676 -0.003388 
+0.008495 -0.001710 -0.005778 0.001799 -0.002144 -0.001120 
+-0.000342 0.000849 0.000262 -0.001400 0.003777 0.000620 
+-0.000453 0.003353 0.000367 0.002382 0.000899 -0.001072 
+0.005500 0.001218 -0.002464 0.005567 0.001025 -0.003832 
+0.002043 -0.000261 -0.001979 0.001147 -0.000214 -0.000398 
+0.000962 0.006339 -0.003654 0.000006 0.007586 -0.007610 
+0.006721 0.005158 0.001344 0.003243 -0.002138 -0.004009 
+0.001595 0.004629 -0.002971 0.001143 0.002340 -0.002114 
+0.000150 -0.001240 -0.000577 0.003714 -0.000397 0.002602 
+0.001945 0.000535 0.002198 -0.000065 0.004876 -0.000302 
+-0.000896 0.005326 -0.000943 -0.001831 0.000765 -0.002765 
+-0.000449 0.002602 -0.004626 0.002023 0.001753 0.001295 
+0.000967 0.001785 0.003133 -0.000628 -0.001134 0.001904 
+-0.002309 -0.005227 -0.014011 0.000489 0.005398 -0.030633 
+0.001082 0.000960 0.006303 1.691630 -0.427313 4.030837 
+2.359195 -0.841954 5.597701 2.699482 -0.937824 6.215026 
+2.821656 -0.767516 6.082803 2.424084 -0.361257 5.052356 
+0.012272 -0.001456 0.026194 -0.009106 -0.000108 -0.008860 
+-0.008721 -0.004942 0.003488 -0.006798 -0.011023 0.018770 
+-0.011756 -0.006810 0.019055 0.013036 -0.002093 0.005792 
+-0.004189 0.006281 -0.003496 0.017374 -0.002646 0.002877 
+0.037559 0.014502 -0.009824 0.006426 0.006265 0.005313 
+-0.002177 0.001840 0.002663 -0.001039 0.000180 0.002080 
+0.002943 0.000685 0.008278 0.016564 0.008552 -0.002145 
+0.013704 0.002593 -0.024815 0.005988 -0.002342 0.006073 
+-0.003182 -0.012453 0.009353 -0.007460 -0.008413 0.012381 
+-0.021857 -0.008571 0.011714 -0.012828 -0.016263 0.027828 
+-0.007670 -0.008349 0.049414 0.002234 0.016577 0.033378 
+-0.016651 -0.024183 0.001586 -0.005793 -0.015103 0.004841 
+-0.007945 -0.003014 0.007112 -0.005529 0.007345 0.023234 
+-0.025114 -0.004839 0.028880 -2.561905 -1.809524 4.761905 
+-2.757202 -2.185185 4.588477 -2.669492 -2.593220 4.567797 
+-2.623881 -3.029851 4.650746 -2.454545 -3.263158 4.511962 
+-0.005099 -0.002748 0.012087 0.048963 0.082602 -0.059381 
+-0.107064 -0.047628 0.076859 -0.007493 -0.018072 0.004822 
+0.012872 0.013363 -0.010590 0.003431 0.011707 -0.006106 
+0.000945 0.007914 -0.002735 -0.003906 -0.000085 -0.004946 
+-0.001627 -0.001525 -0.006712 0.005229 0.006135 -0.005498 
+0.007760 0.006107 -0.003843 0.004454 0.003985 0.001019 
+-0.000472 0.004773 -0.000045 -0.002805 0.006078 -0.002790 
+-0.002826 0.002557 -0.000500 -0.004551 -0.005794 0.004664 
+-0.007434 -0.011411 0.008503 -0.008823 -0.010046 0.007153 
+-0.005318 -0.003047 0.003106 -0.001020 0.003946 -0.003706 
+0.003818 0.006136 -0.004591 0.000099 -0.002357 -0.008907 
+-0.000579 0.002098 -0.002841 0.003966 0.000471 -0.005533 
+0.003397 0.005359 -0.004935 0.002958 0.003415 -0.008705 
+0.001486 -0.001858 -0.004062 0.001254 -0.000731 -0.000325 
+-0.001645 -0.000143 -0.000503 0.000000 0.004194 -0.000242 
+-0.000092 0.002609 0.001294 0.001214 -0.000514 0.001197 
+0.002321 0.000041 -0.001263 -0.001780 0.005151 -0.000161 
+0.002175 0.002105 0.002897 0.000233 0.001976 -0.001625 
+0.000594 0.002907 -0.028814 -0.013816 0.007783 -0.025430 
+0.004601 0.002067 0.011090 1.720000 -0.527273 3.505455 
+2.388889 -0.955556 5.080555 2.851240 -1.016529 6.118457 
+2.969594 -0.692568 6.385135 2.398058 -0.121359 5.553398 
+0.014513 0.001631 0.033958 -0.001833 -0.000395 -0.003008 
+-0.008615 -0.001783 -0.005060 -0.009941 0.002910 0.006325 
+-0.007152 -0.006059 0.007941 -0.005102 -0.000759 0.002207 
+0.005107 0.009933 -0.027387 0.003227 0.021880 -0.001743 
+0.006190 0.009467 -0.023086 0.015637 0.014659 -0.005277 
+0.001366 0.009999 -0.000692 0.002080 -0.002855 -0.001558 
+0.000227 -0.000261 -0.006236 0.001539 0.005929 -0.013341 
+-0.001934 0.008776 -0.033776 0.043750 -0.013750 -0.007500 
+-0.003702 -0.001793 -0.009661 -0.020344 0.003190 0.026085 
+0.002521 0.006857 0.009513 0.000199 0.002605 0.001704 
+0.005704 -0.011365 -0.006193 0.003875 -0.015183 -0.008615 
+-0.029088 -0.035798 -0.001117 -0.006890 -0.015690 -0.007435 
+-0.004498 -0.000453 0.015836 -0.014307 -0.010136 0.034541 
+-0.019429 -0.002856 0.033464 -2.226667 -1.280000 4.366667 
+-2.639216 -2.152941 4.807843 -2.850993 -2.774834 4.900662 
+-2.931408 -3.176895 4.660650 -2.565421 -2.658879 3.696262 
+-0.008982 -0.014080 0.022800 0.013458 0.032475 -0.017655 
+-0.037135 -0.087251 -0.006588 -0.000971 -0.025120 0.005853 
+0.021419 0.009687 -0.018799 0.004799 0.000611 -0.001593 
+-0.001308 0.001434 -0.000235 -0.002892 0.003479 -0.003215 
+-0.006297 0.002390 -0.001924 0.002358 0.007225 -0.002394 
+0.007873 0.010633 0.000368 0.006383 0.003999 0.000846 
+0.002230 0.001082 -0.003559 0.000326 -0.001490 0.000809 
+0.000376 -0.004857 0.005329 0.000245 -0.008682 0.005846 
+-0.001913 -0.010722 0.003574 0.000054 -0.007232 0.000107 
+-0.001303 0.002435 -0.003394 -0.000260 0.004264 -0.007883 
+-0.000998 -0.001165 -0.006126 -0.004513 -0.006814 0.000000 
+-0.004510 -0.004996 -0.000254 0.001329 0.002958 -0.000624 
+-0.002446 0.002764 0.001101 0.001219 0.004489 -0.001956 
+-0.001372 0.001705 -0.007545 -0.000511 0.000109 -0.004489 
+0.000130 0.000250 -0.000173 0.001600 0.001618 0.000360 
+0.002133 0.001705 0.003488 -0.000706 0.002727 -0.000213 
+0.005924 0.003641 -0.009348 -0.000882 0.003738 -0.006838 
+0.002007 0.001713 -0.001099 0.000868 0.003413 -0.001685 
+0.001377 0.005067 -0.019882 -0.014089 0.002554 -0.013970 
+0.001799 0.001771 0.001545 1.181818 -0.574163 2.842105 
+1.954545 -0.842657 4.723776 2.332278 -0.651899 5.832278 
+2.252560 -0.119454 5.897611 1.711712 0.459459 5.009009 
+0.011290 0.007589 0.028204 -0.000586 0.000705 -0.001234 
+0.001301 -0.017564 -0.001005 -0.017704 -0.010388 0.017960 
+-0.010649 0.000703 0.023569 -0.007822 0.001505 0.014563 
+-0.009626 0.007780 -0.001322 -0.008735 0.013208 -0.018906 
+-0.001818 0.006061 -0.023636 0.011093 0.007189 -0.026155 
+0.009636 0.006359 -0.018266 -0.000390 0.001363 -0.005839 
+-0.006194 0.002217 0.004244 -0.000480 0.000302 0.007616 
+-0.008383 -0.012698 0.000987 0.037047 0.019421 -0.015313 
+0.043680 0.022503 -0.022636 -0.021600 -0.028800 0.062222 
+0.062392 0.028966 0.017840 0.057239 -0.003517 -0.007568 
+0.010397 -0.027302 -0.019762 -0.032745 0.006816 0.014285 
+-0.035992 0.005099 0.040218 -0.013770 -0.014601 0.016873 
+-0.005875 -0.006322 0.006862 0.001566 0.008466 0.000074 
+-0.011287 0.000130 0.022791 -1.583333 -1.125000 4.701389 
+-2.238532 -1.995413 5.146789 -2.725564 -2.774436 4.838346 
+-2.982014 -3.104316 4.183453 -2.767635 -2.639004 3.298755 
+-0.011389 -0.013812 0.024175 -0.001792 0.002901 0.007526 
+0.036641 0.060563 -0.024711 0.022486 0.011428 -0.020523 
+0.004488 -0.000526 -0.002330 0.004443 0.001090 -0.000366 
+0.001842 0.000326 0.000505 -0.001574 -0.002082 -0.000588 
+0.000061 0.001524 -0.000122 0.000783 0.007011 -0.001608 
+-0.000128 0.010045 -0.001575 0.000759 0.009060 0.002416 
+0.003506 0.006996 0.001374 0.001822 0.004369 0.002199 
+0.000511 0.000515 0.001527 -0.002112 -0.003048 0.000641 
+-0.004823 -0.001106 0.004071 -0.001862 -0.002384 0.003520 
+-0.001157 -0.001157 -0.002963 0.000916 0.004694 -0.005839 
+-0.000197 0.004615 -0.000085 0.003184 -0.002305 -0.003403 
+0.001343 -0.001823 -0.003895 0.001692 -0.000308 -0.001519 
+0.003857 0.004094 -0.002121 0.003887 -0.000785 -0.000913 
+-0.002667 0.000305 -0.005542 0.000241 0.001687 -0.004836 
+0.002314 -0.001281 -0.001281 0.003707 -0.001768 -0.000445 
+0.000487 -0.000397 0.000170 -0.002410 0.001292 -0.002429 
+-0.004485 0.002242 -0.001010 -0.000462 -0.001455 -0.002374 
+0.000489 -0.000820 -0.000807 -0.001784 -0.000248 -0.001429 
+-0.004349 -0.002091 -0.002555 0.000069 -0.000972 -0.006449 
+0.001824 0.007225 -0.017278 0.006981 0.003470 -0.004622 
+0.009845 0.005243 0.021949 1.450495 0.138614 3.752475 
+1.301802 0.454955 4.117117 0.959064 0.754386 3.760234 
+0.002143 0.008855 0.017354 -0.014696 -0.005429 -0.040556 
+-0.019575 -0.014857 -0.022372 -0.000839 0.002546 0.001491 
+0.000526 0.011283 0.003235 -0.000381 0.000741 0.002514 
+0.005136 -0.001513 -0.018080 0.009313 0.003022 -0.037760 
+-0.006288 0.001306 -0.036302 -0.009421 -0.004190 -0.008378 
+-0.005007 0.007527 0.014046 -0.010762 0.001351 0.011934 
+-0.014943 -0.008686 0.006072 -0.004943 0.001605 0.008474 
+-0.009282 -0.003524 0.008595 0.004383 0.001529 -0.000972 
+0.012164 0.010519 0.004686 0.011714 0.007543 -0.024256 
+0.015556 -0.042222 -0.012222 0.061000 -0.030500 0.082500 
+-0.054838 -0.002787 0.092757 -0.017224 0.009850 0.015565 
+-0.007427 0.001499 -0.000103 0.002895 0.002895 -0.010526 
+0.003900 0.012146 -0.019689 0.007490 0.023237 -0.020552 
+0.001729 0.017173 0.012279 -0.016205 0.005653 0.037904 
+-1.533742 -1.650307 5.331288 -2.193237 -2.661836 5.004831 
+-2.407080 -2.862832 3.969027 -2.112745 -2.245098 2.617647 
+-0.007745 -0.007832 0.016867 -0.001868 0.000593 0.003741 
+0.000591 0.000734 -0.000637 0.002886 -0.001588 -0.001983 
+0.003555 0.003860 -0.002392 0.001482 0.005918 -0.001071 
+0.000312 0.001221 -0.000255 0.000667 -0.006328 0.002700 
+-0.004542 -0.005901 0.004500 -0.006682 -0.002667 0.003259 
+-0.006765 -0.000975 -0.001532 -0.002046 0.001186 -0.003645 
+0.001061 -0.000827 -0.001450 0.000077 0.002119 0.000645 
+-0.001369 -0.001895 -0.000785 -0.003650 -0.003455 -0.001490 
+-0.002318 -0.001598 -0.002138 0.000390 0.003490 -0.003783 
+-0.001926 0.005481 -0.002163 -0.004602 0.003717 -0.003805 
+-0.001868 0.000210 -0.004787 0.001166 0.000185 -0.005014 
+0.001244 0.000798 -0.005012 0.001448 0.001073 -0.001743 
+0.005964 0.004344 0.001187 0.003597 -0.001389 -0.000578 
+-0.000120 -0.001945 -0.000988 -0.001511 -0.000808 -0.001065 
+-0.000421 0.000366 -0.000533 -0.000091 -0.000541 -0.000702 
+-0.000484 -0.001182 -0.001528 -0.001197 0.000779 -0.001439 
+-0.002873 0.001436 0.000455 -0.002277 0.002556 -0.000730 
+-0.000858 -0.001654 -0.003145 -0.004845 -0.004581 -0.002620 
+-0.002271 -0.003306 -0.000651 0.001036 0.006971 -0.003125 
+-0.000873 0.020352 -0.016404 -0.000354 0.019438 -0.022577 
+0.002549 0.002118 -0.014322 0.000463 -0.000085 -0.000885 
+0.000292 0.000720 0.003660 -0.004786 0.002457 -0.002546 
+-0.018589 0.006072 -0.031558 0.004869 -0.010933 -0.037269 
+-0.000561 -0.007568 0.002807 -0.005396 -0.014557 0.013180 
+0.000257 0.000704 0.001298 0.001174 -0.003027 -0.000584 
+0.002370 0.013655 0.003543 0.003479 0.024068 0.001614 
+0.003270 0.008910 0.000240 0.004444 -0.017778 0.012222 
+0.011538 0.007588 0.000584 0.013563 -0.000242 -0.017729 
+0.017456 0.005710 -0.025178 0.008741 0.001718 -0.008143 
+-0.004039 -0.008942 0.002115 0.002649 -0.019115 -0.000428 
+0.006630 -0.015185 -0.005772 -0.002616 -0.005870 -0.017207 
+-0.131106 -0.013986 -0.054770 -0.015675 -0.002474 0.064072 
+0.000797 0.009008 0.036483 0.001680 0.010107 0.016627 
+0.000371 0.004436 0.006016 0.023749 0.001362 -0.011742 
+-0.004605 0.002683 -0.001729 0.011875 0.012643 -0.011999 
+0.011892 0.018038 0.001261 -0.003080 0.008838 0.020994 
+-0.009510 -0.002284 0.033089 -0.011961 -0.009441 0.036861 
+-0.010941 -0.010913 0.031328 -0.005642 -0.007960 0.017050 
+0.000518 -0.001950 0.001159 0.006073 0.005028 -0.006247 
+0.002653 0.006315 -0.008319 0.003253 0.005210 -0.001319 
+0.007915 0.004570 -0.003116 0.010046 0.004373 -0.000509 
+0.006091 0.006935 0.001761 0.004303 0.004919 -0.000264 
+0.001622 0.000145 -0.000442 -0.000804 -0.000628 0.000594 
+-0.000961 0.000597 0.000094 0.000971 0.001080 -0.001224 
+0.001993 0.001568 -0.002545 -0.000346 0.001007 -0.002548 
+-0.001353 0.005984 0.002211 0.000612 0.002744 0.003360 
+-0.000525 0.001755 0.002869 0.001279 0.001107 -0.000893 
+0.003097 0.004588 0.000353 0.001136 0.003778 0.001097 
+-0.002521 0.002067 0.003513 -0.005087 -0.001908 0.002667 
+-0.000605 -0.000773 0.000820 0.004102 -0.000077 0.001506 
+-0.000686 0.005968 -0.000250 -0.001463 0.004072 -0.003054 
+0.000000 0.002419 -0.001855 -0.001347 -0.000180 -0.002216 
+-0.002010 0.001216 -0.001799 -0.002742 0.004685 -0.002285 
+-0.004733 0.004429 -0.001781 -0.002313 0.004350 -0.006276 
+0.002198 0.005228 -0.005525 0.000807 0.005111 -0.002388 
+-0.001936 0.001913 -0.000952 -0.004270 -0.001751 0.002680 
+-0.001173 -0.002544 0.001994 0.003038 0.005352 -0.002866 
+0.011637 0.011921 -0.012520 0.009071 0.002429 -0.012853 
+0.006721 0.006079 -0.000247 -0.001842 0.000687 -0.000385 
+-0.002486 0.001798 -0.004346 -0.000493 0.005172 -0.012710 
+0.002883 0.000100 -0.006217 -0.001579 0.004241 0.030366 
+-0.013351 -0.011117 0.027688 -0.014550 0.002838 -0.001719 
+-0.012118 0.003699 -0.004757 -0.006517 -0.001206 -0.002074 
+-0.004972 -0.007484 -0.000647 -0.002885 -0.008652 0.002508 
+-0.000398 0.004602 -0.005985 -0.001199 -0.000568 -0.007368 
+-0.006683 0.003416 0.005484 0.005204 0.010377 0.008395 
+0.002298 0.010428 -0.015471 0.011437 -0.003496 -0.013273 
+-0.000588 -0.008000 -0.017471 0.002113 -0.017986 -0.019029 
+-0.052580 -0.040629 -0.026293 -0.045487 0.003148 -0.000618 
+-0.020727 0.004770 -0.008531 -0.021193 -0.003599 -0.032992 
+-0.025284 0.000645 -0.033717 -0.008492 0.008451 -0.017084 
+-0.002851 0.003357 -0.004507 0.024082 0.008785 -0.009115 
+0.045667 0.011597 -0.031998 0.043810 0.046361 -0.031873 
+0.019962 0.024568 -0.041481 0.012322 0.013381 -0.010348 
+0.007355 0.006389 -0.001618 0.001069 0.000730 -0.000783 
+-0.002589 -0.001548 0.001625 -0.001170 -0.002902 0.001260 
+0.002330 0.000921 -0.001714 0.005957 0.003674 -0.005786 
+0.002803 0.004483 -0.005612 0.002533 -0.000428 -0.000790 
+0.002202 0.001399 -0.000709 0.005616 0.004298 -0.000695 
+0.003881 0.004749 0.000637 -0.001921 0.000005 -0.000641 
+-0.006569 -0.004293 0.000631 0.000206 -0.001607 -0.001430 
+0.002301 0.004184 -0.004141 0.005033 0.005829 -0.002616 
+0.003079 0.003842 -0.000297 -0.000610 0.001422 -0.000279 
+-0.004302 0.000733 0.001476 -0.001031 0.000018 0.004129 
+-0.000325 -0.001605 0.000573 0.002433 -0.001864 -0.002354 
+0.001039 -0.002897 -0.001995 -0.000082 -0.000021 -0.000021 
+-0.002891 -0.001467 0.004251 -0.002329 -0.001150 0.002357 
+0.000614 -0.000088 0.000526 0.003430 -0.001934 0.000690 
+0.002507 0.004495 0.001825 -0.002624 0.001867 0.001160 
+-0.001909 0.000198 -0.001417 -0.000159 -0.001412 -0.001992 
+0.000250 -0.001165 -0.001937 -0.002523 -0.000638 -0.001117 
+-0.001040 0.002813 -0.000214 -0.002091 0.001974 0.001591 
+0.000194 0.003393 0.000816 0.001639 0.005280 -0.000929 
+-0.000250 0.003075 -0.002456 -0.001920 0.000740 0.000603 
+-0.003178 -0.001554 0.002679 0.000220 -0.001017 0.000916 
+0.003872 0.005835 0.001252 -0.001653 0.005854 0.003565 
+-0.004602 0.004030 -0.004301 -0.006009 0.001868 -0.009970 
+-0.007278 0.001407 -0.012951 -0.002798 0.013006 -0.013085 
+0.010700 0.002884 -0.012445 0.008988 -0.001860 -0.010858 
+0.004443 -0.003943 -0.005071 -0.004428 -0.004938 0.003745 
+-0.008969 -0.008655 0.002796 -0.016568 -0.007734 0.008524 
+-0.009950 -0.001895 0.013622 -0.006520 0.002829 0.002282 
+-0.007317 0.000670 0.000861 -0.009050 -0.004398 -0.001594 
+-0.017766 -0.007710 -0.004973 -0.009099 -0.001211 -0.002112 
+0.003200 0.000000 0.005600 -0.001926 0.006069 0.001398 
+0.007343 -0.001608 -0.007552 -0.004994 0.001068 -0.006909 
+-0.000285 0.003251 -0.011269 0.013374 0.008723 -0.019578 
+0.016000 0.007878 -0.020483 0.008064 0.004074 -0.016283 
+0.002444 0.003756 -0.015884 -0.005273 -0.000433 -0.016515 
+0.001319 0.010352 0.003817 0.016045 0.010924 -0.001306 
+0.013848 0.008075 -0.004300 0.019312 0.006916 -0.011574 
+0.011276 0.025584 -0.020278 0.012975 0.014658 -0.006290 
+0.001582 0.001386 -0.002442 -0.002237 -0.002988 -0.001276 
+-0.001037 -0.000599 -0.000646 0.000153 -0.000147 -0.000026 
+-0.001304 -0.001418 0.002384 -0.000531 -0.003220 0.003631 
+0.003367 -0.004002 -0.000383 0.003699 -0.000413 -0.001494 
+-0.001621 0.002353 0.001171 -0.004720 0.001349 0.002654 
+-0.003899 -0.001288 0.001071 -0.000159 -0.004445 0.003160 
+0.000119 -0.000951 0.005151 0.000111 0.000691 0.002064 
+0.000732 0.004143 -0.000530 0.002264 0.005973 0.000814 
+0.000583 0.006670 0.000606 -0.002059 0.004948 -0.001142 
+-0.003305 0.002461 -0.000351 -0.000854 0.000915 -0.000754 
+-0.000852 -0.000416 -0.001275 0.000187 0.000974 -0.001909 
+-0.000951 0.002453 -0.003327 -0.001426 0.002917 -0.004535 
+-0.002033 0.005555 -0.003934 -0.000055 0.008738 -0.003023 
+-0.002264 0.001954 -0.002240 -0.002146 0.002938 -0.000067 
+0.007350 0.000000 -0.005983 -0.000832 0.000713 0.000611 
+-0.001621 -0.001371 -0.002191 -0.000649 -0.004744 -0.002373 
+0.004007 -0.000846 -0.001024 0.000898 -0.000776 0.000735 
+0.000711 -0.000190 0.001389 0.001436 0.001284 -0.002021 
+0.002906 0.003290 -0.004157 0.001414 0.001883 -0.004307 
+0.000741 -0.000267 -0.001849 0.001093 -0.000081 -0.000687 
+0.000669 -0.001246 -0.001204 -0.000203 0.000245 0.000114 
+-0.000029 0.003067 0.003977 0.003816 -0.000227 0.003741 
+0.007504 -0.002386 -0.007855 0.004851 0.004104 -0.008795 
+0.005540 0.001254 -0.004390 -0.003947 0.008212 -0.000120 
+-0.006453 0.004440 -0.003221 0.011122 0.024729 -0.012059 
+0.010894 0.020823 -0.006803 0.012017 0.012585 -0.008124 
+0.005081 -0.001420 -0.009684 0.003650 -0.002424 -0.000978 
+-0.000039 0.000984 0.002110 -0.002490 -0.002114 0.007034 
+-0.011441 0.001367 0.007512 -0.005660 -0.003113 -0.004811 
+-0.004909 -0.002182 -0.002909 -0.010033 -0.014214 0.000408 
+-0.006648 -0.021030 -0.004348 0.000791 -0.004915 -0.008869 
+0.003798 0.004310 -0.004698 0.006281 -0.000402 0.001549 
+0.006959 -0.006697 0.006283 0.002690 -0.015504 0.002895 
+0.005169 -0.010999 0.003173 0.001703 -0.001762 -0.000302 
+0.000237 0.000237 -0.000158 -0.004845 -0.009691 -0.005191 
+-0.004546 -0.012352 -0.015928 -0.004728 -0.009817 -0.006140 
+-0.006745 0.000153 -0.003702 0.005043 0.004093 0.004103 
+0.011702 0.026447 -0.008639 0.027803 0.013367 -0.016967 
+0.008429 0.002675 -0.024969 -0.000912 0.001067 -0.008443 
+-0.005740 -0.003068 0.001220 -0.007806 -0.004857 0.006939 
+-0.007548 -0.004604 0.009585 -0.006770 -0.001451 0.008182 
+-0.000801 0.002001 0.006633 0.000167 0.001370 -0.000617 
+0.003384 -0.000369 -0.002536 0.005150 0.000488 -0.003433 
+0.006528 0.000915 -0.003110 0.006226 -0.000918 -0.000637 
+0.001770 -0.000436 0.002158 -0.002376 -0.000435 0.000853 
+-0.000022 0.000879 0.001373 -0.000352 0.004160 0.003238 
+0.002021 0.007197 0.001913 0.003034 0.006355 -0.001401 
+-0.000059 0.002095 -0.001163 -0.000129 0.000051 0.000240 
+-0.002906 -0.001446 0.000289 -0.002861 -0.001152 -0.002282 
+-0.002477 0.000541 -0.004640 -0.001640 0.002222 -0.006699 
+0.001710 0.004319 -0.003014 -0.001012 -0.000260 -0.001566 
+-0.000432 -0.000644 -0.001232 -0.000851 0.000372 -0.001242 
+0.001653 0.007367 -0.004062 -0.000140 0.002026 0.000903 
+-0.001761 -0.000003 -0.000505 -0.003991 0.000374 0.000570 
+-0.004569 0.002127 -0.004645 -0.002160 0.000058 -0.001570 
+0.001725 -0.001235 -0.001981 0.003457 -0.001376 -0.003138 
+0.002074 -0.000550 -0.003805 -0.000481 0.001102 -0.002172 
+-0.000904 0.001052 0.001259 -0.000825 0.001131 0.001031 
+-0.000102 0.000456 0.000486 -0.002774 0.001439 -0.001097 
+-0.008372 0.008750 0.001190 0.016688 0.014173 0.002125 
+-0.000181 0.001267 -0.001799 0.003787 0.009859 -0.006508 
+-0.002784 0.014342 -0.005922 -0.004604 0.012282 -0.005395 
+-0.003911 0.010080 -0.011024 -0.006424 -0.000177 -0.011312 
+0.002755 -0.001595 -0.009369 0.004688 0.000200 -0.000548 
+-0.001259 -0.000054 -0.000226 -0.004735 -0.000873 -0.003063 
+-0.005014 0.002218 0.000945 -0.009827 0.004555 0.001688 
+-0.026571 -0.000311 -0.001181 -0.019773 -0.013032 -0.000674 
+-0.001045 -0.006925 0.003912 0.001998 -0.004407 0.001041 
+-0.002243 -0.001296 0.001028 -0.004711 0.009141 -0.011824 
+0.001441 0.006790 -0.020807 -0.001564 0.001884 -0.011462 
+-0.007596 0.002885 -0.001538 -0.007966 0.004221 0.004280 
+-0.007785 -0.000567 0.006683 -0.002273 -0.001337 0.000437 
+0.003212 -0.002801 0.002641 0.001435 -0.009549 -0.004295 
+-0.025843 -0.007735 -0.005701 -0.017783 -0.009062 -0.006725 
+-0.003569 0.003165 -0.018605 0.005027 0.017758 -0.013235 
+0.014622 0.001060 -0.009971 0.011626 -0.002780 -0.018007 
+0.002138 0.020331 -0.029964 0.002444 0.017715 -0.021836 
+-0.002027 0.009139 -0.009822 0.001507 0.006610 -0.004343 
+-0.001244 0.010215 -0.005657 -0.001272 0.014037 -0.011157 
+0.004502 0.014031 -0.003474 0.003590 0.007979 -0.004240 
+0.005927 0.006341 -0.001976 0.004324 0.006156 -0.000750 
+0.000381 0.005401 -0.000220 -0.000942 0.003810 0.000526 
+-0.000534 0.003075 -0.000954 0.001006 0.004337 -0.001607 
+-0.001089 0.006110 -0.004119 0.003270 -0.000029 -0.002238 
+0.001083 0.000958 -0.000521 -0.002203 0.000268 0.001328 
+-0.001173 0.002532 0.001179 0.002323 0.005042 0.000059 
+0.005302 0.005506 -0.002819 0.005513 0.003232 -0.003026 
+0.000593 0.003271 -0.000545 -0.001788 0.004569 -0.002979 
+-0.001209 0.005743 0.001572 -0.001062 0.004120 0.001648 
+-0.002389 -0.002389 0.007345 -0.004852 0.000419 0.001158 
+-0.001505 0.004150 -0.001086 -0.001897 0.003322 -0.000911 
+0.003244 0.006065 0.001264 0.001775 0.007278 -0.010521 
+-0.004038 0.002558 -0.005304 -0.003489 0.000716 -0.003033 
+-0.000422 0.000082 -0.003171 0.001146 -0.002466 -0.002394 
+0.001247 0.002213 0.000016 0.000571 0.000283 -0.002196 
+-0.003131 0.001819 -0.000559 -0.005012 0.003326 0.000336 
+-0.005906 -0.000805 -0.004856 -0.006229 -0.017695 -0.012026 
+-0.006701 -0.020771 0.007672 0.001420 -0.011985 0.011474 
+0.006356 -0.003702 0.002887 0.009976 -0.005662 -0.005429 
+0.015606 0.010920 -0.021962 0.025548 0.020336 -0.022169 
+0.011904 0.008554 -0.008971 -0.002039 0.006186 -0.009634 
+-0.028018 0.004355 -0.011457 0.006821 0.007564 -0.024179 
+0.020592 0.011817 -0.009769 0.009322 0.005225 -0.000142 
+-0.000947 -0.001502 -0.003633 0.001763 -0.008246 -0.011430 
+0.029896 0.031726 -0.019442 0.000842 0.000639 -0.001123 
+-0.003419 -0.004571 0.009487 -0.007366 -0.005243 0.013318 
+-0.000401 0.001310 -0.004784 0.020033 0.019633 -0.058778 
+0.050332 0.027647 -0.043142 0.034718 -0.000432 -0.042180 
+-0.008070 0.011231 -0.016850 -0.016728 0.008436 -0.002006 
+-0.001373 0.004281 -0.005215 -0.000624 0.001260 -0.001450 
+0.000360 -0.002893 0.006896 -0.001069 -0.007323 0.013825 
+-0.004789 -0.005245 0.018549 0.004108 -0.018236 0.020831 
+0.000082 -0.015083 0.019885 -0.005702 -0.000567 -0.002500 
+-0.002016 0.014535 -0.005469 0.010460 0.020828 -0.009221 
+-0.000955 0.000384 -0.000407 0.000528 -0.001282 -0.003213 
+-0.003731 0.002330 -0.001169 -0.005864 0.000246 0.003464 
+0.002900 0.002203 -0.002083 0.003156 -0.002888 0.001077 
+0.000394 0.000740 -0.002044 0.003089 0.007109 0.005486 
+0.000302 0.006169 0.003688 -0.001002 -0.001980 0.000375 
+-0.002910 -0.006528 0.002434 -0.004601 -0.006930 0.001798 
+-0.002235 -0.004630 -0.000070 -0.000316 -0.002186 0.000852 
+0.001149 0.000538 -0.000952 -0.000106 0.000033 0.000002 
+0.000589 0.000375 0.000557 -0.000191 0.000573 0.000191 
+0.001508 0.005676 -0.004142 0.002692 0.007026 -0.002363 
+0.003038 0.005893 -0.000626 -0.002232 -0.000080 -0.001523 
+0.001118 -0.002773 -0.001860 -0.000225 0.001048 0.000729 
+-0.002035 0.004533 0.002550 -0.002853 0.003684 0.001153 
+-0.002279 0.000315 -0.002134 -0.000074 -0.000296 -0.001259 
+0.000964 -0.000974 -0.005949 -0.001532 0.006327 -0.007512 
+-0.000151 0.000075 -0.010094 -0.002506 0.001430 -0.004410 
+-0.002074 0.001176 -0.002167 -0.000732 -0.000619 -0.003673 
+0.003042 -0.001075 -0.003410 0.002619 -0.001131 -0.001858 
+0.003106 -0.001848 0.001846 0.003147 -0.001436 0.000866 
+0.001854 -0.001067 -0.000148 -0.001476 -0.004962 -0.009229 
+0.031579 -0.002322 -0.021122 -0.000452 0.001892 0.000431 
+0.003332 0.008395 0.003589 0.007927 0.015928 0.010702 
+0.017967 -0.015139 -0.001235 0.001500 -0.030463 0.007673 
+-0.024212 -0.039063 0.013780 0.122460 0.011032 -0.016825 
+0.066456 0.051071 -0.027637 0.055347 0.005932 -0.033888 
+-0.029166 -0.094930 0.088984 0.003298 -0.050583 0.011734 
+0.003380 0.000243 -0.008390 0.011002 0.006522 -0.009685 
+0.005304 0.011183 -0.009875 0.002627 0.028916 -0.043998 
+0.030684 0.071532 -0.083580 -0.009312 -0.012625 0.020565 
+-1.553846 -2.476923 3.761539 -1.574713 -2.879310 4.402299 
+-1.375758 -2.830303 4.193939 -0.009744 -0.022225 0.034048 
+0.009232 0.007417 -0.002414 0.023371 0.024734 -0.041147 
+0.002635 -0.013697 0.014487 0.000872 -0.012811 0.026569 
+-0.000596 -0.007485 0.018308 0.017029 0.007479 0.011299 
+0.009706 0.012836 0.002755 0.007848 0.007725 0.000587 
+0.004008 0.018721 0.000420 0.004323 0.017953 -0.022021 
+-0.056812 0.022582 -0.018211 -0.056766 0.014484 0.013010 
+-0.039389 0.021222 -0.000278 -0.026916 0.035734 -0.003215 
+-0.008841 0.016926 -0.000202 -0.000450 0.003981 0.001295 
+-0.002423 0.000154 -0.001095 -0.001781 -0.004337 0.003501 
+-0.002619 -0.010352 -0.000241 -0.035065 -0.028248 0.014902 
+-0.020521 -0.024414 0.027777 -0.020848 0.013949 0.022881 
+-0.012047 -0.002962 0.009735 -0.003833 -0.008406 0.000339 
+0.000405 -0.007067 -0.000456 0.000825 -0.007032 0.000883 
+0.000966 -0.005273 0.000926 0.001244 0.000177 0.000323 
+0.001297 0.003242 -0.006485 -0.001480 0.005607 -0.005091 
+-0.002046 0.004096 0.000384 -0.001466 0.001073 -0.000219 
+0.000571 -0.000818 0.001022 0.000070 -0.003463 0.000609 
+-0.003392 -0.001392 0.001913 -0.003122 -0.001117 -0.001034 
+-0.002501 -0.002188 -0.000886 -0.002606 -0.002359 -0.001058 
+-0.004130 -0.000765 -0.000028 -0.004767 0.000061 -0.000245 
+-0.005819 0.000684 -0.002925 -0.006424 0.001800 -0.001606 
+0.004883 0.002421 -0.002987 -0.002935 0.006253 -0.000647 
+-0.000980 0.001622 0.000411 -0.000872 0.000667 -0.000759 
+-0.000556 -0.000393 -0.000420 -0.001409 -0.000067 0.002921 
+-0.000514 -0.000031 0.004710 -0.000108 0.000314 0.002913 
+-0.005613 0.002449 -0.005051 -0.029491 0.013089 -0.005027 
+-0.026368 0.076835 0.079297 0.020828 0.020495 -0.024183 
+-0.006822 -0.010256 -0.010880 -0.009770 -0.013563 0.002989 
+-0.010376 -0.000283 -0.000197 -0.009289 0.004632 -0.000844 
+-0.004576 -0.000711 0.002014 -0.010139 0.002293 -0.001874 
+-0.012145 0.006036 -0.009836 -0.007427 0.021275 -0.024247 
+0.001644 0.078255 -0.042424 -0.002527 0.025443 -0.012447 
+-0.033795 -0.013606 0.015904 -0.045530 -0.021543 0.023664 
+-0.029078 -0.002857 0.011590 -0.004326 0.004228 0.001182 
+0.004978 -0.002035 -0.004874 0.011938 -0.005115 -0.022055 
+-0.024543 0.017292 -0.048128 -0.005852 -0.014683 0.025587 
+-1.629808 -2.735577 4.480769 -1.616959 -2.941520 4.649123 
+-1.572193 -2.901069 4.414439 -1.501873 -2.670412 3.996255 
+-0.008177 -0.018947 0.026621 0.008311 0.008846 -0.007255 
+-0.000751 0.002509 -0.003723 0.004522 -0.002374 0.001621 
+0.000906 0.000419 0.004905 0.006127 0.010586 -0.003752 
+0.002997 0.005747 -0.006746 0.002850 -0.003108 0.004557 
+-0.001299 -0.005300 0.008422 -0.017926 0.007989 -0.020093 
+-0.001206 0.025523 -0.044263 0.002612 0.029138 -0.018326 
+-0.004881 0.023185 -0.006464 -0.003531 0.017316 -0.006914 
+0.000497 -0.001266 -0.003246 0.012703 0.000410 0.004664 
+0.021595 0.006621 -0.008251 0.004855 -0.002738 -0.015022 
+-0.004123 -0.001675 -0.011382 -0.004005 -0.011332 0.006689 
+0.004185 -0.007967 0.006758 0.008311 0.003988 -0.008413 
+0.000975 0.007716 -0.000388 -0.002699 0.001032 0.002947 
+-0.001929 -0.002092 0.000224 0.002141 -0.004061 -0.002469 
+0.003191 -0.001900 -0.000323 0.001541 0.002821 0.000148 
+-0.000987 0.006278 -0.001546 0.000292 0.005366 -0.001142 
+0.000849 0.002136 -0.000035 -0.001319 -0.000039 0.000627 
+-0.002248 -0.001754 0.000874 -0.005273 0.000519 -0.001495 
+-0.003746 0.002198 -0.001313 -0.001519 0.001806 -0.001252 
+0.001356 0.001940 -0.000838 0.000067 0.000864 -0.001062 
+-0.001833 -0.000979 -0.000747 -0.001405 -0.000899 0.001574 
+-0.000377 -0.000262 0.002377 -0.004769 -0.000456 0.001701 
+-0.006178 0.001086 0.002803 -0.008352 -0.001454 0.007776 
+-0.003606 -0.001170 0.004620 0.000482 -0.000018 0.000409 
+0.001381 -0.000523 -0.000187 0.002280 -0.001173 0.002231 
+0.006468 -0.003338 0.001345 -0.003242 -0.009078 -0.023203 
+-0.018275 -0.008726 -0.007291 -0.009358 0.003756 -0.005165 
+-0.023010 0.011144 0.036095 -0.033445 0.014667 -0.006869 
+-0.006365 -0.000501 -0.006817 0.000382 -0.000289 0.000418 
+-0.005288 -0.001189 0.006157 -0.002698 -0.001365 0.002953 
+-0.003085 0.001681 -0.000816 -0.005856 0.006938 -0.007111 
+-0.009391 0.011517 -0.012361 -0.007072 0.018372 -0.016256 
+0.005752 0.027566 -0.026942 0.004392 0.025927 -0.031316 
+-0.007383 0.014031 -0.012429 -0.009022 0.003730 0.002492 
+-0.005548 -0.001894 0.002079 -0.000423 0.005201 -0.000804 
+0.015381 0.009129 -0.031525 0.027819 0.039870 -0.038263 
+0.005705 0.014830 -0.041325 -0.003581 -0.000688 0.007015 
+-1.256831 -2.754098 4.923497 -1.644444 -3.231746 5.269841 
+-1.767568 -3.281081 5.000000 -1.723684 -3.105263 4.427631 
+-1.122807 -2.222222 3.011696 0.004784 0.012912 -0.011375 
+0.017194 0.027921 -0.029324 0.004171 0.006625 -0.005406 
+-0.003825 -0.006198 0.002154 -0.004954 0.000661 0.003609 
+-0.000985 0.000561 0.003394 -0.004729 0.000270 0.002676 
+-0.009270 -0.001686 -0.000503 -0.007851 -0.000263 -0.008086 
+-0.004969 0.005993 -0.015412 -0.004236 0.012416 -0.011743 
+-0.007541 0.013402 -0.010369 -0.007779 0.004911 -0.002727 
+-0.004964 -0.004436 0.007304 0.004670 -0.000307 0.001321 
+0.002813 0.006495 -0.007132 0.002105 0.012587 -0.016972 
+-0.002938 0.012197 -0.029468 0.003699 -0.000349 -0.030498 
+0.016251 0.015823 -0.010585 0.010257 0.015986 -0.006729 
+0.002582 0.013842 -0.000957 0.002069 0.003809 0.001358 
+0.005294 0.001061 -0.003729 0.001355 -0.002011 -0.004642 
+-0.003751 -0.003031 -0.000338 -0.004795 -0.001456 -0.000029 
+-0.000748 -0.000041 -0.000038 0.003238 0.000352 0.000853 
+0.003925 0.001314 0.002375 0.000161 0.004325 0.003877 
+-0.001114 0.003822 0.004024 0.001925 0.002918 -0.000026 
+0.002925 0.003461 -0.001440 -0.000113 0.002307 -0.000639 
+-0.001008 0.000446 -0.000447 -0.001011 0.000331 -0.001109 
+-0.000999 0.000237 -0.001725 0.000310 0.000645 -0.002473 
+0.005052 -0.000666 -0.000176 0.005107 -0.000332 0.002076 
+-0.012362 0.005120 0.003201 -0.020679 0.005146 0.008230 
+-0.010126 0.003849 0.006947 0.001489 0.000028 0.000534 
+0.004351 -0.004229 -0.006745 0.008508 -0.007821 -0.009883 
+-0.004113 0.014569 0.013446 0.026166 -0.037835 -0.008076 
+0.170271 -0.040869 -0.104259 0.023816 0.019325 -0.024081 
+0.001481 -0.000463 -0.003704 -0.000975 -0.001050 0.008140 
+0.006219 -0.004453 0.006970 0.002887 0.002253 0.001620 
+-0.001883 0.005061 0.005169 -0.001421 0.000735 0.002425 
+0.002089 0.001940 -0.003132 -0.000745 0.008037 -0.013306 
+0.000131 0.021656 -0.008302 0.014361 0.026618 -0.018521 
+0.009779 0.022196 -0.024162 0.006113 0.015831 -0.019306 
+0.003598 0.012497 -0.010115 -0.001218 0.004549 -0.001465 
+-0.001836 0.002274 -0.000640 -0.006245 0.010936 -0.012392 
+-0.020200 0.028208 -0.013527 0.036705 0.051627 -0.054295 
+0.015237 0.027557 -0.041883 -0.002011 -0.004868 0.009059 
+-1.146497 -2.656051 4.407643 -1.411255 -3.376623 5.489178 
+-1.479401 -3.531835 5.213483 -1.519313 -3.437768 4.313305 
+-0.008648 -0.024577 0.029780 0.002270 -0.001952 -0.004255 
+0.009484 0.002901 -0.011303 0.002642 -0.005000 0.003633 
+0.005216 -0.006127 0.008735 0.004171 -0.001940 -0.000166 
+-0.001118 0.007235 -0.004118 -0.007706 0.004892 -0.000636 
+-0.006934 -0.000259 0.001069 -0.003965 0.003224 -0.002915 
+-0.002782 0.012927 -0.008213 -0.002045 0.015469 -0.011211 
+-0.003164 0.007509 -0.006021 -0.005568 -0.000185 0.000341 
+-0.007025 -0.005996 0.000902 -0.001308 -0.002866 -0.002622 
+-0.002797 0.017377 -0.014527 0.005068 0.008817 -0.028088 
+0.005399 -0.003746 -0.010413 0.002432 0.001510 0.004068 
+-0.000545 0.003005 0.006112 -0.000493 -0.000537 0.000902 
+0.001344 0.002470 -0.007696 -0.001488 -0.004612 -0.012241 
+-0.003238 -0.005828 -0.009713 -0.001336 -0.001394 -0.001418 
+0.004006 0.002780 -0.001299 0.005163 0.001158 0.000266 
+-0.001334 0.001059 0.000377 -0.008889 0.000663 -0.002350 
+-0.009557 -0.002393 -0.003721 -0.002489 -0.004312 -0.004060 
+-0.001664 -0.002771 -0.001834 -0.005936 -0.001970 0.002853 
+-0.009380 -0.001175 0.004018 -0.008801 0.000171 0.000852 
+-0.004457 0.001814 -0.000230 -0.000430 0.003481 -0.000356 
+0.001066 0.001823 -0.000148 0.000041 -0.000481 0.002312 
+-0.000195 -0.000716 0.000681 0.005965 0.001964 -0.004279 
+0.013674 0.001743 0.011042 0.022272 0.005861 0.019600 
+-0.025595 0.009881 0.032560 -0.028532 0.004081 0.023959 
+-0.012725 0.003975 -0.010779 -0.041563 0.036332 -0.030647 
+-0.046766 0.028924 0.015854 0.034323 0.002463 -0.010150 
+0.014720 0.032701 -0.015697 -0.009375 -0.001806 0.004617 
+0.013285 0.012050 -0.009081 0.028176 0.002754 0.008027 
+0.041776 0.001049 -0.013028 0.001218 -0.005104 0.002229 
+-0.000341 0.000793 -0.000692 -0.001015 0.002295 -0.000795 
+0.008786 0.000952 -0.008567 0.006008 0.009508 -0.018440 
+0.004017 0.017104 -0.022903 -0.000544 0.019063 -0.018088 
+-0.001970 0.013843 -0.009458 -0.001946 0.010269 -0.005230 
+-0.004583 0.006350 -0.010119 -0.000574 0.003684 -0.011837 
+0.001109 -0.000970 -0.006425 -0.001815 -0.002514 0.002963 
+-0.010860 -0.001804 0.001608 -0.012885 0.014161 -0.008209 
+-0.000459 0.017316 -0.006977 -0.002338 0.001906 0.007067 
+-0.011085 -0.009375 0.028183 -1.068027 -2.877551 4.340136 
+-1.413333 -3.226667 4.520000 -0.009755 -0.022085 0.035572 
+0.004610 -0.002223 -0.000197 0.004283 0.009806 -0.019444 
+-0.000191 0.008568 -0.007617 -0.000472 -0.004923 -0.001011 
+-0.010117 -0.000816 0.008306 -0.003203 0.000027 -0.003757 
+-0.000975 0.005199 0.005000 -0.004058 0.000858 0.008420 
+0.003904 0.003110 0.004169 -0.002871 0.006361 -0.003546 
+0.009038 0.014159 -0.008767 0.000679 0.008031 -0.007062 
+-0.002460 0.004694 -0.002170 -0.002743 0.004285 -0.003428 
+-0.001368 0.007159 -0.005562 -0.002637 0.008053 -0.007966 
+-0.003742 0.001970 -0.010701 0.002009 -0.007164 -0.005334 
+0.026246 -0.011594 -0.057589 0.054730 -0.016571 -0.029524 
+-0.049074 -0.023704 0.060926 -0.015747 -0.009673 -0.017249 
+0.035427 0.015313 -0.040643 0.013657 -0.002872 -0.011997 
+-0.016032 0.011779 0.003334 -0.024172 -0.005472 0.008561 
+-0.001796 0.000816 0.002893 -0.001504 0.001417 0.002730 
+0.003260 0.000661 0.001484 0.007627 0.000957 0.003549 
+0.009992 0.002911 0.003466 0.002041 0.003203 0.005304 
+-0.007864 0.000274 0.005962 -0.012731 -0.005361 0.003662 
+-0.011064 -0.007410 0.001786 -0.006672 -0.005523 -0.000445 
+-0.001346 -0.002541 -0.000956 0.001401 0.001858 0.000681 
+0.000840 0.005391 0.000867 0.002243 0.003548 0.000083 
+0.001298 0.001559 0.000418 0.002971 0.000325 -0.002549 
+0.039514 0.003951 -0.021818 0.077905 0.086952 -0.100857 
+0.001562 -0.000625 -0.007187 -0.108550 -0.117673 0.168907 
+-0.003658 -0.013066 0.025433 -0.012817 -0.010801 0.009199 
+0.018022 -0.021201 0.004397 0.007777 -0.000723 -0.002371 
+-0.001451 0.017009 0.003657 0.005184 0.016877 0.001916 
+0.000378 0.002824 0.014505 0.008094 -0.007420 0.000765 
+-0.013339 0.046235 0.034077 -0.004020 0.003361 -0.014433 
+-0.002648 0.001578 -0.005440 0.000306 0.003878 -0.003571 
+0.004369 0.003908 -0.006030 0.003587 0.004321 -0.007608 
+0.001696 0.002771 -0.000365 -0.005996 0.000802 -0.004745 
+-0.004286 0.002302 0.000686 -0.003557 0.001950 0.002800 
+-0.003496 0.000655 0.004808 -0.000090 -0.000122 0.002882 
+0.007494 -0.001288 -0.000874 0.005330 -0.001752 0.002019 
+-0.001519 -0.002143 0.004716 -0.000888 0.000422 -0.001355 
+-0.000047 0.004616 -0.010387 -0.000139 0.002640 -0.005917 
+0.000526 -0.001198 0.003951 0.002470 -0.006462 0.014082 
+0.001331 -0.008754 0.018454 0.001133 -0.004071 0.007412 
+-0.001250 0.004583 -0.007083 -0.001198 0.004678 -0.014605 
+0.002712 0.006794 -0.015348 0.002524 0.008070 -0.012840 
+0.001766 0.004296 -0.006173 -0.002467 0.000573 0.001229 
+-0.002597 0.006164 0.003447 0.005598 0.001295 0.000894 
+0.003515 -0.001115 -0.004875 0.004095 -0.001259 -0.001841 
+-0.004139 -0.003470 0.001185 -0.003276 -0.006992 0.001067 
+-0.002604 -0.003349 -0.000911 -0.004053 0.001895 -0.000474 
+-0.001194 0.001446 -0.002115 -0.002092 0.000993 -0.003699 
+-0.004105 0.003838 -0.006857 0.027301 -0.006421 0.023233 
+-0.037859 -0.011875 0.045430 -0.040526 -0.039211 0.036579 
+-0.034269 -0.019359 0.054410 -0.068867 -0.016552 0.023842 
+-0.095152 -0.022457 -0.027087 0.029014 -0.022441 -0.009484 
+0.094455 -0.099089 0.023050 -0.025000 -0.057500 0.027500 
+-0.042353 0.000643 0.015659 -0.040570 -0.002931 0.016133 
+-0.020322 -0.000340 0.003280 -0.002069 0.002314 0.013521 
+0.008638 -0.002673 0.012077 0.002016 -0.001480 0.010930 
+-0.004125 -0.004949 0.014420 -0.005219 -0.001504 0.007028 
+0.002054 0.000159 -0.000758 0.006801 0.000024 -0.001746 
+0.005826 -0.000326 -0.002648 0.003607 -0.001152 -0.003046 
+0.000894 -0.000644 -0.000414 -0.005196 -0.000909 -0.000393 
+-0.002183 -0.004324 0.001144 0.000076 -0.002439 -0.002718 
+0.027944 -0.027702 0.033629 -0.001376 0.020348 -0.014303 
+-0.014681 0.047290 -0.035080 0.022236 0.003421 -0.055000 
+0.002585 0.007187 -0.032298 -0.014629 -0.005455 0.001240 
+0.002929 -0.006571 0.003214 -0.000719 -0.027415 0.003451 
+0.006219 -0.036439 -0.014831 0.012234 0.004180 0.016922 
+-0.015405 -0.003645 0.009642 -0.016728 0.020729 -0.004446 
+0.003410 -0.001190 -0.017587 -0.001406 0.002396 -0.003100 
+-0.003448 0.001103 0.000337 -0.004084 0.002913 0.002636 
+-0.004260 0.001297 0.002515 0.000521 -0.000201 -0.000885 
+0.001099 -0.000319 -0.004588 -0.002156 -0.000309 0.000772 
+-0.002984 -0.005460 0.005305 0.000788 0.001838 0.003239 
+-0.003209 0.001318 0.001729 -0.003335 0.003763 -0.007302 
+-0.002860 0.002189 -0.008887 -0.000602 0.000235 -0.004379 
+-0.001227 -0.000441 -0.000663 -0.000433 0.002395 -0.004578 
+0.003050 0.007495 -0.016172 0.002988 0.005191 -0.021433 
+0.007707 0.007922 -0.015988 0.005874 0.009154 -0.004958 
+0.005553 0.003687 -0.002067 0.002939 0.002508 -0.003932 
+0.000924 0.003152 -0.005146 0.002174 0.002346 -0.003216 
+0.003271 0.000710 -0.000540 0.001529 0.000895 -0.000726 
+-0.001042 0.003313 -0.003429 -0.001399 0.004466 -0.004790 
+0.001394 0.003573 -0.002008 0.002131 0.002856 0.002422 
+0.000385 0.000962 0.000769 -0.005724 0.001519 0.001940 
+0.000854 0.001114 -0.001806 0.005759 0.004380 -0.000315 
+0.004201 0.001457 0.002297 -0.000791 -0.001377 0.002322 
+-0.000174 -0.001094 -0.000997 0.000757 0.003601 -0.004160 
+0.004451 0.010847 0.001403 0.009694 0.019394 0.016957 
+0.018350 -0.004579 0.017205 -0.030178 -0.034311 0.049111 
+0.016840 0.007252 -0.010637 0.011843 0.008916 0.029810 
+-0.009402 0.019764 0.072534 -0.016068 0.007438 0.028488 
+-0.033928 -0.025950 0.001317 0.008012 -0.012515 -0.035789 
+0.017455 -0.003694 -0.004032 0.006978 -0.058065 0.027870 
+-0.017179 0.041436 0.035949 0.003111 0.021422 -0.002844 
+0.051498 0.055751 -0.009257 -0.004212 0.055586 -0.009524 
+-0.027529 -0.016669 -0.009719 -0.010930 -0.006319 -0.011414 
+0.004166 0.000446 -0.005245 0.002742 0.002552 0.000373 
+-0.001375 -0.000250 0.000400 -0.003217 -0.002658 0.001492 
+-0.000378 -0.000411 0.000280 0.000020 0.002712 -0.001276 
+0.000046 0.002422 -0.000285 0.000472 0.001179 0.002325 
+0.010000 0.005928 -0.023710 0.036171 0.016193 -0.032269 
+0.006627 0.012317 -0.009184 -0.004128 -0.002000 0.013761 
+-0.001961 -0.011656 0.008715 0.009946 -0.009412 0.005571 
+0.027270 -0.023084 -0.001002 -0.000255 -0.049630 -0.009977 
+0.005185 -0.042370 -0.021630 -0.001956 -0.021956 0.020496 
+0.003204 -0.001606 0.018149 0.009270 -0.018318 0.007502 
+-0.000576 -0.001770 0.002229 -0.000723 0.003690 -0.000557 
+-0.004064 0.002660 -0.001250 -0.004161 0.001918 -0.001967 
+-0.007661 -0.000627 0.000993 -0.006369 -0.006283 -0.002543 
+-0.004938 -0.011081 0.002733 -0.007787 -0.002516 0.006464 
+-0.008879 0.002842 0.003449 -0.006558 0.004254 0.000396 
+-0.004029 0.004039 -0.000335 -0.005298 0.000519 0.001316 
+-0.005901 -0.000770 -0.004226 -0.002026 -0.002077 -0.003287 
+-0.001434 -0.001113 0.001110 0.002545 -0.001787 0.003258 
+0.004491 -0.002073 0.001807 0.005454 0.003450 -0.002448 
+0.005642 0.009050 -0.005749 0.005596 0.010332 -0.009281 
+0.006485 0.009242 -0.008807 0.007892 0.008233 -0.006450 
+0.008605 0.008762 -0.006272 0.007337 0.009146 -0.006589 
+0.005015 0.007654 -0.005372 0.003475 0.005095 -0.003300 
+0.002835 0.004013 -0.002105 0.002647 0.005333 -0.003643 
+0.004410 0.007319 -0.006868 0.006019 0.008942 -0.008048 
+0.005995 0.007453 -0.005864 0.003492 0.005741 -0.003778 
+-0.000805 0.006579 -0.003722 0.002116 0.004927 -0.008282 
+0.001282 0.003967 -0.003104 0.000505 -0.000246 0.000774 
+-0.002818 -0.001424 0.000385 -0.000050 0.000957 0.000236 
+-0.000177 0.007625 -0.005921 0.001608 0.028830 -0.022040 
+0.029905 0.053524 -0.046286 0.043470 0.046129 -0.050272 
+0.030262 0.012181 0.009117 -0.008500 0.007820 -0.004201 
+0.004314 -0.036863 -0.016275 0.014814 -0.023313 0.047719 
+-0.008138 -0.066429 0.009766 0.045244 -0.015244 -0.022683 
+0.011292 0.038612 0.024163 -0.023349 0.042389 0.066815 
+-0.016465 0.053493 0.048865 0.012667 -0.025333 0.081333 
+-0.082378 -0.036118 -0.013358 -0.031037 0.003491 -0.008245 
+-0.019567 0.013146 0.003471 -0.050719 0.015548 0.002482 
+0.011414 0.006973 -0.010710 0.005305 0.004484 -0.000416 
+0.003988 0.003969 0.000506 0.001713 0.002192 0.000187 
+0.000060 -0.000460 -0.000077 -0.000961 -0.001667 -0.000036 
+-0.002494 -0.003041 -0.002247 -0.000429 -0.004552 -0.000924 
+0.009405 0.021267 -0.015130 0.017005 0.019662 -0.028164 
+0.011703 0.005385 0.011081 0.001166 0.009115 0.014701 
+0.002802 0.011223 0.018558 0.018674 0.003220 0.024470 
+-0.000635 0.046984 -0.012063 -0.056176 0.015882 -0.068382 
+0.040000 0.048366 0.012092 0.023304 -0.007346 0.000853 
+0.019186 -0.017225 0.003826 -0.000239 -0.003741 0.006491 
+-0.005585 -0.003557 0.003778 -0.011315 -0.003818 -0.005297 
+-0.008140 0.002999 -0.013757 -0.004423 0.004608 -0.014038 
+0.000856 -0.004173 -0.011449 0.005182 -0.000740 -0.009086 
+0.002284 -0.000901 -0.004159 -0.000526 0.001307 -0.000352 
+-0.002557 0.001739 -0.000729 -0.000841 0.003307 -0.003214 
+-0.002370 0.002362 -0.005235 0.001185 -0.000713 -0.006202 
+0.003066 0.001456 -0.004498 0.001318 0.001279 -0.002693 
+0.000768 -0.000332 -0.001341 0.000831 -0.001134 -0.000946 
+0.002108 -0.001786 0.000889 0.002120 0.000009 0.000751 
+0.003860 0.004483 -0.000978 0.006315 0.007997 -0.004771 
+0.004811 0.006637 -0.003567 0.000866 0.001284 -0.000572 
+-0.000692 -0.001812 0.000653 0.002393 -0.000002 -0.000920 
+0.006004 0.003316 -0.000639 0.003450 0.002957 0.002903 
+0.000330 0.001558 0.001049 -0.002257 0.002181 -0.001220 
+-0.002389 0.003962 -0.006171 -0.002108 0.002923 -0.005907 
+-0.000295 0.002027 -0.003339 -0.001135 0.001034 -0.002547 
+-0.004832 -0.000836 -0.005985 -0.007442 -0.005814 -0.003256 
+-0.000631 -0.008877 0.005204 0.000822 -0.005952 0.006943 
+0.001826 -0.000487 0.001854 -0.001135 0.004014 -0.000446 
+0.000921 0.005050 0.000883 0.000233 -0.005252 0.009286 
+-0.005231 -0.006974 0.035744 -0.008915 0.008354 0.017930 
+-0.032009 0.024164 0.004352 -0.028306 -0.074471 0.028671 
+0.086000 0.000000 0.065000 -0.034000 -0.010000 0.010000 
+-0.086480 -0.022800 -0.005360 0.034091 0.001439 0.012424 
+0.005607 -0.003866 0.008219 0.007296 0.045030 0.053542 
+0.156323 0.127010 -0.016285 0.012349 -0.015014 -0.010984 
+-0.039055 -0.070299 0.126538 -0.029116 -0.046939 0.006531 
+-0.035076 -0.015763 0.024510 -0.020224 -0.020531 0.015053 
+-0.006796 -0.001109 0.015395 0.029867 0.003257 -0.014414 
+0.023710 0.003196 -0.022544 0.002068 -0.003557 -0.006439 
+-0.003289 -0.003414 -0.000555 -0.003203 -0.000736 -0.000135 
+-0.000656 0.000257 -0.000295 0.000022 0.000559 0.000127 
+0.012772 -0.001151 -0.016514 -0.001342 -0.003441 -0.021315 
+-0.023114 0.007619 -0.015751 -0.044176 0.014192 0.002061 
+-0.101176 -0.025294 0.035000 0.003738 -0.008476 0.003649 
+-0.018769 0.012000 0.010846 -0.025407 -0.002547 0.020284 
+-0.015944 0.007002 0.000061 -0.013585 0.003730 -0.009282 
+-0.004798 0.001902 -0.003241 0.001491 -0.001847 0.005129 
+-0.011319 0.003578 0.012133 -0.008899 0.005891 0.013001 
+-0.005622 0.001113 0.010821 0.000652 0.000522 0.000391 
+0.000511 -0.001014 -0.007034 0.001875 -0.004470 0.000369 
+-0.001307 -0.006062 0.003922 -0.001875 -0.002878 0.001242 
+0.002257 0.001368 0.000558 0.002548 -0.000778 0.001027 
+-0.000395 -0.000422 -0.002027 0.002394 0.000544 -0.006963 
+-0.000269 0.000215 -0.005229 0.002713 0.004775 -0.005679 
+-0.002632 0.002044 -0.002036 -0.003630 0.002495 0.000616 
+-0.001171 0.001661 0.000755 -0.000041 -0.000300 0.000108 
+-0.000736 -0.001716 0.001471 -0.001442 -0.001385 0.001018 
+-0.000469 0.000554 -0.000409 -0.002272 0.001191 -0.000812 
+-0.001211 -0.000127 0.000212 0.003803 -0.000228 -0.001027 
+0.008641 -0.000370 0.000618 0.006205 -0.002182 0.001295 
+0.002895 0.001468 0.000294 -0.000195 0.000960 -0.000275 
+0.002147 0.001135 -0.002120 0.006365 0.001365 -0.003635 
+-0.001422 0.008221 -0.000515 0.002662 0.012616 -0.005784 
+0.002429 0.009599 -0.006503 -0.000360 0.002652 -0.003260 
+-0.004364 -0.001645 0.004555 -0.002752 -0.005671 0.003949 
+-0.002208 -0.003921 0.002968 -0.001296 -0.001448 0.004034 
+0.000754 -0.002570 0.003477 -0.003941 -0.004532 -0.014745 
+0.003591 0.074423 0.093577 0.047791 -0.108758 0.099346 
+0.020652 -0.062321 0.043859 0.002811 -0.009974 0.036213 
+-0.008592 -0.008299 0.037399 -0.033461 -0.027522 0.054513 
+-0.012137 -0.054188 0.043675 0.028889 -0.042222 0.048889 
+0.072473 -0.096332 0.036087 0.059938 -0.088827 -0.018580 
+-0.003677 -0.022550 -0.012670 -0.010139 -0.017361 0.001806 
+-0.020947 -0.021819 0.019671 -0.082773 -0.072773 0.060490 
+-0.081353 -0.076003 0.031579 -0.024606 -0.028867 -0.005911 
+0.000496 0.003138 -0.015858 -0.003254 -0.000778 -0.002405 
+0.009417 -0.012272 0.002050 -0.005049 -0.020918 -0.012932 
+0.001500 0.004761 0.004392 0.001068 0.002519 0.003127 
+-0.000774 0.001440 0.001266 -0.003150 0.001336 -0.000979 
+-0.004433 -0.047143 0.011084 -0.034343 -0.024747 0.019192 
+-0.023178 0.040982 0.002351 0.002160 0.118827 0.024198 
+-0.012900 0.072090 -0.053120 0.000455 -0.005361 0.021803 
+0.020585 -0.008889 0.023392 0.006235 -0.000058 0.007543 
+-0.010849 0.007479 -0.004591 -0.007055 0.004025 -0.002185 
+-0.001750 -0.001129 0.001875 0.001695 -0.007189 0.005968 
+-0.003366 -0.007707 0.011463 -0.005732 -0.012300 0.004119 
+0.002450 -0.004181 0.000138 0.005216 -0.000686 -0.000539 
+0.004781 -0.003051 0.002867 -0.000884 -0.001890 0.004842 
+-0.001786 0.000628 0.002641 -0.000133 0.002194 -0.000834 
+0.002025 0.003351 -0.001891 -0.000360 0.003354 -0.005271 
+-0.002576 0.003308 -0.006512 -0.003323 0.003205 -0.004998 
+-0.002008 0.002761 -0.002122 0.001019 0.002669 0.000205 
+0.003565 0.003040 -0.000123 0.004535 0.002036 -0.000681 
+0.004893 0.001875 -0.002446 -0.002218 0.003283 -0.002794 
+0.007203 0.007567 -0.005220 0.003572 0.004522 0.000915 
+-0.002984 -0.000844 -0.000537 -0.006339 -0.005374 -0.003456 
+-0.005889 -0.007684 -0.001131 -0.000041 -0.000216 0.000012 
+0.004625 0.006436 0.001475 0.003645 0.000293 0.000998 
+-0.002609 0.000086 -0.000474 -0.006300 -0.001271 0.007582 
+-0.000511 -0.001095 0.006714 -0.001944 0.000000 -0.000278 
+0.004283 -0.001273 -0.004944 0.002762 0.005255 -0.002238 
+-0.001077 0.001737 -0.002691 -0.004767 -0.006472 0.000490 
+-0.007071 -0.013832 0.004352 -0.004652 -0.010417 -0.003876 
+-0.008557 -0.007117 -0.001760 -0.005373 0.004938 -0.000908 
+-0.003687 0.008040 -0.013746 -0.011568 0.010902 -0.018606 
+0.039428 0.005541 0.011947 -0.010874 -0.041951 0.053598 
+0.019343 -0.028027 0.042766 0.004286 0.003892 0.005123 
+0.007211 0.006953 0.001671 0.016914 0.025176 0.019655 
+0.003445 0.037311 0.046303 0.080556 -0.029444 0.025556 
+0.045600 -0.017000 0.022800 -0.023443 -0.032390 0.001491 
+-0.054823 -0.039150 0.027709 -0.045556 0.047701 -0.019080 
+0.002500 0.132500 -0.055000 -0.007049 0.094906 0.016992 
+-0.016890 0.046746 -0.004976 -0.005580 -0.009566 -0.045385 
+-0.019742 -0.017994 -0.014830 -0.012535 -0.012185 -0.020193 
+0.006665 -0.016182 0.000825 0.006782 0.016509 -0.011286 
+-0.023333 -0.029901 -0.032037 -0.070076 -0.014537 0.024872 
+-0.015782 -0.005941 -0.002620 -0.000186 -0.010281 -0.005908 
+-0.011508 0.007222 -0.037460 -0.010123 -0.034323 -0.028692 
+-0.040043 -0.047626 -0.038122 -0.072871 -0.013243 0.022079 
+-0.033181 0.021836 0.020068 0.000415 0.014834 0.038537 
+0.009044 0.003580 0.017489 0.002769 0.001425 0.005717 
+0.000034 0.002608 0.001533 -0.004854 -0.003832 0.003231 
+-0.003309 -0.009827 0.006924 -0.008318 -0.015227 0.005119 
+0.004345 -0.006024 -0.000396 0.001495 -0.007959 0.002563 
+-0.001503 0.000761 -0.002030 -0.000589 -0.001535 -0.012566 
+0.002705 0.005069 -0.011622 -0.001023 0.005445 -0.004965 
+-0.003682 0.003627 0.000855 -0.001923 0.001913 0.004342 
+0.000470 -0.000855 0.000470 0.001394 -0.000562 0.000293 
+0.004328 0.002403 -0.001634 0.003333 0.004931 -0.001088 
+-0.000250 0.005257 -0.001302 -0.000919 0.004171 -0.000515 
+-0.001913 0.002549 0.000363 -0.004212 0.000595 0.000467 
+-0.004747 -0.003673 0.000086 -0.002222 -0.004630 -0.001111 
+-0.003129 -0.003838 -0.000047 -0.006101 -0.002076 -0.001541 
+-0.005095 -0.001710 -0.001872 -0.000393 -0.000858 -0.000254 
+0.004364 0.002120 -0.001562 0.002857 0.002615 0.000665 
+-0.002120 0.002887 -0.000090 -0.002826 0.004144 -0.000715 
+-0.002116 0.000273 -0.002049 0.003301 0.003523 -0.004287 
+0.001964 0.002607 -0.004143 0.001615 0.000839 -0.003272 
+0.001903 -0.001014 -0.002370 0.003421 0.001349 -0.000268 
+0.002985 0.003125 0.000781 0.001985 0.002295 0.000108 
+0.001411 0.001773 -0.000707 0.004254 0.002018 -0.002210 
+0.000596 0.000085 0.000588 0.003769 0.006208 -0.001641 
+0.001786 0.009531 -0.008292 0.000223 0.005199 -0.005839 
+-0.001875 -0.013750 0.016250 -0.006380 -0.055765 -0.060997 
+-0.012475 -0.013014 -0.018066 0.002025 0.000212 0.007339 
+-0.009463 0.006901 0.006409 0.003383 0.018349 0.009117 
+0.015118 -0.016471 0.045353 -0.023784 -0.090143 0.038025 
+0.014423 -0.029808 -0.018269 0.049697 0.041970 -0.002576 
+-0.017143 0.022857 -0.025714 -0.004293 -0.026768 -0.025707 
+0.052308 -0.021667 -0.034872 0.052268 -0.025278 -0.018278 
+-0.003372 -0.025925 0.018970 -0.006387 0.001597 0.097143 
+0.025338 0.032703 0.095653 -0.043091 0.027636 0.056364 
+0.002593 -0.013769 -0.007576 -0.008385 -0.036657 0.003154 
+-0.033124 -0.022616 -0.005140 -0.021066 -0.006154 -0.024897 
+0.031450 -0.020395 -0.025880 0.018419 0.002125 -0.004726 
+0.007273 -0.015455 -0.005455 -0.008611 -0.004139 -0.029806 
+0.072234 0.088316 0.013387 -0.023565 0.007239 0.044717 
+0.011233 0.003089 0.014824 0.006898 -0.003490 0.001585 
+0.010047 -0.004212 0.002929 0.003434 -0.002985 0.002042 
+-0.003525 -0.005217 -0.002891 -0.005976 -0.004622 -0.001004 
+-0.000195 -0.007779 -0.001253 -0.004119 -0.005707 -0.000369 
+-0.006984 -0.000698 0.001397 -0.003070 0.005903 -0.001772 
+-0.000944 0.006495 -0.007918 0.002919 0.001428 -0.008406 
+0.002774 0.000616 -0.004945 0.000331 0.002234 -0.002873 
+0.000498 0.003431 -0.003342 0.002845 0.000922 -0.006457 
+0.004544 0.002528 -0.008929 0.004900 -0.000840 -0.003709 
+-0.000261 0.000718 0.000103 -0.000390 0.000424 0.000109 
+0.001453 -0.001262 0.000349 0.000013 -0.000187 -0.000010 
+0.003299 0.005296 -0.002547 0.002137 0.001572 -0.003571 
+-0.002487 0.002184 -0.000561 -0.001952 0.002358 0.001708 
+-0.006182 -0.002327 0.002991 -0.008910 -0.003507 0.000190 
+-0.005521 -0.006027 0.002284 -0.000094 -0.000578 0.000760 
+0.004144 0.004076 -0.003397 0.000870 -0.003846 -0.004548 
+0.000212 -0.001937 -0.004418 0.000841 0.000093 -0.001495 
+0.001627 -0.000419 0.000232 0.000925 0.002657 -0.002417 
+0.000468 0.000381 0.000067 0.000364 0.000888 0.000609 
+0.002379 0.002495 0.000404 0.004237 0.003893 0.000246 
+0.002161 0.005000 -0.002468 0.000904 0.002979 -0.001600 
+0.000916 -0.000712 0.001322 0.003032 -0.000986 0.003288 
+0.004754 0.004568 -0.001492 0.001229 0.000205 -0.001667 
+-0.000718 -0.000740 0.000388 -0.008237 -0.010540 0.005577 
+-0.007896 -0.009412 0.005153 0.002611 0.007389 -0.009556 
+-0.010494 0.036606 0.008663 -0.016166 0.006775 0.043504 
+-0.025267 0.001203 0.100000 -0.015204 -0.004914 0.124699 
+-0.028747 -0.022757 0.108396 -0.020083 -0.097733 -0.000383 
+-0.005641 -0.064590 -0.026231 -0.085385 0.000000 0.042308 
+0.000000 0.000000 0.000000 0.068462 0.038914 -0.023348 
+0.054333 0.032367 -0.043433 0.072833 0.015817 -0.054283 
+0.012000 0.090000 0.004000 0.075556 0.128889 0.000000 
+0.034286 -0.012857 -0.004286 0.047286 -0.070429 -0.025143 
+0.003267 -0.032673 -0.061765 -0.023735 -0.028724 -0.037041 
+-0.027470 -0.016160 -0.006961 0.001930 0.001895 0.003997 
+0.041380 0.052698 -0.007073 0.040741 0.040741 0.016296 
+0.000000 0.010833 -0.028333 -0.000582 0.016243 -0.067884 
+0.018677 -0.001698 -0.044286 0.009797 -0.000932 0.009475 
+-0.004611 0.004471 -0.001507 -0.002055 0.011552 0.005095 
+-0.001609 0.002497 0.007470 -0.000686 -0.005992 0.009540 
+0.005544 -0.007646 0.003059 0.001819 -0.006011 -0.000729 
+-0.000666 -0.002182 0.000235 -0.006240 -0.001190 0.002058 
+-0.004514 0.001015 -0.000658 -0.000320 0.002559 -0.007998 
+0.000514 0.002512 -0.005929 -0.001424 0.001224 0.000533 
+-0.001072 -0.000144 0.002941 0.000689 -0.002274 0.003169 
+0.002616 -0.000525 0.000914 -0.000565 0.001881 0.001424 
+-0.003493 0.001733 0.002700 -0.004636 -0.000828 0.003100 
+-0.003540 -0.003643 -0.002251 0.000694 -0.004830 -0.001967 
+0.000423 -0.002745 0.000608 0.002130 0.000564 -0.000493 
+-0.002071 -0.000293 0.001223 -0.006409 -0.001100 0.004029 
+-0.008378 -0.002486 -0.000829 -0.003801 -0.000862 -0.000639 
+0.001366 0.000634 -0.000061 0.001946 0.000704 -0.001615 
+0.000314 0.001583 -0.000630 -0.001244 0.004624 -0.000966 
+-0.002160 0.006335 -0.004291 0.001220 0.004163 -0.007415 
+0.003161 0.001677 -0.003004 -0.000727 0.000727 0.001364 
+-0.002966 0.002778 -0.001887 -0.003741 0.006416 -0.001698 
+0.005923 0.003241 -0.000868 0.006558 0.000433 -0.006997 
+0.001332 0.000338 -0.001494 -0.001178 0.001187 0.003211 
+-0.003821 -0.000248 0.001834 -0.001076 -0.001293 -0.002066 
+-0.002752 -0.003449 -0.000485 -0.000125 -0.002516 0.001626 
+0.001622 -0.001842 0.001822 -0.000907 -0.005867 -0.000453 
+0.001456 -0.008515 0.001017 -0.004322 -0.006621 -0.004775 
+0.003644 0.007910 -0.018440 0.008139 0.023770 -0.031046 
+0.016413 -0.049238 0.082063 -0.143856 -0.157451 0.066078 
+-0.008114 0.010614 -0.005351 0.103880 0.087849 -0.049268 
+0.004000 0.015000 0.015000 0.050909 0.010976 0.008780 
+0.101167 0.039333 -0.179833 0.027879 0.014747 -0.072121 
+-0.062857 -0.015857 0.047571 0.020370 0.013148 0.015741 
+0.098182 0.008252 -0.012378 0.098000 0.066667 -0.130667 
+0.092381 0.076667 -0.169048 -0.022222 0.028730 -0.039841 
+-0.003654 0.002260 -0.007837 0.004156 0.006649 0.009143 
+-0.012949 -0.007179 0.001410 -0.033462 0.001868 -0.016758 
+-0.042857 -0.020000 -0.017143 -0.039355 -0.037704 0.001032 
+-0.026192 -0.038854 0.000433 -0.008634 -0.014499 -0.032419 
+0.059091 0.009636 -0.019273 -0.009277 0.010204 0.014843 
+-0.001961 0.009804 0.006863 0.010812 0.001204 0.011188 
+0.002821 -0.006521 0.000144 0.001429 -0.010595 0.008929 
+-0.009592 -0.016939 0.014082 -0.008183 -0.009768 0.011088 
+0.001810 -0.001021 0.002381 0.004540 0.002342 -0.003477 
+-0.001420 -0.001435 0.000229 -0.011086 -0.006164 0.000271 
+-0.008120 -0.003500 -0.009460 0.001244 0.001148 -0.010179 
+0.001562 0.001886 -0.006734 0.000878 0.001762 -0.004022 
+-0.000117 0.002350 -0.002711 -0.002030 0.001617 -0.002684 
+0.000705 0.000866 -0.001672 0.001199 -0.000381 0.000984 
+0.001652 -0.001652 0.001652 0.001735 -0.000987 0.000136 
+-0.000798 -0.000881 -0.002194 -0.004364 -0.002532 -0.002762 
+-0.004119 -0.003242 -0.001234 -0.002950 -0.001298 -0.001386 
+-0.000464 0.000018 -0.000690 -0.001947 0.001068 -0.001656 
+-0.007180 -0.002467 -0.000224 -0.004388 -0.004199 0.002392 
+-0.000877 -0.001316 0.000877 0.001980 0.003711 -0.002969 
+0.004863 0.006288 0.000238 0.001705 -0.002489 -0.002620 
+-0.001701 -0.002489 -0.007104 -0.003045 0.000010 -0.008094 
+-0.001976 -0.001381 -0.005428 0.009304 0.003867 -0.000141 
+0.004638 0.010944 -0.005539 0.002094 0.002871 -0.004995 
+0.003245 0.002901 -0.003225 0.005551 0.004276 -0.001510 
+0.005773 0.004137 -0.000182 0.000672 0.002523 0.000662 
+-0.004857 -0.000873 0.002597 -0.004737 -0.000802 -0.001250 
+-0.000776 -0.001324 -0.000194 0.002213 0.003856 -0.000074 
+0.002031 0.005271 -0.000617 -0.000989 0.001212 -0.001413 
+-0.006237 -0.001475 0.000486 -0.003675 -0.003660 -0.001579 
+-0.004665 -0.003246 -0.002578 -0.008007 -0.010879 0.006024 
+-0.023813 -0.045042 0.053564 -0.050935 -0.033022 0.051336 
+-0.050218 0.059435 -0.033134 0.018954 0.046645 0.000851 
+0.026250 0.051667 0.011250 0.027270 0.055172 -0.028218 
+0.019079 0.028388 0.002138 0.060000 0.012500 0.047500 
+-0.022222 0.033611 0.055278 0.005125 0.023750 0.015375 
+-0.031111 0.071538 -0.047692 -0.017672 0.082414 -0.031379 
+0.097154 0.054538 0.016615 -0.036494 0.055351 0.021377 
+-0.020660 -0.004745 -0.010764 -0.014000 -0.035455 -0.002000 
+0.006364 -0.065455 0.000000 0.000000 -0.039091 -0.019091 
+-0.048866 0.037288 0.013894 -0.024261 -0.010431 0.039681 
+-0.005682 -0.002858 0.042904 -0.009127 0.000136 0.004870 
+0.035238 0.062619 -0.054762 0.074670 0.091264 -0.066374 
+0.051844 0.034416 -0.040078 -0.014346 -0.015949 0.000564 
+-0.004134 -0.004336 -0.001989 0.002866 0.006072 -0.001289 
+0.008750 -0.000482 -0.004335 0.005339 0.000613 -0.001954 
+0.000930 0.003721 -0.003488 -0.000732 0.001179 -0.000975 
+0.000660 -0.000950 -0.000505 -0.004380 -0.003470 -0.000656 
+0.000157 0.001066 0.003364 -0.001864 -0.004157 0.010598 
+-0.001477 -0.004201 0.006763 0.000136 -0.001894 0.001209 
+0.001219 0.000460 -0.001576 -0.001739 -0.000614 -0.002455 
+-0.003332 -0.000618 -0.000375 -0.002328 0.000101 0.000406 
+0.000293 -0.000256 -0.000272 -0.000561 0.000447 -0.001688 
+-0.001423 0.002879 -0.001655 -0.000006 0.002149 0.000803 
+0.004137 0.000005 -0.001766 0.001998 -0.000025 -0.002454 
+-0.001097 -0.002151 -0.000886 -0.005514 0.002594 -0.002223 
+-0.005330 0.002791 -0.005751 -0.003256 0.001350 -0.003413 
+-0.000137 0.000853 0.001225 -0.001113 -0.001152 0.002273 
+0.002031 0.002136 -0.001002 0.003118 0.006970 -0.001284 
+0.001019 0.005405 0.000679 -0.000440 -0.000912 -0.001006 
+0.003123 -0.004186 -0.001475 0.002377 0.000504 -0.006172 
+0.000684 0.000946 -0.005180 0.004667 0.001228 -0.005035 
+0.003027 0.004046 -0.000003 0.004799 0.000779 0.000578 
+0.007424 0.000485 -0.002232 0.005631 0.000351 -0.001728 
+0.004156 -0.000774 -0.001970 0.006866 -0.000729 -0.004449 
+0.007868 -0.000660 0.000457 0.003373 0.003608 0.000124 
+0.001241 -0.000411 0.001445 0.001251 -0.002641 0.003280 
+0.002048 -0.000504 0.002359 0.000254 0.002119 -0.001752 
+-0.002614 0.002197 -0.001604 0.001227 0.002774 0.003748 
+0.007776 0.010766 0.007179 0.017667 0.023333 0.018000 
+0.054429 0.038571 -0.018143 0.067068 0.072000 0.025151 
+0.023623 -0.007094 0.014566 -0.017143 -0.059571 -0.008714 
+-0.053684 -0.056982 0.009895 -0.022509 -0.043273 0.058800 
+0.037083 -0.020417 0.094583 0.023838 -0.024949 0.016263 
+-0.009387 -0.065556 0.003755 -0.138509 -0.041304 -0.027640 
+-0.068113 0.035072 -0.038887 0.104769 0.040000 0.034923 
+0.096568 0.045306 -0.054842 0.012967 0.014785 0.005046 
+-0.016612 -0.011686 -0.017136 -0.002857 -0.017857 -0.020714 
+-0.012378 0.008182 0.002192 -0.014594 0.018809 0.024792 
+0.000195 0.009325 0.017060 0.003568 0.006374 0.008754 
+0.049304 0.028168 -0.031685 0.057014 0.041629 -0.073982 
+0.071359 0.073876 -0.028170 -0.016387 0.034567 -0.000595 
+-0.009267 0.015359 -0.002920 -0.005121 0.007936 -0.001683 
+-0.003416 0.000932 -0.009727 0.002489 0.002533 -0.013556 
+0.002484 -0.001933 -0.001034 -0.005618 -0.011263 0.005626 
+-0.004939 -0.013771 0.002409 -0.001735 -0.001123 0.007252 
+0.002864 -0.002853 0.002644 0.001016 -0.002231 0.001764 
+-0.000695 -0.003201 0.004409 -0.003757 -0.004226 0.004195 
+-0.000227 -0.000571 -0.000386 0.002282 -0.002477 0.001480 
+0.001766 -0.003860 0.000065 0.008288 -0.001537 -0.007987 
+0.002086 0.002023 -0.008595 0.002207 -0.000090 -0.002207 
+-0.002818 -0.001596 -0.000698 -0.001894 -0.001772 -0.000910 
+-0.000619 0.001202 -0.000430 0.005481 0.002602 -0.001858 
+0.004834 0.003084 -0.003250 0.002340 0.000477 -0.001094 
+0.000154 -0.003411 0.001440 -0.002189 -0.006327 0.003178 
+-0.003218 -0.007692 0.003850 -0.002588 -0.007314 0.003644 
+-0.001653 -0.004779 0.002731 -0.001511 -0.002850 -0.002196 
+-0.000438 0.000087 -0.006474 -0.000147 0.005698 -0.007190 
+0.005772 0.006822 -0.008134 -0.001521 0.006110 -0.004615 
+-0.000187 0.004000 -0.001120 0.000169 -0.000306 -0.000092 
+0.001532 -0.001422 0.001367 0.002464 -0.001700 0.001567 
+-0.000565 0.000236 -0.000191 -0.004609 0.002627 0.000403 
+-0.001683 -0.000366 -0.000548 0.003343 0.005950 -0.008044 
+0.001081 0.003818 -0.008104 0.002130 0.000169 -0.000639 
+-0.003250 -0.000541 -0.003033 -0.002772 0.002874 -0.005151 
+-0.000645 0.008638 -0.007375 0.001178 0.011490 -0.005518 
+0.002643 0.006345 -0.006043 0.003046 0.003896 -0.004159 
+0.001659 0.003580 -0.009229 0.007034 0.011472 -0.011905 
+0.036827 0.025967 0.004671 -0.027686 0.016271 0.000350 
+-0.015259 0.008140 -0.002487 -0.026203 0.002032 0.029251 
+-0.061515 -0.001667 0.114697 -0.056984 -0.021825 0.118810 
+0.000000 -0.002857 0.040000 -0.005378 -0.068908 0.042353 
+0.049144 -0.042623 -0.003843 0.071407 -0.012337 -0.019814 
+0.081000 0.081000 -0.064000 0.076119 0.016119 -0.039531 
+-0.080470 -0.137143 -0.030176 -0.017957 -0.060313 -0.028497 
+-0.005818 -0.017257 -0.018167 0.002405 -0.017486 -0.004348 
+0.006183 0.004792 0.009790 0.006129 0.003360 0.004724 
+0.003523 0.004750 0.002822 0.003558 0.004749 0.003038 
+-0.003621 -0.000096 0.000111 -0.007426 -0.005116 0.001378 
+-0.008399 -0.009567 0.003179 -0.002965 -0.007971 0.003729 
+0.005727 -0.002348 0.002196 0.005213 0.000071 0.000938 
+-0.013029 -0.001418 -0.002430 -0.033132 0.007710 -0.014078 
+-0.012578 0.025556 0.002903 -0.006493 -0.010882 0.004525 
+0.002789 0.011220 -0.012159 0.021294 0.016112 -0.030184 
+0.010561 0.024014 -0.061257 0.025972 -0.004579 -0.050391 
+0.034286 -0.041429 -0.035000 0.002639 -0.022361 -0.004931 
+0.005495 0.001374 -0.004670 -0.012778 -0.036944 -0.030556 
+-0.020245 -0.051422 0.020784 -0.107206 0.079000 0.064324 
+-0.047160 -0.101605 0.029753 0.098889 -0.052222 -0.151111 
+-0.049242 -0.012424 -0.024394 0.055882 -0.052118 -0.002824 
+0.024013 0.093092 -0.051645 -0.013333 0.028095 0.014762 
+0.008341 0.019878 0.042122 -0.012933 0.010187 -0.007973 
+0.000346 0.040864 -0.039136 -0.017568 0.024595 -0.041000 
+-0.035000 0.077500 -0.030000 -0.039259 0.089815 0.011296 
+-0.020278 0.041111 0.001111 -0.011197 0.002650 -0.002137 
+-0.016640 0.013927 0.008381 -0.021429 0.003571 0.017857 
+-0.027681 -0.012650 0.027867 0.003982 -0.002896 0.008326 
+-0.004667 -0.007333 -0.002667 0.015308 -0.027815 0.013816 
+0.009026 -0.006466 0.002493 0.040491 0.036305 -0.026537 
+0.028240 0.073267 -0.069120 -0.011020 -0.053367 0.014388 
+-0.093636 0.023636 0.039091 0.026154 0.133750 -0.039231 
+-0.071250 0.109423 -0.164135 -0.056250 0.048750 -0.048750 
+-0.020833 0.018333 -0.019583 -0.043696 -0.013348 -0.032783 
+0.169565 -0.006522 -0.110870 -0.006566 0.031094 -0.017623 
+-0.016832 -0.053278 0.011125 -0.000615 -0.006060 -0.024676 
+0.009686 0.018296 -0.029286 0.010126 0.005504 -0.019370 
+0.000834 0.005557 -0.015653 0.001067 -0.004580 -0.016942 
+-0.007552 0.007187 -0.009379 -0.004338 0.001288 -0.000036 
+-0.000807 0.000767 0.002238 0.002300 -0.000626 0.002429 
+0.002401 0.001563 0.003238 -0.000690 0.004593 0.000346 
+-0.000491 0.012854 -0.010725 0.022449 0.007551 -0.005960 
+-0.000991 0.004446 -0.009812 0.006211 0.013702 -0.007269 
+0.007473 0.008261 -0.011038 -0.005735 -0.001078 -0.001220 
+0.005427 -0.000726 0.003291 -0.003457 -0.013976 0.015546 
+-0.001691 -0.003151 0.009278 0.002942 -0.010917 0.011271 
+-0.014323 -0.044578 0.017349 0.003620 -0.035831 0.011716 
+0.003309 0.005683 -0.002674 0.001106 0.001954 -0.000674 
+-0.002950 -0.005558 0.001932 -0.006956 -0.011840 0.004176 
+-0.008102 -0.007850 0.002002 -0.009208 0.001662 -0.003031 
+-0.014618 0.006695 -0.007661 -0.016125 0.008177 -0.009168 
+0.000985 0.006745 -0.004628 0.024479 0.002022 0.011637 
+-0.053333 0.013333 -0.013333 -0.063262 0.018395 -0.011340 
+0.163020 0.079930 -0.040558 0.138000 0.115585 0.031523 
+0.004528 0.005097 0.008264 0.015832 0.005909 -0.009350 
+-0.032143 -0.002143 0.027857 -0.037565 -0.047338 0.006006 
+0.015714 -0.030779 -0.001299 -0.037500 0.050000 -0.062500 
+-0.010133 0.018667 -0.015733 0.124286 0.023297 -0.034945 
+0.083556 0.019556 0.017778 0.052070 0.042985 -0.032571 
+-0.020905 0.039524 -0.022048 0.013860 0.011954 -0.040756 
+0.017000 -0.002429 -0.054286 0.060595 0.035595 -0.048095 
+0.048036 0.024150 -0.120289 0.076749 0.084975 -0.100049 
+0.054444 -0.061111 -0.047778 -0.034067 -0.115024 -0.013493 
+-0.063209 0.018179 -0.020791 -0.016642 -0.003968 0.009535 
+-0.039693 -0.046429 0.042180 -0.033916 -0.030699 0.012867 
+0.003778 0.004889 0.003111 -0.006145 0.050832 -0.004469 
+0.010049 -0.006029 0.031667 0.029020 -0.033526 0.038213 
+0.008951 -0.015213 0.013574 0.036591 -0.005227 -0.015909 
+0.007243 0.012835 0.009880 -0.005275 -0.000527 0.024791 
+0.001345 0.008655 0.021930 -0.007912 0.068407 -0.033352 
+-0.052800 0.060000 -0.039600 -0.017162 -0.085000 -0.102973 
+0.019213 0.076256 -0.055254 -0.019985 0.022183 -0.025480 
+0.003691 0.002901 0.006994 0.004663 0.004454 0.025888 
+-0.011265 -0.033316 0.022393 0.002393 -0.004466 -0.003010 
+0.001093 -0.005855 -0.001112 -0.006058 -0.012530 -0.003421 
+-0.005510 -0.001188 -0.016245 -0.001816 -0.009183 -0.018669 
+0.004004 0.000708 -0.011959 -0.001473 0.002216 -0.002561 
+0.000471 -0.000126 0.000915 0.004211 -0.000829 0.000641 
+0.002732 0.003476 -0.002942 0.001144 -0.005083 0.003994 
+-0.000353 -0.001186 0.011892 0.011107 -0.000779 -0.021633 
+0.015066 0.012010 0.002481 0.007911 -0.002577 -0.001161 
+-0.010800 -0.015097 -0.003174 -0.002666 -0.003285 -0.006929 
+-0.000288 -0.000192 -0.006000 -0.004299 0.000262 -0.008032 
+-0.000466 -0.012791 0.000560 0.002846 -0.014206 -0.002031 
+-0.002800 -0.012000 0.008000 -0.013952 -0.029651 0.015890 
+0.009025 0.004155 -0.002084 0.006241 0.003310 0.000347 
+0.001908 0.000845 0.000587 0.000214 0.001504 -0.000729 
+0.001452 0.009916 -0.004758 0.002092 0.016043 -0.007385 
+-0.004374 0.009041 -0.004774 -0.008372 -0.002600 0.001107 
+-0.004217 -0.009664 0.005996 0.008203 -0.005903 0.010097 
+0.022392 0.010583 0.002058 0.034971 0.016046 -0.010729 
+0.145055 -0.137953 0.027625 -0.040467 -0.021572 -0.009034 
+-0.066788 -0.017879 0.016303 -0.035758 -0.012121 -0.047879 
+-0.081341 -0.028227 -0.004666 -0.061807 -0.031680 -0.003450 
+-0.090050 -0.024644 0.013107 -0.045181 -0.005043 0.037071 
+-0.152500 -0.036879 0.052685 -0.065942 0.034783 0.010870 
+-0.016190 0.073333 0.044762 -0.001172 0.046759 0.035655 
+0.014109 0.027132 -0.050465 0.011470 0.006926 -0.028277 
+-0.018062 -0.005017 -0.022076 0.003234 -0.022598 -0.046287 
+0.011078 0.018464 -0.068889 0.102232 0.045446 -0.119286 
+0.082000 -0.068400 -0.034200 0.061250 -0.061250 -0.147500 
+0.008649 0.096312 -0.086026 -0.009130 0.047391 -0.025217 
+0.059519 0.072148 -0.015155 0.033058 0.040093 -0.009151 
+0.119790 0.037238 -0.042622 0.007262 -0.002857 0.005952 
+0.006349 0.002559 0.013054 0.007863 -0.012353 -0.000786 
+-0.003014 -0.048856 0.062201 -0.001912 -0.000120 -0.052857 
+-0.043315 -0.003114 -0.080685 -0.014231 0.014231 -0.058462 
+-0.013333 -0.016970 -0.035152 0.000000 -0.032222 0.014444 
+-0.031875 0.019375 0.022500 -0.023611 -0.018889 0.009444 
+0.068098 0.026304 -0.046467 -0.007451 -0.016040 0.012053 
+-0.028850 -0.020507 0.054483 -0.059443 -0.055954 0.021872 
+-0.005281 -0.016580 -0.035801 0.005370 -0.011204 -0.007940 
+0.003197 -0.014362 0.000152 -0.004625 -0.015208 0.010112 
+0.009879 0.009891 -0.020590 0.010216 -0.020735 -0.097960 
+0.002106 -0.013193 -0.020618 0.000044 -0.002091 0.001045 
+0.000106 -0.000394 0.000560 0.001138 -0.001219 0.000034 
+-0.001119 -0.001784 0.008491 0.001770 -0.004353 0.018682 
+0.011355 -0.012324 0.018659 0.002853 0.002272 0.017296 
+-0.007505 0.004495 0.012040 -0.002273 -0.006818 0.000000 
+0.001498 -0.000936 -0.004762 0.000586 0.003355 -0.001493 
+-0.003931 -0.003920 0.002014 -0.005214 0.002123 -0.001384 
+0.002391 0.008257 0.000316 0.008600 0.007894 0.008506 
+-0.000197 0.019807 0.045559 -0.034120 -0.011511 0.007091 
+0.001657 0.000517 0.000338 0.004084 -0.000649 -0.001598 
+0.003182 -0.001900 -0.001052 0.001246 -0.003912 0.000455 
+0.000983 -0.002054 0.000926 0.001654 0.002967 -0.000764 
+-0.000448 0.003293 -0.001202 -0.004784 -0.002337 0.001058 
+-0.004835 -0.007211 0.003552 -0.001202 -0.005803 0.003809 
+0.000996 0.001035 -0.000057 0.005674 0.009603 -0.006852 
+0.011036 0.030995 0.079600 -0.029986 0.057154 0.004587 
+-0.053399 -0.093697 0.078987 0.000238 -0.098810 -0.049048 
+-0.080507 -0.103074 -0.063818 -0.018093 -0.010247 -0.014884 
+-0.008090 -0.008964 -0.008660 0.000067 -0.003731 -0.009761 
+-0.016264 -0.012340 0.018711 -0.036818 -0.023668 0.040000 
+-0.042118 -0.053882 0.041176 -0.012491 -0.077528 0.062884 
+-0.057260 -0.013430 0.090200 -0.040337 -0.032669 -0.151124 
+-0.052999 -0.041035 -0.050340 -0.018204 -0.032014 -0.003273 
+0.002691 -0.035786 -0.013158 0.014140 -0.007246 -0.042246 
+0.019549 -0.026926 -0.027787 -0.014298 0.000702 -0.040789 
+0.049333 -0.037333 0.086667 0.110000 -0.008800 0.026400 
+0.124667 0.081333 -0.043333 0.005763 0.003245 0.030605 
+0.009463 -0.022907 0.031574 -0.033950 -0.048571 -0.008487 
+0.001429 -0.031429 0.000000 0.055194 0.006932 -0.020131 
+0.004267 -0.005833 0.004967 -0.025933 -0.025133 -0.035667 
+-0.156512 -0.084917 0.042957 -0.157172 0.035051 0.040707 
+-0.049375 0.046250 -0.049375 -0.020000 -0.029451 0.044176 
+0.064143 -0.096179 0.070536 -0.002978 -0.000221 -0.003272 
+0.012345 0.026759 -0.064828 0.000000 -0.075833 0.010833 
+-0.040250 -0.048300 0.018947 -0.006159 -0.018473 0.009580 
+0.005182 0.025545 0.008182 -0.008947 0.035789 0.003158 
+0.002272 0.019766 -0.009448 0.000537 0.010895 -0.006730 
+0.014709 0.014021 -0.015661 -0.007072 0.021718 -0.022981 
+-0.004951 0.001482 0.009335 -0.002180 0.005043 0.004692 
+0.001709 0.002965 0.000796 0.003384 0.000037 0.003443 
+0.001460 -0.001933 -0.001057 -0.013114 0.018716 0.005003 
+-0.055280 0.027608 0.016961 -0.009870 0.009538 -0.005472 
+-0.012760 0.017162 0.001045 -0.020272 0.004150 0.009099 
+-0.022279 -0.008452 0.017030 -0.010445 -0.009663 0.012797 
+0.003850 0.008186 -0.000876 -0.000317 0.001151 0.000257 
+-0.001691 -0.014038 -0.007273 0.008476 -0.031519 -0.006438 
+0.011993 -0.013792 0.046775 0.011305 -0.008646 -0.003769 
+0.001140 0.000886 0.000088 0.000564 -0.000246 0.002799 
+0.000700 -0.003186 -0.000209 -0.003474 -0.002261 -0.001139 
+-0.006451 -0.001343 -0.001435 -0.005384 -0.001240 -0.000908 
+-0.001697 -0.001797 0.000533 -0.000319 -0.002758 0.000958 
+-0.000851 -0.002725 0.000807 -0.001775 -0.003880 -0.000710 
+-0.005596 -0.008634 0.002529 -0.014722 -0.006409 0.003197 
+-0.009768 -0.003465 -0.003811 -0.003992 -0.001880 -0.005393 
+-0.002357 -0.096650 -0.093350 0.007249 -0.018995 -0.065979 
+-0.008658 -0.010763 -0.039895 0.014569 -0.044584 0.006443 
+0.007251 -0.004230 0.006757 0.014730 -0.002898 0.003158 
+0.004935 -0.017077 0.025506 0.010756 -0.022694 0.011530 
+0.008673 -0.009581 0.004207 -0.048586 -0.007980 0.080505 
+-0.036345 -0.010347 0.079248 -0.020620 0.000916 0.012380 
+-0.030367 -0.022265 0.010128 0.021180 -0.005802 -0.041685 
+0.009652 -0.003727 -0.075687 0.010505 0.000354 -0.083687 
+0.046000 0.023000 -0.020000 0.091524 -0.084952 -0.156762 
+0.009524 0.002381 0.004762 -0.025079 0.030794 0.013968 
+-0.105000 0.031500 -0.010500 0.032157 -0.033557 0.007003 
+-0.008199 -0.058889 0.020498 -0.022544 -0.020789 0.005263 
+0.007333 0.002000 -0.005333 0.005869 0.014286 -0.035212 
+0.011746 0.005238 -0.036508 -0.028171 0.029714 0.064057 
+-0.073283 0.101717 0.113737 -0.080977 -0.093496 0.066504 
+-0.024427 -0.144348 0.093281 -0.033667 -0.108333 0.101000 
+0.076667 -0.195333 0.237333 0.016071 -0.123214 -0.030357 
+-0.013318 -0.085089 -0.100626 -0.016869 -0.038384 0.002323 
+-0.013043 -0.008735 0.011368 -0.038452 -0.038810 0.015595 
+0.006980 -0.005796 0.006531 0.014365 0.009846 0.003712 
+-0.004516 0.001440 -0.002008 0.016360 0.019794 -0.031187 
+-0.021735 -0.019195 -0.006887 -0.006900 -0.014540 0.012500 
+0.002999 -0.000019 -0.003361 -0.001605 -0.002691 0.001788 
+-0.004904 -0.000663 0.000708 0.005730 -0.001065 0.003935 
+0.013004 -0.017032 0.005114 0.009900 0.020500 0.000800 
+-0.006622 0.012827 0.001465 -0.009318 -0.001277 -0.001144 
+-0.006078 -0.008609 0.002215 -0.010769 -0.014410 -0.004238 
+-0.018352 -0.016307 0.003210 -0.009839 -0.007411 0.000999 
+-0.003883 0.013602 -0.002706 -0.001739 0.022993 -0.006146 
+-0.006240 0.006071 -0.004646 0.004591 -0.018909 0.005727 
+0.017135 -0.028187 -0.008830 0.013944 -0.020086 -0.002822 
+0.000198 0.000062 0.001376 0.000371 0.000996 -0.001532 
+-0.000730 0.003861 -0.004352 -0.003055 0.003892 -0.003974 
+-0.002423 -0.000319 -0.000562 -0.001513 -0.003610 0.000765 
+-0.000018 -0.005358 0.001595 -0.000036 -0.005466 -0.002270 
+-0.000794 -0.002003 -0.004614 -0.003124 0.002062 -0.002892 
+-0.005642 0.001971 0.000359 -0.002845 0.000595 0.000541 
+0.001777 -0.000322 -0.003788 -0.000034 0.001042 -0.006493 
+0.000046 0.003476 -0.010036 -0.009007 0.000157 -0.011185 
+-0.008286 -0.001032 0.030016 -0.010709 0.002445 -0.000526 
+-0.012274 -0.020002 -0.006052 -0.017437 -0.009590 0.034439 
+-0.006649 0.007325 0.033354 0.004972 0.021222 0.037188 
+-0.010845 0.061319 0.021042 -0.002366 -0.029224 0.013547 
+0.005277 -0.018097 0.009032 -0.010376 -0.014986 0.024213 
+-0.010852 -0.017791 0.042401 -0.007267 -0.017333 0.021800 
+0.011111 0.060556 -0.041389 0.036542 0.015649 0.007444 
+0.013690 0.003095 0.003452 -0.016851 -0.007189 -0.013554 
+-0.021396 -0.002943 0.040646 0.013950 0.028908 0.074790 
+-0.079167 0.091667 -0.005833 -0.039650 0.083508 -0.016831 
+0.008294 0.092936 -0.019087 -0.020000 -0.008000 0.004000 
+-0.009738 -0.006119 0.015357 0.012857 0.024176 -0.004835 
+0.012778 0.031389 0.018611 -0.071364 0.050000 -0.009545 
+-0.056699 0.028278 -0.047177 0.035238 -0.084286 0.108810 
+0.000000 -0.147000 0.061000 -0.070000 -0.070000 0.065714 
+-0.060000 0.060000 -0.060000 -0.122643 0.074024 0.060774 
+-0.043636 -0.026364 0.026364 -0.128889 0.067667 0.022556 
+0.029174 0.012397 -0.075124 0.020172 0.015570 -0.036688 
+-0.006111 0.006111 0.002778 0.002004 0.016647 0.034643 
+-0.013429 0.026857 0.067143 -0.035644 0.004869 -0.026065 
+0.002909 -0.006099 0.033302 -0.009121 -0.024478 0.033164 
+-0.005591 -0.019404 0.012516 -0.002933 -0.009509 0.001027 
+0.002497 -0.001946 -0.000443 0.002883 -0.001712 0.001513 
+-0.005224 0.010757 -0.020920 0.028900 -0.041133 -0.008603 
+-0.003284 -0.027420 0.000200 -0.005517 -0.016353 0.000818 
+0.001497 -0.012330 0.020565 0.009733 -0.019555 0.015479 
+-0.013876 -0.017622 -0.004086 -0.013750 -0.014628 0.000096 
+0.003540 -0.007660 -0.008071 0.005007 -0.005708 0.000073 
+-0.005288 0.013973 -0.007069 0.038106 0.009621 -0.014242 
+0.008539 -0.000441 0.004122 0.006460 -0.001818 -0.000690 
+0.003290 0.002925 0.000034 0.001188 0.002529 0.000710 
+-0.002715 0.003920 -0.003619 -0.002094 0.000975 -0.006315 
+-0.002037 0.000049 -0.003293 -0.002212 0.000042 -0.000057 
+-0.000383 -0.000522 0.000243 0.000856 -0.000841 0.001996 
+0.001271 -0.001389 0.001888 -0.000235 -0.000250 0.000080 
+-0.000080 0.006644 -0.000757 0.001225 0.007490 0.001535 
+0.006819 0.006053 -0.002038 0.004669 0.006894 -0.005861 
+0.003980 0.012274 -0.009650 0.000984 0.030939 -0.021923 
+0.003692 -0.002731 -0.004077 0.000884 -0.004830 -0.002104 
+-0.016011 -0.005276 0.001159 -0.002137 0.000540 0.006417 
+-0.009647 0.019294 0.010000 -0.048406 -0.005385 0.043566 
+-0.091616 0.039907 0.037745 -0.007767 0.031572 -0.019544 
+0.019275 0.004105 0.025759 -0.006988 -0.012877 0.014854 
+-0.014742 0.005978 0.002908 -0.020636 0.015524 0.012888 
+-0.001065 -0.010387 0.012677 0.032956 0.082069 -0.057192 
+-0.010649 0.009805 0.040065 -0.080769 -0.018462 0.030769 
+-0.072082 -0.046020 0.052673 -0.033202 -0.055965 0.068289 
+-0.105805 -0.037753 0.025997 -0.085061 -0.010172 0.033170 
+0.025455 0.087273 -0.025455 0.018690 0.036667 -0.060595 
+0.033841 0.051936 -0.019192 -0.039083 -0.041333 -0.011725 
+-0.024311 -0.056248 -0.000130 0.096066 0.010492 0.029180 
+-0.139585 0.038557 -0.002687 0.119024 -0.020236 0.096397 
+0.108052 -0.071429 0.161169 0.002618 -0.125618 0.096176 
+-0.098214 -0.039643 0.030179 -0.017650 0.002393 0.043376 
+-0.036061 0.121515 0.078788 -0.016000 0.026180 0.003740 
+0.019091 0.006364 0.006364 0.030919 -0.048570 0.051512 
+0.049084 0.009470 0.016193 -0.002272 0.003035 -0.003232 
+-0.012154 0.001207 -0.015101 -0.022684 0.016262 -0.009014 
+-0.011222 -0.005109 0.014127 -0.004341 -0.008709 0.006434 
+-0.005689 -0.008624 0.001892 -0.002731 -0.006721 -0.001296 
+-0.001259 -0.003804 -0.002063 -0.005129 -0.000408 -0.004003 
+-0.005148 0.003987 -0.012232 0.015483 -0.022009 -0.010735 
+0.003715 -0.027325 0.006930 0.003596 0.002333 -0.001649 
+0.008252 0.009089 0.000718 0.011429 0.022229 -0.012360 
+0.012301 0.014696 -0.004384 -0.001543 -0.014322 -0.002337 
+-0.009004 -0.004070 -0.003706 0.000779 -0.000989 -0.000506 
+0.005666 -0.001382 0.000431 0.016059 -0.001364 -0.010219 
+0.001835 -0.012388 0.005959 -0.007112 -0.001509 0.004580 
+0.004255 -0.000116 -0.001878 0.002666 -0.001590 -0.002403 
+0.001710 -0.000740 -0.001281 0.000587 0.000405 -0.000984 
+0.001242 0.000733 0.001206 -0.000077 -0.000152 0.002129 
+0.000064 0.000321 0.004048 -0.002616 -0.002975 0.006867 
+-0.004583 -0.005863 0.006099 0.000105 -0.001037 0.004406 
+0.000315 0.000123 -0.000961 0.000333 0.004323 0.000501 
+0.003414 0.005038 -0.001622 0.002679 0.005889 -0.002435 
+0.002008 0.005663 -0.005613 -0.004682 -0.003069 -0.011728 
+-0.016099 -0.002307 0.002898 0.001494 -0.002210 0.002650 
+0.005678 0.007800 -0.000674 0.008689 0.011301 -0.005273 
+0.000582 0.007831 0.001005 -0.026471 0.006235 0.012471 
+-0.029667 -0.000667 0.005000 -0.003116 0.027491 0.003826 
+0.030431 0.023353 -0.016612 0.050711 0.013706 -0.027868 
+0.025292 -0.007461 0.006244 -0.012233 0.032053 0.002080 
+-0.048963 -0.032185 0.026296 0.026689 0.037365 0.020000 
+0.018734 0.035707 0.012010 -0.009333 -0.009333 0.018667 
+-0.001071 0.001071 0.057857 -0.037436 0.015897 -0.002821 
+-0.057692 -0.082833 0.066266 -0.076581 -0.099915 0.061624 
+-0.048776 -0.063316 0.003282 -0.012892 -0.001366 0.004578 
+-0.009761 0.017700 0.002849 -0.011594 -0.010037 -0.005310 
+-0.001067 -0.017333 0.000533 0.017480 -0.015195 0.003598 
+-0.026818 0.000000 -0.007727 -0.013879 -0.012480 0.009387 
+0.006044 0.014945 0.011758 0.032853 0.015529 0.012147 
+0.003586 -0.049552 0.093724 0.019231 0.000679 0.002715 
+-0.033794 -0.021000 -0.056324 0.023214 -0.007321 0.002143 
+-0.031111 0.000000 0.000000 -0.105871 0.006629 -0.039697 
+-0.003312 -0.032138 -0.028557 0.002775 -0.015470 -0.009624 
+-0.011538 -0.012400 0.002308 -0.002137 -0.011545 0.002636 
+-0.003301 -0.019534 0.005844 0.006556 -0.016698 -0.000595 
+0.014808 -0.012502 -0.000925 0.010249 -0.008000 0.000918 
+0.005355 0.000414 0.003140 -0.012992 0.013900 0.007448 
+-0.022737 -0.014248 0.000699 0.004243 -0.014830 0.005050 
+-0.000385 -0.020288 0.004784 0.002819 -0.020971 0.002143 
+-0.009334 0.000399 0.007939 -0.015406 -0.006193 -0.005852 
+-0.013623 -0.003338 -0.013687 -0.005283 0.002871 -0.004219 
+0.005095 0.018061 0.006974 -0.001736 0.026444 0.007538 
+0.012432 0.019946 0.002838 0.029770 0.006482 -0.005012 
+0.014398 0.004908 -0.002959 -0.004778 -0.003111 0.000329 
+-0.000356 -0.000983 0.000339 -0.001375 -0.005206 -0.000318 
+0.000442 0.000896 0.000073 0.004819 0.003424 0.000615 
+-0.000427 0.000265 -0.000279 -0.000104 -0.000129 -0.001461 
+0.001129 -0.001239 0.001025 0.001043 -0.000741 0.000134 
+0.000739 -0.002216 0.000197 0.003331 -0.000207 -0.000862 
+0.002979 0.000918 -0.002512 0.000784 0.002246 -0.000949 
+-0.000010 0.001920 -0.000251 -0.000564 0.000047 0.001255 
+-0.001283 -0.005580 0.002524 0.000900 -0.025218 0.012999 
+0.033821 0.009209 0.109612 -0.004318 -0.022448 0.032978 
+-0.005187 -0.003192 0.008519 0.003984 -0.008620 0.003623 
+0.001093 0.001111 0.004645 -0.024842 0.015363 -0.001634 
+-0.032369 -0.002273 0.012249 0.049643 -0.049643 0.007857 
+0.071178 -0.009182 -0.022635 0.006515 -0.032576 -0.013030 
+-0.052364 -0.056364 0.039273 -0.005789 -0.054136 0.011387 
+0.031687 -0.083183 -0.037782 0.010889 0.021111 0.031556 
+0.012203 -0.061014 0.023636 0.056786 0.018571 0.019643 
+-0.000278 -0.015556 0.016111 -0.055000 -0.043154 0.028769 
+-0.069268 -0.053476 0.001524 0.028435 -0.010574 0.011291 
+0.005687 -0.000585 0.001338 0.037310 0.009024 -0.026334 
+0.012442 -0.007727 -0.021610 0.110400 -0.026800 0.006000 
+0.056052 0.028948 -0.018973 -0.010042 -0.002956 0.015940 
+-0.003697 -0.010330 0.021986 0.012262 0.011190 -0.011548 
+-0.001979 0.067594 -0.014920 0.066825 0.101254 -0.035444 
+0.064228 -0.001199 0.035711 -0.013333 -0.012051 0.018718 
+0.029019 0.101244 0.115861 0.009393 0.016821 -0.008214 
+0.000758 0.027085 -0.075242 -0.040467 -0.006524 -0.057866 
+-0.029349 -0.003077 -0.044024 -0.024047 -0.005397 -0.010173 
+-0.031354 -0.022284 0.017670 -0.001994 -0.018977 0.004688 
+0.009918 -0.013469 -0.002122 0.000632 -0.018255 0.005336 
+-0.005371 -0.015408 0.006277 -0.005329 -0.007506 0.001828 
+0.005988 0.009604 0.002474 0.014576 0.026358 -0.021280 
+-0.016367 -0.048853 0.000690 -0.036746 -0.044715 0.022524 
+-0.016267 -0.021689 0.020741 -0.008791 -0.026960 0.013480 
+-0.013797 -0.025803 0.014546 -0.006919 -0.007644 0.012611 
+0.001096 0.002301 -0.001951 0.017808 0.021478 -0.011467 
+0.019425 0.030716 -0.016156 0.010830 0.030553 -0.010011 
+0.022162 0.048463 -0.007364 0.047420 0.064766 -0.014333 
+0.018075 0.021807 -0.012660 -0.012818 -0.009453 0.008968 
+-0.001158 -0.004132 0.000050 -0.002505 -0.005082 -0.003462 
+-0.008212 0.000125 0.001262 -0.003551 0.003337 0.002675 
+-0.001309 0.001596 0.002230 0.000540 0.000793 0.001463 
+-0.000284 -0.004432 0.001430 0.000012 -0.002160 0.001467 
+0.000479 0.003655 -0.001165 0.001115 0.004126 0.000570 
+0.004137 0.000323 -0.007198 0.001078 0.004836 -0.005967 
+0.001240 0.004698 -0.002702 0.001665 0.002833 -0.004274 
+-0.000245 0.002654 -0.006463 -0.002032 0.003858 -0.007204 
+0.019644 -0.003542 0.013123 -0.014085 0.000556 0.036601 
+0.004662 0.000514 -0.005203 0.011299 -0.007009 -0.013703 
+0.000575 -0.033333 0.002588 -0.020580 -0.017150 0.007692 
+-0.053273 -0.025189 -0.004012 0.000517 -0.036429 -0.000222 
+-0.032852 -0.056000 -0.027377 -0.077092 -0.049219 0.017734 
+-0.045081 -0.026635 0.017800 0.000000 -0.051000 0.000000 
+-0.054111 -0.007889 -0.011556 0.005651 0.016220 0.004853 
+0.012143 0.028774 0.008221 0.033667 0.064256 -0.032436 
+0.042560 0.070952 -0.061488 -0.015260 0.041948 -0.038117 
+-0.075440 0.019250 -0.065426 -0.075833 -0.000500 -0.027333 
+0.072803 -0.012197 -0.007576 -0.034286 0.040714 -0.027857 
+0.052548 0.109808 -0.128894 0.070000 0.061250 0.000000 
+0.096250 -0.037684 -0.022610 0.062615 0.017077 0.095000 
+0.025917 0.013799 0.018003 0.049342 0.020868 0.015174 
+0.014297 0.025180 0.022320 0.033793 0.033941 -0.016675 
+0.005033 0.014803 0.009967 -0.024438 0.052454 0.033382 
+0.000000 0.142353 0.035588 0.005047 -0.025078 0.027524 
+0.048821 -0.024357 0.000536 0.013798 -0.014183 -0.013894 
+0.038182 0.030160 0.005484 0.055383 0.060578 0.002368 
+0.006023 0.011757 0.003069 -0.001301 0.006016 0.000651 
+0.008545 0.016701 -0.013901 0.005950 0.006694 -0.006352 
+-0.003422 -0.001055 0.001258 -0.007356 -0.001705 -0.001136 
+-0.003947 0.009324 -0.007419 0.006592 0.015507 -0.021719 
+0.015395 -0.006274 -0.016566 -0.078421 -0.034737 0.032237 
+-0.073931 -0.089773 0.071765 -0.034531 -0.046404 0.059465 
+-0.016995 -0.018990 0.025722 0.005028 -0.005487 0.013419 
+0.024598 0.022823 -0.017096 0.011676 -0.006244 0.000951 
+0.005407 0.014096 0.003722 0.002078 0.005804 0.000511 
+-0.006405 -0.002006 -0.000504 -0.011054 -0.002631 0.002953 
+-0.014354 -0.001496 0.007506 -0.022842 -0.015177 0.009896 
+0.001459 -0.007390 0.001794 0.000946 -0.002975 0.002072 
+-0.002681 0.004116 0.002152 0.000823 0.005246 0.001280 
+0.000762 -0.000587 0.000771 -0.003830 -0.003099 0.005731 
+-0.003193 -0.001968 0.004732 -0.003605 -0.001678 0.000430 
+-0.003040 -0.000058 -0.001843 -0.002836 0.002428 -0.001852 
+-0.000280 0.002701 0.001380 0.004282 0.006117 -0.003770 
+0.004048 0.005343 -0.001152 0.001279 0.001261 -0.003633 
+-0.000348 0.000375 -0.001599 -0.002515 -0.000575 -0.003463 
+-0.005976 0.004528 -0.010571 -0.002540 -0.001000 -0.003104 
+-0.039785 -0.020140 -0.007538 -0.043333 -0.036000 -0.002000 
+-0.025000 -0.040000 -0.005000 -0.015966 -0.015546 0.032773 
+-0.001973 0.014818 -0.001271 -0.032051 0.031450 -0.036591 
+-0.044988 0.016177 0.002369 -0.020089 0.001497 0.005459 
+-0.021843 0.000398 -0.012315 -0.010499 -0.032312 -0.022688 
+-0.060414 0.040174 0.011852 -0.075933 0.073967 -0.045167 
+-0.069231 0.053015 -0.008836 0.002857 0.028429 0.004714 
+-0.035278 -0.056389 -0.063472 -0.025000 -0.060000 -0.072500 
+-0.119167 -0.037500 -0.078333 -0.032170 -0.033711 0.025535 
+0.022140 -0.019982 0.004877 0.043077 0.004231 0.004231 
+0.063421 0.045579 -0.053526 0.035833 0.033333 0.030833 
+0.045238 0.032063 -0.020635 0.077944 -0.034722 -0.125778 
+0.000000 -0.007500 0.043750 0.016034 0.048391 0.040517 
+0.027879 0.043712 -0.023864 0.081755 0.100782 -0.031480 
+-0.014509 0.007018 0.003091 -0.029808 -0.030577 0.015481 
+0.010101 0.000101 -0.022955 0.020937 0.029586 -0.044662 
+0.052361 -0.001556 -0.046139 0.146617 0.109477 -0.069290 
+-0.017488 0.002251 -0.000144 -0.033884 -0.089664 0.016546 
+0.013736 -0.021847 0.001837 -0.001605 0.008148 0.004586 
+-0.001795 0.004156 0.013932 -0.000597 -0.003828 0.002471 
+0.003369 -0.001216 -0.000620 -0.000190 0.000217 -0.000110 
+0.000430 -0.000394 0.000596 -0.002218 0.005519 -0.010423 
+-0.032143 0.092238 -0.136952 0.071858 0.072500 -0.062876 
+-0.044913 -0.054766 0.008782 -0.034555 -0.026979 0.051777 
+-0.037934 0.000007 0.015164 0.013571 -0.001773 0.004433 
+0.009988 0.013468 -0.032111 0.013093 0.012225 -0.024950 
+0.015192 0.003820 -0.015675 0.016818 0.000000 0.001818 
+-0.000480 0.000072 0.000788 -0.002959 -0.002054 0.000808 
+0.001061 -0.000667 -0.004879 0.002385 -0.000894 -0.007647 
+0.001655 -0.000274 0.002214 0.001030 -0.000607 0.002271 
+-0.000069 0.001920 0.000028 0.000065 0.004188 -0.002103 
+0.000296 0.003624 -0.003698 -0.000101 0.000817 -0.001073 
+-0.001714 -0.002733 0.001613 -0.002404 -0.005092 -0.000447 
+-0.003249 -0.003950 -0.001423 -0.002465 -0.002108 -0.001014 
+-0.001171 -0.000876 -0.000251 -0.000382 0.000829 0.001096 
+0.000639 0.001696 -0.001328 -0.002148 0.001410 0.000475 
+-0.001942 -0.001323 -0.001772 -0.001710 -0.000861 -0.002445 
+-0.000796 0.009679 -0.010822 0.000786 0.030936 -0.038998 
+-0.040234 0.034737 -0.028655 -0.060583 -0.023024 0.029383 
+-0.004896 -0.014167 0.033229 0.032667 0.024667 -0.005333 
+0.063690 0.076482 -0.037831 0.084048 -0.033810 -0.033571 
+0.012859 0.019242 -0.033719 -0.004402 0.011464 -0.015101 
+-0.006056 -0.000507 0.006342 -0.011571 0.005805 0.011855 
+-0.013897 -0.086667 0.011759 0.009913 -0.020043 -0.000433 
+-0.004554 0.008462 -0.003415 -0.036243 0.020608 0.035106 
+-0.032000 -0.044909 -0.009091 -0.012509 -0.103833 -0.065366 
+-0.026891 -0.060336 -0.117395 0.030146 -0.042135 0.012164 
+0.031705 -0.014129 0.026364 0.027917 -0.027917 0.070000 
+-0.013636 -0.033636 0.013636 -0.012000 0.034500 -0.019500 
+-0.022659 0.058088 -0.001978 0.025774 -0.046752 -0.052479 
+-0.031294 -0.056245 -0.025434 -0.040000 -0.091346 -0.018269 
+-0.018490 0.046055 0.003675 0.021973 0.063502 0.036635 
+-0.021011 0.020452 0.047349 -0.015429 0.007714 0.030714 
+0.021846 0.026004 0.030426 0.024852 0.005263 -0.033273 
+0.020874 0.049513 -0.063698 0.027353 0.125294 -0.056176 
+0.010908 0.019460 -0.010172 -0.052600 -0.126702 0.042791 
+-0.013038 -0.026751 0.015105 -0.010759 -0.001872 0.010407 
+-0.007124 -0.014891 0.018442 -0.001854 -0.005898 0.003611 
+-0.003303 0.001659 0.000571 -0.001911 0.005982 0.000573 
+0.001518 0.008379 0.007003 0.011242 0.036706 0.020463 
+0.016926 0.075471 -0.022051 -0.007496 0.043108 -0.010074 
+0.075029 0.074885 0.006068 0.046227 -0.018504 -0.019206 
+0.004563 -0.031124 -0.014472 0.032139 -0.002955 0.014888 
+-0.029582 -0.021592 0.074169 -0.049070 -0.030596 0.036246 
+-0.023050 -0.018519 0.013043 -0.000260 -0.013759 0.005674 
+0.015332 -0.001274 -0.009709 0.021269 -0.018490 -0.007695 
+0.020420 -0.010385 -0.034875 -0.014925 -0.002649 -0.012124 
+-0.002888 0.001517 0.002456 -0.002959 -0.001338 -0.001395 
+-0.002723 -0.002198 -0.002423 -0.002047 -0.000939 0.003456 
+-0.003678 -0.002937 0.000148 -0.002575 -0.000583 0.000275 
+-0.002061 -0.001252 0.000626 -0.002211 -0.002804 0.000194 
+-0.002286 -0.002726 -0.001040 -0.001671 -0.000618 -0.001120 
+0.001661 -0.000070 0.000474 0.006798 0.001990 -0.003000 
+0.002848 0.004218 -0.002202 -0.000862 0.000000 -0.000776 
+-0.001177 0.004175 -0.002392 -0.002737 0.005486 -0.005142 
+-0.004097 0.004942 -0.008077 -0.003973 0.009486 -0.008697 
+-0.007962 0.022163 0.025392 -0.015452 0.016348 0.012318 
+0.005312 0.004593 -0.017110 0.021652 -0.001031 -0.042857 
+0.033157 0.007536 -0.038571 0.029337 -0.016518 0.038351 
+0.012203 -0.010595 0.003002 -0.000498 -0.000163 -0.002310 
+-0.014320 0.014687 0.009327 -0.031179 0.032764 0.049810 
+-0.005013 0.006064 0.051671 0.074167 -0.038333 0.052500 
+0.046382 -0.020845 0.017777 -0.000977 -0.023735 0.005016 
+-0.068744 0.055628 0.014883 -0.089954 0.081972 0.139137 
+-0.009365 -0.001270 0.013651 0.015891 -0.018386 0.046751 
+-0.037620 -0.031112 0.082661 -0.005417 -0.038333 0.060417 
+-0.087787 0.051284 0.004852 -0.116667 -0.105954 -0.008150 
+0.011667 -0.056667 -0.016667 0.029057 -0.022851 0.010368 
+0.011250 -0.023530 -0.003620 -0.007467 -0.041600 -0.002667 
+-0.022857 0.008571 -0.010000 -0.013282 0.009071 0.012632 
+0.000464 -0.005179 0.006357 -0.004671 0.026523 0.020350 
+-0.012175 0.045629 -0.059287 0.041549 0.133603 0.029731 
+0.139110 0.100908 0.124092 -0.055729 0.065541 0.010838 
+0.035020 0.133007 -0.008817 0.029439 0.121811 -0.027712 
+-0.043249 -0.027978 0.012447 -0.012421 -0.007203 0.012616 
+0.007837 0.000804 -0.012592 0.004793 0.002410 -0.004681 
+-0.000614 0.001219 0.000012 0.002266 -0.003047 0.001947 
+0.000966 -0.003902 0.002132 -0.013623 0.002047 -0.004313 
+-0.045180 -0.014430 0.007596 -0.022238 -0.022549 0.015307 
+-0.004747 -0.001894 0.001537 -0.049390 0.022391 -0.019876 
+-0.039655 -0.007836 0.007399 0.011734 -0.044729 0.052556 
+0.060363 -0.014006 0.031805 0.150000 -0.076473 0.085649 
+0.024364 -0.045319 0.008331 0.002811 -0.005806 0.000290 
+0.008494 -0.013804 0.016282 -0.006116 -0.021666 0.031020 
+-0.018980 -0.036523 0.034223 -0.044833 -0.055649 0.020535 
+-0.004920 -0.000933 0.003182 -0.003319 -0.001933 -0.000906 
+-0.003106 -0.001411 0.001048 -0.002982 -0.000417 0.003815 
+-0.001154 0.001457 0.003218 -0.002087 -0.001332 0.001088 
+-0.000465 -0.001109 0.000173 -0.002737 -0.000083 -0.001089 
+-0.001636 0.000797 -0.001733 -0.001232 0.004281 -0.001986 
+-0.001609 0.007711 -0.000841 0.002546 0.002724 -0.000433 
+-0.000263 -0.001506 0.000260 0.002079 -0.002759 0.000292 
+0.000558 0.002248 -0.003238 -0.001507 0.003036 -0.004418 
+-0.005525 0.002434 -0.010741 -0.051971 0.035865 -0.058413 
+-0.030398 0.040214 -0.033256 -0.017334 0.016476 -0.008150 
+-0.001074 0.008230 -0.013059 0.005821 0.004684 -0.007949 
+0.010588 0.008235 0.004706 -0.002881 0.000750 -0.002958 
+0.009265 -0.000288 -0.000528 0.002684 -0.002944 -0.002611 
+0.009653 0.007025 -0.027750 -0.023710 0.005317 0.004133 
+-0.023814 -0.002597 0.014102 0.028086 -0.006817 0.043784 
+0.018974 -0.019756 0.022397 -0.005604 0.021520 0.028077 
+-0.026842 -0.019942 0.146491 -0.044400 -0.022200 0.027000 
+-0.008147 0.040734 -0.046364 0.019333 -0.042333 0.003667 
+-0.020664 -0.024211 -0.002583 -0.003187 0.020714 -0.005463 
+-0.052611 0.020788 0.049852 -0.046246 -0.038987 -0.091013 
+0.003685 0.000330 0.004950 0.007776 -0.003706 -0.001200 
+0.001575 0.003150 -0.015751 -0.005631 -0.000433 -0.061818 
+-0.011465 -0.019964 -0.059495 -0.030646 -0.007132 -0.014109 
+0.014090 -0.028244 -0.005611 0.006667 -0.052667 0.043000 
+-0.007051 0.003654 0.006538 0.011686 0.015211 0.047950 
+0.058288 0.023178 0.038081 -0.000049 0.016965 0.013076 
+0.024328 0.034580 -0.004131 0.041235 0.021265 -0.089864 
+-0.025344 -0.063372 0.022420 0.000943 -0.015137 -0.004499 
+0.003426 0.002772 -0.006992 0.000885 0.005612 -0.001740 
+0.000958 0.003831 -0.001016 -0.002664 -0.005117 0.001481 
+-0.009476 -0.013369 0.008111 -0.008301 -0.009355 0.008091 
+-0.003406 -0.002245 0.002308 0.005419 0.004365 -0.004989 
+0.007676 0.004930 -0.005875 0.001988 0.000175 -0.000252 
+0.000833 -0.001086 0.001199 0.006449 0.001340 -0.000341 
+0.012030 0.003574 -0.000675 0.007689 0.000083 0.002459 
+-0.010697 -0.008671 0.009383 -0.013535 -0.006948 0.008766 
+-0.009501 -0.018104 0.016275 -0.009807 -0.027492 0.024130 
+-0.012235 -0.026323 0.025345 -0.009852 -0.019820 0.020266 
+0.000629 -0.003022 -0.005319 -0.001976 -0.004753 -0.001751 
+-0.001392 -0.002876 0.002064 0.001431 -0.000715 0.003089 
+0.000753 0.003683 0.000134 -0.001994 0.001297 0.000737 
+-0.003969 -0.000233 0.001984 -0.002048 0.000751 0.001399 
+0.000567 0.002675 -0.001558 0.000203 0.003365 -0.002321 
+-0.001905 -0.000136 -0.001154 -0.006038 -0.003063 0.002843 
+0.000669 -0.002082 0.002628 -0.000217 -0.002148 0.000387 
+0.000331 -0.003062 -0.001057 -0.001433 -0.004397 -0.003133 
+-0.005813 0.003851 -0.014158 -0.003057 0.049520 -0.073200 
+-0.035372 0.049520 -0.048000 -0.021829 0.023726 -0.013277 
+-0.007676 0.004849 -0.011602 -0.004054 0.005192 0.000354 
+-0.006554 -0.007367 0.018124 -0.000626 -0.009876 0.008981 
+-0.000906 -0.002979 0.008196 0.004938 -0.009391 0.008183 
+0.001612 0.006157 0.011653 -0.016123 0.008011 0.010634 
+-0.014914 -0.010086 -0.001317 -0.003153 -0.022838 0.033448 
+0.005508 -0.013338 0.047331 -0.019588 0.046749 -0.081029 
+0.021250 0.021250 -0.052500 0.084444 -0.056508 -0.112698 
+0.003907 -0.042651 -0.009442 -0.042769 -0.033846 0.021385 
+-0.016124 -0.030000 -0.003225 -0.020981 -0.010093 0.003685 
+-0.033719 0.019229 -0.007898 0.018961 -0.011673 0.013415 
+-0.022384 -0.034831 0.026118 -0.018145 0.004203 0.055101 
+0.031011 -0.014494 0.063371 0.072206 -0.017206 -0.067059 
+0.012071 0.019655 -0.105542 -0.000047 -0.000515 -0.038571 
+0.003833 0.014922 0.006400 0.002910 -0.001549 0.000113 
+0.011721 0.006586 0.022278 -0.004412 0.007170 0.002079 
+-0.020129 -0.002768 0.005981 0.004451 -0.001108 -0.011691 
+0.000568 0.000758 -0.015263 0.006494 0.010275 -0.009481 
+0.028001 0.047566 -0.019584 -0.000427 -0.013475 -0.004895 
+-0.012029 -0.012134 0.020281 -0.001894 0.004988 0.003303 
+0.000150 0.009102 -0.000185 -0.003564 0.005329 -0.001776 
+-0.004453 -0.003751 0.002386 0.001045 -0.005013 0.003243 
+0.008376 0.001301 -0.002322 0.011062 0.007565 -0.006883 
+0.007398 0.008067 -0.004930 0.001600 0.001690 -0.000796 
+-0.001724 -0.004507 0.002163 -0.000171 -0.003687 0.002180 
+0.003954 0.001329 -0.000660 0.005688 0.003381 -0.002158 
+0.000853 0.000736 -0.000645 -0.006042 -0.001185 0.000645 
+-0.003852 -0.001042 0.000628 0.000400 0.000877 -0.000632 
+0.002641 0.004748 -0.003713 0.006229 0.004821 -0.002054 
+0.000717 -0.003899 -0.002331 -0.000815 -0.000444 -0.002000 
+0.002883 0.000527 -0.005565 0.001769 -0.001907 -0.002059 
+-0.004290 -0.003040 -0.001226 -0.001283 -0.005728 -0.000230 
+-0.001282 -0.001333 0.003897 0.000227 0.000530 -0.000076 
+0.002580 0.001443 0.001183 0.002658 0.001196 0.001469 
+0.002721 0.001322 0.001251 0.004703 0.005256 -0.000366 
+0.003902 0.009945 -0.003652 0.004753 0.004759 -0.004760 
+0.001338 -0.000733 -0.002475 -0.000892 -0.006335 -0.001992 
+-0.000256 -0.002973 0.001315 0.007089 0.005234 0.002348 
+-0.007723 0.018127 -0.006973 -0.002753 0.000488 -0.007747 
+-0.002925 0.005000 -0.005524 0.002666 0.025329 -0.006834 
+-0.038698 -0.010603 0.034984 -0.025794 -0.023415 0.027549 
+-0.003666 -0.015557 0.018673 -0.100837 0.003565 0.044206 
+-0.014919 0.039038 0.019401 -0.004504 -0.000269 0.014522 
+-0.019976 0.002705 0.009155 -0.019609 -0.024541 0.027970 
+-0.032004 -0.016165 0.017744 0.006100 0.017881 0.002374 
+0.023880 0.059313 -0.024656 0.034516 0.044014 -0.045914 
+0.023154 0.014615 -0.037462 -0.003733 -0.002667 0.024533 
+-0.000701 -0.000917 0.022062 -0.010244 -0.000572 0.009615 
+-0.021772 -0.002920 0.017348 0.056165 0.014667 -0.024962 
+0.032005 0.009464 -0.022042 -0.004173 0.016543 0.022765 
+-0.017126 -0.001737 -0.004711 0.009589 -0.002187 0.012780 
+0.014024 -0.006965 -0.035664 0.065882 0.087059 -0.038235 
+0.083913 0.006961 -0.000565 0.033162 0.028940 -0.011449 
+0.004127 0.027642 -0.001811 -0.005000 -0.003955 -0.002094 
+-0.022478 -0.014804 0.014079 -0.033799 -0.014083 0.012000 
+-0.004250 -0.024750 0.014500 0.014976 0.012048 -0.000977 
+0.015867 0.057068 -0.012527 -0.053278 -0.026648 0.059425 
+-0.018176 -0.016576 0.029382 -0.000949 -0.001596 0.000808 
+-0.000806 -0.003708 0.000541 -0.000682 -0.005063 0.001310 
+0.000526 -0.006376 0.001575 0.002931 -0.005560 0.001005 
+0.005837 0.000032 -0.000153 0.006521 0.005820 -0.000256 
+0.004503 0.006027 0.000057 0.001053 0.001412 0.000028 
+-0.001481 -0.002941 -0.000025 -0.001041 -0.002875 0.000048 
+0.001833 0.000173 -0.000330 0.003355 0.001839 -0.000669 
+0.001930 -0.000355 0.000361 -0.000785 -0.003043 0.001232 
+-0.001406 -0.001720 0.000430 0.001747 0.003623 -0.001417 
+0.004992 0.009765 -0.003154 0.005319 0.008826 -0.000242 
+0.000059 -0.000067 -0.000157 0.004184 0.000193 -0.001681 
+0.003005 -0.001254 -0.005497 0.000692 0.001131 -0.005595 
+-0.003179 -0.001855 0.000636 -0.000728 -0.004854 -0.002487 
+-0.000310 -0.005115 0.000516 0.001187 -0.002096 -0.000341 
+0.000582 0.000182 0.000424 -0.001720 0.000877 -0.000359 
+-0.003073 0.000192 -0.001356 -0.002235 0.003800 -0.001341 
+0.003279 0.008083 -0.006512 0.001641 0.006331 -0.004304 
+-0.001750 -0.004153 -0.004993 -0.004757 -0.009781 0.000758 
+-0.000339 -0.009781 0.003672 0.006796 -0.000674 0.006697 
+0.000417 -0.000417 0.010417 0.002477 -0.004674 0.012021 
+0.006490 0.005070 0.000195 0.016499 0.020032 -0.003631 
+0.022408 0.029780 -0.002962 0.005327 -0.009068 0.009930 
+-0.003806 -0.031851 0.034619 -0.084444 0.057983 -0.007248 
+0.009130 0.028522 0.004435 0.001844 0.016444 0.015299 
+0.099622 0.105821 0.118268 0.002084 -0.000319 -0.008704 
+0.006506 0.010454 -0.013387 0.044963 -0.038933 -0.005409 
+-0.041000 -0.069170 0.009223 -0.016376 -0.005995 -0.018009 
+-0.018221 0.012786 -0.007639 -0.007263 0.003726 -0.008699 
+0.003044 -0.000369 -0.003593 -0.006344 -0.004946 0.007849 
+-0.021250 -0.026250 0.017500 0.010759 0.035750 -0.030683 
+0.020184 0.020345 -0.025310 -0.007387 -0.014855 0.037081 
+-0.027699 -0.021000 0.060140 -0.021445 -0.017764 0.038129 
+0.025637 0.022435 -0.006427 -0.040114 0.069034 -0.053636 
+-0.010865 0.007195 -0.065485 -0.008983 -0.105673 0.035986 
+0.005862 -0.034740 0.005568 0.005004 -0.006950 0.006054 
+0.004780 -0.000242 0.006720 -0.001987 -0.019720 0.009544 
+-0.004038 -0.023885 0.004596 0.013546 0.001770 0.000122 
+0.019472 0.008457 0.000662 -0.033786 -0.024154 0.040907 
+-0.003613 -0.004380 0.006898 0.002639 0.002094 -0.003527 
+-0.003044 -0.003487 0.003236 -0.007053 -0.007228 0.004441 
+-0.005315 -0.005255 0.000750 0.000647 -0.002416 -0.001160 
+0.004778 -0.001948 -0.000865 0.006410 -0.000443 -0.000327 
+0.005146 -0.000133 -0.000559 0.002645 -0.001206 -0.001690 
+0.001593 -0.002274 -0.002577 0.000309 -0.002530 -0.002235 
+-0.001326 -0.001745 -0.000403 -0.002722 -0.001123 0.000144 
+-0.003667 -0.002602 -0.000957 -0.003236 -0.004840 -0.000812 
+-0.001360 -0.002349 -0.000281 0.000449 0.004722 0.000349 
+0.000545 0.006546 0.001056 0.003103 0.004719 0.000592 
+0.000276 -0.000201 -0.000226 0.002559 -0.000914 -0.001278 
+0.002424 -0.001395 -0.003702 0.003210 -0.001952 -0.002524 
+0.003154 0.000937 -0.004140 0.000792 -0.000566 -0.004264 
+0.000000 0.000000 -0.001231 0.001265 0.000204 0.002054 
+0.000708 0.001050 0.001665 -0.002597 0.000870 -0.000905 
+-0.006169 0.001636 -0.001812 -0.002695 0.004235 0.003080 
+-0.004500 0.001600 0.000000 -0.000392 -0.000693 0.000523 
+-0.003942 -0.007309 0.000562 -0.005396 -0.010130 -0.001693 
+-0.004887 -0.006174 -0.004256 -0.007508 0.003460 -0.009529 
+-0.015127 0.026605 -0.029442 0.001812 0.007515 -0.018496 
+-0.006876 -0.015152 0.016284 0.015012 -0.008298 -0.002196 
+0.005560 0.010512 0.002903 0.010347 0.031689 -0.011254 
+0.004072 0.013277 0.009382 0.127069 0.067472 0.021834 
+-0.012365 -0.013234 0.009183 -0.019698 -0.012375 0.010831 
+0.033373 -0.009536 0.020413 0.036833 0.036188 -0.028387 
+0.090963 -0.025722 -0.000267 -0.053786 -0.123786 0.016912 
+-0.054954 -0.032841 -0.038872 -0.020428 0.008157 -0.011653 
+-0.020279 0.022705 -0.015503 -0.004271 0.010495 -0.000168 
+0.006430 0.005588 0.003674 0.000168 -0.000555 -0.000303 
+-0.004100 0.002620 -0.012014 -0.013177 -0.013182 -0.021083 
+-0.024179 -0.016179 -0.014675 0.000959 0.000888 0.000043 
+0.008229 -0.000095 -0.000936 0.010902 0.001504 0.004511 
+-0.006504 0.012778 -0.007434 -0.009614 0.008854 0.025311 
+0.004183 0.069231 0.093702 0.030896 -0.015606 0.014745 
+0.012882 -0.014316 -0.000483 0.005952 -0.002976 0.004960 
+-0.000983 -0.004316 0.019429 0.009605 -0.007157 0.011195 
+0.012916 -0.004515 -0.001391 0.008724 -0.001282 -0.003190 
+-0.000536 -0.000040 -0.000029 -0.012663 -0.008698 0.005784 
+0.000494 -0.002103 0.000513 0.000712 0.003491 -0.002517 
+-0.000980 0.002637 -0.000535 -0.001280 -0.000674 0.000358 
+0.000397 -0.001057 -0.000075 0.003201 0.000037 -0.000135 
+0.005800 0.002482 -0.000374 0.002969 0.000484 0.000933 
+0.000392 0.000136 -0.003865 -0.001239 0.000270 -0.000261 
+-0.005332 -0.003217 0.001189 -0.002619 -0.005705 0.002267 
+-0.001218 -0.002048 0.001529 0.000654 0.001415 -0.000779 
+0.001132 0.002336 0.000365 0.005344 0.001367 -0.003701 
+0.001988 0.004562 -0.006316 -0.001481 0.007013 -0.000130 
+0.003964 0.009438 0.000917 0.004782 0.003151 -0.003449 
+0.001233 -0.002729 0.000687 0.000789 -0.002534 0.000113 
+0.004343 -0.001811 -0.000506 0.002782 -0.001613 -0.002527 
+0.000425 0.000589 -0.002749 -0.001673 0.000294 -0.001184 
+-0.000305 0.003308 -0.001915 -0.000501 0.001272 0.000978 
+0.001644 0.000368 0.003277 0.003209 -0.000363 0.003479 
+0.004334 0.000690 -0.001350 0.004271 0.001896 -0.000271 
+0.004813 -0.001833 -0.000164 0.003460 -0.008185 -0.003511 
+0.000553 -0.007966 -0.007114 0.000653 -0.006720 -0.005254 
+-0.003649 -0.001856 -0.005388 -0.006262 0.015329 -0.009610 
+0.006636 0.036911 -0.030237 0.012232 0.039351 -0.054417 
+-0.024594 -0.022789 0.002174 -0.005707 -0.003479 0.001552 
+-0.007048 0.010970 0.001701 -0.001667 0.022500 -0.015833 
+0.021615 0.007695 -0.012515 0.056623 0.004156 -0.008961 
+0.006791 -0.002431 -0.013274 -0.001062 -0.003906 0.003649 
+-0.010743 -0.004842 0.001167 -0.007368 -0.004146 -0.005901 
+0.001523 -0.015203 0.105212 -0.012249 0.019716 0.044653 
+0.010711 -0.005280 0.004961 0.016008 -0.001469 -0.004018 
+0.014323 0.001444 0.002003 -0.007729 0.029458 -0.024362 
+-0.008346 0.011764 -0.024504 -0.013910 0.006911 -0.014875 
+-0.004841 0.000466 -0.007100 0.006799 0.028271 0.011400 
+0.031480 0.060042 -0.040571 0.026693 0.031383 -0.059158 
+0.017590 0.023097 -0.018813 0.000000 0.011349 -0.006485 
+-0.008180 0.003096 -0.039904 -0.025319 -0.034218 0.123480 
+-0.009372 0.003599 0.027016 0.002209 -0.000451 0.001196 
+0.014073 0.005157 0.001211 0.009399 -0.011236 -0.004957 
+0.013526 -0.013676 -0.002150 0.009807 -0.001776 -0.003879 
+0.014046 0.006087 0.001925 0.008741 0.005231 0.001918 
+0.000821 0.007069 0.002192 -0.003927 0.008086 0.000817 
+-0.003069 0.003695 0.001231 -0.001415 0.001612 0.000788 
+0.000762 -0.000233 -0.000832 0.001547 -0.000619 -0.002735 
+0.002369 -0.001959 -0.002067 0.001284 0.000198 -0.000152 
+0.001875 0.006356 0.000799 -0.001555 0.005043 -0.000033 
+-0.001432 -0.001389 -0.000751 -0.000044 -0.004797 0.000228 
+-0.000117 -0.002616 0.000798 -0.000987 0.000306 0.000231 
+-0.001072 0.000928 0.000145 0.000687 -0.001602 -0.002353 
+-0.001284 0.000956 -0.002240 -0.000003 -0.001517 -0.009127 
+-0.004539 0.001889 -0.005813 -0.001091 0.005684 -0.000029 
+0.003189 0.004273 -0.002088 0.001120 0.000056 -0.001108 
+0.001331 -0.002540 -0.000565 0.004597 -0.002646 0.000209 
+0.001320 -0.000434 -0.010582 0.001637 -0.002128 -0.008295 
+0.001870 0.000258 -0.005963 0.000365 0.006195 -0.002910 
+0.000207 0.004236 -0.004187 0.001467 0.002348 -0.004036 
+0.001530 0.001912 -0.002165 0.003239 0.000810 -0.002158 
+0.003625 0.005893 0.000529 0.006743 0.002707 -0.000396 
+0.008410 -0.008135 -0.000995 -0.001617 -0.014947 -0.001213 
+-0.001198 -0.014556 -0.005518 -0.001411 -0.007115 -0.002599 
+0.000456 0.002383 -0.002113 0.002026 0.006683 -0.012274 
+0.003432 0.011900 -0.021224 0.009821 0.026168 -0.032413 
+0.015127 0.027690 -0.050788 -0.017293 0.024099 -0.017010 
+0.021405 0.032936 -0.033488 0.023102 0.055180 -0.036898 
+-0.003204 -0.012903 0.026785 -0.029995 -0.004615 0.021914 
+0.001225 -0.006912 0.009142 -0.001452 -0.001641 0.000965 
+0.002429 0.000330 -0.001425 0.000947 -0.001422 0.005429 
+-0.002947 -0.003733 0.006342 0.009820 0.007260 -0.012174 
+-0.003816 -0.020889 0.004486 -0.001702 -0.028959 0.013870 
+-0.000001 -0.035133 0.016534 0.002473 -0.000512 0.002175 
+-0.038699 0.008293 -0.049444 -0.029206 0.001957 -0.034323 
+0.010519 0.002600 -0.004991 0.002117 -0.001690 0.000673 
+0.004641 0.006216 0.016142 -0.018718 0.011023 0.007997 
+-0.008836 -0.019771 0.031002 -0.025714 0.008664 0.000138 
+-0.007424 -0.011970 0.019394 -0.014541 -0.007477 0.037876 
+-0.015872 -0.009582 0.034858 -0.019706 -0.017255 0.042091 
+-0.021275 -0.014195 0.045550 -0.021042 -0.015064 0.042338 
+-0.021411 -0.022210 0.041180 -0.018105 0.028555 -0.027509 
+0.015624 0.008838 -0.009814 0.002717 0.011919 -0.008960 
+0.019591 0.027649 -0.007156 0.015549 0.012696 -0.016695 
+0.005005 0.004159 -0.006657 0.002391 0.001671 -0.002359 
+-0.000293 -0.001701 -0.000517 0.000393 -0.000454 0.000203 
+-0.002347 0.000246 -0.000207 -0.000551 -0.000152 -0.005243 
+0.001268 -0.003401 -0.007225 -0.004088 -0.002138 -0.002704 
+-0.003389 0.000380 -0.000377 -0.002410 -0.000286 0.001406 
+-0.000787 0.000656 0.000615 0.001628 0.002193 -0.002271 
+0.002441 0.000938 -0.003728 0.002287 -0.001732 -0.000790 
+-0.001774 -0.005403 -0.000887 -0.003283 -0.004008 -0.002917 
+-0.004440 -0.000677 -0.002204 -0.002504 0.001499 -0.000115 
+0.001611 0.002259 -0.000020 0.002247 0.002919 -0.002492 
+-0.001046 0.000899 0.001222 0.000603 0.004711 -0.000785 
+-0.003723 0.002952 -0.006291 -0.001834 -0.000035 -0.006649 
+0.004789 -0.000568 -0.005479 0.001064 0.002829 0.000290 
+0.002205 0.005733 -0.000397 0.007118 0.004324 -0.000853 
+0.004953 0.001614 -0.001932 0.000835 0.000861 -0.001007 
+-0.001073 0.001216 0.003097 -0.000106 -0.000812 0.004748 
+-0.002759 -0.001387 -0.004187 0.000441 -0.014940 -0.010823 
+-0.003866 -0.014198 -0.003166 0.000104 -0.000629 0.003687 
+0.001471 0.000132 0.004599 0.003316 0.000141 0.005381 
+0.003012 0.000252 0.003923 0.001145 0.000041 0.001621 
+-0.004028 -0.004089 0.001450 -0.026970 -0.022944 0.009928 
+0.002685 0.002981 -0.003173 0.022533 0.037546 -0.016472 
+-0.006694 0.012307 0.012204 -0.011463 -0.010316 0.005959 
+-0.016196 -0.012895 0.016728 -0.020397 -0.011551 0.038342 
+-0.011566 -0.002733 0.016918 0.000017 0.001745 0.008029 
+0.005542 -0.002943 0.003758 -0.000846 0.002444 -0.002872 
+0.001325 -0.000536 0.003203 -0.034188 0.016426 0.026171 
+0.004530 0.001074 0.023211 0.015223 -0.099901 0.131300 
+-0.031420 -0.049753 0.016235 0.010353 -0.078732 0.024639 
+0.013311 -0.030010 -0.002663 0.001220 -0.011002 -0.003415 
+-0.004014 0.002152 0.000177 0.021665 0.022649 -0.007154 
+-0.002452 -0.001998 0.002721 -0.012449 -0.007755 -0.015204 
+-0.012407 -0.012449 0.041559 -0.005127 -0.011578 0.035956 
+-0.003839 -0.010910 0.039679 -1.678571 -2.071429 4.946429 
+-1.744318 -2.073864 4.625000 -2.027027 -2.238739 4.459459 
+-2.384615 -2.675824 4.923077 -0.027112 -0.026084 0.042548 
+-0.020250 0.003477 0.025252 -0.011959 0.001537 0.028146 
+0.008608 0.014652 -0.003850 0.010562 0.014198 -0.012327 
+0.007762 0.006722 -0.007845 0.006741 0.001488 -0.003304 
+0.000753 -0.001334 -0.000618 -0.000318 0.001216 0.000432 
+-0.001333 -0.000054 -0.001653 0.008421 -0.003155 -0.010325 
+0.005087 -0.006424 -0.010441 0.001415 -0.004283 -0.001639 
+-0.002362 0.002382 -0.001427 -0.002032 0.004781 -0.000465 
+-0.001244 0.001182 0.001934 -0.002367 -0.001893 0.002209 
+-0.000111 -0.000921 -0.000129 0.001639 0.000192 0.000106 
+-0.000407 -0.000040 -0.000173 0.001865 -0.001219 0.002081 
+0.001413 -0.001770 0.001585 -0.003170 -0.000275 -0.001742 
+0.003907 0.003096 -0.001287 0.002443 0.003474 -0.003416 
+-0.005709 -0.003444 -0.000755 -0.004645 0.003201 -0.001253 
+-0.001050 0.000902 -0.001756 0.000415 -0.000252 0.000996 
+0.003297 0.000942 0.002411 0.000849 0.002526 0.003520 
+-0.000371 0.001246 0.005701 -0.004098 0.002273 0.003225 
+-0.000967 0.002756 -0.001434 -0.001000 0.001676 -0.000918 
+0.001105 -0.000595 0.002505 0.003020 -0.002337 -0.000486 
+-0.003328 -0.008099 -0.009381 -0.007403 -0.015889 -0.013615 
+0.002622 -0.010614 0.001795 0.007290 -0.001071 0.017963 
+1.055000 -0.360000 4.065000 1.509158 -0.227106 4.695971 
+1.626415 -0.215094 4.433962 1.375000 -0.353261 3.369565 
+0.002666 -0.007701 0.015287 -0.010015 -0.013685 0.001657 
+-0.009773 -0.014031 -0.004515 -0.009272 -0.010502 -0.009407 
+0.005008 0.027438 0.008332 -0.026122 -0.032104 0.048543 
+-0.017353 -0.035072 0.021295 -0.047256 -0.034390 0.018556 
+-0.027188 -0.055707 0.041810 -0.006379 -0.009464 0.016513 
+-0.002665 -0.000674 0.002274 -0.007405 0.005800 -0.000578 
+0.001494 0.016810 -0.006650 0.003970 0.026118 -0.006985 
+-0.013229 -0.006458 0.017429 0.006340 -0.024492 -0.016676 
+0.013333 -0.013333 -0.006667 -0.009334 -0.000203 0.033888 
+0.014299 0.005049 0.028284 -0.014862 -0.034189 0.009185 
+0.004099 -0.006277 0.005714 0.012821 -0.003010 -0.007382 
+0.020432 0.001524 -0.002432 0.000398 0.000071 -0.001069 
+-0.004130 0.003112 0.006866 -0.008095 -0.021359 0.013325 
+-0.006327 -0.013598 0.033121 -1.333333 -1.290909 3.800000 
+-1.618893 -1.827362 4.182410 -1.797927 -2.168394 4.466321 
+-1.834395 -2.490446 4.611465 -1.388889 -2.812500 4.506945 
+-0.007515 -0.009620 0.026701 0.000303 -0.005231 -0.002015 
+0.002959 0.001996 -0.003159 0.006873 0.008197 -0.008667 
+0.007033 0.004344 -0.003942 0.001597 -0.000454 -0.000212 
+-0.002858 -0.001311 -0.002114 -0.001359 0.001376 -0.000724 
+-0.001554 0.003654 -0.002631 0.002392 0.005837 -0.002998 
+0.004619 0.001215 -0.003002 0.004308 0.000884 -0.001956 
+0.004400 0.002973 -0.000362 0.001961 0.007048 -0.001902 
+-0.000406 0.005254 -0.000517 -0.002492 -0.001798 0.000352 
+-0.002642 -0.005011 -0.001890 -0.001853 -0.002117 -0.002135 
+-0.006477 0.000355 0.006855 -0.008177 -0.001953 0.005090 
+-0.002226 0.000771 0.001379 0.002919 0.005388 -0.003268 
+0.006383 0.006492 -0.008453 0.002921 0.005389 -0.006066 
+-0.000810 0.002956 -0.002182 -0.002729 0.002065 0.000749 
+-0.000824 0.000036 0.000507 0.004255 0.000576 0.001430 
+0.003781 -0.000665 -0.000769 0.000076 -0.000317 -0.003178 
+-0.001098 0.005524 -0.005719 0.000694 0.005444 -0.004111 
+0.000689 0.000872 -0.002720 0.000878 0.000281 -0.002225 
+0.001213 0.000705 -0.001004 0.000588 0.001259 -0.001736 
+-0.002133 -0.006870 -0.004096 -0.001586 -0.011542 -0.017451 
+-0.001445 -0.001168 -0.005806 0.013516 -0.002078 0.031243 
+2.016077 -0.488746 5.581994 2.403023 -0.549118 6.370277 
+2.541436 -0.488950 6.342541 2.288618 -0.260163 5.398374 
+0.014619 -0.000036 0.030690 0.003641 0.000072 0.007234 
+-0.000231 0.000823 0.013835 -0.010768 0.002579 0.006370 
+-0.017048 -0.006446 0.006720 -0.015050 0.003911 0.013272 
+-0.004908 0.007173 -0.000378 -0.008960 0.005450 -0.000045 
+0.006100 0.005141 0.001549 -0.006842 0.005121 -0.002390 
+-0.015960 0.003483 -0.005435 0.000445 0.015628 -0.006003 
+0.027437 0.014556 -0.008824 0.035517 0.027785 -0.015379 
+-0.008925 -0.009770 0.019099 0.000000 0.018667 -0.003333 
+0.043533 0.061083 -0.010028 0.014832 0.004866 0.009551 
+0.029245 0.000801 0.001785 -0.002077 -0.021255 0.027567 
+0.009333 0.020000 0.030667 -0.009726 0.002082 0.022036 
+-0.003667 -0.003506 0.013117 -0.004182 -0.004726 0.019837 
+-0.009918 -0.021639 0.013033 -0.017169 -0.013013 0.031055 
+-0.021593 -0.016492 0.038042 -1.910053 -1.735450 4.793651 
+-2.066007 -1.986799 4.831683 -2.069069 -2.357357 4.792793 
+-1.977444 -2.706767 4.575188 -1.161677 -1.694611 3.233533 
+0.005636 0.006926 0.008278 0.008859 0.042557 -0.026380 
+0.013408 0.013836 -0.015461 0.004676 -0.002441 -0.006156 
+0.005544 -0.000479 -0.003379 -0.000203 0.003654 -0.000041 
+-0.003259 0.003436 -0.002085 -0.007350 0.000444 -0.000565 
+-0.008106 -0.000044 0.001713 -0.003913 0.003078 -0.001757 
+0.001802 0.006716 0.000543 0.008221 0.006278 -0.002251 
+0.004689 0.006490 -0.002951 0.000958 0.004484 -0.001139 
+-0.001801 0.000057 0.000140 -0.005676 -0.005728 -0.000263 
+-0.007456 -0.008194 -0.001891 0.000088 -0.007080 0.000265 
+0.000805 0.000334 -0.000918 0.003198 0.006285 -0.003418 
+-0.004226 0.000532 -0.001507 -0.002167 0.002881 -0.007859 
+0.001427 0.001942 -0.007710 0.007620 0.004723 -0.009194 
+-0.001367 0.004099 -0.007856 -0.000023 0.002429 -0.005622 
+-0.000373 -0.000242 -0.000126 0.000931 -0.002082 0.000133 
+-0.000932 -0.001473 -0.001778 0.001138 0.002132 -0.004696 
+0.000186 -0.001266 -0.003426 -0.000320 0.009091 -0.004800 
+0.001658 0.006690 -0.008741 0.009735 0.005642 -0.000608 
+0.010312 0.000585 -0.001480 0.007837 0.008001 -0.007032 
+-0.006734 0.006353 -0.018857 -0.007511 0.016465 -0.044331 
+-0.000284 0.010260 -0.001235 1.301724 -0.129310 3.168103 
+1.980501 -0.676880 4.913649 2.464020 -0.875931 6.057072 
+2.714286 -0.665714 6.665714 2.476000 0.024000 6.216000 
+1.518987 0.841772 4.386076 0.007295 0.010712 0.014024 
+0.000073 0.003331 0.001185 -0.007887 -0.000505 0.000489 
+-0.009048 0.002547 0.004115 -0.009582 -0.001827 0.000788 
+0.004051 0.013259 0.003192 0.007691 0.027971 -0.010664 
+-0.000223 0.013295 -0.004154 0.001875 0.005875 -0.001604 
+-0.007007 0.010387 -0.003269 -0.008722 0.001430 -0.003146 
+-0.010064 -0.009553 0.002840 -0.003067 -0.023000 0.006133 
+-0.013220 -0.022097 -0.006571 -0.008667 -0.011744 -0.003385 
+0.025359 0.010997 0.024539 0.041947 -0.013318 0.007592 
+0.085830 0.093430 -0.088424 -0.007055 0.027136 -0.046675 
+0.008740 -0.000657 -0.016071 0.008195 -0.003619 0.001237 
+0.006537 -0.007112 -0.002534 0.005084 0.005483 0.004577 
+0.000015 0.005315 0.024573 -0.018432 -0.012239 0.030921 
+-0.025381 -0.012818 0.045740 -2.035897 -1.523077 5.405128 
+-2.406977 -2.186047 5.294574 -2.712727 -2.760000 4.916364 
+-2.596899 -2.550388 4.104651 -1.838863 -1.393365 2.872038 
+-0.001189 0.001592 0.013754 0.009372 0.020372 -0.010309 
+0.002800 0.023150 -0.015716 0.003582 0.002673 -0.004190 
+0.001891 0.000934 -0.003069 0.002652 -0.000159 -0.000495 
+0.000069 -0.001806 -0.007465 -0.005904 -0.001258 0.002142 
+-0.009209 -0.003418 0.002168 -0.005574 0.001369 -0.001524 
+-0.000471 0.009378 -0.001951 0.004426 0.012007 -0.004346 
+0.002501 0.007806 -0.002415 -0.000587 0.002010 0.000340 
+-0.001529 -0.002321 0.000118 -0.003413 -0.003982 0.000975 
+-0.003772 -0.002982 -0.001491 -0.001563 -0.001616 -0.003682 
+-0.002664 -0.000687 -0.003208 -0.005674 -0.000509 -0.001149 
+-0.006073 0.002558 -0.000312 -0.002823 -0.000931 -0.003754 
+0.001339 0.000654 -0.001090 0.006708 -0.000158 -0.002799 
+0.001873 0.000817 -0.004093 0.001275 -0.000765 -0.005407 
+-0.000590 -0.001969 -0.003031 -0.001073 -0.000318 -0.001586 
+-0.000636 0.001567 -0.000858 -0.000808 0.001102 0.000608 
+-0.000450 -0.001167 0.003402 0.000316 0.001199 0.001460 
+-0.002136 0.002187 -0.005086 -0.004744 -0.001282 -0.006571 
+0.000392 -0.004555 -0.003980 -0.000221 -0.001537 -0.003904 
+0.003401 0.002740 -0.017804 -0.006215 -0.010169 -0.037166 
+-0.001938 0.009505 -0.015742 0.001810 -0.002817 0.020073 
+1.264808 -0.885017 4.108014 1.876877 -0.714715 5.600601 
+2.141975 -0.151235 6.111111 1.882576 0.534091 5.522727 
+1.205882 1.017647 3.976470 0.002581 0.012041 0.011719 
+-0.002557 0.010891 0.006175 -0.024704 -0.013568 0.039214 
+-0.006619 -0.014614 0.037137 -0.010471 -0.018505 0.025549 
+-0.005188 -0.015172 0.011240 0.002360 0.026868 -0.015835 
+0.002804 0.051826 -0.023041 -0.004510 0.024327 0.003697 
+0.007458 0.018924 0.009436 0.008000 0.022206 0.001306 
+-0.005417 0.001164 -0.002716 -0.008584 -0.004065 -0.000853 
+-0.001644 0.020044 -0.005422 0.021732 0.023074 -0.035281 
+0.020227 0.010909 -0.031591 -0.009732 0.052586 -0.032096 
+0.003562 -0.010000 -0.009796 0.002535 -0.011988 -0.027660 
+0.002912 -0.013620 -0.010802 0.007194 -0.003829 -0.001500 
+0.001586 0.006360 0.004631 -0.004768 0.009704 0.017225 
+0.014900 0.014292 -0.015815 0.003353 0.021848 -0.004289 
+-0.010544 0.004333 0.033348 -1.465116 -0.965116 4.994186 
+-2.101695 -1.957627 5.177966 -2.385185 -2.533333 4.640741 
+-2.193050 -2.444016 3.555984 -1.448276 -1.640394 2.064039 
+-0.001617 -0.002357 0.004534 0.004347 0.012025 -0.003713 
+0.004686 0.006129 -0.006331 0.000507 0.001690 -0.002271 
+0.001847 -0.000700 -0.004014 -0.001000 -0.002000 -0.007075 
+0.001473 -0.004331 -0.000830 0.005416 -0.003699 -0.002277 
+0.002136 -0.002019 -0.001010 -0.001350 0.000186 -0.000498 
+-0.003648 0.000231 -0.000465 -0.003530 0.000344 0.000716 
+0.000174 -0.001616 -0.000651 0.002134 -0.001011 -0.001375 
+0.001706 0.000280 -0.000163 -0.000885 -0.000206 -0.000240 
+-0.003145 0.002670 -0.007059 0.000511 -0.003483 -0.003994 
+-0.000911 0.000765 -0.002533 0.000658 -0.000479 0.001100 
+0.002242 0.003109 -0.000520 -0.001238 0.000761 -0.000762 
+0.002577 -0.003446 -0.001152 0.004708 -0.002304 -0.003539 
+0.000348 0.001780 -0.002999 -0.000078 0.001752 -0.008135 
+-0.001499 0.001264 -0.010072 -0.002739 0.000715 -0.009169 
+-0.000854 0.000081 -0.006747 -0.001578 -0.002028 -0.003594 
+-0.003607 0.001339 -0.003385 -0.001985 0.001793 -0.005297 
+-0.001967 -0.003254 -0.004845 -0.002941 -0.003744 -0.005081 
+-0.003418 -0.004586 -0.002730 -0.002588 -0.001581 0.003077 
+0.000165 0.000150 -0.000197 0.002216 0.001660 -0.005702 
+0.008436 0.003864 -0.006327 0.002768 -0.000636 -0.008031 
+0.002954 0.003255 0.013207 0.927885 0.000000 3.153846 
+0.889796 0.457143 3.812245 0.647059 0.719457 3.733032 
+0.007615 0.010444 0.024121 -0.001733 0.000883 -0.002672 
+-0.004073 -0.020499 -0.015490 0.015011 -0.012618 0.026610 
+0.005290 -0.004705 0.022140 0.006954 0.001864 0.003950 
+0.001174 0.005423 -0.013100 -0.000500 0.005924 -0.032023 
+-0.016557 0.013507 -0.022172 -0.021119 0.008998 0.012573 
+-0.015748 -0.001511 0.010204 0.005610 0.010732 0.011463 
+0.029292 0.016738 -0.009200 0.003810 -0.001089 -0.019231 
+0.004166 -0.000320 -0.019310 0.009449 0.010576 -0.022708 
+0.002334 0.002170 -0.037010 -0.010070 -0.022028 -0.008182 
+-0.011955 -0.037397 0.019033 0.005379 -0.007974 -0.006461 
+0.055016 -0.008118 -0.008279 -0.015000 -0.008663 -0.003609 
+-0.039044 -0.010111 -0.009189 -0.047811 -0.009148 -0.005753 
+-0.006401 -0.009915 -0.016408 0.002767 0.019980 -0.007991 
+-0.000461 0.011825 0.024182 -0.012476 0.000745 0.041632 
+-0.856436 -1.207921 4.514852 -0.927660 -1.557447 3.663830 
+-0.750000 -1.450000 2.272727 -0.000974 -0.007548 0.008453 
+0.003800 -0.001324 -0.004365 -0.000551 0.001449 -0.005142 
+0.000572 0.001807 -0.000426 -0.001416 -0.000072 0.001561 
+-0.004228 -0.000841 -0.002448 0.001034 -0.000640 -0.001695 
+-0.000467 0.001820 -0.004769 0.002450 -0.000979 -0.001870 
+-0.002843 -0.001694 0.001984 -0.005727 -0.004213 0.002634 
+-0.005069 -0.006089 0.000095 -0.006318 -0.001911 -0.001889 
+-0.001209 -0.000323 0.000053 0.004227 -0.000640 -0.002287 
+0.002709 -0.000699 -0.002184 -0.002018 -0.002256 -0.001024 
+-0.001535 -0.002447 -0.004029 -0.004349 0.002589 -0.005758 
+0.001067 -0.001293 -0.002320 0.007698 0.008243 -0.003887 
+0.004081 0.008368 -0.000343 0.003249 0.002275 -0.000650 
+0.001777 -0.000249 -0.000720 0.001268 -0.001284 -0.000456 
+0.004546 -0.001731 -0.003369 -0.000722 -0.001703 -0.003884 
+-0.003252 0.001138 -0.002520 -0.000042 0.004836 -0.000443 
+-0.000164 0.003756 -0.000704 -0.000910 0.000109 -0.000273 
+-0.000007 -0.001805 -0.006871 0.002012 0.005040 -0.004927 
+-0.002702 -0.003037 -0.002647 -0.004072 -0.000335 -0.001410 
+-0.002705 0.002231 -0.001305 0.001868 0.000809 -0.001000 
+0.003629 0.005017 -0.002707 0.005105 0.007008 -0.003097 
+0.003789 0.012079 -0.005315 0.006367 0.008709 0.001399 
+0.009937 -0.000243 -0.013214 0.004551 0.000025 -0.006417 
+-0.000153 0.000357 0.001834 -0.004619 0.003182 0.004935 
+-0.008115 0.002281 -0.004757 -0.012578 -0.012287 -0.019350 
+0.002500 0.005956 -0.023824 -0.001216 0.003784 0.004815 
+0.002175 -0.003130 0.012999 0.000851 0.000873 -0.000258 
+-0.003748 -0.000230 -0.005354 -0.006988 -0.006881 -0.004809 
+-0.011114 -0.016123 -0.001105 -0.014790 -0.010425 -0.004688 
+-0.022727 0.001742 -0.004266 -0.013493 -0.001780 0.001828 
+-0.003380 0.006430 -0.002681 0.002217 -0.000765 0.001420 
+-0.002087 -0.002423 0.004038 -0.003962 -0.014517 0.000210 
+-0.023239 -0.012465 -0.016372 -0.002328 0.007668 -0.027330 
+0.001398 0.007607 -0.006306 0.014411 0.011727 0.009113 
+0.098190 0.024952 -0.016095 -0.016305 0.010532 0.004236 
+-0.008175 0.003340 -0.026602 0.037291 -0.002136 -0.051533 
+-0.019737 0.010248 -0.039149 0.001646 0.005317 -0.025588 
+0.001356 0.004332 0.006585 0.000793 0.002419 0.023512 
+0.001729 -0.003203 0.024458 0.000373 -0.004051 0.016823 
+0.000308 -0.001588 0.006079 0.001196 0.000757 -0.003690 
+0.001734 0.003581 -0.009392 0.000019 0.002845 -0.008160 
+0.001728 0.002649 -0.000573 0.001578 0.000365 -0.001016 
+0.001869 0.000736 -0.000958 -0.000415 0.001111 -0.002862 
+0.000601 0.000432 -0.002700 0.002892 0.001483 -0.004895 
+0.000707 0.007440 -0.008682 0.002253 0.006485 -0.009918 
+-0.001426 0.003204 -0.005348 0.003228 -0.000232 -0.002107 
+0.000533 0.000122 0.000473 -0.000706 -0.000118 -0.001188 
+-0.000425 0.001899 -0.004112 0.000088 0.000682 -0.002753 
+0.000144 -0.000323 -0.000287 -0.000018 0.001753 -0.001110 
+0.002083 0.004454 -0.001736 0.000333 0.005750 -0.001917 
+0.000594 0.000318 0.000717 -0.000937 0.000537 0.003893 
+-0.000617 -0.001426 0.003969 -0.000460 -0.001414 0.001007 
+0.001430 -0.000885 -0.000850 -0.000359 -0.000238 -0.000343 
+0.003357 0.007502 -0.005462 0.005748 0.009350 -0.007670 
+0.004413 0.005923 0.001792 -0.000289 -0.000584 -0.001454 
+0.004264 0.002082 -0.005192 0.002687 0.001580 0.000757 
+-0.000432 -0.000859 -0.000589 -0.000595 -0.000248 -0.000577 
+0.002217 0.000554 0.001322 0.002120 -0.000992 0.000293 
+0.004155 0.003200 -0.003773 0.003282 0.005998 -0.001444 
+-0.000340 0.007615 -0.005151 0.000721 0.004676 -0.006091 
+0.000257 -0.001155 0.000303 0.006469 -0.004222 0.001911 
+0.007535 -0.005798 -0.003810 0.001668 -0.005093 -0.010422 
+-0.005009 0.007241 0.002085 -0.016782 0.002411 0.003962 
+-0.022413 -0.009447 0.005114 -0.015971 -0.015176 0.005593 
+-0.009560 -0.009429 -0.001912 -0.007276 -0.001934 0.014245 
+0.002137 0.003395 0.006664 0.000439 -0.000108 0.000343 
+-0.009523 0.003307 -0.015689 -0.008235 -0.000691 -0.027801 
+0.001761 -0.003889 0.000503 0.016975 -0.014497 -0.008717 
+0.003224 -0.018851 -0.003913 -0.005325 -0.016220 -0.006208 
+-0.004772 -0.017500 -0.002169 -0.011108 -0.010107 0.008944 
+-0.011934 -0.003237 0.004189 -0.008553 -0.004957 -0.011374 
+0.002318 -0.008360 -0.022799 0.028030 0.002611 -0.034647 
+-0.012333 0.015667 -0.016667 0.000688 0.004831 -0.011720 
+-0.002275 -0.000609 -0.007100 0.010077 0.002323 -0.008840 
+0.014312 0.026836 -0.024074 0.024130 -0.002957 -0.017348 
+0.015061 0.008567 -0.026530 0.008834 0.009745 -0.009578 
+0.005194 0.002435 0.001559 0.001802 -0.004281 0.006404 
+0.001333 -0.005676 0.005789 0.005352 -0.002768 0.000111 
+0.008523 0.002892 -0.006380 0.005725 0.004490 -0.004153 
+-0.001576 0.000185 0.001005 -0.003310 -0.004070 0.000948 
+-0.001869 -0.003523 -0.000246 -0.001717 -0.000416 0.000077 
+-0.000818 0.003901 -0.004206 0.005221 0.007336 -0.007805 
+0.014234 0.010030 -0.007440 0.004303 0.015261 -0.002723 
+0.001213 0.007701 -0.001559 0.000837 0.001176 0.002606 
+0.000713 0.001951 0.003752 -0.002730 -0.000188 0.004362 
+-0.004434 -0.002195 0.002469 0.000056 -0.001446 -0.001307 
+0.001698 -0.000207 -0.002023 0.003832 0.001866 -0.002849 
+0.002373 0.000278 0.000111 0.000118 -0.000719 -0.001096 
+-0.000776 -0.000039 -0.000393 -0.000593 -0.000313 -0.000382 
+0.000168 0.001188 0.000291 -0.000071 0.001623 0.000397 
+-0.000660 -0.000120 -0.001694 -0.001111 -0.003254 -0.000079 
+-0.003927 0.000578 0.001789 -0.002006 -0.001065 -0.001054 
+-0.000635 -0.001850 -0.001621 -0.000146 -0.002071 -0.004120 
+0.001931 0.008405 -0.000596 -0.001628 0.003093 0.000000 
+-0.000773 -0.000248 -0.001280 0.002809 -0.002101 -0.002432 
+0.003786 0.001893 -0.001832 0.003429 0.000964 -0.002151 
+0.000373 0.006026 -0.002336 -0.002412 0.004732 0.000291 
+-0.001553 0.007376 -0.001142 -0.002050 0.003697 -0.002270 
+0.006391 -0.006430 0.000724 0.010676 -0.008030 0.002742 
+0.007059 -0.006934 -0.002516 -0.001832 -0.003542 -0.013260 
+-0.002714 0.010702 -0.004632 0.006899 0.013527 -0.008166 
+0.008083 0.002945 -0.004500 0.005278 -0.003016 0.000754 
+0.004048 -0.001821 0.000246 0.000471 -0.002684 0.002402 
+-0.000968 -0.009810 0.003116 -0.002985 -0.003925 0.006713 
+0.002348 0.013576 0.008761 -0.003922 0.013482 0.013683 
+-0.010341 0.005577 0.007830 -0.010776 -0.000676 0.004183 
+-0.006758 -0.000758 0.000939 -0.003342 0.001307 0.004158 
+-0.003565 0.004669 0.003345 -0.003477 0.000172 0.001406 
+-0.002878 -0.001911 0.002575 -0.005859 -0.002897 -0.000243 
+-0.000984 -0.001037 -0.004857 0.011515 -0.000527 -0.005199 
+0.021467 0.000761 -0.004148 0.020604 0.005833 0.006196 
+0.003095 0.014524 0.004405 -0.001491 -0.005488 -0.004713 
+0.009249 0.002906 0.003217 0.001213 -0.002892 0.003474 
+0.007331 0.011138 -0.012002 0.006137 0.006910 -0.020488 
+0.000139 0.002119 -0.004947 -0.002406 -0.006301 0.005517 
+-0.006654 -0.008865 0.005978 -0.006430 -0.006584 0.005938 
+-0.002612 -0.001529 0.002799 0.001682 0.001691 -0.000388 
+0.001892 0.005601 -0.000552 0.000398 0.003338 0.000123 
+-0.000371 -0.000605 0.000015 -0.000540 -0.000950 -0.000009 
+-0.000367 0.000590 -0.000192 0.000241 0.000272 0.000142 
+-0.002704 -0.001274 0.003483 -0.006082 -0.002484 -0.000993 
+-0.001059 -0.004232 0.000803 -0.000075 -0.001248 0.001659 
+-0.000893 -0.000253 0.001524 -0.001651 0.002133 0.004178 
+-0.006108 -0.000296 0.004768 -0.000089 -0.001466 0.001314 
+0.002899 -0.001529 -0.002790 0.004559 -0.000417 0.000228 
+-0.000026 0.000201 0.000006 -0.001732 0.000510 -0.000682 
+-0.001957 -0.001269 0.002645 -0.000429 -0.002971 0.001584 
+-0.002143 0.000357 0.000609 -0.003146 -0.001968 -0.002525 
+0.001525 0.002597 0.001429 -0.000400 0.001649 0.002768 
+-0.000972 0.001944 0.001143 -0.000112 0.003275 0.001369 
+-0.003686 0.006049 -0.001934 0.002970 0.006588 -0.000662 
+-0.005757 0.000918 -0.004239 -0.001690 -0.001423 -0.003848 
+0.000370 -0.001774 -0.000446 0.000049 -0.001527 -0.000037 
+-0.000534 -0.000200 -0.000299 -0.002699 -0.001008 0.000343 
+-0.001171 -0.001293 0.000310 -0.001302 0.001986 -0.002316 
+-0.003411 0.002150 -0.002194 -0.003878 0.002318 -0.001813 
+-0.001764 0.001226 -0.000466 0.002087 -0.002017 0.000091 
+0.005825 -0.003268 -0.009393 0.004760 0.009924 -0.010640 
+-0.001453 0.001779 -0.005623 0.001271 0.001853 -0.002923 
+0.007177 -0.002018 -0.001594 0.007257 -0.001080 0.002264 
+0.002417 0.001821 0.000253 0.000171 0.002939 0.000413 
+0.001064 0.000851 -0.004043 0.006535 -0.000343 -0.001548 
+0.004527 -0.001461 -0.001341 0.000731 0.003317 0.000554 
+-0.005795 0.001571 0.000764 -0.014722 -0.007222 0.013333 
+-0.021613 0.002848 0.007931 -0.012803 -0.008617 -0.008741 
+0.003203 -0.000206 -0.008350 0.003407 0.002490 -0.005942 
+0.002779 0.000434 -0.000906 0.002200 -0.001481 -0.000109 
+0.004778 0.000005 -0.000438 0.005357 -0.001745 -0.005151 
+0.002298 -0.005120 -0.006568 0.001375 -0.005999 -0.011487 
+-0.002580 -0.005340 -0.014041 -0.008626 0.010410 -0.010336 
+-0.021232 -0.002716 0.005826 -0.018078 -0.016434 0.021364 
+-0.001286 -0.011714 -0.001286 0.001600 -0.005205 -0.005906 
+-0.003025 -0.001344 -0.005816 -0.001945 -0.000727 0.000896 
+0.008222 0.001946 -0.002952 0.017691 0.007754 -0.016451 
+0.011996 -0.001726 -0.017036 0.000496 0.001673 0.000713 
+-0.001351 0.003691 0.001961 0.001480 0.004408 -0.000174 
+0.003515 0.003271 -0.001809 0.002449 0.000743 -0.001339 
+-0.000736 0.001431 -0.000203 0.001418 0.002035 -0.000540 
+0.001613 0.001806 -0.000553 -0.001344 -0.002039 -0.001224 
+-0.004438 0.000485 -0.002371 -0.001956 0.005662 -0.004320 
+0.001825 0.008131 -0.004635 0.006793 0.002912 -0.004208 
+0.007078 0.001159 -0.001482 0.001755 -0.000201 -0.000797 
+-0.004114 0.002641 -0.003437 -0.002949 -0.002949 -0.005726 
+-0.005761 -0.001394 -0.002184 -0.001680 -0.000286 -0.000099 
+0.001140 -0.000521 -0.002085 0.001450 -0.001620 0.000114 
+0.000692 0.000118 0.000719 0.003976 0.003201 0.000905 
+0.000833 0.001475 -0.004425 0.000518 0.000532 -0.000340 
+0.000728 0.000882 0.000299 -0.000375 0.003247 0.001108 
+-0.000331 0.006124 -0.004138 -0.002988 0.000072 -0.000462 
+-0.002774 0.000301 -0.000949 -0.001022 0.000716 -0.000093 
+0.000359 0.000745 0.001041 0.000078 -0.001447 0.000463 
+-0.002117 -0.003905 0.001181 -0.002412 -0.001924 0.002358 
+-0.001027 0.001398 -0.000590 -0.001264 0.004687 -0.000168 
+-0.001901 0.002896 -0.000597 -0.003083 -0.001334 -0.002802 
+-0.003007 -0.005578 -0.003854 0.010660 -0.008555 -0.002633 
+0.010230 -0.010249 0.002497 0.007899 0.005617 -0.011968 
+0.007850 0.010814 -0.007940 0.011253 0.010129 -0.004131 
+0.013577 0.012951 -0.012360 0.009163 0.004483 -0.013935 
+-0.002643 0.001081 -0.000656 -0.003647 0.006348 0.001193 
+-0.006870 0.005780 0.002678 -0.003118 0.007047 -0.010754 
+0.001361 0.005422 -0.006200 -0.004608 -0.009988 -0.000105 
+-0.011463 -0.015148 -0.010972 -0.002018 -0.041297 -0.084018 
+0.029045 -0.012729 -0.006408 -0.022574 0.057346 -0.107401 
+0.023221 0.032499 -0.035830 0.014681 0.004260 -0.005448 
+0.016131 -0.000583 -0.006154 0.010536 0.005385 -0.006206 
+0.001569 0.000185 0.004767 -0.008655 -0.005564 0.009195 
+-0.015106 -0.001672 0.007524 -0.009577 0.004685 -0.002786 
+-0.006000 0.004000 -0.001868 -0.003583 0.002121 0.002758 
+-0.004310 -0.000897 0.007690 -0.017867 -0.006691 0.020077 
+-0.029118 -0.001800 0.018527 -0.035415 0.007895 0.011953 
+-0.035375 0.001700 0.011581 -0.011158 -0.011235 -0.000539 
+0.010943 -0.003524 -0.002108 0.015686 0.001307 -0.017647 
+0.029677 0.009262 0.000770 0.025269 0.015266 -0.004049 
+0.003661 0.000835 -0.003005 -0.003482 -0.002012 0.003561 
+-0.002015 0.001710 0.001940 0.003430 0.005118 -0.000817 
+0.003846 0.004276 0.000415 -0.000897 0.002397 -0.000399 
+-0.000557 0.000192 -0.002354 0.002015 0.001668 -0.001804 
+0.003889 0.009467 -0.000998 0.005795 0.008101 -0.006805 
+0.006594 0.006551 -0.002791 0.005135 0.006114 -0.002123 
+0.005841 0.004272 -0.002322 0.003165 0.002899 -0.000098 
+0.000648 -0.001500 -0.004317 0.000872 0.000533 -0.000585 
+-0.000355 0.002135 -0.000277 0.002535 0.000422 -0.003697 
+0.001011 0.002060 -0.001107 0.000174 -0.001653 0.000870 
+0.000660 -0.001347 0.002703 0.002103 0.001845 0.002659 
+0.000336 -0.000810 -0.003871 -0.001982 0.001455 0.000119 
+-0.003494 0.004806 -0.000286 -0.003360 0.004618 -0.000029 
+-0.004081 -0.000289 -0.006283 -0.002820 0.000285 -0.002732 
+-0.002316 0.000530 -0.000981 -0.001060 0.000689 0.000595 
+-0.000912 -0.001493 0.000849 -0.000192 -0.002831 0.002334 
+0.000747 -0.000678 0.002732 0.000283 -0.000206 -0.000354 
+-0.001161 -0.001189 -0.001033 -0.002460 -0.001141 -0.001450 
+-0.001529 -0.001128 -0.001554 0.001404 0.001305 0.001016 
+0.009663 0.013777 -0.004089 0.010573 0.005903 0.003417 
+0.014996 -0.012761 0.007344 0.017642 -0.004330 0.005871 
+0.046251 0.007981 -0.028294 0.031609 0.018321 -0.044644 
+0.008590 0.003284 -0.040952 0.003786 0.000628 -0.028505 
+0.004714 0.001571 -0.008571 0.001840 -0.008824 0.009467 
+-0.007411 -0.010868 0.001639 -0.004407 -0.006124 -0.000705 
+-0.023057 0.049893 -0.034635 -0.007113 -0.000820 0.010112 
+-0.011503 -0.013506 0.034242 -0.011089 -0.011624 0.027852 
+0.013889 -0.022781 0.063792 0.045997 0.016659 -0.035465 
+0.030469 0.013973 -0.043108 0.012346 0.005223 -0.014719 
+0.004038 0.004147 -0.005665 0.005664 0.005366 -0.018143 
+0.012941 0.025588 -0.006471 -0.002903 0.036724 -0.026931 
+-0.011832 0.019609 -0.015990 -0.008543 0.002065 0.001134 
+0.008830 -0.012343 0.006845 0.022140 -0.037783 0.008975 
+0.005809 -0.065344 0.032592 -0.003780 -0.052208 0.044905 
+-0.017624 -0.031319 0.031445 0.001660 0.014199 0.013456 
+-0.000881 0.025041 -0.012219 -0.008591 0.009260 -0.003210 
+0.004121 0.000613 -0.002569 -0.010711 -0.015303 0.005890 
+-0.001556 0.007778 -0.014778 0.058484 0.003398 -0.066291 
+-0.007693 -0.007735 0.008032 -0.008599 -0.002440 0.008625 
+-0.001444 0.001635 0.001545 0.003046 0.003235 0.000414 
+0.002897 0.002260 0.000111 0.000091 0.001157 0.000079 
+-0.001541 0.000994 -0.002964 -0.001548 0.001772 -0.005393 
+-0.001058 0.002814 -0.006109 -0.002247 0.002809 -0.000562 
+-0.000001 0.002709 -0.000302 0.001593 0.002783 0.000751 
+0.005034 0.002179 -0.002248 0.003025 -0.000987 -0.002736 
+-0.003490 -0.000751 -0.003174 -0.003036 -0.002321 -0.002321 
+0.000855 -0.002384 -0.002729 0.004745 0.000736 -0.002550 
+-0.000216 0.001727 0.001429 -0.000408 0.002739 0.003690 
+-0.002089 -0.000529 0.004336 -0.001372 -0.002477 0.002041 
+0.000695 0.000862 0.000016 0.002797 0.001482 0.000534 
+0.002508 0.002189 0.000589 0.002471 -0.001647 -0.011062 
+-0.001440 -0.003927 -0.003613 -0.000648 0.000119 -0.000204 
+0.001160 0.004437 -0.002052 0.000451 0.002925 -0.004768 
+0.001118 0.000561 -0.004040 0.002915 -0.002110 -0.001554 
+0.006236 -0.003343 -0.000215 0.006285 -0.003576 -0.002107 
+-0.000493 -0.004864 -0.005015 -0.001629 -0.006710 -0.008442 
+0.000219 -0.007487 -0.005264 -0.000166 -0.000418 0.000174 
+-0.001647 -0.000742 -0.000076 0.001937 -0.003361 0.002672 
+0.005424 -0.000241 0.001979 0.007467 0.018412 -0.009591 
+0.015736 0.038898 -0.041997 0.014234 0.040056 -0.059223 
+0.017621 0.016466 -0.029022 0.021598 0.000376 -0.013791 
+0.019182 -0.012672 0.016592 0.008865 -0.008682 0.022915 
+0.006151 -0.003005 0.005345 0.008182 0.030525 -0.048510 
+-0.004404 0.082151 -0.089456 -0.004572 -0.007280 0.018105 
+-1.055556 -2.162037 4.027778 -1.269360 -2.478114 4.659933 
+-1.321168 -2.474452 4.375912 -1.237805 -2.445122 3.597561 
+-0.007231 -0.012764 0.006424 0.000544 0.005668 -0.001744 
+0.003454 0.001252 -0.001203 -0.001160 -0.001137 0.000143 
+0.001310 0.007253 -0.011891 0.031550 0.001587 -0.031656 
+-0.003593 -0.008717 -0.010685 -0.006183 -0.001869 -0.008123 
+-0.004789 0.006369 -0.021507 -0.006292 0.018360 -0.015349 
+-0.011620 0.003074 0.002301 -0.007447 -0.003716 0.003552 
+0.007774 0.005504 -0.003332 0.063686 0.046497 -0.025849 
+0.017551 0.033867 -0.055702 -0.000101 0.014601 -0.010895 
+0.002880 -0.000555 0.000423 -0.003604 -0.005441 -0.000235 
+-0.013327 -0.020889 -0.011624 -0.026400 0.002278 0.020339 
+-0.012367 -0.000226 0.013350 -0.000461 0.000325 0.000426 
+0.005659 0.000283 -0.002551 0.004640 -0.000422 -0.003035 
+0.000985 -0.000268 -0.001725 0.001154 0.000698 -0.000704 
+0.000706 0.002890 0.000663 0.001197 0.007060 -0.006202 
+0.006005 0.003532 -0.008600 0.001909 -0.000869 -0.003403 
+0.001756 -0.000922 0.000158 0.004021 0.002445 -0.001684 
+0.000776 0.003724 0.001051 -0.001962 -0.001529 -0.000530 
+-0.001402 -0.003687 -0.001523 -0.002987 0.002094 -0.001498 
+-0.003596 -0.002122 0.002653 -0.002808 -0.003990 -0.000794 
+-0.000217 0.000347 0.000255 0.004217 0.002077 -0.001028 
+0.004878 0.004121 -0.002328 0.000377 0.002531 -0.001081 
+0.002037 0.001502 -0.001988 0.003025 0.002093 -0.002986 
+0.003385 -0.001203 -0.002801 0.002759 -0.000965 0.000441 
+0.003751 0.003972 0.001241 0.004095 0.003565 -0.003346 
+0.002564 -0.001000 -0.001671 0.002266 -0.001002 0.000696 
+0.000996 0.000863 0.001444 0.001204 0.000405 0.000858 
+0.003585 -0.005129 -0.001962 0.015204 -0.020190 -0.010703 
+0.036858 -0.028269 -0.034861 0.015598 0.001649 -0.014069 
+0.001205 0.006670 -0.001879 0.003560 0.004340 -0.004644 
+0.008381 0.007120 -0.004268 0.006427 0.009790 -0.003948 
+0.003180 0.010400 -0.008192 -0.003633 0.011647 -0.020586 
+-0.010716 0.018468 -0.025741 -0.000825 0.015594 -0.020454 
+0.001825 0.011041 -0.014456 -0.002286 0.005550 -0.006979 
+-0.007034 0.002559 -0.002166 -0.005669 0.001865 -0.002370 
+-0.003009 0.004874 -0.013324 0.014657 0.019444 -0.046334 
+0.007755 0.046445 -0.059073 -0.008424 -0.013017 0.036276 
+-1.552941 -2.705882 5.254902 -1.531969 -2.982097 5.304348 
+-1.511222 -2.992519 4.955112 -1.458484 -2.761733 4.245487 
+-0.008764 -0.019896 0.025152 0.002593 0.007800 -0.007262 
+0.003860 0.019255 -0.009070 0.000658 0.001603 0.000086 
+0.000632 -0.002259 -0.003028 -0.000844 0.000633 -0.013079 
+-0.004164 0.002826 -0.008208 -0.010468 0.000898 0.001282 
+-0.008028 0.007659 -0.011751 0.001277 0.021828 -0.029281 
+0.004941 0.014182 -0.014464 0.001208 0.004316 -0.002854 
+-0.005617 0.003855 -0.005376 -0.009003 0.005664 -0.013445 
+-0.002933 0.010070 -0.018791 0.011611 0.002162 -0.011694 
+0.005585 0.006879 -0.002470 0.001203 0.003379 -0.002155 
+0.012349 -0.005185 -0.008042 0.004616 0.004060 -0.006062 
+0.001808 -0.010246 -0.000868 -0.005699 -0.001247 0.003867 
+-0.005962 -0.001815 0.003069 0.000926 -0.001257 -0.001720 
+0.007929 0.001205 -0.006090 0.009023 0.000914 -0.005139 
+0.006094 0.000066 -0.000503 0.006243 0.003746 -0.005182 
+0.005278 -0.002279 -0.003799 0.001712 -0.000761 -0.011091 
+0.003304 0.003468 0.000267 0.001088 -0.000223 0.000448 
+0.000578 -0.002423 0.000809 0.000319 -0.000908 0.000108 
+0.000520 0.000011 -0.003648 -0.000723 0.000615 -0.002744 
+-0.000250 -0.000143 -0.001570 -0.004399 -0.002100 0.000123 
+-0.006696 -0.006297 0.000945 -0.003615 -0.005148 -0.001299 
+0.000491 -0.001854 -0.000917 -0.000413 0.000470 0.000016 
+-0.004664 -0.003794 -0.002164 -0.000816 -0.000998 -0.004080 
+0.000523 0.002449 -0.003414 0.001110 0.001706 -0.003603 
+0.000490 0.000418 -0.003522 0.002212 -0.001934 -0.004091 
+0.003154 -0.003070 -0.002098 0.003777 0.003162 0.003924 
+0.001486 0.005518 0.004304 -0.000801 -0.000432 -0.000701 
+-0.001361 -0.001535 -0.001489 0.011815 0.066250 0.003657 
+0.106009 0.123979 -0.101310 0.020118 0.027471 -0.034566 
+0.004504 -0.000350 -0.010994 0.003318 0.002900 -0.005589 
+-0.000668 0.011287 -0.001910 0.002926 0.020884 -0.005924 
+0.011292 0.023953 -0.014902 0.010792 0.018459 -0.021545 
+0.005101 0.013184 -0.013252 -0.000828 0.010650 -0.007153 
+0.001727 0.009463 -0.006177 0.005479 0.007475 -0.005454 
+0.000866 0.005465 -0.002208 -0.000945 0.003149 -0.007910 
+0.001153 0.014299 -0.029457 -0.002428 0.024136 -0.050772 
+0.001098 0.016170 -0.020311 -0.009862 -0.007459 0.026155 
+-1.287611 -2.738938 5.389380 -1.562500 -3.287500 5.803125 
+-1.573134 -3.319403 5.385075 -1.350000 -2.950000 4.330769 
+-0.005132 -0.017044 0.021818 0.001686 0.002974 -0.010523 
+0.002232 0.003090 -0.013750 -0.004070 0.000706 -0.004029 
+-0.003497 0.005528 -0.003844 -0.005292 -0.004146 -0.006574 
+-0.013205 0.002796 0.003639 -0.011691 0.001840 0.011227 
+-0.009442 0.001224 -0.000132 -0.003956 0.006893 -0.020514 
+-0.001220 0.021615 -0.033748 0.001591 0.023140 -0.012103 
+-0.004541 0.008251 -0.002062 -0.004454 0.002460 -0.002154 
+-0.002959 0.001736 -0.003253 -0.001487 0.001892 -0.003558 
+-0.001799 0.006464 -0.005011 0.013272 -0.005193 -0.026500 
+0.033237 0.022068 -0.039141 0.008454 0.011642 -0.016633 
+-0.000680 -0.000805 -0.000317 -0.003834 -0.001116 0.001532 
+-0.002277 -0.001260 -0.000594 0.002479 0.002344 0.001441 
+0.002513 0.004096 0.002724 -0.001668 0.000897 0.002416 
+-0.004314 -0.003281 0.001551 -0.004137 -0.001739 0.002327 
+-0.002961 -0.000570 -0.000979 0.002029 -0.000195 0.003204 
+0.005562 0.000153 0.002037 0.004737 0.001002 -0.000513 
+0.005598 0.001998 -0.003554 0.002900 -0.001115 -0.004455 
+-0.002033 0.000590 -0.002866 -0.001225 0.004942 -0.005006 
+0.003099 0.000692 -0.002901 -0.001196 -0.002878 -0.001581 
+-0.000953 -0.003934 -0.002236 -0.000456 -0.001219 -0.001243 
+-0.001271 0.002272 0.000319 0.000335 0.002340 0.001087 
+-0.001839 -0.002698 -0.003098 -0.003501 -0.002890 -0.003578 
+-0.004377 -0.001042 -0.002174 -0.002473 0.000745 0.000064 
+0.002303 0.000264 0.002330 0.004223 0.001572 0.003690 
+-0.002386 0.006412 0.003336 -0.001382 0.000266 0.000035 
+0.004547 -0.009292 -0.000569 0.001381 -0.009820 -0.001295 
+-0.004490 0.008990 -0.003044 -0.003043 0.009870 -0.023441 
+0.011460 0.006858 -0.001303 0.000135 0.046678 -0.035868 
+0.001211 0.005445 -0.015524 0.003073 0.004726 -0.007788 
+0.008495 -0.001513 -0.003402 0.008214 0.012088 -0.001839 
+0.008221 0.018858 -0.009408 0.007302 0.021784 -0.014301 
+0.006736 0.020193 -0.013921 0.004699 0.014002 -0.011549 
+-0.004637 0.000976 -0.002929 -0.003680 0.003217 -0.006036 
+-0.003692 0.005055 -0.000706 0.000625 0.003847 0.002322 
+-0.000306 0.004752 -0.006088 0.008690 0.011773 -0.024947 
+0.002456 0.007159 -0.011760 -0.006805 -0.007440 0.023696 
+-1.322581 -2.606452 4.916129 -1.543147 -3.517766 5.659898 
+-1.370558 -3.538071 5.101523 -0.812903 -2.645161 3.509677 
+0.000339 -0.005800 0.006216 0.000745 0.008421 -0.009934 
+0.000129 0.002309 -0.002730 0.007541 -0.012490 -0.003265 
+-0.005284 -0.000994 -0.001506 -0.005268 0.001156 -0.008489 
+-0.002133 0.002461 0.002400 -0.002731 -0.000604 0.004222 
+-0.001463 0.002270 -0.003830 -0.001813 0.007574 -0.014081 
+-0.004811 0.011518 -0.017191 -0.002047 0.012673 -0.013328 
+-0.001810 0.010190 -0.008381 -0.002599 0.005963 -0.006472 
+-0.001697 0.001815 -0.003975 -0.005392 -0.008469 -0.002009 
+-0.006446 -0.019624 -0.000979 0.003213 -0.005090 0.001382 
+0.081333 -0.013836 -0.036895 0.069927 0.048958 -0.092928 
+0.015007 0.010694 -0.041338 -0.016471 0.001192 -0.006231 
+-0.018137 -0.007734 0.016319 -0.004108 0.013206 0.020778 
+-0.000439 0.009738 0.006235 0.000777 0.003162 0.001299 
+0.003284 0.001952 -0.002103 0.004668 0.003664 -0.002984 
+0.004281 0.003665 0.000674 0.001311 0.003897 0.001178 
+0.000505 0.001863 0.000439 0.001518 -0.000501 0.000104 
+0.004124 -0.001393 -0.001718 0.004018 -0.001176 -0.003105 
+0.003170 -0.001023 -0.001962 0.001374 -0.000789 0.001306 
+0.001992 0.000254 0.002500 0.002924 0.000731 0.003216 
+0.003326 0.001246 0.002116 0.001027 0.000209 0.000176 
+-0.002673 -0.002122 -0.000533 -0.004803 -0.003217 -0.000661 
+-0.006627 -0.003807 -0.005499 -0.005244 -0.007793 -0.009921 
+0.002303 -0.006248 -0.008571 0.013993 -0.003098 -0.002892 
+0.017800 0.001351 0.001918 0.005705 0.009417 0.003161 
+0.003029 0.004442 -0.000600 0.006804 0.000290 -0.000843 
+0.000138 -0.002594 0.000139 -0.008214 -0.007827 -0.002341 
+-0.018301 -0.002890 -0.003112 -0.011815 0.004532 -0.005222 
+0.000749 -0.027474 -0.013538 -0.009105 -0.014221 -0.039302 
+-0.001565 0.010905 -0.007267 0.001498 0.010807 -0.004750 
+0.003626 0.008248 -0.002129 0.005318 0.003257 -0.004659 
+0.002824 0.002254 -0.000182 0.003253 0.001629 -0.001406 
+-0.002150 0.001583 -0.008866 -0.002593 0.004824 -0.004150 
+-0.002914 0.002162 0.000284 -0.000299 -0.000073 0.000861 
+0.002550 -0.007352 0.002326 0.007232 -0.005242 0.002661 
+0.004935 -0.000090 0.000336 0.000228 0.005459 -0.006149 
+0.002501 0.003975 -0.005800 -0.001690 -0.002097 0.007847 
+-0.002775 -0.008281 0.020557 -0.005708 -0.013229 0.030018 
+-0.006785 -0.012950 0.028532 -0.006307 -0.003918 0.011050 
+-0.002848 0.005868 -0.007210 0.006874 0.007615 -0.004484 
+0.005480 0.002965 -0.006688 0.002495 0.001455 -0.004572 
+0.004235 0.000035 -0.004565 -0.002462 0.007933 -0.001525 
+0.000915 0.003904 0.000511 0.000150 0.000638 -0.000520 
+0.003913 0.000595 -0.004062 0.003220 -0.002405 -0.004651 
+0.001709 -0.000289 -0.003576 -0.001037 -0.000701 -0.003417 
+-0.000166 0.001976 -0.004120 -0.000068 0.000752 -0.004995 
+0.001275 0.006212 -0.001910 0.001887 0.005683 -0.000608 
+0.001686 0.003832 0.001321 0.014014 -0.021391 0.018153 
+0.120456 0.023873 0.035468 0.012571 0.006286 -0.124286 
+-0.154754 -0.074614 0.027635 -0.068876 -0.012788 0.021376 
+-0.017048 -0.018190 0.018762 -0.008926 -0.003708 0.019018 
+0.001078 -0.007097 -0.006589 0.008959 -0.001874 -0.006120 
+0.010903 -0.000077 -0.005601 0.004466 -0.001259 -0.003463 
+-0.003553 -0.000810 -0.000198 -0.004824 0.002203 0.002703 
+0.000702 0.003849 0.003605 0.005532 0.002536 0.001112 
+0.003879 -0.000853 -0.002028 0.002145 -0.002121 -0.002529 
+0.003835 -0.001054 -0.000076 -0.003614 0.006886 -0.001569 
+0.000533 0.009148 0.004497 0.003142 0.006537 0.002534 
+-0.004685 0.001208 0.000302 0.002967 -0.003670 0.007913 
+0.003320 -0.000645 0.007817 0.003720 0.002389 0.002550 
+0.025904 -0.007607 -0.006830 -0.013249 -0.015344 -0.011571 
+-0.002000 -0.014483 -0.012471 0.012865 -0.016758 -0.011529 
+-0.018203 -0.008738 -0.001092 -0.011461 -0.004675 0.003715 
+0.013711 0.008835 -0.004220 0.013284 0.011821 0.002157 
+0.004870 0.013937 0.005608 0.001890 0.017212 0.009834 
+-0.024795 0.040130 0.022785 -0.080233 -0.025282 0.070997 
+0.005559 -0.003861 0.000163 -0.014598 0.003115 0.009090 
+-0.007722 -0.002516 0.017320 -0.003945 -0.002189 0.011638 
+-0.004524 -0.002338 0.010188 -0.004807 -0.000454 0.010975 
+-0.006254 -0.002133 0.003714 -0.000995 0.003442 -0.005020 
+0.001472 0.006300 -0.011026 0.000111 0.003379 -0.008340 
+0.002411 -0.003388 0.000087 0.004432 -0.003082 -0.000645 
+0.005592 -0.001446 -0.002032 0.004853 0.000648 -0.001341 
+0.000928 0.001028 -0.001103 -0.000292 0.003289 -0.004497 
+0.001827 0.006839 -0.009267 0.003730 0.006251 -0.012822 
+0.003407 0.007143 -0.007143 0.000039 0.002171 -0.002197 
+-0.001289 0.001266 0.001963 0.001971 0.003997 -0.002010 
+0.000983 0.007365 -0.011540 -0.001410 0.000000 -0.013462 
+-0.003320 0.002691 -0.013356 -0.000376 0.003250 -0.007543 
+0.004343 0.002342 -0.004248 0.005068 0.003832 -0.007824 
+-0.001634 0.001451 -0.008157 0.001164 0.003794 -0.006691 
+0.001880 -0.000847 0.002335 0.003303 -0.001105 0.006276 
+-0.001479 -0.001727 0.004515 -0.003815 -0.001549 -0.000195 
+-0.000777 -0.001428 0.000721 0.001411 -0.002268 0.002075 
+0.000606 0.000212 -0.000748 -0.003726 0.005187 -0.008576 
+-0.009236 0.009578 -0.013376 -0.011376 -0.003240 -0.009285 
+-0.013638 -0.055957 0.027302 -0.025829 0.019371 0.032286 
+-0.044018 -0.126070 -0.035044 0.010000 -0.058464 -0.032480 
+0.105492 0.057221 -0.018130 0.045333 -0.033333 -0.016000 
+0.036482 -0.037803 -0.084447 0.006495 -0.001737 -0.006745 
+0.001902 0.008668 0.006744 0.001871 0.007060 0.005780 
+-0.002984 0.004345 0.004177 -0.012085 0.004623 0.003121 
+-0.012484 0.003204 0.003908 0.000676 0.000934 0.000918 
+0.009083 0.003767 -0.001061 0.007633 0.006332 0.001263 
+0.000419 0.005466 0.004218 -0.003728 0.004892 0.001067 
+0.001161 0.002290 -0.000350 0.003361 0.000194 0.001011 
+-0.000920 0.000399 0.000511 -0.008885 -0.002125 0.001073 
+-0.004792 -0.004087 0.006519 0.003553 -0.000241 0.003408 
+0.060635 0.032381 -0.024127 -0.027647 0.024314 0.034641 
+0.028571 -0.035143 0.070286 0.062876 -0.054379 -0.012288 
+-0.060836 -0.014022 0.016987 -0.017609 0.016663 0.005428 
+0.001313 0.012066 0.001149 0.007578 -0.003669 -0.002599 
+0.011673 -0.000984 0.004387 0.016926 -0.010213 0.019995 
+0.028519 -0.001019 -0.005093 -0.010052 0.010848 -0.009616 
+-0.001593 0.004619 -0.007369 0.000237 0.005180 -0.005981 
+-0.007762 0.000988 0.001278 -0.013171 -0.003878 0.002977 
+-0.008514 -0.001214 -0.003272 0.000955 -0.004462 0.001703 
+-0.004329 -0.011149 0.011043 -0.001009 -0.007026 0.013211 
+0.005074 -0.004705 0.004532 0.005055 -0.001896 -0.001895 
+0.002728 -0.000392 -0.002215 -0.000836 0.000499 -0.000272 
+-0.000781 -0.000408 0.001244 0.002185 -0.001773 0.001549 
+0.003747 -0.001647 0.001229 0.001384 -0.000615 0.000862 
+-0.002647 -0.000728 -0.000441 -0.004564 -0.001364 -0.001667 
+-0.003628 0.000288 -0.002015 -0.001633 0.002057 -0.003967 
+0.001331 0.004203 -0.007027 0.004585 0.005485 -0.008362 
+0.006326 0.003793 -0.008219 0.006258 0.002048 -0.007532 
+0.005244 0.002254 -0.006990 0.004485 0.002803 -0.005851 
+0.005063 0.003931 -0.004326 0.004960 0.007303 -0.004780 
+0.004260 0.013127 -0.008639 0.007527 0.019707 -0.011031 
+0.014167 0.017800 -0.007982 0.006668 0.004955 0.001918 
+0.002213 -0.000745 -0.002326 -0.013314 -0.008573 0.009129 
+-0.007012 -0.010040 0.009483 -0.002940 -0.004374 0.004333 
+-0.000065 0.000449 -0.000729 0.000580 0.001049 -0.007369 
+-0.001245 0.003150 -0.007249 -0.001882 0.001101 -0.006625 
+-0.016755 0.017333 -0.027227 -0.025714 0.018571 -0.055000 
+0.047040 0.031614 -0.029327 0.077875 0.011125 0.015000 
+0.087143 0.120179 -0.018036 0.005000 0.076923 -0.015385 
+-0.001528 -0.014028 -0.031111 0.006194 0.037973 -0.013619 
+-0.023004 -0.014146 0.054098 -0.009999 0.019993 0.062836 
+0.000640 0.015838 0.025294 -0.012021 0.022607 0.024982 
+-0.019695 0.052927 0.055823 -0.003678 0.023384 0.024226 
+-0.001396 0.002485 0.004704 0.000634 -0.001433 -0.002459 
+-0.001990 -0.003125 -0.001269 -0.005961 -0.003896 0.001185 
+-0.004252 0.000068 0.001868 0.002850 0.001510 -0.003920 
+0.011672 0.001687 -0.000885 0.006080 0.005705 -0.000974 
+0.000087 -0.002046 0.007054 0.003996 -0.005749 0.003944 
+-0.002337 0.075785 -0.047050 -0.001947 0.025497 -0.025204 
+0.002341 0.000486 0.001672 0.005047 0.023119 0.017008 
+0.007090 0.023048 0.033938 -0.022399 -0.014978 0.033078 
+-0.018288 -0.009566 0.005648 -0.005394 -0.004046 -0.006333 
+0.013953 -0.017689 0.004009 0.026337 0.004302 -0.020806 
+0.002476 0.021775 -0.022803 0.002794 0.003672 -0.006370 
+-0.000814 0.003186 -0.001451 -0.003510 0.007213 -0.002232 
+-0.008993 0.006995 -0.004548 -0.010421 0.000260 -0.006285 
+-0.008393 -0.001409 -0.001231 -0.005691 -0.000948 0.004979 
+-0.007184 -0.000930 0.005767 -0.007670 -0.002374 0.004469 
+-0.005140 -0.000620 0.002290 -0.002003 0.001551 -0.001174 
+-0.002008 0.004411 -0.003463 0.000753 0.006568 -0.003887 
+-0.001986 0.003435 -0.002826 -0.002638 -0.000722 -0.002505 
+0.000702 -0.002018 -0.000554 0.001416 -0.000046 -0.000305 
+-0.000302 0.003598 -0.001165 -0.000205 0.005242 -0.007276 
+-0.000450 0.005651 -0.011415 -0.001515 0.008861 -0.009926 
+-0.003484 0.008838 -0.006212 -0.004229 0.004486 -0.003669 
+-0.001091 0.001403 -0.001721 0.003030 0.001600 -0.003969 
+0.004976 0.005726 -0.007123 -0.001379 0.007555 -0.006876 
+-0.003532 0.004715 -0.006712 -0.001821 0.006440 -0.003667 
+0.000114 0.007599 -0.005620 0.000979 0.008161 -0.007196 
+0.000686 0.005946 -0.005741 0.000892 0.000720 0.000127 
+0.002873 -0.004916 0.007891 0.003652 -0.009487 0.005109 
+-0.002948 -0.004861 0.004188 -0.003165 -0.002480 0.000576 
+-0.001347 0.005005 -0.003908 0.001915 0.011690 -0.005074 
+0.000342 0.011517 -0.002540 -0.003391 0.007082 -0.018399 
+0.025800 0.036743 -0.046481 -0.002897 -0.010828 -0.003495 
+-0.005951 0.003401 0.016316 -0.062755 -0.057658 0.036088 
+-0.013437 -0.054469 0.014521 -0.022505 0.042283 0.042828 
+-0.041357 -0.033786 0.017571 -0.087105 -0.061316 0.090351 
+0.020408 0.051263 0.063837 0.001552 0.013125 0.003879 
+-0.017193 0.026140 0.008246 0.009307 0.002641 -0.018745 
+-0.051333 0.028000 -0.023333 -0.053158 0.010047 -0.011303 
+-0.025985 -0.007877 0.006674 0.029449 -0.002104 -0.029625 
+0.021151 0.005349 -0.011349 0.009527 0.002487 -0.005195 
+0.001632 -0.000315 -0.002310 -0.001592 -0.001950 -0.000242 
+-0.001568 0.001254 -0.000226 -0.000717 -0.000680 0.000688 
+0.000509 0.000644 0.000857 0.002642 -0.000189 0.000359 
+0.021260 -0.010962 0.003862 0.020625 -0.001633 0.000628 
+-0.004533 -0.002089 -0.000763 -0.014004 -0.000087 -0.004970 
+-0.029952 0.002222 0.002311 -0.021591 0.011104 0.003080 
+-0.017186 -0.000973 -0.013943 0.016208 -0.017252 -0.038249 
+0.059790 0.026713 0.023592 0.030251 -0.003633 -0.027249 
+-0.003977 -0.006844 0.011452 -0.001187 -0.006527 0.002456 
+-0.006486 -0.004083 0.000674 -0.007629 0.004388 0.000678 
+-0.012017 0.007405 -0.005593 -0.009844 0.001875 -0.016406 
+0.014677 -0.000183 -0.007479 0.008658 0.003067 -0.010281 
+0.001774 0.000842 -0.002674 -0.000651 -0.000645 0.002030 
+0.000168 -0.000104 0.002876 0.000205 0.000213 -0.001312 
+-0.001391 -0.000481 -0.000860 0.001636 -0.002441 -0.001911 
+0.001422 -0.001049 -0.001188 0.001336 0.000534 -0.000031 
+0.003196 0.001522 -0.004114 0.004970 0.001420 -0.006441 
+0.005462 0.003782 -0.001429 0.002379 0.003898 -0.001212 
+0.000118 0.005360 -0.002377 0.001657 0.007256 -0.003257 
+0.003501 0.005936 -0.002775 0.001122 0.002397 -0.000827 
+-0.000766 0.000098 0.000581 -0.000159 0.000125 0.000226 
+0.000084 -0.000273 -0.001416 -0.000392 0.000352 0.000038 
+-0.000169 0.000726 -0.000067 -0.002885 -0.001565 -0.000652 
+-0.002345 0.002451 -0.001312 0.001115 0.006195 -0.008301 
+0.003602 0.007575 -0.010393 0.002039 0.008756 -0.009034 
+-0.001414 0.005497 -0.006793 -0.004345 -0.002791 -0.002174 
+-0.003717 -0.005183 0.006083 -0.002241 0.003042 -0.003202 
+-0.004299 0.004804 -0.005003 -0.001712 -0.001323 0.002304 
+0.000810 -0.011562 0.007526 -0.000940 -0.023160 0.018203 
+0.001228 -0.055351 0.047982 0.003635 0.007510 -0.004290 
+-0.008607 0.000202 0.001620 -0.001422 -0.019438 -0.003437 
+0.013198 -0.042593 0.009698 -0.052000 -0.004160 -0.003120 
+-0.035960 -0.035556 0.053535 -0.031201 0.019462 0.017115 
+-0.045893 0.090536 -0.023571 -0.018179 -0.010205 0.013718 
+-0.003469 0.001518 0.016043 0.003546 0.025385 -0.039086 
+0.014593 0.085930 -0.127005 -0.030000 -0.005615 -0.061762 
+-0.008392 -0.041252 0.039839 -0.001681 0.005570 0.012690 
+-0.001154 0.009956 0.009265 0.009320 0.003458 -0.003028 
+0.012031 0.004354 -0.004632 0.009281 0.002986 -0.003101 
+0.004492 0.002267 0.000155 0.000877 0.001188 0.002453 
+0.001357 -0.001103 0.001733 -0.001195 -0.002521 0.002495 
+-0.015833 0.062725 -0.087815 0.028827 0.062177 -0.021480 
+0.009286 -0.010000 0.005714 -0.030279 -0.015958 0.063014 
+-0.015605 0.003954 -0.002994 -0.009467 -0.038667 -0.053067 
+0.051785 0.017155 -0.087054 0.037353 0.043562 -0.059084 
+-0.017513 -0.000989 -0.027135 -0.004747 0.005280 0.002835 
+-0.002563 0.004009 0.000503 0.002371 0.003585 0.002203 
+0.000212 0.000655 0.002820 0.001875 -0.001108 -0.000355 
+0.002587 -0.004444 -0.011030 0.024527 0.010027 -0.016880 
+0.005605 0.005599 -0.016810 0.001150 0.003658 -0.004132 
+-0.000684 0.000996 0.001159 -0.000839 0.001155 0.001011 
+0.000726 0.003688 0.000615 -0.002077 0.005471 -0.000033 
+-0.003711 0.005441 -0.002020 -0.004902 0.003867 -0.002563 
+-0.002870 0.005526 -0.002600 0.003364 0.009093 -0.001516 
+0.004569 0.008000 -0.005140 -0.000442 0.003255 0.000813 
+-0.004039 0.000563 0.001332 -0.001230 0.000683 0.000592 
+0.004646 0.000538 -0.000125 0.006111 0.007529 -0.006220 
+0.004148 0.003222 -0.002210 0.000622 -0.002431 0.000565 
+-0.001239 -0.001502 -0.001061 -0.001636 0.000091 -0.000340 
+0.000382 0.002406 0.001035 0.002535 0.001758 0.000698 
+0.001393 0.000255 0.000118 -0.000594 -0.000962 -0.000585 
+-0.000978 0.000508 -0.001467 0.004090 0.004875 -0.002768 
+0.000058 0.001682 0.001044 0.002655 0.006874 -0.006212 
+-0.000444 0.002825 -0.002730 0.000041 -0.000068 0.000089 
+0.002443 0.005855 -0.001502 -0.002044 0.009710 -0.004663 
+-0.006977 -0.000504 -0.003633 -0.004796 -0.003600 0.004292 
+-0.000899 -0.006814 -0.003418 -0.007590 0.001608 -0.009434 
+-0.019397 -0.041561 0.007519 -0.096022 -0.095778 -0.020489 
+-0.062475 -0.088473 0.077154 -0.054706 -0.070059 0.023353 
+-0.032107 0.003646 0.045968 -0.031875 -0.031875 -0.070000 
+0.035504 -0.030504 -0.052807 0.030076 0.047197 -0.043030 
+-0.098400 0.131200 -0.065455 -0.079811 0.017300 -0.054517 
+0.000000 0.000000 0.027143 -0.000707 -0.037211 0.185701 
+-0.028390 -0.082519 0.137311 -0.020000 -0.040000 0.040000 
+0.001424 -0.021864 -0.006970 0.029680 -0.000900 -0.010740 
+0.037468 0.012222 0.008816 -0.012348 -0.016960 -0.000090 
+-0.019244 -0.008838 0.005603 -0.004183 -0.001187 0.000912 
+-0.003128 -0.000844 0.000863 -0.002015 -0.000440 0.001894 
+-0.000433 0.000324 0.000964 -0.000493 0.001282 0.000428 
+-0.029282 -0.035120 -0.044880 -0.007066 -0.014991 -0.023470 
+0.000913 0.002895 -0.008607 -0.022533 -0.032895 -0.000362 
+-0.100936 -0.081075 -0.020112 -0.077273 -0.041529 0.022652 
+0.008254 -0.059139 0.014304 0.011609 -0.018730 0.005912 
+-0.019116 0.019462 -0.016475 -0.001077 0.003952 -0.010504 
+-0.006453 -0.005312 -0.000090 -0.010085 -0.001263 -0.009824 
+-0.010315 0.000387 -0.004728 0.001046 0.002077 -0.004618 
+0.001440 -0.003900 -0.002433 0.005954 -0.002183 -0.004698 
+0.003215 0.000398 -0.002991 0.001220 0.002873 -0.003613 
+0.002141 0.005790 -0.005081 0.006223 0.005029 -0.003435 
+0.001204 -0.001656 -0.003612 -0.002109 -0.000421 -0.003012 
+-0.003466 0.001077 -0.000562 -0.004038 0.001430 0.000614 
+-0.002901 0.001282 0.000255 -0.000527 0.002193 -0.000163 
+-0.000761 0.000468 0.000395 -0.003735 0.002615 -0.003217 
+-0.003762 0.002476 -0.002381 -0.002015 -0.001750 0.001188 
+0.000472 -0.005960 0.003873 0.000973 -0.004863 0.003884 
+-0.001137 -0.002266 0.001459 0.001372 -0.000483 -0.000064 
+0.002011 -0.001120 -0.000302 -0.000157 -0.001102 0.000000 
+-0.000534 0.000990 -0.000212 0.000013 0.002435 0.001232 
+0.001449 -0.000989 0.000052 0.002676 -0.001036 -0.000716 
+0.001171 0.000788 0.000281 0.001701 0.001261 -0.000607 
+0.001016 -0.000690 -0.001887 0.000168 -0.001883 0.000687 
+-0.001077 -0.002289 0.000533 0.000502 -0.000517 0.001098 
+0.000293 -0.002526 0.002967 -0.007944 -0.011703 0.008107 
+-0.005864 -0.017809 0.006080 -0.006510 -0.010052 0.003542 
+-0.002616 -0.003302 0.000636 0.000357 0.000009 0.000412 
+0.002975 0.004739 0.001978 -0.000721 0.043832 -0.005320 
+0.026883 0.078779 -0.016987 0.010997 0.022097 0.007159 
+0.002705 0.003418 0.002698 0.013131 0.009992 -0.005416 
+-0.044897 -0.081721 0.019561 -0.055344 0.001938 0.016920 
+-0.068659 0.064904 0.040766 -0.011667 -0.028333 -0.016667 
+0.164817 -0.012326 0.091495 0.038376 0.135983 0.092393 
+-0.086373 0.043039 0.097059 -0.082456 -0.004737 -0.080877 
+-0.049566 -0.036404 0.025707 -0.041648 0.001278 0.029352 
+-0.017468 -0.031367 0.013398 0.008736 -0.044509 0.005285 
+0.025200 -0.022000 -0.015200 0.014407 -0.005008 -0.005170 
+0.005346 -0.000492 -0.001508 0.001934 -0.000129 -0.001161 
+0.000791 -0.001294 -0.002364 -0.000991 -0.000946 -0.000251 
+-0.028128 0.010085 -0.011617 -0.013529 -0.000588 -0.010588 
+-0.013392 0.008129 0.005380 0.007890 0.015851 -0.000892 
+0.009719 0.012296 -0.002908 0.000256 0.027853 0.008141 
+-0.028887 0.017079 0.010296 0.009602 -0.010155 -0.004401 
+-0.004682 -0.004717 0.015668 -0.013018 -0.006038 0.002562 
+-0.009402 0.006182 0.001274 -0.010063 0.008425 0.006152 
+-0.004883 0.008241 -0.002033 -0.006958 0.004736 -0.008117 
+-0.001166 0.004624 -0.007654 0.000896 -0.000918 -0.000614 
+0.001253 -0.002230 0.000419 0.001666 0.000846 -0.002257 
+0.002944 0.004456 -0.002760 -0.000077 0.000028 -0.000048 
+0.001745 -0.000343 -0.002023 0.001443 0.000468 -0.002792 
+0.001354 0.002852 -0.002930 -0.000903 0.002319 -0.001611 
+0.000058 -0.001899 -0.001667 0.000565 -0.002011 -0.002088 
+-0.002867 -0.001818 -0.002859 -0.001622 -0.002106 -0.001385 
+-0.000670 -0.001618 0.000064 -0.000841 -0.002895 0.001851 
+-0.000903 -0.001668 0.002754 -0.001300 0.000023 0.002297 
+-0.001260 0.000601 0.000218 0.000797 -0.000883 -0.000068 
+0.002853 -0.000413 0.000309 0.002385 0.000740 0.001391 
+-0.000199 0.001868 0.002232 -0.000406 0.002235 0.000720 
+-0.000491 0.001804 0.000366 0.002107 0.004775 -0.000263 
+-0.002365 0.002675 -0.004634 -0.005670 0.002261 0.000035 
+-0.001094 -0.002393 0.003282 -0.002343 -0.001367 -0.001983 
+0.000721 -0.001354 -0.000131 0.000687 0.004359 -0.003761 
+-0.002159 0.000362 -0.002583 -0.003202 -0.002860 -0.000011 
+0.001025 0.000350 0.000606 0.000886 -0.002677 -0.001354 
+-0.004203 -0.000919 0.000735 -0.004291 -0.005989 -0.003975 
+-0.002055 -0.032022 0.005221 -0.035868 -0.000863 -0.035560 
+-0.006519 0.054877 -0.044370 0.001235 -0.007040 0.004135 
+0.002048 -0.019810 0.008333 -0.006291 -0.024271 0.014959 
+-0.010753 -0.061959 0.048123 -0.029292 -0.115792 -0.032083 
+-0.082655 -0.060202 0.003454 -0.025196 0.073674 -0.020913 
+-0.009000 0.095100 -0.031700 0.020190 0.049619 -0.019762 
+0.040478 0.030144 -0.030431 -0.013235 -0.038571 -0.022059 
+-0.009146 -0.005854 0.004390 0.024199 0.047029 0.036682 
+-0.021652 0.006861 0.014960 0.005697 0.001615 0.001789 
+0.032456 0.002410 -0.005356 0.000932 -0.009789 -0.003136 
+0.001535 -0.009768 -0.000835 0.008519 -0.011125 -0.004278 
+-0.004649 -0.011579 -0.006510 -0.003129 -0.006324 -0.003322 
+0.060317 0.008254 0.010952 0.034966 0.046703 -0.034885 
+0.033284 0.016584 -0.027050 0.006728 0.000864 -0.007160 
+0.011113 -0.008508 -0.007185 -0.022605 0.007203 -0.005900 
+-0.034143 0.041289 0.035969 -0.010580 0.006997 0.005988 
+-0.000884 0.007306 -0.002013 -0.000284 0.005091 -0.000074 
+-0.003946 -0.002950 -0.003004 -0.009674 -0.008392 -0.007226 
+-0.005408 -0.001943 -0.006729 -0.001700 0.006472 -0.001639 
+-0.002223 0.003713 0.000218 0.002089 -0.003209 0.000360 
+0.004621 -0.003556 -0.001609 0.003222 -0.001519 -0.001447 
+-0.001042 -0.000777 -0.000364 -0.000102 0.001660 -0.003574 
+0.001604 0.000435 -0.006467 0.001386 0.001153 -0.009538 
+0.002323 0.006164 -0.009648 -0.002018 0.000396 -0.002703 
+-0.002202 -0.000350 -0.002616 -0.002732 0.000340 -0.001480 
+-0.000002 0.004014 -0.001544 0.000985 0.003909 -0.000612 
+-0.000327 0.000561 0.000327 0.000265 -0.001592 0.000734 
+0.000233 -0.000759 -0.001313 0.005876 0.001825 -0.003773 
+0.006290 0.000526 -0.000636 0.000656 -0.000414 0.000022 
+-0.002839 -0.002788 -0.002458 -0.004371 -0.000977 -0.003292 
+-0.005003 0.000248 -0.001718 -0.003104 -0.001319 -0.002023 
+-0.000792 -0.000039 -0.000087 0.002973 0.001892 -0.003514 
+0.004219 0.001192 -0.004934 0.002336 -0.001705 0.000580 
+0.001792 -0.003811 0.000088 0.000572 0.000212 0.000554 
+0.000041 0.002179 -0.003799 0.004206 0.003970 -0.004906 
+-0.000534 0.004271 -0.004374 0.004221 0.005189 -0.000606 
+0.008894 0.005450 0.001183 0.000166 0.000196 -0.000333 
+-0.000591 0.002747 -0.002516 -0.003652 -0.003740 -0.005519 
+-0.005320 -0.014525 0.008457 -0.017301 -0.053617 0.060896 
+-0.030400 -0.021000 0.060800 0.073750 -0.019672 0.054097 
+0.144188 0.011022 0.056906 0.144357 -0.007648 0.029643 
+0.060673 0.033041 0.049620 0.125714 0.121429 -0.008571 
+0.052000 0.115714 0.026000 -0.018727 0.053636 -0.081091 
+-0.062212 0.060788 0.005697 -0.030315 -0.190581 0.040218 
+0.075549 -0.107143 -0.015110 0.046667 -0.010000 0.113333 
+0.002000 0.002000 0.114000 -0.165778 -0.064889 0.093778 
+-0.083896 -0.006466 0.041285 -0.049067 0.028007 0.067056 
+0.001623 0.024311 0.025914 -0.014626 -0.025271 0.004125 
+-0.005839 -0.006640 -0.002828 0.010895 -0.002213 0.004831 
+0.022528 0.030399 0.008156 0.004126 -0.010166 -0.012383 
+0.002308 -0.026154 0.000000 0.011905 0.004476 -0.027524 
+0.021453 0.012137 -0.015812 0.001522 0.000830 -0.009481 
+-0.033040 -0.050420 -0.008045 -0.009641 0.015654 0.003406 
+-0.007204 0.009072 -0.002525 -0.007705 0.002774 0.000869 
+-0.002801 0.002215 -0.000172 0.001686 0.000192 0.000503 
+-0.001889 -0.001116 0.000459 -0.009435 -0.002275 -0.003227 
+-0.009881 -0.003964 -0.008119 -0.001056 -0.005197 0.002273 
+0.001097 -0.004765 0.002030 0.002517 -0.000861 -0.002719 
+0.000870 0.002315 -0.003444 -0.002023 0.001355 0.000587 
+-0.004167 -0.003001 0.000875 -0.000387 -0.004556 0.001053 
+0.002567 -0.001750 -0.001610 0.002204 0.001828 0.001055 
+-0.001043 0.003062 0.000697 0.000854 0.005079 0.001005 
+0.001634 0.003192 -0.001018 -0.000426 0.000563 -0.000529 
+-0.001383 -0.000315 -0.000628 -0.001044 0.000843 -0.001525 
+-0.001980 0.003800 -0.002426 -0.001172 0.004132 -0.003289 
+-0.001527 0.004088 -0.001900 -0.002439 0.003525 -0.000288 
+-0.000449 0.003615 0.000625 0.000441 0.004848 -0.000551 
+0.001169 0.001297 0.000718 0.000246 -0.002960 0.004376 
+0.003759 -0.005444 0.002593 0.000427 -0.001081 -0.000481 
+-0.000069 0.001733 -0.000694 -0.000260 0.001251 -0.000521 
+0.000222 0.000029 0.000088 0.000181 0.000055 0.000065 
+-0.000795 0.001117 -0.000600 -0.004475 -0.000801 0.001154 
+-0.002670 -0.005251 0.004788 -0.005658 -0.006507 0.000755 
+-0.002135 0.000169 -0.001733 0.002113 0.006747 -0.004025 
+0.002556 0.009344 -0.005228 -0.001265 0.007476 -0.005304 
+-0.002076 0.001298 -0.007606 0.002155 0.010962 -0.007610 
+0.003358 0.007266 -0.005909 -0.000319 -0.009869 0.012822 
+0.049098 0.031510 0.103510 -0.044659 0.022841 0.032727 
+-0.012653 -0.044694 0.019184 0.002088 0.009832 -0.004613 
+0.011333 0.016667 -0.005667 -0.014927 -0.018659 -0.069000 
+0.035143 -0.101829 -0.194343 0.043273 0.011273 -0.018182 
+-0.024216 0.096863 -0.026667 -0.029918 0.076461 -0.073128 
+-0.092727 0.064091 -0.021364 -0.009556 0.042222 0.019111 
+-0.027143 -0.067143 0.040000 -0.042612 -0.024204 0.030408 
+0.022212 -0.054303 -0.035788 0.052364 -0.101818 -0.026182 
+0.081818 -0.018182 0.009091 0.023502 -0.005171 -0.068629 
+-0.010267 -0.011791 -0.021255 -0.016717 -0.001777 -0.005729 
+-0.011354 -0.009469 -0.002568 -0.011946 0.001431 0.022384 
+-0.022222 -0.000817 -0.000490 0.001673 -0.030551 0.009347 
+0.024881 0.008929 0.022976 -0.002500 0.004358 -0.001307 
+-0.012568 0.021654 -0.009104 -0.005493 0.011152 -0.000710 
+-0.000094 0.007490 -0.003647 -0.006366 -0.002551 0.000234 
+-0.009761 -0.007772 -0.000439 -0.005672 -0.000487 -0.000129 
+0.000715 0.010506 -0.013257 0.009778 0.015111 -0.013556 
+-0.004146 0.005482 -0.011170 -0.001192 0.001292 0.001623 
+-0.001012 0.001644 -0.000436 -0.000290 0.001878 -0.003542 
+0.001369 0.001345 -0.002711 0.001207 -0.001034 0.000958 
+0.000498 -0.003537 -0.000095 -0.002039 -0.002052 -0.000006 
+-0.000865 0.000067 -0.000756 -0.001518 0.000229 -0.000839 
+-0.002242 -0.000515 0.000727 -0.001611 -0.002420 0.000439 
+-0.001060 -0.002435 -0.000576 -0.002422 0.000313 -0.002108 
+-0.001467 0.002799 -0.000869 -0.004140 0.000347 0.000516 
+-0.000450 -0.001110 0.000537 0.002144 -0.002074 -0.001924 
+0.001570 -0.002027 -0.001290 -0.001125 0.002191 0.000092 
+0.002234 0.008705 -0.001786 0.005304 0.010235 -0.003790 
+0.002903 0.007576 -0.001048 -0.001544 0.002651 -0.001628 
+-0.000765 -0.001262 -0.000899 -0.001288 0.000924 -0.000728 
+0.000040 -0.000386 -0.001199 0.001720 0.000694 -0.001198 
+0.001157 0.001045 -0.001132 0.000929 0.000232 -0.000465 
+-0.000405 0.000362 -0.000291 -0.004094 -0.001300 -0.001377 
+-0.006206 -0.003697 0.001241 0.000626 -0.002138 -0.000707 
+0.005371 0.004608 -0.000768 0.005052 0.010589 -0.000252 
+0.004810 0.011880 -0.001790 0.003120 0.010128 -0.003696 
+0.001444 0.007140 -0.001658 0.001473 0.001566 -0.002034 
+-0.000251 0.000408 0.002539 -0.001545 -0.003009 0.001238 
+-0.005858 -0.015539 0.011917 0.030684 0.111722 -0.158405 
+0.159583 0.161667 -0.002083 -0.036500 -0.018250 0.211250 
+-0.006213 -0.013265 0.001315 0.058381 0.097827 0.035765 
+0.043592 0.019357 -0.036275 0.006000 -0.002365 0.003311 
+0.024545 -0.013636 0.051818 0.005862 -0.014655 0.060000 
+0.101423 -0.019065 -0.088455 0.019231 0.003846 -0.046667 
+-0.117143 0.025616 0.010246 -0.007276 0.034472 -0.008171 
+0.021059 0.066941 0.030588 0.018565 0.051343 -0.056852 
+0.007521 0.034838 -0.008017 0.041410 0.003718 -0.022564 
+0.036469 0.003647 0.005833 0.017143 0.000109 0.001420 
+-0.000536 0.003512 0.001310 0.009867 0.015249 -0.020000 
+0.000935 -0.025516 0.008710 -0.013085 0.007412 0.011506 
+0.029055 0.028791 -0.014308 0.021198 0.061475 -0.007419 
+-0.022958 0.027731 -0.028702 0.001694 -0.002226 -0.008234 
+-0.000250 -0.000247 0.000168 -0.004147 -0.002629 0.000417 
+-0.005090 -0.001679 -0.000004 -0.007536 -0.000369 -0.001810 
+-0.006196 -0.004004 -0.004020 -0.003422 0.000721 -0.004231 
+0.003397 -0.002231 -0.006536 0.004263 -0.002474 -0.005232 
+0.002047 -0.001085 -0.001814 -0.000676 -0.000249 0.000660 
+-0.000443 -0.000658 -0.000958 0.000188 -0.001716 0.000962 
+0.000040 -0.000675 -0.001270 0.000255 -0.001786 -0.001021 
+-0.000435 -0.001435 -0.001435 0.001798 0.003904 -0.000526 
+0.004557 0.005004 -0.000050 0.001684 0.003630 0.000875 
+-0.000135 0.004501 0.001213 0.001019 0.006944 0.002130 
+0.004361 0.009023 0.000038 0.003858 0.007724 -0.003378 
+0.001233 0.004414 -0.000095 -0.002457 0.000115 0.000171 
+-0.002709 -0.001850 0.001393 0.000409 0.000162 -0.000613 
+0.001832 0.002250 -0.003177 0.000487 0.000812 0.000289 
+0.000025 -0.001385 -0.001365 0.000968 -0.001951 -0.001248 
+0.000749 -0.001342 -0.000396 -0.000131 0.000878 0.000263 
+0.000493 0.001654 0.000215 0.002006 0.001540 -0.003286 
+0.005253 0.001405 -0.003820 0.000000 0.001475 0.000000 
+-0.001977 0.000565 -0.002316 -0.000354 -0.000771 -0.001205 
+0.004246 -0.001101 -0.002345 0.004362 -0.001589 -0.004464 
+-0.000396 -0.002775 -0.003568 -0.002497 -0.003091 -0.002557 
+-0.003242 -0.002654 -0.001450 -0.003255 -0.002019 -0.001475 
+-0.003623 -0.003720 -0.000740 0.000335 0.003444 0.002802 
+-0.005333 0.000317 0.001299 0.001761 0.003947 -0.000557 
+-0.000646 -0.001480 0.002756 -0.026663 -0.007115 -0.048742 
+-0.091882 -0.051788 -0.165390 0.049980 -0.051663 0.058591 
+0.099404 -0.051596 0.038246 -0.000405 -0.028554 -0.020570 
+-0.109626 -0.062725 -0.059560 -0.025490 -0.008284 0.029951 
+-0.048424 0.127030 -0.005970 -0.039603 0.030159 0.027540 
+-0.008316 -0.058105 0.027684 -0.055000 0.000000 0.012500 
+-0.056966 0.101517 -0.008276 -0.032994 0.035756 0.001657 
+0.067917 0.015417 0.004583 0.031327 -0.018878 -0.012653 
+0.002168 0.068591 -0.066965 -0.003547 0.050717 -0.075189 
+-0.022308 0.011250 0.002788 0.000652 0.010252 0.005704 
+0.008340 0.009582 0.011069 0.017460 -0.007790 0.023907 
+-0.002912 0.023945 0.014237 -0.003452 0.003973 -0.004817 
+-0.010888 0.009957 0.001251 0.004269 -0.003392 -0.024620 
+-0.002557 0.020967 -0.046412 -0.001608 0.001395 0.003382 
+-0.003687 -0.000297 0.002683 0.000162 0.000582 -0.000222 
+0.002744 0.003367 -0.002013 0.002906 0.003906 -0.002510 
+0.002233 0.002652 -0.002165 0.004450 -0.001151 -0.001343 
+0.002261 -0.001016 -0.002738 0.002451 0.001771 -0.004630 
+0.003041 0.003468 -0.005078 0.003450 0.001610 -0.002702 
+0.000545 0.000414 -0.000868 0.001361 -0.001526 0.001877 
+-0.001551 -0.004446 -0.000758 -0.002798 -0.004079 -0.001546 
+-0.000413 -0.001464 -0.000612 0.002259 0.006835 0.000232 
+0.002124 0.011113 -0.002223 0.003363 0.007767 -0.000555 
+0.003628 0.002105 0.000105 0.002832 -0.000130 -0.000007 
+0.001633 0.001504 -0.000136 0.000578 0.002606 0.000242 
+-0.000306 0.001207 0.000487 -0.000042 -0.002373 0.000037 
+0.000386 -0.004110 0.001112 -0.001777 -0.003715 0.001841 
+0.000400 -0.002902 -0.001135 0.001037 -0.002718 -0.000365 
+0.001124 -0.002600 -0.000262 0.001452 0.000417 0.000305 
+0.001793 0.005653 -0.000938 0.002362 0.007444 -0.003026 
+0.003349 0.003809 -0.004334 0.001465 0.000365 -0.002510 
+0.000942 -0.000019 -0.001052 -0.002589 -0.001112 -0.000401 
+-0.001517 -0.000380 -0.001313 0.000820 0.000523 0.000573 
+0.002437 0.002778 0.000281 0.003849 0.005300 -0.000095 
+0.006406 0.004119 -0.001081 0.005485 0.002456 -0.004177 
+0.001453 0.002518 -0.001646 -0.001501 -0.002222 0.001011 
+-0.002550 -0.003516 0.000818 0.000829 0.003076 -0.002029 
+-0.002081 0.009981 -0.000835 0.005914 0.006672 -0.004954 
+0.001754 0.001209 0.005099 -0.000388 -0.002172 0.009485 
+0.041977 0.038026 -0.034816 0.054230 0.009259 -0.056209 
+-0.021674 0.034067 0.012911 0.009371 -0.002550 -0.010617 
+-0.015731 -0.012457 -0.020549 -0.039306 -0.041528 -0.005556 
+0.006473 0.011763 -0.003551 0.089253 0.115977 -0.004540 
+0.010737 0.014211 0.017789 0.001111 -0.030317 -0.058413 
+-0.050476 0.022063 0.034762 -0.132284 -0.062160 0.017531 
+-0.069571 -0.102714 0.012143 -0.008811 -0.035664 -0.044615 
+0.072581 -0.003308 -0.053350 0.048664 -0.019723 -0.004502 
+0.012827 -0.025635 -0.004597 0.009445 -0.002155 0.002230 
+0.011457 -0.005642 -0.000723 0.023490 -0.006555 -0.010780 
+0.001385 0.005555 0.000880 0.002166 0.003920 -0.002311 
+0.002139 0.002974 -0.001571 0.002522 0.004209 -0.001552 
+0.003007 0.006354 -0.002241 0.003084 0.005603 -0.002270 
+0.002881 0.003406 -0.001252 0.002260 0.000841 0.000155 
+-0.007048 -0.003374 0.000478 -0.024997 0.003510 -0.015579 
+-0.037605 -0.022107 -0.008659 -0.104583 -0.117699 -0.022361 
+-0.029905 -0.044631 0.002037 -0.026156 -0.024987 0.000468 
+-0.009127 -0.031545 0.017657 -0.021820 -0.028759 0.021383 
+-0.016389 -0.005666 0.031245 0.072222 0.039099 -0.070377 
+0.052468 0.034675 -0.031299 0.037361 0.073056 -0.073889 
+-0.051605 -0.054049 0.020914 -0.048352 -0.014560 0.037088 
+-0.027383 0.045592 0.022865 -0.024145 0.002105 0.066118 
+-0.115341 -0.039091 0.051477 -0.054367 -0.019384 0.034906 
+-0.002198 0.023951 -0.028840 -0.000545 0.000727 -0.060000 
+-0.030513 0.019487 -0.011026 -0.021437 0.053592 -0.059167 
+-0.084583 -0.117083 0.104167 0.067917 -0.119583 -0.051667 
+-0.010000 -0.085772 0.068618 -0.086794 -0.004895 0.018693 
+0.070479 0.003855 0.005689 0.065472 0.003270 0.030189 
+0.022774 0.006496 0.015285 0.008357 -0.004286 -0.002786 
+0.032485 -0.048606 -0.032606 0.019495 -0.003939 0.002929 
+0.062168 0.013021 0.022909 0.042931 0.015073 0.004834 
+0.012222 0.013444 0.034222 -0.027364 -0.005788 -0.008788 
+-0.121602 -0.053953 0.012300 -0.050248 -0.024628 0.037190 
+0.016222 0.003778 0.024889 0.032000 -0.102000 0.000000 
+-0.001333 0.017467 -0.012067 -0.001000 -0.047000 -0.003000 
+0.067725 -0.116455 -0.143545 0.003645 -0.008183 -0.040984 
+-0.010608 0.002557 0.006256 0.000936 -0.004262 -0.009095 
+-0.009080 0.013263 -0.008876 -0.011981 0.004893 -0.013010 
+-0.007522 -0.009469 -0.002205 -0.001786 -0.002028 -0.000190 
+0.006084 -0.007026 0.012792 0.018600 -0.005859 -0.008743 
+0.008718 -0.000098 -0.015752 0.001955 0.001623 0.006903 
+-0.003085 0.004687 0.002497 -0.005298 0.000492 0.003474 
+0.000402 0.003506 -0.006092 0.003417 0.010833 0.008583 
+-0.020162 -0.005665 0.015429 -0.036592 -0.034585 0.027975 
+0.000000 -0.026842 0.001579 -0.002150 0.005904 -0.010860 
+-0.004828 -0.000406 -0.000243 -0.007076 0.007387 -0.006414 
+-0.006484 0.002062 -0.003019 -0.003579 0.004968 -0.007053 
+0.005664 0.007233 -0.008715 -0.001739 -0.003478 0.000870 
+0.002316 0.006680 -0.005681 0.003847 0.005196 -0.004565 
+-0.002045 0.002110 -0.000525 -0.001467 0.001811 -0.000877 
+0.000012 0.003966 0.000005 0.003245 0.006890 -0.001187 
+0.002290 0.004179 -0.002228 -0.002096 -0.000282 -0.000176 
+-0.006119 -0.003458 -0.000222 -0.005206 -0.002588 -0.001553 
+0.008571 0.014792 -0.009321 0.061896 0.018758 0.018255 
+-0.025941 -0.023264 0.112825 -0.075377 -0.011037 0.028405 
+-0.027778 0.000874 0.022723 -0.008369 -0.006219 0.021622 
+0.009875 -0.010488 -0.021848 0.055967 0.014745 -0.035055 
+-0.052500 0.015254 -0.017434 0.006176 -0.008824 0.001765 
+0.056111 0.037222 0.149444 0.070053 0.058947 0.033316 
+-0.041556 -0.077778 0.083111 -0.047027 0.007838 0.051250 
+-0.015275 -0.005014 0.063493 -0.019919 0.015935 0.052667 
+-0.015390 0.013117 0.028961 -0.001573 0.072884 -0.022459 
+-0.060714 0.060714 -0.138571 0.068981 0.139352 0.017593 
+0.020348 0.073320 -0.045957 0.095537 0.100331 -0.124215 
+0.009118 0.054000 0.036471 -0.099231 0.070220 0.091978 
+-0.003733 -0.024747 -0.007235 -0.015360 0.015788 -0.035698 
+0.018424 0.025758 -0.014727 -0.019160 0.011244 0.023244 
+-0.069405 0.077024 -0.142619 0.001773 -0.010246 -0.003793 
+-0.081340 -0.053288 -0.029451 0.024913 -0.014665 0.013009 
+-0.002560 -0.045952 0.031488 -0.041970 -0.015758 0.073485 
+-0.012479 -0.059917 0.097355 -0.013537 -0.014932 0.010850 
+0.017456 0.017610 0.017434 0.037778 -0.050556 0.055556 
+0.011267 -0.000533 0.015667 0.010150 0.024216 0.018142 
+0.060290 -0.006046 -0.031698 0.002988 0.019579 0.010404 
+0.000628 0.017083 0.010674 0.002326 0.009984 0.012775 
+0.006807 0.012035 0.001963 0.004135 0.012388 0.002479 
+0.017447 -0.002009 -0.008494 -0.008145 0.012131 -0.016985 
+0.026344 0.026352 -0.015055 0.000119 0.002684 0.003312 
+-0.002777 0.005996 0.005302 -0.001214 0.005361 0.003317 
+0.004776 0.007738 -0.001747 0.004136 0.004225 -0.006738 
+0.005076 -0.000476 0.012415 0.010567 0.006875 0.006038 
+0.000633 -0.000654 -0.000584 -0.020314 0.009878 0.006028 
+-0.010743 -0.017216 0.031884 -0.011272 -0.017657 0.015761 
+-0.012086 -0.011891 0.015517 -0.003000 -0.000417 0.001500 
+0.002142 0.003179 -0.007624 -0.004461 0.006164 -0.005962 
+0.002690 0.011818 -0.003363 -0.003402 0.014593 -0.006149 
+0.002053 0.001155 -0.000230 0.004903 0.002859 -0.003374 
+0.002669 0.001631 -0.002030 -0.001346 -0.002591 -0.000415 
+-0.002840 -0.003551 0.001081 -0.002002 -0.000710 -0.000021 
+-0.000763 0.000746 0.000095 0.000358 -0.000882 0.000092 
+-0.002315 0.000792 -0.002642 -0.002697 0.000906 -0.004544 
+-0.000575 0.003560 -0.004862 0.005452 0.000535 0.006386 
+0.012185 -0.085093 0.088603 -0.122344 0.007369 0.084649 
+0.046093 0.009708 0.050146 0.037167 0.132133 -0.078433 
+-0.032346 0.016605 -0.050679 -0.035151 -0.014011 0.100783 
+-0.130204 0.033946 0.154694 0.008889 -0.000556 -0.059444 
+0.077508 0.018131 -0.060738 0.118693 0.002533 -0.015147 
+0.042424 0.028788 -0.011212 0.008756 0.016636 -0.015323 
+0.020833 0.018100 0.024133 -0.007697 0.037056 -0.021442 
+-0.052661 0.005659 0.022370 -0.058391 0.004368 0.078851 
+-0.063818 -0.032182 0.010545 -0.009818 -0.036818 0.015545 
+0.046061 0.041667 -0.133788 0.043241 0.130370 0.108426 
+0.081538 0.017778 0.122308 0.064444 -0.028889 0.086667 
+0.056444 -0.028222 0.038889 0.022667 0.005667 0.011333 
+0.014595 -0.002432 -0.006000 0.065960 0.062929 0.001010 
+0.019571 -0.006047 -0.000531 0.021748 0.023846 0.012448 
+-0.021140 0.004000 -0.003020 0.002500 0.013667 0.006833 
+-0.014667 -0.018667 0.027333 0.045714 -0.071714 0.143429 
+-0.077143 -0.104571 -0.022286 -0.097707 0.006254 -0.070741 
+-0.028525 -0.001878 0.041788 -0.131111 0.005867 0.004400 
+0.010449 0.063384 -0.030657 -0.008791 0.016246 0.001149 
+-0.004237 -0.001100 0.002559 -0.018495 -0.002727 0.007398 
+-0.000706 0.000706 -0.012699 0.012308 0.003422 0.007038 
+0.012423 0.021688 -0.000788 -0.000305 -0.002645 -0.003726 
+-0.000346 0.024501 -0.009823 -0.005924 -0.004340 -0.034352 
+0.005141 -0.014492 -0.016882 0.000575 -0.001919 -0.003612 
+-0.006603 0.001745 -0.003260 -0.003902 0.003778 0.002323 
+0.000824 0.009775 -0.002899 -0.000736 0.006521 -0.010607 
+0.004726 0.006632 0.004876 0.003325 0.015649 -0.015053 
+0.000523 0.006401 -0.018723 0.003098 0.004303 -0.014946 
+0.000800 0.002629 -0.003872 0.008078 0.006948 0.001292 
+-0.012406 -0.003083 0.020150 -0.002219 -0.000547 0.011997 
+-0.006417 -0.000769 0.005485 -0.004186 -0.003479 -0.003564 
+0.004348 0.003709 0.014758 0.001477 0.004790 0.014748 
+0.000106 -0.000641 0.001391 0.000331 -0.000282 0.000532 
+0.001860 -0.001672 -0.001474 0.001854 -0.003773 -0.002050 
+-0.001049 -0.001412 0.000409 -0.000049 0.002311 -0.001411 
+-0.001621 0.003809 -0.001667 -0.001467 -0.001767 -0.000961 
+-0.003525 -0.000722 0.000746 0.000510 -0.002713 0.000748 
+-0.000044 -0.000693 0.000113 0.001222 0.005827 -0.003278 
+0.009858 0.014414 -0.014283 0.017970 0.006647 -0.015498 
+0.026193 0.013007 -0.023137 0.019771 0.029627 -0.034825 
+0.000000 -0.112500 -0.020000 0.041380 -0.004168 0.057923 
+-0.018417 0.005463 -0.000477 0.026710 0.008188 -0.003093 
+0.050593 -0.013037 -0.054815 -0.152952 0.006476 0.112095 
+-0.100476 0.066667 0.032381 -0.001242 -0.007557 -0.003212 
+-0.005051 -0.018061 -0.020969 0.000743 -0.040000 -0.001041 
+-0.006429 -0.063571 0.037143 -0.070463 0.010000 0.007829 
+-0.036190 -0.041905 -0.007619 0.004286 0.012143 0.003571 
+0.062357 0.034214 -0.076429 0.175000 0.059769 0.039846 
+0.051000 -0.024000 -0.024000 0.031400 -0.019000 -0.031800 
+0.002222 0.009422 0.007067 -0.033000 -0.011500 0.011500 
+-0.008098 0.030960 0.014426 0.015661 -0.046455 -0.061799 
+0.016364 -0.004955 -0.016016 -0.025818 -0.001455 0.022182 
+0.035470 -0.024231 0.069188 -0.004714 -0.029286 0.006286 
+-0.003964 -0.015385 -0.004624 0.059736 0.035802 0.057363 
+0.000000 0.017479 0.004370 -0.064000 0.002857 -0.024857 
+-0.083778 -0.034722 0.006056 -0.082146 -0.033065 -0.057088 
+-0.036733 -0.060506 -0.069175 0.014131 0.043143 -0.045997 
+0.033045 0.074782 -0.064482 0.025265 0.020939 -0.018689 
+0.024694 -0.009252 0.002041 0.008143 0.031571 -0.043286 
+-0.001408 0.006514 -0.012513 0.005014 0.008241 -0.007100 
+0.006280 -0.001399 -0.021793 -0.000699 0.001364 -0.003392 
+-0.000122 -0.005653 0.009298 0.001374 -0.003911 -0.000292 
+0.000304 -0.002568 -0.002123 0.001478 0.001086 -0.002585 
+-0.000434 0.003539 -0.001429 -0.006897 0.005434 -0.031929 
+0.044555 -0.000064 -0.025655 0.007452 0.005677 -0.009609 
+0.011754 0.018211 -0.013864 0.015733 0.020901 -0.016806 
+0.012743 0.009094 -0.008776 -0.000581 0.000036 -0.000799 
+-0.009143 0.002341 -0.002466 -0.006689 0.005670 -0.004920 
+-0.001416 0.002863 -0.000525 -0.005290 -0.009868 -0.004374 
+-0.015465 -0.026133 -0.008484 -0.016934 -0.018947 0.004177 
+-0.000421 0.001054 -0.005714 0.002986 0.000835 -0.008180 
+0.006815 0.004989 -0.003564 0.002185 -0.003501 -0.001217 
+-0.000226 -0.002875 -0.002706 -0.002165 0.002176 -0.000307 
+0.000529 0.001476 0.000157 0.001351 -0.002533 0.007672 
+-0.000582 -0.007496 0.010861 0.002216 -0.006089 0.007326 
+0.000163 0.002034 -0.000298 0.012006 0.011303 -0.014227 
+0.010147 0.002394 -0.013823 0.002304 0.003803 -0.005403 
+-0.003009 -0.009831 0.002074 -0.002195 -0.010774 0.007510 
+0.002500 0.005833 0.010833 -0.000333 -0.010333 -0.005333 
+-0.010242 -0.031576 -0.016727 -0.023202 -0.032118 -0.026232 
+-0.014384 0.007871 -0.007150 0.007054 -0.002154 0.000022 
+0.029527 0.031057 -0.030833 0.023201 0.027633 -0.016252 
+0.014864 0.001019 0.005120 0.018016 -0.014603 -0.018889 
+-0.006059 -0.016506 -0.011306 -0.059983 0.008770 0.013486 
+-0.079057 -0.000438 0.019327 0.046667 -0.054167 0.015417 
+0.021000 0.012000 -0.005000 0.009286 -0.000357 0.006071 
+-0.039035 0.044211 -0.024298 0.060000 -0.050700 -0.067600 
+0.037815 0.008704 -0.055296 0.017466 0.035427 -0.021708 
+-0.033441 0.023482 -0.029879 -0.009451 0.010984 -0.001701 
+-0.006998 0.001590 0.005251 -0.017066 -0.018648 0.017396 
+-0.007218 0.012853 0.038909 -0.047333 0.023667 0.044167 
+-0.025382 0.035824 0.022382 -0.109074 -0.074074 0.039074 
+0.079753 -0.077284 0.117160 0.145493 -0.014079 0.092928 
+0.079951 -0.001618 0.061176 0.032692 -0.078000 0.006538 
+0.006800 -0.020400 0.004000 0.013377 0.106185 -0.116721 
+-0.022832 0.069713 -0.061900 -0.017407 -0.000370 -0.020370 
+0.031200 0.001000 0.010400 -0.013750 0.041250 -0.010000 
+-0.011944 -0.008531 0.010238 -0.011631 -0.003231 0.007112 
+-0.001391 0.001735 0.008237 -0.003496 0.008380 0.005078 
+0.000474 0.000740 -0.001613 0.002108 0.002616 -0.004747 
+0.003429 0.001994 -0.000771 0.000345 -0.000396 0.001497 
+0.005814 -0.011640 -0.004407 0.002969 -0.030236 -0.027926 
+-0.003121 0.021635 0.014442 -0.001642 -0.002580 0.007974 
+0.000438 0.003529 -0.000091 0.002234 0.000250 0.000827 
+-0.001191 -0.006845 0.002806 -0.008883 -0.002110 0.003348 
+-0.014771 0.010939 -0.000504 -0.019268 0.011667 -0.007934 
+-0.011094 0.001480 -0.008100 0.003047 -0.008209 -0.002428 
+0.004992 -0.002005 -0.001391 0.005378 0.005719 0.000841 
+0.001026 0.000542 -0.005490 0.000758 0.006797 -0.004548 
+0.000641 0.005897 0.001436 -0.000651 0.005635 -0.000380 
+-0.000823 0.002764 -0.000206 -0.002630 -0.000485 -0.000339 
+-0.003107 -0.005256 0.000119 -0.003870 -0.007285 0.006713 
+-0.004646 -0.005944 0.003997 -0.000641 -0.000243 -0.001452 
+0.002048 0.002799 -0.011498 0.003247 -0.001244 -0.006108 
+-0.000455 0.004102 0.002908 -0.005031 -0.001170 0.008652 
+0.004642 -0.006577 0.011423 -0.001143 0.001794 -0.003230 
+-0.037361 -0.021944 0.026389 -0.070928 -0.010380 -0.024989 
+-0.007606 -0.024704 -0.019221 0.013524 -0.016705 -0.026648 
+0.018499 0.010418 -0.029769 0.022753 0.006741 -0.017702 
+0.027916 0.005209 -0.022341 0.000161 0.006919 0.003245 
+-0.008330 0.022222 0.004011 0.013264 0.035292 -0.008610 
+0.010315 0.029333 -0.004761 -0.007062 0.005491 0.006613 
+-0.033667 -0.013333 0.020333 -0.136842 -0.003918 0.041696 
+0.008333 0.020000 -0.008333 0.038304 0.002143 0.011339 
+0.031190 0.033988 -0.052381 0.061704 0.059925 -0.077528 
+0.024654 0.020027 -0.035691 0.011325 -0.047055 -0.052584 
+-0.003608 -0.063333 -0.016235 0.008611 -0.030000 -0.002500 
+0.005583 0.005026 -0.005696 -0.006061 0.002560 -0.015779 
+-0.014876 -0.048346 0.065000 -0.078500 -0.112500 0.039250 
+-0.036481 -0.077963 0.020741 -0.052222 -0.074333 0.024778 
+-0.013333 -0.045556 0.000000 -0.075556 0.037778 0.037778 
+0.082222 -0.004444 0.008889 0.148190 -0.012381 -0.028762 
+0.058286 -0.025143 -0.011429 0.006606 0.003612 0.058315 
+0.013630 -0.011662 0.029374 -0.013500 -0.003724 -0.008690 
+0.026019 0.043547 -0.019994 0.040909 0.057273 0.032727 
+0.029567 0.054256 0.027476 0.020095 0.014932 -0.049510 
+0.004823 -0.004110 -0.010147 -0.004385 -0.006662 -0.017160 
+0.000796 -0.005081 -0.010144 0.000432 -0.003302 -0.000728 
+0.000826 -0.001243 -0.000882 0.003852 -0.007646 -0.000565 
+-0.007294 0.022469 0.036779 -0.130492 0.029040 0.173958 
+0.007089 -0.048333 0.008102 0.003023 -0.015756 0.012852 
+-0.004701 -0.014635 0.003045 -0.001778 -0.018361 0.002899 
+0.002671 -0.011738 0.003272 0.008628 0.000602 0.001390 
+0.000859 0.002573 0.000268 -0.013573 -0.006906 -0.005309 
+-0.013777 -0.017728 -0.010417 -0.008198 -0.024075 -0.001453 
+-0.012500 -0.021302 0.008876 -0.024339 -0.005839 0.016461 
+0.001684 0.003697 -0.007430 0.000355 0.000304 -0.004608 
+-0.002985 0.000005 0.000041 -0.004860 -0.001325 0.001101 
+-0.004015 0.001296 -0.001440 -0.003241 0.002659 -0.002594 
+-0.004261 -0.001575 -0.003413 -0.002628 -0.004167 -0.003003 
+-0.002232 -0.001164 -0.001003 0.004068 0.009266 -0.002651 
+0.005072 0.012747 -0.014263 0.010989 0.008412 -0.008533 
+0.009255 0.014249 -0.003119 0.012170 0.018037 -0.007651 
+0.009836 0.025293 -0.018128 -0.003710 0.037439 -0.029569 
+0.056732 0.010779 -0.071623 0.021111 -0.013734 -0.017854 
+0.008907 -0.019577 0.001790 0.002681 -0.008928 0.011072 
+-0.012879 -0.027061 -0.018667 -0.035109 -0.058723 -0.022286 
+0.017199 -0.013495 -0.045202 0.059204 0.024895 -0.052508 
+0.032359 -0.024322 0.033628 0.012215 0.040122 -0.064740 
+-0.009000 0.028923 -0.043385 0.027013 0.086234 -0.046753 
+0.012500 0.115564 -0.069338 0.001558 0.074221 0.023701 
+0.152900 -0.104800 0.072500 0.040040 -0.033730 0.092698 
+-0.050000 -0.000070 -0.000087 -0.039878 -0.004431 0.006667 
+0.091893 -0.041600 -0.005433 0.067059 -0.003235 -0.016176 
+0.065538 -0.131077 0.035385 0.004733 -0.006095 -0.017785 
+0.000887 0.005083 -0.018029 -0.000453 0.000856 -0.006391 
+-0.006889 -0.009705 0.014436 -0.018016 -0.016647 -0.011171 
+0.063463 0.012583 -0.035671 0.181250 0.079875 0.026625 
+-0.110988 -0.021235 -0.179506 -0.066000 -0.012000 -0.039000 
+0.002000 -0.057500 0.057500 0.037882 -0.049000 -0.009471 
+0.013939 -0.061333 0.052970 0.005550 -0.033297 0.078667 
+-0.016709 -0.027633 0.030364 0.001618 -0.000404 0.057500 
+-0.035110 0.034551 -0.006318 0.018667 -0.050667 -0.003333 
+0.015094 -0.030443 -0.011597 0.007224 -0.012035 0.009253 
+0.013204 -0.004675 -0.002874 0.014207 -0.015556 -0.003431 
+0.006364 -0.014677 0.016886 -0.008824 -0.015500 0.010428 
+0.006056 -0.003030 0.002386 0.010124 -0.015560 -0.004122 
+-0.001245 0.021714 0.009139 -0.062450 0.032577 0.083673 
+0.034774 -0.088846 0.055829 -0.003403 -0.036497 0.020489 
+-0.025792 -0.019888 0.014548 -0.019643 -0.018374 -0.005128 
+-0.012635 -0.019878 -0.002752 -0.002092 -0.016236 0.001470 
+0.007696 -0.016584 0.004604 0.005440 -0.012674 0.002604 
+-0.003776 0.003536 -0.001256 -0.007341 0.010746 -0.006786 
+-0.008930 -0.001439 0.003894 -0.007688 -0.003630 0.014055 
+-0.000997 0.001685 0.000878 -0.000236 0.004461 -0.003132 
+0.002525 -0.000183 -0.003190 -0.000730 -0.003153 -0.000423 
+-0.002291 -0.003265 0.004028 0.000167 0.000122 0.003204 
+0.000076 0.001600 0.001930 0.000073 0.003525 -0.001774 
+-0.006491 0.001470 -0.002411 -0.005260 0.003964 0.001451 
+-0.001484 0.009398 -0.001154 0.005152 0.014008 -0.002271 
+0.007083 0.015222 -0.001975 0.004979 0.008358 -0.001884 
+-0.000088 -0.001024 -0.004734 -0.006283 0.001398 -0.012816 
+0.008961 0.027258 -0.023471 0.014800 -0.003960 -0.001320 
+-0.047619 -0.034667 0.015048 -0.036057 -0.029680 -0.018467 
+-0.000797 0.034583 0.000061 0.000288 0.010759 -0.016383 
+0.007302 0.006124 -0.025210 0.040663 0.063208 -0.064752 
+-0.103355 0.123871 0.106774 -0.048337 0.037743 0.073168 
+-0.036305 -0.011031 0.051473 0.002773 -0.000380 -0.000836 
+0.013168 -0.032986 -0.005945 0.012400 -0.037200 -0.103000 
+0.152857 -0.172773 -0.043193 -0.012512 -0.046581 -0.004070 
+0.009487 0.005128 0.004359 -0.043765 -0.010941 0.036667 
+0.035310 -0.035595 0.071333 0.101118 0.057516 -0.050093 
+0.039167 0.001083 -0.098458 0.017668 0.015276 -0.053602 
+0.033410 0.012720 -0.022222 0.024804 -0.012780 -0.022913 
+0.054864 0.063704 -0.038354 0.063449 0.037837 -0.019738 
+0.083653 0.000637 -0.044318 0.114622 0.057236 -0.052567 
+0.064286 -0.050743 -0.038057 -0.006842 -0.008737 -0.032105 
+0.080579 0.006526 -0.041421 -0.004296 0.120630 0.022407 
+-0.056212 0.158485 -0.010152 -0.005000 0.010000 -0.074167 
+0.026394 -0.039152 -0.016606 0.066250 0.060500 0.030250 
+-0.060467 -0.026067 0.001667 -0.061111 -0.063333 0.054444 
+-0.003394 -0.046642 0.042335 -0.007491 -0.014163 0.016270 
+-0.001356 -0.008218 0.011100 0.000868 -0.003222 0.005863 
+0.003571 -0.003648 0.000854 0.004105 -0.001051 0.002189 
+0.000090 -0.003677 -0.004130 -0.006032 0.004366 -0.005412 
+-0.028771 0.025006 0.002414 -0.015006 -0.006655 0.000652 
+0.047298 0.027035 0.021697 -0.005760 -0.000181 -0.002766 
+-0.019123 -0.017339 0.014025 -0.017507 -0.006232 0.005783 
+-0.018328 -0.007731 -0.001847 -0.014122 -0.009972 -0.001821 
+-0.007156 -0.003820 -0.000192 0.001508 0.010651 -0.001752 
+0.007937 0.027390 -0.006779 0.007226 0.028216 -0.012011 
+-0.000612 0.007942 -0.005171 -0.001263 -0.007722 0.007470 
+-0.007008 -0.003785 -0.002326 -0.004681 -0.002863 0.000318 
+-0.001178 0.000236 -0.000775 0.000215 -0.002279 -0.000371 
+-0.000287 -0.005942 0.003719 -0.001647 -0.002453 0.007249 
+-0.003099 -0.000302 0.003133 -0.002433 0.001749 -0.000328 
+-0.003320 -0.000080 -0.000677 -0.004495 -0.001179 -0.001673 
+-0.002983 0.003315 -0.002479 0.003840 0.008199 -0.008786 
+0.010539 0.010828 -0.008934 0.007479 0.007644 -0.005371 
+0.001729 0.002451 0.003798 0.003980 -0.000538 0.005321 
+0.009068 0.003112 0.005491 0.015465 -0.001950 -0.003832 
+0.031515 0.002033 -0.012072 0.016481 0.008704 -0.000370 
+-0.008043 0.022973 0.007410 0.001196 0.007336 -0.000504 
+0.002443 -0.015465 0.026049 -0.012308 -0.016429 0.018462 
+-0.008762 0.014033 -0.078962 -0.005577 0.001115 -0.021500 
+-0.038103 -0.007226 0.015117 -0.016687 -0.050062 0.020625 
+0.070800 -0.111333 -0.061067 0.000000 -0.022222 -0.020000 
+-0.010266 0.017384 -0.083769 0.045974 0.144351 -0.078766 
+0.059099 0.017898 -0.075646 -0.040105 -0.002199 0.059895 
+-0.077672 -0.097241 0.034095 -0.024644 0.010111 -0.030489 
+0.026747 -0.013647 -0.020743 -0.004369 -0.028793 -0.021687 
+0.004512 -0.002625 -0.007599 0.038812 0.011005 -0.002438 
+0.006488 0.031942 -0.057645 0.040150 0.042457 -0.040726 
+0.063851 0.016940 -0.024403 0.051852 0.023832 0.003091 
+0.052180 0.031734 0.046856 0.009861 0.029160 0.030874 
+0.078778 0.029028 -0.084986 0.023345 0.007036 -0.014455 
+-0.029071 -0.004476 -0.016548 0.026648 -0.033049 0.007445 
+-0.018853 -0.008427 0.031566 -0.003399 0.002415 -0.002852 
+0.039583 0.002500 0.039583 -0.003923 0.002906 0.036174 
+-0.001215 -0.015789 0.005163 -0.009156 -0.007085 0.009749 
+-0.006123 -0.006323 0.010164 -0.001384 -0.001664 0.005469 
+-0.002869 -0.000227 0.002635 -0.004389 -0.005449 -0.003412 
+-0.000370 -0.012884 -0.005077 -0.002697 0.005346 -0.046533 
+-0.030000 0.000000 -0.032222 -0.002537 -0.010319 0.011931 
+0.003270 0.011603 0.002288 -0.005251 0.005000 0.000847 
+-0.010424 0.005482 -0.001311 0.005099 0.010957 -0.003676 
+0.006905 -0.002860 0.010787 -0.003928 -0.000624 0.004513 
+0.002078 0.002738 -0.000337 0.001591 0.009024 -0.000392 
+0.001557 0.004793 0.000321 -0.002805 0.001249 0.000654 
+-0.007006 -0.000971 0.000491 -0.002505 0.002403 0.000989 
+-0.009483 -0.006978 -0.001339 -0.005543 -0.006332 -0.001073 
+-0.001015 -0.000487 -0.001734 -0.002189 0.005391 -0.000329 
+0.001680 0.003442 0.001107 -0.000066 -0.003457 0.002629 
+-0.003279 -0.006837 0.005280 -0.002926 -0.004655 0.002803 
+0.003126 0.000370 0.000655 0.002556 0.003719 0.002075 
+-0.000860 0.000056 -0.001304 0.003504 0.002723 -0.007606 
+0.003277 0.003887 -0.001508 0.002167 0.005985 0.001689 
+0.005834 0.006534 0.006081 0.007684 0.011610 -0.000996 
+0.007927 0.027565 -0.007197 -0.004211 0.040000 -0.037898 
+0.005336 0.005808 0.001568 0.015417 0.003476 -0.005959 
+0.001134 -0.024231 -0.003381 -0.010987 -0.001834 -0.003207 
+0.005556 -0.005385 0.028034 -0.027294 -0.025706 -0.001059 
+0.020415 0.005975 -0.074025 0.017405 0.015806 -0.044729 
+-0.002882 -0.008723 -0.023601 0.002869 -0.022504 -0.011628 
+0.009352 -0.030185 -0.005093 0.023122 -0.021000 0.028902 
+0.023077 -0.023077 0.000000 0.063590 0.150000 -0.111282 
+0.091619 -0.172762 -0.089524 -0.008651 -0.023254 -0.136270 
+0.002476 0.000952 -0.009238 -0.008798 -0.010173 0.017518 
+-0.007926 -0.015630 -0.006296 -0.024296 -0.030752 -0.023880 
+-0.089723 0.043753 0.033719 0.002249 0.024512 0.037582 
+0.023329 0.002690 0.017014 0.043881 0.005057 0.031483 
+0.041951 0.041382 -0.000759 0.035400 0.009500 0.017700 
+0.009628 -0.008576 0.011207 0.003509 -0.005053 0.014175 
+0.009639 0.002935 -0.007065 -0.016100 0.027500 0.021467 
+0.000844 -0.013896 0.030325 -0.007003 -0.080541 0.004086 
+-0.054479 -0.073034 0.027338 0.037078 -0.043726 -0.013812 
+-0.003778 -0.001444 -0.006444 -0.000079 0.042063 -0.020873 
+0.013400 -0.013680 -0.024825 -0.008076 -0.009435 -0.007732 
+-0.005765 -0.019301 0.009157 -0.000165 -0.005729 0.007286 
+-0.001058 -0.003343 0.004504 0.000800 -0.004253 0.001922 
+0.000538 -0.011536 0.003948 -0.009342 -0.009414 -0.031328 
+0.043220 0.043645 -0.009036 -0.015813 -0.022276 0.006828 
+-0.035405 0.005961 0.026592 -0.008226 -0.050083 0.037873 
+-0.020262 -0.038148 0.020784 -0.019106 -0.037423 0.007673 
+-0.010155 -0.032682 0.001311 -0.017774 -0.025449 0.005668 
+-0.009806 -0.007497 0.004762 0.000218 -0.000611 0.000958 
+-0.004118 -0.004543 0.007789 -0.006427 -0.003217 0.012874 
+-0.000491 -0.000068 0.008750 0.004055 -0.001445 0.002540 
+-0.000355 -0.000197 0.002207 -0.001948 -0.008204 -0.003342 
+-0.000668 0.001924 -0.005642 0.004641 0.003847 -0.002869 
+0.003079 0.004838 -0.001789 0.003396 -0.001129 0.002261 
+0.001917 -0.005294 0.005518 0.000005 -0.004879 0.001328 
+0.003031 0.000345 0.001493 0.000393 0.003356 0.000703 
+-0.001528 0.004323 -0.000663 -0.002585 0.003501 -0.000819 
+0.000146 0.003440 0.001545 0.002738 0.002427 0.001686 
+0.004248 0.003571 -0.000802 0.003000 0.009403 -0.003572 
+0.001427 0.021096 -0.005092 0.000396 0.040428 -0.007335 
+0.005023 0.003477 -0.002318 -0.010333 0.001857 0.000195 
+-0.005847 -0.003649 -0.011527 -0.017368 0.002270 0.008446 
+-0.051339 0.010804 0.070268 -0.024674 0.029746 0.058804 
+0.002173 -0.000372 -0.038689 -0.006814 0.009449 -0.021983 
+0.006980 0.030739 -0.024736 0.011733 0.043333 -0.035200 
+-0.028852 -0.014145 0.032670 0.053285 -0.059275 0.016763 
+0.016047 -0.074023 0.011791 0.030000 0.012555 0.008968 
+-0.007854 -0.008122 -0.028293 -0.006446 -0.004706 0.012721 
+-0.057280 -0.019822 0.027068 -0.002214 -0.016225 -0.020077 
+0.003596 -0.017346 -0.018004 -0.030321 -0.030536 -0.040607 
+-0.090000 0.014667 0.007333 -0.017708 0.017708 0.035417 
+0.028571 0.002426 0.008491 0.043568 0.087577 0.051850 
+-0.008736 0.012966 0.018115 -0.044483 0.006258 -0.011458 
+0.002000 -0.010711 -0.053911 0.086250 -0.016490 -0.043973 
+0.038792 0.026860 0.044783 0.000000 0.023636 0.155455 
+0.028091 -0.020364 -0.001636 -0.004636 -0.030769 -0.001739 
+-0.025786 -0.013411 0.033746 -0.018750 0.031250 -0.063750 
+-0.021250 0.001875 -0.001875 0.003221 -0.014663 -0.025385 
+0.001437 0.002331 -0.004559 -0.006550 -0.015994 0.010205 
+-0.000470 -0.004823 0.015169 -0.000466 0.002536 0.000199 
+-0.003644 -0.002089 -0.005203 -0.000050 0.000158 -0.002209 
+-0.002623 0.000291 -0.005507 -0.015111 0.000592 -0.007616 
+-0.026632 -0.009383 0.003348 -0.020744 -0.021467 0.008028 
+-0.033013 -0.055880 0.017825 -0.057519 -0.161849 0.038829 
+-0.067708 -0.043485 0.080063 -0.003309 0.017966 -0.013705 
+0.031276 0.013219 -0.011676 0.044222 0.014188 -0.030042 
+-0.004286 -0.014093 0.020221 -0.059878 -0.038259 0.049281 
+-0.020088 -0.005902 0.007159 -0.007946 -0.004336 0.008282 
+-0.006225 -0.006017 0.010134 -0.016363 0.000908 -0.009041 
+0.001372 -0.000147 0.004130 0.004610 -0.002305 -0.000508 
+-0.001241 -0.002979 -0.002439 0.001465 0.001683 -0.001446 
+0.003415 0.006554 0.001431 0.005233 0.002617 0.004060 
+0.001364 0.000303 0.000000 0.000112 -0.000909 -0.000668 
+0.000110 -0.002579 -0.000493 -0.001254 0.002343 -0.001916 
+-0.000547 0.006061 -0.003973 0.000722 0.003615 -0.004971 
+-0.001206 0.003267 0.001042 0.001148 0.002954 0.001364 
+0.002956 0.002123 -0.002563 0.000677 0.003021 -0.008250 
+-0.002581 0.007640 -0.013068 -0.005281 0.028233 -0.017985 
+0.030861 0.012871 0.002584 -0.009511 -0.000031 0.002549 
+-0.022585 0.031682 -0.030009 0.004646 -0.014747 -0.017071 
+-0.034074 0.029259 0.009630 -0.025300 -0.047886 0.039606 
+0.003403 -0.008567 -0.003883 -0.012453 -0.009640 0.001381 
+-0.011902 -0.013369 0.014800 -0.014812 -0.037059 0.013887 
+-0.037662 -0.028961 -0.011558 0.036273 -0.012273 -0.012545 
+0.016183 0.007250 0.021200 0.012143 -0.003208 -0.000916 
+0.011641 -0.006869 -0.013359 -0.037920 0.028440 0.003000 
+-0.083333 0.033333 0.033333 -0.069337 -0.010510 -0.067245 
+-0.037143 0.039000 0.013000 -0.059375 0.059375 -0.001250 
+-0.005833 0.000833 0.004167 -0.025652 0.006696 -0.036783 
+-0.022000 0.043000 -0.001000 -0.005584 0.021818 0.059870 
+-0.091515 -0.044545 0.225151 -0.056667 0.015490 -0.061961 
+0.084383 -0.056420 -0.197716 0.070286 -0.023429 -0.157143 
+-0.005971 -0.000748 -0.036584 0.016793 0.001768 0.018207 
+0.046310 -0.001548 0.022381 0.000000 0.030667 0.030667 
+0.075059 0.084648 0.076657 0.053962 0.059385 -0.075654 
+-0.075000 -0.015000 -0.120000 -0.006860 0.045289 -0.024711 
+-0.000594 0.039784 0.016956 0.003212 -0.000268 0.018404 
+-0.000739 0.000145 0.003611 -0.000737 0.004340 -0.005067 
+-0.000059 0.000649 -0.008146 -0.006081 -0.001164 -0.010065 
+-0.010014 -0.001353 -0.004806 -0.003512 -0.002440 0.001369 
+-0.003983 -0.006170 0.004660 -0.004173 -0.003285 0.002258 
+0.000012 0.004675 -0.003420 -0.006648 -0.003578 0.001394 
+-0.012131 0.006499 -0.008875 0.005629 0.029755 -0.037797 
+0.039846 0.039051 -0.012399 0.657594 0.338419 -0.137445 
+-0.038144 0.008125 0.011300 -0.050696 0.014607 0.030074 
+-0.017994 0.013179 -0.033457 -0.015036 0.007058 -0.004298 
+-0.030000 -0.012439 -0.009951 0.027976 -0.020119 0.024048 
+-0.000323 0.000124 0.002558 -0.000776 -0.000051 0.001269 
+-0.000318 0.000699 0.000118 0.000939 0.004378 -0.000030 
+0.004230 0.005136 -0.001730 0.000304 0.001873 -0.002003 
+-0.003188 0.000529 0.002130 -0.005540 -0.003407 0.002995 
+-0.004496 -0.002481 0.001395 0.000300 0.002360 -0.001062 
+0.004105 0.008847 -0.003281 0.005803 0.010885 -0.006048 
+0.001528 0.012685 0.000509 0.000179 0.009839 -0.002315 
+0.001371 0.006296 -0.001423 -0.000361 0.000068 -0.005364 
+-0.004164 -0.007674 -0.005393 -0.004250 -0.010889 0.000087 
+-0.014900 -0.004383 -0.002316 -0.036695 0.055422 -0.006747 
+-0.001062 0.001480 -0.010132 -0.007813 0.003603 -0.019813 
+0.029814 0.014755 -0.006266 0.006597 -0.026387 -0.010714 
+0.005678 -0.029664 -0.003090 0.001964 -0.026238 0.010333 
+0.011856 -0.038633 0.015875 -0.003933 -0.007333 0.023133 
+0.016499 0.001015 0.000127 0.033634 -0.004319 -0.042733 
+0.029868 0.001186 -0.009597 0.000684 0.008889 0.003761 
+-0.015960 -0.038384 0.031313 -0.004276 0.026974 0.068092 
+-0.060239 -0.054641 -0.004827 -0.025448 -0.001597 0.005910 
+-0.006044 0.027123 -0.025015 0.007502 0.039374 -0.025175 
+0.015862 0.206667 0.037011 0.029559 -0.049265 -0.375000 
+0.037370 -0.029363 0.072960 -0.043610 -0.009922 -0.014675 
+0.041984 0.028254 0.004841 -0.008148 -0.062963 -0.058519 
+-0.002674 -0.037720 -0.082569 -0.024054 -0.023727 -0.034083 
+-0.022126 -0.012512 -0.002802 -0.011458 -0.006759 0.001425 
+0.032051 0.012051 0.007949 -0.003561 0.015273 0.012134 
+-0.056889 -0.014611 -0.017222 -0.115000 -0.045000 -0.025000 
+-0.047626 -0.006010 -0.010404 -0.001818 0.046364 -0.004545 
+-0.008421 0.022105 -0.011053 -0.000460 0.001382 -0.002774 
+-0.000389 0.000517 0.000911 0.000489 0.007048 -0.001709 
+0.004148 0.007297 0.000262 0.002319 0.003159 -0.000798 
+0.000015 -0.000636 0.000408 -0.000702 -0.001265 0.001022 
+0.002490 0.001804 -0.001446 0.009863 0.006904 -0.004854 
+0.012412 0.007822 -0.004821 0.002622 0.004237 -0.003251 
+-0.015028 -0.000759 -0.001718 -0.021682 -0.002985 -0.002121 
+-0.012365 -0.000737 -0.002962 -0.004492 -0.002055 0.001136 
+-0.001791 -0.000503 0.000318 0.000630 0.000188 -0.000159 
+-0.003310 -0.003106 0.004376 -0.000828 0.001852 -0.002805 
+0.000505 0.002035 -0.002642 0.045573 0.007163 0.001336 
+-0.000580 -0.000671 0.000757 0.002986 0.000198 -0.001229 
+0.002109 -0.001122 -0.000295 0.002802 0.002432 0.000034 
+0.001310 -0.000349 0.000017 -0.002286 -0.001905 0.003937 
+-0.002540 -0.001667 0.005476 -0.001590 0.000924 0.002785 
+0.001246 0.002640 -0.000807 0.000833 0.004157 -0.000464 
+-0.000610 0.006830 -0.001803 -0.000070 0.009850 -0.002396 
+-0.000410 0.009399 0.001336 0.005648 0.007194 -0.003062 
+0.006502 0.005348 -0.004710 0.000996 0.004111 0.000257 
+0.002860 -0.003249 0.004527 -0.001585 -0.014737 0.006432 
+-0.019343 -0.000278 -0.005856 -0.023570 0.007321 -0.016418 
+-0.010565 0.001508 -0.004533 -0.003314 -0.000223 0.003459 
+0.002024 0.004725 -0.001798 0.015947 0.014379 0.014360 
+-0.020553 -0.013180 0.003997 -0.022667 -0.021637 0.031284 
+0.010492 0.000077 -0.024585 0.001529 -0.004674 0.007177 
+-0.017096 0.003109 0.016579 -0.012903 -0.009972 0.027560 
+0.001162 -0.008133 0.015238 -0.006197 0.000066 0.017008 
+-0.022515 0.022663 0.039327 -0.039560 -0.074615 0.065604 
+-0.026298 -0.061298 0.048664 0.005109 0.006826 -0.010986 
+0.018020 0.003589 -0.017085 -0.002103 0.001369 -0.011086 
+-0.117483 -0.072956 0.039561 0.020400 -0.001855 0.045000 
+0.050491 0.054134 0.017235 0.011744 -0.013000 0.001305 
+0.099000 0.008568 -0.051405 0.042952 -0.009190 -0.003095 
+-0.022381 -0.028571 -0.047857 -0.043319 0.014425 -0.023457 
+-0.010630 -0.007562 -0.009370 -0.011053 0.003684 0.009474 
+-0.009197 -0.004137 -0.022771 0.005509 -0.014774 0.003170 
+-0.025880 0.017640 -0.014327 0.009167 -0.013462 0.008974 
+0.040000 -0.096122 0.027463 0.033420 -0.047574 0.011300 
+0.006290 -0.006716 -0.006948 -0.003850 -0.015755 0.003672 
+-0.001138 0.000748 0.002370 -0.000675 0.007121 -0.002772 
+-0.003376 0.002198 0.000532 -0.003158 -0.002253 0.003606 
+-0.001844 -0.002907 0.002988 -0.001390 -0.000837 0.000660 
+0.001863 0.002632 -0.001421 0.005303 0.002058 -0.002109 
+0.002897 -0.000809 0.000255 -0.002844 -0.001273 0.001141 
+-0.005168 0.000618 -0.001171 -0.001601 0.003772 -0.003996 
+0.004095 0.006349 -0.004726 0.007890 0.005692 -0.002594 
+0.005746 -0.000151 0.000646 -0.001125 -0.003583 0.003471 
+-0.001224 -0.001312 0.001447 0.000899 0.003094 -0.003333 
+-0.002897 0.005138 -0.006396 -0.013293 0.000161 -0.004221 
+0.006641 0.000684 -0.002180 0.007525 -0.000258 -0.003474 
+0.002604 0.000354 -0.003432 -0.000061 -0.000277 0.000751 
+-0.003306 -0.001333 0.002933 -0.001888 -0.004228 0.002641 
+-0.000680 -0.000761 0.004161 0.001799 0.000024 -0.000734 
+0.006014 0.002060 -0.003035 0.004451 0.002584 -0.001223 
+-0.002033 0.000990 -0.000961 -0.004043 -0.000628 -0.002383 
+-0.000120 -0.001776 -0.000251 0.000801 -0.004879 0.001266 
+-0.000112 -0.005860 0.001697 -0.000528 -0.004026 -0.002468 
+-0.005812 0.002981 -0.006560 -0.005151 0.016789 -0.009226 
+0.004684 0.025652 -0.012927 0.002125 0.006356 0.003936 
+0.009140 0.010884 -0.000696 0.008827 0.011610 -0.007497 
+0.000408 0.007914 0.003908 -0.027594 0.004358 0.005356 
+0.038925 -0.063272 0.066137 0.003409 0.007159 -0.023523 
+0.000456 -0.001845 0.004692 -0.000823 -0.011762 0.010034 
+-0.018334 -0.019804 0.033646 -0.019298 -0.015614 0.069825 
+-0.015786 0.001776 0.053375 -0.024935 0.014104 0.002961 
+0.004444 0.045000 -0.045000 0.024935 -0.027468 -0.037597 
+-0.012177 0.009255 0.002758 0.002389 0.009768 -0.005579 
+0.017235 -0.010898 -0.000296 0.005281 -0.005222 0.011343 
+-0.058235 -0.035882 0.018235 0.030318 0.068223 0.041698 
+0.124766 0.136345 0.001930 0.024526 0.046809 0.041083 
+0.019865 -0.013203 -0.000090 -0.000588 -0.052256 0.061757 
+-0.018640 -0.060061 0.046599 -0.031209 -0.062527 0.140659 
+0.013083 -0.042342 -0.016950 -0.021852 -0.009759 -0.022435 
+0.005597 -0.013006 -0.033100 -0.000460 -0.010613 0.028582 
+-0.029975 0.087736 0.052861 0.077942 0.109553 0.237002 
+-0.004433 0.003953 -0.000573 0.011038 0.009086 -0.017045 
+0.017333 0.014268 -0.003995 0.008304 0.007771 -0.001496 
+0.003806 0.011743 -0.007094 0.001668 0.008878 -0.010125 
+0.000652 0.002710 -0.003662 -0.004038 -0.002758 0.003484 
+-0.002915 -0.005315 0.000246 0.000831 -0.000696 0.001039 
+0.001651 0.001651 -0.001651 -0.000774 -0.000366 -0.002378 
+-0.001351 0.000734 -0.002355 -0.002016 0.001048 -0.000968 
+-0.000537 -0.000083 -0.000537 -0.000922 0.000169 -0.001058 
+0.003432 0.005751 -0.003177 0.004752 0.001216 -0.003057 
+0.000309 -0.001394 0.001787 -0.002103 -0.001818 0.002862 
+-0.003005 -0.000687 0.000915 -0.002756 0.000025 -0.000954 
+-0.001230 -0.000990 -0.000069 0.000039 -0.003450 0.002899 
+0.002125 0.003453 -0.003188 0.001488 0.003028 -0.006748 
+0.001077 0.002192 -0.004889 -0.000915 0.003752 -0.000787 
+-0.002820 0.004187 0.001539 -0.001114 0.002334 0.000582 
+0.000334 -0.000842 -0.000691 0.002074 -0.001882 0.000083 
+0.002209 -0.002008 0.000603 0.002093 -0.002252 0.000753 
+0.000230 -0.004087 0.000325 -0.000862 -0.002798 -0.002966 
+0.000981 0.002202 -0.005973 0.001851 0.004064 -0.001688 
+-0.002421 -0.002028 0.000451 -0.005266 -0.006624 -0.001246 
+-0.006774 -0.001242 -0.005076 -0.006241 0.012569 -0.010616 
+-0.007966 0.017539 -0.006459 -0.004577 -0.006664 0.005109 
+-0.001220 -0.012805 0.003794 0.006811 0.001199 -0.004624 
+0.008571 0.002857 -0.011429 -0.004024 -0.002886 0.002599 
+0.055352 -0.093943 0.003749 0.037229 0.043818 -0.030028 
+-0.026727 0.007591 0.000909 -0.051780 -0.039837 0.084091 
+0.057143 -0.034286 -0.011429 0.048182 0.005091 0.010182 
+-0.041053 -0.042632 0.007579 -0.087039 -0.032632 -0.003618 
+0.031200 -0.041600 0.021111 0.005000 0.006667 -0.050833 
+0.007658 0.016581 0.026137 -0.005259 -0.020625 0.047332 
+-0.006783 -0.003483 0.028536 -0.011250 -0.001532 0.009189 
+-0.003051 -0.002372 0.002208 -0.002198 -0.014445 -0.012822 
+-0.025806 -0.036070 -0.038123 -0.002117 0.003268 -0.009207 
+0.000248 -0.001331 0.005418 0.011253 -0.002430 0.000256 
+0.021984 -0.013651 0.015317 0.019689 -0.050497 0.028530 
+0.008617 -0.027325 -0.025896 0.007987 -0.012478 -0.024829 
+0.022424 -0.023636 -0.043030 -0.007823 0.011613 -0.030565 
+-0.018253 0.010491 0.007420 -0.003605 0.002532 0.008905 
+-0.001052 -0.000522 0.004591 0.006724 -0.001715 0.002869 
+0.013489 -0.001921 0.009634 0.009175 0.012221 -0.006115 
+0.003166 0.008996 -0.007251 0.002745 0.004003 -0.005552 
+0.003822 0.003902 -0.003461 0.000008 0.001322 0.001328 
+-0.001368 0.000716 0.003945 -0.001981 -0.003212 0.005139 
+0.001522 -0.003664 -0.001382 -0.001921 -0.001601 -0.002241 
+-0.000940 0.002193 -0.002392 0.001073 -0.000082 -0.000249 
+0.004190 -0.000902 -0.000769 0.005758 -0.004348 -0.002891 
+0.002509 -0.001959 -0.007766 0.000264 -0.001403 -0.001627 
+0.001278 0.000638 0.001642 -0.002184 -0.000065 0.004821 
+-0.003150 0.001331 -0.000370 -0.002949 0.000259 -0.005489 
+-0.002617 -0.000437 -0.004680 0.002748 0.002351 0.000626 
+-0.003544 0.001801 -0.006566 -0.001495 0.001484 -0.007290 
+0.002827 0.002561 -0.006668 0.002758 -0.001149 -0.003140 
+0.002127 -0.000584 -0.001533 0.001545 -0.001852 0.001128 
+0.002214 -0.003821 0.001789 0.001556 -0.003025 0.000516 
+0.003898 0.001314 -0.000181 0.000446 0.000410 0.000702 
+-0.000344 0.000075 -0.000345 0.000156 -0.000391 -0.000601 
+0.000911 0.001297 -0.002536 0.001389 -0.001763 -0.003580 
+0.000297 0.004108 -0.005548 -0.001830 -0.000962 -0.000143 
+0.001620 -0.002668 0.002536 0.003489 0.000819 0.005205 
+0.004212 0.006799 0.005309 0.003268 0.000351 0.002895 
+-0.002846 -0.006472 0.007900 -0.000855 -0.006714 -0.001448 
+0.005776 -0.000163 -0.011862 0.017674 0.014323 -0.031202 
+0.051078 0.031959 -0.030740 -0.000765 0.004289 0.014996 
+0.001591 -0.003771 -0.016558 0.000944 0.002809 -0.007332 
+0.056757 0.034604 -0.034714 0.026476 0.029048 -0.022762 
+-0.008005 -0.006226 -0.025625 -0.045248 -0.019978 -0.001188 
+-0.050273 -0.060328 -0.024167 -0.027256 -0.027256 0.072683 
+0.044465 0.034563 0.036785 -0.003253 0.021384 -0.000208 
+-0.013370 0.009086 -0.006832 -0.014541 -0.000648 0.001245 
+0.000357 0.003214 -0.011429 0.002367 0.001821 -0.021664 
+-0.044781 -0.022762 -0.023010 -0.011522 0.002356 -0.016455 
+-0.003738 0.001514 -0.011166 -0.005679 -0.007840 -0.019198 
+0.012296 -0.022542 -0.028261 0.018822 -0.019922 -0.033131 
+0.010913 -0.007137 -0.000264 0.007333 -0.044444 0.002444 
+0.081836 -0.045716 -0.049668 0.002289 -0.015058 -0.016873 
+0.001908 -0.009443 -0.011295 0.000229 0.000156 0.004793 
+-0.002105 -0.009055 0.006275 0.009360 -0.007456 0.005174 
+-0.002804 -0.017215 0.009942 -0.019721 -0.002794 0.012430 
+-0.004790 0.002194 0.004082 -0.000103 0.000711 -0.000042 
+0.004257 0.003522 0.000053 -0.002072 0.005151 -0.003910 
+0.004369 0.009379 -0.003087 0.001045 -0.000946 0.000238 
+0.001351 -0.002175 0.003224 0.000047 -0.002484 0.002602 
+0.000405 -0.001351 0.000091 0.004623 0.000740 -0.000493 
+0.004540 -0.001890 -0.004163 0.002306 -0.001214 -0.003761 
+0.000882 0.002982 -0.000112 0.000949 0.002631 -0.001125 
+-0.002542 -0.000796 0.001167 -0.002973 0.001357 0.003491 
+-0.002778 0.002521 -0.002217 -0.003963 0.002907 -0.007403 
+-0.001629 0.007223 -0.003832 0.001432 0.005621 -0.002812 
+-0.000071 0.001659 -0.001977 0.003898 0.003603 -0.002620 
+0.003427 0.003076 -0.004425 0.003754 0.001338 -0.004932 
+0.004444 -0.001778 -0.002444 0.002256 -0.001353 0.001353 
+0.000635 -0.000838 0.001338 0.001340 0.000255 -0.000127 
+0.001428 -0.000742 0.000156 -0.000364 -0.000737 -0.001074 
+-0.000869 -0.002089 -0.004391 0.001745 -0.000435 -0.005266 
+0.000997 -0.001151 0.000647 0.002072 -0.003208 -0.001911 
+0.001367 0.000149 -0.006562 -0.002270 -0.000649 -0.003297 
+0.000051 0.000230 0.000180 0.003441 0.001618 0.004621 
+0.010876 0.008018 0.006189 0.015574 0.019838 -0.000897 
+0.041677 0.013253 -0.012371 0.008413 0.012894 -0.003630 
+0.000851 0.004255 0.004255 0.001494 0.004701 -0.005441 
+0.004444 0.010673 -0.023187 0.034517 0.060406 0.031818 
+-0.001882 0.003689 -0.004516 0.019554 -0.003814 -0.018857 
+0.011134 0.024425 -0.017310 -0.009690 0.017249 -0.020961 
+-0.018313 -0.008667 -0.031230 -0.034058 -0.027119 -0.011565 
+-0.057379 -0.054049 0.029974 -0.003611 -0.064028 -0.062222 
+-0.026076 0.114898 0.014397 -0.000894 0.053901 -0.007743 
+0.005339 0.026039 -0.008439 0.010498 0.017697 -0.012876 
+0.005472 0.005009 -0.030547 0.000236 0.027400 -0.039804 
+0.029751 0.000386 -0.033999 0.011363 -0.008274 -0.013824 
+-0.001791 -0.005994 -0.019898 -0.013497 -0.035668 -0.021197 
+-0.013191 0.017581 -0.026350 -0.013994 -0.004665 0.093293 
+-0.013761 0.024615 0.057179 0.006008 -0.000969 0.009424 
+0.030011 0.012293 0.020142 0.011627 0.013246 0.005611 
+-0.001450 0.011540 -0.023022 0.012907 0.021732 -0.019229 
+0.011088 0.010070 -0.017404 0.004187 -0.004077 -0.006656 
+-0.018796 -0.005369 0.009914 -0.015337 0.000529 0.008775 
+-0.000782 0.007885 -0.003735 0.003433 0.009749 -0.005601 
+0.003083 0.002207 -0.006108 0.001289 0.000165 -0.004723 
+0.004830 0.002903 -0.004980 0.005882 0.002400 -0.005544 
+0.002792 0.003927 -0.000916 -0.000434 0.001519 -0.001085 
+-0.001053 0.000351 -0.000351 -0.000908 0.000129 0.000112 
+-0.001167 -0.000142 0.000150 -0.002358 -0.001884 -0.000206 
+-0.002628 0.000759 0.003251 -0.003679 0.002376 -0.001317 
+-0.000300 0.004244 -0.001152 0.001973 0.002666 -0.001949 
+0.000028 0.000275 -0.000191 -0.002963 -0.000741 -0.000741 
+-0.001117 0.004410 -0.000797 0.004433 0.006878 -0.000810 
+0.001136 0.000629 0.003147 0.003393 -0.000457 0.001860 
+0.005956 0.000650 0.001287 0.008312 0.000540 -0.001550 
+0.003011 0.002409 -0.000722 0.000045 -0.000286 0.000075 
+-0.003531 0.001135 0.000018 -0.002203 -0.000121 -0.002494 
+0.000443 -0.001813 -0.001367 0.001006 -0.004343 -0.003159 
+0.001439 -0.005330 -0.007180 0.007430 0.002233 -0.011780 
+0.002143 0.009308 -0.005131 -0.000369 0.002309 -0.002822 
+-0.001108 -0.005676 -0.001329 -0.001750 -0.006952 -0.004501 
+-0.001746 -0.002696 -0.002644 0.002666 0.007418 0.001329 
+0.010316 0.015722 -0.002365 0.008310 0.008907 -0.001154 
+0.008737 0.004271 0.001213 0.031294 0.019503 -0.015017 
+0.012595 0.011876 -0.006630 0.001032 0.004771 0.002813 
+-0.000901 0.012504 -0.009572 -0.129898 -0.003429 0.131769 
+0.002128 -0.007812 0.026004 0.004866 0.001216 0.001154 
+-0.000319 0.006651 0.001699 -0.002453 0.001951 0.007549 
+0.001846 -0.000751 0.002231 -0.008660 -0.007273 0.025167 
+-0.028888 0.006061 0.016225 -0.018449 -0.049676 -0.048460 
+0.088651 -0.090079 -0.090437 -0.005522 0.000667 -0.003514 
+-0.001303 0.017232 -0.012047 -0.001929 0.010788 -0.013718 
+-0.000020 -0.003317 -0.009961 0.015219 0.016105 -0.017373 
+0.021209 0.007899 -0.022870 0.012778 -0.004583 -0.008256 
+0.000230 -0.005804 0.010272 0.000181 -0.002509 -0.002700 
+0.038500 -0.108824 -0.290456 -0.019265 -0.004220 0.044301 
+-0.020235 -0.004239 0.048501 -0.006132 0.000838 0.009423 
+-0.003106 -0.010675 -0.020774 0.020963 -0.008407 0.000909 
+0.005431 -0.003048 0.004071 0.004279 -0.005513 -0.009251 
+0.016195 -0.005047 -0.023894 -0.000540 -0.019643 -0.019607 
+-0.002329 -0.011707 0.002377 0.007564 0.004332 -0.007091 
+0.009165 0.008145 -0.009405 0.003874 0.006596 -0.000942 
+-0.001301 0.002490 -0.000986 -0.003131 -0.001946 0.001666 
+-0.001708 -0.002945 0.000258 0.000693 0.000135 -0.001392 
+0.002320 -0.000023 -0.001242 0.001095 -0.000031 -0.000923 
+0.000167 -0.000968 -0.000134 -0.002046 -0.001489 0.000427 
+-0.001903 -0.000146 -0.001293 -0.000746 -0.001762 -0.000148 
+-0.003358 -0.001559 -0.001381 -0.000845 -0.001980 -0.004902 
+0.004819 -0.001658 -0.005095 0.003561 -0.001666 -0.006012 
+-0.001308 -0.001038 -0.002872 0.003050 0.005692 -0.004371 
+0.006468 0.006909 -0.008416 0.007854 0.006217 -0.005750 
+0.001944 0.001170 -0.003898 0.001780 -0.001633 -0.003565 
+0.004445 -0.003870 -0.000619 0.008015 0.000200 -0.003807 
+0.000721 0.002410 -0.000811 0.002441 0.004453 -0.001724 
+0.000979 -0.000111 -0.004761 -0.001342 -0.000549 -0.002009 
+-0.002404 -0.000260 -0.002443 -0.002174 0.000514 -0.002319 
+-0.000516 0.001114 0.000435 0.002508 0.002468 0.000342 
+-0.000762 0.002056 -0.001339 -0.001019 0.000044 -0.007593 
+0.001747 -0.008751 -0.006017 -0.000886 -0.013287 -0.003503 
+-0.002757 -0.008448 0.001769 0.002066 0.002616 -0.003190 
+0.004924 0.003875 -0.010908 0.002969 0.005211 -0.009932 
+-0.006494 0.000609 -0.005435 -0.010929 0.019406 -0.015569 
+0.011062 0.025959 -0.001957 -0.003828 0.025682 -0.015976 
+0.016493 0.019471 -0.020673 -0.007723 0.012339 0.008768 
+0.002079 -0.010834 0.013641 -0.000375 -0.015213 0.005726 
+-0.010781 -0.010810 0.004453 -0.020591 -0.001652 0.008864 
+-0.004489 0.005144 0.022767 -0.001849 0.003948 -0.005943 
+-0.002075 -0.002459 0.000921 -0.036170 -0.016851 0.046323 
+-0.013125 -0.009688 -0.002187 0.015789 -0.051579 -0.008947 
+0.013275 -0.017101 -0.033304 0.022265 0.016936 0.002354 
+0.012319 0.015217 -0.003209 0.001138 -0.004642 -0.003296 
+-0.004092 -0.007948 -0.007204 -0.019727 0.001624 0.009606 
+-0.004215 0.002058 0.025954 -0.011232 0.022117 -0.011609 
+0.059813 -0.038821 -0.027317 0.002123 -0.020637 0.044742 
+-0.019531 -0.016315 0.054394 -0.019267 -0.013862 0.047404 
+-0.014897 -0.011754 0.042719 -0.010619 -0.010058 0.042017 
+-0.009511 -0.011900 0.037335 0.009412 -0.032157 0.019216 
+0.008981 -0.000161 0.034991 -0.004124 -0.017517 -0.000118 
+0.012277 -0.008265 -0.006911 0.008958 -0.004919 -0.006115 
+0.005148 -0.003926 -0.007658 0.002155 -0.000427 -0.000546 
+-0.000122 -0.006200 0.000108 0.001894 -0.004362 0.006638 
+-0.001812 0.000387 0.002577 0.004302 0.006586 0.004285 
+0.006048 0.004347 0.002198 0.002173 0.003388 0.001573 
+0.001930 -0.002194 -0.001857 0.000522 -0.002370 -0.004043 
+-0.002618 -0.001218 -0.000745 -0.003703 -0.000333 0.002297 
+-0.002392 0.001408 0.001520 0.000938 -0.000757 -0.000714 
+0.001552 -0.002241 -0.003103 -0.000537 0.002087 -0.002528 
+0.000677 0.004723 -0.006410 -0.000929 0.004496 -0.007254 
+0.001313 0.003462 -0.006774 0.002016 0.005978 -0.002980 
+-0.003888 0.004999 -0.002787 -0.002011 0.001408 -0.000200 
+0.001287 0.001049 -0.004147 0.004127 -0.003559 0.000493 
+0.005131 -0.003344 -0.000721 0.001738 -0.000527 -0.005373 
+0.000058 -0.000629 -0.002494 0.000591 -0.000615 0.000160 
+0.002281 -0.003322 0.002097 0.001071 -0.005153 0.003279 
+-0.000296 -0.002973 0.004425 -0.004461 0.002308 0.003709 
+-0.000303 -0.002974 -0.007403 0.003203 -0.009771 -0.012974 
+0.002229 -0.009980 -0.008405 0.004468 -0.002340 0.000213 
+0.002000 -0.000583 0.005748 -0.001003 0.000569 0.005160 
+-0.003792 0.000185 0.004848 -0.007077 -0.002680 0.007199 
+-0.006823 -0.007110 0.007289 -0.007045 -0.005957 -0.002148 
+-0.002871 0.013011 -0.002561 -0.001508 0.021716 -0.009953 
+0.009004 0.017796 -0.008263 0.036156 0.028011 -0.001508 
+0.012630 0.011374 0.000091 0.002668 -0.009153 0.026282 
+-0.007128 -0.016471 0.019921 0.000625 -0.013374 0.004419 
+-0.004052 0.001634 -0.001075 -0.012330 0.010374 0.004712 
+-0.011058 0.010036 -0.009358 0.003432 0.001384 0.006876 
+0.019489 0.040344 0.007014 0.042603 -0.045728 0.005962 
+0.028232 -0.011059 -0.007882 0.038021 0.025750 -0.000790 
+0.028659 -0.005267 -0.025355 0.011875 0.026050 -0.040703 
+-0.035079 -0.039236 0.040444 -0.096338 -0.055171 0.067478 
+-0.038613 -0.042900 0.004321 -0.002066 0.008419 -0.006419 
+-0.020241 -0.003849 0.041877 -0.010788 -0.017789 0.053165 
+-0.014342 -0.020185 0.053348 -1.834319 -1.603550 4.727811 
+-1.798450 -1.573643 4.736434 -1.896679 -1.996310 4.900369 
+-1.977273 -2.613636 5.085227 -0.003802 -0.030870 0.048132 
+0.063718 -0.010256 0.026667 0.008964 -0.004025 -0.010726 
+0.004323 -0.002126 -0.003308 0.003323 -0.002403 -0.001325 
+0.004347 -0.004723 -0.002683 -0.002186 -0.000137 -0.000546 
+-0.001022 -0.008823 -0.002582 0.001167 -0.005862 0.004689 
+0.004869 -0.002892 0.000051 0.005167 0.000854 -0.000900 
+0.005413 0.002688 -0.002287 0.003677 0.006244 -0.001895 
+-0.002424 0.004485 -0.001996 -0.002357 -0.001173 -0.001630 
+-0.003729 -0.002336 -0.000004 -0.000438 0.000027 0.001788 
+-0.000463 0.004916 0.001099 0.002834 0.005546 -0.000258 
+0.004166 0.002451 -0.003213 0.004961 -0.001060 -0.004600 
+0.005138 0.000254 -0.002740 0.002465 0.000271 -0.000699 
+-0.001567 -0.000294 -0.000860 -0.000797 0.000839 -0.001933 
+-0.004719 -0.002900 0.000309 -0.000581 0.000613 -0.001243 
+0.000665 -0.000199 -0.003307 0.000578 -0.000995 -0.001345 
+0.001665 0.001165 0.000371 -0.000124 0.003101 0.000248 
+-0.000822 0.003477 -0.000878 0.001223 -0.000073 -0.004170 
+0.003935 -0.004452 -0.000747 0.002518 -0.006412 0.002053 
+-0.006634 -0.003772 -0.000532 -0.007455 0.005823 -0.003752 
+-0.000645 0.005761 -0.001280 -0.005232 -0.009453 -0.009522 
+-0.009711 -0.009447 -0.006702 -0.000033 0.002600 0.012240 
+0.009246 0.004569 0.035161 1.120332 -0.037344 4.676349 
+1.153558 -0.164794 4.700375 0.848341 -0.071090 4.000000 
+0.006288 0.001102 0.023504 0.003728 0.005953 0.003764 
+-0.000858 0.001429 -0.008008 0.009442 -0.000172 -0.011754 
+-0.001991 0.004955 0.003649 -0.009563 0.009383 0.019846 
+-0.015137 -0.008248 0.008996 -0.033315 0.000243 0.020128 
+0.021876 -0.013245 0.084790 0.029812 -0.007315 0.016826 
+-0.002083 -0.008438 0.005935 0.004348 0.017039 -0.011751 
+0.025425 0.015709 -0.011059 0.014714 -0.022857 -0.001571 
+0.000774 0.002708 0.003000 -0.019261 -0.001522 0.018431 
+-0.072418 -0.013333 0.018105 -0.075075 -0.020181 -0.000809 
+-0.045670 -0.066138 0.048091 -0.021987 0.097885 0.013108 
+-0.012106 -0.002242 -0.005076 -0.015208 -0.004390 -0.045719 
+0.002797 0.023553 -0.035407 -0.008107 0.007167 -0.002253 
+-0.030246 -0.010769 0.022685 -0.010735 -0.024994 0.050216 
+-0.015019 -0.011999 0.044913 -1.750000 -1.400000 4.818182 
+-1.867069 -1.903323 5.271904 -1.793510 -2.324484 5.418879 
+-1.403361 -2.424370 5.037815 -0.004897 -0.004656 0.025533 
+0.041508 0.052697 -0.032661 0.040967 0.027747 -0.036584 
+0.013513 0.010167 -0.013839 0.009166 0.005530 -0.010198 
+0.002642 0.001901 -0.002852 -0.006513 -0.010266 0.003008 
+-0.008812 -0.009554 0.009554 -0.001067 -0.001243 0.005328 
+0.000316 0.003821 -0.000266 0.001137 0.005550 -0.000970 
+0.000257 -0.000998 -0.000335 -0.001600 -0.004565 -0.000928 
+-0.000989 -0.002438 -0.001022 0.000147 0.001556 -0.000834 
+0.002663 -0.000119 -0.001900 0.002988 -0.003238 -0.001486 
+0.000269 -0.002446 -0.002312 -0.001151 0.000372 0.002122 
+-0.002752 0.002580 0.001663 0.000037 -0.000217 -0.000451 
+0.002296 -0.003276 -0.003565 0.000745 -0.003815 -0.003933 
+-0.001055 -0.001415 -0.002210 0.001182 -0.000011 0.000076 
+0.003065 -0.003111 -0.004586 0.002375 -0.001728 -0.006834 
+-0.000467 -0.000431 -0.007980 0.003538 -0.000647 -0.004026 
+0.003455 0.005590 -0.003575 0.002005 0.004773 -0.004264 
+0.002874 0.003301 -0.006919 -0.000462 0.004312 -0.009698 
+-0.002551 0.000835 -0.007858 -0.003072 -0.000307 -0.005529 
+0.000127 0.001505 -0.000234 -0.001177 0.004170 -0.000831 
+-0.001510 0.001329 -0.000191 -0.005470 -0.007127 -0.010821 
+-0.001141 0.002275 -0.021717 0.006152 -0.002026 0.020216 
+1.461538 -0.315018 5.282051 1.946970 -0.297980 6.512626 
+2.074074 -0.288889 6.713580 1.893333 -0.156667 5.943333 
+1.104046 0.323699 3.884393 0.005061 0.007098 0.010530 
+0.000331 0.006775 -0.003986 0.005177 -0.008363 0.023096 
+-0.036286 0.013143 0.021429 -0.039353 0.015052 0.041463 
+-0.042678 0.008033 0.004452 -0.069941 0.015635 -0.009205 
+-0.001875 -0.035330 -0.010094 -0.003687 -0.083834 0.055582 
+-0.017285 -0.000543 -0.003529 0.017136 0.032010 -0.007688 
+0.024782 0.001739 0.004034 0.007270 -0.003270 -0.003016 
+0.005124 -0.000745 -0.003199 0.000143 0.012214 0.007929 
+-0.006520 0.050000 0.026078 -0.099184 0.136378 0.004133 
+-0.025375 -0.064444 -0.035526 -0.038295 0.030562 -0.005524 
+-0.012767 0.007431 -0.005810 -0.002341 -0.000294 0.003197 
+-0.002050 0.004628 0.003457 0.002114 0.004119 0.002846 
+0.004804 -0.006186 0.003866 -0.012693 -0.006356 0.028851 
+-1.302158 -1.107914 4.719424 -1.879668 -1.775934 5.385892 
+-2.016556 -2.235099 5.466887 -1.868966 -2.410345 5.089655 
+-1.350427 -1.829060 3.987180 -0.005452 -0.007299 0.024868 
+0.001746 0.002036 0.007880 0.005684 0.015055 -0.011817 
+0.011776 0.012540 -0.012682 0.001521 0.003452 -0.006466 
+-0.001343 -0.001847 0.000358 -0.003866 -0.001983 0.002298 
+-0.002591 0.001380 -0.000075 -0.001021 0.004489 -0.002698 
+-0.003446 0.003699 -0.002611 -0.003186 0.002625 -0.001622 
+0.000687 0.001943 -0.000623 0.003561 -0.000969 -0.000954 
+0.004939 0.000899 -0.001740 0.003021 0.002349 -0.004363 
+0.001460 -0.000221 -0.002065 0.000004 -0.005590 0.001859 
+0.002808 -0.004510 -0.000339 0.001695 -0.005572 0.000883 
+-0.000506 -0.003667 0.000353 -0.002898 -0.000020 -0.000400 
+0.000906 0.002152 -0.000793 0.000817 0.000817 -0.007981 
+-0.001682 -0.000952 -0.007235 -0.000732 -0.003423 -0.003677 
+-0.001818 0.003669 -0.007175 -0.000207 0.003168 -0.009027 
+0.002941 0.001443 -0.007398 0.001255 -0.002067 -0.001027 
+-0.000731 -0.001138 -0.001539 -0.001324 -0.000339 -0.002938 
+-0.000029 -0.001344 -0.001798 0.000037 -0.001186 -0.000902 
+0.000509 0.000426 -0.003053 -0.001047 0.004129 0.000688 
+-0.003145 0.006814 -0.005745 0.002359 0.009024 0.002915 
+-0.005819 0.005579 -0.002175 0.025779 -0.000173 -0.015571 
+-0.003772 0.014575 -0.033031 0.003853 0.001419 0.021728 
+1.563422 -0.463127 4.761062 2.083527 -0.638051 5.979118 
+2.343826 -0.510896 6.564165 2.289809 -0.114650 6.318471 
+1.655172 0.408867 4.891625 0.010241 0.004128 0.024339 
+0.000836 -0.001222 0.002300 0.005784 0.005153 0.001622 
+0.004524 -0.000553 -0.000623 0.001166 -0.001111 -0.003305 
+0.003919 0.004536 0.005007 -0.004438 0.001695 0.002171 
+-0.015710 -0.003391 0.007547 0.007060 -0.041150 0.006169 
+-0.038374 0.120027 -0.050739 -0.016207 0.023146 -0.003310 
+0.001199 0.002108 0.003031 -0.012823 0.003952 0.000888 
+0.006947 0.003212 -0.004863 -0.008893 0.010918 -0.035836 
+-0.013834 0.100090 0.018960 0.011498 0.087940 -0.065007 
+-0.004030 0.061339 -0.012760 0.000200 -0.003969 -0.007770 
+0.002637 -0.005194 0.000433 0.009995 -0.001771 0.006917 
+0.001615 0.001403 0.005083 0.006904 0.001035 0.009323 
+0.005740 0.008293 0.004474 -0.013640 -0.004044 0.025844 
+-1.926175 -1.503356 5.342282 -2.400000 -1.952174 5.556522 
+-2.483754 -2.173285 5.039711 -2.297872 -2.085106 4.212766 
+-1.796813 -1.565737 3.211155 -0.006678 -0.006693 0.021335 
+-0.001156 0.003739 0.005142 0.000929 0.006181 -0.008949 
+0.000681 0.000618 -0.000433 -0.000689 -0.004294 -0.003017 
+-0.002783 0.005675 -0.005521 0.000355 0.009523 -0.003649 
+-0.003387 0.002315 -0.006368 -0.000384 -0.003016 0.000529 
+-0.002897 -0.001203 0.001297 0.000423 0.005717 0.000903 
+0.009211 0.012093 -0.000943 0.011763 0.010736 -0.003997 
+0.008493 0.009019 -0.005837 0.004739 0.008637 -0.006173 
+0.002296 0.007268 -0.002614 -0.000341 0.002346 0.001190 
+-0.002152 0.001585 0.000804 -0.003188 -0.003362 -0.003275 
+-0.009195 -0.010012 0.003882 -0.008970 -0.005924 0.001863 
+-0.004774 -0.001185 -0.003606 -0.000038 0.003597 -0.008406 
+0.003262 0.005105 -0.007515 0.005421 0.002490 -0.003320 
+-0.005199 0.000325 -0.004956 -0.004944 -0.000572 -0.004829 
+-0.002807 -0.000080 -0.003611 -0.000721 -0.002349 -0.003928 
+-0.000747 -0.002982 -0.003786 0.000887 -0.000022 -0.002597 
+-0.001323 -0.000670 0.000936 -0.001670 -0.002232 0.005009 
+-0.000478 -0.004808 0.001743 -0.003678 -0.005430 -0.004437 
+-0.002794 -0.003332 -0.003503 -0.001370 -0.001887 -0.001726 
+-0.003540 0.005689 -0.013860 0.008219 0.023522 -0.034801 
+0.004611 0.008883 -0.029878 0.001073 0.002613 0.007369 
+1.125000 -0.386029 3.275735 1.752187 -0.422741 5.020408 
+2.127778 -0.080556 6.008333 2.112500 0.431250 5.946875 
+1.688312 0.809524 4.722944 0.009703 0.008480 0.020809 
+-0.003149 -0.001020 -0.005540 -0.000594 -0.018253 -0.002711 
+-0.000756 -0.002395 -0.009034 0.008704 0.003216 -0.012307 
+0.000771 0.006945 -0.016521 -0.011667 -0.019333 -0.019667 
+-0.009303 -0.005647 -0.027257 -0.014350 -0.003785 -0.013616 
+0.007348 -0.012951 -0.050245 0.001323 -0.003617 -0.000527 
+0.002052 0.003129 -0.003925 -0.002606 0.003280 -0.003862 
+0.001248 0.005944 -0.003268 0.002399 0.007827 -0.022464 
+0.026134 -0.012285 0.060533 0.084149 -0.004181 -0.011470 
+-0.019193 -0.006146 0.007825 0.002680 -0.028007 0.017288 
+0.004491 -0.012791 0.004336 0.007969 -0.005175 0.007075 
+0.007773 -0.004669 -0.012429 0.011592 -0.007308 -0.005796 
+0.013256 0.006671 -0.001916 -0.009386 0.001682 0.037057 
+-1.466667 -0.383333 4.983333 -1.685000 -1.010000 5.280000 
+-1.643678 -1.628353 5.038314 -1.433213 -1.913357 4.223827 
+-1.079498 -1.627615 2.841004 -0.001899 -0.005345 0.011944 
+0.000695 0.002902 -0.004023 0.000281 0.002210 -0.003619 
+-0.010957 -0.004058 0.000953 -0.008410 -0.005202 0.006459 
+-0.006141 -0.001043 -0.009721 -0.012213 -0.001614 -0.005337 
+-0.009709 -0.001362 -0.001874 -0.004824 0.000664 -0.004624 
+0.001978 -0.000296 -0.004151 0.005184 0.001958 -0.001623 
+-0.000424 -0.000995 -0.000255 -0.003251 -0.003707 -0.000339 
+0.000422 -0.001454 -0.000885 0.006286 0.003196 -0.001910 
+0.001052 0.002907 0.001585 -0.000146 0.002132 0.002309 
+-0.000777 0.000863 0.006607 -0.002273 0.000744 0.001448 
+0.001000 -0.002457 -0.003071 -0.000015 0.002859 -0.001437 
+-0.001297 0.001070 -0.002758 -0.002461 0.001510 0.000248 
+-0.001375 0.001295 -0.000412 0.000167 0.004554 -0.003402 
+-0.003838 -0.002598 -0.002575 -0.005923 -0.003119 0.000520 
+-0.001964 -0.002067 -0.005995 -0.003028 0.000332 -0.003101 
+0.002367 0.002725 -0.003958 -0.000100 -0.001748 -0.001513 
+-0.001496 -0.003291 0.004325 0.000350 -0.001805 0.002570 
+0.000278 -0.001627 0.000794 0.003287 -0.002182 0.001101 
+0.001759 -0.004492 -0.001476 -0.004784 -0.001455 -0.003206 
+-0.005392 -0.002282 -0.000855 0.000358 0.001537 -0.006194 
+0.007111 0.005043 -0.013773 0.004758 -0.000555 -0.014516 
+0.002920 0.001727 0.000804 0.007040 0.005916 0.023931 
+1.261364 0.393939 4.056818 1.158301 0.671815 4.532818 
+0.703704 0.925926 3.894180 0.000303 0.010438 0.011873 
+-0.012612 0.005011 -0.020790 0.003220 -0.007145 0.003491 
+0.004595 -0.002448 0.016643 0.004375 -0.002139 0.009092 
+0.001136 -0.002300 0.001307 -0.013597 -0.013513 0.006688 
+-0.010796 -0.010119 0.010889 -0.003279 -0.019693 0.027223 
+-0.003347 -0.022321 0.036970 0.007273 -0.012727 0.012273 
+0.006841 -0.003379 -0.010186 0.001839 -0.003245 -0.011303 
+-0.007143 0.000714 0.000000 -0.003605 -0.000858 0.014231 
+0.006659 0.002103 -0.006087 0.004468 0.027241 -0.017728 
+0.027104 0.016687 -0.014105 0.020168 0.004579 -0.021313 
+0.013683 0.011502 -0.011770 0.002750 0.010353 -0.001412 
+0.001731 0.002429 0.002242 0.004454 -0.000995 0.004779 
+-0.014213 -0.007774 0.000811 0.008399 0.025180 -0.000128 
+0.000655 0.006723 0.029701 -0.286667 -0.753333 4.333333 
+-0.195000 -1.475000 4.410000 -0.059701 -1.457711 3.477612 
+-0.000313 -0.010238 0.015381 0.002798 0.001905 -0.004702 
+0.004249 0.008789 -0.010666 -0.004092 0.001534 0.000585 
+-0.008385 -0.001866 0.010562 -0.009196 0.003991 0.004739 
+-0.009070 0.002231 -0.001940 -0.004550 0.000549 0.000317 
+0.003414 0.004879 -0.002020 0.000295 -0.000916 -0.001044 
+0.002789 -0.000090 -0.001669 -0.003790 -0.003092 0.002455 
+-0.008827 -0.004611 0.004678 -0.007868 -0.001385 0.000777 
+-0.002229 -0.000831 0.000032 0.002297 0.000088 -0.001168 
+-0.000006 -0.000304 -0.000707 -0.001321 0.001262 0.002056 
+-0.001911 -0.003464 0.002908 -0.001143 -0.001448 -0.004343 
+-0.000414 0.003370 -0.013716 0.004846 0.008429 -0.011660 
+0.004501 0.004030 -0.003555 0.002192 -0.002746 0.001135 
+0.000623 -0.004612 0.002254 0.000961 0.001170 -0.002820 
+-0.001489 0.004466 -0.005420 0.004580 0.008783 -0.002196 
+0.007218 0.011383 -0.005452 0.004728 0.008972 -0.010648 
+0.003144 0.004745 -0.005946 -0.000516 -0.000276 -0.001297 
+0.001559 -0.003489 -0.003347 0.001518 -0.001328 -0.005876 
+-0.000438 0.004286 0.000212 -0.003439 0.004050 0.000198 
+-0.002436 0.002820 -0.002085 -0.001915 0.002240 -0.001612 
+-0.002157 -0.000696 -0.001329 0.002512 0.001136 0.001400 
+0.004474 0.003745 -0.002478 0.003635 -0.001404 -0.002887 
+0.002102 -0.001670 -0.010852 -0.000092 -0.000308 -0.001826 
+-0.000161 0.001635 0.006685 -0.000128 0.003874 0.010786 
+-0.003494 0.004911 0.007145 -0.007956 0.001122 -0.009122 
+-0.000132 -0.002503 -0.019360 -0.004516 0.003257 -0.007551 
+-0.003158 0.004617 0.003565 -0.003049 0.001220 -0.001829 
+-0.007090 0.003205 -0.002795 -0.006468 -0.004325 -0.005397 
+-0.002397 -0.003564 -0.000284 -0.002374 0.000551 -0.001508 
+-0.001670 -0.001361 -0.002123 0.001357 0.000097 0.001143 
+0.005017 -0.002272 -0.002367 -0.007453 0.005379 0.003976 
+-0.012892 0.002387 0.002749 -0.006230 -0.004852 -0.001263 
+-0.001719 -0.002319 -0.003114 -0.009602 0.008505 -0.013059 
+0.043840 0.009581 -0.000871 0.033633 0.025564 -0.012201 
+0.020935 0.017285 -0.007683 0.011411 0.007982 0.002098 
+-0.006550 0.006091 -0.008084 -0.002254 0.002461 -0.012552 
+-0.018932 0.005638 -0.016874 -0.000660 0.004302 -0.003042 
+0.002217 -0.001981 0.013840 0.002571 -0.004658 0.020679 
+0.002929 -0.005181 0.019286 0.005734 -0.002925 0.008156 
+0.008816 0.000836 -0.004826 0.008947 0.003126 -0.012572 
+0.002605 0.002949 -0.013565 -0.003413 0.000091 0.001487 
+-0.004517 -0.001473 0.005843 -0.002011 0.002299 -0.000959 
+-0.000480 -0.001379 -0.004838 0.007842 0.001989 -0.004355 
+0.005913 0.005547 -0.007999 -0.002844 0.000723 -0.003224 
+-0.000703 -0.003410 -0.002694 0.001453 0.000869 0.000545 
+0.006344 0.003548 0.001935 0.006893 0.004319 0.000043 
+0.004082 0.000676 0.000375 0.003549 -0.002200 -0.005159 
+0.004515 -0.000196 -0.008964 0.004057 0.003941 -0.008386 
+-0.000427 0.000736 -0.006463 0.000491 -0.000093 -0.003983 
+0.000252 0.000000 -0.001933 0.000272 -0.000224 0.000472 
+0.001271 -0.002445 -0.000489 0.001585 -0.005775 0.000434 
+0.002803 -0.003337 0.001259 0.001540 0.001022 -0.002731 
+-0.000844 -0.001561 -0.002518 0.004594 -0.000667 -0.004613 
+0.008880 0.004595 -0.004336 0.005610 0.005398 0.000864 
+-0.001652 0.003141 -0.003105 -0.000534 -0.000598 -0.003299 
+-0.000078 -0.001408 -0.003947 0.003250 0.002540 -0.003623 
+-0.001434 0.001595 -0.001097 -0.002328 0.001357 -0.002575 
+-0.002042 0.001569 -0.003949 0.000242 0.003801 -0.005163 
+0.000052 -0.000076 -0.000979 0.001271 0.000993 0.002939 
+0.000071 -0.000366 0.001918 -0.000475 -0.000374 -0.000551 
+0.001581 -0.000108 0.000908 0.002195 -0.000194 0.004958 
+0.001289 -0.000529 0.001038 -0.001448 -0.000433 -0.006098 
+-0.003942 -0.002142 -0.008099 0.000903 0.002153 -0.001111 
+0.003387 0.001001 -0.008698 0.000185 0.003708 -0.007558 
+-0.001549 -0.004979 -0.003444 -0.004745 -0.016046 -0.000587 
+-0.005553 -0.018065 0.001382 -0.010278 -0.009444 -0.009444 
+-0.007629 -0.005309 -0.009527 0.002914 0.001706 0.002015 
+0.018620 0.020919 -0.002093 0.002345 0.011336 -0.004215 
+-0.001661 0.004095 -0.000853 -0.000491 0.005251 -0.002147 
+-0.000984 0.011449 -0.003539 -0.001778 0.016124 -0.012045 
+0.005354 0.009883 -0.016800 -0.016513 -0.008931 0.013606 
+-0.016150 0.018596 0.078136 0.056659 0.022779 -0.057452 
+0.039234 0.015088 -0.035379 0.016146 0.004855 -0.018219 
+0.009918 0.013837 -0.011287 0.017132 0.011451 0.001603 
+0.009154 -0.001530 -0.003070 -0.007231 0.009077 0.001692 
+0.003747 0.001946 0.007541 0.004602 0.001480 0.003026 
+0.004427 0.001596 0.000401 0.000812 -0.000162 0.000950 
+-0.002286 -0.000081 0.000429 -0.003303 -0.001072 -0.003515 
+0.001696 0.000372 -0.000662 0.001505 -0.000815 -0.000498 
+-0.001651 -0.003766 0.005311 -0.002653 -0.003973 0.005758 
+-0.000006 -0.001489 0.000871 0.002356 0.002050 -0.004097 
+0.003342 0.001652 -0.006185 0.000217 -0.001186 -0.005277 
+-0.000778 -0.005147 -0.001855 0.002758 -0.001449 -0.003198 
+-0.000206 0.000027 0.000696 -0.000229 -0.002295 0.002812 
+-0.002532 -0.002121 0.000091 -0.000126 -0.000316 0.000253 
+-0.000022 0.001278 -0.005391 -0.000628 0.004352 -0.005650 
+-0.001810 0.001672 -0.003172 0.003987 -0.000159 -0.001514 
+0.001895 0.003144 -0.000993 -0.000385 0.003082 -0.000435 
+0.004015 0.001075 0.000453 0.004061 0.003875 -0.002427 
+0.002452 0.002025 -0.001845 0.000687 0.000644 -0.000283 
+-0.005484 0.000044 0.000148 -0.003411 -0.001023 0.000806 
+0.000148 0.000130 0.000194 0.000366 -0.000014 -0.000847 
+-0.001197 -0.000332 -0.002829 -0.000118 -0.002603 -0.005086 
+0.000788 -0.003735 -0.007228 0.002072 -0.005233 -0.004327 
+-0.002448 -0.001623 -0.004751 -0.002942 0.000765 -0.004267 
+-0.001587 0.001937 -0.002007 -0.001340 0.001330 0.000555 
+-0.000989 0.001506 0.000471 -0.000372 0.002900 -0.002514 
+0.000177 0.006587 -0.006508 0.000284 0.009364 -0.005946 
+0.001836 0.000095 0.004418 0.006112 -0.001015 0.006744 
+0.001524 0.001335 0.004057 -0.005309 -0.000288 -0.005282 
+0.000232 -0.009468 -0.003666 0.006168 -0.000401 -0.005023 
+0.000893 -0.002584 0.002422 -0.003857 -0.008099 0.010478 
+-0.015572 -0.002287 0.017881 -0.012143 -0.000742 0.016309 
+-0.003724 -0.007175 0.012183 0.001822 -0.000578 0.000896 
+0.000395 0.002510 0.000319 0.005000 -0.004941 0.000430 
+0.004265 -0.012453 0.003691 0.004903 0.000019 -0.005444 
+0.011563 0.009684 -0.001898 0.004639 0.013075 0.000999 
+0.001195 0.011411 -0.003067 0.002611 0.010527 -0.010125 
+0.002304 0.003239 -0.019041 -0.004227 -0.008401 -0.015367 
+-0.014526 -0.008847 -0.005906 -0.009026 0.002687 0.014485 
+0.004444 0.000550 0.001237 -0.012481 0.029925 -0.010827 
+-0.019641 0.029596 -0.008886 -0.011313 0.013093 -0.004751 
+-0.003493 0.005522 -0.002491 -0.003329 0.008193 -0.001920 
+-0.000762 0.011333 -0.011524 -0.001326 0.002699 -0.002794 
+0.005237 0.000916 0.002105 0.009965 0.000650 0.001814 
+0.005975 0.000485 0.003646 -0.003581 -0.003226 0.005466 
+-0.005522 -0.003165 0.006818 -0.002874 -0.001033 0.002742 
+-0.000964 -0.000875 0.000799 -0.002166 -0.002231 0.000312 
+-0.001372 -0.001092 -0.000591 0.001074 -0.000259 0.001618 
+0.003237 0.002358 -0.003348 0.004251 0.004719 -0.005243 
+0.002693 0.005386 -0.001153 0.003166 0.001462 0.000669 
+0.000349 0.000645 -0.000005 0.000710 0.001838 -0.002239 
+0.001097 0.002890 -0.001179 -0.002359 0.002486 0.003501 
+-0.006338 0.003433 0.006515 -0.000814 0.001795 0.004024 
+-0.001061 -0.003054 -0.001088 -0.002061 -0.001054 -0.002899 
+-0.001390 0.002094 -0.001232 0.001136 0.005423 0.000278 
+0.004221 0.005929 0.001407 0.007692 0.004267 -0.001048 
+0.007309 0.003395 -0.001108 0.004979 0.002869 0.000776 
+0.002201 0.001773 0.002537 -0.000744 0.002975 0.000744 
+-0.000613 0.000445 -0.000203 -0.002104 0.003672 -0.007892 
+-0.003999 0.001061 -0.006419 -0.003223 -0.000327 -0.004347 
+0.001743 -0.001469 -0.003394 0.001092 -0.002908 -0.001549 
+0.000428 -0.000821 -0.000078 0.000138 0.003494 0.000860 
+0.002183 0.004171 -0.000241 0.000863 0.000216 0.000000 
+-0.001072 -0.000791 -0.001775 -0.002220 -0.000368 -0.004436 
+-0.003096 0.001237 -0.005579 -0.001898 0.004236 -0.001057 
+0.001553 0.001107 0.001947 0.004799 0.001936 0.005156 
+0.009690 0.010059 0.007889 0.009572 0.002770 -0.002882 
+-0.004767 -0.008104 -0.008043 -0.005302 -0.004423 -0.001011 
+0.002396 -0.000193 -0.000022 -0.003108 0.001618 0.002004 
+-0.006538 0.002942 0.000154 -0.010200 -0.001177 -0.000563 
+-0.005356 -0.012774 0.003331 0.001118 -0.005753 0.005081 
+-0.000577 -0.002401 -0.007599 0.024731 -0.004525 -0.003295 
+0.007890 -0.010698 0.000565 -0.001429 -0.006399 0.000758 
+0.001834 0.006452 -0.005038 0.008610 0.012455 0.000501 
+0.009838 0.009901 -0.006133 0.012609 0.006273 -0.016791 
+0.020522 0.006304 -0.010261 0.017504 0.009620 -0.004231 
+0.010647 0.007155 0.000043 -0.001403 0.000463 0.001252 
+-0.008843 -0.006099 -0.004100 -0.001590 -0.004259 -0.006384 
+-0.006169 0.000539 -0.010505 -0.013870 0.001981 -0.013256 
+-0.002345 0.009394 -0.009989 0.007548 0.007981 -0.016370 
+0.008281 0.016212 -0.007208 0.004305 0.006506 -0.001165 
+-0.001602 -0.007103 0.007499 -0.005163 -0.011715 0.022395 
+-0.005146 -0.002086 0.005565 0.002156 -0.006791 -0.004530 
+-0.002449 -0.007551 0.001032 -0.005190 -0.005681 0.001557 
+-0.002246 -0.001055 0.000188 0.000385 0.001212 0.000397 
+0.000935 0.001587 0.000233 0.000702 0.001781 -0.000073 
+0.002626 0.003330 -0.004022 0.004878 0.005059 -0.002645 
+0.004452 0.003828 -0.000999 0.003982 0.002411 0.002381 
+0.010076 -0.001364 0.001894 0.001383 -0.000325 0.003125 
+-0.000344 0.006034 -0.000397 -0.002810 0.002807 -0.001030 
+-0.000365 -0.000118 -0.001760 -0.001919 -0.000695 -0.003007 
+-0.005201 0.000309 -0.003658 -0.005223 -0.000815 -0.001056 
+-0.002292 0.000215 0.001003 0.001087 -0.000284 0.000677 
+0.001033 0.000157 0.001961 -0.000247 0.003042 0.001776 
+-0.000343 0.003859 0.002365 0.002051 0.003511 0.000895 
+-0.001321 0.000237 -0.002168 -0.003825 0.003625 -0.003269 
+0.001429 0.005940 -0.001429 -0.003671 0.002157 -0.002967 
+-0.002420 0.000828 -0.004327 0.000753 0.001204 -0.004671 
+0.000443 0.000271 0.000458 0.002124 0.000738 0.002884 
+0.002649 -0.001042 0.003050 0.002305 0.000146 0.001198 
+0.004009 0.002860 -0.001427 0.003786 0.004101 -0.001341 
+0.001368 0.003404 -0.002671 -0.000039 0.004022 -0.003418 
+-0.002186 0.003864 -0.001067 -0.002436 0.002207 0.000024 
+0.001861 0.000032 0.000603 0.010674 0.010401 0.001044 
+0.021767 0.029810 -0.009314 0.023554 0.044227 -0.014946 
+-0.001485 -0.001724 -0.005676 0.008637 0.004438 -0.008674 
+0.010608 0.009363 -0.010380 0.006019 0.011935 -0.009685 
+-0.000206 0.000567 -0.002858 -0.000186 0.000123 0.001960 
+0.005925 -0.005564 0.001118 0.006383 -0.003747 -0.007006 
+0.034002 0.012264 -0.049332 0.037528 0.000937 -0.025950 
+0.019090 0.002013 -0.008582 0.003952 -0.000055 0.000907 
+-0.002718 0.003204 -0.010735 0.005633 0.020351 -0.031208 
+0.010716 -0.001447 -0.019461 -0.003409 -0.003198 -0.013592 
+-0.007981 -0.012451 -0.000400 -0.007458 -0.011886 -0.004487 
+-0.003330 0.002290 -0.007287 -0.009600 0.004559 -0.005585 
+-0.017864 -0.001030 -0.001750 -0.013803 -0.002747 -0.004244 
+-0.009250 0.001978 -0.004616 -0.010393 0.005558 -0.002177 
+-0.014625 -0.001990 -0.006979 -0.014994 -0.011155 0.005199 
+-0.004534 -0.007071 0.005647 -0.007186 0.002840 0.009736 
+-0.026003 0.010876 0.012568 -0.073561 -0.000985 0.004394 
+-0.003202 0.002351 0.010005 0.001761 0.006478 0.000738 
+0.002347 0.004428 0.000957 0.002944 0.000745 -0.000316 
+0.002419 -0.001307 -0.001582 0.000461 -0.002182 -0.000894 
+-0.000121 -0.000753 0.000089 0.000353 0.002555 -0.000217 
+0.001179 0.003943 -0.001382 0.002457 0.001254 0.000365 
+0.002217 0.001736 0.000345 0.004852 0.004074 -0.000406 
+0.008889 0.005492 -0.000127 -0.000212 0.007860 0.004257 
+0.000617 0.004912 0.000460 -0.000350 -0.001625 0.000092 
+-0.001805 -0.003517 0.000754 0.000379 0.000241 -0.000455 
+0.004032 0.006578 -0.001381 0.005214 0.001043 -0.001731 
+0.000011 0.009879 -0.002504 0.001449 0.005601 -0.002859 
+0.000913 0.001913 0.000913 0.003374 -0.000049 0.002375 
+0.005583 0.003685 0.001463 0.004966 0.006057 -0.001057 
+0.000651 -0.001281 -0.003245 -0.000709 0.001091 -0.002619 
+-0.002388 -0.001663 -0.002690 -0.001726 -0.001945 -0.003727 
+-0.000159 -0.001197 -0.010451 0.004083 -0.000156 0.000254 
+0.000563 0.003116 0.001544 -0.000983 0.006532 0.000737 
+-0.004103 0.001773 -0.000528 -0.003324 -0.001539 0.002416 
+0.002663 0.003216 -0.000307 0.005598 0.008865 -0.006526 
+0.007958 0.000305 -0.004944 -0.001896 0.000685 -0.003725 
+0.000537 0.000165 0.001456 0.000000 0.002283 0.002283 
+-0.004530 -0.000097 0.000188 0.001195 0.000588 0.000002 
+0.003314 0.006136 -0.001131 0.004295 0.009548 -0.001278 
+0.008264 0.018387 -0.001636 0.014903 0.041208 -0.013213 
+0.022891 0.043876 -0.023293 0.031821 0.021260 -0.014105 
+0.016834 0.003293 0.002622 0.013089 -0.003417 0.012457 
+-0.002430 -0.005164 -0.003889 -0.054237 0.005367 -0.119778 
+-0.013936 0.047239 -0.033122 -0.003541 -0.015519 0.040089 
+-0.811024 -2.204724 4.661417 -0.761589 -2.251656 4.655629 
+-0.007689 -0.018525 0.040123 -0.004786 -0.005428 0.008955 
+0.013989 0.022540 -0.035592 -0.008259 0.005945 0.001325 
+-0.003176 -0.007255 0.019725 -0.008234 -0.001388 -0.005152 
+0.001026 -0.000168 -0.028846 -0.010067 0.020435 -0.022940 
+-0.016905 0.007619 -0.009476 -0.006821 -0.004001 -0.004323 
+0.013310 -0.015941 -0.025717 0.019733 -0.010386 -0.004688 
+0.003485 -0.000711 -0.000839 -0.004199 0.004547 -0.003010 
+-0.000610 0.007114 -0.005545 0.006316 0.010795 -0.001029 
+-0.006127 -0.002799 0.025221 -0.070258 0.038923 0.022368 
+-0.020889 0.032788 -0.006383 0.010214 0.011175 0.008043 
+0.010323 0.010794 0.005913 0.008192 0.001785 -0.002377 
+0.000948 -0.002671 -0.001577 -0.001910 -0.001197 0.001531 
+-0.000780 0.001724 0.000720 0.000607 0.002988 0.000898 
+0.000297 0.001394 0.000208 -0.001633 -0.002199 0.003864 
+-0.002062 -0.001720 0.003424 0.000888 0.001154 -0.000670 
+0.003538 0.003157 -0.003039 0.001453 0.001169 0.000453 
+-0.001961 -0.001160 -0.001401 -0.003152 -0.005159 -0.002271 
+-0.003124 -0.003151 -0.002648 -0.000386 -0.001006 -0.001217 
+0.000552 -0.001059 0.001163 -0.000153 -0.000486 0.000306 
+-0.000555 0.002589 -0.001048 0.000616 0.000701 -0.006589 
+-0.000591 0.000959 -0.004213 0.000430 0.001409 0.000338 
+0.002447 0.001451 -0.002198 0.001684 0.004054 -0.003961 
+0.001302 0.001329 -0.003435 0.004159 -0.000618 -0.003389 
+-0.000773 -0.000208 -0.000495 -0.002570 0.001159 -0.004636 
+0.005694 0.001236 -0.002932 0.004022 0.000169 0.000667 
+0.002534 0.001209 0.000317 0.002869 0.004693 -0.002318 
+0.001951 0.004278 -0.006137 0.007207 0.003190 -0.002458 
+0.009524 0.002574 -0.002596 0.006404 -0.001332 -0.001745 
+-0.001721 -0.002325 -0.003004 -0.004309 0.000096 -0.003259 
+-0.001406 -0.000077 -0.001278 -0.004054 -0.001349 -0.001840 
+0.000934 -0.002167 -0.004089 0.000058 -0.002631 -0.002184 
+-0.001503 -0.001253 -0.001664 0.000272 0.000310 0.000400 
+0.000019 0.007231 -0.004805 -0.004229 0.009786 -0.011225 
+-0.006842 0.005311 -0.006257 -0.006755 0.001743 -0.002008 
+-0.003344 -0.004694 0.005185 -0.004378 -0.010285 0.015521 
+-0.005305 -0.005468 0.012327 0.001778 0.008067 -0.051329 
+-0.013149 0.041056 -0.051505 -1.185714 -2.228571 4.414286 
+-1.231544 -2.604027 5.214765 -1.208437 -2.645161 5.208436 
+-1.119777 -2.504178 4.818942 -0.812500 -1.942308 3.754808 
+0.002485 0.005069 0.007278 0.004538 -0.003854 -0.004376 
+-0.000738 0.004940 -0.002560 -0.000319 -0.006658 0.005326 
+-0.007531 -0.015697 -0.001629 -0.050060 -0.046758 -0.002722 
+-0.017788 0.007946 0.012766 -0.009237 0.001548 0.008650 
+0.002114 0.010390 -0.010961 0.017045 0.021590 -0.022228 
+0.013812 0.013945 -0.019974 0.008728 0.012648 -0.012977 
+0.006366 0.015661 -0.010898 0.005049 0.011323 -0.011953 
+-0.000517 0.002399 -0.004756 0.013007 0.010571 -0.021475 
+0.066610 0.038740 -0.056688 0.108184 0.116222 -0.110595 
+-0.004615 -0.012486 -0.000595 -0.017201 -0.016724 0.012040 
+-0.002699 -0.001245 0.001941 0.004584 0.006936 -0.000046 
+0.010432 0.006705 0.000068 0.009431 0.003218 -0.000150 
+0.007493 0.005629 -0.001661 -0.003511 0.004534 -0.002930 
+0.003870 0.005847 0.000773 0.001188 0.003485 -0.000585 
+0.000557 0.001513 -0.000073 0.002129 0.003309 0.003047 
+0.002341 0.003680 0.005352 0.001399 0.001004 0.002121 
+0.000244 -0.002824 -0.003709 -0.001723 -0.002094 -0.002052 
+-0.001375 -0.000291 -0.000926 0.000032 0.000510 0.000284 
+0.004294 0.001682 -0.005976 0.003476 0.003754 -0.001282 
+0.001834 -0.001908 -0.000778 0.001875 -0.000540 0.002341 
+0.003802 -0.000499 -0.000428 0.004944 0.003727 -0.004669 
+0.003669 0.002114 -0.005977 0.004476 0.000210 -0.002288 
+-0.001227 0.000764 -0.000386 -0.000507 0.000440 0.001005 
+-0.001764 -0.001219 -0.000024 0.000650 -0.001237 0.000221 
+0.000676 -0.000432 0.000280 -0.000221 0.001879 0.003783 
+0.001411 0.003277 0.003773 0.000851 0.002065 0.002170 
+-0.000908 0.000375 0.000040 -0.000571 -0.002015 -0.001755 
+0.001294 -0.004065 -0.003159 0.003857 -0.005802 -0.004017 
+0.003506 -0.007662 -0.003339 0.003980 -0.000678 -0.003959 
+0.000383 0.011521 -0.005530 -0.001729 0.012937 0.001277 
+-0.000725 0.015434 0.001694 0.001876 0.023258 -0.014090 
+-0.011965 0.018680 -0.024042 -0.013574 0.009868 -0.017494 
+-0.007900 0.003306 -0.007672 -0.001618 0.001293 -0.002831 
+0.002583 0.001665 -0.005374 0.007334 0.008276 -0.008008 
+0.002206 0.013516 -0.023105 0.002360 0.023104 -0.038672 
+-0.000674 0.017843 -0.015907 -1.273381 -2.086331 4.949640 
+-1.366438 -2.866438 6.034246 -1.309227 -2.960100 5.980050 
+-1.247340 -2.837766 5.526596 -1.079498 -2.284519 4.489540 
+-0.001641 -0.000367 0.015378 -0.003690 0.027454 -0.016997 
+0.001671 0.001588 0.002671 -0.002731 0.000541 0.009945 
+-0.002260 -0.004659 0.004902 -0.000925 0.000961 -0.006446 
+-0.004770 0.002205 -0.003342 -0.007840 0.000641 0.002888 
+-0.011711 0.003088 -0.001135 -0.012555 0.010976 -0.007797 
+0.000370 0.015293 -0.003753 0.005853 0.012789 -0.004147 
+-0.001927 0.003238 -0.008365 -0.002524 -0.000215 0.000092 
+-0.002735 -0.002915 0.003282 0.002343 0.003569 -0.002301 
+0.008651 0.014119 -0.011196 0.008119 0.000185 -0.011254 
+-0.009823 0.009914 0.000524 -0.005155 0.001362 0.009064 
+0.000840 0.003241 0.001190 0.003697 0.003772 0.000507 
+0.003087 0.002558 0.000529 0.001063 -0.000008 -0.000497 
+0.000173 -0.001976 -0.000751 -0.000980 -0.002553 0.000102 
+-0.000057 -0.001975 0.000380 -0.000525 -0.000094 0.000833 
+0.001411 0.000273 -0.000661 -0.002677 0.000243 -0.000558 
+-0.000804 0.001955 -0.000197 0.002915 -0.000520 0.002733 
+0.003363 0.001487 0.002942 0.002144 0.000469 0.000836 
+0.000099 0.001424 0.000115 0.000205 -0.001065 -0.004894 
+-0.000643 -0.001436 -0.002161 -0.001197 -0.000085 -0.000548 
+-0.000778 0.000408 0.001001 -0.000766 0.001740 -0.001567 
+0.006198 0.007438 0.000000 0.004574 0.006634 0.004152 
+0.005912 0.000985 -0.005273 0.004927 0.004010 -0.005165 
+-0.001765 0.006682 -0.003898 -0.002624 0.005655 0.000261 
+-0.003465 0.004204 0.000543 -0.004308 0.002423 0.001112 
+-0.003785 0.001169 -0.000908 -0.001769 -0.001546 -0.002496 
+-0.001245 -0.002799 -0.002303 -0.003663 -0.002352 -0.002283 
+-0.003206 -0.000833 -0.001569 -0.001198 0.001353 0.000353 
+-0.004674 -0.000228 -0.000136 -0.005458 -0.005813 -0.003266 
+0.000103 -0.006903 -0.006608 0.001191 -0.004525 -0.005242 
+0.005850 0.000244 -0.004584 0.008118 0.006901 -0.006747 
+0.006156 0.012492 -0.012969 0.001092 0.013414 -0.021935 
+-0.000437 0.005847 -0.024254 -0.003146 -0.000937 -0.014854 
+-0.005968 0.000806 -0.003871 -0.001008 0.005554 -0.002098 
+-0.000841 0.008543 -0.007462 -0.001520 0.013516 -0.019456 
+-0.011289 0.019352 -0.049000 0.018972 0.022521 -0.047341 
+-0.000913 0.004464 0.001058 -1.007143 -1.535714 4.271429 
+-1.182979 -2.676596 5.914894 -1.225256 -3.085324 6.105802 
+-1.224265 -2.985294 5.411765 -1.036649 -2.188482 3.691099 
+-0.001671 -0.002100 0.004055 0.004826 0.005570 -0.020906 
+-0.003889 0.003739 -0.007641 0.003110 -0.001538 -0.004409 
+0.005278 0.002914 -0.009127 0.002161 0.001164 -0.012082 
+0.005394 -0.002595 -0.002161 0.001638 -0.004730 0.005617 
+-0.004676 -0.001244 0.001028 -0.009342 0.008100 -0.011978 
+-0.012134 0.021871 -0.009042 0.001175 0.015413 -0.006443 
+-0.000490 0.006398 -0.004702 0.000164 0.002246 -0.002575 
+0.003326 0.004740 -0.002419 0.003543 0.007544 -0.002488 
+0.001435 0.006597 -0.002976 0.000180 0.014285 -0.008569 
+-0.015799 -0.012190 0.033464 -0.012458 -0.016662 0.076508 
+-0.002412 0.020493 0.022571 -0.006601 -0.002018 0.001918 
+-0.004447 -0.005720 -0.001484 -0.000428 0.000013 0.000273 
+-0.001375 0.003050 0.001114 -0.002536 0.001837 0.001494 
+-0.000948 0.001812 0.001129 0.002188 0.003236 -0.000760 
+0.004382 0.001537 -0.000612 0.003630 -0.001190 -0.002256 
+0.000569 -0.001956 -0.003038 -0.001719 -0.006258 -0.001706 
+-0.006856 -0.003428 0.000264 -0.006842 -0.002241 0.004276 
+-0.001595 0.001587 -0.004822 -0.001880 -0.001411 -0.005640 
+0.001455 -0.002198 -0.002937 0.002375 0.000085 -0.002078 
+0.000621 0.000831 -0.001259 0.000497 0.002307 -0.000558 
+0.005085 0.002674 0.002282 0.009284 0.004094 0.001376 
+0.003320 0.002721 0.002115 0.002699 0.001694 0.002584 
+0.000323 0.000262 0.003777 -0.000943 0.000629 0.001401 
+-0.003413 0.000427 -0.002133 -0.007414 -0.001095 -0.003427 
+-0.005577 -0.000551 -0.001597 0.001177 -0.000361 0.000221 
+0.003045 -0.001370 0.000988 0.000415 -0.002359 0.000098 
+-0.000368 -0.001710 -0.000355 0.000849 -0.005877 -0.001463 
+0.002505 -0.000717 0.003570 -0.005215 -0.000694 0.009324 
+-0.000911 -0.001872 -0.005025 -0.001703 -0.001853 -0.003225 
+-0.000146 0.000676 -0.001325 0.000612 0.003646 -0.002082 
+0.004493 0.005074 -0.005507 0.000672 -0.001880 -0.008595 
+0.003016 0.004174 -0.008959 0.001575 0.004080 -0.005129 
+-0.001069 0.005031 -0.003996 -0.003821 0.005685 -0.003868 
+-0.004382 0.003964 0.000563 -0.002207 -0.000868 -0.002631 
+0.003167 0.006832 -0.019902 0.003102 0.008930 -0.027810 
+0.000684 -0.000521 -0.003562 -0.008321 -0.011555 0.026642 
+-0.960265 -2.119205 4.278146 -0.870588 -2.494118 4.523530 
+-0.580000 -2.293333 3.646667 -0.000040 -0.010781 0.017316 
+0.004446 0.000796 -0.005750 0.002988 0.005587 -0.014181 
+0.001181 0.009083 -0.005675 0.001039 0.007651 -0.001541 
+0.000804 0.006747 -0.003962 -0.000117 0.003141 -0.002562 
+0.002589 0.002433 0.004365 0.004814 0.002970 0.004746 
+-0.001138 0.000936 -0.000066 -0.001714 -0.002562 0.001378 
+-0.007593 -0.002222 -0.004012 -0.004795 0.001858 -0.009421 
+-0.000823 0.004809 -0.012975 0.008887 0.003532 -0.009218 
+-0.001517 0.005052 -0.001087 -0.001072 0.004391 -0.001419 
+0.000866 0.005680 -0.000528 -0.002173 0.004614 -0.002172 
+-0.014580 -0.024296 -0.012061 0.000420 0.018765 0.065909 
+0.062194 0.157797 0.067999 -0.036750 -0.006401 0.016487 
+-0.016854 -0.006473 0.006505 -0.003460 0.002641 0.004459 
+-0.001077 0.003307 0.002441 -0.002270 0.001185 0.000993 
+-0.003361 -0.001371 -0.000463 -0.001368 -0.002170 -0.001339 
+0.000568 -0.000105 0.000295 0.000962 -0.002209 0.000419 
+-0.002554 -0.003277 0.001123 0.001039 -0.005510 0.003790 
+0.002051 -0.003357 0.002066 0.001588 -0.001356 0.000596 
+-0.000674 0.001609 -0.000620 -0.003380 0.003527 -0.003126 
+-0.001763 0.003787 0.000103 -0.004010 0.000105 0.000317 
+-0.003780 -0.005469 -0.000720 -0.000213 -0.007410 -0.000907 
+0.000008 -0.003016 -0.001784 -0.001861 0.002143 -0.001128 
+0.001274 -0.000407 0.000096 0.001674 0.001535 0.002383 
+0.003357 0.001266 0.002356 0.002326 -0.000262 -0.000012 
+-0.003380 -0.000566 -0.000448 -0.004817 -0.000872 -0.000050 
+0.000676 -0.003302 -0.000563 0.001694 -0.002539 0.000124 
+-0.004906 -0.003665 0.000397 -0.003959 -0.003197 -0.002050 
+-0.000609 -0.006437 -0.003063 0.002512 -0.012976 -0.004172 
+-0.010000 -0.014211 -0.008947 -0.005112 0.005732 -0.001077 
+-0.002914 -0.003081 0.011910 -0.002621 -0.002683 0.012406 
+-0.007644 -0.007348 0.008442 -0.004286 -0.001418 -0.000473 
+-0.002334 0.001058 0.004726 -0.001109 0.001004 -0.001189 
+0.002391 0.003255 -0.003678 0.003361 -0.001572 -0.001078 
+-0.001456 -0.004973 -0.001201 -0.001417 -0.008597 0.014913 
+-0.001784 -0.000471 0.003588 0.002092 0.001986 -0.006727 
+0.007800 0.007574 -0.013854 0.004516 0.012075 -0.018496 
+0.003725 0.009050 -0.012488 0.001141 0.001107 -0.006171 
+0.000788 -0.002050 0.006313 -0.002083 -0.003737 0.012993 
+-0.003220 -0.001767 0.009040 -0.001039 0.000956 -0.001867 
+0.000678 0.003088 -0.012186 -0.004187 0.005426 -0.009463 
+0.006629 0.009149 -0.006177 -0.002593 0.002047 -0.004040 
+-0.005836 0.001148 -0.003092 0.004374 0.002837 -0.007103 
+0.000119 0.009753 0.002339 0.011344 0.016250 -0.002483 
+0.005154 0.008981 -0.003728 0.001928 0.003964 -0.003063 
+0.002375 0.001950 -0.003900 0.000490 0.001120 -0.002420 
+-0.002358 -0.002255 -0.001121 -0.004951 -0.004194 0.000617 
+-0.002476 0.000952 0.000762 -0.000887 0.003296 -0.000991 
+0.002624 0.010991 -0.000323 0.005828 0.013645 0.002231 
+0.005822 0.006071 0.004887 -0.032429 -0.004535 -0.011420 
+0.007042 0.036165 -0.010682 0.011045 0.030638 0.011958 
+0.053382 0.029274 0.007362 -0.001983 0.017451 0.018432 
+0.002197 0.009718 0.009041 0.005216 0.005830 0.003433 
+0.001686 0.002160 0.001314 -0.004905 -0.000884 -0.000150 
+-0.006972 -0.000858 -0.000932 -0.002905 -0.000381 0.000869 
+0.001913 0.000550 0.001605 0.002268 0.001087 0.001912 
+0.000521 0.000953 0.001635 -0.001265 0.000836 -0.000064 
+-0.001681 0.005487 -0.003363 0.000118 0.001517 -0.005550 
+-0.001832 -0.003689 0.001944 -0.004417 -0.005570 -0.002620 
+0.001776 -0.001208 0.000482 0.003465 -0.000843 0.002749 
+0.003236 0.000628 0.002056 0.001926 0.004113 0.000372 
+0.003287 -0.003754 -0.003982 0.001625 -0.000545 -0.000521 
+-0.000666 -0.001959 -0.001614 -0.000004 -0.001821 -0.000989 
+0.002996 0.001146 -0.000002 0.004977 -0.001402 -0.002602 
+0.000146 -0.005965 -0.001952 -0.006175 -0.002961 -0.001938 
+-0.005802 0.001483 -0.001561 -0.007093 0.001982 -0.002550 
+-0.006902 0.005258 -0.000224 -0.004074 0.021076 0.004375 
+0.000137 0.000123 -0.000205 0.006522 -0.002011 -0.006391 
+-0.000583 0.000403 -0.000154 -0.004053 0.000472 0.001045 
+-0.004613 -0.000057 -0.001221 -0.001722 0.002560 -0.001063 
+0.000390 0.001096 0.000586 -0.001268 -0.006781 0.004687 
+-0.000792 0.000419 -0.000026 0.001416 0.000552 -0.001840 
+0.002978 0.000141 -0.001303 0.001260 -0.001997 0.002512 
+0.000377 -0.002802 0.004174 0.001771 -0.002044 0.002533 
+0.003864 0.000217 -0.000044 0.004569 0.003147 -0.003551 
+0.003693 0.008304 -0.009203 0.001655 0.015111 -0.014705 
+-0.000200 0.017554 -0.021424 0.013035 0.010256 -0.022761 
+0.008400 -0.003243 -0.010541 0.003933 0.001503 -0.013332 
+0.001008 0.005307 -0.015235 -0.001377 0.005230 -0.010355 
+-0.000730 0.001295 -0.002030 0.002368 0.000117 -0.000793 
+0.005216 0.004054 -0.006516 0.005616 0.007201 -0.011307 
+0.001644 0.004723 -0.010441 -0.000198 0.002178 -0.006821 
+0.005117 -0.001636 -0.010026 0.009905 0.002733 -0.013777 
+0.006827 -0.000356 -0.011216 0.004177 0.002799 0.000344 
+-0.000756 -0.000283 0.005673 -0.001454 -0.004074 0.005836 
+-0.002169 -0.000908 0.000527 -0.001917 0.001037 -0.007794 
+-0.004847 0.000704 -0.006580 -0.000604 -0.000030 -0.000878 
+0.008498 0.000406 0.010811 0.014527 -0.051386 0.036534 
+0.086706 0.062941 0.007706 0.126214 0.045071 -0.042084 
+0.029189 0.036471 0.015453 0.042060 0.069503 0.044427 
+-0.031251 0.046192 0.059150 0.006509 0.005440 0.001352 
+0.010478 0.005572 0.000409 0.007465 0.004977 0.004368 
+0.002424 0.003791 0.006143 -0.002020 0.003663 0.004004 
+-0.004722 0.001266 0.001038 -0.004200 -0.001470 -0.001852 
+-0.002756 -0.002805 -0.003166 0.001637 -0.001421 -0.003042 
+0.003220 0.003025 -0.006201 0.002251 0.000654 -0.006536 
+-0.000369 -0.003539 -0.005677 -0.002677 -0.003256 -0.006282 
+-0.004908 -0.001574 -0.004435 -0.004184 -0.000069 -0.000297 
+0.001552 0.002146 -0.000682 0.003645 0.004671 -0.000797 
+-0.030678 -0.021608 -0.015013 -0.064618 -0.022255 0.003884 
+-0.043082 -0.016853 0.006236 -0.008452 0.002505 0.004131 
+0.001256 0.010963 0.003727 -0.013070 0.002533 0.003953 
+-0.016216 0.001986 -0.000572 -0.007421 0.006950 0.001761 
+0.004773 0.011481 0.010060 0.011938 0.002004 0.002814 
+0.032991 0.015618 -0.003253 0.046172 0.032068 -0.067826 
+0.006241 -0.007866 0.007511 0.001931 -0.002327 0.002617 
+-0.000554 0.000684 -0.000691 -0.002399 0.002167 -0.002816 
+-0.001822 0.002034 -0.001974 -0.000439 -0.002228 -0.000011 
+0.001042 -0.002551 0.002959 0.003197 -0.000680 0.000247 
+-0.000503 -0.001981 0.001818 -0.004298 -0.005746 0.006812 
+-0.002810 -0.005801 0.008462 -0.000296 -0.002469 0.004412 
+0.000974 0.000127 -0.000307 0.001729 0.001083 -0.001694 
+0.001830 0.000275 -0.000595 0.000738 0.000152 -0.000051 
+0.000131 0.000909 -0.001381 0.000428 0.002965 -0.003228 
+0.000969 0.003025 -0.003876 0.002096 0.002530 -0.005374 
+0.001553 0.002946 -0.007773 -0.000567 0.004540 -0.007910 
+-0.000627 0.004236 -0.005682 0.002573 0.002065 -0.004066 
+0.006548 0.001283 -0.003544 0.008241 0.002679 -0.002914 
+0.007256 0.003455 -0.003750 0.005230 0.003154 -0.005345 
+0.003447 0.005089 -0.006502 0.003064 0.007643 -0.006876 
+0.003227 0.008946 -0.005941 0.002682 0.006763 -0.003351 
+0.000323 0.000378 -0.000169 -0.002040 -0.005063 0.000915 
+-0.006357 -0.004095 0.002421 -0.007875 -0.002477 0.003230 
+-0.004096 0.000000 -0.001446 -0.003274 0.002676 -0.004527 
+-0.001514 -0.000289 -0.008091 0.003381 -0.004890 -0.006954 
+-0.002124 0.003400 -0.010910 -0.003000 0.001000 -0.034706 
+0.026440 0.033618 -0.022551 -0.041375 0.001922 -0.038210 
+-0.103007 0.028105 0.049935 -0.057744 -0.039276 0.016178 
+-0.006853 -0.098378 0.162986 -0.095000 -0.032492 -0.126359 
+0.079827 0.002720 -0.037604 0.033536 0.016505 0.005250 
+0.015517 0.003431 -0.001017 0.006136 -0.000021 -0.000291 
+0.000000 0.001743 0.001981 -0.006711 0.006059 0.007497 
+-0.007959 0.004761 0.008578 -0.000456 0.003625 0.003213 
+0.002530 0.003085 -0.000249 0.003130 0.001709 0.000161 
+0.002748 -0.000272 0.000903 0.001228 -0.002105 -0.000175 
+-0.001650 -0.003237 -0.002529 0.000024 -0.001751 -0.003494 
+0.002321 -0.004168 -0.001563 0.003548 -0.000788 0.000648 
+-0.006435 -0.011263 -0.001125 0.000707 0.000209 0.001280 
+-0.002184 0.038522 0.023621 0.017724 0.043829 0.024378 
+0.009094 0.012328 0.004484 -0.004102 0.003498 0.005129 
+-0.004057 0.005766 0.004335 -0.014032 0.008136 0.000557 
+-0.045276 -0.003235 -0.009318 -0.035371 -0.004673 0.004284 
+0.008741 -0.000843 -0.007597 0.003490 -0.006217 0.003718 
+0.003038 -0.003225 -0.000457 -0.000115 -0.002198 0.002783 
+-0.002504 0.001113 -0.000340 -0.007850 0.002067 -0.002008 
+-0.010429 0.001022 -0.001087 -0.005862 0.001780 0.001505 
+-0.001268 0.001937 -0.002482 0.002347 0.001378 -0.002640 
+0.004162 -0.000037 -0.001484 0.004252 -0.001691 -0.001512 
+0.003070 -0.001243 -0.001959 0.001598 -0.001262 -0.001179 
+0.001092 -0.001280 -0.000528 -0.000476 0.000079 -0.001190 
+-0.004455 -0.001722 -0.001857 -0.005529 -0.001226 -0.002245 
+-0.004620 -0.002344 -0.001980 -0.001904 0.000924 -0.001166 
+0.002163 0.004584 -0.004293 0.002823 0.006674 -0.007434 
+-0.000496 0.004987 -0.006202 -0.004146 0.001006 -0.000983 
+-0.004920 -0.000332 0.003567 -0.002312 0.001299 0.000633 
+-0.000643 0.000824 -0.000170 -0.000183 0.001711 -0.002991 
+0.000017 0.003253 -0.001908 0.004255 0.005342 -0.003323 
+0.008127 0.006899 -0.005338 0.006962 0.006614 -0.002916 
+0.002857 0.002745 -0.000418 -0.000877 0.000236 -0.001182 
+-0.002614 0.004372 -0.006638 -0.003998 0.008525 -0.006343 
+0.001458 -0.004004 -0.010957 -0.002333 -0.000983 -0.001308 
+0.000036 -0.000556 0.001335 0.000654 -0.001160 0.000313 
+-0.000915 -0.008229 -0.002302 -0.005946 -0.024300 -0.008095 
+-0.004733 -0.116033 -0.029833 -0.002023 0.003750 0.038446 
+0.003466 0.002162 0.012662 -0.030350 -0.001886 0.022238 
+-0.045647 -0.052223 0.050455 -0.017731 -0.065013 0.073333 
+-0.042197 -0.067576 0.025303 0.041106 0.008221 0.027500 
+0.086134 -0.101008 0.009916 0.009668 0.000887 -0.036852 
+-0.003596 0.016272 -0.053509 0.007964 0.020691 -0.061851 
+0.122457 -0.018019 -0.090584 0.045945 0.003705 -0.030948 
+-0.030035 -0.031440 0.006472 0.002948 -0.007846 -0.008202 
+0.005220 -0.000925 -0.005017 0.002129 -0.000122 -0.001191 
+-0.001235 -0.003913 0.000475 -0.000009 0.001221 0.006701 
+-0.006421 0.000817 0.003397 -0.006892 -0.002986 0.003879 
+-0.001426 -0.001751 0.000974 0.003498 0.001509 -0.002956 
+0.023945 -0.012944 -0.008747 0.011327 0.001637 0.013009 
+-0.020176 0.022235 0.013176 -0.047386 0.012045 0.019545 
+-0.033958 0.001792 0.045583 -0.011199 -0.003963 0.000441 
+0.010390 0.013968 0.005414 0.014628 0.052141 0.019756 
+0.016862 0.032528 0.005977 -0.000160 -0.013745 0.000980 
+-0.003612 -0.012750 0.011327 -0.001463 -0.005629 0.003553 
+-0.002136 0.000212 -0.002770 -0.003001 0.001154 -0.006750 
+-0.003960 0.000567 -0.007292 0.000725 -0.001450 -0.003329 
+0.002725 0.002337 0.000515 -0.002167 0.000642 0.004312 
+-0.004786 -0.002909 0.007351 -0.004770 -0.005136 0.006267 
+-0.001374 -0.004870 0.002050 0.001547 -0.001580 -0.000118 
+0.001937 -0.000781 -0.000515 0.000240 0.000165 0.000155 
+-0.002011 0.000189 -0.000155 -0.003020 -0.000837 -0.001955 
+-0.002434 -0.001606 -0.002195 0.000759 -0.000846 -0.001132 
+0.001885 0.000247 -0.001453 0.000916 -0.001532 -0.000753 
+-0.000615 -0.002744 -0.000457 -0.001903 -0.003048 0.000033 
+-0.002931 -0.001894 0.000558 -0.002345 0.000722 0.000476 
+-0.001569 0.000407 -0.001394 0.000796 0.001399 -0.006192 
+0.004577 -0.000254 -0.006354 0.004782 0.000180 -0.002046 
+0.000583 -0.000547 -0.000117 -0.002157 -0.000597 -0.000524 
+-0.002494 0.000395 -0.000799 -0.001561 0.000565 -0.000089 
+-0.000683 0.002736 0.000000 0.000386 0.004531 -0.004105 
+0.001553 0.003559 -0.003363 0.001582 0.002045 -0.000166 
+0.000876 0.000125 0.001779 -0.006142 -0.000828 0.001768 
+-0.007059 -0.006824 0.002039 -0.007921 -0.004781 0.005955 
+0.001843 -0.003464 0.004393 0.002943 0.004488 0.000386 
+-0.002737 0.007661 -0.011587 -0.003382 0.008476 -0.003622 
+-0.000474 0.000013 0.005063 0.008981 0.008094 0.009307 
+0.013746 0.022082 0.019483 0.022993 0.053299 0.051497 
+0.029622 0.032645 -0.011483 0.019762 0.015238 -0.050238 
+0.045556 -0.100000 -0.008889 -0.020409 0.004854 0.004211 
+-0.010671 0.099909 -0.031524 -0.035571 -0.015714 -0.011857 
+0.004839 0.009492 0.060021 0.016731 0.000423 -0.030956 
+0.024612 -0.013165 -0.003708 -0.009087 -0.008909 0.002073 
+0.003836 0.004352 -0.000250 0.006202 0.004226 -0.001780 
+0.000767 0.002013 0.000003 -0.002903 -0.000464 0.002083 
+0.001040 0.002734 0.003080 0.001522 0.002690 0.000174 
+0.000640 0.000936 0.000515 -0.001958 0.001371 0.002225 
+-0.123147 -0.001979 0.044201 -0.033131 -0.005859 0.014141 
+0.042039 0.005856 -0.006518 0.046803 -0.033973 -0.009442 
+0.030868 0.009329 -0.032660 0.010100 0.001925 -0.002912 
+-0.008527 0.006988 -0.003299 0.002651 0.030587 -0.003155 
+0.011487 0.000796 -0.005914 -0.017520 -0.008959 0.042485 
+-0.003592 0.004616 0.003245 0.006198 0.005322 0.000757 
+-0.001473 0.000500 -0.003307 -0.000767 0.000613 -0.003087 
+0.004718 -0.002333 -0.002269 0.005056 -0.006578 -0.002366 
+0.002458 -0.002223 -0.001513 -0.000395 0.003378 -0.003000 
+-0.001181 0.006830 -0.003748 0.003521 0.007954 -0.002489 
+0.002234 -0.000172 0.001203 -0.000585 0.000496 0.000729 
+-0.002780 -0.002568 0.000827 -0.001134 -0.001571 -0.000219 
+-0.002592 -0.000401 -0.001224 -0.003087 -0.001262 -0.001586 
+-0.006240 -0.003611 0.000348 -0.005049 -0.002967 0.001874 
+-0.000904 -0.000361 -0.002614 0.002379 -0.000227 -0.008852 
+0.006731 0.001135 -0.010543 0.004583 0.002646 -0.008365 
+0.001445 -0.000415 -0.003933 -0.000418 0.000321 -0.001561 
+-0.001025 0.000212 -0.000707 0.002038 0.001283 -0.001986 
+0.003000 0.003231 -0.002077 -0.000406 0.001649 0.000867 
+-0.003172 0.001107 -0.000293 -0.004641 0.001517 0.000842 
+-0.004424 0.002216 -0.000441 -0.002510 0.004037 0.000026 
+0.001746 0.004484 0.000805 0.001613 0.004429 -0.001085 
+0.000395 0.001222 -0.000961 -0.001372 -0.000489 -0.001370 
+-0.003071 -0.002294 -0.002047 -0.000911 -0.004074 0.004642 
+0.007797 -0.001929 0.011310 0.008953 0.010103 0.004933 
+0.010205 0.004609 0.001372 0.000017 0.004992 -0.001907 
+0.000446 -0.004612 0.003318 0.003134 -0.005140 0.006466 
+-0.011670 0.000546 -0.023411 0.007281 -0.003497 -0.038661 
+-0.020998 -0.023030 -0.054189 -0.024203 0.001068 0.010525 
+-0.002143 -0.006011 0.048088 -0.053383 -0.021925 0.030744 
+-0.021786 0.024107 0.037321 -0.013506 -0.012468 0.033247 
+-0.014964 0.005543 0.008406 -0.000529 -0.006772 -0.002011 
+-0.001455 0.007127 0.003527 0.122581 0.071800 -0.048655 
+-0.005992 0.003887 0.007052 0.002729 0.007152 -0.002841 
+0.008102 0.002977 -0.004063 0.005897 -0.000707 -0.004500 
+0.000584 0.001825 0.000628 -0.002468 0.000474 0.000713 
+-0.003576 -0.000303 0.000048 -0.003367 -0.000484 0.000292 
+-0.000305 -0.001407 0.001254 0.002883 -0.002720 -0.001003 
+-0.106667 -0.064167 0.021667 -0.011793 -0.000934 -0.020404 
+0.029302 -0.087146 -0.038309 0.024163 -0.023337 -0.001377 
+0.017847 -0.004139 -0.009757 0.005023 0.007326 -0.013898 
+-0.003875 0.013819 0.012466 0.047165 -0.023661 0.018455 
+0.018302 -0.028034 0.018202 -0.005234 0.008206 -0.007747 
+-0.004062 0.004361 -0.003444 -0.003889 0.001511 -0.003468 
+0.000190 -0.000712 -0.002153 0.004460 -0.002007 0.005000 
+0.001644 -0.005906 0.006702 0.002280 -0.002423 -0.001293 
+0.002375 0.001474 -0.005912 0.001598 0.001194 -0.003518 
+0.000350 -0.001252 0.000731 -0.001091 -0.003368 0.000297 
+-0.000175 -0.002417 -0.000058 -0.001864 -0.002203 0.001102 
+-0.002779 -0.002911 0.002349 -0.000971 -0.003293 0.000661 
+0.002490 0.001002 0.001932 0.001662 0.001047 0.002601 
+0.000242 -0.000289 -0.000140 0.001620 -0.000923 -0.001837 
+0.004371 -0.001621 -0.001197 0.005855 -0.000604 -0.002886 
+0.003492 -0.000538 -0.005449 0.001974 0.000265 -0.005753 
+0.001582 0.000090 -0.003934 0.000547 0.001849 -0.000232 
+-0.001572 0.002040 -0.000443 -0.001671 0.000741 -0.000886 
+-0.001095 -0.000137 -0.002326 -0.001605 0.000882 -0.001419 
+-0.000875 0.001237 0.000915 0.004655 0.002268 0.000112 
+0.005680 0.000826 0.000534 0.001732 0.001845 0.001300 
+0.001418 0.002797 0.000284 -0.000158 0.003130 -0.002194 
+0.001440 0.000636 -0.000056 -0.000998 0.001087 -0.001497 
+-0.001733 -0.004587 0.002015 -0.003948 -0.011269 0.008184 
+-0.008008 -0.009517 0.006828 -0.003882 -0.000242 0.003465 
+-0.008475 -0.004420 -0.002947 -0.001633 0.001147 -0.002669 
+0.005149 0.003225 0.005717 0.007313 -0.001103 0.011250 
+-0.000789 -0.010260 0.038333 -0.044733 -0.032798 0.015761 
+0.012924 -0.029693 0.020111 0.008297 0.000000 0.005186 
+-0.013676 -0.013493 0.034007 -0.048177 -0.061667 0.042534 
+0.007838 -0.049033 0.038025 0.075128 -0.029192 0.041970 
+-0.046079 0.012006 -0.027842 0.004932 0.078411 0.077589 
+0.099286 0.071071 -0.045357 0.013680 0.026840 -0.013550 
+-0.029933 0.012626 0.024239 0.004112 0.000609 -0.002253 
+-0.004992 -0.007463 -0.002483 -0.010191 -0.007917 0.000646 
+-0.000796 0.002347 0.002118 -0.001373 0.000301 0.000814 
+-0.000484 0.000805 0.000248 0.001550 0.003594 0.001056 
+0.003447 0.002643 0.001798 0.001997 0.001577 -0.000988 
+-0.083379 -0.066069 -0.091241 -0.048612 -0.059229 -0.066696 
+-0.007449 -0.014388 -0.018367 -0.017929 -0.007084 0.001003 
+-0.006410 -0.001990 0.000958 -0.024532 -0.005232 0.000099 
+-0.009118 -0.003382 0.001062 0.009801 0.013528 -0.024300 
+-0.001426 0.002301 -0.001181 -0.002690 0.000054 0.000423 
+-0.001718 0.002931 -0.001282 -0.004761 0.006165 -0.002371 
+-0.002031 0.003987 -0.006933 -0.000059 0.000123 -0.000094 
+0.000773 -0.001720 0.002110 0.000835 -0.000305 -0.000793 
+-0.000043 0.001529 -0.002104 -0.000191 0.002629 -0.002788 
+0.001808 0.004893 -0.001642 0.001092 0.002437 0.001261 
+0.003518 0.001228 -0.000654 0.001002 -0.000287 -0.001031 
+0.000000 0.000469 0.000469 -0.001098 0.002941 -0.001060 
+-0.001478 0.005042 -0.002322 -0.000947 0.003501 -0.001008 
+-0.002188 -0.000379 -0.000400 -0.003606 -0.002182 -0.001058 
+-0.002197 -0.000621 0.000788 0.000478 0.002870 -0.001327 
+0.001472 0.005431 0.000920 0.004217 0.005841 0.002466 
+0.000357 0.006885 0.000292 0.006655 0.003722 -0.008460 
+0.002798 -0.001825 -0.002563 -0.000083 -0.000871 -0.001540 
+-0.000533 -0.000065 -0.000928 -0.001091 -0.000299 -0.001262 
+-0.001462 0.000567 -0.000751 -0.001142 -0.000702 -0.000163 
+0.000964 -0.000131 -0.000375 0.001006 0.003966 -0.003485 
+0.001200 0.002938 -0.006587 0.001493 0.003398 -0.008084 
+0.004890 -0.000622 -0.005067 -0.000130 0.000722 -0.000017 
+-0.000304 0.000712 -0.000742 0.000896 0.002791 -0.001637 
+0.002207 0.007168 -0.004691 0.000597 0.004589 -0.004736 
+0.001039 0.000870 0.003173 -0.003177 -0.004871 0.004242 
+-0.003146 -0.011960 0.003549 -0.011785 -0.014788 -0.006715 
+-0.022432 0.022114 -0.020011 -0.003225 0.034775 -0.005736 
+-0.013750 -0.002492 0.000138 -0.039667 -0.017833 -0.028167 
+-0.008648 -0.005242 0.013801 -0.002486 -0.000344 0.000549 
+0.032321 0.012109 0.006945 0.029309 0.034762 0.008241 
+-0.005630 0.020002 -0.009838 -0.000191 -0.008008 0.002225 
+0.033630 -0.124504 0.041807 0.018447 -0.036895 -0.013177 
+-0.027333 0.077002 0.030551 0.009183 0.010725 0.004833 
+0.020740 0.014477 -0.002910 0.011439 -0.002278 -0.004514 
+0.004684 -0.007335 -0.007018 0.005910 0.001144 -0.002563 
+0.008718 0.003550 -0.001436 0.005989 0.004419 0.000633 
+0.003091 0.003343 0.001347 0.003833 0.000136 0.000591 
+0.116883 -0.020779 0.054545 0.021026 -0.023196 -0.038798 
+0.024692 0.000813 0.009869 0.029720 -0.023755 -0.007910 
+0.007796 -0.059398 -0.031245 0.004018 0.033553 0.000904 
+-0.010628 0.002455 0.012914 -0.000416 -0.002777 0.004148 
+-0.000424 0.001539 -0.000613 0.001524 0.003966 0.001256 
+0.000194 0.000680 0.000833 0.003987 -0.008162 0.002414 
+0.005252 -0.023571 0.003151 0.004945 -0.009442 0.010165 
+0.000417 -0.000993 0.000069 0.001754 0.003475 -0.007934 
+0.004711 0.005988 -0.009491 0.003894 0.003296 0.000159 
+-0.001425 -0.001046 -0.002011 -0.000330 -0.001234 -0.000734 
+0.000062 -0.001418 0.000223 0.000362 0.000684 -0.000033 
+-0.000513 0.002256 0.001128 -0.001997 0.002168 0.000521 
+-0.001963 -0.001156 0.000823 0.000954 -0.001145 0.000973 
+0.003182 0.002673 0.001496 0.005090 0.007029 0.000889 
+0.008743 0.005966 -0.002751 0.004483 0.000409 -0.004281 
+0.000383 -0.000785 0.000436 -0.000630 0.000819 0.002314 
+-0.001936 0.000493 0.001266 -0.000141 0.001412 -0.000381 
+0.000082 -0.000254 -0.000081 0.000855 -0.001185 -0.000805 
+0.000311 -0.001296 -0.001215 0.001442 -0.000430 -0.001169 
+0.000533 0.002322 -0.000220 -0.000574 0.004590 0.000000 
+0.000058 0.006341 -0.000037 -0.000017 0.006369 -0.003167 
+0.001770 0.006622 -0.003667 0.000728 0.005990 -0.003108 
+0.000082 0.003306 -0.000612 0.000568 0.001264 -0.000554 
+-0.000396 -0.000428 -0.000147 -0.002112 -0.000843 -0.001737 
+-0.005718 -0.002848 -0.004206 -0.010372 -0.008683 -0.004434 
+-0.017912 -0.007945 0.004153 -0.009185 -0.012495 0.013566 
+-0.000940 -0.014469 0.011227 -0.002480 -0.019396 0.012568 
+-0.007620 0.031902 -0.025239 -0.018571 0.030171 0.022629 
+0.003294 -0.073000 0.013176 -0.022525 -0.031919 -0.006566 
+-0.001389 0.005278 -0.003889 0.017226 0.000650 -0.072479 
+0.089789 0.008980 -0.053856 0.075704 0.028593 0.025926 
+0.043506 -0.007662 -0.010260 -0.002255 0.021667 0.009020 
+0.046327 -0.000204 0.069592 -0.022222 -0.005916 0.035495 
+-0.115584 -0.052727 -0.021039 -0.028534 0.107586 -0.004265 
+0.071808 0.024811 -0.012909 0.012977 -0.008066 -0.005943 
+0.003923 -0.023756 -0.011077 0.019141 -0.000307 -0.011127 
+0.012831 0.001115 -0.006005 0.005658 -0.000913 -0.001574 
+0.003717 -0.000887 -0.000658 0.003023 -0.000477 -0.001747 
+0.018858 -0.002095 0.094545 -0.015069 -0.013929 0.052296 
+-0.105000 -0.030000 -0.048750 0.000247 0.002346 -0.001358 
+-0.013726 0.007409 0.011739 0.004130 0.000914 -0.018628 
+0.003936 0.003766 -0.017109 0.002255 0.004266 -0.004539 
+-0.002479 0.003871 -0.000208 -0.004175 0.004189 -0.002351 
+-0.003257 0.003286 -0.004797 0.003720 0.007561 -0.011000 
+-0.000751 0.001335 0.001271 -0.003969 0.007001 0.001377 
+-0.001554 0.005474 -0.001299 0.001586 0.001549 -0.002650 
+0.001635 -0.001207 -0.000999 -0.001557 -0.001559 -0.000839 
+-0.003687 -0.001120 -0.000801 -0.002001 -0.002311 0.000939 
+-0.001423 -0.004599 -0.001863 -0.004512 -0.004512 -0.001789 
+-0.004156 -0.001774 0.001039 -0.000979 -0.000117 -0.000051 
+0.000830 0.002284 -0.000294 -0.000451 0.002436 -0.000060 
+-0.000398 0.000158 -0.000152 0.001414 -0.002152 0.000092 
+0.002863 -0.002863 0.002479 0.003145 -0.000942 0.001448 
+0.000836 -0.000454 0.000306 -0.001204 0.001343 -0.004539 
+0.003990 0.000713 -0.000513 -0.001129 0.001887 -0.001503 
+0.000389 0.002451 -0.000770 0.000393 0.002498 0.000028 
+0.001552 0.001732 0.001066 0.001682 0.000703 0.001265 
+-0.000827 0.000132 0.001588 -0.002157 0.000686 0.002351 
+-0.001976 -0.001308 0.001652 -0.001665 -0.002712 0.000547 
+-0.001899 -0.002170 0.000271 -0.000659 -0.002175 -0.000198 
+-0.000177 -0.003923 0.001606 -0.002403 -0.005113 0.003911 
+-0.003143 -0.005630 0.004451 -0.001717 -0.004430 0.002467 
+-0.000731 0.001161 -0.002306 0.001319 0.008506 -0.010658 
+0.009524 0.007290 -0.008540 0.001439 0.004230 -0.000768 
+-0.000372 -0.003415 0.001803 -0.000677 -0.003772 0.001541 
+-0.006579 0.035435 -0.038301 -0.044361 -0.034737 -0.032782 
+-0.089569 -0.009612 0.046897 -0.006667 -0.028889 -0.015556 
+-0.028258 -0.005227 -0.012576 0.044156 -0.067351 -0.051143 
+-0.023516 -0.008066 0.034593 -0.183333 0.073333 0.000000 
+-0.078128 -0.018522 0.025172 -0.110833 0.065833 -0.010417 
+0.018333 -0.027083 0.045417 -0.051905 -0.025238 0.026667 
+0.010952 0.013683 -0.095810 -0.039689 0.084407 -0.060593 
+-0.035694 0.080139 -0.011111 -0.011470 0.002058 0.010250 
+-0.000848 -0.000397 -0.000092 -0.014025 -0.016252 -0.006709 
+-0.017431 -0.019396 -0.007432 0.000875 -0.003186 -0.002080 
+0.001867 0.010781 0.005358 0.001125 0.007462 0.004743 
+-0.008942 0.008798 0.003894 -0.004608 -0.004707 0.011258 
+-0.010090 -0.026398 0.018847 -0.006095 -0.033323 -0.001133 
+-0.006705 -0.026667 0.002682 0.005696 0.003320 -0.018854 
+-0.001489 0.001648 0.001701 0.000244 0.004568 0.000075 
+-0.001098 0.003847 0.000520 -0.003438 0.000760 -0.003312 
+-0.001758 -0.006211 -0.001543 -0.006681 -0.009679 0.012012 
+-0.007275 -0.005850 0.017904 -0.004031 -0.002991 0.012595 
+-0.001184 -0.002710 0.008580 -0.000273 -0.002927 0.007243 
+-0.004173 -0.005885 0.006184 -0.004129 -0.005137 -0.000900 
+-0.001211 -0.004328 -0.000365 0.000160 -0.002094 0.000284 
+-0.000706 0.002392 0.000931 -0.000976 0.002270 0.003164 
+0.000037 0.001919 0.001718 -0.001051 0.000723 0.000927 
+-0.002217 -0.000068 -0.001306 0.000061 -0.003415 -0.000785 
+0.000404 -0.004394 -0.000131 0.004284 -0.000727 0.000286 
+0.006750 0.003060 -0.004516 0.001573 0.002198 -0.004903 
+0.000065 0.002087 -0.002541 0.000238 -0.000642 -0.000821 
+-0.001873 -0.000436 -0.000147 -0.001694 0.000565 0.000000 
+-0.001339 0.002964 -0.002391 0.000140 0.001605 -0.003568 
+-0.000497 0.000508 -0.003441 0.001837 -0.000133 -0.001490 
+0.000874 0.004876 -0.001934 -0.002456 0.004298 -0.001840 
+-0.002404 0.001882 -0.001464 -0.001008 0.002350 0.000951 
+0.000320 0.000545 0.002221 0.001105 0.000411 0.000094 
+-0.000987 -0.000616 -0.001768 0.000264 -0.003183 -0.002786 
+0.002601 -0.002399 0.000101 -0.000176 0.003429 -0.002066 
+0.001255 0.006573 -0.003595 0.001585 0.006333 -0.004310 
+0.000846 0.002467 -0.001662 -0.002465 -0.001273 0.002935 
+-0.006566 0.000862 0.004678 -0.001070 -0.001751 -0.001518 
+-0.005190 -0.001692 -0.006250 0.010032 0.007634 0.005835 
+-0.028108 -0.038333 -0.004685 -0.078889 -0.007821 -0.039103 
+-0.005699 0.008925 0.022688 0.065859 0.089141 0.093131 
+0.060364 -0.015636 0.067091 0.024559 0.040383 0.018008 
+0.044907 -0.067593 0.004537 0.102500 0.000000 -0.143750 
+0.050000 -0.115500 -0.057750 0.052170 -0.033750 -0.014906 
+0.027758 0.046697 -0.022697 -0.035249 0.054434 0.107828 
+-0.018462 0.072308 0.026923 -0.017231 0.025846 -0.029000 
+0.048587 -0.021302 -0.024365 -0.012543 -0.135737 -0.051465 
+0.007718 -0.072080 -0.037632 0.026140 0.002263 -0.007136 
+0.010571 0.022223 0.006286 0.000194 0.027630 0.004002 
+-0.000420 0.002289 0.005698 -0.007571 0.002524 0.008571 
+0.005875 -0.000447 0.033237 0.037510 0.039666 0.023225 
+0.032226 0.055892 -0.073584 0.002518 -0.001896 -0.004182 
+0.002472 -0.000111 -0.003882 0.006481 0.002152 -0.002495 
+0.002326 0.004758 0.000650 -0.001483 0.004537 -0.002141 
+0.000429 0.001043 0.000019 -0.002162 -0.003043 0.002695 
+-0.002793 -0.000320 0.006483 -0.000633 -0.001441 0.004388 
+-0.001027 -0.000563 0.002619 -0.001208 0.000254 0.000214 
+0.000170 -0.001418 -0.003560 0.003455 -0.002800 -0.004245 
+0.003148 -0.001703 -0.002332 0.000735 -0.003265 0.001012 
+-0.000051 -0.000332 0.000757 -0.000048 0.000718 -0.001946 
+-0.000556 0.002270 -0.001482 0.000619 0.003333 -0.000258 
+0.002855 0.004956 -0.000372 0.003029 0.006802 -0.000656 
+0.002447 0.006672 -0.001923 0.001457 0.001713 -0.001952 
+-0.002407 -0.001161 0.003924 -0.002910 -0.001570 0.002083 
+0.000800 0.001431 -0.000220 0.001588 0.002984 0.000353 
+0.001645 0.002195 0.000411 0.000081 -0.000081 0.000081 
+-0.000477 -0.001491 -0.000343 -0.001180 -0.000950 -0.000782 
+-0.001758 0.000147 -0.001173 -0.001909 0.001169 -0.000843 
+-0.000378 0.001128 -0.000601 0.000514 -0.000044 -0.000417 
+-0.002547 -0.002737 -0.000379 -0.001975 -0.005588 0.004118 
+-0.009745 -0.003354 0.000759 -0.005782 -0.003737 0.004763 
+0.000052 0.000209 0.000059 0.003178 -0.001804 -0.002233 
+0.003576 -0.000975 -0.004516 0.001859 0.000442 0.000430 
+-0.000320 0.002560 -0.000800 0.000863 0.003630 -0.002511 
+0.002948 0.008279 -0.006650 0.004872 0.011684 -0.008982 
+0.003874 0.008822 -0.005597 0.004797 0.006279 0.000064 
+0.004159 0.011687 -0.003975 0.005686 0.035822 -0.024374 
+-0.015698 -0.036747 0.006966 0.058571 -0.021786 0.132143 
+0.075053 -0.048316 0.058947 0.158426 -0.128087 0.081574 
+0.009947 -0.072947 0.023684 -0.062337 0.032720 0.061303 
+-0.030805 0.077011 -0.040000 -0.112500 -0.065769 -0.098654 
+-0.060985 -0.160455 -0.045985 -0.034714 -0.088571 0.011571 
+0.011429 -0.011429 -0.044286 0.011111 0.027639 -0.033056 
+0.007879 -0.006970 -0.028788 -0.036667 0.010000 0.000000 
+-0.048105 0.012026 0.007778 0.010828 -0.056448 0.020103 
+0.069554 -0.039109 -0.032838 0.071184 0.008114 -0.015614 
+0.050932 0.001408 -0.021158 0.015109 -0.024699 -0.003816 
+0.019722 0.002113 -0.000564 -0.010823 -0.012411 -0.007658 
+0.003747 -0.004389 -0.006798 0.004205 -0.058932 0.013895 
+-0.002273 -0.013519 0.009595 -0.007784 -0.004543 0.008466 
+-0.011017 -0.003874 0.008973 -0.009994 -0.003904 0.005434 
+-0.007189 -0.002910 -0.000185 -0.005103 -0.002540 -0.004873 
+-0.005395 -0.004303 -0.006184 -0.008296 0.001252 0.005097 
+-0.002451 -0.000257 0.005406 -0.001645 -0.000112 0.002697 
+-0.000785 0.000555 0.000043 0.001000 0.003051 0.002000 
+-0.001796 0.002564 0.004618 -0.000789 0.001316 0.005965 
+-0.002951 -0.001637 0.004998 -0.002034 -0.000847 0.001525 
+-0.000780 0.002262 -0.001751 -0.000054 0.003889 -0.003880 
+0.002066 0.004230 -0.003324 0.004412 0.002670 -0.001571 
+0.003443 -0.000215 0.000059 -0.001335 -0.001723 0.000155 
+-0.002421 -0.003124 -0.000304 -0.000888 -0.000513 -0.000414 
+0.003648 0.000917 -0.000500 0.006838 0.003029 -0.002079 
+0.005153 0.002132 -0.001334 0.000000 0.004146 0.000000 
+0.000403 0.000565 -0.001532 0.001917 0.000422 0.000213 
+0.001628 0.000216 0.000425 0.000766 -0.000353 0.000305 
+0.000667 -0.001985 0.001191 0.002458 -0.002853 0.001629 
+0.005002 -0.002184 0.000221 0.006079 0.002596 0.000888 
+0.006094 0.003528 -0.002780 0.005102 0.004332 -0.003658 
+0.002582 0.004752 -0.001978 0.002281 0.002249 -0.000810 
+0.001451 0.000738 -0.000414 0.000342 0.000581 -0.000283 
+-0.000917 -0.000023 -0.001731 -0.002017 -0.000588 -0.001176 
+-0.002103 -0.001304 0.001451 -0.002209 -0.000659 -0.002075 
+-0.003743 -0.003397 -0.001871 -0.007192 -0.007658 0.001189 
+-0.008246 -0.009681 0.003979 -0.004463 -0.003176 0.000227 
+0.001042 0.006030 -0.001224 0.001950 0.010332 -0.005997 
+-0.004009 0.007520 -0.020647 -0.032424 -0.008832 -0.075310 
+-0.027879 -0.117229 -0.124199 -0.023392 -0.065497 0.007018 
+-0.037386 -0.052386 0.035909 -0.045306 0.015918 0.024898 
+0.007500 0.007500 0.073333 -0.002000 -0.027200 0.054400 
+0.024333 0.073000 -0.036667 0.027269 -0.001296 -0.135046 
+-0.015455 0.015455 -0.071818 -0.032727 -0.016364 -0.046364 
+-0.047778 0.021444 0.002444 -0.010667 -0.012667 0.007333 
+0.014987 -0.026857 0.013117 0.020533 -0.020157 0.040564 
+0.008046 -0.062222 -0.003218 -0.115004 0.008224 -0.039431 
+-0.005660 0.015852 -0.005616 0.020523 0.009610 -0.013723 
+0.000649 0.002537 0.002012 0.000567 0.000747 0.001237 
+0.000299 -0.000425 0.001987 0.000108 -0.006116 0.002476 
+-0.003402 -0.008299 0.001034 -0.003471 -0.005209 0.003570 
+0.001479 -0.002666 0.000347 0.002512 0.001478 -0.000250 
+0.002222 0.003243 -0.000963 0.005711 0.005091 0.001565 
+0.016568 0.015066 0.008042 0.012622 0.026800 -0.048300 
+-0.049967 -0.041960 0.012702 -0.041220 -0.005847 0.007957 
+-0.016791 -0.021124 0.055139 -0.063559 -0.119703 0.053584 
+0.111667 0.077616 -0.028224 -0.020122 -0.029512 -0.009792 
+0.046857 0.023429 -0.080000 0.010216 0.084224 -0.146767 
+0.012884 0.024890 -0.063103 0.026535 0.031754 -0.070614 
+0.023333 -0.061111 -0.113333 0.033144 -0.083794 -0.025014 
+0.012504 -0.009314 -0.002552 -0.009987 0.000287 -0.027953 
+0.004683 -0.021587 -0.006111 -0.016000 0.000000 0.014667 
+0.014965 -0.011613 -0.005150 0.008540 -0.009000 -0.059780 
+0.071758 0.031538 -0.018132 0.035000 0.036875 -0.036875 
+0.009857 0.037143 0.003286 0.022488 0.013582 0.054179 
+-0.053750 0.053750 0.112500 -0.048000 0.024585 0.030732 
+0.084048 0.089524 0.064405 0.004261 0.018246 -0.018546 
+0.052986 -0.045764 0.001806 -0.026190 -0.090714 -0.051905 
+-0.013896 0.014026 -0.023247 -0.023592 0.025969 0.009328 
+-0.033177 0.016626 0.033153 0.006863 -0.020490 0.034216 
+-0.040833 -0.032292 0.047292 -0.071795 -0.042449 0.045679 
+-0.103206 0.009833 0.085191 -0.003667 -0.023667 0.076333 
+-0.005637 -0.015000 0.003382 -0.020714 -0.018571 -0.020714 
+-0.075000 0.012500 -0.017500 -0.037143 -0.038571 0.039286 
+0.006407 0.006074 0.000704 -0.058963 0.001546 -0.005692 
+0.010451 -0.003949 0.009725 0.022417 -0.011340 0.015628 
+-0.002102 0.001916 0.002341 -0.056250 0.009808 -0.014712 
+0.007853 -0.001494 -0.015430 0.012502 0.006693 0.001607 
+0.009078 0.005224 0.004611 0.000649 -0.004217 0.007959 
+0.010100 -0.001611 -0.005339 0.006301 0.019448 -0.008491 
+-0.004503 0.004091 -0.013085 0.011379 0.013132 -0.010042 
+0.011766 0.000293 0.006050 0.005985 -0.000530 -0.000606 
+-0.019548 -0.017166 0.006641 -0.021456 -0.016580 -0.000325 
+-0.019769 -0.014844 -0.014830 -0.027902 -0.018756 0.001644 
+-0.019038 -0.009500 0.004846 0.003882 -0.000577 -0.001614 
+0.007700 0.004196 -0.024961 0.047000 0.027586 -0.011034 
+-0.000712 0.004397 -0.001452 -0.003982 0.002145 -0.002379 
+-0.005432 0.000133 -0.001781 -0.001083 -0.000938 -0.001518 
+0.000867 0.001031 -0.001999 0.000415 0.002948 -0.002726 
+-0.001568 0.001330 0.001529 -0.002650 0.000650 -0.000442 
+0.000381 -0.000917 0.000168 -0.000075 -0.002889 0.002100 
+-0.000705 -0.002446 0.001788 -0.003607 -0.002130 -0.003473 
+-0.047756 -0.060719 0.000570 -0.110342 0.021308 0.080231 
+-0.040593 -0.026883 0.033559 -0.130000 -0.003500 -0.001750 
+-0.046478 0.038470 -0.033480 -0.075750 0.006600 -0.135050 
+0.073846 0.047500 -0.110769 0.018739 0.074958 -0.067143 
+-0.010000 -0.010000 -0.020000 -0.073333 0.060667 -0.030333 
+0.016396 -0.009610 0.013847 0.006667 -0.046667 0.022222 
+-0.053810 -0.046071 -0.015119 0.090558 -0.025039 -0.015180 
+-0.040467 0.035346 -0.005636 -0.014138 -0.004483 -0.012241 
+-0.003099 0.027909 0.038757 0.013333 0.023667 -0.011000 
+0.013750 0.014101 -0.011280 -0.003556 0.010489 -0.009689 
+0.000000 -0.029091 -0.004545 -0.011579 -0.011513 0.080987 
+0.048098 -0.108634 0.071317 0.007667 -0.034333 -0.026667 
+-0.031330 -0.001730 0.021949 -0.055000 0.046667 0.148333 
+-0.029519 0.050433 0.022548 -0.009000 0.000000 0.066000 
+-0.012500 -0.077500 -0.025000 0.008137 -0.061304 -0.001894 
+0.001607 -0.020759 -0.005848 0.000132 -0.017368 0.051711 
+0.048693 -0.030147 0.032467 0.050505 0.019192 0.001010 
+0.014500 -0.004833 -0.017500 0.059164 0.020275 0.095326 
+-0.106111 0.073889 0.032222 -0.023571 0.042857 -0.025714 
+0.036200 0.045600 -0.022000 -0.018397 0.015256 0.026474 
+0.040613 -0.011111 0.016245 0.003827 0.035400 -0.009233 
+-0.002092 0.043418 -0.005514 -0.013603 -0.018498 -0.008021 
+-0.002730 -0.015976 -0.003355 -0.009233 -0.008837 0.003289 
+-0.006429 0.001543 0.002057 0.012249 0.010744 -0.016226 
+0.000413 -0.002576 -0.001985 0.004668 0.000033 -0.002009 
+0.042348 0.014972 -0.026285 -0.010590 0.002967 -0.013077 
+-0.026032 -0.011238 0.023246 0.002520 -0.004699 0.004935 
+0.016789 0.004241 0.008109 -0.000940 0.001113 0.000056 
+-0.010109 0.003408 0.009789 -0.013529 -0.004062 0.005803 
+-0.014702 -0.014290 0.015431 -0.022755 -0.020937 0.023820 
+-0.020354 -0.008595 0.016892 -0.001488 -0.006631 -0.003594 
+0.014469 0.004762 0.001315 0.004575 0.014869 -0.009600 
+-0.003511 -0.002974 0.001892 -0.004085 -0.002513 0.000848 
+-0.001105 -0.000674 0.000893 -0.000262 0.002622 -0.000859 
+0.001453 0.006806 -0.003416 -0.003194 0.006383 -0.003224 
+-0.002950 0.004685 -0.000574 -0.002071 0.001182 0.001011 
+-0.001843 0.000830 0.000720 -0.000458 0.002130 0.001565 
+-0.001925 -0.003973 0.001155 -0.002563 -0.004951 0.002508 
+-0.000769 -0.001721 0.001707 -0.019203 -0.043629 0.029866 
+-0.090000 -0.068629 0.031675 -0.073000 0.020500 0.020500 
+0.002037 0.012407 -0.005185 0.016537 -0.003420 0.015108 
+-0.094894 -0.025007 -0.034088 0.038636 0.058052 0.000065 
+-0.009378 0.056270 -0.015000 -0.001890 0.020508 0.048292 
+0.014706 -0.014706 0.018824 -0.000152 -0.020758 0.011212 
+-0.056270 0.038413 -0.033016 0.053745 0.008958 -0.001429 
+0.011587 -0.014603 0.031746 -0.038636 0.155273 0.117364 
+-0.081667 0.096667 -0.096667 -0.059091 0.075455 0.083636 
+0.049623 0.013193 0.064390 0.052094 -0.024358 0.062226 
+0.022437 -0.037395 0.082857 -0.081636 -0.023091 0.012364 
+-0.038333 0.038333 -0.021667 0.009938 0.061605 0.053642 
+0.036923 -0.026923 -0.026923 0.050920 0.094866 -0.040460 
+-0.039042 0.049885 -0.003257 -0.063728 0.030769 0.042485 
+0.002857 0.028571 0.010000 -0.056325 -0.105896 0.047883 
+-0.059538 -0.019846 0.043846 -0.008788 -0.031061 0.013485 
+0.011494 -0.022414 -0.030268 0.049458 0.006158 -0.070049 
+0.041684 -0.042526 -0.043789 0.070000 0.005769 0.008654 
+-0.134000 -0.016000 -0.134000 -0.047484 -0.041969 -0.024845 
+0.008333 -0.025833 0.013333 -0.036923 -0.024615 -0.063000 
+0.011444 -0.010222 -0.016556 -0.057919 0.066040 0.004150 
+0.004097 0.044778 0.028514 -0.009581 -0.000830 -0.006581 
+-0.003366 0.005054 -0.001248 0.012649 -0.036613 -0.008413 
+0.031376 -0.034952 -0.018353 -0.003137 0.000097 -0.006228 
+0.000256 -0.002218 -0.001231 0.004589 0.002976 -0.001149 
+0.011786 0.012816 -0.008605 -0.006153 0.005037 0.000439 
+-0.008452 -0.006079 0.008314 -0.005830 -0.004819 0.003748 
+-0.001756 -0.001688 0.006190 0.006124 0.003446 0.007158 
+-0.003696 0.004889 0.006622 -0.001687 0.005548 0.005774 
+0.000107 -0.011572 0.011505 -0.010250 -0.013086 0.015466 
+-0.013457 -0.008985 0.005507 -0.008193 -0.006465 -0.001471 
+-0.011102 -0.012911 0.006287 0.002894 -0.021806 0.025617 
+-0.001434 -0.000620 0.000504 0.001251 0.001022 -0.000974 
+0.002424 0.000000 -0.002273 0.001563 -0.000189 -0.000351 
+-0.001584 -0.000716 0.001125 0.000235 -0.000070 0.002304 
+-0.000136 -0.004442 0.001865 -0.002173 -0.005978 0.002502 
+-0.003713 -0.003713 0.000792 -0.002421 -0.002421 -0.000632 
+-0.000619 -0.000711 -0.000665 0.001009 0.001460 0.000486 
+0.004387 0.006545 -0.002410 0.006606 0.006134 -0.007037 
+-0.020575 -0.015216 0.027523 -0.048872 -0.054812 0.116241 
+0.004091 0.047614 0.037386 0.003824 0.001618 -0.004118 
+-0.029091 -0.020909 0.009091 -0.020410 0.015026 0.016564 
+0.030159 0.028095 -0.023968 0.024074 -0.027037 -0.002963 
+0.024259 0.019259 0.008704 0.041250 -0.033750 0.030000 
+0.045442 0.009660 -0.003401 0.000226 -0.008346 0.024361 
+0.007409 -0.027591 0.030273 0.000926 0.013370 0.065926 
+0.037210 0.013762 -0.006458 0.015741 0.065741 0.020370 
+-0.011455 -0.020818 0.055182 -0.041235 -0.029383 0.026543 
+-0.032727 -0.003182 0.024773 0.007388 0.004082 0.009265 
+0.001111 0.052222 -0.105556 -0.008750 0.006875 -0.024375 
+0.113132 -0.008792 -0.041472 0.021351 0.106667 -0.128108 
+0.025051 -0.015960 -0.025657 0.023333 0.013667 -0.019333 
+0.000000 0.020000 -0.020000 0.012564 0.102222 0.007179 
+0.015299 -0.057265 -0.007607 -0.092101 -0.023025 0.089286 
+-0.033984 -0.042480 0.020000 -0.025497 -0.008713 -0.023158 
+-0.080047 0.027681 -0.058478 -0.118269 -0.023654 0.028333 
+-0.118333 0.026333 0.052667 -0.088333 -0.025535 0.007296 
+-0.091542 -0.002985 -0.025970 -0.019815 0.000259 -0.049407 
+-0.057023 -0.005490 -0.021783 -0.020248 0.012066 -0.003471 
+0.008399 0.002483 0.026969 0.011980 0.041459 -0.006545 
+-0.003274 0.021488 -0.007299 0.005936 -0.042823 -0.031939 
+0.003129 -0.015091 -0.011025 -0.002505 0.000844 -0.001276 
+-0.002339 0.002347 0.000267 -0.002033 0.002994 0.001087 
+-0.013398 -0.010256 0.018106 -0.033998 -0.025009 0.007597 
+-0.004907 -0.008246 0.000195 -0.004755 -0.003365 0.004800 
+-0.005360 -0.002314 0.007736 -0.006581 -0.003037 0.006644 
+-0.003370 -0.002439 -0.002259 0.008611 -0.006604 -0.011887 
+0.011449 -0.006408 -0.018751 0.011216 0.007931 -0.018052 
+0.008791 0.010439 -0.003491 0.006084 0.003350 -0.000451 
+-0.000487 -0.005655 0.003452 -0.008448 -0.011072 0.007511 
+0.002073 0.001376 -0.001550 0.002293 0.000438 -0.000725 
+-0.000233 0.000101 -0.000302 -0.003605 -0.000116 -0.001628 
+-0.004769 -0.001231 -0.001077 0.000000 -0.001221 0.001679 
+-0.000711 -0.000807 0.003504 -0.000016 0.000244 0.002892 
+0.002043 0.000692 0.000790 0.001895 0.002893 -0.001735 
+-0.000875 0.005913 -0.007360 0.001257 0.006464 -0.013145 
+0.006802 0.006732 -0.007993 0.004589 0.006820 0.001595 
+0.002734 0.003933 0.006238 -0.008788 -0.006470 0.036121 
+-0.054505 0.081758 0.024286 -0.001313 0.035303 -0.045808 
+-0.006154 0.009231 -0.018667 -0.017422 -0.015388 0.006977 
+-0.053167 0.018333 0.026333 -0.007904 -0.040928 -0.023160 
+-0.047232 -0.023036 -0.020446 -0.045742 -0.034267 0.027477 
+0.024840 -0.000300 -0.033620 0.040000 -0.118500 -0.118500 
+0.034857 -0.092571 0.045714 0.020926 -0.002407 -0.037037 
+0.060417 0.089792 -0.031042 0.090622 -0.030244 -0.060444 
+-0.053000 -0.024000 0.029000 -0.041861 0.022641 -0.006840 
+-0.033683 0.011747 -0.015403 -0.030162 -0.019878 -0.008716 
+-0.016908 0.040592 -0.003947 -0.048182 -0.024545 -0.023636 
+-0.071278 -0.072519 -0.073346 -0.011770 0.042938 0.013992 
+0.005756 0.023689 0.021080 0.028521 0.029227 0.003025 
+0.035143 0.040057 -0.013886 -0.005508 0.027000 -0.044062 
+-0.052381 -0.052095 0.053524 -0.003455 0.017697 0.040788 
+0.022322 -0.018055 -0.019042 0.006860 -0.031322 -0.097851 
+-0.024127 -0.020159 -0.009365 -0.003968 -0.050317 0.073492 
+0.034774 -0.082707 0.053947 0.061667 -0.023462 0.015641 
+0.065826 0.118089 -0.133581 -0.001424 0.045664 -0.061376 
+0.001340 -0.010646 -0.015265 -0.014814 -0.019314 0.015168 
+-0.007852 -0.004198 -0.005569 -0.011059 0.005529 0.023529 
+0.004860 -0.004882 0.002640 -0.001803 -0.000583 -0.001994 
+-0.003187 0.005284 -0.003256 -0.001539 0.002482 -0.000691 
+-0.001198 0.001255 0.000030 0.002690 0.001081 -0.002481 
+0.001266 -0.004580 -0.000916 0.001844 0.008414 0.009233 
+-0.000115 0.007508 0.018241 0.010031 0.009361 0.000004 
+0.007971 0.015719 -0.003860 0.008290 0.001587 -0.000106 
+0.002520 -0.000984 -0.004874 0.001621 -0.001833 -0.008088 
+0.006193 -0.001568 -0.009360 0.010576 0.003379 -0.008072 
+0.004165 0.002030 0.001882 -0.006584 -0.012418 -0.001654 
+-0.020902 -0.020363 0.002068 -0.018638 -0.023476 0.005486 
+-0.002309 0.000463 0.000334 -0.001899 -0.000816 0.000224 
+-0.000522 -0.001109 0.000225 0.000473 0.001172 0.000591 
+0.001239 0.001687 0.001110 0.003406 0.001299 -0.000558 
+0.000568 -0.000520 0.000747 -0.000281 -0.003763 0.002708 
+-0.002351 -0.002554 0.004804 -0.003751 0.003015 -0.001367 
+0.002166 0.009221 -0.011860 0.010494 0.017790 -0.019822 
+0.023066 0.026466 -0.023900 0.022727 0.025392 -0.015751 
+0.004696 0.008202 0.002693 0.001758 0.007815 -0.006840 
+-0.057764 -0.036677 -0.036308 -0.068704 -0.014827 0.122874 
+0.012479 0.026325 0.077607 -0.003137 -0.016667 -0.039608 
+-0.002292 0.000659 -0.005111 -0.016350 -0.010078 0.013322 
+-0.015985 0.015227 0.032727 -0.094167 -0.011154 0.016731 
+-0.037403 -0.037229 -0.004610 -0.023558 -0.121442 -0.043504 
+-0.015354 -0.004387 0.078750 -0.063944 -0.036079 0.124224 
+0.002222 -0.012200 0.085400 0.031250 0.007500 0.003750 
+-0.000043 -0.000214 0.018889 -0.001775 -0.016598 0.007899 
+0.013369 -0.037241 -0.008594 0.006052 0.032299 -0.005805 
+0.010414 0.066688 -0.047554 -0.018889 0.000667 0.000222 
+-0.016053 0.054632 0.013579 -0.000813 0.003236 0.001467 
+-0.019121 -0.014333 -0.012133 -0.040265 -0.012519 0.034328 
+-0.022805 -0.029898 0.077033 0.058205 -0.026838 0.067265 
+0.071111 0.009369 0.051529 0.088118 -0.011057 0.093477 
+-0.013529 0.054853 0.036814 -0.003692 -0.002462 -0.096000 
+-0.009634 -0.015000 -0.022478 0.019167 -0.024167 -0.024167 
+0.001732 -0.076228 -0.097018 0.085417 -0.114167 -0.142917 
+-0.042960 -0.055000 -0.057280 -0.026780 -0.017477 -0.010584 
+-0.021000 -0.005667 -0.028667 0.000511 0.008823 -0.000639 
+0.024003 0.000532 -0.003787 0.015771 -0.015932 0.016075 
+0.015920 -0.001987 0.004512 0.004382 0.016399 0.005175 
+0.000101 0.004598 0.002379 0.002956 -0.000491 0.003099 
+0.002462 -0.000315 -0.000847 -0.001816 0.001884 0.002442 
+0.000008 0.004853 0.008159 0.004473 -0.001468 0.005165 
+-0.009384 -0.013198 0.001217 -0.002025 -0.003204 -0.000603 
+0.000932 0.000056 0.001263 0.001020 -0.005231 -0.001341 
+0.006961 -0.001525 -0.006723 -0.001587 0.001117 -0.001004 
+-0.005878 0.003227 -0.004955 -0.002482 0.004629 -0.008497 
+-0.000950 0.003098 -0.004933 -0.004317 -0.005266 0.001584 
+-0.008988 -0.010329 0.002533 -0.007670 -0.006623 -0.001162 
+-0.004714 0.000246 -0.000616 -0.000089 -0.001097 -0.004744 
+0.000038 -0.003184 -0.002993 0.000084 -0.000775 0.000503 
+0.000314 0.000797 0.002222 -0.000882 -0.001764 0.000630 
+-0.004848 -0.003289 -0.000867 -0.006648 -0.005653 -0.001438 
+-0.008137 -0.001386 -0.000939 -0.005057 0.010127 -0.003401 
+0.007682 0.001942 -0.000442 0.009810 0.021801 -0.015808 
+0.010531 0.025725 -0.020596 0.010683 0.023360 -0.019475 
+-0.000271 0.003794 -0.003411 -0.000473 -0.009624 0.006154 
+-0.017017 -0.025801 0.015920 -0.014512 0.017336 0.022041 
+0.004286 0.005031 0.012938 0.001737 -0.024127 -0.050836 
+0.025626 -0.020923 -0.024330 0.026905 0.033214 -0.005893 
+0.031280 0.091925 -0.008832 -0.044697 0.060606 0.076515 
+-0.011014 -0.073427 0.037937 0.008824 0.035294 0.022143 
+-0.015799 0.009053 -0.018194 0.014120 -0.000068 0.007315 
+0.006108 0.002559 0.024842 -0.024615 -0.030000 0.036923 
+-0.050222 -0.086667 -0.025111 0.083280 -0.074731 0.076156 
+-0.068000 -0.064185 0.036677 0.007500 -0.061250 -0.046250 
+0.053582 -0.049604 -0.026128 0.034387 -0.042000 -0.019104 
+0.011624 0.004249 0.053432 0.009567 -0.006123 0.027743 
+-0.038500 -0.057931 0.023172 -0.047451 -0.062745 0.055098 
+-0.034604 -0.055718 0.109560 0.000508 -0.121356 0.039266 
+0.186667 0.028333 0.158333 0.000274 -0.047591 0.096829 
+-0.084000 0.000000 0.091000 -0.015750 -0.005250 0.033750 
+-0.013457 0.078642 0.011358 0.021857 0.021114 -0.009443 
+-0.068045 0.094071 0.074551 -0.067730 -0.085000 0.048378 
+-0.001429 -0.100067 0.055593 -0.018214 0.027825 -0.019961 
+-0.020124 0.011636 -0.069909 0.009545 0.019221 -0.022359 
+0.010499 0.008191 -0.017100 0.022708 0.001329 -0.006882 
+0.021549 0.015746 0.003880 -0.007411 0.006399 -0.004496 
+0.001950 -0.002213 0.001882 -0.000115 -0.003300 -0.000434 
+0.004501 0.002784 -0.004537 0.003206 0.001607 -0.011585 
+0.001383 -0.003294 -0.005329 -0.018408 -0.101424 0.064788 
+0.037594 -0.100000 0.150374 0.009556 -0.023239 0.027226 
+-0.008622 -0.009146 -0.002673 -0.003754 -0.010451 0.004300 
+-0.001687 -0.005645 0.002125 0.006147 0.001520 -0.003066 
+0.009491 0.007535 -0.009676 0.002276 0.007773 -0.010972 
+-0.000685 0.000813 -0.004441 0.002765 0.002173 0.003734 
+0.007289 0.007038 0.003019 0.003374 0.005009 -0.003530 
+-0.002756 0.002118 -0.002677 -0.004963 0.000458 -0.000732 
+0.000656 -0.002103 0.000429 -0.000248 -0.003950 -0.001809 
+0.000705 -0.001816 -0.002168 -0.000713 -0.001678 0.001837 
+0.000758 0.002580 -0.000340 -0.000494 0.008092 -0.004593 
+-0.001887 0.009759 -0.006544 -0.003121 0.009576 -0.003712 
+-0.006772 0.005094 -0.003326 -0.000469 0.014669 -0.008686 
+0.006793 0.016492 -0.009349 0.007929 0.010368 -0.009143 
+-0.002712 -0.000302 -0.003720 -0.009140 -0.007876 -0.001967 
+-0.010859 0.003156 -0.020053 -0.020982 0.018123 -0.012018 
+-0.003165 -0.016546 -0.001438 -0.007941 -0.001322 0.002834 
+0.005410 0.007315 -0.011074 0.008892 0.017526 -0.011081 
+-0.001039 -0.006183 0.014293 -0.036080 -0.058560 -0.038800 
+0.001384 -0.010767 0.002547 0.028012 0.124737 0.013567 
+0.039934 0.048717 -0.036344 -0.030201 0.012341 -0.041237 
+0.007797 0.010998 -0.046316 0.024079 0.004737 -0.089013 
+-0.017778 0.013504 -0.020256 0.175000 -0.041875 -0.041875 
+-0.008889 -0.004000 0.036444 0.001420 0.000947 -0.020769 
+0.048355 -0.028744 0.012176 -0.060926 -0.136926 -0.020963 
+0.002417 -0.025337 -0.021538 0.022000 -0.002646 -0.001924 
+-0.045100 -0.033569 0.019578 -0.024589 -0.128573 0.028618 
+-0.046629 0.052232 0.013428 -0.103871 -0.076069 -0.002923 
+-0.014667 -0.056667 -0.038381 0.000000 -0.077143 0.131429 
+-0.028651 0.038413 0.035159 0.057500 0.066250 0.000000 
+0.071111 0.000000 -0.004444 0.020000 0.020625 0.103125 
+-0.006667 0.020684 -0.031026 -0.070366 0.025976 0.050884 
+-0.046041 0.053878 0.077061 0.025500 -0.025500 0.018000 
+0.015083 -0.024343 -0.007436 0.000242 -0.015385 -0.001630 
+-0.000708 -0.002189 0.000779 0.002979 0.001027 0.000395 
+-0.002973 0.001322 0.000955 -0.000797 0.001119 0.001547 
+-0.000364 -0.000713 -0.002820 -0.004326 -0.007255 0.000655 
+0.001975 -0.007737 0.002700 0.010085 -0.009288 -0.002747 
+0.021196 -0.018139 -0.003339 0.001084 -0.028428 -0.015557 
+-0.024056 -0.029860 0.113636 -0.024077 -0.029959 0.045250 
+0.014322 0.022104 -0.034695 0.005553 0.004499 -0.007038 
+-0.005965 -0.002820 0.004605 -0.002250 0.000134 -0.003031 
+0.004302 0.008163 -0.009638 0.010124 0.006884 -0.016934 
+0.005879 -0.001419 -0.013472 -0.006730 0.007776 -0.004498 
+-0.008249 0.006365 0.011222 -0.024121 -0.011991 0.011555 
+-0.001374 0.001846 -0.002599 -0.005445 -0.001942 0.000493 
+-0.005489 -0.003416 0.001337 -0.003528 -0.002600 0.002491 
+0.002046 -0.003376 0.005299 -0.000365 -0.002725 -0.000147 
+-0.002794 0.000983 0.001991 -0.001420 0.005566 0.000102 
+-0.002887 0.007094 -0.005322 -0.005481 0.003370 -0.006102 
+-0.003310 0.000776 -0.006621 -0.000309 0.006401 -0.005749 
+0.005130 0.015403 -0.008149 0.012551 0.016467 -0.010894 
+0.006361 0.011439 -0.014683 -0.002192 0.003057 -0.008679 
+-0.005281 -0.012580 0.002320 -0.006867 -0.061875 0.043488 
+-0.013702 0.009092 -0.031906 -0.006681 -0.005913 0.005409 
+-0.010789 0.005407 -0.000225 0.001242 0.011453 0.003894 
+-0.002867 -0.010549 0.016260 0.043241 0.034398 -0.138565 
+0.073626 -0.009089 -0.064081 0.068270 0.026059 -0.017660 
+-0.071201 -0.033396 0.010870 -0.053066 0.003019 -0.034582 
+0.019064 -0.013617 -0.073077 -0.008519 -0.058148 -0.049630 
+0.018636 0.043636 0.020758 0.001608 0.040734 0.011434 
+-0.038542 0.032708 -0.002917 0.077778 -0.064658 -0.024247 
+-0.066250 -0.005500 0.002750 0.033058 -0.108110 0.101861 
+0.001930 -0.011930 -0.004912 0.017291 -0.003140 0.006740 
+-0.006189 0.016434 0.017483 0.014307 -0.023880 -0.019086 
+0.059621 0.100000 -0.025552 0.084029 0.016801 -0.003736 
+-0.091448 0.019024 0.032088 -0.104280 -0.024508 -0.091780 
+-0.027500 0.000000 0.150000 0.015924 0.018098 0.014891 
+-0.009000 -0.080000 0.000000 -0.009600 0.075000 0.012800 
+-0.007937 0.124127 -0.060079 -0.017508 0.075258 -0.058055 
+-0.006301 -0.004207 -0.020167 0.009048 0.003571 -0.021667 
+0.001909 0.031429 0.000201 0.015472 0.053510 0.006240 
+0.005563 0.014626 0.004374 0.004971 -0.004226 0.004922 
+-0.000513 -0.002051 -0.001141 -0.001312 0.008156 -0.005159 
+-0.003988 0.004444 -0.007179 0.002408 0.000644 -0.005788 
+0.000452 -0.008047 -0.001159 -0.016839 -0.061687 0.005590 
+-0.069474 -0.070104 0.059002 0.001231 0.003248 -0.003866 
+0.003651 0.029841 -0.028016 0.057143 -0.129286 -0.038571 
+0.030361 0.001968 0.025194 -0.015923 -0.015030 0.028274 
+-0.010419 -0.006656 0.011628 -0.013353 -0.009757 0.015073 
+-0.004583 -0.005570 0.013319 0.015246 -0.000566 -0.005639 
+0.026667 0.000444 -0.023902 0.013117 0.002388 -0.019747 
+-0.006291 -0.003743 0.008454 -0.017876 -0.010276 0.027449 
+-0.000261 -0.000082 0.000051 0.001358 0.000797 -0.000990 
+0.001167 0.000998 -0.000429 -0.000561 -0.001413 0.001050 
+-0.003492 -0.001561 0.000669 -0.004926 -0.000226 0.000921 
+-0.003796 0.000700 0.001763 -0.002374 0.001661 0.001840 
+-0.003043 0.000426 -0.000596 0.000805 0.001828 -0.000438 
+-0.000472 0.001249 -0.001621 -0.000616 0.003419 -0.003768 
+0.000823 0.011075 -0.003786 0.007650 0.012567 -0.001641 
+0.006486 0.007097 -0.005969 -0.000024 0.001811 -0.003153 
+-0.002144 -0.013585 -0.000075 0.001202 -0.021912 0.000333 
+0.013232 0.086495 0.003525 0.000359 0.017242 -0.002753 
+-0.010871 0.009166 0.001593 0.001805 0.003806 0.002989 
+0.030668 -0.005666 0.017713 0.125040 0.001482 -0.021581 
+-0.001667 0.005208 -0.001042 0.014398 0.015814 -0.000333 
+-0.019086 0.002029 0.011857 -0.020581 0.023073 -0.023488 
+0.048631 -0.005636 -0.142351 -0.016869 -0.002828 -0.009798 
+-0.048182 0.011645 -0.018631 -0.073333 0.036667 0.063333 
+-0.043492 -0.081587 -0.059841 0.077429 -0.060857 -0.085714 
+-0.104692 -0.069615 -0.165538 0.021516 0.025362 0.035158 
+-0.000367 -0.004274 0.009410 0.002963 0.003704 0.001481 
+0.003289 -0.009188 0.009471 0.004702 0.037520 -0.016107 
+0.128986 0.082164 -0.044271 0.036140 0.002187 0.028314 
+-0.066272 0.050392 0.021712 -0.062667 -0.017561 -0.014049 
+-0.025837 -0.008327 0.005510 0.031186 0.016744 -0.009244 
+-0.018889 -0.046667 -0.002222 0.018173 -0.015000 -0.012115 
+0.023506 0.077403 -0.006883 -0.073600 0.036800 0.052000 
+-0.013308 0.021250 -0.119771 0.024476 -0.005679 -0.020899 
+0.022985 0.003406 -0.003081 0.023354 0.016203 -0.007328 
+0.005740 0.006601 -0.023677 -0.003032 0.003613 -0.005384 
+0.000316 -0.003080 -0.001188 -0.000739 -0.005763 -0.003974 
+-0.007002 -0.002928 -0.002958 -0.000717 0.000317 -0.004423 
+-0.002846 0.002882 -0.003096 -0.007488 -0.002628 0.001233 
+-0.003553 -0.008576 0.006334 0.003720 -0.008223 0.007199 
+0.012907 0.000989 0.007423 0.070477 0.024346 0.025372 
+0.084000 -0.045866 0.117941 0.018286 0.019857 0.005571 
+0.095801 0.060371 -0.057954 0.088214 0.026698 -0.033131 
+0.028667 -0.004228 0.008281 -0.018567 -0.010535 0.024750 
+0.000952 -0.000476 0.001429 0.038399 0.018754 0.004699 
+0.018594 0.000211 0.003827 0.000041 -0.003615 0.007489 
+-0.000893 -0.001985 0.000397 0.002475 0.004233 -0.000691 
+0.002913 0.007156 -0.003103 -0.000989 0.004712 0.000501 
+-0.000292 0.002412 0.001096 0.002977 0.002290 -0.006260 
+0.004467 0.002216 -0.004462 0.000454 -0.000370 -0.000865 
+0.000072 0.000935 0.001511 0.000593 0.001753 0.001992 
+0.000058 0.003884 0.000085 -0.000891 0.005585 -0.001808 
+0.000202 0.006212 -0.004054 0.004666 0.004116 -0.000796 
+0.003517 0.004480 -0.002003 0.000437 0.003256 -0.003851 
+-0.001689 0.004612 -0.011960 -0.005873 0.008968 -0.032460 
+0.043283 -0.070858 0.009818 0.001487 -0.003896 0.004138 
+-0.000194 -0.009997 -0.006102 0.008165 -0.008268 0.000204 
+0.034951 0.019755 -0.003630 0.042421 -0.015860 0.013088 
+0.095987 0.066156 0.002712 -0.028190 -0.042629 0.007091 
+0.051480 0.026923 -0.057915 0.034389 0.056977 -0.166046 
+0.009895 -0.002105 -0.023368 -0.000750 -0.045000 0.000250 
+0.003333 0.026667 -0.028333 -0.089412 0.099412 0.125882 
+0.000000 -0.056667 0.063333 -0.029430 -0.049335 -0.019335 
+-0.061538 -0.035769 -0.015769 0.016710 0.068215 0.006409 
+0.033801 0.017251 -0.033099 0.007559 -0.007466 -0.017862 
+0.088919 -0.026177 -0.000409 -0.070921 0.038703 -0.009624 
+-0.019441 0.060559 -0.061678 -0.009536 0.073313 0.016099 
+0.018649 0.033545 -0.025472 -0.004426 0.049564 -0.055051 
+-0.023503 0.007279 -0.017891 -0.015000 0.111429 -0.015000 
+0.020833 0.062500 0.000000 -0.031250 -0.096250 0.030000 
+-0.021035 -0.105569 0.049257 0.016377 -0.008123 -0.000990 
+0.026370 0.011642 -0.039235 0.024667 -0.042394 0.015416 
+0.026296 -0.068604 0.004995 -0.003263 -0.035058 -0.005039 
+-0.012111 -0.014581 0.001832 -0.007737 -0.013432 0.000373 
+0.001592 -0.009297 0.001367 0.001201 -0.004684 -0.003241 
+-0.001398 -0.002322 -0.004724 -0.008628 -0.003742 0.005695 
+-0.003802 -0.002935 0.001914 0.000963 0.000366 -0.000260 
+0.003046 0.000238 0.000065 0.002599 -0.002857 0.002120 
+0.000081 -0.004758 0.004012 -0.000767 -0.003321 0.003314 
+0.005571 0.001900 0.001498 0.028273 0.012016 0.012104 
+0.142708 0.068255 -0.148830 0.000380 0.000237 -0.001200 
+0.129189 0.168108 -0.391081 -0.008988 0.037514 -0.101079 
+-0.018889 -0.014889 -0.051333 0.044964 0.062971 0.019972 
+0.029706 -0.005594 0.010939 0.006029 -0.005205 0.007731 
+-0.002572 -0.005632 0.001278 -0.001567 0.000384 0.000182 
+0.002183 0.004379 -0.002178 0.003656 0.006508 -0.003489 
+0.003519 0.004887 -0.003779 0.002988 0.001924 -0.001177 
+0.002437 0.000046 0.003173 0.000800 0.001131 0.003583 
+0.002325 0.001389 0.001722 0.001035 0.002845 0.000396 
+0.000222 0.003948 -0.001858 0.000418 0.004380 -0.002084 
+-0.000246 0.007396 -0.001557 0.008765 0.010196 -0.008747 
+0.014130 0.013241 -0.009580 0.004344 0.014377 -0.009465 
+0.003894 0.012420 -0.005380 0.003185 0.001867 0.001919 
+0.010539 -0.021867 0.020451 0.021461 0.000629 -0.010347 
+0.005547 -0.016854 -0.002204 0.020705 0.023135 -0.038349 
+-0.014486 0.059634 0.022856 0.015106 0.042275 0.018122 
+0.063619 0.079524 -0.015905 -0.028258 -0.048579 0.064278 
+-0.006959 -0.000235 0.011276 -0.049181 0.030643 0.087485 
+-0.102428 0.073478 0.133587 -0.066266 0.041913 0.013169 
+-0.036838 -0.014402 -0.005427 -0.028889 -0.003016 0.016825 
+-0.058571 -0.003516 -0.005275 -0.120000 0.015000 0.015000 
+0.000952 0.029524 -0.038095 0.006118 0.012785 -0.025203 
+0.001333 0.006800 -0.013600 0.000483 0.019167 -0.003383 
+-0.013125 0.004375 -0.018750 0.060444 0.046263 -0.005232 
+0.082283 0.007971 -0.011486 0.082094 -0.003088 0.028515 
+0.029519 0.026558 0.040948 0.037778 0.052980 0.045412 
+0.012395 0.034605 0.013326 -0.001111 0.010278 0.042222 
+0.004848 0.033030 -0.037879 -0.033333 0.004333 0.013000 
+0.007301 -0.013474 0.014172 0.006767 0.001693 -0.011506 
+0.010052 0.021667 -0.002872 -0.001667 0.006111 0.005556 
+-0.005440 0.032831 -0.003899 -0.025076 0.023872 -0.007855 
+-0.027290 -0.028187 0.014879 -0.006356 -0.020752 0.001033 
+0.002033 -0.002980 -0.005299 -0.001223 0.001752 0.001862 
+-0.002846 0.001062 0.006103 -0.007566 -0.004628 0.005406 
+-0.008020 -0.003977 0.001452 -0.008504 -0.000809 -0.000619 
+-0.007748 -0.001199 -0.000614 -0.004005 -0.003418 0.001375 
+0.000105 -0.001413 0.000673 0.000153 0.003085 -0.001900 
+-0.001857 0.005641 -0.006360 -0.002077 0.001236 -0.003135 
+-0.012918 0.000729 -0.004885 -0.015232 0.006338 -0.013347 
+0.001055 -0.000872 0.001978 0.013342 0.004227 -0.005990 
+0.024082 0.010181 -0.018137 0.012436 0.005947 -0.008274 
+-0.034964 -0.012365 0.013047 -0.025365 0.008280 0.079134 
+-0.001102 -0.011317 0.002446 -0.001414 -0.004098 -0.000424 
+-0.000161 0.000090 -0.000007 -0.000570 0.001614 -0.002373 
+-0.003901 -0.002533 0.001333 -0.002581 -0.006979 0.001865 
+0.001104 -0.005712 0.001041 0.003056 -0.003338 -0.001106 
+0.002752 0.000227 -0.001966 0.002123 0.003587 -0.001736 
+0.002220 0.005483 -0.002748 0.004098 0.008884 -0.003083 
+0.006750 0.015993 -0.004049 0.012368 0.020533 -0.004555 
+0.009332 0.014850 0.001469 0.006404 0.003358 -0.004869 
+-0.001293 -0.005330 0.002628 -0.002441 -0.012400 0.006602 
+0.004960 0.021643 -0.005992 -0.020205 0.031295 0.016636 
+0.000465 -0.000674 -0.000020 -0.018226 -0.002924 0.005214 
+-0.009107 0.012924 0.021485 0.010000 0.009000 0.018000 
+-0.020301 -0.047196 -0.013424 -0.059818 0.063125 0.024649 
+-0.018462 0.059446 0.132185 -0.077870 -0.001574 -0.047593 
+-0.015325 -0.016883 -0.034805 -0.045000 -0.041000 -0.041000 
+-0.035716 -0.026240 -0.016348 0.072100 -0.038182 -0.028840 
+0.065185 0.015185 0.017407 -0.013873 -0.027555 0.047015 
+-0.005973 0.006931 -0.004066 0.001949 -0.000278 -0.002135 
+0.016849 0.008476 0.000137 0.013244 0.027589 0.002754 
+-0.014368 0.006211 -0.037431 0.013725 0.096667 0.011765 
+0.049932 -0.089660 -0.124558 -0.009770 -0.078639 -0.047541 
+-0.043000 -0.072400 0.036200 -0.032742 -0.036452 0.050290 
+-0.013636 -0.044685 -0.029790 0.012472 -0.080528 0.015124 
+0.001302 -0.118889 0.000118 -0.032002 0.051726 -0.004604 
+-0.041176 0.050451 -0.004451 -0.006444 -0.006556 -0.019444 
+0.033198 0.000972 0.052227 0.033737 -0.016616 -0.025051 
+-0.006565 0.056348 -0.020819 -0.053107 -0.001280 -0.005291 
+-0.000063 0.000219 -0.000345 -0.002568 0.006059 -0.007659 
+-0.001688 0.001293 0.008050 -0.003999 -0.005506 0.012200 
+-0.005673 -0.008185 0.008097 -0.004892 -0.006946 0.002587 
+-0.004871 -0.004894 0.000294 -0.005793 -0.003096 -0.000867 
+-0.003017 -0.000713 0.000629 0.002097 -0.000099 -0.001002 
+0.004727 0.000373 -0.001065 0.003632 0.000243 0.000658 
+0.001560 0.000976 -0.000317 0.000190 0.001396 -0.001634 
+0.001212 0.000483 -0.000666 0.002269 -0.000768 0.001244 
+0.000101 -0.001702 0.002169 -0.003181 -0.003848 0.004565 
+-0.005159 -0.004372 0.004971 -0.002403 -0.000226 -0.000374 
+-0.005123 0.003936 -0.008752 -0.006818 -0.000162 -0.001157 
+-0.004378 -0.006888 0.005643 0.000146 -0.002995 0.001412 
+-0.000067 0.001833 -0.000133 -0.000998 0.002699 0.000118 
+-0.000780 0.001293 -0.000334 -0.000735 0.001656 -0.002021 
+0.002195 0.003100 -0.006947 0.004342 0.002679 -0.004403 
+-0.000053 0.000505 -0.001250 -0.000519 -0.001080 0.001994 
+-0.001605 -0.003294 0.001512 0.000552 0.002489 -0.000432 
+0.003416 0.013546 -0.003033 0.010636 0.021613 -0.003076 
+0.007303 0.016259 0.004065 0.005351 0.008027 -0.007065 
+-0.001434 0.003930 -0.003714 -0.001196 0.002023 -0.002844 
+-0.000728 0.006503 -0.007275 -0.000863 0.020123 0.008721 
+-0.022061 -0.003467 -0.003437 0.003581 -0.019298 0.008894 
+-0.013070 -0.019474 0.009149 0.032079 -0.034421 0.007026 
+-0.030083 -0.045083 0.002521 -0.057457 0.004144 0.098619 
+0.058859 0.001929 0.034185 0.009216 -0.007157 -0.000490 
+-0.001012 -0.047410 -0.008247 -0.002873 -0.027841 -0.021698 
+-0.006944 -0.015972 0.002361 0.031730 0.037401 -0.049613 
+0.055333 0.007333 0.103333 0.011828 0.035633 0.007276 
+-0.010324 -0.008837 0.015004 0.002292 -0.025833 0.006875 
+-0.013239 -0.034727 0.004643 0.015330 -0.029775 -0.023217 
+-0.000829 0.026472 -0.015724 -0.002814 0.021861 -0.054978 
+0.035844 -0.052338 -0.055195 -0.048848 -0.061152 -0.043064 
+0.006437 -0.027961 -0.016830 -0.012745 0.006118 -0.021922 
+-0.007787 -0.006489 0.018333 -0.021589 -0.043289 0.064944 
+0.021212 -0.017879 0.046970 0.012097 -0.000815 0.004129 
+-0.003548 -0.007327 -0.030968 0.001951 0.023775 -0.023558 
+-0.009011 -0.065824 0.030659 -0.005658 -0.019270 0.040015 
+-0.006451 0.017347 -0.010754 -0.001162 0.008587 -0.013351 
+0.009926 0.004519 -0.010852 -0.002931 0.000820 0.014484 
+-0.002429 0.000902 0.005045 -0.000317 -0.001523 0.001225 
+-0.001606 -0.003808 0.003208 -0.000947 -0.002906 0.002486 
+-0.000038 0.000243 -0.000276 -0.000151 0.001738 -0.002438 
+0.000467 0.001149 -0.002135 0.000495 -0.000697 -0.001214 
+-0.000524 -0.002184 -0.000240 -0.000027 -0.000564 0.000908 
+0.002895 0.000765 -0.001294 0.004820 0.002065 -0.004992 
+0.003825 0.003238 -0.004924 -0.000233 0.001020 -0.000577 
+-0.004286 -0.001293 0.001140 -0.004728 0.000004 0.000515 
+-0.002155 0.001488 -0.001290 0.000255 0.001182 -0.001266 
+0.001479 0.000932 -0.000456 0.002272 0.004736 -0.003643 
+-0.001316 -0.001558 -0.003796 -0.001208 0.000172 -0.003565 
+-0.000556 0.000841 -0.002044 -0.002663 -0.000944 0.001550 
+-0.003727 0.001547 -0.002296 -0.003270 0.005995 -0.009516 
+0.008232 0.011025 -0.009115 0.005294 0.004430 -0.002365 
+-0.001378 -0.002436 0.001157 -0.002941 -0.005875 0.004774 
+0.000194 -0.009091 0.001293 0.000923 -0.004810 0.002969 
+-0.001731 0.003158 0.001007 0.003248 0.016992 -0.006077 
+0.000234 0.006550 0.007486 0.007397 0.014591 -0.016267 
+0.002153 0.013992 -0.006650 -0.001050 0.005546 -0.005672 
+-0.001342 -0.000553 -0.014324 0.013566 0.004621 -0.024467 
+-0.028914 0.044327 0.000353 -0.031522 0.011902 -0.018944 
+-0.006996 -0.035504 0.022807 -0.011053 -0.008684 0.021316 
+0.005000 0.008400 -0.025200 0.003938 0.012505 0.003085 
+0.070050 0.049277 -0.046898 0.046550 -0.015816 0.003220 
+0.016340 0.013266 0.012971 -0.001689 0.029000 0.020956 
+-0.012582 0.001661 0.084277 -0.008516 -0.033903 0.118419 
+-0.015714 -0.020000 0.027143 0.007727 -0.004242 -0.027424 
+-0.009890 -0.025980 0.013238 -0.011765 -0.028824 0.011176 
+-0.032178 -0.032036 0.024116 -0.028635 -0.039486 0.022434 
+0.012717 -0.015000 -0.010597 0.004192 -0.006644 -0.020245 
+-0.001503 0.051650 -0.066683 -0.041481 0.005185 -0.072593 
+0.008864 0.039591 -0.030136 -0.001122 0.004615 -0.005050 
+-0.023059 0.011529 0.045882 -0.021108 -0.008532 0.047592 
+-0.032857 -0.011429 0.007143 0.028727 -0.024424 -0.014424 
+0.005204 -0.014581 0.017477 -0.015557 -0.009302 0.001333 
+-0.001276 0.008610 -0.012711 -0.001233 -0.017393 0.052110 
+-0.000945 -0.016230 0.023080 0.002362 -0.003547 0.001481 
+-0.002853 -0.006658 0.008507 -0.005513 -0.002273 0.005801 
+0.000838 0.007014 -0.004710 0.001114 0.003933 -0.004045 
+-0.000858 0.001236 0.000008 -0.007641 -0.005213 0.001119 
+-0.003793 -0.005447 0.002703 -0.001813 -0.001608 -0.000409 
+0.001620 0.002077 -0.003282 0.001523 -0.004156 -0.004434 
+-0.003604 -0.003964 -0.003514 -0.000300 -0.004618 0.000721 
+-0.002463 0.000279 0.003823 0.000240 0.000160 -0.000320 
+0.001394 0.001786 -0.001982 -0.001057 -0.001836 -0.000735 
+-0.005125 -0.001201 0.001362 -0.005051 -0.001463 0.003022 
+-0.003697 -0.000672 0.000698 -0.001251 0.000989 -0.000608 
+0.000090 -0.000099 0.000118 0.001688 0.003280 0.000954 
+-0.000447 -0.001000 -0.000043 0.000893 -0.000059 -0.001230 
+-0.001371 0.000753 -0.004437 -0.001566 0.003874 -0.002383 
+0.000942 0.004490 -0.004767 0.003602 0.004717 -0.007490 
+0.004349 0.008542 -0.004193 0.005633 0.005076 -0.003339 
+0.002367 0.003978 -0.001916 0.002275 0.002227 -0.002624 
+0.002003 0.000987 -0.005717 0.002216 0.001683 -0.008127 
+0.002931 0.004497 -0.008796 0.003294 0.010000 0.000941 
+-0.003999 0.004005 -0.005298 0.006451 0.006479 -0.011102 
+0.000995 0.009302 -0.004333 -0.001989 0.004132 -0.005396 
+-0.003008 0.003430 -0.009808 -0.002578 -0.004198 -0.015983 
+-0.025335 -0.018561 -0.005643 -0.062766 0.001491 0.019318 
+0.026364 -0.038462 0.007692 -0.020341 0.005044 -0.007785 
+0.035893 0.012059 0.027474 0.070278 0.043455 -0.050107 
+0.046132 0.057062 0.024147 0.001490 -0.000695 0.029444 
+-0.007310 0.002639 0.030246 -0.006453 0.001303 0.027799 
+0.002063 0.013968 0.019683 0.019863 0.002808 0.007740 
+0.012184 -0.009457 0.008115 -0.077647 0.019412 -0.037778 
+-0.022222 0.008889 -0.041111 0.016015 -0.032459 0.058821 
+-0.001616 -0.034161 0.036334 -0.031437 0.001572 0.025499 
+-0.012721 -0.007117 0.009297 -0.018996 -0.075986 0.047491 
+-0.105605 0.013871 0.004476 -0.070777 0.018151 -0.004223 
+-0.036545 0.008109 -0.009491 -0.016594 -0.001274 -0.019400 
+-0.018656 -0.010803 -0.022707 -0.005686 -0.005518 0.002508 
+-0.006316 -0.016316 -0.010000 -0.007273 -0.034545 0.007273 
+-0.016792 -0.023922 -0.003839 -0.013415 -0.002731 -0.011768 
+0.018102 0.024286 -0.067348 0.021165 -0.001613 -0.049787 
+0.004963 -0.019343 -0.006237 -0.000289 -0.004614 -0.004530 
+0.002329 -0.003699 -0.000342 0.001106 0.011092 -0.006466 
+-0.000480 0.011573 -0.005726 0.000445 0.006015 -0.003696 
+-0.008332 0.001487 -0.000624 -0.006181 -0.000478 0.004641 
+-0.002545 -0.005259 -0.000467 0.006032 -0.004092 0.000151 
+0.007504 0.002863 -0.002509 0.002501 0.000945 -0.007111 
+-0.002162 0.000410 -0.000957 -0.001405 -0.007299 0.003595 
+-0.001779 -0.006934 0.000712 -0.000594 -0.001189 -0.002377 
+0.002820 -0.000146 -0.001935 0.001528 -0.000251 -0.000684 
+-0.001164 -0.000634 0.000938 -0.001546 -0.000333 0.000114 
+-0.000532 0.000419 -0.002162 -0.000180 -0.000132 -0.004215 
+-0.001192 -0.000984 -0.002613 -0.001813 0.000564 -0.000602 
+-0.001595 0.002659 -0.001728 0.000808 0.000354 -0.000202 
+0.003761 0.002943 -0.002064 0.006953 0.005194 -0.005624 
+0.005518 0.004861 -0.008435 0.001318 0.003955 -0.006515 
+0.001431 0.003215 -0.003039 0.002462 0.003308 0.000000 
+0.000746 0.006620 -0.001096 0.006433 0.003895 -0.008806 
+0.000803 0.000634 -0.007479 0.000723 0.000860 -0.005734 
+0.001624 0.002897 -0.005171 -0.001262 0.007346 -0.002815 
+-0.002257 0.007314 -0.007369 0.007835 0.010537 -0.005538 
+-0.001321 0.011024 -0.004088 -0.002210 0.015795 -0.006271 
+0.001329 0.026765 -0.010896 0.000797 0.016542 -0.016748 
+-0.014203 -0.003801 -0.002672 -0.032647 -0.011976 0.024397 
+-0.026651 0.010164 0.027653 0.030523 -0.007447 -0.023240 
+0.081667 -0.081667 0.098333 -0.000336 -0.026591 0.104852 
+0.024269 -0.010209 0.039940 0.004061 -0.008194 0.009717 
+0.000000 -0.005781 -0.004335 -0.010362 -0.020721 0.006910 
+0.003377 -0.032291 -0.012135 0.005792 -0.063571 -0.008108 
+0.046941 0.018706 -0.081294 -0.036000 0.086000 -0.024000 
+0.034583 0.034583 -0.095000 0.140000 0.014175 -0.002025 
+-0.016598 -0.023689 -0.001687 -0.006796 0.002083 -0.004650 
+0.013556 0.006171 -0.002171 0.003619 0.000247 -0.007224 
+-0.058009 -0.017130 -0.010509 -0.016190 0.022024 -0.019405 
+-0.004782 0.006163 -0.001277 -0.026364 -0.005818 -0.002909 
+-0.013431 -0.008203 0.017797 -0.016082 0.006186 -0.002941 
+-0.018486 0.011266 0.020124 0.046667 0.001139 0.003644 
+0.025249 -0.001622 -0.043396 0.003110 -0.013004 -0.039367 
+-0.010009 0.010843 -0.032857 -0.002092 -0.006005 -0.028933 
+0.008741 -0.011027 -0.006032 0.008498 0.007714 -0.014381 
+-0.000185 0.003091 -0.000866 0.000568 0.006161 -0.003025 
+0.003896 0.008883 -0.005748 0.004096 0.007900 -0.006510 
+0.000240 0.007139 -0.005033 -0.001181 0.004267 -0.005539 
+0.004175 0.001668 -0.006540 0.005345 0.000383 -0.005557 
+0.000813 -0.002520 -0.001301 -0.000480 -0.004526 0.000708 
+-0.003421 -0.005096 0.004392 0.000389 -0.002669 0.001545 
+0.003685 0.002051 0.000355 -0.000770 -0.002471 -0.003956 
+0.002078 0.000119 -0.009149 0.001427 0.001057 -0.001133 
+-0.000676 -0.002946 0.002981 0.000964 -0.000292 -0.000321 
+-0.001180 -0.001637 -0.003413 -0.002660 -0.001791 -0.003173 
+0.004794 0.001194 -0.003898 0.000046 0.003236 -0.004114 
+-0.002932 -0.003475 0.000194 -0.001719 -0.002599 0.000279 
+0.001393 0.000050 0.000323 0.003226 0.002701 -0.002741 
+0.004790 0.001546 -0.002729 0.001731 0.005102 -0.004774 
+0.001790 0.003769 -0.005323 0.001817 0.006609 -0.003471 
+0.002413 0.006195 -0.006556 0.002151 0.000102 0.001056 
+0.000010 -0.000895 -0.000826 -0.000185 0.000698 0.000911 
+-0.004276 0.007393 -0.000561 -0.002395 0.017024 -0.001916 
+-0.002842 0.016276 -0.008268 0.008525 0.010412 0.001834 
+-0.000088 0.010719 -0.000943 0.002601 0.014548 -0.002500 
+0.007989 0.015322 -0.008294 0.004434 0.012646 -0.009377 
+-0.004265 0.008126 -0.008657 -0.006798 -0.004256 -0.004586 
+0.004547 0.003679 0.002331 0.023860 0.008815 -0.004010 
+0.021377 0.006685 -0.030265 -0.054222 -0.027111 0.021111 
+-0.003053 -0.040641 -0.003535 -0.010768 -0.013569 -0.000138 
+-0.016106 -0.004497 0.000546 -0.007000 0.010271 -0.001055 
+0.007922 0.047534 -0.028125 -0.001170 -0.010291 -0.003586 
+0.042500 0.103750 -0.063750 0.046849 -0.032131 -0.046175 
+-0.006063 -0.000407 -0.039228 0.071694 -0.002166 -0.056459 
+-0.002993 0.026168 0.000821 0.004690 0.005104 0.001500 
+0.018117 -0.001753 0.004675 0.022839 0.008660 -0.026914 
+0.017260 0.007788 -0.030721 -0.018172 -0.000410 0.005978 
+-0.017409 0.010048 0.028156 0.011746 -0.023016 -0.000159 
+-0.019254 0.016059 0.057677 -0.008000 0.004800 0.089600 
+-0.036928 -0.015449 0.022232 0.131003 -0.069728 0.032398 
+0.034609 -0.010174 0.065652 0.009626 0.005234 0.018797 
+0.007749 0.010768 0.000303 0.017823 0.004409 0.002779 
+-0.003089 0.000558 0.001101 -0.010738 -0.009968 0.027117 
+-0.008698 -0.005488 0.013380 -0.000432 0.001916 -0.000809 
+0.002337 0.006280 -0.004924 0.002553 0.007387 -0.006096 
+0.004413 0.008214 -0.003041 -0.000193 0.006020 -0.001962 
+-0.000687 0.002976 -0.003833 0.000164 0.003279 -0.001721 
+0.000974 0.002180 -0.004415 0.001373 0.000297 -0.000767 
+-0.001731 -0.001848 0.001474 -0.003643 -0.003680 0.000560 
+-0.001234 -0.003361 -0.001963 -0.001584 -0.000696 -0.004357 
+0.001701 0.003342 -0.004863 0.003091 0.000000 -0.001909 
+0.000390 0.000390 -0.000390 -0.002679 -0.000550 -0.001339 
+-0.002573 0.004717 -0.002012 -0.000337 0.009919 -0.005907 
+0.001894 0.009452 -0.008614 -0.000187 0.003055 -0.007666 
+-0.002861 -0.001474 -0.003280 -0.001748 -0.000500 -0.003431 
+0.001247 -0.001172 -0.002904 0.000101 -0.000350 0.000073 
+-0.000343 -0.001776 0.000418 0.000023 -0.000414 0.000211 
+0.000849 0.005688 -0.001868 -0.005150 0.006728 -0.002284 
+0.005741 0.011161 -0.004829 0.001489 0.000276 0.001244 
+0.002563 -0.005929 -0.001113 0.000764 -0.003084 -0.001133 
+0.000754 0.016104 -0.000137 -0.009471 0.023820 -0.002870 
+-0.004380 0.019242 -0.012437 0.003304 -0.001385 -0.000896 
+-0.001453 -0.002269 -0.001586 0.000548 -0.001848 0.000901 
+0.002168 0.000645 0.000915 0.002917 0.000461 0.000953 
+0.002336 -0.002156 0.001569 0.001877 0.001531 0.000793 
+0.005617 0.008726 0.000372 0.019348 0.018711 0.001701 
+0.031309 0.024024 -0.017482 0.007971 0.033102 -0.040804 
+0.004270 0.018802 0.001832 -0.026115 0.007754 -0.001185 
+-0.053799 0.005007 -0.013486 -0.011276 -0.003118 -0.009391 
+0.024737 -0.000130 -0.002992 0.064668 0.024366 0.011139 
+0.025819 0.016539 0.034639 0.031187 -0.017625 0.012191 
+-0.001996 0.001164 -0.012105 0.022936 0.011752 -0.008720 
+0.031864 0.017515 -0.025533 -0.000214 0.012143 -0.000786 
+-0.002697 0.018208 -0.008380 -0.009192 -0.001888 -0.010752 
+-0.001166 -0.003487 -0.007805 -0.006786 0.002617 0.002792 
+-0.018079 -0.008816 0.001669 0.018262 -0.033638 -0.007369 
+-0.066888 -0.008440 0.024056 -0.032561 -0.001532 0.058994 
+0.003706 -0.007548 0.036426 0.004806 -0.000216 0.004490 
+0.049018 0.019455 -0.085374 0.000502 -0.000044 -0.001442 
+0.034514 -0.035727 -0.036120 0.008045 -0.006073 0.012542 
+-0.013992 -0.006335 0.011453 -0.007544 -0.014260 0.017818 
+0.002617 -0.006036 0.001005 0.002017 0.000508 -0.005701 
+0.005570 0.005365 -0.004728 0.003818 0.006678 -0.004807 
+0.002590 0.006723 0.001659 0.000180 0.002388 -0.000301 
+0.001006 0.000233 -0.001495 0.000159 -0.000949 -0.002332 
+-0.003452 -0.001338 -0.002061 -0.004353 0.000647 0.002069 
+-0.003898 -0.001638 0.003235 -0.005785 -0.002562 0.003802 
+-0.006930 -0.007692 0.001028 -0.007291 -0.005408 -0.000469 
+-0.002504 -0.002730 -0.001136 0.002767 0.002812 -0.004241 
+0.006403 0.004295 -0.006990 0.004609 0.003298 -0.008246 
+0.000711 0.003580 -0.007262 0.000373 0.003451 -0.006062 
+0.002255 0.001656 -0.005426 -0.000029 -0.000863 -0.004371 
+-0.004556 0.002556 -0.001778 -0.001802 -0.000207 -0.003034 
+0.001983 -0.000232 -0.002236 0.002229 0.001506 0.000006 
+0.000181 0.000765 0.000025 -0.001690 -0.002336 0.000152 
+-0.005976 0.000790 -0.003990 0.002528 0.006870 -0.005687 
+-0.002423 0.005013 0.000546 0.000094 -0.001740 -0.000262 
+0.003319 -0.010839 0.001122 0.001669 -0.005694 0.001374 
+-0.012364 0.010669 0.001215 -0.015187 0.020395 -0.006011 
+-0.008386 0.011003 -0.014421 -0.006880 -0.002209 -0.003800 
+-0.004232 -0.005053 -0.002878 -0.000769 0.001740 -0.002289 
+0.003000 0.005077 -0.007937 -0.001490 0.003583 -0.005385 
+-0.005036 -0.006292 -0.001804 -0.004422 0.000068 -0.002435 
+-0.004728 0.021803 -0.004190 0.001791 0.025440 -0.012085 
+-0.006498 0.031132 -0.009634 -0.034386 0.068167 -0.010619 
+-0.001623 0.058257 -0.020426 0.028769 -0.032176 -0.006023 
+-0.017573 0.008687 -0.011520 -0.000349 0.001869 0.000174 
+0.003746 -0.003690 0.000045 0.008826 0.005713 0.001768 
+0.004852 0.004990 0.005839 -0.004758 -0.003407 -0.020507 
+0.011631 0.004469 -0.018488 0.033757 0.005443 -0.024609 
+0.056411 0.009222 -0.016678 -0.004930 0.014118 -0.032157 
+0.013047 0.029773 -0.022075 -0.008452 0.015180 -0.021231 
+0.013405 0.015067 -0.014045 0.020493 -0.009139 0.000360 
+-0.013343 -0.047552 0.035637 -0.024039 0.013059 0.067373 
+-0.000574 -0.013409 0.043151 0.001960 -0.017574 0.047865 
+-0.008597 -0.018360 0.050505 -0.014299 -0.015408 0.046107 
+-0.014887 -0.011408 0.040389 -0.019158 -0.009440 0.038958 
+-0.019908 -0.010373 0.044027 -0.014549 -0.027302 0.042931 
+-0.000106 -0.023304 0.019924 0.010555 -0.016922 -0.001053 
+0.006321 -0.012223 -0.002824 0.007382 -0.004711 -0.000079 
+0.005787 -0.000084 -0.002503 0.002889 0.000322 0.000994 
+0.001577 -0.003265 0.001077 -0.000097 -0.005028 -0.000879 
+0.002155 -0.000426 -0.001459 0.001422 -0.000251 -0.000820 
+0.000650 -0.001075 -0.000408 0.000252 0.001280 -0.000469 
+0.000468 -0.000443 -0.000924 -0.002286 -0.004000 -0.000504 
+-0.004336 -0.005312 0.003360 -0.001525 -0.003937 0.004324 
+-0.003934 0.000407 0.005426 -0.000871 -0.001476 0.000649 
+0.000296 0.000852 -0.000100 0.006716 0.001266 -0.001401 
+0.005589 0.004554 0.000590 0.002435 0.006389 -0.001139 
+0.000729 0.005345 0.000146 -0.001470 0.003669 -0.001305 
+-0.002150 -0.000250 0.006033 -0.004795 0.002808 0.000167 
+-0.000330 0.003033 0.000570 0.001578 0.001541 -0.000429 
+0.001811 0.001323 -0.000163 0.000100 0.001363 -0.002476 
+-0.000971 -0.000674 -0.004103 -0.002551 -0.003002 -0.002659 
+-0.000184 -0.002073 -0.001098 0.000070 0.002407 0.000781 
+-0.001082 0.008953 0.000281 0.003227 0.016840 -0.008110 
+-0.013148 0.007076 -0.000918 -0.014375 0.015216 -0.008089 
+-0.001561 0.014638 -0.012453 -0.001680 0.005905 -0.003653 
+-0.000209 0.000026 -0.000094 0.000743 -0.000092 -0.002388 
+-0.002140 -0.000249 -0.001957 -0.007052 -0.002117 0.002395 
+-0.009031 -0.007922 0.005596 -0.005969 -0.004830 -0.003538 
+-0.001973 0.005215 -0.001005 0.014902 0.012788 -0.018098 
+0.001081 -0.001524 -0.002335 -0.005770 0.042705 0.006941 
+0.002778 0.030556 -0.025556 -0.028628 0.012498 -0.009365 
+-0.025965 0.009190 -0.046095 0.015475 0.028673 -0.035453 
+0.019540 -0.001670 0.011387 0.002059 0.008348 -0.017218 
+-0.005855 -0.006512 -0.029515 -0.011146 -0.000454 -0.034618 
+0.003551 0.007165 -0.017465 0.041143 0.009944 -0.049263 
+0.023674 0.029276 -0.021794 0.010000 0.005546 -0.022185 
+0.003131 -0.002763 -0.012710 0.001938 -0.000346 -0.019333 
+0.024448 0.003413 -0.030435 0.043861 0.013700 -0.017843 
+-0.003703 -0.014090 0.017882 -0.010040 -0.000230 0.015029 
+-0.005531 -0.006617 0.037326 -0.012214 -0.021739 0.045719 
+-1.793893 -2.099237 4.687023 -1.481818 -1.731818 5.159091 
+-1.431507 -1.756849 5.424657 -1.448029 -1.949821 5.387097 
+-1.298343 -1.917127 4.624310 -0.002142 -0.014886 0.021418 
+0.007615 -0.000408 0.001618 0.008882 -0.010684 -0.002276 
+-0.002726 -0.005360 0.003712 0.001900 -0.004334 0.001480 
+-0.002928 -0.002291 -0.001239 -0.000897 -0.000496 -0.001603 
+-0.002062 -0.009819 0.003191 0.002112 -0.001573 0.003139 
+0.002970 -0.000257 -0.003826 0.003911 -0.000606 -0.003703 
+0.004037 -0.001217 -0.003364 0.005004 0.000031 -0.003015 
+0.002650 0.003128 -0.002465 -0.001451 0.001625 0.000098 
+-0.003636 -0.001198 0.000488 -0.000220 0.000028 -0.000055 
+-0.001051 0.004290 -0.001929 0.001120 0.003214 -0.006465 
+0.000253 -0.000247 -0.001245 -0.004076 -0.004649 -0.000701 
+-0.001967 -0.007499 -0.001666 -0.001588 -0.004498 0.000741 
+-0.000743 0.000477 0.000386 -0.004115 0.001819 -0.002922 
+0.001091 -0.000775 -0.001418 0.002129 0.000314 -0.003103 
+-0.000029 0.002836 -0.001961 -0.002533 -0.000050 0.000328 
+-0.002653 0.000070 0.002035 0.001264 0.000079 0.003206 
+0.002219 -0.002122 0.000219 -0.000328 -0.003701 -0.001198 
+-0.000740 -0.006947 -0.003028 -0.001712 -0.005279 -0.004375 
+-0.005662 0.002804 -0.001867 -0.004849 0.007544 -0.014370 
+-0.011606 0.008780 -0.004965 0.010802 0.015754 -0.005670 
+-0.002336 0.002797 0.002468 -0.007179 0.008042 0.004080 
+0.001344 0.005563 0.025853 0.450495 -0.059406 4.376237 
+0.788382 0.070539 4.721992 0.895735 0.232227 4.127962 
+0.007086 0.002347 0.026750 -0.001003 -0.003917 0.004778 
+-0.012235 -0.009968 -0.015798 0.006460 0.011387 -0.010912 
+0.002679 0.026012 -0.015449 0.000190 0.012113 -0.010257 
+0.021957 0.024325 -0.014618 -0.030519 -0.007792 0.023636 
+-0.006602 0.013358 -0.000796 -0.037099 0.042297 -0.044541 
+0.074805 -0.080024 0.130474 -0.004473 0.017108 -0.026582 
+-0.074352 -0.013642 -0.043543 0.045714 0.004709 -0.025897 
+0.024857 -0.064333 -0.016749 0.033816 -0.034276 0.007039 
+-0.027171 -0.027273 0.000920 -0.060234 -0.008294 0.054114 
+0.035083 -0.096141 -0.066679 -0.012978 0.128489 -0.061778 
+-0.034884 0.060831 -0.062273 -0.014032 0.035080 -0.024556 
+-0.005546 0.013445 0.001008 -0.003201 -0.002587 0.026132 
+-0.012715 -0.024440 0.031253 -0.017391 -0.026590 0.045497 
+-1.536424 -1.900662 5.079470 -1.526923 -1.730769 5.434616 
+-1.600000 -2.000000 5.723810 -1.524823 -2.287234 5.719858 
+-1.000000 -1.904040 4.727273 -0.000326 -0.007262 0.021508 
+-0.003329 -0.001648 -0.002261 -0.002938 -0.009304 -0.009253 
+-0.000188 0.001157 -0.009747 -0.000725 0.004813 -0.005927 
+-0.000633 0.002957 -0.001901 -0.003471 -0.001472 0.002833 
+-0.003800 -0.001054 0.003428 -0.000414 0.001478 -0.005677 
+0.001858 0.007487 -0.007470 0.001915 0.004821 -0.003785 
+0.000488 -0.001813 -0.001334 -0.003026 -0.002522 -0.002034 
+-0.004675 0.003500 0.001558 -0.004116 0.005881 -0.001727 
+-0.002474 0.004329 -0.000193 -0.001739 -0.000580 -0.002667 
+0.001773 0.002035 -0.008867 0.003678 0.005969 -0.007778 
+0.002381 0.001869 -0.001852 -0.004819 -0.002211 0.004053 
+-0.007606 -0.001339 0.003815 -0.002896 0.001170 -0.001002 
+-0.002383 0.000047 -0.004729 -0.000734 0.002844 -0.001009 
+-0.003906 -0.006418 -0.002591 -0.002740 -0.000400 -0.002493 
+-0.002321 -0.000395 -0.001914 -0.001696 -0.001613 0.000177 
+-0.001951 -0.005170 0.003124 -0.000684 -0.000632 0.002213 
+0.002563 -0.000127 -0.002254 -0.000375 0.002384 0.000514 
+-0.000682 -0.003749 -0.001551 -0.000557 -0.010823 -0.004908 
+-0.003523 -0.005072 0.000780 -0.006163 0.007414 0.004010 
+0.000952 0.018095 0.000476 -0.007605 0.003628 0.002428 
+0.007417 0.006984 -0.012622 -0.002964 0.005377 0.000866 
+0.943723 0.281385 3.813853 1.526462 0.055710 5.969359 
+1.837838 0.000000 6.719902 2.030488 0.103659 6.417683 
+1.922680 0.427835 4.747423 0.008282 0.007760 0.016758 
+0.001521 0.002646 -0.000479 0.003786 -0.000971 0.013861 
+0.003558 0.039198 -0.002112 0.021928 0.046547 -0.026547 
+-0.145899 0.059446 -0.018537 -0.022667 -0.036167 0.020833 
+-0.012978 0.032446 0.026884 -0.000714 0.000714 0.074286 
+-0.073536 -0.013423 0.013131 -0.044048 -0.000476 0.021071 
+-0.044176 0.002857 -0.017802 0.065480 -0.029435 -0.009605 
+0.035745 0.031130 -0.027688 -0.006588 -0.011267 -0.022325 
+-0.020105 0.005744 0.032222 -0.028927 -0.057048 0.067567 
+0.035814 -0.012281 -0.000742 -0.007824 0.007857 -0.055407 
+-0.007964 0.004965 -0.004065 0.002811 -0.002300 -0.003871 
+-0.002376 -0.006821 0.010962 -0.008096 -0.026401 0.028550 
+-0.004483 -0.022049 0.033784 -0.016431 -0.015632 0.042613 
+-1.218085 -1.468085 5.643617 -1.577358 -1.773585 5.615094 
+-1.711340 -2.099656 5.223368 -1.622711 -2.029304 4.556777 
+-1.246696 -1.281938 3.665198 -0.002695 -0.002496 0.025655 
+0.001263 0.009399 0.006616 -0.006225 0.002845 -0.014571 
+0.005355 -0.007692 -0.019706 -0.002444 -0.002946 -0.006919 
+0.006404 0.004484 -0.003655 0.010015 0.005832 -0.007886 
+0.002258 0.005085 -0.005101 -0.000846 0.003595 -0.000844 
+-0.002496 0.005226 -0.002531 0.000783 0.008584 -0.006438 
+-0.002463 0.008725 -0.006210 0.000950 0.003194 -0.002224 
+-0.004353 0.000442 0.004206 -0.006424 -0.000714 0.001111 
+-0.000980 -0.000196 -0.000784 -0.000735 -0.000441 -0.000259 
+-0.002414 0.000070 -0.000348 -0.003266 0.000096 -0.001238 
+-0.002647 0.001117 -0.002113 -0.002837 0.000556 -0.001936 
+-0.004224 -0.000234 -0.002163 -0.001040 -0.002770 -0.000665 
+0.004746 0.002158 -0.002893 0.006069 0.004003 -0.002248 
+-0.007622 -0.006163 -0.004176 -0.002264 -0.007420 -0.007609 
+0.001162 -0.002324 -0.005368 -0.002679 -0.001165 -0.001630 
+-0.003947 -0.003780 0.000582 -0.002549 -0.003562 -0.002528 
+-0.003598 0.002691 -0.006295 -0.002957 0.001340 -0.001592 
+-0.001184 -0.000861 -0.000915 -0.000786 0.001013 -0.000055 
+-0.003654 0.007909 -0.004645 -0.001964 0.000556 0.004725 
+-0.003405 0.020242 0.000572 -0.007307 -0.004896 -0.011180 
+-0.006323 0.013611 -0.034654 -0.000188 0.004858 0.004488 
+1.344512 0.228659 3.527439 1.923077 -0.015837 5.300905 
+2.344371 -0.061810 6.344371 2.491667 0.080556 6.641667 
+1.991489 0.331915 5.765957 0.012596 0.001135 0.031522 
+0.001733 -0.003254 0.004891 -0.001253 -0.013546 0.006247 
+-0.006820 -0.003611 0.010946 -0.008918 -0.002535 0.000250 
+-0.010503 -0.002654 -0.009570 -0.015578 -0.011521 -0.001950 
+-0.018440 -0.020670 0.007835 -0.017212 -0.090000 0.086058 
+-0.014620 -0.022620 0.065170 -0.046758 0.014354 -0.001462 
+-0.027874 0.018440 -0.024374 -0.042476 0.000029 -0.031937 
+-0.049518 0.020177 -0.035634 -0.018893 0.040915 -0.028716 
+-0.020257 0.023141 -0.015526 -0.023930 0.009916 -0.015570 
+0.001364 0.011383 -0.012052 0.020570 0.017087 -0.018176 
+0.012642 0.012938 -0.004938 0.004511 -0.001635 0.005733 
+0.000844 -0.011738 0.008386 0.009948 -0.015313 0.005173 
+0.001387 -0.006955 0.036727 -0.015475 -0.003032 0.051996 
+-1.298851 -1.057471 6.000000 -1.731707 -1.719512 5.837399 
+-1.996528 -2.163194 5.190972 -1.923611 -2.017361 4.107639 
+-1.303279 -1.155738 2.676229 -0.003611 0.002417 0.009127 
+0.004593 0.015024 -0.011309 0.012987 0.004456 -0.014485 
+-0.003009 -0.001154 -0.009821 -0.004087 -0.000214 -0.005453 
+0.000038 -0.003014 -0.004531 -0.001622 0.004286 -0.009730 
+0.000318 -0.001323 -0.003971 -0.000445 -0.004782 0.001111 
+-0.000945 -0.000463 -0.000948 -0.001066 0.006516 -0.001540 
+-0.001126 0.004966 -0.008243 0.000059 0.004923 -0.004993 
+-0.000064 -0.000103 0.000098 -0.004208 -0.003296 0.002160 
+-0.003934 -0.004582 -0.000439 -0.002034 -0.002705 -0.000339 
+-0.000757 -0.000565 -0.000817 -0.000183 0.000489 -0.002231 
+-0.000122 0.001731 -0.005047 -0.001409 0.002150 -0.007119 
+-0.002574 0.003906 -0.005905 -0.001460 0.003030 -0.004936 
+-0.000684 0.002541 -0.002904 -0.000067 0.000019 -0.000041 
+-0.002930 -0.003177 -0.001898 -0.004446 -0.005846 -0.003233 
+-0.002810 -0.003605 -0.004454 -0.000158 -0.002725 -0.003085 
+-0.001784 -0.001142 -0.002761 -0.001567 -0.002088 -0.003330 
+-0.001195 -0.003627 -0.002215 0.000652 -0.004603 -0.000492 
+0.002072 -0.005971 -0.000017 0.002355 -0.004252 -0.000707 
+0.001724 0.003617 -0.001835 -0.002078 0.010916 0.002836 
+0.001700 0.016097 -0.007661 -0.002046 0.012215 -0.027132 
+-0.001796 0.009683 -0.026148 0.001662 0.005143 0.000134 
+0.857143 0.059233 2.442509 1.469780 -0.115385 4.329670 
+1.963636 -0.007792 5.688312 2.051136 0.363636 6.159091 
+1.627306 0.756458 5.642066 0.886228 0.850299 3.928144 
+0.001651 0.003166 0.004833 -0.001886 -0.009683 -0.006470 
+-0.015282 -0.007291 0.008191 -0.001955 0.006595 0.010137 
+0.006471 0.007565 0.005752 0.001564 -0.001453 -0.014222 
+-0.001707 -0.004352 -0.037828 0.013152 0.000385 -0.008696 
+-0.000022 -0.006672 0.016046 0.000292 -0.004523 0.007599 
+-0.004707 0.003579 -0.005546 -0.017811 -0.014139 -0.015332 
+-0.039819 -0.005741 -0.006256 -0.011234 0.017497 -0.003464 
+0.018146 0.039075 -0.001862 0.010635 0.033390 -0.000381 
+-0.012723 0.012375 -0.008320 -0.008873 -0.008283 0.000790 
+0.006002 -0.006613 0.015998 0.019746 0.009172 0.023985 
+0.019271 0.002488 0.018981 0.002976 0.001345 0.009647 
+0.003884 0.008050 0.002092 -0.000557 0.004226 0.031245 
+-0.677419 -0.693548 5.620968 -1.162562 -1.591133 6.093596 
+-1.211111 -1.900000 5.196296 -0.911972 -1.612676 3.616197 
+-0.001190 -0.005614 0.019968 -0.002147 0.001539 0.003197 
+-0.000680 0.010333 -0.006034 -0.003370 0.001718 -0.002116 
+0.000259 0.000562 -0.001094 -0.001903 0.001909 -0.002055 
+-0.003471 0.000053 -0.006301 -0.006103 -0.003398 -0.009294 
+0.001276 -0.004390 -0.001985 0.000883 -0.004247 -0.003682 
+0.000218 -0.000531 -0.000599 -0.000615 0.001668 0.001270 
+-0.000907 -0.000124 0.000124 -0.002027 -0.002481 -0.003837 
+-0.003260 -0.001956 -0.007500 -0.004551 0.002669 -0.007810 
+-0.003198 0.004436 -0.006168 -0.002138 0.001379 -0.003586 
+0.000395 -0.000180 -0.000468 0.001044 0.000877 0.000725 
+0.000465 0.003163 -0.001674 0.001478 0.002699 -0.003824 
+0.001665 0.002401 -0.003935 0.000812 0.001554 -0.002663 
+0.001073 0.000395 -0.001469 -0.003898 0.000137 -0.000091 
+-0.005942 -0.001105 0.000876 -0.004385 0.000129 0.000172 
+-0.000611 -0.001527 -0.000534 -0.000305 -0.001778 -0.001249 
+-0.001079 -0.000460 -0.001496 -0.000966 -0.002254 0.002231 
+-0.000378 -0.002224 0.001161 -0.000013 -0.001963 0.000071 
+0.000603 -0.002647 0.000409 0.002469 -0.001862 0.000366 
+0.001017 -0.000662 -0.002459 0.000097 0.000887 -0.003246 
+0.001520 0.001844 -0.003498 0.000178 0.002669 -0.005030 
+0.003626 0.000787 -0.012163 0.000975 0.000121 -0.017016 
+0.002033 0.001000 -0.002102 0.003323 0.004308 0.021842 
+0.799320 0.159864 4.044218 0.820261 0.483660 4.735294 
+0.739496 0.815126 4.521008 0.004698 0.009829 0.028543 
+-0.006868 0.002265 -0.017368 -0.014507 -0.008437 -0.022169 
+-0.013028 -0.006475 0.020222 -0.010579 -0.012530 0.009937 
+-0.005137 -0.001893 -0.000891 -0.003782 0.008491 -0.015354 
+-0.004050 0.005552 -0.021050 -0.001149 0.001437 -0.004677 
+0.010462 0.002336 0.002219 0.018939 0.004321 0.010787 
+0.013279 0.001315 0.005144 -0.002423 0.007828 -0.006395 
+-0.012020 0.000637 -0.001953 -0.021998 -0.022312 0.011942 
+-0.016848 -0.028957 -0.000431 -0.005070 -0.008880 -0.001930 
+-0.006762 -0.011426 -0.001674 -0.005384 -0.007059 0.009871 
+-0.006138 0.003273 0.010750 0.006309 0.001315 0.011309 
+0.006455 0.008266 0.004690 0.009040 -0.006434 -0.000040 
+0.001110 0.003464 -0.037036 -0.000911 0.000612 0.016132 
+-0.003866 -0.005294 0.043227 0.044118 -1.191176 4.411765 
+0.329268 -1.213415 3.634146 0.004529 -0.008527 0.020832 
+0.002705 -0.002020 0.002260 -0.001218 0.005825 -0.010323 
+-0.000279 0.008654 -0.001526 -0.005019 0.005322 -0.000454 
+-0.002753 0.005750 -0.001630 0.000167 0.007196 -0.001457 
+-0.000552 0.005574 -0.001534 -0.000269 0.003643 -0.002934 
+0.000709 0.001843 -0.004419 0.001279 0.004031 -0.003519 
+0.005310 0.005524 -0.001117 0.008033 0.000496 -0.000104 
+0.008098 -0.002834 -0.004564 0.003973 -0.001684 -0.004587 
+0.001923 -0.000507 -0.001309 0.000805 -0.000688 -0.000745 
+-0.000894 -0.000403 -0.004263 -0.000133 -0.000573 -0.002978 
+-0.002715 -0.004069 0.000137 -0.002053 -0.002615 0.002265 
+-0.000187 0.001936 -0.000442 0.002268 0.003610 -0.003816 
+0.005162 0.004232 -0.002179 0.001949 0.002216 -0.000478 
+-0.003313 -0.000279 -0.002482 -0.007094 -0.001871 -0.006964 
+-0.001504 0.007696 -0.004617 -0.000344 0.004064 -0.005534 
+-0.000142 0.000057 -0.001119 0.000707 -0.002753 0.001338 
+-0.002125 -0.003390 -0.001480 -0.001655 -0.000085 -0.003096 
+-0.002148 0.001703 -0.001839 -0.002016 0.001962 -0.001209 
+-0.002211 0.002200 -0.001070 -0.001342 0.002094 -0.001665 
+-0.000443 -0.000496 -0.001831 0.000111 -0.001709 -0.001297 
+0.000673 -0.000153 -0.000721 -0.001143 -0.001138 -0.001378 
+-0.006437 -0.003206 -0.006941 -0.005045 -0.002665 -0.016845 
+-0.001165 0.002488 -0.018289 0.002850 0.001111 -0.004511 
+0.001927 0.001879 0.010774 0.000461 0.004705 0.018416 
+-0.000719 0.007018 0.019348 -0.004382 0.008121 0.009139 
+-0.010180 0.007624 -0.023809 -0.000997 0.007304 -0.005473 
+-0.018918 -0.009526 0.014672 -0.012164 -0.014090 -0.004362 
+-0.013118 -0.018084 -0.000158 -0.010711 -0.006949 0.005322 
+-0.008452 -0.002010 0.003742 -0.005365 -0.001331 -0.000787 
+-0.002655 0.000557 -0.002271 0.006139 0.009396 -0.000832 
+0.019620 0.010646 -0.021483 0.007857 0.001925 -0.021488 
+0.007999 0.002560 -0.014241 -0.004172 0.000087 -0.011196 
+-0.008626 -0.007315 -0.010266 0.001607 -0.015902 -0.004676 
+0.010300 -0.013414 -0.010270 0.014038 -0.000276 -0.011382 
+0.011062 0.008875 -0.008811 0.009030 -0.001709 -0.007583 
+-0.004044 0.002338 -0.009658 -0.013244 0.012902 -0.022079 
+0.060000 -0.012000 -0.090000 0.015773 0.013991 0.020953 
+0.006608 -0.002616 0.020721 0.002006 -0.001766 0.013623 
+-0.000234 -0.001181 0.009393 -0.002326 -0.000534 0.003780 
+-0.003061 0.001574 -0.005158 -0.001336 0.000730 -0.009846 
+-0.002579 0.004253 -0.001561 -0.004133 -0.000334 0.003644 
+-0.003284 -0.001031 0.001838 -0.000525 0.001255 -0.002897 
+0.003033 -0.000339 -0.007670 -0.000312 -0.002719 -0.004096 
+-0.003233 0.002771 0.000922 -0.006614 -0.001596 0.005685 
+-0.001144 -0.000189 0.000024 0.002647 -0.000512 -0.000045 
+0.004329 0.001375 -0.001752 0.002580 0.001089 -0.001285 
+0.001845 0.001719 -0.000216 0.001273 0.002393 0.000741 
+-0.000361 0.001628 0.000669 -0.001937 -0.001068 0.001186 
+0.000051 -0.001465 0.001263 0.000170 -0.000329 -0.001199 
+0.000564 0.000986 -0.002857 0.002619 0.000842 -0.003182 
+0.005394 -0.000502 -0.003324 0.005806 0.002284 -0.001713 
+0.002264 0.001260 -0.004038 -0.002563 -0.000287 -0.001980 
+0.002785 0.001066 -0.002311 0.003672 0.001830 -0.003141 
+0.002393 0.001041 -0.001928 -0.000827 -0.000827 -0.002835 
+-0.004886 -0.003636 -0.002841 -0.005609 -0.004374 -0.005385 
+-0.004680 -0.003101 -0.004087 -0.002816 -0.000108 -0.001186 
+-0.002317 0.001290 0.000279 -0.001188 0.001941 0.003438 
+-0.001167 0.001653 0.000456 -0.004599 -0.000968 -0.001372 
+-0.002224 -0.001096 0.001282 0.000234 -0.000311 -0.000178 
+0.000000 0.001798 -0.003597 -0.000300 0.006116 -0.002239 
+-0.001498 0.003964 -0.002599 0.002550 -0.001481 -0.003864 
+0.008177 -0.002676 -0.008287 0.010130 -0.002312 -0.011030 
+0.005022 -0.000886 -0.003333 -0.007930 0.005948 0.003302 
+-0.009941 -0.000819 0.006338 -0.013953 -0.001887 0.003396 
+-0.010465 -0.014117 -0.005751 -0.016565 -0.020558 -0.001309 
+-0.015709 -0.010560 0.010718 -0.011384 -0.002781 0.004540 
+-0.005608 -0.000786 0.000159 -0.005058 -0.003278 -0.000937 
+-0.006781 -0.006926 -0.001648 -0.008762 -0.008069 0.003673 
+-0.004151 0.001221 0.005778 0.000168 -0.000078 0.001429 
+0.003196 0.001279 -0.001439 0.000742 0.004592 -0.005591 
+0.002869 0.011353 -0.013367 0.005847 0.023073 -0.005074 
+0.040437 -0.009458 -0.014761 0.012560 -0.018671 -0.010106 
+0.011041 -0.008480 -0.007296 0.018671 -0.003814 0.003574 
+0.012683 -0.006745 0.005616 0.055500 -0.004553 -0.020488 
+0.046753 -0.002831 0.007325 0.033410 0.011883 0.020307 
+0.023482 0.025228 -0.004462 0.003378 0.004301 0.004048 
+-0.006480 -0.001389 0.004930 -0.006566 -0.001390 0.002342 
+-0.002875 0.000309 0.002266 -0.001663 0.005342 0.002252 
+-0.003656 0.002496 0.001545 -0.002675 -0.001728 0.002504 
+0.001179 -0.001174 -0.000008 -0.000137 -0.002549 -0.005166 
+0.000908 -0.002155 -0.003719 -0.000216 -0.000682 -0.000772 
+-0.001965 -0.001449 0.003337 -0.006275 0.000783 -0.001413 
+-0.007496 -0.002521 0.002160 -0.005031 -0.000543 0.001976 
+-0.002907 0.000714 0.000780 -0.001342 0.000828 0.000265 
+-0.002157 -0.001118 -0.000885 -0.002935 -0.002364 -0.002331 
+-0.002022 -0.002156 -0.001815 -0.002632 -0.000377 0.000877 
+-0.001944 0.002685 0.000741 -0.002214 0.001104 -0.000972 
+0.000362 -0.001034 -0.001862 -0.002530 -0.004478 -0.001169 
+-0.002741 -0.004145 -0.000631 0.001094 -0.000906 -0.002331 
+0.000123 0.001339 -0.004632 -0.000147 -0.000059 -0.001938 
+0.006251 -0.001195 -0.005699 0.007542 -0.000658 -0.007059 
+0.007923 0.002413 -0.005738 0.000369 0.004692 0.000185 
+0.000181 0.001537 0.000090 -0.000354 0.001002 -0.000201 
+-0.002020 0.002737 -0.000886 -0.002359 0.005636 -0.001144 
+-0.002144 0.006005 -0.003984 -0.003330 0.005683 -0.001058 
+-0.001939 0.005916 0.000027 -0.000991 0.002516 0.000570 
+-0.001447 -0.001988 -0.000331 -0.002174 -0.002205 0.000783 
+-0.000726 0.003959 0.001198 -0.002607 0.002503 0.000731 
+-0.000397 0.002629 -0.005184 -0.000499 -0.000739 -0.005038 
+-0.002791 -0.005439 -0.005851 -0.002286 -0.003829 -0.008804 
+0.003616 0.002580 -0.015386 0.004359 0.011125 -0.001419 
+0.006264 -0.003927 -0.004375 0.000441 -0.001098 -0.005881 
+-0.001378 -0.002184 0.002127 0.000824 -0.005645 0.001386 
+-0.000504 -0.005963 0.000113 -0.003312 -0.004373 -0.000239 
+-0.005220 -0.002136 -0.003051 -0.004851 0.003117 -0.000983 
+-0.011025 0.005765 0.007243 -0.014770 0.002048 0.007874 
+-0.018387 -0.003013 0.007644 -0.015057 -0.010444 0.006512 
+-0.001218 -0.007710 -0.004328 0.002192 -0.008764 -0.000437 
+-0.003614 0.007126 -0.014392 0.000496 0.010563 -0.022161 
+-0.012413 -0.005203 0.003159 -0.014300 -0.016419 0.020491 
+-0.000927 -0.007782 0.003237 0.010403 0.007832 -0.006377 
+0.004793 0.003260 -0.020676 -0.004747 0.004463 -0.008617 
+-0.010301 -0.006183 -0.005039 0.006190 -0.002652 -0.006530 
+0.009637 0.002638 -0.001812 0.003016 0.007598 -0.010137 
+0.010369 0.002502 -0.010441 0.002878 -0.002135 -0.003036 
+-0.002432 -0.001314 0.000002 0.000288 -0.000172 -0.000187 
+0.000412 -0.002527 0.000335 0.000939 -0.004037 0.002930 
+0.000447 -0.000401 0.001369 -0.002397 -0.001775 -0.002081 
+0.001172 -0.000006 -0.001899 0.001742 0.001320 -0.001367 
+0.001690 0.000490 -0.001603 0.002143 -0.001042 -0.003602 
+0.002532 -0.001488 -0.001509 0.000393 -0.000691 -0.000362 
+0.000921 0.000955 0.000611 0.003131 0.002498 0.002607 
+0.003029 0.004186 0.003644 -0.000946 0.003771 0.002233 
+-0.004695 -0.003112 0.004893 0.000700 -0.004181 -0.001800 
+-0.002078 -0.004604 -0.006397 -0.003435 -0.004631 -0.005863 
+-0.001290 -0.003419 -0.003484 0.000950 0.003180 -0.003842 
+0.006351 0.006953 -0.000858 0.006726 0.006864 -0.004369 
+0.002696 0.003370 -0.004331 0.001871 -0.000343 -0.001357 
+-0.001308 -0.000097 -0.002179 0.003313 0.002033 -0.002918 
+0.002118 0.005627 0.000714 -0.001575 0.004409 -0.000472 
+0.000802 0.005432 0.000524 -0.002628 0.001527 -0.000763 
+-0.001887 0.000570 -0.000489 0.004526 0.007031 -0.000766 
+-0.003041 0.003250 -0.003623 0.000905 0.006081 0.001765 
+0.001855 0.003308 0.000248 0.000752 0.001954 0.000124 
+0.000361 0.000403 0.000161 0.000238 0.001038 -0.002186 
+-0.000168 0.000901 -0.000255 0.002026 0.000572 0.002141 
+0.004671 0.001440 0.001346 0.003943 0.004608 0.002096 
+0.001419 0.003598 0.001268 -0.000315 -0.003203 -0.000879 
+0.010493 -0.001908 -0.009347 0.003433 0.004291 -0.001167 
+0.001270 0.001234 -0.000384 -0.000022 -0.001686 0.001410 
+-0.002369 -0.008490 -0.002234 -0.002354 -0.000764 0.000503 
+-0.002363 0.002329 -0.006400 -0.003201 0.000170 -0.000010 
+-0.006441 0.001909 -0.004399 -0.005470 0.012523 -0.022813 
+0.032955 0.021271 -0.063977 -0.055701 -0.016287 -0.049157 
+-0.008464 -0.021511 -0.003024 -0.003947 -0.007608 0.003829 
+-0.000026 0.001424 -0.001979 0.015083 0.002349 -0.016998 
+0.018945 0.000309 -0.030169 0.024199 0.000130 -0.011905 
+0.008993 -0.005284 -0.009332 0.000278 -0.005631 -0.015954 
+-0.009495 -0.007173 -0.021624 -0.019540 0.002245 -0.015612 
+-0.001827 -0.000985 -0.007414 0.007813 -0.003612 -0.012211 
+0.000943 0.011330 -0.011213 0.011952 0.003085 -0.025445 
+-0.007804 -0.011319 -0.011506 -0.012558 -0.005777 0.007786 
+-0.005826 -0.000429 0.006704 0.009477 0.005414 0.000167 
+0.001103 0.002815 0.000142 -0.004017 -0.004575 0.006131 
+-0.003966 -0.003232 0.007275 -0.002184 -0.000466 0.003251 
+0.000903 0.001020 -0.000810 -0.000498 0.002613 -0.006467 
+0.002231 0.001310 -0.002692 -0.000250 -0.000422 -0.000105 
+-0.001897 -0.001764 0.001207 -0.002665 -0.004161 0.001793 
+-0.002096 -0.006079 -0.001411 -0.002995 -0.005266 -0.002557 
+0.000559 -0.003872 -0.002300 0.001339 -0.002049 -0.002002 
+-0.004431 -0.000848 0.001190 -0.006356 -0.005395 0.003794 
+-0.004705 0.001038 -0.002046 -0.002132 0.004013 0.000029 
+-0.001335 0.007521 -0.001232 0.003041 0.006371 -0.004235 
+-0.002350 0.003272 -0.000507 0.000784 0.003261 -0.001803 
+-0.000068 0.002921 -0.000979 -0.002566 0.002186 0.002054 
+-0.003743 0.001448 0.004359 -0.000844 0.001202 0.002737 
+0.004385 0.003920 -0.001628 0.001481 0.003259 0.003298 
+-0.002443 0.004360 0.000978 -0.004241 0.002525 -0.001287 
+-0.003979 0.001121 -0.004274 -0.001776 -0.001768 -0.002868 
+0.002663 -0.001054 0.000213 0.005351 0.004503 -0.002049 
+0.002275 0.006643 -0.001851 0.002081 0.005150 -0.000055 
+0.001469 0.002405 0.000354 0.000635 0.001178 0.000114 
+-0.001730 0.000586 0.000272 -0.000323 0.002353 0.001044 
+0.000931 0.000679 0.002006 0.003222 0.000905 0.002917 
+0.005966 0.002267 0.002400 0.003169 0.004184 0.003664 
+0.002108 0.007733 -0.001065 0.000937 0.009797 -0.005502 
+0.001964 0.023537 -0.011766 0.017535 0.025556 0.003188 
+0.026215 0.005759 -0.013605 0.008963 0.005676 -0.011353 
+-0.002090 -0.005533 0.001516 -0.006659 -0.003380 0.007141 
+0.000085 0.009980 -0.015156 0.007642 0.001126 -0.044572 
+-0.003753 0.002080 0.005896 0.017143 -0.003610 0.005138 
+0.011220 -0.003833 0.016937 0.009354 -0.003892 0.020271 
+0.010742 -0.000218 0.002820 0.006223 0.005975 -0.025574 
+-0.001999 0.008968 -0.016437 -0.013889 -0.002778 -0.001389 
+-0.018389 0.004236 0.009298 -0.007627 0.002061 0.005703 
+0.001538 0.011526 -0.001153 0.007265 0.018007 -0.024899 
+0.008734 0.015613 -0.027643 0.008178 0.011992 -0.013132 
+-0.001750 0.002875 -0.010459 0.003796 0.006625 -0.008420 
+0.004099 0.010739 -0.010121 0.002961 0.004136 -0.004960 
+0.004625 0.003002 0.004266 0.012479 0.020559 -0.003234 
+-0.026033 -0.029656 -0.015298 -0.013570 0.029980 0.026710 
+-0.005841 0.002396 0.012728 -0.005370 -0.002138 0.008147 
+-0.002159 0.000520 0.001828 0.000588 0.001455 0.000598 
+-0.000619 0.000191 0.000063 -0.001928 -0.000814 -0.000867 
+-0.002761 0.000000 -0.000672 0.000068 -0.002738 0.000187 
+0.000321 -0.003281 -0.002637 0.000241 -0.001242 -0.001991 
+0.002491 0.002142 -0.000519 0.004641 0.007446 -0.003773 
+0.000419 0.004377 0.001022 0.003427 -0.006107 -0.004347 
+-0.004347 -0.001254 -0.000311 -0.005031 -0.007297 0.001628 
+0.000357 -0.000750 0.000603 0.002777 0.004671 0.001995 
+0.001707 -0.000329 0.001114 0.003941 0.003636 -0.002186 
+0.000991 -0.000209 -0.000346 -0.002419 -0.001258 -0.000114 
+-0.000482 -0.002546 0.000948 -0.000246 0.000150 -0.000139 
+-0.003937 0.001187 0.002326 -0.002650 0.000631 0.002018 
+0.005090 0.000050 0.002203 0.002161 -0.002174 -0.001315 
+0.000212 -0.001509 -0.003538 -0.003785 0.000309 -0.005156 
+-0.003730 -0.001378 -0.005508 -0.002593 0.002298 -0.000746 
+0.003798 0.012391 0.000584 -0.001956 0.008587 -0.000325 
+0.001215 0.003579 -0.000319 0.001684 0.002137 0.001207 
+0.000927 0.005098 0.000165 0.000322 0.007063 0.000564 
+0.004941 0.006420 -0.008087 -0.000756 0.004845 -0.010188 
+-0.003088 0.004376 -0.008387 -0.003810 0.002191 -0.003224 
+0.001302 0.000459 0.000207 0.003839 0.001624 -0.000808 
+-0.000491 0.001029 0.000271 0.000011 0.001602 -0.000277 
+-0.000494 0.000475 -0.000546 -0.001159 0.004940 -0.003153 
+0.001614 0.019699 -0.015871 0.004940 0.025130 -0.032730 
+-0.006537 0.005706 -0.005417 -0.009018 -0.009664 0.005644 
+-0.015860 0.001335 -0.015191 -0.023886 0.020196 -0.031951 
+-0.008092 -0.025901 0.049494 -0.006878 -0.015303 0.044465 
+-0.905473 -2.233831 4.905473 -0.720165 -2.341564 4.905350 
+-0.445026 -2.052356 4.141361 0.000090 -0.005875 0.015165 
+0.005598 0.018176 -0.007997 0.007236 0.005722 -0.002060 
+-0.008648 -0.009572 0.011141 -0.010101 -0.006523 0.002320 
+0.003930 0.020469 -0.028540 -0.010180 0.065655 -0.022632 
+0.007088 0.039825 0.014772 -0.000157 0.013486 -0.021600 
+0.002337 0.003737 -0.010032 0.000161 0.005615 -0.005353 
+0.000234 0.009505 -0.005741 0.001377 0.013232 -0.005419 
+-0.000939 0.014131 -0.007371 -0.002056 0.011089 -0.016573 
+-0.008750 0.007555 -0.021411 -0.022262 0.037842 -0.059642 
+0.018426 0.028563 -0.009903 -0.002190 -0.000820 0.001964 
+-0.005001 -0.000283 0.003287 -0.002636 0.001618 0.001563 
+-0.001068 0.003591 0.001157 -0.000652 0.004523 0.001009 
+0.000341 0.003824 0.002220 -0.000251 -0.001026 0.001064 
+-0.000246 -0.001183 0.000008 0.000360 -0.000015 -0.000398 
+0.002114 0.003702 -0.000388 0.002548 0.009434 -0.001536 
+0.000902 0.013090 -0.004290 0.002162 0.010784 -0.008973 
+0.001121 -0.002769 -0.007934 -0.002271 -0.004395 -0.004098 
+-0.000380 -0.002860 -0.000733 0.001084 0.000199 0.001639 
+0.002791 -0.001853 0.001499 0.002664 0.000803 0.001701 
+0.003482 -0.002319 -0.000576 -0.002986 0.000157 0.005378 
+-0.004937 0.001698 0.006873 -0.000837 -0.001710 -0.000244 
+-0.002836 -0.000999 -0.001202 -0.001377 0.001627 -0.001313 
+0.000615 0.003999 -0.008926 -0.000649 -0.000391 -0.003981 
+0.001706 -0.003008 0.000703 0.001096 -0.002861 0.000277 
+-0.002084 0.000249 -0.003436 -0.003527 0.004758 -0.001147 
+-0.002990 0.002283 -0.002820 0.002990 -0.001855 0.001204 
+0.001752 0.000409 -0.001385 -0.001257 0.000574 0.002037 
+0.001660 0.001630 0.000065 0.007250 0.000938 -0.003718 
+-0.000795 -0.002504 -0.006701 -0.004093 -0.000226 -0.009793 
+-0.004195 -0.000897 -0.010933 -0.003982 -0.004663 -0.010794 
+-0.003021 0.001594 -0.002727 0.004190 0.002601 0.000489 
+0.003292 0.005787 0.003648 0.005210 0.012949 0.002611 
+0.000941 0.010447 -0.004242 -0.010946 0.003600 0.001655 
+-0.011220 0.001475 0.003477 -0.007288 0.004187 -0.002243 
+-0.000009 0.008287 -0.006661 0.003481 0.010163 -0.005946 
+0.001989 0.013341 -0.018477 0.007868 0.031227 -0.058367 
+-0.009532 0.046117 -0.043666 -1.273810 -2.208333 5.386905 
+-1.136364 -2.687500 5.877841 -1.000000 -2.740175 5.696507 
+-0.798469 -2.558673 5.178571 -0.392345 -1.956938 3.971292 
+0.000965 0.004047 0.002199 -0.001728 -0.003538 -0.002755 
+-0.002690 -0.005967 -0.004608 -0.008938 -0.004023 -0.002119 
+-0.003017 -0.004442 -0.002470 -0.007156 0.005942 -0.013711 
+-0.007527 0.007367 -0.008870 -0.000524 0.005932 -0.010540 
+0.001811 0.012218 -0.020598 0.005959 0.020074 -0.019438 
+0.006160 0.022143 -0.008830 -0.000197 0.017209 -0.010601 
+-0.001974 0.010843 -0.011388 -0.005248 0.001658 -0.004244 
+-0.009418 -0.005329 0.008836 -0.008905 -0.003506 0.009855 
+0.003445 0.004058 -0.014166 -0.004925 -0.005999 -0.000283 
+-0.006430 0.000721 0.004892 0.000859 0.003781 0.001581 
+0.002730 0.002856 -0.000825 0.001860 0.000478 -0.000679 
+-0.001676 -0.001684 0.000453 -0.003456 -0.001811 -0.000422 
+-0.000380 -0.001069 0.001495 -0.000173 0.000877 0.000722 
+-0.001668 -0.002199 0.001268 -0.002463 -0.005968 0.005546 
+-0.000319 -0.005269 0.003831 0.000140 -0.003958 -0.002947 
+0.000054 -0.005726 -0.004205 -0.001072 -0.004453 -0.005432 
+-0.000892 -0.002333 -0.004745 -0.000644 -0.001405 -0.003770 
+-0.001060 -0.000393 -0.000863 0.000461 -0.000839 -0.000968 
+-0.000156 0.000016 -0.000552 0.004222 0.000861 0.000441 
+0.000993 0.001783 -0.000467 -0.001164 -0.002229 0.002314 
+-0.000519 -0.001682 0.003546 -0.000334 -0.000563 0.001485 
+0.005127 0.006215 -0.011676 0.003177 -0.000887 -0.002714 
+-0.000164 -0.001772 -0.001169 0.000346 0.001686 0.001023 
+0.001124 0.009040 0.000635 0.008842 0.004526 0.000211 
+0.002582 0.003290 0.001545 -0.000279 -0.002369 0.003862 
+-0.000305 0.001660 0.004447 -0.002897 0.001950 0.000699 
+-0.001247 0.000340 0.000444 0.000739 -0.001872 -0.001877 
+-0.001165 -0.003110 -0.003718 -0.003183 -0.002038 -0.004863 
+-0.001260 -0.002265 -0.007176 -0.000224 -0.001887 -0.009778 
+0.006280 0.002470 -0.013912 0.007184 0.009704 -0.009441 
+0.003621 0.015600 -0.008904 0.000335 0.020633 -0.013638 
+-0.004637 0.016849 -0.019542 -0.007508 0.009062 -0.015756 
+0.000582 0.004215 -0.003228 -0.000175 -0.000541 -0.000201 
+-0.000829 0.001330 -0.003755 0.006062 0.010801 -0.019894 
+0.018527 0.037145 -0.051191 -0.007191 0.043442 -0.060975 
+-0.004418 0.006055 0.008814 -1.384181 -2.367232 5.926554 
+-1.311111 -2.980952 6.679365 -1.105128 -2.971795 6.333333 
+-0.836257 -2.657895 5.500000 -0.294393 -1.686916 3.785047 
+0.000795 0.005906 0.002706 0.006685 0.014414 -0.021596 
+0.003591 -0.000311 -0.009051 0.000973 0.001858 -0.006979 
+0.001826 0.003739 -0.013373 0.003239 0.004748 -0.010641 
+0.000663 0.000199 -0.000875 0.001349 0.001311 -0.002487 
+0.004539 0.009531 -0.011148 0.002500 0.019682 -0.010661 
+0.000656 0.015066 -0.003971 -0.007305 0.009169 -0.010305 
+-0.008041 0.002587 -0.007681 -0.005074 0.001390 -0.003226 
+-0.001817 0.001644 -0.002619 -0.001432 0.003858 -0.005914 
+-0.002640 0.002791 -0.012195 -0.003282 0.006551 -0.024873 
+-0.002368 0.001051 0.001663 0.001396 -0.000344 -0.001908 
+-0.001367 -0.001579 0.000638 -0.000261 -0.000442 0.000064 
+0.000791 0.002104 -0.000010 0.001305 0.004276 0.000337 
+0.002014 0.005420 0.000378 0.003766 0.004931 -0.003006 
+0.003438 0.003821 -0.002750 0.001663 0.000587 -0.003553 
+-0.000009 -0.004159 -0.002043 -0.003717 -0.004269 -0.001532 
+-0.001954 0.001454 -0.000591 -0.000796 0.002572 0.002254 
+-0.000085 0.000644 0.001645 0.001519 0.001779 -0.001686 
+0.000687 -0.000657 -0.001064 -0.000512 0.000993 -0.001622 
+0.001152 0.001147 -0.001709 -0.000725 0.000680 -0.001452 
+-0.001621 0.001581 0.000614 -0.001495 -0.000197 -0.001106 
+-0.001231 0.001049 -0.000801 0.003168 0.003618 -0.000680 
+-0.002615 -0.001025 0.003630 -0.009154 -0.001106 0.004467 
+-0.004832 0.002890 0.004794 -0.001053 0.001796 0.002308 
+-0.000261 0.002762 -0.002196 0.001597 0.007041 -0.005191 
+0.004190 0.003266 -0.008974 0.007386 0.000793 -0.004341 
+0.001495 0.000215 0.001549 -0.005114 0.004342 0.004580 
+-0.004750 0.009597 0.002671 -0.003495 0.008947 0.006531 
+-0.002983 0.002365 0.002594 -0.008079 -0.006473 -0.004887 
+-0.004967 -0.009925 -0.009017 -0.003415 -0.001915 -0.010785 
+0.002184 0.003131 -0.007050 0.004518 0.004527 0.001181 
+0.001077 0.007143 0.000615 -0.002209 0.008853 -0.009698 
+0.003668 0.002630 -0.014533 0.000728 0.007835 -0.009605 
+-0.004415 0.008235 -0.009621 -0.000041 0.005074 -0.008365 
+0.005094 0.000700 -0.004358 0.007993 0.002641 -0.011344 
+0.024119 -0.003917 -0.025710 0.001944 0.015319 -0.040361 
+-0.001840 0.005455 0.008446 -0.697987 -1.966443 5.060403 
+-1.004405 -2.876652 6.299560 -0.992126 -2.960630 6.145669 
+-0.827907 -2.525581 5.027907 -0.002850 -0.012120 0.027707 
+-0.000096 0.003426 -0.005296 -0.001876 0.009981 -0.011247 
+0.002050 0.005184 -0.000617 -0.002306 0.000751 -0.001354 
+-0.001645 0.002903 -0.000581 -0.004593 -0.002475 -0.002716 
+0.000763 -0.002674 0.003195 -0.000132 0.000493 0.000904 
+0.002967 0.001833 -0.006633 0.005165 0.007892 -0.011402 
+0.002259 0.000282 -0.014066 0.006446 0.004792 -0.006667 
+-0.000238 0.005812 -0.005900 0.000359 0.001669 -0.004234 
+0.001653 0.002502 -0.004174 -0.000732 0.003473 -0.005453 
+-0.003189 0.000657 -0.009645 -0.005834 -0.008383 -0.003293 
+-0.038999 -0.061949 0.010421 0.006285 -0.005663 -0.009136 
+0.005664 0.003383 -0.003374 0.003730 0.000490 -0.001539 
+0.005000 0.000461 -0.000346 0.003038 0.002836 0.000800 
+0.003304 0.003963 0.000495 0.004168 0.005601 0.000239 
+0.006316 0.006066 -0.001581 0.007522 0.006468 -0.003303 
+0.006473 0.004119 -0.003374 0.000145 0.000551 0.000791 
+0.001371 -0.000789 0.003496 0.001380 -0.000543 0.002677 
+0.001992 -0.000455 0.000926 0.001910 -0.001096 -0.002538 
+0.001295 -0.000275 -0.000152 -0.000973 -0.002360 0.000515 
+-0.003274 0.000718 -0.001388 -0.004224 -0.000026 -0.003349 
+-0.003223 -0.000362 -0.003256 -0.000973 -0.001616 0.002103 
+-0.000751 -0.001165 -0.000884 0.002086 0.000631 0.000431 
+0.000678 0.000643 0.001210 0.000368 0.000585 0.002675 
+-0.002230 0.000893 0.001789 -0.005661 0.001393 -0.000131 
+-0.001863 -0.003150 -0.002654 0.002209 -0.003832 0.000485 
+-0.000922 0.000411 -0.002580 -0.003566 0.003693 -0.006111 
+-0.001590 0.002980 0.001689 -0.006661 -0.004097 0.000609 
+-0.005609 -0.006246 -0.003410 -0.009182 -0.000092 -0.006702 
+-0.028836 0.011012 -0.002139 -0.023661 -0.012320 0.004861 
+-0.009942 -0.013815 -0.001850 0.000642 -0.013820 0.005251 
+0.003830 -0.004644 0.003440 0.000234 -0.000208 -0.000322 
+0.000821 -0.000602 -0.001431 0.001657 0.001863 -0.005728 
+0.002199 0.003487 -0.007583 -0.001370 0.003557 -0.004331 
+-0.002124 0.002787 0.004335 -0.004898 0.005306 0.002041 
+0.000505 0.003176 0.007807 0.013831 -0.001081 -0.005613 
+0.023951 0.006722 -0.026132 0.006142 0.003373 -0.028879 
+-0.000120 0.000852 -0.002903 -0.003750 -0.007917 0.023106 
+-0.004328 -0.009002 0.036814 -0.001064 -0.010423 0.037443 
+-0.000031 -0.009517 0.025346 -0.003580 -0.001484 0.006520 
+-0.005402 0.008422 -0.001992 -0.002448 0.003895 0.002048 
+0.004043 0.000156 -0.003638 0.002032 0.006089 -0.003296 
+0.006989 0.008710 -0.003471 0.003575 -0.001607 -0.007251 
+-0.000498 0.000691 -0.000987 -0.003048 -0.003313 0.000444 
+-0.005480 -0.002732 0.003494 -0.003589 -0.000627 0.004078 
+-0.004047 0.002247 -0.002021 0.002189 0.000031 -0.006520 
+0.001635 0.000990 -0.005445 0.000342 0.000466 -0.001419 
+0.003601 0.000492 -0.001648 -0.001208 0.001566 -0.000990 
+-0.001399 0.007310 -0.004804 -0.000312 0.003568 -0.005693 
+-0.011279 -0.014100 0.013810 -0.017520 -0.009704 0.006217 
+-0.005566 0.005057 0.006460 -0.002049 0.000348 0.001284 
+0.002998 0.000671 -0.000800 0.001630 0.001732 0.000406 
+-0.001936 0.002644 0.000896 -0.001333 0.002115 0.000673 
+0.001796 0.001348 -0.001257 0.003582 0.002689 -0.004022 
+0.005410 0.002569 -0.005064 0.005140 0.001103 -0.001238 
+0.001598 0.000254 0.001642 0.001188 -0.000176 0.001955 
+0.002689 0.002632 -0.001811 0.005827 0.008911 -0.006103 
+0.003742 -0.002497 -0.004376 -0.001115 0.005794 -0.003357 
+0.000362 -0.000651 0.002278 -0.001083 0.000930 0.001984 
+-0.002408 -0.003227 0.001082 0.000965 0.000150 -0.002846 
+-0.001960 0.001432 -0.003733 0.001855 0.001807 0.000289 
+0.000670 -0.002303 -0.001770 0.002696 -0.003263 -0.001683 
+0.003319 0.000493 -0.000159 -0.001699 0.001702 0.001167 
+-0.006027 -0.000302 -0.001497 -0.005634 -0.003890 -0.004743 
+-0.002205 -0.008929 -0.002520 0.001108 -0.001477 -0.001893 
+0.002615 -0.000836 0.000912 0.001567 0.004462 -0.003439 
+-0.002673 0.009281 -0.002680 -0.006602 0.005366 -0.003967 
+-0.001718 0.006466 -0.003833 0.003211 0.005579 -0.004035 
+0.000695 -0.000169 -0.000877 -0.001778 0.001996 -0.002857 
+-0.002552 0.001746 -0.000590 0.000878 -0.001599 0.003013 
+0.002378 -0.002826 0.008992 0.003701 -0.004826 0.008399 
+0.010004 -0.001663 0.006146 0.014479 0.009730 -0.008671 
+0.006794 0.003177 -0.005322 -0.000062 -0.003379 0.005288 
+-0.000366 -0.001453 0.005316 0.005552 -0.000555 -0.002699 
+0.007742 0.000492 -0.007895 0.004187 0.003071 -0.009042 
+-0.000046 0.003449 -0.007354 -0.000546 0.002594 -0.003929 
+-0.000586 -0.000235 0.000810 -0.003156 -0.001473 0.005214 
+-0.005398 -0.000359 0.004587 -0.002450 0.002084 -0.000164 
+-0.002023 -0.000812 -0.011357 0.001569 0.004214 -0.010917 
+0.001824 0.003079 -0.005135 0.002198 0.002019 -0.003008 
+0.004766 0.002292 -0.004767 0.005197 0.001944 -0.004881 
+0.001955 0.001158 -0.002098 -0.001057 -0.001546 0.000878 
+-0.000818 -0.004859 0.005444 -0.002716 -0.007113 0.006059 
+-0.001992 -0.009940 0.002226 -0.000599 -0.003652 0.006348 
+-0.003407 -0.003390 0.002333 -0.001797 0.000247 -0.002086 
+-0.001825 0.001782 -0.004357 -0.002964 0.000988 -0.004581 
+-0.000467 -0.000474 -0.003929 0.001109 -0.002264 -0.002895 
+0.000569 0.002959 -0.004268 -0.002398 -0.005029 -0.000859 
+-0.014204 -0.001384 -0.001844 -0.007136 -0.001544 0.001285 
+-0.010266 -0.001860 0.003518 -0.002726 0.002261 0.003235 
+0.001208 0.003085 0.001869 0.001494 0.000665 -0.000174 
+-0.000382 -0.002205 -0.001362 -0.002427 -0.002165 -0.004149 
+0.000227 -0.000986 -0.000411 -0.000995 0.000346 0.004153 
+0.000925 0.003832 0.003052 0.001738 0.006154 -0.002610 
+0.001133 0.003423 -0.000843 0.005960 0.001385 -0.002150 
+0.008046 0.004352 -0.004876 0.003499 0.000460 -0.008378 
+0.001652 0.003227 -0.002613 -0.000135 -0.000052 0.001791 
+0.001798 -0.002663 0.002282 0.000238 -0.001678 0.001196 
+0.002872 0.002289 -0.000281 0.001773 0.000298 0.001099 
+0.000081 0.002392 0.001901 -0.002549 0.003059 0.001785 
+-0.003914 0.002605 0.002132 -0.003705 0.000276 0.000492 
+-0.001532 -0.001041 -0.000248 0.001294 -0.000021 0.000067 
+0.000488 -0.001395 0.000163 0.000097 -0.001528 -0.000886 
+-0.004069 -0.000521 0.004306 -0.004630 0.002180 -0.001400 
+0.001458 0.007911 -0.001311 0.009532 0.007099 -0.001155 
+0.007386 0.001268 -0.000997 0.001713 0.000179 -0.000662 
+-0.002158 0.001247 -0.000481 -0.001241 0.001877 0.003125 
+-0.003431 -0.001669 0.005570 0.001304 -0.002095 0.001447 
+0.000712 -0.004237 0.001853 -0.002075 -0.005031 0.001753 
+0.000128 -0.000927 0.001196 0.001660 0.001268 -0.002836 
+0.003974 0.003722 -0.007466 0.005487 0.004021 -0.007912 
+0.004150 0.001316 -0.003059 0.001964 -0.001337 0.001919 
+0.001180 -0.001495 0.002639 0.000469 0.000464 -0.000584 
+-0.000598 0.003416 -0.003812 -0.001350 0.005113 -0.005756 
+0.000451 0.008771 -0.009387 0.005850 0.016576 -0.016051 
+0.010541 0.014253 -0.023206 0.004947 0.006970 -0.016742 
+0.002547 0.002007 -0.005385 0.001619 -0.000202 -0.000704 
+0.002121 0.001201 -0.001753 0.004136 0.003728 -0.003823 
+0.006018 0.005222 -0.004729 0.006473 0.005280 -0.004782 
+0.006130 0.005166 -0.004522 0.004428 0.004766 -0.004719 
+0.001146 0.002224 -0.005301 -0.007961 -0.000297 0.000867 
+-0.000057 0.001908 0.004273 -0.004518 -0.012030 0.012301 
+-0.006593 -0.004794 -0.001078 0.001204 0.000390 -0.007969 
+0.002907 0.006023 -0.000369 0.005690 0.000811 -0.006228 
+0.003117 -0.002247 0.001037 0.003618 -0.001820 0.001107 
+0.003437 -0.000694 -0.004049 -0.001399 0.006541 0.004726 
+-0.010495 0.018720 -0.002784 0.011208 -0.011077 -0.004617 
+-0.008273 -0.015175 -0.005310 -0.003463 0.000287 0.001853 
+0.003182 0.004987 0.003538 -0.000410 0.002656 0.003296 
+-0.002757 0.001968 0.002200 -0.001304 0.000995 0.001246 
+0.002138 0.000134 0.000338 0.005098 0.000386 0.000680 
+0.004054 0.001687 0.002387 -0.000420 0.001115 0.000544 
+-0.004169 -0.003197 0.001528 -0.002993 -0.003139 0.001336 
+-0.000123 -0.000278 -0.003183 0.002000 -0.001334 -0.003779 
+0.000901 0.005516 -0.005263 -0.001101 -0.001238 -0.000534 
+-0.001016 -0.000364 -0.000253 0.001130 0.001981 0.001791 
+-0.001778 0.004759 0.000491 -0.002393 0.003183 -0.000972 
+0.001232 -0.004064 -0.002756 0.000304 -0.002949 -0.001779 
+0.000784 0.000770 0.000234 0.001660 0.003357 0.000815 
+-0.001941 0.001959 0.001500 -0.004114 0.002326 0.001312 
+-0.009738 -0.007238 0.010610 -0.007570 -0.004881 0.008447 
+-0.002007 -0.002701 0.000867 0.003194 -0.001721 0.000004 
+0.004582 -0.003969 0.001055 0.004565 -0.007774 0.002184 
+0.001896 -0.005387 0.000494 -0.002133 -0.001734 -0.001553 
+-0.003167 0.000420 -0.001559 -0.001182 -0.000448 -0.000705 
+-0.000708 0.001796 0.003611 -0.000250 -0.000371 -0.000751 
+-0.004922 -0.004463 -0.001186 -0.003551 0.000327 0.000700 
+-0.002280 0.001195 -0.000344 -0.000679 0.002049 -0.003293 
+0.001327 0.001628 -0.006581 0.003470 -0.000069 -0.005857 
+0.002692 0.003631 -0.003277 0.001035 -0.000177 -0.001006 
+0.002464 0.001200 -0.001136 0.000388 -0.000388 -0.003488 
+-0.000165 0.002638 -0.003368 -0.002799 0.002032 -0.002974 
+-0.002169 0.001454 -0.003125 0.000572 0.002043 -0.004169 
+0.002786 0.002368 -0.005782 0.001814 0.001953 -0.004904 
+-0.000470 0.001028 -0.001625 -0.000613 0.000339 -0.000233 
+0.001389 0.001731 -0.001981 0.003261 0.005085 -0.005383 
+0.005548 0.005027 -0.009170 0.004146 0.004344 -0.009375 
+0.002704 0.003861 -0.005916 0.002388 0.001524 -0.001193 
+0.000998 -0.002046 0.002640 -0.001203 -0.004756 0.004747 
+-0.004252 -0.005640 0.003943 -0.008978 -0.002348 -0.000390 
+-0.009811 -0.002557 0.001584 -0.006719 -0.004548 -0.001477 
+-0.002539 -0.003966 -0.003212 0.000101 -0.001399 -0.003395 
+-0.000330 0.000954 -0.001157 -0.000279 0.003647 0.006114 
+-0.016169 0.000460 -0.030805 0.007182 0.000903 -0.020314 
+0.017913 0.021674 0.001696 0.057151 0.076472 0.004258 
+0.005169 0.033448 0.008936 -0.058542 0.007054 -0.004280 
+0.010452 -0.005528 -0.006882 0.019031 -0.001394 -0.011374 
+-0.002689 0.001977 0.003195 -0.002859 0.006127 0.006687 
+0.000045 0.003383 0.005581 -0.001094 -0.001360 -0.002434 
+-0.000135 -0.002363 -0.003751 0.000384 -0.002836 -0.002774 
+0.001154 -0.003217 -0.001717 0.002115 -0.000838 -0.000790 
+0.002003 0.001188 -0.001200 0.001071 0.000490 -0.000160 
+-0.000258 -0.001664 0.001223 0.000148 -0.003759 0.000685 
+-0.000929 -0.001369 -0.000690 -0.000793 0.001024 0.000493 
+-0.000212 0.001173 0.000619 0.000623 0.005538 -0.002379 
+-0.008589 0.006699 0.004363 -0.008624 -0.003795 0.001155 
+-0.008930 -0.001240 0.003618 -0.007878 0.001341 0.002746 
+-0.007114 0.001470 0.002195 0.000059 0.002680 0.001579 
+0.005383 0.003461 -0.005283 0.009394 -0.000655 -0.003158 
+0.007974 -0.002326 -0.000406 0.007121 -0.001227 0.000266 
+0.007064 -0.003368 0.000417 0.004794 -0.008076 -0.001246 
+0.002126 -0.009616 0.002170 -0.000564 -0.004815 0.000134 
+0.000736 0.002786 -0.003509 0.004202 0.000300 -0.002407 
+0.000720 -0.000238 0.001639 0.000779 0.001994 0.002960 
+0.000439 -0.000727 0.000580 -0.000442 0.000297 -0.000072 
+-0.002205 0.002021 -0.000805 -0.001472 0.003954 -0.002903 
+0.000487 0.003038 -0.006364 0.001338 0.000581 -0.007854 
+-0.000578 -0.001314 -0.005441 0.000694 -0.001778 -0.000194 
+0.000658 0.001721 -0.003948 0.000281 0.001245 -0.001006 
+-0.000692 -0.000231 0.001538 -0.001749 0.000458 0.001244 
+-0.000167 0.001629 -0.001429 0.001799 0.001748 -0.004045 
+0.002183 0.000477 -0.004053 0.000512 -0.000554 -0.002016 
+0.000107 -0.000179 -0.000346 -0.000831 0.000665 -0.001591 
+0.001050 0.001305 -0.001126 0.001012 -0.001877 0.001086 
+0.002419 -0.001537 0.001509 0.001117 -0.000275 0.000582 
+0.000351 0.001914 -0.001177 -0.000361 0.002633 -0.001593 
+0.001440 0.002294 -0.000873 0.000415 -0.000327 0.000534 
+-0.001620 -0.002737 0.000355 -0.002826 -0.001922 -0.002371 
+-0.005414 0.001994 -0.003026 -0.000807 -0.001734 -0.002553 
+0.003610 -0.000054 -0.003302 0.006134 -0.004087 0.002038 
+0.000080 -0.005746 0.007403 0.002535 -0.008955 0.008170 
+0.003241 -0.010415 0.006079 0.014753 -0.004399 0.005091 
+0.012815 -0.002595 -0.001115 -0.014079 0.006560 -0.005282 
+-0.025603 -0.009491 -0.007504 -0.002809 -0.020007 -0.016356 
+-0.045641 -0.030897 0.021410 -0.122919 -0.056315 0.059027 
+-0.066256 -0.019355 -0.001983 -0.042925 0.004429 0.005886 
+-0.019291 0.008637 0.028215 0.000010 -0.000013 -0.000129 
+0.004780 0.004413 0.003097 -0.008059 0.002113 0.010761 
+-0.009988 -0.003473 0.004613 -0.005964 -0.003197 0.001193 
+-0.001440 -0.003239 -0.000966 0.000131 -0.003932 -0.000481 
+-0.001662 -0.003955 0.004786 0.001339 -0.004488 0.001339 
+0.001656 -0.003582 0.004324 0.000126 -0.001723 0.000713 
+0.004649 0.001859 -0.000558 0.001600 0.001719 -0.002080 
+0.017405 0.014095 0.000069 0.012105 0.006821 0.002456 
+0.007500 -0.006619 -0.005580 0.008541 -0.012079 -0.012288 
+0.011508 0.002403 -0.005117 0.008481 0.006318 -0.003546 
+0.005519 0.003242 0.000585 0.004372 -0.000305 0.000361 
+0.006381 -0.002547 -0.002261 0.005468 -0.001223 -0.001694 
+0.003158 -0.001592 -0.000967 0.004782 -0.002299 -0.006584 
+-0.001561 0.006736 -0.004171 0.006438 0.009335 -0.009935 
+0.006631 -0.002114 -0.010171 0.005591 -0.003691 -0.005804 
+0.001900 -0.002921 -0.004955 0.001447 -0.000826 -0.002480 
+0.001946 0.004213 -0.002726 0.002270 0.005286 -0.002683 
+-0.001965 0.001746 -0.002620 -0.000690 0.000383 -0.001300 
+-0.000963 0.000235 -0.000162 -0.001552 0.000048 -0.000160 
+-0.000551 0.004169 -0.001042 -0.000188 0.001992 -0.002751 
+-0.001348 -0.000100 0.000231 -0.002281 -0.002031 0.001141 
+-0.002354 -0.001416 -0.002189 -0.001369 0.001022 -0.003927 
+-0.000811 0.000031 -0.003682 -0.002816 0.000234 -0.001644 
+-0.002295 0.000593 -0.001493 -0.000602 -0.000319 -0.002691 
+0.001413 -0.001762 -0.003874 0.002580 -0.002336 -0.004427 
+-0.000025 -0.001858 -0.001883 -0.001058 0.000604 -0.002455 
+-0.001366 -0.000107 -0.002034 -0.000929 0.000892 -0.001960 
+-0.000665 0.002470 -0.003389 0.006260 0.006466 -0.001437 
+0.005316 0.003924 -0.000399 0.000748 0.002011 -0.000140 
+-0.000773 0.002265 -0.002988 0.000688 0.004619 -0.005799 
+-0.001163 0.006299 -0.006923 -0.007242 0.001577 0.000320 
+-0.008727 -0.004803 0.002051 -0.003749 -0.005842 -0.000655 
+0.000605 -0.005989 0.001573 -0.000958 0.003214 -0.002931 
+-0.000451 0.021288 -0.011181 0.006089 0.029873 -0.008297 
+0.024426 0.011525 -0.019745 0.003935 0.004450 -0.006524 
+0.002191 -0.000105 0.005038 0.008915 -0.006982 0.022387 
+0.004737 -0.084201 0.043531 -0.162500 0.018000 0.126500 
+0.029856 0.042297 0.052249 0.047360 -0.050224 -0.012692 
+-0.128694 0.061893 -0.007430 -0.025019 0.008948 -0.000026 
+0.061244 -0.005658 -0.022800 0.032810 -0.000395 -0.034474 
+-0.009722 -0.009524 0.002100 -0.003876 -0.001071 0.002235 
+-0.001133 -0.001621 -0.000146 -0.000012 -0.002949 -0.001007 
+-0.000764 -0.001701 0.000163 -0.000078 -0.000472 -0.000094 
+0.001346 0.000928 -0.000233 0.001135 -0.001177 0.002004 
+-0.003792 -0.002264 0.002919 -0.006945 0.000064 0.001211 
+-0.001716 0.018931 0.006442 -0.003807 0.065524 0.020231 
+0.223205 0.158078 0.034868 0.059658 -0.000260 -0.061922 
+0.016239 0.020710 -0.020718 0.003125 -0.003221 -0.004090 
+0.000269 -0.004024 -0.003857 0.004326 -0.004707 -0.000548 
+0.004348 -0.003530 -0.000295 -0.003377 -0.006318 0.002478 
+-0.004612 -0.003292 0.002686 0.001693 0.003156 0.003637 
+0.004962 -0.000015 -0.008234 0.014538 -0.003595 -0.007635 
+0.011936 0.001599 -0.000589 -0.000243 -0.002044 -0.000345 
+0.000502 0.003605 -0.002004 0.003460 0.006433 -0.005468 
+0.004987 0.005408 -0.005530 0.003973 0.001599 -0.004018 
+0.001662 -0.002834 -0.001499 -0.000132 -0.004043 -0.000453 
+-0.000646 -0.001250 -0.000240 0.000561 0.002131 0.000411 
+0.003973 0.001307 -0.001333 0.002214 -0.001921 -0.001277 
+-0.000731 -0.001799 -0.001440 -0.000702 0.002098 0.005067 
+-0.001585 0.000528 0.006667 0.000738 0.000222 0.000887 
+0.001537 -0.000523 -0.002804 -0.002240 -0.000320 -0.001760 
+-0.004772 -0.001159 0.001115 -0.000784 0.001575 0.000385 
+-0.000185 0.002985 -0.003846 -0.000889 0.000889 -0.002667 
+-0.000368 0.001176 0.001324 0.000371 0.001417 0.002652 
+-0.000216 0.001269 0.001586 0.004948 0.001276 -0.002396 
+0.004199 0.005242 -0.007379 0.001838 -0.001618 -0.001985 
+-0.001897 -0.001837 -0.002425 -0.000310 -0.002412 -0.001707 
+0.000782 -0.000040 0.000806 0.002723 0.001944 0.000196 
+0.001906 0.001272 0.000506 -0.000311 -0.000737 0.000311 
+-0.001924 -0.004719 -0.000098 -0.002855 -0.005662 -0.000884 
+-0.002092 -0.003317 -0.000031 -0.002780 -0.000466 -0.002506 
+0.000337 0.000954 -0.000109 0.000829 0.005338 -0.006834 
+-0.009210 -0.005131 -0.004731 0.006322 -0.012603 -0.012403 
+0.021370 -0.019617 -0.015824 0.048000 -0.039000 0.003000 
+0.012462 -0.056950 0.030283 0.015000 -0.000777 0.001864 
+-0.027205 0.003468 -0.000539 -0.024025 0.014911 0.022532 
+-0.030922 0.008041 0.017616 -0.078305 -0.047048 0.022419 
+-0.021638 -0.014253 0.011637 0.039948 0.012089 -0.051346 
+0.009991 0.007367 -0.018597 0.005370 0.015911 0.004641 
+0.000618 0.005313 0.003187 0.002356 0.002157 -0.000514 
+0.002270 0.006881 -0.001865 0.001380 0.000581 0.001204 
+-0.001011 0.000230 0.001946 -0.001014 -0.003127 0.000885 
+0.000987 -0.001189 -0.002693 0.000810 0.000908 -0.005512 
+0.057486 -0.012597 0.013138 0.068054 0.075279 0.000963 
+-0.029392 0.068277 -0.033541 -0.024687 0.007975 0.008417 
+-0.004586 0.017258 -0.004725 -0.014911 -0.006201 -0.010777 
+-0.010746 -0.004380 0.005115 0.014187 0.016969 -0.016059 
+0.000780 0.001398 -0.001320 -0.004126 -0.004464 0.005264 
+-0.005280 -0.008992 0.001758 0.002040 -0.001435 -0.005251 
+0.004413 0.002069 -0.018570 0.020165 0.006767 -0.016444 
+0.002361 0.006305 -0.011078 0.001628 0.002667 -0.005104 
+0.001884 0.002053 -0.004318 0.001962 0.001783 -0.004883 
+0.000576 0.000741 -0.002367 -0.000493 -0.002137 0.002246 
+-0.004298 -0.002104 -0.003190 -0.002160 -0.002500 -0.003012 
+-0.001924 -0.000871 -0.001747 -0.002211 0.002214 -0.000631 
+-0.003118 0.002389 -0.000766 -0.003222 -0.000189 -0.001178 
+-0.001482 -0.003954 -0.000882 0.000342 -0.003191 -0.001718 
+0.001663 -0.001144 -0.000832 0.002516 0.001217 0.000146 
+0.003083 0.001924 0.000205 0.002224 0.001240 0.000080 
+0.000336 0.001370 0.001034 -0.001481 0.002700 0.000624 
+-0.004517 0.001129 -0.001971 -0.000443 0.000353 0.000513 
+-0.001779 0.002009 -0.001035 -0.001036 0.001797 0.001426 
+-0.000277 0.000530 0.000263 -0.001637 -0.002569 0.002794 
+0.000938 -0.000114 0.000513 0.001744 -0.002146 -0.001744 
+0.003642 -0.001148 0.000559 0.007243 -0.001219 -0.001574 
+0.002618 -0.001041 -0.004820 0.001049 -0.000026 -0.002615 
+-0.000907 0.001045 -0.003833 -0.003256 0.001180 -0.004623 
+-0.004066 -0.000528 -0.001828 -0.003858 -0.004685 0.002382 
+-0.001099 -0.005125 -0.001196 0.000361 -0.002259 -0.001085 
+-0.001814 0.002024 -0.003058 0.002355 0.005823 0.007157 
+0.001703 0.010784 0.051818 -0.007260 0.012448 0.009105 
+0.001877 0.003015 0.003692 0.010884 0.037007 0.040272 
+0.000371 -0.000320 0.002049 0.009085 -0.010207 -0.001665 
+0.007227 -0.000435 0.002783 0.000078 -0.003564 0.008799 
+-0.012489 -0.008326 0.009412 -0.010222 -0.007556 -0.003556 
+0.027710 0.010564 -0.005473 0.012685 0.013197 -0.008675 
+0.001712 0.002263 -0.001466 0.000533 0.005293 0.001697 
+0.006364 0.005055 -0.001290 0.007424 0.005272 -0.003359 
+0.005886 0.004871 -0.002213 0.004346 0.000429 -0.001127 
+0.000758 -0.000410 -0.003694 -0.000345 -0.000431 -0.002130 
+-0.001368 0.000498 -0.000441 -0.000436 -0.000076 -0.000196 
+0.066778 -0.026260 0.037054 0.005556 -0.028889 0.052222 
+-0.027809 0.011710 0.033256 -0.011427 0.002664 0.008206 
+-0.008480 0.001230 0.001387 0.000825 0.000438 0.000269 
+0.005665 -0.002007 -0.003244 0.005640 0.002562 -0.007230 
+0.002783 -0.000153 -0.002630 0.000216 -0.001094 0.001518 
+0.000551 -0.002162 0.004633 0.001401 -0.003274 0.001603 
+0.000788 -0.004158 -0.019025 0.003228 -0.008097 -0.016767 
+0.002893 -0.001937 -0.007196 0.002746 0.001333 -0.004820 
+0.003407 0.002132 -0.004545 0.003981 0.002270 -0.004695 
+0.002632 0.003133 -0.000364 -0.000908 0.001064 0.000511 
+-0.003346 0.000120 -0.001264 -0.002297 -0.004197 -0.002498 
+0.004959 -0.002479 -0.001653 0.010882 0.005730 -0.005152 
+0.006554 0.005966 -0.001664 -0.003004 -0.000717 0.000583 
+-0.006854 -0.006800 -0.002419 -0.006099 -0.007197 -0.002988 
+-0.003592 -0.004569 -0.000837 -0.000520 -0.003212 -0.000614 
+0.001891 -0.002100 -0.000326 0.004213 0.000028 -0.002771 
+0.003557 0.008060 -0.009612 0.001822 0.009780 -0.008804 
+0.002663 0.006680 -0.004920 -0.000684 0.001075 -0.002721 
+-0.000232 -0.000791 -0.001425 0.001365 -0.001302 -0.000241 
+-0.001347 -0.001004 -0.000029 -0.003760 -0.001407 -0.000216 
+-0.001815 -0.000928 -0.000422 0.001164 0.000868 0.000037 
+0.002846 0.002390 -0.004780 0.001409 0.000466 -0.002694 
+-0.000547 0.000282 0.001478 -0.000890 0.000649 0.002754 
+0.000519 0.000748 0.000660 -0.001051 -0.002712 0.002014 
+-0.002996 -0.010881 0.006335 -0.000519 -0.017561 0.005239 
+0.004155 -0.007562 0.003716 -0.005491 -0.002496 0.009110 
+-0.001509 -0.006233 0.009544 0.001640 -0.013284 0.019006 
+-0.018802 -0.044000 0.064717 -0.001250 0.001250 0.002500 
+0.009500 0.049000 -0.069500 -0.007185 0.033067 -0.038782 
+0.002318 0.030475 -0.019281 0.024337 0.025323 -0.011537 
+0.021674 0.010277 -0.014512 0.013336 -0.007568 -0.008826 
+-0.000706 0.001032 -0.008400 -0.002265 0.006722 0.012928 
+0.023012 0.004371 0.003582 0.028061 0.012732 -0.028636 
+-0.007273 -0.003445 0.001631 0.005916 0.001322 -0.001437 
+0.009698 -0.001863 -0.005878 -0.007143 -0.003682 0.002730 
+-0.000467 0.000439 0.000618 0.006400 0.001409 -0.002725 
+0.002381 -0.000783 -0.000614 -0.003725 -0.003003 0.000149 
+-0.004445 -0.004906 0.004973 -0.000584 0.002159 0.000680 
+-0.043312 -0.026494 -0.060974 0.011246 -0.027349 -0.018319 
+-0.002609 -0.022411 0.014474 -0.019996 -0.011506 0.000101 
+-0.025808 0.007384 -0.001842 -0.007976 0.007121 0.002372 
+0.006487 -0.005158 -0.003588 0.001350 -0.002100 0.000177 
+-0.001446 -0.002017 0.003932 0.001849 -0.002005 0.004917 
+0.001791 0.000846 0.008940 0.002552 0.002392 0.007202 
+0.001356 0.002481 -0.001539 0.002713 0.001048 -0.009206 
+0.001796 0.001699 -0.008385 0.001449 0.002466 -0.006636 
+0.001179 0.001540 -0.003618 -0.001549 -0.002331 0.000677 
+-0.000956 -0.000071 -0.001778 -0.001021 -0.002397 -0.001702 
+0.001862 0.000581 -0.001318 0.004704 0.001156 -0.002930 
+0.004000 0.001780 -0.000667 0.001646 0.003006 -0.000759 
+0.001667 0.005000 -0.001667 0.004469 0.003209 0.002429 
+0.005339 0.002339 0.001169 0.000928 0.002390 0.000617 
+-0.002079 0.001558 0.000559 -0.002039 0.000208 -0.000708 
+0.000690 0.000000 -0.006207 -0.000003 -0.001737 -0.006959 
+0.002071 -0.001333 -0.003212 -0.000544 -0.002687 -0.000390 
+-0.000530 -0.001486 -0.000969 -0.001633 -0.001949 -0.001844 
+-0.003545 -0.001816 -0.002381 -0.002063 -0.001197 -0.001353 
+0.003748 0.000088 -0.001132 0.007301 0.004261 -0.001974 
+0.004114 0.006028 -0.006124 0.002330 0.002130 -0.005476 
+-0.000233 0.000989 -0.002473 -0.001325 -0.000157 -0.001245 
+0.000325 0.001992 -0.000935 0.002530 0.000993 -0.000785 
+-0.000686 -0.000253 0.000004 -0.001170 -0.003975 0.000148 
+-0.000016 -0.003907 0.002244 0.001095 0.005474 -0.000168 
+-0.002547 0.014910 -0.004733 -0.004516 0.015484 -0.000609 
+-0.004372 0.007911 0.005422 0.000171 -0.000130 0.008107 
+-0.005314 -0.041592 0.032482 0.033552 0.043224 0.017910 
+0.049556 0.132222 -0.099111 -0.112850 0.169425 -0.011375 
+0.062051 0.016169 -0.115949 0.025854 -0.015122 -0.058293 
+-0.045313 -0.000302 0.005310 -0.052677 0.008269 -0.001995 
+-0.100000 -0.019615 0.098077 -0.022667 -0.011333 0.035000 
+-0.004270 -0.027838 0.072811 -0.031778 -0.015111 0.024222 
+0.004041 -0.001971 -0.005483 0.016033 0.016041 -0.000611 
+-0.013775 0.005309 0.012340 -0.028483 -0.008897 0.005279 
+-0.003265 -0.004055 -0.001574 0.011643 0.004084 -0.004962 
+0.006722 0.002267 -0.003778 0.006102 0.003143 0.000021 
+0.002017 0.005895 0.001064 0.003107 0.002804 0.002422 
+0.095023 0.041538 -0.023756 -0.000488 0.006558 -0.008721 
+0.000200 0.000744 -0.000375 0.028342 -0.002671 -0.004946 
+0.023625 -0.000554 -0.000628 -0.009198 -0.009317 0.009138 
+-0.003523 -0.006723 0.012011 0.000824 -0.003633 0.003792 
+-0.000205 0.000444 -0.000643 -0.003060 0.006017 -0.004644 
+-0.006178 0.013726 -0.007948 -0.001999 0.016924 -0.006286 
+0.013860 -0.003933 -0.010559 0.005155 -0.004937 -0.006031 
+0.000024 0.004129 -0.003860 -0.001152 0.007489 -0.002710 
+-0.000518 0.004693 -0.001318 -0.000454 -0.001018 0.000137 
+-0.001040 -0.004627 0.000514 -0.001993 -0.004780 0.000825 
+-0.002178 -0.004083 -0.001252 -0.000360 -0.001600 -0.003560 
+0.001290 0.000710 0.000355 0.002158 0.005758 -0.001131 
+0.001696 0.005920 -0.003488 0.000075 0.003637 -0.003136 
+-0.002113 -0.000066 -0.002054 -0.002656 -0.002475 -0.000867 
+-0.001793 -0.002259 -0.000530 0.000381 -0.000381 -0.001333 
+-0.000320 -0.000388 -0.001080 0.000161 -0.000935 -0.000505 
+0.000449 -0.001156 -0.000163 0.002071 -0.001534 -0.000231 
+0.003551 -0.001316 0.000015 0.003259 -0.001441 -0.000538 
+0.001173 -0.002596 -0.001123 0.000970 -0.002869 -0.001374 
+0.001968 -0.001024 -0.001111 0.003057 0.001792 -0.001427 
+0.001550 0.001749 -0.001057 0.000065 -0.000426 0.000047 
+-0.000168 -0.000194 0.000090 0.002950 -0.000737 -0.001716 
+0.000870 -0.000473 0.000382 0.002436 0.000878 0.002164 
+0.000547 0.001906 0.000953 0.002132 -0.002213 0.006095 
+0.001206 0.000637 0.002973 0.000892 0.005141 -0.004529 
+0.000819 0.005574 -0.009228 0.001053 -0.001162 0.000097 
+0.000720 -0.006693 0.001454 -0.002562 -0.003646 0.003037 
+0.002266 -0.000644 0.005117 0.014524 -0.014950 0.026105 
+0.086615 -0.002846 0.048538 0.146364 0.043342 -0.007224 
+0.085941 0.056588 0.001059 -0.000275 0.007527 0.027033 
+-0.050000 -0.115800 -0.038600 0.018128 -0.031429 -0.045320 
+-0.019586 0.013207 0.017310 0.008788 0.026970 0.035758 
+-0.045673 -0.009135 0.099167 -0.011450 -0.096101 0.103287 
+-0.059333 -0.015083 0.011667 -0.006428 -0.020378 -0.028293 
+0.013771 -0.008827 -0.019773 0.012346 -0.000520 -0.006975 
+0.006592 -0.000326 -0.004090 -0.001572 -0.000042 0.001093 
+-0.001788 -0.000529 0.000736 0.000387 -0.000173 -0.000314 
+0.001623 0.001147 0.000728 0.004608 0.003693 0.000901 
+-0.027517 -0.028571 0.019262 0.000876 -0.016487 0.000412 
+0.005041 -0.001573 -0.007364 0.008281 0.015088 -0.001382 
+0.008572 0.011383 -0.005326 0.006490 -0.003017 -0.003737 
+0.002543 -0.000828 -0.004142 0.003446 0.002851 -0.003698 
+-0.003951 0.003914 -0.001235 -0.002086 0.006222 -0.002331 
+-0.000482 0.002254 -0.001397 0.003959 0.000208 0.001241 
+0.006611 -0.002576 -0.003714 0.002825 -0.000149 -0.003372 
+0.001069 -0.000163 -0.001074 0.000750 -0.002658 0.000519 
+-0.000691 -0.002427 -0.000697 0.000992 -0.000399 -0.001996 
+-0.002115 0.001089 -0.000912 -0.001426 0.002878 0.000485 
+-0.001179 0.001356 0.000406 -0.003556 0.000455 0.001192 
+-0.003879 -0.001487 0.001708 -0.000775 -0.001920 0.000517 
+-0.000560 0.001218 -0.001828 0.000245 0.002274 -0.001796 
+0.002038 0.002794 -0.001289 0.003701 0.002764 -0.000737 
+0.003189 0.003212 -0.002418 0.002156 -0.000156 -0.003706 
+0.000876 -0.001141 -0.003189 0.001106 -0.000553 -0.004634 
+0.004125 0.001454 -0.002305 0.000587 0.000397 0.000168 
+-0.001397 -0.000278 -0.001013 -0.002560 -0.000649 -0.001231 
+-0.001967 -0.001492 -0.000571 -0.000143 0.000488 -0.000100 
+0.003180 0.004260 -0.002624 0.004274 0.005107 -0.004074 
+0.004286 0.005057 -0.001171 0.001178 0.002869 0.001720 
+-0.002446 0.002381 0.000123 -0.004089 0.001457 -0.002393 
+-0.006034 -0.001172 -0.002345 -0.003766 -0.004263 -0.001956 
+-0.002087 -0.002661 -0.001760 -0.000425 0.000869 -0.001729 
+0.001805 0.004890 -0.002422 0.003183 0.007294 -0.003897 
+0.002185 0.006868 -0.005916 0.002384 0.004153 -0.006757 
+-0.001690 0.007091 0.000724 0.000863 0.000876 -0.001858 
+0.000323 -0.003362 0.005614 0.001908 -0.004600 0.006221 
+0.004487 0.016542 -0.004315 -0.004868 0.041799 0.010072 
+0.038430 0.007025 -0.047107 0.006296 0.024815 -0.018704 
+0.013824 0.038992 -0.006279 -0.005294 0.003529 0.011471 
+0.023276 -0.181667 -0.009310 -0.042500 -0.021875 0.063125 
+0.015952 -0.011762 0.126810 0.006176 0.047758 0.029890 
+0.002797 0.086820 0.135824 0.028246 0.007719 0.005965 
+0.094253 -0.051465 -0.020384 0.049213 -0.006845 -0.022561 
+-0.032792 0.012586 0.032255 0.012774 0.013862 0.004812 
+0.002683 0.006102 0.004124 0.008995 -0.000664 -0.004440 
+0.016760 0.002524 -0.005828 0.010154 0.003856 0.000002 
+0.049059 -0.004054 -0.024667 0.005479 -0.004638 0.014346 
+0.000636 -0.008261 -0.000243 0.006305 -0.026919 -0.000893 
+-0.002325 -0.020789 0.005509 -0.007197 -0.011588 0.008874 
+-0.000155 -0.003001 0.000720 -0.000251 -0.001384 -0.007119 
+-0.004669 -0.000393 -0.002940 -0.000646 0.001082 -0.001406 
+0.001040 0.000468 0.001926 0.007391 0.001473 0.002141 
+0.002350 -0.000599 -0.003173 -0.001277 0.002576 -0.001768 
+-0.002787 0.003022 -0.001033 -0.000423 0.002127 -0.002764 
+-0.001772 0.001228 -0.000932 0.003446 -0.001678 -0.001399 
+0.006252 -0.002100 -0.002930 0.004000 -0.002825 -0.001746 
+-0.000313 -0.001949 -0.000090 -0.003766 -0.002079 0.002360 
+-0.003089 0.000640 0.003692 -0.000267 0.001784 0.000473 
+0.002109 0.001786 -0.002716 -0.001456 0.001245 -0.000781 
+-0.000781 0.002220 -0.000044 0.000529 0.003415 0.002078 
+0.000698 0.003794 0.002064 -0.000796 0.004751 -0.000410 
+-0.002114 0.004691 -0.000396 0.001706 0.005873 -0.001706 
+0.002827 0.003988 0.001350 0.001635 0.000898 0.000347 
+-0.000287 -0.002088 -0.000269 -0.001709 -0.002645 -0.001068 
+-0.000672 0.000249 -0.000028 0.003768 0.003239 -0.001771 
+0.004868 0.003150 -0.000798 0.002307 0.000269 0.000948 
+-0.002676 0.001368 0.001939 -0.007820 -0.000728 0.001298 
+-0.002820 -0.000492 0.001410 0.002127 0.000567 -0.006663 
+0.007322 -0.000585 -0.003890 0.001306 0.000877 0.000510 
+-0.001595 -0.002279 -0.000806 -0.003637 -0.003146 0.000565 
+0.000605 -0.002441 -0.000008 0.001561 0.004287 -0.001975 
+0.005790 0.011061 -0.006367 0.009173 0.009757 -0.009655 
+0.000372 0.001199 -0.005269 -0.000699 0.000314 -0.000766 
+0.001381 0.001183 -0.001598 0.002696 0.005385 -0.003545 
+-0.000252 -0.005582 0.003352 0.013807 0.047500 0.009605 
+0.012220 0.060945 0.078022 -0.005714 0.088571 -0.057143 
+0.001471 0.031667 0.000882 0.031733 -0.042311 -0.093333 
+-0.005000 0.029200 -0.014600 0.010952 0.035476 0.019127 
+0.038220 -0.072576 0.143220 0.123388 -0.049592 0.122204 
+0.000000 -0.016000 0.000000 0.000000 0.062857 -0.042857 
+0.114301 0.037437 -0.016613 0.034444 0.033659 -0.003740 
+0.009798 0.043939 0.025354 0.054634 0.038059 0.011575 
+0.012641 0.006659 0.002113 -0.004748 -0.000944 0.000444 
+0.007848 0.006910 0.002102 0.005146 0.005325 0.002513 
+-0.007316 0.013251 -0.012446 0.013603 0.018711 -0.010363 
+0.006019 0.000639 0.000231 -0.012900 -0.015200 0.006977 
+-0.008863 -0.005075 0.005643 -0.002862 0.001129 0.001755 
+0.001090 0.000596 -0.000977 -0.000023 -0.000481 -0.001866 
+-0.001675 0.001459 0.000733 0.000482 0.001952 0.001516 
+0.000316 0.002275 -0.000715 0.000129 0.003332 -0.003851 
+0.002645 -0.000214 -0.005088 0.003220 -0.002746 -0.003580 
+0.004321 -0.000876 -0.002200 0.001036 0.002367 0.002057 
+0.001194 0.003861 0.001054 0.001667 0.002294 -0.000164 
+0.001733 0.000514 -0.000669 0.001050 0.001270 -0.001661 
+-0.000557 0.003798 -0.003143 0.000165 0.003445 -0.006317 
+0.004791 0.005070 -0.006268 0.002086 -0.002052 -0.004002 
+0.003227 -0.000692 -0.002903 0.001215 -0.001089 -0.002345 
+0.000270 -0.002640 -0.001557 0.002017 -0.000025 -0.000406 
+0.002925 0.002116 -0.000740 0.002960 0.001106 0.000664 
+0.002605 -0.001737 -0.002742 0.006667 -0.002076 -0.003114 
+0.007221 -0.002327 -0.004175 0.007403 0.001772 -0.002849 
+0.004028 0.005688 -0.000653 -0.001435 0.002579 -0.003162 
+0.004736 -0.002011 -0.000648 0.004484 0.001657 0.002599 
+0.003531 0.005214 0.002354 0.004227 0.004011 -0.000673 
+-0.001546 0.003194 -0.001715 -0.000210 0.002302 -0.000730 
+-0.001490 -0.003249 0.001693 -0.003343 -0.007136 0.002258 
+-0.004818 -0.003822 -0.001991 -0.002060 -0.000224 -0.005732 
+0.000535 -0.002357 -0.005091 -0.002019 -0.000516 -0.000645 
+-0.005475 -0.003492 0.000984 -0.001619 -0.003514 0.001927 
+0.001721 0.002676 -0.001740 0.003943 0.003582 -0.002692 
+-0.002596 -0.000997 0.002022 -0.004840 -0.003211 0.004434 
+0.000919 -0.001651 0.001842 0.005347 0.003779 0.001851 
+0.005922 0.001595 0.006022 0.023217 -0.031467 0.043468 
+-0.072053 -0.070053 0.023684 0.000295 -0.009557 -0.018721 
+0.003519 -0.035741 -0.019630 0.037778 -0.039487 -0.059231 
+-0.003333 0.023333 0.005556 -0.013445 0.077143 -0.053782 
+-0.007556 -0.070889 -0.067111 -0.048550 -0.047650 0.010250 
+0.007407 -0.045926 0.038519 0.101333 0.050667 -0.038889 
+0.020000 0.000000 -0.111250 -0.015604 -0.011087 -0.060362 
+-0.018609 0.001541 -0.007744 0.013490 0.006846 0.024866 
+0.030000 -0.042228 -0.017474 0.019987 -0.020476 -0.009083 
+0.027699 -0.023394 -0.011195 0.009909 0.004814 0.000477 
+-0.001697 0.001141 0.002087 -0.001970 -0.002823 0.001110 
+-0.002536 -0.000053 -0.001286 -0.000755 0.003712 -0.003719 
+0.000461 0.005283 -0.000629 -0.000731 0.001656 0.000294 
+-0.000435 0.000750 0.001306 -0.000350 -0.002283 0.003666 
+-0.000558 -0.000435 0.002639 0.000227 0.000682 -0.000609 
+-0.003574 -0.000165 -0.008561 -0.004059 -0.007932 0.003603 
+0.001932 0.005485 0.001223 0.008155 0.000301 0.002001 
+0.007489 -0.013853 0.004910 0.008970 0.015121 -0.012879 
+0.022107 0.005609 -0.021824 -0.006456 -0.025260 0.005005 
+0.001648 -0.078971 0.031269 -0.070000 -0.019100 0.057300 
+-0.060909 -0.002909 0.005818 -0.020800 -0.029000 0.041400 
+0.011869 0.008965 -0.011616 0.012810 0.009381 0.001190 
+-0.035385 0.046923 -0.035385 -0.018375 0.055125 -0.035000 
+0.038816 -0.031510 0.029592 0.107504 -0.047683 0.117041 
+0.117500 -0.039583 -0.007917 0.211448 -0.017290 0.067290 
+0.022509 -0.028136 0.084286 0.001020 -0.008882 0.052270 
+-0.021000 -0.055600 0.039133 0.012780 -0.036501 0.020994 
+-0.006588 -0.026250 -0.005647 -0.060000 -0.140400 0.046800 
+0.016908 -0.059737 0.011645 -0.001683 -0.049220 -0.019561 
+0.022967 0.004780 -0.003094 0.015027 -0.003160 0.002789 
+-0.015378 -0.057936 -0.002265 -0.002411 0.004922 0.025108 
+0.007248 0.017192 0.014467 -0.007095 0.009078 0.012046 
+-0.005071 0.111643 -0.019286 -0.022200 0.060000 0.066600 
+0.115000 0.015714 0.115000 -0.048889 -0.037222 0.086111 
+-0.129692 -0.086462 -0.012000 0.002010 0.005784 -0.008284 
+-0.041667 0.000000 -0.004167 -0.014692 0.025712 -0.018750 
+-0.030444 0.026222 0.043556 -0.010238 0.035857 0.056381 
+-0.013423 0.013692 -0.024269 -0.044451 0.055706 -0.044571 
+-0.025084 -0.015520 0.005799 -0.012005 -0.010647 0.017123 
+-0.002352 -0.003388 -0.001935 -0.002272 -0.001047 -0.003107 
+0.002510 -0.002851 -0.001075 0.001561 -0.003341 0.000030 
+-0.002136 0.010555 -0.011433 -0.027103 0.028651 -0.025789 
+-0.012987 0.009200 -0.002390 0.002724 -0.006968 0.002465 
+0.008645 -0.011479 0.001689 0.014312 -0.005125 -0.005937 
+0.005721 0.004291 -0.003636 0.003714 0.002857 0.006571 
+0.003529 -0.005441 0.010441 0.000340 -0.006341 0.006885 
+-0.004624 0.003650 -0.006997 0.000874 0.004488 0.003685 
+0.007355 0.020707 -0.004222 0.005366 0.003172 -0.003956 
+-0.002985 -0.001024 0.005595 -0.001783 -0.000125 0.004105 
+-0.005427 0.000811 -0.001700 -0.002777 0.002075 -0.002678 
+-0.000437 0.003197 -0.006231 0.000011 0.002772 -0.007274 
+-0.002683 0.001281 -0.003560 0.000584 -0.000695 0.001449 
+0.001530 -0.005888 0.005050 0.001671 -0.002065 0.005491 
+0.004811 0.006560 -0.000999 0.003028 0.006752 -0.007098 
+0.001248 -0.007173 -0.001077 0.016268 0.018403 0.009097 
+0.014181 0.045003 0.013307 0.003581 -0.010356 -0.007258 
+0.011280 -0.005077 -0.004513 0.003081 -0.009460 -0.006542 
+-0.020414 0.013724 -0.008448 -0.008977 0.037841 0.010909 
+-0.003469 0.095510 -0.054694 0.006481 0.000880 -0.025046 
+-0.011667 -0.001667 -0.006667 0.109091 -0.008364 -0.004182 
+0.017914 -0.048182 0.071658 -0.028203 -0.003871 0.117788 
+0.113333 -0.038141 -0.190705 0.023158 0.013985 0.027519 
+0.006248 -0.119235 0.098798 0.029928 -0.106937 0.004745 
+-0.057795 -0.016460 -0.012391 -0.014437 0.040506 -0.031885 
+-0.039882 0.026412 -0.033412 0.000769 -0.056923 -0.013974 
+0.054472 0.020569 -0.021585 -0.010673 0.007115 0.023750 
+-0.028098 0.003415 0.003805 0.032727 -0.062727 0.031818 
+-0.008547 -0.098590 -0.072863 -0.081486 -0.090857 -0.056114 
+0.003516 0.055714 -0.006154 0.018132 0.070831 -0.043846 
+-0.022730 0.018565 -0.008717 -0.019393 -0.069574 0.052481 
+-0.066667 -0.027333 0.082000 -0.008444 0.026667 -0.041333 
+0.038869 -0.019226 -0.009405 0.076764 -0.030364 -0.095527 
+0.003333 -0.017222 0.017222 -0.026909 0.007273 0.013455 
+-0.023333 0.015417 -0.000417 -0.025000 -0.025000 -0.081111 
+0.060000 -0.015556 -0.054444 0.084751 0.004981 -0.061073 
+-0.005833 0.001667 0.010833 0.004545 0.043636 -0.104545 
+-0.022332 0.032530 -0.016418 -0.000797 -0.009524 0.009588 
+-0.004320 -0.004487 -0.006750 -0.008802 -0.004037 -0.002786 
+0.002886 -0.008035 0.015418 -0.020751 -0.000068 0.016465 
+-0.013210 0.027873 0.017694 0.001880 0.009493 -0.007479 
+0.008103 0.015671 -0.011348 -0.001682 0.018032 -0.018886 
+-0.005878 0.003947 -0.016827 0.007643 -0.004390 -0.012681 
+0.014503 0.017891 -0.016007 0.004823 0.016530 -0.010403 
+-0.009151 -0.000675 -0.000848 -0.016355 -0.005095 0.012534 
+-0.000116 -0.002908 0.011256 0.014980 0.002452 0.004106 
+0.019474 -0.013395 0.007532 -0.004433 -0.006414 0.015985 
+-0.001382 -0.000773 0.000410 -0.000307 0.000463 0.000296 
+-0.001312 0.000296 -0.000142 -0.003081 0.000788 -0.001441 
+0.000000 0.000645 -0.002016 -0.001185 0.000771 0.001598 
+-0.005978 -0.002268 -0.002130 -0.005051 -0.003909 -0.000292 
+-0.002747 0.000227 -0.001181 -0.000413 0.004796 -0.005509 
+0.002090 0.006195 -0.008575 -0.000921 -0.002868 -0.004003 
+-0.026508 -0.044188 0.005906 -0.037807 -0.011853 -0.003422 
+-0.011318 0.003595 -0.008693 -0.021212 -0.020485 -0.042788 
+-0.004580 -0.041148 -0.077216 -0.021350 0.005833 -0.003050 
+-0.026144 -0.001111 -0.015686 0.024127 -0.006032 -0.012063 
+0.000000 0.000000 0.000000 -0.007778 0.002222 -0.005556 
+-0.028852 0.012201 -0.024785 0.046148 0.013963 -0.029630 
+0.083208 -0.007242 -0.026529 0.082033 0.000440 0.026758 
+0.006565 0.009218 0.005867 -0.019375 0.120625 -0.031250 
+-0.013733 0.075556 -0.018311 0.000556 -0.017778 0.018889 
+-0.040231 0.005000 -0.032615 -0.064289 0.031340 -0.037774 
+-0.076581 0.020479 -0.056991 0.021250 -0.043784 0.007297 
+0.057906 -0.028718 -0.058846 0.011450 -0.021385 -0.028290 
+0.003571 -0.032343 -0.024257 -0.090606 0.076667 0.132424 
+0.023932 0.051111 0.035897 -0.017083 -0.040833 0.012917 
+0.107500 0.117000 -0.039000 0.003750 -0.001875 0.006875 
+-0.014019 -0.012870 0.038037 0.038254 -0.066349 0.017937 
+0.002381 -0.041905 0.039524 0.021143 -0.012286 -0.025571 
+0.054923 -0.037692 -0.007846 0.013075 -0.077763 -0.011011 
+0.044689 -0.018913 0.019193 0.045648 0.072176 -0.002731 
+0.030196 0.065425 -0.020131 -0.006529 0.019339 -0.000248 
+0.043816 -0.000395 -0.043684 0.043750 0.018125 -0.069375 
+0.033333 -0.001216 -0.005471 0.012222 -0.001194 -0.051556 
+0.034119 0.005632 -0.046790 0.019038 0.000096 -0.075865 
+0.023916 0.012882 -0.025732 0.010466 0.004597 -0.001956 
+0.010319 -0.004896 -0.001180 -0.029627 0.018373 0.001378 
+-0.002711 0.015065 -0.007592 0.004948 0.002011 -0.007505 
+0.009795 0.007785 -0.011497 0.012774 0.015320 -0.012397 
+0.008129 0.016084 -0.005566 0.002060 0.001429 -0.003296 
+0.005000 0.009531 -0.012254 -0.005956 0.004872 -0.005465 
+-0.002039 -0.000578 -0.001074 -0.000659 0.004571 0.000225 
+-0.003856 0.002044 0.002149 -0.007992 0.000004 0.006011 
+-0.010234 -0.004687 0.013156 -0.000933 -0.006006 0.009268 
+-0.001733 0.001879 -0.001532 0.002943 0.005378 -0.004668 
+0.003188 0.005075 -0.003439 0.001098 0.000860 -0.000979 
+-0.000385 0.000319 -0.000143 -0.002707 0.001170 -0.004272 
+-0.002295 0.001124 -0.000629 -0.001675 0.000350 0.000597 
+-0.002333 0.003288 -0.000098 -0.001871 0.007171 -0.004485 
+-0.000071 0.009882 -0.011592 0.003368 0.006368 -0.017425 
+-0.004932 -0.009260 -0.006308 -0.013656 -0.011446 0.000601 
+0.000183 -0.000029 0.000156 0.010408 0.022110 -0.003974 
+0.031494 0.036782 0.005230 0.002867 0.003531 -0.000874 
+-0.080143 -0.054229 -0.025114 -0.110492 -0.084344 0.000984 
+0.005275 -0.120000 0.003516 0.018052 -0.003169 0.026919 
+-0.004561 0.003684 0.019649 -0.001333 0.000828 0.002069 
+0.009511 -0.008161 0.007241 0.000579 -0.010331 -0.014628 
+-0.009365 0.011270 0.013016 -0.018333 0.098333 0.000000 
+-0.011082 0.051345 0.015760 -0.052727 0.034866 0.008717 
+0.007009 -0.010513 -0.035556 -0.044500 0.022250 -0.050000 
+-0.009773 -0.011932 -0.026023 0.032653 -0.018878 0.008673 
+0.034220 -0.024068 0.019780 -0.005893 -0.019464 -0.018571 
+-0.003077 -0.014615 -0.032308 0.000895 0.049895 -0.040632 
+-0.081481 0.023704 0.105185 -0.014444 -0.031667 0.010556 
+0.081481 0.099259 0.063704 -0.050408 0.031224 0.072041 
+-0.023750 -0.061765 -0.015441 0.076463 -0.035782 -0.037007 
+-0.006207 0.021773 0.020246 0.011953 0.030337 0.029428 
+-0.046333 0.023167 0.011667 -0.032529 -0.004598 -0.046437 
+0.003221 0.088413 -0.067115 0.017235 0.088353 -0.149765 
+0.046000 0.044200 -0.088400 0.028846 0.045000 0.019231 
+0.016983 0.028534 0.026724 -0.016097 0.016328 -0.006855 
+-0.004978 0.000664 -0.011333 -0.012789 0.003844 -0.001293 
+-0.011765 0.000000 -0.036471 0.036992 -0.014098 -0.032293 
+0.018182 -0.017213 -0.001013 0.006251 -0.028643 0.001771 
+-0.015391 -0.031465 -0.000436 -0.003663 -0.014350 -0.006362 
+-0.003504 0.000097 -0.003618 0.002744 0.010529 -0.014750 
+0.008615 0.012859 -0.008574 0.015366 0.012409 -0.004633 
+0.012132 0.010562 -0.001706 -0.010819 0.000475 0.008916 
+-0.036648 -0.014499 0.012030 -0.015678 -0.005779 -0.007232 
+-0.006531 0.009214 -0.002755 -0.003555 0.015042 -0.001914 
+0.001773 0.007711 0.001164 0.004241 -0.002334 0.000615 
+0.006741 -0.005777 -0.004081 0.004637 -0.000317 -0.009322 
+0.000310 -0.000569 -0.001884 -0.000603 0.000269 -0.000832 
+-0.002058 -0.002089 0.000963 -0.002689 -0.003591 0.001399 
+0.000135 -0.000732 0.000266 -0.001171 0.003788 -0.006520 
+-0.001206 0.002192 -0.004477 -0.002919 0.001777 -0.001028 
+-0.009465 0.001012 0.004130 -0.003374 0.001251 -0.000301 
+-0.002524 0.013033 -0.012195 0.001420 0.018615 -0.024767 
+-0.003251 0.011469 -0.020189 -0.010799 -0.007880 0.001070 
+-0.004554 -0.005803 0.003709 0.002378 -0.026699 0.026835 
+0.032932 -0.053474 0.076526 0.047177 -0.044536 0.031421 
+-0.048503 0.028538 -0.012830 -0.002095 0.003011 -0.058658 
+0.026491 0.018137 -0.043949 0.062101 0.023960 -0.032204 
+0.011457 0.012365 0.057916 0.014603 0.059683 0.055873 
+-0.022000 0.051818 -0.044000 -0.036364 0.033636 -0.002727 
+-0.135111 -0.067556 0.028889 -0.072124 -0.031869 0.154314 
+0.007879 -0.073939 0.054242 0.023077 -0.012805 -0.051222 
+-0.008182 -0.030909 -0.008182 0.010091 -0.003364 -0.022727 
+-0.007500 0.005667 0.011333 0.013636 0.000273 0.001909 
+0.019712 -0.003942 0.000000 -0.010833 -0.026667 0.010833 
+-0.006128 0.013821 0.033051 0.120000 0.033286 -0.099857 
+-0.025000 0.017000 -0.004000 0.017778 0.023333 0.005556 
+0.105185 0.076296 -0.067037 0.006061 0.018788 0.024848 
+0.028182 -0.016787 -0.007194 -0.065758 -0.042424 -0.014848 
+-0.125926 -0.035185 0.015185 -0.130159 -0.093651 0.079365 
+-0.008889 -0.007350 0.011026 0.030688 0.022804 -0.030265 
+0.102333 0.042667 -0.059667 0.080974 0.087987 -0.079221 
+-0.010000 0.070933 -0.035467 -0.000802 -0.034011 -0.039626 
+-0.000436 -0.042238 0.042762 -0.011811 0.000636 0.016212 
+-0.024615 -0.001584 -0.000407 0.007128 0.011404 -0.000625 
+0.036218 0.024326 -0.054530 -0.032400 -0.021000 -0.010800 
+-0.013617 -0.019488 -0.017644 0.010023 -0.007700 -0.002250 
+0.005538 0.000645 0.000464 0.000842 0.000593 0.000322 
+0.007733 0.003974 0.000874 0.014138 0.002654 -0.012737 
+0.008050 0.008033 -0.013832 -0.000634 -0.002524 0.001759 
+-0.000544 -0.006081 0.001924 -0.004311 0.008433 0.001085 
+-0.006995 0.011617 0.007748 -0.004339 -0.000395 -0.000547 
+-0.004112 -0.002741 -0.002817 -0.001742 0.000498 -0.000303 
+0.003026 -0.003528 0.000803 0.007684 -0.005974 0.003129 
+0.006889 -0.006032 0.003770 -0.004516 -0.009398 0.004859 
+-0.002234 -0.002581 0.000162 -0.004273 -0.001822 -0.000434 
+-0.002850 -0.000432 -0.004750 -0.000792 0.002747 -0.001155 
+0.000116 -0.001185 0.000244 -0.001235 -0.003606 0.002087 
+-0.002421 -0.002463 -0.000544 -0.002175 -0.002245 -0.000421 
+-0.003547 -0.002809 -0.000192 -0.002983 -0.001219 0.000593 
+-0.000902 0.005323 -0.008255 0.004395 0.014482 -0.015301 
+0.008248 0.018665 -0.014445 0.001538 -0.000396 0.001727 
+-0.006361 -0.002639 0.002517 -0.008320 -0.001303 -0.005784 
+-0.012502 -0.010802 -0.000478 -0.000383 -0.000326 -0.000205 
+0.008444 0.033111 -0.012889 -0.010259 0.017849 0.003587 
+0.016208 0.000821 -0.012923 -0.002605 -0.002105 0.014132 
+-0.019770 -0.038235 0.017066 0.002543 -0.034492 0.020354 
+-0.007466 0.007626 -0.014954 -0.029231 0.031111 -0.043846 
+-0.051324 0.035432 0.063243 0.077785 0.092469 -0.084035 
+0.015317 0.102960 -0.068066 0.078722 -0.003835 0.022406 
+-0.022350 -0.031293 -0.000747 -0.084225 -0.050535 -0.030909 
+-0.031618 -0.018971 0.006667 -0.019530 -0.010075 0.007688 
+0.019368 -0.014915 -0.005120 0.048356 -0.059897 0.027945 
+-0.036049 -0.143457 0.036790 0.095011 -0.097120 -0.062018 
+0.064154 -0.013337 0.009010 0.023635 0.028486 0.006149 
+0.046250 0.011250 0.012500 0.052810 0.045163 -0.034052 
+-0.002545 -0.001273 -0.032727 0.025628 0.001126 -0.010563 
+0.035617 -0.010525 0.008673 -0.019109 -0.060704 -0.006744 
+0.000800 -0.066667 0.001067 0.002000 -0.120385 0.024077 
+0.047069 0.076782 -0.021034 0.052562 0.039274 -0.098775 
+0.022500 0.015603 0.036408 0.037149 0.048218 0.063040 
+-0.002418 0.012286 -0.000066 -0.004332 0.020782 -0.003843 
+-0.010434 -0.003582 -0.011758 0.007695 0.003804 -0.030890 
+-0.008221 0.141250 -0.041106 -0.018131 0.027363 0.035591 
+0.000268 -0.007576 -0.005487 0.001299 -0.006786 -0.001614 
+0.011716 0.005704 0.000370 0.014678 0.010053 -0.003181 
+0.005733 0.008667 -0.011200 0.001532 -0.004024 -0.009467 
+0.058639 -0.018992 -0.011275 0.058866 0.031183 -0.014522 
+0.020288 0.016855 0.002368 0.005972 0.005018 0.003305 
+-0.000841 -0.001664 -0.000874 -0.003020 -0.003433 -0.001688 
+-0.003077 -0.001341 -0.000341 0.002738 0.000728 -0.000110 
+0.012344 0.001528 -0.002601 0.017423 0.003251 -0.008960 
+0.012305 0.003785 -0.008360 -0.000242 -0.002888 0.001983 
+-0.004454 0.002681 -0.004011 -0.004925 -0.002403 -0.004955 
+-0.002488 -0.001446 -0.003297 0.000780 -0.000838 0.000133 
+0.000068 -0.000977 0.000023 0.001192 -0.000107 0.003362 
+-0.004349 0.001879 0.002579 -0.004309 -0.002419 0.000475 
+-0.000361 0.002410 -0.003248 0.001323 0.004971 -0.006280 
+0.005242 0.005259 -0.010386 0.008199 0.012811 -0.012811 
+0.011681 0.021303 -0.010311 0.012326 0.012438 -0.002724 
+0.002580 -0.002432 0.002564 -0.005212 0.000500 -0.005157 
+-0.011327 -0.000352 -0.016625 -0.003489 -0.000039 -0.014549 
+-0.006140 -0.003934 -0.000447 0.009936 -0.017585 -0.009188 
+0.003898 -0.006133 -0.004966 -0.025857 0.001714 0.009762 
+-0.034869 0.009054 0.008970 -0.021143 -0.002781 -0.004523 
+-0.006096 -0.052395 0.004954 -0.035455 0.002587 0.012937 
+0.047706 0.025833 0.021203 0.047860 0.076946 -0.010603 
+0.068556 0.025108 -0.081937 -0.045000 -0.045571 0.089714 
+-0.058125 -0.066250 -0.019375 0.000000 -0.021667 0.105000 
+0.011688 -0.030779 -0.008831 0.056667 -0.020299 -0.004060 
+-0.025283 -0.025418 0.021159 -0.046844 -0.012234 0.037992 
+0.022669 -0.053656 0.021528 0.019273 0.003979 0.015502 
+-0.037261 -0.019113 0.015284 -0.044945 -0.046879 0.084088 
+-0.012108 -0.051225 0.026078 0.054288 -0.009715 0.041553 
+-0.123308 0.036466 -0.027444 0.030000 0.060000 -0.118571 
+0.107936 0.080635 -0.162540 0.042000 -0.034500 -0.034500 
+-0.034667 -0.017333 -0.036667 -0.115921 -0.031447 0.024868 
+0.004286 -0.032512 -0.013005 0.122862 -0.029112 0.025329 
+0.045037 -0.027022 0.071250 -0.004737 0.049579 0.021263 
+0.005705 -0.013854 -0.071818 -0.018314 -0.009218 -0.043798 
+0.012472 0.001782 0.003001 0.018582 0.008174 -0.012990 
+0.000028 0.013720 0.024685 -0.013290 0.011367 0.003463 
+0.001481 -0.008867 -0.005985 -0.003383 -0.014747 0.000324 
+-0.003139 -0.002783 0.001981 -0.011357 0.012285 -0.004739 
+-0.016032 0.015919 -0.007676 -0.049403 -0.032360 -0.033281 
+-0.022767 0.072534 -0.014386 -0.000045 0.045402 -0.006475 
+-0.007092 -0.016345 0.059506 0.003978 -0.010703 0.007508 
+0.002807 -0.011087 0.001486 0.006081 -0.005441 0.002240 
+0.006295 0.000047 -0.000974 0.000470 0.003033 -0.001371 
+-0.002249 0.009850 -0.001358 0.009551 0.024308 -0.002925 
+0.019576 0.030402 -0.004175 0.004445 0.014694 -0.004305 
+0.003345 0.004988 -0.005750 -0.001852 0.001926 -0.007025 
+-0.003158 0.001485 -0.003154 -0.003737 0.001333 -0.000095 
+-0.006646 -0.000586 0.000413 -0.005082 -0.000767 0.002685 
+-0.001037 -0.000074 -0.003111 -0.001440 -0.001129 -0.004075 
+0.002071 0.000724 -0.003772 0.004939 0.004561 -0.003139 
+0.004672 0.010172 -0.003587 0.001207 0.012451 -0.007966 
+0.001119 0.014732 -0.012030 0.006815 0.019806 -0.009156 
+0.007987 0.017502 -0.008381 0.001494 0.016222 -0.010621 
+-0.000372 0.019414 -0.009437 0.002096 0.027767 -0.008900 
+-0.082943 -0.021818 -0.052385 0.006279 -0.002473 -0.018698 
+0.003834 0.001552 -0.006390 0.015813 0.013956 -0.012160 
+0.003598 0.007069 0.004653 -0.042000 -0.033622 -0.005604 
+0.014736 -0.037330 0.007450 0.047899 -0.048571 -0.011975 
+-0.060667 -0.027815 -0.003477 -0.021230 0.008770 0.005191 
+0.014591 0.014727 -0.024409 -0.049375 -0.049375 0.127500 
+0.024899 0.011768 -0.019697 0.038893 0.019557 -0.033368 
+0.069232 0.024205 -0.046907 0.035896 0.027799 -0.017382 
+-0.024743 -0.012213 -0.053874 0.015000 0.010000 -0.053333 
+0.020319 0.015851 0.031631 0.009278 -0.012672 0.020404 
+-0.060000 -0.008402 0.092418 -0.036000 0.012000 0.075385 
+-0.015489 0.004856 -0.003851 0.037029 0.006364 0.029623 
+-0.077333 -0.024083 -0.005833 -0.061622 -0.001556 0.032756 
+-0.029895 -0.020105 -0.029368 -0.010000 -0.001429 0.001429 
+-0.017333 -0.072667 0.055333 0.021923 -0.087000 0.014615 
+0.068917 -0.031958 0.033958 0.020000 -0.015000 0.010000 
+-0.102857 0.042286 -0.031714 -0.021117 0.021393 -0.024990 
+0.004657 -0.009864 -0.018034 -0.010000 -0.012581 -0.022581 
+0.015290 0.015250 -0.007005 0.021640 0.018706 -0.010921 
+-0.003994 0.002532 -0.003298 -0.004461 -0.000999 -0.006567 
+-0.002279 -0.003735 -0.001798 -0.014058 -0.012202 0.003322 
+-0.043771 -0.016826 0.028520 -0.027667 0.085139 0.136546 
+0.000072 -0.000005 0.000002 -0.120767 -0.074845 0.075349 
+-0.071626 -0.020559 0.017009 0.010625 0.052448 -0.011454 
+0.052622 0.041770 -0.012002 -0.009556 0.010161 0.019218 
+0.018755 -0.000459 0.002325 0.018081 0.005370 -0.017180 
+0.010008 0.014433 -0.013960 -0.013105 0.003784 -0.005722 
+-0.011660 0.006875 -0.002970 0.004398 0.006810 0.001364 
+0.019672 0.009486 -0.004764 0.008571 0.008571 -0.002143 
+-0.000980 0.003341 -0.004203 0.000967 0.005597 -0.009492 
+-0.002161 0.002739 -0.009176 -0.000425 -0.001970 -0.001013 
+-0.006213 -0.001719 0.004349 -0.006566 -0.001851 0.006335 
+0.000182 -0.000221 -0.001003 -0.002612 0.001647 -0.007611 
+0.000000 0.000000 -0.006438 -0.000812 0.000141 -0.002321 
+-0.000664 0.001334 -0.002325 -0.000778 0.008961 -0.007639 
+0.004197 0.021334 -0.016094 0.021676 0.022562 -0.010173 
+0.018092 0.015797 -0.008412 0.007328 0.019640 -0.007917 
+0.003229 0.019068 -0.003288 0.002902 0.009769 0.003636 
+-0.021628 -0.091961 -0.007153 0.001201 -0.009080 -0.001131 
+-0.000643 0.000311 0.001338 0.002488 0.002017 -0.001169 
+0.010374 0.008891 -0.004441 0.065385 0.003503 -0.000438 
+0.059060 -0.000075 -0.058797 0.044120 -0.038915 0.037874 
+-0.036667 0.026667 0.016667 -0.017720 0.053460 -0.017900 
+-0.081259 0.100481 0.012407 -0.043971 0.085000 0.175882 
+0.006000 0.000000 -0.008000 0.051071 0.126607 -0.051786 
+0.073887 0.070738 -0.023810 0.032058 -0.017833 -0.008158 
+0.039784 0.023160 0.048593 0.044514 -0.017806 0.017273 
+-0.003571 -0.009562 -0.007355 -0.016379 -0.018744 0.004400 
+-0.069609 -0.092428 0.067325 -0.077895 -0.018120 -0.021729 
+0.028750 0.028750 0.035000 0.084000 0.042000 0.073333 
+0.006190 -0.037619 -0.028095 -0.025000 -0.081667 0.012500 
+-0.014541 -0.074396 0.012947 0.029554 -0.045268 0.066964 
+0.015000 -0.012010 0.007206 0.024167 0.049167 -0.000417 
+0.057500 0.043125 -0.043125 -0.025211 0.039925 -0.040768 
+-0.020498 0.014048 -0.070946 0.000596 -0.015734 -0.023982 
+0.004341 -0.010544 -0.015511 -0.011939 -0.007485 -0.007892 
+-0.001913 0.007742 -0.013609 -0.026100 0.006100 -0.009016 
+-0.005449 0.017547 -0.013636 -0.002896 0.012464 -0.009697 
+-0.003836 0.003006 0.000040 -0.008378 -0.003236 -0.000889 
+-0.012327 -0.002842 -0.001467 -0.004457 -0.000819 0.000626 
+0.004723 -0.001245 0.001889 0.000059 -0.003389 0.003431 
+-0.003708 -0.002095 0.000420 0.014120 0.054629 -0.014743 
+0.113120 0.142155 -0.002401 0.072278 0.036684 0.001440 
+0.016582 0.007737 0.003956 0.002481 -0.003474 -0.004424 
+0.008917 0.008242 -0.016340 -0.001345 0.013577 -0.014048 
+-0.004270 0.007103 -0.008141 0.007460 0.004388 -0.004982 
+0.005905 0.000276 -0.001956 -0.012624 0.003235 0.008416 
+0.003383 0.003894 -0.004235 0.001551 0.001452 -0.003905 
+0.000166 -0.000128 0.000656 0.001008 0.000987 0.003007 
+0.001192 0.000702 0.003366 -0.003445 -0.001261 0.002000 
+-0.003778 -0.006222 0.000667 -0.006154 -0.004103 -0.006014 
+-0.001406 0.003498 -0.005241 -0.000395 0.003270 -0.004590 
+-0.000349 0.001492 -0.003393 -0.000891 0.002450 -0.004882 
+0.005065 0.010131 -0.007014 0.012586 0.012701 -0.007895 
+0.007198 0.009507 -0.003796 0.000643 0.002362 -0.002476 
+-0.002438 -0.002661 -0.005096 -0.008742 -0.007946 -0.011749 
+-0.009048 -0.031190 -0.008333 0.000578 0.005604 -0.002345 
+0.000020 0.003707 -0.004764 0.005536 0.007508 -0.001414 
+0.002436 0.006143 -0.000871 -0.003195 0.019983 -0.025084 
+-0.004679 0.003067 0.004705 -0.019882 0.015495 -0.057311 
+-0.005362 0.019026 -0.013011 -0.048647 0.009667 -0.055898 
+-0.004242 0.057980 -0.080606 -0.138214 -0.072679 0.070893 
+-0.045446 0.034911 0.029643 0.028889 -0.000030 0.000180 
+-0.009375 -0.003125 -0.016250 0.027947 0.057627 -0.086267 
+-0.030338 0.086053 -0.019398 0.000535 -0.046364 0.002139 
+-0.010944 -0.038947 -0.004975 0.061782 -0.027856 -0.037418 
+0.035422 0.007845 -0.019384 0.054079 -0.015263 0.002763 
+-0.004000 0.004000 0.130000 -0.141995 -0.068367 0.093787 
+0.046211 -0.081491 0.048447 -0.107930 -0.034456 -0.100456 
+-0.080000 -0.053333 0.046667 -0.098765 -0.049383 0.098765 
+0.030000 -0.032571 -0.016286 0.008889 -0.031111 -0.013333 
+0.009717 -0.005797 0.000781 -0.005258 -0.001379 0.002992 
+-0.009622 -0.010733 0.010776 0.001739 -0.018333 0.011303 
+-0.010164 -0.011074 -0.005563 -0.010950 -0.004094 -0.016792 
+-0.032119 0.025357 -0.007500 -0.014270 0.010266 -0.013730 
+-0.002473 0.006058 -0.013105 0.003273 0.006797 -0.007660 
+0.000842 0.001219 -0.002794 0.000967 -0.000762 -0.000460 
+0.000907 -0.000810 0.000538 0.001881 -0.000625 0.000757 
+0.004415 0.001291 0.000411 0.005657 0.004653 -0.000735 
+0.005358 0.009332 -0.004053 0.007711 0.012983 -0.005318 
+0.019554 0.022793 -0.004637 0.015712 0.013133 0.002319 
+-0.258649 -0.315000 -0.028216 -0.046632 -0.087053 0.013472 
+0.030516 0.023044 -0.014122 0.031112 0.029032 0.003502 
+0.006595 -0.008971 -0.017982 -0.009236 -0.000778 -0.005485 
+-0.018493 -0.006148 0.003110 -0.004209 -0.003882 -0.001960 
+0.003680 0.002357 -0.002254 0.002978 0.003521 -0.003089 
+0.000589 0.001986 0.000529 -0.002750 0.000543 0.000919 
+0.001617 0.000285 -0.000073 0.003100 0.004009 -0.002121 
+0.002114 0.001948 -0.005224 -0.001355 0.000504 -0.000788 
+-0.002568 0.000609 0.001233 -0.000163 0.001087 0.001023 
+-0.000455 0.001029 -0.001713 -0.001080 0.001995 -0.003093 
+0.001121 0.005351 -0.008069 0.009376 0.007629 -0.009123 
+0.008498 0.005869 -0.003642 -0.000266 -0.000390 -0.008333 
+-0.006673 -0.004342 -0.009222 -0.011262 0.000003 -0.022140 
+-0.196012 -0.107572 -0.155405 -0.011058 -0.001660 -0.016403 
+0.000441 0.003862 -0.019881 0.004487 -0.005730 -0.013872 
+0.001437 -0.004898 -0.010569 0.014743 -0.032873 0.054494 
+-0.057992 -0.008250 0.086744 -0.006267 -0.001333 0.025467 
+-0.002571 0.008286 -0.017857 -0.013960 -0.010313 -0.043704 
+-0.012843 -0.049118 -0.040784 -0.027778 -0.040278 0.015278 
+-0.016528 -0.134653 -0.000486 0.011328 -0.096579 0.022257 
+-0.007318 -0.145073 0.028173 -0.059630 -0.062593 0.002963 
+-0.047245 -0.056280 -0.086434 -0.035476 0.034524 -0.000571 
+0.013035 0.005542 -0.004192 0.045397 0.029067 -0.088638 
+-0.010808 -0.019269 0.012923 -0.046167 -0.051167 0.048667 
+-0.024921 -0.001429 0.077619 -0.090171 0.064456 0.066269 
+0.052468 0.053944 0.047786 -0.029902 0.036011 -0.001447 
+0.012739 0.033130 -0.000957 -0.012500 -0.004500 0.007000 
+0.044286 -0.062857 -0.018571 0.006575 -0.065571 0.004353 
+-0.014280 -0.003069 0.009275 -0.004039 -0.005194 0.001250 
+-0.014808 -0.033500 -0.002962 -0.026707 -0.021491 0.016483 
+-0.015141 -0.018050 0.001026 -0.006335 -0.012333 -0.005015 
+-0.002895 0.071038 0.021887 0.001319 -0.004602 0.018166 
+0.004502 -0.012191 0.003631 0.000006 -0.003848 0.003258 
+0.000015 0.000184 -0.000147 0.000688 0.002389 -0.001629 
+0.003522 0.003534 -0.001834 0.005810 0.002241 0.002190 
+0.002969 0.000092 0.002678 -0.001008 -0.002478 0.001161 
+-0.002050 -0.000918 0.000272 0.003003 0.003927 -0.002608 
+0.004110 0.006901 -0.004263 -0.006991 -0.003051 -0.001228 
+-0.017539 -0.013932 0.012395 0.003001 -0.007948 0.007058 
+0.020000 0.016497 -0.009427 0.018446 0.042531 -0.015383 
+0.001972 0.028716 -0.015350 -0.020803 -0.030376 0.019835 
+-0.060615 -0.033948 0.008105 -0.034546 0.016435 0.010763 
+0.001112 -0.001155 0.000175 0.000471 0.002365 0.001606 
+-0.000233 0.000639 0.000871 0.002536 -0.000981 -0.000220 
+0.001503 -0.002023 0.002581 0.000158 -0.001027 0.002070 
+0.000145 0.000218 -0.000437 -0.000699 -0.000572 -0.001713 
+-0.001787 -0.002021 -0.001845 -0.002386 -0.001092 -0.003601 
+-0.002792 0.001238 -0.005523 -0.003614 0.001733 -0.006129 
+-0.001533 0.003518 -0.005834 -0.001033 0.008157 -0.001873 
+-0.000381 0.012857 -0.001776 0.007334 0.009185 -0.006100 
+-0.001883 0.007790 -0.013489 -0.008891 -0.003846 -0.013677 
+-0.063957 -0.056262 -0.003377 -0.040827 -0.037893 0.026685 
+-0.005848 0.009427 -0.024482 0.023012 0.001045 -0.049327 
+0.042220 0.012678 -0.108983 -0.016742 -0.116069 -0.027012 
+0.029800 -0.045148 -0.014003 0.003913 -0.025948 0.019461 
+-0.009291 0.010831 -0.019380 -0.032454 0.036923 -0.089248 
+0.025145 -0.028836 0.070545 0.054286 0.081429 0.061429 
+0.000000 0.038571 0.105714 -0.047104 0.027541 0.076639 
+0.003885 -0.015038 -0.000846 0.002493 -0.013713 0.011843 
+0.023626 -0.041824 0.007341 -0.026000 -0.019857 0.012857 
+-0.032990 -0.014626 0.063737 0.010150 -0.001955 -0.001579 
+0.018750 0.049569 0.019828 -0.101429 -0.011429 -0.011429 
+0.008547 0.010378 0.024622 -0.001995 0.009453 0.082555 
+-0.002623 -0.018850 0.069989 0.051177 -0.003893 0.088446 
+0.068810 0.042056 0.075498 0.034836 0.042434 0.086349 
+0.065686 -0.021667 -0.039412 0.018798 -0.032375 -0.029032 
+0.014301 0.009032 -0.004311 0.005000 -0.001829 -0.001463 
+0.005851 -0.004905 0.003842 -0.038565 -0.062038 0.002450 
+0.002328 -0.053817 0.022684 -0.007568 -0.015412 0.000272 
+-0.014730 -0.043810 0.012317 -0.005891 -0.025748 0.023310 
+-0.000958 -0.007660 0.008402 -0.003357 -0.005042 0.008633 
+-0.004130 -0.005015 0.007156 -0.002557 -0.003860 0.001750 
+0.002101 0.000327 0.000261 0.000859 0.000640 0.000893 
+-0.004459 -0.001170 0.000245 -0.004611 -0.003136 0.003785 
+-0.001598 -0.000591 0.001109 0.000618 0.002007 -0.002803 
+0.001404 0.004156 -0.005297 -0.000471 0.003309 -0.005403 
+-0.002098 0.000131 -0.001112 -0.000679 -0.001461 0.001988 
+0.002817 0.002064 -0.002354 0.003869 0.007400 -0.010482 
+0.001147 0.006607 -0.011726 -0.001706 0.000535 -0.001596 
+-0.023738 -0.021095 0.018456 -0.055473 -0.027289 0.016091 
+-0.004144 -0.005785 -0.002979 -0.002299 -0.003636 -0.000612 
+0.001432 0.003916 0.000458 -0.001142 0.007261 0.004161 
+0.001996 0.000400 0.000802 0.001681 0.002941 -0.001933 
+0.000023 0.000520 -0.001244 0.000444 -0.001655 -0.002059 
+0.000625 -0.000118 -0.002954 0.000360 -0.000532 -0.001768 
+-0.001060 -0.003932 0.000369 0.000171 -0.005184 0.003152 
+-0.001482 0.000850 0.005100 -0.005965 0.006629 -0.000400 
+0.002162 0.017875 -0.000180 -0.000122 0.001370 0.002054 
+-0.001090 0.002407 -0.007117 -0.004705 -0.005129 -0.006086 
+-0.008605 -0.013771 -0.008288 -0.004697 -0.013788 -0.023788 
+-0.000229 0.009114 -0.005286 0.057166 0.051918 -0.010371 
+0.053964 0.009120 0.040567 0.000689 -0.040080 -0.063027 
+-0.012807 -0.050877 -0.037719 -0.007133 -0.069427 -0.046774 
+-0.025188 -0.001193 -0.023774 -0.103587 0.017321 -0.025644 
+0.000000 -0.004615 0.068462 -0.041923 -0.009942 0.074981 
+0.066250 0.080625 0.080625 0.078536 -0.017679 0.055643 
+-0.002593 0.007704 0.028370 0.012206 -0.008522 0.017733 
+-0.020714 -0.059582 0.006620 -0.079538 0.001385 0.031538 
+-0.069104 0.006368 0.028491 0.031429 0.012429 0.004143 
+-0.029706 0.014044 -0.010441 0.052308 -0.088547 0.056410 
+0.000000 0.023333 0.023333 0.006166 0.021765 0.015416 
+0.015837 0.023756 0.008235 0.002526 0.031254 0.023206 
+0.025232 0.028370 0.030755 0.048537 0.024282 -0.009734 
+0.104420 0.015800 -0.013394 0.046154 -0.051429 -0.069231 
+-0.001815 -0.009481 0.006259 0.000336 0.001345 -0.000714 
+0.066333 0.037024 -0.052452 -0.003024 0.022680 -0.015625 
+-0.012215 -0.023718 0.020017 -0.029754 -0.018374 -0.005005 
+-0.019963 -0.014129 0.001137 0.005126 -0.019762 0.010427 
+-0.000435 -0.008772 0.009310 -0.001882 -0.004288 0.006878 
+-0.001469 -0.004128 0.003510 -0.000225 -0.003176 -0.000680 
+-0.003877 -0.002629 -0.001161 -0.001579 0.000322 0.000305 
+0.002227 0.001304 -0.000540 0.004007 -0.001066 -0.002114 
+-0.000252 -0.002784 -0.003193 -0.003094 -0.008644 -0.000526 
+-0.007844 -0.002437 -0.000572 -0.005636 0.000281 -0.006397 
+-0.002391 0.001692 -0.007335 -0.003179 0.000723 -0.002766 
+-0.004683 -0.000462 0.001587 -0.001957 0.000109 -0.000144 
+0.003846 0.002362 -0.005728 0.007458 0.005309 -0.008831 
+0.007095 0.006191 -0.007765 0.005490 0.004296 -0.005463 
+-0.007702 -0.007449 0.000104 -0.002399 -0.005693 -0.000084 
+0.001482 0.000964 0.001493 0.002455 0.008255 -0.000333 
+-0.000748 0.008343 -0.004565 -0.001101 0.004488 -0.002623 
+-0.000148 -0.000171 -0.001975 0.001725 -0.001368 -0.001566 
+0.001443 -0.000172 -0.002600 0.002128 -0.000396 -0.000079 
+0.000300 -0.006066 0.003569 -0.000524 -0.008176 0.004437 
+-0.000645 0.002049 0.000234 0.006912 0.022679 -0.006192 
+-0.008698 0.012992 0.003884 -0.002283 -0.000136 -0.003416 
+-0.001181 -0.001162 -0.003131 0.000091 0.001053 -0.000593 
+0.000441 0.006586 0.000279 0.006179 0.011625 0.007162 
+0.015262 0.014177 0.028859 0.090977 0.020525 0.010156 
+0.007727 -0.075939 0.019152 0.014890 -0.048745 -0.003819 
+0.005113 -0.044812 0.014511 0.025054 -0.034964 -0.020933 
+0.043582 -0.073387 -0.004641 -0.155933 -0.111157 0.103433 
+-0.011008 -0.110774 0.057338 -0.030151 -0.013682 -0.008488 
+-0.025431 -0.006682 0.025171 0.074328 -0.039580 0.127101 
+-0.028674 -0.056174 0.060606 -0.014118 -0.008333 0.056471 
+-0.026132 -0.067027 0.036780 -0.038848 0.028244 -0.006177 
+-0.037584 -0.015117 -0.001635 0.044828 -0.029798 -0.036202 
+0.030000 0.027680 0.020760 0.030714 0.052429 0.095857 
+0.099485 0.151765 0.034853 0.047609 0.041571 -0.029959 
+-0.014375 0.025625 -0.025625 0.008737 -0.010101 -0.011263 
+0.027704 -0.029308 -0.048994 0.050948 -0.021634 -0.018497 
+0.019708 0.018858 -0.010589 0.000000 0.001719 -0.009166 
+-0.026941 0.008186 0.010905 -0.029840 -0.003392 0.010441 
+-0.024383 -0.024557 0.020348 0.005456 -0.010231 -0.015156 
+0.007980 -0.012724 -0.023363 -0.002220 -0.013127 -0.000483 
+0.002624 -0.012858 0.007909 0.002835 -0.009928 0.005947 
+-0.000055 -0.004500 0.004484 -0.000112 -0.001036 0.001844 
+-0.001842 0.002353 0.000526 0.001172 0.002983 0.000021 
+-0.003601 0.003366 -0.003209 -0.004359 -0.001737 0.000817 
+-0.000899 -0.004654 -0.000917 0.004979 -0.003269 -0.001894 
+0.003022 -0.000858 -0.005077 -0.001523 -0.006180 -0.003325 
+-0.004957 -0.008305 -0.001513 -0.003521 -0.003666 -0.000029 
+0.002080 0.004802 -0.003155 -0.000531 0.005892 -0.004406 
+-0.002412 0.003271 0.000051 -0.004036 0.001121 0.001342 
+-0.001323 -0.000995 -0.001252 0.002663 0.002086 -0.003507 
+0.005356 0.002654 -0.000892 0.003800 -0.000285 0.001122 
+0.004409 -0.001338 -0.006321 0.004899 0.000077 -0.001718 
+0.000098 0.003734 0.000513 0.000328 0.002355 -0.003091 
+-0.002516 0.001645 -0.004104 0.001215 -0.000593 -0.005296 
+-0.000081 -0.000611 -0.005448 -0.001439 0.002158 -0.003597 
+-0.002203 0.002515 -0.000378 0.000605 0.000709 -0.001412 
+0.000470 -0.002833 -0.001828 0.000409 -0.002374 -0.001935 
+0.000435 0.008881 -0.002631 0.000513 0.022676 0.006557 
+-0.005234 0.021058 0.000171 -0.002099 0.004357 -0.007836 
+-0.001066 0.001377 -0.005237 -0.000647 -0.003504 0.000185 
+0.001203 -0.006088 0.008848 0.002255 -0.013810 0.010451 
+0.019914 0.002796 0.010582 0.058842 0.028277 0.006238 
+-0.030049 0.051659 0.064317 -0.054290 -0.068369 0.034523 
+0.022217 -0.021860 0.014217 0.048553 -0.021860 -0.020447 
+0.097500 0.038750 -0.058750 0.102256 -0.011362 0.011667 
+0.049924 -0.034247 0.055632 0.011641 -0.056632 0.020112 
+-0.027500 -0.069730 0.041838 -0.015081 -0.020323 0.038548 
+0.001961 -0.010920 0.016053 0.018699 0.035385 0.008311 
+-0.018240 0.024320 0.107000 0.068325 -0.011643 0.015885 
+-0.004202 -0.046826 0.001613 -0.071854 -0.030017 -0.007823 
+0.047677 0.051010 0.027172 0.068509 0.009781 -0.009825 
+0.015758 0.076970 -0.073030 0.014275 -0.011138 -0.006106 
+-0.012284 -0.066117 -0.037254 -0.030778 -0.031444 0.031111 
+-0.020667 -0.034667 -0.004667 0.030323 -0.006941 0.017992 
+0.006937 -0.020813 0.001875 0.008230 -0.008727 0.007447 
+-0.000253 0.007304 0.010829 -0.017743 -0.009957 0.021828 
+-0.011886 -0.091387 0.072102 -0.040267 -0.082655 0.049310 
+0.009310 -0.017696 -0.003552 0.001217 -0.009487 0.022171 
+-0.000079 -0.008077 0.007510 0.004095 0.004417 -0.007015 
+0.001154 0.005677 -0.006642 -0.002094 0.000513 -0.002436 
+-0.006052 -0.001025 0.001246 -0.005573 -0.001463 -0.000481 
+-0.001187 0.000108 -0.003989 -0.004108 -0.003875 -0.001402 
+-0.000988 -0.007944 0.001202 0.000841 -0.004878 0.002355 
+0.002299 0.000123 -0.002552 0.002788 0.003919 -0.004634 
+0.000133 -0.000827 -0.000773 0.001689 -0.001408 -0.001551 
+0.003573 -0.001114 -0.000281 0.000621 0.000240 -0.000601 
+-0.001872 -0.000507 -0.001654 -0.003708 -0.001322 -0.001017 
+-0.003920 -0.000693 0.001291 0.000477 -0.001119 0.003015 
+0.002833 -0.002595 0.000652 -0.000652 -0.001435 -0.000762 
+0.005360 0.006288 -0.007030 0.003275 0.002293 -0.006160 
+0.001529 -0.000242 -0.000926 -0.003477 0.003834 -0.003783 
+-0.001668 0.000946 -0.006034 0.000655 -0.001985 -0.002872 
+0.000710 0.008032 -0.002361 0.001870 0.008133 -0.005235 
+0.000967 0.003750 -0.003509 -0.000551 0.000918 -0.000709 
+0.000438 -0.003130 -0.001126 -0.000565 -0.000094 -0.003329 
+-0.001082 0.013872 -0.005786 -0.003000 0.026250 0.003750 
+-0.002339 0.022839 0.000232 -0.004241 0.009788 -0.001799 
+-0.001209 0.003430 -0.003410 -0.002851 -0.003203 -0.002571 
+-0.008405 -0.012895 0.000997 -0.016565 -0.014274 0.001120 
+-0.008516 -0.000597 -0.003265 -0.005180 0.008723 -0.009835 
+0.006258 0.041752 -0.017186 -0.016171 -0.045714 -0.036657 
+0.020984 -0.008689 0.004699 0.060952 -0.027619 0.033333 
+0.017968 -0.009305 0.005775 0.037335 -0.000369 -0.015894 
+-0.070374 0.006117 0.045457 -0.138023 -0.016667 0.011502 
+-0.008947 -0.083684 0.018947 0.009656 0.018337 0.031890 
+0.001594 0.005991 0.017368 0.000859 0.012525 0.053535 
+0.005614 -0.008713 -0.010936 0.051059 -0.060941 -0.001412 
+-0.010328 0.003000 -0.008607 -0.072000 -0.011333 -0.018000 
+-0.042675 -0.010700 -0.009497 -0.009167 -0.012917 0.044167 
+-0.015855 -0.038010 0.009452 0.021881 0.021158 -0.037980 
+0.009856 0.020186 -0.077144 -0.021068 0.007865 -0.008006 
+-0.028906 -0.009555 0.002150 0.003686 -0.005160 0.001474 
+0.002605 -0.003085 0.016695 0.018357 0.003007 0.009336 
+0.044146 -0.019889 -0.002730 0.017002 0.013877 -0.008055 
+-0.018052 0.009570 -0.011201 0.005859 0.009483 -0.016870 
+0.000660 -0.009880 0.010030 -0.006036 -0.012481 0.012478 
+0.000518 0.001400 -0.001331 -0.001671 0.006614 -0.004910 
+-0.005605 0.004312 -0.003738 -0.004607 0.003296 -0.000895 
+-0.003141 0.001633 -0.002564 0.000419 0.000664 -0.004338 
+0.001782 -0.000060 -0.002798 0.002629 -0.003073 0.000785 
+-0.000840 -0.004167 0.004554 -0.000548 -0.004176 0.006279 
+-0.003401 -0.001542 0.004146 -0.002938 0.001411 0.000372 
+-0.000986 0.003443 -0.001408 -0.000038 0.002771 -0.001077 
+0.002391 -0.000948 -0.002154 0.000327 0.000199 0.000213 
+0.000169 0.003361 -0.003640 0.001963 0.001307 -0.007183 
+-0.001925 -0.001359 -0.005073 -0.001431 -0.001717 -0.003120 
+0.000543 -0.001008 -0.000956 0.001987 0.001917 0.001292 
+-0.004831 -0.000254 -0.002288 -0.003147 -0.000772 -0.004978 
+-0.001443 -0.002557 -0.004219 -0.000543 0.000543 0.000388 
+-0.004031 0.001008 0.001008 -0.000018 0.005601 0.000792 
+0.001645 0.009621 0.000898 -0.001190 0.007333 -0.001428 
+0.001873 0.001590 -0.002403 0.000567 -0.003146 0.000315 
+0.000581 -0.003056 0.000942 -0.001437 0.003633 -0.003768 
+-0.006329 0.014346 -0.010864 -0.003621 0.026945 -0.009253 
+-0.006755 0.020296 -0.003842 -0.007035 0.009315 0.000663 
+-0.000537 0.004169 -0.003247 -0.000547 0.005998 -0.003862 
+0.000618 0.007317 -0.004826 -0.000707 0.003990 -0.004631 
+-0.008481 -0.005327 -0.001260 -0.022126 -0.033876 0.003526 
+-0.039216 -0.090745 0.023843 0.027908 0.001774 0.011653 
+0.062157 0.051355 -0.022298 0.038570 0.026982 -0.031948 
+-0.013290 0.013203 -0.019957 -0.001305 0.005308 0.001423 
+0.010697 0.015675 0.004728 0.010929 0.013494 0.004454 
+0.002921 0.002957 -0.007921 0.116701 -0.089864 -0.026973 
+0.013689 -0.001778 0.015289 -0.189405 -0.134000 0.031568 
+-0.023843 0.016481 -0.102731 0.016058 -0.005839 -0.042000 
+0.018779 -0.010248 -0.008556 0.037249 0.038881 0.017228 
+-0.015333 -0.005290 -0.000481 -0.004586 -0.039737 0.025677 
+0.014432 -0.101685 0.079707 0.015699 -0.009060 0.045846 
+0.001764 0.009311 0.021055 -0.014252 0.003427 0.010352 
+-0.035695 -0.011986 0.018499 -0.031729 0.000521 -0.017167 
+-0.022048 0.004900 -0.008235 0.000583 0.001166 0.004373 
+0.006501 -0.032920 -0.052590 0.004549 0.017170 -0.023962 
+-0.002541 0.016409 -0.017775 0.002107 -0.016696 0.007821 
+-0.010171 -0.022983 -0.001975 0.001603 -0.006461 -0.000286 
+0.000299 0.002289 -0.001739 -0.001528 0.002832 0.000131 
+-0.001964 0.003795 0.000134 -0.002747 0.004393 0.000795 
+-0.001528 0.004721 0.000850 -0.000332 0.001876 0.001702 
+0.000150 -0.000060 -0.000279 0.002183 -0.000282 -0.001067 
+-0.000348 -0.004048 0.000727 -0.002731 0.000430 0.001631 
+-0.001862 0.002622 -0.002260 0.001939 0.002855 -0.005023 
+0.005339 0.005102 -0.002848 0.003706 0.006383 -0.000176 
+0.001621 0.004517 -0.000049 -0.003363 0.000240 -0.001922 
+0.000172 0.001618 0.000018 0.003810 0.004039 -0.001886 
+0.004015 0.008547 -0.000716 0.001351 0.010267 -0.002355 
+0.002174 0.007728 -0.001497 0.004931 0.003369 -0.000909 
+-0.002619 0.001245 0.000830 -0.005759 0.001478 -0.000824 
+-0.007591 0.001019 -0.002082 -0.006923 0.000077 0.000231 
+-0.001642 -0.000365 -0.000465 0.002344 0.000000 -0.003437 
+0.005017 0.004181 -0.004729 0.002995 0.002911 -0.003192 
+0.002086 0.001511 -0.002518 -0.001247 0.000468 -0.002026 
+-0.000866 -0.001716 -0.003350 -0.001006 0.001731 -0.004564 
+-0.003064 0.015823 -0.006638 -0.002218 0.029575 -0.008430 
+-0.002872 0.026603 -0.008451 -0.001506 0.013558 -0.003866 
+0.000219 0.003000 -0.000389 -0.001770 0.000364 -0.002439 
+-0.002751 0.007184 -0.005668 0.000128 0.007879 -0.007738 
+-0.004013 -0.004882 0.000655 -0.011153 -0.026802 0.013534 
+-0.017812 -0.035753 0.036778 0.023159 0.014406 0.019605 
+0.023136 -0.013136 0.032241 -0.055860 -0.006867 -0.005444 
+-0.056130 -0.022987 0.043969 0.004782 0.011442 -0.009526 
+0.021691 0.027803 0.002911 0.041626 -0.006910 0.000012 
+0.021157 0.053445 -0.043142 0.021145 -0.023410 0.009524 
+-0.043035 -0.039641 0.011200 -0.042065 -0.035942 0.057862 
+-0.021118 -0.013118 -0.022824 0.000000 0.021250 -0.019375 
+0.041529 0.023437 -0.013226 0.041340 0.048538 -0.029068 
+0.112306 0.047937 -0.043631 0.126154 0.081081 0.024948 
+-0.006819 0.019250 0.006750 0.000670 0.004438 0.014239 
+-0.002372 -0.006933 0.007636 0.003892 -0.027583 0.026839 
+0.011921 -0.008916 -0.010468 -0.065934 -0.043956 -0.061429 
+-0.053735 0.023156 -0.019555 -0.000124 0.007237 -0.010018 
+0.008263 0.025175 -0.011159 0.000977 0.002843 0.000293 
+-0.005042 -0.010592 -0.002602 0.016278 -0.020374 0.009347 
+0.007616 -0.009898 0.001013 -0.002334 -0.003348 0.007145 
+-0.000470 -0.004129 0.003907 -0.000599 0.001677 -0.002897 
+0.002054 0.004797 -0.007423 0.000978 0.004733 -0.003145 
+0.001305 0.002975 0.003319 0.001090 0.000501 0.002239 
+0.001141 0.001291 -0.000150 -0.000114 0.000604 -0.001169 
+-0.002132 0.000453 0.002304 -0.002493 -0.001084 0.003035 
+0.000983 -0.000462 -0.000457 0.005153 0.002301 -0.002777 
+-0.000772 0.002320 -0.000577 -0.001485 0.002770 -0.000279 
+-0.001778 0.003349 -0.000941 -0.006197 -0.000717 0.001133 
+-0.004632 -0.001787 0.002139 -0.001298 -0.000908 0.000265 
+0.000810 -0.000642 -0.000373 -0.001860 -0.000386 -0.000395 
+-0.005062 0.000500 -0.002978 -0.003274 -0.002212 -0.003363 
+0.003244 0.001917 -0.004165 -0.000654 0.000659 -0.000842 
+-0.000062 -0.001640 -0.002104 0.001141 -0.001259 -0.002713 
+0.007692 0.004016 -0.005989 0.001176 0.008456 -0.001876 
+0.003885 0.005633 0.002234 0.001456 0.006624 0.000752 
+0.000489 0.007333 -0.001467 -0.001675 0.004000 -0.000628 
+-0.001012 -0.000696 -0.001887 -0.001185 0.001541 -0.001966 
+-0.004407 0.018730 -0.007538 -0.015323 0.035637 -0.013697 
+-0.004514 0.033451 -0.015191 0.010135 0.014399 -0.009072 
+-0.001798 -0.000117 -0.004822 -0.000477 -0.003842 -0.004986 
+-0.004223 -0.002108 -0.006511 -0.004919 0.002485 -0.003922 
+-0.006432 -0.002325 -0.002173 -0.004469 -0.004967 0.000393 
+0.003133 0.003100 0.002385 0.000875 0.002712 0.011744 
+0.000542 0.003344 0.018498 0.031561 0.017406 -0.011137 
+-0.012286 0.001143 0.011429 0.004615 0.039487 -0.000684 
+-0.014095 -0.007261 0.026822 -0.022222 -0.018500 -0.006167 
+0.005177 -0.005849 0.018025 -0.027776 -0.028522 0.038776 
+-0.025504 -0.058903 0.072636 0.000945 -0.049573 0.066202 
+-0.046530 -0.036487 0.021624 0.031414 -0.002980 -0.035586 
+0.036714 0.006080 -0.016915 0.030261 0.010000 -0.003362 
+0.011049 0.013993 0.003682 -0.009288 0.022049 0.006474 
+0.012032 0.034737 0.001415 0.023109 0.017700 -0.019800 
+-0.000993 -0.005242 0.001832 -0.014228 -0.019897 0.004752 
+0.091518 -0.061838 0.111934 -0.005593 -0.011571 0.061434 
+-0.010438 -0.003260 0.023772 -0.000628 -0.000291 0.001078 
+0.002406 0.002509 -0.009239 0.003547 -0.001476 0.003773 
+0.016943 -0.012725 0.004979 0.015256 -0.001159 -0.011826 
+0.004685 -0.001322 -0.002263 -0.002163 -0.008355 0.010209 
+-0.004851 -0.009709 0.008943 -0.000599 -0.004299 0.003930 
+0.003625 -0.000422 0.000269 0.002634 0.002174 0.000951 
+0.000024 0.005334 -0.002915 0.000965 0.006458 -0.006480 
+0.000904 0.004690 -0.005425 -0.001069 0.003426 -0.003344 
+-0.002233 0.001646 -0.002410 0.000412 0.000948 -0.000041 
+0.001414 -0.000189 -0.001017 0.001634 -0.002616 -0.002589 
+-0.001202 -0.003345 -0.004693 -0.002112 -0.000348 -0.002641 
+0.003145 -0.001225 -0.000742 -0.000778 -0.002482 0.000544 
+0.000144 -0.001775 0.000492 -0.000450 0.001188 -0.000903 
+-0.001522 0.002176 -0.001539 -0.002252 -0.000432 -0.000216 
+-0.003304 0.000621 0.000887 -0.002187 0.000876 -0.000187 
+-0.002173 -0.001072 0.000594 0.000308 -0.001009 -0.001483 
+0.000552 -0.000915 -0.002026 0.001195 -0.000152 -0.001391 
+-0.000095 -0.000645 -0.000061 0.000967 -0.003613 0.000110 
+0.004790 -0.002389 0.000002 0.000345 0.003202 -0.003673 
+-0.002357 0.005548 -0.001043 -0.001618 -0.000034 -0.001506 
+0.001750 -0.003922 0.001486 0.000544 0.000236 0.000914 
+-0.010299 0.020287 -0.005167 -0.008976 0.034876 -0.014914 
+-0.000021 0.024372 -0.012104 -0.003982 -0.000679 -0.000556 
+-0.004242 -0.000848 -0.009503 -0.002740 0.001010 -0.010344 
+-0.002356 0.002573 -0.009347 -0.005517 0.003162 -0.004777 
+-0.008394 -0.000078 -0.004030 -0.006887 0.002033 -0.006979 
+-0.001863 0.008247 -0.007593 -0.000270 0.001214 -0.004502 
+-0.001675 -0.018418 -0.011239 0.030263 0.018135 -0.020606 
+0.032504 0.002495 -0.046445 0.000625 0.006020 -0.012792 
+0.006229 -0.029636 0.021509 0.018118 -0.020588 0.058471 
+0.023100 -0.015799 -0.000472 -0.004300 -0.015048 -0.008599 
+-0.004475 0.010549 0.014163 -0.026237 -0.003936 0.038792 
+-0.010953 -0.014589 0.011381 0.028783 -0.107725 -0.041323 
+0.067559 0.046006 -0.080419 0.016307 0.029557 -0.012814 
+-0.018529 0.006014 -0.003313 -0.016538 0.000016 0.005904 
+0.015477 -0.006523 -0.004133 0.031538 -0.084923 0.070923 
+0.008115 -0.000661 0.012563 -0.006450 0.006987 -0.012628 
+-0.010208 -0.005854 0.050854 -0.004180 -0.008976 0.046456 
+-0.005818 -0.009010 0.039419 -1.046980 -1.416107 4.107383 
+-1.294872 -1.448718 4.448718 -0.014529 -0.007882 0.041045 
+-0.006918 -0.007519 0.026541 0.005159 -0.005482 0.007262 
+0.004770 -0.004291 0.000125 -0.000920 -0.001711 -0.001492 
+-0.001198 -0.004106 0.003981 0.002157 -0.006325 0.002664 
+0.002602 -0.009189 0.002353 0.002912 -0.008119 0.001827 
+0.000730 -0.004205 -0.000322 -0.002397 -0.000268 -0.002314 
+-0.001091 -0.002337 -0.001239 -0.001363 -0.002268 0.000685 
+-0.000191 -0.001122 -0.003174 0.001021 0.001413 -0.007617 
+0.000786 -0.001720 -0.007101 -0.001596 -0.004168 -0.005453 
+0.000315 0.003645 -0.001832 -0.004298 0.004256 -0.006157 
+-0.000907 0.000069 -0.000614 0.002622 -0.006156 -0.003249 
+0.001241 -0.006500 -0.002172 0.001568 0.000555 -0.003199 
+0.004083 0.003328 -0.002274 0.002655 0.006505 0.002249 
+0.000110 0.003012 0.002352 -0.000171 0.000291 0.000190 
+-0.005850 -0.002495 0.002510 0.000772 0.001636 -0.000910 
+0.002831 0.006344 -0.005501 0.001509 0.005614 -0.004074 
+0.000238 0.001338 0.000877 0.000513 -0.004986 0.000571 
+0.001290 -0.004533 0.001813 -0.002145 -0.003049 -0.006253 
+0.001341 -0.000971 -0.002044 -0.002198 -0.002750 -0.002199 
+0.002694 -0.006937 0.002988 0.002261 -0.005213 0.005137 
+-0.004788 0.000019 -0.004850 -0.014302 0.020834 -0.007378 
+0.000578 0.014955 -0.012449 -0.001044 -0.000392 -0.007830 
+0.001517 -0.000595 -0.003971 0.001231 -0.000790 -0.005656 
+-0.002861 -0.000889 -0.005956 -0.005872 -0.001061 -0.001694 
+-0.005809 -0.003216 0.001283 -0.003988 -0.000564 -0.004386 
+-0.007181 0.004529 -0.011360 -0.000056 0.005964 -0.023509 
+0.015543 0.010629 -0.030514 -0.012884 0.002371 0.013246 
+0.007000 0.001000 0.017000 0.014748 0.009876 -0.028458 
+0.007875 -0.002832 0.005237 -0.000382 0.012238 0.007264 
+-0.015768 0.019363 -0.001763 -0.010752 0.013683 -0.014906 
+-0.014979 -0.010735 -0.000800 0.004020 -0.015411 0.014286 
+0.027965 -0.002185 -0.077777 0.031322 -0.081983 -0.011983 
+0.030553 0.004885 0.006636 0.031282 0.083590 -0.052564 
+0.035793 0.027208 0.005733 -0.007823 -0.001271 -0.013820 
+-0.035037 0.037509 -0.025147 0.048584 -0.013307 0.046726 
+-0.012415 0.023278 -0.057433 -0.006541 0.012712 -0.002498 
+-0.001005 -0.004205 0.032036 -0.007201 -0.012999 0.038016 
+-1.116022 -1.563536 4.453039 -1.236559 -1.702509 5.362007 
+-1.364780 -1.902516 5.871069 -1.271698 -1.916981 5.626415 
+-0.789157 -1.307229 4.186747 0.003225 0.000011 0.017225 
+0.007245 0.011820 0.003593 0.002618 0.002403 -0.006379 
+0.002278 0.000703 0.000015 -0.001823 -0.005729 -0.005764 
+0.000644 -0.004667 -0.002550 -0.001104 -0.008674 0.000418 
+0.002457 -0.003163 0.002187 0.001165 0.001949 -0.000053 
+0.001029 0.001429 -0.002057 -0.000270 0.000090 0.000499 
+-0.001487 -0.000990 -0.000987 -0.001252 -0.000349 -0.002751 
+0.002890 0.003664 -0.006218 0.000357 0.002254 -0.004324 
+-0.001870 0.002263 -0.000924 -0.001752 -0.001200 -0.004930 
+-0.000378 0.004626 -0.005458 0.009564 0.007562 -0.006005 
+0.008496 0.002975 -0.007434 0.001171 -0.002498 -0.003084 
+-0.001924 0.001239 -0.000449 -0.000286 -0.000026 0.004162 
+-0.002396 -0.003173 0.002370 -0.002241 -0.001394 0.001757 
+0.000169 -0.002328 -0.001858 0.001575 -0.001079 -0.004629 
+0.001942 -0.001254 -0.002812 0.001507 -0.001936 0.000430 
+0.000548 -0.001148 0.002360 -0.000887 0.000995 0.001586 
+-0.004878 0.002478 -0.000225 -0.000742 0.001813 -0.003751 
+-0.000552 -0.001368 -0.000017 0.000374 -0.002202 -0.000766 
+0.000758 -0.001340 0.000188 0.000227 0.003577 0.003302 
+-0.008542 0.011334 0.005855 -0.006348 0.016460 0.000580 
+-0.002177 0.008238 -0.013990 -0.004432 0.008437 -0.004517 
+0.001179 0.003079 0.011526 0.008306 0.005645 0.032396 
+0.986425 0.502262 4.375566 0.947368 0.377990 4.358852 
+0.005903 -0.001960 0.035795 0.000176 -0.010000 0.018187 
+-0.001521 -0.005933 -0.006973 0.005606 0.019759 -0.047419 
+0.061305 0.181981 -0.195671 -0.024955 -0.015635 0.016107 
+-0.005921 0.041667 0.094734 0.004240 -0.004960 -0.010690 
+-0.007669 -0.010017 -0.008765 -0.001631 -0.004620 -0.003997 
+-0.019887 -0.016106 -0.024280 0.011852 -0.012963 -0.016296 
+0.003306 -0.005385 -0.009585 0.006387 -0.019725 -0.007114 
+-0.064953 0.049398 -0.063528 0.006760 -0.137038 0.030828 
+0.038781 -0.154961 0.056335 0.025852 0.055124 -0.032357 
+0.049712 0.049532 -0.012360 -0.011356 -0.005574 -0.004784 
+-0.052002 0.080689 -0.022400 -0.027588 0.054066 -0.036662 
+-0.008255 0.012755 0.005412 0.001473 -0.017765 0.018970 
+-0.000706 -0.015986 0.047713 -0.014765 -0.013173 0.042112 
+-1.477157 -1.487310 5.121828 -1.592335 -1.846690 5.961672 
+-1.527331 -2.170418 6.337621 -1.220974 -2.078652 5.846442 
+-0.714286 -1.188776 4.076530 -0.001307 -0.002475 0.013727 
+0.002449 0.003662 -0.008824 0.005468 0.006427 -0.016731 
+0.005452 0.009259 -0.008796 -0.004431 0.005306 -0.000347 
+-0.004295 -0.000060 0.007258 -0.002968 -0.007738 0.001468 
+-0.000432 -0.001585 -0.000118 0.000905 0.002634 -0.005952 
+0.002729 0.005507 -0.004837 0.001092 0.003256 0.000541 
+-0.002978 -0.001188 -0.002968 0.000020 0.000920 -0.006285 
+0.000107 0.006510 -0.007097 0.001385 0.005862 -0.003304 
+-0.000249 0.000590 0.000023 0.001364 -0.001066 0.000831 
+0.001663 0.001621 -0.001195 0.003024 0.006524 -0.003962 
+-0.000283 0.002140 0.000510 -0.001153 -0.000488 -0.001460 
+-0.001962 0.000500 -0.000049 -0.004133 -0.006199 0.002066 
+-0.001415 -0.000626 0.001954 -0.000843 0.001148 -0.000513 
+-0.004569 0.000548 -0.004192 -0.003054 0.001304 -0.007853 
+0.000558 -0.003303 -0.003518 -0.000049 -0.004600 -0.002328 
+0.001625 -0.002794 0.000172 -0.001983 0.001950 -0.001014 
+-0.000052 0.008655 -0.008500 -0.000202 0.007643 -0.008847 
+0.000143 0.002163 0.000216 -0.001305 -0.002083 -0.001546 
+-0.004428 -0.000966 -0.004424 -0.005085 0.007826 -0.005547 
+-0.001189 0.008519 -0.007410 0.000099 0.001319 -0.007572 
+0.005285 0.004510 -0.020001 -0.004001 0.003454 -0.009947 
+0.009022 0.003759 0.028456 1.533333 0.393651 5.692063 
+1.879607 0.452088 6.653563 2.032086 0.427807 6.467915 
+1.918033 0.295082 5.319672 0.008503 0.000126 0.030566 
+-0.003930 -0.007374 0.008070 -0.009017 -0.013765 0.005027 
+-0.006233 -0.004989 -0.019888 0.000173 0.007457 -0.082889 
+0.002617 0.014117 -0.040160 -0.004068 -0.007620 -0.005180 
+0.006931 -0.014169 -0.014322 0.040745 -0.034451 0.017078 
+0.062222 -0.032222 0.047778 0.035529 -0.013489 0.033361 
+0.004890 -0.010202 0.009210 0.000565 0.018588 -0.014347 
+-0.013365 0.041350 -0.039231 0.020037 -0.032698 0.025071 
+-0.043333 -0.003029 0.001836 -0.036475 0.004406 0.013039 
+-0.005416 -0.002955 0.005253 -0.024211 -0.001333 0.018664 
+-0.006539 0.009114 0.013001 -0.009644 -0.003259 -0.011070 
+-0.028622 -0.010139 0.022970 -0.037972 -0.044852 0.057574 
+-0.007236 -0.019489 0.048091 -1.093750 -1.335938 5.320312 
+-1.381166 -1.565022 5.973094 -1.568345 -1.823741 5.881295 
+-1.641115 -1.822300 5.216028 -1.484962 -1.338346 4.127820 
+-1.072727 -0.627273 2.890909 -0.001439 -0.001259 0.013944 
+0.000047 0.001116 -0.006037 -0.008748 -0.000741 -0.009835 
+0.006551 0.012946 -0.000692 0.008265 0.018059 -0.003061 
+0.007463 0.012785 -0.000683 0.002598 0.002776 -0.002195 
+0.000595 -0.001370 -0.000281 -0.000172 0.000067 0.000724 
+-0.000896 0.000461 0.001004 -0.006646 -0.000001 -0.001108 
+-0.007909 -0.001182 0.000000 0.000691 -0.003644 -0.002572 
+-0.000680 -0.005820 -0.002079 -0.003355 -0.004145 0.000018 
+-0.003577 -0.001532 0.000275 -0.002016 -0.000097 0.000048 
+0.001527 0.001527 -0.001222 -0.000115 0.001775 -0.009841 
+-0.004607 0.003817 -0.002316 0.002243 0.010004 0.001837 
+0.002019 0.006279 -0.000910 -0.002113 -0.000697 0.001496 
+-0.001531 -0.003806 0.000959 0.001740 -0.003078 -0.001445 
+-0.001008 -0.002798 -0.006724 -0.000123 -0.000259 -0.010233 
+0.000126 0.002105 -0.009896 0.002677 -0.000271 -0.005685 
+0.000330 -0.001831 -0.001893 0.002229 0.002217 -0.002276 
+-0.000249 0.000812 -0.005941 0.002432 0.005154 -0.005665 
+-0.002413 -0.000466 -0.000859 -0.003333 -0.001590 -0.002916 
+-0.003202 0.009584 -0.004923 0.009388 0.016208 -0.008625 
+0.002247 0.025344 -0.002456 -0.010357 -0.000614 -0.003529 
+-0.008072 0.014388 -0.033788 -0.002804 0.003499 -0.005144 
+0.935849 0.245283 3.445283 1.701456 0.199029 5.407767 
+2.202899 0.248447 6.283644 2.447552 0.356643 6.568765 
+2.341216 0.527027 5.979730 1.594286 0.737143 3.880000 
+0.005050 0.007040 0.007918 -0.002913 -0.004922 -0.005733 
+-0.018796 -0.027998 -0.009771 -0.015261 -0.012689 -0.027892 
+0.012917 0.000000 -0.024583 0.007736 -0.008627 -0.001426 
+0.028528 -0.004502 0.056568 0.025000 0.016143 0.048429 
+0.042491 -0.018968 0.038547 -0.008417 0.004667 0.007668 
+-0.019915 0.006259 -0.000850 -0.019640 0.011117 -0.008275 
+-0.012914 0.004079 -0.001586 -0.004462 0.009003 -0.009152 
+0.010879 0.007719 -0.010390 0.011086 -0.000554 -0.024091 
+-0.000003 0.015577 -0.036329 0.002771 0.019030 -0.024253 
+0.003432 0.003165 -0.001612 -0.010680 -0.014867 0.005184 
+-0.010198 -0.015937 0.014249 0.008788 -0.045252 0.015325 
+-0.000615 -0.004612 0.026735 -0.010728 0.000600 0.048492 
+-0.809045 -1.085427 6.160804 -1.242754 -1.597826 5.902174 
+-1.404389 -1.579937 4.692790 -1.167763 -1.062500 3.151316 
+-0.002896 -0.002868 0.017823 -0.001383 0.001482 0.003073 
+0.004046 -0.000233 -0.014322 -0.002207 -0.014753 -0.005300 
+0.006540 -0.004072 -0.003150 0.003272 0.001054 -0.002681 
+0.008494 0.006485 -0.005906 0.009838 0.007425 -0.009007 
+0.005918 0.003841 -0.007065 0.000763 0.000679 -0.000810 
+-0.004104 -0.001048 0.002462 -0.001268 0.003407 -0.001244 
+0.001157 0.002954 -0.007152 0.001189 0.000960 -0.004619 
+-0.002956 -0.004689 0.000918 -0.007616 -0.005031 0.002095 
+-0.005281 -0.001457 0.000909 0.001109 -0.001371 0.000393 
+0.001936 -0.000551 -0.002990 -0.000504 -0.001043 -0.002748 
+0.003517 0.005063 -0.000898 0.002360 0.004286 -0.002786 
+-0.000547 0.000823 -0.003153 -0.004200 -0.001705 -0.001116 
+-0.004826 -0.000609 -0.003609 -0.000672 -0.002955 -0.005104 
+0.000938 0.001822 -0.003976 -0.000889 -0.005486 -0.004148 
+-0.000922 -0.001522 -0.002490 0.004082 0.001965 -0.001435 
+0.001264 -0.001546 -0.002666 0.000465 -0.002868 0.000000 
+0.000260 -0.002291 0.000992 -0.002663 -0.002446 -0.000280 
+-0.001832 -0.004006 -0.002010 -0.001268 -0.004779 -0.002515 
+0.000677 0.003723 -0.000383 0.004624 0.002050 0.002727 
+0.004378 0.002968 0.001419 -0.011014 0.001934 -0.012905 
+-0.008656 0.008681 -0.023972 -0.001346 0.004598 -0.005798 
+0.005585 0.002520 0.019249 1.326975 0.038147 3.861035 
+1.839416 0.080292 5.418491 2.030848 0.349614 6.367609 
+1.837061 0.785942 6.284345 1.423077 1.192308 4.677885 
+0.002291 0.010702 0.011027 -0.003804 0.002867 -0.015267 
+0.001507 -0.003734 -0.008814 0.000257 0.005404 0.010673 
+0.007538 0.011269 0.013003 0.018964 0.015646 -0.009197 
+0.023140 0.025800 0.077020 -0.003609 -0.000442 0.032371 
+-0.008175 0.004624 0.012228 -0.007107 0.008351 0.001949 
+-0.013683 0.005546 0.005364 -0.021375 -0.007843 -0.002186 
+-0.011179 -0.001293 0.001635 0.008845 0.006785 -0.012977 
+0.016531 0.000838 -0.016910 0.016227 0.005028 -0.011763 
+0.008256 -0.004116 -0.014424 0.001910 0.002164 -0.000247 
+-0.008541 0.008889 -0.000305 -0.000534 0.001511 -0.001439 
+0.011284 -0.004505 -0.008378 0.015930 0.032321 -0.000984 
+0.015854 0.021574 -0.012513 0.002358 0.008634 0.034896 
+-0.348485 -0.431818 6.007576 -0.677130 -1.076233 5.946188 
+-0.703571 -1.314286 4.764286 -0.588889 -1.255556 3.088889 
+-0.000778 -0.007125 0.014592 0.002505 -0.002092 -0.003461 
+0.010523 0.006113 -0.014927 -0.002700 0.000204 -0.006323 
+-0.002318 0.002185 0.001869 -0.002360 0.000164 0.004017 
+0.002691 0.000687 -0.001494 0.004422 0.008371 -0.007713 
+0.004322 0.005864 -0.001746 0.000294 0.002359 0.000000 
+-0.000412 0.002597 -0.000769 0.000102 0.000264 -0.000834 
+0.000826 -0.002645 -0.001322 -0.003962 -0.004797 -0.005700 
+-0.008707 -0.005603 -0.003966 -0.006724 -0.005259 0.001638 
+-0.005455 -0.002771 -0.001212 -0.001623 -0.001662 -0.001272 
+0.000299 0.000598 0.000088 0.000755 0.003529 -0.001378 
+-0.001637 0.002586 -0.000996 -0.003325 -0.000282 -0.000338 
+-0.001777 -0.000987 0.001092 -0.001822 -0.000747 -0.000092 
+-0.000995 0.000375 -0.001256 0.003008 -0.004293 -0.003117 
+-0.007174 0.000584 -0.003137 -0.001876 0.000679 -0.002802 
+0.000428 0.001500 -0.001654 0.002221 0.000175 0.001840 
+0.000432 0.002490 0.001959 0.000328 0.003115 0.000000 
+0.002171 0.001114 -0.002700 -0.000653 -0.001527 -0.000585 
+-0.003337 -0.000379 -0.001763 -0.003657 0.002410 -0.001224 
+-0.004182 0.005014 0.002698 -0.002718 0.005578 0.003356 
+-0.005090 -0.001000 -0.000435 -0.005558 -0.002543 0.001840 
+-0.001925 0.002465 -0.005644 -0.000539 0.002416 -0.017072 
+0.002799 0.002623 -0.010601 0.005515 0.002665 0.010292 
+0.944444 0.228758 3.349673 1.042424 0.651515 4.769697 
+0.981949 1.050542 5.018051 0.801205 1.271084 3.777108 
+-0.005479 0.004819 -0.005704 -0.018791 -0.006129 -0.017909 
+0.002247 0.012182 -0.014092 -0.001637 0.000063 0.001225 
+0.000305 0.000229 0.001930 0.002780 -0.000560 -0.007473 
+0.020027 -0.001997 -0.014001 0.028673 -0.005684 -0.021816 
+0.028556 0.008210 -0.027587 0.016037 0.005629 -0.000366 
+0.003944 -0.008258 -0.001844 -0.005085 -0.008421 0.000656 
+-0.005770 -0.000029 0.001263 -0.002811 0.000930 0.000865 
+-0.000277 0.002467 0.001896 0.000183 0.012644 -0.001118 
+0.002531 0.003956 -0.001554 -0.005877 -0.004678 0.002588 
+-0.005418 -0.016366 0.011434 -0.020407 -0.012986 0.010256 
+-0.010376 -0.015338 -0.001428 0.082436 0.055563 -0.056237 
+0.005083 0.082710 -0.110532 0.002583 0.006319 0.018234 
+-0.003117 0.002613 0.038309 0.000249 0.000332 0.037518 
+0.003032 -0.002320 0.029105 0.002016 -0.002097 0.013198 
+-0.002830 0.001320 -0.000291 -0.003783 0.006369 0.000827 
+-0.016331 -0.000175 0.010042 -0.007505 0.007589 0.011730 
+-0.002611 0.004589 0.001168 0.000796 0.003114 -0.007476 
+-0.001054 0.007603 -0.004370 -0.002394 0.004795 -0.001664 
+0.004960 -0.000501 0.001197 0.006954 0.004525 -0.004209 
+0.002026 0.002613 -0.001088 -0.003462 -0.000360 0.000754 
+-0.002655 -0.001935 -0.001055 0.002475 -0.002446 -0.000939 
+0.002809 -0.001712 -0.005243 0.002213 0.002911 -0.001164 
+-0.001797 0.000415 -0.000464 -0.002220 0.001721 0.000290 
+-0.002887 0.001524 0.000297 -0.002719 -0.000552 0.000363 
+-0.000646 -0.001354 -0.000088 0.000512 0.001025 0.000579 
+0.000800 0.000135 0.001003 -0.001691 0.000718 -0.001999 
+-0.006649 -0.000451 -0.002344 -0.006218 0.000135 -0.000073 
+-0.002619 0.000222 -0.000667 -0.001305 -0.002795 0.000466 
+-0.000188 -0.000282 0.001908 0.001850 0.000287 0.001042 
+0.001133 0.000227 0.000543 0.000423 -0.000440 -0.000946 
+0.001154 -0.000371 -0.004078 -0.000571 0.002428 0.000271 
+-0.001144 0.001822 -0.000205 -0.001885 0.001779 -0.000945 
+-0.003169 0.000381 -0.000507 -0.001139 -0.003035 -0.000579 
+-0.001019 -0.004866 0.000106 -0.004703 -0.003614 0.003168 
+-0.004262 -0.004595 -0.000382 -0.000166 0.001350 -0.010141 
+-0.005896 0.002323 -0.019099 -0.003639 -0.000745 -0.007887 
+-0.001523 0.000071 0.009544 -0.000970 0.003514 0.018239 
+-0.001047 0.006048 0.017931 -0.003153 0.003967 0.003054 
+-0.015533 -0.007949 -0.029710 0.008999 0.009217 -0.029436 
+0.000889 0.004088 -0.007218 0.002961 0.002013 -0.000340 
+-0.002463 -0.000717 -0.000939 -0.003334 0.004235 -0.003753 
+0.000526 0.004345 -0.009480 0.000805 0.005321 -0.009305 
+-0.003748 0.006031 -0.006450 -0.006239 0.000570 -0.002526 
+-0.003945 -0.003221 0.000396 0.000421 -0.004282 0.001027 
+-0.000771 -0.006182 0.003029 -0.007628 -0.011343 -0.000035 
+-0.003889 -0.005556 -0.005000 0.001188 -0.001863 -0.002025 
+0.014461 -0.001352 -0.003963 0.016127 0.012726 -0.003354 
+0.010155 0.007514 -0.003069 0.004093 0.000578 0.000214 
+0.007554 0.004112 -0.014570 0.022123 0.011391 -0.036410 
+0.000799 0.030571 -0.041010 0.019148 0.018882 0.024157 
+-0.002179 0.001190 0.008299 0.000504 0.001236 0.001664 
+0.004534 0.001928 0.000399 0.003367 0.001497 -0.006293 
+-0.002332 0.008176 -0.010660 -0.011057 0.001715 -0.005022 
+-0.013316 0.004600 0.002029 -0.007859 0.004467 0.005459 
+-0.000604 0.001220 0.000685 0.000206 -0.002690 -0.003809 
+-0.003347 0.000206 -0.004070 -0.000480 0.009619 -0.002332 
+0.008932 0.007975 -0.009330 0.000138 0.003549 -0.008714 
+0.000864 -0.000880 -0.006683 0.001325 -0.003045 -0.003262 
+0.001917 0.002263 -0.004780 0.000540 0.001823 -0.006332 
+0.002584 0.003975 -0.004372 -0.000225 0.000606 0.000061 
+0.004050 -0.001389 0.000553 0.005667 0.000262 -0.001672 
+0.004017 0.001325 -0.001184 0.003464 0.001073 -0.000319 
+0.003838 -0.000644 -0.000448 0.000940 -0.001702 -0.000905 
+-0.000705 -0.000410 0.001410 -0.002869 0.000000 -0.002049 
+-0.000383 0.005628 -0.004863 0.000317 0.002997 -0.003132 
+0.003698 0.003031 -0.001346 0.000306 0.002092 -0.000408 
+-0.000668 0.002187 0.002551 -0.000927 0.001412 0.001198 
+0.000423 -0.000431 -0.000255 0.001642 0.000649 -0.000897 
+0.001213 0.001169 0.000359 0.002235 0.002056 0.001458 
+0.001744 0.003312 0.001262 -0.000259 0.004765 -0.000346 
+-0.001962 -0.000147 -0.002552 -0.002552 0.002752 0.000133 
+0.000054 0.002066 0.000758 0.000392 0.000988 -0.000126 
+0.001827 0.001645 0.000670 0.000601 0.002193 -0.003498 
+0.001722 0.001773 -0.004327 -0.004022 0.004146 -0.005988 
+-0.007594 0.002286 -0.011381 -0.005217 -0.000233 -0.016910 
+-0.001919 -0.001284 -0.016553 -0.002947 0.000065 -0.009333 
+0.001866 -0.008191 -0.005170 0.000464 -0.004315 -0.000240 
+-0.004407 -0.003535 0.000230 -0.004052 -0.002143 -0.001839 
+-0.006864 -0.009248 -0.000964 -0.009388 -0.013850 0.003408 
+-0.009464 -0.011943 -0.002171 -0.004169 -0.001787 -0.002340 
+0.000986 -0.001563 -0.000520 0.001659 0.009000 -0.001881 
+0.003182 0.007015 -0.006138 -0.003125 -0.001250 0.004375 
+-0.002441 -0.007278 0.007627 -0.002078 -0.003627 0.000659 
+0.001737 0.018162 -0.008181 0.011236 0.043331 -0.002559 
+0.010727 0.017232 -0.002432 0.004446 -0.000140 -0.004234 
+-0.000952 -0.003810 -0.001905 -0.007978 -0.001671 -0.004520 
+-0.002229 0.002106 -0.003390 0.004498 0.010164 -0.037566 
+0.101986 0.076069 0.142949 -0.035891 0.017510 0.047334 
+0.015561 0.011407 -0.016066 0.006784 0.004495 -0.004192 
+-0.003482 -0.002018 0.001130 -0.007390 -0.003337 0.001983 
+-0.003648 0.003528 0.000098 -0.001996 0.008263 -0.003729 
+-0.002512 0.007041 -0.003938 -0.003424 0.001107 -0.001100 
+-0.005050 -0.003090 0.001677 -0.001607 -0.002963 -0.000198 
+0.004983 -0.001580 -0.001033 0.005937 0.003523 -0.009101 
+0.000843 0.002270 -0.000554 0.000889 -0.001429 0.000247 
+-0.002822 0.000671 0.002108 0.000228 0.001802 0.000728 
+-0.000271 -0.000169 -0.001759 -0.001518 -0.003796 -0.000310 
+-0.001037 -0.002460 -0.001664 -0.001362 0.001101 -0.002300 
+0.000068 0.000795 0.000398 0.001934 0.000501 -0.000369 
+0.000463 0.001139 0.000101 0.002678 0.002627 -0.001339 
+0.004970 0.003445 -0.001988 0.001679 0.001742 -0.000222 
+-0.003680 0.000631 0.000796 -0.003802 0.000744 0.000744 
+-0.000082 -0.000082 -0.001311 0.002714 -0.000571 -0.003942 
+0.001026 0.000339 -0.000344 0.000333 0.000534 -0.001038 
+-0.001721 -0.000425 0.000067 -0.004471 0.001209 0.001048 
+-0.001627 0.000477 0.003394 -0.001498 0.002492 0.002744 
+0.000253 0.001786 0.000676 -0.000135 0.001181 0.000191 
+-0.001120 0.003136 -0.000217 -0.001518 0.007297 -0.001012 
+-0.001484 0.009107 -0.000464 -0.003354 0.006706 -0.000903 
+-0.004288 0.002416 -0.002970 -0.002296 0.000678 0.000652 
+0.000127 0.001045 -0.000018 0.000348 0.004179 0.000116 
+0.001014 0.007656 -0.006577 0.003128 0.010979 -0.009327 
+0.000257 0.012005 -0.002113 0.000632 0.008154 0.001888 
+-0.000641 -0.001152 -0.002524 0.003158 0.005772 -0.002623 
+-0.007503 -0.001934 -0.009789 0.002508 -0.003560 -0.003903 
+-0.000134 0.005025 0.003134 0.000004 0.003439 0.002627 
+-0.001787 -0.005923 -0.000831 0.001289 -0.011010 0.001057 
+0.003282 -0.009998 -0.000690 0.002449 -0.001487 0.003409 
+-0.011489 -0.001949 0.013197 -0.012987 -0.005152 0.013690 
+-0.002535 -0.000317 0.003400 0.007162 -0.000856 -0.009053 
+0.011411 0.002781 -0.016300 0.012321 0.003996 -0.017981 
+-0.002080 0.002679 -0.016449 0.001405 0.014287 -0.010540 
+0.009289 0.020425 -0.002531 0.005997 0.011420 0.004597 
+-0.008560 -0.001958 -0.007761 -0.014714 -0.006303 -0.023465 
+0.001706 -0.016751 -0.014011 -0.004602 -0.008178 -0.013390 
+0.008326 0.005551 0.002380 -0.068060 -0.102308 0.070787 
+-0.071936 -0.024078 0.012220 0.001199 0.000312 -0.001093 
+-0.004467 -0.005214 0.002742 -0.003310 -0.001309 0.002846 
+-0.003059 0.005495 0.000308 0.000709 0.008333 -0.003645 
+0.001549 0.006348 -0.004808 -0.001506 0.001672 -0.003899 
+-0.002759 -0.000827 -0.000590 -0.002102 0.000685 0.001278 
+0.001137 0.003363 -0.000827 0.003562 0.002956 -0.005933 
+-0.000942 0.000324 -0.006921 -0.000695 0.001747 -0.001449 
+-0.002117 0.002352 0.000863 -0.001490 0.000793 0.003144 
+-0.001149 0.000906 0.002720 0.000488 0.000051 -0.000329 
+0.003414 -0.003316 -0.002428 0.001142 -0.003943 -0.001535 
+-0.000566 0.000080 -0.000356 -0.000677 0.001754 0.002823 
+0.000133 0.000584 0.002062 -0.001395 -0.000880 -0.001104 
+-0.001513 0.002017 -0.000504 0.001525 0.000932 -0.000932 
+0.002650 -0.001068 -0.001048 0.002545 0.000057 -0.001640 
+0.003040 0.000024 -0.001526 0.002594 0.001663 -0.003918 
+-0.001151 -0.000343 -0.001773 -0.000972 -0.000003 -0.000817 
+-0.001116 -0.000660 0.000036 0.000165 0.001575 0.000806 
+-0.001690 0.002854 0.000314 0.000148 0.002074 -0.000222 
+0.000358 0.001303 0.000706 -0.000006 0.002794 0.000725 
+0.000193 0.005364 0.000486 0.003584 0.005664 -0.003584 
+0.004031 0.004199 -0.000028 0.001595 0.002034 0.001182 
+-0.001831 0.000826 -0.001950 -0.000958 0.004187 -0.006557 
+-0.000580 0.009384 -0.001979 -0.000535 0.008252 -0.000673 
+0.001763 0.006465 -0.000587 0.006469 0.007859 -0.004150 
+0.008000 0.015479 -0.007619 0.009467 0.022720 -0.004891 
+0.016196 0.020547 -0.006584 -0.006625 0.007654 0.009959 
+-0.002432 -0.000277 -0.001532 -0.005447 -0.010847 -0.002716 
+-0.009252 -0.009524 -0.000272 -0.001320 -0.001336 -0.002754 
+0.006666 0.001906 -0.010529 0.002400 0.000338 -0.010553 
+-0.004789 0.005388 -0.017234 -0.007028 0.014785 -0.029956 
+0.002494 0.029889 -0.050904 0.016649 0.019066 -0.041238 
+0.021915 0.004163 -0.024157 0.022328 -0.005913 -0.026763 
+0.010000 0.010000 -0.036111 0.003525 0.008401 -0.012891 
+0.004767 -0.001617 0.000408 0.011415 -0.007517 0.008075 
+0.015144 -0.004754 0.007547 0.018317 -0.007531 -0.009241 
+0.013793 0.014832 -0.032631 -0.004187 0.015879 -0.004376 
+-0.004245 -0.004939 -0.009306 0.004600 -0.004575 -0.007254 
+0.001289 0.000864 -0.003135 0.004484 0.007569 -0.008267 
+-0.044127 0.006110 -0.006417 -0.032627 -0.002420 0.015710 
+-0.007101 -0.002097 0.003366 0.002275 0.001629 -0.000391 
+0.003527 0.002841 -0.001042 0.003358 0.002120 -0.004167 
+0.001908 0.001440 -0.007705 -0.000604 -0.001595 -0.003765 
+0.003148 0.001608 -0.000499 -0.000301 0.001563 0.001077 
+-0.001872 -0.001851 0.000689 -0.000105 -0.004929 -0.002560 
+0.001074 -0.003813 -0.007349 -0.001904 0.003226 -0.005341 
+-0.005909 0.000744 -0.001274 -0.006667 -0.001981 0.000079 
+-0.005391 -0.002363 0.000448 -0.003569 -0.001168 -0.000238 
+-0.003171 -0.000800 -0.001183 -0.002354 -0.000447 -0.001507 
+-0.001099 -0.000021 -0.000750 0.002173 0.000030 -0.003170 
+-0.000047 0.001669 -0.004684 -0.000045 0.000654 -0.001418 
+-0.002621 0.002377 0.002516 -0.002708 0.001315 0.000889 
+0.000193 0.002673 -0.000409 -0.000541 0.000038 -0.000683 
+0.000856 0.000203 -0.001938 0.001176 -0.000336 -0.000336 
+0.000050 -0.001174 0.003605 -0.002857 -0.003250 0.001946 
+-0.002914 0.000161 -0.005018 -0.002743 0.001251 -0.004437 
+0.000807 0.001896 -0.004721 0.004760 0.002865 0.001371 
+0.003963 0.003591 0.001764 0.001668 0.003742 0.001867 
+0.000547 0.001451 0.001562 0.001589 -0.001807 -0.000016 
+0.005115 -0.002116 0.002158 0.003032 -0.000848 0.003257 
+-0.000663 0.001247 -0.000059 -0.003377 0.006408 -0.002770 
+-0.005464 0.003240 -0.005651 -0.004320 0.002644 -0.004870 
+-0.002035 0.002972 -0.002656 0.002089 0.001483 -0.001374 
+0.001425 0.004940 -0.007422 0.003510 0.009223 -0.005315 
+0.007601 0.009057 -0.003150 0.005645 0.001643 0.001031 
+-0.006280 -0.006598 0.004885 -0.010120 -0.010142 0.008368 
+-0.007018 -0.008666 0.008066 -0.001713 -0.002563 -0.000923 
+0.003075 0.004738 -0.029051 0.010090 0.013154 -0.040560 
+-0.002452 -0.001505 0.016790 0.011422 -0.009442 0.021078 
+0.006128 -0.007596 0.029244 0.003159 -0.005295 0.023553 
+0.007461 -0.001092 0.007830 0.015895 0.010619 -0.019766 
+0.016084 0.012894 -0.013328 0.010442 0.005756 -0.003467 
+0.006207 0.003665 -0.004588 0.012109 0.002553 -0.000197 
+0.024610 0.009228 0.004610 0.035714 0.027929 -0.005143 
+0.024925 0.036401 0.000708 -0.018077 0.018846 -0.018077 
+-0.000650 0.005351 -0.029946 0.004634 0.006559 -0.015602 
+0.004618 0.007671 -0.013757 0.004781 0.007222 -0.016324 
+-0.000288 0.009862 -0.022981 0.005678 0.015804 -0.009284 
+0.020100 0.004126 -0.004378 0.015307 0.000304 -0.004763 
+0.001678 0.002944 0.000583 -0.000130 0.000049 0.000944 
+-0.000964 -0.001170 -0.002353 0.000293 -0.002062 -0.001476 
+-0.002851 -0.000474 0.002368 -0.003051 -0.003068 0.002371 
+-0.001472 -0.001173 0.001421 -0.000381 0.001293 0.001566 
+0.000327 0.001657 0.000476 0.000334 0.000386 -0.000118 
+-0.000474 -0.000821 0.000425 -0.002102 -0.002183 0.000889 
+-0.003015 -0.002036 -0.000515 -0.004602 0.000041 -0.000950 
+-0.005755 -0.001178 -0.001044 -0.004423 -0.003426 -0.001989 
+-0.003793 -0.001613 0.000318 0.000378 -0.006771 -0.000947 
+0.001431 -0.003151 -0.000674 -0.000637 0.000567 -0.000746 
+-0.001847 0.001763 -0.002015 -0.000544 0.001343 -0.001179 
+-0.001356 0.000810 -0.002729 -0.002706 -0.000024 -0.000290 
+-0.001689 0.002285 0.001878 -0.001760 0.001369 0.001695 
+0.005156 0.004900 0.000718 -0.000979 -0.002551 -0.003788 
+-0.003758 -0.001581 -0.006344 -0.002576 -0.000711 -0.007606 
+-0.000834 -0.002406 -0.000746 -0.003319 -0.000240 -0.001092 
+-0.003978 0.000089 -0.001913 -0.002770 -0.001160 -0.002225 
+0.000548 -0.000363 -0.000027 -0.000033 0.000139 -0.000749 
+-0.000055 -0.000269 -0.002142 -0.000841 0.000310 -0.005089 
+0.000976 -0.002270 -0.003896 -0.002499 0.000510 -0.004823 
+-0.002289 0.001547 -0.002776 -0.002229 0.001346 -0.002622 
+0.000653 -0.001345 -0.003783 0.005657 0.006295 -0.006830 
+0.007260 0.007667 -0.008408 0.008065 0.010517 -0.005745 
+0.007788 0.010690 -0.004826 0.003259 0.010559 -0.006836 
+-0.002973 0.009868 -0.007849 -0.007649 0.002885 -0.003494 
+-0.013004 -0.011489 0.007887 -0.010602 -0.019362 0.012210 
+-0.012138 -0.010321 -0.004151 -0.041502 0.014907 -0.048972 
+-0.004502 -0.012152 0.033407 -0.462069 -1.862069 4.613793 
+-0.578947 -2.189474 5.252632 -0.508772 -2.184211 5.274854 
+-0.303846 -1.911538 4.730769 -0.000096 -0.007228 0.025833 
+0.004408 0.016140 -0.009017 0.005182 0.007386 -0.011357 
+0.000173 -0.003107 0.005695 -0.000042 -0.002779 0.004640 
+0.000621 0.005428 -0.004767 0.000069 0.003987 -0.003826 
+-0.004326 0.000744 -0.001470 0.001810 0.001739 -0.004209 
+0.000434 0.003354 -0.007138 -0.001730 0.008371 -0.007617 
+-0.000885 0.008784 -0.011324 0.003529 0.006695 -0.014190 
+0.001565 0.002764 -0.008083 -0.006406 -0.006199 0.003523 
+-0.006904 -0.010882 0.001954 -0.005857 0.001036 0.000357 
+-0.005862 0.005397 0.005098 -0.001390 0.001390 0.002562 
+-0.001412 -0.002259 0.002415 -0.001101 -0.003216 0.002235 
+0.000907 -0.000283 0.000007 0.002330 0.005000 -0.000810 
+0.004789 0.007066 -0.001817 0.004211 0.004748 -0.000448 
+-0.000493 0.000600 0.001547 -0.000011 0.001301 0.001607 
+0.000667 0.004422 0.000474 0.005221 0.007817 0.002899 
+0.001479 0.006662 0.001742 -0.003441 -0.000890 -0.001842 
+-0.010619 -0.007112 -0.002835 -0.010538 -0.003842 0.000858 
+-0.004166 0.003370 0.001904 -0.000318 0.001741 0.001616 
+0.001874 -0.003965 0.000154 -0.001697 -0.009194 0.000879 
+0.000971 -0.002356 0.003068 0.003342 -0.003319 -0.001762 
+0.001478 -0.003304 0.002087 0.003448 -0.003671 0.000918 
+0.001250 -0.000316 0.000187 -0.000740 0.002456 0.000123 
+-0.003174 0.000214 -0.004440 -0.000455 -0.001409 -0.005207 
+0.004176 -0.002581 -0.006244 0.001071 0.005526 -0.003350 
+0.000159 -0.000380 -0.000053 0.000261 -0.000278 -0.000049 
+-0.001699 -0.000646 -0.000958 -0.004845 -0.001991 -0.000528 
+-0.005027 -0.000690 0.004973 -0.001525 0.002423 0.005309 
+-0.000209 0.002611 0.001497 -0.005514 -0.000426 -0.001031 
+0.000321 0.000113 -0.001828 -0.000337 0.000433 -0.004609 
+0.000098 -0.000238 -0.005554 -0.001402 -0.000484 -0.006677 
+0.001212 -0.006145 -0.004252 0.002483 -0.000552 -0.003051 
+0.004449 0.007030 -0.005066 0.001976 0.015104 -0.005711 
+-0.003369 0.013297 -0.003897 -0.005930 0.005231 -0.001058 
+-0.005135 0.005506 -0.004687 -0.002219 0.000227 -0.008815 
+-0.000400 -0.000504 -0.005095 0.000412 0.001472 -0.002422 
+0.003749 0.011388 -0.018550 0.015656 -0.004636 -0.042667 
+-0.006194 0.022414 -0.019499 -0.582011 -1.957672 5.444445 
+-0.809524 -2.473545 6.211640 -0.824034 -2.532189 6.175966 
+-0.706667 -2.373333 5.706666 -0.322917 -1.708333 4.218750 
+0.002158 0.012949 -0.006418 -0.002043 -0.008653 -0.013685 
+0.003109 0.002763 0.000598 0.000013 -0.000748 0.000401 
+0.003864 -0.000479 -0.004563 -0.008977 0.008003 -0.008386 
+-0.003871 -0.002125 0.002766 0.003263 -0.001499 0.001550 
+0.003581 0.002996 -0.010899 -0.001448 0.006168 -0.012471 
+0.002777 0.003916 -0.002408 -0.003848 0.009596 -0.000154 
+0.000146 0.011293 -0.007571 0.000791 0.005926 -0.006923 
+-0.003939 -0.003321 0.001250 -0.001397 -0.008462 0.007692 
+-0.006580 -0.001374 0.001969 -0.006149 -0.002701 0.004039 
+-0.001370 -0.002221 -0.000003 0.002753 -0.001073 -0.003120 
+0.002667 0.001119 -0.000443 0.000165 0.003053 -0.002287 
+0.000297 0.001196 -0.001018 0.001200 0.001562 -0.001158 
+0.001039 0.000654 -0.002697 -0.002017 -0.002537 -0.001754 
+0.000186 -0.003282 -0.000816 -0.000480 0.000530 0.000287 
+0.000024 0.001550 0.000508 -0.002173 0.000109 -0.000703 
+-0.005200 -0.007784 0.001665 -0.005145 -0.009765 0.008098 
+-0.002819 -0.003845 0.009900 -0.002039 0.001482 0.007097 
+-0.003362 -0.001371 -0.000457 -0.003565 -0.003505 0.005258 
+-0.003338 -0.002548 -0.001171 0.000065 -0.001214 0.000064 
+0.000826 -0.000463 -0.000051 0.001540 -0.001290 0.000832 
+0.002078 -0.001105 0.000317 0.001872 -0.000749 0.000729 
+-0.000564 0.003420 0.000066 -0.000065 0.001018 -0.001702 
+-0.001558 -0.000392 -0.001195 -0.001323 0.003018 0.000674 
+0.000106 0.003431 0.001324 -0.000731 0.000351 -0.000244 
+-0.003784 0.000742 -0.000590 -0.006275 0.002147 0.006441 
+-0.004795 0.002847 0.008662 -0.003832 0.002811 0.005682 
+-0.004385 -0.001954 0.002053 -0.004954 -0.003154 -0.001420 
+0.001774 -0.003670 0.000032 0.000128 -0.000442 -0.004253 
+0.000871 0.004147 -0.014269 -0.002033 0.007380 -0.015211 
+-0.003468 0.001472 -0.012085 -0.001636 -0.000735 -0.004457 
+-0.003652 -0.000626 -0.000313 -0.000141 0.000880 -0.002361 
+-0.001177 0.002204 -0.009120 -0.007438 0.001742 -0.013925 
+0.004283 -0.004246 -0.010949 -0.003908 -0.002887 -0.008082 
+-0.002173 0.003609 -0.005208 0.001859 0.003015 -0.019034 
+0.020284 0.020056 -0.067006 -0.002709 0.023449 -0.047986 
+-0.002134 -0.005744 0.022873 -0.891626 -2.315271 5.807882 
+-0.980952 -2.895238 6.800000 -0.913165 -2.913165 6.607843 
+-0.692568 -2.527027 5.554054 -0.208791 -1.445055 3.340659 
+0.000164 0.001049 0.000390 0.000960 0.000566 -0.008149 
+-0.011067 -0.001626 0.008444 -0.008159 0.005873 0.004889 
+-0.005313 0.002214 -0.013966 0.000067 0.005896 -0.021307 
+-0.001825 0.006374 -0.004681 -0.002520 0.003345 0.004060 
+-0.001306 -0.000845 0.001545 -0.002118 -0.000474 -0.001906 
+-0.001148 -0.002416 -0.009229 -0.000548 0.000149 -0.010511 
+-0.004213 0.005685 -0.005228 -0.005790 0.002709 -0.001341 
+-0.003857 0.000634 -0.002649 -0.000442 0.002184 -0.008546 
+0.002897 0.009710 -0.017612 0.020785 -0.004331 -0.007205 
+0.013805 -0.001212 -0.012402 0.004570 -0.004553 -0.007624 
+0.000813 -0.004679 -0.001899 -0.002323 -0.001297 0.001351 
+-0.000258 -0.000735 0.002039 -0.000116 0.001970 0.001508 
+0.002185 0.002124 -0.001638 0.001278 0.000999 -0.004468 
+-0.001546 -0.001576 -0.003491 -0.004554 -0.001584 -0.003205 
+-0.006172 0.000423 -0.002008 -0.004671 0.000457 -0.001101 
+-0.003352 -0.000358 0.000593 -0.003373 -0.000383 0.002913 
+-0.002438 -0.000012 0.004502 0.001067 0.001518 0.002078 
+-0.001679 0.000030 0.002316 -0.002166 -0.001270 0.001978 
+-0.002818 -0.002310 0.002377 -0.003408 -0.003288 0.000642 
+-0.000686 -0.003247 -0.000538 -0.005004 -0.001808 0.002954 
+-0.000577 0.001277 -0.000689 -0.001963 0.003367 -0.001097 
+0.000664 -0.002020 -0.000822 -0.002777 -0.000963 -0.001392 
+-0.002778 0.000058 -0.001448 -0.001340 -0.000409 -0.001083 
+0.000608 -0.002785 -0.000111 0.000159 -0.006645 -0.001334 
+-0.004357 -0.003508 -0.004894 -0.010802 -0.001283 -0.003006 
+-0.006979 -0.004050 0.000250 -0.001024 -0.000290 0.002147 
+-0.001280 0.001909 0.001057 -0.001700 -0.000649 0.000109 
+-0.002537 -0.002860 -0.001225 -0.000383 -0.003365 -0.000312 
+-0.001471 -0.001766 -0.002690 0.002528 0.002662 -0.007914 
+-0.003370 0.003371 -0.005551 -0.003861 0.003627 -0.002399 
+0.000911 0.001327 -0.000031 0.000788 -0.000584 -0.008598 
+-0.002904 -0.004813 -0.006581 0.000279 -0.000143 0.000109 
+-0.000671 0.005395 0.001022 -0.003703 0.008280 0.005215 
+-0.003723 0.008413 0.004755 -0.000986 0.012324 -0.011266 
+0.002422 0.006643 -0.056973 -0.002189 0.020274 -0.044282 
+-0.000402 0.002554 0.014192 -0.246835 -1.329114 4.582278 
+-0.342857 -2.071429 5.700000 -0.299065 -2.275701 5.476635 
+-0.143678 -1.925287 3.913793 0.003258 -0.006921 0.012373 
+0.002722 0.000406 -0.011879 0.001196 0.000964 -0.012326 
+-0.001451 -0.004743 -0.002099 -0.001071 -0.006692 0.001131 
+0.004313 0.004610 -0.005263 0.002955 0.019522 0.001349 
+0.005954 0.014659 0.002230 0.003832 0.000735 0.003398 
+-0.001864 -0.004275 0.005105 -0.002445 -0.002099 0.004730 
+-0.002143 -0.002794 -0.000689 -0.000179 0.001856 0.000049 
+-0.000637 0.002319 -0.000315 -0.000806 0.003237 -0.000600 
+0.000203 0.000437 0.000577 -0.001110 0.008330 -0.003930 
+-0.003306 0.002215 -0.010002 -0.014493 -0.004626 -0.028038 
+0.026999 0.005802 -0.019073 0.007211 0.003074 -0.007151 
+0.001657 0.000645 -0.001673 0.000296 0.000248 0.000137 
+-0.001068 -0.002402 0.000274 -0.004212 -0.003028 -0.001939 
+-0.002963 -0.000644 -0.003693 -0.000404 0.001436 -0.003532 
+0.001718 0.004645 -0.002556 0.002031 0.004486 -0.000667 
+-0.000167 -0.000709 -0.000052 -0.003933 -0.004844 -0.000326 
+-0.005229 -0.005935 0.001381 -0.002543 -0.000267 0.005443 
+0.001001 0.001212 0.000773 0.001152 0.000628 -0.000578 
+-0.003898 0.004617 0.000289 -0.005553 0.000739 0.000202 
+-0.006629 -0.004279 0.004244 -0.004938 -0.005682 0.002964 
+-0.000437 -0.002350 0.003825 0.000804 0.000304 -0.000719 
+0.001171 -0.000740 -0.001407 -0.000618 -0.002005 0.000657 
+-0.003565 -0.001228 0.000334 -0.001719 0.000185 0.000964 
+-0.000086 0.000657 0.000600 0.000178 0.000070 0.000128 
+0.003275 -0.003997 0.001413 0.003494 -0.006130 0.002583 
+0.001646 -0.002458 0.000765 0.000873 -0.000737 -0.000129 
+0.000370 0.000099 -0.000353 -0.002033 0.002333 0.002010 
+-0.004784 0.001578 0.000118 -0.003023 -0.000942 -0.000440 
+-0.004172 -0.008203 -0.000874 -0.001401 -0.006501 -0.002335 
+0.000460 -0.003191 -0.001266 0.003688 0.003893 0.001389 
+-0.000871 0.006175 -0.004573 0.000339 0.001089 -0.001466 
+-0.000746 -0.001874 -0.002299 0.000814 -0.004382 -0.003075 
+0.000505 -0.003060 0.001179 0.001598 -0.001785 0.001131 
+-0.002923 -0.001224 -0.000128 -0.005003 -0.001682 -0.000550 
+-0.004361 -0.003898 0.003005 -0.002112 -0.001588 0.003771 
+0.001205 0.002689 -0.008475 0.001571 0.008303 -0.019055 
+0.002168 0.004152 -0.005847 -0.005617 -0.003514 0.017258 
+-0.004277 -0.005144 0.029261 0.002265 -0.005717 0.025866 
+0.005340 -0.004791 0.009688 0.000126 0.001717 -0.007981 
+-0.005605 0.006849 -0.009159 -0.004070 0.000769 -0.002201 
+0.002036 0.000781 0.003879 0.007508 0.001771 0.000503 
+0.009724 0.003270 -0.005369 0.006882 0.001916 -0.008969 
+-0.001633 0.006021 0.002097 0.001322 0.003918 -0.001702 
+-0.003430 -0.002933 0.001583 -0.007156 -0.006848 0.001368 
+-0.001306 -0.004962 0.002438 0.000856 -0.002190 -0.001652 
+-0.000285 -0.000846 -0.003356 -0.003834 0.001508 -0.001740 
+-0.003992 0.002610 -0.002433 -0.001171 0.003728 -0.004319 
+0.000200 0.002066 -0.006745 0.001150 0.003171 -0.001233 
+0.002298 0.027548 0.000751 0.026702 0.017639 -0.015555 
+0.008422 0.007640 -0.004766 0.001821 0.002510 -0.000380 
+-0.000635 -0.001014 0.000172 -0.000337 -0.001988 -0.000860 
+0.001447 -0.002300 -0.002375 0.000653 -0.001389 -0.001736 
+0.000805 -0.000314 -0.002093 0.001025 0.000843 -0.006438 
+-0.005511 0.003857 -0.007019 0.001153 -0.000765 -0.000056 
+0.002856 -0.002887 -0.001366 -0.001393 -0.004580 0.004205 
+-0.004172 -0.000741 0.004254 -0.004092 0.003064 0.002960 
+-0.002045 0.004456 0.001301 -0.001326 0.000805 0.000347 
+-0.000675 0.001503 0.002570 -0.004294 0.000214 0.003779 
+-0.001684 -0.002113 0.001064 -0.003504 0.001429 -0.001180 
+-0.002615 -0.002216 0.000070 -0.002006 -0.003465 -0.003647 
+0.000885 -0.002728 -0.000479 0.002173 -0.000567 0.000567 
+0.002291 0.001227 0.001689 -0.003199 0.003409 0.003613 
+-0.007306 0.005824 0.004811 -0.005817 0.005861 0.004337 
+-0.004603 0.003478 -0.002085 0.001731 -0.004363 -0.004556 
+0.004116 -0.000676 -0.012246 0.002429 -0.001963 -0.004169 
+-0.002359 -0.001684 0.002801 -0.003089 -0.002144 -0.000529 
+-0.002406 -0.000201 -0.001902 -0.002841 -0.001520 -0.002842 
+-0.000634 0.003801 -0.000510 0.001741 0.002919 -0.010468 
+-0.001911 0.001403 -0.001795 -0.004253 -0.003614 0.000028 
+0.001701 -0.002744 -0.000294 0.001281 -0.004874 -0.000241 
+0.003365 -0.002141 0.000105 0.003842 0.001048 -0.001265 
+0.002935 0.002953 -0.002649 0.002020 0.001896 -0.002397 
+0.001309 -0.000316 0.000508 0.001792 0.000541 -0.000924 
+0.003474 0.004548 -0.007036 0.004589 0.006341 -0.013352 
+0.003124 0.005188 -0.011198 -0.001264 0.003171 -0.004560 
+-0.004598 -0.005541 -0.003433 0.000219 -0.006894 -0.012923 
+0.002525 -0.000955 -0.017948 0.002156 -0.002016 -0.014220 
+-0.002740 0.000417 -0.007782 -0.004146 0.001653 -0.003272 
+-0.002280 0.000861 -0.001837 -0.000541 0.000009 -0.000155 
+0.000967 0.000366 -0.000397 0.003987 0.001985 -0.005516 
+0.004749 0.002428 -0.011484 0.002109 0.003271 -0.013227 
+-0.003664 0.002699 -0.006888 -0.002982 -0.010470 -0.000176 
+-0.002988 -0.004946 -0.003464 0.001707 0.001802 -0.004467 
+0.002600 0.001500 -0.002376 -0.002603 0.000511 -0.000300 
+-0.003121 0.000853 -0.000246 -0.001292 -0.002141 0.001239 
+0.002205 -0.005034 0.000497 0.001053 -0.004888 0.000988 
+-0.000769 -0.012559 -0.000763 -0.004019 -0.007350 0.001467 
+-0.004232 -0.001907 0.002458 -0.003535 -0.000534 0.001496 
+-0.000964 0.001012 0.000869 0.001371 0.000935 0.001250 
+0.002890 -0.000088 0.000065 0.000491 0.000413 0.000336 
+-0.000732 -0.000434 -0.001821 -0.001075 0.000327 -0.003622 
+-0.001877 0.000280 -0.004040 -0.003734 -0.001444 -0.000793 
+-0.002262 -0.005222 0.004288 0.001601 -0.004590 0.003577 
+-0.000077 -0.001775 -0.002720 0.000104 -0.002128 -0.002530 
+-0.000122 0.001345 -0.005345 0.001008 0.000403 -0.002702 
+-0.001202 0.001123 0.000142 -0.001678 -0.000205 0.001602 
+0.000702 0.000678 0.003177 0.000856 0.001363 0.002598 
+-0.000462 0.000622 -0.000687 -0.001125 -0.002219 -0.002544 
+0.002960 -0.001145 0.001461 0.003733 0.001279 0.002366 
+0.003744 -0.001147 0.000840 0.000986 -0.002384 -0.001400 
+-0.001320 -0.001993 -0.002229 -0.000991 0.000861 -0.000690 
+-0.005401 0.005796 0.001555 0.002249 -0.000942 0.007581 
+0.001676 -0.000686 0.004164 0.000178 0.000058 0.001308 
+-0.000527 0.000309 0.000130 0.000232 0.000121 0.000160 
+0.000056 -0.001328 -0.000625 -0.000504 -0.000322 -0.000647 
+0.003468 -0.001583 -0.000660 -0.000663 -0.000710 0.006178 
+-0.001395 0.001395 0.005349 0.000341 -0.000356 0.002478 
+-0.002179 -0.002614 -0.001692 -0.003020 0.000517 0.000105 
+-0.000308 0.000939 -0.000664 0.002424 0.000993 -0.001968 
+0.004000 0.000231 -0.002122 0.003743 -0.000010 -0.001856 
+0.002310 0.001386 -0.003199 0.002744 0.002580 -0.006184 
+0.005124 0.001840 -0.009248 0.002049 -0.000041 -0.010635 
+0.001328 0.001819 -0.011553 0.002433 0.004774 -0.011854 
+0.001432 0.005813 -0.012523 -0.000513 0.006189 -0.012614 
+0.000663 0.007223 -0.010799 0.004095 0.005548 -0.009373 
+0.003430 0.002451 -0.006218 -0.001282 0.000648 -0.000363 
+-0.004655 0.000168 0.003185 -0.004387 -0.001111 0.001872 
+-0.000437 0.000428 -0.000975 0.001314 0.001617 -0.002861 
+-0.000841 0.000699 -0.001971 -0.003738 -0.001353 0.000094 
+-0.002252 -0.002256 0.002182 0.005371 0.002482 0.003974 
+0.005610 -0.003363 -0.001163 0.001344 0.003822 -0.005918 
+0.002828 -0.000007 -0.003439 0.001364 0.003109 -0.000406 
+0.002264 -0.000986 0.000163 -0.004093 -0.010835 0.002929 
+-0.006380 -0.010713 0.010419 -0.002116 -0.002005 0.010024 
+-0.010799 -0.024539 -0.006939 -0.029079 -0.040908 0.008303 
+-0.012530 -0.014717 -0.001945 -0.005081 -0.004037 -0.001943 
+-0.001210 0.001023 0.001176 0.003129 0.002400 0.001534 
+0.005314 0.000380 -0.003036 0.001436 -0.001241 -0.004577 
+-0.000699 -0.001162 -0.002906 -0.000454 -0.000898 -0.001622 
+0.000822 -0.002417 -0.000887 0.001188 -0.003117 -0.001507 
+-0.004710 -0.005216 -0.001557 0.001591 -0.002314 -0.000724 
+0.002703 -0.001172 -0.001198 0.001242 -0.000149 -0.000679 
+-0.000420 -0.000133 0.000622 -0.001121 -0.003129 0.001882 
+-0.003718 -0.005326 0.003442 -0.006728 -0.001072 0.001220 
+-0.000538 -0.006729 0.001879 -0.000774 -0.002381 -0.003782 
+-0.001651 0.001358 -0.005000 -0.001758 -0.000027 0.000320 
+0.000580 0.000190 0.000132 0.000568 0.000425 0.000277 
+-0.001880 -0.000252 -0.000572 -0.004635 -0.001398 -0.000562 
+-0.002877 0.000604 -0.000580 0.000424 0.004631 -0.004627 
+0.006083 -0.000657 -0.004925 0.002075 -0.001528 0.001323 
+0.000651 0.000339 0.003004 -0.000506 0.001415 0.001833 
+-0.001106 -0.000997 -0.002161 -0.002948 0.000867 -0.003147 
+-0.005177 0.003558 -0.002922 -0.004758 0.003733 -0.003353 
+-0.003485 0.003519 0.002345 -0.000682 0.000910 -0.000489 
+-0.003483 0.000354 0.002350 -0.002463 0.000450 -0.002330 
+-0.001599 0.003140 -0.003867 -0.002245 0.002502 -0.002639 
+-0.002746 0.001277 -0.000413 -0.001707 -0.000189 -0.001376 
+0.002165 0.000584 -0.001499 0.002455 0.005297 -0.001421 
+0.007509 0.000781 -0.002387 0.004493 0.001232 0.001320 
+0.001692 0.003920 -0.000560 -0.000344 0.001031 -0.004046 
+-0.001704 0.001003 -0.002607 0.001679 0.001604 -0.003283 
+0.003529 0.002303 -0.005912 0.003154 0.002367 -0.006736 
+0.000314 0.001478 -0.004206 -0.001661 0.000676 -0.001139 
+-0.001824 0.000634 -0.000870 -0.001778 0.000228 -0.001366 
+-0.000839 -0.001678 0.000000 -0.000371 -0.000386 -0.001286 
+-0.000208 0.000149 -0.000130 0.003556 0.000260 -0.005637 
+0.002321 -0.001022 -0.005563 0.004273 0.001594 -0.004059 
+0.001510 0.002026 -0.002828 -0.002186 -0.001075 -0.002539 
+-0.005990 -0.002865 -0.001496 -0.004721 0.000476 -0.001946 
+-0.000175 0.007490 -0.005917 0.006315 0.007423 -0.004923 
+-0.001784 0.004019 -0.001911 -0.000117 0.000458 -0.000533 
+-0.000670 0.001268 -0.001643 0.000440 0.022806 -0.006203 
+-0.024192 -0.037632 0.027051 -0.054834 -0.085074 0.045876 
+-0.012822 -0.030724 -0.002199 -0.014363 -0.012644 -0.005311 
+-0.018311 -0.007233 -0.003732 -0.007119 -0.003629 -0.001280 
+0.002484 -0.000654 -0.001310 0.002982 -0.000132 -0.000848 
+0.002607 -0.000462 -0.001096 0.004676 -0.001646 -0.002515 
+0.006685 -0.002470 -0.002648 0.005133 -0.001446 -0.002287 
+0.003388 -0.000473 -0.002277 0.002447 0.000253 -0.002840 
+0.000855 0.000637 -0.002330 -0.004215 0.000773 -0.002145 
+-0.001756 -0.001940 -0.000334 0.000065 -0.000245 -0.000016 
+0.004444 0.000921 0.000379 0.004556 0.001332 -0.001120 
+0.000806 0.000314 0.000407 -0.001929 0.001207 -0.000467 
+-0.000946 -0.000561 -0.000687 0.000041 -0.001633 0.002122 
+0.003939 -0.002326 -0.000502 0.000909 -0.007054 -0.003171 
+-0.000362 -0.006560 -0.003205 0.001231 -0.001547 -0.001056 
+0.000307 0.003536 0.001436 -0.001132 0.003251 -0.001120 
+-0.000225 0.001540 0.004407 0.001336 -0.000012 0.001325 
+0.000780 -0.001102 0.000508 -0.004499 -0.000994 0.003271 
+-0.001171 0.002917 -0.000319 -0.002320 0.001611 -0.003148 
+0.000031 -0.002839 0.000325 -0.000641 -0.005252 -0.002319 
+0.002260 -0.000609 0.000152 0.001558 -0.000228 -0.001356 
+-0.000515 0.000082 0.001189 -0.001772 -0.000808 0.003340 
+-0.002516 0.002049 0.001417 -0.002795 0.003001 -0.003782 
+0.000968 0.007500 -0.005807 0.003063 0.006096 -0.007635 
+0.000400 0.000696 -0.005186 0.003749 0.001765 -0.001507 
+0.001247 0.002247 0.001469 0.000311 0.003155 0.001378 
+0.001470 0.002749 0.000426 -0.000076 -0.000156 -0.000178 
+-0.001741 -0.000494 -0.002026 -0.001897 0.001071 -0.003545 
+-0.003087 0.001853 -0.002127 0.000462 -0.000767 -0.000769 
+0.001040 -0.000446 -0.004210 -0.000288 -0.002281 -0.006268 
+-0.001821 -0.001611 -0.007911 -0.008061 -0.001240 -0.002279 
+-0.003940 0.000793 0.004682 -0.002532 -0.001767 0.006113 
+-0.001370 -0.001049 -0.000920 -0.000867 0.003124 -0.005934 
+0.000995 0.000487 -0.006260 0.000071 -0.000542 -0.001953 
+-0.000217 0.000294 -0.000275 0.000511 0.000543 -0.000688 
+0.001475 0.001122 -0.000202 0.001408 -0.000751 0.002071 
+0.002126 -0.001198 0.000865 -0.000292 0.001262 0.000261 
+0.000231 0.004113 -0.001342 0.001262 0.004927 -0.004047 
+-0.000676 0.001427 -0.001926 0.000594 -0.002710 0.002808 
+0.006861 -0.003354 0.002891 -0.002728 -0.011913 0.005283 
+-0.014216 -0.023811 0.001341 -0.013003 -0.021641 -0.008130 
+-0.036126 0.021958 -0.013939 -0.038094 0.103341 0.033429 
+-0.109093 0.005583 0.013046 -0.061243 -0.021862 -0.015993 
+0.011764 -0.018114 -0.033539 0.018797 -0.011008 -0.024252 
+0.008107 -0.010267 -0.012081 -0.011712 -0.006695 -0.002915 
+-0.002873 -0.004968 -0.002686 0.000284 0.000800 0.000448 
+-0.003083 0.000644 0.004087 -0.003915 0.001384 0.002772 
+0.001042 -0.000242 0.002495 0.000483 0.001172 0.002810 
+0.003333 -0.000131 0.001052 0.001992 0.000548 -0.000074 
+-0.000834 -0.000949 -0.000805 -0.003569 -0.007662 0.000871 
+-0.004726 -0.008114 0.004828 -0.000111 -0.003922 0.002239 
+-0.006683 -0.004354 -0.002811 -0.009321 -0.009926 -0.005645 
+-0.010221 -0.013537 -0.008411 -0.010195 -0.012742 -0.007883 
+-0.005282 -0.006696 -0.001722 -0.000968 0.000931 0.001148 
+-0.001617 0.003419 0.002070 -0.000828 0.001823 -0.000769 
+0.000966 0.003598 -0.001851 0.003834 0.002605 -0.000280 
+0.001752 -0.001148 0.000847 0.001203 -0.003152 -0.002915 
+0.001224 -0.001047 0.000590 -0.001912 -0.000852 0.001959 
+0.001310 0.002105 -0.004803 0.009971 0.002114 -0.011668 
+0.007609 0.006631 -0.011924 0.001484 0.001710 -0.004227 
+-0.000076 0.000117 0.000819 -0.000844 0.001491 -0.000589 
+0.002189 0.003687 -0.002797 0.001308 0.001118 -0.005592 
+-0.000442 0.004704 -0.000318 -0.002534 0.004739 0.000678 
+-0.002551 0.004463 0.000531 0.003437 0.001719 -0.005312 
+0.000000 0.002109 -0.005781 -0.001120 -0.001520 -0.004400 
+-0.001844 0.000263 -0.004065 -0.003800 -0.000740 -0.002111 
+-0.002471 0.000271 -0.001961 -0.000308 0.002128 -0.002556 
+0.001537 0.003997 -0.002306 0.005318 0.000313 -0.001564 
+0.000198 -0.001049 -0.002608 0.000748 -0.001178 -0.001369 
+-0.001006 -0.000457 -0.001189 -0.001146 0.000436 -0.002348 
+-0.002757 -0.001731 -0.002629 0.000676 -0.000105 -0.003429 
+0.002435 -0.000690 -0.005460 0.002425 0.003974 -0.006541 
+-0.000050 0.003486 -0.004607 -0.000816 -0.000082 -0.003530 
+-0.002365 -0.002898 -0.004277 -0.004284 -0.001525 -0.005817 
+0.001880 0.003503 -0.001748 0.001326 0.002692 -0.001750 
+0.000090 0.002560 -0.000074 0.003142 0.002593 -0.000159 
+0.000103 0.007050 -0.003479 -0.004897 0.008701 -0.006968 
+-0.000673 0.001068 0.000190 0.003544 -0.004818 -0.003000 
+-0.008646 -0.011307 -0.005668 -0.015114 -0.009952 -0.007762 
+-0.011611 -0.007096 -0.012383 -0.007681 0.007182 -0.025718 
+-0.030982 0.026158 -0.041742 0.002651 0.066832 -0.020388 
+0.016358 0.050013 0.017769 0.019039 0.010095 -0.006368 
+-0.001499 0.009115 0.006718 0.005798 -0.026723 0.035420 
+-0.026582 -0.048008 0.011936 0.008094 0.000719 -0.007289 
+-0.001544 -0.000816 0.000680 -0.004135 -0.002372 0.002031 
+-0.003306 0.001150 0.000491 0.002318 0.003243 -0.004030 
+0.004737 0.007794 -0.005937 0.007749 0.005685 -0.004044 
+0.003553 0.003450 -0.002173 -0.001331 0.001382 -0.000004 
+-0.000495 0.000993 -0.001053 0.001995 0.002316 0.000115 
+-0.007500 0.000238 0.000115 -0.004737 -0.006276 -0.003447 
+-0.011918 -0.006792 -0.004445 -0.022191 0.001050 0.002990 
+-0.015222 0.001859 0.010270 -0.000314 -0.000191 0.000214 
+0.010223 0.004559 -0.007804 0.009745 0.006013 -0.006129 
+0.003144 0.003749 -0.001300 -0.001112 0.001553 -0.000487 
+-0.002770 0.000196 -0.005759 0.000699 0.002281 -0.008708 
+-0.000380 0.001652 -0.002412 -0.006508 -0.000701 0.002152 
+-0.006712 -0.009145 -0.000855 -0.000815 0.001269 0.000356 
+0.000277 0.006406 -0.003967 0.001134 0.006367 -0.003449 
+0.000414 0.003513 0.000764 -0.003246 -0.000004 0.000229 
+-0.005564 -0.003767 -0.001256 -0.005821 -0.006324 -0.000666 
+-0.004489 -0.004918 -0.002388 -0.003378 -0.002017 -0.001838 
+-0.002238 0.002846 -0.000746 0.004949 0.003179 -0.003359 
+0.000561 0.001644 -0.004450 0.000288 -0.001680 0.000576 
+-0.002536 -0.003907 0.001074 -0.004349 -0.003175 0.001631 
+-0.003225 -0.000713 0.000718 -0.001510 -0.000260 0.000990 
+0.000449 -0.000227 -0.000786 -0.001841 0.001993 -0.000958 
+0.000273 0.000508 0.000156 -0.001040 0.001070 0.002676 
+-0.000336 0.000390 -0.000212 0.001284 0.003638 -0.005618 
+-0.000622 0.000636 0.000133 -0.002015 0.000668 -0.003498 
+0.004864 0.002075 -0.003372 -0.000069 0.000593 -0.000121 
+-0.002065 0.001473 -0.005861 0.002321 -0.000774 -0.006964 
+-0.001510 0.003333 -0.001986 0.003039 0.006521 -0.003148 
+0.005348 0.008009 -0.002558 0.002156 0.005564 -0.000986 
+-0.004988 -0.000101 0.000464 -0.007351 -0.000444 0.000809 
+-0.001548 0.000738 0.000036 -0.000157 -0.000095 -0.000363 
+-0.006136 0.004697 -0.011242 -0.008746 -0.000828 0.000038 
+-0.002181 -0.003310 -0.001145 0.003173 -0.004604 -0.001454 
+-0.007421 -0.001307 -0.004295 -0.021672 -0.006415 -0.016632 
+-0.032200 -0.037333 -0.010733 -0.011772 -0.041825 0.008263 
+-0.010779 -0.021605 0.053802 -0.035974 -0.004270 0.016386 
+-0.019349 -0.011215 0.009958 -0.001320 0.001669 0.003805 
+0.007488 0.001863 -0.004091 -0.007590 -0.007005 -0.008172 
+-0.013032 -0.009407 0.008435 -0.000840 -0.001931 -0.000531 
+0.001480 -0.002158 -0.001902 -0.000746 0.000065 -0.000539 
+0.001197 0.001268 -0.000648 -0.000861 0.000560 0.002909 
+-0.004229 -0.003162 0.003199 -0.005114 -0.003382 0.001044 
+0.000236 0.001004 -0.001024 0.000728 0.004896 -0.003520 
+0.007353 0.000172 0.000941 0.011492 -0.014317 -0.006572 
+0.016610 -0.011157 -0.009343 0.017808 0.007022 -0.018329 
+0.013230 -0.000802 -0.003004 0.008771 0.000645 0.000022 
+0.008097 0.007751 -0.000816 0.005793 0.000336 -0.003967 
+0.005140 0.001075 -0.001316 -0.000158 0.002245 0.001297 
+-0.001363 0.003454 0.000405 -0.001352 0.003696 -0.001703 
+0.000532 0.000876 -0.004604 0.000652 0.000435 -0.002391 
+0.001267 -0.002748 -0.002425 0.003028 -0.001464 -0.004609 
+0.003633 0.000338 -0.005140 0.002809 0.002670 -0.005464 
+0.001234 0.002990 -0.002112 -0.001423 0.000642 0.000083 
+-0.001549 -0.002459 -0.001488 0.000852 -0.003594 0.000050 
+0.002934 0.000355 0.000228 0.003529 0.002279 0.000620 
+0.004423 0.000296 -0.002357 0.000216 0.002572 0.001630 
+0.002220 0.005350 0.000441 0.002700 0.001700 0.000375 
+0.000149 -0.002557 0.000877 -0.003774 -0.003226 0.001887 
+-0.001746 -0.000841 0.001762 0.002569 0.003458 -0.003097 
+0.006434 0.007150 -0.007386 0.009081 0.001718 -0.003190 
+-0.001358 0.007445 -0.001810 0.000282 0.001954 -0.003202 
+-0.001627 0.000123 -0.003315 -0.000686 0.000236 -0.003386 
+0.001012 -0.000156 -0.003775 0.003208 0.002781 -0.003508 
+-0.001493 0.004176 -0.003585 0.002012 0.004973 -0.003906 
+0.001680 0.002084 0.000098 -0.000198 0.000313 0.000155 
+0.000670 -0.000546 0.000456 0.000664 -0.000790 0.001275 
+-0.000010 -0.000129 0.000097 -0.000813 0.001149 -0.000969 
+-0.000600 0.001331 -0.000817 0.000951 0.001120 0.001437 
+-0.002765 0.003293 0.007019 -0.000527 0.000628 0.001247 
+-0.005063 -0.003326 -0.007952 -0.018717 0.020217 -0.023158 
+-0.007140 0.001894 0.001147 -0.014047 -0.005795 -0.001293 
+-0.010593 -0.009638 -0.006203 -0.032567 -0.021817 -0.008215 
+-0.045866 0.017840 -0.005096 -0.042933 0.003333 -0.013133 
+0.009409 -0.026795 -0.014409 -0.023175 -0.007851 0.002612 
+0.003113 0.018038 0.001151 0.012421 0.025188 -0.041401 
+-0.009618 -0.015733 -0.003555 0.001075 -0.007312 -0.006237 
+-0.000350 -0.009452 0.015926 -0.000780 0.002242 0.003062 
+0.002008 -0.000184 -0.001909 0.003257 0.000273 -0.001525 
+0.003633 0.001410 -0.003743 0.003227 0.000724 -0.001803 
+0.000921 -0.000950 -0.001125 -0.000458 -0.000657 0.005195 
+-0.001419 -0.000213 0.003550 -0.000567 -0.002094 0.000025 
+-0.010142 -0.014346 -0.014950 -0.019848 -0.055784 -0.010911 
+0.001382 -0.025686 0.003092 0.006062 -0.008246 0.001290 
+-0.004298 -0.007427 0.000360 -0.021050 -0.012699 0.008737 
+0.002250 0.011902 -0.007918 0.002797 0.008320 -0.004874 
+0.006876 0.006322 -0.002478 -0.000212 0.003651 -0.004560 
+-0.001044 0.006801 -0.002213 -0.000869 0.004638 -0.000781 
+0.001302 -0.000909 0.000769 0.003394 -0.001147 -0.007809 
+0.000158 0.001676 -0.004494 -0.000378 0.003276 -0.003044 
+-0.001140 0.002714 -0.001177 -0.002398 -0.000110 -0.002070 
+0.000084 0.000257 -0.000208 0.000106 -0.000057 -0.000139 
+-0.000933 -0.002683 -0.000618 -0.002261 -0.005605 -0.000693 
+-0.001129 -0.005740 -0.001207 0.001256 -0.002153 -0.000220 
+0.002076 0.000247 -0.000101 0.001328 0.003037 -0.001654 
+0.001179 0.002293 -0.000379 0.001195 0.001760 -0.003552 
+-0.000059 0.000726 0.000703 0.000351 0.001371 0.001406 
+0.000309 0.001246 0.001051 0.000887 0.001774 0.000887 
+0.000416 0.002388 0.000740 -0.001349 0.003135 -0.000437 
+-0.004550 0.001088 -0.001368 -0.003726 -0.000786 -0.001766 
+0.000155 -0.001647 -0.000274 0.002280 -0.000775 0.000570 
+0.000315 0.000945 -0.000630 -0.004567 -0.000077 0.000096 
+-0.008052 -0.003245 0.000281 -0.004894 -0.003730 -0.000612 
+0.001275 -0.003273 -0.003193 0.002694 -0.002669 -0.004136 
+-0.001369 -0.002230 -0.002661 -0.004839 -0.005665 0.001573 
+-0.004444 -0.004242 0.001382 -0.002204 -0.002211 0.000027 
+-0.003181 -0.003233 -0.000093 -0.005262 -0.006687 -0.001041 
+-0.000384 -0.004855 -0.000324 0.001072 0.000655 0.002643 
+0.002756 -0.003658 -0.002099 -0.005566 -0.012643 -0.001233 
+-0.003650 -0.025998 0.006553 -0.042720 -0.107851 -0.014163 
+0.011437 0.083931 0.015205 0.045397 0.071619 0.009491 
+-0.001507 -0.056414 -0.028081 0.019492 -0.052932 -0.022356 
+-0.009469 -0.030471 -0.005145 -0.028290 -0.019826 0.010247 
+-0.030550 -0.017672 0.020026 -0.023333 -0.033590 0.022393 
+0.004278 -0.002403 -0.007517 0.012647 0.004509 -0.009492 
+-0.002485 -0.002593 0.016095 -0.001191 0.005962 0.007382 
+0.012740 0.006401 -0.008564 0.002241 -0.000382 -0.002629 
+-0.002224 -0.000656 0.000943 -0.000184 0.000176 0.000953 
+-0.001123 0.000193 0.001617 -0.002428 0.001605 0.002022 
+-0.000018 -0.000230 -0.000614 0.000454 -0.001047 -0.001431 
+0.077107 -0.105956 -0.021596 0.047176 0.016365 -0.056804 
+-0.001523 -0.007987 -0.004733 0.000756 -0.020086 -0.005660 
+0.005470 -0.014767 0.005526 0.002962 -0.004048 0.002922 
+0.002436 0.001394 -0.002171 0.000412 -0.000217 -0.004005 
+0.000386 -0.000868 0.000436 -0.000173 0.000122 0.004592 
+0.000605 0.003832 0.002527 -0.001437 0.010038 -0.001854 
+-0.005111 0.006438 -0.005580 -0.002108 0.003651 -0.001142 
+0.000252 0.001227 -0.002295 -0.000084 -0.001533 0.001289 
+-0.003770 -0.006536 0.004776 0.000628 -0.000798 0.000863 
+0.000050 -0.002953 -0.001704 -0.002553 -0.000826 -0.001094 
+0.001201 -0.002669 -0.000955 -0.000516 -0.003733 -0.002003 
+-0.000749 -0.003549 -0.001172 -0.000497 0.000457 -0.000854 
+0.002919 0.000843 -0.004411 -0.000043 0.000172 -0.002602 
+0.002240 -0.000061 0.000245 0.000960 -0.001152 0.001220 
+0.001030 -0.002313 -0.000764 0.000207 -0.002707 -0.002917 
+-0.000791 -0.002539 -0.001974 0.000737 0.000937 -0.002131 
+-0.000426 0.003157 -0.003672 -0.000242 0.002387 -0.004517 
+0.002809 0.005922 -0.002177 -0.000120 0.004971 -0.003147 
+-0.000375 0.002253 -0.004351 -0.001077 -0.000769 -0.001846 
+-0.001097 -0.000543 -0.000877 0.000754 0.001587 0.000754 
+-0.002261 0.003492 0.005651 -0.002124 0.001934 0.001833 
+0.000269 0.000267 -0.000099 0.000053 0.001168 -0.000596 
+0.001673 0.003236 0.000012 0.001997 0.003314 -0.001253 
+0.001401 -0.000680 -0.001061 -0.000658 -0.002862 0.002695 
+-0.000589 -0.007177 0.004935 0.001854 -0.009064 0.007473 
+0.001874 -0.009446 0.010695 -0.000485 -0.008878 0.008217 
+-0.001507 0.000424 -0.002200 0.010506 0.010656 0.003204 
+0.018259 0.014660 -0.003586 0.023813 0.007474 0.005675 
+0.005268 0.042232 -0.006674 0.025185 0.101113 -0.011283 
+0.046465 0.034459 -0.013447 0.010875 0.004562 -0.000506 
+-0.023368 -0.009941 -0.008083 -0.029532 0.013709 0.021791 
+0.000000 0.016500 0.033000 -0.045385 -0.030256 0.038333 
+0.024024 0.021619 -0.018262 0.026675 0.022591 -0.006656 
+0.023873 0.019834 -0.003221 0.014599 0.014112 -0.008277 
+-0.000489 0.001078 0.002198 -0.001306 0.000073 0.001212 
+0.005286 0.001501 -0.002784 0.004686 -0.000650 -0.003699 
+0.004124 0.000626 -0.002990 0.003504 -0.000171 -0.001790 
+0.002176 -0.000988 -0.001897 0.002410 -0.001560 0.000402 
+-0.036386 -0.006249 -0.052561 -0.025107 0.010871 -0.010476 
+0.010819 -0.020641 -0.010214 0.004314 -0.014644 -0.005745 
+-0.004213 -0.018795 0.004102 -0.006999 -0.016947 0.003076 
+-0.003277 -0.007290 -0.000307 0.004852 0.003824 0.000547 
+0.009498 0.007124 -0.003134 -0.001628 0.000077 -0.003231 
+-0.001485 -0.006480 -0.003392 -0.004064 -0.006255 -0.004012 
+0.005519 0.002943 -0.013528 0.003144 0.005571 -0.014980 
+0.003114 0.004864 -0.009862 0.003527 0.003556 -0.006151 
+0.004338 -0.000560 -0.001539 0.000960 -0.002177 -0.001601 
+0.001999 0.005348 -0.000158 0.003509 0.003974 -0.002354 
+0.001596 0.000117 0.000386 0.001876 -0.004880 -0.000704 
+0.001121 -0.003182 -0.001982 -0.000431 -0.000262 -0.001816 
+-0.000305 0.000000 0.000305 0.000125 0.000250 -0.000156 
+-0.000855 0.001851 -0.001225 0.000358 0.002788 -0.000460 
+0.001822 0.000909 0.000701 0.001761 -0.002775 0.000157 
+-0.001238 -0.005534 0.001232 0.000517 -0.001924 0.000505 
+-0.000774 0.001484 -0.003483 0.000187 0.000355 -0.002632 
+-0.000233 0.000328 0.001235 0.000827 0.000495 0.001486 
+0.001258 -0.001370 -0.000427 -0.001988 -0.001355 -0.001461 
+-0.002992 -0.000913 -0.000457 -0.002362 0.000378 -0.000189 
+-0.001277 0.000789 -0.000970 -0.000243 0.001201 -0.001258 
+-0.000290 0.000724 -0.000076 0.002601 0.001048 0.001120 
+0.001430 0.001678 0.000364 -0.000764 -0.002681 0.002295 
+0.001282 0.000335 0.005580 0.002745 -0.001678 0.003934 
+0.002049 0.001347 0.001939 0.003209 0.006594 -0.000991 
+0.002752 0.007749 -0.001376 0.000411 -0.000893 0.004849 
+-0.010640 -0.014772 0.014740 -0.007324 -0.012551 0.010413 
+0.012255 -0.004498 0.003154 0.013923 -0.000355 0.006546 
+0.001933 0.015526 -0.009656 0.003913 0.043073 -0.024637 
+0.009158 0.035693 0.011330 0.024622 -0.010978 0.013111 
+0.013846 -0.034231 -0.010000 -0.095612 -0.038342 0.035026 
+-0.109909 -0.018727 0.063091 -0.096552 0.013103 0.081839 
+0.038831 0.081688 0.032792 -0.019796 -0.014898 0.011837 
+-0.004630 -0.010387 -0.011764 0.025994 0.011511 -0.017834 
+0.000033 0.006418 0.008636 -0.010970 -0.015517 -0.003280 
+0.007337 0.000748 -0.005185 0.010769 0.004531 -0.003799 
+0.005146 0.001548 -0.002698 -0.001154 0.001088 -0.001352 
+-0.008127 -0.001803 0.001457 -0.003856 -0.002059 -0.000376 
+-0.001990 -0.012391 0.006356 0.019167 -0.017787 0.006312 
+0.039188 -0.002332 -0.019470 0.013613 -0.006684 -0.006631 
+0.008098 -0.010954 0.001709 0.002414 -0.010096 0.002819 
+-0.000365 -0.002433 0.001535 0.000750 0.002192 -0.000452 
+-0.001279 0.001440 0.003363 0.000983 -0.002916 0.001212 
+-0.000938 -0.005287 -0.002605 -0.006002 -0.001124 -0.009297 
+-0.003689 0.007404 -0.007441 -0.001621 0.003997 -0.001426 
+-0.000562 0.000028 0.000549 0.001814 -0.000321 -0.000342 
+0.002602 -0.000793 0.000791 0.005046 -0.000286 -0.001222 
+0.004082 0.003501 -0.002397 -0.002465 0.000968 -0.000125 
+-0.001708 -0.000551 -0.001830 0.000073 0.000034 0.000203 
+0.002315 -0.000024 -0.002120 0.000908 0.000823 -0.004073 
+-0.003514 -0.000423 -0.003643 -0.006032 -0.002063 -0.001905 
+-0.002662 -0.004957 -0.000765 0.000464 -0.001915 -0.001769 
+0.000756 0.001765 -0.001849 0.002762 0.002194 -0.002274 
+-0.000876 0.003806 -0.006462 0.000171 0.005774 -0.009945 
+-0.000672 0.004873 -0.009247 0.001450 0.000000 -0.003740 
+-0.000667 -0.000949 0.000564 -0.000926 -0.000304 -0.000859 
+-0.000655 -0.002755 -0.002128 -0.000290 -0.001025 -0.000094 
+0.000406 0.001325 -0.000243 -0.001129 -0.000098 0.000552 
+-0.002077 -0.002413 0.001413 -0.001176 -0.001250 -0.001250 
+0.000597 -0.000761 -0.001378 0.000335 -0.001690 -0.001691 
+-0.000540 -0.000635 -0.000937 -0.000772 0.000664 0.000099 
+0.000953 0.001946 -0.000835 0.000323 -0.000603 -0.000445 
+0.002214 -0.001419 0.001945 0.001714 -0.000408 0.002783 
+0.002326 0.001652 0.002729 0.002584 0.003490 0.000929 
+-0.000432 0.002976 -0.003748 -0.002532 0.004489 -0.006088 
+0.002148 0.008620 -0.007470 0.006757 0.014627 -0.008363 
+0.001709 0.017177 -0.012262 -0.013141 0.005257 -0.020238 
+0.011320 -0.076067 -0.034410 0.089198 -0.075802 0.007443 
+-0.014693 0.086214 -0.003010 0.042741 -0.017726 -0.034140 
+0.054312 0.035182 -0.046660 0.051732 0.066878 -0.121756 
+0.003143 0.043429 -0.032857 -0.054741 -0.052773 0.008587 
+-0.065678 0.001370 -0.038037 -0.065332 -0.048891 0.000186 
+-0.003411 0.003906 0.009132 -0.025052 -0.003029 0.007956 
+0.020426 0.014154 -0.000946 0.013788 0.007072 -0.005628 
+-0.001057 -0.001346 -0.000097 -0.000196 -0.001491 -0.000822 
+0.002018 -0.001509 -0.001659 -0.000679 -0.003973 0.001106 
+-0.004315 0.014461 -0.015539 0.014853 -0.014287 -0.015207 
+0.013884 -0.007672 -0.010294 0.007164 -0.007398 -0.000443 
+0.002846 -0.010133 0.006457 -0.001613 -0.013862 0.004124 
+0.003824 -0.005686 0.002255 0.002056 0.003707 -0.003443 
+-0.001777 -0.000496 -0.000433 -0.000327 -0.000646 -0.001994 
+-0.000612 -0.010952 0.003470 -0.006639 0.000788 0.000125 
+-0.000796 0.001200 -0.000313 -0.000614 0.003341 -0.002128 
+0.001102 0.001343 -0.001432 0.000666 -0.002299 -0.002076 
+0.000297 -0.003348 -0.000975 -0.000201 -0.000621 0.000079 
+0.000233 0.003256 0.001085 -0.000420 0.003044 0.002696 
+-0.000805 0.001231 0.000556 -0.001775 -0.003000 -0.000592 
+-0.000083 -0.001039 0.000260 -0.001052 0.003451 -0.002514 
+-0.000269 0.005297 -0.002188 0.000521 0.003175 0.000390 
+0.005244 0.003243 -0.000414 0.004710 0.001763 0.001546 
+0.002490 0.002256 -0.000759 -0.001416 0.000348 -0.000932 
+-0.003124 0.000659 0.001026 -0.000751 -0.001700 0.000840 
+-0.001196 -0.001995 -0.002005 -0.004427 -0.001220 -0.003972 
+0.000369 0.000036 -0.003798 -0.001314 0.000669 -0.004888 
+-0.003938 -0.002197 -0.001410 -0.000506 0.001104 0.000461 
+-0.002429 0.000502 0.001802 -0.001051 -0.000897 -0.000487 
+0.001556 0.000610 0.000880 0.002428 0.001594 0.001851 
+0.000549 0.000417 0.000874 0.000094 -0.000513 -0.003126 
+-0.001176 -0.001489 -0.003724 -0.001689 -0.001736 0.001206 
+-0.001839 -0.003507 0.001954 -0.003010 -0.001324 -0.000722 
+0.003100 0.001111 -0.005379 0.000932 0.005743 -0.008289 
+0.002332 0.007143 -0.008271 -0.000722 0.002854 -0.005639 
+-0.003651 -0.000335 -0.000588 -0.000609 -0.000074 0.000525 
+-0.001488 -0.000109 -0.000042 0.000090 0.001116 -0.001622 
+0.000866 0.005814 -0.004048 -0.003905 0.005202 -0.005762 
+-0.025259 -0.012770 -0.030418 0.019259 -0.053704 0.040741 
+-0.059600 0.048240 0.038320 -0.014465 0.050629 -0.084444 
+0.067778 0.000556 -0.068889 0.009864 -0.035782 -0.032109 
+0.011944 -0.033056 0.005278 -0.070122 0.045000 0.087652 
+-0.025556 0.083333 0.000000 -0.021118 0.075197 0.009079 
+-0.010442 0.003674 0.007241 -0.026273 0.015125 0.010674 
+0.006843 -0.005152 -0.007028 0.007052 0.005906 -0.000999 
+0.007426 0.001557 -0.001989 0.012275 -0.000914 -0.004402 
+0.006482 0.002648 -0.001285 0.000106 0.003760 0.001678 
+0.007115 0.000444 0.010179 0.015766 -0.033036 0.017844 
+0.006518 -0.010072 0.000137 0.008394 -0.011221 0.001146 
+0.001347 -0.012880 0.007622 0.005648 -0.014990 0.001793 
+0.000619 -0.004082 0.003459 -0.000252 -0.001020 0.000558 
+-0.003155 -0.000901 0.003856 0.000499 -0.003830 0.003890 
+-0.000562 -0.001269 -0.000805 -0.002415 0.003088 -0.006549 
+-0.002470 0.006142 -0.004113 -0.001639 0.002419 0.000340 
+-0.000970 -0.001624 0.000940 0.002192 0.000980 0.001672 
+-0.002913 0.000872 0.000363 -0.003472 -0.000493 -0.000874 
+-0.000934 -0.001917 -0.001847 0.001431 -0.002348 -0.001268 
+0.001250 -0.000417 -0.001833 -0.000591 -0.001004 -0.000827 
+-0.002630 -0.002140 0.000328 -0.001380 -0.001489 -0.000055 
+0.000509 0.001313 -0.001720 0.001048 0.002426 -0.002327 
+0.000703 0.000885 -0.001264 0.000505 -0.000058 0.000933 
+0.001480 -0.000720 0.001480 0.002476 -0.000651 0.000566 
+0.001422 -0.001424 -0.000010 0.000579 -0.000058 0.000015 
+0.000538 0.000707 0.000158 0.000516 0.000070 0.000300 
+-0.000885 0.000435 0.000075 -0.000642 0.000642 -0.001284 
+0.004042 0.000663 -0.003189 0.006126 0.000850 -0.003721 
+0.006462 0.001434 -0.000137 0.004398 -0.000247 0.000798 
+0.002720 -0.000745 -0.000209 0.000216 -0.000448 -0.000082 
+-0.002326 -0.000140 0.000279 -0.003909 -0.001396 0.000055 
+-0.003710 -0.000572 0.000850 -0.002514 -0.001103 -0.000392 
+-0.002312 0.002071 0.000048 -0.000331 0.001159 0.000763 
+0.000851 -0.000526 -0.001436 0.001599 -0.002775 -0.000884 
+-0.001123 -0.001143 -0.001068 0.000107 0.000192 -0.001340 
+0.001873 0.000980 0.000588 0.001349 -0.000107 0.002686 
+0.003416 -0.001122 0.001410 0.005018 0.001675 0.002099 
+0.002209 -0.001283 0.004239 -0.001374 -0.009291 0.003048 
+-0.010505 -0.019809 -0.008692 -0.010278 0.063611 -0.033889 
+0.028284 0.053824 -0.100049 -0.008480 0.014854 -0.019123 
+0.007576 0.022525 -0.045253 0.040119 -0.011905 0.021310 
+0.005373 -0.017127 0.020570 -0.041060 0.025983 0.017162 
+-0.044167 -0.045833 0.003333 -0.035909 -0.035909 0.010000 
+-0.048861 -0.000013 -0.006113 -0.077081 0.016119 -0.001201 
+-0.017131 -0.012887 0.006601 0.006134 -0.001126 -0.004925 
+0.027278 0.004603 -0.006586 0.016395 0.002659 -0.003349 
+-0.001644 0.002724 0.002608 -0.006956 0.000184 0.002312 
+-0.001369 0.004672 -0.002300 -0.002660 0.000547 -0.001877 
+-0.001038 -0.001817 0.001953 0.000046 -0.001897 0.000709 
+0.000303 0.000224 0.000751 0.001298 0.000771 -0.000984 
+-0.001359 0.001655 -0.001985 -0.000411 -0.000617 -0.002801 
+-0.001062 -0.000169 -0.003206 0.001069 0.001838 -0.005044 
+0.001314 0.003486 -0.005600 -0.002930 -0.005106 0.001833 
+0.002295 0.000870 -0.000795 0.002673 0.004664 0.000862 
+0.002704 -0.006266 0.002789 -0.004167 -0.028911 -0.000738 
+0.026828 -0.000696 0.002875 0.023171 0.020383 -0.056396 
+-0.064344 0.067770 0.038328 -0.041633 -0.042449 0.083673 
+0.096959 -0.013548 0.060461 0.002011 0.000862 0.010000 
+0.006381 0.010095 -0.008476 -0.000574 0.035980 -0.010854 
+0.016419 0.032788 -0.019130 -0.012747 0.022418 0.002527 
+0.003486 0.022630 0.031916 0.047000 0.000000 0.052000 
+0.014074 -0.025926 0.011852 -0.080000 -0.021000 0.053000 
+0.001552 -0.060388 0.008325 -0.009916 -0.022054 -0.016207 
+0.010560 -0.012134 -0.017933 0.004545 -0.001136 0.004545 
+-0.002915 -0.054451 0.032414 -0.084552 -0.029575 -0.061297 
+0.060902 -0.083008 0.062707 -0.003638 0.050931 -0.004444 
+0.008622 0.023592 -0.015430 -0.002438 0.012270 0.001521 
+-0.006553 0.008084 -0.002830 -0.011503 0.049408 0.042478 
+0.012500 -0.001250 -0.001250 0.051964 -0.055179 0.050357 
+0.019444 -0.002838 -0.011798 0.037280 -0.022252 0.010223 
+0.010500 -0.070200 -0.076100 -0.052611 -0.003319 -0.046736 
+-0.023333 0.021790 0.001981 -0.093017 -0.098685 0.062631 
+-0.075000 -0.016875 -0.033125 -0.020000 0.109333 0.054667 
+-0.045556 -0.114722 -0.011806 -0.125727 -0.019591 -0.103409 
+-0.131905 0.053952 -0.201857 -0.103051 -0.038915 0.022915 
+-0.053933 -0.034956 0.042697 -0.008696 -0.013043 0.013043 
+-0.002861 -0.012943 0.010097 -0.007717 -0.017245 0.004108 
+-0.002701 -0.000862 0.003799 0.006026 0.003593 -0.013895 
+0.005667 -0.003848 -0.004314 -0.004247 -0.003735 0.008641 
+-0.004623 -0.001887 0.002268 0.000047 0.000300 0.000648 
+0.004972 -0.005856 -0.008057 0.022756 -0.002350 -0.021688 
+0.017986 -0.004938 -0.003268 -0.004365 -0.003853 0.001898 
+-0.007682 0.000312 -0.001850 0.001782 0.001513 -0.003952 
+0.016440 0.009177 -0.007611 0.016470 0.025373 -0.018646 
+0.004273 0.017717 -0.010843 -0.005752 -0.000930 0.001770 
+0.001156 0.000992 -0.001158 0.001615 -0.000457 -0.000640 
+0.001560 -0.000505 -0.001527 -0.000787 -0.000199 -0.000382 
+-0.000886 -0.005542 0.001164 -0.000666 -0.002549 -0.002781 
+0.001188 0.000046 -0.000931 0.000476 0.003580 -0.001841 
+0.002226 0.004010 -0.003225 0.002496 0.007204 -0.006511 
+0.001789 0.008806 -0.011565 -0.000071 0.002567 -0.000870 
+-0.003716 0.002142 0.001782 0.001241 0.001465 0.000792 
+-0.002806 0.002475 -0.001960 -0.016152 0.010074 -0.017157 
+0.012272 0.006386 -0.002946 -0.027899 0.004021 -0.070979 
+-0.061250 0.001000 -0.002000 -0.029135 -0.019423 -0.010000 
+0.030238 0.009286 0.001190 -0.001156 -0.055646 -0.030136 
+-0.003082 -0.040721 -0.060459 -0.022238 -0.039441 -0.048531 
+0.004449 0.037632 -0.038522 -0.025074 0.041789 -0.040000 
+-0.010368 0.092500 -0.017279 -0.010000 0.108857 0.036286 
+0.008750 -0.033750 -0.008750 -0.101667 -0.037692 -0.025128 
+-0.020176 -0.041122 -0.044696 -0.006014 -0.033986 -0.020350 
+-0.016997 0.021827 0.014489 0.008704 -0.023445 0.014390 
+0.069805 -0.066494 0.076429 0.000000 0.000000 0.000000 
+-0.070584 -0.070649 -0.023571 -0.008889 0.004444 0.013333 
+0.023893 0.007978 -0.010891 -0.005402 -0.009062 -0.002963 
+-0.023169 -0.020767 -0.018885 0.033333 0.057333 -0.028667 
+0.034550 -0.005338 0.017455 0.059667 0.012667 -0.034333 
+-0.013076 -0.019581 0.001403 -0.011700 -0.010877 -0.004738 
+-0.008750 -0.035000 0.006250 0.038000 0.032000 0.024000 
+-0.036234 -0.033185 0.070290 -0.061929 -0.080692 0.053616 
+0.000202 0.005859 -0.005051 0.016667 0.030000 0.011667 
+-0.037891 -0.013197 0.015646 -0.047333 0.006167 -0.000833 
+0.012267 0.075000 -0.009200 0.006916 0.040303 -0.068574 
+-0.001010 0.014950 -0.037981 -0.028785 -0.028796 -0.005228 
+-0.024868 -0.028465 0.010789 -0.017315 -0.003958 0.013256 
+-0.001533 0.000835 0.000010 -0.007627 -0.006991 -0.007368 
+0.000061 -0.004643 0.006919 -0.001108 0.005511 0.001308 
+-0.005206 0.007204 -0.007239 -0.005650 0.006102 0.001618 
+-0.007661 -0.000087 0.021980 0.004072 -0.010530 0.013617 
+0.000693 -0.006269 0.003142 0.003869 -0.009330 0.004672 
+-0.018366 -0.047760 0.017845 -0.005841 -0.036829 0.001683 
+0.002825 -0.004425 0.003980 0.002503 0.002177 0.004736 
+-0.005611 0.006082 0.004147 -0.017778 -0.001444 0.018778 
+0.002506 -0.000807 -0.005267 -0.000954 -0.000095 -0.003669 
+-0.003326 0.000623 -0.002452 -0.002020 0.002361 -0.002127 
+0.000062 0.003335 -0.002694 0.000969 0.002917 -0.001945 
+0.002186 0.001040 -0.002458 0.004116 0.001504 -0.001192 
+0.000904 0.009508 -0.000121 -0.000097 0.016661 -0.007977 
+0.001183 0.018473 -0.017601 0.000482 0.013171 -0.009429 
+0.002789 0.013687 0.005246 0.004769 -0.000065 0.000515 
+-0.013788 -0.029010 -0.003539 -0.030960 -0.021183 -0.003171 
+0.013580 0.016728 0.009938 0.000197 -0.001368 -0.004009 
+-0.026200 -0.034933 -0.001667 -0.054941 -0.062588 0.038941 
+-0.050000 -0.068000 0.000000 0.000538 -0.051385 -0.017846 
+-0.028377 -0.014351 -0.070779 0.057321 -0.006830 -0.094152 
+0.050055 0.005027 -0.078852 0.031667 0.053667 -0.042667 
+-0.007037 0.059259 -0.066296 -0.054444 0.043333 -0.014444 
+-0.045556 0.000000 0.000000 -0.042222 -0.012222 -0.024444 
+-0.032157 -0.008824 -0.027320 -0.081388 -0.139522 0.046507 
+-0.085385 0.000000 0.074615 -0.031974 0.007013 0.060857 
+0.051371 -0.018707 -0.005792 0.072500 -0.106250 0.095000 
+-0.088604 -0.126658 0.077244 0.017333 0.003667 -0.016333 
+0.059654 0.038385 -0.044891 0.041229 0.010082 -0.000106 
+0.001632 0.024353 0.006060 -0.010000 -0.002143 0.017857 
+0.057273 0.032727 0.024545 0.117000 0.036000 0.039000 
+-0.024822 -0.071178 -0.003863 -0.065464 -0.093157 -0.041857 
+-0.103333 0.000000 -0.060000 -0.110707 -0.053535 -0.103434 
+-0.028312 0.006753 0.012468 -0.033254 0.012475 0.004621 
+-0.015571 0.062143 0.010286 0.005362 0.001498 -0.007101 
+0.035046 0.016733 0.031049 -0.164516 0.076129 -0.070323 
+-0.012060 0.036661 -0.049489 -0.005581 0.022891 -0.025414 
+0.016582 0.036434 0.004648 -0.005774 0.018050 -0.019180 
+-0.025722 -0.020175 0.008731 -0.029101 0.001828 0.003744 
+-0.027086 -0.000596 0.001424 -0.011711 -0.009801 0.017392 
+-0.016715 -0.011211 0.003952 -0.005280 0.000166 0.004462 
+0.016502 -0.002227 -0.009511 0.038522 0.010513 -0.028958 
+-0.002771 -0.002484 0.001529 -0.009244 -0.025459 0.013622 
+0.010680 -0.011868 0.009220 0.007571 -0.013571 0.015143 
+0.008783 -0.012857 0.004941 -0.004128 0.008788 -0.003158 
+-0.003110 0.023650 -0.011681 -0.001554 -0.006685 0.005053 
+-0.000206 -0.053063 0.031309 0.011689 -0.025227 0.012971 
+0.000698 -0.000540 -0.001698 -0.001929 -0.000170 -0.000094 
+-0.002689 -0.000980 -0.000122 -0.001727 0.000759 -0.000051 
+-0.001289 0.003740 -0.001019 -0.000640 0.004452 -0.005424 
+0.002682 0.002000 -0.001473 -0.002964 0.000427 -0.002226 
+-0.002103 0.001867 -0.004786 -0.001221 0.008576 -0.006904 
+0.002827 0.017263 -0.012253 0.006557 0.023305 -0.018089 
+-0.000551 0.010245 -0.009711 -0.002368 0.002397 -0.000665 
+-0.000347 -0.005663 0.002196 -0.000935 -0.019536 0.013233 
+0.006126 0.002261 0.001809 0.008651 0.004142 0.000568 
+-0.032286 -0.006857 -0.014286 -0.024470 -0.042869 -0.011193 
+0.000000 -0.115000 -0.065000 0.015802 -0.005525 0.007068 
+-0.003309 -0.005000 -0.013235 -0.009150 0.002752 -0.015274 
+-0.022476 0.007095 -0.002952 -0.033086 -0.004938 0.011605 
+0.104444 -0.114222 0.057111 0.060256 0.055556 0.012051 
+0.029375 0.014375 0.007500 0.021667 0.015417 0.037083 
+-0.044000 0.029000 -0.043000 -0.043761 -0.085556 -0.065641 
+0.020952 -0.046190 -0.025238 0.030392 -0.046961 -0.001373 
+0.022500 0.117000 0.039000 -0.030175 -0.008947 -0.033158 
+-0.036429 -0.058571 0.036429 -0.002500 0.192500 -0.095000 
+-0.016034 -0.023563 0.017403 -0.001538 0.008850 0.003933 
+-0.031765 0.065824 0.018176 -0.081746 -0.029683 -0.013016 
+-0.027364 -0.034858 -0.004496 0.054952 0.071095 0.021810 
+0.005778 0.013778 0.039111 0.075854 0.029055 -0.085945 
+-0.088667 -0.022190 0.013333 -0.104215 -0.098084 -0.039847 
+-0.030033 0.042933 0.011167 -0.000980 0.015098 0.014902 
+0.000855 0.084658 -0.029359 -0.011985 0.019975 -0.002500 
+-0.021061 -0.006122 0.014673 -0.018933 0.007924 -0.007424 
+0.005287 0.004800 -0.035777 0.003270 -0.007449 -0.015354 
+0.008992 -0.002632 -0.014146 -0.007788 -0.004448 0.005315 
+-0.005961 -0.008888 0.000446 -0.010393 -0.006253 -0.004333 
+-0.031227 -0.008365 0.005815 -0.012565 0.003626 -0.007151 
+-0.030817 0.006162 0.007200 0.016287 0.030300 -0.085686 
+0.056818 0.072813 -0.059806 0.107243 0.080250 -0.000653 
+-0.000572 0.003720 -0.002114 -0.000447 -0.002440 -0.005542 
+0.006338 0.003771 0.006248 0.040871 0.012000 0.019233 
+0.034762 0.019524 0.007619 -0.004851 0.016885 -0.008637 
+-0.049429 -0.037694 0.015205 -0.084022 -0.009329 -0.012515 
+-0.056960 -0.029815 -0.011817 -0.032522 -0.085008 0.020212 
+-0.001985 0.000397 -0.004051 -0.001489 0.001138 -0.004569 
+0.001473 -0.000060 -0.005954 -0.000097 0.003092 -0.001570 
+-0.002509 0.001843 -0.001524 -0.002136 -0.001150 -0.001939 
+0.001263 -0.003081 0.001338 0.001331 -0.000819 0.004713 
+-0.005775 -0.001538 0.002666 -0.003160 0.001396 -0.005398 
+0.003699 0.013931 -0.009199 0.007183 0.016100 -0.009536 
+0.006049 0.012390 -0.005783 0.008559 0.016565 -0.004060 
+0.015717 0.021346 -0.001641 0.004788 -0.001615 0.006596 
+-0.019133 -0.031584 0.023688 -0.018164 -0.032187 -0.000189 
+0.040909 0.016524 -0.066096 -0.041099 -0.010220 0.000110 
+-0.029229 0.033621 0.063229 0.011367 -0.003498 0.037059 
+0.005371 -0.000028 0.019899 0.057521 0.020074 -0.012094 
+-0.011538 0.007692 -0.067500 -0.000833 0.025417 -0.027083 
+-0.006176 -0.019824 -0.010235 -0.014444 -0.019889 -0.059667 
+-0.015833 -0.024833 -0.020333 -0.026503 0.002308 -0.007832 
+-0.034167 -0.016985 -0.028309 -0.009242 -0.002424 0.004394 
+0.036488 0.013537 0.008244 0.051174 0.006941 0.019938 
+0.025000 0.001110 0.014434 -0.065354 0.006455 -0.000402 
+-0.053519 0.005926 -0.065370 -0.123617 0.148225 0.004149 
+-0.103829 -0.052689 0.045044 -0.043980 -0.068291 -0.010763 
+-0.045556 -0.091111 0.034444 0.006667 0.024583 0.045833 
+0.000000 0.000000 0.000000 0.017500 0.068235 0.017059 
+0.075529 0.109663 0.063365 0.144887 0.085188 -0.004361 
+-0.120000 -0.003600 -0.007200 0.043061 0.113469 -0.054694 
+-0.024444 0.043333 -0.082222 -0.066333 0.041667 -0.049333 
+-0.050707 0.033131 0.007778 -0.002831 0.002683 0.006804 
+0.008420 -0.014031 -0.000177 0.016029 0.001370 -0.011388 
+0.005638 0.008354 -0.030905 -0.003759 0.008279 -0.026407 
+-0.005000 0.003333 -0.003333 -0.008739 0.001769 -0.001072 
+0.006706 -0.007544 0.017692 -0.019256 -0.037132 0.047031 
+-0.001077 -0.001975 0.007273 -0.007822 -0.003978 0.016396 
+-0.019448 -0.005285 0.015145 -0.005037 0.022926 0.001873 
+0.027753 0.054117 0.017206 -0.005000 -0.011375 -0.034125 
+-0.015204 0.042637 -0.004975 -0.014379 0.022900 0.003606 
+-0.007277 0.009420 0.000371 0.000514 0.020401 0.001714 
+-0.007734 0.008632 0.001725 -0.028125 -0.016875 0.000000 
+-0.048750 -0.061585 0.049268 -0.054424 0.017014 0.000683 
+-0.057591 0.036111 -0.005759 -0.036973 -0.037960 0.015728 
+-0.001904 -0.003415 -0.002176 -0.001545 -0.005762 -0.002226 
+-0.001411 -0.005562 -0.001577 -0.002590 -0.002980 -0.002076 
+-0.000811 -0.000813 -0.002166 -0.000660 0.000063 0.002909 
+-0.002963 -0.002285 0.002925 -0.000467 0.000838 0.003818 
+0.000970 0.000498 -0.000177 0.001582 0.007278 -0.000755 
+-0.000231 0.010567 0.001808 0.002601 0.012842 0.000400 
+0.006425 0.009637 0.002078 0.006773 0.012448 -0.002742 
+0.012514 0.015733 -0.015079 0.006882 0.004545 -0.004154 
+-0.001173 -0.007423 0.015101 -0.002665 -0.016839 0.032432 
+0.076019 0.080370 -0.042130 -0.002411 0.039827 0.006197 
+0.018270 0.065017 0.015624 -0.014056 -0.032296 0.107514 
+-0.014463 0.002393 0.021269 0.001033 -0.000562 0.003386 
+0.009195 0.008912 0.001349 0.034303 -0.009008 0.027681 
+-0.024667 -0.049333 0.001667 -0.005667 0.011333 0.014167 
+-0.010647 0.036647 0.031529 0.094835 0.068923 -0.056055 
+0.000000 0.071333 -0.034667 0.050205 0.043359 -0.011410 
+0.029555 -0.025101 0.026883 0.011467 -0.077067 0.040000 
+-0.027891 -0.096370 -0.036772 0.053488 0.015756 -0.072976 
+-0.025017 0.053333 -0.056289 -0.125384 0.015714 0.019290 
+-0.053264 -0.083583 0.041494 -0.053929 -0.063214 0.058571 
+-0.037176 -0.013941 -0.051538 0.003326 0.002661 -0.069091 
+0.072222 0.000000 -0.042222 0.000000 0.015455 -0.074545 
+-0.066516 0.027149 -0.025792 -0.006335 -0.039729 0.053258 
+-0.005989 -0.069947 0.060963 0.009070 0.062558 -0.047442 
+0.033333 0.000000 -0.050000 -0.028729 -0.033518 -0.006000 
+0.000679 0.075445 -0.059540 -0.004238 0.015183 -0.031433 
+0.000400 0.000533 -0.014167 0.011763 -0.005992 0.000706 
+0.009146 -0.009661 0.003747 0.008625 0.011398 0.001344 
+-0.000542 0.016776 -0.004328 -0.016713 0.020524 -0.002098 
+-0.006278 0.046033 0.014200 -0.016667 0.033252 0.010758 
+0.007806 0.004082 0.000509 0.000649 0.037132 -0.028812 
+-0.007255 0.009412 -0.001438 0.016202 -0.026543 0.018269 
+0.013847 -0.007133 0.002621 0.002485 0.022030 -0.009601 
+-0.004072 0.050394 -0.021002 -0.004583 0.025019 -0.011047 
+-0.017743 -0.022237 0.003145 -0.060544 -0.042754 -0.011590 
+-0.108199 -0.021429 0.004809 0.000887 -0.013185 0.000462 
+0.010195 -0.023324 0.000419 0.008947 -0.027616 -0.006904 
+0.004472 -0.004753 -0.004194 -0.011163 0.017345 -0.001872 
+-0.001831 0.001114 -0.002446 -0.003693 -0.002667 -0.002077 
+-0.004551 -0.003126 0.002464 -0.000741 0.000158 0.001643 
+0.000564 -0.000336 0.000372 0.000440 0.000779 -0.000541 
+-0.001340 0.000061 -0.000627 -0.003454 0.000868 -0.004315 
+0.000393 0.003240 -0.000908 -0.001526 0.004742 -0.002003 
+0.000846 0.008626 -0.002098 -0.000359 0.009602 -0.000046 
+-0.000602 0.005401 0.003878 0.004454 0.005504 0.004731 
+0.002081 0.006501 -0.000927 0.000247 0.000937 0.001540 
+0.001728 -0.011627 0.010469 0.008617 -0.027083 0.018559 
+-0.011101 -0.016508 -0.003413 -0.004050 -0.020201 -0.050275 
+-0.027286 -0.013383 -0.051475 -0.010041 -0.027364 0.036333 
+-0.006628 -0.005549 0.008941 -0.002059 -0.013088 0.017206 
+0.000809 -0.024146 0.008130 0.003404 0.000303 0.006051 
+-0.010625 0.033125 -0.010000 0.015000 -0.028700 0.004100 
+-0.007125 -0.035000 -0.002375 0.107268 0.061876 -0.019271 
+0.038130 0.052215 -0.023618 0.008434 0.028460 0.007374 
+0.082884 0.067116 -0.039418 0.034286 -0.075714 -0.041429 
+-0.030667 -0.077667 -0.016333 0.069918 -0.037494 -0.048135 
+0.012607 0.063034 -0.048889 -0.005057 -0.012830 -0.019182 
+0.001850 -0.028361 -0.019728 0.067661 -0.016774 0.033790 
+0.029118 -0.009706 -0.038824 0.016484 -0.028352 0.047143 
+-0.065000 -0.073667 -0.026000 -0.071827 0.026250 0.047885 
+0.012597 0.020649 0.036753 0.007185 -0.008352 0.044093 
+0.034444 0.009732 0.024330 0.020400 0.010200 -0.009000 
+0.022206 0.005154 0.018400 0.075000 -0.050000 0.000000 
+0.024690 0.037439 -0.024151 0.033916 0.045944 -0.037762 
+0.013116 0.002389 0.006310 0.007333 0.007165 -0.050548 
+0.099800 0.125043 -0.015296 0.024471 0.036552 0.015275 
+0.034375 -0.015745 -0.078726 -0.026824 0.020986 -0.045759 
+-0.038466 -0.018717 -0.010011 0.009138 0.019524 0.001235 
+0.011204 -0.003718 -0.003599 -0.020386 0.002755 0.019063 
+-0.001212 -0.002524 0.003155 0.004030 -0.003510 0.001269 
+-0.007487 -0.004305 0.003948 -0.007078 0.002326 -0.001385 
+0.002245 0.012314 -0.007981 0.008543 0.015730 -0.006669 
+0.005353 0.013876 -0.003253 -0.008598 0.007537 -0.005298 
+-0.031943 -0.011547 0.004473 -0.020377 -0.029057 0.011792 
+-0.001452 -0.017150 0.002652 -0.022415 0.029415 -0.000476 
+-0.024000 0.069606 0.016159 0.009378 -0.002774 -0.000551 
+-0.002515 0.001345 -0.000618 -0.004532 0.002481 -0.002982 
+-0.005469 0.002578 -0.004080 -0.004849 -0.002196 -0.002973 
+-0.001578 0.000329 -0.002757 -0.001209 0.000933 -0.002246 
+-0.001624 0.002177 -0.004614 0.000910 0.002228 -0.006780 
+-0.001705 0.004011 -0.003342 -0.000085 0.002655 -0.002612 
+0.001248 0.003915 0.000294 0.001043 0.003708 0.002755 
+-0.000506 0.001573 0.006573 0.000823 0.002190 0.009049 
+0.000987 0.011197 0.002341 -0.003575 0.016550 -0.006153 
+-0.002014 0.007031 -0.004794 0.001916 -0.009064 0.003547 
+-0.006949 -0.034966 0.008120 -0.006140 -0.016667 -0.020614 
+-0.012656 -0.010842 -0.003339 0.015696 0.003934 -0.010585 
+0.020194 0.002524 -0.000741 0.015025 -0.003717 0.004618 
+0.015481 0.001390 0.014059 0.033832 -0.028890 0.024275 
+-0.071039 -0.027078 0.060844 -0.014697 -0.044394 0.014848 
+-0.008500 -0.065000 -0.008500 0.088636 0.053864 -0.011591 
+0.039781 0.066364 -0.092821 0.034801 0.018419 -0.046742 
+0.044910 -0.014685 -0.017252 0.037830 0.008354 -0.025377 
+-0.000761 0.007561 -0.012365 0.016023 -0.099532 -0.023860 
+0.016070 0.031544 0.011456 -0.002095 0.074286 -0.001496 
+-0.028095 0.024857 -0.018381 0.012358 -0.021301 0.012033 
+0.016096 -0.006836 0.031975 0.058462 0.000000 0.058462 
+0.057917 0.057917 -0.001667 -0.017273 -0.002727 0.009091 
+0.068889 0.077689 0.016844 0.003889 0.141389 -0.133611 
+-0.024444 -0.033111 0.005111 0.001134 -0.041022 0.034632 
+-0.033831 -0.010649 -0.001883 0.026456 0.018070 -0.002456 
+-0.022004 -0.045577 0.049978 -0.051919 0.000101 0.010404 
+-0.020887 0.055410 0.021951 -0.037825 0.031228 0.022596 
+-0.025669 0.014350 0.000427 -0.002019 0.010096 0.006875 
+0.026111 -0.000018 -0.000024 0.003812 0.002941 0.001933 
+-0.020657 -0.051976 -0.027847 0.025087 -0.060258 -0.047170 
+0.036393 0.009872 -0.051410 0.002061 0.008423 -0.011660 
+-0.004062 -0.001860 0.004376 -0.001561 0.000827 0.000269 
+-0.003702 0.002281 -0.000487 -0.006096 0.000890 -0.000989 
+-0.004517 -0.001226 -0.000775 -0.003105 -0.000302 -0.001448 
+-0.004415 0.006647 -0.006004 -0.003318 0.011504 -0.006326 
+0.001987 -0.002214 0.000876 0.001928 -0.017105 0.003480 
+-0.004644 -0.016296 -0.001243 -0.071244 -0.029738 -0.024390 
+-0.042520 0.040712 0.000756 0.037422 0.024881 -0.021455 
+-0.000342 0.007503 -0.001183 -0.000320 0.002803 -0.000075 
+-0.000268 -0.003106 -0.002924 -0.002379 -0.002362 -0.000037 
+-0.001243 -0.000428 0.001993 -0.000230 -0.000415 -0.001428 
+-0.004376 -0.000973 -0.001135 -0.003527 -0.001754 -0.004400 
+-0.001157 0.000991 0.000044 0.003504 0.005166 -0.001736 
+-0.000203 0.005801 -0.003490 0.001479 0.008306 -0.001961 
+0.001837 0.006527 -0.004780 0.002926 0.007195 -0.006147 
+0.008621 0.016399 -0.007501 0.007213 0.021967 -0.015396 
+0.004186 0.011596 -0.012639 0.003055 -0.004148 0.011639 
+0.005898 -0.026903 0.010540 0.011369 -0.004677 0.030148 
+-0.010357 -0.022597 0.002955 -0.004317 -0.005397 -0.002339 
+0.007420 0.023186 -0.007265 0.001335 0.003613 0.003257 
+0.004223 -0.018249 -0.026645 0.147647 0.107353 0.026863 
+-0.060024 -0.004002 0.023566 -0.024359 -0.047778 -0.004872 
+0.096196 0.093587 0.062826 0.083276 0.101293 -0.014612 
+0.061081 0.064917 -0.026295 0.077303 0.013542 -0.020525 
+0.030159 0.003794 -0.018587 0.004378 -0.008088 0.014395 
+-0.017830 0.019312 -0.003458 -0.004770 -0.042927 -0.030000 
+0.048190 0.034381 -0.029238 0.004713 0.005656 -0.006250 
+0.028614 0.017631 -0.004397 -0.022249 -0.065251 0.003909 
+0.077682 -0.043318 0.051545 -0.013030 -0.009091 0.059697 
+0.017576 0.028485 0.026061 -0.005571 -0.010714 0.011143 
+-0.006000 -0.063333 -0.004000 -0.002963 -0.058241 -0.043426 
+-0.012105 -0.072316 -0.000316 -0.067588 -0.059298 0.073114 
+-0.015900 -0.010000 0.047700 -0.017281 0.002982 0.000614 
+0.013787 -0.001421 -0.018260 -0.005479 0.000299 -0.005430 
+-0.006704 0.001847 -0.005698 -0.021149 0.005620 0.008059 
+-0.028518 -0.046979 0.024269 -0.014259 0.009084 0.009205 
+-0.010497 0.018996 -0.006544 0.007914 0.002378 0.009181 
+-0.002070 -0.002508 -0.010413 -0.015832 0.001346 -0.008689 
+-0.006385 0.002104 -0.001853 0.003954 0.002327 -0.006762 
+0.004724 -0.000758 -0.001376 0.000572 -0.001422 0.000673 
+-0.004452 -0.001048 0.000341 -0.005915 -0.002212 -0.000085 
+-0.003968 -0.004367 -0.000403 -0.004189 -0.007054 -0.000532 
+-0.007123 -0.008165 -0.000862 -0.005442 -0.001632 -0.001318 
+0.003722 0.009976 -0.000758 0.003436 0.008855 0.000148 
+-0.010578 0.015217 -0.002819 -0.081013 0.019069 -0.004479 
+-0.006203 0.031095 -0.010086 0.008091 0.009202 -0.006398 
+-0.002502 0.002822 -0.002373 0.000058 0.002522 -0.001459 
+0.000715 0.001136 0.001897 0.000576 0.000023 0.003033 
+-0.002188 -0.001121 0.002732 -0.000821 -0.002693 0.000065 
+0.000495 0.000859 -0.002092 0.000622 0.001867 -0.003037 
+-0.001655 0.004370 -0.001711 -0.001029 0.005104 -0.002643 
+-0.001519 0.005546 -0.006063 0.000194 0.009426 -0.005072 
+0.000141 0.009760 -0.005972 0.000124 0.005962 -0.002062 
+0.003481 0.004669 0.001563 0.003325 0.006812 -0.002016 
+0.001227 0.002699 -0.002909 -0.001799 -0.006374 0.002727 
+0.017859 -0.014091 0.015875 -0.025335 0.021431 0.086904 
+-0.026073 -0.007869 -0.016995 -0.015366 0.003897 -0.001556 
+0.000296 0.008427 0.000103 0.001808 -0.002291 0.008680 
+-0.103000 -0.025000 -0.014000 0.005106 0.028931 -0.046894 
+0.014190 0.024768 -0.013121 -0.010335 -0.045550 -0.016459 
+-0.015714 0.004286 0.085714 0.009294 -0.032941 0.058706 
+-0.016825 -0.017683 0.031079 0.017571 -0.024286 -0.014857 
+0.000000 -0.011429 -0.038571 -0.100000 -0.008378 -0.050270 
+-0.037143 -0.078571 -0.035714 0.045364 0.125364 -0.056909 
+-0.026300 0.016600 0.028500 0.007736 -0.014507 0.056101 
+-0.005187 -0.112338 0.014787 0.049854 -0.015385 0.021366 
+-0.001095 0.042496 0.093752 -0.059000 -0.059000 0.164000 
+-0.084315 0.011552 0.103488 -0.032975 -0.005620 0.016116 
+0.045094 -0.012717 -0.005208 0.093846 -0.087788 -0.069615 
+0.082433 -0.026247 0.010629 0.009458 -0.027751 0.035811 
+0.000238 -0.001190 -0.019524 -0.005261 -0.000002 -0.028961 
+0.021935 0.008503 -0.020826 0.025190 -0.025433 -0.027310 
+-0.012968 -0.027563 -0.027556 0.007188 0.006802 -0.011391 
+0.008267 0.014412 -0.003984 0.025775 0.051310 -0.021214 
+-0.001483 0.011498 -0.013108 0.000921 0.001849 -0.008193 
+-0.003720 0.002966 -0.001388 -0.004941 0.001463 0.000364 
+0.000853 0.000298 -0.002393 0.007044 0.000264 -0.005990 
+0.005009 0.003130 -0.006781 -0.002331 0.001071 -0.003056 
+-0.005939 0.000214 -0.002886 -0.006571 0.001341 -0.002236 
+-0.002508 -0.000452 -0.000658 0.004385 -0.004257 -0.000287 
+0.007624 -0.003820 -0.000093 0.008015 0.001744 0.000911 
+0.004847 0.005169 0.000140 -0.007002 -0.003014 -0.001403 
+-0.017210 -0.007007 -0.001147 -0.007603 0.017863 -0.004301 
+-0.000896 0.013088 -0.004244 -0.001296 0.002391 -0.000425 
+0.000575 0.002570 0.000626 -0.000492 0.001403 0.001504 
+0.000876 0.002919 -0.000834 -0.005727 0.005091 -0.005727 
+0.000480 -0.000598 -0.001938 -0.001858 -0.004186 0.000592 
+-0.003183 -0.001694 -0.000306 -0.000053 0.002475 -0.001764 
+-0.000216 0.005991 -0.001069 -0.004159 0.003942 -0.003071 
+-0.006203 -0.001730 -0.001320 -0.001322 -0.004716 -0.001514 
+0.000218 -0.001480 0.000263 -0.001355 0.002884 0.003158 
+-0.001914 0.004919 0.004714 0.001112 0.004830 0.000046 
+0.000670 0.001936 -0.000615 -0.001269 -0.007839 0.001855 
+-0.012352 -0.025241 -0.005823 0.050040 0.035020 -0.006590 
+-0.024630 -0.019973 0.001233 -0.007542 -0.001986 0.002119 
+-0.000406 -0.000092 -0.006762 0.001558 -0.035551 -0.015957 
+-0.027122 0.019203 -0.011858 -0.009267 0.025356 -0.008350 
+-0.011034 0.003948 0.010107 -0.035262 0.015307 0.041397 
+0.024762 -0.007619 0.089524 -0.164412 0.050118 0.097588 
+-0.012722 -0.128889 0.042406 0.012631 -0.075784 0.011333 
+0.024254 -0.047537 0.038927 0.033145 -0.047410 0.057386 
+0.017500 -0.112260 0.022452 -0.015160 0.026120 0.027800 
+-0.046508 0.024246 -0.137540 -0.031429 -0.038914 -0.051886 
+-0.028611 -0.062361 -0.005139 0.090833 -0.010417 -0.010417 
+-0.005667 -0.033333 -0.011333 0.013455 0.005636 -0.003455 
+-0.016533 0.001333 -0.009933 -0.013235 0.111250 -0.052941 
+-0.031667 -0.050667 -0.101333 0.004386 -0.005614 0.002149 
+-0.034740 -0.051632 0.080142 -0.002700 -0.014000 0.022900 
+-0.009223 0.005093 -0.019788 0.028762 -0.002926 -0.005058 
+0.008801 -0.020245 -0.025960 0.019898 -0.030899 0.000861 
+0.000970 -0.002318 -0.002249 0.003246 0.002780 -0.006363 
+0.001103 0.010160 -0.003599 0.006716 0.001631 -0.001760 
+0.003858 -0.007464 -0.000898 0.002295 -0.002083 -0.002515 
+0.001006 0.001325 -0.002410 0.003256 0.002406 -0.007927 
+0.007821 0.005718 -0.000124 0.007008 0.005250 -0.004977 
+0.001770 0.001025 -0.003338 -0.003559 0.000076 -0.000025 
+-0.003922 0.002063 -0.001397 -0.003407 0.003413 -0.004059 
+-0.003552 0.003190 -0.004139 0.000443 0.001547 -0.000391 
+0.010753 0.000528 0.001610 0.010951 -0.001017 -0.000929 
+0.003414 -0.003837 0.001964 -0.003530 -0.009307 0.004418 
+-0.010215 -0.014788 0.006217 -0.012297 -0.009501 0.004737 
+-0.006938 0.000184 0.001711 -0.002499 0.001036 0.000505 
+0.003946 -0.000534 -0.001310 0.000176 0.000132 -0.000035 
+-0.002960 -0.001600 -0.001081 -0.005611 -0.000976 -0.003144 
+-0.005407 0.000815 0.000519 -0.002132 -0.001961 0.000938 
+-0.000857 -0.002313 -0.000942 -0.000758 0.000758 -0.003636 
+-0.002217 -0.000485 -0.003047 -0.003285 0.001408 -0.000752 
+-0.000729 -0.001300 -0.001965 -0.000513 0.000736 -0.002520 
+-0.000551 0.003543 -0.005788 -0.000228 0.006810 -0.007657 
+0.013429 0.005143 0.002000 0.003511 0.008135 -0.004741 
+0.002074 0.004646 -0.002199 -0.002386 -0.006274 0.000043 
+-0.017339 -0.024331 -0.003980 0.025676 0.010511 0.004604 
+-0.016994 -0.082279 -0.016895 -0.082763 -0.073608 -0.055918 
+0.045210 -0.013988 -0.019707 0.033083 0.058248 -0.001603 
+-0.004347 0.009025 -0.012710 0.003541 -0.011637 -0.002630 
+-0.058796 -0.071308 0.045140 -0.008424 -0.023729 -0.008966 
+0.011576 0.003939 0.004061 -0.011895 -0.018824 0.016340 
+0.065370 -0.024259 -0.044815 -0.049531 0.008358 0.052522 
+-0.000909 -0.008771 -0.006265 0.027345 0.006364 0.020509 
+0.008462 0.047260 0.004471 -0.042017 -0.166555 0.083025 
+-0.093547 -0.123302 -0.068075 -0.091883 -0.060053 -0.017719 
+-0.007821 0.009744 -0.011667 -0.035201 0.012816 -0.038391 
+0.027942 -0.014733 -0.045720 -0.004848 -0.001212 -0.004242 
+-0.043077 -0.015385 0.000000 -0.015537 0.004215 0.000331 
+-0.000117 0.007595 0.067886 -0.019136 -0.014309 0.138432 
+-0.060577 -0.063125 0.040385 -0.014412 -0.025291 -0.011321 
+0.003235 0.001510 -0.011364 0.013555 -0.011016 0.016794 
+0.027623 -0.034963 -0.005169 -0.035090 -0.052000 -0.002924 
+-0.012937 -0.000234 0.030095 0.000748 0.003285 -0.001701 
+0.003393 0.002501 0.000240 0.003495 -0.000613 -0.000992 
+0.002290 -0.003800 -0.004843 0.001172 -0.002783 -0.001898 
+0.001333 -0.002667 -0.002519 0.002750 -0.001039 -0.004938 
+0.001417 -0.000031 -0.005560 -0.001371 0.002355 -0.001490 
+-0.000519 0.001671 -0.002778 0.000693 -0.000535 -0.000724 
+0.000439 0.002172 0.001210 0.002343 0.002388 -0.003671 
+-0.000402 0.003002 -0.003385 -0.000775 0.000429 -0.001061 
+0.000306 -0.001564 0.002470 0.000320 -0.002171 0.003328 
+-0.000137 -0.001204 0.001449 -0.000123 -0.000583 0.000617 
+-0.002093 -0.000805 0.000295 -0.005897 0.001436 -0.002351 
+-0.007890 0.004152 -0.001943 -0.007459 0.000666 0.001256 
+0.003684 -0.004899 -0.002126 0.003223 -0.000806 -0.003043 
+-0.002438 -0.001579 -0.002365 -0.002873 -0.001205 -0.003222 
+-0.003580 0.002369 -0.000996 -0.001204 0.005203 0.001376 
+-0.001299 0.003568 0.001178 -0.000854 -0.000944 0.000674 
+-0.000354 -0.000275 0.000877 -0.002324 -0.002572 -0.002882 
+0.000784 -0.001862 -0.005045 -0.001168 -0.000278 -0.008206 
+-0.002429 0.002414 -0.006859 -0.001011 0.011034 0.000409 
+-0.000812 0.004393 -0.005406 -0.000121 0.003903 -0.004125 
+0.001125 0.005161 -0.003235 0.000372 0.000316 -0.007160 
+-0.004263 -0.010705 0.000310 0.003219 -0.024925 0.007564 
+-0.000080 -0.022420 0.004904 -0.088809 0.017738 -0.011193 
+0.072534 0.054770 -0.021079 -0.020249 -0.011101 0.011486 
+0.015273 0.010868 0.003034 0.029292 0.004086 -0.010762 
+-0.004167 -0.019167 -0.005417 0.003655 -0.005353 -0.006614 
+0.013737 0.030505 -0.028990 0.011646 -0.004604 0.009390 
+0.071429 -0.008128 -0.003251 -0.174348 -0.020217 0.083804 
+-0.136867 -0.025433 0.059833 -0.111333 -0.012667 0.024667 
+-0.068810 -0.015714 0.012460 -0.108250 0.002500 0.040250 
+-0.078611 -0.081944 0.037639 -0.019529 -0.026706 -0.020529 
+-0.050000 -0.030000 -0.060000 -0.032462 0.048692 -0.162000 
+-0.125333 0.071952 0.064524 -0.060375 -0.017500 -0.020125 
+0.007386 0.006307 0.001881 0.042623 -0.002500 0.035519 
+-0.000333 -0.001000 0.102667 -0.036413 -0.067873 -0.035175 
+0.018531 0.014685 0.007381 0.033149 0.004326 -0.001584 
+-0.079458 -0.024655 0.020099 -0.036515 0.009212 0.037182 
+-0.002509 0.001626 0.001693 -0.014407 0.003896 0.011456 
+-0.002926 0.007173 -0.000727 0.006989 0.006288 -0.004618 
+0.006428 0.005651 -0.001336 0.004353 0.001737 -0.004349 
+0.002058 -0.003747 -0.000104 -0.000114 -0.000626 0.000008 
+0.003950 0.004330 -0.004791 0.002812 0.001500 -0.006134 
+0.001475 0.001132 -0.000635 -0.000363 -0.001740 0.000653 
+-0.001300 -0.000541 -0.000248 0.000826 0.000635 -0.003305 
+0.004499 0.001929 -0.001366 0.003646 -0.000235 -0.002068 
+0.000840 -0.004073 -0.002327 -0.001735 -0.000880 -0.002637 
+-0.002120 0.000636 0.000840 -0.003091 0.000257 0.001345 
+-0.004613 -0.000593 0.001517 -0.006179 -0.001108 0.002917 
+-0.004350 -0.000902 0.002185 -0.000931 -0.000234 -0.000650 
+-0.000778 0.001279 -0.004483 -0.003483 0.003588 -0.004264 
+0.001906 -0.002582 -0.002643 0.000535 -0.003542 -0.001272 
+0.000109 -0.001944 -0.001939 -0.002287 0.001543 -0.002226 
+-0.006596 0.004163 -0.000491 -0.003683 0.005427 0.004702 
+-0.000400 0.001571 0.002032 0.001170 -0.000146 -0.003170 
+0.002229 -0.000060 -0.006648 0.002080 -0.000593 -0.004751 
+-0.001174 -0.002967 -0.001944 -0.001617 -0.006256 -0.001792 
+-0.003034 -0.002954 -0.004691 -0.002705 0.011868 -0.004050 
+-0.001485 0.016094 -0.013142 0.001517 0.008194 -0.011533 
+0.001559 0.004963 -0.002487 -0.001497 -0.004163 -0.000311 
+0.000528 0.001462 -0.000451 0.011245 0.006903 0.000390 
+0.011396 0.005396 0.001355 0.037476 0.003356 0.007416 
+-0.036584 -0.005014 -0.003688 -0.108754 -0.152492 0.010902 
+-0.025632 -0.022368 -0.009789 -0.026667 -0.012917 -0.014583 
+-0.084368 -0.026099 -0.006676 0.003837 -0.026296 -0.011173 
+-0.016140 0.020453 0.083901 -0.107818 0.086545 0.151818 
+0.045042 -0.007563 -0.043529 -0.002495 0.000602 0.001409 
+-0.069643 -0.049048 0.047738 -0.017500 0.039195 0.097989 
+-0.092500 0.044808 0.029872 -0.050189 -0.124318 -0.032689 
+-0.050617 -0.042469 0.029383 0.041000 0.048000 -0.014000 
+0.035455 0.068182 0.000000 0.025067 -0.079133 -0.036667 
+-0.132196 0.010627 -0.057804 0.107062 0.004677 0.072240 
+-0.059091 0.025553 0.035774 -0.024965 0.016643 0.038182 
+0.012747 0.019341 -0.009451 -0.074221 -0.022208 -0.017338 
+-0.011688 0.003312 -0.002792 -0.008941 0.016627 0.004706 
+0.021481 0.015370 -0.011481 -0.030769 0.064511 0.028280 
+-0.109261 0.020997 0.089094 -0.007196 0.009207 0.002046 
+-0.002691 0.002807 0.001271 -0.005720 -0.002267 0.002956 
+-0.002553 0.002583 0.000389 -0.000106 -0.000735 0.000775 
+0.001871 -0.003500 0.001517 0.002075 -0.000482 0.000427 
+0.003880 0.002802 -0.003515 0.002840 0.004809 -0.003070 
+0.001302 0.000711 -0.002471 -0.003463 -0.002598 -0.000933 
+-0.003046 -0.000418 -0.001194 0.000690 -0.000364 -0.000044 
+0.003765 -0.000940 -0.000847 0.002447 -0.002180 -0.003825 
+-0.001604 -0.001808 -0.004618 -0.002790 -0.000582 -0.001794 
+-0.001161 0.000886 0.000006 -0.001150 0.001996 -0.000959 
+-0.004245 -0.000396 -0.000036 -0.007083 -0.005238 0.001902 
+-0.007265 -0.008046 0.000638 -0.005258 -0.002465 -0.002489 
+-0.003980 0.000647 0.002444 -0.003768 0.000232 0.002270 
+0.004127 0.000871 -0.003071 0.002698 -0.002023 0.000584 
+0.001007 0.000522 0.002939 0.000110 0.003282 -0.001211 
+-0.004102 0.005613 -0.002489 -0.002184 0.004416 0.000356 
+-0.000603 -0.002341 -0.003344 0.000211 -0.000346 -0.004591 
+0.000412 0.000990 -0.002482 0.000144 0.000334 0.001055 
+-0.001897 -0.004613 0.002945 -0.001551 -0.005752 -0.001859 
+-0.003576 0.001271 -0.010759 -0.006108 0.016365 -0.007267 
+-0.001905 0.020429 -0.010110 -0.005166 0.009300 -0.006889 
+0.000120 0.001626 -0.002130 -0.008158 -0.009031 0.000753 
+-0.011717 -0.009275 -0.001622 0.011902 0.007250 0.001050 
+0.023140 0.021289 0.000296 0.025699 0.038354 -0.005499 
+0.000622 0.032969 -0.008123 0.017279 0.066700 -0.022133 
+0.006922 0.056277 -0.041631 -0.026812 0.015489 -0.025917 
+-0.027474 -0.001045 -0.003981 -0.070909 -0.086049 -0.008605 
+-0.060386 -0.064341 0.017614 -0.030000 -0.105538 0.158308 
+0.102516 0.005256 -0.074728 0.066667 0.036733 -0.052867 
+-0.002198 0.039868 -0.009626 0.036000 0.013600 -0.006800 
+-0.033050 0.082626 -0.068462 -0.063103 -0.010828 -0.142448 
+-0.066296 -0.040741 0.022963 -0.011577 -0.012114 0.005444 
+-0.019545 0.050182 -0.065818 -0.014423 0.032500 -0.009615 
+0.000000 -0.019286 -0.055000 0.037500 -0.006250 -0.037500 
+0.016597 0.021387 0.023782 0.016392 0.022627 -0.001961 
+0.001429 0.028571 0.001429 0.010714 0.000000 0.047143 
+-0.035392 0.030126 0.001960 -0.007921 0.027704 0.004396 
+0.092634 0.090587 -0.080287 0.008333 0.004167 -0.033333 
+-0.020634 -0.002962 0.028345 -0.006120 0.006577 0.000124 
+-0.013235 -0.000094 0.006027 -0.004622 -0.003498 0.006320 
+-0.000159 -0.003576 0.003916 0.000367 -0.002797 0.003989 
+-0.001733 -0.003262 0.002488 -0.000261 -0.000810 0.000612 
+0.001432 -0.000354 0.002051 0.000748 -0.002664 -0.000691 
+0.000667 0.000135 -0.002605 -0.003808 -0.000050 -0.000710 
+-0.002275 0.000546 0.000398 0.000658 -0.001102 -0.000263 
+0.002114 -0.002329 -0.002090 0.001184 -0.003274 -0.000488 
+-0.000053 -0.003354 -0.001485 -0.001748 -0.003496 -0.000866 
+-0.000756 -0.002729 -0.002814 -0.001660 -0.000972 -0.003842 
+-0.001616 0.000404 -0.003739 -0.000482 0.002673 -0.003462 
+-0.002247 0.003682 -0.001924 -0.003137 0.001148 -0.004313 
+-0.003023 -0.005315 -0.000097 -0.006223 0.000013 -0.002320 
+0.002915 0.000089 -0.002201 0.000440 0.001039 0.002375 
+-0.001900 0.001564 0.000465 -0.001641 0.001135 -0.000324 
+0.002725 0.007124 -0.001592 0.002070 0.007209 0.002064 
+0.000564 0.000872 0.000998 -0.001414 -0.002010 0.000068 
+-0.000468 -0.001731 -0.001358 -0.000851 -0.000769 -0.002341 
+0.000091 -0.001603 -0.001664 -0.000342 -0.002102 -0.003296 
+-0.001905 0.004773 -0.007620 -0.000940 0.018178 -0.010657 
+-0.004228 0.018480 -0.005934 -0.002178 0.009051 -0.000860 
+0.001654 0.000309 0.000047 -0.000692 -0.002678 0.002430 
+-0.006166 -0.011419 0.004250 -0.001173 -0.010183 0.007040 
+0.006241 0.003488 0.000277 0.004652 0.015445 -0.006599 
+0.015913 0.035662 -0.008340 0.021260 0.087347 -0.012027 
+0.005707 0.090109 -0.011838 0.006539 0.058100 -0.013699 
+0.162982 0.019693 0.053377 0.016871 0.022216 -0.029009 
+-0.005160 0.044621 -0.035616 0.010882 -0.002132 0.008676 
+0.032709 -0.045829 0.032273 -0.004484 -0.015708 0.013884 
+-0.015385 -0.033077 0.000000 0.012829 -0.036295 -0.032796 
+0.029088 0.031088 0.017193 -0.075556 0.106101 0.030314 
+0.017000 -0.018000 -0.086000 -0.015644 -0.028444 -0.011378 
+0.009654 0.057056 0.046082 0.001272 0.025432 -0.002543 
+0.015736 0.015057 -0.007415 0.042327 0.056436 -0.039091 
+0.087311 0.092605 -0.051597 0.065816 0.002589 -0.040675 
+-0.086044 -0.034396 0.068901 0.008154 0.055538 0.029385 
+0.044283 0.078424 0.015033 0.019107 0.021799 -0.001773 
+0.026412 0.115424 -0.056257 0.010037 -0.010428 0.003371 
+0.002571 -0.025712 0.016491 -0.000315 -0.009294 0.003745 
+0.004365 -0.003119 -0.001995 0.001045 0.000655 -0.003553 
+-0.000166 0.001151 -0.002981 -0.000945 0.000849 0.000468 
+-0.001346 0.001972 0.000410 -0.004485 -0.001772 -0.001434 
+0.000649 -0.003834 -0.000188 0.000491 -0.001611 -0.001394 
+-0.000018 0.001823 -0.002988 0.000589 0.001123 -0.002423 
+0.000759 -0.000732 0.000657 0.001272 -0.004691 0.001382 
+0.000432 -0.006319 -0.001644 -0.002508 -0.004146 -0.000025 
+-0.000195 -0.004453 -0.000195 -0.000955 -0.004567 -0.001125 
+-0.002171 -0.004931 -0.002898 -0.002524 -0.003998 -0.003399 
+-0.000463 -0.002597 0.005054 -0.000417 0.000572 0.000717 
+-0.001194 0.002402 -0.006827 -0.002892 0.006339 -0.005847 
+-0.006071 -0.000758 -0.004174 -0.001392 0.000081 0.000309 
+-0.007628 -0.005369 -0.002343 -0.010155 -0.004135 0.000685 
+-0.007196 -0.003796 -0.000044 -0.001181 -0.002598 0.000000 
+0.003157 0.000075 0.001560 0.002269 0.002737 0.002034 
+-0.002231 -0.000314 0.000628 -0.001921 0.004811 0.001972 
+-0.000029 0.000183 0.000815 -0.002838 -0.004642 0.000981 
+0.001181 -0.004152 -0.001333 -0.000552 -0.001557 -0.002542 
+-0.004385 0.010909 -0.007751 0.005293 0.015116 -0.024401 
+-0.013451 0.019032 -0.008848 -0.002761 0.015945 -0.002732 
+0.005868 0.004467 0.000965 0.000061 0.005929 0.000225 
+0.000903 0.005692 -0.004471 -0.003921 0.000392 -0.006023 
+-0.003061 -0.000868 0.000006 -0.006653 -0.006921 0.000843 
+-0.010112 -0.009541 -0.003167 -0.017934 0.010365 -0.012336 
+-0.002254 -0.004380 0.000813 -0.015334 -0.010739 -0.006829 
+-0.043109 -0.031026 0.016334 -0.005179 -0.014107 0.000714 
+-0.015716 -0.011687 -0.010411 0.003636 0.020000 -0.006364 
+0.017699 -0.032110 0.014082 -0.009698 -0.028023 0.025809 
+-0.007829 -0.051526 0.026055 0.017561 -0.242622 0.067041 
+0.014141 0.006566 -0.008687 0.146332 0.005761 -0.037255 
+0.059860 -0.018991 -0.033428 0.018939 -0.015838 0.068169 
+0.009994 0.008259 0.034634 0.003490 0.047991 0.004254 
+0.006824 0.029000 0.001706 0.068923 -0.079077 0.007692 
+0.032731 -0.114412 0.054454 0.047175 -0.070264 0.041959 
+-0.089091 -0.236364 0.102727 0.020202 0.021747 -0.005586 
+0.107000 0.107000 -0.088667 0.026715 0.020399 -0.018121 
+0.000991 0.020963 -0.024746 -0.013389 0.005950 -0.000956 
+-0.007191 -0.010392 0.012060 0.001826 -0.012906 0.005032 
+0.008964 -0.000613 -0.008491 0.000927 0.006514 -0.008773 
+0.001468 0.007946 -0.006436 -0.000027 0.009719 -0.005946 
+-0.001204 0.008427 -0.002040 -0.006092 -0.001375 -0.005846 
+-0.001042 -0.006071 0.001088 -0.000753 -0.002257 0.000002 
+0.001242 0.002099 -0.002350 0.003525 0.000740 -0.002767 
+0.001733 -0.001013 0.000857 -0.001459 -0.001590 -0.000409 
+0.000656 0.002688 -0.001466 0.002522 0.003230 -0.003380 
+-0.000478 -0.000052 0.000041 -0.002020 -0.000812 -0.002393 
+-0.002588 -0.003664 -0.002277 -0.005487 -0.005882 0.003921 
+-0.001323 -0.002746 0.007069 0.000891 -0.001402 0.002979 
+-0.001046 -0.000799 0.000848 -0.003961 -0.003828 -0.001320 
+-0.002180 -0.002155 0.000590 -0.000423 0.000555 0.000002 
+-0.001238 -0.004766 0.002765 -0.002756 -0.007030 0.000557 
+0.001440 -0.005178 0.000139 0.000816 -0.001401 0.001519 
+-0.001705 -0.003407 0.002130 -0.003135 -0.003667 0.002056 
+-0.004642 -0.001981 0.003250 -0.004413 0.001413 0.004263 
+-0.000739 0.002279 0.004064 0.001958 -0.000026 0.001133 
+0.001693 -0.005779 0.000287 -0.000459 -0.003928 -0.002163 
+-0.002143 0.013994 -0.004211 0.002969 0.027931 -0.025090 
+-0.013407 0.019775 -0.017987 -0.009823 0.013458 -0.000939 
+-0.005890 0.004849 -0.000108 -0.003423 0.006217 -0.001504 
+-0.000843 0.009949 -0.010452 0.002595 0.004363 -0.018942 
+-0.000038 0.007398 -0.004632 -0.003589 -0.007367 -0.001375 
+-0.000434 -0.012708 -0.000350 0.012677 -0.004900 0.009204 
+0.000208 -0.021008 0.010050 -0.017120 -0.019811 -0.029730 
+-0.063929 0.010000 -0.063929 0.040000 0.052727 -0.005455 
+-0.015758 -0.062121 0.108485 -0.008024 -0.008024 -0.072217 
+-0.004635 -0.024000 -0.023173 0.006907 -0.010120 -0.017951 
+0.007706 0.011529 0.000073 -0.006667 -0.006667 0.007333 
+-0.032500 -0.002750 0.005500 0.005694 -0.004533 0.004682 
+-0.015493 -0.005986 0.041199 -0.011055 -0.008827 0.004592 
+-0.001319 0.018095 0.010549 -0.003045 0.047657 -0.014161 
+0.003684 0.019895 0.010316 0.046429 0.021921 0.008768 
+-0.014400 0.009000 0.028800 0.026176 -0.016250 -0.006544 
+-0.048213 0.047923 -0.059758 -0.059865 -0.042323 0.051711 
+-0.005490 -0.026348 0.036397 -0.006495 -0.004994 0.010839 
+-0.009585 -0.005328 0.008745 -0.000294 -0.001237 0.000429 
+0.006527 0.001240 -0.001258 0.009207 0.005679 -0.006125 
+0.006547 0.005942 -0.006455 0.001138 0.000374 -0.001918 
+0.000117 0.002214 -0.002408 0.005243 0.010291 -0.009668 
+0.003837 0.010747 -0.010364 -0.000569 0.001527 -0.003097 
+-0.001367 -0.004561 0.001246 -0.000369 -0.002765 0.000551 
+0.000700 0.000215 -0.006193 0.006633 0.000167 -0.005679 
+0.001608 -0.001140 -0.005095 -0.000786 0.001262 -0.004727 
+0.000259 0.000879 -0.006830 0.002134 0.005456 -0.007449 
+-0.003581 0.003566 -0.005815 -0.003121 0.002255 -0.002191 
+0.002592 0.003841 -0.004817 0.000796 0.001469 -0.003826 
+-0.001262 0.000502 0.000329 -0.003236 -0.002590 0.000162 
+-0.002754 -0.002689 -0.001646 -0.001607 -0.000837 -0.000591 
+0.001751 0.000347 0.000348 0.002283 0.000866 0.000462 
+0.003613 0.002607 0.000752 -0.001433 -0.000676 -0.002530 
+0.000367 -0.002414 -0.002800 -0.003292 0.001247 0.000048 
+-0.005840 -0.000709 0.005785 -0.005036 -0.002703 0.002597 
+-0.001335 0.000985 -0.000137 0.001883 0.004499 -0.000968 
+0.003069 0.004656 -0.004127 0.000281 0.000922 0.000896 
+-0.000114 -0.001609 -0.000803 -0.000383 -0.000696 -0.000626 
+0.000292 0.013954 -0.002884 0.001223 0.031057 -0.016412 
+-0.004172 0.030889 -0.018709 -0.005641 0.018974 -0.008462 
+-0.001261 0.002396 -0.005982 0.001079 -0.004358 -0.002399 
+-0.000557 -0.000569 -0.000357 0.003051 0.005235 -0.009598 
+0.000143 0.008025 -0.009359 -0.002446 0.002614 -0.003976 
+0.004367 0.001072 0.004487 0.020545 -0.007484 0.013941 
+0.007935 -0.019484 0.004747 -0.031677 0.064699 -0.005394 
+0.019353 0.019212 0.004504 -0.037788 0.064439 0.003427 
+-0.011597 0.003411 0.042105 -0.015631 -0.005614 -0.031977 
+0.012500 -0.004250 0.004250 0.021641 0.006579 0.008069 
+0.013371 0.004776 -0.011468 0.005123 0.013722 0.003108 
+-0.021932 0.002319 0.010580 -0.010594 0.011409 0.021922 
+-0.004994 0.006774 0.001148 -0.002446 0.002953 -0.002106 
+-0.004918 0.016473 -0.017124 -0.031429 -0.022857 0.017714 
+-0.004003 -0.000991 0.018467 -0.009214 0.018499 0.004635 
+-0.000802 0.025466 0.029009 -0.020778 -0.008474 0.052555 
+-0.003926 0.008880 -0.008370 -0.001013 -0.011676 0.027457 
+-0.005732 -0.005596 0.027636 -0.003074 -0.002022 0.009953 
+-0.000764 0.002234 -0.006568 -0.000922 0.004542 -0.005405 
+-0.000261 0.001974 -0.001319 0.004332 0.001262 -0.002814 
+0.005270 0.002039 -0.000028 0.000000 -0.001690 0.001268 
+-0.003696 0.003967 -0.000875 0.009099 0.011048 -0.006496 
+0.004282 0.012845 -0.003099 0.002886 0.003423 0.002409 
+0.000426 -0.002294 0.002969 -0.000462 -0.000905 -0.000606 
+-0.000292 0.000702 -0.004877 0.003731 0.001518 -0.003315 
+0.000437 0.000379 -0.000675 -0.002788 -0.002183 -0.000968 
+-0.001040 -0.001229 -0.002578 0.001706 -0.001157 -0.006030 
+-0.002353 0.001823 -0.005352 0.002112 0.003138 -0.004526 
+0.004151 -0.000281 -0.002684 0.003643 0.001129 -0.001006 
+0.001753 0.001099 0.000818 -0.001733 -0.000138 -0.000185 
+-0.004508 -0.001639 -0.000911 -0.003572 0.000575 -0.000951 
+-0.001572 0.001005 0.000221 0.004472 0.001727 -0.000867 
+0.001059 -0.000245 -0.004474 0.002192 0.001400 -0.006554 
+0.000723 -0.000303 -0.005103 -0.000485 -0.001482 -0.001290 
+-0.002170 -0.002667 -0.000633 0.002145 -0.003387 0.002033 
+0.003354 -0.001067 -0.002955 0.004680 0.000565 -0.004971 
+0.000727 0.004360 -0.004928 -0.000604 -0.000216 -0.001453 
+0.001191 -0.004876 0.000486 0.001652 -0.004449 0.000140 
+-0.002389 0.006652 -0.000236 -0.001206 0.021562 -0.002297 
+0.002876 0.021573 -0.008889 0.001731 0.001122 -0.015293 
+0.000361 -0.004811 -0.017862 -0.004287 -0.009239 -0.015434 
+0.011379 0.003621 -0.003621 0.004986 -0.003051 -0.005191 
+-0.001616 -0.002884 -0.002731 -0.003013 -0.004228 -0.004876 
+-0.003969 -0.001750 -0.006824 -0.002016 -0.010198 -0.005755 
+0.013385 -0.040123 0.026695 0.034091 0.107832 0.075839 
+-0.011720 0.010430 0.004409 0.050465 -0.025237 -0.104081 
+-0.011249 -0.011237 -0.051727 0.024595 0.001667 -0.034432 
+0.016400 -0.021867 0.001905 -0.007166 -0.000047 0.005445 
+-0.006352 0.006136 -0.000798 -0.009387 -0.011717 0.012538 
+0.036280 -0.150338 0.022464 0.029848 0.023949 -0.001431 
+0.019638 -0.005568 -0.002298 -0.036523 0.011579 -0.029906 
+-0.009503 0.018323 -0.039130 -0.006717 -0.012327 0.026440 
+-0.024567 -0.052087 0.018814 -0.060867 0.006314 0.049377 
+-0.008068 -0.007982 -0.012605 0.002141 -0.003345 0.050173 
+0.001346 -0.014422 0.065285 -0.000683 -0.010246 0.049904 
+-0.003846 -0.008522 0.041305 -0.560241 -1.006024 4.090362 
+-0.823171 -0.871951 4.042683 -0.009752 -0.004983 0.033313 
+-0.002882 -0.003598 0.017117 0.007712 0.003695 0.000814 
+-0.001017 0.009701 -0.003106 -0.001195 0.009543 -0.004248 
+-0.001116 0.006417 -0.005301 0.004442 0.003430 -0.005823 
+0.003934 -0.003306 0.000027 0.001418 -0.004961 0.006667 
+0.000284 -0.003395 0.003683 0.000478 0.002822 -0.002713 
+0.002254 0.004638 -0.005049 0.002061 0.000934 -0.002642 
+0.000278 0.000125 -0.000987 0.000228 -0.000614 0.000456 
+0.001551 0.000032 -0.002410 0.001016 -0.002082 -0.002379 
+0.000326 -0.004222 -0.002451 0.000769 -0.004615 -0.003077 
+0.003054 -0.003151 -0.000983 0.000655 -0.001943 -0.001134 
+-0.000824 -0.002560 -0.000011 -0.002416 -0.001969 -0.000056 
+0.000453 -0.001595 -0.000950 0.000445 0.000270 0.001175 
+-0.002224 0.000671 0.000534 -0.002099 0.001426 0.001062 
+-0.000571 0.002738 -0.000329 0.005334 0.004548 -0.007709 
+0.004544 -0.003603 -0.006735 0.002701 0.002850 -0.000259 
+-0.000275 -0.000176 0.000312 0.000733 -0.001949 0.002345 
+0.004003 -0.002781 -0.001375 0.001186 0.001369 -0.004628 
+-0.000417 0.001495 -0.002899 -0.000173 -0.000496 0.000242 
+0.001179 -0.005520 0.002961 0.003530 -0.007215 0.001275 
+-0.005408 -0.001790 -0.001918 -0.002503 0.002381 0.004495 
+0.000377 0.002726 -0.004741 -0.002438 0.002809 -0.006358 
+0.000837 -0.006292 -0.009957 0.001200 -0.003820 -0.015523 
+-0.000613 -0.003996 -0.016291 -0.007185 -0.002845 -0.011180 
+-0.013170 -0.003576 -0.004577 -0.010206 -0.009750 -0.006113 
+-0.004874 -0.005295 -0.013205 -0.001179 -0.006331 -0.011984 
+0.037241 -0.028437 0.039794 0.001000 0.005333 0.001000 
+0.001624 0.009000 -0.001894 0.008305 -0.011821 -0.058442 
+0.003498 0.025391 -0.043786 0.004413 -0.011979 -0.059500 
+0.075891 -0.019406 -0.053960 -0.011298 0.006186 -0.013073 
+0.006953 -0.018375 -0.001341 -0.017187 -0.037977 0.033398 
+-0.015738 -0.050835 0.026021 0.023636 0.023448 -0.002426 
+0.014778 0.028494 -0.002991 -0.030408 0.013237 0.014389 
+-0.019666 -0.002541 -0.000633 -0.006456 0.034323 0.019680 
+0.017591 -0.001604 0.008925 -0.062553 -0.079004 0.087476 
+0.001834 -0.002799 0.061500 0.011765 0.001108 0.044896 
+0.007044 -0.015611 0.047919 -0.006355 -0.015400 0.048751 
+-1.018605 -1.497674 5.418605 -1.208333 -1.516026 6.012821 
+-1.238532 -1.648318 6.103976 -0.841897 -1.604743 5.118577 
+-0.006426 -0.003174 0.023645 0.003974 0.009031 -0.001328 
+-0.000627 0.010421 0.002155 -0.002748 0.008194 -0.000798 
+0.001337 0.009743 -0.007520 0.005104 0.010572 -0.014056 
+0.000974 0.000893 -0.000959 -0.001077 -0.011868 0.009602 
+-0.000333 -0.006559 0.009394 0.001358 0.000721 -0.005753 
+0.005670 0.006620 -0.010207 0.004479 0.007667 -0.004433 
+0.001176 0.003950 -0.001429 -0.001412 0.000671 0.002224 
+-0.002049 0.002049 -0.000656 -0.002333 0.003499 -0.006371 
+-0.001771 0.005406 -0.007223 -0.000543 0.000241 -0.006667 
+0.001901 -0.001847 -0.002374 0.000738 -0.002414 -0.001901 
+-0.001123 -0.003073 -0.001351 -0.000992 0.001374 -0.000763 
+0.000170 -0.000967 -0.001586 -0.001476 0.000882 -0.002021 
+0.003007 0.001410 -0.002719 0.004093 0.000933 -0.003458 
+0.001342 0.000631 0.001111 0.000452 0.000397 -0.001038 
+-0.000825 -0.002440 0.000401 -0.001949 -0.002544 0.000406 
+-0.001897 -0.000051 0.002974 -0.000395 0.002555 0.000187 
+-0.003213 0.000567 -0.002426 0.000083 -0.002583 -0.004667 
+-0.000976 -0.002615 -0.001855 0.001958 -0.001202 -0.000267 
+0.000243 -0.003862 0.000373 -0.000448 -0.005423 -0.000087 
+-0.003621 0.000406 -0.002214 0.000996 0.008298 -0.004067 
+0.000161 0.005912 -0.010517 -0.006470 -0.003101 -0.006048 
+-0.001517 0.003219 0.003524 0.002012 0.007832 0.024999 
+0.452632 0.410526 4.100000 0.799020 0.583333 4.166667 
+0.008659 -0.000063 0.034807 0.003120 -0.003312 0.019186 
+-0.003349 -0.006162 -0.009625 -0.013698 -0.022269 -0.019373 
+0.039603 -0.040737 0.028957 -0.052975 0.030975 -0.011289 
+0.012569 -0.011806 -0.114653 0.002482 0.020407 -0.011856 
+0.009532 0.018206 0.012659 0.020407 0.020542 0.013578 
+0.036681 -0.003621 0.043319 0.016831 -0.011442 0.041746 
+0.000007 -0.033649 0.042081 -0.010182 -0.033529 0.014829 
+0.008311 -0.001688 0.002804 0.018974 0.036340 -0.030098 
+0.010500 0.025479 -0.024683 -0.012017 -0.015600 0.007949 
+0.011938 -0.002075 0.007130 0.031183 0.052427 0.011278 
+0.067157 -0.051209 -0.040736 0.003577 -0.020317 0.006507 
+0.009498 0.003105 0.019671 0.004465 -0.038458 0.033398 
+-0.017872 -0.024391 0.062129 -1.629630 -1.614815 5.688889 
+-1.619048 -1.599206 6.000000 -1.638037 -1.874233 6.263803 
+-1.447205 -2.031056 6.034162 -0.900383 -1.639847 4.846743 
+-0.006796 -0.005081 0.026906 -0.001694 -0.001720 0.010069 
+-0.000354 0.000564 0.003559 -0.002817 0.007832 -0.004303 
+-0.001878 0.013525 -0.010133 0.001178 0.011902 -0.011172 
+0.004512 0.009468 -0.006443 0.003739 0.005403 0.000402 
+0.001295 -0.001017 0.004348 0.000066 -0.000306 -0.000104 
+0.000536 0.002593 -0.004191 -0.001803 0.004344 -0.004344 
+-0.003634 0.001525 -0.002271 -0.003659 -0.001161 0.002170 
+-0.000476 0.001784 -0.002775 -0.001386 -0.001997 -0.003272 
+0.003992 -0.001390 -0.005614 0.002112 -0.000763 -0.004709 
+0.001969 -0.000290 -0.004978 0.005583 0.000543 -0.003598 
+0.004564 0.002687 -0.002495 0.001131 0.000473 -0.000340 
+-0.000599 0.000109 -0.000089 -0.002339 0.003185 -0.002702 
+-0.000022 0.004682 -0.004667 -0.000234 -0.003369 -0.005101 
+-0.001404 0.005439 -0.006930 -0.000291 -0.000758 -0.004313 
+-0.000645 -0.002889 -0.001945 0.001962 -0.001368 0.001813 
+0.000095 -0.000438 -0.001239 -0.000347 0.000770 -0.001110 
+-0.005451 -0.000820 -0.003811 -0.004647 0.002022 -0.006597 
+-0.003748 0.000743 -0.005436 -0.000420 -0.003559 -0.005305 
+-0.002687 -0.003304 -0.003356 -0.003057 -0.002966 -0.001418 
+-0.000334 -0.001519 0.004325 0.000530 -0.000809 0.002065 
+-0.001389 0.001599 -0.011799 -0.004260 0.000491 -0.013886 
+0.003702 0.004005 0.016638 1.106719 0.363636 5.154150 
+1.660428 0.441176 6.518717 1.897756 0.451372 6.628429 
+1.979933 0.408027 5.872910 1.611842 0.361842 3.934211 
+-0.001256 -0.004826 0.006725 -0.015251 -0.021570 -0.001071 
+-0.001901 -0.039847 0.025734 -0.000676 0.044928 0.016329 
+0.020029 0.024415 0.042880 0.002865 0.019526 0.001499 
+0.027897 0.008059 0.015194 0.039034 0.000486 0.027318 
+-0.002861 0.002452 0.015789 0.003636 -0.002781 0.013690 
+-0.000778 -0.010000 0.011675 -0.002055 -0.001727 0.004249 
+0.001050 0.008914 -0.007706 0.012702 0.018086 -0.016276 
+0.014850 0.032293 -0.009303 -0.002606 0.016832 -0.002785 
+-0.014947 0.021730 -0.016235 0.001667 0.018986 -0.022842 
+0.049669 0.047568 -0.086507 0.009595 0.068101 -0.013510 
+0.000878 -0.012421 0.022619 -0.058907 -0.041490 0.004461 
+-0.013967 -0.012813 0.055864 -1.617834 -1.248408 6.636943 
+-1.621094 -1.835938 6.589844 -1.601286 -2.045016 5.929260 
+-1.473520 -1.738318 4.747663 -1.256757 -1.081081 3.483108 
+-1.025751 -0.506438 2.450644 -0.002629 0.000052 0.013136 
+0.002136 0.006937 -0.010546 0.007437 0.014984 -0.011202 
+0.003322 0.010531 -0.004130 0.004774 0.008907 0.001010 
+-0.001051 0.008532 -0.001803 0.005671 0.011019 -0.013614 
+0.001585 0.000315 -0.010919 -0.002034 0.005788 -0.002536 
+-0.001178 0.005065 0.000491 -0.000690 0.002247 -0.001037 
+-0.001520 0.001341 -0.002545 0.003312 0.003815 -0.002798 
+0.000820 0.000694 -0.004762 0.001148 -0.003349 -0.000931 
+0.000726 -0.006530 0.000728 0.000287 -0.002447 -0.001323 
+0.000345 0.010111 -0.004192 0.002583 0.011441 -0.011108 
+0.000652 0.007909 -0.003908 -0.003175 0.000921 0.000419 
+-0.002535 0.000604 0.003005 -0.001685 0.000646 -0.001082 
+-0.002448 0.002669 -0.004861 -0.003609 0.001054 -0.006069 
+-0.003297 0.001446 -0.000019 -0.000070 -0.003875 -0.005551 
+0.000100 -0.000125 0.000072 0.004337 -0.000658 -0.003349 
+0.002913 -0.002167 0.002720 0.002665 -0.000903 0.001771 
+-0.000076 0.003673 -0.003294 -0.005625 0.004750 -0.003469 
+-0.004904 0.005108 -0.003202 -0.003202 -0.000604 -0.002526 
+-0.001434 -0.003380 -0.001568 0.001725 0.000956 0.000732 
+0.003774 0.003421 0.002406 -0.002296 0.001279 -0.002018 
+0.004476 -0.000211 -0.013144 -0.003882 0.008187 -0.014874 
+0.003782 0.006690 0.022167 1.461957 0.394022 4.877717 
+2.063025 0.220588 6.132353 2.404301 0.292473 6.645161 
+2.536443 0.556851 6.352770 2.100502 0.919598 4.869347 
+0.006846 0.005226 0.023020 -0.002382 -0.008643 0.000268 
+-0.012541 -0.041191 -0.027535 -0.031667 -0.020300 -0.027067 
+-0.018775 0.027347 -0.002686 0.015918 0.005816 -0.012551 
+0.048446 -0.018858 -0.078468 0.145060 -0.018193 -0.061566 
+-0.024755 -0.006419 -0.036413 -0.014185 0.016440 0.006316 
+-0.005596 0.006291 0.005964 -0.000087 0.005223 -0.003617 
+0.001205 0.004094 -0.000362 0.001717 0.000176 0.002152 
+0.010715 -0.007415 0.009073 0.020437 -0.006334 0.008230 
+0.008261 0.007538 -0.007063 -0.005656 0.010037 -0.013627 
+0.010195 0.008021 -0.009928 0.066372 0.063355 0.013125 
+-0.015391 -0.017355 0.034681 -0.118466 -0.234021 -0.358307 
+-0.002763 -0.004902 0.011463 -0.627907 -0.635659 6.271318 
+-0.960699 -1.393013 6.930131 -1.096774 -1.496774 6.116129 
+-1.069565 -1.286957 4.495652 -0.866450 -0.908795 2.811075 
+-0.001815 -0.002123 0.012692 -0.000664 0.004336 -0.007112 
+-0.005047 -0.003169 -0.014724 0.010092 -0.001815 -0.004354 
+0.006894 0.001199 -0.002841 0.007847 0.006899 0.001211 
+0.005768 0.011456 0.003461 0.010100 0.008250 -0.008250 
+0.002425 0.002527 -0.006702 -0.000111 0.002085 -0.002421 
+0.002292 0.001667 -0.002646 0.006270 -0.001913 -0.002733 
+-0.003349 0.004142 -0.004626 0.001577 0.000131 -0.007618 
+-0.000866 0.000788 0.000207 -0.004364 -0.001762 -0.002853 
+0.000874 -0.002831 -0.000840 0.001953 0.002178 -0.001992 
+0.001351 0.000761 -0.002507 -0.000139 0.001997 -0.001446 
+-0.002196 0.001227 -0.000558 -0.001750 0.001389 -0.005009 
+-0.000726 0.001612 -0.003458 -0.005639 -0.002712 -0.004995 
+0.002376 -0.005089 -0.005914 0.006206 -0.002035 -0.005372 
+-0.002639 -0.002552 -0.000889 -0.000321 -0.000128 -0.007054 
+-0.001901 0.003428 -0.002474 0.002669 -0.001292 -0.001636 
+0.000921 -0.002021 0.003037 0.000869 -0.004012 0.004599 
+0.000353 -0.000799 -0.000062 -0.002296 -0.000322 -0.004258 
+-0.001212 0.004040 -0.004848 -0.003738 -0.003480 -0.003317 
+-0.002106 -0.004007 -0.002455 0.000936 0.001804 0.000360 
+0.003473 0.007964 -0.002000 0.000739 0.008307 -0.011600 
+-0.005580 0.003889 -0.022316 -0.002550 0.004030 -0.008669 
+0.005733 0.003655 0.016662 1.159544 0.216524 3.621083 
+1.734450 0.191388 5.095694 2.113527 0.415459 6.026570 
+2.140805 0.824713 6.120690 1.708000 1.108000 5.060000 
+0.008435 0.009290 0.027713 -0.001225 0.000380 -0.008104 
+-0.010838 -0.019511 -0.039030 -0.046041 -0.027565 -0.024449 
+-0.032371 0.014931 0.022204 -0.009643 -0.010286 -0.001929 
+0.017341 -0.001706 0.015913 0.018845 0.002089 0.028254 
+0.014822 -0.001094 0.016631 0.004176 -0.000594 0.006888 
+0.001871 0.000549 -0.004509 0.001377 0.010784 -0.013417 
+-0.013442 0.007054 -0.006795 -0.007871 -0.000270 -0.022760 
+0.003816 0.006388 -0.021007 0.002025 0.007724 -0.016334 
+0.000447 -0.001084 0.000122 -0.001466 -0.002905 0.002146 
+-0.001675 0.002527 -0.002850 0.011710 0.009218 -0.020964 
+0.010961 0.003491 -0.095887 -0.001654 -0.053014 -0.021662 
+0.003668 -0.000081 -0.025956 -0.014497 0.002550 0.036389 
+-0.341463 -0.652439 5.597561 -0.315789 -0.834008 5.340081 
+-0.277580 -0.907473 4.177936 -0.190283 -0.801619 2.473684 
+0.000049 -0.004153 0.006354 0.001929 0.002058 -0.010582 
+-0.000953 -0.001086 -0.014206 0.001238 0.000952 -0.007238 
+0.000161 0.001531 -0.003379 -0.000641 0.001775 -0.001790 
+0.004164 0.004717 -0.001228 0.000309 0.001879 -0.003965 
+-0.000757 0.004779 -0.002531 0.002231 0.001922 -0.002475 
+0.000568 -0.000511 -0.001517 -0.001445 0.000517 -0.002120 
+-0.003816 -0.000506 -0.002837 -0.003255 -0.004080 -0.002690 
+-0.007273 -0.003326 -0.000710 -0.006172 -0.001402 -0.001753 
+-0.003344 0.000000 0.000372 -0.000905 0.002620 -0.002251 
+0.000419 0.002819 -0.002088 0.000956 0.003263 -0.001258 
+-0.000787 0.002419 -0.003544 0.003338 0.001318 -0.006192 
+0.001686 -0.000744 -0.004975 -0.001618 0.000657 -0.001010 
+-0.002063 -0.000974 0.002641 0.000101 -0.002996 0.002454 
+-0.001557 0.003217 -0.001972 0.001502 0.001244 -0.008756 
+-0.001275 0.000627 -0.004681 -0.001228 0.001148 -0.002535 
+-0.000984 0.002484 -0.002451 0.000000 0.002913 -0.002756 
+-0.002741 0.001835 -0.003043 -0.001914 0.000044 -0.005732 
+-0.004281 -0.001087 -0.002854 -0.004184 0.000864 -0.003809 
+-0.000635 0.003055 -0.000969 0.000216 0.003164 -0.001990 
+-0.001135 0.000308 -0.000553 -0.001309 -0.000626 -0.001470 
+-0.001636 -0.003717 -0.005435 -0.004390 0.003658 -0.009042 
+0.002686 0.003691 -0.006498 0.006692 0.003383 0.010467 
+0.993506 0.337662 2.980520 1.110795 0.630682 4.420455 
+1.115265 0.928349 5.056075 1.072727 1.072727 4.604546 
+0.007731 0.006541 0.020750 -0.006619 -0.001471 -0.009116 
+-0.002306 0.004355 -0.013360 -0.007194 -0.000306 0.006659 
+-0.007320 0.000111 0.007035 0.000652 -0.002271 -0.006118 
+0.008310 0.003900 0.038294 0.008266 -0.004646 0.017943 
+0.003798 -0.003573 0.007769 -0.001249 -0.001244 0.003114 
+-0.000563 0.000323 -0.000326 0.001618 0.002022 -0.001924 
+-0.001852 0.002369 -0.007443 -0.005635 -0.004410 -0.016250 
+-0.007673 -0.003710 -0.021370 0.008069 0.006707 -0.029696 
+0.016585 0.016646 -0.020453 0.008463 0.007260 -0.004372 
+-0.002314 -0.002571 -0.000257 -0.008859 -0.014917 -0.002138 
+-0.010416 -0.029540 -0.010217 0.017436 -0.026154 -0.046667 
+0.036297 0.015065 -0.039247 -0.007913 0.005818 0.019859 
+-0.008572 0.002556 0.020105 -0.002084 0.002573 0.015798 
+0.003361 0.000233 0.010727 0.003818 -0.001047 0.001515 
+-0.000070 0.000292 -0.006053 -0.001803 0.002459 -0.005880 
+-0.006810 0.001604 -0.001946 -0.002061 0.003494 -0.005016 
+-0.001627 0.003971 -0.006833 0.002069 -0.001242 -0.004956 
+0.004624 0.001383 -0.003252 0.000767 -0.000090 -0.002908 
+0.003760 -0.001224 -0.002733 0.004047 -0.000436 -0.002961 
+0.003963 0.000772 -0.003037 0.002859 0.001459 -0.004725 
+-0.001200 0.000871 -0.005552 0.001931 -0.000019 -0.003690 
+0.002268 0.001241 -0.001527 0.000414 0.001009 -0.001174 
+0.000333 0.000032 -0.000556 -0.004100 0.000104 0.001135 
+-0.005641 -0.000077 0.000285 -0.003973 -0.000489 -0.000498 
+-0.001501 -0.000062 -0.001199 0.000660 0.000107 -0.003103 
+0.000171 -0.000887 -0.003013 -0.001334 0.000379 -0.002297 
+-0.001758 0.000766 0.001398 -0.004571 -0.001257 0.000604 
+0.001729 -0.000055 -0.005131 -0.001029 -0.001139 -0.000115 
+0.000973 -0.000135 0.000833 0.000934 -0.000670 -0.001729 
+-0.000507 0.004772 -0.001310 0.003395 0.004418 -0.001861 
+-0.000201 0.000026 -0.000426 -0.001094 -0.004588 0.000942 
+-0.002296 -0.001525 -0.001307 -0.000839 -0.000835 -0.000519 
+-0.000554 0.000601 -0.000142 0.000362 -0.000071 -0.000110 
+0.000069 -0.000150 -0.000206 0.000000 0.000000 0.002836 
+-0.001705 -0.002288 0.003060 0.001069 -0.006000 -0.005522 
+-0.005840 0.003139 -0.020769 -0.002376 0.000080 -0.014573 
+0.001754 0.000815 0.004284 0.001904 0.002608 0.015711 
+0.000429 0.005655 0.019636 -0.000774 0.007302 0.015602 
+-0.005064 0.002959 -0.003407 0.006105 -0.005189 -0.005016 
+0.004359 0.008933 -0.010856 -0.003886 0.002969 0.001208 
+-0.004341 0.000093 0.004967 -0.004124 0.000148 0.004606 
+0.002925 -0.000936 -0.006499 0.008310 -0.000357 -0.010043 
+0.009000 0.003253 -0.006974 0.004748 0.004297 -0.002473 
+0.002451 0.005568 -0.000618 0.002204 0.006745 0.002032 
+0.002384 0.010333 -0.005678 0.006657 0.012188 -0.017544 
+0.008335 0.013438 -0.022326 0.014316 0.016300 -0.021382 
+0.027909 0.014167 -0.014893 0.025700 0.007628 -0.015461 
+0.018291 0.004617 -0.006199 0.001854 0.003427 -0.006221 
+0.000241 -0.009283 -0.001867 0.008577 0.005642 0.013890 
+-0.002747 0.064601 -0.027395 -0.002093 -0.011228 0.000853 
+-0.008451 -0.008766 0.005082 -0.007869 -0.002936 0.003463 
+0.000166 -0.001408 0.005313 -0.000794 -0.000511 0.003760 
+-0.009089 0.000056 0.003770 -0.010537 0.006841 0.003228 
+-0.007130 0.003918 -0.000215 -0.001586 0.001342 -0.001108 
+0.000425 -0.000720 0.000000 -0.000828 -0.001015 0.000100 
+-0.001648 0.000190 -0.001739 -0.002456 0.001050 -0.003567 
+0.000893 0.001748 -0.000198 0.006493 -0.000206 -0.002205 
+0.004764 0.001896 -0.002700 0.006081 0.002718 -0.000922 
+0.005383 -0.000236 -0.007271 0.001085 0.005584 -0.000124 
+-0.000230 0.001204 0.000516 -0.000510 0.002039 0.000417 
+-0.000620 0.001736 0.001116 0.000064 0.000107 0.000039 
+-0.000621 -0.002441 -0.001356 -0.002224 -0.002725 -0.002510 
+-0.000384 -0.000302 -0.001089 -0.000250 0.001000 -0.000472 
+0.001108 0.000523 -0.001231 -0.002258 0.001331 -0.001331 
+-0.002320 -0.005200 0.002320 -0.000810 -0.005849 0.004757 
+-0.000577 0.000715 -0.002133 0.000986 0.003175 -0.001519 
+0.002122 0.004708 -0.000211 0.005077 0.004103 0.000586 
+0.002369 0.002923 -0.000655 0.000388 0.002327 0.001496 
+-0.000579 0.001554 0.000584 0.000455 0.001591 -0.000682 
+-0.001133 0.002388 0.000046 -0.002954 0.002745 -0.001077 
+-0.005150 0.002507 -0.001391 -0.002591 0.000551 0.001315 
+0.000633 0.001950 0.003160 0.001187 0.002279 0.002967 
+0.000832 0.000841 -0.000306 0.002144 0.003102 -0.009572 
+0.001272 0.005722 -0.015657 -0.002287 -0.000645 -0.010102 
+-0.001133 -0.001350 -0.009762 -0.002039 -0.002596 -0.016717 
+-0.002776 -0.004475 -0.023642 -0.005895 -0.002600 -0.023557 
+-0.008051 -0.001741 -0.006855 -0.006707 0.002941 -0.001744 
+-0.000792 0.000897 -0.001328 0.001589 0.002271 -0.000625 
+-0.001212 -0.002041 -0.000947 0.000621 -0.000826 0.001187 
+-0.001527 -0.003934 -0.001706 -0.000087 0.000185 -0.001267 
+-0.004259 -0.000071 -0.002131 -0.002281 -0.000238 -0.001075 
+0.002174 -0.000232 0.000488 0.006886 -0.000446 -0.002424 
+0.008767 0.005732 -0.006322 0.004982 0.006771 -0.000399 
+-0.000292 0.007390 -0.000647 -0.000392 0.006803 0.000229 
+0.000084 0.007865 0.001166 -0.001826 0.005929 0.001800 
+-0.002225 -0.001632 -0.005758 0.003403 0.001217 -0.004109 
+0.006915 -0.009796 -0.009328 0.012135 -0.016590 0.019182 
+-0.002854 -0.012164 0.007234 0.004907 0.013750 -0.005530 
+0.007226 0.014346 -0.005049 0.000554 0.002809 0.000506 
+-0.001299 0.002101 -0.000621 -0.005705 -0.001939 -0.000897 
+-0.008531 0.005384 -0.006859 -0.007068 0.011267 -0.004754 
+-0.004343 0.004125 -0.002603 -0.001485 0.000048 -0.001381 
+-0.002704 -0.005447 -0.002664 -0.002278 0.000514 -0.004199 
+-0.003814 0.000480 -0.003830 -0.001429 0.000240 -0.004060 
+0.001250 -0.000215 0.000096 0.001528 -0.001950 0.000471 
+0.001713 -0.000489 0.000258 0.002617 0.002353 0.000941 
+0.000553 0.003889 0.002682 0.000678 0.004247 0.001746 
+-0.001019 0.001150 -0.000496 -0.004793 0.000942 0.001884 
+-0.004111 -0.000582 -0.000532 -0.003899 0.000743 0.000634 
+-0.003288 0.000372 0.000590 -0.001240 -0.001081 -0.001441 
+0.000959 0.000479 -0.003223 0.002392 0.002769 -0.000269 
+0.004025 0.003349 -0.000790 0.001375 0.001404 -0.000712 
+-0.000280 -0.001121 0.002031 -0.000794 -0.003839 0.001366 
+-0.004550 -0.002881 0.002173 0.000144 -0.000352 0.000857 
+0.001301 0.002724 -0.000579 0.002417 0.001933 -0.000483 
+0.000300 -0.002123 0.000625 0.000000 -0.003750 0.001797 
+0.000650 -0.001719 0.000487 -0.000305 0.002099 -0.003321 
+-0.000665 -0.000153 -0.000585 -0.001154 -0.000535 -0.001468 
+-0.000962 -0.001086 -0.001944 0.003124 0.002136 -0.003618 
+-0.000562 0.002798 -0.001992 -0.000055 0.002537 -0.000992 
+-0.000940 0.003522 -0.002576 0.000306 0.005854 -0.007672 
+0.001528 0.008968 -0.012752 0.006539 0.011680 -0.006102 
+0.002647 0.005071 -0.000929 -0.001018 -0.002532 -0.000563 
+-0.002109 -0.003319 -0.003006 -0.005592 -0.008010 -0.013199 
+-0.003561 0.015198 -0.026426 -0.002484 0.008210 -0.011269 
+-0.001370 -0.000537 -0.000476 -0.003651 -0.002015 0.004894 
+0.003143 0.002090 -0.002252 0.007415 0.005994 -0.009478 
+0.004357 0.002531 -0.013529 -0.000279 0.000903 -0.008392 
+-0.014635 0.003624 0.000248 -0.025171 -0.005461 0.001551 
+-0.017039 -0.008399 -0.005096 -0.005256 -0.005288 -0.007724 
+-0.003218 0.000460 -0.004598 0.001500 -0.000122 -0.002116 
+0.003597 -0.001785 -0.000062 0.002856 -0.001207 0.002772 
+-0.008182 -0.000273 0.001773 -0.004095 -0.012286 0.010000 
+-0.000377 -0.006323 0.016082 -0.004590 -0.000104 0.006864 
+0.005667 -0.005667 -0.010333 0.016505 0.002046 -0.004710 
+0.005404 0.001995 -0.002310 -0.002906 0.005048 -0.000050 
+-0.003434 0.001077 0.001123 -0.007381 -0.003123 0.004114 
+-0.007837 -0.000707 0.004987 0.001861 0.005749 -0.001186 
+-0.000106 0.007064 -0.014128 0.006329 0.013236 -0.007096 
+0.003689 0.004484 -0.004341 0.001510 -0.000843 -0.000551 
+-0.002695 -0.003891 -0.004560 0.001408 -0.003197 -0.004249 
+0.004000 0.001066 -0.002328 -0.000181 0.003757 -0.002745 
+-0.001371 -0.000977 -0.000437 -0.003663 -0.003092 -0.000538 
+-0.003409 -0.001818 0.001125 -0.002460 -0.000996 0.002174 
+-0.001415 -0.003311 0.003545 0.000060 -0.001723 0.003848 
+-0.000508 -0.000339 0.001186 -0.000847 0.000068 -0.000034 
+-0.000847 0.001377 0.000162 0.000311 0.000521 0.000159 
+0.002881 -0.000250 -0.001106 0.004145 0.000972 -0.002681 
+0.003821 0.000034 -0.000118 -0.001046 -0.000300 0.000969 
+-0.001977 -0.003540 0.003253 -0.001304 -0.001959 0.001962 
+0.001121 0.001719 0.000075 0.004404 0.002312 -0.004128 
+-0.001825 0.004237 -0.001852 -0.000236 0.000564 0.001196 
+0.005527 0.003685 -0.002177 0.004434 0.004112 -0.005650 
+0.003636 -0.001273 -0.000636 0.001021 0.001810 -0.002658 
+0.000473 -0.000209 0.000352 0.000585 0.000738 -0.000254 
+-0.002371 0.002611 -0.001348 -0.004700 0.003547 -0.004180 
+-0.004422 0.000601 -0.002313 -0.000013 0.001039 -0.003914 
+-0.000076 -0.000475 -0.001032 -0.000858 -0.000961 -0.000475 
+-0.000751 0.000303 0.001311 -0.000048 0.001043 -0.001956 
+-0.000972 0.005939 -0.004114 0.000226 0.011956 -0.000438 
+0.001914 0.012221 0.002534 0.003734 0.006314 0.002847 
+0.007002 0.000191 0.006381 0.015941 0.005920 0.003721 
+0.009356 -0.001479 -0.006221 0.001967 0.002224 -0.002480 
+-0.000593 0.001932 0.000817 0.001364 0.003120 0.009125 
+-0.005630 -0.002072 0.007044 -0.011982 -0.000200 0.000878 
+-0.014359 0.002911 0.002311 -0.015356 -0.004815 -0.010712 
+-0.013762 0.010529 -0.031557 -0.007023 0.018665 -0.058728 
+0.004394 0.012800 -0.040237 0.007028 0.009343 -0.009995 
+0.001275 0.008445 -0.003701 0.000319 0.010474 -0.005284 
+0.005758 0.009697 -0.007576 0.003874 0.003183 -0.007472 
+-0.000484 -0.003988 -0.003573 -0.001005 -0.001097 -0.009871 
+0.003214 -0.001455 -0.009601 -0.011968 0.002314 0.000876 
+-0.000344 0.004348 -0.010163 -0.004721 0.010019 -0.018946 
+0.003398 0.009995 -0.018203 -0.002737 0.004329 -0.001152 
+-0.010615 -0.005036 0.005581 -0.009729 -0.005415 0.003741 
+-0.005937 -0.002625 0.000019 -0.004750 -0.000417 -0.001425 
+-0.003254 -0.000020 0.001513 -0.001432 -0.000735 0.002875 
+0.000288 -0.000268 -0.000557 0.001246 0.000135 -0.003908 
+0.001707 -0.001026 -0.005127 0.000458 -0.001654 -0.005651 
+-0.000406 -0.001138 -0.005630 -0.000063 0.001052 -0.003443 
+0.000711 -0.000266 0.000726 0.000757 -0.000052 0.000238 
+0.000551 0.001936 -0.001991 0.000522 0.002672 -0.001006 
+-0.000891 -0.000646 0.000486 -0.002183 -0.003933 0.001310 
+0.000009 -0.003919 0.000870 0.001987 -0.000622 0.000885 
+0.002222 -0.000497 0.000624 0.001448 -0.000733 -0.000578 
+-0.000968 -0.000341 -0.000007 -0.000599 0.000427 0.001742 
+0.001083 0.002221 0.001194 0.000156 0.003516 -0.000312 
+0.000118 0.000432 0.000341 -0.001894 -0.000041 0.001712 
+-0.000541 -0.000533 0.003746 -0.001527 -0.001237 -0.000038 
+0.002411 -0.002181 -0.006250 0.003087 0.000161 -0.000327 
+-0.000117 -0.000110 0.000281 -0.000735 -0.002381 0.000783 
+0.000008 -0.001538 0.000050 -0.000106 0.000371 -0.001300 
+0.002482 0.003242 -0.003647 -0.000523 0.003225 0.000058 
+-0.001850 0.001996 -0.001492 -0.001270 0.008015 -0.001449 
+0.005297 0.003065 -0.004920 -0.002037 0.003185 -0.000044 
+-0.000928 0.001291 -0.000775 0.001472 0.002404 -0.001024 
+-0.000418 0.002057 -0.003138 -0.002785 0.002971 -0.000297 
+-0.001963 0.001829 0.002790 -0.003519 -0.002053 -0.000309 
+0.002111 0.001322 -0.004371 0.004898 0.005177 -0.005543 
+0.004392 0.006533 -0.005152 0.000473 0.005446 -0.007070 
+-0.005645 0.002970 -0.004528 -0.007321 -0.001859 0.002364 
+-0.007754 -0.008059 0.009727 -0.006749 -0.011768 0.008613 
+-0.015608 -0.005673 -0.023526 -0.002165 -0.035582 -0.052020 
+-0.004089 -0.003534 0.035077 -0.003803 -0.011068 0.039231 
+-0.003889 -0.011633 0.044597 -0.003104 -0.009686 0.039352 
+0.000944 -0.005311 0.021764 0.006841 0.002623 -0.002687 
+0.006855 0.006426 -0.002228 0.001874 0.004048 -0.001414 
+0.005363 0.004407 -0.001410 0.013461 0.017445 -0.011501 
+0.016246 0.022016 -0.010972 0.019132 0.025165 -0.004198 
+0.032847 0.028551 -0.022593 0.009675 0.003253 -0.027672 
+-0.002719 0.007299 -0.005775 -0.003712 0.006624 -0.002245 
+-0.002578 0.005769 -0.007558 -0.002766 0.009921 -0.008364 
+-0.004293 0.007032 -0.000261 0.000072 0.002147 0.000325 
+0.003197 0.000061 -0.000643 0.001947 -0.001396 -0.000230 
+0.000432 -0.001006 -0.000047 0.000028 0.001532 -0.000161 
+-0.000619 0.001830 0.000576 -0.000184 0.000687 0.000629 
+-0.001075 -0.000552 -0.001756 0.003116 -0.000825 -0.004440 
+0.006001 0.004364 -0.007154 0.003932 0.006316 -0.005165 
+-0.000182 0.003222 -0.002865 -0.002821 0.001491 -0.001192 
+-0.003212 -0.000888 -0.000042 -0.001733 -0.002921 0.000307 
+-0.001694 -0.001260 0.000111 -0.001435 0.000912 0.000739 
+0.000795 0.001612 0.000610 0.000592 0.001054 0.000848 
+-0.000438 0.000860 0.000082 0.002206 -0.000651 -0.000125 
+0.004076 0.004317 -0.009349 -0.000037 0.004657 -0.006786 
+0.002353 0.004460 -0.003982 0.002705 0.001523 -0.003230 
+-0.000177 -0.001153 -0.000015 -0.003996 -0.002121 0.003495 
+-0.002944 -0.005630 -0.001515 -0.001050 -0.001155 -0.002040 
+0.004324 0.000856 -0.009505 0.002919 -0.001627 -0.009665 
+0.000753 0.001370 -0.009815 -0.001589 0.003168 -0.006848 
+0.000981 0.000751 -0.002664 0.001744 -0.001580 -0.002118 
+-0.001795 -0.001897 -0.003313 -0.002752 0.000599 -0.003461 
+-0.000656 0.002778 0.000915 -0.001002 0.001121 -0.000077 
+0.000448 0.001604 0.005708 0.000008 -0.002411 -0.001736 
+-0.000790 -0.004280 -0.000433 0.003772 -0.001360 -0.004975 
+0.000844 -0.000743 -0.004313 -0.001299 0.002002 -0.005073 
+-0.001296 0.001260 -0.005106 -0.000146 0.000422 -0.002214 
+0.001473 0.001878 -0.001694 0.001844 0.007032 -0.004015 
+0.006511 0.009465 -0.007256 0.006999 0.003371 -0.007032 
+-0.000488 0.002429 -0.001942 -0.005074 0.003166 -0.002633 
+-0.003001 0.002512 -0.003008 0.000222 0.000109 0.000229 
+-0.006022 0.000502 -0.017089 -0.035604 0.015063 -0.038343 
+-0.004360 -0.008573 0.035403 -0.477528 -1.691011 5.601124 
+-0.556851 -2.096210 6.081633 -0.466667 -2.153086 6.022222 
+-0.367550 -1.966887 5.480133 -0.004170 -0.010029 0.029674 
+0.003117 0.014271 -0.012387 0.002886 0.022955 -0.012100 
+0.004488 -0.001236 0.003927 0.004673 0.003570 0.004322 
+0.004340 0.003424 -0.000143 -0.000787 -0.000702 0.000403 
+-0.008995 -0.010171 0.008950 -0.008395 -0.005814 0.007198 
+0.001854 0.005131 -0.008197 0.002743 0.004839 -0.011534 
+0.000635 0.005454 -0.009087 0.003084 0.007946 -0.012646 
+0.002621 0.011755 -0.011750 0.000192 0.002898 -0.000989 
+-0.006610 -0.001992 0.002389 -0.007486 -0.000118 0.000951 
+-0.006219 0.004837 0.001185 -0.002757 0.007099 0.000637 
+-0.000589 0.005360 -0.000366 0.000241 0.003891 -0.001888 
+-0.002450 0.003160 -0.001186 0.003629 0.000196 -0.001999 
+0.002677 0.004029 -0.004114 0.001203 0.003774 -0.001882 
+-0.000013 0.001465 -0.000992 0.000647 -0.002309 0.000415 
+-0.002660 -0.005118 -0.001639 -0.003450 -0.003257 -0.002204 
+-0.005180 -0.003096 0.000160 -0.002683 -0.001787 0.000298 
+-0.000019 -0.003500 -0.000002 -0.002490 -0.004873 -0.000155 
+-0.006490 -0.002158 -0.001231 -0.006535 0.000703 -0.001220 
+-0.002899 0.001893 0.000484 0.000380 -0.000915 -0.000157 
+0.000883 -0.001144 0.001308 0.001727 -0.001744 -0.002968 
+0.000064 -0.002549 -0.000979 -0.001587 0.000339 0.000629 
+-0.001077 0.000718 0.001798 0.000535 -0.000182 -0.000317 
+-0.001800 -0.001860 -0.004973 -0.004120 0.002357 -0.002037 
+-0.003644 0.003796 0.000354 0.002222 -0.001340 -0.001638 
+0.000920 -0.000562 -0.006134 -0.001946 -0.001777 -0.004045 
+-0.002463 -0.000791 -0.002895 -0.002648 0.002463 0.000424 
+0.000757 0.006233 0.002582 -0.001078 -0.002556 0.005652 
+0.001486 0.001548 0.001606 -0.003117 0.000000 -0.000831 
+-0.001685 0.004579 -0.002297 0.000228 0.003993 -0.006949 
+-0.000226 0.000992 -0.006050 -0.001249 -0.000646 -0.002393 
+0.001659 -0.000381 -0.002614 -0.003667 -0.001420 -0.004697 
+-0.004434 0.000426 -0.000998 -0.000520 0.002635 -0.003242 
+0.000402 0.002703 -0.006095 0.000159 0.002136 -0.006364 
+-0.002016 0.001934 -0.006909 -0.006601 -0.001071 -0.006781 
+-0.004850 0.002260 0.000235 -0.000854 -0.000072 0.004063 
+0.000791 0.006771 -0.019365 -0.022587 0.013441 -0.034421 
+-0.004669 0.007766 0.013743 -0.684211 -1.976077 6.248804 
+-0.703896 -2.436364 6.831169 -0.653422 -2.485651 6.642384 
+-0.554622 -2.266106 5.994398 -0.262295 -1.355191 4.240437 
+0.001307 0.012139 -0.010697 -0.004833 0.021347 -0.014832 
+-0.001887 -0.000560 0.005135 0.003552 -0.002726 0.007704 
+0.001406 0.003359 -0.003359 0.002235 -0.001029 -0.004471 
+-0.002733 -0.002993 0.003445 0.002673 -0.001665 0.001647 
+0.007655 0.001859 -0.008114 0.000048 0.000431 -0.009785 
+-0.002516 0.003629 -0.004261 -0.006820 0.001228 -0.002626 
+-0.004573 0.000614 -0.004307 -0.002087 0.001905 -0.001439 
+-0.001081 -0.002340 0.001451 -0.003398 -0.002233 0.000875 
+-0.004520 0.004558 0.001369 -0.000357 0.004731 0.003260 
+0.001750 0.001739 -0.000161 -0.000234 -0.001636 -0.000777 
+0.000280 -0.000798 -0.000789 -0.002482 0.002923 -0.001323 
+-0.000375 0.003564 -0.001267 0.000576 0.004373 -0.000859 
+0.002951 0.002371 -0.001583 0.004276 0.000620 -0.004462 
+-0.000588 0.002680 -0.006798 -0.001397 -0.001428 -0.002266 
+0.003205 0.007823 -0.000631 0.000828 0.007964 -0.001720 
+0.001796 0.004025 -0.000959 0.002466 0.001422 -0.000656 
+0.000526 0.001393 -0.004222 -0.002821 -0.000143 -0.003427 
+-0.006089 -0.000306 0.002724 -0.001121 -0.006164 0.003922 
+-0.000755 0.000472 0.000568 0.000377 -0.001431 -0.001657 
+0.004672 0.001647 -0.002259 0.001406 -0.000982 -0.001110 
+-0.000865 -0.000339 0.001750 -0.000126 0.002158 0.001524 
+-0.001308 -0.000290 -0.000497 -0.003075 0.003699 0.000944 
+-0.001126 0.003332 -0.000561 0.000708 0.000559 0.000601 
+-0.000864 -0.001653 0.001502 0.000403 -0.003937 -0.000157 
+0.000021 -0.001019 -0.001801 0.001440 0.000684 0.001633 
+0.004428 0.005618 0.002978 0.002230 0.004937 0.003309 
+0.003603 -0.000005 0.001111 0.002616 0.000242 -0.000972 
+0.003208 -0.000802 -0.002731 0.001608 -0.003748 -0.004823 
+-0.002446 -0.005869 0.000427 0.001646 -0.007868 -0.001498 
+-0.002759 -0.002989 -0.000920 -0.005375 -0.002083 0.000211 
+-0.005655 -0.002566 0.002932 -0.002427 -0.005419 0.002175 
+-0.005319 -0.001330 -0.007310 0.000637 0.004965 -0.008429 
+0.002413 0.005208 -0.011740 0.000125 0.003146 -0.007850 
+-0.000160 0.000406 -0.001287 -0.001334 0.002572 -0.005095 
+-0.011284 0.010639 -0.030757 -0.001193 0.016745 -0.049125 
+-0.000551 -0.007197 0.028604 -0.429268 -1.921951 6.195122 
+-0.758170 -2.529412 7.065360 -0.774390 -2.670732 6.737805 
+-0.557692 -2.273077 5.400000 -0.001013 -0.008953 0.027181 
+0.001167 0.006466 -0.004152 0.001932 0.000014 -0.008004 
+0.000981 -0.002426 0.000007 -0.001302 -0.001624 0.002238 
+-0.005189 0.006220 -0.006883 -0.019354 0.003631 -0.009093 
+-0.006485 -0.007093 -0.001041 0.002170 0.002268 0.003407 
+0.005276 0.008568 0.000486 0.006183 0.009247 -0.009767 
+0.002260 0.008466 -0.012560 0.000738 0.006615 -0.008999 
+0.000915 0.002296 -0.002285 -0.002988 0.000112 0.003940 
+-0.012062 -0.000176 0.002632 -0.009479 -0.003874 -0.003467 
+-0.002721 0.005108 -0.004178 0.007002 0.006628 0.001131 
+-0.000150 0.001600 0.001261 -0.006953 -0.006062 0.004794 
+-0.003859 -0.007064 0.002273 0.001541 -0.001447 -0.000391 
+0.000108 0.000764 -0.001429 -0.001176 0.000963 -0.000086 
+0.001875 0.003714 0.002476 0.001988 0.000891 -0.000295 
+-0.001834 -0.001218 -0.000866 -0.006050 -0.001946 0.002241 
+-0.006458 -0.002456 0.004217 -0.005407 -0.001101 0.001815 
+-0.003120 -0.000394 0.000355 -0.001650 -0.002413 -0.000027 
+-0.000434 -0.005078 -0.000724 -0.002423 -0.007141 -0.000946 
+-0.006528 -0.006662 0.001334 -0.005965 -0.002493 0.007123 
+-0.003607 0.000729 0.005594 -0.005526 0.000484 -0.001189 
+-0.001275 -0.004047 -0.001145 0.000584 0.000314 0.000316 
+0.002669 -0.000834 -0.000375 0.000569 -0.000668 0.001780 
+-0.001289 -0.002984 0.001009 -0.000026 -0.002076 0.001606 
+0.000402 0.000110 0.000204 -0.000634 -0.000254 0.000735 
+-0.001627 0.000922 0.000318 -0.000523 -0.001349 -0.001969 
+-0.001616 -0.002016 -0.002483 -0.000562 -0.000410 -0.000452 
+-0.001461 0.001287 0.000487 -0.003622 0.000179 0.004048 
+-0.000746 -0.001605 0.000757 -0.001282 -0.002929 -0.002049 
+-0.000746 -0.003013 -0.004924 -0.003928 -0.003991 -0.003415 
+-0.003260 -0.004045 -0.005177 -0.004718 -0.000381 -0.007501 
+-0.001587 0.002866 -0.009867 -0.004860 0.000746 -0.005311 
+-0.003509 0.001546 -0.008830 0.002378 0.001718 -0.008407 
+0.001181 -0.000523 -0.000064 -0.001861 -0.001070 0.002183 
+0.000317 0.001098 -0.001601 0.002334 0.007574 -0.002160 
+0.003693 0.008491 0.002573 0.007898 0.012960 0.000208 
+0.018331 0.024172 -0.030153 0.000993 0.014323 -0.041872 
+0.000139 0.006155 0.005864 0.158621 -1.027586 4.206897 
+-0.202073 -2.000000 5.538860 -0.238342 -2.139896 5.145078 
+0.001874 -0.007584 0.032789 -0.001494 0.000083 0.004072 
+-0.000575 0.007346 -0.007355 -0.001774 0.002358 0.001159 
+0.001192 0.003019 -0.000847 0.002615 0.006521 -0.007954 
+-0.004828 0.004694 -0.005901 -0.007075 -0.007075 0.007620 
+-0.001084 -0.015346 0.009654 -0.003661 -0.005860 0.005791 
+0.002141 0.001760 -0.003832 0.003964 0.000160 -0.010104 
+0.004877 0.005324 -0.006586 -0.003876 0.002841 -0.005649 
+-0.002159 0.004900 0.001381 0.002876 0.008051 -0.002691 
+0.003960 0.007784 -0.006888 0.004570 -0.000649 -0.002887 
+-0.003425 0.001634 -0.005401 -0.003949 0.001071 -0.002626 
+-0.002766 0.003344 0.001091 0.002100 0.001940 -0.001292 
+0.001726 0.000859 -0.005184 -0.001364 -0.002063 0.000203 
+-0.004044 -0.002936 0.003311 -0.000920 0.000692 0.000016 
+0.001969 0.006113 -0.003674 0.003169 0.005642 -0.005145 
+0.001169 0.003148 -0.002639 0.001237 0.002345 -0.002163 
+0.002803 0.003774 -0.001241 0.002984 0.003694 0.000339 
+-0.000801 0.001055 0.000063 -0.007193 -0.004730 -0.000922 
+-0.010682 -0.006865 0.002610 -0.001749 0.000317 0.002027 
+0.000286 0.004104 -0.004724 -0.000206 0.002663 -0.003357 
+-0.002437 -0.001462 0.001022 -0.004099 -0.004745 0.002555 
+-0.005393 -0.003636 -0.000296 -0.003002 -0.000380 -0.002693 
+-0.001643 -0.000569 -0.002654 -0.002348 -0.002125 -0.000885 
+-0.000187 0.000047 0.006667 -0.000091 -0.002936 0.006515 
+-0.000253 -0.003877 0.003362 -0.003953 -0.003107 0.003265 
+-0.004083 0.000924 0.003012 -0.002675 0.001620 0.001326 
+-0.001020 0.000938 0.000421 -0.000033 0.002659 0.001138 
+0.000820 0.008688 0.000651 -0.002759 0.008336 -0.007446 
+-0.002171 0.007220 -0.001410 -0.001304 0.000173 -0.001945 
+-0.005320 0.000490 -0.001607 -0.001339 -0.000484 -0.005282 
+-0.008913 -0.004564 -0.006627 -0.008801 0.000170 -0.000277 
+-0.003733 0.002255 -0.000172 -0.001875 0.000638 -0.000330 
+0.001510 0.001733 0.000318 0.000258 0.002223 -0.000612 
+0.004026 0.000144 -0.001649 0.006712 0.000708 -0.002617 
+0.003513 0.003924 -0.001301 -0.000354 0.003729 -0.002777 
+-0.001255 0.000306 -0.000968 -0.003233 -0.001991 0.002933 
+-0.002403 0.001318 -0.004376 0.002232 0.005399 -0.015479 
+0.004697 0.003436 -0.011243 0.001547 0.001276 -0.000661 
+0.003398 -0.000627 0.006107 -0.001012 -0.000683 0.004198 
+-0.004502 0.002616 -0.001408 -0.000662 0.002930 -0.006305 
+0.003442 -0.001873 -0.008249 0.008034 0.003199 -0.004790 
+0.003873 0.001805 -0.004562 -0.000525 0.001908 -0.006307 
+0.002857 0.002172 -0.007852 0.010153 0.004973 -0.010240 
+0.011142 0.010519 -0.010600 0.005996 0.004675 -0.007079 
+-0.001867 0.004522 -0.007551 0.000453 0.004243 -0.003221 
+0.000821 0.004327 -0.004798 -0.001887 0.004378 -0.005556 
+0.003438 0.001271 -0.002129 0.002682 0.003515 -0.003651 
+-0.000130 0.000704 -0.008392 -0.000692 -0.001823 -0.008232 
+-0.002981 -0.005157 -0.011470 -0.008570 -0.006424 -0.001643 
+-0.004146 0.000977 -0.000642 -0.003486 0.001267 0.000825 
+-0.004699 -0.003201 0.005878 -0.002361 -0.006963 0.003442 
+-0.000002 -0.000518 -0.000119 0.006932 0.005066 -0.004018 
+0.006365 0.007525 -0.005980 0.000435 0.004348 -0.007130 
+0.000229 0.001047 -0.006222 -0.000915 0.003224 -0.000761 
+0.000244 -0.000178 0.000062 0.001593 -0.002504 0.000004 
+0.000331 -0.001284 -0.000379 -0.000649 0.001209 0.000550 
+0.001617 0.002625 -0.000653 0.001700 0.005843 0.000757 
+-0.000105 -0.000178 -0.000240 0.007692 -0.000436 -0.002831 
+0.001620 0.002471 -0.000624 -0.004014 -0.003070 0.007623 
+-0.007500 -0.004368 0.008735 -0.002685 -0.002019 0.003802 
+-0.001863 0.005083 -0.004025 -0.003358 0.003918 -0.004062 
+-0.001910 -0.000970 0.003844 -0.006151 -0.002664 0.002566 
+0.000204 -0.000167 -0.000430 0.000545 0.000149 0.000630 
+-0.002232 0.003784 0.000635 -0.003707 0.005185 0.000168 
+-0.003536 0.003416 0.001047 0.002800 0.002132 0.000518 
+0.003906 0.002622 -0.001336 -0.000063 0.002768 -0.000175 
+-0.000479 0.002049 0.000613 0.000390 0.000372 -0.000083 
+0.001148 0.000255 -0.001606 -0.002141 -0.002061 -0.001975 
+-0.005844 -0.004618 0.000730 -0.004026 -0.003856 0.004196 
+0.000250 -0.000108 0.000406 0.001946 0.001728 -0.002023 
+0.002577 0.001547 0.000154 0.001004 -0.000490 -0.000465 
+-0.000118 -0.001771 0.000778 0.000420 -0.001332 0.000232 
+-0.001099 0.000018 0.000248 -0.000570 -0.000621 0.001120 
+0.001715 -0.000489 0.000279 0.004667 0.002727 -0.003788 
+0.005320 0.007402 -0.007530 0.004192 0.009159 -0.009543 
+0.003070 0.007364 -0.009477 0.001301 0.006497 -0.007566 
+-0.002214 0.007105 -0.005650 -0.001658 0.004567 -0.008234 
+0.000641 0.005032 -0.010450 0.009187 0.005389 -0.014539 
+0.008876 0.002615 -0.016548 0.004024 0.001774 -0.010620 
+0.001728 0.000147 -0.001618 0.001188 -0.001252 0.003497 
+0.003341 0.000394 0.000876 0.005671 0.004737 -0.006253 
+0.003572 0.005136 -0.009003 -0.001962 0.001417 -0.004381 
+-0.005854 -0.000397 0.000258 -0.002541 0.001400 -0.000458 
+0.000994 -0.001054 -0.003855 -0.001366 -0.002522 -0.003268 
+-0.001960 -0.006078 0.003568 -0.007687 -0.004645 0.003706 
+-0.001044 -0.004652 0.001383 0.000138 0.001701 0.001679 
+0.011943 -0.002053 -0.012654 0.008295 -0.002508 -0.012404 
+0.003548 -0.000795 -0.002122 -0.001227 -0.002639 0.000395 
+0.001391 -0.004280 -0.001118 0.002742 -0.001211 -0.002569 
+0.002831 0.001187 -0.004291 0.001134 0.000833 -0.003805 
+0.002325 0.001729 -0.003832 0.000390 0.000270 0.000410 
+-0.001696 0.003456 -0.001869 0.000283 0.000365 0.000066 
+-0.001647 -0.000824 -0.001934 -0.003264 -0.000234 -0.002763 
+0.000211 0.000644 0.000336 0.007367 0.002828 -0.002807 
+0.007399 0.003995 -0.002590 0.006423 0.003370 0.001053 
+0.000917 0.006656 -0.002349 -0.002540 0.002983 -0.000188 
+0.000985 -0.002954 0.003435 -0.002953 -0.005865 0.006357 
+0.002441 -0.003611 0.001412 0.002569 -0.003466 -0.002809 
+0.007059 -0.001454 -0.002429 0.003693 -0.002269 -0.001853 
+-0.002519 0.002231 -0.000432 0.002368 0.003812 0.001622 
+0.001451 0.000466 0.000457 -0.002457 0.000038 -0.000462 
+-0.003626 0.001653 -0.000484 -0.001792 0.003133 -0.000021 
+-0.001544 0.002068 -0.000223 -0.007376 0.000617 -0.000752 
+-0.007263 -0.003094 0.008791 0.000088 0.000319 0.000045 
+-0.000512 0.002230 0.000076 0.003377 0.000059 -0.000948 
+0.002309 0.002740 -0.002539 0.004737 0.001142 0.000945 
+0.003232 0.001797 -0.002687 0.000045 0.003571 -0.001523 
+-0.001300 0.002169 -0.000712 -0.000785 -0.002243 -0.000226 
+-0.002628 -0.005325 0.000061 -0.001825 -0.002705 0.001304 
+0.001067 0.001312 -0.002176 0.001177 0.003056 -0.005374 
+0.002562 0.002294 -0.007121 0.002843 0.001275 -0.006323 
+0.000187 0.001150 -0.003636 -0.000803 -0.000713 -0.001667 
+-0.001352 -0.000449 -0.001729 0.001315 0.002153 -0.004586 
+0.003162 -0.001632 -0.001650 0.005083 0.002616 -0.002775 
+-0.000112 0.000029 -0.000740 -0.002725 -0.000702 0.000899 
+-0.001046 0.001579 -0.002675 -0.000407 0.002649 -0.005675 
+-0.000826 0.001588 -0.003522 -0.000842 0.000189 0.000009 
+0.000614 -0.000119 -0.000283 0.001801 0.000211 -0.002918 
+0.000927 0.000386 -0.003524 -0.003003 -0.000901 -0.001796 
+-0.006940 -0.001812 -0.000202 -0.007387 -0.002683 -0.000948 
+-0.004745 -0.000622 -0.003557 -0.000743 0.004535 -0.004343 
+0.005981 0.005019 -0.002298 0.005476 0.000984 -0.005230 
+0.003335 0.000515 -0.002634 0.002015 0.002071 -0.000489 
+0.001108 0.003361 -0.001860 0.001977 0.004632 -0.002794 
+-0.003361 0.001473 -0.009909 -0.008215 -0.015005 -0.003052 
+-0.010185 -0.008656 -0.000344 -0.009880 -0.003366 -0.000308 
+-0.004915 -0.000264 -0.000325 -0.000854 0.000877 0.000963 
+0.001513 0.001809 0.001215 0.001185 -0.000785 -0.000034 
+-0.000621 -0.000695 -0.001216 0.002237 -0.000477 0.000177 
+0.001657 -0.001893 0.000444 -0.000197 -0.001833 0.003512 
+0.000138 -0.001952 -0.003927 -0.000332 0.001454 -0.000421 
+0.004945 0.005960 -0.002734 0.005283 0.004279 -0.002785 
+0.001352 0.003958 -0.001518 -0.000185 0.004736 -0.001168 
+0.000358 0.003483 -0.003415 0.002055 0.002648 -0.002451 
+0.000726 0.001128 -0.002692 -0.000874 0.001057 -0.001562 
+-0.001496 0.001102 -0.001102 -0.002522 -0.001492 0.000138 
+-0.002464 -0.003897 -0.001311 -0.001691 -0.000267 -0.001116 
+0.003829 -0.004222 -0.000078 0.003126 -0.002308 -0.000166 
+-0.001212 0.001671 0.000217 -0.002350 0.004190 0.000330 
+0.001020 0.004956 0.001454 0.003418 0.005895 0.002660 
+0.003486 0.004562 0.002008 0.000713 0.001881 0.000038 
+0.000878 0.000107 0.001687 0.001878 -0.000058 0.001696 
+0.001926 0.001249 0.001664 0.003428 0.003643 -0.001994 
+0.000056 -0.001612 -0.002267 -0.000884 -0.000394 -0.002574 
+-0.002602 0.000342 0.001004 -0.003569 -0.001644 0.000797 
+-0.003030 -0.000468 -0.000540 -0.001709 0.000000 -0.003333 
+-0.000054 0.001401 -0.002387 0.000152 -0.000004 -0.001422 
+-0.000202 0.000172 0.000398 -0.000751 0.000115 -0.000337 
+-0.000781 0.001264 -0.002166 0.002199 0.001316 -0.003955 
+-0.000744 -0.000271 -0.005140 0.000605 0.000825 -0.001449 
+0.000011 -0.002370 -0.000091 -0.000999 -0.001817 0.001094 
+-0.002740 -0.001370 0.001024 -0.000627 0.001172 -0.001045 
+-0.001549 0.001105 0.000585 -0.002863 0.000259 0.001548 
+-0.004569 -0.000524 0.001296 -0.005453 -0.001651 -0.000658 
+-0.003930 -0.004043 -0.003524 -0.003060 -0.005571 -0.002131 
+-0.002201 -0.000736 -0.003291 0.000296 -0.001037 -0.004393 
+-0.000203 -0.002218 -0.001882 0.000759 0.000382 0.000215 
+0.003023 -0.001146 -0.000561 0.002225 -0.000178 0.000462 
+0.002197 0.000584 -0.001246 0.001180 0.001612 -0.003863 
+0.001106 0.003628 -0.006443 0.004460 0.005747 -0.008059 
+0.001550 0.003652 -0.006181 0.000726 0.001789 -0.001697 
+0.001897 -0.000940 0.001798 0.001586 -0.000611 0.002097 
+0.004474 0.003697 -0.001835 -0.001430 -0.003592 0.002385 
+-0.015640 -0.018604 0.001818 -0.011027 -0.013243 -0.001001 
+-0.003402 -0.005978 -0.002359 -0.001116 -0.000465 -0.000140 
+0.000133 0.002154 0.001594 0.001810 0.001901 0.000297 
+0.004244 0.001768 -0.000494 0.003321 0.000344 0.002207 
+-0.000853 0.000285 -0.000020 -0.001773 -0.000452 -0.003855 
+0.001781 -0.002283 -0.004909 0.004209 -0.001303 -0.002054 
+0.002540 0.000519 0.000281 0.001672 0.003472 -0.002221 
+0.001483 0.000215 -0.002350 0.002090 -0.000418 -0.004016 
+0.001160 0.002491 -0.005066 -0.001044 -0.002757 -0.006112 
+0.000090 -0.003047 -0.002986 0.000168 0.001263 -0.006392 
+0.000600 0.000163 -0.001670 -0.000434 -0.004077 -0.000507 
+0.001329 -0.004520 0.000856 -0.000697 -0.004825 -0.000619 
+0.000883 0.000471 0.000320 -0.003820 -0.000679 -0.001644 
+-0.001845 -0.000861 -0.001392 0.005166 0.001250 0.002605 
+0.010330 0.007921 0.002817 0.009164 0.008967 0.001634 
+0.005868 0.003656 0.002950 0.001727 0.001113 0.003188 
+0.000591 -0.001978 -0.000470 -0.001789 -0.000533 -0.001396 
+-0.003689 -0.000321 0.000077 -0.001948 0.000818 0.001251 
+0.000586 -0.000327 0.000373 0.003852 -0.000567 -0.000628 
+0.005199 0.001514 -0.000031 0.001336 0.001847 0.000493 
+0.000516 -0.000783 -0.000849 0.000427 -0.000037 -0.000396 
+-0.004334 0.000513 -0.002585 -0.005199 0.000153 -0.000255 
+-0.000678 0.000547 -0.000459 0.000715 0.001902 -0.002221 
+0.000489 0.001289 -0.005481 -0.001102 -0.000701 -0.003406 
+0.000472 -0.004577 0.000046 0.001087 -0.001967 -0.001581 
+0.000314 -0.002466 -0.001789 0.000983 -0.001111 0.000206 
+0.000345 0.001427 -0.001451 -0.002434 0.004233 -0.000450 
+-0.002002 0.002478 -0.003431 -0.001127 0.000410 -0.001806 
+-0.001681 -0.002804 0.000002 0.000719 -0.004281 -0.001403 
+-0.001128 -0.005128 -0.002362 0.000356 -0.002259 -0.002139 
+0.000000 0.001231 -0.002231 0.001943 0.000660 -0.000506 
+0.000998 -0.001421 -0.001401 0.001671 -0.000464 -0.001277 
+-0.000179 0.000659 -0.001228 -0.000713 0.002011 0.001375 
+-0.000917 0.000987 0.002379 -0.002237 -0.000839 0.000208 
+-0.001802 -0.001160 -0.000142 -0.000655 -0.000506 0.000646 
+0.000917 -0.000078 0.001717 -0.000943 -0.000080 0.000676 
+-0.001985 -0.002291 0.001460 -0.001775 -0.004101 0.002863 
+-0.000122 -0.003541 0.003386 0.000046 -0.003493 0.003366 
+-0.004293 -0.008123 0.005443 -0.007880 -0.010432 0.000473 
+-0.006914 -0.007154 -0.003889 -0.006075 -0.006117 -0.003185 
+-0.005428 -0.002334 -0.000517 -0.000782 0.001727 0.001456 
+0.003376 0.002547 0.002517 0.003716 0.001445 0.002578 
+0.003638 0.000114 0.001271 0.008331 0.001097 0.001722 
+0.010043 0.004081 0.002185 0.005324 0.001410 -0.000077 
+0.001897 -0.000137 -0.001305 0.000521 0.000367 -0.000111 
+-0.001686 -0.002252 0.002203 -0.004210 -0.000902 0.003314 
+-0.003985 -0.004850 0.002068 -0.004050 -0.002311 -0.001811 
+0.001446 0.000693 -0.001551 -0.000869 -0.002038 -0.005664 
+0.001159 -0.000758 -0.004635 -0.001398 0.000986 -0.001553 
+0.000124 0.004200 -0.000893 0.002353 0.002378 -0.005153 
+0.002276 -0.001307 -0.000285 0.000329 -0.002555 -0.001678 
+-0.002574 -0.003886 -0.002763 -0.006222 -0.006528 -0.002114 
+-0.007139 -0.006791 -0.001648 -0.004840 -0.003013 -0.002898 
+-0.002766 -0.000225 0.000882 -0.003099 0.002952 0.002033 
+-0.003097 0.003270 0.001578 -0.003776 0.001276 0.000079 
+-0.002058 -0.001681 0.002899 0.002090 -0.002592 0.001177 
+0.008168 -0.002668 -0.003332 0.012088 0.004044 -0.006299 
+0.005346 0.009979 -0.007260 0.004099 0.008123 -0.006890 
+0.003149 0.006176 -0.004520 0.002954 0.005043 -0.006124 
+-0.000100 0.006502 -0.001523 0.004141 0.001758 0.000977 
+-0.000942 0.000428 -0.004453 -0.002257 0.003445 -0.001473 
+-0.001268 0.003219 0.001219 -0.000056 0.001417 0.001759 
+-0.001269 0.001010 -0.002288 -0.001687 -0.000981 -0.001897 
+0.003248 -0.001507 -0.002667 0.002474 -0.000794 -0.000594 
+0.002654 0.003923 0.000885 0.002158 0.010204 -0.005364 
+-0.002096 0.007762 0.000510 -0.001167 0.005318 -0.002618 
+0.001538 0.001426 -0.001141 0.002162 0.001709 -0.001469 
+-0.000115 0.003641 -0.002107 -0.000034 0.004581 -0.001481 
+0.002662 0.002858 -0.001625 0.005898 -0.000161 -0.006299 
+0.000838 -0.003179 -0.008528 0.001532 -0.002846 -0.002502 
+-0.002403 -0.000043 -0.001253 -0.000990 0.000463 -0.000408 
+0.003870 0.005087 -0.004603 0.003958 0.007795 -0.003315 
+0.001040 0.003731 -0.000128 0.000163 -0.002636 0.001355 
+-0.000968 -0.004854 0.001842 0.001319 -0.001465 -0.000147 
+-0.000099 0.002635 -0.001444 -0.000323 0.001269 -0.002098 
+0.002182 0.002802 -0.000429 0.000094 -0.001509 0.000849 
+-0.002266 -0.006603 -0.000622 -0.005688 -0.008298 -0.001166 
+-0.010407 -0.009548 -0.003040 -0.014695 -0.011957 -0.006047 
+-0.011243 -0.015591 -0.008114 -0.002712 -0.013635 -0.009378 
+-0.000950 -0.006709 -0.005917 -0.001555 -0.005285 -0.005427 
+0.000897 -0.027969 -0.030251 -0.018255 0.007455 0.007036 
+-0.026881 0.048146 0.071583 0.010600 0.000346 -0.004753 
+0.007294 -0.004445 -0.015845 -0.000937 -0.002700 -0.003613 
+-0.002271 -0.002789 -0.001266 -0.002100 -0.003644 -0.001066 
+-0.000980 -0.002543 -0.002106 -0.000980 -0.002602 -0.000963 
+-0.001407 -0.002240 -0.002303 -0.003103 -0.004011 0.000497 
+-0.003333 -0.003178 0.000078 0.001713 -0.000890 0.000802 
+0.005520 -0.000120 -0.000120 0.006799 0.001977 -0.003288 
+-0.003907 -0.000626 -0.001771 -0.003125 0.000199 -0.000564 
+-0.001306 0.000875 0.000280 -0.001609 -0.000452 -0.000040 
+-0.002572 -0.004085 -0.000209 -0.000777 -0.005878 0.002285 
+0.001610 -0.001546 0.000549 -0.001039 -0.000050 -0.001277 
+-0.000784 -0.000713 -0.000997 0.002971 0.001397 -0.001233 
+0.000562 0.002114 -0.001891 -0.001334 0.002163 0.001450 
+-0.001959 0.003045 -0.003720 0.003074 0.005310 -0.014817 
+0.004450 0.007833 -0.014534 0.004083 0.007218 -0.009655 
+0.001674 0.002447 -0.003103 -0.000354 -0.002133 0.001852 
+-0.000649 -0.003897 0.000543 -0.000702 -0.001618 -0.002457 
+-0.001643 0.000979 -0.002343 -0.003623 -0.000034 0.001049 
+-0.001721 -0.002210 0.004675 -0.000047 -0.001072 0.004620 
+0.000778 -0.001001 0.003047 0.001787 -0.000213 0.001573 
+-0.001837 -0.002664 0.000023 -0.000917 -0.001759 -0.000557 
+0.002022 0.001143 0.000201 0.002538 0.002551 0.001458 
+0.000194 0.001589 0.001085 0.000761 -0.000604 0.000919 
+-0.000676 -0.001396 0.001607 -0.000188 0.000313 -0.001192 
+-0.000014 0.000631 -0.001879 -0.000574 0.001319 -0.001463 
+0.001228 0.001905 -0.000551 0.001037 0.004444 -0.003407 
+0.000467 0.002042 -0.004271 -0.000974 0.000593 -0.001231 
+-0.000705 0.000644 -0.000123 0.000496 0.003372 -0.001686 
+-0.003260 0.003612 -0.000764 -0.002811 0.005224 -0.000278 
+-0.000756 0.001169 0.000776 -0.001428 -0.001315 -0.000151 
+-0.001974 -0.001128 0.000744 -0.003107 0.001993 -0.001020 
+-0.001894 0.003695 0.001432 -0.001314 -0.000005 -0.000058 
+0.002660 -0.002183 -0.000991 0.002428 -0.004931 -0.005693 
+0.002911 -0.001706 0.000212 0.002381 0.001772 0.000047 
+0.000469 0.001687 -0.000220 -0.003249 0.006156 -0.002899 
+-0.008972 0.009978 -0.010553 -0.012294 0.005375 -0.012350 
+-0.007418 -0.011416 -0.002649 0.022010 -0.080544 0.006163 
+0.008464 -0.034051 0.002258 0.010436 0.029220 -0.033627 
+0.002248 0.016177 -0.001198 0.007203 0.017972 0.011993 
+0.003300 0.005294 0.005042 -0.000882 -0.000338 0.000626 
+0.002241 0.001889 -0.000888 -0.000231 -0.000778 -0.000387 
+-0.002159 -0.003551 0.002937 -0.002751 -0.003333 0.004401 
+0.000000 0.001855 0.000806 0.003258 0.005740 -0.001219 
+0.002816 0.003772 0.002235 0.000464 0.000751 0.001660 
+-0.000311 0.000186 0.000497 -0.001642 -0.002379 0.001882 
+0.003906 0.000379 0.000452 -0.001111 -0.000605 -0.000312 
+-0.004657 -0.003561 0.000323 0.000184 -0.001008 0.000252 
+0.002542 -0.000834 -0.001423 0.002151 -0.002579 0.000506 
+0.002000 -0.001527 -0.000778 -0.000220 0.000500 0.000045 
+0.000486 0.000745 -0.000362 -0.002326 0.000864 0.002560 
+-0.001420 0.003462 0.002172 0.000703 0.005074 -0.000151 
+0.000006 0.000208 -0.000799 0.000996 -0.004052 0.000233 
+0.000814 -0.003944 -0.000237 -0.000383 -0.001267 0.001699 
+-0.002676 -0.000196 0.003437 -0.005263 -0.002622 0.001496 
+-0.004401 0.000815 0.001500 0.000131 0.001400 -0.002694 
+0.001245 0.003155 -0.001840 0.001665 0.001839 0.000197 
+0.000926 0.001100 0.001525 -0.000811 0.002447 -0.000571 
+-0.001587 0.002222 -0.005079 0.001280 0.000000 -0.005120 
+0.001587 -0.000791 -0.001319 0.002468 -0.000144 0.000304 
+0.003568 -0.000517 0.000275 0.004411 -0.000778 -0.003026 
+-0.000785 -0.001043 -0.002883 0.000393 -0.001461 -0.003092 
+-0.001161 -0.000095 -0.002708 -0.000483 0.001655 -0.000368 
+0.001814 0.001800 -0.000357 -0.000297 0.002609 0.000891 
+0.000134 0.002537 -0.001345 -0.000163 0.002249 -0.003602 
+-0.000975 0.001336 -0.003867 -0.000834 -0.001059 -0.002566 
+-0.000249 0.001080 -0.001090 -0.001416 0.002669 0.001007 
+-0.001681 0.003371 0.000651 -0.004161 0.000118 0.000586 
+-0.003317 0.000338 0.001536 -0.003132 -0.004297 0.000123 
+-0.001988 -0.004297 0.000965 -0.000232 -0.003315 0.000906 
+0.000430 0.000054 0.001405 -0.001432 0.002169 0.001174 
+-0.002015 0.001534 0.001942 -0.004870 -0.000445 0.003798 
+-0.004362 -0.002910 0.001321 -0.005012 0.000494 0.000706 
+-0.005672 -0.003257 -0.000159 -0.008826 -0.009351 -0.000376 
+-0.014314 -0.012389 -0.002455 -0.017304 -0.009592 -0.009035 
+-0.015945 0.010099 -0.022579 -0.020193 0.036004 -0.039665 
+-0.001671 0.046798 -0.044930 -0.009459 -0.020860 -0.044338 
+0.004029 -0.010422 -0.029202 0.017427 0.021216 -0.010100 
+0.016117 0.008340 0.005595 0.003443 0.010828 0.004941 
+0.009975 0.005564 -0.010478 0.002325 -0.003134 -0.007725 
+0.000134 -0.002016 -0.005205 0.000272 0.002479 -0.004954 
+0.002549 0.004255 -0.003258 -0.003360 -0.001516 -0.001950 
+-0.004852 0.000576 -0.002073 -0.001040 -0.000252 -0.002111 
+0.000683 -0.002293 -0.002538 0.000333 -0.001000 -0.000500 
+-0.003190 -0.000638 -0.000666 -0.000012 0.006370 0.002267 
+-0.005638 0.002723 0.003703 -0.012095 -0.007267 0.004861 
+-0.005924 -0.008562 0.002238 0.001898 -0.000956 -0.000204 
+0.004023 0.003095 0.000434 0.004940 -0.000208 0.000063 
+0.005449 -0.001702 -0.000649 0.003033 -0.002222 -0.001922 
+0.002832 0.003449 -0.004369 0.005274 0.011036 -0.015139 
+0.008448 0.015990 -0.029668 0.000082 0.001357 -0.018488 
+0.000975 -0.002695 0.000784 -0.001120 -0.001481 0.004890 
+-0.002002 0.002073 -0.000476 -0.001547 0.000471 0.001236 
+-0.000138 -0.000682 -0.000204 0.001509 -0.000328 -0.002336 
+0.001187 -0.002734 -0.001187 0.000352 -0.003028 -0.002606 
+0.002600 -0.004274 0.000642 0.000700 -0.004152 0.001949 
+-0.000318 -0.000621 0.001574 0.000200 0.000369 -0.000664 
+0.004163 -0.000463 0.000603 0.004773 0.001818 -0.000796 
+0.003404 0.000218 -0.002339 0.002171 0.000080 -0.002908 
+0.003350 0.002157 -0.003189 0.006418 0.002432 -0.000518 
+0.003282 0.000919 0.000817 -0.001587 0.000667 0.000799 
+-0.005615 0.000969 0.002010 -0.005130 0.002451 0.002477 
+-0.001678 0.002525 0.003229 -0.001794 0.001794 0.000076 
+0.000853 0.000310 -0.000155 -0.002458 -0.000484 -0.002681 
+-0.001846 0.001231 -0.004462 0.004766 0.003495 -0.002012 
+0.005037 0.001162 -0.001744 0.002406 -0.000941 -0.001587 
+-0.000628 -0.000736 -0.001445 -0.001914 0.000608 -0.000559 
+0.000785 0.004013 0.001652 0.003228 0.004827 0.000742 
+0.001414 0.002626 0.000106 -0.000439 -0.001282 -0.000307 
+-0.000033 -0.002236 0.000829 0.001423 -0.002532 0.001418 
+-0.000612 -0.004632 -0.001512 -0.001848 -0.005973 -0.001273 
+0.001318 -0.006715 -0.001930 -0.002817 -0.007540 -0.000988 
+-0.011934 -0.006389 -0.002455 -0.018074 -0.005190 -0.008357 
+-0.026765 -0.004161 -0.011864 -0.023817 -0.007895 -0.001311 
+-0.015340 -0.008827 -0.003848 0.000348 0.014595 -0.010220 
+-0.023218 -0.045747 0.115057 -0.004655 -0.024364 -0.016539 
+0.038398 0.047632 -0.017374 0.018145 0.017119 0.014950 
+-0.002947 0.002117 0.008726 -0.013878 -0.007933 0.009503 
+-0.002232 -0.000346 0.003474 0.000950 0.000651 -0.002411 
+-0.000806 -0.000746 -0.000121 0.002725 0.000762 -0.002160 
+-0.001509 -0.001251 -0.003164 -0.000480 -0.001089 -0.000684 
+-0.004164 -0.003201 0.001282 -0.004867 -0.003067 0.003600 
+-0.015439 0.001636 -0.000936 0.000889 0.004837 0.000639 
+-0.006220 -0.009864 0.001154 -0.033041 -0.035291 0.015201 
+-0.017999 -0.024699 0.007151 -0.008448 -0.012187 -0.002405 
+-0.004675 -0.001375 -0.004045 -0.002099 -0.001212 0.002462 
+0.003052 -0.001562 0.001504 0.005230 -0.000738 0.000713 
+0.001775 0.002731 -0.002271 0.000007 0.002983 -0.002374 
+0.000655 -0.001097 -0.001935 0.001308 -0.001301 -0.001015 
+0.001332 -0.000414 -0.002034 0.000557 0.000453 -0.001232 
+0.003490 0.003185 -0.000698 0.006335 0.002658 -0.001576 
+0.001504 -0.000975 -0.006581 0.000359 0.002021 -0.002350 
+-0.002832 -0.000429 0.001170 -0.001931 0.001370 0.000576 
+-0.000655 0.000293 -0.000653 -0.001047 -0.000969 -0.002926 
+-0.000867 -0.002292 -0.003944 -0.002073 -0.001021 -0.002120 
+0.000513 0.000461 -0.002072 0.001140 0.000868 -0.003926 
+0.002908 0.002090 -0.004325 0.001523 -0.000861 -0.000411 
+-0.000553 -0.001251 -0.000507 0.000526 -0.002817 -0.001648 
+-0.000137 -0.002952 -0.004476 -0.002903 -0.004266 -0.001034 
+-0.001630 -0.000341 0.001022 0.000992 -0.001710 -0.002046 
+0.001127 -0.000986 -0.003520 -0.002401 0.000218 -0.003164 
+-0.001910 -0.002013 -0.004337 -0.000400 -0.000452 -0.000191 
+0.000948 0.005952 -0.002910 -0.002480 0.006065 -0.002064 
+-0.002376 0.005096 -0.002031 0.001067 -0.000491 0.000271 
+0.001835 -0.001856 -0.001022 -0.000427 -0.000815 -0.001125 
+0.000320 -0.001685 0.001415 -0.000238 0.000605 0.001323 
+-0.000554 -0.001987 0.003026 -0.000838 -0.008298 0.006145 
+0.001294 -0.011406 0.008106 0.000766 -0.001517 -0.000649 
+0.001412 0.002500 -0.000138 -0.002140 0.003193 -0.001120 
+-0.002824 0.001805 -0.000209 -0.004394 -0.003020 0.000215 
+-0.006390 -0.006610 -0.001857 -0.006806 -0.006907 -0.003722 
+-0.010824 -0.011623 -0.004981 -0.009435 -0.021646 -0.002536 
+-0.010126 -0.018331 -0.004534 0.000065 0.006367 -0.009875 
+0.015347 0.030306 0.019816 0.053333 -0.015000 -0.048333 
+-0.013795 -0.028319 -0.005273 -0.008250 -0.022388 0.021529 
+-0.018182 -0.031259 0.022328 -0.005027 0.005027 0.020587 
+0.005919 0.006336 -0.001709 0.001901 0.000836 -0.001905 
+0.001565 0.001461 -0.000300 0.000350 0.003370 -0.001154 
+0.000282 0.000988 0.002432 -0.002021 -0.002875 -0.000052 
+0.000445 -0.000922 -0.000487 0.007134 0.004537 -0.004378 
+0.080640 0.073930 -0.042679 0.003328 -0.009323 -0.000759 
+-0.000561 -0.012343 0.003185 -0.005545 -0.018628 0.004839 
+-0.007375 -0.016849 -0.000245 -0.002795 -0.004736 -0.005013 
+-0.004279 0.002300 0.003503 -0.004558 -0.000316 -0.002382 
+-0.000273 -0.006505 -0.003047 -0.001906 -0.008931 0.000789 
+0.001604 -0.003062 -0.001083 0.001589 0.005771 -0.009687 
+-0.000172 0.003240 -0.015850 0.003280 0.001965 -0.010907 
+0.003401 -0.000598 -0.004991 0.002079 -0.001663 -0.000365 
+-0.001461 -0.001653 -0.000319 -0.001685 -0.000099 -0.000275 
+-0.001993 0.000772 0.000097 -0.002642 -0.001583 -0.001057 
+-0.001507 -0.001464 -0.002286 0.000491 -0.001321 -0.002114 
+0.002322 -0.001005 -0.002275 0.003380 0.000029 -0.001833 
+0.001803 -0.001813 -0.000363 0.000349 -0.000270 0.000286 
+-0.003200 -0.000154 0.000115 -0.003894 -0.000069 -0.001889 
+-0.001950 -0.002110 -0.001247 -0.000744 -0.004436 -0.000739 
+0.001554 -0.004754 -0.000345 0.001933 -0.001111 0.000200 
+0.001148 0.002386 -0.002076 0.001262 -0.002211 -0.004947 
+-0.000562 0.000586 -0.006981 -0.000243 0.005449 -0.004635 
+0.001959 0.001881 -0.000022 0.000900 -0.000598 -0.006278 
+0.000789 0.001599 -0.004792 -0.000424 0.000562 -0.004346 
+-0.002318 0.001218 -0.003791 0.000439 -0.000439 -0.001758 
+-0.001643 -0.000019 -0.001665 -0.000528 -0.002380 -0.002444 
+-0.001851 -0.005028 -0.003122 -0.004829 -0.005275 0.001969 
+-0.001436 -0.000734 0.002105 0.003839 0.002286 -0.000137 
+0.002786 0.004671 -0.001892 0.000916 0.002850 -0.003468 
+0.000593 0.001276 -0.001811 0.000146 -0.000166 0.001828 
+-0.002453 0.004667 0.001022 -0.001075 0.002646 -0.000397 
+0.001127 0.000524 0.000176 0.006221 0.002263 0.002795 
+0.004086 0.003208 0.002109 -0.001420 0.003392 0.000810 
+-0.015503 0.001161 -0.002428 -0.016198 -0.023516 -0.003487 
+-0.011746 -0.018849 -0.004134 -0.012331 0.007084 -0.023295 
+0.019846 0.007329 -0.062997 0.097500 -0.052500 -0.195000 
+0.018289 -0.008349 -0.056590 -0.046291 -0.028799 0.029812 
+-0.012817 0.005801 -0.004199 0.012008 0.023648 0.020706 
+-0.006470 -0.002294 0.010059 -0.009628 -0.003168 0.009730 
+-0.003670 -0.001465 0.001935 0.001136 -0.004083 -0.001225 
+0.000496 0.001047 -0.002496 0.004624 0.000940 -0.007145 
+0.005159 -0.003594 -0.006406 0.000759 0.001039 -0.007952 
+0.000474 0.022414 -0.000451 0.004882 0.015574 -0.002154 
+0.000401 -0.004958 0.000585 -0.002999 -0.011172 0.002402 
+-0.002398 -0.012045 -0.000713 0.001873 -0.000688 -0.000946 
+-0.001004 -0.001201 0.000511 -0.001058 0.002207 -0.000410 
+-0.000640 -0.001395 -0.000772 -0.001590 -0.003325 0.002336 
+-0.000311 -0.000252 0.000645 0.001478 0.000628 -0.001296 
+-0.000762 0.002100 -0.005206 -0.000294 -0.000125 0.001297 
+-0.000499 -0.000591 0.002303 0.000338 0.000317 0.000077 
+0.001034 -0.000739 -0.002518 0.000730 -0.000730 -0.003650 
+0.000000 0.001825 -0.003066 -0.001443 0.002241 -0.002579 
+-0.002584 0.002429 -0.002739 -0.003612 0.000778 -0.002480 
+-0.001066 -0.000813 -0.000976 0.003701 0.002254 -0.000160 
+0.003020 0.005762 -0.002195 0.000709 0.001342 -0.001659 
+-0.002904 -0.000395 0.000859 -0.001870 -0.001724 -0.000862 
+0.000244 -0.000098 -0.000195 0.000081 0.002015 -0.001727 
+-0.001012 0.002799 -0.001952 0.000271 0.001794 -0.003409 
+0.002795 -0.001732 -0.004134 -0.001683 0.002698 -0.003365 
+0.002554 -0.003617 -0.004149 -0.000023 -0.001286 -0.003811 
+-0.000081 -0.002303 -0.000827 0.000626 0.000009 -0.001149 
+0.001311 0.000303 -0.001120 0.000699 -0.001439 0.001291 
+-0.001262 -0.002037 0.002623 -0.000908 -0.001154 0.002103 
+-0.000342 -0.000235 0.001519 -0.002615 -0.000154 0.000769 
+-0.000690 -0.001643 0.000174 0.000819 0.002242 -0.000724 
+0.002108 0.006373 -0.000889 0.001086 0.002910 -0.002832 
+-0.001434 -0.003147 0.001434 -0.002504 -0.007245 0.001806 
+-0.001465 -0.003326 0.001370 0.003179 0.005029 -0.003734 
+0.004892 0.010455 -0.008432 0.008622 0.007506 -0.003768 
+0.006516 0.006231 -0.000760 0.002993 0.007637 -0.002647 
+0.003821 0.007300 -0.000535 0.006407 0.006232 0.001716 
+-0.001853 -0.001637 -0.000091 0.006747 -0.007603 -0.002405 
+0.022796 0.003053 0.003232 0.041859 -0.001414 0.034869 
+-0.007961 0.024545 0.019107 0.046093 0.116120 -0.017951 
+0.069263 0.111263 -0.051579 0.018243 0.012587 -0.056918 
+0.018689 0.008052 -0.020313 -0.009366 0.025236 -0.024846 
+-0.001576 -0.000606 0.011848 -0.004549 0.002144 0.008665 
+0.009567 0.004321 -0.005449 0.006166 0.001540 -0.003730 
+0.002160 0.001771 -0.001082 0.003185 0.002247 -0.003824 
+0.004449 -0.001254 -0.002334 -0.000056 -0.000819 -0.000802 
+-0.004726 -0.002760 0.001130 -0.014629 0.011115 0.009999 
+-0.003313 -0.003273 0.002144 -0.003397 -0.010364 0.000911 
+-0.000841 -0.014871 0.005010 0.000105 -0.010328 0.004341 
+-0.001004 0.005089 -0.003154 -0.001133 0.008600 -0.003013 
+-0.001406 0.000357 -0.001462 0.001883 -0.003956 -0.001868 
+0.003347 -0.002849 -0.006982 0.002480 -0.004581 -0.004874 
+0.000702 0.000149 -0.004635 0.001260 -0.001848 -0.001115 
+0.001186 -0.002573 0.000554 0.000431 -0.000465 -0.000124 
+-0.000846 0.000000 -0.000462 0.001498 0.001917 0.000241 
+0.000922 0.000950 0.002878 0.001259 0.000259 0.002778 
+0.000741 -0.000526 0.001141 -0.001112 0.000430 -0.001213 
+-0.002797 0.001001 -0.001140 -0.000661 0.001810 0.000603 
+0.001080 0.003555 -0.004042 -0.000326 -0.000414 -0.005352 
+0.002344 -0.000859 -0.000859 0.002266 0.003355 -0.000147 
+-0.001667 0.003048 0.001016 -0.004142 0.002729 0.000609 
+-0.001769 0.001482 0.001172 0.000786 -0.000335 -0.000110 
+0.002324 -0.001323 0.000715 0.000325 -0.001044 0.001655 
+-0.003865 -0.001513 0.002101 -0.004568 -0.002557 -0.003104 
+0.001489 0.000161 -0.000993 0.001806 0.001829 -0.003623 
+0.000324 0.002835 -0.001620 0.001087 0.001878 -0.001434 
+0.001555 -0.000058 -0.000650 0.000403 -0.000662 0.000716 
+0.000619 -0.000547 0.000825 -0.002033 0.001380 0.000988 
+-0.003538 -0.000998 0.000518 -0.001763 0.000379 0.000335 
+-0.000394 0.000604 -0.001007 0.002410 -0.005391 -0.001928 
+0.000909 -0.002264 -0.003986 -0.000046 -0.004538 -0.000092 
+-0.000375 -0.001484 0.000770 0.001218 0.001691 0.001167 
+0.003163 0.003847 -0.002322 0.001390 0.002974 -0.002519 
+-0.004522 -0.000144 0.000829 -0.007211 -0.004671 0.000567 
+-0.003959 -0.006354 0.002600 -0.000527 -0.003665 0.002584 
+-0.003785 -0.018174 0.001276 -0.020233 -0.060116 -0.018053 
+-0.015977 -0.005875 -0.003330 0.039362 0.033005 0.026367 
+0.110948 0.114828 -0.030647 -0.032525 0.027475 0.010101 
+-0.140833 -0.015000 0.007500 0.017775 0.005072 0.026244 
+-0.058052 0.015195 0.024416 0.005263 -0.025462 -0.022617 
+0.009117 -0.014722 0.038808 -0.002306 0.004882 0.007052 
+0.010767 0.002135 -0.007669 -0.002726 -0.005394 -0.001790 
+-0.000220 -0.002939 -0.001704 0.002549 0.000419 0.000424 
+0.002048 -0.000396 0.000769 0.001118 0.000681 0.001255 
+-0.009728 -0.034410 0.004527 -0.011098 -0.000864 0.005042 
+0.000571 0.001875 -0.000631 -0.000423 -0.006268 0.001831 
+0.001234 -0.012077 0.002641 0.003536 -0.008828 0.002597 
+0.001182 0.003117 -0.000896 0.000669 0.004580 -0.002339 
+0.001697 0.003407 -0.001079 0.006010 0.000813 -0.008151 
+0.007253 0.000319 -0.007840 -0.000654 -0.001044 -0.003244 
+0.000481 -0.001519 0.001399 0.000342 -0.001583 -0.000059 
+0.002940 0.000054 0.000254 -0.001620 0.001404 -0.004534 
+0.002578 0.004844 -0.004844 -0.000275 0.000202 -0.002785 
+-0.004436 0.000093 0.000139 -0.002383 -0.001488 -0.002028 
+-0.000445 -0.004571 -0.001361 -0.000207 -0.004622 -0.000310 
+-0.002615 -0.001494 0.004109 0.000320 -0.002079 0.002250 
+0.000257 -0.001115 0.001240 -0.003008 -0.000060 -0.000180 
+-0.000067 -0.000236 -0.000102 -0.000856 -0.000685 -0.000484 
+-0.002056 0.000914 -0.001600 0.002422 0.000000 -0.003203 
+-0.001139 0.005233 -0.001254 0.000664 0.000073 0.000764 
+0.002539 0.000280 0.000078 0.000169 0.000282 0.000284 
+0.000123 -0.000123 0.000656 -0.001794 0.000958 0.000734 
+-0.000756 0.002819 -0.000201 0.001340 0.003710 -0.002770 
+0.003986 0.004058 -0.003986 0.005177 0.003816 -0.000170 
+0.002226 0.003235 0.001096 -0.000155 0.002367 0.000082 
+0.000000 0.001146 -0.000576 0.000786 0.001303 -0.001705 
+0.000078 0.003767 -0.003062 0.002546 0.004892 -0.003729 
+-0.000162 0.003586 0.001285 -0.004619 0.001925 -0.000385 
+-0.003465 -0.001202 -0.000453 -0.001405 -0.001487 0.002335 
+-0.000804 -0.000303 0.001493 0.000400 0.000882 -0.000084 
+0.002326 0.000324 -0.003384 -0.001177 0.000848 -0.005064 
+0.001543 -0.002386 -0.003583 0.002257 0.002157 -0.000909 
+-0.000874 -0.002682 0.000511 -0.003262 -0.005153 -0.001607 
+-0.012035 -0.009791 -0.008125 -0.013833 -0.000677 -0.011599 
+0.008459 0.040031 0.012311 -0.015462 -0.007385 -0.018154 
+0.002500 -0.025000 0.025000 -0.077939 0.004758 0.024242 
+-0.066667 -0.018547 -0.092735 -0.052485 0.042939 -0.056061 
+-0.047500 -0.088000 0.074500 -0.025774 -0.042256 0.011397 
+0.000278 0.000278 -0.000278 0.004334 -0.015348 -0.021323 
+0.017284 -0.002972 -0.012353 -0.003025 0.006914 0.009938 
+-0.004267 0.000664 0.004084 -0.004197 0.001480 0.002792 
+-0.004182 -0.002612 0.000376 0.000254 -0.003401 -0.001929 
+-0.001840 -0.000781 0.002399 -0.001940 -0.000215 0.000287 
+-0.000030 0.000037 0.000244 -0.000477 -0.000079 -0.000956 
+-0.001166 0.000405 -0.000430 -0.000554 -0.000051 -0.000127 
+0.001631 -0.001356 -0.000814 0.001442 0.003610 -0.004190 
+0.001179 0.002810 -0.005849 0.000602 0.000248 -0.004275 
+-0.002681 -0.002596 -0.002145 -0.001514 0.003939 0.000965 
+0.002464 0.004069 -0.003110 -0.000328 0.004704 -0.000133 
+-0.000440 0.004024 -0.000491 0.003247 -0.008346 0.003532 
+0.035932 -0.115720 0.004054 0.002500 -0.001667 -0.015833 
+0.030000 0.120000 -0.025000 0.076875 0.066250 0.076875 
+-0.089825 -0.083904 0.086272 -0.059088 -0.050070 0.123930 
+-0.024000 -0.072000 0.053636 -0.047743 -0.030414 0.018592 
+-0.040835 0.074286 -0.025522 -0.011750 0.005000 -0.035250 
+-0.022657 -0.004196 -0.008951 -0.011091 0.025455 -0.033273 
+-0.015468 0.052857 -0.038670 -0.005449 0.103333 -0.001090 
+-0.050000 -0.052667 0.105333 0.019545 0.001212 -0.083030 
+0.022870 -0.072522 -0.021565 -0.074431 0.020752 0.099472 
+-0.018407 0.009567 0.038632 -0.056364 -0.018250 -0.063876 
+-0.099026 -0.030714 -0.095584 -0.002857 -0.027314 0.096229 
+0.005611 -0.007124 0.004990 -0.004526 0.002133 -0.003916 
+-0.000904 0.006031 -0.006245 -0.006179 0.007219 -0.005023 
+0.006205 -0.008323 0.039049 -0.079667 0.023333 -0.012333 
+-0.016198 0.003616 -0.015282 -0.013429 0.010989 0.022791 
+0.060000 -0.034000 -0.043000 -0.033756 -0.040507 0.000000 
+-0.005903 0.029223 -0.027601 0.012796 0.013589 -0.044364 
+0.002868 0.038300 -0.042183 0.008413 0.005413 0.011851 
+0.029331 -0.054660 0.013808 -0.007551 -0.031882 0.018458 
+-0.034378 -0.042209 0.014037 -0.032350 -0.019402 -0.005385 
+0.006702 -0.013940 -0.011604 -0.001342 -0.000653 0.000306 
+-0.011129 -0.009985 0.001780 -0.008435 -0.007373 -0.003329 
+0.001831 -0.001765 0.000616 0.001430 -0.005266 0.023668 
+-0.012350 -0.008228 0.023969 -0.003539 0.000709 0.004246 
+-0.002166 -0.000455 -0.000350 0.000211 -0.000393 -0.003333 
+-0.002569 -0.011409 0.008380 -0.020287 -0.016299 0.011193 
+-0.023889 -0.016944 0.010278 -0.015882 -0.028209 0.025858 
+0.014398 -0.010647 0.018612 0.025449 0.016412 -0.004654 
+0.008673 0.007871 -0.004574 0.003889 0.001389 0.001111 
+0.003442 0.001704 -0.002626 0.002851 0.010344 -0.009631 
+-0.001643 0.001608 -0.001748 -0.000704 -0.000656 0.000421 
+0.000451 -0.002406 0.001128 0.000629 0.000407 -0.001380 
+0.002225 0.004291 -0.005658 0.002643 0.004579 -0.005621 
+0.000210 0.001421 -0.003404 0.002069 0.000143 -0.004330 
+0.004224 0.005547 -0.008705 0.009222 0.011186 -0.012632 
+0.007947 0.010328 -0.013024 -0.005043 0.006185 0.000154 
+0.003394 0.004960 0.000696 0.002535 0.002810 0.002918 
+0.001378 0.007679 0.002081 0.004567 0.023374 -0.005864 
+-0.264851 -0.083178 -0.330074 -0.005662 -0.025478 0.000625 
+0.025218 -0.012584 0.021433 0.029122 -0.123683 0.047699 
+-0.011330 -0.078651 0.093124 0.004214 -0.037429 0.026357 
+0.022778 -0.015972 0.013611 -0.108214 -0.033571 0.082143 
+-0.051111 -0.037778 -0.024444 0.043626 0.003736 -0.115934 
+0.013333 0.017778 -0.013333 0.072286 0.029143 -0.007571 
+0.034600 0.025950 -0.063750 -0.037429 -0.021429 0.072286 
+-0.036614 -0.011005 0.117249 -0.005556 -0.036000 -0.018000 
+0.016637 -0.022251 0.000936 -0.122774 -0.041644 0.062106 
+-0.156250 -0.010500 0.031500 -0.007500 0.001250 0.026250 
+-0.087429 -0.056743 -0.039943 0.007071 -0.059400 0.029700 
+0.000332 -0.013771 -0.004801 -0.011082 -0.002129 -0.012584 
+-0.006236 0.008913 -0.014689 -0.036060 0.061970 -0.024362 
+0.098545 -0.077807 0.024221 -0.015870 0.039565 0.023478 
+-0.013692 0.031051 0.013121 -0.032045 -0.019138 0.040168 
+-0.014790 -0.068617 -0.001206 -0.081648 -0.084945 0.080549 
+0.002278 0.025811 0.015186 0.002335 0.031636 -0.018095 
+0.004111 0.023066 -0.023868 -0.017600 0.025714 -0.002514 
+0.020672 0.012335 -0.010936 0.035575 -0.024058 0.015787 
+-0.053963 -0.056358 0.004470 -0.040299 -0.045123 0.010160 
+-0.008302 0.016869 -0.022685 0.069919 0.046667 -0.021514 
+-0.016012 -0.005263 0.017128 -0.002521 -0.004879 -0.000251 
+0.002051 -0.005409 -0.000012 -0.004684 -0.029523 0.009307 
+0.005369 -0.014821 0.022762 -0.004350 -0.008150 0.002851 
+-0.003293 0.005046 -0.004532 -0.003561 0.006366 -0.007542 
+-0.006996 -0.009177 0.012675 -0.011892 -0.000118 0.003611 
+-0.006470 -0.007806 0.008408 -0.001402 -0.003024 0.000051 
+0.000454 -0.000973 -0.010000 0.055487 -0.001144 0.033623 
+0.011719 -0.016641 0.041766 0.003330 -0.012336 0.021735 
+0.008150 -0.005650 0.009682 0.008377 -0.001669 0.002501 
+-0.001783 -0.002093 -0.000310 -0.000863 -0.000065 -0.002817 
+-0.000440 -0.000318 -0.002931 -0.000243 -0.001420 -0.002434 
+-0.000364 -0.002998 -0.001359 0.001161 -0.001210 -0.001063 
+0.000612 0.000030 0.000059 0.000182 0.000381 -0.000505 
+0.002780 0.004884 -0.005350 0.005803 0.014229 -0.011026 
+0.009749 0.020820 -0.015196 0.006135 0.013158 -0.006813 
+-0.005101 -0.002098 0.000959 -0.002969 0.001633 0.001548 
+-0.002216 0.004969 0.000322 0.000204 0.002089 -0.000805 
+-0.014548 -0.014567 -0.012870 0.007034 -0.069448 -0.012069 
+0.000635 -0.013016 0.025714 -0.047910 -0.014510 0.049599 
+-0.078214 -0.027143 0.023929 -0.001218 0.006090 0.024167 
+0.040175 -0.003860 -0.017251 -0.012727 -0.033600 -0.044800 
+-0.048582 -0.016705 -0.039464 0.008017 -0.007241 -0.005862 
+0.027392 -0.094203 0.024053 -0.043571 -0.081429 0.005714 
+0.007081 0.044737 0.112967 0.039394 -0.012424 -0.064242 
+0.007091 -0.008364 -0.029636 -0.089091 -0.107159 -0.006023 
+-0.116277 -0.127057 -0.003080 0.091515 0.032121 -0.083485 
+-0.027667 0.130333 0.051333 0.125000 0.173000 -0.024000 
+0.021385 -0.037423 0.197500 -0.008070 -0.039539 0.087961 
+-0.015177 -0.020311 0.034812 -0.014925 0.001885 0.000550 
+-0.004178 0.011058 -0.026979 -0.036898 0.043473 -0.066551 
+0.084153 -0.088704 0.011376 0.026667 -0.050417 0.056250 
+-0.017809 -0.023330 0.043276 -0.011294 -0.010796 0.036484 
+-0.009169 -0.048615 0.052738 0.001556 -0.007889 -0.007111 
+-0.004129 0.035293 -0.026956 -0.004271 0.046547 -0.041151 
+0.012277 0.040921 -0.021143 0.047833 0.080833 -0.064333 
+0.049355 0.054313 -0.032976 0.044188 0.024154 -0.004427 
+0.085355 0.029451 0.012440 -0.011830 -0.000888 0.011741 
+-0.009575 -0.003313 0.005156 -0.008738 0.006619 -0.003590 
+-0.001294 -0.011864 0.013074 -0.004452 -0.011921 -0.001498 
+0.006452 -0.011149 0.001215 -0.003251 -0.007617 0.009325 
+0.017786 0.016367 -0.000991 0.020794 0.010593 -0.015801 
+0.005356 0.005207 -0.016961 -0.002155 0.018299 -0.029403 
+-0.006471 -0.002554 -0.011686 0.001125 -0.006241 0.002577 
+0.001885 -0.001980 0.002552 -0.008517 -0.001073 -0.009395 
+-0.036043 -0.003350 -0.053950 -0.188638 -0.022666 -0.329261 
+-0.062593 -0.122963 -0.124074 -0.012488 -0.013089 0.015902 
+0.003808 -0.028330 0.049473 0.011765 -0.044867 0.019741 
+-0.000905 0.000717 -0.001319 -0.001351 0.001216 -0.003242 
+-0.001007 0.002014 -0.005540 -0.001418 0.001170 -0.000390 
+0.001485 -0.004960 -0.001625 -0.000493 -0.006187 -0.001846 
+0.000266 -0.000870 -0.000721 0.000476 0.001842 -0.002406 
+0.001701 0.004024 -0.004360 0.003943 0.005598 -0.008313 
+0.002402 0.013673 -0.008428 0.002262 0.012465 -0.009316 
+-0.007207 0.001302 -0.005136 -0.009265 0.007164 -0.004366 
+-0.003582 0.009181 0.003218 -0.005240 0.006008 -0.001850 
+0.001401 -0.008910 0.004033 0.006111 0.021676 0.017184 
+0.085264 -0.000745 -0.071550 -0.010577 0.054167 -0.084615 
+-0.055541 0.009035 0.094344 -0.012889 0.017778 0.025778 
+-0.039761 0.044785 0.015072 0.015972 0.061806 -0.038889 
+0.008682 0.063545 -0.033682 -0.122619 -0.105238 0.111032 
+0.062740 0.023584 0.063188 0.044545 0.000000 -0.020909 
+-0.046545 0.023273 0.050000 0.065333 -0.021778 -0.053333 
+0.025571 0.052857 -0.026714 -0.063333 -0.107333 -0.042667 
+-0.099545 -0.120909 -0.142273 -0.074545 -0.055101 0.087525 
+-0.032857 -0.047912 0.071868 -0.020756 0.015444 0.001933 
+-0.017576 0.007879 0.033939 -0.008603 -0.016344 0.031973 
+-0.005206 -0.015059 0.027794 -0.001581 -0.019768 0.025934 
+-0.004382 -0.016480 0.027925 0.000909 0.000000 0.025455 
+0.016154 0.009231 0.036923 0.013783 -0.036217 0.016024 
+-0.022064 0.007353 -0.001222 -0.035771 -0.014909 0.099887 
+-0.029461 -0.016523 0.018706 0.008980 0.047916 -0.041951 
+0.026447 0.037106 -0.095531 0.026667 -0.000333 0.002333 
+0.005204 0.028733 -0.010950 -0.010462 0.018308 -0.046000 
+0.008669 0.010325 -0.013350 0.023078 0.016718 -0.004291 
+0.038239 0.064278 -0.029314 0.021339 0.032321 0.005893 
+-0.008292 0.004589 0.002613 -0.002108 -0.002114 0.002811 
+-0.001424 -0.005013 0.017471 -0.004645 -0.003492 0.025591 
+-0.010580 -0.010481 0.046642 -0.008757 -0.014956 0.012373 
+0.025783 0.017471 -0.010346 0.015690 -0.006724 -0.001034 
+0.028462 -0.030385 0.018077 -0.024981 -0.062614 0.050075 
+0.002988 0.021264 -0.022537 0.003520 0.005368 -0.004469 
+-0.000973 -0.001820 0.000912 -0.003837 -0.002022 0.000803 
+-0.004212 0.004295 -0.003540 -0.010426 0.008315 -0.008996 
+-0.029721 -0.004170 -0.005317 -0.085084 -0.137193 0.048226 
+-0.033791 -0.090801 0.009919 0.035764 -0.008042 0.000685 
+-0.000191 -0.000862 -0.000560 -0.002819 -0.001025 -0.001778 
+-0.001731 -0.000320 -0.001348 -0.000136 -0.000055 -0.001583 
+-0.000871 -0.001263 -0.001503 -0.000936 -0.001446 -0.003997 
+0.000123 0.000776 -0.003280 0.001162 0.002307 0.000051 
+0.000885 0.003469 -0.001735 0.005230 0.004460 -0.004128 
+0.007847 0.005072 -0.006138 0.003081 0.006919 -0.001010 
+0.000045 0.003172 -0.001669 -0.000992 0.000037 -0.001317 
+-0.000726 0.003510 -0.001246 -0.000728 0.007401 0.001466 
+0.002093 -0.001481 0.002474 -0.005424 -0.038736 0.003098 
+0.006315 0.039499 -0.072147 0.010964 0.031468 -0.078028 
+0.045909 -0.022273 -0.020909 0.044661 -0.014623 0.007787 
+0.021174 0.005757 0.024262 0.013240 -0.015320 0.057800 
+0.009091 0.000378 -0.002459 -0.067237 -0.040644 0.037627 
+-0.020846 -0.025538 0.039615 -0.029810 0.049762 -0.189190 
+0.019740 0.040649 -0.141688 0.013894 0.009327 -0.017067 
+0.000625 0.000625 -0.117500 0.017127 0.017534 -0.004688 
+-0.004856 0.010310 -0.020222 -0.039231 -0.020000 0.000000 
+-0.019893 -0.025829 -0.004011 0.076000 -0.021552 -0.008621 
+0.009218 -0.010620 -0.018717 0.004062 0.006198 -0.016331 
+0.012400 0.000000 -0.022000 -0.000341 0.001362 -0.045789 
+0.019496 -0.093585 -0.068243 0.000000 -0.006667 -0.002222 
+0.030032 -0.046332 -0.004657 0.041429 -0.150000 0.041429 
+0.083333 0.108000 -0.054000 0.127439 0.098329 -0.086792 
+-0.074436 0.026692 -0.001880 -0.037500 0.005000 0.005000 
+0.125055 0.028791 -0.017692 0.028846 0.019231 0.060000 
+0.056110 0.023562 0.027690 0.010302 0.015997 -0.014562 
+0.005748 -0.008355 -0.015214 0.016176 -0.007722 0.005525 
+0.014227 -0.035928 0.024072 0.020259 0.000370 0.021741 
+0.009216 -0.004222 -0.001102 0.021500 0.016100 -0.009200 
+-0.013448 0.002924 0.022520 -0.029344 -0.014849 0.030337 
+-0.015522 -0.007011 0.004201 0.006132 0.019947 0.001421 
+0.015765 0.033277 -0.045507 0.012110 0.016517 -0.007159 
+-0.141390 -0.076352 0.198178 -0.009305 -0.004764 0.012899 
+-0.001752 0.007744 -0.005988 0.002532 0.008726 -0.005178 
+0.004131 0.007370 -0.003416 0.004633 0.004491 -0.002090 
+0.003626 0.003869 -0.001840 -0.001010 0.004135 -0.002346 
+-0.006561 -0.001505 -0.001803 -0.021647 -0.033491 0.008352 
+-0.030891 -0.058967 0.019192 0.022177 0.002080 -0.001951 
+-0.002170 0.000642 -0.000564 -0.000820 0.000065 0.000913 
+0.000237 0.000746 -0.001465 -0.002458 0.001782 -0.003100 
+-0.000504 0.003159 -0.000285 -0.000591 0.003743 -0.002734 
+0.000374 0.005251 -0.000189 0.004211 0.000943 -0.006152 
+0.002089 0.002184 -0.006939 0.000189 0.006512 -0.008974 
+-0.002233 0.009590 -0.008305 -0.000445 -0.000350 -0.006866 
+0.003379 -0.002993 0.001430 0.002769 0.002708 0.004832 
+0.005923 0.012112 0.001196 0.002225 -0.000957 0.003016 
+-0.022302 -0.030041 0.021172 -0.022504 -0.041906 0.018319 
+0.008269 -0.012127 0.003905 -0.018571 -0.087857 0.029286 
+0.002224 -0.070310 -0.097126 -0.009052 0.012602 -0.013660 
+-0.000352 -0.004809 -0.005396 -0.001708 -0.001849 0.000402 
+-0.006087 -0.006087 -0.004348 -0.002745 0.021895 -0.031634 
+0.011558 0.019655 -0.076891 0.053333 0.012292 -0.041042 
+0.001905 0.070238 -0.068333 -0.024028 0.005304 -0.043583 
+-0.011966 0.020940 -0.041111 0.043070 -0.026491 0.015439 
+0.040490 0.001878 0.022041 0.055693 0.046742 -0.035968 
+0.026138 0.045291 -0.024392 -0.006429 0.044286 -0.082143 
+0.057845 -0.011000 -0.068362 0.019958 -0.000472 -0.014310 
+0.015231 -0.011242 -0.004212 -0.075752 0.084148 0.011131 
+-0.006667 -0.062667 -0.014667 0.003333 -0.003333 -0.003333 
+0.029624 -0.013636 -0.011850 0.077091 -0.034909 0.036364 
+0.118000 0.015600 0.020800 -0.025455 0.030420 0.020280 
+-0.019577 0.013769 0.113808 0.109327 -0.100000 0.072885 
+0.046324 -0.057132 0.047868 -0.048718 0.002906 0.024957 
+-0.041236 0.071429 0.006873 0.043764 0.004775 -0.114579 
+0.018002 -0.002987 -0.026983 -0.027218 0.021243 0.035848 
+-0.094872 0.041465 0.092051 0.008137 0.012704 0.058541 
+0.005245 0.023682 0.005230 0.022257 0.019091 -0.008481 
+0.002576 -0.037525 0.016919 -0.039955 0.023269 0.059819 
+0.039173 0.056356 -0.016499 0.006426 0.014989 -0.036101 
+0.012442 0.007742 -0.015794 -0.005065 0.000403 0.002931 
+-0.010403 -0.001481 0.010278 -0.005721 -0.002988 0.005735 
+-0.000792 -0.000816 0.000573 0.004275 0.003271 -0.001107 
+0.005717 0.003650 -0.000973 0.004426 0.001955 -0.000327 
+0.002922 0.000921 0.000181 0.003139 0.003027 0.000100 
+0.003731 0.007863 -0.001336 0.000523 0.009115 -0.004141 
+-0.008131 0.002471 -0.002156 -0.008118 -0.000404 0.000687 
+-0.000460 0.003178 0.004261 0.005000 0.004455 -0.001336 
+-0.000363 0.006790 -0.002508 -0.001962 0.005135 -0.008324 
+-0.004587 0.001540 -0.006193 0.000313 0.002736 -0.002594 
+0.003530 0.001563 -0.002597 -0.000131 0.001021 -0.005559 
+-0.001552 0.001964 -0.005524 0.000438 0.000332 -0.003731 
+-0.000933 0.001818 -0.004250 -0.002120 0.008564 -0.004646 
+-0.001985 0.004947 0.001787 0.006753 0.009155 0.005102 
+0.006687 0.007872 -0.000684 0.004356 0.008298 -0.005113 
+-0.005229 -0.006005 0.002760 -0.012131 -0.021179 0.018986 
+0.042630 -0.061380 0.042047 0.006771 0.042431 -0.010780 
+0.023187 -0.130833 -0.032848 0.003802 0.006399 -0.000507 
+-0.018793 0.013439 -0.005435 0.008176 0.017252 -0.010947 
+-0.012739 0.001758 -0.006112 -0.006945 -0.001473 -0.007261 
+-0.013919 0.002730 -0.014779 -0.021767 0.085000 -0.008707 
+-0.006732 0.027366 0.006805 -0.005510 0.004163 -0.008245 
+-0.059783 -0.141359 0.065380 0.162866 -0.025976 -0.122866 
+0.122444 -0.038222 0.030444 0.104767 -0.054806 -0.119806 
+0.035328 -0.042393 -0.056000 -0.032649 -0.015270 -0.077053 
+0.050338 0.022623 -0.003506 0.105806 -0.028563 -0.042141 
+0.022868 -0.031005 -0.020588 -0.107716 0.108210 -0.065123 
+-0.015678 -0.046908 -0.018506 0.035009 -0.019981 -0.000826 
+0.032273 -0.032273 0.003636 0.058091 -0.013727 0.016909 
+0.100667 0.099667 0.024667 -0.003333 0.004444 -0.012222 
+0.049455 -0.024727 0.004545 0.128839 -0.022768 0.098571 
+0.008110 -0.093354 0.004146 -0.018644 0.006680 -0.015121 
+-0.001450 -0.071062 -0.112635 0.091391 -0.088217 -0.121214 
+0.018103 0.025120 -0.040393 -0.002507 0.040416 -0.006149 
+0.005530 0.071272 -0.055327 0.038731 0.004077 -0.010192 
+0.055874 -0.069515 -0.066685 0.001667 -0.016106 -0.016873 
+-0.027441 0.008604 -0.006390 -0.027440 -0.028571 -0.002744 
+0.001320 0.010412 -0.018413 0.013843 -0.005637 -0.011444 
+0.005746 -0.008381 0.001820 0.000742 -0.005367 0.004745 
+-0.003096 -0.003393 0.004146 -0.004876 -0.003080 0.000971 
+-0.003508 -0.003629 -0.000763 -0.002262 -0.006483 0.000219 
+-0.001450 -0.006995 0.001461 -0.000126 -0.003191 0.000734 
+0.001783 0.002791 -0.000283 0.002647 0.005647 -0.001086 
+0.001568 0.004230 -0.001343 -0.001121 0.002389 -0.001034 
+-0.004270 0.001511 -0.000679 -0.005109 0.001390 -0.000435 
+0.003530 0.005053 0.002391 0.001559 0.002259 0.002619 
+0.000056 0.003254 0.000023 0.000903 0.002650 -0.006168 
+0.002069 -0.000226 -0.005119 0.001367 0.003809 -0.003345 
+0.001135 0.000372 -0.002986 0.001820 0.001693 -0.003913 
+0.000469 -0.001638 -0.005613 -0.000285 0.000222 -0.002451 
+0.002054 -0.005946 0.004059 0.000146 -0.004668 0.005520 
+0.002255 0.005968 0.001710 0.011315 0.009549 -0.000114 
+0.007666 0.004691 -0.000913 0.003560 0.005103 -0.001018 
+0.001555 0.012839 -0.003861 0.006106 0.002354 0.009186 
+0.022911 -0.029028 0.020852 0.057402 0.000745 0.022458 
+0.030976 -0.045049 -0.009854 -0.048399 -0.019360 -0.011429 
+0.000000 -0.027857 0.033571 0.029416 -0.032070 0.003727 
+-0.010125 -0.026812 0.014062 0.020464 -0.022069 0.023974 
+0.005727 0.022695 -0.012744 -0.000605 0.014664 -0.022717 
+-0.001538 -0.000769 -0.000769 -0.005091 0.003636 -0.002545 
+-0.024872 0.014380 -0.005438 0.023949 -0.003616 -0.014230 
+0.032242 0.007297 0.047770 0.005238 0.009286 0.004524 
+-0.023862 -0.070053 -0.030212 -0.004444 -0.056944 -0.012278 
+-0.011688 -0.028197 -0.095913 -0.026667 0.118333 0.000000 
+-0.004076 -0.002408 -0.015744 -0.011790 -0.011728 -0.035123 
+0.000000 0.042000 0.100000 0.055263 -0.029569 -0.012440 
+0.075385 0.108462 0.083654 -0.009375 0.009375 -0.081250 
+0.038571 -0.034643 -0.044881 0.065897 -0.037521 -0.151026 
+-0.017778 -0.016528 -0.068611 0.029400 -0.009800 0.010000 
+-0.000635 0.039048 -0.020794 0.063595 0.014676 -0.035385 
+-0.022356 -0.055891 -0.029167 -0.022359 0.001256 0.007436 
+0.004545 -0.009654 -0.001470 0.028316 -0.002947 -0.009614 
+-0.008448 -0.012857 0.012342 -0.011073 -0.027101 0.015124 
+-0.005006 -0.037173 0.007543 -0.059505 -0.036495 -0.009588 
+-0.000021 0.000016 -0.000017 0.033833 0.002850 -0.030247 
+0.016707 0.005022 -0.018527 0.010034 -0.000362 -0.006502 
+0.001584 -0.003079 0.001152 -0.001495 -0.001843 0.002556 
+-0.005374 -0.002837 -0.001435 -0.002152 -0.000314 -0.004214 
+0.001844 0.002783 -0.000812 0.004928 0.000796 -0.001715 
+0.001709 -0.002612 0.000395 -0.001736 -0.004216 0.000917 
+-0.002116 -0.002611 0.000494 -0.001635 -0.000268 -0.000112 
+-0.001427 0.001133 -0.000545 -0.000184 0.002421 -0.000878 
+0.001455 0.003914 -0.001395 0.001413 0.003919 -0.001716 
+-0.001378 0.001547 0.006523 0.002801 0.001867 0.000611 
+0.002993 0.002027 -0.002279 0.000750 0.000500 0.000000 
+-0.000766 0.000484 -0.000766 0.000700 0.000000 -0.003499 
+0.005622 -0.001725 -0.002931 -0.001692 -0.001793 -0.008158 
+0.003660 -0.002654 -0.005581 -0.000056 0.000195 -0.000007 
+-0.001617 -0.002431 0.004042 -0.000084 -0.005589 0.007385 
+0.000572 -0.002517 0.002395 0.003156 0.009331 -0.003196 
+0.001923 0.008318 -0.002754 0.000406 0.001142 -0.000033 
+0.001373 0.001328 0.004632 0.010332 0.005278 0.007490 
+0.016113 0.000702 0.001211 0.035156 -0.009458 0.014689 
+0.088786 0.051043 0.015111 -0.045800 0.024628 0.024340 
+0.001764 -0.002166 0.005488 -0.013333 -0.035667 0.026667 
+-0.000439 0.006151 0.011204 0.003156 0.002259 0.000136 
+0.007315 0.019775 -0.028444 -0.001995 0.010173 0.003311 
+-0.013029 0.024102 -0.006244 -0.050279 0.007606 -0.000817 
+0.049843 -0.028493 -0.048067 -0.055625 -0.013250 -0.026500 
+-0.012717 -0.002717 -0.054020 -0.003862 -0.081217 0.025132 
+0.038148 -0.065370 0.010926 -0.011283 -0.000486 0.001395 
+-0.015000 -0.012185 0.001523 -0.084538 0.026644 0.110458 
+-0.006200 0.007000 0.001400 0.030159 0.051127 -0.002587 
+0.050423 0.054642 0.093146 0.038750 -0.029700 -0.005400 
+-0.052966 -0.025310 0.052379 -0.002439 0.003049 0.002143 
+0.023241 0.008621 -0.036736 0.006010 0.139040 -0.090960 
+0.021624 0.019572 -0.035935 0.031160 -0.009216 0.005266 
+0.011655 0.029138 0.019000 0.016000 -0.018333 -0.008000 
+0.015472 -0.054151 0.035556 -0.026338 -0.020086 0.001397 
+0.007206 -0.000159 -0.012413 -0.002777 0.001561 0.002379 
+-0.006406 -0.002646 0.004965 -0.003718 0.004201 -0.004213 
+-0.007653 0.010094 -0.012142 -0.003657 0.001970 0.001006 
+0.005865 -0.002372 -0.002577 0.005377 -0.001153 -0.001777 
+0.007393 0.001637 -0.005024 0.006247 0.002378 -0.004455 
+0.001685 0.000153 -0.000603 -0.002667 -0.001150 -0.002300 
+-0.004229 -0.000479 -0.000439 0.000363 0.000188 -0.000916 
+0.000433 0.001389 -0.002021 0.000143 0.001795 -0.001270 
+-0.001887 0.000305 -0.000306 -0.002068 -0.001188 -0.000537 
+-0.001032 -0.002825 -0.000233 -0.001016 -0.002803 0.000006 
+-0.001824 0.000447 -0.000088 -0.000942 0.004708 -0.000636 
+0.001153 0.006306 -0.001421 0.002099 0.004748 -0.001453 
+0.003157 0.002602 0.001010 0.001185 0.002981 -0.001964 
+0.002577 0.003743 -0.002382 0.005266 -0.000333 -0.001982 
+0.002429 -0.002633 -0.003246 0.000237 -0.000948 -0.004403 
+-0.001394 -0.000200 -0.004778 -0.002935 0.004014 -0.003138 
+-0.000517 0.005174 -0.001729 0.000940 0.003882 -0.002089 
+0.000641 0.002872 -0.001780 0.001367 0.003469 -0.001076 
+0.001831 0.005732 -0.000973 -0.000427 0.005589 -0.001335 
+-0.005444 0.002056 -0.000462 -0.000106 -0.002599 0.004089 
+0.000423 -0.003580 0.006840 0.025398 0.018284 0.004747 
+0.014526 0.021772 -0.006222 0.011859 0.016065 -0.001840 
+0.056957 0.052743 -0.001508 -0.028264 -0.027765 0.017571 
+-0.037188 -0.009345 -0.001445 -0.003775 0.005427 -0.006056 
+-0.004541 0.011884 -0.004251 0.001572 0.036045 -0.056950 
+0.009819 0.016638 -0.034476 0.001625 -0.001964 -0.021738 
+0.062924 -0.080826 -0.015664 0.030276 -0.030276 -0.003364 
+0.094892 -0.079769 -0.012035 -0.071619 -0.067238 -0.051524 
+-0.025943 0.070205 -0.041721 -0.011988 0.017574 -0.024748 
+-0.024541 -0.019928 0.053279 -0.033010 -0.061378 0.068469 
+-0.123377 -0.120519 0.081299 0.079680 0.054786 -0.032992 
+-0.032407 0.001481 0.024259 0.010428 -0.018408 0.017502 
+-0.029060 0.054444 -0.043590 -0.118649 0.104895 0.031381 
+-0.057867 -0.090833 0.043400 -0.035800 -0.032250 0.101483 
+-0.025562 -0.026341 0.058877 -0.002290 0.000335 0.003751 
+0.001687 -0.012023 0.014845 -0.020684 -0.032543 0.014893 
+-0.015085 -0.024006 -0.014869 0.020503 -0.049940 -0.024144 
+0.018999 -0.030133 -0.019161 0.007246 -0.004478 -0.004594 
+0.001832 -0.001792 -0.002449 0.007519 -0.002072 -0.014666 
+0.013460 0.007583 -0.010515 0.009440 0.016421 -0.004584 
+0.010629 0.003110 -0.017927 0.001250 -0.002416 -0.002645 
+0.003052 -0.003297 0.000190 0.001494 -0.002503 0.004785 
+0.000447 -0.004449 0.005032 -0.000399 -0.000520 0.003778 
+0.000335 0.000371 -0.000576 0.000368 -0.000043 -0.000185 
+-0.000150 -0.000517 -0.001564 0.000227 0.000942 -0.000870 
+-0.000243 0.001682 0.000355 -0.003165 0.000847 -0.000032 
+-0.003879 0.000255 -0.000912 -0.002478 -0.001127 -0.001238 
+0.000027 -0.001869 -0.001132 0.000746 0.000186 0.000053 
+-0.000955 0.003280 0.000706 -0.001660 0.004335 0.000609 
+0.000027 0.003705 0.000445 0.001103 0.002600 0.000711 
+0.001181 0.003230 -0.001413 0.000637 -0.001063 0.000921 
+-0.000425 0.001037 0.000990 -0.000078 -0.001797 0.000703 
+-0.000418 0.000026 0.000280 -0.000908 0.000784 0.000647 
+-0.003336 0.002712 -0.000840 -0.002183 0.002799 -0.000285 
+-0.001541 0.002316 -0.001213 0.002171 0.002744 -0.001679 
+0.001518 0.001861 -0.000329 -0.000474 -0.000699 -0.002093 
+-0.000079 0.000489 -0.000256 0.003484 0.002442 0.002773 
+-0.002991 0.001579 0.001205 -0.000011 -0.001397 0.000992 
+0.003349 0.007781 -0.000610 0.031448 0.028220 -0.005925 
+-0.013125 -0.007693 0.004034 -0.012339 -0.009207 0.000561 
+-0.007127 -0.001449 -0.001468 -0.032142 -0.011625 0.004062 
+-0.020901 -0.010611 -0.001436 -0.010148 -0.008164 -0.012184 
+-0.025247 -0.008287 -0.018544 -0.000771 -0.020573 -0.003794 
+0.003768 -0.008458 -0.021439 -0.070000 0.012500 -0.047500 
+0.066220 0.016250 -0.082774 -0.024266 0.034623 -0.003107 
+0.000320 0.032492 -0.013317 -0.000787 -0.001736 -0.007622 
+-0.015397 0.006190 -0.005873 -0.027353 -0.007647 -0.013137 
+-0.063578 0.025431 0.040000 -0.002049 -0.002674 -0.002834 
+0.014406 -0.005594 0.007552 0.107268 -0.047195 -0.068634 
+-0.055327 -0.026964 0.080424 -0.050346 -0.055541 0.056840 
+-0.016400 0.118000 0.008200 -0.006667 0.164744 -0.032949 
+-0.022000 0.036923 -0.055385 0.000131 -0.018693 -0.027908 
+0.011612 -0.030855 0.001217 0.002857 -0.031714 -0.030143 
+-0.016830 -0.007213 -0.015556 -0.028521 -0.012454 0.014622 
+-0.027868 -0.040531 -0.010006 0.036656 -0.030911 0.006679 
+-0.015433 -0.002500 -0.010288 0.002645 0.026201 -0.029253 
+0.017766 0.016110 -0.028816 0.011090 0.014359 -0.020641 
+0.010983 0.008198 -0.003784 0.005460 -0.001075 0.001921 
+0.002997 -0.004160 -0.000757 0.000591 0.000148 0.001793 
+0.000204 -0.001362 0.001155 -0.001548 -0.002810 0.004857 
+-0.001963 -0.004517 0.008284 -0.000503 -0.006094 0.005472 
+0.000348 -0.002783 0.000000 -0.001490 0.000071 -0.002312 
+-0.001493 0.000971 -0.002089 -0.000200 0.000320 -0.000160 
+-0.001987 0.000030 -0.001613 -0.001976 0.002167 -0.000358 
+-0.002075 0.002659 0.000084 -0.002362 0.000254 -0.000195 
+-0.000234 -0.001295 -0.000425 0.001303 0.000092 -0.000259 
+-0.000503 0.000754 0.000282 -0.001900 -0.000579 0.000165 
+-0.000252 -0.002298 -0.000994 0.000962 -0.002832 -0.001534 
+-0.000820 0.001539 0.001453 -0.001349 0.000662 0.001656 
+-0.002269 0.001532 -0.001354 -0.000792 0.002777 -0.002786 
+-0.001819 -0.001895 -0.000708 -0.005253 -0.000612 -0.002691 
+-0.003545 -0.000075 -0.003843 -0.001290 -0.002255 -0.003464 
+0.001662 -0.001410 -0.003853 0.003975 0.003125 -0.002237 
+0.001148 0.000018 0.000916 -0.000349 -0.004824 -0.000529 
+-0.000181 -0.005545 0.001230 0.002949 -0.000599 0.001974 
+-0.003049 0.004347 0.001859 -0.001501 0.003700 -0.000173 
+0.004066 0.009614 -0.000691 0.018997 0.022821 -0.006049 
+-0.020525 -0.008071 0.005847 -0.015170 -0.009207 0.001115 
+-0.014108 -0.003800 -0.002436 -0.026610 -0.003014 -0.004243 
+-0.025420 -0.025690 -0.006010 -0.081875 -0.060856 -0.031857 
+-0.052500 -0.015191 0.009494 -0.008683 0.010641 -0.002179 
+0.023175 -0.078095 -0.043810 -0.084679 -0.117628 0.067051 
+0.013182 0.041023 -0.001477 -0.070085 0.105128 -0.021111 
+-0.028490 0.000503 0.033986 0.007631 0.011333 -0.006541 
+0.027059 -0.002941 0.007059 0.015158 -0.013588 -0.004046 
+-0.018588 0.004647 0.037000 -0.005477 -0.062795 -0.043080 
+0.040121 -0.108690 -0.008534 -0.136333 -0.010333 -0.036667 
+0.000000 0.098571 -0.020000 0.093667 0.130333 -0.018333 
+0.035714 0.018016 0.125476 0.125000 -0.012500 0.012500 
+0.093730 0.070317 -0.015635 0.065556 0.120000 -0.054444 
+0.059000 -0.021029 -0.012618 0.054411 0.005589 0.019529 
+-0.009049 0.027810 -0.048702 -0.040789 0.028421 -0.040789 
+0.026420 -0.000049 -0.016506 0.021687 0.018601 -0.003539 
+-0.000442 0.013601 -0.044073 0.030933 0.016291 -0.033294 
+0.015237 0.017345 -0.023106 0.004572 0.008270 -0.008707 
+0.001985 -0.002090 0.000331 0.002900 -0.003748 0.001171 
+0.001144 0.000425 -0.003284 0.000259 0.004043 -0.001726 
+0.001687 0.004058 -0.002133 -0.000774 0.001407 -0.001521 
+0.000725 -0.002071 -0.001189 -0.003684 -0.001043 0.003351 
+-0.003553 -0.002942 -0.000181 -0.000696 0.000261 -0.000522 
+-0.000058 -0.000701 0.001783 -0.003165 -0.003906 0.004119 
+0.000411 -0.001813 0.005400 0.000183 -0.004577 0.001911 
+-0.001057 -0.002259 0.001010 -0.002776 -0.000588 -0.000341 
+-0.003939 0.001228 -0.001275 -0.003619 -0.000479 0.000480 
+-0.003976 -0.008050 0.001401 -0.004492 -0.011255 -0.001621 
+-0.003010 -0.010288 -0.002248 -0.000300 -0.007012 -0.000610 
+-0.003462 0.000742 0.000212 -0.001292 0.003397 0.001658 
+-0.000827 0.002677 0.001338 0.000341 0.005159 -0.002004 
+-0.003594 0.001797 -0.002344 -0.002883 -0.000865 -0.000476 
+-0.000704 -0.000663 -0.002140 -0.001010 -0.000432 -0.003271 
+0.000362 -0.001284 -0.001591 0.000520 -0.000270 0.001831 
+0.002173 -0.002105 0.002766 0.000357 -0.003390 0.000945 
+-0.000871 -0.000883 -0.001032 0.000237 0.004818 -0.002483 
+-0.004187 0.006782 -0.002151 -0.002465 0.004961 -0.001356 
+0.007464 0.011133 -0.003000 0.022706 0.020258 -0.005214 
+-0.014405 0.003208 0.003753 -0.015575 -0.003369 0.001615 
+-0.008679 0.001550 -0.001933 0.003870 -0.003160 0.001377 
+0.010481 -0.030177 0.005526 -0.142490 -0.043764 -0.041291 
+-0.008483 -0.015060 -0.043973 0.070897 -0.101590 0.007410 
+-0.010451 0.107573 0.054778 0.032914 0.043886 0.061429 
+0.036146 -0.122749 -0.003639 0.071882 -0.062674 -0.023584 
+-0.015369 0.067462 -0.072800 0.016307 0.065000 -0.001812 
+-0.025255 0.008990 -0.016551 -0.008707 -0.024354 -0.062653 
+-0.018810 -0.022262 0.035119 -0.033818 0.019227 0.041773 
+0.039711 -0.024711 0.010737 -0.011005 0.029577 -0.064656 
+0.000000 0.000000 0.000000 0.093973 -0.042290 -0.011751 
+0.010688 0.012804 0.005185 -0.027561 0.041128 -0.009116 
+0.012500 -0.036058 0.024038 0.010625 -0.010625 -0.012500 
+0.008581 -0.032328 -0.031663 -0.000128 -0.018321 -0.055282 
+-0.014282 0.003519 -0.067894 0.060761 0.031616 -0.132514 
+0.023745 0.005547 0.057024 -0.038972 -0.000936 0.026855 
+0.004036 -0.015094 0.005734 0.005416 0.001779 -0.003896 
+-0.000876 0.007669 -0.001343 0.002350 0.000582 -0.001996 
+0.003146 0.000574 -0.001019 0.001161 0.002626 -0.003059 
+0.002363 -0.000200 -0.005254 0.001279 -0.004213 0.001567 
+0.002264 0.005116 0.000599 -0.000568 0.005146 -0.003413 
+-0.000025 0.000942 -0.004225 -0.003042 0.000783 -0.004002 
+-0.002834 -0.001176 -0.004548 0.000454 0.000685 -0.003317 
+0.002487 -0.000829 -0.000598 0.001271 -0.000031 0.000909 
+-0.001261 0.000756 0.000756 -0.002506 -0.003116 -0.000068 
+-0.005162 -0.000430 0.002105 -0.002875 0.000845 0.002698 
+-0.000680 0.000034 0.000172 0.001681 0.000294 -0.004119 
+0.003261 0.001807 -0.006110 0.004010 0.002520 -0.003488 
+0.003847 0.000173 -0.000881 0.003014 -0.001253 0.000799 
+-0.002479 -0.006109 0.000634 0.002058 0.001360 0.000457 
+0.004563 0.004542 -0.000005 0.001589 0.002861 -0.003615 
+-0.003750 -0.001358 -0.001850 -0.003920 0.002640 0.001040 
+-0.001551 0.002556 -0.002270 -0.000121 0.001820 -0.004490 
+-0.002492 -0.001984 -0.003230 -0.002632 -0.005436 0.000254 
+0.000460 -0.005185 -0.001105 -0.001258 -0.002735 -0.003873 
+-0.002889 0.002992 -0.002637 0.000209 0.012537 -0.002134 
+-0.006142 0.008140 -0.005076 -0.010964 0.001541 0.000632 
+0.003943 0.003212 -0.001485 0.023996 0.017347 0.004646 
+-0.004330 0.006098 0.000923 -0.024131 -0.005278 0.002318 
+-0.021867 -0.004018 -0.003077 -0.015242 -0.009801 -0.001703 
+-0.014210 -0.014588 -0.000269 -0.105605 -0.011055 -0.037529 
+-0.069209 -0.040758 -0.055836 -0.011997 -0.000146 0.029630 
+0.087273 0.107273 0.051818 0.079206 0.051508 -0.146746 
+0.055336 0.020137 -0.032126 0.097580 -0.019609 -0.041615 
+0.010061 0.036616 -0.114878 0.005644 0.021222 -0.094822 
+-0.007843 0.010991 -0.009023 0.002547 -0.051137 0.017521 
+-0.025000 0.070000 0.095000 -0.019449 0.122267 0.009131 
+-0.014444 0.014444 0.043333 0.077778 -0.008889 0.030000 
+0.060769 -0.086923 -0.017692 0.102000 0.000000 0.018000 
+-0.006842 0.022180 -0.016165 -0.077807 0.004491 -0.072193 
+0.009848 -0.004848 0.000152 0.028158 -0.041404 0.061272 
+0.001612 -0.005408 0.022204 -0.057222 -0.035556 -0.013889 
+-0.003326 0.013271 -0.015633 0.088801 0.033118 -0.097243 
+-0.017173 0.073655 0.013786 -0.037990 -0.034865 0.031670 
+-0.006219 -0.026987 0.008992 0.003715 0.016866 -0.010843 
+0.001516 0.015071 -0.007385 0.000843 0.006160 -0.002936 
+0.001110 0.003921 -0.003612 0.002024 0.000868 -0.001398 
+-0.001210 -0.007421 -0.001252 0.002245 -0.004904 -0.000763 
+-0.000418 0.000810 -0.000132 -0.000831 0.003510 -0.000997 
+-0.000007 0.002869 0.000046 -0.000215 0.000431 -0.001154 
+0.001709 0.000779 -0.002753 -0.000886 0.000308 -0.002297 
+-0.001072 -0.001430 -0.002213 -0.001333 0.002288 -0.001526 
+-0.000655 0.003521 -0.001402 0.000028 -0.002140 -0.002157 
+-0.003402 -0.000728 -0.003150 -0.000294 -0.000229 -0.003074 
+-0.000867 -0.003337 -0.003804 0.001508 -0.003568 -0.002676 
+0.005021 -0.001797 -0.004353 0.003568 -0.002027 -0.005058 
+0.001450 -0.000976 -0.003925 -0.000402 -0.000639 -0.001678 
+-0.001940 -0.003120 0.000365 -0.001993 -0.002334 -0.001078 
+-0.002029 0.000221 -0.002706 -0.002768 0.003618 -0.002979 
+-0.003037 0.004584 -0.005001 -0.003036 0.004142 -0.006110 
+-0.002155 0.006550 -0.006136 0.002697 0.000547 -0.001476 
+-0.002553 0.001390 -0.004170 -0.002123 -0.005191 0.002280 
+-0.001142 -0.004562 0.002196 -0.000549 0.001036 -0.003844 
+-0.006043 0.003264 -0.004319 0.006516 0.006754 0.002412 
+0.009473 0.014535 -0.008557 -0.000829 0.009678 -0.003600 
+0.000231 0.000387 -0.001965 0.003697 0.008250 -0.000832 
+0.013544 0.011307 0.003651 -0.022997 0.001726 0.004430 
+-0.028787 -0.007157 -0.000334 -0.027281 -0.008750 -0.002203 
+-0.030076 -0.000888 -0.005642 -0.052026 0.009305 -0.015707 
+-0.038844 0.006862 -0.024795 -0.004484 -0.001190 -0.017659 
+-0.004118 -0.027941 -0.075588 -0.010321 -0.003096 -0.061250 
+-0.011105 -0.017655 0.023706 -0.003901 0.029737 -0.009944 
+-0.001935 0.007046 -0.032598 -0.031163 0.004568 -0.016927 
+-0.041612 -0.048139 0.038114 -0.048648 -0.040303 0.045851 
+-0.052000 -0.004525 0.045248 -0.054862 -0.061186 0.019289 
+-0.043500 0.026250 -0.021750 0.082587 0.057294 0.015891 
+-0.104342 0.040658 0.010614 -0.097480 0.017724 -0.084187 
+0.014566 0.058385 0.034639 -0.056658 -0.025385 -0.010302 
+0.015833 0.018137 -0.010882 0.019627 0.030862 0.011911 
+0.016765 -0.016875 0.004191 0.012338 -0.023026 0.002955 
+-0.034587 -0.022458 0.093053 0.009023 0.088558 0.084884 
+-0.014328 -0.002980 0.032897 -0.040775 -0.034506 0.029798 
+-0.009718 -0.007035 0.009514 0.009188 0.016919 -0.020245 
+0.007284 0.011405 -0.013375 -0.000079 -0.000759 0.000196 
+-0.001424 -0.004752 0.006005 -0.001478 -0.003149 0.004585 
+0.000483 0.000672 -0.000570 -0.000709 0.002301 -0.003610 
+-0.000245 0.001160 -0.001417 0.000352 -0.000817 -0.000157 
+-0.000067 -0.001248 0.000892 -0.000211 0.000355 0.000267 
+-0.000180 -0.000573 0.000122 -0.003204 -0.003025 -0.001822 
+-0.001271 -0.004051 -0.002106 -0.002918 0.001808 0.001711 
+-0.002507 0.004341 -0.001825 -0.001849 -0.000183 -0.001953 
+-0.000113 0.000011 -0.002764 -0.002205 -0.002558 0.000832 
+-0.001736 -0.000710 -0.000323 0.000667 -0.001961 -0.001799 
+0.003808 -0.002988 -0.002265 -0.001734 -0.000596 -0.007534 
+-0.001238 0.000841 -0.003464 -0.002114 -0.000528 0.001328 
+-0.000224 -0.000054 -0.000402 0.000314 -0.002342 0.001111 
+-0.006748 -0.004851 0.004218 -0.005380 -0.002364 0.001038 
+-0.000281 0.004119 0.000851 0.001466 0.008408 0.001980 
+-0.001173 0.006829 0.001532 -0.003355 0.000340 -0.001034 
+-0.004085 -0.002408 -0.005031 -0.006058 -0.001924 -0.000412 
+-0.004165 0.000065 0.004193 0.000354 0.003755 0.001397 
+-0.005075 0.010014 -0.007619 -0.003846 0.011619 0.001555 
+0.009548 0.009066 -0.004070 0.001615 0.002983 -0.004990 
+-0.005439 0.002666 -0.001146 0.001300 0.002234 -0.005421 
+0.002523 0.010900 -0.000937 -0.006446 0.004245 0.002594 
+-0.018885 -0.003177 0.002804 -0.018279 -0.000321 -0.001041 
+-0.019451 0.004994 -0.003855 -0.031214 0.007888 -0.007540 
+-0.022643 0.004091 -0.009128 -0.014455 0.017727 -0.019364 
+-0.071508 -0.044878 -0.043234 0.000211 0.002611 -0.019326 
+-0.017439 -0.001263 -0.002150 -0.021689 0.008196 -0.004581 
+-0.000112 0.001460 -0.005909 -0.010079 0.004646 0.005784 
+-0.023564 0.004722 -0.017512 -0.011482 0.000480 -0.037607 
+0.003321 -0.028974 0.061726 -0.062775 -0.053014 -0.054290 
+-0.022102 0.023183 -0.017027 -0.092361 0.000694 -0.010139 
+-0.016250 -0.085000 0.085000 0.000000 0.032500 -0.031250 
+0.020526 -0.013816 0.036711 0.027692 -0.038000 0.018462 
+0.090887 0.054073 -0.083065 -0.010909 0.021818 -0.037273 
+0.032381 -0.012381 -0.015238 -0.008836 -0.003598 0.019471 
+0.070000 0.046233 0.101712 0.046620 -0.042032 0.028511 
+0.009911 -0.021085 0.008898 0.009913 -0.013680 0.001363 
+0.011600 -0.002997 -0.004975 0.005875 0.000313 -0.003896 
+-0.002662 -0.004561 0.003591 -0.006872 -0.006370 0.005467 
+-0.003263 -0.004770 0.004321 -0.001917 -0.006752 0.004098 
+-0.000893 -0.006038 -0.000431 0.000092 -0.000427 -0.001312 
+0.000134 0.000874 -0.001138 0.000000 0.000684 -0.000085 
+-0.000033 0.000844 -0.000446 0.003346 0.000738 -0.003533 
+0.004488 -0.003007 -0.002249 -0.001061 -0.004897 -0.000808 
+-0.004555 -0.004753 -0.001476 -0.008238 -0.003701 0.001276 
+-0.006927 0.000245 -0.002117 -0.002686 -0.000582 -0.003968 
+0.001105 0.000965 -0.002850 0.002231 0.002140 0.000667 
+0.003513 0.004985 0.000237 0.003101 0.007393 -0.003960 
+-0.001824 0.002280 -0.007317 0.002551 -0.001488 -0.003189 
+-0.001696 0.001605 -0.001040 0.000014 -0.000471 0.000351 
+-0.000054 -0.000213 -0.000035 0.001345 0.002300 -0.001398 
+-0.000731 0.001457 0.000300 -0.001257 0.001052 -0.000079 
+0.000000 0.002932 0.000000 0.002280 0.005236 -0.001063 
+0.003857 0.004780 -0.001300 0.001928 0.000656 -0.001222 
+-0.000123 -0.001078 -0.002882 -0.006170 -0.002164 -0.002559 
+-0.000069 -0.000923 -0.000330 0.000646 0.005169 -0.009280 
+-0.004292 0.012053 -0.012163 -0.004203 0.018816 -0.008300 
+-0.005708 0.016445 -0.004297 -0.003141 0.008848 0.003547 
+-0.009558 0.002494 -0.002217 0.002599 0.001882 -0.005844 
+0.002019 0.005954 -0.013303 0.010822 0.006507 -0.003343 
+-0.004220 0.003701 0.001454 -0.014587 0.005050 -0.000354 
+-0.017371 0.006055 -0.003970 -0.025109 0.002481 -0.006468 
+-0.056885 0.001925 -0.015751 -0.056111 0.017091 -0.024570 
+0.005000 -0.010471 0.002856 0.003599 0.010121 -0.034300 
+-0.011526 -0.047843 -0.021710 0.003537 -0.017925 -0.002486 
+0.009897 -0.000397 -0.036029 0.011752 0.009643 -0.024258 
+-0.005930 -0.000008 -0.020818 -0.010407 0.009470 -0.005195 
+-0.017109 0.022385 0.065725 -0.080000 -0.060667 0.005515 
+-0.023281 0.011344 0.002883 -0.058536 0.001469 -0.017878 
+0.017599 -0.020180 -0.078023 0.027874 0.100024 0.102488 
+0.054704 -0.166370 -0.050185 0.025825 -0.041581 -0.042350 
+-0.004286 0.001746 -0.008095 -0.047206 -0.044779 -0.026029 
+-0.015317 -0.011746 0.029603 0.030127 0.001029 0.017018 
+0.036679 -0.016911 -0.011899 0.019072 -0.009172 -0.001114 
+0.005228 -0.011925 0.008502 0.009996 -0.002757 -0.003061 
+0.006923 0.001879 -0.005753 -0.003898 0.000566 0.000045 
+-0.005684 -0.009400 -0.005365 -0.010093 -0.002101 0.012921 
+-0.004198 0.000017 -0.001405 0.001332 0.012364 0.002346 
+-0.003277 0.009188 0.001342 -0.003288 0.005342 -0.005344 
+-0.000180 -0.000659 -0.001288 -0.002243 -0.001118 0.003855 
+0.000192 0.000915 0.001230 0.002911 0.000292 -0.005894 
+0.003967 -0.002852 -0.009775 0.001200 -0.005746 -0.007531 
+-0.000906 -0.004923 -0.000283 -0.000368 0.000887 -0.004016 
+0.002090 -0.002121 -0.006786 0.002697 -0.002384 -0.006462 
+0.000290 -0.004307 -0.001912 -0.000353 -0.003734 -0.000628 
+-0.001170 -0.002553 0.000639 -0.001846 0.000513 0.000464 
+-0.001726 0.000518 0.000635 -0.002344 -0.001101 0.001986 
+-0.000976 0.000306 0.001532 -0.000546 0.002395 0.000882 
+-0.007877 -0.004059 0.001789 0.000862 -0.000355 -0.001281 
+0.004226 0.002507 -0.000909 0.000552 0.002515 -0.000417 
+-0.003589 -0.000596 0.002092 -0.001128 -0.001875 0.002626 
+0.003742 0.000733 -0.000073 0.004460 0.001837 -0.002756 
+-0.001284 -0.001915 -0.003851 -0.002781 -0.002414 0.000397 
+-0.000222 -0.000668 -0.003548 -0.002473 0.004235 -0.006121 
+-0.003917 0.012172 -0.006774 0.000724 0.019651 -0.008851 
+0.000242 0.015387 -0.013791 -0.004842 0.008242 -0.006078 
+-0.003458 0.004544 0.003194 -0.000847 0.001937 0.002087 
+0.002603 0.003348 -0.003655 0.011087 0.008676 -0.005554 
+0.005986 0.007402 -0.001744 -0.005255 0.004589 0.000260 
+-0.011355 0.002200 -0.002998 -0.018560 0.000131 -0.006919 
+-0.053034 0.006260 -0.022167 -0.045129 -0.005500 -0.016297 
+0.004228 -0.003649 0.004092 0.031250 0.011250 -0.011250 
+0.045043 -0.101190 -0.018201 0.092842 -0.082924 -0.009706 
+0.007676 -0.054306 -0.019405 -0.018832 -0.001346 -0.000671 
+-0.023334 0.016734 -0.013405 0.004266 0.027886 -0.009515 
+-0.014704 0.012037 0.022741 0.010200 -0.005069 -0.011769 
+0.005268 0.009882 -0.010637 -0.005378 0.013566 -0.011489 
+-0.027388 0.046326 -0.067175 -0.033122 -0.003598 0.005608 
+-0.012029 -0.009565 0.044275 -0.021742 -0.062561 -0.004582 
+-0.032490 -0.025592 -0.049459 -0.057394 0.031939 -0.008485 
+0.002167 -0.002952 -0.016915 0.021026 -0.008841 0.003504 
+0.006573 -0.007236 0.010693 0.003215 -0.005075 0.003180 
+0.000318 -0.002590 0.001570 -0.001753 -0.001885 0.003297 
+-0.004971 -0.000995 0.003627 -0.003764 -0.002994 -0.000887 
+0.000816 0.003074 -0.003511 0.003673 0.002405 -0.002549 
+-0.001536 0.001914 -0.003669 -0.006683 0.006804 -0.008979 
+-0.005644 0.011401 -0.008353 -0.002838 -0.000825 -0.003696 
+-0.008859 -0.006685 0.005761 -0.003795 -0.004195 0.005248 
+0.001037 0.001360 -0.000790 0.003568 -0.000558 -0.003519 
+-0.000491 -0.001879 -0.004615 -0.004874 -0.003639 -0.004669 
+-0.001923 -0.002583 -0.007002 0.001163 -0.000075 -0.009531 
+0.002243 -0.006115 -0.004008 -0.000293 -0.005995 -0.007352 
+-0.000541 -0.003744 -0.007648 0.000813 0.000732 -0.002033 
+-0.000559 0.000097 -0.000337 -0.001138 0.000871 0.000837 
+-0.002525 0.000745 0.001820 -0.004965 -0.001987 0.001591 
+-0.001961 -0.001100 -0.000592 0.000884 0.002373 -0.001545 
+-0.000596 -0.004091 0.001341 0.002321 -0.002128 -0.002385 
+0.004519 -0.000290 -0.003543 0.003362 0.000441 -0.001947 
+-0.000138 0.001004 0.000672 -0.001491 0.000638 0.002725 
+-0.000186 0.000032 0.000831 -0.000444 0.000777 -0.003000 
+0.003495 0.001969 -0.003274 0.001120 0.001230 -0.000628 
+-0.000795 -0.001106 -0.000839 -0.000036 -0.002170 0.000359 
+-0.001467 0.002779 -0.001444 -0.001118 0.010627 -0.001894 
+0.005657 0.010025 -0.011538 -0.003717 0.004779 -0.004956 
+0.003524 0.002513 -0.005031 -0.001287 0.002895 -0.001944 
+0.000419 0.008890 -0.004258 0.003262 0.008032 -0.007155 
+0.004862 0.000514 -0.001077 -0.000500 -0.005414 -0.000575 
+-0.005704 -0.007197 -0.002298 -0.009227 -0.006169 -0.005801 
+-0.012578 -0.004786 -0.009690 -0.025804 -0.023075 0.002278 
+-0.019473 -0.006015 0.029363 -0.004273 -0.035000 0.008545 
+0.029615 -0.049850 0.002055 0.018922 -0.094973 0.066469 
+-0.005118 -0.024118 -0.001706 -0.001333 0.030133 -0.011733 
+-0.097678 -0.071749 0.040137 0.016423 -0.006198 0.021377 
+0.007481 -0.003933 0.003735 -0.013038 0.006943 -0.020995 
+0.032802 0.021099 -0.014835 0.028042 0.006348 0.009450 
+-0.012112 0.024151 -0.007509 -0.020744 0.021120 -0.005607 
+0.002193 0.030108 -0.018171 -0.004726 -0.002356 -0.054356 
+-0.039846 -0.022769 -0.088889 -0.013134 0.034706 -0.015916 
+-0.004095 -0.002158 0.028809 -0.007468 -0.012432 0.040845 
+-0.002770 -0.009992 0.032037 0.008119 -0.001443 0.006350 
+0.013504 0.003708 -0.019906 0.007148 0.000895 -0.010260 
+0.000384 -0.004997 0.004558 0.000089 -0.004298 0.002955 
+0.005201 0.003809 -0.002488 0.009217 0.002643 -0.008079 
+0.005907 0.008456 -0.016313 0.003594 0.016460 -0.012229 
+-0.003997 0.006342 -0.003352 -0.005658 -0.004271 0.000388 
+-0.002324 -0.003550 0.007950 -0.001164 0.000132 0.007188 
+-0.000956 -0.001261 0.005022 -0.001184 -0.003323 0.002311 
+0.000410 0.000071 -0.000371 0.000785 0.004171 -0.005254 
+0.001222 0.005368 -0.004467 0.003335 -0.000015 -0.003230 
+0.002172 -0.005752 -0.003199 0.000947 -0.006048 -0.004944 
+-0.000657 -0.004451 -0.003466 -0.000284 -0.000314 -0.002802 
+-0.000588 0.000700 -0.001573 -0.000697 0.000633 -0.000046 
+-0.001509 -0.001101 -0.001276 -0.000572 -0.001808 -0.002266 
+-0.001991 -0.003993 -0.002609 -0.004421 -0.004267 0.000869 
+-0.000192 0.000575 0.001096 0.002183 -0.000068 -0.003782 
+0.004493 0.001338 -0.000896 0.001840 -0.002488 0.000056 
+0.004772 -0.001468 -0.000698 0.002333 0.000314 -0.000357 
+0.000363 -0.000483 -0.001359 -0.001209 -0.000820 -0.000112 
+-0.001022 -0.001951 0.000527 -0.004999 -0.002345 0.004073 
+0.000141 -0.002804 -0.001270 -0.000049 -0.005878 -0.000835 
+-0.001037 -0.003620 -0.000657 -0.000521 0.001927 -0.000495 
+0.000636 0.005878 -0.003431 0.002178 0.005912 -0.008142 
+-0.003513 -0.001650 -0.010120 -0.004452 -0.004583 -0.007507 
+-0.001621 -0.005813 -0.005195 0.002955 -0.005052 -0.007579 
+0.002278 0.003444 -0.003056 0.000129 -0.006412 -0.001040 
+0.002314 -0.011029 -0.000916 0.004000 -0.019213 0.000179 
+-0.001073 -0.042063 0.006551 -0.016903 -0.027330 0.013628 
+-0.011585 -0.007076 -0.013839 -0.004735 -0.021439 -0.004394 
+-0.101840 -0.003950 0.077522 -0.185779 -0.025345 -0.025868 
+0.040198 0.054738 -0.027559 0.038434 -0.024749 -0.071040 
+0.011961 -0.089363 -0.005637 0.004595 -0.035433 0.018517 
+0.009961 -0.012714 0.005851 0.007082 0.009388 -0.011388 
+0.007191 0.020481 -0.010905 0.015170 0.017482 -0.001505 
+-0.000435 0.010171 -0.002699 -0.011424 -0.008470 0.000607 
+-0.008143 -0.014462 -0.000572 -0.007130 -0.029662 0.057710 
+-0.057263 0.101318 0.054186 0.012250 0.002725 0.038570 
+0.011288 -0.021723 0.061564 -0.003688 -0.010550 0.050557 
+-0.860759 -1.151899 4.436709 -0.940000 -1.225000 4.600000 
+-1.015957 -1.420213 4.345745 -0.012413 -0.007843 0.035684 
+-0.003903 -0.003919 0.018733 0.000055 0.001892 0.001274 
+0.002411 0.001672 -0.002853 -0.001549 0.001359 -0.001130 
+0.001950 0.008348 -0.009797 0.002734 0.012787 -0.017478 
+0.000345 0.008498 -0.013912 0.003262 0.003858 -0.005273 
+0.005581 0.001046 -0.003630 0.003225 0.002749 -0.004306 
+-0.000042 0.003255 -0.002591 -0.001291 0.001151 -0.000458 
+0.000222 0.000831 -0.001392 0.001333 0.003833 0.000000 
+0.003652 0.001543 -0.006119 0.001585 0.002140 -0.006223 
+0.001851 0.000085 -0.000989 -0.002098 -0.001519 0.001247 
+-0.001298 0.000029 0.005018 -0.001895 -0.001727 0.003727 
+-0.003308 -0.004875 0.000035 0.000175 -0.002241 -0.004650 
+0.002074 -0.002632 -0.002991 0.003632 -0.001685 -0.000211 
+0.005913 0.002407 -0.001095 0.003606 0.002431 -0.000713 
+0.003219 0.010811 -0.000560 0.004194 0.006480 -0.000724 
+0.000680 -0.000141 -0.001078 -0.002092 -0.004183 0.000305 
+-0.004688 -0.005813 0.000094 -0.000958 -0.008481 0.003201 
+0.000179 -0.008053 -0.001453 -0.001118 -0.004815 -0.002272 
+-0.002294 -0.001996 0.001199 -0.001062 -0.002368 0.002393 
+0.001273 -0.000514 0.001338 0.001673 -0.000178 0.001270 
+0.002771 0.000166 0.002201 0.002343 -0.002199 0.001698 
+-0.001569 -0.001014 0.001303 -0.004536 0.001314 -0.002425 
+0.001545 0.000574 -0.002422 -0.003526 -0.004024 -0.008133 
+-0.005482 -0.001516 -0.013833 -0.011707 -0.000401 -0.022057 
+-0.015019 -0.000411 -0.024051 -0.011389 -0.004343 -0.016122 
+-0.004487 -0.006468 -0.009803 -0.003995 -0.016742 -0.004430 
+-0.003570 -0.020618 -0.000267 -0.002070 -0.016070 -0.010884 
+0.002849 -0.002984 -0.024079 -0.002049 0.019447 -0.004242 
+-0.019297 0.015811 0.047227 -0.033815 -0.025325 0.059575 
+-0.000803 0.011969 -0.009749 -0.012505 -0.008553 0.014471 
+-0.005732 0.019021 -0.002449 0.000938 0.000610 -0.005643 
+-0.001515 -0.000456 0.000589 -0.007253 0.005102 -0.003046 
+-0.015346 0.011966 -0.007324 -0.023143 0.005051 -0.005602 
+-0.018030 -0.015597 0.002072 -0.015644 -0.031558 0.006106 
+-0.020286 -0.022324 -0.000153 -0.016980 -0.002764 -0.011339 
+-0.005500 0.005500 0.051000 0.020019 -0.045536 0.030224 
+0.008776 -0.022636 0.055494 -1.573529 -1.875000 4.816176 
+-1.498070 -1.575290 5.509653 -1.464589 -1.577904 6.229462 
+-1.293605 -1.613372 6.389535 -0.887967 -1.398340 5.331950 
+-0.006151 -0.002758 0.022367 0.004286 0.003846 -0.005385 
+-0.001526 0.002280 0.001422 -0.001620 0.006205 0.002589 
+0.005023 0.011542 -0.004706 0.006085 0.006537 -0.013791 
+0.002355 0.003930 -0.008423 0.000322 -0.006380 -0.000340 
+0.001503 -0.008590 -0.003221 0.005640 0.000453 -0.007926 
+0.000369 0.008458 -0.011345 -0.000794 0.009757 -0.006535 
+-0.001141 0.005839 -0.000795 -0.001387 -0.001520 -0.002796 
+-0.003162 -0.003538 -0.007077 -0.002798 -0.000505 -0.007772 
+0.000410 0.001440 -0.005970 0.002008 0.000116 -0.003203 
+0.001580 0.001528 0.000601 0.000456 0.001215 0.000658 
+-0.002969 -0.000368 -0.000858 -0.003308 0.001861 -0.001549 
+-0.002160 0.000160 -0.003360 0.000705 -0.002244 -0.001192 
+0.004105 -0.000489 -0.000857 0.004141 -0.002618 -0.002800 
+-0.001574 -0.002024 -0.000191 -0.001226 -0.003208 -0.002490 
+0.001814 -0.002255 -0.001538 0.001159 0.000892 -0.000981 
+0.000489 0.003188 -0.002383 -0.002890 0.001309 -0.002213 
+-0.004536 -0.004632 -0.002284 -0.002645 -0.006013 -0.002966 
+-0.000903 -0.000793 -0.000670 0.002806 0.002592 0.000313 
+-0.000458 0.001163 -0.000385 0.001945 0.000549 0.002221 
+0.003794 0.000413 0.002975 0.002937 0.000395 0.001899 
+0.000385 -0.000043 -0.007216 -0.008616 0.000575 -0.002757 
+-0.006434 0.001384 -0.005429 -0.000127 0.007612 0.018247 
+0.208333 0.250000 4.053571 0.626263 0.247475 4.510101 
+0.842697 0.191011 3.685393 0.008019 -0.001554 0.017676 
+-0.004237 -0.002560 -0.007507 -0.017802 -0.004253 -0.025288 
+-0.015810 -0.005761 -0.016220 0.000660 -0.002538 -0.001621 
+0.015433 0.019076 0.016289 0.003772 0.007226 0.014505 
+0.007392 -0.010811 0.021048 -0.005773 -0.013844 0.032900 
+-0.000445 -0.020254 0.068548 0.103140 0.096899 0.013140 
+-0.003458 0.025014 -0.000028 0.002671 0.008104 -0.020079 
+0.004673 0.002240 -0.002093 -0.009798 -0.005364 -0.001549 
+-0.006790 0.002654 -0.001571 -0.006379 0.009146 -0.002597 
+-0.007440 0.006699 -0.001764 -0.007599 0.002882 -0.001411 
+-0.017652 0.010308 -0.024816 0.080300 0.073163 -0.065727 
+-0.015071 -0.006298 -0.009882 0.011817 -0.047382 0.060937 
+-0.011575 -0.007312 0.040929 -1.543011 -1.204301 5.220430 
+-1.656766 -1.508251 5.891089 -1.507042 -1.619718 6.064789 
+-1.226708 -1.527950 5.661491 -0.800000 -0.938776 4.253061 
+-0.004243 -0.002329 0.021264 -0.000072 -0.001053 0.004179 
+-0.001868 0.003875 -0.002524 0.005891 0.013201 -0.003526 
+-0.002523 0.013108 -0.007050 0.005661 0.004766 0.005808 
+0.003523 0.008732 -0.007131 0.003305 -0.001129 -0.007197 
+0.001299 -0.001544 -0.004237 0.000364 0.001194 -0.001993 
+0.000400 0.004403 -0.004833 0.000866 0.000216 -0.006880 
+-0.003289 0.000712 -0.001844 -0.003262 -0.001933 -0.000816 
+-0.003788 -0.001301 0.002319 -0.001992 -0.000780 -0.001864 
+0.002260 -0.001112 -0.001119 0.006513 0.001807 -0.001176 
+0.007669 0.004959 -0.004129 0.002140 0.004602 -0.003020 
+-0.004113 0.000811 0.001657 -0.004990 -0.000050 0.005855 
+-0.004508 0.001852 0.002394 -0.003082 0.000951 -0.002892 
+0.001563 -0.000588 -0.002252 0.002853 0.001462 -0.004941 
+-0.001031 -0.000716 -0.003517 -0.000359 -0.005103 -0.001949 
+0.000043 -0.002660 -0.002768 -0.001415 0.001812 -0.003338 
+0.002060 0.006707 -0.004163 0.000456 0.004600 -0.000099 
+-0.001724 0.002107 -0.000072 -0.002163 -0.000039 0.001435 
+-0.001484 0.001553 -0.005597 -0.002748 -0.001472 -0.003304 
+-0.001592 0.001204 -0.003695 -0.000114 0.000063 -0.000180 
+0.003445 -0.000739 0.003671 0.006539 -0.000369 0.003684 
+-0.000609 0.002115 -0.006380 -0.008687 0.001603 -0.016942 
+-0.006197 0.007106 0.001079 0.360976 0.463415 4.165854 
+1.373860 0.419453 6.352583 1.905941 0.467822 6.967822 
+2.220630 0.544413 6.595989 2.273171 0.702439 4.941463 
+0.009767 0.009749 0.011924 -0.006880 0.008546 -0.019566 
+-0.003699 0.009397 -0.007236 0.012498 0.043208 0.030502 
+-0.001059 0.005294 0.012706 -0.019576 -0.012471 -0.045318 
+0.025703 0.005071 -0.004148 0.038233 -0.016650 0.023358 
+0.031377 -0.003035 0.074567 0.030618 -0.003984 -0.002686 
+0.000683 0.007060 -0.021114 0.009856 0.014880 -0.032765 
+0.012786 0.011991 -0.005693 -0.006358 0.007186 0.000933 
+0.002630 0.008549 0.000402 0.012675 0.013662 0.000272 
+0.010189 0.020122 -0.003415 0.001112 0.014721 -0.007138 
+-0.003011 -0.006883 0.003569 0.026573 0.037240 -0.047972 
+-0.017273 -0.055770 0.038342 -0.000748 0.013755 0.012746 
+-0.016757 0.001021 0.044060 -1.575758 -1.116162 6.247475 
+-1.570000 -1.490000 6.373333 -1.465116 -1.590116 5.625000 
+-1.231454 -1.320475 4.353116 -0.874150 -0.717687 3.054422 
+-0.005129 0.000138 0.019731 -0.001938 0.008124 0.005046 
+-0.001370 0.015545 -0.015167 0.002119 0.014320 -0.015163 
+-0.000527 0.009703 -0.007095 -0.001387 0.005866 -0.004537 
+0.003082 0.008878 -0.009520 0.013033 0.004344 -0.006111 
+0.001958 0.001411 -0.003667 -0.000327 -0.000164 0.000563 
+-0.000241 -0.002013 -0.003466 0.000554 0.001541 -0.006872 
+0.001893 -0.004650 -0.003445 0.002420 -0.000335 -0.000398 
+0.000120 0.000394 -0.000483 -0.001173 -0.001265 -0.002257 
+0.001991 -0.002401 -0.004157 0.004288 0.003773 -0.003699 
+0.003685 0.003157 -0.002836 -0.001175 0.001200 0.000073 
+0.000400 -0.001047 0.001501 -0.000059 -0.001777 0.002978 
+0.000331 -0.000325 -0.000266 0.001194 -0.000552 -0.004366 
+0.001902 0.003036 -0.007527 0.001448 0.003305 -0.009302 
+-0.002537 -0.002297 -0.004690 -0.001484 0.002452 -0.008856 
+0.001216 0.002236 -0.010081 0.001700 0.000998 -0.006911 
+0.000357 -0.000641 0.000819 0.000972 -0.004512 0.003325 
+0.001014 -0.002134 0.002081 -0.001111 0.001111 -0.001825 
+-0.001504 0.001504 -0.003985 -0.001901 0.001531 -0.003432 
+-0.002464 -0.000134 -0.004541 0.002204 0.006828 -0.004624 
+0.006568 0.008423 -0.004581 0.000470 0.008114 -0.002923 
+0.007593 0.000162 -0.016053 -0.006687 0.005362 -0.023394 
+-0.000455 0.007153 0.008705 1.160377 0.682390 4.245283 
+1.835616 0.385845 6.041096 2.273305 0.313559 6.851695 
+2.449872 0.452442 6.881748 2.216326 0.746939 5.910204 
+0.015594 0.006171 0.033302 0.001884 -0.001406 0.004403 
+-0.012741 -0.001538 -0.019735 -0.003742 0.029750 -0.064269 
+-0.024167 0.014090 -0.002168 -0.000754 0.016591 -0.011463 
+0.005694 -0.032918 -0.062041 0.028591 -0.010544 -0.008345 
+-0.006934 0.003116 0.004368 -0.011644 -0.023389 0.044362 
+-0.007171 0.003226 0.002854 -0.003268 0.014351 -0.015433 
+-0.003862 0.017240 -0.022025 -0.007885 0.015848 -0.018190 
+0.006616 0.010489 0.002182 0.026147 0.006791 -0.003592 
+0.020938 0.009342 -0.011062 0.006155 0.011601 -0.010278 
+0.000984 0.001042 0.002670 -0.001254 -0.005914 0.006071 
+-0.004432 -0.128000 -0.048749 0.056525 0.044910 -0.105693 
+-0.006573 0.016780 0.022177 -1.134969 -0.570552 5.846626 
+-1.185185 -1.233333 6.481482 -1.074928 -1.365994 5.616714 
+-0.848066 -1.162983 3.980663 -0.525084 -0.792642 2.240803 
+-0.000597 -0.002920 0.006174 0.002163 -0.000608 -0.006133 
+-0.001907 -0.001611 -0.005360 0.001400 -0.001574 -0.003887 
+0.000545 -0.002289 -0.007182 -0.003281 0.007645 -0.009778 
+0.008688 0.005089 0.000869 -0.001423 -0.000835 0.003921 
+-0.001121 -0.003329 0.003066 0.000256 -0.003509 -0.000385 
+0.000681 -0.000928 0.000507 -0.001001 0.001877 -0.001731 
+-0.000614 -0.000263 -0.004224 0.002503 0.003170 -0.001615 
+0.000719 0.003237 -0.002602 -0.001444 0.001398 -0.002493 
+-0.001654 -0.003937 0.000000 -0.002471 -0.000351 0.000957 
+-0.002518 -0.001006 0.001863 -0.000257 0.002229 0.002165 
+-0.001622 0.002743 -0.002490 -0.001208 0.003223 -0.004492 
+0.001181 0.003681 -0.001954 0.005251 0.000697 -0.006686 
+0.002263 0.000379 -0.011067 -0.000600 0.000720 -0.009921 
+-0.002513 -0.002927 -0.004139 0.001074 -0.003587 -0.002050 
+-0.002754 0.003040 -0.003505 -0.000396 0.004008 -0.001744 
+0.000890 -0.000127 -0.000214 -0.000277 -0.000107 -0.000879 
+-0.000369 -0.001236 -0.003459 -0.001376 0.001556 -0.003770 
+-0.002314 0.002178 -0.000545 -0.001512 -0.002688 -0.001568 
+-0.003713 -0.003394 -0.001574 0.000158 -0.000397 0.000203 
+0.001885 0.002257 0.000770 -0.002710 0.000842 -0.005597 
+-0.009592 0.001423 -0.020429 -0.004840 0.004854 -0.017836 
+0.004135 0.006687 0.008937 1.108761 0.465257 3.084592 
+1.586124 0.277512 4.779904 1.995413 0.309633 6.018349 
+2.175853 0.601050 6.522310 1.935484 0.888889 5.949821 
+1.142012 0.650888 4.147929 0.003255 -0.005401 0.011044 
+-0.010194 -0.001971 -0.027806 0.002445 0.002074 -0.041875 
+-0.047428 -0.011246 0.046691 -0.015238 0.006381 -0.027476 
+-0.028181 0.037367 -0.061823 -0.006851 0.020142 -0.063333 
+0.004571 -0.003571 0.010571 0.001618 -0.003009 0.005428 
+0.000304 -0.001558 0.002406 -0.002426 -0.000645 0.001705 
+-0.003913 -0.002261 -0.001665 -0.003811 0.002449 -0.003009 
+0.008104 0.010023 0.000652 0.014539 0.006760 -0.006064 
+0.006091 -0.001745 -0.002981 0.003485 -0.001334 0.000476 
+0.002613 0.006741 -0.009092 0.013899 -0.014845 -0.014074 
+-0.015909 -0.014864 0.055045 -0.002539 -0.020714 0.003724 
+0.006665 0.002615 -0.011299 -0.010110 0.005582 0.023736 
+-0.341232 -0.341232 4.450237 -0.261364 -0.719697 4.526515 
+-0.070866 -0.744094 3.354331 0.000208 -0.007128 0.011571 
+0.004066 -0.000500 -0.006392 0.001538 -0.003334 -0.011901 
+-0.004295 -0.008054 -0.006934 0.000297 -0.003946 -0.009642 
+-0.000198 0.006560 -0.009099 -0.001823 0.002036 0.003073 
+-0.000381 -0.001123 0.009353 0.000824 -0.004989 0.004865 
+0.001208 0.000753 -0.003189 -0.000525 0.003548 -0.004815 
+-0.001115 0.000230 -0.001943 0.000370 -0.000199 -0.000285 
+-0.000100 0.000915 -0.001779 0.002663 0.003356 -0.001861 
+0.004184 0.003116 -0.003886 0.004680 0.000803 -0.007217 
+0.002770 0.002198 -0.010024 -0.000780 -0.000626 -0.007029 
+-0.000072 -0.001528 -0.002416 -0.001566 -0.004781 0.000763 
+-0.000145 -0.005675 0.002157 -0.001845 -0.004997 -0.000359 
+0.001367 -0.001092 0.000295 0.003256 -0.000254 -0.003078 
+0.001963 -0.000410 -0.005616 0.001039 0.002078 -0.005349 
+0.000058 -0.000233 -0.002366 0.002766 0.001907 -0.000935 
+0.001072 0.002385 0.000670 0.000902 0.002165 -0.001083 
+-0.002101 0.002985 -0.000843 -0.002349 0.004421 -0.003269 
+0.002392 0.007935 -0.003265 0.001441 0.004844 -0.002001 
+-0.000513 0.000404 -0.001678 -0.001384 0.001042 -0.001708 
+-0.004245 -0.000050 -0.001153 -0.002273 0.002510 -0.000136 
+0.000163 0.002695 0.000106 0.001145 0.001231 -0.002838 
+0.000714 -0.003305 -0.003806 -0.005393 0.002458 -0.008745 
+0.000417 0.002094 -0.005789 0.003323 0.001766 0.008432 
+0.738710 0.045161 2.706452 0.972452 0.341598 4.308540 
+1.113960 0.638177 5.139601 1.070896 0.723881 4.832089 
+0.008339 0.003487 0.028440 -0.001054 -0.001243 -0.005277 
+0.006619 0.003296 -0.016599 -0.005033 -0.002924 0.001140 
+-0.012020 -0.005812 -0.004852 -0.002340 0.011337 -0.032087 
+0.014117 0.013699 -0.047912 0.007670 0.000226 -0.014480 
+-0.001550 0.000877 -0.005030 -0.005707 0.002446 -0.004915 
+-0.001363 -0.001363 -0.007269 0.002614 -0.003966 -0.006217 
+0.001217 -0.001279 0.003441 0.005181 0.001163 0.004749 
+-0.001806 -0.000915 0.001529 -0.000633 0.001853 -0.000309 
+-0.000196 0.000153 0.000073 0.000069 -0.001027 -0.007645 
+0.001605 0.008041 -0.005965 -0.000457 -0.045106 -0.022142 
+-0.006364 -0.016573 0.011049 0.035718 -0.032649 0.009605 
+0.014608 -0.003619 -0.017051 -0.000675 0.002177 0.003319 
+-0.001175 0.001277 0.011062 -0.001903 -0.001219 0.010276 
+-0.001205 -0.001719 0.007327 0.000443 -0.001098 0.002600 
+0.001992 -0.001493 -0.001447 -0.004761 -0.001262 -0.004373 
+-0.001012 0.004551 -0.008130 -0.000275 0.001836 -0.006377 
+-0.002552 0.003143 0.004064 -0.004293 0.001156 0.007015 
+0.001441 0.001096 0.002026 0.000105 0.003381 -0.003191 
+0.000004 0.002694 -0.001517 -0.002581 0.000258 0.002181 
+-0.003990 -0.000294 0.001956 0.000470 0.000470 -0.001966 
+0.001893 0.003786 -0.005446 0.005012 0.000121 -0.002174 
+0.001211 -0.001758 -0.001398 -0.001557 -0.001962 0.000114 
+-0.000396 0.000357 -0.002192 -0.000705 0.003448 -0.004014 
+-0.002397 0.003783 -0.003090 -0.000129 0.001094 0.000047 
+-0.001805 -0.001349 0.002808 -0.003871 -0.000174 0.003796 
+-0.000989 0.002367 0.005423 -0.000852 0.001732 0.002666 
+0.000081 0.002097 -0.002500 0.003957 0.002732 -0.003549 
+0.000204 -0.001449 0.003157 0.002726 -0.000106 0.000561 
+0.002092 0.002788 -0.000497 0.002031 0.004390 -0.002669 
+0.001410 0.003718 -0.005128 0.001429 0.002316 -0.003026 
+-0.000058 0.000078 -0.000304 -0.001202 0.001723 -0.001066 
+-0.002649 0.003528 -0.004999 -0.003917 0.002808 -0.007292 
+-0.005419 0.001678 -0.002028 -0.002774 0.001412 -0.000510 
+-0.000560 -0.001288 0.002950 0.002406 0.002699 0.000919 
+0.003192 0.002132 -0.001496 0.002738 -0.000833 -0.009524 
+-0.003123 0.004871 -0.024152 0.001829 0.003206 -0.018868 
+0.003713 0.001778 0.002165 0.002724 0.001339 0.015852 
+0.001334 0.003336 0.020269 0.001064 0.003895 0.015318 
+0.000881 -0.001819 -0.003402 -0.000973 -0.000412 -0.015746 
+-0.009865 -0.007426 0.003494 -0.015704 -0.010483 0.006537 
+-0.018603 -0.009136 0.007324 -0.013121 0.000483 0.008178 
+-0.005698 0.004184 0.000478 -0.000350 0.006768 -0.004832 
+0.000386 0.006990 -0.006536 0.001997 0.006865 -0.004725 
+-0.002136 0.008355 -0.004348 0.003299 0.005392 -0.008868 
+0.010036 0.002431 -0.007044 0.003435 0.001141 0.002236 
+-0.006769 -0.000391 0.013022 -0.012390 -0.011140 0.010901 
+-0.007370 -0.001848 0.001589 -0.002852 0.003625 0.000297 
+0.001169 0.003842 0.000002 0.004863 0.018223 -0.000866 
+0.001219 0.007207 0.000664 0.003240 -0.003269 -0.000750 
+0.002833 -0.001498 -0.000747 0.003272 -0.000018 -0.001507 
+0.003862 -0.000213 -0.004644 0.005462 0.002631 -0.007266 
+0.002361 0.003130 -0.007947 -0.005552 -0.003366 -0.005954 
+-0.004769 -0.008865 0.001769 -0.003034 -0.004419 0.004607 
+-0.002528 -0.000734 0.002435 -0.001930 0.000489 0.000723 
+-0.001740 0.002152 -0.000687 -0.003008 0.002048 -0.001166 
+-0.000270 0.003707 -0.001610 0.001901 0.002333 -0.005576 
+0.002864 0.003128 -0.003017 0.002963 0.000550 -0.002103 
+0.001236 -0.000885 -0.000497 -0.000032 -0.001600 -0.000055 
+-0.000513 -0.001294 -0.000348 0.002148 0.000352 0.000327 
+0.003036 0.001491 -0.002024 0.000944 0.002324 -0.002058 
+0.000463 0.001544 -0.002439 0.000683 0.001276 -0.003354 
+0.004187 0.001473 -0.004373 0.003376 0.001327 -0.004028 
+-0.000616 0.002007 -0.000811 -0.004293 0.000363 0.000146 
+-0.003203 -0.002520 0.000735 -0.002733 -0.004283 0.001861 
+-0.001572 -0.003567 0.003870 -0.002201 0.001637 0.003174 
+-0.001266 -0.003620 -0.001649 -0.001211 -0.002508 -0.002490 
+-0.001903 -0.001984 -0.001324 -0.001990 0.000296 -0.002000 
+-0.001393 0.002611 -0.002198 -0.001299 0.000457 -0.001404 
+-0.001086 -0.000253 -0.000581 -0.001687 -0.003551 -0.001598 
+-0.005599 -0.002917 -0.002682 0.000040 -0.003696 -0.003937 
+-0.002528 -0.005325 -0.002429 0.000759 -0.005970 -0.002714 
+0.003951 -0.003411 -0.001014 0.004228 0.000339 -0.000038 
+0.004826 0.003752 -0.001028 0.007149 0.005112 -0.005997 
+0.007336 0.006891 -0.012895 -0.003568 0.001732 -0.013716 
+-0.000476 -0.001606 -0.014976 -0.004038 -0.002587 -0.018616 
+-0.006297 -0.004936 -0.023821 -0.008505 -0.006715 -0.030959 
+-0.003634 0.000893 -0.025487 0.002047 0.006328 -0.007800 
+0.003273 0.005015 -0.002789 -0.000403 0.000483 -0.000319 
+-0.008682 -0.008230 0.001111 -0.013155 -0.008361 0.001644 
+-0.010939 -0.009456 0.013432 -0.005660 -0.001067 0.010756 
+-0.000991 -0.000094 0.008500 0.000295 -0.000924 0.007731 
+-0.000822 -0.000449 0.003827 -0.001348 0.001739 -0.004652 
+-0.001395 0.000959 -0.008633 -0.002206 -0.003810 -0.003709 
+0.004181 -0.004972 0.000113 0.004921 -0.001870 -0.001111 
+-0.000556 -0.001075 -0.002458 -0.008563 -0.000030 -0.004328 
+-0.007313 0.006909 -0.013638 0.002672 0.017318 -0.025996 
+0.009862 -0.023347 0.041050 -0.011164 -0.026108 0.022717 
+-0.001521 -0.007466 0.005592 -0.002162 0.000255 0.001438 
+-0.005426 -0.002195 0.000793 -0.009050 -0.003002 0.005718 
+-0.010108 0.000015 -0.000718 -0.005616 0.002904 -0.006472 
+0.001090 0.002357 -0.007079 0.000738 -0.001778 0.000222 
+-0.001740 -0.002248 0.006143 -0.001636 -0.001903 0.004256 
+-0.000024 0.001376 -0.002645 0.003099 0.001992 -0.006950 
+0.000263 0.001204 -0.002370 -0.005933 -0.003809 0.000622 
+-0.000708 -0.002655 0.001858 0.000763 0.000776 -0.000293 
+-0.001170 0.000835 0.000412 -0.003731 0.002593 -0.000213 
+-0.001847 0.002770 -0.001776 0.002306 0.002020 -0.004425 
+0.003950 -0.000494 -0.005925 0.001643 -0.001174 -0.003559 
+0.000000 0.000413 0.000413 0.000139 0.000111 0.002276 
+0.000574 -0.000629 0.001239 0.001376 -0.001772 -0.000588 
+0.001566 -0.001745 -0.002212 0.002560 0.000174 -0.002353 
+0.000510 0.001623 -0.001245 -0.000797 -0.001012 -0.000675 
+-0.000617 -0.002273 0.001213 -0.000394 -0.001544 0.000862 
+0.001738 0.000686 -0.003179 0.003811 0.002993 -0.001975 
+0.003412 0.003248 -0.000951 -0.000424 0.001655 -0.000046 
+-0.001915 -0.000853 -0.003437 0.000191 -0.000072 -0.004318 
+0.000831 0.003132 -0.001311 0.001081 0.003787 -0.000544 
+-0.000530 0.002317 0.000182 -0.001136 -0.000927 -0.002421 
+-0.002058 -0.002168 -0.003483 0.000044 -0.004645 -0.003534 
+0.000453 -0.002386 -0.007096 0.000715 -0.006201 -0.000176 
+0.000382 -0.004061 -0.000064 0.000782 0.000775 -0.001149 
+0.004539 0.001337 -0.002844 -0.000675 -0.000196 -0.004582 
+0.001225 0.001134 -0.003045 0.001445 0.003740 0.000305 
+-0.001138 0.005825 -0.001760 -0.007178 0.008038 -0.007284 
+-0.002890 0.014217 -0.011252 -0.002620 -0.000088 -0.002975 
+0.005568 0.002624 0.004245 0.001295 -0.000928 0.000086 
+-0.005364 -0.000531 0.005955 -0.004210 0.000978 -0.001388 
+0.003312 0.000530 -0.009404 0.001557 -0.004764 -0.002833 
+-0.002504 -0.002000 -0.001415 -0.012844 -0.001497 0.001175 
+-0.009631 -0.001598 0.003854 -0.006080 0.011840 -0.011227 
+-0.003763 0.006403 -0.015726 -0.001392 0.005323 -0.002679 
+0.002110 -0.001803 0.000220 0.003230 -0.000570 0.001562 
+-0.006828 0.002561 0.004615 -0.013183 0.004487 0.005974 
+-0.009195 0.004928 0.000967 0.004390 -0.005567 0.001124 
+0.005160 -0.007286 -0.003337 0.002592 -0.000379 -0.004221 
+-0.002712 0.000337 0.002428 -0.010667 -0.002484 0.004606 
+-0.010070 -0.004673 -0.002849 -0.005312 -0.007300 0.010965 
+-0.010368 0.001351 -0.001031 -0.003369 0.002150 -0.003563 
+0.000801 0.002436 -0.005641 0.002110 0.001677 -0.003982 
+0.000116 0.001045 -0.001008 -0.003900 -0.002875 -0.001894 
+-0.001575 -0.004084 -0.000795 0.000091 -0.001750 -0.001714 
+0.001242 -0.002222 -0.003464 0.004032 -0.000307 -0.005180 
+0.003446 -0.000422 -0.002177 -0.000917 -0.000476 0.000295 
+-0.003324 0.001125 0.000263 -0.002082 0.004048 -0.001085 
+0.000121 0.004570 -0.006446 0.001950 0.005266 -0.008045 
+0.001645 0.002894 -0.001239 -0.000614 -0.002204 0.000428 
+0.000345 -0.005029 0.003944 0.000081 -0.004756 0.004593 
+-0.001730 -0.001829 0.002471 -0.001723 0.000367 0.001012 
+-0.000325 -0.000218 0.000397 0.000363 -0.000110 -0.000764 
+0.001921 -0.000389 -0.000439 0.000497 -0.000355 -0.000763 
+-0.002792 -0.002500 -0.002792 -0.003810 -0.000576 -0.001181 
+0.000069 0.005102 -0.003947 -0.002304 0.003841 -0.004959 
+0.006460 0.008582 -0.008485 -0.002438 0.007440 -0.007803 
+-0.001983 0.000841 -0.008131 0.003165 -0.001885 -0.005655 
+0.000748 -0.000251 -0.002664 0.001414 0.001119 -0.000216 
+0.003797 -0.000515 0.002690 0.004308 -0.001053 0.001355 
+0.003042 0.000044 0.001294 0.003206 -0.000935 -0.000602 
+0.002050 0.006020 -0.000572 0.002515 0.002630 0.000075 
+0.001365 -0.000326 -0.000377 -0.000499 -0.001577 0.001081 
+0.000072 -0.000842 -0.002189 -0.003275 0.004381 -0.003426 
+-0.002121 0.002052 -0.000307 -0.000524 0.002867 0.000923 
+-0.001839 -0.000852 -0.001031 -0.005048 -0.001488 -0.001022 
+0.000381 0.005859 -0.009699 0.000979 0.005819 -0.012918 
+0.002266 0.004520 -0.006526 -0.000609 -0.000338 -0.000627 
+-0.003701 -0.012039 -0.011183 0.008196 0.007993 -0.019558 
+-0.000882 -0.015501 -0.007240 -0.002899 0.000730 -0.000125 
+-0.002203 0.004495 -0.009299 -0.003952 0.009532 -0.021269 
+-0.007822 0.013039 -0.023939 -0.004387 0.009948 -0.010294 
+0.004333 0.010307 -0.007486 0.004815 0.014550 -0.004868 
+0.005597 0.014775 -0.007671 -0.005760 0.001593 -0.004319 
+-0.012662 -0.006620 -0.002003 0.003864 0.001414 -0.005218 
+0.007709 0.031964 -0.027564 0.015981 0.035652 -0.030180 
+0.000459 0.022332 -0.020990 -0.002087 0.013431 -0.010830 
+-0.001719 0.008139 -0.001908 -0.007182 0.001519 0.001880 
+-0.007020 -0.004079 -0.000459 -0.003864 -0.008061 0.002494 
+-0.002002 -0.005052 -0.001916 -0.001991 -0.001971 -0.003985 
+0.000192 0.000138 -0.005732 0.001511 0.001769 -0.004585 
+0.001828 0.001690 -0.002702 -0.001925 0.000336 -0.002804 
+-0.000930 -0.002634 -0.003249 -0.000033 -0.002433 -0.006788 
+0.001316 -0.002313 -0.009580 -0.001400 0.002255 -0.008627 
+-0.004871 -0.002838 0.002672 -0.009650 -0.005855 0.001077 
+-0.003826 -0.002244 0.001573 0.003744 0.001975 -0.003626 
+0.007917 0.009610 -0.003485 -0.001631 -0.000019 -0.003309 
+-0.000254 0.000000 -0.005508 0.000064 -0.001417 -0.000096 
+-0.002239 -0.003902 0.001524 -0.001141 -0.002677 -0.001496 
+-0.001976 0.000407 -0.000629 -0.002605 -0.000163 0.001061 
+0.000631 -0.001690 0.000738 0.003433 -0.000687 0.000661 
+0.004481 -0.000219 -0.001038 0.003607 0.000000 -0.001639 
+0.002475 0.000410 -0.000213 0.001086 0.000189 -0.000035 
+0.002401 -0.004320 -0.010556 0.001513 -0.002779 0.000467 
+0.005532 -0.001153 -0.004896 0.001401 -0.002277 -0.003333 
+0.000083 -0.000951 -0.004714 -0.001630 -0.000963 -0.004222 
+0.002884 0.002509 -0.001580 -0.000142 -0.000176 0.000271 
+0.000961 -0.000186 0.003090 0.002509 -0.000035 0.002787 
+0.002967 0.001115 0.002530 0.000334 0.002220 0.002650 
+0.000403 -0.002405 0.001104 -0.001431 -0.003733 0.000203 
+0.001682 -0.002410 -0.000031 0.001990 0.001064 -0.002360 
+-0.002817 0.002289 -0.003933 -0.008020 -0.000876 -0.004965 
+-0.008680 -0.005500 -0.004340 -0.006812 -0.005714 -0.000399 
+-0.003689 -0.005404 0.001903 -0.000111 0.000616 -0.000536 
+0.002242 0.009377 -0.010269 0.000239 0.011864 -0.010654 
+0.000540 0.005627 -0.003571 0.003381 -0.000847 0.002517 
+-0.002813 0.004043 -0.005621 -0.009761 0.033633 -0.031746 
+-0.010270 0.003161 0.023733 -0.003047 -0.012354 0.039390 
+0.019355 -1.425806 4.348387 0.048485 -1.460606 4.042424 
+-0.003050 -0.004830 0.027090 -0.004193 -0.002854 0.008851 
+-0.002093 0.003650 -0.002914 -0.000126 0.008277 -0.012743 
+-0.000376 0.002044 -0.009356 -0.002252 0.001555 -0.003749 
+-0.005049 -0.000946 -0.003156 -0.009352 -0.005866 0.001273 
+-0.005349 -0.005919 0.007179 -0.003766 -0.003921 0.007116 
+-0.005950 0.003376 0.002436 -0.003029 0.006749 -0.005167 
+-0.000172 0.007031 -0.012029 0.003591 0.010451 -0.007511 
+-0.004540 0.005073 -0.002343 -0.003368 0.000389 -0.005522 
+-0.002776 -0.000096 0.001255 -0.001587 -0.001040 -0.000721 
+-0.000408 -0.000651 -0.000546 0.000589 -0.000527 -0.002184 
+0.001295 -0.000240 -0.001952 0.000985 0.000000 -0.000606 
+0.001224 0.000054 -0.001043 0.003116 -0.000880 -0.003866 
+0.003884 -0.000722 -0.006715 0.002580 0.001020 -0.003424 
+0.000086 -0.003190 0.001638 -0.002218 -0.002381 0.002631 
+0.000996 0.002603 -0.001478 0.001679 0.007991 -0.001229 
+-0.001757 0.007889 -0.001100 0.000404 0.004775 -0.003254 
+0.000812 0.000308 -0.003165 0.002196 -0.000044 -0.000829 
+0.000461 -0.002306 0.000184 -0.000757 -0.001637 -0.001134 
+-0.000426 -0.001370 -0.001270 0.006829 0.002302 -0.005481 
+0.000076 0.004868 -0.002865 0.001737 -0.001541 0.001064 
+-0.002709 -0.001724 -0.000493 -0.003473 -0.005721 -0.000281 
+-0.002545 -0.002655 0.000036 0.001050 0.002861 -0.002336 
+0.003785 -0.001672 -0.002087 0.005595 -0.000381 -0.005143 
+0.005270 0.000620 -0.007100 0.004926 0.003644 -0.008042 
+0.005428 0.002361 -0.003162 -0.000971 -0.000134 -0.001902 
+-0.000583 0.000851 -0.001006 -0.000259 0.000930 -0.001612 
+-0.000790 0.000658 -0.001721 0.000194 0.001174 0.000640 
+0.001060 0.001571 0.001858 0.000432 0.002932 -0.001071 
+-0.001743 0.004541 -0.003763 -0.001701 0.005850 -0.004768 
+0.001920 0.005371 -0.008506 0.001875 0.002700 -0.013671 
+-0.004235 0.006551 -0.008734 -0.004624 0.001935 -0.007419 
+-0.002846 0.003685 -0.002097 0.000527 0.003900 -0.001534 
+0.000667 0.000939 -0.004908 -0.002170 -0.002975 -0.006385 
+-0.001357 0.003643 -0.009142 0.001718 -0.000497 -0.001451 
+0.001999 0.001870 0.000087 0.000252 0.005547 -0.002651 
+-0.005099 0.009107 -0.022583 0.008060 0.048603 -0.055220 
+-0.006357 0.011614 0.022721 -0.321951 -1.317073 5.507317 
+-0.289125 -1.854111 6.397878 -0.274827 -2.004619 6.515011 
+-0.277070 -1.964968 6.076433 -0.003650 -0.013143 0.038747 
+0.002590 0.015149 -0.015916 0.003310 0.011562 -0.037406 
+-0.000305 -0.003283 0.002868 -0.000496 -0.003098 0.000570 
+-0.003051 0.004239 -0.000339 -0.001398 0.004080 -0.006041 
+-0.003758 0.000114 0.001176 -0.004709 0.000749 -0.001256 
+-0.001052 0.008141 -0.007589 0.003348 0.009737 -0.007985 
+0.005359 0.003427 -0.005056 -0.003299 -0.000046 -0.004491 
+-0.004020 0.003316 -0.004509 -0.004018 -0.000263 -0.002986 
+-0.006223 -0.002806 0.000486 -0.003335 0.005109 -0.002673 
+0.001912 0.003306 -0.004660 0.003164 0.003780 -0.004823 
+0.002277 0.001145 -0.003127 0.001849 -0.000027 0.000043 
+0.000076 0.000040 -0.000009 -0.000549 0.000099 0.000302 
+0.001699 -0.000006 -0.001998 -0.000236 0.000203 -0.002615 
+0.000060 -0.002931 -0.002454 -0.000502 -0.000375 -0.003627 
+0.000666 -0.000665 -0.003327 0.001072 -0.000656 -0.001764 
+0.001718 -0.000106 -0.000386 -0.000306 -0.001210 0.000613 
+-0.000274 -0.001702 0.000929 -0.002196 -0.003351 -0.001151 
+-0.000915 -0.005165 -0.002904 0.001209 -0.006701 0.000385 
+0.001616 -0.000707 -0.000707 0.001097 -0.001439 0.001241 
+-0.000344 0.001228 -0.003170 -0.001153 -0.001726 -0.002641 
+-0.004487 0.000254 -0.000903 -0.002027 0.001323 0.003019 
+-0.001082 -0.000507 0.003397 0.001631 0.000181 -0.000996 
+0.007207 0.001035 0.000296 0.000313 0.003448 -0.004825 
+-0.001432 0.002787 -0.004654 0.000326 0.004952 -0.006777 
+0.002568 0.000160 -0.007782 0.002010 0.001439 -0.005594 
+-0.000587 0.002337 -0.004405 -0.001781 0.002115 -0.003534 
+-0.000987 0.001413 0.000427 0.002375 0.002391 0.003243 
+0.000746 0.003399 0.004618 -0.001891 0.004260 -0.003860 
+0.003442 0.009879 -0.011788 0.007568 0.010653 -0.013876 
+0.007944 0.007275 -0.009576 0.000427 0.003248 -0.001436 
+0.000210 0.000746 -0.001487 0.000000 0.001735 -0.003469 
+-0.004072 0.006325 -0.004906 -0.003169 0.006809 -0.003371 
+-0.000748 -0.005093 0.002215 -0.003764 -0.011867 0.006730 
+-0.003545 -0.008525 0.003168 -0.001272 0.002052 -0.000287 
+-0.002639 0.008523 -0.008424 -0.002123 0.012137 -0.013049 
+-0.005278 0.020383 -0.022554 0.000603 0.027365 -0.023087 
+-0.005487 -0.001666 0.028678 -0.286996 -1.578475 6.390134 
+-0.381963 -2.055703 7.042440 -0.413146 -2.215962 6.920188 
+-0.378049 -2.082317 6.182927 -0.035294 -1.052941 3.947059 
+0.006344 0.018038 -0.017807 0.011048 0.017553 -0.029918 
+0.008361 0.004352 0.002199 0.006290 0.002127 -0.004461 
+0.010385 0.014492 -0.006048 -0.000445 0.016845 -0.011829 
+0.000373 0.004774 -0.007212 -0.004210 -0.003274 0.000230 
+-0.000833 0.000388 -0.003391 -0.005740 0.001789 -0.001118 
+-0.004452 -0.000404 -0.002498 -0.001958 -0.000894 -0.004292 
+-0.000550 0.002228 -0.002734 -0.005931 0.001492 -0.001420 
+-0.005890 -0.001217 -0.003002 -0.001334 -0.000655 -0.005851 
+-0.000431 -0.001262 -0.006398 0.000931 0.005634 -0.005302 
+0.000211 0.000091 -0.000833 0.000126 -0.000996 -0.000385 
+0.000891 -0.000357 -0.004218 0.006592 0.002966 -0.002521 
+0.004099 0.002813 -0.003332 0.001031 -0.000294 -0.001642 
+0.000458 -0.000924 -0.001836 -0.001993 0.001633 -0.005194 
+0.000661 0.000257 0.000040 0.003259 0.000914 -0.000680 
+0.001737 0.000483 -0.001485 -0.000824 0.000221 0.000762 
+-0.003437 -0.001135 0.000968 -0.002659 -0.001546 -0.001414 
+-0.003176 -0.003514 -0.002447 -0.005590 -0.000789 -0.001252 
+-0.005543 -0.000852 -0.002070 -0.004828 -0.000179 -0.000254 
+-0.002174 -0.002174 0.001217 -0.001143 0.000114 -0.000286 
+-0.000800 0.000472 0.000609 0.000007 0.000345 0.000384 
+0.000553 -0.004440 0.000232 0.002062 -0.002494 0.000912 
+-0.000117 -0.000931 -0.000434 -0.000585 -0.000789 -0.000693 
+-0.000504 0.002917 -0.000705 0.004197 0.004164 -0.003579 
+0.000395 0.001909 -0.003252 -0.000025 0.001780 -0.001982 
+-0.002467 0.001725 -0.005361 0.001293 -0.000477 -0.006533 
+0.002795 -0.001297 -0.002276 0.000311 -0.000987 -0.001271 
+-0.000326 0.000996 -0.006772 0.005381 0.002619 -0.008245 
+0.002712 -0.008589 -0.005063 -0.003250 -0.008995 -0.012270 
+0.000911 -0.002159 -0.009597 0.001923 -0.001471 -0.002997 
+-0.002513 -0.000184 0.001103 -0.002027 -0.004747 0.001088 
+-0.004617 -0.002516 0.004071 -0.003891 -0.000312 0.000911 
+-0.003802 0.000579 0.000088 -0.004623 0.000350 -0.000054 
+-0.004947 -0.000022 -0.000051 -0.005644 -0.001155 0.003030 
+-0.001717 -0.000700 0.004197 0.001210 0.006131 -0.011615 
+-0.021732 0.030033 -0.048998 -0.000152 0.033812 -0.025285 
+-0.005081 -0.002146 0.034401 -0.435780 -1.532110 6.376147 
+-0.470395 -2.000000 6.878290 -0.416129 -1.961290 6.196774 
+-0.291667 -1.400000 4.504167 -0.001528 -0.002757 0.018545 
+0.000301 0.001186 -0.002659 -0.000452 -0.003507 0.003141 
+-0.003264 -0.007046 0.010760 0.003051 0.003174 -0.002285 
+-0.003680 0.001796 -0.000464 -0.004937 -0.003775 -0.003807 
+-0.005780 -0.007297 0.010113 -0.005407 -0.005599 0.011734 
+-0.002405 -0.004380 0.008759 -0.004632 -0.005132 0.002316 
+-0.001000 0.000698 0.002835 -0.000269 0.001639 0.000581 
+0.000252 0.000575 -0.000463 0.000086 0.000467 -0.000164 
+-0.002385 0.000360 -0.002079 0.000042 0.000025 -0.004286 
+-0.000986 0.000938 -0.005727 -0.002813 -0.001412 0.002536 
+-0.007091 -0.006300 0.010243 -0.007802 -0.003872 0.010826 
+-0.001306 -0.002190 0.005265 0.001093 0.001448 -0.001002 
+0.001716 -0.000027 -0.002282 0.000505 0.000045 -0.001537 
+0.000576 -0.000258 -0.002689 0.000555 -0.000070 -0.006054 
+0.002464 0.003283 -0.006361 0.002604 0.002270 -0.004725 
+-0.000412 0.002493 -0.002049 -0.004255 0.002281 0.000298 
+-0.002571 -0.001098 0.001622 0.002277 0.002744 -0.000657 
+0.004959 0.005934 -0.005554 0.002823 0.001048 -0.007175 
+-0.001671 0.001244 -0.000585 -0.007423 -0.001937 0.006349 
+-0.005617 -0.006334 0.006633 -0.003797 -0.003710 0.003884 
+-0.003634 -0.002042 0.001592 -0.002463 -0.003982 0.004433 
+-0.002095 -0.004833 0.004888 0.001495 -0.003758 0.002584 
+-0.003621 -0.001595 -0.001595 -0.002602 -0.002971 -0.000669 
+0.000723 -0.001206 0.000737 0.003333 -0.001236 0.000927 
+0.000875 -0.002431 0.001751 -0.000094 0.000031 0.000501 
+-0.000963 0.003586 -0.004869 0.001273 0.004948 -0.001099 
+-0.002382 -0.000302 -0.000854 -0.002639 0.000165 -0.001467 
+-0.001526 0.003259 0.000388 0.000287 0.006091 0.001516 
+0.001254 0.005583 0.002581 0.003163 0.001146 0.000600 
+0.002332 -0.001011 -0.006630 -0.003724 0.001369 -0.006640 
+-0.002189 0.002187 -0.001731 0.001690 0.001408 -0.002441 
+0.003114 0.003252 -0.004464 0.001368 0.004680 -0.005574 
+0.000499 0.001000 -0.004509 -0.001131 -0.000548 0.000368 
+-0.003651 0.000195 0.000886 -0.003298 0.001213 0.001907 
+-0.000736 -0.002886 0.006337 -0.001475 -0.001830 0.001411 
+-0.000453 0.004496 -0.021854 -0.001257 0.005608 -0.035948 
+0.000698 0.004329 0.001392 -0.000533 0.000387 0.031890 
+0.264550 -1.047619 4.074074 0.083333 -0.850000 3.472222 
+-0.000279 -0.002479 0.016125 0.000114 0.002129 -0.008321 
+0.005672 0.005770 -0.019117 0.008488 -0.000400 -0.010169 
+0.004682 -0.000983 -0.002981 -0.000136 0.000411 -0.001464 
+0.000773 0.001471 -0.002393 0.000508 0.002138 -0.002316 
+0.003534 -0.004752 -0.001564 -0.005431 -0.007753 -0.009485 
+-0.008378 -0.008567 -0.000599 -0.008321 -0.008668 0.007280 
+-0.002900 -0.007249 0.005341 -0.000723 -0.001382 -0.003172 
+0.003766 -0.000030 -0.006854 0.003735 0.002022 -0.008138 
+-0.001880 0.002508 -0.005416 -0.003188 -0.001940 -0.000250 
+-0.000503 -0.005285 -0.002858 -0.001500 0.001498 -0.009851 
+0.003661 0.007015 -0.003688 0.000594 0.003616 -0.000986 
+-0.003806 -0.002368 0.003670 0.000069 -0.002671 0.007860 
+-0.000531 -0.001660 0.003327 0.001455 0.003142 -0.002834 
+0.001833 -0.001519 -0.001013 0.003845 -0.004525 -0.005498 
+0.005144 -0.004243 -0.008215 0.001185 -0.001612 -0.009124 
+0.001398 -0.001077 -0.001808 -0.001664 -0.002619 0.004852 
+-0.004524 -0.005056 0.001844 -0.001408 -0.003747 -0.000353 
+-0.002965 -0.003083 -0.001556 -0.003155 -0.000852 -0.001124 
+0.000156 0.001007 -0.006584 0.002087 -0.001519 -0.002201 
+-0.001065 -0.001123 -0.000861 -0.004801 -0.001133 0.001687 
+-0.006798 -0.003021 0.005664 -0.009183 -0.003187 0.005294 
+-0.003402 -0.007769 0.003275 -0.001753 -0.005806 0.001716 
+0.000151 0.002495 0.000697 0.003145 0.001670 -0.001388 
+0.000593 0.002629 -0.003286 -0.000683 0.001150 -0.003702 
+-0.000366 -0.000206 -0.002403 0.007449 0.004969 -0.004146 
+0.008428 0.005744 -0.009689 0.004918 0.008158 -0.005625 
+-0.000641 0.004386 -0.001201 -0.000020 0.001568 -0.000264 
+0.000723 0.003493 -0.000282 0.006082 0.005228 0.000581 
+0.001928 0.003675 0.000949 -0.003992 0.001150 -0.002323 
+-0.003092 0.001317 -0.005841 -0.002762 0.002105 -0.003702 
+0.001230 0.000060 -0.003234 0.004351 -0.000046 -0.003161 
+0.003343 -0.000029 -0.004572 -0.000136 0.002328 -0.000885 
+-0.001238 0.003101 -0.001506 0.001418 0.000598 -0.002153 
+0.000271 -0.000806 -0.001516 0.000271 -0.000639 -0.003786 
+0.001493 0.001180 -0.001653 0.002980 0.002521 -0.003878 
+0.001134 0.004054 -0.013177 -0.003186 0.002807 -0.017470 
+-0.003543 -0.000526 -0.013496 -0.003123 -0.000296 -0.002007 
+-0.002244 -0.001809 0.005752 -0.002405 -0.001915 0.008136 
+-0.000395 0.000024 0.000551 0.004709 0.010366 -0.014963 
+-0.002970 -0.002607 -0.019716 0.001835 0.001389 -0.014965 
+0.006046 -0.000095 -0.005347 0.010255 0.001479 -0.003758 
+0.012152 0.003955 -0.007423 0.004742 0.003877 -0.007154 
+-0.005053 0.000015 -0.001202 -0.005983 -0.003797 0.002889 
+0.002863 -0.003593 0.000874 0.006667 0.007223 -0.002500 
+0.003816 0.008035 0.000067 0.000356 -0.000478 0.000169 
+-0.000064 -0.002109 -0.004922 -0.000497 -0.004235 -0.004055 
+-0.002041 -0.004301 -0.002597 -0.002820 -0.004074 -0.002768 
+-0.004624 -0.006077 -0.002200 -0.008240 -0.004295 -0.004799 
+-0.001570 -0.004946 0.006758 -0.005572 -0.003870 0.000024 
+0.003331 -0.002844 0.002581 0.006442 0.003226 -0.006445 
+0.007368 0.005588 0.000140 0.002994 0.002121 0.001580 
+0.002937 -0.000064 -0.000321 0.004127 0.007402 -0.001708 
+0.004063 0.008054 -0.006050 0.001609 0.002488 -0.004776 
+0.000163 -0.001139 0.000904 -0.001482 -0.000902 0.000458 
+0.000173 0.001194 0.001165 -0.001688 0.002851 -0.001157 
+-0.003385 0.004861 -0.004803 0.004602 0.008706 -0.013433 
+0.001268 0.005339 -0.008857 -0.002036 0.001768 -0.000649 
+-0.008591 -0.002458 0.002472 -0.007753 -0.008292 0.002369 
+-0.004464 -0.005100 0.001064 0.000080 -0.000493 -0.000475 
+0.000755 -0.000120 0.000261 -0.001473 0.001787 -0.001134 
+0.000733 0.001721 0.001254 0.001114 0.002594 0.001219 
+-0.000279 0.000497 -0.000036 -0.002853 -0.001667 0.002260 
+-0.004329 -0.000404 0.001352 -0.003239 0.003691 -0.001076 
+-0.000703 0.006570 -0.000242 0.001224 0.005224 0.001248 
+0.001742 0.002163 0.002350 -0.000651 -0.000013 0.003045 
+-0.000792 0.000852 0.000831 0.000280 -0.000532 -0.000658 
+0.001666 -0.001509 -0.002021 -0.002130 -0.002130 -0.002130 
+-0.006949 -0.001177 0.001493 -0.003778 -0.001582 0.004656 
+-0.000347 0.001096 0.003561 -0.000315 0.000775 0.000034 
+0.000071 0.001876 -0.001054 -0.000393 0.003849 -0.002139 
+0.003261 0.006019 -0.003981 0.004187 0.000724 -0.005172 
+0.001681 0.000286 -0.001811 0.001095 0.000376 -0.001462 
+0.001360 0.000614 -0.002516 0.001543 -0.000114 -0.001857 
+0.001540 0.000216 -0.002516 0.000184 0.001441 -0.005975 
+-0.001018 0.002263 -0.008589 -0.001458 0.000784 -0.008842 
+0.001188 -0.000483 -0.009465 0.003833 -0.000352 -0.015784 
+0.005031 0.004393 -0.024295 0.006822 0.004818 -0.020830 
+0.005189 0.001156 -0.007793 0.003316 -0.001161 -0.000310 
+0.004077 0.000156 -0.003346 0.006022 0.003692 -0.008604 
+0.004174 0.005794 -0.009094 -0.001023 0.002412 -0.003509 
+-0.004212 -0.002012 0.001002 -0.002451 -0.001027 0.000149 
+0.002849 0.003599 -0.005589 0.008906 0.000364 -0.011412 
+0.002746 -0.005032 -0.005137 0.001841 -0.002653 -0.001499 
+0.001131 -0.000291 0.000470 -0.000209 0.000052 -0.000115 
+-0.000864 -0.001240 0.001565 -0.004287 -0.006688 -0.000092 
+-0.004853 -0.005853 -0.003708 -0.000054 -0.000447 -0.004306 
+0.000798 0.000298 -0.000578 0.002881 0.000966 -0.001659 
+0.004484 0.001792 -0.001670 -0.000112 0.000021 -0.001243 
+-0.002169 -0.002552 -0.000805 0.001400 -0.000209 -0.001055 
+0.002491 -0.000099 -0.007010 0.004000 0.001760 -0.009360 
+-0.002373 -0.000382 -0.004348 -0.001018 0.001229 -0.002862 
+-0.001734 -0.003005 -0.002847 -0.002791 -0.003549 -0.001625 
+-0.002714 -0.001985 -0.000917 -0.002396 -0.000186 -0.001019 
+-0.001989 0.000249 -0.000435 0.001309 -0.001003 0.000188 
+0.002602 -0.002713 -0.002060 0.003764 -0.002964 -0.002727 
+0.003709 0.000898 -0.005226 0.000948 -0.001760 -0.001180 
+-0.005768 -0.000920 -0.001168 -0.003214 -0.000330 0.001730 
+0.000772 -0.000797 0.000956 0.003769 0.000268 -0.000241 
+0.001962 -0.002412 -0.000851 0.001582 -0.000348 -0.000656 
+0.001349 -0.003808 -0.000048 0.003882 -0.001306 -0.000377 
+0.002862 0.000189 0.000394 0.001469 -0.002630 0.000688 
+0.000549 -0.000955 -0.000091 0.000474 0.002285 0.000981 
+0.004609 0.003188 0.001994 0.008735 0.006605 -0.004475 
+0.004970 0.002879 0.001544 -0.001223 0.001401 -0.000136 
+-0.001633 0.003487 -0.001526 0.001043 0.001349 0.001365 
+0.009292 -0.001772 0.000762 0.008798 0.010222 -0.003678 
+0.003759 0.007421 -0.001995 0.002440 0.008850 -0.005014 
+0.005996 0.005596 0.001171 0.006728 0.010603 -0.003729 
+0.003389 0.005716 -0.006323 -0.000410 0.001521 -0.002835 
+-0.000640 0.000339 0.000017 0.000868 0.000050 -0.000381 
+0.000927 0.001234 -0.000264 -0.001365 0.000235 -0.001189 
+-0.002163 0.000862 -0.000367 -0.000606 0.002197 0.002045 
+0.003680 0.003609 -0.003469 0.003666 0.002666 -0.002889 
+0.003957 0.001982 -0.001990 0.003464 0.000939 -0.002568 
+0.000375 0.000492 -0.002739 -0.001634 0.000664 -0.002444 
+-0.001249 0.000928 -0.003349 0.000811 0.001278 -0.005781 
+0.003195 -0.000406 -0.008206 0.007004 -0.000235 -0.006827 
+0.004449 0.001219 -0.004783 -0.001142 -0.000178 -0.000880 
+-0.004387 0.001121 0.000041 -0.002921 0.001009 -0.002790 
+0.000561 0.002362 -0.005106 0.003781 0.005321 -0.005273 
+0.006847 0.007638 -0.006565 0.000105 0.008727 -0.006376 
+0.001498 0.006318 -0.002987 -0.001615 0.001771 -0.000366 
+-0.003593 -0.003913 0.000761 -0.004718 -0.006865 -0.001557 
+-0.005996 -0.005880 -0.002400 -0.003697 -0.004043 -0.002202 
+-0.002614 -0.001013 -0.001251 -0.003199 0.000148 0.001572 
+0.000123 0.001504 0.000504 0.003104 0.001790 -0.001090 
+0.001262 -0.000328 -0.001853 0.000264 -0.000150 0.000103 
+-0.003178 -0.002889 -0.001161 -0.000819 -0.000718 -0.002422 
+0.002885 0.002550 -0.004420 0.004236 0.000718 -0.008222 
+0.007606 0.000308 -0.003597 0.006294 0.001592 -0.002159 
+0.003913 0.000136 -0.000626 0.001791 -0.002640 0.000094 
+-0.000993 -0.005577 0.002712 -0.003997 -0.005481 0.004225 
+-0.001641 -0.006641 0.001719 -0.003492 -0.000556 0.001111 
+-0.003898 -0.003090 -0.002352 -0.000902 -0.003132 -0.003476 
+-0.001036 0.000212 0.000660 -0.001053 -0.001288 0.003436 
+0.000598 -0.000421 0.000387 0.000123 0.000332 0.000135 
+-0.000692 0.000784 -0.000028 0.000910 0.006430 -0.003054 
+0.001389 0.003735 -0.001639 -0.001406 -0.001099 0.000420 
+-0.000447 -0.002742 -0.001440 0.001020 -0.003902 -0.000614 
+0.001594 -0.001659 0.000318 0.003064 -0.000020 0.000797 
+0.002673 0.000267 0.000173 0.001226 -0.001708 0.001533 
+0.000145 -0.000149 0.000036 -0.000888 0.001582 -0.000578 
+-0.001251 0.000765 -0.000457 0.000571 -0.000338 0.000877 
+0.001875 -0.000032 0.000639 0.000228 0.001429 -0.000917 
+-0.002600 0.002986 -0.003099 -0.001563 0.003595 -0.006017 
+0.002283 0.002879 -0.004467 0.002904 0.000037 -0.002477 
+0.002354 -0.001029 -0.001190 0.001219 -0.000274 -0.000473 
+-0.001471 -0.000956 0.000000 -0.002212 -0.001018 -0.002423 
+-0.000873 -0.001137 0.003641 -0.003511 -0.003984 0.000502 
+-0.000343 0.000017 -0.000643 -0.001944 0.000556 0.001111 
+-0.003677 -0.000906 -0.001075 -0.000397 -0.002134 0.000761 
+-0.000122 0.000020 0.000408 0.004160 -0.000333 -0.002832 
+0.004163 -0.000608 -0.003416 0.000009 0.000721 -0.002910 
+0.000402 0.000692 -0.000517 0.001556 0.001975 -0.001119 
+0.002033 0.001257 -0.001115 -0.001349 -0.000568 -0.000710 
+-0.003207 -0.001445 0.002009 -0.002726 -0.001490 0.001848 
+-0.001023 -0.000415 -0.000013 0.000255 0.000186 0.000000 
+0.000034 0.000086 0.000810 0.000017 -0.000698 0.000998 
+-0.000552 -0.000564 -0.000096 -0.001861 0.000142 -0.001330 
+-0.002256 -0.000631 -0.001742 -0.000277 0.000314 -0.000727 
+-0.000310 0.002336 -0.001520 0.001491 0.002664 -0.001069 
+-0.001848 -0.001687 -0.000457 -0.002200 -0.003825 0.000194 
+0.002578 -0.000255 -0.000144 0.004364 0.002711 -0.002102 
+0.003461 0.002370 -0.001046 0.002091 0.001498 0.001158 
+0.000270 0.001579 0.002985 -0.001073 0.002696 0.001049 
+-0.002961 0.002745 0.000114 -0.003613 0.002845 -0.000858 
+-0.002799 0.003784 -0.004151 -0.000437 -0.001021 -0.009196 
+0.003424 -0.002189 -0.003888 -0.000419 -0.002214 -0.001985 
+-0.003090 -0.000839 -0.001338 -0.003592 -0.002328 -0.001231 
+0.001111 -0.002603 -0.001948 0.003071 0.000286 -0.000143 
+0.000501 0.001755 -0.000627 -0.000870 0.003518 -0.002043 
+0.003233 -0.001298 -0.002591 0.000331 0.001156 -0.006519 
+-0.000954 0.001002 -0.002269 -0.000890 0.000817 -0.001609 
+-0.002721 0.002138 -0.000639 -0.002524 0.003078 -0.000412 
+0.000899 0.000971 -0.001813 -0.000962 0.001289 0.000799 
+-0.000318 0.002285 0.001903 -0.000035 -0.000066 -0.000138 
+0.001160 -0.001666 -0.001334 0.001314 -0.001353 -0.000406 
+0.002449 0.000155 0.000758 0.004504 0.000014 0.000803 
+0.004261 -0.000181 -0.001307 0.000660 -0.002362 0.001848 
+-0.003453 -0.000302 0.000231 -0.003900 0.005400 -0.002100 
+-0.001885 0.008354 -0.010694 0.000591 0.006048 -0.014002 
+-0.000518 0.000964 -0.007076 0.000062 -0.002056 0.000000 
+-0.000720 0.001680 0.001122 -0.003247 0.000791 -0.000041 
+0.000259 -0.000910 -0.004682 0.003128 0.002414 -0.004750 
+0.002630 -0.002198 -0.001488 0.000404 -0.004121 0.000626 
+-0.001407 -0.002193 0.001096 -0.000198 -0.001901 -0.002099 
+0.002548 0.000464 -0.002317 0.001562 -0.000642 0.000146 
+-0.000443 -0.001624 0.001919 -0.000965 -0.001390 0.000737 
+0.000585 0.001284 -0.000943 0.000615 0.004923 -0.001846 
+0.004410 0.001926 -0.002383 0.005573 0.000992 -0.001069 
+0.004793 0.000593 -0.001392 0.001692 -0.000937 -0.000134 
+-0.002499 -0.001153 -0.001691 -0.002409 -0.000551 -0.002510 
+0.000587 -0.000029 -0.002167 0.004550 0.000404 -0.003189 
+0.005200 0.002091 -0.004024 0.002184 0.002709 -0.003676 
+0.000903 0.000903 -0.002431 -0.001586 0.000966 -0.002897 
+0.001199 0.002773 -0.001347 0.000717 0.000997 -0.000937 
+-0.000658 -0.000807 0.000774 -0.001590 -0.001722 0.002022 
+-0.003080 0.000229 0.000140 -0.001314 0.002742 -0.001314 
+0.000894 0.000520 -0.001677 0.000949 0.000074 0.000016 
+0.001425 0.001191 -0.000084 0.001736 0.004036 -0.001566 
+0.001610 0.005313 -0.002333 0.000663 0.003452 -0.001421 
+-0.000372 -0.000921 0.000230 -0.001639 -0.004035 0.000203 
+-0.002500 -0.003137 0.000421 -0.001211 -0.001487 0.000582 
+0.000063 -0.000018 0.000009 0.001212 -0.001127 -0.001853 
+0.004631 -0.002609 -0.003335 0.007284 -0.002615 -0.003588 
+0.003739 -0.003038 -0.003222 -0.001873 -0.002693 -0.003041 
+-0.005632 -0.001468 -0.001533 0.000900 -0.000744 -0.002109 
+0.002971 0.001415 -0.005766 0.002039 -0.002511 -0.004668 
+0.000182 -0.003971 -0.000879 0.000137 -0.001046 -0.000021 
+0.000976 -0.002033 -0.000488 0.004029 -0.002226 0.000715 
+0.000928 -0.003033 0.002245 -0.000147 -0.000952 -0.000733 
+0.001000 0.003462 0.000000 -0.002339 0.004961 -0.001549 
+0.006796 0.002833 -0.000622 0.003186 -0.000244 -0.000203 
+0.000336 0.001171 0.000418 -0.000770 -0.001072 -0.000045 
+0.002194 -0.001450 -0.000277 0.003348 -0.002523 0.001134 
+0.000541 -0.000983 -0.000329 -0.002766 0.000859 -0.001373 
+-0.000196 0.000538 -0.002353 0.000623 -0.000347 0.000331 
+0.002340 0.000891 -0.001178 0.001979 0.002724 -0.004670 
+0.003326 0.002525 -0.010696 0.008891 -0.000054 -0.010346 
+0.004739 0.001681 -0.007228 0.001087 0.000092 -0.002372 
+0.000948 -0.000066 -0.002118 0.002905 -0.000315 -0.005443 
+0.006721 0.000198 -0.006951 0.005730 0.002830 -0.004441 
+0.000953 0.003609 -0.000596 -0.001975 -0.000123 0.001728 
+-0.004519 0.001908 -0.003181 -0.002367 -0.000497 -0.002674 
+0.002176 0.000594 0.000638 0.004627 -0.000021 -0.000009 
+0.001224 -0.002194 -0.000977 -0.001434 -0.001581 0.003088 
+-0.000519 0.000593 -0.003037 -0.001132 0.007208 -0.007269 
+-0.003288 0.004678 -0.006345 -0.004091 -0.003225 -0.002108 
+0.000113 -0.005181 0.000788 0.001275 -0.000842 -0.003403 
+-0.001741 0.004511 -0.002322 0.008178 0.006097 -0.005613 
+0.005657 0.002657 -0.003525 -0.001129 -0.000361 -0.000243 
+-0.002021 -0.003182 -0.001432 -0.002987 -0.001661 0.000009 
+-0.001865 0.000466 -0.000519 -0.001004 -0.000059 -0.000473 
+0.001381 0.001456 0.000650 -0.000332 0.001478 0.000928 
+-0.003897 -0.001113 0.000493 -0.004204 -0.002148 -0.000255 
+-0.003676 0.000147 -0.000814 -0.002125 0.001492 0.000740 
+-0.001169 0.001449 0.002086 -0.000929 0.000996 0.001179 
+-0.000752 0.001567 0.000058 -0.000930 0.000542 0.000701 
+0.000923 0.001007 0.001341 -0.002093 0.001800 0.000008 
+-0.004362 0.000137 -0.001434 -0.004931 -0.003982 -0.000864 
+-0.004717 -0.005322 -0.002118 -0.005339 -0.002322 -0.001452 
+-0.003594 -0.000997 -0.001542 -0.002593 -0.000637 -0.001915 
+-0.000925 -0.002054 -0.002716 0.002021 -0.002613 -0.002680 
+-0.004148 -0.001552 -0.001473 -0.012074 -0.002749 -0.000639 
+-0.008955 -0.003028 -0.000004 -0.001314 -0.000816 0.000331 
+0.000106 0.000392 0.000853 0.000371 0.000768 -0.000331 
+-0.000368 -0.000215 -0.001456 -0.000251 -0.000246 -0.000471 
+0.001927 0.001211 0.000892 0.001729 0.001617 -0.004661 
+-0.002183 0.002183 -0.002937 -0.000543 0.001116 -0.000482 
+-0.001482 0.000269 0.004113 0.000466 -0.002281 0.000999 
+-0.002136 0.000575 -0.000034 -0.003132 -0.001520 -0.000076 
+-0.001348 -0.000497 -0.000131 0.000411 0.002014 0.000385 
+0.000953 0.003596 0.001134 0.001098 0.002978 0.001552 
+0.004156 -0.000216 -0.005344 0.001297 -0.000037 0.002015 
+-0.001554 0.001841 0.001179 -0.002911 0.001939 0.001053 
+-0.000245 0.008225 -0.004123 -0.002761 0.009980 -0.012145 
+-0.004178 -0.001737 -0.007690 0.004310 -0.000279 -0.004504 
+0.002706 0.003161 -0.005044 0.000413 0.003739 -0.004130 
+-0.000985 0.002507 -0.001736 -0.001370 0.000541 -0.000078 
+-0.002348 0.002992 0.001705 -0.005162 0.000730 0.000151 
+-0.003157 -0.000103 -0.000233 -0.000684 -0.000015 0.000043 
+-0.000234 0.000007 0.000062 -0.000620 -0.000062 -0.000031 
+-0.000640 -0.000292 0.000046 0.001300 -0.000540 -0.000808 
+0.003118 -0.000235 -0.002206 0.002617 -0.000432 -0.001047 
+0.000035 -0.001003 -0.000597 0.000490 -0.000012 0.001094 
+-0.000247 0.000108 -0.000188 -0.001719 0.000699 -0.000253 
+-0.000848 0.000051 0.000203 0.000635 -0.001934 0.001674 
+0.002768 -0.005159 -0.001049 0.004117 -0.004264 -0.001647 
+0.000389 -0.002477 -0.001826 -0.003494 0.000476 -0.001811 
+-0.002624 0.002029 -0.004932 0.000076 -0.001921 -0.004995 
+0.002326 -0.002219 -0.001577 0.002595 0.001397 0.000411 
+0.002335 0.003002 0.001000 0.002374 0.001682 -0.002673 
+0.001029 0.002162 -0.002882 -0.000086 0.000601 -0.001715 
+-0.002063 0.000328 -0.001665 -0.000937 0.000703 -0.000078 
+0.003590 0.003121 -0.005759 0.003310 0.002451 -0.005101 
+0.000074 0.001846 -0.002356 -0.003743 0.000570 -0.000526 
+-0.001618 -0.002163 -0.000511 -0.000346 -0.002003 -0.000649 
+-0.001900 -0.001842 0.000511 -0.005450 -0.005220 -0.003414 
+-0.004858 -0.010977 -0.004720 -0.001271 -0.006949 -0.005084 
+-0.001648 -0.002702 -0.002796 -0.000972 -0.004499 -0.003741 
+0.002651 -0.007634 -0.003265 0.006061 0.017325 0.013480 
+0.070000 0.070402 0.056034 0.036584 0.028285 0.012029 
+-0.020160 -0.003424 0.015702 -0.009700 -0.004827 0.008488 
+0.001900 0.001228 -0.002419 0.000496 -0.000093 -0.005423 
+0.002161 -0.002541 -0.000869 0.001170 -0.001486 -0.005491 
+0.003820 0.003213 -0.008197 0.000753 0.004292 -0.009940 
+-0.001527 0.002443 -0.006565 -0.002922 0.001989 -0.002062 
+-0.002390 0.000441 -0.001185 -0.001764 -0.000925 0.000875 
+0.002645 -0.002969 -0.000867 0.002310 -0.003815 -0.001473 
+0.000740 -0.003080 0.000729 0.000450 0.000319 -0.000474 
+0.003476 0.000846 -0.001483 0.005842 0.000793 -0.000358 
+0.001627 -0.000400 -0.000185 0.000019 -0.001272 -0.000986 
+0.001723 -0.001562 -0.000786 0.002918 -0.001060 -0.002375 
+0.003484 0.001823 -0.004965 0.002077 0.006950 -0.007480 
+-0.003781 0.001694 0.000546 -0.003218 0.001647 0.004482 
+-0.000602 0.002829 -0.000328 0.001340 0.002061 -0.004083 
+0.002069 0.001012 -0.003816 -0.000472 0.000787 -0.003464 
+0.000749 -0.001071 0.000079 0.001369 -0.001111 0.002059 
+0.001059 -0.000181 0.001334 -0.000391 0.001483 0.000958 
+-0.000714 0.002300 0.001017 -0.000427 0.001068 -0.000597 
+-0.000258 -0.001137 -0.002532 -0.001546 -0.002242 -0.003696 
+-0.001413 -0.002948 -0.002687 -0.002500 -0.000749 -0.000281 
+-0.001955 0.001579 -0.001203 0.000308 0.002942 0.000386 
+0.005634 0.004708 -0.001158 0.005529 0.004233 -0.004176 
+0.003800 0.003183 -0.002042 -0.000358 0.000172 0.000062 
+-0.003712 0.000628 0.000785 -0.004659 0.000040 0.000718 
+-0.001999 -0.002155 -0.000822 0.001796 0.000256 -0.006541 
+0.000601 -0.003554 -0.006207 0.009344 -0.000902 -0.000902 
+0.010411 0.006364 -0.005059 0.003342 0.006990 -0.000122 
+0.003516 0.002188 0.000000 0.000946 0.000157 0.000111 
+0.000411 -0.000672 0.000399 0.000910 -0.001468 0.002055 
+-0.003184 -0.002562 0.002288 -0.001560 -0.005490 -0.000568 
+0.000828 -0.001944 -0.003453 -0.001309 0.003123 -0.006581 
+-0.002903 0.004181 -0.008697 -0.002411 0.002276 -0.007551 
+-0.002860 -0.002426 -0.006079 -0.001289 -0.002727 -0.004493 
+-0.001523 -0.003108 -0.001844 -0.003133 -0.003309 -0.002522 
+-0.003890 -0.004332 -0.003789 -0.004850 -0.003435 -0.005652 
+-0.006046 -0.000501 -0.005148 -0.000705 -0.004843 0.001625 
+0.002070 -0.020416 0.005175 -0.002271 -0.031794 0.002331 
+0.005982 0.016542 -0.001079 0.037692 -0.000715 0.000048 
+-0.082726 -0.084102 0.071029 -0.030712 -0.024844 0.025636 
+0.006074 0.001378 -0.007788 0.000452 -0.001252 -0.004365 
+-0.002184 -0.000030 -0.004987 -0.001266 0.001602 -0.005478 
+0.002540 -0.000352 -0.000643 0.002174 -0.000410 -0.000701 
+0.000523 -0.001125 0.000144 -0.001526 -0.003401 -0.001793 
+-0.004284 -0.005333 -0.000714 0.002898 -0.001911 -0.003321 
+0.000801 0.001222 0.000833 0.004014 0.004947 -0.002383 
+0.000219 0.001055 -0.001593 -0.001903 0.000697 -0.000224 
+-0.002584 -0.001416 -0.003466 0.002668 -0.001265 -0.004445 
+0.001099 -0.000725 -0.002243 0.001339 -0.003109 0.002537 
+-0.002846 0.002434 -0.000617 -0.001240 0.007952 -0.003917 
+0.004819 0.004909 -0.006279 0.008436 -0.003084 -0.011761 
+0.009675 -0.008708 -0.017561 0.009959 0.000477 -0.018097 
+0.001156 0.002834 -0.005628 -0.000693 0.001674 -0.000885 
+-0.000585 0.001538 -0.002429 -0.002004 0.002563 -0.004908 
+-0.000199 0.007533 -0.004547 -0.001992 0.004290 -0.002757 
+-0.001118 0.001383 -0.000585 0.001271 -0.000820 -0.000865 
+0.001750 -0.002084 -0.002527 0.000106 -0.002384 -0.003514 
+-0.000792 -0.002907 -0.001770 0.000512 -0.002587 -0.001068 
+-0.000461 -0.002808 -0.000584 -0.001991 -0.002996 -0.001001 
+-0.000667 -0.002016 -0.002082 0.001364 -0.002197 0.000076 
+-0.001433 0.000619 0.001662 -0.001431 0.000784 -0.000529 
+0.000226 0.004109 -0.001644 -0.000083 0.002615 -0.001188 
+-0.000534 0.000424 -0.000090 -0.001838 -0.000446 0.000389 
+-0.000056 -0.002148 0.000251 -0.000003 -0.000775 -0.000035 
+0.001067 0.000456 0.000510 -0.001382 0.000254 0.001859 
+-0.002261 0.002120 0.001839 -0.001771 0.003105 -0.001323 
+-0.001979 0.001887 -0.002347 -0.001323 0.000583 0.000427 
+-0.001529 0.001253 0.001603 -0.000918 -0.000529 0.000026 
+0.000160 -0.003052 -0.001821 -0.002504 -0.003411 -0.002833 
+-0.001975 -0.004712 -0.004807 -0.001178 -0.006922 -0.001269 
+-0.003136 -0.006483 0.003508 -0.001195 -0.004153 -0.000063 
+0.001054 -0.002216 0.002852 -0.001739 -0.002003 0.002938 
+-0.005317 -0.001186 0.003377 -0.003863 -0.001954 -0.000118 
+-0.002641 -0.001481 -0.000421 -0.004422 0.002210 -0.004698 
+-0.008143 0.000275 -0.004836 -0.010756 -0.005506 -0.004294 
+-0.008002 -0.002380 -0.006791 -0.017871 0.026728 -0.006271 
+-0.006924 -0.000058 -0.000666 -0.014196 -0.047143 -0.014464 
+0.029968 0.012500 -0.005994 0.069656 0.082067 -0.078187 
+0.013439 0.008863 -0.007570 0.001332 0.001504 0.000117 
+-0.002728 -0.001853 0.000863 -0.001532 -0.002451 -0.001445 
+0.001703 0.000473 -0.003524 0.002654 0.002928 -0.002945 
+0.000308 0.003037 0.000145 -0.002506 0.003160 -0.001221 
+-0.000911 0.005528 -0.002878 0.000222 0.002593 -0.007623 
+-0.005451 -0.003401 -0.000782 -0.002273 -0.002792 0.003581 
+-0.003666 -0.002182 0.006227 -0.004333 -0.001604 0.004810 
+-0.001174 -0.000744 0.001688 0.000185 0.000925 -0.000835 
+-0.000192 0.000343 -0.000028 0.000650 0.000140 0.001981 
+0.003317 -0.002349 -0.002622 0.007498 0.008224 -0.003978 
+0.007515 0.004018 -0.006064 0.006313 -0.005732 -0.003064 
+0.006936 -0.009065 -0.004817 0.001253 -0.002749 0.001878 
+-0.000601 0.000894 0.000193 -0.003186 0.001728 -0.002104 
+0.000012 0.001839 -0.001152 -0.000732 -0.001220 0.000000 
+0.000429 -0.001072 0.002677 0.001029 -0.001660 0.004824 
+-0.000226 -0.001932 0.005797 -0.001607 -0.000303 0.004032 
+-0.001152 0.000499 -0.000621 -0.001299 -0.000536 -0.003536 
+-0.001197 0.000198 -0.000554 -0.000683 -0.000208 0.000280 
+-0.003543 -0.000787 0.000394 -0.004009 0.001677 -0.000021 
+-0.002946 0.000228 -0.000394 0.002342 -0.000569 -0.002658 
+0.002654 0.000154 -0.002115 -0.002071 -0.000825 0.000441 
+-0.005162 -0.001782 0.001413 -0.006451 -0.004363 0.004069 
+-0.004408 0.001267 0.003194 -0.000467 0.000316 0.000539 
+0.000930 -0.001582 -0.002756 0.004557 -0.000393 0.000422 
+0.004547 0.000917 -0.005015 0.001221 -0.000916 -0.002748 
+-0.001492 0.000893 0.000133 -0.002290 -0.000310 -0.000305 
+-0.000272 -0.000439 -0.000349 -0.000041 0.000150 0.000155 
+-0.000617 -0.001580 0.000691 -0.000451 -0.000148 -0.000798 
+-0.002455 0.000356 0.000394 0.001157 -0.003106 -0.000059 
+-0.000958 -0.002104 -0.000728 -0.000660 -0.000963 -0.000968 
+-0.002529 -0.005972 0.001365 -0.008996 -0.011738 0.006640 
+-0.000714 -0.006157 -0.000242 0.000470 0.001011 -0.001058 
+0.002229 0.001449 -0.000859 -0.000442 0.000038 0.000209 
+-0.003139 0.000712 -0.000249 -0.005244 0.001152 -0.003204 
+-0.006609 0.000577 -0.004213 -0.008554 0.003831 -0.007621 
+-0.010895 0.008607 -0.016112 -0.024929 0.015109 -0.025452 
+0.031231 0.119231 0.033975 0.019919 0.107859 0.039573 
+-0.008061 0.045408 0.010612 0.016049 0.000123 -0.006543 
+-0.011351 -0.025666 -0.013067 -0.003419 -0.004196 0.000172 
+0.000268 -0.001803 -0.002134 0.001141 -0.000863 -0.003844 
+-0.000063 -0.003107 -0.002164 0.002733 -0.004397 0.001932 
+0.002281 -0.003590 0.000628 0.000286 -0.002240 0.000265 
+-0.000003 0.000339 -0.000113 0.003542 0.000698 -0.000335 
+-0.001264 -0.005276 0.000107 -0.002141 0.000850 0.003530 
+-0.003884 0.003427 0.003682 -0.001379 0.001375 -0.002442 
+-0.001113 0.003437 0.000564 0.000082 -0.000140 -0.000042 
+0.000450 -0.001060 -0.000731 -0.004542 0.001940 -0.001593 
+-0.011554 0.009769 -0.011965 0.007598 0.013990 -0.005359 
+0.016189 0.011866 -0.013691 0.022093 0.009599 0.002182 
+0.001114 0.006029 -0.021781 -0.000938 0.006480 -0.010085 
+-0.000466 0.006264 -0.006886 -0.001998 0.003330 -0.006571 
+-0.000225 0.006352 -0.009555 0.008724 0.001135 -0.000598 
+0.001717 0.000560 0.001188 0.001424 -0.001516 0.000630 
+-0.000412 -0.002120 -0.001129 -0.001094 -0.001791 0.002406 
+-0.000255 -0.000158 0.000910 -0.000040 -0.002341 -0.001251 
+0.004733 -0.003283 -0.003366 0.004675 -0.001485 -0.003228 
+0.001458 0.000162 0.000150 -0.001115 0.001346 -0.000077 
+-0.000008 0.001279 0.001782 0.002028 0.003613 0.001395 
+0.002033 0.003214 0.001303 0.002091 0.002219 0.000260 
+0.003560 0.000183 -0.000928 0.003140 -0.001102 -0.000017 
+-0.002618 -0.001023 -0.003081 -0.003743 0.000594 -0.005906 
+0.005177 0.003133 -0.003088 0.001001 0.001753 -0.002181 
+-0.000335 0.001239 -0.000476 -0.002396 0.001823 -0.003307 
+-0.002664 0.000888 -0.004480 -0.001152 0.001338 -0.002740 
+-0.000095 -0.000728 -0.000864 -0.000485 -0.001147 0.000331 
+-0.001938 -0.001564 -0.002045 -0.003259 -0.000162 -0.002249 
+-0.003154 0.000692 -0.000077 -0.002602 0.000052 -0.000271 
+-0.000307 -0.000545 0.000102 0.000778 0.001184 0.000829 
+0.001173 0.002683 0.000950 -0.001656 -0.003095 0.002171 
+-0.001335 -0.010944 -0.002496 -0.002769 -0.003975 -0.003654 
+0.001797 0.003783 -0.004762 -0.000389 0.001112 0.000611 
+-0.001086 -0.002823 -0.001144 0.001086 -0.005341 -0.001501 
+-0.002731 -0.007433 -0.003227 -0.010814 -0.004768 -0.006213 
+-0.011331 0.005895 -0.010780 -0.006270 0.040422 -0.012249 
+0.055803 -0.015446 0.031549 0.121217 -0.075979 -0.006561 
+0.000000 0.054545 0.036364 -0.016901 0.018423 0.041718 
+-0.032373 0.023141 0.013651 0.029757 0.016318 -0.013691 
+0.010260 0.006194 -0.005462 0.004736 0.003404 -0.005350 
+0.000626 -0.000776 -0.003709 0.001073 -0.005787 -0.002206 
+0.002106 -0.003523 -0.001235 0.001018 0.000523 0.000303 
+-0.001187 0.003895 0.000217 -0.004460 0.001930 -0.001953 
+-0.000580 0.020565 -0.005962 -0.000037 0.009206 -0.001206 
+0.002084 0.005212 0.000914 -0.004414 0.002195 -0.002522 
+-0.002552 0.002289 -0.004550 -0.000165 0.000370 -0.001706 
+0.000836 -0.001679 0.001560 -0.003845 -0.000570 -0.000655 
+-0.004496 0.000554 0.001516 -0.000253 0.004183 -0.000073 
+0.005011 0.000777 -0.001691 0.000455 -0.005619 -0.012592 
+0.001871 -0.001683 -0.005394 -0.000105 -0.000776 0.002219 
+0.000232 -0.000761 0.002305 0.000622 -0.000139 -0.000258 
+0.003549 0.000467 -0.002522 0.001777 0.000113 0.000128 
+-0.000965 -0.001046 -0.001096 -0.000741 -0.001244 -0.001215 
+-0.001425 -0.000788 -0.001989 -0.000994 -0.000709 -0.001667 
+0.001309 0.004639 -0.000391 0.003203 0.000615 -0.001128 
+0.000775 -0.001349 0.001798 0.001172 0.000703 0.001875 
+0.000641 -0.000078 0.001587 0.001972 -0.001098 0.000631 
+0.006608 0.001180 0.001651 0.001396 0.003071 0.001256 
+0.000265 0.000382 -0.000118 0.000421 -0.000236 -0.000234 
+-0.000217 -0.000310 0.000109 -0.001696 -0.000637 0.000381 
+-0.001057 0.000684 -0.000238 0.001351 0.002726 -0.001032 
+0.004312 0.002052 -0.006261 -0.001612 -0.000263 -0.002146 
+0.000019 -0.001119 0.000005 -0.003044 -0.003081 -0.001029 
+-0.004872 -0.000450 0.000525 -0.002514 0.000006 0.002486 
+0.000501 0.001571 0.001676 0.000701 0.000144 0.000029 
+-0.000799 0.000914 -0.002551 -0.000300 0.002312 -0.005030 
+-0.003333 0.001591 -0.003333 -0.000023 0.000068 -0.003835 
+-0.000915 -0.000724 0.000232 0.000069 0.000115 0.001797 
+0.002200 0.003707 -0.000546 0.004074 0.002776 -0.003045 
+-0.001253 -0.001642 -0.001741 0.000300 -0.002664 -0.001044 
+0.001611 -0.000503 -0.000723 0.002690 0.006448 -0.002644 
+0.000462 0.000883 0.000480 -0.001207 -0.004220 -0.001882 
+0.000693 -0.006011 -0.001405 0.009467 -0.004105 0.000580 
+0.008856 -0.003013 0.002405 -0.003431 0.006190 -0.002059 
+0.011119 0.026626 0.001652 0.080429 0.015857 -0.051429 
+0.060000 0.061429 -0.060714 0.006444 0.035111 -0.041556 
+0.015366 0.000598 0.024648 0.017672 0.026250 -0.007069 
+0.011565 0.014897 -0.001977 0.007848 0.008525 -0.005202 
+0.004865 0.005240 -0.003991 0.002935 0.002624 0.000117 
+0.000432 0.001317 0.005011 0.000919 0.000992 0.001531 
+-0.004201 -0.003347 0.000492 -0.005276 -0.005277 -0.001439 
+-0.002575 0.007458 -0.003024 -0.000832 0.009657 -0.001790 
+-0.004553 0.000475 0.001111 -0.004366 0.004373 -0.004466 
+-0.000325 0.001127 -0.003500 0.001374 -0.000474 -0.000877 
+0.000973 0.001573 0.001021 -0.000774 0.003436 -0.001494 
+-0.002969 -0.002448 0.000152 0.000287 -0.006769 -0.001309 
+0.005383 -0.008861 -0.005565 0.003890 -0.001804 -0.011319 
+0.000464 -0.001050 0.000145 0.000058 -0.000599 0.003821 
+-0.000991 0.000996 0.000670 -0.000053 0.000966 -0.001290 
+0.000160 0.002160 -0.002320 -0.002528 -0.001120 -0.001805 
+-0.000424 -0.002994 -0.001108 0.000517 -0.003969 0.000775 
+0.002056 -0.003383 0.000697 0.000800 -0.002365 -0.000430 
+-0.000519 -0.000930 -0.000060 0.001240 -0.000310 -0.000543 
+0.000826 -0.001753 -0.004483 0.001250 0.002043 -0.008691 
+0.001534 0.004091 -0.008083 0.001310 0.000561 -0.006752 
+-0.004529 0.000401 -0.002594 -0.004265 0.002608 -0.002402 
+-0.002149 0.001031 -0.003250 -0.000479 -0.000081 -0.003991 
+0.001216 0.000658 -0.001435 -0.001854 -0.000174 -0.002086 
+-0.001590 0.001479 -0.001072 -0.001367 0.003964 -0.001504 
+0.001216 -0.000608 -0.003600 0.003079 0.001141 -0.004608 
+0.003282 -0.001616 -0.001808 0.001994 -0.003457 -0.000411 
+0.002074 -0.001536 0.001229 0.000762 0.001103 -0.001705 
+-0.000642 -0.001106 -0.002817 0.001337 -0.001465 -0.004078 
+0.001533 -0.000082 -0.002594 0.001381 0.000921 0.000079 
+0.000714 -0.000385 -0.000535 0.001475 0.000069 -0.000532 
+0.000248 0.001234 -0.000082 -0.000013 -0.000217 0.000134 
+-0.001711 -0.004527 0.003957 -0.007333 -0.009219 0.006074 
+-0.008846 -0.005955 -0.006218 -0.002347 -0.004005 -0.005275 
+0.000063 0.002645 -0.001131 0.002786 0.004261 0.000873 
+0.003023 0.005788 0.001681 -0.002303 0.001341 -0.001185 
+-0.007672 -0.003984 -0.001334 -0.007714 -0.002680 -0.001691 
+0.000581 0.002510 0.001202 -0.004705 0.008686 -0.000883 
+0.027296 0.017451 0.018906 0.033951 0.030494 0.006914 
+-0.019651 -0.016290 -0.005269 -0.044610 -0.024805 0.084221 
+-0.016179 -0.007912 0.022863 -0.024566 -0.019944 -0.010756 
+0.005740 -0.011498 -0.010851 0.018197 0.021612 -0.004707 
+0.005452 0.004169 -0.002910 0.002407 0.002219 0.000283 
+0.001078 0.001422 0.002061 -0.001009 0.000594 0.000773 
+-0.000926 -0.004112 -0.001778 -0.000003 0.000167 0.000975 
+-0.001543 0.007309 -0.002194 0.000783 0.007010 0.000596 
+-0.002254 0.002704 0.001696 -0.003098 0.003284 -0.000302 
+-0.004226 0.002758 0.004195 -0.015214 -0.007332 0.011492 
+-0.002897 -0.011731 0.007262 -0.000931 -0.007113 0.003900 
+0.003652 -0.006294 -0.000229 0.004439 -0.004259 -0.004207 
+0.006570 -0.001939 -0.003749 0.001214 -0.003702 0.000072 
+0.000485 -0.003538 0.001284 0.000699 -0.002630 -0.000489 
+0.001208 -0.001870 -0.001800 0.000787 -0.001435 -0.001332 
+-0.001019 -0.000894 0.000455 0.001274 0.000360 0.001879 
+0.000472 -0.001084 0.000991 -0.001541 -0.000593 -0.000030 
+-0.002020 0.000930 -0.001244 -0.002333 0.002734 -0.001427 
+-0.001913 0.003092 -0.000303 -0.000048 -0.000395 -0.000936 
+0.000645 -0.000307 0.000291 -0.000483 -0.001602 -0.000551 
+-0.000091 -0.000681 -0.001516 0.003834 0.002156 -0.006068 
+0.005753 0.000479 -0.002880 0.003574 0.001123 0.003438 
+0.000964 -0.000429 0.005197 -0.002611 -0.002024 0.000484 
+-0.002551 -0.000037 -0.000170 -0.002241 0.001289 0.000327 
+-0.000538 0.001562 0.000262 -0.000340 -0.002234 0.001467 
+0.000801 -0.003260 0.001844 0.000752 -0.002519 -0.000501 
+0.002519 0.000000 -0.002222 0.004313 0.005004 -0.002848 
+0.003418 0.003869 0.000854 0.001961 0.001340 -0.001303 
+-0.000367 -0.000310 0.002356 -0.000196 0.001756 0.000780 
+-0.000430 0.001075 0.001505 -0.001629 0.001663 -0.003237 
+-0.003780 0.000231 -0.003141 -0.002338 0.001405 -0.003271 
+-0.001638 0.001204 -0.001276 0.000471 0.001603 -0.000842 
+-0.000488 0.000160 -0.001422 -0.001818 -0.003358 -0.002272 
+-0.002018 -0.006650 -0.001014 -0.002806 -0.005981 -0.000246 
+-0.002705 -0.003984 -0.000782 0.000147 -0.001990 -0.000344 
+0.002894 0.003029 -0.000368 0.004085 0.004233 0.001561 
+0.002956 -0.000772 0.001857 -0.000618 -0.014498 0.000118 
+-0.008505 -0.027327 -0.007185 0.041073 -0.016769 -0.002584 
+0.100779 0.022079 0.003775 0.107676 -0.029162 0.018619 
+0.089599 0.004353 0.006416 0.083333 0.064410 -0.008051 
+0.028383 0.006264 -0.002679 -0.042739 0.011570 0.034584 
+0.010444 0.021262 0.019556 0.015367 0.027233 0.007667 
+-0.001446 0.000446 0.003184 -0.000747 0.000185 0.001552 
+0.000292 0.000134 -0.000246 -0.003971 -0.000749 0.000395 
+0.001281 -0.001818 0.000207 0.000042 -0.003079 -0.001914 
+0.004938 0.001231 -0.001646 0.003483 0.004083 -0.002987 
+0.002803 0.002949 -0.004720 0.002110 0.001176 -0.002099 
+-0.002506 -0.000780 -0.001094 -0.001629 -0.003038 -0.000967 
+-0.000288 0.001039 -0.001372 0.001891 0.002757 -0.007683 
+0.004856 0.006120 -0.009665 0.008236 0.006887 -0.008900 
+0.000766 0.005065 -0.014017 0.004651 0.007346 -0.009112 
+-0.002796 0.006593 -0.002385 0.001530 0.006196 -0.000381 
+0.000302 0.003109 -0.000540 -0.001284 0.001800 -0.002420 
+-0.000192 0.003391 -0.001281 0.018473 -0.006559 0.009333 
+-0.009757 -0.081432 0.029324 -0.011337 0.002432 -0.003221 
+-0.000657 0.016010 -0.061414 0.031963 -0.010133 0.008382 
+-0.010662 0.005446 -0.010615 0.005188 0.065865 -0.064135 
+-0.045214 0.042479 -0.053419 -0.045856 0.011417 -0.025829 
+-0.006944 -0.041111 -0.048056 0.009318 -0.043182 -0.011288 
+-0.013232 -0.030707 -0.028586 -0.006000 0.016000 -0.020000 
+-0.030000 0.008889 0.000000 -0.003828 -0.000414 0.005379 
+-0.005804 -0.008881 0.058741 -0.029286 0.000000 0.042857 
+-0.035444 0.006331 0.045148 -0.035333 -0.047333 0.023333 
+-0.039000 0.013000 0.033333 -0.035152 -0.027212 0.121333 
+0.005963 -0.017816 0.002566 -0.001505 -0.029565 -0.001003 
+-0.002252 -0.021666 0.018353 0.003786 -0.008045 -0.023529 
+0.036837 -0.087614 -0.003967 0.041289 0.019644 0.040889 
+0.023333 0.122667 0.084667 -0.056609 0.057556 0.016850 
+0.023939 -0.002992 0.002992 0.018194 -0.011806 0.012778 
+0.027500 -0.034000 0.027500 -0.033279 -0.021504 0.008149 
+-0.124522 0.036098 -0.062868 0.011927 0.003963 -0.027839 
+0.014843 0.020620 -0.018207 0.047660 0.061194 -0.046838 
+-0.040613 0.041058 0.054497 -0.034936 -0.043325 0.060261 
+-0.008754 -0.014340 0.000428 -0.002079 -0.005809 -0.000928 
+-0.002767 -0.007941 -0.001094 -0.000033 -0.003139 -0.003969 
+0.001465 -0.001925 0.000468 0.007614 -0.006390 0.008118 
+0.002719 -0.012580 0.003803 0.006335 0.007395 -0.015591 
+0.006141 -0.004618 -0.002212 0.003129 -0.004219 -0.002814 
+0.007422 -0.012890 -0.000003 -0.002005 0.005149 0.008591 
+0.031383 0.020853 0.006744 0.022146 0.064004 -0.016513 
+-0.036955 0.037790 -0.034710 -0.015678 0.027869 -0.038569 
+0.037032 0.046948 -0.024722 0.007425 0.027166 -0.015768 
+-0.008186 -0.012213 0.007717 -0.016975 -0.038646 0.031197 
+-0.002627 -0.003638 0.000856 -0.005547 -0.002370 0.001076 
+-0.003822 0.002647 -0.000538 -0.002785 0.001108 0.000128 
+-0.000372 -0.000707 -0.001251 -0.000591 -0.003454 -0.000140 
+-0.001306 0.000424 -0.001481 0.002850 0.002895 -0.006093 
+0.002150 0.008927 -0.009085 0.009531 0.011555 -0.013202 
+0.007252 0.007908 -0.015319 -0.000413 0.004019 -0.002972 
+0.000220 0.000588 -0.001749 0.000597 0.002775 -0.002684 
+-0.000301 0.001498 -0.001065 0.000767 -0.001438 0.001338 
+0.000871 0.005018 0.000547 -0.012114 -0.010205 -0.029205 
+0.006919 -0.015567 -0.005556 0.020556 0.021928 -0.012680 
+-0.000793 0.003403 -0.000536 0.056694 -0.025959 0.005918 
+-0.001291 -0.050646 0.006653 -0.021788 -0.050726 0.065228 
+-0.015762 -0.000476 0.006048 -0.036484 -0.030110 0.007912 
+0.003605 0.047712 0.036614 0.033072 -0.002941 0.029150 
+0.075000 -0.025000 -0.041250 -0.007778 -0.043194 -0.039306 
+-0.055455 -0.051212 0.001414 -0.078889 -0.078889 0.043333 
+0.034367 -0.001480 0.044724 0.048075 -0.013736 0.008000 
+0.003333 -0.001046 0.004183 -0.107200 0.118000 -0.053600 
+-0.072231 -0.043000 -0.048154 -0.079853 -0.089485 0.016985 
+-0.008059 -0.056846 0.001927 -0.034120 -0.061812 0.026595 
+-0.021056 -0.018783 0.063319 -0.020861 -0.075167 -0.037225 
+-0.039343 -0.114951 0.028481 0.003080 -0.059909 0.015362 
+-0.015490 -0.060490 -0.007598 -0.045071 -0.094303 0.011961 
+0.065778 -0.032889 0.038889 0.098514 -0.029493 0.020942 
+0.020330 -0.020989 0.022967 -0.065063 -0.034253 0.031089 
+-0.032356 -0.047778 0.019956 0.009340 -0.032228 -0.009401 
+0.016295 -0.004249 -0.019543 0.006227 0.017927 -0.010918 
+-0.000950 -0.000815 -0.000121 -0.019986 0.010274 -0.005700 
+0.010551 0.010668 -0.005694 0.000020 -0.012090 -0.004425 
+0.003364 -0.000365 -0.002851 0.001567 -0.001907 -0.002188 
+0.001661 -0.001694 0.000599 0.011129 -0.003419 0.004878 
+-0.004298 -0.003198 0.005837 0.001647 -0.000673 0.003578 
+0.003445 0.000514 -0.005989 0.006920 -0.007203 0.008008 
+-0.018000 -0.045083 0.037964 0.001873 0.000328 0.008698 
+0.002088 -0.002150 0.004615 0.005203 0.005072 -0.003074 
+-0.010271 0.003071 -0.011543 0.012069 -0.009009 0.010189 
+0.005556 -0.004111 0.001889 0.000158 0.012687 -0.006795 
+-0.013637 -0.015957 0.009768 -0.029392 -0.031569 0.032554 
+-0.003305 -0.001380 0.003583 -0.005196 -0.000866 0.000219 
+-0.003435 -0.000609 0.001007 -0.001832 0.002536 0.001062 
+0.001066 0.001200 -0.000344 -0.000097 -0.001355 -0.002891 
+-0.000109 -0.001830 -0.001509 0.006690 0.002481 -0.006388 
+0.005700 0.012564 -0.009972 0.011319 0.004178 -0.014144 
+0.006790 0.010717 -0.016332 0.000267 0.008424 -0.007889 
+-0.002750 -0.001610 -0.000501 0.001904 -0.000704 0.000993 
+0.003065 0.001212 0.006551 0.004400 0.005246 0.006962 
+-0.001488 -0.002861 -0.000958 -0.034622 -0.039625 -0.053083 
+-0.009847 -0.006837 0.020255 -0.001599 -0.001831 -0.004651 
+-0.014691 0.011018 -0.005455 0.033000 0.018000 0.012000 
+0.034107 0.020282 -0.010596 0.015533 0.007751 0.015592 
+-0.001429 0.003214 -0.001071 -0.024685 -0.028287 -0.018147 
+-0.007167 0.059967 0.012067 -0.005625 0.072500 0.005625 
+0.000000 0.000000 0.000000 -0.101250 0.018750 0.000000 
+-0.062500 0.000000 0.000000 -0.040500 0.020250 -0.036250 
+0.015444 -0.006111 0.007556 0.041723 -0.023151 -0.048655 
+0.043599 -0.066014 -0.032802 -0.004000 0.060192 0.012038 
+-0.052710 -0.052466 -0.026314 -0.018846 0.028269 -0.097500 
+0.003045 0.032228 -0.005809 -0.011049 0.043158 -0.030753 
+-0.010526 -0.024417 0.061378 -0.030783 -0.051681 -0.004801 
+-0.003761 -0.034858 -0.004785 0.045869 -0.039277 0.041566 
+0.024257 -0.021485 0.004158 0.088000 -0.093600 0.031200 
+-0.064762 -0.035952 -0.031190 -0.084286 0.057143 0.000000 
+-0.012544 0.124737 0.054123 0.043062 -0.013062 -0.012472 
+-0.020935 -0.217642 0.012642 0.006100 -0.054551 -0.025039 
+0.003878 -0.020723 0.002722 -0.005273 -0.016025 -0.000234 
+0.014953 0.014413 -0.000404 0.014231 0.024293 -0.018449 
+-0.004308 0.015587 -0.013682 -0.003247 0.004914 -0.001269 
+0.011443 0.001476 -0.004568 0.009698 -0.000265 0.002825 
+0.003582 0.001034 -0.009751 0.005321 0.002993 -0.012914 
+0.013077 0.001731 -0.001058 -0.006911 0.001336 0.001396 
+-0.008667 0.014094 -0.006877 -0.000167 -0.000382 0.000352 
+0.012763 -0.038468 0.080721 0.007832 -0.007830 0.011743 
+0.005155 -0.004141 0.006953 0.005253 -0.000903 0.001750 
+0.010278 0.005139 -0.004517 0.005953 0.010471 -0.008091 
+-0.007017 0.012374 -0.009756 -0.010434 0.012542 -0.010509 
+-0.005600 0.012515 -0.010997 0.060609 0.113079 -0.068126 
+-0.001871 0.000269 0.001719 0.000421 0.000044 -0.001550 
+-0.001105 0.002518 0.000829 -0.001553 0.002212 0.002193 
+-0.000528 0.002422 0.001670 0.001343 0.001807 0.000774 
+0.001457 0.002577 -0.001456 0.001053 0.006708 -0.002757 
+0.002455 0.009837 -0.003687 -0.003463 0.003643 -0.005847 
+0.003440 -0.001238 -0.003456 0.001623 0.004673 -0.007560 
+-0.001395 0.006446 -0.004678 0.000248 0.002505 0.000155 
+0.003542 -0.002523 0.002099 0.001447 -0.004018 0.001823 
+-0.003568 -0.007408 -0.000644 -0.004908 -0.009784 0.001568 
+0.094370 0.050610 -0.054711 -0.027483 0.009201 -0.013622 
+-0.040222 0.032889 -0.023778 0.012273 0.035341 0.027159 
+0.037143 0.051429 0.000000 -0.018731 0.093327 -0.059808 
+-0.010233 -0.008998 -0.004942 -0.014053 -0.016591 -0.025114 
+0.028071 0.035643 -0.024286 0.075556 0.075556 -0.048889 
+-0.076875 0.104375 -0.065000 -0.082525 -0.002351 -0.008552 
+-0.045971 -0.029657 -0.003857 -0.053333 0.010667 -0.021333 
+-0.075556 -0.047778 -0.099444 -0.067143 -0.067143 -0.078571 
+0.017833 0.053917 -0.017917 -0.006667 -0.007778 0.037778 
+-0.038462 0.007692 0.087778 0.032797 -0.016339 0.003339 
+0.012395 -0.032864 -0.004435 0.015352 0.008811 -0.010959 
+0.020762 0.069524 0.108952 0.009048 -0.030476 0.014762 
+0.001750 0.003500 -0.018750 0.035714 0.039762 -0.047857 
+-0.032083 0.015833 0.000417 -0.083095 0.048810 -0.029048 
+0.066397 -0.049853 -0.011029 -0.045000 0.046346 -0.069519 
+-0.112253 0.011526 -0.107994 0.033109 0.028908 0.010252 
+0.187222 -0.202222 0.063611 0.005602 -0.071104 0.021260 
+-0.009278 -0.017708 0.014059 -0.003103 -0.000707 -0.002812 
+0.018147 0.008086 0.003156 0.003372 0.006259 -0.000483 
+-0.004167 0.006279 0.002041 -0.012567 0.021933 -0.015123 
+0.006871 -0.005234 -0.014734 -0.033631 0.013346 -0.015093 
+-0.020881 0.009661 -0.005283 0.034273 -0.019402 0.005983 
+0.070478 0.060869 -0.015642 0.009373 0.028626 0.022748 
+0.012355 -0.002079 -0.005168 0.009903 -0.006564 0.004380 
+0.003828 -0.003565 0.002666 0.000427 -0.001089 0.001371 
+-0.000829 -0.000103 0.000297 0.000212 0.000962 -0.000958 
+0.001442 0.001597 -0.001200 0.000112 0.000491 -0.000417 
+-0.003788 -0.001555 0.000397 -0.006264 -0.001210 -0.000413 
+-0.002459 0.005085 -0.004974 0.013719 0.020070 -0.019162 
+0.001716 0.000123 0.000046 0.001745 -0.000874 -0.001572 
+0.000894 0.000658 0.000372 0.001138 0.001110 0.001158 
+0.001214 0.002218 0.000555 0.001795 0.001951 -0.001327 
+-0.000397 -0.001240 0.001679 -0.004419 -0.004422 0.003930 
+-0.005603 -0.000575 0.001929 -0.001838 0.003971 -0.003971 
+0.003674 0.002500 -0.006023 0.001804 0.003072 -0.002040 
+-0.000768 0.003265 -0.001180 -0.001502 0.003130 -0.002865 
+-0.001804 -0.002094 -0.000713 -0.000275 -0.007768 0.000918 
+0.002343 -0.006536 0.002532 -0.001142 0.007238 -0.003277 
+0.041920 0.110987 -0.031368 0.122840 -0.130519 0.046763 
+-0.116198 -0.061991 0.016371 -0.080905 -0.054524 0.044190 
+-0.015506 -0.050129 0.112663 -0.019413 -0.004959 -0.010058 
+-0.013000 -0.024180 -0.029016 0.062391 0.013771 0.131246 
+-0.068130 -0.057479 0.026964 -0.053000 -0.015692 0.010462 
+-0.081855 0.024727 0.067927 -0.085622 -0.034886 0.044400 
+-0.058985 -0.016517 -0.025524 -0.006277 0.043420 -0.062121 
+-0.109437 -0.114848 -0.002165 -0.060387 -0.228258 -0.091097 
+-0.039845 0.042864 -0.072145 -0.022000 0.011000 -0.013571 
+-0.037166 0.003107 0.035669 -0.046080 0.019739 0.024802 
+-0.011278 -0.006101 -0.004694 0.005000 -0.014643 -0.014643 
+0.019231 0.000000 -0.020000 0.032245 -0.034847 -0.040051 
+0.070596 0.005088 -0.040070 0.082866 0.021938 -0.036596 
+-0.003333 -0.006982 0.041892 -0.078547 -0.062991 0.031111 
+-0.005000 -0.031250 0.047500 -0.003231 0.022077 -0.004308 
+-0.026667 0.028639 -0.010740 -0.000453 0.055000 -0.001585 
+-0.006429 -0.022143 0.020714 -0.013114 -0.009414 0.021563 
+-0.002063 0.004531 0.002473 -0.005462 0.002069 -0.006575 
+0.003514 -0.012364 -0.003544 0.000170 -0.015195 -0.009869 
+0.016598 -0.009285 -0.011029 0.015136 -0.010136 -0.001798 
+-0.013574 0.035920 -0.011204 -0.125502 0.036818 0.108907 
+0.028982 -0.026821 0.008270 0.077427 -0.027339 0.052573 
+0.013613 -0.006205 -0.011249 0.001308 0.005287 -0.008172 
+-0.000319 -0.000002 0.000247 0.000814 0.000190 -0.001134 
+-0.000143 0.001035 -0.001085 -0.000549 0.000281 0.000188 
+0.000554 -0.001282 0.000438 0.002555 -0.002572 0.001825 
+0.002954 -0.003409 0.003293 0.001622 -0.004713 0.004179 
+-0.000572 -0.005414 0.004167 -0.001327 -0.003050 0.002005 
+-0.000153 0.001543 -0.001106 0.001182 0.003907 -0.003179 
+-0.003658 -0.003149 -0.002489 0.000976 0.000384 0.000177 
+0.005248 0.000945 -0.000014 0.003209 0.000597 -0.003582 
+-0.000035 0.000061 -0.000637 -0.001805 -0.001747 -0.001111 
+-0.002565 -0.006400 0.000408 -0.002613 -0.005623 0.002085 
+-0.002179 -0.001377 0.003340 -0.002635 -0.000251 0.001695 
+-0.000101 0.000076 0.000740 -0.000046 -0.003295 -0.000627 
+0.001037 -0.002822 0.003141 -0.004851 -0.006677 0.000846 
+-0.002332 -0.009580 0.003751 0.000052 -0.002794 0.001455 
+-0.002757 0.012296 -0.001775 0.013140 0.014623 0.003638 
+0.020989 0.034257 -0.011872 0.092629 0.051187 -0.017410 
+-0.187169 -0.140410 0.075813 -0.017530 -0.015461 0.015897 
+-0.001176 0.001884 0.028267 -0.000576 0.006894 0.003702 
+0.017521 0.005398 0.002124 0.038444 0.046054 0.044720 
+-0.057162 -0.021635 0.031654 -0.046240 -0.004628 0.009215 
+-0.001271 0.007826 -0.015853 -0.010000 -0.007059 0.002941 
+-0.037700 -0.024043 -0.021805 -0.053110 -0.061794 -0.010383 
+-0.111051 -0.099149 0.010906 0.011564 0.042675 -0.135597 
+0.000343 0.040769 0.002746 0.023566 0.041240 -0.007059 
+0.000450 0.027000 -0.003150 0.004913 0.005576 0.014671 
+-0.000388 0.003356 0.008231 -0.000160 -0.004064 -0.004759 
+0.012640 -0.031906 -0.033716 0.052935 0.030484 -0.027290 
+-0.003571 0.013571 -0.017143 -0.022917 0.028958 -0.012083 
+-0.038538 0.029385 -0.042154 -0.009000 -0.032200 0.064400 
+-0.013000 0.008471 0.002118 -0.076889 -0.026222 0.012222 
+-0.016079 -0.010548 -0.024414 0.014615 -0.032967 0.040440 
+-0.017221 -0.038023 0.012446 0.004482 0.004774 -0.004661 
+0.007065 0.015695 0.005308 -0.002961 0.024249 -0.003285 
+-0.021968 -0.016333 0.000816 -0.028085 -0.006455 0.001073 
+0.000193 0.052019 -0.004717 0.010366 0.023436 -0.008051 
+-0.002738 0.001851 -0.003092 -0.019292 0.000049 -0.005140 
+0.003816 -0.006220 -0.033150 0.007800 -0.005898 -0.009474 
+0.004002 -0.006807 0.010351 -0.000539 -0.001198 0.002487 
+-0.000225 0.003673 -0.004940 0.000443 0.005396 -0.006287 
+0.000963 -0.001838 -0.002070 -0.002963 -0.001795 -0.001756 
+-0.001229 0.000418 0.000736 0.000269 0.001230 0.001984 
+0.000635 -0.000688 -0.000359 0.001117 -0.002834 -0.000090 
+0.001372 -0.001649 0.000284 0.000545 0.000960 -0.000219 
+-0.001200 0.001483 -0.000502 -0.002810 -0.001700 0.000304 
+0.001374 -0.001876 -0.002086 0.000732 0.000779 0.000992 
+-0.000986 0.001404 0.002756 -0.001421 0.000305 -0.002387 
+-0.003834 0.003474 -0.002445 -0.003267 0.002080 0.000267 
+0.000415 0.001542 -0.000255 0.003629 0.001670 -0.000089 
+0.002966 -0.000676 -0.000407 0.000150 0.000373 -0.000604 
+-0.000905 -0.000807 0.002181 -0.000196 0.000181 -0.000545 
+0.003793 0.009906 -0.002776 0.004040 0.007241 -0.003530 
+-0.001849 -0.006141 0.001358 -0.003717 -0.008684 -0.001319 
+-0.001674 0.012458 -0.009796 -0.005346 -0.002840 0.002157 
+-0.011513 -0.019260 0.009973 -0.008996 -0.003735 -0.000305 
+-0.031534 -0.057831 0.006456 -0.064421 -0.086259 0.019678 
+-0.020678 -0.014127 0.002457 0.004737 -0.031954 -0.005388 
+-0.010000 -0.019375 -0.011250 -0.006085 -0.012487 -0.011481 
+0.006429 0.002143 -0.003810 0.018360 0.020116 -0.023190 
+0.015120 0.082103 -0.010498 0.056472 0.016139 0.016944 
+0.008666 -0.028207 -0.006967 -0.037057 -0.104014 0.024161 
+-0.043828 -0.058508 0.027428 -0.014581 -0.004325 0.003188 
+0.043000 0.000000 0.069000 0.007462 0.002154 0.023385 
+-0.002687 -0.007993 -0.018537 -0.007201 -0.013373 -0.020426 
+0.007938 -0.010399 -0.014313 0.032666 -0.046394 0.025250 
+-0.002222 -0.024444 0.003889 -0.018413 -0.101111 0.110317 
+-0.042901 -0.048457 0.022840 -0.050000 -0.033333 -0.044444 
+0.057143 -0.022857 -0.011429 0.028025 0.016049 0.006049 
+-0.062222 -0.061111 0.092222 -0.084091 0.014091 -0.032727 
+-0.122500 0.060000 -0.062500 0.101996 0.082789 -0.014511 
+0.055722 -0.043389 0.027222 -0.006829 -0.002474 0.029493 
+0.000674 0.037273 -0.011458 -0.010454 0.008760 -0.006501 
+-0.011100 -0.008359 0.012256 -0.007667 -0.002699 0.002523 
+-0.000798 0.007923 -0.006137 0.005495 -0.001765 0.000710 
+-0.002400 -0.000412 0.000283 -0.012186 0.000351 -0.003504 
+-0.010301 0.002217 0.001141 0.001397 0.000095 -0.001603 
+0.004618 -0.000526 -0.004618 0.004186 0.001234 -0.005864 
+0.001113 0.003516 -0.004178 -0.003483 0.000165 -0.003953 
+-0.004801 -0.003034 -0.000760 -0.003959 -0.006598 0.004174 
+-0.007329 -0.005593 0.008998 -0.008816 -0.000216 0.004450 
+-0.005915 -0.003600 -0.000712 -0.001399 -0.002196 -0.000194 
+-0.000002 -0.000212 -0.000019 -0.000710 0.001080 0.000083 
+-0.001711 0.001192 -0.000114 -0.001562 -0.000670 -0.000278 
+0.002757 -0.000770 -0.003867 -0.000086 -0.001645 0.001371 
+0.000288 -0.000566 0.000855 0.000812 0.001436 -0.000140 
+0.001344 0.001810 -0.001757 0.003124 0.002634 -0.002205 
+0.003483 0.004311 -0.002070 0.001673 -0.002560 0.000229 
+0.004324 -0.001882 -0.000773 0.000706 -0.000583 -0.000266 
+-0.000894 0.000621 -0.000412 -0.000510 -0.001581 -0.000110 
+-0.000613 0.000421 -0.000381 0.000386 0.003572 -0.001460 
+0.002429 -0.002857 -0.001571 0.000081 -0.009929 -0.000817 
+0.001775 0.003662 0.000392 -0.015251 -0.005234 0.011747 
+-0.015124 -0.029075 0.016173 -0.015212 -0.034756 0.007553 
+-0.008536 -0.044797 0.011502 -0.036712 -0.085477 0.013703 
+-0.014850 -0.061886 -0.005583 -0.010614 -0.106139 0.024000 
+-0.010837 0.000804 -0.011558 -0.010328 0.022981 -0.013234 
+-0.002051 0.044847 0.017074 -0.020006 0.041588 -0.006308 
+-0.007983 -0.018675 0.002323 0.001443 -0.023174 0.016383 
+0.025142 -0.039858 0.009365 0.018593 -0.034442 0.017721 
+-0.006711 -0.028078 0.021975 -0.007502 -0.038346 0.000558 
+-0.027091 0.016727 0.023091 -0.036143 0.047500 0.018357 
+-0.000031 0.071327 -0.071173 -0.042230 0.036719 0.029926 
+-0.009231 0.028979 0.024149 -0.004313 0.000716 -0.000923 
+0.023491 0.013678 -0.060244 0.012787 -0.017037 0.018926 
+-0.011951 0.001402 -0.006707 -0.050083 -0.031671 -0.048732 
+0.039854 0.009096 0.073644 0.031619 -0.047524 0.079238 
+0.027481 -0.022308 -0.026673 0.039569 0.073900 -0.060167 
+0.015500 0.041000 0.066500 -0.020000 0.020000 0.016000 
+0.015726 -0.007179 0.018462 -0.023329 0.030374 -0.028609 
+0.004002 -0.004816 -0.010795 -0.002162 -0.018270 0.007892 
+-0.002201 -0.004480 0.003930 -0.007310 0.001057 0.000365 
+-0.005299 -0.002761 0.001026 0.006594 0.010545 -0.002292 
+0.005542 0.013427 -0.006624 0.006905 0.007145 -0.010560 
+0.011549 0.002943 -0.012224 0.009707 0.001105 -0.007595 
+0.006352 0.000169 -0.002778 0.000511 -0.002428 0.000335 
+0.001938 -0.000670 -0.002666 0.003230 0.001377 -0.005534 
+0.002241 0.001268 -0.004762 0.000144 -0.000345 0.001857 
+-0.005226 -0.005444 0.005709 -0.003635 -0.008192 0.006365 
+0.000966 -0.006218 -0.002899 0.003467 0.000300 -0.003517 
+0.001394 0.003019 -0.000495 -0.000666 0.001651 0.000232 
+-0.000606 -0.000642 -0.000026 -0.000050 -0.000017 -0.000006 
+-0.001371 0.001817 0.000455 0.004766 0.006256 0.000596 
+0.009073 0.011453 -0.006049 0.011676 0.007852 -0.001448 
+0.003258 0.004901 0.000029 -0.000112 -0.000704 0.001622 
+0.003902 -0.004428 -0.000259 0.001265 -0.004745 -0.001778 
+-0.002870 -0.003315 -0.001952 -0.005868 0.000640 -0.000124 
+-0.000731 0.002994 -0.001084 0.003116 0.000587 -0.000537 
+-0.001456 -0.004622 0.001916 -0.007131 -0.009011 -0.000814 
+0.000786 -0.007620 -0.000043 0.005441 -0.004656 -0.006073 
+0.007901 0.005312 0.001173 -0.032420 -0.017977 0.015710 
+-0.019799 -0.026249 0.013974 -0.018489 -0.029655 0.008567 
+-0.019080 -0.034527 0.009168 -0.023152 -0.040498 0.007554 
+-0.044382 -0.099331 0.015170 -0.077059 -0.002619 -0.009168 
+0.000386 0.004535 -0.000530 0.000402 -0.003462 0.000704 
+0.015249 -0.015924 -0.009917 0.038000 0.048571 -0.068286 
+0.012571 0.002500 -0.022627 0.016957 0.007474 -0.019433 
+0.014063 0.013601 -0.053709 -0.004500 -0.067500 -0.036000 
+0.008800 -0.041353 -0.057188 0.075464 -0.087753 -0.015212 
+0.026802 -0.036194 -0.014737 -0.016000 -0.020667 0.000000 
+-0.051174 0.000628 -0.035162 -0.023538 -0.017077 0.046154 
+-0.020991 -0.001734 0.005263 -0.020952 -0.063810 0.026667 
+0.004620 0.052541 -0.026753 0.031159 0.019341 -0.017727 
+0.010863 -0.002407 -0.018516 0.001971 -0.048766 0.031646 
+0.012222 0.002222 -0.014444 0.029097 0.001298 -0.052388 
+-0.002811 0.022339 -0.053998 0.004332 -0.004545 -0.017326 
+0.079500 0.079500 0.028000 -0.061500 -0.039500 0.011000 
+-0.008797 0.019794 -0.070000 0.006867 0.012712 -0.067139 
+0.023678 -0.010206 -0.020140 0.012950 -0.005117 -0.007985 
+0.004108 -0.002091 -0.001937 0.000422 -0.001895 0.000565 
+0.003425 0.008555 0.003851 0.008303 0.018539 -0.004793 
+-0.000572 0.000874 -0.002426 0.001888 -0.001494 -0.006150 
+0.004282 -0.001328 -0.007574 0.006992 0.001817 -0.003276 
+0.000893 -0.002011 0.000604 -0.000626 0.000695 0.000630 
+0.000809 0.002010 -0.002382 -0.000770 0.003360 -0.001999 
+0.001750 0.000076 0.002333 -0.003384 -0.005051 0.003108 
+-0.006500 -0.007432 0.005572 -0.008167 -0.008631 -0.002354 
+-0.001382 -0.005986 -0.004300 -0.000095 -0.003231 -0.000757 
+-0.004621 -0.000840 0.000093 -0.005740 -0.000621 -0.000641 
+-0.004077 -0.002433 -0.000174 -0.001560 -0.001127 -0.001397 
+-0.001143 0.005284 0.001857 0.006005 0.009561 -0.001446 
+0.014991 0.007221 -0.000157 0.001497 -0.000621 0.000876 
+-0.001150 0.003756 -0.000525 0.000768 0.000991 0.000684 
+-0.000739 -0.000633 0.000220 0.000086 0.000763 -0.000104 
+-0.002086 0.002635 -0.002581 -0.005235 0.001449 -0.000256 
+-0.003015 0.001063 -0.001832 0.001639 0.001107 -0.005993 
+0.001827 -0.001967 -0.005161 -0.002106 -0.004557 -0.004822 
+0.000208 -0.007710 0.001373 0.010014 0.003816 -0.008135 
+0.008913 0.016964 -0.007091 -0.034118 -0.014438 0.012110 
+-0.029808 -0.019619 0.011266 -0.019437 -0.021689 0.007156 
+-0.016934 -0.024603 0.005262 -0.021311 -0.029339 0.004642 
+-0.027934 -0.050333 0.009883 -0.027569 -0.090903 0.006308 
+-0.006012 -0.000711 -0.004703 0.001801 0.003241 -0.019627 
+0.047077 -0.060714 -0.060527 -0.031429 -0.034881 0.085476 
+-0.014634 -0.031909 -0.013176 -0.006530 -0.013467 -0.009793 
+0.007668 -0.020126 -0.007392 0.015576 -0.039451 -0.008487 
+0.052286 -0.033857 0.023571 -0.037431 -0.003681 0.010278 
+-0.018182 -0.032727 0.013636 0.002967 -0.075000 0.004451 
+0.029118 -0.027647 -0.026176 0.000680 -0.030376 -0.019178 
+0.020963 -0.003716 -0.032018 -0.076680 -0.042095 0.022530 
+-0.050256 -0.014359 0.014359 -0.071291 0.002172 -0.038709 
+0.023277 -0.015125 -0.049989 0.069821 -0.071786 0.065893 
+0.051667 -0.046667 -0.051667 -0.024945 -0.066209 -0.025879 
+0.052403 -0.000532 -0.013056 0.121818 0.020000 -0.050909 
+0.018364 -0.023273 0.006364 -0.009583 -0.033333 -0.014167 
+-0.010221 -0.011549 -0.052877 0.014897 -0.022477 -0.004200 
+-0.001420 -0.008285 0.007042 0.000262 0.004914 -0.007341 
+0.003244 0.000819 -0.009936 -0.000819 0.000700 -0.003022 
+0.006502 0.012766 0.004696 -0.001462 0.003091 0.001107 
+0.000954 -0.000926 0.001138 0.000316 0.000824 0.000986 
+-0.000813 0.001646 -0.000766 -0.000761 0.001915 -0.001641 
+-0.000330 0.000733 0.000193 -0.004988 -0.005796 -0.000352 
+-0.002348 -0.000045 0.006193 0.000889 -0.002931 0.002371 
+0.000064 -0.002412 0.002104 -0.000388 -0.002011 0.001875 
+0.000732 -0.002465 0.002311 -0.006096 -0.009122 -0.003718 
+-0.006201 -0.009171 -0.001273 -0.000660 -0.005614 -0.001554 
+0.004374 -0.001452 -0.003019 0.001964 -0.000782 -0.000392 
+-0.001563 0.000447 -0.000483 -0.001226 0.001177 -0.000026 
+0.004667 0.002119 0.000277 0.006994 0.000335 -0.003435 
+0.008926 -0.002937 -0.004406 0.005890 -0.000887 0.001668 
+0.001524 0.004762 0.000762 -0.001080 0.003429 -0.001275 
+-0.001467 0.000747 -0.000380 -0.000850 0.000245 -0.000916 
+0.000460 0.003014 -0.002602 0.000855 0.002611 -0.002495 
+-0.002765 -0.000878 -0.002063 -0.000872 -0.002656 -0.003276 
+-0.000413 -0.000071 -0.003586 -0.007004 0.001469 -0.002278 
+-0.003743 -0.004238 -0.003298 0.013042 0.004701 -0.007272 
+0.005990 0.014740 -0.016240 -0.029433 -0.002355 0.012667 
+-3.892215 -1.760479 0.616766 -3.545455 -2.573864 -0.693182 
+-2.698113 -3.251572 -1.056604 -0.023199 -0.031284 0.002225 
+-0.018088 -0.032279 -0.001558 -0.017068 -0.036612 -0.008293 
+-0.073807 0.063017 -0.088002 -0.011886 0.000160 -0.018860 
+-0.040526 -0.061140 -0.061842 -0.005758 -0.050505 0.006869 
+-0.023006 -0.090344 -0.030632 -0.085451 -0.029256 -0.005214 
+-0.048103 0.020616 0.105714 -0.097500 -0.096538 0.064359 
+0.118221 -0.023880 0.048936 0.011210 0.012947 0.011685 
+-0.085357 -0.038839 -0.054196 -0.001302 -0.004419 -0.011581 
+0.039023 0.003383 -0.024586 -0.011810 0.003125 -0.029526 
+0.028258 0.119820 -0.133393 0.055089 0.001518 0.029821 
+-0.007727 0.009773 0.003068 -0.206000 0.030600 -0.091800 
+-0.007500 -0.018750 -0.020000 0.078000 -0.032000 -0.007000 
+0.034444 0.017222 -0.017222 0.002122 -0.041122 0.057659 
+0.053846 0.048462 0.024615 0.057143 0.034429 -0.026619 
+-0.028984 0.000476 0.057175 -0.022718 0.007177 -0.043438 
+0.004958 -0.005417 -0.012583 -0.001098 0.003073 -0.000792 
+-0.001680 0.009332 -0.006668 0.001094 0.006566 -0.011692 
+0.004746 0.005334 -0.011648 -0.001948 0.008141 -0.007380 
+-0.005031 0.006808 -0.007436 -0.004740 0.006014 0.000153 
+0.000275 -0.000930 0.000404 -0.003537 -0.007699 0.002082 
+-0.006131 -0.002474 0.000716 -0.001980 -0.002627 -0.001132 
+-0.003537 -0.001847 0.000790 -0.006831 -0.002428 0.004912 
+-0.004571 -0.000541 0.007096 0.002723 -0.002718 0.000457 
+0.005963 0.004827 0.000171 0.008921 0.000203 -0.001182 
+0.001831 -0.000338 0.000201 -0.004381 -0.003293 -0.000645 
+-0.004171 -0.003324 0.000663 0.001933 -0.002747 -0.001463 
+0.003095 -0.004237 -0.002858 0.000381 -0.002994 -0.002833 
+-0.002300 0.001146 0.000399 -0.006334 0.001669 0.001573 
+0.000973 0.001966 0.002283 0.006102 0.001463 -0.004888 
+0.002051 0.000530 -0.004940 -0.000450 0.001301 0.000164 
+-0.002129 0.004812 -0.002313 -0.000207 0.005181 -0.004767 
+0.000769 0.000846 -0.005923 0.002070 -0.002109 -0.002070 
+-0.001310 -0.000574 -0.001985 -0.000330 0.000527 -0.001716 
+-0.001375 -0.000013 -0.001732 -0.000146 -0.004479 0.000713 
+0.000338 -0.001875 0.002298 -0.005224 0.005300 0.000378 
+-0.013169 0.004608 -0.002941 0.005130 -0.001399 -0.009678 
+-0.002785 0.006521 -0.009442 -0.017658 0.004667 0.015542 
+-3.979382 -1.319588 0.778351 -4.410138 -2.119816 -0.594470 
+-4.064356 -2.683168 -1.321782 -2.850000 -3.025000 -1.525000 
+-0.022318 -0.030071 -0.007937 -0.021472 -0.030911 -0.011230 
+0.032334 0.171838 -0.058918 0.050769 0.019527 0.013018 
+-0.066032 -0.046375 -0.031721 -0.046939 -0.007755 -0.038980 
+-0.045638 -0.038707 0.004276 -0.098519 -0.125741 0.014259 
+-0.012403 -0.098961 0.061753 -0.062471 -0.002822 0.100760 
+0.009849 -0.022056 0.007366 0.064930 -0.008637 0.044287 
+0.027034 -0.083284 -0.015760 0.008342 0.020761 -0.017065 
+0.030008 0.008460 0.002048 -0.007588 0.015832 0.001277 
+0.000233 0.019803 -0.008855 0.070385 0.042404 -0.041538 
+0.013929 0.054786 -0.089143 0.027000 -0.009256 -0.083305 
+0.074000 -0.023269 -0.116346 0.072400 0.036200 -0.088000 
+0.035556 -0.001538 -0.002308 0.013655 -0.018759 0.000828 
+-0.044396 -0.053407 0.039890 -0.051303 0.045696 0.014158 
+-0.135435 -0.030725 -0.016304 0.011891 0.004003 -0.035777 
+0.011919 -0.003844 -0.012415 0.008623 -0.002797 -0.008031 
+0.008839 -0.002062 -0.010499 0.006027 -0.002076 -0.007875 
+0.005592 -0.001082 -0.000444 0.003625 -0.000451 0.000633 
+0.003540 0.004956 -0.005569 -0.000655 0.004732 -0.009256 
+-0.000821 0.000766 -0.002900 0.000513 -0.008248 0.002550 
+0.002224 -0.009832 0.004563 0.000039 -0.000906 0.003573 
+-0.003320 -0.000760 -0.000744 -0.003545 0.001512 -0.002633 
+-0.002072 0.000943 -0.001117 -0.000830 -0.001129 0.000580 
+0.000896 -0.002701 0.000461 0.000791 -0.001087 -0.000765 
+-0.000257 -0.001497 -0.000089 -0.001726 -0.002330 0.000922 
+-0.004587 -0.002800 0.001262 -0.006751 -0.003027 -0.000688 
+-0.005093 -0.002995 -0.001615 -0.002039 -0.003964 -0.001030 
+-0.002113 -0.007277 0.000109 -0.004997 -0.008246 0.001136 
+0.002362 0.000276 -0.000276 0.001714 0.000174 -0.001175 
+-0.001901 0.002386 -0.002399 -0.004215 0.004132 -0.004215 
+-0.005384 0.004250 0.001629 -0.000567 -0.001936 -0.000991 
+-0.001814 -0.001555 -0.005570 -0.001729 -0.003113 -0.004150 
+-0.000127 -0.002551 -0.001875 0.000857 0.001436 -0.000419 
+0.000670 -0.000046 -0.001597 0.000603 -0.001809 -0.001374 
+-0.000214 -0.003528 0.000218 -0.003081 0.001010 -0.003081 
+-0.011743 0.001818 0.005954 0.004926 0.002334 -0.010006 
+0.016414 -0.004774 0.001582 0.001435 0.014126 0.006234 
+-3.847826 -0.695652 1.250000 -4.467213 -1.450820 -0.286885 
+-4.527559 -1.940945 -1.374016 -3.885714 -2.380952 -1.966667 
+-0.030640 -0.026432 -0.015153 -0.018950 -0.030088 -0.008291 
+0.023866 0.088711 -0.008082 -0.015333 0.172685 0.019920 
+-0.143516 0.088791 0.030549 -0.007190 0.022638 0.007038 
+-0.050829 0.016766 -0.033609 -0.003400 0.062259 -0.078361 
+0.059567 0.061905 0.071255 -0.015882 -0.015882 0.015882 
+-0.036114 0.007668 -0.022620 -0.001441 -0.001211 -0.000451 
+0.069333 -0.141524 0.070476 -0.007836 -0.002621 -0.026023 
+0.009155 0.003447 0.005062 -0.004067 0.029867 0.014667 
+-0.046000 0.106800 0.053400 0.073994 -0.125920 0.014713 
+0.070476 -0.044524 -0.025952 0.120522 0.023709 0.047912 
+0.038901 -0.102857 -0.008352 -0.063026 -0.100088 0.079079 
+0.016139 -0.003472 0.000611 0.057692 -0.005538 -0.016615 
+0.050049 -0.037843 0.006716 -0.053889 -0.053889 -0.007778 
+-0.041114 0.039955 0.009184 -0.002189 0.001878 -0.003700 
+0.005267 -0.001968 -0.013324 0.010688 0.000753 -0.010809 
+0.006089 -0.001984 -0.004534 0.001629 -0.003054 -0.000011 
+0.000702 -0.005061 0.000457 0.004167 -0.004170 0.000695 
+0.003772 0.001107 -0.001175 -0.000071 0.003955 0.000287 
+-0.000830 0.002215 0.000984 0.001477 -0.000322 -0.002697 
+0.000269 -0.001694 -0.004581 -0.001549 -0.002114 -0.001026 
+-0.000545 -0.002720 -0.002357 -0.001929 0.004350 -0.005233 
+-0.003626 0.006358 -0.004534 -0.003278 0.002221 -0.006519 
+-0.001268 -0.001570 -0.003954 -0.003428 -0.003011 0.003130 
+0.000779 -0.001793 0.001673 0.002421 -0.000782 -0.000181 
+0.000511 0.000347 -0.001568 -0.002337 -0.000866 -0.001319 
+0.000417 -0.000279 0.000051 0.002287 0.000046 -0.000449 
+0.001626 -0.002394 0.002210 -0.000334 -0.002899 0.005146 
+0.000287 -0.006260 -0.001148 0.003755 -0.001415 -0.000985 
+0.001034 0.005950 0.001905 -0.006109 0.001535 -0.001511 
+-0.006503 0.000525 -0.005660 -0.003658 0.000517 -0.004029 
+-0.000902 -0.000980 -0.002118 -0.001156 0.001035 -0.000209 
+0.000635 0.002360 0.000586 0.000970 -0.001135 0.000075 
+0.002007 -0.002611 0.004320 0.001184 -0.001944 0.002116 
+-0.000786 -0.001360 -0.002142 -0.001329 -0.001534 -0.004800 
+-0.011226 0.003384 -0.008089 -0.007816 0.005282 0.001380 
+0.013720 0.002485 -0.011310 0.008339 0.011775 -0.004811 
+-3.782313 -0.863946 2.530612 -4.579832 -1.315126 0.911765 
+-4.750000 -1.493151 -0.558219 -4.645756 -1.608856 -1.575646 
+-4.182796 -1.768817 -2.145161 -0.029318 -0.024101 -0.023530 
+-0.023742 -0.029746 -0.013296 0.003801 0.191700 -0.025334 
+-0.006389 0.032000 0.001879 -0.050983 0.028147 0.040328 
+-0.006756 0.084780 0.013173 -0.046840 -0.015943 -0.066274 
+0.003945 0.032235 -0.049988 0.001401 -0.015410 -0.001818 
+0.012349 -0.007457 -0.016769 -0.019147 -0.024387 -0.003459 
+-0.052000 -0.129000 0.025000 -0.212000 0.068400 -0.136800 
+-0.035000 0.045000 -0.069000 -0.035265 0.012249 -0.025979 
+-0.008020 0.039530 -0.038465 0.015000 -0.036000 -0.024000 
+0.057202 -0.019405 0.003274 0.138086 -0.040027 0.013504 
+0.005225 0.031351 0.074444 -0.012491 -0.053810 -0.002161 
+0.023571 -0.002340 0.000936 0.033603 0.011619 -0.040243 
+0.044622 -0.017647 -0.021092 0.007027 -0.090624 0.079900 
+0.005391 -0.024283 0.035111 -0.002495 -0.000185 0.012135 
+0.000158 0.004105 -0.001737 0.007972 0.005035 -0.008413 
+0.004531 0.002934 -0.005608 0.001177 0.000629 -0.003153 
+0.001991 0.000443 -0.001669 0.000785 0.001461 -0.003510 
+-0.004191 -0.002141 0.001239 -0.006624 0.000347 0.006000 
+-0.004384 -0.001538 0.005170 -0.001286 -0.002699 0.001335 
+-0.000742 -0.001945 -0.001675 -0.000801 -0.000736 -0.000325 
+0.001296 -0.000675 -0.000100 0.003783 0.000471 -0.003041 
+0.000131 0.002736 -0.004761 -0.002226 0.002475 -0.001496 
+0.001276 0.003828 0.001983 -0.001311 0.001528 0.001896 
+0.000387 -0.001070 0.000785 -0.000630 -0.000509 -0.002038 
+0.000133 -0.003506 -0.002263 0.000601 -0.002654 -0.001039 
+-0.001765 -0.001667 -0.000392 -0.000989 -0.002358 -0.000741 
+0.001327 -0.002789 -0.000045 0.001964 -0.000040 -0.000571 
+-0.000969 -0.008583 -0.000539 0.005120 -0.001757 -0.002342 
+0.001593 0.004350 0.004486 -0.004367 0.006721 0.004270 
+-0.003985 0.000446 -0.000658 0.001852 -0.000791 -0.002571 
+0.006570 -0.000774 0.000062 0.005809 0.005538 0.000692 
+0.000864 0.006790 -0.003827 -0.000476 0.001905 -0.000681 
+0.001627 -0.003135 0.003710 0.002518 -0.002238 0.002078 
+-0.003302 0.002341 -0.003655 -0.005415 0.009785 -0.011530 
+-0.004433 0.006992 -0.013789 -0.008010 0.005206 0.001688 
+0.004752 0.001180 -0.002141 0.010742 -0.002121 -0.013001 
+-0.017829 -0.001803 0.020383 -4.714286 -1.183674 1.346939 
+-4.945393 -1.310580 -0.464164 -4.965300 -1.425868 -1.400631 
+-4.875000 -1.584677 -1.959677 -4.676259 -1.769784 -2.366906 
+-0.039328 -0.024038 -0.032903 -0.022490 0.037305 -0.042229 
+0.084602 -0.124497 0.021861 -0.014246 -0.009730 0.011848 
+0.015833 0.040833 0.009167 -0.012533 -0.064267 -0.047333 
+0.032000 -0.164444 0.024000 0.008816 -0.017051 -0.003609 
+-0.004357 -0.014571 -0.013294 0.006804 -0.029483 -0.007895 
+-0.013158 -0.066842 0.015338 -0.025213 0.010185 -0.013541 
+-0.024465 0.004333 -0.035167 -0.025232 0.036319 -0.032496 
+-0.027695 0.003125 -0.035248 -0.025048 -0.055000 -0.027831 
+-0.088480 0.053088 -0.105000 -0.120327 0.002618 -0.140727 
+-0.050735 0.030441 -0.035833 -0.075455 0.060000 -0.075455 
+-0.111509 -0.013509 0.035719 -0.125185 -0.113704 0.100741 
+-0.005246 -0.018996 0.030303 0.009324 -0.005239 -0.009525 
+0.000160 -0.005674 0.003526 -0.004289 -0.001628 0.003698 
+-0.001815 -0.000924 0.001407 0.000098 -0.000714 0.000351 
+0.002727 0.000592 0.001269 0.002903 0.000443 -0.002512 
+-0.002752 -0.000089 -0.004053 -0.003635 -0.003424 -0.002635 
+-0.001724 -0.004090 0.000424 -0.001005 -0.006941 0.001564 
+-0.002189 -0.006856 0.004997 -0.001994 -0.005153 0.005443 
+0.000435 -0.002765 0.003174 0.000496 -0.000751 0.000244 
+0.001254 -0.002254 -0.002231 0.001507 -0.000600 -0.006622 
+-0.000756 0.000280 -0.003094 0.000721 -0.000895 0.000881 
+-0.004885 0.000333 0.003011 0.000000 -0.001167 0.003667 
+-0.002313 -0.004411 -0.001894 -0.003676 -0.004242 -0.000848 
+0.000801 -0.004971 -0.002569 -0.002033 -0.004065 0.000569 
+-0.002424 -0.000727 0.000242 -0.000200 -0.001601 -0.001401 
+-0.000613 0.001147 -0.002373 0.001452 0.001543 -0.000691 
+-0.003022 -0.005877 -0.004722 0.000338 -0.001943 -0.002660 
+-0.001225 0.000774 -0.000027 0.001509 0.001359 0.001877 
+0.000612 0.000396 0.000360 -0.000439 0.002106 -0.001697 
+0.002061 0.002847 0.001237 0.000983 -0.000229 0.002229 
+0.002869 -0.003035 -0.002027 0.003415 -0.003554 -0.002399 
+0.002675 -0.002425 -0.003128 -0.000083 -0.001302 -0.002446 
+-0.004609 -0.000845 -0.002074 -0.007690 0.002755 -0.001374 
+-0.007286 0.007571 -0.004325 -0.006938 0.002330 -0.004978 
+-0.003893 -0.001956 0.001428 0.007328 -0.001375 -0.006452 
+0.006636 0.006867 -0.005328 -0.027849 -0.015141 0.020857 
+-4.901288 -1.446352 -0.120172 -4.938983 -1.528814 -1.220339 
+-4.859206 -1.440433 -1.830325 -4.781250 -1.156250 -2.442708 
+-0.040118 -0.010549 -0.037440 -0.035818 -0.022753 -0.022451 
+0.032508 -0.060384 0.033770 -0.009056 -0.024187 0.009064 
+-0.023158 -0.031579 -0.036842 -0.037780 -0.043784 0.008127 
+0.055886 -0.019741 0.047613 -0.000023 -0.004473 -0.000576 
+-0.006741 0.001703 0.000801 0.006227 -0.010880 -0.020255 
+0.016111 0.019111 -0.002056 0.009545 -0.025234 0.014994 
+-0.017259 -0.009864 -0.002157 -0.037514 0.000728 -0.016184 
+0.033881 -0.040676 -0.004977 0.036235 -0.112647 0.058765 
+-0.050376 -0.027970 -0.085338 -0.022255 0.027745 0.009411 
+-0.005489 -0.003534 0.002556 -0.014849 0.020067 -0.036020 
+0.011961 0.016667 -0.047843 -0.122222 -0.003111 -0.006222 
+0.012363 0.025108 -0.032872 0.009858 0.043905 -0.053368 
+0.012893 0.018991 -0.027465 0.009834 0.005795 -0.013051 
+0.002796 0.002503 -0.004319 0.000564 0.006035 -0.004822 
+-0.003098 0.010000 -0.004373 -0.002400 0.005882 -0.001471 
+0.001588 0.000397 -0.002595 0.000961 0.001179 0.000802 
+-0.000051 -0.001843 0.007653 -0.005218 -0.009859 0.010314 
+-0.000601 -0.003827 0.006667 -0.000734 0.001752 -0.001540 
+-0.001358 0.001346 -0.003006 -0.000414 -0.000556 -0.003087 
+-0.000743 -0.003189 -0.003265 0.002188 -0.000676 -0.008254 
+-0.000105 0.003282 -0.007599 -0.000553 0.002604 -0.003932 
+-0.002885 -0.000740 -0.000548 -0.001568 -0.001434 -0.002182 
+-0.001584 -0.000188 -0.000624 0.001840 0.003688 -0.001054 
+0.002368 0.003312 -0.006152 -0.001237 -0.002930 -0.004167 
+-0.001050 -0.000974 -0.003597 -0.003435 -0.001471 -0.000501 
+-0.001369 -0.002295 -0.001096 0.002319 0.000290 -0.004463 
+0.001569 -0.002996 0.002233 -0.001079 0.003012 -0.001455 
+-0.003738 0.003754 -0.004070 -0.000459 -0.001482 -0.001775 
+0.000125 0.000380 0.000303 0.001073 0.003882 0.000725 
+-0.000222 0.006000 0.001259 0.000861 0.000934 0.000704 
+0.000808 -0.005859 -0.001869 -0.001513 -0.007795 -0.001963 
+-0.002075 -0.004471 -0.001771 -0.001377 -0.000027 -0.004346 
+-0.003381 0.003052 -0.002553 -0.004600 0.002731 0.000038 
+-0.007735 0.002193 0.002401 -0.011042 -0.001102 -0.001352 
+-0.001472 -0.001316 0.002698 0.002934 0.000512 -0.004960 
+0.005768 -0.001983 -0.008472 -0.008901 0.001534 0.011685 
+-3.606936 -0.809249 0.988439 -4.276859 -1.148760 -0.500000 
+-4.484375 -1.039062 -1.621094 -4.426471 -0.862745 -2.348039 
+-4.057377 -1.090164 -2.926229 -0.039084 -0.015104 -0.030559 
+-0.041784 -0.000509 -0.028888 -0.067395 -0.046133 -0.005093 
+-0.016726 -0.016087 -0.027877 -0.042574 -0.015584 -0.019537 
+-0.008594 -0.012690 -0.071776 0.008345 0.006660 -0.002118 
+-0.025260 -0.021619 0.029048 -0.053944 -0.014138 0.068517 
+0.051986 0.004029 -0.026357 0.014890 0.004303 -0.025930 
+0.010672 0.008084 -0.011144 -0.012922 0.005224 -0.031571 
+-0.016132 0.030264 -0.098564 0.020526 -0.024620 0.127193 
+0.025631 -0.012459 -0.029457 -0.011663 0.024341 0.013185 
+-0.029235 0.019123 0.001938 0.059880 0.108639 -0.017342 
+-0.023771 0.097143 -0.073886 0.023571 -0.006286 0.058143 
+-0.007938 0.011939 -0.028597 -0.000016 0.014105 -0.031141 
+0.003799 0.004414 -0.011226 0.001729 -0.001806 0.000627 
+-0.000723 -0.000530 -0.001060 -0.002159 0.003504 -0.002893 
+0.000245 0.005763 -0.003469 0.000970 0.008345 -0.006850 
+0.004122 0.015083 -0.009857 0.002363 0.013329 -0.004040 
+-0.002025 -0.000742 0.003129 0.000236 -0.008495 0.011245 
+-0.000275 -0.005480 0.003391 -0.000721 0.001117 -0.002914 
+0.000484 0.003595 -0.003940 0.001896 0.002416 -0.003247 
+0.005549 0.002102 -0.002266 0.007186 -0.000539 -0.002245 
+0.004303 -0.003763 -0.002021 -0.000954 -0.002015 -0.003183 
+0.002471 -0.000509 -0.004303 0.004390 -0.000806 -0.000886 
+0.001922 0.002393 0.000559 -0.003612 0.000600 0.000302 
+-0.006527 0.001661 -0.001069 -0.003095 0.004905 -0.006336 
+-0.000897 0.002467 -0.004261 -0.001940 -0.002665 0.002325 
+-0.000571 -0.003526 0.005020 0.001935 0.000835 -0.000720 
+-0.004776 0.004351 -0.002124 -0.004632 0.005739 -0.003393 
+-0.003714 0.002743 -0.005713 -0.003435 0.001970 -0.004395 
+0.001399 0.003133 -0.000059 0.000317 0.004282 0.002697 
+0.000000 0.001778 0.000741 -0.001219 0.001816 -0.003035 
+-0.001119 -0.002403 -0.003003 -0.001194 -0.000821 -0.000821 
+0.001206 -0.000647 -0.003794 0.001776 0.005246 -0.008877 
+0.000316 0.009572 -0.009840 -0.003699 0.007969 -0.005840 
+-0.007361 0.002874 -0.001783 -0.003864 0.004550 0.004639 
+-0.001653 0.005017 0.000186 0.003698 0.005341 -0.008741 
+0.007267 0.006268 -0.007501 0.003823 0.008623 -0.003115 
+-0.010213 0.002395 0.011257 -0.025875 -0.003517 0.007805 
+-3.285714 -0.328571 -0.823810 -3.354651 -0.622093 -1.738372 
+-0.035451 -0.010505 -0.021656 -0.043697 -0.007591 -0.036922 
+-0.074365 -0.004355 -0.064927 -0.104756 -0.014367 0.006934 
+-0.046898 -0.037326 0.023641 -0.040649 -0.024834 0.006528 
+-0.018597 -0.011624 -0.000212 0.002206 0.001842 -0.022618 
+-0.004537 -0.084873 -0.005873 0.105732 -0.030732 0.181951 
+-0.030445 0.068683 -0.150597 0.008517 0.020952 -0.038945 
+-0.000893 0.002097 -0.015390 -0.001871 -0.001831 -0.008144 
+0.000364 -0.000874 -0.045678 -0.014393 0.003465 0.062690 
+0.087903 -0.010030 -0.020851 0.060588 -0.008235 -0.008235 
+0.001986 0.017567 -0.002614 -0.034827 -0.001889 0.082523 
+-0.034556 0.088618 0.121037 0.003690 0.006170 0.021725 
+0.000316 0.000058 0.002021 -0.000879 0.000279 0.003380 
+-0.000857 -0.003642 0.008568 -0.003850 -0.006279 0.009162 
+-0.002050 -0.003967 0.003067 0.002238 -0.002426 -0.000655 
+0.000142 -0.002557 0.002809 0.000258 0.005061 -0.002306 
+-0.003095 0.015033 -0.004978 -0.004260 0.015585 -0.011154 
+-0.001947 0.005044 -0.006852 0.002323 -0.002736 0.000307 
+-0.000758 -0.005715 0.002406 -0.000636 -0.002067 0.001192 
+0.001189 0.001678 -0.001691 0.006338 0.003085 -0.001436 
+0.004554 -0.000682 0.001279 0.004240 -0.002256 -0.001299 
+-0.000977 -0.002319 -0.003171 0.001504 -0.005953 -0.003926 
+0.002218 -0.002175 -0.006536 0.001816 0.000594 -0.005203 
+0.000341 0.000287 -0.000721 -0.001789 0.000488 0.001463 
+-0.003438 0.003056 0.002063 -0.006268 0.004940 0.000579 
+-0.006316 0.002105 0.000000 0.001125 0.000240 0.000063 
+0.006580 0.000019 -0.003203 0.004545 0.000569 -0.005693 
+0.002852 0.003574 -0.001377 0.000202 0.005293 -0.007043 
+-0.000940 0.001232 -0.003499 -0.000875 0.000070 0.000781 
+-0.001123 0.000256 0.001904 0.000626 0.002532 -0.001316 
+0.005145 0.003966 -0.000471 0.000568 0.000765 0.000840 
+-0.002760 0.004066 -0.003124 -0.003146 0.002489 -0.000991 
+-0.000527 -0.000549 -0.000821 0.002077 0.002727 -0.006061 
+-0.002399 0.005624 -0.003251 -0.003189 0.003693 -0.001315 
+-0.003371 0.004923 0.003134 -0.005088 0.005519 0.005867 
+0.001168 0.009241 0.004027 0.002801 0.001210 -0.000611 
+0.000174 -0.002804 -0.011848 0.010811 -0.001514 -0.010009 
+0.007513 0.003559 -0.002909 -0.004469 0.003661 0.003997 
+-0.012153 0.002726 -0.000390 -0.014709 -0.000532 -0.006912 
+-0.014058 -0.002966 -0.009521 -0.002215 -0.000009 -0.001972 
+0.015281 -0.001175 0.021227 -0.068182 0.006364 0.000000 
+-0.077995 -0.010163 0.009106 -0.032548 -0.016052 -0.000571 
+0.000281 -0.017004 -0.018213 -0.025827 0.005911 0.012754 
+-0.001208 -0.002978 0.003876 -0.014758 -0.000417 0.016242 
+-0.007523 0.000443 -0.010619 0.003026 0.006021 -0.011404 
+0.000939 -0.000260 -0.002102 -0.014540 0.006421 -0.001422 
+-0.005771 -0.001468 0.016934 -0.000415 0.002968 0.009929 
+0.008076 0.000848 -0.007231 0.017833 0.053500 -0.027222 
+-0.017268 -0.029561 -0.034160 -0.027678 -0.049217 0.026355 
+0.021886 -0.003902 0.045792 0.002019 0.004598 0.033482 
+-0.004217 -0.000969 0.023623 -0.002986 -0.002446 0.013673 
+0.000350 -0.000219 0.001752 0.003956 -0.000088 -0.000880 
+0.005578 -0.002492 0.004190 0.006915 -0.002388 0.003963 
+0.004330 0.001408 0.001701 0.001326 0.006450 0.000763 
+0.000000 0.016582 -0.004810 -0.002154 0.019328 -0.008389 
+0.003217 0.014039 -0.009304 0.005489 0.007055 -0.006782 
+0.005554 -0.000974 -0.004408 0.002247 -0.004430 -0.001100 
+0.001251 -0.003990 -0.001767 0.002871 -0.004037 -0.001401 
+-0.001131 -0.003052 -0.001357 -0.000096 -0.001942 -0.000764 
+0.002506 -0.000162 -0.007176 0.003158 -0.000388 -0.008767 
+0.002561 -0.004014 -0.003869 0.000356 -0.001585 -0.000542 
+0.001212 -0.000430 0.000581 0.000264 -0.000318 0.001297 
+-0.001764 0.000566 -0.000206 -0.003551 -0.002357 -0.002626 
+-0.004074 -0.003669 0.000318 -0.000172 0.000613 -0.001054 
+-0.001790 -0.000388 -0.001867 -0.000914 -0.002353 -0.003919 
+0.002236 0.003292 -0.005635 0.001519 0.004420 -0.004074 
+0.000482 0.000679 0.001725 0.003812 -0.000330 0.004187 
+0.004584 -0.000897 0.004317 0.000137 -0.000490 0.002725 
+0.000129 0.001719 0.000396 0.003153 0.005072 -0.001802 
+-0.001556 0.002792 -0.001523 -0.001150 -0.002981 0.001144 
+-0.000844 -0.004687 0.003528 0.002027 -0.002074 0.002248 
+0.000633 -0.001534 -0.000179 -0.001392 0.001000 -0.000655 
+-0.001743 0.000804 0.001055 0.005203 0.003408 -0.002527 
+0.005749 0.000879 -0.002335 -0.001675 0.002338 -0.006740 
+0.004555 0.004493 -0.005952 0.004649 0.011764 -0.008800 
+0.013479 -0.002239 -0.011481 0.009623 -0.002102 -0.004493 
+0.003418 -0.003377 -0.002092 0.003084 -0.004426 -0.000445 
+0.009331 -0.002019 0.007625 0.018891 0.006000 0.031079 
+-0.005098 0.007287 0.018934 0.027731 -0.003074 0.001029 
+-0.010769 0.012308 0.018462 -0.000863 0.026307 -0.017682 
+-0.018302 0.034292 0.019811 0.054734 -0.019243 -0.037124 
+-0.015236 -0.007045 0.044089 0.000683 -0.005900 0.016091 
+-0.008023 -0.001433 0.007200 -0.003528 -0.000978 -0.000132 
+-0.001286 0.007767 -0.002769 -0.002716 0.006564 0.000658 
+-0.022334 -0.006241 0.001838 -0.025724 -0.012126 0.010709 
+-0.011081 -0.013350 0.020095 -0.008293 -0.013333 0.074634 
+-0.015117 -0.030730 -0.033212 0.020746 -0.041322 0.065867 
+0.015090 -0.013232 0.059127 -1.463636 -1.781818 5.136364 
+-0.979167 -1.447917 4.947917 -0.866379 -1.327586 5.034483 
+-0.790000 -1.240000 4.680000 -0.007067 -0.003696 0.034127 
+0.001864 0.003154 0.012126 0.005818 0.002518 0.002953 
+0.001058 -0.001622 0.002686 0.002311 0.001151 -0.001115 
+0.011001 0.001949 -0.002244 -0.001921 0.011581 0.008850 
+-0.000885 0.015056 -0.007523 0.002865 0.001349 -0.009342 
+0.007483 0.001329 -0.011820 0.007684 0.002507 -0.010464 
+0.005206 0.002345 -0.004205 0.003680 -0.000212 -0.001062 
+0.002892 0.002834 -0.005958 0.001233 0.007779 -0.011733 
+0.006521 0.009743 -0.001964 0.007898 0.002962 -0.003554 
+0.006376 0.000529 -0.004259 0.003987 -0.000723 -0.002624 
+0.001482 0.001101 -0.000565 -0.000290 0.000453 0.000839 
+-0.001426 -0.000803 -0.002139 0.000810 -0.000109 -0.002562 
+0.000341 -0.002790 -0.003693 0.003688 -0.002373 -0.001334 
+0.003185 -0.001811 -0.000625 -0.001723 -0.002775 -0.000823 
+-0.005755 0.009644 -0.001866 0.000886 0.002005 -0.000017 
+-0.002170 -0.002705 0.002227 0.004531 -0.008529 -0.001790 
+0.003156 -0.011045 0.000947 -0.001501 -0.007404 -0.003402 
+-0.003097 -0.004625 -0.005504 -0.001195 -0.001040 -0.007670 
+0.003003 0.001934 -0.006387 0.004265 0.001762 -0.000690 
+0.001466 0.000086 0.003284 0.002408 -0.001221 0.000925 
+0.002313 -0.004308 0.000642 0.001936 -0.004557 0.001708 
+0.001868 -0.004500 0.001121 0.002861 -0.005804 -0.005292 
+0.001963 -0.003204 -0.010040 -0.001406 -0.000151 -0.008988 
+-0.009867 -0.001778 -0.011741 -0.011850 -0.001223 -0.018019 
+-0.006663 0.001694 -0.026038 0.000069 0.015838 -0.023483 
+0.005522 -0.011322 -0.007703 0.007595 -0.006361 -0.004181 
+0.009940 -0.011901 0.005212 0.005246 -0.016493 0.013663 
+0.021667 -0.015417 0.058750 0.026863 0.013471 0.034373 
+-0.001689 0.033087 0.037090 0.004969 -0.025525 0.076235 
+-0.001625 -0.055091 0.159585 0.095579 -0.014421 0.005410 
+-0.012389 0.010987 0.054233 0.003940 -0.008886 0.018818 
+0.002086 -0.008421 -0.003089 -0.002505 -0.001660 -0.007225 
+-0.016923 0.005612 -0.006655 -0.011970 0.009070 0.002818 
+-0.011549 -0.006620 0.001690 -0.004963 -0.004479 0.013193 
+-0.005777 -0.003763 0.033698 0.006320 0.017896 0.046753 
+-0.019043 0.008101 0.132457 0.006399 0.008865 0.110941 
+-0.007355 -0.005343 0.047681 -1.533333 -1.533333 5.181818 
+-1.392857 -1.636364 5.941558 -1.260204 -1.614796 6.221939 
+-1.036827 -1.512748 5.949008 -0.603448 -1.181034 4.603448 
+-0.003784 -0.003343 0.016777 -0.002495 -0.001423 -0.003221 
+-0.001577 -0.004011 0.004585 -0.002520 0.001036 0.000966 
+0.006052 0.003481 -0.000665 0.003959 0.004387 0.000891 
+0.000778 -0.001036 0.000218 0.000444 0.000873 -0.001946 
+0.005538 -0.000795 -0.008404 0.006042 0.001741 -0.003552 
+0.002108 0.005057 -0.004202 0.001167 0.006605 -0.000548 
+-0.001137 0.008493 0.001744 0.000473 0.005767 -0.010191 
+-0.001554 0.013848 -0.007935 -0.001916 0.011639 -0.000274 
+0.002862 0.001431 -0.004146 0.001548 0.004645 -0.002419 
+-0.000571 0.003022 -0.001552 0.000233 -0.001085 -0.000620 
+-0.002576 0.000000 -0.000985 -0.000715 0.000228 0.000434 
+0.002171 -0.000251 -0.000294 0.005026 0.002083 -0.002943 
+0.005170 -0.000019 -0.002306 0.001714 -0.001980 -0.000528 
+-0.000552 -0.000395 0.000305 -0.000500 0.001764 -0.002183 
+-0.001595 0.001480 -0.003247 0.004781 0.004948 -0.005059 
+-0.000032 0.001498 -0.000634 -0.000043 -0.002499 -0.000588 
+-0.001215 -0.000877 -0.001538 -0.000709 -0.001805 -0.001440 
+0.002765 0.004391 -0.000669 0.004531 0.004453 -0.001484 
+0.000887 0.000113 0.000308 -0.000177 -0.000124 -0.000214 
+-0.000614 -0.001214 -0.000788 -0.000279 -0.003283 -0.000056 
+0.001879 -0.005591 -0.000331 0.002782 -0.006848 -0.005139 
+-0.009574 -0.005606 -0.011424 -0.003944 0.003577 0.002788 
+0.002990 0.003471 0.028749 0.587065 -0.099502 4.228856 
+0.909524 0.080952 4.161905 0.013447 -0.001844 0.023827 
+0.004925 0.008978 -0.002534 -0.010306 -0.001469 -0.011500 
+-0.003248 -0.012573 -0.010076 0.015579 -0.021374 0.001477 
+0.022501 -0.010666 0.013570 -0.012952 -0.005238 -0.006476 
+-0.013616 -0.019806 -0.006684 -0.006001 0.014525 0.003196 
+-0.016295 0.006427 0.057302 0.001230 -0.007180 0.009049 
+-0.017995 0.018248 -0.020735 -0.007802 0.003233 -0.014996 
+-0.003873 -0.002410 -0.013146 -0.005323 0.003149 -0.006160 
+-0.006562 0.002554 0.005127 -0.001537 0.000091 -0.000668 
+0.000338 0.005724 0.002444 -0.002118 0.008149 0.005289 
+-0.012209 0.014788 0.025053 -0.007333 0.036000 0.000000 
+-0.029381 -0.066108 0.029167 0.005091 0.040668 -0.057220 
+-0.012582 -0.001656 0.031590 -1.502058 -1.189300 5.596708 
+-1.457386 -1.389205 5.965909 -1.216578 -1.320856 5.713904 
+-0.869010 -1.009585 4.971246 -0.547414 -0.452586 3.500000 
+-0.002406 -0.002897 0.018089 -0.000127 -0.001073 0.003900 
+-0.001864 0.006422 -0.007921 0.001688 0.012495 -0.011819 
+0.000000 0.001290 0.002396 -0.000609 0.002804 0.002949 
+0.000738 -0.001059 -0.002425 0.010490 -0.000576 -0.002821 
+0.001312 -0.002087 -0.000836 -0.004735 -0.005003 0.005780 
+-0.000924 -0.003083 0.006286 -0.000155 -0.000140 -0.000414 
+0.001211 0.004048 -0.002120 0.004013 0.006434 -0.000309 
+-0.002072 0.006841 -0.001752 -0.004336 0.006883 -0.006152 
+-0.002990 0.004347 -0.001037 -0.003407 0.000472 0.001722 
+-0.004291 -0.002107 0.003207 -0.001176 -0.003130 0.004706 
+-0.002861 -0.001136 0.004506 -0.001873 0.000264 0.001163 
+-0.000213 0.001757 -0.002587 -0.000414 0.000645 -0.003270 
+-0.001516 -0.001712 -0.000980 -0.001327 -0.003074 -0.000831 
+0.000125 0.000046 -0.002177 -0.001696 0.003384 -0.009043 
+-0.000911 0.005114 -0.010622 0.002887 0.001448 -0.010135 
+-0.001078 0.005682 -0.005102 0.002088 0.007205 -0.001145 
+-0.001231 0.000615 0.001077 0.000362 0.002220 0.000189 
+0.001458 0.001794 -0.001155 0.002761 0.001800 -0.001286 
+0.002113 0.003390 0.000307 0.001003 0.003758 -0.001457 
+-0.001202 0.002651 -0.002725 -0.001057 0.001056 -0.001480 
+0.000842 -0.000842 -0.007579 -0.008600 0.003119 -0.007207 
+-0.006520 0.004516 -0.005840 0.001954 0.005492 0.029346 
+1.261484 0.212014 5.685513 1.856771 0.197917 6.723958 
+2.082474 0.280928 6.670103 2.106383 0.421986 5.638298 
+0.017502 0.004212 0.029958 -0.003440 0.002081 -0.007340 
+-0.017113 -0.003024 -0.016808 0.018765 -0.008961 0.007219 
+0.029059 -0.008150 0.001570 0.007245 -0.039260 -0.051792 
+0.015000 -0.029360 -0.003262 0.003603 0.003267 -0.001659 
+-0.010916 0.019084 -0.011434 -0.011113 0.023277 -0.045558 
+-0.005362 0.006190 -0.026431 -0.000821 0.001119 -0.017209 
+0.000369 -0.004871 -0.010214 0.001586 -0.000887 -0.006206 
+0.010020 0.000442 -0.002504 0.005741 -0.001792 0.001767 
+-0.001778 0.004519 -0.000943 -0.000547 -0.001190 0.000403 
+0.006434 0.006418 -0.008490 -0.038575 -0.073315 0.142722 
+-0.043548 -0.008379 -0.166224 0.017564 0.029307 -0.052281 
+-0.016449 0.000531 0.041838 -1.405512 -0.940945 6.039370 
+-1.248571 -1.282857 5.957143 -1.021164 -1.283069 4.976191 
+-0.856322 -1.014368 3.695402 -0.817204 -0.634409 2.641577 
+-0.004269 -0.003255 0.018867 -0.000859 -0.000578 0.004934 
+-0.004622 0.002156 -0.009541 -0.003420 0.003404 -0.006220 
+-0.000167 0.007854 0.000958 -0.000945 0.007623 0.001744 
+0.001296 0.001382 0.003328 0.000275 -0.003703 0.004097 
+-0.001769 -0.004546 0.004989 -0.004036 -0.002002 0.004910 
+-0.000809 -0.000813 0.004852 -0.001822 -0.002732 0.001440 
+0.002352 -0.002850 -0.001211 0.004424 -0.002064 -0.000295 
+0.001120 0.001280 0.000000 -0.003182 0.003680 -0.001558 
+-0.005536 0.002605 -0.000380 0.000267 0.003780 -0.000059 
+0.007351 0.004199 -0.001576 0.004316 0.007303 -0.005436 
+-0.000171 0.003596 -0.000157 -0.002137 -0.002581 0.002701 
+-0.005719 -0.002940 0.002848 -0.000847 -0.003145 -0.002420 
+-0.001098 -0.000970 -0.005180 0.000411 -0.002160 -0.004052 
+-0.004424 0.000012 -0.007027 -0.001993 0.003275 -0.009065 
+-0.001179 0.000880 -0.008521 0.001152 0.001984 -0.006782 
+0.003632 0.003741 -0.005575 -0.000641 0.004078 -0.005593 
+-0.000755 0.000651 -0.000104 0.005126 0.002476 -0.002221 
+0.000972 0.001179 -0.003020 0.002782 0.000744 -0.000248 
+0.003409 0.001485 -0.000742 0.003828 0.002324 -0.002427 
+0.004238 0.004272 0.000810 0.000499 0.006568 -0.000482 
+0.005314 0.012423 -0.019509 -0.014945 0.012629 -0.023044 
+-0.002120 0.008348 0.002117 1.003534 0.650177 3.607774 
+1.660050 0.322581 5.593052 2.309051 0.200883 6.571744 
+2.665025 0.307882 6.807882 2.647059 0.574394 6.110727 
+1.764045 0.741573 4.252809 0.009953 0.002690 0.016077 
+-0.000435 0.002571 -0.001311 -0.021385 0.046875 -0.033414 
+-0.045042 0.125017 -0.036557 -0.030072 0.027827 0.025936 
+-0.020151 -0.005414 0.007934 -0.013212 -0.004687 0.004069 
+-0.008849 -0.001009 0.003693 0.002430 0.002056 -0.003866 
+0.001785 -0.004811 0.004628 -0.001797 0.000638 0.001199 
+-0.006316 0.005474 -0.010947 0.003283 0.000328 -0.018246 
+0.013065 -0.000945 -0.009567 0.015133 0.005996 -0.006091 
+0.007693 0.006522 -0.008975 0.008277 0.008406 -0.013007 
+0.024407 0.022157 -0.038869 -0.050779 -0.067448 0.103074 
+0.073864 0.170580 -0.101877 0.023840 0.054822 -0.047046 
+-0.006543 0.006459 0.023542 -0.786957 -0.326087 4.791304 
+-0.776435 -0.909366 5.567976 -0.733333 -1.157333 5.021333 
+-0.638484 -1.122449 3.623907 -0.002401 -0.006491 0.019225 
+0.000282 -0.002250 0.002695 0.002056 -0.001431 -0.003533 
+-0.011092 -0.006522 0.003069 -0.009254 -0.007940 0.002790 
+-0.008222 0.000717 -0.001723 -0.002255 0.009730 0.001188 
+-0.001733 0.001154 -0.001678 0.001637 -0.000485 -0.000575 
+0.002877 -0.002238 -0.000941 0.001484 -0.000611 -0.000627 
+0.001188 0.000956 0.000681 0.001854 0.000168 -0.001209 
+0.001532 -0.002415 -0.003534 -0.000476 -0.005402 -0.000809 
+-0.003806 -0.006455 0.004726 -0.005670 -0.008681 0.005344 
+-0.003840 -0.006720 0.001920 -0.001166 -0.000922 0.001474 
+0.002963 0.002222 0.000781 0.002983 -0.000425 -0.001282 
+0.000593 -0.000692 -0.000320 -0.003443 -0.004026 -0.001335 
+-0.007196 -0.002812 -0.000572 -0.005758 0.000373 -0.002044 
+0.001483 -0.001810 -0.012017 0.004232 -0.001879 -0.009167 
+0.000381 -0.001204 -0.002511 -0.000063 0.000731 -0.003881 
+-0.004088 -0.001338 -0.004308 -0.000353 0.000520 -0.001922 
+-0.000746 -0.000165 0.000041 -0.000519 0.000354 0.000073 
+-0.000240 -0.000240 -0.001600 -0.000473 -0.000038 -0.000883 
+-0.000861 0.001100 -0.000249 -0.000763 0.000509 -0.003910 
+0.002145 -0.000883 -0.003448 0.000921 -0.000842 0.001157 
+0.000914 0.003807 0.005662 0.000482 0.004595 0.001435 
+0.003584 0.008075 -0.011803 -0.009139 0.004630 -0.025522 
+0.001699 0.005035 0.002186 0.986928 0.385621 2.581699 
+1.491400 0.294840 4.171990 2.050575 0.298851 5.429885 
+2.386768 0.483461 6.170484 2.203947 0.776316 6.026316 
+1.316832 0.846535 4.693069 0.006986 0.003610 0.019714 
+-0.003919 -0.010178 -0.012515 -0.018400 -0.006490 -0.037967 
+-0.003207 0.001461 -0.004486 -0.034401 0.011364 0.000629 
+-0.023269 0.000898 0.005747 -0.010123 0.008845 -0.005020 
+0.009720 0.015072 -0.014534 0.001364 0.002178 -0.002997 
+-0.002094 0.002053 0.003235 -0.013793 -0.003054 -0.000254 
+-0.001518 0.002556 0.001167 0.008603 -0.004551 -0.015679 
+0.018075 0.004915 -0.011614 0.007111 0.001015 -0.003741 
+-0.000573 -0.000707 -0.002808 0.000905 0.002311 -0.003752 
+0.006946 0.000000 -0.010420 0.005458 -0.003297 0.035705 
+-0.023565 0.054127 -0.019670 0.020625 0.005218 -0.030849 
+0.000076 -0.002449 -0.002104 -0.005303 0.002116 0.026923 
+-0.255319 -0.412766 4.106383 -0.141129 -0.725806 4.104839 
+-0.000116 -0.010373 0.025902 0.004864 -0.002790 -0.000538 
+0.007212 0.004860 -0.018173 -0.004976 0.000740 -0.006246 
+-0.001717 -0.001965 0.000307 0.002124 -0.000195 -0.001505 
+0.001817 0.007409 -0.008266 -0.003273 0.007153 0.002748 
+-0.000995 -0.001815 0.004001 0.002589 -0.001060 0.000369 
+0.002210 0.000826 -0.000448 0.000825 0.004286 -0.002298 
+-0.000005 0.003663 -0.001629 0.003057 -0.001392 -0.001431 
+0.001715 -0.001766 -0.002947 -0.000283 -0.004113 0.000354 
+-0.001778 -0.004194 0.002084 -0.002420 -0.002366 -0.000691 
+-0.001569 0.000091 -0.002262 0.000000 0.001094 -0.001016 
+-0.001129 -0.000342 0.001944 -0.000808 -0.000434 0.001566 
+-0.003134 -0.000854 -0.001145 -0.001373 -0.003340 0.000334 
+-0.002618 -0.003477 0.001346 -0.001717 -0.001795 0.000365 
+0.002534 0.001094 -0.002207 0.004694 0.001919 -0.005598 
+-0.000568 0.001630 0.001160 -0.004933 -0.000493 0.002096 
+-0.001526 0.001287 -0.001496 0.001879 0.005572 -0.001377 
+0.000302 0.000720 0.000947 0.000865 0.000565 -0.000079 
+0.000119 -0.000851 0.000267 -0.000081 0.000770 -0.000701 
+0.000209 0.001285 -0.003567 -0.002480 0.000674 -0.002409 
+0.001166 0.001769 -0.001400 -0.000057 0.000314 0.001967 
+0.001361 -0.000911 0.002943 -0.000107 -0.002287 0.001018 
+-0.002929 -0.002637 -0.004009 -0.003985 0.002859 -0.011571 
+0.001019 0.004792 -0.008890 0.005791 0.004163 0.003034 
+0.989796 0.227891 2.027211 1.239193 0.374640 3.749279 
+1.414493 0.544928 4.811594 1.288256 0.615658 4.861210 
+0.785311 0.435028 3.598870 0.000962 -0.001038 0.003423 
+0.007974 0.004479 -0.028902 0.004922 -0.001583 -0.010813 
+-0.009672 -0.003205 0.008336 -0.009528 0.002550 -0.002368 
+-0.002588 0.013533 -0.022075 -0.004071 0.007603 -0.019253 
+-0.012247 0.001842 0.001016 -0.014113 -0.000440 0.008966 
+0.001171 -0.001181 0.003502 0.000996 0.003946 0.002969 
+0.006823 0.002487 0.001735 0.009127 0.003817 0.002618 
+0.010612 0.001606 0.000584 0.008952 -0.000100 -0.004596 
+0.000205 -0.001462 -0.003772 0.003104 0.003083 -0.005011 
+0.005106 0.004757 -0.003052 0.015983 0.010106 -0.014281 
+0.007513 -0.010461 -0.007756 0.004782 0.001105 -0.004931 
+0.008404 0.000811 -0.009115 0.004517 0.002512 -0.003057 
+0.004561 -0.000641 0.007055 0.004303 -0.002320 0.008358 
+0.003608 -0.001578 0.002635 0.002117 0.000753 -0.001638 
+0.001605 -0.001122 0.000578 0.003430 0.000189 -0.000099 
+0.002083 0.000611 -0.000441 0.001754 0.001913 -0.004563 
+-0.002270 0.002839 -0.000958 -0.000037 0.003217 -0.000024 
+-0.003503 -0.001774 0.004154 -0.004268 -0.001981 0.000034 
+-0.001907 0.001589 0.000382 -0.001606 0.004213 -0.003470 
+0.001136 0.001944 -0.002096 -0.001300 -0.001781 0.001492 
+-0.001561 -0.005738 0.004027 -0.000777 -0.006085 0.000963 
+0.000995 -0.003424 -0.001006 -0.000357 -0.001720 -0.001223 
+0.001261 -0.001215 -0.002116 0.001730 0.002336 -0.001860 
+0.002007 0.002573 -0.001067 0.004136 0.003821 -0.002895 
+0.003887 0.006508 -0.005189 0.001152 0.000753 -0.004118 
+-0.001294 -0.000727 0.002259 -0.000576 -0.003762 0.004348 
+0.001057 -0.000268 0.002903 -0.000676 0.000641 -0.001156 
+0.000017 -0.000102 -0.000394 -0.000014 -0.000753 -0.000284 
+0.000574 0.000917 -0.003446 -0.000175 0.002433 -0.001828 
+0.000435 0.003277 -0.000769 0.001246 0.001941 -0.002356 
+0.003255 0.003099 -0.002448 0.001686 0.004535 -0.001899 
+0.000529 0.003942 -0.003677 -0.002673 0.000717 -0.003638 
+0.000470 -0.001212 -0.001409 -0.000703 -0.001764 -0.001371 
+0.002180 -0.002203 -0.000579 0.000002 -0.000058 -0.000048 
+0.002237 0.002827 0.000541 0.001676 -0.001433 -0.005065 
+-0.006943 0.006244 -0.018128 -0.003154 0.001432 -0.022051 
+0.002399 0.001546 -0.001514 0.005022 0.001059 0.013348 
+0.004956 0.000653 0.019508 0.003686 0.001005 0.018508 
+0.000667 0.000454 0.005723 0.001072 0.004974 -0.021379 
+0.003233 0.008673 -0.004421 -0.003152 -0.003669 -0.000777 
+-0.007401 0.003728 0.010012 -0.004106 -0.002753 0.010095 
+-0.002895 0.001718 0.001640 -0.003350 0.000665 0.001460 
+-0.003273 -0.004091 0.005696 -0.004201 -0.011254 0.008072 
+-0.000668 -0.012321 0.004675 -0.005503 -0.005882 0.004327 
+-0.006061 -0.002950 -0.002472 -0.001580 -0.005613 -0.001148 
+-0.005590 0.002535 -0.000679 0.003963 0.012400 -0.001037 
+0.007926 0.018290 -0.009024 0.004839 0.018941 -0.005299 
+0.003246 0.012696 -0.004776 0.001497 0.002980 -0.001300 
+-0.004874 -0.010549 0.011500 -0.003111 -0.005932 0.005793 
+-0.002129 -0.002311 0.001903 0.001618 -0.000788 -0.000606 
+0.006815 -0.002529 -0.003567 0.011140 -0.000564 -0.009539 
+0.008981 0.002226 -0.009827 0.004570 0.003712 -0.005831 
+0.001569 0.002887 -0.004865 0.001863 -0.001099 -0.003368 
+0.001464 -0.000271 -0.002138 -0.002049 -0.000615 -0.000758 
+-0.004356 0.001516 0.001759 -0.006103 0.005877 -0.002898 
+-0.003986 0.000582 -0.005754 0.001429 0.000395 -0.001167 
+0.001164 0.000254 -0.000980 0.001737 0.001540 -0.001020 
+0.003577 0.003252 -0.001951 0.005642 0.000600 -0.002162 
+0.004569 0.000685 -0.003752 0.004921 0.000911 -0.001397 
+0.002488 0.001142 0.000784 -0.000503 0.003399 0.001034 
+-0.000883 0.001733 0.000858 0.000368 -0.000355 0.000238 
+0.000301 -0.003738 0.002467 0.002216 -0.003248 0.001942 
+0.001912 -0.002703 -0.001318 0.001772 -0.000342 0.000630 
+0.000502 0.004918 -0.002908 -0.000968 -0.000248 -0.001485 
+-0.003460 -0.006524 -0.000347 -0.006082 -0.004801 0.000265 
+-0.000759 0.001312 -0.001101 0.001891 0.002521 -0.001387 
+-0.001543 0.000349 0.003369 -0.001365 -0.002730 0.004762 
+0.000298 -0.001055 0.003462 0.000455 0.002520 0.000797 
+-0.001636 0.002269 -0.000792 0.001918 0.000579 -0.000470 
+0.001797 0.000377 -0.002365 0.004488 0.000638 -0.000213 
+-0.000375 0.003986 -0.003631 -0.003100 -0.000944 -0.004610 
+-0.001112 0.001020 -0.000665 0.000670 -0.000111 0.007268 
+-0.004632 -0.001504 0.003602 -0.005553 -0.002033 0.003467 
+-0.005614 -0.006334 0.000985 0.001247 -0.000085 -0.001765 
+-0.001454 0.000117 -0.011285 -0.003824 -0.001432 -0.011028 
+-0.005723 -0.001072 -0.006547 -0.006242 -0.000112 -0.007382 
+-0.007994 0.000471 -0.013653 0.008567 0.014210 -0.034921 
+0.004881 0.024320 -0.002663 -0.001619 0.007930 -0.002166 
+0.001958 0.000527 0.006026 -0.000288 -0.003398 0.013365 
+-0.009689 0.000731 0.002638 -0.008206 -0.000378 -0.002213 
+-0.008002 -0.000931 -0.003722 -0.007115 -0.005669 -0.001533 
+-0.004902 0.000918 -0.002059 0.002977 0.004700 -0.008969 
+0.005347 -0.003000 -0.012130 0.000411 -0.003556 -0.005989 
+-0.006828 -0.000271 0.006151 -0.003128 0.005409 0.007966 
+0.010232 0.002078 -0.001955 0.011705 -0.002868 -0.009093 
+0.004611 -0.006098 -0.003707 -0.017838 -0.022007 -0.005451 
+-0.017146 0.005209 0.011399 0.001320 0.005202 -0.002135 
+0.004559 0.004239 -0.004740 -0.001993 0.006346 -0.002977 
+-0.003346 -0.002805 -0.003150 -0.014064 0.001729 0.000468 
+-0.001482 0.003140 -0.001550 0.000884 0.002050 -0.006414 
+0.001285 0.003990 -0.006629 0.000349 0.004245 -0.005327 
+-0.000030 0.001238 -0.004391 0.001647 0.001147 -0.003106 
+0.000615 -0.000023 -0.002501 -0.000191 -0.001417 -0.000883 
+-0.000872 -0.000922 0.001780 -0.000965 -0.003043 0.002078 
+-0.002318 -0.002828 0.002223 -0.004102 -0.001164 0.001171 
+-0.001657 0.001254 -0.000416 0.002154 0.001992 0.000081 
+0.002338 0.000984 0.000668 0.000662 -0.001899 -0.000503 
+-0.001901 -0.000858 -0.000143 -0.003114 0.001627 -0.000395 
+-0.001807 0.002391 -0.000600 -0.001685 0.001981 -0.000593 
+-0.002311 0.001921 -0.000045 -0.003544 0.000014 0.002356 
+-0.003240 -0.003070 -0.000810 -0.000435 -0.003113 0.000886 
+0.002858 -0.000072 -0.001643 0.001953 0.001311 -0.001172 
+-0.002459 -0.000170 0.001193 -0.003992 -0.002586 0.004047 
+0.004290 0.008417 -0.005148 0.001614 0.000670 0.001746 
+0.000000 0.004918 -0.002459 0.002186 0.004354 -0.000009 
+-0.000866 0.001033 -0.000198 0.000931 -0.000021 0.001235 
+0.000306 -0.001026 0.001588 -0.001884 0.001644 0.002327 
+0.000537 0.001489 -0.000622 0.001843 -0.000247 -0.003078 
+0.000952 0.006667 -0.003810 -0.001300 0.000574 -0.000114 
+-0.002188 0.001055 -0.000187 -0.000124 0.000238 0.001378 
+-0.001293 -0.003368 0.002070 -0.002444 -0.001052 0.002268 
+-0.002462 0.001374 0.003263 -0.002201 0.001630 -0.000164 
+-0.000519 -0.000995 -0.002380 0.001686 -0.000621 -0.004615 
+-0.000702 0.004006 -0.000994 -0.002591 0.006694 -0.002920 
+-0.004565 0.009354 -0.007572 -0.003982 0.008287 -0.015633 
+-0.001873 -0.000810 -0.009805 0.000321 -0.000834 -0.001468 
+-0.005864 -0.006951 -0.000568 -0.008387 -0.006012 -0.007994 
+-0.007169 -0.010892 -0.004625 -0.002854 -0.002448 0.001536 
+-0.001479 -0.002807 0.001530 -0.000661 -0.001312 0.000583 
+-0.000816 0.003659 -0.001792 0.000333 0.008911 -0.011999 
+0.004148 0.005761 -0.018837 0.005040 0.006293 -0.010068 
+0.001044 0.001633 -0.001055 -0.000301 -0.000769 0.000205 
+0.000306 -0.003463 -0.010011 0.014086 -0.003354 -0.022000 
+0.013075 -0.002894 -0.005975 0.007124 0.012348 -0.008727 
+-0.005025 0.006257 -0.003011 -0.001928 0.006643 -0.003183 
+-0.001532 0.003887 -0.004808 -0.006020 0.002787 -0.002231 
+-0.016315 -0.004526 0.000121 -0.017756 -0.006509 -0.001781 
+-0.010334 -0.000826 -0.005921 -0.002830 -0.001014 -0.004610 
+-0.000695 -0.001334 -0.001662 -0.000339 -0.000386 -0.000873 
+-0.001180 0.002193 -0.001897 0.003016 0.002302 -0.002075 
+0.001471 0.001083 -0.004266 -0.001470 -0.000614 -0.000529 
+-0.000954 -0.001270 0.001000 0.001619 0.000613 -0.001553 
+0.002886 0.001796 -0.003212 0.001927 0.001010 -0.000229 
+-0.001089 0.001089 -0.001371 -0.000936 0.000703 -0.000699 
+0.003223 0.003099 -0.003099 0.006069 0.003066 -0.008384 
+0.006416 0.004892 -0.008437 0.003030 0.004007 -0.004333 
+-0.001145 -0.000251 -0.000496 -0.004015 -0.003968 -0.000078 
+-0.003020 -0.003732 -0.000712 -0.000513 -0.000496 -0.000991 
+0.001779 -0.000163 -0.000049 0.000500 -0.001751 0.002419 
+-0.003160 -0.004472 0.003830 -0.005378 -0.005798 0.000000 
+-0.004370 -0.002689 0.005378 -0.000984 -0.004647 0.002442 
+0.002423 0.000128 -0.000638 0.004571 0.002705 0.000914 
+0.001022 0.008873 -0.002904 -0.001600 0.007440 -0.003200 
+-0.002262 0.002386 0.000412 -0.002127 0.001247 0.001166 
+-0.002650 -0.000315 0.000530 -0.000948 -0.001557 -0.001014 
+-0.000356 -0.000014 -0.003219 -0.001208 0.000203 -0.002222 
+0.000468 0.002120 0.000371 0.000580 0.001543 0.001238 
+-0.000178 -0.001428 -0.002001 0.000172 0.002288 -0.002802 
+-0.000410 0.001096 -0.000812 0.000247 0.002177 -0.001306 
+0.002593 0.006494 -0.002012 0.003366 0.000609 0.000356 
+-0.005120 0.001855 -0.007297 0.002947 -0.000760 -0.000011 
+0.000086 0.000124 0.000076 -0.000838 0.002429 -0.000941 
+-0.002625 0.002392 -0.002773 -0.005933 -0.002592 0.003289 
+-0.002656 -0.002764 0.004843 0.001511 0.002388 -0.002822 
+-0.003832 0.013143 -0.012940 0.018115 -0.006277 -0.012547 
+0.001658 -0.000727 -0.001394 -0.001035 -0.004195 0.005770 
+-0.001085 -0.002340 0.005338 -0.000242 0.001185 -0.003106 
+0.001050 0.006598 -0.014957 0.003837 0.008283 -0.014190 
+0.010960 0.000555 -0.004870 0.000332 -0.000277 -0.000073 
+-0.001631 0.002039 -0.000774 -0.000110 -0.000207 0.000000 
+-0.000417 -0.000357 -0.000019 -0.001523 0.000071 -0.000660 
+0.002281 0.000311 -0.001108 0.003924 0.001386 -0.004669 
+-0.001032 0.003334 -0.008007 -0.005792 0.005913 -0.006117 
+-0.003709 0.005473 -0.006223 -0.001326 0.003518 -0.004589 
+0.000426 0.003998 -0.004764 0.000366 0.006606 -0.008516 
+0.000675 0.007143 -0.012262 0.003183 0.006859 -0.004939 
+0.002483 0.002512 -0.004548 0.001240 0.001957 -0.004476 
+-0.000746 0.001478 -0.002512 0.000677 -0.000343 0.000051 
+-0.000061 -0.000875 -0.000376 -0.000822 -0.000902 -0.001285 
+-0.002769 0.001045 -0.002282 -0.000499 0.001216 -0.000337 
+-0.000297 -0.001450 -0.000571 0.000582 -0.001098 -0.001809 
+-0.000950 -0.000250 -0.002850 0.002413 -0.002984 -0.005270 
+0.001439 -0.002159 -0.005726 0.004295 0.002063 -0.002577 
+-0.000638 0.002024 0.000394 -0.004285 -0.001156 0.001338 
+-0.002318 -0.002800 0.004727 -0.001458 -0.001039 0.001983 
+0.000270 -0.000158 -0.000555 -0.000463 -0.000176 -0.001676 
+-0.000305 -0.001988 -0.000456 0.000719 -0.003047 0.001437 
+0.000424 -0.000379 -0.003302 -0.000449 -0.001223 -0.001469 
+-0.000481 -0.000833 -0.000321 0.000647 0.000667 -0.000162 
+-0.004087 -0.002210 0.001584 -0.003583 0.000000 0.003583 
+-0.001697 -0.000007 0.001029 0.000796 -0.000419 -0.001760 
+0.000510 -0.000756 -0.001181 -0.001253 0.000351 0.000501 
+-0.005116 -0.002324 0.002775 0.001065 -0.000796 0.000808 
+0.000399 0.000077 0.000277 0.004154 -0.000397 -0.000176 
+0.002451 0.001998 0.002270 0.000744 0.003682 0.001199 
+-0.001142 0.003109 -0.001458 0.002129 0.003939 -0.005160 
+0.003999 0.003836 -0.005301 0.004884 0.002750 -0.003850 
+0.002424 0.002827 -0.005333 0.002487 0.000553 -0.007680 
+-0.000257 -0.003025 -0.008369 -0.005269 -0.002216 -0.006575 
+-0.002308 -0.000621 -0.005982 -0.003137 -0.002575 -0.006892 
+-0.001569 -0.000565 -0.009892 -0.002350 0.001238 -0.008234 
+-0.001698 0.002545 -0.001923 -0.001090 0.000931 -0.001689 
+-0.003530 0.008226 -0.012348 -0.003799 0.046962 -0.012445 
+-0.015309 -0.015807 0.040083 0.007634 -1.519084 4.809160 
+-0.030612 -1.469388 5.102041 -0.142132 -1.294416 4.827411 
+-0.003850 -0.004093 0.034950 0.002498 0.005776 0.013899 
+0.006877 0.004144 -0.014390 0.011587 0.009860 -0.024047 
+-0.006063 0.002331 -0.013923 -0.000757 -0.004179 -0.006815 
+0.009005 -0.001088 0.000225 0.004861 -0.002863 0.003604 
+-0.004133 -0.002389 0.001761 -0.006842 0.004496 -0.006680 
+0.003877 0.004527 -0.011379 0.006612 -0.001334 -0.008574 
+0.005373 -0.000080 -0.008296 0.006206 0.003110 -0.006550 
+-0.002873 0.000206 -0.008921 -0.000110 0.001867 -0.008454 
+-0.000122 -0.000152 -0.006932 -0.002191 0.006287 -0.003669 
+-0.000636 0.006204 -0.000022 -0.000984 0.001685 0.001168 
+0.001637 -0.001477 0.000770 0.001729 -0.002720 -0.001597 
+0.001930 0.000363 -0.000368 -0.001232 -0.000939 -0.001258 
+-0.004957 -0.000578 -0.001923 -0.004947 -0.003476 0.001723 
+-0.001165 -0.002750 -0.001481 -0.001819 -0.001436 -0.000239 
+0.000111 -0.002176 -0.002877 -0.001002 -0.003787 -0.003930 
+0.002935 -0.002160 -0.003668 0.000622 -0.001345 -0.000482 
+0.001863 0.003373 -0.004222 -0.001050 0.001995 -0.002940 
+-0.001693 0.000000 -0.001693 -0.002103 0.001057 -0.000338 
+-0.004591 0.001339 -0.000904 -0.006671 0.000537 -0.000981 
+-0.005339 -0.000816 -0.000250 -0.002216 -0.001323 0.001571 
+-0.002519 -0.000969 0.001986 -0.002101 -0.001456 0.001026 
+0.000122 -0.001222 0.000367 0.002801 -0.000140 0.001541 
+0.001851 0.004238 -0.008672 0.001569 0.003041 -0.007120 
+0.000118 0.001758 -0.005161 -0.001824 0.000742 -0.004215 
+-0.000018 0.006069 0.001090 0.003501 0.003877 -0.006253 
+-0.001244 0.001565 -0.001399 -0.002634 0.003324 -0.000842 
+-0.006474 0.001328 -0.000331 -0.000603 0.000805 0.001308 
+0.000293 0.001397 0.000330 -0.001103 -0.000341 -0.001034 
+-0.000841 -0.000131 -0.003909 -0.003047 0.001269 0.001481 
+-0.004896 -0.000915 0.001962 -0.006834 -0.001787 -0.000725 
+-0.001409 0.002870 -0.000756 -0.007872 -0.000957 -0.000957 
+-0.006996 0.004129 -0.000057 -0.011264 0.001963 -0.002944 
+-0.008481 -0.002273 -0.005405 -0.002604 0.001049 -0.004325 
+0.002969 0.003560 -0.003863 -0.000104 0.005532 -0.007930 
+-0.001417 -0.000575 -0.001655 -0.001121 0.000724 0.000595 
+-0.004996 0.006332 -0.018902 -0.016901 -0.008545 -0.030356 
+0.000765 -0.000254 0.030845 -0.135747 -1.466063 5.683258 
+-0.085000 -1.712500 6.497500 -0.048035 -1.751092 6.578603 
+-0.003012 -1.632530 6.096385 -0.001269 -0.010013 0.039970 
+0.000323 0.002032 -0.001848 -0.000657 -0.001531 0.000711 
+-0.009902 -0.005132 0.007977 0.000865 -0.001013 0.001455 
+0.017604 0.012874 -0.019565 0.011145 0.018793 -0.009676 
+0.001326 0.004067 0.004733 0.002993 -0.000369 0.003775 
+0.001695 -0.000721 -0.002695 -0.000346 0.005124 0.000624 
+0.004705 0.006070 -0.003111 0.001360 0.000563 0.000677 
+-0.003130 0.000813 0.000034 -0.006207 -0.001024 0.000659 
+-0.006704 -0.002599 0.000256 -0.004457 0.000657 -0.001751 
+0.001024 0.001735 -0.003299 0.000605 0.002177 -0.003626 
+-0.000958 0.000488 -0.001852 0.002271 -0.001212 -0.002406 
+0.000864 -0.003050 -0.003071 -0.003549 -0.003247 -0.002333 
+-0.004015 -0.002515 0.001258 0.000443 -0.002020 0.000071 
+-0.001085 -0.000534 -0.002818 0.000499 0.001479 -0.000794 
+-0.000061 0.002038 -0.005445 0.000420 -0.001050 -0.000840 
+0.000397 0.000968 0.000596 0.000976 -0.002927 -0.001210 
+0.001233 -0.003291 -0.002411 -0.000967 -0.002802 -0.003293 
+-0.000941 -0.002612 -0.001644 0.000620 -0.002428 0.000329 
+-0.000660 -0.000439 -0.000733 -0.001893 -0.002204 -0.000940 
+-0.000423 0.000455 -0.004445 -0.000525 0.000610 -0.002248 
+-0.000620 -0.000481 0.001736 -0.000549 -0.001985 0.000408 
+-0.000493 0.000654 -0.001439 0.000203 -0.000705 -0.001139 
+-0.000068 0.001142 -0.000098 0.003786 -0.003860 -0.005106 
+0.005832 0.000120 -0.009068 0.004502 -0.001620 -0.006781 
+-0.004664 0.002130 -0.006867 -0.003958 0.001746 -0.005239 
+-0.002789 0.000511 -0.002199 -0.002371 -0.000915 0.000625 
+0.000262 -0.000770 0.002261 -0.000598 0.000850 -0.000527 
+-0.000186 0.006720 -0.000135 -0.003844 0.006026 -0.003740 
+-0.003884 0.001798 -0.009632 0.001232 -0.004245 -0.011659 
+0.000607 0.001744 -0.002416 -0.002253 -0.000336 -0.003295 
+0.000608 0.001273 0.000877 -0.000061 0.002206 0.000730 
+0.000889 0.000763 -0.000050 -0.000899 0.002774 -0.011621 
+-0.002419 0.010620 -0.012550 0.003654 0.006513 -0.001623 
+0.005212 0.000389 -0.003654 0.004835 -0.000740 -0.006290 
+0.005184 0.003207 -0.008876 0.006783 0.011637 -0.015295 
+0.006911 0.038846 -0.026814 -0.006894 0.016238 -0.026619 
+-0.001921 -0.002346 0.032718 -0.294372 -1.528139 6.783550 
+-0.221024 -1.849057 7.374663 -0.096852 -1.837772 7.092010 
+0.094937 -1.500000 6.170886 -0.001115 -0.003754 0.037473 
+0.002287 0.009812 -0.015166 0.007358 0.009057 -0.014717 
+-0.004435 -0.001674 0.003403 0.001246 -0.000212 -0.002537 
+0.014850 0.010537 -0.010743 -0.008026 0.018509 -0.025105 
+0.000529 0.005891 -0.006616 0.002269 0.002020 0.000903 
+0.003810 0.000765 -0.003823 0.003045 -0.001646 -0.006337 
+0.000178 0.000433 -0.001279 -0.000527 -0.000816 0.003861 
+-0.000007 -0.001371 0.004142 -0.003083 0.000513 -0.000777 
+-0.003943 -0.003274 -0.002604 -0.002821 -0.002597 -0.007633 
+0.000382 0.005504 -0.002184 0.003652 -0.001117 -0.006658 
+0.001713 0.000325 -0.003559 0.000524 -0.001048 0.001448 
+0.000479 0.000962 0.000668 0.000979 -0.001795 -0.001622 
+0.004849 -0.002250 -0.002919 0.005634 -0.000920 -0.006600 
+0.004553 0.001096 -0.007840 0.001132 0.004768 -0.007375 
+0.003118 0.005736 -0.003512 0.000166 0.002259 0.000303 
+-0.003060 0.000195 -0.000801 -0.002823 -0.001931 0.002526 
+-0.002174 -0.003102 0.002454 -0.001740 0.000568 0.000741 
+0.000789 0.002052 0.000829 0.000611 0.001788 0.001622 
+-0.002076 0.000934 0.002524 -0.003567 0.001550 -0.000978 
+-0.001714 0.000783 -0.004737 0.000989 -0.002357 -0.002929 
+-0.001209 -0.002928 -0.002726 0.001410 -0.003120 -0.000453 
+0.001678 -0.000744 0.001174 0.001987 0.003572 -0.001005 
+-0.002811 0.005042 -0.001278 0.000576 -0.002191 -0.003383 
+-0.000631 0.000580 -0.004068 -0.000408 0.000563 -0.001802 
+0.000605 -0.001614 -0.000605 0.000363 0.006820 -0.001643 
+0.002428 0.009935 -0.001636 0.004474 0.004635 -0.008980 
+-0.000050 0.001195 -0.003042 -0.001043 -0.000339 -0.000294 
+-0.001442 -0.000132 -0.001261 -0.002896 0.000027 -0.003001 
+-0.004916 0.001219 -0.006330 -0.003597 0.006985 -0.012544 
+-0.000250 0.002834 -0.013463 0.000040 -0.000035 -0.002706 
+0.002265 -0.004206 0.005269 -0.000730 -0.001510 0.004041 
+0.002658 0.003601 -0.005978 0.003474 0.005110 -0.007650 
+0.003456 0.003267 -0.002560 0.001019 0.003135 -0.002747 
+0.003934 0.003235 -0.006219 0.004146 0.002686 -0.002270 
+-0.005252 0.001151 0.004008 -0.005850 -0.004399 0.005657 
+-0.009348 -0.008998 -0.023395 0.001051 0.010864 -0.030763 
+-0.002216 -0.004083 0.029452 0.021645 -1.220779 6.181818 
+0.048701 -1.493507 6.691558 0.093333 -1.350000 5.960000 
+0.013453 -0.780269 4.282511 -0.001947 0.002174 0.019083 
+-0.000648 0.006861 -0.006139 0.005925 0.004957 -0.017655 
+-0.002020 0.002830 -0.008080 0.013930 0.005079 -0.005452 
+0.002968 0.001325 -0.001251 0.001262 0.000175 0.001296 
+0.001438 0.004637 0.001969 0.001440 0.005433 -0.000570 
+0.001021 0.001653 -0.002687 0.001479 -0.000523 -0.000642 
+0.001920 0.001765 -0.001387 0.000877 0.003004 -0.001445 
+-0.000391 0.000586 0.003425 -0.002360 -0.003488 -0.000181 
+-0.007033 -0.002016 0.001587 -0.005501 0.001546 0.001561 
+-0.005348 0.003885 -0.000552 -0.000511 0.000933 -0.003272 
+0.001411 0.002798 -0.000296 0.001702 0.002882 0.000769 
+-0.000184 0.001604 0.000520 0.000888 -0.000995 -0.002129 
+0.005963 -0.001014 -0.006619 0.005826 0.006492 -0.005327 
+0.003594 0.008028 -0.007009 0.003530 0.009875 -0.004736 
+0.004112 0.009648 -0.001774 0.002307 0.007654 -0.001957 
+-0.004181 0.001792 -0.003543 -0.006550 -0.000655 -0.002620 
+-0.002069 -0.006917 -0.002625 -0.002461 -0.002445 -0.001830 
+0.000931 -0.002031 0.000076 0.002165 0.001792 0.000235 
+0.005412 0.001926 -0.000093 0.004310 0.001381 0.001612 
+-0.000815 0.001768 0.000904 -0.001111 -0.001472 -0.000722 
+-0.002667 -0.001016 -0.000592 0.002932 -0.001162 -0.000728 
+0.006576 -0.003873 0.000234 0.006808 -0.000543 0.002185 
+0.000519 0.001122 0.000691 0.001450 -0.001555 0.003798 
+0.001483 -0.000700 0.001326 0.002005 0.005070 0.002594 
+0.003863 0.006864 0.002144 0.002019 0.006191 0.001560 
+0.000526 0.008771 -0.003708 0.003315 0.012242 -0.008799 
+0.008336 0.008439 -0.001259 0.006719 0.003288 0.001215 
+0.004822 -0.000440 0.001596 0.000682 -0.002300 -0.000886 
+0.001746 0.000000 -0.005586 -0.003583 -0.003884 -0.001594 
+-0.005870 -0.001870 -0.003938 -0.002080 0.000914 -0.001071 
+0.000744 0.001441 -0.002191 -0.000649 0.003511 -0.004559 
+-0.004243 0.002073 -0.002893 -0.004305 -0.001825 -0.000514 
+-0.001334 0.000596 -0.002656 0.001406 0.007745 -0.006668 
+0.005295 0.007146 -0.011583 0.000639 -0.000269 -0.003397 
+-0.006761 -0.001365 0.006852 -0.005563 -0.003159 0.004271 
+0.000548 0.001511 -0.025605 0.002064 0.008501 -0.044646 
+0.000900 0.002003 -0.002758 0.001126 0.000370 0.028562 
+0.219251 -0.465241 3.652406 0.000934 -0.000403 0.032032 
+-0.000890 -0.000038 0.014338 -0.000310 0.002262 -0.013946 
+0.006184 0.005682 -0.025221 0.006684 -0.001796 -0.013603 
+0.008181 -0.003090 -0.004546 0.010740 0.000920 -0.004508 
+0.013258 0.006414 -0.009135 0.010339 0.003598 -0.014032 
+0.000419 0.003552 -0.015494 0.001475 0.005000 -0.008851 
+-0.002179 -0.000683 -0.002014 0.000628 -0.000213 0.001539 
+0.001535 0.002302 -0.001919 0.001620 0.001615 -0.003938 
+-0.002263 -0.002697 -0.000884 -0.004083 0.001369 -0.000390 
+-0.003039 -0.001347 0.002749 -0.003799 -0.001656 0.001585 
+-0.006254 0.002136 -0.001003 -0.000592 0.003822 -0.007232 
+0.003198 0.005165 -0.004864 0.003763 0.005351 -0.003524 
+0.006145 0.001927 -0.002138 0.003911 -0.000974 -0.003403 
+0.002906 0.000294 -0.004091 0.003860 0.000464 -0.006037 
+0.007473 0.004397 -0.006397 0.007473 0.005872 -0.007206 
+0.004620 0.005090 -0.006120 0.000886 0.001683 -0.002456 
+-0.001819 -0.000650 0.003597 -0.002153 0.001286 0.000682 
+-0.004440 -0.000112 -0.001194 -0.005050 -0.003557 0.008607 
+-0.002630 -0.002630 0.001333 0.004642 0.000697 -0.003382 
+0.009670 0.001036 -0.005997 0.006211 -0.000954 -0.004537 
+0.000400 0.000127 0.001141 0.000256 -0.004160 0.005392 
+0.002637 0.000011 0.001976 0.000101 0.002622 0.000495 
+-0.002132 0.000083 0.001148 -0.002741 -0.002975 0.005403 
+0.002409 0.004347 -0.002271 0.003289 0.001437 -0.005596 
+0.000199 -0.000018 -0.000425 -0.001422 -0.001809 0.006333 
+0.000031 -0.005079 0.000006 0.003681 -0.002294 -0.000029 
+0.007365 0.005007 -0.000825 0.004650 0.008148 -0.004915 
+-0.000721 0.007541 -0.001443 -0.002491 0.003007 -0.000407 
+-0.000764 0.000505 -0.000125 -0.000228 0.000653 0.000834 
+-0.000454 -0.000103 0.000227 0.001677 -0.000510 -0.000049 
+0.002323 -0.001768 -0.000859 0.001903 -0.002321 -0.002686 
+-0.002326 -0.000294 -0.000720 -0.004223 0.001124 -0.001755 
+-0.002327 -0.001842 -0.003091 -0.001616 -0.001293 -0.004444 
+0.000420 0.000801 -0.004789 0.000242 0.001094 -0.003893 
+-0.001864 0.000233 -0.002966 -0.004073 0.000136 -0.000297 
+-0.003069 -0.000454 0.002756 0.000351 -0.000536 0.001348 
+0.003598 0.002890 -0.005043 0.000799 0.003023 -0.008882 
+-0.005309 -0.000194 -0.006538 -0.007857 0.000277 -0.000610 
+-0.005537 0.000254 0.000604 -0.002003 0.000526 -0.004177 
+-0.002463 -0.003130 -0.013128 0.000526 0.014067 -0.004297 
+0.003005 0.003375 -0.015211 0.005848 -0.000667 -0.004160 
+0.010978 -0.000020 -0.002945 0.013527 0.000649 -0.008185 
+0.009652 0.001754 -0.011571 0.002848 0.003191 -0.007929 
+-0.001006 0.001422 -0.002900 0.000380 0.000110 0.000108 
+0.005639 0.003936 -0.002471 0.005521 0.015831 -0.003306 
+0.005899 0.009002 -0.006092 0.001205 0.001316 -0.004729 
+-0.003979 -0.000642 -0.003133 -0.002979 0.000479 -0.005479 
+0.003612 -0.000741 -0.000566 0.004606 -0.004065 -0.001164 
+0.003301 -0.004823 -0.002052 -0.003416 -0.001539 -0.001766 
+-0.002400 -0.000774 -0.001628 -0.001296 -0.000139 -0.000749 
+-0.000358 0.002567 -0.001201 0.002564 0.002315 -0.003591 
+0.000128 0.000692 0.000095 -0.000522 0.001362 0.000734 
+0.000412 0.000525 0.001459 0.000424 0.003094 -0.002856 
+0.001257 0.001445 -0.002621 -0.001857 0.000857 -0.000857 
+0.000776 0.000191 -0.002177 0.005241 0.001086 -0.002630 
+0.005307 0.004316 -0.001050 0.004091 0.000503 0.001132 
+0.005034 0.000903 0.001151 0.004267 0.001228 0.002139 
+-0.001439 0.001079 -0.005039 -0.000212 0.004074 -0.000456 
+-0.002279 -0.002913 0.000621 -0.002713 -0.004883 0.000326 
+-0.002736 -0.001901 -0.000140 -0.005339 0.000128 -0.000596 
+-0.004178 0.003330 0.000665 -0.001601 0.002258 0.000482 
+-0.004031 -0.004200 0.001525 -0.000079 0.000440 0.002418 
+0.000959 -0.001619 0.002460 0.004963 0.002387 0.002100 
+0.001685 0.002891 0.001896 0.003555 0.004393 -0.003454 
+0.003115 -0.000536 -0.004288 0.001510 0.001370 -0.002334 
+-0.001800 0.002953 0.000345 -0.002922 0.005635 0.002905 
+-0.002583 0.005965 0.003936 -0.000668 0.002839 0.002672 
+0.001541 -0.000650 0.000050 0.002072 -0.002734 -0.002964 
+-0.001165 -0.001929 -0.006474 -0.004998 0.002652 -0.003439 
+-0.002805 0.005575 0.001063 -0.003132 0.004520 0.002281 
+-0.000668 0.002777 0.002128 -0.000895 -0.000650 -0.001565 
+0.000203 -0.000188 -0.005041 -0.000273 0.000105 0.000203 
+-0.002969 -0.000113 0.002702 -0.002378 -0.000527 0.002141 
+0.000067 0.000173 -0.000347 0.001203 0.000884 -0.002053 
+-0.000495 -0.001064 -0.002655 -0.004543 -0.001462 -0.002871 
+-0.007514 -0.001048 0.000303 -0.006801 -0.004564 0.002881 
+-0.001647 -0.000809 -0.000852 0.005845 0.007090 -0.011966 
+0.007265 0.005179 -0.022005 0.001832 0.004687 -0.019145 
+-0.000099 0.002883 -0.007135 0.000918 -0.000567 0.000426 
+0.002862 -0.001082 0.000564 0.004324 0.000112 -0.001414 
+0.003674 0.000949 -0.002206 0.002224 0.000831 -0.001744 
+0.001192 0.001007 -0.001521 0.000557 0.001741 -0.002708 
+0.000900 0.003207 -0.005782 0.005828 0.007156 -0.011336 
+0.014312 -0.003499 -0.002644 0.002781 0.019786 -0.002310 
+0.000228 0.009445 -0.000454 0.001813 -0.002371 -0.003180 
+-0.002125 -0.000228 -0.000583 -0.003169 0.000313 0.000483 
+-0.003077 0.000385 0.000000 -0.003525 -0.000504 -0.002014 
+-0.004198 -0.000564 -0.004375 -0.002866 -0.000208 -0.003905 
+-0.000422 -0.000896 -0.001956 -0.003369 -0.001953 0.000320 
+-0.006950 -0.003450 0.001507 -0.004338 -0.000642 0.000225 
+-0.001806 0.000002 -0.003601 0.003921 0.000437 -0.003046 
+0.002435 0.001666 -0.003600 0.000797 0.001389 -0.002557 
+0.000414 0.002448 -0.003207 -0.001125 0.000367 -0.003729 
+-0.000933 -0.000142 -0.001682 0.000562 0.000392 0.000274 
+0.002343 0.003226 -0.000180 0.001585 0.004526 0.000294 
+-0.000832 0.001736 -0.000680 -0.002097 -0.002806 -0.001403 
+-0.003360 -0.003840 -0.001920 -0.000657 -0.002301 -0.002344 
+-0.001212 0.001212 -0.001439 -0.000235 0.000093 0.000644 
+0.001161 0.000240 0.002123 0.002876 -0.001830 0.002092 
+0.004416 0.000356 0.000863 0.003272 0.002991 0.002449 
+-0.000453 0.002090 0.001750 0.006620 0.000720 -0.000755 
+0.000152 0.001934 -0.003146 0.002523 -0.001702 0.002703 
+-0.000237 -0.003194 0.003903 -0.000479 -0.001520 -0.000507 
+-0.002602 0.000731 -0.003311 -0.002721 0.003237 -0.002829 
+-0.005334 0.000921 0.000642 0.002043 0.002590 0.000870 
+0.003214 0.005026 0.004630 0.000444 0.001908 0.003559 
+-0.000270 0.001622 -0.000254 0.001375 -0.002636 0.001015 
+-0.001696 -0.004799 0.001503 -0.000107 0.000639 -0.000024 
+-0.000764 0.004698 -0.003157 -0.000362 0.005382 -0.004305 
+-0.001481 0.002368 -0.003278 -0.001946 -0.000112 0.001204 
+-0.001236 -0.002690 0.003838 -0.003062 -0.002697 0.001730 
+-0.000208 -0.000099 -0.001111 0.000075 -0.000080 -0.003873 
+-0.000700 0.004684 -0.004956 0.003293 0.008233 -0.002791 
+0.002016 0.003903 -0.000976 -0.001612 -0.000390 0.000026 
+-0.001853 -0.001057 0.000834 0.000829 0.000745 -0.001379 
+0.002762 0.000300 -0.004176 0.001030 -0.000659 -0.004412 
+-0.001176 0.000161 -0.003393 -0.002333 0.000124 -0.003283 
+0.001797 -0.000137 -0.003288 0.004194 0.001332 -0.003194 
+0.001497 0.001077 -0.003050 0.000290 -0.002685 0.002445 
+-0.002049 -0.002784 0.002101 -0.001266 0.000103 0.001370 
+0.000692 -0.000388 -0.001769 0.000310 -0.000436 -0.006587 
+-0.000492 -0.000221 -0.009388 0.003470 -0.004587 -0.007265 
+0.003723 0.001036 0.002109 0.006456 0.002617 0.002501 
+0.004239 0.002621 0.001947 0.001205 0.000721 -0.003444 
+-0.001831 0.000530 -0.000315 -0.003071 -0.001265 0.002800 
+-0.002461 -0.000551 0.001592 0.000418 0.001392 -0.000769 
+-0.001506 0.000240 -0.001849 0.001881 0.003163 -0.004039 
+-0.000295 0.003578 -0.003583 -0.003351 -0.000222 -0.002427 
+-0.003228 -0.003039 -0.002875 -0.000671 -0.003068 -0.003794 
+0.002046 -0.000714 -0.004425 0.005129 0.003363 -0.006324 
+0.004065 0.005751 -0.007366 -0.001664 0.003292 -0.005028 
+0.002693 0.000406 -0.002618 0.000586 0.000381 -0.000379 
+-0.002648 -0.001598 0.000878 -0.004897 -0.002156 0.002255 
+-0.004066 -0.002287 0.002010 -0.001131 -0.001197 0.000579 
+0.000968 0.003539 0.000166 -0.002879 0.000430 -0.002329 
+-0.003527 -0.000143 -0.002908 -0.002960 -0.001364 -0.001392 
+-0.001409 -0.001887 0.001302 -0.000269 0.000698 0.000913 
+0.007915 0.003195 -0.000117 0.009056 0.005437 0.000321 
+0.009151 0.001890 -0.000477 0.005041 0.001805 -0.004174 
+-0.001318 0.000388 -0.002171 -0.005419 -0.000762 0.000409 
+-0.004393 0.003147 -0.000234 -0.001586 0.005774 0.000979 
+-0.001567 0.008278 0.000833 0.000703 0.010901 -0.001752 
+0.001910 0.006560 0.001789 0.000787 0.000421 0.000668 
+0.002556 0.001700 -0.001312 0.007344 0.000755 -0.002391 
+0.007093 -0.000274 -0.002055 0.004131 0.003588 -0.001760 
+-0.001849 0.001946 -0.001544 -0.000205 0.000769 -0.002773 
+-0.000765 -0.001926 0.000280 -0.002106 -0.001515 0.001685 
+-0.001839 0.000267 0.000891 -0.000190 0.001644 -0.000769 
+0.001305 0.003061 0.000778 0.000024 0.000608 0.000633 
+0.001018 -0.000712 -0.000204 0.002851 0.000401 -0.000161 
+0.001751 0.003072 -0.000107 0.000075 0.004168 -0.002778 
+-0.002578 0.006058 -0.000838 -0.000556 0.001636 0.000905 
+0.001527 0.000326 0.000122 -0.000614 0.001845 -0.000888 
+-0.002462 0.001846 -0.001538 -0.001876 0.002897 -0.000030 
+-0.000267 -0.000048 0.000584 -0.002802 -0.001715 0.001313 
+-0.003628 -0.001878 0.003087 -0.003116 -0.001406 0.002043 
+-0.001924 0.000246 0.000242 -0.000637 0.000025 -0.000051 
+0.001218 -0.000505 -0.001027 0.000925 0.000139 -0.000817 
+0.000221 -0.000001 -0.000231 -0.000196 0.000229 -0.001631 
+-0.000938 0.000441 -0.002804 -0.002670 -0.001643 -0.002064 
+-0.006021 -0.004082 0.001490 -0.000985 0.000609 -0.001344 
+-0.002318 0.002171 -0.003218 -0.000776 0.001070 -0.005811 
+0.004722 0.003925 -0.001987 0.003881 0.001318 0.000845 
+0.001074 0.001718 0.000517 -0.001308 0.003043 0.000662 
+-0.003324 0.002005 -0.000064 -0.002846 0.002427 -0.000714 
+-0.002112 0.001587 0.001092 -0.001963 0.000460 0.000282 
+-0.001490 -0.000601 -0.000527 0.001253 0.000527 0.000601 
+0.003416 0.001651 0.001773 0.003777 0.004898 -0.001157 
+0.001378 0.005396 -0.003125 -0.000186 0.002414 0.000062 
+-0.002818 -0.001275 -0.000650 -0.001927 -0.004381 -0.000221 
+-0.000975 -0.002750 0.001931 0.001064 0.000864 -0.001439 
+-0.001148 0.001576 -0.003798 -0.001290 0.001439 -0.004245 
+-0.000430 0.000991 -0.002704 -0.000384 -0.001157 -0.001536 
+-0.001318 -0.000732 -0.001061 -0.001652 0.000932 -0.001802 
+-0.000698 0.002102 -0.001146 0.001499 -0.001294 0.000438 
+-0.001918 -0.000126 -0.000241 -0.001247 -0.000254 -0.001677 
+0.000404 -0.000459 -0.000703 0.001099 0.000353 0.000266 
+0.002658 0.003752 0.000286 0.003482 0.005106 0.002153 
+0.002469 0.003880 0.003042 0.002236 0.000548 0.001778 
+-0.000503 -0.001541 -0.000786 0.004130 0.000146 -0.004070 
+0.003599 0.006015 -0.003871 0.002216 0.001996 -0.003340 
+0.004509 -0.001445 0.000762 0.001451 0.000145 -0.001439 
+-0.002837 -0.003859 0.000234 -0.002164 0.001488 0.004802 
+-0.001299 0.003070 0.005327 0.000331 0.000030 0.003263 
+0.001941 -0.001859 -0.002867 0.006623 0.001756 -0.005581 
+0.006045 0.004025 -0.000238 0.000350 -0.000299 -0.000110 
+0.000366 -0.000718 -0.000802 0.002758 0.002119 -0.001692 
+0.002716 0.001502 -0.002829 0.001725 -0.000253 -0.004589 
+0.000045 -0.003378 -0.002282 0.000356 -0.002545 -0.000560 
+0.000238 0.000912 0.000334 0.002546 0.006031 0.000268 
+0.000507 0.004387 -0.006413 -0.000204 0.000544 -0.005349 
+0.001102 0.000483 -0.005723 0.003469 0.001829 -0.006748 
+0.001971 0.005730 -0.009957 0.003912 0.002438 -0.008484 
+0.003722 0.000840 -0.005096 0.003162 0.000978 -0.004210 
+0.001849 0.004203 -0.002546 0.001422 0.002157 0.000098 
+0.000687 -0.001739 0.000086 -0.001061 -0.003521 -0.001082 
+-0.001857 -0.001667 -0.001891 -0.002110 0.000404 -0.002873 
+-0.001925 0.002343 -0.002503 -0.001411 0.001516 -0.001912 
+-0.001407 0.000913 -0.001392 -0.000845 0.000610 -0.001563 
+-0.000273 0.000051 -0.000298 -0.001860 -0.001479 0.001033 
+0.001848 -0.001332 0.004168 0.006011 -0.001288 0.001378 
+0.007872 0.003555 -0.003468 0.005210 0.002347 -0.003494 
+-0.002283 0.004961 -0.001127 -0.000101 0.000505 0.001610 
+0.000413 -0.003602 0.001868 0.001281 -0.003532 0.000888 
+0.000175 -0.001421 0.000723 0.000320 -0.000099 0.000136 
+0.000013 0.000006 -0.000306 -0.000633 -0.001237 -0.001875 
+-0.001476 -0.002170 -0.001681 -0.002868 -0.001359 -0.000857 
+-0.003348 -0.000329 -0.001034 -0.001986 -0.001265 -0.001557 
+0.001561 -0.001646 -0.003091 -0.000641 0.000521 -0.003606 
+0.000927 -0.000300 -0.002385 -0.000285 -0.000260 -0.001789 
+-0.001512 -0.001737 -0.001902 -0.003043 -0.001592 -0.002418 
+0.000964 -0.001047 -0.005399 -0.001810 -0.001752 -0.001301 
+0.001288 0.001879 -0.001664 0.001209 -0.001946 -0.005367 
+0.001660 -0.000919 0.000719 0.002526 -0.002654 0.001315 
+0.000340 -0.001543 0.000123 -0.000929 0.001421 0.001597 
+-0.000139 0.000729 0.003888 -0.003194 0.002523 0.002405 
+-0.001517 0.001983 0.000804 0.001543 0.002614 0.001232 
+0.000269 0.004101 0.000930 -0.000702 0.005262 -0.008239 
+0.001415 0.005484 -0.011930 0.005910 0.000169 -0.010555 
+0.001882 0.001308 -0.005687 0.000521 -0.007770 -0.004933 
+0.001005 0.001348 -0.002846 -0.000027 0.005691 -0.005224 
+0.001364 0.005492 -0.005231 0.000819 0.002908 -0.001799 
+-0.000199 0.001159 0.000359 0.001378 0.000637 0.001223 
+-0.000212 0.000020 -0.000082 -0.001583 0.000216 0.001104 
+-0.000422 0.001200 0.001938 -0.001066 0.000960 0.001258 
+-0.000241 0.001452 -0.000518 0.002433 0.002599 0.000448 
+0.004025 0.002749 0.001316 0.002731 0.002214 0.000628 
+0.001097 0.001750 -0.002951 0.000303 0.000743 -0.006685 
+-0.000189 0.002485 -0.006741 0.000017 0.005370 -0.005376 
+0.001313 0.009414 -0.005192 0.001481 0.010676 -0.007219 
+0.001809 0.006355 -0.006773 0.000726 0.000304 -0.001604 
+-0.004298 -0.002429 0.001310 -0.001317 -0.003608 0.001489 
+0.000000 -0.000077 -0.003385 -0.002373 0.001068 -0.003618 
+-0.001782 0.000126 -0.001274 0.000000 0.000507 -0.003043 
+0.000949 0.001349 -0.002950 0.002476 0.000324 -0.003017 
+0.000924 0.000219 -0.002595 -0.000391 -0.000301 -0.002313 
+-0.004025 0.000274 -0.002027 -0.001751 0.000082 -0.002189 
+-0.000049 0.000372 -0.000244 0.001071 0.000527 -0.000616 
+0.000917 0.001312 -0.001943 0.001299 0.002001 -0.004344 
+0.005489 0.004021 -0.006195 0.005150 0.005697 -0.005495 
+0.003873 0.003367 -0.004250 0.000529 -0.000924 -0.004495 
+0.000913 -0.002617 -0.003650 0.000916 -0.001705 0.000287 
+0.002000 -0.001032 -0.000868 0.001579 -0.002765 -0.002153 
+0.003169 -0.002395 -0.001787 0.001332 -0.001092 -0.001097 
+0.000303 -0.000240 -0.000255 0.003976 -0.001147 -0.001440 
+0.008805 -0.003117 -0.004029 0.007067 -0.003912 -0.006607 
+0.000601 -0.003149 -0.005106 -0.000609 -0.001586 -0.002966 
+0.000422 -0.001108 -0.002117 -0.001550 0.000655 -0.000640 
+-0.000903 0.002909 -0.000136 0.002307 0.004088 -0.002935 
+0.004051 0.001688 -0.001783 0.002831 0.002275 -0.001693 
+0.002076 0.001765 -0.004429 0.004279 0.003331 -0.006778 
+-0.006471 0.001360 -0.002484 -0.004336 -0.003342 -0.002506 
+0.002316 0.000179 -0.003210 0.002069 0.000521 0.000861 
+0.002568 -0.001216 0.000526 0.001613 -0.001611 -0.000214 
+0.002361 -0.002349 -0.000567 0.004221 -0.000272 0.000545 
+0.001052 0.005631 -0.003367 0.003299 0.011905 -0.007784 
+0.005287 0.014509 -0.012823 0.005070 0.006673 -0.011285 
+-0.000818 -0.008806 -0.004919 0.000185 -0.003517 0.000540 
+-0.000448 0.006737 -0.003292 0.000440 0.008906 -0.006310 
+0.003120 0.006087 -0.003277 0.003367 0.000052 0.000360 
+0.003477 -0.002732 -0.000378 0.001794 0.000714 0.000889 
+0.001663 0.001438 0.000338 0.002327 0.003846 -0.000095 
+0.000761 0.004161 0.001973 0.001426 0.000737 0.000152 
+0.001084 -0.001287 -0.002041 0.000925 -0.001525 -0.001979 
+0.001311 -0.001703 -0.000490 0.000244 0.001053 0.000325 
+0.003600 0.002277 -0.003177 0.002533 0.001076 -0.003103 
+0.001680 0.000787 -0.002441 0.001610 -0.000268 -0.004161 
+0.003809 -0.000551 -0.005461 0.000370 0.001643 -0.004642 
+-0.002126 -0.001213 -0.001294 -0.003842 -0.001208 -0.000164 
+-0.005117 0.001797 -0.002070 -0.001021 0.006378 -0.003315 
+0.001608 0.002933 -0.004062 0.001539 0.001695 -0.002636 
+0.002500 0.000564 -0.001503 -0.001304 0.000870 -0.002319 
+-0.004699 0.001721 -0.002933 -0.001974 0.000062 -0.004813 
+0.005860 0.004617 -0.006747 0.003657 0.001126 -0.005205 
+0.001057 0.000405 0.000165 -0.000930 -0.003586 0.004760 
+-0.004977 -0.000928 0.008081 -0.000401 -0.001717 0.002498 
+0.006504 -0.000694 -0.002645 0.008912 0.000760 -0.005199 
+0.004521 0.005571 -0.003278 -0.000486 0.003966 -0.002482 
+-0.000945 0.000475 -0.000784 0.000225 -0.001520 -0.001005 
+-0.000149 -0.000317 0.001349 0.000930 0.000927 0.001214 
+0.005326 -0.000362 0.001343 0.002156 0.000010 0.001027 
+-0.002779 -0.002859 -0.001502 -0.008234 -0.004334 -0.001437 
+-0.003776 -0.002982 -0.001536 0.002659 -0.003316 -0.002336 
+0.005121 -0.003711 -0.003486 0.002162 -0.002699 -0.003421 
+0.000376 -0.001248 -0.002783 0.000013 0.000163 -0.001534 
+0.000821 -0.000328 -0.002407 -0.002383 0.000697 -0.000747 
+0.000964 0.005702 0.000364 -0.000185 0.003793 -0.003227 
+-0.003484 -0.002647 0.001067 -0.002054 -0.007137 0.001893 
+-0.004695 -0.005062 0.001988 0.000618 -0.001611 -0.000198 
+0.000564 0.001465 -0.000676 0.001546 0.007555 -0.006817 
+0.006591 0.010434 -0.010003 0.008804 0.006983 -0.000734 
+0.005505 0.000037 0.002331 0.003828 0.000539 0.001962 
+0.001755 0.000101 0.000388 0.002844 -0.001397 -0.003792 
+0.007813 0.004033 -0.002634 0.002425 0.013061 -0.001956 
+-0.001943 0.010423 0.002717 -0.001637 0.001649 0.004630 
+-0.002935 -0.003206 0.004610 -0.004706 0.006272 0.004080 
+-0.003746 0.013909 -0.001833 -0.001331 0.014486 -0.004267 
+0.001672 0.010319 -0.001021 0.002393 0.003212 0.001124 
+0.002178 -0.000693 0.000198 -0.000421 -0.000229 0.000182 
+-0.000136 0.001154 -0.000680 -0.002500 -0.000303 -0.002348 
+-0.004318 0.000409 -0.000818 -0.003659 0.001220 -0.001364 
+-0.004051 0.001934 0.000392 -0.004016 0.002057 0.001190 
+-0.002959 -0.000195 0.001658 0.000376 0.000000 -0.001128 
+0.005678 0.002492 -0.003546 0.007686 0.002042 -0.000090 
+0.005944 0.001878 -0.000062 0.000778 0.000510 -0.000027 
+-0.004823 -0.001915 0.001277 -0.005139 -0.003964 0.001996 
+-0.000540 -0.000857 0.000570 0.003090 0.005659 -0.002309 
+0.003906 0.008719 -0.006625 0.006794 0.003397 -0.008492 
+0.004599 -0.000111 -0.003140 0.001116 -0.001574 -0.003705 
+0.000287 -0.000423 -0.002681 -0.001356 0.000527 -0.002034 
+-0.000972 0.003338 -0.002578 0.000000 0.000000 0.000000 
+-0.000464 0.001720 -0.003846 -0.000184 0.000317 -0.000770 
+0.001997 -0.000166 0.000559 0.001254 0.001514 0.000136 
+0.001520 0.004266 -0.002292 0.000848 0.006388 -0.006746 
+0.002492 0.005205 -0.011905 0.003384 0.005978 -0.011757 
+0.002132 0.008294 -0.005381 0.000536 0.004871 -0.000607 
+0.000117 -0.002073 -0.000044 0.001093 -0.006429 -0.003411 
+-0.003505 -0.005481 -0.002671 -0.002491 -0.002778 -0.001151 
+-0.001871 0.002671 -0.001192 -0.002003 0.001845 -0.000779 
+-0.002187 0.000906 -0.000825 -0.001049 0.007104 0.001085 
+-0.008811 0.012981 0.003021 -0.025677 0.009168 0.002321 
+-0.011368 -0.005225 0.000386 0.004955 -0.003758 -0.005879 
+0.003399 -0.000149 -0.004747 0.000977 0.000478 -0.001857 
+-0.000038 -0.000710 -0.001742 0.000484 0.000104 -0.000371 
+0.003257 0.000295 -0.002830 0.002288 -0.000706 -0.002712 
+-0.000356 -0.000623 -0.000623 -0.000947 -0.000346 -0.001664 
+-0.003998 0.001602 -0.002400 0.001216 0.000279 -0.001499 
+-0.001638 0.000001 0.000232 0.000646 -0.000581 0.000686 
+0.000705 0.000952 0.000303 -0.001267 -0.001451 0.001317 
+-0.005058 -0.003552 0.005396 -0.004858 -0.008366 0.001019 
+0.001799 -0.004671 0.000136 0.002955 -0.002720 -0.000828 
+0.000188 0.000938 -0.001074 -0.000813 0.003391 0.001874 
+-0.001559 0.001750 0.004620 0.004387 -0.005610 0.000575 
+0.001556 -0.002165 -0.001022 -0.002306 0.005861 0.001153 
+-0.004028 0.007023 0.002785 -0.002993 0.004211 0.001268 
+0.000453 0.001306 0.000405 0.001420 0.001448 0.001244 
+0.006543 0.001323 -0.002279 0.001003 0.001209 0.000670 
+-0.002244 0.000069 -0.000811 -0.004679 0.000125 -0.001881 
+-0.005045 0.001477 0.002705 -0.004525 -0.001743 0.001045 
+-0.000759 0.000752 -0.000063 0.001515 0.002630 -0.000376 
+0.000787 0.003074 -0.001189 -0.001871 0.001908 -0.000741 
+-0.001978 0.001022 -0.001147 0.000394 0.000394 0.000394 
+0.005561 0.003589 -0.002376 0.002061 0.006225 -0.005466 
+0.000309 0.003759 -0.003396 -0.002778 -0.001389 -0.001389 
+0.000343 -0.005000 0.001717 0.000090 -0.002605 0.001139 
+0.002281 0.005352 -0.002048 0.003028 0.006955 -0.008952 
+0.000385 0.008320 -0.004644 -0.002286 0.001357 -0.001071 
+0.000536 -0.000263 -0.002099 0.000669 0.001631 -0.002655 
+-0.001688 0.004326 -0.001635 -0.003313 0.000888 0.000288 
+-0.002841 0.002841 -0.002348 0.001536 0.004851 -0.002054 
+0.004199 0.003609 -0.001705 0.000066 0.000548 -0.000059 
+-0.001624 -0.003483 -0.001442 -0.002287 -0.004939 -0.003277 
+-0.000988 -0.002733 -0.006061 0.004659 -0.001531 -0.009840 
+-0.002714 -0.001279 -0.005487 -0.000793 -0.001314 -0.001285 
+0.000725 0.001144 0.000726 0.000799 0.002136 -0.000299 
+0.000457 0.000635 -0.000203 -0.002846 -0.002934 -0.003941 
+-0.007046 -0.002994 -0.005312 -0.005682 -0.003169 -0.003670 
+-0.000440 0.001352 -0.000624 0.004053 0.012355 0.002688 
+0.005599 0.010215 0.002608 -0.003260 -0.012307 -0.001480 
+-0.013618 0.003486 0.003049 0.003032 0.013676 0.004386 
+0.002440 0.005965 0.000308 0.002150 0.002793 -0.001341 
+0.002521 0.000617 -0.001838 -0.000218 -0.000330 -0.000090 
+0.002585 -0.000604 -0.000223 0.001733 0.000113 -0.001296 
+-0.001202 0.000070 0.000663 -0.002577 0.002423 -0.000257 
+-0.000468 -0.000316 -0.001126 -0.000593 0.000207 -0.000359 
+-0.002807 0.000362 0.000179 -0.002293 0.000008 -0.003278 
+0.001070 -0.000520 -0.000814 0.004769 -0.000561 -0.001753 
+0.008318 0.001375 -0.000554 0.004793 0.001773 0.002324 
+0.002624 0.000066 0.002113 0.001374 -0.001307 0.000426 
+0.000022 -0.001126 -0.000976 -0.000251 0.000399 0.000975 
+0.000349 -0.000916 0.002239 0.005411 -0.008666 -0.003025 
+0.010151 -0.006632 -0.005082 0.005342 -0.002869 -0.003379 
+0.000341 0.000590 -0.000501 -0.003041 0.002093 0.001983 
+-0.002538 0.001538 0.000000 -0.000111 -0.001638 0.000633 
+0.001496 -0.002225 -0.000547 0.000785 -0.004365 -0.001362 
+0.000760 -0.003791 -0.001529 -0.002806 -0.002662 -0.002662 
+-0.002823 -0.000503 -0.004193 -0.002232 -0.000586 -0.002187 
+0.000649 0.001871 -0.000111 -0.001001 -0.000623 0.001332 
+-0.003433 -0.000835 0.004176 -0.001465 -0.003359 -0.001843 
+-0.001062 -0.004802 -0.001190 0.004685 -0.001756 -0.001102 
+0.006019 0.002359 -0.003904 0.003942 0.003865 -0.003932 
+0.002984 0.002624 -0.001193 -0.000143 -0.000214 -0.000929 
+0.000298 -0.001194 -0.000441 -0.000009 -0.000345 -0.000272 
+-0.000154 -0.000208 -0.000069 -0.000092 -0.001120 -0.000171 
+-0.000806 -0.002677 0.001080 -0.003492 -0.003479 0.004993 
+-0.005921 -0.002895 0.004835 -0.002347 -0.001486 -0.001322 
+-0.000055 -0.001373 0.000051 0.000695 -0.001069 0.000560 
+-0.000285 -0.000083 -0.000139 0.003187 -0.000898 -0.005147 
+0.006853 -0.001377 -0.004614 0.004130 0.000815 0.001210 
+0.001586 0.001625 0.001395 -0.000035 -0.002566 0.004377 
+-0.003928 -0.007850 0.004864 -0.007283 -0.009270 0.002814 
+-0.006449 0.001703 -0.004971 -0.000783 0.000617 -0.001600 
+0.000076 -0.000127 0.000275 0.001829 0.004350 -0.001960 
+0.002429 0.001978 0.001529 0.002271 -0.002004 -0.006345 
+-0.004870 -0.003617 -0.005766 -0.004833 -0.007978 -0.005158 
+-0.004935 -0.003506 -0.004860 -0.002125 0.003025 -0.001469 
+0.000727 0.005971 0.000197 0.001782 0.015336 0.000307 
+0.001728 0.025190 0.002840 0.007636 0.014516 -0.000044 
+0.007304 0.008562 -0.002977 0.003581 0.002505 -0.001955 
+0.000006 0.000723 0.000758 0.000497 0.001618 0.001427 
+0.003669 0.001098 -0.000635 -0.001587 0.001146 -0.008377 
+0.003110 -0.000826 -0.011104 0.002127 -0.000138 -0.003565 
+0.001599 -0.002954 0.002087 0.000702 -0.000589 0.001912 
+0.000008 -0.000849 -0.000327 -0.005357 -0.003333 -0.003929 
+-0.008844 -0.001180 0.001056 -0.009020 0.000277 0.002358 
+-0.006408 0.000809 0.000700 -0.000140 0.000208 -0.000210 
+0.000282 0.000650 0.003082 0.001397 0.000493 0.001313 
+0.000313 -0.001411 -0.002014 0.001413 0.004157 -0.010257 
+0.000771 0.014540 -0.020085 0.010076 0.012296 -0.017626 
+0.006240 -0.000467 -0.009586 0.004677 -0.004726 -0.005096 
+0.003525 -0.003706 -0.003559 0.002991 -0.000274 -0.002175 
+0.000050 0.000604 -0.004127 -0.000093 0.000186 -0.003721 
+-0.000523 -0.001111 -0.000131 -0.000112 -0.001735 0.000653 
+-0.002000 0.000000 -0.000769 -0.000346 -0.000748 0.001613 
+-0.001084 0.000341 0.000278 -0.002074 -0.003123 0.000750 
+0.000348 -0.000846 -0.000572 0.003599 0.003212 -0.002379 
+0.000218 -0.000796 -0.001540 -0.000972 0.000780 -0.000445 
+-0.003079 -0.000750 -0.001170 -0.005253 -0.002744 -0.000372 
+-0.003569 -0.002888 0.000958 0.000386 0.000170 -0.000438 
+0.003653 0.003703 -0.002580 -0.001106 0.001066 0.000189 
+-0.002557 0.002340 -0.002711 -0.001839 0.000845 -0.001220 
+-0.001484 -0.000122 -0.000009 0.000050 0.000031 -0.000017 
+-0.001382 -0.000788 -0.000884 -0.002710 0.002508 -0.001456 
+-0.003911 -0.000998 0.000162 -0.002177 -0.000829 -0.001885 
+0.001591 -0.002351 -0.002288 0.003178 0.001103 0.000221 
+0.002713 0.002682 -0.002527 0.001473 0.001579 0.000347 
+0.000794 0.000728 -0.000060 0.002350 -0.000453 -0.000739 
+0.000357 0.001524 -0.000486 0.000257 0.003127 -0.004274 
+0.001125 0.004472 -0.006484 0.002617 0.005151 -0.008382 
+0.005944 0.002031 -0.001276 -0.000557 0.003893 -0.002556 
+0.001646 0.005915 -0.003779 0.003396 0.004965 -0.002908 
+0.001748 0.003614 -0.002191 -0.000826 0.000284 -0.002704 
+-0.004130 -0.001497 -0.004160 -0.006056 -0.001758 -0.006579 
+-0.006610 0.000940 -0.008173 -0.007715 0.002606 -0.007732 
+-0.007256 -0.000021 -0.004516 0.003772 0.002028 0.002818 
+-0.030087 0.049304 -0.006826 -0.035246 -0.000002 0.028392 
+-0.000286 -0.007822 -0.004612 0.002573 -0.000916 -0.002338 
+0.001900 -0.000102 -0.001119 0.000408 0.000428 0.000069 
+0.000049 -0.000459 -0.000422 -0.000454 0.000315 0.000396 
+-0.005516 -0.001607 0.001821 -0.003468 -0.000406 -0.000848 
+-0.000586 -0.000099 -0.000231 0.000975 0.005428 -0.001391 
+0.001511 0.006628 -0.001467 -0.004992 0.003700 -0.002288 
+-0.003993 0.005777 0.000602 -0.004621 0.005036 0.001515 
+-0.003429 0.002459 0.001808 0.001370 -0.001022 -0.000020 
+0.008432 0.002190 -0.001103 0.010161 0.001654 -0.002533 
+0.000423 -0.000866 -0.000123 0.000707 -0.003435 0.000640 
+-0.008561 -0.007105 0.002388 -0.003005 0.003757 0.000317 
+-0.002010 0.003482 -0.001676 -0.000699 0.001172 -0.001178 
+0.000057 -0.000500 -0.000906 0.000668 -0.000951 -0.001609 
+0.002237 -0.001817 -0.001676 0.008288 0.006766 -0.004651 
+0.000251 0.002905 -0.007615 -0.000377 -0.000276 -0.004372 
+-0.001179 -0.001584 -0.003044 -0.002325 -0.001953 -0.002976 
+-0.001194 -0.000217 -0.002946 -0.000825 0.000083 -0.000288 
+0.002077 0.002268 -0.004082 0.002622 -0.000518 -0.002717 
+0.003229 -0.001875 -0.000289 0.002459 -0.002402 -0.000373 
+-0.001458 -0.002308 -0.000458 -0.004829 -0.001368 0.000809 
+-0.004134 -0.001063 0.002278 -0.001027 0.000213 0.000773 
+0.000144 0.000451 0.000425 -0.001273 0.000232 -0.000561 
+-0.000213 -0.000330 -0.001926 0.003887 -0.002132 -0.003577 
+0.008295 -0.001414 -0.005654 0.005840 0.006253 -0.008966 
+0.006600 0.005211 -0.000793 0.001280 0.000433 0.000487 
+0.001235 -0.001210 -0.000129 0.002926 -0.003537 0.001323 
+-0.000074 -0.003173 -0.000397 -0.001919 -0.001793 0.002449 
+-0.000478 0.000526 0.000414 -0.002108 -0.001353 -0.002003 
+-0.000068 -0.001246 -0.000427 -0.000604 0.000017 0.000770 
+-0.000429 0.000781 -0.000161 0.001377 0.002309 0.001521 
+0.002295 0.005735 0.002632 0.004296 0.011042 0.000511 
+0.017007 0.006756 -0.000777 0.004404 -0.003742 0.001350 
+-0.002618 -0.001854 -0.003036 0.002493 0.004107 -0.004489 
+0.001236 0.001811 -0.000401 -0.001308 -0.005453 -0.000102 
+-0.000487 -0.009866 0.003301 -0.003097 -0.010988 0.000792 
+-0.003270 -0.011615 -0.002296 -0.002954 -0.013250 -0.003167 
+-0.002322 -0.006248 -0.005091 -0.005352 0.040474 0.017491 
+-0.020941 0.020528 -0.035186 0.015713 -0.001241 -0.041660 
+-0.046242 -0.042737 0.012533 -0.011882 -0.010676 0.001604 
+0.003643 0.001799 -0.001481 0.004734 0.005141 -0.001529 
+0.000358 0.001764 0.001044 -0.000893 0.000112 0.002072 
+-0.001162 0.000345 -0.002437 0.001874 0.002543 -0.004816 
+-0.005407 0.003125 -0.004085 0.002788 0.003335 -0.003360 
+-0.004759 0.006904 -0.000543 -0.005429 0.006577 0.001770 
+-0.002769 0.008005 0.000402 -0.002545 0.005488 -0.001056 
+-0.001688 0.000113 0.004097 -0.004443 0.001243 0.004097 
+-0.002601 -0.006072 0.006067 0.003053 0.000138 -0.000395 
+0.002835 0.003044 -0.006107 0.001185 0.002835 -0.008549 
+-0.007268 0.005297 -0.004884 -0.004043 0.006445 -0.003085 
+-0.002998 0.004612 -0.002037 -0.003063 0.004014 -0.001087 
+-0.001604 0.002301 0.002354 -0.002038 0.003365 -0.000830 
+-0.001176 0.000436 -0.000171 0.000280 -0.002646 0.000010 
+-0.001361 -0.004841 0.000786 -0.004060 -0.002900 0.002044 
+-0.001667 -0.000461 -0.000614 0.000499 -0.000280 0.000389 
+0.000629 0.002894 -0.001824 0.001370 0.001499 -0.005297 
+0.003641 0.000663 -0.004769 0.002043 -0.001052 -0.004689 
+0.001241 -0.003663 -0.000654 -0.002751 -0.001538 -0.000595 
+-0.003264 -0.001173 -0.001141 -0.000468 -0.001214 -0.000180 
+0.002827 0.000491 -0.001677 0.006648 0.002606 -0.002915 
+0.002952 0.001620 0.001346 -0.001947 -0.001002 -0.003686 
+-0.002034 0.000389 -0.002857 -0.002957 -0.002070 -0.001183 
+-0.002599 0.000869 -0.003459 -0.002874 0.002290 -0.004761 
+-0.001419 0.001865 -0.004907 0.000881 0.000502 -0.002261 
+0.000906 0.001302 0.001135 -0.000547 0.000771 0.000323 
+0.001115 0.000214 -0.001679 0.001589 -0.001146 -0.002214 
+0.001111 -0.002857 -0.002857 0.001646 -0.005076 0.000417 
+0.000706 -0.003984 0.001918 -0.000211 0.000458 0.001303 
+0.004974 0.000771 0.003062 0.001669 0.001252 0.002312 
+-0.000215 -0.000660 0.000813 0.000227 0.000297 -0.000482 
+-0.001949 0.009528 0.003508 -0.002412 0.008394 -0.004126 
+-0.000079 -0.000772 -0.000111 0.001709 -0.001196 -0.001082 
+-0.001158 -0.001587 0.000032 -0.000860 -0.003154 -0.001572 
+0.002615 -0.005396 -0.000881 -0.000496 -0.005715 -0.001034 
+-0.001886 -0.008902 -0.006921 -0.004656 -0.006131 -0.012420 
+-0.011364 0.011491 -0.014920 -0.003119 0.023119 -0.004563 
+-0.021137 0.007207 -0.006010 -0.026680 -0.014198 -0.004653 
+0.006775 -0.007964 -0.006616 -0.005587 -0.017633 -0.004359 
+0.005076 0.004595 -0.000132 0.007569 0.010087 0.001616 
+0.001121 0.003282 0.004109 -0.004043 -0.002026 0.004699 
+-0.005054 -0.000973 0.001725 -0.002546 -0.001069 0.000318 
+-0.002343 -0.003717 -0.000825 -0.000757 -0.001366 -0.001904 
+-0.005697 0.008602 0.000543 -0.003977 0.009363 0.000713 
+-0.003535 0.009104 0.000158 -0.004999 0.009232 0.002064 
+-0.005549 0.007415 0.002326 -0.009534 -0.006637 0.000421 
+0.002407 0.002895 -0.001455 0.006548 0.003439 0.002615 
+-0.000908 0.001767 0.000999 0.000687 0.003642 0.006205 
+-0.003429 0.002906 -0.000407 -0.000806 0.003429 -0.002144 
+-0.000482 0.001175 0.000686 0.001202 0.000153 0.000913 
+-0.001676 -0.000275 0.001787 -0.000570 0.000168 0.000769 
+0.000204 -0.000700 -0.000603 0.001026 -0.001967 -0.000051 
+0.000748 -0.001417 0.000748 0.001048 0.001325 -0.000387 
+-0.001768 0.002186 -0.002112 -0.004562 0.001572 -0.002139 
+-0.001216 0.002211 -0.003318 -0.001352 0.001582 -0.004488 
+0.002918 0.000724 -0.008737 -0.000147 0.006618 -0.003602 
+0.000748 -0.000211 -0.006845 0.004533 0.000975 -0.001298 
+0.001534 -0.000960 0.001119 0.001557 -0.001787 0.000794 
+0.000399 -0.000738 -0.000214 -0.000596 0.001379 -0.000614 
+0.003134 0.001929 0.001286 0.000847 0.004922 -0.000767 
+0.002615 0.002262 -0.000323 0.001247 0.001018 -0.002265 
+-0.001524 -0.000398 -0.003181 -0.001076 0.001339 0.000236 
+0.001089 0.003266 -0.003110 -0.000046 0.000709 -0.001779 
+-0.000018 0.001795 -0.001621 0.000276 0.002650 -0.000957 
+0.001326 0.003178 -0.001755 0.001846 0.001059 0.000726 
+0.002707 0.000211 -0.000662 0.001471 -0.000196 0.001764 
+-0.000080 0.001650 0.001581 0.000959 0.003517 -0.001343 
+0.001305 0.002142 -0.000709 0.001130 0.000582 0.000274 
+-0.000021 0.000160 -0.000796 0.001001 0.000500 -0.005259 
+0.008290 -0.000154 -0.012342 0.000699 0.006417 -0.002995 
+0.000559 0.002958 -0.001385 0.001777 0.001619 0.002191 
+0.000373 -0.000682 -0.001344 -0.000780 -0.007287 -0.003398 
+0.001633 -0.009363 -0.004067 0.001990 -0.010814 -0.000382 
+0.000784 -0.013348 -0.000217 -0.001962 -0.003535 -0.001766 
+-0.000914 0.010050 -0.001154 0.000117 -0.001305 0.000137 
+-0.009400 -0.012766 -0.001268 -0.001624 0.007863 -0.000171 
+0.010664 0.011364 -0.011765 0.004503 0.002283 0.002051 
+0.007229 -0.019752 -0.018693 -0.010066 -0.011593 -0.004012 
+-0.010410 -0.007908 0.000634 -0.004909 -0.003060 0.001592 
+0.001404 0.001051 0.000264 0.002154 0.001296 -0.000060 
+-0.002375 0.001970 0.000671 -0.000941 0.003079 -0.002548 
+0.001869 0.003125 -0.000774 0.003330 0.004314 -0.002725 
+0.002875 0.002817 -0.003021 -0.000028 0.001990 -0.003034 
+-0.000595 -0.000430 -0.002576 0.001075 -0.000405 0.000606 
+0.003903 0.006142 -0.003636 0.005703 0.013305 -0.011389 
+0.012612 0.018790 -0.016692 0.013508 0.018673 -0.022646 
+0.001040 0.011552 -0.019485 -0.004848 0.008214 -0.010600 
+0.005733 0.003785 -0.000088 0.008714 0.001069 -0.002952 
+0.007894 -0.000337 -0.004778 -0.001224 0.008602 -0.006569 
+-0.008474 0.007444 -0.009218 -0.014411 -0.001125 -0.028537 
+-0.011025 0.002763 -0.079924 0.006334 0.069457 -0.108882 
+0.034484 -0.069830 -0.044399 0.010788 -0.024387 -0.014724 
+-0.001875 -0.018125 -0.016250 -0.006699 -0.034690 -0.018540 
+-0.010667 -0.021333 0.155000 -0.018295 -0.023182 0.078068 
+0.014885 -0.005513 -0.030872 -0.010542 -0.009754 0.003695 
+0.022823 -0.040227 -0.044501 -0.017600 -0.020000 0.008800 
+0.009821 -0.014643 0.024286 0.002333 0.023333 -0.007000 
+-0.023291 -0.012582 -0.003909 0.004942 -0.020058 0.009070 
+0.054000 0.027500 -0.027000 0.066032 -0.070159 0.053651 
+0.014545 -0.019091 -0.048182 -0.001455 -0.000727 -0.006364 
+-0.043734 -0.018546 -0.073409 -0.020087 0.005458 -0.025873 
+-0.004460 -0.000621 -0.016484 -0.001951 0.021725 -0.012564 
+0.008056 -0.015278 0.009444 -0.007290 -0.058148 0.015572 
+0.023048 -0.020190 0.023762 -0.009762 0.022381 0.083810 
+0.020400 -0.027200 0.038333 0.039226 -0.052145 -0.025371 
+-0.058333 -0.021923 -0.032885 0.018439 -0.025585 -0.039415 
+0.124873 -0.096734 0.017590 0.003646 -0.005687 0.008841 
+-0.023696 0.004920 -0.005138 -0.026935 -0.019471 0.005285 
+-0.006879 0.000889 0.005352 0.007260 0.007104 -0.017886 
+-0.002417 -0.006271 -0.004221 -0.004329 -0.013136 -0.002294 
+-0.004123 -0.008655 -0.003508 0.007949 -0.000288 -0.003562 
+0.012110 0.011713 -0.013504 0.007976 0.000996 -0.015453 
+0.004335 -0.009548 -0.002298 -0.002242 -0.006209 0.004660 
+-0.002500 -0.001129 0.006304 0.004021 0.001791 -0.009167 
+0.013812 0.002064 -0.021357 0.012831 0.010945 -0.018114 
+0.032322 0.018460 -0.011563 0.000079 0.015543 -0.043377 
+-0.052507 0.057625 -0.054869 0.007667 0.016400 0.006467 
+-0.013333 0.073333 0.043333 0.039264 0.052272 0.014429 
+0.038534 0.044453 -0.015800 0.052233 0.022216 -0.041704 
+0.000994 -0.000269 0.001149 0.001973 0.001551 -0.000525 
+-0.001089 0.001483 0.001286 -0.002027 -0.001689 0.003664 
+-0.000026 -0.002246 -0.001332 0.004831 -0.000796 -0.002265 
+0.001152 -0.001906 0.000606 -0.000750 0.002910 -0.000526 
+0.005663 0.003059 -0.007242 0.005673 0.008870 -0.011963 
+0.005015 0.009179 -0.010708 0.003525 0.005590 -0.007291 
+0.004222 -0.002026 -0.005673 0.003456 0.000355 -0.004517 
+-0.004535 -0.004965 0.003005 -0.001409 -0.012104 0.002161 
+-0.001818 -0.006808 -0.003455 -0.007907 -0.006242 -0.011894 
+-0.014826 0.020450 -0.031181 -0.017659 -0.015974 -0.024522 
+0.014103 -0.029744 -0.037949 0.029509 -0.008705 -0.039911 
+0.023586 -0.020691 -0.016349 0.000000 -0.005385 -0.006154 
+-0.025370 -0.009259 0.006852 0.026145 -0.002661 0.029903 
+0.004735 0.005568 -0.015455 -0.041114 -0.012865 -0.063395 
+0.026333 0.019333 0.013333 -0.023128 -0.015473 0.050206 
+-0.060000 -0.026167 0.052333 0.017778 -0.071111 0.004444 
+0.032548 -0.003558 -0.006106 0.079286 0.031071 -0.035357 
+0.135918 0.045408 -0.135612 0.011190 -0.020714 0.006429 
+0.001392 0.006961 0.006961 -0.004931 -0.013611 0.038264 
+0.002575 -0.020548 -0.020119 -0.010384 -0.043447 0.010315 
+-0.005973 -0.006368 -0.015496 0.007097 -0.014476 0.000994 
+0.002408 -0.013544 0.008775 0.006711 0.006316 0.006974 
+-0.002540 0.053000 0.017780 -0.004872 0.003248 -0.027778 
+0.007381 0.001310 -0.024762 -0.001190 0.006762 -0.009952 
+0.000000 0.004667 -0.031333 -0.014167 -0.043678 -0.017471 
+0.007728 -0.061975 0.017062 0.005682 -0.023909 0.019409 
+-0.027458 -0.024839 -0.018865 0.007101 -0.000197 -0.004361 
+0.023736 0.002108 0.002291 -0.007779 -0.013180 0.021813 
+-0.008532 -0.014485 0.010484 -0.002208 -0.003811 0.002634 
+0.001044 -0.002199 0.001764 0.001415 -0.002172 0.000286 
+0.001492 -0.002094 -0.000171 0.000312 -0.000395 0.000644 
+-0.027383 -0.006378 0.000341 -0.014417 0.004072 0.001315 
+0.007902 0.002806 -0.021659 0.044635 -0.015519 -0.047673 
+-0.002318 -0.000513 0.003584 -0.000155 -0.002494 0.004245 
+-0.005926 -0.002747 0.006893 -0.011141 -0.004016 0.005396 
+-0.006835 0.002420 -0.004629 0.005535 0.008178 -0.011607 
+0.007528 0.004831 -0.005879 0.007996 0.009518 -0.009941 
+0.071311 0.069208 -0.054563 0.156630 0.135106 -0.088933 
+0.000172 0.000029 -0.002500 -0.001682 0.000275 -0.002440 
+-0.002266 -0.001094 -0.000078 -0.003937 0.000236 0.000000 
+-0.002903 -0.001935 0.001719 -0.002420 -0.003026 -0.001450 
+-0.002797 -0.005594 -0.001579 -0.004319 -0.005952 0.000368 
+-0.002887 -0.001209 0.000379 0.006134 0.003290 -0.004260 
+0.009750 0.008699 -0.008784 0.005094 0.006111 -0.004185 
+-0.002241 -0.001980 0.000350 -0.002246 -0.001805 -0.001116 
+0.000543 0.003872 -0.003278 0.002330 0.007907 -0.001965 
+0.003085 0.010183 -0.000760 -0.005776 0.016335 -0.008348 
+0.029000 0.001140 0.000407 0.070408 0.033061 -0.057959 
+0.055374 -0.016463 -0.022075 0.028736 -0.019908 0.003287 
+0.013565 -0.009498 0.019665 -0.023838 -0.003973 -0.036000 
+-0.004713 -0.045833 -0.011782 0.012524 -0.022762 -0.007952 
+0.019333 0.007333 0.040000 -0.003981 0.015926 0.003981 
+-0.048182 -0.028685 0.036881 -0.056528 -0.036111 0.033194 
+-0.039529 -0.055353 0.002647 0.011908 0.025592 0.041053 
+0.007619 0.040952 0.056190 -0.019059 0.076235 -0.004000 
+0.045455 0.025141 -0.062853 0.055059 0.013765 -0.051000 
+-0.054000 0.084500 -0.023500 -0.028643 -0.009762 -0.037119 
+-0.052776 0.002408 0.016756 0.025645 0.000823 0.008710 
+0.004561 0.008735 0.030118 -0.011627 -0.003223 0.013008 
+-0.029918 0.012822 -0.017895 0.004952 -0.017905 -0.009143 
+-0.013474 -0.066921 0.013921 -0.058889 0.006667 0.000000 
+0.070468 0.024355 -0.023242 0.066515 0.035152 -0.010455 
+0.000000 0.020000 0.008333 -0.130000 0.000000 0.065000 
+-0.027911 -0.022787 0.030840 -0.008669 -0.016728 -0.003082 
+-0.000082 -0.009362 -0.003728 0.002947 -0.005457 -0.002123 
+-0.006059 -0.002269 0.004853 -0.013969 0.001490 0.004098 
+-0.000572 0.010238 -0.004385 0.006589 0.002005 -0.002292 
+-0.001600 -0.000847 -0.002607 -0.001684 0.000775 0.002867 
+-0.003916 -0.001244 0.013217 -0.006342 0.003051 -0.002418 
+0.022781 -0.010102 0.010281 -0.031712 -0.024560 0.070233 
+-0.011878 -0.036393 0.045112 0.020796 -0.030438 0.017878 
+0.007321 -0.005982 0.001191 -0.001216 0.001873 -0.001647 
+-0.004863 -0.000326 0.002634 -0.001165 -0.001085 0.001902 
+0.003056 0.001478 -0.002402 0.001636 0.003243 -0.003900 
+-0.003134 0.000887 -0.001908 -0.005012 -0.001647 0.000272 
+-0.001613 0.001454 -0.001968 -0.000301 0.005493 -0.005586 
+-0.000332 0.002528 -0.002342 -0.001627 0.000392 -0.001166 
+0.000971 0.000307 0.000746 0.002057 0.002752 0.002085 
+-0.000079 0.001825 0.001905 0.000040 0.000242 0.000605 
+0.002041 0.000622 -0.002298 0.005196 0.002694 -0.003603 
+0.002817 0.003029 -0.000275 0.000806 0.000689 -0.001458 
+0.000218 0.001083 -0.000404 0.001117 0.003880 -0.002719 
+-0.001008 0.002922 -0.001110 -0.000620 -0.000964 -0.000003 
+0.000063 -0.000931 0.000141 0.000304 0.004059 0.001137 
+0.001609 0.008382 -0.000102 0.016358 0.029200 -0.015164 
+0.170107 0.060682 -0.168280 -0.004620 0.020935 -0.063238 
+-0.045662 -0.018987 -0.006028 0.129285 -0.016317 -0.009289 
+0.077082 0.054425 0.009810 -0.020129 0.015617 -0.002405 
+0.022619 -0.002476 -0.042651 0.076667 0.050205 -0.060246 
+0.062222 -0.015556 -0.045556 -0.039580 -0.019650 0.046224 
+-0.026879 -0.031795 0.014387 -0.036379 -0.029935 0.019229 
+-0.046218 -0.027607 0.017377 -0.024474 -0.034744 0.013436 
+-0.002222 0.006667 0.046667 -0.059770 -0.024751 0.040153 
+-0.104074 -0.031852 0.020185 0.000000 0.126000 0.090000 
+0.035909 0.086818 0.025455 -0.084935 0.085779 -0.087468 
+-0.081671 0.076065 -0.129703 -0.204176 -0.093846 0.129670 
+0.094991 -0.099652 -0.087026 0.069607 0.006977 -0.017381 
+-0.011660 0.067287 0.071174 -0.035261 -0.031490 -0.026450 
+-0.089200 -0.058491 -0.106455 -0.134641 0.033660 -0.083333 
+-0.018571 0.000286 -0.074857 0.046337 0.020037 -0.062930 
+-0.024069 -0.021563 0.004138 -0.061595 -0.112951 0.041085 
+-0.094475 -0.036671 0.103176 -0.009726 0.020084 0.008337 
+-0.008550 0.012232 -0.006294 0.004076 0.003057 -0.016667 
+-0.016222 -0.002834 -0.000711 -0.002499 0.003023 0.002173 
+0.007523 0.008039 -0.007711 -0.002950 -0.001429 -0.002776 
+0.000408 0.000332 0.000714 0.001520 0.001614 0.004673 
+-0.022474 0.013799 0.007487 0.048571 -0.011892 -0.071351 
+0.021575 -0.032052 -0.049321 0.008461 -0.008639 0.017766 
+-0.019623 0.001750 0.013424 0.002113 0.000431 -0.002541 
+0.005007 0.002753 -0.012167 0.000308 0.002632 -0.008158 
+-0.001191 0.001625 -0.003418 0.000639 0.000352 -0.001378 
+0.002068 0.002262 -0.001066 0.000235 0.003099 -0.001391 
+-0.001097 0.002465 -0.001809 -0.000532 0.000517 -0.000470 
+0.002194 -0.000579 0.000625 0.003188 0.000331 -0.000039 
+-0.001185 -0.000396 0.000158 -0.000838 0.000058 -0.000877 
+0.002754 0.004275 -0.001232 0.007920 0.005977 -0.000833 
+0.008635 0.001784 -0.000733 0.004220 -0.000394 -0.001754 
+0.000327 -0.000370 -0.000535 -0.001038 0.002128 0.001235 
+0.000437 0.004658 0.002267 0.000512 0.002018 0.002922 
+0.000194 -0.000272 -0.000867 0.003736 0.002379 -0.004279 
+0.000276 0.004500 -0.000149 -0.000988 -0.003342 0.002762 
+-0.005765 -0.012401 0.004865 0.001151 -0.008767 0.003534 
+-0.002505 0.011677 0.011058 -0.008379 -0.006851 0.001699 
+-0.037922 -0.026681 0.010901 -0.000989 -0.000346 0.000212 
+0.011334 0.035834 -0.048214 0.015184 -0.003937 0.007620 
+-0.031027 -0.036339 0.016905 -0.081489 -0.095767 0.074059 
+-0.117061 0.059452 -0.009581 0.057177 0.044444 -0.040841 
+0.006667 -0.024848 -0.021515 -0.049556 -0.013778 -0.005556 
+-0.003574 -0.019407 -0.013796 -0.007739 -0.025012 0.003272 
+-0.033875 -0.031736 0.002318 -0.033429 -0.068536 -0.002920 
+-0.040235 -0.046941 0.065000 -0.132925 -0.078061 0.092483 
+-0.087912 -0.090976 0.012256 0.023000 0.028800 -0.014400 
+0.045556 0.063333 -0.045556 0.039455 -0.018636 -0.019121 
+0.025088 -0.041722 -0.119530 -0.008233 -0.018167 -0.049533 
+0.027677 0.030101 0.000808 0.014087 0.006490 -0.001346 
+-0.010000 -0.025068 0.066849 -0.063125 0.047500 -0.000625 
+-0.016327 0.055918 0.052449 -0.072941 0.084000 -0.018235 
+0.019228 0.029136 -0.037284 0.008096 0.017080 0.005437 
+0.020698 -0.009270 -0.000540 0.006905 0.003393 -0.003631 
+-0.001757 -0.019641 0.011994 0.000817 0.000521 0.004813 
+-0.002556 0.004699 -0.003271 -0.008495 0.011010 0.003602 
+0.010899 0.018693 -0.005050 0.014402 0.009880 -0.010499 
+0.007895 0.005000 0.000697 -0.001424 0.007799 -0.001151 
+0.001160 0.019053 0.003629 -0.016302 -0.036990 -0.007036 
+-0.035897 -0.039744 0.013526 -0.009267 0.008564 -0.005646 
+-0.003491 0.000591 0.008201 -0.003969 -0.000897 0.009152 
+-0.001507 -0.000137 0.001781 0.003014 0.000639 -0.005039 
+0.001871 -0.001201 -0.004535 0.000836 0.001821 0.001917 
+0.001381 0.000047 0.000196 0.000262 -0.001204 0.001970 
+0.001070 -0.000824 0.001787 0.001564 -0.000375 0.001603 
+0.000516 -0.001509 0.000724 -0.000568 -0.001912 0.001606 
+-0.001583 -0.002403 0.001700 -0.000926 -0.000817 0.001021 
+-0.000585 -0.000629 -0.001066 -0.003934 -0.000759 -0.000138 
+-0.001127 0.002377 -0.001071 0.002161 0.003409 -0.006506 
+0.008061 0.006105 -0.003141 0.005829 0.003637 -0.004671 
+0.003035 0.001153 -0.002532 0.000445 0.000851 -0.002849 
+0.000212 0.002411 -0.002596 -0.000353 0.001790 -0.000632 
+-0.000386 -0.000978 -0.000565 -0.000357 -0.001096 0.000816 
+0.001109 -0.003553 0.001723 -0.004947 -0.007849 0.003275 
+-0.004021 -0.015617 0.002478 -0.003178 -0.008622 -0.001584 
+0.008158 0.042084 -0.011744 -0.010342 -0.029970 0.014139 
+-0.015192 -0.031824 0.017555 -1.714286 -5.734694 1.102041 
+-0.018952 -0.069442 0.035728 -0.041477 -0.069736 0.027225 
+-0.040218 -0.046226 0.021584 -0.051933 -0.052448 0.018284 
+-0.008077 -0.010155 0.017959 0.037273 -0.014394 0.015152 
+0.019810 0.017992 -0.016201 -0.004444 0.004111 0.004778 
+-0.018000 0.000000 -0.003333 -0.032857 0.046819 -0.023829 
+-0.020296 0.012772 0.000817 -0.033874 -0.020045 0.005709 
+-0.051079 -0.016454 0.001492 -0.062906 -0.025069 -0.027094 
+-0.079394 -0.060152 -0.064356 -0.126087 -0.028696 -0.067826 
+-0.042261 0.018288 -0.030720 0.005990 -0.014553 -0.009479 
+0.022028 -0.000446 0.001420 0.128516 0.102063 -0.113394 
+-0.038955 -0.016772 -0.101897 -0.028995 0.001279 -0.031005 
+0.100085 0.006383 -0.085872 0.021394 -0.009201 -0.076150 
+0.080000 0.027634 -0.049741 0.044202 0.039582 -0.051441 
+0.065556 -0.054444 -0.011111 -0.025019 -0.087566 0.077000 
+-0.006667 -0.086667 0.093333 -0.019000 0.014250 -0.051250 
+-0.007792 -0.001524 -0.038368 -0.013470 -0.015479 0.003088 
+-0.009582 -0.006637 0.000172 -0.001617 -0.000529 0.001363 
+0.010885 -0.004179 -0.005085 0.008891 0.000475 -0.003802 
+0.005830 0.002879 -0.000883 0.004005 0.004372 0.000705 
+0.002959 0.002869 0.000987 -0.021015 0.000835 -0.013327 
+-0.029323 0.025713 -0.031313 -0.010629 0.007004 -0.000969 
+0.001435 -0.005919 0.009796 0.004528 -0.007642 0.006929 
+0.002912 -0.003136 0.002647 -0.000579 0.000402 -0.001388 
+-0.001147 -0.000400 -0.000496 0.001772 0.000010 -0.000382 
+0.004271 -0.001444 0.000538 0.004022 -0.001171 0.000734 
+0.001740 -0.001667 0.001160 0.001461 0.000282 0.002611 
+0.000861 0.000578 0.001152 -0.002556 -0.001415 -0.000849 
+-0.003802 -0.002514 -0.002330 -0.003260 -0.002626 -0.003015 
+-0.002104 -0.001672 -0.002696 0.002025 0.000486 0.001187 
+0.001387 0.000590 0.004884 0.002713 0.000000 0.000775 
+0.002543 0.009547 -0.004420 0.002700 0.003873 -0.005099 
+0.001192 -0.002875 -0.000827 -0.002478 -0.006533 -0.000763 
+-0.002154 -0.006811 0.001706 -0.000530 -0.002172 0.002764 
+0.001830 0.002067 0.000412 0.001194 0.002198 -0.004514 
+-0.001978 0.001414 -0.001827 -0.004091 -0.011208 0.000830 
+-0.000648 -0.002875 -0.009457 -0.002125 -0.012295 -0.005822 
+-0.007534 0.000508 -0.000534 -0.021422 -0.040959 0.019225 
+-2.160919 -4.660920 0.034483 -1.903743 -5.272727 0.245989 
+-2.370370 -6.748148 0.555556 -3.458333 -7.680555 1.083333 
+-0.040177 -0.081719 0.019850 0.006121 -0.028534 0.004310 
+-0.025838 -0.026500 0.029479 0.017097 0.008051 0.016059 
+0.008683 0.000304 0.011354 0.014583 -0.022500 0.008750 
+0.018368 -0.030285 -0.002239 0.009283 -0.002934 -0.004098 
+0.006844 -0.026347 0.002699 -0.023426 -0.044855 0.020484 
+-0.069450 -0.067137 -0.013480 -0.082218 -0.134533 -0.093091 
+-0.032819 0.079819 -0.051199 -0.025629 0.025524 -0.025210 
+0.014642 -0.055161 0.007889 -0.007190 -0.023333 -0.001797 
+0.012317 -0.002719 -0.009578 0.009120 0.088287 0.024352 
+-0.017514 -0.048118 0.020535 0.016471 -0.032649 0.024435 
+-0.023451 -0.035298 0.042381 -0.016651 -0.077248 0.033629 
+-0.040284 -0.069091 0.009602 -0.039420 -0.086979 -0.025496 
+-0.033016 -0.013968 -0.001270 -0.012905 -0.124545 0.005736 
+0.046895 -0.091585 -0.045320 -0.015000 0.117500 -0.026250 
+-0.043467 0.013333 0.032600 -0.038203 -0.058027 0.008536 
+-0.013306 -0.016059 -0.006424 -0.000783 0.004194 -0.002371 
+-0.005774 0.009454 -0.002817 0.000403 -0.001586 0.001093 
+-0.002427 -0.012968 0.005731 -0.000291 -0.016605 0.001140 
+-0.000025 -0.005534 0.004988 -0.004109 0.001960 -0.001314 
+-0.007213 0.005456 -0.004478 0.000482 0.001920 -0.004192 
+0.005170 -0.002335 -0.000882 0.005189 -0.005314 0.001747 
+-0.000941 -0.006514 0.000254 0.001388 -0.000372 0.000446 
+0.002243 -0.001823 0.000243 0.003224 -0.001692 0.001735 
+-0.000681 -0.000917 0.003901 -0.000594 -0.003189 0.001408 
+-0.000020 0.000979 -0.000598 -0.001407 0.002815 -0.001333 
+-0.000252 0.004504 -0.001262 0.000872 0.000244 -0.004705 
+0.001502 -0.002102 -0.008074 -0.003554 -0.001794 -0.004141 
+0.001577 -0.001588 -0.003449 0.003539 0.001405 0.002374 
+0.005278 0.009105 0.005325 0.002041 0.010284 0.002105 
+-0.000609 0.003264 -0.001740 -0.002360 -0.001418 0.000144 
+0.000553 -0.000042 -0.000337 -0.003075 -0.000493 -0.000052 
+-0.006269 -0.002746 0.002179 -0.003093 -0.001265 0.002160 
+0.002932 0.001476 0.000640 0.001541 0.000601 -0.002245 
+-0.006398 -0.008712 -0.002295 -0.002859 -0.013944 -0.007648 
+0.007493 -0.004137 -0.011455 0.013851 0.003885 -0.005230 
+-0.017748 -0.016123 0.010029 -0.032579 -0.028891 0.018003 
+-2.784722 -4.256945 -0.187500 -2.282051 -4.646154 -0.230769 
+-2.591837 -5.045918 -0.045918 -2.764706 -5.926471 0.147059 
+-0.040649 -0.079035 0.010661 -0.013609 -0.109619 -0.030220 
+-0.033746 0.003145 0.020146 0.018429 0.057823 0.013554 
+-0.045527 -0.114244 0.000567 -0.020199 -0.020304 0.050865 
+0.034084 -0.132604 -0.011201 0.009207 -0.086703 -0.041921 
+0.030207 -0.073864 -0.028428 -0.005274 -0.067523 -0.066644 
+0.054617 -0.052050 -0.023098 -0.001602 0.035443 -0.029502 
+0.004598 0.032701 -0.009402 -0.033889 -0.078434 0.028081 
+0.010246 -0.061667 0.008538 0.004670 0.016344 -0.003125 
+0.025263 -0.001142 -0.009134 0.019485 0.063163 -0.079098 
+-0.003270 -0.058349 -0.022635 -0.038936 -0.015020 -0.010282 
+0.016162 -0.006098 -0.023798 -0.009412 0.018739 0.018697 
+-0.045056 0.031740 -0.008961 0.006370 -0.035268 -0.010922 
+0.032353 -0.034353 0.009529 -0.004667 -0.015333 -0.012333 
+-0.008491 -0.033362 -0.029267 0.025114 -0.033636 0.003409 
+0.065953 -0.038047 -0.016744 0.027144 -0.029142 0.030974 
+-0.003917 0.017833 0.043917 -0.014104 0.010627 0.019585 
+-0.004313 0.002885 0.002823 0.002023 0.000190 -0.006764 
+0.001095 -0.004795 -0.008437 -0.002046 0.001522 -0.003585 
+0.000229 0.003188 -0.003699 -0.000300 -0.000546 0.001350 
+0.001226 -0.001781 0.001021 0.003349 -0.001315 -0.002667 
+0.004815 0.001365 -0.003735 0.000626 0.003080 -0.003923 
+0.004655 -0.001187 -0.001997 0.009344 -0.000243 -0.000582 
+0.001778 -0.001989 -0.003258 0.001652 0.000630 -0.001856 
+0.001205 -0.000907 0.000286 -0.001346 -0.010167 0.002243 
+-0.002634 -0.004006 -0.002196 0.001223 0.001401 0.000013 
+-0.001672 0.002910 0.001694 -0.002025 -0.000282 0.001889 
+-0.004935 -0.002727 -0.000019 -0.003555 -0.004424 -0.003001 
+-0.001707 0.000578 -0.003139 -0.000462 0.002111 -0.001215 
+-0.001056 0.003667 -0.000621 -0.000554 0.003800 0.001045 
+-0.001577 -0.000859 0.000878 -0.001698 -0.000734 0.002157 
+0.000669 -0.000799 0.001783 0.000619 0.001281 0.000180 
+-0.000733 0.001609 0.000795 -0.001885 -0.000433 0.000487 
+-0.001685 -0.002132 -0.001929 0.002772 -0.003338 -0.003122 
+-0.000666 -0.000492 0.002737 -0.000185 -0.008340 0.001351 
+0.002749 0.001721 -0.011783 0.019786 0.031516 -0.023381 
+-0.024585 -0.010990 0.020059 -3.535912 -2.320442 1.994475 
+-3.994413 -3.452514 0.268156 -3.425414 -4.574585 -1.292818 
+-2.492462 -5.025126 -0.804020 -2.630682 -5.102273 -0.522727 
+-2.515152 -6.171717 -0.666667 -0.038750 -0.105622 0.001422 
+-0.046037 0.044548 -0.081652 -0.015000 0.008312 -0.041560 
+-0.017073 -0.001897 -0.019444 -0.032372 -0.079474 0.004316 
+0.010731 -0.069500 0.007154 0.045158 -0.013946 0.004869 
+-0.011569 -0.013431 0.006520 0.010303 -0.011970 0.006515 
+0.058938 -0.025358 -0.014562 0.000000 0.057222 0.021667 
+-0.010036 -0.060842 0.040394 0.086431 0.002569 0.011980 
+0.000803 0.038328 0.011171 0.017218 0.058363 0.006808 
+0.031370 0.045029 -0.008105 -0.010779 0.048662 -0.010468 
+0.046470 -0.068149 -0.020151 0.153600 -0.036000 -0.070200 
+-0.035714 -0.021486 0.016114 -0.008716 0.015000 -0.012203 
+0.014127 0.051270 0.016349 -0.025111 0.050222 -0.038889 
+0.040630 0.037109 -0.011783 0.000000 0.000000 0.000000 
+-0.060000 0.041280 -0.055040 -0.028027 -0.001836 -0.002836 
+0.007650 -0.038248 -0.023333 -0.001878 -0.002571 0.043702 
+-0.009370 0.005437 0.025325 -0.000310 -0.004218 0.007870 
+0.002844 -0.008884 0.006624 0.002402 -0.008119 -0.002019 
+-0.001384 0.004776 -0.000161 0.005519 0.006292 -0.006767 
+0.001175 -0.002677 0.005829 0.003611 -0.004533 0.001562 
+0.000830 -0.003777 -0.003864 0.001139 0.004913 -0.002961 
+0.003816 -0.001235 -0.004146 0.000984 -0.000642 0.000162 
+0.001271 0.000741 0.000348 0.001125 0.001125 -0.000750 
+-0.002207 0.004215 -0.000736 -0.003770 0.001270 0.000451 
+-0.002263 0.000265 0.001071 -0.000868 0.000075 0.001138 
+0.000350 -0.001427 -0.002863 -0.000523 -0.000124 -0.001525 
+-0.000158 0.003464 -0.000702 -0.001428 0.003083 0.001729 
+-0.003601 0.000237 0.000385 -0.002979 -0.001917 0.001598 
+-0.000447 -0.000159 -0.002640 -0.001600 -0.000179 0.000163 
+-0.000469 0.001968 -0.000171 0.001894 0.000691 0.001274 
+0.004386 0.003035 -0.005925 0.002450 0.004551 -0.002380 
+0.000787 0.000394 0.000394 -0.000287 -0.000388 0.002008 
+-0.002683 -0.002678 0.003227 -0.007726 -0.003416 -0.000638 
+0.000353 -0.005681 -0.003617 0.002775 -0.001866 -0.005547 
+-0.000043 0.000244 -0.000136 -0.011371 -0.004950 0.009078 
+-0.005245 -0.010912 -0.000826 0.000544 0.000383 -0.022779 
+-0.013299 -0.007790 0.023283 -3.641434 -2.390438 1.952191 
+-4.440433 -3.158845 0.801444 -4.859574 -4.161702 -1.293617 
+-3.860000 -5.030000 -2.395000 -2.977528 -5.264045 -1.769663 
+-3.134921 -5.468254 -1.142857 -0.035963 -0.072202 -0.000409 
+-0.011269 -0.028928 -0.047282 0.004000 -0.070000 -0.014000 
+0.012308 -0.006538 -0.006538 -0.056327 -0.079673 -0.081712 
+0.003998 0.012754 -0.003486 0.084978 0.130327 -0.040884 
+-0.120373 -0.068334 0.074169 -0.036364 -0.009091 0.018182 
+-0.011373 0.030980 -0.006078 -0.000865 -0.002733 -0.000969 
+-0.033727 -0.091945 0.026800 -0.068000 -0.026235 0.104941 
+-0.065027 -0.015027 0.053369 -0.052244 0.067789 0.038284 
+-0.033146 0.006450 0.011550 -0.014793 -0.006979 -0.027728 
+0.000278 -0.076181 -0.075069 -0.022833 -0.064267 0.014367 
+-0.013899 -0.038886 0.086127 -0.055833 -0.072262 0.064048 
+0.004845 -0.072379 -0.021435 -0.012243 -0.042851 -0.045556 
+-0.067115 0.055742 -0.001625 -0.025547 0.048384 0.090767 
+-0.055506 0.000060 0.027738 -0.001650 -0.008384 0.000034 
+0.013572 0.004270 0.050324 -0.013894 -0.002234 0.056863 
+-0.001361 -0.001226 0.003170 0.007997 0.003312 -0.008354 
+0.006496 -0.000456 0.001788 0.000166 0.006835 -0.001943 
+0.005416 0.005965 -0.004278 0.005439 -0.003629 -0.000503 
+0.005117 -0.005495 0.003189 0.003138 -0.005069 -0.000766 
+0.001584 -0.001493 0.000775 0.001803 -0.000594 -0.004838 
+-0.000576 -0.000738 -0.000352 -0.005826 -0.005457 0.001436 
+-0.006893 -0.003954 0.004328 -0.003477 -0.000934 0.003676 
+-0.000756 0.000477 0.001100 0.001179 -0.000447 -0.001220 
+-0.000532 -0.003868 -0.001016 -0.002584 -0.004375 0.002954 
+-0.003722 -0.003030 0.004342 -0.001519 -0.001519 -0.000370 
+0.000487 0.004538 -0.005348 0.001576 0.006059 -0.008884 
+0.002921 0.004142 -0.002567 -0.002062 0.000728 0.000344 
+-0.002836 0.003280 0.003723 -0.003835 -0.000813 -0.001743 
+-0.002977 0.001575 -0.002089 -0.002071 0.002051 -0.001299 
+-0.000066 0.005572 -0.002874 -0.000473 0.000744 -0.000899 
+-0.000011 0.000273 0.000513 0.000427 0.001685 -0.000841 
+0.002226 0.001292 -0.000912 -0.002636 -0.001372 -0.002103 
+-0.002704 0.000891 0.001688 0.000999 -0.000706 -0.002691 
+0.002084 0.000951 -0.002867 0.000743 -0.004321 0.005432 
+-0.001792 -0.009327 0.000764 0.014364 0.003343 -0.019240 
+0.007065 0.021171 -0.000401 -3.347640 -2.175966 2.304721 
+-4.107362 -2.705522 1.073620 -4.726708 -3.385093 -0.596273 
+-4.782946 -4.073643 -2.527132 -3.790816 -4.418367 -2.836735 
+-2.917808 -3.938356 -1.910959 -0.024340 -0.036798 -0.011375 
+-0.022799 -0.052650 -0.000869 -0.001765 0.026184 -0.023831 
+0.050667 0.041333 -0.052667 -0.048017 -0.053305 -0.021408 
+0.009619 -0.003524 -0.005162 0.021341 0.042737 0.001412 
+-0.034962 -0.059850 -0.018291 -0.064017 -0.032239 0.015952 
+-0.019644 0.003584 -0.004767 0.015333 0.038615 -0.016520 
+-0.046628 0.005219 -0.009582 -0.074286 0.006786 -0.006786 
+-0.061333 0.040667 0.040667 -0.017646 0.001958 0.090185 
+-0.071178 0.047932 0.036068 -0.088822 -0.014869 0.008608 
+-0.096794 -0.005706 -0.050604 -0.042339 0.006492 -0.009315 
+-0.080181 -0.062699 -0.010422 -0.009057 -0.000168 0.008215 
+0.028182 -0.026993 -0.040490 0.102727 -0.087774 0.035110 
+0.110909 0.002710 -0.009485 0.066623 -0.016494 -0.008571 
+-0.047500 -0.040518 -0.004502 -0.000909 0.001818 -0.029091 
+-0.012721 0.021700 0.008889 -0.007557 0.005514 0.009450 
+0.004165 0.000870 -0.005023 0.009133 0.004454 -0.008865 
+0.007905 0.006687 -0.008715 0.004518 0.005856 -0.006700 
+0.001891 0.003407 -0.003974 -0.001110 0.002849 -0.002531 
+-0.001298 0.003424 -0.000775 -0.000348 0.003182 0.001463 
+0.000500 0.001765 -0.000591 0.003928 -0.000672 -0.001142 
+-0.000603 -0.000099 0.000123 -0.005155 -0.000052 0.001157 
+-0.005666 -0.000656 0.001010 -0.000756 0.000908 -0.000994 
+0.001819 0.004131 -0.000185 0.006515 -0.000752 0.001253 
+0.003597 0.001726 -0.001601 -0.002198 -0.000091 0.000550 
+-0.002225 0.000955 0.001068 -0.000090 0.001064 0.002625 
+0.000322 0.000525 -0.000050 0.000344 -0.002009 -0.001065 
+-0.003486 -0.004893 -0.001791 -0.003805 -0.002839 -0.003198 
+-0.000646 0.003607 0.002584 -0.001276 0.002269 0.000236 
+0.003435 -0.001546 -0.007685 0.003600 -0.001336 -0.011516 
+0.002562 -0.001836 -0.007970 0.000730 -0.001187 -0.002540 
+-0.001566 -0.001540 0.000876 -0.001239 0.001654 -0.000477 
+0.001489 0.005469 0.000372 0.001776 0.003414 -0.002574 
+-0.003335 0.000909 -0.000515 0.000988 -0.000401 -0.001612 
+0.001786 0.003568 -0.006029 0.003054 0.001196 -0.007735 
+0.006199 0.003807 -0.006940 0.016749 0.012202 -0.020658 
+0.018558 0.039179 -0.022494 -3.315789 -1.690058 2.380117 
+-4.024305 -2.402778 1.152778 -4.339233 -2.852507 -0.342183 
+-4.305195 -3.136364 -2.064935 -3.880851 -3.238298 -3.119149 
+-3.084337 -3.168675 -2.746988 -0.026444 -0.032090 -0.018571 
+-0.023894 -0.035971 -0.016247 -0.016065 -0.027824 0.005648 
+-0.000624 -0.001694 0.001205 -0.002576 -0.048220 0.041780 
+-0.015050 -0.037728 -0.027718 -0.010807 -0.022793 -0.010975 
+0.090080 -0.111370 0.057141 -0.039191 -0.026966 0.037779 
+-0.001567 0.003254 0.000035 0.007574 0.019746 -0.005052 
+-0.031259 0.010492 -0.034720 -0.018250 0.053750 -0.053500 
+-0.045300 0.029286 -0.006471 -0.009912 0.007692 0.008260 
+0.009788 0.003386 -0.017884 0.003023 0.006098 0.003824 
+-0.019172 0.012781 -0.058462 0.116701 0.095782 -0.200374 
+-0.014167 0.033542 -0.005208 0.020000 0.096667 0.000000 
+0.014583 -0.030417 -0.031667 0.000000 -0.040000 -0.057273 
+0.007381 -0.036310 -0.021548 0.069615 0.016923 -0.034231 
+0.008571 0.017143 -0.014286 -0.016259 0.041920 -0.021843 
+-0.003304 0.025058 -0.027650 -0.002027 0.005683 -0.000946 
+-0.003636 -0.002598 0.005177 -0.004181 -0.006174 0.006982 
+-0.005093 -0.006902 0.009407 -0.003041 -0.003184 0.003077 
+0.003671 0.003303 -0.001851 0.002910 0.005051 -0.001580 
+-0.002136 0.001386 0.000940 -0.004384 -0.001092 0.007158 
+-0.002397 -0.000376 0.004936 0.001913 0.002678 -0.000806 
+0.002268 0.003900 -0.004263 0.001817 -0.001085 -0.002181 
+-0.002643 -0.005396 -0.000906 0.000637 -0.006271 -0.001714 
+-0.000120 -0.004090 -0.000861 0.002341 0.001754 0.000001 
+0.003961 0.001146 -0.000417 0.003934 -0.001132 -0.000200 
+0.002964 -0.001998 -0.001068 -0.000520 -0.002090 -0.000698 
+-0.003626 -0.003062 0.001318 -0.006661 -0.003591 -0.001540 
+-0.004904 -0.003917 -0.005487 -0.005248 -0.003707 -0.006811 
+0.005968 -0.000403 -0.001210 0.001066 0.005751 -0.001022 
+0.000201 0.000904 -0.004154 -0.003184 0.000647 0.000945 
+-0.003939 -0.004576 -0.000697 -0.000571 0.000428 0.000698 
+-0.000411 -0.000259 -0.000479 0.000231 0.001278 0.000852 
+0.001520 0.009100 -0.001895 0.005718 0.007779 -0.005951 
+0.004593 0.004158 -0.005623 0.003388 -0.000736 -0.005245 
+0.002478 -0.000512 -0.004315 0.005367 0.005820 -0.004837 
+0.005390 0.005652 -0.012389 0.013377 0.019125 -0.018145 
+0.006390 0.032420 -0.021259 -0.013866 -0.000405 0.021646 
+-3.512931 -1.741379 1.581897 -4.093333 -2.450000 0.206667 
+-4.228758 -2.898693 -1.428105 -4.011628 -3.213178 -2.817829 
+-3.550802 -3.401069 -3.385027 -2.947826 -3.269565 -3.495652 
+-0.036195 -0.018225 -0.024139 -0.022572 -0.027492 -0.009529 
+-0.018947 -0.037444 -0.003158 -0.027565 -0.021375 0.007512 
+0.001648 -0.040714 -0.002473 -0.000500 0.000000 0.000000 
+0.001008 -0.052899 -0.054244 -0.036073 -0.087447 -0.049920 
+-0.017005 -0.013353 0.015807 -0.001048 0.005249 0.003819 
+0.002283 -0.010262 0.000008 -0.045079 -0.014683 -0.025159 
+-0.040364 -0.023636 -0.020909 -0.014857 0.029714 -0.037143 
+-0.005293 0.013990 -0.112293 -0.009630 0.034630 -0.088519 
+0.025233 0.100054 0.010269 0.046866 0.052365 0.057536 
+0.039935 0.002922 -0.015584 0.008485 0.032121 -0.015152 
+-0.014615 0.056361 0.011272 -0.050813 0.073014 -0.056077 
+-0.036721 -0.010519 0.035649 -0.025900 -0.000071 0.020713 
+0.009286 0.006357 -0.004071 0.012685 -0.018229 -0.003294 
+-0.000385 0.001810 -0.027913 0.000426 0.003342 -0.004098 
+-0.004281 -0.002675 0.005083 -0.004350 0.003405 0.004870 
+0.000071 -0.002116 0.001076 -0.001682 0.006728 -0.004205 
+0.006253 0.010177 -0.007384 0.001501 0.002938 -0.002979 
+-0.001081 -0.001947 0.004014 -0.000626 -0.001154 0.002963 
+0.001984 0.003967 -0.000082 0.003317 0.003172 -0.006416 
+0.007998 0.007908 -0.005091 0.005270 0.003294 -0.004839 
+0.000691 -0.000372 -0.003087 -0.002682 -0.000764 -0.003289 
+-0.004656 -0.005233 -0.000447 -0.001219 -0.002235 0.000572 
+0.000281 -0.002114 0.000056 0.000304 -0.003450 -0.001826 
+0.002045 -0.002213 -0.000476 0.000439 -0.003065 -0.001849 
+-0.004752 -0.002826 -0.003163 -0.007015 0.000213 -0.000988 
+-0.004377 0.001859 0.001439 -0.000359 -0.001385 -0.002975 
+0.002027 0.002155 -0.001873 0.002715 0.001262 0.001759 
+0.002246 -0.000303 -0.000739 -0.001955 -0.002351 -0.003028 
+-0.005437 -0.002422 -0.004060 -0.005246 -0.001286 0.001929 
+0.000314 -0.001628 0.002683 0.000779 0.000420 -0.001579 
+0.004785 0.003882 -0.003581 0.001337 0.002830 -0.003498 
+0.001914 0.002901 0.002871 -0.001194 -0.001105 0.001116 
+0.001732 -0.001005 -0.003541 0.007545 0.006359 -0.010933 
+0.013575 0.015048 -0.014749 0.022117 0.010964 -0.017314 
+0.002567 0.014494 -0.020876 -0.006764 0.009685 0.014312 
+-3.020305 -1.380711 2.248731 -4.026022 -2.011153 0.866171 
+-4.457627 -2.416949 -0.894915 -4.397810 -2.737226 -2.521898 
+-3.981900 -2.855204 -3.384615 -3.235294 -2.431373 -3.607843 
+-0.034132 -0.010956 -0.025802 -0.026090 -0.013507 -0.014016 
+-0.031322 -0.012682 -0.011792 -0.021238 -0.023162 -0.004616 
+0.009722 -0.008333 -0.015278 0.002778 0.007222 -0.008889 
+-0.003179 0.038515 -0.060770 0.000545 -0.008545 0.003030 
+0.016724 -0.011463 0.011814 -0.003783 -0.023388 0.027270 
+-0.045385 -0.038154 0.024769 0.014105 -0.047163 0.025895 
+-0.010000 -0.012921 -0.029072 -0.036414 -0.020505 0.014293 
+-0.035000 0.025714 -0.025714 -0.048370 0.009482 -0.030346 
+0.027564 0.014744 -0.024359 0.049148 0.005165 0.023269 
+-0.023437 -0.027761 -0.056430 -0.075431 -0.031638 0.008103 
+0.046667 0.088308 -0.050462 0.034286 0.031607 0.046071 
+-0.024390 -0.019805 0.004829 -0.010833 -0.094167 0.021667 
+0.034329 -0.041283 0.007530 0.006833 -0.004261 0.012312 
+0.000098 0.000165 -0.000933 0.001684 0.002486 -0.003736 
+-0.000566 0.001230 0.000846 -0.003374 -0.000596 0.000157 
+-0.000812 0.004207 -0.005209 0.001997 0.009218 -0.004939 
+0.002245 0.002253 -0.003417 -0.001784 -0.003838 0.002804 
+-0.002621 -0.002173 0.004096 -0.001854 -0.000353 0.000876 
+-0.000147 0.000737 -0.000917 0.003797 0.002899 -0.001797 
+0.002894 0.001639 -0.005767 0.005225 0.005758 -0.005000 
+0.002268 0.005963 -0.001610 0.000116 0.003174 -0.000718 
+-0.001136 0.000417 0.000211 -0.001207 -0.001689 -0.000353 
+0.000785 -0.000785 -0.005868 0.002787 0.001359 -0.002073 
+-0.001134 -0.000378 -0.001345 -0.002068 -0.004983 0.000339 
+0.002062 -0.004248 -0.002311 -0.001020 -0.002762 0.000455 
+0.000308 -0.002399 0.000007 -0.001935 0.000000 -0.000276 
+-0.002462 -0.000679 -0.001962 0.000408 0.003363 -0.001647 
+-0.000502 0.003512 -0.003220 0.002192 0.007541 -0.002086 
+-0.003315 0.002624 -0.004945 -0.002316 -0.000022 -0.006013 
+0.001288 0.000000 -0.003939 0.004231 -0.000765 -0.001124 
+0.004040 0.001558 0.001866 0.000622 0.001784 0.000465 
+-0.004171 -0.005044 0.006171 -0.004669 -0.005869 0.010854 
+-0.003521 -0.000551 0.005336 0.003491 0.000444 -0.005479 
+0.007202 0.004831 -0.016021 0.012955 0.008320 -0.014380 
+0.014877 0.009344 -0.010081 -0.004148 0.001091 0.006669 
+-2.857143 -1.298137 2.211180 -3.879518 -1.425703 1.148594 
+-4.244300 -1.576547 -0.394137 -4.290323 -1.906452 -2.035484 
+-4.213483 -2.367041 -3.198502 -3.849246 -2.577889 -3.532663 
+-2.976191 -1.968254 -3.365079 -0.023819 0.001680 -0.019460 
+-0.015699 0.001106 -0.009788 -0.023283 -0.017951 -0.011350 
+0.043077 -0.047572 -0.004713 0.027901 -0.017948 -0.001142 
+-0.008782 0.047625 -0.038083 -0.031220 -0.003747 0.027162 
+0.092222 0.041470 -0.019515 0.000728 -0.033727 -0.014342 
+0.007396 -0.015804 -0.012345 0.003467 0.014267 0.013333 
+0.051667 0.042333 -0.084667 0.009606 0.017648 -0.050958 
+-0.018600 0.011343 -0.001010 -0.021299 -0.015915 -0.023453 
+-0.004218 -0.072616 -0.038769 0.060315 -0.003605 -0.012330 
+-0.025370 0.018148 -0.097870 -0.004056 -0.014090 -0.086463 
+0.010604 0.040809 -0.078409 -0.022363 0.117198 -0.082308 
+-0.001729 0.031381 -0.025619 0.001464 -0.001331 0.000000 
+-0.005307 0.004595 0.002105 -0.004146 0.002310 0.006403 
+-0.002926 0.000473 0.003251 0.000180 0.002788 0.000552 
+-0.002343 -0.000661 -0.001176 -0.001351 0.000415 0.000474 
+0.002511 -0.001686 0.000492 0.005981 -0.002018 0.000455 
+-0.001929 -0.001053 -0.000302 -0.000830 -0.004181 -0.001144 
+-0.001020 -0.001057 0.001642 -0.005464 0.000094 0.001708 
+-0.001272 0.001427 0.003104 -0.000278 0.000643 0.000676 
+0.002591 -0.001315 0.000801 0.006593 -0.001904 -0.002417 
+0.005982 0.006486 -0.005144 0.000854 0.003654 -0.001764 
+-0.003253 -0.000774 -0.000734 -0.002145 0.001739 -0.000609 
+-0.001481 0.001849 -0.002094 0.001629 0.004648 -0.000927 
+-0.000088 -0.000132 -0.000492 0.000847 -0.003306 -0.001612 
+-0.001020 -0.000408 -0.001500 0.003685 -0.001157 -0.002102 
+0.004013 -0.002138 -0.000158 0.005182 0.001870 -0.001152 
+-0.003969 -0.001358 -0.002943 0.001800 0.003118 -0.004095 
+0.007651 0.006120 -0.000596 0.003092 0.004888 0.004462 
+-0.001152 0.004056 -0.002005 0.000260 0.002419 -0.008818 
+0.002392 0.002410 -0.012159 0.006141 0.004725 -0.009352 
+0.005977 0.006719 -0.005602 0.002786 0.003110 -0.003859 
+0.000218 0.000435 0.002399 0.000812 -0.005149 0.004921 
+-0.005817 0.000297 0.006511 -0.002317 0.002782 0.000058 
+-0.000827 0.002661 0.000325 0.007209 0.003062 -0.006944 
+0.004896 0.004208 -0.009201 0.001807 0.002241 0.001952 
+-0.022592 -0.011601 0.025051 -3.761421 -1.121827 1.771574 
+-3.932203 -1.088136 0.244068 -4.071225 -1.418803 -1.299145 
+-4.300885 -2.005900 -2.619469 -4.496350 -2.562044 -3.244525 
+-4.204301 -2.376344 -3.102150 -0.029976 -0.004239 -0.022382 
+-0.009039 0.012385 -0.009941 0.006455 0.004598 0.002804 
+0.022016 -0.031808 0.006428 0.018671 0.008488 0.000600 
+0.029125 0.005220 0.010519 -0.043933 -0.163409 -0.053309 
+-0.021691 0.057302 -0.011007 -0.006901 0.030709 0.004055 
+0.001433 0.038052 0.005572 -0.025653 0.027349 -0.039220 
+0.001654 0.001254 -0.031995 0.019826 0.000772 -0.012109 
+-0.002334 -0.041480 0.013650 -0.009158 0.025691 0.024924 
+0.002556 0.001589 0.003878 0.031765 -0.171176 0.128824 
+0.016438 0.054318 -0.009292 0.007525 0.008915 -0.022192 
+-0.022906 0.061581 -0.030043 0.024545 -0.012382 0.004953 
+0.009451 -0.018586 -0.008586 -0.004203 0.019300 -0.020353 
+-0.004889 0.016583 -0.020072 -0.001382 0.008016 -0.013821 
+-0.000260 0.004753 -0.009030 0.000045 0.007928 -0.007883 
+0.003527 0.003429 -0.011279 0.002058 0.005267 -0.005297 
+-0.005346 0.001976 -0.008188 -0.004128 0.002490 -0.012500 
+-0.000692 0.003773 -0.003746 -0.000555 -0.001004 0.003056 
+-0.000405 -0.000363 0.002037 0.001284 0.000766 -0.002724 
+-0.001542 0.006122 -0.006055 -0.000846 -0.000524 -0.004374 
+0.002509 -0.001249 0.000967 0.004018 0.000256 0.000919 
+0.001791 0.002687 -0.000448 -0.000025 0.004770 -0.001720 
+-0.000712 0.004946 -0.003469 0.001148 0.002188 -0.001256 
+-0.002494 0.001362 0.000822 -0.004142 0.001288 -0.000313 
+-0.003077 0.002906 -0.002906 -0.001239 0.001239 -0.006752 
+0.000709 -0.000630 -0.003417 0.002812 -0.001498 -0.000398 
+0.005362 0.001076 -0.003192 0.007694 0.003060 -0.007716 
+0.000652 0.000308 -0.005002 0.000381 0.005280 -0.003889 
+0.001898 0.011004 0.000788 0.001890 0.007874 0.004803 
+-0.002022 0.004403 -0.000115 -0.000363 -0.000256 0.000395 
+-0.001966 -0.001312 -0.000073 0.002053 0.002484 -0.005586 
+0.006751 0.004895 -0.003596 0.004803 0.003638 0.001455 
+0.003418 -0.000055 -0.001626 0.003649 0.000113 0.000799 
+0.002404 0.003036 -0.000505 0.003872 0.002570 -0.002187 
+-0.000051 0.002781 -0.000518 -0.000144 0.003036 -0.000913 
+0.002441 0.004652 -0.002413 0.004431 0.006764 0.001050 
+-0.006326 0.003150 0.014755 -0.015273 -0.010023 0.025220 
+-3.740426 -0.685106 0.817021 -4.011940 -1.182090 -0.492537 
+-4.188482 -1.722513 -1.688482 -4.309248 -2.208092 -2.627168 
+-4.303644 -2.449393 -3.000000 -3.492958 -1.478873 -2.549296 
+-0.005602 0.015296 -0.004529 0.016933 0.018753 0.009396 
+0.033801 0.032778 0.010906 0.016701 0.030241 -0.007250 
+0.028594 0.003553 0.000797 -0.080740 -0.109946 0.004413 
+-0.068761 0.007026 0.001641 -0.014213 0.030178 0.008434 
+-0.008949 0.012868 0.003054 0.004035 -0.037282 0.014413 
+0.015369 -0.016247 -0.006168 0.027101 -0.038873 -0.011179 
+0.026023 -0.056433 -0.005556 0.014898 -0.048490 -0.070980 
+-0.025600 0.081911 0.028667 0.029228 0.012043 0.020660 
+-0.049865 -0.011213 0.071995 -0.156632 -0.112105 0.059895 
+0.066250 0.085000 0.165000 0.097092 -0.003059 -0.057833 
+0.014258 0.006616 -0.036092 -0.001354 0.011259 -0.027537 
+-0.007421 0.002404 -0.020203 -0.007297 0.007028 -0.002727 
+-0.011466 0.002187 -0.003871 -0.001572 0.003294 -0.002179 
+0.001094 0.002550 -0.006043 0.000612 0.001346 0.000624 
+-0.007234 0.016825 -0.012559 -0.005541 0.011794 -0.020521 
+-0.006908 0.004425 -0.007555 -0.003736 0.000353 0.002075 
+-0.000432 -0.000509 0.001980 0.000651 0.003300 0.000348 
+-0.001015 0.002888 -0.001577 0.000869 -0.001719 -0.003257 
+0.003671 -0.003068 -0.005649 0.003003 -0.006972 -0.001662 
+-0.000116 -0.003194 -0.005806 0.005267 0.004351 0.000000 
+0.006977 0.013488 -0.009115 0.008775 0.006636 -0.004714 
+-0.000759 0.001037 0.003869 -0.006694 0.001834 0.001467 
+-0.005242 0.003211 -0.000850 -0.001253 0.002173 -0.005853 
+0.002129 -0.001419 -0.003023 0.001145 -0.004369 -0.002913 
+0.003101 -0.003643 -0.002248 0.006306 -0.001897 -0.002211 
+0.003842 0.001366 -0.007186 0.000229 0.003247 0.000347 
+-0.002143 0.005823 -0.000990 -0.002371 0.006860 0.000646 
+-0.000837 0.006461 0.003778 0.000878 0.006379 0.004916 
+0.002035 0.002303 0.004097 0.001832 0.004118 -0.003966 
+0.005726 0.002192 -0.001706 0.004751 -0.000199 -0.000473 
+0.003235 0.000725 -0.001813 0.001298 0.000941 0.000420 
+-0.000287 0.002923 -0.000763 0.003075 0.005074 -0.004735 
+0.004724 0.005299 -0.002025 0.004025 0.002818 -0.001955 
+0.005443 0.001229 -0.003626 0.006657 -0.001611 -0.000350 
+0.000445 0.008400 -0.002911 -0.003036 0.006615 0.011807 
+-0.011225 -0.008759 0.018185 -3.494297 -0.893536 0.319392 
+-3.699690 -1.436532 -1.049536 -3.623457 -1.805556 -2.089506 
+-3.554656 -2.117409 -2.574899 -0.026069 -0.017730 -0.028823 
+0.002851 0.008266 0.003858 0.018736 0.006707 0.008602 
+0.007772 0.013035 -0.002234 0.004069 0.008623 -0.002434 
+0.009615 -0.001868 0.002584 -0.024599 -0.032833 0.000093 
+-0.040928 -0.040431 0.003451 -0.014195 -0.031225 0.003895 
+-0.041178 -0.039499 0.003720 -0.009747 -0.032743 0.006294 
+-0.013375 -0.015607 0.003108 0.011382 -0.001304 0.003875 
+0.079538 -0.036226 0.030345 0.041873 -0.087587 0.019419 
+0.015195 0.091171 0.025556 -0.054671 -0.006511 0.012854 
+-0.088703 -0.009856 0.060909 -0.084854 -0.012301 0.113725 
+0.158559 0.036820 0.053793 0.005617 0.004216 -0.117295 
+-0.000788 -0.005666 -0.023463 0.002644 -0.005501 -0.003886 
+-0.004531 -0.008072 -0.003983 -0.010816 -0.005855 -0.001162 
+-0.006114 0.002762 -0.004140 -0.001948 0.003896 -0.005455 
+-0.002400 0.000124 -0.004414 -0.004699 0.001579 -0.007396 
+0.004255 0.006057 -0.009316 -0.001408 0.008519 -0.009630 
+-0.000909 0.001803 -0.007534 -0.001741 -0.001492 -0.001477 
+-0.000913 0.001003 0.005311 -0.000394 0.001380 0.005137 
+-0.000013 0.003033 0.000659 0.000615 0.001703 0.001064 
+0.008896 -0.000849 -0.004803 0.007155 0.000163 -0.008291 
+0.007777 -0.002764 -0.005961 0.003106 -0.004209 -0.005612 
+0.002638 0.000660 -0.011742 0.000132 0.002798 -0.006064 
+0.000179 -0.000466 0.001103 -0.000033 -0.001613 0.003999 
+-0.002341 0.001565 0.003092 -0.000412 0.000618 0.000236 
+0.000336 -0.002894 -0.002222 -0.003643 -0.005570 -0.001591 
+-0.002016 -0.004108 -0.001917 0.001356 -0.004113 -0.000794 
+0.004338 0.007572 -0.001960 -0.001167 0.002732 0.003063 
+-0.002551 0.000418 -0.000784 -0.003112 -0.000521 -0.001324 
+-0.000484 0.004094 -0.000562 0.005407 0.000000 0.000296 
+0.009481 0.000174 -0.002443 0.007461 0.003239 -0.005791 
+0.002480 0.004635 -0.002946 -0.002126 0.004133 -0.002071 
+-0.003519 0.002145 -0.001559 -0.000298 -0.000570 -0.000506 
+-0.001119 -0.002398 -0.000032 0.000050 -0.000405 -0.001464 
+0.003000 0.002853 -0.002505 0.002385 0.004211 -0.000567 
+0.000927 0.001924 0.000190 0.001670 -0.000413 -0.002336 
+0.005046 0.002646 -0.005237 0.003963 0.005021 -0.000775 
+-0.002787 0.002630 0.007758 -0.013963 -0.003559 0.008511 
+-0.023051 -0.007435 -0.003169 -2.449580 -1.142857 -1.495798 
+-2.288889 -1.411111 -1.961111 -0.018134 -0.008978 -0.018846 
+-0.005003 0.026646 0.006880 -0.014486 0.024228 0.008755 
+-0.024694 0.003388 0.002997 -0.021806 -0.013818 -0.003371 
+-0.026173 -0.017403 -0.006859 -0.016488 0.005786 -0.003095 
+-0.026846 -0.015603 0.001972 -0.010527 -0.012666 0.001176 
+-0.034297 -0.024960 0.006591 -0.005017 -0.008753 0.003389 
+-0.008273 0.000186 0.000083 -0.025479 0.000811 -0.017011 
+0.056140 -0.078953 0.027526 0.040322 -0.061902 0.010301 
+0.081250 0.011106 -0.001075 -0.044963 -0.118509 0.005112 
+-0.070324 -0.071904 0.046970 -0.026167 -0.026708 0.005143 
+0.015339 0.021518 0.066741 0.004078 0.009470 0.035561 
+-0.003612 0.001773 0.022031 -0.007414 -0.002892 0.023773 
+-0.009590 -0.005142 0.018574 -0.008071 -0.002037 0.006291 
+0.001558 -0.000639 -0.000155 0.002375 0.001109 -0.003960 
+0.003031 0.002401 -0.003467 -0.006879 0.002743 0.002723 
+0.004266 0.009160 -0.003426 0.001870 0.003240 -0.005619 
+-0.002061 0.000723 -0.004771 -0.002323 -0.000898 0.001048 
+0.002165 -0.001220 -0.000741 0.001521 0.001133 -0.005603 
+0.002432 0.003932 -0.007156 0.004333 0.002281 -0.006614 
+0.010042 -0.002184 -0.004955 0.009280 -0.006952 -0.002879 
+0.008939 -0.001224 -0.000816 0.003211 0.003813 -0.003974 
+-0.005349 0.000156 -0.003618 -0.000442 -0.003759 -0.002212 
+-0.001308 -0.002508 0.001690 0.001732 -0.000506 0.001212 
+0.000492 0.000014 -0.000412 -0.001100 0.000144 -0.001194 
+-0.000425 -0.001725 -0.001968 0.001892 -0.000879 0.000081 
+0.004761 0.000216 -0.000198 0.003598 0.001034 -0.003467 
+-0.001462 0.009755 0.001324 -0.003630 0.008968 0.000614 
+-0.004877 0.004414 -0.000894 -0.004198 -0.000746 0.001187 
+-0.000705 -0.004208 0.003462 -0.000613 -0.004904 0.005703 
+0.002205 -0.004425 0.000492 0.003248 -0.000572 0.000426 
+0.003842 0.002571 -0.001392 0.002508 0.001992 -0.000246 
+0.001974 0.000462 0.001215 0.001317 -0.000362 0.000683 
+0.000378 0.001204 -0.000547 0.000357 -0.000233 0.000538 
+0.001420 -0.003097 0.004363 -0.004314 -0.001671 0.000278 
+-0.003222 -0.001711 0.001464 0.001776 -0.000895 -0.002298 
+0.007126 0.002320 -0.010314 0.007177 -0.001261 -0.020331 
+0.010283 0.004175 -0.010189 0.002368 0.001038 -0.000653 
+-0.006983 -0.001313 -0.001606 -0.007937 -0.005003 -0.008302 
+-0.004466 -0.009290 -0.009356 -0.000406 0.003937 0.001114 
+-0.000949 0.078285 0.004386 -0.018623 0.168183 0.024375 
+-0.034669 0.005108 0.004845 -0.011125 0.007803 0.002643 
+0.000131 -0.009879 -0.002219 0.003656 -0.003153 0.000289 
+0.030061 0.010000 0.000307 -0.002187 -0.013481 -0.001002 
+-0.001113 -0.022548 0.008437 0.004573 -0.001426 -0.001780 
+0.005832 0.008186 0.001249 -0.001629 0.021655 -0.009422 
+0.029941 0.026128 -0.002530 0.031403 0.024560 0.002853 
+0.039202 0.018451 0.002476 -0.029091 0.025287 -0.009669 
+0.001486 -0.029547 0.001669 0.059818 0.027914 -0.020219 
+-0.003746 -0.013853 0.047582 -1.772727 -1.945455 5.354546 
+-1.142222 -1.128889 4.848889 -0.960000 -0.938182 5.054545 
+-0.697778 -0.862222 4.800000 -0.005025 -0.009474 0.033625 
+-0.007301 -0.006418 0.007074 0.000654 -0.005269 -0.005437 
+-0.000019 0.000187 -0.000883 0.009223 0.006033 -0.005329 
+0.014397 0.015655 -0.008664 0.004581 0.008830 -0.009538 
+0.001619 0.001440 0.003047 0.000495 0.001711 -0.001020 
+0.004465 0.002633 -0.012148 0.006715 0.004582 -0.011652 
+0.003575 -0.001147 -0.005744 0.002558 0.000519 -0.002388 
+0.004740 0.000725 -0.003975 0.005513 0.000459 -0.004069 
+0.003061 0.003622 -0.001374 0.001212 0.002227 0.000691 
+-0.001625 -0.000925 -0.001536 -0.003485 -0.001362 -0.001999 
+-0.002497 0.000416 0.000672 -0.002525 -0.000361 0.001443 
+-0.002000 0.000667 0.000000 -0.000350 0.001923 -0.002681 
+0.001135 0.003200 -0.001654 0.000603 0.000823 -0.001369 
+0.000409 -0.002860 -0.002057 0.000158 -0.003285 -0.003057 
+0.004003 0.004074 0.001937 0.006045 0.004173 -0.002053 
+0.004105 0.004240 -0.005581 -0.000237 0.002115 -0.001647 
+-0.000870 -0.000217 0.001087 -0.004181 -0.000840 0.002214 
+-0.004057 -0.004141 -0.001088 0.001361 -0.001438 -0.001399 
+0.005170 -0.001263 -0.001838 0.004639 -0.002791 -0.001605 
+0.002267 -0.002158 -0.000354 0.004024 0.003381 0.000548 
+-0.002129 0.003900 0.001467 -0.001892 0.004826 0.002277 
+0.001450 0.001876 0.002540 0.003866 -0.001314 0.000310 
+0.003641 -0.003368 -0.005960 0.004439 0.001222 -0.008153 
+-0.009630 -0.006416 -0.007214 -0.010624 0.001009 -0.008563 
+0.005697 0.002116 -0.006337 0.009957 0.007704 -0.003530 
+0.003171 0.001044 0.000711 -0.004162 -0.005038 -0.005025 
+-0.000306 -0.006437 -0.004339 0.004765 0.000479 0.005179 
+0.015971 0.019189 0.008470 0.021391 0.047034 -0.009015 
+0.015972 0.010835 -0.009026 0.024085 0.028506 -0.007486 
+0.037291 0.026890 0.003503 0.044373 0.001708 -0.002202 
+0.075235 0.027609 0.004318 -0.026317 -0.038165 -0.000027 
+-0.000962 -0.024478 0.010949 0.006614 -0.009386 0.000513 
+-0.005702 0.000243 0.001794 -0.003856 -0.003183 0.001423 
+-0.001367 0.006961 0.014374 -0.056425 0.066293 0.063922 
+-0.000181 0.052053 -0.043136 0.017115 0.029233 -0.018906 
+-0.040574 -0.005292 0.007101 0.050146 0.048981 -0.059156 
+-0.008369 -0.001032 0.013585 -1.525114 -1.378995 5.264840 
+-1.530387 -1.530387 6.002762 -1.279236 -1.436754 6.114559 
+-0.957143 -1.320000 5.782857 -0.527778 -1.111111 4.490741 
+-0.002912 -0.004517 0.014816 -0.005141 -0.001866 -0.001696 
+-0.005955 -0.005303 0.005546 -0.001689 0.000505 0.005591 
+0.004712 0.006818 -0.000890 0.004585 0.003090 -0.001149 
+0.000632 -0.001310 0.003150 0.000769 -0.002367 0.000375 
+0.002235 -0.000064 -0.002957 0.002477 0.001898 -0.003142 
+0.002027 0.003522 -0.002886 0.001217 0.004595 -0.001031 
+-0.002325 0.005978 -0.001997 -0.003089 0.006443 -0.001637 
+0.000675 0.007598 -0.002068 -0.003724 0.003682 -0.003933 
+-0.003762 0.003203 0.000881 -0.004240 0.004422 0.000646 
+-0.005914 -0.002921 0.002031 -0.002988 -0.003218 -0.003882 
+0.000949 -0.000521 0.001603 -0.001749 0.000067 0.000811 
+-0.000451 -0.000142 0.000040 0.000272 -0.000357 -0.002149 
+0.000386 -0.000119 -0.004033 0.003365 0.000169 -0.001937 
+0.000036 0.002446 0.002117 0.004679 0.007206 -0.007547 
+-0.001369 0.004609 -0.005478 -0.001010 -0.000302 -0.002575 
+0.000432 -0.001017 -0.003484 0.001809 -0.002834 -0.001846 
+-0.000473 0.000351 -0.000078 -0.001316 0.005489 -0.001316 
+-0.003168 0.001240 -0.004314 0.002795 0.000683 -0.009347 
+0.000071 0.003830 0.000071 0.000694 0.000547 0.001626 
+0.000167 0.001448 0.001343 -0.001331 -0.000301 -0.001419 
+0.000664 -0.003036 -0.003740 0.001625 -0.002510 -0.005519 
+-0.004360 -0.004555 -0.006095 -0.007187 0.005216 0.000014 
+-0.003764 0.004218 0.023896 0.792929 0.414141 4.232323 
+1.554622 0.331933 5.012605 1.995192 0.317308 4.836538 
+0.025683 -0.000177 0.022258 0.001120 0.000361 0.000619 
+-0.012957 -0.009707 -0.005696 -0.001328 -0.011532 -0.003380 
+0.005002 -0.013980 0.010159 0.010056 -0.003957 -0.003489 
+0.008721 0.014063 -0.025657 -0.004086 0.014361 -0.012375 
+-0.005701 0.018811 -0.006077 0.038188 -0.022354 0.003951 
+0.082500 0.010401 -0.000408 -0.003338 -0.028140 0.015421 
+0.007851 -0.005689 -0.013831 0.000734 -0.008491 -0.022943 
+0.005734 -0.008700 -0.005963 0.006824 -0.005546 -0.001863 
+-0.001850 -0.003153 -0.000389 -0.016990 0.001007 0.054353 
+-0.016139 -0.037798 -0.000573 -0.034014 0.007348 0.016185 
+0.012541 -0.066986 -0.011636 0.013664 0.017852 -0.030874 
+-0.896341 -0.292683 4.262195 -1.332258 -1.148387 5.638710 
+-1.346939 -1.385204 5.877551 -1.254642 -1.379310 5.668435 
+-1.039867 -1.066445 4.930233 -0.725664 -0.393805 3.415929 
+-0.000788 -0.001418 0.017168 -0.000865 -0.000337 0.005457 
+0.001226 -0.001482 -0.001494 -0.000930 -0.000178 -0.000050 
+0.000194 -0.000820 0.003816 -0.000811 -0.000274 -0.000636 
+0.003412 -0.000814 -0.000435 0.004528 -0.002264 -0.002264 
+0.002461 -0.000154 -0.001662 0.002003 0.001463 -0.000320 
+-0.002068 0.001120 -0.004551 -0.000882 0.001644 -0.002320 
+-0.002302 0.000807 0.001168 0.000016 0.001548 -0.001383 
+-0.001831 0.003769 -0.003662 -0.001055 0.004102 -0.005625 
+-0.004997 0.002276 0.001055 -0.005448 -0.002549 0.001699 
+0.000589 -0.001832 0.001324 0.000994 -0.000832 -0.000823 
+0.000637 0.000727 -0.002758 -0.002013 -0.001938 -0.003145 
+-0.001356 -0.002712 -0.003559 0.000230 -0.000630 -0.005582 
+0.000007 0.001872 -0.005598 -0.001073 0.003363 -0.007476 
+-0.002777 0.003041 0.000506 0.000428 0.004092 -0.002210 
+-0.000909 0.002925 -0.005522 0.000791 0.004083 -0.005445 
+0.000105 0.001883 -0.005965 -0.002087 0.002322 -0.002350 
+-0.004185 -0.005382 -0.000594 -0.000293 -0.000458 -0.002052 
+-0.000523 0.004076 -0.004462 0.002291 -0.000323 -0.006253 
+-0.001180 0.001145 -0.001602 0.000483 0.003458 0.001850 
+-0.000315 -0.001816 0.001372 -0.000287 -0.003676 0.000815 
+0.000084 -0.004528 -0.006037 -0.010798 0.003721 -0.012242 
+-0.004996 0.005184 -0.008871 0.000742 0.003448 0.022717 
+1.166023 0.046332 4.891892 1.957627 0.014124 6.183616 
+2.372703 0.094488 6.545932 2.627010 0.173633 6.032155 
+2.474490 0.168367 4.377551 0.011352 0.001290 0.014103 
+-0.003029 0.002604 -0.003025 0.000187 -0.003808 -0.001038 
+0.006093 0.000552 0.011457 0.020267 0.002933 -0.026133 
+-0.006670 -0.003098 -0.017225 0.000426 -0.008362 -0.002874 
+-0.018608 -0.019709 0.017165 0.003810 -0.006238 0.017466 
+0.003576 -0.012073 0.025114 0.011103 0.004955 -0.017156 
+0.013418 0.014598 -0.023676 -0.002647 0.012315 0.000875 
+0.011633 0.010685 0.005354 0.012000 0.004425 0.000753 
+0.006487 0.001211 -0.003698 0.019152 0.013811 -0.026904 
+-0.001380 0.015000 -0.000799 -0.135009 0.032872 0.047106 
+0.039749 0.004909 -0.042938 0.003663 0.006329 -0.009938 
+-1.243902 -0.542683 4.567073 -1.340136 -1.020408 6.023809 
+-1.281167 -1.244032 5.891247 -1.182292 -1.286458 4.932292 
+-0.967456 -1.002959 3.624260 -0.551331 -0.376426 2.406844 
+-0.003179 0.001502 0.010778 0.000649 0.001966 -0.005797 
+0.002871 0.000917 -0.006064 -0.004227 0.003562 0.000337 
+-0.000453 0.005857 0.001177 -0.000462 0.001441 0.009516 
+-0.000814 -0.000949 0.001014 0.002504 -0.001243 -0.001749 
+0.004088 0.000422 -0.002479 0.000077 -0.000900 -0.005609 
+0.001936 0.000032 -0.005937 0.004200 0.004426 -0.005775 
+0.007168 0.005076 -0.005675 0.004511 0.001521 0.000380 
+0.000301 0.001415 -0.000148 0.000900 0.000346 -0.000277 
+0.002909 0.001893 -0.000846 0.002213 0.000885 0.001454 
+0.000722 0.002267 -0.001679 -0.003917 0.000580 0.003083 
+-0.007257 -0.000297 0.003850 -0.005702 -0.002306 0.000960 
+-0.003280 -0.004668 -0.001828 -0.004080 -0.007145 -0.003471 
+-0.001027 -0.005641 -0.006467 0.000274 -0.001938 -0.007409 
+-0.000086 0.003664 -0.003664 0.000714 0.003918 -0.003909 
+-0.000300 0.003031 -0.006056 -0.001187 0.004054 -0.004648 
+0.000372 0.001612 0.000155 -0.002077 0.000534 0.002136 
+-0.005688 -0.002176 0.004719 -0.007563 -0.005294 0.001513 
+-0.004111 0.001111 -0.002556 0.001851 0.003399 -0.004014 
+0.003876 0.006977 -0.001395 -0.000555 0.005392 0.000529 
+0.000854 0.005332 -0.001531 -0.000287 0.001746 -0.000472 
+-0.003432 -0.002672 -0.014597 -0.012001 -0.002310 -0.030328 
+-0.002483 0.004829 -0.003390 0.728033 0.355649 3.305439 
+1.534626 0.055402 5.235457 2.293556 -0.121718 6.295943 
+2.832905 -0.079692 6.861183 2.966667 0.116667 6.613333 
+2.268293 0.243902 5.146341 0.011210 0.000304 0.024644 
+0.001525 -0.000460 0.002573 -0.003535 -0.001004 -0.005904 
+-0.003442 -0.001904 -0.004620 -0.002314 0.003757 0.000180 
+-0.003368 -0.002848 0.005814 -0.004803 -0.000235 0.002420 
+-0.001644 0.004080 0.011793 0.000702 0.006602 0.018522 
+-0.000710 0.004684 0.014091 -0.007833 -0.001564 0.000787 
+-0.000885 -0.000371 0.000380 -0.007822 0.007759 -0.000021 
+-0.008876 0.009898 -0.010250 -0.007577 0.000397 -0.001050 
+-0.007344 -0.007992 0.001680 0.001757 -0.012112 -0.008577 
+0.041195 0.055276 -0.017331 0.010848 0.078713 -0.028133 
+0.043536 0.031240 -0.058209 0.011634 0.011780 -0.030089 
+-0.001845 0.005965 0.023751 -0.470588 -0.180672 5.033614 
+-0.644578 -0.656627 5.493976 -0.592896 -0.887978 4.606557 
+-0.371517 -0.826625 3.046440 -0.000942 -0.004203 0.013397 
+0.000325 -0.000631 0.000195 0.001186 -0.007956 0.001159 
+-0.006614 -0.007072 0.018371 -0.005018 -0.003892 0.014133 
+-0.000500 0.003000 0.002000 -0.009648 -0.001236 0.004741 
+-0.003757 -0.002437 0.005828 0.003362 -0.003449 -0.001716 
+0.007538 -0.002306 -0.004700 0.002984 0.003600 -0.008952 
+0.007370 0.003491 -0.002134 0.003001 0.006583 -0.008390 
+0.008213 0.003660 -0.005467 0.002851 0.000798 -0.001597 
+-0.003508 0.000354 0.001243 -0.002331 0.000187 -0.000012 
+0.001066 0.000891 0.000398 0.001260 -0.000422 0.000209 
+0.003467 0.004116 -0.006427 0.001339 0.002354 -0.000462 
+0.000037 0.001094 -0.000009 0.001362 -0.000129 0.002443 
+-0.000250 0.000228 -0.000634 -0.001167 0.001983 -0.003967 
+0.002539 0.002201 -0.004940 0.004607 -0.000559 -0.004617 
+0.004997 -0.000515 -0.002735 -0.001655 0.004476 -0.005548 
+0.002398 0.002473 -0.007005 0.000170 0.000023 -0.001996 
+-0.000781 -0.000328 0.004106 -0.000069 -0.004363 0.002089 
+0.000373 0.000851 0.000799 0.000432 0.001860 0.002251 
+0.000538 0.001269 0.001785 -0.002132 -0.000509 -0.000593 
+-0.002108 -0.003638 -0.001304 -0.001447 -0.001378 0.000423 
+-0.000851 0.000744 0.004599 0.000423 -0.001174 0.001970 
+-0.011340 -0.007555 -0.012857 -0.009207 -0.004460 -0.024680 
+0.000501 0.004179 0.000052 0.821012 0.466926 2.404669 
+1.372603 0.246575 3.805480 1.884804 0.058824 5.029412 
+2.257812 0.033854 6.000000 2.182965 0.198738 6.217666 
+1.594714 0.356828 5.348018 0.006028 0.000882 0.032574 
+0.003344 -0.006724 0.003174 -0.007607 -0.018343 -0.019638 
+-0.018037 -0.003325 0.004692 -0.015840 0.002005 0.010427 
+-0.006782 0.004638 0.000360 -0.000289 0.005845 -0.021574 
+0.004043 0.003135 -0.017541 0.004949 0.000514 -0.003558 
+-0.008950 -0.003432 0.003066 -0.022421 -0.005158 0.002848 
+-0.013308 0.004932 0.002246 -0.001446 0.001050 0.001776 
+0.001525 0.001490 -0.010897 0.001096 -0.001553 -0.002481 
+-0.003205 -0.002624 0.000807 -0.000970 0.000193 0.001899 
+0.001695 0.016076 -0.008156 0.045102 0.018763 -0.015037 
+0.029216 0.014715 -0.020627 0.016505 0.009084 -0.019509 
+0.002096 0.006023 0.003053 0.001202 0.001804 0.030850 
+0.149533 -0.355140 4.032710 0.195238 -0.571429 3.604762 
+0.001714 -0.006190 0.017767 0.002358 0.001778 -0.008846 
+0.002909 0.002112 -0.013071 0.000125 -0.003314 0.002765 
+-0.002323 -0.008014 0.005721 -0.006424 -0.008215 -0.004112 
+-0.012791 -0.005474 -0.000303 -0.007271 -0.003406 0.012296 
+-0.005993 -0.005757 0.009778 0.000166 -0.003774 0.000460 
+0.004127 -0.001532 -0.000589 0.004378 0.001135 0.001112 
+0.005149 0.006451 -0.000130 0.002806 0.003468 0.000216 
+-0.001412 -0.001633 0.000199 -0.003878 -0.004687 0.003016 
+-0.003598 -0.003849 0.003698 0.000794 -0.001588 0.000000 
+0.002704 0.000042 0.000957 0.000531 -0.000553 -0.001150 
+-0.000511 -0.000084 -0.003830 -0.001580 0.000546 -0.003647 
+-0.002529 0.000347 0.000992 0.000762 0.002506 0.003868 
+0.003402 0.000195 0.001944 0.000277 0.000894 -0.000355 
+-0.000688 -0.001271 -0.003757 0.001643 -0.001817 -0.003162 
+-0.001190 0.000367 0.001657 -0.002884 -0.001450 0.000860 
+-0.001280 0.002056 -0.002469 0.001067 0.004695 -0.000643 
+0.004665 0.002833 0.001335 0.001261 0.000847 0.002612 
+0.001155 0.000643 0.001667 -0.000410 0.001435 0.001969 
+0.000418 0.000617 -0.000042 -0.000528 -0.001526 -0.002279 
+-0.001790 0.002649 -0.006299 -0.000945 -0.000604 -0.000641 
+-0.001328 0.000247 0.001919 -0.000434 -0.003365 0.002867 
+-0.003268 -0.006499 -0.000926 -0.001287 -0.006920 -0.004831 
+-0.003013 -0.000660 -0.007458 0.003330 0.002826 0.001685 
+0.009226 0.001862 0.014849 1.203030 0.193939 3.069697 
+1.370149 0.235821 4.292537 1.377622 0.283217 4.636364 
+1.151515 0.232323 3.742424 0.002938 -0.003546 0.012388 
+0.006142 -0.005603 -0.025983 0.004038 -0.014893 -0.012179 
+0.002694 -0.000820 0.002863 -0.004424 -0.001012 0.009538 
+-0.010228 0.001008 0.000666 -0.006858 0.002761 -0.002167 
+-0.004485 -0.001348 0.003898 -0.004005 -0.005276 0.003851 
+-0.002727 -0.004545 -0.000606 -0.003411 0.002068 0.000387 
+-0.001919 0.004953 0.002261 0.002357 0.005840 0.002284 
+-0.000520 0.002769 0.000728 0.002193 0.002451 0.001061 
+0.001867 0.001047 0.000810 0.001183 0.000395 0.006305 
+-0.003116 -0.010092 0.015709 -0.019743 -0.042308 0.003797 
+-0.002561 -0.013107 0.001700 0.002922 0.000998 -0.003140 
+0.002690 0.002644 -0.002399 0.001791 0.000671 -0.001326 
+0.004538 -0.000563 0.008007 0.003221 -0.001992 0.010323 
+-0.000178 -0.001752 0.005677 -0.000819 -0.001513 0.000824 
+0.000226 -0.002268 -0.005670 0.002509 -0.002559 -0.004942 
+0.000050 -0.005697 0.000954 -0.003421 -0.008485 0.001095 
+-0.005306 -0.002866 0.006429 -0.002226 -0.004093 0.005085 
+-0.002031 -0.004441 0.002163 -0.003142 -0.004194 0.001415 
+-0.003288 -0.001520 0.000466 0.000328 -0.001639 -0.001639 
+0.000560 -0.000505 0.000027 0.000918 0.000065 -0.000079 
+-0.000912 -0.000851 0.000586 0.001264 -0.000707 -0.001623 
+0.002556 -0.000118 -0.000944 -0.002579 -0.002310 -0.002194 
+0.000909 -0.002431 0.000591 -0.003282 -0.000710 0.003595 
+0.000336 0.000561 -0.001144 0.003208 0.002686 -0.005353 
+0.003949 0.003089 -0.003693 0.000000 0.001429 -0.000084 
+0.001813 -0.000518 0.002203 0.000442 -0.001560 0.003732 
+-0.002580 -0.006405 0.004459 -0.004390 -0.008041 0.003122 
+-0.001179 0.001179 -0.000244 0.004295 0.004304 -0.003438 
+-0.000577 0.002885 -0.004603 0.005946 0.005642 -0.004080 
+0.005291 0.004615 -0.004390 0.005154 0.004154 -0.003154 
+0.005518 0.002781 -0.000011 0.003023 0.001008 0.002016 
+-0.000254 0.000936 0.000953 -0.003042 -0.000856 0.001686 
+-0.000648 -0.000584 0.000965 0.000859 0.001646 -0.000726 
+0.000603 0.001845 0.000881 -0.000198 0.001711 -0.000239 
+0.000644 0.003818 -0.001589 0.000776 0.002406 -0.006420 
+-0.005231 -0.006838 -0.015762 -0.006505 -0.004249 -0.015684 
+-0.001797 -0.001237 0.000239 0.003415 -0.001181 0.011949 
+0.004626 -0.002535 0.016616 0.003888 -0.001903 0.016771 
+0.004915 -0.004016 0.008097 0.004621 -0.007220 -0.017376 
+0.005788 0.009720 -0.015853 -0.005342 -0.018122 -0.000876 
+0.002984 -0.017515 -0.005347 0.004323 -0.010952 0.005476 
+0.000420 -0.000752 -0.002726 0.001098 -0.000703 -0.000963 
+0.002761 0.001669 0.004175 -0.000865 -0.007919 0.003670 
+-0.000708 -0.007809 -0.005084 -0.007315 0.000043 -0.007422 
+-0.005353 0.004655 -0.011153 -0.004402 0.005041 -0.014080 
+-0.002928 -0.003468 -0.005601 0.004200 0.004764 -0.000766 
+0.000544 0.003672 0.000115 -0.000481 -0.002044 0.004444 
+-0.003817 -0.006927 -0.002143 0.002371 0.003373 -0.012997 
+0.003654 -0.003245 -0.013490 0.001317 -0.000573 -0.007448 
+0.001293 0.001600 -0.002114 -0.000877 0.003682 -0.000821 
+-0.000233 0.001099 0.000567 0.008314 -0.001673 -0.004916 
+0.003797 0.001365 -0.007339 0.000179 0.001161 -0.004869 
+-0.001089 0.000116 -0.005061 0.002503 -0.001434 -0.005981 
+0.002224 0.001165 -0.005294 -0.003356 -0.001181 0.000113 
+-0.004490 -0.003040 0.002737 0.001197 -0.001969 -0.000389 
+0.006916 -0.000336 -0.004462 0.007603 0.000563 -0.004170 
+0.002372 0.001780 -0.003462 -0.000465 -0.001404 -0.002251 
+-0.000817 -0.000977 0.000231 -0.002090 -0.001230 -0.000697 
+-0.003175 -0.002666 0.001651 -0.002193 -0.002184 0.001375 
+-0.000358 -0.001283 -0.000739 -0.002717 -0.000996 -0.001416 
+-0.003121 -0.002677 -0.003382 -0.001033 -0.002560 -0.002443 
+0.003301 0.000526 -0.001866 0.005810 0.006779 -0.004132 
+0.004958 0.003705 -0.004457 -0.001509 -0.001387 0.000270 
+-0.003134 -0.008011 0.003020 -0.004172 -0.004064 0.008019 
+0.001647 -0.001443 0.003910 0.000393 0.003259 -0.001506 
+-0.002250 -0.001250 -0.000750 -0.001644 -0.001273 0.000298 
+0.000057 0.000818 0.001033 0.003387 0.002742 0.000645 
+0.004603 0.005317 0.000794 0.005668 0.005855 -0.001283 
+0.004186 0.002594 -0.003243 -0.000191 0.003682 0.002538 
+0.001960 -0.001796 0.002426 -0.001576 -0.004189 0.003670 
+-0.000526 -0.002919 0.000384 -0.000327 0.000704 -0.003067 
+-0.001496 0.001627 -0.001320 0.000315 0.000554 0.000859 
+-0.001399 -0.002318 0.007010 -0.004724 -0.003392 0.005869 
+-0.006986 -0.000499 -0.006989 0.002652 0.000420 -0.000448 
+-0.001342 -0.004629 -0.011206 -0.005297 -0.000929 -0.012121 
+-0.002523 0.001103 -0.011295 -0.000211 -0.000088 -0.014070 
+-0.005421 0.000115 -0.014340 -0.001870 0.009307 -0.006978 
+-0.002371 -0.003905 0.001501 -0.002728 -0.007812 0.011822 
+0.000768 -0.004093 0.007426 0.002102 -0.001637 0.002490 
+0.002149 0.002687 -0.000469 0.004957 0.005241 -0.001430 
+0.001732 0.008790 -0.003041 -0.001087 0.008158 -0.007676 
+-0.000159 0.007639 -0.011732 -0.005695 0.005305 -0.013115 
+-0.002283 -0.006687 -0.003800 0.004759 0.003399 -0.003870 
+0.002513 0.004662 -0.004179 0.003763 0.008414 -0.000590 
+0.002666 0.000838 0.001567 -0.000967 -0.001069 -0.007406 
+-0.003061 0.001570 -0.007252 0.004797 0.007405 -0.005462 
+0.000109 0.003433 -0.000411 -0.002451 -0.003891 0.006208 
+-0.005244 -0.007262 0.006044 -0.004300 -0.009831 0.003966 
+-0.004246 -0.005030 0.002342 -0.000998 0.001415 -0.000979 
+0.005688 -0.001761 -0.002259 -0.000327 -0.000259 -0.002150 
+-0.000793 -0.003866 0.004221 0.000760 -0.000976 0.002496 
+-0.004301 0.000063 -0.000591 0.001848 0.000623 -0.005914 
+0.000380 0.004405 -0.005711 0.002423 0.001252 -0.001092 
+0.001566 -0.001589 -0.000899 0.001509 -0.002059 -0.001515 
+0.002568 -0.000543 -0.001827 0.001643 0.000485 -0.002555 
+0.001429 0.003263 -0.003178 0.001578 0.003028 -0.001705 
+-0.001639 -0.001516 0.001598 -0.005038 -0.005800 0.003603 
+-0.004462 -0.004514 0.001780 -0.000308 0.000258 0.000037 
+-0.000128 0.004735 -0.003045 0.001404 0.002594 -0.002721 
+0.000168 -0.000060 0.000323 0.000706 0.000894 -0.000641 
+0.002409 0.003611 -0.001305 -0.000397 0.003624 -0.000403 
+-0.001488 -0.002233 -0.002114 -0.003891 -0.002315 -0.000948 
+-0.001405 -0.003884 0.002810 0.001092 0.001564 0.000194 
+-0.002285 -0.000080 -0.003979 0.000593 -0.001830 -0.002852 
+-0.003729 -0.001579 0.005441 0.001131 -0.001886 0.008297 
+0.002090 0.001878 0.005847 0.003492 0.000000 0.000952 
+0.001315 0.000737 -0.001122 0.000286 -0.001033 0.000173 
+0.001318 -0.000558 0.000279 0.002344 0.000820 -0.000984 
+0.000431 -0.000539 -0.003101 0.003534 0.000256 -0.005805 
+0.002886 -0.003308 -0.000295 0.000773 -0.001764 -0.000488 
+0.000466 -0.001882 0.001933 -0.001580 -0.005957 0.003029 
+-0.001111 -0.003615 -0.003282 0.001468 -0.002511 -0.001706 
+-0.001267 0.001312 -0.000702 -0.002305 0.002735 -0.000740 
+-0.001867 0.000868 -0.000230 -0.000395 0.003909 -0.004467 
+-0.000317 0.008921 -0.008319 -0.003424 0.006268 -0.013574 
+-0.010907 -0.000884 -0.008458 0.006836 -0.001187 -0.000255 
+0.004403 -0.008261 -0.001953 0.009124 0.002587 -0.005025 
+0.006817 0.012969 -0.011514 0.004193 0.010424 -0.017780 
+0.003611 0.007552 -0.014234 -0.001316 0.003409 -0.010458 
+0.001126 0.001446 -0.001655 -0.006019 -0.004801 0.001282 
+-0.011332 -0.001248 -0.007445 -0.002846 0.000505 -0.005548 
+0.000804 0.002872 -0.005392 0.002471 0.010473 -0.007795 
+-0.000835 0.026157 -0.011105 -0.009681 0.009261 -0.005261 
+0.005049 0.020196 -0.014444 0.002747 -0.003059 -0.003681 
+-0.000138 -0.000251 -0.000815 -0.000511 -0.003925 0.003223 
+-0.000498 -0.003691 0.002325 -0.000081 -0.001691 0.000460 
+-0.002497 0.001442 -0.001907 -0.002926 0.005352 -0.005424 
+-0.002803 0.006946 -0.004135 0.003627 0.001165 -0.004165 
+0.000536 -0.002227 0.001353 0.000074 0.000008 0.002150 
+-0.001256 0.002946 -0.001394 0.000384 0.005663 -0.002316 
+0.002042 0.000864 -0.002355 -0.000884 0.001431 -0.000278 
+-0.000572 -0.001990 0.000240 -0.000713 -0.004575 -0.002129 
+-0.000300 -0.000092 -0.000749 0.000547 -0.003515 0.005212 
+0.001077 -0.002977 0.002761 0.002154 0.002073 -0.002195 
+0.004306 0.002800 -0.003076 0.001493 0.000078 -0.001279 
+-0.002077 -0.002366 0.001246 -0.001069 -0.000916 -0.000992 
+0.000484 -0.000987 -0.000543 -0.000161 -0.001157 -0.000860 
+-0.000325 -0.001463 -0.000163 -0.002269 -0.001311 0.000206 
+-0.002202 0.001135 0.001013 -0.000640 0.001318 0.001129 
+-0.001335 0.000723 -0.000640 -0.001541 -0.002813 0.000147 
+-0.001043 -0.007068 0.002794 -0.002436 -0.005854 0.001097 
+-0.001534 0.001403 -0.001608 -0.000852 0.002241 -0.003408 
+-0.000321 0.001927 -0.003333 0.000415 0.004560 -0.003115 
+-0.000446 0.003567 -0.002969 0.003741 0.000992 -0.002686 
+0.002436 0.000868 -0.000568 0.003398 0.003534 -0.001795 
+0.008203 0.002734 -0.004609 0.004403 0.006825 0.003743 
+-0.002151 0.003085 -0.001827 0.002042 0.002773 0.001324 
+-0.000934 0.001626 0.000061 -0.001759 0.001436 -0.002537 
+-0.000357 0.000935 -0.001607 -0.002287 -0.002624 0.000755 
+-0.000935 0.001517 0.001257 -0.003813 0.001362 -0.000695 
+-0.004502 0.001878 -0.001154 -0.003440 -0.000739 -0.000939 
+-0.002736 -0.002724 0.004207 0.000946 0.000292 0.002734 
+0.001298 0.001389 0.001072 0.003153 0.002222 -0.001694 
+0.004770 0.002296 -0.004027 0.004582 0.005384 -0.009243 
+-0.000100 0.016845 -0.013612 0.007767 0.014162 -0.002213 
+-0.001892 0.005615 -0.000025 -0.001129 -0.000046 0.003637 
+0.003070 0.000163 0.002620 0.004813 0.000970 0.002815 
+-0.000630 0.000234 -0.004084 -0.006079 -0.001119 -0.005641 
+-0.006525 -0.006441 -0.005842 -0.007583 0.002325 -0.010010 
+-0.007644 0.006818 -0.002973 -0.002545 0.003147 -0.002534 
+-0.000230 -0.005167 0.003542 0.000107 -0.001804 0.002215 
+0.004312 0.007123 -0.008482 0.006581 0.009405 -0.012631 
+0.003069 0.003210 -0.010068 -0.002120 0.001625 -0.004220 
+-0.001979 0.001911 -0.002704 -0.002090 0.001081 -0.003277 
+-0.001763 0.002450 -0.001149 0.002284 0.003020 -0.002716 
+0.002215 -0.001387 -0.003383 -0.000697 0.001813 -0.005438 
+0.000104 0.001162 -0.002753 -0.000288 0.000487 -0.000962 
+0.000743 0.000901 -0.000224 0.001323 0.002744 -0.001772 
+0.002560 0.002708 -0.003988 0.003904 0.004342 -0.001842 
+0.001657 0.002345 -0.001242 -0.000700 -0.002467 0.000927 
+-0.001721 -0.002554 -0.000511 -0.000856 0.001045 0.000126 
+-0.001744 0.004155 -0.003351 0.001167 0.005333 -0.003833 
+0.000000 -0.000098 -0.000295 -0.003840 -0.002160 0.003360 
+-0.004219 -0.001641 0.002891 -0.000736 0.000775 0.000659 
+0.000092 0.003149 -0.001781 -0.000511 0.002851 -0.001616 
+-0.002187 0.001403 -0.000523 -0.000960 0.000565 0.000621 
+0.000958 0.001916 -0.001765 0.002768 -0.001015 0.000498 
+0.001937 -0.001332 -0.000545 0.000329 -0.000707 0.002216 
+-0.002890 -0.002655 0.002291 -0.001680 -0.000408 0.000136 
+0.001208 0.001581 0.000076 0.002094 0.000269 -0.001350 
+0.003748 0.001740 -0.004588 0.002970 0.003440 -0.007880 
+-0.001830 0.004975 -0.004692 -0.001021 0.004159 -0.000291 
+-0.000515 0.000956 -0.000368 0.001244 0.001926 0.001659 
+0.000431 -0.000699 0.000373 0.001069 -0.001511 0.000648 
+-0.000286 -0.001044 0.002660 0.000621 0.002416 0.001627 
+-0.001098 0.003588 0.000313 -0.001834 0.001809 -0.002190 
+-0.001444 -0.001179 -0.003231 -0.003041 -0.003993 0.001320 
+-0.000658 -0.002998 0.000927 -0.004442 -0.002046 -0.001661 
+0.000836 0.001509 -0.001824 0.000331 0.003812 -0.003966 
+-0.001431 0.003674 -0.003755 -0.000687 0.004210 -0.004699 
+0.001910 0.005594 -0.007299 0.000355 0.008211 -0.003691 
+-0.001104 0.001945 -0.002944 0.004050 0.002896 -0.002473 
+-0.002183 0.005303 -0.016375 -0.000397 0.000510 0.000361 
+-0.008501 -0.003171 0.025946 0.268456 -0.993289 4.416107 
+0.260664 -1.303318 5.507109 0.257009 -1.518692 5.981308 
+0.368794 -1.262411 4.652482 0.002688 0.002205 0.014014 
+0.005169 0.003323 -0.017861 0.007808 0.003933 -0.025911 
+0.004655 -0.000438 -0.013252 0.003148 0.000604 -0.001020 
+0.002639 0.001194 0.004889 -0.000032 -0.005328 0.002677 
+-0.006760 -0.006532 0.006445 -0.007232 -0.003601 0.006798 
+-0.001271 0.001046 -0.001523 0.000842 -0.001312 -0.003293 
+0.003977 -0.003059 -0.001743 0.000693 0.000173 -0.001429 
+-0.001018 -0.002432 -0.002971 0.000083 -0.001749 -0.003809 
+-0.000831 -0.001663 -0.003258 -0.000618 -0.001949 -0.001780 
+-0.000562 -0.001184 -0.000391 -0.000368 -0.000757 0.000181 
+0.000016 -0.000301 -0.000324 0.000382 0.000437 -0.000126 
+-0.000181 0.000483 0.000448 -0.003033 0.001441 -0.002958 
+-0.001197 0.000910 -0.001614 -0.003359 -0.002097 0.003774 
+0.001843 -0.000640 0.002211 -0.000455 0.000965 0.003406 
+0.001720 0.005430 -0.000995 0.001774 0.001089 -0.002460 
+0.000863 -0.003874 0.001120 -0.000067 -0.003979 -0.000371 
+0.000160 -0.000658 -0.000305 0.001174 0.000681 0.000305 
+0.000234 0.000828 -0.000250 0.002298 0.001048 -0.002298 
+0.000000 0.004050 -0.007934 0.010346 0.002448 -0.001557 
+0.008312 0.006159 -0.004412 0.000382 0.001637 -0.000948 
+-0.002769 -0.004000 0.005538 -0.000785 -0.006636 0.004791 
+0.001209 0.000321 0.002633 0.003204 0.003200 -0.002130 
+0.002997 0.005271 -0.001282 0.003166 0.003236 -0.004772 
+0.000454 0.001340 -0.007630 0.004929 -0.002888 -0.003100 
+0.004940 0.002987 0.001713 0.004206 0.004370 -0.000960 
+0.001398 0.001062 -0.003174 -0.002437 0.001251 -0.000725 
+-0.000728 0.003708 0.001487 0.003753 0.003451 0.000949 
+0.004507 0.002692 0.001171 -0.000202 0.001353 0.001128 
+-0.003838 0.004057 -0.003701 -0.005288 0.004257 -0.009671 
+-0.002373 0.003139 -0.013707 -0.001905 0.004447 -0.007227 
+-0.004831 -0.002535 -0.001073 -0.006415 -0.001396 0.002262 
+-0.002838 -0.000837 -0.005263 -0.006230 -0.004164 -0.011776 
+0.002157 0.006275 -0.008431 -0.008383 0.001034 -0.005988 
+-0.005624 0.003333 -0.008436 0.001580 -0.001043 -0.009180 
+-0.001753 -0.000785 -0.008370 0.003315 -0.000201 -0.008993 
+0.006881 0.004851 -0.031848 0.028523 0.074494 -0.070496 
+0.002726 0.002143 0.033348 0.009217 -1.207373 6.364055 
+0.082725 -1.562044 7.021898 0.181818 -1.632135 7.010571 
+0.317919 -1.436416 6.462428 0.001954 -0.003079 0.042433 
+0.004618 0.029238 -0.028045 0.002068 0.008909 -0.039293 
+-0.000170 -0.000153 -0.000037 0.005787 -0.009228 -0.003597 
+0.016717 0.003373 -0.018074 0.008391 0.008796 -0.010989 
+0.003305 0.003588 0.001161 0.004845 0.000456 0.001149 
+0.005457 -0.002475 -0.005449 -0.002152 0.005763 -0.008709 
+0.000817 0.001687 -0.002215 0.001490 0.002170 -0.001256 
+0.001743 0.002944 -0.000232 0.000480 0.000439 -0.000524 
+-0.002593 -0.002524 0.002219 0.000581 -0.002870 0.000835 
+-0.000096 0.004649 -0.005369 -0.000896 0.007706 -0.007169 
+-0.003846 0.002042 -0.002334 -0.005357 -0.002771 -0.001994 
+-0.009302 -0.001618 -0.002377 -0.001880 0.001880 -0.003360 
+-0.000770 -0.000449 -0.002952 -0.001380 0.001558 -0.001339 
+-0.001446 0.001906 -0.000824 -0.001285 0.000706 -0.000543 
+0.000333 0.000613 -0.000289 0.000028 0.001763 0.000468 
+0.006194 0.004914 -0.008831 0.006602 0.007146 -0.006471 
+0.002874 0.001653 -0.002108 -0.000218 -0.000588 0.003680 
+-0.000375 -0.002249 0.002823 0.001937 -0.000855 0.000271 
+0.003921 -0.000801 0.000167 0.004778 -0.000722 -0.000553 
+0.003523 -0.000871 -0.003198 -0.001166 -0.002119 -0.002755 
+-0.003126 -0.002443 -0.000552 -0.000712 -0.001145 -0.001819 
+-0.001996 -0.000377 -0.001744 -0.001377 0.001090 -0.001640 
+-0.002213 -0.001617 0.004042 -0.000654 -0.004309 0.003268 
+-0.000736 -0.001468 -0.002561 0.005169 0.001194 -0.007149 
+0.001857 0.002033 -0.009637 -0.001093 0.000224 -0.002508 
+0.002217 -0.001738 -0.000913 0.000792 -0.001963 -0.001459 
+0.000795 -0.000308 -0.000170 -0.000706 -0.000226 0.000621 
+-0.001661 0.001907 0.000517 -0.002832 0.002661 -0.001745 
+-0.006656 0.001733 -0.005667 -0.009237 0.002525 -0.007724 
+-0.007786 0.007557 -0.007340 0.001312 0.002125 -0.011439 
+-0.004269 0.003884 -0.001793 -0.002272 0.002855 -0.003203 
+-0.002420 0.004346 -0.004642 -0.000384 0.006335 -0.009358 
+0.002564 0.007011 -0.011856 0.005308 0.007248 -0.011128 
+0.004119 0.007614 -0.009153 0.001257 0.003997 -0.004898 
+-0.000939 -0.000603 0.002632 0.000601 0.000131 -0.001743 
+-0.015652 0.021872 -0.042285 -0.010039 0.015186 -0.038561 
+0.001372 0.000352 0.032782 -0.286307 -1.278008 6.692946 
+-0.141711 -1.601604 7.363636 0.022333 -1.560794 7.071960 
+0.209836 -1.124590 6.006557 0.003757 0.000635 0.035899 
+0.000544 0.009398 -0.014145 0.005435 0.003041 -0.021263 
+-0.010153 -0.007274 0.008907 0.002060 -0.005212 0.010782 
+-0.004207 -0.001794 -0.004695 -0.003869 -0.005305 -0.004196 
+-0.000161 0.000040 -0.000427 0.002258 0.007302 -0.002428 
+-0.003145 0.000750 -0.002502 0.002129 0.009005 -0.010533 
+-0.000139 0.002651 0.000093 -0.001442 -0.001560 0.002939 
+-0.000173 -0.001445 0.000273 0.003811 -0.000659 -0.001722 
+0.009573 0.001468 -0.007521 0.013598 0.005652 -0.004533 
+0.006775 0.009496 -0.019581 0.002841 0.007760 -0.011810 
+-0.000219 0.001872 -0.002690 -0.005228 0.001156 0.001216 
+-0.002929 -0.001926 0.002112 0.000095 0.000117 -0.002460 
+0.002484 0.000370 -0.005709 0.001668 0.001977 -0.007845 
+0.007833 0.008079 -0.006847 0.000907 -0.001614 -0.004472 
+-0.003059 0.001509 -0.003077 -0.001639 -0.000388 -0.005852 
+0.003709 -0.000107 -0.002755 0.001431 0.000019 -0.000555 
+-0.000299 -0.001119 0.001493 -0.001008 0.000912 0.001770 
+-0.001600 -0.001707 0.002057 -0.000627 -0.002439 0.000463 
+-0.000961 -0.001734 -0.001033 -0.001896 -0.001833 0.000417 
+-0.000379 -0.001120 -0.000677 -0.000787 0.001303 -0.002616 
+0.000249 0.002866 -0.003095 0.004682 0.000126 -0.005726 
+0.006326 -0.002071 -0.001628 0.000391 -0.001916 0.000552 
+0.001732 0.001381 -0.002417 -0.001984 0.001686 -0.000595 
+-0.000581 0.000245 0.000128 0.007151 0.002742 -0.002212 
+0.004812 0.006467 -0.006804 0.008142 0.005484 -0.000514 
+0.002223 0.002778 0.001528 0.000240 0.000705 0.000769 
+0.002195 0.002125 0.000601 0.000108 0.002778 0.002995 
+-0.000815 0.001847 -0.000887 -0.003571 0.001532 -0.002295 
+-0.006149 0.001109 -0.005206 -0.007996 0.002161 -0.007703 
+-0.004466 0.006243 -0.009179 -0.002127 0.001365 -0.007048 
+-0.000497 0.000360 -0.002495 0.001755 -0.001584 0.000845 
+0.001122 -0.002651 0.002379 0.002218 -0.002459 0.002555 
+0.003863 0.001949 0.003341 0.002220 0.004945 -0.001907 
+0.001488 0.007327 -0.006823 0.003626 0.007049 -0.000597 
+0.003921 0.003580 0.012871 0.002869 0.001778 0.004351 
+-0.008918 -0.000175 -0.043814 -0.008732 0.011932 -0.034611 
+0.003992 0.003351 0.030298 0.405286 -0.599119 6.022027 
+0.319079 -1.046053 6.546052 0.265101 -1.057047 5.701342 
+0.254386 -0.583333 3.688596 0.000071 0.000995 0.009338 
+-0.000665 0.004389 -0.015806 0.005376 -0.000574 -0.022109 
+-0.001065 -0.005078 -0.001658 0.003227 -0.002108 0.000857 
+0.007806 0.004044 -0.000916 0.011061 0.003160 -0.003542 
+-0.007405 0.012931 -0.004265 0.003465 0.016926 -0.007983 
+0.006143 0.011919 -0.004688 0.006254 0.008016 -0.003965 
+-0.001099 0.008285 -0.003889 0.000575 0.004940 -0.003959 
+0.000392 0.004188 -0.002572 -0.000006 0.005787 -0.000884 
+0.000640 0.006216 -0.001176 0.001374 0.001682 -0.000627 
+-0.003135 -0.003104 -0.002305 -0.000729 -0.002717 0.000640 
+0.000543 -0.002791 0.005409 0.000089 -0.005884 0.005367 
+-0.002090 -0.005476 0.003158 0.001522 -0.000816 -0.001435 
+0.001971 0.003922 -0.009831 0.006855 -0.000242 -0.000242 
+0.000922 -0.000213 -0.010794 0.003491 -0.000262 -0.008478 
+0.007658 0.000989 -0.008141 0.007339 0.006737 -0.010105 
+0.007039 -0.000320 -0.003017 0.002420 -0.006949 -0.000573 
+0.000560 -0.007198 0.002758 -0.001122 -0.004152 0.004749 
+0.001806 -0.001007 0.005417 0.000601 0.001373 0.001356 
+0.001192 0.003108 -0.004607 0.000420 0.003179 -0.007753 
+0.000664 0.003468 -0.003497 0.000302 0.000542 -0.000380 
+0.001374 0.000389 -0.000799 0.003219 0.001651 -0.000135 
+0.000284 0.001458 0.000764 -0.002345 0.002122 -0.000546 
+0.000476 0.004781 0.002798 0.000930 0.005911 0.002294 
+0.002854 0.006897 0.000238 0.003230 0.006417 -0.005249 
+0.004926 0.006564 -0.004927 0.004156 0.004758 0.002809 
+0.001459 0.006420 0.000741 0.002684 0.004447 -0.003553 
+-0.001853 0.005101 -0.001375 0.005196 0.003872 0.000816 
+-0.003396 0.005870 0.001953 -0.004452 0.006064 -0.001249 
+-0.003808 0.001432 -0.004181 0.000813 -0.003118 -0.001896 
+-0.000681 -0.003945 -0.003242 0.000513 -0.003026 -0.006110 
+0.001788 0.000029 -0.007353 -0.000630 -0.000553 -0.002920 
+-0.002980 -0.004375 -0.000964 -0.000619 -0.003463 0.000280 
+-0.000584 -0.000131 0.003121 0.003282 0.002094 -0.000417 
+0.003499 0.003251 -0.003136 0.003267 0.001666 -0.002557 
+0.004139 0.001104 0.003125 0.006045 0.001305 0.000337 
+0.005180 0.006281 -0.019854 0.001520 0.010025 -0.027460 
+0.000543 0.001543 -0.003655 0.002758 -0.001547 0.021428 
+0.007103 -0.002214 0.027144 0.007481 -0.003146 0.020697 
+0.002185 -0.001275 0.005324 -0.003664 0.002583 -0.017133 
+-0.000639 0.004568 -0.025321 -0.008646 -0.000665 -0.007551 
+-0.000287 0.000497 -0.002406 -0.000398 0.002546 -0.007081 
+-0.002606 0.001732 -0.004196 -0.002716 -0.001208 0.005197 
+0.000837 -0.000221 0.007220 0.005170 0.000435 0.003286 
+0.008385 0.010506 0.000777 0.014561 0.011379 -0.001577 
+0.011367 0.011789 0.002690 0.005097 0.005084 0.005374 
+0.001631 -0.000668 0.006528 -0.001208 -0.000686 0.004018 
+0.001274 0.001636 -0.004643 0.002374 0.004849 -0.012135 
+0.004045 0.000733 -0.006480 -0.000127 -0.002894 0.003868 
+0.003903 -0.002093 0.007410 0.004397 -0.001571 0.002984 
+0.004725 0.000945 -0.001417 0.004879 0.001111 -0.004278 
+0.002712 0.000239 -0.002391 0.000513 0.001567 0.000888 
+0.001733 0.003505 -0.000250 0.006000 0.005833 -0.003125 
+0.005666 0.009534 -0.010569 0.006720 0.002362 -0.009984 
+-0.002087 -0.000714 -0.004972 -0.001405 0.001468 0.001975 
+-0.003249 -0.001862 0.008518 -0.000392 -0.001992 -0.000513 
+-0.001406 -0.000668 -0.003005 -0.002098 -0.000542 -0.006606 
+-0.001259 -0.001042 -0.004258 -0.003568 0.001801 0.002564 
+-0.003631 0.003747 0.004416 -0.002138 0.001702 0.001272 
+0.001885 0.000172 0.000057 0.002901 -0.000071 -0.001575 
+-0.001819 0.001702 0.003482 -0.006526 0.001377 0.009908 
+0.001608 0.001137 0.000795 0.001319 -0.000387 0.000018 
+0.002793 0.001897 -0.000941 0.002232 -0.000697 -0.003213 
+0.005038 0.005421 -0.003682 0.006042 0.001558 -0.000456 
+0.001472 0.001436 -0.005063 0.001850 -0.000397 -0.000859 
+0.003596 -0.000970 -0.001914 0.001925 -0.002410 -0.006776 
+0.000140 -0.001200 -0.000748 -0.002386 0.001896 -0.001086 
+-0.002537 0.001108 -0.003512 -0.003014 -0.001152 -0.001684 
+-0.003719 0.000907 -0.002371 -0.002386 0.001266 -0.000592 
+0.005146 0.007669 -0.005126 0.000586 0.000770 -0.001608 
+-0.005300 -0.006646 0.004159 -0.005571 -0.009571 0.000921 
+-0.004218 -0.005194 -0.000661 -0.002440 -0.000945 -0.000889 
+-0.000492 0.000453 -0.004541 -0.000503 0.001789 -0.004985 
+-0.001206 0.001392 -0.003075 0.000287 0.001488 -0.003592 
+0.003281 0.004212 -0.006483 0.002623 0.006061 -0.006555 
+0.000293 0.001924 -0.001314 -0.000595 -0.005354 -0.003364 
+-0.000892 -0.001536 -0.005186 0.004118 -0.003132 -0.011080 
+-0.001653 -0.005900 -0.010440 -0.001615 0.018200 -0.011229 
+0.007953 0.005990 -0.017020 0.001347 0.000198 -0.002545 
+-0.001057 -0.000330 0.002484 -0.000442 0.000032 0.000076 
+0.000467 0.001034 -0.003853 0.000594 0.001610 -0.006910 
+0.000361 0.002187 -0.008491 0.000375 0.003191 -0.009541 
+0.003394 0.006914 -0.009562 0.007217 0.011959 -0.007080 
+0.011022 0.009111 -0.003728 0.006427 0.003839 -0.000074 
+-0.001435 -0.001004 0.002383 -0.006169 -0.005081 0.002828 
+-0.002511 -0.000193 0.002472 -0.000367 0.001608 -0.003734 
+0.000585 0.002536 -0.006705 -0.000994 0.001221 -0.007172 
+-0.003381 -0.001270 -0.001301 -0.000533 0.000416 -0.001046 
+0.001148 0.001021 -0.000453 0.000636 -0.000254 0.000381 
+0.000051 0.001121 0.000005 0.001457 0.004229 0.000146 
+0.005447 0.005205 -0.000712 0.006568 0.004980 -0.005702 
+0.000280 0.005187 -0.001824 0.002410 0.002612 0.001125 
+0.002849 0.000614 0.000584 0.001301 -0.001607 -0.001255 
+-0.001284 -0.003062 -0.003506 -0.003434 -0.000858 -0.002963 
+-0.003815 -0.001995 0.001348 -0.004267 -0.001494 0.005573 
+-0.005169 -0.000358 0.006810 -0.004204 0.000537 0.004014 
+-0.001588 0.000415 0.000743 0.000554 0.003097 -0.002589 
+0.000603 0.002570 -0.000071 0.001149 -0.000821 0.001224 
+0.000000 -0.002566 0.002655 0.000263 -0.001140 0.000263 
+0.000309 0.005251 0.000083 -0.000870 0.005565 -0.003826 
+-0.000482 0.007562 0.000684 -0.000368 0.004922 0.002771 
+0.004531 0.006000 0.002000 -0.000215 0.003692 0.003015 
+-0.002026 0.001807 -0.000512 -0.002131 -0.003027 -0.001308 
+0.000867 0.001645 -0.003030 0.003301 0.003139 0.001927 
+0.002502 0.002507 0.003698 -0.000888 0.000405 -0.000738 
+-0.000011 0.000138 -0.005521 -0.004336 -0.001261 -0.003066 
+-0.003706 0.002145 -0.000793 -0.003909 0.005262 -0.000660 
+0.000080 0.008195 -0.000704 0.003694 0.000645 -0.002564 
+0.002048 -0.000814 -0.001264 0.002344 -0.000171 0.002457 
+0.001616 -0.000492 0.001095 -0.000033 0.000134 0.000142 
+-0.000877 0.000967 0.001700 -0.001503 0.000672 0.001707 
+-0.001559 -0.000057 0.000907 -0.000083 -0.000198 0.000761 
+-0.000346 0.000405 -0.001254 -0.002692 0.001179 -0.003087 
+0.001662 0.001181 -0.006708 0.006508 0.002627 -0.008950 
+0.004600 0.005667 -0.008343 -0.000357 0.003946 -0.008185 
+-0.002824 0.004343 -0.009135 -0.000930 0.004164 -0.008907 
+0.000090 0.001633 -0.005133 0.001030 -0.000325 0.000122 
+0.001899 0.000090 0.002098 0.002571 0.000055 -0.000903 
+0.002406 0.000731 -0.004752 0.000896 0.001591 -0.005063 
+-0.000127 0.000288 -0.004878 0.002836 0.001468 -0.004830 
+0.004783 0.005601 -0.005725 0.004327 0.004501 -0.001356 
+0.000296 -0.004514 0.004803 -0.005046 -0.003941 0.009671 
+-0.000090 -0.002002 0.001169 -0.001117 0.001087 -0.003424 
+-0.000333 0.000345 -0.004170 -0.000073 0.000631 -0.001269 
+-0.001960 0.000342 -0.000012 0.002125 0.000979 -0.001675 
+0.005608 0.002025 -0.005977 0.003653 -0.002588 -0.001389 
+-0.001299 0.000171 -0.001139 -0.000847 0.000793 -0.001375 
+0.001797 0.003559 -0.000898 0.002439 0.005884 -0.002936 
+-0.000158 0.005583 -0.003125 -0.001577 0.005425 -0.002689 
+0.000237 0.005920 -0.003198 0.001266 0.004683 -0.002802 
+-0.001416 0.001314 -0.001579 -0.003236 -0.001494 -0.001675 
+-0.002525 -0.002535 -0.001010 -0.001121 0.000043 -0.000922 
+0.003340 0.002085 -0.000458 0.004710 0.002796 -0.002563 
+0.001003 0.003161 -0.004366 0.001379 0.001226 -0.005259 
+0.004138 0.001970 -0.005862 0.003291 0.005199 -0.009346 
+0.008082 0.005236 -0.009505 0.006992 -0.001272 -0.001090 
+0.003486 -0.002215 -0.001637 0.001370 -0.000801 -0.000741 
+0.002402 0.005981 -0.000664 0.009373 0.002007 -0.002448 
+0.005584 0.000518 -0.004138 0.004286 0.001349 -0.000390 
+0.001807 -0.001314 0.001725 0.004278 0.000389 -0.001944 
+0.000626 -0.000789 -0.000419 -0.003879 0.000972 -0.001573 
+-0.002528 0.002859 -0.003261 -0.002537 0.002380 -0.001770 
+-0.000398 -0.000488 -0.000918 0.002012 -0.000895 -0.003131 
+-0.001049 -0.001810 -0.001673 -0.000426 0.000702 -0.000446 
+0.001812 0.001616 -0.004742 0.001031 -0.001004 -0.002593 
+0.001247 0.003058 -0.003439 -0.001558 0.002368 -0.002986 
+-0.001347 0.000339 -0.002143 0.001511 -0.000111 -0.001481 
+0.002868 0.000113 -0.001101 0.004586 -0.000911 -0.001733 
+0.005389 -0.002171 -0.003622 0.004681 -0.002306 -0.001738 
+0.001969 0.001255 -0.002197 0.000260 0.003567 0.000111 
+0.002479 0.002519 -0.001293 0.001647 0.002655 -0.003254 
+0.000324 0.003678 -0.004042 0.000320 0.004867 -0.005133 
+0.003369 0.004208 -0.006732 0.004148 0.004212 -0.008099 
+0.003774 0.002830 -0.008803 0.002020 0.000098 -0.007567 
+-0.002122 0.000303 -0.002349 -0.000179 0.004859 -0.000998 
+-0.002534 0.001419 -0.000262 -0.003904 -0.000526 0.000781 
+-0.001599 -0.001353 -0.000457 0.002815 0.002496 -0.001664 
+0.001789 -0.000547 -0.006884 0.000755 -0.000019 -0.002686 
+-0.000582 -0.000420 0.000808 -0.000910 0.000064 -0.001153 
+-0.000232 0.002613 -0.005567 0.000694 0.004529 -0.009256 
+0.001463 -0.000791 -0.009487 -0.002574 0.000682 -0.002223 
+-0.001242 -0.002277 -0.001597 0.000706 -0.000797 0.000719 
+-0.001348 0.002025 0.002978 -0.002176 0.001263 0.001783 
+0.002637 0.000643 -0.001118 0.006889 -0.000031 -0.004776 
+0.007262 0.001018 -0.001377 0.002051 0.006967 -0.001024 
+0.001351 0.006893 -0.003583 0.001763 0.003361 -0.001295 
+-0.000328 0.000923 0.000572 0.000830 -0.000291 -0.000336 
+0.002194 -0.002260 -0.001703 0.002795 -0.002996 -0.006058 
+0.000986 0.005802 -0.004691 -0.001330 0.002017 -0.001181 
+-0.000927 -0.001830 0.000040 0.000364 -0.005555 -0.001670 
+0.002185 -0.001145 -0.003646 -0.000822 -0.000159 -0.000587 
+-0.000628 -0.000343 0.000541 0.000917 0.001778 -0.001295 
+-0.000936 0.002156 -0.001295 -0.001527 0.000891 -0.001120 
+-0.002891 -0.001319 -0.001699 -0.002516 -0.004194 -0.000839 
+-0.002459 -0.004090 -0.000730 -0.002382 -0.003629 -0.000265 
+0.001384 0.000298 -0.000534 0.001892 0.002046 -0.002000 
+0.002029 0.003516 0.000761 0.001417 0.000255 0.001105 
+0.000316 0.000762 -0.000259 -0.000093 0.000318 0.000116 
+0.001504 0.001901 0.001024 -0.000672 0.003856 -0.004855 
+-0.001226 0.000712 -0.001245 0.000091 0.000692 0.000779 
+-0.002108 0.001622 0.000506 -0.006129 0.000254 0.004580 
+-0.002234 -0.001975 0.004668 0.003761 -0.000406 -0.002368 
+0.000635 0.004629 0.002696 -0.000168 0.008944 -0.007360 
+-0.002295 0.006464 -0.004376 -0.000409 0.003957 -0.004554 
+-0.000208 0.004099 -0.003144 -0.000561 0.001072 -0.002151 
+-0.000053 0.000121 -0.000255 -0.002099 -0.001021 0.001801 
+-0.000335 -0.000868 -0.001443 -0.001277 -0.001123 -0.002362 
+-0.002063 -0.000350 -0.001129 -0.001781 0.002136 -0.000820 
+0.000036 0.004288 -0.001581 0.000825 0.003079 -0.001683 
+-0.000665 0.001120 -0.000347 -0.000506 0.000249 0.000219 
+0.001334 0.000046 -0.000872 0.002225 0.003116 -0.002895 
+-0.001773 0.000296 -0.002734 0.000157 0.000493 -0.002176 
+-0.001263 0.004287 0.000067 0.000017 0.003380 -0.002633 
+0.000017 0.004074 -0.001217 -0.001134 -0.000388 -0.000169 
+-0.000729 -0.001169 0.000552 -0.002217 -0.002129 0.001750 
+-0.004015 -0.002860 0.001788 -0.006122 -0.003438 -0.001508 
+-0.007467 -0.000222 -0.002066 -0.005375 0.000478 -0.001337 
+-0.002802 -0.000592 -0.000152 -0.000030 0.000322 -0.000628 
+0.002408 0.003153 -0.002708 0.002066 -0.000237 -0.002442 
+0.000229 0.002324 0.002285 0.000900 0.000768 0.002816 
+-0.000136 0.001105 -0.000196 0.001059 0.000714 -0.006741 
+0.005532 0.006229 -0.008751 0.006890 0.006640 -0.002827 
+0.003975 0.005703 -0.000503 0.001219 0.005629 -0.000991 
+0.001618 0.004580 -0.005074 0.005620 0.004784 0.000981 
+0.005105 0.004647 0.000806 0.003636 0.000250 -0.000377 
+0.003299 -0.002003 -0.002455 0.004499 -0.000820 -0.003002 
+0.001663 0.004699 -0.004408 0.001653 0.005444 -0.000328 
+0.000859 0.003336 0.000016 -0.001389 -0.001607 -0.001914 
+-0.000766 -0.003531 -0.000988 0.003230 -0.001679 -0.000935 
+0.005144 0.000612 -0.004329 0.003925 0.000739 -0.005642 
+-0.002244 -0.001756 -0.004489 -0.004119 -0.002490 -0.003468 
+0.000193 0.001539 -0.002646 0.002939 0.004205 -0.003426 
+0.002185 0.004255 -0.002137 -0.001688 0.000136 -0.003784 
+0.001783 0.000977 0.001953 0.000542 -0.000163 0.000279 
+-0.000541 -0.002186 -0.001419 -0.000742 -0.002718 -0.001098 
+-0.000803 -0.000929 -0.000379 0.001090 0.000419 -0.001746 
+0.001481 -0.000546 -0.003937 0.000136 -0.001082 -0.001743 
+0.001151 -0.001995 0.000412 0.001271 -0.001495 0.001639 
+-0.001009 0.001678 0.001664 -0.000306 0.000671 0.001900 
+-0.002837 0.000679 0.003169 -0.002088 0.001338 0.003643 
+-0.001917 0.010670 -0.004324 -0.005205 0.006794 -0.013274 
+-0.002201 0.008198 -0.014468 -0.002292 0.006695 -0.005343 
+-0.000091 0.000055 0.000025 0.000985 -0.000286 -0.001228 
+0.000922 0.000675 -0.002133 -0.001437 0.000850 0.000147 
+-0.001332 -0.000308 0.003794 0.000099 0.000450 0.002799 
+0.001084 -0.000148 0.001403 0.003152 0.005034 -0.000153 
+0.001986 0.001078 -0.002251 -0.000232 -0.000398 0.000359 
+0.000751 -0.000323 0.000134 0.002158 0.000251 0.001089 
+0.002045 -0.001178 -0.000104 0.001116 -0.001407 -0.002999 
+0.000218 0.002071 -0.004644 0.000745 0.003595 -0.004234 
+0.001396 0.002014 -0.002209 0.000688 -0.000659 -0.003052 
+0.003008 0.000835 -0.003544 0.001287 -0.000365 0.000187 
+-0.001927 0.006185 -0.005066 0.000679 0.006127 -0.001871 
+-0.001769 0.003255 -0.001722 -0.002159 0.003206 -0.002590 
+-0.002692 0.003711 -0.002823 -0.001473 0.003029 -0.002889 
+-0.000455 0.001471 -0.001585 -0.001307 0.000104 -0.002139 
+-0.001539 -0.000429 -0.002354 -0.002597 -0.001179 -0.000307 
+-0.000984 -0.001979 -0.000339 0.000772 -0.000698 0.001226 
+0.002257 0.000384 -0.002126 0.001899 -0.000674 -0.004694 
+0.003724 0.001636 -0.006965 0.005257 0.004262 -0.001959 
+0.006097 0.004084 -0.001548 0.003728 0.005899 -0.004111 
+-0.000752 0.000387 0.000331 0.002200 0.001781 0.001006 
+0.006232 0.001389 -0.000168 0.005751 -0.000111 -0.000644 
+0.000108 0.000326 0.000185 -0.004682 -0.001980 0.001551 
+-0.001528 -0.004585 0.002927 0.002201 -0.003542 0.001582 
+0.001796 -0.001246 0.001414 -0.000387 0.001920 -0.001036 
+0.002252 0.004206 -0.002847 0.001814 0.003917 -0.002746 
+-0.000999 0.002032 -0.000344 -0.005275 -0.002274 0.000484 
+-0.006240 -0.007068 0.000552 -0.001562 -0.007691 -0.001355 
+0.001528 -0.003720 -0.000863 0.001159 -0.001187 0.000280 
+-0.000095 -0.001224 -0.005279 0.002496 0.003685 -0.004925 
+0.000158 0.001061 0.002908 0.000059 0.001609 0.001843 
+-0.000801 0.001176 0.000629 0.000194 0.003355 0.002589 
+-0.001999 -0.001751 0.006377 0.000523 -0.000729 0.005720 
+0.002567 0.000277 0.002795 0.002195 -0.003532 -0.001459 
+0.001045 -0.004445 -0.002933 -0.000362 0.000833 -0.003444 
+-0.003599 0.003365 -0.001343 0.001561 0.002685 0.002094 
+-0.004851 -0.005443 -0.000434 -0.005054 -0.006215 0.009332 
+-0.003064 0.011228 -0.006133 -0.011054 0.015213 -0.012345 
+-0.008323 0.011405 -0.014118 -0.007380 0.006154 -0.006782 
+-0.004082 0.000265 -0.001724 0.001282 -0.001065 -0.000353 
+0.006894 0.002989 -0.005028 0.005652 0.003551 -0.003333 
+0.001129 -0.000647 0.000753 0.000698 -0.002302 -0.000356 
+0.001101 -0.001135 0.000275 0.001311 -0.000507 0.000344 
+0.000958 -0.000417 0.001014 0.001018 0.000424 0.000603 
+-0.000159 0.000361 -0.000309 -0.001220 -0.001992 -0.001888 
+-0.001893 -0.004184 -0.000998 -0.001600 -0.001440 -0.000320 
+-0.000484 0.000109 -0.000625 0.000122 -0.000458 -0.000321 
+0.002885 0.000962 -0.004809 0.002946 0.006530 -0.003793 
+0.007977 0.005148 -0.000314 0.007183 0.007106 -0.007261 
+0.003320 0.002327 0.002270 0.001184 0.001150 0.001446 
+-0.000687 -0.001908 0.002595 0.000818 -0.002500 0.000409 
+0.000816 -0.001078 -0.000022 0.000740 0.002196 -0.000386 
+0.001635 0.004173 -0.005027 0.000280 0.003796 0.000080 
+0.000608 0.002446 -0.003341 0.000532 0.000418 -0.002177 
+0.001663 0.003303 -0.001822 0.003045 0.003672 -0.005634 
+0.005789 0.001191 -0.005079 0.004626 0.000833 -0.004375 
+0.002311 0.001400 -0.005865 0.001456 0.004712 -0.004952 
+0.005212 0.005971 -0.000701 0.006170 0.007012 -0.005048 
+-0.001386 0.002176 -0.002777 0.006144 -0.001271 -0.000336 
+0.007962 0.000615 -0.001806 0.002818 0.001303 -0.000949 
+-0.003821 -0.000283 0.001930 -0.005364 -0.003561 0.002251 
+-0.001984 -0.004352 0.000320 0.003974 -0.002769 -0.002324 
+0.008433 -0.001463 -0.003491 0.007660 -0.003800 -0.003809 
+0.004185 -0.001908 -0.004269 -0.001080 -0.002322 0.002218 
+-0.004476 -0.001631 -0.000878 -0.005263 0.000103 0.000482 
+-0.000888 -0.000885 0.001188 0.001559 0.001553 -0.001621 
+0.005162 0.001434 -0.004048 0.004960 0.000533 -0.006330 
+0.006430 0.004100 -0.005788 0.007307 0.002705 -0.001894 
+0.001239 -0.000354 -0.001858 0.002490 -0.000451 -0.000783 
+0.003015 0.001381 -0.000108 0.002255 0.003319 -0.001769 
+0.001310 0.002758 -0.001718 -0.000360 -0.000954 0.000202 
+0.001165 -0.002500 0.000799 0.001383 0.000383 0.002290 
+-0.000093 0.004034 0.000779 -0.000839 0.003278 -0.001759 
+-0.001066 -0.003109 -0.005103 -0.002115 -0.011623 -0.006974 
+0.003007 -0.006400 -0.004478 -0.002061 0.005057 -0.001314 
+-0.007524 0.013145 0.000130 -0.013732 0.015009 -0.002973 
+-0.014912 0.011762 -0.009273 -0.005598 0.011518 -0.010851 
+-0.001888 0.006046 -0.004549 -0.000009 0.000235 -0.001343 
+0.003704 0.002129 -0.001167 -0.000668 0.006591 -0.002674 
+0.002436 0.007690 -0.003934 0.001714 -0.000286 -0.000786 
+-0.000827 -0.000991 0.001917 -0.004564 -0.003083 0.003114 
+-0.005244 -0.002277 0.001828 -0.001578 0.000550 0.000412 
+0.001529 0.003121 0.000176 0.001763 0.003054 -0.000856 
+0.000409 0.000249 -0.000064 -0.000877 -0.000402 -0.000200 
+0.000273 0.000676 0.000465 0.000310 0.002164 0.001817 
+0.001919 0.000858 -0.001615 0.002035 0.003674 -0.003542 
+0.002137 0.005313 -0.007084 0.002231 0.010238 -0.005777 
+0.005360 0.008529 -0.005187 0.005194 0.006264 -0.004341 
+0.004884 0.007243 -0.002587 0.003421 0.009404 -0.003590 
+0.005117 0.004288 -0.005261 0.000174 0.000232 0.000313 
+0.001575 -0.000464 -0.001252 0.001370 0.000679 -0.003432 
+0.002634 0.002408 -0.001492 0.000555 0.001500 -0.000417 
+-0.000446 -0.002074 -0.000014 0.000895 -0.004897 -0.001397 
+0.002847 -0.002439 -0.000851 0.000317 -0.001016 0.002032 
+-0.002488 -0.003556 0.005837 -0.003036 -0.004882 0.003326 
+-0.002752 -0.001341 -0.000621 0.001562 0.002792 -0.001122 
+0.003571 0.006169 -0.003776 0.005116 0.002558 -0.002093 
+0.001710 0.002336 -0.003378 0.004488 0.000573 -0.001828 
+0.002067 0.001638 0.000045 0.001065 0.005216 0.001219 
+-0.000211 0.004771 0.001970 0.000109 -0.000129 -0.000081 
+0.003846 -0.004493 -0.002099 0.005189 -0.004848 -0.002001 
+0.003478 -0.001373 -0.001987 -0.000094 0.000877 -0.001805 
+-0.001702 -0.000257 -0.001754 -0.001818 -0.000596 -0.000568 
+0.001311 0.003185 0.000262 0.000743 -0.002550 -0.005632 
+-0.000990 -0.001499 -0.004328 -0.003027 -0.001752 -0.003186 
+-0.003924 -0.002121 -0.003364 -0.005877 -0.002923 0.002938 
+0.002495 0.003008 0.002893 -0.000901 0.001209 0.000651 
+-0.001145 -0.000430 0.001980 -0.001354 0.001578 0.000457 
+-0.000891 0.000113 -0.000299 0.000575 0.000821 0.000303 
+0.000228 -0.001243 0.000497 -0.000361 -0.001974 0.002714 
+-0.000277 0.002769 0.002908 0.002398 0.008466 0.002012 
+0.003057 0.006248 0.000922 -0.007028 -0.002461 0.001971 
+-0.004278 0.005466 0.003065 -0.008861 0.014646 -0.003185 
+-0.013470 0.017957 -0.002660 -0.014581 0.016237 -0.002727 
+-0.007940 0.016291 -0.001951 -0.006037 0.006523 -0.000661 
+-0.000130 0.000227 -0.000713 0.003109 -0.001335 -0.001552 
+-0.000198 0.000447 -0.000032 0.000000 0.002232 -0.001116 
+-0.000509 0.000524 0.000146 -0.000185 -0.000467 0.001710 
+-0.001455 -0.000371 -0.000172 0.002084 0.001058 -0.003622 
+0.001933 0.004203 -0.000552 -0.001884 0.001855 0.000232 
+-0.003338 -0.000503 0.000405 -0.001130 0.000212 0.000813 
+0.003143 0.001095 0.001314 0.005514 0.003177 0.000474 
+0.002873 0.002136 0.000280 -0.000219 0.000168 0.000034 
+0.000416 0.000139 -0.003285 0.001596 0.002697 -0.004531 
+0.000144 0.003699 -0.004123 -0.001688 0.000947 -0.001174 
+-0.001890 -0.000630 -0.001260 0.000238 -0.001587 -0.000238 
+0.004206 -0.000190 0.000095 0.005794 -0.000615 -0.004923 
+0.004949 -0.000771 -0.004993 0.004688 0.000807 -0.003804 
+-0.001112 0.003662 -0.001373 -0.000978 0.002223 -0.000585 
+-0.003818 0.001253 -0.001026 -0.001557 -0.003475 -0.000438 
+-0.001995 -0.005115 -0.000030 -0.000499 -0.004692 0.002135 
+0.000020 -0.001664 0.000805 0.004250 0.005280 -0.007024 
+0.000534 0.010519 -0.009430 0.001906 0.007942 -0.005991 
+0.002494 0.005093 -0.001748 0.002686 0.002897 -0.000226 
+0.002243 -0.001031 -0.000948 -0.001846 -0.003482 -0.003584 
+-0.003302 -0.011170 0.001321 -0.004002 -0.007431 -0.002741 
+0.000045 0.000808 0.000308 0.005037 0.006904 0.002009 
+0.005313 0.003694 0.000911 0.002767 -0.001640 -0.000931 
+0.000421 -0.004289 -0.002050 -0.000450 -0.004834 -0.002103 
+-0.000833 -0.004846 -0.002111 -0.002680 -0.005127 -0.001282 
+-0.002752 -0.005504 0.000301 -0.001702 -0.003306 0.001168 
+-0.003285 -0.000073 0.000073 -0.002016 -0.000823 0.001307 
+-0.001365 -0.001382 0.001918 0.000709 -0.000240 0.001647 
+-0.000070 0.000841 0.001355 -0.002315 -0.002303 0.002281 
+0.000441 0.007196 0.000819 -0.000213 0.004034 -0.005165 
+-0.001886 0.005730 -0.004847 0.001525 0.004084 -0.002277 
+-0.000726 -0.002517 -0.000434 0.000861 -0.004479 -0.000909 
+0.001847 -0.001479 0.002322 0.005124 0.006389 -0.002348 
+0.005528 0.010494 -0.004155 -0.000387 0.008677 -0.006434 
+-0.003848 0.004600 -0.004454 -0.008228 0.002947 0.000755 
+-0.007738 0.009039 0.003673 -0.008849 0.014838 0.002679 
+-0.009380 0.017789 0.001458 -0.007923 0.010520 0.009655 
+-0.010479 0.013184 -0.000595 -0.006678 0.007771 -0.001589 
+-0.001768 0.001659 -0.002907 -0.000451 0.000292 -0.002533 
+0.000182 -0.000975 -0.001750 0.000864 0.001521 -0.001279 
+0.002427 0.004767 -0.003618 0.004649 0.004553 0.000623 
+-0.002012 0.001380 -0.001322 -0.002100 -0.003622 -0.000655 
+-0.002468 -0.001863 -0.000955 0.002591 -0.001116 -0.002080 
+0.003830 -0.002393 -0.000342 0.000208 -0.000350 0.000159 
+-0.002446 0.000719 -0.002734 0.001152 0.001627 -0.002505 
+0.000234 0.002284 0.001103 -0.000126 0.003159 0.000831 
+-0.000138 0.001815 0.001155 0.001135 0.000145 -0.000723 
+0.000387 0.001939 -0.002133 -0.000911 0.001879 -0.002522 
+-0.000883 -0.000418 -0.000372 -0.000763 -0.000458 -0.001069 
+-0.000516 0.001031 0.002109 -0.001392 -0.000987 0.003815 
+-0.000048 -0.002199 0.002900 -0.000272 -0.000644 0.000111 
+0.000177 0.002474 -0.002519 -0.000401 0.004010 -0.003333 
+-0.000801 0.001703 0.000067 0.000990 0.001287 0.000138 
+-0.000872 -0.001365 -0.000018 -0.003158 -0.002139 -0.003715 
+-0.004416 0.000153 -0.007487 -0.004163 0.000804 -0.006776 
+-0.003252 -0.001119 -0.003333 -0.004022 -0.001296 -0.003702 
+-0.004419 0.003581 -0.003907 -0.002682 0.004732 -0.000834 
+-0.000056 -0.000574 -0.000182 -0.001720 -0.005489 -0.002442 
+-0.002565 -0.008326 -0.001964 0.001212 -0.006177 -0.002028 
+0.002724 -0.003145 -0.000672 0.000776 -0.003562 -0.001181 
+-0.003675 -0.005466 -0.002551 -0.007997 -0.006465 -0.003427 
+-0.008316 -0.007516 -0.002776 -0.001734 -0.007184 -0.003021 
+0.005152 -0.004056 -0.005709 0.005508 0.001890 -0.008924 
+-0.000466 0.006319 -0.008066 -0.003538 0.002835 -0.006714 
+0.000928 0.003222 -0.005297 0.001507 -0.001507 -0.004485 
+0.002919 -0.000463 -0.002340 0.000605 -0.000474 -0.001998 
+-0.000405 -0.000087 -0.001256 -0.003725 0.000470 -0.000452 
+0.004669 -0.000277 0.001142 0.000408 0.000931 0.002925 
+-0.001618 0.000064 0.002021 -0.000446 0.001028 0.000205 
+0.000314 -0.000750 -0.000380 0.002160 -0.001897 -0.000860 
+0.004536 0.001480 -0.005682 0.003602 0.003034 -0.003213 
+0.000631 0.000468 -0.002149 0.003933 -0.003010 0.003715 
+0.011177 0.000851 0.002235 0.000639 0.004595 -0.000623 
+-0.004297 0.010024 0.002432 -0.006107 0.013594 0.003399 
+-0.006148 0.013564 0.005763 -0.007511 0.009454 0.004890 
+-0.004740 0.005591 0.001977 -0.001110 0.001999 -0.000459 
+0.001463 -0.000267 -0.000320 -0.001088 -0.000055 -0.001446 
+-0.001066 0.004216 0.001749 0.004618 0.008926 -0.002647 
+0.005788 0.006782 -0.003474 0.003820 0.002360 -0.006180 
+-0.000017 0.001898 0.000360 0.000580 0.000401 0.000877 
+0.002187 0.000505 0.000404 0.002294 0.001068 -0.002057 
+0.003513 0.000511 -0.003194 0.003174 -0.000848 -0.002787 
+0.002394 0.000211 -0.000211 0.003598 -0.001044 -0.001857 
+0.004930 -0.001219 -0.002279 0.002590 -0.002142 -0.001428 
+-0.002592 0.001689 -0.002291 -0.001844 -0.000475 -0.002373 
+0.000288 -0.001693 -0.001021 -0.000374 -0.003364 -0.001126 
+-0.000629 -0.004374 -0.002461 -0.000281 -0.003662 -0.002675 
+-0.000227 -0.001124 -0.000423 0.004018 0.003071 0.001300 
+0.007117 0.002962 -0.005217 -0.001364 0.002512 -0.001793 
+-0.000804 0.004407 -0.002283 0.000900 0.002570 -0.002484 
+0.002362 -0.000088 -0.002642 0.002260 -0.000983 -0.000070 
+-0.000540 0.000869 -0.001375 0.000419 0.001139 -0.000223 
+0.001375 0.002213 0.001493 0.000664 0.006167 0.000126 
+-0.003469 0.007457 -0.010254 -0.004139 0.009604 -0.008701 
+-0.002540 0.001862 -0.003278 0.000327 -0.002960 -0.000496 
+-0.003852 -0.002259 -0.001969 -0.005788 -0.004613 0.000305 
+-0.000215 -0.003130 -0.000980 0.003492 -0.001767 -0.004440 
+-0.002116 -0.001653 -0.000839 -0.004458 -0.004407 -0.002459 
+-0.003922 -0.001357 -0.001607 0.002523 0.000630 0.000420 
+0.006471 -0.002474 -0.001787 0.003943 -0.006110 -0.003915 
+0.004098 -0.003414 -0.004222 0.007296 0.003092 -0.006275 
+0.007312 0.007227 -0.008171 0.006463 0.006380 -0.005196 
+-0.002714 0.004429 -0.004071 -0.001375 0.001469 -0.003414 
+-0.001635 -0.001607 -0.002706 -0.001466 -0.003846 -0.004044 
+-0.002820 -0.002192 -0.003719 -0.002029 -0.003581 0.002328 
+0.000322 -0.000858 -0.000217 0.002211 -0.001103 -0.001476 
+0.001534 -0.001815 -0.003101 -0.000409 -0.001551 -0.003686 
+-0.000839 -0.000864 -0.001780 0.001200 0.000002 0.000018 
+0.002973 0.002029 -0.002524 0.003737 0.005317 -0.005309 
+0.002771 0.003412 -0.009912 0.001430 -0.000700 0.002147 
+0.020353 -0.003782 -0.002147 0.001810 0.001446 -0.001038 
+-0.004055 0.004397 0.005761 -0.006281 0.004778 0.007860 
+-0.007774 0.004822 0.005481 -0.005162 0.004609 0.000042 
+0.000479 0.002119 -0.006387 0.003831 -0.003386 -0.000201 
+0.002354 -0.003116 -0.003674 0.001475 -0.000360 -0.002266 
+0.000495 0.000807 -0.001918 0.000536 0.000324 -0.002147 
+0.002992 -0.000850 -0.001701 0.003528 -0.001196 -0.003408 
+0.003538 -0.000124 -0.005987 -0.000294 0.002674 -0.002433 
+0.000509 -0.002557 -0.004610 0.004167 0.001704 -0.004096 
+0.004658 0.004635 -0.000819 0.003365 0.005365 0.001455 
+0.001084 0.003835 0.001251 0.000862 0.000956 0.000175 
+-0.000457 0.001583 -0.000114 0.004740 0.001655 -0.001185 
+0.001905 0.001787 -0.004884 -0.002695 -0.000437 -0.002330 
+-0.004794 -0.000752 -0.002052 -0.001980 0.001309 -0.002583 
+0.002398 0.001968 -0.002326 0.003109 0.001837 -0.002584 
+0.000823 -0.000054 -0.001020 -0.002823 0.000000 0.000806 
+-0.001186 -0.001934 0.004754 -0.001584 -0.001876 0.004091 
+-0.001169 0.000667 0.001071 0.000496 0.002334 -0.001663 
+0.003233 0.001075 -0.001438 0.003091 0.001406 -0.000796 
+-0.000370 0.002720 -0.003461 0.000754 0.002666 -0.004567 
+0.000384 0.003699 -0.007275 -0.001640 0.003364 -0.010505 
+0.005455 -0.009913 -0.006277 -0.001312 0.001953 -0.009327 
+-0.001582 0.005494 -0.007252 -0.001959 0.006000 -0.004531 
+0.000749 0.002847 0.000582 0.000926 0.000697 -0.000107 
+0.001325 0.000087 -0.000360 0.002688 -0.000525 -0.002181 
+-0.000891 0.000526 -0.002853 -0.002516 -0.003828 -0.002267 
+-0.003798 -0.003932 -0.002970 -0.004945 -0.001182 -0.001790 
+-0.000639 0.004182 0.001847 0.009898 0.003156 -0.001288 
+0.009344 0.000275 -0.006882 0.003123 -0.000642 -0.003911 
+0.001523 -0.000427 -0.001880 0.001268 -0.000309 -0.001127 
+-0.001634 -0.001084 -0.000404 -0.003105 -0.005856 0.002221 
+-0.001626 -0.008001 0.001235 0.000858 -0.004127 0.003160 
+-0.007372 -0.005648 0.004882 -0.001507 -0.001179 -0.001299 
+0.003042 0.000239 0.002337 -0.001597 0.000361 0.000142 
+-0.003259 0.000928 -0.000436 -0.000952 -0.000114 -0.003086 
+-0.002590 0.000495 -0.004199 0.002448 -0.001513 0.000170 
+-0.001480 -0.001289 0.005768 -0.003447 -0.007695 0.007050 
+-0.005132 -0.001932 0.007340 -0.000135 -0.003408 0.001311 
+0.001308 -0.008392 0.002630 -0.002128 -0.013874 0.002057 
+-0.005736 -0.007916 0.004380 -0.004066 -0.002632 0.003944 
+-0.002181 -0.000877 0.001762 0.000576 -0.000406 -0.000946 
+0.004829 0.002238 -0.004415 0.005390 0.001860 -0.005644 
+0.001230 0.002684 -0.000943 -0.003454 0.000432 0.004403 
+-0.004731 -0.001266 0.002723 -0.000458 0.002519 0.000763 
+0.002463 0.003030 -0.001564 -0.000382 0.000393 -0.000336 
+0.001528 0.000436 0.001528 0.001646 0.005147 0.000208 
+0.003679 0.006036 -0.003443 0.005808 0.003765 -0.001821 
+0.003741 -0.000205 -0.000073 0.002132 -0.002022 -0.000614 
+0.002385 -0.000725 -0.000217 0.002743 0.001807 -0.001300 
+0.000643 0.002357 -0.002357 -0.000966 0.001104 -0.001519 
+-0.001030 0.001487 0.000214 0.000884 -0.000631 -0.000253 
+0.003376 -0.002831 -0.004445 0.004133 0.000632 -0.009674 
+0.005474 0.004502 -0.004184 0.002198 -0.001343 -0.002759 
+-0.000861 -0.001553 -0.002444 -0.001498 -0.001706 -0.001676 
+0.000268 -0.002879 0.000843 0.000508 0.000677 0.001077 
+0.002511 0.001996 0.000195 0.001765 0.001140 0.000743 
+0.000376 0.001403 0.001066 0.002293 0.002764 -0.000023 
+0.004013 0.006987 -0.000372 0.004489 0.009604 -0.007328 
+0.003773 0.009915 -0.008356 0.001702 0.008930 -0.008815 
+-0.000718 0.008725 -0.011521 -0.003416 0.000000 -0.008783 
+-0.001873 -0.005670 -0.004779 -0.001348 -0.006407 -0.002555 
+-0.002988 -0.002251 -0.003077 -0.000004 0.001692 0.000127 
+0.006532 0.000811 0.000229 0.011377 -0.003770 -0.003734 
+0.006528 -0.010022 -0.006412 0.004162 -0.010336 -0.001419 
+-0.001838 -0.001812 -0.003305 0.011639 0.010262 0.007883 
+0.025910 0.001482 0.006700 0.011612 -0.003949 -0.004329 
+0.002329 -0.002017 -0.002883 0.001305 -0.004071 -0.004006 
+0.001598 -0.003023 -0.003476 0.003582 -0.000587 -0.003638 
+0.003142 -0.000107 -0.003539 0.000522 -0.001710 -0.003866 
+0.000225 0.000518 -0.006348 0.001119 0.002281 -0.006370 
+-0.000474 0.000944 0.000133 -0.000045 -0.000210 -0.000266 
+0.002394 -0.003518 0.006881 0.002416 -0.005614 0.011185 
+0.002595 -0.001103 0.005250 0.007444 0.002225 -0.002050 
+0.008317 0.006607 -0.000389 0.001102 0.000365 -0.000376 
+-0.005995 -0.000591 0.001162 -0.003595 -0.002910 0.000490 
+0.003412 0.000837 -0.010947 0.005451 -0.002101 0.000604 
+0.007539 -0.000286 0.000170 0.001306 -0.005523 0.003438 
+0.001444 -0.002667 0.001923 0.001131 -0.001788 -0.002909 
+0.002719 -0.000135 -0.004313 0.005484 0.000189 -0.002049 
+0.005285 0.001200 0.000617 -0.000197 0.002930 0.001170 
+-0.001422 0.002299 -0.000760 -0.000693 0.001243 -0.003239 
+0.004692 0.004962 -0.004962 0.008230 0.007335 -0.004490 
+0.003068 0.004950 -0.007076 -0.000342 0.002311 0.000582 
+0.004345 0.000798 -0.002232 0.005067 0.004678 -0.006917 
+0.006459 0.005658 -0.005845 0.002332 0.003737 0.001051 
+-0.000102 0.001442 0.000134 0.001586 -0.000432 -0.000233 
+0.004411 0.000812 -0.000972 0.004805 0.001096 0.000322 
+0.000945 0.000302 0.000857 -0.002181 0.001201 -0.000980 
+-0.002874 0.003202 -0.003552 -0.002048 0.004313 -0.003865 
+-0.000595 0.002766 0.000434 0.000602 0.001464 0.000815 
+0.000480 0.000818 0.000882 0.001004 0.000639 0.000597 
+0.002598 0.002118 -0.001785 -0.000176 0.001595 -0.001424 
+0.000288 0.001069 0.001162 -0.002858 -0.000531 0.000648 
+-0.004103 -0.000724 0.001345 -0.002067 -0.000232 0.001584 
+0.001661 0.000941 -0.000513 0.001739 0.002783 -0.003037 
+0.004720 0.001284 -0.005258 -0.000110 0.002305 -0.001003 
+0.000863 0.004207 -0.001184 0.001956 0.006960 -0.001601 
+0.004849 0.009508 -0.006633 -0.004446 0.005556 -0.006351 
+-0.004745 0.001226 -0.007045 -0.002289 -0.002152 -0.004791 
+-0.001085 -0.001557 -0.000714 0.002556 0.000650 0.001413 
+0.007666 -0.000038 0.000322 0.007196 0.000334 -0.006334 
+0.000624 0.000846 -0.003747 -0.001187 0.007630 -0.006781 
+0.001196 0.008894 -0.003748 0.001050 -0.001268 0.001057 
+0.000165 0.012965 -0.003140 0.016004 0.017996 0.000091 
+-0.013823 -0.018715 0.004162 -0.006644 -0.007739 0.003019 
+-0.004236 -0.005847 0.000088 -0.000807 -0.003437 -0.001607 
+0.002160 -0.000681 -0.001951 0.001363 0.000083 -0.002152 
+-0.000896 0.001028 0.000061 -0.000336 0.001008 0.001176 
+0.000260 -0.000270 -0.000027 -0.000624 -0.001373 -0.001921 
+0.002536 -0.000408 -0.000003 0.000102 -0.001389 0.000409 
+0.003490 -0.000964 -0.001575 0.004305 -0.002649 -0.008514 
+0.013380 0.004398 0.001273 0.009055 0.004522 0.002762 
+0.003998 -0.000262 -0.002757 0.007229 0.004251 -0.005363 
+0.000342 0.002837 0.001932 0.017010 0.009624 0.001912 
+0.006957 0.002609 -0.003978 0.001433 -0.002035 0.000306 
+0.001077 -0.001699 -0.004119 0.000571 -0.002949 -0.003234 
+0.004374 -0.002083 -0.003263 0.007903 0.001054 0.000640 
+0.006059 0.003233 -0.001739 0.002870 0.000160 -0.000739 
+0.000885 -0.001794 -0.000155 0.000862 -0.001553 0.000057 
+0.000806 0.000000 0.000000 0.000350 0.002359 -0.000917 
+-0.002493 0.002625 -0.000131 0.000409 0.004779 0.002013 
+0.002723 0.004874 0.000908 0.005113 0.004207 -0.005226 
+0.003715 0.002845 -0.006627 0.002516 0.000726 -0.003027 
+0.002190 -0.000219 -0.000073 0.002263 0.001029 0.002407 
+-0.001114 0.001569 0.002521 -0.002433 0.000811 -0.001339 
+0.000074 0.003993 -0.003881 0.000219 0.002811 -0.004342 
+0.001759 0.002367 -0.002303 -0.000276 0.001810 -0.000428 
+0.002281 0.003516 -0.000111 0.005628 0.002130 0.001354 
+0.004068 0.002078 0.002051 0.001327 0.000692 -0.000241 
+-0.001304 0.000166 0.001419 -0.003332 0.003062 0.000203 
+-0.001089 0.004360 -0.003993 -0.000939 0.003876 -0.003287 
+0.002997 0.004619 -0.002434 0.001090 0.002644 -0.002603 
+0.000099 0.002234 -0.003550 -0.000025 0.003336 -0.000560 
+-0.000109 0.000929 0.002567 -0.001264 0.001330 0.003641 
+-0.000532 0.002737 0.002504 0.000912 0.002677 -0.000687 
+-0.001611 -0.005269 -0.006484 -0.004562 -0.010202 -0.009017 
+-0.002710 -0.004710 -0.002542 -0.000568 0.001296 -0.000925 
+0.001695 -0.000001 -0.003048 -0.000839 -0.000272 -0.005943 
+-0.000212 0.000033 -0.000265 0.003259 -0.000768 -0.003988 
+0.002968 0.003757 -0.003656 0.008178 0.008570 -0.008321 
+0.010815 0.004870 -0.003031 0.010953 0.005043 0.000650 
+0.005170 0.016475 -0.014105 -0.005976 0.040528 -0.027844 
+0.029307 0.026206 -0.030738 0.015902 0.011523 -0.015787 
+0.012497 0.004864 -0.005676 0.005787 0.003285 -0.000775 
+0.003761 0.004582 0.000564 0.005145 0.006675 0.001127 
+0.007389 0.006311 0.000348 0.004462 0.003464 -0.008660 
+0.003125 -0.001369 -0.004374 -0.001008 0.000105 -0.002898 
+0.003178 0.000708 -0.004174 0.001222 0.002254 -0.005059 
+0.001138 -0.000623 -0.003373 0.002370 0.000575 -0.002308 
+0.000007 0.000563 -0.001615 -0.001460 -0.000601 0.000150 
+-0.000063 0.000120 -0.000529 0.003552 0.006092 -0.002140 
+0.007379 0.010968 -0.010082 0.008746 0.016224 -0.013711 
+0.005756 0.015338 -0.013726 -0.000133 0.007872 -0.007862 
+-0.001478 0.001085 -0.002494 0.001380 0.000476 -0.001332 
+0.003503 -0.000164 -0.001916 0.004168 0.000258 -0.001543 
+0.001616 0.002385 -0.009129 -0.002305 0.006401 -0.014282 
+-0.019603 0.013682 -0.042719 -0.019866 -0.005250 -0.020930 
+-0.013250 -0.003450 -0.019150 -0.095000 -0.028750 0.025000 
+-0.044813 -0.053769 -0.034564 0.116480 -0.087360 -0.112000 
+0.125878 0.081586 -0.120551 0.090598 0.068068 -0.079214 
+0.003929 -0.003929 -0.064286 0.032314 0.008571 -0.043086 
+0.013929 0.009714 -0.022357 0.012250 -0.006250 0.009500 
+-0.028788 -0.001515 0.030303 -0.023636 -0.015455 -0.023636 
+0.126767 -0.024224 -0.045216 -0.065686 -0.049542 0.062680 
+-0.005966 0.023866 0.072857 -0.004600 0.013800 0.106000 
+0.017400 -0.032000 0.052200 0.095424 -0.029152 -0.007424 
+0.125556 -0.030222 0.060444 0.013516 -0.063280 0.048973 
+0.006425 -0.030349 0.013915 0.003117 -0.016376 0.009554 
+0.002019 -0.015650 0.006773 0.004186 -0.014258 0.016938 
+0.019480 -0.070547 0.008320 0.056293 -0.008503 0.010034 
+-0.063182 -0.056477 0.072273 0.000000 0.001429 0.121429 
+0.026000 -0.011667 0.008667 0.005250 -0.015750 -0.067500 
+0.014633 0.020950 -0.031792 0.008858 -0.004612 -0.024634 
+-0.019568 -0.005772 0.005332 -0.024072 0.041675 -0.036325 
+0.014522 0.016396 -0.012438 0.020384 -0.011314 -0.005087 
+0.007336 0.000374 0.002509 -0.003192 0.001670 0.000050 
+-0.004204 -0.002986 0.000985 0.002281 0.007484 -0.005825 
+0.006838 0.018594 -0.024818 -0.001243 0.022031 -0.016984 
+-0.007067 0.009070 -0.010461 -0.002250 0.010210 -0.006363 
+0.003466 0.003228 -0.008893 -0.008233 0.003472 0.008796 
+-0.045997 0.013145 0.035669 0.032562 -0.007881 0.004849 
+0.018899 -0.003749 -0.004587 0.005783 -0.000866 0.000661 
+0.000023 -0.001809 0.005897 -0.008956 -0.004969 0.009039 
+-0.025032 -0.010433 0.012464 -0.049455 -0.017326 0.021368 
+-0.072523 -0.011444 0.013823 -0.018379 0.046296 -0.075171 
+0.001612 -0.000586 0.001103 0.001087 0.000439 -0.000603 
+0.000110 0.000662 -0.000422 -0.000854 -0.001372 0.000266 
+-0.001594 -0.001739 0.000794 -0.000712 -0.000799 0.000734 
+0.000452 0.000339 -0.000528 0.001325 0.002206 -0.002751 
+0.003430 0.005512 -0.004258 0.007970 0.005606 -0.007253 
+0.007117 0.007201 -0.010281 0.003828 0.004257 -0.008614 
+0.000641 0.001212 -0.005823 -0.000478 -0.000501 -0.004600 
+0.001329 0.000661 -0.003069 0.000749 0.003867 -0.003121 
+-0.000242 0.002770 -0.000715 -0.000930 -0.000200 -0.001955 
+-0.010424 -0.012743 -0.010074 0.002451 -0.001751 -0.006711 
+0.035432 -0.016420 -0.011358 0.041173 -0.022160 0.010864 
+0.058462 0.011598 0.020296 -0.080159 -0.043016 0.011746 
+0.115744 0.026102 0.005348 0.034895 0.037413 -0.034056 
+-0.017051 -0.009744 0.002436 0.028333 -0.012500 0.008333 
+0.057692 0.001273 -0.003183 0.035473 0.003619 0.027027 
+0.000000 -0.095000 -0.002000 -0.035608 0.028783 0.043915 
+0.063864 -0.036136 -0.041591 -0.096667 0.000000 -0.001667 
+0.061389 -0.024722 -0.005972 0.023690 -0.040302 0.029637 
+0.056543 -0.028642 -0.056914 -0.020875 -0.074613 0.079832 
+-0.059107 -0.035446 0.027589 0.071837 -0.114490 0.069184 
+-0.006630 -0.061052 0.061283 -0.006531 -0.003584 0.023092 
+0.007185 -0.004160 0.008636 -0.012504 0.007545 0.017427 
+-0.039354 0.073946 0.099014 0.006508 0.004921 -0.035873 
+0.068182 0.001003 0.002508 0.035931 0.051659 0.033247 
+0.012400 0.051429 0.001771 -0.001818 -0.001545 -0.003818 
+-0.004571 -0.018286 -0.001143 0.003333 -0.028000 0.016667 
+0.002207 0.016187 -0.001739 -0.011312 0.026866 -0.005714 
+-0.000980 -0.014903 0.007045 0.007327 -0.012526 0.002514 
+0.017534 0.006971 -0.007127 0.020173 0.002764 -0.007400 
+0.009318 0.001764 -0.002963 0.010653 0.018157 -0.007430 
+0.016381 0.022476 -0.016762 -0.009937 0.003030 -0.013040 
+-0.002898 0.013319 -0.016010 -0.001240 0.013664 -0.028424 
+-0.015036 0.017519 -0.034237 -0.029741 0.022076 0.002759 
+-0.007149 0.003629 0.001380 0.002061 -0.001334 0.002153 
+0.002374 -0.002075 0.004786 0.000487 -0.002729 0.005501 
+-0.001488 -0.002109 0.003424 -0.003561 -0.001366 0.001710 
+-0.006522 -0.002117 0.001921 -0.008099 -0.001418 0.000951 
+-0.004569 0.004200 -0.004887 0.001190 0.010428 -0.011046 
+0.000291 0.000284 -0.005467 0.000325 0.001965 -0.002474 
+0.002059 0.004073 -0.002026 0.000083 0.005746 -0.001050 
+-0.000396 0.003165 -0.005038 -0.000365 0.000279 -0.003396 
+-0.002145 -0.002398 -0.000107 -0.002550 -0.002221 0.001621 
+-0.000294 0.000419 0.000034 0.003140 0.005614 -0.000686 
+0.006749 0.009422 -0.003594 0.005153 0.010066 -0.007292 
+0.003351 0.009260 -0.003526 0.003182 0.005790 -0.003202 
+0.001999 0.003634 -0.002900 0.000095 0.000601 -0.000525 
+-0.000068 -0.004636 0.000840 -0.003364 -0.008295 -0.006455 
+-0.007509 -0.000892 -0.013152 0.002512 0.001157 -0.012427 
+0.003439 0.000582 -0.005947 0.014431 -0.001382 -0.005041 
+0.000000 -0.006923 0.032308 -0.051493 -0.006606 0.014570 
+0.055294 0.006275 -0.011373 0.055000 0.027641 -0.015795 
+0.081667 0.042157 -0.025294 0.018904 -0.000263 -0.055921 
+0.014504 0.011561 -0.022439 -0.005360 -0.024667 -0.007147 
+0.009798 -0.058687 -0.019495 0.007571 -0.022714 -0.017143 
+-0.052000 0.058000 0.116000 -0.017888 0.063199 0.082267 
+0.022098 -0.033147 0.018182 -0.034692 -0.115769 0.002923 
+0.023980 0.064013 -0.011217 -0.114286 -0.107857 0.120714 
+-0.050882 -0.000882 -0.038824 -0.050786 0.007071 -0.003857 
+0.024036 0.019273 -0.000073 0.017143 0.002143 -0.002143 
+0.015719 -0.022542 -0.001839 0.001250 -0.068750 0.002500 
+0.006000 -0.039600 0.079200 0.016757 0.032466 0.036655 
+0.016194 0.007045 0.013198 0.032027 0.020230 -0.023357 
+0.020892 0.083172 0.029957 -0.012222 0.020778 -0.004889 
+-0.033636 -0.033636 -0.016364 -0.039043 -0.027656 -0.010574 
+-0.016350 -0.002394 -0.015211 0.002871 -0.008639 -0.007020 
+0.002365 -0.015549 0.007250 0.005145 -0.002765 -0.002141 
+0.007610 0.003141 -0.005029 0.007268 0.002215 -0.003393 
+0.004496 0.003974 -0.001815 0.000687 -0.000950 -0.006755 
+-0.003384 -0.037738 -0.012619 0.059022 -0.015378 0.005111 
+0.025716 0.008072 -0.052096 -0.001297 -0.011973 -0.018767 
+-0.007229 -0.012735 0.038683 -0.005244 -0.000607 0.011808 
+-0.002081 0.004283 -0.004789 0.000210 0.003651 -0.006668 
+0.001863 0.000948 -0.003320 0.000643 -0.000454 0.000716 
+-0.001460 -0.001266 0.002251 -0.002442 -0.001478 0.001648 
+-0.001860 -0.001833 0.001581 -0.000373 -0.001519 0.001327 
+0.002197 0.001528 -0.001343 0.004033 0.005535 -0.004651 
+-0.000932 0.001951 -0.002710 -0.002584 0.000067 -0.000772 
+-0.001699 0.003590 -0.002817 -0.000611 0.003587 -0.003167 
+0.000434 0.000145 -0.001808 -0.000511 -0.000166 0.001197 
+-0.001568 0.000292 0.002322 -0.000905 -0.000047 -0.000260 
+0.003482 0.002068 -0.000459 0.002970 0.003473 0.000213 
+0.000612 0.001486 -0.000144 0.000625 0.001635 -0.002853 
+0.002122 0.002775 -0.002284 0.001544 0.000129 -0.000330 
+-0.000197 -0.000703 0.001478 0.000004 0.000806 -0.000971 
+-0.001566 0.000620 -0.008424 0.004453 0.016373 -0.032410 
+0.256777 0.171926 -0.726453 -0.053317 -0.003259 -0.073190 
+-0.025218 0.002824 -0.004258 -0.030091 -0.033709 -0.011698 
+-0.000048 0.018825 -0.008414 0.005863 -0.021425 0.008514 
+-0.035904 -0.030392 0.021898 0.015914 0.121229 0.063189 
+-0.013865 -0.035176 -0.005392 0.012269 0.024742 0.005828 
+-0.011176 -0.007647 0.009412 -0.020581 -0.005511 0.026279 
+-0.019355 0.000330 0.010041 -0.127912 0.108791 0.160879 
+0.075556 0.040556 -0.116111 -0.002778 0.002778 -0.041111 
+-0.017000 -0.066302 0.018943 -0.065370 -0.045926 0.026481 
+0.016515 0.104242 -0.027424 -0.061250 -0.131401 -0.056315 
+-0.086364 -0.133636 0.086364 -0.062000 -0.050833 0.031000 
+0.008218 0.021264 -0.030201 0.007746 0.006203 -0.001740 
+-0.007470 -0.025117 -0.002716 -0.019088 -0.035456 -0.002177 
+0.014994 0.028268 0.010693 -0.010000 -0.005000 0.005000 
+-0.008235 -0.011176 -0.001176 -0.001852 0.005981 -0.004741 
+0.038333 -0.003333 -0.001667 0.053056 0.007361 -0.069306 
+0.011888 0.039888 0.011506 -0.032667 0.030533 -0.102267 
+-0.018689 0.001713 -0.022705 0.001910 -0.003008 -0.010279 
+0.001137 -0.002272 0.000324 -0.000760 0.001473 -0.000048 
+0.001121 0.005254 -0.002990 0.001316 0.008191 -0.002037 
+0.000702 0.003732 0.000285 -0.000343 -0.008537 0.000560 
+-0.002247 -0.014782 0.003770 0.025061 0.035142 -0.005061 
+0.034765 0.013966 -0.069642 0.000903 0.002315 -0.022866 
+0.005686 -0.002801 -0.004569 0.004925 -0.002475 -0.001457 
+0.002682 -0.001136 -0.000978 0.001259 -0.000093 -0.001370 
+0.000027 -0.000391 -0.000289 -0.000038 -0.000082 -0.000049 
+0.000890 0.000572 0.000575 0.001940 0.000468 -0.000579 
+0.001184 0.001165 -0.000659 0.000076 0.000554 -0.000658 
+-0.000373 0.000142 -0.000173 -0.000346 0.001638 -0.000787 
+0.002025 -0.000348 0.001240 0.001620 0.000846 -0.003119 
+0.002246 0.000572 -0.003395 0.002304 -0.001383 -0.001688 
+0.003296 0.000714 -0.001814 0.003886 -0.000217 -0.001966 
+-0.001410 0.000539 -0.000990 0.000030 0.000252 0.000569 
+-0.005415 0.002721 0.002682 -0.000580 -0.000076 -0.000925 
+0.002964 0.003239 -0.001676 0.003318 0.002293 -0.002385 
+0.000258 -0.000330 -0.000688 0.001184 -0.001993 -0.001449 
+-0.001884 -0.005689 -0.001455 0.004728 0.009186 -0.012303 
+0.004814 0.016390 -0.010418 -0.008817 -0.014035 0.018630 
+-0.013758 -0.019348 0.024859 -0.019479 -0.028579 0.036239 
+-0.020250 -0.028825 0.047310 0.001880 0.000198 0.016647 
+0.010091 0.036575 -0.002207 -0.018747 -0.052481 0.045524 
+-0.018949 -0.039527 0.011172 -0.016944 -0.029944 0.031222 
+-0.105282 -0.070458 0.057499 -0.124560 -0.065108 -0.030433 
+0.033670 0.048059 0.059378 0.025500 -0.041000 0.013000 
+-0.014651 -0.006508 -0.008399 -0.010609 -0.001879 0.027571 
+0.083673 0.026735 -0.093061 0.000499 -0.006435 0.006292 
+0.048544 0.020805 0.002222 -0.057750 -0.074250 -0.041250 
+-0.010095 0.004476 -0.017952 -0.037500 -0.085500 0.028500 
+-0.016757 -0.113000 0.100541 -0.098560 -0.095000 0.073920 
+0.031429 0.030286 -0.015143 0.040533 0.063813 -0.030027 
+0.049250 0.112500 -0.016417 0.105658 -0.028904 0.059605 
+-0.045300 -0.081400 0.070500 -0.085645 -0.021774 0.003871 
+0.107778 0.014667 -0.029333 0.091481 0.000741 0.036296 
+0.060933 0.044055 -0.001030 0.038760 0.024628 -0.100331 
+0.011429 0.011270 -0.010635 0.024512 -0.018000 0.019352 
+0.007241 -0.001184 0.009866 -0.003379 -0.006088 0.004935 
+-0.007486 -0.006562 0.003348 -0.007771 -0.007545 0.003657 
+-0.003634 -0.004602 0.007849 -0.005027 0.001195 -0.000343 
+-0.003127 0.006281 0.000005 0.001068 0.008029 0.000293 
+0.006075 0.006098 0.000291 0.002750 0.002409 -0.004674 
+-0.003079 0.002297 -0.001659 0.000763 0.000724 -0.004811 
+0.002820 0.000257 -0.006104 0.003859 0.001312 -0.004760 
+0.004840 0.003474 -0.003107 0.002594 0.005228 0.001021 
+0.001558 0.003815 0.000097 0.000870 0.004022 -0.000761 
+0.001378 0.001741 -0.004740 -0.001189 0.001238 -0.001917 
+-0.000615 0.000569 -0.001938 0.000000 0.001008 -0.001240 
+0.000021 -0.000073 0.001587 0.000140 0.000666 0.003645 
+-0.000277 -0.000360 -0.000416 0.001415 0.002216 -0.005800 
+0.004431 0.006915 -0.005572 0.000786 0.003368 -0.002915 
+0.000202 -0.000720 0.001154 -0.002207 -0.000202 -0.000252 
+-0.002482 -0.001457 -0.000849 -0.003566 -0.000377 -0.001917 
+-0.003459 -0.006514 0.003138 -0.005067 -0.005226 -0.001452 
+-0.002180 -0.001097 -0.001717 0.000314 0.000068 0.000381 
+-0.002620 -0.000388 0.003773 -0.003951 -0.004229 -0.003854 
+0.001622 -0.008015 -0.004065 0.005475 0.004141 -0.013159 
+0.003389 0.005305 -0.006960 -1.598901 -3.043956 1.241758 
+-1.564626 -3.680272 1.360544 -1.676375 -4.300971 1.582524 
+-1.879630 -5.032407 1.763889 -0.034634 -0.053549 0.020477 
+-0.049745 -0.089853 -0.011086 0.007581 -0.035194 0.022860 
+-0.000699 -0.013935 -0.006713 -0.008941 -0.063099 0.006561 
+-0.033536 -0.064806 0.008920 0.028444 0.090778 0.045186 
+-0.032426 -0.060000 0.048639 0.009402 0.043878 -0.021250 
+0.001171 0.054074 -0.009949 -0.021091 -0.007782 0.001588 
+-0.021954 -0.016105 -0.067211 0.110615 0.058145 0.028373 
+0.019361 -0.049408 0.062700 0.002839 -0.135373 0.053249 
+-0.031600 0.015800 0.051000 -0.028770 0.004838 0.003311 
+-0.030714 0.024026 0.005779 -0.027119 0.000357 -0.013262 
+0.005328 0.010359 -0.037737 -0.028299 0.030943 -0.031935 
+0.010000 0.041701 -0.032434 0.003861 -0.041161 0.059170 
+-0.084457 -0.074877 0.057479 -0.036061 -0.065758 0.029697 
+-0.016348 -0.016488 0.008889 0.020624 0.042504 -0.042684 
+0.001772 -0.016066 -0.009940 0.021086 -0.108571 -0.028114 
+-0.023846 -0.201385 0.032462 -0.038194 -0.081903 0.004825 
+-0.013046 -0.041919 0.001817 -0.015048 -0.010492 0.022589 
+-0.011752 -0.002269 0.012839 -0.007232 -0.014009 0.006221 
+-0.004478 -0.016874 -0.001250 0.001746 -0.008149 -0.001690 
+-0.001248 0.002180 -0.000456 -0.003130 0.004458 -0.002121 
+-0.000769 0.001711 -0.001539 -0.006791 -0.001146 0.008780 
+-0.003014 -0.002335 0.009349 0.002490 -0.002025 0.001955 
+0.006016 -0.001076 -0.006007 0.006227 0.009170 -0.010402 
+0.002222 0.006922 -0.006269 0.001074 0.002909 -0.000764 
+0.004364 0.003085 -0.000191 0.006641 0.002827 -0.004877 
+0.002157 0.000381 -0.006484 -0.002976 -0.001134 -0.003829 
+-0.003256 -0.000233 0.000930 -0.001407 0.001544 0.002225 
+-0.002021 -0.000187 0.000702 -0.002937 -0.002726 -0.001593 
+-0.005123 -0.006660 -0.002304 -0.002748 -0.002748 -0.001908 
+0.003862 0.002251 0.000317 0.003560 0.005193 0.004104 
+0.001958 0.001042 0.002564 -0.002763 -0.005116 0.002865 
+-0.003583 -0.006428 -0.000322 -0.004773 -0.002638 0.000300 
+-0.004890 -0.002100 0.002735 -0.003073 0.002305 0.000144 
+-0.004653 -0.000680 -0.003525 -0.003591 -0.004605 -0.002933 
+-0.003997 -0.012709 -0.000879 0.006118 -0.008547 0.002406 
+0.004513 -0.003347 0.001079 0.003336 -0.000378 -0.001496 
+-0.012050 -0.009696 0.019276 -2.933673 -3.443877 1.581633 
+-2.780406 -4.070946 0.793919 -2.544669 -4.487032 0.680115 
+-2.415807 -5.127148 0.446735 -2.422078 -6.448052 0.129870 
+-0.034758 -0.074729 -0.011750 -0.041272 0.052030 -0.038599 
+0.008636 0.033030 -0.008131 -0.020930 -0.096281 -0.055181 
+-0.031122 -0.091396 0.003390 -0.050186 0.041725 -0.037445 
+0.062364 -0.139268 0.012025 0.038878 -0.043796 -0.042449 
+0.003119 0.007282 0.014554 -0.006952 -0.002781 0.007097 
+-0.008316 -0.076918 0.052318 0.032269 0.120952 -0.053782 
+-0.001111 0.025111 0.003556 0.017542 -0.037811 0.019024 
+-0.054118 -0.013529 -0.046250 -0.081724 -0.055685 -0.072443 
+-0.027357 0.082071 -0.096429 -0.045200 0.122640 -0.088187 
+-0.004842 -0.051579 -0.009684 0.068095 -0.083793 0.035911 
+-0.077232 -0.045127 0.027191 -0.041654 -0.003383 0.021955 
+-0.028750 -0.008125 0.057500 -0.028516 0.026703 -0.015659 
+-0.096228 0.154361 -0.017887 -0.085646 -0.010649 -0.017418 
+-0.061226 -0.079645 -0.030871 -0.047382 -0.037148 -0.017242 
+0.016210 -0.007380 -0.057527 0.021488 -0.152976 0.030952 
+-0.013464 -0.019804 0.033510 -0.004174 0.000466 0.003442 
+-0.004741 -0.011737 0.008428 -0.006208 -0.020375 0.013617 
+-0.013407 -0.013284 0.013309 -0.006917 -0.004238 0.000930 
+0.004780 0.002296 -0.002202 0.009702 0.004791 -0.009934 
+0.000906 0.003045 -0.010857 -0.001169 0.001499 -0.002127 
+0.002273 -0.002576 0.002988 -0.000377 -0.002975 -0.001257 
+0.003795 0.004702 -0.008060 0.007093 0.012715 -0.008710 
+-0.000576 -0.000153 -0.001125 0.002835 -0.000588 -0.001267 
+0.006239 0.000493 -0.000329 0.001536 0.001865 -0.001044 
+-0.000952 -0.001695 0.001231 -0.001326 -0.000219 0.002173 
+-0.002171 0.004718 -0.001174 -0.002339 0.003564 -0.004023 
+-0.004074 -0.000115 -0.001845 -0.005633 -0.001526 0.000375 
+0.002547 0.000304 -0.006962 0.003775 0.001707 -0.002882 
+0.005241 0.001775 -0.000155 0.000247 -0.000305 -0.002220 
+0.005412 -0.002033 -0.000336 -0.004213 -0.003778 -0.000072 
+-0.006483 -0.006233 -0.001520 -0.003306 -0.004293 -0.000431 
+-0.002557 0.000297 0.003936 -0.000029 0.000649 0.002845 
+0.000067 0.001144 -0.000750 -0.005350 -0.000411 -0.000136 
+-0.009665 -0.002746 0.005894 0.004657 -0.013650 0.005333 
+0.002887 0.001987 -0.004280 -0.003787 0.001074 0.014604 
+-2.887255 -1.936275 3.078431 -3.275304 -3.125506 2.125506 
+-3.506024 -4.578313 -0.301205 -3.536680 -5.915058 -1.413127 
+-3.453815 -6.526104 -0.819277 -3.217877 -6.592179 -0.636872 
+-2.743243 -7.472973 -0.972973 -0.026184 0.016660 -0.113340 
+-0.008308 0.038077 -0.060692 -0.010667 0.024333 -0.024333 
+-0.020371 -0.081503 -0.017245 -0.036222 -0.030294 0.009422 
+0.029372 -0.001444 0.054169 0.048666 -0.070921 0.056307 
+0.001422 -0.059244 0.059956 0.040853 -0.015491 -0.026731 
+-0.014385 0.010729 0.006465 -0.022946 0.004152 -0.054420 
+-0.041210 0.022822 0.049424 -0.010500 0.021500 -0.005000 
+0.037333 0.004667 -0.146667 0.014508 -0.020635 -0.059651 
+-0.033194 0.073889 -0.063194 0.049750 -0.008125 -0.099500 
+-0.004804 0.026401 -0.025028 0.147697 0.027872 -0.025787 
+0.038321 0.036765 -0.063951 -0.004000 -0.018716 0.062385 
+0.012000 -0.007282 0.010923 0.002000 0.050667 0.000000 
+-0.038553 0.008511 -0.000170 -0.060784 -0.072395 -0.123788 
+-0.030557 -0.023136 0.014042 0.034667 0.043344 -0.036120 
+0.052879 0.036407 -0.065887 0.008455 0.000173 -0.043400 
+-0.021029 0.040718 -0.005520 -0.006272 0.000146 0.006172 
+-0.002888 -0.010518 0.011236 -0.001499 -0.000789 0.007811 
+0.000341 -0.000073 0.002414 0.002815 0.004385 -0.004887 
+0.005643 0.003319 -0.005064 0.002093 0.004667 -0.009534 
+-0.001545 0.001693 -0.004662 0.000219 -0.001529 -0.002858 
+-0.002343 -0.005063 0.002178 -0.000151 0.002556 -0.003307 
+0.004392 0.007532 -0.008866 -0.002328 0.009926 -0.002820 
+0.000341 0.001463 -0.002786 0.003016 -0.000234 0.000216 
+-0.000037 -0.003680 0.002200 -0.001789 -0.006707 0.002236 
+-0.001192 -0.004181 0.000222 0.000326 0.000935 -0.000465 
+-0.000385 0.000873 -0.001246 -0.000098 -0.000458 -0.001945 
+-0.005319 0.000000 0.000000 -0.003134 -0.001573 0.000038 
+0.001349 0.002883 -0.007137 0.007007 0.000819 -0.004603 
+0.002377 -0.000076 0.001019 0.003000 -0.002808 0.001423 
+0.002912 -0.000045 0.003136 -0.003312 -0.004021 0.003689 
+-0.004586 -0.004586 0.001278 -0.000306 0.000054 0.001370 
+0.002556 0.004714 0.002275 0.001628 0.004858 0.002690 
+0.001152 0.002145 -0.000159 0.000008 -0.001692 0.000413 
+-0.004394 -0.004903 0.007469 0.002405 -0.009857 0.005275 
+0.003973 0.002221 -0.026058 -0.193878 4.244898 -0.724490 
+-3.611607 -1.625000 3.946429 -3.321212 -2.678788 3.003030 
+-3.368116 -4.002899 0.947826 -3.462025 -5.525316 -2.003165 
+-3.530035 -6.568904 -2.703180 -3.428571 -6.544643 -1.973214 
+-3.007692 -6.323077 -1.423077 -0.036409 -0.064382 -0.009506 
+-0.090299 0.112199 -0.025439 -0.012271 0.016182 -0.040034 
+0.016869 -0.003030 -0.008586 -0.031862 -0.033621 -0.013552 
+-0.036584 -0.035822 0.016006 -0.055608 -0.022785 -0.002113 
+-0.072102 -0.029072 -0.018848 -0.068579 0.004474 -0.061421 
+-0.004154 0.003231 0.002308 -0.010333 -0.021133 -0.002933 
+0.045735 0.020000 0.182941 0.016159 -0.025525 -0.000236 
+0.072882 -0.003368 -0.081101 0.040465 0.025998 -0.043574 
+0.027588 0.025456 0.028966 0.046551 -0.110870 -0.130058 
+0.000000 -0.045833 -0.129167 0.015165 0.101996 0.024351 
+0.112666 -0.027293 0.023900 0.014094 -0.004678 -0.017193 
+-0.005716 -0.053846 -0.003266 -0.009082 -0.116278 -0.026948 
+0.024355 -0.129134 -0.085523 0.031818 -0.020909 -0.063636 
+-0.005243 0.014132 0.022222 0.006875 -0.004062 -0.015312 
+0.056193 0.044641 -0.057761 -0.022519 0.030815 -0.038571 
+-0.011942 0.013098 -0.011842 -0.002525 0.003145 -0.003017 
+-0.002319 -0.000390 0.003266 -0.002276 -0.002416 0.002632 
+0.004176 0.002096 -0.001050 -0.000142 0.000394 -0.000240 
+-0.005302 -0.002882 0.007069 -0.001393 -0.002243 0.006790 
+0.001231 -0.002812 0.001881 0.002126 -0.002441 -0.001181 
+-0.000542 -0.000890 -0.003081 -0.000757 -0.000545 -0.005266 
+0.000388 -0.000583 -0.005059 -0.001084 0.002528 -0.003621 
+0.000427 0.004570 -0.002449 0.001160 0.001312 -0.000344 
+-0.001067 -0.001475 -0.000457 -0.002214 0.002317 -0.004067 
+0.003442 0.004693 -0.010431 0.001129 0.003349 -0.007984 
+-0.000902 -0.002112 0.000251 -0.001549 -0.006584 0.003227 
+-0.000395 -0.004286 -0.000895 -0.002245 -0.000540 0.000084 
+0.000250 0.000413 0.000361 -0.000685 0.003740 -0.004798 
+0.001720 0.006416 -0.002438 -0.000273 0.005118 -0.001868 
+-0.000548 0.002091 0.000289 0.002385 0.000702 -0.001839 
+0.001834 0.002521 -0.001818 0.001948 0.007812 -0.000745 
+0.004708 0.007922 -0.000223 0.000834 0.003105 -0.001561 
+0.000642 -0.000654 -0.000732 0.000257 -0.000024 -0.001736 
+0.005515 -0.001373 0.004510 0.005122 -0.003666 0.005441 
+0.005837 0.002144 -0.015460 0.017236 0.041306 -0.013056 
+-3.664740 -1.057804 4.190752 -3.346154 -2.666667 4.028846 
+-3.178191 -3.667553 2.412234 -2.918256 -4.738420 -0.711172 
+-2.674627 -5.713433 -3.077612 -2.661765 -6.191176 -3.051471 
+-2.653409 -6.005682 -2.017045 -0.024292 -0.054891 0.003206 
+0.028402 0.078908 0.014118 -0.056129 -0.001875 0.000536 
+-0.013471 0.067356 -0.021671 -0.049745 -0.075087 -0.025248 
+-0.000574 -0.015542 0.005025 -0.021622 0.023908 -0.012993 
+-0.017328 0.022678 -0.026239 -0.007431 0.003976 -0.032006 
+-0.015918 -0.001989 0.018900 -0.057987 -0.011046 0.011444 
+-0.038551 -0.010875 -0.001426 -0.002727 0.027492 -0.058448 
+0.021364 0.041500 -0.026111 -0.012728 -0.006583 -0.000877 
+-0.013802 -0.024746 0.049614 -0.010488 -0.018879 0.017059 
+-0.049561 -0.051867 0.001441 -0.026667 -0.035833 0.000000 
+-0.010833 0.032381 0.075595 0.039929 -0.072143 -0.034786 
+-0.026667 -0.120000 -0.053333 0.012294 -0.138207 0.024165 
+0.008321 -0.114498 0.050613 0.006412 -0.017272 0.016550 
+0.023829 0.000237 -0.001946 0.057179 -0.022892 -0.041155 
+-0.001460 0.013256 0.013372 -0.003806 0.006264 0.010339 
+0.000024 0.000841 -0.003472 0.005089 0.002217 -0.010585 
+0.009315 0.004390 -0.007756 0.006477 0.003785 -0.001494 
+-0.002399 0.002375 -0.001890 -0.010022 0.000796 0.001722 
+-0.005569 0.001057 0.009423 -0.001326 -0.000838 0.007042 
+0.000727 0.000469 -0.001834 0.005056 0.002369 -0.002674 
+-0.000519 -0.001058 0.000229 -0.003075 -0.001740 0.000595 
+-0.001250 -0.000155 0.000980 0.000452 0.000127 -0.001495 
+0.001621 0.001837 -0.004467 0.003125 -0.001562 -0.002344 
+0.000142 -0.001150 0.000407 -0.000394 0.000367 -0.000807 
+0.001569 0.000143 -0.003937 0.005714 -0.000910 -0.000390 
+0.003591 0.007087 -0.001984 0.001595 0.005508 -0.004880 
+0.000185 0.002638 -0.003474 0.000544 0.001114 -0.000636 
+-0.001249 0.001057 0.001993 0.003519 0.008344 -0.002149 
+0.003535 0.001052 0.002112 -0.002891 0.003270 -0.001798 
+-0.001673 0.005878 -0.002635 0.002382 0.003470 -0.005036 
+0.000685 0.001619 -0.003058 0.000565 0.004089 -0.003116 
+0.002974 0.002064 0.000625 0.001231 0.002387 -0.004812 
+0.001526 -0.002125 -0.000945 -0.000274 0.000851 0.001090 
+0.004729 0.007759 0.005215 -0.002730 0.003174 0.005975 
+-0.000328 0.010538 -0.004048 -0.000221 0.031623 -0.004051 
+-0.019850 0.003096 0.032279 -2.326446 -2.107438 4.045455 
+-2.159468 -3.212625 2.754153 -2.019355 -4.541935 0.054839 
+-1.924590 -5.826230 -2.809836 -1.974545 -6.218182 -3.541818 
+-2.078818 -5.689655 -2.995074 -1.954545 -5.027273 -1.654545 
+-0.014385 -0.028339 0.035143 -0.025192 0.037308 -0.000962 
+-0.003971 -0.014408 0.001502 -0.019797 -0.028795 0.017997 
+-0.007281 -0.014020 -0.021588 0.006653 0.002013 -0.004997 
+-0.014082 0.002279 -0.006834 0.021182 0.008073 -0.010148 
+0.009193 -0.000512 0.001231 0.003752 0.012283 -0.016501 
+-0.009880 0.053829 -0.027937 -0.062508 0.086966 -0.025820 
+-0.031891 0.055569 -0.065040 0.005217 0.009589 -0.049682 
+-0.070466 -0.022748 0.039680 -0.031500 -0.018000 0.022500 
+-0.000131 -0.012418 -0.050719 -0.066466 0.081552 0.027931 
+-0.036632 -0.035895 0.048105 0.016970 -0.019394 0.001212 
+-0.028497 -0.016284 -0.020000 0.024800 0.042400 0.024000 
+0.005724 0.033448 -0.048414 0.005294 0.010000 -0.065882 
+0.007462 0.011697 -0.023799 -0.013951 0.008272 -0.011358 
+-0.005476 0.005545 0.014383 -0.001380 0.000375 0.006807 
+-0.000776 0.000741 0.000593 0.001957 0.005239 -0.003889 
+0.007499 0.011741 -0.001547 0.007049 0.010792 -0.001440 
+-0.000494 0.000129 -0.000078 -0.002595 0.002014 0.002565 
+-0.002098 0.001570 0.003984 -0.001440 0.001526 0.000707 
+0.001012 0.001755 -0.002632 0.002887 0.003194 -0.000553 
+-0.000677 0.003820 0.000623 -0.002191 0.005073 -0.002623 
+-0.003833 0.001504 -0.000590 -0.003141 -0.001103 -0.000936 
+0.001789 -0.004801 -0.005460 0.006970 -0.003798 -0.004432 
+0.003769 -0.002350 -0.002409 -0.000845 -0.003767 0.003711 
+-0.004909 -0.002455 0.001288 0.001347 -0.001961 -0.001731 
+0.000900 -0.000650 0.000156 -0.000955 0.001969 -0.002847 
+-0.001578 -0.001351 -0.000909 -0.003953 -0.000138 0.001229 
+-0.002231 0.002612 -0.000201 0.000041 0.002854 0.002263 
+0.001849 -0.001165 0.000242 0.004105 -0.002285 0.000529 
+0.001955 0.001568 -0.007432 0.000679 0.002366 -0.004409 
+-0.000194 0.000791 0.000420 -0.004347 0.000912 -0.001945 
+-0.000793 0.001132 -0.000256 0.000729 -0.001539 0.000163 
+0.000331 -0.003058 -0.000522 0.000157 -0.000099 -0.000233 
+0.000631 0.006036 -0.003109 -0.002798 0.006063 -0.007347 
+0.006976 0.009377 -0.011104 -0.002058 0.029970 -0.009421 
+-0.012666 0.009372 0.019952 -1.293333 -1.702222 3.728889 
+-1.471910 -2.868914 3.003745 -1.528226 -4.592742 0.826613 
+-1.415254 -6.326271 -2.576271 -1.436735 -5.995918 -4.134694 
+-1.710526 -4.675438 -3.763158 -2.127273 -3.781818 -2.515152 
+-0.023050 -0.038139 -0.002393 -0.004944 -0.021298 0.048261 
+-0.015355 0.010546 -0.007705 -0.001712 -0.011087 -0.001164 
+-0.018293 -0.043849 -0.026659 -0.029302 -0.009147 -0.039302 
+0.000131 -0.009842 -0.038502 0.007409 0.009261 -0.020313 
+0.014180 0.013257 -0.007017 -0.004409 0.011599 -0.007873 
+-0.012275 0.054913 0.003674 -0.005601 0.033990 0.038101 
+0.024910 -0.036691 0.032540 0.001049 -0.000699 -0.116364 
+-0.052083 0.017666 0.033108 -0.046066 -0.006840 -0.007829 
+-0.032566 0.019639 -0.023615 -0.050108 0.093978 0.122796 
+-0.015996 0.009654 0.004524 -0.025184 -0.057500 -0.015110 
+0.036591 0.021477 0.027841 0.123456 0.147930 0.061456 
+0.003041 0.067219 -0.052922 0.000056 -0.000167 -0.052778 
+0.012178 -0.015867 -0.000444 0.015667 -0.027267 -0.025533 
+0.005573 -0.010175 -0.002683 0.002671 -0.008244 0.004695 
+0.000154 -0.004321 0.002695 0.000489 -0.001380 -0.000341 
+0.002056 0.000435 0.000035 0.000272 0.001138 -0.000492 
+-0.000669 0.001052 -0.000182 -0.000224 0.001682 0.001140 
+-0.000156 0.000363 0.000981 0.000311 -0.001284 0.000478 
+0.000290 -0.000445 -0.000221 -0.000258 0.001312 0.000823 
+0.001613 0.004963 0.000993 0.000493 0.003980 -0.002313 
+0.000590 0.000564 -0.001667 0.001963 -0.001111 -0.003099 
+-0.000819 0.001833 -0.004387 0.003487 0.003167 -0.003917 
+0.002646 0.003851 -0.001844 0.001299 0.001158 0.000066 
+-0.002506 -0.000727 -0.003960 -0.001374 -0.001374 -0.003588 
+-0.000859 -0.001010 0.000707 0.000395 -0.000319 0.003976 
+-0.000821 -0.000266 0.001597 -0.002567 0.000709 -0.002889 
+-0.002030 0.002573 -0.001513 0.003434 0.003847 0.000520 
+0.004497 0.004559 -0.006051 0.004712 -0.000763 -0.005383 
+0.005953 0.000916 -0.000203 -0.000283 0.009262 -0.005622 
+0.001702 0.001230 -0.001580 -0.003657 -0.001778 0.002119 
+-0.001144 -0.004404 0.003832 -0.000745 -0.001242 0.005111 
+-0.000338 -0.002366 0.001070 0.000627 0.000636 -0.002147 
+0.001701 0.006306 -0.008173 0.006136 0.012250 -0.010209 
+0.004212 0.000017 -0.016973 0.001751 0.009569 -0.011472 
+-0.008706 0.007203 0.015696 -0.843137 -1.911765 3.671569 
+-1.138340 -2.869565 3.063241 -1.245690 -4.232759 1.366379 
+-1.043902 -5.600000 -1.917073 -1.186046 -5.255814 -4.348837 
+-1.709251 -4.220264 -4.132159 -2.065990 -3.461929 -2.989848 
+-0.022999 -0.031420 -0.013647 -0.013375 -0.034137 0.017547 
+-0.000283 0.008571 -0.003959 -0.087295 -0.035435 0.018112 
+-0.009253 -0.059949 -0.001349 0.014113 -0.107660 -0.023631 
+-0.109498 0.062530 -0.100484 -0.026750 -0.020261 -0.015752 
+-0.025116 -0.008029 0.014902 0.007233 -0.000039 -0.004545 
+-0.002988 0.015872 0.017947 0.074720 0.007220 0.017558 
+-0.009623 -0.066906 0.017566 -0.005281 0.000528 -0.003333 
+-0.027397 0.025496 -0.037769 -0.035787 0.036923 -0.004473 
+-0.016033 0.104377 -0.092312 0.105952 -0.018690 0.064405 
+-0.005874 0.005455 0.029371 -0.010313 0.005611 -0.017492 
+0.064603 0.021746 -0.021587 0.031800 -0.063600 0.037000 
+-0.016975 -0.027321 0.068805 0.014737 -0.014737 0.034211 
+-0.036101 -0.003992 0.073200 -0.011212 0.029697 -0.033939 
+0.002660 0.001013 -0.008591 -0.000803 -0.005505 0.005343 
+-0.004543 -0.004205 0.003760 -0.002378 0.001009 -0.001212 
+0.001852 -0.001415 -0.002547 0.003378 0.004624 -0.006649 
+0.002702 0.004777 -0.004581 0.001724 0.006360 -0.001751 
+-0.000637 0.002943 -0.000108 -0.000231 0.002602 -0.001157 
+0.003583 0.001581 0.000907 0.003307 0.004247 -0.000079 
+0.003023 0.001939 -0.001846 0.003426 0.000805 -0.000546 
+0.002738 0.002063 -0.001389 0.002429 -0.000789 -0.004194 
+0.002685 0.001061 -0.005161 0.000366 0.002844 -0.003154 
+-0.002769 0.000126 -0.001906 -0.000118 -0.001339 -0.001929 
+0.002590 -0.000579 -0.001128 0.000538 -0.001041 -0.000306 
+-0.001130 0.000377 -0.000165 -0.002062 0.001254 0.001277 
+0.000207 -0.000012 -0.004262 -0.000244 -0.000591 -0.007678 
+0.003481 0.001155 -0.009229 0.005494 0.005782 -0.007254 
+0.005400 0.006349 -0.005168 0.002836 0.005336 -0.005336 
+0.004316 0.001562 -0.006427 0.004325 0.003604 -0.007929 
+0.006275 0.001407 -0.004984 0.002392 -0.000833 -0.001720 
+-0.001511 0.000031 0.000018 -0.000357 0.001320 0.001749 
+-0.000495 0.000705 0.002420 -0.001003 0.001768 0.002111 
+0.003142 0.004760 -0.000318 0.001979 -0.002819 -0.003125 
+0.001721 -0.000197 -0.013249 0.006220 0.008592 -0.012561 
+-0.001818 0.011598 0.009422 -0.793939 -1.727273 3.460606 
+-1.108696 -2.678261 2.869565 -1.195021 -3.240664 1.290456 
+-0.949074 -3.814815 -1.296296 -1.075000 -4.210000 -4.055000 
+-1.729469 -4.125604 -4.661836 -2.044118 -3.602941 -3.784314 
+-1.837662 -2.935065 -2.688312 -0.013729 -0.015127 -0.006538 
+0.023211 0.014653 0.018337 -0.040761 0.028551 -0.037385 
+0.021949 -0.016502 -0.005477 -0.006505 -0.001240 -0.010839 
+0.017647 0.020588 -0.079000 0.082809 -0.029753 -0.026821 
+-0.064505 0.031980 -0.027178 0.059102 -0.033165 0.061039 
+-0.019748 0.000336 0.020252 -0.013244 0.024624 -0.012601 
+-0.026471 0.011242 0.003588 0.002824 0.009247 -0.010388 
+0.019622 0.009725 -0.038036 0.005882 0.048125 0.001471 
+0.058235 0.065147 -0.039485 0.159892 0.054859 -0.035286 
+-0.020909 -0.034909 0.017455 -0.011765 0.047059 0.053000 
+-0.008571 0.058286 -0.095143 -0.010413 -0.030603 0.036127 
+-0.020859 0.003740 -0.003213 -0.026243 -0.004838 -0.006390 
+-0.031183 0.032902 -0.008210 -0.009294 0.011360 -0.013332 
+-0.000803 0.001764 -0.006225 -0.000029 0.000412 0.000054 
+-0.000573 0.000431 0.000759 -0.002092 0.003384 -0.000301 
+-0.001565 0.005668 -0.001561 -0.001932 0.001289 -0.000769 
+-0.001586 -0.002565 0.000631 -0.000946 -0.001627 -0.002510 
+-0.002613 0.000250 -0.005724 -0.002252 0.004010 -0.003257 
+0.003703 0.000011 -0.000455 0.007931 0.005017 -0.003338 
+0.006464 0.003555 -0.002473 -0.000582 0.000435 0.000078 
+-0.005600 -0.001163 0.000696 -0.003446 -0.000180 0.001836 
+-0.001359 -0.000508 -0.000025 -0.001191 0.000459 -0.003537 
+-0.002735 0.002282 -0.003405 -0.001545 0.000325 0.000325 
+0.002537 0.000789 -0.000754 0.000257 -0.003186 -0.001391 
+-0.003479 -0.003461 -0.003905 -0.004614 -0.000811 -0.001608 
+-0.002138 0.001582 0.001302 -0.001250 -0.000817 0.000633 
+0.001025 -0.003005 -0.000640 0.001326 -0.001431 -0.001673 
+0.000626 0.000362 0.001442 -0.004127 -0.000258 0.002450 
+-0.000196 -0.000706 -0.001294 -0.000376 -0.000436 -0.007549 
+0.004407 0.007481 -0.011444 -0.000730 -0.001159 -0.001145 
+-0.003363 0.000998 -0.002485 -0.004040 0.002501 0.003467 
+-0.002902 0.003443 0.006850 -0.000429 0.004039 0.006810 
+0.001305 0.003101 0.002913 0.005843 -0.002283 0.000302 
+0.008091 0.001511 -0.000470 0.007248 0.001712 -0.006709 
+0.000250 0.002829 0.007704 -0.019813 -0.008475 0.028730 
+-1.417085 -2.150754 3.050251 -1.553648 -2.446352 1.888412 
+-1.504545 -2.727273 -0.095455 -1.335025 -3.065990 -2.934010 
+-1.603093 -3.427835 -4.809278 -1.745000 -3.315000 -4.490000 
+-1.355556 -2.438889 -3.466667 -0.015096 -0.002537 -0.011119 
+0.004092 0.001626 0.001596 0.024182 -0.000018 0.014051 
+0.023297 -0.021996 0.022130 -0.029422 -0.023969 0.006374 
+0.025703 0.016195 -0.004485 0.034223 0.013933 -0.001117 
+0.050000 0.055701 -0.030382 0.066286 -0.060334 0.028236 
+-0.053284 0.008655 0.018552 -0.010216 -0.002607 0.006158 
+-0.014873 -0.014150 0.013112 -0.000589 -0.006017 -0.004590 
+-0.005073 -0.014712 -0.022576 -0.011787 0.020627 -0.040769 
+0.011571 0.028927 0.048333 0.030010 0.035755 -0.010210 
+-0.007462 -0.014000 0.059692 0.070500 0.018000 0.023500 
+0.098182 -0.026364 -0.022727 0.010769 0.014775 0.001478 
+-0.000695 0.022032 -0.003048 0.000685 0.010617 -0.025202 
+0.001334 -0.000137 -0.003526 0.003574 -0.004167 0.001127 
+0.003901 -0.008705 0.001082 -0.002716 -0.003040 -0.002187 
+0.003008 -0.005543 -0.004441 -0.003028 -0.002050 -0.004700 
+0.000260 0.000206 -0.000286 -0.005455 -0.002296 -0.001968 
+0.001360 -0.001772 -0.005462 0.000847 0.000399 -0.009530 
+-0.001934 0.001621 -0.007335 -0.003828 0.000338 -0.003391 
+-0.000099 0.000989 -0.000494 0.002760 0.002978 -0.001749 
+0.003680 0.002092 -0.001191 0.000756 0.001062 -0.001636 
+-0.001170 0.001381 0.002490 -0.006429 -0.001808 0.000402 
+-0.001410 0.000776 -0.001850 -0.002909 0.002537 -0.001015 
+-0.005147 0.000341 -0.001039 -0.000325 -0.001829 -0.001179 
+-0.000913 -0.002540 -0.004167 -0.000675 -0.001220 -0.006487 
+-0.003500 0.000583 -0.004083 -0.000336 0.001000 -0.000833 
+0.001549 -0.000886 0.000125 0.001716 -0.001520 -0.000219 
+0.002338 -0.000191 -0.002761 0.000265 -0.000455 0.000481 
+-0.001633 -0.001626 0.003243 -0.000988 -0.001329 0.004038 
+-0.000806 0.001413 0.001235 -0.002554 0.000178 -0.001285 
+0.002536 0.000362 -0.004420 -0.002119 0.003874 -0.006136 
+-0.000782 0.000440 -0.000090 0.006046 0.003068 0.002710 
+0.002001 0.002209 0.008126 0.000617 0.000924 0.008157 
+-0.001853 -0.001739 0.006896 0.002620 -0.007362 0.000104 
+0.016233 -0.000033 -0.004693 0.016517 0.006894 -0.008087 
+0.006275 0.006022 -0.003533 -0.010740 0.000711 0.020719 
+-0.020855 -0.007655 0.024136 -1.557692 -1.519231 2.091346 
+-0.014946 -0.013327 -0.001188 -0.013429 -0.017174 -0.004913 
+-1.603604 -2.153153 -3.765766 -1.931624 -2.803419 -4.384615 
+-1.711111 -2.564445 -3.822222 -0.994595 -1.491892 -2.816216 
+-0.006235 -0.001164 -0.004248 0.008990 -0.010204 0.013013 
+0.021454 -0.014746 0.017994 -0.030942 -0.004606 -0.002501 
+-0.013589 0.006466 -0.006692 0.000955 -0.011329 0.007764 
+0.022991 0.028092 -0.012005 0.015310 -0.002189 0.003121 
+-0.042278 0.044640 -0.014976 -0.013199 0.003231 0.001056 
+-0.008205 -0.018911 0.007028 0.002341 -0.029461 -0.015430 
+0.032135 -0.009181 -0.011477 0.072321 0.019643 0.037202 
+-0.058730 -0.008763 0.037699 -0.008962 0.010796 0.005433 
+-0.034259 -0.098872 0.070471 -0.024706 -0.095000 -0.006176 
+0.069620 -0.038557 0.029991 -0.042263 -0.025155 0.087040 
+-0.017011 0.012952 0.013110 0.003040 -0.004175 -0.007905 
+0.001114 -0.000331 0.002080 -0.004953 -0.001795 -0.002010 
+-0.005343 -0.001802 -0.001155 0.000811 -0.000190 -0.004847 
+0.000837 0.003026 -0.005154 -0.004260 -0.000711 -0.002283 
+-0.005307 0.001719 -0.013006 -0.000943 0.012210 -0.009392 
+0.010486 0.011032 -0.008059 0.005834 0.006813 -0.010362 
+0.001066 0.003031 -0.004608 0.000649 0.001043 -0.002169 
+0.001064 0.000802 -0.002798 0.003644 -0.001191 -0.000349 
+0.003353 0.002309 0.001399 -0.001330 0.002709 -0.000768 
+0.001447 0.001952 -0.003207 -0.000910 -0.000607 -0.002366 
+0.000132 -0.000370 0.000085 0.001145 -0.000003 0.003150 
+-0.000917 0.000212 0.002539 -0.002385 -0.001601 -0.003430 
+-0.006668 -0.001238 -0.005121 -0.001774 0.001774 -0.003871 
+-0.002873 0.000476 0.000198 -0.001951 -0.000748 -0.000752 
+-0.002956 -0.000037 -0.002675 -0.004647 -0.000016 -0.001405 
+-0.002589 0.002448 -0.000964 0.000789 0.007719 -0.006930 
+-0.005095 0.008088 -0.002944 -0.001697 0.004042 -0.002495 
+0.000260 -0.000247 -0.001856 0.001769 -0.001735 -0.001803 
+-0.000076 0.000200 -0.000711 -0.000339 0.002388 -0.001854 
+-0.001690 0.005032 -0.003498 -0.000075 0.007345 -0.002799 
+-0.001088 0.002654 0.000923 -0.001095 -0.000333 0.004539 
+-0.001752 -0.002146 0.005658 0.001000 0.002081 -0.000678 
+0.017313 0.008883 -0.015137 0.021361 0.019668 -0.003274 
+0.010900 0.018554 -0.001483 0.002130 0.004865 0.007177 
+-0.020091 -0.006110 0.024340 -0.016670 -0.006547 0.021654 
+-0.000032 -0.004269 0.004542 -0.014855 -0.001755 -0.005476 
+-1.985019 -1.318352 -2.333333 -2.447917 -2.513889 -3.753472 
+-2.285211 -2.852113 -4.010563 -1.478448 -1.875000 -3.387931 
+-0.011034 0.000177 -0.011629 0.005552 0.000999 0.004938 
+0.011586 -0.000435 0.002130 0.000026 0.004690 -0.002101 
+0.000810 0.004071 -0.002153 0.004116 0.007299 -0.003709 
+0.007756 0.011660 -0.006140 0.009472 0.007320 -0.003971 
+0.000940 0.003427 -0.002113 -0.001239 -0.001240 0.000682 
+-0.002522 -0.003926 0.001980 -0.016643 -0.003452 -0.004630 
+0.040290 0.018063 -0.016060 0.066364 0.033636 -0.017273 
+-0.049189 -0.043333 0.008198 -0.053035 -0.051284 0.056288 
+-0.007455 -0.041000 0.018636 -0.116052 -0.101104 0.021217 
+-0.089529 -0.049348 0.059584 -0.007893 0.023022 0.004922 
+0.006194 0.010282 -0.005428 -0.006216 -0.002688 -0.014588 
+-0.003641 0.001327 -0.005633 -0.008891 0.005628 -0.000723 
+-0.006306 0.008980 0.002102 0.001505 0.010886 0.001304 
+0.005461 0.008018 0.004233 0.000273 0.005242 -0.000400 
+0.000638 0.006243 -0.008323 -0.003101 0.000958 -0.005222 
+-0.004957 -0.002478 0.001652 -0.002693 -0.006664 0.001292 
+-0.001325 -0.004251 0.000155 0.000717 0.000704 -0.001982 
+0.001057 0.003842 -0.002733 0.004469 0.002655 -0.000800 
+0.003646 0.001357 0.000073 0.001037 0.000529 -0.003028 
+0.001141 -0.000442 -0.002063 -0.001021 0.000561 -0.000103 
+0.000123 -0.000230 0.000738 -0.000823 -0.000669 0.002726 
+-0.001499 -0.000525 0.001637 -0.004622 -0.001092 -0.001092 
+-0.006612 -0.000496 -0.006860 -0.004312 -0.002663 -0.007182 
+-0.001991 -0.002634 -0.004917 -0.000670 -0.003226 -0.002343 
+-0.001037 0.000132 -0.002719 -0.005609 -0.002374 -0.002444 
+0.000974 0.005604 -0.008041 -0.001792 0.006667 -0.011542 
+-0.005259 0.006505 -0.003515 -0.001774 0.005348 -0.000878 
+0.001406 0.004687 -0.001087 0.005495 0.000761 0.000148 
+0.000272 0.000369 -0.003753 0.001537 0.001792 -0.004211 
+-0.000120 -0.000045 0.000054 -0.003610 0.002562 -0.004600 
+-0.000586 0.001964 -0.001139 -0.000056 0.001228 0.001562 
+-0.000798 -0.000390 0.003413 0.001857 0.003498 0.000436 
+0.009281 0.007301 -0.004584 0.011764 0.005797 -0.001404 
+0.000920 0.004578 0.000053 -0.007208 0.000809 -0.003545 
+-0.005499 -0.005600 0.020414 -0.014200 -0.004777 0.026144 
+-0.005911 -0.002807 0.017170 -0.001333 -0.002453 -0.005108 
+-2.133117 -1.126623 -1.545455 -2.308157 -2.120846 -2.839879 
+-2.174194 -2.661290 -3.422581 -1.621399 -2.016461 -3.078189 
+-0.012369 -0.000590 -0.011143 0.002407 0.009321 0.001670 
+0.005957 0.007004 -0.001062 0.005647 0.004686 -0.002375 
+0.005918 0.002277 -0.000889 0.003421 -0.000678 0.000472 
+0.002219 -0.004925 0.002560 0.002757 -0.006764 0.003178 
+0.004236 -0.004464 0.000935 0.001535 -0.002525 0.000402 
+-0.002790 -0.003993 0.000896 -0.003682 -0.004040 0.001163 
+-0.006009 -0.004854 0.001571 -0.020727 -0.019063 0.009688 
+0.051680 0.058184 -0.055789 0.025600 0.010094 -0.006424 
+0.022240 0.014349 -0.000330 0.008344 -0.010129 0.006213 
+-0.005348 -0.003243 0.000515 -0.028105 0.055123 -0.004563 
+-0.022380 0.014660 -0.081269 -0.019234 -0.004478 -0.063607 
+-0.005714 -0.009465 -0.041945 -0.001454 0.001163 -0.020192 
+0.000685 0.000011 -0.010009 0.003331 -0.003629 -0.003916 
+0.001552 -0.003941 -0.001062 0.000617 0.006274 -0.010063 
+0.003101 0.003944 -0.010326 -0.000972 0.005092 -0.002182 
+-0.005938 -0.003047 0.000501 -0.005805 -0.004200 -0.003602 
+-0.000181 -0.000152 -0.001401 -0.000173 0.003920 -0.001407 
+-0.000190 0.004176 0.000565 0.000840 0.002304 0.001572 
+0.001819 0.001483 -0.000854 0.004394 0.001584 -0.000882 
+0.001526 0.003605 -0.000696 -0.000369 0.001904 -0.000183 
+-0.003000 0.001908 0.000118 -0.005204 -0.001666 -0.002340 
+-0.003786 -0.002149 -0.002415 -0.003224 0.000362 -0.002157 
+-0.002431 0.001364 -0.002936 -0.002045 -0.000240 -0.003888 
+0.001692 -0.001874 -0.003293 -0.001368 -0.003743 -0.004345 
+-0.000746 -0.002419 -0.003619 0.000254 0.000022 -0.000048 
+0.002600 0.004922 -0.006919 0.002045 0.009345 -0.007154 
+0.000073 0.004901 -0.010310 -0.000905 0.004435 -0.006420 
+0.001908 0.004745 -0.005087 0.000639 -0.000520 -0.000301 
+0.000180 0.000247 -0.004376 0.002524 -0.000865 -0.003462 
+-0.001076 -0.003071 -0.001245 -0.000736 0.000310 -0.001898 
+0.000051 0.000020 0.000881 -0.000562 0.000543 0.001921 
+0.000994 -0.000120 0.002787 0.001901 0.006985 0.000159 
+0.007558 0.013441 -0.004515 0.010541 0.010463 -0.003542 
+-0.000940 0.001994 0.000129 -0.006876 -0.001671 -0.006094 
+0.000222 0.001039 -0.000206 -0.001391 0.003402 0.008989 
+-0.004083 0.001492 0.011311 -0.004174 -0.005809 0.005965 
+-1.980645 -0.941935 -0.993548 -2.012012 -1.621622 -1.897898 
+-1.800687 -2.099656 -2.457045 -1.367647 -1.813725 -2.534314 
+-0.010863 0.003143 -0.004847 0.005757 0.010608 0.003865 
+0.005111 0.000174 0.000612 0.002645 -0.002935 -0.000773 
+0.006409 -0.000841 -0.001126 0.005910 -0.001159 -0.000571 
+0.001890 -0.002604 0.000310 -0.001715 -0.004813 0.000259 
+-0.003823 -0.005835 -0.000769 -0.005077 -0.004882 -0.000904 
+-0.002374 -0.005450 -0.000786 -0.001222 -0.005596 0.000075 
+-0.007381 -0.008033 0.000469 -0.009457 -0.012812 0.000408 
+0.008221 0.009253 -0.001192 0.014882 0.007427 0.001677 
+0.004377 -0.032382 0.019801 -0.011012 0.002768 -0.007604 
+-0.015757 0.120254 -0.107873 -0.010801 0.008762 -0.036314 
+0.003352 -0.002228 0.024635 0.000167 -0.005632 0.026659 
+0.000467 -0.005723 0.019544 0.004241 0.000970 -0.000164 
+0.005647 -0.004270 -0.010869 -0.001364 -0.007189 -0.009186 
+-0.012277 -0.003870 -0.000929 -0.007848 -0.005619 0.001037 
+-0.002317 0.010044 -0.002208 0.006082 0.013327 -0.001243 
+0.001321 0.003795 0.001451 -0.000828 -0.001597 -0.002943 
+0.000322 -0.000086 -0.001591 0.000522 0.000429 -0.001786 
+0.000106 0.001990 -0.002660 0.003565 0.005462 -0.000509 
+0.006021 0.006313 -0.002671 0.005339 0.002150 0.003300 
+0.002346 -0.003077 -0.003734 0.002614 -0.002962 -0.004760 
+-0.000153 -0.002021 -0.003736 -0.004099 -0.000306 -0.002884 
+-0.005966 0.002146 -0.001959 -0.002994 0.002462 -0.003288 
+0.001154 0.000413 -0.003801 0.001032 -0.001759 -0.002995 
+0.000924 -0.001620 -0.000402 -0.001453 -0.003423 -0.000553 
+0.000620 -0.003109 -0.002816 0.003581 -0.002036 -0.003152 
+-0.000052 0.006890 -0.002889 0.000098 0.006899 -0.008513 
+-0.003431 0.000208 -0.009355 -0.003292 0.000640 -0.005716 
+0.000169 0.001932 -0.001763 0.000887 -0.001098 -0.000562 
+0.000020 -0.001080 -0.000894 -0.002254 -0.003158 -0.002209 
+-0.001454 -0.003171 0.000162 0.003472 -0.001248 -0.003750 
+0.004983 0.000956 -0.005406 0.005553 0.000332 -0.002092 
+0.002619 -0.000768 0.002048 0.001728 0.000668 0.003429 
+0.001265 0.001859 0.004124 -0.003692 0.000075 0.004874 
+-0.003681 -0.004515 -0.000781 0.001849 0.001836 -0.000669 
+0.003673 0.003838 -0.023505 0.008267 0.011250 -0.003337 
+-0.002881 0.010915 0.007226 -0.008950 0.002484 0.009327 
+-0.012364 -0.004503 0.000870 -0.013761 -0.009511 -0.012562 
+-0.012736 -0.012173 -0.020984 -0.009607 -0.010624 -0.017995 
+-0.004009 0.010082 0.004104 0.001285 0.009107 0.002680 
+-0.008876 -0.002737 -0.000626 -0.011990 -0.005831 -0.000466 
+0.000626 -0.004181 -0.000723 0.005478 -0.002593 -0.001188 
+-0.000725 -0.001229 -0.000211 -0.006875 0.001616 -0.001290 
+-0.004372 0.004409 -0.000138 0.001027 0.003987 0.000571 
+0.001325 0.001453 0.000055 -0.001493 -0.001751 -0.000496 
+0.000349 -0.003561 -0.001242 0.004836 -0.002580 -0.000357 
+0.004343 -0.002901 0.000446 -0.001315 -0.005389 0.000261 
+-0.008615 -0.009568 0.005446 -0.000828 0.009241 -0.008144 
+-0.002565 0.014189 -0.022286 -0.003151 -0.005149 0.031943 
+-0.528777 -1.010791 4.532374 -0.576023 -1.005848 4.856725 
+-0.615658 -1.067616 4.864769 -0.001488 -0.012261 0.034466 
+-0.001689 -0.002556 -0.000385 -0.001033 0.002389 -0.007814 
+-0.005170 -0.001700 0.007883 -0.001864 -0.001181 0.012857 
+0.003079 0.004665 0.006711 0.002652 0.001838 0.003989 
+-0.000319 0.001038 0.002614 0.000165 -0.001973 0.001248 
+0.001910 -0.001107 -0.001321 0.001354 0.000579 -0.001364 
+-0.000932 -0.000706 -0.001707 0.000587 -0.000052 -0.002517 
+0.003405 0.007964 -0.002310 -0.001153 0.004672 -0.004520 
+0.001391 0.005301 -0.002923 0.001571 -0.001162 -0.004066 
+0.000531 -0.002714 -0.007611 0.002720 0.001666 -0.001228 
+-0.000149 0.003133 -0.003413 -0.000246 0.001761 -0.002430 
+-0.000370 -0.000761 -0.003753 -0.000795 -0.001799 -0.005648 
+0.006047 -0.000116 -0.004070 0.003918 -0.002285 -0.000583 
+0.006162 -0.002855 -0.002476 0.002926 -0.002219 -0.004473 
+0.001243 0.007132 0.003411 0.001069 0.008135 -0.001590 
+-0.000299 0.002526 -0.004420 -0.001791 -0.003172 -0.003172 
+-0.000834 -0.006045 0.000500 -0.000489 -0.004656 0.000977 
+0.000366 -0.001059 0.004314 0.002885 -0.000734 0.003609 
+-0.002207 -0.001815 0.000474 0.000005 0.001588 -0.003198 
+0.000708 0.002778 -0.006771 0.005401 0.004307 -0.002701 
+0.001317 0.001402 0.002830 0.001743 -0.004099 0.003930 
+-0.004252 -0.010691 0.007640 -0.008579 -0.006267 0.009905 
+-0.003301 -0.005650 0.001637 0.003786 -0.011943 -0.008842 
+-0.016922 -0.006088 -0.025203 -0.013031 0.006938 0.010962 
+-0.011306 -0.001478 0.011762 -0.004276 -0.003164 0.002696 
+0.004329 0.001735 0.000871 -0.001014 -0.003575 -0.002233 
+-0.008336 -0.008893 -0.011473 -0.006372 0.001102 -0.003012 
+0.018664 0.015941 0.011467 0.008501 0.009883 0.004590 
+0.000089 0.005801 0.003226 -0.005754 -0.003062 -0.000231 
+0.002043 -0.004648 -0.001842 0.001051 -0.004004 -0.001446 
+-0.004209 -0.004471 -0.003200 -0.004564 -0.006079 -0.004271 
+0.002568 -0.003771 -0.001042 0.005134 0.001703 -0.000547 
+-0.002780 0.001473 0.000350 -0.003240 0.000133 -0.001056 
+0.006274 -0.002463 0.001168 0.017080 -0.002532 0.000774 
+0.010235 -0.004113 -0.001662 0.004953 -0.009704 -0.003823 
+0.019010 -0.000466 -0.024408 0.004885 0.009728 -0.014482 
+-0.009467 -0.005689 0.024709 -1.158940 -1.109272 4.877483 
+-1.102941 -1.284314 5.607843 -0.928074 -1.252900 5.658933 
+-0.681035 -1.060345 5.158046 -0.206422 -0.481651 3.642202 
+0.002916 0.002771 0.007131 -0.001324 0.000005 -0.003843 
+-0.000051 -0.006825 0.002458 0.001791 0.000525 0.000242 
+0.002198 0.003056 0.004305 0.001125 0.000601 0.000072 
+-0.001082 -0.001826 0.001454 -0.001386 -0.001187 0.001874 
+-0.001085 0.001756 0.000336 -0.004392 0.001233 -0.002951 
+-0.002195 0.000750 -0.006918 0.000206 0.003301 -0.001971 
+-0.003183 0.003147 0.000728 -0.004873 0.001661 0.001883 
+-0.001536 0.003875 0.002094 -0.002514 -0.000473 -0.002772 
+0.002214 -0.001199 -0.002999 0.001235 0.000183 -0.001995 
+-0.003300 -0.002354 -0.001881 0.000452 -0.000555 -0.001960 
+0.002040 -0.002384 -0.002535 0.007715 -0.000680 0.000328 
+0.009794 0.007960 -0.011016 0.006236 0.009632 -0.007362 
+0.004177 0.003571 -0.006030 0.000664 -0.000998 0.000112 
+0.007588 0.003371 -0.000066 0.009710 0.005568 -0.003260 
+0.006968 0.001883 -0.003121 0.003456 -0.001507 -0.005404 
+-0.001377 -0.004565 0.000000 0.000309 -0.003824 -0.000926 
+0.000365 -0.002862 0.002171 -0.001469 -0.001655 0.003668 
+-0.002043 0.002313 0.000939 -0.001403 0.003524 0.001252 
+-0.000138 0.004397 0.002015 0.005249 0.001093 0.002660 
+0.003236 -0.001162 0.001835 0.001540 -0.000102 0.000964 
+0.000735 0.003154 0.001681 -0.001174 -0.000061 -0.003714 
+0.001979 0.009062 -0.011042 -0.007519 0.002543 -0.003914 
+-0.005165 0.004089 0.021139 0.700535 -0.010695 4.454545 
+1.873077 0.019231 5.196154 2.135714 -0.100000 4.853571 
+1.706897 -0.409483 3.780172 0.012661 -0.005186 0.008928 
+-0.002335 -0.007376 -0.002506 -0.009710 0.004672 -0.006634 
+0.015463 0.019818 0.016039 0.014165 0.013899 0.014659 
+0.005389 0.007893 0.008675 -0.008715 -0.007622 -0.002506 
+0.006347 0.003637 0.000150 0.002026 0.006929 0.004948 
+-0.003702 0.004944 0.002211 -0.001018 -0.001224 -0.000167 
+0.002794 -0.003286 -0.000044 0.001956 -0.005856 -0.001152 
+-0.000934 -0.004623 -0.002156 -0.003142 -0.006217 -0.003588 
+-0.001758 -0.013625 -0.005110 0.000948 -0.006092 -0.000299 
+0.001301 0.003675 0.000052 0.016521 0.015370 -0.001006 
+0.029224 0.033590 -0.056545 0.000634 0.014566 -0.002020 
+-0.562500 -0.218750 4.388393 -1.080229 -0.968481 5.856733 
+-1.252475 -1.326733 5.938119 -1.198939 -1.355438 5.249337 
+-0.875817 -0.944444 4.049020 -0.514768 -0.337553 2.700422 
+-0.001318 -0.002202 0.017483 -0.001225 -0.003612 0.009059 
+0.001258 -0.001562 0.002155 -0.004143 0.000867 0.001800 
+-0.009048 -0.000881 0.000049 -0.006239 -0.002068 -0.001916 
+0.003210 0.003041 -0.006022 0.004678 0.000831 -0.006585 
+0.002250 -0.000394 -0.002732 0.001460 -0.001306 -0.002956 
+-0.000813 -0.001870 -0.007480 -0.004796 0.004133 -0.006596 
+-0.004532 0.002840 0.001355 0.001036 0.003109 0.005072 
+0.001991 0.003232 0.001298 0.002670 0.001530 -0.003823 
+-0.002065 0.001553 -0.000269 0.001322 0.000846 0.001138 
+-0.000540 0.000469 -0.000861 0.000003 -0.000002 -0.005397 
+0.001213 -0.001642 -0.004355 0.006210 0.000995 -0.002978 
+0.006614 -0.001871 -0.004055 0.002189 -0.004608 -0.006998 
+0.001088 -0.005295 -0.007855 -0.001911 -0.000140 -0.007575 
+0.007258 0.004729 -0.011658 0.002011 0.000716 -0.007905 
+-0.004196 -0.003147 -0.006370 -0.002285 0.000835 -0.005226 
+-0.000268 -0.000163 -0.002976 -0.001016 -0.000634 -0.001031 
+-0.008491 -0.008855 -0.000739 -0.010360 -0.001177 0.006593 
+-0.004039 -0.002367 -0.003373 0.002953 0.007874 -0.001640 
+0.008359 0.003525 -0.009619 0.006296 -0.001124 -0.006069 
+0.002677 0.000797 0.000585 -0.000331 0.001240 -0.000395 
+-0.003844 0.001225 -0.005889 -0.007913 -0.003552 -0.019498 
+-0.006343 0.010019 -0.021981 0.000439 0.002544 0.010827 
+1.159836 0.163934 3.881148 1.844985 -0.133739 5.525836 
+2.464088 -0.301105 6.279006 2.776397 -0.465839 6.071429 
+2.427966 -0.639831 4.622881 0.011312 -0.005269 0.019629 
+0.001771 -0.003893 0.003746 -0.000205 -0.008191 0.000614 
+0.000968 0.000705 0.002041 0.001326 -0.003991 -0.001104 
+0.013560 -0.005151 -0.003008 -0.023428 -0.013140 0.002589 
+-0.006374 0.002183 0.003039 0.000903 -0.000562 -0.000596 
+-0.005348 -0.000280 0.002079 -0.003401 0.007443 0.002666 
+-0.006678 0.006811 0.001326 -0.005133 0.000834 -0.001282 
+0.001225 -0.003830 0.000434 0.005680 0.002799 0.002118 
+0.010531 0.007648 0.001035 0.000241 0.002688 0.000359 
+-0.000220 0.005845 -0.000382 0.014708 0.026406 -0.012015 
+0.034456 0.026495 -0.037441 0.003000 0.012474 -0.001165 
+-0.323232 -0.171717 4.702020 -0.910828 -0.831210 6.175159 
+-1.070312 -1.114583 5.843750 -0.945876 -1.074742 4.474227 
+-0.718101 -0.783383 2.970326 -0.004293 -0.003967 0.020525 
+-0.004391 -0.001823 0.015231 -0.001252 -0.001332 0.008108 
+-0.001574 -0.003263 0.000831 -0.000140 -0.001714 0.000683 
+-0.001321 -0.001176 0.000550 -0.000070 0.001557 -0.001036 
+0.001875 0.001644 -0.003077 0.001897 0.000382 -0.001663 
+-0.000347 -0.001213 -0.001907 -0.002648 0.000192 -0.005451 
+0.003097 0.000391 -0.005249 0.003185 0.005012 -0.003232 
+0.001977 0.003103 0.001480 -0.000241 0.002320 0.000672 
+-0.001261 0.000153 0.000262 -0.000568 -0.000819 0.001525 
+0.002582 0.001878 0.005944 -0.001920 0.000688 0.004327 
+-0.000100 -0.001663 0.001667 0.002242 0.000553 -0.002075 
+0.002179 0.005043 -0.001581 0.001102 0.005822 -0.001941 
+-0.002393 -0.003103 -0.004655 0.000193 -0.005586 -0.001348 
+0.003632 -0.000843 -0.003172 0.001917 0.001161 -0.007772 
+-0.002293 -0.000679 -0.005138 -0.004242 -0.000887 -0.004048 
+-0.005158 -0.001113 -0.001059 -0.001078 -0.000269 -0.000133 
+0.001105 0.002260 0.000017 -0.001226 0.000455 0.000681 
+-0.003708 -0.000583 0.002692 -0.004229 -0.001766 -0.000348 
+-0.000492 0.000047 -0.002014 -0.000869 0.001749 -0.002672 
+-0.004404 0.001426 -0.003825 -0.002123 0.002326 -0.004221 
+0.002269 0.005305 -0.000607 -0.000092 0.005154 0.000116 
+-0.007110 0.001928 -0.010733 0.004687 -0.012354 -0.009897 
+-0.004691 0.003540 -0.016768 0.007878 0.002458 0.021827 
+1.515924 -0.076433 4.280255 2.000000 -0.390052 5.591623 
+2.646900 -0.555256 6.477089 3.009804 -0.568627 6.637255 
+2.506667 -0.426667 5.515555 0.007659 -0.002451 0.032365 
+0.001357 0.000255 0.009427 -0.000243 -0.001395 -0.004040 
+-0.004346 -0.011700 -0.011708 0.006707 -0.000537 -0.012500 
+0.025435 0.005846 -0.010630 0.023587 0.046085 -0.020255 
+0.003571 0.012868 -0.002075 0.005902 -0.008221 0.000039 
+-0.013279 -0.009262 0.005133 -0.009500 -0.000088 0.000961 
+-0.007861 0.001196 0.001216 -0.004836 0.005736 0.002005 
+0.002555 0.001419 0.000037 0.003818 0.000240 0.005646 
+0.013135 0.008165 -0.015771 0.004666 0.006725 -0.005067 
+0.012147 0.000404 -0.005693 0.020223 0.010832 -0.006245 
+0.017332 0.018469 -0.011413 0.006214 0.005047 -0.013086 
+-0.005536 0.000000 0.031140 -0.500000 -0.570866 5.059055 
+-0.477876 -0.831858 5.253687 -0.348571 -0.911429 4.365714 
+-0.191638 -0.825784 2.878049 -0.000847 -0.005588 0.013070 
+0.000247 -0.003020 0.003838 -0.005755 -0.007231 0.006781 
+-0.002007 -0.005507 0.010020 -0.001164 -0.003784 0.000821 
+0.001160 0.000608 -0.000218 -0.000655 0.000617 -0.000027 
+-0.002877 -0.003516 0.004933 -0.004856 -0.006237 0.003234 
+-0.000111 -0.004435 -0.001782 0.001697 0.000495 -0.003195 
+-0.002526 0.003099 -0.002182 0.003054 0.005390 -0.007092 
+0.004934 0.000993 -0.005365 0.001652 0.000989 -0.000473 
+-0.000950 0.000075 0.000566 -0.001767 0.000503 0.001681 
+0.000051 -0.000664 0.002316 0.000586 0.000530 -0.001402 
+0.002534 -0.000868 -0.002963 0.001034 -0.003813 -0.001785 
+-0.000100 -0.003083 -0.002362 -0.000907 0.000619 0.001115 
+-0.004050 -0.001327 0.001747 -0.001770 -0.003110 0.001684 
+0.000093 -0.005170 -0.001239 0.000473 -0.002024 -0.000387 
+-0.001846 0.004435 -0.008688 0.002500 0.000833 -0.009333 
+0.006643 0.005560 -0.006569 0.001980 0.007854 -0.002116 
+-0.000070 0.003735 0.001622 0.001111 0.001136 -0.000580 
+0.002389 -0.000804 -0.000006 0.002395 0.002760 0.000989 
+0.000511 0.000496 0.000117 -0.004125 -0.003673 0.004325 
+-0.009035 -0.002667 0.001517 -0.000506 -0.001422 -0.001201 
+-0.001717 -0.000783 0.004672 0.000669 0.000936 0.001147 
+-0.004120 0.000482 -0.009303 -0.001982 0.003636 -0.023785 
+-0.001529 0.007040 -0.007230 0.008388 0.004740 0.015481 
+1.215190 0.142405 2.920886 1.625337 -0.126685 4.210243 
+2.151099 -0.230769 5.324176 2.509677 -0.200000 5.841936 
+2.227074 -0.183406 5.384279 0.004659 -0.006960 0.037531 
+0.004298 -0.004266 0.010974 -0.003529 0.001263 -0.009066 
+-0.002509 -0.005853 0.000250 -0.003649 0.003292 0.006893 
+-0.000099 -0.000075 -0.000099 0.000482 -0.001747 -0.027111 
+-0.000552 0.001430 -0.008764 -0.002912 -0.001043 0.002602 
+-0.005623 -0.001023 -0.003255 -0.017669 0.003889 -0.004494 
+-0.005320 0.001187 0.004973 -0.004660 0.004342 0.025832 
+0.009908 -0.007414 0.029386 -0.005243 0.004769 0.005500 
+-0.005931 -0.004550 -0.002439 -0.007250 -0.004590 -0.008762 
+0.004671 0.000229 -0.002683 0.018907 0.006107 -0.009774 
+0.015945 0.009905 -0.022237 0.004315 0.004806 -0.016745 
+-0.000731 0.005302 0.008869 -0.001062 0.005866 0.028151 
+0.311321 -0.391509 3.396226 0.003235 -0.004750 0.028012 
+0.001813 -0.003328 0.011396 -0.000193 0.002421 -0.012296 
+0.003719 0.002301 -0.013777 -0.001736 0.002742 -0.000651 
+0.001740 0.000063 0.002451 -0.001224 -0.002806 -0.002115 
+0.002683 -0.002364 -0.002014 0.001740 -0.000565 -0.001457 
+0.000471 0.000270 -0.000651 -0.000346 -0.000166 -0.001314 
+0.000220 0.001204 -0.000005 0.002049 0.001736 0.002778 
+0.001702 0.001535 0.004432 -0.002674 0.004011 0.001032 
+0.001504 0.005929 0.000807 0.001490 0.003554 -0.000643 
+0.003735 0.000642 -0.000960 0.003618 -0.003601 -0.003589 
+0.004472 -0.002309 -0.005131 0.003953 -0.000078 -0.005659 
+0.003044 0.002102 -0.005944 0.002808 0.001100 -0.003175 
+-0.002195 -0.002195 -0.001626 -0.003642 -0.000607 0.003175 
+-0.002075 -0.000805 0.004436 -0.001140 -0.000287 0.001142 
+-0.000929 -0.001519 -0.000677 -0.001861 -0.005358 -0.001608 
+0.001310 0.001490 -0.000454 -0.001718 0.005907 -0.005424 
+0.003814 0.006398 -0.006314 0.001215 0.001562 -0.004160 
+-0.001904 -0.000675 -0.000095 -0.000896 -0.000153 0.000242 
+0.002066 0.003516 -0.001341 -0.000873 0.002935 -0.003567 
+-0.000907 0.001299 0.000392 0.003141 0.002010 -0.000405 
+0.002174 -0.000080 -0.001806 -0.000775 -0.000331 -0.001059 
+-0.002214 -0.000505 -0.000757 0.000414 -0.004873 0.002537 
+-0.000468 -0.001781 -0.000370 -0.002223 -0.001269 -0.005881 
+-0.002349 0.001859 -0.009267 0.000668 0.002473 -0.002959 
+0.006478 0.000699 0.009048 0.969283 -0.054608 2.453925 
+1.183871 -0.035484 3.712903 1.371324 0.062500 4.139706 
+1.411458 0.192708 3.437500 0.002849 -0.004358 0.010573 
+0.001584 -0.010429 -0.041240 0.001802 -0.011239 -0.047374 
+-0.003018 -0.006009 0.018126 -0.003975 0.003625 0.008649 
+-0.003643 0.004382 -0.010400 -0.003362 0.000997 -0.008134 
+-0.005532 0.001636 0.006881 -0.010820 -0.001991 0.014079 
+-0.006128 -0.001074 0.011163 -0.003147 -0.000236 0.002311 
+-0.008353 -0.001690 -0.000406 -0.003278 0.009629 -0.000990 
+0.001845 0.005969 0.007165 -0.001920 0.002614 0.005093 
+0.007859 0.002117 0.001471 0.017851 0.007453 -0.008218 
+0.003730 0.015159 -0.020635 0.006967 0.002263 -0.007254 
+-0.000259 -0.002926 -0.002772 -0.001388 -0.001605 0.000634 
+-0.002063 0.000562 -0.000018 -0.000245 0.000270 0.000585 
+0.002408 0.000346 0.001942 0.003591 -0.000675 -0.000455 
+0.001231 0.001919 -0.004885 -0.000656 0.008946 -0.003601 
+-0.004241 0.010082 -0.005380 -0.003948 0.008782 -0.008334 
+-0.000636 -0.002755 -0.003973 0.002102 0.001170 -0.006314 
+0.003786 -0.003180 -0.002022 0.002784 -0.001847 -0.002308 
+0.004970 0.001823 -0.001097 -0.000647 0.002816 0.000151 
+-0.000373 0.003866 0.000329 -0.004925 0.002125 0.000695 
+-0.004740 -0.001353 -0.000009 -0.003159 -0.002250 0.000981 
+-0.001744 -0.003640 0.001758 -0.002453 -0.005746 0.002208 
+-0.001619 -0.004393 -0.002004 0.000758 -0.003409 0.000758 
+-0.000342 -0.001706 -0.000684 -0.000251 -0.002727 -0.000188 
+0.001059 -0.004857 -0.004151 -0.000626 -0.005733 -0.003492 
+-0.002298 -0.002640 -0.001235 0.000304 0.000289 -0.000023 
+-0.001386 0.000492 0.002864 -0.003595 0.001279 0.000579 
+-0.001337 0.000134 0.001307 0.001372 -0.001477 -0.003377 
+0.003706 0.002722 -0.000173 0.002749 0.000200 -0.004213 
+0.000333 -0.002083 -0.006750 0.000704 -0.004157 -0.004509 
+0.004298 -0.000893 -0.007157 0.005530 0.007492 -0.008385 
+0.002205 0.009337 -0.005578 0.001562 0.004848 -0.003466 
+0.000991 0.002586 0.000043 0.000756 0.000799 0.001836 
+0.002871 0.002204 0.000500 0.001608 0.002158 0.000495 
+-0.001263 -0.000714 0.002050 0.000430 -0.003235 0.002311 
+0.000574 -0.001920 0.001655 -0.002671 -0.000035 -0.003182 
+-0.000270 0.006671 -0.001685 0.005095 0.002453 -0.023207 
+0.004228 0.005221 -0.010810 0.005653 0.000806 0.005449 
+0.003824 -0.002889 0.013795 0.001911 -0.002250 0.015051 
+0.002276 -0.001665 0.007264 -0.001821 -0.005238 -0.016690 
+-0.028605 0.005303 -0.046562 0.010836 0.007309 -0.032764 
+-0.005100 0.005315 0.003075 0.001888 0.003673 -0.005896 
+0.004276 0.005174 -0.010457 -0.003179 0.003908 -0.003394 
+-0.005535 -0.002689 0.005855 -0.007558 -0.003116 0.011896 
+-0.010506 -0.002280 0.010513 -0.007063 -0.001361 0.002009 
+0.001501 -0.003924 -0.006570 0.003022 -0.006105 -0.009897 
+-0.006524 0.002248 -0.009833 -0.002785 0.008754 -0.006111 
+-0.000610 0.000472 -0.001358 0.002146 -0.004453 -0.008463 
+0.009918 0.000584 -0.020604 0.006900 0.006640 -0.031680 
+0.007828 0.007279 -0.010420 -0.000383 -0.000968 -0.004858 
+-0.002161 -0.004506 -0.003198 -0.004920 -0.002439 0.001925 
+-0.004743 -0.004512 -0.002557 -0.003404 -0.002484 -0.002082 
+0.003657 0.003704 -0.006694 -0.001097 0.006261 0.000860 
+-0.001611 0.008338 -0.000142 -0.002632 0.003158 -0.001962 
+-0.000107 0.000808 -0.002770 0.001520 -0.000169 -0.001230 
+0.002183 -0.000395 -0.001412 0.002322 0.001139 -0.000469 
+0.000000 -0.000448 -0.000299 -0.001576 -0.000904 -0.004057 
+0.001392 -0.000012 -0.006947 0.001905 0.000812 -0.005434 
+-0.001394 -0.000971 -0.001217 -0.001925 -0.002106 0.002123 
+-0.001008 0.000078 0.001008 0.000108 -0.000230 -0.000137 
+-0.002101 -0.002171 -0.002732 -0.000974 -0.001134 -0.002754 
+-0.001065 -0.007321 0.000997 -0.000663 -0.002016 -0.001106 
+-0.001630 0.001463 -0.002934 -0.003661 0.000139 -0.002178 
+-0.003510 0.000700 -0.001058 -0.002902 0.000907 0.001669 
+-0.002547 0.005101 0.002539 -0.000161 0.008289 0.001435 
+0.000405 0.006331 -0.002471 0.003302 0.005008 -0.005920 
+0.001484 -0.001484 -0.002266 0.003180 0.001417 -0.002120 
+0.003350 0.003361 -0.001658 0.000948 0.004857 -0.001658 
+0.001752 0.003603 -0.000779 0.002203 0.003052 -0.002730 
+0.001696 0.003204 -0.003957 0.001395 0.001724 -0.002216 
+0.001238 -0.001823 0.000955 0.002922 -0.002795 0.004211 
+0.002018 0.000391 0.003582 0.001812 0.001872 -0.001451 
+-0.001977 -0.000338 -0.002341 -0.000767 0.000314 -0.001647 
+0.000966 -0.000955 0.001995 0.000306 0.000645 0.000286 
+-0.000066 0.001784 0.000290 0.000510 -0.000587 -0.000335 
+-0.001251 -0.001296 -0.001620 0.000616 -0.001896 -0.005831 
+0.000635 0.000241 -0.010582 -0.000928 0.001606 -0.011806 
+-0.001911 -0.000880 -0.011928 0.002922 0.006456 -0.003033 
+0.014437 0.008593 -0.002078 0.012365 0.009652 -0.008661 
+0.013465 0.010276 -0.012679 0.012375 0.008202 -0.012776 
+0.005234 0.000781 -0.005915 0.000271 0.000518 -0.000380 
+-0.002291 0.003913 -0.000426 -0.000763 0.004394 -0.008783 
+0.001103 0.000528 -0.011267 0.000864 0.002941 -0.005060 
+-0.005522 -0.001853 -0.000741 -0.005455 -0.000617 -0.002775 
+-0.005611 0.000700 0.001221 -0.005136 0.004129 0.000202 
+-0.003474 -0.000037 0.004119 -0.002351 0.001464 -0.001728 
+0.000328 0.003185 -0.010232 0.006601 0.005420 -0.011163 
+0.000282 0.005695 -0.002598 0.001022 0.002516 -0.003169 
+-0.001068 0.001342 -0.007630 0.000957 0.001673 -0.008096 
+0.005478 0.002860 -0.003260 0.004491 0.006403 -0.002850 
+0.004650 0.008087 -0.006091 0.000075 -0.000820 -0.001747 
+-0.003981 0.009420 -0.001333 -0.001128 0.004825 0.001039 
+0.000256 0.001031 0.001244 0.002800 0.000000 -0.002800 
+0.000762 -0.002918 -0.002362 0.001541 -0.000990 -0.001036 
+-0.000141 0.001797 0.000139 0.000687 0.001374 -0.003511 
+0.002168 0.001786 -0.003174 0.002824 0.001368 -0.003954 
+0.002229 0.001625 -0.002128 0.000319 0.002145 -0.000707 
+0.000168 0.002368 0.000214 0.001958 0.001435 -0.000068 
+0.002663 -0.001134 0.000772 0.002310 -0.001582 0.001204 
+0.000822 -0.000849 0.001366 -0.000801 0.000534 0.000331 
+-0.001997 -0.000643 0.001213 -0.000806 0.000403 0.000161 
+0.001032 0.000167 0.000500 0.001968 0.003689 -0.001279 
+0.001622 0.004866 -0.003445 0.003927 0.003921 -0.005045 
+0.003378 0.001913 -0.005943 0.003025 0.001085 -0.003387 
+-0.000744 0.003665 -0.007384 -0.002656 -0.001274 -0.003875 
+-0.003229 0.000232 -0.001266 -0.001803 -0.001097 0.000731 
+-0.001350 -0.001231 0.003590 -0.001363 -0.000816 0.003736 
+-0.001299 -0.000669 0.002331 0.000185 -0.000031 -0.000058 
+0.000507 0.001486 0.002500 -0.000835 0.003341 0.000992 
+0.000706 0.001320 0.000944 -0.003090 0.002422 -0.002672 
+-0.002190 0.000965 -0.000349 -0.000010 0.001440 0.001575 
+0.000887 0.000537 0.003528 0.000847 -0.001356 0.002710 
+-0.003700 -0.004458 -0.000673 -0.009031 -0.006201 0.002777 
+-0.009096 -0.007317 0.004943 -0.004237 -0.004041 -0.001527 
+-0.001943 0.002132 0.000200 0.000427 0.003098 0.001496 
+0.003426 0.002964 -0.005866 -0.000631 0.008613 -0.010674 
+0.003976 0.012037 -0.007715 0.010542 0.006133 -0.006779 
+0.008037 0.001538 -0.006668 0.006061 0.003668 -0.009161 
+0.003452 0.004066 -0.015803 -0.004032 0.002727 -0.001914 
+0.008933 0.007646 -0.007760 0.008239 0.007454 -0.014801 
+0.009375 0.010951 -0.013931 0.006918 0.011450 -0.003516 
+-0.008845 0.004025 -0.008209 -0.001917 -0.003112 -0.004918 
+-0.010247 0.001959 0.003998 -0.006439 -0.007154 0.001698 
+0.000625 0.003839 -0.006137 0.002992 0.016762 -0.011443 
+0.011207 0.013323 -0.009248 0.014730 -0.000348 -0.001904 
+0.007093 -0.004971 0.003283 -0.003532 0.003596 0.005170 
+-0.000049 0.010862 -0.000948 0.002175 0.008108 -0.007120 
+0.001577 0.002642 -0.008581 -0.000885 -0.001749 -0.006996 
+-0.002304 0.000126 -0.004829 -0.003689 -0.000711 0.000642 
+0.000568 0.000019 0.001446 -0.000018 0.000247 0.000061 
+-0.002234 0.002045 -0.001488 -0.000247 0.003377 -0.002526 
+0.000383 -0.000742 -0.001005 -0.000871 -0.001730 0.000716 
+-0.001519 -0.000647 0.000827 -0.001301 0.001489 -0.000740 
+0.001452 0.004186 -0.003884 0.004635 0.003090 -0.005210 
+0.000915 0.003938 -0.005640 0.000822 0.004839 -0.001479 
+0.000614 0.001023 0.000938 0.000122 -0.002414 0.001650 
+0.001559 -0.003485 -0.000298 0.000560 -0.002143 -0.003359 
+-0.001398 -0.001707 -0.004195 -0.000488 0.000854 -0.000528 
+0.000747 -0.002549 0.000341 -0.001237 -0.003750 0.000928 
+-0.000588 -0.000418 -0.001301 -0.000154 0.000769 0.000480 
+-0.003045 -0.001190 0.000525 -0.003145 0.000323 0.002823 
+-0.002182 -0.001193 0.001605 0.000743 -0.000178 -0.000198 
+0.000335 -0.000164 0.000919 -0.000818 -0.000782 -0.000100 
+-0.003222 -0.001672 0.001346 -0.002659 -0.003059 0.003812 
+-0.000547 -0.001527 0.004185 -0.000148 0.001012 -0.000688 
+0.003213 0.002488 -0.003937 -0.001699 -0.000205 -0.002481 
+-0.000794 0.000710 -0.000281 -0.000898 -0.000352 0.002578 
+0.000834 0.003305 0.001246 0.000376 0.002256 0.003008 
+-0.000739 0.006009 0.000117 -0.000595 0.003013 0.000612 
+-0.000465 -0.000675 -0.000709 -0.000665 -0.003998 -0.001379 
+-0.004362 -0.004362 0.006064 -0.002567 -0.001492 0.000234 
+-0.003558 -0.003664 -0.000018 -0.006430 -0.003970 0.000238 
+-0.005514 -0.000634 -0.000558 -0.002950 0.003196 -0.002064 
+-0.003436 0.004483 -0.001000 -0.003786 0.002855 0.004071 
+-0.004935 0.000042 0.001479 -0.003389 0.003592 -0.006156 
+0.001178 0.011861 -0.004864 -0.000974 -0.001555 -0.001514 
+0.003328 0.004421 -0.003378 0.006792 0.000579 0.002237 
+0.008770 -0.000564 0.008737 0.007970 -0.000454 0.009080 
+0.005339 0.001668 -0.001970 -0.001104 -0.000643 -0.000190 
+-0.012599 -0.003702 -0.004633 -0.011608 -0.009596 -0.008171 
+-0.009104 -0.008003 -0.004240 0.000441 -0.000216 0.001114 
+-0.001018 -0.005234 0.004170 -0.001396 -0.002552 0.002867 
+-0.001271 -0.000113 -0.000182 -0.007367 -0.000875 0.001063 
+-0.014033 -0.001725 0.005137 -0.007836 0.000440 0.005823 
+0.002638 -0.000968 -0.000821 0.003138 -0.001254 -0.002334 
+-0.002562 0.000496 0.003471 -0.009768 0.003099 0.005445 
+-0.012686 0.000490 0.005255 -0.002257 -0.006931 0.001314 
+-0.000605 -0.000402 -0.000767 -0.000922 0.003154 -0.000897 
+-0.001356 0.003492 -0.001251 -0.000462 -0.000621 -0.000053 
+-0.002035 -0.002007 0.000177 -0.000954 -0.001731 -0.000825 
+0.001694 -0.000680 -0.001584 0.002961 0.000331 -0.000324 
+0.001260 0.002299 0.001150 0.001217 0.000582 0.001852 
+-0.000436 0.000246 -0.000621 -0.000426 0.000476 -0.000014 
+-0.000824 -0.000670 0.001016 -0.001817 -0.000579 0.003607 
+-0.004667 -0.002051 0.000282 0.000630 -0.003047 -0.001576 
+0.001776 -0.003104 -0.001772 0.001681 -0.000038 0.000448 
+-0.002846 0.001745 0.001163 -0.005808 0.000413 0.000787 
+-0.005629 -0.000838 -0.000679 -0.005300 -0.000602 -0.001111 
+-0.005656 -0.000738 0.000738 -0.001288 0.001717 0.003089 
+-0.002017 -0.001442 0.002604 0.000420 -0.000102 0.000686 
+0.000369 0.002321 0.000949 -0.002159 -0.004182 0.004519 
+-0.003203 -0.006108 0.006871 -0.003594 -0.005809 0.004518 
+-0.003424 -0.003659 0.001771 -0.000940 -0.001294 -0.000238 
+0.000938 0.002750 -0.002438 0.003372 0.005341 -0.004840 
+0.004902 0.006433 -0.005072 0.004730 0.004625 -0.000012 
+0.002417 0.003407 0.000558 0.001070 0.003118 -0.002306 
+-0.003324 0.003880 -0.002877 -0.004110 0.003702 -0.004129 
+-0.003653 0.000773 -0.004534 -0.002092 0.000771 -0.003557 
+-0.002327 0.002268 -0.002617 -0.004048 0.003816 -0.002395 
+-0.004523 -0.001132 -0.001954 0.000572 -0.001849 -0.001088 
+-0.003262 -0.001478 0.002491 -0.006287 -0.001453 0.003031 
+-0.005303 0.000352 -0.000591 -0.001963 0.002356 -0.004767 
+-0.001036 0.001267 -0.006842 0.001346 0.002763 -0.009265 
+0.002900 0.002494 -0.024206 -0.005612 0.002184 -0.017585 
+0.003651 -0.004768 0.027870 0.403974 -0.682119 4.490066 
+0.756637 -0.911504 5.685841 0.879167 -1.045833 6.016667 
+0.884146 -0.932927 4.774390 0.003033 -0.000460 0.021052 
+0.002055 0.011094 -0.008258 -0.005370 0.010169 -0.017902 
+-0.001465 0.001992 -0.004855 -0.002151 -0.000329 -0.000007 
+-0.006074 -0.002433 0.001350 -0.003714 -0.004143 -0.000569 
+-0.004645 -0.001475 0.001637 -0.003370 -0.004079 0.004887 
+-0.001573 -0.001402 0.006762 0.002653 -0.003208 0.001726 
+0.001949 -0.004221 -0.001783 -0.002496 -0.004159 -0.003634 
+-0.003503 -0.003353 0.001322 -0.003431 -0.002432 0.004217 
+0.001250 -0.002273 0.002386 0.000586 -0.000059 -0.003048 
+-0.000186 0.001623 -0.003849 -0.001883 0.001809 -0.003853 
+-0.002241 -0.001043 -0.002511 0.000847 0.001685 -0.003363 
+0.002478 0.002217 -0.001043 0.001892 0.000385 -0.001857 
+0.002103 -0.000239 -0.002834 0.004882 0.002362 -0.002362 
+-0.000375 0.000476 -0.001084 -0.000313 0.000022 0.000183 
+0.000277 0.000323 -0.000275 -0.000133 0.002583 -0.000506 
+-0.000833 0.003754 -0.002295 0.000781 0.002386 -0.003973 
+0.002816 0.001697 -0.003472 0.001539 0.000980 -0.002889 
+-0.000010 -0.000278 -0.000116 -0.003248 -0.000308 0.000615 
+0.000322 0.001209 0.000161 0.002675 0.005459 -0.003585 
+0.006071 0.006000 -0.003642 -0.001000 0.003810 -0.002000 
+0.000086 -0.000523 -0.000286 -0.004678 -0.003114 -0.000218 
+-0.000740 -0.004173 -0.000209 -0.000825 0.001176 -0.000240 
+0.000358 0.001986 0.000489 0.001042 0.000864 -0.000271 
+0.001402 -0.000132 -0.000301 0.002003 0.000785 -0.000300 
+0.001777 0.002727 -0.000211 0.002369 -0.000154 -0.001046 
+0.001171 0.001447 -0.002687 0.000451 0.001729 -0.001729 
+-0.000258 0.003333 -0.000515 -0.001450 0.005373 0.001165 
+-0.001377 0.001957 -0.003188 -0.002018 0.005214 -0.003983 
+-0.001805 0.007984 -0.003288 -0.003901 0.009157 -0.004903 
+-0.008636 0.007828 -0.008410 -0.009273 0.000527 -0.004118 
+0.002098 0.001551 -0.012864 -0.000262 0.001705 -0.005376 
+-0.002165 0.004536 -0.004536 -0.005397 0.004683 -0.010576 
+-0.005075 0.005053 -0.007581 -0.002340 -0.002396 0.002743 
+-0.003583 -0.006004 -0.000799 -0.000797 0.000354 0.001499 
+0.001482 0.000289 -0.001855 0.005784 -0.000323 -0.006855 
+0.014116 0.004723 -0.030840 -0.021492 -0.004538 -0.008320 
+0.003169 -0.003356 0.045958 0.342466 -1.095890 6.680365 
+0.490385 -1.276442 7.192307 0.573499 -1.335404 7.190476 
+0.664820 -1.257618 6.731302 0.834356 -0.687117 4.662577 
+0.004604 0.020389 -0.022404 0.015357 0.008229 -0.029614 
+0.002642 0.000715 0.008480 0.001378 -0.001946 -0.000707 
+0.006087 0.014660 -0.026654 -0.005000 0.009270 -0.022391 
+-0.003088 -0.000880 -0.003274 0.000049 -0.001509 0.005367 
+0.004678 0.000109 -0.000640 0.006034 0.003466 -0.005378 
+0.002863 0.001619 -0.002366 -0.000421 -0.000800 -0.000400 
+-0.002537 -0.005000 0.000951 -0.000708 -0.003328 0.000054 
+0.002251 0.000798 -0.001586 0.001021 0.000342 -0.003075 
+-0.000588 0.005668 -0.004144 -0.001229 0.003224 -0.005901 
+-0.001445 0.000774 -0.003749 -0.002945 0.000487 0.000706 
+-0.001708 -0.001044 0.001967 0.001141 0.000501 -0.001359 
+0.004386 0.000430 -0.003095 -0.000464 0.001009 -0.005997 
+-0.000082 0.001556 -0.005611 0.002059 -0.000748 -0.003934 
+0.000382 0.000400 -0.002636 0.000987 0.003089 -0.002566 
+0.000210 0.005589 -0.003284 0.000091 0.003768 -0.002633 
+0.000954 0.000162 -0.000214 0.000207 -0.001516 0.002540 
+-0.000587 -0.001229 0.002959 0.000391 0.000293 0.000195 
+-0.000730 -0.000303 -0.004862 0.006572 -0.000976 -0.005904 
+0.003870 -0.003270 -0.003788 0.000430 -0.001221 0.003135 
+0.000176 -0.004215 0.002284 -0.001929 -0.000354 -0.000702 
+-0.000404 -0.000449 -0.002344 -0.000585 -0.000159 -0.002478 
+-0.001767 0.001562 0.000062 -0.000152 0.000108 0.000122 
+0.001090 0.000534 -0.001453 -0.000154 0.003227 -0.003265 
+0.003834 0.004880 -0.005224 0.009392 0.003353 -0.004473 
+-0.001897 0.006160 -0.002371 0.008273 0.000413 -0.007035 
+0.001311 -0.000884 0.000096 0.001272 0.001866 0.003528 
+-0.003296 0.001223 0.005843 -0.001558 0.003122 -0.002866 
+-0.002257 0.009659 -0.003298 -0.007825 0.008110 -0.009464 
+-0.008801 0.006585 -0.012051 -0.004911 0.005381 -0.005130 
+0.001379 0.000452 -0.002107 0.000982 -0.000993 -0.000972 
+-0.000159 0.002051 -0.001759 -0.002733 0.003643 -0.004768 
+-0.003910 0.001191 -0.004109 -0.003317 -0.002731 -0.002672 
+-0.000276 -0.000958 -0.002335 0.000353 0.000078 -0.003016 
+0.000738 -0.001088 -0.003797 -0.001558 -0.001064 -0.012309 
+-0.018234 0.017949 -0.007035 -0.010601 0.041648 -0.038619 
+-0.000455 -0.001588 0.038014 0.325991 -1.061674 6.973568 
+0.292479 -1.320334 7.403900 0.272040 -1.272040 6.929471 
+0.287066 -0.876972 5.731861 0.187166 0.005348 3.550802 
+0.000114 0.005329 -0.002238 -0.003245 0.001105 -0.024855 
+-0.009078 -0.004624 0.009529 -0.006038 -0.003491 0.003491 
+0.002676 0.020997 -0.016489 0.007215 -0.011259 -0.021075 
+0.002534 0.003107 -0.003711 0.002465 -0.008540 0.013461 
+0.002248 -0.003590 0.007558 -0.000348 0.002523 0.001168 
+0.000272 0.004554 -0.001238 -0.002667 0.003891 -0.004190 
+-0.002702 -0.001526 -0.000769 -0.003472 0.000623 0.002019 
+-0.000527 0.003635 0.000762 -0.003443 0.007732 -0.006887 
+0.002098 0.007447 -0.014214 -0.000617 0.004629 -0.005671 
+-0.001467 -0.003506 0.000791 -0.002487 -0.007047 0.001805 
+-0.004015 -0.003203 0.003209 0.000025 -0.001048 -0.002405 
+0.000404 -0.001181 -0.004059 -0.000593 0.000329 -0.003362 
+-0.002105 0.003291 -0.002985 -0.000838 0.003881 -0.005620 
+0.002834 0.005251 -0.007187 0.002721 0.002758 -0.007418 
+0.001702 0.000392 -0.002750 -0.002193 -0.002246 0.001253 
+-0.000008 0.000861 0.002997 -0.001388 -0.001017 0.001970 
+-0.000115 0.000703 0.000627 -0.000111 0.001515 -0.002402 
+0.002453 0.001968 0.000682 0.007048 0.000584 0.001400 
+0.007119 0.000806 -0.000470 0.002715 -0.001238 -0.001876 
+-0.000890 0.000005 -0.001593 0.000525 0.002266 -0.004202 
+0.001476 0.001476 -0.001476 -0.001726 -0.002303 -0.003025 
+-0.002733 0.001584 0.001413 -0.000139 0.003287 -0.002154 
+0.003290 0.002035 -0.004037 0.003955 0.001092 -0.004407 
+0.001898 -0.000778 -0.003888 0.004882 0.001285 -0.003209 
+0.002888 0.004747 -0.004029 -0.004010 0.004010 -0.001604 
+-0.004551 0.000809 0.001345 -0.000578 0.001436 0.000876 
+0.001899 -0.001005 -0.001908 0.003244 0.006521 -0.005090 
+-0.004964 0.004653 -0.007033 -0.006276 0.003006 -0.011053 
+-0.002241 0.001230 -0.010046 -0.001638 -0.003822 -0.004778 
+-0.000040 -0.001036 -0.002272 -0.001295 -0.000058 -0.003344 
+-0.002962 -0.005132 -0.004147 -0.003099 -0.004437 0.000492 
+-0.000702 -0.002621 0.001133 -0.000228 0.000411 -0.000624 
+-0.001221 0.005467 -0.006891 0.000115 0.004893 -0.006758 
+0.002255 -0.001342 0.005806 -0.000937 -0.003998 0.009489 
+-0.010869 0.000757 -0.013068 -0.011882 0.013191 -0.030618 
+0.004912 0.008633 0.024479 0.739130 -0.115942 5.652174 
+0.734007 -0.686869 6.124579 0.584158 -0.838284 5.379538 
+0.380342 -0.491453 3.619658 -0.000658 0.001895 0.011319 
+-0.003025 0.009229 -0.013326 0.003825 -0.000554 -0.016946 
+0.006140 -0.005554 0.000206 0.005634 -0.001315 0.000687 
+0.006348 0.001375 -0.006817 -0.000411 -0.000711 -0.007866 
+-0.001021 0.000226 -0.002460 0.000937 -0.008769 0.001841 
+-0.000240 -0.001596 0.001547 0.004982 0.004675 -0.002067 
+0.003209 0.003473 -0.002697 -0.000367 -0.001213 -0.000938 
+0.000816 -0.000211 -0.000658 0.001120 0.004203 0.001095 
+0.002592 0.009541 -0.001180 -0.002666 0.007493 -0.002318 
+-0.003904 -0.001217 0.003335 -0.002958 -0.004686 0.004116 
+-0.000596 -0.002314 0.004000 0.002911 0.001440 0.000707 
+0.005026 0.002950 -0.005517 -0.001153 0.000312 -0.007885 
+-0.001744 0.001666 -0.000475 -0.002321 0.000810 -0.008369 
+0.000064 -0.000921 -0.004445 0.002148 0.000489 -0.002835 
+0.000585 0.000795 -0.001696 0.000903 0.000591 -0.001749 
+0.001045 -0.001194 -0.002388 0.001538 -0.000758 -0.001217 
+0.001741 -0.001037 0.001741 0.000538 0.000816 0.000885 
+-0.000414 -0.000412 -0.000228 0.000386 -0.001595 -0.001646 
+-0.000807 0.000674 -0.003769 0.002773 -0.000578 -0.001662 
+0.001450 -0.002061 -0.001450 0.001841 -0.002559 -0.001654 
+0.002212 -0.002550 -0.001534 0.002200 0.000307 -0.002456 
+-0.001116 0.001335 -0.000259 -0.005769 -0.000769 0.003077 
+0.001457 0.001926 -0.003314 0.000957 0.005761 -0.001141 
+0.002765 0.003655 0.001764 0.009738 0.005613 -0.010504 
+0.001633 0.011297 -0.007639 0.003378 0.005514 -0.005997 
+-0.000319 -0.000317 -0.002865 0.000437 -0.001284 -0.000887 
+0.000040 0.000190 0.000441 0.002569 0.004995 -0.001436 
+0.005440 0.005403 -0.001613 -0.002324 0.002850 0.000367 
+-0.000931 0.000284 -0.001976 0.000536 -0.003722 -0.005072 
+0.002801 -0.000972 -0.000829 -0.003902 -0.001328 -0.006614 
+-0.000977 -0.002282 -0.002886 -0.000481 -0.001428 0.003578 
+-0.000136 -0.000241 0.000797 0.003164 0.003187 -0.004271 
+0.003503 0.004362 -0.004024 -0.000651 0.000109 -0.001282 
+-0.002457 -0.002504 -0.000147 -0.002308 -0.002565 0.003227 
+0.000758 -0.002720 0.006807 0.001997 -0.000776 0.002540 
+0.001767 0.004080 -0.014846 -0.000278 0.002155 -0.025189 
+-0.003543 0.002786 -0.004705 0.008330 -0.000739 0.015735 
+0.011531 -0.002105 0.018670 0.010240 -0.002816 0.008568 
+0.002847 -0.000948 -0.006027 -0.002883 0.004991 -0.017806 
+0.001622 0.001510 -0.016514 -0.009307 0.001219 0.001723 
+-0.002431 0.001408 0.004259 -0.003090 0.000827 -0.004890 
+-0.006158 -0.001001 -0.009258 -0.005044 -0.000867 -0.007802 
+0.003218 0.000926 -0.008857 0.013710 -0.000863 -0.011651 
+0.004991 0.005680 0.002788 0.005317 0.004596 0.000699 
+0.001560 -0.000355 0.004220 -0.000686 -0.002887 0.005703 
+-0.000765 -0.001874 0.003738 0.002180 -0.000159 -0.001995 
+0.004221 0.001662 -0.005616 0.001400 0.000605 -0.003175 
+-0.003238 -0.000658 0.002026 -0.001992 -0.005506 0.001289 
+0.002126 0.000359 0.001574 0.004376 0.003695 0.001327 
+0.001694 0.001694 0.003388 -0.001057 0.001098 -0.000203 
+-0.001399 0.002324 -0.002234 -0.004210 0.007046 -0.004269 
+-0.004841 0.006645 -0.000087 -0.003124 0.002947 0.003891 
+-0.003282 0.000296 0.002528 0.000667 -0.000897 -0.002256 
+0.006368 -0.000448 -0.004417 0.004593 0.002856 -0.002492 
+0.000388 -0.001546 0.001290 -0.001220 -0.004001 -0.000135 
+-0.000608 -0.004531 0.000221 0.000814 -0.005115 0.001131 
+0.001872 -0.004950 0.001895 0.002420 -0.002416 0.001412 
+0.003789 -0.000947 -0.000424 0.006593 0.001392 -0.001576 
+0.002551 0.003103 -0.002413 -0.000564 0.000048 0.000574 
+-0.003634 0.000853 0.003594 -0.001550 0.003029 0.007941 
+-0.000301 0.001006 -0.000106 0.001671 0.001062 0.001661 
+0.002044 0.000794 0.001533 0.000831 0.000873 -0.003324 
+0.002440 0.003003 -0.002345 -0.002369 0.002941 -0.002210 
+-0.002938 0.006048 -0.002246 -0.001001 0.006669 -0.002000 
+0.000607 -0.000108 -0.000696 0.001052 0.002381 -0.000807 
+0.003662 0.002099 0.000891 0.001016 -0.001187 -0.000724 
+-0.001261 -0.000725 -0.006137 0.001176 0.004348 -0.009290 
+0.006607 0.000508 -0.000954 0.000439 0.000899 0.001038 
+-0.000137 0.003422 0.000183 0.004485 0.003106 -0.001854 
+0.000427 0.001526 0.000538 0.001029 -0.005204 0.001430 
+-0.002670 -0.005276 0.001169 -0.004272 -0.003346 -0.002350 
+-0.001296 -0.000259 -0.005315 -0.000278 0.000743 -0.001541 
+-0.000234 -0.000577 0.001317 0.002649 0.000234 -0.001541 
+0.006985 0.002817 -0.008052 0.008481 0.006994 -0.011843 
+0.006723 0.008807 -0.008211 0.001656 0.006877 -0.000755 
+0.005248 -0.003119 -0.011266 0.008823 0.004789 -0.020207 
+0.006844 0.010166 -0.020952 0.006468 0.000387 -0.014926 
+0.002007 0.001582 -0.011971 0.002140 0.000584 -0.005076 
+0.001678 -0.000310 0.001022 -0.000103 -0.001094 0.004785 
+-0.001613 -0.000762 0.004231 -0.001698 0.000219 -0.000145 
+0.000612 0.000391 -0.003474 0.006376 0.003490 -0.005040 
+0.012115 0.007560 -0.004768 0.013321 0.003121 -0.004143 
+-0.000689 0.001539 -0.000897 0.001740 0.003665 0.001454 
+0.002484 0.002202 -0.003667 0.007992 0.001592 -0.008013 
+0.010696 0.008615 -0.006428 0.008920 0.005436 -0.003958 
+0.001426 0.004631 -0.002493 0.004690 0.000387 -0.013488 
+-0.002308 0.000082 -0.001146 -0.001582 0.004134 -0.011149 
+0.000684 0.001058 -0.002091 -0.005770 0.002049 0.002885 
+-0.002493 0.002648 -0.000770 0.004054 0.004382 -0.005417 
+0.007515 0.006244 -0.006922 0.004650 0.005546 0.001133 
+-0.001876 0.002953 -0.001059 -0.000126 0.004069 -0.001783 
+0.004517 0.003080 0.000274 0.001126 0.001144 0.000989 
+-0.000262 0.001186 -0.001300 -0.001421 -0.000926 0.000739 
+-0.000625 -0.001205 0.003470 -0.000603 -0.006412 0.001809 
+-0.003550 -0.006766 -0.001697 -0.002824 -0.004187 -0.005551 
+0.002661 0.000535 -0.006387 0.003285 0.002744 -0.007604 
+0.006625 0.002130 -0.002101 0.002910 0.001517 0.004754 
+-0.000013 0.002174 0.001844 -0.002432 -0.001717 -0.000184 
+-0.003114 0.001410 0.000069 0.000606 0.002081 0.000722 
+0.005750 0.002546 -0.003666 0.004005 -0.000451 -0.005472 
+0.000000 0.004809 -0.002595 -0.003247 0.003013 -0.001405 
+-0.003062 0.006290 -0.002130 0.002292 0.006135 -0.005376 
+-0.000238 0.000073 -0.003306 0.000781 -0.000338 -0.001588 
+-0.000794 0.000163 -0.002951 0.000529 -0.002851 -0.005668 
+-0.000071 -0.003155 -0.005840 0.004943 0.000815 -0.002906 
+0.002561 0.000555 0.002578 -0.000522 0.000217 0.003367 
+-0.001837 0.001395 -0.000150 -0.003178 0.001009 -0.000696 
+-0.004681 -0.001533 0.000845 -0.006558 -0.000790 0.004165 
+-0.006193 0.002230 0.001734 -0.002971 0.002683 -0.003437 
+-0.000355 0.001448 -0.005200 -0.000304 0.000876 -0.003460 
+-0.001014 0.000000 -0.000068 0.001244 0.003107 0.001557 
+0.000326 0.004149 -0.000606 0.000271 0.005022 -0.002072 
+0.002171 0.007547 -0.004727 0.004985 0.008350 -0.010393 
+0.006229 0.007273 -0.010852 0.002879 0.004890 -0.009872 
+-0.000936 0.003813 -0.010610 -0.001015 0.002883 -0.011756 
+0.001300 -0.000396 -0.010172 0.004378 -0.001846 -0.007492 
+0.004487 -0.001563 -0.005921 0.001539 -0.001225 -0.005486 
+-0.000170 -0.000620 -0.005201 -0.001196 -0.001364 -0.004724 
+-0.002797 -0.003220 -0.003821 -0.004615 -0.003077 -0.002583 
+-0.006240 -0.001659 -0.001057 -0.006496 -0.001324 -0.000581 
+-0.003823 0.000038 -0.001679 0.000153 0.003250 -0.002545 
+0.003173 0.004490 -0.000633 0.002940 0.002833 -0.001305 
+0.001315 0.001433 -0.003198 -0.004074 0.000329 -0.006461 
+0.000933 -0.002976 -0.002140 0.003325 -0.003236 -0.003800 
+0.002277 -0.003029 -0.003836 -0.003618 0.002699 -0.003180 
+0.001554 0.005797 -0.005262 0.002209 0.000616 -0.004024 
+0.000084 -0.002840 -0.001727 -0.001291 -0.002464 0.000443 
+-0.001134 0.001053 -0.001700 -0.002538 0.002769 -0.004154 
+-0.001090 -0.000133 -0.000542 0.002797 0.002575 -0.002366 
+-0.000367 0.000944 -0.001259 -0.001982 0.001480 0.000934 
+-0.001733 0.001344 0.000086 0.000785 0.000476 0.000013 
+-0.000033 -0.002745 0.000596 -0.003108 -0.007593 0.001407 
+-0.001919 -0.010894 0.005394 -0.001715 -0.010052 0.005265 
+-0.000165 0.000083 0.002810 -0.000622 0.001866 -0.000472 
+0.005388 0.000561 -0.004377 0.004339 -0.001016 -0.004799 
+0.000727 0.000597 -0.000713 -0.000844 -0.002011 -0.002076 
+0.001288 0.003184 -0.003456 0.001608 0.001576 -0.003385 
+0.000911 0.000600 -0.001871 0.001472 0.001495 -0.000782 
+-0.000315 0.001697 0.000325 -0.000487 0.000770 0.000075 
+-0.000916 -0.000071 -0.001498 -0.000732 0.004198 -0.001310 
+-0.000492 0.000082 -0.000492 0.000387 -0.000610 -0.000072 
+0.000498 -0.001006 -0.000172 0.000919 -0.000681 0.000127 
+0.009520 0.001229 -0.007800 -0.000954 0.000317 -0.000506 
+-0.000007 -0.001338 -0.001340 -0.001969 -0.000389 -0.002060 
+-0.003716 0.001353 -0.000647 -0.001208 0.001759 0.000322 
+0.000306 -0.000760 -0.000421 0.001336 -0.001647 -0.001881 
+0.000355 -0.000740 -0.002196 -0.000653 -0.000494 -0.001719 
+0.000612 -0.000841 -0.001198 0.004816 0.002053 -0.002921 
+0.004725 -0.002781 -0.001255 0.006456 0.001918 0.000631 
+0.002194 0.003592 0.000233 -0.000009 0.002795 -0.000601 
+-0.000089 0.002320 -0.000884 0.001660 0.002976 -0.002861 
+0.003185 -0.000780 -0.003120 0.003099 0.000517 -0.003407 
+0.003010 0.001626 -0.004845 0.003226 0.001323 -0.005516 
+0.002348 -0.000750 -0.002437 0.002838 -0.000445 -0.001457 
+-0.000136 -0.000659 -0.002159 -0.001447 -0.000730 -0.002152 
+-0.001520 0.000400 -0.002320 -0.003218 -0.000869 -0.000158 
+-0.004069 -0.003668 0.002987 -0.004489 -0.001029 0.000047 
+0.000425 0.000429 -0.001427 0.001989 0.001601 -0.002819 
+0.001435 0.002033 -0.002051 0.002489 0.003229 -0.001448 
+0.005459 0.008397 -0.001699 0.012963 0.007815 -0.005148 
+0.001211 0.010651 -0.003146 -0.000930 0.000846 -0.000098 
+0.003294 -0.001655 -0.001576 0.008052 -0.001379 -0.001458 
+0.010656 0.001186 -0.000608 0.006797 0.003356 -0.002292 
+0.001466 0.000115 -0.000500 -0.001368 0.000474 0.002929 
+-0.002437 0.000314 0.003228 -0.001760 -0.000880 0.001920 
+0.000195 0.000643 -0.000110 0.001234 0.002969 -0.003199 
+0.000000 0.003228 -0.004567 -0.001975 0.000882 0.000273 
+-0.002720 -0.002749 -0.000006 -0.000022 -0.000646 -0.001013 
+-0.003835 -0.002616 0.000305 0.001111 -0.003175 -0.000476 
+-0.000720 -0.008357 0.002545 0.003617 -0.004429 0.003358 
+0.006342 -0.000722 -0.002918 0.001816 0.004262 0.001009 
+-0.002075 0.000584 -0.003630 0.001579 0.002331 -0.003910 
+0.000043 0.000160 -0.002565 -0.000323 0.000980 -0.001513 
+-0.002179 0.000619 -0.000789 -0.000931 -0.000652 -0.000863 
+-0.003870 -0.004585 0.003463 -0.005954 -0.004136 -0.000773 
+-0.003032 0.000964 -0.000414 -0.000762 0.001738 0.000651 
+0.000578 0.001316 0.001709 0.000896 0.001498 -0.004485 
+0.005921 0.002130 -0.000711 0.002365 -0.000113 0.000573 
+0.001669 -0.000496 0.000334 0.001839 -0.001640 0.000305 
+-0.000015 -0.001992 -0.001400 -0.003088 0.000281 -0.004772 
+-0.001695 0.005629 -0.004798 0.001607 0.009040 -0.002611 
+0.005977 0.008982 -0.004380 0.005964 0.008349 -0.000895 
+-0.002383 0.011916 -0.012393 -0.002842 0.010276 -0.011330 
+-0.000596 0.006103 -0.005496 0.000405 0.002014 -0.002696 
+-0.000852 0.000747 -0.001930 -0.000781 0.000937 -0.000635 
+0.001405 0.001108 -0.000946 0.001296 0.000303 -0.002171 
+0.002510 0.001065 -0.002269 0.002282 0.001711 -0.000665 
+0.002199 0.001986 -0.002411 0.002625 0.004319 -0.001376 
+0.002788 0.005624 -0.001589 0.001387 0.005075 -0.002074 
+-0.000564 0.002744 -0.001936 -0.001657 0.000543 -0.000663 
+-0.000993 0.002376 -0.004161 0.002379 0.003802 -0.001161 
+0.005758 0.003097 -0.001161 0.004380 -0.001577 -0.000993 
+0.000022 -0.002248 -0.002256 -0.001207 -0.002890 -0.002132 
+0.000122 -0.003107 -0.001940 -0.000864 -0.001887 -0.002319 
+0.000172 -0.000369 -0.000097 -0.001842 0.001303 -0.000633 
+0.000012 -0.000009 -0.001037 0.003047 -0.001475 -0.000982 
+0.004965 0.000775 0.003181 0.002547 0.000271 0.004955 
+-0.000129 -0.001172 0.003614 -0.002528 -0.000859 0.000441 
+-0.000396 0.000521 -0.000952 -0.000125 0.001037 0.000014 
+-0.001393 0.002751 0.000322 0.001753 0.004617 0.000091 
+0.003656 0.005888 -0.003288 0.004174 0.004437 -0.005505 
+0.003561 0.003388 -0.006823 0.004871 0.004960 -0.007158 
+0.003028 0.004919 -0.006932 0.002592 0.001060 -0.004298 
+0.001249 -0.001528 -0.002681 -0.001133 0.000020 -0.002753 
+-0.000071 0.005902 -0.001511 -0.000843 0.003718 -0.002517 
+-0.001670 0.002189 -0.000293 -0.000840 0.003598 -0.000450 
+-0.001672 0.000015 -0.003286 0.000602 0.001902 0.000317 
+0.000264 -0.002423 0.000464 -0.000605 -0.005487 0.001878 
+-0.002833 -0.005401 -0.001080 -0.001015 -0.000370 -0.001255 
+-0.000738 -0.000181 -0.000578 0.000252 0.002038 -0.002962 
+-0.001833 0.002778 -0.003006 -0.003567 0.002924 -0.000643 
+-0.003040 0.001575 0.004883 -0.000181 -0.000850 0.004183 
+0.002911 0.001531 -0.001285 0.001710 0.000326 0.000202 
+0.001269 0.000004 -0.000412 -0.000136 0.000364 0.000344 
+-0.001130 0.001631 0.000627 -0.000381 0.002476 -0.003429 
+0.005109 0.001324 0.002255 0.006584 -0.001590 0.001135 
+0.002673 -0.002899 0.001016 0.003385 -0.003512 0.000739 
+0.001709 -0.002124 -0.000091 -0.002546 -0.001906 -0.000351 
+-0.002443 -0.002093 0.000465 -0.000937 0.000358 0.000808 
+-0.000469 -0.000129 -0.000024 -0.003501 0.007144 -0.008963 
+-0.007488 0.012973 -0.015633 -0.004179 0.011826 -0.016853 
+0.000979 0.008544 -0.010811 0.003176 0.005934 -0.002691 
+0.003332 0.001300 -0.003758 0.007134 0.001300 -0.001948 
+0.004307 0.001141 0.000694 -0.001436 -0.000704 0.002069 
+-0.005327 -0.000808 0.001877 -0.004234 0.000929 -0.000826 
+-0.000566 0.001977 -0.004382 0.003176 0.000913 -0.003445 
+0.000999 -0.001095 -0.000797 -0.002303 -0.000769 -0.000977 
+-0.002970 0.000609 -0.003173 0.000711 0.002133 -0.006963 
+0.003248 0.005625 -0.004640 -0.004505 0.006337 -0.007558 
+0.001534 0.001243 -0.002884 0.000339 0.002432 -0.001473 
+0.001608 0.002762 0.000082 0.001678 0.004198 -0.001819 
+-0.002310 0.003080 -0.002782 0.002931 0.006178 -0.002796 
+0.005477 0.003986 -0.005907 0.001160 -0.002245 -0.004415 
+0.001621 0.005935 -0.005502 0.001005 0.001991 -0.004959 
+0.000301 0.000375 -0.001297 -0.000235 -0.000941 0.000429 
+0.000463 0.000500 -0.000348 0.001942 0.001424 -0.002735 
+0.003276 -0.000008 -0.003298 0.003285 0.003996 -0.005844 
+0.003643 0.001555 -0.006675 0.001495 0.001647 -0.008908 
+0.003321 0.007828 -0.008114 0.005710 0.007526 -0.003553 
+0.002090 0.002970 0.002082 0.000415 0.001869 -0.003229 
+0.001334 0.001676 -0.001782 -0.000225 0.001078 0.000174 
+-0.000446 0.000402 0.000116 0.001740 -0.000613 -0.000661 
+0.000916 -0.002332 -0.000369 -0.002224 -0.003008 0.000513 
+-0.001964 -0.000618 -0.001228 -0.003132 0.000149 -0.000994 
+-0.003359 -0.003281 0.000000 -0.001652 -0.004688 0.000620 
+-0.001570 -0.003458 0.000373 -0.002211 -0.001227 -0.000938 
+-0.000014 -0.000468 -0.000641 -0.000375 -0.000777 -0.001904 
+0.003896 0.001580 -0.004668 0.000698 0.003662 -0.006538 
+-0.001181 0.003811 -0.007159 0.000317 0.004039 -0.007811 
+-0.000218 0.001371 -0.008537 -0.001153 0.002005 -0.004687 
+0.003905 0.000651 0.001040 0.004623 -0.000076 -0.001846 
+-0.001550 -0.000311 -0.001197 -0.004443 0.003110 -0.002765 
+-0.002642 0.004435 -0.000141 0.001689 0.005171 0.002189 
+0.004247 0.004846 0.001277 0.003120 0.001536 0.002558 
+-0.000066 0.000100 -0.000019 0.000253 -0.000518 -0.000099 
+0.001269 0.001629 0.001857 -0.004186 0.002650 0.001384 
+-0.005559 0.002496 0.000822 -0.002661 0.001722 0.002292 
+0.004894 0.003901 -0.004296 -0.001187 0.018040 -0.007897 
+-0.007169 0.019145 -0.010272 -0.007701 0.017674 -0.009241 
+-0.004388 0.011507 -0.011700 -0.002093 0.004723 -0.008238 
+0.003671 0.000127 -0.006482 0.002968 0.002199 0.000755 
+0.001162 -0.001509 0.000272 0.004121 0.000782 -0.002006 
+0.005037 0.004106 -0.002557 0.001257 0.005211 -0.000797 
+-0.000081 0.001071 0.000668 0.000825 -0.001308 0.003581 
+-0.001529 -0.004256 0.003409 -0.001470 -0.002336 -0.000919 
+-0.001909 0.000122 -0.000848 0.001139 -0.000438 -0.004887 
+0.006603 0.004550 -0.007941 0.011011 0.005445 -0.001237 
+0.003620 -0.002829 -0.004471 0.006227 0.008454 -0.005784 
+-0.001289 -0.000591 -0.003134 0.000966 -0.002056 -0.003187 
+0.002658 0.000488 -0.003255 0.000837 0.001124 -0.002487 
+0.001183 0.000986 -0.002536 0.000145 0.001592 -0.003089 
+0.000779 0.001678 -0.003417 0.001021 0.003962 -0.002236 
+0.001617 0.005697 -0.003756 0.004427 0.002901 -0.005802 
+0.003827 0.007302 -0.002953 0.004882 0.007124 -0.003718 
+0.004230 0.007752 -0.003730 0.000081 0.002396 0.001073 
+0.002553 -0.001355 -0.001533 0.002636 -0.000880 -0.002052 
+0.003626 -0.000228 -0.002998 0.003158 0.003972 -0.003147 
+0.001105 0.000202 0.000059 -0.001108 -0.001894 0.004282 
+0.000996 -0.000155 -0.001034 0.004224 0.000981 -0.000756 
+0.003022 0.003758 0.001289 0.000831 0.003736 0.000292 
+-0.000287 0.000156 0.000061 -0.000220 -0.001822 -0.000477 
+0.001302 -0.001771 -0.000723 0.004788 -0.000905 -0.002639 
+0.002747 0.003895 -0.002870 0.005788 0.001963 -0.000206 
+0.003297 0.001212 -0.002473 0.001808 0.002791 -0.001070 
+0.001400 0.005040 0.000280 0.001519 0.008552 -0.002804 
+0.003127 0.009015 -0.003417 0.004299 0.005812 -0.000309 
+0.002911 -0.000863 -0.004134 0.000687 0.000237 -0.005146 
+-0.000155 0.000956 -0.000962 -0.005443 -0.002243 0.001040 
+0.002175 0.003276 0.002316 0.006826 0.003826 -0.003609 
+0.003213 0.001051 -0.002332 -0.002030 0.000726 0.000536 
+0.000022 0.001497 -0.000118 0.001426 0.002899 0.000774 
+0.001166 0.003294 0.001514 -0.002370 0.002718 0.001522 
+-0.004292 0.005374 -0.000799 -0.000422 0.001845 -0.000132 
+0.002167 -0.001529 0.000855 0.003966 0.002243 0.001211 
+0.001315 0.004097 0.002809 0.000540 0.001455 0.008667 
+0.003142 -0.008966 0.001670 -0.002109 0.001003 -0.002207 
+-0.005904 0.006347 -0.005102 -0.006311 0.008734 -0.005970 
+-0.004068 0.005850 -0.005232 0.000194 -0.000188 -0.003333 
+0.000308 -0.004267 -0.000860 0.000536 0.000772 -0.002371 
+-0.000734 0.001594 -0.000488 0.002071 -0.000502 -0.000784 
+0.001492 -0.001258 0.000158 -0.000161 0.001418 -0.000562 
+0.000145 0.001738 -0.001429 -0.000119 -0.001067 -0.000137 
+-0.003082 -0.002055 0.002148 -0.000184 -0.003206 0.003466 
+-0.000152 -0.000048 0.003435 -0.000645 0.001548 0.002213 
+-0.000620 -0.000207 0.001653 0.000071 -0.000661 0.002217 
+-0.001249 0.000958 0.001078 0.000180 0.000013 -0.000103 
+0.005165 0.002468 -0.002697 0.006302 0.000937 -0.002795 
+0.003269 0.000877 -0.000917 -0.001530 -0.000166 0.000548 
+-0.002445 -0.001198 0.001381 -0.000778 0.001426 -0.001400 
+-0.001824 0.003672 -0.000910 -0.001806 0.002582 -0.000580 
+0.001037 0.003108 -0.003453 0.002053 0.004251 -0.002198 
+0.005212 0.000827 -0.003054 0.004767 0.003672 -0.002046 
+0.003505 0.006705 -0.002475 -0.000366 0.007665 -0.003935 
+-0.003042 0.001609 -0.003751 -0.007575 0.001920 0.000657 
+-0.014974 -0.001237 0.008032 -0.007809 -0.004557 0.002362 
+-0.002693 0.004924 -0.001281 0.000829 0.009618 -0.009960 
+0.005313 0.000051 -0.004162 0.002701 0.001572 0.000008 
+0.000545 0.000392 -0.000095 -0.001154 -0.002154 0.000095 
+-0.002817 -0.003462 0.000206 -0.003556 -0.002441 -0.001932 
+0.000423 -0.001906 -0.002022 0.002961 -0.002414 -0.001319 
+0.001057 -0.000455 -0.001366 -0.003844 -0.001183 0.000296 
+-0.006859 -0.001188 -0.000104 -0.005174 -0.002248 0.000816 
+-0.000087 0.000349 -0.002266 -0.001969 0.001191 -0.002928 
+-0.001180 -0.001222 -0.002530 0.000015 -0.000778 -0.001058 
+-0.002490 -0.000965 -0.000343 -0.002462 0.000000 -0.003462 
+-0.003156 -0.001156 -0.002587 -0.001902 -0.000497 -0.004827 
+-0.000883 -0.000287 0.000484 -0.000864 0.000670 -0.000818 
+0.000224 0.003838 -0.004258 -0.001717 -0.000364 -0.003537 
+-0.004564 0.001341 -0.000284 -0.004493 -0.002974 0.001638 
+-0.000232 -0.005035 0.000107 0.003166 -0.002657 0.000569 
+0.004891 -0.003159 0.000479 0.004627 -0.000389 0.002312 
+0.003080 0.004135 0.000651 -0.001871 0.000119 -0.000846 
+-0.003373 -0.005600 -0.001709 -0.000815 0.000923 0.001384 
+-0.003795 0.006459 0.003536 -0.005433 0.009699 0.002442 
+-0.003607 0.009006 0.000874 -0.002017 0.002545 -0.000037 
+0.002781 -0.004148 0.003104 -0.001528 -0.004996 -0.001225 
+-0.000433 0.000820 0.000187 -0.000155 0.004296 0.001915 
+0.001353 0.001353 -0.002435 0.001359 -0.000600 -0.001558 
+0.000386 -0.000777 -0.002131 0.000000 0.003106 -0.003636 
+-0.000146 0.003504 -0.003942 0.000944 0.001768 -0.004239 
+0.001558 -0.000022 -0.002857 0.001263 -0.001183 -0.000160 
+0.000510 -0.000200 -0.000416 0.001803 0.000438 0.000049 
+-0.001331 -0.000983 -0.002564 -0.002193 0.001096 -0.004593 
+-0.002624 0.001474 -0.002349 0.002313 0.001119 -0.003507 
+0.003881 -0.000209 -0.000418 0.002868 0.000862 -0.000011 
+0.000780 0.000094 0.001476 0.000252 -0.000027 0.000299 
+0.000824 -0.001236 -0.004409 0.000755 0.004168 -0.005119 
+-0.000585 0.000292 -0.004308 -0.001071 0.000662 -0.000377 
+0.006814 0.003455 -0.000633 0.000880 0.006393 -0.005928 
+-0.001321 0.003397 -0.004149 -0.000288 0.001431 -0.002004 
+-0.000937 -0.000375 -0.001027 -0.000862 0.000663 -0.002021 
+-0.001593 0.003727 -0.005115 -0.003522 0.000811 -0.003353 
+0.014514 0.003636 -0.015952 0.007398 0.010061 -0.011408 
+0.000766 0.010445 -0.002895 -0.005118 0.004225 0.002754 
+-0.013539 -0.004513 0.003947 -0.010592 -0.007833 0.006116 
+-0.004405 -0.004447 0.002908 -0.001843 -0.001460 0.000701 
+-0.002829 -0.000865 -0.000284 -0.002847 -0.000933 -0.000783 
+-0.001695 -0.001311 -0.000234 -0.001391 -0.002241 0.000386 
+0.001520 -0.001781 -0.000633 0.001726 0.001724 0.000345 
+-0.002332 0.000929 -0.001733 0.000081 -0.001626 -0.002520 
+-0.001562 -0.003596 -0.000413 -0.002233 -0.002517 -0.000920 
+0.000010 0.000988 -0.002464 0.001095 -0.001095 -0.000547 
+-0.004211 -0.003008 0.001203 -0.001443 -0.003831 -0.000970 
+-0.003029 -0.000990 -0.003745 -0.003291 -0.001815 -0.003650 
+-0.004026 0.001980 0.000508 -0.003335 -0.000880 0.000719 
+-0.001645 0.000198 0.000500 -0.000535 0.000570 0.002062 
+0.004087 0.001306 0.000909 0.001325 0.010216 0.000821 
+-0.000408 0.009264 0.000396 0.000376 0.006238 0.001807 
+0.000006 0.004683 0.001328 -0.000376 0.007122 -0.001725 
+-0.000367 0.007539 0.000814 -0.000554 0.006420 -0.000158 
+-0.001223 -0.000259 0.001708 -0.002478 0.006672 0.008664 
+-0.004741 0.010724 0.007243 -0.004252 0.010318 0.004690 
+-0.003659 0.006601 0.001376 -0.000464 0.001437 -0.001193 
+-0.001715 -0.001704 -0.002372 0.003077 0.004622 -0.003623 
+0.003239 0.005263 -0.002069 0.001693 0.000263 -0.003534 
+0.003014 0.000982 -0.004127 0.003259 0.000487 0.000847 
+0.000529 -0.000694 -0.000673 0.000463 0.000254 0.001045 
+0.000681 0.000341 0.000341 0.000725 0.001449 0.000000 
+0.001637 0.003702 -0.002790 0.002514 0.004483 -0.003077 
+0.001960 0.002500 -0.000356 -0.000345 -0.000625 -0.000416 
+0.000499 -0.000827 0.000008 0.000519 -0.000227 -0.000187 
+-0.000105 -0.000305 -0.001124 -0.000470 0.004396 -0.000811 
+-0.002875 0.004879 -0.002340 -0.001495 0.005667 -0.001791 
+0.001368 0.005083 -0.006645 0.003037 0.005095 -0.006319 
+0.002266 0.004062 -0.004531 -0.001108 0.001662 -0.002720 
+0.002265 0.003272 -0.001175 -0.000467 0.004163 -0.001685 
+-0.002692 0.004038 0.000606 -0.002270 0.003615 0.001244 
+-0.001615 0.002302 0.000867 0.001782 0.000363 0.000962 
+0.003794 0.005977 -0.001398 0.002716 0.004739 0.000690 
+0.001591 0.000943 0.002203 -0.000679 -0.002744 0.001359 
+-0.001501 -0.007946 -0.002934 -0.005046 -0.005827 -0.004144 
+-0.003530 -0.004536 -0.002228 -0.007205 0.003858 -0.000608 
+-0.000741 0.000808 0.000998 0.000966 0.002540 -0.008824 
+0.003854 -0.001778 -0.005083 -0.000210 -0.004645 -0.004354 
+0.001686 -0.004726 -0.003681 0.003955 -0.003086 -0.001722 
+0.003253 -0.000731 -0.000885 0.002071 0.001489 -0.000019 
+0.001402 0.001645 0.000351 -0.000210 -0.000528 -0.000146 
+-0.001898 -0.001663 -0.000334 -0.000500 0.001263 -0.000885 
+0.000153 -0.001690 -0.003688 -0.000278 -0.003112 -0.001532 
+-0.001824 -0.004574 -0.000782 -0.004642 -0.004846 -0.001857 
+-0.005825 -0.001551 -0.001054 -0.000881 0.000955 0.000720 
+0.000761 0.001334 -0.002659 -0.000116 0.000334 -0.001365 
+-0.000063 0.005377 0.002362 0.003766 0.000688 -0.002714 
+-0.000080 0.003623 -0.002645 -0.001163 0.001938 -0.001008 
+-0.003348 -0.000720 -0.002786 -0.003077 0.000930 -0.001016 
+-0.000282 -0.000080 -0.000286 0.001701 -0.001503 -0.000314 
+0.000377 -0.001900 0.001026 -0.002754 -0.001211 -0.002362 
+-0.006291 0.001285 -0.001889 -0.003238 0.003784 -0.001186 
+-0.005859 0.004296 0.004301 -0.007772 0.010353 0.009783 
+-0.008822 0.012519 0.006247 -0.008928 0.008343 0.004405 
+-0.003291 0.006142 0.000337 -0.000353 0.001366 -0.002891 
+0.002025 0.005491 -0.001587 -0.000298 0.002629 -0.004661 
+0.000852 0.003443 -0.002369 0.000968 0.000135 -0.000079 
+0.001476 -0.001680 0.000689 0.001683 0.000149 0.002190 
+0.000214 0.000361 0.004024 -0.002330 -0.002129 0.002280 
+-0.002992 -0.003439 0.000923 -0.002506 -0.002790 0.002648 
+-0.002841 -0.001978 -0.002483 0.002327 -0.000462 -0.003949 
+0.006659 0.000091 -0.002564 0.006922 -0.001087 -0.000197 
+0.004701 -0.000896 0.000970 0.001405 -0.001741 -0.002077 
+0.000025 0.002657 -0.002682 -0.002105 0.001353 0.000000 
+-0.001579 -0.000786 0.000236 0.000018 -0.001451 0.001626 
+0.000167 -0.000816 0.001629 -0.001818 0.000465 0.001738 
+-0.002835 0.002671 0.001781 -0.001705 0.002221 -0.000962 
+0.002248 0.002118 -0.001926 0.005547 0.002344 -0.002422 
+0.000624 0.002157 -0.003022 0.000621 0.003665 0.001777 
+-0.000173 0.002102 0.000445 -0.001890 0.000237 -0.000300 
+-0.000786 0.000502 -0.001874 -0.000316 0.001190 -0.000483 
+0.000465 0.000386 0.000657 -0.000893 -0.003345 -0.000224 
+-0.004980 -0.009912 -0.003037 -0.000441 -0.002005 -0.005258 
+-0.001536 0.008688 -0.005188 -0.003341 0.005703 0.000733 
+0.000170 0.001802 0.002060 -0.001223 0.000816 0.002650 
+-0.001397 0.001736 0.002287 0.004291 0.003087 -0.000930 
+0.005481 0.002983 -0.002010 -0.000726 0.000276 0.000227 
+-0.005394 -0.001337 -0.000245 -0.003225 -0.002146 -0.000708 
+0.003502 -0.002566 -0.002026 0.007570 -0.002892 -0.002748 
+0.006964 -0.003512 -0.002943 0.005732 -0.003525 -0.003258 
+0.003991 -0.001786 -0.008716 -0.000633 -0.004593 -0.001900 
+-0.002840 -0.004295 -0.000720 -0.006846 -0.005243 0.000321 
+-0.006418 -0.005410 0.005410 -0.000258 -0.000304 0.002899 
+0.002023 -0.002023 -0.001450 0.000091 0.000726 -0.004359 
+0.001430 -0.003140 -0.001766 0.003035 -0.001133 -0.000677 
+0.001907 -0.000380 0.001289 0.000715 -0.000429 0.000372 
+0.000515 0.006192 0.002778 -0.001982 0.007442 0.005441 
+-0.002436 0.003103 0.005101 -0.001563 0.000359 0.001157 
+-0.004148 -0.000281 0.000055 -0.005645 0.010625 0.002075 
+-0.003359 0.015387 -0.003002 -0.005719 0.014129 -0.003775 
+-0.011714 0.014754 0.000406 -0.014094 0.015311 0.002634 
+-0.008892 0.014931 0.009948 -0.007935 0.007997 0.005581 
+-0.003447 0.003567 -0.000038 0.001441 0.001053 -0.001617 
+-0.002268 -0.000890 -0.003698 0.000270 0.001059 0.001016 
+0.002486 0.005914 -0.000336 0.000504 0.006993 -0.001926 
+-0.001141 0.006953 -0.003422 0.001027 0.004778 -0.003435 
+0.003398 -0.000741 -0.001775 0.004296 -0.001858 -0.002786 
+-0.000162 -0.000270 -0.001103 0.000317 0.001742 -0.000472 
+0.001782 0.003584 -0.000921 0.001345 0.001345 -0.000759 
+-0.000258 -0.000184 -0.000909 0.001098 0.000513 -0.002484 
+0.003858 0.003556 -0.005068 0.004180 0.004878 -0.006275 
+0.001556 0.001867 -0.005600 -0.001238 -0.000647 -0.002645 
+-0.000180 -0.000898 -0.000180 0.001205 -0.000681 -0.000483 
+0.002547 -0.000775 -0.000654 0.001980 0.001116 -0.001364 
+0.002279 0.002583 -0.004107 0.003719 0.005555 -0.004202 
+0.001697 0.004983 -0.004215 0.001533 0.000489 -0.001958 
+-0.000074 -0.000074 -0.001111 0.000383 0.001806 -0.002012 
+0.001244 0.004822 -0.000900 0.003183 0.004000 -0.000282 
+-0.000009 0.001678 0.000113 0.000155 0.000378 0.000239 
+-0.000658 0.001468 -0.000710 -0.000632 0.003496 -0.001417 
+0.001824 0.000144 0.002235 0.001931 -0.002767 0.006617 
+0.000561 0.001372 0.001088 0.000692 0.003824 0.000964 
+0.003534 0.002380 0.000402 -0.001824 -0.000286 0.002255 
+-0.000676 0.002322 -0.000760 0.007674 0.001641 -0.004685 
+0.009650 0.002077 -0.003630 0.005258 -0.001252 -0.001181 
+0.001254 -0.002181 -0.001433 0.000655 -0.001801 -0.000907 
+0.001319 -0.003143 -0.001243 -0.000261 -0.007125 -0.002277 
+-0.004116 -0.009270 -0.002846 -0.007135 -0.006799 -0.001242 
+-0.004551 -0.002936 0.001150 -0.000024 0.001580 -0.003217 
+0.001212 0.002597 0.000944 0.004167 0.002418 -0.000037 
+0.003785 0.004802 -0.004512 0.000949 0.000012 -0.002578 
+-0.000532 0.000204 0.000909 -0.001281 0.000258 0.003314 
+-0.000758 0.000815 -0.003407 0.001299 -0.000723 -0.004541 
+-0.001799 0.000332 -0.001298 -0.002345 -0.001639 -0.003389 
+-0.004876 0.001025 -0.004107 -0.007335 0.002740 -0.004183 
+-0.005149 0.000351 -0.003851 0.000680 -0.001957 -0.005773 
+-0.002276 0.008754 -0.007879 -0.008943 0.018126 -0.008247 
+-0.008489 0.023626 -0.004575 -0.008621 0.021174 0.001736 
+-0.008934 0.016509 0.004851 -0.008728 0.012943 0.004961 
+-0.001613 0.009477 0.006689 -0.002480 0.000573 0.007114 
+0.000988 0.000984 -0.000371 -0.004909 0.003337 -0.003820 
+-0.003326 0.003928 0.001098 0.002280 0.006602 0.001293 
+-0.000620 0.003291 0.001402 0.000683 0.000765 0.000847 
+0.001097 0.003671 -0.003298 0.004371 0.005846 -0.003747 
+0.005737 0.001154 -0.001427 0.002127 0.004463 -0.005382 
+-0.001782 0.005934 -0.003621 -0.001818 0.005477 -0.000828 
+0.000242 0.004469 -0.001836 0.000319 0.000159 -0.004275 
+-0.001860 0.000503 -0.003545 0.001638 -0.001348 -0.000546 
+0.002429 -0.001867 -0.004483 0.001127 0.000251 -0.000276 
+-0.001325 0.000534 0.000338 -0.002170 0.002506 0.000168 
+-0.001214 0.002507 -0.000509 -0.001057 0.001860 -0.005010 
+-0.001479 0.004006 -0.006122 0.004398 0.004595 -0.006193 
+0.003411 0.000977 -0.004192 0.002593 0.001723 -0.003348 
+0.005381 0.004308 -0.004708 0.005800 0.003830 0.002407 
+0.000880 0.000570 0.000967 -0.000363 -0.000444 -0.001846 
+-0.003039 -0.004227 -0.000050 -0.004565 -0.003840 0.000251 
+-0.002648 -0.000980 0.004156 0.000221 -0.001377 0.001504 
+-0.002363 -0.000838 -0.002070 -0.005370 0.000973 -0.005047 
+-0.005911 0.005847 -0.009443 0.003770 -0.001896 0.000371 
+0.001244 0.002792 0.001976 0.001637 0.000693 0.003024 
+0.000585 0.002125 -0.000613 0.003955 0.004201 -0.005143 
+0.007454 0.002991 -0.008432 0.006101 -0.003620 0.000120 
+-0.000320 -0.000182 -0.000150 -0.001622 0.000916 0.000857 
+-0.001535 0.005733 0.003935 0.001021 0.004912 0.001837 
+0.004301 -0.002488 -0.001373 0.009943 -0.005334 -0.003052 
+0.008408 -0.002126 -0.002358 -0.000977 0.000545 0.000658 
+-0.005516 -0.001574 0.004029 -0.000887 -0.002222 0.002160 
+-0.000700 -0.001047 -0.002622 0.000823 -0.001201 -0.001360 
+-0.000110 -0.000441 -0.001377 0.000182 -0.001800 -0.000260 
+-0.002714 -0.002968 -0.001263 0.000992 -0.000508 0.001939 
+0.000054 0.000537 -0.000168 0.002060 0.000094 -0.000353 
+0.002474 0.000010 0.000861 0.000139 0.002065 0.002021 
+-0.005139 0.006367 -0.000759 -0.006061 0.005874 -0.004210 
+-0.001448 -0.005260 -0.003147 0.001570 -0.005038 0.002781 
+-0.006442 0.011837 -0.001230 -0.015425 0.016551 -0.008494 
+-0.010255 0.026444 -0.005853 -0.012104 0.017495 0.002114 
+-0.006824 0.008375 0.004326 -0.001525 0.004030 0.003628 
+0.000796 0.000048 -0.000811 0.003493 0.003512 -0.003488 
+0.005207 0.002804 -0.003405 0.000722 0.000539 0.001002 
+-0.001805 0.004433 0.000247 -0.002408 0.002504 0.001421 
+-0.000234 0.000262 0.000454 0.000834 -0.000208 -0.000315 
+-0.000143 -0.000625 0.000825 0.000075 -0.000448 -0.000224 
+0.002823 -0.002353 0.002137 0.004532 -0.000331 0.001370 
+0.001346 0.002268 -0.000029 0.001044 0.002356 -0.001342 
+-0.001009 -0.000305 0.000399 -0.002637 0.000387 -0.001476 
+-0.000488 0.000617 -0.001894 0.000032 -0.000111 0.000270 
+0.000502 -0.001261 0.001852 0.001232 -0.000995 0.001207 
+0.001072 -0.000917 -0.000395 0.000228 -0.001320 -0.001371 
+-0.000822 -0.000869 -0.000960 0.000234 0.003594 0.000000 
+-0.002050 0.002700 0.001000 -0.001582 0.004289 0.002225 
+-0.001968 0.002624 0.001968 0.003442 0.005251 -0.002392 
+0.006662 0.001860 -0.001936 -0.000247 -0.002336 -0.004211 
+-0.003259 0.005281 -0.005843 0.000518 0.004003 -0.001248 
+0.001366 -0.001831 -0.003594 -0.002294 -0.003277 -0.002131 
+-0.002614 -0.003060 0.001968 -0.000711 -0.004139 0.001455 
+0.000172 -0.002650 0.001281 0.000303 0.001204 0.000304 
+-0.002629 0.007816 -0.000654 -0.000754 0.014255 -0.006269 
+-0.004120 0.007771 -0.004375 -0.003400 0.001893 -0.003681 
+-0.000424 0.001990 -0.000688 0.007121 0.000229 -0.004699 
+0.010084 -0.002402 -0.005259 0.008846 -0.002256 -0.004513 
+0.006149 0.003994 -0.001918 0.004686 0.006288 0.001592 
+0.012890 0.003153 0.002138 0.013637 0.001579 -0.000917 
+0.005487 0.001193 0.000406 -0.005074 -0.006604 -0.002380 
+-0.004670 -0.012587 -0.005334 0.000576 -0.004096 -0.003386 
+-0.001179 0.000562 0.001735 -0.002863 0.001322 0.003114 
+-0.000258 0.001765 0.000253 -0.000945 0.003251 -0.003001 
+0.000435 0.002102 -0.001762 0.000739 -0.003045 0.004228 
+0.001186 0.001522 0.005415 0.000128 -0.000628 -0.000067 
+0.002356 0.004460 0.002117 0.001639 -0.000608 0.000921 
+0.000074 -0.001571 -0.001146 -0.004192 -0.000569 -0.001414 
+-0.003008 0.001008 -0.000295 0.000251 -0.000849 -0.000187 
+0.002513 0.000555 0.001370 -0.001017 0.003139 0.003396 
+-0.007821 0.020333 -0.003437 0.000477 0.031374 -0.006455 
+-0.002071 0.029214 0.001277 -0.000223 0.023338 -0.002292 
+0.004671 0.013071 -0.004187 0.004313 0.004736 -0.004867 
+0.001515 0.000663 -0.003684 -0.004161 0.001093 -0.000317 
+-0.004672 -0.001032 0.001295 0.000037 -0.001029 0.000021 
+-0.000791 -0.001043 0.001043 -0.000920 0.002775 0.001246 
+0.001779 0.005954 0.001525 0.004194 0.005960 -0.000353 
+0.003264 0.005209 0.002934 0.001163 0.002918 0.002913 
+-0.000995 0.001135 -0.000264 0.000729 -0.000308 -0.001065 
+-0.000470 0.001441 -0.005716 0.000438 0.003469 -0.002816 
+0.003419 0.000706 -0.001007 0.002577 -0.001569 0.000135 
+-0.000966 -0.000665 -0.001903 -0.002587 -0.002220 -0.002139 
+-0.001015 -0.001427 -0.001300 -0.000930 0.000500 0.000224 
+-0.001602 0.003131 0.000340 -0.002217 0.000609 -0.000458 
+-0.002236 -0.002470 0.000352 -0.000525 -0.001050 0.000525 
+0.001255 0.002720 -0.001883 0.001210 -0.000403 -0.001935 
+0.002742 0.003613 0.001806 0.000726 0.000555 0.000231 
+-0.002611 -0.002802 -0.001775 -0.005309 -0.007078 0.000080 
+-0.000311 -0.006016 -0.002177 0.001622 -0.001899 -0.001939 
+0.003061 0.000585 -0.001523 0.000704 0.001176 0.001179 
+-0.001000 -0.001958 0.001093 -0.001507 0.002037 0.004539 
+0.001958 0.006221 0.000774 0.001862 0.011697 -0.002977 
+-0.001491 0.011132 -0.004789 0.002132 0.003356 -0.009161 
+-0.002483 0.003119 -0.004205 -0.002116 0.004251 -0.002318 
+-0.000781 0.002634 -0.000016 0.003416 -0.000190 0.000314 
+0.003943 -0.000138 -0.000009 0.003066 -0.001545 -0.001594 
+0.003803 -0.001356 -0.009324 0.002227 0.004109 -0.009779 
+-0.001741 -0.000356 0.000062 -0.011264 -0.006716 0.006623 
+-0.010188 -0.003054 -0.001246 -0.003528 0.002210 -0.000332 
+-0.000396 0.001976 0.000685 -0.009845 -0.000208 0.006317 
+-0.006977 -0.003276 0.007412 -0.003423 -0.001550 0.003034 
+-0.000092 0.001177 0.000327 0.002553 0.003688 0.000000 
+0.003403 0.003376 -0.004315 0.000359 0.000006 -0.000317 
+-0.004296 -0.000047 0.000918 -0.001592 0.002583 0.001455 
+-0.001410 0.004329 -0.001089 0.001126 0.001285 0.000589 
+0.001065 0.003362 0.001156 0.002267 0.007070 0.001518 
+0.001958 0.007249 -0.002646 0.000002 0.003536 -0.000706 
+0.002387 0.000042 -0.003252 0.004673 0.004978 -0.002040 
+0.005670 0.009477 -0.002385 0.006934 0.006570 -0.002426 
+0.002142 0.004035 -0.003792 -0.001457 0.003814 -0.002271 
+-0.000335 0.004454 -0.001783 0.001540 0.003294 0.000527 
+-0.000430 -0.000829 0.005917 -0.010166 -0.001886 0.006616 
+-0.008339 -0.010042 0.001671 0.001700 -0.004363 0.009972 
+-0.002287 -0.003124 -0.003275 -0.002451 -0.001250 -0.007861 
+-0.070523 0.020634 0.003003 -0.088971 -0.060275 -0.027597 
+-0.042929 -0.081214 0.014337 0.065892 0.041231 -0.056323 
+0.076335 -0.001290 -0.020520 0.070303 0.044924 -0.064470 
+0.026622 -0.004437 -0.050833 0.035039 -0.002650 -0.074348 
+0.006429 -0.006429 -0.090000 0.032718 0.045575 -0.104390 
+-0.010348 0.017246 -0.051818 -0.003971 0.004167 0.015882 
+-0.020612 0.034490 -0.000408 -0.020714 -0.020714 0.108571 
+0.078462 0.017500 -0.052308 -0.116601 -0.063333 0.029150 
+-0.122712 0.021601 0.108235 0.089357 0.069277 0.043373 
+0.010278 -0.022778 -0.035278 -0.019637 -0.048639 -0.006848 
+0.011050 0.009269 0.009505 0.029002 0.017279 0.007788 
+0.013355 0.014477 -0.006942 0.029977 -0.029055 -0.016603 
+0.044000 -0.027306 -0.019505 0.007034 -0.001526 0.003738 
+0.071400 0.088760 0.022680 -0.003400 0.075800 -0.031000 
+-0.085556 0.035000 0.011667 0.047333 0.026867 -0.045733 
+-0.003697 -0.015541 -0.012095 -0.060588 0.005986 -0.023945 
+-0.002492 0.010066 -0.003638 0.003115 0.010526 -0.008386 
+0.008099 0.008488 -0.011703 0.006291 0.002968 -0.003872 
+0.006386 0.006917 0.006648 0.013834 0.023304 0.002647 
+0.005736 -0.007856 -0.002513 0.010588 -0.002647 -0.005667 
+0.003674 0.017803 -0.006780 -0.015648 0.012644 -0.009065 
+-0.009701 -0.010396 -0.002122 -0.006571 -0.012458 0.010615 
+-0.020976 -0.018580 0.033563 -0.017521 0.009063 0.023965 
+-0.026735 0.002500 -0.005941 -0.010000 0.014680 -0.017615 
+0.004554 0.013417 -0.021877 0.012965 0.013971 -0.023799 
+0.002284 0.001382 -0.002584 -0.011379 -0.009891 0.015580 
+-0.016578 -0.013972 0.018391 -0.011134 -0.006741 0.007470 
+-0.002215 0.008300 -0.006836 -0.000834 0.010407 -0.008345 
+0.000198 0.001890 0.000397 -0.002104 -0.000465 -0.001736 
+-0.002826 -0.000978 -0.000978 0.000914 0.000716 -0.000395 
+0.002143 0.006201 -0.000639 0.006275 0.006970 -0.002091 
+0.006016 0.006016 -0.002734 0.004120 0.004453 -0.003103 
+0.002982 0.004813 0.000684 -0.002166 0.007506 -0.000448 
+-0.000352 0.003142 0.000599 0.000370 0.000522 -0.003023 
+0.002742 0.001604 -0.004153 0.002995 0.004607 -0.000801 
+0.000312 0.002858 0.005452 -0.004360 0.000162 0.005835 
+-0.003138 -0.004671 -0.000146 0.001038 -0.008068 -0.001184 
+0.001049 -0.010631 0.004814 0.014528 -0.038396 0.023522 
+-0.114713 -0.072414 0.049828 -0.049214 -0.112114 0.071057 
+0.019667 -0.059000 0.032500 0.006205 -0.029282 0.001487 
+0.009884 -0.028866 -0.003796 0.011449 -0.006533 0.005185 
+-0.010260 0.022857 -0.014935 0.032571 0.024857 0.004286 
+0.054677 -0.026290 -0.020194 0.044156 -0.020877 -0.026234 
+-0.015500 -0.031000 0.049167 0.037525 -0.003984 -0.069738 
+-0.070556 -0.025556 -0.115556 0.009954 0.006481 -0.012546 
+0.096145 -0.013345 -0.068909 0.009228 0.011142 -0.064938 
+-0.018333 -0.016167 -0.032333 0.039167 0.000000 -0.001667 
+0.016167 0.032333 -0.049167 0.101667 0.000000 -0.053333 
+0.000111 0.025056 -0.034722 0.001336 0.015522 -0.002392 
+0.011633 0.011986 -0.011381 0.036039 0.065427 0.006961 
+0.065455 -0.065821 -0.015487 0.095287 0.005006 0.011848 
+0.088000 -0.031059 -0.124235 0.012667 -0.006833 0.008833 
+-0.155462 0.042228 0.032636 -0.003333 0.011111 0.025556 
+-0.008182 -0.040909 0.034545 -0.039451 0.027637 -0.007802 
+-0.005742 0.040310 0.017890 -0.006585 0.005499 0.012208 
+-0.001244 -0.002328 0.003718 0.000559 -0.000597 0.001001 
+0.003628 0.002689 -0.002206 0.013618 0.001269 -0.011779 
+0.015715 0.001212 -0.008037 0.008404 0.002451 0.003314 
+0.004108 0.018314 0.007139 0.001887 0.058038 -0.019009 
+-0.010989 -0.005560 0.001319 -0.004726 -0.014265 0.020491 
+0.011118 -0.003646 0.000850 0.007334 0.004715 -0.013162 
+-0.001547 0.003113 -0.011160 -0.000925 0.001076 -0.003588 
+0.003231 0.000143 -0.004109 0.007317 0.000345 -0.006531 
+0.006317 0.000619 -0.005527 0.001523 0.000267 -0.001169 
+-0.002047 -0.000866 0.001715 -0.000522 0.000080 -0.000155 
+0.002950 0.004363 -0.004709 0.001438 0.006654 -0.006451 
+-0.002525 0.002327 -0.002434 -0.004476 0.002310 -0.002167 
+0.000395 0.004348 -0.001251 -0.001261 0.002129 0.000137 
+-0.000849 -0.001410 0.001491 -0.000293 -0.000253 0.002507 
+-0.002400 0.001903 0.000592 -0.002559 0.001714 -0.002488 
+-0.000489 0.001245 -0.003205 0.001640 0.002378 -0.004015 
+0.004119 0.004540 -0.005140 0.002255 0.008172 -0.001362 
+0.000957 -0.001300 -0.002669 0.000145 -0.000380 -0.002441 
+-0.001653 -0.001417 -0.000234 -0.000505 -0.001519 -0.001904 
+0.004657 0.002674 -0.008761 0.013668 0.014176 -0.019929 
+0.011938 0.039945 -0.041002 0.011529 0.037839 -0.041879 
+0.027873 -0.061937 0.031587 0.000519 -0.065481 0.026296 
+-0.007424 -0.000303 -0.006212 0.000000 0.000000 0.000000 
+-0.039509 0.019189 -0.034988 -0.037305 0.003391 -0.002500 
+-0.001500 -0.023300 0.015600 -0.007564 -0.016179 -0.010821 
+0.002952 -0.053190 -0.015762 0.010343 -0.047219 0.003238 
+0.005691 -0.048476 0.059898 0.091950 -0.069750 -0.006350 
+0.082963 -0.037685 0.105463 0.067544 -0.135263 -0.022456 
+-0.059195 -0.049329 -0.029091 -0.015659 -0.015934 -0.014835 
+-0.003509 0.002386 -0.017825 -0.012797 0.012797 -0.038392 
+0.028647 -0.028188 -0.047899 0.088079 -0.025025 0.025271 
+0.000606 0.005633 -0.012228 0.001711 0.008740 -0.004169 
+0.009599 0.013159 -0.002543 0.032492 0.058600 0.006827 
+0.035722 0.110049 0.032265 0.033360 0.018938 0.016170 
+-0.024880 -0.094840 -0.045400 0.109663 -0.120449 -0.019101 
+0.133626 -0.062454 -0.005971 -0.129088 -0.152409 0.240547 
+-0.002409 0.001756 0.025152 0.013571 0.031429 -0.013571 
+-0.010944 -0.004406 0.015006 -0.001629 -0.025138 0.019715 
+-0.000299 -0.005837 0.002398 0.000877 0.000925 0.001412 
+-0.000293 0.003651 -0.002024 0.004924 -0.000856 -0.004983 
+0.005364 0.005463 -0.006446 0.001074 0.005038 0.002893 
+0.003558 0.005194 0.022008 -0.006632 0.039091 0.043106 
+-0.010236 0.021588 -0.006840 0.000373 -0.001564 0.004906 
+0.006162 -0.004364 0.004868 0.005764 -0.003639 -0.001449 
+0.001731 -0.001055 -0.000005 0.002031 -0.000380 -0.002883 
+0.004116 -0.000057 -0.007598 0.002879 0.000749 -0.009201 
+0.000411 0.001461 -0.006497 0.000380 0.000901 -0.003353 
+0.003193 0.001439 -0.001692 0.002972 0.002216 -0.000676 
+0.001307 0.001470 -0.001336 0.000162 0.001816 -0.003180 
+-0.000874 0.004757 0.000641 -0.000577 0.003043 -0.001828 
+0.002319 0.004709 -0.004679 0.005618 0.006258 -0.005565 
+0.005000 0.003548 -0.000484 -0.000663 -0.000665 -0.000641 
+-0.005718 -0.003969 0.001445 -0.006139 -0.002082 0.000933 
+-0.000994 -0.000377 -0.000943 0.001733 0.001851 -0.001418 
+0.001389 0.003210 -0.003262 -0.002653 0.003189 -0.000574 
+-0.000478 -0.001266 -0.001284 0.000147 -0.000294 -0.002844 
+0.002478 -0.002362 -0.002391 0.005576 0.000074 -0.007176 
+0.011994 0.008257 -0.014720 0.018587 0.011938 -0.021396 
+0.066704 0.033285 -0.066403 0.001041 0.000253 -0.001039 
+-0.000550 0.000045 -0.000804 -0.033709 0.009676 -0.043854 
+-0.107737 0.076074 -0.097321 -0.045113 -0.021450 -0.030381 
+-0.046057 -0.037679 -0.038136 0.380000 0.000000 -0.135000 
+0.020278 0.072778 -0.003611 -0.012346 -0.012508 0.014364 
+-0.057817 -0.067824 0.060995 -0.054699 -0.029067 0.118383 
+0.021805 -0.022634 -0.076732 0.035396 0.010566 0.055736 
+0.029930 -0.017483 0.045734 0.014736 0.023880 0.002368 
+-0.012000 -0.069655 0.027862 -0.011300 -0.016023 -0.000897 
+0.000539 -0.009252 0.020930 -0.003344 -0.001351 0.024760 
+-0.017832 0.031049 0.043147 -0.000079 -0.069286 0.034762 
+0.005878 -0.098138 -0.047793 -0.015237 -0.046532 -0.004394 
+-0.011600 -0.007961 0.017249 -0.002315 0.009340 -0.018999 
+0.022050 0.044181 0.031489 0.035633 -0.108966 0.033369 
+0.051667 0.052500 -0.017500 0.116053 0.103509 -0.064825 
+0.003600 -0.007200 -0.036000 -0.003094 0.009762 -0.006079 
+-0.003385 0.014962 -0.031346 0.026478 0.004051 -0.075285 
+-0.000939 0.016128 -0.013103 0.000350 0.009727 -0.006752 
+0.011701 0.009944 -0.008947 0.006122 -0.003979 -0.004851 
+0.003522 0.000537 -0.006148 -0.002621 0.003784 -0.006125 
+0.000694 0.005547 -0.008527 -0.005734 0.001911 -0.010785 
+-0.020037 -0.006037 -0.017721 -0.041268 -0.016781 -0.001813 
+-0.021962 -0.011290 0.032919 -0.009056 -0.004368 0.031472 
+-0.001069 -0.001128 0.009583 0.000116 -0.000139 0.000135 
+-0.000053 0.001088 -0.002445 0.000079 0.002096 -0.003808 
+-0.000524 -0.001461 -0.005153 -0.004434 -0.003010 -0.004329 
+-0.002438 -0.001897 -0.003882 -0.000057 0.000215 -0.002137 
+-0.000153 0.000073 -0.000352 -0.000320 0.000112 0.001088 
+-0.001867 -0.001178 0.001915 -0.002443 -0.000395 0.000056 
+-0.000095 0.005708 0.001554 0.003434 0.008434 -0.005934 
+0.007501 0.002610 -0.005383 0.005584 0.001893 0.000096 
+0.001378 0.002161 0.000979 0.001745 0.003740 -0.001396 
+0.004722 0.004321 -0.006000 0.004013 0.005986 -0.004893 
+-0.000433 0.002886 -0.002166 0.001087 0.000954 -0.000381 
+0.000577 0.000373 -0.001216 0.000240 0.000081 -0.000586 
+-0.002382 -0.002539 0.001878 -0.004897 -0.000653 0.002246 
+0.003905 0.010687 -0.005045 -0.001399 0.032421 -0.011362 
+0.001614 -0.010059 0.008129 0.001490 -0.007234 0.021586 
+-0.775424 -2.360169 2.351695 -0.865000 -2.900000 2.780000 
+-0.020239 -0.024834 0.033864 -0.030616 -0.058822 0.043880 
+-0.053944 -0.015603 0.023640 -0.003545 0.001655 0.055714 
+-0.021290 0.001988 0.025511 0.004806 0.001302 0.021428 
+0.114805 0.120023 -0.040000 0.143929 -0.046786 0.142143 
+-0.031261 0.024412 0.017269 -0.087931 -0.059287 -0.109248 
+-0.045101 -0.017901 -0.017282 -0.064575 -0.016863 -0.005686 
+-0.101020 0.091224 -0.052041 -0.008462 0.009231 -0.003846 
+0.042896 0.015488 0.063165 -0.099000 0.033000 -0.004000 
+-0.043503 -0.031952 0.040428 0.052457 -0.016182 0.009558 
+-0.060707 -0.108424 0.085272 0.009722 -0.039778 -0.030944 
+0.009750 -0.001752 -0.028184 0.003684 0.003684 -0.035263 
+0.031062 0.038613 -0.087303 -0.035508 -0.053970 0.051130 
+-0.044352 -0.051481 -0.014259 -0.010206 -0.002916 0.020000 
+-0.015829 0.001925 0.024171 -0.009151 0.005633 0.026929 
+0.000148 -0.017926 -0.002519 -0.005993 -0.013185 -0.057000 
+0.043683 -0.014686 -0.031161 0.014461 -0.014693 -0.010169 
+-0.001411 -0.010072 0.009613 -0.000379 0.010361 -0.000576 
+0.000079 0.008538 0.004214 -0.006878 0.000164 -0.000573 
+-0.005210 -0.000772 0.007489 -0.001494 0.002401 -0.000554 
+0.003071 0.008486 -0.005935 -0.001213 0.010490 -0.007255 
+-0.006358 0.007828 -0.012070 -0.000289 0.005364 -0.007992 
+-0.000103 -0.001354 0.002801 -0.001451 -0.002063 0.005727 
+-0.001583 -0.001182 0.004362 -0.000954 0.000638 0.000649 
+0.001514 0.000711 0.000155 -0.001137 0.000365 -0.004084 
+-0.000996 0.001151 -0.000582 -0.002592 -0.001712 -0.000062 
+-0.002141 -0.001115 0.000937 -0.001863 -0.000230 0.002669 
+-0.002025 0.001414 0.003735 -0.001980 0.001265 0.002708 
+0.001362 -0.000356 0.000838 0.004772 0.000510 -0.003576 
+-0.002171 0.000775 0.000543 0.001724 0.002786 -0.004109 
+-0.001297 0.004352 0.000440 0.001553 0.002358 0.001287 
+-0.001237 0.000168 0.000517 -0.000841 0.002338 0.000805 
+-0.001286 0.006942 0.002040 -0.001615 0.011406 -0.002261 
+0.002677 0.005120 -0.001479 0.001187 0.001149 -0.000951 
+-0.000133 0.000782 0.000462 -0.003084 0.001084 0.004814 
+-0.006089 -0.000142 0.003410 0.000958 -0.009067 -0.001864 
+0.010220 -0.003096 -0.003642 0.000012 -0.002651 -0.006252 
+-0.001062 -0.010738 0.019285 -1.533582 -3.149254 2.152985 
+-1.515738 -3.341404 2.084746 -1.636804 -3.474576 2.092010 
+-1.821138 -3.662602 2.126016 -0.020119 -0.056506 0.024516 
+-0.000489 -0.130537 0.016997 -0.022358 -0.011442 -0.016125 
+-0.023619 -0.044636 0.019770 -0.023111 -0.019939 0.027371 
+-0.004163 -0.003561 -0.000793 0.043030 0.025734 -0.035705 
+-0.037153 0.005715 -0.002142 0.160314 -0.057255 0.002000 
+0.040322 -0.071919 0.002267 -0.031210 -0.024391 -0.025107 
+-0.018703 -0.030537 -0.010412 -0.013385 -0.114000 0.020077 
+0.035396 -0.037576 0.039133 -0.011746 -0.011841 0.023873 
+0.012231 -0.049504 0.020579 -0.059268 -0.108462 0.006585 
+-0.098056 -0.015556 0.087222 -0.078757 0.030751 0.038265 
+-0.005611 0.007181 0.007361 -0.008876 0.011268 -0.008732 
+0.029528 0.016453 -0.014249 -0.059843 -0.128414 0.056477 
+-0.009305 -0.007059 0.000321 0.005520 -0.008536 0.015594 
+0.018528 -0.017573 0.022793 -0.027114 -0.047736 0.019179 
+-0.039537 -0.054992 -0.022376 -0.014000 0.052000 0.000000 
+-0.065184 -0.067541 -0.027247 -0.014279 -0.019459 0.013761 
+-0.002625 0.008342 -0.000086 0.002527 0.002465 -0.002999 
+0.000916 -0.005084 0.000415 -0.001147 -0.005957 0.001786 
+0.002328 0.000930 -0.001291 0.005884 0.005485 -0.002018 
+0.000831 0.002674 0.000735 -0.000207 -0.002172 -0.000247 
+0.006341 0.000437 0.000437 0.002623 -0.002589 0.003141 
+0.000862 -0.001695 0.003717 0.002058 -0.000906 -0.000324 
+0.004357 0.005073 -0.003241 0.001334 0.000901 0.001059 
+-0.001258 -0.000939 -0.001538 -0.003204 0.000414 -0.001516 
+-0.003361 0.000126 0.000378 -0.000856 -0.001475 0.001566 
+-0.000313 0.000003 0.002805 -0.004260 0.000674 0.004139 
+-0.004157 -0.001600 0.003311 0.000304 0.000198 0.000111 
+0.001430 0.003437 -0.002440 0.002151 0.002490 -0.005775 
+-0.005666 -0.001128 -0.001055 -0.000928 0.001163 -0.001846 
+-0.001348 0.006822 -0.002021 0.004614 -0.000468 0.000717 
+0.007635 0.002374 -0.007952 0.002736 0.000221 0.000553 
+0.000310 -0.000397 -0.000051 -0.003054 0.002729 0.000049 
+-0.004167 -0.000524 -0.000282 -0.001735 -0.004320 0.001176 
+-0.000178 -0.004130 -0.000099 -0.000631 -0.000524 -0.000417 
+-0.002231 -0.003439 -0.000247 0.007214 -0.013962 -0.005889 
+0.011445 0.000996 0.001104 -0.004138 0.016943 0.007281 
+-2.883333 -1.366667 3.077778 -2.400722 -3.306859 2.357401 
+-1.853333 -4.056000 1.157333 -1.860759 -4.306329 0.594937 
+-2.017007 -4.027211 0.176871 -0.022199 -0.028477 -0.004412 
+-0.023851 -0.050115 0.000972 -0.048941 0.062565 -0.022758 
+-0.006431 -0.022936 -0.001652 -0.027292 -0.033261 -0.008599 
+-0.012696 -0.026865 -0.004012 -0.007195 -0.006795 -0.019583 
+-0.015806 -0.024194 -0.019355 -0.026204 -0.025870 0.013769 
+-0.051756 -0.086183 0.008587 -0.044044 -0.059470 0.012903 
+-0.035870 -0.028028 0.007666 -0.006452 -0.012951 -0.021601 
+-0.063099 -0.058837 0.030086 -0.003873 -0.078437 0.008393 
+-0.012973 -0.081208 -0.003950 -0.007037 -0.058519 0.036296 
+-0.023340 0.038204 0.047122 -0.033082 -0.015711 0.038063 
+-0.011736 -0.000992 0.021570 0.012615 0.035718 0.002100 
+-0.025810 -0.132095 -0.008048 -0.011899 -0.052101 0.010964 
+-0.003590 0.041026 0.026667 -0.007062 -0.022117 0.004605 
+-0.061908 -0.019006 -0.007447 0.009474 -0.025263 0.006316 
+0.080576 0.086895 -0.030029 0.015137 0.012596 -0.001932 
+-0.146144 -0.289068 0.103008 -0.002159 0.018613 0.001992 
+-0.003092 0.020224 -0.001812 -0.006254 -0.000456 0.006744 
+-0.007736 -0.006721 0.005941 -0.002459 -0.006394 0.001079 
+0.003555 -0.002721 -0.000900 0.004050 -0.004200 -0.002963 
+-0.000665 -0.006440 -0.000963 -0.001101 0.002131 -0.002058 
+-0.002240 0.001640 -0.001430 -0.003128 0.002452 0.006793 
+0.000824 0.000999 0.007869 -0.005380 -0.002106 0.006383 
+0.000965 -0.000240 -0.003119 0.008730 0.009781 -0.005130 
+0.005964 0.010924 -0.004691 0.001740 0.006682 -0.003577 
+0.001440 0.001062 -0.001618 0.002092 -0.002895 0.000042 
+0.001461 -0.002519 -0.000476 0.000848 -0.000480 -0.001456 
+-0.000272 -0.001409 -0.000148 -0.004627 -0.003023 0.000186 
+-0.006572 -0.004253 0.001791 -0.004724 -0.003150 0.001181 
+-0.003870 -0.001031 0.002324 0.000101 0.001111 0.002677 
+0.002101 0.003428 -0.004311 0.003592 0.003784 -0.009628 
+0.006107 0.000698 -0.006455 0.000190 0.000741 -0.000299 
+0.002635 0.001847 0.000514 -0.000047 0.004697 0.000289 
+-0.002743 0.002538 -0.000170 -0.001474 -0.000238 -0.000821 
+0.003909 -0.006734 -0.001303 0.005281 -0.003125 0.000109 
+0.000971 0.000308 -0.001896 0.007038 -0.002567 -0.006431 
+0.011576 0.019232 -0.004562 -0.000714 0.032737 0.019631 
+-3.302128 -1.438298 4.472341 -2.767647 -2.891176 3.288235 
+-2.182482 -4.214112 1.216545 -1.839002 -5.049887 -0.421769 
+-1.767442 -5.105943 -1.020672 -1.825911 -4.400810 -1.113360 
+-0.013449 -0.037003 -0.019069 -0.025923 0.023935 -0.061221 
+-0.036669 0.109333 -0.007130 -0.043524 -0.040341 -0.017628 
+-0.031954 -0.008030 -0.024147 0.003426 -0.000926 -0.002870 
+-0.007441 -0.014205 -0.000517 -0.049253 -0.009255 0.006031 
+-0.073619 0.014078 0.043405 -0.013914 -0.065738 -0.007938 
+-0.004510 -0.041210 -0.003281 0.008745 0.083711 -0.056211 
+-0.033488 -0.026379 -0.022193 -0.061125 -0.025192 -0.013939 
+-0.057404 -0.006215 -0.009763 -0.000087 -0.000888 0.004967 
+0.025536 -0.001607 0.011429 0.031236 -0.007275 -0.067323 
+-0.093857 -0.046036 0.000179 -0.028444 0.021556 -0.024105 
+0.022418 0.031164 -0.066517 0.045944 0.030629 -0.015455 
+0.058378 0.009730 -0.004615 0.057500 0.012500 0.037500 
+0.012308 -0.061538 -0.073846 -0.078024 -0.004881 0.026810 
+-0.075714 -0.013714 0.027429 0.042664 -0.104753 -0.012063 
+0.053041 0.002865 -0.035848 -0.002706 0.036788 -0.005927 
+0.001011 -0.002738 -0.001575 -0.001670 -0.006322 0.004168 
+-0.013008 -0.002243 0.003328 -0.008451 -0.000428 -0.002717 
+-0.005384 0.001123 -0.001633 -0.008418 -0.001630 0.003938 
+-0.002101 0.000207 0.002902 -0.001133 0.001111 -0.003061 
+0.000499 -0.000346 -0.000603 -0.000748 0.000495 0.001285 
+-0.003497 -0.001554 -0.000085 -0.004646 0.000291 -0.002696 
+0.003383 0.003407 -0.004140 0.001646 0.005757 -0.006090 
+-0.001601 0.004873 -0.003062 0.001161 -0.000551 -0.002635 
+0.001290 -0.000012 -0.000747 0.004261 -0.001269 -0.000816 
+0.008268 -0.000850 0.000113 0.007298 -0.003385 -0.004338 
+0.000999 0.002352 -0.004632 -0.003346 -0.003582 -0.000241 
+-0.006862 -0.001878 0.000307 -0.005176 -0.002218 0.001852 
+0.005063 0.006987 -0.001039 0.002331 0.004403 -0.000480 
+0.000645 -0.001347 -0.003165 -0.000802 0.002166 -0.003862 
+-0.001615 0.001823 -0.005260 -0.001190 -0.000629 -0.001574 
+-0.001720 0.002167 0.001310 -0.001406 0.003656 0.001867 
+0.000828 0.002442 0.001191 0.000309 -0.002834 0.002809 
+0.002631 -0.004832 0.003145 0.000284 -0.001845 0.003159 
+-0.004152 0.002859 0.001267 0.003637 0.001233 -0.001759 
+0.001177 0.003205 0.002069 -0.263636 3.754545 1.581818 
+-2.038461 -1.430769 5.196154 -1.625310 -2.535980 4.359801 
+-1.385744 -3.668763 2.406708 -1.176349 -4.827801 -0.047718 
+-1.120482 -5.604819 -1.489157 -1.329749 -5.336917 -1.992832 
+-1.703704 -4.548148 -2.385185 -0.022501 -0.051152 -0.052886 
+0.047590 0.018496 0.103778 -0.082689 -0.004363 0.008236 
+-0.043621 -0.039928 -0.000077 -0.037710 -0.013786 -0.042980 
+-0.014400 0.020684 0.008395 -0.004233 0.004094 -0.002147 
+-0.005599 -0.001414 -0.003145 -0.017384 -0.024427 -0.023090 
+0.020358 -0.007961 -0.069641 0.067050 0.090761 -0.130016 
+-0.040810 0.046841 -0.022660 0.030588 0.012059 -0.110294 
+-0.011802 -0.000074 -0.043472 -0.012731 -0.003391 0.007983 
+0.023776 0.012276 -0.029496 -0.007895 0.018421 -0.083684 
+-0.060000 -0.012615 0.025231 -0.007113 0.003796 0.006571 
+0.007531 0.008020 0.006439 0.001216 -0.055385 0.002634 
+-0.011812 -0.090523 0.011150 0.008640 0.000642 0.030008 
+0.042078 -0.004276 0.007069 -0.005926 -0.065869 -0.010676 
+-0.075709 -0.038917 -0.047982 0.058700 -0.042389 -0.077328 
+0.121965 0.105000 -0.104541 -0.006079 0.034536 -0.030815 
+0.000309 0.010344 -0.010172 0.002471 0.009059 -0.008869 
+-0.001231 0.004852 -0.001541 -0.005750 -0.000513 -0.000216 
+-0.003838 -0.003671 0.000493 -0.003969 -0.002534 0.004293 
+-0.001065 0.001407 0.006508 0.000322 0.000599 0.006394 
+0.001588 -0.000071 0.004722 0.001793 -0.000106 0.001318 
+0.001576 0.001091 -0.003780 -0.000719 0.002184 -0.003719 
+-0.000776 0.000133 -0.000072 -0.002042 -0.001333 0.002042 
+-0.000510 -0.000873 0.000349 0.002152 0.001290 -0.001168 
+0.000315 0.003409 0.000210 0.003666 0.001700 0.001179 
+0.005156 -0.002084 -0.000139 0.003977 -0.003135 -0.001578 
+0.000918 0.000828 -0.000279 0.000528 0.003637 -0.000602 
+-0.001259 0.004544 0.000231 -0.002311 0.000398 -0.002057 
+-0.003721 0.002206 0.000776 -0.000666 0.003978 -0.002201 
+0.000597 0.004888 -0.003205 0.004590 0.001530 -0.004776 
+0.000282 0.000488 0.000116 -0.004344 0.004397 -0.000038 
+-0.007888 0.003586 0.000557 -0.002112 -0.001293 0.000679 
+-0.001625 0.001035 0.004431 0.002006 -0.003024 0.000324 
+0.004545 -0.002694 -0.003261 0.001769 0.000463 -0.001396 
+-0.002514 0.001505 0.001834 0.001465 0.002999 0.000125 
+-0.007978 0.003281 -0.008184 -0.009376 0.020010 0.017135 
+-1.064655 -1.633621 5.155172 -0.149856 -2.651297 5.002882 
+-0.048843 -3.835476 3.303342 -0.155440 -5.334197 0.194301 
+-0.454294 -6.199446 -2.216067 -1.062937 -5.849650 -3.097902 
+-1.908571 -4.920000 -2.811429 -0.024384 -0.047145 -0.016840 
+-0.018757 -0.069935 0.034273 -0.008595 -0.024669 0.065413 
+-0.022710 -0.033567 -0.003470 -0.027525 -0.069525 -0.006932 
+-0.001994 -0.008372 0.008844 -0.016279 -0.008636 0.011464 
+-0.004643 -0.003065 -0.009342 -0.013669 -0.006162 -0.021289 
+-0.003467 0.020799 -0.009565 0.012326 -0.000739 -0.012202 
+0.029096 0.009658 0.058925 0.070714 0.052605 -0.013151 
+-0.027193 -0.010016 -0.004011 -0.006526 -0.016348 0.042083 
+0.016490 -0.006089 -0.016681 0.018889 -0.008254 -0.063730 
+-0.079243 -0.081250 0.023773 -0.008562 0.035307 0.051085 
+0.007146 -0.002850 -0.001166 -0.074111 0.021937 -0.068577 
+-0.001237 -0.005188 -0.036828 -0.014713 -0.070694 0.038755 
+-0.016686 0.029266 -0.001643 -0.005766 0.090051 0.004150 
+-0.007121 0.014640 -0.003978 0.087287 0.112372 -0.028650 
+0.058638 0.086215 -0.106918 -0.006342 0.013795 -0.021862 
+-0.003716 0.004633 0.000711 0.000057 0.004537 -0.005614 
+0.004963 0.007438 -0.003459 -0.002406 -0.001096 -0.003321 
+0.001071 -0.003682 0.003113 -0.001994 -0.008621 -0.000886 
+0.001705 -0.001664 0.002053 0.000081 0.002023 0.002576 
+-0.000838 0.002978 0.002099 -0.001728 0.000049 0.000988 
+0.000654 0.001701 -0.003231 0.000678 0.000326 -0.003545 
+-0.007208 -0.000477 0.000213 -0.008339 -0.000153 0.003902 
+-0.001148 0.000658 0.000595 0.007254 0.002112 -0.002451 
+0.004518 0.002904 -0.004260 -0.000297 -0.001274 0.000393 
+-0.002909 -0.003412 -0.001906 -0.000114 -0.000330 -0.000350 
+0.003558 0.002478 0.001129 0.000323 0.004177 0.000342 
+-0.000240 0.002340 -0.000661 0.000069 0.001007 -0.001007 
+-0.006728 -0.001756 0.004911 -0.000472 -0.000338 0.000907 
+0.008375 0.007933 -0.000277 0.008928 0.002450 -0.004405 
+-0.000405 -0.001140 -0.002721 -0.004777 -0.002696 0.003703 
+-0.008130 0.004083 0.004339 -0.006429 0.007361 -0.000442 
+-0.000895 0.004024 -0.002860 0.000757 0.000138 -0.001437 
+-0.000291 -0.002324 -0.000515 -0.000033 -0.002845 0.000318 
+-0.001891 0.004796 -0.001380 0.001190 0.009458 -0.003125 
+-0.009729 0.016802 -0.007662 -0.009879 0.015405 0.019091 
+-0.615385 -1.476923 4.548718 0.607273 -2.934546 4.949091 
+0.835570 -4.352349 3.546980 0.546980 -5.973155 0.104027 
+-0.260870 -6.413043 -2.795031 -1.345048 -5.817892 -3.581470 
+-2.195745 -5.080851 -2.889362 -2.564516 -4.604839 -1.193548 
+-0.018598 -0.045805 -0.023946 0.000252 -0.051720 0.021950 
+-0.053927 -0.013603 0.006640 -0.020882 -0.018253 -0.001908 
+0.013162 0.049806 -0.025482 -0.009292 0.002881 -0.011020 
+-0.006689 0.015374 -0.021163 0.035872 -0.029412 0.004828 
+0.032564 -0.026278 0.024887 0.029185 -0.012519 0.017926 
+-0.007864 -0.008273 0.001273 -0.006935 -0.018557 0.026423 
+0.012034 0.046682 -0.077545 0.020874 0.007414 0.005856 
+-0.017593 0.038148 -0.029352 -0.002992 -0.003612 -0.004713 
+0.018891 -0.126154 -0.011335 -0.051308 0.006410 0.137897 
+-0.052208 0.048312 0.039740 -0.104614 0.011897 -0.063794 
+0.009845 -0.018046 -0.041567 -0.045670 -0.042366 -0.030536 
+-0.029227 0.094017 0.049689 0.006812 -0.046362 0.008042 
+0.092222 0.041488 -0.012446 0.004760 0.017561 -0.008221 
+-0.026800 0.006343 0.023236 -0.009456 0.012345 0.006050 
+-0.001698 0.002964 0.003960 0.001846 0.000256 -0.003253 
+-0.000595 -0.000946 -0.001046 -0.001348 0.001982 -0.009570 
+-0.007059 0.000597 0.002806 -0.004340 -0.005533 -0.002018 
+-0.000517 -0.003817 -0.000255 -0.000895 -0.003341 -0.001441 
+-0.000627 -0.002874 -0.001426 -0.001541 -0.000859 0.000126 
+-0.000152 0.003030 -0.001667 0.000682 -0.000727 -0.001455 
+0.000923 -0.001936 -0.004487 -0.001405 0.000494 -0.007804 
+0.000865 0.000055 0.000478 0.004308 -0.002845 -0.002655 
+0.001200 -0.001982 0.001163 -0.001713 -0.001922 -0.003103 
+-0.002324 -0.000064 -0.005131 -0.002375 0.000145 -0.001755 
+-0.000531 0.002611 -0.000463 0.000000 0.001298 0.000534 
+-0.000095 -0.000238 0.000679 0.000024 -0.000859 0.002130 
+-0.002233 0.004848 0.001730 0.000535 0.001544 0.002578 
+0.003529 0.004706 0.000735 0.003849 0.003923 0.003042 
+0.002923 0.000573 -0.000352 -0.001233 -0.002119 0.000306 
+-0.003373 -0.001220 -0.005430 0.002188 0.004128 -0.001872 
+0.007177 0.002497 -0.005825 0.000208 -0.002061 0.000187 
+-0.000089 -0.002148 0.006983 -0.001920 0.002426 0.005066 
+-0.005199 0.010854 -0.006695 -0.001411 0.015373 -0.011590 
+-0.001552 0.013416 -0.011416 -0.002954 0.012722 0.009521 
+-0.202312 -1.167630 3.722543 0.473029 -2.788382 4.485477 
+0.875486 -4.101167 3.587549 0.773279 -5.603239 0.408907 
+-0.035714 -6.014286 -3.057143 -1.129338 -5.372240 -3.905363 
+-1.842105 -4.701755 -3.357895 -2.142857 -4.280220 -2.076923 
+-0.024478 -0.039776 0.001320 -0.038438 -0.040187 -0.028030 
+-0.040253 -0.021489 0.026550 -0.022695 0.004163 -0.000351 
+0.005123 0.006475 -0.022415 0.032066 -0.001520 -0.041467 
+0.082828 -0.004798 -0.042424 -0.022193 -0.060530 0.018251 
+-0.016442 -0.043371 0.008341 0.010092 0.008996 -0.000554 
+0.016488 -0.006868 -0.010314 -0.024128 -0.095181 0.012615 
+0.087335 0.076552 -0.063613 0.048735 0.021823 -0.066839 
+0.005607 0.102234 -0.070311 0.067664 0.024498 -0.007876 
+-0.016486 0.024410 -0.082005 0.013611 -0.013056 0.000556 
+-0.048135 0.006200 0.032634 -0.042974 -0.100679 0.071979 
+-0.070810 -0.062381 -0.004905 0.029648 0.041966 0.000209 
+0.017636 0.131487 -0.029933 -0.011030 0.038758 -0.027100 
+0.052612 0.076786 -0.038336 0.011490 0.012186 -0.010780 
+-0.006587 -0.013403 0.020719 -0.000790 -0.000028 0.010118 
+-0.000869 0.002310 -0.002931 0.004690 -0.000246 -0.001220 
+0.001611 -0.003315 -0.004871 0.004185 0.005057 -0.009488 
+0.002890 0.009211 -0.002784 -0.001520 0.003637 -0.001242 
+-0.000495 -0.002133 -0.000523 -0.000036 -0.002696 -0.000299 
+0.000879 -0.001137 -0.002532 0.003235 -0.000174 -0.000875 
+-0.002672 -0.002739 0.001643 -0.005379 -0.000636 -0.000318 
+0.000395 -0.001343 -0.001522 0.002807 -0.006012 -0.002003 
+0.006565 -0.003399 -0.001748 0.001430 -0.002158 0.000115 
+-0.002574 -0.001691 -0.002574 -0.000272 0.001352 -0.000131 
+0.001045 0.001440 -0.000290 -0.001118 0.000555 0.002726 
+-0.003718 0.002479 0.004972 -0.006566 0.000288 0.002569 
+-0.003897 0.001614 0.001543 -0.001454 0.000494 -0.000629 
+0.003228 0.005530 -0.005293 0.008650 0.000987 -0.003708 
+0.003155 0.000861 0.002247 0.000649 0.004198 0.000649 
+0.000067 0.006090 0.000566 0.002324 0.003470 -0.000816 
+0.001437 -0.000283 -0.004885 -0.000005 -0.003644 -0.001300 
+0.003708 -0.001472 -0.002735 0.002817 0.002894 -0.002739 
+0.001834 0.005038 0.000946 0.001888 0.008944 -0.000365 
+-0.000049 0.014618 -0.010718 0.001979 0.007041 -0.025196 
+0.001455 0.005529 -0.021717 0.001490 0.005550 0.000245 
+-0.004823 -0.006020 0.028062 0.141463 -2.604878 4.073171 
+0.534247 -3.922374 3.753425 0.841837 -5.331633 1.433674 
+0.357488 -5.806763 -2.666667 -0.761194 -5.134328 -4.138060 
+-1.483444 -4.344371 -3.874172 -1.837945 -3.913043 -3.130435 
+-2.070922 -3.872340 -2.028369 -0.032354 -0.041841 0.002925 
+-0.051372 -0.033573 0.017427 -0.031738 -0.023740 0.028420 
+-0.041108 -0.050193 -0.004994 -0.013932 -0.120425 -0.004483 
+0.184218 -0.000272 -0.091565 -0.043149 0.040296 -0.072419 
+0.010271 0.078980 -0.058603 -0.033553 -0.012142 -0.002372 
+-0.037849 -0.022986 -0.002678 -0.008276 -0.011554 0.014486 
+0.032911 0.003629 0.008921 0.031577 -0.010158 0.019555 
+0.055333 0.084000 -0.026667 0.039848 0.062879 -0.046061 
+-0.004127 0.034164 -0.030495 0.039103 -0.013248 0.024145 
+-0.051000 -0.005700 0.077400 -0.068571 0.027857 -0.006429 
+-0.125390 -0.067462 -0.038589 0.025515 0.070788 -0.026667 
+0.022763 0.059637 -0.010992 0.013512 0.050777 -0.030280 
+0.010265 0.031355 -0.019298 0.018718 0.005848 -0.014974 
+-0.001879 -0.006241 0.007219 0.000045 -0.003467 0.003661 
+0.004533 0.001692 -0.004962 -0.003191 -0.002008 -0.006203 
+-0.001781 0.000548 -0.007629 0.002636 0.002226 -0.006422 
+0.006684 0.007180 -0.001462 -0.002348 0.002487 -0.002434 
+-0.001440 0.004322 -0.003498 0.000068 0.003814 -0.001197 
+0.001365 0.003102 -0.002386 0.003930 0.001033 -0.003170 
+0.002245 0.001141 0.000182 -0.001017 -0.003235 0.002686 
+0.001582 -0.004090 -0.000741 -0.002051 -0.005835 -0.000473 
+0.000616 -0.000113 -0.001531 -0.001977 0.001794 -0.003725 
+-0.002823 0.002432 -0.003306 0.000156 0.003164 -0.003164 
+-0.001597 0.000435 -0.004211 -0.000154 0.002182 -0.003244 
+-0.003668 -0.000501 -0.002098 -0.000367 -0.000037 -0.000639 
+-0.000464 -0.000138 -0.000829 0.000078 0.004351 -0.004304 
+0.007667 0.001967 -0.009926 0.010656 0.000794 -0.004136 
+0.000303 -0.000150 -0.000028 -0.003865 0.004684 -0.002554 
+-0.000466 0.005311 -0.002218 0.002953 0.003141 -0.007845 
+0.002146 0.002542 -0.007885 0.004692 0.000546 -0.002399 
+0.002029 0.003135 -0.000185 -0.000167 0.004777 0.001192 
+-0.000047 0.005396 0.001437 0.001610 0.006310 -0.002612 
+0.002165 0.009861 -0.010821 0.000698 0.015081 -0.014150 
+-0.003559 0.010253 -0.010858 0.000633 0.003520 -0.003336 
+-0.000166 -0.005051 0.019579 0.260116 -2.156069 3.300578 
+0.444444 -3.062802 3.140097 0.746032 -3.761905 1.772487 
+0.577381 -4.565476 -1.452381 -0.369458 -4.995074 -4.113300 
+-1.071429 -4.522556 -4.109023 -1.346429 -3.832143 -3.460714 
+-1.380282 -3.309859 -2.652582 -0.019340 -0.017217 -0.011504 
+-0.007625 -0.009418 0.006854 -0.004810 -0.018633 0.015772 
+-0.011546 -0.018002 0.009957 -0.040346 -0.020045 -0.003287 
+0.022768 0.058952 -0.105138 0.201956 0.055402 -0.025505 
+0.059536 0.047942 -0.042986 0.000385 -0.067239 0.051589 
+0.005817 -0.024050 0.019923 -0.005688 0.002637 0.001652 
+0.004814 -0.009441 0.006025 0.000307 0.000746 -0.001831 
+0.024687 0.028251 -0.020865 0.029929 0.013675 -0.005941 
+0.006219 -0.001583 -0.014964 0.000000 0.043000 -0.018000 
+-0.024762 -0.072381 0.040635 -0.123529 -0.086471 -0.024706 
+-0.059234 0.054402 0.014498 -0.007681 0.012783 0.009573 
+0.006401 -0.016875 -0.009144 0.007163 0.005581 -0.005674 
+-0.000929 0.005812 -0.003965 -0.007121 0.006036 0.000728 
+-0.001969 0.002979 0.004821 -0.000905 -0.000012 0.002876 
+-0.007222 -0.000684 -0.001026 -0.003811 0.006173 -0.006554 
+0.000173 0.005064 -0.009329 0.003701 0.002588 -0.010378 
+0.002965 -0.000942 -0.009934 -0.000883 -0.000089 -0.003985 
+-0.001364 0.002918 -0.000160 -0.000866 0.001680 -0.002332 
+-0.000084 -0.000051 0.000127 0.001899 0.001366 -0.001144 
+-0.000022 0.000109 -0.002411 0.004603 -0.001642 -0.004296 
+0.001235 -0.003472 -0.002629 -0.002850 -0.000591 -0.001422 
+-0.004047 0.002323 0.000841 -0.003018 0.003041 -0.000353 
+-0.001045 0.000966 -0.001370 0.001526 0.001735 -0.004304 
+0.001863 0.002129 -0.007244 -0.001166 -0.002062 -0.006052 
+-0.003982 -0.002908 -0.003269 -0.003145 -0.005227 0.000208 
+-0.000388 -0.001647 0.001866 -0.000215 0.000480 -0.001888 
+0.004699 0.007130 -0.009521 0.003717 -0.001091 -0.006870 
+0.003272 -0.000998 -0.001462 0.004437 0.004587 0.000043 
+0.000731 -0.000568 -0.000739 -0.000488 0.000792 -0.001374 
+0.003246 0.006232 -0.006493 0.002760 0.002819 0.001602 
+-0.000825 0.005109 -0.004127 -0.001405 0.003830 0.000853 
+-0.001820 0.003266 0.002034 0.000310 0.004810 -0.000560 
+0.004925 0.010812 -0.004761 0.012123 0.009621 -0.010959 
+0.008377 0.001306 -0.000115 -0.002304 0.000971 -0.001400 
+-0.002221 -0.006189 0.009264 -0.003800 -0.010988 0.024223 
+0.355330 -1.949239 2.472081 -0.000652 -0.019992 -0.003095 
+0.004191 -0.026943 -0.014097 0.877907 -4.104651 -3.895349 
+0.139535 -4.693023 -4.813953 -0.461240 -4.244186 -4.127907 
+-0.721311 -3.393443 -3.221312 -0.017141 -0.009480 -0.013385 
+-0.002156 -0.002308 0.001539 0.007081 -0.004326 0.007146 
+-0.002291 -0.006634 0.003199 -0.012454 -0.000147 -0.001637 
+0.000062 0.005704 -0.006047 0.013026 -0.009808 0.015600 
+-0.007560 -0.019677 0.017038 -0.001590 0.005650 -0.004732 
+-0.001534 0.006640 -0.005288 -0.002491 0.003769 -0.004023 
+-0.000628 -0.000574 -0.000015 0.008302 0.002372 -0.009048 
+0.019429 0.003796 -0.010571 -0.002515 -0.011863 0.017072 
+0.014836 0.012142 -0.024858 0.001465 0.024141 -0.013586 
+-0.030579 -0.073140 0.018595 -0.065119 -0.168095 0.046190 
+-0.003891 0.005736 0.010775 -0.015210 0.013361 0.009664 
+-0.004139 -0.014869 0.026213 -0.011866 0.005616 0.010203 
+-0.011866 0.010862 0.001057 -0.004975 0.002844 0.011334 
+-0.000007 0.001591 -0.001960 0.002541 -0.000341 -0.003511 
+-0.006667 -0.000740 -0.000392 0.000980 0.006655 -0.006291 
+0.012535 0.004872 -0.006984 0.007429 0.000857 -0.010000 
+0.003216 0.000024 -0.005609 0.000843 -0.003505 -0.005243 
+-0.001774 -0.002065 -0.004597 0.000413 0.000643 -0.005854 
+0.001082 0.000557 -0.001117 0.000241 -0.000272 -0.000465 
+0.005109 -0.000529 0.000169 0.007687 0.001086 -0.001578 
+0.003442 -0.000042 0.000890 0.001430 0.003011 0.001864 
+0.001203 0.007714 -0.000552 -0.002497 0.005767 -0.000565 
+0.001512 0.002787 0.002194 0.002176 0.000767 0.000075 
+0.000349 0.000647 -0.001743 0.000823 0.001883 -0.003530 
+0.001703 0.001478 -0.006460 0.003106 0.002552 -0.005058 
+0.000703 0.003621 -0.002560 -0.000269 0.001281 -0.001616 
+0.002162 0.011064 -0.000381 0.005367 0.009259 0.003283 
+0.010694 0.008382 -0.003107 0.003560 0.006058 -0.008546 
+-0.002133 0.001897 -0.001479 -0.003732 0.003666 0.000784 
+-0.004881 0.004181 -0.000486 -0.003779 0.004245 -0.000398 
+-0.004216 0.001985 -0.002327 -0.001227 0.002279 -0.005039 
+0.000557 0.003690 -0.002314 0.002849 0.002480 -0.000637 
+0.001889 0.003786 -0.003620 0.002765 0.008101 -0.005106 
+-0.001487 0.007937 -0.009088 0.009239 0.003090 -0.014094 
+0.001975 0.001853 0.002129 -0.005604 -0.004237 0.017234 
+-0.003476 -0.010594 0.021264 0.007489 -0.017074 0.004194 
+0.005696 -0.012785 -0.010492 1.600000 -2.452941 -2.588235 
+1.158470 -3.825137 -4.693989 0.394850 -4.373391 -4.673820 
+-0.080460 -3.796935 -3.846743 -0.344828 -2.491379 -2.719828 
+-0.008471 -0.006945 -0.010110 -0.000539 -0.007764 0.004510 
+-0.002277 -0.006875 0.002890 -0.004708 0.000011 0.001086 
+-0.001706 0.000102 -0.000256 0.003238 0.002641 -0.000863 
+0.006009 0.002043 -0.000616 -0.000526 0.000408 -0.000242 
+-0.004356 0.001152 -0.000271 -0.003290 0.000217 -0.000958 
+0.004119 0.005997 -0.004259 0.007989 0.014277 -0.013030 
+0.011753 0.016728 0.003615 -0.002780 -0.024251 0.008998 
+0.009807 0.013236 -0.021157 0.006121 -0.029678 0.054232 
+0.013201 -0.118049 0.013106 0.093021 -0.095199 0.148665 
+0.010647 -0.034965 0.025165 -0.006362 -0.009856 0.030383 
+0.007808 -0.003052 0.031666 0.002725 -0.005939 0.001648 
+-0.000638 0.002623 -0.005170 -0.000143 -0.001448 0.007612 
+-0.002063 0.000997 0.002507 0.009597 0.001052 -0.007596 
+0.008780 -0.003636 -0.011841 -0.000436 0.007218 -0.012789 
+-0.003861 0.001414 -0.009353 -0.001765 0.001128 -0.002959 
+0.000484 -0.001295 -0.000417 -0.002369 -0.001279 -0.000805 
+-0.000832 -0.002144 -0.004032 0.001990 0.002215 -0.002972 
+0.002537 0.001461 0.000192 0.002575 -0.000054 -0.001762 
+0.001746 0.002077 -0.001284 -0.001463 0.002260 -0.005165 
+-0.002785 0.002059 -0.004601 0.002874 0.001765 -0.003317 
+-0.000814 0.004131 -0.003267 0.001054 0.008072 -0.000136 
+0.004170 0.008718 0.001668 0.002840 -0.000345 0.001162 
+0.002729 0.002289 -0.002450 0.000976 0.004427 -0.001650 
+-0.001978 0.006813 -0.004506 0.001721 0.007858 -0.010625 
+0.002941 0.002731 0.001241 -0.003509 0.001228 -0.002281 
+0.004550 0.005835 0.000979 0.006579 0.012537 0.000124 
+0.010131 0.011447 -0.004846 -0.002381 0.009645 -0.006370 
+-0.003211 0.003655 -0.001640 -0.001651 0.001571 -0.000563 
+-0.002031 -0.000513 0.000636 -0.000641 0.000302 -0.000345 
+-0.002238 0.001496 -0.001256 -0.002823 0.002823 -0.004194 
+-0.001659 0.004372 0.001628 -0.001785 0.002278 0.003830 
+0.001170 0.002479 0.001537 -0.000129 0.006168 -0.000194 
+0.001679 0.002831 0.002983 0.002304 -0.004841 -0.003511 
+0.007611 0.002021 -0.000827 -0.002534 -0.003102 0.015486 
+-0.003409 -0.004334 0.017860 0.000040 -0.003691 0.013578 
+0.010466 0.001281 -0.001190 0.014420 -0.004712 -0.010355 
+0.883598 -2.169312 -2.888889 0.250000 -3.778226 -3.854839 
+0.046205 -4.000000 -3.699670 -0.060498 -3.064057 -3.142349 
+-0.008365 -0.010564 -0.018042 -0.000716 -0.001972 -0.000939 
+0.001706 0.000321 -0.000079 -0.000035 -0.000522 0.000105 
+-0.002015 -0.001153 0.000702 0.000056 0.000030 -0.000006 
+0.000554 -0.000016 0.000054 0.000026 -0.001661 0.001411 
+-0.001470 -0.003455 0.002675 -0.002052 -0.004146 0.002660 
+0.000996 0.000137 0.000445 0.007005 0.013302 -0.007465 
+0.018266 0.029542 -0.008680 0.001918 0.003451 -0.002434 
+-0.021481 0.007449 -0.005873 -0.023954 -0.017077 0.009653 
+-0.028306 -0.037591 0.029557 0.004317 -0.017224 0.028138 
+0.005282 -0.009013 0.028044 0.008042 -0.012960 0.020398 
+0.011346 0.006821 0.011740 -0.004061 -0.000842 -0.008313 
+0.005933 0.005022 -0.023331 0.000518 -0.001009 -0.000221 
+0.000520 -0.004110 0.000120 0.006294 -0.003200 -0.000339 
+0.010020 0.006513 -0.012540 -0.004797 0.014369 -0.017391 
+-0.002298 0.012540 -0.014906 -0.003564 0.002656 -0.004816 
+0.000150 -0.000499 0.003731 -0.003883 -0.003368 0.004817 
+-0.002421 -0.004227 -0.000081 0.000059 0.000068 0.000562 
+-0.000071 0.002439 0.000777 -0.000244 0.000000 -0.002846 
+-0.001203 -0.001016 -0.007488 -0.002474 -0.002003 -0.007805 
+-0.000862 -0.001413 -0.004377 -0.000549 0.000441 -0.000358 
+0.000297 0.001459 -0.001097 -0.000018 0.002233 -0.002457 
+-0.001810 0.001353 -0.002549 -0.003624 -0.001200 -0.000659 
+-0.003717 -0.000531 0.001681 -0.000113 0.000029 -0.000277 
+-0.000638 0.002213 -0.000784 0.002876 0.003274 -0.006992 
+-0.000404 -0.002920 -0.002332 -0.001518 -0.002520 -0.003911 
+-0.000563 0.004187 -0.002812 0.001552 0.004859 -0.004328 
+0.002735 -0.002304 -0.004176 -0.002421 0.002849 -0.002149 
+-0.002568 0.003454 -0.002005 0.002290 0.003083 0.000344 
+0.002398 -0.002616 -0.004029 0.000978 -0.002187 -0.001450 
+-0.003316 0.002884 -0.000656 -0.007218 0.007218 -0.003065 
+-0.006171 0.006302 0.001203 -0.001017 0.003612 0.004051 
+0.001245 0.003831 0.003112 0.003143 0.006164 -0.001936 
+0.000384 0.005321 -0.002573 -0.000828 -0.000154 -0.001776 
+-0.000451 0.000694 -0.004202 0.001906 0.003984 0.000192 
+0.003615 0.007252 0.008435 0.003152 0.009347 0.011325 
+-0.000758 0.009443 0.007763 0.008403 -0.000433 0.002467 
+0.002770 -0.011143 -0.015851 -0.179856 -2.870504 -3.158273 
+-0.305556 -3.620370 -3.327161 -0.221122 -2.947195 -3.132013 
+-0.041284 -1.298165 -2.495413 -0.002135 0.004013 -0.006752 
+0.003810 0.008276 0.001576 -0.000308 -0.000058 0.000534 
+-0.001171 -0.004849 -0.001560 0.001152 -0.001433 -0.000054 
+-0.000256 0.002079 -0.001664 -0.001437 0.000913 0.000640 
+-0.002255 -0.002052 0.000866 -0.003163 -0.002215 -0.000093 
+-0.000559 -0.001552 -0.000260 0.001018 0.003172 -0.002405 
+-0.001128 0.001255 -0.004154 -0.009650 -0.004171 0.001428 
+0.005515 0.006055 -0.006853 0.005339 -0.000381 0.000621 
+0.002605 0.007932 -0.005146 0.006835 0.001195 -0.001321 
+0.004065 -0.014623 0.007574 0.001783 0.005653 -0.000626 
+0.007500 0.000000 -0.037500 0.000815 0.007747 -0.024192 
+0.009366 0.023279 -0.040028 0.007018 0.018323 -0.014339 
+-0.006418 -0.007091 -0.001670 -0.005039 -0.008610 0.001431 
+-0.000207 0.005582 -0.018569 0.001134 0.016492 -0.025741 
+-0.002141 0.000169 -0.013918 -0.003119 0.002934 0.001686 
+-0.008960 -0.007637 0.007995 -0.000799 -0.002992 -0.002727 
+-0.000009 0.001131 -0.005140 -0.000072 0.001053 -0.000683 
+-0.002278 0.000028 0.003540 -0.006043 -0.000819 0.002765 
+-0.005038 -0.003636 -0.005038 -0.004513 -0.001513 -0.002974 
+-0.001327 -0.001802 0.000378 -0.000240 0.002614 0.002038 
+0.001591 0.005966 -0.003314 0.002328 0.001246 -0.003506 
+-0.002117 -0.000360 -0.001711 -0.003834 -0.002243 0.002854 
+-0.002210 -0.002201 0.004395 0.001999 -0.000035 0.000921 
+0.000230 -0.001495 0.000556 0.003485 -0.001792 -0.004927 
+0.000629 -0.004676 -0.003463 -0.000646 -0.004052 -0.003138 
+-0.000316 0.000549 -0.002420 0.002590 0.003604 -0.004111 
+0.003548 0.003692 -0.009212 -0.003479 0.001792 -0.005801 
+-0.000732 0.005046 -0.003616 0.002126 0.000837 -0.004637 
+-0.000348 -0.000798 -0.004084 0.001882 0.004241 -0.002550 
+0.001083 0.000919 -0.002351 -0.001774 0.001562 -0.000927 
+-0.001912 0.001485 0.001032 0.001878 0.001508 0.003715 
+0.002891 0.002441 0.002557 0.000858 0.000849 -0.000073 
+-0.000928 -0.000830 -0.002095 -0.002082 -0.000938 -0.004163 
+0.001009 0.001110 -0.010000 -0.003565 0.005160 -0.005701 
+0.003965 0.014454 -0.020094 0.010651 0.022314 -0.001020 
+-0.000648 0.017105 0.009380 -0.005074 0.005318 0.004446 
+0.001676 0.000389 -0.007554 -0.226230 -2.331147 -2.800000 
+-0.314570 -3.089404 -3.576159 -0.369811 -2.162264 -3.373585 
+-0.010485 -0.007055 -0.020185 -0.003427 0.006435 -0.008858 
+0.000879 0.004081 -0.002204 0.001951 -0.003350 -0.001748 
+0.003711 -0.004998 -0.006513 0.004686 -0.001174 -0.006000 
+0.000393 -0.001816 -0.002624 -0.003847 -0.000209 -0.001512 
+-0.004305 0.000577 0.000644 -0.004020 0.001140 0.003968 
+-0.002506 0.000693 0.003382 -0.001969 0.001071 0.001037 
+-0.004119 0.000101 -0.002945 -0.004620 -0.001427 -0.000520 
+0.004422 0.002538 -0.000747 0.008028 0.007283 -0.000859 
+0.002082 0.004596 -0.000792 -0.010680 -0.005715 0.001313 
+-0.015826 0.006367 -0.005457 -0.005744 0.026523 -0.047030 
+-0.003051 -0.000563 0.015341 -0.000134 -0.008163 0.030551 
+0.003474 -0.009414 0.023329 0.003642 -0.001954 0.009144 
+0.006214 0.007185 -0.009444 -0.001823 -0.002935 -0.011605 
+0.000239 0.002301 -0.012723 0.002764 0.009719 -0.005486 
+-0.004262 0.004109 -0.002387 -0.004542 0.003949 -0.000126 
+-0.003261 0.001730 -0.000120 -0.000413 -0.000434 -0.002713 
+0.000527 0.000626 -0.003984 -0.000582 0.002762 -0.002028 
+-0.002916 0.002165 0.001404 -0.002674 0.002101 -0.000538 
+-0.000593 0.000485 -0.000238 -0.000894 -0.002927 -0.001545 
+-0.000591 0.000407 0.001126 -0.000701 0.002827 0.002252 
+0.000980 0.003431 -0.000245 0.000661 0.003615 -0.003553 
+-0.000288 0.002207 -0.002687 -0.000079 0.000188 -0.000439 
+0.000354 -0.000115 0.001638 -0.000005 0.000021 -0.000073 
+0.002126 0.002432 -0.002585 0.002245 -0.003143 -0.006210 
+0.003557 -0.003850 -0.006380 -0.001672 -0.001229 -0.000987 
+0.007475 0.009797 -0.006024 0.008649 0.014097 -0.010735 
+0.007434 0.008312 -0.013347 0.004465 0.002462 -0.004980 
+-0.001343 -0.000637 0.001711 -0.002701 0.000470 0.002742 
+0.000431 -0.000461 -0.000183 0.003588 0.000039 -0.000585 
+0.002534 -0.002154 0.001259 0.000417 -0.004436 0.002010 
+0.002114 -0.000783 0.003353 0.002930 0.002089 0.003249 
+0.002775 0.003094 0.000807 0.000115 -0.000853 0.001441 
+-0.001755 -0.006505 0.003507 -0.003406 -0.009570 0.009788 
+-0.004866 -0.006287 0.004396 0.009077 0.002934 -0.001734 
+0.005874 0.016155 -0.028400 -0.002559 0.036947 0.001675 
+-0.016301 0.019424 0.018647 -0.018375 0.001810 0.015909 
+-0.010233 -0.011356 0.005125 -0.437500 -2.209375 -1.293750 
+-0.155235 -2.888087 -2.978339 -0.166667 -2.068627 -3.250000 
+-0.011604 0.000391 -0.006822 -0.006633 0.004243 -0.000344 
+-0.002309 0.000259 -0.001291 0.000475 -0.002052 0.000148 
+0.007711 -0.003169 -0.002221 0.007083 -0.002206 -0.007008 
+0.000505 -0.002021 -0.004323 -0.003072 0.000718 -0.000904 
+-0.003522 0.003509 0.001399 -0.003303 0.002927 0.001823 
+0.000962 0.000279 -0.000280 0.002162 -0.000637 -0.002161 
+0.000598 0.001091 0.000034 -0.001570 0.000581 0.000192 
+0.001799 -0.003296 0.001832 0.002247 -0.002167 0.002386 
+-0.010438 0.000174 -0.002379 -0.004573 0.011875 -0.002127 
+-0.005253 0.007886 -0.010018 -0.002045 -0.002255 0.025964 
+-0.531469 -1.017483 4.842658 -0.563889 -1.119444 5.041667 
+-0.351792 -0.990228 4.537459 0.002162 -0.003989 0.028313 
+0.004943 0.010520 -0.008463 0.001850 0.007865 -0.015268 
+-0.002150 -0.001129 0.002240 -0.001934 0.002649 0.011910 
+0.001071 0.004647 0.001813 0.001689 -0.002622 -0.003351 
+0.002160 -0.002672 -0.000495 0.000639 -0.001215 0.001347 
+-0.000330 0.001777 -0.002645 0.001304 0.004201 -0.003879 
+0.000241 -0.000219 -0.002222 0.001009 -0.000335 0.002365 
+-0.001476 0.000753 0.001002 -0.002140 0.002254 0.000279 
+-0.002092 0.002173 -0.000163 -0.001336 0.000445 -0.000876 
+0.000361 0.000803 -0.000090 0.000166 -0.003418 -0.001384 
+-0.000120 -0.004463 -0.003485 -0.000248 -0.002640 -0.001361 
+-0.000803 0.002768 -0.002076 -0.001580 0.004327 -0.003722 
+-0.000346 0.003627 -0.004493 0.003702 0.000909 -0.004222 
+0.005930 -0.001882 -0.002794 0.004195 -0.002540 -0.003213 
+0.002192 -0.000784 -0.001474 -0.007249 0.009620 -0.007296 
+0.003704 0.005186 -0.010719 0.000366 -0.000514 -0.005285 
+-0.000977 -0.000602 -0.001654 0.000744 -0.001756 0.002161 
+-0.001650 -0.005428 0.001770 -0.002479 -0.002974 -0.001580 
+-0.001018 0.001386 0.000798 0.002618 0.002696 0.001953 
+0.003141 0.006720 0.000943 0.007431 0.007169 -0.000798 
+0.004630 -0.001032 -0.006990 0.001419 -0.003505 0.000084 
+0.002713 -0.006647 0.005323 -0.000420 -0.006059 0.011957 
+-0.001809 -0.004269 0.004095 0.001433 -0.007978 -0.008823 
+-0.011278 0.021229 0.001768 -0.016414 0.010731 0.022896 
+-0.609244 0.512605 3.336134 -0.397351 -0.245033 3.215232 
+-0.401254 -0.962382 2.379310 0.002715 -0.011657 -0.003043 
+0.002095 -0.020878 -0.007446 -0.001745 -0.020873 -0.011981 
+-0.010430 0.009533 0.000233 0.002032 0.003141 0.004826 
+0.004568 -0.000059 -0.001392 0.003674 0.001498 0.000054 
+0.001815 0.001064 0.000308 -0.001540 -0.004048 -0.005226 
+-0.000237 -0.002022 -0.002335 -0.002913 0.000899 0.000071 
+-0.005046 0.001874 0.002156 -0.005601 0.001766 0.002604 
+-0.005521 0.000597 0.001259 -0.001820 0.001323 0.000251 
+0.000671 0.000737 0.000014 -0.000051 -0.001878 -0.000830 
+0.002168 -0.005492 -0.002680 -0.002842 -0.010386 -0.013553 
+0.004545 -0.018598 -0.012457 -0.001015 0.018161 -0.012302 
+-0.388060 0.129353 3.457711 -0.655589 -1.006042 5.232628 
+-0.792079 -1.356436 5.695545 -0.875000 -1.354592 5.591837 
+-0.806557 -1.098361 4.862295 -0.007109 -0.003584 0.029010 
+-0.001889 -0.004517 0.006110 -0.002805 -0.007671 0.000923 
+-0.002559 -0.001700 0.012611 -0.007857 0.001048 0.001777 
+-0.005724 0.001935 0.002608 -0.001926 0.000815 0.001705 
+-0.000411 0.000021 0.000638 -0.000518 0.004753 -0.003072 
+0.000745 0.003372 -0.004595 0.000123 -0.001605 -0.004008 
+0.000668 -0.007037 -0.003695 0.000255 -0.005208 0.000719 
+-0.001065 -0.000263 0.001117 -0.002616 0.002001 0.001077 
+-0.002197 0.002215 0.000002 -0.001778 0.001185 0.000000 
+0.000186 0.001618 -0.000014 -0.000139 -0.001227 -0.001273 
+-0.000066 -0.000888 -0.004981 0.000619 -0.001939 -0.003412 
+0.002569 0.000041 -0.000163 0.002849 0.000284 0.001766 
+0.001626 0.000212 -0.006645 0.008171 0.005421 -0.003214 
+0.005557 -0.002827 -0.002188 -0.000341 -0.003491 -0.004547 
+0.006912 0.000885 -0.003703 0.009931 0.004406 -0.004426 
+0.007688 0.003920 -0.003251 0.001553 0.004598 -0.003791 
+0.002555 0.001430 -0.003375 0.002045 0.001779 -0.000757 
+-0.000205 -0.002265 0.000207 -0.000284 -0.003034 -0.001314 
+-0.002571 0.000381 -0.001905 0.001187 0.004526 -0.002892 
+0.004752 0.008537 -0.002233 0.010487 0.005645 -0.004687 
+0.008046 -0.001217 -0.007358 -0.000252 -0.000921 -0.000588 
+-0.000104 -0.002188 -0.002566 0.001680 0.000063 -0.008557 
+0.009931 0.005420 -0.009459 -0.003496 -0.000548 -0.006000 
+0.001620 0.000219 0.024940 1.023474 -0.755869 4.244132 
+2.019480 -0.801948 4.675324 2.338192 -0.927114 4.419825 
+1.831715 -1.103560 3.501618 0.948207 -1.250996 2.019920 
+0.010233 -0.008762 0.001893 0.003510 -0.008066 -0.004679 
+-0.003858 0.008663 0.003572 0.007288 0.007482 0.005241 
+0.005848 -0.000075 -0.001702 -0.000746 -0.003907 -0.002112 
+-0.003688 -0.003278 -0.001751 -0.003968 0.000590 -0.000411 
+-0.004070 0.002807 -0.000649 -0.004255 0.003736 -0.000985 
+-0.000975 0.003714 -0.001675 -0.000108 0.001573 -0.000589 
+-0.000649 0.001296 -0.000138 0.000204 0.002774 -0.000169 
+0.001709 0.003317 0.000753 0.002325 0.001966 0.002087 
+0.000591 -0.002393 -0.001475 -0.016503 -0.006139 -0.017845 
+0.020508 0.019811 -0.038459 -0.001097 0.007401 0.007491 
+-0.628099 -0.454545 4.756198 -0.924791 -1.103064 6.064067 
+-1.020000 -1.385000 5.880000 -0.953930 -1.311653 4.745257 
+-0.758958 -0.869707 3.237785 -0.003958 -0.004156 0.021198 
+-0.003791 -0.001029 0.014670 -0.002271 0.001051 0.006708 
+0.002763 0.001394 -0.001309 -0.001147 0.000538 0.001024 
+-0.008021 0.001598 0.006618 -0.012566 -0.002275 0.007109 
+-0.004871 0.001172 0.002596 0.000538 0.004649 -0.002253 
+0.004449 0.004464 0.000011 -0.000175 0.002900 -0.003739 
+0.001482 -0.000008 -0.004452 0.000137 -0.000061 -0.002705 
+0.002379 -0.003300 0.002605 0.001153 -0.003317 0.003787 
+0.001196 0.000180 -0.000825 0.000542 0.004254 -0.002419 
+-0.001810 0.004345 0.000996 -0.003052 0.001317 0.003209 
+-0.001611 -0.000150 0.002230 0.001416 0.000015 0.000552 
+0.003175 0.000448 0.000945 0.002918 -0.000200 0.000271 
+0.004758 -0.001046 -0.001743 0.008384 0.003142 -0.001798 
+0.005928 0.005734 -0.002454 0.001660 0.003360 -0.002854 
+0.012539 0.005422 -0.005874 0.007833 0.008052 -0.004115 
+0.003286 0.002432 -0.000478 -0.000859 -0.000738 0.001261 
+0.000357 -0.005273 -0.002101 -0.001185 -0.004625 -0.000661 
+0.000424 -0.002664 -0.000320 -0.000380 -0.001275 0.001024 
+-0.000474 0.001073 -0.002834 0.002458 0.003787 -0.004452 
+0.006589 0.002477 -0.004246 0.009270 0.003474 -0.001512 
+0.006583 0.003894 0.000446 -0.000245 0.002475 -0.001438 
+-0.002244 0.002729 -0.006594 -0.006959 0.003846 -0.018659 
+-0.007894 0.007010 -0.021062 0.000542 0.003016 0.007751 
+1.315315 -0.072072 3.166667 1.839228 -0.784566 4.790997 
+2.623230 -1.203966 5.730878 3.344411 -1.429003 5.924471 
+3.470817 -1.505837 5.101167 1.879121 -1.302198 3.082417 
+0.006176 -0.006691 0.006690 -0.000350 -0.000845 -0.004841 
+0.004918 0.007523 0.010392 0.019166 0.007988 0.006152 
+0.007732 -0.000491 -0.001248 0.000915 -0.002994 -0.002047 
+0.003998 0.001432 -0.000431 0.003938 0.004074 0.000197 
+0.000835 0.002703 -0.000226 0.001372 0.003416 -0.001728 
+0.003871 0.006029 -0.003631 0.003315 0.004719 -0.000563 
+-0.001352 -0.000452 -0.000237 -0.004044 -0.002466 -0.002170 
+-0.001477 -0.000134 -0.000487 0.004376 0.002453 0.004484 
+0.004309 -0.000501 0.004444 -0.003655 0.015280 -0.005932 
+0.010024 0.017324 -0.036405 0.001156 0.007768 0.003005 
+-0.640000 -0.210000 4.585000 -0.817891 -0.830671 6.035144 
+-0.837629 -1.054124 5.603093 -0.690537 -0.992327 4.127877 
+-0.481481 -0.780864 2.466049 -0.000736 -0.004357 0.011943 
+0.000668 -0.001780 0.001156 0.002085 -0.000041 -0.003199 
+-0.000327 -0.001794 0.000863 -0.004490 -0.005352 0.004869 
+-0.006248 -0.009253 0.001908 -0.004088 -0.003341 0.003828 
+-0.000012 0.002224 -0.002211 0.001553 0.004330 -0.003409 
+-0.000359 -0.000260 -0.001464 0.000765 -0.000444 -0.001195 
+0.002706 0.000258 -0.002294 0.001157 0.003907 -0.004449 
+-0.001029 0.003145 -0.001304 -0.004932 0.000247 0.003838 
+-0.006582 -0.004720 0.004886 -0.002588 -0.001696 0.008359 
+-0.005279 0.000368 0.006793 -0.003715 -0.001119 0.006059 
+-0.001413 0.000421 0.006250 -0.003501 0.003001 0.003201 
+-0.005690 0.002772 0.002079 -0.001333 0.005641 0.000444 
+0.004162 0.006387 -0.002097 0.006897 0.005447 -0.002759 
+0.005896 0.004755 -0.003867 0.004080 0.003850 -0.006219 
+0.000168 0.008673 -0.000958 0.002752 0.003211 -0.003613 
+-0.001134 -0.000751 -0.004558 -0.000437 -0.001774 -0.005406 
+0.002133 0.000211 -0.002028 -0.000474 -0.000657 -0.001788 
+-0.000441 -0.000035 0.000138 -0.002044 0.002044 0.001168 
+0.000174 0.000522 -0.001567 0.001525 0.005017 -0.003729 
+0.001504 0.002402 -0.005229 -0.002312 -0.000713 -0.000597 
+-0.000734 -0.002426 0.000498 -0.000584 0.000851 0.001531 
+-0.003221 0.003985 -0.005617 -0.014913 0.003172 -0.013420 
+-0.003688 0.007492 -0.018707 0.005382 0.002851 0.015583 
+1.391635 -0.235741 3.524715 1.893064 -0.661850 4.627168 
+2.527624 -0.988950 5.436464 3.104101 -1.192429 5.933754 
+3.000000 -1.153527 5.626556 1.716867 -0.843373 4.078313 
+0.002766 -0.005442 0.013217 -0.001448 -0.000615 -0.009108 
+0.001573 0.001503 0.003196 0.015995 0.012655 0.008835 
+0.013763 0.010325 -0.000687 0.028820 0.018581 -0.005252 
+0.023392 0.017010 -0.003896 0.007897 0.006105 -0.001791 
+0.000191 0.000979 0.000114 0.002202 0.002855 0.000573 
+0.001876 0.002920 0.001807 -0.002663 0.001132 0.000174 
+-0.004908 -0.000670 -0.003617 -0.005191 -0.005620 -0.009564 
+0.001214 -0.008499 -0.009189 0.006403 -0.000312 -0.001365 
+0.003529 0.002594 0.001216 0.006715 0.001530 -0.001355 
+0.017050 0.006758 -0.027320 0.005926 0.008694 -0.012307 
+-0.003613 0.001465 0.027344 -0.231061 -0.568182 4.655303 
+-0.175758 -0.842424 4.887879 -0.140187 -0.869159 4.040498 
+-0.216327 -0.714286 2.559184 -0.001492 -0.001020 0.007258 
+0.000898 0.004331 -0.009434 0.000442 -0.002088 -0.002963 
+-0.000263 -0.001305 0.002143 -0.001496 0.000581 0.003143 
+0.000271 0.001240 -0.000108 0.001598 0.001323 -0.002460 
+-0.000537 0.001458 -0.005372 0.000303 0.003418 -0.001953 
+-0.000388 -0.000024 0.000971 0.000859 -0.000946 0.002315 
+0.000670 -0.000824 -0.001159 0.003255 0.004393 -0.009281 
+0.003395 0.007416 -0.010271 0.003172 0.005547 -0.002947 
+-0.000110 0.001924 0.000487 0.000822 -0.001906 0.004703 
+-0.000710 -0.002895 0.003097 0.000171 0.000938 -0.000364 
+-0.000027 0.004791 -0.003248 -0.002665 0.006836 -0.001198 
+-0.002200 0.004650 -0.000313 -0.001845 0.001581 0.000000 
+-0.003333 0.000000 -0.000873 -0.002629 -0.003046 0.000737 
+0.000579 -0.002229 -0.002416 0.002050 0.000331 -0.003346 
+-0.001067 -0.002985 0.002185 0.000974 -0.000749 -0.001110 
+0.004168 0.003413 -0.007145 0.005884 0.004899 -0.006869 
+0.000790 0.005228 -0.005070 -0.000084 0.001327 -0.000866 
+-0.000920 -0.000189 -0.000130 -0.001042 -0.000882 -0.000841 
+-0.002772 0.000448 0.000183 -0.000027 0.001892 -0.000768 
+-0.000040 -0.001963 -0.002333 -0.002641 0.000108 -0.001390 
+0.001472 0.003765 0.002818 -0.001601 0.003752 0.005542 
+-0.000826 0.003076 -0.001850 -0.013533 0.001144 -0.010835 
+-0.001740 0.006975 -0.012008 0.005710 0.004818 0.008686 
+1.216535 0.039370 2.059055 1.603125 -0.365625 3.128125 
+1.927273 -0.627273 4.257576 2.140893 -0.701031 5.151203 
+2.008929 -0.642857 5.348214 1.390411 -0.609589 4.356164 
+0.005222 -0.006945 0.016223 0.000785 -0.009621 -0.022287 
+-0.003309 -0.018208 -0.026349 -0.017061 0.001430 -0.006899 
+0.007587 -0.006752 -0.007014 0.017015 -0.005430 -0.014424 
+0.014663 -0.001952 -0.009019 0.008536 0.003132 -0.001981 
+0.005530 0.003996 0.002055 0.001643 0.002118 0.001855 
+-0.001112 0.000020 -0.000249 -0.002065 -0.000778 -0.001542 
+-0.002941 0.003181 0.001594 -0.002202 0.004756 -0.002464 
+-0.000800 0.003713 -0.012996 0.006309 0.000967 -0.012031 
+0.015513 0.006276 -0.006569 0.016291 -0.000647 -0.006719 
+0.012200 0.000641 -0.012414 0.001882 0.001795 -0.006693 
+-0.003635 -0.000766 0.014701 -0.002223 0.003604 0.024284 
+0.401826 -0.442922 2.767123 0.004948 -0.003806 0.022802 
+0.001798 -0.001638 0.006909 -0.004029 0.002801 -0.015007 
+0.002668 0.007595 -0.011202 -0.001780 0.003529 0.002572 
+-0.000412 0.000084 0.000839 0.004854 0.002208 -0.001957 
+0.005013 0.003455 -0.003494 0.001506 0.001686 -0.003715 
+0.000260 -0.000997 -0.002097 0.001123 -0.003772 0.000259 
+0.001073 -0.001815 0.001765 -0.000706 0.001627 -0.000691 
+0.000520 0.003588 0.002225 -0.000860 0.001175 -0.000926 
+0.000000 0.000752 -0.003459 0.002073 0.001293 -0.001926 
+-0.000641 0.001190 0.000244 -0.001007 0.000687 -0.002255 
+-0.000073 0.001970 -0.004740 0.004758 0.003020 -0.005213 
+0.003907 0.001130 -0.001904 0.000144 -0.000124 -0.000878 
+-0.003130 0.003091 0.000734 -0.001093 0.000734 -0.000732 
+-0.003663 -0.001763 0.003933 -0.006009 -0.002261 0.004491 
+-0.001524 -0.001344 0.004231 0.000041 -0.000355 -0.000132 
+-0.000134 0.008010 -0.001446 0.006926 0.006352 -0.001803 
+0.004340 0.004623 -0.003020 -0.000106 0.001459 0.000732 
+-0.002121 -0.002121 0.002197 -0.001400 -0.001595 0.001848 
+0.000651 0.000078 -0.000326 0.001812 0.001641 0.000302 
+0.000901 0.000429 0.000011 0.000288 -0.000472 0.000162 
+0.001600 -0.001134 -0.000052 0.002052 -0.000864 0.000702 
+-0.000303 0.000273 0.000091 -0.000072 0.001550 0.000572 
+0.000391 0.003714 -0.002955 -0.000333 0.006614 -0.007862 
+0.000611 0.011036 -0.004944 0.002444 0.006732 -0.003546 
+0.006131 0.003820 0.003461 0.011504 -0.001014 0.014018 
+1.321168 -0.051095 2.726277 1.388000 -0.076000 3.504000 
+1.043243 -0.075676 3.556757 0.003512 -0.001395 0.024731 
+0.000742 -0.004562 -0.002324 -0.001966 -0.003440 0.000737 
+0.006222 -0.002227 -0.001639 0.005677 -0.001508 -0.006419 
+0.007115 -0.001482 -0.013887 0.008855 -0.000672 -0.015183 
+0.009881 0.002657 -0.006151 0.007922 0.000731 0.003842 
+-0.001522 0.005250 0.004968 -0.017491 0.006469 0.001372 
+-0.018856 0.000425 0.003077 -0.004197 -0.001647 0.002055 
+0.001649 0.002833 -0.005133 -0.000256 0.000574 0.000833 
+-0.011339 -0.004054 0.007264 -0.014698 -0.019854 0.000854 
+0.014545 0.007194 -0.011229 0.017360 0.012094 -0.016335 
+0.004933 0.010745 -0.005359 0.000922 0.006693 -0.001792 
+0.000668 0.000650 -0.003689 0.001979 0.000149 -0.002521 
+0.002196 -0.000323 0.000913 -0.000977 0.001011 0.001277 
+-0.005654 0.006638 -0.005727 0.012539 0.009748 -0.013942 
+0.000776 0.010366 -0.007747 0.000526 0.001135 0.002062 
+0.000408 -0.000897 0.005143 -0.000184 -0.002421 0.002385 
+-0.000074 -0.001505 0.000490 -0.000096 -0.002018 0.002256 
+-0.004113 -0.001734 0.001607 -0.000252 -0.000810 -0.000011 
+0.001438 0.001481 -0.002462 -0.001188 0.000360 -0.000312 
+-0.000603 0.001062 -0.000241 0.000060 -0.000462 -0.000510 
+-0.000014 -0.003657 -0.000085 -0.002662 -0.003561 0.001835 
+0.000107 0.000143 0.000393 -0.001006 -0.002566 -0.001861 
+-0.004542 -0.000827 -0.002628 -0.003477 0.000300 -0.001109 
+-0.001096 -0.000382 -0.000604 -0.001575 -0.001983 -0.000059 
+-0.003041 -0.001600 -0.002661 -0.004467 0.002035 -0.004157 
+-0.003866 0.003711 -0.004948 -0.000608 0.000022 -0.006055 
+0.001281 -0.003881 -0.001453 -0.004831 -0.006938 0.000371 
+-0.000173 0.004284 0.001100 0.008177 0.004686 -0.004428 
+0.003202 0.003212 -0.003730 0.000879 0.000569 -0.000737 
+-0.001303 0.001878 -0.000064 0.001374 0.002297 -0.003828 
+0.002086 0.000157 0.001919 0.002646 0.001964 0.002380 
+0.000693 0.002207 0.000064 0.000046 0.002524 -0.002980 
+0.002013 0.001553 -0.000812 0.000878 -0.000281 0.000246 
+0.000585 -0.000808 -0.000100 0.000391 0.000896 0.000524 
+0.001819 0.004260 -0.000793 0.001963 0.005307 -0.004316 
+-0.005217 0.002498 -0.008743 -0.000749 -0.001464 -0.007247 
+-0.001546 -0.001407 -0.001344 0.002008 -0.000039 0.004238 
+0.004891 -0.001567 0.008780 0.004366 -0.003048 0.011216 
+0.002126 -0.000822 0.009455 -0.002243 0.003440 -0.000551 
+-0.004627 0.015845 -0.006477 0.009338 0.017512 -0.018387 
+0.007475 0.010976 -0.015032 0.005305 0.008589 -0.010818 
+0.003013 0.006136 -0.007267 -0.001589 0.001487 -0.003974 
+-0.002695 -0.002107 0.002392 -0.003929 -0.002263 0.004675 
+-0.001587 0.000330 0.002698 0.007360 0.002424 -0.001675 
+0.001645 0.001916 0.002671 -0.005646 0.004983 -0.003690 
+-0.005350 0.003871 -0.004822 -0.002375 0.002892 -0.002404 
+0.001209 -0.000604 -0.000465 0.004171 0.000506 -0.006697 
+0.013143 0.009775 -0.024645 0.024115 0.035576 -0.027055 
+0.013320 0.020308 -0.013946 0.006079 0.008281 -0.007599 
+0.001363 0.004608 -0.009000 0.000101 0.005958 -0.006901 
+0.002967 0.003722 -0.005634 0.000808 0.005041 -0.002990 
+0.000902 0.005607 -0.005835 0.000342 0.006553 -0.012827 
+-0.006532 0.009363 -0.009724 -0.002988 0.011322 -0.004220 
+-0.003113 0.007221 -0.000081 -0.003758 0.002420 0.000304 
+-0.002609 0.003294 -0.003164 0.000262 0.001135 -0.004531 
+0.001114 0.001392 -0.006493 -0.001779 0.003730 -0.007202 
+0.000783 0.005120 -0.007197 0.001142 0.002886 -0.003633 
+0.000688 0.000255 -0.000999 -0.000356 0.001423 -0.001318 
+0.000263 0.003179 -0.003931 -0.000609 0.002290 -0.004884 
+-0.000789 0.000825 -0.002921 0.001261 -0.002639 -0.002183 
+0.001163 -0.001938 0.000775 -0.000294 0.000221 0.001760 
+0.000880 -0.000532 -0.000717 0.001493 -0.002527 -0.003216 
+0.001072 -0.001077 0.000020 -0.002521 0.002605 0.001261 
+-0.004715 0.004360 -0.000710 -0.001602 0.003593 -0.003572 
+0.001205 -0.000040 -0.001801 -0.001149 -0.002011 -0.000144 
+0.001757 0.002262 0.001002 0.001870 0.000448 -0.000732 
+0.000992 0.003058 -0.002975 0.003393 0.004540 -0.005272 
+0.004579 0.003242 -0.004218 0.002885 0.001847 -0.002176 
+-0.000093 0.001009 -0.003119 0.000565 0.002539 -0.000048 
+0.000125 0.003026 -0.000419 0.001699 0.001031 -0.001021 
+0.002109 -0.000124 0.001240 -0.000036 -0.000552 -0.000377 
+-0.000721 0.000384 0.000048 0.000006 -0.000326 0.002053 
+0.001555 -0.001573 0.003019 0.000498 -0.001155 0.001097 
+-0.003705 0.003380 -0.002613 -0.001941 0.003097 -0.003494 
+0.000829 0.000095 -0.000853 0.000032 -0.000270 -0.000789 
+-0.003177 0.000226 -0.003625 -0.006502 0.001577 -0.005939 
+-0.006595 0.002819 -0.007678 -0.003283 0.008245 -0.006822 
+0.003499 0.013654 -0.013030 0.002978 0.012443 -0.012049 
+0.001040 0.008067 -0.007160 0.000811 0.005273 -0.002080 
+0.001573 0.001722 0.000543 -0.000403 -0.002095 -0.004564 
+0.000263 0.009140 -0.009710 0.002419 -0.000129 -0.007289 
+-0.000125 -0.003799 -0.008717 0.006877 -0.002331 -0.006689 
+0.009075 0.009589 -0.001173 0.002063 0.016156 0.003304 
+-0.006315 0.013289 0.004311 -0.007105 0.008047 -0.000317 
+-0.005704 0.000882 -0.002101 -0.003305 0.002576 -0.001191 
+0.002909 0.011614 -0.007738 0.011404 0.014659 -0.015721 
+0.012514 0.010097 -0.011382 0.003561 0.001300 -0.004641 
+-0.001049 -0.002716 -0.004220 -0.004059 -0.001202 -0.007778 
+-0.005241 0.001226 -0.002711 0.001466 0.004444 -0.000611 
+-0.000544 0.006271 -0.000459 0.000485 0.004906 0.001266 
+-0.001896 0.001566 -0.002361 -0.002497 0.001770 -0.003636 
+-0.002059 0.003366 -0.002424 -0.000682 0.004995 -0.002680 
+0.002448 0.006481 -0.005111 0.003888 0.006353 -0.008187 
+0.001567 -0.000586 -0.000390 -0.000352 0.000824 0.000242 
+0.001730 0.001169 0.001233 -0.002386 -0.003307 0.000795 
+0.000747 -0.001848 0.000147 0.000110 0.001123 0.000167 
+0.000776 -0.001181 -0.002632 0.000343 0.000237 -0.000888 
+-0.002002 -0.000629 0.002343 0.001848 -0.000735 0.001575 
+0.000971 -0.003920 0.004145 -0.001037 -0.004383 0.004807 
+-0.001146 0.000701 0.000828 -0.002388 -0.003653 -0.000773 
+0.001013 -0.001705 -0.000959 0.001992 -0.000553 0.000095 
+-0.000304 0.001241 -0.002811 -0.000034 0.003288 -0.001845 
+0.000392 0.004413 -0.003727 -0.000387 0.007476 -0.003136 
+0.001980 -0.000509 0.001930 -0.000407 -0.002645 0.001764 
+-0.003726 -0.000862 0.001644 -0.003706 0.002347 0.001182 
+0.000633 0.002403 0.000328 -0.000028 0.004753 -0.003980 
+0.000386 0.005184 -0.002063 0.000044 0.003279 -0.000604 
+-0.000240 0.000835 0.000136 -0.000043 -0.000280 0.000237 
+-0.000267 0.000267 -0.000533 0.000213 0.001960 0.000511 
+-0.000785 0.000621 0.002976 0.000551 -0.000066 0.001783 
+0.000565 -0.001484 0.000866 -0.000073 0.000792 -0.000046 
+0.000705 0.001354 0.000909 0.000513 0.000730 -0.004545 
+0.001002 0.000891 -0.004333 0.002033 0.000011 -0.002962 
+0.000113 0.000449 -0.003405 -0.001734 0.007159 -0.009872 
+0.002864 0.010489 -0.003658 -0.005135 0.006191 -0.009377 
+-0.002086 0.003622 -0.002503 -0.000798 0.003645 -0.002028 
+0.001780 0.006736 -0.001626 -0.002846 -0.000037 -0.004195 
+-0.004784 0.000783 -0.012102 0.004041 0.011739 0.000808 
+0.000159 0.003195 -0.020766 0.003260 0.006548 -0.020482 
+-0.002651 0.007379 -0.014872 -0.002026 0.006272 -0.012103 
+0.003873 -0.007255 -0.010637 -0.005423 0.000944 -0.005963 
+-0.003211 -0.000590 -0.002080 0.001337 -0.000379 -0.004817 
+-0.001399 0.003468 -0.005791 0.002267 0.006112 -0.004171 
+0.006871 0.003908 -0.004248 0.001683 0.001305 -0.001212 
+-0.008029 -0.001412 0.001575 -0.010305 0.000629 0.006217 
+-0.002028 0.001136 0.004317 0.000088 -0.001265 -0.000946 
+-0.004318 -0.002945 -0.001658 -0.000784 0.001485 0.000290 
+0.000385 0.007193 -0.001981 -0.000955 0.004228 0.002625 
+-0.002734 0.002309 -0.001883 -0.001260 -0.000274 -0.001457 
+0.001054 0.000564 0.000618 0.000245 0.001938 0.000345 
+-0.000237 0.003562 -0.000917 0.001167 0.003939 -0.002843 
+0.000758 0.004132 -0.005164 0.001778 0.001179 -0.003550 
+0.000913 -0.003103 -0.000548 -0.005839 -0.002940 0.000719 
+-0.004496 -0.000458 0.002111 -0.003837 0.003116 -0.001441 
+0.005813 0.004187 -0.001627 0.001558 0.002339 0.001364 
+-0.000458 0.000143 -0.000752 -0.002731 -0.002731 0.000692 
+-0.003410 -0.004402 0.002697 -0.005649 -0.002997 0.003804 
+-0.005801 -0.005380 0.000253 -0.003761 -0.001831 -0.000899 
+-0.003726 -0.000435 -0.000310 -0.001940 -0.000242 -0.005280 
+-0.003080 0.003080 -0.006320 0.003493 0.003600 -0.003065 
+0.003235 0.002262 0.000158 0.003136 0.000736 0.000088 
+-0.000019 0.005192 0.001279 0.002579 0.005713 -0.002543 
+-0.000833 0.002818 -0.001297 -0.001910 0.002441 -0.000539 
+-0.001145 0.003716 -0.002123 -0.002494 0.003232 0.000738 
+-0.001142 0.000431 -0.000740 -0.002106 -0.001065 0.002550 
+-0.001463 0.000462 0.002810 -0.002891 0.002506 0.001153 
+0.003008 0.005632 -0.002186 0.003965 0.004307 -0.001615 
+0.001029 -0.000197 -0.000690 -0.001375 -0.000238 -0.001696 
+-0.001356 -0.001653 -0.002521 -0.000277 -0.002512 -0.002252 
+0.000599 -0.000849 -0.003978 0.001826 0.005110 -0.009045 
+0.003407 0.011371 -0.009284 0.003500 0.010000 -0.010875 
+0.004477 -0.000167 -0.007449 0.000460 -0.001710 -0.006543 
+0.006578 -0.001644 -0.013156 0.000089 0.017060 -0.017371 
+-0.002910 0.012244 -0.013550 -0.001370 0.008018 -0.011733 
+-0.002893 0.002149 -0.017857 -0.002918 0.004498 -0.018280 
+0.003433 0.005130 0.001411 0.001515 -0.002207 0.011719 
+0.003788 -0.001760 0.014634 0.004642 0.000143 0.013307 
+0.004000 0.001597 0.003480 0.003689 0.000460 -0.004667 
+-0.005088 0.001069 0.000583 -0.009257 0.001169 -0.007840 
+-0.004685 0.002332 -0.005392 0.000875 0.000932 -0.000030 
+0.002856 -0.000130 0.003169 0.004024 0.001904 -0.000888 
+0.004487 0.004040 -0.005104 0.002460 0.002139 -0.002360 
+-0.003237 -0.003438 0.005123 -0.007665 0.000701 0.008503 
+-0.000631 0.000930 -0.000449 0.000557 -0.001975 -0.004134 
+-0.002863 -0.001184 -0.002583 -0.001148 0.001019 0.000034 
+-0.001673 -0.006401 0.001093 -0.005219 0.000640 0.000450 
+-0.000894 0.000245 -0.001217 -0.001469 0.000376 -0.001670 
+-0.002938 0.000909 -0.001946 -0.003468 0.001257 -0.002663 
+-0.000303 0.003253 -0.004121 0.003840 0.000589 0.000442 
+0.005645 0.005887 -0.005645 0.002258 0.001359 0.000906 
+-0.000605 0.001452 -0.000605 -0.001057 0.000358 0.000179 
+0.002595 0.001212 -0.000360 0.005717 0.004243 -0.003477 
+0.003231 -0.000306 0.000771 0.004210 0.003730 -0.000574 
+0.002333 0.003651 -0.000333 0.002270 0.001995 -0.001719 
+0.001562 0.000061 -0.000427 -0.000274 0.000103 -0.000057 
+-0.002338 -0.000685 -0.000281 -0.002057 0.000807 0.002370 
+-0.003508 -0.001061 0.000938 0.000172 -0.002435 0.001968 
+-0.000296 0.000888 0.001040 -0.000827 -0.000176 -0.001030 
+0.003695 0.001097 0.000772 0.004906 0.001527 0.001577 
+-0.002055 0.002823 -0.001282 -0.000875 0.000149 0.001452 
+-0.001167 -0.000185 0.002890 -0.003553 0.001465 0.000831 
+-0.004362 0.002731 -0.002915 -0.003665 0.002216 -0.003884 
+-0.001537 -0.001259 -0.005356 0.001494 -0.000772 -0.005830 
+0.000854 -0.000854 -0.004228 0.002798 0.003845 0.000235 
+0.001083 0.002542 0.000375 0.000703 0.001547 -0.001405 
+0.001484 0.000561 -0.000339 -0.001333 0.003413 0.000187 
+-0.002273 0.002320 -0.001886 -0.004053 0.000047 -0.005745 
+-0.005223 0.001011 -0.009772 -0.007358 0.002370 -0.007545 
+-0.007716 -0.001271 -0.002104 -0.004036 -0.002807 -0.000084 
+-0.005474 -0.002999 -0.000298 -0.006735 0.000668 -0.000610 
+-0.005033 0.002401 -0.002790 -0.003069 0.004796 -0.007484 
+0.003181 0.007234 -0.009166 -0.000498 0.002841 -0.011310 
+-0.003113 0.003944 -0.018821 0.011639 -0.002956 0.001778 
+0.010124 -0.010256 0.038251 0.389706 -1.139706 5.477941 
+0.662281 -1.030702 6.184210 0.688213 -0.935361 6.361217 
+0.642487 -0.751295 5.409327 0.005344 0.001792 0.023926 
+0.003399 0.020382 -0.014690 0.002716 0.008938 -0.013531 
+-0.000086 -0.002983 0.001695 0.006403 0.003273 -0.001913 
+0.008712 0.005881 -0.005675 0.008441 0.005999 -0.006633 
+0.007195 0.002570 -0.006173 0.004653 0.003285 -0.001543 
+0.002350 0.000597 -0.002286 -0.001009 0.000840 -0.001365 
+-0.003263 -0.000090 -0.001730 0.000238 -0.001357 -0.000684 
+0.002389 0.002805 -0.001386 -0.000468 0.000582 -0.000481 
+-0.002032 -0.002204 -0.000251 -0.000302 0.001216 -0.002222 
+-0.000415 0.007058 -0.005563 -0.002210 0.008225 -0.006286 
+-0.004269 0.002934 -0.003656 -0.002703 -0.001178 -0.002737 
+-0.003237 0.000363 0.000932 -0.002430 0.000099 0.003039 
+-0.002619 0.001059 0.001186 0.001021 0.001633 -0.002443 
+-0.001837 0.001971 -0.002464 0.006154 0.001082 0.001420 
+0.002966 0.001666 -0.000940 -0.003096 -0.000836 0.003548 
+-0.004922 -0.000703 0.000000 -0.002410 -0.000625 -0.000102 
+0.000475 0.000053 -0.003543 -0.000786 -0.001150 0.000485 
+-0.001676 -0.003152 -0.001616 -0.004754 -0.000312 -0.000446 
+-0.003072 -0.001760 -0.000746 0.000192 0.000347 -0.002705 
+0.000469 0.000867 -0.001907 -0.001685 -0.000183 0.002015 
+-0.001315 -0.000227 0.004944 0.000000 -0.001333 0.002000 
+-0.000120 0.000361 0.000210 0.001173 0.003321 0.000111 
+-0.001990 0.000459 -0.000267 -0.000116 0.000146 -0.000522 
+-0.000188 0.000903 0.000288 -0.000695 0.000947 -0.000444 
+-0.001696 0.000802 -0.000987 -0.002084 0.001439 -0.000708 
+-0.001841 0.001669 -0.000288 -0.000402 0.001075 0.001007 
+-0.001457 0.001135 0.002758 -0.004917 0.001442 0.005485 
+-0.007398 -0.000117 0.004737 -0.002805 0.001422 0.001908 
+-0.000767 0.004053 -0.001109 -0.002705 0.003247 -0.000631 
+-0.005514 0.002213 -0.003955 -0.008241 0.006167 -0.006736 
+0.001392 0.015056 -0.012508 -0.006136 0.004320 -0.003407 
+-0.003672 -0.000085 -0.001129 -0.007117 0.000848 -0.006808 
+-0.009381 0.003271 -0.006715 -0.007182 0.002073 -0.000862 
+-0.001704 -0.001175 -0.000178 0.000255 0.001428 -0.006887 
+0.002146 0.003023 -0.012093 0.000713 0.002416 -0.010025 
+-0.000720 0.002995 -0.010868 -0.004554 -0.119382 0.032042 
+0.008788 -0.027740 0.053143 0.434146 -1.253659 6.395122 
+0.647783 -1.086207 7.056650 0.674847 -1.077710 7.208589 
+0.671053 -0.997368 6.871053 0.646409 -0.535912 5.077348 
+0.003680 0.009725 -0.006428 -0.007919 0.003618 -0.023959 
+0.004348 -0.003333 0.004348 -0.001143 0.000643 0.005153 
+0.016831 0.022575 -0.034482 0.003654 0.027145 -0.027333 
+0.001585 0.002091 -0.000465 -0.000877 -0.001924 0.007405 
+0.000277 0.003832 0.001545 0.001140 0.006751 -0.003410 
+-0.000745 0.002555 -0.000638 0.001627 0.001533 0.002271 
+0.003091 0.003509 -0.000585 0.006217 0.009193 -0.003322 
+0.002012 0.010743 -0.006714 -0.002065 0.004536 -0.010562 
+0.002338 0.003866 -0.012228 0.001252 0.005779 -0.013200 
+-0.001291 0.004945 -0.008480 -0.001852 0.001439 -0.003017 
+-0.000552 0.000301 -0.001005 -0.000662 0.002265 -0.000941 
+0.000596 -0.000170 -0.001053 -0.001912 0.001835 -0.004677 
+-0.004574 0.001991 -0.005500 0.001293 0.005485 -0.000686 
+0.001463 0.005344 -0.003335 -0.000847 0.003621 -0.001165 
+-0.000945 0.000856 -0.000361 0.000045 -0.000156 -0.001449 
+-0.001243 -0.001031 -0.001148 -0.003038 -0.002073 0.002416 
+-0.002417 -0.002595 0.006291 -0.000042 -0.000954 0.005143 
+-0.000746 -0.000149 -0.000086 0.000583 0.003678 -0.005353 
+-0.000910 0.004474 -0.006269 -0.003873 0.001365 -0.002675 
+-0.004670 -0.003282 0.000240 -0.003267 -0.001633 -0.000933 
+-0.002307 -0.000941 -0.000685 -0.000219 -0.001243 -0.000806 
+-0.000470 0.002775 -0.000505 -0.000212 0.000925 0.000441 
+0.000916 -0.001028 -0.003515 0.000178 -0.000055 -0.002910 
+0.000191 -0.000039 -0.002019 -0.002114 0.001931 -0.003393 
+0.003125 0.007202 -0.002966 0.000348 0.005569 -0.001423 
+-0.001609 0.001898 -0.000022 0.001763 0.003127 0.002212 
+0.002529 0.005188 0.001643 -0.004025 0.003328 0.001933 
+-0.002091 0.003036 -0.002738 -0.003722 -0.000372 -0.006054 
+-0.006943 -0.001472 -0.008980 -0.007735 -0.001610 -0.007311 
+0.001682 -0.003134 -0.005121 -0.001166 0.005265 -0.007155 
+-0.001130 0.000858 -0.004305 -0.000073 0.000343 -0.001445 
+-0.003034 -0.001381 0.003179 -0.003792 -0.005896 0.005734 
+0.000194 -0.005061 0.003695 0.000222 -0.000489 0.001412 
+-0.000113 -0.003024 -0.001714 -0.004652 -0.014519 -0.007934 
+-0.004329 -0.006265 0.004854 0.003349 0.014283 -0.025555 
+-0.001670 0.001597 0.023990 0.665217 -0.526087 6.239130 
+0.669492 -0.906780 7.033898 0.590452 -0.959799 6.688442 
+0.555556 -0.621622 5.573574 0.532710 0.214953 3.649533 
+0.002879 0.009298 0.008525 -0.003836 0.004891 -0.015930 
+-0.010356 -0.001860 0.013291 -0.004211 -0.011754 0.011754 
+0.005261 0.002304 -0.011653 0.008722 0.010404 -0.022178 
+0.005919 0.005282 0.001140 -0.001714 0.005081 0.016999 
+-0.000546 0.006273 0.008160 0.002809 0.004981 -0.003100 
+0.002772 0.003168 -0.005941 -0.000933 0.004198 -0.003654 
+0.002336 0.003068 -0.001346 0.006212 0.005468 -0.003543 
+0.008804 0.000713 -0.000080 -0.001380 -0.000131 -0.004982 
+-0.000345 0.000628 -0.004747 -0.001404 -0.002299 -0.006543 
+-0.002829 0.000207 -0.003193 0.000595 0.001376 -0.000390 
+-0.000141 0.001783 0.000270 -0.000840 0.002227 -0.002118 
+-0.002631 0.003793 -0.001209 -0.004487 0.003680 -0.000969 
+-0.002317 0.007299 -0.004094 -0.001910 0.007093 -0.009123 
+-0.000220 0.007470 -0.006246 -0.001265 0.001896 0.000271 
+-0.005790 -0.005004 0.003975 0.001908 -0.000411 0.001498 
+-0.002526 -0.003347 0.004204 0.001279 0.004021 -0.003207 
+0.001956 0.008586 -0.008260 0.003932 0.007436 -0.003932 
+0.000695 0.002185 -0.003474 0.000639 -0.001230 -0.000213 
+-0.001099 -0.000480 -0.001254 -0.001083 0.004843 -0.005926 
+-0.002727 0.007309 -0.010617 -0.002316 0.006672 -0.009080 
+-0.002916 0.002414 -0.001348 -0.000251 -0.004819 0.004041 
+-0.001572 0.003643 -0.002088 0.002635 0.004674 -0.000640 
+0.003268 0.002792 0.002020 0.002967 0.000698 -0.004713 
+-0.000115 0.004159 -0.004188 -0.001162 0.000185 -0.000076 
+-0.000470 0.000067 -0.000312 0.000233 -0.000775 0.000000 
+0.001164 0.000844 0.000535 0.001145 0.002540 0.000229 
+0.000140 0.003962 0.004510 0.004466 0.003203 0.002951 
+-0.001663 0.002806 -0.000187 0.000355 -0.001451 -0.001035 
+0.001449 -0.003039 -0.002264 0.000368 -0.000624 0.002457 
+-0.000522 -0.007217 -0.001243 0.001953 -0.006158 -0.000690 
+-0.002050 -0.007791 0.000707 -0.004162 -0.006023 0.002944 
+-0.003304 -0.005120 0.005317 -0.001303 -0.004056 0.002014 
+-0.000076 0.001791 -0.003460 0.002758 0.004989 -0.005137 
+0.001632 0.000674 0.001797 -0.004043 -0.001561 -0.001507 
+-0.010895 0.005957 -0.029981 0.008742 0.005130 -0.038496 
+0.001591 0.003513 0.012690 0.837696 -0.047120 5.821990 
+1.164336 -0.409091 6.164336 1.254967 -0.493377 5.221854 
+1.045833 -0.266667 3.408333 0.001268 0.000129 0.011440 
+-0.004570 0.006630 -0.007437 -0.002845 0.003388 -0.006942 
+0.001249 -0.009993 0.011905 0.003894 -0.005599 0.000730 
+0.000884 -0.000983 -0.010020 -0.006980 -0.002618 -0.007174 
+-0.000067 -0.001647 -0.005271 0.000975 -0.011655 -0.002000 
+-0.000005 -0.001438 0.001664 0.007230 0.005798 0.002514 
+0.010108 0.006120 0.003520 0.006881 0.002649 0.002555 
+0.002250 -0.001173 -0.000220 -0.000083 -0.001015 -0.000782 
+0.001609 0.000617 -0.000940 0.002586 0.001339 -0.002733 
+0.002207 -0.000049 -0.002859 0.002307 0.001615 -0.001524 
+0.005633 0.005803 0.001198 0.002992 0.007940 -0.000345 
+0.001693 0.005566 -0.004027 -0.001481 0.002682 0.000596 
+-0.001634 0.002561 -0.001317 -0.001158 0.001396 -0.001393 
+-0.002476 0.004328 -0.002703 -0.001542 0.005861 -0.004207 
+-0.003864 0.003150 -0.000840 -0.002830 0.001231 -0.000514 
+-0.000674 0.000578 0.001220 0.000143 0.000376 -0.000645 
+0.002183 0.000250 -0.001914 0.002762 -0.000555 -0.004339 
+0.006366 0.003137 -0.004048 0.002197 -0.000824 -0.004988 
+-0.006849 0.000035 -0.006255 -0.002823 0.002793 -0.002944 
+-0.003287 -0.002918 -0.001137 -0.000410 0.003610 0.000722 
+0.000661 0.004959 0.003140 -0.001549 -0.000060 0.000684 
+-0.004073 0.002171 -0.002709 -0.001125 0.000075 -0.001426 
+-0.000792 0.004323 -0.007073 0.000512 0.007490 -0.007035 
+-0.001990 0.008711 -0.004823 -0.003721 0.006210 -0.002107 
+-0.000401 0.001523 -0.003247 0.000521 0.000243 0.000287 
+0.001004 -0.001196 0.001435 0.001395 0.000164 0.000145 
+0.001208 0.003100 0.000893 -0.000689 0.003721 -0.002894 
+0.004664 0.001267 0.002781 -0.000187 0.007400 -0.011272 
+-0.003775 0.002336 -0.006742 -0.002487 0.001334 -0.003084 
+0.000158 -0.002149 -0.000026 0.002414 -0.003837 -0.001360 
+-0.000162 -0.005060 -0.002676 -0.000458 -0.002366 -0.000735 
+-0.001635 -0.001352 0.000864 -0.005562 -0.004397 0.002308 
+-0.005706 -0.005713 0.003055 -0.003502 -0.001826 0.000760 
+0.000207 0.000706 -0.003820 0.002310 0.002376 -0.005148 
+0.004464 0.001136 -0.001988 0.005017 0.001225 -0.000993 
+0.002780 0.001568 -0.008952 -0.000687 -0.000335 -0.020570 
+-0.004466 0.000769 -0.009792 0.008223 0.005234 0.005692 
+0.012782 0.000929 0.009442 0.009712 -0.001684 0.005087 
+0.001593 -0.000322 -0.002478 -0.000600 0.002060 -0.010044 
+0.001537 -0.010314 -0.004690 -0.010851 -0.001440 0.010323 
+-0.000929 -0.000086 0.001459 0.002478 0.003424 -0.013083 
+0.002615 0.002617 -0.014747 0.000429 0.000336 -0.005547 
+-0.001164 -0.000097 0.000288 0.001329 0.000203 -0.001015 
+0.006777 0.002087 -0.005916 0.008967 0.010060 -0.005007 
+0.005399 0.007176 -0.002472 0.004440 0.004585 0.000676 
+0.008260 0.004695 -0.000441 0.010008 0.007703 -0.003773 
+0.009388 0.002470 -0.008866 0.005664 0.000700 -0.011137 
+0.003216 -0.001783 -0.009961 0.002345 0.003472 -0.009018 
+0.004218 0.001647 -0.007284 0.001824 0.000197 -0.004192 
+-0.001955 -0.002438 -0.000718 0.000037 0.000185 0.000481 
+0.000459 -0.003113 0.002674 -0.000024 0.001024 -0.002028 
+-0.003610 0.003650 -0.003756 -0.003806 0.006217 -0.001714 
+-0.004242 0.002303 0.000288 -0.005464 -0.002803 0.000497 
+-0.003954 -0.003609 -0.001582 0.000247 0.000008 -0.000334 
+0.000016 0.002336 -0.001085 0.001421 0.004986 0.000962 
+0.000904 0.003794 0.002860 0.001617 0.001500 0.001525 
+-0.000211 0.000183 0.000552 -0.000177 0.000336 0.002173 
+0.001728 0.001297 0.002583 -0.002362 0.001526 -0.000084 
+-0.000823 0.002163 -0.002783 0.001454 0.001651 -0.002874 
+0.000000 0.001880 -0.000376 -0.000451 0.002121 0.001204 
+0.002576 0.002341 -0.003813 -0.001460 0.003164 0.001406 
+-0.002512 0.004535 -0.001064 -0.000810 0.002882 -0.002231 
+0.000752 0.001249 0.002562 0.002591 0.001083 0.001050 
+0.001095 0.000476 0.001844 0.000165 0.000784 0.000416 
+0.004557 0.002703 -0.001416 0.004648 0.003825 -0.001645 
+0.001951 -0.000778 0.000606 -0.001186 0.002039 0.000454 
+-0.001517 0.002959 0.000018 0.000590 0.001478 0.001713 
+0.004060 -0.001887 0.001200 0.000381 -0.000395 0.003382 
+-0.004563 0.000225 0.000698 -0.007262 0.002619 -0.001607 
+-0.005687 0.001794 0.000394 -0.001337 -0.001720 0.000669 
+-0.000568 -0.000906 -0.000216 -0.001173 -0.001904 -0.003780 
+-0.001662 0.000722 -0.006263 -0.001106 0.001045 -0.001655 
+0.000217 -0.000176 0.002230 0.000800 0.000200 0.001409 
+-0.001338 -0.000396 -0.003037 -0.002007 0.000267 -0.005475 
+-0.001238 0.000431 -0.002773 -0.000750 -0.000192 -0.000759 
+-0.001637 -0.000829 -0.005332 0.003918 0.001845 -0.016460 
+0.012600 0.012987 -0.010840 0.006531 -0.001599 -0.000863 
+-0.000106 -0.002601 -0.006455 -0.000507 -0.001147 -0.009071 
+0.001910 0.000485 -0.009497 0.001340 0.001335 -0.004798 
+-0.002708 0.000113 0.000838 -0.004729 -0.000371 0.002353 
+-0.001788 -0.000445 0.000576 0.003548 0.001534 -0.001779 
+0.005642 0.002548 -0.004911 0.003262 0.001054 -0.007822 
+0.002368 -0.001291 -0.006086 0.000874 0.002899 0.002767 
+0.000980 0.009106 0.002050 -0.001533 0.004977 -0.004986 
+0.001858 0.001062 -0.007699 -0.001000 0.001512 -0.003591 
+-0.002373 -0.002955 -0.001823 -0.000223 0.001118 -0.002569 
+0.004646 0.001119 -0.002224 0.005657 0.006388 -0.008083 
+0.001598 0.003439 -0.003965 -0.000205 -0.001621 0.000996 
+0.002497 -0.001967 0.000258 0.003706 0.003785 -0.002356 
+-0.001136 0.001383 0.000123 -0.002000 0.004000 -0.009474 
+0.001356 0.002390 -0.005490 0.000205 0.001076 -0.000694 
+0.000833 0.000250 0.000076 0.001102 0.001875 0.000367 
+0.003517 0.002861 -0.000656 0.002358 0.005823 -0.001802 
+0.003281 0.005109 -0.004356 0.002561 0.004527 -0.006405 
+0.001548 0.003145 -0.008339 0.001095 0.004004 -0.006262 
+0.000934 -0.000484 -0.004947 0.001475 -0.003237 -0.001095 
+0.002585 -0.003102 -0.000591 0.002167 -0.000206 -0.004664 
+0.000392 -0.001636 -0.004594 0.001309 0.000358 -0.000592 
+-0.000707 -0.000010 -0.001441 0.000777 -0.000019 0.000338 
+0.003983 0.001796 -0.000056 0.001562 -0.000781 -0.003359 
+0.002788 0.001324 0.000395 -0.000981 0.000332 0.000917 
+0.000769 -0.002993 0.000028 -0.000551 -0.005820 -0.000393 
+0.000504 0.000420 0.001429 -0.000677 0.001704 -0.004319 
+0.000205 -0.000871 -0.008550 -0.002859 -0.000153 -0.004377 
+-0.001120 -0.003979 -0.002928 0.000785 -0.004474 -0.001850 
+0.000217 0.001367 -0.001794 -0.001216 0.006844 -0.004571 
+-0.001199 0.003523 -0.006348 -0.002725 0.001733 -0.004224 
+-0.006594 -0.002887 -0.002428 -0.006451 -0.002636 0.000972 
+-0.002074 -0.000065 0.001524 -0.000505 0.000343 0.000227 
+0.000385 -0.000267 -0.001411 -0.000616 -0.002466 -0.002055 
+0.002609 0.000810 -0.000990 0.004196 0.004098 -0.004171 
+0.001893 -0.001679 -0.001571 0.002207 0.001692 -0.007627 
+0.002195 0.002365 -0.004858 0.000778 0.001597 -0.004228 
+0.002070 0.001966 -0.005736 0.004956 0.002088 -0.007417 
+0.008791 0.000471 -0.007182 0.008790 -0.001856 -0.004819 
+0.005306 -0.001767 -0.004371 0.003696 -0.000285 -0.006252 
+0.002868 0.001010 -0.004883 0.001615 0.000174 -0.000770 
+0.000292 0.000250 0.001377 0.000434 0.000183 0.000081 
+0.002508 -0.000739 -0.003397 0.002415 0.001017 -0.006673 
+-0.000514 0.000385 -0.002860 -0.005233 -0.002035 0.002792 
+-0.007705 -0.004226 0.006119 -0.005156 -0.004208 0.005608 
+-0.001446 -0.001239 0.001107 0.000128 0.006088 0.002789 
+0.000811 0.003002 0.004145 -0.000720 0.000041 0.000473 
+0.000807 0.002259 -0.004487 0.006147 0.004555 -0.009401 
+0.011446 0.007577 -0.012118 0.004835 0.012087 -0.009787 
+0.004186 0.008919 -0.005437 0.002464 0.004955 -0.004666 
+0.004756 0.000782 -0.006623 0.001519 -0.002025 -0.009844 
+0.004339 0.004868 -0.007831 0.000744 0.004579 -0.005441 
+0.000938 0.003642 -0.003863 0.002899 0.002101 -0.002101 
+0.000403 0.002298 -0.001989 0.000738 0.002769 -0.004985 
+0.001663 0.004157 -0.007016 0.003937 0.002652 -0.001558 
+0.000071 0.002495 0.000446 0.000875 -0.000488 0.000618 
+0.000374 -0.001577 -0.000348 -0.002822 -0.000972 -0.000175 
+-0.002051 0.000084 -0.002026 -0.000029 0.000034 -0.002143 
+0.001547 -0.000773 -0.001550 0.002275 -0.000486 -0.001636 
+-0.002615 -0.001152 -0.001618 -0.002762 -0.004754 -0.001841 
+-0.001556 0.000615 -0.000346 -0.001361 -0.000534 -0.000146 
+-0.002691 0.000017 0.002778 -0.004428 0.001555 0.002450 
+-0.003876 0.001573 -0.001966 -0.001672 0.005156 -0.000929 
+-0.000331 0.001604 0.000990 0.002044 -0.002123 -0.002362 
+0.005835 -0.002180 -0.000449 0.004438 -0.002740 -0.002817 
+0.000693 0.000788 0.000450 -0.000726 0.000391 -0.000462 
+-0.000144 -0.000765 -0.000756 -0.001295 -0.002893 0.001394 
+-0.003539 0.001242 -0.001238 -0.006746 0.008932 -0.008162 
+0.000774 0.012380 -0.017022 0.001052 0.014488 -0.015125 
+0.003098 0.008090 -0.012484 0.003027 0.001462 -0.005269 
+0.000763 -0.000172 0.000080 -0.001407 0.000967 -0.000679 
+-0.001628 0.000486 -0.004178 -0.001426 -0.002179 -0.005545 
+-0.001229 -0.001333 -0.004718 0.000743 -0.000503 -0.001019 
+0.001644 -0.000949 0.002593 0.000195 0.000854 0.003999 
+-0.001861 -0.000878 0.000773 -0.001714 -0.000270 -0.003671 
+-0.000031 0.000306 -0.006088 0.001605 0.000703 -0.006136 
+0.003118 0.001623 -0.005749 0.005446 0.003350 -0.006071 
+0.003226 0.001890 -0.006561 0.001038 0.004948 -0.001678 
+-0.001328 0.000125 0.001454 -0.005200 0.000917 -0.001938 
+-0.003178 0.003178 -0.005814 0.003883 0.003975 -0.002573 
+0.000000 -0.001694 -0.001694 -0.001393 -0.001666 -0.003779 
+-0.000613 -0.001508 -0.003330 0.002453 -0.001296 -0.002322 
+0.000809 0.000257 0.000049 -0.003426 -0.003606 0.001966 
+-0.002182 -0.001585 -0.002401 -0.003821 0.002754 -0.000019 
+0.005018 0.004176 -0.002856 -0.001511 0.005350 -0.003595 
+-0.000847 -0.000710 -0.000687 0.002366 0.003519 -0.001731 
+0.002629 0.008302 -0.002289 -0.002768 0.010000 -0.006090 
+0.003096 0.008760 -0.007668 0.004902 0.005757 -0.005271 
+0.004053 0.003068 -0.002597 0.002842 0.000496 -0.000866 
+0.002161 0.001296 -0.001846 0.003178 -0.000966 -0.000644 
+0.004567 -0.000134 -0.003868 0.000738 0.001558 0.000807 
+-0.004328 0.001134 -0.000567 -0.002459 -0.000558 -0.000124 
+0.000556 0.002467 -0.002626 0.002373 0.001460 -0.004270 
+0.000980 0.000178 -0.000152 -0.000027 -0.001907 0.001862 
+-0.002853 0.001635 -0.000731 -0.004425 -0.000718 -0.001701 
+-0.003874 -0.000315 -0.003086 -0.001774 -0.000924 0.000121 
+0.001071 0.000525 -0.002436 0.000622 0.003361 -0.002958 
+-0.001526 0.001116 0.000147 -0.000693 -0.000611 -0.000795 
+0.000611 0.004263 -0.003197 -0.001450 0.004206 -0.002629 
+-0.002859 0.001371 -0.002830 -0.000410 0.001754 -0.000672 
+0.000254 0.002700 -0.000337 -0.000900 0.001319 -0.000949 
+0.001866 -0.002805 -0.001720 0.003053 0.003435 -0.002373 
+0.001371 0.004120 -0.001347 -0.001650 0.003563 0.000297 
+-0.003865 0.003759 -0.002600 -0.004327 0.002767 -0.004285 
+-0.000324 0.000082 -0.004215 0.005250 -0.003570 -0.001438 
+0.003980 -0.003596 0.000918 -0.002142 0.004076 -0.002215 
+-0.005398 0.010292 -0.014113 -0.000230 0.014186 -0.015921 
+-0.003910 0.011621 -0.010501 -0.004847 0.002075 -0.005537 
+-0.000652 -0.004461 -0.001090 0.001742 -0.000672 0.000123 
+0.003672 0.003940 0.000106 0.003381 0.003455 -0.002457 
+0.000573 0.000648 -0.001027 0.001222 0.001293 -0.001373 
+0.000769 0.003552 -0.001865 -0.001287 0.002482 -0.002080 
+-0.002655 0.001058 -0.001381 -0.000665 0.002346 -0.003454 
+-0.000273 0.005454 -0.000695 -0.000325 0.004095 0.001094 
+-0.001021 0.001299 -0.001095 0.000550 -0.001178 -0.001440 
+0.000286 -0.002516 -0.002174 0.001200 0.002120 -0.002920 
+-0.000045 0.000392 -0.001495 -0.000294 0.000617 -0.000890 
+0.000281 0.003348 0.000622 -0.000676 0.000086 -0.001293 
+0.000212 -0.000401 -0.000754 -0.002045 -0.000638 0.000491 
+-0.000986 -0.000890 -0.000970 -0.000978 0.000281 -0.002014 
+0.000240 -0.000498 -0.000468 -0.000200 0.000063 0.001536 
+-0.000119 -0.001010 0.004529 0.000770 0.000135 0.000653 
+-0.002470 0.004730 -0.004690 -0.003060 0.003531 -0.000273 
+0.003221 0.003555 0.000632 0.000388 0.001977 0.000402 
+-0.000511 0.001656 0.000200 0.002576 0.000415 -0.002102 
+0.005892 0.000744 -0.003804 0.005941 -0.000120 -0.002774 
+0.003297 -0.001371 -0.001423 0.000882 -0.002490 -0.000783 
+-0.000863 -0.001216 -0.002272 0.000170 0.000073 0.001172 
+-0.001672 0.001356 0.000613 -0.000465 0.003359 0.001315 
+0.000524 0.003214 0.000248 -0.001814 0.003501 -0.002019 
+0.000305 0.000868 -0.000952 -0.001272 0.000966 0.002221 
+-0.002326 0.001820 0.000710 -0.003069 0.000497 -0.001881 
+-0.000385 0.002456 -0.000308 0.002903 0.003226 -0.001613 
+0.001621 0.000366 0.001499 -0.001237 -0.004499 0.000675 
+-0.005848 -0.007774 0.001445 -0.007796 -0.004810 0.001459 
+-0.003659 -0.000460 -0.002298 -0.000913 -0.000768 -0.001480 
+-0.000983 0.001298 0.003998 0.000420 0.000175 0.000186 
+0.001703 -0.000527 -0.004109 0.003813 0.000677 -0.004774 
+0.001940 -0.001386 -0.000594 -0.000921 0.002085 -0.000247 
+0.000563 0.002327 -0.002402 -0.001730 -0.000587 -0.003492 
+0.005009 0.003247 -0.006030 0.001635 -0.002016 -0.001732 
+0.002788 -0.003146 -0.000709 0.002106 -0.004664 -0.000030 
+0.003725 -0.001219 -0.001756 0.000602 -0.000918 -0.000643 
+-0.001801 -0.006087 0.001143 -0.001414 -0.006395 0.001911 
+-0.002934 0.001115 -0.006049 -0.004472 0.006589 -0.010155 
+-0.003064 0.009886 -0.008708 0.000182 0.007127 -0.008397 
+0.000750 0.003275 -0.005045 0.003571 0.003280 -0.000539 
+0.003070 0.006114 0.000465 0.004636 0.001807 -0.003502 
+0.001866 0.001583 -0.003305 0.001533 -0.000891 0.000463 
+-0.000218 -0.000866 -0.001051 0.000262 0.003292 -0.001320 
+0.002553 0.003380 -0.003931 -0.000539 0.001606 -0.004454 
+-0.000662 -0.000228 -0.004443 0.000287 -0.001375 -0.004769 
+0.001272 -0.001099 -0.004107 0.005079 0.001587 -0.004127 
+0.000156 0.003341 -0.005012 -0.001686 -0.001727 0.000286 
+-0.005329 -0.001748 0.003028 0.000750 0.001027 0.002119 
+-0.001043 0.002842 0.002195 -0.000949 0.005620 0.002336 
+0.000241 0.005720 -0.001640 0.000124 0.001477 -0.000336 
+0.000478 0.000664 0.000115 -0.000689 0.005272 -0.002259 
+0.003016 0.010241 -0.007609 0.007498 0.008000 -0.011634 
+0.006009 0.005952 -0.010380 0.003154 0.002965 -0.005441 
+0.000209 0.002195 -0.003247 0.001589 0.007432 -0.004580 
+0.007538 0.011569 -0.003553 0.009358 0.010390 -0.008936 
+0.003994 0.005046 -0.008968 -0.003210 -0.003691 -0.002086 
+-0.003982 -0.003669 0.000913 -0.001268 -0.000925 0.000647 
+0.002287 0.002947 -0.000960 0.004924 0.004115 -0.001634 
+0.004891 0.002975 -0.001065 0.002840 0.000376 0.000590 
+0.000605 -0.001276 -0.000231 -0.000359 -0.001848 -0.001144 
+-0.000433 -0.000995 -0.000293 -0.002273 -0.000358 0.000609 
+-0.001828 0.000139 -0.001454 0.000671 -0.001463 0.000776 
+-0.004139 -0.003651 -0.002759 -0.002126 0.001024 -0.000079 
+0.001641 0.003297 -0.006594 0.007244 0.000787 -0.003228 
+0.007357 0.002276 -0.001927 0.003435 0.002061 -0.008160 
+0.003663 -0.002445 -0.001901 -0.000459 0.002087 -0.000747 
+-0.001908 0.000658 -0.002105 -0.002928 0.001481 -0.001774 
+0.002975 -0.000992 0.002727 0.002033 0.004065 0.000000 
+0.000114 0.003762 -0.001767 -0.001190 0.001925 -0.000227 
+0.001085 0.004460 0.002097 0.005333 0.008101 -0.002314 
+-0.000674 0.000363 -0.001545 0.000877 0.000014 -0.000698 
+-0.000386 0.002814 -0.000190 -0.000090 0.002380 0.001447 
+0.000720 0.003190 0.002096 -0.000620 0.004013 -0.002080 
+-0.000630 0.003924 0.001098 -0.000918 0.002959 -0.004286 
+-0.000621 0.000598 0.000759 0.000690 -0.000760 0.001218 
+-0.000267 0.005009 -0.002406 -0.000981 0.005871 -0.005405 
+-0.001095 0.003813 -0.004509 0.000691 0.001708 -0.001982 
+0.002762 -0.000419 -0.000370 0.000240 -0.000826 -0.003235 
+-0.000011 0.001458 0.000832 0.000712 0.002417 -0.002774 
+0.000335 -0.000822 0.000394 0.000948 -0.001746 0.001407 
+0.000663 -0.000745 0.000578 0.001092 0.001581 -0.000668 
+-0.000523 0.000669 -0.001922 -0.001174 0.000755 -0.000436 
+-0.000636 0.000809 -0.000487 0.000073 0.000202 -0.000497 
+0.002664 -0.000249 -0.001216 0.000002 -0.001720 -0.004296 
+0.001781 -0.000281 -0.007783 0.004274 0.002714 -0.006468 
+0.002901 0.001644 -0.008221 0.000724 0.003252 -0.009215 
+0.004328 0.005000 0.000224 0.000925 0.000025 -0.001514 
+0.000523 -0.001788 0.002421 -0.000186 -0.001381 0.001829 
+-0.000155 0.001419 -0.004256 0.001018 0.003017 -0.007706 
+0.000586 0.006350 -0.004950 -0.000640 0.006045 -0.001195 
+-0.000224 -0.000220 -0.000628 -0.000873 0.000302 -0.002921 
+-0.003897 -0.001840 -0.001897 -0.004219 0.001621 -0.000727 
+0.000690 0.000182 0.001438 -0.000753 0.000691 -0.000129 
+-0.001119 0.003470 0.002108 -0.000634 0.001243 0.003001 
+-0.001531 -0.002121 0.000058 0.004902 0.004047 -0.005858 
+0.007816 0.006300 -0.007295 0.005285 0.003140 -0.000330 
+-0.001202 -0.000777 -0.001078 -0.002276 -0.001142 -0.001855 
+-0.003456 -0.002507 -0.001249 -0.003159 -0.003408 0.001644 
+-0.003752 -0.001205 0.003015 -0.004453 0.000845 0.001246 
+-0.000224 0.000672 0.000672 -0.003000 -0.003000 0.001308 
+-0.000761 -0.000299 -0.001758 -0.000737 -0.000768 -0.002541 
+0.002288 0.000217 -0.003379 0.001479 0.001316 -0.005579 
+-0.000042 0.001370 -0.006978 -0.000492 0.001899 -0.006647 
+-0.002317 0.000846 -0.002171 -0.001664 0.001092 -0.000859 
+-0.002424 0.001470 -0.002015 -0.002664 0.002664 -0.001533 
+0.000696 0.009871 -0.003197 0.003105 0.006490 -0.001129 
+0.007077 0.003127 -0.003847 0.009424 0.003137 -0.003935 
+0.006836 0.005313 0.001367 0.005276 0.003133 -0.004028 
+0.003727 0.003645 -0.003230 -0.000053 0.003730 -0.000058 
+-0.000314 0.003905 0.001501 0.001424 0.005232 0.002851 
+0.003604 0.006327 0.000451 0.005149 0.007327 0.001188 
+-0.001193 0.006205 0.002442 0.001131 0.005907 0.003108 
+0.002611 0.002027 0.000373 -0.000227 0.001037 -0.000528 
+-0.000806 0.003792 0.000026 0.000208 0.003236 -0.000031 
+-0.000498 -0.001116 -0.000528 0.000786 -0.000931 0.000207 
+-0.001487 0.001683 -0.001605 0.001245 -0.000087 -0.000977 
+0.001367 0.002627 -0.001747 0.002429 0.000229 -0.000509 
+0.001212 -0.001119 0.000125 -0.000957 0.001544 -0.003350 
+-0.000478 0.005236 -0.004391 0.002504 0.005354 -0.002319 
+0.005700 0.001966 -0.002269 0.001571 -0.001121 -0.005053 
+-0.000536 -0.000261 -0.001437 0.001550 0.002419 0.000806 
+-0.001484 0.001154 -0.005000 -0.001788 -0.000732 -0.004535 
+-0.001443 -0.002147 -0.002137 -0.000534 -0.002047 -0.000089 
+0.001414 -0.000592 -0.000382 0.001113 0.001800 -0.001031 
+-0.000465 0.000293 0.000234 0.000065 -0.000046 0.000062 
+0.000600 -0.001451 0.001826 0.001322 0.000504 -0.000420 
+-0.000291 0.004983 -0.002385 -0.002564 0.005113 -0.001925 
+-0.001151 0.002474 -0.000033 -0.000219 0.000950 -0.000190 
+-0.000779 0.000109 -0.000676 -0.000607 0.001537 -0.001720 
+-0.000451 0.003924 -0.002634 -0.001597 0.004577 -0.002383 
+-0.003691 0.003750 -0.000077 -0.001612 0.001243 0.001880 
+0.002943 -0.000429 0.000753 0.005577 -0.000379 0.002220 
+0.007467 0.004852 -0.002304 0.005146 0.003325 -0.002617 
+0.004608 0.003134 -0.001749 0.001806 0.003239 0.000576 
+-0.002177 0.001678 0.000154 -0.002237 -0.002400 -0.000927 
+0.001219 -0.004185 0.005932 0.003347 -0.003495 0.002245 
+0.001518 -0.002901 0.000138 -0.003177 -0.001177 -0.000618 
+-0.006212 -0.001108 0.002381 -0.004664 0.000099 0.003153 
+-0.003173 0.001568 0.000789 -0.002862 0.001115 -0.000476 
+-0.002863 0.001336 -0.001147 -0.002388 -0.001082 -0.001082 
+-0.001581 -0.000962 -0.001676 -0.002457 -0.000216 -0.000065 
+-0.002669 0.001185 0.001175 -0.003981 0.002925 -0.000814 
+-0.000920 0.007854 -0.003290 -0.001963 0.004780 -0.000916 
+-0.001152 0.000955 -0.001837 0.000006 0.006526 -0.004075 
+-0.001677 0.006730 0.000002 -0.001545 0.000906 0.000943 
+-0.000016 -0.000152 0.000011 -0.001360 0.001590 0.000242 
+0.002517 0.006709 -0.001557 0.000289 0.005817 0.002694 
+-0.001388 0.003599 0.001362 -0.001110 0.001231 -0.000749 
+-0.005497 -0.002440 -0.001723 -0.002894 0.005194 -0.001972 
+-0.000362 0.006506 0.000559 0.000731 0.006811 0.000890 
+0.001933 0.004784 -0.004854 0.000820 -0.001487 -0.001740 
+0.001331 -0.002279 -0.000982 -0.000124 -0.001149 -0.003348 
+0.002259 0.002322 -0.003038 0.000759 0.003429 -0.000666 
+-0.000942 0.006014 -0.000942 -0.000390 0.006842 -0.007430 
+-0.000249 0.005721 -0.007545 0.000836 0.000976 -0.004231 
+0.000743 -0.000273 -0.001851 0.001912 0.000000 -0.002279 
+0.002593 0.001141 -0.002281 0.002330 0.002099 -0.002041 
+0.003066 0.002555 -0.003577 -0.000926 0.001141 -0.003557 
+-0.001336 0.000617 -0.003057 0.004486 -0.000532 -0.006083 
+-0.002188 -0.002422 -0.004375 -0.002134 -0.002012 -0.003955 
+0.003672 -0.000008 -0.003685 0.001979 0.007195 -0.004735 
+0.004810 0.005772 -0.005426 -0.003464 0.000926 -0.000228 
+-0.005577 0.005923 -0.005577 -0.001643 0.003692 -0.006570 
+-0.000078 0.000701 0.000292 -0.001210 0.000554 0.000101 
+0.000769 0.002479 0.001197 -0.001739 0.004636 -0.003692 
+-0.002902 0.002768 -0.001720 -0.001394 0.003333 -0.000349 
+-0.004370 -0.003463 -0.000144 -0.005946 -0.000562 0.002012 
+-0.001854 -0.000500 -0.001043 -0.000020 0.005958 -0.002774 
+-0.000990 0.009805 -0.003647 -0.003057 0.004389 -0.000893 
+0.002003 -0.001794 -0.002201 0.008592 -0.001268 -0.006338 
+0.016458 0.007330 -0.007898 0.013333 0.010811 -0.005135 
+0.006816 0.005994 -0.001289 0.002622 0.001920 -0.000194 
+0.001081 -0.000562 -0.000616 -0.000739 -0.001449 0.000013 
+-0.000762 -0.001302 0.000416 -0.003053 -0.001466 0.000680 
+-0.001015 -0.000560 -0.000993 -0.000154 0.000198 -0.000473 
+0.002631 0.000173 -0.003498 0.001682 0.000118 -0.001493 
+-0.002955 -0.001610 -0.000117 -0.003606 -0.001453 -0.001095 
+-0.001216 -0.000521 -0.002308 -0.000434 0.002896 -0.004886 
+0.000264 0.004723 -0.002661 0.001944 0.003397 -0.000729 
+0.002136 0.004968 -0.002075 0.001329 0.003982 -0.003687 
+-0.002737 -0.000834 -0.001848 -0.005159 -0.000508 -0.003891 
+-0.004886 0.001877 0.000249 -0.000948 0.003259 0.001541 
+0.002518 0.004422 0.003694 -0.001123 0.004492 -0.000744 
+0.000646 0.003433 0.003007 -0.001121 0.002030 0.001229 
+-0.001355 0.002704 -0.001668 -0.000093 -0.000935 -0.000604 
+0.003786 -0.003998 -0.000269 -0.002685 -0.003138 0.001415 
+-0.004221 0.005723 -0.001913 -0.004833 0.012603 -0.011394 
+-0.007223 0.017304 -0.011028 -0.003600 0.012080 -0.007244 
+0.000699 0.002290 -0.004674 0.000372 -0.001167 -0.003487 
+-0.000192 -0.001346 -0.002360 -0.000142 0.001264 -0.002119 
+0.002095 0.001092 -0.000082 0.003687 0.002188 0.000394 
+-0.000790 -0.000204 -0.002395 -0.001698 0.003502 -0.004670 
+-0.000822 0.001680 -0.001443 0.000467 -0.000149 0.000411 
+0.000428 -0.000921 0.000658 0.000034 -0.001880 0.000479 
+-0.000956 -0.001945 0.000011 -0.000549 0.000129 -0.001711 
+-0.000743 0.003497 -0.002492 0.001355 0.002974 -0.003934 
+0.001169 0.000344 -0.001272 -0.000662 0.000456 0.000146 
+-0.001894 0.002955 0.000152 -0.001007 0.006187 0.001151 
+0.003128 0.007886 -0.010199 -0.000688 0.007111 -0.001835 
+0.002735 0.005667 -0.004005 0.002785 0.004870 -0.001835 
+0.001313 0.006914 -0.004026 0.001718 0.006941 -0.009529 
+0.002988 0.006997 -0.009474 0.004304 0.003075 0.002706 
+0.000325 0.005762 0.002795 -0.001628 0.007013 -0.000564 
+-0.000523 0.005927 -0.004998 -0.000315 0.004654 -0.003129 
+0.000968 0.000411 -0.000129 0.000172 -0.000316 0.001139 
+0.003726 0.001473 -0.000146 0.003935 0.007456 -0.001996 
+0.001606 0.010609 -0.003874 -0.003503 0.003190 -0.003810 
+-0.001373 -0.008426 -0.004820 -0.004883 -0.002945 -0.000083 
+-0.001625 0.003371 0.004695 0.003766 0.010195 -0.001623 
+0.009391 0.008604 -0.005127 0.009659 0.004282 -0.004431 
+0.006830 0.002767 -0.001784 0.003867 0.002975 0.000068 
+0.002189 0.002011 0.000268 0.003869 -0.000236 -0.001952 
+0.005825 -0.000586 -0.002811 0.005343 0.001862 0.001514 
+0.004559 0.004645 0.004075 0.003700 0.004547 0.001454 
+0.002178 -0.000815 -0.000517 0.000339 -0.004846 0.001240 
+-0.001339 -0.005266 0.000810 -0.002365 -0.003963 -0.000533 
+-0.003186 -0.002741 -0.002073 -0.000551 0.000148 0.000072 
+0.001080 0.001737 -0.003686 0.000925 -0.000206 -0.005906 
+0.001674 -0.001066 -0.003503 0.001316 -0.000644 -0.001476 
+0.002983 -0.000813 0.001278 0.003506 -0.002083 0.002191 
+0.003164 -0.002090 -0.001073 0.000253 -0.000322 0.000356 
+-0.000443 0.003126 -0.000097 0.001752 -0.000274 -0.000330 
+-0.002584 0.003191 -0.000995 -0.000501 0.002482 0.000019 
+0.002679 0.000348 0.003170 -0.000273 0.001492 0.002050 
+-0.009356 0.010494 -0.005169 -0.012042 0.009616 -0.019016 
+-0.012929 0.008715 -0.020294 -0.009411 0.002940 -0.011042 
+-0.000648 -0.000080 -0.001985 0.004755 -0.000715 0.000347 
+0.007547 0.004471 -0.001096 0.006371 0.004073 -0.006619 
+0.004363 0.000898 -0.003594 0.002666 -0.000108 -0.001009 
+-0.000244 -0.000949 -0.001665 -0.002667 -0.000462 -0.003775 
+0.001198 -0.000735 -0.003499 -0.002691 0.003217 -0.003885 
+-0.002491 0.002694 -0.000159 0.001185 0.001296 0.001296 
+0.000522 0.000482 0.000723 -0.001610 0.001086 0.000553 
+-0.000294 0.001213 0.001213 0.001365 0.001952 -0.003127 
+-0.000550 -0.000085 -0.000201 0.000894 -0.000413 -0.000073 
+-0.000297 -0.000862 -0.000944 0.001768 0.006277 0.000818 
+0.003030 0.008993 -0.001683 0.000096 0.004963 -0.000289 
+0.000040 -0.000363 0.000154 0.001792 -0.001493 -0.002191 
+0.002629 0.001111 -0.004851 0.001989 0.001856 -0.005304 
+-0.002204 0.005169 -0.003649 -0.002730 0.001430 -0.000629 
+-0.000336 0.000904 0.000284 -0.000906 0.000331 -0.000685 
+0.000533 0.006030 -0.003364 0.003198 0.001031 -0.002129 
+0.001340 -0.005456 0.002251 -0.001942 -0.007522 0.002745 
+0.001366 -0.003035 -0.001379 0.001508 0.006531 -0.001790 
+0.000391 0.011079 -0.004624 -0.002987 0.005102 -0.004843 
+-0.001193 -0.013083 -0.001497 -0.007486 -0.008333 -0.002090 
+-0.002155 -0.004206 0.002908 0.000193 -0.000735 -0.002078 
+0.003031 0.001528 -0.008876 0.007569 0.001519 -0.004720 
+-0.000496 0.002542 0.000985 -0.006636 -0.000007 0.003048 
+-0.006396 -0.004453 0.002781 -0.003312 -0.003437 -0.001878 
+-0.000729 -0.000539 -0.000838 -0.001060 0.000823 0.000250 
+-0.001542 0.000278 0.000929 -0.000902 -0.000575 0.002854 
+-0.000727 -0.000068 0.001295 -0.000036 0.000143 -0.000072 
+-0.002607 -0.002549 0.000820 -0.001872 -0.006641 0.002897 
+-0.004205 -0.004359 0.005410 -0.002218 -0.001092 0.001787 
+-0.001130 0.001803 -0.000775 -0.001602 0.000827 0.000094 
+-0.001418 0.000121 0.001627 0.000328 0.000013 0.000101 
+0.000844 -0.001294 -0.002058 0.002910 -0.002169 0.000370 
+0.006129 0.000000 -0.003548 0.001509 0.004635 0.002030 
+0.003522 -0.000554 -0.000365 0.001345 -0.001086 -0.000202 
+0.002588 -0.003616 -0.001043 0.005019 -0.005491 -0.001169 
+0.004226 -0.002819 -0.002300 0.001404 0.002796 -0.003820 
+-0.007608 0.020464 -0.008849 -0.025560 0.021706 -0.009185 
+-0.025682 0.008634 -0.004404 -0.009201 0.000426 0.003815 
+0.001546 0.007107 0.005577 -0.000237 0.005390 0.000699 
+0.000748 0.001676 -0.001530 0.001283 0.003317 -0.001583 
+0.000842 0.003585 -0.002815 0.002283 0.001026 -0.002566 
+0.001968 -0.001406 -0.003629 0.005410 0.005123 -0.005123 
+0.000269 0.002051 -0.007204 -0.003189 0.004431 -0.002585 
+-0.001074 0.004704 -0.002889 0.001138 0.004316 -0.004213 
+0.003259 0.003783 -0.006392 0.003672 0.003078 -0.006803 
+0.000542 0.005011 -0.004198 0.002269 0.000837 0.000040 
+0.002524 -0.000201 -0.001047 0.001825 -0.001853 -0.000371 
+0.000000 -0.000507 -0.001812 0.003255 0.003165 -0.005305 
+0.005908 0.006478 -0.007903 0.002557 0.008522 -0.006531 
+0.000073 0.002643 -0.003306 -0.002881 -0.003407 -0.001044 
+-0.005152 -0.002834 -0.000765 -0.001909 0.002635 -0.002998 
+0.000463 0.006865 -0.005300 -0.002031 0.002766 -0.003219 
+0.000545 0.003796 0.002351 -0.000302 0.001717 0.000125 
+-0.001417 0.000457 -0.000328 0.000099 0.000864 0.000765 
+-0.004214 0.000365 0.001674 -0.003824 -0.002523 -0.001171 
+0.000865 0.001820 -0.003747 0.005288 0.008003 -0.001330 
+0.004033 0.009909 -0.001116 0.000965 0.006017 -0.001176 
+-0.006308 -0.004891 -0.004295 0.005187 -0.015233 -0.008146 
+0.001380 0.003480 -0.010757 0.000829 0.006657 0.002342 
+0.000780 0.006633 0.001053 0.002395 0.003639 -0.001007 
+0.004523 0.003768 -0.001569 0.005908 0.002879 -0.001429 
+0.004071 0.001377 0.000885 -0.000379 0.000817 0.000520 
+-0.001098 -0.000200 -0.000051 0.002990 0.002147 -0.002052 
+0.002875 0.003756 -0.003557 0.001693 0.003841 -0.002734 
+0.000943 0.002579 -0.000830 0.000829 0.000831 0.000104 
+0.000915 0.000238 0.000397 -0.000005 0.000188 0.000429 
+-0.000214 0.003824 -0.002600 0.004131 0.002985 -0.002179 
+0.004363 0.003739 -0.006116 0.003475 0.004966 -0.002898 
+0.003950 0.000954 -0.000355 0.001892 -0.001270 -0.000932 
+-0.000513 0.000090 -0.001176 -0.001608 -0.003504 -0.000268 
+0.001123 0.000807 0.000853 0.004051 0.003610 0.002615 
+0.002050 0.000908 0.002931 -0.000382 0.001066 0.000438 
+-0.003686 0.002092 -0.000775 -0.003510 0.000694 -0.001238 
+0.003038 -0.002219 -0.004362 0.005503 0.007958 -0.005176 
+-0.002530 0.026319 -0.006414 -1.473988 3.300578 -0.445087 
+-1.376812 3.111111 -0.338164 -0.005320 0.023745 0.001424 
+-0.004767 0.011085 0.000186 -0.001140 0.002415 -0.000382 
+0.002556 0.002506 -0.002076 0.000495 0.001341 0.001673 
+-0.001027 0.002084 0.000183 -0.002479 -0.003833 0.002556 
+0.000397 0.001582 0.001988 0.000021 0.005073 -0.006558 
+0.003143 0.005589 -0.009332 -0.001317 0.006837 -0.001192 
+-0.003038 0.002068 0.002294 -0.001362 0.001150 -0.000873 
+0.000835 0.004266 -0.001443 -0.002087 0.002266 -0.001484 
+-0.001289 0.000524 -0.002451 -0.003905 -0.001245 0.002038 
+-0.000116 0.000607 0.001244 -0.000330 -0.001399 0.000267 
+-0.000125 -0.000825 -0.000109 -0.000414 0.001288 -0.001259 
+0.001568 0.005252 -0.002754 0.001978 0.007556 -0.006475 
+-0.000857 0.006269 -0.003856 -0.001752 -0.000231 -0.000546 
+-0.005809 -0.005478 0.001314 -0.004961 -0.001642 0.001877 
+-0.001873 0.001152 -0.001436 -0.001435 0.001022 -0.001411 
+0.000965 0.001924 0.003369 0.002338 0.004229 -0.001891 
+0.003400 0.002469 0.000923 -0.001785 0.006710 -0.001000 
+0.002052 0.000338 -0.001120 -0.000714 -0.009081 -0.002733 
+-0.002381 -0.006371 -0.003960 0.007183 0.007093 -0.002650 
+0.003312 0.016638 -0.000622 0.000927 0.016275 -0.002702 
+-0.002799 0.003490 -0.003350 -0.010554 -0.015480 -0.007388 
+-0.002733 -0.005949 -0.008927 -0.001528 0.007000 -0.007588 
+-0.003447 0.008285 -0.002264 -0.001363 0.002339 -0.002316 
+-0.001101 0.000891 0.000747 -0.000723 0.000412 0.000274 
+0.000486 0.000864 0.000113 0.002085 0.001533 0.000546 
+0.001485 0.001698 0.000331 -0.002716 -0.000643 0.001324 
+-0.002584 -0.002165 0.002142 -0.002382 -0.002781 0.001231 
+-0.000080 -0.001715 -0.000188 0.002834 0.001074 0.001556 
+0.003249 0.003209 0.001537 -0.001980 0.000720 0.000383 
+-0.000968 0.002035 0.000165 -0.003729 0.000473 -0.002967 
+-0.005112 -0.002259 -0.000932 -0.004389 -0.004847 0.000687 
+-0.003731 -0.005126 -0.000584 -0.002529 -0.002713 -0.001363 
+0.002146 -0.010415 0.007663 0.003730 -0.003934 0.002437 
+0.000223 0.001023 0.001851 0.001541 0.002041 0.000898 
+0.000852 0.004376 0.001663 0.000334 0.003620 0.001417 
+-0.000847 0.000447 -0.000269 0.001844 -0.004584 -0.000937 
+0.003268 -0.002182 0.000805 -0.005371 0.019212 -0.003733 
+-0.004125 0.029836 -0.008055 0.008405 0.018773 -0.000666 
+-0.016439 0.003776 0.010051 -0.014482 0.014377 0.004246 
+-0.004013 0.003945 0.003239 -0.000125 -0.006060 0.002164 
+0.001082 -0.002952 0.000196 0.002360 0.003437 -0.000260 
+0.005292 0.005489 -0.001979 0.005988 0.001593 0.000040 
+0.003384 -0.002243 0.004532 -0.000709 -0.001647 0.004722 
+0.001418 -0.000448 -0.000522 0.002284 0.001917 -0.005405 
+0.002699 0.000015 -0.002705 0.001027 -0.002772 0.000848 
+0.001569 -0.000473 0.003481 0.000792 0.001960 0.000729 
+-0.000609 0.000598 -0.002695 -0.001883 0.000628 -0.002774 
+-0.001270 -0.001873 0.001672 0.000189 -0.003613 -0.001744 
+-0.001387 -0.002701 0.001314 -0.000621 -0.001523 -0.002256 
+-0.002991 0.001235 -0.001607 0.000070 0.005531 -0.005447 
+0.000300 0.006037 -0.004530 -0.001953 0.003516 -0.000078 
+-0.001875 -0.000937 0.000078 0.000391 -0.002935 -0.000196 
+0.000332 -0.001123 0.001416 -0.000796 -0.000316 -0.000096 
+-0.000556 0.000361 0.002251 0.001080 -0.000914 0.000166 
+0.002989 0.002156 -0.000576 0.004036 0.003674 -0.001647 
+0.001456 -0.000417 -0.001180 -0.000526 -0.003128 -0.001564 
+-0.000311 -0.008466 0.000092 0.000161 0.000732 0.000518 
+-0.001739 0.010289 0.003008 -0.001067 0.012168 0.000254 
+0.001671 0.003498 0.001309 -0.000589 -0.018526 0.000466 
+-0.002627 -0.002973 -0.016711 0.003762 0.014251 -0.016349 
+0.003581 0.016002 -0.010979 0.004225 0.009773 -0.006495 
+0.005257 0.003573 -0.003487 0.002885 0.003387 -0.000853 
+0.000912 0.003372 0.000600 0.000845 0.001961 0.000405 
+0.001604 0.000348 -0.000344 0.004391 0.000300 -0.002537 
+0.005389 0.000126 -0.002015 0.001704 -0.001577 -0.000360 
+-0.000508 -0.003153 -0.001094 -0.000070 -0.001700 -0.001032 
+-0.000236 0.000619 0.000573 -0.002556 0.000041 -0.000104 
+-0.003905 -0.000946 0.000163 -0.003039 -0.001519 -0.001395 
+-0.000844 0.000422 -0.001250 -0.001161 0.000459 0.000318 
+-0.004652 0.001169 0.001716 -0.009128 -0.002096 0.003450 
+-0.000256 0.005027 0.001291 -0.001010 -0.000036 0.003288 
+-0.002734 -0.001022 -0.000638 0.000067 -0.003033 -0.001687 
+-0.000226 -0.001847 -0.000619 -0.002077 0.003630 -0.001061 
+-0.001199 0.002421 -0.000376 0.002577 0.003682 -0.008611 
+0.008441 0.002939 0.004863 -0.005473 0.019587 0.009887 
+-0.009302 0.032097 0.001516 0.008779 0.006813 0.003590 
+-0.006274 0.004710 0.009582 -0.003857 0.003293 0.004452 
+-0.001069 0.002229 0.000166 0.002204 0.006752 0.000019 
+0.000267 0.007246 -0.006016 0.001189 0.004508 -0.003558 
+0.002008 0.002638 -0.000157 0.003253 0.000093 0.000749 
+0.003226 -0.000771 0.000828 0.003893 0.000000 -0.001756 
+-0.000157 0.000759 -0.001808 0.002130 0.001777 -0.000883 
+0.000713 0.000267 -0.001349 0.000560 0.000016 -0.000048 
+0.000457 -0.000223 0.000393 0.001349 0.000873 -0.000873 
+0.003256 0.001954 0.001032 0.001389 0.002400 0.001166 
+-0.001034 0.001363 0.001846 -0.002095 0.001133 0.002136 
+-0.001594 -0.000131 0.000145 -0.000563 -0.000292 -0.004501 
+0.001097 0.001907 -0.006739 0.000095 0.004783 -0.003136 
+-0.000231 0.004728 -0.002237 0.000339 0.004964 -0.002631 
+0.003968 0.001162 -0.004650 0.000817 -0.001092 -0.001084 
+-0.001393 -0.001990 0.000945 0.001039 0.000122 0.000295 
+0.000087 0.001391 0.000261 -0.001525 0.000375 -0.003424 
+0.001008 0.000233 -0.001008 0.002496 0.001529 -0.001638 
+0.004877 0.004994 -0.002906 0.003302 0.004101 0.000300 
+0.002146 -0.003790 -0.000674 -0.000537 -0.005923 -0.005479 
+-0.001315 0.003464 0.001067 -0.001658 0.012947 0.002232 
+0.000010 0.009120 -0.000088 -0.002031 -0.007607 0.002394 
+0.014664 -0.001761 -0.012292 -0.003684 0.001000 -0.005731 
+-0.001904 0.012285 -0.004210 -0.006727 0.000436 -0.004060 
+-0.005957 -0.005759 -0.006665 0.000174 -0.000566 0.002047 
+-0.003710 0.000319 0.000486 -0.003612 0.000485 0.000095 
+-0.006645 -0.002562 0.002827 -0.005347 -0.002088 0.001130 
+0.000024 -0.003433 -0.001408 0.002377 -0.005292 -0.002047 
+0.001088 -0.004186 -0.001113 -0.000370 -0.001779 -0.000658 
+-0.004399 0.001285 0.003114 -0.002704 -0.000836 0.007897 
+-0.000242 0.001242 0.000661 -0.003540 -0.003106 -0.000521 
+-0.001560 -0.002035 -0.005031 -0.001414 0.000194 -0.004193 
+-0.001069 -0.000818 0.001425 -0.000018 -0.003023 0.003196 
+-0.002627 0.000974 -0.000600 -0.000842 0.000676 0.000101 
+0.000500 0.001333 0.000500 0.000100 0.002816 -0.001558 
+-0.000175 0.003921 -0.001429 -0.001628 0.002822 -0.005643 
+0.001788 0.000312 -0.004267 0.001986 0.001202 -0.000758 
+0.000039 0.002045 0.000655 0.000853 0.004572 0.000104 
+0.001690 0.007782 -0.004391 -0.000661 0.006817 -0.006260 
+-0.001308 0.002917 -0.006136 0.003171 0.009951 -0.002879 
+0.006957 0.006778 -0.004150 0.006811 0.004539 -0.004868 
+-0.006656 0.004385 0.001229 0.004753 -0.001824 0.003951 
+-0.002622 0.007047 -0.000113 0.003012 0.028264 -0.012874 
+-0.019235 0.026250 0.008244 0.002381 -0.001190 -0.001190 
+0.008519 -0.046759 0.009815 0.013126 -0.011361 0.008904 
+0.012182 0.005742 0.003644 -0.036182 -0.007635 0.013941 
+-0.017500 0.017500 0.010714 -0.002083 0.002083 0.010000 
+-0.015000 -0.082000 -0.005000 0.043462 -0.012517 0.002203 
+-0.026667 -0.011212 0.004242 -0.014769 0.007923 -0.035308 
+-0.043450 -0.016199 0.003558 -0.014743 0.096640 -0.085583 
+0.035000 0.102377 -0.122852 -0.002222 0.078889 -0.083333 
+-0.010513 -0.035000 0.015769 -0.045000 0.000000 0.031667 
+-0.039167 0.015833 -0.011667 0.049333 0.078667 0.014667 
+-0.012243 -0.001321 -0.003886 0.090523 -0.023441 0.019921 
+0.003478 0.016285 0.006640 -0.006804 0.001961 -0.000529 
+0.015625 -0.001515 -0.027277 -0.020555 0.000609 -0.030250 
+-0.006571 -0.005714 0.001476 0.007500 -0.062500 0.020833 
+-0.004167 -0.079167 0.079167 0.128485 0.022348 -0.035379 
+0.042628 0.006978 -0.008782 -0.038348 0.002580 -0.007623 
+0.015030 -0.032554 -0.003567 0.019058 -0.005604 -0.016791 
+0.006335 0.001491 -0.008011 0.001036 0.002925 0.001034 
+-0.004037 0.011250 0.006131 0.012086 -0.004492 -0.005027 
+0.011947 0.006005 -0.005119 -0.005012 0.015638 -0.018884 
+-0.001181 0.016498 -0.011004 -0.002164 -0.010289 -0.041142 
+-0.016245 0.009998 -0.018547 0.008966 0.023793 -0.009310 
+0.000548 -0.011171 0.005679 -0.023388 -0.028104 0.029202 
+-0.006733 -0.005674 0.012940 -0.003750 0.002268 -0.000514 
+0.000804 0.004198 -0.007594 0.004734 0.002462 -0.005691 
+0.003056 -0.001069 0.000187 -0.002534 -0.004573 0.006721 
+-0.005253 -0.004233 0.007341 -0.003339 -0.001700 0.002864 
+-0.001529 -0.000234 0.000390 -0.003095 -0.001794 0.001665 
+-0.000537 -0.000496 -0.001529 0.000965 -0.001403 -0.001259 
+0.002188 -0.000942 -0.000094 0.000022 0.000542 0.000355 
+-0.000697 0.001212 -0.002091 -0.001849 0.000290 0.003329 
+-0.001223 0.000450 -0.001323 0.003351 0.005101 -0.001079 
+0.004410 0.005533 -0.002399 0.000934 0.001084 -0.000018 
+-0.005136 -0.002058 -0.000004 -0.004689 -0.001855 -0.000136 
+-0.000716 0.000607 -0.001192 0.002289 0.005950 -0.002693 
+0.005133 0.010424 -0.003593 0.009034 0.013808 -0.004033 
+0.019035 0.019157 -0.012511 0.024771 0.035362 -0.024636 
+-0.038078 -0.020326 0.044469 0.003954 -0.002974 0.003203 
+0.007028 -0.013367 -0.023784 0.006923 -0.002653 -0.012599 
+0.003649 -0.000268 -0.009714 -0.013255 0.019725 -0.039608 
+-0.003495 0.029001 -0.021714 -0.003444 0.033302 -0.014165 
+-0.011667 0.018333 0.005000 0.024048 -0.017976 0.060238 
+-0.049500 0.024750 0.091250 -0.017302 -0.099127 0.021508 
+0.014209 -0.017651 0.015209 0.007027 -0.001171 0.066667 
+0.048095 -0.088286 -0.109587 -0.002929 -0.006869 0.018586 
+0.001880 0.022906 -0.009573 -0.010000 0.028889 -0.070000 
+-0.108333 0.002500 0.002500 0.072543 -0.015309 0.017136 
+0.157143 0.113929 -0.066786 -0.002642 -0.034232 0.007466 
+0.010175 -0.005658 -0.013553 0.019618 -0.022763 -0.005552 
+-0.007528 -0.002699 -0.010179 0.004833 0.008172 -0.025044 
+-0.006233 0.013011 -0.012278 -0.010455 0.006136 -0.017455 
+0.006557 0.014614 -0.020519 0.008904 0.003680 0.007654 
+-0.011974 0.023816 0.005789 -0.006864 0.006923 0.034320 
+-0.073744 0.002564 0.020359 -0.055736 -0.033658 0.044372 
+0.002880 -0.008734 -0.000938 0.001166 0.002329 -0.001748 
+-0.001311 0.001865 -0.000450 0.000186 0.004462 -0.000048 
+0.001640 0.003926 0.000673 -0.001571 -0.003420 -0.013428 
+-0.006130 0.005795 -0.013894 0.005516 0.009434 -0.000606 
+-0.003184 0.002836 0.008054 -0.010203 0.067368 0.044868 
+-0.000860 0.005064 0.016401 -0.010372 -0.010974 -0.000738 
+-0.018006 -0.020385 0.010869 0.003261 -0.008054 0.019256 
+0.000922 -0.000140 -0.002281 -0.003817 0.003195 -0.003684 
+-0.001374 0.002757 -0.004465 0.001781 0.001817 -0.004227 
+0.001274 0.000437 -0.001667 -0.000884 -0.000036 0.000880 
+-0.001532 -0.000163 0.001546 -0.000985 -0.000262 0.000593 
+-0.001067 -0.000244 0.000074 -0.001507 -0.000448 -0.000378 
+-0.001809 0.002240 0.001206 -0.000880 0.000569 0.000298 
+0.004077 0.004633 -0.000771 0.004115 0.005104 -0.004974 
+0.002848 0.001383 -0.002161 -0.001493 -0.000671 -0.000578 
+-0.002465 -0.000516 -0.003077 -0.001682 0.002235 0.003436 
+0.001249 0.002355 0.002948 -0.000216 0.001853 0.005021 
+-0.002248 -0.000816 0.006649 -0.002440 -0.002930 0.001541 
+-0.002248 0.000070 -0.000890 -0.000995 0.001996 -0.003704 
+0.000970 0.004588 -0.005084 0.003357 0.008010 -0.004618 
+0.010626 0.009162 -0.006659 0.016396 0.006116 -0.006996 
+-0.018943 -0.004864 0.020352 -0.024228 -0.030536 0.028934 
+-0.073120 -0.156843 0.045578 -0.158571 0.257143 -0.145714 
+-0.016131 0.050642 -0.002835 0.023846 0.046028 -0.055233 
+-0.008347 0.009841 -0.054875 0.096080 -0.026398 0.008086 
+0.082500 -0.080625 0.076875 0.036707 0.044000 0.029366 
+0.005000 0.001961 0.000490 0.012950 -0.023842 -0.006733 
+0.032213 0.051475 -0.133060 -0.040000 -0.014231 -0.021346 
+0.071735 0.051598 -0.120822 0.037949 0.068051 -0.050169 
+-0.053969 0.073699 -0.089271 -0.059007 -0.017400 0.018913 
+-0.063176 0.013569 -0.008564 0.066391 0.070937 -0.054931 
+0.012088 0.158571 -0.060440 0.064825 -0.043509 0.063947 
+0.028119 0.071806 -0.006194 0.008369 -0.024529 0.006764 
+-0.005724 -0.027759 0.002017 -0.020800 -0.017800 0.015800 
+-0.020776 -0.005189 -0.011866 -0.013930 -0.003495 -0.002489 
+-0.007895 0.003066 -0.018627 -0.002537 -0.002899 0.000952 
+-0.003248 -0.000389 -0.003557 -0.078682 -0.058773 -0.017727 
+-0.077790 -0.061413 0.057319 -0.015970 -0.020801 0.000313 
+-0.002104 -0.003332 0.003066 -0.004602 -0.002894 0.006471 
+0.002417 -0.002216 0.005077 0.003987 -0.003414 -0.003053 
+0.001422 -0.005471 -0.004409 -0.006459 -0.000795 -0.005168 
+0.001351 -0.000342 -0.002794 0.003849 0.012777 -0.002117 
+0.003145 0.002292 0.004334 0.006915 -0.007951 0.016921 
+-0.077930 -0.024096 0.056688 -0.027703 -0.011400 0.062377 
+-0.005059 0.000518 0.009892 -0.002549 0.003923 -0.006415 
+-0.004111 0.003338 -0.000846 -0.002758 0.001426 0.000902 
+0.000086 0.000573 -0.001874 0.001883 0.001149 -0.005696 
+-0.001222 -0.000899 -0.001379 -0.001814 0.001751 0.000444 
+-0.004723 0.002213 0.000478 -0.005659 0.000247 -0.000825 
+-0.003386 -0.000451 -0.002101 -0.000197 -0.001007 -0.003395 
+-0.000779 -0.001992 0.000713 0.000375 -0.002047 0.000763 
+0.000921 0.000789 -0.000905 0.001849 0.004066 -0.001357 
+-0.000047 0.003042 -0.005133 -0.000151 0.001123 -0.003628 
+-0.000907 0.001094 -0.002849 -0.001855 0.000933 0.000136 
+-0.000194 -0.000091 0.000167 -0.001143 -0.000984 0.001000 
+-0.001587 -0.001171 0.001867 -0.005394 -0.000471 0.000261 
+-0.004726 -0.001756 0.000673 -0.002751 0.001664 -0.003085 
+-0.003580 0.004037 -0.007442 -0.001660 0.008202 -0.012600 
+0.001943 0.000203 -0.000666 0.000457 0.000051 0.005625 
+0.002624 -0.000795 0.006310 -0.007409 -0.005135 0.015167 
+-0.035740 -0.019880 0.044797 -0.014774 -0.032263 0.051309 
+0.059957 -0.022737 0.033599 -0.045548 -0.026423 0.043463 
+-0.033037 -0.005437 0.037233 -0.043587 -0.068283 0.233906 
+0.023889 -0.030556 -0.003333 -0.098295 0.090455 -0.002614 
+0.099000 0.017077 0.025615 0.068824 0.089007 -0.002757 
+0.011667 -0.034667 0.031000 0.081933 0.082333 -0.041467 
+-0.090476 0.091905 -0.087619 0.061111 0.091944 -0.030278 
+0.016000 0.058000 0.000000 0.038962 0.071509 0.014057 
+0.012028 0.143863 0.029574 0.105362 -0.013933 -0.009941 
+0.008500 0.001250 0.025500 -0.011545 0.007364 0.010545 
+0.096667 0.152222 -0.055556 -0.092545 -0.069516 0.003351 
+-0.057088 -0.060012 0.047988 -0.021278 -0.013349 0.026765 
+-0.047479 -0.025991 0.052493 -0.052270 -0.012916 -0.002183 
+-0.011584 -0.003573 -0.005635 -0.046842 0.012076 -0.011223 
+-0.115316 -0.033481 -0.080601 -0.056349 -0.004921 -0.015317 
+-0.021891 0.012780 0.021714 -0.028163 0.031531 0.003776 
+-0.007845 0.003311 0.009892 -0.002675 0.001519 0.005019 
+0.002028 0.000622 0.001305 -0.002575 -0.004527 -0.000532 
+-0.011818 -0.000810 -0.006746 -0.007431 0.008528 -0.007835 
+-0.001567 0.011349 -0.009377 0.004824 0.015994 -0.009218 
+0.009999 0.019459 -0.009439 0.014256 0.011194 -0.004336 
+0.009908 -0.002244 0.003316 -0.000345 -0.003129 0.007168 
+-0.003286 -0.000779 0.005252 -0.002798 0.001273 0.001554 
+-0.001719 0.001366 -0.000221 -0.000307 -0.000102 -0.001898 
+-0.000251 0.002256 -0.003571 0.004070 0.003301 -0.006987 
+0.000336 0.007069 -0.002841 -0.001118 0.005263 -0.001155 
+-0.001256 0.004799 0.000985 -0.000654 0.005262 0.002759 
+-0.003453 0.003655 -0.000404 -0.001921 0.001021 -0.003350 
+0.001015 0.002448 -0.005359 0.001834 0.006082 -0.005970 
+0.001548 0.000411 0.000524 0.001570 -0.000077 -0.001000 
+0.000443 0.000531 -0.000121 -0.001576 -0.000143 -0.002783 
+-0.000728 -0.001403 -0.003523 -0.001346 -0.001876 -0.001773 
+-0.000582 -0.002177 0.000065 -0.000141 -0.000141 0.000121 
+0.001226 0.004913 -0.000949 -0.000420 0.009735 -0.003294 
+-0.000801 0.001449 -0.006706 -0.000999 -0.001498 -0.005606 
+-0.006527 0.003449 -0.008660 0.007086 0.013261 -0.006484 
+0.004079 -0.004897 0.017838 0.005168 0.001049 0.021168 
+-0.706827 -1.799197 2.819277 -0.827586 -1.762931 2.862069 
+-0.015307 -0.011542 0.028527 -0.013786 -0.022884 0.036257 
+0.095817 0.049141 0.030653 -0.006633 0.035535 0.038675 
+-0.009874 0.009276 0.009183 -0.056336 -0.018128 0.035300 
+-0.021028 -0.012081 0.022530 -0.011281 0.033985 -0.055280 
+0.043443 -0.006400 0.004554 0.048775 0.065926 -0.004558 
+-0.031605 -0.028218 -0.019864 0.030442 -0.001602 0.052222 
+0.126250 0.010368 -0.041471 0.028577 -0.004579 0.015393 
+0.019224 0.003842 0.053769 0.020218 0.008212 0.047064 
+0.054854 0.015161 0.046506 -0.030488 0.003004 0.031415 
+-0.036224 -0.099184 0.089694 0.022444 0.043222 -0.043889 
+0.040224 -0.014127 -0.020209 0.000322 -0.052220 -0.006017 
+-0.126367 -0.111020 0.120612 0.066189 0.078717 0.207547 
+-0.092126 -0.045748 0.002524 0.003925 -0.017508 -0.015826 
+0.037069 -0.044799 0.003088 -0.078698 -0.072603 0.006334 
+-0.031423 -0.137737 0.032628 -0.000986 0.021341 -0.027750 
+-0.005107 0.026270 -0.056192 0.010083 0.020840 -0.029294 
+-0.000226 0.004298 -0.002270 -0.001479 -0.001379 0.004258 
+-0.001473 0.001599 -0.000194 -0.006636 -0.000557 0.004494 
+-0.002848 0.000606 -0.000176 0.003108 0.001247 -0.001912 
+0.005915 0.000977 -0.002042 0.004575 0.005457 -0.000157 
+0.003140 0.008002 -0.001424 0.004238 0.003330 -0.004064 
+0.001776 -0.000840 -0.001048 0.001061 -0.000896 0.000493 
+-0.002825 -0.000013 0.003054 -0.006761 -0.001162 0.001364 
+-0.000056 0.001850 -0.001432 -0.000816 0.001473 -0.002952 
+0.001093 -0.001093 0.000273 0.000176 -0.000624 -0.000477 
+-0.001494 -0.002598 -0.002344 -0.001400 -0.001538 -0.002800 
+-0.000493 0.001478 -0.000970 -0.000314 0.002049 0.003434 
+-0.001695 0.003320 0.005035 -0.002324 0.003660 0.003127 
+-0.006016 0.005805 0.000264 -0.004048 0.005902 -0.000433 
+-0.000852 0.004185 0.000404 0.001948 0.003193 -0.000016 
+0.000375 0.003389 0.001810 0.001916 0.005785 -0.001695 
+0.004324 0.002781 -0.001388 0.003179 0.002525 -0.005041 
+0.002479 0.001697 -0.001972 0.002074 -0.000356 -0.000988 
+-0.000856 0.002295 0.001437 -0.002451 0.007479 0.006712 
+0.002038 0.007409 0.002164 0.014060 0.007024 -0.009694 
+0.011986 0.025252 -0.034827 -0.015397 0.035486 -0.018861 
+0.000375 -0.010806 0.033457 -0.802198 -2.820513 3.113553 
+-0.672457 -3.347394 2.856079 -0.711905 -3.628572 2.392857 
+-0.575658 -3.414474 1.608553 -0.007216 -0.015004 0.006958 
+0.010493 0.031306 -0.014729 -0.034170 -0.007291 0.004703 
+-0.001341 -0.009000 0.041695 -0.022991 -0.002449 0.017095 
+-0.015471 -0.037744 0.014799 -0.014779 -0.025249 0.006863 
+0.000000 -0.019600 0.000800 0.005639 -0.017500 -0.015506 
+-0.011995 -0.033350 -0.031010 0.006223 -0.005662 -0.012950 
+0.029004 -0.139567 0.011775 0.004916 -0.004502 0.007797 
+-0.014115 0.001930 0.025052 0.077034 0.035007 -0.006925 
+-0.048958 0.052708 -0.067708 -0.012440 -0.059713 0.022392 
+-0.025400 -0.076200 0.061000 0.005524 -0.021888 -0.029860 
+0.055755 0.004806 -0.034607 0.004148 -0.041000 0.045623 
+-0.131800 -0.098850 0.058750 0.000000 -0.056429 0.056429 
+-0.077840 0.085910 -0.005044 0.011582 0.015341 -0.050612 
+0.012061 -0.004784 0.000841 -0.010863 -0.000316 -0.012905 
+0.010126 -0.021719 0.036009 -0.021038 -0.044003 -0.007869 
+0.013354 -0.029632 -0.016646 0.014925 -0.004899 -0.015292 
+-0.001684 -0.006245 0.002834 -0.000516 -0.008639 0.007074 
+0.000519 -0.000195 0.002143 -0.003041 0.000267 0.005048 
+0.001935 -0.000782 0.000929 0.006718 0.004093 -0.000878 
+0.008731 0.002304 0.000938 0.002284 -0.003041 0.000661 
+0.002998 0.004920 -0.003921 -0.006236 0.004658 0.000885 
+-0.004275 0.005182 0.002799 -0.000784 0.002559 0.002330 
+-0.002732 -0.000420 0.002643 -0.002723 0.002415 -0.000183 
+-0.002933 0.002127 -0.003822 -0.001826 0.003383 -0.004600 
+-0.001656 0.001985 -0.002971 -0.000847 0.000334 -0.001283 
+-0.000834 0.000779 0.000557 -0.002725 -0.008550 0.008176 
+-0.010351 -0.001295 0.006467 -0.002328 0.002834 -0.000329 
+-0.002120 -0.000236 -0.002096 -0.002697 0.001433 -0.004680 
+-0.004452 0.002896 0.000755 -0.002296 0.004802 0.002088 
+0.000576 0.003230 -0.000663 -0.000554 -0.000059 -0.000649 
+-0.000482 -0.002049 -0.001958 -0.000374 -0.000818 -0.000657 
+0.003320 0.007800 0.000124 0.001931 0.010108 -0.007050 
+0.004084 0.006876 -0.004526 0.000323 0.002467 -0.000087 
+0.003458 -0.000248 0.000433 0.003348 0.005588 0.001668 
+0.004561 0.006982 -0.001684 0.020337 0.008853 -0.017725 
+0.003568 0.036784 -0.020164 -0.014623 0.027059 0.010767 
+-2.817143 -1.022857 4.051429 -1.334437 -2.754967 3.450331 
+-0.572072 -4.108108 2.454955 -0.149606 -4.708662 1.564961 
+0.185714 -4.511905 0.800000 0.679825 -3.280702 0.127193 
+0.001124 -0.001273 0.005291 -0.030124 0.036133 -0.030542 
+-0.033010 -0.014178 0.012257 -0.010352 -0.049231 0.015286 
+-0.055746 -0.058889 0.061940 -0.026471 -0.051801 0.028490 
+-0.010913 -0.028730 -0.015516 -0.014400 -0.001152 -0.003077 
+0.042644 -0.043278 0.018156 0.023123 -0.049122 0.031457 
+-0.049576 -0.008906 0.024252 -0.001179 -0.049355 0.017615 
+0.015810 -0.058048 0.036905 -0.007464 -0.014074 0.024238 
+-0.074912 0.020000 -0.081723 0.016410 -0.026712 -0.005064 
+-0.016667 -0.026667 -0.026667 -0.002404 -0.026063 -0.019652 
+-0.013633 -0.004653 -0.008288 0.041642 0.040840 0.015716 
+-0.013545 0.058836 -0.076931 0.081183 -0.041358 0.037527 
+0.039724 -0.058352 0.036916 0.019091 -0.037182 0.021091 
+-0.012596 -0.037083 0.008397 -0.004810 -0.024924 0.016421 
+-0.018056 0.057677 0.022131 0.018301 0.003050 0.011429 
+-0.005861 -0.030062 -0.001256 -0.003334 0.005702 0.005346 
+-0.003000 0.008704 0.003873 -0.002165 -0.001323 0.005960 
+-0.001545 -0.003620 0.006485 -0.003305 -0.002056 0.003077 
+-0.001398 0.000090 -0.000296 -0.000862 0.002532 -0.001323 
+-0.000727 0.004170 -0.001197 0.003382 0.008781 -0.005290 
+-0.003247 0.002519 -0.005470 -0.002885 0.003077 0.000673 
+-0.000869 0.002157 0.001848 -0.002214 -0.000272 0.002473 
+-0.000082 -0.000308 -0.000646 0.003357 0.000522 -0.001750 
+-0.000207 0.001679 0.000710 -0.004894 0.002816 -0.004597 
+-0.004603 0.001587 -0.004286 -0.000839 0.001373 -0.005418 
+-0.001454 -0.001389 -0.003504 -0.006490 -0.002357 0.001378 
+-0.009302 -0.005223 0.000127 -0.000803 -0.004678 0.000748 
+-0.001461 0.000597 -0.000388 0.000193 0.001966 -0.006454 
+-0.000140 0.003738 0.000859 0.002426 0.006250 0.000000 
+-0.000850 0.005472 0.000124 -0.001994 0.003231 -0.000906 
+-0.005814 0.000632 -0.003300 0.000496 -0.000732 -0.000956 
+-0.001431 0.000703 0.001423 -0.005382 0.001328 0.001431 
+-0.002952 0.002345 0.003476 0.003170 0.001159 0.003438 
+0.009379 0.003283 -0.000862 0.007739 0.006728 -0.007004 
+0.007906 0.013139 -0.014341 0.025893 0.039538 -0.050667 
+0.013520 0.069445 -0.039960 -0.010230 0.009210 0.045282 
+-1.228464 -0.632959 4.779026 -0.564103 -2.160839 3.995338 
+0.078324 -3.488160 2.783242 0.546296 -4.368518 1.661111 
+0.925926 -4.746032 0.751323 1.887500 -3.981250 -0.418750 
+0.006534 0.014903 -0.072065 -0.057890 0.043843 0.056449 
+-0.048999 -0.010320 0.006910 -0.017853 -0.016333 -0.017458 
+-0.019672 -0.017832 0.004603 0.051001 -0.045068 -0.034394 
+-0.007044 -0.003916 0.026475 -0.032676 -0.019444 0.031175 
+-0.044037 -0.045493 0.028024 -0.012647 -0.092500 0.021078 
+0.017064 -0.000714 0.003066 0.000300 -0.036362 0.098364 
+-0.076145 -0.055860 0.037138 -0.018528 0.010077 -0.010733 
+0.012083 0.005417 0.095417 0.041638 0.042759 0.048017 
+-0.048333 -0.011667 0.060000 0.014667 0.031167 0.001833 
+-0.066857 -0.001571 0.013214 -0.001538 0.027404 -0.075032 
+0.025333 0.021556 -0.075556 0.023699 -0.005743 0.013913 
+0.058481 -0.036031 0.051783 0.054010 0.008309 0.028750 
+0.062103 -0.005116 0.010410 0.028593 -0.037852 0.065185 
+-0.020278 -0.048611 0.076944 0.008161 0.030582 -0.045225 
+-0.010502 0.057782 0.001985 -0.004662 0.000528 0.006594 
+-0.002195 0.003714 -0.011149 -0.001485 0.001445 -0.006930 
+0.002066 -0.000069 -0.003629 -0.001801 -0.003410 0.002548 
+-0.005120 -0.008461 -0.001022 -0.000807 -0.004710 -0.005213 
+0.000423 -0.002532 0.001321 -0.001682 -0.004003 -0.001720 
+0.001716 -0.001180 0.000874 0.001803 -0.000628 0.002522 
+0.000254 -0.000016 0.000769 -0.001996 0.000063 -0.002932 
+-0.006555 -0.001597 -0.002185 0.001303 0.001669 -0.003440 
+0.000379 0.004499 -0.002629 -0.000946 0.004014 -0.002301 
+0.000349 0.001163 -0.001124 0.001829 -0.000354 -0.001888 
+0.000949 0.002663 -0.003329 0.000274 0.002636 -0.005512 
+-0.000271 -0.002024 -0.003642 -0.003387 -0.004397 -0.001865 
+-0.002110 -0.006350 -0.001688 -0.001272 -0.005113 -0.003838 
+0.000574 0.005294 -0.000015 0.002786 0.005648 -0.000979 
+0.001963 0.006174 -0.000904 -0.002594 0.003759 -0.007256 
+-0.000054 0.007451 -0.005527 0.001894 0.004184 -0.000848 
+-0.007083 0.002083 -0.002869 -0.005206 0.003137 0.003071 
+-0.000878 0.000199 0.006766 -0.003420 -0.002333 0.002254 
+-0.000840 -0.004810 0.005125 -0.001447 -0.001305 0.005054 
+0.002700 0.005952 -0.007141 0.039906 0.030480 -0.014328 
+-0.017070 0.067471 -0.047858 -1.738255 0.496644 4.697987 
+0.288630 -1.137026 5.326530 0.755061 -2.327935 4.726721 
+1.181102 -3.612205 3.415354 1.736709 -4.946836 1.622785 
+2.173729 -5.233051 -0.550847 0.017815 -0.037366 -0.020552 
+0.001978 -0.020858 -0.028504 -0.026963 -0.037426 0.024548 
+-0.030968 -0.021342 -0.078011 -0.024912 -0.032494 0.002877 
+-0.011432 -0.023585 0.004294 0.021407 -0.026330 -0.056795 
+-0.006340 -0.020486 0.036739 -0.003393 0.002561 -0.000362 
+-0.020367 -0.022874 0.016728 -0.026180 -0.042543 0.010000 
+-0.022543 -0.073508 -0.057661 -0.058324 -0.128000 0.097206 
+-0.091491 -0.012228 0.000737 -0.047154 0.006344 0.000850 
+0.078992 0.047162 0.017362 0.043626 0.032256 -0.004873 
+0.041327 -0.004342 -0.015456 0.017924 -0.004742 0.016948 
+0.010577 -0.002115 0.031875 0.007771 -0.014431 -0.000832 
+0.023051 -0.013571 -0.005987 0.007418 -0.031624 -0.014923 
+0.075683 -0.082148 0.037195 0.004105 -0.069335 0.027996 
+-0.006613 -0.006746 0.044836 -0.008054 -0.024817 0.013791 
+-0.007828 -0.052980 0.021162 -0.012067 -0.023148 0.009791 
+-0.007251 0.042042 -0.009794 -0.017722 -0.002530 0.009233 
+-0.002156 -0.011982 0.009124 -0.001869 -0.000748 -0.004358 
+-0.003390 0.001611 -0.001931 -0.001932 0.005349 -0.003442 
+-0.003279 0.004846 -0.004157 -0.003234 0.005482 -0.003659 
+-0.005448 -0.001715 -0.001168 -0.001225 -0.005593 -0.002789 
+0.001022 -0.002138 -0.000173 0.000794 0.002204 0.001895 
+-0.001218 0.002304 -0.000193 -0.004071 0.000027 -0.002022 
+-0.002545 -0.000904 0.001715 0.000280 0.001068 -0.001798 
+0.001301 0.000351 -0.003063 0.002875 0.001827 -0.004500 
+-0.000861 0.004074 -0.002611 0.001000 0.003034 -0.000879 
+-0.000829 0.003547 -0.000812 -0.001735 0.003560 -0.004236 
+0.000540 0.004317 -0.005379 -0.001997 0.002093 -0.001498 
+-0.001523 -0.003368 -0.003093 -0.004306 -0.006302 -0.003728 
+-0.002041 0.005945 -0.001029 -0.002095 0.004710 -0.001107 
+-0.002291 0.003416 -0.000676 -0.000778 0.003487 -0.009292 
+0.000982 0.012882 -0.006861 -0.006727 0.002243 -0.004932 
+-0.004060 0.001598 -0.001580 -0.001436 0.000741 0.001708 
+0.002241 -0.000584 0.000780 0.002548 -0.004375 -0.000213 
+0.000869 -0.003723 -0.002321 0.001272 0.001649 -0.003447 
+0.004119 0.012189 -0.001136 -0.003919 0.006363 0.004167 
+-0.011746 0.021602 -0.012696 -0.005633 0.005977 0.027861 
+0.852941 -1.455882 4.764706 1.902778 -2.750000 4.736111 
+2.401734 -4.274567 3.355491 2.390681 -5.627240 0.670251 
+0.986842 -5.197369 -1.872807 -0.819209 -4.062147 -2.451977 
+-0.016843 -0.033822 -0.015668 -0.007351 -0.045590 -0.027109 
+0.013577 -0.094683 -0.113135 0.006785 0.009058 -0.000546 
+0.002014 0.000089 -0.002429 0.000327 0.017910 0.003325 
+0.013878 -0.005598 0.025214 0.010663 -0.005071 0.012276 
+-0.005131 -0.008497 0.011505 0.001371 -0.009051 0.001944 
+0.008467 0.033336 -0.055555 0.022168 0.010406 -0.037252 
+0.013958 0.001042 0.025833 0.050861 0.041244 0.014019 
+0.001273 0.021091 0.016091 0.011066 -0.045252 0.027171 
+0.012446 0.000708 -0.007926 -0.007444 -0.040827 -0.001203 
+-0.002608 -0.019867 -0.017458 0.030817 -0.038385 0.058391 
+0.029537 -0.016061 -0.003601 -0.016087 -0.010682 -0.008795 
+0.000982 -0.039980 0.026696 0.011789 -0.020328 0.022312 
+-0.013973 0.034933 0.006522 -0.013995 0.015808 0.010580 
+-0.004842 -0.015300 0.002115 -0.004560 -0.032536 0.009851 
+0.002190 0.026940 -0.005934 -0.007154 0.033770 -0.001887 
+-0.011470 -0.003896 0.015308 0.001006 -0.003629 0.000965 
+-0.002069 0.001578 -0.000802 -0.001746 0.004360 -0.004778 
+-0.001039 0.005833 -0.005349 -0.005133 -0.000257 0.000593 
+-0.001515 -0.005053 -0.003613 -0.000884 -0.003300 -0.004083 
+-0.001968 -0.001086 -0.004306 -0.002660 -0.000532 -0.003041 
+-0.001796 -0.001337 -0.000993 0.000659 -0.000496 0.000376 
+0.000150 0.000599 -0.000272 -0.000243 -0.000531 0.000834 
+-0.000693 -0.001972 0.000495 -0.001836 0.000024 -0.003647 
+-0.004091 0.003485 -0.004394 -0.002059 0.004119 -0.007481 
+-0.000227 0.001754 -0.000707 -0.003177 -0.003088 -0.003155 
+-0.001520 -0.000893 -0.000961 -0.003255 0.002691 0.004664 
+-0.001522 0.002174 -0.001304 -0.004561 0.000299 -0.000605 
+-0.007904 -0.002931 0.006554 -0.003381 0.003957 0.002158 
+-0.001646 0.003435 0.000264 0.006373 0.010621 -0.008547 
+-0.005455 0.005173 -0.010719 -0.006785 0.008344 -0.007409 
+-0.005005 0.006158 -0.002700 -0.000800 0.000440 -0.001835 
+0.003680 -0.002922 -0.004109 0.001433 -0.002163 -0.006785 
+0.003434 0.002566 -0.008249 0.007673 0.006699 -0.008946 
+0.010106 0.013660 -0.000642 -0.017353 0.022167 -0.007165 
+-0.000269 0.018787 -0.000603 -0.000123 0.001585 0.020481 
+1.032086 -1.556150 3.577540 2.270042 -3.004219 3.831224 
+2.461832 -4.339694 2.488550 1.516014 -5.064057 0.085409 
+-0.059603 -5.046358 -1.672185 -0.921642 -4.772388 -2.388060 
+-1.443182 -4.380682 -2.681818 -0.010473 -0.047878 -0.032979 
+-0.013672 -0.034389 -0.041777 0.038030 0.022413 -0.000144 
+0.000584 0.086163 0.035328 0.007151 0.140148 -0.003196 
+-0.073636 -0.057762 0.086643 -0.041829 -0.043211 0.065911 
+-0.045506 0.021179 -0.028775 0.043205 0.003848 -0.047754 
+0.042273 0.002955 -0.081591 0.019788 -0.018439 -0.037687 
+-0.000538 0.024739 0.004987 -0.017891 -0.007938 -0.016574 
+0.150632 -0.084981 0.016283 -0.001035 -0.023619 0.031381 
+-0.014883 0.014381 -0.016388 0.026441 -0.041550 -0.080714 
+-0.048514 0.009710 0.087246 0.020000 -0.030000 -0.066000 
+-0.019484 -0.036746 0.049563 -0.104865 0.076822 0.178627 
+-0.056028 -0.058063 0.068359 -0.030786 -0.045479 0.012686 
+0.024487 0.036330 -0.044760 0.030771 0.039255 -0.023486 
+-0.000120 -0.003886 0.000590 -0.011795 -0.026711 0.008128 
+-0.009961 0.006416 -0.001651 -0.003346 0.022910 -0.004776 
+-0.009229 -0.004565 0.017783 0.001170 -0.006017 0.001720 
+-0.000663 0.000646 -0.003574 -0.001416 0.001925 -0.000791 
+0.001029 -0.002384 0.003269 0.003245 -0.003329 -0.001118 
+0.000978 -0.001427 -0.008049 -0.002607 0.001604 -0.007534 
+-0.003452 0.001795 -0.005332 -0.003934 -0.000859 -0.003577 
+-0.000256 -0.001705 -0.000679 0.003250 0.002852 0.000828 
+0.000292 0.000108 0.001404 0.000661 0.004577 -0.005084 
+0.001021 -0.000640 -0.000455 -0.002899 0.000132 -0.001555 
+0.000649 0.003359 -0.003473 0.001197 0.000518 -0.005270 
+0.000113 -0.004487 -0.004913 -0.003071 -0.002977 -0.002518 
+-0.006412 -0.000992 0.000000 -0.003598 0.000024 0.006020 
+-0.000441 -0.000014 0.000138 -0.000186 -0.001359 -0.002520 
+-0.001569 0.000086 0.004421 0.005627 -0.000985 0.002580 
+0.006400 0.000756 0.003704 -0.000894 0.000621 -0.000042 
+-0.006409 0.004933 -0.002064 -0.007866 0.006846 -0.004692 
+-0.006628 0.011155 0.000144 -0.003904 0.002047 -0.001355 
+0.009079 0.007948 -0.006835 -0.001607 0.003679 -0.004355 
+0.002154 0.005423 -0.003063 0.001841 0.007752 -0.004383 
+0.006300 0.017523 -0.011055 -0.004330 0.021084 0.005892 
+0.002704 0.020554 -0.008333 0.002486 0.005804 0.018158 
+0.014640 -0.009492 0.029855 1.958549 -2.238342 3.108808 
+1.853333 -3.795556 1.875556 0.988930 -4.874539 -0.487085 
+-0.196375 -4.930513 -2.353474 -1.069767 -4.610465 -3.125000 
+-1.591078 -4.278811 -3.159851 -1.873333 -4.020000 -3.046667 
+-0.016004 -0.037680 -0.031521 -0.024014 -0.019088 0.000870 
+0.004635 0.007976 -0.004084 0.016981 0.042138 -0.027986 
+-0.018095 -0.024570 0.014044 0.028172 -0.026204 0.065769 
+0.020406 -0.019599 -0.089846 0.080165 0.005192 -0.001156 
+-0.017547 -0.013567 -0.001411 -0.041530 -0.007404 -0.005232 
+-0.044303 0.016393 0.019196 -0.046471 -0.022855 0.002539 
+0.046856 0.000897 -0.009482 -0.042191 -0.002854 -0.016713 
+-0.082578 0.082422 0.001240 0.025374 -0.007806 -0.010085 
+-0.077692 -0.027923 -0.009308 0.060833 -0.008333 -0.012500 
+-0.034615 -0.011538 0.076923 -0.041310 -0.004494 0.100595 
+-0.077807 -0.063175 0.013578 -0.026584 -0.023466 -0.002491 
+0.008585 0.002500 -0.030047 0.032923 0.028362 -0.029328 
+-0.010083 -0.007052 0.008491 -0.027235 -0.023922 0.009647 
+-0.013307 -0.000285 0.000584 0.003527 0.012085 -0.007211 
+0.000483 -0.004013 0.009612 -0.006231 -0.014458 -0.000462 
+0.000992 -0.000539 -0.001662 -0.002639 0.005758 -0.001675 
+-0.005039 -0.000537 -0.001133 -0.001619 -0.002095 0.006923 
+0.000583 -0.001348 0.001722 -0.000997 0.000997 -0.002658 
+-0.002360 0.000119 -0.003552 0.001875 0.000321 -0.002664 
+-0.000256 -0.001894 0.002214 -0.001214 0.000336 -0.000879 
+-0.000323 0.000573 -0.001752 0.005074 0.003138 -0.000571 
+0.001984 0.000427 0.000796 -0.000732 0.000043 -0.000467 
+-0.002465 0.000676 0.001156 0.002134 -0.001009 -0.005007 
+0.005756 -0.004366 -0.008931 0.003415 0.002977 -0.001962 
+-0.005739 -0.001501 -0.002030 -0.004613 0.000313 0.003459 
+0.000594 0.000297 0.001875 0.001568 -0.000259 -0.002155 
+0.000868 -0.001497 -0.007395 0.003049 -0.002280 0.000594 
+0.001407 0.002257 0.002876 -0.003464 0.006411 0.004704 
+-0.007030 0.007371 0.002722 -0.006090 0.008195 0.000029 
+-0.002647 0.009212 -0.005798 0.004529 0.002930 -0.001776 
+-0.002718 0.004190 -0.000170 0.002150 0.005346 -0.002459 
+-0.001927 0.005487 0.001277 -0.001030 0.012324 -0.001466 
+0.007161 0.016542 -0.009314 -0.006228 0.004579 0.002189 
+-0.010718 0.011087 -0.006861 0.004629 0.008569 -0.002257 
+0.012325 -0.005381 0.012192 0.020055 -0.020062 0.019456 
+1.807910 -3.310735 2.022599 0.856522 -4.391304 -0.456522 
+-0.389068 -4.627010 -2.591640 -1.258065 -4.588710 -3.413979 
+-1.648571 -4.448571 -3.425714 -1.773279 -4.206478 -2.894737 
+-1.715385 -3.930769 -2.100000 -0.025910 -0.025080 -0.013042 
+-0.022074 -0.013933 -0.003316 0.013086 0.004766 -0.027129 
+0.034533 0.021768 -0.040064 0.058716 0.040111 -0.020344 
+0.573431 0.112496 0.045380 0.465506 -0.142471 0.329129 
+-0.078277 0.088487 -0.039706 -0.087009 0.112551 -0.052434 
+-0.025558 0.029066 -0.042596 0.017898 -0.015623 -0.022510 
+0.003358 -0.004718 -0.003543 0.006690 -0.009333 0.007646 
+0.027628 0.022502 0.059350 0.033409 -0.000947 -0.023220 
+-0.015692 0.062308 0.005231 0.006385 0.000308 -0.001154 
+-0.058663 -0.024529 0.011201 -0.083769 -0.000789 0.005476 
+0.019420 -0.009569 -0.002369 0.011805 -0.007636 -0.013043 
+-0.010074 0.001698 0.021823 -0.004628 0.015501 -0.003826 
+0.000327 0.003818 -0.000994 -0.014912 -0.013827 0.001741 
+-0.005811 0.006750 0.001100 0.004404 0.013741 -0.013064 
+0.000492 -0.001148 -0.007255 0.002501 -0.002172 0.000278 
+0.001316 -0.000328 -0.003403 -0.000066 0.008909 -0.006501 
+-0.006879 0.005505 -0.000472 -0.003077 0.001967 0.011864 
+0.000875 -0.005045 0.011587 0.000041 -0.004631 0.002219 
+-0.000623 -0.000425 -0.000236 0.001417 -0.001548 -0.001988 
+-0.005814 -0.001983 0.001189 -0.006750 -0.004807 0.004704 
+-0.002441 -0.001519 -0.000380 0.004972 -0.003593 -0.003823 
+0.002237 -0.003252 -0.000554 -0.001125 0.001940 0.000110 
+-0.002035 0.003539 0.001128 0.002938 -0.000330 -0.001854 
+-0.000967 0.000362 -0.008459 -0.003377 0.000370 -0.008442 
+-0.001871 -0.001803 -0.001068 -0.000460 -0.000489 0.000538 
+-0.002952 -0.001808 0.005240 -0.003611 -0.000063 0.005197 
+-0.000229 0.000229 -0.006489 -0.000570 0.005699 0.001554 
+-0.000168 0.008311 -0.000865 -0.004146 0.006398 0.003007 
+-0.003592 0.003825 0.001567 -0.002391 0.000160 -0.000034 
+-0.002116 -0.000302 -0.005037 -0.003366 0.000260 0.000934 
+-0.005403 0.004816 0.004067 -0.007204 0.004971 0.004034 
+-0.003156 0.005984 0.003566 0.000937 0.006033 -0.001730 
+0.006098 0.003303 -0.010101 0.003243 -0.004759 -0.006561 
+-0.000768 0.007250 -0.000763 -0.001753 0.004543 -0.008656 
+0.001798 -0.004850 0.005445 0.013930 -0.011309 0.008713 
+0.017989 -0.022359 0.014056 1.154286 -3.525714 -0.005714 
+0.068085 -4.723404 -2.531915 -0.917460 -5.146032 -3.622222 
+-1.425414 -4.867404 -3.723757 -1.577982 -4.366972 -3.220183 
+-1.384615 -3.705882 -2.366516 -0.016281 -0.015620 -0.010660 
+-0.001684 -0.002757 0.005433 0.010402 -0.001251 0.006602 
+-0.006305 -0.002926 0.002276 -0.012780 -0.002645 -0.002481 
+0.019455 0.017272 -0.023135 0.031543 0.012657 -0.013489 
+0.007106 0.005145 -0.005848 -0.004938 0.002528 -0.002348 
+-0.010836 0.000293 0.000189 0.009876 0.002453 -0.003023 
+0.020029 -0.007667 0.022752 -0.019602 0.012825 -0.015422 
+-0.012824 -0.006800 -0.012306 -0.002205 0.026513 -0.070718 
+-0.030897 0.118872 -0.083256 0.043553 -0.080579 0.018868 
+0.034583 -0.095417 -0.030417 -0.143551 0.006328 0.019466 
+0.010930 0.009955 -0.005964 -0.016794 -0.051528 0.026184 
+-0.018034 -0.016501 0.027060 -0.010683 0.006657 0.011327 
+0.000511 0.007480 -0.000314 -0.006985 -0.011285 0.000360 
+-0.001271 -0.004502 0.001460 0.002093 0.003340 -0.007943 
+0.001649 0.006250 -0.004525 -0.002725 0.003979 -0.007612 
+-0.009945 0.004708 -0.007921 -0.001464 0.007888 -0.002267 
+-0.002669 0.003371 0.002529 0.002106 0.002397 0.003743 
+0.001197 -0.007425 0.004618 -0.000214 -0.003196 0.002893 
+0.000017 0.002148 0.000097 -0.003409 0.003322 0.001257 
+-0.003882 0.000549 0.004215 -0.000320 -0.001501 0.002478 
+0.003369 0.000655 -0.001205 0.004079 0.002502 -0.000103 
+0.000074 0.001313 0.002664 -0.000944 0.003855 0.000275 
+-0.000862 0.000951 -0.001198 -0.000385 0.000384 -0.000637 
+0.000631 0.002564 -0.001737 0.002879 0.003217 -0.005824 
+0.003384 0.002755 -0.008009 -0.000101 0.002503 -0.004071 
+-0.001451 -0.002752 0.003855 0.001434 -0.001583 0.006949 
+0.007273 0.002680 -0.006701 0.004323 0.005301 -0.001278 
+0.000464 0.004829 0.002084 -0.000197 0.004389 0.001548 
+0.001815 0.001102 0.000367 0.003079 -0.001680 -0.001735 
+0.001173 -0.001908 -0.003561 0.003081 0.002122 0.000668 
+0.000991 0.011165 0.001341 -0.006204 0.011889 0.003105 
+-0.000468 0.002615 -0.001652 -0.002127 -0.000091 -0.000983 
+0.006919 0.005187 -0.006909 0.005736 0.010516 -0.011509 
+0.000918 0.003834 -0.012818 -0.004819 0.000205 -0.006357 
+0.001749 -0.001893 0.004459 0.007766 0.002296 0.005012 
+0.005925 -0.005843 0.001097 0.002871 -0.022326 0.007254 
+0.496933 -4.472393 -2.546012 0.075221 -5.340708 -4.199115 
+-0.485246 -5.196721 -4.239344 -0.823353 -4.718563 -3.634731 
+-0.871429 -4.014286 -2.825000 -0.015885 -0.017046 -0.015622 
+-0.002244 -0.001252 -0.001029 0.004170 -0.001966 0.003865 
+-0.000520 -0.002240 0.002038 0.000101 0.000861 -0.001003 
+0.004684 0.004581 -0.006680 0.006991 0.006132 -0.005663 
+0.004328 -0.000193 0.000568 -0.002040 -0.004008 0.004443 
+-0.006974 -0.001120 0.002289 -0.006771 -0.002179 -0.000317 
+-0.000116 -0.000634 0.000803 -0.015627 0.022806 -0.047895 
+0.005014 0.054687 -0.069208 -0.037214 0.033112 -0.036409 
+0.059186 0.107605 -0.096845 0.063636 -0.013531 -0.067657 
+0.006634 0.025704 -0.096461 -0.021808 -0.019449 0.037941 
+-0.048750 -0.021317 0.066996 -0.021650 0.005114 0.014150 
+0.002737 -0.034224 -0.015947 -0.002012 -0.005836 0.000547 
+-0.005617 0.003065 0.001877 -0.013413 -0.007544 0.004717 
+-0.003080 -0.010276 0.003201 -0.000608 -0.001486 -0.000923 
+-0.001437 0.005447 -0.001145 -0.001633 0.009581 -0.001045 
+-0.009212 -0.002579 -0.000315 -0.000704 0.000631 -0.002866 
+0.000939 -0.004825 0.000269 0.001047 -0.003864 0.000926 
+-0.000757 -0.001685 -0.002117 0.000439 0.000404 -0.003527 
+-0.000547 0.000233 0.001268 0.000102 -0.000854 0.004465 
+0.000232 -0.000369 0.000214 0.002535 -0.000250 -0.002128 
+-0.003667 0.001833 -0.005000 -0.004254 0.003545 0.002520 
+-0.004506 0.003379 0.007280 -0.005685 -0.000554 0.004806 
+-0.003759 -0.001022 0.002077 0.000004 -0.001761 0.001324 
+0.001499 0.000579 0.004225 0.004188 0.000147 0.001103 
+0.001891 0.002621 -0.005687 -0.003411 0.002853 -0.006403 
+0.000191 0.001603 -0.000085 0.000313 0.001482 0.000345 
+0.003333 0.006105 -0.002497 0.002747 0.004244 0.001405 
+0.001345 0.002789 0.001685 0.001886 0.002066 0.001901 
+0.005010 0.004310 0.000014 -0.000302 0.005739 -0.001471 
+-0.002396 0.002865 -0.004112 0.005600 0.006373 -0.007272 
+0.001040 0.006532 -0.005388 -0.001244 0.003898 -0.000585 
+-0.003439 -0.000227 0.001810 -0.001964 -0.000568 0.000623 
+-0.000827 0.000498 -0.002269 -0.000414 0.001513 -0.005209 
+-0.000941 0.001058 -0.006796 -0.004614 0.003134 -0.004639 
+0.002747 0.004229 0.001683 0.006127 0.002873 0.004917 
+0.003707 -0.002589 0.002276 0.002757 -0.013709 -0.001942 
+0.018561 -0.022498 -0.001451 1.258242 -4.901099 -3.725275 
+1.133891 -5.849372 -4.447699 0.592466 -5.486301 -4.191781 
+0.132653 -4.350340 -3.581633 -0.154812 -2.974895 -2.589958 
+-0.007243 -0.013572 -0.010544 -0.001932 -0.009448 0.006714 
+-0.000843 -0.003059 -0.001036 0.001591 -0.002999 -0.002333 
+0.003248 0.001777 -0.005774 0.002063 0.003242 -0.002572 
+0.002719 0.001088 -0.000323 0.001499 -0.000199 -0.001080 
+0.000325 0.000959 -0.001688 -0.001152 -0.000091 -0.000350 
+-0.001590 -0.001268 -0.000298 -0.002568 -0.000298 -0.004164 
+-0.001896 -0.002419 0.001580 -0.038330 -0.026963 0.026567 
+0.023928 0.015127 -0.022828 0.020421 0.006423 -0.019957 
+0.006426 0.023549 -0.029970 -0.013189 -0.018119 0.007608 
+-0.010877 -0.021430 0.009996 -0.000724 -0.002733 -0.004870 
+-0.000779 0.014931 -0.021099 0.001249 -0.001832 -0.001693 
+-0.005648 0.002403 0.003554 -0.013727 0.000762 0.002895 
+-0.007391 0.000618 0.005748 -0.005139 -0.001381 -0.005835 
+-0.005864 0.007349 -0.006444 0.002746 0.015041 0.000369 
+-0.001141 0.000928 0.000492 -0.000443 -0.003578 -0.001726 
+-0.002681 -0.010922 0.003737 -0.006253 -0.007969 0.003392 
+-0.002918 -0.000082 -0.007005 -0.002266 0.004566 -0.009936 
+0.000590 -0.001301 -0.006036 0.001430 -0.002639 0.000393 
+0.001170 -0.001398 -0.000314 -0.001545 0.001626 -0.002033 
+-0.004373 0.001521 -0.001780 -0.005551 0.001060 0.001036 
+-0.006448 0.002259 0.003342 -0.005726 0.000721 0.003138 
+-0.001756 -0.001898 -0.000069 0.000444 -0.002112 0.000844 
+0.001992 0.001250 0.000920 -0.000561 0.003874 -0.001381 
+0.000136 0.002295 -0.001020 -0.001712 -0.000979 -0.002836 
+0.004435 0.000647 -0.001694 0.003910 0.004342 -0.003623 
+-0.002370 0.005141 -0.002652 -0.001412 0.003667 0.000986 
+0.002017 0.003054 0.002672 0.004262 0.002143 0.001753 
+0.001121 0.010622 -0.006609 -0.000113 0.009899 -0.002900 
+0.002434 0.007849 -0.002438 -0.002375 0.003122 0.000085 
+-0.000471 0.002270 0.000126 -0.000530 -0.001607 -0.000613 
+0.000119 -0.001493 0.000956 -0.000788 -0.000180 0.000707 
+-0.001526 -0.001945 -0.000325 -0.001168 -0.001325 -0.001573 
+-0.001260 0.002991 -0.003864 -0.000449 0.010438 -0.007582 
+-0.001368 0.013078 0.004562 0.011076 0.011108 0.001222 
+0.005930 0.012272 -0.001854 0.001204 0.001189 0.000970 
+0.011264 -0.008166 -0.010395 1.643243 -3.578378 -1.562162 
+2.613954 -5.381395 -2.934884 2.241636 -5.847584 -3.828996 
+1.407407 -5.185185 -3.848485 0.559702 -3.873134 -3.149254 
+-0.118812 -2.549505 -1.628713 -0.002168 -0.017127 0.003904 
+0.002737 -0.001759 0.000660 0.002783 0.000332 -0.006318 
+-0.001307 0.002947 -0.005815 -0.000588 -0.002481 0.002292 
+-0.001696 -0.002508 0.004592 0.000383 0.000205 0.000568 
+0.000419 0.002004 -0.000478 0.001513 0.001340 0.000743 
+0.000219 0.001122 0.002622 0.001092 0.000294 0.002511 
+-0.000543 -0.004727 0.005766 -0.000801 -0.003656 0.004119 
+-0.002564 0.000518 -0.001061 -0.006339 -0.002084 0.003727 
+-0.001773 0.001026 -0.002408 0.005588 0.023498 -0.021904 
+-0.011075 -0.007218 0.015146 -0.010439 0.000535 0.028182 
+-0.002485 0.005006 -0.000142 -0.002847 0.003985 -0.000412 
+-0.004031 0.006829 -0.001504 -0.008543 0.004643 0.002174 
+-0.013684 -0.002722 0.003272 -0.004642 0.002010 0.005133 
+-0.006074 0.003260 -0.016940 -0.010718 0.011900 -0.017361 
+-0.005365 0.003141 -0.001315 0.000162 -0.003939 0.001783 
+-0.001379 -0.004723 0.012858 -0.013297 -0.006658 0.005733 
+-0.001641 0.000549 -0.006951 -0.001941 0.006977 -0.006442 
+-0.001767 0.002619 -0.000817 0.001624 0.000200 0.000243 
+-0.000452 -0.000618 0.001759 -0.000936 -0.002447 -0.000030 
+-0.001248 -0.000094 -0.001116 -0.003787 0.002101 -0.000958 
+-0.005916 -0.000585 0.002081 -0.001155 -0.000042 -0.001754 
+-0.001760 -0.000746 -0.001546 -0.001483 0.003120 -0.002548 
+-0.000585 0.006274 -0.006639 0.000274 0.005763 -0.007501 
+-0.000824 0.001738 -0.003656 0.000226 -0.002778 -0.001807 
+0.001500 -0.002032 -0.000411 -0.003020 0.003546 -0.003125 
+-0.000850 0.000256 -0.002060 0.000560 0.003094 -0.001106 
+0.001038 0.006160 -0.002294 0.000281 0.008340 -0.004534 
+-0.007026 0.004720 -0.004660 -0.004072 0.005393 -0.002531 
+0.001158 0.001285 -0.000513 0.001748 0.000486 0.003996 
+0.002300 0.002227 0.003353 0.001102 0.001530 -0.001597 
+-0.000710 0.000688 -0.002277 0.001377 -0.001221 -0.000364 
+0.000075 0.001688 -0.000620 0.000562 0.002832 0.000097 
+0.001549 0.005364 -0.001030 0.003789 0.008796 -0.001694 
+0.004882 0.014146 0.001642 0.018941 0.017071 -0.000857 
+0.007281 0.027788 -0.019558 -0.002974 0.014737 -0.010050 
+0.002421 -0.002901 0.000017 0.013035 -0.009018 0.010140 
+2.468880 -3.385892 -0.273859 2.810036 -4.870968 -2.082437 
+2.294872 -5.400641 -3.118590 1.566901 -4.549296 -2.996479 
+0.633803 -2.713615 -1.802817 0.000459 -0.014968 0.000065 
+-0.000265 -0.000497 -0.001064 0.001616 0.006865 -0.008483 
+-0.002720 0.003627 -0.004684 -0.001611 0.002052 -0.000299 
+-0.006069 0.006015 0.002091 -0.003542 0.005566 0.000330 
+0.001190 0.004975 -0.000678 0.003512 0.003158 -0.002173 
+0.000129 0.003134 -0.002539 0.002163 0.003471 0.000576 
+0.003887 0.004687 -0.002979 0.004809 0.006791 -0.005548 
+0.002022 0.003019 -0.003594 0.002915 0.001906 -0.002849 
+0.002926 0.003483 -0.002484 0.006898 0.005881 -0.004837 
+-0.001410 -0.008476 0.015376 -0.012485 -0.009781 -0.006491 
+0.025772 0.038467 -0.114479 0.002314 0.002514 -0.007085 
+-0.001910 -0.002308 0.003722 -0.004573 0.002132 -0.002245 
+-0.000422 0.003828 -0.001017 0.000408 0.006102 -0.004075 
+0.002505 0.012084 -0.015369 0.000891 0.013898 -0.016457 
+-0.004400 0.005936 -0.009315 -0.002242 0.002857 -0.004627 
+-0.003046 -0.001553 -0.012948 0.009502 0.016994 -0.021296 
+-0.000458 0.013233 -0.017265 -0.003289 0.005653 -0.002446 
+-0.000009 0.002462 0.001908 -0.000603 -0.001159 0.000218 
+0.001455 -0.001700 -0.002748 0.000417 0.000000 -0.003250 
+0.000099 -0.001059 -0.000542 -0.000045 0.000279 0.000574 
+-0.004026 -0.001948 -0.000064 -0.004183 -0.002758 -0.001412 
+-0.007970 -0.000827 0.000827 -0.007612 0.000408 -0.001088 
+-0.002488 -0.000450 -0.004004 0.000135 0.000623 -0.004200 
+0.001457 -0.000364 -0.003730 -0.000996 0.001769 -0.003485 
+-0.002302 -0.000900 -0.003168 -0.003359 0.000362 -0.002997 
+-0.001606 -0.001009 -0.001162 -0.004263 -0.001705 -0.001534 
+-0.000610 0.000172 -0.005820 0.004093 0.001364 -0.008217 
+0.000749 -0.001146 -0.000582 0.000782 0.000326 0.000522 
+-0.001789 0.000457 0.001275 0.001053 -0.001776 0.002884 
+0.000497 -0.000286 0.000663 -0.001660 0.001283 0.000415 
+0.003086 0.006709 0.000085 0.004576 0.001527 -0.002748 
+0.000424 -0.000453 -0.000449 -0.000897 -0.000587 0.002803 
+0.002621 -0.000538 0.005713 0.007070 0.001929 0.008271 
+0.004672 0.009016 0.008873 0.013548 0.010107 0.002119 
+0.006083 0.024708 -0.022392 -0.000257 0.011995 -0.005609 
+-0.001236 -0.000320 0.012267 0.096667 -1.176667 1.773333 
+1.369565 -2.239130 1.189441 2.327434 -3.705015 -0.162242 
+2.482759 -4.649426 -1.525862 2.056106 -4.313531 -1.996700 
+1.142857 -2.769585 -1.184332 0.002080 -0.015594 0.006524 
+-0.007100 -0.006851 0.010286 -0.001674 0.001318 -0.004083 
+0.002343 0.003457 0.000357 0.001394 0.006772 -0.004537 
+-0.005979 0.008088 -0.000911 -0.003652 0.004463 -0.001567 
+-0.001888 0.000045 0.001307 -0.000454 -0.000154 0.000902 
+-0.001356 0.001175 -0.001734 -0.001878 0.005262 -0.000365 
+-0.000754 0.005491 0.004020 -0.001805 -0.000175 -0.000308 
+-0.002110 -0.000214 -0.001948 0.000089 0.002481 -0.001340 
+0.001718 0.004189 -0.000403 0.000539 -0.000283 0.000042 
+-0.001999 0.004295 -0.006899 -0.006045 0.004946 -0.012073 
+0.000810 -0.006848 0.019478 -0.139303 -0.875622 3.601990 
+-0.295455 -0.836364 3.254545 0.003526 -0.004650 0.017426 
+0.000759 0.010977 -0.008414 0.002961 0.011645 -0.018947 
+-0.003099 0.005496 -0.005014 0.001987 0.007283 -0.000371 
+-0.002713 0.007025 -0.001676 -0.000800 0.005101 -0.005663 
+-0.005031 0.007422 -0.005701 -0.003972 0.007729 -0.005829 
+-0.002565 0.006333 -0.005469 -0.001850 0.003399 -0.002880 
+-0.000663 0.002005 -0.000822 -0.000550 0.002055 -0.002734 
+-0.001147 0.002641 -0.004055 0.001663 -0.000002 -0.003322 
+0.001151 -0.001176 -0.000385 0.000825 0.000944 -0.001062 
+0.000208 0.003597 -0.001038 -0.002197 0.001823 -0.003284 
+-0.004214 0.000689 -0.002756 -0.003256 0.000091 -0.004529 
+-0.001157 0.000793 -0.007286 -0.001448 0.001065 -0.006431 
+-0.001647 -0.001802 -0.002749 -0.000440 0.000345 0.000723 
+0.000270 -0.000015 -0.000225 0.001775 0.000122 0.000309 
+0.000420 0.005551 0.002245 -0.000088 0.005002 0.000381 
+-0.001196 0.003018 0.000692 -0.002286 0.000044 -0.000549 
+-0.000977 -0.001002 -0.002949 -0.000254 -0.003241 -0.003015 
+0.003208 -0.004767 -0.001008 0.001026 0.000445 -0.000224 
+0.001374 0.002609 0.000878 -0.000012 0.007242 -0.001791 
+-0.001003 0.005576 -0.005138 0.001308 0.003662 -0.002592 
+0.001544 0.000221 0.000704 0.002196 -0.001770 -0.001737 
+-0.002519 -0.003447 0.000763 -0.000374 -0.004519 0.003516 
+0.000503 0.008684 0.003141 0.013131 0.022047 0.000865 
+0.001762 0.018930 -0.006014 -0.001908 0.000296 0.018149 
+-0.518797 -0.796992 2.710526 0.462185 -1.226891 2.554622 
+1.430993 -2.000000 1.753027 2.194836 -3.173709 0.774648 
+2.431169 -4.015584 -0.293507 2.082192 -3.832192 -1.133562 
+0.013554 -0.021946 -0.009773 0.002758 -0.007692 0.004111 
+-0.003287 0.002513 -0.000862 -0.000254 -0.000120 -0.005279 
+0.002179 -0.002616 -0.008068 -0.000215 -0.001986 -0.005677 
+-0.000829 -0.002330 -0.000114 -0.003785 -0.001159 -0.001054 
+-0.003068 -0.000329 -0.002108 -0.005993 -0.003730 -0.002109 
+-0.000649 -0.001074 0.000477 0.000216 0.001986 0.000916 
+-0.000333 0.001900 0.000553 -0.005118 -0.001028 -0.001337 
+-0.003719 -0.004256 0.005020 -0.002630 -0.000574 -0.005046 
+-0.004946 -0.004193 -0.003389 0.000496 -0.004480 -0.006178 
+-0.005485 0.005047 -0.001099 -0.661290 -1.053763 4.376344 
+-0.726027 -1.750000 5.537671 -0.715116 -1.540698 5.084302 
+-0.668942 -1.249147 4.283277 -0.003390 -0.008216 0.027087 
+-0.001915 -0.002520 0.000611 -0.003399 0.000294 -0.003303 
+-0.007314 0.000962 0.006498 -0.006000 -0.004064 0.012363 
+-0.000702 -0.009120 0.004559 -0.007071 -0.001444 0.008888 
+-0.003253 -0.001017 0.009009 -0.000440 -0.000632 0.003443 
+0.000791 -0.000281 -0.001566 -0.000196 -0.000673 -0.004054 
+-0.001332 0.000194 -0.002429 -0.001876 0.003022 0.000833 
+-0.003799 0.002829 -0.000192 -0.004124 0.002280 0.004009 
+-0.002230 0.003825 0.004145 -0.002429 -0.001582 0.002637 
+0.001291 0.002582 -0.000142 -0.000111 0.003756 -0.002208 
+-0.002565 0.002923 -0.001641 -0.003682 0.001231 -0.003380 
+-0.001866 0.000981 -0.004745 -0.000159 0.001475 -0.003700 
+0.000378 -0.000003 -0.002077 0.001826 -0.002533 -0.001895 
+0.002815 -0.002916 -0.001334 0.000801 -0.000130 0.000297 
+0.000086 0.008455 -0.005338 0.007178 0.008206 -0.000101 
+0.001653 0.001688 0.000855 -0.003362 -0.000622 -0.000162 
+-0.002332 -0.000853 -0.001301 0.000676 -0.002985 0.001544 
+0.000706 -0.000003 0.001775 0.001734 -0.000675 -0.000487 
+-0.001212 0.000792 -0.001968 -0.000006 0.002494 -0.003692 
+0.001953 0.002659 -0.001027 0.001411 0.003138 0.000149 
+0.001396 0.002182 0.001084 0.003672 -0.001757 0.001397 
+0.000914 -0.003540 -0.003769 0.001472 -0.003169 -0.006439 
+0.000464 0.004916 -0.012491 0.003500 0.019573 -0.017663 
+-0.003392 0.004206 0.008599 0.001291 -0.012143 0.033171 
+1.590580 -1.427536 3.771739 2.150943 -1.630728 3.366577 
+2.416867 -2.072289 2.619277 2.428571 -2.691327 1.637755 
+2.197411 -3.223301 0.333333 1.674877 -3.182266 -1.029557 
+0.013845 -0.011315 -0.013177 0.006731 -0.000562 -0.003514 
+0.000849 0.003198 -0.003876 0.006342 0.000901 -0.001511 
+-0.000862 -0.002931 -0.003592 0.001431 -0.003254 -0.000564 
+-0.000625 -0.005298 -0.001893 -0.002829 -0.003546 -0.003754 
+-0.005882 -0.002455 -0.002888 0.000058 -0.000714 -0.001328 
+0.001119 0.004700 -0.001630 0.001116 0.005984 -0.001608 
+0.001059 0.004235 -0.000452 -0.001264 0.000913 0.002595 
+-0.001939 0.001764 -0.001387 -0.011085 -0.005050 -0.015024 
+0.000857 -0.016369 -0.007256 0.003768 0.003926 -0.012021 
+-0.373832 -0.476636 3.845794 -0.784024 -1.180473 5.502959 
+-0.934037 -1.456464 5.722955 -0.985030 -1.440120 5.242515 
+-0.976096 -1.171315 4.183267 -0.009041 -0.007305 0.024599 
+-0.001367 -0.006260 0.009154 0.000110 0.000479 0.004640 
+-0.000826 0.000501 0.002242 0.000114 0.000495 0.000218 
+-0.001408 0.000757 0.006631 -0.003340 -0.002358 0.010965 
+-0.001718 -0.002588 0.005751 0.000244 -0.000540 0.000071 
+0.001329 0.001218 -0.001794 0.000242 0.001590 -0.003733 
+-0.000316 -0.001144 -0.006451 0.002256 0.002584 -0.005911 
+-0.000319 0.001292 -0.001695 -0.000847 0.001458 0.003222 
+-0.001948 -0.000263 0.004808 -0.000737 0.001432 0.002496 
+-0.004548 -0.002384 0.002811 -0.007167 -0.002834 0.003842 
+-0.005806 -0.001303 0.002487 -0.001103 0.000114 -0.002168 
+0.000342 -0.001310 -0.004313 -0.002983 0.002095 -0.004125 
+-0.001664 0.006016 -0.006654 0.005981 0.000252 -0.007051 
+0.001960 -0.001866 -0.002771 0.000703 -0.000433 -0.000527 
+0.007571 0.008494 -0.004210 0.008596 0.010028 -0.005745 
+0.002660 0.012092 -0.007376 0.002696 0.008808 -0.002177 
+0.002044 0.002576 0.000644 0.005435 0.002819 0.000512 
+0.002029 0.001477 -0.005352 -0.000433 -0.000162 -0.000619 
+-0.001380 0.002424 -0.000281 -0.000777 0.001212 -0.006790 
+0.003301 -0.000101 -0.002647 0.001877 0.007902 -0.000925 
+0.003052 0.009886 -0.008293 0.008971 0.001229 0.000768 
+-0.003160 0.003716 -0.008097 -0.003640 0.007275 -0.019135 
+0.001049 0.012877 -0.029366 0.001022 -0.001724 -0.008322 
+0.012367 -0.013142 0.027399 2.296117 -1.645631 4.223301 
+2.663300 -2.023569 4.558923 3.190341 -2.196023 4.392045 
+3.502941 -2.308824 3.955882 3.229323 -2.462406 3.131579 
+2.341177 -2.617647 1.364706 0.021047 -0.011315 -0.011917 
+0.010050 -0.001883 -0.021955 0.004647 0.006581 -0.008052 
+0.003834 0.003307 -0.003035 0.006015 -0.001383 -0.001581 
+0.004453 -0.002507 0.001143 0.005091 0.000919 0.000446 
+0.000824 -0.000116 0.000280 -0.002619 -0.000069 -0.000901 
+0.000951 0.003488 -0.002318 -0.000959 0.002284 -0.003384 
+-0.001385 0.002757 0.000438 -0.000874 0.002467 0.000667 
+0.002400 0.000350 0.002097 0.000547 0.000390 0.004869 
+-0.001288 0.001030 -0.000630 -0.009126 -0.006470 -0.011377 
+0.022856 0.000310 -0.016122 0.000437 0.008394 0.001251 
+-0.481982 -0.180180 4.707207 -0.664740 -0.774566 5.858381 
+-0.779449 -1.087719 5.411027 -0.808625 -1.161725 4.088949 
+-0.825503 -0.929530 2.580537 -0.003881 -0.005194 0.015999 
+-0.003874 0.002535 0.009181 -0.003518 0.003541 -0.000091 
+0.003601 0.001441 -0.005403 0.004057 -0.000825 -0.001777 
+0.000203 0.000192 0.001575 -0.000523 0.000142 0.002670 
+0.001001 -0.004649 0.003642 -0.000775 -0.003141 0.002983 
+-0.002147 0.001359 0.001207 -0.000166 0.008143 -0.002940 
+-0.001782 0.001168 0.000210 -0.000183 0.003141 -0.006179 
+0.001602 -0.000774 -0.002652 0.002954 -0.002179 0.001283 
+0.001142 0.001292 0.001682 0.002043 0.002363 0.001402 
+-0.001499 0.000780 0.000245 -0.003777 0.001469 -0.001515 
+-0.004602 0.000600 -0.002656 -0.000886 -0.000564 -0.003145 
+0.005235 0.000424 -0.003021 0.006199 0.002496 0.001251 
+0.002071 0.006133 -0.002771 -0.001894 0.001754 -0.002159 
+-0.001729 0.001203 -0.002406 0.004818 0.001853 -0.004848 
+0.003206 0.008667 0.001387 0.002901 0.001307 0.001852 
+0.000977 0.000115 -0.000242 -0.002086 0.000156 -0.000857 
+-0.003511 -0.000775 -0.001433 0.001594 0.002186 -0.002623 
+0.002428 -0.001249 -0.005897 0.006917 0.006917 -0.006316 
+-0.000423 -0.001190 -0.004418 0.001223 0.004306 -0.003680 
+-0.001339 0.003701 -0.001024 -0.003338 0.003060 -0.000716 
+0.000136 0.002562 -0.001885 -0.001417 0.000098 -0.003271 
+-0.004707 0.003007 -0.008490 -0.010822 0.011369 -0.016164 
+0.000081 0.012972 -0.030765 -0.000304 0.001479 0.002006 
+0.016524 -0.006084 0.025051 2.018518 -1.388889 3.944444 
+2.661491 -1.776397 4.763975 3.444444 -2.003086 5.256173 
+4.025548 -2.145985 5.386861 3.802139 -2.213904 4.898396 
+0.017595 -0.021770 0.028885 0.010483 -0.011112 -0.012308 
+0.019117 0.003930 -0.011813 0.004664 0.003868 0.001075 
+0.001273 0.002694 0.002371 0.004468 -0.000388 -0.001266 
+0.007935 0.000273 -0.003430 0.004656 0.001778 -0.001547 
+0.001290 0.001321 -0.000314 -0.000045 0.001654 -0.001750 
+-0.002813 0.001594 -0.002750 -0.003964 0.002701 -0.000639 
+-0.001319 0.002007 -0.000088 0.000611 -0.001150 -0.001195 
+0.001668 -0.002752 -0.001598 0.001433 -0.002555 -0.000929 
+-0.003597 0.002551 -0.008157 -0.004848 -0.008707 -0.015098 
+0.006225 0.012651 -0.030761 0.001177 0.006713 0.007204 
+-0.594595 -0.108108 4.589189 -0.539249 -0.672355 5.843003 
+-0.457895 -0.913158 5.257895 -0.415000 -0.937500 3.815000 
+-0.490854 -0.847561 2.295732 0.001342 -0.003528 0.008336 
+-0.000878 0.001182 -0.006613 0.005501 -0.001762 -0.007171 
+0.000013 0.001481 -0.003848 0.001207 -0.000664 -0.002471 
+0.002254 0.001369 -0.002597 -0.001063 0.000663 -0.000794 
+-0.000118 -0.001957 0.001904 -0.003985 -0.000106 -0.000478 
+-0.001667 0.000696 0.001972 -0.002693 0.000576 -0.000268 
+0.000427 0.004385 0.001798 0.000607 0.001041 0.000824 
+-0.001002 -0.002160 0.000186 -0.002138 -0.004345 0.000000 
+-0.004863 -0.003621 0.003831 -0.001123 -0.004636 0.004463 
+0.000395 -0.000963 0.001722 -0.000755 -0.002003 -0.003185 
+-0.005286 -0.004793 -0.002115 -0.002426 -0.003365 -0.000039 
+-0.000572 0.001510 0.001262 0.000559 0.002903 0.001803 
+-0.001037 -0.000130 0.000593 -0.002242 -0.002860 -0.000541 
+-0.001643 -0.000739 -0.000296 0.004476 0.003350 -0.007880 
+-0.004152 0.004450 -0.001268 -0.002073 0.003653 0.001053 
+-0.000732 0.002683 -0.001870 -0.003060 0.000002 -0.002720 
+-0.004091 0.000114 -0.001932 -0.003409 -0.000195 0.000361 
+-0.002270 -0.001941 0.001507 -0.001393 0.001393 0.000199 
+0.000522 0.004618 -0.000919 0.000001 0.005985 -0.006653 
+0.000107 0.004992 -0.005678 -0.004445 -0.001414 -0.003608 
+0.000789 -0.000894 0.001315 -0.001764 0.000929 0.004687 
+-0.001642 0.003760 -0.000521 -0.006369 0.006549 -0.003467 
+-0.002098 0.009405 -0.014332 0.001631 0.005587 0.004936 
+0.014122 -0.001871 0.018354 1.814035 -0.817544 3.042105 
+2.331269 -1.247678 3.996904 2.755627 -1.530547 4.832798 
+2.848837 -1.651163 5.193799 2.198895 -1.502762 4.546961 
+0.004761 -0.008150 0.022493 -0.005969 -0.000098 -0.009391 
+0.002458 -0.004029 -0.003692 0.004183 0.001759 0.001026 
+0.003662 0.000815 -0.000384 0.009586 0.000320 -0.006230 
+0.006955 0.001555 -0.004165 0.001561 0.000754 -0.000525 
+-0.001650 0.000603 0.000060 -0.003809 0.003990 -0.001075 
+-0.002763 0.005887 0.001095 -0.004730 0.002894 0.002609 
+-0.002468 0.002793 0.001892 -0.000967 -0.000957 -0.001376 
+-0.000674 -0.004744 -0.005883 -0.001395 -0.004236 -0.005836 
+-0.005104 0.003800 -0.004518 -0.003727 -0.001922 -0.006788 
+-0.005357 0.006567 -0.014085 0.000385 0.005142 0.003370 
+0.000599 0.001450 0.029634 -0.035294 -0.282353 4.325490 
+0.035714 -0.639610 4.435065 0.074324 -0.837838 3.550676 
+0.002592 -0.004833 0.020403 0.002189 -0.002359 -0.000953 
+-0.002436 0.000505 -0.013710 0.000412 0.001398 -0.004620 
+-0.000096 0.001216 0.001394 0.001775 0.004544 -0.000904 
+0.002430 0.000675 -0.004274 0.001536 0.000116 0.000038 
+-0.001287 -0.001179 -0.001502 0.000528 0.001266 -0.001886 
+-0.000129 0.001485 -0.001372 -0.001007 0.000266 0.002070 
+-0.000736 0.000705 0.001597 0.001207 -0.000044 -0.005892 
+0.000280 0.004421 -0.009465 -0.001282 0.005013 -0.003917 
+0.000126 0.000195 0.000161 -0.000974 0.001048 -0.001402 
+-0.001786 -0.000254 -0.001744 -0.002179 -0.001077 -0.001273 
+-0.002931 -0.001367 -0.001208 -0.003711 0.000383 -0.001296 
+-0.002998 0.001807 0.001616 0.000407 -0.000037 0.000403 
+0.003422 0.000205 -0.003571 0.003448 -0.000699 -0.009005 
+0.003125 -0.001333 -0.011858 0.002203 -0.001163 -0.009670 
+0.001871 -0.001661 -0.000528 0.001292 0.002158 -0.000622 
+-0.000505 0.003670 -0.003989 0.003790 0.002511 -0.001587 
+0.002913 0.005866 -0.003898 0.001960 0.005419 -0.003401 
+0.000762 0.002259 -0.001307 -0.001624 -0.001832 0.001089 
+-0.003454 0.001183 0.004089 -0.000982 0.003315 0.001118 
+0.000445 0.000842 0.000110 -0.007109 0.000079 -0.004226 
+-0.005491 -0.001757 -0.002815 -0.001025 -0.002927 0.003586 
+-0.001045 -0.000835 -0.001824 -0.010920 0.005111 -0.007560 
+-0.000287 0.006578 -0.014733 -0.001082 0.007669 -0.005250 
+0.005777 0.000883 0.006142 0.011827 -0.006437 0.016042 
+1.262626 -0.898990 2.946128 1.503546 -1.134752 3.822695 
+1.559471 -1.132159 4.114537 0.005968 -0.012538 0.033819 
+0.005005 -0.005816 0.010615 -0.009248 -0.000664 -0.016412 
+-0.016266 0.011926 -0.011314 -0.005649 -0.003595 -0.000443 
+-0.002460 -0.011533 -0.007068 0.000539 -0.010427 -0.008730 
+-0.000597 -0.003752 -0.001825 -0.000005 0.002004 0.001216 
+0.000730 0.003514 0.001846 -0.000476 0.002408 0.001328 
+-0.000632 0.000608 0.000309 0.000983 0.000087 0.000536 
+0.003359 0.000267 0.002231 0.004858 0.000265 0.002838 
+0.000517 -0.001038 -0.000999 -0.009100 -0.001231 0.003045 
+-0.005267 -0.000553 0.004353 0.002925 0.001100 -0.000856 
+0.004035 0.011445 -0.006896 0.000943 0.008633 -0.001924 
+0.003472 0.003982 0.011815 0.005327 0.000926 0.017950 
+0.004286 -0.001591 0.018418 0.002170 -0.001394 0.013606 
+-0.000313 0.000222 -0.000190 -0.003429 0.001934 -0.017024 
+-0.001776 0.001239 -0.012288 -0.000513 0.001602 0.000381 
+0.000545 -0.004144 0.004469 -0.005148 -0.004074 0.004474 
+-0.004136 -0.004914 0.001159 0.001536 -0.002946 0.000642 
+0.000335 -0.000090 -0.003161 0.001229 0.001240 -0.003045 
+-0.000389 0.000986 -0.001764 -0.002738 0.001355 -0.001502 
+-0.000926 0.002263 -0.000149 0.001673 0.000843 -0.005569 
+-0.000528 0.000610 -0.003992 -0.000498 0.000696 -0.001841 
+-0.000138 0.002621 -0.001310 0.001362 0.003025 -0.003199 
+-0.000158 0.002217 -0.002707 -0.001417 0.002241 -0.000946 
+-0.003002 0.003327 -0.000588 -0.001769 0.003410 -0.000474 
+-0.000504 0.003782 -0.000252 -0.000756 0.000924 0.001849 
+-0.000136 0.000979 0.001425 0.003082 0.001390 -0.001307 
+0.004885 0.003278 -0.005488 0.003658 0.002104 -0.007133 
+0.003510 0.005521 -0.002897 0.003054 0.008125 -0.002332 
+0.004274 0.006039 -0.000480 0.003652 0.002561 0.000190 
+0.001811 0.005255 0.001118 0.002137 0.005726 0.000811 
+0.001900 0.005312 -0.001090 0.001910 0.000506 0.000585 
+-0.002860 -0.000798 0.000557 -0.005073 -0.000948 0.003967 
+-0.005868 -0.001981 0.001128 -0.004521 -0.000802 -0.001597 
+-0.002319 -0.000976 -0.000643 -0.000413 -0.001612 0.000192 
+-0.000186 -0.001951 0.001237 -0.001142 -0.002040 -0.000163 
+-0.004044 0.001893 0.003001 -0.001503 0.006108 -0.007553 
+0.001302 0.005508 -0.003358 0.004856 -0.000045 0.005721 
+0.006220 -0.006541 0.013991 0.002802 -0.010174 0.019140 
+0.001938 -0.008979 0.019187 0.002647 -0.005737 0.009788 
+-0.001703 -0.001994 -0.008099 -0.004051 0.008562 -0.005405 
+0.000766 0.000391 -0.005106 -0.004517 -0.001874 -0.004180 
+-0.000560 -0.002125 -0.006172 0.005484 -0.002159 -0.003422 
+0.002437 -0.000597 -0.002153 0.002375 0.000170 -0.000769 
+0.001597 -0.000768 -0.001024 -0.001410 -0.000200 -0.000465 
+-0.003561 0.002402 0.001233 -0.005667 0.003834 0.002642 
+-0.005541 0.002705 0.001584 -0.002989 0.002301 -0.000103 
+0.003434 0.011318 -0.004336 -0.011331 -0.016957 0.000345 
+-0.016890 -0.007867 0.007975 -0.003563 -0.000147 0.003897 
+0.005679 0.007486 -0.001320 0.004747 0.003872 -0.003963 
+-0.001405 0.001043 -0.003678 -0.001523 0.000125 -0.001380 
+-0.000065 0.000056 -0.000285 -0.000754 0.000279 -0.000782 
+-0.003097 0.006231 -0.001633 0.003295 0.009432 -0.006644 
+0.001607 0.006819 -0.006826 0.000167 0.000209 -0.001282 
+-0.003880 -0.002703 -0.000281 -0.001617 -0.004703 -0.001932 
+0.000789 -0.002676 -0.002717 -0.000489 -0.000807 -0.001604 
+-0.004168 0.001077 0.001149 -0.000244 -0.000453 0.003798 
+-0.002333 -0.000130 -0.001330 -0.003117 0.000602 -0.000378 
+-0.002243 0.000699 -0.000079 -0.000048 0.000060 -0.001803 
+-0.003027 -0.004851 -0.000753 -0.004312 -0.005513 0.000753 
+-0.004715 -0.003589 0.000893 -0.000961 0.000593 0.001218 
+0.000186 0.001743 0.000854 0.000112 0.002962 0.002550 
+-0.002014 0.002536 0.001662 -0.001867 0.001358 0.000245 
+-0.000398 0.001572 0.000723 0.000000 0.004836 -0.004754 
+-0.003248 0.005043 -0.003248 0.001532 0.002073 -0.003155 
+0.000472 -0.000004 -0.004482 0.000000 0.000876 -0.007153 
+0.000332 0.002076 -0.002786 0.001075 0.006096 -0.002435 
+0.003889 0.004710 -0.000496 0.002502 0.001855 -0.000815 
+0.001692 0.000615 0.000615 0.001155 0.000934 0.000045 
+0.001181 0.002019 0.001442 0.000214 0.003425 0.001135 
+-0.000990 0.003030 -0.000305 -0.000768 0.003788 0.000329 
+0.000266 0.005770 -0.002067 -0.001283 0.004189 -0.003075 
+0.005296 0.006525 0.000568 0.004983 0.003439 0.000667 
+-0.000061 0.001419 0.004666 0.001065 -0.001100 0.007151 
+0.000716 0.001627 0.001541 0.000256 0.006168 -0.004811 
+0.002705 0.006254 -0.003151 0.003467 0.002089 -0.000013 
+0.001664 -0.001536 0.003432 0.000105 -0.001727 0.004975 
+-0.000343 0.000073 0.000945 -0.002914 0.003099 -0.009294 
+-0.004438 0.013907 -0.014998 0.001971 0.006696 -0.009773 
+-0.000352 -0.001847 0.002794 -0.000345 -0.003229 0.005669 
+-0.001857 0.000117 0.000935 -0.000620 -0.000875 -0.001073 
+-0.002119 -0.000242 0.004232 0.000414 0.000180 0.012373 
+-0.004007 0.004467 0.006703 -0.001106 0.001850 0.003302 
+0.003504 -0.001781 -0.002285 0.013646 -0.004587 -0.012686 
+0.019445 0.008763 -0.009889 0.000285 -0.002379 0.000635 
+-0.001912 -0.003736 -0.005774 0.002380 -0.000256 -0.009224 
+0.004536 0.003999 -0.005265 -0.000775 0.002481 -0.000126 
+0.002429 0.005035 -0.000693 0.002631 0.002552 -0.007598 
+-0.000986 0.003352 -0.004240 0.000689 -0.000084 0.000049 
+0.002121 -0.002264 0.003439 0.000780 -0.002626 0.003235 
+0.001138 -0.000292 -0.000125 0.000132 0.007332 -0.005221 
+-0.002302 0.015000 -0.004605 0.003625 0.015595 -0.008950 
+-0.002345 0.006536 -0.006686 -0.000779 0.001242 -0.004216 
+-0.000811 0.000441 0.001781 -0.002904 -0.001547 0.003290 
+-0.001791 -0.001269 -0.002687 0.000916 0.001374 -0.003206 
+0.005430 0.004140 -0.003563 0.006934 0.005944 -0.004359 
+0.004051 0.004367 -0.004485 -0.001553 -0.000319 -0.001635 
+-0.003359 -0.002003 -0.002606 -0.001981 -0.005508 -0.000145 
+-0.001420 -0.001263 -0.000890 0.000961 -0.000244 -0.004115 
+-0.001189 0.000122 -0.003797 0.000143 -0.001012 -0.000876 
+0.001474 -0.001305 0.001162 -0.000662 0.000401 0.000958 
+-0.002075 0.000805 -0.000246 -0.001525 0.000682 0.000181 
+-0.001435 -0.003370 0.004446 0.000405 -0.002479 0.003326 
+0.000299 -0.001883 -0.002436 -0.000658 -0.000146 -0.008030 
+0.001993 -0.001002 0.001991 -0.000110 -0.002315 0.000965 
+0.001231 0.001586 -0.000767 0.002545 0.003536 -0.002203 
+0.002692 0.002440 0.000976 0.002550 -0.000126 -0.001791 
+0.004341 0.003674 -0.004899 0.004031 0.006279 -0.002016 
+0.000955 0.001649 -0.001424 -0.000232 -0.002194 0.001669 
+0.000195 -0.002448 0.000648 0.000741 0.000762 0.000405 
+-0.002711 0.002295 -0.000528 -0.004773 0.002966 0.000750 
+-0.000237 0.003054 0.002839 0.000353 0.004917 0.000961 
+0.001596 0.007138 -0.002062 -0.000516 0.007310 -0.003063 
+-0.000078 0.004287 -0.003524 -0.000796 0.001706 -0.003352 
+-0.000798 0.001256 -0.004706 0.000074 0.000366 -0.006795 
+0.000803 -0.001294 -0.005834 0.005256 0.008593 -0.000931 
+0.001799 0.009035 -0.010914 -0.001812 0.006731 -0.009769 
+-0.005717 0.005373 -0.003418 -0.000674 0.002965 0.001260 
+-0.005572 -0.001210 -0.002167 -0.000011 0.003004 -0.005972 
+0.001425 -0.004479 -0.008975 0.000391 -0.005945 -0.009667 
+0.002144 -0.003434 -0.006111 0.007039 0.004159 -0.006695 
+0.012738 0.010559 -0.020671 0.027313 0.013203 -0.018090 
+0.001487 -0.000967 -0.009953 -0.001046 0.001583 -0.001974 
+0.000105 -0.000270 0.001123 -0.005298 -0.001249 0.004272 
+-0.003234 -0.002846 0.001360 0.003200 0.001568 -0.000544 
+0.008350 0.006214 -0.003519 0.010455 0.008107 -0.004128 
+0.007960 0.003884 -0.002665 0.000141 0.001494 -0.003593 
+-0.005357 0.002997 -0.000749 -0.004735 0.002646 -0.000701 
+-0.002930 0.004011 -0.002760 -0.003815 0.000477 -0.002875 
+-0.002299 0.002651 0.002210 -0.000388 0.001715 0.002140 
+0.000302 0.000005 0.002521 -0.001283 -0.001630 0.004802 
+-0.004613 -0.002027 0.006074 -0.003873 -0.001367 0.005315 
+-0.000963 0.000991 -0.001487 0.000788 0.002956 -0.007094 
+0.003585 0.006364 0.000512 0.001667 0.003908 -0.000434 
+-0.001667 0.000470 -0.000939 -0.002056 -0.000963 0.000043 
+0.000068 -0.001442 -0.003020 0.001912 -0.001516 -0.001648 
+0.003025 -0.000700 -0.002738 0.002132 -0.001757 -0.003723 
+-0.000088 -0.001814 -0.005675 -0.001060 -0.000541 -0.007465 
+0.000262 0.002496 -0.007287 0.001248 0.002941 -0.001587 
+-0.003553 -0.000373 -0.001354 -0.001396 0.001254 -0.000285 
+0.000274 -0.000069 0.001918 -0.000038 0.000021 -0.000167 
+0.000032 -0.001464 -0.002147 0.001819 -0.001183 -0.000346 
+-0.000364 -0.000727 0.001667 0.000296 0.000000 -0.001778 
+-0.001481 0.001692 -0.001239 -0.002976 -0.000296 -0.002282 
+-0.001932 -0.000902 -0.001804 -0.001708 -0.002077 -0.000232 
+-0.002896 -0.000025 -0.001587 -0.001910 -0.000511 -0.001101 
+0.000410 -0.001115 -0.000694 -0.000699 -0.000796 -0.001198 
+0.002830 0.001220 -0.000342 0.001255 -0.002099 -0.002424 
+-0.000075 -0.000441 -0.000475 -0.000643 0.001091 0.001486 
+0.000018 0.002762 0.003188 0.001268 0.003452 0.004978 
+0.000648 0.002852 0.006196 -0.004294 0.002611 0.001178 
+-0.002148 0.002039 -0.004679 -0.000474 0.002353 -0.006266 
+-0.000245 0.003770 -0.006782 0.003068 -0.001813 -0.007308 
+0.002917 -0.001487 -0.013256 0.000106 0.002666 -0.015941 
+-0.000794 0.009350 -0.008135 -0.002965 0.007235 -0.005957 
+-0.003086 0.007062 -0.008605 -0.001648 0.001431 -0.014092 
+-0.000337 -0.003628 -0.009978 -0.002444 0.001602 0.000229 
+-0.005789 -0.002124 -0.010829 -0.003840 -0.007668 -0.012646 
+0.002951 0.001101 -0.019820 -0.005891 0.012003 -0.019554 
+-0.003339 0.022100 -0.014297 -0.001195 0.011370 -0.019989 
+-0.008682 0.007398 -0.009066 -0.007267 0.006206 -0.004232 
+-0.003362 0.004604 -0.002519 -0.000605 0.004360 -0.001521 
+-0.000600 0.003914 -0.001154 -0.002040 0.002357 -0.000753 
+-0.000487 0.002296 -0.000856 0.001763 0.005547 -0.000101 
+0.004474 0.006184 -0.000132 -0.003579 0.007224 -0.001171 
+-0.003483 0.007119 0.001984 -0.000915 0.006701 0.002555 
+0.003933 0.001266 0.000300 0.000657 -0.000164 -0.013605 
+-0.002110 0.002744 -0.008027 -0.002339 0.003070 -0.001391 
+-0.000204 0.000356 0.002356 -0.000704 -0.003069 0.000833 
+-0.000630 -0.003924 -0.002290 -0.002511 0.000481 -0.002855 
+-0.001647 0.003316 -0.005679 -0.001146 -0.001561 -0.004059 
+-0.004297 0.000423 0.000113 -0.004220 0.001228 -0.000838 
+0.000121 0.001802 -0.002582 0.001655 0.006086 -0.004978 
+0.002720 -0.001267 -0.005701 0.001040 -0.001853 -0.002647 
+-0.000604 -0.000003 0.000144 -0.001032 -0.000794 0.001587 
+-0.002018 0.001022 0.000711 -0.002018 0.000805 0.001535 
+-0.005054 -0.000247 -0.001449 -0.002524 0.001101 -0.000242 
+-0.000197 -0.000665 -0.000881 0.003479 -0.000917 -0.001869 
+0.001626 0.001454 0.000291 0.000226 0.001360 0.002037 
+-0.001146 0.002152 0.003599 -0.002531 0.000235 0.000025 
+-0.001589 0.000827 -0.000454 -0.000554 -0.001463 -0.001094 
+-0.001225 0.000811 -0.003526 -0.000757 0.002909 -0.005101 
+0.001019 0.003104 -0.007274 0.000015 0.000847 -0.006323 
+-0.002121 -0.000328 -0.000711 -0.002775 0.001558 0.000677 
+-0.001888 0.003136 0.001389 -0.000213 0.005234 -0.001681 
+0.001792 0.003584 -0.004480 -0.000878 0.000369 -0.001096 
+0.001258 0.000416 0.000768 0.002157 0.002395 -0.000004 
+0.000821 0.002667 0.000534 0.000228 0.002315 0.000978 
+-0.000312 0.004124 0.000438 0.003046 0.006774 -0.004956 
+0.012614 -0.000045 -0.008515 -0.000444 0.014025 -0.011124 
+0.005945 0.009286 -0.009401 -0.002105 -0.000737 -0.006000 
+-0.007931 0.005139 -0.006904 -0.008688 0.004235 -0.003620 
+-0.000069 0.001981 0.000861 -0.003412 0.002608 -0.003091 
+-0.002905 0.004640 -0.008499 -0.008475 0.001344 -0.009451 
+-0.000823 -0.000246 -0.000188 0.004881 0.001371 0.007908 
+0.006288 0.002166 0.015550 0.001830 0.002244 0.021718 
+-0.003610 -0.000267 0.018550 -0.006011 -0.003540 0.007688 
+-0.015858 0.003457 -0.004730 -0.006161 0.001577 -0.009312 
+-0.002951 0.007036 -0.006232 0.008928 0.011514 -0.005862 
+0.005928 0.002796 0.001540 -0.002093 0.000634 -0.000778 
+-0.003879 0.001786 -0.006726 -0.003404 0.001254 -0.005136 
+-0.005702 -0.001345 -0.001066 -0.010671 -0.003095 0.003070 
+-0.000007 -0.000409 -0.003362 -0.005821 -0.004764 -0.004576 
+-0.000253 0.003378 -0.002622 0.001232 0.004906 -0.005981 
+-0.000780 0.007729 -0.004958 -0.003805 0.006951 -0.000893 
+-0.003814 0.002173 -0.002246 -0.001680 -0.000544 -0.002840 
+-0.001053 -0.001027 -0.005414 -0.000365 -0.000530 -0.005323 
+-0.000979 -0.000158 -0.003750 -0.004714 0.000378 -0.001810 
+-0.000467 -0.001301 -0.000269 -0.004130 0.000650 0.002065 
+-0.002105 0.000554 0.001738 -0.000837 0.001048 -0.000181 
+0.000485 0.001304 -0.002980 0.002625 0.001043 -0.003483 
+0.001852 0.001016 -0.001607 -0.002235 -0.001250 -0.000559 
+-0.002055 0.000222 0.002749 -0.005447 -0.000745 0.002132 
+-0.002132 -0.002665 0.000645 -0.000963 -0.001117 -0.000356 
+0.001666 -0.003341 0.000711 0.000799 -0.002422 0.000581 
+-0.000618 0.000608 -0.000172 -0.001062 0.001374 0.000300 
+-0.004608 -0.002998 -0.000463 -0.000053 -0.004462 0.003187 
+-0.002212 -0.002826 0.002803 -0.000399 0.000522 0.001178 
+0.000098 0.000129 0.000004 0.001573 -0.000734 -0.000157 
+0.002065 -0.001274 -0.005577 0.003113 0.003775 -0.006655 
+0.000538 0.004805 -0.002797 -0.002026 0.002117 -0.000810 
+-0.002784 0.000308 0.004100 -0.001628 0.002621 0.002545 
+-0.003139 0.003525 -0.000330 -0.001083 0.003307 -0.000167 
+0.001574 0.002937 -0.000112 0.001642 0.002395 -0.000311 
+0.000996 0.001342 -0.000967 -0.002330 0.002146 -0.001411 
+-0.002064 0.005156 -0.004257 -0.003224 0.009165 -0.005787 
+-0.003876 0.010649 -0.004849 0.001942 0.003001 0.002698 
+0.005606 -0.001670 -0.001620 0.006222 -0.000778 -0.008556 
+0.001695 0.001406 -0.008976 0.002644 0.002529 -0.003218 
+0.000875 0.006279 -0.006498 0.001246 0.005363 -0.014842 
+0.002135 0.010961 -0.012788 0.004268 0.005030 -0.011500 
+0.004424 0.002536 -0.018054 -0.004545 0.004461 -0.015455 
+0.000017 -0.017701 0.037433 0.508621 -1.103448 5.439655 
+0.782805 -0.923077 6.307693 0.938182 -0.840000 6.349091 
+0.971698 -0.693396 5.646226 0.003863 -0.002834 0.035787 
+-0.002056 -0.004096 0.003498 0.003655 -0.002365 -0.007847 
+0.014689 0.004935 -0.007520 0.022589 0.004436 -0.015790 
+0.013875 0.007933 -0.011801 0.000011 0.001152 -0.004935 
+-0.005181 -0.004458 -0.001687 -0.005879 -0.004840 0.001781 
+-0.004681 -0.002176 0.003279 -0.002125 0.000274 0.000188 
+-0.001918 0.000019 0.000521 -0.000857 0.001397 0.001323 
+-0.003739 0.003011 0.000708 -0.011756 -0.005569 0.002319 
+-0.009116 -0.011426 0.004806 -0.003301 -0.006588 -0.000021 
+-0.001210 0.001652 -0.003106 -0.001950 0.001776 -0.001367 
+-0.000092 -0.000035 -0.000204 -0.000715 0.000525 0.001436 
+-0.001364 0.001873 0.000327 -0.001244 0.003112 -0.002484 
+-0.000613 -0.000202 -0.003050 -0.000463 0.000624 -0.001723 
+-0.000985 0.004412 0.000579 0.001587 0.005910 0.001564 
+-0.002579 0.003552 0.000973 0.001325 0.004069 -0.002509 
+0.000354 -0.000044 -0.000651 -0.000684 0.000299 0.000080 
+-0.001228 0.000181 0.001274 -0.003074 -0.001437 -0.000409 
+-0.000719 0.001911 0.000195 -0.000923 0.002904 -0.000164 
+-0.001656 0.003311 -0.002869 0.000943 0.002746 -0.004590 
+0.000039 0.000964 -0.001935 0.002509 0.001109 0.000115 
+0.004729 0.004391 -0.000676 0.004233 0.000858 0.000439 
+0.000488 -0.000136 -0.000045 -0.000789 -0.000470 0.003764 
+0.001545 0.000773 -0.000833 0.004536 0.004107 -0.002820 
+0.003019 -0.000172 -0.002330 -0.001133 0.002528 0.003050 
+0.002453 0.002364 -0.000864 0.003485 0.002554 -0.002922 
+0.005444 0.004839 -0.004597 0.004639 -0.000038 -0.002043 
+0.000011 0.000472 0.001525 -0.003240 0.001927 0.005649 
+-0.003387 -0.001290 0.004677 0.000039 -0.000477 0.000793 
+0.000349 0.000504 -0.000426 -0.005358 0.000270 -0.001873 
+-0.005033 0.001761 -0.006980 -0.004789 0.000568 -0.011850 
+-0.000777 -0.000989 -0.013992 -0.004634 -0.002362 -0.001272 
+-0.006950 0.001462 -0.005517 -0.008676 0.001934 -0.005995 
+-0.005793 0.001690 -0.008086 -0.001243 0.001172 -0.006668 
+0.000193 0.011095 -0.006800 -0.003607 0.011468 -0.014927 
+-0.002777 0.007371 -0.017594 0.000667 0.000202 -0.010237 
+-0.000814 -0.006231 -0.019306 0.030046 0.050147 -0.055638 
+-0.002588 0.005724 0.017412 0.388298 -0.765957 6.212766 
+0.623037 -0.997382 7.371728 0.763598 -1.018829 7.539749 
+0.888325 -0.837563 7.126904 0.956098 -0.185366 5.590244 
+0.008230 0.016473 0.000623 0.013471 0.005515 -0.022727 
+-0.002414 -0.004061 0.001402 -0.005017 -0.013001 0.013192 
+0.005104 -0.010332 -0.030436 0.014369 0.013322 -0.046924 
+0.005347 0.008036 -0.007522 0.001009 0.002925 0.005237 
+0.001545 -0.002934 0.001993 0.003008 -0.000863 -0.001943 
+0.000258 -0.001137 -0.001598 -0.001072 -0.000166 0.000554 
+0.002279 0.002033 -0.000632 0.007171 0.006339 -0.003776 
+-0.005821 0.009554 -0.003130 -0.002070 0.009834 -0.002436 
+-0.000552 0.007104 -0.005299 0.000515 0.001957 -0.008129 
+-0.000849 -0.000805 -0.006901 -0.000755 -0.001237 -0.003662 
+-0.001431 -0.000329 -0.001866 -0.001235 -0.000253 -0.001377 
+0.001298 -0.000931 -0.001863 0.004247 -0.002796 -0.001657 
+0.005504 -0.001202 -0.000841 0.003626 0.000495 -0.000330 
+0.000701 0.001468 0.000500 -0.003110 0.004716 -0.007245 
+-0.001168 0.003382 -0.007448 0.001331 0.001818 -0.004017 
+0.000505 -0.000270 0.001255 -0.000243 -0.000110 0.004739 
+-0.001744 0.000476 0.004280 -0.001625 0.001653 -0.000028 
+-0.000301 0.002113 -0.003323 0.001115 0.001721 -0.003344 
+0.000648 -0.001493 -0.002507 -0.000421 -0.001565 0.000281 
+-0.001920 0.001609 -0.002971 0.000179 0.002779 -0.004452 
+0.001765 0.001092 -0.005294 0.001320 0.000891 -0.001241 
+0.004203 0.005942 0.000580 0.004221 0.001561 0.000762 
+0.001319 0.000827 0.000662 -0.002903 -0.000304 0.002025 
+-0.000434 0.000868 0.004264 -0.003313 0.000940 0.001888 
+0.000519 0.005846 -0.003409 -0.003738 0.003212 -0.002628 
+0.002968 0.004195 0.002208 0.000722 0.005934 0.005366 
+0.000935 0.006545 0.005691 -0.002912 0.003566 0.001241 
+-0.002470 0.004469 -0.002077 -0.005579 0.000636 -0.004989 
+-0.004352 -0.001128 -0.007062 -0.001553 -0.001348 -0.005284 
+0.001295 0.000008 -0.003473 0.000402 0.001163 0.000994 
+-0.004125 0.000340 -0.005735 -0.002934 0.000863 -0.008109 
+-0.001402 0.000367 -0.003113 0.000297 0.000324 0.000923 
+-0.000152 0.005201 -0.001603 -0.000062 0.011124 -0.005724 
+0.003231 0.011203 -0.003592 0.000872 0.002740 -0.001208 
+0.001730 0.009576 -0.011312 0.000214 0.016154 -0.024718 
+-0.001599 0.003980 0.016379 0.610577 -0.509615 6.370193 
+0.699115 -0.958702 7.362832 0.655172 -0.985222 6.871921 
+0.567867 -0.642659 5.664820 0.330612 0.000000 3.930612 
+0.004470 0.003814 0.017524 -0.001710 0.002236 -0.013659 
+-0.006357 -0.008096 0.008368 -0.004332 0.002537 0.000173 
+0.003762 -0.003935 -0.011761 0.006649 0.001466 -0.041932 
+0.004885 0.006112 -0.018273 0.002167 0.002419 0.004688 
+0.005164 0.005554 0.003506 0.005209 0.010944 -0.003654 
+0.006648 0.006367 0.001384 0.004845 0.004749 -0.005437 
+0.001201 0.000254 -0.003537 -0.000699 -0.000436 -0.001421 
+0.000296 -0.000098 0.000422 -0.000850 0.001885 0.001879 
+-0.001157 0.003029 0.000302 -0.002919 -0.000520 -0.002324 
+-0.002335 -0.001521 -0.002681 -0.000893 -0.003127 -0.000558 
+0.000477 -0.002674 0.000571 -0.000766 -0.001914 -0.000221 
+-0.001270 0.001238 -0.002544 0.000807 0.001957 0.000448 
+0.001962 0.000325 -0.000671 -0.000283 -0.001795 0.001417 
+0.000220 -0.000622 -0.000912 -0.000891 -0.000927 -0.001930 
+0.000464 -0.001158 -0.000850 0.000319 -0.003059 0.002517 
+0.000923 -0.003164 0.004216 -0.000174 0.002275 -0.001059 
+0.002255 0.001003 -0.009523 0.002027 0.005147 -0.011307 
+-0.000425 0.002669 -0.003944 0.000000 -0.001475 0.003197 
+-0.001499 -0.002611 0.004473 -0.005577 -0.002009 0.000969 
+-0.008693 0.001400 -0.000552 -0.003670 0.001314 -0.002960 
+-0.000666 -0.000099 -0.001474 -0.001133 -0.000826 -0.000192 
+-0.002180 0.003744 -0.004829 -0.002486 0.001831 -0.002193 
+0.004604 0.004471 -0.006314 0.002768 0.005398 -0.005810 
+0.003521 0.006161 -0.004496 -0.000949 0.000826 -0.001194 
+0.000974 0.004769 -0.001796 0.002132 0.001400 -0.000968 
+-0.000740 0.001346 0.002054 0.000101 0.003453 0.002706 
+-0.001200 0.000086 0.000605 -0.005027 0.003044 -0.003259 
+-0.002710 0.001554 -0.005938 -0.003097 0.002065 -0.004610 
+-0.002842 0.001919 -0.002899 -0.001647 0.001059 -0.000588 
+-0.003082 -0.003288 0.001815 -0.000237 -0.006036 0.000109 
+-0.001599 -0.004567 -0.003772 -0.002961 0.001424 -0.003898 
+-0.002159 0.002474 -0.001799 0.000134 0.004286 -0.000123 
+0.004086 0.001175 -0.007728 0.005967 0.005358 -0.010250 
+0.008949 0.003860 0.000219 0.004964 -0.000752 0.003483 
+-0.010253 0.004921 -0.005079 -0.003501 0.014230 -0.001889 
+-0.000786 0.001853 0.004646 0.627119 -0.322034 5.446328 
+1.084559 -0.654412 6.147059 1.104027 -0.654362 5.392617 
+0.825203 -0.430894 3.638211 0.003198 -0.001318 0.013145 
+-0.001184 0.000029 -0.005144 -0.001188 -0.002281 -0.002483 
+0.005415 0.000587 0.000314 0.004060 0.000621 -0.014314 
+0.006033 0.004371 -0.026851 0.004870 0.011002 -0.025934 
+0.010948 0.006816 -0.012737 0.001095 0.002390 -0.000400 
+0.001279 0.000719 0.007553 0.001570 0.001434 0.006134 
+0.004104 0.003277 -0.000248 0.004521 0.003049 -0.006834 
+0.005249 0.004875 -0.003749 0.006086 0.000601 -0.000259 
+0.006676 0.001132 -0.002705 0.005115 -0.004004 -0.003226 
+0.001412 0.004479 -0.000336 0.001798 0.004872 -0.000508 
+-0.001552 0.005620 0.005216 -0.000975 0.003725 0.002098 
+0.003394 0.003671 -0.000451 0.003618 0.000863 -0.004372 
+0.000150 0.000070 0.000160 0.002723 0.005491 -0.002531 
+0.001517 0.003638 -0.004511 -0.001174 0.001565 -0.004191 
+-0.001873 0.000833 -0.002496 -0.000439 0.000051 -0.000684 
+0.000143 0.000205 0.002639 0.000963 -0.001095 0.003267 
+0.001128 -0.001275 0.000886 0.000866 0.001811 -0.001260 
+0.000762 0.002627 -0.002522 -0.001459 0.002657 -0.000573 
+-0.003715 0.001917 0.000978 -0.006230 0.001377 0.000689 
+-0.006885 0.003436 0.002577 0.000000 0.002623 0.005902 
+-0.003707 0.003766 0.001158 -0.002408 0.002539 -0.000545 
+-0.004848 -0.000630 0.000824 -0.000347 -0.002648 0.001259 
+-0.000034 0.006822 -0.001870 -0.001735 0.005286 -0.001755 
+-0.000647 0.000000 -0.003957 -0.001812 0.004565 -0.001812 
+-0.002159 0.004540 -0.001993 -0.001611 0.002130 -0.002363 
+0.001694 0.002621 -0.002313 0.003909 0.002412 -0.003936 
+0.005331 -0.000426 -0.005117 0.005843 0.001530 -0.006261 
+0.004113 0.005131 0.001543 0.002372 0.002639 -0.000868 
+-0.000836 0.000178 -0.001630 -0.001738 -0.000060 -0.002957 
+-0.002678 -0.001329 -0.004680 -0.004957 -0.003571 -0.004530 
+-0.002949 -0.000537 -0.004460 -0.000259 -0.002259 -0.002519 
+-0.002516 -0.008974 0.004305 -0.003254 -0.001731 0.007062 
+-0.001616 -0.001589 0.001957 0.000943 0.004493 -0.004841 
+-0.002823 0.004234 -0.007904 0.005830 -0.000210 -0.009906 
+0.001530 0.000500 -0.002165 -0.005534 -0.002323 0.003121 
+-0.008972 -0.003018 -0.003299 -0.003103 -0.000078 -0.018868 
+-0.000047 -0.000207 -0.011846 0.008712 0.009004 0.000350 
+0.012414 0.001739 0.004498 0.009519 -0.000757 0.002320 
+0.004855 -0.000895 -0.006584 0.001717 0.000870 -0.019012 
+-0.001937 0.003173 -0.020460 -0.004273 0.006143 -0.001842 
+-0.006199 0.004597 -0.001115 -0.006656 0.003628 -0.006861 
+-0.004046 0.001846 -0.012340 0.000298 0.000721 -0.013479 
+-0.000850 -0.001728 -0.012767 -0.004470 -0.001231 -0.011810 
+0.000666 0.000507 -0.007368 0.006538 0.004778 -0.005218 
+0.010376 0.002122 -0.002987 0.006176 -0.000128 -0.001899 
+0.001026 0.000675 0.001256 -0.001998 0.000087 0.001266 
+-0.002354 0.004488 -0.002108 -0.003010 0.004881 -0.004544 
+-0.002053 0.002387 -0.004360 0.001932 0.002364 -0.004037 
+0.003262 0.004298 -0.003198 0.001228 0.000445 -0.002629 
+-0.005026 -0.001401 -0.001647 -0.005383 -0.000274 0.002891 
+-0.004434 -0.001456 0.000010 -0.001447 0.001410 0.000014 
+0.001053 0.003171 -0.001823 0.001164 0.000137 -0.003131 
+-0.000904 -0.001096 -0.001542 -0.001200 0.001000 0.000000 
+-0.000525 0.003599 0.000340 0.000058 0.004365 -0.000321 
+0.001347 0.002984 0.000337 -0.001019 0.001570 -0.001036 
+-0.001405 0.000081 0.000166 0.000790 -0.002133 0.000142 
+0.003002 -0.001933 -0.001287 0.002034 -0.000374 -0.001496 
+-0.002434 0.003251 0.000200 -0.001641 -0.001181 0.004664 
+-0.000077 -0.003525 0.002450 -0.001166 -0.002955 -0.000349 
+-0.002356 0.001481 -0.000093 -0.000094 0.004797 -0.001368 
+0.001386 -0.001970 0.001373 0.000912 -0.001567 0.001222 
+-0.000278 0.002117 0.001379 0.000718 0.003597 0.002637 
+0.001612 0.003910 0.003482 0.000414 0.003041 0.001624 
+0.000000 0.000640 0.002480 -0.001961 0.000590 0.000329 
+-0.001106 -0.000356 -0.003030 0.005620 0.004161 -0.009363 
+0.005834 0.008036 -0.005485 0.001570 -0.000852 0.000110 
+0.001474 -0.001582 0.000364 0.002254 -0.004188 -0.000069 
+0.002270 -0.002534 0.002241 0.003685 -0.002616 0.000269 
+0.002605 -0.001577 -0.001512 0.002440 -0.000178 -0.003899 
+-0.003630 -0.001341 -0.001865 -0.009315 -0.003134 0.001934 
+-0.009218 -0.001608 0.003499 -0.004215 0.000915 0.000785 
+-0.000840 0.001866 -0.001520 -0.000093 0.000101 0.000333 
+0.001220 -0.000359 0.001721 -0.000476 -0.000122 -0.000324 
+-0.001673 -0.001014 -0.004106 -0.002296 -0.000373 -0.006718 
+-0.002516 0.000178 -0.006011 -0.002506 -0.000543 -0.004150 
+-0.000999 0.000862 -0.005512 -0.001829 0.002039 -0.011063 
+-0.001225 0.002462 -0.014667 -0.003673 -0.001130 -0.006415 
+-0.007805 0.002801 0.001611 -0.004990 0.002531 0.002290 
+-0.002339 0.000531 0.002572 -0.001197 -0.001354 0.002998 
+0.000776 -0.001208 0.003268 0.001982 0.000186 0.003067 
+0.002678 0.000893 0.002057 0.002062 0.001005 0.001210 
+0.001537 0.000906 0.000054 0.001938 0.001092 -0.002569 
+-0.001946 0.001857 -0.006246 -0.001529 0.003548 -0.004634 
+0.000477 0.000640 -0.002190 0.000011 0.000520 -0.001520 
+-0.001086 0.001087 -0.000722 -0.002232 -0.000087 -0.000070 
+-0.002773 -0.004277 0.002209 0.000399 -0.002870 -0.001255 
+-0.000248 0.000228 0.000219 0.004101 0.002906 -0.000864 
+0.002408 0.001757 -0.003710 -0.000996 -0.000173 -0.003442 
+-0.001417 -0.000236 -0.003071 -0.002715 0.000707 -0.004871 
+-0.001471 -0.002316 -0.002316 -0.001041 0.004594 -0.009401 
+0.000985 0.000637 -0.007649 0.004748 0.000963 -0.004611 
+0.003844 0.004370 0.001281 0.005150 0.003817 -0.003452 
+0.003602 0.003467 -0.003044 0.001554 0.003764 -0.002052 
+-0.001029 0.003019 -0.001081 -0.003231 0.000763 -0.001846 
+-0.002179 0.001616 -0.002894 -0.000527 0.000596 -0.005501 
+0.005016 0.001592 -0.006929 0.008357 0.003052 -0.001679 
+0.000644 0.006270 0.002753 0.006362 0.009041 -0.005358 
+0.005079 0.000000 -0.006111 0.000914 0.002253 -0.007532 
+0.001093 0.002519 0.002733 0.002553 -0.000519 0.000950 
+0.000486 -0.000579 -0.001416 -0.000732 0.001952 -0.005156 
+0.002341 -0.000323 -0.007270 0.000242 -0.000700 -0.006271 
+-0.000911 0.001042 0.000130 -0.001238 0.000681 0.000745 
+-0.002698 0.001573 0.000458 -0.003719 0.001240 -0.001240 
+-0.001301 0.000650 -0.002602 0.000940 0.000574 0.000772 
+0.002522 -0.000397 0.003134 0.003086 0.000624 0.005561 
+0.000418 -0.000028 0.006957 0.002966 0.004680 0.002071 
+-0.001593 0.002574 -0.000435 -0.001107 -0.000231 -0.005407 
+-0.003230 0.000730 -0.006396 -0.002850 0.001180 -0.003484 
+-0.000537 0.000852 -0.001629 0.001004 0.000293 -0.001466 
+0.000341 -0.000123 -0.001321 -0.001493 -0.001465 -0.002015 
+-0.000042 -0.001566 -0.000747 0.003259 0.000675 0.002225 
+0.002628 0.000901 0.003874 0.004699 0.003295 0.002586 
+0.001997 0.002088 -0.001583 0.000769 -0.001702 -0.003534 
+-0.004170 -0.004770 -0.004511 -0.005293 -0.002127 -0.004510 
+-0.004133 -0.000590 -0.005865 -0.006701 0.000529 -0.004114 
+-0.007999 0.002440 0.001177 -0.006243 0.002140 0.005479 
+-0.003487 0.000015 0.004770 -0.000282 0.000364 -0.001295 
+0.001171 0.000260 -0.006515 0.000348 -0.000887 -0.003241 
+-0.003142 -0.002504 0.001766 -0.005081 -0.004457 0.004352 
+-0.003259 -0.001050 0.001816 -0.001092 0.000855 -0.003920 
+-0.001501 0.000125 -0.004225 -0.001539 -0.000236 -0.000372 
+-0.000817 -0.000372 0.001230 -0.000653 0.001395 -0.000995 
+-0.000263 0.000632 0.000966 -0.001193 0.004266 -0.001881 
+-0.000099 0.005941 -0.002079 -0.000532 0.005585 0.000266 
+0.004790 0.005079 -0.001946 0.004666 0.005481 -0.004242 
+0.000853 0.005162 -0.004190 -0.000817 0.002325 0.000435 
+-0.000201 0.000888 -0.000007 -0.002481 -0.001026 -0.004104 
+-0.005857 -0.001006 -0.005552 -0.004771 0.000780 -0.002255 
+0.003377 0.001250 -0.005066 -0.001226 -0.000827 -0.002310 
+-0.002874 -0.001189 -0.001289 -0.001060 -0.000544 0.000520 
+0.000313 0.000681 -0.001639 0.000533 -0.001333 0.001867 
+-0.001719 -0.003630 0.005230 -0.003011 0.002141 0.005950 
+-0.003063 0.002727 0.001582 -0.002016 0.000465 0.000155 
+-0.000879 -0.000556 0.000008 -0.001217 -0.000616 -0.000773 
+-0.002193 0.000281 -0.001519 -0.002394 -0.001705 -0.002222 
+-0.002060 0.000123 -0.001659 0.000123 0.000572 -0.002024 
+-0.000655 -0.000066 -0.001729 0.001954 0.000890 -0.003913 
+0.002462 0.002311 -0.002348 -0.000613 0.000882 0.001942 
+-0.002313 0.000337 0.001096 0.001666 0.001156 -0.000872 
+0.000636 0.002960 -0.003458 -0.001188 0.001722 0.000480 
+-0.003836 0.002305 -0.000510 -0.002430 0.002833 0.003651 
+-0.000351 0.001452 -0.001580 0.001306 -0.001465 -0.004686 
+0.000378 -0.002266 -0.002801 0.000244 0.000461 0.001567 
+-0.001624 -0.000021 0.001491 0.004489 0.011893 -0.005745 
+-0.002398 0.010210 -0.012300 0.001113 0.007200 -0.015644 
+-0.002188 0.008911 -0.008634 -0.004208 0.004058 -0.005825 
+-0.002189 0.002155 -0.003461 -0.002381 0.001219 -0.002429 
+-0.002188 0.001373 -0.002003 -0.002003 -0.000106 -0.000731 
+-0.000071 -0.001130 0.000527 0.001340 -0.000875 0.000696 
+0.000305 -0.000228 0.000279 -0.001942 0.000862 -0.001355 
+-0.002309 0.003419 -0.003696 0.003538 0.001700 -0.002404 
+0.002574 -0.001287 -0.004890 0.002597 -0.000640 -0.003314 
+0.001503 0.000047 -0.000761 0.000289 0.000052 -0.000422 
+-0.000076 0.000754 -0.002112 0.000772 0.002315 -0.002572 
+-0.000999 -0.000161 -0.003802 -0.001787 0.001697 -0.004377 
+-0.002752 0.001085 -0.003412 -0.001468 -0.000165 -0.001281 
+0.000971 -0.001230 -0.000194 0.003791 0.001628 -0.000621 
+0.002631 -0.001974 -0.002797 0.000190 0.000128 0.000177 
+0.000903 -0.000489 -0.000283 0.000344 0.000406 -0.000083 
+0.001819 0.003570 0.001823 0.001203 0.007638 0.003784 
+0.005059 0.001204 0.001182 0.004265 0.007399 -0.009279 
+0.006314 0.005143 -0.004677 0.000800 0.006400 -0.006400 
+0.000310 0.006801 -0.002353 0.001189 0.004581 -0.001949 
+0.001293 0.002754 -0.003148 -0.000293 0.000887 -0.002696 
+-0.002529 -0.000215 -0.001865 -0.004885 -0.002129 -0.003152 
+0.000000 -0.002879 -0.000227 -0.000526 0.002105 -0.001053 
+0.001456 0.005582 -0.003559 -0.000393 0.003814 -0.003239 
+-0.002698 0.000213 0.001775 -0.004018 -0.002121 0.002400 
+0.001122 0.000762 0.002224 0.003210 0.004132 0.000233 
+0.001940 0.000984 0.000981 0.000109 -0.001478 -0.001838 
+0.000373 0.000672 -0.002985 -0.001261 0.000715 -0.001591 
+-0.000739 0.001846 -0.007638 0.004280 0.007436 -0.005671 
+-0.000406 0.003460 -0.005225 -0.001244 0.000517 -0.003268 
+-0.000208 -0.000859 -0.001965 0.000917 0.000110 -0.000037 
+0.001627 -0.000187 0.001253 0.006546 0.005549 -0.003216 
+0.003038 0.006242 -0.004827 -0.000400 0.002743 -0.002970 
+-0.004644 -0.000731 0.002304 0.000401 -0.002777 0.000908 
+-0.000465 -0.001695 -0.001932 0.002623 0.002831 -0.000406 
+0.002439 0.000344 -0.003826 -0.001171 -0.000080 0.000363 
+-0.000064 -0.002694 -0.002263 -0.000753 -0.000169 -0.002045 
+-0.001363 0.000822 -0.001950 -0.000719 0.001278 0.000192 
+-0.000233 -0.003484 0.000269 0.003786 -0.003828 0.004498 
+-0.000361 0.003585 -0.002321 -0.001030 0.006949 -0.009838 
+0.001017 0.006085 -0.013338 -0.000132 0.003002 -0.011687 
+0.000605 0.001237 -0.004575 0.000483 -0.001532 0.000530 
+0.002863 -0.000849 0.001923 0.002030 0.000407 0.000033 
+0.001572 0.000248 -0.001944 -0.000883 0.001071 -0.001522 
+-0.001595 0.000781 -0.003059 -0.001421 0.003639 -0.003132 
+0.000892 0.004481 0.000209 0.002985 0.002890 0.001085 
+0.001340 0.001458 0.000591 -0.001351 -0.000078 0.000881 
+-0.000460 -0.000820 0.001101 0.000342 0.000342 -0.002394 
+0.001484 -0.001884 -0.002513 0.001473 0.004496 0.000000 
+-0.002019 0.003672 -0.003534 -0.000492 0.001811 -0.000516 
+-0.003258 0.000197 0.000988 -0.001973 0.001667 -0.001184 
+-0.002610 0.002476 -0.001807 -0.000210 0.003066 -0.005081 
+-0.001059 0.002630 -0.003964 0.002070 0.004952 -0.001679 
+0.006390 0.006378 -0.004257 0.002022 0.007585 -0.004713 
+0.002650 0.005524 -0.000915 -0.000040 0.004184 -0.002563 
+-0.000749 0.003855 -0.006170 -0.000655 0.002289 0.000692 
+0.000706 0.004118 -0.000021 -0.000541 0.004182 0.000890 
+0.000389 0.009549 -0.003776 0.004733 0.010695 -0.005516 
+0.005268 0.008187 -0.006940 0.002494 0.005356 -0.005575 
+-0.000700 0.003169 -0.004349 0.000778 0.000178 -0.003533 
+-0.002230 0.000026 -0.004420 0.002478 -0.000188 -0.001000 
+0.002436 0.002966 -0.003986 -0.000638 0.001173 -0.004536 
+-0.001357 -0.000566 -0.002830 -0.000173 -0.000412 -0.000006 
+-0.000595 -0.000205 0.001722 -0.002548 -0.000769 0.001911 
+-0.002501 0.000525 -0.001396 -0.001716 0.001634 -0.003513 
+-0.002850 0.001558 -0.001811 -0.000569 0.003985 -0.002385 
+0.003440 0.004081 -0.001972 0.005140 0.000714 -0.002529 
+0.003036 -0.002501 -0.005715 -0.003215 -0.003493 -0.004267 
+-0.002814 -0.000286 -0.000901 -0.000783 0.000807 0.002076 
+-0.004442 -0.001008 0.001481 0.002103 0.004026 0.002974 
+0.001409 0.000176 -0.003740 -0.000611 0.005584 -0.007977 
+0.001121 0.004625 -0.006267 0.000465 -0.000620 -0.004574 
+-0.001393 -0.000479 -0.001453 -0.000597 0.003249 -0.001144 
+-0.000355 0.004339 -0.001452 -0.003528 0.001915 -0.002072 
+-0.000778 0.001806 0.000164 -0.000760 0.003107 0.002078 
+-0.001572 0.008614 -0.003703 0.011060 0.014131 -0.001434 
+0.005243 0.000152 0.004453 0.001192 -0.001518 0.001835 
+-0.000233 0.001192 -0.000161 -0.001088 0.004868 -0.003672 
+-0.000667 0.005840 -0.005566 0.000745 0.002296 -0.004422 
+0.002877 0.000957 0.002875 0.003819 0.002275 -0.001391 
+0.001258 0.003360 -0.003356 0.000845 0.004112 -0.001476 
+0.001322 0.000380 -0.001122 0.001836 -0.000709 0.001104 
+0.001767 -0.000675 0.000573 0.000247 0.003761 0.001844 
+-0.000603 0.006957 -0.000259 -0.002737 0.004894 -0.001053 
+-0.006555 0.000658 0.001012 -0.003523 0.001045 0.003419 
+-0.001096 0.000889 0.000385 -0.000075 0.000881 -0.001265 
+0.000056 -0.001814 -0.003234 0.001888 -0.000986 -0.002749 
+-0.000213 0.000171 -0.000324 -0.000001 0.000165 -0.000279 
+-0.000309 -0.000116 0.000101 -0.000150 -0.000225 -0.000233 
+0.001935 -0.000846 -0.001015 0.000025 0.004334 -0.004272 
+-0.000756 0.001513 -0.005042 -0.004272 0.002290 -0.002352 
+-0.003387 0.003227 -0.003174 0.001425 0.004156 -0.002427 
+0.003365 0.001591 -0.000652 0.001126 -0.003017 0.001734 
+-0.003389 -0.003194 0.001511 -0.001900 -0.002709 -0.000560 
+0.000703 0.004162 -0.000226 0.002269 0.007467 -0.001993 
+0.005753 0.001438 -0.003516 0.004462 0.002090 -0.001474 
+0.001516 -0.000063 -0.001365 -0.001711 -0.001605 -0.000193 
+-0.001359 -0.000354 -0.000509 0.000101 -0.000960 -0.000859 
+0.001993 0.006096 -0.000703 -0.000614 0.004135 -0.003356 
+-0.000848 0.002428 0.001228 -0.003139 -0.000559 0.001465 
+-0.001475 -0.001580 -0.000400 0.000052 -0.000802 -0.000094 
+-0.000147 0.000157 0.000234 -0.001844 -0.000522 0.000794 
+-0.002312 -0.001287 0.001112 -0.004644 -0.002639 -0.003822 
+-0.002483 0.000087 -0.006495 0.000483 0.004685 -0.005007 
+-0.000615 0.000142 0.000249 -0.003317 0.000734 0.001655 
+-0.005632 -0.002415 0.001430 -0.004274 -0.003277 -0.000760 
+-0.000522 0.000120 -0.004127 0.000603 0.000081 -0.005595 
+0.001640 -0.002320 0.001640 0.000227 -0.000908 -0.000057 
+-0.001656 -0.003311 0.003279 -0.000850 -0.001443 0.002252 
+0.002688 0.000850 -0.000020 0.001212 0.001509 0.001646 
+0.000190 0.005751 -0.002401 -0.002011 0.000392 0.000170 
+-0.005323 -0.002106 0.000527 -0.002418 0.000266 -0.001311 
+-0.001159 0.001103 -0.000567 -0.001025 0.000694 -0.003059 
+0.003079 -0.001302 -0.002716 0.003284 -0.005341 -0.007423 
+0.003363 0.006164 -0.017147 0.003215 0.006703 -0.010186 
+0.000318 0.002234 -0.004678 -0.000587 -0.000055 -0.001475 
+-0.000514 0.000084 -0.000007 -0.000176 0.000757 0.002220 
+0.000553 -0.001462 0.001683 0.000111 -0.000166 0.003520 
+-0.004760 -0.006736 0.001580 -0.004258 -0.005820 0.003905 
+-0.000131 0.001044 0.001894 -0.001036 0.001516 -0.001352 
+0.004061 0.004356 -0.000049 0.000580 0.001679 -0.000720 
+-0.001411 -0.000360 -0.000941 -0.003064 -0.000106 -0.000453 
+0.001159 0.002691 -0.003041 0.000506 0.003877 -0.008626 
+0.000860 0.001335 -0.009684 0.002339 0.006237 -0.007561 
+0.001125 0.002083 -0.007080 0.000602 -0.002163 -0.005768 
+-0.000158 -0.001801 -0.003792 -0.000594 0.002047 -0.000890 
+-0.001795 0.000945 0.001465 -0.004409 0.003230 0.001576 
+-0.003692 0.003077 0.000000 0.002573 0.005504 -0.001103 
+0.008708 0.006016 -0.003769 0.007051 0.005035 -0.003024 
+-0.000592 -0.000776 0.000259 -0.003640 -0.006305 0.004651 
+-0.002457 -0.004635 0.001057 0.001703 -0.000521 -0.000167 
+0.000079 0.001854 -0.001105 -0.000808 -0.000661 -0.000259 
+-0.003242 0.001538 0.002692 0.002397 0.003695 -0.002276 
+0.006171 0.000562 -0.008375 0.004593 -0.001125 -0.002311 
+0.002575 -0.000709 -0.001654 0.004888 0.000928 -0.003270 
+0.006943 0.003182 -0.004186 0.004282 0.004083 -0.001154 
+-0.001856 0.002273 0.000795 -0.003605 -0.000879 0.003312 
+-0.003520 -0.002405 0.000109 -0.000461 -0.001977 -0.001165 
+0.000050 -0.000727 -0.000504 -0.002790 0.001516 -0.001019 
+-0.003102 0.004519 -0.004136 -0.001627 0.001018 -0.005899 
+-0.000171 -0.002012 -0.001244 -0.001181 -0.000737 0.002620 
+-0.001411 -0.001911 0.002662 -0.000476 -0.001309 0.001309 
+-0.000187 -0.001707 -0.000774 0.000924 -0.002238 -0.001411 
+0.000668 -0.000207 -0.001555 -0.001335 0.000549 0.000125 
+-0.005865 0.003510 -0.003140 -0.006201 0.002348 -0.003621 
+0.002248 0.006616 -0.002646 0.003411 0.005574 -0.008919 
+0.004304 0.001060 -0.007982 0.005973 0.003901 0.000610 
+0.000289 -0.001264 0.002181 -0.002945 -0.002502 0.006359 
+-0.003101 0.001796 0.000653 -0.003419 0.000441 -0.000112 
+-0.001947 0.004088 -0.002616 -0.003592 0.003024 -0.002326 
+-0.002003 0.001354 -0.003326 -0.002194 -0.002586 -0.000968 
+-0.003337 0.000119 -0.004138 -0.000414 0.008539 -0.009807 
+0.003322 0.011817 -0.006992 0.002232 0.006044 -0.004850 
+-0.000735 0.001226 -0.000231 -0.001611 0.002367 0.001345 
+-0.005574 0.001246 0.000165 -0.000697 -0.001634 -0.001070 
+-0.003594 -0.004375 -0.001250 -0.006309 -0.004102 -0.000689 
+-0.002216 0.001821 0.001082 -0.000360 0.005238 0.002162 
+0.001449 0.008491 -0.002763 0.000967 0.005848 -0.004039 
+-0.001221 0.003224 -0.002507 -0.001110 0.003499 -0.004211 
+0.000566 0.008626 -0.005794 0.004296 0.005366 -0.010732 
+-0.003073 0.010196 -0.006217 -0.000624 0.010611 -0.005156 
+0.003013 0.006679 -0.000285 -0.003281 0.001619 -0.001103 
+-0.003294 -0.001508 -0.002103 -0.001508 -0.000363 -0.003071 
+0.000081 0.002033 -0.001382 0.000199 0.001952 -0.001600 
+0.001240 0.001922 -0.001897 -0.000834 0.003482 -0.001062 
+-0.002192 0.003445 -0.003290 0.004757 0.003347 -0.005989 
+0.004669 0.008265 -0.004438 0.008765 0.002584 -0.003990 
+0.003310 0.002014 -0.001751 -0.003152 -0.001220 -0.000535 
+-0.000617 -0.002609 -0.001103 0.001540 0.001303 -0.003058 
+0.003903 0.005888 -0.004186 0.002541 0.007878 -0.003719 
+-0.000756 0.003963 -0.003924 -0.001216 0.003851 -0.004056 
+-0.004483 -0.000831 -0.005982 0.004303 0.002890 -0.001474 
+0.001679 -0.001270 -0.001810 -0.000025 -0.003620 -0.000782 
+0.001079 -0.000213 -0.001018 0.003358 0.001892 -0.000895 
+0.003906 0.000628 -0.000192 0.005219 -0.000279 -0.001064 
+0.007348 0.001172 -0.004248 0.009667 0.002407 -0.003630 
+0.006442 -0.000298 -0.000668 0.002253 -0.000334 0.000186 
+-0.000449 0.000842 0.000898 -0.003534 -0.001053 0.002481 
+-0.004307 -0.001593 0.000991 -0.002657 -0.002593 0.000496 
+-0.001694 -0.001316 -0.000456 -0.001619 0.000022 -0.000399 
+-0.002518 -0.000357 -0.000091 -0.004109 -0.001395 0.001860 
+-0.003376 -0.002084 0.000396 -0.001095 0.003574 -0.000786 
+-0.001984 0.004044 0.000032 -0.000661 0.003303 -0.004710 
+0.000525 0.000761 -0.000289 -0.001122 0.003919 -0.002235 
+0.003055 0.003895 -0.003525 0.000649 0.005060 0.000671 
+0.000231 0.000462 0.002423 -0.000005 -0.004070 0.002432 
+0.000387 -0.000068 0.001003 -0.002219 -0.000016 -0.000424 
+0.000676 0.003795 0.001723 0.001510 0.001194 0.002395 
+-0.001444 -0.000719 -0.001621 -0.009678 0.001536 -0.006989 
+-0.012951 0.001879 -0.015231 -0.012915 0.015686 -0.018525 
+-0.009390 0.017169 -0.009473 -0.002929 0.009567 -0.003861 
+-0.001067 0.004260 -0.002228 -0.001597 0.002851 -0.000427 
+0.000897 0.004541 -0.001633 0.001969 0.005228 -0.003085 
+0.002861 0.003607 -0.004353 0.000478 0.003350 -0.003711 
+0.000303 0.001213 -0.003231 -0.002326 0.003181 -0.001908 
+-0.000320 0.004764 -0.004130 0.002917 0.006856 -0.001970 
+0.004456 -0.001784 -0.000895 0.000551 -0.000566 0.000246 
+0.001669 0.004373 -0.001438 0.002429 -0.000305 -0.001525 
+-0.003169 0.002250 -0.001966 -0.003206 0.006123 -0.004935 
+0.002789 0.005460 -0.000020 -0.003532 0.003485 -0.002138 
+-0.003222 0.003915 -0.000180 -0.003139 -0.000297 0.000773 
+0.000296 0.000677 -0.000705 0.000310 0.003090 -0.000463 
+0.002003 0.000854 -0.003997 0.000636 0.001891 -0.001687 
+-0.001005 0.000946 0.002188 -0.004185 0.001042 0.000420 
+-0.000748 0.001722 -0.002377 0.000794 0.005337 -0.002135 
+0.003387 0.003304 -0.002420 0.000889 -0.001512 -0.003535 
+0.001351 0.000679 -0.006526 0.003382 0.007857 -0.007837 
+0.003349 0.014197 -0.007437 0.004131 0.016745 -0.007964 
+0.004265 0.015766 -0.005753 0.001752 0.004928 -0.000390 
+-0.001789 -0.000851 -0.000546 0.007154 0.001760 -0.006576 
+0.010565 0.004879 -0.007894 0.008813 0.005607 -0.003766 
+0.003586 0.005126 0.000086 -0.001772 0.003836 0.000907 
+-0.006207 0.001617 0.001739 -0.005987 -0.001130 0.003738 
+-0.002717 -0.001424 0.000697 0.001810 -0.001232 -0.002338 
+0.001902 -0.002972 -0.002768 0.004355 -0.001061 -0.000707 
+0.002229 0.000956 -0.002912 -0.000463 -0.001269 0.001081 
+0.000329 -0.001866 0.000823 -0.000191 -0.000112 -0.000444 
+0.001260 0.000000 -0.003622 -0.001078 -0.000953 -0.001740 
+0.000366 0.002979 0.000590 -0.001272 0.004848 -0.001843 
+0.001167 0.004333 -0.002167 0.000597 0.001881 0.000938 
+-0.002480 -0.004569 0.001198 -0.005670 -0.000327 0.003735 
+-0.005173 -0.001433 0.003473 -0.005092 -0.000164 0.005133 
+-0.002151 0.002930 0.002070 0.000507 0.000676 0.001825 
+-0.001328 -0.002656 0.003115 -0.000938 -0.001075 -0.001183 
+-0.001855 -0.001184 -0.002078 -0.002959 0.000110 -0.001315 
+-0.002249 0.003070 -0.000450 0.001484 0.001136 0.002438 
+0.004398 0.001417 0.000162 -0.003043 0.007651 -0.005593 
+-0.010583 0.016244 -0.011649 -0.013029 0.018394 -0.014213 
+-0.004502 0.015154 -0.011484 0.004622 0.008046 -0.005719 
+0.002401 0.002227 -0.003558 0.000901 0.002415 -0.002039 
+-0.000985 0.005432 -0.002649 -0.001343 0.007184 -0.001431 
+0.000455 0.007045 0.000000 0.001420 0.005878 -0.001808 
+-0.000584 0.003498 -0.001602 -0.001301 0.000913 0.001370 
+0.001711 0.005203 -0.000524 0.001151 0.007385 -0.005180 
+0.000457 0.004706 -0.008430 0.000502 -0.000125 -0.005515 
+0.000774 0.001455 -0.000411 0.000261 0.001334 -0.001226 
+-0.000665 0.002460 -0.003327 0.002300 0.007763 -0.004696 
+-0.002564 0.003188 -0.001289 -0.001366 0.007170 -0.004019 
+-0.000065 0.005934 -0.006006 0.001743 0.003452 -0.007475 
+-0.001354 0.004990 -0.004277 -0.000517 0.004597 -0.000287 
+-0.001098 0.001585 0.003658 -0.000197 -0.000197 0.002677 
+-0.001395 -0.002168 0.001631 -0.003133 -0.004273 0.001749 
+-0.004236 -0.000361 -0.001762 -0.001464 0.005280 -0.003564 
+0.003507 -0.001380 -0.004456 0.002065 0.000953 -0.004560 
+-0.000939 -0.002520 -0.003992 -0.000090 0.005387 -0.006907 
+-0.001652 0.016238 -0.011155 0.014130 0.018507 -0.019192 
+0.011921 0.027009 -0.015381 0.005239 0.019388 -0.009740 
+-0.001470 0.002786 -0.001997 -0.001712 0.004193 0.001309 
+0.002449 0.007928 0.001535 0.000381 0.004144 0.001880 
+-0.002354 0.000234 0.001948 -0.004006 -0.000044 0.002251 
+-0.003971 0.001062 0.000508 -0.000519 0.001285 0.000062 
+-0.003388 0.000381 0.000159 0.000396 0.000513 0.000006 
+0.004921 0.005397 -0.004921 0.003204 0.005508 -0.008244 
+0.004611 -0.000036 -0.002795 -0.001422 -0.001410 -0.001610 
+-0.006842 -0.002180 0.000075 -0.004358 0.002179 0.005373 
+-0.004176 0.000813 0.001110 0.002783 0.001093 -0.002652 
+0.002394 0.004656 -0.004122 0.000508 0.003506 0.001661 
+-0.002614 0.003137 0.007165 -0.004945 0.002612 0.004665 
+-0.002401 0.002720 -0.001721 -0.001569 -0.000704 -0.005593 
+-0.001641 -0.002783 0.000879 -0.001906 0.000510 -0.000507 
+-0.000896 0.000372 -0.000165 0.001229 -0.001062 -0.000511 
+0.002581 -0.000354 -0.000443 -0.000565 0.001257 0.001221 
+-0.005179 0.002423 0.003552 -0.003722 0.000775 -0.002930 
+-0.003369 -0.000944 -0.004309 0.001165 -0.004763 -0.003038 
+0.006738 0.004635 -0.001080 -0.004991 0.014267 -0.008518 
+-0.009845 0.017635 -0.016500 -0.009965 0.015777 -0.016985 
+-0.007431 0.011537 -0.008799 -0.001246 0.002146 -0.002741 
+0.003951 -0.002856 -0.000179 0.004379 -0.000036 -0.000329 
+0.001612 0.002171 -0.000038 0.000661 0.001190 0.001061 
+0.003061 0.000158 0.000963 0.000034 0.002514 -0.000207 
+-0.003317 0.004832 -0.003151 -0.005191 0.004012 -0.001452 
+-0.002197 0.001147 0.002047 0.000411 0.000449 -0.000047 
+0.002891 0.002769 -0.003377 -0.000007 0.000677 0.000445 
+0.002502 -0.001533 -0.002864 0.002795 0.002883 -0.005794 
+0.001564 0.004704 -0.004484 0.001432 0.001965 -0.002449 
+-0.000555 -0.000040 0.000826 -0.002258 -0.000574 -0.000164 
+-0.002699 -0.000296 -0.002498 -0.002268 0.001692 -0.005103 
+-0.001880 0.000000 -0.002707 -0.002133 -0.002979 0.000524 
+-0.003400 -0.002033 -0.000513 -0.000997 0.002073 -0.000735 
+0.000963 0.002112 -0.003324 -0.002534 -0.001804 -0.001953 
+-0.005672 0.000000 -0.003403 -0.002855 -0.001280 -0.004283 
+-0.000665 0.002977 -0.000166 -0.000758 0.000975 -0.001826 
+-0.002005 -0.007227 -0.002410 -0.001818 -0.004560 0.000431 
+0.001911 0.011660 -0.004390 -0.007495 0.017256 -0.001234 
+0.766497 2.893401 -0.868020 0.010705 0.025034 -0.010001 
+0.005663 0.013147 -0.003681 0.003959 0.009148 -0.002010 
+0.007762 0.014073 -0.005029 0.005865 0.004589 -0.003920 
+0.000445 -0.002020 -0.002009 0.001564 -0.000790 -0.001424 
+0.003056 0.002642 -0.000410 -0.000763 0.003526 -0.000398 
+-0.003192 0.000326 0.000983 -0.001254 -0.001943 -0.000801 
+0.003406 -0.000419 0.000124 0.004346 -0.000324 0.000963 
+0.001789 0.000385 0.000538 -0.001687 -0.000904 0.002388 
+0.000213 0.001231 0.002509 -0.002165 0.003069 0.001000 
+0.000857 0.006143 -0.003071 -0.002756 0.003662 -0.003497 
+-0.000377 0.001382 -0.004122 -0.001515 -0.003146 0.001400 
+-0.002240 0.002240 0.002640 -0.004740 -0.004036 0.003932 
+-0.002769 -0.001463 -0.001045 0.001436 -0.001027 0.000204 
+0.002365 -0.000079 -0.001873 -0.000392 0.002111 0.000694 
+-0.000019 0.003952 -0.000005 0.001383 0.005312 -0.001352 
+-0.001545 0.005076 -0.000588 -0.001901 0.004105 -0.002593 
+0.001467 0.006058 0.000489 -0.002552 0.002684 -0.001479 
+-0.000399 -0.001171 -0.001531 0.002977 -0.005742 0.000471 
+0.014769 0.008991 0.002935 -0.000946 0.014837 -0.002026 
+-0.011750 0.012773 -0.007167 -0.013335 0.011114 -0.005047 
+-0.006152 0.007034 -0.001496 -0.000990 -0.000301 0.000956 
+0.003784 -0.002309 0.002969 0.001480 0.002723 0.004057 
+0.000629 -0.001075 0.003027 -0.000890 -0.001580 0.003782 
+-0.000604 -0.000197 0.000927 0.001245 0.002143 -0.000323 
+0.001851 0.004084 -0.002388 0.002424 0.003686 -0.000546 
+0.000419 0.002094 0.000323 0.000551 0.000986 -0.000916 
+0.000625 0.001896 -0.002813 0.001063 0.003109 -0.004235 
+0.000904 0.004156 -0.003004 0.001365 0.001316 -0.001030 
+-0.001769 -0.000898 0.000697 0.000433 0.000860 0.001721 
+0.002599 0.000224 0.001873 0.004420 0.000471 0.000471 
+0.005109 0.000965 0.000676 0.004420 0.001662 0.000997 
+0.002336 0.004934 -0.004029 0.000512 0.002797 -0.002938 
+-0.001901 0.000885 -0.001380 -0.001211 -0.001938 0.000673 
+-0.002732 -0.002907 -0.000175 -0.001616 -0.002929 -0.000404 
+-0.001073 -0.001739 -0.001415 0.000962 0.000584 0.000580 
+0.004164 0.006030 0.002482 0.009832 0.008020 -0.004400 
+0.004155 0.006788 -0.007140 0.000852 -0.000045 -0.007172 
+0.002126 0.005913 -0.003961 0.004932 0.016610 -0.003566 
+0.457944 2.803738 -0.429907 0.789189 3.637838 -0.697297 
+0.012408 0.035706 -0.009062 0.004780 0.021089 -0.004140 
+0.003699 -0.001483 -0.003708 0.001407 0.001629 -0.002964 
+0.002222 0.001483 -0.000999 0.001345 0.002508 0.000852 
+-0.002174 0.001132 0.003354 -0.007091 -0.000829 0.005960 
+-0.001934 -0.003005 -0.000587 0.000975 0.002126 0.000801 
+0.005283 0.001986 0.002231 0.008115 0.001536 -0.002432 
+0.000574 0.003286 -0.002552 0.000347 0.002352 -0.000233 
+0.000432 0.002304 -0.001366 0.000381 0.000304 -0.004043 
+-0.001474 -0.000801 -0.004507 -0.001029 0.000616 -0.002984 
+0.002167 0.003899 -0.001442 0.001551 -0.000038 -0.001362 
+0.000480 0.002305 -0.000936 0.000849 -0.001664 -0.000087 
+0.001067 -0.004127 0.000800 0.000022 -0.003293 0.001006 
+-0.000456 0.003990 0.002851 -0.003787 0.002434 0.003380 
+-0.001406 -0.002812 0.000469 -0.003474 -0.003124 0.003817 
+-0.001811 0.000866 0.000315 0.002326 0.005163 0.001721 
+-0.000211 0.002263 0.001423 -0.001448 -0.000541 -0.001973 
+0.002028 -0.003214 -0.001595 0.007588 -0.004253 0.001139 
+0.012492 0.014494 -0.000572 0.000857 0.019343 0.002489 
+-0.005902 0.015038 -0.000129 -0.007503 0.007289 -0.001457 
+-0.005582 0.000308 0.000900 -0.000262 -0.000654 0.000514 
+0.003799 0.005945 -0.004292 0.002564 0.007051 -0.000641 
+0.006533 0.001653 -0.005929 0.005184 0.000667 -0.002092 
+0.005297 0.002004 -0.003107 0.000735 0.003810 -0.002475 
+0.002468 0.003138 -0.000402 -0.001612 0.003023 0.001811 
+0.001857 0.003315 0.002056 0.001695 0.001649 0.001943 
+0.004672 -0.001409 0.000731 0.000388 0.000829 -0.000169 
+0.000250 0.002792 -0.000217 -0.001870 0.004362 -0.000811 
+0.004145 0.002792 -0.001142 0.001166 0.001843 -0.005584 
+0.003446 0.000977 -0.002872 0.000791 0.000064 -0.000093 
+-0.001592 -0.000502 -0.000182 -0.001510 -0.000449 -0.000816 
+0.000163 0.001342 -0.000610 0.002232 0.003813 -0.001339 
+0.001912 0.004194 -0.004686 -0.000981 0.002348 -0.006095 
+-0.000271 -0.000921 -0.000596 0.000040 -0.001786 -0.004365 
+0.002941 -0.002132 -0.001646 0.001595 -0.001624 0.001024 
+0.000896 0.002687 0.001493 0.003373 0.004167 -0.000594 
+0.000708 0.001203 -0.002618 -0.001426 -0.008558 -0.000924 
+-0.000517 -0.001628 0.000109 0.003550 0.017537 -0.002661 
+0.606481 3.199074 -0.481481 0.766169 3.845771 -0.492537 
+0.007552 0.035446 -0.000948 0.004414 0.019216 0.003477 
+-0.002780 0.004960 -0.001084 -0.003649 0.005946 -0.005626 
+0.002102 0.002350 -0.003333 0.002937 0.004913 0.001793 
+0.003594 0.007099 0.001079 0.002045 0.007269 0.000441 
+-0.002057 0.005391 -0.000882 -0.002503 0.001542 -0.001656 
+-0.001694 -0.000263 -0.000527 -0.001389 0.000326 0.000158 
+-0.001325 0.000681 0.001060 -0.000273 0.001161 0.000068 
+0.002700 0.003309 -0.003570 0.006077 0.003090 -0.003361 
+0.004510 0.003284 -0.000613 0.002391 0.003888 0.000778 
+0.002707 0.005241 -0.001451 0.003029 0.004488 -0.003369 
+0.000988 0.001633 -0.002051 -0.003578 -0.001030 -0.000231 
+-0.003233 -0.001750 0.000617 -0.000078 -0.000429 0.000066 
+0.000095 0.003350 0.002863 -0.001023 0.000283 0.001682 
+0.000139 -0.001820 -0.000267 0.001601 -0.000700 0.000441 
+0.003720 0.002148 -0.000182 0.004995 0.006606 0.002735 
+0.002307 0.005520 0.004468 0.000727 -0.002467 -0.001318 
+0.007349 -0.013942 -0.009834 0.019972 -0.000699 -0.015276 
+0.002793 0.018599 0.002424 -0.003462 0.022627 0.005496 
+-0.005323 0.018204 0.005851 -0.008709 0.008626 0.005245 
+0.001203 -0.000741 0.003052 0.000143 -0.003450 -0.000291 
+0.003242 -0.000057 -0.001915 0.004795 0.002777 -0.001048 
+0.002353 0.000588 -0.001062 -0.000282 -0.000681 0.000076 
+-0.000242 -0.000670 -0.000763 -0.000173 0.000865 0.000000 
+0.001175 0.002827 -0.000965 -0.001011 0.000947 -0.001325 
+-0.001111 0.001429 0.001190 0.001067 -0.000827 0.000293 
+0.001769 -0.001941 0.001251 0.000283 -0.000540 0.000110 
+-0.000677 0.001884 -0.000412 0.001140 0.002953 -0.000233 
+0.001653 0.002893 -0.000438 0.000373 -0.000015 -0.000030 
+-0.002012 0.002215 -0.001978 -0.003446 0.003229 -0.001507 
+0.000321 0.004950 0.001656 0.004461 0.004510 0.000049 
+0.004508 0.003860 -0.001451 -0.001695 0.002462 -0.006294 
+-0.003545 0.000933 -0.003451 0.002108 0.004468 -0.000371 
+-0.001548 0.001720 -0.001288 -0.002230 -0.000106 -0.000902 
+-0.001654 -0.003752 0.000454 0.000956 -0.000286 -0.001961 
+0.002943 0.005328 -0.004618 0.005333 0.000000 -0.004963 
+0.002500 0.002144 -0.003927 -0.000730 -0.010997 0.001933 
+-0.001361 -0.011260 0.006399 0.003491 0.007824 0.005011 
+0.008549 0.024279 0.000716 0.502392 3.736842 -0.023923 
+0.733333 4.220000 -0.220000 0.000677 0.030302 0.002935 
+-0.002564 0.004476 -0.000023 -0.002386 -0.006131 0.001810 
+-0.003215 -0.001592 -0.006508 0.004458 -0.001638 -0.007528 
+0.003830 0.000068 -0.005472 -0.000901 -0.001567 0.000210 
+-0.003913 -0.001846 -0.000543 -0.003020 -0.001921 -0.001550 
+-0.001415 0.000190 -0.000052 0.001851 0.002428 -0.001281 
+0.000090 0.001064 0.001176 -0.000959 0.000395 0.000141 
+-0.002924 0.000767 -0.000863 -0.003508 0.001869 -0.002176 
+-0.001429 0.000000 -0.000827 -0.000833 0.000147 -0.001322 
+0.001036 0.000395 -0.002915 0.004551 0.000463 -0.004397 
+0.005049 0.002689 -0.003466 0.001603 0.003173 -0.000019 
+-0.000425 0.000062 0.001186 0.000277 -0.000242 -0.000432 
+-0.002500 0.002888 0.003491 -0.002404 0.003549 0.002232 
+-0.001960 0.002362 0.002143 -0.003409 0.001445 0.004046 
+-0.001870 -0.001471 -0.001020 -0.002947 0.002459 -0.000698 
+-0.002217 0.003937 -0.000808 -0.001269 -0.001011 -0.002989 
+0.005115 -0.020251 -0.006891 0.008149 -0.001930 0.011114 
+0.004845 0.020229 0.007324 0.005923 0.022308 0.006790 
+0.007859 0.006790 0.006777 -0.003087 0.008284 0.006130 
+-0.000259 0.001930 0.000526 -0.000648 0.002705 -0.001943 
+0.004149 0.003922 -0.003241 0.004316 0.005376 -0.002045 
+0.003069 -0.000001 -0.000769 -0.000630 -0.001160 -0.002314 
+-0.001196 0.000157 -0.002776 -0.001697 0.001018 -0.001615 
+-0.000774 -0.000584 0.000407 -0.000063 -0.000127 0.001746 
+0.001200 0.000271 -0.000406 0.003651 0.003571 -0.003492 
+-0.001111 0.002063 -0.002222 0.000425 -0.000048 -0.001749 
+-0.001557 -0.000684 0.002347 -0.000193 0.000855 0.003096 
+0.001586 0.001833 -0.002932 0.003775 0.009557 -0.004257 
+0.004158 0.010043 -0.005736 0.002748 0.006847 -0.002282 
+-0.001447 0.000075 -0.001158 -0.002057 -0.003450 -0.001290 
+-0.003705 -0.003022 0.002021 -0.000399 0.000704 0.002375 
+-0.001175 0.001063 -0.000794 0.000463 0.002780 -0.006111 
+-0.000099 0.001290 -0.000363 0.001723 -0.001462 -0.000052 
+-0.002461 -0.002918 0.005238 -0.007222 0.000000 0.002778 
+-0.000762 0.004466 0.000210 -0.000705 -0.000088 0.000797 
+-0.001070 0.002404 0.002570 -0.002544 -0.006762 -0.000717 
+-0.000290 -0.011249 -0.000071 0.002524 0.008211 0.000239 
+0.010367 0.019023 0.009011 0.367647 3.480392 0.588235 
+0.001482 0.036689 0.010258 0.002130 0.023674 0.005221 
+-0.003905 -0.007431 -0.003776 -0.001795 -0.005266 -0.003095 
+0.000714 0.003321 0.001257 0.002687 0.004750 -0.005535 
+0.000504 -0.002643 -0.001655 -0.000637 -0.001097 0.002151 
+0.000268 0.003287 -0.001094 0.002621 0.005860 -0.000751 
+0.001866 0.002046 -0.000386 -0.000159 0.000161 0.000061 
+-0.002087 0.002756 -0.000578 -0.000767 0.001674 -0.003147 
+0.004401 0.003610 -0.004148 0.003623 0.000378 0.000246 
+0.000278 -0.001143 -0.000070 0.000338 0.000423 0.001438 
+-0.002645 -0.000364 -0.000973 -0.001454 0.002937 -0.003331 
+-0.002425 0.001216 -0.004860 -0.002068 0.001511 -0.004604 
+-0.004635 -0.000361 -0.003694 -0.003718 0.002488 -0.003116 
+0.003655 0.002563 -0.002101 -0.000847 0.000000 -0.000847 
+0.000063 0.003721 -0.004476 0.003524 0.004345 -0.005325 
+0.001125 0.003529 -0.000281 0.000911 0.000401 -0.002520 
+0.001435 0.000991 -0.000997 0.004005 0.003313 -0.002240 
+0.003027 0.003244 -0.006725 -0.000500 -0.001222 -0.003318 
+-0.004171 -0.000262 -0.000552 -0.002977 -0.001491 0.000309 
+0.000402 0.000108 0.000063 -0.000396 0.003573 -0.001852 
+0.001246 0.004724 -0.003220 -0.002530 -0.003182 0.013311 
+-0.031278 0.014938 -0.017485 -0.000696 0.022468 -0.008759 
+-0.001602 0.017251 -0.008225 0.012948 -0.009918 0.025711 
+0.020292 -0.010263 0.030088 0.018824 -0.010000 0.006471 
+-0.000095 -0.012637 -0.001627 0.005877 -0.010157 -0.001331 
+0.015418 -0.009825 -0.019374 -0.022222 0.030081 -0.024065 
+-0.047937 -0.093968 -0.047460 0.044545 0.044545 -0.086364 
+-0.015667 0.068667 -0.084333 -0.017000 0.046000 0.000000 
+-0.045500 0.026000 -0.045500 -0.006319 0.015495 -0.049945 
+-0.035809 0.002228 -0.020902 -0.004545 0.000000 -0.084545 
+0.061538 0.012663 0.018994 0.047540 0.040749 -0.011818 
+0.085411 0.128874 -0.054329 -0.015278 0.021111 -0.026944 
+0.015862 -0.039655 0.050000 0.137091 -0.068545 0.050909 
+0.030633 -0.022167 0.070733 -0.103000 -0.101877 -0.058215 
+0.040000 -0.020400 -0.040800 0.012111 -0.010056 -0.004389 
+-0.020939 0.008122 -0.006260 -0.027047 0.013918 0.021140 
+-0.015863 -0.003458 0.054708 -0.007026 -0.014927 0.043615 
+0.008848 0.029038 0.003813 0.002771 0.003261 0.014262 
+-0.023484 -0.026935 0.007021 0.006294 -0.010409 0.034130 
+0.000737 -0.003926 0.000266 -0.007716 -0.003501 0.008529 
+-0.005953 -0.012751 0.009826 -0.007898 -0.005492 0.008505 
+0.015795 0.009115 -0.035535 0.009186 -0.001065 -0.010546 
+-0.003174 -0.001761 -0.002001 -0.012923 0.007227 -0.005181 
+-0.012773 0.016195 -0.005031 -0.004735 -0.037467 -0.008564 
+-0.027159 -0.036071 -0.011929 -0.065915 -0.028704 -0.035269 
+-0.019161 -0.013003 -0.031426 -0.008872 -0.003437 -0.019518 
+-0.006680 0.002939 -0.011621 -0.000812 0.002208 -0.006901 
+-0.000537 0.002347 -0.006480 0.000648 0.002396 -0.007014 
+-0.001073 0.002395 -0.004240 -0.004612 0.002326 -0.001199 
+-0.006294 0.001913 -0.000018 -0.003509 0.000980 0.000343 
+0.000099 -0.000043 0.000109 0.000460 0.000142 -0.000739 
+0.001382 0.000007 0.000040 -0.000638 0.000115 -0.000021 
+-0.003145 0.000073 -0.000024 -0.004252 -0.001909 0.000551 
+-0.003819 -0.001544 0.003237 -0.003586 -0.000616 0.002986 
+-0.002879 -0.001666 0.001529 -0.002311 -0.001138 0.001713 
+-0.001158 0.000572 0.001477 -0.001555 0.003482 0.001162 
+-0.001913 0.004441 -0.005753 -0.001087 0.003363 -0.003574 
+0.000536 0.003065 -0.002666 0.002707 0.004150 -0.001236 
+0.004669 0.007084 -0.000351 0.009755 0.014293 -0.003304 
+0.069248 0.060752 -0.015493 0.041334 0.072709 -0.048639 
+0.008874 -0.013279 0.004415 -0.004216 -0.026162 0.013622 
+-0.034486 -0.019209 0.011798 -0.027136 -0.014599 0.026579 
+-0.016952 -0.004139 0.029172 0.001339 -0.002251 0.004736 
+-0.018560 -0.041235 0.010944 -0.018690 -0.030460 -0.011699 
+-0.029848 -0.018788 0.026515 -0.016603 0.058278 0.028325 
+0.066414 0.034621 0.059172 0.000667 -0.000222 0.063333 
+0.018148 0.055185 -0.018519 -0.043000 0.021500 0.021500 
+-0.005229 0.001307 0.011111 0.068519 0.112407 -0.057593 
+-0.060171 -0.014274 -0.015812 0.003972 -0.002119 -0.001059 
+-0.039753 0.122543 0.011580 -0.098750 0.000000 -0.077500 
+0.021556 0.124444 -0.043111 -0.104892 -0.049719 0.028496 
+0.026286 0.040451 0.062016 -0.021349 -0.005789 -0.039441 
+-0.040064 0.006090 -0.058526 -0.011871 0.015055 -0.007277 
+-0.003525 0.017275 0.003432 0.008562 0.033884 -0.013465 
+-0.010635 0.019577 -0.005800 0.000000 0.000000 0.041250 
+-0.066569 0.037647 -0.010098 -0.010877 -0.037402 0.022279 
+-0.016965 -0.054177 0.069847 -0.003355 -0.011309 0.008151 
+0.002514 0.009857 -0.006468 -0.002060 0.002457 0.003097 
+-0.001869 0.002466 0.005549 -0.002696 0.003934 0.008788 
+0.014851 0.018112 -0.018898 0.029454 0.001825 -0.020486 
+0.016695 -0.001086 -0.001215 -0.004012 0.011049 -0.019568 
+-0.007868 0.014320 -0.018318 -0.054405 -0.021548 0.007024 
+-0.044666 -0.029317 0.030711 -0.024214 -0.009982 0.016779 
+-0.018552 0.000344 0.015116 -0.013334 -0.000532 0.023711 
+-0.010498 -0.000248 0.017001 -0.007812 0.002511 0.007097 
+-0.006078 0.002661 0.002714 -0.003579 0.001055 0.001024 
+-0.000738 0.000281 -0.000474 0.000386 -0.000681 -0.003539 
+-0.001774 -0.002274 -0.004552 -0.003199 -0.001949 -0.002574 
+-0.002454 -0.000629 0.000474 -0.002585 -0.000531 0.002287 
+-0.003244 0.002803 0.002191 0.000369 0.005953 -0.001375 
+0.001159 0.004977 -0.003213 0.001575 0.000394 -0.001949 
+0.002029 0.002780 -0.000234 0.002087 0.001559 -0.001157 
+-0.000733 0.000677 -0.003254 -0.001201 -0.001762 -0.000351 
+-0.001197 -0.002163 -0.001104 0.000918 -0.001298 -0.001497 
+-0.003244 0.002497 -0.000805 -0.001953 0.001393 -0.003687 
+-0.001377 0.002256 0.003382 -0.000090 0.003435 -0.000949 
+0.003174 0.003507 0.001393 0.004435 0.006059 0.002461 
+0.009346 0.010325 0.007233 0.003078 0.010605 0.039312 
+0.002800 -0.000060 0.039444 -0.027467 -0.005194 0.044842 
+-0.063330 -0.033571 0.057346 -0.044506 -0.065494 0.052469 
+-0.205000 -0.049038 0.009808 -0.067128 -0.089326 -0.033652 
+-0.016961 -0.102222 -0.028268 -0.081818 -0.048071 0.060089 
+-0.110990 0.056908 -0.008478 -0.020250 0.027500 -0.024250 
+0.048496 -0.030226 0.014060 -0.042571 -0.085143 -0.031429 
+-0.022111 -0.066333 0.135556 0.097000 -0.029200 -0.014600 
+-0.011795 -0.120385 0.024402 0.036471 0.145882 0.133333 
+-0.110244 -0.015463 0.101512 -0.016000 -0.004231 0.021154 
+-0.020217 -0.005565 0.027261 0.013661 0.034643 -0.028304 
+-0.049259 0.125255 -0.031968 -0.098333 0.022667 0.011333 
+-0.045298 -0.069405 0.187024 0.033750 0.112132 0.067279 
+0.094145 0.118737 0.103367 -0.002475 0.026896 -0.009585 
+0.000875 0.032765 -0.026880 0.022298 0.065223 -0.024626 
+0.032877 0.026836 -0.002798 0.151722 -0.072261 -0.024313 
+0.015597 -0.003557 0.040862 -0.003175 0.011683 0.031302 
+-0.082444 -0.014444 -0.005111 -0.018174 -0.017847 0.041061 
+-0.004450 -0.009729 0.010779 -0.001209 -0.002656 0.003107 
+-0.007498 -0.000523 0.004196 -0.010089 -0.009222 0.006834 
+-0.008052 -0.000036 0.006732 0.003266 -0.002220 0.000511 
+0.006647 0.005337 -0.012174 0.012347 0.015382 -0.016245 
+0.015822 0.020060 -0.013161 0.008107 0.000388 0.001341 
+-0.011850 -0.016969 0.007346 -0.008121 -0.005972 0.006575 
+0.001611 0.001774 -0.003875 0.000132 0.002373 -0.005049 
+-0.001258 0.001720 -0.002438 -0.001808 0.001431 -0.000834 
+-0.002443 0.001909 -0.001038 -0.001679 -0.000687 0.000382 
+0.001295 0.000861 -0.000646 0.000816 0.002506 -0.001100 
+-0.000108 0.003264 -0.004174 -0.000276 0.001054 -0.003508 
+-0.001783 0.001310 -0.002262 -0.000909 0.002124 -0.001085 
+-0.001648 0.000487 0.000745 0.003802 0.006112 -0.000061 
+0.004223 0.008403 -0.002106 0.002972 0.003389 -0.003806 
+-0.000088 0.001741 0.000731 -0.001656 -0.000223 0.000960 
+-0.001106 -0.001202 0.000152 -0.002977 -0.000092 -0.001706 
+-0.001879 -0.000136 0.000944 0.003680 0.000843 -0.003340 
+0.006999 0.005881 -0.007942 0.001153 0.003984 -0.006819 
+-0.001149 -0.000616 -0.000976 -0.000402 -0.001030 -0.001556 
+-0.001437 -0.000344 -0.001747 -0.000738 0.002622 -0.001651 
+0.001666 0.000253 0.004017 -0.004532 0.000550 0.011597 
+-0.004194 -0.000897 0.013046 -0.004663 -0.003778 0.014206 
+-0.001074 -0.006762 0.016954 0.010909 -0.007149 0.029677 
+0.006354 -0.002341 0.016319 0.007419 0.030189 -0.021007 
+-0.066570 -0.005217 -0.032415 -0.083385 -0.072000 -0.125077 
+-0.001481 0.002037 0.001296 0.125278 -0.054444 0.016389 
+-0.015714 0.015714 0.101429 0.046818 0.034318 -0.027045 
+-0.006875 -0.026875 -0.010000 0.101037 -0.004407 -0.041296 
+-0.153081 -0.148000 0.025514 -0.142145 -0.036759 -0.034663 
+-0.136676 -0.086322 -0.058147 -0.081111 0.157778 -0.001111 
+0.011515 0.077273 0.042727 -0.020710 -0.024321 0.096327 
+-0.005000 -0.016000 0.013000 0.038565 0.010926 -0.016065 
+-0.002111 0.137778 -0.006333 0.021919 0.012828 0.069495 
+-0.066364 -0.008182 0.066364 0.006865 0.010992 0.003294 
+0.069524 0.039048 -0.038095 -0.000036 0.017445 -0.010337 
+-0.011977 0.000074 0.001736 -0.024214 -0.014125 -0.006111 
+0.021337 -0.037701 -0.039358 0.019614 -0.015886 0.007570 
+-0.033553 0.027929 0.033173 -0.005655 0.011855 -0.003033 
+0.000124 0.000866 -0.001662 -0.001230 0.000465 -0.000982 
+-0.001912 -0.004307 0.001713 -0.006791 -0.005405 -0.000241 
+-0.002718 -0.000089 0.011639 -0.005557 0.001965 0.004607 
+-0.003356 0.002681 -0.000972 0.003520 0.005051 -0.004560 
+0.003158 0.008450 -0.004313 -0.002039 0.006420 -0.005017 
+-0.007120 -0.000350 0.000794 -0.006052 -0.003112 0.010419 
+-0.001534 -0.001739 0.006956 0.000022 -0.000432 0.002011 
+0.001597 0.000000 -0.000347 0.002226 0.002525 -0.000674 
+-0.000443 0.001331 -0.000668 -0.001015 0.000411 -0.001292 
+-0.000103 0.001320 -0.003012 0.001682 0.004200 -0.000387 
+0.002194 0.003699 -0.000213 0.000930 0.000428 0.000139 
+-0.000587 0.000148 -0.001145 -0.000136 0.000459 -0.004347 
+-0.001633 0.003645 -0.002887 0.001716 0.003475 -0.003251 
+0.002283 0.003109 -0.001268 0.002155 0.005742 0.000676 
+-0.003386 0.006220 -0.001682 0.000392 0.004952 -0.002294 
+-0.001642 -0.001590 0.001377 -0.004015 -0.000076 0.001817 
+-0.001460 -0.000992 0.003305 0.000895 0.004507 -0.003202 
+0.005658 0.010943 -0.011551 0.003920 0.008656 -0.014045 
+0.002813 0.002315 -0.003203 0.001599 0.000264 -0.003627 
+-0.004469 -0.000878 -0.006917 0.000668 0.011228 -0.004230 
+0.000310 -0.002515 0.011859 0.004119 0.003143 0.016832 
+-0.003410 0.008230 0.020045 -0.007820 0.005788 0.024993 
+-0.006871 -0.001114 0.023506 -0.001744 -0.005880 0.015488 
+0.004340 -0.009518 0.014690 0.016892 0.004378 0.033090 
+0.029917 0.011493 0.016087 0.003736 0.000219 0.002033 
+0.039157 0.000177 0.006945 0.041113 0.007266 -0.006113 
+0.064298 0.001843 -0.022033 0.081136 0.027841 0.002386 
+-0.133875 0.006000 0.024375 -0.035897 -0.005556 0.021624 
+-0.005432 -0.014198 0.016914 -0.038182 0.012727 -0.023636 
+-0.150411 -0.135788 0.018801 -0.063871 -0.041452 0.054140 
+-0.060053 0.044840 0.111702 -0.063575 0.063232 0.050242 
+0.044983 -0.024007 0.088451 0.105152 0.030303 -0.074848 
+0.177321 0.173036 -0.170893 0.001000 -0.032000 0.032000 
+-0.019316 0.001450 0.008101 -0.003315 0.025971 -0.014160 
+0.020110 0.018791 -0.050989 0.000618 0.027855 -0.005964 
+-0.012729 0.003720 0.008606 -0.013814 -0.006500 -0.008590 
+-0.030044 -0.006279 -0.032215 -0.059500 -0.001250 0.029750 
+-0.000045 0.000093 0.013889 0.000193 0.002627 -0.006427 
+-0.000859 0.004688 -0.000715 -0.004480 -0.004661 0.001020 
+-0.001805 -0.007568 0.001134 0.003752 -0.001573 0.003865 
+0.000776 -0.000277 -0.003198 0.000996 0.003294 -0.007422 
+0.002352 0.007801 -0.005324 -0.004032 0.004472 -0.005684 
+-0.004303 0.002139 -0.006945 -0.000201 -0.000254 0.000016 
+0.000186 -0.005372 0.009004 0.001618 -0.001443 0.009211 
+0.001316 -0.000425 0.001648 -0.000401 -0.000279 -0.000011 
+0.001917 0.001260 -0.004237 0.001183 0.000672 -0.005653 
+0.000807 -0.000139 -0.002143 -0.000554 -0.000536 0.002732 
+-0.001583 0.001708 0.001958 -0.000511 0.001074 0.001403 
+0.001476 0.000610 0.000342 -0.002013 -0.002591 0.000200 
+-0.004068 -0.007897 0.003230 -0.008938 -0.001018 0.003053 
+-0.001193 0.002484 -0.002172 -0.000852 0.005018 -0.001445 
+-0.000774 0.002428 0.000566 0.001234 0.001718 0.001137 
+0.001819 0.001504 0.001688 0.002133 0.002520 -0.001309 
+-0.001837 -0.005134 -0.001169 -0.001247 -0.005357 -0.002949 
+-0.000918 0.000023 -0.004075 0.004544 0.009950 -0.007516 
+0.007653 0.011383 -0.005220 0.007555 0.014069 -0.004468 
+-0.002031 0.020663 -0.016611 -0.001796 0.009704 -0.025620 
+0.002619 -0.001068 -0.014613 -0.008426 0.008031 0.005908 
+0.001149 -0.004255 0.024328 -0.073913 -1.743478 3.804348 
+0.105572 -2.709677 3.706745 0.282878 -3.421836 3.029777 
+0.407407 -3.475784 2.173789 0.427885 -3.110577 1.298077 
+-0.003259 -0.025189 0.009486 0.011400 0.004399 0.008404 
+0.029910 -0.015779 0.012756 -0.004476 -0.000226 0.006085 
+-0.012338 -0.017318 0.009047 -0.019559 -0.024720 0.006418 
+-0.025847 -0.058720 -0.034584 -0.016398 -0.018103 -0.021858 
+0.044112 -0.032888 0.041151 0.028014 0.008445 0.032751 
+0.003471 0.052816 -0.000755 -0.030220 -0.100165 0.062912 
+0.008607 0.059011 0.042935 0.015653 0.004147 0.012238 
+0.016748 0.001683 0.000082 0.028000 -0.002282 -0.007760 
+0.077696 0.046618 0.090000 0.054444 0.011712 0.016396 
+0.036589 -0.027223 -0.038981 0.054943 0.018241 -0.048692 
+0.030233 0.045904 -0.040773 0.004729 0.005973 0.001109 
+-0.001754 -0.004386 -0.001754 -0.009621 -0.011431 -0.000517 
+0.004048 0.010476 0.011190 -0.016610 0.014273 0.017213 
+-0.009122 -0.008986 -0.009034 -0.007985 0.021546 0.000919 
+0.021584 0.008131 -0.019519 -0.001127 0.000344 -0.001855 
+0.005318 0.000197 0.003555 -0.007365 -0.000963 0.006153 
+-0.007917 0.004628 0.011587 0.002788 -0.001506 0.005567 
+0.001830 -0.005287 0.004472 0.001985 -0.001327 -0.001250 
+-0.000675 -0.000975 -0.001471 -0.001490 -0.001654 -0.007928 
+-0.000011 -0.003354 -0.001776 -0.000525 -0.002421 0.002921 
+-0.001489 0.002017 0.000638 -0.003635 -0.000039 -0.006141 
+-0.003070 0.001137 -0.002968 0.000515 0.001333 -0.000480 
+0.002424 -0.002045 -0.002348 -0.000622 -0.000513 -0.006438 
+-0.000302 0.002450 -0.007316 -0.003903 0.001460 -0.002323 
+-0.003557 0.003243 -0.000538 -0.004243 0.002981 -0.000976 
+-0.006212 0.000189 0.000189 -0.003062 0.000396 0.000927 
+-0.003686 0.000653 0.001609 -0.007683 -0.001161 0.002892 
+0.003932 0.002044 0.000540 0.002179 0.001559 0.002052 
+0.000304 0.000843 0.001077 0.000488 -0.000474 -0.000197 
+-0.004122 -0.003817 0.000153 0.000743 -0.001122 0.001182 
+-0.003201 -0.000727 -0.002046 -0.003124 0.001536 0.000262 
+-0.001139 0.005433 -0.001639 0.002549 0.003279 -0.005275 
+0.008592 0.003299 -0.005164 0.013895 0.014032 -0.004796 
+0.022311 0.025798 -0.006113 0.010017 0.050076 -0.019363 
+0.010835 0.020573 -0.015691 -0.010753 0.010861 0.024712 
+-1.260638 -0.276596 3.930851 0.325301 -1.713855 4.135542 
+1.121704 -3.162272 3.494929 1.354244 -3.905904 2.725092 
+1.214286 -3.913793 1.869458 0.008404 -0.028350 0.007727 
+0.001603 0.015481 0.004855 -0.020629 -0.000855 -0.002612 
+-0.018071 -0.024433 0.002291 0.010030 -0.025968 -0.014776 
+0.003581 0.001245 0.014608 0.014599 -0.026842 0.053530 
+-0.013234 0.004914 0.003114 -0.012500 -0.001192 -0.008342 
+0.021085 0.000734 0.023238 0.026670 -0.063059 -0.006102 
+0.089000 -0.063000 0.089000 0.036961 0.073627 0.082941 
+0.023170 -0.021282 0.035980 0.007478 -0.014265 0.017670 
+-0.017143 -0.023214 -0.009762 -0.033188 -0.052464 -0.019275 
+0.000722 -0.002445 0.018277 -0.030510 0.024490 -0.007023 
+0.001180 -0.005215 -0.001949 0.007421 0.015788 0.006002 
+0.017126 0.038529 0.009280 0.030226 0.071339 0.009951 
+-0.030147 -0.020335 -0.001426 -0.030000 -0.038750 0.014375 
+0.019332 -0.023252 0.001045 0.050423 0.037677 0.016214 
+0.237500 0.291374 -0.065559 0.025085 -0.011180 -0.007986 
+-0.012452 0.033359 -0.007836 0.003208 0.022955 -0.001998 
+0.004724 -0.018629 -0.016619 0.001241 -0.015902 -0.008120 
+-0.006003 0.000978 -0.002232 -0.005733 0.001115 0.005682 
+0.001941 0.000463 0.004837 0.002421 -0.000687 0.003243 
+0.002147 -0.001364 0.002013 0.003027 -0.002082 0.003127 
+-0.004612 -0.014935 0.006260 0.000494 0.001123 0.004947 
+-0.000633 0.002504 0.004280 -0.000421 -0.001088 0.004547 
+-0.000940 -0.001073 0.001031 -0.001987 -0.002809 -0.001781 
+-0.004075 -0.000145 0.000940 -0.000263 -0.000056 0.000285 
+-0.001732 -0.000254 0.000701 -0.004522 0.001580 0.000051 
+-0.006260 0.002915 -0.001837 -0.007052 -0.001267 -0.003251 
+-0.006822 -0.000679 -0.001595 -0.002833 0.000433 -0.001263 
+-0.001077 0.002547 -0.000729 -0.000823 0.001920 -0.002197 
+0.002951 -0.001395 -0.003468 0.005122 -0.000224 -0.002303 
+0.002456 0.000266 0.003360 0.000000 -0.005597 0.008507 
+0.001199 -0.005839 0.006263 0.001670 -0.001103 -0.002235 
+-0.003508 0.006977 -0.008712 -0.003827 0.006258 -0.003158 
+-0.003721 -0.000377 0.000590 -0.000314 -0.000410 0.000102 
+0.007248 0.004293 -0.003648 0.014793 0.013634 -0.003816 
+0.020368 0.021120 -0.007848 -0.002587 0.044779 -0.011410 
+0.000270 0.030072 -0.018052 -0.005098 0.008188 0.034237 
+0.476038 -0.130990 4.884984 1.178794 -1.401247 4.557173 
+1.778612 -2.694184 3.799250 2.244132 -3.828639 2.791080 
+2.406780 -4.254237 1.296610 0.010314 -0.015826 -0.005482 
+-0.002490 0.014776 -0.001128 -0.002987 0.002815 -0.000766 
+-0.014433 -0.010495 0.027432 0.019883 -0.011030 -0.007824 
+-0.000935 -0.009434 0.021588 0.042554 -0.043854 0.035609 
+-0.014762 0.032546 0.012891 -0.010920 0.012632 0.017675 
+-0.018787 -0.029373 0.036046 -0.020467 -0.004285 -0.038631 
+-0.014500 -0.014043 0.004899 0.002090 0.015867 0.090402 
+0.053499 -0.025370 -0.002836 0.059687 -0.047293 0.009518 
+-0.048744 -0.060370 0.089995 -0.031778 -0.014124 0.062500 
+-0.021291 0.033529 0.036614 0.047500 0.000313 0.000313 
+-0.065959 -0.005288 0.012914 -0.024002 -0.007143 -0.014951 
+-0.003000 -0.007650 0.005950 -0.012908 -0.030026 0.014856 
+0.025339 -0.012428 0.027679 -0.010676 -0.001640 0.011824 
+-0.045796 -0.065251 0.026141 0.007249 0.000910 -0.001697 
+0.020173 0.004703 -0.004635 -0.011897 -0.041380 0.030411 
+-0.003995 -0.003632 0.002259 0.023542 0.076365 -0.026641 
+-0.074419 0.091816 0.002006 -0.007762 -0.018887 -0.009987 
+-0.003320 -0.009135 -0.008297 -0.003346 0.001487 -0.006814 
+-0.000624 0.009361 -0.001224 0.002272 0.005332 -0.007624 
+0.006744 0.001417 -0.012365 0.010932 0.003740 -0.009487 
+-0.001017 0.001510 -0.003007 0.000093 0.001070 0.001876 
+0.001797 0.000675 0.005812 0.000393 -0.004024 0.001827 
+-0.005451 -0.004781 0.002260 -0.001114 -0.004941 -0.000764 
+0.000452 0.001267 -0.008788 -0.001422 0.001659 -0.006277 
+-0.001501 0.000493 -0.001137 -0.007408 -0.001739 0.000643 
+-0.004736 -0.005920 -0.002117 -0.000032 -0.002623 -0.001247 
+0.000177 -0.001779 0.000103 -0.000965 -0.002951 0.001965 
+-0.002742 -0.001602 0.001344 -0.001507 -0.001597 0.000585 
+-0.001878 0.003217 -0.006963 0.001862 0.001196 -0.001356 
+0.002469 -0.002584 0.004647 0.001774 -0.003576 0.004846 
+-0.000202 0.002044 -0.002545 -0.010395 0.002148 -0.010996 
+-0.004806 0.007279 -0.009853 -0.002096 0.001479 0.000042 
+0.000513 0.002145 0.001772 0.004838 0.002580 -0.002986 
+0.010179 0.005432 -0.006917 0.009282 0.007805 -0.010427 
+0.017592 0.013115 -0.028508 -0.050327 0.002196 -0.056701 
+-0.002147 0.029500 -0.029293 0.468293 0.146341 3.741463 
+1.805825 -0.752427 4.783980 2.244660 -1.675728 4.699029 
+2.655963 -2.926605 3.935780 3.161049 -4.385768 2.202247 
+2.874074 -4.207407 -0.600000 0.007637 -0.013483 -0.006263 
+0.018445 0.007055 0.019784 0.032078 0.001843 0.039309 
+-0.034571 -0.013429 0.007714 -0.011551 -0.006725 0.017558 
+0.002964 -0.028581 0.019504 -0.017983 -0.081478 0.003873 
+0.015864 -0.002290 0.039154 0.000036 -0.017966 0.013470 
+-0.006764 -0.011790 0.003035 0.006333 -0.001994 -0.010228 
+-0.030351 -0.019860 -0.045333 -0.011248 -0.042783 0.133974 
+0.033429 0.030952 0.094095 0.058715 0.043478 -0.019707 
+0.041650 0.014335 0.005413 -0.025867 0.030663 0.023469 
+-0.012912 0.033266 0.007660 0.070133 -0.051184 -0.011135 
+-0.055128 -0.052051 0.053590 -0.015920 -0.042000 0.021227 
+-0.018325 -0.033275 -0.010465 0.010476 -0.035271 -0.005444 
+-0.026314 -0.040121 0.035643 -0.019566 -0.015840 0.017452 
+-0.016742 -0.056668 0.032981 -0.013077 -0.035800 0.037171 
+-0.016879 -0.047692 0.028476 -0.017290 -0.048338 0.026931 
+-0.013705 -0.041995 0.020357 -1.290000 -4.260000 -1.780000 
+-5.737705 7.688525 -1.852459 -0.015186 0.091881 -0.004609 
+0.001056 0.000326 -0.003530 -0.002828 -0.000082 -0.001623 
+-0.003731 0.009483 -0.001886 -0.006192 0.019601 -0.016223 
+0.005133 0.028802 -0.025614 -0.004257 0.009614 -0.023062 
+-0.003905 0.001073 -0.009492 -0.001040 -0.000769 -0.001956 
+0.000513 -0.000567 -0.000180 -0.002355 0.000139 0.001424 
+-0.002879 0.002883 -0.002021 0.000332 0.004089 -0.007819 
+0.000392 0.003137 -0.009098 0.003041 -0.001727 -0.004769 
+-0.003406 -0.003543 -0.001908 -0.006688 -0.003349 -0.003347 
+0.001117 0.002554 -0.001476 -0.000040 -0.001975 -0.001056 
+-0.003488 -0.001597 0.001239 -0.003906 0.000000 0.005937 
+-0.001207 -0.003278 -0.001587 -0.003529 -0.001489 -0.000800 
+0.002264 0.001229 -0.002191 0.001685 0.001222 0.000551 
+0.003473 -0.000653 0.003678 0.000976 0.000950 0.001944 
+-0.000348 0.009014 -0.005350 -0.005892 0.006966 -0.010218 
+-0.004260 0.003616 -0.007051 -0.001694 -0.000883 -0.002136 
+0.001809 -0.001104 -0.001932 0.000465 0.002123 -0.001965 
+0.000499 0.003320 -0.002182 0.001680 0.003283 -0.006190 
+0.009748 0.006567 -0.023105 -0.001960 -0.004968 -0.044029 
+-0.006738 0.022827 -0.022299 0.002281 0.004969 0.022893 
+1.697318 -0.655172 3.747126 2.563934 -1.796721 3.849180 
+3.150794 -3.269841 2.904762 3.587879 -4.036364 0.678788 
+0.030843 -0.025169 -0.019365 0.015231 -0.002584 -0.011236 
+-0.006910 -0.008779 0.021852 0.034755 -0.027202 0.036229 
+-0.032333 0.012333 0.044667 0.002641 0.002179 0.008738 
+0.000956 0.002455 -0.003394 -0.020554 -0.007580 0.013149 
+-0.012576 -0.026787 0.036122 -0.001518 -0.011760 0.009689 
+0.014126 0.009777 -0.001371 0.014283 0.021047 -0.009700 
+0.020308 -0.017489 -0.025104 -0.004439 -0.005858 0.012335 
+0.008182 -0.008182 0.060909 0.013258 -0.004508 -0.021477 
+0.035525 0.022027 -0.042643 0.007382 0.030615 -0.039733 
+-0.026008 -0.052564 0.004828 0.000369 -0.002195 0.001335 
+0.010650 0.021580 -0.000046 -0.007822 0.001475 -0.004846 
+0.035805 -0.047802 -0.031681 0.068391 0.035195 -0.018158 
+-0.003760 0.020574 -0.049947 0.002415 0.016304 -0.015060 
+0.025313 -0.025731 -0.007113 -0.049557 -0.042892 0.032423 
+-0.048936 -0.055007 0.031240 -2.361905 -5.923810 1.723809 
+-2.073826 -5.798658 -1.127517 -1.944444 -6.234568 -1.543210 
+-0.013674 0.001528 -0.006665 0.015893 0.030824 -0.019811 
+-0.000210 0.000220 0.005319 0.000890 0.002911 -0.002057 
+0.000447 0.014213 -0.006949 -0.006432 0.006915 -0.016032 
+-0.009342 0.008757 -0.006934 -0.005027 0.003116 -0.006399 
+-0.004777 -0.001185 -0.005099 -0.003394 -0.001398 -0.002768 
+-0.001227 0.000623 -0.001053 -0.001057 0.000352 0.000352 
+0.003036 0.003604 -0.005817 0.004023 0.002378 0.001860 
+0.001724 0.007955 -0.000451 -0.001491 0.001398 -0.006336 
+-0.004516 -0.002692 -0.003942 -0.003008 -0.002406 -0.003835 
+-0.002502 0.002889 -0.002550 -0.002175 0.004098 0.000278 
+-0.000528 0.003717 -0.003501 -0.000558 -0.000507 -0.000712 
+-0.004562 0.001091 0.001119 -0.005120 0.001497 -0.001268 
+0.004133 0.003674 -0.011449 0.000475 -0.001871 -0.004830 
+-0.000676 -0.000773 -0.001909 -0.000746 -0.000222 -0.000783 
+-0.001357 0.002288 -0.005549 -0.004493 0.003479 -0.001287 
+-0.004954 0.003442 -0.000365 -0.000905 0.001006 0.001308 
+-0.001729 0.000350 -0.003451 -0.000887 0.001318 -0.002541 
+0.000286 0.000859 -0.000848 -0.000679 -0.001935 -0.002617 
+-0.007181 -0.002356 -0.012338 -0.004703 0.015151 -0.019091 
+0.000288 0.017021 -0.015205 0.008550 0.008928 -0.006485 
+0.008662 -0.000386 0.006870 0.013435 -0.007161 0.015457 
+0.018061 -0.018668 0.013651 0.019245 -0.020702 -0.002917 
+0.014503 -0.014385 -0.008626 0.005281 -0.014067 -0.008956 
+-0.007423 -0.019805 -0.008767 0.003571 -0.027857 -0.013571 
+0.015188 -0.002840 -0.001862 0.012738 0.044631 -0.010081 
+-0.011003 0.050179 -0.004452 0.010410 0.049391 -0.007536 
+0.026999 -0.129124 0.009156 -0.115000 0.039617 -0.007546 
+-0.057602 0.025665 -0.031543 0.043273 0.021787 -0.000385 
+0.001236 0.011303 -0.019754 0.032084 -0.016111 -0.036009 
+0.001000 0.000000 -0.026500 -0.002869 0.000576 -0.003983 
+-0.001500 0.001333 -0.003333 0.031409 -0.019965 -0.057122 
+-0.041026 0.014103 -0.006410 -0.022222 0.025556 0.005778 
+0.007835 -0.022719 -0.019781 0.037738 -0.058214 -0.028690 
+0.060000 0.045000 0.003750 0.005347 0.023254 -0.014416 
+0.005006 -0.001531 -0.019487 0.006665 0.021224 -0.001082 
+-0.085334 -0.010406 -0.039468 0.006368 -0.013076 -0.004717 
+-0.021011 -0.018099 0.025086 -0.019130 -0.045965 0.012618 
+-1.928994 -4.846154 -1.112426 -1.456647 -3.890173 -1.289017 
+-0.007937 -0.002872 -0.004126 0.005346 0.015172 -0.004128 
+0.005341 0.006944 -0.003071 0.003046 0.006212 -0.006274 
+-0.004412 -0.000713 -0.004692 -0.009271 0.004656 0.000229 
+-0.005526 0.004286 -0.002925 -0.003834 0.003469 -0.000717 
+-0.003055 0.003284 -0.000762 -0.003628 0.000877 -0.001969 
+-0.001567 -0.000135 -0.001612 -0.002656 0.000808 0.000323 
+0.003214 0.005716 -0.004858 0.001076 -0.001574 -0.004682 
+0.005191 0.001056 -0.001018 0.002798 -0.000248 -0.001977 
+-0.001775 -0.000787 -0.004631 0.000546 -0.006033 -0.002755 
+-0.007481 -0.005333 0.001037 -0.005062 0.000360 -0.000747 
+-0.004480 0.000139 -0.001262 0.000320 -0.000064 -0.000256 
+0.002788 0.003716 -0.005577 0.000018 0.000141 -0.005571 
+0.000405 0.004927 0.001080 -0.000693 -0.002615 -0.002796 
+0.001262 -0.003952 -0.006347 0.000129 0.006615 -0.001398 
+-0.004973 0.006524 -0.001075 -0.005544 0.007415 0.001479 
+0.000298 0.000368 0.000030 -0.000844 0.000884 -0.000156 
+0.000371 -0.003674 -0.003628 0.000689 -0.002588 -0.000518 
+0.004863 0.001985 -0.005189 0.001569 0.001573 0.000281 
+0.000397 0.001722 0.001728 -0.012714 -0.003543 -0.005490 
+0.004516 0.001680 -0.010416 0.008852 0.008419 -0.006607 
+0.013846 -0.002993 0.002607 0.012935 -0.013392 0.012422 
+0.010405 -0.017206 0.013731 0.005615 -0.020028 0.002337 
+-0.004388 -0.019497 -0.009135 -0.007337 -0.021737 -0.013647 
+-0.006818 -0.026779 -0.019618 -0.001940 -0.041389 -0.041345 
+-0.018714 0.026314 0.054060 -0.015215 0.033529 0.047716 
+0.008770 0.105278 0.001169 0.011567 -0.014122 -0.033439 
+0.091504 0.000689 -0.089265 -0.049539 -0.000935 -0.071040 
+-0.034706 -0.026044 -0.030462 -0.008725 -0.026961 -0.088039 
+0.003593 0.003065 0.005346 -0.002861 0.010410 -0.000592 
+-0.007604 0.025703 -0.015971 0.005748 0.012011 -0.000486 
+0.000626 -0.013200 0.001196 -0.011225 -0.008714 -0.010429 
+-0.063025 0.019140 0.042405 0.011462 -0.019170 0.033497 
+0.024308 0.016185 -0.001323 -0.047455 0.088364 -0.011455 
+0.009291 -0.003918 -0.010191 0.019469 -0.031279 0.081284 
+0.002390 -0.038715 0.009763 -0.018061 0.019161 -0.000332 
+-0.043546 0.046964 -0.023546 0.001378 0.004163 -0.032667 
+-0.005410 0.011530 0.001834 -0.021756 -0.034660 0.011986 
+-2.328671 -4.818182 -1.202797 -0.015615 -0.025119 -0.010793 
+-0.005181 0.012100 -0.000607 -0.005074 0.008044 0.001113 
+0.004307 0.010458 -0.009553 -0.001882 0.012197 -0.015784 
+-0.003506 -0.005179 0.000573 -0.006574 -0.007233 0.003981 
+-0.003802 -0.001085 -0.003984 -0.003798 0.005457 -0.002643 
+-0.004061 0.002417 -0.002489 -0.002269 -0.003058 -0.001425 
+-0.003276 0.001638 0.003858 -0.001699 0.004092 -0.000155 
+-0.002413 0.005149 -0.001190 -0.001598 0.002721 -0.000431 
+-0.001583 0.000880 0.000587 -0.002989 -0.000752 -0.000634 
+-0.005360 -0.000334 -0.004275 -0.007294 -0.002564 -0.003533 
+-0.004388 -0.004555 -0.007277 -0.004763 0.001577 -0.003122 
+-0.005465 0.002132 -0.003798 -0.003727 0.002592 0.002059 
+0.000912 0.001028 0.001228 0.002427 -0.000604 -0.003861 
+-0.001664 -0.001447 -0.001444 0.000510 -0.005453 -0.005860 
+0.009775 0.003361 -0.001504 -0.001087 0.006100 0.002790 
+-0.004625 0.010421 0.002709 -0.003057 0.008877 0.003637 
+-0.002303 0.004136 -0.001860 0.000610 -0.003351 -0.003755 
+0.001004 -0.004738 -0.006279 0.001864 0.000109 -0.004199 
+-0.005889 0.003906 -0.004890 0.001652 0.005948 0.000283 
+0.001524 0.006943 0.004868 -0.005854 0.007427 0.001484 
+-0.003828 0.003912 -0.012529 0.002211 0.009870 -0.011725 
+0.006673 -0.000059 -0.003604 0.015342 -0.013651 0.006452 
+0.014835 -0.018253 0.016262 -0.004095 -0.027744 -0.002555 
+-0.813636 -3.104545 -2.045455 -1.258427 -3.228464 -2.460674 
+-1.478448 -3.146552 -2.650862 -1.668919 -2.756757 -2.452703 
+-0.026615 -0.000095 0.038594 -0.004689 -0.000691 0.012999 
+0.026072 0.011155 -0.014095 0.038539 0.004643 -0.029067 
+0.017464 0.005609 -0.029850 -0.012014 -0.001026 -0.001121 
+-0.026576 -0.020995 0.008360 -0.055509 -0.004592 -0.001973 
+-0.034451 -0.006033 0.020383 -0.025871 -0.001823 0.006720 
+0.007697 0.006854 -0.007631 0.027665 0.015080 -0.013958 
+0.006250 -0.003523 -0.044623 -0.040558 0.006252 0.013615 
+-0.023540 -0.034783 0.105928 -0.015651 -0.014875 0.002327 
+0.004000 0.026500 0.021500 -0.044624 0.084135 0.032632 
+-0.002066 0.010083 0.039008 -0.016689 -0.003214 0.010799 
+0.007509 -0.019401 -0.010378 -0.016707 0.015079 0.015563 
+-0.000150 -0.016220 0.017571 0.002917 -0.002845 -0.013898 
+-0.013053 0.005586 0.018169 -0.020613 -0.028850 0.015174 
+-0.015244 -0.042331 -0.003507 -0.010855 -0.006205 -0.004333 
+-0.006457 0.015617 0.004015 0.000608 0.002036 -0.003602 
+0.006742 0.000197 -0.005103 -0.002269 0.008282 -0.008107 
+-0.000738 -0.001055 -0.006538 -0.002719 -0.003677 0.003641 
+-0.002791 -0.008218 0.001495 -0.005076 -0.003430 -0.003288 
+-0.002794 -0.000383 -0.002465 0.000726 0.000645 0.000806 
+0.002087 0.002087 0.003228 0.000422 0.004385 0.002532 
+-0.001065 0.002128 0.000353 0.001114 0.005080 -0.000510 
+0.000923 0.008360 -0.003642 0.001039 0.000594 -0.004930 
+-0.007652 0.003666 -0.001871 -0.007443 0.001099 -0.004148 
+-0.007260 -0.000457 -0.003503 -0.004916 0.007829 -0.003658 
+0.001272 0.010937 -0.001586 -0.000758 0.009134 -0.002098 
+-0.000526 0.004436 0.001278 -0.001213 -0.001059 0.001643 
+-0.001800 -0.002776 -0.003983 0.009435 0.002972 -0.005881 
+0.000035 0.004575 0.003677 -0.003123 0.009313 0.005954 
+-0.005607 0.009685 0.004192 -0.003663 0.009276 0.001560 
+-0.001281 0.003441 -0.000080 0.000525 0.000252 -0.001537 
+0.001115 0.004711 -0.000799 0.000003 0.005543 0.001839 
+-0.012881 0.003246 0.001680 -0.003149 -0.002062 -0.003605 
+-0.000991 -0.003021 0.000178 0.008880 0.004933 -0.006229 
+-0.002817 0.001779 -0.000324 -0.004410 0.005049 -0.007030 
+0.000335 0.004847 0.006857 0.007026 0.010395 -0.002342 
+0.018298 0.000418 0.014463 -0.004608 -0.026105 -0.008144 
+-0.881226 -4.038314 -2.498084 -1.205556 -4.516667 -2.883333 
+-1.411924 -4.457994 -2.775068 -1.520270 -4.033784 -2.135135 
+-1.373134 -3.338309 -1.462687 -0.016140 -0.012560 -0.005646 
+0.004793 0.001721 -0.005472 0.006362 0.000000 -0.013435 
+-0.007314 0.004601 -0.010922 -0.009423 -0.000400 -0.003801 
+-0.007389 -0.008705 0.007037 -0.003413 -0.009737 0.012112 
+-0.006780 -0.006109 0.008079 -0.005644 -0.004455 0.005474 
+0.000261 0.001000 -0.001686 0.008592 0.007058 -0.013311 
+-0.003720 0.006216 -0.014884 -0.013529 -0.016088 -0.001203 
+0.002888 -0.032020 0.020142 -0.017250 0.056002 -0.083026 
+-0.073645 0.082095 -0.031792 -0.023791 0.017143 0.008956 
+-0.096178 -0.003644 0.071111 -0.087087 -0.041249 0.003101 
+0.055541 -0.044478 -0.012507 -0.080912 -0.051146 0.030531 
+-0.020787 -0.046453 0.032004 0.010743 -0.006505 -0.014303 
+-0.005123 -0.004562 0.011192 -0.013848 -0.022152 0.011027 
+-0.010692 -0.027511 -0.003963 -0.007345 -0.002227 -0.004481 
+-0.005370 0.002280 0.000214 -0.000126 0.000777 -0.003716 
+0.000151 0.002245 -0.004621 -0.006015 0.000470 0.001128 
+-0.005684 0.002350 -0.001785 0.001048 -0.000191 0.000896 
+0.000455 -0.000449 0.000737 -0.001697 0.000288 -0.003106 
+-0.001724 0.000090 -0.001223 -0.000458 0.004030 0.001405 
+0.000588 -0.001025 0.002493 -0.001328 -0.001510 0.001256 
+0.001614 -0.001926 -0.002906 0.004497 0.001912 -0.000899 
+0.001599 0.005994 -0.004396 -0.001554 0.001800 0.001694 
+-0.002565 0.002756 0.000795 -0.004788 -0.000309 -0.001998 
+-0.007258 -0.001855 0.000000 -0.003094 0.001188 -0.004102 
+0.001102 0.003314 -0.005523 0.001111 0.006750 -0.002025 
+-0.001708 0.004300 0.004308 -0.002385 -0.000359 0.004746 
+0.010556 0.007937 0.000000 -0.002403 0.003476 0.000700 
+-0.002533 0.009913 0.005535 -0.002200 0.013894 0.004986 
+-0.001844 0.001697 0.003296 -0.003341 0.003334 -0.000754 
+0.000294 -0.000129 -0.000888 -0.000453 0.000830 0.000773 
+0.000371 0.004695 0.004260 -0.003369 0.007831 -0.000638 
+-0.004751 0.001982 0.000249 -0.003594 -0.004674 -0.001499 
+0.000911 0.000435 -0.004224 0.013361 0.003964 -0.003597 
+0.012111 0.000424 -0.000738 0.008024 -0.000712 -0.006472 
+-0.000465 0.000215 0.001479 -0.000954 0.017275 -0.000655 
+0.002531 0.011523 0.001480 -0.006165 -0.027438 -0.009366 
+-0.614815 -4.607408 -2.451852 -0.756345 -5.329949 -3.053299 
+-0.949772 -5.376712 -3.223744 -1.073980 -5.005102 -2.982143 
+-0.945578 -4.221088 -2.377551 -0.330049 -2.911330 -1.467980 
+-0.004444 -0.005206 -0.004638 0.005466 0.000901 -0.000283 
+-0.002591 0.000950 -0.005105 -0.002704 -0.000361 -0.001532 
+-0.002353 -0.001960 0.003569 -0.001617 -0.001029 0.001769 
+-0.003058 0.001261 -0.000372 -0.002881 0.000288 0.000306 
+-0.001205 -0.000105 0.000698 0.000921 0.000441 -0.000451 
+0.002740 0.004866 -0.002933 0.001639 0.002092 -0.000155 
+0.030306 0.029915 -0.013122 0.019746 0.013079 -0.003206 
+0.006641 0.009935 -0.000812 -0.043471 0.030276 -0.021671 
+-0.006667 0.001548 0.048452 -0.011202 -0.022810 0.028291 
+0.028787 -0.012666 0.007913 -0.056921 -0.065130 0.005558 
+-0.014818 -0.045050 0.007359 0.007288 -0.002430 -0.005278 
+-0.001745 -0.013659 0.005359 -0.007069 -0.023802 0.001067 
+-0.005092 -0.017046 -0.006305 -0.002298 0.001968 -0.001199 
+-0.002043 0.001529 0.001182 -0.009561 -0.001682 -0.001460 
+-0.007030 0.008368 -0.011692 -0.006570 0.012915 -0.007732 
+-0.005972 0.005833 -0.002275 0.000574 -0.002368 0.000600 
+-0.000555 -0.000555 -0.001665 -0.002015 0.005117 -0.008154 
+-0.003121 0.003062 -0.006538 -0.000459 0.001046 -0.001899 
+-0.002766 -0.003307 0.000290 -0.001230 -0.003355 0.000007 
+-0.002744 -0.002744 -0.000526 -0.007191 -0.003458 0.003192 
+-0.004205 -0.000652 0.008311 -0.001916 0.000644 0.000041 
+0.001679 0.004351 0.000000 0.000530 0.002381 -0.002494 
+-0.004095 -0.001598 -0.001218 -0.005040 -0.003472 -0.001344 
+-0.002149 0.000732 -0.000358 -0.000472 0.004144 0.000779 
+0.000001 0.002837 0.000852 -0.001099 -0.000095 0.001340 
+0.000790 -0.000458 -0.000007 -0.001624 0.007837 0.000861 
+-0.003051 0.009577 -0.001373 -0.005942 0.001965 -0.000193 
+-0.003208 0.001064 -0.000142 -0.000272 -0.000949 -0.003886 
+-0.000913 0.001134 -0.000205 -0.002224 0.000405 0.000564 
+-0.004141 0.001293 0.003213 -0.004476 0.001344 -0.002167 
+0.000616 0.003145 -0.001166 0.003824 0.004488 -0.001454 
+0.007826 0.008375 -0.007551 0.012304 0.005192 -0.006254 
+0.007802 0.001787 -0.002593 0.002672 -0.001403 -0.005763 
+0.000260 0.003868 0.000786 -0.006586 0.028813 0.006803 
+-0.015514 0.025541 -0.005218 -0.007809 -0.027017 -0.019357 
+-0.212121 -5.285714 -2.246753 -0.033898 -6.112994 -2.751412 
+-0.113426 -6.180555 -2.974537 -0.263889 -5.907407 -2.877315 
+-0.347578 -5.330484 -2.498575 -0.113445 -4.109244 -1.848740 
+-0.002303 -0.020250 -0.009879 0.000775 0.001394 -0.000760 
+0.002809 0.008844 -0.003459 -0.001196 -0.001783 -0.003293 
+-0.001993 -0.004680 -0.000529 -0.001546 0.003371 0.001761 
+0.000977 0.000097 0.000875 0.001081 0.001328 -0.001501 
+-0.001778 -0.000517 -0.000780 -0.002903 0.001954 0.000723 
+0.002003 0.001950 -0.000805 0.004715 0.004482 -0.000042 
+0.004164 0.001958 0.001127 -0.003188 -0.002130 -0.000093 
+-0.002253 -0.003420 0.001743 0.002388 -0.009775 0.011579 
+0.010506 -0.002811 -0.008606 0.009748 0.007560 -0.008842 
+-0.002086 0.023017 -0.020524 -0.034254 0.172489 -0.103481 
+-0.005200 0.010057 0.006046 -0.008490 -0.003128 0.007002 
+-0.009416 -0.013349 0.006728 -0.009182 -0.019476 -0.003869 
+0.000262 -0.008296 -0.003437 0.007310 0.006719 0.009272 
+-0.002951 0.000367 0.003566 -0.009945 -0.006505 -0.008162 
+-0.009098 -0.003522 -0.013243 -0.004823 0.001807 -0.004281 
+0.004193 0.003409 0.001080 0.007351 0.005970 0.004596 
+0.003388 0.009437 -0.000737 0.002201 0.006131 -0.003591 
+0.000098 0.000333 -0.001132 -0.001227 -0.000302 -0.000399 
+-0.000700 -0.000971 -0.000054 -0.000979 -0.002020 -0.002367 
+-0.005030 0.001994 -0.002591 -0.006572 0.000563 -0.000831 
+-0.005433 -0.000353 -0.000265 -0.003015 -0.000667 0.000514 
+0.001179 0.000256 -0.000872 0.004135 0.001572 -0.004631 
+-0.002547 0.004194 -0.001881 -0.003938 0.001948 -0.001705 
+-0.006154 -0.000571 -0.000366 -0.004431 0.001024 -0.000334 
+-0.001764 -0.001510 -0.002668 -0.000700 -0.000884 -0.002108 
+-0.006317 0.001953 -0.000970 -0.005319 0.005111 -0.004559 
+-0.003205 0.001628 0.001348 -0.004642 -0.000033 -0.003027 
+-0.002661 -0.002793 -0.003399 -0.004565 -0.001994 0.000294 
+-0.001396 0.000711 -0.002139 -0.003916 0.005074 -0.001631 
+-0.001442 0.002639 0.002941 -0.000807 0.003761 -0.003071 
+-0.000496 0.003401 0.001460 0.001275 0.003911 0.002035 
+0.002550 0.004809 0.002222 0.002926 0.007347 -0.002375 
+0.004515 0.005313 -0.007202 0.001925 0.001422 -0.007802 
+0.001521 0.007421 0.000391 -0.006098 0.010819 0.015147 
+-0.018234 0.017967 -0.009395 -0.001392 -0.020244 -0.019395 
+0.487562 -5.144279 -0.985075 1.343333 -6.306667 -1.226667 
+1.339378 -6.689119 -1.619171 1.101177 -6.477647 -1.955294 
+0.832021 -5.850394 -2.120735 0.711679 -4.700730 -1.978102 
+0.001226 -0.025582 -0.015163 0.000866 -0.002220 -0.001339 
+0.008029 0.005667 0.002906 0.000615 -0.002002 -0.002418 
+0.002202 -0.000537 -0.001586 0.000808 0.004313 -0.000674 
+0.000399 0.000160 0.002275 0.003234 -0.003548 -0.002772 
+-0.002199 -0.001734 -0.004806 -0.004094 0.003869 -0.001679 
+-0.000545 0.005056 0.000492 0.002382 0.002949 0.001435 
+0.000962 0.001361 -0.000920 -0.001631 0.000485 -0.001368 
+0.002370 0.001686 -0.001099 -0.000262 0.007234 -0.011477 
+0.003091 0.002854 -0.014775 0.007398 0.008680 -0.007718 
+0.013387 -0.004204 0.012220 -0.017826 -0.019275 0.007607 
+-0.013444 0.099175 -0.032359 -0.000981 0.023033 -0.011437 
+-0.005698 -0.012568 0.005681 -0.012438 -0.018558 -0.001774 
+-0.004370 0.009690 0.000851 0.015383 0.019530 0.007886 
+0.001414 0.003581 -0.008173 -0.005823 0.004088 -0.012786 
+-0.008533 0.000461 -0.010137 0.002432 -0.003837 -0.002076 
+0.006703 -0.000156 -0.002694 -0.001582 -0.005019 -0.007481 
+-0.004823 0.000984 -0.007942 -0.001421 0.001902 -0.002170 
+0.000470 -0.002144 0.002812 0.001306 0.001113 0.002511 
+0.002730 0.004270 0.000238 0.003888 0.001344 -0.001254 
+-0.001103 -0.000009 -0.000236 -0.001340 0.000181 -0.001248 
+-0.001942 0.000900 -0.000876 -0.003273 0.000821 -0.001523 
+-0.005000 0.000159 -0.000397 -0.002995 -0.001849 -0.001146 
+-0.000244 0.000824 0.000726 0.000291 0.005634 0.001563 
+-0.001349 0.004219 0.001686 -0.000141 0.000776 -0.000662 
+0.000446 0.001007 -0.000892 0.000084 0.007019 -0.002635 
+-0.006757 0.000524 -0.001841 -0.000526 0.002019 -0.005595 
+0.003962 0.001063 -0.000194 -0.000721 0.000879 -0.000270 
+-0.002182 -0.001154 -0.002964 -0.002479 -0.000960 -0.000576 
+-0.002240 0.007734 -0.004059 0.001814 0.010081 -0.007352 
+-0.001128 -0.000581 -0.006032 -0.003806 0.001706 -0.003294 
+-0.003856 0.001894 -0.000868 -0.003889 -0.000431 0.002587 
+-0.002212 0.000489 0.000623 -0.001486 0.005223 -0.003412 
+-0.002105 0.006030 -0.007593 -0.002071 0.005922 -0.007356 
+-0.001829 0.015000 -0.002162 0.002069 0.026818 -0.000993 
+0.002129 0.015038 -0.011254 0.004207 -0.019238 -0.001638 
+0.567961 -4.626214 1.014563 2.312715 -5.553265 0.958763 
+2.670330 -6.104395 0.241758 2.453865 -6.177057 -0.588529 
+1.957333 -5.661334 -1.122667 1.303448 -4.658621 -1.231035 
+0.563158 -3.168421 -0.600000 -0.000515 -0.010337 0.004544 
+0.006325 0.001393 0.003300 0.007994 0.000578 -0.004016 
+0.003891 0.001871 -0.005671 0.001577 0.003716 -0.002478 
+0.003143 0.000561 -0.001459 0.001436 0.000007 -0.002725 
+-0.003937 0.001310 -0.002902 -0.002770 0.004524 -0.001885 
+-0.001150 0.003285 -0.001138 -0.001208 0.004002 0.002914 
+0.000194 0.000129 0.000611 -0.001227 0.000905 -0.002393 
+0.000729 0.002875 -0.003395 0.001448 0.005444 -0.011301 
+0.001133 0.000761 -0.007628 0.003680 0.000766 0.001534 
+-0.004509 -0.006846 0.001418 -0.019020 0.008062 -0.060212 
+0.004077 0.032649 -0.044680 0.003039 -0.008748 0.007692 
+0.001622 -0.016352 0.010613 -0.000320 -0.014608 0.004664 
+-0.006491 0.010595 -0.007484 0.006267 0.033159 -0.023349 
+0.000664 0.009855 -0.015823 -0.001549 0.002633 -0.007496 
+0.001696 -0.001548 -0.004665 0.003901 -0.000924 -0.005362 
+0.007715 -0.005002 -0.007908 0.005857 -0.001017 -0.009025 
+0.000209 -0.000100 -0.010288 0.000100 -0.001637 -0.002093 
+-0.000081 -0.000536 -0.000276 0.002371 -0.004943 0.003537 
+0.000859 -0.001984 0.005582 -0.000956 0.003611 0.002774 
+-0.002088 0.001602 0.001047 -0.001275 0.001927 -0.002693 
+-0.001384 0.001413 -0.001324 -0.001150 -0.000281 -0.000510 
+-0.000805 0.000270 0.002635 -0.000272 0.000611 0.002468 
+0.000251 0.002447 -0.001213 0.001837 0.003526 -0.006134 
+-0.003476 0.004961 -0.002781 -0.000241 0.003667 -0.009287 
+-0.002275 0.001940 -0.007813 -0.003057 0.004805 -0.006178 
+0.000775 0.005199 -0.000909 -0.000059 0.007171 -0.003787 
+0.001470 0.002902 -0.004959 0.001677 -0.002219 -0.003139 
+-0.001275 0.001053 -0.003326 0.001680 -0.000486 -0.000555 
+-0.006536 0.008998 -0.002328 0.012436 0.006128 -0.006368 
+-0.002645 0.001942 0.000179 -0.002041 0.001369 -0.002540 
+-0.006276 -0.005473 0.005975 -0.007459 -0.006017 0.000430 
+-0.002077 0.000894 0.000208 0.000527 0.005946 -0.006346 
+-0.000544 0.006096 -0.004819 -0.000832 0.006572 -0.002424 
+-0.004023 0.016176 0.001425 0.003024 0.017779 0.006856 
+0.005803 0.001511 -0.008754 -0.000349 -0.027931 0.007618 
+1.030837 -4.220264 2.193833 2.431818 -4.571429 2.301948 
+2.997191 -4.797753 1.612360 3.021858 -5.027322 0.625683 
+2.547904 -4.910180 -0.131737 1.517110 -4.155893 -0.418251 
+0.007628 -0.024650 0.003718 -0.000527 -0.005918 0.007861 
+0.003942 0.007192 0.004368 0.009375 0.008134 -0.005574 
+0.006189 0.008387 -0.003934 -0.002103 0.005971 -0.002354 
+-0.003416 0.002693 -0.001545 -0.005702 0.002548 -0.000244 
+-0.003993 0.004186 -0.001423 0.001884 0.004453 -0.003441 
+0.005410 0.004073 -0.000912 0.000496 0.003147 -0.001796 
+0.000216 0.005545 0.000158 -0.001268 0.002648 0.001759 
+-0.001286 0.002912 0.003607 -0.003063 0.000553 0.003004 
+-0.000623 0.001373 0.000138 -0.002276 0.001212 0.003063 
+0.005985 -0.007945 -0.011530 -0.582609 2.373913 -1.643478 
+0.466667 -1.055556 4.233333 -0.169960 -1.936759 4.782609 
+-0.604167 -1.516667 3.458333 0.001274 -0.011999 0.011837 
+-0.008066 -0.001250 -0.007929 -0.004421 0.006310 -0.011319 
+-0.003293 0.005106 0.000415 -0.000526 -0.000611 0.001440 
+0.001297 -0.006055 0.001579 -0.001562 0.000375 0.000161 
+0.000347 -0.001998 0.003570 -0.000039 -0.000379 0.000679 
+0.000298 -0.000052 -0.001711 0.002193 0.000662 0.000404 
+0.000722 0.000865 0.000657 -0.000365 0.000375 0.000450 
+0.000510 -0.000551 0.000447 -0.000637 0.002775 -0.000720 
+-0.000328 0.004706 -0.000903 0.000967 0.001854 -0.000752 
+0.000920 -0.000690 -0.002645 0.003000 -0.000878 -0.001000 
+0.003038 0.000863 -0.004562 0.000553 0.002316 -0.007712 
+-0.003372 0.002258 -0.008451 -0.001617 0.000316 -0.008640 
+0.003708 0.002119 -0.007284 -0.001276 0.000790 -0.007287 
+0.000196 -0.001278 -0.004669 -0.002619 -0.001385 -0.002603 
+0.003658 0.006187 0.003035 0.002196 0.001010 -0.000547 
+-0.004461 0.000348 -0.007214 -0.003485 -0.001992 -0.005984 
+-0.001824 0.002462 -0.002759 0.000152 0.002400 0.001093 
+0.000243 0.000132 0.000326 0.001683 -0.000936 -0.002059 
+0.002159 0.002159 -0.002045 0.000057 -0.000393 -0.000545 
+-0.002114 -0.003731 0.000870 -0.002908 0.000301 -0.004061 
+-0.001662 0.000017 -0.000770 0.006735 0.004926 0.000062 
+0.004375 0.008788 -0.003590 -0.000501 0.007778 -0.004302 
+-0.004613 0.013860 -0.000291 0.001331 0.019185 0.004113 
+-0.004754 -0.004339 0.006417 0.000564 -0.027932 0.023420 
+2.088889 -3.493333 3.000000 2.950166 -3.495017 2.734219 
+3.386905 -3.467262 2.005952 3.469325 -3.671779 1.131902 
+3.075812 -3.855596 0.393502 1.985000 -3.480000 -0.020000 
+0.007860 -0.011078 0.005743 -0.001663 0.003006 0.003095 
+-0.000522 0.001479 -0.001755 0.002567 -0.000607 -0.001538 
+0.000437 -0.000571 -0.000345 -0.001099 0.001585 0.000381 
+-0.002265 0.002360 0.000575 -0.003057 0.003668 0.002083 
+-0.003741 0.003529 -0.001624 0.000864 0.002754 -0.004475 
+0.003686 0.003738 -0.002733 0.004266 0.004545 -0.002977 
+0.003758 0.004903 0.002354 0.002860 0.004286 0.003017 
+0.000751 0.004946 0.001180 -0.001700 0.001778 -0.000704 
+-0.001212 -0.001789 -0.002328 0.005887 0.000692 -0.006423 
+-0.002082 -0.002585 0.021447 0.091667 -1.829167 5.250000 
+-0.334416 -1.967533 5.717533 -0.660131 -1.741830 5.199347 
+-0.825726 -1.502075 4.004149 -0.007141 -0.009908 0.017097 
+-0.004735 -0.005116 -0.004310 0.001339 0.003013 -0.002832 
+-0.001032 0.003068 -0.001583 0.010096 -0.002487 -0.004549 
+0.007056 -0.009820 -0.009164 0.002825 -0.002201 -0.000431 
+-0.002675 0.001106 0.003602 -0.001574 0.002495 0.003633 
+-0.000170 -0.000436 -0.000114 -0.000947 -0.002330 0.000204 
+-0.000476 0.000227 0.000059 0.000913 -0.000134 -0.000709 
+-0.002944 0.000327 -0.002558 -0.001565 0.001565 0.000534 
+-0.004662 -0.003308 0.002030 -0.001949 -0.001484 0.000929 
+0.000612 0.000921 -0.001082 0.000315 0.001140 -0.002207 
+-0.000915 0.001140 -0.004274 -0.003477 -0.000821 -0.005530 
+0.000501 0.000188 -0.008857 0.002000 0.000029 -0.004335 
+0.000551 0.000466 -0.003295 -0.000659 0.001687 -0.003913 
+0.001077 0.005900 -0.001606 0.003111 0.001709 -0.004162 
+0.004978 0.005705 0.002795 0.007953 0.007068 -0.002672 
+0.008708 0.002946 -0.004268 0.004615 0.004744 0.001207 
+0.002194 0.006377 -0.000411 0.001079 0.003012 0.000200 
+0.000059 -0.001058 -0.000440 0.001695 -0.001216 -0.000515 
+0.001154 0.001616 0.000002 0.000709 0.004607 -0.001923 
+0.000997 0.007705 -0.004714 0.001380 0.008674 -0.006861 
+-0.001641 0.005513 -0.007744 0.004485 0.002242 -0.005530 
+0.004009 0.007363 -0.006980 -0.000027 0.011794 -0.012089 
+-0.005985 0.020546 -0.005793 0.016970 0.026273 -0.006979 
+-0.001831 -0.001112 0.004449 0.006534 -0.021122 0.028944 
+2.597458 -2.605932 3.156780 3.280528 -2.854785 2.825083 
+3.728395 -3.157408 2.398148 3.884615 -3.681818 2.020979 
+3.628019 -4.236715 1.594203 2.281250 -4.000000 0.851562 
+0.006148 -0.005188 -0.007697 0.003899 0.001103 -0.005274 
+0.001939 0.002316 -0.004970 0.002508 -0.003063 -0.001389 
+0.003637 -0.000617 -0.000984 0.004353 -0.000858 -0.000699 
+0.002144 -0.001404 0.001194 0.000129 -0.000621 -0.000724 
+-0.000860 -0.001268 -0.001098 -0.000518 -0.003517 -0.002191 
+-0.005484 -0.001717 -0.002611 -0.004614 -0.000971 -0.002866 
+-0.001616 0.000677 -0.001070 0.000284 0.001386 0.000161 
+-0.001199 0.001208 0.000127 -0.004352 -0.004441 -0.008339 
+0.000006 -0.011457 -0.007970 0.000962 -0.000625 -0.004948 
+-0.433962 -1.250000 4.174528 -0.656250 -1.546875 5.593750 
+-0.705714 -1.597143 5.522857 -0.817276 -1.581395 4.647840 
+-0.919643 -1.361607 3.129464 -0.004259 -0.009127 0.011579 
+-0.000035 -0.000355 0.001111 -0.000708 0.002220 0.001919 
+-0.000399 0.001567 0.004145 0.009116 -0.002103 0.002789 
+0.004366 -0.003548 -0.002133 0.001243 0.000295 -0.002708 
+-0.000467 0.002334 -0.003034 0.002415 0.000966 0.001115 
+0.003073 -0.000781 -0.001751 0.004123 -0.002680 0.001582 
+-0.000676 -0.002509 -0.003174 0.002432 0.000705 -0.003701 
+-0.003548 -0.000356 -0.003195 -0.000580 -0.001459 -0.001534 
+0.000943 -0.002064 0.001681 0.000291 -0.000925 0.001958 
+-0.004433 0.000562 0.002357 -0.004135 0.000235 0.005014 
+-0.001697 -0.001410 0.004374 0.000848 0.000072 0.000743 
+0.000811 0.004011 -0.002254 0.000436 0.005933 -0.002342 
+0.001035 0.004110 -0.003878 0.001780 0.003512 -0.005051 
+0.004356 0.002222 -0.005601 0.003690 0.000436 -0.002908 
+0.000277 0.005479 -0.003171 -0.000886 0.006819 0.004003 
+0.000386 0.006967 0.001548 0.001645 0.003748 -0.001063 
+0.003199 0.002418 -0.000969 -0.000100 0.003262 0.000358 
+-0.001664 0.004499 -0.001567 0.002937 0.002243 -0.001040 
+-0.001416 0.001117 -0.000762 -0.000408 0.000693 -0.000333 
+-0.000147 0.000573 -0.001423 0.002056 0.005446 -0.003805 
+0.001475 0.008853 -0.004815 0.005575 0.005782 0.000165 
+0.003005 0.007995 -0.003845 0.000739 0.009540 -0.007555 
+-0.000718 0.015612 -0.011336 0.000399 0.010663 -0.011837 
+0.002295 -0.005840 0.012291 2.389831 -1.615819 2.576271 
+2.879845 -2.356589 3.023256 3.400000 -2.741935 3.254839 
+3.864516 -3.106452 3.480645 4.059289 -3.628458 3.616601 
+3.467066 -4.071856 3.239521 0.017633 -0.029055 0.010202 
+0.008012 -0.005406 -0.001435 0.008194 0.009759 -0.012208 
+0.004583 0.005856 -0.003223 -0.000650 -0.000477 0.000273 
+-0.001256 -0.002999 -0.002077 0.001569 -0.000287 -0.000608 
+0.000811 0.002868 0.000927 -0.001172 -0.000160 -0.000746 
+-0.005472 -0.001459 0.000391 -0.005452 0.000121 0.001350 
+-0.002385 0.001396 -0.001658 -0.001499 0.000606 -0.002252 
+0.000197 -0.000498 -0.000821 0.000169 -0.000108 0.001048 
+-0.000229 0.000790 0.001966 -0.002700 -0.003697 -0.008004 
+0.003615 -0.010425 -0.012691 -0.000306 -0.000716 0.000473 
+-0.461957 -0.793478 4.559783 -0.487013 -1.116883 5.717533 
+-0.494792 -1.281250 5.164062 -0.532432 -1.343243 3.767568 
+-0.506757 -1.158784 1.993243 -0.001519 -0.007109 0.004383 
+-0.000335 0.001958 -0.002509 -0.001204 0.004920 -0.000125 
+0.000647 -0.000492 0.002272 0.003260 -0.000777 0.002060 
+0.003970 -0.001041 0.001471 0.001473 -0.000848 -0.001254 
+0.000806 0.000835 -0.002776 -0.000815 0.000852 -0.002481 
+0.000987 -0.000045 -0.002728 -0.000310 0.000695 -0.000472 
+0.000787 0.002720 0.001268 0.001851 0.002810 -0.000504 
+0.000869 0.002372 -0.005160 -0.001127 0.003064 -0.003627 
+0.000429 0.001040 -0.001876 -0.003405 -0.002822 0.003265 
+0.000707 0.000695 0.001126 -0.001400 0.003255 0.003691 
+-0.004231 0.002625 -0.001900 -0.000867 -0.001633 -0.003830 
+-0.001122 -0.000816 -0.004545 -0.002627 -0.001433 -0.002574 
+-0.003495 0.001249 0.003163 -0.002516 -0.000815 0.000301 
+0.001009 0.001234 0.002133 0.002394 0.001401 0.000688 
+0.000256 0.002168 0.000467 -0.001142 0.001343 0.000454 
+-0.000874 0.000118 0.001763 -0.002339 -0.000265 0.001681 
+-0.004303 -0.001031 -0.001640 -0.002496 -0.000373 -0.001681 
+0.001024 0.001791 -0.000256 0.001291 0.001414 -0.003411 
+-0.001704 0.003815 -0.002883 -0.003011 0.004167 -0.001156 
+-0.000701 0.000006 0.000190 0.003408 0.001105 0.001213 
+0.003725 0.004236 -0.000417 0.003247 0.003416 -0.003558 
+-0.002123 0.007522 -0.002273 -0.002311 0.007399 -0.005501 
+-0.005233 0.006436 -0.008948 -0.004767 0.006574 -0.003195 
+0.005618 -0.001489 0.009820 1.946602 -1.116505 2.097087 
+2.720000 -1.789091 2.887273 3.117834 -2.203822 3.490446 
+3.253289 -2.453947 3.911184 3.049587 -2.574380 3.987603 
+2.045161 -2.180645 3.174194 0.003037 -0.004528 0.006022 
+0.016374 -0.001868 -0.008571 0.003608 0.013333 -0.012884 
+0.002201 0.001829 -0.001586 -0.004104 -0.006221 -0.001593 
+-0.002577 -0.006368 -0.000038 -0.002212 -0.000777 0.002579 
+-0.005769 0.000946 0.005905 -0.008063 0.000119 0.004655 
+-0.007019 -0.000569 0.000968 -0.004698 -0.000083 -0.001704 
+-0.000846 -0.000528 -0.002536 0.002925 -0.002254 -0.003955 
+-0.000662 0.001765 -0.004856 -0.001050 0.001105 -0.003022 
+-0.002802 0.002530 -0.002828 0.000634 -0.004860 -0.012932 
+0.013750 0.004057 -0.020707 0.000410 0.005838 0.002447 
+0.118343 -0.136095 3.828402 -0.018587 -0.728625 5.345725 
+0.011236 -1.073034 5.028090 0.110526 -1.194737 3.692105 
+0.229102 -1.145511 1.981424 0.002626 -0.008813 0.002578 
+-0.000342 -0.002793 -0.010032 -0.003259 0.000070 -0.004172 
+0.000070 -0.000909 -0.000266 0.000652 -0.001869 -0.001436 
+0.000930 -0.000731 -0.003625 0.001431 -0.001128 -0.001339 
+0.002045 0.000858 0.001554 0.000457 -0.000108 -0.000157 
+-0.001019 0.001979 -0.002387 0.001633 0.003223 -0.002857 
+0.002083 0.001308 0.000872 0.003094 0.002715 0.000505 
+-0.000567 0.002038 -0.001503 -0.003388 -0.000598 -0.005497 
+-0.002942 -0.000793 -0.005376 -0.006323 -0.004627 0.000923 
+-0.000530 -0.003054 0.000024 -0.002112 0.001706 -0.003006 
+-0.005393 0.005327 -0.000005 -0.002567 0.004435 0.002490 
+-0.000407 0.001924 0.002060 0.002680 0.000456 -0.002852 
+0.001800 0.002909 -0.004959 -0.001185 0.001485 -0.002079 
+-0.004150 0.001927 0.000037 -0.003425 0.002614 0.002812 
+-0.001139 0.001051 -0.003971 -0.001384 0.002721 0.000731 
+-0.000570 0.003159 0.001799 -0.001393 0.002969 0.000587 
+0.000885 0.004444 0.000610 0.001724 0.003813 -0.001223 
+0.001231 0.001993 -0.001290 0.001853 0.002362 -0.001108 
+0.003111 0.005726 -0.001221 0.002128 0.007412 -0.003198 
+0.000069 0.002093 -0.004392 -0.000686 0.000017 -0.001889 
+-0.002360 -0.003480 0.000102 -0.003279 -0.001234 0.000452 
+-0.002603 0.001394 -0.003076 -0.005745 0.003048 -0.006480 
+-0.009402 0.002453 -0.004613 -0.001930 0.006098 -0.003696 
+0.005408 0.000793 0.006833 0.014327 -0.006788 0.016556 
+1.890459 -1.293286 2.639576 2.154098 -1.727869 3.373770 
+2.117216 -1.893773 3.743590 1.762626 -1.722222 3.474747 
+0.003744 -0.011040 0.017986 -0.001476 0.000774 -0.008464 
+0.008670 -0.002751 -0.009795 0.002282 -0.001672 -0.003282 
+0.001551 -0.001277 -0.001861 0.006514 -0.001481 -0.003932 
+0.006718 0.003084 -0.007081 0.001764 0.001740 -0.003050 
+-0.001993 0.000639 -0.000350 -0.003452 -0.000366 -0.001147 
+-0.003921 -0.001207 -0.001203 -0.002367 0.001333 -0.002041 
+-0.001467 -0.001876 0.000488 0.000054 -0.001965 -0.002392 
+0.000447 -0.002803 -0.004505 -0.001093 -0.000170 -0.004265 
+-0.001439 0.005784 -0.006055 0.008754 0.005645 -0.014351 
+-0.000593 0.001470 -0.016631 -0.000165 -0.002555 0.005621 
+0.003410 -0.002511 0.026842 0.400000 -0.308333 3.770833 
+0.691228 -0.557895 3.849123 0.810219 -0.784672 3.007299 
+0.007019 -0.008416 0.014826 0.005128 -0.003339 -0.003492 
+0.000940 0.001206 -0.015481 0.001784 0.004673 0.000718 
+0.000953 0.005747 0.000216 0.001385 0.002680 0.001254 
+-0.000150 -0.001044 -0.000302 0.001030 -0.001195 -0.001012 
+0.000251 -0.000976 -0.000442 -0.000067 0.000137 0.000248 
+-0.002263 -0.000365 -0.001788 -0.004062 0.001152 0.002486 
+-0.001229 0.000796 -0.001014 -0.000646 -0.001463 -0.003356 
+-0.003151 -0.000823 -0.003857 -0.003283 -0.002249 -0.004291 
+-0.005479 -0.005055 -0.001302 -0.003283 -0.000347 0.001061 
+-0.000335 0.000642 -0.000509 0.000992 0.003830 -0.000712 
+-0.000053 0.002765 -0.002870 -0.002366 0.000561 -0.005417 
+-0.004304 -0.000705 -0.005084 -0.001284 -0.001095 -0.000341 
+0.000490 0.002266 0.003552 0.002791 0.004186 -0.000930 
+-0.002615 0.006243 -0.004893 -0.004103 -0.000487 -0.002106 
+-0.000078 -0.000155 -0.000233 0.000131 -0.001751 -0.002155 
+-0.006796 -0.001803 -0.001557 -0.005378 -0.001539 0.000488 
+0.000590 0.003420 -0.000979 0.000856 0.004854 -0.002488 
+-0.002597 0.003009 -0.002370 -0.002928 0.002447 -0.002501 
+-0.002110 0.004773 -0.001554 0.001005 0.006214 -0.000405 
+0.002010 0.002174 -0.001314 -0.000454 -0.000915 -0.002132 
+-0.000769 -0.001512 -0.002439 0.001581 0.000224 -0.004303 
+-0.002178 0.000450 -0.002319 -0.002952 0.002447 -0.004069 
+-0.004187 0.005606 -0.003241 -0.000443 0.005046 -0.003370 
+0.001358 0.002381 0.000681 0.004928 -0.003851 0.007651 
+0.009771 -0.011344 0.013713 1.092664 -1.270270 2.490347 
+1.250000 -1.326923 2.889423 0.006200 -0.014092 0.018923 
+0.002362 -0.003657 -0.001314 -0.006616 0.000429 -0.013667 
+-0.007413 -0.003961 -0.015719 0.007021 -0.002638 -0.009549 
+0.003959 0.000574 -0.003141 0.003881 0.000800 -0.004253 
+0.001474 0.000525 -0.001294 0.000370 0.001919 0.000755 
+0.000643 0.003226 0.001621 -0.001610 0.003764 0.001364 
+-0.004096 0.003303 0.000559 -0.004154 0.002039 0.000659 
+-0.001960 0.001098 0.000436 0.000326 -0.000421 -0.000209 
+0.000440 -0.002271 -0.002116 -0.000392 -0.002099 -0.003709 
+0.000384 -0.000494 -0.001410 0.011821 0.005575 -0.004834 
+0.000943 -0.002122 -0.004075 0.001455 0.009021 -0.001358 
+0.002950 -0.001736 0.012050 0.005842 -0.002136 0.015754 
+0.010774 -0.002906 0.011234 0.009903 -0.005471 0.003849 
+0.005168 -0.003353 -0.006547 -0.005307 0.001571 -0.014847 
+-0.003147 -0.004277 -0.004007 -0.002405 0.005360 0.001623 
+-0.001208 0.001178 0.002486 0.000252 -0.000928 0.003607 
+-0.000195 -0.003545 0.002985 -0.000425 -0.001747 0.001110 
+0.001995 0.000749 -0.002494 0.000688 -0.001840 -0.003984 
+-0.004619 0.002352 -0.002457 -0.007293 0.000775 0.000967 
+-0.006258 -0.001387 -0.000817 -0.003150 -0.001449 -0.000724 
+-0.003164 0.000712 -0.003221 -0.005152 -0.000633 -0.001084 
+-0.006751 -0.001247 0.003913 -0.007493 -0.001682 0.005536 
+-0.005010 -0.001152 0.001554 0.001169 -0.001709 -0.000826 
+-0.001175 -0.001001 -0.001325 -0.002687 -0.001754 -0.005166 
+-0.002874 -0.002245 -0.002036 -0.006986 -0.002059 0.004449 
+-0.008337 0.001185 0.004221 -0.002811 0.004911 0.002224 
+0.005527 0.007200 -0.003727 0.007733 0.001056 -0.001874 
+-0.000510 0.002699 0.000280 -0.002614 0.003417 -0.001823 
+-0.001212 -0.000647 -0.001168 -0.000616 0.001359 0.001924 
+-0.000442 0.002336 0.000924 0.001426 0.001186 -0.000264 
+0.002352 0.001717 -0.000176 0.001573 0.005525 -0.001208 
+0.000525 0.006609 -0.004032 -0.000688 0.002849 -0.003242 
+-0.001404 0.000984 0.002995 -0.001872 -0.001021 0.006387 
+-0.001112 0.000523 0.005298 -0.000847 -0.000424 0.000424 
+-0.001597 -0.000117 -0.000765 -0.002703 0.003545 -0.002879 
+-0.001613 0.003784 -0.004041 -0.003285 0.000044 -0.003303 
+-0.003301 -0.001266 -0.003227 -0.001460 -0.001209 -0.000065 
+-0.000154 -0.004126 0.004813 -0.001739 -0.007252 0.009799 
+-0.002564 -0.006415 0.013829 -0.000533 -0.000976 0.008993 
+-0.004939 0.001896 -0.004841 -0.008361 0.009850 -0.010766 
+0.010296 0.006560 -0.012738 0.016248 -0.001382 -0.011792 
+-0.004131 0.005053 -0.016214 0.003403 -0.000215 -0.004638 
+-0.001800 -0.003516 -0.002461 -0.001299 -0.001146 -0.000936 
+0.000817 0.000091 0.000028 0.000864 0.001098 0.001512 
+0.000765 0.003536 0.003844 0.002050 0.004943 0.004788 
+0.002444 0.002596 0.002738 0.000935 -0.000161 0.000248 
+-0.003606 -0.002636 -0.004449 -0.007161 -0.008875 -0.011522 
+0.001216 -0.003615 -0.010780 0.008594 0.009166 -0.012352 
+0.004479 0.016798 -0.015595 0.008666 0.012968 -0.017768 
+0.006741 0.002136 -0.013718 0.004186 0.001604 -0.007754 
+0.002522 0.001205 -0.005150 -0.001051 0.001528 -0.004954 
+-0.007863 0.004867 -0.001982 -0.017206 0.000489 0.003833 
+-0.005203 -0.001738 0.009872 -0.001387 -0.002440 0.001786 
+0.003022 -0.000341 -0.004763 0.004480 0.000001 -0.005170 
+0.001626 -0.001092 -0.002343 -0.001665 -0.001380 -0.001780 
+-0.003727 0.000814 -0.000525 -0.002005 0.003002 0.001663 
+-0.001303 0.002042 -0.000131 0.002850 0.003863 -0.002033 
+0.000108 0.005853 -0.005555 0.002243 0.004994 -0.008053 
+0.003133 0.004073 -0.003307 -0.002620 0.000030 -0.001922 
+-0.003654 -0.003265 -0.003619 -0.004962 -0.002330 -0.003082 
+0.000000 -0.000833 -0.002273 -0.002762 0.001146 -0.002964 
+-0.003535 0.001438 -0.003013 -0.002392 0.002101 -0.003588 
+-0.001204 -0.001246 -0.001162 -0.002590 -0.001129 0.001460 
+-0.001380 0.001245 0.001036 0.000227 0.002838 0.000372 
+0.001021 -0.000053 -0.000931 -0.001207 -0.000478 -0.003166 
+0.000009 0.001488 0.001339 -0.000031 0.001870 0.000491 
+0.000137 0.002092 -0.000786 0.002493 0.003732 0.000570 
+0.005554 0.005893 -0.000420 0.007908 0.005463 0.000724 
+0.005360 0.001304 0.001211 0.003353 0.000502 -0.000738 
+0.001769 0.001802 -0.000668 -0.000269 0.002601 -0.000933 
+0.000706 0.000771 0.000123 -0.000693 0.001545 0.002774 
+0.000498 -0.000182 0.002271 0.001859 0.003252 -0.001392 
+-0.002014 0.005302 -0.001466 -0.001691 0.004652 -0.000895 
+0.000279 0.003228 -0.000815 -0.001240 0.000601 0.000662 
+-0.004233 0.002483 -0.002957 -0.004290 0.004002 -0.006807 
+-0.003305 0.003395 -0.006475 -0.003791 0.001919 -0.003009 
+-0.005895 0.003099 0.000341 -0.003095 0.006710 0.000570 
+0.001285 -0.001094 -0.004937 -0.006033 0.003282 -0.010858 
+-0.004453 0.002227 -0.008902 -0.003237 -0.000043 -0.004369 
+-0.001707 -0.000586 0.000607 -0.003474 -0.001211 0.003399 
+0.005769 -0.003880 0.006942 0.002172 -0.000532 -0.001067 
+-0.000951 -0.000824 -0.001491 -0.001433 -0.000347 -0.000818 
+-0.000908 0.003406 0.003988 0.000977 0.005413 0.004686 
+-0.000358 -0.001384 -0.001138 -0.005264 -0.003042 -0.003232 
+-0.000820 -0.012884 0.008783 -0.001764 0.001126 0.007187 
+-0.004379 0.000474 0.007400 -0.002094 0.000039 0.004729 
+-0.000351 -0.000060 0.001056 -0.007754 -0.000711 -0.004126 
+-0.005702 -0.000375 -0.003629 0.000096 -0.000226 0.000070 
+0.000774 -0.001468 0.001438 -0.006607 -0.001486 0.004027 
+-0.012208 0.000000 0.000000 -0.007012 0.005454 -0.005641 
+-0.000919 0.003962 -0.005970 0.001376 0.003978 -0.006535 
+0.001700 0.001772 -0.005339 0.000124 0.000367 -0.000807 
+-0.000640 0.001351 0.000922 -0.003144 0.000753 -0.001395 
+-0.005266 -0.001799 0.001555 0.000312 0.000755 0.000668 
+0.004567 0.005206 0.000064 0.007918 0.006776 0.000939 
+-0.001700 0.006368 -0.008905 0.001345 0.006200 -0.004576 
+-0.003894 -0.002028 -0.001094 -0.002617 0.003925 -0.006063 
+-0.002315 0.003704 -0.008346 0.000000 0.002222 -0.006593 
+-0.001180 0.002573 -0.001723 -0.000368 0.001745 0.001514 
+0.001617 0.001099 0.001983 0.001362 0.000293 0.001460 
+0.001326 -0.000537 0.000969 0.003993 0.002484 0.001153 
+-0.002396 0.002472 0.002808 -0.003300 -0.002071 0.002337 
+-0.000742 -0.004678 -0.001721 0.002286 -0.001031 -0.005896 
+-0.000730 0.006380 -0.001554 0.000232 0.001924 -0.001658 
+0.003100 0.001940 -0.000176 0.006558 0.005390 -0.001640 
+0.007906 0.005493 0.001155 0.003959 0.003667 0.001226 
+0.000523 0.001903 -0.000295 0.001401 0.000976 -0.003184 
+0.001307 0.002831 -0.004803 0.001660 0.001534 -0.003908 
+-0.002836 0.000228 -0.002008 -0.001032 0.002149 -0.000828 
+-0.001048 0.003468 -0.004113 0.002524 0.001179 -0.005543 
+0.001116 0.005227 -0.006047 -0.000998 0.002578 -0.004016 
+-0.000636 0.002467 -0.003770 0.011873 0.006142 -0.008801 
+0.009318 0.016641 -0.002894 0.005302 0.014912 -0.010732 
+0.000118 0.002686 -0.007670 -0.001610 -0.000085 -0.001359 
+-0.001981 -0.000404 -0.000126 -0.000824 0.004188 -0.000543 
+-0.003034 0.001548 -0.003964 -0.002118 0.000106 -0.002113 
+-0.002043 0.000474 0.000791 -0.001935 -0.000344 0.000688 
+-0.001993 0.001010 -0.000577 0.000547 0.004573 -0.000364 
+0.002599 0.003049 -0.001840 0.003543 0.006191 -0.003241 
+-0.000346 0.010625 0.000479 -0.006895 0.019105 -0.007326 
+-0.004652 0.019181 -0.001470 -0.004841 0.006735 -0.001637 
+-0.006729 0.005255 -0.004166 -0.007645 0.000073 0.002360 
+-0.000077 0.000196 0.002315 -0.000940 0.000344 -0.001293 
+-0.001967 0.001187 -0.004278 -0.005187 -0.000939 0.001240 
+-0.002311 -0.006240 -0.003236 -0.000767 -0.004569 -0.003243 
+-0.002529 0.000118 -0.002529 0.003917 0.001204 0.000527 
+0.003015 -0.000072 -0.002298 -0.003029 -0.001647 0.002897 
+-0.009332 0.003545 0.000374 -0.002503 0.007909 0.001702 
+-0.000620 0.006752 -0.000739 -0.001260 0.001304 0.001864 
+-0.001332 -0.003165 0.005980 -0.000817 -0.003924 0.004794 
+-0.000706 -0.000870 -0.000215 0.002164 0.003144 -0.004385 
+0.002930 0.006165 -0.005890 -0.001306 0.006402 -0.004310 
+0.001332 0.004427 -0.005949 0.003294 0.006220 -0.002561 
+0.000445 0.004178 -0.005292 0.003036 0.005363 -0.003285 
+-0.000015 0.002689 0.000572 -0.001909 -0.000224 -0.002887 
+-0.000593 0.000593 -0.003556 0.000949 -0.000825 -0.000904 
+0.000226 0.000213 0.001877 -0.000329 0.000481 -0.000238 
+-0.002448 0.000121 -0.001805 -0.001143 -0.000824 -0.001189 
+0.000513 -0.000331 -0.000530 -0.001387 -0.000708 0.002689 
+-0.001529 -0.001599 0.003716 -0.001448 -0.000235 0.001409 
+0.000735 0.000609 -0.000108 -0.000919 -0.000997 -0.001150 
+0.005777 0.002867 -0.001772 -0.000206 0.006541 -0.002134 
+-0.000078 0.004047 -0.003300 0.000180 0.003001 -0.003686 
+-0.001522 -0.000196 -0.002528 -0.000573 -0.003167 -0.002460 
+0.000893 -0.001340 -0.001855 0.000659 0.001435 -0.002302 
+-0.000065 0.003723 -0.001092 -0.002585 0.000735 0.000748 
+-0.004966 -0.002754 0.001993 -0.004198 -0.002743 0.000559 
+-0.002242 0.000156 0.000374 -0.000388 0.000304 0.000682 
+-0.000384 -0.003655 0.001928 0.000605 -0.006121 0.002436 
+0.000798 -0.001601 0.000797 -0.003553 0.003663 -0.003443 
+0.002527 0.010866 -0.016859 0.004265 0.014769 -0.010557 
+0.000208 0.007402 -0.003018 -0.002634 0.000774 -0.000358 
+-0.000490 0.003284 0.002549 -0.000932 0.004419 -0.001277 
+0.003113 0.006670 -0.004990 0.006504 0.002549 -0.001582 
+-0.000872 -0.001295 -0.006784 -0.001413 0.000230 -0.002945 
+-0.004042 0.001952 -0.001806 -0.006945 0.003215 0.000238 
+-0.008125 -0.007235 -0.000533 -0.002393 -0.008526 -0.007706 
+0.002698 -0.004142 -0.010872 -0.001157 0.003419 -0.016248 
+0.000186 0.013792 -0.007208 0.003903 0.010752 -0.004729 
+-0.000341 0.011995 -0.007307 -0.000440 0.003951 -0.006816 
+-0.000201 0.000837 -0.001678 0.000259 0.000109 0.000010 
+0.002481 -0.004428 -0.003364 0.001636 0.000630 -0.004218 
+-0.002297 -0.000482 0.000556 -0.004814 -0.001714 -0.000893 
+-0.006367 -0.000415 -0.005100 -0.005068 0.000396 -0.005514 
+-0.003488 0.003750 0.002325 0.000502 0.001808 0.003167 
+0.000684 0.002881 0.001306 0.000770 0.004157 -0.001052 
+0.000326 0.004395 -0.003687 0.000206 0.002929 -0.001713 
+-0.000821 0.000179 0.001643 -0.003412 -0.002036 0.001552 
+-0.003231 -0.000371 -0.000179 -0.000685 0.000024 0.000337 
+0.002640 0.005280 -0.001280 -0.001051 0.006614 -0.001489 
+-0.001567 0.003265 -0.002612 -0.000102 0.003689 -0.000785 
+-0.001101 0.003537 -0.000056 -0.000374 0.000789 -0.002390 
+0.002181 0.004263 -0.003098 0.003077 0.002051 -0.003712 
+0.001145 -0.001374 -0.000229 0.000620 -0.000802 0.000547 
+-0.003284 -0.002035 -0.001981 -0.006296 -0.004119 -0.001157 
+-0.002835 -0.003492 -0.003427 0.000232 -0.001763 0.000323 
+-0.003053 -0.000702 0.001526 0.000810 -0.001387 0.003474 
+-0.002631 -0.003583 0.003617 -0.003373 -0.002381 0.003373 
+-0.001196 0.001927 -0.000831 -0.004341 0.001705 0.000775 
+-0.001930 -0.001434 0.000442 -0.001409 -0.001798 0.000049 
+-0.001529 0.000249 0.000356 0.000061 0.000410 -0.000534 
+0.000781 0.000366 -0.000080 0.000684 0.001100 -0.002057 
+0.002819 0.002886 -0.002524 0.000492 0.002593 0.000486 
+-0.000732 0.000353 -0.000343 -0.000519 -0.000903 -0.000853 
+-0.001266 -0.003398 0.000866 -0.000075 -0.000388 0.000015 
+0.000650 0.002903 0.000186 0.000705 0.002822 0.001675 
+0.000988 0.001756 -0.001138 -0.000666 0.000916 -0.002552 
+-0.000468 0.000957 -0.000872 -0.000894 0.003102 0.003628 
+-0.002947 0.003536 0.004430 0.001231 0.008992 -0.002863 
+-0.000413 0.008052 -0.000092 -0.005128 0.002942 -0.002925 
+-0.002246 0.003326 -0.000115 -0.003054 0.000777 0.005031 
+0.000957 0.002847 0.002491 0.000479 -0.001229 -0.002782 
+0.000976 -0.000610 -0.014756 0.000553 0.002072 -0.015158 
+0.001260 -0.000980 0.002092 0.004792 0.004505 0.008818 
+0.005514 0.003708 0.020304 0.008590 0.003160 0.024352 
+0.009807 0.002572 0.020173 0.007173 0.002181 0.012461 
+0.002206 -0.009236 0.003997 -0.005542 0.000450 -0.006962 
+-0.001322 0.003588 -0.005942 0.002930 0.003045 -0.002620 
+0.000979 -0.000027 0.003319 -0.003277 0.004838 0.004042 
+0.000820 0.005580 -0.003744 0.001957 -0.002430 -0.005000 
+-0.004488 -0.004790 -0.002951 -0.011486 -0.004665 -0.002321 
+-0.014354 0.000927 -0.008467 -0.004000 -0.002100 -0.005800 
+-0.000906 -0.001544 0.001728 -0.000253 0.001147 0.000444 
+0.006338 0.001921 -0.002863 0.000338 0.000932 0.000688 
+-0.005307 0.007377 -0.005329 -0.000362 0.004520 -0.002062 
+-0.001228 -0.000695 0.003097 -0.001595 -0.003321 0.003212 
+-0.000500 -0.003000 0.001000 -0.000508 0.000992 0.000291 
+-0.001940 0.002739 0.001482 -0.000860 0.002708 0.001555 
+-0.001270 -0.000922 0.000294 -0.001884 0.001548 0.000371 
+-0.001464 0.001253 0.002510 -0.003048 0.000355 0.004404 
+-0.001090 -0.003617 0.005404 -0.003371 -0.004194 0.004871 
+-0.001308 -0.001846 0.003538 -0.004946 -0.000567 -0.001975 
+-0.003660 -0.000477 -0.003760 -0.001880 -0.003512 -0.000900 
+-0.000278 -0.005234 0.001189 -0.002400 -0.001607 -0.000294 
+-0.004818 0.001752 0.000337 -0.004477 0.003067 0.005215 
+-0.005226 -0.004351 0.005699 -0.002103 -0.006349 0.002103 
+-0.005245 -0.002598 -0.000674 -0.004281 -0.001061 0.000263 
+-0.002370 -0.001856 -0.000567 -0.004171 0.001302 -0.000106 
+-0.006667 0.000792 0.001715 -0.006331 0.000026 0.000732 
+-0.003511 0.002901 0.000081 -0.000704 0.006266 -0.003479 
+0.000985 0.007121 -0.003362 0.000848 0.004581 -0.000602 
+0.001098 0.003337 0.000138 0.005000 0.004963 -0.001593 
+-0.001614 0.001222 -0.002355 -0.001047 0.008682 -0.003140 
+-0.001630 0.000567 -0.001488 0.002642 0.000296 0.001770 
+0.001704 0.006475 -0.000233 -0.000352 0.005398 -0.003166 
+-0.000804 0.004561 -0.007895 0.002776 0.004189 -0.005825 
+-0.003210 0.001475 0.001032 -0.004661 0.000288 -0.000625 
+-0.006170 0.001915 -0.005105 -0.003112 0.004467 -0.007200 
+-0.000302 0.007194 -0.007154 -0.005578 0.000146 -0.004273 
+-0.000847 0.001309 -0.004160 0.000344 0.000802 -0.001910 
+0.002377 0.004797 -0.013323 -0.013011 0.013885 -0.015336 
+0.010979 -0.000692 0.030882 0.010559 -0.002257 0.051144 
+1.112195 -0.321951 6.024390 1.205224 -0.361940 6.182836 
+1.295964 -0.322870 5.560538 0.008909 0.003276 0.036748 
+0.001953 0.002090 0.007002 0.001151 -0.004043 -0.000959 
+0.004671 -0.002696 0.006786 0.006230 -0.001375 -0.000348 
+0.009681 0.004474 -0.007849 0.009512 0.010544 -0.012739 
+0.002802 0.007670 -0.013648 0.005587 0.003101 -0.003240 
+0.000489 0.000906 -0.000357 0.002259 0.000453 0.002933 
+0.001717 0.000729 0.001792 0.000344 -0.001864 -0.004707 
+0.003578 0.006083 -0.010377 0.004733 0.002024 -0.006495 
+-0.002996 0.004307 -0.007678 -0.004283 -0.001678 -0.003074 
+-0.006779 0.002042 -0.006706 -0.000579 0.000956 -0.001419 
+0.000247 -0.002473 0.007295 -0.001086 -0.002429 0.007392 
+-0.001197 0.000382 -0.000841 -0.003251 0.001765 -0.005636 
+-0.002727 0.004136 -0.005135 -0.004404 0.002727 -0.001914 
+-0.004113 0.003188 -0.000591 -0.003717 0.003106 -0.001930 
+-0.002479 0.002998 -0.000055 -0.001518 -0.000731 -0.000302 
+-0.001235 -0.000806 -0.001367 -0.001837 0.000208 -0.001887 
+-0.001888 0.000720 -0.001864 -0.000405 -0.000682 0.000949 
+0.000391 -0.000611 -0.000539 -0.000565 -0.000379 -0.002642 
+-0.003539 0.000759 -0.004549 -0.003496 0.004228 -0.006992 
+-0.002507 0.004098 0.000627 0.001034 0.001620 -0.000179 
+0.003280 0.000582 -0.002116 0.002150 -0.000224 -0.005104 
+0.000717 0.000311 -0.005141 -0.000561 -0.001601 -0.001788 
+-0.000862 -0.000328 -0.000035 -0.000935 -0.000787 0.002255 
+-0.002172 -0.002206 0.003886 -0.004520 -0.001075 0.004627 
+-0.003048 0.001538 0.003877 0.000499 0.005720 -0.001452 
+0.009622 0.009790 -0.003866 0.000444 0.004806 0.002278 
+-0.002130 0.008455 -0.004260 0.004597 0.000000 -0.001532 
+0.001626 -0.000588 0.005291 -0.000055 -0.000192 0.005403 
+-0.000776 0.001871 0.000826 0.001641 0.001094 -0.002148 
+-0.000655 0.005459 -0.003984 -0.000506 0.003037 -0.008545 
+0.001621 0.000952 -0.015319 0.007582 0.002262 -0.011374 
+-0.004790 0.002065 -0.008832 -0.006411 0.003482 -0.003587 
+-0.006433 0.002315 -0.001027 -0.003837 0.000829 -0.001477 
+-0.000066 0.003275 -0.007633 0.002665 0.009561 -0.017369 
+0.002959 0.012273 -0.021466 0.000708 0.003113 -0.012681 
+-0.001850 -0.000369 -0.013071 -0.025172 0.015944 -0.041134 
+-0.006814 0.015391 0.003724 0.386364 -0.448864 5.505682 
+0.715877 -0.779944 7.300836 0.839056 -0.894850 7.669528 
+0.917910 -0.835821 7.276119 0.877193 -0.500000 5.776316 
+0.003666 0.000973 0.017557 -0.001139 0.002605 -0.014766 
+0.005957 -0.007982 0.022615 0.007326 -0.007074 0.022607 
+0.002168 0.022088 -0.003959 0.023922 0.011150 -0.032157 
+0.007276 0.007114 -0.013966 0.005749 0.004453 0.000759 
+0.006605 0.005329 -0.002428 0.001556 0.003111 -0.007778 
+-0.000330 0.000504 -0.001515 -0.001301 0.000215 0.006054 
+-0.000581 0.000813 0.003330 -0.000533 0.001488 -0.004685 
+0.008367 -0.002115 -0.008104 0.010844 0.003750 -0.011161 
+0.002490 0.005539 -0.011067 0.000000 0.001333 -0.003048 
+-0.001618 -0.003646 0.005218 -0.003021 -0.004318 0.009084 
+0.001303 -0.000739 0.000453 0.000621 0.000626 0.000566 
+-0.001254 0.001195 -0.001263 -0.002857 -0.000629 -0.003198 
+-0.000957 0.001188 -0.005718 0.001996 -0.001146 -0.002743 
+-0.001258 0.002204 -0.000531 -0.001672 0.004441 -0.000993 
+-0.002023 0.003698 0.000366 -0.000700 -0.000296 -0.000305 
+0.000072 -0.006055 0.002126 0.001857 -0.004342 0.000244 
+-0.001379 0.000406 -0.001224 -0.003897 0.001883 -0.003153 
+-0.001770 0.000442 -0.003932 -0.000940 0.000080 0.000020 
+-0.002137 0.002991 0.000000 -0.002454 0.004604 0.003478 
+0.000975 -0.000254 -0.001483 0.003694 0.000611 -0.003389 
+0.002860 0.001703 -0.003833 0.000124 0.000548 -0.000445 
+0.002213 0.003144 -0.001834 -0.002231 0.000863 -0.000508 
+-0.003588 -0.002188 0.000744 -0.001857 -0.001047 0.000127 
+0.002251 -0.000942 -0.002007 0.001687 0.008943 -0.003225 
+0.005760 -0.002306 -0.008072 0.003234 0.004439 0.002316 
+0.004130 0.005034 0.001875 0.002480 0.005416 0.001907 
+0.004040 0.000280 0.000800 -0.001448 0.004382 0.000469 
+0.001244 0.006593 -0.001681 -0.002595 0.000335 -0.003787 
+-0.003699 0.001866 -0.007931 -0.002793 0.000915 -0.009419 
+-0.000378 0.001468 -0.007985 0.005504 -0.001649 -0.000067 
+-0.001755 0.001345 -0.003855 -0.002467 0.002648 -0.006968 
+0.000316 -0.000762 -0.006479 -0.000274 0.003161 -0.002275 
+-0.001683 0.000380 -0.001964 -0.006035 -0.002990 -0.003030 
+-0.007529 -0.002091 -0.004216 -0.006939 -0.001210 -0.013338 
+-0.016746 -0.002917 -0.028090 -0.021575 0.009376 -0.032501 
+-0.003103 0.010596 0.006378 0.582524 0.101942 5.237864 
+0.797583 -0.435045 6.682779 0.778055 -0.566085 6.573566 
+0.658537 -0.387534 5.612466 0.345865 -0.060150 4.067669 
+0.004898 0.000218 0.020674 -0.001342 0.001788 -0.008781 
+-0.000333 -0.002847 -0.007430 -0.000364 0.001870 0.003673 
+-0.001295 0.000530 -0.010000 -0.001808 0.002912 -0.013723 
+-0.004046 -0.006108 0.001747 -0.004309 -0.009382 0.015125 
+-0.002540 -0.009679 0.008090 -0.002374 -0.004984 -0.001425 
+-0.002751 -0.001458 -0.003869 -0.000556 -0.001474 -0.004059 
+0.005488 0.006225 -0.003375 0.007166 0.005558 -0.002219 
+0.006108 0.001699 -0.002844 -0.001549 0.005293 -0.000710 
+0.001804 0.004749 -0.001330 -0.000473 0.001271 0.002601 
+-0.003102 -0.000185 0.003102 -0.001089 -0.000244 0.002225 
+0.000087 0.002129 0.003206 -0.000382 0.005066 0.003127 
+-0.001650 0.005485 -0.001606 -0.001557 0.002328 0.000390 
+-0.004097 -0.000738 -0.001462 -0.001570 0.000670 -0.003298 
+0.004104 0.004455 -0.003521 0.001462 0.006843 0.001419 
+0.001522 0.003934 -0.000356 -0.000237 -0.002495 0.002666 
+0.002057 0.000487 0.006460 0.003361 0.001484 0.004855 
+0.002002 0.004578 0.000714 -0.000495 0.001671 -0.004332 
+-0.002939 0.002158 -0.000987 -0.005761 -0.001908 0.004099 
+-0.001835 -0.002989 0.003373 0.003290 0.001566 -0.000624 
+0.000200 -0.000100 -0.007250 -0.002646 0.001852 -0.009268 
+-0.004268 0.001144 -0.004798 -0.002196 0.001455 0.001481 
+-0.005627 0.002947 -0.000707 -0.000534 0.002217 0.000817 
+0.001249 0.002120 0.000683 -0.003180 0.004530 0.000087 
+0.007828 0.002424 -0.003447 0.002186 -0.000566 -0.000161 
+0.004762 0.007714 -0.001714 0.002108 0.003942 0.000187 
+-0.001128 0.000667 -0.000179 -0.004427 -0.001750 0.003280 
+0.003404 0.002193 0.004135 0.003282 0.005193 0.000539 
+0.001628 -0.000807 -0.003228 -0.005865 0.000985 -0.006536 
+-0.006751 0.000118 -0.008640 -0.004323 -0.001492 -0.006531 
+-0.000737 -0.001805 -0.000990 0.000287 -0.000892 0.000566 
+-0.000141 0.001829 0.000206 0.001628 0.002915 -0.001880 
+0.000771 0.003546 -0.004616 -0.002896 0.004860 -0.007152 
+-0.006738 0.005379 -0.004712 -0.005034 0.000384 0.000021 
+-0.002227 -0.005441 0.003782 -0.002098 -0.005142 0.004112 
+-0.012005 0.004322 -0.005948 -0.007958 0.013174 0.001061 
+0.000791 0.001793 -0.000245 0.629834 0.104972 4.497238 
+1.340824 -0.288390 5.771535 1.416949 -0.413559 5.203390 
+1.032389 -0.344130 3.668016 0.003224 -0.000569 0.014987 
+-0.003720 0.003577 -0.002156 -0.001944 0.006852 -0.003454 
+0.003254 0.000843 0.002054 -0.003807 0.000474 -0.004180 
+-0.011235 0.001523 -0.011664 -0.020645 -0.001862 -0.010962 
+-0.023019 -0.001293 0.002217 -0.004094 -0.004778 0.006748 
+0.001938 0.007210 0.000571 0.003227 0.010291 -0.002703 
+0.000650 0.006790 -0.004614 0.001221 0.001101 -0.005064 
+0.002660 -0.001074 -0.001794 0.002511 -0.001054 0.001801 
+-0.004521 -0.002497 0.001241 -0.009611 -0.006242 -0.005201 
+-0.010091 0.004196 -0.010693 0.000246 0.006273 -0.005289 
+-0.000813 0.003077 0.001431 -0.000956 -0.001201 0.006861 
+0.001520 -0.004777 0.004198 -0.001589 -0.002629 0.002094 
+-0.000564 0.005875 -0.004669 0.005238 0.009706 -0.007856 
+0.005244 0.006601 -0.008287 0.000089 -0.000817 -0.001118 
+0.000159 0.000408 0.000512 0.000985 -0.000118 -0.000063 
+0.002072 0.002290 -0.000188 0.002384 0.003542 -0.001298 
+0.004816 0.000602 -0.000328 0.004271 -0.002450 0.001099 
+0.001196 -0.001284 0.000960 -0.001813 0.001360 0.001250 
+0.000492 -0.000574 0.000902 -0.000595 0.000595 0.005556 
+0.002150 -0.002318 0.002730 0.005334 0.001797 0.000707 
+-0.000508 0.002030 -0.001532 -0.002120 0.001895 -0.001439 
+-0.001893 0.002977 -0.000137 -0.001185 0.004319 -0.003759 
+-0.000901 0.002117 -0.000149 -0.000386 0.001372 0.000407 
+0.000231 -0.000288 -0.000240 -0.000086 -0.000172 -0.000166 
+-0.000142 0.000475 0.000565 0.000590 0.003418 0.000756 
+0.001789 0.007622 -0.000022 0.004646 0.009631 -0.000396 
+0.006011 0.007666 -0.002038 0.001480 0.001440 -0.002440 
+-0.000242 -0.001290 0.001290 -0.001989 0.000293 -0.000261 
+0.000055 0.000659 -0.000521 -0.001215 0.001215 -0.001215 
+-0.000204 -0.000564 -0.000686 0.001135 -0.003646 -0.000729 
+-0.001294 -0.006091 0.001740 -0.000368 -0.002033 0.002462 
+0.005330 0.004237 -0.000861 0.009951 0.000710 -0.001976 
+0.009950 0.003461 -0.006842 0.001226 0.011608 -0.004210 
+-0.004506 0.001409 -0.002407 -0.000294 -0.000199 -0.004317 
+0.002732 0.000864 -0.001197 0.004464 0.001599 0.002693 
+0.004003 0.005402 -0.002213 0.006521 0.003793 -0.017022 
+0.000901 -0.004823 -0.006655 0.005922 0.006755 -0.004449 
+0.013441 0.003351 0.003487 0.012954 -0.000233 0.003573 
+0.004217 -0.002246 -0.006430 -0.007458 -0.000744 -0.025274 
+-0.015386 -0.002344 -0.015890 -0.005300 0.007110 -0.006321 
+-0.004118 0.001236 0.007676 -0.003451 0.000513 0.003704 
+-0.002460 -0.000620 -0.003872 -0.001355 -0.000191 -0.005065 
+-0.008477 -0.002896 0.000058 -0.021223 0.000274 0.003621 
+-0.010578 0.008788 0.005072 -0.001053 -0.003510 0.003437 
+-0.002557 -0.002038 0.004154 -0.004255 0.000681 0.004482 
+-0.005394 -0.001607 0.004498 -0.005994 -0.006199 0.004444 
+-0.004008 -0.007630 0.007112 -0.005492 -0.004496 0.004131 
+-0.001158 -0.001036 0.000988 -0.000080 0.009232 -0.002419 
+0.005653 0.010203 0.000022 0.004872 0.003446 -0.001065 
+0.000042 0.001711 -0.002379 0.000793 0.000989 -0.000601 
+0.002421 -0.000021 -0.002620 0.002524 -0.001183 -0.001790 
+-0.001206 0.000198 -0.000156 0.000411 0.002468 -0.001103 
+0.000656 0.005126 -0.001107 0.001389 0.004293 -0.001414 
+0.000407 0.001438 -0.000623 -0.000036 0.001106 0.000186 
+-0.000152 0.000895 -0.001708 0.002915 0.000905 -0.003485 
+0.001153 -0.001136 0.000828 0.000863 -0.004182 0.005313 
+-0.004553 -0.003234 0.006095 -0.001581 0.001943 0.001235 
+-0.001043 0.004170 -0.001951 -0.000744 0.001488 0.001240 
+-0.003443 0.004098 -0.003443 -0.001613 0.004597 -0.004597 
+0.001057 0.006818 -0.005352 0.002384 0.006830 -0.002581 
+0.000760 -0.000366 0.000119 -0.000564 0.001797 -0.000612 
+-0.000049 0.006878 -0.001930 0.008169 0.006575 -0.000658 
+0.003247 0.004737 -0.002681 -0.000108 0.003297 0.001413 
+-0.001056 0.003520 0.002112 -0.003336 0.001763 0.002430 
+-0.000483 0.001052 0.002184 0.001157 -0.000228 0.001992 
+0.001334 -0.000785 0.001083 0.002266 -0.000301 -0.000454 
+0.001514 -0.001291 0.001381 0.002902 -0.002243 0.002062 
+0.001735 -0.002328 0.000374 -0.002539 -0.002116 -0.002708 
+-0.007125 0.000862 -0.002972 -0.006105 -0.001027 -0.002820 
+-0.002394 -0.002633 -0.003490 -0.001236 -0.002840 -0.004578 
+-0.003043 -0.000012 -0.005451 -0.001428 0.001902 -0.004497 
+0.000490 0.000653 -0.003576 0.002316 -0.000402 -0.001827 
+0.002510 0.001353 -0.000329 0.002658 0.002296 -0.002507 
+0.000062 0.000975 -0.005127 -0.002194 0.001046 -0.006475 
+-0.000193 0.000400 -0.007995 0.004537 0.002060 -0.008506 
+0.005479 0.008561 -0.009742 0.002440 0.010793 -0.011257 
+0.004821 0.004309 -0.006621 -0.008143 0.004449 -0.010609 
+-0.006702 0.005446 -0.005003 -0.003973 0.003558 -0.002345 
+-0.001764 0.001019 -0.000170 0.000167 -0.000186 0.000596 
+0.001867 0.000743 -0.000845 0.002620 0.001335 -0.002832 
+0.002273 0.000735 -0.001900 0.000548 0.000032 0.001047 
+-0.000833 -0.000163 0.000197 -0.001762 0.002386 -0.003448 
+-0.000830 0.005365 -0.002483 -0.000020 0.003213 -0.000573 
+-0.002654 -0.001451 0.001433 -0.002907 -0.005250 0.006689 
+-0.005038 -0.007463 0.003264 -0.002169 0.000237 0.003062 
+-0.000932 0.000609 -0.002401 -0.002038 0.003787 -0.003996 
+0.000466 0.005113 -0.002658 0.002703 0.005097 -0.003411 
+0.008533 0.006907 -0.004587 0.010591 0.007663 -0.000732 
+0.009385 0.003056 -0.005274 0.001948 0.000812 -0.005197 
+-0.002030 0.000150 -0.001053 0.000458 0.004427 0.001374 
+-0.000308 0.001861 -0.001551 -0.002962 0.002229 0.000314 
+-0.002484 0.001162 -0.000371 0.001086 0.002305 -0.005292 
+0.006750 0.005073 -0.008672 0.009403 0.002687 -0.006154 
+0.004383 -0.000610 -0.000895 -0.001025 -0.001722 0.003150 
+-0.002683 -0.002927 0.000488 -0.003231 0.001477 -0.001938 
+-0.001011 0.002674 -0.003902 0.000484 0.003484 -0.001161 
+0.001778 0.002089 -0.004800 0.004966 0.002833 -0.001895 
+0.004685 0.004491 -0.001084 0.000461 0.003790 -0.000673 
+-0.000347 0.004958 0.002932 0.000818 0.002651 -0.001224 
+0.004882 0.001714 -0.002666 0.003984 0.000999 -0.004246 
+-0.002430 -0.000296 -0.003711 -0.006613 0.001173 -0.004267 
+-0.004385 0.003057 -0.003861 -0.000015 0.004335 -0.002878 
+0.000123 0.005011 -0.002176 -0.001439 0.000719 0.001053 
+0.001552 0.001900 0.000221 -0.000941 -0.001125 -0.001710 
+-0.004193 0.002893 -0.004047 -0.003139 0.005430 -0.001215 
+-0.006593 0.002723 0.001579 -0.008038 -0.000203 -0.006203 
+-0.010850 -0.000789 -0.011368 -0.007641 -0.001226 -0.015835 
+-0.002941 0.002210 -0.015001 0.000630 0.001005 -0.006546 
+0.001102 -0.000411 0.001970 0.000278 0.000974 0.003002 
+-0.001606 0.000888 0.000270 -0.002273 0.001531 -0.000525 
+-0.002028 0.001296 -0.001966 -0.000816 0.001888 -0.001084 
+0.000270 0.001323 0.000762 -0.000228 0.003149 0.001697 
+-0.002581 0.004242 0.001449 -0.001839 0.001168 0.001730 
+-0.000866 -0.000688 -0.000655 -0.000932 -0.000215 -0.003031 
+-0.000689 0.000478 -0.005706 -0.000940 0.000817 -0.006880 
+-0.000529 0.000698 -0.005864 -0.000524 0.000491 -0.005202 
+-0.001501 -0.000125 -0.004220 0.008007 0.007270 -0.004557 
+0.003835 0.007150 -0.006438 -0.001468 0.000584 -0.002983 
+-0.004455 0.000956 0.001857 -0.004370 0.000952 0.001875 
+-0.000933 -0.000200 -0.000117 0.002554 0.001993 -0.001912 
+0.001109 0.001251 -0.001329 -0.001861 -0.000824 0.001534 
+-0.001664 0.000342 0.002698 -0.001623 0.000580 -0.000232 
+-0.002280 -0.000776 0.001167 -0.002951 -0.001290 0.003285 
+-0.003898 -0.003118 0.004953 -0.005059 -0.000401 0.003573 
+-0.003361 0.002480 -0.000075 -0.001724 0.002759 0.000345 
+-0.001337 -0.000373 0.000371 -0.002399 -0.003211 0.000784 
+-0.002304 -0.003808 -0.000640 -0.001576 -0.000071 -0.001525 
+0.001485 0.003465 -0.003258 -0.000690 0.004736 -0.001851 
+-0.003094 0.001256 -0.001200 -0.000118 0.000044 -0.000202 
+0.002593 0.003704 -0.001109 0.003853 0.000784 -0.003716 
+-0.000897 0.001933 -0.004417 -0.003443 0.000374 0.001161 
+-0.004600 -0.006976 0.001227 -0.002169 -0.007120 0.003113 
+-0.003710 -0.004206 -0.000826 0.000925 0.000132 -0.005508 
+0.002817 0.005914 -0.008591 0.004666 0.008165 -0.005820 
+0.001174 0.004153 -0.002196 0.000349 -0.000450 -0.000382 
+0.000000 0.000323 -0.000565 -0.000688 0.002175 -0.002514 
+-0.002204 -0.000206 0.001867 -0.000316 0.000633 0.000994 
+0.000357 0.001144 0.001657 -0.001697 0.002012 0.001588 
+-0.003717 0.001108 0.002511 -0.000541 -0.000799 0.001794 
+0.000254 -0.003898 -0.000254 0.002241 -0.000744 -0.004864 
+0.001782 0.002733 -0.007861 0.001753 0.002306 -0.008063 
+0.004617 0.002713 -0.002592 -0.000419 0.001276 -0.003219 
+0.001493 -0.001865 -0.000473 0.000693 0.000995 0.001715 
+0.000114 0.003324 0.004494 0.002755 0.001249 0.001203 
+-0.002056 0.003717 -0.005835 -0.005248 0.003095 -0.011082 
+-0.004529 -0.001558 -0.012089 0.004983 0.003217 -0.010834 
+0.001385 0.004390 -0.004319 0.001320 -0.000122 -0.001654 
+0.000244 0.001038 -0.000991 -0.000687 -0.000078 -0.003781 
+-0.003486 -0.001552 -0.001705 -0.003245 -0.004110 0.000606 
+-0.002079 -0.004559 -0.000265 -0.001386 -0.000904 -0.001153 
+-0.000769 0.002797 -0.001189 -0.002153 0.002655 0.001150 
+-0.001040 0.000939 0.002309 -0.000831 -0.000360 0.000234 
+0.000538 -0.000319 -0.000483 0.001922 -0.000529 -0.000486 
+0.002854 -0.001122 -0.001089 0.000929 -0.000932 -0.000701 
+0.000862 0.002591 -0.003671 -0.001825 0.001220 -0.003511 
+-0.000990 -0.000021 -0.001147 0.001966 0.001887 0.000568 
+0.002793 0.001665 -0.000262 -0.000532 0.003081 0.000153 
+-0.000221 0.005351 -0.005580 0.001447 0.005671 -0.005006 
+0.001937 0.000630 -0.000675 -0.000783 -0.003452 0.002615 
+-0.000878 -0.002851 0.002219 0.002699 0.001532 0.001970 
+0.002299 0.007962 -0.001344 0.000505 0.008636 -0.004036 
+-0.000237 0.002220 -0.004432 -0.001281 0.001821 0.003169 
+-0.002487 0.000684 0.001368 -0.001650 -0.001552 0.000947 
+-0.001519 0.001520 -0.001064 0.000112 0.003248 -0.003760 
+0.000430 0.000848 -0.005540 -0.000208 0.002941 0.000296 
+-0.001028 0.004903 -0.000725 0.000000 0.008519 -0.007852 
+0.005957 0.007535 -0.002954 -0.000543 0.004184 0.000099 
+-0.004130 -0.002268 0.001215 -0.005043 -0.004458 0.003521 
+-0.001875 -0.002421 0.002591 0.000145 0.003659 0.000689 
+-0.003369 0.005431 -0.000151 -0.003480 0.002531 -0.003585 
+-0.001343 0.000440 -0.002942 -0.002647 -0.002091 -0.002303 
+0.000736 -0.001200 -0.001472 0.000031 0.002432 -0.000554 
+-0.000582 0.004162 -0.001007 -0.000099 0.004616 -0.001129 
+-0.000957 0.004591 -0.000269 -0.000589 0.005278 -0.001827 
+0.000663 0.002397 0.001513 -0.001124 0.002805 0.002237 
+-0.006029 -0.000809 0.003750 -0.005323 -0.003065 0.004946 
+-0.002852 -0.003897 0.002274 0.000285 -0.001504 -0.000894 
+0.001190 0.004233 -0.004123 0.001871 0.007509 -0.002029 
+0.001383 0.004932 -0.000949 -0.000902 0.001083 0.001113 
+-0.000607 -0.001058 0.003489 0.001819 -0.000200 0.004282 
+0.001904 0.000527 0.003394 0.001615 0.000376 0.002985 
+0.004430 0.000683 0.005793 -0.001014 -0.003695 0.009084 
+-0.000265 0.003358 0.001856 -0.000915 0.007720 -0.005889 
+0.000748 0.008889 -0.006448 0.003162 0.005457 -0.005221 
+0.000569 0.002905 -0.001369 0.004126 0.001420 0.003432 
+-0.002810 0.001521 -0.000085 -0.004101 0.005170 -0.002498 
+-0.006513 0.001513 -0.001744 -0.002281 0.001860 0.000456 
+0.003328 0.003183 -0.001676 0.004027 0.000095 -0.003693 
+-0.000431 0.003030 -0.002791 -0.003929 0.000959 0.000317 
+-0.005791 -0.001090 0.000535 -0.005358 -0.001219 0.001230 
+-0.002844 0.000843 0.000072 -0.000511 0.002279 -0.003546 
+0.000269 0.004211 -0.005643 -0.001522 0.003304 -0.005848 
+-0.000456 0.001612 -0.003484 0.000676 -0.001534 -0.000937 
+0.002963 -0.001079 -0.001171 0.000554 0.002757 -0.003824 
+0.000516 0.003978 -0.004711 -0.005341 0.003409 -0.001780 
+-0.002964 -0.000979 0.001904 -0.002258 -0.002794 0.000028 
+-0.000526 -0.000938 -0.001814 0.002019 0.003390 -0.001961 
+0.005103 0.005215 -0.002572 0.008663 0.007263 -0.001679 
+0.007486 0.010922 -0.003753 0.007017 0.010937 -0.007971 
+0.002642 0.007190 -0.009856 0.004641 0.002968 -0.001034 
+0.002746 0.003518 -0.001054 0.003996 0.003066 -0.003073 
+0.004831 0.005087 -0.004559 0.002722 0.005289 -0.006649 
+-0.000189 0.000031 -0.004884 -0.002407 0.001412 -0.003082 
+-0.001603 0.003130 -0.001757 0.000242 0.003642 -0.000890 
+0.000373 0.002347 -0.000329 -0.002667 0.000296 0.000593 
+-0.004679 0.001365 0.000390 -0.003720 0.003358 -0.001395 
+-0.003292 0.003018 -0.001426 -0.002651 0.000310 -0.003029 
+-0.006779 -0.002264 0.001145 -0.004320 0.001191 0.002081 
+-0.000446 0.000513 0.000926 0.000187 0.002948 -0.003874 
+0.000969 0.005266 -0.003776 -0.001684 0.001727 -0.001943 
+-0.001183 -0.002917 0.000551 0.001402 -0.004312 -0.001455 
+-0.000714 -0.002319 0.001070 0.000448 0.000614 -0.001990 
+0.002684 0.004864 -0.004738 0.001775 0.004334 -0.005097 
+-0.000668 0.002321 -0.002507 -0.001229 0.000230 0.000885 
+0.000000 -0.000161 -0.000323 0.000981 -0.000525 -0.001377 
+0.001305 0.004429 -0.003639 0.001570 0.004364 0.001455 
+0.001491 0.003514 -0.001919 -0.001575 0.000315 -0.000630 
+0.000324 -0.001506 -0.000411 0.000597 -0.002289 -0.000311 
+0.000113 -0.002156 -0.000874 -0.001584 -0.005407 -0.000839 
+0.002164 -0.003769 0.003471 0.005667 -0.002679 -0.003488 
+0.001591 -0.000303 -0.006061 0.000641 0.002531 -0.002434 
+-0.003302 -0.001679 0.000831 -0.002811 -0.001253 0.003512 
+-0.001382 0.004844 0.002680 0.001765 0.003300 -0.002859 
+0.002123 0.004953 -0.003630 0.006225 0.002704 -0.006676 
+0.009168 0.000754 -0.002805 0.002713 0.000859 -0.009721 
+-0.001523 0.002297 -0.006143 -0.001305 0.005455 -0.001958 
+-0.000269 0.005015 0.000896 0.004530 0.005004 -0.001471 
+0.003060 0.005290 -0.003112 -0.001484 0.003680 -0.000966 
+-0.004746 0.001142 -0.000739 -0.000813 -0.000240 -0.001224 
+-0.000302 0.001275 -0.000267 -0.003889 -0.000286 0.000433 
+-0.005028 0.000049 0.001935 -0.002895 0.000550 0.003714 
+-0.001470 0.000160 0.000385 -0.001648 0.001834 -0.004597 
+0.004665 0.001156 -0.005463 0.002224 -0.000869 -0.000646 
+-0.002879 0.004892 -0.002074 -0.000041 0.000969 0.000641 
+-0.005145 -0.005178 0.004810 -0.000405 -0.002320 -0.000134 
+0.006845 0.005714 -0.005847 0.008756 0.014572 -0.007782 
+0.007112 0.017058 -0.011667 0.006684 0.010634 -0.011015 
+-0.000345 0.002723 -0.000382 -0.001967 -0.002757 0.002204 
+-0.003778 -0.001695 0.005123 -0.005225 -0.001516 0.003756 
+-0.003748 0.000120 0.001257 0.000610 0.004298 -0.001470 
+-0.002295 0.004239 -0.006726 -0.002482 0.002837 -0.006963 
+0.005742 0.002944 -0.002798 0.002269 -0.000362 -0.001739 
+-0.000131 -0.000832 -0.000597 0.000046 -0.000228 0.000594 
+-0.000303 -0.000712 -0.001078 0.000273 0.002489 -0.005043 
+-0.002026 0.003717 -0.004686 0.001667 0.002524 -0.000841 
+0.001874 0.000045 -0.002276 -0.002273 -0.003287 -0.002191 
+0.002552 -0.000376 -0.003077 0.003842 0.002573 -0.002126 
+0.002447 0.004752 0.000663 -0.001580 0.003398 -0.000040 
+-0.000723 -0.000579 0.001610 0.000047 -0.000106 -0.000401 
+-0.000447 0.000391 -0.001814 -0.001556 -0.000345 -0.001531 
+0.005859 0.003005 0.000601 0.004437 0.001945 0.001041 
+0.004352 0.002992 -0.000967 0.002484 0.003362 -0.004725 
+0.001462 0.002677 -0.001338 0.000171 0.000816 0.001652 
+-0.002080 0.000080 -0.001040 -0.005577 0.003472 0.000512 
+-0.004705 0.004135 -0.004491 -0.002723 0.000130 -0.004063 
+0.001113 -0.003555 -0.000577 0.002815 -0.005705 0.002108 
+-0.002667 -0.006361 0.001201 -0.007587 0.002716 -0.000563 
+-0.004905 0.003611 -0.001646 -0.000529 0.002018 -0.001514 
+0.003939 0.002296 -0.002625 -0.000308 0.003761 -0.000923 
+0.001381 0.004406 -0.000254 -0.000333 0.003083 -0.002687 
+0.000026 -0.000300 -0.001128 -0.000918 0.000716 0.001065 
+-0.000914 0.000305 0.001016 0.001474 0.005453 0.001703 
+0.002171 0.005885 0.001288 0.002618 0.006685 0.000493 
+0.002467 0.005809 0.000705 0.002801 0.000340 -0.000721 
+0.000844 0.001734 0.001406 0.001463 0.004582 0.000336 
+0.004821 0.004817 -0.003508 0.005477 0.002980 -0.007652 
+0.002974 0.003087 -0.006724 0.000266 0.003261 -0.003952 
+-0.000621 0.004182 -0.002238 -0.001630 0.003741 -0.001444 
+-0.003485 -0.000414 -0.001000 -0.000724 -0.000627 -0.000668 
+0.002769 0.002308 -0.004145 0.004272 0.007483 -0.008002 
+0.001967 0.000529 -0.010667 0.004677 0.002025 -0.008173 
+0.000642 0.001721 -0.003354 -0.003612 -0.005694 0.002550 
+-0.006063 -0.004223 0.011130 -0.003401 -0.007165 0.003554 
+0.004009 0.005011 -0.004565 0.010636 0.014098 -0.006130 
+0.010438 0.019076 -0.008755 0.012630 0.017161 -0.007553 
+0.006197 0.007506 -0.003809 -0.001759 0.007638 -0.001916 
+0.007154 0.008366 -0.005986 0.008116 0.004870 -0.006036 
+0.006311 0.001077 -0.003548 0.004424 0.003511 -0.003703 
+0.000641 0.007247 -0.006695 0.001470 0.003675 -0.006642 
+0.000608 0.000242 -0.003706 -0.001508 -0.000243 -0.001700 
+-0.003495 -0.005840 0.000911 -0.002781 -0.004884 0.001791 
+-0.003891 -0.002241 0.000353 -0.000722 -0.000445 -0.001721 
+-0.000204 0.000345 -0.001416 -0.000121 0.000958 -0.001534 
+-0.001313 0.001082 -0.001017 0.000845 -0.002042 -0.001954 
+0.001204 0.000110 0.000492 0.003039 -0.000561 -0.001866 
+0.003860 0.001853 -0.001959 0.005351 0.000671 -0.002071 
+0.002949 -0.001993 -0.004543 0.001808 -0.001754 -0.005042 
+-0.001013 -0.003815 -0.002470 -0.002007 -0.002300 -0.002993 
+0.005220 0.005141 -0.002072 0.006429 0.006167 0.002056 
+0.000000 0.008571 -0.006349 0.001200 0.006960 -0.008160 
+-0.000441 0.003846 -0.005969 0.000738 0.000391 0.001955 
+-0.001236 0.006423 0.002472 -0.004316 0.005549 -0.001641 
+-0.004199 0.002900 -0.006450 -0.003986 0.001367 -0.004441 
+-0.000710 -0.000133 -0.001038 -0.001784 0.001652 0.001662 
+-0.007043 0.003409 -0.003616 -0.009570 0.003654 -0.014727 
+-0.005890 0.012771 -0.018726 -0.004926 0.013793 -0.010415 
+-0.005086 0.005685 -0.002412 -0.004840 -0.000193 0.001975 
+-0.002325 -0.000225 -0.001512 -0.000483 0.001232 0.000325 
+0.002199 -0.001106 -0.001266 -0.000545 0.000237 -0.001849 
+0.000000 0.002576 -0.000379 -0.000963 0.000856 -0.001497 
+0.001366 0.003029 -0.003841 0.001942 0.006582 -0.002805 
+-0.000718 0.006225 -0.008737 -0.001558 0.004921 -0.005966 
+-0.001437 0.001782 -0.000099 -0.002330 0.000732 0.001057 
+0.001048 0.000794 -0.000519 0.000875 0.004928 -0.005880 
+0.003026 0.007752 -0.004089 0.001480 0.003465 -0.007748 
+-0.000963 0.001546 -0.003875 -0.001292 0.001045 -0.000440 
+-0.002406 -0.001194 0.000800 -0.001396 -0.000618 0.000725 
+-0.000963 0.004261 -0.001978 0.001067 0.006715 -0.004116 
+0.000000 0.006033 -0.005455 -0.000051 0.000017 -0.003419 
+0.001769 0.002148 -0.000568 -0.002179 0.002927 0.001089 
+-0.001281 -0.002403 0.002335 0.001149 -0.002224 -0.000516 
+0.002357 0.005284 -0.009076 0.006574 0.015965 -0.012515 
+-0.003707 0.016287 -0.015498 0.019585 0.022132 -0.014160 
+0.017313 0.019533 -0.012074 0.009172 0.012460 -0.010464 
+0.008933 0.012628 -0.005987 0.008027 0.004605 -0.003693 
+0.002212 0.001193 -0.000471 0.001660 0.002920 -0.000178 
+0.002160 0.005207 -0.002858 -0.001118 -0.000288 -0.000661 
+-0.002736 -0.004059 -0.000127 -0.003328 -0.002112 -0.001868 
+0.000782 -0.002695 -0.000803 0.003335 0.003333 -0.005241 
+0.003542 0.002993 0.001197 -0.001606 0.002347 -0.000556 
+-0.001511 0.002028 -0.000079 -0.001122 0.003192 -0.001983 
+0.001501 0.000814 -0.002188 -0.000487 -0.002310 -0.002491 
+-0.000113 -0.001612 0.000325 0.002294 -0.000095 -0.000175 
+0.005079 0.001389 0.000505 0.004274 -0.000358 0.000139 
+-0.000067 -0.000178 -0.000957 -0.004774 0.000922 -0.001099 
+-0.006472 -0.000136 -0.002074 -0.005233 -0.001834 -0.002378 
+0.004298 -0.001075 -0.004488 0.005234 -0.001241 -0.004963 
+0.005628 0.002876 -0.001834 -0.000326 0.004727 -0.002690 
+0.002474 0.001852 -0.000205 0.005081 -0.000234 0.000043 
+-0.000598 -0.000320 -0.002391 -0.002660 0.002237 -0.002754 
+-0.001247 0.004253 -0.003447 0.000096 0.003272 0.000927 
+0.002085 -0.001108 0.005106 -0.004855 -0.001477 0.002060 
+-0.010343 0.008805 -0.015504 -0.009668 0.020667 -0.017947 
+-0.011204 0.021107 -0.012451 -0.007406 0.015239 -0.010711 
+-0.003941 0.008964 -0.006968 0.000394 0.002546 -0.006244 
+0.001314 0.003501 -0.001148 -0.000032 0.003288 -0.001200 
+0.001531 0.003584 -0.000661 -0.000414 0.002847 -0.003741 
+-0.003373 0.005259 -0.005116 0.000938 0.000188 -0.007440 
+-0.003399 0.007999 -0.007798 -0.003205 0.002153 -0.002391 
+0.000864 0.000880 0.000869 0.004478 0.002239 -0.002761 
+0.002892 0.001593 -0.003480 -0.001084 0.004689 -0.003914 
+-0.000031 0.006147 -0.003460 -0.000837 0.006129 -0.007532 
+0.005565 0.008686 -0.003626 0.003396 0.009230 -0.008731 
+-0.000360 0.008751 -0.002688 0.003169 0.005556 0.001506 
+0.005526 0.004314 -0.004909 0.002982 0.004174 -0.009244 
+0.002127 0.003474 -0.008259 0.000296 0.002285 -0.002876 
+-0.000220 -0.000848 -0.000127 -0.000574 -0.001480 -0.000533 
+0.002722 0.000298 -0.000383 -0.000465 0.002853 -0.000064 
+-0.002108 0.001063 0.002078 -0.002823 0.001283 0.002917 
+-0.000066 -0.002403 -0.001527 0.000758 0.002944 -0.004741 
+0.006983 0.010933 -0.008457 0.008527 0.022258 -0.009253 
+0.014506 0.018090 -0.007092 0.006499 0.010008 -0.006620 
+0.000260 0.005109 -0.003289 0.001463 0.003577 0.000246 
+0.001793 0.000422 -0.001730 0.000368 -0.000011 -0.001167 
+0.001031 0.001362 -0.000553 -0.000481 0.000312 0.001199 
+0.000281 0.000428 0.002834 0.000007 -0.001329 -0.001323 
+-0.004685 -0.006449 0.002487 -0.001462 -0.000984 0.000295 
+0.000045 0.001662 0.001279 -0.001025 0.001587 0.000692 
+-0.001123 0.000597 -0.000475 0.000000 0.000000 0.000000 
+-0.000265 -0.000928 -0.000575 0.004381 0.000821 -0.002601 
+0.006165 0.001813 -0.004714 0.007009 0.003504 -0.001752 
+0.003653 0.003106 0.001127 0.002001 0.002839 -0.001920 
+0.000050 0.001345 -0.000144 -0.002344 -0.000037 0.000009 
+-0.000450 -0.000543 -0.001349 -0.004173 -0.001120 -0.001425 
+0.003949 0.008514 -0.003116 0.003949 0.006418 -0.003291 
+0.000934 0.001466 -0.000454 -0.000758 -0.001261 0.000882 
+0.000630 0.001772 -0.000039 0.002519 0.005081 0.001439 
+0.001339 0.005610 0.001148 -0.000305 0.003181 -0.001786 
+-0.004622 0.003795 -0.001006 -0.000316 0.001256 0.000112 
+0.003831 -0.002637 0.006565 0.014054 0.002881 -0.001283 
+-0.002701 0.015440 -0.009717 -0.007725 0.014755 -0.019318 
+-0.008075 0.010124 -0.019022 -0.004882 0.007377 -0.012592 
+0.002109 -0.000034 -0.007062 0.008060 -0.003145 -0.003975 
+0.004117 0.000009 0.002677 0.000200 0.004061 -0.000093 
+0.000976 0.005047 -0.001442 0.001157 0.002161 -0.000135 
+0.000638 -0.000076 0.000925 -0.000021 -0.000481 0.001314 
+0.000620 0.000495 -0.000935 0.001591 0.001884 -0.002637 
+0.001136 0.002083 -0.002083 -0.000152 0.000909 -0.001818 
+-0.001030 0.000515 -0.002424 0.000797 0.002943 -0.004292 
+0.002237 0.002592 -0.002710 0.003166 0.000823 -0.000042 
+0.004780 0.001724 -0.000147 0.005299 0.004267 -0.006377 
+0.002505 0.008662 -0.007070 0.001161 0.005058 -0.005839 
+-0.000752 0.001474 -0.002947 -0.002228 0.001030 -0.001798 
+0.001054 0.007618 -0.008402 0.004070 0.001869 -0.010675 
+-0.000984 -0.003502 -0.003421 -0.004909 -0.005780 0.002613 
+-0.004160 0.001987 0.003051 -0.000604 0.008103 -0.004428 
+-0.002989 0.007325 -0.006568 0.001500 0.000500 -0.005515 
+-0.002282 0.000151 -0.003653 -0.001826 0.000312 -0.002903 
+0.005070 0.008649 -0.007324 0.009905 0.021342 -0.010198 
+0.011163 0.026203 -0.004895 0.015117 0.019083 -0.005046 
+0.010257 0.020733 -0.009263 0.003583 0.017163 -0.000521 
+0.004191 -0.000502 -0.000824 -0.008819 -0.004945 0.002968 
+-0.009996 -0.004341 0.007054 -0.003208 -0.000377 0.003461 
+0.003458 -0.000432 -0.002540 0.004923 -0.000223 -0.004140 
+0.001215 -0.001343 -0.000448 -0.001353 -0.001489 -0.000496 
+0.001953 -0.000011 0.001611 0.005563 0.000991 -0.003372 
+0.003467 0.006687 -0.002300 0.000685 0.001860 -0.002643 
+-0.000905 0.001444 0.002696 -0.001616 -0.002675 0.006994 
+-0.002887 0.001053 0.001498 -0.001076 0.002154 0.000994 
+-0.002789 0.002865 -0.000293 -0.003929 0.000748 -0.001808 
+-0.005053 -0.002315 -0.000071 -0.004100 -0.003872 -0.001207 
+-0.001559 -0.003692 0.000260 0.000259 -0.001941 -0.005687 
+-0.000024 -0.002061 0.002871 0.000391 0.001797 0.000391 
+-0.001628 0.000549 -0.000732 -0.001088 0.000377 -0.000492 
+0.000227 -0.001570 -0.000074 0.000000 -0.001935 0.005968 
+0.001888 0.002264 0.004680 -0.000894 -0.000652 0.001901 
+-0.000947 0.000254 -0.000655 0.001258 -0.002237 0.000674 
+0.004766 -0.003882 0.007041 0.006295 0.000004 -0.006749 
+0.000909 0.021744 -0.011711 -0.007771 0.013981 -0.017392 
+-0.008333 0.006501 -0.013086 -0.002481 0.003314 -0.007636 
+0.000111 -0.000628 -0.000693 0.002137 -0.001709 -0.000442 
+0.000829 0.001725 0.001795 -0.000299 0.000288 -0.000109 
+-0.000237 0.001184 0.000137 -0.000336 0.000598 0.000568 
+0.000970 0.003563 -0.008581 0.003837 0.005313 -0.006957 
+0.003146 0.003507 -0.000529 0.003206 0.001625 0.002608 
+0.002606 0.002186 0.003542 0.004665 0.000207 0.001762 
+-0.000668 0.007636 -0.003882 -0.001498 0.005208 -0.000285 
+-0.002199 0.002651 0.001235 -0.003816 -0.001117 0.003564 
+-0.003645 -0.003637 0.001848 -0.002584 -0.000827 0.000181 
+0.002006 -0.001077 -0.001337 0.001756 0.001867 -0.001245 
+0.003155 0.003771 -0.000989 0.002846 0.005923 0.002923 
+0.006794 -0.000824 -0.002473 0.009892 0.006169 -0.001000 
+0.006359 0.003697 -0.001922 0.000984 0.000854 -0.002732 
+0.000219 0.001740 -0.001544 0.003304 0.003851 -0.002341 
+0.004607 0.007425 -0.004451 0.005416 0.006735 -0.006028 
+0.001035 -0.000446 0.000337 -0.000644 -0.001257 -0.001922 
+-0.001409 0.003530 -0.001681 0.003027 0.017265 -0.003981 
+0.007646 0.027488 -0.004917 0.010889 0.029092 -0.006402 
+0.002108 0.027321 -0.008746 -0.002922 0.016473 0.001152 
+0.006509 0.000437 0.001902 0.000752 -0.001160 -0.001564 
+-0.002779 -0.001731 0.002034 -0.003667 -0.001007 0.002605 
+-0.002227 0.000273 0.001250 -0.000703 0.000470 0.000661 
+0.001195 0.001032 -0.000272 0.000801 0.003865 -0.001149 
+-0.000184 0.004496 -0.001157 -0.000085 0.002223 0.001541 
+-0.000191 0.001897 0.002123 -0.004435 0.000456 0.000547 
+-0.000356 -0.003101 -0.000306 -0.001972 0.000273 -0.006118 
+-0.000415 -0.002582 -0.003435 0.006370 0.000889 -0.004444 
+0.001688 0.001847 -0.003271 -0.001015 0.001111 0.000286 
+-0.008072 -0.003285 0.001572 -0.005645 -0.004045 0.001067 
+-0.002969 -0.001573 -0.003028 -0.000315 -0.001102 -0.001496 
+-0.000059 -0.000088 -0.000305 -0.001165 -0.000384 0.000784 
+-0.003371 0.002361 0.001196 -0.000914 0.004614 0.000007 
+0.002527 0.004918 0.000511 -0.000479 0.001622 0.003686 
+-0.001292 0.003623 0.001559 -0.003603 0.001805 0.000677 
+-0.003825 0.001669 -0.003303 -0.001430 -0.000101 -0.002422 
+0.001247 -0.003398 0.002825 -0.000451 -0.000096 0.000259 
+-0.001247 0.007646 0.001168 -0.004024 0.008886 -0.001273 
+-0.002343 0.005118 -0.002566 0.001826 0.001882 -0.002829 
+0.007382 0.004445 -0.002796 0.008845 0.005178 -0.008127 
+-0.000893 0.000432 -0.003629 -0.001254 0.000550 0.003211 
+-0.004199 -0.001073 0.007861 -0.001700 -0.001209 -0.000311 
+-0.000406 0.001794 -0.003440 -0.001658 -0.001028 -0.002618 
+-0.003281 -0.001197 -0.002390 -0.003307 0.000400 -0.002080 
+-0.002811 0.001654 -0.000883 -0.002934 -0.002880 -0.000008 
+-0.002489 -0.005496 0.001053 -0.000635 -0.001827 0.001000 
+0.003475 0.004285 -0.002874 0.006642 0.007793 -0.005567 
+0.004624 0.006391 -0.004624 0.002615 0.000231 -0.002615 
+0.003333 -0.001655 0.000331 0.000809 0.001423 0.000112 
+-0.000585 0.004665 -0.000584 0.000419 0.006896 -0.003018 
+0.001028 0.003659 -0.005088 0.001565 0.004122 -0.001565 
+0.002061 0.003252 0.000433 0.001080 0.001935 0.000697 
+0.002292 0.001735 -0.000082 0.005075 0.001925 -0.001750 
+0.005076 -0.000263 0.002143 -0.000772 0.006511 0.000626 
+0.004384 0.004913 0.000159 -0.001700 -0.000614 0.000104 
+-0.002717 -0.002915 -0.001745 -0.001322 0.006048 -0.001703 
+0.002887 0.017096 -0.002975 0.005029 0.024018 -0.004669 
+0.004606 0.026341 -0.007471 -0.002099 0.020638 -0.010000 
+-0.003032 -0.003753 -0.004240 -0.005156 -0.008980 -0.002170 
+-0.003764 -0.001511 0.002811 0.001299 0.004663 0.001469 
+0.004120 0.004126 0.002222 0.003511 0.002462 -0.001745 
+0.001259 0.001952 0.000091 0.000753 0.001773 0.000923 
+0.001728 -0.000454 0.001196 0.003638 -0.002856 0.001284 
+0.001834 -0.004567 0.000069 -0.001109 -0.002989 0.005776 
+-0.000825 0.001327 0.003657 0.000277 0.000254 0.000524 
+0.000000 0.000000 0.000000 0.001133 -0.001552 0.000924 
+0.000310 0.000000 0.000620 0.002632 0.001530 -0.002882 
+0.000896 -0.000536 0.000031 -0.000956 -0.000570 -0.000432 
+-0.001953 -0.000234 -0.000703 -0.001152 -0.002970 -0.003051 
+0.002642 0.000955 -0.003915 0.000826 0.000000 -0.005041 
+0.002545 -0.000665 -0.002863 0.004942 0.003255 -0.001396 
+0.003319 0.003577 -0.006423 0.006848 -0.000610 -0.002303 
+0.003462 0.005452 -0.002627 -0.001204 0.001533 0.000428 
+-0.003853 0.003379 -0.000506 -0.005092 0.005047 -0.000999 
+-0.003980 0.006826 -0.000506 0.003243 0.007738 0.005931 
+-0.000298 0.006122 0.006957 -0.002627 0.004035 0.003255 
+-0.002014 0.000840 -0.002261 0.001209 0.004836 -0.005777 
+-0.004137 0.002735 -0.005720 0.002516 0.006807 -0.010064 
+-0.001484 0.005859 -0.004260 -0.002372 0.001353 0.003321 
+-0.003072 0.002352 0.003265 -0.003044 -0.000430 0.004476 
+-0.000239 -0.000314 0.000247 0.001723 0.001442 -0.001618 
+0.000604 0.000364 -0.001293 -0.000560 0.000394 -0.000852 
+0.000070 0.001839 0.000636 -0.001020 -0.000478 0.000138 
+-0.004248 -0.000876 0.000978 -0.004491 -0.000425 -0.000412 
+-0.002245 0.001401 -0.000328 0.000503 0.003359 0.000126 
+0.001968 0.001281 -0.006497 0.002858 0.001390 -0.001421 
+-0.001287 -0.000651 -0.000106 -0.003000 -0.000037 0.000016 
+-0.001559 0.003205 -0.001299 0.001892 0.006164 -0.002844 
+0.001692 0.006621 0.000015 -0.000879 0.002901 -0.003165 
+-0.001278 0.002103 -0.001031 -0.002986 -0.000910 -0.000892 
+-0.002636 -0.003566 0.000000 -0.000099 -0.001469 -0.002124 
+-0.002498 0.000331 -0.000779 0.000215 0.001404 0.001526 
+0.000616 0.006361 -0.001559 0.000703 -0.001362 -0.000134 
+-0.002564 -0.003078 -0.004788 -0.003550 0.002684 -0.001780 
+0.001058 0.014180 -0.000109 0.005256 0.022989 0.000827 
+0.006235 0.027934 0.001511 0.006266 0.024949 -0.000151 
+-0.002227 0.004845 -0.003617 -0.006901 -0.014031 -0.001817 
+-0.005172 -0.007973 0.000950 -0.001691 -0.001163 0.000793 
+0.000988 0.003143 0.000023 0.003333 0.006518 -0.002898 
+0.002513 0.007927 -0.003220 0.001905 0.005204 0.000825 
+-0.001881 0.001913 -0.000540 -0.000640 -0.000685 0.000053 
+0.002253 -0.000229 -0.001849 0.002495 0.000993 -0.003354 
+0.002037 -0.000330 -0.003304 -0.000953 -0.002004 -0.001980 
+0.000820 -0.001831 -0.000344 0.001342 -0.000510 0.001214 
+0.000939 0.000804 -0.000034 -0.002285 0.000972 0.000328 
+-0.002715 0.000659 0.001582 -0.000460 -0.000054 0.003973 
+0.000075 -0.001000 0.002208 -0.001721 -0.001309 -0.001048 
+-0.001827 0.003077 0.002170 0.000164 0.001852 -0.000422 
+0.000591 0.004960 0.000886 0.000854 0.006431 -0.000399 
+-0.000576 0.003333 0.002080 -0.000432 -0.000065 0.000022 
+0.000271 0.003214 0.001665 -0.002546 0.004868 0.000327 
+-0.004414 0.003760 -0.001350 -0.004298 0.000757 -0.003150 
+-0.002531 -0.001179 -0.000773 -0.002999 0.009631 0.008547 
+-0.003779 0.011744 0.009650 -0.003166 0.008701 0.006944 
+0.003656 0.005048 0.002205 -0.000478 0.000803 -0.003809 
+-0.001243 0.000862 -0.001776 0.004285 0.003219 -0.004969 
+0.002762 0.004979 -0.000149 -0.001057 0.001624 0.001769 
+-0.000512 0.000957 -0.000906 -0.001271 0.001271 -0.000847 
+-0.001972 0.004257 -0.003079 0.003963 0.004908 -0.005853 
+0.001534 -0.000192 -0.003333 0.003205 0.000527 -0.000906 
+0.002732 0.000757 -0.003152 -0.000503 0.003072 -0.004580 
+0.001260 0.004245 0.001376 0.002324 0.006731 0.002399 
+0.001424 0.008535 -0.001107 -0.001187 0.003071 -0.003350 
+-0.000204 0.002315 -0.001319 0.000178 0.000915 0.000100 
+0.000850 0.001425 0.000333 0.001768 0.003522 -0.000882 
+0.002460 0.005397 -0.001349 0.000034 0.005450 0.001839 
+-0.001914 0.004107 0.001045 -0.000519 0.002370 -0.001037 
+-0.001296 0.001674 0.000360 -0.000773 -0.000215 0.000923 
+-0.002496 -0.000800 0.000832 -0.000472 -0.001417 -0.003780 
+-0.000446 -0.000781 -0.002366 0.000106 0.000990 -0.001025 
+-0.000297 0.001495 -0.000516 -0.000684 -0.002136 -0.000694 
+-0.000613 -0.004740 0.001928 -0.000883 0.002878 0.000175 
+0.001004 0.014374 0.004269 0.005317 0.022384 0.006315 
+0.007425 0.025977 0.004980 0.005792 0.022739 0.006632 
+0.004944 0.003383 0.006733 -0.009398 -0.012721 0.004470 
+-0.004191 -0.010431 0.000918 -0.000838 -0.006317 -0.002878 
+-0.001545 -0.002934 -0.001537 -0.002851 -0.000322 0.004020 
+-0.003292 0.000854 0.005045 -0.001774 -0.000058 0.000509 
+-0.000872 -0.001244 0.000027 -0.001137 -0.002179 -0.000664 
+-0.000101 -0.001564 -0.000467 0.001297 -0.000321 -0.001387 
+-0.000166 -0.000580 -0.000435 -0.002306 -0.000799 0.000131 
+-0.001915 -0.000708 0.000146 -0.002142 0.000510 -0.000544 
+0.000818 0.001331 -0.004704 0.002699 0.003659 -0.005398 
+0.003016 0.005715 -0.005891 0.003994 0.004413 -0.002935 
+-0.000018 0.000588 0.001085 0.000108 -0.002744 0.003821 
+0.004166 0.003803 0.002284 0.001597 0.000945 0.003154 
+0.000997 0.002691 -0.000847 -0.000207 0.003611 0.001795 
+0.000780 0.002351 0.001191 0.002102 0.001031 0.002178 
+0.000377 0.003099 0.002093 0.000243 0.001460 0.000985 
+0.001074 -0.002218 -0.000685 0.004749 0.002934 0.001995 
+-0.006851 0.017444 0.002566 -0.007539 0.017769 0.014320 
+-0.005910 0.014134 0.013204 -0.005358 0.008182 0.008944 
+-0.002149 0.004160 0.005036 -0.001623 0.002967 0.000508 
+0.000410 0.000779 0.000935 -0.000461 0.002143 0.000956 
+0.001530 -0.001139 -0.005499 0.003309 -0.000640 -0.007523 
+-0.000476 -0.001548 -0.004881 0.001035 -0.000390 0.000571 
+-0.000136 -0.001515 0.007167 0.002245 -0.002104 0.007390 
+0.000258 -0.001371 0.002629 -0.000925 0.001183 -0.002495 
+0.002375 0.001145 -0.001639 0.001945 0.001129 0.000068 
+0.002874 0.001583 0.000190 0.003452 0.005236 -0.000866 
+0.006102 0.006946 -0.003128 0.006363 0.006760 -0.003111 
+0.000046 0.003793 0.000588 -0.001748 0.001308 -0.000459 
+-0.001370 -0.000398 -0.000409 0.000963 -0.000110 -0.000644 
+0.001575 0.000282 0.000065 0.000467 0.000274 0.000540 
+0.001180 0.002472 -0.002149 0.000708 0.004308 0.000354 
+0.001602 0.004336 -0.002969 -0.000703 0.003006 0.000832 
+-0.003798 0.002032 0.000813 -0.005364 0.000046 -0.000917 
+-0.003948 -0.000712 -0.000858 -0.002451 0.001347 -0.001148 
+-0.001724 0.000886 -0.002352 -0.002730 -0.004722 -0.001005 
+0.003803 -0.004654 -0.002195 -0.001801 0.002382 -0.000597 
+0.002102 0.015075 0.010635 0.008611 0.024948 0.014939 
+0.009732 0.031576 0.008886 0.003041 0.025719 0.004503 
+0.000719 0.001751 0.000742 -0.005279 -0.013656 0.004309 
+-0.000451 -0.008418 0.000680 -0.001108 -0.001688 -0.000131 
+-0.002482 -0.000483 0.001078 -0.001123 0.000043 0.001444 
+-0.000162 0.002456 0.001785 -0.005622 0.002169 0.003742 
+-0.006702 0.002535 -0.000408 -0.002967 -0.000121 -0.001343 
+-0.000989 -0.002874 0.002322 0.004761 -0.001190 -0.005512 
+0.004881 -0.002849 -0.007738 0.002356 -0.002549 -0.002892 
+-0.000636 -0.000433 -0.000560 -0.000803 -0.000682 0.002409 
+-0.001194 -0.000784 0.000784 -0.001364 -0.000274 0.000795 
+-0.001733 -0.002190 -0.000451 -0.001842 -0.003103 -0.002425 
+-0.001610 -0.001610 -0.001356 0.000711 0.000581 0.000714 
+-0.003504 0.000940 0.000000 0.001367 0.003395 -0.001114 
+0.004004 0.003203 -0.001430 0.002893 0.003388 -0.001138 
+0.002024 0.001170 0.001535 -0.000083 0.002094 0.003325 
+-0.001029 0.003443 0.005183 -0.003176 0.006105 0.001361 
+-0.000081 0.001931 -0.005582 0.003426 0.004768 -0.008839 
+0.004544 0.007424 -0.009104 0.005731 0.003946 -0.004620 
+-0.000603 0.004197 -0.000567 -0.001405 0.002404 -0.002643 
+0.000879 0.002513 -0.001980 0.001995 0.004312 -0.001888 
+0.005472 0.017141 -0.007459 0.123571 0.082143 0.017143 
+0.044385 0.038829 0.051208 0.006346 0.000420 0.004691 
+0.001036 0.014818 0.018263 -0.001085 0.006217 0.011640 
+-0.026341 -0.049289 0.069045 0.017538 -0.105567 0.085475 
+0.004263 -0.046342 0.074395 -0.071111 -0.016667 -0.016667 
+0.019412 0.059412 0.059118 0.031264 0.006374 0.029542 
+-0.015104 0.008237 0.044392 -0.037582 0.052527 0.041319 
+-0.001875 -0.035000 -0.001875 0.036889 -0.016667 0.018444 
+0.006000 -0.030000 0.000000 0.033867 -0.004600 -0.024333 
+0.025000 -0.017231 0.009846 -0.060253 -0.019961 -0.035302 
+-0.045667 -0.004333 -0.095667 -0.003537 0.066258 0.026054 
+0.033667 0.067333 0.021667 0.028811 -0.070108 -0.101081 
+0.028859 -0.045459 -0.051969 0.007619 -0.057619 -0.042381 
+0.014872 0.059744 -0.089487 -0.070720 0.053040 -0.023000 
+-0.005182 0.035182 0.013455 0.020145 0.021787 0.007536 
+0.045556 -0.037778 0.000000 -0.010654 -0.002876 -0.009020 
+0.045034 0.137075 0.057279 0.006971 0.008986 -0.006551 
+0.025740 -0.056805 0.022781 0.003282 -0.024279 0.042169 
+0.000134 -0.010426 0.001231 -0.000458 -0.002441 0.000631 
+0.004162 -0.003543 -0.004220 0.001651 -0.003113 -0.000768 
+0.010825 0.005333 -0.010653 0.004278 0.000674 -0.007774 
+0.001526 -0.001101 -0.001231 -0.003528 0.002216 -0.002196 
+-0.004657 0.007770 -0.005756 -0.003354 -0.001863 -0.010210 
+-0.047790 -0.077389 0.059062 0.006901 -0.032923 0.054723 
+0.020239 0.000557 -0.024232 -0.001433 0.003900 -0.013978 
+-0.009360 0.004828 0.005158 -0.007207 0.002806 0.002690 
+-0.001887 0.002376 -0.002475 0.000697 -0.000096 -0.000451 
+0.000217 -0.002161 0.003309 -0.001417 -0.001884 0.004106 
+-0.002586 0.000597 0.000579 -0.003016 0.000900 -0.002527 
+-0.002302 0.000234 -0.002507 -0.001746 -0.000098 -0.001363 
+-0.001439 0.000003 -0.004298 0.001321 0.002884 -0.005377 
+0.002840 0.003942 -0.002997 0.000586 0.001316 -0.000913 
+0.000107 -0.000676 0.000337 0.000520 -0.000131 -0.000332 
+0.004619 0.004460 -0.002336 0.008403 0.009670 -0.005615 
+0.007487 0.009065 -0.009306 0.003490 0.004291 -0.007008 
+-0.000044 0.002511 -0.004932 0.000311 0.002316 -0.003799 
+0.001145 0.001976 -0.000997 -0.000368 0.001882 -0.000941 
+0.001558 0.002403 -0.000400 0.001835 0.004627 -0.002267 
+-0.002611 0.000167 -0.010472 -0.027810 -0.010619 0.007381 
+0.039368 -0.004038 0.006813 -0.035100 -0.086000 0.011700 
+0.001098 -0.007581 0.022195 -0.006206 0.007154 -0.012873 
+-0.043333 0.023077 -0.034615 0.043144 0.028266 -0.060623 
+0.010833 -0.180833 0.085000 -0.035476 0.133095 -0.155238 
+-0.010606 0.094848 -0.116061 0.011639 0.004783 -0.005686 
+-0.020776 0.045862 -0.002874 0.011961 0.038529 0.022582 
+0.096250 0.077500 -0.038750 -0.096624 -0.042350 0.007607 
+0.107602 -0.045614 -0.092398 -0.030513 -0.035705 0.028782 
+-0.074000 0.024412 0.014647 -0.150370 -0.087852 -0.144037 
+0.000000 -0.007000 -0.002000 -0.022222 -0.021444 0.064333 
+-0.019600 0.009800 0.036000 -0.000208 -0.006375 -0.014603 
+0.025333 0.002000 0.000000 0.007188 -0.005990 -0.003846 
+-0.021231 0.106154 0.021000 0.050568 -0.037273 -0.028523 
+0.070000 -0.014201 0.003277 0.148731 0.038722 -0.037603 
+-0.015714 0.077857 0.077857 -0.070822 -0.072072 0.023816 
+0.004902 -0.071740 0.070760 -0.010569 -0.050000 0.008455 
+-0.077500 0.103000 -0.009000 -0.005492 0.011349 -0.021974 
+-0.002766 0.001305 -0.006842 0.001799 0.008620 -0.004569 
+0.005577 0.016731 -0.013618 -0.005097 0.024210 -0.034615 
+0.018879 0.012221 -0.014358 0.007644 0.005233 -0.006560 
+0.007983 0.002372 -0.002347 0.005933 0.001636 0.001620 
+0.000044 0.001296 -0.000851 -0.008949 -0.002040 0.000348 
+-0.015145 -0.005388 0.006811 -0.011351 -0.002275 0.002833 
+-0.001723 0.005076 -0.006235 -0.001304 0.001392 -0.001267 
+-0.004324 -0.001773 0.007973 -0.005144 -0.000267 0.006514 
+-0.004092 0.001200 0.001222 -0.001444 0.001372 -0.001623 
+-0.000503 -0.000980 0.000230 -0.004160 -0.003520 0.000000 
+-0.003171 -0.002891 -0.001903 -0.004936 -0.000269 -0.002064 
+-0.003668 0.002181 -0.001130 -0.001627 0.001824 -0.000511 
+0.003761 0.000870 -0.008981 0.005555 0.006699 -0.005392 
+0.004484 0.003308 -0.002095 0.002906 0.001256 -0.002392 
+0.003863 0.001231 -0.003002 0.003049 0.000487 -0.007192 
+0.007502 0.008355 -0.006697 0.009645 0.007871 -0.004478 
+0.008752 0.004437 -0.004117 0.006621 -0.002254 -0.002834 
+0.000034 -0.000860 0.000565 0.000500 0.001532 -0.000589 
+0.001896 0.003896 0.001888 0.000673 0.003167 0.001579 
+-0.000462 0.002703 -0.001502 0.000793 0.003739 -0.004298 
+0.003603 0.005395 -0.004822 -0.026946 -0.011064 0.015585 
+-0.008874 0.000162 -0.000137 -0.002709 -0.002140 -0.019745 
+-0.012243 -0.003332 -0.039744 -0.030235 -0.002213 -0.027526 
+0.171693 -0.006217 -0.013201 -0.081076 0.018017 -0.025714 
+0.000246 0.022973 0.040265 -0.010741 0.028981 0.009815 
+0.012952 0.103048 -0.087619 0.015606 -0.006818 0.036061 
+-0.025111 -0.050222 0.001111 -0.030923 -0.046385 0.001000 
+0.005098 0.083333 -0.020392 -0.056515 -0.102273 -0.067273 
+0.014889 -0.071111 -0.029778 0.050000 -0.004797 0.006716 
+0.038448 0.035095 -0.076450 0.018201 0.088466 -0.181481 
+-0.082000 -0.091000 0.123000 -0.010714 -0.060571 0.008857 
+-0.007029 -0.058571 -0.009371 0.001429 -0.059000 -0.027714 
+-0.023877 -0.006560 -0.063061 -0.031184 -0.015526 -0.007961 
+-0.021118 -0.008150 0.143008 -0.070357 0.003571 0.077500 
+-0.011783 -0.002905 0.006923 -0.017500 -0.003333 -0.030833 
+-0.104449 0.014525 0.052118 -0.015988 -0.056919 0.069070 
+0.010000 0.000000 0.066667 -0.051733 0.003667 0.085133 
+0.007501 0.026948 -0.030421 0.000530 0.007593 -0.009509 
+0.012558 0.010723 0.002393 0.009955 0.009038 -0.008907 
+0.003495 0.018950 -0.011757 -0.009805 0.004352 -0.015310 
+0.002920 0.005101 -0.006422 0.003033 0.003660 -0.005612 
+0.004775 0.003177 -0.007811 0.007244 0.003571 -0.007168 
+0.003283 0.003401 -0.003545 -0.003727 -0.000332 -0.000510 
+-0.005742 -0.002901 0.001199 -0.000184 -0.001438 0.001277 
+0.003956 -0.001935 0.000569 0.003264 -0.002725 0.000752 
+0.002397 -0.001641 -0.000449 0.001250 -0.000026 -0.001749 
+-0.000555 -0.000870 -0.002992 0.000001 -0.000683 -0.003743 
+0.001846 0.000275 -0.002327 0.001121 -0.000017 0.000908 
+-0.000465 -0.002116 0.002589 -0.004197 -0.001936 0.004608 
+-0.005341 -0.001376 0.004694 -0.004027 -0.001105 0.003000 
+0.006283 0.005569 -0.005926 0.001849 -0.001745 -0.001606 
+0.000952 0.000318 -0.004291 -0.000258 0.000895 -0.003484 
+0.002442 0.001359 -0.002071 0.003469 0.003541 0.000530 
+0.000855 0.005402 -0.002359 0.001429 0.001590 0.000547 
+0.001466 0.001373 0.000098 0.005301 0.000697 -0.002733 
+0.004919 -0.001910 -0.001167 -0.001090 -0.001510 -0.000608 
+-0.000143 -0.000912 0.002611 0.003228 0.001715 -0.001435 
+0.002140 -0.003667 -0.006205 -0.003154 0.005863 -0.013181 
+0.000677 0.000803 -0.013905 -0.007497 -0.001190 -0.002443 
+-0.007567 0.001483 0.004831 -0.006304 0.001044 0.006406 
+-0.009175 -0.001012 0.010087 -0.016686 -0.006914 0.021064 
+-0.002548 -0.012202 0.039377 -0.032504 -0.045528 0.027655 
+-0.008462 -0.033846 -0.008462 -0.044510 -0.052157 0.005098 
+-0.049608 -0.019944 0.005770 -0.011963 -0.014579 0.019706 
+-0.008824 -0.038824 0.031765 -0.037374 -0.067172 0.059596 
+-0.006684 -0.052883 0.148622 0.056522 0.034674 -0.166957 
+-0.013187 -0.001023 0.034503 -0.004755 -0.004790 0.033252 
+-0.018610 0.003583 0.007861 0.015588 0.024412 -0.030882 
+-0.028923 -0.030000 -0.043385 0.117500 -0.066875 -0.066875 
+-0.034638 -0.026085 -0.065426 -0.045789 -0.049187 -0.064450 
+-0.140259 -0.148405 0.086422 -0.019659 0.004034 -0.050398 
+-0.002407 0.004352 -0.007685 0.002481 -0.008852 0.005741 
+-0.006615 -0.004486 0.025193 -0.023694 0.007907 -0.000707 
+-0.038487 -0.027118 -0.000268 -0.020722 -0.046971 -0.022363 
+-0.036713 -0.033287 0.012563 -0.157973 0.103547 -0.030980 
+0.007766 0.034968 -0.033341 0.001212 0.004065 0.004343 
+0.006156 0.002778 0.002238 0.001242 0.002778 -0.000310 
+-0.002333 0.000423 0.002541 -0.001619 0.004744 -0.005471 
+0.001495 0.001591 -0.005173 0.000653 -0.002131 0.001379 
+-0.000669 -0.002173 0.005208 -0.004284 0.000080 0.002062 
+-0.002663 0.003463 -0.002128 0.000097 0.003063 0.000179 
+0.005093 0.000952 0.000174 0.006101 -0.001838 0.001371 
+0.003033 -0.000993 0.003003 0.001177 -0.001089 0.000276 
+-0.000226 -0.000138 -0.000086 0.000000 0.002024 -0.003180 
+-0.002389 0.002136 -0.003705 -0.001248 0.000331 -0.003744 
+-0.002015 -0.000152 -0.001169 -0.000915 -0.002034 0.000712 
+0.000667 -0.001504 0.003336 -0.002642 -0.001997 0.006574 
+-0.000418 -0.001751 0.002458 -0.000932 -0.000552 0.001289 
+0.003847 0.004671 -0.007145 -0.000588 0.005683 -0.008733 
+0.002042 0.005272 -0.009743 0.004842 0.006117 -0.004407 
+0.001782 0.002145 -0.000029 -0.001850 0.000921 0.002844 
+-0.003637 0.002201 0.002045 -0.003617 0.000862 -0.002107 
+-0.000285 -0.001043 -0.001670 0.001106 -0.000030 -0.001851 
+0.002917 0.002993 -0.003883 -0.000201 0.002648 -0.008965 
+0.003972 0.002602 -0.007285 0.004924 0.001747 -0.007225 
+0.004803 -0.002408 -0.007819 0.000327 0.003334 -0.000895 
+-0.006523 0.002121 0.001963 -0.005233 0.002585 0.005955 
+-0.002543 0.005563 0.014901 -0.000758 0.005971 0.023713 
+-0.000505 0.002166 0.021567 -0.002266 -0.001470 0.014721 
+-0.006172 -0.010575 0.010492 -0.002993 -0.019493 0.008397 
+-0.010131 -0.004710 -0.010373 -0.025393 0.004302 0.006035 
+-0.029599 -0.001022 -0.001783 0.001699 0.015478 -0.045866 
+0.043632 0.006239 -0.018675 0.005658 0.019474 -0.021360 
+-0.037857 -0.004286 0.088571 0.006429 0.000593 -0.004747 
+0.026732 0.090461 0.068860 0.012222 -0.054889 0.109778 
+0.011017 0.026613 0.026147 0.013439 0.020291 0.005241 
+0.025360 0.033366 0.004005 0.041118 -0.045342 0.047764 
+-0.003564 0.086000 0.000356 0.022792 0.054891 -0.002208 
+-0.045591 -0.012345 0.054409 -0.024860 -0.002127 0.016087 
+-0.017983 -0.004496 0.015714 -0.007195 0.008462 -0.000899 
+-0.000165 0.009809 -0.005049 0.014542 0.031477 -0.026505 
+0.018947 0.026352 -0.035008 0.017817 0.024147 -0.022776 
+-0.034179 0.007087 -0.015924 -0.039359 -0.001007 -0.009390 
+-0.014036 0.008061 0.004541 -0.006548 -0.010116 -0.001824 
+-0.003905 -0.003483 0.002398 0.001173 0.002532 -0.003615 
+0.005456 0.000578 -0.002955 0.002207 0.002619 -0.005796 
+0.000593 0.003487 -0.006932 -0.001384 0.002544 -0.003633 
+-0.004239 0.000856 0.001253 -0.007069 0.003427 0.001175 
+-0.011616 0.000238 -0.001918 -0.004046 -0.004510 0.001531 
+0.001267 -0.001982 -0.000386 0.003587 -0.000776 0.002369 
+0.000014 0.000053 0.000045 -0.004412 0.000521 -0.001613 
+-0.005984 0.003251 -0.001422 -0.004733 0.004835 -0.000998 
+-0.003457 0.003313 -0.000900 -0.000894 0.001200 0.001036 
+-0.005689 -0.003350 0.003013 -0.011441 -0.000971 0.002322 
+-0.012033 0.001320 0.003081 -0.007741 -0.000385 0.005430 
+0.001429 0.003766 0.000260 0.000695 0.003016 -0.000093 
+-0.000724 0.002326 0.000010 0.001515 0.002348 -0.000591 
+0.002460 -0.001282 -0.002529 -0.003961 -0.000445 -0.003638 
+-0.000899 -0.001858 -0.001939 -0.000094 -0.004666 0.005172 
+-0.001685 -0.001463 0.004523 0.002106 0.000640 0.000153 
+-0.001970 0.000869 -0.004376 0.000476 -0.000589 -0.007978 
+0.001048 0.004501 -0.006955 -0.004725 0.007989 -0.014922 
+0.007306 -0.002936 -0.023537 0.017168 0.001780 -0.024798 
+0.006142 0.006415 -0.009320 -0.004108 0.005031 0.004100 
+-0.003211 0.002865 0.014815 0.004199 0.011058 0.027461 
+0.125000 -0.487500 3.937500 0.512456 -1.316726 3.519573 
+0.817121 -1.774319 2.669261 -0.008120 -0.009521 0.009620 
+-0.000998 -0.012672 0.010240 0.018772 0.017757 0.021767 
+0.023637 0.001152 0.005497 -0.001743 -0.030277 -0.009117 
+-0.035450 -0.053707 0.025070 -0.043472 -0.063056 0.046806 
+0.006409 -0.022944 0.024739 0.017022 -0.006053 0.003357 
+0.014848 -0.047879 0.066061 0.009758 -0.003532 -0.002718 
+0.060387 -0.006287 -0.070446 0.155758 -0.046667 0.050606 
+0.036303 0.004848 0.096848 -0.004394 -0.000508 0.016741 
+0.040321 0.028426 -0.017114 0.074286 -0.024643 0.034643 
+0.104783 -0.019652 0.072696 0.088125 -0.067500 -0.088125 
+-0.033161 -0.056527 0.006403 -0.020925 -0.026671 0.016615 
+-0.001861 -0.003472 0.011222 0.010370 0.008148 0.005926 
+0.017708 0.009583 -0.027292 0.025656 0.030052 -0.015071 
+0.011949 0.063995 -0.030927 -0.021214 0.055856 -0.027913 
+-0.042435 -0.013673 0.014280 -0.016978 -0.046047 0.010094 
+-0.012796 -0.039894 0.014700 -0.039257 0.136249 -0.101471 
+-0.027051 0.055890 -0.004713 0.000607 -0.011034 -0.002551 
+-0.007290 -0.000483 -0.002527 -0.001793 0.000790 0.002497 
+-0.001412 0.002353 -0.001294 -0.003056 0.002227 -0.003377 
+-0.001624 0.004712 -0.004105 -0.001932 0.001584 -0.002006 
+-0.001182 -0.001340 -0.000330 0.000547 -0.002786 0.000386 
+0.000371 -0.000486 -0.002195 -0.000562 -0.000891 -0.002629 
+-0.000471 -0.000665 -0.001057 -0.001033 0.001836 0.000142 
+-0.003092 0.000734 -0.000522 -0.003273 -0.000880 -0.000345 
+-0.001090 -0.001101 -0.000278 -0.001231 0.000515 -0.003651 
+-0.004643 0.001608 -0.002593 -0.005714 0.002537 -0.002069 
+-0.009055 -0.002520 -0.000630 -0.006331 -0.002163 0.006108 
+-0.006078 0.000121 0.004119 -0.004552 0.002145 0.001527 
+-0.001289 -0.001124 0.000190 -0.001000 0.000315 0.000441 
+-0.001822 0.000491 0.001456 -0.006062 -0.000175 0.001231 
+-0.010241 -0.001090 -0.000777 -0.005905 -0.005962 -0.000881 
+-0.003928 -0.003362 0.000638 -0.000440 -0.003095 -0.001036 
+-0.001532 -0.003104 -0.003588 0.001512 -0.001728 -0.003944 
+0.001409 0.005825 -0.006499 -0.000794 0.026306 -0.022757 
+0.001922 0.027568 -0.053855 0.006979 0.004775 -0.030083 
+0.000684 -0.000179 -0.001645 -0.004395 0.005754 0.007632 
+0.000080 0.004920 0.028248 1.158076 0.130584 4.553265 
+1.663391 -1.027027 4.358722 1.817972 -2.135945 3.721198 
+1.687688 -2.750751 2.915916 0.003363 -0.025227 0.017618 
+0.004226 -0.004293 0.013771 0.009785 0.007369 0.021866 
+0.006071 -0.019534 -0.010091 0.006972 -0.087671 0.021787 
+-0.022023 -0.067354 0.060472 0.001418 -0.096954 0.023692 
+0.021242 -0.113046 0.095111 -0.020778 0.006179 -0.015991 
+0.040394 -0.049303 0.025760 0.056154 -0.054122 -0.012027 
+-0.016100 -0.032200 0.001000 -0.016158 -0.034895 0.004263 
+0.010715 -0.016038 -0.009419 0.010281 0.011558 -0.002576 
+-0.010078 -0.009180 0.015477 0.101429 -0.115952 -0.028968 
+0.060500 0.060500 -0.080000 0.189083 0.009530 -0.081835 
+0.040516 0.002629 0.011764 -0.027979 -0.038554 -0.033927 
+0.020038 -0.013568 -0.009485 -0.017394 0.000514 -0.004708 
+-0.019998 0.012507 -0.001643 -0.000148 -0.024799 0.005564 
+-0.004763 -0.030779 0.014023 -0.037624 -0.032899 0.009563 
+-0.050225 -0.034827 0.005885 -0.071031 -0.032362 0.016265 
+-2.920455 -6.318182 -2.965909 -2.254902 -4.941176 -1.245098 
+-3.151899 -9.354430 -1.050633 0.004515 -0.059809 0.018559 
+0.004226 0.003197 -0.009519 0.000968 -0.000440 -0.000753 
+0.005288 0.009879 -0.002727 0.003377 0.003381 -0.004564 
+-0.000861 0.000383 -0.001011 -0.000094 0.007913 0.003178 
+0.000458 -0.000099 -0.000467 0.001139 -0.003534 -0.002065 
+0.000793 -0.000307 -0.001584 -0.003756 0.002391 -0.000571 
+-0.002896 0.000768 0.003539 -0.004210 0.001150 0.001811 
+-0.004235 -0.000168 0.000423 -0.004196 0.003500 -0.001049 
+-0.005146 0.005826 -0.002768 -0.004264 0.004457 -0.004845 
+-0.002301 0.002857 -0.006376 0.000168 0.001603 -0.006672 
+0.000715 0.002894 -0.002675 -0.003733 0.000193 -0.000317 
+-0.002307 0.001253 -0.001343 -0.002482 0.002802 0.001394 
+-0.002263 0.004210 0.001575 -0.001891 -0.001290 -0.004539 
+0.001249 -0.000786 -0.000837 0.003594 0.002808 0.000471 
+0.003500 0.003955 -0.001251 0.001681 0.000493 -0.000264 
+0.002288 -0.002033 -0.001573 0.000687 -0.003514 -0.000638 
+0.000074 -0.000238 -0.002941 0.000244 0.005199 -0.003916 
+0.005495 0.012793 -0.012610 0.018583 0.007855 -0.022782 
+-0.004550 -0.012554 -0.020364 -0.003736 -0.004928 -0.027201 
+-0.003511 -0.014318 0.000534 -0.000633 0.007972 0.008737 
+0.996212 1.045455 4.246212 1.917275 0.527981 5.002433 
+2.655844 -0.530303 4.735931 3.182796 -1.962366 4.104839 
+3.215859 -2.876652 2.964758 0.024381 -0.014563 0.018163 
+0.009863 -0.001899 0.014788 -0.000793 -0.001742 0.015890 
+-0.001440 -0.020862 0.027319 0.029766 0.009078 0.038932 
+0.013611 0.005041 0.042368 0.032737 0.008515 0.049216 
+0.042250 0.006766 0.019162 0.005854 0.024089 0.021299 
+0.007961 0.009461 -0.006701 -0.013333 0.003647 0.006252 
+0.003505 -0.005291 -0.003010 0.057265 0.000427 -0.113675 
+0.030417 0.026042 0.043333 0.074292 -0.020530 0.023781 
+0.036579 0.038553 0.037368 0.071238 0.122573 0.051092 
+0.122454 -0.060297 0.043363 0.027975 -0.008876 0.002590 
+-0.021471 -0.003645 0.006642 0.024205 -0.021030 0.021811 
+0.017823 -0.052016 0.029201 -0.005186 -0.011791 0.007955 
+0.018325 0.032150 -0.010609 0.033504 -0.030171 -0.018419 
+0.055910 -0.112251 -0.030995 10.114754 -8.114754 -0.459016 
+-0.100000 -4.422222 2.688889 -4.142857 -4.642857 2.112245 
+-2.075472 -5.905660 -0.830189 -1.373984 -6.528455 -1.520325 
+-1.771028 -7.845794 -1.345794 -0.018045 -0.023424 0.005565 
+0.006391 0.006761 -0.011147 0.000925 -0.004599 -0.001977 
+-0.000879 0.013579 -0.003877 -0.016624 0.015477 -0.004920 
+-0.009451 0.007372 0.005408 -0.007157 -0.008365 0.007071 
+0.001045 -0.002732 0.001460 -0.001016 -0.002492 -0.004275 
+0.000084 0.001996 0.000075 -0.003241 0.004068 0.002430 
+0.000710 0.001316 -0.000191 -0.002963 0.002601 0.004660 
+-0.004242 0.001506 0.002086 -0.005983 0.003080 0.000773 
+-0.006295 0.004096 0.002065 -0.006303 0.002424 0.001087 
+0.000570 -0.000358 -0.002102 0.002137 0.001686 -0.006392 
+0.004311 0.001358 -0.006526 -0.002537 0.001902 -0.005691 
+0.000557 0.002881 -0.000542 -0.005188 -0.000911 0.001377 
+-0.007682 0.003834 -0.009788 -0.004299 -0.002241 -0.006933 
+0.004304 -0.000584 -0.001608 0.002086 0.004945 0.000163 
+0.003298 0.003198 0.003090 0.001468 0.003138 -0.002918 
+0.000779 0.003490 -0.008701 0.000797 0.007058 -0.003025 
+0.001473 0.005911 -0.005359 0.002886 0.000421 -0.007103 
+-0.000441 -0.004796 -0.005857 0.001766 0.000274 -0.001859 
+0.008196 0.006682 -0.020094 -0.016315 0.037027 -0.058290 
+-0.002972 0.007413 -0.036829 0.005465 0.006428 0.016835 
+2.121739 0.539130 4.313044 2.621381 0.075724 4.719377 
+3.132468 -0.841558 4.516883 3.716157 -1.986900 3.436681 
+0.032461 -0.012146 0.013193 0.022322 0.006997 0.007151 
+0.008527 0.007516 0.010455 0.000676 0.007018 0.004661 
+0.001101 0.001468 0.001115 0.008583 0.003332 0.002493 
+-0.004575 -0.004985 0.031863 0.043643 -0.007382 0.046298 
+0.013715 0.030082 -0.000834 0.005691 0.022450 -0.010398 
+0.013900 -0.024984 -0.005247 -0.045087 0.015470 0.033484 
+-0.030909 -0.010105 -0.050524 -0.005186 -0.007516 -0.005776 
+-0.060308 -0.103846 0.034462 -0.025826 -0.067478 -0.038043 
+-0.027583 -0.004150 0.008918 0.024145 0.052493 0.074957 
+0.040059 -0.048550 0.054724 -0.001637 -0.082864 0.019953 
+-0.000190 -0.029061 0.013022 0.025764 -0.019519 -0.009889 
+0.009239 -0.042805 -0.004423 0.002580 0.008518 0.013873 
+-0.004499 -0.009384 -0.026094 0.078778 -0.054420 -0.029153 
+-6.465117 -11.720930 2.558140 -0.500000 -8.637931 1.465517 
+-0.487603 -6.512397 -0.140496 -1.043956 -5.912088 2.049451 
+-0.948207 -6.318725 0.119522 -0.873016 -6.688889 -1.523810 
+-0.956522 -5.496377 -1.456522 -0.014209 -0.016787 -0.004251 
+-0.003144 -0.004058 -0.003829 0.003280 -0.002176 -0.002603 
+-0.005036 0.016530 -0.006060 -0.010989 0.010163 -0.000580 
+-0.007810 -0.010369 0.008220 -0.003328 -0.011848 0.001374 
+0.000761 0.005696 -0.002848 -0.002462 0.009977 -0.002423 
+-0.001864 0.002921 0.003558 -0.004902 -0.001741 0.004644 
+-0.002337 0.000417 0.002523 -0.000640 0.002907 -0.001667 
+-0.001733 0.000366 -0.001560 -0.000077 0.000774 0.000766 
+-0.004968 0.000471 -0.000326 -0.003860 -0.001877 0.006201 
+-0.001486 0.002613 0.000893 -0.000443 0.002126 0.000669 
+-0.001714 0.001429 -0.006715 -0.000445 0.002852 -0.003317 
+-0.002583 0.000506 -0.003023 -0.007107 -0.000389 -0.002528 
+-0.004256 0.000869 -0.007106 -0.002160 0.001631 -0.001168 
+0.004705 0.004307 -0.005999 -0.000851 0.002735 -0.000452 
+-0.000025 0.002278 -0.000243 -0.001227 0.002714 -0.003012 
+-0.002325 0.003966 0.001727 0.001920 0.010093 0.001441 
+0.004750 0.002054 -0.001668 -0.000059 -0.001976 -0.003853 
+-0.002416 -0.003248 -0.000291 0.000071 0.003289 0.003330 
+0.005230 0.007637 -0.015732 -0.004956 0.009216 -0.049374 
+-0.011262 0.009181 -0.031583 0.006490 0.005393 0.015697 
+2.553846 -0.019231 3.215385 3.153846 -0.678930 3.287625 
+3.427928 -1.815315 2.585586 0.029629 -0.025692 0.006531 
+0.009993 -0.004436 -0.000127 -0.001967 0.014552 0.007519 
+-0.011592 0.015469 0.004562 -0.015704 0.008104 -0.004834 
+-0.042703 0.002152 -0.016424 0.042979 0.010603 0.008368 
+0.016963 0.003252 0.017310 0.011367 -0.001544 0.012111 
+-0.001549 0.035971 0.017288 -0.000714 -0.006826 -0.029579 
+0.051345 -0.088264 0.037897 0.035042 -0.046639 -0.000790 
+-0.001028 0.044943 0.016156 0.002906 0.001234 0.002607 
+-0.028666 -0.016725 0.004776 -0.050325 -0.062906 -0.029167 
+-0.084744 -0.157339 0.041157 -0.001022 -0.089892 -0.017818 
+-0.011425 -0.053783 -0.002299 0.019812 -0.059911 -0.000953 
+-0.029405 -0.068532 -0.009841 -0.000821 -0.012094 -0.051438 
+0.029105 -0.016878 -0.032009 -0.012097 0.029890 0.015855 
+-0.009240 -0.042324 -0.007451 0.041362 -0.062009 -0.019185 
+-9.932203 -3.491525 8.288136 -11.563380 -5.450704 2.971831 
+-1.803279 -6.368853 -0.573770 -0.523810 -6.037037 0.476190 
+-0.723022 -6.230216 -0.892086 -0.559375 -6.271875 -1.859375 
+-0.575875 -4.159533 -1.712062 -0.001774 -0.011658 -0.009942 
+0.002160 -0.004576 -0.000863 0.001065 0.002382 -0.006181 
+0.012631 0.020263 -0.009245 0.005226 -0.006668 -0.000109 
+0.001988 -0.015890 -0.002545 0.003330 -0.001372 0.001351 
+0.001579 0.011028 0.000277 -0.003486 0.007522 0.001307 
+-0.000252 0.000381 0.001341 -0.003352 -0.005062 -0.000067 
+-0.004480 -0.002388 -0.003582 -0.000190 -0.003876 -0.000637 
+-0.002351 -0.003238 -0.001507 -0.002051 -0.000684 0.001912 
+-0.002637 0.000298 0.002126 -0.001921 -0.000483 0.002597 
+-0.004834 -0.003656 -0.000009 -0.003431 0.001448 -0.000041 
+-0.000447 0.001567 0.001951 0.000820 0.001095 0.000012 
+-0.000739 -0.001520 -0.002343 -0.002617 -0.002745 -0.003958 
+0.000144 0.005392 -0.002373 -0.001722 0.000129 -0.003358 
+-0.001173 0.000936 -0.003245 -0.001061 0.000028 -0.002346 
+-0.002809 0.000556 0.000244 -0.000806 0.002748 0.003374 
+-0.002896 0.005130 0.002138 -0.003015 0.003349 0.001674 
+0.002248 -0.000186 -0.000935 0.001707 0.002466 -0.000542 
+-0.000827 0.000016 0.004264 -0.000214 0.000161 0.003927 
+0.001131 0.003794 -0.009231 -0.001470 0.004327 -0.019264 
+-0.006639 0.002514 -0.009210 -0.002969 -0.001257 0.000524 
+0.006405 -0.000377 0.008987 0.015499 -0.001750 0.005351 
+0.017811 -0.005775 -0.005160 0.010513 -0.012592 -0.016165 
+-0.006931 -0.006185 -0.013821 -0.017807 0.011082 -0.003051 
+-0.026134 0.016299 -0.000653 -0.030040 0.009945 -0.005829 
+-0.091868 0.000502 -0.029899 0.043943 -0.010895 0.000024 
+0.032217 0.045907 -0.020758 0.001034 0.018419 0.002302 
+0.003372 -0.027467 0.004671 0.024701 -0.053028 -0.003016 
+-0.051429 -0.002314 0.084943 0.015669 -0.024369 -0.035164 
+0.031626 0.059333 -0.040662 0.029722 0.026091 -0.007412 
+0.011676 0.007681 0.000819 -0.021719 -0.004984 -0.010212 
+-0.052469 -0.028643 0.030874 -0.027525 -0.110000 0.007180 
+0.002226 -0.001980 -0.008827 -0.011805 -0.026536 0.021059 
+0.009939 -0.098515 0.008394 0.002163 -0.008767 -0.007309 
+0.010999 0.031330 0.012499 -0.041194 0.013354 0.005902 
+-0.027130 -0.017508 0.016610 -0.001723 0.009517 0.001413 
+-0.075967 -0.029641 0.000046 -0.019359 -0.062783 -0.017340 
+-0.011652 -0.051896 -0.007105 -0.375691 -5.508287 0.165746 
+-0.417625 -5.750958 -1.758621 -0.407143 -5.553571 -2.417857 
+-0.529680 -3.141552 -1.908676 0.000300 -0.002316 -0.009778 
+0.002597 0.000584 -0.006696 0.013586 0.009715 -0.017476 
+0.007460 0.004856 -0.011719 0.007006 -0.000800 -0.001688 
+0.009083 -0.004646 -0.006146 0.010458 0.005821 0.003292 
+-0.001859 0.005122 0.001093 -0.001233 0.001915 -0.000311 
+0.000002 -0.000097 -0.000217 -0.000447 0.000472 -0.000128 
+-0.001871 -0.001125 -0.001685 0.003538 0.000154 -0.001692 
+0.002064 -0.000502 -0.004740 0.003771 0.000130 -0.003054 
+-0.002233 -0.006698 -0.001860 -0.000469 -0.004691 -0.005160 
+-0.007647 -0.004980 -0.002264 -0.004710 -0.002833 0.000631 
+-0.001638 -0.000460 0.001692 -0.003116 -0.000036 -0.000036 
+-0.004601 -0.002690 -0.002052 -0.005631 -0.004017 -0.002989 
+-0.001318 0.000565 -0.006667 -0.002157 -0.000540 -0.003698 
+-0.000310 -0.003218 -0.004932 0.000081 -0.001647 -0.002165 
+-0.000924 0.001976 0.003739 0.000169 0.004117 0.003967 
+-0.000188 0.002978 0.000411 -0.001304 0.002407 -0.001993 
+-0.000779 0.003181 -0.004983 0.001467 0.003749 -0.004563 
+0.001233 0.000998 -0.002441 -0.001519 -0.001289 0.001437 
+-0.004916 -0.002936 0.004464 -0.004478 -0.004728 0.001985 
+-0.007620 -0.003689 -0.002870 -0.008911 0.002678 -0.006313 
+-0.010208 0.005107 -0.009791 -0.008660 0.001601 -0.008935 
+-0.004428 0.001933 -0.003213 -0.001283 0.000244 0.000204 
+-0.000944 0.001306 0.000389 -0.003788 -0.006779 -0.002301 
+-0.008983 -0.005689 -0.001526 -0.000725 -0.004978 0.012077 
+-0.007300 0.015481 -0.018070 -0.016812 0.020903 -0.042916 
+0.009269 0.001220 -0.032500 0.002224 0.003666 -0.010741 
+0.036695 0.007316 0.019972 0.039000 -0.009702 0.071549 
+-0.029962 0.000363 0.003446 -0.012009 0.021808 -0.047373 
+0.024428 0.034028 -0.076289 0.013413 0.001988 -0.039465 
+-0.005485 0.004963 0.011755 -0.016644 0.004498 0.008501 
+-0.007348 -0.003780 -0.017054 0.012997 -0.021035 -0.077509 
+-0.021636 0.074814 -0.052280 -0.032990 -0.045953 0.011785 
+-0.028520 0.002593 -0.002632 -0.007202 0.008393 0.005288 
+-0.004936 0.021202 0.001812 -0.036206 -0.008976 0.008029 
+-0.013577 -0.036800 0.012281 -0.050943 0.033517 0.010376 
+-0.094877 -0.034077 -0.000426 0.084068 -0.019834 -0.061259 
+-0.013209 -0.043326 0.010228 -0.983607 -5.469945 -0.060109 
+-0.513619 -5.797666 -2.214008 -0.582645 -5.698347 -2.508265 
+0.001351 -0.018097 -0.021954 -0.002713 0.006857 -0.006938 
+0.000759 0.006662 -0.006407 -0.002190 0.013228 -0.006410 
+0.001544 0.006792 -0.014437 0.003536 0.007442 -0.002343 
+0.009788 0.001714 -0.003136 0.001032 0.000149 0.000607 
+-0.004840 0.001997 -0.008492 -0.001476 0.002983 -0.008546 
+0.001373 0.000670 -0.000692 -0.003150 -0.000945 0.000236 
+-0.001516 0.001843 -0.000542 0.005104 0.006051 -0.004223 
+0.011496 0.006284 -0.006438 0.002893 -0.002948 0.001438 
+0.001478 -0.006837 -0.004378 -0.005031 -0.002725 -0.004881 
+0.001051 -0.003416 0.002701 -0.003064 0.000555 -0.002629 
+-0.001221 -0.002473 -0.003033 -0.001236 -0.002618 -0.001981 
+-0.005411 -0.003371 0.000018 -0.006453 -0.002357 0.002581 
+0.000312 0.002495 -0.005172 -0.001135 -0.005899 -0.006005 
+0.000852 -0.008543 -0.006486 0.012122 -0.001837 -0.004164 
+-0.005300 0.012440 -0.001513 -0.005815 0.012799 0.002329 
+-0.006306 0.005722 -0.000245 -0.003100 -0.000692 0.001726 
+-0.000435 0.000322 -0.004304 0.005831 0.000693 -0.006304 
+0.005495 0.003014 -0.008685 0.004242 0.004140 -0.001471 
+-0.000690 0.000288 0.005227 0.001947 -0.002974 0.005800 
+-0.015606 -0.002943 0.002129 -0.005223 -0.008513 -0.002808 
+-0.002013 -0.001514 0.000230 -0.000541 -0.001313 -0.000395 
+0.004029 0.004254 0.006723 0.015822 0.014631 -0.014930 
+0.000193 0.037373 0.002052 -0.009973 0.004755 0.000091 
+-0.014010 -0.006854 -0.003297 -0.013661 -0.001511 0.006013 
+0.003541 0.001093 0.000595 0.013315 0.011423 -0.027613 
+0.014683 0.016122 -0.030309 0.015866 0.009321 -0.016069 
+0.017159 -0.000168 -0.010053 -0.002586 0.001128 -0.004198 
+-0.003546 0.000162 -0.002099 -0.001977 0.000446 -0.001477 
+-0.003355 0.000020 0.000093 -0.001360 0.001284 -0.003304 
+0.006117 0.003852 -0.008745 0.013874 0.010831 -0.012905 
+0.021536 0.020136 -0.022258 0.001385 -0.000388 -0.018732 
+-0.052725 -0.010546 0.004747 -0.049780 -0.135551 0.044477 
+0.041018 -0.132129 0.037103 0.102393 -0.063214 -0.016571 
+0.001942 0.024130 -0.001551 0.004746 0.000478 -0.004290 
+0.001629 -0.015192 0.018615 0.058462 -0.022309 0.001829 
+0.011496 -0.010241 0.000913 0.052612 0.045584 -0.039144 
+-0.022124 -0.032530 0.023783 -1.429379 -5.435028 -0.062147 
+-0.742857 -5.734694 -2.436735 -0.772947 -5.270531 -2.613527 
+-0.004034 -0.004222 -0.019916 -0.006629 0.023837 -0.009116 
+0.006295 0.021803 -0.014388 0.005448 0.020218 -0.017191 
+0.006780 0.005943 -0.011134 0.006351 0.006191 -0.005387 
+0.002802 0.000002 0.000622 -0.003589 -0.000943 -0.003784 
+-0.002609 0.002241 -0.005247 -0.000134 0.002693 -0.006062 
+-0.004339 -0.000212 -0.002275 -0.004393 -0.001007 -0.001424 
+-0.003623 -0.001338 0.000694 0.000020 -0.000569 0.000519 
+0.001797 0.001398 -0.000220 -0.002489 -0.000476 -0.002457 
+-0.003557 -0.001309 -0.004737 -0.000018 -0.000871 -0.002257 
+0.000185 -0.001597 -0.001806 0.000244 -0.001585 -0.002563 
+0.002764 0.000244 -0.002764 0.002477 -0.001454 -0.001863 
+-0.000373 -0.001037 -0.000545 -0.003873 -0.001286 0.001381 
+-0.001205 -0.003868 -0.004901 0.001179 -0.008478 -0.006773 
+0.001959 -0.005964 -0.009075 -0.002994 0.008143 -0.002755 
+-0.006337 0.014477 -0.001548 -0.005538 0.015716 0.002483 
+-0.004751 0.010143 0.000452 -0.000967 0.001683 -0.000882 
+-0.001558 -0.000053 -0.006503 0.002258 0.000396 -0.005023 
+-0.003528 0.007136 -0.002098 0.001816 0.005070 -0.001104 
+0.000244 0.002033 -0.000369 0.001454 -0.005086 -0.000962 
+-0.006746 -0.003533 -0.000263 -0.001864 -0.003206 -0.001792 
+0.005054 -0.003834 -0.000697 0.006222 -0.004440 0.005779 
+0.011723 0.005396 0.013358 0.002366 0.015619 0.009476 
+-0.003980 -0.013177 -0.008493 -0.006762 -0.030811 -0.018741 
+-1.270440 -3.716981 -1.283019 -0.015848 -0.025000 -0.014981 
+-0.010034 -0.005688 -0.002379 0.005718 0.002427 0.003092 
+0.007587 0.002211 -0.014525 0.004278 0.001954 -0.011035 
+-0.002808 0.001235 -0.002690 -0.008328 0.000918 0.003084 
+-0.008814 -0.003664 0.005699 -0.006351 -0.005342 0.009667 
+-0.006799 -0.004994 0.010718 -0.005970 -0.005334 0.007400 
+-0.001885 -0.003209 0.003746 0.003031 0.001935 -0.001876 
+0.000764 0.000819 -0.003097 -0.014042 -0.007092 0.009567 
+-0.010256 -0.012786 0.009082 0.004888 -0.022998 0.014849 
+0.027027 0.012149 -0.004252 0.028340 0.010479 -0.000489 
+0.037675 0.009123 -0.021823 0.006708 -0.014055 -0.010039 
+-0.010005 -0.015076 0.013168 16.617647 -3.911765 -13.205882 
+0.063100 -0.017500 -0.031560 0.031242 0.031456 -0.026896 
+-0.018817 -0.020571 0.017767 -1.365269 -4.790419 -0.299401 
+-1.059908 -5.115207 -2.866359 -1.120690 -2.804598 -2.798851 
+-0.011089 0.013133 -0.016862 -0.010401 0.024094 -0.007486 
+-0.011105 0.019381 -0.020193 0.002602 0.015102 -0.002361 
+0.002926 -0.005885 -0.011165 -0.003568 0.000113 -0.002237 
+-0.002848 0.000428 -0.002053 -0.003571 0.001067 -0.003679 
+-0.002802 0.002181 -0.005133 -0.003787 0.004092 -0.003339 
+-0.005054 0.001270 -0.003890 -0.000395 -0.000431 -0.000170 
+0.002068 -0.001135 -0.001291 0.001461 -0.000288 -0.000547 
+-0.002211 0.005899 -0.003767 -0.005578 0.008375 -0.007402 
+-0.001999 0.006762 -0.006954 -0.001859 -0.000895 -0.003601 
+0.000070 -0.001701 -0.000944 -0.003509 0.000283 0.000981 
+-0.001860 0.004951 -0.002829 -0.002834 0.002939 -0.000186 
+-0.003634 -0.000337 0.000513 -0.006794 -0.001818 0.003332 
+0.000625 -0.008612 -0.009041 0.005794 -0.007704 -0.006845 
+0.005588 0.002283 -0.001732 -0.000291 0.011537 0.006930 
+-0.003577 0.012797 0.006127 -0.001636 0.009875 0.001535 
+-0.002110 0.001880 0.002757 -0.000669 -0.001727 0.002448 
+-0.002029 -0.001116 -0.002942 0.000586 0.003730 0.001053 
+-0.006448 0.005645 0.005038 -0.002534 0.003358 -0.004127 
+-0.000880 0.001814 -0.005546 0.003026 0.006160 -0.009815 
+0.014859 0.008701 -0.000511 0.004981 0.005319 0.002068 
+0.002699 0.000825 0.001550 0.005239 0.002096 0.007025 
+-0.008236 0.007702 0.000437 -0.007339 0.002641 -0.011161 
+-0.658683 -4.059880 -2.173653 -0.625000 -5.343750 -2.449219 
+-0.765957 -5.450355 -2.340425 -0.950413 -4.900826 -1.917355 
+-0.994652 -3.561497 -0.914438 -0.010113 -0.012242 -0.006212 
+-0.000220 -0.002818 -0.003615 -0.000019 -0.001453 -0.006245 
+-0.005188 0.002721 -0.002711 -0.004220 0.000751 -0.002143 
+-0.005473 0.000295 0.003241 -0.003466 -0.004063 0.005070 
+-0.000038 0.000267 0.003542 -0.000149 0.002479 0.006111 
+-0.000313 0.000106 0.005374 0.003180 -0.000385 0.000464 
+-0.000648 0.000133 -0.001811 -0.000683 -0.000533 0.000129 
+-0.000852 -0.009139 0.006482 0.010804 0.013294 -0.004947 
+-0.003628 0.010817 -0.011686 -0.002732 0.005518 -0.005059 
+-0.001196 -0.048226 0.021700 0.016016 -0.020790 -0.005921 
+-0.012251 -0.014788 0.004537 0.018236 -0.025829 0.011044 
+0.024590 -0.024691 -0.031294 0.029426 0.024465 -0.024953 
+-0.013309 -0.017046 0.012269 -1.464286 -3.946429 -0.505952 
+-1.403141 -3.937173 -3.057592 -0.021736 -0.003679 -0.018522 
+-0.013858 0.021989 -0.011109 -0.004200 0.010553 -0.004014 
+-0.010791 0.006845 -0.004694 0.002150 0.007036 -0.005530 
+-0.006250 -0.008400 -0.012999 -0.005297 -0.010935 -0.003847 
+-0.000602 -0.005367 -0.001116 -0.001335 0.000109 -0.001556 
+-0.002915 0.002627 -0.004389 -0.001067 0.002480 -0.005272 
+-0.000482 0.000993 -0.001390 0.000713 -0.002996 -0.000075 
+0.001760 -0.003382 0.000017 -0.001416 0.002728 0.000292 
+-0.005171 0.008235 -0.001511 -0.004832 0.006826 -0.001350 
+-0.000998 -0.000288 0.002234 0.000850 -0.001932 0.001737 
+0.000401 -0.001337 0.000245 0.002027 0.003653 -0.002377 
+-0.000764 0.006213 -0.002429 -0.002211 0.004453 -0.002953 
+-0.005943 0.003268 0.005171 -0.001593 0.002724 0.006168 
+-0.000378 -0.003322 -0.015077 0.005362 0.001755 -0.005871 
+-0.003324 0.008284 0.003860 -0.004974 0.013181 0.007970 
+-0.003981 0.011121 0.006741 -0.001108 0.006789 -0.000305 
+-0.000566 -0.002982 0.001879 -0.006385 -0.003502 0.003038 
+-0.001677 0.006842 0.003146 0.000808 0.011494 -0.001167 
+0.002767 0.005361 -0.000692 -0.004883 0.001491 -0.003425 
+-0.000946 -0.000326 -0.002320 0.005731 0.007433 0.000340 
+0.009194 0.012204 0.004921 0.002429 0.000711 0.000116 
+0.004111 -0.001772 0.004078 -0.009646 0.012114 0.002580 
+-0.019567 0.036754 0.007930 -0.002764 0.004866 -0.006296 
+-0.460870 -3.947826 -1.456522 -0.353261 -5.317935 -1.899457 
+-0.455189 -5.587264 -1.978774 -0.648000 -5.298666 -1.786667 
+-0.807143 -4.528572 -1.346429 -0.727273 -3.348485 -0.676768 
+-0.002267 -0.014994 -0.000116 0.005391 0.009607 -0.000961 
+-0.000623 0.010935 -0.000924 -0.001516 -0.001564 0.000839 
+0.004254 -0.003360 0.000993 0.004213 -0.001157 -0.000075 
+0.003187 0.001529 0.003455 0.004758 0.000250 0.003042 
+0.005176 -0.001687 0.004187 0.003874 0.003059 0.003962 
+0.003675 0.006198 0.000688 0.000109 -0.000412 0.000600 
+0.002796 -0.001672 0.002819 0.002651 0.010121 -0.010953 
+0.001273 0.007757 -0.011762 0.012063 0.014937 -0.008986 
+0.003308 0.001238 -0.009478 0.005855 -0.006722 -0.014090 
+0.003927 -0.002150 0.003678 -0.043584 -0.045018 0.047850 
+0.013006 0.003153 -0.014140 0.027209 0.035489 -0.032519 
+-0.008936 -0.013527 0.010468 -1.128571 -3.414286 0.476190 
+-0.994595 -3.578378 -1.972973 -0.017963 0.000666 -0.016508 
+-0.009952 0.023036 -0.006644 -0.011997 -0.004459 -0.003525 
+-0.004280 0.005212 -0.005437 -0.005270 0.006011 -0.006869 
+-0.005221 -0.010552 -0.003542 -0.006952 -0.015386 0.001457 
+-0.003019 -0.012480 0.001948 -0.002249 -0.006490 0.002193 
+-0.002169 -0.004523 0.002899 -0.001332 -0.002613 0.003134 
+0.004346 -0.002792 0.000811 0.004828 -0.004844 0.001837 
+0.002470 -0.000143 0.002100 -0.004705 0.004682 0.004934 
+-0.005229 0.005976 0.003456 -0.003939 0.003594 0.002758 
+-0.000950 0.000371 0.003131 -0.001626 0.000791 0.002044 
+-0.001587 0.001007 0.000672 -0.002032 0.001122 -0.004548 
+0.002102 0.003153 -0.004733 0.000978 0.000597 -0.000507 
+-0.003200 0.003572 0.000465 -0.005038 -0.005038 0.005909 
+0.001574 0.004530 -0.004457 -0.004470 0.006848 0.002187 
+-0.006400 0.009369 0.003494 -0.004135 0.007503 0.002409 
+-0.000373 0.000934 0.001370 0.000254 -0.001139 -0.004890 
+0.002825 0.000002 -0.004946 -0.002443 -0.000624 0.000679 
+-0.004137 0.004290 0.004707 -0.002346 0.009495 0.001394 
+0.002705 0.005985 -0.002978 0.002711 -0.000387 -0.001715 
+0.000258 0.003996 -0.001135 0.004870 0.008706 -0.001328 
+0.008441 0.004266 -0.004783 0.003711 -0.004363 -0.011189 
+-0.004891 -0.001698 -0.008360 -0.020994 0.009320 0.000914 
+-0.020446 0.025744 0.004451 0.002623 -0.010150 0.001768 
+0.190476 -4.583333 -0.484127 0.087940 -5.517588 -0.989950 
+-0.163090 -5.656652 -1.255365 -0.431235 -5.428905 -1.407925 
+-0.564417 -4.871166 -1.389571 -0.465116 -3.874418 -1.023256 
+-0.001194 -0.021497 0.004132 -0.000973 0.002742 -0.000799 
+0.005776 0.012776 -0.002667 0.005754 -0.000223 -0.003417 
+0.001745 -0.003883 -0.003188 0.001570 0.002893 -0.000083 
+-0.001463 -0.002223 0.002395 0.001500 -0.009041 0.006140 
+-0.002455 -0.005127 0.001067 -0.002539 0.001246 -0.000221 
+-0.003454 0.005036 -0.001494 -0.000005 -0.000270 -0.000509 
+0.002444 0.001458 -0.000618 -0.003088 0.006610 -0.003454 
+-0.004694 0.004830 -0.004232 0.003906 0.004574 -0.000302 
+0.008033 0.002337 -0.002219 0.001249 0.000312 0.003395 
+-0.009043 -0.007233 0.011268 -0.008389 0.020016 -0.012173 
+2.582524 6.776699 -8.796117 0.007756 0.021448 -0.018340 
+-0.413386 -1.602362 1.897638 -0.558304 -2.773852 0.763251 
+-0.565421 -3.056075 -0.920561 -0.010655 -0.006556 -0.014429 
+-0.001677 0.004230 -0.007895 -0.008764 -0.001431 0.008476 
+-0.003515 -0.006521 0.001235 0.000903 -0.001389 -0.010000 
+0.005159 -0.002652 -0.005913 -0.001231 -0.011147 -0.008239 
+-0.000740 -0.007916 -0.010116 -0.002508 -0.012657 0.001677 
+-0.003956 -0.011754 0.006316 -0.001922 -0.007118 0.004890 
+0.004140 -0.002949 0.000804 0.001834 -0.000704 0.001299 
+-0.004399 0.002464 0.003739 -0.002732 0.003650 0.005374 
+-0.000866 0.000671 0.002530 0.000150 -0.001624 -0.002535 
+-0.000565 0.000741 -0.005985 0.002210 0.006039 -0.000456 
+-0.004830 0.002356 0.000386 -0.002474 0.007421 -0.004211 
+-0.004273 0.002843 -0.000739 -0.003154 0.005973 -0.001057 
+-0.002723 0.006622 0.001138 -0.003950 0.002745 0.001384 
+-0.005655 0.001314 0.000171 -0.003029 0.007210 -0.002681 
+0.000942 0.009000 -0.001047 0.003578 0.000665 -0.001078 
+0.003159 -0.005777 -0.001381 0.000630 -0.006555 -0.004916 
+-0.003525 0.000000 -0.009344 -0.009572 0.003551 -0.004107 
+-0.007382 0.003930 0.001072 -0.003205 0.003669 0.002994 
+0.000235 0.001679 0.003123 0.000797 0.000032 0.001187 
+-0.004305 0.004738 -0.003136 0.005785 0.012559 -0.002780 
+0.005457 0.000637 -0.008862 0.002567 -0.001326 -0.017212 
+-0.002578 -0.000786 -0.017633 -0.015648 0.010720 -0.003688 
+-0.005826 0.008785 0.004415 0.007735 -0.025889 0.009225 
+0.681818 -4.826446 0.524793 0.595989 -5.510029 -0.106017 
+0.448878 -5.615960 -0.605985 0.294737 -5.442105 -1.076316 
+-0.019672 -4.957377 -1.275410 -0.545894 -3.898551 -0.971014 
+-0.003080 -0.018699 0.005286 -0.000531 0.008208 0.000517 
+0.002220 0.012515 -0.004339 0.009747 -0.001378 -0.001146 
+0.000931 0.000949 -0.000043 -0.000160 0.000431 -0.001906 
+0.001102 0.000806 -0.002725 0.002339 -0.005904 -0.000668 
+-0.000328 -0.004053 0.003807 -0.005954 0.002258 -0.000311 
+0.001177 0.005099 -0.001486 0.003200 0.002045 -0.001371 
+0.002864 -0.000005 0.001012 -0.000924 -0.001314 0.000321 
+-0.000616 -0.000407 -0.000257 0.003043 0.000119 0.002294 
+0.005336 0.001717 0.006506 -0.001085 0.005002 0.007045 
+-0.000596 0.040783 -0.021234 0.586957 2.239130 -4.000000 
+1.700730 1.708029 -0.160584 -0.400000 -1.804348 3.417391 
+-0.572848 -2.523179 2.407285 -0.342561 -2.342561 0.567474 
+0.000157 -0.017198 -0.010629 -0.005487 -0.001853 -0.011332 
+0.000962 0.007413 -0.000562 -0.002421 -0.002632 0.009895 
+0.001267 -0.004932 0.006337 -0.005267 0.001211 -0.000592 
+-0.006198 -0.005809 -0.004252 -0.001788 -0.005486 -0.007008 
+-0.005359 -0.000928 -0.004814 -0.006365 0.003603 0.001141 
+-0.002095 -0.003813 0.005227 -0.003360 -0.007407 -0.000344 
+0.003834 -0.005576 -0.002555 0.002421 -0.001484 -0.001698 
+-0.003693 0.002986 -0.004288 -0.001187 0.000244 -0.002639 
+0.001557 -0.004621 0.001058 0.003478 -0.004895 -0.001371 
+0.004006 0.003131 -0.003091 -0.003605 0.001261 -0.001384 
+0.000897 0.000642 -0.006551 -0.000208 0.004281 -0.004087 
+-0.000607 0.005289 -0.003036 -0.002155 0.008713 -0.000910 
+0.003404 0.009040 0.000223 0.000941 0.005050 -0.004556 
+-0.001514 0.002535 0.004046 -0.005572 0.009368 -0.000865 
+0.000092 0.006994 -0.002562 0.003343 0.002706 -0.003663 
+0.001182 -0.003208 -0.000998 -0.001591 0.003637 -0.002819 
+-0.003375 0.000564 -0.007020 -0.002308 0.000438 -0.001002 
+0.003782 0.001228 0.000697 0.002996 -0.001508 0.002493 
+0.003622 -0.003556 -0.000672 -0.000691 0.000430 0.000269 
+-0.006393 0.001273 -0.000318 -0.005143 0.003912 0.002368 
+0.001701 0.000199 -0.000948 0.004492 0.002608 -0.009770 
+0.002316 0.006714 -0.015556 -0.004845 0.015167 -0.005910 
+-0.002693 -0.001752 0.006393 0.003444 -0.025509 0.013001 
+1.182222 -4.257778 1.053333 1.456747 -5.134948 0.463668 
+1.561128 -5.529780 -0.075235 1.511254 -5.459807 -0.556270 
+0.822641 -4.849057 -0.709434 -0.584615 -3.507692 -0.405128 
+-0.007301 -0.011648 0.007669 0.003595 0.001610 0.008157 
+0.003864 0.007740 -0.002787 0.004924 -0.002304 -0.000524 
+0.002139 -0.001225 0.002037 0.004242 -0.001863 0.000101 
+0.009581 -0.002108 -0.003256 0.000000 -0.001522 -0.000362 
+-0.001705 0.001626 0.002278 -0.006113 0.008457 0.001906 
+-0.001387 0.007119 0.000182 0.004687 -0.000359 0.001804 
+0.002318 -0.004953 0.001727 -0.000791 -0.002221 0.002170 
+0.002014 0.002265 -0.000138 0.001787 0.003256 0.001354 
+0.003597 -0.001896 0.009175 0.001041 0.003433 0.000240 
+-0.015217 0.002210 -0.021697 0.242857 -3.078571 5.792857 
+-0.540773 -4.321888 7.231760 -0.588850 -3.452962 5.282230 
+-0.442804 -2.959409 3.051661 0.010205 -0.008387 0.006200 
+0.003544 -0.006791 -0.009523 -0.002890 0.004064 -0.004630 
+-0.006256 0.004904 0.006571 -0.001732 -0.006403 0.006485 
+-0.001124 -0.016939 0.003018 -0.004118 -0.010706 -0.009980 
+0.000040 -0.003196 -0.003449 0.000412 -0.001229 -0.000547 
+-0.005218 0.000448 -0.001043 -0.008704 0.000341 0.002237 
+-0.002889 0.004594 0.000348 -0.006170 -0.001111 0.003845 
+-0.004944 -0.002325 0.004356 -0.005360 0.003734 0.002419 
+-0.003773 0.004855 0.001315 -0.000338 0.002345 -0.001014 
+0.003165 -0.000695 -0.003897 0.006367 0.001857 -0.005217 
+0.003259 -0.001456 -0.000445 0.000995 -0.001714 -0.003603 
+0.001600 0.001341 -0.000928 0.000054 0.001120 -0.000921 
+0.002515 0.005003 -0.004340 0.002705 0.010208 -0.005002 
+-0.001065 0.003377 0.000601 -0.002668 0.003513 -0.003690 
+0.001197 0.000406 -0.001677 0.001667 0.000784 -0.007449 
+0.004406 0.004141 -0.002878 0.003692 -0.000769 -0.001538 
+0.003295 0.000439 -0.005116 -0.000288 0.009387 -0.007116 
+-0.003530 0.004452 -0.001841 0.003986 0.001217 0.001015 
+0.001041 -0.002374 0.004859 0.006013 -0.005962 0.004649 
+0.002498 -0.005307 -0.001123 0.000746 -0.001864 0.001057 
+-0.003885 0.000648 -0.001254 0.002051 0.000892 0.000183 
+0.002720 0.001541 -0.002474 0.000313 0.004348 -0.001409 
+-0.002631 0.013610 -0.004390 -0.001023 0.018190 -0.000303 
+-0.002727 0.004399 0.003298 -0.003096 -0.017751 0.009778 
+1.906250 -3.401786 1.035714 2.394834 -4.428044 0.616236 
+2.643836 -5.116438 0.366438 2.500000 -5.232394 0.345070 
+1.644628 -4.578512 0.508264 0.000164 -0.030541 0.006917 
+-0.004668 -0.006463 0.006485 0.006226 0.007328 -0.001191 
+0.004875 0.002573 -0.000992 0.003125 -0.002889 -0.000654 
+0.004194 -0.001255 0.000476 0.006607 0.002488 0.004317 
+0.009396 0.000060 0.002992 0.000226 -0.000767 0.000432 
+0.003738 0.005769 -0.004555 0.002439 -0.000244 -0.001789 
+-0.002270 0.004540 0.002460 0.002987 0.001147 0.002853 
+-0.002972 -0.005054 0.004502 -0.005000 0.000498 0.001577 
+-0.001585 0.003087 0.000601 0.001139 0.003484 -0.001612 
+0.002838 -0.000659 -0.001059 0.001892 0.004074 -0.003889 
+0.011625 -0.010521 0.036438 -0.523810 -2.626984 5.813492 
+-0.583871 -2.638710 5.725806 -0.519298 -2.814035 4.789474 
+-0.547170 -3.018868 3.155660 0.006414 -0.021973 0.005982 
+-0.001476 -0.011096 -0.003435 0.000537 0.005054 0.002543 
+-0.001445 0.010667 0.007766 -0.005687 -0.002445 0.006360 
+0.000247 0.000063 0.000511 0.000636 0.000043 0.002955 
+-0.000022 0.000265 0.002888 0.000776 -0.002046 -0.001553 
+-0.001043 -0.002261 0.000000 -0.000019 0.001699 0.000586 
+-0.002001 0.003243 0.001665 -0.002479 0.003566 0.001155 
+-0.003028 0.003524 0.001870 -0.002692 0.002246 0.001696 
+0.001485 -0.000216 0.002525 0.003745 0.000303 0.002443 
+0.001598 -0.001033 -0.001167 -0.001090 0.001268 -0.003026 
+-0.001432 0.002337 -0.000552 0.002743 0.001171 -0.000514 
+0.001429 -0.000680 0.001497 0.000257 -0.000668 0.000045 
+-0.001080 0.001616 -0.001766 -0.001494 0.003637 -0.001509 
+-0.003193 0.003683 -0.000430 -0.004348 0.005700 -0.002594 
+0.012006 0.008809 0.000743 0.005448 0.011370 -0.004973 
+-0.000200 0.000168 -0.002159 0.002035 -0.001167 -0.003758 
+0.000896 0.005664 -0.008645 0.002540 0.012884 -0.011026 
+0.003396 0.010875 -0.005018 0.004751 0.001069 0.000712 
+0.000850 -0.005836 0.002049 -0.000147 -0.004961 0.002755 
+-0.000546 -0.001257 0.000355 -0.002954 0.003274 -0.003653 
+-0.003361 0.006466 -0.001780 0.000251 0.006649 0.000428 
+-0.000956 0.005920 0.002424 -0.001612 0.007120 0.003021 
+-0.002084 0.009442 0.004421 0.000907 0.011366 0.004128 
+-0.002886 0.004187 0.004541 -0.000705 -0.015069 0.014023 
+2.022624 -2.837104 1.420815 2.498182 -3.629091 1.236364 
+2.797386 -4.032680 1.238562 2.718121 -4.000000 1.446309 
+2.096774 -3.395161 1.544355 0.003875 -0.021817 0.010260 
+0.002077 -0.003968 0.000093 0.008076 -0.002183 0.000184 
+0.007732 -0.003612 -0.003739 0.004296 -0.005852 -0.000370 
+0.002524 -0.001491 -0.001189 0.004171 0.001115 0.000771 
+0.004978 0.000456 0.001190 0.000712 0.000156 -0.003848 
+0.004563 0.010691 -0.007561 0.005020 0.004176 -0.004976 
+0.003592 0.001920 0.001337 0.002786 -0.001418 0.001082 
+0.000393 0.000151 -0.003706 -0.000786 0.000163 0.000188 
+0.000823 0.006963 0.000877 0.001411 0.003877 -0.005637 
+0.002500 -0.005170 -0.006204 0.000221 -0.000648 -0.001078 
+-0.218579 -1.284153 4.120219 -0.256849 -1.866438 5.619863 
+-0.210227 -2.088068 5.204545 -0.274448 -2.318612 4.018928 
+-0.522822 -2.352697 2.253112 -0.010734 -0.014496 0.005903 
+-0.002464 -0.008251 -0.001891 -0.001152 0.001593 0.002241 
+-0.000926 -0.000969 0.002187 -0.002997 0.000149 0.000414 
+0.001701 -0.000893 -0.001583 0.001971 -0.001613 -0.002124 
+-0.002457 -0.000241 -0.002007 -0.003830 -0.001341 -0.000744 
+0.000601 0.000555 0.000670 0.000528 -0.001312 -0.001125 
+0.001451 -0.003134 -0.006501 -0.000947 -0.002955 -0.006856 
+-0.002606 -0.003187 -0.005394 -0.000064 -0.002986 -0.002351 
+0.000976 -0.003692 0.001881 -0.000636 -0.005473 0.002993 
+-0.001302 -0.005937 0.001016 -0.004898 -0.001537 0.001095 
+-0.002003 -0.000034 0.000165 -0.000890 0.000042 -0.000905 
+-0.000573 0.001592 -0.002398 -0.001212 0.003414 -0.000910 
+-0.002406 -0.000619 -0.000531 -0.002973 -0.000057 -0.003888 
+-0.002753 0.001893 -0.004020 -0.001805 0.004076 -0.003060 
+-0.000861 0.002265 -0.002244 -0.000833 0.002415 -0.000583 
+0.000589 0.001780 -0.000689 -0.000486 0.001681 0.000146 
+-0.003816 0.002598 -0.000553 -0.002640 0.003527 -0.002767 
+0.000558 0.003565 -0.001670 0.003728 0.003226 -0.001554 
+0.004791 0.000466 -0.003460 0.000222 0.002923 -0.001218 
+-0.000076 0.005190 -0.001985 0.002896 0.005105 -0.004980 
+0.003020 0.004352 -0.005285 0.000139 0.001436 -0.002355 
+-0.000496 0.001533 0.002102 -0.000156 0.001850 -0.000366 
+-0.007449 0.002726 -0.002643 -0.001500 0.002623 0.001535 
+-0.000979 -0.000184 0.003970 0.004389 -0.010577 0.012366 
+2.068965 -1.995690 1.383621 2.410774 -2.814815 1.696970 
+2.481818 -3.221212 2.072727 2.299674 -3.166124 2.351792 
+1.733051 -2.644068 2.182203 0.008340 -0.014883 0.011303 
+0.000998 -0.003466 -0.008817 0.009545 -0.002522 -0.006713 
+0.004932 0.000993 -0.006301 0.000505 0.001529 -0.003811 
+-0.005169 -0.000259 -0.003875 -0.003460 -0.002378 0.002507 
+0.001915 -0.004000 0.004788 0.000541 -0.000384 0.001046 
+-0.002525 0.000328 -0.001696 -0.002980 -0.001192 0.002171 
+-0.001383 0.000579 0.001462 0.001165 0.000272 -0.006001 
+0.004399 -0.002010 -0.008914 0.002951 0.006730 -0.008594 
+0.000412 0.000653 -0.003703 0.000813 -0.000174 -0.004213 
+-0.000018 -0.001164 -0.005373 -0.003309 -0.002832 0.008689 
+-0.601124 -0.977528 4.230337 -0.146953 -1.498208 5.483871 
+0.148760 -1.741047 4.914600 0.195251 -1.852243 3.583113 
+0.127660 -1.832827 2.051672 -0.001585 -0.016088 0.007181 
+0.002457 -0.009201 -0.000575 0.002757 -0.002931 -0.002949 
+-0.000971 -0.002359 -0.007563 0.004034 -0.000532 -0.005696 
+0.005372 -0.000551 -0.004182 0.000301 -0.002058 -0.001550 
+0.000378 -0.002989 0.001089 0.002279 -0.001811 -0.000588 
+0.004122 0.001209 -0.003338 0.003058 -0.001820 -0.000218 
+-0.000067 -0.000646 -0.000967 -0.000442 -0.000709 0.000339 
+-0.000053 0.002307 -0.001101 -0.001495 -0.000131 -0.001568 
+-0.005524 -0.004858 0.000765 -0.002234 -0.009172 0.004469 
+-0.001806 -0.003730 0.003103 -0.001230 0.004709 -0.002877 
+-0.004000 0.002000 -0.001000 -0.001103 -0.000436 0.000333 
+-0.000826 -0.000642 -0.001973 -0.002687 -0.001194 -0.002687 
+-0.003603 0.002831 -0.002831 0.002641 0.006272 -0.006851 
+0.006183 0.005612 -0.004987 0.001926 0.001287 0.000558 
+-0.001059 -0.000079 0.000617 0.000120 0.001890 -0.000033 
+0.003095 0.003030 -0.000717 0.003235 0.002928 -0.002125 
+-0.003950 0.002253 -0.000644 -0.004727 -0.000829 -0.000951 
+-0.001341 0.002225 -0.001883 0.003951 0.006572 -0.004927 
+0.005736 0.002028 -0.006591 -0.000731 0.000448 -0.000701 
+-0.001382 0.002001 0.000658 -0.000886 0.000306 0.000088 
+0.001278 0.001072 0.000557 -0.000171 -0.001485 0.000838 
+-0.002783 -0.001157 0.003479 -0.000701 -0.000064 -0.003692 
+-0.002707 0.006923 -0.007879 0.000566 0.008476 -0.007363 
+0.000083 0.004185 -0.000297 0.004250 -0.005535 0.009094 
+1.676229 -1.500000 1.299180 1.882943 -2.230769 1.946488 
+1.944625 -2.631922 2.439739 1.846457 -2.622047 2.649606 
+0.011190 -0.022500 0.022068 0.003003 -0.004042 0.006282 
+0.005090 -0.002512 -0.008831 0.005379 0.007251 -0.010000 
+0.002198 0.003916 -0.003901 0.000837 0.001186 -0.001092 
+0.000688 0.000721 -0.001039 0.003412 0.001455 0.000912 
+0.002101 0.001960 0.000656 -0.003691 -0.002312 0.000490 
+-0.009454 0.000217 -0.001930 -0.000931 0.001303 0.000046 
+-0.000910 0.001243 -0.000804 -0.000271 -0.000493 -0.003578 
+0.002198 -0.001693 -0.004618 0.002137 -0.003374 -0.001235 
+0.000472 -0.000592 -0.000489 0.000684 -0.001223 -0.010159 
+0.004810 0.001886 -0.013331 -0.001084 -0.001509 0.006127 
+0.001241 -0.006968 0.031653 0.236000 -0.904000 4.516000 
+0.592357 -1.146497 4.410828 0.736196 -1.368098 3.407975 
+0.808664 -1.465704 1.960289 0.007526 -0.012014 0.002899 
+0.008915 0.000428 -0.012252 0.009852 0.012099 -0.008364 
+-0.000103 0.000896 -0.006171 0.002789 -0.001674 0.001111 
+-0.005336 -0.004818 0.005098 -0.004386 0.000044 0.001009 
+0.002926 -0.002291 0.003646 0.002857 0.003492 -0.000635 
+0.001635 -0.002181 -0.007339 0.000257 0.000313 -0.003107 
+0.000794 -0.000139 0.001364 0.001130 0.001106 0.001789 
+0.000599 -0.000094 -0.000877 -0.001906 -0.003217 -0.003138 
+-0.005352 -0.001991 -0.000972 -0.003807 -0.002289 0.001735 
+-0.000563 0.001764 -0.000413 0.002160 0.006331 -0.005178 
+0.002530 0.006614 -0.005593 -0.000246 -0.000082 -0.002910 
+-0.003316 0.000616 -0.001700 -0.002717 -0.000582 -0.004026 
+-0.000162 -0.001385 -0.004669 0.004377 0.003257 -0.008651 
+-0.002273 0.008712 -0.002273 -0.000114 0.001083 -0.005302 
+0.006643 0.009687 -0.001868 0.007133 0.002287 -0.009855 
+-0.001034 0.000696 -0.003739 -0.000091 0.003203 -0.001053 
+-0.000801 0.004496 -0.000198 0.000187 0.004350 -0.002570 
+0.000260 0.002523 -0.001475 -0.000378 -0.000252 -0.000022 
+0.000164 -0.000295 0.000337 -0.000809 0.000690 0.000279 
+-0.001514 0.003633 0.001421 -0.003443 0.002482 0.000734 
+-0.000881 0.001763 0.006610 -0.000134 0.000443 -0.000070 
+-0.004802 0.001032 0.004802 -0.000742 0.003091 -0.004205 
+-0.002439 0.008728 -0.007833 0.003471 0.011006 -0.012035 
+0.000719 0.009195 -0.004498 0.002876 -0.002395 0.004841 
+0.009039 -0.011904 0.011804 1.138889 -1.710317 1.869048 
+1.092105 -1.951754 2.403509 0.004883 -0.020919 0.024937 
+-0.000072 -0.010310 0.020798 -0.002983 0.001195 0.003201 
+0.004330 0.003116 -0.000884 -0.002339 -0.001335 0.000360 
+-0.006957 -0.002942 0.003305 -0.002861 -0.002974 0.001338 
+0.003629 -0.000774 -0.002948 0.007302 -0.000479 -0.003974 
+0.003774 0.000304 -0.003733 -0.002748 -0.000946 -0.003008 
+-0.005808 -0.000829 0.000650 -0.006027 0.001490 0.004152 
+-0.004848 0.002938 0.003964 -0.002671 -0.001879 0.002441 
+0.001156 -0.001901 -0.000631 0.000359 -0.000060 -0.002627 
+-0.003487 0.007833 -0.006314 -0.002489 0.010714 -0.017420 
+0.000588 0.003792 -0.023229 -0.000710 -0.000306 -0.005144 
+0.003063 -0.002612 0.018009 0.588235 -0.135747 2.809955 
+1.229008 -0.309160 2.755725 0.010868 -0.014632 0.014659 
+0.012089 -0.011150 0.003093 0.009598 -0.000608 -0.012867 
+0.000859 0.011743 -0.017535 -0.000641 0.006911 -0.010492 
+0.001187 0.001600 -0.004297 -0.001924 -0.002352 0.000336 
+-0.000132 -0.007749 -0.001810 -0.002049 0.000720 -0.000074 
+0.000782 0.001473 0.000834 0.000937 0.000497 -0.006234 
+-0.001733 -0.000813 -0.004331 -0.003890 -0.000966 -0.000912 
+-0.003837 0.001582 -0.000224 -0.001031 0.001975 -0.005004 
+-0.001148 -0.001005 -0.004961 -0.003405 -0.002327 -0.005259 
+-0.005733 -0.004286 -0.003185 -0.005723 -0.003097 -0.001360 
+-0.003861 -0.000552 -0.003585 -0.001427 0.002594 -0.003217 
+-0.000962 0.003759 -0.001925 -0.002244 0.002244 -0.000630 
+-0.001797 0.000268 0.000127 -0.000532 0.000021 -0.000403 
+0.001389 0.001508 -0.001389 -0.000392 0.004132 -0.001496 
+0.001371 0.003218 -0.002933 0.001725 0.000958 -0.006996 
+0.004955 0.001604 -0.002128 -0.000406 0.000736 0.000348 
+-0.005458 0.001151 -0.001915 -0.003833 0.002650 -0.000883 
+0.000813 0.003448 -0.002334 0.002736 0.001025 -0.002256 
+-0.003275 -0.001650 -0.001620 -0.003126 -0.001646 -0.001879 
+-0.002118 0.003871 -0.003830 -0.001649 0.007763 -0.005406 
+0.001913 0.005791 -0.002704 -0.001605 -0.001284 0.001385 
+-0.004101 -0.002887 0.003889 -0.003205 0.000548 0.001835 
+0.000502 0.000418 -0.000402 -0.000541 -0.000628 -0.003488 
+-0.001971 -0.001138 -0.005047 -0.003111 -0.000259 -0.005402 
+0.001136 0.008588 -0.004231 0.003756 0.004605 0.000603 
+0.005129 -0.004422 0.004826 0.003177 -0.012490 0.009596 
+-0.000505 -0.014423 0.015991 -0.003462 -0.007207 0.017139 
+-0.000399 -0.000640 0.006165 0.000099 0.000646 -0.001096 
+-0.000381 0.000948 -0.002593 -0.011280 -0.003247 0.000082 
+-0.005999 -0.006728 0.000476 0.001781 0.001068 -0.002739 
+0.003162 0.002335 -0.003984 0.003679 0.000522 -0.002699 
+0.001777 0.000081 0.000227 -0.001078 0.000665 -0.002006 
+-0.001491 0.001991 -0.004451 -0.002218 0.002543 -0.003737 
+-0.003386 0.001825 -0.001586 -0.002082 0.002868 -0.000652 
+-0.001875 0.002447 -0.000494 -0.000850 -0.000612 -0.006479 
+0.005296 -0.000714 -0.012318 0.009762 0.013748 -0.008722 
+-0.007155 0.002006 -0.002066 -0.003540 0.006723 -0.010642 
+0.002091 0.000411 0.002908 0.007007 -0.000199 0.007668 
+0.011068 -0.000966 0.003615 0.009171 -0.003124 -0.004359 
+0.002078 -0.001101 -0.015296 -0.007638 -0.003522 -0.019863 
+0.002327 0.006659 -0.013123 -0.000040 0.003159 -0.005730 
+0.001960 -0.000122 -0.002153 -0.000122 -0.003107 0.000792 
+-0.000111 -0.001312 -0.000606 -0.002756 0.003035 -0.000233 
+0.000728 0.005933 -0.002162 0.000821 0.003901 -0.001360 
+-0.001048 -0.002581 -0.002339 -0.000057 -0.002054 -0.002040 
+-0.000030 0.000750 0.000471 -0.009269 0.003691 -0.000916 
+-0.003158 -0.003718 -0.001405 -0.001583 -0.002743 -0.000599 
+0.000907 -0.000833 -0.001740 0.002148 0.001549 0.000141 
+0.000703 0.001944 0.000310 -0.002482 0.002482 0.000146 
+-0.000531 0.002455 0.000488 -0.000500 0.001200 -0.001834 
+-0.001475 -0.000574 0.000000 -0.000667 -0.001853 0.001027 
+-0.000215 -0.000086 0.000717 -0.003033 0.001213 -0.001203 
+-0.003868 0.000318 -0.001624 -0.002349 -0.003288 -0.001527 
+-0.000338 0.000150 0.000202 -0.000690 -0.000012 0.000288 
+-0.000632 0.000599 0.000685 -0.000434 0.001582 -0.000027 
+0.000075 0.001463 -0.001977 0.000602 0.001667 -0.001514 
+-0.000616 -0.001645 -0.000646 -0.000295 0.000092 -0.000369 
+0.001068 0.005307 -0.001568 -0.003437 0.004444 0.000521 
+-0.000775 0.000796 0.000947 -0.000597 0.000813 0.001760 
+-0.001470 -0.002903 0.003307 -0.000343 0.000876 0.000142 
+0.003401 0.004285 -0.005236 0.000855 0.008894 -0.004918 
+-0.001168 0.006747 -0.002596 -0.003074 0.002969 -0.002739 
+0.000765 0.007421 -0.006690 0.001624 0.007947 -0.005324 
+-0.000017 0.004240 -0.003610 -0.004508 -0.001174 0.001422 
+-0.006895 -0.003263 0.007598 -0.003106 0.000289 0.006982 
+-0.001334 0.000782 -0.001230 -0.001602 0.000786 -0.007145 
+-0.000039 0.000904 -0.003923 -0.001243 -0.001941 0.007858 
+-0.000576 0.003799 0.000474 0.005531 0.003341 -0.005599 
+0.005008 -0.000762 -0.006562 0.001124 -0.001975 -0.004068 
+-0.000726 -0.000738 -0.001007 0.001203 0.000128 0.000106 
+0.002674 0.000263 0.000468 0.000549 0.000209 0.000238 
+-0.002945 -0.000481 -0.001315 -0.003050 0.001088 -0.000816 
+-0.000031 0.000595 0.000525 0.001144 -0.005205 -0.004707 
+0.015543 -0.000251 -0.019555 0.006853 0.014851 -0.010968 
+0.002236 0.011885 -0.007962 0.002464 0.009011 -0.006956 
+0.005972 0.002566 -0.006573 0.008026 0.002216 -0.012325 
+0.006264 0.002991 -0.019998 -0.001008 0.001814 -0.021365 
+-0.004634 -0.005771 -0.008395 -0.000799 0.002906 -0.000974 
+0.001167 -0.000093 -0.001572 0.005315 0.002114 -0.005400 
+0.006697 0.001146 -0.004517 -0.000493 0.004169 -0.000823 
+-0.000674 0.000976 0.002697 -0.010000 -0.001617 0.001155 
+-0.004934 -0.000133 0.000389 -0.000458 -0.001092 -0.001113 
+-0.000740 -0.000933 -0.001166 -0.000143 0.003041 0.001096 
+0.001202 0.006064 -0.000542 0.002768 0.005337 -0.002293 
+0.001846 0.004615 -0.005538 0.002444 0.001480 -0.003901 
+0.000529 0.000082 -0.000861 -0.000772 0.000419 0.001405 
+-0.000593 0.001148 0.001148 0.000458 0.000426 0.002196 
+-0.000020 0.000989 0.000601 -0.000505 0.002007 -0.000369 
+0.001297 0.003212 -0.000342 0.003811 0.002244 -0.002493 
+0.001328 0.001473 -0.002956 -0.000079 -0.000954 -0.001435 
+-0.002336 -0.001445 0.000482 0.000412 -0.000824 -0.002574 
+0.004553 0.001431 -0.003379 0.002635 0.005294 -0.002967 
+-0.000036 0.003896 -0.000421 -0.002179 0.002442 0.001563 
+-0.003286 0.002429 0.002457 -0.000901 0.002194 0.005842 
+-0.000980 0.002314 0.004355 -0.005480 0.002139 0.000225 
+-0.003375 0.001120 -0.001106 0.001092 0.003320 -0.002332 
+0.002808 0.006553 -0.001707 0.002927 0.007398 0.001463 
+0.001926 0.004262 0.001926 0.000191 0.001174 0.000436 
+0.001067 -0.001281 -0.000160 -0.001650 0.002417 -0.003547 
+-0.003364 0.008736 -0.005932 -0.006351 0.013309 -0.009021 
+0.002270 0.014869 -0.012347 -0.001606 0.007250 -0.006948 
+-0.003910 0.002274 -0.003692 -0.006577 0.001971 -0.001285 
+-0.005138 0.004891 -0.001868 -0.004289 0.003425 -0.006444 
+-0.006646 0.001306 -0.008887 -0.001363 0.003172 -0.009022 
+-0.004852 0.003015 -0.002434 -0.002023 0.000602 0.001427 
+0.002713 0.001754 0.001041 0.006662 -0.003547 -0.002877 
+0.003258 -0.004767 -0.010171 0.000112 -0.004866 -0.009448 
+0.000063 -0.002680 -0.005628 0.001336 -0.000802 -0.001838 
+0.000614 0.000249 0.000403 -0.001178 0.000340 0.000155 
+-0.000836 -0.000403 -0.000941 0.001497 -0.000810 -0.000040 
+0.003715 -0.000727 0.001290 0.001387 0.003026 0.000426 
+0.000920 0.002881 -0.007516 -0.002477 0.003446 -0.000233 
+0.000889 0.008663 0.000258 0.001480 0.007167 -0.002644 
+0.000195 0.003656 -0.006240 -0.005264 0.001261 -0.006899 
+-0.006965 -0.001491 -0.008442 0.000355 -0.005648 -0.003468 
+-0.000435 0.003788 -0.001176 -0.003975 0.001198 -0.001803 
+-0.005516 -0.002579 -0.000604 -0.005536 -0.003428 0.004368 
+0.000277 0.000525 -0.000386 0.001277 0.006089 -0.004735 
+-0.002964 0.004760 0.000599 -0.003273 0.004250 -0.001682 
+-0.002644 0.001707 -0.002703 -0.002643 0.002699 -0.001933 
+0.000579 -0.000213 -0.000654 0.002470 0.002897 -0.001830 
+0.001281 0.001556 -0.002996 0.000000 0.000000 -0.005378 
+0.000797 0.000496 -0.006378 -0.000533 0.001240 -0.004626 
+-0.001208 0.000632 -0.002401 -0.002397 -0.001309 -0.001176 
+-0.000346 -0.000025 0.000914 -0.000202 -0.000122 -0.002021 
+-0.001976 -0.000237 -0.002165 -0.000780 0.003085 0.000767 
+-0.000175 0.004261 0.002043 0.002676 0.000071 -0.000527 
+-0.001381 -0.001653 0.000793 -0.002437 -0.007255 0.002975 
+-0.002299 -0.006912 0.001732 -0.000920 -0.000696 0.001212 
+0.005513 0.002796 -0.001244 0.002022 0.008825 -0.007111 
+-0.000697 0.009513 -0.003530 0.000410 0.004320 0.001073 
+0.001873 0.001961 0.002360 0.000768 0.001645 0.003328 
+-0.002573 0.003477 0.001005 -0.002679 0.003414 -0.001307 
+-0.001133 0.000291 -0.000117 0.001425 -0.000027 0.000918 
+0.000054 0.000190 -0.000054 -0.006357 0.000853 0.000245 
+-0.003930 0.002060 0.004266 0.000703 0.000625 -0.000156 
+0.000728 -0.002353 -0.002774 -0.000600 -0.002200 -0.003931 
+-0.001517 -0.002944 -0.003910 -0.001834 -0.001788 -0.001988 
+0.000082 0.000206 0.000206 0.000583 0.000238 0.000434 
+-0.003301 -0.000564 0.000302 -0.006227 0.002028 0.001927 
+-0.002707 0.008774 0.000434 0.000450 0.002395 -0.004116 
+-0.002119 -0.000157 -0.002218 -0.003546 -0.000058 -0.000665 
+-0.001038 0.000933 0.001277 0.000203 -0.000045 0.000062 
+0.002022 -0.000168 -0.006146 -0.000576 -0.001324 -0.010488 
+0.001241 -0.003103 -0.015846 -0.000652 -0.002706 -0.024068 
+-0.004168 -0.008393 -0.023759 -0.005786 -0.009556 -0.012443 
+-0.006300 -0.005972 -0.004703 -0.003936 -0.002122 -0.000969 
+-0.001970 0.000333 -0.006049 -0.002203 -0.002610 -0.005220 
+-0.001452 -0.000992 -0.008913 -0.002421 0.000592 0.000612 
+-0.002270 0.002578 0.004846 -0.001850 0.002324 0.000856 
+-0.000529 0.004487 -0.000014 -0.000056 0.009127 -0.002804 
+-0.000862 0.009417 -0.005372 -0.001419 0.007239 -0.005163 
+-0.002863 0.005972 -0.004295 0.002608 0.006538 -0.006955 
+0.006074 0.002118 -0.004380 0.002861 -0.000345 -0.001243 
+0.000106 -0.001429 -0.000359 -0.000390 -0.003503 0.001752 
+0.000335 -0.000220 -0.000927 -0.001341 0.002913 -0.004438 
+0.001708 -0.000602 -0.002612 -0.001885 -0.001256 -0.004250 
+0.000046 0.002645 -0.000114 0.000995 0.001703 -0.002137 
+0.000735 0.002790 -0.004109 0.004331 0.000390 -0.005251 
+0.002164 -0.000753 -0.007606 0.000004 -0.001483 -0.005974 
+0.000000 -0.001624 -0.002222 -0.000461 -0.002141 -0.000542 
+-0.000448 -0.000170 -0.000460 0.002556 0.003172 -0.002266 
+0.000372 0.001212 -0.006338 -0.003646 0.000639 -0.003486 
+-0.003960 0.000625 -0.003835 -0.003669 0.000927 -0.005726 
+-0.002506 0.001690 -0.008277 0.000060 0.004362 -0.004452 
+-0.000871 0.003038 -0.002302 -0.000662 0.001991 0.000492 
+-0.001536 0.000840 0.001817 -0.000870 0.001740 0.003480 
+0.005546 0.002372 -0.000421 0.007257 0.005951 0.000574 
+0.003029 0.004085 0.004774 0.001002 0.002509 0.004096 
+0.002162 0.002137 0.002141 0.002535 0.001584 -0.000124 
+0.004861 0.004258 -0.002656 0.005461 0.002760 -0.005700 
+0.005003 0.003726 -0.002342 0.002536 0.001849 -0.000190 
+-0.000281 0.000554 0.001531 -0.001810 -0.000930 -0.000536 
+-0.002137 -0.001234 -0.000571 -0.004160 0.000992 -0.000496 
+-0.000924 -0.000095 0.002865 -0.000305 -0.002952 0.001502 
+-0.001199 -0.003301 -0.000722 -0.001041 -0.002469 -0.003358 
+-0.000213 -0.000272 -0.004225 0.000335 0.000731 -0.003989 
+0.001867 0.004275 -0.005348 0.000360 0.008103 -0.007262 
+0.000765 0.008266 -0.004937 -0.001237 0.004948 -0.001237 
+0.001052 0.000181 -0.000074 0.002907 0.000718 0.001573 
+0.002140 -0.000377 -0.000805 0.001190 0.005457 -0.006786 
+0.003139 0.001437 -0.010656 0.001605 -0.002070 -0.008994 
+0.001946 0.006059 -0.010011 -0.000852 0.003577 -0.017119 
+-0.010666 0.009807 -0.013750 -0.004405 0.008209 -0.007595 
+0.001135 0.000811 -0.000378 -0.001228 0.000690 -0.003963 
+-0.005538 -0.005185 0.001801 -0.001742 -0.004692 -0.001769 
+-0.006246 0.001885 0.000378 -0.000950 -0.001248 -0.002506 
+0.003453 0.000680 -0.003180 0.000922 -0.000230 -0.000607 
+-0.002767 -0.000080 0.001291 -0.006243 0.001315 -0.000399 
+-0.005761 0.005783 -0.004011 -0.005113 0.004832 -0.003999 
+0.000791 -0.000194 -0.006984 0.005765 0.003824 -0.003824 
+0.002788 -0.004894 -0.004479 0.002320 -0.001866 -0.003845 
+0.000344 0.001315 0.001143 -0.001392 0.001659 0.003925 
+-0.000586 0.001696 0.002638 0.000828 0.002446 -0.000613 
+0.001933 0.000935 -0.000666 -0.001433 0.002012 -0.001307 
+-0.001103 0.000829 -0.001794 -0.000704 0.001030 -0.000650 
+0.001324 0.003474 -0.001571 0.004093 0.003496 -0.003206 
+0.000051 -0.000253 -0.003876 0.000000 -0.000569 0.000569 
+-0.000271 0.001525 0.001852 0.000538 0.003278 0.000902 
+0.002715 0.007113 -0.003041 0.007032 -0.000190 -0.001948 
+0.002008 0.000435 0.000197 -0.002465 -0.002555 -0.000438 
+-0.001342 -0.000856 -0.002776 -0.003713 0.000596 -0.003117 
+0.000495 0.001182 0.000277 0.002759 0.004637 -0.005709 
+0.001053 0.004106 -0.005732 0.000879 0.005688 -0.001202 
+-0.001269 0.001269 -0.002000 0.001124 -0.000555 -0.002319 
+0.000022 0.005500 -0.002851 0.001147 0.003294 -0.004124 
+0.002231 0.005054 -0.004422 0.003435 0.000000 -0.003359 
+0.002414 0.001203 -0.002288 0.001224 0.002168 -0.002663 
+0.000924 0.005625 -0.005407 0.001777 0.007173 -0.006252 
+-0.001908 0.003247 -0.002386 -0.002773 -0.003777 -0.000872 
+-0.001907 -0.003813 0.003817 -0.004109 0.001715 -0.000429 
+0.000398 0.003295 -0.003162 0.001395 0.000413 0.000359 
+-0.000977 0.000003 0.002200 0.001547 -0.002573 0.002331 
+0.001834 -0.003759 0.000183 -0.000411 -0.002301 -0.001719 
+-0.000655 0.005262 -0.003450 0.003387 0.005266 -0.010459 
+0.003111 0.005621 -0.010839 0.001851 0.005525 -0.007239 
+-0.002303 0.005137 -0.004096 0.000118 0.003020 -0.000339 
+0.004885 0.000327 -0.003839 0.008294 -0.003057 -0.008740 
+0.004854 -0.004337 -0.019106 0.003040 -0.001013 -0.024133 
+0.005869 0.001677 -0.009419 0.011484 0.000460 0.004272 
+0.007865 0.003333 0.017747 0.002374 0.003164 0.024085 
+-0.003548 0.001503 0.020376 -0.006823 -0.001940 0.011301 
+-0.001197 0.001272 0.003430 -0.004386 0.004613 -0.013863 
+-0.002880 0.002696 -0.005698 0.002293 0.000249 0.002999 
+-0.001264 -0.004484 0.007735 -0.004124 -0.000877 0.002379 
+0.001867 0.009070 -0.007091 0.014253 0.011434 -0.011960 
+0.014567 0.001488 -0.007978 0.003473 -0.000252 -0.009752 
+0.001720 0.006734 -0.013548 0.004150 0.011114 -0.010726 
+0.001486 -0.000012 -0.001030 -0.001605 0.003103 0.002654 
+-0.001037 -0.000227 -0.001218 0.004272 0.003056 -0.001643 
+0.002578 0.007570 -0.011541 0.000261 0.005819 -0.007211 
+0.000325 0.002783 -0.002972 0.001343 0.001829 -0.000799 
+0.000736 -0.000041 -0.001698 0.001786 0.000058 -0.002062 
+0.001448 0.003989 -0.004772 0.002286 -0.001128 -0.003294 
+0.004687 0.005061 0.001529 0.001456 0.004836 -0.002618 
+-0.002775 0.002860 -0.001029 -0.003340 0.001456 -0.000226 
+-0.001329 0.000035 0.000602 0.000868 0.000775 -0.000212 
+-0.000115 0.001848 -0.001224 -0.000638 -0.000620 -0.003190 
+-0.001953 -0.004500 0.000170 -0.001962 -0.005580 -0.002774 
+-0.000558 -0.004768 -0.001890 -0.001068 -0.001111 -0.001068 
+0.002859 0.002541 -0.005505 0.002886 0.004661 -0.007928 
+0.007542 0.003532 -0.003866 -0.001363 -0.000995 -0.002187 
+-0.002838 -0.000025 -0.005134 -0.000325 0.002862 -0.001431 
+0.000503 0.000542 -0.000463 0.002283 -0.000551 0.001181 
+0.000527 0.001327 -0.003092 -0.000859 0.002024 -0.002759 
+-0.002060 0.000918 -0.001074 -0.001247 -0.000273 -0.000663 
+0.000500 0.002314 0.000578 0.000099 0.002109 -0.004953 
+-0.002488 0.001342 0.000693 -0.000521 0.002738 0.000880 
+0.002157 0.003654 -0.000140 0.002655 0.006933 -0.003836 
+-0.001745 0.003955 -0.002618 0.001351 0.000590 -0.001031 
+0.000106 0.001484 -0.000916 -0.000955 0.001728 -0.003843 
+-0.002040 -0.000115 -0.006083 -0.002982 -0.000014 -0.003733 
+0.000483 0.002532 -0.006390 -0.000839 0.002560 -0.009543 
+0.000149 0.005091 -0.012503 0.003700 0.004724 -0.011698 
+0.003810 0.006429 -0.006429 -0.002060 0.003327 -0.004992 
+-0.002817 0.002703 -0.000419 -0.000653 0.001084 -0.001256 
+0.004483 0.002307 -0.020728 -0.003966 0.004905 -0.044183 
+0.005896 0.002613 0.016440 0.009971 -0.003658 0.048765 
+0.756614 -0.698413 6.264550 1.007663 -0.601533 6.455939 
+1.161572 -0.419214 5.864629 0.007612 0.002829 0.042361 
+0.004416 0.004849 0.010804 0.001036 -0.001530 -0.006281 
+0.005620 -0.000205 0.002951 0.001497 0.015879 0.011384 
+-0.003330 0.000023 0.004283 -0.000618 0.000440 -0.006709 
+0.001471 0.007247 -0.013905 0.003362 0.004023 -0.014019 
+0.004470 0.004195 -0.004829 0.001210 -0.000258 0.001687 
+-0.002062 -0.001900 0.003741 -0.000890 -0.000890 0.001781 
+-0.005836 0.000032 0.002075 0.001048 0.002106 0.003339 
+0.000472 0.001153 -0.001712 0.004223 -0.003512 -0.002713 
+-0.000655 -0.001062 -0.005772 -0.001092 0.002377 -0.005230 
+-0.001036 0.002010 -0.001516 -0.000647 -0.000746 0.001582 
+-0.000864 -0.003059 0.000798 -0.001111 -0.001696 0.002181 
+0.000199 0.000774 0.000620 0.001517 0.002123 0.002199 
+0.003459 0.007504 -0.003263 -0.000270 0.007323 -0.003618 
+-0.001232 0.003919 -0.002258 -0.000435 0.000953 -0.000849 
+-0.002383 -0.000254 -0.001335 -0.002666 -0.002238 -0.003742 
+-0.000921 -0.002578 -0.003004 0.000199 -0.001056 -0.001091 
+-0.003167 -0.003000 0.003959 -0.001611 0.002192 0.004814 
+-0.001900 0.002789 0.001819 0.002927 0.000550 -0.004952 
+0.002672 -0.000240 -0.006099 0.004663 0.001957 -0.003082 
+0.002598 -0.000601 -0.002807 0.000583 -0.002059 -0.004341 
+-0.000640 -0.000320 0.000000 -0.001298 0.000095 0.000320 
+0.001519 0.001654 -0.003038 0.000672 -0.000181 -0.000436 
+-0.001127 -0.000171 0.000706 -0.001013 0.004269 -0.000112 
+0.001584 0.000357 0.000491 0.002415 0.001041 -0.003298 
+0.002410 0.001529 -0.002998 0.001505 0.001634 -0.003597 
+-0.000680 0.002602 -0.001321 0.000426 0.000751 -0.000338 
+-0.000772 -0.000407 0.000772 0.000159 0.001239 0.000937 
+-0.000039 0.004488 -0.000104 0.001399 0.002774 -0.004173 
+-0.000271 0.002230 -0.002325 -0.000548 -0.001126 -0.005212 
+-0.000995 -0.001357 -0.007747 -0.000076 0.002089 -0.002316 
+-0.000791 0.002652 0.003475 -0.003720 0.003260 0.001040 
+-0.005242 0.002788 -0.004013 -0.005904 -0.002263 -0.004824 
+-0.000559 -0.003888 -0.002182 0.000663 0.001347 -0.001370 
+0.003978 0.011349 -0.004161 0.001646 0.010581 -0.011437 
+-0.000708 0.001351 -0.031026 0.020400 0.004371 -0.089677 
+-0.016533 0.030686 -0.022932 0.525180 -0.093525 5.712230 
+0.901841 -0.493865 7.641104 1.022124 -0.637168 8.028761 
+1.087167 -0.561743 7.677966 1.079365 -0.115079 6.242064 
+0.008842 0.010607 0.020624 0.007515 0.017036 -0.021459 
+0.008810 0.009145 0.004259 0.018237 0.014042 0.004169 
+0.013142 0.030500 -0.004803 0.023221 0.015052 -0.015164 
+0.003858 0.004476 -0.010929 0.003788 0.003372 -0.001183 
+0.005258 0.004627 -0.000546 0.001289 0.005676 -0.001159 
+0.000177 -0.000577 0.002912 -0.000352 -0.001804 0.007184 
+0.002234 0.000693 0.002854 0.001416 0.002434 -0.006113 
+0.000972 0.002368 -0.009736 0.000497 -0.001325 -0.012791 
+0.000792 -0.000499 -0.012642 -0.000412 0.001649 -0.005421 
+-0.000400 0.002118 0.002277 0.000000 0.001812 0.004077 
+-0.000131 0.000641 0.002025 -0.000052 -0.000140 -0.000637 
+-0.000432 0.001280 -0.001296 0.000667 0.002023 0.000078 
+0.005557 0.000168 -0.002750 0.005273 0.000319 -0.005785 
+0.006084 0.001421 -0.005258 0.003080 -0.000603 -0.001218 
+-0.004851 0.002134 -0.002175 -0.001374 0.001032 -0.001373 
+0.002048 -0.002343 0.001426 -0.002457 -0.002151 0.003327 
+0.000054 0.002568 0.000941 -0.001123 0.006612 -0.001373 
+-0.000103 0.006240 -0.001197 -0.001590 0.003924 -0.002148 
+0.000078 0.004594 -0.003598 -0.003737 0.003338 -0.003101 
+-0.001185 -0.001946 -0.003752 -0.000430 -0.003343 -0.002592 
+-0.000165 -0.001667 0.000132 -0.003336 -0.001353 -0.000892 
+0.000424 -0.000052 0.000496 0.000915 -0.000855 0.000789 
+-0.000548 0.000481 0.004465 0.000062 0.002375 0.005796 
+-0.002415 0.003768 0.003819 -0.000232 -0.000063 0.000667 
+0.001090 0.006177 -0.000906 -0.003051 0.006457 -0.003832 
+-0.000209 0.005214 -0.004285 -0.000200 0.002292 -0.001182 
+0.000920 -0.001531 -0.000292 0.000722 -0.000778 0.001172 
+0.001040 -0.000241 0.000151 0.001683 0.003279 -0.003624 
+-0.001009 0.002422 -0.004845 -0.001195 0.002527 -0.002806 
+-0.000259 0.001258 -0.000919 -0.008434 -0.002244 0.002362 
+-0.004230 0.002371 0.005767 -0.000032 -0.001763 -0.000833 
+-0.001764 -0.000346 -0.000858 -0.000268 0.000018 -0.000043 
+-0.002324 -0.000405 0.002622 -0.005228 -0.002139 0.000984 
+-0.004708 -0.003358 -0.002440 0.001999 -0.000819 -0.012333 
+0.023306 -0.000791 -0.036840 -0.023485 -0.002599 -0.029854 
+-0.006540 0.015647 0.002301 1.143750 0.275000 6.006250 
+1.145763 -0.498305 7.559322 1.007712 -0.655527 7.365038 
+0.789610 -0.446753 6.350649 0.513605 -0.027211 4.782313 
+0.004273 0.002020 0.026836 -0.001024 -0.001198 -0.011150 
+-0.002184 -0.004687 -0.005239 0.000226 0.009529 -0.000673 
+0.001090 0.015681 -0.005867 0.008390 0.015985 -0.004545 
+0.009625 0.002481 -0.006871 0.000432 0.000841 0.005609 
+0.002890 0.000719 0.006349 0.002960 0.002412 0.001505 
+0.002348 0.002314 0.001219 -0.000508 -0.000247 0.001054 
+0.001182 0.000212 0.000045 -0.001551 0.000856 -0.002247 
+-0.004694 0.001495 -0.002893 -0.001764 0.004234 -0.000424 
+0.000675 0.006810 -0.000515 0.001105 0.008138 0.000383 
+-0.000359 0.005382 0.001854 -0.002325 0.002673 0.001081 
+-0.000695 0.001564 -0.000668 0.001599 0.000667 -0.001900 
+-0.001197 0.005556 0.001581 0.001349 0.008469 -0.002261 
+0.002313 0.006616 -0.001461 0.004392 0.000171 -0.003241 
+0.001480 0.000716 -0.002745 -0.000903 -0.000195 -0.000404 
+-0.000676 0.001723 0.000321 0.002757 0.001922 -0.000387 
+0.003956 0.000032 0.000287 0.000013 -0.001070 0.001524 
+-0.003564 0.002484 0.001512 -0.005301 0.001709 -0.001932 
+-0.001275 0.003467 0.000561 0.000972 0.002941 0.000982 
+0.001590 -0.000903 0.001492 -0.001524 -0.004325 0.002751 
+-0.003897 -0.000996 0.000044 -0.003344 -0.000509 -0.007089 
+-0.004172 0.003073 -0.007420 -0.001943 -0.000126 0.000549 
+0.003511 0.011895 0.001529 0.007373 0.011150 -0.004137 
+0.001070 -0.001191 -0.000449 -0.001449 0.003039 -0.003116 
+0.000966 0.003841 -0.005275 -0.002506 0.002458 -0.005412 
+-0.002526 0.003049 -0.003016 -0.005221 -0.000561 0.002686 
+-0.003849 -0.004806 -0.000422 -0.000024 0.001373 0.000747 
+-0.000030 0.002595 -0.005109 0.002306 0.005959 -0.007014 
+0.003407 0.003407 -0.003556 -0.000280 0.000606 -0.002313 
+0.000036 -0.000205 -0.000703 0.000023 -0.000049 0.004667 
+-0.012848 -0.005297 0.006048 -0.004839 0.004657 0.007319 
+-0.008253 -0.002348 0.003182 -0.000995 -0.003756 -0.001698 
+-0.003494 0.001153 0.003320 -0.004985 -0.006230 -0.000114 
+-0.004539 0.000910 -0.009281 -0.009535 0.004070 -0.005599 
+0.000329 0.000210 0.000095 -0.000197 0.002766 0.005778 
+-0.000651 -0.000911 -0.000880 -0.001974 -0.002624 -0.001682 
+-0.001511 0.012404 -0.002744 1.219858 0.361702 4.992908 
+1.650862 -0.064655 6.392241 1.457747 -0.140845 5.654930 
+0.911538 -0.088462 4.169231 0.002908 0.001055 0.021971 
+-0.001680 0.002514 0.002696 -0.000103 0.002411 -0.005672 
+0.006393 0.000350 -0.004753 -0.000367 -0.000320 -0.001698 
+-0.006922 -0.000714 -0.003142 -0.004403 -0.001705 -0.004659 
+-0.000264 -0.001574 -0.004536 0.000404 -0.002629 -0.000647 
+0.000518 0.001612 0.000768 0.001104 0.007618 0.001115 
+-0.002627 0.008515 0.003020 -0.000619 0.002641 -0.004632 
+0.003736 -0.000065 -0.008194 0.002321 0.000167 -0.005461 
+-0.002486 -0.001780 0.000612 -0.004772 -0.003659 0.002657 
+-0.003252 0.002183 0.000619 0.000266 0.006596 -0.001167 
+0.000806 0.005518 0.000621 0.000144 -0.000134 0.001327 
+-0.002643 -0.001056 0.000316 -0.000680 0.004344 -0.001602 
+0.003606 -0.000042 -0.000650 0.002126 -0.000669 -0.000197 
+-0.002002 0.003185 -0.000351 0.000518 0.004457 -0.002385 
+0.000952 0.003972 -0.000163 0.001277 0.003423 0.000195 
+0.000262 0.002542 0.001039 -0.000210 0.003894 -0.000021 
+0.002250 0.004990 -0.001412 0.002295 0.002860 -0.001834 
+-0.002177 -0.000242 0.000968 -0.002816 -0.001421 -0.003106 
+-0.004969 -0.003781 -0.000238 0.001792 0.000829 -0.001321 
+0.007272 0.003212 -0.001242 0.001622 -0.000577 0.000661 
+0.002517 0.005484 -0.003434 0.000745 0.005173 0.000131 
+-0.000750 0.003984 -0.004165 0.000510 0.000218 -0.000669 
+0.003555 0.004454 -0.004117 0.001367 0.000919 -0.000221 
+-0.003430 -0.000807 -0.000909 -0.003238 0.000082 0.003238 
+-0.007918 0.002638 -0.000011 -0.001608 0.000036 0.004694 
+-0.000314 -0.005265 0.000525 0.008101 0.000730 0.003477 
+0.000788 0.003829 0.003677 0.001236 0.006923 -0.003092 
+0.000933 0.000055 -0.001208 -0.000168 0.000034 -0.000011 
+-0.001624 0.001757 0.000850 -0.002889 0.004515 0.000461 
+-0.003757 0.003508 -0.002515 -0.003976 -0.000211 -0.004433 
+-0.002347 -0.000423 -0.000524 0.007596 0.006426 -0.006931 
+0.017044 0.001770 -0.009099 0.001783 -0.005920 -0.008637 
+-0.002897 0.004074 -0.015842 -0.003824 0.007920 -0.005225 
+-0.001892 0.004191 -0.004174 -0.001554 0.003754 -0.003208 
+0.001314 -0.000889 -0.001222 0.006616 0.004085 0.001085 
+0.007777 0.007021 -0.000152 0.007095 0.010555 -0.008959 
+0.002670 0.006855 -0.013117 -0.000984 -0.002120 -0.004105 
+0.006658 0.001872 0.010793 0.004637 0.000611 0.013497 
+-0.000574 0.000826 0.004847 -0.005939 -0.000753 -0.011347 
+-0.012337 -0.001131 -0.010982 -0.006273 0.001958 -0.008605 
+-0.005536 0.000897 -0.000215 -0.003744 -0.000147 -0.002870 
+-0.006522 -0.002274 -0.008369 -0.006735 -0.003621 -0.008441 
+-0.005692 -0.001831 -0.004732 -0.005319 0.000504 -0.006724 
+-0.003811 0.004810 -0.005825 -0.002526 0.002490 0.000491 
+-0.002408 0.001772 0.004658 -0.002344 0.002949 0.004916 
+-0.001281 0.004295 0.002041 0.000529 0.004415 -0.001618 
+0.000904 0.002746 -0.000038 -0.001527 0.000235 0.000146 
+-0.002064 0.000605 -0.001173 0.000328 0.005247 -0.003730 
+0.007206 0.005356 0.000636 0.006440 -0.000164 0.002168 
+0.003724 0.000125 0.004177 -0.000032 0.001181 0.000136 
+0.001511 0.003101 -0.004127 0.001462 0.001129 -0.005246 
+0.000812 0.002478 0.000687 -0.004247 0.002240 0.001837 
+-0.002398 0.003423 0.001102 0.000421 0.000581 0.002194 
+0.003727 0.000860 -0.000288 0.002032 0.001549 -0.001394 
+0.000667 0.001917 -0.001167 -0.000345 0.004957 -0.000207 
+0.001251 0.006744 -0.002937 0.001041 0.004868 -0.002182 
+-0.001630 0.000653 0.000195 0.000410 -0.001711 -0.000929 
+-0.001779 0.000478 0.004141 -0.009328 -0.004011 0.000350 
+-0.001928 -0.003328 -0.002986 -0.005813 0.001626 -0.005813 
+-0.002261 0.003043 -0.006523 -0.001780 0.000586 -0.004210 
+-0.003437 -0.000953 -0.004219 -0.002776 0.001727 -0.002818 
+0.002357 0.003792 0.000513 0.002816 0.003668 -0.002218 
+0.002724 0.000949 -0.001517 0.004058 -0.000743 0.001385 
+-0.000747 0.000707 0.000131 -0.004091 0.001442 -0.000876 
+0.002471 0.006072 -0.002782 -0.000220 0.002793 -0.003364 
+0.000993 0.001143 -0.000289 -0.001140 0.001755 -0.001145 
+-0.001953 0.003319 -0.001422 -0.000433 0.000510 0.001190 
+0.004224 -0.002959 0.002527 0.004654 -0.003531 -0.002589 
+0.002473 0.000000 -0.011613 0.002000 0.000000 -0.018211 
+0.001862 0.005081 -0.017593 -0.002450 0.003237 -0.007916 
+-0.001609 0.000005 0.000452 0.001129 0.000607 -0.003885 
+-0.002925 0.003430 -0.007623 -0.004216 0.005917 -0.004410 
+-0.001377 0.005996 -0.000192 0.004373 0.002288 0.001245 
+0.005492 0.001925 -0.004052 0.002841 0.000870 -0.007401 
+0.003129 0.000589 -0.008882 0.005982 0.003916 -0.008029 
+0.001239 0.003025 -0.006788 0.004496 -0.005734 -0.006787 
+0.000239 0.002453 -0.003315 -0.001966 0.001812 -0.017001 
+-0.004347 0.009921 -0.013703 -0.006535 0.007644 -0.009943 
+-0.006822 0.001095 -0.005521 -0.003399 -0.002382 -0.005021 
+0.001066 -0.000593 -0.006953 0.004596 0.000880 -0.005289 
+0.000915 0.000106 -0.001468 -0.007714 -0.001118 0.001015 
+-0.011092 -0.001357 0.002926 -0.007479 -0.001287 0.002808 
+-0.005998 0.002902 0.000168 -0.004124 0.001941 -0.003340 
+-0.001206 0.007519 0.001807 0.001024 0.005419 -0.002001 
+0.000175 0.005548 -0.003014 0.001537 0.005465 -0.004576 
+0.001438 -0.000031 0.000417 0.000888 0.002462 0.002233 
+0.003416 0.003118 0.000223 0.000323 0.004268 -0.001865 
+-0.001601 0.005850 -0.003917 0.001432 0.007802 -0.005284 
+0.006098 0.002833 -0.001646 0.001376 0.000027 -0.000331 
+-0.001778 0.000365 0.000638 -0.001808 0.003896 -0.003131 
+-0.002147 0.001469 -0.002601 -0.002161 0.001318 0.000597 
+-0.000151 0.004951 -0.001045 0.000952 0.004044 -0.003101 
+0.001666 0.002888 -0.006088 0.004051 0.002629 -0.006474 
+0.002454 0.002324 -0.002597 -0.001399 -0.000403 -0.000874 
+-0.001157 0.001074 -0.000909 -0.002437 -0.000119 -0.000198 
+-0.003406 -0.000009 -0.001474 -0.002623 -0.000249 -0.001120 
+0.000956 0.006721 -0.002334 0.001588 0.009888 0.001624 
+0.001792 0.006843 -0.002379 -0.002935 -0.000024 0.000938 
+-0.002500 0.002067 0.001654 -0.003330 0.003105 0.005107 
+-0.002455 0.001473 0.004113 -0.000230 0.000493 -0.000561 
+0.002462 -0.000369 -0.004622 0.001225 -0.000293 -0.005621 
+0.002657 0.000538 -0.003262 0.003855 -0.000560 -0.003170 
+0.007034 0.000716 -0.001288 -0.000649 0.004615 -0.003154 
+-0.003772 0.008431 -0.004956 -0.002184 0.010505 -0.003172 
+-0.001126 0.006902 -0.000031 0.002166 0.002567 0.004664 
+0.003382 -0.000757 0.006460 -0.007206 -0.001514 0.000440 
+-0.009911 -0.000328 -0.014501 -0.005716 0.005258 -0.019721 
+-0.002028 0.008031 -0.019453 0.000920 0.006788 -0.016071 
+0.003237 0.001547 -0.010826 0.002120 -0.001929 -0.003423 
+0.001747 -0.001226 -0.001068 0.002428 -0.000155 0.000281 
+0.001925 0.006621 -0.004716 0.000765 0.003798 -0.008275 
+-0.000853 0.001856 -0.007541 -0.001081 0.000884 -0.006335 
+0.001246 -0.000415 -0.006923 0.001907 0.005678 -0.010446 
+0.001974 0.000612 -0.008257 -0.005034 -0.001287 -0.004284 
+-0.006814 -0.000765 -0.000412 -0.004250 0.000736 -0.000855 
+-0.003017 0.002533 -0.003398 -0.002695 0.004269 -0.004317 
+-0.003220 0.005349 -0.002147 -0.003417 0.006512 -0.002278 
+-0.001989 0.006953 -0.006950 -0.000462 0.003625 -0.007837 
+0.000193 -0.000413 -0.002816 -0.004852 -0.002177 0.001169 
+-0.007834 -0.001951 0.001432 -0.002376 0.003814 -0.000559 
+0.005568 0.009684 -0.004576 0.010322 0.010810 -0.006851 
+0.009320 0.005215 -0.005787 0.001166 0.001634 -0.000135 
+-0.005049 0.001880 -0.001145 -0.002912 0.001457 -0.004284 
+0.002817 0.001093 -0.003955 -0.000688 0.004497 -0.004505 
+-0.000461 0.001995 -0.002231 0.000175 0.002228 -0.001685 
+0.002442 0.005102 -0.003148 0.003625 0.007384 -0.002967 
+0.000988 0.003030 0.001581 -0.002826 -0.000619 0.001324 
+-0.003077 -0.003696 -0.002499 -0.005986 0.002049 -0.006441 
+-0.002112 0.004582 -0.000135 0.004450 0.003926 -0.001244 
+-0.001580 -0.000552 -0.001714 -0.005382 -0.003376 0.004140 
+-0.003277 -0.001473 0.001553 -0.000464 0.002599 -0.005570 
+-0.002880 0.004005 -0.009518 0.000863 0.006578 -0.008006 
+0.000246 0.002385 -0.005542 -0.000513 0.001378 -0.001602 
+-0.001300 0.001689 -0.000715 -0.002857 0.002750 -0.001130 
+-0.003438 0.003820 -0.001913 -0.001311 0.004590 0.001311 
+-0.000323 0.004006 0.002649 0.000599 0.004338 0.001340 
+0.002093 -0.000726 0.000897 -0.001223 -0.001634 0.000082 
+-0.004158 -0.000635 -0.002772 0.000562 0.002500 -0.001125 
+-0.002660 -0.000097 0.000789 -0.002506 0.004367 -0.000646 
+0.001454 0.003144 0.000913 0.002322 0.001069 -0.000703 
+-0.000577 -0.000262 -0.001757 -0.001248 0.004426 -0.000832 
+0.000607 0.000581 0.001427 0.001669 0.001737 0.001275 
+0.000177 0.000580 0.000520 -0.001985 0.001499 -0.003655 
+-0.000164 -0.001781 -0.001358 -0.005548 -0.008837 0.007807 
+0.000211 -0.006813 -0.000929 -0.004940 0.000533 -0.007298 
+-0.005205 0.008580 -0.006487 0.004491 0.008638 -0.008481 
+0.002057 0.001368 -0.006978 0.003621 -0.001466 -0.001207 
+-0.000047 -0.000855 -0.002658 -0.003070 0.001395 -0.005023 
+0.002597 0.002280 -0.004486 0.000808 0.000268 -0.001516 
+-0.000333 -0.000903 -0.000328 -0.001602 0.001747 -0.001444 
+-0.002755 0.005038 -0.003062 -0.003560 0.005512 -0.001569 
+-0.001179 0.003967 -0.000053 0.000490 0.002717 -0.001869 
+0.001455 0.002131 -0.005301 -0.001666 0.001211 -0.005751 
+-0.002853 0.001467 -0.004117 -0.002791 0.001395 -0.002791 
+-0.000363 0.004831 -0.003352 -0.001769 0.007415 -0.004354 
+0.000640 0.003856 -0.005466 0.000849 0.000896 -0.002949 
+-0.002141 0.000966 -0.002216 -0.000050 0.001257 -0.002171 
+-0.000686 0.000281 -0.002878 0.002509 0.002120 -0.002165 
+0.005692 0.007892 -0.006121 0.006847 0.009230 -0.007624 
+0.006933 0.008989 -0.005400 0.002797 0.003875 -0.001638 
+-0.003477 -0.005846 0.002099 -0.004174 -0.002490 -0.005060 
+0.002992 0.004278 -0.004695 -0.000086 0.006271 -0.004837 
+0.000500 -0.000386 -0.003949 0.000573 0.001669 -0.005247 
+0.001642 0.004918 -0.002973 0.001136 0.004406 -0.001903 
+0.000501 0.002816 -0.002415 -0.000599 0.000778 -0.003391 
+-0.004028 0.005156 -0.003867 -0.002899 0.006846 -0.005153 
+-0.003509 0.005612 -0.004387 -0.002032 0.004251 -0.000422 
+-0.000528 0.002306 0.001111 0.000357 0.001449 0.001289 
+0.001767 0.002811 0.000560 0.002235 0.005237 -0.000907 
+0.001557 0.007665 -0.003396 0.000522 0.007095 -0.006751 
+0.000379 0.001173 -0.007039 0.000831 0.000736 -0.003751 
+0.000998 -0.001133 -0.001627 0.001107 -0.001261 -0.003617 
+0.001055 0.005242 -0.006289 -0.004062 -0.000209 -0.001667 
+-0.004831 0.000203 -0.000153 -0.004407 -0.001461 0.000584 
+-0.003881 -0.001239 0.001514 -0.005969 -0.001809 0.002074 
+-0.004841 -0.000811 0.000539 -0.001994 -0.000139 -0.000711 
+0.001104 0.001312 -0.000400 0.002046 0.003449 0.000014 
+0.002179 0.005923 -0.001245 0.001955 0.006071 -0.003070 
+0.000927 0.002332 -0.002384 -0.001466 -0.003276 0.001237 
+-0.004750 -0.003650 -0.001217 -0.000018 0.000239 0.000101 
+-0.000866 0.004236 0.000915 -0.001521 0.005710 -0.000074 
+-0.003448 -0.001964 -0.001790 -0.007456 -0.004036 0.011041 
+0.000431 -0.000670 0.004539 -0.000930 -0.000327 -0.000894 
+0.000439 0.001397 -0.000868 0.000662 0.000131 -0.000045 
+-0.000020 -0.000354 -0.000409 -0.000726 0.001276 -0.003475 
+-0.003448 0.002497 -0.001783 0.001240 0.003756 -0.006976 
+0.001246 0.001615 -0.003723 0.000005 -0.000125 -0.000591 
+0.000142 0.000339 0.000671 0.000038 0.001703 0.001113 
+-0.000864 0.001538 0.001296 -0.001511 0.001407 -0.000911 
+-0.003019 0.001339 -0.000342 -0.001736 0.000122 0.000669 
+0.001754 0.001001 -0.000992 -0.000034 0.002629 -0.001383 
+-0.001081 0.000397 -0.000720 0.002992 0.002452 -0.001051 
+0.004217 0.003037 -0.002940 -0.000747 0.000885 0.000491 
+-0.000114 0.000172 0.005868 -0.005057 -0.000075 0.004606 
+-0.000705 -0.000108 0.001165 -0.000146 -0.000341 -0.000323 
+-0.002339 -0.002154 -0.000614 0.001722 0.000299 -0.003124 
+0.006890 0.010914 -0.010724 0.009720 0.017626 -0.012364 
+0.011399 0.012330 -0.014001 0.012522 0.013294 -0.008191 
+0.007771 0.008890 -0.004101 -0.003186 -0.002623 -0.000249 
+-0.001738 0.005039 0.004170 0.001394 0.004429 -0.001329 
+0.000488 -0.000424 -0.001675 -0.000045 0.000006 -0.002574 
+0.000879 0.003563 -0.004604 0.003584 0.006918 -0.002626 
+0.004485 0.002721 -0.006029 0.003461 -0.000054 -0.006541 
+0.002129 0.002680 -0.005479 0.000288 0.002754 -0.002209 
+-0.000429 0.000236 0.000707 0.000520 0.000531 0.000418 
+0.000340 0.001379 -0.000180 0.000137 0.001752 0.000350 
+-0.001161 0.000608 -0.001226 -0.002424 -0.001702 -0.000568 
+-0.002593 -0.000842 -0.000926 0.001313 0.001566 0.000126 
+-0.000587 0.001932 -0.004704 -0.001459 0.001656 -0.001428 
+-0.000412 0.001886 0.000009 -0.001360 0.000134 0.000211 
+-0.001005 0.000799 0.000851 -0.000766 0.000906 0.001744 
+-0.003920 -0.000212 0.005193 -0.006736 -0.001684 0.003629 
+0.002116 0.007407 0.001520 0.004431 0.004486 0.002572 
+0.002262 0.001617 0.003394 0.002274 0.000801 0.003075 
+0.002225 0.002987 -0.000351 0.000952 0.003317 -0.001873 
+-0.000817 0.002667 -0.000860 -0.001546 0.001399 0.000724 
+-0.000560 0.000000 0.002160 0.000680 0.001208 0.001419 
+-0.000178 -0.000067 0.002358 -0.001150 0.000924 -0.000352 
+-0.004135 0.004024 -0.000432 -0.004920 0.008726 -0.003180 
+0.000796 0.011732 -0.012359 0.000227 0.004592 -0.012396 
+-0.002216 0.002402 -0.003664 -0.001708 0.001775 0.002554 
+0.001147 0.000179 0.002330 0.000016 0.000679 0.000189 
+-0.001377 0.000755 0.000121 -0.001560 -0.000006 0.000222 
+0.000854 0.001169 -0.000664 0.002671 0.000618 -0.003634 
+0.004509 0.002049 -0.003571 0.002145 0.002825 -0.003469 
+-0.000119 0.002128 -0.002749 -0.001429 0.000383 0.000128 
+-0.000309 -0.000819 -0.001019 0.000431 -0.000050 -0.001355 
+-0.000182 -0.001744 -0.002368 -0.001743 -0.002567 -0.001601 
+0.001931 -0.002292 0.002055 0.001212 -0.000813 0.004036 
+-0.001854 0.003061 0.003033 -0.001327 -0.000073 0.000815 
+0.002096 0.000440 -0.001992 0.001532 0.003226 0.000081 
+-0.006207 -0.000511 0.001217 -0.006307 0.003159 0.000023 
+-0.001085 0.001035 -0.001187 -0.000598 0.000429 0.000018 
+-0.000275 -0.000405 0.000218 -0.008767 -0.003299 -0.001356 
+-0.000830 -0.001515 0.000997 0.003319 0.005918 -0.005694 
+0.008721 0.014859 -0.008044 0.015559 0.019682 -0.012514 
+0.018066 0.023896 -0.013868 0.015975 0.021091 -0.013489 
+0.009013 0.012702 -0.010781 0.005314 0.005081 -0.009424 
+0.001067 0.002616 -0.003040 -0.000822 -0.000106 0.002331 
+-0.001891 0.002758 0.003129 -0.001259 0.002370 0.002370 
+-0.002503 0.000950 -0.000430 -0.001176 0.000887 -0.000089 
+0.000197 0.002354 -0.002578 0.001018 0.005160 -0.004942 
+-0.001758 0.004437 -0.002344 -0.003472 0.002397 0.000654 
+-0.007050 0.001688 0.001946 -0.005603 0.000627 0.004389 
+-0.001975 0.003364 0.001237 0.000261 0.002754 -0.000085 
+-0.000932 0.004162 -0.002725 -0.001348 0.003706 -0.007615 
+-0.000501 0.003041 -0.007236 -0.001416 0.002540 -0.003054 
+-0.000250 0.003417 -0.000833 -0.002352 0.003135 0.000887 
+-0.002744 0.002703 -0.000635 -0.002363 0.000777 -0.002169 
+0.000652 -0.000601 -0.002109 0.004204 -0.002330 -0.000152 
+0.004390 0.001104 -0.002039 0.003235 0.000403 0.001212 
+0.000220 0.000044 0.002901 0.001222 -0.001288 -0.002311 
+0.003465 0.001468 -0.005873 0.003292 0.002549 -0.003539 
+0.000458 0.001878 -0.000626 -0.000070 0.002166 -0.001712 
+0.002371 0.001239 0.000478 0.002102 0.000278 0.001117 
+0.003945 -0.000625 0.003945 0.005547 -0.001148 0.005286 
+-0.001484 0.002115 0.003181 -0.009697 -0.005184 -0.004998 
+-0.015485 0.010154 -0.011172 -0.012389 0.007839 -0.011545 
+-0.002683 0.007491 -0.009632 0.002436 0.007915 -0.004651 
+0.000861 0.004188 0.000307 -0.000860 0.001038 -0.001819 
+-0.002852 -0.001365 -0.001266 -0.005000 -0.001269 0.001269 
+-0.000013 -0.000793 0.001651 -0.002528 -0.003083 0.004045 
+-0.005691 -0.000898 -0.003380 -0.001377 0.000137 -0.002273 
+-0.000723 0.002362 -0.002014 -0.000570 0.003961 -0.002327 
+-0.000963 0.003665 -0.002453 -0.001003 0.001688 -0.000010 
+-0.002977 -0.001488 0.000853 -0.001304 -0.000533 0.002152 
+0.001962 -0.000488 0.001071 0.003157 -0.002937 -0.001103 
+0.001654 -0.002578 0.001225 0.000978 -0.001381 -0.000657 
+0.000047 -0.000966 -0.000510 0.001754 -0.000120 -0.000791 
+-0.000042 0.000150 0.000093 0.000750 0.006327 -0.007453 
+0.003953 0.005520 0.002366 -0.001541 0.000015 -0.001773 
+-0.002709 0.002056 -0.007284 0.005981 0.005124 -0.006192 
+0.002512 0.002206 -0.003944 0.003825 0.004098 -0.006556 
+0.006956 0.009291 -0.010291 0.010948 0.016698 -0.012398 
+0.013996 0.024388 -0.009846 0.018113 0.020667 -0.006736 
+0.010323 0.012005 -0.007477 0.003343 0.009340 -0.002856 
+-0.000108 0.003969 0.002503 -0.004982 0.002908 0.003023 
+-0.006402 0.002403 0.002504 -0.000645 0.001504 0.002450 
+0.003853 0.004569 -0.003000 0.001518 0.002623 -0.002781 
+-0.001748 -0.000636 0.001154 -0.001231 0.000925 0.003903 
+0.001430 0.002752 0.003048 -0.000536 0.002494 -0.001515 
+-0.004186 0.000352 0.002392 -0.004962 0.000667 0.004462 
+-0.004866 0.001351 0.003645 -0.003193 0.002813 0.001968 
+-0.002844 0.002170 -0.002199 0.000218 0.001253 -0.002888 
+-0.001299 0.001946 0.000701 -0.001066 0.000745 -0.000033 
+0.003157 -0.001232 0.003509 -0.001584 -0.002869 0.005543 
+-0.006935 -0.002357 -0.000471 -0.004070 0.001704 -0.002696 
+-0.001052 -0.001412 0.001743 0.000081 -0.004208 0.005204 
+0.000363 -0.000363 0.001129 0.001693 0.001481 -0.001376 
+0.004919 0.002833 -0.000298 0.000082 0.006712 -0.003191 
+0.003346 0.001628 -0.000061 -0.000933 0.005333 -0.003467 
+0.003833 0.003542 0.000370 0.002350 0.002835 -0.003525 
+-0.000256 0.000018 -0.000155 0.001763 0.001320 -0.000776 
+0.000896 0.000844 0.002757 0.004935 -0.003239 0.006427 
+0.001617 -0.000763 0.002181 -0.006292 0.008074 -0.015320 
+-0.008896 0.017572 -0.017873 -0.009928 0.017452 -0.012275 
+-0.006405 0.011117 -0.009012 -0.001498 0.006346 -0.003158 
+-0.000944 0.004141 -0.002744 0.003177 0.006786 -0.001632 
+-0.002452 0.005207 -0.002145 -0.001691 0.000859 -0.000494 
+-0.002813 -0.001201 -0.000236 -0.002622 0.001095 0.000166 
+-0.001409 0.001341 -0.003062 0.000999 0.003796 -0.001909 
+-0.000465 -0.001938 -0.001938 -0.001244 0.000556 0.000102 
+-0.001771 0.000256 0.000317 -0.000470 0.001594 0.000250 
+0.000024 0.002222 0.000390 0.004885 -0.001050 -0.000788 
+0.003972 0.003164 -0.007206 0.002687 0.000573 -0.003656 
+0.000165 0.003224 -0.002211 0.000937 0.002261 -0.001857 
+0.001928 0.004532 -0.002865 0.004175 0.003550 -0.002166 
+0.001594 0.003150 -0.001139 -0.001594 0.002217 0.000349 
+0.000616 0.002166 0.001314 0.002616 0.000977 0.000653 
+0.001858 -0.000437 -0.001421 -0.000854 0.000178 -0.002703 
+-0.001905 0.002927 -0.007015 0.002532 -0.000422 -0.001172 
+0.003094 0.002212 -0.008883 0.005069 0.008817 -0.007966 
+0.009256 0.016774 -0.011433 0.011020 0.021367 -0.013270 
+0.008608 0.019090 -0.013986 -0.001531 0.006816 0.002700 
+0.004129 0.000361 -0.000178 -0.003542 -0.003148 -0.001259 
+-0.005349 -0.003199 0.001577 -0.001825 0.000735 0.001364 
+-0.002242 0.001868 -0.003488 0.001290 0.002258 -0.004194 
+0.000167 0.000808 -0.001212 -0.000654 -0.002192 -0.001804 
+-0.000037 0.000601 -0.001864 -0.001533 0.002000 -0.001283 
+-0.000016 0.000677 0.000158 -0.000827 -0.001159 0.001489 
+0.000521 -0.000872 0.001902 -0.005180 0.002006 -0.000779 
+-0.004266 0.002989 -0.000843 -0.000141 0.001689 -0.000138 
+0.000052 0.003997 0.000676 0.001760 0.004837 0.002010 
+-0.000506 0.001591 0.000782 0.000053 -0.000556 -0.002864 
+-0.001732 -0.000915 -0.004573 -0.000286 -0.002173 -0.001658 
+-0.000414 0.001171 0.000883 -0.001286 0.003140 0.001140 
+-0.002030 -0.000236 -0.000338 -0.000515 0.001145 -0.001038 
+0.001628 0.004405 -0.001992 0.000862 -0.000287 -0.000862 
+0.001145 0.003071 -0.005119 -0.000568 0.004491 -0.001265 
+0.001790 -0.001519 -0.000726 0.000474 0.006701 -0.002877 
+-0.000576 0.004563 0.000853 0.000285 0.002645 0.000030 
+-0.000069 -0.001647 -0.000434 0.002796 -0.008922 0.001174 
+-0.001852 -0.008404 0.000711 -0.008083 0.004685 -0.012845 
+-0.010049 0.013227 -0.019539 -0.008474 0.012668 -0.021638 
+-0.009118 0.010120 -0.014335 -0.003217 0.004553 -0.004262 
+0.001139 -0.001339 0.002593 0.000211 -0.000572 0.000696 
+0.001505 0.004358 -0.001689 0.004588 0.003892 -0.002019 
+0.003906 0.000110 -0.000028 0.001616 -0.000512 -0.000108 
+-0.001156 -0.000205 -0.000141 -0.001484 -0.000606 -0.001060 
+-0.002267 0.001637 -0.000168 -0.001634 0.001039 -0.000362 
+0.002074 -0.000326 -0.000652 0.000550 0.000267 -0.000441 
+-0.001389 -0.001534 -0.000437 0.000246 -0.000077 -0.000123 
+0.002807 0.003265 -0.001518 0.004519 0.002260 -0.004122 
+0.003533 0.003707 -0.000376 0.002243 0.004252 -0.000345 
+0.003386 0.005417 -0.000492 0.004437 0.005748 -0.000887 
+0.000397 0.004167 -0.003373 -0.002360 0.001920 -0.002360 
+-0.004000 0.000384 0.000768 0.002080 0.004000 -0.002080 
+0.004372 0.003939 -0.006854 0.003937 0.005071 -0.002535 
+-0.001197 0.000631 -0.000466 -0.002424 0.001337 -0.000293 
+-0.004213 -0.001915 0.000613 -0.002723 -0.000002 -0.001088 
+0.000992 0.006081 -0.002606 0.004059 0.009133 -0.003437 
+0.003261 0.009016 -0.003307 0.002078 0.008682 -0.005808 
+0.000404 0.000216 -0.006388 -0.002604 -0.002925 -0.003048 
+-0.004391 -0.004965 -0.000495 -0.001305 -0.001360 0.001087 
+0.001030 0.002493 -0.000434 -0.000019 0.002642 0.000437 
+-0.000806 0.000806 0.001048 -0.000054 -0.000324 0.000594 
+0.000496 0.000217 -0.002480 -0.000655 0.001203 -0.004117 
+0.001505 0.000440 -0.002384 0.001772 -0.001299 -0.001409 
+-0.000655 -0.001490 -0.002171 -0.003094 -0.001753 -0.001722 
+-0.001947 -0.001347 -0.001199 -0.000070 -0.000744 0.002275 
+0.000082 0.000951 0.000722 0.003128 0.000467 0.000533 
+-0.000592 0.001385 0.000021 -0.001354 0.001380 -0.002448 
+-0.003566 0.000358 -0.000537 -0.000857 -0.000242 -0.000019 
+0.001214 -0.000172 0.000997 0.000034 -0.000088 0.000013 
+-0.000516 -0.002097 0.000258 0.000438 -0.001351 -0.000037 
+-0.000348 0.000334 -0.000406 -0.000003 -0.000395 -0.002790 
+0.001300 0.004295 -0.000522 -0.001012 0.001510 -0.000801 
+-0.002586 0.001695 -0.000173 -0.001567 -0.002419 -0.001915 
+-0.001230 -0.001424 -0.002136 -0.001876 -0.000015 -0.002738 
+-0.001386 -0.000335 -0.002328 0.000630 -0.002660 0.001171 
+0.008344 0.000461 -0.003500 0.000785 0.006879 -0.000082 
+-0.000722 0.009655 -0.007152 -0.001999 0.003485 -0.007651 
+-0.003368 0.000962 -0.001938 0.000631 -0.002285 -0.000918 
+0.001101 -0.002194 0.000094 0.004727 -0.002042 -0.004493 
+0.004919 0.001640 -0.007928 -0.000616 0.004544 -0.006596 
+-0.002782 0.002088 -0.005066 -0.002759 0.002222 -0.002248 
+-0.000996 0.001550 0.000325 -0.000351 -0.000652 -0.000681 
+-0.001185 -0.001919 -0.004157 -0.002000 -0.000970 -0.006793 
+0.001926 0.003037 -0.001926 -0.000197 0.001623 -0.000664 
+-0.000661 -0.001219 0.001660 -0.000816 0.000326 0.000153 
+-0.002611 0.000104 -0.000627 -0.002538 0.001100 0.001833 
+-0.001569 -0.000785 0.003692 -0.000115 0.000840 -0.000115 
+-0.002299 0.002129 0.000042 -0.000985 0.003000 0.000492 
+-0.001537 0.001641 0.001281 -0.000612 0.000654 0.001711 
+-0.002381 -0.000907 -0.001795 0.001401 -0.000003 -0.000382 
+0.003205 0.001796 -0.003091 0.000465 -0.000698 0.001008 
+0.000690 -0.000772 -0.000049 -0.002787 -0.001466 0.000721 
+-0.002035 -0.002674 -0.007209 0.000317 0.000618 -0.000842 
+-0.001382 -0.001834 0.000201 -0.001653 0.000000 0.001653 
+0.001167 0.000281 -0.000636 0.003532 0.003795 -0.002173 
+-0.000072 0.002862 -0.002899 -0.000593 -0.002511 -0.001392 
+-0.000120 0.000709 0.000037 0.001433 0.003549 -0.001795 
+0.002302 0.002516 -0.001601 0.001543 -0.001122 0.001175 
+-0.000587 -0.003173 0.002773 -0.001639 -0.000015 0.002119 
+0.002010 0.004965 0.001416 0.002202 0.000648 0.002560 
+0.000475 0.001240 0.002736 -0.000531 0.001917 0.003089 
+-0.002180 -0.001560 0.003765 0.000079 -0.001257 0.002871 
+-0.002189 -0.001144 0.003333 -0.000629 -0.002325 0.002968 
+-0.001091 -0.001090 0.002177 -0.001379 -0.000494 0.000489 
+-0.002319 -0.000266 0.000362 -0.002500 -0.002910 0.002705 
+-0.001840 -0.003140 0.000263 0.001746 -0.000798 0.000382 
+0.000534 0.001886 0.000940 0.005008 0.005872 -0.007167 
+-0.002756 -0.001323 0.002646 0.000713 0.000141 0.003130 
+0.001419 -0.000941 0.002882 0.002228 0.001638 -0.000447 
+-0.001115 0.003423 -0.000594 -0.001255 0.001120 -0.002452 
+-0.004917 0.001786 -0.000021 -0.001958 0.001763 -0.001273 
+-0.000997 0.002000 -0.000166 -0.001168 0.001440 -0.000414 
+-0.000241 0.001480 0.000786 -0.001481 0.002747 0.000188 
+-0.000379 0.006660 0.000965 -0.001713 0.008015 -0.005581 
+-0.000530 0.003006 -0.004087 0.002868 -0.000579 -0.002791 
+0.004043 -0.001000 0.001582 0.002716 0.002707 0.003495 
+0.007775 0.009207 -0.002251 0.008097 -0.000921 0.002352 
+-0.001641 -0.001088 -0.004231 -0.002992 -0.000030 -0.008045 
+-0.002561 -0.001040 -0.004833 -0.001015 -0.001060 -0.000767 
+-0.000758 -0.001103 -0.000590 -0.001885 0.000764 -0.001701 
+-0.001690 0.001233 -0.003288 -0.001856 0.001166 -0.000082 
+-0.001292 0.000969 0.002519 -0.001358 0.000652 0.000924 
+-0.000772 0.002147 -0.001793 0.000167 0.003127 -0.001235 
+-0.000583 0.000590 0.000148 -0.001591 0.000048 -0.000572 
+-0.004160 -0.000288 -0.000789 -0.006352 0.001391 0.001785 
+-0.008571 0.000000 0.000397 -0.005433 -0.001446 0.001735 
+0.000223 -0.000599 0.000128 0.004554 0.002353 -0.003140 
+-0.000744 0.004545 -0.000744 0.001157 0.004630 -0.003952 
+0.001250 0.001308 -0.000144 -0.001054 0.000418 0.003817 
+-0.001432 -0.000613 0.003682 -0.001297 -0.001083 -0.000288 
+-0.002285 -0.001118 -0.005056 0.001329 -0.000212 -0.002407 
+-0.001878 0.000578 -0.001242 0.000213 0.003240 0.000777 
+-0.000221 0.005607 0.000489 -0.005235 0.008301 0.000011 
+-0.008925 0.007074 -0.006733 0.000100 -0.000462 -0.002334 
+0.000229 0.001412 0.000475 0.000979 0.000575 -0.000364 
+-0.000210 -0.001140 0.000602 -0.001738 -0.000614 0.002097 
+-0.001268 -0.000036 0.004022 0.001275 0.000251 0.004077 
+0.001026 -0.000413 0.001132 0.000830 -0.000415 -0.003111 
+0.000002 -0.001235 -0.006162 -0.001104 0.000203 -0.004821 
+-0.000761 0.000436 -0.000464 -0.002117 0.000261 0.000774 
+-0.001764 0.000769 0.000537 -0.001277 0.000026 -0.000136 
+-0.002141 -0.000698 0.000184 -0.002895 -0.000701 0.000133 
+-0.001548 -0.000779 -0.000315 0.000385 -0.000272 -0.000078 
+0.000778 0.000854 0.000536 0.000860 0.000330 0.000566 
+0.001662 0.000727 0.000065 0.001733 0.001096 -0.002633 
+-0.003956 -0.005446 -0.000103 0.000274 -0.004231 0.002465 
+0.002149 0.000877 0.002295 0.000719 0.004493 0.001528 
+0.001409 0.003478 0.000509 -0.001374 0.001612 -0.000691 
+-0.001934 0.002939 -0.001145 -0.001022 0.004888 -0.001504 
+-0.001567 0.002914 -0.001637 -0.000320 -0.000418 -0.001217 
+-0.001100 -0.003820 -0.004207 -0.003598 -0.002956 -0.004484 
+0.016163 0.009153 -0.013112 0.002702 0.007167 -0.010926 
+0.000052 0.000906 -0.000608 -0.001992 -0.000165 0.001419 
+0.000214 0.003347 0.001158 0.000009 0.005781 0.000970 
+0.001128 0.002624 -0.004642 0.001128 0.000813 -0.004213 
+0.003566 0.002085 -0.006256 0.006535 0.008268 -0.006535 
+0.002879 0.009480 -0.004307 -0.002217 0.003824 -0.002959 
+-0.005721 0.000471 -0.001346 -0.003624 0.002498 -0.001900 
+-0.001061 0.002678 -0.004239 0.001121 0.001664 -0.004207 
+0.001998 -0.000072 -0.003350 0.003271 -0.001517 -0.002171 
+0.002258 0.003065 -0.004919 -0.001817 0.001519 -0.001400 
+-0.000568 0.001247 0.000939 0.002177 0.002376 0.000050 
+-0.001540 0.001672 -0.004359 -0.002824 0.002346 -0.004867 
+0.001193 0.001238 -0.004730 -0.000523 0.001554 -0.000602 
+-0.000161 0.000418 -0.000093 0.001800 0.000634 0.000105 
+0.002815 0.000421 -0.001447 0.000991 -0.000287 -0.002426 
+0.000359 -0.001667 -0.000538 -0.001108 -0.000847 0.000599 
+-0.000347 0.003653 -0.001653 0.001767 -0.000306 -0.003464 
+0.002236 -0.000288 -0.005230 0.002900 -0.002118 -0.001703 
+-0.002632 -0.002255 -0.000238 -0.000198 -0.000689 0.000186 
+-0.001382 0.002822 0.002305 -0.005448 0.003165 0.003037 
+-0.011285 -0.001575 0.000276 -0.004834 -0.003950 0.003559 
+0.000104 0.000475 0.000140 0.003312 0.001868 -0.001626 
+0.001972 0.001612 -0.000753 0.000785 -0.000543 0.000211 
+-0.001064 -0.000711 -0.000325 -0.003846 -0.001020 -0.000272 
+-0.003458 -0.002000 -0.001146 -0.001232 -0.000224 -0.002911 
+-0.000112 -0.000382 -0.000292 0.002928 0.002031 -0.001302 
+0.002706 0.001364 -0.001108 -0.000097 -0.001115 -0.000113 
+-0.000974 -0.001169 0.000097 -0.000921 0.000086 0.002092 
+-0.000649 0.000476 0.003286 -0.002869 -0.001200 0.002845 
+-0.001947 -0.003038 0.003737 -0.002299 -0.000863 0.004023 
+0.001301 -0.000604 0.000529 0.001365 0.001600 -0.000463 
+-0.001167 0.001219 -0.002828 0.000444 0.000773 -0.002215 
+0.000134 0.003204 -0.000963 0.001893 -0.001395 -0.002313 
+0.002020 -0.000270 -0.003345 0.004989 -0.000573 0.000222 
+0.000239 0.005061 0.001064 0.002188 0.008094 -0.002406 
+0.002457 0.006694 -0.000921 0.001397 0.002468 -0.004508 
+0.000592 -0.001857 -0.001433 0.001699 -0.002198 0.000719 
+0.000989 0.000992 0.002051 0.001082 0.010457 0.001330 
+-0.004319 0.009643 -0.007130 -0.002922 0.006656 -0.005306 
+-0.000859 0.004048 -0.004274 0.005227 -0.000911 -0.001276 
+-0.001840 0.002119 -0.001686 0.002620 0.007071 -0.002553 
+-0.000245 0.002976 -0.003360 -0.000533 -0.000018 -0.000773 
+0.001529 0.000613 -0.001409 0.005903 0.001708 -0.006368 
+0.006537 0.011082 -0.001515 0.005591 0.010396 -0.005941 
+0.001291 0.006947 -0.004673 0.002149 0.005494 -0.002030 
+0.005537 0.003187 0.002647 0.004319 -0.001710 0.000987 
+0.002319 0.000721 -0.001184 -0.000336 0.002568 -0.001544 
+-0.001717 0.003005 -0.002558 -0.002544 0.001132 -0.001300 
+0.001182 0.000233 -0.001146 0.002485 0.000173 -0.002633 
+-0.001412 0.000992 -0.000365 -0.004109 -0.000009 -0.001026 
+-0.004394 0.001339 0.001465 0.000000 0.002258 0.004355 
+0.000338 0.003468 -0.000423 -0.000472 0.003378 -0.002032 
+-0.000593 -0.000039 -0.000809 0.001637 0.000218 -0.001556 
+0.000493 0.000980 -0.001945 -0.001392 0.000947 -0.002576 
+-0.006000 0.000000 0.000640 -0.003268 0.002567 0.000271 
+0.001083 -0.001606 0.004967 -0.000737 -0.000435 0.000638 
+0.000674 0.003043 0.000617 -0.001232 0.005769 -0.008411 
+0.006128 0.004839 -0.007648 0.009556 0.005226 -0.005084 
+0.009888 0.006620 -0.001030 0.000190 0.002033 -0.000622 
+-0.005684 -0.007426 0.003031 -0.009614 -0.009509 0.003803 
+-0.006697 -0.004429 0.002006 -0.000195 -0.000087 -0.000022 
+0.002599 -0.001891 -0.001959 0.005846 0.001415 0.000708 
+0.004165 0.003761 -0.002401 0.002593 0.001935 -0.002117 
+0.002355 0.005266 -0.003089 0.001926 0.004096 0.001004 
+0.002093 0.001395 0.000465 -0.000473 0.002352 -0.001222 
+-0.001289 0.001031 0.001290 0.000049 -0.001730 0.001138 
+-0.000504 -0.001179 -0.000844 -0.000233 -0.000070 -0.002770 
+0.000514 0.000530 -0.003252 0.001721 -0.000031 -0.001562 
+0.002773 0.000486 0.000195 0.002094 0.001093 -0.000035 
+-0.000707 0.000143 -0.000713 -0.003333 0.000159 -0.001429 
+0.000204 -0.000429 0.000255 0.001846 0.000462 -0.002308 
+0.006406 0.000797 -0.002391 0.005241 0.001606 -0.001649 
+0.002727 0.002841 -0.002614 0.002229 -0.000141 0.000207 
+0.006137 0.003182 -0.001682 -0.000702 0.001946 0.000344 
+0.000577 -0.000802 0.000050 0.000881 -0.003127 -0.001142 
+0.000618 -0.003858 -0.001119 0.000145 -0.000114 -0.001857 
+-0.002429 0.004476 0.001348 -0.001255 0.006221 0.003344 
+0.001602 0.006234 0.003383 0.002732 0.000683 -0.001129 
+-0.002613 -0.000937 -0.000111 -0.005873 0.000939 0.000282 
+-0.004928 0.004461 -0.003400 -0.001678 0.001196 -0.001659 
+0.005163 0.002841 0.001040 0.000426 0.001877 -0.002104 
+0.000287 0.000409 -0.002497 0.003095 0.000000 -0.002540 
+-0.000952 0.002540 0.001587 -0.001725 0.001791 0.000083 
+-0.002195 0.001029 -0.000082 -0.002411 0.000462 0.001631 
+-0.001708 0.000190 0.002087 -0.001349 0.000413 -0.000206 
+-0.001373 0.001653 -0.001755 -0.000396 0.002018 -0.002651 
+0.000944 0.000997 -0.001976 0.000831 0.000398 0.000362 
+-0.002266 0.000355 0.001773 -0.003915 -0.001158 0.002178 
+-0.002095 -0.002052 0.001739 0.000694 -0.001686 -0.000644 
+0.000693 0.000305 0.000230 -0.003116 0.003146 -0.000558 
+-0.003436 -0.000561 -0.002688 -0.006253 0.001398 0.001265 
+-0.004598 0.000087 -0.000355 -0.004031 -0.001442 -0.000462 
+-0.003187 -0.003755 0.001309 -0.001290 -0.000456 -0.002328 
+-0.002185 0.001268 -0.001054 -0.002562 0.001556 0.000320 
+-0.003273 0.000777 -0.000726 0.000156 0.000329 -0.005231 
+0.003179 -0.002516 -0.003133 0.004361 -0.003220 -0.003037 
+0.007237 0.000869 -0.000957 0.003233 0.002669 0.003642 
+0.002718 0.004871 -0.002393 -0.000218 0.000199 0.000183 
+-0.000890 -0.000042 0.000253 0.001940 0.001278 0.000781 
+0.006933 0.004889 0.000172 0.004591 0.007077 -0.003855 
+0.000019 0.001188 -0.000435 -0.001689 -0.001144 0.000695 
+-0.002133 -0.003374 0.003348 0.001006 -0.000644 0.001435 
+-0.000320 0.003802 -0.001496 0.000462 0.005367 -0.003175 
+-0.000026 0.004661 -0.003493 -0.001971 0.001037 -0.000484 
+-0.001144 -0.000919 -0.001476 -0.001157 0.000112 -0.000531 
+0.000419 -0.000691 0.000648 0.000259 -0.001986 0.000174 
+-0.000264 -0.000576 -0.000985 -0.000431 0.000994 0.000248 
+0.000278 0.001588 -0.000065 -0.001074 0.000124 -0.000455 
+-0.004028 0.001040 -0.002663 0.002503 -0.001782 -0.005811 
+0.006190 -0.001542 -0.005141 0.003926 0.002508 -0.003493 
+0.000623 0.002609 -0.000118 0.000995 0.002581 0.002382 
+0.001374 0.008244 -0.002977 -0.001838 0.005313 0.000048 
+-0.000424 0.001343 0.000475 0.001010 0.001569 0.001411 
+-0.002076 -0.002801 0.007987 -0.003867 0.011061 0.010296 
+-0.004965 0.010783 0.006138 -0.003937 0.006628 0.002645 
+-0.004962 0.001495 0.002136 0.000206 -0.002105 0.000130 
+-0.000774 -0.000573 -0.001735 0.003043 -0.000866 -0.004331 
+0.005439 0.003086 -0.002799 0.001654 0.006794 -0.003127 
+-0.001731 0.002671 -0.001580 -0.001048 0.001739 -0.000424 
+-0.000783 0.000217 -0.000189 0.000646 -0.000207 0.000749 
+0.001765 0.003125 0.000441 0.002349 0.000751 0.000718 
+-0.001399 0.000117 -0.003566 -0.001957 0.002196 -0.004083 
+0.002182 0.002582 -0.002722 0.007097 0.003984 -0.001774 
+0.006064 0.005203 0.001516 -0.000640 0.002562 -0.003871 
+-0.001378 0.001260 -0.001614 -0.005315 0.001062 -0.001367 
+-0.005569 -0.000124 0.000681 -0.001772 0.003031 -0.001002 
+-0.001706 0.001706 -0.004524 -0.001470 0.000971 -0.000499 
+-0.000490 0.001038 0.000803 0.001591 0.001038 0.002423 
+0.003950 0.004340 0.000806 0.003670 0.004906 -0.000656 
+0.002437 0.002101 -0.000421 0.001117 -0.002233 0.000917 
+0.002020 0.002567 0.001842 0.003116 0.007059 -0.000184 
+-0.000145 0.008621 -0.001087 -0.000325 0.006087 -0.000046 
+-0.001380 0.002636 -0.000320 0.003110 0.005085 -0.008012 
+0.008468 0.006452 0.000000 0.004038 0.007713 0.002672 
+-0.001706 0.006099 0.003797 -0.002042 0.003975 0.002924 
+0.004723 0.002792 0.002148 0.008620 0.001875 -0.002441 
+0.004964 0.001298 -0.001777 -0.002459 -0.000477 0.001056 
+-0.005696 -0.001625 0.002489 -0.003754 -0.000155 0.002260 
+-0.001063 0.000461 0.002170 -0.001862 0.001245 0.003742 
+-0.000556 0.002454 -0.000446 -0.000745 0.002251 -0.001025 
+0.002362 0.003775 -0.003305 0.003943 0.001091 -0.001493 
+-0.000263 -0.000237 -0.000480 -0.002387 0.000708 -0.000776 
+-0.003410 0.001200 -0.001251 -0.002397 0.001697 -0.000781 
+-0.001619 0.002914 -0.000960 0.003278 0.004683 -0.000937 
+0.000029 -0.000539 -0.000737 -0.002156 0.000804 -0.005149 
+-0.003571 0.001532 -0.004595 0.000152 0.000607 -0.001371 
+0.001821 0.003463 -0.001503 0.000888 0.007993 -0.003849 
+-0.002998 0.005820 -0.003967 -0.000352 0.001700 0.001684 
+-0.005811 -0.003426 0.003396 -0.008444 -0.007683 0.005748 
+-0.005374 -0.004800 0.006583 -0.001502 -0.000222 0.000806 
+0.001257 0.001691 -0.004314 0.002107 0.007738 -0.004886 
+-0.000099 0.010980 -0.006854 0.003402 0.006669 -0.009817 
+0.004498 0.003736 -0.002943 0.000956 0.004771 -0.005848 
+0.005257 0.006944 -0.008287 0.017589 0.014529 -0.024444 
+-0.001261 0.043754 -0.071307 0.015342 0.011720 0.048370 
+0.001716 0.006766 -0.025415 -0.040912 -0.008946 0.070969 
+0.003796 -0.021085 0.068743 0.007292 -0.010104 0.039271 
+-0.020000 -0.005000 0.021667 -0.015189 -0.019174 0.035964 
+-0.000753 0.029115 -0.028663 -0.011818 0.012727 -0.026364 
+0.007411 -0.000893 0.020446 0.061042 -0.042708 -0.009167 
+0.068912 0.099456 -0.059320 -0.066111 -0.038889 -0.027222 
+-0.037845 0.001293 0.059353 -0.084000 0.015556 0.080889 
+-0.010159 0.018254 -0.060794 0.040196 -0.045980 -0.014314 
+-0.041333 -0.020667 -0.025000 0.046735 -0.034796 0.042755 
+0.090833 -0.014167 0.019167 0.011250 -0.096875 0.096875 
+-0.108661 -0.080179 0.017232 -0.165714 0.014286 0.000000 
+-0.072500 0.051250 -0.072500 -0.001250 0.010200 -0.007650 
+0.021972 0.039806 -0.023056 -0.002600 0.007800 -0.003000 
+-0.063182 -0.051818 0.063182 -0.071548 0.008690 -0.022738 
+0.003000 -0.003000 0.025000 -0.065800 0.131600 0.088000 
+-0.122197 -0.074470 0.019091 -0.062704 0.026704 0.030185 
+-0.003086 0.010221 0.005287 -0.008212 0.001800 -0.041014 
+-0.008226 0.010273 -0.013555 0.001300 0.017736 -0.010993 
+0.000216 -0.003834 -0.006886 0.009682 0.014644 0.001474 
+0.009732 0.017010 -0.011221 0.003638 0.008749 -0.007555 
+-0.006975 0.001327 -0.001218 -0.003382 -0.002231 -0.006704 
+-0.008131 -0.005280 -0.004770 0.005415 -0.003789 0.004934 
+0.017347 0.008308 -0.007407 0.009840 0.014773 -0.014698 
+-0.002246 0.000300 -0.000052 -0.008799 -0.005210 0.007156 
+-0.002204 0.003843 -0.002994 0.001472 0.005959 -0.010704 
+-0.000440 0.002974 -0.005688 -0.003079 0.000610 0.000647 
+-0.003768 -0.000477 0.003225 -0.002967 0.000027 0.002814 
+-0.001302 -0.001218 -0.001278 -0.002135 -0.001412 -0.000510 
+-0.002537 -0.000265 -0.001473 -0.003839 0.003805 -0.002526 
+-0.000339 0.002047 -0.000095 0.001409 0.005391 -0.001208 
+0.002982 0.004290 0.000576 -0.001231 -0.000108 -0.002419 
+-0.000194 -0.000859 0.000095 -0.001314 -0.004923 -0.001070 
+-0.001043 -0.006148 -0.002035 -0.000874 -0.003121 -0.000295 
+-0.006429 0.000000 0.000000 -0.006359 -0.004279 -0.002337 
+-0.003693 -0.000888 -0.004413 0.000615 0.005628 -0.006992 
+0.003092 0.006501 -0.004985 0.002950 0.003543 -0.001754 
+0.001635 0.002660 -0.000695 0.002214 0.002644 -0.002990 
+0.002895 0.005952 -0.002430 0.021304 0.064783 0.060652 
+-0.145200 0.136667 -0.193600 0.034898 -0.002551 -0.100867 
+0.007150 0.019203 0.014710 -0.018000 0.020123 0.035215 
+-0.095793 0.023944 -0.023995 -0.072571 0.036286 -0.002857 
+-0.028333 -0.006667 -0.001667 -0.027879 -0.013712 0.015530 
+-0.054444 0.042222 0.042222 -0.051667 0.060833 0.009167 
+0.027363 -0.028571 -0.018242 0.000000 -0.053333 -0.026667 
+0.048000 0.128000 0.000000 0.054510 0.000000 -0.013627 
+-0.095000 0.011333 -0.022667 -0.071111 0.082222 -0.067222 
+-0.014913 0.100087 -0.051105 0.008254 0.043175 -0.023651 
+0.051111 0.000000 0.130000 0.063333 0.000000 -0.013333 
+0.042333 -0.014111 -0.136667 -0.024671 -0.019013 -0.027237 
+-0.126000 -0.034521 -0.012945 0.049167 0.026667 -0.021667 
+0.077500 -0.008750 -0.008750 -0.003750 -0.037284 -0.014914 
+-0.068958 -0.085833 -0.102708 -0.060000 -0.139444 0.100556 
+-0.096667 -0.116333 0.085667 -0.093182 -0.016818 -0.009545 
+0.019371 -0.058454 0.023178 -0.083556 -0.042222 -0.062444 
+0.049068 0.042312 -0.100319 -0.020634 0.031344 -0.013890 
+-0.001234 0.017880 -0.004810 -0.005246 -0.003737 0.001253 
+0.004850 0.004350 -0.002663 0.002515 0.018356 -0.006142 
+-0.001010 0.013813 -0.005217 -0.000939 0.007394 -0.002101 
+-0.000535 0.002396 -0.000402 -0.003312 0.001736 -0.000841 
+-0.008462 0.002058 -0.000825 -0.005095 0.003010 -0.003136 
+0.003087 0.004699 -0.005384 0.005413 0.003469 -0.003808 
+0.001300 -0.000500 0.000438 0.000876 -0.002245 0.002125 
+0.001835 -0.001545 0.000699 0.000231 -0.000179 0.001279 
+-0.001202 0.001349 0.001424 -0.001187 0.000183 0.001278 
+-0.000395 -0.000284 0.001695 -0.001002 -0.001149 0.004116 
+-0.003029 -0.002147 0.004955 -0.003293 -0.001908 0.000915 
+-0.001809 0.000822 -0.001362 -0.001085 0.001049 -0.001725 
+-0.001075 0.003994 -0.001382 0.000590 0.000394 0.000310 
+-0.001588 0.000110 0.000236 -0.002898 -0.000089 -0.001039 
+-0.003256 -0.000524 -0.001180 -0.002387 -0.002058 -0.000526 
+-0.004712 -0.003100 0.000970 -0.003261 -0.002949 -0.000863 
+0.004784 -0.001140 -0.002361 0.007828 0.006554 -0.002355 
+0.000952 0.004857 -0.006649 -0.000243 -0.000023 -0.001082 
+0.000661 0.000866 0.000843 0.000692 0.002117 -0.001207 
+0.000970 0.003316 -0.000663 0.001790 0.002923 -0.002291 
+0.002689 0.003373 -0.003726 0.018831 0.014646 -0.013000 
+0.044781 -0.006886 -0.030286 0.051451 -0.004279 -0.011344 
+0.035334 0.010847 -0.011071 0.029108 -0.016487 0.036064 
+-0.098009 -0.060519 0.159062 -0.094779 -0.071046 0.254558 
+0.019626 -0.039571 0.184560 0.054906 -0.059434 0.102877 
+-0.133442 0.068116 -0.000797 -0.102687 -0.030034 0.057279 
+0.071815 -0.011969 0.005714 -0.070653 -0.001959 -0.015306 
+0.007424 -0.013939 0.027424 0.036347 -0.048682 0.026874 
+-0.076909 0.025636 0.096364 -0.079587 -0.014215 0.044050 
+-0.016111 -0.004444 -0.016111 -0.013333 0.054444 0.047778 
+-0.037857 0.067143 -0.020714 0.048000 0.070000 -0.096000 
+0.001310 -0.001517 0.000345 0.005000 -0.011000 0.012000 
+-0.012684 -0.017511 -0.006645 0.146667 0.020000 0.126667 
+0.122469 -0.085432 0.079753 0.068750 0.071625 -0.023875 
+-0.093546 -0.036809 0.039362 -0.005176 -0.076327 -0.036438 
+0.033636 -0.018182 0.090909 0.001818 0.000000 0.066364 
+0.053802 0.037934 -0.002066 -0.028484 0.012715 -0.010158 
+-0.026938 0.020914 0.014094 -0.003756 0.004739 -0.001620 
+-0.003864 0.007775 -0.001991 -0.011111 -0.003383 -0.003479 
+-0.002917 -0.004422 0.017366 -0.006912 -0.010382 0.013545 
+-0.007231 -0.006873 0.007010 -0.006228 -0.001381 0.002319 
+-0.005466 0.001676 -0.001126 -0.003590 0.003179 -0.002902 
+-0.000104 0.003862 -0.006242 0.003095 0.009560 -0.006680 
+-0.001412 0.005647 0.001059 0.001608 0.003432 -0.007828 
+0.003224 -0.000238 -0.001421 0.003107 -0.001218 -0.001417 
+0.001050 -0.003288 -0.001951 0.000374 -0.003115 -0.000195 
+0.000391 -0.000789 0.000918 0.001721 -0.000662 -0.002317 
+-0.001062 -0.000026 -0.002609 -0.004218 0.000256 -0.001739 
+-0.003383 0.002357 0.003281 -0.002618 0.002452 0.000961 
+-0.001296 -0.000033 0.000611 -0.000157 0.000768 0.000352 
+0.005986 0.006650 0.000798 0.002346 0.001353 0.004949 
+0.000500 -0.000948 0.003556 -0.000738 -0.000889 0.001052 
+-0.000047 0.001225 -0.002613 0.002192 0.001772 -0.002485 
+0.001947 0.001157 -0.000062 0.001413 0.001518 -0.000386 
+0.005778 0.003386 -0.007726 0.018951 0.006846 -0.010588 
+0.009411 0.015782 -0.004968 0.004247 0.004648 -0.006328 
+0.000035 0.000064 0.000160 -0.002602 0.000710 -0.004694 
+0.002601 0.003770 -0.003078 0.003993 -0.003481 -0.010455 
+-0.000506 -0.006442 -0.012082 -0.000474 -0.003592 -0.007960 
+0.006021 -0.000585 -0.001960 0.005789 -0.001247 -0.002575 
+0.011442 -0.000643 -0.002819 0.020254 0.000438 -0.001164 
+0.006491 0.002412 0.004983 -0.011124 -0.002766 0.005945 
+-0.009622 -0.007118 0.008040 -0.016657 -0.006406 0.020000 
+-0.062281 -0.004253 0.001511 0.000000 -0.020970 0.036698 
+-0.002991 0.009786 -0.021752 -0.035238 0.042063 0.021587 
+-0.039667 0.032667 0.046667 -0.046364 0.046364 -0.046364 
+0.038333 -0.009583 0.009583 0.003723 -0.026797 0.002381 
+0.009601 0.023949 0.002035 -0.080780 -0.025661 0.000542 
+0.009277 0.004268 0.071252 0.006818 0.024748 -0.046929 
+0.000687 0.016258 -0.038508 0.001889 0.041574 -0.062046 
+-0.011939 0.031939 -0.019501 -0.021694 -0.008072 0.001009 
+0.046949 0.041205 0.026008 0.045714 0.022857 -0.048571 
+-0.040500 0.011000 0.000500 -0.042294 -0.067446 -0.022110 
+0.738419 0.103695 -0.134476 -0.202495 -0.075391 0.710421 
+-0.031883 0.014066 0.088750 -0.000020 -0.000988 -0.003776 
+-0.004743 0.002458 -0.002601 -0.042667 0.021333 -0.019167 
+-0.015639 0.003666 -0.016045 0.001092 -0.001236 -0.009208 
+-0.004292 0.000145 0.003651 -0.009236 -0.005218 0.007395 
+-0.003518 -0.006687 0.004575 0.001572 -0.004694 -0.000142 
+0.001276 -0.002873 0.001060 -0.004502 -0.002970 -0.000498 
+0.000031 0.000999 0.000112 -0.006846 0.009764 -0.004386 
+-0.003392 0.006976 -0.009096 -0.000874 0.005699 -0.003793 
+0.000243 -0.001141 -0.000454 0.000932 -0.001337 -0.000198 
+0.000442 -0.000041 0.000435 -0.000164 -0.004016 0.000738 
+0.001721 -0.001364 0.002121 0.002559 0.000945 -0.001567 
+0.000813 0.004309 -0.000163 -0.001282 0.003545 -0.001503 
+-0.001938 0.000548 0.000185 -0.003690 -0.001705 0.000348 
+-0.004635 -0.000336 -0.001046 -0.002293 -0.000348 -0.002223 
+-0.001376 0.000326 -0.000106 -0.003523 0.002346 -0.000297 
+-0.001667 0.006994 0.000565 0.004820 0.007029 -0.002935 
+0.000314 0.002703 -0.002580 -0.000007 0.000010 -0.000130 
+-0.000673 0.001946 0.000158 0.001682 0.004551 -0.002322 
+0.003950 0.006589 -0.007315 0.008650 0.003012 -0.012876 
+0.010398 0.003276 -0.004166 0.005912 0.009450 -0.009907 
+0.006893 0.004691 -0.003836 0.003874 0.001219 -0.009269 
+-0.000673 0.003981 -0.010878 0.001563 -0.002717 -0.004161 
+-0.001037 -0.000783 -0.001115 -0.003604 0.000790 0.001132 
+-0.003660 0.002579 0.005397 -0.003619 0.004670 0.012533 
+-0.003890 0.005144 0.014206 -0.003101 0.004774 0.012632 
+0.003062 0.006587 0.007264 0.009070 0.011998 -0.003509 
+-0.013799 0.029793 0.040300 0.008291 0.027574 0.018969 
+-0.025389 0.006862 0.011665 -0.045196 -0.002655 0.043265 
+0.007849 0.014070 0.008924 -0.015582 -0.025818 -0.091255 
+-0.071267 -0.002125 -0.091209 -0.089377 0.022812 0.019493 
+0.182857 0.110286 -0.055143 0.014346 0.084000 0.071731 
+0.047415 0.012201 0.036047 -0.035388 0.002487 -0.024612 
+-0.104725 -0.048870 0.137884 -0.098814 -0.059007 0.089291 
+-0.008383 0.022407 -0.014209 -0.023509 0.030877 -0.008070 
+0.013931 0.051169 0.043065 0.032799 0.046660 0.079002 
+-0.009375 -0.009375 0.030000 -0.146269 -0.112462 0.029495 
+0.032690 0.236082 -0.226701 0.006838 0.013734 -0.037545 
+-0.005121 0.014460 -0.018197 -0.045960 -0.012141 0.024361 
+-0.044422 -0.019048 0.023218 -0.052899 -0.016166 0.003132 
+0.000315 0.000046 0.000057 -0.030666 0.034669 0.074999 
+0.011007 -0.017238 -0.004884 0.003692 -0.005131 0.003905 
+-0.002319 -0.000934 0.000423 -0.000086 -0.004612 -0.000708 
+0.000110 -0.002585 -0.000295 0.002785 0.001169 -0.000992 
+0.004906 0.000296 -0.001495 -0.001028 -0.001449 -0.002570 
+-0.000516 0.002198 -0.000208 -0.007925 -0.002051 0.012248 
+-0.003629 0.001458 -0.001488 0.002975 -0.000365 0.003529 
+0.001425 0.001209 0.002637 -0.001070 0.002715 0.000174 
+-0.006872 -0.003540 0.001950 -0.005400 -0.001920 0.004186 
+-0.000532 0.001129 -0.001840 -0.000449 0.006526 -0.004161 
+0.000325 0.004789 -0.003831 -0.001525 -0.000890 -0.000092 
+-0.000693 -0.004640 0.000658 0.000500 -0.003098 -0.000775 
+0.000268 -0.001580 -0.000594 -0.000203 -0.000894 0.000203 
+-0.001950 -0.000079 0.003801 -0.005909 0.001418 -0.002836 
+0.000333 0.009825 -0.005754 0.003913 0.007116 -0.002049 
+0.001059 0.000012 -0.000172 -0.002209 -0.002787 0.007618 
+0.001393 0.000222 0.001328 0.000205 0.002043 0.001476 
+0.000897 0.003007 -0.004022 -0.001151 0.001614 -0.006811 
+0.000799 0.004360 -0.007047 -0.005092 0.009375 -0.001336 
+-0.002482 -0.001553 -0.000110 -0.001782 -0.006310 -0.005408 
+0.000284 -0.005187 -0.004278 -0.001344 0.001514 -0.000415 
+-0.003328 0.004962 0.004424 -0.001829 0.010398 0.010815 
+-0.335329 0.041916 3.718563 -0.129730 -0.048649 3.578378 
+-0.003101 0.010511 0.015396 -0.005679 0.002183 0.011571 
+-0.002635 -0.001650 0.013636 0.003837 0.003791 0.020787 
+-0.024724 0.012561 0.046727 -0.017389 -0.004578 -0.006567 
+-0.048450 -0.004236 0.032465 -0.042955 -0.015818 0.031016 
+0.011731 -0.001545 0.019153 0.004782 -0.000391 0.007068 
+0.012907 -0.020947 -0.047608 -0.068581 -0.106000 0.048986 
+-0.025859 -0.040909 -0.148586 0.023971 -0.111459 -0.032368 
+-0.011088 0.010281 -0.004632 -0.020537 0.009750 0.035466 
+-0.036840 -0.040476 0.051577 -0.043663 -0.033663 0.005523 
+-0.000802 -0.004545 -0.000868 0.019288 -0.006386 0.035515 
+-0.009796 0.026173 0.031378 -0.027500 0.001931 0.015446 
+-0.031089 -0.014901 -0.004678 0.023065 -0.014679 -0.038444 
+0.022940 -0.005779 -0.041926 -0.005961 0.029004 -0.017173 
+-0.023283 0.024003 -0.000689 -0.037984 0.009058 0.008906 
+-4.895652 -1.904348 1.278261 -2.674419 -3.773256 0.156977 
+-1.773481 -4.104972 0.121547 -0.026600 -0.017559 0.018078 
+-0.015295 0.004155 -0.017795 0.000260 0.024858 -0.022847 
+0.002715 0.003383 -0.003860 0.001503 0.004682 0.001364 
+0.000073 0.000242 0.000741 0.005555 0.000963 0.002681 
+0.001993 0.000473 -0.002196 -0.005040 0.001770 0.001531 
+-0.004471 0.009882 -0.002118 -0.000983 0.005855 0.006047 
+0.002464 0.003941 0.007078 0.000255 0.002306 0.003038 
+-0.003112 0.000693 -0.001209 -0.005473 -0.000406 0.001706 
+-0.003237 0.000002 0.001939 0.000897 0.003299 -0.000877 
+-0.001953 0.007057 0.000258 -0.004260 0.006058 -0.003325 
+-0.001739 0.002147 -0.003629 -0.001610 -0.000134 -0.000560 
+-0.002971 -0.004075 0.000361 -0.000503 -0.004754 -0.000112 
+0.000153 0.000317 -0.000055 -0.000570 0.004531 -0.000187 
+0.001455 -0.000691 -0.000374 -0.004031 0.001559 -0.002007 
+-0.004991 0.002479 -0.001069 -0.002683 0.003219 -0.012068 
+0.001897 0.000808 -0.000032 -0.000444 0.004570 -0.000114 
+-0.000382 0.000146 0.003937 0.000212 -0.002293 0.000011 
+0.000885 -0.002620 -0.000868 0.000524 -0.001804 -0.007299 
+-0.008777 0.001009 -0.008835 -0.004934 0.005375 -0.001403 
+0.004698 -0.005658 -0.004473 -0.003773 -0.010147 -0.005717 
+-0.002255 -0.005148 0.002355 0.000512 0.002034 0.003654 
+0.004785 0.007292 0.007099 0.804124 1.025773 4.216495 
+1.208494 0.988417 5.027027 1.385666 -0.078498 4.464164 
+1.543726 -1.136882 3.779468 1.650794 -1.296296 2.830688 
+0.004691 -0.001645 0.019130 0.007764 0.007239 0.019074 
+0.002481 0.001264 0.037520 0.012633 -0.005732 0.035904 
+-0.004263 -0.009639 0.017126 -0.011229 -0.032420 0.005559 
+-0.009016 -0.053145 0.002647 -0.003359 -0.075132 -0.013548 
+-0.038137 -0.103750 0.041604 -0.001880 -0.041600 -0.044840 
+-0.125530 0.013043 0.035061 0.110253 -0.088182 -0.091878 
+0.008263 0.004729 0.032271 -0.007179 0.029524 0.035897 
+0.031524 0.079429 0.035619 -0.028888 -0.003241 0.005722 
+-0.008842 -0.040000 -0.004421 -0.003206 -0.029227 0.046413 
+-0.034609 -0.046363 0.024462 -0.009737 -0.031905 0.006639 
+0.010832 -0.007529 -0.037103 0.024585 -0.007766 -0.036220 
+-0.000792 -0.021185 0.006773 -0.027686 -0.023841 0.018714 
+-0.009514 0.016502 0.014597 -0.023200 0.014740 0.010639 
+-4.453271 0.126168 2.271028 -4.784000 -3.124000 2.328000 
+-2.129834 -5.428177 0.356354 -1.434447 -6.287918 -0.321337 
+-1.991770 -4.353909 -0.530864 -0.018326 -0.014349 -0.000881 
+-0.005977 -0.005635 0.002212 0.002300 0.006723 -0.002047 
+0.008698 0.007896 -0.014811 0.011669 0.026486 -0.001366 
+-0.010606 0.016450 -0.001574 -0.008653 0.003074 -0.001301 
+0.002516 -0.002683 0.003438 0.004738 -0.004775 0.006751 
+0.002811 -0.001107 0.001854 -0.003169 0.000230 0.000858 
+-0.004538 -0.000128 0.004201 -0.003935 -0.000098 0.004567 
+-0.000231 0.001911 0.000099 -0.001929 0.000854 -0.001467 
+-0.001647 0.000034 -0.001944 -0.000313 0.000215 -0.000068 
+-0.000653 0.000287 0.000149 -0.000457 0.000860 0.000726 
+0.000720 0.003090 -0.002092 -0.000445 0.001836 -0.001190 
+-0.002066 0.000926 -0.000052 -0.002309 0.003314 -0.002771 
+-0.003181 -0.000601 -0.003570 -0.003835 -0.005989 -0.005012 
+0.003732 -0.004551 -0.003679 0.004775 0.001187 -0.000920 
+-0.005298 0.004176 -0.010815 -0.000389 0.005831 -0.003034 
+-0.002320 -0.001350 0.001331 0.000333 -0.001050 0.002284 
+0.000358 0.000939 -0.000504 -0.000464 -0.003922 -0.004001 
+-0.012930 -0.009274 -0.011864 -0.020684 -0.001489 -0.012320 
+-0.016703 0.010248 -0.009027 0.002431 -0.000640 -0.003205 
+-0.005703 -0.006590 0.007544 -0.000506 -0.001887 0.004874 
+0.012152 0.011062 0.015759 1.810997 1.786942 5.264605 
+2.408740 1.413882 4.982005 2.950262 0.248691 4.732984 
+3.428571 -1.119601 4.617940 3.500000 -1.490566 4.466981 
+0.015638 -0.010331 0.041405 0.006752 0.003650 0.012195 
+0.013879 -0.004875 0.014385 0.017438 -0.010830 0.036606 
+-0.003168 -0.009942 0.009045 0.018072 0.025946 0.039077 
+-0.053490 -0.069555 -0.064574 -0.018362 0.021211 0.098775 
+-0.008117 0.079026 0.041364 0.040518 -0.025847 0.011529 
+0.001827 0.027493 0.046140 0.027357 -0.068319 0.013689 
+-0.030400 -0.019975 0.046473 -0.061465 -0.068284 0.029591 
+0.003320 -0.000732 0.002923 -0.172205 0.031594 0.076936 
+-0.006750 -0.015642 0.016852 -0.003559 -0.005827 0.012437 
+-0.028900 -0.044936 0.001586 0.031237 -0.076839 -0.030026 
+-0.001826 -0.028190 -0.037879 -0.022169 -0.029302 -0.000476 
+-0.096364 -0.039045 -0.017896 -0.044277 0.008700 0.050222 
+-0.023132 -0.005752 0.032590 -2.451163 -2.576744 0.837209 
+-2.472492 -3.012945 1.851133 -2.517350 -4.861199 3.063092 
+-0.849515 -6.461165 1.014563 -0.403326 -6.343035 -0.268191 
+-0.822715 -5.515235 -0.628809 -1.372093 -4.302326 -0.786047 
+-0.001129 -0.032211 -0.007442 0.003298 0.003246 -0.006690 
+0.027772 0.053631 0.024847 -0.008549 0.021700 -0.004543 
+-0.003305 0.001597 0.002213 0.000702 -0.005769 -0.000803 
+0.002300 -0.003375 0.000336 0.000376 -0.005918 0.000455 
+0.001988 -0.006408 -0.000261 -0.009390 -0.003638 -0.001275 
+-0.004513 -0.000742 0.005615 -0.004060 0.000216 0.003338 
+-0.005472 0.001700 -0.003294 -0.002670 0.003258 -0.001190 
+0.002264 0.000319 0.001748 0.001942 -0.006397 0.001218 
+0.000308 -0.006005 0.004035 -0.001183 -0.000696 0.001582 
+-0.003440 0.000864 -0.001728 -0.002912 0.001801 -0.000490 
+-0.000624 0.000304 -0.001930 -0.001143 0.000141 -0.001921 
+-0.004170 -0.001481 0.000307 -0.003890 -0.001955 0.001455 
+-0.003427 0.001165 0.000941 0.000105 0.001415 0.001453 
+0.002317 -0.001479 -0.002076 0.001535 0.003219 -0.002346 
+-0.003121 0.000442 0.000064 -0.001590 0.001265 0.002483 
+0.000312 0.003345 -0.001579 0.000487 -0.003276 -0.008678 
+0.000823 -0.012781 -0.008489 -0.005225 -0.013933 -0.004000 
+-0.024046 -0.004053 -0.005180 -0.026169 -0.001444 0.006219 
+-0.006976 -0.018957 0.003189 -0.002718 0.001497 -0.013155 
+0.014809 0.018112 0.014091 2.348624 2.122324 4.883792 
+3.178010 1.701571 4.722513 4.180180 0.609610 4.627628 
+4.829629 -0.488889 4.551852 4.582938 -0.611374 4.469194 
+0.018360 0.003459 0.035633 0.007876 0.022697 -0.019143 
+0.003082 0.006024 -0.000855 -0.004426 0.012986 0.031870 
+-0.002570 0.016667 0.002399 0.075287 0.034416 0.018767 
+-0.030214 -0.038584 0.018598 -0.021588 0.043638 0.063221 
+0.008635 -0.031873 -0.002825 0.046627 0.033703 0.013853 
+0.025094 -0.030272 0.028018 0.012783 0.015696 -0.013348 
+-0.022772 -0.069724 -0.003727 -0.024981 -0.045993 0.059152 
+-0.049043 -0.043384 0.001890 -0.146981 -0.057947 0.047005 
+0.008564 -0.051504 -0.016888 0.007027 0.001788 -0.014304 
+-0.000843 0.008346 0.034063 -0.008366 0.025000 0.033464 
+0.025575 -0.035970 -0.033348 -0.038038 -0.051631 0.001581 
+-0.104698 -0.029548 0.036659 -0.032196 0.019404 0.024356 
+-4.462121 -2.166667 2.507576 -5.512195 -3.702439 2.287805 
+1.472727 -4.881818 0.636364 2.491040 -6.562724 0.526882 
+0.933511 -6.757979 0.023936 0.505102 -5.903061 -0.711735 
+0.031359 -4.310104 -1.066202 -0.661017 -3.237288 -1.005650 
+0.008902 -0.017299 0.000924 0.002502 0.022232 -0.008274 
+-0.016859 0.012187 0.001195 -0.004675 0.003249 0.003385 
+-0.003844 -0.003463 -0.005000 -0.003578 0.006095 -0.006335 
+-0.007349 0.016374 -0.003026 -0.003672 0.005652 0.002973 
+0.000189 -0.005547 -0.001520 -0.002542 0.000508 0.000594 
+-0.002241 -0.000468 0.002022 -0.007461 -0.001555 -0.000111 
+-0.004473 -0.000538 -0.001537 0.002433 0.000539 0.000845 
+0.005864 -0.000496 0.000326 0.002745 -0.003197 0.000984 
+-0.001544 -0.000427 0.000783 -0.003407 -0.000550 -0.004084 
+-0.002277 0.002800 -0.002575 -0.003225 0.000747 -0.001403 
+0.000002 0.001697 -0.001980 0.003778 0.000293 -0.001925 
+0.001739 -0.000583 -0.001977 -0.003211 0.001619 0.001537 
+-0.002353 0.003787 0.001325 0.001592 0.004156 0.002125 
+0.003215 0.004428 0.000076 0.003449 0.005652 -0.004277 
+0.003509 0.006611 -0.001215 -0.002677 0.005354 -0.004385 
+-0.001163 0.006360 -0.002831 -0.000249 0.002671 -0.008104 
+0.000267 -0.003207 -0.005078 -0.007107 -0.002256 0.002351 
+-0.006919 0.000233 -0.000273 -0.014504 -0.005588 -0.012316 
+-0.011113 0.001758 -0.026510 -0.004335 0.003894 -0.016275 
+0.014087 0.016174 0.008383 2.750000 1.496032 2.726191 
+3.455939 0.973180 2.831418 3.995536 0.062500 2.450893 
+3.531401 0.009662 1.845411 0.022174 0.007061 0.008991 
+0.000621 0.018627 -0.003585 -0.012076 0.022058 -0.020810 
+-0.017915 0.015655 -0.012013 0.006446 0.010809 0.004104 
+0.025481 0.005203 0.020598 0.023682 0.004993 0.010021 
+0.013052 -0.001614 0.008755 -0.020140 -0.031688 -0.018016 
+-0.003891 -0.046310 0.016884 0.021216 -0.020000 -0.001061 
+0.013612 -0.010273 0.007089 0.001485 -0.003880 -0.048788 
+-0.049412 0.051041 -0.018643 -0.013791 -0.021094 0.017459 
+-0.013212 -0.008725 0.010007 -0.037209 -0.015036 0.016942 
+-0.002588 -0.080991 0.012679 0.018936 -0.010447 0.014725 
+0.051920 0.067771 -0.050464 -0.001357 0.005929 0.008214 
+-0.004404 0.001289 0.000190 -0.016290 0.019575 -0.006842 
+-0.031530 0.120030 -0.069644 -0.017915 0.015088 0.009368 
+-3.634409 -1.301075 2.456989 -11.539877 -1.049080 5.282208 
+3.383178 -4.214953 -1.383178 5.131868 -7.252747 -2.576923 
+1.633898 -6.491526 -1.538983 1.012987 -5.409091 -1.662338 
+0.243478 -3.595652 -1.617391 0.010320 -0.012573 -0.008058 
+0.005326 0.002928 -0.011307 -0.002879 0.015918 -0.014638 
+-0.007795 0.009427 -0.002408 -0.004185 0.002616 0.000686 
+-0.004269 0.001350 -0.003893 -0.003588 0.011586 0.003613 
+-0.008193 0.010549 0.001053 -0.000397 0.001167 -0.000516 
+-0.004015 -0.001608 -0.005035 0.001154 0.003891 -0.005032 
+-0.001719 0.000533 -0.001259 -0.003657 -0.001617 -0.001155 
+-0.000638 -0.000720 -0.000627 0.004904 -0.001825 -0.000599 
+0.003852 -0.002646 -0.002553 0.000907 -0.004802 0.000553 
+-0.004000 -0.005820 0.002000 -0.002695 -0.002364 -0.002584 
+-0.001743 0.000165 -0.000812 -0.001413 0.001722 -0.000086 
+-0.001801 0.001978 0.000706 -0.001819 0.000102 0.000261 
+-0.001584 0.002293 0.003877 -0.002464 -0.000045 0.001798 
+0.000936 -0.000363 -0.000741 0.002509 0.001948 -0.001845 
+0.000506 0.002567 -0.003338 -0.001581 0.004810 0.000756 
+-0.000874 0.004339 0.001952 0.001151 0.005771 0.000611 
+0.000326 0.002503 -0.003917 -0.000608 -0.003458 -0.001764 
+-0.004050 -0.004352 -0.000087 -0.000502 -0.000487 -0.000736 
+0.002650 -0.003038 -0.002243 -0.000523 0.000909 0.000316 
+-0.013283 -0.000015 -0.000536 -0.010263 0.002526 -0.010263 
+0.008215 0.006272 -0.005567 0.022962 0.001015 -0.004943 
+0.028293 -0.009095 -0.010062 0.023627 -0.016621 -0.012586 
+0.007007 -0.009736 -0.006376 -0.010491 0.007545 0.004811 
+-0.022123 0.018053 0.004058 -0.026454 0.021963 -0.006476 
+-0.027589 0.022391 -0.012010 -0.008127 0.011965 -0.003488 
+0.010625 0.009688 0.007500 -0.003780 0.020869 0.015675 
+-0.016173 0.031226 0.008414 -0.025896 0.038315 -0.004025 
+-0.020981 0.048040 -0.032268 -0.017461 -0.010549 0.027517 
+-0.009987 0.008572 0.005078 0.015638 0.007131 -0.004392 
+0.029981 0.042920 -0.032471 0.040085 0.016998 -0.015055 
+0.011129 0.001961 -0.001751 0.004131 -0.009306 -0.004418 
+0.048692 -0.047204 -0.032994 0.031250 -0.068125 0.068125 
+0.006680 -0.025035 -0.113535 0.042169 -0.037443 -0.065320 
+0.006505 -0.008674 0.004407 -0.017552 0.019175 -0.014468 
+-0.250000 10.355263 0.131579 -0.021967 0.024223 0.006491 
+-5.878572 0.007143 4.785714 -6.531531 -2.162162 1.837838 
+0.208333 -6.650000 -1.991667 1.507389 -6.064039 -1.187192 
+1.593640 -5.438162 -1.703180 1.312500 -5.257353 -1.937500 
+0.148148 -4.222222 -1.291005 0.007827 -0.015137 0.000150 
+-0.005121 0.004544 0.003851 -0.003685 0.021197 0.003279 
+-0.000133 0.014430 0.000577 -0.003797 0.002630 -0.000183 
+-0.002770 0.000981 -0.001482 0.004562 0.006319 0.004711 
+-0.002916 0.010498 -0.000455 -0.001463 0.001784 -0.001113 
+0.001753 -0.001883 -0.000390 0.002325 0.000080 -0.001077 
+-0.001590 0.000140 -0.000885 -0.000450 0.001935 -0.001590 
+0.006129 0.001559 -0.004515 0.005493 0.000065 0.001046 
+0.000211 -0.000614 -0.000608 -0.000835 -0.000471 0.000774 
+-0.004861 -0.002471 -0.003673 -0.002359 -0.002756 -0.004540 
+-0.002150 -0.004154 -0.001948 -0.001842 -0.004234 0.000277 
+-0.005446 -0.006668 0.003612 -0.004705 -0.003750 0.009393 
+-0.000952 0.002055 -0.002631 -0.000655 0.003071 -0.000164 
+-0.001749 0.002303 -0.004511 0.001180 -0.000834 0.000283 
+0.003238 0.002205 -0.002293 -0.000185 0.006058 -0.002837 
+-0.003127 0.008427 -0.003361 -0.002252 0.006152 -0.004757 
+0.001529 0.001947 -0.003098 0.001760 -0.000365 -0.001364 
+-0.000918 0.000079 0.001195 -0.002128 -0.000729 0.002440 
+0.000517 -0.001831 -0.000055 0.001568 0.002642 -0.001042 
+-0.001592 0.003759 -0.000446 -0.006930 0.005327 -0.000907 
+-0.001976 0.000033 -0.004250 0.004855 -0.007833 -0.005551 
+0.002245 -0.018342 -0.011875 -0.002051 -0.025612 -0.013985 
+-0.014555 -0.022983 -0.011794 -0.028401 0.002894 0.002316 
+-0.026872 0.013080 0.006399 -0.023023 0.015420 0.001121 
+-0.017762 0.014036 -0.009465 -0.008130 0.008394 -0.013608 
+-0.002398 0.008240 -0.009705 -0.001040 0.019687 -0.015149 
+0.006127 0.030788 -0.024303 0.008030 0.023353 -0.021744 
+-0.002569 -0.003251 0.004420 -0.021227 -0.008745 0.017649 
+-0.018310 -0.006871 0.010116 0.019335 0.012918 -0.014104 
+0.055417 0.017686 -0.032250 0.050746 0.019204 -0.034129 
+0.000331 -0.002993 -0.000769 0.032620 -0.071190 -0.008500 
+0.091652 0.031231 -0.052733 -0.002973 0.001667 -0.003829 
+0.033161 -0.101853 0.044329 0.022971 -0.115600 -0.015210 
+0.000827 0.000618 -0.000767 -0.018048 0.039877 0.006837 
+-1.602151 8.548388 0.591398 -0.018011 0.034200 0.005911 
+-0.009638 0.009596 0.002046 4.193277 -5.941176 -4.680672 
+0.701754 -6.327486 -1.023392 0.785408 -5.197425 -0.751073 
+1.728223 -5.418118 -2.407665 1.412451 -5.536965 -2.762646 
+0.308642 -4.530864 -2.074074 0.007860 -0.016967 -0.002625 
+-0.008274 0.017068 0.006122 -0.005812 0.031113 0.002078 
+0.005503 0.013145 0.005284 0.001555 -0.001924 -0.001468 
+0.001034 -0.001737 -0.003835 0.001028 0.017644 -0.003303 
+-0.003197 0.013959 -0.001223 -0.001209 0.005662 -0.000450 
+0.000308 0.000154 -0.000692 0.000195 -0.003659 -0.000228 
+-0.001276 -0.004399 0.000038 0.000412 0.000362 -0.000130 
+0.002086 -0.001678 -0.004410 -0.001379 -0.001898 -0.002626 
+0.000718 -0.000161 -0.002153 -0.002795 -0.000348 -0.002060 
+-0.000357 -0.000279 -0.000592 -0.000803 0.000632 -0.000860 
+-0.001081 -0.002464 -0.001622 -0.006415 -0.003402 0.001950 
+-0.006244 -0.003555 0.002420 -0.004167 -0.003822 0.000667 
+0.002413 0.005440 0.002528 0.006065 0.004992 -0.001120 
+0.002083 -0.004755 -0.002672 0.002064 -0.003639 -0.000447 
+0.002308 0.001292 -0.003877 -0.001223 0.004616 -0.002111 
+-0.003237 0.004860 -0.002594 0.000141 0.001781 -0.003627 
+0.003572 0.004318 -0.002295 -0.001716 0.004042 -0.002811 
+-0.002169 -0.001386 0.000022 -0.001112 0.000948 0.002790 
+-0.004808 -0.001494 0.004263 -0.011615 -0.006986 0.003277 
+-0.009700 -0.009015 -0.000156 -0.005431 -0.001356 -0.002354 
+-0.000843 0.004466 -0.001027 -0.000082 0.000009 0.000157 
+0.000438 0.000509 0.000018 -0.003993 -0.003616 -0.002209 
+-0.006705 -0.003499 -0.003079 -0.009276 -0.004600 -0.000092 
+-0.009700 -0.001587 0.006650 -0.008076 0.001364 0.006544 
+-0.005218 0.000920 -0.002556 0.003239 0.002531 -0.009621 
+0.005596 0.004222 -0.012681 0.005070 0.003205 -0.007656 
+0.002395 0.000321 -0.000636 -0.001214 -0.001543 0.006191 
+-0.002557 -0.001382 0.006201 0.001497 0.001117 -0.003342 
+0.003821 0.003828 -0.011126 0.004021 0.003282 -0.010582 
+0.007920 0.003587 -0.007237 0.008803 0.006643 -0.011938 
+0.006627 0.014337 -0.021610 -0.013605 -0.008918 0.022215 
+-0.010292 0.001948 0.001479 0.003366 0.005074 -0.007615 
+0.062307 -0.004870 0.023762 0.036625 -0.033899 0.017951 
+-0.027181 -0.049507 0.000712 -0.040689 0.062664 0.028698 
+-2.000000 2.203390 1.118644 0.007083 0.003320 -0.001470 
+0.056725 -0.001708 -0.042071 1.261147 -5.312102 -2.687898 
+0.298507 -5.333333 -0.079602 1.746988 -4.767068 -1.441767 
+1.911972 -5.299296 -3.102113 1.139241 -5.282701 -3.337553 
+0.013198 -0.031386 -0.026048 0.004886 0.002210 -0.013399 
+-0.008732 0.023569 -0.020705 0.004226 0.034282 -0.010985 
+-0.004400 0.008319 0.001931 0.002408 -0.002447 -0.002866 
+-0.008010 -0.011977 0.011760 0.000994 0.000196 0.001752 
+-0.001987 0.003707 -0.002745 -0.002892 -0.000393 -0.006192 
+-0.000338 0.001804 -0.001636 0.000835 -0.000201 -0.000110 
+-0.001803 -0.002580 0.002150 -0.000832 -0.001741 -0.002059 
+-0.004571 -0.005160 -0.001655 0.001162 -0.003267 -0.000287 
+0.000473 -0.002505 -0.001093 -0.000338 -0.001279 -0.000752 
+-0.002503 -0.001571 0.000373 -0.004848 -0.000688 0.001031 
+-0.002830 -0.005994 0.001440 -0.002407 -0.003796 0.003637 
+-0.003801 -0.001743 -0.000672 -0.000533 -0.000675 -0.003235 
+0.005970 0.003745 0.000263 0.004243 0.000509 -0.005920 
+0.000583 -0.003134 -0.004884 -0.001143 -0.003144 -0.001967 
+-0.000431 0.000784 -0.000999 0.002693 0.004667 -0.001436 
+0.002581 0.008577 -0.003103 0.001885 0.003958 -0.003920 
+0.000350 0.001480 -0.000153 -0.000147 -0.001615 -0.004925 
+-0.005068 -0.002979 -0.002979 0.003286 0.000584 -0.004247 
+0.002131 0.001200 -0.003090 -0.003533 -0.006801 0.001738 
+-0.015651 -0.007046 0.000289 -0.004338 -0.004023 -0.001348 
+0.001244 0.001494 0.000414 0.001405 0.000740 0.000262 
+0.000470 -0.001248 -0.000895 0.000076 0.005739 0.001923 
+0.015768 0.015480 -0.008119 -0.000805 0.012292 0.013199 
+-0.009385 0.004536 0.001651 -0.010913 -0.006506 -0.001821 
+-0.005249 -0.000591 -0.000916 -0.002763 0.005573 0.002377 
+-0.002048 0.000128 -0.002781 0.002580 -0.000510 -0.006606 
+0.002130 -0.000239 -0.001401 -0.000143 0.002279 0.007211 
+-0.000775 0.001661 0.007812 0.001489 -0.000182 -0.000424 
+0.002741 -0.000264 -0.004058 0.001204 0.000240 -0.003102 
+-0.000601 0.000426 -0.001855 -0.001049 0.000406 -0.001914 
+-0.002094 0.000877 -0.004154 -0.005742 0.000463 -0.002001 
+-0.006851 0.001142 -0.000457 0.000259 -0.004148 0.004469 
+0.003894 0.000961 -0.000243 0.006319 0.011766 -0.005542 
+-0.016204 -0.036998 0.001010 -0.036561 0.045912 0.003021 
+-0.026288 -0.112166 0.007210 0.005879 -0.039171 -0.013487 
+0.035089 -0.019351 -0.040490 1.000000 -4.469388 -1.408163 
+0.728972 -4.892523 0.537383 1.687273 -4.850909 -0.923636 
+1.610909 -5.370909 -2.825454 0.688119 -5.371287 -3.267327 
+0.012151 -0.021959 -0.020814 0.007281 0.015384 -0.011068 
+0.004656 0.026827 -0.019695 0.006289 0.022283 -0.001187 
+-0.007687 -0.000428 -0.011003 0.004426 -0.006162 0.000975 
+-0.005675 -0.020528 0.001411 0.003674 -0.004121 0.006189 
+0.000504 -0.002501 -0.000301 -0.001083 -0.002977 -0.003745 
+0.003117 0.000882 -0.003788 0.002742 0.003232 0.000519 
+-0.001689 0.001855 0.000862 -0.002420 -0.001415 0.001800 
+-0.000493 -0.002751 0.002434 0.001563 -0.003125 0.000000 
+-0.000662 -0.004852 -0.000023 -0.005956 -0.006234 0.002267 
+-0.000071 -0.003525 -0.001905 -0.010758 -0.004242 0.000000 
+-0.003682 -0.003660 0.001496 -0.000812 -0.001532 -0.001582 
+0.000362 -0.000716 -0.001374 -0.000511 -0.000657 0.001153 
+0.005874 0.004871 -0.007271 0.003040 -0.002838 -0.007696 
+0.001121 -0.003351 -0.002101 -0.001798 0.001421 0.001920 
+0.001011 0.005547 0.000940 0.001026 0.006392 0.000280 
+0.000925 0.003601 0.001277 -0.000683 -0.000099 0.001813 
+-0.000043 -0.001231 -0.002125 -0.001430 0.003220 -0.005990 
+-0.004352 0.007151 -0.006353 0.000637 -0.000296 -0.002175 
+0.000330 0.000434 -0.005485 -0.000939 -0.001324 -0.007328 
+0.000083 -0.005195 -0.007056 -0.002582 -0.004426 -0.001711 
+-0.002614 -0.005393 0.000793 -0.004494 -0.001812 -0.003414 
+-0.001598 -0.000056 -0.000788 0.009228 0.002682 0.003057 
+-0.001706 0.022380 0.007729 -0.003921 0.000086 -0.000187 
+-0.004350 -0.014242 -0.004177 -0.007494 -0.014352 -0.003554 
+-0.009641 0.000322 -0.000544 -0.004365 0.014274 0.001349 
+-0.002096 0.009905 -0.001577 -0.000137 0.001437 -0.004797 
+0.003445 -0.000111 0.000561 0.000049 0.003993 0.000486 
+0.000602 0.002182 0.001426 0.002448 -0.001000 -0.000821 
+0.001199 0.000670 0.002488 -0.001565 -0.002408 0.004624 
+0.001347 -0.005768 0.003516 0.001679 -0.003012 0.006143 
+0.001590 0.001893 0.001018 -0.000507 -0.000138 -0.000019 
+-0.004020 0.000361 -0.001112 -0.000518 -0.006600 0.005439 
+0.002774 -0.005862 0.004673 -0.000451 -0.003825 0.000981 
+-0.004046 0.007458 -0.002898 -0.006532 -0.005530 0.002067 
+-0.027200 0.000702 0.016170 -0.031113 0.013163 0.002884 
+6.129870 2.415584 -10.090909 1.310811 -3.054054 -0.608108 
+0.281481 -4.540741 1.462963 1.029240 -4.859649 0.026316 
+1.215232 -5.370861 -1.923841 0.767568 -5.118919 -3.081081 
+0.009660 -0.012919 -0.024346 -0.014855 0.015409 -0.005467 
+-0.001402 0.011102 -0.002578 -0.003618 -0.002795 -0.002626 
+0.008120 -0.010843 -0.010450 -0.000828 -0.018803 0.005154 
+0.002421 -0.011710 0.000867 0.003124 -0.000498 0.004518 
+0.000124 -0.001520 0.000329 0.000915 -0.000580 0.000631 
+0.003741 -0.000452 -0.000978 0.001817 -0.000703 -0.001443 
+0.001969 0.000563 -0.001914 0.004044 0.001014 0.000387 
+0.005416 -0.000602 -0.001805 0.001546 -0.001680 0.000221 
+-0.003356 -0.003666 0.000365 -0.006211 -0.002755 0.000327 
+-0.005075 -0.000787 -0.000716 -0.003703 0.002888 -0.000544 
+-0.003407 0.000999 0.000045 -0.001195 -0.000278 0.000089 
+-0.000787 0.000450 0.000828 -0.000693 0.000883 0.003260 
+0.003990 -0.001176 -0.006463 0.002037 -0.006221 -0.008450 
+0.003602 0.001317 -0.002547 0.000061 0.004276 0.004699 
+0.000967 0.011694 0.002478 -0.003462 0.008502 -0.002902 
+-0.000577 0.002566 0.002577 -0.004240 -0.001756 -0.003279 
+-0.000638 -0.002539 -0.005832 -0.001150 0.000934 -0.003337 
+0.000887 0.002251 -0.001607 -0.005615 0.005314 -0.003712 
+-0.000661 -0.006144 -0.003127 -0.001335 -0.007702 -0.004720 
+0.002379 0.003086 -0.003728 -0.002737 0.009975 -0.001923 
+0.000108 0.004538 0.000508 -0.001279 0.000944 -0.000104 
+0.001468 0.013310 0.004618 -0.007546 0.021307 0.001487 
+-0.006565 -0.007940 -0.005660 -0.005281 -0.035577 -0.013437 
+-0.004819 -0.037136 -0.013606 -0.005769 -0.029291 -0.010217 
+-0.007984 -0.015035 -0.004467 -0.001977 0.002525 0.000988 
+0.006090 0.007098 0.003724 0.009443 0.005476 -0.003252 
+0.003062 0.008968 -0.003336 -0.001811 0.007518 -0.001262 
+-0.001879 -0.001072 -0.003444 0.000630 -0.002701 -0.003827 
+0.003631 0.001277 0.000531 0.002967 0.004451 0.001571 
+0.006016 -0.002198 0.004263 0.004713 -0.005473 0.003332 
+0.001303 0.002284 -0.001095 -0.003401 0.002731 -0.002978 
+-0.001449 -0.000540 0.000674 -0.002671 -0.005513 0.002816 
+-0.001616 -0.002483 0.003711 0.000942 -0.003064 0.010982 
+0.005483 -0.005769 0.008206 -0.013636 -0.002449 0.016356 
+-0.021837 0.016927 0.014095 -3.137931 5.091954 -8.712644 
+0.059080 0.064567 -0.055963 0.527638 -2.653266 1.165829 
+0.210826 -4.000000 1.846154 0.681373 -4.387255 0.465686 
+0.730887 -4.688073 -1.000000 0.413408 -3.441341 -2.022346 
+-0.001585 0.006632 -0.019972 -0.009533 0.022753 -0.004559 
+-0.001441 0.000268 0.001711 0.004696 -0.011004 0.001505 
+0.006242 -0.021275 0.000528 0.010440 -0.018665 -0.001381 
+0.005020 -0.002105 0.007957 -0.000345 0.001272 -0.000072 
+-0.001329 -0.002141 -0.001981 -0.001157 -0.001152 -0.000620 
+-0.000076 0.001202 0.000318 0.001138 -0.000453 0.000178 
+0.002791 0.002274 0.000736 0.002085 0.003529 0.001924 
+0.004005 0.002356 0.000780 0.003766 0.000483 -0.000102 
+0.003491 0.000177 -0.000819 -0.000580 0.000230 -0.002875 
+-0.003361 -0.000662 0.000958 -0.003871 -0.001633 0.000909 
+-0.001928 -0.000315 0.001446 -0.000610 -0.000739 -0.000522 
+-0.001347 0.000072 0.000327 -0.003295 0.000915 0.000121 
+0.002716 -0.001640 -0.005867 -0.000696 0.000700 -0.009097 
+-0.003005 0.007948 -0.001754 -0.000831 0.008830 0.006207 
+0.001030 0.007610 0.007643 0.003488 0.006450 0.002172 
+-0.004059 0.005551 -0.002567 -0.002884 0.000918 -0.002389 
+-0.001822 0.001291 0.000330 -0.001504 0.000248 0.004141 
+-0.001949 -0.001492 0.000508 -0.000763 0.000370 -0.000915 
+0.003289 -0.006359 -0.001954 -0.000222 -0.001387 -0.002547 
+0.009077 0.006964 -0.004317 0.003778 0.005123 -0.013581 
+0.007753 0.009512 -0.000272 0.002115 0.010138 0.002958 
+-0.009656 0.006489 0.010196 -0.004633 0.013832 0.005674 
+-0.001576 -0.023833 -0.008972 -0.517241 -3.911330 -1.270936 
+-0.792952 -4.158590 -1.387665 -0.955665 -3.822660 -1.241379 
+-0.010076 -0.026947 -0.010934 -0.007238 -0.010263 -0.003493 
+0.005862 0.007085 0.000356 0.009807 0.013909 -0.003503 
+-0.005575 0.005987 -0.003652 -0.000938 0.000685 -0.000616 
+0.002198 -0.002670 -0.000898 0.003024 0.001098 -0.005512 
+0.004649 0.003341 -0.005666 0.001852 0.000011 -0.003712 
+0.002117 -0.003289 -0.000246 0.003418 -0.000003 -0.003843 
+-0.000861 0.003229 0.000445 0.001843 -0.002649 -0.000881 
+0.001000 -0.006361 0.002709 -0.000642 -0.007713 -0.002566 
+0.000317 -0.000716 -0.000513 0.003275 0.003779 0.003918 
+0.008803 0.002115 0.008747 0.001391 -0.001042 0.013751 
+-0.015500 0.052523 -0.039778 1.064516 4.569892 -6.215054 
+-0.537415 -2.374150 1.979592 -0.577358 -3.898113 3.524528 
+0.244624 -3.795699 2.104839 0.415344 -4.002645 0.632275 
+0.000000 -3.956204 -0.532847 0.007357 -0.013890 -0.011069 
+0.000418 0.017617 -0.006718 -0.005316 0.001895 0.000226 
+-0.000081 0.000579 -0.000477 -0.003404 0.001543 0.000722 
+-0.003050 -0.000164 0.001654 0.001417 0.001008 0.002335 
+0.000452 0.002761 -0.006281 0.001038 0.001063 -0.003896 
+0.000373 -0.001009 0.000884 0.000588 0.000169 0.002187 
+0.000441 0.000825 0.001245 -0.001504 0.000474 0.002714 
+-0.001252 0.000941 0.003790 0.001153 0.003118 -0.001193 
+0.002496 0.005725 0.000403 0.003906 0.006628 -0.001588 
+0.001157 0.005087 -0.003502 0.000000 0.002991 0.000513 
+-0.001923 0.002924 0.002687 -0.000288 0.001359 0.000987 
+-0.000264 0.002176 0.000549 -0.001531 0.003062 -0.002578 
+0.000828 -0.000983 -0.001691 -0.002183 -0.000918 -0.000333 
+-0.002064 0.002915 -0.004917 0.008409 0.012011 -0.004789 
+0.002473 0.012095 0.001249 0.001100 0.009422 0.001846 
+-0.001763 0.001170 -0.002928 -0.001157 0.002511 -0.004131 
+-0.001342 0.001051 -0.003384 0.000582 0.001111 -0.001363 
+0.003634 0.002247 0.001195 0.002785 0.004224 -0.001168 
+0.002887 -0.002416 -0.000943 0.004193 -0.003460 0.002454 
+0.002484 -0.002698 0.001993 -0.000531 0.006956 0.000821 
+0.003310 0.005221 -0.006836 -0.001356 0.002190 -0.012410 
+-0.005717 0.001956 -0.011785 -0.007637 0.004211 -0.002072 
+-0.009427 0.014392 0.013280 0.001094 0.004398 0.005161 
+0.003287 -0.023805 -0.005089 -0.264463 -3.809917 -0.710744 
+-0.559028 -4.260417 -0.934028 -0.659498 -4.132617 -0.867384 
+-0.480687 -3.497854 -0.424893 -0.007154 -0.021191 -0.003399 
+-0.000976 -0.003151 0.002079 -0.004014 0.012585 -0.009956 
+-0.003267 0.002938 -0.000620 0.003218 -0.001364 0.001400 
+-0.000252 -0.002028 -0.002520 0.004103 -0.002180 -0.008589 
+0.006045 0.000000 -0.006194 0.000039 0.001433 -0.000978 
+-0.000959 0.003469 -0.000972 0.001105 0.011190 -0.005674 
+-0.003910 0.004989 -0.000176 0.000390 -0.001085 0.001941 
+-0.000344 -0.005136 -0.002362 -0.000889 -0.003325 -0.004034 
+-0.000436 0.001334 -0.002411 0.005727 -0.001851 0.001505 
+0.006014 0.002338 0.010008 0.004244 0.003077 0.002960 
+-0.000821 0.036193 -0.033086 2.382114 -3.325203 3.796748 
+-0.358744 -5.044843 6.107623 -0.640000 -4.360000 4.353333 
+0.081250 -3.975000 2.206250 0.390335 -3.799257 0.457249 
+0.016350 -0.015753 -0.003566 0.004951 -0.000049 -0.013235 
+-0.000034 0.010707 0.004789 -0.001700 0.000881 0.000834 
+0.003101 -0.002738 -0.000835 -0.004625 0.005978 -0.001413 
+-0.016361 0.020768 -0.004639 -0.007635 0.012283 0.001439 
+-0.001249 0.002292 0.002254 -0.000959 -0.004013 0.005832 
+-0.001070 -0.001873 0.006508 -0.004071 0.000776 -0.000852 
+0.000710 0.000635 -0.001594 0.000420 -0.002834 -0.005517 
+0.002969 -0.000994 -0.003375 0.003721 0.001060 0.002550 
+0.006614 0.005790 0.002450 0.005868 0.008387 -0.002762 
+0.004573 0.007479 -0.000915 -0.000798 0.003735 0.002769 
+-0.002772 0.002986 0.002374 -0.003278 -0.000014 0.003085 
+-0.000597 0.000723 -0.000682 -0.002129 0.004261 0.000012 
+-0.003812 0.005387 -0.002414 0.000975 0.001191 0.002110 
+0.006913 0.008947 -0.005962 -0.001628 0.000451 -0.002314 
+-0.004005 0.006294 0.002137 -0.000037 -0.000406 0.001603 
+-0.001405 -0.000990 -0.001451 0.000493 -0.001767 -0.004929 
+0.003386 0.002432 -0.008024 0.003009 0.006336 -0.000333 
+-0.001760 0.005515 -0.002580 0.000253 0.000909 -0.002191 
+0.002940 0.002784 0.001091 0.000038 0.000241 -0.000693 
+-0.001776 0.004330 -0.003113 -0.001334 0.007224 -0.003524 
+-0.003847 -0.002182 0.001761 -0.005860 -0.005117 0.001426 
+-0.010533 0.000671 -0.002691 -0.009978 0.011422 -0.000424 
+-0.003060 0.007265 0.006394 0.006945 -0.007574 0.003829 
+0.006496 -0.024312 -0.000153 0.062745 -3.631372 -0.152941 
+-0.193443 -4.291803 -0.298361 -0.253247 -4.529221 -0.279221 
+-0.203846 -4.226923 -0.146154 0.003374 -0.029532 0.004389 
+-0.001515 0.000542 0.002418 -0.008393 0.016216 -0.004969 
+0.001052 -0.000965 -0.001065 0.000002 -0.003613 -0.000019 
+0.001337 -0.001190 -0.003693 0.006205 -0.000178 -0.003636 
+0.004346 -0.002783 -0.004517 0.001200 0.001068 0.000854 
+-0.000963 0.003420 -0.004320 -0.008152 0.009769 -0.004428 
+-0.003431 0.006737 0.003602 -0.005484 -0.000714 0.002522 
+0.001173 -0.003919 -0.000414 -0.000533 -0.004056 0.000427 
+0.000938 -0.002031 -0.000625 0.000672 -0.001490 0.001916 
+0.005625 0.002710 0.002304 0.001775 0.004273 -0.001681 
+0.008129 -0.016642 0.013836 0.336735 -4.045918 5.933673 
+0.259386 -3.822526 5.447099 0.233010 -3.760518 3.873786 
+0.285156 -4.031250 2.027344 0.640449 -3.831461 0.089888 
+0.010179 -0.019684 -0.014302 0.000096 0.005225 -0.006612 
+-0.003329 0.006012 0.002505 -0.001012 -0.005540 0.005465 
+0.001035 -0.016008 0.001322 -0.004605 -0.003790 -0.017184 
+0.000566 -0.000939 -0.004792 -0.000067 0.000360 0.001849 
+0.000638 -0.000100 0.004271 -0.005760 -0.007963 0.005442 
+-0.004494 -0.004893 0.002621 -0.001865 -0.001505 -0.000905 
+-0.002153 0.000894 -0.003010 -0.000627 0.002492 -0.001200 
+-0.000901 0.001749 -0.004759 -0.001459 0.001738 0.000029 
+0.005404 0.001161 0.000272 0.003576 0.002651 -0.003349 
+0.003838 -0.001309 -0.002889 -0.001359 0.000399 -0.000632 
+-0.002480 0.001728 0.000441 -0.003631 -0.002075 0.002786 
+-0.003924 -0.007550 0.003477 -0.005860 -0.007163 0.003548 
+-0.004050 -0.003223 -0.001157 0.000000 -0.000579 -0.002314 
+0.001576 0.002899 0.001148 -0.005897 0.002704 -0.001056 
+-0.002626 -0.001619 0.002772 0.002927 -0.005974 -0.002550 
+0.008355 -0.005047 -0.001913 0.007947 -0.000339 -0.003043 
+0.002425 0.003679 0.000325 -0.000798 0.004458 0.000868 
+0.001281 0.003308 0.002398 0.003647 0.002001 0.004585 
+0.001640 -0.001918 0.003229 -0.000795 0.001891 -0.002328 
+0.000594 0.007203 -0.008564 -0.000937 -0.003224 -0.008548 
+-0.003439 -0.004855 -0.006818 -0.002295 -0.003354 -0.000921 
+-0.007969 0.008542 -0.004115 -0.003550 0.015250 -0.001570 
+-0.000031 0.007103 0.003459 0.004579 -0.007584 0.005646 
+0.005679 -0.023098 0.004474 0.403846 -3.507692 0.276923 
+0.282051 -4.157051 0.250000 0.100000 -4.396774 0.361290 
+-0.359833 -4.209205 0.468619 0.000890 -0.019046 0.014371 
+-0.009507 0.017866 -0.004917 -0.004531 0.020015 -0.003877 
+0.000992 0.003949 -0.002578 0.001217 -0.003519 0.000847 
+-0.000329 0.001044 -0.001083 0.000350 -0.000600 -0.000941 
+0.000227 -0.005042 -0.001634 0.005258 -0.005736 -0.002569 
+0.000887 0.005381 -0.007584 -0.009294 0.005254 -0.003737 
+0.000497 0.002153 0.002941 -0.001444 0.001749 0.002618 
+0.002566 -0.002990 0.001018 0.001123 0.000157 0.000357 
+0.003697 -0.000543 -0.001060 0.001705 0.004222 -0.002430 
+0.005355 -0.000833 0.000791 0.001210 0.001682 -0.002415 
+0.009245 -0.010741 0.036137 -0.161157 -2.871901 5.590909 
+0.198813 -3.044510 5.002967 0.338369 -3.398792 3.836858 
+0.583658 -3.731518 2.050584 -0.006163 -0.027872 0.006305 
+-0.002921 -0.012105 -0.009821 -0.000448 0.006768 -0.003698 
+-0.004992 0.006537 0.002464 -0.002127 0.004534 0.004819 
+0.003567 -0.001425 -0.000463 0.000681 -0.000295 -0.004960 
+-0.000606 0.000295 0.000255 -0.000740 -0.000618 0.006838 
+-0.003456 -0.002084 0.007792 0.000681 0.000785 0.000767 
+-0.000182 0.001627 -0.001755 0.000417 0.000078 -0.001759 
+-0.001078 -0.002734 0.002156 -0.002840 0.002418 0.002561 
+-0.004794 0.005282 0.000402 -0.004561 0.005294 -0.002735 
+0.002814 0.003322 -0.003922 0.001013 -0.000882 -0.005771 
+-0.002782 -0.000975 -0.001153 -0.002607 0.004917 -0.000621 
+0.001323 0.000247 0.001353 0.000503 0.000923 0.003188 
+0.000707 -0.001436 0.000452 -0.001457 -0.001420 -0.003475 
+-0.001916 -0.002210 -0.005603 -0.001806 -0.003334 -0.005724 
+-0.001831 0.003760 0.000572 0.002415 -0.001391 0.003806 
+0.007187 -0.001406 0.001094 0.007835 -0.003186 0.001652 
+0.002008 -0.000578 0.001096 -0.001836 0.003230 -0.002994 
+-0.002191 0.008942 -0.002929 0.000335 0.008631 -0.001038 
+0.002921 0.003450 -0.000928 0.004266 -0.001641 -0.003053 
+0.002695 -0.004511 -0.003707 -0.001842 -0.001200 -0.004791 
+-0.004589 0.000488 -0.005759 -0.005310 0.001101 -0.000931 
+-0.000975 -0.000096 0.001743 0.002245 0.003440 -0.000612 
+-0.003071 0.000439 -0.004694 0.000525 0.012012 -0.003081 
+0.001570 0.003763 0.002959 0.001956 -0.008588 0.005708 
+0.003991 -0.023984 0.005696 0.387833 -3.555133 0.695817 
+0.543408 -4.006431 0.662379 0.391003 -3.961938 0.733564 
+-0.479798 -3.348485 0.722222 -0.011710 -0.000836 0.012753 
+-0.004770 0.022829 -0.001837 -0.000185 0.008705 0.000756 
+0.002549 0.001017 0.002640 -0.000412 0.000061 0.001662 
+-0.003358 -0.001614 -0.000576 0.001241 -0.002179 0.005196 
+0.003995 -0.005685 0.008219 0.000514 -0.002731 0.003226 
+-0.002220 0.007577 -0.003854 -0.000584 0.009891 -0.002415 
+0.001471 0.007763 0.002084 0.004745 0.003124 -0.002639 
+0.004931 0.000904 -0.000164 -0.002651 -0.000818 -0.003291 
+0.000549 0.000622 -0.008504 0.004042 0.005741 -0.007058 
+0.003846 0.003469 -0.006173 -0.001353 -0.002254 -0.000561 
+-0.776398 -1.465839 3.503106 0.023438 -2.230469 5.199219 
+0.511494 -2.459770 4.747127 0.794521 -2.736986 3.569863 
+0.990385 -2.926282 2.025641 0.000478 -0.026184 0.003721 
+0.005336 -0.010620 -0.006411 0.003719 0.013227 -0.009719 
+0.006646 0.006750 0.004055 0.004061 -0.001493 -0.005290 
+0.001441 -0.000695 -0.001470 -0.001500 0.001380 0.005460 
+-0.001047 0.002930 0.010043 -0.004188 -0.002965 0.010305 
+-0.003163 0.000469 0.002561 -0.000206 -0.000877 -0.001866 
+0.000409 -0.001280 -0.001491 0.000880 -0.000320 0.000560 
+-0.000319 -0.001286 0.000437 -0.001710 -0.000019 -0.000906 
+-0.001231 0.001095 -0.001026 -0.002217 -0.001117 0.001833 
+-0.004552 0.001360 0.003017 -0.006667 -0.002381 0.005048 
+-0.004478 0.001871 0.001791 -0.002648 0.005024 -0.003154 
+-0.003060 0.001489 -0.001355 -0.004978 0.001054 -0.000036 
+-0.005766 -0.004112 0.001251 -0.008085 0.004906 -0.000863 
+-0.003664 0.003413 -0.008012 -0.002866 0.001943 -0.007010 
+0.000545 0.001074 0.000101 0.000206 -0.001301 -0.000329 
+0.001606 -0.003215 0.001625 -0.001667 -0.001324 0.004658 
+-0.011774 -0.002590 -0.001312 -0.003110 0.000456 -0.003120 
+0.005866 0.010050 -0.005097 0.008896 0.014648 -0.005437 
+0.008974 0.009174 -0.006382 -0.000304 -0.002535 -0.002096 
+-0.002993 0.000016 -0.003652 -0.004188 0.004188 -0.004274 
+-0.003222 0.005498 -0.000206 -0.001028 0.003968 0.001764 
+-0.001599 -0.000309 0.006026 -0.000372 -0.002197 0.002125 
+-0.003878 0.000089 -0.001183 -0.000742 -0.000216 0.000938 
+-0.000255 -0.002488 0.003422 0.002683 -0.008508 0.004636 
+0.004119 -0.019754 0.004455 0.184000 -3.000000 0.944000 
+0.330882 -3.474265 1.106618 0.348018 -3.277533 1.211454 
+0.001547 -0.017642 0.011330 0.000239 0.014555 -0.006151 
+0.000838 0.014130 -0.003476 0.003290 0.003114 -0.002866 
+0.001974 -0.000068 0.000952 -0.004753 0.000839 0.000175 
+-0.003226 0.001458 -0.001342 -0.003374 0.001121 0.001398 
+-0.000796 -0.005598 0.007025 -0.001827 0.000135 0.003030 
+-0.002276 0.002034 0.001808 -0.001710 0.003078 0.001482 
+-0.000266 -0.000394 0.000727 0.003377 -0.001695 -0.001201 
+-0.000249 0.000936 -0.000911 0.000409 0.001859 -0.003122 
+-0.002602 0.003706 -0.002357 0.002037 0.001546 -0.004366 
+-0.001807 0.000890 -0.006059 -0.005681 -0.009492 0.005354 
+0.001611 -0.013241 0.030987 0.697959 -1.457143 4.473469 
+1.280864 -1.595679 4.256173 1.398230 -1.926254 3.289086 
+1.217391 -2.282609 2.043478 0.008277 -0.020031 0.007178 
+0.005091 -0.002189 -0.004015 -0.001300 0.006810 0.000719 
+-0.000534 0.000469 -0.000435 0.002646 -0.001636 0.001946 
+-0.000203 -0.000172 0.004747 -0.002348 -0.002487 0.007461 
+0.000362 0.001205 0.006151 -0.000426 0.000476 0.000169 
+-0.000239 0.000129 -0.003858 -0.002796 -0.000129 -0.001075 
+0.000060 -0.001533 0.001208 0.000601 0.002991 -0.001197 
+-0.000182 0.005688 0.000939 -0.002076 0.001507 -0.001836 
+-0.000017 -0.003661 0.003727 -0.004044 0.000000 0.009412 
+-0.004111 -0.006813 0.010057 -0.003160 -0.003634 0.002822 
+-0.001374 0.002124 -0.001806 -0.000507 0.004160 -0.007184 
+0.000692 0.000000 -0.009692 0.000216 0.005483 -0.011236 
+0.000046 0.003074 -0.008227 -0.000182 0.001907 -0.005091 
+-0.000186 0.002273 -0.004526 -0.001298 0.001574 -0.005666 
+-0.001122 0.001329 -0.000903 -0.000176 -0.000486 -0.001274 
+0.000523 -0.000921 -0.002198 0.001747 -0.000470 -0.003358 
+0.006129 0.002943 -0.003431 0.006515 0.008938 -0.004343 
+0.008454 0.007642 -0.002358 0.004039 0.006256 -0.002907 
+0.001127 0.003078 -0.003621 0.001400 -0.000405 -0.003391 
+0.001614 0.002481 -0.001796 0.002500 0.001616 -0.001847 
+-0.001414 0.001320 0.002772 -0.003790 -0.000125 0.006767 
+0.000829 -0.000198 0.005878 -0.000015 -0.002592 0.000978 
+-0.002225 -0.000980 -0.003880 -0.003839 -0.002493 -0.005333 
+-0.000894 0.002631 -0.004129 0.001231 -0.001031 0.001678 
+0.003451 -0.009238 0.004186 0.001651 -0.016829 0.008314 
+0.000104 -0.019651 0.014265 -0.002008 -0.017777 0.016197 
+-0.006673 -0.005469 0.009871 0.002420 0.004679 -0.003001 
+0.004060 0.004455 -0.002649 0.005962 0.004257 -0.002955 
+0.003421 0.003408 -0.002452 0.000449 0.003788 0.000559 
+0.001994 -0.000039 0.000764 0.003753 0.000794 -0.000760 
+0.004642 0.003255 -0.002231 0.003721 0.000906 -0.004238 
+-0.000550 0.000183 -0.002137 -0.001368 0.001169 -0.000995 
+-0.000802 0.001260 -0.002289 -0.001577 0.000371 -0.002874 
+0.000330 0.000712 -0.000957 -0.001731 0.004337 -0.000942 
+-0.006251 0.009678 -0.003866 -0.000481 0.001192 -0.015152 
+0.004641 0.006966 -0.014474 0.000311 -0.003515 0.007271 
+0.004510 -0.008622 0.025008 0.931818 -0.786364 3.363636 
+1.698113 -0.901887 3.324528 1.963710 -1.149194 2.782258 
+0.011072 -0.020061 0.007815 0.009993 -0.005281 -0.005499 
+-0.001246 0.014444 -0.005351 -0.003835 0.009116 -0.000796 
+0.000774 0.002773 0.005639 0.004581 0.000744 0.002209 
+-0.000185 -0.000807 0.000635 -0.002067 -0.001135 0.000800 
+-0.001897 -0.000157 0.002450 0.001858 0.002633 0.002517 
+0.000285 0.002501 -0.002464 -0.001165 0.001903 -0.002151 
+-0.001175 0.003070 -0.004063 -0.002571 0.003109 -0.005143 
+-0.000928 0.002889 -0.003178 -0.000686 0.000535 0.000736 
+-0.000476 -0.003090 -0.000999 -0.003883 -0.007239 0.005436 
+-0.006206 -0.005315 -0.000146 -0.001451 -0.001910 -0.000554 
+0.001454 0.000866 -0.000406 0.001339 0.002217 -0.001247 
+0.000658 0.002061 -0.002286 0.001758 0.000403 -0.000815 
+0.000690 0.002045 0.001046 -0.001195 0.006364 -0.000531 
+-0.003040 0.003582 -0.006674 -0.002955 0.002633 -0.006017 
+-0.001553 -0.000514 -0.003076 -0.002667 0.000133 -0.001452 
+-0.001040 0.001188 -0.001682 -0.001128 0.002473 0.000969 
+0.001050 0.005817 0.002974 0.001663 0.005221 0.001848 
+-0.001376 0.000625 0.003123 -0.000721 0.001353 -0.000405 
+-0.000479 0.000575 -0.001989 0.000284 -0.000938 -0.001065 
+0.000935 -0.002804 0.000623 0.001525 -0.002939 0.002497 
+0.001129 -0.002177 0.002741 0.001583 0.000167 0.001583 
+-0.001655 0.001182 0.004250 -0.000344 0.001707 0.002879 
+-0.001260 0.005562 -0.000292 -0.003282 0.000300 0.002241 
+0.002912 0.009495 -0.004809 0.000753 0.001506 -0.000383 
+-0.000013 -0.006457 0.004377 -0.002036 -0.011196 0.007966 
+-0.003868 -0.011061 0.010165 -0.005985 -0.006842 0.009782 
+-0.003979 -0.003838 0.006851 -0.009686 0.001659 0.002428 
+-0.008752 -0.001450 -0.001290 -0.003566 0.001033 -0.003779 
+-0.000688 0.001520 -0.003431 -0.000260 0.002730 -0.001926 
+0.000210 0.000314 -0.002141 0.002084 0.000104 -0.002214 
+0.002134 0.000298 -0.002540 -0.000249 -0.000375 -0.002209 
+-0.003107 -0.000693 -0.001144 -0.004377 0.000827 -0.001117 
+-0.005197 0.002252 -0.001793 -0.003498 -0.001105 -0.001167 
+0.000230 -0.000941 0.000777 0.001008 -0.001334 0.002218 
+-0.000410 0.001348 0.000483 -0.003459 0.009246 -0.009111 
+0.003846 0.016810 -0.015893 0.005201 0.009104 0.000913 
+0.005375 -0.002007 0.015356 0.008272 -0.007255 0.016822 
+0.013013 -0.009816 0.010968 0.014118 -0.010211 0.000497 
+0.011995 -0.004046 -0.013521 0.004265 0.007820 -0.020300 
+0.000346 0.004085 -0.007111 -0.003728 0.002588 0.002736 
+-0.001198 0.002505 -0.002364 -0.002442 0.005968 -0.004612 
+-0.002462 0.004348 -0.001539 0.001053 0.003599 0.002252 
+0.005501 0.003184 0.001050 0.004805 0.001617 -0.002163 
+0.001029 -0.000441 -0.002049 -0.001000 -0.001250 -0.000250 
+-0.003835 0.001268 -0.000031 -0.001877 -0.000367 -0.003938 
+-0.001775 -0.002901 -0.003204 -0.002179 -0.001710 -0.000102 
+-0.000800 -0.000360 0.001020 -0.001189 -0.000223 -0.002173 
+-0.003272 -0.002874 -0.002685 -0.002070 -0.002195 0.000767 
+-0.000651 0.001450 0.000686 -0.000164 0.001789 0.000450 
+-0.000986 -0.001694 0.002403 -0.003460 -0.008438 0.003600 
+-0.004885 -0.007773 0.004589 -0.003802 -0.002404 0.003690 
+-0.003101 0.001957 0.001551 -0.003241 0.002514 -0.000121 
+-0.001269 -0.000465 0.000435 -0.003086 -0.002203 -0.000693 
+-0.002610 -0.001123 -0.000006 -0.002022 0.000085 -0.001026 
+0.000471 0.001030 0.001085 0.003145 0.003186 -0.001123 
+0.000679 0.001215 -0.001355 0.000496 0.001315 0.002415 
+0.002541 0.002090 0.002090 0.002829 0.003071 0.000867 
+0.001831 0.000819 -0.000488 0.000064 0.000014 -0.000083 
+-0.000443 0.000306 0.000244 0.000935 0.003468 0.001730 
+0.000674 0.003597 -0.001008 0.000123 0.000721 -0.002215 
+-0.000064 -0.001157 -0.000495 0.001111 0.000108 0.000972 
+0.000675 0.000544 0.000884 -0.000808 0.000276 -0.000927 
+-0.002664 -0.002138 0.001525 -0.006789 -0.007864 0.005517 
+-0.009771 -0.009635 0.006440 -0.005459 -0.002616 0.002138 
+0.002027 0.006931 -0.002838 0.003845 0.012427 -0.009322 
+0.004645 0.005231 -0.008534 -0.000261 0.000389 -0.001647 
+-0.000371 -0.000777 -0.006173 0.001763 0.002731 -0.009189 
+0.000454 0.001856 -0.006273 -0.000652 -0.000405 -0.001207 
+-0.002526 -0.000187 0.001080 -0.000538 -0.000192 -0.000372 
+0.001256 -0.000085 -0.003810 -0.001429 0.000784 -0.004124 
+-0.003433 0.000606 -0.000982 -0.001800 -0.000048 -0.001436 
+-0.001258 0.003247 -0.003242 -0.002079 0.002199 -0.007497 
+0.003175 -0.000859 -0.004101 -0.000294 -0.004951 0.001399 
+-0.002091 0.001864 0.000074 0.006093 0.012130 -0.009613 
+0.011383 0.009357 -0.004152 0.007982 0.003744 0.000206 
+0.006494 0.001520 -0.000591 0.005891 0.000812 -0.005656 
+0.001925 0.001004 -0.011399 -0.000178 -0.000755 -0.012258 
+-0.000245 -0.000326 -0.004201 0.001108 -0.000974 0.001498 
+0.000650 -0.000474 0.000037 -0.000951 0.000555 -0.001966 
+-0.002535 0.002128 0.001570 -0.004816 0.002161 0.002373 
+-0.003192 0.000283 0.003940 0.000939 0.000060 -0.001169 
+0.002619 0.002329 -0.006110 -0.000419 -0.002395 -0.002605 
+-0.001932 -0.002143 -0.002927 -0.001570 -0.002645 0.001570 
+-0.001493 -0.002607 0.000752 -0.000089 0.000385 0.000536 
+-0.000690 0.001347 0.000734 -0.002962 0.000171 0.001452 
+-0.001942 0.001727 -0.002590 -0.000968 0.003015 -0.003104 
+0.002622 0.005437 -0.002646 0.000680 -0.000493 -0.000903 
+0.000746 -0.000201 0.000919 0.000682 0.000844 0.001477 
+0.000359 -0.003430 0.000957 0.000000 0.000329 -0.000179 
+-0.002304 0.004823 -0.004751 0.003284 0.003284 -0.006343 
+0.003865 0.002150 -0.000268 0.000866 0.004445 -0.001099 
+0.001630 0.001139 -0.001872 -0.000038 0.000335 0.001303 
+-0.001477 0.003424 0.000754 0.000222 0.000226 -0.000169 
+0.000808 -0.001034 0.000065 0.000097 -0.000220 -0.000155 
+-0.001765 0.003561 -0.000894 0.000083 0.002552 -0.003975 
+0.003805 0.001596 -0.003378 0.004518 0.003003 0.001212 
+0.004564 0.003053 0.000734 0.003835 0.001253 -0.001403 
+0.000569 0.002911 -0.002976 0.001467 0.003112 -0.003446 
+0.000726 0.003593 -0.001165 0.000247 0.003043 0.000555 
+-0.000093 -0.001601 -0.002385 0.001419 0.002072 -0.009506 
+-0.001496 0.003830 -0.005550 -0.003774 0.001882 -0.001113 
+-0.005568 0.001855 0.000820 -0.001290 0.002130 -0.000236 
+0.006512 0.006454 -0.005861 0.012484 0.011113 -0.012283 
+0.010854 0.010670 -0.013633 -0.002067 0.002056 -0.002393 
+-0.001103 0.002376 0.003207 0.000483 0.000397 -0.001167 
+0.000284 0.000081 -0.001238 -0.001506 -0.000520 0.001624 
+-0.003010 -0.000581 0.003693 -0.002928 -0.000394 0.002576 
+-0.001160 -0.000083 0.000724 0.000147 0.000181 0.000249 
+-0.000006 0.000156 0.000179 -0.001725 0.001503 0.000299 
+-0.004877 0.005679 -0.002834 -0.005508 0.011000 -0.013062 
+0.010729 0.007294 -0.021579 0.011344 0.005621 0.000166 
+0.002927 0.005044 -0.001085 0.000226 0.006618 -0.004109 
+0.001629 0.003404 -0.005610 0.001227 -0.000489 -0.003471 
+-0.003359 -0.001465 -0.002142 -0.009166 -0.002098 0.000187 
+-0.008844 -0.002317 0.000279 -0.001841 -0.002661 -0.002507 
+-0.000966 -0.001123 -0.002165 -0.000525 0.001716 -0.003452 
+0.000839 0.001144 -0.003555 0.002168 0.000065 -0.001344 
+-0.000146 0.000724 0.000610 -0.003687 -0.001368 0.003822 
+-0.009632 -0.003509 0.004368 -0.005246 0.002812 0.000377 
+-0.001918 0.000682 -0.002195 -0.000061 -0.000170 -0.000148 
+0.006567 -0.000567 -0.003420 0.003023 0.001051 -0.004335 
+0.002013 -0.001639 -0.001808 0.001401 -0.002719 -0.002772 
+0.000771 -0.001574 -0.001641 0.000792 0.000481 0.001692 
+-0.000624 0.000499 0.002857 -0.000554 0.000731 -0.001993 
+-0.000637 0.003202 -0.006420 -0.000101 0.002653 -0.006431 
+-0.001356 0.004520 -0.001129 -0.002371 0.003014 0.000119 
+-0.001426 0.000845 -0.001544 -0.001448 0.000510 -0.003319 
+-0.000691 0.001133 -0.003499 0.000848 0.002291 -0.003597 
+0.003701 0.004742 -0.000940 0.002671 0.008673 -0.000511 
+-0.002208 0.007749 -0.002095 0.000059 0.002754 0.002085 
+-0.000290 0.002613 0.000253 0.001055 0.003678 -0.001641 
+0.001311 0.001852 -0.004607 0.000063 -0.001036 -0.004048 
+0.000637 -0.001155 -0.003143 -0.000940 0.000940 -0.002857 
+0.000827 0.000035 -0.001489 0.001703 0.001546 -0.000493 
+0.001245 0.000007 0.001234 0.001792 -0.004022 0.000146 
+0.000988 -0.004223 0.000419 -0.000119 -0.003203 0.001426 
+0.000179 -0.001851 0.001131 -0.000401 0.000968 -0.000962 
+-0.000637 0.004421 -0.002095 0.000090 -0.000360 -0.000631 
+-0.000327 -0.002228 0.001311 -0.000814 -0.006123 0.001744 
+-0.006841 -0.003430 0.000242 -0.001058 -0.003618 -0.002954 
+-0.002647 -0.000115 -0.010541 0.000840 0.002110 -0.009691 
+-0.002058 -0.000432 -0.002367 -0.000659 0.000540 0.000912 
+-0.002166 0.000383 0.001375 -0.004458 -0.002556 0.000964 
+-0.001183 -0.001275 -0.002742 0.001036 -0.000762 -0.003984 
+0.001270 -0.000483 -0.003185 0.000587 -0.000256 -0.001500 
+-0.000822 -0.000069 -0.000356 -0.001524 0.000211 0.000062 
+-0.001749 0.000397 0.000220 -0.002463 0.000364 -0.000788 
+-0.002777 0.000139 -0.003054 -0.002722 0.001222 -0.004648 
+0.001087 0.007110 -0.007291 0.006141 0.008809 -0.008851 
+0.004906 0.006103 -0.002194 0.007667 0.003635 0.001371 
+0.008171 0.005921 0.000726 0.001757 0.009117 0.000752 
+-0.004218 0.003918 0.001807 -0.004082 -0.003067 0.003367 
+-0.008642 -0.001387 -0.004437 -0.005044 0.001553 -0.000703 
+-0.002404 0.003942 -0.002683 0.001761 0.003677 -0.001665 
+0.002604 0.002316 -0.001412 0.003084 0.003309 -0.000645 
+0.002388 0.004536 -0.003513 0.001885 0.001365 -0.003185 
+0.001359 -0.000158 -0.000693 0.001442 0.000010 0.000447 
+0.000806 0.002396 0.001319 -0.000619 0.004850 0.000747 
+-0.001240 0.003977 0.001326 0.000458 0.001805 -0.001791 
+-0.000424 0.001624 -0.000819 0.000952 -0.001429 -0.002381 
+-0.000479 -0.000174 -0.000698 0.000769 0.000116 -0.000165 
+0.002166 0.002586 -0.001726 0.002474 0.003776 -0.000260 
+0.002573 0.001889 -0.001368 0.001591 0.000000 0.000000 
+0.000956 -0.000860 -0.001766 0.000282 0.000427 -0.006095 
+0.003492 0.002951 -0.001164 -0.000454 0.000789 -0.000020 
+0.000233 0.000589 -0.000001 0.000388 0.001696 -0.000511 
+-0.001874 0.004563 -0.001810 0.001015 0.008857 0.000516 
+0.000761 0.002738 0.004021 -0.001863 0.001454 -0.003095 
+0.000293 0.003065 -0.003087 0.000110 0.000175 0.000014 
+-0.000447 -0.000130 -0.000202 0.000160 0.002958 0.000845 
+-0.001360 0.005680 -0.004080 0.003823 0.001411 -0.002895 
+-0.000392 -0.000339 -0.000074 -0.001625 -0.000109 -0.000469 
+0.001522 0.000914 0.000151 0.001098 0.003355 -0.001810 
+0.000845 0.000471 -0.002669 0.000738 -0.001094 -0.002149 
+0.000519 -0.002157 -0.002726 -0.000028 -0.002081 -0.001940 
+-0.001096 -0.001645 0.001724 -0.002154 -0.001773 0.003792 
+-0.001711 0.001129 -0.002561 -0.001116 0.002999 -0.006578 
+0.000290 0.003589 -0.006500 0.001531 0.001066 -0.002496 
+-0.001326 -0.000949 0.000860 -0.001986 0.000252 0.002036 
+-0.001232 0.004652 0.000886 0.001379 0.007371 -0.003525 
+0.002967 0.007307 -0.006643 0.001649 0.004622 -0.008870 
+-0.002695 0.003650 -0.009240 -0.007513 0.002353 -0.012064 
+-0.006493 -0.004245 -0.012805 0.003404 -0.006776 -0.012732 
+0.006327 -0.004114 -0.012631 0.000906 -0.000705 -0.010246 
+-0.002628 0.003700 -0.011177 0.002707 0.005464 -0.012212 
+0.005414 0.003731 -0.011050 0.004046 0.001593 -0.003437 
+-0.004430 0.000660 0.000024 -0.003162 -0.000974 -0.007340 
+0.001583 0.003962 -0.007918 0.000417 0.010788 -0.013540 
+0.005691 0.009654 -0.008064 0.004686 0.004758 -0.005411 
+0.007659 0.002965 -0.005200 0.006107 0.005919 -0.009114 
+-0.003312 0.010253 -0.008245 -0.002634 0.008465 -0.004891 
+-0.000579 0.002150 -0.001159 0.002518 -0.003496 -0.002274 
+0.002128 -0.002879 -0.002546 -0.000026 0.000722 0.000118 
+-0.002518 0.001655 0.001591 -0.001678 -0.000410 0.000881 
+-0.000467 -0.000126 -0.000215 -0.000084 0.002308 0.000032 
+-0.000162 0.004985 -0.000225 0.000364 0.005948 -0.000320 
+0.000631 0.004444 -0.000105 0.000907 0.004827 -0.005733 
+0.000021 -0.000261 -0.000056 0.000678 -0.000209 -0.001306 
+0.001354 0.000864 -0.000042 0.000236 0.001968 0.000163 
+-0.001018 0.001399 0.000265 0.001049 0.001116 -0.000246 
+-0.001243 0.001283 -0.001204 -0.001515 0.001789 0.000102 
+-0.003007 0.000914 -0.000722 0.000142 0.001961 -0.002956 
+-0.000896 0.000093 -0.002771 0.000697 -0.000226 0.000412 
+0.001165 0.002056 0.000667 -0.001126 0.003664 0.000501 
+0.003046 0.004654 0.001211 0.000189 -0.000005 0.000894 
+-0.000977 0.001272 -0.003784 -0.000137 -0.000466 -0.003581 
+0.003287 0.004290 0.000216 -0.001088 0.004339 0.000870 
+-0.002069 0.003931 -0.003724 0.002790 0.006783 -0.005593 
+0.006780 0.007910 -0.006103 0.006516 0.005998 -0.003185 
+0.001000 0.003994 0.000004 0.001603 -0.000405 -0.002026 
+0.002676 0.003739 -0.003226 -0.000245 0.002690 0.000325 
+-0.000901 -0.002028 0.006532 -0.003968 -0.003800 0.005972 
+-0.001868 -0.002157 0.001906 0.000293 -0.000290 -0.002243 
+-0.001957 0.001379 -0.003262 -0.002018 0.001835 -0.001529 
+-0.002216 0.004638 -0.002275 0.000123 0.007971 -0.012635 
+-0.000355 0.008166 -0.013523 -0.001047 0.006433 -0.006727 
+-0.001521 0.001454 0.001928 0.000994 0.001012 0.001693 
+-0.001390 -0.000160 -0.002505 -0.005005 0.001405 -0.006800 
+-0.004213 0.002438 -0.010305 -0.001624 0.004444 -0.010505 
+-0.002442 0.003938 -0.007543 -0.004123 -0.002749 -0.006267 
+-0.007497 -0.005049 -0.004620 -0.005741 0.000022 0.001309 
+-0.002694 0.011623 -0.002758 0.000908 0.015475 -0.010596 
+0.001556 0.005328 -0.014726 0.000765 0.007184 -0.009345 
+-0.003755 0.000284 -0.004430 -0.003797 -0.002745 0.000468 
+-0.002010 0.000990 0.000765 0.004659 0.003487 -0.004861 
+0.012109 0.000937 -0.005170 0.002058 -0.001482 -0.009221 
+-0.000744 0.003537 -0.004441 0.000883 -0.003294 0.000622 
+0.001453 -0.003226 -0.000026 -0.001429 0.003385 -0.001692 
+-0.001348 0.005618 0.000000 0.001801 0.002456 0.001193 
+0.000805 0.001664 0.000678 0.001008 0.000661 -0.001143 
+0.001738 0.002282 -0.002689 0.002077 0.002881 -0.003774 
+0.001941 0.001380 -0.002547 -0.000611 -0.000097 -0.000780 
+-0.000735 0.001648 -0.000536 -0.000679 0.002590 0.000021 
+0.000939 0.006053 -0.002183 0.003315 0.007545 -0.002472 
+0.000620 0.004234 -0.002280 -0.003206 0.001856 0.001744 
+-0.000645 0.000726 0.000565 -0.001150 0.001394 -0.001908 
+0.000700 0.002619 0.000249 0.001172 0.001655 0.000734 
+-0.000852 -0.000075 0.000065 -0.002139 -0.001725 -0.000346 
+-0.002649 -0.000154 -0.001965 -0.002578 0.002466 -0.000966 
+-0.000824 0.003558 -0.001414 0.001077 0.000465 -0.003549 
+0.001972 -0.002499 -0.001601 -0.000077 -0.002017 -0.001614 
+-0.002980 -0.002214 -0.001533 -0.003237 0.001462 -0.002645 
+0.000455 0.000177 0.000466 -0.000627 0.000098 0.001105 
+-0.001512 -0.000825 0.000977 0.000297 0.001123 -0.000681 
+0.003566 0.002202 -0.001399 0.003887 -0.001473 -0.003549 
+0.004123 0.000280 -0.006286 0.000914 0.002449 -0.004192 
+-0.000020 0.001214 0.000318 0.000820 0.002871 -0.001074 
+0.001159 0.005069 -0.003017 0.000192 0.004218 -0.004738 
+-0.001376 0.003599 -0.002859 0.000393 0.002139 -0.001016 
+0.001068 0.001469 0.001681 -0.000337 0.000843 0.001235 
+0.000051 -0.002421 0.001601 0.000633 -0.002490 -0.000325 
+-0.003263 -0.004432 -0.003813 -0.015238 -0.008436 0.001905 
+-0.007719 0.000630 0.007357 -0.000810 0.001731 -0.004222 
+0.001607 0.003459 -0.011456 -0.000667 -0.002532 -0.006352 
+0.000871 0.000234 -0.003514 0.001342 -0.000365 -0.000156 
+0.001557 0.000548 -0.004602 -0.001344 0.005307 -0.012757 
+-0.009519 0.009987 -0.011748 0.001157 0.023744 0.003786 
+0.002720 0.004347 0.018771 0.002742 0.002036 0.024243 
+0.000131 0.001526 0.021352 -0.002447 0.000771 0.013167 
+-0.002531 0.008807 0.006170 -0.002485 -0.002833 -0.008146 
+-0.001993 -0.004194 -0.009007 0.000812 0.001767 0.000618 
+0.002632 0.006512 -0.001118 0.002532 0.007424 -0.002722 
+0.002553 -0.000240 -0.004931 -0.002376 -0.001508 0.007699 
+-0.004019 -0.002940 0.015106 -0.003393 -0.000278 0.004368 
+0.003142 0.005698 -0.009255 0.007323 0.011155 -0.003007 
+0.001238 -0.000904 -0.001305 -0.001336 -0.003077 0.002003 
+-0.006630 -0.000652 0.000326 0.001582 0.000308 -0.000047 
+0.007951 0.005051 -0.002214 0.002869 0.006896 0.000365 
+-0.000965 0.003587 0.002143 -0.001323 0.001897 0.000510 
+0.000820 0.001230 -0.000574 0.001729 0.003705 -0.000246 
+0.000000 0.005581 0.000543 0.004331 0.004814 -0.000400 
+0.004674 0.004489 -0.003581 0.002597 0.004041 -0.002903 
+-0.001675 0.000293 -0.000704 -0.004893 -0.001802 0.003846 
+-0.006140 -0.000264 0.001253 -0.005795 -0.001374 -0.000599 
+-0.004938 -0.002328 -0.003244 -0.002939 0.000000 -0.004618 
+-0.001724 0.002995 -0.004431 0.000820 0.004191 -0.004101 
+-0.002843 0.003511 -0.003127 -0.002499 0.001298 -0.001100 
+0.000776 -0.000982 -0.000249 -0.000436 -0.001190 -0.003920 
+-0.001669 -0.000909 -0.001484 -0.002388 0.000373 -0.001194 
+-0.003413 0.003498 -0.002065 -0.003308 0.004369 -0.003838 
+-0.001162 -0.002184 0.000139 -0.000752 0.000470 -0.000754 
+-0.000967 0.001670 -0.002285 -0.001181 0.001890 0.000236 
+-0.001440 0.000204 0.000330 -0.002292 -0.000731 0.000915 
+-0.002678 0.000464 -0.001536 -0.000014 0.001731 -0.004370 
+0.002250 0.002813 -0.005403 0.004368 0.002121 -0.005033 
+0.004426 0.002611 -0.004351 0.002516 0.001820 -0.005113 
+0.002587 0.002410 -0.004114 -0.003553 0.001224 0.000488 
+-0.001012 -0.000100 0.001520 -0.000436 -0.000342 0.001308 
+-0.001092 0.003534 -0.002588 -0.003720 0.004773 -0.007302 
+-0.004300 -0.000111 -0.001809 -0.000404 0.004255 -0.002888 
+-0.000915 0.002976 -0.002078 -0.000074 0.003069 -0.004494 
+0.000701 0.001878 -0.007613 0.001542 0.000022 -0.008833 
+0.002739 -0.001493 -0.006583 0.004652 -0.002198 -0.005393 
+0.003614 -0.003027 -0.013565 -0.004364 -0.005061 -0.029060 
+0.005223 0.009235 0.003750 0.006107 0.005615 0.038057 
+1.018182 0.096970 5.551515 1.154812 0.000000 6.163180 
+1.096491 -0.048246 5.789474 0.935714 -0.007143 4.550000 
+0.006316 0.006807 0.018266 0.016158 0.005495 -0.010391 
+0.002262 -0.003581 -0.010902 0.014561 0.007404 -0.014807 
+0.005741 0.007312 -0.000752 0.000901 0.003290 -0.011268 
+-0.002485 0.001068 -0.005633 0.000497 -0.000787 0.000076 
+-0.003697 0.001429 0.005212 -0.000974 -0.005024 0.006826 
+-0.000118 -0.002036 0.001773 0.000847 0.003708 -0.003293 
+0.005598 0.005119 -0.008197 0.007004 0.004112 -0.003900 
+-0.001197 0.001227 0.000479 -0.003553 0.002622 -0.000135 
+-0.000563 0.002414 0.000413 0.000680 0.002088 -0.002388 
+0.000303 0.001724 -0.002825 0.000000 0.000945 -0.001417 
+-0.004602 -0.000085 0.001506 -0.003763 0.000391 0.000627 
+0.000594 0.000568 -0.000026 0.001759 0.003614 -0.002182 
+0.001310 0.002533 -0.001974 -0.000185 0.000299 -0.000077 
+-0.000997 0.000374 0.001001 -0.002341 0.000420 0.000480 
+-0.002642 0.000860 0.000496 0.002263 0.000128 -0.000690 
+0.000427 0.005085 -0.004231 0.001698 0.002973 -0.000512 
+-0.000498 -0.000628 0.002294 -0.005026 0.000739 0.002919 
+-0.002813 0.002978 -0.000537 0.000000 0.002097 -0.001210 
+0.000298 0.002290 -0.000339 0.002045 0.001576 0.000732 
+0.002677 0.000953 0.000045 0.002824 0.000611 -0.003285 
+0.003203 -0.001470 -0.003439 0.001293 0.001042 -0.001150 
+0.000761 0.001842 -0.001223 0.000337 -0.000517 0.000465 
+0.000515 0.001038 0.002855 -0.001752 -0.001083 0.000149 
+-0.001719 -0.001226 -0.000136 -0.000409 0.001040 0.000329 
+-0.000545 -0.000874 -0.002074 0.000920 0.000324 -0.008437 
+0.003768 0.002138 -0.005278 0.002712 -0.000873 0.000249 
+0.000956 -0.002063 -0.000302 0.000829 0.001084 -0.002805 
+-0.001900 0.003047 -0.001791 -0.004002 0.001486 0.001199 
+-0.000488 -0.000934 0.002521 -0.000144 -0.000349 -0.000876 
+-0.000371 0.001729 -0.005064 -0.000548 -0.001184 -0.003224 
+-0.004229 0.002419 -0.000596 -0.000160 0.000124 0.000288 
+0.001439 0.000872 -0.003497 0.000143 0.005286 -0.002571 
+-0.001570 0.005058 -0.008144 -0.000593 0.008532 -0.013789 
+0.001191 0.012056 -0.019823 -0.000947 0.010279 -0.020016 
+-0.014830 0.006329 -0.021632 0.021222 -0.002801 -0.056055 
+-0.017354 0.027301 -0.033876 0.011276 -0.001101 0.044736 
+1.134276 -0.349823 7.413427 1.183721 -0.362791 7.865116 
+1.168246 -0.331754 7.533175 1.029630 -0.229630 6.377778 
+0.002938 0.001819 0.028920 0.001361 -0.002259 -0.013618 
+0.000603 0.002714 0.001010 0.008799 0.003471 0.008751 
+0.015220 0.013061 -0.015438 0.020667 0.012133 -0.034654 
+-0.000249 0.012300 -0.008936 0.002470 -0.000997 0.004894 
+-0.001989 -0.004321 0.008439 -0.004383 -0.002114 0.005650 
+-0.003797 0.002685 0.001091 -0.001862 -0.000353 0.000339 
+-0.004482 0.000092 -0.003653 -0.007294 0.000924 -0.008956 
+-0.008135 0.004960 -0.003611 -0.000746 0.003438 -0.000180 
+0.001163 0.000980 -0.001888 0.000697 -0.001464 0.000560 
+0.001885 0.000184 0.003766 0.000691 0.001838 0.002694 
+-0.001763 0.001312 -0.000562 0.000568 0.001090 -0.000927 
+0.002649 0.000007 -0.000881 0.001550 0.003112 -0.004657 
+0.003318 0.005716 -0.003833 0.002506 0.000304 -0.004936 
+-0.000861 0.004520 -0.005532 0.002048 0.003279 -0.002579 
+0.001240 0.002293 -0.001079 -0.000730 0.000839 -0.000906 
+-0.002462 0.000742 -0.000972 0.000704 0.002288 -0.000943 
+0.004794 0.001905 0.000063 0.001972 0.004961 -0.000197 
+-0.003381 0.000223 -0.000810 -0.006400 -0.005200 0.003200 
+-0.007273 -0.003885 0.005784 -0.004876 0.000909 0.000992 
+-0.000123 0.002986 -0.005318 0.002558 0.004562 -0.006866 
+0.002530 0.003197 -0.004789 0.001623 -0.000091 -0.002454 
+-0.006483 -0.002910 0.002093 -0.004310 -0.002258 0.003079 
+-0.000897 0.002375 0.004380 -0.000154 0.003505 0.003216 
+0.002551 0.003396 0.002667 -0.001339 0.001339 -0.002283 
+-0.001156 0.004210 -0.006107 -0.001138 0.003884 -0.005290 
+0.002530 0.004105 -0.002796 0.000846 0.002134 0.003403 
+0.001257 -0.000665 -0.002816 -0.002070 0.002070 -0.003203 
+-0.001711 0.007309 0.000726 0.003717 0.005629 -0.004579 
+0.002095 -0.000646 -0.003246 0.002071 -0.002310 0.001817 
+0.002469 -0.002768 0.002309 -0.002323 -0.005614 0.000859 
+-0.003378 -0.000920 0.001738 0.000803 0.000168 -0.000626 
+0.003953 0.000159 -0.001195 0.001454 -0.001930 -0.000150 
+0.002827 0.001602 -0.005619 0.002854 0.000783 -0.002548 
+-0.003551 -0.003817 -0.000010 -0.008757 -0.005165 0.001806 
+-0.013206 -0.007520 -0.004342 -0.026067 -0.006007 -0.025969 
+-0.011756 0.002344 -0.023758 0.570312 0.195312 4.859375 
+0.907063 -0.200743 7.375465 0.936224 -0.329082 7.364796 
+0.888078 -0.282238 6.540146 0.778125 -0.059375 5.137500 
+0.003960 0.003060 0.032307 -0.000171 0.006067 -0.008549 
+0.000124 0.001752 -0.004057 -0.000217 -0.003001 0.008552 
+0.001200 0.000025 -0.004637 -0.009702 0.000719 -0.008719 
+-0.005443 -0.000197 -0.013977 -0.003263 -0.003042 0.007752 
+-0.000539 -0.007729 0.009430 0.003191 -0.001133 0.004726 
+0.000059 -0.001245 0.005309 -0.002294 -0.003465 0.010006 
+-0.005148 -0.001778 0.010800 -0.005171 -0.004594 0.002127 
+-0.004558 0.000900 -0.006610 -0.002779 0.008888 -0.006055 
+0.001045 0.007647 -0.007477 -0.001064 0.003194 -0.003178 
+0.000262 0.000473 0.001574 0.000715 0.000468 0.003630 
+0.001968 0.000844 0.000839 0.002109 0.006083 -0.004708 
+0.005735 0.008924 -0.007805 0.007140 0.008870 -0.000901 
+0.001581 0.000177 0.000733 0.001731 -0.000647 -0.003304 
+0.000815 0.000319 -0.003747 0.001561 0.001070 -0.002779 
+-0.001997 0.005655 -0.000997 -0.005267 0.001188 0.000525 
+-0.006005 -0.005406 0.003432 -0.000352 -0.007495 0.006237 
+-0.000762 0.001531 0.008780 -0.000377 0.003848 0.001018 
+-0.000148 0.001579 0.000056 -0.003885 -0.001028 0.004686 
+-0.007525 -0.001155 0.006040 -0.001856 -0.001922 0.005301 
+-0.002553 0.003806 -0.000433 0.001322 0.001382 0.000864 
+0.002668 -0.000719 -0.006266 0.000336 0.002677 -0.003814 
+0.006189 -0.000851 0.002360 0.003281 -0.004676 0.005068 
+0.004677 -0.003498 0.003993 0.002604 0.000365 -0.000502 
+0.001825 0.005289 -0.000760 -0.002377 0.000722 0.000009 
+-0.005755 0.000774 -0.005092 -0.003239 -0.001476 -0.003510 
+0.003041 0.002164 -0.001637 -0.000282 0.003443 0.001056 
+-0.000558 0.001116 0.004961 0.000923 0.002154 0.000000 
+-0.003301 -0.001750 0.002886 -0.001902 -0.002135 0.003349 
+0.000290 -0.002517 0.001081 0.000692 -0.002051 0.000455 
+-0.001514 0.001547 0.001712 -0.001016 -0.002967 0.001416 
+0.000921 0.001687 -0.004011 0.004931 0.004696 -0.001726 
+-0.000446 0.002736 0.001044 -0.002349 0.001764 -0.001237 
+0.002699 0.007133 -0.008868 -0.003031 -0.000947 -0.000264 
+-0.007854 -0.000365 0.000303 -0.014010 0.000033 0.004546 
+-0.023319 -0.008028 -0.001251 -0.034349 -0.010926 -0.017311 
+-0.015007 0.001717 -0.024523 0.010079 0.003354 0.045212 
+1.345133 0.274336 6.429204 1.311644 0.191781 5.866438 
+1.054744 0.251825 4.299270 0.003628 0.000207 0.022027 
+-0.003017 0.004065 0.001207 -0.002108 0.011671 -0.008003 
+-0.004420 0.001146 0.005336 -0.007250 -0.000553 -0.003944 
+-0.006081 -0.004854 -0.003500 -0.008038 0.000702 -0.001770 
+-0.008528 0.006970 0.001404 -0.001931 0.012705 0.001212 
+-0.003390 0.006722 -0.007548 -0.002460 0.000072 -0.003529 
+-0.000688 -0.002668 -0.001138 -0.002956 -0.004401 0.002559 
+-0.003286 -0.001011 0.000501 -0.002890 -0.000490 0.001379 
+-0.006998 -0.004661 0.003382 -0.011486 -0.002355 -0.001000 
+-0.001105 0.000080 0.001426 0.002633 0.002193 -0.005506 
+0.004168 0.006336 -0.005670 0.005645 0.002051 -0.005296 
+0.001883 0.000725 -0.004279 -0.000336 0.002965 -0.005166 
+0.000233 -0.001751 -0.007004 0.003045 -0.000341 -0.008478 
+-0.002440 0.002440 -0.006800 0.003633 0.007022 -0.003021 
+-0.003765 0.002510 0.001053 0.001037 0.003777 0.001335 
+0.000355 0.001393 -0.000221 0.001428 0.000925 -0.001489 
+-0.001452 0.003568 0.000864 -0.000885 0.006431 0.000850 
+0.001038 0.004563 0.001093 -0.000582 0.001007 0.000996 
+0.000756 -0.001308 -0.000826 0.001256 -0.001207 -0.001382 
+0.000110 -0.000082 0.000076 -0.000836 0.000696 0.002234 
+-0.000084 0.002521 0.000504 -0.001774 0.005537 -0.001568 
+0.000428 0.009475 -0.002973 0.001322 0.010608 -0.005981 
+0.003359 0.000190 -0.001063 0.001252 0.001125 0.000784 
+0.001802 0.001148 -0.003852 0.002582 0.007690 -0.005641 
+-0.002145 0.009771 -0.004184 -0.001879 0.005479 -0.000471 
+0.003548 0.001279 0.003203 0.000532 -0.003073 0.000594 
+-0.003525 -0.000821 0.005970 0.000176 0.001800 0.004976 
+-0.001876 -0.000891 -0.000422 -0.001875 0.001361 -0.002177 
+0.000384 0.002372 -0.005028 -0.000991 0.003335 -0.004898 
+0.000632 0.000134 -0.004102 -0.000715 -0.005499 -0.006023 
+-0.004014 -0.003254 -0.003995 0.003762 0.002703 -0.004247 
+-0.000384 0.004437 -0.002890 0.003074 0.004105 -0.004650 
+0.003111 0.007007 -0.005279 0.005960 0.000791 -0.004404 
+-0.004139 0.002326 -0.008593 -0.009638 0.003733 -0.008836 
+-0.014042 0.002462 -0.005140 -0.011901 0.003975 0.001777 
+-0.003796 0.000660 0.002411 0.004422 0.001592 -0.005873 
+0.001449 0.001781 -0.006598 -0.001696 -0.003470 -0.005834 
+0.004982 0.000731 0.011420 0.006704 0.001450 0.014637 
+0.005893 -0.000129 0.003564 0.002573 -0.004169 -0.013843 
+0.000469 -0.002893 -0.026126 -0.009050 -0.006966 -0.011299 
+-0.006799 0.001936 0.000507 -0.001462 -0.000513 -0.002200 
+-0.004209 -0.003590 -0.005228 -0.019965 -0.007955 0.002370 
+-0.033061 -0.003908 0.008631 -0.017512 0.012657 -0.002174 
+-0.000218 0.016298 -0.011394 0.004314 0.007848 -0.012985 
+0.002893 -0.000477 -0.000925 -0.001316 0.002962 0.000107 
+-0.004081 -0.001789 0.001314 -0.005173 -0.000832 0.000124 
+-0.002372 0.001810 -0.002055 0.002379 0.003388 0.002714 
+-0.003891 0.004978 -0.006906 0.008367 0.011235 -0.011093 
+0.002561 0.001097 -0.004696 -0.004649 -0.002368 0.002368 
+0.000329 -0.002807 0.000829 0.000783 0.003165 -0.005371 
+-0.003251 0.004116 -0.004607 0.003510 0.002184 -0.001206 
+-0.001984 -0.001890 0.000850 -0.005765 -0.003743 0.002022 
+-0.002577 -0.003084 0.000549 0.000682 -0.001680 -0.000997 
+0.001971 -0.000392 -0.001889 0.000014 -0.000192 -0.000332 
+-0.001957 0.000762 0.001351 -0.000672 0.001692 0.002369 
+0.000420 -0.000252 0.000504 0.002169 0.001986 -0.003614 
+0.002293 -0.000394 -0.001433 -0.001869 -0.002520 -0.003894 
+0.000050 -0.000922 -0.001129 0.000342 0.001650 0.000707 
+-0.001904 0.001428 0.003306 -0.002601 0.000793 -0.000049 
+-0.001871 0.003952 -0.002529 -0.001955 0.000642 -0.000475 
+-0.001585 -0.000279 -0.003518 -0.000961 0.001918 0.000234 
+0.001411 0.006633 0.003069 -0.000181 0.006126 0.001861 
+0.001635 0.008710 -0.000362 0.002595 0.007804 -0.003763 
+0.002915 0.001223 0.001348 -0.001340 0.005513 0.001736 
+-0.002885 0.003427 -0.000620 -0.003275 0.000697 0.004460 
+0.001745 -0.001486 0.001654 -0.000497 -0.001766 0.001047 
+-0.001773 0.000506 -0.002982 -0.004197 0.004676 -0.000552 
+-0.002847 0.002150 -0.000159 0.001232 -0.001140 -0.003594 
+0.003798 -0.005068 -0.011948 0.007919 0.015061 -0.014824 
+0.003827 0.016977 -0.022999 0.005611 0.011565 -0.017311 
+0.004748 0.002790 -0.008139 0.003027 0.001045 -0.005275 
+-0.000266 0.003406 -0.007668 -0.002592 -0.001872 -0.008257 
+-0.005302 0.000926 -0.001599 -0.002182 0.002600 -0.000641 
+-0.000809 0.003422 0.001082 -0.001249 0.001886 0.001149 
+0.001076 -0.001522 -0.003244 0.003391 0.000735 -0.007944 
+0.002287 0.004993 -0.010532 -0.005913 0.003530 -0.015013 
+0.006369 -0.008009 -0.006859 0.008251 0.010718 -0.017206 
+-0.004512 0.004660 -0.015674 -0.001595 -0.001804 -0.007808 
+0.001222 -0.000959 -0.002146 0.000634 -0.000258 -0.001223 
+-0.000758 0.000245 -0.002426 -0.001414 -0.000249 -0.005393 
+-0.004688 -0.001241 -0.004546 -0.003697 0.001483 -0.000773 
+0.003289 0.001390 -0.003512 0.009556 0.004311 -0.006169 
+0.011933 0.010683 -0.006977 0.010609 0.011405 -0.008472 
+0.006431 0.007061 -0.003494 0.003951 0.002811 -0.003485 
+0.006853 0.007821 -0.007262 0.002337 0.010942 -0.002177 
+0.005151 0.005244 0.002475 -0.002872 0.002781 -0.004626 
+0.001486 0.006832 -0.005820 -0.000766 0.003097 -0.002450 
+-0.003054 0.000481 0.000661 -0.001349 0.000712 0.000636 
+0.000723 0.000101 -0.004257 0.003862 0.006010 -0.004152 
+0.009408 0.005556 -0.002407 0.007041 0.007366 -0.001950 
+0.000355 0.005479 0.000265 -0.002811 0.001094 -0.000176 
+-0.001590 0.002001 0.000947 0.003175 0.000866 -0.002248 
+0.006327 0.005560 -0.009547 0.004683 0.000000 -0.007381 
+0.000176 0.000119 0.000612 -0.003488 -0.006085 0.005071 
+0.000647 -0.001326 0.000227 -0.000028 0.002628 0.000356 
+0.001235 0.004008 -0.004625 -0.001521 0.001906 -0.002016 
+-0.000077 0.000168 -0.000099 -0.001069 -0.000028 -0.001294 
+-0.001046 0.002870 -0.001146 -0.001540 0.004572 -0.000953 
+-0.001928 -0.003065 -0.002410 -0.005710 -0.002732 0.003467 
+-0.002546 -0.001278 0.000421 0.000337 -0.000670 0.000095 
+-0.000698 0.000667 -0.002496 0.000964 0.000877 -0.000920 
+0.000844 0.003202 0.001033 0.001196 0.003412 0.001206 
+-0.000251 0.001300 -0.000041 -0.000227 -0.002274 0.001271 
+0.000260 -0.000115 0.000850 -0.004287 0.003218 -0.000398 
+-0.006144 -0.001664 0.000388 -0.001007 0.002437 -0.001621 
+-0.000520 0.002566 0.001246 0.001324 -0.001195 -0.002243 
+-0.003803 0.005974 -0.011898 -0.007785 0.003110 -0.023121 
+-0.001294 0.003802 -0.024420 -0.003842 0.006524 -0.012936 
+-0.000793 0.001104 -0.002959 -0.000013 0.000483 0.001632 
+0.004159 0.001290 -0.002725 0.000074 -0.002266 -0.008916 
+-0.001667 0.001667 -0.005897 -0.000260 0.001425 -0.001763 
+0.000728 0.001934 -0.002383 0.004195 0.003380 -0.004859 
+0.006145 0.001109 -0.001124 0.001284 0.002840 -0.000988 
+0.001617 0.000619 -0.003300 0.001501 -0.000340 -0.006031 
+0.000291 -0.000796 -0.009709 -0.002482 -0.000144 -0.009454 
+-0.003434 0.001168 -0.007267 -0.002795 0.000835 -0.007040 
+-0.000543 0.000668 -0.007600 0.000852 0.002715 -0.005739 
+0.002112 0.002191 -0.002168 0.000112 0.000120 -0.004179 
+-0.002934 -0.002757 -0.004349 -0.004669 0.000418 -0.002810 
+0.000551 0.003481 -0.003531 0.007161 0.011748 -0.009355 
+0.018792 0.017717 -0.009785 0.019115 0.024880 -0.011334 
+0.016315 0.021446 -0.011749 0.000840 0.000670 -0.000050 
+-0.001709 0.006641 0.003848 0.006657 0.018792 -0.008967 
+-0.002671 0.013639 -0.004873 -0.002792 0.004605 -0.006075 
+0.002553 0.000267 -0.004914 0.000710 -0.000705 -0.000590 
+-0.001815 0.001344 -0.001976 -0.002745 -0.000333 -0.000080 
+-0.002010 0.002832 0.003625 -0.004884 0.000993 0.002765 
+-0.001839 0.001553 0.002698 -0.002087 -0.001890 0.001284 
+0.001440 -0.000689 -0.000069 0.002557 0.001792 0.000753 
+0.001902 0.003684 -0.000522 0.003333 0.003744 -0.000749 
+0.004969 -0.000572 -0.001566 0.003827 -0.000791 -0.002935 
+0.001049 0.000466 -0.001077 -0.001403 -0.002956 0.000802 
+-0.002216 -0.003224 0.000201 0.000000 0.001163 -0.001357 
+-0.000080 0.000000 -0.004960 -0.003360 0.001200 0.000000 
+-0.005206 0.000401 -0.000406 -0.003232 0.000293 -0.001119 
+-0.000906 -0.001769 -0.001014 -0.001026 -0.000769 0.000000 
+0.002551 -0.000113 -0.004932 0.000642 0.003582 -0.001838 
+-0.001513 0.002899 -0.003620 -0.002373 0.002913 -0.003322 
+0.003672 0.001484 -0.001094 0.003822 0.001341 -0.002258 
+0.001044 -0.000444 -0.001335 -0.001393 -0.000700 -0.003499 
+-0.001721 -0.000325 -0.006508 -0.003376 0.000563 -0.005902 
+-0.000184 0.000515 0.000385 -0.005262 -0.003042 0.002058 
+-0.001111 0.000478 0.001240 -0.000033 0.000513 -0.003458 
+-0.001258 0.001902 -0.002844 0.002313 0.003818 0.000780 
+0.002342 0.003210 -0.007018 -0.003668 0.005798 -0.007850 
+-0.003391 0.005492 -0.004349 -0.000537 0.002223 -0.000795 
+0.000757 -0.000698 -0.000589 0.000580 0.001525 -0.000692 
+-0.000111 0.002645 -0.004518 -0.002768 0.000890 -0.006573 
+-0.001169 -0.001432 -0.006578 0.000370 0.001044 -0.004785 
+0.003269 0.003170 -0.001833 0.003226 0.004447 -0.001920 
+0.002501 0.003021 -0.002081 0.000239 0.004667 -0.000160 
+0.002471 0.002119 0.000712 0.002474 0.000255 0.000060 
+0.002906 -0.000054 0.000500 0.001723 -0.000235 0.001006 
+0.001007 0.000799 -0.000295 0.001743 0.002077 -0.003448 
+0.001278 -0.000608 -0.003524 -0.000066 -0.000903 -0.002613 
+0.002864 -0.000865 -0.003536 0.005138 0.002930 -0.005226 
+-0.000646 0.000242 -0.002612 -0.005380 -0.001977 0.000834 
+-0.004564 -0.000595 0.002019 0.006299 0.006742 -0.003843 
+0.011886 0.015721 -0.007458 0.010551 0.013824 0.006591 
+0.025123 0.017052 -0.015764 0.020564 0.020622 -0.017446 
+0.001477 0.004354 -0.004431 -0.001811 0.003121 -0.001246 
+0.002130 0.006598 -0.007186 0.004269 0.007767 -0.002332 
+0.003924 0.003550 -0.002614 0.004103 0.007478 -0.000771 
+0.000536 0.007279 -0.002145 0.004184 0.001847 -0.000368 
+0.000112 -0.001353 -0.001117 -0.000220 -0.001061 -0.000520 
+-0.000516 0.001927 -0.000564 -0.000451 0.000214 0.000928 
+0.001390 0.002162 0.000830 0.004627 0.002767 -0.000707 
+0.007022 0.002535 0.000711 0.005469 -0.000260 0.002747 
+0.003050 -0.000710 0.003437 0.000986 -0.000336 -0.000308 
+0.001587 0.005662 0.000595 -0.001387 0.001956 -0.000644 
+-0.002754 -0.004166 -0.001373 -0.007015 -0.009442 0.000910 
+-0.004471 -0.007392 -0.002138 -0.001624 -0.000760 -0.003378 
+-0.001027 -0.000600 -0.001302 0.005415 0.004505 -0.004175 
+0.001421 0.003455 -0.001805 -0.000932 0.004029 -0.001549 
+-0.000392 -0.000036 0.000036 -0.003066 0.000399 -0.000801 
+-0.001563 -0.001350 -0.001409 -0.001173 -0.000453 -0.000689 
+0.000757 0.001926 -0.002008 0.002265 0.002163 -0.000051 
+-0.000090 -0.000233 -0.000743 -0.000280 0.000265 0.000121 
+0.002439 0.001863 -0.000502 0.001562 0.003000 -0.004685 
+-0.000569 0.001516 -0.004177 -0.001218 0.000514 -0.000799 
+0.000341 0.001045 0.003024 0.002562 -0.003173 0.001261 
+-0.001957 0.000886 -0.002226 -0.000734 0.007648 -0.010442 
+-0.001035 0.004425 -0.011816 -0.001043 0.001231 -0.003964 
+0.000663 -0.003004 0.001644 -0.006148 -0.006074 0.004333 
+-0.006500 0.000704 0.003146 -0.000435 0.002081 -0.000559 
+0.004385 0.000410 -0.003566 -0.001205 -0.000230 -0.007174 
+-0.001627 -0.000577 -0.005223 -0.001488 -0.001709 -0.000795 
+-0.004088 -0.001869 0.000395 -0.002768 -0.001872 -0.001205 
+-0.000089 -0.000502 -0.000022 0.002109 0.002219 -0.000526 
+0.001266 0.003371 0.001522 0.000075 0.000723 0.000616 
+-0.000757 0.000297 -0.000287 -0.005701 -0.001114 0.002992 
+-0.006270 -0.001492 0.000597 -0.000201 0.002384 -0.000537 
+-0.001684 0.002133 -0.006179 -0.002875 0.000780 -0.002429 
+0.002303 0.000355 -0.000950 0.001694 0.000126 -0.002264 
+0.001579 0.001159 -0.001547 0.002045 0.001046 0.000747 
+-0.000438 0.003429 0.000426 0.002240 0.002610 0.000845 
+0.004294 0.005462 -0.003024 0.008936 0.011134 -0.003692 
+0.018730 0.020549 -0.006767 2.608187 2.543860 -1.777778 
+0.017403 0.021755 -0.015216 0.002154 0.007668 -0.004547 
+-0.002392 0.004366 -0.001951 -0.000633 0.004029 -0.004258 
+-0.001699 0.002560 -0.001275 -0.000646 0.001946 -0.001586 
+0.000276 0.001458 -0.000236 0.001112 -0.000499 0.000153 
+0.001510 -0.001997 -0.001266 -0.000670 0.000424 -0.003774 
+-0.002666 0.004303 -0.004042 0.000809 0.005143 -0.000108 
+0.002063 0.002063 -0.000849 0.002218 -0.000412 -0.000516 
+0.003906 -0.001614 0.001941 0.001992 -0.000491 0.001177 
+0.001603 0.000662 0.000196 0.002354 0.003626 -0.002895 
+0.000915 0.004580 -0.003048 0.000606 0.002011 -0.002217 
+0.000629 0.000458 -0.000055 -0.001875 -0.000850 -0.001093 
+-0.001929 -0.000666 -0.001891 -0.000411 -0.001476 -0.001573 
+-0.000238 0.000048 -0.000826 -0.003309 0.000694 -0.001760 
+-0.002959 -0.008878 -0.000894 -0.002169 0.002849 0.001149 
+-0.003386 0.003150 0.003386 0.000553 0.003807 0.002642 
+0.004435 0.005226 -0.000791 0.002823 0.006519 0.001591 
+0.002648 0.005117 0.001369 -0.000545 0.004208 0.000312 
+0.000571 0.004003 -0.003317 -0.001596 0.000964 -0.000727 
+-0.001409 0.000282 -0.001973 -0.004098 0.000438 0.002191 
+-0.004369 -0.000841 0.000400 0.001374 -0.000927 0.001800 
+0.002446 -0.001390 0.004834 -0.003366 -0.000128 0.004124 
+-0.011627 0.001314 -0.002062 -0.012290 0.007476 -0.013691 
+-0.008516 0.008539 -0.012304 -0.004701 0.005893 -0.005759 
+-0.003901 0.000317 -0.000546 -0.001258 0.001395 0.000880 
+-0.002173 -0.003031 0.002970 0.000414 -0.002927 0.000625 
+0.000165 -0.000924 -0.000470 -0.000477 0.001740 0.000532 
+-0.003427 0.001733 0.000886 -0.002953 -0.000354 0.001654 
+-0.000128 -0.000286 -0.000092 -0.000374 0.000442 -0.000068 
+-0.000408 0.003636 -0.000082 -0.003284 0.002873 -0.003538 
+-0.004221 0.003613 -0.000616 -0.004015 0.003064 -0.000494 
+-0.001819 0.002357 -0.003321 -0.003111 -0.000720 -0.002543 
+-0.002649 -0.001616 -0.002993 -0.000220 -0.000110 -0.004173 
+-0.001512 0.002918 -0.004484 -0.002377 0.000534 -0.005434 
+-0.004609 0.001791 -0.002897 -0.003765 0.001321 0.001915 
+-0.005189 -0.001185 0.002298 -0.002362 0.000315 0.003465 
+-0.000867 -0.000187 0.001613 -0.000213 -0.000111 0.000098 
+-0.003326 -0.000677 -0.001635 -0.004403 -0.001023 -0.000075 
+0.001408 0.002074 -0.001288 0.009055 0.008576 -0.005352 
+0.011018 0.012216 -0.007116 0.007207 0.010989 -0.008798 
+-0.001500 -0.000541 -0.003942 0.002896 0.006448 -0.004080 
+-0.000975 0.001059 -0.000292 0.000091 -0.000818 -0.001202 
+0.000229 -0.002971 -0.001221 -0.000522 -0.001313 0.002627 
+0.000456 -0.002214 0.002736 -0.004771 0.002963 -0.000362 
+0.000667 0.000799 0.000365 0.000063 0.003108 -0.006153 
+0.000230 -0.000749 0.000121 -0.000216 -0.003126 -0.001357 
+-0.000874 0.001169 -0.000078 0.001930 0.004748 -0.002003 
+0.004184 0.004231 -0.005924 -0.001050 0.008214 -0.004202 
+0.001496 0.005571 -0.005406 -0.001434 0.001792 -0.002970 
+-0.001890 0.002463 -0.000751 -0.002947 0.002348 0.000426 
+-0.001164 -0.000390 -0.001169 -0.001282 0.006154 -0.005043 
+-0.002589 0.003752 -0.001351 0.001567 0.003669 0.001196 
+0.002766 0.001109 -0.000137 -0.001129 -0.000323 0.001371 
+0.000759 0.002381 -0.000324 -0.001694 0.002174 0.001175 
+-0.002130 0.000853 0.000305 -0.000625 0.000352 0.001914 
+-0.002429 -0.002700 0.002158 0.000742 -0.001567 0.001682 
+-0.000478 0.000926 0.000601 -0.000160 0.000021 0.000994 
+0.000000 -0.002131 0.002787 0.000939 -0.002000 0.002582 
+-0.002703 0.000458 0.003573 0.001261 -0.000757 0.002087 
+0.002759 -0.003622 0.002247 -0.003502 -0.000042 -0.002971 
+-0.006564 0.011070 -0.016775 -0.013378 0.016678 -0.021248 
+-0.008907 0.014930 -0.021008 -0.004119 0.013293 -0.011186 
+-0.001777 0.003110 -0.002676 0.000012 -0.003239 -0.000751 
+-0.000571 -0.001501 -0.000531 -0.002560 0.002898 -0.002375 
+-0.000148 0.000559 -0.004059 -0.002059 0.002350 0.001542 
+-0.000999 0.004937 -0.001479 -0.001001 0.003209 -0.003230 
+-0.002344 -0.000028 -0.002538 -0.004285 -0.002014 -0.000284 
+-0.004531 -0.000820 0.000820 -0.002093 -0.001380 -0.002553 
+0.001193 0.001988 -0.004080 0.006545 0.002917 -0.000505 
+0.004872 0.003649 0.001892 0.002729 0.002843 0.001690 
+0.001210 0.003073 0.000559 -0.000777 0.002313 -0.000307 
+-0.001402 0.001803 0.000175 -0.003144 0.000135 -0.002006 
+-0.001820 0.000761 -0.005297 -0.001231 0.002155 -0.003694 
+-0.001753 0.002431 -0.001554 -0.001326 0.001379 -0.001071 
+-0.002080 -0.000480 -0.001760 -0.003548 0.000000 -0.002016 
+-0.003135 0.000284 -0.003985 -0.003569 -0.001150 -0.002735 
+-0.005542 0.000079 -0.001291 -0.002613 0.003007 0.000809 
+0.003769 0.006873 -0.001027 0.006643 0.010131 -0.002400 
+0.003567 0.008720 -0.003841 -0.001593 0.001013 -0.001288 
+-0.001272 -0.005668 -0.000646 0.000341 -0.002559 0.002266 
+-0.000235 0.001598 0.000005 0.000140 0.002226 -0.000177 
+-0.001100 -0.001000 -0.000437 -0.002068 -0.002796 0.001264 
+-0.001221 -0.001832 0.001221 0.000122 -0.000510 0.000277 
+0.000114 -0.000972 0.000176 -0.000982 -0.001833 0.000095 
+-0.001610 -0.000154 -0.000171 -0.001108 0.003862 -0.001877 
+0.001837 0.002922 -0.006176 -0.003587 0.000325 -0.001468 
+-0.002451 0.003010 -0.004204 -0.001378 0.003301 -0.002420 
+-0.001827 0.005041 -0.001438 0.003223 0.008093 -0.000609 
+0.000562 0.002911 -0.007134 -0.001317 -0.000383 -0.002047 
+-0.001331 0.001263 0.000096 0.000395 0.005357 -0.003005 
+0.004958 0.003283 -0.004826 0.000367 0.003990 0.001365 
+-0.002496 -0.001349 0.006240 0.000589 0.002062 0.001923 
+0.000672 0.000269 -0.003360 -0.000980 0.000949 -0.002473 
+0.000274 -0.000095 0.000214 -0.001099 0.001832 0.002380 
+0.000735 0.006514 -0.000457 0.000546 0.008166 -0.005774 
+0.004490 0.006601 -0.003787 -0.000023 0.000879 0.000684 
+-0.001709 0.000417 -0.000554 0.001427 -0.000645 0.001539 
+0.004588 -0.003930 0.004317 0.001127 -0.003196 0.002873 
+-0.005906 0.007913 -0.007212 -0.011080 0.014698 -0.013300 
+-0.012186 0.015943 -0.013991 -0.006975 0.012188 -0.011853 
+-0.001659 0.002712 -0.007145 -0.000543 0.000058 -0.003428 
+0.000536 -0.001913 -0.003959 -0.000651 0.001546 -0.000529 
+-0.003598 -0.000631 -0.001298 -0.001157 -0.003636 -0.001653 
+0.000026 -0.000424 0.000419 -0.004636 0.000510 0.000517 
+-0.000248 0.000398 -0.000560 -0.000059 -0.000781 -0.000355 
+0.002756 0.000632 -0.001321 0.002713 0.002481 -0.002171 
+0.002329 0.002558 -0.003473 0.001791 0.000999 -0.000138 
+-0.001761 0.000238 -0.000074 -0.002192 -0.001863 -0.004822 
+0.000614 0.005698 -0.005493 0.003874 0.000265 -0.000938 
+0.001760 0.003036 0.001687 -0.002723 0.001432 0.000449 
+-0.003059 0.003319 0.001040 -0.008450 -0.000853 0.003798 
+-0.006819 0.002652 0.001299 -0.003516 0.003516 0.001172 
+0.001495 0.000889 0.002336 -0.005899 -0.002257 0.006361 
+0.000292 0.001234 0.001066 -0.000038 0.003620 -0.003523 
+-0.000371 0.003333 -0.002322 -0.001608 0.001179 0.002153 
+-0.002260 0.000127 0.001345 0.001725 0.001656 -0.000937 
+0.003116 0.003270 -0.003022 0.001155 -0.000215 0.002419 
+-0.003350 -0.001896 0.004708 -0.002045 -0.001877 0.001701 
+0.001096 0.000097 -0.002435 0.001429 0.000982 -0.004466 
+0.001326 0.000526 -0.001768 0.001351 0.000540 0.001891 
+0.003692 -0.000726 0.000605 0.002977 0.002061 -0.002366 
+-0.002828 0.001414 -0.001414 -0.002605 0.004545 -0.000297 
+-0.001880 0.002963 -0.000376 -0.001002 0.000735 -0.000167 
+-0.000876 0.001080 -0.000540 -0.002667 -0.001607 -0.002134 
+-0.001136 -0.003409 -0.000379 -0.000604 -0.003622 0.003137 
+0.000527 0.000685 0.000263 -0.000728 0.006246 -0.003305 
+0.001061 0.006224 -0.002518 -0.000914 0.002556 -0.001549 
+-0.000467 -0.002601 0.000732 0.001130 -0.001216 0.002133 
+-0.004087 -0.000871 0.004288 -0.000064 0.003225 0.002775 
+0.002482 0.001576 0.003756 0.002408 0.001631 0.002455 
+0.002164 0.000721 0.003197 0.001707 0.001763 0.002367 
+-0.001016 0.002037 0.001873 -0.000680 0.000075 -0.000763 
+-0.002666 0.003081 -0.001696 -0.001151 0.001151 -0.001508 
+0.001237 0.001166 0.001396 0.000307 0.001507 0.003852 
+-0.000215 0.001772 0.000687 -0.001339 0.001211 -0.000658 
+0.000688 -0.001812 -0.000139 0.000237 -0.001655 -0.000735 
+-0.003938 0.006049 -0.003550 -0.004695 0.010678 -0.008193 
+-0.005332 0.008371 -0.010740 -0.005295 0.003534 -0.005309 
+-0.002938 -0.000876 -0.002345 -0.000037 -0.000671 0.003130 
+-0.000826 -0.000183 0.000223 0.001817 0.004546 -0.000544 
+0.002125 0.006666 0.001213 0.001919 0.004357 -0.000075 
+0.000256 -0.000247 0.000638 -0.000979 -0.000449 0.001673 
+-0.000518 0.000257 -0.000514 -0.002205 0.002992 -0.003228 
+-0.003462 0.004130 -0.005324 -0.002449 0.005014 -0.000855 
+0.001058 0.004363 -0.001425 0.004796 0.004887 0.000033 
+0.005138 0.003942 0.003106 0.001630 -0.000543 -0.002047 
+0.001417 0.006662 -0.002855 -0.001732 0.003666 -0.002750 
+-0.004574 0.000836 0.000615 -0.004631 0.000604 -0.001342 
+-0.005763 0.000565 0.007798 -0.001467 0.003867 0.000933 
+-0.003950 0.003538 -0.002702 -0.003037 0.003296 0.000065 
+-0.000614 0.003686 -0.003306 -0.000989 0.002080 -0.001672 
+0.000746 0.001379 -0.003578 0.003138 0.001342 -0.002609 
+0.002393 0.000022 -0.001462 -0.000567 0.001836 -0.001734 
+0.001671 0.002119 -0.002082 0.000636 0.000168 -0.001906 
+-0.000838 -0.003889 -0.001417 -0.003047 -0.003041 -0.000547 
+-0.001522 -0.001349 0.001489 -0.000740 0.000892 0.001612 
+-0.001148 0.001296 0.001823 -0.001094 0.001128 0.001326 
+0.000341 0.002189 0.000061 0.001096 0.004230 -0.002367 
+0.001019 0.004821 -0.002815 0.000368 0.002405 -0.000601 
+0.000221 -0.001801 -0.001801 -0.001029 -0.002232 -0.000812 
+-0.004203 -0.001946 -0.000627 -0.007753 -0.000815 -0.001306 
+-0.007826 -0.001957 -0.001377 -0.004256 -0.000158 0.000495 
+0.002396 0.000209 0.001551 0.002137 0.004337 0.001786 
+0.001052 0.008576 -0.003284 0.004089 0.009478 -0.007990 
+-0.003630 0.004372 -0.003851 -0.000786 0.001167 -0.000542 
+0.000349 -0.001046 0.000697 0.000771 -0.000964 0.000193 
+-0.002041 -0.004491 -0.003469 -0.000601 -0.005745 -0.001707 
+-0.005774 -0.000272 0.004144 -0.003427 -0.001954 0.001269 
+-0.001299 -0.000295 0.003483 -0.000215 0.001471 0.003696 
+-0.002273 0.003376 0.002205 -0.003165 0.004849 0.000418 
+-0.002161 0.002733 0.000332 0.001084 0.000992 -0.000813 
+-0.000140 0.000654 0.000897 -0.002356 0.001379 0.004402 
+0.001912 0.001215 0.006994 0.005480 -0.001477 0.006096 
+0.004284 -0.002529 -0.000266 -0.000414 0.004178 -0.003365 
+-0.003884 0.008730 -0.002100 -0.001823 0.006192 0.001845 
+-0.000944 -0.000315 0.002823 -0.001057 -0.004081 0.000816 
+-0.001154 -0.003145 0.000266 -0.001030 -0.000943 -0.000574 
+-0.001174 0.001495 -0.000712 0.000240 0.003459 -0.002992 
+-0.001641 0.001749 -0.004126 -0.003168 0.000264 -0.003621 
+-0.001956 -0.001548 -0.001415 0.000321 -0.000143 0.000144 
+0.001636 -0.000193 0.000979 0.002633 0.000008 0.000814 
+0.000478 0.000338 -0.000137 -0.001105 0.001496 0.000414 
+-0.002108 0.003955 0.000336 -0.001513 0.004780 0.000456 
+0.000154 0.003472 -0.001488 0.000455 0.001800 -0.003751 
+-0.000789 0.003393 -0.005878 -0.002901 0.001329 0.000532 
+-0.001383 0.000396 0.001012 -0.001781 -0.001656 0.001982 
+-0.001532 -0.001266 0.004431 -0.003653 -0.001487 0.002538 
+-0.002076 -0.001584 0.001051 -0.000174 0.000289 -0.000246 
+-0.000212 0.001751 -0.000597 -0.001528 0.000335 0.000174 
+-0.000161 -0.000697 0.001162 0.002523 0.002398 0.001314 
+0.003719 0.004513 -0.000683 0.001669 0.003460 -0.002380 
+0.001211 -0.000231 -0.001680 -0.000227 -0.000914 -0.001720 
+-0.000454 -0.000337 -0.001110 0.000266 0.000161 0.000067 
+0.001875 0.000563 -0.001565 0.002102 0.003238 -0.003198 
+0.000974 0.006270 -0.004157 0.000709 0.006814 -0.003453 
+0.001582 0.002374 0.000159 0.000471 0.000003 -0.000374 
+0.001259 -0.000446 -0.000101 0.000531 0.000084 0.000419 
+0.002006 0.002142 -0.000400 0.000766 0.002343 -0.000745 
+-0.001845 0.002511 0.000153 -0.001111 0.002087 0.000956 
+-0.004035 -0.000325 -0.001067 -0.004677 -0.007244 0.001112 
+0.001049 -0.002675 0.002325 0.001002 0.001423 -0.000842 
+0.003002 0.002080 0.000724 0.001071 -0.001703 0.002829 
+-0.000785 -0.001272 0.005684 -0.002647 -0.001867 0.005448 
+-0.000911 -0.000883 0.004793 0.000470 -0.000470 0.002564 
+0.000353 -0.004167 0.001588 -0.000175 -0.000539 0.001635 
+-0.000384 0.000333 0.001683 -0.000687 0.000727 0.001608 
+-0.001394 0.003198 0.001959 -0.002534 0.007763 0.002161 
+0.002779 0.007345 0.001588 -0.000096 0.003817 -0.000208 
+-0.001050 -0.000338 -0.000546 -0.000560 0.001974 -0.000546 
+-0.000967 0.006046 -0.001165 -0.001048 0.005884 -0.004373 
+-0.000228 0.003528 0.001827 0.003718 0.000380 0.004734 
+0.000453 0.000031 -0.000065 -0.000190 0.003388 -0.004772 
+-0.001966 0.005719 -0.006613 -0.003034 0.002746 -0.005417 
+0.004239 0.003781 -0.006767 -0.000973 0.003811 -0.005645 
+-0.001937 0.003283 -0.002322 0.002663 0.004202 -0.001961 
+0.001020 0.003020 -0.004767 -0.001538 0.000770 -0.003583 
+-0.002108 -0.001696 -0.002326 -0.003056 -0.003695 -0.001912 
+-0.005234 -0.003312 -0.000588 -0.004809 -0.001177 -0.000107 
+-0.002992 0.002537 -0.001215 -0.001295 0.004971 -0.003944 
+-0.001194 0.003209 0.000000 -0.002210 -0.000442 -0.002537 
+-0.002535 -0.001558 -0.000188 -0.000606 0.000135 0.001907 
+-0.001686 0.002951 0.002602 0.002502 0.002164 0.003989 
+-0.000934 0.007655 -0.000092 -0.001409 0.005137 -0.000909 
+-0.000168 -0.000223 -0.000227 -0.000411 -0.001448 0.002248 
+-0.000421 0.000000 0.001264 0.002077 0.002082 -0.002071 
+0.005036 0.002704 -0.002146 -0.001600 0.003200 -0.001600 
+0.003024 0.003288 0.000528 -0.000935 0.001789 -0.002642 
+0.002458 0.003023 -0.001096 0.004765 0.001662 -0.001865 
+0.001939 0.001129 -0.005331 -0.001583 0.002094 -0.003073 
+0.010252 0.003306 -0.003491 0.001754 0.006740 -0.007110 
+-0.000332 0.002771 -0.002223 -0.003856 -0.004036 -0.001583 
+-0.007974 -0.007565 0.004470 -0.002956 -0.005489 0.002510 
+-0.000164 -0.001063 -0.000407 0.000977 0.001118 -0.000348 
+-0.003175 0.002798 0.000605 -0.003876 0.001936 0.002420 
+-0.000819 0.000875 0.002159 -0.000554 0.000738 -0.002385 
+0.001644 -0.000252 -0.006709 0.004593 0.005289 -0.001763 
+0.000000 0.002068 0.001241 0.000236 -0.000311 0.000146 
+-0.004821 -0.002212 0.007406 -0.001425 -0.001105 0.005656 
+-0.001242 0.001656 0.000070 0.001659 0.002152 -0.001502 
+0.001984 0.003268 -0.001631 0.000439 0.000666 -0.000590 
+-0.000113 -0.001256 -0.000060 0.002542 -0.001017 0.000339 
+0.005079 -0.000666 0.002137 0.004325 -0.000372 0.002872 
+-0.000496 0.000029 0.000049 0.000367 -0.000183 -0.000500 
+0.003015 -0.001037 -0.001867 0.007329 0.002558 -0.003067 
+0.005277 0.006385 -0.000812 0.000021 0.006100 -0.000604 
+-0.001880 0.004436 0.000000 0.000051 0.003499 -0.003295 
+-0.000273 0.002186 -0.005600 0.001847 0.001927 -0.002428 
+-0.001050 -0.000233 0.001270 -0.001563 0.003859 0.001324 
+-0.002602 0.006145 -0.000730 -0.004303 0.005190 -0.002825 
+-0.003691 -0.001653 0.001326 0.000688 -0.006084 0.001921 
+0.000448 -0.002860 0.000377 0.001351 0.003868 -0.002177 
+0.001073 0.001000 0.002488 0.000000 0.006692 -0.002615 
+0.008359 -0.000047 -0.000094 0.003657 -0.000289 0.000428 
+0.003380 0.001276 -0.001466 -0.002618 0.004266 -0.004137 
+-0.002624 0.000039 -0.003421 -0.000716 0.001380 -0.003919 
+-0.000813 0.002193 -0.002591 0.000144 0.002756 -0.003560 
+0.002941 0.001342 -0.003691 0.002035 0.003546 -0.001554 
+0.000686 0.000923 -0.001143 0.002564 0.001095 -0.001380 
+0.000545 0.001422 0.000679 -0.000373 0.002049 -0.005649 
+0.001980 0.001080 -0.001102 -0.001972 0.000082 -0.000976 
+-0.000302 0.000086 -0.001144 -0.002419 -0.001039 -0.001617 
+-0.003870 0.001922 -0.003256 0.000236 0.004173 -0.001260 
+0.002444 0.001053 0.000296 0.003333 0.001200 -0.002701 
+0.003629 0.001452 -0.001129 -0.000414 -0.000196 0.000126 
+-0.005144 -0.000472 0.001514 -0.005327 -0.000761 0.000635 
+-0.000210 -0.000219 -0.001772 0.000379 -0.000568 -0.004921 
+0.001275 -0.000261 -0.005221 0.001095 -0.001652 -0.002072 
+0.000144 0.000014 0.000477 -0.000052 0.000556 -0.000645 
+-0.000957 0.002714 -0.001887 0.001490 0.004405 0.001639 
+0.005817 0.004573 -0.000632 0.001504 0.002462 -0.000207 
+-0.001312 0.000489 0.002157 -0.001917 -0.000157 0.003199 
+-0.002646 -0.001323 0.001923 -0.002479 0.000085 0.002521 
+-0.000351 -0.000640 0.000413 0.000252 0.000626 -0.001140 
+0.001187 0.001295 -0.001187 0.000148 -0.000362 0.000066 
+-0.002792 -0.004617 -0.000437 -0.005000 -0.007176 0.001196 
+-0.002383 -0.003908 0.004123 0.000103 -0.000206 0.000000 
+-0.000365 -0.000438 -0.000438 -0.000214 0.000027 -0.000615 
+-0.001145 -0.000850 0.001587 -0.002036 -0.000127 0.003079 
+-0.002610 0.000033 0.004516 -0.003382 0.001407 0.004951 
+-0.001713 -0.000762 -0.000076 0.000575 -0.000286 0.001263 
+0.002743 -0.002914 0.002229 -0.000699 -0.000538 -0.000188 
+-0.000461 -0.002981 -0.002434 0.000923 0.001385 -0.007846 
+0.001856 0.005883 -0.006916 0.000150 0.003609 -0.003158 
+-0.003358 -0.000547 0.000547 0.000599 -0.001364 0.003706 
+0.000687 -0.000746 0.003725 -0.001401 -0.000186 0.000715 
+0.001649 0.004332 -0.000848 0.000615 0.004850 0.003155 
+-0.000935 0.005804 0.002654 -0.001185 0.004412 0.001416 
+0.001123 0.000000 -0.001310 0.000596 -0.003552 -0.000229 
+0.000102 -0.002584 0.002015 0.000316 0.000997 0.002237 
+-0.000214 0.001506 0.001973 0.000037 0.003332 0.001355 
+0.001797 0.000859 -0.002734 -0.001395 0.000341 -0.000795 
+-0.001034 0.000171 0.000186 -0.000242 0.000048 -0.000866 
+0.003712 0.001519 -0.002868 0.004397 0.004142 -0.004821 
+0.002478 0.004449 -0.003845 0.001333 0.004274 0.000667 
+-0.001244 0.004324 0.001185 -0.001183 0.003516 -0.002196 
+0.003918 0.002388 -0.003918 0.001325 -0.003021 -0.003145 
+0.000982 0.000035 -0.004101 -0.000441 0.003066 -0.000874 
+-0.001294 0.003147 0.000956 0.000314 0.000915 0.000301 
+-0.000820 -0.000902 -0.000902 -0.000457 0.000051 0.000173 
+-0.000714 0.000804 0.002340 -0.000841 0.000646 0.002057 
+0.000076 0.000340 0.000415 0.000818 0.000545 -0.000273 
+0.001514 -0.000052 -0.000714 0.002347 -0.001148 -0.000657 
+0.001595 -0.000676 -0.001113 -0.001039 0.001845 -0.001685 
+-0.000444 -0.000267 -0.000262 -0.004303 0.002701 0.005283 
+0.000795 0.001148 0.003064 -0.000393 -0.001633 0.000938 
+0.000295 0.000948 -0.001549 0.000526 0.000714 -0.003872 
+-0.000219 0.000451 -0.000642 -0.000076 0.000879 0.000308 
+-0.009295 -0.000745 0.002213 -0.008240 -0.002558 0.004961 
+-0.004374 -0.000722 0.004175 -0.000694 0.001816 0.002610 
+0.002214 0.002378 0.000560 0.002031 -0.000508 -0.001523 
+0.001969 0.003858 -0.000945 0.001102 0.004506 -0.002103 
+0.005097 0.004637 -0.001479 0.002566 0.000804 0.000429 
+-0.001526 -0.000663 -0.001426 -0.000798 -0.000325 -0.000404 
+-0.002313 -0.000274 0.003128 -0.001957 0.001159 0.001957 
+0.000329 0.001431 0.000070 0.000086 -0.000214 0.000029 
+-0.000067 -0.000100 -0.001594 0.000857 0.000809 -0.000734 
+0.001540 0.003121 -0.002663 0.000916 0.003861 -0.006022 
+0.000898 0.002456 -0.006288 0.001094 0.003072 -0.001907 
+0.001728 0.003096 -0.000156 0.000895 0.003220 -0.000321 
+0.005270 0.000674 -0.003878 0.001196 0.000836 -0.004125 
+0.002855 0.003567 0.001308 0.002349 0.004979 0.000360 
+0.006190 0.003119 -0.000666 0.003568 0.003231 -0.009476 
+0.010455 0.002936 -0.003568 0.006666 -0.000466 -0.002732 
+0.001857 0.005315 -0.000774 -0.001009 0.001856 -0.000643 
+-0.001995 0.000572 -0.002805 -0.007104 0.000190 -0.004622 
+0.000424 -0.003434 0.007888 0.001466 -0.003426 0.007194 
+-0.000213 -0.003781 0.006547 -0.004460 -0.001075 0.002673 
+-0.001562 0.001656 0.000828 -0.001484 0.001484 -0.002187 
+-0.001334 0.002223 -0.003543 -0.001447 0.001006 -0.002181 
+0.001113 -0.000463 0.000075 0.004326 0.004554 -0.007134 
+0.000513 0.002864 -0.008808 0.004649 -0.000172 -0.005509 
+0.001409 -0.000649 -0.002148 -0.000829 -0.000645 -0.000511 
+-0.000871 0.000767 -0.000117 0.000741 0.003104 -0.003445 
+0.001442 -0.000757 -0.002424 -0.000599 -0.001099 -0.002922 
+0.001060 0.000407 -0.004155 -0.000717 0.000254 -0.000612 
+-0.000898 -0.003125 -0.000898 -0.002591 -0.001771 0.000951 
+-0.001517 -0.001397 0.000361 0.000627 0.000010 -0.001446 
+0.001790 0.001647 -0.003865 0.002526 0.001690 -0.003371 
+0.000278 0.000552 -0.000406 -0.000429 -0.002567 0.001563 
+0.000317 -0.000166 0.000567 -0.001930 0.004172 0.001408 
+0.002941 0.009191 -0.000368 0.002225 -0.000371 -0.001168 
+-0.000989 0.001744 -0.004009 0.000656 0.002542 -0.004084 
+0.000671 -0.000764 -0.005784 0.003735 0.000722 -0.002823 
+-0.000992 0.004512 0.000651 0.000551 0.007138 -0.003142 
+0.000802 0.007070 -0.003568 -0.001548 0.006026 -0.003239 
+0.005485 0.005923 0.000110 0.008954 0.009668 -0.002997 
+0.008595 0.009650 -0.002770 0.005809 0.005496 -0.002040 
+0.001932 0.001774 -0.001124 0.000120 0.000089 -0.000095 
+-0.000931 0.002355 -0.000557 -0.000752 0.004815 0.000451 
+-0.002142 0.003227 -0.000733 -0.000174 -0.000769 0.001217 
+0.002435 -0.002319 0.002333 0.003494 -0.001697 -0.000568 
+0.002327 0.000075 -0.001810 -0.000159 -0.000491 -0.001233 
+-0.001838 0.000172 0.001204 -0.000699 0.001544 0.003787 
+0.001884 0.004130 0.002754 0.001570 0.002197 0.003769 
+-0.000015 -0.000124 0.000198 -0.002422 -0.001170 -0.004177 
+-0.004052 0.001022 -0.003337 -0.002513 -0.000344 0.001058 
+0.000642 -0.004165 0.003366 -0.001259 -0.003937 0.002426 
+-0.000408 0.001625 0.001016 0.000221 -0.000773 0.000532 
+0.001840 0.001723 -0.003692 0.006770 0.000784 -0.006200 
+0.001241 0.004313 -0.006616 0.000551 0.003859 -0.001102 
+-0.001798 0.004614 0.001300 0.000370 0.001556 -0.001852 
+0.000972 0.005148 0.002890 0.000995 0.002907 0.002964 
+-0.001310 0.004319 0.000391 -0.002916 0.000904 -0.000404 
+-0.004870 0.006237 -0.000052 -0.001868 0.003661 0.001123 
+-0.000565 0.001500 0.001036 0.001450 0.002574 -0.001568 
+0.001983 0.001014 0.001083 0.004802 -0.000924 0.000539 
+0.005417 -0.001041 0.000355 0.002450 0.001432 0.001329 
+-0.002032 0.001016 -0.000323 -0.001983 0.001906 -0.000191 
+0.000467 -0.000850 -0.001532 0.001374 -0.001198 -0.002484 
+-0.001589 -0.001805 -0.000851 -0.002494 -0.000104 0.001434 
+0.000707 0.004876 -0.002333 0.006371 0.001675 -0.006698 
+0.009476 0.005089 -0.007371 0.005920 0.005976 -0.005378 
+-0.000087 0.003172 -0.001575 -0.002677 -0.001694 0.001339 
+-0.004597 -0.000403 -0.001210 -0.001849 0.000509 0.000062 
+-0.000491 0.000439 0.000141 0.000379 -0.000345 -0.000622 
+-0.004077 -0.000850 0.000735 -0.008204 0.000519 0.001917 
+-0.005621 0.004707 0.002075 0.000733 0.005851 0.003658 
+-0.001316 0.001342 0.000859 -0.000153 -0.001232 0.000112 
+-0.003581 -0.003231 -0.000651 -0.003192 -0.001004 -0.001681 
+0.000557 0.002029 -0.001871 0.003397 0.002263 -0.001761 
+0.003160 0.001821 0.002250 0.000706 0.002471 0.000076 
+0.000859 0.004366 -0.001543 0.001486 0.003580 -0.004645 
+0.001926 0.002421 -0.002487 0.002351 0.003321 -0.000394 
+0.004012 0.001954 0.002891 -0.000904 0.002874 -0.000787 
+-0.001486 -0.001629 0.001032 -0.002086 -0.004290 0.000139 
+-0.002370 -0.002644 0.000048 -0.002883 -0.001318 0.001123 
+-0.002943 -0.000213 -0.000422 0.000221 0.000340 0.000476 
+-0.000147 -0.000442 0.001783 -0.000191 0.004301 -0.002103 
+-0.000362 0.003672 -0.003491 0.000489 0.001525 -0.001184 
+0.000873 0.001267 -0.000110 0.002114 -0.000705 -0.002727 
+-0.000976 0.003410 -0.006326 0.002721 0.007500 -0.005441 
+0.002707 0.000387 -0.005000 0.001938 -0.000554 -0.004964 
+-0.001067 0.001437 -0.002760 0.000802 0.003321 -0.002781 
+0.003560 0.003738 -0.004272 0.005518 0.000140 -0.004818 
+0.002769 -0.002117 -0.002849 -0.001122 0.000484 -0.004156 
+-0.002441 -0.001146 -0.000425 0.000124 -0.000334 -0.000619 
+0.002808 0.001659 0.000149 0.001718 0.002822 0.000843 
+-0.002997 0.001586 0.002823 -0.005612 0.001566 0.002534 
+0.001100 -0.001742 0.003894 0.001376 0.002300 0.006650 
+0.002051 0.003085 0.004868 0.002278 0.000035 0.001409 
+-0.000507 -0.000586 -0.002442 0.000777 0.001531 -0.002629 
+-0.001301 0.001340 -0.002540 0.001048 0.000303 -0.001535 
+0.002729 0.001700 -0.004584 0.012642 0.014237 -0.019283 
+0.027293 -0.024083 0.005351 0.014862 -0.022144 0.009276 
+-0.014167 0.078333 -0.074167 0.029813 0.020155 -0.019832 
+0.005365 0.005430 0.003775 -0.011154 -0.011154 -0.022308 
+0.019326 -0.041631 -0.030225 -0.069605 0.052105 0.097368 
+0.000000 0.148000 -0.032000 -0.003553 -0.038717 -0.060033 
+-0.046226 0.013208 -0.065455 -0.059146 -0.047317 0.029000 
+0.017479 -0.077143 0.069916 0.000256 -0.000385 -0.035000 
+-0.046807 0.015470 -0.041916 0.047619 0.025887 0.027965 
+-0.004701 0.023419 -0.051453 0.040220 0.057143 0.060330 
+0.093000 0.046667 0.031000 0.030000 0.067500 -0.067500 
+0.007241 0.009655 0.030172 -0.027698 0.030794 0.021508 
+-0.065050 0.003838 0.020404 -0.050449 -0.021369 -0.003231 
+-0.021838 -0.018382 -0.018162 -0.005000 -0.036667 -0.036667 
+-0.042639 -0.049861 0.014444 0.006344 -0.090492 -0.041016 
+-0.032717 -0.058152 -0.034529 -0.024545 -0.030909 0.024545 
+-0.007407 -0.028519 0.049630 -0.058065 0.024885 0.040000 
+-0.029942 -0.001202 -0.037132 -0.031610 -0.003571 -0.018781 
+-0.017264 -0.020268 -0.004502 -0.100000 -0.004183 -0.001046 
+-0.017289 -0.029983 0.000746 -0.003097 -0.012080 0.002091 
+0.000425 -0.002661 0.002671 -0.002165 0.002759 0.003348 
+-0.002307 0.003123 -0.001184 -0.003465 0.000719 -0.003539 
+-0.004704 0.000656 -0.005152 -0.006094 0.005044 -0.003593 
+-0.006040 0.003543 -0.001323 -0.002239 0.002136 -0.001653 
+0.001275 0.002944 -0.002107 0.007016 0.005167 -0.004768 
+0.008087 0.006768 -0.009467 0.004591 0.008178 -0.007489 
+-0.001576 0.004362 -0.002607 -0.004069 0.002729 0.000268 
+-0.002876 0.002723 -0.000103 -0.001389 0.003066 0.001374 
+0.000289 0.003884 0.000246 -0.002317 -0.000386 0.002437 
+-0.004237 -0.003375 0.001756 -0.002920 0.000318 -0.002132 
+-0.000198 0.005191 -0.006066 -0.002065 0.006380 -0.006862 
+-0.001472 0.000449 0.002585 -0.002727 0.001102 -0.001731 
+-0.001840 0.004341 -0.000176 0.001171 0.002488 0.001262 
+-0.001803 -0.001159 0.001960 -0.006126 -0.004774 0.002889 
+-0.003098 -0.003005 0.000501 0.006462 0.007629 0.003980 
+0.012358 0.008265 0.004142 0.007306 0.004132 0.000310 
+0.003730 -0.000920 -0.003154 0.001586 0.001199 -0.008104 
+0.001632 0.004033 -0.006938 0.001778 0.007191 -0.003801 
+0.004811 0.006122 -0.002784 0.003737 0.002716 -0.003610 
+-0.001406 -0.032382 0.012128 -0.010879 -0.011811 0.000541 
+0.012758 -0.013935 0.014373 0.039810 -0.054613 -0.004949 
+-0.007844 0.009858 -0.003665 0.020025 -0.028752 0.029180 
+-0.005952 -0.011524 0.000762 0.000526 0.000375 0.037778 
+0.069839 -0.039032 0.060806 0.033125 -0.041750 -0.082125 
+0.011172 -0.026069 0.010000 -0.030842 -0.030328 -0.021246 
+-0.007160 0.006790 -0.035432 -0.053233 -0.045113 0.038195 
+0.004270 -0.018368 -0.006928 -0.021742 -0.010000 -0.006212 
+-0.017400 -0.046000 -0.052200 0.041000 0.000000 0.014000 
+0.023000 0.007077 0.035385 0.014000 0.000192 0.000962 
+0.025636 0.003091 -0.016364 0.021111 0.048889 0.000000 
+0.026286 0.024857 -0.050429 0.003170 0.015660 -0.012064 
+0.061176 0.073950 -0.049748 0.131032 -0.052937 -0.050317 
+0.014971 -0.043977 -0.008421 -0.021026 -0.026410 0.047436 
+-0.011061 -0.010939 0.000485 0.004603 -0.037460 0.009524 
+-0.000686 0.000000 0.004800 -0.062614 -0.018636 0.014659 
+-0.034412 0.057353 0.028462 -0.034805 0.056753 0.026234 
+0.010000 0.003636 0.020909 0.014451 0.005701 0.025189 
+0.017778 0.023889 -0.012222 0.007237 0.006246 0.005609 
+0.001125 0.001916 0.004594 0.001855 0.004162 -0.003052 
+0.001574 0.002947 -0.005429 0.001386 0.001584 -0.004383 
+0.000979 0.002928 -0.004595 0.000730 0.005104 -0.004398 
+-0.001698 0.002027 -0.001695 -0.001128 -0.002256 -0.004079 
+0.000155 0.000874 -0.003738 -0.002785 0.003617 -0.003447 
+0.001738 0.003756 -0.010096 0.008094 0.004112 -0.003652 
+0.004479 0.000237 -0.000317 0.002723 -0.001589 0.002314 
+0.002236 0.003109 0.001958 0.001131 0.003734 -0.001188 
+-0.001594 0.002302 -0.000897 -0.001184 -0.000684 -0.000138 
+-0.001432 0.001294 -0.001932 -0.000865 0.000917 -0.000199 
+-0.000367 -0.000287 -0.000444 0.001354 -0.000369 -0.000917 
+-0.001513 0.002163 -0.001989 -0.000307 0.003883 -0.003678 
+0.001338 0.005005 -0.004827 0.004011 0.006343 -0.003088 
+0.004026 0.002290 -0.002667 -0.001990 -0.000040 -0.001396 
+-0.006460 -0.003398 -0.001131 -0.007750 -0.004342 -0.001432 
+0.001569 0.007919 -0.003124 0.016270 0.011834 -0.002331 
+0.008006 0.004143 -0.004513 0.000134 0.001678 -0.004938 
+0.001453 0.008622 -0.004292 0.002620 0.012982 -0.005788 
+-0.001191 0.012558 -0.000341 -0.005776 0.001843 0.010075 
+-0.004539 -0.023276 0.006878 0.001383 0.000934 0.000608 
+0.019566 0.020688 0.020515 0.084203 0.066622 -0.012492 
+0.005374 0.003086 -0.007075 0.003762 0.017871 0.047498 
+0.117273 -0.038182 0.130000 0.116364 -0.012081 0.000863 
+-0.066064 -0.032439 0.016318 -0.000429 0.009024 -0.001548 
+0.061078 0.001228 -0.056779 0.007449 0.011531 0.083367 
+0.004677 0.062171 0.082248 0.024727 -0.038182 -0.139273 
+0.006786 -0.027143 -0.013571 -0.005698 -0.003996 -0.002611 
+-0.011576 -0.007442 0.023979 -0.005833 -0.046667 0.040833 
+-0.041399 -0.025455 0.062098 0.014476 -0.009650 0.058182 
+0.036790 -0.020494 0.026543 0.010646 -0.024109 0.029535 
+0.001697 0.003356 -0.011239 0.014684 -0.004195 -0.010588 
+0.039625 0.026863 -0.002916 0.052678 0.017959 -0.029339 
+-0.058167 0.028333 -0.032167 -0.051928 0.002787 0.021259 
+0.005255 0.003708 -0.005691 -0.021929 -0.015622 -0.016980 
+-0.049365 -0.011905 0.006825 0.027000 -0.019500 -0.019500 
+0.118081 0.026768 -0.009899 -0.009838 0.006351 0.010087 
+-0.004050 0.024284 0.035409 0.197582 0.021181 0.035330 
+-0.053600 0.060000 -0.000800 -0.006029 0.009049 -0.011715 
+-0.002615 0.009022 -0.005678 0.000767 0.004465 -0.004416 
+0.000356 0.002109 -0.001888 -0.001694 0.000400 0.001270 
+-0.005389 -0.002915 0.000896 -0.005422 -0.002780 -0.002132 
+-0.004530 -0.000007 -0.005750 -0.004009 0.001990 -0.009116 
+-0.010811 0.002397 -0.008389 -0.005526 0.008532 -0.006375 
+0.002094 -0.001474 -0.004777 0.003454 -0.005106 -0.003754 
+0.004485 -0.003666 -0.000588 0.001940 -0.002192 0.002330 
+0.000550 0.001174 0.001335 -0.002178 0.001189 -0.001657 
+-0.002271 0.003185 -0.001230 -0.002647 0.001235 -0.000625 
+-0.000299 -0.000031 -0.000856 -0.000373 0.002250 0.001604 
+-0.002716 0.003231 0.003010 -0.002404 0.003112 0.003309 
+0.003584 0.001666 -0.007821 0.000171 0.005868 -0.006609 
+0.000985 0.003255 -0.002082 0.003549 0.001347 0.000377 
+0.003030 0.004741 -0.000495 0.002143 0.004569 -0.002007 
+-0.003685 0.001980 -0.002823 -0.007780 -0.004786 -0.003094 
+-0.009981 -0.007831 -0.003722 0.003982 0.009857 -0.005999 
+0.012045 0.019569 -0.007579 0.002391 0.009363 -0.001902 
+-0.007221 0.004603 -0.002930 -0.010192 0.003846 0.001058 
+-0.008491 0.004265 0.002212 -0.004112 0.000136 0.003454 
+0.000622 -0.002815 -0.011424 0.018474 0.015645 -0.043148 
+-0.046476 -0.009996 -0.000465 -0.208840 -0.152108 -0.271301 
+0.271295 -0.021650 0.059016 0.002290 -0.010421 -0.008066 
+0.017500 -0.021936 -0.013162 0.005786 0.000929 0.009143 
+-0.137767 0.023385 -0.002316 -0.017236 -0.001192 -0.012195 
+0.070417 0.038333 -0.079167 0.106530 0.027515 -0.002647 
+0.059636 0.040909 0.029818 0.094667 0.025667 0.043333 
+0.000000 0.135556 0.054444 0.075108 -0.004329 0.055758 
+0.009385 0.047846 -0.033538 0.000000 -0.023750 0.121250 
+0.007476 0.008905 0.008619 0.000000 -0.115714 0.125714 
+0.026860 -0.018323 -0.004624 0.021384 -0.015388 0.010071 
+0.011270 -0.000786 0.014153 0.004502 0.035137 -0.024455 
+0.002786 0.006811 -0.005728 -0.017071 0.007691 0.003752 
+-0.014677 0.004306 -0.003828 -0.026816 0.015091 0.002766 
+-0.018878 0.004483 0.000430 -0.002869 0.021337 -0.054199 
+0.018165 0.011287 -0.032459 0.022630 0.000025 0.011240 
+0.086261 0.027771 -0.039734 -0.000856 0.000052 0.000409 
+-0.014585 -0.073161 -0.063627 0.002100 0.034285 -0.012680 
+-0.017367 0.036835 0.005882 -0.010609 0.016766 0.001239 
+-0.004374 0.006831 -0.003060 -0.001207 0.003935 -0.004923 
+0.000459 0.003055 -0.002359 -0.000739 -0.001500 0.000733 
+-0.003534 -0.003949 -0.000865 -0.003109 -0.002358 -0.004199 
+-0.003029 0.002323 -0.005678 -0.003632 0.009479 -0.005674 
+-0.007831 0.002583 -0.001374 0.000704 0.010491 -0.001816 
+0.001133 0.004831 0.001096 0.000148 0.001291 0.002394 
+-0.001601 0.002201 0.002005 -0.002383 0.002633 -0.000502 
+-0.002609 0.002913 0.001174 0.000527 0.001552 0.001933 
+-0.000736 0.002666 0.001025 -0.002667 0.002168 -0.000324 
+-0.001394 -0.000430 -0.002391 -0.001233 -0.000818 -0.000092 
+-0.004727 0.001688 0.003432 -0.004155 0.002391 0.004772 
+0.003029 0.000348 -0.003969 0.002369 0.000715 -0.000696 
+-0.000697 0.001415 -0.000280 -0.001780 -0.001496 0.000417 
+0.000758 0.001516 -0.002273 0.003631 0.006349 -0.004502 
+0.000721 0.001249 -0.006110 -0.006836 -0.005280 -0.004679 
+-0.011244 -0.010142 -0.008110 -0.017199 -0.015032 -0.010119 
+-0.011889 0.001345 -0.009794 0.009023 0.009969 -0.000090 
+0.000345 -0.000791 -0.002531 -0.008441 0.003705 0.000858 
+-0.008953 -0.001972 0.002336 -0.009395 -0.001011 0.002054 
+-0.006011 -0.000047 0.001319 -0.002010 -0.002136 -0.003650 
+-0.004878 -0.001206 -0.003754 -0.010062 -0.000034 0.004305 
+0.001194 0.002459 0.005815 -0.009427 -0.000699 0.006458 
+-0.060353 -0.018540 0.025409 -0.120011 -0.038051 0.065278 
+-0.095152 0.028485 -0.041212 0.000753 0.108387 -0.030645 
+0.000046 -0.000033 0.000305 0.140059 -0.078783 -0.070000 
+0.065942 0.051283 -0.045253 0.074804 0.035587 -0.002458 
+0.000000 0.040000 -0.038750 0.150261 -0.116928 0.038170 
+-0.137480 -0.177440 0.103046 0.037879 -0.063485 0.054015 
+0.016948 0.007013 -0.021623 0.024274 -0.033892 0.029777 
+0.019556 -0.027778 -0.031333 0.039263 -0.004408 -0.022445 
+0.017442 0.016377 -0.012693 -0.004343 -0.000290 0.003788 
+0.004444 0.025586 0.004264 -0.022083 0.000750 0.028167 
+-0.056983 -0.017056 0.024260 -0.025849 -0.005652 0.018882 
+-0.022590 0.004753 0.017472 -0.021265 0.014756 0.016025 
+-0.017916 0.003774 0.020257 -0.028325 -0.003161 0.017691 
+-0.039062 -0.007456 0.006196 -0.038510 -0.007991 -0.007678 
+-0.030095 0.002165 -0.078874 0.001108 0.000080 -0.000412 
+0.050401 0.001301 0.061521 0.004343 -0.000756 0.004326 
+-0.000472 0.000227 -0.003217 0.000714 0.002653 -0.003857 
+0.001083 0.005379 -0.001980 0.002703 0.001080 -0.000533 
+-0.000672 0.000018 -0.001339 -0.001650 0.002573 -0.004806 
+-0.004207 0.007647 -0.006872 -0.010306 0.005316 -0.000643 
+-0.000776 0.001337 0.001971 0.002872 0.004166 0.000933 
+0.004136 0.002938 0.003141 0.000983 0.004083 0.001794 
+-0.000456 0.002986 -0.001401 -0.001008 0.000950 0.001230 
+0.000203 0.004422 0.000433 -0.001913 0.005364 0.000338 
+-0.000518 0.004012 -0.000192 0.000345 -0.000040 -0.000307 
+-0.001033 -0.001778 0.000172 -0.004423 -0.000901 -0.001640 
+-0.005136 -0.003076 -0.000959 -0.003406 -0.002165 -0.000765 
+0.001960 -0.002227 -0.001546 -0.001864 -0.000355 0.001774 
+-0.001395 -0.001298 -0.000782 -0.001033 0.000627 -0.004848 
+-0.000334 0.001271 -0.005061 0.002828 0.002771 -0.001721 
+0.002235 0.000540 0.000606 -0.005238 -0.002226 -0.000379 
+-0.011237 0.000705 -0.006034 -0.009744 -0.013562 -0.012051 
+-0.017272 -0.013999 -0.010938 -0.008561 0.005979 -0.004499 
+0.007966 0.010864 0.003984 -0.004316 -0.005474 -0.003368 
+-0.010710 -0.006875 -0.002681 -0.010188 -0.003392 -0.000379 
+-0.008596 0.000998 0.000023 -0.004660 0.002117 -0.000329 
+0.002410 0.008759 0.008909 0.001576 0.012844 0.012715 
+-0.003729 0.010754 0.012407 -0.010668 0.006219 0.014142 
+-0.027698 0.000188 0.027167 -0.042615 -0.009870 0.059275 
+-0.062337 -0.013356 0.130247 -0.036698 0.045216 -0.007917 
+-0.020211 -0.000808 0.009297 -0.024273 -0.010010 0.012489 
+-0.040729 -0.019843 0.009396 -0.053464 -0.039324 0.034471 
+-0.028942 -0.103598 0.006085 0.080427 -0.058718 0.038291 
+0.068703 -0.066098 0.058706 -0.101528 0.021111 -0.017639 
+-0.054722 0.040139 -0.034306 -0.062169 -0.027176 -0.084971 
+0.026587 -0.010900 0.054771 -0.013647 -0.020996 0.022049 
+-0.008242 -0.026335 0.024403 -0.026738 0.001844 -0.025078 
+-0.023232 -0.008030 0.047323 -0.067238 -0.032100 0.012582 
+-0.069559 -0.042108 0.020588 -0.015172 -0.017085 0.032247 
+-0.035098 0.006762 0.038112 -0.034259 -0.002259 0.044519 
+-0.019486 -0.008991 0.049275 -7.295238 -2.761905 2.133333 
+-4.542289 -2.492537 1.328358 -2.950000 -2.881250 1.018750 
+-2.310850 -3.422287 0.806452 -1.802632 -4.649123 0.868421 
+-0.024705 -0.010944 0.013003 -0.011232 -0.003015 0.002090 
+-0.001922 0.003821 -0.005601 -0.001226 -0.002555 -0.001522 
+0.003386 -0.000282 -0.000083 0.001844 -0.000142 -0.000709 
+-0.005309 0.001921 0.004619 -0.011679 0.006668 -0.001688 
+-0.007312 0.010968 -0.005882 0.001970 0.018193 -0.008341 
+-0.001222 0.000223 -0.001294 0.001513 -0.000957 0.000695 
+-0.000054 0.001317 0.001086 -0.004118 0.003700 -0.001087 
+-0.000287 0.007469 -0.002627 -0.000502 0.000557 0.000115 
+0.001246 0.000284 -0.005803 -0.001910 0.005878 -0.006340 
+0.001438 0.008274 -0.007495 0.001567 0.001657 -0.005613 
+-0.003904 -0.000893 -0.000098 -0.005721 -0.005975 0.002353 
+-0.005397 -0.000470 0.003324 -0.005620 0.000249 -0.000896 
+-0.003781 -0.005779 0.007062 -0.010020 -0.006732 0.003648 
+-0.007355 -0.001858 -0.002473 -0.003897 -0.001032 -0.008888 
+-0.001562 -0.005312 -0.003500 -0.006224 -0.003549 0.001594 
+-0.001077 0.000442 0.005279 0.000266 0.010768 -0.000705 
+0.001660 0.003176 -0.007544 -0.005510 -0.007150 -0.003510 
+-0.011149 -0.015623 -0.001478 -0.005241 -0.013495 0.002154 
+0.023306 0.016921 0.003492 0.003608 0.010771 0.003178 
+0.002480 -0.004510 0.001944 -0.003102 -0.001560 -0.000705 
+-0.002015 0.001916 0.000559 0.005831 0.018966 0.010632 
+0.041379 1.531034 5.351724 0.117647 1.405882 4.770588 
+0.271186 0.322034 3.875706 -0.007474 0.009924 0.015851 
+-0.012954 -0.002716 0.019067 -0.016553 -0.010278 0.019219 
+-0.016844 -0.010853 0.019697 -0.006582 0.000043 0.005502 
+0.005768 0.012691 0.025381 0.006960 0.002712 0.003856 
+-0.005772 -0.012819 -0.007491 -0.033350 -0.062099 0.026836 
+-0.014794 -0.133066 0.118313 0.040379 -0.054318 0.066818 
+0.016560 -0.006699 -0.014551 -0.034719 0.003983 -0.010671 
+-0.057593 -0.018648 0.000659 -0.023947 -0.048309 -0.051898 
+-0.009500 0.005959 0.021044 0.075020 0.049269 0.049517 
+-0.038363 0.099137 -0.010725 -0.052279 0.024642 0.009079 
+-0.007001 -0.046531 0.040355 -0.047325 -0.052969 -0.014673 
+0.018129 0.004014 -0.008201 -0.046347 0.027484 0.020636 
+-0.040324 0.007242 0.033870 -0.047629 0.001077 0.040682 
+-7.141304 3.336957 2.239130 -6.500000 0.951087 2.364130 
+-5.718850 -2.539936 2.399361 -3.280000 -4.654737 1.837895 
+-1.712069 -5.468966 1.181034 -1.191617 -5.596807 0.640719 
+-1.198171 -5.073171 0.356707 -1.244444 -3.462222 0.346667 
+0.000671 -0.019377 0.001220 0.008516 -0.016911 -0.002726 
+0.009740 0.001274 0.002187 -0.002514 0.022563 0.001707 
+-0.006536 0.004675 0.005678 -0.002311 0.002668 -0.000740 
+-0.006136 0.005449 -0.005301 -0.013515 0.015127 0.005036 
+-0.005201 0.006428 0.006191 0.001463 0.001708 0.002231 
+0.000891 -0.000210 0.000390 0.005126 0.005099 -0.002925 
+0.002022 0.002430 0.001315 -0.002666 0.001462 -0.001740 
+-0.002732 0.006870 -0.003795 -0.001013 0.006300 -0.001942 
+0.004542 0.006630 -0.002028 0.004463 0.004682 -0.003305 
+0.000609 0.001641 0.000471 -0.000945 -0.004412 0.000703 
+-0.001118 -0.004691 -0.002827 0.000049 0.000375 -0.003456 
+-0.006648 0.002102 -0.000667 -0.011561 -0.004796 0.000973 
+-0.006926 -0.006663 0.003478 -0.006144 -0.007944 -0.005909 
+-0.003300 -0.007808 -0.001910 -0.002561 -0.005727 -0.001350 
+0.003370 0.000635 -0.002363 0.011908 0.009328 -0.003246 
+0.012156 0.010706 -0.003104 -0.002666 -0.004351 -0.004234 
+-0.010833 -0.012911 -0.006979 -0.004153 -0.004685 -0.001743 
+0.009820 0.018504 -0.004524 -0.001423 0.017682 -0.006968 
+0.002936 0.003990 0.009418 0.004318 0.000633 0.000535 
+0.008589 0.006756 0.001571 1.620253 2.303797 5.120253 
+1.510040 2.586345 5.208835 1.568345 2.284173 4.964029 
+1.792969 0.875000 4.769531 1.953704 -0.527778 4.245370 
+0.011178 -0.004264 0.030969 0.003310 -0.002914 0.009887 
+0.001825 0.002678 -0.001772 0.001880 0.008440 0.004981 
+0.063090 0.034315 -0.005100 0.019899 0.001626 -0.006883 
+0.016739 -0.032157 0.019676 -0.002285 -0.080049 0.025492 
+0.048379 0.020371 0.093361 0.084923 0.063193 0.092666 
+0.065648 0.024319 0.061130 0.032732 -0.012579 -0.019747 
+0.009214 -0.005265 -0.002778 0.010317 -0.057802 0.022687 
+0.004073 -0.014528 0.020434 0.037736 -0.025000 0.007075 
+-0.031381 0.004709 0.007572 -0.058810 -0.035238 -0.047024 
+-0.006388 -0.042039 0.044581 0.006030 0.012862 -0.030529 
+-0.009518 0.019093 -0.032978 -0.028849 0.008928 0.013070 
+-0.060566 -0.013795 0.022416 -5.564103 6.000000 1.666667 
+-4.070270 1.540541 2.118919 -3.557471 -1.801724 2.293103 
+-3.827751 -3.933014 3.069378 -1.453586 -6.116034 2.132911 
+-0.087687 -6.770523 1.039179 0.042644 -6.031983 0.509595 
+0.038095 -5.206349 0.025397 -0.108247 -4.603093 -0.206186 
+0.010220 -0.017760 0.000695 -0.004999 0.029419 -0.006634 
+-0.011544 0.034133 -0.008724 -0.004521 0.004863 0.002564 
+-0.001053 -0.009818 0.004303 0.001163 0.005224 -0.000280 
+-0.021271 0.020795 -0.014484 -0.013030 0.016017 0.000312 
+-0.003954 0.007908 0.002778 -0.003821 0.003533 0.001516 
+-0.003450 -0.001006 0.001869 -0.000356 -0.008408 0.000369 
+-0.001759 -0.005694 -0.002824 -0.000616 0.000643 0.000253 
+-0.003663 0.005326 0.001076 -0.001448 0.005304 0.000748 
+0.000814 0.005360 -0.000688 0.003261 0.009346 0.003323 
+-0.000385 0.004496 -0.002827 0.002197 0.001671 -0.006684 
+0.002821 0.004680 -0.006162 0.000004 0.007350 -0.006217 
+-0.004228 0.001248 0.001758 -0.002535 -0.003414 -0.002125 
+0.003658 -0.002596 -0.004986 -0.008283 -0.000112 -0.004590 
+-0.000530 0.002691 -0.006091 0.000209 0.000813 -0.002728 
+0.004238 0.004183 -0.004114 0.008938 0.006273 -0.003384 
+0.006592 0.006566 -0.002318 0.001158 0.001880 0.000008 
+-0.008666 -0.002222 -0.006627 -0.015463 0.002889 0.002765 
+-0.008972 0.010541 0.003466 0.001406 0.007765 0.009559 
+0.006867 0.006673 0.013743 0.008591 0.004627 0.001211 
+0.004681 0.012046 0.002175 1.932292 2.515625 6.104167 
+2.410029 2.834808 5.132743 3.069333 2.688000 4.677333 
+4.003039 1.677812 4.422493 4.800000 0.769231 4.192307 
+4.734104 0.601156 3.786127 0.015349 0.013203 0.011027 
+0.014590 0.013342 -0.003006 0.019350 0.021523 0.012116 
+0.056949 0.032753 0.027418 0.020929 -0.015597 0.005473 
+0.014934 -0.021176 0.018318 0.006626 -0.037165 0.007211 
+-0.002639 0.029863 -0.022288 0.001298 0.003246 0.034084 
+-0.058834 -0.004023 0.046378 -0.054221 -0.066866 0.005652 
+-0.046479 -0.072553 0.054481 -0.023008 -0.010506 0.034248 
+0.019935 -0.039712 0.005284 -0.056959 -0.096520 0.005117 
+-0.070544 -0.042604 -0.031799 0.006667 0.005132 -0.038490 
+0.091624 -0.052141 -0.115923 0.029868 -0.038186 -0.051303 
+-0.009806 0.001757 0.008741 -0.032538 -0.003993 0.013574 
+-0.037236 0.021411 0.017055 -2.610687 3.839695 1.709924 
+-3.035856 -0.665339 2.282869 -5.773463 -2.592233 3.857605 
+0.086379 -5.408638 0.780731 2.650259 -7.476684 -0.585492 
+1.668161 -7.000000 -0.383408 1.201102 -5.504132 -0.509642 
+1.122066 -3.934272 -1.051643 0.019886 -0.016614 -0.012867 
+0.010593 0.024913 -0.016838 -0.020250 0.010125 0.003906 
+-0.011727 0.009823 -0.001957 -0.002153 0.002510 -0.003607 
+-0.016672 0.007206 0.000985 -0.028802 0.012455 -0.003444 
+-0.023051 0.016682 -0.005205 -0.008232 0.008747 0.002401 
+-0.004508 -0.003219 0.001712 -0.000339 -0.001109 0.000191 
+0.001709 0.001543 0.000289 0.005532 -0.001360 -0.002743 
+0.005388 -0.001976 -0.001676 0.002426 -0.001595 -0.000993 
+0.002687 0.000856 0.001536 -0.000810 0.003489 0.002434 
+-0.005530 0.003698 0.004385 0.000295 0.000318 0.000568 
+-0.001516 -0.000501 0.000308 0.002949 0.001322 -0.001746 
+0.000631 0.006134 0.000023 -0.007316 0.007032 -0.003966 
+-0.006542 0.001153 0.003566 -0.001085 -0.001320 -0.003320 
+0.007036 0.001345 -0.006536 0.003144 0.002701 0.001017 
+-0.003204 0.006283 0.000321 -0.003107 0.002196 -0.002934 
+-0.000575 -0.000326 -0.001230 0.002183 0.000720 -0.002463 
+0.000876 0.002947 -0.001058 -0.000935 0.000155 -0.004026 
+-0.007411 -0.006584 -0.005194 -0.010284 -0.010006 -0.004955 
+0.000080 -0.001209 -0.000826 0.010453 -0.000958 0.007661 
+0.015736 0.008603 0.020833 0.009605 0.006952 0.004770 
+-0.008408 0.010637 -0.003971 1.734807 2.364641 1.116022 
+2.885246 2.924590 4.796721 3.502762 2.494475 4.085635 
+4.099707 1.771261 3.659824 4.505415 1.599278 3.447654 
+4.097826 1.739130 2.766304 0.013046 0.011189 -0.016878 
+0.004802 0.006869 -0.008778 0.009238 0.021278 0.000522 
+0.001875 0.022038 0.004750 0.019885 0.013631 0.002650 
+0.012071 0.005654 0.020414 0.005245 0.010606 -0.000948 
+0.010852 0.027981 -0.009819 -0.008654 0.022532 -0.004236 
+-0.003506 -0.008995 -0.015823 0.012667 0.000667 0.000000 
+-0.011225 -0.007329 0.010608 -0.006857 -0.002478 0.012802 
+0.008195 0.004156 0.001249 -0.015005 -0.017332 0.016818 
+-0.069529 0.015526 0.047938 0.085296 0.016330 -0.024294 
+0.037853 -0.031243 -0.013775 0.009221 -0.109927 0.019342 
+-0.028865 -0.006925 0.019084 -0.049717 0.006883 0.015823 
+-0.032719 0.054699 0.012217 -2.731843 1.407821 1.625698 
+-2.751773 -0.198582 2.028369 -7.237705 0.127049 4.893443 
+6.289855 -3.369565 -6.971014 6.328948 -7.596491 -5.434210 
+2.556250 -6.415625 -2.093750 1.974729 -4.974729 -1.797834 
+1.538012 -3.894737 -1.830409 0.016208 -0.027441 -0.014241 
+0.006267 -0.002630 -0.002218 -0.006748 0.005489 -0.000044 
+-0.009540 0.002928 -0.000348 -0.014292 0.001955 0.000902 
+-0.020836 0.010384 0.001211 -0.009446 0.011739 0.013764 
+-0.015598 0.002674 0.007005 -0.010717 -0.000461 0.004098 
+-0.004421 -0.002481 -0.000041 -0.000769 0.001659 0.000028 
+0.001447 0.005028 -0.000166 0.004347 0.006992 0.001708 
+0.004745 0.002255 0.003541 0.004900 0.000315 0.001966 
+0.002060 0.002238 0.001104 -0.000591 0.002229 0.001928 
+-0.000615 -0.000676 0.001385 -0.000859 -0.003143 0.001443 
+-0.007557 -0.001911 0.001737 -0.003859 0.001310 -0.003131 
+-0.002158 0.003853 -0.003386 -0.000230 0.005285 -0.003919 
+-0.000610 -0.003437 0.000387 -0.000557 -0.001190 -0.001305 
+0.004757 0.000531 -0.004429 0.006402 0.001288 -0.001446 
+0.003648 0.003011 0.000158 0.000644 0.000201 -0.000161 
+-0.003289 -0.002935 -0.004975 -0.000602 -0.002887 -0.005770 
+0.001689 -0.000418 -0.004887 -0.002512 0.001918 -0.003651 
+-0.004011 -0.001867 -0.004815 -0.007173 -0.006685 -0.005075 
+-0.001111 -0.005438 -0.007259 0.003628 -0.003582 -0.002119 
+0.005766 -0.000524 0.003844 0.015618 0.017728 0.008029 
+-0.001725 0.009216 -0.010599 -0.002884 0.026892 -0.017488 
+2.423645 2.266010 0.216749 2.780876 1.537849 1.593626 
+2.402098 1.300699 1.727273 1.800000 1.681481 1.222222 
+0.008432 0.022496 0.002997 -0.004003 0.024043 -0.011622 
+-0.011143 0.020671 -0.005840 -0.004589 0.015800 -0.005578 
+0.003882 0.010170 0.022848 0.011064 -0.005157 0.026254 
+0.019513 0.011504 0.003959 0.012139 0.014246 -0.005295 
+0.000519 0.026518 -0.022130 -0.016312 0.017955 -0.016887 
+-0.000780 0.002535 -0.033735 0.037732 -0.019494 -0.027423 
+0.010963 0.018487 -0.032137 -0.006181 0.018352 -0.006989 
+-0.002151 0.009009 0.008191 0.007467 0.025850 -0.018263 
+0.213137 0.387823 0.019041 0.001384 0.109774 -0.066076 
+0.005915 0.014854 -0.019600 -0.000598 -0.023387 0.019288 
+-0.041359 -0.001676 0.034512 -0.044076 0.046986 0.022276 
+-2.900826 5.008265 1.454545 -2.258929 2.508929 1.741071 
+-2.014545 1.265455 2.036364 -0.000167 0.028049 0.028064 
+5.571429 -3.226891 -4.512605 3.739336 -6.317535 -3.601896 
+2.553113 -5.732601 -2.186813 2.206897 -5.137931 -2.077586 
+1.387097 -4.593548 -1.825806 0.012927 -0.035859 -0.014549 
+0.000020 -0.012956 -0.007776 -0.000143 0.014444 -0.008273 
+-0.007943 0.012939 -0.005750 0.002466 0.001802 -0.001920 
+-0.004698 0.014283 -0.002160 -0.011998 0.008701 0.003855 
+-0.007044 -0.002700 0.001908 -0.001617 -0.005188 -0.001772 
+-0.000157 -0.000884 -0.002514 -0.002407 0.000805 -0.000964 
+-0.001168 0.001640 0.002584 0.002197 -0.003474 0.002633 
+0.002683 -0.003081 0.002608 0.000739 -0.001176 0.000201 
+-0.003118 -0.000108 0.002051 -0.001203 -0.000913 0.002467 
+-0.000496 -0.000856 0.000203 -0.001170 -0.000590 -0.001200 
+-0.004517 -0.000072 -0.001467 -0.005026 0.001826 -0.001694 
+-0.002924 0.002152 0.000496 -0.002638 0.001551 0.000869 
+-0.000075 -0.000075 -0.002857 0.000999 0.002569 -0.003197 
+0.006267 0.002311 -0.001859 0.005855 0.005211 -0.000779 
+0.002435 0.004705 -0.000274 0.000282 0.000638 -0.000050 
+-0.001368 -0.002023 -0.000106 0.000409 -0.001382 -0.002938 
+0.000249 0.000391 -0.000078 0.001524 0.000984 0.001588 
+0.000437 0.000985 0.002219 -0.000166 -0.000026 0.001403 
+0.000520 -0.001818 -0.002184 0.001555 -0.008822 -0.002904 
+-0.013876 -0.020646 -0.001044 0.011856 0.013861 0.004145 
+0.010020 0.012285 -0.004025 0.008152 0.007638 -0.013616 
+0.013744 -0.004057 -0.030249 0.018418 -0.002859 -0.011526 
+0.010969 0.005277 0.000261 -0.001681 0.011400 0.005009 
+-0.013645 0.018654 0.003035 -0.018447 0.020489 -0.000584 
+-0.017199 0.012930 -0.005509 -0.009069 0.003937 -0.005545 
+-0.000740 0.002434 -0.001590 0.004845 0.007817 -0.004419 
+0.011891 0.009232 -0.002071 0.007747 0.005725 -0.003309 
+-0.007710 -0.000175 -0.001952 -0.020270 -0.009932 0.009767 
+-0.019624 -0.006741 0.016834 0.003475 -0.006584 0.012021 
+0.017178 0.016851 -0.019901 0.010259 0.020387 -0.010192 
+-0.004007 0.015262 -0.012609 -0.006544 0.015892 -0.016792 
+-0.006696 -0.008634 0.013534 0.029600 0.001013 -0.016705 
+0.037458 -0.011225 -0.011958 0.012837 -0.014787 0.006453 
+-0.017699 0.015369 0.012749 -1.507692 5.123077 0.669231 
+-1.308411 4.878505 1.074766 -1.063745 3.737052 1.669323 
+0.445000 3.030000 0.700000 0.041015 0.013809 0.010856 
+2.548023 -5.807909 -0.887006 2.088028 -6.232394 -1.514084 
+2.395973 -5.973155 -2.241611 2.290323 -5.373272 -2.493088 
+1.679104 -3.940299 -2.373134 0.009235 -0.018711 -0.026422 
+0.000867 0.015894 -0.004711 -0.004460 0.024113 -0.007228 
+0.002551 0.001614 -0.006486 -0.008135 0.005624 -0.004895 
+-0.004513 0.004816 0.001905 -0.004825 -0.001137 0.004555 
+0.003009 -0.003917 0.002679 0.000493 -0.006313 -0.003848 
+-0.000970 -0.004863 -0.005176 0.000262 -0.003371 -0.003360 
+-0.000410 -0.002074 -0.002283 0.001179 -0.001493 -0.000019 
+0.000583 0.001274 0.000836 0.000313 -0.000123 0.000444 
+-0.003084 0.000704 0.001579 -0.000253 -0.002601 -0.003005 
+0.000622 -0.004333 -0.003070 0.000000 -0.000407 0.000000 
+-0.001250 0.002117 -0.000432 -0.001169 0.001805 -0.000373 
+-0.003424 0.000423 0.004290 0.000054 0.000923 0.001340 
+0.000082 -0.000015 -0.005581 0.004371 0.004422 -0.005421 
+0.006540 0.003379 -0.004197 0.001324 0.003800 -0.003252 
+0.001697 0.004110 -0.001998 0.001134 0.003688 -0.001087 
+-0.002318 0.002663 -0.001825 -0.000089 0.000007 0.000121 
+-0.001640 -0.000735 0.001061 -0.000640 0.000571 -0.000823 
+0.001842 0.004707 0.000628 0.004677 0.009012 -0.001133 
+0.006966 0.007902 -0.005930 0.004529 -0.002348 -0.005997 
+-0.007981 -0.009732 -0.004277 -0.016076 -0.010938 -0.006218 
+0.001710 0.001929 0.001014 0.005716 0.004820 -0.002360 
+0.007967 0.002786 -0.006834 0.012190 -0.001282 -0.006407 
+0.003223 0.004200 0.001635 -0.009718 0.009915 0.005089 
+-0.020861 0.012567 0.002422 -0.023448 0.011122 -0.006506 
+-0.016653 0.005048 -0.013442 -0.008379 0.002823 -0.001393 
+0.001089 0.008791 -0.004666 0.001233 0.003535 -0.002400 
+0.001479 -0.001826 0.001863 -0.000293 0.000116 -0.000250 
+-0.001034 0.000722 -0.002535 -0.000993 -0.000061 -0.000197 
+-0.000263 -0.000021 -0.000030 -0.000167 0.001606 -0.006699 
+-0.000070 0.003595 -0.007287 -0.002194 0.001887 -0.004023 
+-0.004195 0.001124 -0.004623 0.000728 0.008701 -0.014631 
+0.006393 0.002669 -0.008557 0.009570 -0.006044 0.009983 
+0.011256 -0.024125 0.016679 0.003323 -0.017029 0.010771 
+-0.009488 0.017724 0.002243 -1.079365 4.375661 0.645503 
+-1.009434 5.768868 0.891509 -0.255556 5.294445 0.922222 
+0.042376 0.003830 -0.009215 1.476684 -3.761658 -1.715026 
+1.261324 -5.264808 -0.445993 2.278932 -5.557864 -1.483680 
+2.504854 -5.828479 -2.423948 2.229665 -4.985646 -2.535885 
+0.016210 -0.030423 -0.025488 -0.003237 -0.005006 -0.007653 
+-0.010572 0.018297 -0.001337 -0.007961 0.014642 -0.002472 
+-0.010095 0.005608 -0.007156 -0.005048 0.003433 -0.002527 
+-0.006150 0.000408 0.006435 0.002890 0.010159 0.002990 
+-0.000783 0.003015 0.001925 0.000521 -0.004488 -0.002551 
+-0.007288 -0.007246 0.007246 -0.000172 -0.010345 -0.000172 
+0.002450 -0.002427 0.002747 0.001490 -0.000929 -0.000713 
+0.002413 0.003413 0.002497 -0.000157 0.001181 0.002205 
+-0.002435 0.000964 0.001650 -0.003094 0.000183 0.004093 
+-0.006496 -0.008750 -0.000501 -0.003627 -0.005415 -0.004518 
+-0.001980 -0.002783 -0.003438 -0.000863 -0.003059 -0.000045 
+-0.002889 -0.003187 0.005362 -0.001189 -0.002418 0.006019 
+0.001389 0.005078 -0.007391 0.008308 0.010194 -0.007172 
+0.007274 0.012111 -0.004874 0.007205 0.007410 -0.000103 
+0.002204 0.004473 -0.001345 0.000251 0.002878 0.001159 
+-0.006276 0.001659 -0.002217 0.000226 0.000054 -0.000186 
+0.001045 -0.001216 -0.002011 0.002574 -0.000775 -0.004218 
+0.004865 0.009087 -0.004664 0.007256 0.005070 -0.003281 
+0.006820 0.001526 -0.005756 0.007250 -0.000517 -0.006815 
+-0.002615 -0.001688 -0.001698 -0.007159 0.001867 0.000194 
+-0.009349 0.002550 -0.000014 -0.002753 0.002477 -0.000444 
+0.005987 0.004200 -0.004914 0.005745 0.002077 -0.000640 
+0.001306 0.000773 0.000258 -0.003948 0.003717 0.002062 
+-0.009041 0.005519 0.002400 -0.012023 0.004200 -0.004412 
+-0.001250 0.006812 -0.015004 -0.004332 -0.000489 -0.012938 
+-0.003239 0.000640 -0.007869 -0.001836 -0.000512 -0.004337 
+-0.001005 -0.001568 -0.002692 -0.000327 -0.000802 -0.001606 
+-0.000435 -0.000009 -0.000387 0.000361 0.000511 0.001584 
+-0.001261 0.000379 0.000998 -0.002739 0.000163 -0.000584 
+-0.002007 -0.000279 -0.002840 -0.000703 -0.000639 -0.004994 
+0.000778 0.000879 -0.011049 0.002786 0.004554 -0.019933 
+0.001083 0.002118 -0.014535 0.003166 0.000630 -0.004619 
+0.011254 -0.008213 0.003692 0.003074 -0.015406 0.002614 
+-0.005697 0.011597 0.006951 -1.064516 6.395161 0.782258 
+-0.566929 6.913386 0.496063 0.017406 0.035758 0.008793 
+0.019877 -0.011844 -0.031658 0.966418 -4.660448 -0.126866 
+1.193717 -5.196335 0.000000 2.103448 -5.416256 -1.051724 
+2.452599 -5.639144 -1.819572 2.191710 -4.647668 -1.974093 
+0.012306 -0.020230 -0.022492 -0.007070 0.013727 -0.007593 
+-0.004599 0.014753 -0.004427 -0.005619 0.000693 -0.006126 
+0.004551 -0.005582 0.000779 0.010357 -0.011212 0.008675 
+-0.003824 -0.002764 0.002483 -0.000597 0.014354 -0.001408 
+-0.001259 -0.000486 -0.003233 -0.000956 -0.009914 -0.002480 
+-0.002498 -0.010009 -0.002888 0.001190 -0.000959 0.001613 
+-0.002229 0.002880 0.001741 -0.002717 0.001119 0.001997 
+-0.001992 0.000611 -0.000633 -0.001009 0.000380 -0.002924 
+-0.003068 0.001219 -0.003057 -0.005381 0.001768 -0.001615 
+-0.005413 0.001585 -0.000725 -0.003828 -0.000294 -0.002267 
+-0.003175 -0.002891 -0.003526 -0.000687 -0.005172 0.001584 
+-0.000399 -0.004713 0.001447 0.000129 -0.004603 0.001188 
+0.001273 0.001462 -0.001315 0.001710 0.005666 -0.005026 
+0.005899 0.005191 -0.001363 0.002331 0.001215 0.001962 
+-0.000380 0.001525 0.000369 -0.003009 -0.002266 -0.000170 
+-0.003043 -0.002449 -0.001151 -0.000146 -0.001550 -0.001696 
+0.000483 -0.000401 -0.001187 0.002245 0.003212 -0.003140 
+-0.002290 0.000787 -0.001611 0.002916 -0.001140 -0.003242 
+0.002893 -0.000838 -0.005038 0.002611 -0.000462 -0.006845 
+-0.004380 0.005289 -0.002231 0.000526 0.008598 -0.002918 
+-0.006807 0.005954 -0.001280 -0.001946 0.005688 0.003375 
+0.003156 -0.000417 -0.000446 -0.003560 -0.002295 -0.003154 
+-0.002023 -0.008463 -0.004545 -0.003313 -0.006312 -0.004380 
+-0.003561 -0.003541 -0.002483 -0.000207 -0.003884 -0.003314 
+0.001434 -0.004564 -0.003275 0.000960 -0.002604 -0.002991 
+0.001733 -0.001593 -0.001279 0.002077 -0.000516 -0.000277 
+0.001891 0.003070 0.000396 -0.003744 0.007872 0.001016 
+-0.002891 0.005179 -0.000333 0.000654 -0.000780 0.000101 
+0.001298 -0.001798 -0.000020 0.000251 0.000944 0.002578 
+0.004832 0.002754 0.001607 0.004568 0.004132 -0.006543 
+0.005691 0.008039 -0.008546 0.001623 -0.000075 -0.007808 
+-0.000664 -0.000723 -0.004628 -0.004865 -0.005591 -0.008991 
+-0.007577 -0.011651 -0.011531 0.007098 -0.013153 -0.006016 
+-0.006253 -0.011688 -0.006455 -0.000824 0.020749 0.004194 
+0.013282 0.028076 -0.004256 0.014156 0.009463 -0.030564 
+1.004484 -3.103139 -0.237668 0.874627 -4.967164 1.080597 
+1.458716 -5.300459 0.447248 1.993318 -5.398664 -0.481069 
+2.240240 -5.306306 -1.126126 2.215569 -4.005988 -1.712575 
+0.002581 -0.001169 -0.019708 -0.003598 0.009703 -0.006442 
+-0.000220 -0.000786 -0.000629 -0.001330 0.004921 -0.010723 
+0.003999 -0.001940 -0.005163 -0.012023 -0.022613 0.024742 
+0.002807 0.009468 0.024833 0.000766 -0.000795 0.003371 
+-0.001851 -0.003143 -0.004937 -0.002449 -0.002358 -0.001728 
+0.000761 -0.003653 -0.000726 -0.004043 0.001335 -0.000900 
+-0.005141 0.003785 -0.001604 -0.002873 0.002994 0.000322 
+0.000450 0.000440 -0.000649 -0.001087 0.001049 -0.001809 
+-0.001968 -0.000997 -0.004580 -0.002705 0.002953 -0.003712 
+-0.007528 0.003894 0.000359 -0.005136 0.003134 0.003082 
+-0.002738 0.001447 -0.001550 0.001490 0.000354 -0.002626 
+-0.003132 -0.000447 -0.004148 -0.005733 -0.005870 -0.001909 
+-0.003711 -0.000874 0.001328 -0.003006 -0.003782 0.002004 
+0.002373 0.000076 0.000341 0.005434 0.002790 -0.002056 
+0.000949 -0.001108 -0.003002 0.004609 0.000109 -0.001628 
+0.000508 0.000769 -0.001720 0.000817 0.000300 -0.002821 
+-0.002090 0.000746 -0.002613 -0.000932 0.002233 -0.002094 
+-0.000934 0.001819 -0.000613 0.001987 0.001352 -0.001175 
+0.000779 -0.001955 -0.003315 -0.005065 -0.007594 -0.005172 
+-0.010166 -0.003259 0.000295 -0.002254 0.001470 0.000803 
+0.001909 0.005330 -0.003503 0.003547 0.004504 -0.005639 
+0.003363 0.002724 -0.007496 0.000299 0.005791 -0.006733 
+-0.004004 0.012064 -0.004800 -0.003614 0.008422 0.002807 
+-0.001180 -0.003273 -0.002168 0.001394 -0.009009 -0.004446 
+0.001034 -0.003374 -0.000877 -0.001542 0.003620 0.001003 
+-0.000466 0.000900 -0.001375 0.001825 0.001466 0.000639 
+0.000240 0.000511 -0.000546 -0.004790 0.002106 -0.000137 
+-0.004177 0.003306 -0.002120 -0.004027 -0.000127 0.000882 
+0.000984 -0.000779 0.000779 0.002030 0.003459 0.000789 
+0.004802 -0.001416 -0.002524 0.001918 -0.001197 -0.003966 
+0.001583 0.006528 -0.003781 -0.002736 0.002708 -0.001478 
+0.003628 0.000351 -0.000416 0.000768 -0.005036 -0.005229 
+-0.006777 -0.010573 -0.002744 -0.012340 -0.016167 0.007006 
+-0.008413 -0.029980 0.013213 0.005203 -0.032475 0.008017 
+0.015185 -0.001146 -0.019201 0.006255 -0.019534 0.000105 
+0.124113 -4.503546 2.368794 0.777480 -5.126005 2.300268 
+1.588652 -5.170213 1.080378 2.020672 -5.180879 -0.005168 
+2.313725 -4.737255 -0.968627 0.023895 -0.025388 -0.027292 
+0.015111 0.025080 -0.003185 0.013887 0.009595 -0.002968 
+0.002163 0.003216 -0.011010 -0.003719 0.018515 -0.019615 
+-0.017397 0.051320 -0.028727 -0.030351 0.038959 0.027545 
+-0.009714 0.009915 0.023660 0.002594 -0.000590 0.007762 
+0.000536 -0.003948 -0.001106 -0.000564 0.002353 -0.009025 
+-0.000474 0.001965 0.000559 -0.003389 0.006337 -0.000404 
+-0.006759 0.001443 -0.000785 -0.004109 -0.003185 0.001982 
+-0.000343 -0.004443 -0.000123 0.001479 -0.002370 -0.001777 
+-0.001180 0.001018 -0.002093 0.000117 0.001951 -0.000601 
+-0.001104 0.000762 -0.001272 -0.003012 0.003895 0.001402 
+-0.002827 0.001928 -0.001135 -0.000935 0.000698 0.001934 
+-0.004106 -0.001944 0.001138 -0.006362 -0.004210 -0.001703 
+-0.000288 -0.000092 0.000300 0.001180 -0.002200 0.002100 
+0.002450 0.000092 -0.003096 -0.000914 -0.000094 -0.001872 
+-0.001036 0.000385 -0.001877 0.005391 0.002576 -0.000480 
+0.000577 0.007672 0.000359 -0.000471 0.003661 0.002673 
+-0.001080 0.001089 0.000840 -0.000467 0.001380 0.001059 
+0.000285 0.002286 -0.001467 -0.003179 0.002071 -0.000504 
+0.000598 -0.002176 -0.001969 -0.003746 -0.001182 -0.004993 
+-0.002484 0.000881 -0.003999 -0.004363 0.002250 -0.004352 
+-0.003634 0.002475 0.000517 -0.004938 -0.003987 -0.002250 
+-0.001974 -0.002511 -0.002070 -0.000872 0.005921 0.006980 
+-0.002914 0.016009 0.000857 0.000172 0.011966 0.001402 
+0.003737 0.001352 0.000561 0.002666 -0.002558 -0.000422 
+-0.004232 0.002632 -0.000563 -0.000041 0.005521 -0.002320 
+0.000677 0.003134 0.001292 0.002774 0.001447 -0.000093 
+0.003568 0.002857 -0.002416 0.002067 0.000658 -0.002951 
+0.000889 0.002797 0.000764 -0.002902 0.004098 0.000967 
+-0.001810 0.002580 0.001431 0.000166 -0.000770 0.004865 
+-0.002301 -0.008643 0.003009 -0.003146 -0.006146 0.000541 
+-0.001829 0.001462 0.000034 -0.002179 0.004159 0.000219 
+0.001811 0.006479 -0.001877 0.005648 0.004386 -0.003369 
+0.003802 0.000891 -0.002714 -0.002763 -0.001767 -0.001207 
+0.000204 -0.004031 0.014677 0.008424 -0.009272 0.001856 
+0.009911 0.002831 -0.015232 -0.041026 -3.717949 2.846154 
+0.113712 -5.153846 4.026756 0.791781 -5.038356 2.901370 
+1.397183 -4.895775 1.301408 1.920755 -4.947170 -0.166038 
+2.453333 -4.200000 -2.020000 0.018657 -0.010355 -0.028670 
+0.017708 0.011865 -0.001758 0.003861 -0.004069 0.004525 
+0.000703 -0.000508 -0.000484 -0.028788 0.049646 -0.029771 
+-0.009385 0.073000 -0.014077 -0.008871 0.014276 0.020977 
+-0.003066 0.004654 0.014342 0.001703 0.001780 0.007120 
+0.003007 -0.003861 0.002671 0.000399 0.000690 -0.003122 
+0.003600 0.005381 -0.003843 0.001937 0.004177 -0.001385 
+-0.002393 -0.000417 0.000619 -0.002730 -0.002126 -0.001494 
+-0.001900 -0.000021 -0.000742 -0.003000 0.001633 0.000433 
+0.000000 -0.000894 0.001951 -0.002635 -0.001614 0.000536 
+-0.000796 -0.000099 -0.001955 -0.000706 0.005605 -0.001589 
+-0.001737 0.003628 0.002320 -0.003211 -0.000245 0.002041 
+-0.002293 -0.001551 -0.000793 -0.000802 -0.001183 -0.001569 
+0.009464 -0.004828 0.000290 0.005984 0.002569 0.000389 
+0.000535 0.007918 -0.005020 -0.006730 0.007544 0.000644 
+-0.003079 0.012180 0.005064 -0.005206 0.011981 0.000090 
+-0.003989 0.007982 0.000796 -0.000011 0.002607 0.001800 
+0.000627 -0.000138 0.000618 -0.000032 -0.000167 -0.000160 
+-0.000094 0.001772 -0.002051 -0.001713 0.002186 -0.004067 
+-0.004030 -0.001002 -0.006535 -0.006286 -0.003252 -0.003118 
+-0.002932 -0.003323 -0.002183 -0.000659 0.001158 -0.002445 
+-0.004865 0.002495 -0.001684 0.003594 0.004500 0.000359 
+0.006805 0.003756 -0.000173 0.002169 0.004344 0.009503 
+0.000613 0.000273 0.000196 0.000702 -0.009391 -0.001835 
+-0.002337 -0.007766 -0.001133 -0.006675 -0.004366 -0.000478 
+-0.008453 0.003910 0.000725 0.001155 0.015075 -0.004026 
+0.010360 0.007933 -0.005540 0.006620 0.004392 -0.003179 
+0.002162 0.002609 -0.003556 0.004694 0.003348 -0.000865 
+0.007174 0.005578 -0.003224 0.002567 -0.001677 -0.001526 
+-0.001496 -0.000112 -0.002791 -0.001102 0.000322 -0.000397 
+-0.000812 -0.001243 -0.001098 -0.002955 -0.001522 -0.000192 
+-0.003126 0.000497 0.002062 -0.002366 0.000967 -0.000155 
+0.001553 0.002820 0.000255 0.004072 0.000352 -0.003890 
+0.003166 0.000905 -0.005816 0.003055 -0.005455 -0.004720 
+0.003729 -0.006124 -0.006499 0.013352 -0.002186 -0.002500 
+0.001264 0.000208 -0.001446 -0.019231 -3.605769 3.908654 
+0.750000 -4.656250 4.350000 1.135734 -4.659280 3.041551 
+1.404605 -4.575658 1.289474 1.787129 -4.153465 -0.668317 
+0.009202 -0.026233 -0.023042 -0.002825 -0.007135 -0.004355 
+0.002874 -0.002578 0.012134 0.000000 -0.007370 0.022520 
+0.016128 -0.045660 0.035690 -0.023627 -0.006701 -0.001418 
+-0.011954 0.014031 0.002926 -0.003742 0.003199 0.009565 
+-0.000379 -0.000573 0.008080 0.001736 -0.001656 0.002411 
+-0.000504 -0.002164 -0.003943 -0.000626 0.001185 0.000112 
+-0.002797 0.002119 -0.001271 0.000384 0.000347 -0.002039 
+0.001930 -0.000822 0.000479 0.002868 -0.000372 0.000664 
+0.003400 0.002430 0.002382 0.002673 0.004225 0.002599 
+0.000839 0.003778 -0.000085 -0.004134 -0.000226 -0.003344 
+-0.002319 0.001259 -0.005027 -0.002090 0.001134 -0.002150 
+-0.001338 -0.000234 0.001437 0.000262 -0.003493 0.000910 
+-0.006031 -0.002424 -0.002515 -0.006927 -0.005814 0.001864 
+0.015541 0.003875 -0.007792 0.004941 0.006092 -0.006587 
+-0.002725 0.003794 -0.001523 -0.005758 0.005284 0.001371 
+-0.005474 0.004171 -0.001218 -0.002124 0.003918 -0.002435 
+0.002575 0.003019 -0.003691 -0.000254 0.003649 -0.002073 
+0.000868 0.004044 -0.002235 0.001048 0.002647 -0.003756 
+0.003921 0.002206 -0.006338 0.005579 0.002831 -0.008743 
+-0.002953 0.003469 -0.001910 -0.006240 0.002106 -0.003643 
+-0.004246 0.002390 -0.004586 -0.003143 0.003432 -0.005045 
+0.008872 0.005851 -0.011511 -0.000002 0.009907 -0.003310 
+-0.000896 0.007796 0.009200 -0.004595 0.010829 0.009694 
+-0.005494 0.001837 0.000660 -0.003395 -0.013329 -0.003843 
+-0.005629 -0.017845 -0.003324 -0.012506 -0.017126 -0.002027 
+-0.013870 -0.009526 0.001199 -0.001195 0.010829 -0.001617 
+0.007898 0.013740 -0.003847 0.000650 0.006810 -0.002173 
+0.001316 0.002921 0.001034 0.001205 0.001106 -0.000639 
+0.001608 0.000571 -0.000218 -0.001632 -0.003495 -0.003974 
+-0.001159 -0.002114 -0.001487 0.004916 0.005809 -0.004384 
+-0.001172 0.001245 -0.008045 -0.000066 -0.001079 -0.001288 
+-0.002126 -0.004129 0.001102 -0.001243 -0.006105 0.000852 
+0.004472 -0.002606 0.003486 0.006990 0.000245 0.000360 
+-0.000302 -0.000324 -0.009294 0.005269 0.005583 -0.004323 
+0.004476 -0.006524 -0.000054 0.002951 -0.002218 0.000554 
+-0.011445 -0.014179 0.025372 0.349138 -3.318965 4.431035 
+1.290698 -3.851744 4.197674 1.502747 -4.131868 3.197802 
+1.648649 -4.243243 1.682432 1.580952 -3.590476 -0.066667 
+-0.000733 -0.020434 -0.007927 0.002266 -0.008416 0.000269 
+0.003127 -0.009540 0.010158 0.001778 -0.012978 0.014780 
+0.023631 -0.004471 0.022674 0.021086 -0.013737 0.008929 
+-0.003879 0.000929 0.006362 -0.004491 0.002035 0.007674 
+-0.001943 -0.003833 0.006468 -0.004633 -0.008822 -0.000899 
+-0.005396 0.000422 -0.002501 -0.003440 -0.003011 -0.002781 
+0.000244 -0.000717 -0.000712 0.001499 -0.001547 0.002128 
+0.000455 0.000000 0.003485 -0.002089 0.003504 0.000648 
+-0.002406 0.003910 0.001880 0.000622 0.001737 0.001467 
+0.003292 0.001090 -0.001742 -0.000365 -0.000269 -0.000685 
+-0.001787 0.001759 0.000642 0.001425 -0.000036 0.001811 
+-0.000880 -0.003582 0.004115 0.000017 -0.005992 0.003471 
+-0.008042 -0.007010 0.000205 -0.008035 -0.000507 0.007450 
+-0.001096 0.007665 0.004652 -0.003468 0.004957 0.007668 
+-0.001143 0.001699 -0.000322 0.001423 -0.000788 0.000611 
+0.002901 -0.004212 -0.003571 0.004154 -0.003308 -0.003082 
+-0.000845 0.001019 -0.001379 -0.000410 0.003497 -0.003028 
+-0.002214 0.000728 -0.001928 -0.002206 0.000486 -0.000043 
+0.003765 0.002544 -0.000621 0.007041 -0.001240 -0.003919 
+0.007378 0.009992 -0.007891 0.004941 0.010419 -0.002192 
+0.002322 0.006880 -0.001872 0.001539 0.004329 -0.004618 
+0.003360 0.000950 -0.006574 -0.002569 0.004971 -0.001354 
+-0.001004 0.011814 0.003887 0.000382 0.011748 0.003047 
+-0.003651 0.000254 -0.000711 -0.006175 -0.014180 -0.003399 
+-0.005705 -0.020369 -0.002801 -0.006554 -0.021723 -0.000850 
+-0.006999 -0.016493 0.002663 0.000627 0.007282 -0.001404 
+-0.002070 0.011730 -0.002761 -0.001826 0.003386 0.001884 
+-0.002124 0.000704 0.000354 -0.001181 -0.001342 0.003987 
+-0.001641 -0.001263 0.002020 -0.000267 -0.004955 0.001700 
+-0.002464 -0.004792 0.004210 -0.000827 -0.002206 0.003961 
+-0.001761 0.002185 0.000089 -0.004594 -0.002073 0.000448 
+-0.000242 -0.000396 -0.000825 0.000716 -0.001600 0.001762 
+0.002449 -0.002694 0.003007 0.000505 0.000094 0.001238 
+0.000100 0.001667 -0.005726 0.007433 0.005799 -0.003455 
+0.006595 0.003569 0.000216 -0.003151 0.005934 0.000982 
+-0.005963 -0.012358 0.032456 0.719512 -2.723577 4.382114 
+1.434783 -3.159420 4.075362 1.675000 -3.541667 3.213889 
+1.860465 -3.744186 1.883721 1.742991 -3.355140 0.429907 
+0.011710 -0.022101 -0.002984 0.004866 -0.009942 0.001854 
+-0.001020 -0.000588 0.008481 0.009255 -0.001241 0.002212 
+-0.002178 0.001363 -0.000954 -0.004278 0.001798 0.006797 
+-0.003429 0.000682 0.010433 -0.002384 -0.001878 0.008077 
+0.000633 -0.000195 0.000447 -0.004126 -0.002214 -0.002848 
+-0.001971 -0.007886 -0.001982 -0.001629 -0.009358 -0.001962 
+-0.001876 -0.004875 0.001634 0.003247 0.002887 -0.003898 
+0.000059 0.007063 0.000007 -0.005138 0.002430 -0.003689 
+-0.001916 0.000165 -0.002518 0.002263 -0.001022 -0.001168 
+0.000535 -0.000018 -0.000187 -0.002559 0.003518 0.001621 
+-0.000324 0.005646 0.002679 0.005845 0.004330 -0.002796 
+0.001495 -0.002623 -0.003137 -0.003189 -0.004714 -0.001110 
+-0.008435 -0.001578 -0.002121 -0.008600 0.004120 -0.003095 
+-0.004703 0.002699 0.003006 -0.000416 0.002807 0.003283 
+0.003674 -0.000783 0.001437 0.005160 -0.003782 0.000491 
+0.003208 -0.002528 0.000486 -0.002647 0.001402 -0.000315 
+-0.005776 0.008124 0.000507 -0.005053 0.004068 -0.002107 
+-0.001931 -0.002679 -0.002722 0.002173 -0.002436 0.000732 
+0.000537 -0.001262 0.002712 0.002974 0.003868 -0.000094 
+0.001526 0.002213 0.001072 -0.000134 -0.000139 -0.000188 
+0.000058 0.000176 0.000094 -0.002826 -0.002423 -0.000131 
+-0.010000 -0.001759 -0.002963 -0.008632 0.003550 -0.005045 
+-0.002110 0.004708 -0.004281 0.002113 0.004037 0.000216 
+0.002078 -0.006934 0.001520 -0.001974 -0.014100 -0.000154 
+-0.003987 -0.013903 0.000444 0.000151 -0.012003 0.001126 
+0.006816 -0.004825 -0.002005 0.002501 0.013538 0.001583 
+-0.000780 0.009847 -0.008115 -0.001166 -0.003326 0.001427 
+-0.004339 -0.001451 0.009331 -0.003282 -0.000129 0.008656 
+0.001053 0.000262 0.003295 0.003081 -0.000919 0.001813 
+0.004775 -0.004206 0.002213 0.004016 -0.003075 0.000635 
+-0.002009 -0.002048 -0.001030 -0.002861 0.006610 -0.005969 
+-0.004568 0.004862 -0.003981 -0.001671 0.000799 -0.002759 
+0.000586 -0.002294 -0.001456 0.001296 -0.002377 0.001157 
+-0.001406 0.001397 0.002380 0.000693 0.007627 -0.004414 
+0.002414 0.010783 -0.001485 -0.001745 0.008925 0.001864 
+0.000801 -0.005908 0.022111 0.767347 -2.073469 3.697959 
+1.365625 -2.675000 3.756250 1.713415 -2.948171 3.024390 
+2.084291 -2.961686 1.865900 0.018772 -0.027715 0.001138 
+0.014012 -0.010505 -0.009308 0.002076 0.001399 -0.005152 
+0.005289 -0.002944 0.002754 0.005635 -0.002412 0.001543 
+-0.000766 0.000050 0.002735 -0.004944 0.000867 0.006836 
+-0.004353 -0.002447 0.007253 -0.000653 -0.001371 0.005612 
+-0.000732 0.000136 0.001674 -0.002550 0.001088 0.001251 
+-0.000181 0.000707 0.001459 -0.001417 -0.000831 0.000539 
+-0.001932 0.002605 -0.002766 -0.007385 0.001860 -0.006149 
+-0.005237 0.003188 -0.006100 0.000864 -0.000145 -0.003012 
+-0.000295 0.000835 0.000099 0.002218 -0.000214 -0.002318 
+0.002686 0.005201 -0.005175 0.005116 0.009138 -0.008043 
+0.011886 -0.000224 -0.005382 0.004576 -0.001279 0.000733 
+-0.000942 0.004424 -0.003220 -0.002411 -0.000614 -0.004185 
+-0.004754 0.000209 -0.005375 -0.006751 -0.003032 -0.003248 
+0.002261 0.003425 -0.001286 0.002427 -0.001273 0.000131 
+0.003864 -0.001933 0.005147 0.001762 -0.000592 0.007909 
+-0.002883 -0.002162 0.000721 -0.006853 0.009137 0.002281 
+-0.003412 0.008133 -0.001667 -0.001224 0.003545 -0.001055 
+-0.000131 0.000359 0.000076 0.003627 0.001594 -0.000203 
+-0.002134 -0.000127 -0.001588 -0.006438 -0.000106 -0.006122 
+-0.007335 0.002887 -0.004494 -0.004188 0.006972 -0.001162 
+0.002560 0.010945 0.005889 0.005455 0.007594 0.004749 
+-0.001233 0.001501 0.001210 -0.007425 -0.008215 0.002234 
+-0.008828 -0.009387 0.003603 -0.003849 -0.004945 -0.000142 
+-0.001611 -0.004648 0.000355 -0.000542 -0.007606 0.001294 
+-0.003131 -0.008864 0.001885 -0.005283 -0.005875 0.003115 
+-0.000249 0.008162 -0.002480 -0.004304 0.017629 -0.006651 
+0.003900 0.006264 0.000354 0.003375 -0.002704 0.006798 
+0.001764 -0.004569 0.009633 -0.003860 -0.003479 0.007637 
+-0.000252 -0.004421 0.001401 0.001240 -0.003419 0.001330 
+0.002203 -0.002351 -0.001052 -0.000236 0.001955 -0.005325 
+0.002179 0.006518 -0.005442 -0.000442 0.006825 -0.004202 
+-0.000222 0.001700 0.001610 0.003589 -0.001974 0.003656 
+-0.000040 -0.003877 0.004302 -0.002026 0.001275 0.005634 
+-0.010046 0.008461 0.001684 -0.004650 0.003146 -0.010542 
+0.000314 0.003569 -0.005663 0.000275 -0.002915 0.004704 
+0.003285 -0.008336 0.016047 0.737557 -1.438914 2.737556 
+1.467181 -1.945946 3.027027 1.954357 -2.248963 2.609958 
+0.017379 -0.027866 0.009858 0.015093 -0.012705 -0.005865 
+0.005109 0.011120 -0.006427 -0.006530 0.009374 -0.003236 
+-0.000100 0.000452 0.010509 0.003967 0.004969 0.009405 
+-0.001610 0.003992 0.007871 -0.003090 0.003323 -0.002106 
+0.000033 0.005233 -0.003511 -0.001859 0.001250 0.000594 
+-0.006667 0.000048 0.000038 -0.007198 -0.003015 0.003551 
+-0.000052 -0.000013 0.000072 0.002053 0.005789 -0.008263 
+-0.000315 0.005847 -0.011647 -0.000434 0.003254 -0.004990 
+0.000513 -0.001961 0.002297 0.001179 -0.004578 0.006706 
+-0.000950 -0.003067 0.005785 -0.001791 0.002465 0.000110 
+0.004063 0.004059 -0.006757 0.007770 0.003329 -0.007958 
+0.004076 -0.000308 -0.006263 0.001246 -0.002830 -0.000077 
+-0.004132 -0.000925 0.001047 0.000926 0.001852 0.000926 
+0.003708 0.005503 -0.001767 0.004297 0.004922 -0.004922 
+-0.000244 0.000649 0.001656 -0.001151 0.000378 0.003000 
+-0.002220 -0.001370 0.003613 -0.004269 -0.000608 0.003816 
+-0.007703 -0.000963 0.000000 -0.003565 0.002870 -0.005739 
+0.005776 0.005776 -0.009569 0.008617 0.009164 -0.008315 
+0.005569 0.004445 -0.005761 -0.004912 0.000876 -0.001993 
+-0.008949 0.002750 -0.005336 -0.007211 0.001222 -0.006661 
+-0.003365 0.002600 0.000969 0.001389 0.004187 0.006775 
+0.004435 0.003880 0.006320 0.002145 0.001728 0.006415 
+0.001386 -0.004505 0.006964 0.002224 -0.004183 0.007055 
+-0.004170 -0.004433 0.001594 -0.007286 -0.002089 -0.003673 
+-0.007003 -0.003698 -0.000887 -0.004522 -0.005686 0.002021 
+-0.005392 -0.004581 0.002911 -0.009438 0.001670 0.004166 
+-0.005551 0.014706 -0.000803 0.009932 0.008442 -0.005824 
+0.013210 0.000253 0.003404 0.010042 -0.001246 0.003923 
+0.001705 0.000858 -0.000353 -0.001634 0.001007 -0.003264 
+0.001303 -0.000264 -0.001867 0.001453 -0.000116 0.000342 
+-0.004923 -0.001325 -0.000156 -0.007688 -0.003100 -0.001863 
+-0.005977 -0.000674 -0.002043 -0.001760 0.002566 -0.000071 
+0.000043 -0.000922 0.003615 0.003962 -0.001236 0.004706 
+-0.000754 -0.001911 0.005363 -0.000872 0.003550 0.002125 
+-0.004081 0.011305 -0.003013 -0.009850 0.004934 -0.009723 
+-0.005305 0.002803 -0.017545 -0.001245 0.002542 -0.006566 
+0.004622 -0.000759 0.008231 0.011258 -0.006121 0.012101 
+0.013316 -0.012854 0.007895 0.013032 -0.016522 0.004330 
+0.009177 -0.013402 0.000020 -0.002085 -0.005097 -0.001299 
+-0.008262 -0.001145 0.005403 -0.001414 -0.002395 0.003757 
+0.001171 0.002033 0.004030 0.000000 0.005607 -0.001869 
+-0.001459 0.006028 -0.005626 0.000467 0.004668 -0.004286 
+0.001804 0.003572 -0.004775 0.001723 0.003262 -0.003467 
+-0.000900 -0.000137 0.000778 0.000700 0.000183 0.004412 
+-0.002212 -0.000885 0.000442 -0.001763 0.003971 -0.006589 
+-0.002518 0.003763 -0.004443 0.000375 -0.000782 0.001265 
+0.005794 -0.003863 0.002979 0.003879 -0.004716 0.001979 
+-0.000907 -0.000253 0.001771 -0.003224 0.001889 0.002738 
+-0.003780 0.001114 0.001580 -0.001938 -0.002912 -0.002323 
+-0.001185 -0.003725 -0.000003 -0.000712 -0.001470 0.001889 
+0.000828 0.000000 0.002345 0.000314 0.001643 0.000943 
+0.006023 0.003718 -0.003891 0.000470 -0.000395 -0.002070 
+-0.011052 -0.001755 0.004369 -0.003460 -0.010143 0.005200 
+-0.003771 -0.003444 0.003691 -0.001072 0.001393 -0.001800 
+0.002951 0.002209 -0.004408 0.005467 0.007106 -0.003443 
+0.004026 0.008828 -0.004948 0.005117 0.008402 -0.005385 
+-0.000855 0.007072 -0.004742 -0.002908 0.005215 -0.001970 
+-0.000922 0.000923 -0.001232 0.002621 0.003939 0.001093 
+0.001631 0.000327 0.000699 -0.000553 -0.001501 -0.001016 
+-0.002222 0.000000 -0.002222 -0.000147 0.000356 -0.000936 
+0.000280 -0.000571 0.001808 -0.002695 0.001216 -0.000102 
+-0.000464 -0.002087 -0.004095 -0.004301 0.005538 -0.001741 
+-0.000264 0.008444 -0.003178 -0.003270 0.005284 -0.002618 
+-0.003685 0.003771 -0.002943 0.000823 0.005802 -0.005851 
+0.003866 0.006147 -0.008890 0.010243 -0.000645 -0.007424 
+0.015306 0.000059 -0.001304 0.002921 0.009344 -0.007926 
+-0.005137 0.006344 -0.011228 -0.002140 0.003768 -0.008642 
+0.000164 0.001067 -0.005300 -0.001603 -0.000043 -0.003015 
+-0.002398 -0.001155 -0.001935 -0.000223 -0.000536 -0.001831 
+0.001302 0.000241 -0.002481 0.000235 0.000625 -0.001862 
+-0.000951 0.000623 -0.000736 -0.000913 0.000473 -0.001327 
+-0.000708 0.000594 -0.002232 -0.000198 -0.000707 -0.000979 
+0.000989 -0.001282 0.001752 -0.003708 0.003291 0.002136 
+-0.014686 0.001787 -0.008213 -0.003684 0.002454 -0.009096 
+0.003382 0.004011 -0.000173 0.006631 0.001665 0.002120 
+0.004109 -0.000034 -0.000318 0.000453 0.002877 -0.001954 
+0.000314 0.006132 -0.001590 0.001363 0.002827 -0.001297 
+-0.001197 -0.000707 0.000701 0.001905 -0.001284 0.000859 
+0.004310 0.000996 -0.007189 -0.001215 0.001215 -0.012430 
+0.001517 0.005088 -0.009104 -0.002198 -0.001161 -0.002012 
+-0.004297 -0.000944 0.000171 -0.000589 0.001665 -0.000069 
+0.003602 -0.002599 -0.002463 0.004232 0.003164 -0.001305 
+-0.001095 -0.001257 0.000633 -0.000028 0.000125 0.001008 
+-0.000319 -0.001451 -0.000357 -0.001909 -0.002992 0.000776 
+0.000742 -0.001805 0.000100 -0.000690 -0.001136 -0.001499 
+0.004008 0.001230 -0.001508 0.006499 0.004529 0.001895 
+0.004606 0.003772 0.001453 0.000407 0.000813 0.000813 
+-0.003371 -0.000867 0.001665 -0.001363 -0.000217 0.000492 
+0.000760 -0.000108 -0.002672 -0.000184 0.002035 -0.005390 
+-0.002132 0.003826 -0.004111 -0.001338 0.002007 -0.005580 
+-0.001334 0.000681 0.002567 0.002173 0.002450 0.000407 
+0.000072 0.004761 0.000422 -0.000928 0.005280 -0.001856 
+0.002177 0.001855 0.001855 -0.000164 0.003901 0.002278 
+0.001160 0.004863 0.002244 0.002218 0.004545 0.003018 
+0.000361 0.007812 -0.007135 0.009231 0.006611 -0.004479 
+0.001317 -0.001112 0.001383 -0.000075 -0.001252 0.002874 
+-0.005669 -0.002411 0.000326 -0.003060 0.004372 -0.003497 
+0.002277 0.004471 -0.006610 -0.000068 0.004320 -0.003506 
+-0.001094 0.001238 0.001792 -0.001269 -0.001135 0.003269 
+0.003146 0.008890 0.001328 0.010024 0.003368 0.002273 
+-0.001467 0.008397 -0.011403 0.001685 0.008562 -0.006899 
+-0.005943 0.001658 0.000903 -0.005070 -0.000434 0.001716 
+0.001083 0.001608 -0.002874 0.004108 0.003198 -0.007802 
+-0.005680 -0.008268 0.000372 -0.008558 0.007298 -0.019781 
+-0.002049 0.002844 -0.004260 -0.000393 0.003609 -0.002696 
+-0.000197 0.001644 -0.002883 -0.003718 0.000219 0.000292 
+-0.002895 -0.000805 0.000525 0.000490 -0.000026 -0.000164 
+0.001557 -0.000457 -0.001397 -0.000921 0.000477 -0.003672 
+-0.002066 0.001435 -0.003263 -0.000641 0.000924 -0.003024 
+-0.000645 0.000930 -0.003253 -0.000212 -0.000501 -0.004450 
+0.003520 -0.000323 -0.008515 0.013712 0.003072 -0.003772 
+0.005596 0.001486 0.002721 -0.000961 -0.004819 0.001980 
+-0.006512 -0.006526 0.006176 -0.003781 -0.002751 0.000956 
+-0.001573 0.002871 -0.006815 -0.001197 0.009597 -0.008999 
+-0.000932 0.009497 -0.009178 -0.003125 0.001673 -0.005562 
+0.001152 0.000863 -0.001789 0.000291 -0.000377 -0.002422 
+0.001756 -0.000653 -0.004108 0.004444 -0.000855 -0.003932 
+0.001921 0.002106 0.002838 0.002167 0.004333 0.000000 
+-0.000145 0.000992 -0.000109 -0.000361 0.001025 -0.002471 
+-0.000640 -0.001168 -0.003504 -0.001731 0.000883 -0.003868 
+0.000056 -0.001022 -0.001246 -0.000923 -0.001022 -0.001094 
+-0.001516 -0.001355 -0.001906 -0.001850 -0.002810 -0.002496 
+0.000350 -0.001711 -0.000619 -0.001614 -0.000636 -0.001738 
+0.003671 0.000024 -0.004689 0.005667 0.000535 -0.006260 
+0.003281 -0.001065 -0.004239 0.000566 -0.000522 -0.000771 
+0.001888 0.000674 -0.000173 0.003081 0.000259 -0.000686 
+-0.000232 0.000244 -0.000208 -0.003072 -0.001866 -0.002445 
+-0.000166 0.001085 -0.001300 0.002045 0.002600 -0.000919 
+0.003405 0.006214 0.003968 0.003691 0.004725 0.002378 
+0.003604 0.002803 0.000895 0.001745 0.005435 -0.002825 
+0.004331 0.001666 -0.003266 0.007224 0.001116 0.001233 
+0.006503 -0.000430 0.004662 0.006980 0.003789 0.000798 
+0.001831 0.004168 -0.000378 -0.001032 0.000914 0.000617 
+-0.002154 -0.000266 -0.001324 -0.002600 0.000730 -0.001597 
+-0.001688 0.000629 -0.004600 -0.000249 0.001112 -0.005405 
+-0.001536 0.001239 -0.002091 -0.000126 0.002101 -0.000520 
+0.000081 0.004950 0.001940 -0.003823 0.003864 0.003892 
+-0.001527 0.003067 0.003612 0.000456 0.002811 0.002552 
+-0.000222 0.001254 0.002128 0.001079 0.005038 -0.003210 
+0.002105 0.002051 -0.002842 0.001286 -0.001226 -0.001372 
+-0.001967 -0.006069 0.003164 -0.001559 -0.004355 -0.002443 
+0.001947 -0.000101 0.000912 -0.000206 -0.000357 -0.001631 
+0.000541 0.001149 0.000762 0.000754 0.001574 -0.000899 
+0.000182 0.000854 -0.001677 0.000462 0.000334 -0.001513 
+0.000985 0.000037 -0.002064 0.001564 0.001119 -0.003903 
+0.000488 0.002775 -0.003130 -0.000573 0.000682 -0.001812 
+-0.002939 -0.000441 -0.000232 -0.002298 0.001573 0.000255 
+-0.000334 0.000594 -0.000413 0.001999 -0.001558 -0.004852 
+0.008061 -0.004377 -0.013826 0.009803 -0.002671 0.001404 
+0.016557 0.007435 0.009030 0.008814 0.003721 0.005187 
+0.002799 0.002252 0.002089 0.001296 0.002243 -0.000134 
+-0.002070 0.000670 0.001044 -0.007433 0.000486 -0.004291 
+-0.001140 0.000490 -0.005307 0.001912 -0.001987 -0.001125 
+0.000000 -0.001084 -0.002892 -0.000026 0.000748 -0.003494 
+-0.000976 0.000918 -0.001412 -0.005284 -0.000520 0.002339 
+-0.004833 -0.001520 0.004406 -0.002730 -0.000305 0.001723 
+-0.000234 0.001567 -0.002233 0.002045 0.003053 -0.005098 
+0.003009 0.002269 -0.006435 0.004083 0.002299 -0.003678 
+0.001750 0.000150 -0.000050 -0.000769 -0.001608 -0.001177 
+-0.000187 -0.002334 -0.000794 -0.000826 -0.001439 -0.001241 
+-0.001800 -0.000694 -0.000742 -0.001013 -0.000018 0.000711 
+-0.001337 0.000362 0.000663 -0.002953 0.001763 -0.000429 
+-0.002423 -0.000476 0.001045 -0.001959 -0.000017 0.000966 
+-0.001160 0.002148 0.001303 -0.000450 0.003548 -0.000030 
+-0.001478 0.004981 -0.001533 -0.002782 0.005184 -0.005004 
+-0.005224 0.004554 -0.003985 -0.003488 0.003746 -0.001356 
+0.002665 0.001976 -0.000691 0.002495 0.000144 -0.005375 
+0.003955 0.003272 -0.003128 0.004394 0.006413 -0.003938 
+0.004209 0.006437 -0.002324 -0.000238 0.002741 -0.000156 
+0.001149 -0.000070 0.002661 0.003679 0.002967 -0.002211 
+0.000192 -0.000165 -0.004583 0.002979 -0.000732 -0.000361 
+0.000496 -0.002142 -0.001607 -0.001031 -0.001275 -0.005051 
+0.001681 -0.000452 -0.002148 0.000644 -0.001674 -0.000854 
+0.000819 -0.000343 0.000712 -0.000748 0.001737 -0.000070 
+-0.001703 0.004655 -0.004308 -0.002559 0.000591 -0.004675 
+0.003085 0.001325 0.000831 0.003849 0.001277 0.000342 
+0.004728 0.001234 0.001660 0.004041 0.005688 -0.008918 
+0.005029 0.009500 -0.002854 0.000511 0.000529 0.000088 
+-0.006288 -0.001588 0.005883 -0.007186 0.002915 0.008496 
+-0.003929 0.007835 0.002820 -0.001235 0.004722 0.001912 
+-0.001190 0.001250 -0.001349 0.001652 0.001662 -0.000428 
+0.004674 0.002921 -0.001842 0.005566 0.001822 -0.003501 
+0.003112 0.000321 -0.003503 0.001012 0.000058 -0.002840 
+0.000396 0.000119 -0.001885 0.000108 0.000028 -0.001534 
+-0.000650 0.000172 -0.002269 -0.000875 0.000423 -0.003065 
+0.003007 -0.000606 -0.006417 0.014802 0.002033 -0.002602 
+-0.005166 -0.001451 -0.010564 -0.007511 -0.002935 -0.007531 
+0.006779 0.003942 0.000737 0.004858 0.014801 0.004246 
+0.000413 0.008803 -0.000559 0.002129 0.006535 -0.003141 
+0.004206 0.004313 0.001524 -0.002812 0.001795 -0.003149 
+-0.000025 0.003021 -0.002791 -0.003857 -0.006958 -0.002798 
+0.001771 -0.008603 0.002778 -0.000631 -0.004670 0.003927 
+-0.001239 0.000040 0.003388 -0.003806 -0.000736 0.002025 
+-0.003405 -0.002103 0.001588 -0.002690 -0.000866 0.000209 
+0.000289 0.000604 -0.001864 0.002562 0.003178 -0.001932 
+0.003087 0.003111 -0.002809 0.004727 0.001950 -0.001139 
+0.001347 0.002578 -0.000223 -0.001859 0.002580 -0.002737 
+-0.000740 0.001500 -0.002974 -0.000393 0.000436 -0.002094 
+-0.000633 0.000604 -0.002251 -0.002007 0.000956 -0.002012 
+-0.003019 0.000566 -0.000160 -0.000280 0.001734 0.003053 
+0.000104 0.002093 0.000890 0.000934 0.000543 -0.002412 
+0.001909 0.000190 -0.004352 0.001277 0.002399 -0.003915 
+-0.001119 0.003269 -0.003441 -0.002132 0.002311 -0.003251 
+-0.002577 0.001524 -0.003194 -0.001152 0.002544 -0.002490 
+0.002400 0.001183 -0.001309 -0.001090 0.000378 0.000136 
+0.000270 0.003529 -0.003482 0.006402 0.007371 -0.004408 
+0.004186 0.000224 0.000286 -0.003509 0.003556 -0.002851 
+-0.001377 0.003070 0.002065 -0.000330 0.001436 0.000284 
+0.001369 0.002151 -0.003553 -0.001057 -0.000072 -0.003385 
+0.003088 0.000924 -0.001122 0.002761 0.000704 -0.000914 
+0.003532 0.002222 -0.002659 0.002193 -0.001327 -0.004329 
+0.000017 -0.000969 -0.001310 0.000176 -0.001536 0.000343 
+0.000182 -0.002593 0.000962 0.000640 -0.001348 -0.000856 
+0.002468 0.000906 -0.001360 0.006923 0.002623 -0.000694 
+0.004329 0.001558 0.001994 0.001329 0.004747 -0.008354 
+-0.004628 0.000915 0.000247 -0.002631 -0.001078 -0.001297 
+0.003067 -0.000087 -0.002080 0.000818 0.000085 -0.001647 
+-0.002462 0.000000 -0.000462 0.000550 -0.000114 -0.001466 
+0.005655 -0.001319 -0.005083 0.005171 0.003450 -0.013027 
+0.002314 0.004216 -0.016992 -0.005427 0.002006 -0.015815 
+-0.010958 -0.002372 -0.007168 -0.008759 -0.000953 -0.001608 
+-0.001644 0.000119 -0.000318 0.005404 -0.000933 -0.003820 
+0.013098 -0.000863 -0.013845 0.021105 0.023145 -0.015903 
+0.001365 0.019665 -0.017542 0.000053 0.010551 -0.011334 
+-0.002664 0.007277 -0.007634 0.003441 0.006976 -0.005974 
+0.002908 0.004565 -0.005923 -0.004931 0.002676 -0.000073 
+-0.002130 0.002533 0.000546 0.003077 0.003516 -0.003297 
+0.005917 0.008120 -0.000879 -0.003601 0.009302 -0.006801 
+0.006166 0.005253 -0.002238 -0.007458 -0.001406 -0.004982 
+0.001623 -0.004597 0.001703 -0.001545 -0.004779 0.004453 
+-0.000029 0.000716 0.000526 0.000093 0.001563 0.000927 
+-0.001028 0.001504 -0.001714 -0.000880 0.000497 0.002806 
+-0.001247 0.001191 0.000488 0.002125 0.000503 -0.000903 
+0.000929 0.000225 -0.000322 -0.001619 0.002171 0.000613 
+-0.001869 0.006279 -0.001002 0.000420 0.007743 -0.004742 
+0.002095 0.005629 -0.004472 0.003629 0.003462 -0.004327 
+0.001486 0.003358 -0.006214 -0.000127 0.005130 -0.006961 
+-0.000192 0.004431 -0.004173 -0.000802 -0.000654 -0.000617 
+0.000868 -0.000780 0.001044 -0.002300 -0.004749 0.000119 
+-0.003274 -0.003836 -0.002353 -0.006420 -0.002815 -0.001235 
+-0.004496 -0.000578 -0.002383 -0.001829 -0.000262 -0.000765 
+-0.000004 0.000600 0.000461 -0.001290 0.002479 0.001127 
+-0.000118 -0.000043 0.000968 0.001882 -0.000704 -0.000833 
+0.002758 -0.000339 -0.001557 0.001982 0.002355 -0.002601 
+-0.001164 0.001164 -0.003966 -0.000088 0.003422 0.000342 
+-0.002293 0.002078 -0.000254 -0.002776 0.002263 0.001169 
+0.002447 0.003008 0.001962 0.005088 0.003444 -0.001134 
+0.004207 0.001592 -0.002530 0.002755 -0.001054 -0.000945 
+0.002128 -0.002276 -0.000304 0.003200 -0.000032 0.000064 
+0.001837 0.005617 0.001478 0.000568 0.005499 0.000146 
+0.000843 0.001973 -0.000131 0.000823 -0.000006 -0.000392 
+0.000455 0.000163 -0.000447 -0.000762 0.005645 -0.001114 
+-0.001743 0.007972 -0.001885 -0.003280 0.003082 -0.006729 
+-0.002666 -0.000089 -0.001628 -0.000243 0.000790 0.000332 
+-0.001289 0.001366 0.000566 -0.002189 0.002030 0.001554 
+-0.001398 0.001671 -0.000782 -0.001497 0.002669 -0.000743 
+-0.000745 0.001019 -0.008353 0.004045 0.003739 -0.018920 
+0.011055 0.015389 -0.013645 -0.007772 0.001998 0.000192 
+-0.012423 0.001942 0.002653 -0.010355 0.005924 0.001647 
+-0.016410 0.000186 -0.000204 -0.004716 -0.008928 -0.001675 
+0.000264 -0.000857 0.002833 0.002377 0.003888 -0.003953 
+0.003495 0.001118 0.000884 -0.002073 -0.002644 -0.004027 
+0.000546 -0.003244 -0.009483 0.006323 -0.000988 -0.003635 
+0.003060 -0.002128 0.000191 -0.002498 -0.002544 -0.006206 
+0.001562 0.003016 -0.007143 0.003489 0.005618 -0.003478 
+0.000478 0.004812 -0.000136 -0.002698 0.002213 -0.004591 
+0.002264 -0.000077 -0.006166 -0.004170 0.003411 -0.003846 
+-0.002532 0.006946 -0.001426 -0.001946 0.006410 -0.000207 
+0.000101 0.004734 0.000376 0.001364 0.001833 -0.000268 
+-0.001439 0.000922 -0.003110 -0.000321 0.002918 -0.000166 
+0.000058 0.002293 0.001060 -0.000500 0.001500 0.000833 
+-0.000115 -0.000618 0.000158 -0.002647 -0.001445 0.000466 
+-0.004741 -0.000349 0.000022 -0.003608 0.003828 0.000051 
+-0.001804 0.005569 0.000392 0.000967 0.005595 -0.000547 
+0.004306 0.004915 -0.001675 0.004045 0.004727 0.000136 
+0.000577 0.003998 0.002135 -0.000630 0.002325 0.000373 
+-0.000026 -0.000009 -0.000146 -0.001838 0.000000 -0.000662 
+0.000602 0.001472 -0.002810 0.001850 0.002590 -0.004524 
+-0.002922 0.001011 -0.000944 -0.001913 0.001223 -0.000766 
+-0.004658 0.001232 0.001898 -0.002966 0.001013 0.003095 
+0.005746 -0.001261 -0.000380 0.003994 -0.001219 0.001083 
+0.002802 0.000648 -0.001380 0.001840 0.004320 -0.000400 
+0.006376 0.002711 0.000561 0.003958 -0.000029 -0.000879 
+-0.000083 -0.000161 -0.000724 -0.000250 -0.000400 0.000533 
+0.004176 0.003250 -0.000696 0.008080 0.001233 -0.001049 
+0.004745 0.003727 -0.003050 0.001844 -0.000902 0.000615 
+0.002593 -0.001058 0.000688 0.004729 0.001860 -0.002713 
+-0.001224 0.005461 -0.002072 -0.001302 0.003282 -0.001510 
+-0.001963 -0.001464 0.004508 -0.005146 -0.007090 0.004292 
+-0.005261 -0.006196 0.002630 -0.004913 -0.000374 -0.000137 
+-0.000615 0.002878 -0.002133 0.003551 0.002005 -0.003645 
+0.003368 -0.001814 -0.005895 0.001114 -0.003332 0.000260 
+-0.001019 -0.002898 0.002663 0.001762 -0.002988 0.003278 
+0.004742 -0.001390 -0.002522 0.004169 0.003790 -0.017309 
+-0.005295 0.009274 -0.023363 0.002686 0.007247 -0.000757 
+0.001129 0.002083 0.015568 0.000976 0.001082 0.021160 
+-0.000232 0.000930 0.018279 -0.005444 -0.000422 0.007639 
+-0.011314 -0.001886 0.000455 -0.005000 -0.004682 -0.014045 
+0.002806 0.000988 -0.010533 0.008934 0.005537 -0.005818 
+0.008232 0.008991 -0.007250 0.001560 0.004917 -0.006933 
+0.000900 -0.002573 -0.005679 0.000784 0.000768 -0.000369 
+0.001563 -0.000812 0.001682 -0.001253 0.000925 0.002332 
+-0.000940 0.003726 -0.000680 -0.002023 -0.000864 -0.000762 
+-0.003117 0.000641 -0.001468 -0.002303 0.002116 -0.001277 
+0.003902 0.005366 -0.005732 -0.001683 0.004865 -0.005150 
+-0.000338 0.006351 -0.001829 -0.000819 0.002583 0.000606 
+-0.001815 -0.000660 0.001165 -0.002725 -0.001083 -0.001072 
+-0.002607 0.003784 -0.004073 -0.002297 0.005855 -0.001077 
+-0.002317 0.001338 0.001553 -0.002742 -0.002501 0.001242 
+-0.001775 -0.004438 0.001479 -0.004056 -0.004402 0.002369 
+0.001291 -0.003697 0.001659 -0.002273 -0.000496 0.007810 
+-0.003024 -0.000926 0.002320 0.001858 0.001034 -0.000616 
+0.001111 -0.000107 -0.000159 -0.002504 -0.000954 -0.001192 
+-0.003699 0.000634 -0.001586 -0.002250 0.001796 -0.000583 
+-0.001992 -0.000973 0.001042 -0.000944 0.000272 -0.000615 
+-0.001319 0.000871 -0.001876 0.000054 0.005404 -0.004663 
+0.000448 0.009200 -0.002151 0.000247 0.007961 -0.003765 
+0.000024 0.005684 -0.003765 0.002433 0.000500 -0.002399 
+-0.001250 0.000000 -0.008203 0.000124 0.000204 -0.000658 
+-0.004016 -0.001953 0.001172 -0.001485 0.001235 -0.000293 
+-0.000155 0.000620 0.000620 0.003014 0.002810 0.000802 
+0.002944 0.003806 -0.000113 0.001720 0.001415 -0.000330 
+0.000000 -0.003058 0.000579 0.001488 -0.000959 -0.001917 
+0.000903 -0.001224 -0.003290 -0.001421 0.002397 -0.005067 
+-0.001104 0.003923 -0.007967 0.000314 0.006165 -0.003457 
+-0.000810 0.000471 0.003453 -0.002918 -0.003680 0.009618 
+-0.002544 -0.003744 0.010115 -0.004217 0.000206 0.002473 
+-0.001035 -0.006248 -0.001986 0.001319 -0.001180 -0.000253 
+-0.002292 0.001848 -0.001212 -0.003480 0.002307 -0.003118 
+-0.001288 0.004744 -0.005599 -0.002013 0.002763 -0.006873 
+0.001655 -0.000730 -0.002942 0.004499 -0.003125 0.001689 
+0.003828 -0.002860 -0.003895 -0.000129 -0.000750 -0.028470 
+-0.031644 -0.027021 0.047267 0.009517 -0.000085 0.036556 
+0.765152 -0.272727 5.507576 0.945813 -0.236453 6.339901 
+0.932039 -0.237864 6.373786 0.766423 -0.262774 5.510949 
+-0.000210 0.000074 0.027408 -0.001239 -0.006686 0.002362 
+-0.003814 -0.001969 -0.003892 0.007852 -0.002482 0.005350 
+0.010403 0.003639 -0.006039 0.012134 0.008935 -0.008357 
+0.005023 0.013438 -0.012006 -0.001390 0.007335 -0.008754 
+-0.001846 0.002447 -0.003162 -0.002151 0.000026 -0.000337 
+-0.000148 0.001757 -0.002400 -0.000415 0.001932 -0.000663 
+-0.000591 -0.002032 -0.000694 -0.001400 -0.000944 0.001541 
+0.000583 -0.000087 0.003705 0.001630 -0.001574 0.001286 
+0.001774 0.001021 -0.001841 0.000834 0.002061 -0.000164 
+-0.002444 -0.000672 0.000568 -0.004548 -0.001660 -0.001842 
+-0.002828 -0.000958 -0.002709 -0.001050 -0.000420 -0.001365 
+-0.001882 -0.001401 0.000060 -0.001158 -0.001837 0.000758 
+0.001151 0.001046 -0.000477 0.003330 0.003361 0.002243 
+-0.003044 0.002820 0.000804 -0.003944 0.002738 0.002977 
+-0.006693 -0.001013 0.000667 -0.002885 0.000073 -0.000432 
+0.002425 0.002946 -0.001559 0.001291 -0.000922 -0.004762 
+0.002324 0.000191 0.001708 0.005075 0.004462 -0.000634 
+-0.000408 0.002524 -0.003621 -0.002074 0.001919 -0.003022 
+-0.001309 0.000103 -0.003513 0.000832 0.001863 -0.002109 
+0.001924 0.002619 -0.002325 0.001955 0.003525 -0.004838 
+0.000943 0.003831 -0.007783 -0.005610 0.003146 -0.006431 
+-0.001384 -0.000187 0.001735 -0.000242 -0.000412 0.001381 
+0.000923 0.001897 0.000873 0.001861 -0.000958 0.000850 
+0.002019 0.001364 0.001112 0.000907 0.002687 0.001068 
+0.001662 0.003920 -0.000639 0.001471 0.002401 -0.002685 
+0.000694 -0.000278 -0.000278 -0.004781 -0.003959 0.001643 
+0.003763 -0.004300 0.003525 0.002663 -0.003188 -0.001787 
+0.004740 -0.001349 -0.002704 -0.000205 -0.000890 -0.003218 
+-0.000089 0.001242 -0.000398 -0.000689 -0.001486 0.000712 
+-0.003306 -0.003657 -0.003802 -0.007358 0.000108 -0.001911 
+-0.001443 0.000671 0.000559 -0.001029 0.000902 0.000247 
+-0.002390 0.001807 -0.000776 0.001670 0.002991 -0.001530 
+-0.001352 0.007420 -0.001956 -0.001689 0.006486 -0.008952 
+0.001162 0.003942 -0.017037 0.007886 0.000176 -0.019106 
+0.003376 -0.004747 -0.019832 -0.015975 0.006893 -0.075065 
+0.007446 -0.087889 0.077515 0.008693 -0.000902 0.043604 
+1.050633 -0.219409 7.295359 1.230576 -0.238095 8.057644 
+1.287736 -0.200472 7.962264 1.217993 -0.072664 7.062284 
+0.005226 0.004863 0.034623 0.001884 0.002046 -0.011102 
+-0.000570 0.013054 -0.005108 0.011933 0.000417 0.008205 
+0.007014 0.007454 -0.000196 0.001087 0.000000 -0.015870 
+-0.007726 0.008478 -0.002790 -0.000373 0.001973 -0.001983 
+-0.000297 -0.001719 0.002215 0.001142 0.001445 0.000492 
+0.000380 0.001833 -0.000780 0.001258 -0.001228 0.003283 
+-0.002925 -0.003666 0.001059 -0.006658 0.000688 -0.006204 
+-0.001223 0.005328 -0.006611 -0.002206 0.003668 -0.000036 
+-0.001006 -0.000105 0.000206 0.003310 0.000902 -0.000253 
+0.003165 0.001723 -0.001371 -0.000587 -0.000759 0.001376 
+-0.002830 0.001336 0.003539 -0.002031 -0.001094 -0.003594 
+-0.002127 0.002523 -0.001559 0.002890 0.007532 -0.004903 
+0.007485 0.004687 -0.007275 0.003657 0.004464 -0.008686 
+0.001627 0.007183 -0.007617 -0.000290 0.008684 -0.002768 
+-0.002352 0.003791 0.001261 0.000013 0.000840 0.002278 
+0.003307 0.001644 0.001824 0.004421 0.004755 -0.000826 
+0.001420 0.004321 0.001044 -0.002824 0.000057 0.000065 
+-0.004814 -0.001284 -0.000642 -0.001918 -0.003323 -0.000015 
+0.000596 -0.005207 0.002928 -0.001658 -0.005643 0.003633 
+0.001552 -0.001321 -0.000157 -0.000368 0.000360 -0.000655 
+-0.001120 0.000910 -0.003234 -0.004413 0.000972 -0.003366 
+0.001273 0.002059 -0.000304 -0.000982 0.000937 -0.001027 
+0.000069 0.000413 -0.000847 -0.000115 0.000158 0.000298 
+0.002470 -0.000781 0.001049 0.003038 0.003555 0.001207 
+0.000974 0.003307 0.000997 0.000078 0.001625 0.001158 
+-0.002000 0.000509 0.001363 0.000378 -0.000963 0.000406 
+0.001272 -0.001942 -0.001205 0.002443 0.000000 -0.001603 
+0.001033 -0.002316 -0.001301 0.001677 -0.002753 0.000070 
+0.000333 -0.003958 0.002708 -0.002059 -0.005926 0.006849 
+-0.004333 -0.007484 0.006300 -0.001929 -0.002136 0.004076 
+-0.001303 0.001639 -0.000837 -0.002072 0.005419 -0.003253 
+0.001757 0.005220 -0.003463 0.000101 0.004612 -0.001056 
+0.000949 0.001359 -0.001738 0.001842 -0.001903 -0.004010 
+0.002800 -0.002704 -0.005873 0.005333 -0.000889 -0.007556 
+0.006435 0.002012 -0.013382 0.023473 -0.019152 -0.022928 
+-0.030015 0.028399 -0.082605 0.006490 0.007097 0.046536 
+0.934694 0.036735 7.644898 1.010127 -0.065823 7.643038 
+0.963218 -0.009195 7.022988 0.820290 0.162319 5.866667 
+0.673267 0.371287 3.970297 0.000304 0.003118 -0.000219 
+0.004243 0.007874 -0.023088 -0.000986 0.006998 0.019121 
+-0.004383 0.008401 0.005612 0.002374 0.005830 -0.009981 
+-0.001171 0.001015 -0.005034 -0.005047 -0.001546 0.009544 
+0.002833 -0.002365 0.003990 0.003620 0.005269 -0.002893 
+0.008034 0.007685 -0.001120 0.002853 0.008274 0.003595 
+-0.000363 -0.001102 0.007726 -0.004748 -0.000654 0.002228 
+-0.002739 -0.000185 -0.009846 0.001670 -0.001734 -0.011993 
+0.003416 -0.001861 -0.003325 0.001281 0.003000 -0.003593 
+-0.000301 0.003780 -0.000517 0.000489 0.004730 0.000261 
+0.001015 0.005354 -0.000154 0.001587 0.006854 -0.002070 
+0.001531 0.007393 -0.004443 -0.000244 0.008268 -0.000732 
+-0.000868 0.000496 -0.000853 -0.000344 0.000115 -0.002290 
+0.001662 0.001251 -0.005024 -0.000567 0.006333 -0.005735 
+-0.001727 0.006034 -0.004414 -0.003238 0.004113 0.000788 
+0.000379 0.001051 0.006190 0.002345 0.001360 0.007424 
+0.002272 0.000973 0.003702 -0.002244 0.002054 -0.000202 
+-0.002446 0.000245 0.002324 -0.002675 -0.001478 0.004756 
+-0.006189 -0.003822 0.005826 0.000843 0.000512 0.004155 
+0.000394 -0.000401 0.000833 -0.000615 0.002000 -0.004000 
+-0.000595 0.007056 -0.005016 -0.004041 0.002756 -0.003761 
+0.004593 0.004987 -0.002100 0.006352 0.004351 -0.004897 
+0.006121 0.000498 -0.003737 0.003216 -0.000817 -0.001976 
+0.000600 0.000055 -0.000097 -0.002211 0.002003 -0.002127 
+-0.000747 0.003875 -0.004945 0.000122 0.004162 -0.007296 
+0.000030 0.004397 -0.008174 0.000266 0.004033 -0.007257 
+0.002155 0.003872 -0.003762 0.003798 0.000623 -0.000996 
+0.002332 -0.002915 0.000781 0.000523 -0.001288 0.000587 
+-0.000476 -0.000614 -0.003011 -0.001074 -0.000551 -0.005682 
+-0.002345 -0.003866 -0.001157 0.000393 0.000081 -0.000478 
+0.001642 0.002470 -0.001473 0.002806 0.000796 -0.003717 
+0.002057 0.000378 -0.003762 0.001230 0.000259 -0.002962 
+0.003939 0.004119 -0.003195 0.004803 0.001754 -0.002664 
+0.001401 0.002589 0.002241 -0.002152 0.003894 0.010815 
+-0.006244 -0.002710 -0.002917 0.010807 -0.015566 -0.065263 
+-0.009968 0.001119 -0.041759 0.005665 0.010646 0.026149 
+1.490476 0.623810 6.214286 1.343860 0.403509 6.263158 
+0.914286 0.332143 5.100000 0.305164 0.361502 3.267606 
+-0.003208 0.004355 0.012613 -0.002142 0.004582 0.002836 
+-0.018263 -0.012923 0.017337 -0.026352 0.005107 0.035205 
+-0.012047 0.006655 0.009883 0.009100 0.009189 -0.003745 
+0.017669 0.011569 -0.004333 0.024620 0.014809 -0.007160 
+0.027572 0.013795 -0.013089 0.014736 0.001849 -0.005163 
+0.001401 0.008877 0.002025 0.003809 0.004962 0.000274 
+0.004824 0.001787 0.000729 0.000281 0.002007 0.000302 
+-0.007085 0.001374 0.003113 -0.002181 -0.003050 -0.004418 
+0.001985 0.001373 -0.006014 0.000325 0.002397 -0.005687 
+-0.002417 0.003315 -0.000536 -0.000095 0.004014 -0.004137 
+-0.001246 0.005407 -0.004930 0.001280 -0.000726 -0.000454 
+0.001532 -0.001393 -0.001219 -0.001725 0.004720 -0.002156 
+0.004303 0.005788 -0.002668 0.003557 0.007115 -0.000458 
+-0.000258 0.003899 -0.002685 -0.001088 0.002616 -0.002329 
+-0.002379 0.002499 -0.003367 -0.002347 0.004297 -0.003984 
+-0.002110 0.004534 0.000457 0.002262 0.004262 -0.000907 
+0.002075 0.003834 0.000168 0.001437 0.004036 -0.001193 
+0.001572 0.003501 -0.000243 0.000574 0.000699 -0.000070 
+-0.003093 -0.001718 0.001905 -0.003308 -0.006085 0.003081 
+-0.004815 -0.006917 -0.000955 -0.005680 -0.004785 -0.003523 
+-0.000508 -0.001789 -0.005343 0.001095 -0.000385 -0.002002 
+0.004489 -0.000351 0.000854 0.000828 0.001362 -0.004723 
+-0.001216 -0.001172 -0.003692 -0.001344 -0.000489 -0.002955 
+-0.002369 -0.000159 -0.002440 -0.003590 -0.000025 -0.002432 
+-0.004587 -0.001270 -0.002197 -0.005873 -0.001385 -0.000111 
+-0.006899 0.000523 0.001544 -0.003753 0.002383 0.006285 
+-0.001836 -0.005019 0.005631 0.002437 -0.001207 0.001076 
+0.003629 0.002581 -0.003629 0.000449 0.001944 -0.006612 
+0.002294 -0.000844 -0.004655 0.005423 0.000506 -0.004054 
+-0.001371 0.004950 -0.000914 0.002823 0.011583 -0.007114 
+-0.003792 0.008923 -0.008031 -0.003056 0.005006 -0.009950 
+0.004918 0.003742 -0.009118 0.005007 0.011781 -0.002405 
+-0.003728 0.005267 -0.000818 -0.003362 -0.000025 -0.002944 
+-0.006917 -0.002692 -0.002907 -0.008531 -0.000827 0.001334 
+-0.006396 0.000368 0.002133 -0.001887 -0.002743 -0.008057 
+0.005191 -0.005768 -0.033058 -0.007436 -0.001287 -0.022879 
+-0.001346 0.000437 0.013033 -0.001492 0.004107 0.022511 
+-0.000079 0.004508 0.015600 -0.002061 0.002062 0.002021 
+-0.005905 0.003736 -0.016598 0.004457 0.000047 -0.013944 
+0.001994 0.001302 0.004209 -0.004796 0.003582 0.008544 
+-0.020878 -0.001579 0.005227 -0.012272 0.009358 0.002156 
+0.009952 0.007100 -0.009123 0.023364 0.011400 -0.014290 
+0.026945 0.018725 -0.010041 0.026008 0.024810 -0.014058 
+0.025323 0.015087 -0.015849 0.005634 0.001943 -0.004830 
+0.002185 0.003943 -0.000469 0.001509 0.003451 0.000177 
+-0.003105 -0.002321 0.002191 -0.000463 0.001969 0.003244 
+0.000324 0.000703 0.000119 0.002933 0.004575 -0.004461 
+-0.000116 -0.001266 -0.002048 0.000012 0.000806 -0.002985 
+0.002918 -0.002641 -0.002148 0.004178 -0.002303 -0.003460 
+0.004551 -0.000969 -0.002846 0.003808 -0.000074 -0.002213 
+-0.001120 0.006080 -0.003600 0.002320 0.004474 -0.005960 
+0.001279 0.001850 -0.002990 -0.000356 0.000476 -0.000057 
+0.000346 0.001187 0.000060 0.004775 0.005578 -0.003031 
+0.007250 0.001947 -0.000370 -0.001962 0.001216 -0.000283 
+-0.000127 -0.001605 -0.001599 -0.001781 -0.002793 0.001821 
+-0.002467 0.000074 0.000822 -0.002024 0.000468 -0.002305 
+-0.000545 -0.000462 -0.001073 0.000673 -0.000058 0.000519 
+0.001106 0.002183 0.001642 0.001768 0.003352 0.002049 
+0.004495 0.004844 -0.001265 0.000525 0.005249 0.001155 
+-0.002870 0.000213 0.004092 -0.000742 0.002210 -0.001359 
+0.003763 0.004573 -0.005422 0.006406 0.003053 0.000509 
+0.001339 0.000000 0.001339 0.001119 -0.003921 0.001491 
+0.001938 -0.001873 0.002655 0.001120 -0.000198 0.003063 
+0.001712 0.000790 0.003451 0.001086 0.000092 0.003028 
+-0.000239 0.000885 -0.000548 0.002298 0.003333 -0.002955 
+-0.000873 0.005735 -0.000469 -0.005347 0.003867 -0.005315 
+-0.000892 0.001813 -0.002653 -0.004214 0.002065 0.000655 
+-0.002086 0.000525 -0.008890 0.007842 -0.000685 -0.009589 
+-0.001084 0.013658 -0.012551 -0.002330 0.009098 -0.016904 
+-0.001452 0.000556 -0.007588 -0.003996 0.004384 0.002709 
+-0.003383 0.006385 0.000483 -0.000254 0.002894 -0.007169 
+0.003312 0.005610 -0.005422 0.002117 0.001955 -0.003876 
+-0.002640 0.000045 0.000279 -0.005998 0.000616 0.000706 
+-0.004197 -0.000435 -0.001559 0.001936 -0.001607 -0.006053 
+0.007003 0.003722 -0.011800 -0.001595 0.000686 -0.016145 
+0.000498 -0.002371 -0.011627 0.001169 0.000800 -0.005357 
+-0.001186 -0.000263 -0.000998 -0.000053 -0.001166 -0.002484 
+0.000395 -0.001093 -0.004503 0.001192 -0.000002 -0.006228 
+0.000805 0.000020 -0.004560 -0.005040 -0.001250 -0.002109 
+-0.000989 0.000095 -0.004526 0.003894 0.006440 -0.009860 
+0.007006 0.009497 -0.012521 0.013193 0.000729 -0.018244 
+3.159575 2.101064 -1.553192 3.421429 2.678571 -1.785714 
+0.018177 0.019461 -0.004949 0.013379 0.006923 -0.003569 
+0.010348 0.004255 -0.002949 -0.000625 0.001415 0.000858 
+-0.003114 -0.001281 -0.002500 0.003401 0.005366 -0.005869 
+-0.000186 0.007223 -0.008600 0.003335 -0.001785 -0.000869 
+0.001086 0.000574 0.001127 -0.000404 -0.000051 -0.000707 
+0.000373 0.003060 -0.003060 0.003853 0.003513 -0.001175 
+0.002914 0.004825 -0.000078 0.001715 0.003509 -0.001747 
+0.002258 0.000336 -0.000362 0.001566 -0.000202 0.001299 
+0.001181 0.003064 0.001658 -0.001013 0.000090 0.001229 
+-0.000225 0.000923 0.001811 -0.002217 0.001138 0.001412 
+-0.001682 -0.000061 -0.000649 0.001073 -0.001596 0.003617 
+0.001109 0.004074 -0.000303 0.000286 0.009137 -0.000349 
+-0.002960 0.008320 -0.002960 -0.003697 0.001445 -0.003899 
+-0.003507 -0.002754 -0.003907 -0.003215 -0.001061 -0.003206 
+-0.003924 -0.000625 0.000712 -0.001013 0.003770 -0.001688 
+0.001094 -0.001682 0.000121 0.005577 0.003842 0.002036 
+0.009023 0.003476 -0.000185 0.007328 0.003282 -0.001298 
+0.002687 0.003230 -0.002204 -0.000380 0.002097 0.001204 
+0.000487 -0.001048 0.003107 -0.004156 -0.002928 0.002685 
+-0.001102 0.001020 0.001551 -0.001677 0.004249 -0.000700 
+-0.003597 0.001975 -0.001339 -0.003252 0.003740 -0.001463 
+-0.004152 0.002267 -0.001630 -0.000107 0.002907 -0.002773 
+-0.000483 0.000058 -0.004435 -0.001977 -0.000524 -0.003334 
+0.001444 -0.002318 -0.002275 0.004553 0.003126 -0.025370 
+0.004214 0.003600 -0.027405 0.001300 -0.006961 -0.010953 
+-0.002951 0.003787 -0.008622 0.000880 0.001280 0.000400 
+0.004522 0.000818 -0.002841 -0.002267 0.001142 -0.010140 
+0.001571 0.004623 -0.014653 0.000000 0.010720 -0.007520 
+0.002486 0.010013 -0.002935 0.000356 0.009308 0.000489 
+-0.000319 0.004240 0.001961 0.002569 0.002676 -0.002516 
+0.000466 -0.000646 -0.002713 -0.002021 -0.001838 -0.003128 
+-0.004422 -0.001460 -0.004611 -0.005605 0.000111 -0.004849 
+-0.003903 0.000774 -0.003086 -0.002132 0.000605 -0.000798 
+-0.000248 0.000001 -0.000491 0.001236 0.000171 -0.003114 
+0.004923 0.002553 -0.004689 0.005574 0.004089 -0.003768 
+0.002931 0.002839 -0.004148 0.002414 0.004236 -0.004834 
+0.006116 0.007421 -0.004918 0.014025 0.010241 -0.005613 
+0.025289 0.014550 -0.011196 3.129214 1.994382 -1.550562 
+0.022043 0.022688 -0.010688 0.011532 0.013014 -0.001895 
+0.007466 0.007489 -0.000018 0.003927 0.003016 0.000974 
+-0.006944 0.001573 0.000966 -0.000142 0.000820 -0.000320 
+0.000108 0.000735 -0.000248 -0.000159 0.001308 -0.000647 
+0.000053 -0.000176 -0.000044 -0.000087 -0.000492 0.000456 
+0.000744 0.000698 0.002000 0.000382 0.003481 0.001160 
+-0.001321 0.002630 0.003804 -0.000008 0.000420 0.002176 
+0.000190 0.000178 0.000062 0.002750 -0.000383 -0.002522 
+0.000292 -0.000156 0.000416 0.002857 0.000070 0.000670 
+0.004742 0.001369 -0.000445 0.005137 0.001602 -0.000519 
+0.001791 -0.000331 0.000069 -0.001197 0.001322 0.000194 
+-0.002272 0.001877 0.000198 0.001428 0.003302 -0.000304 
+0.002719 0.003145 0.001114 0.001447 0.000692 0.001006 
+0.000437 -0.002431 0.000341 -0.001093 -0.000901 0.002316 
+-0.000543 0.001395 -0.000698 0.001444 0.005459 -0.000814 
+-0.002617 0.002548 0.000237 -0.001396 0.002892 0.002347 
+0.004038 0.002207 0.000450 0.006191 0.001463 -0.002702 
+0.003413 0.000000 -0.004127 0.002280 0.005248 -0.002545 
+0.004436 0.001765 -0.001407 0.002138 0.000603 -0.002724 
+-0.000336 0.001849 -0.001597 0.000429 0.000480 -0.000234 
+-0.003226 0.002010 -0.003015 -0.001095 0.000720 0.002002 
+-0.000479 -0.004170 0.006529 0.003238 -0.003789 0.007702 
+-0.001367 -0.007342 -0.002707 -0.007194 0.003011 -0.005256 
+-0.005963 0.010661 -0.010796 -0.003488 0.010729 -0.004952 
+0.000273 -0.000428 -0.000872 -0.001254 -0.000707 0.005323 
+-0.001814 -0.001535 0.005780 -0.000445 -0.000891 0.000940 
+0.000835 0.002181 -0.003665 0.000907 0.004877 -0.005784 
+-0.001336 0.004820 -0.006062 -0.001050 0.004876 -0.002184 
+0.002623 0.002794 0.000349 0.000656 0.002246 -0.005329 
+-0.001908 0.002137 -0.002214 0.000974 -0.001558 -0.000565 
+0.003126 -0.000659 -0.004611 0.004817 -0.000999 -0.005759 
+0.003710 -0.001402 -0.003877 0.002702 0.000362 0.000235 
+0.000906 -0.000055 -0.000352 0.001957 -0.000675 0.001991 
+0.000344 0.001332 -0.001138 0.002146 0.002071 -0.002222 
+0.002870 0.001180 -0.000733 0.003922 0.001507 -0.001329 
+0.002101 0.000000 -0.001667 -0.000720 -0.001218 -0.000691 
+-0.001631 0.001018 0.001360 -0.005229 -0.001235 0.001182 
+0.001633 0.000149 0.000706 0.011753 0.005268 -0.001988 
+0.015165 0.007950 -0.007825 0.007388 0.010631 -0.010784 
+-0.001396 0.011769 -0.007163 0.004934 0.010341 -0.007907 
+-0.000032 0.001217 0.000890 -0.003194 0.002242 0.000067 
+0.000346 0.002138 -0.000929 0.002632 0.002492 -0.003930 
+-0.000616 0.001730 -0.002560 -0.003178 -0.000465 0.001550 
+-0.002636 0.001550 0.001705 0.000062 0.005590 -0.002850 
+0.003912 0.007824 -0.002206 0.001182 0.003540 -0.001658 
+-0.000481 -0.000551 0.001099 0.000369 -0.000369 0.000820 
+-0.000597 0.002133 -0.001106 0.000421 0.002824 0.000562 
+0.003969 0.000000 0.000000 0.002977 -0.001603 0.000458 
+-0.000014 -0.000146 -0.000108 -0.000061 0.002619 -0.001066 
+-0.002084 0.001619 0.000277 -0.000402 -0.001287 -0.000869 
+0.000740 -0.004950 0.001196 -0.000472 -0.005623 0.003132 
+-0.005207 -0.003223 0.001983 -0.005692 -0.001738 0.002315 
+-0.003437 0.000818 -0.000348 -0.001560 -0.000319 0.006259 
+-0.003879 -0.000635 0.003327 -0.007188 -0.000531 -0.002195 
+-0.004637 0.001535 -0.001502 0.001258 0.001844 -0.001150 
+0.003701 0.000345 -0.004030 -0.000489 0.000080 -0.001958 
+0.001498 -0.001403 -0.002306 -0.000252 -0.000933 -0.001748 
+-0.003236 -0.003028 0.001225 -0.006525 -0.000326 -0.000489 
+-0.001469 0.000928 0.001894 -0.004000 -0.000330 0.000605 
+0.000538 -0.003610 0.001591 0.002681 -0.002214 0.005074 
+-0.003211 0.001107 0.000443 -0.010342 0.003266 -0.011714 
+-0.012514 0.011289 -0.020509 -0.010314 0.011806 -0.016234 
+-0.004460 0.004926 -0.005413 -0.002437 -0.003271 0.003484 
+-0.001060 -0.001862 0.004097 -0.001219 -0.000210 -0.002555 
+-0.002946 0.000551 -0.003773 -0.001484 0.001182 -0.003151 
+0.001747 0.003679 -0.002841 0.005238 0.006984 -0.001746 
+0.005543 0.006495 0.001241 0.003117 0.010069 -0.011749 
+0.003010 0.006328 -0.008570 0.000123 0.003973 -0.005405 
+-0.001971 0.003394 -0.002606 -0.002088 0.003481 -0.001509 
+-0.002028 0.002480 -0.002031 0.000071 0.001861 -0.004354 
+0.002479 0.004481 -0.005562 -0.000327 0.002825 -0.006425 
+0.001378 -0.000069 -0.004186 0.000218 -0.001110 -0.000969 
+0.000461 -0.000277 -0.000143 0.002608 -0.001183 -0.001062 
+0.004299 0.001444 -0.002906 0.004122 0.003664 -0.003206 
+0.003723 0.004997 -0.007278 0.002291 0.003785 -0.008764 
+-0.003380 0.001876 -0.000530 -0.008426 -0.005883 0.003044 
+-0.001594 0.000891 -0.000541 0.007183 0.013818 -0.004809 
+0.012823 0.022044 -0.011438 0.009255 0.015241 -0.012089 
+-0.001232 -0.002292 0.002200 -0.006417 -0.012096 0.010162 
+-0.005599 -0.005965 0.005990 -0.003417 0.001899 -0.000532 
+-0.003136 0.002253 -0.002938 -0.000309 0.000357 -0.000199 
+0.001378 -0.000729 0.003650 -0.005474 -0.001579 0.000246 
+-0.001005 -0.000200 0.000932 0.002223 0.004424 -0.000526 
+0.003008 0.003291 0.002116 0.000821 0.000602 0.001687 
+0.001198 0.000729 0.001927 0.000649 -0.000252 0.000011 
+0.001085 0.001599 0.000505 0.001473 0.003056 0.002778 
+-0.001091 -0.000592 0.000971 -0.004300 0.000382 0.000885 
+-0.005064 -0.001479 -0.000025 -0.000152 0.000076 0.000152 
+0.000437 -0.000875 -0.001172 0.001186 0.003401 0.002010 
+0.004202 0.004958 0.000000 0.002878 0.003515 0.001594 
+0.000565 -0.000271 0.000948 -0.000468 0.001218 0.001030 
+-0.004765 0.002863 -0.000102 0.000352 -0.000526 0.001066 
+0.000006 -0.001457 0.002178 0.000631 0.000906 -0.001055 
+0.001541 0.002320 -0.004065 0.001247 0.004824 -0.002575 
+0.000387 0.000349 -0.001696 -0.002836 -0.000534 -0.001891 
+-0.001235 -0.002776 0.001078 0.001751 -0.002174 0.001511 
+0.000139 -0.000472 0.001332 0.001061 -0.000157 0.001572 
+0.001896 -0.001463 0.004246 0.003061 -0.004860 0.003724 
+-0.001422 0.002793 -0.007506 -0.007033 0.018955 -0.018657 
+-0.014229 0.021325 -0.020537 -0.010281 0.013575 -0.019428 
+-0.001846 0.007835 -0.009982 0.000638 -0.002496 0.002471 
+0.004048 -0.006475 0.005994 -0.002228 -0.001998 0.001805 
+0.001525 0.002413 -0.003983 -0.003144 0.003984 -0.002515 
+-0.001080 0.001932 0.000568 -0.003265 -0.000612 0.000510 
+-0.003284 -0.001122 -0.000381 0.000451 -0.000662 -0.000022 
+0.002932 0.000751 0.002195 0.000891 -0.000891 -0.002248 
+-0.002519 0.000998 -0.004814 -0.004389 0.001964 -0.006524 
+-0.005216 0.000399 -0.004692 -0.000240 0.000632 -0.002975 
+-0.001134 0.002115 -0.000595 0.000944 0.002127 0.001374 
+0.001260 0.002358 -0.000858 -0.002395 0.001068 -0.000902 
+-0.003976 0.000067 -0.002806 0.001899 0.002100 -0.002647 
+0.003042 0.007223 -0.004087 0.000149 0.008907 -0.002820 
+-0.001979 0.005286 -0.002630 -0.000584 0.004974 -0.000288 
+0.000842 0.001091 -0.000712 0.000022 0.000495 -0.002331 
+0.002641 -0.002799 -0.003450 0.003169 -0.001848 -0.002501 
+0.002248 -0.000052 -0.001903 0.001067 0.002634 -0.001210 
+0.000319 0.001522 -0.000404 0.000451 0.002384 -0.004608 
+0.001066 0.003975 -0.007118 0.000569 0.002669 -0.004056 
+0.000444 -0.000607 0.002225 -0.004617 -0.000185 0.006652 
+-0.006700 0.002805 0.006076 -0.004467 0.004526 -0.001489 
+0.001221 0.007015 -0.000911 0.003600 0.005655 0.002364 
+0.001288 0.004781 0.001912 -0.001846 0.001970 0.000205 
+-0.002670 0.000528 -0.000851 -0.001215 0.003534 -0.001822 
+-0.001523 0.001835 0.000356 0.002180 -0.000576 0.000206 
+0.004488 0.001795 -0.002411 -0.000470 0.002084 -0.000933 
+-0.002675 0.000923 -0.001443 -0.003252 0.002748 -0.000779 
+-0.002366 0.003280 0.000914 0.000808 0.002195 0.002599 
+0.003306 0.001149 0.003446 -0.000147 -0.000619 0.004481 
+-0.001902 -0.000475 0.007333 -0.005060 0.005636 0.006363 
+0.003396 0.002173 0.003526 0.004020 0.003833 0.003786 
+0.003466 0.004986 0.002865 0.003258 0.000602 0.002412 
+0.004287 -0.000291 -0.002866 -0.000166 -0.004061 -0.001541 
+-0.003272 -0.004923 0.001233 -0.003716 -0.001664 0.001077 
+-0.001245 0.000501 -0.002231 -0.001613 -0.000565 -0.002177 
+-0.002960 0.005660 -0.004407 -0.004405 0.001159 -0.004641 
+-0.001677 0.002130 -0.001231 0.002673 -0.005075 0.002957 
+0.000899 -0.002060 0.000870 -0.007884 0.014747 -0.011136 
+-0.009381 0.022338 -0.016920 -0.008713 0.015922 -0.017807 
+-0.005301 0.009079 -0.007170 0.001146 -0.002939 0.001367 
+0.000466 -0.006036 0.001165 -0.000494 0.003875 -0.005640 
+0.003563 0.005817 -0.008363 0.000460 0.000735 -0.004311 
+-0.000045 0.000272 0.000458 -0.004478 -0.000553 0.002489 
+-0.001732 -0.001609 0.000828 0.003847 0.002191 -0.002459 
+-0.001177 0.004219 -0.005594 0.001744 0.004563 -0.007023 
+0.000945 0.005303 -0.005227 0.001604 0.005406 -0.005224 
+0.008377 0.003368 -0.001655 -0.002744 0.002816 -0.000280 
+-0.002669 0.003104 0.000241 -0.000730 0.001770 0.000297 
+0.002748 0.002781 -0.001982 0.003479 0.005797 -0.001739 
+0.000055 0.004720 0.000046 -0.000554 0.004113 0.000113 
+-0.000904 0.005649 -0.000517 0.003936 0.007955 -0.003149 
+0.000484 0.008189 -0.006286 -0.000613 0.005462 -0.001840 
+-0.000513 0.002518 -0.001223 0.000033 0.003970 -0.004538 
+0.001965 0.002919 -0.009130 0.006135 0.003978 -0.004243 
+0.000999 0.001751 -0.000629 -0.001942 -0.002722 0.001792 
+0.000932 0.001364 -0.003893 0.006445 0.005993 -0.011188 
+0.006596 0.007376 -0.012745 0.002768 0.007620 -0.008957 
+0.002623 0.006068 -0.005092 0.002798 0.000463 -0.002806 
+-0.002357 -0.000689 -0.002320 -0.003871 0.001420 -0.002322 
+-0.002907 0.001284 0.001471 -0.001582 -0.001160 0.001137 
+0.002627 0.000079 -0.000700 0.004045 0.000502 -0.000477 
+0.001558 0.001562 -0.000001 0.000378 0.002383 -0.001518 
+0.000447 0.002517 -0.001857 -0.001446 0.001112 -0.001245 
+-0.000483 -0.000494 0.001332 0.000342 0.000391 0.001503 
+-0.000833 0.002161 0.001764 -0.001722 0.001483 0.000502 
+0.000193 0.001992 -0.003342 -0.000210 -0.001981 -0.002812 
+-0.001676 -0.000390 -0.001057 -0.002272 0.002700 0.001202 
+-0.002174 0.004116 0.001010 -0.002717 0.002445 -0.001449 
+-0.003326 -0.001169 0.000404 -0.000403 0.000323 0.000306 
+0.000284 0.003481 0.001716 0.002946 0.004383 -0.001078 
+0.000229 0.000305 0.000534 0.003386 0.006220 -0.007402 
+0.007020 0.001285 -0.004350 0.002951 0.000889 0.000593 
+0.001732 0.000201 -0.002159 0.001118 -0.002355 0.000978 
+-0.002148 -0.002846 -0.001432 -0.001413 0.002883 0.000982 
+0.000699 0.002877 0.004726 0.006379 -0.000384 0.007347 
+0.002541 0.004223 0.004332 -0.004349 0.010791 -0.004375 
+-0.007635 0.010019 -0.011049 -0.009146 0.004905 -0.007369 
+-0.003743 0.001907 0.001154 0.004011 -0.002252 0.004151 
+0.005794 -0.001227 0.004737 0.005847 0.005223 0.001079 
+0.004494 0.005311 0.003385 0.001910 0.003218 -0.000166 
+-0.002009 -0.002723 -0.002186 -0.008356 -0.001241 -0.001272 
+-0.004066 0.000778 0.001864 -0.000831 0.000399 0.000254 
+-0.001856 0.002601 -0.000816 -0.000087 0.003495 -0.006095 
+-0.002242 0.007052 -0.003409 0.000288 0.005820 0.000818 
+-0.000444 0.000724 0.001100 0.001065 -0.000701 0.000078 
+0.002054 -0.000663 0.001725 -0.000648 -0.000031 0.004193 
+-0.003432 -0.001085 0.003551 -0.001127 0.001196 -0.001092 
+0.000770 0.004620 -0.002698 0.000000 0.007752 -0.003566 
+0.001344 0.006565 -0.002687 -0.003379 0.002117 -0.003785 
+-0.000703 0.001836 -0.003789 0.001014 0.000481 -0.000346 
+-0.002400 0.002603 0.001287 -0.002051 0.003797 0.001521 
+-0.005158 0.000585 -0.002294 -0.000087 -0.001729 0.000509 
+-0.002032 -0.003768 0.003163 -0.005060 -0.002269 0.002828 
+-0.004945 0.004045 -0.002606 -0.000502 0.006052 -0.005172 
+0.003397 0.005151 -0.004474 0.005246 0.002801 -0.001936 
+0.003039 -0.001041 -0.005287 0.001496 0.000113 -0.002753 
+0.000249 -0.000057 0.000204 -0.000320 0.000544 0.001088 
+-0.000692 0.000934 -0.000220 -0.000315 -0.000266 -0.000503 
+0.000122 -0.000976 -0.001204 -0.002857 -0.001598 0.000215 
+-0.003266 -0.000922 0.001507 -0.001460 0.002222 -0.000730 
+-0.000236 0.004205 -0.002346 0.001409 0.003974 -0.001452 
+0.002008 0.002970 0.000505 0.002312 0.002700 0.001974 
+0.001936 0.002661 0.001798 0.003907 0.001720 0.001007 
+0.001339 0.004953 -0.003083 -0.002643 0.004362 0.001411 
+0.000703 0.000251 0.002506 0.003147 0.001431 -0.000430 
+0.002440 0.003520 -0.000920 0.001129 0.003742 -0.007484 
+-0.002994 -0.000310 0.004005 -0.003835 0.001203 0.000000 
+0.000000 0.002077 -0.003308 0.000116 0.002871 -0.003449 
+-0.000950 0.003442 -0.000090 -0.001974 0.002522 0.000410 
+0.000305 -0.001475 -0.002581 0.000679 0.004921 -0.005498 
+0.002874 0.002857 -0.002863 0.000244 -0.000122 0.000458 
+0.000133 0.001678 0.001838 -0.000027 0.001282 0.000458 
+0.000291 0.001033 0.000561 0.006821 0.003187 -0.001949 
+-0.000908 0.002981 -0.000249 -0.000242 0.003690 0.000064 
+0.002177 0.004766 -0.000906 0.003975 -0.001400 -0.003727 
+0.003229 -0.002293 -0.000660 0.001000 -0.004833 0.001917 
+-0.001402 -0.001295 0.002485 -0.002061 -0.000615 0.000434 
+-0.003153 0.001991 -0.002247 -0.003472 0.002694 -0.004694 
+-0.001265 0.001963 -0.004769 0.001678 0.001242 -0.001842 
+0.003523 0.001556 0.001984 0.002949 0.000656 0.003276 
+-0.001084 -0.000067 0.002337 -0.000968 0.001183 -0.000079 
+-0.001346 0.000872 -0.001461 0.002034 0.004067 -0.001176 
+-0.000824 0.002272 0.000734 -0.000661 0.003265 0.000399 
+0.001425 0.003368 -0.001036 -0.000785 0.002749 0.000222 
+0.000000 -0.000775 0.002403 -0.000710 -0.003065 0.003551 
+-0.000161 -0.001452 -0.000323 0.000000 0.003281 -0.002109 
+0.006398 0.005663 -0.000147 0.003350 0.004623 0.002137 
+0.001853 0.002742 0.000313 0.000981 0.001616 -0.003896 
+-0.000297 0.002672 -0.002636 0.003046 0.003421 -0.000400 
+-0.000026 0.000017 -0.000515 0.001126 0.001007 -0.001554 
+-0.002076 -0.003268 -0.001707 -0.006328 -0.000908 -0.003044 
+-0.004313 0.005056 -0.001869 -0.001513 0.008821 -0.001187 
+-0.000559 0.009016 0.000805 -0.000848 0.006328 0.002088 
+-0.000635 0.002738 0.002738 -0.000409 0.001250 0.002043 
+-0.000770 0.000222 0.001371 -0.000211 0.000169 0.000752 
+0.000243 0.000452 0.001077 0.000884 0.001768 0.001768 
+0.002112 0.001722 0.000377 0.000522 0.000554 -0.000196 
+-0.003559 -0.001068 0.000652 -0.002593 0.000386 -0.001203 
+0.000015 0.001231 0.000426 0.000098 0.001418 0.000065 
+-0.000654 0.000903 0.000935 -0.000450 -0.000565 -0.001151 
+-0.001359 0.000041 -0.001943 -0.000794 0.001526 -0.001735 
+0.000168 -0.000420 0.000000 -0.001792 -0.000167 -0.001458 
+-0.002499 -0.000541 -0.000764 -0.001542 0.002144 -0.002453 
+0.000425 0.005704 -0.001760 -0.001240 0.004011 -0.000073 
+-0.005487 0.000751 0.002939 -0.004165 0.000434 0.003534 
+-0.001701 -0.000159 0.001502 0.000222 -0.000329 -0.000560 
+-0.001842 0.001382 -0.001288 -0.006950 -0.004973 0.000999 
+-0.002975 -0.007786 -0.002125 -0.000025 -0.005329 -0.002146 
+-0.000365 -0.003646 0.003464 0.000962 -0.001427 0.002190 
+-0.000058 0.001883 0.001425 -0.001837 0.003317 -0.001361 
+-0.003078 0.005343 -0.002956 0.004242 0.005812 -0.007658 
+0.000321 0.002912 0.001656 0.000364 0.002556 0.001911 
+-0.000810 0.001824 -0.003449 0.001837 0.007909 -0.003552 
+-0.000509 0.009124 -0.005868 0.007864 0.004242 -0.006803 
+-0.000960 -0.000051 -0.002449 -0.002202 -0.002205 0.004772 
+-0.006481 -0.004620 0.004934 -0.001519 -0.002651 -0.000145 
+-0.002194 0.002439 -0.003016 -0.005366 0.001233 -0.004380 
+-0.005364 -0.000598 -0.004467 -0.004201 -0.003455 -0.001937 
+-0.000946 -0.001744 -0.000573 0.005290 0.004312 -0.009198 
+0.007513 0.006982 -0.009638 0.002489 0.002900 0.001710 
+-0.000279 0.001702 -0.000021 -0.001732 0.001024 -0.001417 
+-0.002953 0.001984 -0.002187 -0.003435 0.003608 -0.000895 
+-0.001777 0.004371 -0.000852 -0.000662 0.001916 0.001847 
+0.000856 0.002656 -0.003895 0.004147 0.004147 -0.002558 
+0.003761 0.000909 -0.001754 0.000873 -0.000175 -0.001769 
+-0.001271 -0.002543 -0.002946 0.000152 -0.002333 -0.004092 
+-0.000613 -0.000613 -0.002453 0.000702 0.002207 -0.000184 
+-0.001921 -0.000161 0.001248 -0.000335 -0.004526 0.003012 
+-0.003553 -0.004304 0.001994 0.000215 0.002558 0.001241 
+0.001161 0.013277 0.002213 0.007116 0.012581 0.002716 
+0.006150 0.007633 0.001943 0.004577 0.003595 0.001058 
+0.002885 0.004122 -0.000824 0.000000 0.004453 -0.002500 
+-0.001559 0.000142 -0.002694 0.000077 -0.001671 -0.000668 
+-0.000025 -0.002417 0.000331 -0.000651 -0.002983 0.001097 
+-0.000896 -0.003518 0.000830 -0.004740 -0.003654 0.002717 
+-0.004702 -0.001544 0.000983 -0.001808 -0.000765 -0.001795 
+-0.001605 0.000706 -0.004365 -0.000193 -0.000773 -0.005024 
+-0.002862 -0.000456 -0.001486 -0.001905 0.002995 0.000027 
+0.001595 0.005338 -0.001712 0.004254 0.006834 -0.004902 
+0.006522 0.006903 -0.006250 0.005395 0.007497 -0.002435 
+-0.000263 0.005424 0.000788 -0.001884 0.000886 0.000966 
+-0.000436 -0.000604 0.001934 -0.000805 0.002109 0.001803 
+-0.000844 -0.000079 0.000730 -0.001937 -0.000555 0.000649 
+-0.002944 -0.000689 -0.000584 -0.003029 0.000093 -0.001561 
+-0.001585 0.001518 -0.001370 0.000229 0.004122 -0.000229 
+0.000115 0.006813 -0.001881 0.002929 0.003814 -0.000477 
+-0.002273 0.002553 0.001632 -0.002493 -0.000347 0.001304 
+0.001869 0.001791 0.003666 0.001652 0.004720 0.004453 
+0.000730 0.008171 0.002043 0.001139 -0.000788 -0.000203 
+0.001235 -0.002194 -0.001153 0.000295 -0.002351 -0.001544 
+-0.002004 -0.002221 -0.000951 -0.000188 0.001095 -0.002053 
+-0.002664 -0.001314 -0.003645 -0.000041 0.000249 0.000035 
+0.003641 0.004266 -0.002861 0.004352 0.001599 -0.006173 
+0.004797 0.004258 0.000710 0.003683 0.004840 -0.002591 
+0.001958 0.003583 -0.001958 -0.000085 0.000339 0.000339 
+0.000211 0.000147 0.000474 0.000701 0.000877 0.001227 
+0.001368 0.002811 0.001747 0.003386 0.002848 0.000155 
+0.002953 0.001369 -0.002030 0.001580 -0.000179 -0.003010 
+0.000601 0.001950 -0.003453 0.002486 0.003566 -0.002216 
+0.000086 0.001792 -0.003755 0.003390 -0.000094 -0.001224 
+0.005951 0.000225 -0.001834 0.009264 0.001025 -0.005152 
+0.002389 0.002994 0.001943 0.002657 0.003425 0.002185 
+0.001870 0.003740 0.001870 -0.002101 0.003739 0.000357 
+-0.000614 0.001591 -0.002063 0.001846 -0.003076 -0.004733 
+0.000025 -0.005288 -0.005313 0.003165 -0.003790 -0.001891 
+0.002079 -0.000687 0.000141 0.001841 0.002093 -0.002220 
+0.003082 -0.000757 -0.002237 0.003015 0.001683 -0.000541 
+0.002731 0.005501 -0.004150 -0.001690 0.010526 -0.000091 
+0.001174 0.005076 0.000685 0.001670 -0.001037 -0.000687 
+-0.003902 -0.003512 0.002244 -0.000179 -0.006118 0.005132 
+-0.000901 -0.001089 0.008485 -0.004741 -0.002782 0.003478 
+0.002493 0.002179 -0.000373 0.005924 0.003949 -0.002537 
+0.002572 0.007172 -0.004262 0.000073 0.006378 0.000717 
+0.001569 0.000787 0.000564 0.002060 0.000400 -0.000660 
+0.000815 0.000370 -0.000815 0.001795 0.000384 -0.000655 
+0.003338 0.003442 -0.001704 0.005169 0.004621 -0.001292 
+0.002519 0.002519 -0.002901 -0.001392 -0.002117 -0.000424 
+-0.003067 -0.002661 -0.002135 -0.002207 0.002537 -0.000949 
+0.002626 0.005366 -0.007878 0.000885 0.004094 -0.006195 
+0.000731 -0.000231 -0.000731 -0.003923 -0.000257 -0.000214 
+0.002000 0.003037 -0.000051 0.000573 0.002895 0.000772 
+-0.001036 0.002593 0.003122 -0.005008 0.002461 0.004480 
+-0.003962 0.003962 0.000692 -0.004445 0.003008 -0.002667 
+-0.001429 0.004211 -0.004211 -0.000075 0.002459 0.000615 
+-0.000566 0.000634 0.001341 -0.000526 -0.001973 0.002946 
+0.000315 0.000181 0.000765 -0.002552 0.003493 -0.000287 
+0.000555 0.003310 0.001733 -0.001725 0.004427 -0.004949 
+-0.003504 0.002582 -0.004587 -0.004356 0.000682 -0.001315 
+0.000119 0.002377 -0.000306 -0.000359 0.002619 -0.000664 
+0.000378 0.003047 -0.000507 0.000612 0.003735 0.002387 
+-0.000900 0.003167 0.000937 0.000086 0.002159 -0.002302 
+0.000603 0.003931 -0.001211 -0.000789 0.004196 -0.003239 
+0.000531 0.003698 -0.004208 0.001322 0.003835 -0.001917 
+0.002800 0.000887 -0.004421 0.000562 0.000181 -0.004697 
+-0.002185 0.000603 -0.003115 -0.000824 0.001176 0.000032 
+0.004172 0.003577 -0.001838 0.006610 0.006797 -0.004807 
+0.005874 0.006549 -0.004743 0.002789 0.003896 -0.000328 
+0.000316 0.000101 0.001794 -0.002462 -0.000758 0.000947 
+-0.001223 -0.001462 0.000029 0.000159 0.000159 0.000000 
+-0.001156 0.000665 0.000105 -0.000971 0.000398 0.000904 
+-0.000526 -0.002836 0.002768 0.002437 -0.000975 0.005113 
+-0.001572 -0.000332 0.003968 -0.000810 -0.001745 0.002055 
+-0.003804 0.002174 -0.001452 0.001769 0.000928 -0.003939 
+0.001175 0.007568 -0.005078 -0.000605 0.000311 -0.000597 
+0.002874 -0.002200 -0.002515 0.001132 -0.004320 -0.002896 
+-0.002425 0.004052 -0.007180 0.003628 0.015944 -0.001239 
+0.009903 0.017290 -0.000142 0.007177 0.008388 0.000121 
+-0.003048 -0.000110 0.002730 0.000130 -0.004248 0.002098 
+-0.002960 -0.000055 -0.002659 -0.003259 0.002252 -0.001126 
+0.000842 0.000752 -0.003564 0.004046 0.001695 -0.001017 
+0.002296 0.001504 0.003215 0.000531 0.000617 0.003006 
+-0.001408 0.001725 0.001092 -0.000519 0.003630 -0.004214 
+0.000394 0.006373 -0.003176 0.000475 0.001636 0.001319 
+-0.002749 0.001222 -0.002707 -0.000721 0.002068 -0.004799 
+0.001232 0.003759 -0.005916 0.001353 0.004662 -0.005263 
+0.000695 0.003550 -0.004472 -0.000786 0.003438 -0.004469 
+0.000065 0.001545 0.000987 0.001091 0.001223 -0.000664 
+0.001626 0.001166 -0.001312 0.004328 0.002029 -0.004914 
+0.002260 -0.001020 -0.000547 0.002835 -0.000166 -0.000582 
+0.002150 0.000086 -0.003646 0.000866 0.000127 -0.004049 
+0.004106 0.001227 -0.000585 0.000790 0.002426 -0.002878 
+0.003035 -0.000839 -0.000031 -0.000419 -0.000015 0.000171 
+-0.002748 0.000874 0.000624 0.002088 -0.000096 0.005260 
+0.002515 -0.000821 0.003696 0.002587 -0.002845 0.000342 
+0.002615 -0.002361 -0.002496 -0.000022 0.000211 -0.000320 
+0.000766 0.001171 0.001297 0.000177 -0.000375 0.000313 
+0.000182 -0.001144 0.001197 -0.002710 -0.003523 0.003794 
+-0.003411 0.002958 0.002893 -0.000019 0.003439 0.002937 
+0.000806 0.003810 0.000537 -0.001493 0.000696 -0.000430 
+-0.004687 -0.002991 0.003058 -0.004082 -0.005679 0.005901 
+-0.000272 -0.004967 -0.003252 -0.001398 -0.005174 -0.002762 
+0.002602 0.000821 -0.007875 -0.002142 0.004183 -0.002873 
+0.001639 0.005878 0.000983 0.002834 0.005456 -0.003861 
+0.002322 0.006039 -0.005946 0.006753 0.006609 -0.005388 
+0.004393 0.001263 0.000818 -0.002159 0.000420 -0.004002 
+0.000726 0.000499 -0.001437 -0.002147 -0.000422 0.000939 
+-0.000171 -0.000475 -0.000510 0.002389 -0.000995 -0.005576 
+0.005506 0.001273 -0.004479 0.002183 0.001079 -0.001706 
+-0.000560 -0.000320 0.002160 -0.002388 -0.001680 0.001752 
+-0.002348 -0.002516 -0.001680 0.001200 -0.001683 -0.004559 
+0.001532 -0.000134 -0.006771 0.000569 0.004114 -0.004399 
+0.000038 0.002212 -0.001801 -0.001015 0.001643 0.001351 
+-0.003853 -0.000600 0.002892 -0.001849 0.000109 0.003685 
+-0.001786 0.003674 0.003521 -0.001321 0.008704 0.003493 
+-0.000722 0.011778 0.001152 -0.000088 0.009906 -0.000675 
+-0.002191 0.003606 0.000625 -0.004269 -0.002528 0.005449 
+-0.007526 -0.005295 0.005786 -0.000682 0.000861 -0.000073 
+-0.000279 -0.001860 -0.000558 -0.000158 0.002443 -0.000555 
+0.000749 0.006739 -0.002206 0.004929 0.006643 -0.000643 
+0.000260 0.003437 0.000908 -0.001363 0.000815 -0.000681 
+-0.003771 0.001844 0.001005 -0.003453 0.004539 -0.001643 
+-0.003891 0.004064 -0.002702 0.001333 -0.002023 -0.002713 
+-0.000404 0.006318 -0.004777 0.000837 0.005709 -0.005138 
+0.003278 0.004736 -0.006542 0.003208 0.000873 -0.006425 
+-0.000165 0.000688 -0.004813 0.000082 -0.000405 -0.000101 
+0.001758 0.000326 0.002020 0.001391 -0.001393 0.001858 
+0.001426 -0.000319 0.000592 0.001230 -0.001706 0.002619 
+0.000698 0.001686 -0.001991 0.002486 0.003854 -0.002921 
+-0.001742 0.004371 -0.002009 -0.003050 0.004766 0.002510 
+-0.005580 0.003720 0.004590 -0.000959 0.001039 0.003996 
+-0.000908 0.002452 0.001158 -0.000806 0.002431 0.000009 
+0.001466 0.000559 0.002439 0.005550 -0.000756 0.001885 
+0.001760 -0.000950 -0.002140 0.000282 -0.001770 -0.002397 
+0.000038 -0.000912 -0.001852 0.000499 0.000201 -0.000317 
+0.000316 -0.000409 0.001486 0.001707 0.000945 -0.001104 
+0.001797 -0.001427 -0.001788 0.001089 -0.002742 -0.001089 
+-0.002697 -0.004754 -0.001109 -0.001887 -0.003333 0.000539 
+-0.002062 -0.000491 -0.000033 -0.001461 -0.002643 0.001148 
+-0.001962 -0.003453 0.003061 -0.004530 -0.001282 -0.001282 
+-0.000321 -0.000161 -0.002169 0.000210 0.000438 -0.002079 
+0.000103 -0.000178 -0.001260 -0.000766 0.000242 -0.000769 
+-0.000397 0.000380 -0.000481 -0.000205 -0.000866 -0.000016 
+-0.000547 -0.001251 -0.000662 -0.001155 -0.000188 0.000058 
+0.000000 0.002913 -0.000787 -0.002695 0.002985 0.000436 
+-0.003394 0.001672 0.001620 -0.005270 0.001305 0.002577 
+-0.004193 -0.000163 0.001040 0.002886 0.002886 -0.003333 
+0.008614 -0.002058 -0.002616 0.006881 -0.000988 0.002287 
+0.004090 0.004236 0.000365 -0.000078 0.000415 -0.000223 
+-0.001100 0.001192 -0.000367 -0.001070 0.003701 -0.004280 
+0.000784 0.005924 -0.003253 -0.000326 0.003306 -0.002054 
+0.000896 0.000759 -0.001625 -0.000252 -0.002574 0.000528 
+0.000932 -0.000342 0.001845 -0.000425 0.002874 0.002616 
+0.007431 0.008177 0.001330 0.009136 0.012119 -0.001861 
+0.004474 0.009395 -0.003154 -0.002836 0.003867 0.000078 
+-0.002039 -0.000951 0.004179 -0.000403 -0.001407 0.001400 
+0.000892 0.000032 -0.000397 0.002125 -0.001743 -0.000967 
+0.000758 -0.000644 0.002159 0.000816 0.001417 -0.000865 
+0.003924 0.001975 -0.001964 0.002649 0.003134 -0.000456 
+0.001093 0.002363 -0.000207 0.004015 -0.002693 -0.000898 
+0.001808 0.001536 -0.002167 0.002174 -0.001315 0.001691 
+0.002293 -0.003739 0.003191 -0.000136 -0.003705 0.002942 
+-0.001382 -0.001039 0.004317 -0.001161 -0.001482 -0.000312 
+-0.000106 0.002424 -0.001667 -0.000320 0.004333 -0.001438 
+0.000877 0.003509 -0.001379 0.000891 -0.000057 0.000833 
+0.002159 -0.000139 0.001376 0.000762 0.000542 -0.000878 
+-0.001335 -0.001263 -0.002318 -0.001918 -0.000542 -0.002683 
+0.001158 -0.000413 -0.004962 0.003193 0.002587 -0.007888 
+0.003644 0.005685 0.000517 -0.004218 0.003573 -0.000771 
+-0.001095 -0.000517 -0.000600 -0.000277 0.005299 -0.002424 
+-0.000438 0.002853 -0.000402 0.000986 -0.000532 0.000444 
+0.003413 0.002081 -0.004567 -0.000451 0.005339 -0.003984 
+-0.000955 0.004407 -0.002183 -0.000134 0.001347 -0.000704 
+-0.002713 0.001295 0.000324 -0.000203 0.004312 0.000781 
+-0.001530 0.007177 0.000529 -0.001756 0.006537 0.000488 
+-0.001661 0.000790 -0.001370 -0.000520 -0.001032 -0.000625 
+-0.000726 0.000571 -0.000216 0.002835 0.004094 -0.003150 
+0.002625 0.005691 -0.001167 -0.001715 0.004464 0.000916 
+-0.001625 0.002661 0.000691 -0.002001 0.001159 -0.003019 
+-0.000113 -0.000356 -0.002990 0.000619 -0.000002 -0.000915 
+0.001659 0.001838 -0.000690 0.002229 0.003989 -0.002845 
+0.002659 0.002286 -0.004992 0.002180 0.000206 -0.001178 
+-0.001278 0.002595 -0.002924 -0.000423 0.000142 -0.001768 
+0.000960 0.001339 -0.000808 0.001897 0.002414 -0.000345 
+0.001884 -0.001143 0.003164 -0.000107 0.000678 0.004170 
+0.000086 0.000297 0.003793 0.001622 0.000270 0.000882 
+-0.000433 0.000099 -0.002000 -0.000667 0.002075 -0.004595 
+0.001068 0.006407 -0.004918 0.002238 0.004361 -0.004437 
+0.001468 0.001797 -0.002374 0.001516 0.000903 -0.003794 
+0.001456 0.005237 -0.004317 0.002218 0.006641 -0.005914 
+-0.000007 0.007412 -0.004892 0.003635 0.003199 0.005099 
+0.008329 0.010966 -0.002162 0.006194 0.011507 -0.004340 
+0.006350 0.009407 -0.004847 0.006301 0.006612 -0.002489 
+0.003761 0.001619 -0.000793 0.000435 -0.001088 0.002923 
+-0.002678 -0.000381 -0.000929 -0.005631 0.000934 -0.000480 
+-0.002105 0.001278 0.001955 -0.002099 -0.003110 0.000153 
+-0.001172 -0.001925 0.001456 0.002391 -0.001449 -0.000942 
+0.003610 0.003229 0.000127 0.004550 0.004313 -0.003498 
+0.002029 0.003449 -0.001725 -0.001801 0.001684 0.001317 
+-0.001821 0.000670 0.000624 0.000031 0.001262 -0.000398 
+0.001783 0.001085 -0.000155 0.002551 0.001766 -0.003729 
+-0.002445 0.003235 -0.002859 -0.001120 0.002486 0.000683 
+0.000469 0.001162 -0.003957 0.000285 0.000650 0.002886 
+0.001710 0.000554 -0.000298 0.001542 0.000595 -0.000592 
+0.001899 0.001155 -0.001166 0.001521 0.000929 -0.000639 
+-0.000695 -0.000541 0.001609 -0.003206 -0.002019 0.004532 
+-0.002169 -0.001251 0.002533 0.001622 0.003917 -0.000136 
+0.003619 0.008771 -0.000638 0.004933 0.010903 -0.003005 
+0.006140 0.003659 -0.001306 -0.001097 0.001744 -0.002484 
+-0.001428 0.001764 -0.000011 0.003812 0.000971 -0.002630 
+0.008491 0.004853 -0.009035 -0.002777 0.007501 -0.001999 
+-0.011907 -0.000976 0.002861 -0.009653 -0.010201 -0.009138 
+-0.036331 -0.004146 -0.007115 -0.026823 -0.018184 0.008162 
+-0.010468 -0.007371 0.000270 -0.002039 -0.031300 -0.002964 
+0.012131 -0.039493 -0.007566 -0.002495 0.041905 0.011135 
+0.001520 0.005965 -0.000416 -0.010279 0.023557 -0.004100 
+-0.058529 0.049779 -0.072206 -0.020000 0.062250 -0.083000 
+-0.054773 0.067273 -0.040682 -0.028667 -0.066667 -0.014333 
+-0.009778 0.002444 -0.002444 -0.003866 0.016471 0.010672 
+0.054706 0.013676 0.116250 -0.114412 -0.028603 -0.012500 
+-0.090000 -0.001111 -0.001111 0.028125 0.045000 0.028125 
+0.131852 0.078519 -0.052593 -0.022680 0.030000 -0.090719 
+0.012118 0.028276 -0.066429 0.002812 -0.002812 -0.010625 
+0.001830 0.010977 0.015385 0.025623 -0.006000 0.089679 
+0.025333 0.076000 -0.005000 0.057500 0.117500 -0.060000 
+-0.082927 0.014000 0.103659 -0.066115 0.073807 0.020947 
+0.010760 0.028655 -0.026418 -0.063397 -0.034244 -0.038641 
+0.007043 -0.007018 -0.015815 -0.014026 0.055957 -0.003581 
+0.021547 0.054499 -0.038874 0.017587 0.011389 -0.005730 
+0.005595 -0.002564 0.004067 -0.017835 -0.002689 -0.018495 
+-0.007675 0.000934 -0.007810 -0.002558 -0.001406 -0.001721 
+-0.000122 0.000808 0.000230 0.000194 0.002053 0.004217 
+-0.000252 0.001443 0.003994 -0.000604 0.000264 0.000718 
+-0.001219 0.000262 -0.002531 0.000822 0.003748 -0.007025 
+-0.000552 0.009677 -0.007261 0.001670 0.004597 -0.000752 
+0.000088 0.000536 -0.001453 0.000119 -0.000720 -0.002241 
+0.000792 -0.001442 -0.002951 0.001199 -0.002065 -0.003368 
+-0.000542 -0.004645 -0.002809 -0.001136 -0.004249 -0.003260 
+-0.002771 -0.002100 -0.002621 -0.002259 -0.000841 -0.002078 
+-0.000027 -0.000166 0.000089 -0.000978 0.001761 0.000165 
+0.000336 0.000672 -0.001680 0.000405 -0.000967 -0.002354 
+0.000213 0.003101 0.001782 0.005507 0.004899 0.000120 
+0.006479 0.003416 0.001600 0.002533 0.000644 -0.003826 
+-0.004908 -0.001856 0.001769 -0.009626 -0.004582 0.003217 
+-0.011518 -0.006168 0.004100 -0.007240 -0.002335 0.001484 
+-0.001346 0.006226 -0.000516 -0.001323 0.007219 -0.001313 
+-0.002473 0.002738 -0.001744 -0.002282 -0.000580 -0.000774 
+0.000746 0.003306 -0.001281 0.005916 0.006141 -0.004566 
+0.009048 0.009756 -0.009177 -0.025351 -0.001661 0.018342 
+-0.005215 0.003888 -0.000550 0.002495 0.006065 -0.001928 
+-0.027604 -0.003021 -0.012292 -0.026148 -0.012498 0.001887 
+-0.014722 -0.008540 -0.005989 -0.000924 0.014570 0.002860 
+0.037110 0.012969 0.011248 0.017278 0.175031 -0.075381 
+-0.050380 0.040652 -0.006217 -0.072392 0.010608 -0.004119 
+-0.006749 0.025720 0.008313 0.017273 0.044196 0.005524 
+0.047469 0.064136 0.027901 0.029118 -0.011111 -0.048529 
+-0.022922 0.006234 -0.004221 -0.021210 -0.016577 -0.000722 
+0.023121 0.034286 0.040462 -0.023333 -0.058333 -0.058333 
+-0.051039 -0.049610 -0.040260 0.062153 -0.001597 0.015139 
+0.053750 0.016923 0.025385 0.000000 0.036250 -0.023750 
+0.002326 0.001903 -0.004863 -0.008000 -0.004000 0.018000 
+0.007505 -0.007912 0.002736 0.030317 -0.022063 0.012857 
+0.076000 0.008267 -0.082673 0.056401 0.003819 -0.100459 
+0.034889 0.026255 -0.054428 0.052273 0.037273 -0.031364 
+-0.096923 0.005889 -0.014721 -0.023566 -0.113530 0.048465 
+0.088182 -0.004364 0.002182 0.037169 0.005225 -0.094649 
+-0.027279 -0.008223 0.019317 0.005149 -0.008929 -0.007082 
+0.022144 -0.001339 0.007708 0.010350 0.014105 -0.012151 
+0.005427 -0.001784 0.008021 0.000764 -0.000234 0.001131 
+-0.002063 0.001650 -0.002106 -0.002485 0.001119 -0.001129 
+0.000556 -0.000021 0.000412 0.004495 -0.000535 -0.002880 
+0.006768 0.007399 -0.005137 0.000856 0.008459 -0.002781 
+-0.000737 0.005615 -0.004055 -0.008873 0.001265 -0.001770 
+-0.002211 0.002927 -0.001069 0.000271 0.000639 -0.003484 
+0.004384 0.004814 -0.005882 0.003837 -0.000304 -0.005709 
+0.001357 -0.000945 -0.003687 0.000230 -0.001392 -0.003178 
+-0.001526 -0.002521 -0.003027 -0.000450 -0.000531 -0.001093 
+-0.002090 0.003542 -0.001275 -0.000812 -0.001218 -0.002800 
+-0.004167 0.001102 -0.003925 -0.003451 -0.002700 -0.003994 
+-0.005558 -0.002711 0.001939 -0.001223 -0.001213 0.001510 
+0.004781 0.004857 -0.000287 -0.000518 0.005922 0.000319 
+0.000290 -0.000627 -0.000907 -0.003504 -0.002444 0.006460 
+-0.015955 -0.010125 0.006652 -0.015072 -0.015152 0.003599 
+-0.007880 -0.006870 -0.001683 -0.002741 0.001507 -0.000546 
+-0.002261 0.002480 -0.000538 -0.001578 0.001139 -0.001139 
+-0.000334 0.001035 -0.000584 0.002130 0.004493 -0.002879 
+0.000039 0.001789 -0.000153 -0.002701 -0.005396 0.014847 
+0.002846 0.002026 -0.000592 0.001962 0.003965 0.001263 
+0.003029 -0.004408 0.004181 0.022450 -0.003212 0.006732 
+0.110341 0.005947 0.051977 0.020906 -0.003626 -0.007588 
+-0.115128 0.011653 0.052081 -0.008049 0.021016 -0.015296 
+-0.010276 0.005506 -0.012915 -0.016433 -0.030127 -0.024444 
+-0.035185 -0.052593 -0.061481 -0.062857 0.116995 0.046798 
+0.022608 0.007688 -0.004704 0.021189 -0.068269 -0.048269 
+-0.022306 -0.048607 0.009544 -0.023125 -0.071875 0.001250 
+0.079735 -0.082462 0.091515 0.072133 -0.024222 -0.023822 
+0.058182 -0.002310 -0.013857 0.044641 -0.031373 0.002418 
+0.013333 -0.005600 0.007467 0.037426 -0.003443 0.007261 
+0.030682 0.034318 0.000455 -0.007000 0.003000 -0.012000 
+0.019621 -0.035702 0.035112 0.011400 -0.015200 -0.025000 
+-0.012325 0.011303 0.003004 -0.012581 0.002887 0.000571 
+0.021841 0.014750 -0.002764 0.034872 0.087912 -0.007851 
+0.022702 0.040775 -0.072470 0.102559 0.010458 0.054484 
+-0.039408 0.050855 -0.022237 0.015363 0.061453 -0.037647 
+0.015500 -0.000708 -0.000310 0.007490 0.008129 0.007297 
+0.026181 -0.070832 -0.033180 0.009119 -0.040753 -0.015956 
+-0.000513 -0.001407 -0.003561 0.000088 -0.001489 -0.001866 
+-0.000070 -0.001429 -0.001373 -0.000517 0.000104 -0.000820 
+-0.001833 0.001971 0.002933 0.003854 0.002451 0.000528 
+-0.002570 0.008796 -0.000028 -0.005849 0.006275 -0.004067 
+-0.007894 0.005141 -0.003229 -0.004004 0.004122 -0.001402 
+0.000264 0.000368 -0.001081 0.000607 -0.001594 -0.000257 
+-0.001733 0.001238 0.001979 -0.002650 0.001071 0.003803 
+-0.000673 0.000170 0.002374 0.001102 0.000726 -0.001475 
+0.002716 0.001501 -0.001479 -0.001983 0.001509 -0.000043 
+-0.004322 0.002876 -0.000730 -0.005313 0.002692 -0.001034 
+-0.005035 0.001323 0.000395 -0.003734 -0.000020 0.000731 
+0.001458 0.004891 -0.004414 0.000248 0.004181 -0.000573 
+0.002481 0.000022 0.000152 0.001431 -0.001101 0.000930 
+-0.000663 -0.002899 0.002078 -0.008480 -0.010840 0.002630 
+-0.016842 -0.014659 0.006278 -0.014046 -0.020822 0.009058 
+-0.010546 -0.022147 -0.000351 -0.011374 -0.010178 -0.006332 
+-0.006701 -0.001392 -0.002164 0.001602 -0.000690 -0.008565 
+0.000738 -0.002282 -0.000925 0.001227 -0.001318 -0.000592 
+0.009813 0.000736 -0.004410 0.005923 0.006188 -0.002863 
+-0.003854 0.001916 0.003841 0.005364 -0.015609 0.008811 
+0.003641 -0.007487 0.018694 0.064424 0.011830 0.035709 
+-0.000225 -0.000370 0.000486 0.063490 -0.050515 0.017991 
+-0.016625 0.054710 -0.001723 0.007103 0.009043 -0.006815 
+0.011319 0.015517 -0.026465 -0.030494 -0.012850 -0.042384 
+-0.083897 -0.057164 0.014233 0.150893 -0.082251 -0.023448 
+0.011550 0.036060 -0.044265 -0.007278 -0.007079 0.016185 
+-0.009333 0.003333 -0.036667 -0.032986 -0.014931 0.007639 
+0.018584 -0.053101 0.091266 0.023636 -0.023636 -0.010909 
+0.025980 0.039347 0.001509 0.035333 -0.050667 0.027333 
+-0.008903 -0.010994 0.015512 0.056501 0.011924 0.013819 
+0.085359 0.104744 0.036897 0.022857 0.060000 -0.082857 
+0.032687 0.057657 0.022797 -0.016695 0.010986 -0.011862 
+-0.016317 0.022129 -0.012019 -0.005333 0.027333 -0.010667 
+-0.001220 -0.002106 -0.000374 0.007587 0.002305 -0.003289 
+0.034904 0.001591 -0.025180 0.011278 0.005872 -0.018382 
+-0.000465 0.006355 -0.021191 0.181625 0.266237 -0.261727 
+0.383285 0.227956 -0.113139 0.265030 -0.005211 0.086145 
+-0.035071 -0.235967 0.147617 0.005893 -0.016443 -0.017089 
+-0.006035 0.004365 -0.016437 -0.002584 0.000962 -0.013951 
+-0.001487 -0.000159 -0.003926 -0.000740 -0.002218 0.000879 
+-0.002616 -0.002230 -0.000481 -0.003425 0.003522 -0.000827 
+-0.002610 0.004266 -0.000175 -0.002100 0.005357 -0.000225 
+-0.002163 0.005429 -0.001087 0.001102 0.001866 -0.004167 
+0.000961 0.001253 -0.002562 -0.000655 -0.000669 -0.000446 
+-0.000258 0.000578 -0.000804 -0.001433 0.001990 -0.002493 
+-0.000670 0.001216 -0.002529 0.000219 0.000072 -0.002341 
+0.000696 -0.000724 -0.001469 -0.000926 0.000514 -0.000363 
+-0.003216 -0.000226 -0.000929 0.000538 0.005364 -0.002404 
+0.003246 0.007193 -0.002895 0.000456 0.002040 0.001136 
+0.005171 -0.002675 -0.006300 0.005635 0.002233 -0.005583 
+0.003774 0.000929 -0.001037 0.000933 -0.000251 0.002943 
+-0.002074 -0.000871 0.003424 -0.007452 -0.004737 0.001454 
+-0.016244 -0.010032 0.001995 -0.021675 -0.015402 0.007416 
+-0.016823 -0.024497 0.008563 -0.016241 -0.023907 -0.006831 
+-0.014160 -0.002381 -0.003590 -0.004107 0.003247 -0.004288 
+-0.001520 -0.003164 -0.001509 -0.001818 -0.003121 0.000173 
+0.002658 0.001371 -0.003278 -0.005176 0.004263 -0.009446 
+-0.013545 -0.007776 0.029136 0.005253 -0.001060 0.010828 
+-0.000686 0.002807 0.003467 0.006263 0.002135 0.000826 
+0.007852 0.002383 -0.001999 0.030840 0.017407 -0.003784 
+0.044821 0.047707 -0.018688 0.046667 0.023333 -0.092000 
+-0.013399 -0.011657 0.000909 -0.032409 -0.005953 0.001197 
+-0.047512 -0.034363 0.016546 0.028823 -0.082219 0.031895 
+0.008329 0.035671 0.003906 0.015677 0.015988 0.009261 
+-0.021419 0.106564 -0.016923 0.013598 0.031870 -0.013079 
+-0.013947 -0.003008 -0.017732 0.025345 0.006098 -0.059645 
+0.036249 0.001642 -0.032418 -0.021483 -0.005837 0.004593 
+-0.005015 0.008738 0.000615 0.002000 0.012464 0.007790 
+0.024379 0.043669 0.010059 -0.001172 -0.004212 0.037436 
+-0.031803 -0.012509 0.066336 0.008498 0.005971 -0.010795 
+0.008587 0.000803 -0.029283 0.006156 0.013058 -0.002985 
+-0.021767 0.011760 0.021653 -0.014149 0.007333 0.010176 
+-0.009895 0.005179 0.002422 -0.023239 -0.001864 0.001393 
+-0.033311 -0.006535 0.003062 -0.009280 -0.003686 -0.043254 
+0.009640 0.004532 -0.037768 0.011180 0.003704 -0.012546 
+0.004376 0.006950 -0.026065 -0.008143 0.004352 -0.019043 
+-0.007458 0.005960 -0.007597 -0.005509 0.001978 -0.000282 
+-0.002697 0.004867 -0.001691 -0.000008 0.000794 -0.001784 
+-0.003860 -0.000939 -0.006257 -0.008885 0.006428 -0.013314 
+-0.008521 0.011282 -0.014014 -0.012637 0.008813 -0.005538 
+-0.007529 0.003311 -0.008448 -0.002004 -0.000507 0.004573 
+-0.003373 0.000577 -0.001352 -0.000989 0.005599 0.000281 
+-0.000635 0.005597 -0.001504 -0.001443 -0.000514 0.000973 
+-0.004502 -0.000316 -0.002562 -0.006004 -0.003934 0.001094 
+-0.003895 -0.002676 -0.002839 -0.001472 -0.000699 0.000007 
+0.003246 0.002736 -0.003144 0.005477 0.002871 -0.002477 
+0.003114 -0.000456 -0.001576 -0.000573 0.000062 -0.001306 
+-0.002156 -0.000221 -0.000854 -0.002131 -0.000103 -0.001402 
+-0.000902 0.000053 0.000075 0.002441 0.003103 -0.002703 
+-0.002705 0.003079 -0.002099 -0.009057 -0.002664 -0.001568 
+-0.012936 -0.007137 0.004798 -0.020342 -0.008870 0.005396 
+-0.025726 -0.017708 0.002445 -0.023981 -0.020325 -0.013144 
+-0.023364 -0.006726 -0.010698 -0.017708 -0.006035 -0.004832 
+-0.000952 -0.011347 -0.008118 -0.002695 -0.007873 0.002218 
+-0.006420 -0.000656 0.006684 -0.017853 0.032826 0.031995 
+0.004455 0.052747 -0.004032 -0.003998 0.012264 0.002213 
+0.000280 0.005286 0.003639 0.005684 0.004904 0.000505 
+0.013837 0.008786 -0.001859 0.013774 0.010916 0.001288 
+0.019232 0.028986 0.015561 0.014934 0.058200 0.026474 
+-0.018028 -0.065581 0.111301 -0.000043 -0.003917 0.000594 
+-0.009559 -0.005624 -0.003670 -0.016728 -0.014374 -0.026834 
+-0.032605 0.013921 -0.016869 -0.058378 -0.004610 0.007208 
+-0.026654 0.005846 -0.008918 -0.023237 -0.006234 -0.056680 
+-0.011789 -0.010000 0.005895 -0.015858 0.019305 -0.010687 
+-0.017880 0.022000 -0.023840 -0.004373 0.084576 -0.046373 
+-0.010384 -0.003354 -0.014202 -0.019832 -0.031367 -0.016726 
+-0.049446 -0.020222 -0.011898 -0.034954 -0.030257 0.056316 
+-0.042922 -0.064070 0.032602 -0.002126 -0.060862 0.047443 
+-0.024399 0.049279 0.008498 -0.020394 -0.005083 0.036378 
+-0.015105 -0.004444 0.032572 -0.006877 -0.000877 0.024457 
+-0.005898 0.007864 0.019681 -4.893939 -0.909091 1.984848 
+-4.023809 -1.138095 1.709524 -3.176895 -1.978339 1.480144 
+-2.500000 -2.708029 1.156934 -1.944444 -3.412037 1.046296 
+-0.023301 -0.009975 0.002992 -0.002930 -0.002625 -0.005536 
+0.004580 -0.001325 -0.001826 0.003804 0.003116 -0.004962 
+0.003418 0.006206 -0.005669 0.004271 0.009625 -0.001053 
+-0.005904 -0.002399 0.001605 -0.006770 0.006342 -0.001878 
+-0.012561 0.008498 -0.020311 -0.008739 0.023964 -0.000224 
+-0.013688 0.023614 -0.007529 -0.010051 -0.000901 -0.002319 
+-0.005004 0.004017 0.000273 -0.001995 0.005643 0.004667 
+-0.001193 0.000859 0.000884 0.002952 -0.001737 0.000965 
+0.003110 -0.006330 -0.006370 -0.006718 -0.001301 -0.003601 
+-0.008264 -0.000514 -0.003721 -0.003075 0.004787 -0.003108 
+0.002276 0.003524 -0.000252 0.002797 -0.001191 -0.000034 
+0.001514 -0.000647 -0.000022 -0.003898 -0.003466 0.000240 
+-0.003451 0.001725 0.006275 -0.005286 0.001978 0.002164 
+-0.005091 -0.000929 0.000920 0.000456 0.003661 -0.003907 
+-0.003681 0.002560 -0.004084 -0.005009 -0.002453 -0.001654 
+-0.004312 -0.004210 0.002614 -0.006727 -0.000750 0.004892 
+-0.018300 -0.017207 -0.007752 -0.013056 -0.030294 -0.014093 
+-2.515152 -2.824242 -1.060606 -0.011916 -0.025776 -0.008132 
+-0.001123 -0.007640 -0.008167 -0.000544 0.001398 0.000200 
+-0.001263 -0.000172 0.000668 0.008025 0.018483 0.005701 
+-0.019692 0.036347 -0.014073 -0.003931 0.014376 0.007804 
+0.008401 0.014098 0.013947 0.004515 0.023078 0.009962 
+0.003156 0.021159 0.013546 -0.003477 0.008434 0.013064 
+-0.010614 0.004406 0.022317 -0.022059 0.001130 0.037788 
+-0.007565 0.006553 0.023547 -0.002697 -0.004309 0.008947 
+-0.007769 -0.003377 0.000503 -0.000351 -0.001559 -0.002132 
+0.019639 0.020156 -0.057353 0.014769 0.029538 -0.005385 
+-0.050673 -0.174161 0.056677 -0.032137 -0.044134 0.045360 
+-0.012385 -0.006462 0.029346 -0.009863 -0.006722 -0.007174 
+0.000273 -0.014919 -0.006163 -0.066839 -0.011321 0.026518 
+-0.021405 -0.159196 0.016725 -0.018065 -0.065593 0.033451 
+-0.001766 -0.014585 0.039052 -0.029669 -0.033774 0.013555 
+0.025981 -0.067238 0.025200 -0.006060 -0.014973 -0.004919 
+-0.018126 0.009848 0.035379 -0.022054 0.011112 0.026138 
+-0.016038 0.014753 0.016393 -0.013109 0.015078 0.017797 
+-5.357798 1.293578 2.201835 -4.859375 -0.281250 2.437500 
+-3.591331 -2.473684 2.321981 -2.612903 -3.705069 2.131336 
+-1.974359 -4.372961 1.895105 -1.453988 -4.822086 1.506135 
+-0.843220 -4.343220 0.978814 -0.005368 -0.027130 0.000427 
+0.004113 -0.014399 0.002037 0.004910 -0.004273 0.003334 
+0.000328 0.013579 0.003149 -0.006299 0.007284 -0.000100 
+-0.006533 -0.006768 0.002333 -0.001401 0.008208 -0.002903 
+-0.011927 0.030003 -0.022232 -0.017187 0.004285 -0.010809 
+0.002117 0.016149 0.001644 0.001837 0.002709 0.001127 
+-0.002352 0.000306 -0.002733 -0.000604 0.001386 0.001208 
+-0.003069 0.000737 0.004784 0.000205 -0.000666 -0.001273 
+-0.002457 0.000189 -0.002079 0.002433 -0.000097 -0.000403 
+-0.001697 0.000165 -0.006517 -0.002792 -0.002277 -0.004032 
+-0.000703 0.001196 -0.001196 -0.001571 0.000429 -0.000952 
+-0.000350 -0.000574 0.000506 -0.000274 0.001016 -0.000452 
+0.000109 -0.000560 0.005360 -0.001616 0.000886 0.003576 
+-0.001222 0.001906 -0.000132 0.000214 0.004844 -0.004621 
+0.000978 0.001423 -0.004188 -0.000206 -0.000549 0.000486 
+0.000943 -0.001248 -0.000727 0.001531 0.004744 -0.000876 
+-0.007783 -0.002807 -0.007987 -0.014326 -0.024723 -0.012560 
+-0.023828 -0.022750 -0.013286 0.000537 -0.014672 -0.010378 
+0.000232 -0.003408 0.003588 -0.006305 0.010054 0.008158 
+0.001197 0.009468 0.000455 0.002763 0.016279 0.004908 
+-0.011574 0.029859 -0.003713 0.002217 0.017423 0.006559 
+0.013320 0.029533 0.016641 0.680851 3.219858 4.680851 
+0.324324 2.918919 3.871622 0.006099 0.015668 0.021554 
+-0.001941 0.004351 0.028658 -0.002039 -0.001953 0.027130 
+-0.006080 -0.001994 0.013834 -0.007881 -0.001870 0.021584 
+-0.003524 -0.015595 -0.016987 0.007125 -0.011824 -0.005136 
+0.010848 0.006585 0.001474 0.017247 0.014952 -0.005023 
+0.006435 0.002128 0.003359 0.022500 0.025379 -0.015448 
+-0.019290 0.009878 0.015910 -0.013924 -0.032184 -0.027573 
+-0.055903 -0.055971 0.040756 -0.017721 -0.125632 0.098250 
+-0.092793 0.008213 0.027527 0.004606 0.026087 -0.003879 
+-0.000877 -0.007378 0.001075 -0.002228 -0.010861 -0.006777 
+0.007143 0.004643 0.009643 0.028551 -0.012102 -0.048862 
+-0.016589 0.021814 -0.012831 -0.026571 0.022762 0.006083 
+-0.019353 0.024636 0.003727 -5.858586 4.343434 1.989899 
+-4.876471 2.394118 2.817647 -3.903915 -2.181495 2.939502 
+-2.876405 -4.660112 2.811798 -1.832000 -5.688000 2.373333 
+-1.107463 -5.791045 1.805970 -0.716535 -5.590551 1.279528 
+-0.723958 -4.833333 0.963542 -0.000104 -0.028694 0.020842 
+-0.000803 -0.013740 0.016965 -0.010074 0.007641 0.012069 
+-0.006735 0.006118 0.008820 0.002095 -0.008000 0.000190 
+-0.003994 -0.001689 0.005804 -0.024752 0.018895 -0.001464 
+-0.018576 0.035247 -0.016248 -0.005900 0.019425 0.003022 
+-0.001630 -0.001771 0.000018 0.000951 -0.006319 -0.000673 
+0.001798 -0.005945 -0.000371 -0.003367 -0.007541 -0.003932 
+0.001200 -0.002217 -0.003366 -0.004562 0.004172 0.001089 
+-0.005299 0.004469 0.007741 -0.003020 0.003205 0.002509 
+0.000417 0.000254 -0.000976 -0.000268 0.000321 -0.000753 
+-0.001753 0.000710 -0.000947 -0.003662 0.001522 0.001700 
+-0.003705 0.002329 -0.002095 -0.001014 0.005269 -0.005881 
+-0.001407 -0.000975 0.006625 0.000850 0.001337 0.002237 
+0.001690 -0.000793 -0.004638 0.000533 -0.002489 -0.004945 
+-0.008641 -0.005955 -0.001703 -0.004943 0.000789 0.001312 
+-0.001412 0.002179 0.000594 0.002849 0.008398 0.005065 
+0.001440 0.005475 0.005462 0.000524 -0.000028 -0.000514 
+-0.006825 -0.014989 -0.004831 -0.006398 -0.011132 -0.007117 
+-0.000239 0.001427 0.000648 -0.004942 0.017355 -0.000822 
+0.014189 0.014317 -0.001877 -0.003206 0.016534 0.005258 
+-0.002444 0.034574 0.011240 0.030029 0.012757 0.034612 
+1.444444 2.989418 4.402116 1.426724 4.043103 4.538793 
+1.668103 3.982759 4.129310 1.927602 1.904977 4.009050 
+1.768473 0.615764 3.896552 0.014058 0.002601 0.033166 
+-0.000799 0.005389 0.020365 -0.002621 0.005132 0.012393 
+0.036118 0.017081 0.012511 0.012225 0.012729 -0.000006 
+0.010069 -0.012269 0.000709 0.002153 -0.026907 0.020825 
+0.000281 -0.003871 0.024081 0.033145 0.058748 -0.006336 
+0.062335 0.019803 0.005989 0.004152 -0.000848 -0.006579 
+0.008396 -0.002532 0.001959 0.008588 0.001350 0.009078 
+-0.095182 0.111520 0.020820 0.002686 0.051923 -0.002238 
+0.007527 0.012637 0.005916 -0.007397 -0.002268 -0.005195 
+0.008327 -0.002700 0.003880 0.002492 -0.001254 -0.002257 
+-0.016614 0.015853 0.002548 -0.025412 0.017951 0.009764 
+-3.960000 4.770000 0.680000 -4.681159 5.666667 2.347826 
+-4.054688 0.277344 3.156250 -3.696023 -2.940341 3.397727 
+-3.415663 -4.876506 3.153615 -1.248175 -6.145986 1.233577 
+0.710638 -6.017021 -0.276596 1.142105 -5.568421 -0.589474 
+0.651515 -5.000000 -0.462121 0.009080 -0.015657 0.009820 
+-0.022019 0.012927 -0.002112 -0.005727 0.021051 -0.006489 
+-0.001068 -0.003780 0.004581 0.002715 -0.004015 0.003169 
+-0.011807 0.005877 0.013576 -0.031102 0.031743 -0.003286 
+-0.013529 0.022312 -0.002099 -0.006543 -0.000546 0.000512 
+-0.002271 -0.006411 -0.001661 0.002028 -0.002829 -0.000657 
+0.000900 -0.007775 0.001908 0.003823 -0.003585 -0.003760 
+-0.000849 -0.001132 -0.001981 -0.005790 0.002054 -0.000559 
+-0.005492 0.004011 0.001367 -0.002410 0.001952 -0.000179 
+-0.001735 0.002839 -0.000513 -0.000678 0.005423 -0.002439 
+-0.001731 0.001508 -0.001170 -0.001695 0.002213 -0.001287 
+-0.001753 0.003474 -0.004318 -0.002160 0.002940 -0.004244 
+-0.001739 0.000870 0.001304 -0.000614 -0.000254 0.001057 
+0.000311 0.000761 -0.004992 -0.001785 -0.003008 -0.008739 
+-0.007680 -0.004205 -0.006943 -0.000817 -0.002353 -0.002347 
+-0.001611 0.007296 -0.003157 -0.001002 0.000920 0.000920 
+-0.000068 0.000494 0.000726 -0.004592 -0.003295 0.003796 
+-0.007843 -0.007824 0.000485 -0.008525 -0.008107 -0.003339 
+-0.001378 -0.003494 -0.003431 -0.001462 0.002483 -0.000493 
+0.029334 0.019917 0.000906 0.015086 0.016141 0.004222 
+0.014545 0.011445 0.006121 3.460526 3.736842 -1.065789 
+2.425439 3.969298 4.447369 2.417722 4.170886 4.056962 
+2.993485 4.065146 4.100977 3.972656 3.265625 4.050781 
+4.372549 2.073529 4.112745 3.405594 0.825175 3.447552 
+0.004124 0.006402 -0.000854 0.004574 0.006132 -0.002154 
+0.038172 0.035789 -0.035990 0.042256 0.036936 0.041448 
+-0.007292 0.010928 0.012924 0.009513 -0.002281 0.000595 
+0.011594 0.003459 0.013202 0.023834 0.028329 -0.013700 
+0.022006 0.014800 -0.041699 -0.008924 0.023993 -0.034323 
+0.007456 0.001345 -0.020236 0.043120 0.035542 -0.037840 
+-0.001740 0.050909 0.004060 -0.023234 -0.001218 0.022853 
+-0.011727 0.012234 0.008893 -0.011967 -0.018125 0.008846 
+-0.004153 -0.031903 0.025154 -0.009106 -0.022728 0.024403 
+-0.007931 0.001418 0.023125 0.005070 0.019769 -0.002377 
+-2.698529 5.941176 0.323529 -2.747899 2.953782 1.365546 
+-2.714286 -0.071429 2.134286 -3.134328 -1.668657 2.943284 
+-2.388889 -3.412037 0.555556 0.652174 -5.336957 -2.043478 
+1.866995 -5.201971 -1.610837 2.179191 -4.942196 -1.751445 
+0.026440 -0.041767 -0.020700 0.005110 -0.010469 -0.012929 
+-0.015257 0.006609 0.000363 -0.011933 0.014560 0.000669 
+-0.001603 0.002176 0.004159 -0.025159 0.002511 -0.001819 
+-0.022147 0.016522 0.007817 -0.012900 0.028797 0.002094 
+-0.009012 0.013766 -0.003449 -0.001336 -0.003461 0.000036 
+0.005956 -0.002776 0.002346 0.004056 -0.001822 0.003331 
+0.001163 0.000947 0.000081 -0.002019 0.001963 -0.004037 
+-0.004691 0.003662 0.000012 -0.004692 0.005141 0.000895 
+-0.006278 0.002614 -0.000247 -0.002628 0.002963 0.001530 
+-0.000295 0.000364 0.000455 0.002213 0.003417 -0.005126 
+-0.000986 0.001549 -0.000094 -0.000930 -0.000094 0.002422 
+0.000373 -0.000367 -0.000137 0.000355 -0.000923 -0.001045 
+-0.000041 0.002862 -0.000982 0.002892 0.004351 -0.002881 
+0.002939 0.005361 -0.005041 0.002751 0.003871 -0.006013 
+-0.001581 0.002199 -0.005223 0.001815 0.003604 -0.003641 
+0.002124 0.003657 -0.001374 0.002814 0.001719 -0.000697 
+0.001999 -0.000416 -0.000250 -0.004019 0.002021 0.001417 
+-0.009344 0.000925 -0.003417 -0.008106 -0.000678 -0.007431 
+-0.003202 -0.009150 -0.009993 0.001016 -0.016447 -0.010106 
+0.028143 0.029777 0.015010 0.014350 0.022557 0.008160 
+0.014318 0.013727 0.002557 2.836364 5.145454 -7.927273 
+3.115385 4.329670 5.263736 2.819398 3.959866 3.969900 
+3.402985 3.967164 3.519403 4.262658 3.870253 2.955696 
+4.634538 3.208835 2.734940 3.176471 1.652941 1.494118 
+0.008689 0.010056 -0.007331 0.005407 0.011972 -0.002153 
+-0.014532 -0.006961 0.011883 0.008461 0.018897 0.037031 
+0.008016 0.000049 0.014253 0.006794 0.003632 -0.001066 
+-0.002087 -0.004348 0.002783 -0.007575 -0.008020 0.009950 
+-0.004340 0.006550 -0.006481 0.007792 0.019717 -0.019679 
+0.010440 0.008043 -0.014999 0.018956 0.012847 -0.011166 
+0.057070 0.023082 -0.010121 -0.014235 0.018694 0.006759 
+-0.007718 0.015945 -0.007781 0.014596 -0.010835 -0.003104 
+0.010407 -0.035354 -0.002032 -0.015271 -0.012620 0.006787 
+-0.021327 -0.003209 0.029210 -0.009299 0.050580 0.010099 
+-1.684211 4.526316 0.700000 -1.674267 2.465798 1.055375 
+-1.821212 1.036364 1.072727 0.001502 -0.002767 -0.001186 
+3.440678 -3.841808 -3.271186 3.222749 -5.478673 -2.521327 
+2.517391 -5.386957 -1.482609 2.426229 -4.972678 -1.568306 
+0.011174 -0.034722 -0.021219 -0.002985 -0.003449 0.001748 
+-0.019107 0.006840 0.004128 -0.010017 0.012725 0.010082 
+-0.015883 0.002839 -0.004098 -0.014730 0.006959 -0.002076 
+-0.014511 0.008868 -0.002023 -0.015074 0.006276 0.000682 
+-0.008941 -0.002194 0.001083 0.001832 -0.008924 0.000428 
+0.001718 -0.003708 0.004200 0.001001 0.000320 -0.000343 
+0.001142 0.005644 0.000388 0.003236 0.003802 -0.000835 
+-0.004887 0.005548 0.001321 -0.006061 0.004584 0.000054 
+-0.003134 0.005991 0.000980 0.000773 0.005597 0.004343 
+0.001393 0.001212 0.003060 0.001431 0.001550 -0.002147 
+-0.000314 -0.002541 0.000219 0.002038 -0.002209 0.000183 
+0.003343 -0.005036 0.004430 -0.005237 -0.001203 0.002974 
+-0.000477 0.006354 -0.005375 0.000353 0.004210 -0.006601 
+0.000875 0.002142 -0.002037 -0.000366 -0.000723 -0.000844 
+0.000296 -0.002109 -0.004115 0.000974 -0.000649 -0.006601 
+0.001713 -0.000161 -0.002909 0.000661 0.002636 0.000728 
+0.001892 0.005759 0.004027 -0.000607 0.008845 0.001580 
+-0.004385 0.005046 -0.000507 -0.004280 0.000040 -0.007536 
+-0.004714 -0.006355 -0.016654 -0.005167 -0.000141 -0.029730 
+-0.002634 -0.006724 -0.014683 0.021311 0.023952 0.017007 
+0.007477 0.014339 0.001037 0.001105 0.007435 0.005804 
+2.413223 3.347107 1.636364 2.551111 3.084445 3.248889 
+2.725552 3.287066 2.545741 2.771513 3.462908 1.997033 
+2.413043 3.057971 1.572464 0.002411 0.018258 0.004860 
+-0.004731 0.011044 -0.005899 -0.003091 0.005760 -0.008161 
+-0.008145 -0.002883 0.014220 0.001869 0.004117 0.014441 
+0.008627 0.005569 0.007885 -0.001115 -0.000908 0.003696 
+-0.012299 -0.007635 0.006924 -0.009802 -0.011181 0.007771 
+-0.010392 -0.004780 0.005623 -0.004393 0.002215 -0.000028 
+-0.004520 -0.001035 0.002946 -0.005602 -0.004096 0.004374 
+0.005834 0.001871 -0.006170 -0.003381 0.003775 -0.014920 
+0.009237 0.003066 -0.012126 0.018325 -0.004689 0.003462 
+0.006865 -0.024144 0.020988 -0.022518 -0.014379 0.028852 
+-0.022243 0.031606 0.019335 -1.275591 5.889764 0.834646 
+-0.973333 5.115556 0.982222 -0.989170 3.588448 1.028881 
+-0.012028 0.011012 0.008213 3.863388 -2.568306 -2.333333 
+4.034616 -5.430769 -1.753846 3.325658 -5.773026 -1.427632 
+3.181132 -5.822641 -1.705660 2.852632 -4.968421 -1.857895 
+0.006422 -0.023434 -0.018602 0.000883 0.009944 -0.006437 
+-0.022381 0.016075 -0.006580 -0.002686 0.010078 -0.005454 
+-0.017320 0.001855 -0.000690 -0.013163 0.009365 0.000755 
+-0.014685 0.011710 -0.005653 0.001850 0.003471 -0.005804 
+0.000778 -0.008771 0.002147 0.002720 -0.007031 0.002180 
+0.000959 0.000268 0.002977 0.000934 0.000736 0.002807 
+-0.000857 0.004401 0.000585 -0.003330 -0.000216 0.001905 
+-0.007821 0.003111 0.000588 -0.003860 0.004419 -0.000339 
+-0.000950 0.005524 0.002742 0.000864 0.003248 0.003646 
+-0.000370 0.001926 -0.000050 0.001310 -0.000494 -0.002244 
+0.000844 0.000669 0.000478 0.000767 -0.000903 -0.000020 
+0.003643 -0.000937 0.000708 0.003309 -0.004364 0.002039 
+-0.001152 0.006023 -0.005725 0.000718 0.000026 0.000744 
+0.002975 0.001637 0.002261 0.000395 -0.000104 -0.001501 
+0.000114 -0.003096 -0.005252 -0.001345 0.001267 -0.010369 
+0.004190 0.000888 -0.005691 0.001667 0.002754 -0.001816 
+0.002238 0.003951 0.000228 0.000937 0.005980 -0.000931 
+0.002990 0.002642 -0.005266 0.005632 -0.005306 -0.010315 
+-0.000610 -0.002275 -0.016591 -0.009146 0.002169 -0.020307 
+-0.011017 -0.017763 -0.018552 0.001398 -0.036064 0.026119 
+0.002780 0.001699 0.014728 0.000926 0.009889 -0.001500 
+0.009172 0.017106 -0.022287 0.010018 0.022075 -0.000309 
+1.450758 2.481061 1.102273 1.208333 2.934028 1.013889 
+0.848740 2.949580 0.668067 -0.004288 0.014927 0.007277 
+-0.004164 0.003713 -0.000258 -0.001304 0.000510 -0.000170 
+0.002533 0.007394 -0.002563 0.005839 0.009680 -0.002875 
+0.005367 0.006806 0.000442 -0.000729 0.000225 0.003454 
+-0.007134 -0.003270 0.006532 -0.007649 -0.002395 0.002784 
+-0.007644 0.001789 -0.002884 -0.009189 0.003822 0.001642 
+-0.014693 -0.001422 0.009526 -0.014347 -0.012938 0.011594 
+-0.011481 -0.008028 0.005302 -0.006059 0.003199 -0.005898 
+0.008624 0.001742 -0.006462 0.010940 -0.006098 0.003706 
+-0.006666 -0.019397 0.018208 -0.007744 -0.004669 0.023100 
+-0.014094 0.019297 0.012928 -0.430693 5.168317 1.400990 
+-0.558935 5.190114 1.547529 -0.699153 4.122881 1.105932 
+0.008672 0.005530 0.004414 3.325688 -4.981651 -0.697248 
+3.365559 -5.839879 -1.084592 3.451327 -5.932153 -1.604720 
+3.305556 -6.261905 -1.924603 2.512820 -5.346154 -1.974359 
+0.007605 -0.015336 -0.018006 -0.008563 0.016234 -0.007027 
+-0.011809 0.002309 -0.006749 -0.005001 0.006088 0.004835 
+-0.007876 0.011214 -0.004429 -0.012650 0.011959 -0.002459 
+-0.015625 0.007585 0.000828 0.002766 -0.001613 0.004107 
+0.001319 -0.004328 -0.000583 -0.000166 0.001193 -0.000361 
+0.005323 0.002366 -0.001102 0.005142 0.001089 -0.000689 
+-0.000574 -0.000144 -0.001471 -0.002168 -0.000498 -0.000853 
+-0.002331 -0.000676 -0.000283 -0.001745 0.000959 -0.000063 
+0.000235 0.001445 0.001335 -0.001140 0.000278 0.002156 
+0.000288 -0.000458 -0.000483 0.000502 -0.000593 -0.000376 
+-0.001408 0.001756 -0.002036 -0.000501 0.001163 -0.000539 
+0.000438 -0.003064 0.001232 -0.000839 -0.005378 0.001374 
+-0.000486 0.002605 0.000704 0.003565 0.003756 0.001178 
+0.005604 0.003023 0.000049 0.006735 0.002499 -0.004829 
+0.006266 0.000530 -0.005883 0.002681 -0.001433 -0.005042 
+0.000653 -0.000240 -0.003000 0.001630 0.001416 -0.002159 
+0.002644 0.000775 -0.001311 -0.004233 0.001906 -0.001981 
+0.000724 -0.000524 -0.002674 -0.001588 -0.003068 -0.001639 
+0.001057 -0.000128 -0.001329 0.000240 -0.000479 -0.000499 
+-0.010936 -0.006431 -0.011010 -0.030976 -0.013138 -0.007390 
+-0.001686 -0.006404 -0.002480 0.002341 0.002264 0.007525 
+0.006768 0.009361 -0.000444 0.009150 0.010147 0.001373 
+0.005454 0.016387 0.009541 0.002081 0.020524 0.013394 
+-0.003033 0.021207 0.012286 -0.004220 0.016319 0.008516 
+-0.001452 0.007119 0.003631 0.002419 0.005032 0.001495 
+0.006572 0.006988 0.000753 0.009777 0.005315 0.000734 
+0.006911 0.005326 -0.001440 -0.000231 0.003017 0.004153 
+-0.000648 0.003047 0.003535 0.001805 0.000479 0.000527 
+0.001370 -0.000652 -0.001978 -0.001994 0.000269 -0.000152 
+-0.004334 -0.001314 0.002807 -0.004878 -0.003963 0.003468 
+-0.005667 -0.002783 -0.000806 -0.003192 0.001276 -0.004960 
+0.001053 0.001056 -0.008443 0.002543 -0.001798 0.001267 
+-0.002346 -0.024129 0.001374 -0.000048 -0.002937 0.002614 
+-0.003937 0.032965 0.007365 -0.004292 5.017168 1.523605 
+-0.007874 4.736220 1.763780 -0.014881 0.029965 0.011360 
+1.327273 -3.163636 -0.060606 2.763699 -5.544520 0.202055 
+3.188830 -5.598404 -0.598404 3.464072 -5.682635 -1.613773 
+3.300926 -5.800926 -2.268518 2.423424 -4.675676 -2.639640 
+-0.003039 -0.012403 -0.013990 -0.008489 0.009286 0.004109 
+-0.006696 0.006291 -0.004404 -0.000466 0.011913 -0.007891 
+0.000597 0.015169 -0.019153 -0.009525 0.011065 -0.009838 
+0.000455 -0.012665 0.013836 0.004761 -0.008549 0.006874 
+0.002196 -0.007296 -0.002284 -0.000771 -0.006389 -0.001559 
+-0.000733 -0.002319 -0.001109 -0.000049 -0.000537 -0.000980 
+-0.000255 0.001567 -0.002050 -0.000220 0.004372 -0.004707 
+0.002294 0.007144 -0.004928 0.003635 0.005557 -0.002073 
+0.001538 -0.000622 0.001399 -0.000914 -0.002473 0.006165 
+-0.005148 -0.006542 0.005313 -0.003869 -0.004073 -0.003943 
+-0.000896 -0.001306 -0.007990 0.002731 -0.002982 -0.005651 
+0.000412 -0.002460 -0.003006 -0.005123 -0.000854 0.004848 
+0.000260 -0.002076 -0.001075 -0.001037 -0.001740 -0.000998 
+0.002153 -0.001017 -0.002505 0.006695 0.010851 -0.010015 
+0.010564 0.003759 0.001500 0.007578 -0.000410 -0.003427 
+0.000548 -0.001773 -0.003842 -0.003679 -0.002316 -0.004155 
+-0.000522 -0.001813 -0.001369 -0.001064 -0.000408 0.000389 
+-0.003099 -0.003611 0.002161 -0.004554 -0.002814 0.004051 
+-0.002207 0.000096 0.003455 -0.006100 -0.001023 0.000211 
+-0.011811 0.008836 -0.007232 -0.008510 -0.000772 -0.007533 
+-0.003495 -0.005070 -0.004844 0.000947 -0.012561 -0.004037 
+-0.002091 -0.004978 0.005756 -0.000494 0.002205 0.005771 
+0.001272 0.011051 0.008338 -0.000610 0.014994 0.007612 
+-0.004568 0.014071 0.004308 -0.008956 0.011288 -0.000442 
+-0.010865 0.003796 -0.001058 -0.000074 -0.001353 -0.000083 
+0.004118 -0.001220 -0.004184 0.005012 -0.002945 -0.001141 
+0.002259 -0.000286 0.001931 -0.000232 0.001081 0.001984 
+0.001454 0.001824 0.001194 0.003987 0.004679 0.002646 
+0.002008 0.003362 0.003646 0.002878 0.000260 0.001279 
+0.001613 -0.000629 -0.003319 0.002101 0.002023 -0.005913 
+0.005593 0.004719 -0.006775 0.005177 0.002675 -0.006072 
+0.004425 0.000960 -0.007341 0.000930 -0.011168 -0.011633 
+0.000030 -0.025112 -0.006263 0.001337 0.006188 -0.003639 
+0.010217 0.037876 0.013537 0.209677 4.693548 1.483871 
+0.001416 0.031148 0.017784 -0.013308 -0.008274 0.008206 
+1.029167 -5.304167 1.341667 2.319261 -5.269129 0.915567 
+2.852500 -5.165000 -0.047500 3.217391 -5.371237 -1.244147 
+3.341317 -4.970060 -2.664671 0.032095 -0.022987 -0.030205 
+0.005897 0.005284 -0.017397 0.001947 0.001924 -0.001680 
+-0.002675 0.002610 -0.003483 -0.002684 0.009208 -0.014526 
+-0.001109 0.017693 -0.034270 0.005263 0.013521 -0.007098 
+-0.001151 -0.005148 0.007276 0.001476 -0.010885 0.004703 
+0.004614 -0.013542 0.000655 0.006579 -0.008967 -0.002686 
+0.004269 -0.003170 -0.001724 0.000870 0.001603 -0.000388 
+-0.003201 0.002010 -0.001022 -0.004525 0.000942 -0.001978 
+0.000658 0.000653 0.000152 0.002922 0.002544 -0.000086 
+0.003607 0.000572 -0.002520 0.003876 -0.001530 0.000697 
+0.001983 -0.003960 0.000625 -0.001993 -0.000484 -0.000867 
+0.000161 0.000202 -0.008189 0.004005 0.002146 -0.007915 
+-0.002569 -0.001789 -0.004415 -0.002635 -0.000505 -0.001114 
+0.001425 0.000163 0.000766 0.000314 -0.000114 0.000075 
+0.000161 0.002827 0.001097 0.002413 0.008382 -0.002031 
+0.000000 0.008295 -0.003411 0.006171 0.004287 -0.005465 
+0.002116 0.000817 -0.007655 -0.002431 -0.000828 -0.003954 
+0.004157 0.002470 -0.002000 0.000785 0.000766 -0.002581 
+-0.000667 -0.000095 -0.000197 -0.000347 0.001300 0.000506 
+0.000693 0.000501 -0.000211 -0.003080 -0.000484 -0.002044 
+-0.006310 0.002025 0.001169 -0.004442 0.001575 0.002090 
+-0.001051 0.000804 -0.006059 0.003979 -0.000444 -0.005277 
+0.004519 -0.006506 -0.008408 -0.000807 -0.013200 -0.008090 
+0.003309 -0.004132 -0.004349 0.001173 0.000619 0.000118 
+-0.002517 0.004504 0.000866 -0.005935 0.007413 -0.003101 
+-0.002255 -0.001433 -0.013385 0.001935 -0.006747 -0.011779 
+0.004321 -0.006037 -0.005610 0.002312 -0.001015 -0.001288 
+-0.005832 -0.001200 0.001819 -0.007731 -0.004367 0.000326 
+-0.002351 -0.000778 -0.004738 -0.004850 0.008178 -0.004565 
+-0.003372 0.007286 -0.000332 0.001648 0.001658 0.002161 
+0.000979 -0.002027 -0.001259 0.001372 0.000918 -0.000169 
+0.001732 0.000390 -0.000869 0.002992 0.001332 -0.001507 
+0.005259 0.002520 -0.007429 0.006362 -0.000939 -0.013389 
+0.007152 -0.003494 -0.011597 0.002868 0.001869 0.004336 
+0.004513 0.028851 0.012746 0.002900 0.027955 0.012155 
+-0.004588 0.011321 0.005977 -1.141243 -4.062147 2.050848 
+1.144231 -5.169872 2.342949 2.187805 -4.760976 1.473171 
+2.702413 -4.841823 0.343164 3.048000 -5.284000 -1.072000 
+2.742647 -4.948529 -2.713235 0.009191 -0.025698 -0.024020 
+0.005548 0.000125 -0.005266 0.004004 -0.008465 -0.004810 
+0.002171 -0.001840 -0.011764 -0.005381 0.010537 -0.027236 
+0.009695 0.023110 -0.006087 -0.000431 -0.002646 0.016048 
+0.006307 -0.004503 0.014312 0.004497 -0.006610 0.007798 
+0.001298 -0.004951 0.000575 -0.000729 -0.002098 -0.002253 
+0.004498 0.001897 -0.001655 0.002738 0.005552 -0.000359 
+-0.004408 0.001742 0.000642 -0.002167 -0.001209 -0.002923 
+-0.000984 -0.000122 0.000922 0.000407 0.002727 -0.000963 
+0.002561 0.003512 -0.004793 0.003805 0.003240 0.000791 
+0.002618 0.001615 -0.000560 -0.001560 -0.000778 0.000333 
+-0.002005 -0.003334 0.002244 0.000000 -0.000227 0.002045 
+-0.003197 0.002194 -0.000716 -0.000096 0.000143 0.000176 
+0.002045 -0.001110 0.000527 0.002331 -0.000759 -0.002116 
+-0.000281 0.001834 -0.004966 -0.001468 0.003144 -0.003855 
+-0.000250 0.001181 0.000071 0.000010 0.001686 -0.000745 
+-0.001354 0.002316 -0.000132 0.000000 0.002768 0.002946 
+0.000543 0.000065 0.001559 0.000597 0.000217 0.000229 
+0.001809 0.004515 -0.001638 0.000958 0.005936 -0.002106 
+0.000596 0.001859 -0.004118 -0.000877 0.000019 -0.000996 
+-0.001421 -0.000933 -0.000503 0.001089 -0.001825 -0.000803 
+0.006133 0.001055 -0.002017 0.004003 0.007287 -0.008698 
+0.006697 0.002686 0.001639 0.002566 0.001129 0.000047 
+-0.002448 -0.004145 0.001740 0.000269 -0.006423 -0.005576 
+-0.001245 -0.002107 -0.002283 0.001380 0.010463 -0.001069 
+-0.002660 0.001631 -0.003115 -0.000719 -0.001426 -0.003417 
+-0.000390 -0.002785 -0.003669 -0.001017 -0.002038 -0.003447 
+-0.002811 -0.002534 -0.001736 -0.000652 -0.001178 -0.000453 
+0.002659 0.002621 -0.002849 0.000633 0.008004 -0.001767 
+-0.000634 0.003288 0.000929 -0.000929 0.000000 0.003143 
+-0.001306 0.001147 0.000862 -0.000681 0.000892 0.000769 
+-0.000713 0.000991 0.000939 -0.001734 0.001270 0.001260 
+0.003014 0.002116 -0.000036 0.005974 -0.000080 -0.003899 
+0.007531 0.001342 -0.004565 0.007810 0.002688 -0.001907 
+-0.000680 -0.001016 0.005185 -0.000424 0.007464 0.001944 
+-0.005474 0.001160 0.010087 -0.470046 -4.202765 2.631336 
+1.403409 -4.840909 2.704545 2.276543 -4.553086 1.866667 
+2.758112 -4.492625 0.592920 2.779736 -4.616740 -0.977974 
+1.559441 -4.202797 -1.923077 -0.003557 -0.022393 -0.008956 
+0.004427 -0.006195 0.002724 0.002971 -0.003989 -0.002848 
+-0.001958 0.003437 -0.017355 -0.019434 0.032782 -0.006306 
+-0.011901 0.027920 -0.004530 -0.002256 0.004350 0.001203 
+0.002223 -0.003071 -0.000747 0.003946 -0.005603 -0.001173 
+0.001928 -0.005568 -0.000565 -0.000306 0.001615 -0.000339 
+0.004776 0.010532 0.000070 0.009196 0.006981 -0.001365 
+0.000247 0.000044 0.000525 -0.004154 0.000054 0.006014 
+-0.001116 -0.006972 0.003976 0.001522 -0.000732 -0.002029 
+0.001892 0.007685 -0.004788 0.002851 0.008404 -0.001601 
+-0.000178 0.005822 0.001362 -0.004870 0.000609 -0.000696 
+0.000090 -0.000419 0.000986 -0.001238 -0.004092 0.005115 
+-0.003647 -0.000659 0.005667 -0.000704 -0.001772 0.004231 
+0.001080 -0.001675 0.002580 0.001319 0.002753 -0.002311 
+0.002234 0.004140 -0.005769 0.000097 0.000786 -0.005404 
+-0.000167 -0.000842 -0.000555 -0.000600 0.000216 0.000819 
+-0.001380 0.000327 0.002515 -0.000942 0.001325 0.000299 
+-0.002416 -0.001231 -0.001350 -0.003648 -0.002254 -0.000984 
+-0.001724 0.001350 -0.000240 -0.002536 0.004219 -0.002403 
+-0.004461 0.001072 -0.002916 -0.002939 -0.002082 -0.003107 
+-0.003287 -0.000845 -0.003801 -0.004314 0.000539 -0.003186 
+0.001106 -0.004120 -0.003160 0.001492 -0.000903 -0.005341 
+-0.001141 0.000740 -0.000115 0.001505 0.002527 0.002091 
+0.000158 0.003692 0.002562 -0.000490 0.003256 -0.001239 
+0.001870 0.006339 -0.006115 0.000639 0.009591 -0.000122 
+-0.000737 0.005997 0.001939 -0.000348 0.004157 0.000759 
+-0.001686 0.000746 -0.001286 -0.001817 -0.000956 0.000004 
+0.002092 -0.000139 -0.001576 0.004293 0.004351 -0.004497 
+0.004886 0.008544 -0.006752 0.003230 0.005142 -0.006204 
+-0.000945 -0.000223 -0.001424 -0.004720 -0.002431 0.000511 
+-0.005847 -0.001314 -0.000065 -0.004737 -0.001532 0.000356 
+-0.002937 -0.000455 0.000864 0.000310 0.003625 0.000483 
+0.000520 -0.000278 0.000079 0.005561 -0.000341 -0.002642 
+0.003518 0.002468 -0.003616 0.002941 0.002967 -0.001008 
+0.001113 -0.010369 -0.000286 -0.000271 -0.004914 0.002891 
+-0.000710 -0.008316 0.015852 0.250000 -3.570312 2.683594 
+1.595687 -4.463612 2.773585 2.260760 -4.587342 2.162025 
+2.744479 -4.403786 1.018927 2.822967 -3.909091 -0.531100 
+0.014244 -0.030582 -0.014693 0.006927 -0.013416 -0.003781 
+0.003129 -0.001948 0.007560 -0.001803 0.004541 0.003716 
+-0.003812 0.010583 -0.010100 -0.014025 0.014272 -0.017499 
+-0.019260 0.016751 -0.007125 -0.009464 0.009519 0.001473 
+-0.003116 0.003815 0.001698 -0.000073 -0.000216 -0.000427 
+0.002278 -0.001908 0.000114 0.005305 0.002704 0.000454 
+0.004967 0.003401 -0.000984 -0.001560 0.001560 0.001120 
+-0.004386 -0.002215 0.003213 -0.005789 -0.003622 0.001283 
+-0.001487 -0.004000 -0.000888 -0.001140 0.002165 -0.000826 
+0.001860 -0.000754 -0.005427 0.002973 0.002527 -0.000267 
+0.000082 -0.000443 -0.001787 0.003896 -0.000683 0.000929 
+0.002197 -0.000194 0.002069 -0.002167 -0.001036 0.002991 
+-0.006076 -0.001770 0.002408 -0.001543 0.001062 0.000580 
+-0.000393 0.001062 0.004813 -0.001587 -0.002276 0.007707 
+-0.001665 0.000335 0.006204 -0.003230 -0.000359 0.002590 
+0.000529 0.001436 -0.000602 -0.000296 0.000267 -0.002706 
+0.000550 -0.002599 -0.002523 -0.000921 0.000288 -0.001640 
+-0.003044 0.001545 -0.002435 -0.004361 0.001508 -0.000740 
+0.000576 0.000814 -0.001118 0.000987 -0.000583 -0.000101 
+-0.001247 0.000596 -0.001897 -0.003644 0.002146 -0.003432 
+-0.003673 0.002925 -0.005210 -0.003633 -0.000287 -0.004429 
+0.000062 -0.005678 -0.001373 0.000290 -0.004687 -0.001038 
+0.002004 -0.002457 -0.000034 0.005949 0.002501 -0.000183 
+0.002450 0.006754 0.001987 -0.003404 0.006186 0.004236 
+-0.000731 0.003195 -0.000077 -0.000305 -0.000430 -0.000189 
+-0.002832 -0.002474 -0.003670 -0.002466 -0.002999 -0.002258 
+-0.002059 -0.002365 0.000358 -0.001280 -0.001340 -0.000040 
+-0.003988 -0.000253 0.001952 -0.003073 -0.001620 0.004328 
+-0.001590 -0.001098 0.002192 -0.001107 0.002463 0.000407 
+-0.003330 0.005480 -0.001428 -0.004657 0.003001 -0.002912 
+-0.005456 -0.002024 -0.002659 -0.004920 -0.002777 -0.002008 
+-0.001431 0.001678 -0.000063 0.002511 0.005571 0.003031 
+0.003353 0.003411 0.003380 0.006726 0.004683 -0.004453 
+0.001808 0.007648 -0.007498 0.004850 0.013309 -0.009355 
+0.002399 0.003553 -0.000226 0.000102 -0.006305 0.001915 
+0.000399 -0.016347 0.017109 0.924812 -3.116541 2.687970 
+1.812500 -4.011364 2.900568 2.315341 -4.440341 2.471591 
+2.834586 -4.327068 1.402256 2.786585 -3.292683 -0.371951 
+0.013618 -0.010813 -0.010726 0.001565 -0.002074 0.001466 
+0.006803 -0.004434 0.010969 0.009178 0.005811 0.014559 
+0.019206 0.012307 -0.008406 0.001821 0.003922 -0.010916 
+-0.005435 0.002465 0.002854 -0.008483 0.002244 0.011057 
+-0.006623 0.003818 0.008453 -0.005366 -0.000297 -0.000059 
+0.003096 0.006057 -0.004010 0.005042 0.007620 -0.006693 
+0.002421 0.001761 -0.001249 -0.003227 -0.002637 0.004093 
+-0.003327 -0.004074 -0.000430 -0.001870 -0.000143 -0.000155 
+0.000631 0.001418 0.001664 0.000462 0.003592 0.003515 
+-0.000756 0.003219 0.002146 0.001228 0.000006 0.001641 
+0.000515 0.000601 0.001145 0.001226 0.002365 0.002297 
+0.001077 0.002948 0.002262 -0.000797 -0.000755 0.002434 
+-0.002846 -0.002923 -0.000769 -0.003045 -0.003045 0.001128 
+0.001121 -0.003546 0.005471 0.001337 -0.001172 0.006181 
+0.001710 0.003862 0.003421 -0.003233 0.004464 -0.001819 
+-0.001411 0.004374 -0.003248 -0.001315 -0.001370 -0.003787 
+-0.003239 -0.003434 0.001209 -0.002728 -0.001269 0.004679 
+0.000398 -0.001084 0.001654 0.002185 0.000289 -0.000241 
+0.003361 -0.002227 -0.002311 0.002950 -0.002097 -0.000029 
+0.000754 -0.001324 0.001864 0.000699 -0.000143 0.000593 
+0.000140 0.000912 -0.000021 -0.000979 -0.000574 -0.001430 
+0.004227 0.001981 -0.002830 -0.000382 -0.000345 -0.001944 
+0.000405 0.003893 0.002183 -0.003315 0.005586 0.002493 
+-0.003007 0.004818 0.003727 0.002356 0.004044 -0.000324 
+0.004804 0.000343 -0.000841 -0.002959 -0.004218 -0.001648 
+-0.005793 -0.008726 -0.000380 -0.004118 -0.004118 -0.001863 
+0.001162 0.003164 -0.005367 -0.000480 0.007073 -0.001773 
+-0.004483 0.004366 0.001455 -0.008416 -0.004489 0.013690 
+-0.009854 -0.004793 0.009589 -0.002243 0.001209 0.000678 
+0.000481 0.003707 0.001379 0.000549 0.002078 0.000775 
+-0.001514 -0.000796 -0.000956 -0.001729 -0.000645 -0.003029 
+-0.000335 0.000185 -0.002081 0.000356 0.002690 -0.001573 
+0.001287 0.001802 0.000236 0.001752 0.001806 -0.002272 
+-0.000583 0.005341 -0.003783 0.000271 0.013827 -0.013362 
+-0.004992 0.015246 -0.008815 -0.001175 -0.000249 -0.002880 
+0.002307 -0.013309 0.015330 1.089069 -2.595142 2.672065 
+1.860068 -3.498293 3.010239 2.395522 -3.958955 2.615672 
+2.913513 -3.724324 1.362162 0.021680 -0.020059 -0.004673 
+0.000162 0.003137 -0.004267 -0.003097 0.003054 0.002320 
+0.007226 -0.004488 0.004995 -0.001506 -0.004458 0.004318 
+-0.011523 0.004586 0.002089 -0.010740 0.005314 0.003403 
+-0.006293 0.001553 0.005127 -0.003591 -0.002805 0.005145 
+0.001863 -0.000882 0.001782 0.000534 -0.000280 0.000991 
+-0.003636 0.000909 0.002727 -0.006288 0.004391 -0.001996 
+-0.002769 0.006749 -0.003788 -0.001257 0.005661 -0.003536 
+-0.000520 -0.000303 -0.005524 -0.000508 0.000628 -0.001270 
+-0.005979 -0.000291 0.004445 -0.004425 -0.002462 0.008672 
+-0.003734 0.002073 0.004563 0.004493 0.003878 0.002060 
+0.001436 0.003863 0.002592 -0.001045 0.006269 0.000373 
+0.000154 0.003955 -0.001395 -0.000418 -0.002649 -0.000557 
+-0.002326 -0.000205 0.001253 -0.000428 -0.000554 0.001024 
+0.000536 -0.001673 0.006169 -0.000969 -0.002885 0.001655 
+0.001375 -0.000278 0.001586 0.001659 -0.000626 -0.001946 
+0.002392 -0.001720 -0.006583 0.001278 -0.002064 -0.001198 
+-0.002417 0.006500 0.000000 -0.004683 0.006394 -0.003172 
+-0.002148 0.000270 -0.003747 0.000417 -0.001343 -0.001744 
+0.000604 0.001008 0.001501 -0.000275 0.003132 0.002450 
+-0.002994 -0.000819 0.001723 0.001197 -0.004426 -0.000536 
+-0.001429 -0.003146 -0.004894 -0.003123 0.002888 -0.008169 
+-0.002233 0.000466 0.000233 -0.001980 -0.000909 -0.003307 
+-0.002508 -0.003001 0.001085 -0.001909 -0.001603 0.001534 
+-0.000283 0.002712 -0.000300 0.003193 0.003846 -0.001041 
+-0.001506 -0.001755 -0.000139 -0.007671 -0.005727 0.000401 
+-0.007140 -0.002036 -0.000001 -0.001014 0.002793 -0.006834 
+0.000382 0.006409 -0.006735 -0.000088 0.003243 -0.002987 
+-0.001900 -0.001594 0.001410 -0.003319 -0.001261 0.006202 
+-0.001690 0.001462 0.001915 0.003738 0.000902 0.000048 
+0.001591 -0.003004 0.000089 0.005339 -0.003534 -0.005377 
+0.004898 -0.000324 -0.001741 -0.001395 -0.000063 -0.000377 
+-0.005320 -0.002101 -0.001963 -0.003091 -0.005215 -0.002271 
+-0.000524 -0.002746 0.001340 -0.000844 -0.000719 0.002513 
+-0.002712 0.006923 -0.000438 -0.001704 0.021007 -0.014135 
+-0.012561 0.022512 -0.015108 -0.002315 0.003207 -0.005557 
+0.003055 -0.010169 0.011976 0.764151 -1.754717 2.113208 
+1.449339 -2.259912 2.277533 2.078947 -2.489474 1.836842 
+0.018542 -0.025753 0.000460 0.009436 -0.011868 -0.003424 
+-0.002718 -0.005429 -0.001463 -0.001956 -0.006116 0.002024 
+0.000450 -0.005260 0.005007 -0.001935 0.000289 0.004843 
+-0.005276 0.002418 0.006099 -0.006927 0.002726 0.004158 
+-0.002444 0.002222 -0.003128 0.001569 0.003931 -0.006472 
+0.005111 0.000479 -0.004695 0.000480 -0.000916 0.001006 
+-0.003839 0.002389 0.004691 -0.007949 -0.001666 -0.003463 
+-0.004730 0.000286 -0.007879 0.000624 -0.000525 -0.008729 
+0.000426 -0.000810 -0.002731 0.000692 -0.001972 0.003805 
+-0.000076 0.000047 0.007254 0.001836 -0.002108 0.004071 
+0.001010 -0.001364 -0.001276 -0.001272 -0.001013 -0.003648 
+0.001973 -0.001864 -0.001521 0.005361 0.002546 -0.006064 
+0.005273 -0.000325 -0.005030 -0.002955 -0.003636 -0.002955 
+0.000861 -0.004123 0.000165 -0.003311 -0.004969 0.001301 
+0.000124 -0.000060 0.000062 0.001770 -0.001483 0.001374 
+0.003905 -0.003446 0.000996 0.005776 -0.003664 -0.002176 
+0.005228 -0.000069 -0.004950 0.003933 0.007040 -0.006214 
+0.004305 0.003690 -0.007632 0.001495 0.005284 -0.009287 
+-0.003240 0.005016 -0.007362 -0.003022 0.002474 -0.000570 
+0.000123 0.004193 0.000275 -0.002725 0.001851 -0.001132 
+-0.002382 -0.000428 -0.002286 0.000075 -0.001108 -0.000859 
+0.000174 0.006971 -0.001601 0.004003 0.009098 -0.003519 
+0.000477 0.004965 0.000432 0.000152 -0.003611 0.001455 
+0.002252 -0.004875 0.003993 0.002966 -0.002583 0.001596 
+-0.001005 -0.000438 0.000548 -0.004765 -0.004273 0.001157 
+-0.006453 -0.007622 -0.000088 -0.003222 -0.003786 0.001131 
+-0.008261 0.010280 -0.003171 -0.006033 0.004109 -0.010085 
+-0.004516 -0.003316 0.000983 -0.000712 -0.003322 0.006451 
+0.003309 -0.000292 0.005404 0.002018 0.000406 0.001620 
+0.000052 0.000482 -0.004232 0.002000 -0.000720 -0.007200 
+0.005483 0.000418 -0.006739 0.006126 0.003093 -0.000276 
+0.001232 0.002160 0.000534 -0.001446 0.000774 -0.000150 
+0.000311 -0.000316 -0.002243 0.003053 -0.000660 0.000066 
+0.001291 -0.002167 -0.001107 0.002209 -0.003191 0.003925 
+-0.003102 0.002931 -0.001976 -0.012833 0.012473 -0.010841 
+-0.003957 0.021307 -0.019970 0.001654 0.013391 -0.008450 
+0.005443 0.002702 0.002703 0.007348 -0.004848 0.006508 
+0.006697 -0.010325 0.005509 0.006256 -0.013173 0.003763 
+0.004393 -0.012314 0.000885 -0.002611 -0.006580 0.001932 
+-0.006902 -0.005923 0.005798 -0.003688 -0.005515 0.013333 
+-0.000472 0.002851 0.012288 -0.001899 0.002485 0.006089 
+-0.000553 0.000189 0.002296 -0.001222 -0.005360 -0.000784 
+-0.003411 -0.000322 0.000351 0.000662 -0.000588 -0.000214 
+0.000499 0.000772 0.000107 -0.001598 0.000313 0.000610 
+0.000155 0.001298 -0.000882 0.002275 0.000433 -0.002790 
+0.000201 0.001065 -0.003831 0.001196 -0.000615 0.001892 
+0.002447 0.002395 0.001346 0.001110 -0.002699 0.001846 
+0.001852 -0.001041 0.000218 -0.000526 -0.000660 -0.002450 
+0.001576 0.001408 -0.004593 0.003647 0.002367 -0.005760 
+0.003915 0.000018 -0.005951 0.004384 -0.001116 -0.002486 
+0.000853 -0.004560 -0.001221 -0.001756 -0.005069 -0.002534 
+-0.003058 -0.005302 -0.000735 0.000213 -0.002327 -0.001928 
+0.000976 0.000787 -0.002929 0.003457 0.003871 -0.003416 
+0.008208 0.002648 -0.003119 0.004982 0.000163 -0.007105 
+0.000259 0.004245 -0.004302 -0.003527 0.000598 -0.001283 
+-0.000775 0.000254 -0.000315 0.003254 0.002241 0.000183 
+0.002517 0.002515 0.000724 -0.002563 -0.001579 -0.000324 
+-0.002634 0.003058 -0.001697 0.000469 0.000360 -0.007279 
+-0.001914 0.003828 -0.008103 0.000583 0.009000 -0.002917 
+0.002675 0.004409 -0.002747 0.003366 0.004455 0.003959 
+-0.000023 0.003098 0.002005 0.002784 -0.000720 0.000034 
+0.000691 -0.004433 0.000538 -0.001443 -0.001815 -0.003467 
+-0.006277 -0.005782 -0.002495 0.001311 -0.004393 -0.001911 
+0.004147 -0.000651 -0.003772 0.003121 0.006960 -0.009527 
+-0.003306 0.021108 -0.014690 -0.002524 0.011821 -0.016159 
+0.019643 -0.000783 0.007188 0.012911 -0.004537 0.026686 
+-0.002769 -0.005789 0.014784 -0.000424 -0.003631 0.003793 
+-0.005414 0.001941 -0.004386 0.002270 -0.000367 -0.005863 
+0.004113 0.002112 -0.004279 0.000798 0.002841 -0.002937 
+-0.002217 0.004409 -0.003386 -0.002752 0.002603 -0.002621 
+0.000762 -0.000129 0.003330 0.003069 0.001810 0.003695 
+-0.002558 -0.002115 0.001450 -0.000230 -0.003901 -0.000812 
+-0.002822 0.002650 -0.004379 -0.006632 0.003047 -0.005509 
+-0.004184 0.000918 -0.010254 -0.004945 0.003149 -0.009149 
+-0.003726 0.003708 -0.005842 -0.001829 0.001963 -0.002244 
+-0.001380 -0.001812 0.001682 -0.000932 -0.004506 0.005010 
+0.000428 -0.005572 -0.002197 -0.007575 -0.000963 0.000925 
+-0.003788 -0.000386 0.002554 -0.000158 -0.002367 0.006839 
+-0.001451 0.000076 0.007264 -0.005731 0.001989 0.005026 
+-0.003929 0.005664 0.003014 -0.004132 -0.002090 0.000333 
+-0.000011 -0.002055 0.001732 0.002956 0.000120 0.000353 
+0.000098 -0.000199 0.000146 -0.000413 -0.000296 0.000667 
+-0.003782 -0.002351 0.001402 -0.000288 -0.000661 0.000932 
+0.000068 0.001218 -0.001349 0.000305 0.001127 -0.000704 
+0.004969 -0.001307 -0.001483 0.000973 -0.001156 -0.005311 
+-0.000457 0.002018 -0.005523 -0.004351 0.001483 -0.002534 
+-0.002790 -0.000901 -0.000471 -0.001509 -0.000835 -0.000445 
+-0.002193 -0.001727 -0.001135 -0.004697 0.000182 -0.002078 
+-0.004820 0.001151 -0.000540 -0.001412 -0.000387 0.000247 
+0.001395 -0.000964 0.000214 0.002040 -0.002289 -0.001891 
+-0.002086 0.000669 0.003737 0.004191 0.001323 -0.000004 
+0.007580 0.002767 -0.005655 0.003960 0.003801 -0.008875 
+0.001028 0.001322 -0.007197 0.000083 -0.000629 -0.000672 
+0.005538 0.001529 0.002709 0.000076 0.001468 -0.000065 
+-0.000492 0.001610 0.000232 -0.003936 0.000667 -0.005137 
+-0.004822 0.001385 -0.005511 0.002824 -0.000382 -0.003969 
+0.007408 0.003293 -0.003721 0.006218 0.003521 -0.001051 
+-0.000339 0.001031 -0.000199 0.000437 -0.002263 0.002705 
+-0.000640 -0.003014 0.005320 -0.002474 -0.002363 0.000614 
+-0.000121 0.000626 -0.000931 0.000667 -0.001376 -0.003784 
+-0.003567 -0.002532 -0.007709 0.000391 -0.000141 -0.012621 
+0.001618 0.009928 -0.009269 0.003607 0.018615 -0.009383 
+0.014395 0.028324 -0.019845 0.022840 0.048261 -0.036341 
+0.075626 0.070036 -0.083719 0.015947 0.008944 0.018563 
+-0.005583 -0.008366 0.002307 -0.000938 0.000735 -0.003693 
+-0.002287 0.002717 -0.000785 0.000719 0.000239 -0.000397 
+-0.001902 -0.001567 -0.001347 0.000541 -0.000529 -0.002641 
+0.000751 -0.000241 -0.001759 -0.000114 0.000170 -0.000260 
+0.001912 -0.000654 0.001935 0.001089 0.000110 -0.000768 
+0.000274 -0.002193 -0.003739 0.000213 0.003333 -0.005612 
+-0.003297 0.006283 -0.003880 0.003869 -0.000207 -0.006323 
+0.010737 0.002035 0.000108 -0.004024 -0.007260 -0.000489 
+-0.002026 -0.004042 -0.002180 -0.005479 0.001612 -0.003475 
+-0.002946 0.005016 -0.002013 -0.002683 0.003861 -0.000144 
+-0.000816 0.001429 0.000918 -0.003299 -0.003401 0.003197 
+-0.000464 -0.002087 0.004510 0.000274 -0.004090 0.005992 
+0.000532 -0.002384 0.004567 -0.001765 0.001156 0.000623 
+-0.002401 0.004670 0.002533 -0.003046 -0.002184 0.005230 
+-0.001468 -0.005497 0.008798 0.000000 -0.003097 0.003805 
+0.000476 0.001003 -0.003619 0.002003 0.001395 -0.004734 
+-0.003221 -0.001456 -0.001176 -0.010656 -0.000697 -0.000697 
+-0.009611 -0.005830 0.003155 -0.005854 -0.004281 0.002887 
+-0.002239 -0.003507 0.000970 -0.000271 -0.000058 -0.000058 
+-0.001888 0.001579 -0.004130 -0.001558 0.000869 -0.003710 
+-0.000327 0.000181 -0.000315 -0.000270 -0.003695 0.004424 
+0.000028 -0.001047 0.001538 0.001945 0.002179 -0.002492 
+-0.000005 0.002243 -0.004928 -0.002484 0.003364 -0.004424 
+-0.003069 0.002640 -0.006439 -0.001401 0.003165 -0.006835 
+-0.002317 -0.001040 0.000970 0.000201 0.000441 -0.001143 
+0.001253 0.004355 -0.003580 -0.001477 0.001942 -0.004126 
+0.000959 0.002057 -0.003153 -0.001839 -0.001945 -0.000079 
+-0.003004 0.000363 -0.000115 -0.001241 0.001831 0.000880 
+-0.001966 0.002735 -0.000363 0.001074 0.001029 0.001284 
+0.000785 0.000077 -0.000549 -0.001105 0.000338 -0.000601 
+-0.000800 -0.000040 -0.000040 0.002407 0.006669 0.001389 
+0.002720 0.010675 -0.006239 0.002028 0.003660 -0.005826 
+-0.000816 -0.003285 0.000403 -0.001533 -0.000951 -0.000854 
+0.000482 0.003783 -0.001662 0.004288 0.001211 -0.001679 
+-0.000126 -0.002021 -0.001708 -0.000143 -0.002344 -0.004185 
+0.000652 0.002775 -0.001568 0.002572 0.011710 -0.002439 
+0.006408 0.012467 -0.005995 0.006413 0.006881 -0.004146 
+-0.019085 -0.000831 -0.029867 -0.012400 0.024771 -0.020860 
+0.002555 0.023225 -0.004413 0.002909 0.005897 0.000999 
+0.001459 0.002470 0.000885 0.001370 0.000092 -0.001638 
+0.000692 0.001438 -0.001301 0.000374 0.000052 0.000245 
+-0.000076 -0.000990 0.002929 0.000310 -0.001381 0.001810 
+-0.000422 0.000596 -0.001723 0.001701 0.002242 -0.001249 
+-0.000671 0.005174 -0.002669 -0.002930 0.005037 -0.001739 
+-0.003379 0.005520 -0.001811 0.013802 -0.004297 -0.007594 
+0.026793 0.012059 0.009158 0.002968 0.003992 0.001082 
+0.000053 0.001524 -0.001430 0.000014 0.004245 -0.001827 
+0.000107 0.007149 0.002098 0.006295 0.007686 -0.004308 
+-0.001030 0.006401 -0.002254 -0.002194 0.002898 0.003535 
+-0.002962 -0.001337 0.007725 -0.000025 -0.000847 0.005486 
+0.000576 0.000052 0.004551 0.000431 0.002207 0.006621 
+-0.001060 0.006301 0.005604 -0.001224 0.006304 0.003356 
+-0.001123 0.002648 0.001515 -0.002119 0.001705 -0.003947 
+0.001065 0.002316 -0.003885 -0.000403 0.000598 0.000996 
+-0.002824 0.004894 0.001977 -0.006078 0.005487 0.001771 
+-0.000894 0.002532 -0.003554 -0.000513 0.001300 -0.003009 
+-0.000815 -0.002009 -0.001500 0.001082 -0.000812 0.000647 
+0.000005 -0.000556 0.001582 0.000750 0.003227 -0.000522 
+0.001977 -0.000509 -0.002505 -0.003408 0.003421 -0.005086 
+0.003820 0.002053 -0.002221 0.003333 0.000067 0.000316 
+0.001913 -0.000579 -0.000883 0.001463 0.000488 -0.003415 
+-0.000014 0.002280 -0.002323 0.000669 0.000939 -0.001158 
+0.009438 0.005852 -0.003620 0.003779 0.000610 -0.001645 
+-0.000119 -0.000601 -0.002457 0.001547 0.000897 -0.004070 
+0.001954 -0.001297 -0.000862 0.000014 0.000741 0.001076 
+0.000142 0.001728 0.004087 -0.000691 0.000247 0.002893 
+-0.000008 0.007402 0.000035 0.002926 0.001000 0.000110 
+-0.001408 0.002613 -0.001183 -0.000334 0.004711 -0.002539 
+-0.002738 0.005612 -0.002704 -0.002451 0.001870 -0.004041 
+0.007013 0.000217 -0.002633 0.003119 0.005707 -0.002748 
+0.001942 0.005819 -0.000651 0.000251 0.003319 0.002073 
+-0.001874 0.000225 0.002936 -0.003039 -0.003506 0.000347 
+-0.001403 -0.002832 -0.001458 0.000353 0.001003 -0.005712 
+0.007617 0.005721 -0.006347 0.005130 0.011800 -0.013855 
+0.005187 0.009242 -0.011340 0.008298 0.003624 -0.008502 
+0.010018 -0.002080 -0.005913 -0.000411 -0.001923 -0.003607 
+-0.007305 0.007230 0.003549 0.001249 0.001817 0.000363 
+0.000398 -0.000304 0.000998 0.002334 0.002521 -0.002374 
+0.005075 -0.000280 -0.003633 -0.001069 0.000226 -0.000849 
+-0.001613 0.000301 -0.000837 -0.003018 -0.001758 0.000806 
+0.001081 0.000675 -0.000913 0.002243 0.002235 -0.004476 
+-0.001529 0.004242 -0.002662 -0.005757 0.006803 0.000898 
+-0.000398 -0.003209 0.002179 -0.054146 -0.042425 -0.000572 
+-0.000688 -0.035304 -0.012152 -0.001531 0.000872 -0.003534 
+-0.001661 0.000024 -0.002412 -0.001300 0.002861 -0.003070 
+-0.000400 0.005718 -0.003810 -0.002355 0.002662 -0.002874 
+-0.001024 0.001206 0.000570 -0.004313 -0.000413 0.001262 
+0.000632 0.003315 -0.001693 -0.002519 0.006613 -0.007434 
+-0.001075 -0.000656 -0.002506 0.003462 -0.001226 -0.002252 
+0.000738 -0.000122 -0.001823 0.000531 -0.000525 -0.003157 
+0.004677 0.000739 -0.003987 0.004569 0.002586 -0.003966 
+0.000840 0.000370 -0.000100 -0.001834 0.000150 0.000577 
+0.001320 -0.000956 0.002046 0.000186 0.000967 0.000930 
+0.002458 0.001679 0.002728 0.001341 0.005041 0.001341 
+0.001881 0.005052 -0.003225 -0.001992 0.001361 -0.001594 
+-0.004686 0.000548 0.003309 -0.004470 0.001242 0.004002 
+-0.002845 -0.000301 0.000570 -0.003179 -0.001744 -0.003292 
+-0.000226 -0.003785 -0.001977 -0.003558 0.000412 0.001113 
+-0.002137 0.001759 -0.002074 -0.001573 0.002646 -0.002559 
+-0.003494 -0.000791 -0.000850 -0.003855 0.000656 0.003035 
+0.006177 0.003784 -0.001040 0.003601 0.000172 -0.001813 
+0.000546 -0.001942 -0.001393 -0.001102 -0.000835 -0.000895 
+0.000630 0.002863 0.001606 0.000710 0.008629 0.000355 
+0.004935 0.008653 -0.003910 0.005304 0.005855 -0.008418 
+0.001627 0.008933 -0.007307 -0.001403 -0.000942 -0.002161 
+0.000492 -0.000288 -0.001007 0.000596 0.001192 0.000596 
+0.000954 -0.001300 0.000116 0.000093 -0.002549 0.000366 
+-0.000270 0.000273 0.000512 -0.000903 0.002578 -0.001471 
+-0.000090 0.004356 -0.005176 0.001470 0.003391 -0.006272 
+-0.000299 0.001507 0.000046 -0.002522 -0.003131 0.000704 
+0.001385 -0.006852 0.002968 -0.003239 -0.006526 0.006764 
+-0.002515 0.000452 0.000334 0.001773 0.004770 0.000999 
+0.004506 0.007680 -0.004439 0.005172 0.003722 -0.003429 
+0.004074 0.000101 -0.005064 0.001287 -0.000435 -0.001767 
+-0.002135 -0.001282 -0.002717 0.005264 -0.007469 -0.001970 
+0.001268 0.001382 -0.000401 0.002003 0.002409 -0.003226 
+0.002827 0.001919 -0.004570 0.002420 0.000965 -0.004455 
+0.002333 0.000581 -0.002891 0.002202 0.000392 -0.001765 
+0.002519 0.000666 -0.003441 0.001826 0.002019 -0.007852 
+0.001479 0.008153 -0.010354 0.003427 -0.006682 -0.010778 
+-0.004614 0.002597 0.003742 -0.008601 -0.001823 0.014995 
+-0.017659 -0.008508 0.001825 0.004563 -0.006975 -0.006650 
+-0.001011 -0.001086 -0.007239 -0.002376 0.004161 -0.002993 
+-0.001081 0.005287 -0.000354 -0.001691 0.003414 -0.001799 
+-0.000996 0.000610 -0.000837 -0.001765 -0.003928 -0.000567 
+0.000701 -0.000919 -0.003676 -0.000935 0.004307 -0.007336 
+-0.004471 0.001671 -0.003733 0.001618 -0.000407 -0.000036 
+0.003923 -0.000637 -0.000779 0.003582 0.001012 -0.001488 
+0.000894 0.001265 -0.000390 -0.000811 0.000085 0.001461 
+-0.000669 0.000331 0.000330 -0.001779 -0.001566 -0.000481 
+-0.000011 -0.000665 -0.000432 -0.001681 0.000937 -0.000138 
+0.000603 0.002247 0.000573 0.000578 -0.001616 0.000742 
+-0.002389 -0.005232 0.003802 -0.003652 -0.003412 0.004063 
+-0.001031 -0.000650 0.000403 0.000599 0.000499 -0.001579 
+-0.001932 -0.002098 0.000332 -0.003399 -0.006491 0.001862 
+-0.003231 -0.006385 0.000464 -0.000520 -0.003157 -0.003703 
+0.002532 -0.002195 -0.001958 -0.003807 -0.001264 -0.001279 
+-0.006853 -0.002937 0.000085 -0.005946 -0.003076 0.001744 
+0.004455 0.003135 -0.000030 0.002402 0.003712 -0.001681 
+-0.000547 0.003443 0.000805 -0.001926 0.001980 0.002087 
+-0.000129 0.001756 0.000558 -0.000312 0.001205 -0.001635 
+0.000751 0.001488 -0.000691 0.001319 0.001291 -0.001459 
+0.000669 -0.001744 -0.001099 0.002172 0.000402 -0.001274 
+0.002195 0.000098 -0.001187 -0.000738 -0.000559 0.000140 
+-0.002848 -0.003059 0.001845 -0.002800 0.000000 0.002880 
+-0.000137 0.000286 0.000939 -0.001051 0.002128 -0.002472 
+-0.001682 0.001141 -0.003986 0.006902 0.001609 -0.001640 
+0.004095 0.001780 -0.001886 0.000576 0.000054 -0.000054 
+-0.003055 -0.000228 -0.001924 -0.000043 0.000258 0.003295 
+-0.008381 -0.000078 0.002447 -0.002694 0.002014 -0.000140 
+0.003666 0.000748 -0.000185 0.004203 0.003816 -0.008979 
+0.000858 0.003317 -0.005854 -0.001299 0.000819 -0.001053 
+-0.000627 -0.000020 0.000474 0.002204 0.004308 -0.004463 
+-0.002594 -0.000559 -0.010861 0.008421 -0.004150 -0.016558 
+0.001609 0.000144 -0.014655 -0.003287 0.000961 -0.007419 
+-0.000192 0.000122 -0.000926 0.004466 -0.000710 0.004243 
+0.009231 0.001459 0.004540 0.010624 0.014599 -0.012051 
+-0.006312 0.007403 -0.014103 -0.005435 -0.001852 -0.004616 
+-0.002169 -0.003573 0.002056 -0.000023 -0.004208 0.008140 
+-0.003507 0.000661 -0.002730 0.002015 0.004786 -0.006403 
+-0.004219 0.011155 -0.007553 -0.003393 0.005077 -0.001584 
+0.001858 0.001080 -0.000124 0.002186 0.003198 -0.004352 
+0.002517 0.007767 -0.005467 -0.000931 0.006727 -0.001747 
+-0.000459 0.003553 0.000959 0.000373 0.003329 -0.001690 
+0.002159 0.005300 -0.004986 0.003097 0.006028 -0.002240 
+-0.000157 0.000897 -0.000312 -0.002473 -0.002424 0.005326 
+-0.001299 -0.002725 0.005228 -0.000309 0.000170 0.001046 
+0.001827 0.002523 -0.002436 0.002589 0.002589 -0.003750 
+0.002381 0.002171 -0.003638 0.001514 0.001425 -0.004006 
+0.000483 0.001951 -0.001768 0.000917 -0.000853 0.000764 
+0.002098 -0.001423 0.002322 0.002881 -0.000118 0.000999 
+0.003388 0.000932 0.000146 0.002611 0.001310 -0.001818 
+-0.000545 0.000241 -0.002256 -0.004277 0.001504 -0.000593 
+-0.001974 0.002676 0.002638 -0.000737 -0.000500 0.000598 
+-0.004089 -0.001229 -0.001657 -0.003584 0.001580 -0.000311 
+-0.005042 -0.000504 0.004286 -0.007374 -0.002667 0.000922 
+0.001183 0.001527 -0.007151 -0.001531 0.001396 -0.006034 
+0.000683 0.005378 -0.002627 -0.001353 -0.000501 -0.000330 
+-0.001903 -0.000714 -0.001547 -0.001988 -0.002932 -0.001574 
+-0.001610 -0.000360 0.000261 -0.001898 0.002972 0.001148 
+0.000143 0.002920 0.002441 0.002797 0.000555 -0.001210 
+0.003675 -0.001360 -0.000848 0.001584 -0.002532 -0.000247 
+0.001639 -0.002951 0.001967 0.002933 -0.000427 0.001253 
+-0.001261 -0.002850 0.002924 -0.000697 -0.003805 -0.002485 
+-0.002607 -0.002739 -0.006362 0.000401 -0.001815 -0.000848 
+0.000416 0.000599 0.000030 -0.001319 0.001259 0.000779 
+-0.003507 0.001609 -0.001913 -0.001936 -0.000541 -0.002703 
+-0.003339 0.000538 0.002308 -0.001046 0.000642 -0.000313 
+-0.000690 0.000841 -0.000436 -0.001483 0.002948 -0.000638 
+0.000142 0.003713 -0.001785 0.000224 0.002824 -0.002910 
+0.006132 0.004166 -0.012944 0.012316 0.001460 -0.028010 
+0.009253 -0.009643 -0.023410 0.014717 0.013019 -0.013585 
+-0.000364 -0.002128 -0.008513 -0.005891 0.000908 -0.005523 
+-0.008660 -0.004400 -0.007742 -0.003478 -0.008217 -0.004259 
+-0.000947 -0.002459 -0.001299 -0.001241 0.001631 -0.001456 
+-0.003186 0.001502 -0.001947 -0.003682 0.001755 0.001911 
+0.000306 -0.004371 0.002108 -0.010116 -0.015002 0.010908 
+0.018079 0.007390 -0.020038 -0.005422 0.015395 -0.012774 
+-0.000940 0.005447 -0.003638 -0.003443 0.001356 -0.005337 
+-0.000236 0.003525 -0.000635 0.006722 0.004352 -0.006265 
+0.006425 0.004220 -0.003650 -0.001815 0.003195 0.002917 
+-0.000459 -0.000872 0.006804 -0.001426 -0.001233 0.004918 
+-0.000757 -0.000233 0.001164 0.000709 0.000372 -0.002235 
+0.000857 0.000400 -0.001944 -0.001505 -0.000068 0.001434 
+-0.001424 -0.001349 0.005996 -0.004959 -0.003351 0.004936 
+-0.001588 0.000336 0.001246 0.002488 0.003253 -0.001029 
+0.001788 0.003575 -0.004336 -0.000589 0.000412 -0.000627 
+-0.001972 -0.000136 0.004693 -0.002789 0.000195 0.002455 
+-0.001193 0.001905 -0.002858 0.002853 0.003446 -0.001561 
+-0.000177 0.003641 -0.001251 -0.001618 0.000862 0.000451 
+-0.001304 0.000850 0.000289 -0.000476 0.004366 0.000639 
+-0.000830 0.005000 -0.000052 -0.001710 0.000397 0.000684 
+-0.003632 -0.002308 0.001666 -0.002912 -0.000634 0.000029 
+-0.003644 -0.000790 0.001019 -0.004183 -0.002216 0.002944 
+0.000854 0.000455 0.003129 -0.000376 0.000107 -0.000033 
+0.002382 0.002496 0.000068 -0.001008 0.005588 -0.003571 
+-0.001930 0.000689 0.000207 -0.000318 -0.000321 0.002253 
+0.002214 0.000681 -0.001176 0.005128 0.001061 -0.002917 
+0.004539 0.004396 -0.000086 0.000712 0.002110 0.000349 
+0.000125 -0.000188 0.001382 0.001108 -0.000413 -0.000277 
+0.002231 -0.000401 0.002031 0.002615 -0.000564 0.002503 
+0.001499 -0.002855 -0.000737 0.000462 -0.003902 -0.002163 
+-0.001007 -0.003554 -0.002251 -0.000856 -0.000991 -0.000034 
+-0.002620 0.004884 0.000820 -0.000093 0.006663 -0.000265 
+-0.001211 0.004481 -0.002339 -0.002242 0.000635 -0.002521 
+-0.003791 -0.001387 -0.001626 -0.002435 -0.001375 -0.001593 
+-0.003672 0.001572 0.000664 -0.000611 -0.000462 0.002364 
+-0.000149 -0.000264 0.001191 -0.000096 0.001971 -0.006848 
+-0.005490 0.003960 -0.009800 0.006028 0.010895 -0.004425 
+0.012740 -0.001154 0.012132 0.017762 0.000962 0.016486 
+0.010569 0.001871 0.016973 -0.006390 -0.001043 0.010077 
+-0.025818 -0.012123 0.004625 -0.016591 -0.010241 0.013771 
+-0.007223 0.001070 -0.000299 0.002771 0.005701 -0.009368 
+0.006859 0.004906 -0.004997 0.004288 0.001099 0.002540 
+0.000954 0.002332 0.001028 0.005358 0.002743 -0.006458 
+0.007180 0.004027 -0.008300 0.001924 -0.000981 -0.004471 
+-0.005536 0.000272 -0.002386 -0.007992 -0.006403 -0.001029 
+-0.006798 -0.005112 0.001920 -0.000613 0.000892 -0.000613 
+-0.000083 -0.000167 -0.001771 -0.005314 0.004599 0.002452 
+-0.001489 0.003655 0.004807 -0.000961 0.000727 0.002945 
+-0.002490 0.000418 -0.000832 -0.000155 0.001392 -0.005122 
+0.000878 0.003134 -0.007114 0.001082 0.005545 -0.003900 
+-0.002035 0.001656 -0.001951 -0.003432 -0.001310 0.001490 
+-0.001583 -0.001193 0.003900 -0.000270 -0.001054 0.003162 
+0.000090 0.000870 0.000633 -0.001171 -0.000251 -0.002789 
+0.000390 -0.002681 -0.003231 0.001350 -0.000157 -0.005118 
+0.001250 0.000622 -0.003165 -0.000344 0.000330 -0.000299 
+-0.000102 0.000167 0.001130 0.000145 -0.000845 0.000431 
+-0.000605 -0.002109 -0.000170 -0.001037 -0.003009 0.000166 
+0.000493 -0.002132 -0.000083 0.003298 0.000236 -0.002874 
+0.003003 0.002702 -0.006106 0.001562 0.001145 -0.005442 
+-0.000322 0.001040 -0.001997 -0.003097 -0.001812 -0.000458 
+-0.000349 -0.002007 -0.004428 0.000886 0.002922 -0.004163 
+0.000603 0.004597 -0.004824 0.002638 0.000603 -0.001595 
+-0.000526 0.000537 0.000533 -0.003627 0.000855 0.000837 
+-0.001361 -0.000295 -0.000210 0.001391 0.001178 0.000721 
+0.001720 0.001505 -0.000215 0.001676 0.000800 0.001135 
+-0.000710 -0.001024 0.001497 -0.000279 0.000753 0.000223 
+-0.001268 -0.001167 -0.001790 -0.001102 -0.001441 -0.004919 
+-0.001251 -0.002437 -0.004171 -0.000542 -0.002522 -0.002135 
+0.001560 0.002408 0.000426 0.003107 0.004599 -0.004072 
+-0.002951 0.002730 -0.001839 -0.003863 0.001230 0.003186 
+0.000085 0.000771 0.001832 0.002921 0.003085 0.001001 
+0.001642 0.006839 -0.008286 -0.001718 0.005992 -0.005713 
+-0.002383 0.002681 0.005354 -0.000848 -0.002717 0.011901 
+0.003645 0.000623 -0.007105 -0.012257 -0.002900 -0.040232 
+0.015288 0.030313 -0.022933 0.004201 0.008850 0.029181 
+0.010743 0.008925 0.046286 1.072727 0.442424 5.830303 
+1.114286 0.411429 5.891428 0.983740 0.308943 5.016260 
+-0.000713 0.000223 0.026966 -0.007897 -0.014220 0.016557 
+-0.022270 -0.003349 -0.004707 -0.017404 -0.000502 0.005279 
+-0.014068 -0.001548 0.006293 -0.003023 0.008821 -0.007960 
+-0.002438 -0.004220 -0.009038 -0.003251 -0.004104 -0.005694 
+-0.001698 -0.001536 0.000989 -0.004536 0.003289 0.003800 
+-0.002692 0.001727 0.001766 -0.001910 -0.002739 -0.001387 
+-0.001306 -0.003444 0.001122 -0.001493 0.000842 -0.000430 
+-0.002741 0.001839 -0.005508 -0.004058 0.003700 -0.008829 
+-0.001336 0.003708 -0.008443 0.001979 0.002600 -0.003800 
+0.002692 0.000978 -0.000049 0.000015 0.001993 -0.000818 
+0.001205 0.000548 -0.006000 -0.003459 -0.000713 -0.001413 
+-0.004603 0.002285 0.003115 -0.003255 0.004097 0.004950 
+-0.003211 0.003871 0.005279 -0.002849 0.003141 0.003822 
+-0.001268 0.001740 0.001386 -0.002606 0.000290 -0.003102 
+-0.003484 -0.001560 -0.000811 -0.004298 -0.002347 -0.001174 
+-0.003525 0.000494 0.000865 -0.002389 0.000319 0.001912 
+0.002667 0.000748 -0.000449 0.001835 0.005672 -0.002617 
+-0.002059 0.004949 -0.001943 -0.005341 0.001207 0.002034 
+-0.001634 -0.003185 0.000978 -0.002755 -0.001543 -0.000303 
+-0.001572 -0.001531 0.001612 -0.002756 -0.002756 0.001181 
+-0.004436 -0.001450 0.000638 -0.003847 -0.000784 -0.000249 
+-0.001696 -0.002132 -0.005108 -0.000685 -0.001726 -0.003706 
+0.001680 -0.002385 -0.000352 0.004080 -0.001346 -0.000979 
+0.002556 0.000123 -0.001487 0.000105 -0.000179 -0.000147 
+-0.000558 0.000088 0.000186 0.003002 0.001673 0.001998 
+0.002500 0.005373 -0.001754 0.002552 0.006501 -0.003018 
+0.001322 0.002465 -0.002541 0.001181 -0.001572 -0.000847 
+0.000845 -0.002097 0.000255 -0.001865 -0.001475 -0.000846 
+0.000027 -0.001321 0.000822 -0.000542 -0.003487 0.001475 
+0.000204 -0.001803 0.001516 0.003954 -0.000454 -0.001283 
+0.002575 -0.000342 -0.000822 0.002267 -0.002344 0.002356 
+-0.000261 -0.000560 0.000253 0.001320 -0.000056 -0.001007 
+-0.000012 0.002514 -0.004884 -0.002563 0.004341 -0.007412 
+-0.003080 0.003573 -0.004375 -0.004081 0.000816 0.006829 
+0.004889 0.001257 0.003142 -0.018282 0.017775 -0.006221 
+-0.006754 0.060462 -0.106532 0.003368 0.004932 0.021789 
+0.920000 0.030000 6.690000 1.085400 -0.016529 7.845730 
+1.134146 0.053659 7.790244 1.111111 0.242424 7.037037 
+0.010630 0.004241 0.043831 0.004211 0.003663 0.006044 
+-0.014352 0.005548 0.002458 0.000203 -0.003753 0.003157 
+0.008308 0.001400 -0.002267 0.007142 0.007028 -0.009690 
+0.004424 0.003025 -0.001442 0.001070 0.001020 0.000201 
+0.004124 0.005345 0.003302 0.006173 0.009877 0.000062 
+-0.000565 0.006324 -0.001683 0.002908 -0.000679 0.001282 
+0.001456 -0.001991 0.002179 -0.003530 -0.002969 -0.000551 
+0.000935 -0.002646 -0.000190 0.001266 -0.001295 -0.003915 
+0.003692 0.002885 -0.005106 0.006833 0.004221 -0.002201 
+0.003734 0.002489 0.001245 0.001181 -0.001484 0.001575 
+-0.001785 -0.003949 0.000711 -0.001789 -0.002368 0.000197 
+-0.002484 0.000403 -0.000355 -0.004484 0.000806 0.004258 
+-0.004912 0.000152 0.002963 -0.003025 0.000295 -0.000842 
+-0.001409 0.000308 -0.003157 0.000251 0.001483 -0.004951 
+0.001312 0.004143 -0.002265 -0.000379 0.000532 -0.001035 
+0.000926 -0.001391 0.000585 -0.000463 -0.001739 0.001564 
+-0.002379 -0.001344 0.000112 -0.002565 -0.002117 -0.001162 
+-0.001732 -0.005099 -0.000241 -0.006914 -0.004451 0.007577 
+0.001121 -0.003250 0.004736 0.000740 0.000032 0.001346 
+0.001197 0.003333 -0.001111 0.000082 0.004369 -0.003797 
+0.000332 0.005607 -0.002416 0.002806 0.006691 -0.001847 
+0.005565 0.005657 -0.000917 0.004124 0.008693 -0.006656 
+0.001470 0.003112 -0.005580 0.002252 0.000347 0.002082 
+0.004051 0.004509 0.000904 0.004403 0.004278 -0.000359 
+0.000963 0.001228 0.000195 -0.000483 -0.000370 -0.004008 
+-0.000270 -0.003915 0.001772 -0.001078 -0.003335 0.003592 
+-0.002415 -0.002415 0.004226 -0.004871 -0.004922 0.002923 
+-0.005159 -0.002289 -0.000500 0.000074 0.000110 0.000277 
+0.000038 0.002788 -0.002439 0.001971 0.003688 -0.005144 
+0.002114 0.001086 0.001260 -0.005416 -0.003120 0.003974 
+-0.006811 -0.002511 0.002222 -0.001940 0.000661 0.004786 
+-0.000362 0.004491 -0.003159 0.001772 0.003461 -0.005312 
+0.003958 -0.001974 -0.004737 0.005607 -0.007546 -0.008503 
+-0.000168 -0.003545 -0.014035 -0.006654 0.001948 -0.007330 
+-0.022121 0.008256 -0.001376 -0.000888 0.009195 0.000386 
+0.004528 -0.001741 -0.041909 0.002672 0.004969 0.020235 
+1.135803 0.168724 7.020576 1.095355 0.078240 7.525672 
+0.983051 0.177966 7.044491 0.750000 0.445312 6.125000 
+0.232558 0.883721 4.962790 0.001309 0.013662 0.002712 
+-0.000163 -0.009000 -0.001382 0.017884 -0.008436 -0.008240 
+0.018139 -0.003735 -0.002659 0.014531 0.001646 0.001727 
+0.015297 0.002145 0.004676 0.018293 0.000984 0.004932 
+0.017062 0.001357 -0.005477 0.003693 0.005556 -0.007123 
+0.000223 0.007070 -0.002710 0.001780 -0.000847 -0.000085 
+0.001700 -0.002199 0.004373 -0.001735 -0.007279 0.003256 
+-0.001430 -0.009062 -0.001839 -0.003949 -0.004916 -0.000265 
+0.001064 0.002008 -0.000133 0.005827 0.005895 -0.002717 
+0.008209 0.004393 -0.002839 0.002680 0.002974 -0.005773 
+0.000507 0.005655 -0.001974 -0.003277 0.007160 -0.002387 
+-0.001738 0.006481 -0.003517 0.000449 0.004991 -0.000915 
+-0.001062 -0.000014 -0.001620 -0.000376 -0.003157 -0.005202 
+-0.000569 -0.003393 -0.007014 0.001061 0.001505 -0.005712 
+0.001071 0.001306 0.000485 0.002152 -0.000519 0.001308 
+0.001290 -0.001844 -0.001236 0.003006 0.003860 -0.006244 
+0.003118 0.006003 -0.000897 0.003050 0.002004 0.000725 
+0.000260 -0.003188 0.001547 -0.004762 -0.003847 0.003941 
+-0.003120 -0.004160 0.001040 0.002027 -0.000253 -0.002532 
+0.004793 -0.002644 -0.001999 0.002124 -0.001106 -0.000511 
+-0.001384 0.003827 -0.003298 -0.001464 0.000912 0.000249 
+0.000616 0.004709 -0.007051 0.002183 0.000657 -0.003573 
+0.001470 -0.001861 -0.002586 0.002232 0.000769 -0.001553 
+0.003505 0.005398 -0.000696 0.003816 0.007384 -0.000052 
+-0.000010 0.003492 0.000566 -0.007450 -0.002970 -0.001832 
+-0.000181 -0.004832 0.003229 -0.003282 -0.001943 0.001042 
+0.002349 -0.000248 0.000182 0.001908 0.001727 -0.003954 
+0.000920 0.000446 -0.003736 -0.002600 0.002901 -0.003639 
+-0.001741 0.003602 -0.005078 -0.001534 0.001408 -0.005045 
+-0.002187 0.000065 0.000281 -0.003219 -0.007333 0.006611 
+-0.003026 -0.006170 0.001398 -0.001060 0.002537 -0.002411 
+-0.001750 0.004949 -0.006665 -0.001969 0.007041 -0.003442 
+0.003032 0.006845 0.000042 0.003331 0.000621 -0.001140 
+-0.005536 -0.001112 -0.001818 -0.011792 -0.001382 0.002558 
+-0.016861 0.000805 -0.007563 -0.020100 0.004693 -0.026998 
+-0.002973 0.000005 -0.030284 0.004555 0.001866 0.025544 
+1.109453 0.089552 5.970149 1.000000 0.183391 6.107266 
+0.787671 0.311644 5.116438 0.438914 0.438914 3.429864 
+-0.002474 0.004965 0.016287 -0.000001 0.011616 0.005079 
+0.006225 -0.006169 -0.000579 0.022891 0.001085 -0.014511 
+0.024562 0.004800 -0.013399 0.028293 0.005808 -0.009894 
+3.297619 0.750000 -1.369048 3.845679 1.098765 -1.697531 
+0.040072 0.022787 -0.018057 0.027761 0.006026 -0.012356 
+0.007980 0.006930 -0.013482 0.010817 0.005244 -0.012694 
+0.006937 0.008864 -0.003517 0.000434 0.002820 -0.003005 
+-0.002069 0.002964 -0.000494 -0.000263 0.003030 -0.006804 
+-0.000864 0.003026 -0.003636 -0.001046 0.001605 0.001792 
+-0.000203 0.001416 0.001572 0.001816 -0.000268 0.000328 
+0.000768 -0.003312 -0.002060 -0.001342 -0.001558 -0.001800 
+-0.001143 0.001385 0.000467 -0.000253 0.004161 0.000483 
+-0.000334 0.005641 -0.003322 0.000410 0.003150 -0.007400 
+-0.001711 0.002332 -0.005858 0.003118 0.001500 -0.000624 
+0.000654 0.005385 -0.005053 -0.000546 0.006880 -0.000940 
+0.000924 0.003537 0.002544 0.003592 0.001266 0.002373 
+0.002904 -0.000690 0.002230 0.000818 -0.000491 0.000082 
+-0.002653 0.000666 -0.001228 -0.002227 0.002765 0.000229 
+-0.003840 -0.000936 0.002014 -0.001149 -0.001604 0.001717 
+-0.000084 0.000267 0.000391 -0.001978 -0.001163 0.000045 
+-0.003402 -0.003464 0.001238 -0.000509 -0.001166 -0.003416 
+0.003746 0.004903 0.002787 0.002924 0.000575 0.000735 
+0.001542 -0.000159 -0.002035 -0.000662 0.002431 -0.004253 
+-0.001917 0.004292 -0.001621 -0.002033 0.000122 0.001218 
+-0.004391 -0.005441 0.004714 -0.006266 -0.007992 -0.001135 
+-0.000626 -0.003496 0.001878 -0.001421 0.001171 0.000172 
+-0.000100 0.000057 0.002437 -0.001659 -0.004238 0.002671 
+0.000711 -0.003556 -0.000079 -0.001837 -0.002494 -0.002120 
+-0.000195 -0.002971 -0.002673 0.001188 -0.002016 -0.002446 
+-0.006411 -0.002344 -0.003780 -0.004470 0.002050 -0.006442 
+-0.006319 0.002923 -0.007530 -0.005962 0.007775 -0.009426 
+-0.003699 0.010991 -0.004659 0.004819 0.008472 -0.001006 
+-0.002252 0.001532 -0.000804 -0.008730 0.000242 -0.004430 
+-0.012635 -0.001475 -0.004039 -0.013425 -0.000388 0.004579 
+-0.009942 0.001987 0.009654 -0.003524 -0.001173 -0.002386 
+-0.000090 -0.005670 -0.025049 -0.003674 -0.004566 -0.023811 
+-0.000443 0.002024 0.013200 0.001547 0.007986 0.028033 
+0.002694 0.008948 0.024247 0.001057 0.005610 0.011013 
+-0.004145 -0.002793 -0.010034 -0.008210 -0.006550 -0.025273 
+-0.011933 -0.003866 -0.003350 -0.012090 0.011163 0.011997 
+0.000493 0.004591 -0.005406 0.015642 0.008875 -0.013650 
+0.022057 0.009615 -0.018239 3.317708 0.989583 -2.109375 
+3.782408 1.361111 -2.222222 4.011428 1.800000 -2.160000 
+0.021993 0.029433 -0.006543 0.013468 0.008508 -0.013058 
+0.011748 0.002677 -0.006425 0.004363 0.003940 -0.004799 
+-0.000578 -0.003678 -0.004175 -0.003497 -0.002770 -0.006357 
+-0.000316 0.000170 -0.006945 0.001197 0.001604 -0.006822 
+0.003394 0.004012 -0.006479 0.001640 0.004747 -0.008259 
+-0.001642 0.001515 -0.004640 0.002108 -0.000473 -0.000489 
+-0.000948 -0.000368 0.000208 0.001073 0.000276 -0.000211 
+0.004351 0.002699 -0.006375 0.005623 0.003016 -0.008340 
+0.000853 0.002702 -0.005247 -0.003716 -0.001551 -0.001889 
+-0.000913 -0.000283 -0.001982 -0.000929 0.000880 -0.001755 
+-0.001519 0.004910 -0.002841 0.001647 0.002894 -0.004363 
+-0.002206 -0.001140 -0.005883 -0.002661 -0.002502 -0.004686 
+0.003615 -0.002304 -0.006816 0.002148 0.004803 -0.008304 
+-0.001895 0.002143 -0.002527 0.000575 0.000311 -0.002161 
+0.001647 -0.000021 -0.001661 0.002319 0.000941 0.000678 
+-0.002476 0.002198 -0.004472 0.003862 0.001672 -0.004964 
+-0.008891 -0.004701 0.005314 -0.006079 -0.004093 0.006062 
+-0.001313 0.001679 -0.003939 -0.000165 0.005395 -0.004722 
+-0.000414 0.003494 -0.004351 -0.001340 0.001070 0.001436 
+-0.001042 -0.002434 -0.001004 -0.003924 -0.003240 0.001354 
+-0.001572 -0.000197 0.000590 0.001484 0.000054 0.000751 
+-0.003136 -0.003768 0.005652 -0.000633 0.002056 0.005702 
+0.000189 0.001375 -0.002824 -0.000803 0.002331 -0.008060 
+-0.000424 0.002279 -0.006034 0.001182 0.005123 -0.000336 
+-0.002786 0.008243 -0.000290 -0.006342 0.010642 -0.017668 
+-0.006856 0.018889 -0.010210 -0.020731 0.011777 -0.013533 
+-0.010278 0.004349 -0.008340 0.004261 -0.004491 0.005452 
+0.000574 -0.003598 0.008560 -0.000214 0.000741 -0.000484 
+-0.001481 0.003721 -0.004015 -0.002864 0.000156 -0.005443 
+-0.002652 -0.001947 -0.003742 -0.003274 -0.002327 -0.004107 
+0.000058 -0.001147 -0.005838 0.006512 0.001270 -0.007845 
+0.008737 0.005076 -0.012697 0.008155 0.003927 -0.025184 
+0.004924 0.004551 -0.031640 0.001936 0.006993 -0.023149 
+-0.002326 0.000439 -0.000580 -0.001316 0.002548 0.004721 
+0.000919 -0.000234 0.000871 0.002856 -0.001366 -0.002363 
+-0.000918 -0.001366 -0.001776 -0.004503 -0.001796 0.001310 
+-0.003371 0.006952 -0.002665 0.008470 0.010298 -0.006598 
+0.019362 0.014294 -0.003604 0.026214 0.015627 -0.000252 
+0.025643 0.012062 0.000303 0.018150 0.010483 -0.000150 
+0.010888 0.007485 -0.010385 0.002468 0.008034 -0.006628 
+-0.001007 0.000609 0.002531 -0.000625 0.000303 -0.002207 
+-0.000401 -0.004752 -0.002276 0.005992 0.002237 -0.006776 
+0.003079 0.002072 -0.006839 -0.000267 0.000133 -0.002167 
+-0.000228 -0.000411 -0.000403 0.000267 0.000320 -0.001085 
+0.001484 0.000088 -0.000813 0.003236 0.002268 -0.002717 
+0.002501 0.003821 -0.005627 0.004755 0.003117 -0.003540 
+-0.003505 0.000384 -0.000920 0.000690 -0.001318 0.000340 
+-0.004040 -0.005182 0.005741 0.000865 -0.003445 0.002599 
+-0.001344 -0.001447 -0.000082 -0.005474 -0.001201 -0.001408 
+-0.004320 0.000411 -0.004106 -0.002842 0.001292 -0.003042 
+-0.001140 0.002154 -0.000869 -0.000333 0.000039 0.000944 
+-0.001130 -0.003025 0.002705 -0.001648 -0.004781 0.000746 
+-0.000628 -0.003530 -0.001454 0.002560 -0.001840 -0.000560 
+0.002275 -0.000713 -0.001384 0.003343 0.003577 -0.004802 
+-0.000085 0.000000 -0.003248 -0.000426 0.000825 -0.000216 
+0.000891 0.000592 0.000420 0.001357 0.002873 0.000894 
+0.001645 0.005093 -0.000372 0.003559 0.003875 0.000646 
+0.001504 -0.000379 0.000023 -0.002101 -0.002966 0.001873 
+-0.005601 -0.001173 0.002488 -0.002681 0.003103 0.001838 
+-0.004419 0.000564 -0.001082 0.000379 0.000852 -0.002683 
+-0.001803 0.002610 -0.003887 0.001858 -0.001224 -0.003878 
+0.002152 -0.001344 -0.000482 0.001536 0.003368 -0.003947 
+-0.006549 0.008568 -0.009881 0.000339 0.018546 -0.014777 
+0.007697 0.009467 -0.007180 -0.012680 0.003125 0.000727 
+-0.008948 0.002904 -0.006905 -0.002407 -0.003948 0.003384 
+0.001058 -0.003679 0.008204 -0.001806 -0.001632 0.002578 
+0.002604 0.001094 0.000973 0.003472 0.001484 -0.000950 
+0.002526 0.009321 -0.000871 0.001171 0.008623 0.003966 
+0.004748 0.007759 0.003503 0.006546 0.001383 -0.000757 
+0.003729 0.000230 -0.007357 -0.000080 -0.000335 -0.007773 
+-0.002345 -0.001937 -0.006602 -0.003330 -0.002261 -0.004971 
+-0.003714 -0.000664 -0.003031 -0.002702 0.000589 -0.001196 
+-0.000515 0.000638 0.001464 0.001383 -0.001491 0.003895 
+0.002427 0.000509 0.002016 0.000260 0.000828 0.001810 
+-0.000271 -0.000270 -0.000936 -0.004797 -0.001970 -0.003062 
+-0.002779 -0.003469 -0.001399 0.003281 0.002312 0.000011 
+0.015364 0.009028 -0.003391 0.019635 0.013107 -0.007144 
+0.014648 0.012197 -0.008573 0.005857 0.008698 -0.007452 
+0.000455 0.005904 -0.003602 -0.000852 0.002479 -0.002685 
+0.003309 0.004304 -0.003044 0.003099 0.005117 -0.004036 
+0.000276 0.003672 -0.003460 -0.000867 0.000133 0.000227 
+-0.001203 -0.000976 -0.000455 -0.000194 0.000730 0.000570 
+-0.001125 0.001290 -0.001345 0.001775 0.001559 0.000388 
+0.001158 0.000701 0.000267 0.001219 -0.002035 -0.000907 
+-0.000892 -0.000162 -0.003080 -0.001380 -0.000423 -0.004942 
+-0.001726 0.002329 -0.005527 -0.001884 -0.000248 -0.001230 
+0.002196 0.000620 -0.004113 0.001631 -0.000487 -0.003554 
+0.001728 -0.001759 -0.002313 0.000903 -0.001026 -0.000013 
+-0.000018 -0.000624 -0.000049 0.000230 -0.001682 0.001532 
+0.001031 -0.000192 0.001289 0.000018 0.001267 0.000833 
+-0.003360 0.002703 -0.000656 -0.006562 -0.000625 0.002031 
+-0.002279 0.000321 0.002854 0.001890 0.004273 -0.000822 
+0.000522 0.001319 0.000098 0.000812 0.002287 -0.003547 
+0.002501 0.003019 -0.003795 0.003382 0.002059 -0.000735 
+0.001885 0.001455 0.002931 0.000863 0.000421 0.002277 
+0.002880 -0.000918 -0.002370 0.004158 0.001198 -0.002869 
+0.001832 0.002430 -0.000990 0.001840 0.001120 0.000800 
+0.000492 0.002743 0.000549 -0.001439 0.001681 0.000104 
+-0.000204 0.005083 -0.007998 -0.002285 0.002385 -0.003238 
+-0.001783 0.000952 -0.000164 -0.003398 0.003069 -0.006218 
+-0.013387 0.011599 -0.010491 -0.013189 0.013629 -0.015975 
+-0.006368 0.015053 -0.009149 0.003167 0.010610 -0.001314 
+0.008728 0.004525 0.001194 0.005575 -0.000137 0.000637 
+0.001874 -0.001229 -0.000722 0.000800 -0.001749 -0.000567 
+0.001423 -0.000370 0.000309 0.002713 0.003721 -0.001635 
+0.004290 0.003903 -0.003641 0.003397 0.002143 -0.001698 
+0.002730 0.001555 0.000035 0.002220 -0.001399 -0.000248 
+0.004858 -0.003179 -0.006859 0.005949 -0.000752 -0.009210 
+0.001566 -0.001886 -0.003677 -0.005333 -0.000334 0.000024 
+-0.008196 0.001302 -0.000230 -0.002439 0.002033 0.004960 
+-0.005182 -0.004948 0.005417 -0.004613 -0.000501 0.002441 
+-0.001083 -0.000476 -0.001368 0.001784 -0.000333 -0.005676 
+0.001231 0.002015 -0.007724 -0.000152 -0.002520 -0.003917 
+-0.002004 -0.007350 0.000004 -0.012968 0.001410 0.000671 
+-0.006042 -0.004667 0.005708 0.007625 0.000952 -0.000785 
+0.013847 0.006240 -0.005221 0.009725 0.007037 -0.007823 
+0.001934 0.006289 -0.006794 -0.004883 0.000394 -0.003002 
+-0.002372 0.002105 0.004428 -0.002184 0.002218 0.002280 
+-0.000573 0.000510 0.000498 0.000680 -0.000583 -0.000534 
+0.000658 -0.001183 -0.001787 0.001269 -0.000083 -0.002753 
+0.001711 -0.000189 -0.000475 -0.002748 0.002193 -0.002435 
+0.002481 0.003893 -0.004847 -0.002200 0.003927 -0.001476 
+-0.005540 0.000614 0.002439 -0.004498 0.002337 0.001076 
+-0.005728 -0.002864 0.002400 -0.000677 -0.000657 -0.001075 
+0.000664 -0.000195 0.000234 -0.000462 0.001154 0.000231 
+-0.002409 0.002587 0.001383 -0.002476 0.002063 0.000275 
+-0.002345 -0.001036 -0.000125 -0.001191 -0.000197 0.001603 
+-0.001006 0.000599 -0.001584 -0.002507 0.000906 -0.000952 
+0.000297 0.002588 -0.001629 0.000535 0.002821 -0.000369 
+0.000670 0.002579 -0.001416 0.001154 0.002329 -0.001147 
+-0.001457 -0.000971 -0.001214 -0.003552 -0.003232 0.003328 
+0.000316 0.000247 0.001399 0.002213 0.001917 0.000582 
+-0.000011 0.001759 0.000861 -0.002258 -0.003261 0.001395 
+-0.006583 -0.002769 0.000353 0.000158 -0.001857 -0.000975 
+-0.000337 -0.001774 -0.000191 0.002888 -0.002942 0.002321 
+-0.000442 -0.000646 -0.001054 -0.001542 -0.001179 -0.001088 
+0.000179 0.001050 -0.000550 0.000958 0.000514 0.003007 
+0.000693 -0.002009 0.002766 -0.002937 0.005648 -0.005667 
+-0.008596 0.018756 -0.014347 -0.011967 0.020429 -0.013678 
+-0.005603 0.014380 -0.014451 -0.002586 0.011220 -0.006527 
+-0.001478 0.002954 -0.003993 0.000484 0.001825 -0.002094 
+-0.001780 0.002666 -0.000444 -0.001000 0.001280 -0.001024 
+0.003575 0.000431 -0.002211 0.005029 0.002113 -0.002195 
+0.002124 0.003597 -0.002083 0.000571 0.003028 -0.001772 
+-0.001011 0.003429 0.001099 0.000436 0.003231 0.001659 
+0.004451 0.004301 -0.001074 0.007692 0.005395 -0.004616 
+0.006667 0.004573 -0.008953 0.004284 -0.003026 -0.002775 
+0.005069 0.000514 -0.002278 0.001405 -0.001061 -0.001842 
+-0.003735 0.000267 -0.002480 -0.005360 0.000369 0.000794 
+-0.004215 -0.001777 0.002851 -0.001833 -0.001551 0.003523 
+-0.000637 -0.000687 0.001424 -0.000166 -0.002269 -0.001236 
+-0.001659 -0.000514 -0.000236 -0.003008 -0.003008 0.003185 
+-0.007267 -0.004157 0.002785 -0.004280 -0.008084 -0.001663 
+-0.002161 -0.008554 0.002591 -0.003765 -0.011134 0.004937 
+-0.006426 -0.012434 -0.000243 0.002673 -0.004599 0.005291 
+-0.000552 -0.001838 0.004688 -0.000409 0.000034 0.001743 
+0.000271 0.000895 0.000566 -0.000646 0.000582 0.000624 
+-0.001218 -0.001328 0.000598 -0.000408 -0.002040 0.005000 
+-0.002516 -0.001236 0.008742 -0.003073 0.000585 0.008782 
+0.000591 -0.003016 0.001478 -0.001388 -0.000813 -0.001735 
+-0.000069 -0.000315 -0.000251 0.001247 -0.000055 -0.001253 
+0.001403 -0.000346 -0.000656 0.001171 0.000496 -0.001559 
+0.001102 0.000000 -0.002205 0.000614 -0.000873 -0.001018 
+0.000983 -0.003695 0.001893 -0.000896 -0.003732 0.003553 
+0.000475 -0.001900 0.000519 -0.000612 0.001263 -0.002931 
+0.001822 -0.000302 -0.001515 -0.000335 0.004049 -0.002531 
+-0.000427 0.002065 -0.001976 0.000230 0.001374 -0.002904 
+0.002448 0.001949 -0.004688 0.001818 -0.001785 -0.003570 
+-0.002846 -0.001495 0.001456 -0.001491 0.000963 0.001009 
+-0.000611 -0.001703 0.002358 -0.003806 -0.002742 0.004775 
+-0.003480 -0.000670 0.002451 0.000271 -0.001309 -0.001425 
+0.000194 0.000194 -0.002636 -0.002692 0.000334 -0.000143 
+-0.003087 0.000447 0.001610 -0.000831 0.000698 -0.000863 
+-0.000658 0.000484 -0.003116 -0.000780 0.002316 -0.003048 
+-0.001644 -0.000286 -0.002619 0.001289 -0.004892 -0.000501 
+0.004527 -0.006755 0.000266 -0.002871 0.008567 -0.005186 
+-0.009656 0.018643 -0.013548 -0.009961 0.019824 -0.013873 
+-0.004487 0.013931 -0.013246 -0.000834 0.003552 -0.008727 
+0.001887 -0.002791 -0.003421 0.001999 -0.003214 -0.001130 
+0.001167 0.000151 -0.001393 -0.000513 -0.002928 -0.001219 
+0.000386 -0.002106 -0.001440 0.005135 -0.000561 -0.000518 
+0.000208 -0.001667 -0.004066 0.000559 0.005035 -0.008951 
+0.001524 0.004004 -0.004858 -0.003448 0.000941 -0.004860 
+-0.002024 0.004258 -0.004885 -0.002472 -0.000304 -0.003009 
+0.002532 -0.002929 0.000205 0.002481 -0.004300 -0.000096 
+0.000159 -0.000891 -0.001258 -0.000025 0.002116 -0.002809 
+0.001026 0.003155 -0.004072 0.000435 0.003373 -0.002679 
+-0.001031 0.004946 -0.004122 -0.001971 0.008741 -0.006514 
+0.001494 0.010829 -0.006049 0.005164 0.005505 -0.003167 
+0.002953 0.000787 -0.000276 0.000327 0.003497 -0.002076 
+0.001877 0.006765 -0.002469 0.002767 0.004051 -0.002136 
+-0.000605 -0.000660 -0.000423 -0.004730 -0.004133 -0.001369 
+-0.004140 -0.000962 -0.001669 -0.001226 0.001528 -0.001634 
+0.001294 0.004841 -0.003304 0.001211 0.003370 -0.001687 
+0.000629 0.000892 -0.001008 -0.000059 0.000808 -0.003010 
+-0.000879 0.001902 -0.003074 0.000391 -0.000422 -0.000362 
+-0.003347 -0.000752 0.000738 -0.006009 -0.000370 0.000816 
+-0.002081 -0.000121 -0.002041 -0.002031 0.002031 -0.002031 
+-0.001263 -0.000618 -0.001882 -0.002262 -0.002753 0.000585 
+-0.002289 -0.003199 0.002706 0.000000 -0.001103 0.001765 
+0.005958 0.001798 0.000112 0.004766 0.001098 0.001492 
+0.000749 0.000830 0.000134 -0.002368 -0.000236 0.000642 
+-0.000856 0.001417 0.002473 0.000591 0.001469 0.002777 
+0.000008 0.001235 0.001549 0.001821 -0.000438 -0.001106 
+0.004076 -0.000582 -0.003784 -0.002661 0.003065 0.000403 
+-0.002571 0.002949 0.000567 -0.000806 0.004331 -0.000605 
+0.004333 0.001967 0.002361 -0.002549 0.000056 0.005154 
+0.004243 -0.003826 0.003965 0.002827 0.002917 0.001615 
+0.001589 0.006854 -0.001504 0.000902 -0.001152 -0.004609 
+0.000902 -0.000574 -0.001148 0.003197 -0.001885 0.002213 
+0.005285 -0.001936 0.000215 0.004359 -0.001677 -0.000149 
+0.001562 -0.001020 -0.000031 0.003887 0.003555 -0.000125 
+-0.002635 0.004361 -0.005499 -0.001266 0.001308 -0.001770 
+0.002836 -0.003680 0.002195 -0.000780 0.000503 -0.001021 
+-0.006232 0.011014 -0.007623 -0.004810 0.016679 -0.011999 
+-0.000633 0.012454 -0.014335 -0.000193 0.001587 -0.010769 
+0.003988 0.003977 -0.000438 0.002786 0.003253 -0.005295 
+0.000657 0.002725 -0.006861 0.000000 -0.000694 -0.000555 
+0.000878 -0.002999 -0.005177 0.000723 -0.003387 -0.007501 
+-0.000393 0.001242 -0.009547 -0.003260 -0.001322 -0.001146 
+0.000207 0.006150 -0.006098 0.002726 0.005429 -0.002173 
+0.001757 0.001857 -0.002637 0.001590 -0.001714 -0.001029 
+0.000577 -0.004912 -0.002072 0.000707 -0.000308 0.000725 
+0.000769 -0.000072 -0.000103 0.001630 0.000981 0.000382 
+0.003043 -0.000005 -0.000005 0.001575 -0.001892 -0.003471 
+0.000641 0.000605 -0.007403 -0.002774 0.002012 -0.004298 
+0.001039 0.005246 -0.000304 0.000569 0.002385 -0.000052 
+-0.002285 -0.000591 -0.000995 -0.003011 -0.003209 -0.000496 
+-0.001807 -0.001931 0.000133 -0.001402 0.000772 0.000650 
+-0.000579 -0.000443 0.001151 -0.001631 -0.001275 0.001244 
+0.002226 -0.001066 -0.002473 -0.001503 0.003300 -0.005358 
+0.005444 0.003671 -0.007833 0.000626 0.004085 -0.001902 
+-0.004432 0.001857 -0.001817 -0.004109 0.001598 -0.002237 
+-0.002740 0.001091 -0.003835 -0.004080 -0.000236 -0.001812 
+-0.003256 -0.003919 0.000778 -0.001765 -0.004518 0.001641 
+-0.000339 -0.001666 0.001875 0.000500 -0.000388 0.002061 
+0.001829 0.001345 0.001371 0.001149 0.002821 -0.000164 
+0.002845 0.000313 -0.002482 -0.000109 -0.001889 -0.004563 
+-0.002328 -0.002015 -0.001164 -0.002354 0.000905 0.000479 
+0.000185 0.002198 0.001360 0.002351 0.003769 -0.005149 
+-0.002740 0.002778 -0.003349 -0.002508 0.001500 -0.002090 
+-0.004453 0.001394 -0.000751 -0.004025 0.001277 0.003681 
+-0.000208 0.002769 -0.000221 0.001963 0.002196 -0.006471 
+0.004197 0.003610 -0.006548 0.001163 0.001875 -0.001341 
+0.000090 0.000550 0.000420 0.001720 0.001669 -0.000014 
+0.000468 0.002186 0.000538 -0.000110 0.001272 0.000310 
+0.000509 -0.000118 -0.000012 0.000610 0.001562 -0.004990 
+-0.000625 0.003183 -0.004081 -0.001954 0.000200 0.001353 
+0.000865 0.000961 0.003684 0.001912 -0.001395 0.000789 
+0.000505 -0.000658 -0.001367 -0.001003 0.006068 -0.004151 
+-0.001803 0.005160 -0.002472 0.000416 -0.001610 0.000093 
+0.002083 -0.007538 0.003371 0.001275 -0.006077 -0.000699 
+-0.001119 -0.003361 -0.001566 -0.003074 -0.002962 0.000378 
+0.000248 -0.000045 -0.001094 0.000040 -0.002143 0.000040 
+0.002391 0.002489 -0.002620 -0.000537 0.001776 -0.002346 
+-0.002299 -0.000133 0.001321 -0.000034 -0.001160 0.000477 
+0.000985 -0.001288 -0.002955 -0.001121 0.003048 -0.001640 
+-0.003311 0.003762 -0.001129 -0.007333 0.000542 -0.001625 
+-0.001141 0.003707 -0.001999 -0.002097 -0.000378 0.002389 
+-0.000999 -0.001167 0.004150 -0.001983 -0.000991 0.005826 
+0.003080 -0.003008 0.003656 0.002460 -0.001968 0.001476 
+0.002520 -0.000193 -0.000158 -0.002188 -0.001234 -0.000264 
+-0.003723 -0.000410 -0.000300 -0.002064 0.000938 -0.002195 
+-0.001399 0.002071 -0.004088 -0.001482 0.001174 -0.001424 
+-0.005462 0.000000 0.002308 -0.007054 -0.005767 0.005101 
+-0.001160 -0.004184 0.002700 0.000146 0.002500 -0.000206 
+0.001247 0.002699 -0.000397 -0.000527 -0.001507 -0.001128 
+-0.008632 -0.003481 0.000429 -0.005747 -0.007135 0.005032 
+-0.004257 -0.006266 0.005058 -0.002289 -0.001307 -0.000003 
+0.002757 0.007695 -0.004471 0.004273 0.011168 -0.008384 
+0.003368 0.009499 -0.009034 0.003025 0.007395 -0.003765 
+-0.001504 0.002030 -0.001429 -0.004713 -0.001250 -0.000224 
+-0.000795 0.000133 0.000133 0.000934 0.001241 -0.003747 
+0.001024 0.002913 -0.002756 -0.001907 -0.000497 -0.001749 
+-0.003299 0.000434 -0.002344 -0.002539 0.000241 -0.002183 
+-0.000773 -0.000564 0.000539 0.000977 0.002417 0.001011 
+0.002016 0.003645 0.000469 0.000751 0.002879 0.000465 
+0.002596 0.000725 0.000611 0.001200 0.002413 -0.002477 
+0.000016 0.002400 -0.001380 0.000482 0.002370 -0.000872 
+0.001764 0.002327 -0.000713 -0.001259 0.001265 0.001247 
+0.002370 0.001331 0.001877 0.001789 -0.000132 0.001210 
+-0.000349 -0.000195 0.000400 -0.002815 0.001961 0.002423 
+-0.002417 0.000222 0.001603 0.000378 0.001859 0.000767 
+0.000476 0.004673 0.001703 -0.001782 0.004269 0.000974 
+-0.001305 0.000865 -0.000417 0.000592 -0.000320 -0.002015 
+0.001469 -0.001326 -0.000507 0.004447 0.005935 -0.000213 
+0.004494 0.001658 -0.005759 0.004281 0.001343 0.000168 
+0.000525 -0.000286 0.002768 0.000568 -0.000582 0.001007 
+-0.000407 0.000542 -0.001270 -0.000637 0.001596 -0.003095 
+0.004167 0.000000 -0.001042 -0.000044 -0.001985 -0.000732 
+0.000116 -0.001137 -0.001004 0.000523 0.000407 -0.002010 
+0.001310 0.002785 -0.000553 0.002527 -0.002446 -0.002366 
+0.002833 0.003967 -0.001702 0.001102 -0.001102 -0.000787 
+0.000970 -0.000075 0.000398 -0.000875 0.000950 0.000056 
+-0.001551 0.000774 -0.000394 0.000454 0.000055 -0.001044 
+0.003559 -0.000559 0.000588 0.001665 -0.002467 0.001912 
+-0.000372 -0.003064 -0.000128 -0.001857 -0.000929 -0.002322 
+-0.000498 0.000923 -0.003175 0.000750 0.001938 -0.001407 
+0.000290 0.000581 -0.000403 0.001967 -0.000870 0.001059 
+-0.000606 0.001003 -0.000345 -0.002581 0.001688 0.000053 
+-0.003150 -0.000704 -0.000176 -0.002877 -0.003144 -0.000568 
+0.000683 -0.001365 -0.000556 0.000594 -0.000503 -0.001051 
+0.003290 0.002927 -0.002369 0.004091 0.003273 -0.001909 
+0.000923 0.001462 0.000923 -0.001068 -0.000911 0.000755 
+-0.000737 -0.001705 0.002580 -0.000369 -0.001578 -0.000348 
+-0.001007 -0.001439 -0.002446 0.001012 0.004046 -0.007803 
+0.002802 0.003020 -0.006031 -0.001133 0.000034 0.000618 
+-0.001832 0.008221 -0.000675 0.002047 0.010718 -0.000601 
+0.005884 0.006412 0.000844 0.001098 0.001146 0.001114 
+-0.002939 -0.001628 -0.001679 0.000578 0.001446 -0.008692 
+0.000720 0.009355 -0.006908 0.003557 0.008531 -0.003436 
+0.000933 0.003839 0.000813 -0.001865 -0.000131 0.000420 
+-0.001141 -0.001542 -0.001437 0.000394 -0.000351 -0.001480 
+0.001435 0.001468 -0.000228 0.000279 0.004754 -0.000557 
+0.002111 0.004912 -0.001596 0.003007 0.003671 -0.000259 
+0.004089 0.001421 0.000652 0.000227 -0.001440 -0.000531 
+-0.000088 -0.001278 -0.000053 -0.001307 -0.001829 -0.001091 
+-0.000334 -0.000939 -0.001071 0.001111 0.000611 -0.001722 
+0.002546 0.003422 -0.003408 -0.000945 0.003819 -0.005105 
+-0.002921 0.001903 -0.005775 -0.002194 0.004730 -0.004464 
+-0.003782 0.003345 0.000319 0.000797 -0.002969 0.002391 
+-0.001609 -0.002626 0.002329 -0.000513 0.001310 0.000457 
+-0.001190 0.004741 -0.000012 0.002313 0.001962 0.001402 
+0.004192 0.002082 -0.003671 0.003430 0.000732 -0.004757 
+0.003496 0.002736 -0.003518 0.001921 0.006424 0.000150 
+0.002118 0.001834 0.001740 0.000692 -0.001119 -0.000604 
+-0.000116 -0.001766 -0.003553 -0.001294 0.001613 -0.006492 
+-0.002992 0.001789 -0.001200 -0.000528 0.001685 0.000115 
+0.000471 0.000461 0.002231 0.000919 0.001846 0.000235 
+-0.000334 0.002392 -0.000380 0.000449 0.003141 -0.003589 
+-0.002930 0.002721 -0.003297 -0.002655 0.003635 -0.001306 
+0.000720 0.004800 0.000000 0.002742 0.000000 -0.003306 
+0.002451 0.003992 -0.004808 0.001991 0.003778 -0.002782 
+0.002373 0.002955 -0.000872 0.001849 0.002101 0.000000 
+-0.000502 0.001488 -0.002202 -0.001357 0.000910 -0.003405 
+-0.000542 -0.000065 -0.003035 -0.000130 0.001049 -0.002091 
+0.002123 0.001182 -0.000235 -0.000797 0.002034 -0.000305 
+-0.000734 0.003832 -0.000915 0.001081 0.003454 -0.002547 
+0.000496 0.000174 -0.000769 -0.000279 -0.001326 0.002117 
+0.001141 -0.003680 0.000964 0.001270 -0.000092 -0.000018 
+0.000599 0.000584 -0.001154 -0.002192 0.000171 -0.000499 
+-0.002080 0.001280 -0.003520 -0.000541 -0.000708 -0.005164 
+0.003457 0.003090 -0.006252 0.001656 0.003300 -0.005828 
+-0.000286 0.001735 -0.004020 0.003137 0.000823 -0.003815 
+0.000566 0.000494 -0.000563 -0.003877 -0.000954 0.003477 
+-0.001425 0.002445 0.000308 -0.000284 0.001642 0.001153 
+0.000506 0.004277 -0.002245 0.003770 0.005158 -0.003968 
+0.004847 0.006648 -0.002308 0.000871 0.000718 0.001060 
+0.002088 -0.002410 -0.001510 0.000423 -0.001443 -0.000075 
+-0.000388 0.001860 -0.002248 0.000533 0.001347 0.000028 
+-0.000405 -0.000285 -0.000081 -0.003269 -0.003673 0.000705 
+-0.002176 -0.005952 0.001108 -0.000852 -0.003665 -0.003303 
+0.001951 -0.001859 0.000454 0.001481 0.003172 0.000261 
+0.001807 0.003971 -0.001217 -0.000655 0.001458 -0.003210 
+0.000105 0.003941 -0.002030 0.001093 0.002922 -0.000388 
+0.001217 0.002032 -0.001837 0.001699 0.005639 -0.005928 
+0.005059 0.005775 -0.009032 0.000899 -0.001714 -0.007673 
+0.000325 -0.000937 -0.001055 0.001069 0.001281 0.000855 
+0.000814 0.000015 0.000597 -0.001316 -0.001254 -0.001756 
+-0.002845 0.000607 0.002035 -0.003374 0.000603 0.002688 
+-0.000141 0.000347 -0.000290 0.002642 0.003190 -0.005059 
+0.000110 0.004156 -0.008533 -0.001409 0.004762 -0.006415 
+0.000513 0.003958 -0.001955 0.000351 0.002458 -0.000394 
+-0.000312 -0.000150 -0.000439 -0.001252 -0.001270 -0.002899 
+-0.000470 -0.002942 -0.003519 0.002772 -0.005033 -0.003392 
+0.001517 -0.004619 -0.001974 -0.000432 -0.003125 -0.002971 
+-0.001215 -0.000148 -0.003572 0.001601 0.000086 -0.003277 
+0.001016 0.000508 -0.002857 -0.001784 0.001100 -0.002401 
+-0.005239 0.000748 -0.000076 -0.004503 -0.002520 -0.001101 
+-0.003304 -0.001366 -0.001424 -0.001840 -0.000104 0.000017 
+0.002540 -0.001057 -0.002893 -0.001513 0.000128 -0.000462 
+-0.000410 0.005050 -0.003550 0.004114 0.003529 -0.000468 
+-0.001767 0.003315 0.000310 -0.003296 -0.000480 -0.001648 
+-0.002036 -0.002919 -0.000192 0.003431 -0.000568 -0.002098 
+0.006016 0.003280 -0.003008 0.003360 0.003415 0.000683 
+0.000775 0.000582 0.000194 -0.001577 -0.001862 -0.000540 
+-0.001688 -0.003958 -0.002263 0.000067 -0.005827 -0.002277 
+0.000754 -0.004891 -0.000937 -0.001381 -0.000460 0.000159 
+0.000273 0.003027 -0.000552 -0.000091 0.004370 0.001442 
+-0.000488 0.002171 -0.000724 0.001419 -0.000296 0.000532 
+0.001882 -0.002387 0.000518 -0.000410 0.002893 -0.003501 
+0.001463 0.001646 -0.004058 0.000010 -0.000736 0.000326 
+-0.004018 -0.005531 0.003145 -0.006061 -0.004514 0.001805 
+-0.003101 0.000951 -0.001613 -0.001946 0.005338 -0.002055 
+-0.002298 0.005281 -0.003703 0.003085 0.004396 -0.003171 
+-0.000024 0.002015 -0.000052 -0.000562 -0.000464 -0.001071 
+-0.001322 -0.001198 -0.001095 0.002189 0.001270 -0.001838 
+0.003575 0.003012 -0.000964 0.002954 0.000793 -0.001193 
+0.002288 -0.000317 -0.000612 0.001947 0.001783 -0.000023 
+-0.000584 -0.000722 -0.002749 -0.000517 -0.000607 -0.001170 
+0.000242 -0.001444 -0.000775 0.000849 -0.000747 0.000119 
+0.001055 0.003075 -0.003949 0.003006 0.002241 -0.002558 
+0.001575 0.000159 -0.000563 0.001392 0.000347 0.001220 
+0.001436 0.002140 -0.001015 0.000005 0.002600 -0.003876 
+-0.001463 -0.000463 -0.003852 -0.003977 -0.003957 -0.000080 
+-0.003966 -0.006048 0.002743 -0.004611 -0.006014 0.004460 
+0.006007 0.005205 -0.005107 0.001706 0.004391 -0.006218 
+0.000148 0.002898 -0.002806 -0.002452 0.001521 -0.000970 
+-0.001834 -0.005253 0.000187 -0.001332 -0.000436 0.002596 
+-0.003270 0.003019 0.002163 -0.004454 0.000595 0.000892 
+-0.002420 0.001311 -0.000708 -0.006077 -0.003914 0.001545 
+-0.005190 -0.000103 -0.003102 -0.006414 0.003589 -0.004112 
+-0.006854 0.004201 -0.005456 -0.004312 0.001754 -0.003527 
+-0.000818 -0.001821 -0.002072 0.000373 -0.001406 -0.000727 
+0.000062 0.000148 0.000230 -0.000327 0.001248 -0.000426 
+-0.001307 -0.000258 0.000877 -0.000963 -0.001637 0.000887 
+-0.000233 -0.001447 0.001092 0.000734 -0.000052 -0.000052 
+0.001825 0.001241 -0.003687 0.001992 0.001989 -0.006966 
+-0.000789 -0.003255 -0.005276 -0.000548 -0.001885 -0.002067 
+-0.000024 0.000008 -0.000813 -0.000049 -0.001220 -0.000016 
+0.000579 -0.002221 -0.000902 -0.001212 -0.003312 0.000700 
+0.000870 -0.000812 0.000155 0.000744 -0.000044 -0.000944 
+0.001853 0.000798 -0.001386 0.000937 0.001244 0.000533 
+0.000156 -0.000233 0.001712 0.001876 -0.000240 0.000338 
+0.002228 0.001050 -0.001893 0.001575 -0.000551 -0.002126 
+-0.001969 -0.001732 -0.000157 -0.005736 -0.000662 0.000441 
+-0.001949 -0.001830 0.000477 -0.003363 -0.000374 -0.002080 
+-0.003053 0.000611 -0.001984 -0.003701 0.000046 -0.000460 
+-0.001429 -0.000549 0.000824 0.001322 0.000186 -0.001699 
+0.000340 0.001135 -0.000382 -0.001139 -0.002219 -0.000714 
+-0.004057 -0.005251 0.000672 -0.002188 -0.003468 0.000467 
+0.001109 0.002946 -0.000023 0.003496 0.007629 -0.000005 
+0.004457 0.007718 0.000203 0.000571 0.006479 0.001810 
+0.000477 0.007210 -0.001786 0.000449 0.006776 -0.004006 
+0.001869 0.002821 -0.002060 -0.000772 -0.003102 -0.001585 
+-0.003065 -0.002968 0.001241 -0.000404 -0.000460 -0.000079 
+-0.003639 0.002737 -0.000887 -0.001420 -0.000162 -0.001277 
+-0.000384 -0.000049 -0.000006 -0.000411 -0.000335 -0.000169 
+0.001965 0.000792 0.000325 -0.001100 0.000205 -0.001355 
+-0.001245 0.003947 -0.004418 -0.002208 0.002398 -0.001111 
+-0.000455 -0.000353 -0.000964 0.000655 0.002673 -0.002166 
+0.000072 0.002885 -0.001947 -0.000485 0.000939 0.000364 
+-0.004917 0.000750 -0.001167 -0.002319 0.005848 -0.002647 
+0.000357 0.007134 -0.001784 -0.001478 0.000870 -0.000522 
+-0.002856 0.003193 0.001684 -0.002774 0.002325 0.002122 
+-0.001068 -0.000606 0.002172 0.000307 0.000055 0.000582 
+0.001111 -0.001555 -0.001212 -0.001068 0.000214 -0.002776 
+0.001885 -0.000269 -0.004409 -0.000008 -0.000099 -0.000223 
+-0.000992 0.001549 0.002213 0.000599 0.000576 0.001805 
+-0.000955 0.001059 -0.000486 -0.002926 0.001561 -0.001277 
+-0.004763 0.002691 -0.001674 -0.003546 0.002262 -0.000803 
+0.000537 0.000373 0.001406 0.002694 -0.001788 0.001187 
+0.004341 -0.001984 -0.003969 -0.001633 0.003462 -0.007818 
+0.004113 -0.000097 -0.006266 -0.001649 -0.000740 -0.001048 
+-0.001986 -0.003727 -0.000041 -0.001297 -0.002602 0.002596 
+0.000736 0.000361 -0.001848 0.001298 0.005289 -0.003893 
+0.004168 0.004865 0.000398 0.000923 0.002655 0.001532 
+-0.001109 0.000517 -0.000237 -0.001372 -0.000679 -0.000795 
+-0.000040 -0.000722 -0.000529 0.001931 0.001454 -0.000535 
+-0.000010 0.003056 -0.005066 -0.000395 0.002709 -0.006942 
+0.005648 0.003765 -0.007807 0.001821 0.007034 -0.010016 
+0.003898 0.005572 -0.009279 0.002516 0.001510 -0.005313 
+0.001233 -0.001706 0.002061 -0.000245 -0.004679 0.006795 
+-0.001266 -0.002442 0.006120 -0.000250 0.000089 0.001692 
+-0.000445 0.005804 -0.002243 -0.005497 0.005414 -0.003747 
+-0.005326 0.004662 -0.000761 -0.003010 0.004921 -0.002186 
+-0.002858 0.002960 -0.000306 -0.002034 0.001197 0.000287 
+-0.002555 -0.002233 0.002016 0.002082 -0.002584 0.001079 
+-0.002503 -0.007352 0.001059 -0.001622 -0.006112 0.001484 
+-0.001894 0.000550 0.001527 0.002292 0.002023 -0.000086 
+0.003222 0.003381 -0.001409 0.002353 0.001943 -0.000946 
+-0.000505 0.002822 -0.004061 0.001141 0.001532 -0.001988 
+0.000639 0.000290 -0.000016 -0.000556 -0.001692 -0.000209 
+0.000045 -0.001313 -0.000294 0.000545 0.002047 0.000682 
+0.001011 0.006192 -0.000680 0.000245 0.005627 -0.003211 
+-0.002309 0.003703 -0.000849 0.000394 -0.001960 -0.001570 
+-0.001176 -0.002389 -0.002058 -0.002175 0.000069 -0.000984 
+-0.000937 -0.001250 0.001533 -0.003690 -0.000923 0.003525 
+-0.001541 -0.000214 0.003806 0.000802 -0.002799 0.002552 
+-0.000241 -0.002500 0.001364 0.000336 0.000873 0.002185 
+0.005812 0.001855 0.002101 0.000549 0.003844 0.001441 
+-0.000331 0.002426 0.000771 -0.003089 0.001545 -0.000244 
+0.002731 0.005781 -0.002667 0.003432 0.003474 -0.001339 
+0.000880 0.000220 -0.002061 0.001045 -0.000032 -0.000434 
+0.002075 0.000787 -0.001041 0.001811 0.001220 -0.003661 
+0.001177 -0.000350 -0.002991 -0.000427 0.000458 -0.001496 
+-0.000205 0.000698 -0.000334 -0.000328 0.003610 0.000657 
+-0.001052 0.006170 -0.000566 -0.004150 0.006365 -0.001276 
+-0.003504 0.004301 0.000478 0.000615 0.002231 -0.002883 
+-0.000379 0.001840 -0.000147 0.004800 0.003204 0.001354 
+0.001776 0.004971 -0.002846 0.001979 0.004329 -0.002534 
+0.001183 -0.000670 -0.002836 -0.000919 0.001352 -0.000595 
+0.000525 0.002782 -0.001003 0.002099 0.003390 -0.001345 
+0.004929 0.000724 -0.004446 -0.000065 0.003058 -0.003582 
+-0.000129 0.001598 0.001182 -0.000395 0.002090 0.002147 
+-0.000653 0.000512 0.003522 0.000412 0.001925 0.001748 
+-0.000303 0.002891 0.000788 0.000106 0.002672 -0.000394 
+0.001738 0.001583 -0.003042 0.005039 -0.000084 -0.003647 
+-0.000082 -0.002391 -0.003682 -0.001556 -0.000052 -0.003828 
+-0.000562 -0.000349 -0.002385 -0.000892 -0.003753 -0.000184 
+0.000850 -0.002974 -0.000325 -0.002425 -0.001672 -0.002655 
+-0.000978 -0.000083 0.000559 0.000476 0.002115 -0.001608 
+-0.000095 0.003394 -0.003012 -0.001562 0.003125 -0.003750 
+0.000794 0.000754 -0.001310 -0.002402 -0.000674 0.002212 
+-0.007566 -0.008274 -0.001180 -0.004431 -0.006994 -0.000261 
+0.000236 -0.000885 -0.001967 0.000084 0.002866 -0.000695 
+0.000929 -0.000799 -0.000488 -0.000450 -0.004263 0.001163 
+0.000962 -0.001226 0.000602 0.005587 0.003306 -0.000162 
+0.009538 0.009951 -0.002863 0.008758 0.008770 -0.002134 
+-0.000752 0.004028 0.003577 0.000711 0.002803 -0.000092 
+-0.001094 -0.001684 -0.000475 0.000000 -0.002619 -0.002937 
+-0.000642 -0.001604 -0.004884 -0.000382 0.000992 0.000382 
+-0.005115 0.000458 0.000458 -0.002926 -0.002613 0.000279 
+-0.001207 -0.001480 0.000239 -0.000417 0.001404 -0.001679 
+0.002788 0.002082 -0.003706 0.002856 0.003382 -0.000934 
+0.001391 0.002732 0.001429 -0.000845 0.000716 0.001618 
+-0.000920 -0.000137 0.000627 -0.000079 -0.000217 0.000372 
+0.000992 -0.000724 0.000236 -0.000428 0.000012 0.000743 
+-0.003793 -0.002075 0.001934 -0.007464 -0.004010 0.002452 
+-0.006102 -0.004164 0.001666 -0.000300 -0.002005 0.001236 
+0.000610 0.001463 -0.000203 -0.001112 0.001220 -0.001974 
+-0.000574 -0.001620 -0.001353 0.000222 -0.001223 0.000741 
+0.000915 -0.003393 -0.002879 -0.000313 -0.000045 -0.000805 
+0.002333 0.001900 -0.000633 -0.001080 0.000353 -0.002042 
+-0.001037 -0.001924 -0.000859 -0.000367 -0.001654 -0.002537 
+-0.002387 0.003887 -0.002976 -0.003931 0.006776 -0.001767 
+-0.004916 0.004404 -0.000050 -0.003906 -0.000721 0.002291 
+-0.000654 -0.001372 -0.000154 -0.000836 0.002543 -0.002692 
+-0.001905 0.003513 -0.006013 0.004007 0.002787 -0.006099 
+0.003195 0.004046 -0.000533 -0.000488 0.007154 0.000244 
+-0.004377 0.006203 -0.001643 -0.002881 -0.001257 -0.001989 
+-0.005505 -0.001208 -0.000941 -0.000535 0.000418 0.000051 
+0.000571 0.000042 0.000832 0.001949 0.002966 0.001017 
+0.000000 0.003607 -0.000902 0.000739 0.003695 -0.005039 
+-0.000584 -0.001765 -0.001566 -0.000235 -0.002736 -0.001798 
+0.002083 -0.005000 0.001250 -0.000114 -0.005031 -0.002205 
+0.000513 -0.002514 -0.001795 0.000236 0.001575 -0.003858 
+-0.000275 0.004588 -0.004405 0.000775 0.001163 0.000388 
+-0.001792 0.000190 0.002303 -0.003439 -0.001290 0.003252 
+-0.002669 -0.000736 0.003221 -0.000689 0.000413 0.000635 
+-0.000650 -0.000675 -0.000743 -0.000716 -0.000493 -0.000330 
+-0.001162 -0.000253 -0.000328 -0.001148 -0.001710 0.000184 
+-0.000924 -0.001933 0.000388 0.000729 -0.001148 -0.000104 
+0.001976 -0.000670 -0.002502 -0.000645 -0.001014 -0.001935 
+0.001977 -0.001566 -0.001560 0.000726 -0.001959 -0.000949 
+0.000537 -0.001178 0.000667 0.004158 0.001326 0.000461 
+0.006419 0.003392 -0.002246 0.006704 0.004262 -0.005532 
+0.004738 0.005676 -0.007697 0.000000 0.005839 -0.007080 
+0.002326 0.004950 -0.004474 0.000601 0.002781 -0.002329 
+0.000000 0.001746 -0.001032 -0.000347 0.002081 -0.001260 
+-0.000392 0.001421 -0.002103 -0.000221 0.001250 -0.001691 
+0.000956 0.000895 -0.001492 0.001381 0.001849 -0.000446 
+0.000252 0.002698 -0.001727 0.001504 0.000780 -0.001922 
+-0.000177 -0.000354 -0.000087 -0.001564 -0.003128 0.000752 
+-0.002378 -0.002842 -0.000504 0.001046 0.000659 -0.001124 
+0.003307 -0.000773 0.001013 0.000635 -0.000922 -0.000168 
+-0.005801 -0.000238 0.001597 -0.006744 -0.001273 0.004135 
+-0.002161 -0.001713 0.001753 0.000134 -0.000067 -0.002185 
+0.005653 -0.000636 -0.007592 0.001797 -0.000405 -0.004329 
+-0.008651 -0.005204 0.001772 -0.013337 -0.017982 0.010815 
+-0.016716 -0.021903 0.021313 -0.013655 -0.015985 0.018783 
+-0.003529 -0.006447 0.005692 0.001366 0.001775 -0.001527 
+0.001345 0.003766 -0.004424 0.001042 0.002334 -0.004827 
+0.001289 0.000736 -0.008472 0.006372 0.003256 -0.003186 
+0.004557 0.004025 -0.003263 0.000652 -0.006660 -0.001243 
+0.010844 -0.015866 0.013027 0.006810 -0.003326 -0.007385 
+0.003638 -0.001300 -0.007844 0.003641 -0.001772 -0.012178 
+-0.027007 -0.028496 -0.005941 -0.016079 -0.020977 0.002923 
+-0.009187 -0.014038 -0.000596 -0.009411 -0.013026 -0.002758 
+-0.010366 -0.013979 -0.007070 -0.009924 -0.023428 -0.001561 
+-0.027431 -0.029497 0.023163 -0.016395 -0.012837 -0.001082 
+0.021527 -0.002241 -0.026738 -0.006888 -0.005844 -0.034545 
+-0.010123 -0.001446 -0.052308 -0.036389 0.015611 -0.028222 
+0.002796 -0.039803 -0.014243 0.113778 0.067778 -0.056889 
+-0.032047 -0.055994 0.071959 -0.125065 -0.088117 0.004740 
+0.053445 0.028403 -0.010840 -0.062949 -0.042735 0.017906 
+-0.016118 -0.015176 -0.038882 0.095195 0.030519 -0.021558 
+0.021257 0.031220 0.029781 0.085861 0.074043 -0.026651 
+0.068000 0.118750 -0.051000 0.027500 -0.041912 -0.025147 
+-0.001731 0.083750 -0.002596 -0.025249 -0.035015 0.013460 
+-0.005422 -0.024477 -0.007791 0.004376 0.006512 0.000961 
+-0.007087 0.013081 -0.003053 0.023521 0.035416 0.018702 
+-0.027500 -0.053949 -0.001927 0.016408 -0.057825 -0.002078 
+0.037470 -0.029321 -0.014725 0.019144 0.004222 -0.011879 
+0.002362 0.004829 0.000640 -0.003218 -0.008815 -0.006323 
+-0.004298 -0.002982 -0.012719 -0.003960 0.016096 -0.000053 
+-0.002765 0.006232 0.003076 -0.001921 0.001131 0.000479 
+-0.001502 0.000361 0.002094 0.001316 -0.001157 0.003136 
+0.004069 -0.000627 -0.002014 0.003456 0.002320 -0.006548 
+-0.000531 0.004713 -0.005833 -0.004634 0.002332 -0.005167 
+-0.009467 0.000019 -0.002386 -0.006122 0.002334 -0.001260 
+-0.003405 0.001258 0.001592 0.001090 -0.001598 0.003992 
+0.001192 -0.009206 0.000923 -0.003391 -0.008402 -0.002773 
+-0.003564 -0.000533 -0.002631 0.000000 0.001062 -0.005221 
+0.004498 0.001376 -0.008426 0.004461 0.002082 -0.009304 
+0.002511 0.000242 -0.005649 -0.002557 -0.001830 -0.000929 
+0.004941 -0.000622 -0.007969 0.006118 -0.003781 -0.002944 
+-0.000400 -0.003660 -0.004032 -0.001339 -0.009169 0.007586 
+-0.006199 -0.004017 0.015522 -0.018930 -0.005095 0.009670 
+-0.017924 -0.009262 0.001288 -0.008717 -0.011302 -0.004449 
+-0.004813 -0.004212 -0.005588 -0.000301 -0.002163 -0.001735 
+-0.000221 -0.001055 -0.000659 0.002605 0.002939 -0.003323 
+0.006633 0.008358 -0.008082 0.015402 0.007789 -0.011985 
+-0.000006 0.002460 -0.009788 0.002646 0.002843 -0.009820 
+0.004702 -0.000458 -0.016069 -0.001190 0.007150 -0.021734 
+-0.008996 0.003613 0.012086 -0.008695 -0.009887 0.000722 
+-0.004727 -0.013328 -0.005227 -0.005941 -0.011381 -0.005031 
+-0.002200 -0.012391 -0.003533 -0.000679 -0.020595 0.001566 
+-0.012424 -0.017677 -0.001742 -0.003363 -0.005310 -0.003218 
+0.005909 0.000558 -0.000053 0.006988 0.007876 -0.004106 
+-0.002928 0.025565 -0.031812 -0.040428 -0.012127 -0.024970 
+0.061325 -0.028638 -0.003340 0.022471 -0.031983 0.030259 
+-0.042651 -0.040482 0.031084 -0.041892 -0.098208 0.016287 
+0.031941 -0.025941 0.043412 -0.011795 -0.028333 0.017692 
+0.009732 -0.026429 0.023661 0.000836 0.005378 -0.014071 
+0.011066 -0.001006 0.002727 0.039714 0.048571 0.019143 
+-0.030513 0.078889 -0.020342 -0.026667 -0.025833 -0.039167 
+0.064000 -0.014966 -0.006414 0.057817 -0.047544 0.082544 
+-0.026965 -0.036912 0.067281 0.011674 -0.009296 0.010520 
+0.049089 0.005661 0.034810 -0.082577 0.009015 -0.015068 
+-0.035707 -0.167148 -0.012808 0.038220 -0.030833 -0.010651 
+0.031128 0.007056 -0.006698 0.024798 0.008477 -0.004024 
+0.015684 0.017062 0.002998 0.008776 0.010359 0.008206 
+-0.040243 -0.005487 0.009038 -0.009134 0.009462 -0.008553 
+-0.004127 0.003123 -0.002693 -0.003266 0.000551 -0.001206 
+0.001781 -0.000650 -0.000621 0.002220 -0.001260 0.000000 
+0.001970 0.000418 -0.001663 -0.000395 0.004474 -0.000395 
+-0.002741 0.001433 -0.002716 -0.002513 0.000026 -0.000296 
+-0.006404 -0.001922 0.003483 -0.010391 -0.002938 0.005005 
+-0.008360 -0.001025 0.002524 -0.003414 0.000502 -0.000453 
+-0.002170 -0.000348 -0.001163 -0.002955 -0.002527 -0.001310 
+-0.003287 -0.005154 -0.000471 -0.000249 -0.001390 -0.001405 
+-0.001154 0.000156 -0.001703 -0.001522 0.001066 -0.003089 
+0.000629 0.000990 -0.000591 0.002164 -0.000508 -0.000523 
+0.001325 -0.000793 -0.001384 0.002329 -0.000986 -0.002826 
+-0.000266 -0.003399 -0.001866 -0.005615 -0.007177 -0.001591 
+-0.011684 -0.010925 0.002100 -0.013995 -0.012311 0.008537 
+-0.009609 -0.014146 0.013567 -0.002599 -0.005839 0.011167 
+-0.004899 0.000803 -0.003814 0.001614 -0.000314 -0.007378 
+0.001753 0.003481 -0.007154 0.001486 0.004499 -0.003651 
+0.001941 0.007498 -0.005390 0.004760 0.012588 -0.005286 
+-0.001966 -0.003350 0.007897 -0.000578 -0.002349 0.001453 
+-0.000559 -0.005321 -0.000290 -0.003099 -0.004612 -0.000375 
+-0.006176 0.004654 0.002166 -0.007480 0.005102 0.000097 
+-0.002434 -0.015689 -0.006561 0.015024 -0.019698 -0.005935 
+0.019923 -0.001280 -0.000908 -0.007990 -0.007280 -0.001463 
+-0.008806 -0.009917 -0.005592 0.029212 -0.008456 0.003641 
+0.015626 0.013394 -0.003832 0.008792 0.013040 -0.005342 
+-0.003554 -0.000728 -0.011790 -0.068889 -0.051111 -0.004444 
+0.013157 -0.013861 -0.016159 0.014760 -0.010566 -0.010534 
+0.017125 0.011675 0.013900 0.010205 -0.007466 0.008961 
+0.062049 0.091268 -0.044732 0.138547 0.106752 -0.114701 
+0.040135 0.002443 -0.085766 0.013087 -0.006325 -0.018033 
+0.013339 0.001565 0.005242 0.014663 0.041557 0.009723 
+0.031323 -0.051163 -0.030073 0.007955 -0.019213 -0.044393 
+0.023541 -0.016651 0.046077 0.034483 -0.041584 0.006401 
+-0.002175 0.014539 0.017286 0.022848 0.006161 0.001455 
+0.074696 0.033969 -0.019563 -0.008834 0.012095 -0.016831 
+-0.087442 0.057075 -0.037061 0.094461 0.065673 -0.027020 
+-0.007565 -0.008395 0.001008 -0.035103 -0.024323 0.007299 
+-0.000666 -0.014118 0.000225 0.017563 0.002002 0.004249 
+0.002330 -0.001303 -0.001603 0.006223 -0.006812 0.001784 
+0.004177 -0.007009 0.001508 0.001513 -0.004509 0.000232 
+0.000366 0.000382 0.000395 -0.001720 0.000906 0.001022 
+-0.003487 0.002563 -0.003109 -0.004369 0.003398 -0.006796 
+-0.006021 0.003866 -0.009382 -0.005143 -0.005350 -0.002470 
+-0.010273 -0.003951 -0.000847 -0.009973 -0.001102 0.004166 
+0.002985 -0.002613 0.005223 -0.001576 0.004317 0.001828 
+-0.003616 0.004188 0.001417 -0.003004 0.000615 0.000905 
+0.000092 -0.000055 -0.000089 0.001253 -0.000037 -0.003028 
+0.001349 0.001354 -0.005632 0.001385 0.003591 -0.001898 
+-0.000502 0.000248 -0.000177 -0.000696 -0.000170 -0.000363 
+0.003725 0.000768 -0.000487 -0.002390 -0.001260 0.000542 
+-0.005970 -0.001932 0.001416 -0.004407 -0.005319 0.000250 
+-0.004836 -0.007033 0.003754 -0.008411 -0.006179 0.005689 
+-0.009012 -0.008605 0.009746 -0.007234 -0.009340 0.010541 
+-0.006014 0.002143 -0.003321 0.005129 0.004635 -0.016863 
+0.004795 0.005742 -0.017449 0.003924 0.011068 -0.011236 
+0.005545 0.012282 -0.008858 0.010589 0.010918 0.003577 
+-0.005441 -0.005863 0.007936 -0.006568 -0.002199 0.003710 
+-0.004007 -0.000129 0.004695 0.000625 0.001119 -0.000468 
+0.014116 0.000878 -0.019301 0.007085 0.004620 0.003299 
+-0.003499 -0.007100 -0.003144 -0.002162 -0.015618 -0.004881 
+0.000360 0.009824 0.002180 0.002725 0.012257 0.003496 
+0.001404 -0.014178 -0.002715 0.008063 0.020759 -0.007511 
+0.008022 0.011693 -0.008493 -0.000144 0.002549 -0.001694 
+-0.002119 -0.007212 0.006287 0.000635 -0.019770 0.021800 
+0.107377 0.083326 -0.019574 0.051837 0.040816 -0.057347 
+0.026114 -0.039770 -0.000480 -0.006250 0.016250 0.056250 
+0.007302 0.008492 -0.010873 0.030822 0.026147 -0.024492 
+0.029226 0.016502 -0.020031 0.041953 0.003814 -0.015882 
+0.038330 -0.011125 -0.009257 -0.007560 0.017611 -0.026059 
+0.081868 0.074652 0.146813 0.014560 0.003681 0.076813 
+-0.020645 0.089032 -0.087742 -0.007987 0.014463 -0.023875 
+-0.000305 -0.007444 -0.011382 0.012193 -0.002771 -0.012332 
+0.011584 -0.000470 -0.000725 -0.004229 -0.000604 0.006715 
+-0.054348 -0.047826 0.020870 0.077410 0.112810 -0.085301 
+0.061967 0.027302 -0.050576 -0.013688 -0.001851 0.014012 
+-0.011579 -0.012526 0.006263 0.007650 0.005300 -0.006083 
+-0.003127 0.005757 -0.009218 -0.000229 -0.001709 -0.001356 
+-0.002314 -0.006364 0.000047 -0.005143 0.000772 -0.002443 
+-0.004964 0.003891 -0.002848 -0.001037 0.002585 -0.006020 
+-0.000799 0.001654 -0.009827 -0.002356 0.009764 -0.012998 
+-0.014596 0.016309 -0.007723 -0.013813 -0.000970 -0.003582 
+-0.005274 -0.000783 0.000563 -0.001816 -0.004640 0.006610 
+0.001724 -0.001674 0.002223 -0.004019 0.002313 -0.000908 
+-0.005412 0.001408 0.000602 -0.003468 0.000261 -0.000826 
+-0.000413 0.001044 -0.000696 0.002530 0.004467 -0.004180 
+0.003263 0.006361 0.002046 -0.002282 0.004277 -0.004007 
+-0.000040 0.002333 0.000220 -0.003504 0.000000 0.003504 
+0.002333 -0.002624 -0.004488 0.003908 -0.000131 -0.000703 
+0.003175 0.000759 0.000345 0.001636 0.000380 -0.000389 
+-0.000228 -0.004028 0.000337 -0.000599 -0.006802 0.003690 
+-0.001156 -0.006433 0.004112 -0.001362 -0.006150 0.002356 
+-0.002598 -0.001099 0.000460 -0.004010 0.005549 -0.006417 
+0.000917 0.009797 -0.012389 0.012958 0.011519 -0.014685 
+0.022879 0.015965 -0.022131 0.041817 0.012687 -0.003436 
+-0.005381 -0.005959 0.005151 0.001450 0.002759 -0.000290 
+-0.001024 0.011203 -0.003834 0.007546 0.013716 -0.006871 
+0.005996 0.010743 -0.000302 -0.001123 0.009333 -0.003996 
+-0.014737 -0.003725 0.036964 0.062795 0.068530 0.022444 
+0.090918 -0.082040 -0.024391 0.011536 -0.031529 -0.007277 
+0.011513 -0.031729 -0.001059 0.008182 0.010767 -0.009695 
+-0.004445 -0.005438 0.003043 -0.009271 -0.011752 -0.000033 
+0.000949 -0.004325 0.002106 -0.001149 0.022243 -0.014762 
+0.040769 0.016923 0.023846 0.019512 0.003070 -0.005419 
+-0.031716 -0.022843 0.002549 0.005189 0.012063 -0.019438 
+-0.082517 -0.005201 0.072466 -0.016681 -0.016552 0.008534 
+0.056883 -0.001218 0.034675 0.025000 -0.003739 -0.022432 
+-0.007528 -0.008904 0.000365 0.024483 -0.011447 -0.025741 
+0.035516 -0.006659 -0.008235 0.033985 0.000824 -0.011615 
+0.026033 -0.003444 -0.008131 -0.005409 0.005032 0.007186 
+-0.001146 0.003161 0.003421 -0.001293 0.000153 -0.000445 
+0.004700 -0.001421 -0.001222 -0.000102 -0.005062 -0.004168 
+-0.020726 -0.001294 -0.000337 -0.003869 -0.001209 -0.016117 
+0.003041 -0.001542 -0.022535 0.003010 -0.000538 -0.020765 
+0.008667 0.010051 -0.019408 0.000352 -0.001911 0.003203 
+0.001418 0.000286 0.002011 -0.001361 -0.003718 0.001150 
+-0.006729 -0.014825 0.003914 -0.003744 -0.006840 -0.003176 
+-0.002544 0.004407 -0.002514 0.000438 0.004657 -0.005447 
+-0.008538 0.005489 -0.000431 -0.013214 0.008611 -0.013580 
+-0.010158 0.010412 -0.017677 -0.010762 0.017445 -0.017574 
+-0.002817 0.009321 -0.016546 -0.000611 0.005029 -0.003834 
+-0.001079 0.003215 -0.004360 -0.001510 0.003181 -0.008749 
+0.005308 0.003072 -0.007823 0.000856 -0.000811 -0.000056 
+-0.004293 -0.007217 0.004892 -0.005549 -0.001896 0.000893 
+0.000918 -0.001467 -0.004511 0.003008 0.003239 -0.002429 
+0.001143 -0.000340 0.000274 -0.000181 0.000342 0.003398 
+-0.000286 -0.000205 -0.001615 0.005905 0.004029 0.000049 
+0.004836 0.001905 0.001086 -0.000211 0.000366 -0.001134 
+0.000857 0.000101 -0.000838 -0.000799 -0.004889 0.000377 
+-0.000804 -0.008615 0.001471 0.001548 -0.005082 0.000899 
+0.003496 -0.003400 -0.000774 0.006032 0.000967 0.000944 
+0.008120 0.006376 -0.000242 0.011653 0.003688 -0.004647 
+0.017713 0.005001 -0.013177 0.021381 0.008238 -0.007033 
+-0.006582 -0.003514 0.008831 0.008116 0.008696 -0.001418 
+-0.002303 0.017131 -0.001045 -0.001863 -0.002368 -0.002168 
+-0.027527 -0.011700 0.013424 -0.085903 -0.043909 0.029178 
+-0.023825 0.146979 0.092637 -0.010214 -0.015724 -0.065989 
+-0.023935 0.053024 -0.166420 -0.191934 0.254524 -0.167410 
+0.004882 -0.004268 -0.000642 0.016740 0.005745 -0.007996 
+-0.003730 -0.002561 -0.000728 -0.022702 -0.002300 0.019858 
+-0.006616 -0.002355 -0.002941 -0.012265 0.017894 -0.010610 
+-0.000625 0.018125 -0.020000 0.004425 0.026272 -0.036228 
+-0.003583 0.006655 -0.009200 -0.016431 -0.004314 0.002569 
+-0.020085 -0.017457 -0.018409 0.018478 0.010425 0.013524 
+0.016218 0.008131 0.027163 0.030817 -0.043467 -0.118844 
+0.010676 -0.011261 -0.003716 0.005799 -0.011145 0.014218 
+-0.016889 -0.021575 0.002785 0.014133 -0.015202 0.008790 
+0.000462 -0.000943 0.000178 -0.004004 0.005508 0.003123 
+-0.001670 0.005433 0.003080 0.001748 0.005135 0.002560 
+-0.018026 0.006115 -0.001584 -0.028020 0.009193 0.001097 
+-0.026161 0.007145 0.001278 -0.024886 0.001818 -0.001490 
+-0.023687 -0.004458 -0.002803 -0.017499 -0.009571 -0.002449 
+0.001806 -0.008571 -0.007040 0.013598 -0.004083 -0.005164 
+0.007973 -0.004841 -0.000931 0.012969 0.001458 -0.000593 
+0.001850 0.000747 0.001144 -0.004434 -0.002463 -0.002864 
+-0.003612 0.000063 0.000923 -0.005252 0.002851 0.000565 
+-0.006832 0.007651 -0.014914 -0.009000 -0.006967 -0.002297 
+-0.007586 0.009143 -0.016637 0.001877 0.010996 -0.007452 
+-0.009619 0.006960 0.000837 -0.005987 0.006879 -0.002440 
+-0.000734 -0.000757 -0.003684 -0.001427 -0.004727 -0.001435 
+-0.005298 0.002946 -0.002830 -0.001015 0.005254 -0.007504 
+-0.000635 0.001659 0.000679 -0.001270 0.000248 -0.001574 
+0.001661 -0.000830 -0.008303 0.002793 -0.000399 -0.009442 
+0.001752 0.001778 -0.000519 -0.001017 -0.001820 0.001384 
+-0.004838 0.004220 0.000762 -0.002742 0.001532 0.001572 
+-0.001810 0.001638 0.001638 -0.002054 0.001979 0.000453 
+-0.005108 -0.001823 0.002420 -0.006565 -0.003765 -0.000144 
+-0.003337 -0.005228 -0.001480 0.000554 -0.005588 -0.001744 
+-0.001091 -0.007139 -0.003198 -0.001408 -0.008936 -0.003379 
+-0.001424 -0.009387 -0.002797 -0.001133 -0.007318 -0.001265 
+0.003504 -0.005553 -0.003225 0.002108 -0.005078 -0.005159 
+-0.011435 0.006468 0.050227 -0.002954 -0.002016 0.003317 
+-0.000073 0.000807 0.000222 -0.012021 0.000499 -0.001176 
+-0.008172 -0.003918 0.001503 -0.003682 0.000445 0.003124 
+-0.002101 -0.001680 -0.006372 -0.010117 -0.000424 -0.013182 
+-0.005883 0.001852 -0.013246 -0.001746 0.004838 -0.007885 
+-0.014071 0.012669 -0.010362 -0.040031 -0.007174 0.006437 
+-0.010165 0.006715 -0.007766 0.000264 0.003314 0.004374 
+0.000279 -0.000852 0.003171 -0.007158 0.003018 -0.015284 
+-0.008421 0.006481 0.000864 -0.004852 0.000231 0.000693 
+0.005641 -0.006859 0.002756 0.010758 -0.002028 -0.038977 
+0.015363 0.021425 0.000996 -0.009666 0.012670 -0.014914 
+-0.005900 -0.004289 0.015801 -0.002991 0.000095 0.004870 
+-0.004692 0.000411 0.011861 -0.015032 -0.027757 0.027547 
+0.013677 -0.038192 0.018552 0.023324 -0.003108 -0.024482 
+-0.004934 -0.000408 -0.020474 -0.010723 0.003121 -0.008815 
+-0.015889 0.007380 -0.005241 -0.015116 0.019596 -0.008160 
+-0.017626 0.025891 0.006634 -4.375000 -0.437500 2.198864 
+-3.948357 -1.220657 2.615023 -3.128319 -1.818584 2.508850 
+-2.327273 -2.318182 2.127273 -1.738889 -2.683333 1.816667 
+-0.010730 -0.024928 0.006512 0.001840 -0.019818 0.002221 
+-0.000076 -0.021527 0.006118 0.006635 -0.004512 0.002562 
+0.002496 0.004617 0.002744 0.004527 0.007814 -0.001008 
+-0.000405 0.001939 -0.000665 -0.006232 0.003206 -0.003146 
+-0.009598 0.002832 0.002026 -0.012829 0.004470 -0.011925 
+-0.009949 0.008191 -0.011542 -0.005565 0.002991 -0.004338 
+-0.001368 0.001950 0.000546 -0.004695 -0.000487 -0.003002 
+-0.011813 -0.009217 -0.002625 -0.011247 -0.003726 -0.001636 
+-0.003757 0.002851 0.001417 0.000161 0.007375 -0.001891 
+0.003519 0.004838 -0.002418 0.005384 0.001277 -0.005934 
+0.001232 0.003162 -0.011088 0.007585 0.002673 -0.012062 
+0.002068 0.010670 -0.011497 0.001299 0.008032 -0.007441 
+0.001091 0.002592 0.000185 -0.002258 0.002828 -0.001465 
+-0.004410 -0.001135 0.001444 -0.000400 -0.000464 0.000927 
+-0.002862 0.002409 -0.001709 -0.001822 -0.000864 0.000440 
+0.002504 0.001703 -0.001864 0.002214 0.000100 -0.002050 
+-0.002210 -0.008066 -0.002171 -0.010835 -0.011788 -0.010478 
+-0.010995 -0.018776 -0.009339 -0.004104 -0.021392 -0.009279 
+0.001110 -0.016293 -0.007450 -0.000444 -0.009234 -0.006803 
+-0.007377 0.000519 0.003325 -0.005458 -0.013729 0.006524 
+-0.009371 -0.013922 0.004516 -0.004564 -0.004984 0.000553 
+0.006329 0.003098 0.000468 0.013782 0.016012 0.013766 
+0.010404 0.013024 0.025007 0.006223 0.008041 0.013204 
+0.006989 0.005219 0.014729 0.006943 0.002351 0.018917 
+0.012434 0.008767 0.025009 0.019663 -0.012308 0.010651 
+0.007395 0.002087 -0.021157 -0.001073 0.000404 -0.001577 
+0.003991 0.002743 0.003644 -0.002050 -0.003048 -0.007108 
+-0.047140 -0.015131 0.001501 -0.007584 -0.014117 0.012827 
+0.012226 -0.010726 0.004648 0.005398 0.001581 0.002624 
+0.010864 0.011930 -0.010984 -0.013711 0.005651 0.004716 
+-0.012794 -0.002951 0.006048 -0.005559 -0.015409 0.010871 
+-0.006665 -0.015719 0.026480 0.017075 -0.025627 0.023780 
+0.000095 -0.039457 0.004950 0.001574 -0.005138 -0.015537 
+-0.015034 0.004141 -0.006769 -0.024649 0.008544 -0.000187 
+-0.020478 0.027785 -0.003185 -6.152174 2.380435 1.967391 
+-5.125000 1.559211 2.328947 -4.404878 -0.058537 2.931707 
+-4.008969 -1.403587 3.421525 -3.230047 -2.187793 3.131455 
+-1.905263 -2.278947 2.142105 -0.008978 -0.018015 0.011633 
+-0.003155 -0.008341 0.005024 -0.001759 -0.003208 0.000994 
+-0.003873 -0.000355 -0.000979 -0.002939 0.005869 0.000854 
+0.001494 0.004524 0.001960 0.000691 -0.006250 -0.000061 
+-0.008210 -0.010886 0.001684 -0.014375 0.000350 -0.000175 
+-0.011809 0.008541 -0.009173 -0.005660 0.009450 -0.012426 
+-0.005592 0.007299 -0.003714 -0.000242 0.001757 0.001439 
+0.002537 -0.003987 0.000845 -0.000482 -0.007493 -0.004102 
+0.002478 -0.006003 -0.004691 0.003161 0.002513 -0.001175 
+0.000405 -0.000084 -0.000235 -0.000693 -0.002296 -0.000347 
+0.001514 -0.003739 -0.000426 0.002214 -0.002370 -0.005975 
+-0.002553 -0.003216 -0.004559 -0.001160 0.003782 -0.004135 
+-0.003050 0.003237 -0.000560 -0.004340 0.004206 0.002455 
+0.000499 0.003571 0.004004 0.002481 0.002068 0.001648 
+-0.003269 0.000280 -0.000888 -0.000774 0.004256 0.001636 
+0.000859 0.000620 0.002118 0.000797 -0.002923 0.001288 
+-0.000359 -0.000735 0.000870 0.000990 0.001300 0.000922 
+-0.006593 0.002394 -0.002278 -0.006093 -0.005270 -0.011407 
+-0.008032 -0.014612 -0.015605 -0.008957 -0.025137 -0.011582 
+-0.003016 -0.026081 -0.006217 0.003270 -0.007608 -0.006623 
+0.001003 -0.001730 -0.010121 -0.012906 -0.017205 0.007184 
+-0.012630 -0.012546 -0.001865 -0.000224 0.001791 -0.000075 
+0.017628 0.025143 0.010982 1.891089 3.366337 4.435644 
+1.280702 4.131579 3.500000 0.011251 0.030611 0.021023 
+0.415730 0.657303 3.730337 -0.006765 0.009821 0.036264 
+0.000815 0.006934 0.045796 0.012759 -0.011791 0.051684 
+0.025308 -0.029157 -0.069341 -0.001448 -0.005185 0.014293 
+-0.003747 -0.005523 0.001118 -0.001672 0.001930 0.008048 
+0.017098 0.016232 0.005960 -0.016216 0.014865 0.010000 
+-0.006809 -0.005437 -0.003508 -0.004604 -0.027251 -0.006403 
+-0.008443 -0.022031 0.001596 -0.018326 -0.011611 -0.001242 
+-0.021281 0.006564 0.017439 -0.010254 0.010703 0.018550 
+0.009179 0.012165 0.017036 0.027181 0.008391 0.023007 
+0.013258 -0.017370 0.000169 0.002637 -0.006847 -0.003819 
+-0.013098 0.011701 -0.002024 -0.024750 0.018121 -0.002176 
+-0.038065 0.052741 0.014490 -5.361538 4.092308 2.384615 
+-4.515982 1.360731 3.082192 -3.961131 -0.515901 3.448763 
+-3.368794 -1.361702 3.375886 -2.665272 -1.510460 2.472803 
+-0.015404 -0.012237 0.017425 -0.009537 -0.002991 0.010837 
+-0.005738 0.010560 -0.000131 0.002001 0.001892 0.000570 
+-0.003938 -0.002273 -0.011439 -0.002769 0.002089 0.000142 
+-0.002181 -0.004728 -0.001722 -0.007416 -0.015444 0.003090 
+-0.002286 0.002175 0.000696 -0.009362 0.007630 -0.022201 
+-0.003069 0.013274 -0.019802 0.002149 0.005085 -0.001031 
+0.000586 0.001460 0.003105 0.001778 -0.001150 0.001947 
+0.003305 -0.005752 -0.001115 0.000463 -0.008907 -0.001363 
+0.002492 -0.003982 -0.007974 0.002626 0.002957 -0.001323 
+0.003002 -0.006895 0.002100 -0.000502 -0.002846 -0.002734 
+-0.004610 -0.002520 -0.001718 -0.003368 -0.003203 -0.005659 
+-0.001644 -0.000818 -0.004721 -0.005253 -0.003315 -0.001428 
+-0.001347 -0.003462 -0.000600 -0.000251 -0.003030 0.009342 
+0.000862 0.000586 0.000384 0.003774 0.000967 -0.003280 
+0.006157 0.003568 -0.005736 0.006379 0.005950 -0.004760 
+0.006313 0.001633 -0.002607 0.004419 -0.001337 -0.001694 
+0.002423 0.001807 -0.001980 0.002274 0.002556 0.002897 
+-0.001248 0.005072 0.002980 -0.000769 -0.005012 -0.001836 
+-0.007329 -0.017932 -0.002552 0.000757 -0.023467 -0.001516 
+-0.000288 -0.032155 -0.005601 0.004425 -0.020836 -0.009806 
+-0.009050 0.041152 -0.036042 0.022925 0.003915 0.019625 
+-0.001500 -0.002673 -0.004305 -0.000453 0.006429 -0.000729 
+0.019548 0.030266 0.025951 2.259036 4.536145 3.644578 
+1.738889 5.216667 3.744444 0.942105 3.957895 4.178947 
+0.433498 2.039409 4.374384 -0.005556 1.277778 4.016667 
+0.008463 0.006153 0.031058 0.008301 0.008664 0.017897 
+0.016286 0.077429 -0.000857 -0.014103 0.011493 0.069861 
+-0.000301 -0.010203 0.021605 -0.009031 -0.003425 0.004926 
+0.008964 0.011420 -0.000123 0.003763 0.013172 -0.000270 
+-0.019056 -0.020899 0.003994 -0.019539 -0.011843 0.016699 
+-0.010607 -0.003120 -0.022222 -0.012539 -0.002539 -0.075392 
+-0.022752 -0.010439 0.004645 -0.024907 -0.004257 0.026027 
+0.003357 0.006469 0.005229 0.032209 0.013169 -0.009814 
+0.005231 -0.004769 -0.002772 -0.000054 0.005835 0.006415 
+-0.007330 0.018052 -0.000108 -0.025318 0.047179 -0.001258 
+-4.542857 6.019048 1.800000 -3.894737 3.382775 2.440191 
+-3.301205 0.972892 2.575301 -2.994667 -0.413333 2.413333 
+-2.576433 -1.171975 1.433121 -0.003259 0.003819 0.002122 
+-0.004786 0.002665 0.009565 -0.015772 -0.002037 0.022762 
+-0.026946 -0.005399 0.011741 -0.013179 -0.000295 -0.009387 
+-0.003535 0.000685 -0.006169 -0.002179 -0.006907 -0.003399 
+-0.005067 -0.012118 0.007232 -0.004078 0.000477 0.003177 
+0.002122 0.026818 -0.020880 0.009393 0.027348 -0.033583 
+0.007332 0.011272 -0.006662 0.005234 -0.007311 0.001480 
+0.005355 -0.001129 0.005517 0.002995 -0.001362 0.001699 
+0.000355 -0.000351 -0.001870 0.000553 -0.002374 -0.003145 
+-0.001588 0.000374 -0.000897 -0.001717 0.001075 0.001363 
+-0.001801 0.001282 0.001178 -0.005310 0.000838 0.001955 
+-0.000705 -0.007240 -0.001840 -0.002801 -0.007665 -0.000856 
+-0.001447 -0.000611 -0.002353 -0.001757 0.000688 0.000682 
+0.000149 0.002466 0.003284 0.001905 0.001762 0.003435 
+0.000860 0.001104 0.000876 0.005618 0.001651 -0.003142 
+0.004469 0.006276 -0.006537 0.003204 0.004995 -0.000923 
+0.005948 -0.000605 -0.001408 0.007478 0.002257 -0.005015 
+-0.000728 0.002197 -0.007358 0.007334 0.010704 0.000681 
+-0.002447 0.005170 -0.000790 -0.006871 -0.007290 0.004352 
+-0.011351 -0.005847 0.006191 0.001233 -0.000830 -0.003768 
+-0.000271 -0.028042 -0.012327 -0.013831 -0.046052 -0.007066 
+0.000159 0.029524 0.018095 0.055589 0.064050 0.019174 
+0.006896 0.031467 0.008470 0.003444 0.014546 -0.006272 
+1.956522 3.298137 2.950310 2.294118 4.571429 3.462185 
+2.584314 5.533333 3.537255 2.571429 5.487395 3.449580 
+1.976744 3.911628 3.479070 1.288043 2.173913 3.130435 
+0.009115 0.011203 0.020736 0.010362 0.009397 0.015040 
+0.064132 0.026601 0.051825 0.008088 -0.017659 0.092413 
+-0.000248 -0.011806 0.007715 0.000476 -0.015726 0.005654 
+-0.008715 0.003197 0.016060 0.005438 0.007179 0.015616 
+-0.002116 0.001580 0.012082 -0.000427 0.000020 0.005200 
+0.002371 -0.000050 -0.005485 0.001943 -0.001078 -0.019504 
+-0.012253 0.049711 -0.058414 0.001661 -0.032854 -0.003092 
+-0.001194 -0.034834 0.004857 0.004427 -0.012402 0.005322 
+0.000589 -0.000887 0.002857 -0.002697 0.004655 0.005457 
+-0.003012 0.024733 -0.000233 -0.031938 0.052382 0.012104 
+-2.434066 5.351648 1.423077 -2.557047 3.087248 1.711409 
+-2.310811 1.348649 1.427027 -2.127976 0.032738 0.625000 
+-0.003033 -0.003734 -0.017067 0.018188 -0.004694 -0.018486 
+0.003841 -0.009285 0.003713 -0.007666 -0.013224 0.000502 
+-0.008256 -0.012792 -0.006067 -0.012069 0.001539 -0.008392 
+-0.010812 0.005718 -0.005202 -0.005224 0.000495 0.003049 
+-0.004365 -0.003453 0.004913 -0.001381 0.011892 -0.002818 
+0.005432 0.029213 -0.012195 0.004084 0.017957 -0.015164 
+0.002183 -0.003404 0.004220 0.005461 -0.008706 0.006628 
+0.004654 -0.005469 0.003623 0.001986 -0.004837 -0.000268 
+0.000697 -0.003474 0.003207 -0.000588 0.001472 0.002048 
+-0.001298 0.005888 0.003462 -0.005498 0.003956 0.002414 
+-0.000904 0.002393 0.001797 0.000092 0.000092 0.000367 
+-0.000891 -0.001667 -0.001212 -0.003115 -0.004990 0.001122 
+-0.000544 -0.003422 0.003810 0.000441 -0.002302 0.003599 
+0.000823 -0.000508 0.003729 0.001455 -0.000760 0.000953 
+0.000972 0.000760 0.000056 0.003222 -0.001270 0.000333 
+0.003882 0.002790 -0.004544 -0.000089 0.001418 -0.000509 
+0.002203 -0.002108 -0.000439 0.004837 0.000036 -0.003853 
+0.007329 0.001606 -0.003755 0.002293 0.002603 -0.003584 
+-0.002676 0.002683 0.002410 -0.007598 0.001244 0.001115 
+-0.003641 -0.003543 0.003719 0.001846 -0.002367 -0.008181 
+0.005675 -0.023901 -0.011806 -0.008315 -0.030164 -0.000782 
+-0.007030 -0.034407 0.018750 0.099371 0.088050 0.007442 
+0.030939 0.045989 0.015205 0.001840 0.034642 -0.000446 
+1.920732 3.176829 2.658537 2.386973 4.291188 3.172414 
+2.925926 5.323232 3.138047 3.250871 5.735192 2.916376 
+3.174089 4.846154 3.117409 2.509901 2.797030 2.915842 
+0.009424 0.013540 0.010675 0.003309 0.001761 0.003512 
+0.000482 0.001325 -0.006330 0.008869 0.001899 -0.002754 
+-0.000413 -0.000508 -0.000984 -0.003877 -0.000557 -0.002065 
+-0.001602 -0.000759 -0.000668 0.004311 0.005078 0.004508 
+0.005341 0.005551 0.009374 0.000692 0.002484 0.006465 
+-0.002451 -0.000938 0.000317 -0.003601 -0.003365 -0.005324 
+0.016691 0.008211 -0.025151 0.004833 -0.000054 -0.011410 
+-0.001437 -0.000035 -0.002781 -0.000803 0.000490 -0.000721 
+-0.006014 0.001799 0.004906 -0.002921 0.000276 -0.000079 
+-0.019246 0.029358 0.007305 -0.945205 6.493151 0.589041 
+-1.662651 5.542169 1.068273 -1.852564 3.750000 1.233974 
+-0.014222 0.015114 0.008490 -0.001852 -0.004469 -0.008919 
+0.019927 -0.034764 -0.018963 4.387097 -6.913979 -0.913979 
+0.033341 -0.044046 -0.001069 0.022793 -0.024633 -0.009392 
+0.008391 -0.011385 -0.010887 -0.003823 0.001833 0.002798 
+-0.012615 0.007301 0.000739 -0.011710 -0.002611 0.007254 
+-0.015394 -0.009153 0.007934 -0.015419 0.003379 0.011385 
+-0.012656 0.016188 0.010016 -0.004450 0.007117 0.003316 
+0.003472 -0.006951 -0.009206 0.003145 -0.008741 0.001681 
+0.004350 -0.008097 0.005434 0.001097 -0.009000 0.007032 
+0.000261 -0.003901 0.005011 -0.001026 0.003078 -0.001217 
+-0.000551 0.001766 -0.004966 0.000394 0.002462 0.002639 
+-0.002403 0.002247 0.000784 -0.000588 -0.000406 -0.000561 
+0.002339 -0.001701 -0.000370 0.001166 -0.003109 -0.000617 
+0.000481 0.000701 0.000855 -0.000128 0.001217 0.006815 
+-0.001337 -0.000279 0.004374 0.001528 -0.000695 0.001999 
+-0.000939 0.000887 0.000073 -0.000347 0.000218 -0.000492 
+0.000421 0.003535 -0.003157 -0.001383 -0.001180 -0.005784 
+-0.000578 -0.003942 -0.004362 0.001943 -0.001426 -0.003032 
+0.002083 -0.000642 -0.002321 0.001294 0.000104 -0.000673 
+0.001044 0.003520 0.002919 0.002317 0.007500 0.005044 
+-0.000326 0.000905 0.001224 0.004393 -0.012279 -0.009988 
+-0.001664 -0.019903 -0.016461 -0.008718 -0.013608 -0.009425 
+-0.009637 -0.003799 -0.010258 0.025982 0.060446 0.016964 
+0.038460 0.051298 0.013435 0.010219 0.025902 0.014205 
+0.012597 0.024227 0.012518 2.119835 3.309917 2.979339 
+2.382716 4.256173 2.993827 2.601796 4.949102 2.709581 
+2.776978 4.791367 2.906475 2.239819 3.122172 2.895928 
+0.007715 0.015052 0.010190 0.002576 0.004154 -0.001305 
+0.000701 0.002459 -0.005465 0.005384 0.004374 -0.006487 
+0.007496 0.005265 -0.004881 -0.000990 0.001905 -0.006841 
+-0.012439 0.003406 -0.000666 -0.013789 0.005796 0.003169 
+-0.011839 0.006182 0.011481 -0.009742 0.003685 0.006213 
+-0.009238 -0.003254 -0.002944 -0.007216 -0.003864 -0.007506 
+-0.004903 -0.000051 -0.003678 -0.002050 -0.000034 0.000838 
+0.000062 0.000118 0.000856 -0.000285 0.000963 0.002733 
+-0.005155 0.000487 0.012414 -0.002090 0.003804 0.011382 
+-0.013486 0.028889 0.012856 -0.679803 6.625616 1.182266 
+-1.046099 6.312057 1.556738 -1.010563 4.302817 1.573944 
+0.000834 0.010831 0.007193 0.000858 -0.025519 -0.009784 
+2.994350 -4.683616 -1.237288 3.487013 -5.532467 -0.798701 
+3.185431 -4.483444 -1.066225 0.023614 -0.021216 -0.002423 
+0.002958 -0.001932 -0.002470 -0.010339 0.010622 0.011601 
+-0.010029 0.006837 0.007071 -0.005027 -0.004087 0.003550 
+-0.007735 0.003596 0.004105 -0.016202 0.013593 0.013135 
+-0.017930 0.016710 0.005598 -0.004478 -0.002833 0.007128 
+0.001509 -0.002457 -0.005075 0.000840 -0.003250 -0.001413 
+0.002271 -0.007803 0.003531 -0.002727 -0.010301 0.005619 
+-0.002770 -0.001017 0.003231 -0.003181 0.007039 -0.005011 
+0.001044 0.000014 0.000226 -0.001329 0.006961 -0.000145 
+0.000487 0.001977 0.000777 -0.000620 -0.001955 -0.000123 
+0.000100 -0.004891 0.001608 -0.000266 -0.005702 -0.002918 
+0.000203 0.000024 0.001622 -0.000630 0.001843 0.002419 
+-0.000985 -0.000912 0.000949 0.001640 -0.002981 -0.000006 
+0.001851 0.001626 -0.006723 0.003256 0.003921 -0.004143 
+-0.000370 0.001459 -0.002114 -0.000003 0.000081 -0.005462 
+-0.001890 0.003001 -0.007643 0.009229 0.000387 -0.007190 
+0.003188 0.000376 -0.006077 0.001370 0.002223 -0.000868 
+0.000540 0.008214 0.002665 0.004120 0.008074 0.004539 
+0.002126 0.003131 -0.001220 -0.005705 -0.009527 -0.011844 
+-0.014586 -0.014132 -0.006440 -0.003275 -0.010179 -0.000468 
+-0.015719 -0.011267 -0.010534 -0.065938 -0.028420 0.000306 
+0.050080 0.003127 0.071612 0.018467 0.028660 0.011873 
+0.015714 0.027135 -0.000313 1.262887 2.536083 2.324742 
+1.413907 3.483444 2.466887 1.543807 4.350453 2.066465 
+1.531136 4.567766 2.058608 1.105769 3.312500 2.317308 
+0.005940 0.016904 0.012304 0.001360 0.007093 0.002887 
+0.000272 0.006668 -0.000495 0.002451 0.006975 0.000483 
+0.004157 0.003815 0.001395 0.002048 0.000723 0.000726 
+-0.002368 0.003330 -0.002011 -0.007799 0.004366 0.001257 
+-0.009107 0.001198 0.009889 -0.004904 -0.000189 0.011251 
+-0.007292 -0.000794 0.003265 -0.005731 -0.000844 -0.003222 
+-0.003486 0.002855 -0.006916 -0.002071 0.004213 -0.006579 
+-0.002291 0.003888 -0.004521 -0.003057 -0.006404 0.001834 
+-0.014889 -0.008784 0.001204 -0.005810 -0.012739 0.007781 
+-0.004623 0.038088 0.010415 -0.121569 6.329412 1.529412 
+-0.132258 6.077419 1.780645 0.188235 4.125490 1.741176 
+0.013891 -0.003311 0.003194 2.333333 -3.731602 -0.753247 
+3.072034 -4.271186 -0.813559 3.969388 -4.250000 -1.204082 
+3.791667 -4.145833 -1.701389 0.023184 -0.010851 -0.006341 
+-0.010315 0.000515 -0.002763 -0.010929 0.013031 0.001349 
+-0.006432 0.004405 0.004746 -0.001031 0.002232 0.000643 
+-0.005469 0.010461 -0.009745 -0.011800 0.007119 0.001516 
+-0.000979 -0.008257 0.003311 0.003856 -0.008848 0.003182 
+0.002130 -0.004379 -0.000214 0.000312 -0.002177 -0.002628 
+-0.000515 -0.001679 -0.001010 -0.002213 0.001064 0.000922 
+-0.002226 0.003857 0.001082 -0.000673 0.005548 -0.003431 
+0.000700 -0.001545 -0.004918 -0.002744 0.003569 0.000909 
+0.001324 0.007784 0.001953 0.000993 0.000281 -0.000123 
+-0.000290 -0.008790 0.001863 0.002114 -0.007149 -0.001024 
+-0.000743 -0.000892 -0.003320 -0.007091 -0.003244 -0.002103 
+0.000353 -0.004695 0.002144 0.001051 -0.008939 0.002306 
+0.004785 0.000354 -0.006270 -0.000354 -0.001793 -0.002746 
+0.000741 -0.001710 -0.000406 0.001202 0.003176 -0.003091 
+0.010608 0.003868 -0.006540 0.007646 -0.002619 -0.005195 
+-0.001867 -0.001128 -0.006729 0.001650 0.001248 -0.003345 
+0.004077 0.004423 0.001856 0.003467 0.003088 0.004164 
+0.000232 0.000514 -0.000952 -0.001452 -0.003402 -0.009803 
+0.001084 -0.001176 -0.018384 0.008867 0.001272 -0.016678 
+0.004910 -0.002249 -0.010938 0.000439 -0.003341 -0.008382 
+-0.000578 -0.005909 -0.008398 0.006106 -0.011581 0.010496 
+-0.001162 0.000097 0.008390 0.008426 0.026494 0.011783 
+0.352941 2.974790 1.298319 0.285199 3.906137 1.342960 
+0.097872 4.310638 1.438298 -0.237805 3.512195 1.682927 
+-0.002552 0.017036 0.009852 -0.001601 0.004377 0.003466 
+-0.003890 0.003723 0.002140 -0.002110 0.008320 0.005870 
+0.004090 0.006436 0.003129 0.003160 -0.001658 0.001022 
+0.008333 0.005729 -0.006803 0.011173 0.012166 -0.010337 
+0.006371 0.005484 -0.003182 -0.000340 -0.003049 -0.000201 
+0.000765 -0.003891 -0.000947 0.002340 0.002418 -0.000544 
+0.002094 0.003673 -0.001141 0.002068 0.003314 -0.001661 
+0.001219 0.008815 -0.009714 -0.005503 0.006753 -0.005416 
+-0.006458 -0.013144 -0.003751 0.003131 0.002982 -0.003070 
+0.413333 5.066667 1.013333 0.524528 5.966038 1.709434 
+0.563518 5.006515 1.872964 0.006225 0.027123 0.011426 
+0.016095 -0.020868 -0.003205 2.249084 -4.201465 -0.347985 
+3.125926 -4.085185 -0.411111 3.942584 -3.775120 -0.842105 
+3.838235 -3.500000 -1.551471 0.018797 -0.017377 -0.012243 
+-0.001752 0.004108 -0.003959 -0.002432 0.009903 -0.006137 
+-0.005685 0.012480 -0.003238 -0.002622 0.010187 -0.007871 
+-0.008164 0.010152 -0.013044 -0.004762 0.027003 -0.009237 
+-0.005910 0.016934 -0.006017 -0.000460 0.001998 0.000177 
+-0.000009 -0.007500 -0.000034 -0.002832 -0.005820 -0.002289 
+0.001150 -0.002618 -0.002251 0.001890 -0.000173 -0.000296 
+-0.001433 0.000195 0.000627 -0.006630 -0.002369 0.005269 
+-0.007536 0.002878 0.004746 -0.007188 0.001461 0.001472 
+-0.001963 0.004557 0.001183 -0.000080 0.001432 -0.000410 
+0.000392 -0.001441 0.000224 -0.001234 0.000408 -0.002401 
+-0.003974 0.002342 -0.005238 -0.005037 0.002065 -0.000885 
+-0.002194 -0.004179 0.002292 -0.005038 -0.006165 -0.000033 
+-0.001861 -0.001492 -0.004735 -0.000548 -0.001328 -0.002068 
+0.001844 0.000500 0.000613 0.004372 0.003175 0.001319 
+0.004401 0.005181 0.001590 0.004510 0.003396 0.000543 
+0.004297 0.000498 -0.005606 0.004014 0.001973 -0.000007 
+0.005475 0.000992 -0.000761 0.006190 0.001369 -0.000960 
+0.004846 -0.000142 -0.000625 0.002101 0.002451 -0.001440 
+0.001308 0.000719 -0.002538 0.003955 0.000801 -0.005358 
+0.006320 -0.002425 -0.007823 0.005714 -0.001589 -0.003046 
+0.001981 -0.000277 -0.002379 -0.011289 -0.012717 -0.010213 
+0.020579 -0.063088 0.013824 0.000602 0.005409 0.002850 
+0.003496 0.031788 0.020665 -0.574257 3.584158 1.059406 
+-0.646739 3.679348 0.853261 -0.007940 0.031349 0.005178 
+-0.005358 0.010024 0.002193 0.005820 -0.002924 -0.004565 
+0.006538 0.004886 0.000241 0.004896 0.012330 0.000524 
+0.000873 -0.001573 0.005208 -0.002994 -0.001773 0.004053 
+-0.000804 0.000689 -0.000315 0.001184 0.005002 -0.003053 
+0.003110 0.003916 -0.002564 0.003478 0.000286 -0.000206 
+0.003836 -0.000002 -0.002954 0.005521 0.000504 -0.002532 
+0.003948 0.001591 0.000011 0.003598 0.004475 -0.000444 
+0.002512 0.009305 -0.007096 -0.004643 0.000534 -0.005734 
+-0.007984 -0.020141 0.000216 0.003155 0.015686 -0.001916 
+0.500000 5.902985 1.171642 0.832579 5.819005 1.927602 
+0.835391 4.209877 1.452675 0.003756 0.003873 0.001301 
+1.563786 -3.855967 0.139918 2.585859 -4.350168 0.323232 
+3.250909 -4.021818 0.010909 3.989691 -3.824742 -0.572165 
+0.022836 -0.034756 -0.018115 0.004261 -0.009167 -0.008996 
+-0.003623 0.010956 -0.002231 -0.005922 0.007857 -0.013716 
+-0.015466 0.015447 -0.015878 -0.018143 0.020227 -0.022998 
+-0.014336 0.012499 -0.013968 -0.004425 0.014365 0.012731 
+-0.000349 0.017027 0.007401 0.000359 0.005797 0.001293 
+-0.001347 -0.006114 -0.000770 -0.003441 -0.009214 -0.002544 
+-0.000384 0.000490 0.000417 -0.007853 0.000236 -0.001576 
+-0.003511 -0.001567 0.001618 -0.005107 -0.001801 0.006290 
+-0.004881 0.002355 0.009425 -0.002244 0.002923 0.005914 
+0.000945 0.001986 -0.000831 0.003522 -0.000600 -0.001836 
+-0.000116 0.001042 -0.006017 0.003043 0.003574 -0.005011 
+0.003946 0.000729 -0.005190 0.000000 0.000107 -0.000058 
+-0.003829 -0.006338 0.000560 -0.005039 -0.005181 -0.001243 
+0.003341 -0.004121 -0.002265 0.007282 -0.005131 -0.002102 
+0.007891 0.001447 -0.006206 0.004231 0.003830 -0.007741 
+0.006583 0.004965 0.001296 0.005700 0.005056 0.000092 
+-0.000071 0.006382 -0.006500 -0.002670 -0.001136 -0.001523 
+-0.002247 -0.004140 -0.003860 0.002636 -0.003180 -0.004373 
+0.000917 0.000646 -0.000501 0.000338 0.000979 0.003672 
+-0.002443 0.002738 0.003625 -0.000160 -0.000089 0.000476 
+0.002172 0.002058 -0.002783 0.003672 0.003173 -0.004260 
+0.006134 0.005945 0.000978 0.008312 0.003823 -0.003155 
+-0.001213 -0.007747 -0.011489 0.000983 -0.057404 -0.015063 
+-0.008480 0.009262 0.009219 -0.006550 0.025745 0.018060 
+-0.005636 0.022138 0.012032 -0.006209 0.017691 0.005197 
+-0.003378 0.006490 -0.000752 0.013060 -0.008715 -0.015808 
+0.004955 0.003353 -0.008889 0.004189 0.008238 -0.001975 
+-0.001322 0.002943 0.000743 0.001072 -0.002144 0.001840 
+-0.005567 -0.005564 -0.000179 -0.004067 -0.000465 0.001240 
+-0.001773 0.000426 -0.000213 0.000465 0.000390 0.001762 
+-0.000615 -0.005190 -0.000096 0.001277 -0.000532 -0.000639 
+-0.001270 -0.001403 0.001954 0.004557 0.004813 0.000642 
+0.000475 0.003510 0.001466 -0.004672 -0.008337 0.001460 
+-0.014432 -0.017733 0.007545 -0.007360 0.007659 -0.005950 
+0.166667 6.296296 1.259259 0.746835 5.715190 1.898734 
+0.008583 0.026145 0.011453 0.001047 -0.023267 -0.002647 
+1.996047 -4.940711 1.059289 2.941781 -4.291096 0.979452 
+3.398406 -3.625498 0.362550 3.347826 -3.434783 -0.571429 
+0.009102 -0.020185 -0.011166 -0.016677 0.001918 -0.006934 
+0.000862 0.011462 -0.005013 -0.006354 0.007206 -0.003702 
+-0.012770 0.010528 -0.009937 -0.021577 0.027919 -0.015698 
+0.020305 0.011645 -0.003347 -0.009507 0.012150 0.010038 
+0.003288 -0.002176 0.002940 0.004227 -0.010869 -0.001336 
+0.002918 -0.011306 -0.000664 0.001343 -0.006495 0.000411 
+-0.000170 -0.001637 -0.000569 -0.001229 0.000473 0.000174 
+0.000037 -0.000591 0.000973 0.000584 -0.000307 -0.000316 
+0.002775 0.002153 0.000143 0.001706 0.001507 -0.005394 
+0.002864 0.008155 -0.003305 0.003502 0.003110 -0.000857 
+0.000218 0.000084 -0.000437 -0.004605 -0.003947 0.001619 
+-0.005313 -0.005694 0.000948 -0.004470 -0.004591 -0.000604 
+-0.002213 -0.003610 0.000679 -0.002088 -0.003494 0.000849 
+0.001388 -0.008085 0.007184 0.000868 -0.003187 0.000857 
+0.004430 0.000687 -0.007051 0.001005 0.005385 -0.003734 
+-0.003218 0.000053 -0.001538 -0.002545 -0.003516 0.001419 
+-0.000974 -0.002627 0.001548 0.000099 -0.001516 -0.002671 
+0.002021 -0.000861 -0.004453 0.002767 -0.000031 -0.001133 
+0.001930 -0.000968 0.002420 0.000836 0.000656 0.001259 
+0.004198 0.004480 -0.001197 0.005346 0.006080 -0.003103 
+0.000398 0.006745 -0.001104 -0.002872 0.004909 -0.001368 
+-0.004551 0.005865 -0.001729 -0.001066 0.008712 -0.001611 
+0.001446 0.000221 -0.000522 -0.007820 -0.009187 -0.008763 
+-0.003031 -0.065526 0.004691 -0.009402 -0.006338 -0.000954 
+-0.007303 0.009760 0.006863 -0.004386 0.009435 0.007760 
+0.007926 0.010723 -0.003019 0.011182 -0.007736 0.002008 
+0.001911 -0.007969 0.004604 -0.001113 0.000038 -0.000930 
+-0.001838 0.000233 -0.000697 0.000190 -0.003825 -0.001577 
+-0.002494 -0.004299 -0.001525 -0.009059 0.000498 0.005138 
+-0.006642 -0.000007 0.008837 -0.002877 -0.000005 0.005775 
+-0.000349 -0.007861 0.004144 -0.007552 -0.010147 -0.001180 
+0.001275 -0.003031 0.000522 0.002345 0.002490 0.003717 
+0.002985 0.003262 0.001222 0.002945 -0.004033 -0.004152 
+-0.002747 -0.004609 -0.004539 0.006932 0.006560 0.001230 
+0.016425 0.041228 -0.015709 0.025266 0.028968 0.015669 
+0.007037 0.012821 -0.002388 0.004892 -0.029133 0.009040 
+1.845238 -4.337302 1.567460 2.703846 -3.723077 1.361538 
+3.223301 -3.072815 0.533981 0.016809 -0.024993 -0.005569 
+-0.009502 -0.022056 -0.005766 -0.017944 -0.002005 -0.002571 
+-0.002148 0.005486 0.000791 -0.001468 0.003474 0.002044 
+-0.003486 0.012504 0.001306 -0.007437 0.005567 -0.011917 
+-0.007201 0.003252 -0.004082 -0.000746 0.000162 -0.000470 
+0.001317 -0.000752 -0.000841 0.003237 -0.005332 -0.004809 
+0.000351 -0.007662 -0.004665 -0.003021 0.000528 -0.001957 
+-0.004628 0.006170 0.000649 -0.003856 0.003710 0.002255 
+0.000532 0.000302 0.000710 -0.000348 -0.000443 -0.000951 
+0.005268 -0.002700 -0.005531 0.003851 0.000151 -0.006997 
+0.000678 -0.000866 -0.004367 -0.004111 0.001444 -0.001222 
+-0.002387 0.001766 -0.000311 0.000960 -0.005596 0.001522 
+0.000702 -0.011074 0.005462 -0.001907 0.000636 0.004884 
+-0.000545 -0.001249 0.002434 0.003920 0.003049 -0.002218 
+0.000583 -0.001167 0.000917 0.000559 0.002965 -0.000449 
+0.000333 0.004888 -0.000296 0.000527 0.001735 0.001275 
+-0.003781 0.001932 0.000055 -0.000038 -0.005752 -0.001504 
+-0.003100 -0.007686 -0.001406 -0.002281 -0.000612 -0.000972 
+0.001497 -0.002255 -0.001637 0.005100 -0.002694 -0.001621 
+0.004884 0.003588 -0.004480 0.007636 0.004040 -0.002237 
+0.002650 -0.000021 -0.004198 0.002124 0.003197 -0.002996 
+0.000193 -0.001876 -0.000267 0.000572 -0.002796 -0.000496 
+-0.000346 0.002897 0.002133 0.001585 0.008967 -0.008378 
+0.003331 0.014472 -0.002049 0.004734 0.003939 -0.000580 
+-0.000876 -0.007877 -0.002249 -0.010642 -0.018662 0.008069 
+-0.007432 -0.004046 0.005465 -0.006284 0.008790 0.006297 
+-0.000004 0.010500 0.005774 0.008358 0.006550 0.003892 
+0.008244 -0.002105 0.002825 0.001883 -0.006118 0.000247 
+-0.001516 -0.006544 -0.001066 -0.005892 -0.005534 -0.000771 
+-0.002084 -0.004806 0.010100 -0.001209 0.001218 -0.000687 
+-0.008284 0.001052 0.003659 -0.003986 -0.001948 0.007421 
+-0.000028 -0.009792 0.006124 0.001994 -0.009026 -0.001061 
+0.003032 -0.002167 0.000475 0.001006 0.001358 0.002925 
+-0.000118 0.001724 0.000611 -0.000793 -0.002043 -0.000535 
+0.002072 -0.002893 -0.002655 0.003845 0.011651 -0.006728 
+0.004497 0.039611 -0.018798 0.014970 0.025616 -0.002188 
+0.002217 0.000118 0.006984 0.006657 -0.022135 0.012849 
+1.549550 -2.927928 1.545045 2.448781 -2.526829 1.375610 
+0.026748 -0.020988 -0.003080 0.012513 -0.007687 -0.006338 
+-0.008894 -0.008251 -0.002843 0.003129 -0.002505 0.002972 
+-0.002859 0.004310 0.010807 -0.000831 0.016266 0.001292 
+0.003581 -0.000052 -0.003019 -0.006308 0.003551 -0.001113 
+-0.002152 0.001073 0.002719 0.001029 -0.000081 0.002547 
+-0.004032 -0.001268 -0.001166 -0.008341 -0.005665 -0.000169 
+-0.007122 0.002861 0.001580 -0.005348 0.009023 0.001877 
+-0.003704 0.009524 -0.000080 -0.005683 0.003769 -0.001421 
+-0.000604 -0.003022 -0.004524 -0.006716 -0.003349 -0.004728 
+-0.002160 -0.000088 -0.001606 0.004513 0.000265 0.000531 
+0.004944 0.001264 -0.002299 0.003286 0.003329 -0.001512 
+-0.001204 0.000492 -0.001642 0.001314 -0.003726 -0.001379 
+0.000602 -0.006710 -0.001395 -0.002662 -0.006661 0.002515 
+-0.001431 -0.002328 -0.000157 0.003023 -0.002199 -0.001031 
+0.005961 0.002858 -0.004579 -0.000300 0.000460 -0.001605 
+0.001570 0.005022 0.003187 0.000653 0.001307 -0.000961 
+-0.000798 0.000292 -0.000122 -0.004172 0.001233 -0.003507 
+-0.005177 -0.004469 -0.006594 -0.001518 -0.004019 -0.003930 
+0.001886 0.002952 -0.000484 0.002591 0.003041 -0.004280 
+0.002150 0.001344 -0.002480 -0.000981 0.001472 -0.002520 
+-0.000697 -0.000212 -0.002406 0.004037 0.000801 -0.001635 
+0.000541 -0.000749 0.001499 0.000618 -0.003182 0.001679 
+-0.001257 -0.000378 -0.002186 0.002997 0.003619 -0.003719 
+0.002843 0.007165 -0.001879 0.004784 0.004845 -0.001485 
+0.005078 0.001439 0.000252 0.001245 -0.003783 -0.003158 
+0.000375 -0.000485 -0.001430 -0.002330 -0.004672 0.010113 
+-0.006370 0.002143 0.009627 -0.002724 0.000321 0.006217 
+-0.000552 0.003755 0.001440 0.001159 -0.000213 0.001063 
+-0.000473 -0.007133 0.000109 -0.004681 -0.009320 0.003732 
+-0.005264 -0.003239 0.003239 -0.002546 0.001194 0.001844 
+0.000543 0.000043 -0.000220 0.000765 -0.004935 -0.004180 
+0.003244 -0.010673 -0.002757 0.001703 -0.009433 -0.002581 
+0.001370 -0.005506 -0.002299 0.000213 -0.001462 -0.001266 
+-0.003006 0.000846 0.000444 -0.005767 0.000036 0.001855 
+-0.001220 -0.001609 0.001541 0.004693 0.005392 -0.010447 
+0.017470 0.021205 -0.010482 0.002419 0.018742 -0.002320 
+0.007813 -0.000621 0.008386 0.008148 -0.015522 0.010607 
+0.011141 -0.021112 0.010158 0.014387 -0.017239 0.004509 
+0.008691 -0.004476 -0.001548 -0.002121 0.002680 -0.003149 
+-0.001163 -0.003780 -0.002175 0.004184 -0.007249 0.006248 
+0.002490 0.012633 -0.000527 0.001210 0.003943 -0.016680 
+-0.006522 0.009287 -0.013261 -0.002049 0.002042 -0.002294 
+0.001562 -0.001103 0.002958 -0.000192 -0.007231 0.002423 
+0.002157 -0.004688 0.003715 -0.001522 -0.006087 0.002202 
+-0.005080 0.001446 0.001647 -0.002556 0.003491 -0.003461 
+0.008023 0.008694 -0.006011 0.005970 0.005325 -0.009683 
+0.001844 -0.004426 -0.007984 0.001567 -0.001377 -0.000544 
+-0.003072 0.001417 0.004218 -0.001119 0.000985 0.003249 
+0.003147 0.002232 -0.003840 0.005106 -0.001149 -0.008297 
+-0.000089 0.000752 -0.006939 -0.000350 0.000402 -0.000057 
+0.004317 0.002049 0.000131 0.003748 0.000632 -0.000116 
+-0.001201 -0.002897 -0.002821 -0.002131 -0.001669 -0.003441 
+0.000971 -0.001100 0.003182 -0.002167 -0.000869 0.005202 
+-0.001165 0.001344 0.003529 0.000515 -0.000445 -0.001320 
+0.006955 -0.000279 -0.005951 0.002538 0.003630 -0.002705 
+-0.002128 -0.000412 -0.001030 -0.001006 -0.002491 0.000709 
+-0.000258 -0.000945 -0.003750 0.000605 0.003027 -0.004696 
+0.001021 0.004251 -0.003782 -0.000425 0.002605 -0.002651 
+-0.002121 0.000113 -0.002694 0.000148 -0.000301 0.000045 
+0.004109 0.001705 -0.008217 -0.001070 0.003306 -0.006778 
+-0.000871 0.002589 -0.000908 -0.007108 0.000289 0.012015 
+-0.010307 -0.004218 0.004652 -0.001991 -0.001770 -0.000973 
+0.000123 -0.003032 -0.004601 0.000586 -0.000734 -0.002614 
+-0.002103 -0.000363 0.002870 -0.000540 -0.002032 0.002748 
+0.000930 -0.001860 -0.001628 -0.000896 -0.003217 -0.002857 
+-0.002925 -0.004565 -0.002949 -0.004146 -0.003231 -0.000867 
+0.002686 -0.003143 0.000940 0.005946 -0.002298 -0.000762 
+0.004898 0.000676 0.001510 0.001529 0.000178 0.003450 
+0.000147 -0.000228 -0.000612 0.003555 -0.000646 -0.004524 
+0.002500 -0.002364 -0.004182 -0.000188 -0.002850 -0.003632 
+0.000079 -0.004240 -0.003116 0.000228 -0.001540 -0.000633 
+-0.001167 0.003268 0.000428 -0.004190 0.003469 0.002669 
+-0.000603 0.001195 0.001565 0.001477 0.002481 -0.008635 
+0.011122 0.007543 -0.017529 -0.001459 0.019956 -0.008686 
+0.003684 0.012918 -0.004206 0.006753 -0.000174 0.000957 
+0.007402 -0.009979 0.003380 0.001607 -0.011668 0.003592 
+-0.012428 -0.006834 0.005903 -0.011150 -0.007821 -0.001263 
+-0.001102 -0.006383 -0.001394 0.008612 -0.011962 0.003372 
+0.005515 -0.004036 0.002551 -0.003738 0.006006 -0.003405 
+-0.005169 0.006589 -0.000746 -0.001731 -0.000714 0.002303 
+0.003504 -0.004479 -0.000095 0.005956 -0.004846 -0.003968 
+0.006177 -0.000181 -0.004506 -0.000982 0.004516 -0.001080 
+-0.001710 0.003195 -0.001326 0.001508 0.003249 -0.005416 
+-0.001989 0.003969 -0.002484 0.004706 -0.000497 -0.007575 
+0.003328 -0.003436 -0.001710 0.002590 -0.001727 0.001511 
+-0.001664 -0.002750 0.005437 0.000297 -0.000793 0.001339 
+0.000275 -0.001571 -0.002945 -0.000621 -0.000450 -0.002548 
+-0.002986 0.001808 -0.000282 -0.004436 0.000037 -0.000006 
+-0.000246 -0.000747 0.000363 0.002007 -0.003221 0.000057 
+-0.000090 -0.003418 -0.001523 0.000850 -0.001179 -0.000118 
+-0.001134 -0.001715 0.001450 0.000575 -0.000314 0.003434 
+0.002705 -0.001966 -0.000150 0.001677 -0.005224 -0.002829 
+0.010000 0.001368 -0.010943 -0.000259 0.000388 -0.008407 
+0.003543 0.004318 -0.003477 0.002625 0.001607 -0.000723 
+0.004140 0.003401 -0.001216 0.006191 0.002996 -0.000726 
+0.002148 0.000011 -0.000110 -0.003506 -0.003099 -0.002428 
+-0.003565 -0.004663 -0.002188 -0.000316 -0.000105 -0.004135 
+0.000576 0.007327 -0.003835 0.000934 0.009703 -0.001203 
+-0.000178 0.005079 0.000836 -0.003242 0.002561 -0.000561 
+-0.004175 -0.006937 -0.000171 -0.001512 0.000858 -0.001672 
+-0.000541 0.001056 0.000150 -0.000149 0.000093 -0.000211 
+0.000442 -0.003391 -0.001176 0.000416 0.001385 -0.007344 
+0.001093 0.009091 -0.014758 0.002443 0.004015 -0.015246 
+0.002994 0.006427 -0.012969 -0.000351 0.003621 -0.005980 
+-0.001392 -0.000543 -0.000651 -0.000775 -0.001871 -0.000562 
+-0.002891 0.000382 -0.000410 -0.001997 0.000703 0.000056 
+0.000932 -0.000146 -0.003674 -0.002396 0.004844 -0.001059 
+-0.001066 0.000244 -0.000252 -0.000206 -0.001699 -0.001106 
+0.000059 -0.001756 -0.000631 -0.000445 -0.001794 0.000945 
+-0.000799 -0.002024 0.003053 -0.000794 -0.001543 0.003876 
+-0.000041 -0.000041 0.001879 -0.002617 0.003403 -0.003001 
+-0.009892 0.008994 -0.007598 -0.006088 0.002796 -0.019736 
+-0.006613 0.013268 -0.009163 -0.001828 0.003522 -0.001050 
+0.000140 -0.000388 0.000036 -0.003661 -0.001750 -0.000130 
+-0.008678 0.001136 0.002363 -0.004249 -0.009574 0.002435 
+0.001989 -0.006340 0.006167 0.006870 -0.003079 0.007516 
+0.003162 -0.005267 0.001736 -0.001292 -0.003688 0.002884 
+-0.005758 -0.004266 0.003305 -0.006057 0.001859 -0.001492 
+-0.000182 -0.000214 0.000421 0.001909 -0.002760 -0.000177 
+0.001994 0.000962 0.003819 -0.003730 0.000441 0.005484 
+-0.002702 0.001849 0.001330 -0.001393 -0.003180 -0.001590 
+-0.000342 -0.005113 -0.006682 0.000985 -0.004525 -0.002592 
+0.000915 -0.003355 0.002896 0.003970 -0.001820 0.001398 
+0.002980 -0.004579 0.000777 0.000977 -0.004218 0.000051 
+0.000975 -0.002185 -0.000420 -0.001094 -0.002452 -0.000525 
+-0.005000 -0.003950 0.002127 -0.004016 -0.001828 0.003321 
+-0.005568 -0.000737 -0.000746 -0.003526 0.001709 -0.004621 
+-0.003164 0.003878 -0.004082 0.003212 0.005086 -0.002906 
+0.000430 -0.001535 -0.009237 -0.000744 0.003213 -0.007708 
+0.010089 0.002196 -0.006589 0.002627 -0.002269 -0.004596 
+0.002381 -0.001036 -0.001167 0.000486 -0.000467 0.001335 
+0.001245 0.002372 -0.000389 -0.000793 0.005260 0.002990 
+0.000559 0.000711 -0.001483 -0.002134 -0.003062 0.001294 
+-0.003416 -0.010417 -0.001161 0.000106 -0.001800 -0.010694 
+0.009274 0.000744 -0.011924 0.007730 0.007899 -0.011299 
+0.003925 -0.000451 -0.001672 0.000672 0.005188 0.006336 
+0.001446 0.004601 0.002760 -0.000016 0.002950 -0.003640 
+-0.001303 -0.001246 -0.004235 0.001086 -0.004361 -0.003375 
+-0.000772 -0.005182 -0.003649 -0.000046 0.000232 -0.000232 
+0.000140 0.003557 -0.005406 0.001677 0.005096 -0.006137 
+-0.000476 0.005609 -0.009232 0.002112 -0.001084 -0.010340 
+-0.002689 0.001097 0.006229 -0.004383 -0.001309 0.009674 
+-0.007115 -0.009036 0.008058 -0.006052 -0.012135 0.002380 
+-0.004914 -0.006315 -0.000985 0.001678 0.000227 -0.000308 
+0.005667 0.002886 0.001237 -0.001162 0.001868 0.000135 
+-0.005857 0.001140 -0.002537 -0.004823 0.000855 -0.000225 
+-0.000470 0.002267 0.001069 -0.001059 -0.002047 -0.000210 
+-0.005407 -0.010689 0.003199 -0.003543 -0.008640 0.009507 
+-0.001456 0.000435 0.002163 -0.002769 0.000611 -0.004975 
+-0.003347 -0.000728 -0.005301 -0.000121 -0.000403 -0.006879 
+-0.006029 0.004771 -0.006557 -0.006314 0.003028 -0.003522 
+-0.005758 0.000678 -0.001377 -0.007444 -0.003559 0.002068 
+-0.000416 -0.002743 0.007649 0.000192 -0.002958 0.005167 
+0.000917 -0.004190 -0.000667 0.005850 0.000820 -0.000766 
+0.005290 -0.003023 0.003431 -0.000795 -0.006297 0.005227 
+-0.007685 -0.003820 0.000978 -0.002985 0.002088 0.004188 
+-0.005840 0.003522 0.003040 -0.003438 0.004678 0.003878 
+0.000541 0.001498 0.004301 0.004122 -0.000874 0.003439 
+0.000962 -0.003667 -0.000641 -0.000366 -0.004918 0.001466 
+-0.001432 -0.001074 -0.003878 -0.006441 -0.002249 -0.003459 
+0.001183 -0.000495 -0.000506 0.002036 -0.001873 0.001181 
+0.010952 0.006659 -0.001743 0.005641 0.005893 -0.004176 
+-0.000513 0.001615 -0.001702 0.000251 -0.000834 0.003417 
+-0.002846 -0.007362 0.007718 -0.004512 -0.010493 0.001647 
+-0.004116 -0.005618 -0.003078 -0.003352 -0.001879 -0.001072 
+0.000647 0.000694 -0.000239 0.001410 -0.000384 0.000284 
+0.002572 -0.000158 -0.000406 0.002771 0.000031 -0.001333 
+0.000512 0.000149 0.000194 -0.000943 -0.000118 0.001774 
+-0.001342 -0.000375 0.000086 -0.000635 0.001022 0.001108 
+0.000016 0.003209 0.001932 0.000831 0.002742 0.002094 
+0.000095 -0.000459 0.000016 -0.001662 -0.003120 -0.000969 
+-0.003589 -0.003684 -0.003880 -0.003883 -0.001902 -0.003625 
+0.003252 -0.001694 -0.004590 0.004533 0.002451 -0.004162 
+0.000548 -0.000323 -0.002210 0.000946 -0.001478 -0.000481 
+-0.000162 0.000938 0.000594 0.002538 0.007103 0.001315 
+-0.000296 0.003973 -0.004425 -0.000215 0.000092 -0.003282 
+0.001321 0.000709 -0.004543 0.000895 0.002747 -0.006183 
+-0.000869 0.010290 -0.007936 -0.007475 0.010579 -0.003942 
+-0.003134 0.006819 -0.001778 -0.014494 -0.001337 -0.052197 
+-0.047812 -0.027903 0.022618 -0.023311 -0.020296 0.016199 
+-0.016688 -0.016139 0.008127 -0.004596 -0.007235 0.001242 
+0.000949 0.001175 0.000614 0.005796 0.000650 0.001332 
+0.003593 0.000425 0.001293 -0.000653 0.000136 0.000436 
+-0.003013 0.000042 -0.002877 -0.002237 -0.000465 -0.001086 
+-0.001178 -0.000137 0.000114 -0.004063 -0.005235 -0.001458 
+-0.001651 -0.014027 0.004434 0.003030 -0.007726 0.003284 
+0.006253 0.000552 -0.008515 0.010812 0.001213 -0.022120 
+0.016907 0.007316 -0.013603 0.001197 0.002351 -0.000392 
+-0.002966 0.001462 -0.002780 -0.007816 0.000187 -0.002321 
+-0.009678 -0.004182 0.001332 -0.006317 -0.006269 0.008183 
+-0.001957 -0.003059 0.006008 -0.001685 0.000188 0.000098 
+0.003771 0.003559 -0.000553 0.003836 -0.000881 0.002956 
+0.003968 -0.003082 0.004392 0.000702 -0.004665 0.009206 
+-0.001297 -0.008793 0.010427 -0.005090 -0.005681 0.011658 
+-0.001445 0.000103 0.006814 -0.001604 0.001530 -0.001199 
+0.000284 -0.000727 -0.005567 0.007439 0.000438 -0.004922 
+0.004614 0.000363 -0.003618 -0.003527 -0.001649 -0.003289 
+-0.004000 -0.004440 -0.003900 -0.001907 -0.002968 -0.003171 
+-0.000759 0.000490 -0.000563 0.001305 -0.000102 0.001275 
+0.000092 -0.000487 0.000648 -0.002088 -0.001832 -0.002685 
+-0.001665 -0.000890 -0.004859 0.001887 0.000474 -0.004958 
+0.001864 0.000772 0.000603 -0.000994 -0.002823 -0.000709 
+-0.003366 -0.003790 -0.000267 -0.005147 -0.000857 -0.000469 
+-0.006229 -0.000627 -0.003161 -0.004751 0.002015 -0.003394 
+-0.000027 0.000772 -0.000125 0.001651 -0.000237 -0.000724 
+0.000000 -0.000153 -0.001374 -0.000443 0.000544 -0.000263 
+-0.001777 0.000219 -0.001186 -0.001440 -0.000509 -0.000953 
+-0.000324 0.000141 0.000183 -0.000278 0.000287 0.001962 
+0.000950 0.000494 0.000874 0.000508 -0.000724 -0.000632 
+-0.002133 0.003251 -0.003007 -0.001113 -0.000463 -0.003528 
+-0.001494 -0.001222 -0.000139 0.001448 0.000370 -0.000269 
+-0.000183 0.005469 -0.001572 -0.001909 0.007306 -0.002229 
+-0.001837 0.005625 0.000729 -0.008931 0.001523 0.004476 
+-0.003530 -0.000017 0.007242 -0.001779 0.002524 0.000982 
+-0.001893 0.002359 -0.003718 0.001271 0.000637 -0.006812 
+0.006077 0.000807 -0.006218 -0.009092 0.006545 0.002478 
+-0.012190 0.003728 0.008230 -0.025300 -0.004791 0.014272 
+-0.003200 -0.001425 -0.005828 -0.004289 0.003619 -0.008291 
+0.016050 -0.001400 -0.011000 0.001239 0.004334 -0.005322 
+0.000990 0.004813 -0.002104 -0.000198 0.003532 -0.000382 
+0.000565 0.000520 0.000614 0.001654 0.000899 -0.000372 
+0.001751 0.000918 0.000174 0.001292 -0.000716 -0.000177 
+-0.000963 -0.002150 0.000370 -0.001121 -0.002074 0.001974 
+-0.000853 -0.000288 0.000990 0.003418 0.008610 -0.010093 
+0.013458 0.017527 -0.037076 0.017555 0.006958 -0.022819 
+0.010071 0.023899 0.007559 0.001971 -0.003064 0.003074 
+-0.004121 -0.006870 0.002818 -0.003975 -0.003619 0.000381 
+-0.001827 -0.000337 -0.001432 -0.002093 -0.001828 -0.000123 
+-0.000244 -0.001989 0.001336 -0.004942 -0.000455 0.002139 
+-0.002669 -0.002636 -0.000560 0.000770 0.000134 0.003432 
+-0.002186 -0.001673 0.005068 0.001871 -0.004094 0.005029 
+-0.000171 -0.000514 0.008378 0.001894 -0.000505 0.000800 
+0.000538 0.001994 -0.002470 0.000961 0.001113 -0.005613 
+-0.001320 -0.000512 -0.003449 -0.000187 -0.002101 0.000607 
+-0.000430 -0.002068 0.001978 -0.003823 0.001479 -0.000557 
+-0.003904 -0.002772 0.000118 -0.002260 -0.002734 0.000799 
+-0.002195 -0.003312 0.002254 -0.002482 -0.000939 0.003755 
+0.001551 -0.002129 0.000788 0.000199 -0.002320 -0.002650 
+-0.002262 0.001148 -0.004071 0.003744 0.002130 -0.008262 
+-0.000081 0.001626 -0.004472 -0.000183 -0.000056 0.000263 
+-0.001658 0.000326 0.000415 -0.002694 -0.000269 -0.002705 
+0.001456 0.002912 -0.003920 0.000305 0.002377 -0.002255 
+0.003062 0.000956 -0.002403 0.004548 0.000183 -0.001658 
+0.001677 -0.001825 -0.001924 0.004775 0.000127 0.002950 
+0.004357 0.002099 0.003154 0.004540 0.002087 0.000154 
+0.003513 0.001032 0.002608 0.000946 -0.000449 0.006316 
+-0.001047 0.001543 0.002428 0.002644 0.000868 -0.000016 
+0.002370 0.001025 -0.003662 0.000982 -0.000581 -0.000359 
+-0.005288 -0.002590 0.004182 -0.001710 -0.002050 0.003734 
+0.000928 -0.001625 -0.002163 0.000149 0.001890 -0.003694 
+0.000341 0.001730 0.000809 -0.002806 0.001012 0.009706 
+-0.002542 0.000041 0.007597 -0.001680 0.000476 0.001086 
+-0.000951 0.000864 -0.001326 -0.000481 0.001262 -0.005632 
+0.009773 0.005563 -0.008732 0.014959 0.004055 -0.004762 
+0.011836 0.008787 -0.010401 0.015222 0.008756 0.006299 
+-0.005345 0.002937 -0.008800 -0.005668 0.013471 -0.004891 
+0.006573 -0.002843 0.000688 0.004446 0.004285 0.002696 
+0.005793 0.003686 0.003327 0.002856 0.000855 0.001800 
+0.000783 -0.000334 0.000858 0.001747 -0.000347 0.000389 
+0.004029 -0.000843 -0.001383 0.003697 0.000851 -0.003368 
+0.001579 0.002646 -0.003957 -0.001983 0.002029 -0.000262 
+-0.010023 0.001662 0.008645 -0.013498 0.015270 0.000156 
+-0.050336 0.044395 -0.027084 -0.005789 0.016966 -0.009801 
+-0.002936 0.005864 -0.004742 -0.006054 0.010663 0.011788 
+0.000841 -0.012720 0.002139 0.002112 0.003010 0.002717 
+0.001298 0.007097 -0.001050 -0.000171 0.001430 -0.001252 
+-0.002231 -0.002373 0.005868 -0.006879 -0.006700 0.008666 
+0.001223 -0.001947 0.008729 0.000094 0.000881 0.007536 
+0.000552 -0.001025 0.006579 0.003536 0.000304 0.004346 
+0.001495 0.001690 0.001366 0.000709 0.000852 0.000725 
+-0.001920 -0.000072 -0.002028 -0.000269 -0.002418 -0.002373 
+-0.001148 -0.001725 -0.000379 0.001460 0.000950 -0.000721 
+0.001290 0.003046 -0.001993 0.002195 0.000609 -0.002634 
+-0.000983 -0.001509 -0.001372 -0.000514 -0.000615 -0.000533 
+0.001966 0.000894 0.000353 0.001380 -0.000174 0.000755 
+-0.000293 -0.000283 0.002097 -0.002529 -0.000411 0.003761 
+-0.003324 0.000298 0.003538 -0.005619 -0.001323 0.002316 
+-0.001691 -0.004920 0.000180 0.001224 -0.001551 0.000959 
+-0.001681 0.000209 0.000698 0.000303 0.000728 -0.002222 
+-0.000312 0.001444 -0.004918 -0.000779 0.000477 -0.004484 
+0.000299 -0.000137 -0.000371 -0.000712 -0.002200 -0.001437 
+-0.000889 -0.002882 -0.001902 0.000657 -0.001639 -0.002525 
+-0.000292 -0.001378 -0.003538 0.001345 -0.001655 -0.004915 
+0.003899 -0.001393 -0.003900 0.004715 -0.001795 -0.001419 
+0.000293 0.001403 0.000354 0.002841 -0.000435 0.000230 
+0.000001 0.000294 0.000094 -0.000796 -0.000800 0.000195 
+0.000306 -0.000735 -0.000340 0.000500 -0.000248 0.000434 
+0.003507 -0.001438 -0.001739 -0.000078 -0.001928 -0.002251 
+-0.000784 0.003331 -0.002132 0.000234 0.008008 -0.003990 
+-0.000983 0.007130 -0.003362 -0.001382 0.004171 -0.001491 
+0.000559 0.001339 0.001535 0.000705 -0.000689 0.005809 
+0.000587 0.003700 -0.004732 0.002440 0.008348 -0.003199 
+0.003283 -0.007857 -0.006406 -0.001613 0.001061 -0.002828 
+0.002324 0.001900 -0.005598 0.011188 -0.000908 -0.007246 
+0.011800 0.000161 0.000089 0.009025 -0.002397 -0.000865 
+0.005669 -0.000427 0.002422 0.001854 -0.005028 0.005534 
+0.000235 -0.005881 0.006938 -0.000554 -0.005532 0.006835 
+-0.002250 -0.004906 0.006019 -0.003528 -0.002444 0.003479 
+-0.003348 0.001765 -0.000084 -0.003543 0.003454 -0.000131 
+-0.006499 -0.006225 0.007477 -0.009880 -0.003586 0.011867 
+0.003689 -0.003718 0.004350 -0.001132 0.001797 -0.001679 
+-0.005263 0.002819 -0.001924 -0.008485 0.001957 -0.002744 
+-0.006211 0.000784 -0.006421 -0.002820 0.014964 -0.001099 
+0.005378 0.009119 -0.005569 -0.005121 -0.000899 0.002902 
+-0.004599 0.003463 0.003773 -0.000526 -0.008742 0.010669 
+0.001906 -0.005602 0.002936 0.002070 -0.003512 0.000504 
+0.002124 -0.000862 0.002659 0.000246 0.001255 0.001725 
+0.000752 0.000230 -0.000043 0.001924 0.000164 -0.000297 
+0.000085 -0.001736 -0.001302 -0.001583 -0.002437 -0.002111 
+-0.004705 -0.003938 0.002914 -0.004305 -0.002256 0.005783 
+-0.001344 -0.001730 0.004995 -0.000065 -0.000162 0.002137 
+0.001478 0.000522 -0.000522 -0.000499 0.000876 -0.002834 
+0.000190 0.000555 -0.003601 0.004377 0.002144 -0.005224 
+0.000452 0.005421 -0.000452 -0.000546 -0.000026 -0.000432 
+-0.002622 -0.002697 -0.001754 -0.004808 -0.002474 0.007805 
+0.002382 -0.001929 0.004110 0.001082 -0.002976 0.000811 
+-0.001708 0.000162 -0.000244 -0.002033 0.001642 0.000304 
+-0.001372 -0.000306 0.001281 -0.001015 -0.001499 -0.000047 
+-0.001778 -0.000805 0.000659 -0.000867 -0.002111 0.000165 
+0.002092 -0.000040 -0.003189 0.002428 -0.001605 -0.003530 
+0.001469 0.000535 -0.001309 -0.000846 0.000117 0.000286 
+-0.001460 -0.000336 0.001346 -0.002246 -0.001040 -0.001074 
+-0.001093 -0.001366 -0.000219 0.000841 -0.001335 0.003281 
+-0.000565 0.000055 0.000675 0.002547 -0.001437 -0.000832 
+0.002858 -0.001568 -0.005260 0.004320 -0.000480 -0.002160 
+0.000493 -0.001092 -0.001940 -0.000416 0.000917 -0.001570 
+0.001429 0.005574 -0.003538 0.000615 0.004619 -0.006992 
+-0.000577 0.003995 -0.002676 -0.001080 0.000396 0.001735 
+0.000128 -0.003471 0.002182 -0.001923 -0.008018 0.004448 
+-0.003250 -0.003756 0.003731 -0.003053 0.005470 -0.004359 
+-0.001763 -0.000091 -0.004167 0.000325 -0.000626 -0.003820 
+0.000621 0.001138 -0.002240 -0.000599 -0.001393 0.000078 
+-0.002406 0.000781 0.002531 -0.003266 0.002769 0.003919 
+0.001542 0.004000 -0.000181 0.000578 -0.000308 0.000138 
+0.001019 -0.001057 -0.003622 -0.003981 0.000046 -0.000273 
+-0.010771 -0.000162 0.007749 -0.014660 0.000149 0.013489 
+-0.012133 0.001104 0.009958 -0.000923 0.000817 -0.001588 
+0.011925 0.001854 0.002880 0.013048 -0.001679 0.001593 
+0.006805 -0.002282 0.000087 -0.000847 -0.003955 0.003013 
+-0.004736 -0.002108 0.000387 -0.001974 0.004927 -0.005304 
+0.009982 0.000154 -0.003189 0.011615 0.008407 0.000761 
+0.004154 0.004521 -0.001299 -0.004766 -0.001421 -0.002208 
+-0.008363 -0.004639 -0.001046 -0.000946 -0.002979 0.001705 
+0.000290 -0.002396 0.000137 0.000631 -0.004404 -0.000820 
+0.001981 -0.005023 -0.000283 -0.003792 -0.006205 0.002069 
+-0.004455 -0.004297 0.002333 -0.003277 -0.002011 0.000087 
+-0.001760 -0.000805 0.000386 -0.002034 0.003347 -0.001229 
+-0.004593 0.000596 0.000247 -0.005742 0.000129 0.003775 
+-0.006667 -0.000171 0.002991 -0.003162 -0.003162 0.003077 
+-0.000116 -0.000154 0.001053 -0.000177 0.000000 -0.000177 
+0.000921 0.002763 -0.001053 -0.000372 0.002235 -0.002185 
+-0.000191 0.001649 -0.003895 0.002252 0.004021 -0.002091 
+-0.001366 0.001416 0.000918 -0.002281 0.000014 0.005431 
+-0.001568 -0.000406 0.006155 -0.001280 -0.002134 0.001440 
+-0.000052 -0.000851 0.000528 -0.000219 -0.001440 0.000899 
+0.000082 -0.002410 0.002278 0.001408 0.001100 0.002670 
+-0.002050 -0.000320 0.004773 -0.000132 -0.000965 0.001492 
+0.001333 0.001481 -0.001185 0.000432 -0.000714 -0.000698 
+0.000193 -0.000469 0.000167 -0.000116 0.000026 0.001174 
+0.000054 0.000576 0.001452 0.000793 -0.000549 0.002563 
+-0.001545 -0.001829 0.003410 -0.001535 -0.001124 0.003225 
+0.000000 0.000783 0.000000 0.006185 0.001927 -0.002517 
+0.005770 0.002549 -0.003221 0.000634 0.003003 -0.001185 
+-0.000458 0.001101 0.002101 0.001228 0.001930 0.001228 
+0.004290 0.006169 -0.000084 0.007878 0.006557 -0.003630 
+0.004641 0.001879 -0.003697 0.000938 -0.000426 -0.001515 
+0.000582 -0.001455 -0.000291 -0.001679 -0.001618 -0.001058 
+-0.007486 -0.003387 -0.002403 -0.009249 -0.000917 -0.000717 
+0.003086 -0.001312 -0.006671 0.003113 0.005221 -0.002255 
+0.004003 0.005375 -0.005963 0.000083 0.003103 -0.003522 
+0.001317 0.000688 -0.004133 0.005227 -0.003062 -0.012814 
+0.009984 -0.007292 -0.016338 0.009032 -0.008754 -0.010486 
+-0.001559 -0.004726 -0.004093 -0.004392 -0.006261 -0.008677 
+-0.003481 -0.003256 -0.006535 -0.002094 0.000059 -0.000889 
+-0.001194 -0.001314 0.005076 0.000954 -0.001777 0.002853 
+0.005495 0.002442 -0.001151 0.005225 0.002587 -0.002913 
+0.002311 0.001294 -0.000537 -0.000252 -0.001375 0.000712 
+-0.000278 0.001100 -0.003063 -0.001051 -0.000159 -0.006925 
+-0.000950 -0.001687 0.000714 0.001158 -0.002441 0.000461 
+0.002783 0.002455 -0.001164 0.000018 0.005456 0.002066 
+-0.000521 0.004820 0.001138 -0.000592 -0.000253 0.002550 
+0.000075 -0.001395 0.001683 -0.000196 0.001151 -0.000252 
+0.000116 0.002806 -0.001994 -0.004800 -0.000192 -0.000144 
+-0.005600 -0.002880 -0.001920 0.000622 -0.003105 0.000206 
+0.001423 -0.001627 -0.001550 0.001124 0.001073 -0.002503 
+-0.000351 0.001144 -0.000991 -0.002287 -0.003745 0.000929 
+-0.003779 -0.006369 0.003219 -0.006597 -0.003653 0.001472 
+-0.001320 -0.003869 0.005010 -0.001107 -0.001289 0.002759 
+0.000780 0.001383 -0.001892 0.003817 0.002134 -0.004215 
+0.004701 0.002153 -0.002566 0.000207 -0.000423 -0.000540 
+-0.000310 0.001047 -0.001321 0.001795 0.001966 -0.002821 
+0.001309 0.001246 0.000665 0.001457 -0.003073 -0.000637 
+-0.000605 -0.002177 0.004960 -0.003601 -0.001604 0.006678 
+-0.002590 -0.000310 0.003521 -0.000520 0.001024 -0.000173 
+-0.001691 0.001020 0.002752 -0.001585 0.001882 0.001783 
+-0.003483 0.000498 -0.000480 -0.002842 -0.000546 -0.004208 
+-0.004443 -0.005122 -0.002050 -0.003514 -0.004553 -0.000130 
+-0.000507 0.000617 0.002155 0.002832 0.000883 0.000701 
+0.004140 0.000767 -0.001007 0.002268 0.001931 -0.001481 
+-0.000195 -0.000318 0.000409 -0.002260 0.000141 0.001977 
+0.000061 -0.000209 0.000469 -0.005521 0.000483 -0.000205 
+-0.003582 -0.004057 0.003538 0.000194 -0.000091 0.004073 
+0.001296 0.004677 0.000375 0.005161 0.006429 -0.001093 
+0.005035 0.002068 -0.001073 -0.000679 0.000326 0.000679 
+-0.003815 0.000226 0.004946 -0.003160 0.001250 0.000065 
+-0.001977 0.001925 -0.002501 -0.001146 0.002875 -0.003138 
+-0.002895 -0.002523 -0.002310 0.000292 -0.000278 -0.000952 
+0.002017 0.001369 -0.005779 0.007924 -0.001666 -0.016548 
+0.003847 -0.002632 -0.025135 -0.019486 -0.002915 -0.020564 
+-0.023627 0.010335 -0.011489 -0.003320 -0.001122 -0.007822 
+0.000476 -0.000414 -0.002755 -0.016845 -0.002583 0.003146 
+-0.026117 -0.027326 0.011722 -0.013738 -0.000284 0.013074 
+-0.004787 0.001153 0.007641 -0.009158 -0.005623 0.014084 
+0.002366 -0.013894 0.004793 -0.000074 -0.009512 0.011147 
+-0.000626 -0.000889 0.004876 -0.002554 0.001031 0.002405 
+-0.000546 -0.001014 0.002874 -0.002537 -0.005677 0.001351 
+-0.011666 -0.009596 0.007224 -0.010554 -0.001689 -0.001601 
+-0.000178 0.003712 0.000366 -0.000296 -0.001130 0.000986 
+0.002097 -0.001126 0.000458 0.000353 -0.001798 0.000947 
+0.000255 -0.003234 0.000496 -0.000351 0.001447 -0.001600 
+-0.002402 0.001496 -0.004922 -0.001934 0.004561 -0.005843 
+-0.005432 0.000523 -0.002279 -0.004306 -0.000302 -0.002380 
+0.000005 -0.000009 0.002458 -0.000684 0.000268 0.001063 
+0.001744 0.002211 -0.003022 0.004234 0.002973 -0.003604 
+0.004115 -0.000354 -0.004115 -0.001710 -0.000464 -0.001246 
+-0.001802 -0.003047 0.000892 -0.000805 -0.004085 0.000216 
+-0.000053 -0.003369 0.001532 -0.001199 -0.003507 0.000629 
+-0.001417 -0.000490 -0.000392 -0.000073 -0.000239 0.000923 
+0.002818 0.002470 -0.003384 0.006022 0.003252 -0.001678 
+0.000730 -0.001370 -0.000571 0.000729 -0.003917 0.002280 
+-0.001386 -0.005788 0.004761 -0.000680 -0.003485 0.002381 
+-0.001343 0.000330 0.000066 0.000547 0.002576 -0.000684 
+-0.003639 -0.000501 -0.000961 -0.006196 -0.001788 0.002204 
+-0.001267 0.003477 -0.000617 -0.003705 0.002433 -0.001244 
+-0.000985 0.000148 -0.000468 0.001443 -0.002496 -0.000090 
+-0.001291 0.000125 0.003083 -0.000387 -0.000044 0.004079 
+0.000064 0.000808 0.002718 -0.000635 0.002381 0.002222 
+-0.002472 -0.001037 0.002099 -0.003227 0.000649 -0.000822 
+-0.000344 0.000066 0.001556 -0.002737 -0.001633 0.002686 
+-0.000576 -0.001615 -0.000127 -0.000846 -0.000171 -0.000820 
+-0.000205 0.001572 -0.000582 0.000542 0.003269 -0.002232 
+-0.000928 0.003383 -0.002843 -0.000669 0.002265 -0.002207 
+-0.002100 0.002381 -0.000318 -0.004149 0.001668 -0.002453 
+-0.001308 0.003074 -0.005134 0.000530 0.000707 -0.006185 
+-0.000386 0.000296 -0.001355 -0.001843 0.002288 0.002358 
+-0.003456 0.004704 -0.001153 0.000871 0.006361 -0.013963 
+-0.012793 0.012615 -0.024518 0.001698 0.008369 0.010231 
+0.000655 0.011815 0.035664 0.428571 0.634921 5.047619 
+0.579310 0.489655 5.475862 0.004825 0.005184 0.051513 
+0.006028 0.002247 0.036382 0.009760 0.004639 0.015317 
+-0.003316 0.000422 -0.010820 -0.003580 0.001877 -0.007741 
+-0.007070 0.000480 -0.002513 -0.007959 0.002867 -0.003826 
+0.002287 0.004926 -0.008312 0.003534 0.000880 -0.007129 
+0.002208 -0.001261 -0.001284 -0.000599 -0.000547 0.004424 
+-0.004022 -0.001267 0.006999 -0.012446 0.000074 0.005101 
+-0.010020 0.001766 0.007442 -0.005999 -0.005189 0.008245 
+-0.000163 -0.000029 0.000099 0.003444 0.000380 -0.011193 
+0.000097 -0.001713 -0.009810 0.000589 -0.002159 -0.005276 
+0.003945 -0.002114 -0.002359 -0.000533 -0.001527 -0.003022 
+0.001031 -0.001667 -0.005706 0.002598 0.000705 -0.001988 
+-0.000806 0.000211 0.000523 -0.001680 0.000384 0.002227 
+-0.000754 -0.000394 0.001217 0.000764 0.001193 -0.001814 
+-0.001469 0.002476 -0.007467 0.000691 -0.002363 -0.005859 
+0.000225 -0.001924 -0.002461 0.000387 -0.001338 -0.001308 
+-0.004261 -0.007127 0.004818 -0.002496 0.001625 0.002293 
+-0.000419 -0.000101 0.005696 -0.000217 -0.000955 0.002285 
+-0.000706 -0.001399 0.000252 -0.001844 0.000538 -0.001037 
+-0.003903 0.002477 0.003755 -0.000181 0.000135 0.008871 
+-0.000947 -0.001153 0.009427 0.002740 -0.000412 0.005420 
+0.001753 0.000180 0.001171 -0.003668 0.000299 0.000978 
+0.003284 0.000365 0.000930 0.003416 0.002050 -0.002598 
+0.004638 0.001564 -0.005310 0.005253 0.000911 -0.004972 
+0.002750 -0.000817 -0.005239 0.006911 -0.001098 0.001314 
+0.007350 0.004965 0.003343 0.003220 0.005864 0.001051 
+0.001620 0.002970 0.000090 0.001190 -0.000231 -0.001548 
+0.001435 -0.001110 0.000375 -0.000451 -0.000380 0.003009 
+-0.003749 0.000566 0.003895 0.000450 -0.000945 0.000324 
+-0.000801 0.001517 0.000156 -0.001020 0.000665 -0.000534 
+-0.000295 -0.001866 -0.000232 0.001925 -0.001336 -0.001836 
+0.004919 0.002457 -0.001638 0.004480 0.006999 -0.003015 
+0.005663 0.005776 -0.004910 0.005648 -0.000196 -0.005082 
+0.005054 -0.002959 -0.003725 0.002344 -0.004941 -0.004406 
+0.000552 -0.002956 -0.001158 0.000135 0.002507 0.000152 
+-0.002300 0.006502 -0.000837 -0.007162 0.009933 -0.001004 
+0.017267 0.040657 -0.004204 -0.005287 0.004219 0.023862 
+0.503145 0.301887 6.792453 0.726984 0.307937 7.949206 
+0.902887 0.291339 8.028872 0.993443 0.203279 7.285246 
+0.958824 0.005882 4.505882 0.006166 -0.001071 0.007655 
+0.010750 0.006268 -0.008326 0.018068 0.000556 -0.007291 
+0.019122 0.001803 -0.007189 0.016309 0.004037 -0.009115 
+0.013451 0.002794 -0.009545 0.013477 -0.001941 -0.009191 
+0.003759 -0.005483 -0.006020 0.000441 -0.003920 0.001989 
+0.000339 -0.004223 0.006227 -0.000198 -0.005002 0.007286 
+-0.002408 -0.005079 0.003983 -0.005889 -0.001479 -0.000704 
+-0.000887 0.002483 -0.001079 0.002159 0.001412 -0.005653 
+0.002582 -0.001991 -0.000919 0.004583 0.000967 0.003558 
+0.005359 -0.002616 0.003276 0.001585 -0.003035 0.002800 
+0.002438 0.000535 -0.002210 0.000914 0.002621 -0.000270 
+-0.002014 0.003151 -0.000364 -0.000042 0.002200 0.001774 
+0.000446 0.001892 0.004158 -0.000776 0.000625 0.004724 
+-0.001131 0.001342 0.001061 -0.000797 0.000079 -0.002879 
+0.003489 0.000617 -0.003485 0.002657 0.001659 -0.001555 
+0.000817 -0.001517 0.000467 0.000743 -0.000725 0.000386 
+-0.000062 0.001767 -0.002203 0.000541 0.003665 -0.001822 
+0.000377 0.001610 0.000799 0.000994 0.000645 0.001937 
+-0.002723 -0.002779 0.005725 0.001696 0.002077 0.002297 
+0.003154 0.004194 0.003147 0.004158 0.005324 0.000679 
+0.001015 0.004055 -0.001623 -0.002304 0.000881 -0.003726 
+-0.001145 -0.000486 0.002123 0.000069 -0.000918 -0.002778 
+0.001408 -0.002718 -0.004875 0.000986 -0.003917 -0.004908 
+0.000512 -0.003511 -0.000675 0.002032 0.000477 0.004396 
+0.000296 0.003147 0.004666 0.000252 0.001621 0.001551 
+-0.000078 -0.000576 -0.001489 0.000458 -0.000835 -0.000618 
+0.000686 -0.002558 0.003619 -0.003437 -0.001964 0.005368 
+0.001219 -0.001405 0.002891 0.000376 -0.001035 -0.000703 
+-0.000655 0.001174 -0.001238 0.000656 0.000610 0.000895 
+0.007787 0.003221 -0.008459 0.004965 0.004706 -0.009224 
+0.006042 0.001835 -0.003691 0.001529 -0.002277 0.002342 
+-0.000863 -0.001389 0.003710 0.000667 0.001316 0.002527 
+-0.000194 0.003611 -0.000215 -0.006533 0.002413 -0.001369 
+-0.012951 0.000546 -0.000430 -0.008510 -0.001223 -0.000141 
+0.005171 0.000931 0.000560 0.008354 0.002457 0.000379 
+0.020328 0.002616 -0.002973 -0.004722 0.012238 0.002973 
+0.560185 0.486111 7.810185 0.710074 0.292383 8.299754 
+0.782520 0.245935 7.918699 0.741627 0.244019 7.026316 
+0.708955 0.279851 4.716418 0.013196 0.002307 0.005891 
+0.030504 0.001735 0.000970 3.858025 -0.080247 -1.765432 
+3.811429 0.245714 -1.525714 3.421687 0.331325 -1.259036 
+0.026679 0.009516 -0.004843 0.023103 0.011642 0.000088 
+0.013715 0.013720 0.005709 0.021027 -0.009690 -0.004265 
+0.005224 0.003124 0.001075 -0.005832 -0.004452 0.005343 
+-0.007563 0.001516 0.004043 0.001055 -0.003810 0.003143 
+-0.001604 0.003006 0.002215 0.000110 0.001773 0.001761 
+0.000987 -0.000120 -0.000758 0.001456 -0.001135 -0.001081 
+0.000296 0.000753 -0.001344 -0.000063 0.001095 -0.001387 
+0.000218 0.002806 -0.002213 -0.002066 0.000682 -0.000294 
+-0.002193 -0.001818 -0.000529 0.001735 -0.001855 0.001611 
+0.004796 -0.001450 -0.000691 0.002857 0.000000 -0.006032 
+0.002151 0.002000 -0.006202 0.001044 -0.003008 -0.002527 
+-0.000221 0.000462 -0.000265 0.001379 0.002064 0.000014 
+0.000887 0.001774 0.000000 -0.000349 0.003493 0.001667 
+-0.000815 0.001312 0.004434 -0.000144 0.006636 0.000790 
+-0.000897 0.002690 -0.002328 -0.000705 0.000046 -0.002477 
+0.001140 0.000490 -0.000356 0.001863 0.003491 0.000225 
+0.003602 -0.000038 0.001762 -0.000706 0.005434 -0.004834 
+-0.002687 0.004219 -0.003762 0.003503 0.003409 -0.007052 
+0.002309 0.004005 -0.004460 0.004703 0.002279 0.001261 
+0.001104 0.002354 -0.000187 0.000441 0.002945 -0.000649 
+-0.000436 0.002973 -0.000089 -0.003794 0.000983 0.004262 
+0.000510 0.000865 0.001113 0.000417 -0.001739 0.002857 
+0.000783 -0.002328 -0.000817 0.000433 -0.003209 -0.001299 
+0.001957 -0.001715 0.001741 0.000161 -0.000263 0.003783 
+-0.000461 0.000441 0.003105 0.000024 0.002397 0.000871 
+0.000010 0.000414 -0.001140 -0.000351 -0.004884 -0.001549 
+-0.001586 -0.004047 -0.003995 -0.007530 -0.003907 -0.001320 
+-0.010551 -0.003815 0.001170 -0.010984 0.003589 -0.000861 
+-0.004946 0.005027 -0.009643 -0.001639 0.011345 -0.007193 
+-0.002070 0.011346 -0.003896 -0.004042 0.008007 -0.002166 
+-0.001920 0.003884 -0.000557 0.008093 0.004648 -0.000622 
+0.016781 0.009705 0.000537 0.000393 0.016322 -0.002389 
+0.021143 0.014174 -0.006962 0.000800 0.007341 -0.001458 
+0.818653 0.533679 5.652850 0.733108 0.402027 6.030406 
+0.483766 0.431818 5.272727 -0.025862 0.560345 4.025862 
+0.003497 0.013978 0.015906 0.009866 0.001949 0.003204 
+0.027924 -0.002787 -0.011871 3.361963 0.012270 -1.736196 
+3.560538 0.179372 -2.201794 4.004065 0.329268 -2.402439 
+4.399103 0.762332 -2.278027 4.246988 1.114458 -2.024096 
+0.020429 0.022196 -0.023378 0.035980 0.009190 -0.019134 
+0.020963 0.002211 0.002855 0.003388 -0.001845 0.001170 
+-0.003544 -0.004262 0.003791 0.000098 -0.001068 -0.001407 
+-0.002924 -0.000723 -0.004337 -0.003187 -0.004524 -0.007095 
+-0.000662 -0.003692 -0.006304 -0.000227 -0.001056 -0.001206 
+-0.000837 0.000067 0.002377 -0.000550 0.000283 0.001009 
+0.000691 -0.002375 -0.001296 -0.002052 -0.002513 -0.002249 
+-0.000368 -0.000801 -0.000235 -0.000475 -0.003235 0.003062 
+-0.001104 -0.002666 0.000992 -0.002438 0.000556 -0.001636 
+0.001597 0.000917 -0.000914 -0.003200 0.000226 -0.000056 
+-0.001805 -0.000684 -0.001750 -0.003561 -0.001020 0.005099 
+-0.000325 -0.004089 0.005004 0.000617 -0.001442 0.003413 
+-0.001214 0.003752 -0.001377 -0.002948 0.006767 -0.003841 
+-0.002317 0.003775 -0.003738 0.000078 0.000033 -0.001564 
+-0.000273 -0.000399 0.000651 0.000520 0.001210 -0.001067 
+0.005956 0.004645 -0.003397 0.003564 -0.001135 -0.001275 
+-0.000175 -0.001784 -0.003009 -0.006371 -0.002132 -0.002665 
+0.004396 0.003063 -0.006494 0.008202 0.003327 -0.002141 
+0.000074 0.000190 0.000421 -0.000334 0.001500 -0.001457 
+-0.002377 -0.001532 0.002657 -0.006865 -0.001108 -0.000543 
+-0.000388 0.001326 0.002742 0.000952 -0.003260 0.007366 
+-0.006201 -0.008667 0.002005 -0.001327 -0.003215 -0.003129 
+0.002792 -0.002189 0.000143 0.004658 0.002111 0.000947 
+0.003869 0.001588 0.003819 -0.000945 0.000945 -0.000236 
+-0.000978 0.004204 0.002977 0.002101 -0.000316 0.003533 
+0.007024 -0.004809 -0.002850 0.003191 -0.000944 -0.009242 
+-0.014389 0.012435 -0.014510 -0.024779 0.008666 -0.016281 
+-0.024035 0.009138 -0.017710 -0.018676 0.010672 -0.010410 
+-0.004823 0.007448 -0.003155 0.008563 0.006437 -0.002402 
+0.010986 0.007154 -0.003810 0.005434 0.005931 -0.003801 
+-0.001289 0.000603 -0.001107 -0.003246 0.001907 -0.013080 
+0.010848 -0.009098 -0.057230 0.001458 -0.006808 -0.037572 
+0.000117 0.001414 0.013462 0.010050 0.346734 2.793970 
+0.049587 0.342975 2.537190 0.002086 0.003264 0.013604 
+0.001056 -0.004121 -0.003545 0.000078 -0.005775 -0.029556 
+-0.021606 0.020980 0.004000 -0.010043 -0.006138 0.006660 
+0.005901 0.003139 -0.005927 0.018892 0.010606 -0.012926 
+0.027717 0.015049 -0.015572 3.017544 1.081871 -1.725146 
+0.027146 0.011265 -0.016201 0.027620 0.011049 -0.013913 
+0.023111 0.007539 -0.007371 0.009267 -0.001812 0.000198 
+-0.006309 -0.008286 0.007596 -0.010459 -0.005567 0.014676 
+-0.009119 -0.001001 0.007812 0.001289 -0.004886 -0.000947 
+0.000363 -0.001672 -0.003213 0.001413 0.000209 -0.002465 
+0.001602 0.000928 -0.000600 0.002304 0.002356 -0.003398 
+0.001409 -0.000115 -0.000816 -0.001913 0.001505 0.002589 
+-0.004020 0.001301 0.002120 -0.003362 -0.001510 -0.001823 
+-0.003693 -0.003287 -0.001558 -0.000488 -0.001423 -0.003618 
+0.002115 0.000261 -0.000408 0.001322 0.001828 0.000322 
+0.000178 0.000198 0.000425 -0.000085 -0.000446 0.000148 
+-0.000976 0.000736 -0.002028 -0.002052 0.001538 -0.002793 
+0.000551 -0.002596 -0.005467 -0.002651 -0.004714 -0.001734 
+-0.000933 -0.005879 0.001265 -0.000151 -0.003544 0.001976 
+-0.000335 0.000228 -0.000873 0.003633 0.003830 -0.006777 
+0.001806 -0.002965 -0.006728 0.001730 -0.002880 -0.003888 
+0.001591 -0.000388 -0.004454 0.001227 -0.002226 -0.001140 
+0.002640 0.000616 -0.001350 0.001057 -0.001408 -0.004486 
+0.001684 0.000199 -0.004343 0.002032 -0.002794 -0.000853 
+0.002551 -0.001681 -0.001352 0.001427 -0.001822 -0.003271 
+0.001119 0.001264 -0.006147 -0.000556 0.000216 -0.000100 
+-0.001280 -0.004160 -0.001360 0.000016 -0.002732 -0.001211 
+0.000976 -0.001017 -0.000113 0.000805 -0.000341 -0.000031 
+0.000242 0.001055 0.000469 0.001688 0.002195 -0.001238 
+-0.000573 0.001232 -0.006676 -0.000532 -0.003241 -0.003202 
+0.006972 -0.001433 -0.004416 -0.006721 0.010144 -0.013375 
+-0.017086 0.020631 -0.019199 -3.126263 1.686869 -1.878788 
+-2.959184 1.484694 -1.852041 -0.023742 0.008411 -0.011689 
+-0.012203 -0.002049 -0.002144 -0.003983 -0.004694 0.005375 
+-0.003478 0.000014 -0.001111 -0.003063 -0.002448 -0.002911 
+0.001837 -0.002005 -0.004565 0.004021 -0.001530 -0.002726 
+0.002729 0.000153 0.000009 0.005057 -0.001173 -0.004983 
+0.009966 0.008782 -0.017053 -0.003423 0.003717 -0.032633 
+-0.006954 -0.000302 -0.028985 -0.004706 -0.000969 -0.018178 
+0.001455 0.000390 -0.009977 0.005529 -0.003621 -0.004337 
+0.008103 -0.002428 -0.003119 0.000000 0.002405 0.003457 
+-0.009654 0.003684 0.006010 -0.013296 -0.002101 0.005477 
+-0.011031 0.002107 0.002643 -0.007206 -0.000627 0.002193 
+-0.001513 -0.003382 0.001006 0.004064 0.003905 0.000105 
+0.011199 0.007624 0.000676 0.011295 0.008029 -0.000215 
+0.003878 0.004384 -0.001296 -0.006683 -0.003457 -0.000136 
+-0.004208 -0.006134 -0.005868 -0.000017 -0.000897 0.002963 
+-0.000761 0.003111 0.000721 0.001542 0.005557 -0.004757 
+0.005122 0.007719 -0.003557 0.002097 0.004886 0.001187 
+0.001623 0.001830 0.001358 -0.003343 0.002057 0.002764 
+-0.001749 -0.000086 0.001199 -0.001996 -0.001415 -0.001051 
+-0.000176 -0.004634 -0.001229 -0.001854 -0.002337 -0.002755 
+-0.002110 -0.000473 -0.000571 0.000856 0.002550 0.000601 
+0.000637 0.003057 0.000379 -0.000602 0.002105 0.000902 
+-0.000646 0.002149 -0.002319 0.000785 0.004095 -0.003371 
+0.002284 0.004613 -0.000192 0.002446 0.001208 0.000805 
+-0.000238 0.000229 -0.000389 -0.001802 0.002626 -0.008192 
+0.006116 0.005928 -0.010748 0.001652 0.006338 -0.004009 
+-0.000181 -0.001041 -0.000237 0.001018 -0.002553 0.003622 
+0.000257 -0.001333 0.001628 0.001701 0.002685 -0.004167 
+0.002205 -0.001652 -0.001096 0.000910 -0.001414 -0.002524 
+0.001894 0.001780 -0.000474 -0.000007 0.001397 -0.003061 
+-0.000882 0.000897 -0.001412 -0.003808 0.000923 -0.001962 
+-0.001964 -0.003424 0.004432 -0.004179 -0.005800 0.003941 
+-0.002827 -0.004820 0.005418 0.000587 -0.002274 0.003606 
+0.003279 0.000053 -0.000212 0.002429 0.001911 -0.000716 
+0.002515 -0.000312 -0.001118 0.002301 -0.000413 0.002423 
+0.000393 -0.000057 0.001372 0.002809 0.000852 -0.008802 
+-0.002851 0.011569 -0.003047 -0.010796 0.015779 -0.021115 
+-0.005779 0.018015 -0.022797 -2.360406 1.629442 -1.664975 
+-0.019829 0.011845 -0.009953 -0.006470 0.005355 -0.005860 
+0.000732 -0.002149 -0.004674 0.007502 -0.002100 -0.004021 
+0.002480 -0.000185 -0.000846 0.000003 -0.000111 0.000263 
+0.001011 0.002452 -0.001769 0.001342 0.003627 -0.000513 
+-0.000324 0.002037 0.000112 0.000036 -0.000012 -0.000011 
+0.003634 -0.000233 -0.003372 0.005341 0.001337 -0.004622 
+0.001959 0.000416 -0.001809 -0.004188 0.000368 0.001560 
+-0.001324 0.001339 0.001030 -0.001331 0.001076 0.000260 
+-0.001124 0.000638 0.000241 0.000762 0.000181 0.000494 
+0.001711 0.000132 -0.000206 -0.000101 -0.000307 -0.001114 
+-0.003724 0.000162 -0.001928 -0.004840 0.000669 -0.001447 
+-0.002319 -0.000270 -0.002378 0.003616 0.000254 -0.001476 
+0.007094 0.005350 0.001399 0.003726 0.006944 0.001781 
+0.001456 -0.002431 -0.000433 0.001493 -0.011867 0.001921 
+0.004380 -0.010104 0.000557 0.003557 -0.005342 -0.000418 
+0.003402 -0.000397 -0.005395 0.004447 0.003605 -0.006240 
+-0.000235 0.002830 0.000741 -0.000953 0.003597 0.001285 
+-0.002377 0.002921 0.005665 0.000207 0.004460 0.002730 
+-0.003155 0.003829 0.001489 0.000113 0.001327 0.001417 
+-0.001178 -0.001366 0.002517 -0.000772 -0.002544 0.003211 
+0.001599 -0.002694 -0.001773 0.000247 -0.001766 -0.002156 
+-0.000563 0.000278 -0.001409 -0.001902 -0.001183 -0.000211 
+-0.000840 -0.000077 -0.001665 -0.000484 -0.001558 -0.001373 
+-0.001280 -0.001078 0.000348 -0.001743 0.000343 -0.000191 
+-0.001290 -0.001899 -0.001950 -0.002405 -0.002282 -0.002100 
+-0.001364 -0.002534 0.001413 0.002738 -0.002733 0.002286 
+0.002166 0.000760 0.004389 -0.000613 -0.000747 0.003093 
+0.003074 0.004145 -0.006376 0.004724 0.005127 -0.009398 
+0.002894 0.002656 -0.000391 -0.000931 0.000916 -0.001162 
+-0.000628 0.001088 -0.000908 0.001183 0.001663 -0.000074 
+-0.001507 -0.000558 0.000893 -0.005705 -0.002327 0.004609 
+-0.005951 -0.008934 0.002963 -0.002909 -0.006370 0.003696 
+-0.000352 -0.003778 0.000428 0.000991 -0.003561 0.002689 
+0.000857 -0.005861 0.000713 -0.002290 -0.004719 -0.002012 
+-0.000079 -0.002202 -0.003375 -0.001944 0.000915 -0.003073 
+0.000123 -0.000891 -0.000226 0.003146 -0.005419 -0.003921 
+0.001293 0.001250 0.001070 -0.009176 0.010698 -0.014852 
+-0.009140 0.011878 -0.019273 -0.012420 0.008279 -0.016080 
+-0.007554 0.008790 -0.010292 -0.001301 0.004186 -0.006280 
+0.001257 0.001836 -0.003376 0.001182 0.001756 -0.002099 
+0.000994 0.000957 -0.001820 0.004676 -0.000289 -0.001600 
+0.006473 0.001860 -0.000655 0.002755 0.003449 0.001126 
+0.001707 0.001624 -0.004283 0.001249 0.001249 -0.000971 
+-0.000709 -0.001999 0.000154 -0.002116 -0.002628 -0.001465 
+-0.001252 -0.001088 -0.001418 0.000948 -0.000219 -0.000802 
+0.002719 -0.000830 -0.002060 0.002782 -0.000751 -0.003398 
+0.001759 -0.001682 -0.001529 -0.001630 -0.001792 -0.000519 
+-0.001593 -0.002588 -0.000133 0.000553 0.000062 0.000244 
+-0.001137 -0.001308 -0.000093 -0.001727 -0.004091 -0.000576 
+-0.003705 -0.004776 0.000139 -0.001081 -0.003168 0.001542 
+-0.000358 -0.000332 0.001193 -0.003059 -0.000410 0.005038 
+-0.011127 -0.001724 0.008481 -0.005093 -0.002988 -0.003047 
+0.000059 -0.001981 -0.003603 0.002772 -0.001490 -0.006260 
+0.001935 -0.003492 -0.002390 -0.003094 -0.004310 -0.000365 
+-0.003239 -0.004522 -0.000439 -0.005412 -0.001525 0.002069 
+-0.003382 0.002781 0.001153 -0.000576 0.000902 -0.000786 
+-0.002008 -0.001564 -0.000915 -0.000927 -0.005477 -0.000589 
+-0.004656 -0.006564 -0.001070 -0.005494 -0.003671 -0.001123 
+-0.002054 -0.000466 -0.002425 0.000467 0.000272 -0.004122 
+0.001627 0.001851 -0.004600 0.002114 0.000244 -0.004472 
+0.001200 0.001826 -0.002431 -0.002459 0.000328 -0.000492 
+-0.004940 -0.000689 -0.000565 -0.005087 -0.001515 -0.001093 
+-0.002518 -0.000494 -0.000639 -0.000602 0.002822 -0.000804 
+0.002463 0.001240 -0.001221 0.001751 -0.000384 0.000585 
+0.002998 -0.002890 0.003392 0.000852 -0.005018 0.001963 
+0.001157 -0.001866 -0.000132 -0.003073 -0.000712 0.000131 
+-0.000169 -0.000150 0.000080 -0.002606 -0.004229 0.001914 
+-0.002931 -0.002172 0.002897 -0.002412 -0.002679 0.000833 
+-0.002687 -0.005521 0.000993 -0.008080 -0.007200 0.007200 
+-0.009114 -0.011126 0.001867 -0.006439 -0.001563 -0.000763 
+-0.001074 0.000063 -0.002720 0.000403 0.002791 -0.006084 
+0.000280 -0.000580 -0.003470 -0.001250 0.000409 -0.000088 
+-0.003391 -0.001460 0.001519 -0.001134 -0.000464 -0.001948 
+0.000426 -0.003611 -0.000932 0.000292 0.000967 -0.001240 
+0.008285 -0.002576 0.005473 -0.000992 0.008390 -0.000919 
+-0.004538 0.010059 -0.006568 -0.007141 0.007385 -0.006333 
+-0.005177 0.004945 -0.001640 -0.001326 0.001266 0.001874 
+-0.000978 0.002489 0.000159 -0.001102 0.001093 0.000004 
+0.000720 -0.000707 0.000658 0.003798 -0.001684 0.003024 
+0.004045 -0.002178 -0.002800 0.000714 0.000112 -0.002233 
+0.001677 0.000658 -0.003663 -0.000022 0.004146 -0.002836 
+-0.000921 -0.000236 -0.005417 -0.001897 -0.000431 -0.001897 
+0.000000 0.000381 -0.002669 -0.001415 0.001509 0.000282 
+-0.001352 0.000798 0.001091 -0.003124 -0.002025 -0.002471 
+-0.001559 -0.002154 -0.003425 0.001095 -0.001953 -0.002920 
+0.002325 -0.001071 -0.002792 0.001344 -0.001378 -0.002747 
+-0.002219 -0.000960 -0.002374 -0.003667 -0.000678 -0.000757 
+-0.000282 -0.000487 -0.000205 0.003371 -0.000262 -0.001501 
+0.000792 0.002637 -0.003162 0.001784 0.001436 -0.002905 
+0.002638 0.002532 0.000209 0.006942 0.001985 -0.003292 
+0.009654 0.005669 -0.009212 0.009527 0.000700 -0.007266 
+0.004253 -0.001003 -0.004967 0.000088 -0.000452 -0.001243 
+0.000654 0.000387 0.001380 0.000433 0.000767 0.001678 
+-0.000419 -0.001150 0.002506 -0.000738 0.000122 0.002330 
+-0.000659 -0.000605 0.002203 -0.002134 -0.000995 0.001771 
+-0.004023 -0.004023 0.000376 -0.005024 -0.001022 -0.001930 
+-0.000779 0.002664 -0.003921 0.001491 0.004430 -0.004447 
+0.001566 0.002095 -0.003153 0.000002 -0.000055 -0.000559 
+-0.000698 -0.000420 -0.002102 0.000721 -0.001587 -0.003606 
+0.001368 -0.002956 -0.000849 0.001317 -0.001181 -0.001752 
+-0.000280 -0.000978 -0.001474 0.000377 -0.001038 -0.002785 
+-0.000538 0.000231 -0.000154 -0.000884 0.000835 -0.000057 
+-0.001432 0.003750 -0.000820 0.003982 0.004152 -0.002355 
+0.000640 0.000556 0.000299 -0.002098 -0.000611 -0.001016 
+0.000397 -0.001905 -0.001905 0.002196 0.004462 -0.000036 
+0.008312 0.006770 -0.007715 0.001611 -0.001889 -0.000278 
+-0.000174 -0.000868 -0.000806 -0.002308 -0.004846 0.003846 
+-0.001572 -0.006892 0.002178 0.000360 -0.003796 0.000306 
+0.000909 0.001944 -0.002592 0.002472 0.004693 -0.003823 
+-0.000129 0.003846 -0.001287 0.001194 0.000561 0.001402 
+-0.000151 -0.001000 0.002566 0.000113 -0.000829 -0.000286 
+-0.000782 -0.002920 -0.002773 0.004247 -0.002269 -0.005922 
+0.002974 -0.001487 0.000698 0.000254 0.006674 0.000473 
+0.000983 0.009718 -0.003716 0.001969 0.002554 -0.005348 
+0.003460 -0.000523 -0.000792 0.002778 -0.001491 -0.000860 
+0.000204 0.000764 -0.002428 -0.000502 0.002000 -0.003010 
+0.000904 0.004020 -0.000301 0.006360 -0.001198 -0.001254 
+0.003157 -0.001948 -0.000852 0.001275 -0.000907 -0.000932 
+-0.002291 0.000280 0.000725 0.000150 0.001171 -0.001466 
+0.001802 0.003630 -0.001610 0.000069 0.006206 -0.002023 
+0.002778 -0.001270 -0.000952 -0.001283 -0.001587 -0.002774 
+-0.002839 -0.000097 -0.002593 -0.001229 -0.000269 -0.001376 
+0.002885 0.000224 0.000868 0.004129 0.001805 0.001571 
+0.000097 0.000769 -0.000016 -0.002845 -0.001477 -0.001405 
+-0.004474 -0.000591 -0.000461 0.000052 0.002948 -0.002033 
+0.002612 0.005656 -0.004512 0.004005 0.004577 -0.003435 
+0.002452 0.002208 -0.000531 0.000322 0.000949 -0.003429 
+0.002007 0.001037 -0.005216 0.006988 0.002475 -0.005298 
+0.005816 0.002967 0.001726 0.000296 0.001660 -0.006327 
+0.001646 -0.001136 -0.001656 -0.005736 -0.001138 0.003126 
+-0.009397 -0.002368 0.002623 -0.006240 -0.001357 -0.000482 
+-0.000401 0.000462 -0.002407 -0.000755 0.000000 -0.001888 
+0.000085 0.000141 -0.001120 -0.001154 -0.002027 -0.000161 
+-0.002282 -0.001912 -0.002260 -0.003272 0.000548 -0.002727 
+-0.001958 0.001977 -0.002681 -0.001186 0.000202 -0.001191 
+-0.000278 -0.001586 -0.001398 -0.001234 -0.003414 -0.000581 
+-0.000235 -0.001327 0.000960 -0.001940 -0.000563 0.001641 
+-0.003732 -0.003672 0.001964 -0.001846 -0.006154 0.000615 
+0.001926 -0.004963 -0.001111 0.000747 -0.002004 0.001363 
+-0.000862 -0.002727 -0.000705 -0.000224 -0.001561 -0.001652 
+0.000942 -0.000384 -0.001169 0.004452 0.002264 -0.002679 
+0.005208 0.003814 -0.000744 0.001997 0.002264 0.000102 
+-0.000078 0.000356 0.000883 0.001819 0.000319 0.000582 
+0.001405 0.000188 0.001126 0.001133 0.000590 0.000614 
+0.003402 0.006148 -0.003402 0.006305 0.007324 -0.002983 
+-0.000397 0.005000 -0.000159 -0.000246 -0.001066 0.001147 
+-0.002653 -0.004444 0.003032 0.000012 -0.002533 0.000954 
+-0.000963 0.002861 -0.002398 -0.000924 0.006277 -0.005108 
+-0.003143 0.002890 -0.004284 -0.000369 0.000424 -0.000248 
+0.002980 -0.003683 0.001761 0.003587 -0.002418 0.001731 
+-0.001985 -0.001771 -0.003675 -0.007242 0.000491 -0.003500 
+-0.007447 0.001530 -0.000248 -0.000151 -0.000603 0.000165 
+-0.004949 -0.001058 0.001370 -0.004623 -0.002053 0.002715 
+-0.005920 -0.000978 -0.000652 -0.005127 -0.006690 -0.000286 
+-0.005866 0.000441 0.003806 -0.003798 0.001448 -0.002229 
+-0.004165 0.000961 -0.001442 0.000820 0.004316 -0.000711 
+0.001275 0.003175 -0.001381 0.001782 0.002554 -0.000389 
+0.003636 0.002050 -0.000390 0.003594 0.000638 -0.001536 
+-0.000261 0.000000 -0.001043 -0.004805 0.000714 0.000196 
+-0.000309 0.000480 0.000512 -0.004821 -0.003143 -0.001571 
+0.002018 -0.001404 -0.002018 0.004252 0.000959 -0.005582 
+0.001607 0.002333 -0.004101 -0.003284 0.000505 -0.001733 
+-0.003074 -0.001903 -0.001113 -0.000247 -0.000112 -0.002185 
+0.000766 -0.000983 -0.001691 -0.000269 0.001367 -0.000206 
+-0.000137 -0.000957 0.000547 -0.002516 0.000815 0.000929 
+0.002903 0.001716 -0.004137 0.003639 0.002659 -0.006364 
+0.000560 -0.001712 -0.002838 -0.000157 -0.008157 0.001724 
+-0.001461 -0.005722 -0.001143 -0.001818 -0.002381 -0.003740 
+-0.001414 -0.001793 0.000257 0.001835 -0.002689 -0.002813 
+0.005912 -0.001875 -0.005002 0.006979 0.000630 -0.000761 
+0.001402 0.002079 -0.000551 -0.002835 -0.000131 -0.000915 
+-0.002193 -0.001451 -0.001080 0.002191 -0.000960 -0.001801 
+0.003339 -0.001064 -0.001715 0.001458 -0.002590 -0.000243 
+-0.000932 -0.001826 -0.000116 -0.000054 0.001325 -0.003352 
+0.002067 0.005267 -0.003380 0.000000 0.002541 0.002541 
+-0.000903 0.001996 0.000929 0.001197 -0.002101 -0.000595 
+0.003368 -0.003862 -0.000601 0.001515 -0.004002 -0.000023 
+-0.000183 -0.001912 -0.000302 -0.000161 0.001371 -0.000484 
+-0.000294 0.004631 -0.002572 0.000152 0.007028 -0.001719 
+0.001311 0.007059 0.000655 0.009158 0.006176 -0.000331 
+-0.000340 0.000064 0.000712 -0.001027 0.003080 -0.004554 
+0.005368 0.003062 -0.001541 -0.000419 0.000862 0.001955 
+-0.000851 -0.001636 0.003848 -0.000718 -0.001237 0.000913 
+-0.001811 -0.000208 -0.001094 0.000991 0.002414 -0.005172 
+-0.001686 -0.000843 0.000000 -0.003832 0.000636 -0.001132 
+-0.001981 0.000470 -0.001563 -0.001387 0.001985 -0.001603 
+-0.002598 0.002058 -0.004070 -0.001771 -0.000207 -0.004277 
+0.002224 -0.005039 -0.003259 0.000722 -0.006961 -0.003650 
+-0.001152 -0.005294 -0.004466 -0.002683 -0.003540 -0.003561 
+0.002674 -0.002162 -0.002864 0.000998 0.001715 -0.006268 
+0.004250 -0.000167 -0.008167 0.006074 0.006074 -0.006033 
+0.004909 0.004038 -0.004335 0.000647 0.002404 -0.003144 
+-0.004246 0.000692 -0.003185 -0.004791 0.003165 -0.002352 
+-0.004413 0.000357 -0.004298 -0.001059 -0.000354 -0.000222 
+-0.001214 0.002809 0.001670 -0.001700 -0.002378 0.002513 
+-0.000393 -0.003583 0.002704 -0.001334 -0.003353 0.000832 
+-0.000522 0.000195 -0.000312 0.002393 -0.000969 -0.001969 
+0.004958 -0.000057 -0.000051 0.002712 -0.001332 -0.001776 
+0.001038 -0.001730 -0.000420 -0.000711 -0.002371 0.000827 
+-0.000279 -0.001204 0.000453 0.000731 -0.000731 0.000769 
+-0.002197 -0.000194 0.003070 -0.003544 -0.000724 0.003300 
+-0.002282 0.000514 -0.000335 -0.001459 0.003939 -0.001191 
+-0.003477 0.001472 0.001029 -0.007081 -0.000074 -0.002360 
+-0.002071 -0.001957 0.002184 0.001281 0.001229 -0.000845 
+0.005065 0.002628 -0.005386 0.002454 0.001007 -0.007300 
+-0.000394 -0.002445 -0.006081 -0.002153 -0.001613 -0.004388 
+-0.001701 0.000815 -0.002390 -0.000403 0.001866 0.000134 
+0.000447 0.001324 -0.000867 0.000710 0.001843 0.000643 
+0.001143 0.001061 -0.000551 0.001032 0.000645 0.002065 
+-0.000571 -0.000208 0.001472 -0.003514 -0.001145 0.000439 
+-0.003779 0.000026 -0.000456 -0.004759 -0.000291 0.001262 
+-0.003086 -0.001604 0.000083 -0.000444 -0.002102 -0.000467 
+0.000930 -0.002283 -0.004284 0.000677 -0.005357 -0.001759 
+-0.000118 -0.007064 -0.001267 0.002921 -0.002544 0.000885 
+0.000000 -0.001235 0.000926 0.000202 0.003427 -0.000450 
+-0.001441 0.001381 -0.000319 0.000141 0.000212 0.001482 
+-0.002481 -0.004060 0.004781 -0.000973 -0.001800 -0.000301 
+0.002797 -0.000045 -0.000003 0.003236 0.002812 -0.000433 
+0.001263 -0.000430 -0.001908 0.005441 0.001801 -0.003092 
+0.005050 -0.000758 -0.005948 -0.001592 0.000835 -0.004987 
+-0.001847 0.001684 -0.001127 -0.001542 -0.002870 0.003309 
+0.001398 -0.005780 0.004382 0.002884 -0.006043 0.002460 
+0.001184 -0.004320 0.000592 -0.001602 -0.002827 -0.002368 
+-0.002660 -0.003725 -0.002344 -0.000996 -0.002475 -0.003979 
+-0.000396 -0.002515 -0.003677 0.002672 -0.003958 -0.002463 
+0.006909 0.000603 -0.005904 -0.000165 -0.003472 -0.003846 
+0.001134 -0.005752 -0.000636 0.002053 -0.002737 0.000587 
+-0.001181 -0.000315 0.002047 0.000065 0.001359 -0.000772 
+-0.000134 0.000997 -0.004390 -0.000423 0.000815 -0.004013 
+-0.002039 0.001572 -0.000406 -0.003226 0.001675 -0.001117 
+-0.002650 0.002432 -0.000219 0.000500 -0.002667 -0.004833 
+0.005294 -0.003277 -0.008319 0.002392 0.002239 -0.005949 
+0.000786 0.000621 -0.000614 -0.002800 -0.001314 0.002065 
+-0.003574 -0.000051 0.002501 -0.001415 -0.000163 -0.000472 
+0.004408 0.004020 -0.006224 0.007573 0.004113 -0.002524 
+0.004070 0.000246 -0.001628 -0.001813 -0.003962 -0.000235 
+-0.004209 -0.003483 0.000161 -0.000861 -0.001217 -0.000475 
+0.000348 0.000959 -0.002536 0.001962 0.000308 -0.005269 
+0.003640 -0.000632 -0.002848 -0.000854 0.003485 -0.004269 
+-0.001210 0.003274 -0.001257 -0.004595 -0.002148 -0.000225 
+-0.003332 -0.006017 -0.000275 -0.001768 -0.003319 -0.000866 
+0.002275 0.000667 -0.002700 0.002339 0.001546 -0.003838 
+-0.001028 -0.003178 -0.001269 -0.006812 -0.008665 0.002502 
+-0.000022 -0.004331 0.004734 0.000177 -0.001534 0.003162 
+0.000229 -0.001642 0.001716 0.000332 -0.003099 -0.000922 
+-0.001008 -0.002556 -0.001134 -0.000210 0.000984 -0.001844 
+-0.000515 0.000034 0.000240 -0.003012 0.000932 0.000669 
+-0.000796 -0.003509 -0.003228 -0.006670 -0.000518 0.003561 
+0.001844 0.000060 0.000775 0.004764 -0.001023 0.000135 
+0.003450 0.000891 -0.000078 -0.001154 -0.001369 -0.000821 
+-0.002295 0.000432 -0.003860 0.001675 0.002331 -0.001958 
+0.003006 0.003643 0.001862 -0.000309 0.001213 -0.000703 
+0.002939 -0.000126 -0.002876 0.000166 -0.001521 -0.000096 
+0.001159 -0.001726 0.003497 0.001683 -0.000608 0.002607 
+0.000467 -0.001026 -0.000584 0.004984 0.004306 -0.002751 
+-0.002086 0.002956 0.000087 0.000063 0.001127 -0.003976 
+-0.007856 -0.005216 -0.001183 -0.003386 -0.000887 -0.001261 
+-0.000340 0.000638 0.000948 0.001409 0.000714 0.000861 
+-0.000402 -0.003842 -0.000183 -0.000125 -0.008328 0.000567 
+0.002252 -0.004299 -0.001527 0.006733 0.003019 -0.001061 
+0.003673 0.007425 -0.002268 -0.001633 0.002975 -0.003733 
+-0.000295 -0.004905 -0.003588 -0.001112 -0.001882 -0.004687 
+-0.000402 -0.000661 -0.001680 -0.000050 -0.000305 -0.000497 
+0.001190 0.002619 -0.000238 -0.000365 0.000755 -0.001592 
+-0.000135 -0.000377 -0.001086 0.000280 -0.000638 -0.000166 
+0.001134 0.000880 -0.002746 0.001332 0.001661 -0.003259 
+-0.000677 0.002388 0.002282 -0.003000 0.001616 0.001250 
+-0.003578 0.000275 0.000009 -0.000300 -0.001173 -0.002182 
+0.003495 -0.001556 -0.003806 0.004585 -0.001993 -0.004067 
+0.001498 -0.001456 -0.003953 -0.000802 -0.001202 -0.000840 
+-0.002297 -0.002843 0.001751 -0.004981 -0.003055 0.001362 
+-0.002869 -0.001935 -0.002419 0.000114 -0.002906 -0.002256 
+0.000672 -0.002017 -0.001345 0.001949 -0.001068 -0.002136 
+-0.000328 -0.001597 -0.000983 -0.002438 -0.002231 -0.002438 
+-0.007196 0.000590 0.002792 -0.003250 0.001201 0.000721 
+-0.001540 -0.004925 -0.000177 -0.004342 -0.007832 0.002452 
+-0.002884 -0.003845 0.001705 -0.000851 0.002763 0.001595 
+-0.000099 0.006552 -0.003358 -0.002355 0.003379 -0.001638 
+-0.005165 -0.000303 0.004052 -0.004375 -0.001661 0.004673 
+-0.001572 0.000030 0.001898 0.000779 -0.002921 -0.001028 
+0.000089 -0.005607 -0.002117 -0.001689 -0.003940 -0.000882 
+0.000022 -0.000810 -0.000252 0.000465 0.001954 0.000785 
+0.001024 0.001152 0.000510 -0.001198 0.000853 -0.001227 
+-0.000571 0.002165 -0.001253 -0.001323 0.000433 -0.001781 
+-0.001577 0.000889 -0.000703 -0.002285 -0.000774 -0.000233 
+0.000012 -0.001518 -0.000879 0.001591 -0.001515 -0.001134 
+-0.003052 -0.000381 0.000757 0.000132 -0.000582 -0.000053 
+-0.005167 0.002252 0.000261 -0.000543 -0.000155 -0.001860 
+-0.000458 -0.000046 -0.001969 -0.001057 0.000379 -0.001183 
+-0.002723 -0.000562 -0.002679 -0.004267 -0.002345 -0.002773 
+-0.003186 -0.002383 0.002088 0.001150 -0.001763 0.001687 
+0.001114 -0.003319 0.001446 -0.002558 -0.004005 0.003394 
+-0.001753 -0.000627 -0.000293 0.000694 -0.001389 -0.002361 
+0.000283 -0.001098 -0.002220 -0.001637 -0.001131 -0.001458 
+0.000730 -0.000332 0.001102 -0.000426 -0.001896 0.001754 
+0.000662 0.001184 0.001057 0.000930 0.001736 -0.000868 
+0.000843 0.000210 -0.000579 -0.000759 -0.003543 0.000169 
+-0.000827 -0.000474 0.000010 0.000772 0.002862 0.002380 
+-0.000165 0.000881 0.001259 -0.001204 -0.000317 -0.003651 
+0.002502 -0.000522 -0.003040 0.001583 0.001309 0.000098 
+0.000517 0.003287 -0.000747 -0.002028 0.000073 -0.002135 
+-0.003023 -0.003986 0.004997 0.001725 -0.006344 0.002498 
+0.000614 -0.000535 -0.002553 -0.000968 -0.001466 -0.003090 
+-0.001652 0.005554 -0.007594 -0.005554 0.002756 -0.001769 
+-0.001813 -0.000220 -0.001833 0.000588 0.003766 -0.001399 
+0.004150 -0.000984 -0.007530 -0.000574 0.000144 -0.006315 
+0.001919 -0.000106 -0.003049 -0.002635 -0.000826 0.000263 
+-0.002641 0.000852 -0.000633 -0.001768 0.000756 0.002011 
+0.001307 0.000215 0.000154 0.001188 0.000534 0.001123 
+-0.000799 0.000256 0.000521 -0.001137 -0.000761 -0.000222 
+-0.000420 0.000805 -0.000045 0.000971 -0.000850 -0.000461 
+0.004351 0.000870 -0.004590 0.003138 0.001837 -0.001424 
+0.001869 -0.000973 0.000496 -0.001573 0.000948 0.000574 
+-0.002236 0.004593 0.001057 -0.001157 0.004630 -0.000806 
+-0.000736 0.000914 0.001167 -0.003790 -0.002486 0.002521 
+-0.004749 -0.003157 0.000590 -0.002957 -0.002908 -0.001010 
+-0.001867 -0.003016 -0.000467 -0.001958 -0.002321 0.000290 
+0.001385 -0.000708 0.002123 0.000534 0.000145 -0.001223 
+0.000795 0.000850 -0.001656 -0.001126 -0.001105 0.001933 
+-0.002165 -0.000277 0.006771 -0.001097 -0.001206 0.005712 
+-0.001237 -0.001798 0.001231 -0.003001 -0.002285 -0.000454 
+-0.001400 -0.004993 0.000037 0.000626 -0.003400 0.000042 
+0.001394 -0.000047 0.001022 0.001371 0.002938 -0.004178 
+0.000446 0.000120 -0.001227 -0.000712 -0.001424 0.002627 
+0.000353 -0.000538 0.000031 0.000863 0.004630 -0.004238 
+0.002854 0.006663 -0.002023 -0.000630 0.002099 -0.002045 
+0.000967 -0.000471 -0.001620 0.000549 -0.000824 -0.002143 
+-0.000064 0.000862 -0.002063 -0.001264 0.001072 0.001152 
+-0.003047 -0.003133 0.004527 -0.000492 -0.004054 0.004670 
+0.000867 -0.003715 0.000620 -0.000044 -0.003134 -0.001271 
+0.001679 -0.002002 -0.002761 0.001349 0.001429 -0.004286 
+0.004230 0.002529 -0.002779 0.003934 0.001246 0.000623 
+-0.000802 -0.000139 0.000822 0.000886 -0.000604 -0.001666 
+0.001696 -0.001739 -0.000071 -0.001036 -0.002966 -0.001417 
+-0.001591 -0.004198 -0.003025 0.001890 -0.001710 -0.003240 
+0.001349 -0.000123 -0.001308 0.000624 0.002118 0.000082 
+-0.000423 0.002734 -0.002197 0.001569 -0.000556 -0.002009 
+0.003452 0.001178 -0.000803 -0.001026 0.006525 -0.001187 
+-0.004267 0.011377 -0.006765 -0.001188 0.008039 -0.010099 
+-0.004344 0.001608 -0.002848 -0.000694 0.001304 -0.000859 
+0.000039 0.002714 -0.002031 -0.002880 0.001979 -0.003286 
+0.000576 0.000535 -0.003414 -0.000721 -0.003097 0.000160 
+-0.000842 -0.003678 -0.000178 -0.002724 -0.002724 0.000163 
+-0.001700 -0.000767 -0.001258 0.002278 -0.001288 -0.001436 
+0.001061 -0.000049 -0.000677 0.000890 -0.000941 -0.002049 
+-0.000081 -0.001992 -0.001992 -0.000922 -0.000426 -0.004255 
+-0.000094 -0.001467 -0.003646 -0.001098 -0.002803 -0.002235 
+0.001788 -0.002335 -0.004628 0.001338 -0.001150 -0.004843 
+0.000167 0.000500 0.000000 -0.001783 0.002305 0.001521 
+-0.002441 0.001158 0.002221 -0.000950 -0.000083 0.000987 
+-0.001567 -0.001349 -0.000390 -0.002472 -0.002250 0.001119 
+-0.003142 0.001448 -0.000847 -0.001671 0.003142 -0.001416 
+0.000096 0.002805 -0.002041 0.000924 0.000948 0.000255 
+-0.000071 0.001433 0.001022 0.001208 -0.001380 0.001484 
+-0.000332 -0.002327 0.002576 0.001082 -0.000535 0.000262 
+0.000379 0.001080 -0.002807 0.000639 -0.001227 -0.001408 
+-0.001465 -0.003296 0.000924 -0.003538 -0.005953 0.001170 
+-0.001237 -0.000984 -0.002366 0.000244 -0.000812 -0.001692 
+-0.001807 -0.000112 -0.002855 -0.000251 0.001471 -0.000828 
+-0.000022 0.000172 -0.000302 -0.001307 -0.002194 0.001081 
+-0.003743 -0.003623 0.001123 -0.002581 -0.004838 0.000257 
+-0.002078 -0.002036 0.002374 0.002031 0.001285 0.002892 
+0.000029 0.000573 0.000529 -0.003900 -0.000094 -0.000399 
+-0.000464 0.001889 -0.000427 0.000281 0.002521 -0.001370 
+0.000909 0.003959 0.000557 -0.001632 0.001650 -0.000604 
+-0.002040 -0.002114 -0.002851 -0.003487 -0.004138 -0.003049 
+-0.001491 -0.004883 0.000220 0.001289 -0.000735 -0.003100 
+0.002202 0.000529 -0.004509 0.000295 -0.001843 0.000221 
+-0.003063 -0.003163 0.005172 -0.001823 -0.000023 0.004604 
+-0.003382 0.001121 0.001101 -0.001447 -0.000821 0.003585 
+0.005387 -0.001106 0.001331 -0.000148 -0.000732 -0.001711 
+-0.003542 0.000184 -0.003450 -0.002422 -0.001978 -0.002144 
+-0.000486 -0.001674 -0.001717 -0.000112 -0.000101 -0.000401 
+-0.002018 0.003224 -0.001214 -0.004023 0.001764 -0.002046 
+-0.002539 -0.001660 -0.000158 -0.000811 -0.002964 0.001956 
+0.002292 0.000956 -0.001329 -0.000866 0.006258 0.001526 
+-0.002653 0.012162 -0.003454 0.001561 0.007457 -0.006937 
+0.001537 -0.000622 -0.000034 0.001698 -0.000180 0.002286 
+-0.000752 0.001225 0.002817 0.000733 0.001797 0.000219 
+0.000185 0.000427 -0.000039 -0.002308 -0.000459 -0.000367 
+-0.000813 -0.002142 -0.001368 -0.001931 -0.004060 -0.000636 
+0.001371 -0.006290 -0.001532 0.004096 -0.006157 -0.002864 
+-0.000033 -0.004053 -0.001406 0.006572 0.000231 -0.004929 
+-0.000730 0.000911 -0.006387 -0.000463 -0.001773 -0.002025 
+0.003089 0.000458 -0.002802 0.001433 0.000172 0.001222 
+-0.000455 -0.001050 0.004303 -0.000147 0.001702 0.004516 
+-0.004550 0.001630 0.002436 0.000185 0.004199 -0.000692 
+0.002865 0.002187 -0.002110 -0.000365 0.000110 -0.000438 
+0.001012 -0.000783 0.003725 0.000187 -0.004027 0.004213 
+0.000853 -0.001630 0.003519 0.001573 -0.000916 -0.001176 
+-0.001746 -0.002500 0.002500 -0.002883 -0.000835 0.000250 
+-0.000683 0.001653 -0.002516 -0.000081 0.003134 -0.002184 
+0.000231 -0.001271 -0.000519 -0.000213 -0.003617 0.003901 
+-0.004531 -0.005469 0.002816 -0.002413 -0.004627 0.001981 
+-0.002069 -0.006153 0.000776 -0.004204 -0.010464 -0.000813 
+-0.000180 -0.008433 -0.003928 -0.000355 -0.003782 0.001952 
+0.001286 0.002882 0.000636 0.003689 0.000000 -0.002869 
+0.001008 0.003024 -0.005285 0.000214 0.000059 -0.003292 
+-0.000511 -0.000426 0.001277 0.000896 0.000462 0.004060 
+0.000878 0.000798 0.003566 0.000512 0.000512 0.000787 
+-0.002460 0.002235 -0.000783 -0.002405 0.002410 -0.000991 
+-0.001136 0.003636 0.000227 0.002308 0.004056 0.001707 
+0.001435 0.000643 0.001207 -0.001076 0.000353 -0.000775 
+0.000001 0.001033 0.000398 0.002020 0.000013 -0.000230 
+-0.000669 -0.001509 0.002959 -0.001047 -0.002803 0.004189 
+-0.002869 -0.003719 0.003186 -0.002151 -0.001211 0.002028 
+-0.000656 -0.000229 0.000137 -0.000980 0.000945 -0.000254 
+-0.002600 0.000867 0.002417 -0.000206 -0.002133 0.002354 
+-0.003458 0.001800 -0.000615 -0.000898 0.000088 -0.001007 
+0.000498 -0.001692 0.000920 0.004250 -0.001274 0.000421 
+0.002761 -0.001759 0.000867 -0.000982 0.001049 0.000265 
+-0.001556 0.003630 -0.000887 -0.001680 -0.000441 0.002121 
+-0.003449 -0.004382 0.005408 -0.003570 -0.003391 0.003675 
+-0.001346 -0.000369 0.001027 -0.008881 0.008910 0.001344 
+-0.008008 0.011505 -0.006912 -0.002299 0.005586 -0.005200 
+0.000611 -0.000223 0.000324 0.001936 -0.001367 0.002120 
+0.001170 -0.001374 0.001277 -0.000158 -0.001512 -0.000565 
+0.000231 -0.001473 0.000283 0.000799 0.000119 -0.000412 
+0.002164 0.001973 0.000034 0.001462 0.001491 0.001223 
+0.001317 0.000699 0.001667 0.001304 0.000692 0.001100 
+-0.000635 -0.000079 0.001508 0.000027 0.000269 -0.001183 
+0.003033 0.001230 -0.003033 0.004861 0.000573 -0.000222 
+0.004170 0.001914 0.000291 0.001388 0.000457 -0.000461 
+-0.000252 -0.000287 0.001147 -0.000512 -0.000536 -0.000190 
+0.000661 0.000022 -0.000296 0.001327 0.000641 -0.000935 
+0.000640 -0.002240 0.000000 0.001389 -0.000377 0.000125 
+0.000666 -0.000265 0.000664 0.000309 0.000062 0.000986 
+-0.000221 0.000164 0.000632 0.000024 -0.000900 0.001301 
+-0.000941 -0.001055 0.000964 -0.000793 -0.000188 0.000417 
+-0.000293 0.000573 -0.000475 0.000486 -0.000864 0.000252 
+-0.001231 -0.004538 0.001231 -0.004801 -0.003447 0.002040 
+-0.002681 0.000739 0.001035 0.000656 0.001990 -0.001200 
+0.004021 0.002347 -0.003764 0.003849 0.000659 -0.002562 
+0.001369 0.001577 -0.001131 0.003139 0.001314 -0.002388 
+0.003787 0.004370 -0.004953 -0.000725 -0.000122 -0.002600 
+-0.001353 0.001769 0.000550 -0.001102 -0.003307 0.000551 
+-0.005867 -0.002451 0.004827 -0.003277 -0.001088 0.002230 
+-0.000376 -0.002481 0.002105 -0.000902 0.000558 0.002791 
+-0.003970 -0.001985 0.005865 -0.003274 -0.004292 0.002655 
+-0.000337 -0.000557 -0.001956 -0.000325 -0.001222 -0.002337 
+0.000955 0.000240 0.001076 -0.001016 0.000543 0.000189 
+-0.000847 -0.002970 0.007917 0.000099 0.000119 0.000515 
+-0.002102 0.000793 -0.001535 -0.001889 -0.000923 -0.001133 
+-0.001938 -0.004109 0.004961 -0.001868 -0.001672 0.002679 
+-0.001865 0.004561 -0.001997 -0.002931 0.006810 -0.001724 
+-0.001117 0.000631 0.002234 0.002030 -0.003939 0.000121 
+0.000667 0.004354 -0.001244 0.005410 0.003060 -0.005410 
+0.002089 -0.000073 -0.005149 0.001985 -0.001728 0.000093 
+-0.000314 0.000404 0.000990 -0.003786 -0.001839 -0.001870 
+-0.003500 -0.000554 -0.002210 -0.001908 -0.000593 -0.003961 
+0.001694 -0.001755 -0.003408 -0.002363 0.002262 -0.002392 
+-0.001720 0.010379 -0.003617 -0.005542 0.010107 0.004755 
+-0.008300 0.009568 -0.001114 -0.003259 0.003841 0.000180 
+0.002753 0.002274 -0.000716 -0.000479 -0.000724 -0.001047 
+-0.001107 -0.002351 -0.001904 0.001509 -0.003775 -0.001495 
+0.000772 -0.002769 -0.000654 0.000625 0.000407 0.000090 
+-0.002805 0.001335 -0.004065 0.000400 -0.000368 -0.003264 
+-0.003425 -0.002008 -0.001654 -0.000683 0.000088 0.000004 
+0.000873 -0.000952 -0.000952 0.002222 -0.002717 0.000543 
+0.001782 -0.000188 -0.002345 -0.000250 0.003005 0.000350 
+-0.002848 0.003141 0.000129 -0.001794 0.000373 0.001033 
+0.001524 -0.000889 -0.000085 -0.000872 0.000472 -0.002555 
+-0.000816 0.000080 -0.003887 -0.001696 0.001142 -0.003384 
+-0.002439 -0.001916 -0.001218 0.001022 0.000210 -0.002849 
+0.004268 0.002014 -0.005266 0.004899 -0.004153 0.000497 
+-0.000786 -0.002959 -0.002542 -0.001037 -0.002927 -0.002593 
+-0.000301 -0.001144 -0.001896 0.000200 -0.001445 0.000351 
+-0.000667 -0.004254 0.002669 -0.004746 -0.005882 0.000678 
+-0.003875 -0.004815 -0.000775 -0.000922 -0.001472 0.000430 
+0.000797 0.001152 -0.003100 0.000952 -0.000454 -0.001678 
+0.000505 0.001555 0.000207 -0.000043 0.002433 0.001074 
+0.004264 0.002298 0.002628 0.002602 0.002333 -0.001403 
+0.004756 0.003389 -0.002180 0.004824 0.006021 -0.000551 
+0.001628 0.005922 -0.002961 0.000810 -0.000747 -0.001431 
+0.000918 -0.003887 -0.000410 0.000148 0.000768 -0.000413 
+0.001010 0.004066 -0.003056 0.000227 0.003818 -0.001909 
+0.001010 -0.000808 -0.000202 0.002687 -0.002687 -0.000149 
+0.000809 -0.001176 0.000515 -0.001300 0.002496 0.002286 
+-0.002532 0.004032 0.002188 -0.004768 -0.001333 0.004348 
+-0.005596 -0.004166 0.003948 -0.004853 -0.002294 0.001147 
+-0.001510 0.001912 -0.001007 -0.000554 0.002608 0.000131 
+-0.000094 -0.000716 -0.001286 0.001261 -0.001758 -0.000077 
+-0.008159 -0.007896 0.002007 -0.002346 -0.003550 -0.004547 
+0.001588 -0.000827 0.004499 0.001798 -0.002100 0.005409 
+-0.002976 -0.001640 0.001020 -0.006110 -0.007031 0.001000 
+-0.007965 -0.012280 0.007457 -0.012112 -0.012795 0.016111 
+-0.018826 -0.012712 0.016832 -0.018448 -0.009698 0.012311 
+-0.006852 -0.006828 0.007323 0.003701 -0.000885 0.001317 
+0.006043 0.000699 -0.006906 0.005462 0.002694 -0.009036 
+0.002158 -0.000473 -0.006781 -0.004524 -0.008575 0.004418 
+-0.006753 0.001584 0.003273 -0.002320 0.000402 0.006528 
+-0.008556 -0.008555 -0.000006 -0.009677 -0.008405 0.000102 
+-0.006696 -0.013993 -0.000960 0.000484 -0.007745 0.015200 
+-0.000417 -0.007945 -0.003704 0.002937 -0.012130 -0.005948 
+-0.003206 -0.002763 0.003881 -0.008914 -0.007979 -0.004063 
+-0.001671 0.000992 -0.003224 0.005427 0.002761 0.003526 
+0.000640 -0.007869 0.010775 -0.012667 -0.004133 0.097733 
+-0.000301 -0.000345 -0.000682 -0.024561 -0.000658 0.201096 
+0.017171 0.042754 -0.026908 0.008779 0.040998 -0.035449 
+0.033959 0.012112 0.000163 0.139312 0.023228 -0.063862 
+-0.003131 0.021616 0.007677 -0.019091 -0.073805 0.032802 
+-0.042537 -0.086194 0.015773 -0.052349 -0.128476 -0.005714 
+0.024091 0.046364 -0.118636 0.090000 0.050833 0.050833 
+0.006838 0.096250 -0.027353 -0.028667 0.013667 -0.016667 
+-0.006852 -0.007407 -0.049074 0.095032 0.113419 0.074129 
+-0.062840 0.068858 0.042284 -0.011429 -0.017381 0.007857 
+-0.012527 0.037357 0.025202 -0.012172 0.033571 0.021005 
+0.003141 -0.027020 0.014155 0.016487 -0.017911 0.003824 
+-0.004664 -0.012111 0.007852 0.000424 -0.013259 0.012967 
+0.007050 -0.007527 0.007520 0.009129 -0.001640 0.002378 
+0.010595 0.006920 0.000879 0.003967 0.001184 0.001337 
+-0.003155 -0.010480 -0.002032 -0.008795 -0.014618 -0.002025 
+-0.002822 -0.002244 0.008606 -0.001823 -0.000564 -0.003268 
+-0.000504 -0.003313 -0.001887 0.003117 -0.002630 -0.000719 
+0.002687 0.000820 -0.001711 0.002888 0.007682 -0.007285 
+-0.002483 0.007765 -0.002924 -0.001263 -0.007747 -0.004042 
+-0.000092 -0.012000 0.000049 -0.001998 -0.007916 0.003154 
+-0.003965 -0.006270 0.000753 -0.001759 0.000494 -0.000948 
+-0.000781 0.010277 -0.001974 -0.001759 0.007724 -0.004004 
+-0.000305 0.000701 -0.000596 -0.000077 -0.002338 0.002617 
+-0.000758 -0.000983 0.001155 0.001152 0.000313 -0.001316 
+0.000684 -0.000655 -0.002650 0.000837 0.002240 -0.000788 
+0.002859 -0.001653 -0.001558 -0.004130 -0.002120 -0.001811 
+-0.010482 -0.007978 0.003997 -0.014806 -0.009664 0.010914 
+-0.010423 -0.013172 0.017131 -0.007534 -0.018595 0.013956 
+-0.003365 -0.012150 0.007604 0.001357 0.000943 -0.000316 
+0.006336 0.006812 -0.003240 0.008538 0.006363 -0.006359 
+0.005072 0.002781 -0.006164 0.000356 -0.003740 -0.002433 
+-0.003928 -0.009680 -0.000818 -0.022075 -0.014886 -0.002823 
+-0.019863 -0.024920 0.006708 -0.016431 -0.014727 -0.008398 
+-0.006303 -0.014636 -0.000445 0.002659 -0.012416 -0.002807 
+-0.004981 -0.010859 0.013649 -0.003323 -0.011453 -0.006267 
+-0.005472 -0.013376 -0.006139 -0.005069 -0.010139 -0.001821 
+-0.004862 -0.003455 -0.000755 -0.009545 -0.013506 0.006118 
+-0.006227 -0.008133 0.008805 0.014923 0.007248 -0.010884 
+-0.009506 -0.001443 -0.013289 -0.006252 -0.011755 0.033102 
+0.016618 0.017597 -0.016694 0.001702 0.015251 -0.002860 
+-0.015774 0.009598 -0.006031 0.017137 0.001195 0.006131 
+0.060463 0.047037 0.026852 -0.023776 -0.022587 0.016643 
+-0.004222 -0.024371 0.005655 0.040642 -0.036566 0.031151 
+-0.015636 0.060909 -0.030364 -0.045606 0.017348 -0.006439 
+0.049408 0.089683 0.024165 -0.002222 -0.075855 -0.015171 
+-0.014545 -0.036364 -0.058182 0.046441 0.056328 -0.022769 
+-0.032593 -0.002963 -0.020741 0.003385 0.050000 0.005077 
+-0.002100 -0.023333 -0.002800 0.007377 -0.039728 0.012897 
+0.025745 -0.011256 -0.005774 0.016582 -0.000572 -0.001973 
+0.009456 -0.015855 -0.004753 0.014383 -0.015409 -0.006598 
+0.017188 -0.007407 -0.000950 0.006711 -0.007570 0.002533 
+0.004930 0.001077 0.001671 0.010262 0.004501 0.002819 
+0.007653 -0.004679 0.003937 0.004005 0.009980 -0.004352 
+-0.001078 -0.003037 0.003576 -0.002148 -0.009414 -0.000033 
+0.000119 -0.005574 -0.000077 0.002938 -0.005746 0.000308 
+0.002486 0.000062 -0.001278 -0.001386 0.007280 0.000095 
+-0.003096 0.009284 -0.002065 0.005176 0.002836 -0.005787 
+0.003954 -0.008588 0.000803 -0.004826 -0.018943 -0.000175 
+-0.000857 -0.019235 -0.003468 -0.002610 -0.005990 0.000165 
+0.005287 -0.001191 -0.000849 -0.002802 0.004386 0.001286 
+-0.003689 0.000972 -0.001805 -0.002302 0.000698 -0.002673 
+0.000198 -0.000595 -0.003362 0.000057 -0.003294 -0.004146 
+-0.000903 -0.004158 -0.003799 0.003237 -0.002172 -0.003592 
+0.004737 0.003740 -0.003399 -0.000193 -0.003792 0.000637 
+-0.002747 -0.002190 0.006516 -0.009805 -0.003219 0.005687 
+-0.010018 -0.005647 0.004838 -0.006369 -0.008204 0.002476 
+-0.002688 -0.010074 -0.001530 -0.002956 -0.011064 -0.000912 
+0.001310 -0.001337 0.000858 0.006960 0.001208 -0.006105 
+0.007943 0.004762 -0.007610 0.004965 0.002861 -0.005313 
+-0.000451 -0.004286 0.003384 -0.011850 -0.014890 0.000934 
+-0.000417 -0.008322 0.005964 -0.001032 -0.002943 -0.006013 
+0.006526 0.007579 -0.006808 0.002022 -0.003878 0.003035 
+0.009360 0.002438 0.026331 -0.000748 -0.001569 -0.001562 
+-0.006246 -0.009379 -0.004945 0.000075 -0.007973 -0.002330 
+-0.002671 -0.006610 0.000457 -0.005660 -0.009828 0.002090 
+-0.000015 -0.005186 0.004583 0.002940 -0.003916 0.003290 
+-0.001443 -0.006879 0.003120 0.000887 0.005618 -0.006376 
+0.065517 0.044747 -0.021284 0.042608 0.048814 -0.029737 
+0.006226 0.015232 -0.000077 -0.019183 -0.028664 -0.002500 
+0.001656 -0.038609 0.001129 0.023333 0.008512 0.000236 
+0.022345 0.016000 -0.001490 -0.009946 -0.004813 -0.000028 
+-0.040417 -0.032339 0.001349 -0.004341 0.056008 -0.009284 
+0.024545 0.071818 -0.047273 0.016263 0.054949 -0.043737 
+0.045697 0.081369 0.022046 0.043238 0.054832 -0.042573 
+-0.004647 -0.001212 -0.034167 0.055000 -0.060877 -0.110685 
+0.001332 -0.007246 -0.000254 0.011609 -0.006913 -0.009594 
+0.022683 -0.003500 -0.002301 0.012761 0.003757 0.002172 
+-0.004915 -0.020282 -0.001425 0.003315 -0.014792 -0.005539 
+0.011830 -0.009986 -0.004653 0.009758 -0.011858 -0.001518 
+-0.009506 0.001063 -0.001669 -0.008482 -0.002649 0.001191 
+0.009526 -0.001120 0.000747 0.003353 0.010219 -0.003979 
+-0.000395 0.005395 0.002895 -0.004012 -0.011285 -0.000416 
+-0.003957 -0.006406 -0.003070 -0.001864 -0.003270 -0.002008 
+0.000822 -0.000264 -0.004666 -0.004242 0.002037 -0.007218 
+-0.009135 -0.001144 0.000488 -0.004091 -0.002255 0.003295 
+-0.008358 -0.012777 -0.002957 -0.000248 -0.013158 -0.008829 
+0.003920 -0.015531 -0.003676 0.003179 -0.006705 -0.009105 
+-0.001915 -0.005812 -0.002445 -0.004437 -0.003805 -0.002005 
+-0.002952 -0.004150 -0.003677 -0.001782 -0.001195 -0.005167 
+-0.001395 0.000056 -0.005848 -0.002623 -0.003547 -0.002673 
+-0.002930 -0.000789 -0.002560 -0.000817 -0.000054 -0.000842 
+0.003794 0.003913 -0.000807 0.004112 0.002344 -0.002779 
+0.002868 0.001470 -0.002572 0.000276 0.004384 -0.000096 
+-0.000953 0.005352 -0.004061 -0.000846 0.001661 -0.005412 
+0.003260 -0.005772 -0.006080 0.000572 -0.011067 -0.006409 
+0.005517 -0.003878 -0.003227 0.003219 -0.005272 0.000068 
+0.007204 0.001789 -0.004624 0.006747 0.002500 -0.007390 
+-0.001462 -0.009279 0.004207 -0.011128 -0.020585 0.012305 
+0.000325 -0.003537 0.002036 -0.001765 -0.002397 0.002553 
+-0.002709 -0.000521 0.004155 -0.007128 -0.010719 -0.004614 
+0.006420 -0.007292 0.010949 -0.005749 -0.001564 0.007560 
+-0.010472 -0.004339 0.002517 -0.004245 0.002183 0.002435 
+-0.000873 -0.000945 -0.000031 0.000390 -0.002000 -0.000215 
+-0.002141 -0.002067 -0.000728 -0.002305 -0.006368 -0.001553 
+0.004445 -0.009878 -0.000040 0.000086 0.000307 -0.000360 
+-0.003540 -0.001021 -0.008041 0.001437 0.006104 -0.006378 
+0.008297 -0.000101 0.002386 0.001807 0.026748 0.005075 
+-0.013101 -0.011210 0.001077 0.000741 -0.048980 0.012042 
+0.003753 -0.005338 0.000066 0.011622 0.013846 -0.000078 
+-0.011250 0.022605 -0.002948 -0.016165 0.044135 -0.012406 
+-0.051280 -0.025833 -0.010796 -0.056807 -0.006605 -0.011764 
+0.086328 -0.006328 -0.014825 0.036220 0.032143 -0.065195 
+0.026598 -0.009139 -0.028447 -0.006201 -0.001099 -0.022760 
+0.019442 0.004704 -0.006344 0.031974 0.018993 -0.020084 
+0.025517 -0.004403 -0.006605 0.030354 0.002236 0.008297 
+0.023999 0.004950 -0.008315 0.005539 -0.006001 -0.005779 
+0.009903 -0.004783 -0.004096 0.007782 -0.012943 -0.010735 
+-0.012598 -0.010941 0.009508 -0.003614 -0.004422 0.003861 
+0.007043 -0.000882 0.002444 -0.002260 0.002912 -0.000088 
+0.004428 -0.002281 0.000592 0.002334 -0.000683 0.001620 
+-0.003639 0.000499 -0.002874 0.000830 0.003342 -0.002826 
+0.003333 0.003638 -0.009738 -0.000293 0.010811 -0.011541 
+-0.007433 0.015491 -0.006947 -0.010282 0.002161 0.001221 
+-0.007924 -0.005959 -0.006690 -0.005956 -0.010551 -0.012790 
+0.000177 -0.018624 -0.007458 -0.010998 -0.011308 -0.010893 
+-0.014118 -0.014321 -0.001772 -0.006755 -0.006090 -0.001895 
+-0.002051 -0.001913 -0.001846 -0.000052 -0.002384 -0.001039 
+-0.001365 -0.002691 0.000365 0.001964 -0.004714 0.003115 
+0.001486 -0.001426 -0.001887 -0.003793 -0.004463 -0.004185 
+0.003158 0.004354 -0.000410 0.006203 0.000884 -0.004021 
+0.003736 -0.000757 -0.004239 -0.002646 -0.001301 0.000417 
+-0.004966 -0.000255 0.000509 0.001989 -0.003268 -0.003966 
+0.006813 -0.006995 -0.005611 0.005482 -0.009087 -0.003506 
+-0.001855 -0.009101 -0.001268 -0.005765 -0.006588 0.004423 
+-0.005383 0.001117 0.002233 0.005566 0.009476 -0.007768 
+0.011041 0.007247 -0.013416 -0.000373 0.001224 0.000558 
+-0.003938 -0.002540 0.004168 -0.001453 -0.006748 0.003167 
+-0.002738 -0.005297 -0.004173 -0.002467 -0.003880 -0.004196 
+0.000169 0.000366 -0.010385 -0.004581 -0.003994 -0.033985 
+-0.014620 0.000546 0.013529 -0.012583 0.002625 0.006571 
+0.001207 0.004535 0.001529 0.005933 0.003458 0.000941 
+-0.001850 0.000513 -0.000152 -0.007535 -0.003842 -0.002970 
+0.001120 -0.005159 -0.003229 -0.000954 0.000172 0.007170 
+-0.001077 -0.008448 0.005881 -0.001357 -0.015594 0.005003 
+0.002929 0.019822 0.018630 -0.003286 0.008270 0.003739 
+0.005828 0.008081 -0.004170 0.001917 -0.013267 0.006044 
+0.014330 -0.020482 0.015245 -0.041568 -0.048252 0.008712 
+-0.022791 -0.038459 -0.002849 -0.016111 -0.049673 0.000817 
+-0.042736 -0.076152 0.015076 -0.110376 -0.010365 -0.034187 
+-0.012422 -0.012010 0.066467 -0.020723 -0.083333 0.072531 
+0.030882 0.004253 -0.018199 0.014329 -0.010787 -0.004883 
+-0.057786 -0.070912 0.020139 -0.165354 -0.146614 -0.026824 
+0.032667 0.006606 0.019376 0.030132 -0.002527 0.013336 
+0.014180 -0.010241 -0.011308 -0.001093 -0.005102 -0.006791 
+-0.009308 0.006033 0.003551 -0.014655 0.008112 -0.002660 
+0.000871 -0.000938 -0.005111 0.001357 -0.005250 -0.007382 
+0.006340 -0.004996 -0.005656 0.006677 -0.016558 0.007905 
+0.008720 -0.011324 0.006602 0.002445 0.006857 0.000328 
+0.005244 0.006702 -0.004222 0.002419 0.002854 -0.004169 
+-0.006414 0.001792 -0.007146 -0.005488 0.003669 -0.014760 
+-0.008921 0.001302 -0.016540 -0.008603 0.000571 -0.014490 
+-0.006126 -0.004000 -0.007639 -0.010380 -0.019300 0.000955 
+0.000851 -0.013095 -0.007217 -0.010289 -0.008438 -0.012492 
+-0.011811 -0.011922 -0.006511 -0.008628 -0.006626 -0.004175 
+-0.002751 -0.005685 -0.001387 -0.004219 -0.004948 0.002364 
+0.001889 -0.004546 0.003145 -0.001574 -0.006081 0.000266 
+0.002872 -0.004603 -0.003855 -0.000288 -0.004743 -0.004222 
+0.000521 0.004494 -0.002696 -0.000654 0.001698 -0.000636 
+0.002287 -0.001145 -0.003560 0.001333 -0.002157 -0.005287 
+-0.000210 -0.001988 -0.004000 -0.002636 -0.002575 0.001969 
+-0.002742 -0.004997 0.000097 0.004050 -0.004335 -0.004142 
+0.003816 -0.003675 -0.000811 0.005864 -0.000569 -0.010960 
+0.004841 -0.000096 -0.003254 0.006799 0.004625 -0.006189 
+0.018309 0.013845 -0.022400 0.018442 0.012200 -0.014638 
+0.007193 0.005112 -0.004930 0.007642 -0.001666 -0.004134 
+0.001618 0.008704 -0.007732 -0.001476 0.009041 -0.003275 
+0.002110 0.023797 -0.016521 0.054125 0.106754 -0.126805 
+0.037657 0.018516 -0.033333 -0.000771 -0.006260 0.002356 
+0.001002 -0.005354 0.000354 0.003132 0.000601 -0.000507 
+0.001554 -0.003278 -0.000145 0.001144 -0.004259 -0.000357 
+-0.000299 0.000357 0.000050 0.009331 -0.001004 -0.001539 
+0.007647 -0.002571 -0.004405 -0.009967 0.007546 -0.007841 
+-0.010708 -0.002815 -0.006704 -0.011141 -0.028440 0.057622 
+0.019324 -0.070854 0.070000 -0.001889 0.004511 -0.006978 
+-0.000681 -0.008547 0.012556 -0.022467 -0.019327 -0.007533 
+-0.002370 -0.097837 0.078752 0.037508 -0.114491 0.098257 
+0.069807 -0.031799 0.020893 0.012322 0.004512 0.014642 
+-0.039053 -0.041095 0.068609 -0.041626 -0.085000 -0.016650 
+0.000196 -0.026863 0.020294 0.024168 0.006399 0.009240 
+0.008103 -0.000582 0.001925 -0.008595 0.000928 -0.002226 
+-0.010840 0.001916 -0.002043 -0.013355 0.002013 0.000337 
+-0.019112 0.002262 0.002851 -0.026655 -0.004653 -0.003408 
+-0.020199 -0.014358 -0.009118 -0.014221 -0.015032 -0.008078 
+-0.016479 -0.016285 -0.001245 -0.006667 -0.006995 0.009303 
+0.005692 0.005422 -0.016621 -0.002369 0.015812 -0.019204 
+0.005159 -0.024678 0.011642 0.016752 0.011484 -0.002818 
+0.017845 0.028482 -0.011507 -0.001063 0.006267 0.001647 
+-0.004607 0.002351 -0.005174 -0.012480 -0.005435 -0.005868 
+0.000613 0.004917 -0.012068 -0.004704 0.005508 -0.013830 
+0.001555 0.013245 -0.002892 -0.000655 -0.006462 0.009433 
+-0.001417 -0.015976 -0.002186 -0.000411 -0.012603 -0.010361 
+-0.015534 -0.011390 -0.006985 -0.012515 -0.011842 -0.002332 
+-0.008159 -0.005511 0.001833 -0.002178 -0.002228 -0.000666 
+0.000596 -0.001456 -0.004812 0.004053 0.001430 -0.005354 
+0.003832 0.000406 -0.002615 -0.002136 0.004630 -0.000979 
+0.000822 0.000548 0.001526 0.002060 0.002764 0.002607 
+0.001676 -0.000335 -0.000651 -0.002642 -0.000998 -0.002772 
+0.001475 -0.000987 -0.005909 0.005412 0.001235 -0.004112 
+0.009009 0.002329 -0.002944 0.006203 0.002405 -0.005874 
+0.006111 -0.002663 -0.005272 0.005889 -0.003336 -0.007163 
+0.008575 0.008433 -0.009116 -0.000396 0.025215 -0.007080 
+-0.003897 0.011139 -0.004101 -0.001204 -0.011353 0.008575 
+-0.006139 -0.004342 0.001599 -0.001462 0.003903 0.003934 
+-0.006624 -0.010504 0.021511 -0.022789 -0.032417 0.015602 
+-0.011065 -0.002315 -0.003911 -0.002860 0.001773 0.005187 
+0.009418 -0.003094 -0.008989 0.008756 -0.001273 -0.015902 
+0.004039 0.002421 -0.005744 0.001356 -0.006993 0.005069 
+0.005359 -0.018047 0.003930 0.008102 -0.011646 0.002190 
+-0.003581 0.013516 0.000953 0.010226 0.009210 0.001258 
+0.007661 -0.006685 -0.003309 0.006388 0.006690 0.002211 
+-0.000983 0.007159 -0.004011 -0.001301 -0.007869 0.017164 
+-0.029650 -0.018477 0.021155 -0.011558 -0.016526 -0.012674 
+-0.015357 0.019143 -0.013643 -0.014880 0.005540 -0.013771 
+-0.010653 0.003938 0.042849 0.011609 0.017886 0.047893 
+0.021459 -0.014007 0.030432 -0.006085 -0.021175 0.029007 
+-0.001232 -0.027531 0.001745 -0.046631 -0.047299 -0.053436 
+-0.002219 -0.027521 -0.002574 0.004892 0.022198 0.009783 
+-0.010312 0.012346 0.008017 -0.016504 0.010239 -0.001829 
+-0.025123 0.005931 -0.009897 -0.033364 -0.002702 -0.006418 
+-0.035521 -0.004118 0.000735 -0.036417 -0.005099 0.001100 
+-0.029390 -0.010420 -0.001610 -0.020451 -0.016435 0.000120 
+-0.006201 -0.011672 0.001501 0.012038 0.012198 -0.020572 
+0.014259 -0.015384 -0.026522 -0.055767 0.071715 0.003055 
+-0.048489 0.074776 -0.022010 -0.021582 -0.015359 -0.007152 
+0.007971 -0.003465 0.008105 0.000778 -0.002737 -0.002019 
+-0.002512 -0.004285 -0.006212 0.002604 -0.003698 -0.006671 
+0.000636 -0.007272 -0.005459 -0.004251 -0.003716 -0.000186 
+-0.005878 0.005306 0.004868 -0.003181 0.002892 -0.001702 
+-0.004971 -0.019574 -0.000094 -0.009329 -0.019148 -0.003114 
+-0.009003 -0.013966 -0.001195 -0.008419 -0.009410 -0.005281 
+-0.005293 -0.007547 -0.001609 -0.001362 -0.000928 0.002290 
+0.001195 -0.000445 -0.003816 0.004254 0.005403 -0.002701 
+0.002488 0.006258 -0.004473 0.001966 0.002383 -0.001243 
+-0.003122 -0.006351 0.006888 0.001428 -0.002996 0.000106 
+0.001441 -0.002562 -0.001407 0.003302 -0.002486 -0.003487 
+0.004493 -0.001164 -0.001705 0.006528 0.003103 -0.001769 
+0.010321 0.004198 -0.005040 0.003463 0.003221 -0.006711 
+0.006156 -0.003526 0.002709 -0.002563 -0.007238 0.005654 
+-0.013519 -0.007853 0.005420 -0.019969 -0.006783 0.005029 
+-0.007642 0.000102 -0.002023 0.000600 -0.004883 0.000690 
+-0.006186 0.006530 0.001763 0.001411 -0.003174 0.000865 
+-0.014707 -0.024761 0.019004 -0.024323 -0.029041 -0.002299 
+-0.005985 -0.004868 -0.005833 0.004067 0.002163 0.006705 
+0.005472 -0.000949 0.007149 -0.000288 0.003733 0.000344 
+0.003300 -0.001353 0.002485 -0.002349 -0.013564 0.010775 
+0.000920 -0.014713 -0.002412 -0.013738 0.007413 -0.021785 
+0.001650 0.007818 -0.005125 0.007851 -0.009746 0.015927 
+-0.003891 0.000090 0.008686 0.036536 0.040442 -0.029029 
+0.019071 0.023103 -0.004511 0.011637 0.006073 0.000271 
+-0.002223 -0.003236 -0.005851 0.007114 0.004317 -0.009607 
+0.003146 0.002396 -0.006389 -0.003833 0.001149 0.007824 
+-0.010904 -0.002694 -0.000101 -0.008210 -0.002448 0.001147 
+-0.001530 -0.007306 0.016497 -0.007203 0.000660 -0.004875 
+-0.005259 0.013916 -0.023581 -0.076856 0.094769 0.072718 
+-0.019646 0.036105 -0.001977 -0.015035 0.028408 -0.003890 
+-0.024050 0.027600 0.006022 -0.036235 0.017230 0.012586 
+-4.251908 0.839695 1.862595 -4.846774 -0.161290 2.250000 
+-0.046176 -0.002274 0.002068 -0.032204 -0.004553 -0.000388 
+-0.026417 -0.007182 0.003085 -0.018218 -0.006904 0.006141 
+0.001116 0.006969 -0.003432 -0.002118 0.007662 -0.034001 
+0.008027 -0.031100 0.015194 -0.034068 0.091394 0.086480 
+0.029954 0.055843 0.022151 0.020072 -0.023215 0.008440 
+0.007247 -0.011439 0.007426 -0.001621 -0.001661 -0.005068 
+0.001053 0.001705 -0.005308 0.003363 -0.002719 0.000955 
+0.006668 -0.012260 0.003395 -0.003608 -0.000421 -0.001940 
+-0.010912 0.001952 -0.001660 -0.014551 0.007570 0.002176 
+0.000101 0.001657 0.002822 -0.005463 -0.007901 -0.000708 
+-0.002144 -0.010467 -0.005984 -0.001270 -0.010003 -0.007826 
+0.001856 -0.008104 -0.002753 0.000035 -0.002915 0.001325 
+-0.000230 -0.001281 -0.004236 0.001022 0.000093 -0.007574 
+0.001564 0.001778 -0.003274 -0.001129 -0.004194 0.004839 
+-0.000639 -0.001728 0.002947 0.001062 0.001946 -0.000840 
+0.005046 0.004848 -0.000304 0.006315 0.004073 -0.001575 
+-0.000350 -0.000925 0.005719 0.001406 0.000869 0.000857 
+-0.002646 -0.000429 0.002043 0.000493 0.002164 0.001206 
+0.007726 0.007356 -0.006841 -0.002421 -0.002716 -0.001517 
+-0.009785 -0.015760 -0.009313 -0.008440 -0.025698 -0.017900 
+0.003496 -0.038230 -0.023340 -0.014896 0.005067 -0.009741 
+0.011042 0.008370 -0.011328 0.012131 0.002772 0.002368 
+-0.001636 -0.005455 0.002909 -0.011880 -0.004459 -0.002071 
+0.000820 0.004153 0.002899 0.006565 0.005176 0.004056 
+0.009023 0.007084 -0.004621 0.010424 0.013368 -0.003440 
+0.004565 0.006349 0.000922 -0.006348 0.004548 0.004447 
+0.005463 0.004843 -0.006425 0.011565 0.007414 -0.033621 
+0.014719 0.010199 -0.011359 0.012122 0.014427 -0.004377 
+0.016476 -0.000560 -0.007907 0.033607 0.016881 -0.014931 
+0.019633 0.013783 0.004975 0.010077 -0.002857 -0.006839 
+0.015864 -0.013613 -0.011903 0.011238 -0.007043 -0.010425 
+0.001302 -0.006257 -0.003057 0.007116 -0.000294 0.004050 
+0.001576 0.002359 0.021102 -0.007493 0.000301 0.013545 
+-0.000778 -0.004133 0.001192 -0.000822 0.005061 -0.003126 
+0.002814 0.009514 -0.018454 0.005724 0.012535 0.024360 
+0.006826 -0.001778 0.002202 -0.006499 0.026970 -0.008827 
+-0.000859 0.039610 0.004526 -3.960000 3.233333 1.813333 
+-4.497297 2.075676 2.908108 -4.930233 1.000000 3.598837 
+-4.661870 0.330935 3.079137 -0.029835 0.004227 0.004500 
+-0.020259 -0.004338 0.005117 -0.018391 -0.009966 0.016721 
+0.009823 -0.002096 -0.010568 0.010266 0.022893 -0.037973 
+0.001158 -0.005648 -0.003964 0.030455 0.015120 0.008820 
+0.010231 0.014330 0.008543 -0.004059 0.005955 -0.000024 
+-0.006412 0.002325 -0.011873 0.001652 0.001573 -0.015181 
+0.004023 -0.001985 -0.006376 0.002471 -0.000277 0.002370 
+-0.001825 -0.001503 0.003432 -0.002374 0.000019 -0.002533 
+-0.005129 0.001895 -0.001373 -0.006331 0.003995 0.001534 
+-0.006602 0.003326 0.003949 -0.001777 -0.004392 0.005881 
+-0.001824 -0.009969 -0.002843 -0.000007 0.000000 -0.006774 
+0.000531 0.002162 -0.007012 -0.002974 0.003935 -0.000499 
+-0.001131 0.002357 -0.000155 0.000586 -0.002183 0.000598 
+0.000829 -0.003754 0.002019 0.001287 -0.001880 0.003118 
+-0.001467 0.000179 -0.002793 0.003554 0.003443 -0.001390 
+0.005849 0.005862 0.001927 0.002534 0.000233 -0.000907 
+0.001015 -0.004041 -0.000476 0.002452 -0.007055 -0.000751 
+-0.000954 -0.003112 -0.000208 -0.000874 0.002276 0.004301 
+-0.002049 0.006284 0.006147 -0.006468 0.000899 -0.001389 
+-0.005739 -0.011283 -0.004140 0.000589 -0.022491 -0.017647 
+-0.005071 -0.025316 -0.034264 0.002877 -0.026029 -0.028693 
+0.011780 0.008158 -0.033613 0.012418 0.000969 -0.005212 
+0.005595 -0.001534 -0.002189 -0.010709 -0.007148 -0.007587 
+0.005299 0.003071 0.002126 0.022535 0.018984 0.004767 
+0.029020 0.036620 0.015811 0.007587 0.042202 0.027857 
+-0.000969 0.036305 0.019192 -0.005941 0.022182 0.019503 
+0.001323 0.001794 0.017816 0.004553 0.001651 0.006045 
+0.000001 0.007043 -0.004140 0.002626 0.003372 -0.014344 
+0.020901 0.009035 -0.016579 0.019900 -0.004098 -0.000436 
+0.001210 0.000172 0.000416 -0.004248 -0.025326 -0.001867 
+-0.008112 -0.016061 0.002466 0.005000 0.001579 -0.000526 
+0.004808 -0.007270 -0.005578 0.015351 -0.014137 0.004137 
+0.025000 -0.022274 -0.009172 0.001485 -0.014281 -0.005159 
+0.000451 -0.011632 -0.005285 0.006540 -0.005942 -0.006294 
+0.006735 0.001224 -0.007959 0.011857 -0.001404 -0.004751 
+0.007602 -0.002606 -0.002982 -0.007620 0.031743 -0.008870 
+-0.012090 0.060403 0.009415 -4.720000 4.000000 2.686667 
+-4.411765 2.579832 3.054622 -4.140222 1.549816 3.073801 
+-3.793103 0.831897 2.474138 -0.023147 0.003818 0.014146 
+-0.010290 0.002500 0.008061 -0.008018 -0.014684 0.021644 
+-0.005214 -0.025040 0.018522 -0.032406 0.039285 -0.008569 
+-0.002604 0.005966 0.001996 0.004790 -0.003577 -0.001344 
+-0.030486 -0.004085 -0.005262 -0.025814 0.005492 -0.013534 
+-0.002987 0.009310 -0.025126 -0.000350 -0.008581 -0.007538 
+-0.002517 -0.003674 -0.004674 -0.015203 -0.002994 0.010213 
+-0.000333 0.002272 0.000153 0.000194 0.004179 0.001191 
+0.003718 0.004099 0.001702 0.001163 0.002136 0.000290 
+-0.003936 -0.003241 -0.003076 0.000063 -0.005007 0.002822 
+0.000924 -0.007473 0.001511 0.004154 -0.004414 -0.003491 
+0.005359 0.000717 -0.000697 0.002019 -0.000878 0.000726 
+0.000022 -0.005836 0.002104 -0.000432 -0.001909 -0.002244 
+0.001196 -0.004029 -0.000994 -0.000748 -0.002033 0.001024 
+0.001707 0.000316 0.001836 -0.002502 0.001382 0.001335 
+0.003927 0.004883 0.002151 0.002290 0.000157 -0.002632 
+0.002377 0.002803 -0.003828 0.002923 -0.001088 -0.002296 
+-0.000870 0.000850 -0.002432 -0.000566 0.003659 0.003525 
+-0.006841 0.005414 0.004288 -0.003239 -0.002018 0.000051 
+-0.007657 -0.008311 -0.000669 -0.005304 -0.022853 -0.007273 
+-0.014092 -0.014472 -0.013247 -0.016815 -0.023171 -0.002669 
+-0.003037 -0.006182 -0.022991 0.023960 0.014723 -0.019082 
+0.008861 0.009747 -0.008846 -0.017206 -0.004054 -0.016643 
+-0.000622 0.009272 -0.001079 0.022505 0.032416 0.014940 
+2.254098 4.877049 2.418033 0.625000 5.173611 2.666667 
+-0.339506 4.172840 2.932099 -0.662722 2.798817 3.041420 
+0.002474 0.007059 0.029424 0.005862 -0.003369 0.019067 
+0.000046 -0.009885 0.007341 0.006080 0.014668 -0.006801 
+0.027046 0.031744 0.021244 0.052624 0.028666 0.006677 
+0.018341 0.002520 0.009348 -0.005498 -0.001471 0.000205 
+-0.001853 0.001670 -0.002899 -0.011853 0.013395 -0.000241 
+-0.003953 -0.000393 -0.009134 -0.009555 -0.001908 -0.008034 
+-0.011861 0.004505 -0.005474 0.004680 -0.008128 -0.000922 
+0.000950 -0.017392 -0.014121 0.002821 0.001509 -0.005169 
+0.002665 -0.001861 -0.000145 -0.001071 0.009643 0.006454 
+0.013988 0.006884 0.002490 -0.030639 0.034460 0.004714 
+-3.382609 4.739130 2.139130 -4.018349 3.807339 2.729358 
+-3.801917 2.821086 2.571885 -3.419453 1.951368 2.127660 
+-3.027668 1.071146 1.387352 -0.008671 0.009801 0.004363 
+-0.000820 0.001272 -0.001470 -0.003832 0.001246 0.003491 
+-0.005573 0.042343 0.023772 -0.005433 0.025391 0.015399 
+-0.000438 0.006893 0.002684 -0.008223 -0.002734 -0.000419 
+-0.011728 -0.007747 -0.000958 -0.003188 -0.002575 -0.002558 
+0.000826 0.003301 -0.009067 0.000141 0.001289 0.000536 
+-0.002617 0.009892 -0.004472 -0.003851 0.002715 0.003792 
+0.001804 0.002494 0.001926 0.006040 0.002392 0.002463 
+0.008035 0.004567 0.000896 0.003451 0.003070 -0.000234 
+-0.004020 -0.000001 -0.000699 -0.002717 -0.003105 -0.000349 
+0.002817 -0.002130 -0.000818 0.007277 -0.001679 0.002456 
+0.000862 -0.004633 0.001807 -0.004041 -0.006873 0.001765 
+-0.006013 -0.005267 -0.000037 0.000823 -0.003192 -0.005022 
+0.005214 -0.000579 -0.003863 0.004750 0.003490 0.000776 
+0.003999 0.007341 0.003004 0.005663 0.006191 0.002634 
+0.005181 0.003715 0.003660 0.009496 0.000227 -0.001065 
+0.002879 0.003074 0.001479 -0.001816 -0.001719 -0.000527 
+-0.003438 -0.003606 -0.000689 0.000185 0.000858 0.000578 
+0.001320 0.007978 0.001115 -0.005293 0.006422 -0.000069 
+-0.011506 -0.007333 -0.009494 -0.007877 -0.017392 -0.009106 
+-0.001903 -0.025378 -0.004858 -0.010671 -0.020061 -0.001970 
+-0.008889 -0.016586 0.007450 -0.001014 -0.006760 -0.003529 
+0.011594 0.019630 -0.025776 0.007824 0.015909 -0.019579 
+-0.002669 0.019213 -0.002283 2.024390 4.504065 1.959350 
+1.735632 5.856322 2.517241 0.860000 6.275000 2.720000 
+0.000000 5.524510 3.186275 -0.278075 3.930481 3.700535 
+0.127907 2.197675 2.941860 0.008631 0.006137 0.015456 
+-0.000257 -0.004088 0.006517 0.005550 0.004236 -0.007590 
+0.003638 -0.000658 0.012403 0.016450 0.008371 0.009937 
+0.170321 0.047434 0.038732 0.051433 0.013100 0.031680 
+0.011210 0.021087 0.016902 -0.002682 0.022061 0.004971 
+-0.014490 0.016594 0.004810 -0.015931 -0.001741 0.007567 
+-0.012311 -0.003577 0.001112 -0.011274 -0.004245 -0.002106 
+-0.005865 -0.027563 -0.018655 -0.003602 -0.022187 -0.012311 
+-0.000858 0.000614 -0.000098 0.002291 0.002253 0.004704 
+-0.009602 0.011514 -0.015317 -0.026214 0.044023 0.013169 
+-2.812500 5.223958 2.041667 -3.407801 4.436170 2.372340 
+-3.263636 3.442424 1.809091 -2.681818 2.461539 0.961538 
+-0.011666 0.017157 -0.000043 0.025465 -0.026235 -0.008566 
+0.049266 -0.009919 -0.013021 0.011577 0.032848 0.008797 
+0.000939 0.011663 0.003990 -0.003375 0.008208 0.000491 
+-0.006215 0.005431 -0.000751 0.001742 -0.004407 -0.000155 
+0.008272 -0.007285 -0.001535 0.002375 0.001606 0.001228 
+-0.002623 0.005087 0.005664 -0.001052 0.005148 -0.001288 
+0.002829 0.008359 -0.013612 -0.001332 0.003146 0.001698 
+0.002737 0.009249 0.003274 0.001352 0.002844 0.000372 
+0.002642 -0.002105 0.000716 0.001929 -0.001843 -0.000173 
+-0.000351 -0.000544 -0.000650 -0.001527 -0.001071 0.001187 
+-0.001838 0.000203 0.000228 -0.001045 0.000187 0.000225 
+-0.002429 -0.003560 -0.001047 -0.006629 -0.003430 0.002378 
+-0.001803 0.000762 -0.002624 -0.000986 0.003822 -0.000361 
+0.004112 0.006074 0.002131 -0.000243 0.005596 -0.001751 
+-0.000195 0.001145 -0.003246 -0.000768 -0.000024 -0.000370 
+0.001278 0.000968 0.000723 0.000000 0.001069 -0.005420 
+0.001810 -0.000860 0.000489 0.004466 -0.000385 -0.002836 
+0.003877 0.001053 -0.003441 0.001755 0.003345 -0.001487 
+-0.002127 0.002994 0.004492 -0.012262 0.001607 0.007209 
+-0.010739 0.002640 -0.003821 -0.005479 -0.010673 -0.002022 
+0.000030 -0.013465 -0.009877 0.002559 -0.014500 -0.003073 
+0.001831 -0.006810 0.005452 0.005829 -0.018291 0.023071 
+0.005731 0.046165 -0.036655 0.034757 0.090309 0.022102 
+0.010001 0.013160 0.014068 1.849673 4.013072 3.091503 
+2.111628 5.748837 2.897674 1.878543 6.704453 2.651822 
+1.183674 6.306122 3.004082 0.757282 4.728155 3.898058 
+1.237500 2.556250 3.431250 0.004624 0.003992 0.009702 
+-0.000329 -0.000774 0.002530 -0.004861 0.000296 -0.000388 
+-0.003330 -0.002330 0.004719 -0.002992 -0.003700 0.008307 
+0.002350 0.000733 0.001760 0.007988 0.001141 0.005898 
+0.001438 -0.000820 0.007645 -0.003115 0.000450 0.008653 
+-0.000646 -0.000905 -0.002652 -0.000365 -0.004667 -0.008451 
+-0.000378 -0.003132 -0.004932 -0.000376 -0.002753 -0.003219 
+-0.001565 -0.005525 -0.006306 -0.002946 -0.002433 -0.005588 
+-0.002265 0.001594 0.001328 -0.006385 -0.004036 0.010391 
+-0.010603 0.010957 -0.006126 -1.898089 5.363057 0.668790 
+-2.437500 6.007812 1.648438 -2.514658 5.342020 1.925081 
+-1.939799 4.003345 1.234114 -0.011529 0.022994 0.001750 
+0.004651 -0.008967 -0.004399 0.015852 -0.055333 -0.008095 
+0.008082 0.008924 0.006686 0.010551 0.001250 0.000771 
+-0.005855 -0.004176 0.001093 -0.008037 0.020048 -0.000320 
+0.005631 -0.006286 0.001031 0.007588 -0.026614 0.004099 
+-0.000873 -0.017616 0.002827 0.000656 0.002316 0.004896 
+0.003641 0.011134 -0.003983 0.003422 0.004840 -0.003552 
+0.001848 -0.001053 -0.001676 0.001341 0.000366 0.001414 
+0.004843 0.004421 0.003200 0.002745 0.003768 0.002305 
+0.000234 0.001126 0.000727 -0.001049 -0.000655 -0.002555 
+0.002225 0.006517 -0.001908 0.000012 0.002433 -0.001520 
+-0.001283 -0.001933 0.001669 -0.005309 -0.005013 0.000786 
+-0.000212 -0.003981 -0.000292 0.002757 -0.003133 0.000689 
+0.003203 -0.001660 0.002756 0.001713 0.001882 0.001036 
+-0.002000 0.000544 -0.000123 -0.001335 -0.000190 0.001360 
+0.002082 -0.000048 -0.006330 0.003514 -0.000391 -0.002009 
+0.001118 -0.001755 -0.001011 -0.000607 -0.004455 -0.003510 
+-0.000407 -0.003447 -0.001542 0.002820 0.001641 0.001161 
+0.004456 0.000864 -0.000845 -0.002035 -0.000189 -0.001042 
+-0.007117 -0.000677 0.000572 -0.007373 0.003020 0.006036 
+-0.003695 0.000906 0.006304 -0.004042 -0.005798 -0.000973 
+-0.002052 -0.017011 -0.007652 -0.000761 -0.013273 -0.007047 
+0.001544 -0.004060 0.000523 0.003842 -0.005666 0.008589 
+0.127044 0.064385 0.101218 0.003029 0.112517 0.066792 
+0.008561 0.004182 0.028155 1.165775 2.989305 3.545455 
+1.703180 4.575972 3.127208 1.933333 5.866667 2.568254 
+1.761246 6.079585 2.570934 1.452282 4.655602 3.153527 
+1.624339 2.830688 2.513227 0.000863 0.010431 -0.002863 
+0.004222 -0.000987 0.000226 -0.001663 -0.002489 -0.000486 
+-0.000056 0.001218 0.005614 0.000280 -0.002869 0.004358 
+0.002606 -0.000068 0.002769 0.005355 0.002854 -0.002010 
+0.004272 0.004089 -0.003812 0.001327 -0.000335 0.000590 
+-0.000649 -0.001888 0.003328 -0.000628 0.000271 -0.001451 
+-0.003011 0.000137 -0.001073 -0.006012 0.000070 0.002293 
+-0.006560 -0.001325 0.002723 -0.004464 -0.000427 0.000700 
+-0.003523 -0.006478 0.005644 -0.002336 -0.013349 0.009640 
+-0.010438 0.011653 -0.005707 -1.098039 5.916667 0.931373 
+-1.540000 6.796667 1.643333 -1.207120 6.087379 1.792880 
+0.281853 4.123552 1.131274 -0.001752 0.008739 -0.002455 
+-0.000094 -0.037199 -0.004944 0.001240 0.003994 0.001020 
+0.002256 0.000867 0.000240 -0.010750 -0.022346 0.005267 
+-0.016754 0.005840 0.003846 0.001487 0.016009 0.005562 
+0.009829 -0.019600 -0.003944 -0.002269 -0.030769 0.000407 
+-0.017954 -0.000117 0.005426 -0.007432 0.002932 0.003811 
+0.006160 0.003116 -0.001439 0.007168 0.002100 -0.004242 
+0.001031 -0.001180 -0.001415 0.001878 -0.002345 0.002250 
+0.003060 -0.001853 0.001210 0.002449 -0.001056 0.000028 
+-0.000419 -0.000681 -0.000404 -0.000184 0.000765 0.000268 
+0.000251 0.001426 0.001826 0.001223 0.001960 0.003917 
+0.000423 0.004231 0.000377 0.004529 -0.001318 -0.001149 
+0.002094 -0.003073 -0.002231 0.000396 0.001610 0.001145 
+0.003819 0.007236 0.000330 0.001984 0.006601 -0.002342 
+0.000835 0.002402 -0.002077 0.002621 0.000305 -0.001559 
+0.004183 0.003560 -0.002931 0.003134 0.002041 -0.000415 
+0.003797 -0.000343 -0.005025 0.002805 -0.006928 -0.003565 
+0.006044 -0.005518 -0.002642 0.000497 -0.000258 -0.000285 
+-0.005037 0.000833 0.003022 -0.002720 0.004440 0.001000 
+-0.004800 0.005317 -0.003987 -0.001428 0.002552 0.002603 
+0.002667 0.002837 0.000818 -0.002421 -0.005612 0.002840 
+-0.006615 -0.013402 0.003928 -0.005584 -0.001106 -0.001939 
+0.002183 -0.001084 -0.009357 -0.000109 -0.001203 -0.007709 
+-0.019466 -0.007874 0.000951 0.000934 -0.021074 0.020007 
+-0.001599 -0.013574 0.016236 0.720812 2.401015 2.685279 
+0.794479 3.877301 2.742331 0.860963 4.975936 2.371658 
+0.862928 5.538941 2.190031 0.867470 4.718875 2.377510 
+1.117647 3.397059 1.593137 0.001885 0.020009 0.002029 
+0.007077 0.004476 -0.002264 0.003167 0.007140 0.001205 
+0.006376 0.002674 0.004771 0.002605 -0.000493 0.004009 
+0.002110 0.001327 0.002521 -0.001476 0.001150 0.000588 
+-0.000855 -0.000498 0.000516 0.000828 -0.002825 0.001446 
+-0.000553 -0.003685 0.002735 -0.003808 -0.003758 0.001696 
+-0.003678 -0.005237 0.003831 -0.001746 -0.002622 0.000781 
+-0.000485 0.008160 -0.002665 0.000771 0.011965 -0.003593 
+0.002368 -0.004902 0.001318 0.003569 -0.017999 0.005472 
+-0.005189 0.015302 0.000920 -0.055556 5.984127 1.261905 
+-0.402941 6.997059 1.847059 0.071895 6.323529 2.091503 
+1.778761 3.694690 1.269912 0.006163 -0.004338 -0.007394 
+-0.007864 -0.026521 -0.004223 -0.003250 -0.014693 -0.002232 
+0.002964 -0.003673 -0.000469 -0.012960 -0.001735 -0.000115 
+-0.004880 0.009018 0.009796 0.009180 0.004379 0.004077 
+0.002984 -0.008759 -0.003276 0.001430 -0.001667 -0.001297 
+-0.008963 0.005037 -0.003926 0.006376 0.003494 0.000440 
+0.006961 -0.001777 -0.006864 0.005824 0.000156 -0.010340 
+0.000378 0.002657 -0.006234 -0.000520 0.000858 -0.001233 
+0.000518 -0.002435 0.000087 -0.000567 -0.005189 0.000042 
+-0.001325 -0.005914 0.001099 -0.001178 -0.005520 0.002055 
+0.000214 -0.003029 0.002292 0.000523 0.002407 0.000871 
+0.005528 0.004547 0.002925 0.003831 0.001735 0.003566 
+0.005693 -0.001768 0.001855 0.000416 -0.000045 0.000065 
+-0.006626 -0.000558 -0.000684 -0.004855 0.001137 -0.000439 
+0.003323 0.000656 -0.000592 0.008072 -0.001964 -0.000217 
+-0.000752 -0.000215 -0.002615 -0.003694 -0.004346 -0.001793 
+-0.001597 -0.001742 -0.002395 0.000429 0.004351 -0.005520 
+0.004658 0.004196 -0.005352 0.000249 -0.003322 0.000661 
+-0.001089 -0.006391 0.002888 0.000118 -0.001344 -0.000744 
+0.005702 0.004008 -0.005080 0.005912 -0.000084 -0.003462 
+0.000410 0.002215 0.002178 -0.001773 -0.007155 0.003502 
+-0.009404 -0.008947 0.005153 -0.010045 -0.003888 -0.002531 
+-0.004567 -0.006390 -0.007236 -0.000645 -0.004301 -0.003473 
+-0.001902 -0.004762 -0.006546 0.013044 -0.052197 0.020013 
+-0.006074 -0.016344 0.009437 0.000008 0.019784 0.015564 
+-0.311037 3.491639 1.906355 -0.416667 4.455555 2.005556 
+-0.441640 4.921135 1.889590 -0.265766 4.513514 1.864865 
+-0.001078 0.027279 0.020060 -0.003860 0.011828 0.008106 
+0.002072 0.006470 0.002223 0.000764 0.006295 0.000511 
+0.005615 -0.001252 0.001118 0.007190 0.002119 0.002077 
+0.002140 0.001094 0.001051 -0.000430 0.001713 0.000056 
+0.000311 -0.000366 0.001865 0.003107 0.000495 0.003971 
+0.003660 -0.000649 0.004146 0.001973 -0.001117 0.002681 
+0.003375 -0.000461 -0.001697 0.002625 0.002723 0.001859 
+0.005440 0.011809 0.000276 0.003473 0.009115 -0.001234 
+0.000071 -0.009718 -0.000682 -0.002618 -0.019117 -0.004606 
+0.003045 0.022123 -0.001008 0.405904 6.000000 1.276753 
+0.506849 6.613698 1.964384 1.114650 5.885350 2.528662 
+1.952607 3.033175 1.090047 0.010376 -0.009997 -0.003978 
+-0.001915 -0.016538 -0.001351 -0.007884 -0.004979 0.003034 
+-0.014119 0.002099 0.002037 -0.011810 0.004381 -0.004741 
+0.004522 -0.000360 0.000796 0.007124 0.005988 -0.004568 
+0.005844 -0.000288 -0.008894 0.003854 0.005327 -0.017044 
+0.000485 -0.002258 -0.012358 0.006703 0.004563 0.003145 
+0.001516 -0.005089 0.008674 -0.001140 -0.005368 0.000941 
+-0.002178 -0.001733 -0.004472 -0.002254 0.001786 -0.003743 
+0.000477 0.002829 -0.001035 0.002907 0.000969 0.000000 
+0.002354 -0.001656 0.001015 -0.001574 0.000610 0.001473 
+0.000752 0.002184 0.001389 0.002534 0.002868 -0.000897 
+0.006401 0.002093 -0.000072 0.002969 0.001145 0.003199 
+0.000845 -0.000046 0.000642 -0.003149 -0.001737 -0.002484 
+-0.007659 -0.003907 -0.002519 -0.005339 -0.008060 -0.001196 
+-0.002513 -0.006892 0.000121 -0.001333 -0.004832 -0.000840 
+-0.004005 -0.009924 -0.002863 -0.003939 -0.008939 -0.002121 
+-0.003189 -0.002557 -0.000181 -0.000297 -0.000636 -0.001532 
+0.000463 -0.000190 -0.001153 0.000799 0.000166 -0.004017 
+0.002054 -0.007132 -0.002918 -0.001307 -0.006207 -0.006515 
+-0.000670 -0.002527 -0.002982 0.000679 0.001135 0.001121 
+0.000741 0.001838 0.002085 0.000483 -0.000145 0.000941 
+-0.005983 -0.005114 -0.001483 -0.008597 -0.002558 -0.001357 
+-0.009041 -0.003315 0.000151 -0.005769 -0.003955 0.000204 
+-0.000953 -0.005238 -0.003193 0.008730 -0.000654 0.004578 
+-0.017536 -0.022065 0.004402 0.004612 0.037661 0.024644 
+-1.277533 4.048458 1.647577 -1.318182 4.664336 1.818182 
+-1.133080 4.817491 1.460076 -0.617977 3.915730 0.848315 
+0.002895 0.008283 0.009759 0.006677 0.001832 0.001784 
+0.002075 0.004276 -0.004455 -0.001143 0.008238 -0.003584 
+0.004362 0.001364 -0.000311 0.004177 -0.001645 0.003832 
+0.001762 0.000266 0.001075 0.002565 0.003837 -0.001202 
+0.002380 0.000922 -0.002860 0.003749 -0.003725 0.003583 
+0.004945 -0.000742 0.007022 -0.000089 0.001680 0.005063 
+0.001557 0.000468 0.000384 0.004853 -0.001833 -0.004072 
+0.002885 -0.002489 -0.004041 0.002099 -0.000120 0.000487 
+0.006238 -0.002025 0.000855 0.001431 -0.000455 -0.000394 
+0.011458 0.022610 -0.011116 0.628821 6.314411 1.681223 
+1.220497 6.378882 2.487578 1.904437 5.300341 2.825938 
+2.115578 2.663316 -0.351759 0.013596 -0.004631 -0.004737 
+-0.001396 -0.007168 0.003641 -0.006246 0.000700 0.006270 
+-0.008097 0.002218 -0.002471 0.000895 0.002821 -0.003890 
+0.001130 0.001992 0.004103 0.003177 -0.005592 -0.002474 
+0.003505 0.001794 -0.011483 0.004995 0.017288 -0.024675 
+-0.006726 0.004737 -0.013199 0.001494 -0.018771 0.006967 
+0.007701 -0.014763 0.005819 0.001884 -0.009312 -0.004937 
+-0.003553 -0.007818 -0.005799 -0.003869 -0.001910 -0.003815 
+0.000078 0.003474 -0.002489 0.003185 0.003232 -0.000039 
+0.003304 0.001085 0.000893 0.000080 0.000850 -0.000728 
+-0.000716 0.004476 -0.001432 0.001610 0.000955 -0.000973 
+-0.000595 -0.000292 -0.000256 0.001021 -0.001367 0.001986 
+0.001239 -0.001667 -0.003920 0.000006 0.000030 -0.009766 
+-0.003507 0.000969 -0.006713 -0.001811 -0.002349 -0.001617 
+-0.001300 -0.001968 -0.001151 -0.001623 -0.001697 -0.000934 
+-0.002648 -0.001442 -0.001295 -0.001297 -0.001793 -0.003169 
+0.000277 -0.002494 -0.004297 -0.001526 0.000388 -0.001821 
+-0.002312 0.001020 0.002117 0.001989 0.003188 -0.000821 
+-0.000139 0.003832 -0.007137 0.003797 -0.003211 -0.000778 
+0.001337 -0.002876 -0.002575 -0.002629 -0.002325 0.000048 
+0.000540 0.000001 0.000078 0.001388 0.000635 -0.001864 
+0.002987 0.005133 0.002763 -0.000098 0.002002 0.001637 
+-0.002290 0.000632 0.001176 -0.002338 -0.000809 0.003892 
+0.001726 0.004435 -0.000327 0.005889 -0.008356 -0.024251 
+-0.009316 -0.066095 -0.024255 -1.764045 2.157303 1.853933 
+-1.863014 6.410959 2.089041 -1.775281 6.123596 1.623595 
+-1.475000 5.612500 0.887500 -0.017034 0.025141 0.012335 
+0.016291 -0.008165 -0.002945 -0.003687 -0.001689 0.001141 
+0.002606 0.000670 0.000487 0.001017 0.015191 -0.008556 
+0.000531 0.008272 -0.001768 0.002367 -0.006202 0.005060 
+-0.001381 -0.007223 0.008561 -0.000888 -0.000959 0.002476 
+0.000894 0.000398 -0.002929 0.002461 -0.001090 -0.000472 
+0.000451 0.000682 0.001439 -0.005516 0.001998 0.005221 
+-0.005494 0.000276 0.006506 -0.001648 0.000154 0.003710 
+0.001091 -0.002925 0.001411 0.004405 -0.011192 0.003319 
+0.007073 -0.022416 0.010301 0.002330 -0.007632 0.008997 
+0.010009 0.026638 -0.024182 0.728477 6.960265 3.198675 
+1.531818 6.190909 3.690909 2.027523 4.321101 1.027523 
+-0.000925 -0.000031 -0.021553 0.013717 -0.011557 -0.005256 
+-0.008199 -0.005130 0.007962 -0.002232 0.005481 0.006457 
+-0.002243 0.007456 -0.002420 0.006647 0.009025 0.009247 
+0.003307 -0.004604 0.000332 0.004839 -0.010589 0.009470 
+-0.002501 -0.001203 0.010319 0.012420 0.008067 -0.015366 
+-0.003606 0.003487 -0.020770 -0.002329 0.001376 -0.002856 
+0.003718 -0.002454 0.001145 0.003697 -0.002981 -0.002526 
+0.002307 -0.002860 -0.003671 0.001677 -0.003030 -0.003901 
+0.001221 -0.004704 -0.002072 -0.001870 -0.001296 -0.002707 
+-0.003615 0.001990 -0.002991 0.003168 -0.002348 -0.004137 
+-0.002690 0.002188 -0.002644 -0.004177 -0.002196 0.002936 
+-0.004641 -0.004790 0.007746 -0.003052 -0.004461 0.004864 
+0.001663 -0.002087 0.000047 0.003880 -0.001116 -0.005710 
+0.000723 0.000931 -0.002126 0.003538 -0.004237 0.001156 
+0.005113 -0.002818 -0.002094 0.007805 -0.000484 -0.002081 
+0.001513 0.005415 -0.007220 0.002263 0.002580 -0.002859 
+-0.002213 -0.003230 0.002057 -0.003533 -0.004537 0.007809 
+-0.005609 -0.003314 0.005621 -0.003948 -0.001029 0.004090 
+-0.000459 -0.002368 0.002075 0.001762 -0.002140 -0.000315 
+0.003205 0.001709 -0.000812 0.003924 0.003139 -0.001220 
+0.002468 0.002299 -0.001703 -0.000143 0.001452 -0.000713 
+-0.000648 0.003295 0.002105 0.000001 0.000010 0.003529 
+-0.006264 0.001433 0.001041 -0.001713 0.005687 -0.000386 
+0.002894 0.013602 -0.002575 0.013394 0.011949 -0.008392 
+0.003988 0.004497 -0.005289 -0.007157 -0.074238 -0.005168 
+-0.012138 0.032658 0.014835 -0.014779 0.027615 0.013738 
+-0.015833 0.031490 0.017471 -0.012374 0.012511 0.015524 
+0.010541 -0.002077 0.001290 0.010112 -0.017252 -0.003482 
+0.004997 -0.006984 -0.002524 -0.001163 0.000781 -0.000095 
+-0.001080 -0.001544 -0.000185 0.001722 -0.007901 0.002792 
+0.001597 -0.006401 0.004735 0.000562 0.000648 -0.000610 
+-0.000996 0.001347 -0.003373 -0.001582 0.000869 -0.000585 
+-0.002742 -0.001543 -0.001715 -0.006535 -0.004853 0.002672 
+-0.003020 -0.005033 0.005122 -0.001200 -0.003141 0.000967 
+0.000318 -0.002596 -0.000023 0.002046 -0.010855 -0.000363 
+0.002940 -0.023281 0.000633 0.001720 -0.000230 -0.001015 
+-0.005904 0.053138 -0.006888 0.788991 7.146789 2.706422 
+1.342857 5.750000 2.528571 0.008654 0.000002 0.000381 
+0.000417 -0.004173 -0.023402 0.003525 -0.020413 0.019280 
+-0.018276 -0.019483 0.009876 -0.000059 0.001066 0.010280 
+0.006477 0.000742 0.007826 0.002021 -0.002511 -0.001157 
+0.003393 0.004377 -0.013730 0.003693 0.000216 -0.005286 
+-0.012121 0.004212 -0.001697 -0.005931 0.004503 -0.004807 
+-0.000243 0.000828 -0.003069 0.000857 -0.000201 0.000055 
+0.001590 -0.000266 0.001035 0.002287 -0.001183 0.002202 
+0.001457 -0.000982 0.000944 0.000579 -0.000078 0.000311 
+0.001473 -0.000047 -0.002137 -0.002357 0.002402 -0.001004 
+-0.002287 0.000507 -0.012326 0.002357 -0.000229 -0.002400 
+-0.004285 -0.008321 0.006615 -0.000808 -0.010111 0.001506 
+0.003155 -0.001710 0.001038 0.000614 -0.002511 0.000560 
+-0.001638 -0.001285 -0.003323 0.000295 -0.002600 -0.002650 
+0.002312 0.000948 -0.000134 0.002985 0.004337 -0.002814 
+0.003354 0.005750 -0.004440 0.000390 0.001913 -0.000283 
+-0.000573 0.000172 -0.007812 -0.001530 0.000486 -0.000192 
+-0.003106 0.001705 0.001705 -0.002311 0.000709 0.001675 
+-0.001313 0.000905 -0.002343 -0.000792 0.000440 -0.001765 
+-0.000843 -0.000615 0.003587 -0.002727 0.000000 0.001818 
+0.000161 0.005344 0.000388 -0.001010 0.004524 -0.000055 
+-0.001304 0.000916 -0.000590 -0.000842 -0.000609 -0.000694 
+0.000000 -0.000159 0.000000 -0.002037 -0.000395 0.000754 
+-0.003711 0.000309 -0.000991 -0.003376 -0.000811 -0.003162 
+-0.002824 0.001170 -0.002747 0.002836 0.003158 -0.002390 
+0.008965 0.003254 -0.006421 0.008325 0.011951 -0.010882 
+0.003295 -0.025795 0.006774 0.006314 -0.043102 0.003802 
+-0.002370 -0.020392 0.001993 -0.000832 -0.007598 0.014807 
+-0.001955 -0.000948 -0.001457 -0.000973 -0.003185 -0.002397 
+0.001616 -0.006175 -0.004740 -0.003428 -0.009007 -0.001630 
+-0.002338 -0.004847 0.000624 0.005616 0.003338 -0.000695 
+0.010003 0.009868 0.000892 0.005695 0.007456 0.002756 
+0.003412 0.001941 0.000941 -0.002192 -0.000789 0.002499 
+-0.002820 -0.002676 -0.000866 -0.001320 -0.006601 -0.003153 
+-0.002968 -0.004359 0.001265 0.001910 -0.001122 0.000713 
+0.002949 0.003117 -0.000347 0.002340 -0.002287 -0.000885 
+0.001693 -0.019182 -0.000224 0.001093 -0.015094 -0.002462 
+-0.005561 0.026950 0.011273 0.009339 0.059608 0.013233 
+1.117117 5.684685 -1.378378 0.001835 0.004237 0.003215 
+-0.006605 0.000212 -0.009726 -0.015844 -0.028215 0.031662 
+0.005216 -0.004703 0.004461 0.007280 0.005709 0.005652 
+0.009541 -0.004404 -0.001101 0.007104 -0.008463 -0.005262 
+0.011257 0.007230 -0.009426 0.000765 0.004169 -0.017775 
+-0.002318 0.003575 -0.007896 -0.002040 -0.000107 0.002881 
+-0.002599 -0.001213 0.006435 -0.003756 -0.001411 0.003938 
+-0.004489 -0.003300 0.000132 -0.003003 -0.002264 0.003079 
+-0.003751 -0.003149 0.002400 0.000085 0.001271 -0.000085 
+0.002324 0.007428 -0.000114 -0.001747 0.003538 -0.007251 
+-0.000724 -0.000361 -0.005062 0.002510 -0.003649 -0.001390 
+-0.003429 -0.006900 -0.000544 -0.000809 -0.007002 0.003189 
+0.001829 -0.001735 0.000385 0.000626 0.002302 -0.002090 
+-0.002893 0.003857 -0.003023 -0.001228 0.000653 0.001131 
+0.002084 0.000639 -0.001988 0.001261 -0.001957 0.000174 
+-0.002282 -0.005371 -0.001575 -0.000136 -0.001627 -0.000866 
+-0.000812 -0.002982 -0.002070 -0.002206 0.001397 -0.002206 
+0.001233 0.004238 -0.004763 -0.000589 0.000523 -0.005966 
+0.001188 -0.003122 -0.002879 0.001040 -0.001141 -0.000202 
+-0.002970 0.002030 -0.000939 -0.004841 0.001585 -0.002264 
+-0.002580 -0.000561 -0.003352 -0.001546 0.000590 -0.001509 
+-0.000012 0.001040 -0.000018 0.000385 0.001144 0.001150 
+0.000104 0.000104 -0.000208 0.001087 -0.002433 -0.003002 
+0.000176 -0.005338 -0.001783 -0.001019 -0.006552 0.001824 
+-0.001981 -0.007871 0.003346 -0.000651 -0.004520 0.003440 
+0.000585 0.004825 0.002578 0.001735 0.008342 0.003244 
+0.006430 0.002320 -0.001042 0.001588 0.000367 -0.001807 
+-0.005890 -0.002359 -0.000251 0.000728 -0.007755 -0.002240 
+-0.004026 -0.004845 -0.001249 -0.005682 -0.003100 -0.001161 
+-0.004876 -0.001508 0.001778 -0.001398 -0.001458 0.001382 
+0.001650 0.001909 -0.000837 0.001913 0.003004 -0.000156 
+0.000842 -0.001280 0.000152 0.000660 -0.005124 -0.001032 
+0.000485 -0.006114 -0.001776 -0.000453 -0.003918 -0.001114 
+-0.000548 -0.001533 -0.001589 0.000520 -0.001008 -0.003477 
+-0.000750 -0.004171 0.000195 0.001980 -0.001406 0.000873 
+0.004800 0.003999 0.000216 0.004506 0.002250 -0.001733 
+0.001492 -0.010120 -0.001968 -0.007244 -0.016468 -0.007866 
+-0.000451 -0.002110 0.011302 0.002070 0.018020 0.001068 
+0.006529 0.027092 0.009595 0.002734 0.012710 0.006899 
+-0.004665 -0.003647 0.006054 0.001840 -0.023030 -0.003174 
+0.007471 -0.002192 0.004788 0.009453 0.007012 0.000272 
+0.006957 0.001786 -0.002141 0.000114 -0.003254 -0.002409 
+-0.002328 0.000448 0.001745 -0.002189 0.002377 -0.001006 
+-0.000634 -0.000697 0.001244 -0.002310 -0.007946 0.004481 
+0.000685 -0.005510 0.008839 -0.002726 0.002076 0.004949 
+-0.001524 0.001429 0.002190 -0.001540 0.001828 0.000807 
+-0.001318 0.000325 0.002040 0.003787 0.003584 0.001487 
+0.001127 0.001348 -0.007865 -0.000106 0.004452 -0.008628 
+0.000801 -0.000858 -0.001439 0.003181 -0.000079 0.000775 
+0.000632 -0.002649 -0.002072 -0.000161 -0.000559 -0.002297 
+0.003773 -0.001395 0.001633 -0.002523 -0.002096 0.002588 
+-0.007310 0.000564 0.002891 -0.004947 0.003622 0.001431 
+-0.000510 0.000926 0.000409 -0.000179 -0.001120 -0.001382 
+0.000749 -0.002249 -0.000375 -0.002888 -0.002581 -0.000608 
+0.001278 -0.000145 0.002615 0.002739 0.001213 0.001095 
+-0.001163 -0.000791 -0.002279 0.000232 -0.003698 -0.003327 
+0.001955 -0.002482 0.002557 -0.000831 -0.001683 0.003838 
+-0.005171 0.003030 0.004646 -0.004505 0.001150 0.001774 
+0.000470 0.000368 -0.001465 0.006932 -0.000337 -0.001187 
+0.003409 0.002819 -0.000920 0.000231 0.001139 -0.003062 
+0.000534 0.003310 -0.002989 0.004022 0.000085 0.000587 
+0.003935 -0.000765 -0.006449 0.000667 0.002410 -0.001282 
+-0.003485 -0.000580 -0.001360 -0.001774 -0.001599 -0.000973 
+0.003228 -0.000783 0.003262 -0.004756 -0.003174 0.004229 
+0.001608 -0.001674 0.000285 -0.000679 -0.001350 -0.000128 
+0.002537 0.004870 -0.003704 0.005507 0.005114 -0.012352 
+0.008279 -0.003114 -0.009798 0.000710 -0.000548 -0.003109 
+-0.009311 -0.002560 0.007665 -0.008837 -0.009630 0.008724 
+-0.004573 -0.008002 0.002038 -0.001871 -0.006224 0.000562 
+-0.001288 -0.009435 0.001224 -0.000218 -0.011232 0.002491 
+-0.000180 -0.005872 0.002981 -0.000351 0.000341 0.001086 
+-0.000537 0.000981 -0.000370 0.000114 -0.001869 0.000583 
+0.000574 -0.003145 0.000679 0.000570 -0.000723 0.000486 
+0.000870 0.001009 -0.001216 0.002660 0.000489 -0.001616 
+0.005512 0.000064 -0.001063 0.002418 -0.001835 -0.000427 
+-0.003252 -0.009982 0.002779 0.006499 -0.012983 -0.000675 
+0.004740 -0.001290 0.000919 0.004016 0.003739 0.003708 
+-0.000171 0.004020 0.001381 -0.000685 -0.001519 -0.000814 
+0.002953 -0.005734 0.000012 0.006567 -0.004114 0.001572 
+0.004698 -0.002054 0.001192 0.001837 -0.005826 0.002422 
+-0.004309 -0.009724 0.005967 -0.002468 -0.006218 0.001476 
+0.002406 -0.001907 -0.000880 0.000402 -0.002119 -0.003401 
+-0.000365 -0.000527 -0.003861 -0.002600 -0.001302 0.000186 
+-0.001861 -0.003030 0.005882 -0.002457 -0.002781 0.007758 
+-0.002432 -0.000811 0.005152 -0.000596 0.002956 0.000248 
+0.004121 0.001463 -0.000443 -0.000684 -0.001254 -0.003222 
+0.000028 -0.001029 -0.002588 0.005395 0.000876 -0.002428 
+0.000579 -0.001921 0.000610 -0.000375 -0.001427 -0.000345 
+-0.000910 -0.001140 -0.000531 -0.003810 0.000019 0.000116 
+-0.005686 0.001050 0.000574 -0.003984 0.001199 0.001536 
+-0.002106 -0.000134 0.000584 -0.001683 0.000046 0.001025 
+-0.002611 -0.004543 0.001395 -0.005286 -0.004486 0.002612 
+0.005802 -0.001889 -0.005012 0.000834 -0.002707 -0.003261 
+0.000458 -0.000311 0.000087 0.004334 0.004199 -0.006772 
+0.000637 -0.001050 -0.003277 -0.000687 0.000297 0.000136 
+-0.001141 -0.000622 0.000207 -0.001066 0.002033 -0.000182 
+-0.001037 0.002767 0.000750 0.001696 0.000089 -0.000179 
+-0.000153 -0.005036 0.000732 -0.000068 -0.005725 -0.005184 
+0.011538 0.000438 -0.005623 0.015672 0.008683 -0.003495 
+0.013135 0.003619 0.000670 0.003187 0.005347 0.004267 
+0.000170 0.001651 0.000319 -0.002464 0.004194 -0.001594 
+0.000385 0.009225 -0.006466 0.001874 0.000784 -0.005117 
+0.002658 0.001318 0.001908 -0.001832 -0.001219 0.003599 
+0.000269 -0.001788 0.003356 0.010651 -0.000519 -0.004366 
+0.005709 0.000786 -0.000175 -0.001783 -0.002569 -0.004937 
+-0.002843 -0.002099 -0.002832 -0.008843 -0.004464 0.007386 
+-0.006984 -0.014781 0.013675 0.001592 -0.014626 0.005020 
+0.005885 -0.003312 0.002793 0.005428 0.003234 0.000651 
+0.000602 0.001930 -0.001256 -0.004024 0.001021 0.004535 
+-0.006249 -0.001661 -0.000790 -0.003695 -0.003539 -0.003727 
+-0.003942 -0.003242 -0.001673 -0.004049 -0.001885 0.000809 
+-0.000023 -0.002024 0.001543 0.006262 -0.002669 0.000613 
+0.010075 -0.000764 -0.000517 0.004615 -0.000002 -0.000140 
+-0.004721 0.000864 0.001000 -0.008582 0.001209 0.005615 
+-0.008412 -0.004949 0.009826 -0.003317 -0.003796 0.002750 
+0.000463 0.007622 -0.003197 0.002785 0.008743 0.000805 
+0.001593 0.003713 -0.000986 -0.001474 -0.006352 0.004562 
+0.001242 -0.005245 0.007536 -0.000163 -0.007041 0.000327 
+-0.000152 -0.009231 0.000922 -0.004235 -0.006373 0.000155 
+-0.000488 0.000831 0.001356 -0.000919 0.001497 -0.001336 
+0.003277 0.004896 -0.002474 -0.004549 0.000848 -0.001827 
+-0.000982 0.001672 0.001306 0.000526 0.000395 0.003810 
+0.004956 -0.000326 0.004597 0.001723 -0.002706 0.004182 
+-0.003506 -0.005333 -0.001402 -0.003482 -0.004278 -0.005957 
+0.003415 -0.000615 -0.006831 0.008397 0.001902 -0.001299 
+0.006182 0.002109 0.002359 0.000673 -0.001381 0.000935 
+0.002153 -0.002640 -0.000692 0.000543 -0.000501 0.000709 
+-0.002548 -0.001331 0.001406 -0.000984 -0.002951 0.001220 
+-0.002316 -0.003081 -0.001147 0.001872 -0.001070 -0.006349 
+0.005879 0.000306 -0.009277 0.002016 -0.005518 -0.002865 
+0.000823 -0.005417 -0.000091 0.000000 -0.001587 -0.001190 
+0.001603 -0.000874 -0.001920 0.004373 -0.000263 -0.000357 
+0.001565 0.000244 0.000060 -0.002164 -0.001754 -0.000175 
+-0.001301 0.000366 0.000854 -0.000493 0.000514 -0.000171 
+0.002181 0.002522 0.001818 0.003199 -0.000754 -0.001405 
+0.001583 -0.002064 -0.001598 0.000470 -0.003399 -0.001381 
+0.001766 -0.000400 0.000706 0.007476 0.000459 -0.001295 
+0.011439 0.003130 -0.008421 0.010865 0.014881 -0.003273 
+0.008798 0.010756 0.003005 0.007200 0.010695 -0.000331 
+0.003502 0.005053 -0.006609 0.002272 -0.000288 -0.000928 
+0.003569 0.003542 -0.001461 -0.000174 0.003957 -0.001690 
+-0.001903 0.003825 0.002047 0.136269 -0.014494 0.002893 
+-0.002039 -0.006887 0.014123 -0.018315 0.001732 0.008207 
+-0.002930 -0.000760 0.001032 0.004064 0.001234 0.004262 
+-0.005163 -0.011938 0.015809 0.001401 -0.011441 0.005217 
+0.004806 0.001613 0.001626 0.003976 0.007181 0.002444 
+0.000392 0.003190 0.001543 -0.000530 -0.001879 -0.002267 
+0.000020 -0.002313 -0.004720 0.001449 -0.003772 -0.005724 
+0.002633 -0.003318 -0.002814 0.002261 -0.000979 -0.000820 
+0.001387 -0.004421 0.001406 0.002700 -0.007930 0.006582 
+0.004221 -0.007217 0.012636 0.006870 -0.000256 0.001144 
+-0.001569 -0.000242 -0.002590 -0.006649 0.002176 -0.002839 
+-0.011337 -0.005923 0.004615 -0.005775 -0.001576 -0.003604 
+-0.001709 0.003154 -0.005847 -0.002237 0.001868 -0.003850 
+-0.002149 -0.001085 0.001811 -0.008930 -0.009264 0.011496 
+-0.002533 -0.011940 0.015912 -0.001931 -0.003552 0.008771 
+0.003170 -0.000282 -0.002246 0.005345 0.002420 -0.001046 
+0.000501 0.000261 0.000291 -0.004474 -0.004067 0.003486 
+-0.004882 -0.001015 -0.000749 0.000313 -0.000526 -0.000430 
+0.004414 -0.001649 0.000987 0.008210 0.003833 0.000821 
+0.002097 0.000471 -0.000743 -0.007469 -0.004432 0.000530 
+-0.006036 -0.005763 -0.004464 -0.003381 -0.000724 -0.006225 
+-0.001107 0.001302 -0.006545 0.002476 0.000762 -0.000952 
+-0.000605 -0.003428 -0.000639 0.000251 -0.002117 0.000283 
+-0.000310 0.000369 0.001095 -0.000670 0.000670 0.000335 
+0.001115 -0.000275 0.001329 -0.002456 -0.001470 -0.001079 
+0.000556 0.003153 -0.004264 0.000211 0.004620 -0.007351 
+-0.001919 0.001925 -0.001595 0.000233 -0.000079 0.000337 
+-0.000716 -0.004629 -0.004034 0.003586 -0.002123 -0.000371 
+0.001794 0.000316 0.002440 0.001348 -0.000154 0.003427 
+-0.000191 -0.003431 0.004478 0.001240 -0.001401 0.002005 
+0.000116 -0.000345 -0.000369 0.000322 0.002310 -0.001023 
+0.002784 -0.001800 -0.000311 0.002365 -0.001873 -0.001168 
+0.003800 -0.000080 -0.003640 0.001882 -0.000511 -0.003253 
+0.000407 -0.001757 0.001007 0.001377 -0.000620 0.001836 
+0.000522 0.000602 -0.001551 0.001318 0.009008 0.000912 
+0.003047 0.006440 0.003434 0.002347 0.001964 0.000501 
+-0.004714 -0.005289 0.003901 -0.002286 -0.000408 0.003714 
+0.000985 0.000836 -0.003808 0.000118 0.006382 -0.008718 
+-0.000238 0.008461 -0.005659 0.017538 0.013641 0.004444 
+0.011953 -0.019417 -0.001160 -0.009794 -0.043970 0.035545 
+-0.093287 -0.144972 -0.075112 0.010893 0.011047 0.005495 
+0.001427 -0.000715 0.002975 0.000305 -0.001124 0.001307 
+0.001750 0.003426 -0.000779 0.003853 0.005570 -0.000495 
+0.004105 0.003328 0.000296 0.002554 0.000001 0.000479 
+0.001297 -0.000461 0.000180 0.000368 0.000615 0.000037 
+-0.000505 0.001182 0.000001 -0.004099 -0.001491 0.003548 
+-0.010629 -0.006150 0.016707 -0.018117 -0.038292 0.048304 
+-0.247496 -0.175611 0.029322 0.017826 -0.002210 -0.087355 
+0.039077 0.009917 0.006572 0.006302 0.029663 -0.009414 
+-0.022970 0.030429 -0.016778 -0.005015 0.011837 -0.006314 
+-0.001281 0.003536 -0.000738 -0.005264 -0.007401 0.000839 
+-0.003517 -0.012050 0.004831 -0.000788 -0.009846 -0.002035 
+0.002200 -0.003394 0.005877 -0.000212 -0.000464 0.006374 
+-0.001296 0.000314 0.002478 0.003526 0.002491 0.001277 
+-0.000052 0.002957 0.000572 -0.000517 0.002661 -0.000961 
+-0.000440 0.004536 0.000364 -0.000615 0.003741 -0.000665 
+-0.000280 0.000112 0.000728 -0.002217 -0.000038 0.001280 
+-0.003727 0.000049 0.001402 -0.005262 0.000052 0.001650 
+-0.005620 -0.004666 0.002359 -0.003995 -0.005150 0.003576 
+-0.002431 -0.003291 0.000889 0.000846 0.000471 -0.003591 
+0.003540 0.000498 -0.006980 0.002493 0.001072 -0.005879 
+-0.000738 -0.001574 -0.001918 -0.004281 0.001080 -0.000480 
+-0.002617 0.000465 -0.001105 -0.003045 -0.002411 0.003147 
+-0.000253 0.001292 0.002078 -0.002756 0.000148 0.000836 
+-0.002091 0.000546 0.001022 -0.002067 -0.002881 0.001253 
+0.000484 0.000274 -0.002707 0.003937 0.000669 -0.001772 
+0.004004 0.002822 -0.001903 0.003417 0.000390 0.001490 
+0.001507 -0.000927 0.001673 0.000493 -0.001888 -0.000655 
+0.002775 -0.000120 -0.000885 0.000311 0.000175 -0.001651 
+0.000005 0.000325 0.000738 0.002125 0.000900 -0.000221 
+0.002154 -0.001728 0.000876 0.000387 0.000179 0.000924 
+-0.001105 -0.000414 0.002645 0.002040 0.000956 0.001569 
+0.002750 -0.000396 0.000356 -0.000313 0.003283 0.000893 
+-0.000582 0.003787 -0.000633 -0.003642 0.000476 0.000653 
+-0.002918 -0.001842 0.004863 -0.000691 -0.002524 0.000454 
+-0.000741 -0.000472 0.002540 -0.000205 -0.003739 0.003809 
+-0.003810 -0.015864 0.011530 -0.014495 -0.002020 0.006414 
+0.001503 -0.001369 -0.004688 -0.002256 0.000849 -0.003065 
+-0.001791 0.000766 -0.006877 0.005235 0.000241 -0.003073 
+0.001986 0.012057 -0.005967 -0.000450 0.002571 -0.003201 
+0.004030 0.002028 0.000335 0.006850 0.003338 0.000337 
+0.004295 0.003842 -0.001426 0.001714 0.003268 -0.002370 
+0.000982 0.002786 -0.002596 0.002009 0.002945 -0.003492 
+0.003862 0.001882 -0.003613 0.004862 0.002525 -0.005600 
+-0.006625 0.010954 -0.003868 0.006169 -0.004134 -0.005497 
+0.001747 -0.000337 -0.000694 -0.000479 -0.000878 0.002478 
+0.004991 0.001631 0.004291 0.017934 0.004484 -0.003739 
+0.003336 0.002264 -0.023646 0.000329 0.007959 -0.011005 
+-0.001946 0.005085 -0.001341 -0.005148 0.003144 0.005468 
+-0.003704 0.001460 0.014369 -0.006006 -0.000918 0.007519 
+-0.002279 0.001912 0.002290 -0.000701 0.000992 0.000348 
+-0.001442 -0.001149 0.000990 0.002922 -0.000115 0.002488 
+-0.003221 -0.001579 0.007517 -0.004640 -0.000794 -0.001003 
+-0.002534 -0.000224 -0.001764 0.001464 0.003961 -0.001907 
+-0.000486 0.002706 -0.001376 -0.003395 -0.001572 0.001639 
+-0.004000 -0.006084 0.001217 0.002234 -0.004468 0.005495 
+-0.000614 -0.005308 0.003780 -0.000916 -0.003217 0.000520 
+-0.000264 -0.001223 -0.001366 0.001715 -0.000882 -0.001789 
+0.004021 -0.001462 -0.003040 0.006606 0.003277 -0.004084 
+0.001397 0.003175 0.000698 -0.000385 -0.000175 0.000017 
+-0.000605 -0.001532 0.000685 0.000137 -0.002012 0.001267 
+0.002558 -0.003171 0.000556 0.002277 -0.004861 -0.000788 
+-0.003420 -0.002087 -0.000289 -0.002388 0.001293 -0.000639 
+0.000231 -0.000081 -0.000169 0.000672 0.001734 -0.000143 
+0.000561 0.006098 0.000200 0.002417 0.001224 0.001500 
+0.000651 -0.000575 -0.001963 -0.002849 -0.001788 -0.003788 
+-0.003883 -0.002090 -0.003625 0.001395 -0.003870 -0.002824 
+0.002918 0.002260 -0.001273 0.002449 0.001447 -0.005047 
+0.002061 0.004551 -0.002446 0.002170 0.002526 -0.000475 
+0.001665 0.001106 -0.001017 0.001142 0.001999 -0.003729 
+0.002332 0.002794 -0.003563 0.002021 -0.001080 -0.000035 
+0.001251 -0.000715 0.000401 0.002517 -0.000519 0.000002 
+0.003279 0.001353 -0.002131 0.004498 0.001679 -0.000689 
+0.000964 -0.002472 -0.001915 -0.001418 -0.007616 0.000306 
+-0.003204 -0.012575 0.005496 0.004751 -0.003614 0.011343 
+0.000556 0.000270 0.001552 0.000623 -0.001536 -0.001682 
+-0.003347 -0.002394 0.001117 -0.002335 -0.000303 0.006040 
+-0.001056 0.000039 0.002277 0.000476 0.000390 0.005183 
+0.006500 0.002671 0.009082 0.008884 0.007055 -0.002051 
+0.020690 -0.005633 0.002765 0.018704 -0.009340 0.007674 
+0.016484 -0.006551 0.004297 0.019178 -0.002247 -0.001996 
+0.021233 -0.008108 0.000703 0.083487 0.073929 -0.061676 
+0.010066 0.002990 -0.038522 0.004711 0.001836 -0.010724 
+0.000116 0.001239 -0.003637 -0.003586 0.002551 -0.002124 
+-0.000882 -0.000667 -0.002465 0.014039 0.012517 -0.017636 
+0.027330 0.001128 -0.004569 0.007445 0.023401 -0.011831 
+0.002672 0.012128 -0.000443 -0.004075 0.005640 0.001009 
+-0.003042 0.001589 -0.000692 -0.006718 -0.002683 0.003876 
+-0.001536 -0.004117 0.003359 0.000188 -0.003082 0.001204 
+-0.006058 -0.000383 0.003137 -0.001938 -0.002940 0.002724 
+-0.001250 0.000210 0.003825 -0.002365 -0.002257 -0.001446 
+-0.004457 -0.002663 0.000321 -0.000117 0.001468 -0.001401 
+0.002033 0.001163 -0.001536 0.003277 0.000293 0.001749 
+0.003596 -0.000111 0.005576 0.000467 -0.000233 0.008250 
+0.000417 -0.003840 0.002880 0.005984 -0.001756 -0.006244 
+0.007534 -0.001165 -0.009864 0.003680 -0.002528 -0.007584 
+-0.000987 -0.000699 -0.003277 0.000600 -0.000300 -0.004083 
+0.001184 0.007638 -0.002723 0.000374 0.003236 -0.002260 
+-0.002526 -0.003174 -0.000616 -0.006543 -0.002378 0.002078 
+-0.005236 -0.001428 0.000068 -0.001762 0.000406 -0.002878 
+-0.000882 -0.002276 -0.004409 0.000852 -0.003462 -0.003643 
+-0.000126 -0.000230 -0.000062 0.002093 -0.001115 -0.002005 
+0.002592 0.000212 -0.003299 0.004073 0.001090 -0.002295 
+0.000716 0.000061 0.001912 0.000257 -0.000930 0.001423 
+0.000146 -0.000121 -0.000330 -0.001575 -0.003823 -0.001489 
+-0.000165 -0.000088 0.000350 0.002331 0.000853 -0.001620 
+0.002482 0.004533 -0.006432 0.002873 0.002324 -0.007927 
+0.000855 -0.000128 -0.005681 -0.000413 -0.001553 -0.002589 
+0.000628 -0.000765 -0.002022 0.000168 0.000000 0.000168 
+0.002948 -0.000098 0.001468 0.005000 0.000048 0.000005 
+0.000209 0.000829 0.000353 -0.001451 -0.001944 0.000976 
+0.000948 -0.001814 0.000817 -0.002776 -0.006733 -0.000100 
+-0.003393 -0.005241 0.001830 -0.003727 -0.003425 0.002993 
+-0.007630 0.001808 0.004299 -0.001078 -0.001785 -0.000704 
+-0.005734 -0.002375 0.000993 -0.004669 -0.001507 -0.000294 
+0.000435 -0.000775 0.002229 0.001486 -0.001740 0.004436 
+0.001895 -0.001531 0.005193 -0.000297 -0.002699 0.004768 
+-0.001682 -0.004952 0.006533 0.005078 -0.004945 0.005509 
+0.010846 0.003047 0.004464 0.007834 0.007187 0.000074 
+-0.002870 -0.001242 0.001112 -0.019652 -0.002150 0.010479 
+-0.013831 -0.008389 0.014336 -0.003554 -0.004361 0.007413 
+-0.000267 0.000180 0.000792 0.000841 0.000270 0.000177 
+0.003794 0.003391 -0.005776 0.005870 0.009056 -0.011952 
+-0.002364 0.012917 -0.009852 -0.000887 0.002061 0.007981 
+0.000371 0.004048 0.000609 -0.000870 0.002296 -0.000414 
+-0.007739 -0.004113 0.001308 -0.004565 -0.005232 0.004917 
+-0.003160 -0.002313 0.007688 -0.000579 -0.000024 0.006350 
+0.000112 0.000382 0.000840 -0.004612 -0.001930 -0.000426 
+-0.001627 -0.001704 0.000138 0.000073 -0.000163 -0.000344 
+0.001246 0.001825 -0.004347 -0.000319 -0.001830 -0.007960 
+0.003017 0.005724 -0.009360 -0.000854 0.002506 -0.001823 
+0.000071 0.001638 0.003630 -0.004880 0.001441 0.002587 
+-0.004491 0.000570 -0.000205 -0.001867 -0.000135 -0.000585 
+0.000769 0.000085 0.000342 -0.000129 -0.000302 -0.000086 
+-0.000987 -0.000489 -0.001969 -0.003878 -0.000563 -0.003646 
+-0.003145 0.002484 -0.001242 -0.002072 0.000389 -0.000644 
+0.001060 0.000863 0.000618 0.001433 0.000667 -0.002182 
+0.001912 -0.000580 -0.002245 -0.000287 -0.002586 -0.003106 
+-0.000091 -0.003263 -0.000380 -0.000520 -0.003552 -0.000643 
+-0.003537 0.000392 0.003394 -0.002125 -0.000542 0.004500 
+-0.000308 -0.003867 0.003198 -0.001480 -0.003411 -0.000283 
+0.001290 -0.000333 0.000208 0.003814 0.001677 -0.001556 
+0.001145 -0.001337 -0.001783 0.000568 -0.000697 -0.000765 
+-0.002150 -0.002684 -0.000854 0.000557 -0.003179 0.000563 
+0.001320 -0.002778 -0.001289 0.000525 -0.002682 -0.001108 
+0.000148 -0.001141 0.000269 0.003610 0.001951 -0.001073 
+0.007967 0.000569 0.000000 0.001084 -0.003095 -0.000770 
+0.002279 0.002134 0.000714 0.003010 0.002738 -0.002483 
+0.001103 0.001132 -0.003565 0.000000 -0.000342 -0.001026 
+-0.000222 -0.001288 -0.000903 -0.002858 -0.002884 0.001226 
+-0.003394 -0.002109 0.002186 -0.002946 -0.002422 0.002382 
+-0.000778 -0.002224 0.001953 0.002069 -0.000833 0.001203 
+0.002076 -0.001384 -0.000692 0.002258 -0.003190 -0.005365 
+0.002042 -0.001962 -0.009855 0.004443 0.000104 -0.012994 
+0.007422 -0.000247 -0.017284 0.006515 -0.001322 -0.020113 
+-0.000194 -0.000632 -0.017976 -0.004129 0.000190 -0.011130 
+-0.000961 -0.000213 -0.004692 0.000802 0.000018 -0.002634 
+0.001762 0.002380 -0.001570 -0.002215 -0.002332 0.006450 
+-0.005849 -0.006513 0.004417 -0.002584 -0.005305 0.000785 
+0.000185 -0.002146 0.000971 -0.000751 -0.001531 -0.000068 
+-0.002741 -0.006398 0.004944 -0.000629 0.017626 -0.013597 
+0.008182 0.029679 -0.014801 -0.002969 -0.008592 0.005343 
+-0.003557 -0.003929 0.005605 -0.000230 -0.000951 0.000741 
+0.002029 0.005781 -0.003876 -0.000092 0.004210 -0.002132 
+-0.003035 -0.000996 0.004355 -0.002499 -0.000541 0.009187 
+-0.001837 0.001299 0.005728 -0.000650 -0.000867 -0.000534 
+-0.001672 -0.000506 0.001506 -0.003502 -0.002017 0.002500 
+-0.001474 0.001342 0.001910 0.004033 0.002689 -0.004144 
+0.005286 0.007379 -0.005042 0.003694 0.002420 -0.003535 
+-0.000089 -0.001929 0.001142 -0.003161 -0.003514 0.001226 
+-0.000153 -0.002870 0.000256 0.000000 -0.001416 -0.000973 
+0.000542 -0.001445 0.000902 0.000931 -0.000665 0.001048 
+0.000945 -0.000771 -0.001432 0.003842 0.000266 -0.002372 
+0.003918 -0.000272 -0.003224 0.002650 0.000085 -0.000342 
+-0.001080 -0.001440 -0.000583 0.000672 0.001052 -0.000496 
+0.003878 0.001082 -0.000955 0.001534 -0.002354 0.000820 
+-0.004032 -0.005605 0.002460 -0.006452 -0.002529 0.003407 
+0.001459 -0.000099 0.001103 0.001094 -0.000204 0.003524 
+-0.001110 0.001176 0.002874 -0.001806 -0.000743 0.000491 
+-0.001667 -0.001866 0.000311 0.000130 -0.000024 -0.000095 
+0.001613 -0.000317 0.001211 0.001770 0.001129 0.001038 
+0.003519 0.000617 -0.001321 0.000787 0.002059 -0.000067 
+0.000586 0.000441 0.000896 0.000577 0.001412 0.002541 
+-0.001028 -0.004001 0.003542 -0.002665 -0.001086 0.003677 
+-0.006231 -0.004762 0.001513 -0.005295 -0.002874 -0.001275 
+-0.002069 0.002352 0.000313 0.001334 0.006030 -0.002824 
+0.002418 0.007943 -0.003301 -0.000232 0.005853 -0.000947 
+0.000398 0.000879 0.000362 0.000275 -0.000864 -0.000786 
+-0.000093 -0.002882 -0.000809 0.001075 -0.004051 -0.000766 
+0.001822 -0.003048 0.000862 0.002639 -0.000916 0.003921 
+0.005461 -0.005566 0.003735 0.014110 -0.006551 -0.009268 
+0.007808 -0.003056 -0.019358 0.005585 -0.004718 -0.021693 
+0.006933 0.005200 -0.019744 0.000917 -0.004428 -0.012469 
+-0.005835 -0.004388 -0.010654 -0.015076 -0.007437 -0.006231 
+-0.013586 -0.007346 0.001831 -0.012741 -0.006745 -0.005385 
+-0.015363 -0.003721 -0.001795 -0.005636 0.003223 -0.001697 
+-0.033385 -0.008768 0.015512 -0.008090 -0.008383 0.002237 
+0.000172 -0.000932 -0.005598 -0.000419 0.001396 -0.003012 
+-0.003718 -0.004001 0.003281 0.000830 -0.001122 0.005787 
+0.012034 -0.008751 0.017435 0.008258 -0.003899 -0.005570 
+0.004955 -0.000942 -0.005931 0.001878 -0.001868 0.000234 
+0.000542 -0.002833 0.001976 0.001736 0.003421 -0.000766 
+0.005461 0.006951 -0.007605 -0.000056 0.003226 -0.008560 
+-0.000751 -0.000694 -0.004624 0.001014 -0.000970 -0.003108 
+0.000654 -0.000233 -0.004217 0.001726 -0.000376 -0.004352 
+0.001549 -0.000739 -0.003314 0.000547 -0.000799 -0.001176 
+0.000088 -0.000385 -0.000308 0.003318 0.002447 -0.001949 
+0.003261 0.002067 -0.001910 0.000165 0.000614 0.000351 
+0.000517 0.000284 0.000459 0.000259 -0.000372 0.001569 
+-0.000134 0.000092 -0.000344 -0.001298 -0.000939 -0.002641 
+-0.005607 -0.000635 0.004731 -0.002213 -0.000611 0.005914 
+0.000748 -0.001372 0.001695 -0.000243 -0.000459 0.000062 
+0.003433 0.000946 -0.002693 0.001203 0.001132 -0.002099 
+0.000403 0.000458 0.000119 -0.000744 0.000510 -0.000179 
+-0.001684 0.000034 0.000584 -0.000646 0.000204 -0.000023 
+0.002912 -0.000571 -0.000561 0.005122 0.000659 0.000264 
+0.004237 0.000966 -0.002181 0.003525 0.000229 -0.000613 
+-0.001685 0.000955 -0.000456 -0.001148 0.001095 -0.000926 
+0.003429 0.000037 -0.001082 0.001841 -0.000965 -0.003911 
+0.004356 -0.001941 -0.002343 -0.000615 0.001759 -0.000812 
+0.002268 0.003079 0.000097 -0.000968 0.000856 0.000976 
+0.000307 -0.000826 0.000865 0.000991 -0.000697 -0.000282 
+-0.000790 -0.000529 -0.000367 0.001217 0.002354 -0.000767 
+0.004455 0.006118 -0.000555 0.005046 0.005574 -0.001201 
+0.000624 0.002368 -0.000066 0.001755 -0.000845 0.001040 
+0.003349 0.000049 0.001754 0.002186 0.000942 0.001631 
+0.001908 -0.000746 0.000136 0.004086 -0.003553 0.000554 
+0.005097 -0.007482 0.006558 -0.001241 -0.005432 0.009161 
+-0.003702 -0.002860 -0.013053 -0.001775 -0.002874 -0.045077 
+0.000085 -0.000564 -0.028591 -0.007165 0.006836 0.022111 
+0.001293 0.010493 0.045394 0.003476 0.010215 0.054635 
+0.459016 -0.327869 5.295082 0.006902 0.002305 0.038700 
+0.009057 0.000753 0.022960 0.006770 0.000487 0.005752 
+-0.000017 0.002985 -0.014417 0.004195 0.000348 -0.014413 
+0.011480 -0.000292 -0.009891 0.009055 -0.002828 -0.008182 
+-0.000463 0.001812 -0.006640 -0.002958 -0.002532 -0.003534 
+-0.004616 -0.002178 0.002058 -0.004106 -0.004319 0.009154 
+-0.001029 -0.005156 0.010560 0.002316 -0.004894 0.006670 
+0.003208 -0.000967 -0.000456 0.001929 0.001218 -0.000251 
+-0.000881 0.001747 -0.000695 0.002809 0.004068 -0.000594 
+0.007465 0.003549 -0.007582 0.001984 0.004002 -0.005364 
+0.002413 0.000588 0.000978 -0.000365 -0.003411 0.004323 
+0.000112 -0.002700 0.005120 -0.000472 -0.001074 0.002737 
+0.000392 -0.000417 0.000565 -0.000270 0.000512 0.000633 
+-0.000022 0.001776 0.000014 0.001209 0.004371 -0.005254 
+0.001098 0.000912 -0.009495 0.003423 0.001824 -0.006495 
+-0.001011 0.000807 -0.000171 -0.002000 -0.000923 0.004506 
+-0.003509 -0.004102 -0.000024 0.003630 -0.000935 -0.003137 
+0.005955 -0.002861 -0.003063 0.003471 -0.001048 0.000464 
+-0.000245 -0.003936 0.002468 -0.000011 0.000007 0.002941 
+0.001594 -0.000794 0.001784 0.002883 -0.000275 0.000023 
+-0.000079 -0.000076 0.000309 -0.000408 0.000594 0.000521 
+0.000366 -0.000494 -0.000192 0.001406 -0.002109 0.000000 
+-0.002653 -0.003002 0.003632 -0.000110 -0.001510 0.003351 
+0.000651 0.000300 0.003104 -0.002645 0.000218 0.000272 
+-0.002643 -0.002726 -0.000671 0.000602 -0.002557 0.001655 
+0.005001 -0.002007 0.001105 0.005269 -0.002479 -0.003764 
+0.002220 0.002033 -0.003317 0.001651 -0.001680 0.000708 
+0.002839 -0.000694 0.000303 0.003851 -0.000888 0.001401 
+0.002091 -0.009416 0.001132 -0.005671 -0.005834 0.003473 
+-0.001738 -0.002667 -0.004405 -0.003436 -0.001866 -0.003095 
+-0.002927 -0.001569 -0.001625 -0.000975 -0.002326 -0.000966 
+0.000724 -0.002894 0.000794 0.000358 -0.000192 0.002243 
+0.001573 0.000820 0.003808 0.004299 0.000597 0.002993 
+0.001093 0.000650 -0.000180 -0.007000 -0.001860 0.000809 
+-0.021711 -0.005527 0.008327 -0.034937 -0.000273 0.010013 
+-0.036978 0.002768 -0.004121 -0.036350 0.002602 -0.012460 
+-0.034934 0.002802 -0.009270 -0.020971 0.003431 0.010498 
+-0.190789 0.421053 5.039474 0.676259 0.341727 7.532374 
+1.088398 0.190608 7.588398 1.372372 0.045045 5.867868 
+1.568966 -0.250000 3.025862 0.012435 0.004175 0.003335 
+0.019724 0.004501 -0.012627 0.022048 0.002358 -0.011898 
+0.020260 0.002649 -0.010565 0.020507 0.002864 -0.014400 
+0.018521 0.001963 -0.010785 0.010046 -0.007393 -0.001502 
+-0.002526 -0.009632 0.012585 -0.001640 -0.008418 0.009645 
+0.001003 -0.001130 0.003502 0.000303 0.001698 0.002424 
+0.000652 -0.003624 0.001490 -0.000515 -0.004022 -0.002651 
+-0.001997 -0.003022 -0.002039 0.004721 0.006497 -0.006167 
+0.005198 0.000569 -0.008398 -0.000067 0.000879 -0.001170 
+-0.003061 -0.003688 0.003793 -0.004654 -0.003266 0.007751 
+-0.001810 -0.002132 0.004899 -0.000453 0.001996 -0.002133 
+-0.000954 0.006687 -0.003502 -0.001647 0.004804 0.001555 
+0.000647 0.000082 0.002069 0.001954 -0.001694 0.001417 
+0.001318 -0.000884 -0.000959 -0.002748 -0.000252 -0.002678 
+-0.002576 -0.000995 -0.000363 -0.000277 0.002565 0.002725 
+-0.001399 0.000973 0.002455 0.000774 -0.000562 -0.000255 
+0.001857 -0.000750 -0.001695 0.000098 -0.000098 -0.000262 
+0.000297 -0.000722 0.003504 0.001917 -0.001621 0.004534 
+0.000966 -0.001569 0.003683 0.000870 0.000153 -0.001160 
+0.002443 0.002331 -0.000698 -0.001244 0.000947 -0.000305 
+-0.002162 -0.001077 -0.004535 -0.002692 -0.000305 -0.004951 
+0.001715 0.000129 -0.002186 0.002683 0.000568 -0.002612 
+-0.001538 0.001966 -0.000769 0.000881 0.002422 -0.000937 
+0.001346 0.002078 -0.000392 0.003032 0.000870 0.000088 
+0.003059 -0.000697 0.000654 0.000736 -0.002126 -0.000372 
+-0.001373 -0.001204 0.002577 -0.002518 -0.001082 -0.002474 
+-0.000438 0.002918 -0.000949 0.001228 0.003369 -0.001197 
+0.000539 0.000942 -0.000763 0.000648 -0.003164 -0.002037 
+0.001078 -0.002688 -0.001719 0.000476 -0.000961 -0.000571 
+-0.000015 -0.000933 -0.000604 0.002486 -0.001604 -0.002636 
+0.003255 -0.002507 0.000213 -0.001604 -0.004383 0.000945 
+-0.001736 -0.002964 0.000908 -0.012088 -0.001110 -0.003400 
+-0.017241 0.009268 -0.006985 -0.023924 0.011531 -0.005200 
+-0.032715 0.010593 -0.001870 -4.092024 -0.300613 -0.110429 
+-4.446237 -0.704301 -0.107527 -4.742718 -1.242718 -1.063107 
+-4.248848 -1.557604 -1.903226 -0.020730 -0.004410 0.006495 
+-0.174074 0.255556 3.981482 0.686636 0.403226 7.195853 
+0.932482 0.140511 7.638686 1.130518 -0.063340 5.953935 
+1.439614 -0.282609 2.574879 2.183183 -0.795796 -0.756757 
+3.108474 -0.793220 -2.172881 3.701195 -0.298805 -1.848606 
+3.595000 0.035000 -1.250000 0.028115 0.005477 -0.017852 
+0.026868 0.003927 -0.016358 0.018252 0.008009 -0.007096 
+0.002699 0.005568 0.001230 -0.001552 -0.007419 0.006510 
+-0.004096 -0.002865 0.002686 -0.002710 -0.001218 0.001452 
+-0.003611 -0.000961 0.004853 -0.001841 0.001900 0.004383 
+0.000543 -0.001162 -0.001055 0.001974 -0.001040 -0.001306 
+-0.000785 0.002924 -0.001149 0.001032 0.003017 -0.000156 
+-0.001604 -0.000432 0.001826 -0.000970 -0.001567 0.005118 
+-0.000845 -0.001549 0.004977 -0.002893 -0.003011 0.000945 
+-0.004152 0.003252 -0.001730 -0.001696 0.002500 -0.003571 
+-0.001413 0.000409 -0.003055 -0.001001 -0.001681 -0.003069 
+-0.001630 -0.003511 -0.002607 -0.002222 -0.003077 0.002051 
+0.000109 -0.001413 0.002061 -0.000164 0.003525 0.000574 
+-0.001379 0.006304 -0.001968 -0.001413 0.004587 0.001058 
+-0.000312 0.004498 -0.001300 -0.000230 0.004648 -0.001807 
+-0.000055 0.005069 0.001212 0.001069 0.003188 0.000849 
+-0.002391 0.000149 0.000427 -0.004374 -0.005041 0.001750 
+-0.002081 -0.001435 -0.000774 -0.000134 -0.002426 -0.002924 
+0.001736 -0.003659 -0.009148 -0.002903 -0.003624 -0.006286 
+0.001892 0.000566 -0.003691 0.007908 0.003277 -0.002874 
+0.011673 0.002748 -0.001524 0.008600 0.002867 -0.003417 
+0.001268 -0.001082 -0.000103 -0.005258 0.000958 -0.000763 
+-0.007406 -0.000312 0.000633 0.002420 0.002507 -0.004569 
+0.002242 -0.001853 -0.009072 0.001321 -0.003137 -0.005654 
+-0.001070 -0.003930 -0.000953 -0.000594 -0.001776 0.000675 
+0.000285 -0.000008 -0.000726 0.003451 -0.002474 0.000291 
+0.003688 -0.003643 0.002131 0.004651 -0.001504 0.002258 
+0.002332 0.001890 -0.003072 0.000520 0.002069 -0.000925 
+-0.003957 -0.000258 -0.000576 -0.002848 0.000976 -0.010480 
+-0.020374 -0.002193 -0.007412 -0.035744 0.009445 -0.006216 
+-4.605442 0.714286 -0.448980 -4.972973 0.437838 -0.572973 
+-4.607143 0.272321 -0.625000 -4.193548 0.012097 -0.334677 
+-4.315574 -0.409836 -0.385246 -4.889401 -1.004608 -1.511521 
+-4.700000 -1.426316 -2.505263 -0.020988 -0.014781 -0.002175 
+-0.432432 -0.034749 3.185328 0.075269 0.233871 5.389785 
+0.156098 0.087805 5.597561 0.333333 -0.149718 4.344633 
+0.011326 0.003540 0.008437 0.014968 -0.010280 -0.007112 
+2.553488 -0.548837 -1.800000 3.470085 0.431624 -1.782051 
+3.969298 0.864035 -1.894737 3.773684 0.605263 -1.742105 
+0.029359 0.002099 -0.012940 0.021824 0.004676 -0.009705 
+0.014107 0.009148 -0.008388 0.003626 0.006154 -0.003109 
+-0.011092 0.000640 -0.005306 -0.005759 -0.003101 -0.002555 
+0.001135 -0.000458 0.002320 0.003688 0.000976 0.004158 
+0.004293 -0.000384 0.000353 0.004226 -0.003418 -0.003274 
+0.005083 -0.002851 -0.005527 0.000000 0.000000 0.000000 
+0.005182 0.003520 -0.003781 0.005184 0.004371 -0.004015 
+0.003818 0.000000 -0.003091 -0.000989 0.000339 0.000534 
+-0.003351 0.001986 0.001122 -0.003278 0.003224 -0.003816 
+-0.001639 0.007653 -0.005557 -0.001603 0.003081 -0.001715 
+0.000976 -0.002074 -0.003722 -0.001172 -0.001303 0.002171 
+0.000400 -0.000236 -0.001999 0.003266 0.003703 -0.005029 
+0.001859 0.004020 -0.004558 0.000198 0.002249 -0.000709 
+-0.000455 0.002204 -0.000395 0.001411 0.003170 -0.000918 
+0.000458 0.000678 0.000915 0.001553 -0.002191 0.000425 
+-0.000110 -0.001883 -0.000702 -0.000034 -0.001047 -0.000924 
+-0.002556 0.002727 -0.004659 -0.001405 0.003217 -0.000990 
+0.002183 0.000569 -0.003625 0.000477 -0.001430 -0.003437 
+0.002554 0.004112 -0.000584 0.005078 0.000000 -0.000234 
+0.002704 0.002969 0.004719 0.001909 0.002441 0.005038 
+-0.000754 0.003870 0.001523 -0.004893 0.001254 -0.001070 
+-0.001106 -0.001445 0.004450 0.000480 -0.002179 -0.003655 
+-0.000734 -0.001911 -0.008033 -0.003257 0.001186 -0.004393 
+-0.000995 -0.001476 -0.000709 0.002203 -0.003729 0.001741 
+0.004605 -0.000589 0.000782 0.006725 -0.002552 -0.001165 
+0.005456 -0.001809 0.001823 0.003044 0.000583 0.000197 
+-0.005388 -0.001238 -0.000107 -0.012191 -0.001783 -0.001112 
+-0.009624 -0.007531 -0.006607 -0.023765 0.009932 -0.017844 
+-3.151899 1.348101 -1.905063 -3.767327 1.346535 -1.381188 
+-3.958159 1.251046 -1.004184 -3.751020 1.134694 -0.946939 
+-3.242009 0.990868 -0.917808 -0.023492 0.008045 -0.005535 
+-0.014861 0.007143 -0.001280 -0.013916 0.004404 -0.007074 
+-0.013851 -0.001932 -0.032942 -0.011188 -0.014813 -0.025047 
+-0.004714 0.000395 0.010822 -0.001973 0.002678 0.022777 
+-0.002476 0.000600 0.016874 -0.004240 0.001554 0.003712 
+-0.002910 0.002455 -0.010996 -0.007524 0.001822 -0.018389 
+-0.041751 0.005018 0.002786 -0.022687 -0.002991 0.013459 
+-0.003780 -0.000704 -0.004693 0.001774 0.005065 -0.008087 
+0.005057 0.003828 -0.001960 0.007941 0.004688 -0.002560 
+0.009945 0.007807 -0.005919 0.006828 0.007251 -0.005387 
+-0.010404 -0.002074 0.002431 -0.005163 -0.014230 0.005899 
+-0.001658 -0.004469 0.007973 0.002691 0.000963 -0.000646 
+0.002587 0.000009 -0.000101 -0.002477 -0.000622 0.000538 
+-0.002032 -0.002146 0.001084 -0.000312 -0.001257 0.001500 
+0.001176 -0.000143 0.002694 0.004676 0.001526 -0.000293 
+0.005549 0.001354 -0.003564 0.001026 -0.000322 -0.001239 
+-0.005838 -0.002055 0.003197 -0.004505 -0.002802 0.007005 
+0.000311 -0.003977 0.000877 0.001126 -0.004355 -0.000566 
+-0.002384 -0.006913 0.004529 -0.000473 -0.007929 -0.000338 
+-0.001657 -0.005570 0.004870 0.000603 -0.001939 -0.001498 
+0.007302 -0.001121 -0.004772 0.009948 -0.000419 -0.004188 
+0.004941 -0.005485 -0.002546 -0.001330 -0.004207 -0.004355 
+-0.002003 -0.003641 0.000095 -0.000058 -0.000041 -0.000018 
+0.001101 0.001335 0.000430 0.001549 -0.000883 -0.000829 
+-0.001360 -0.001133 -0.004766 -0.001667 -0.002024 -0.000913 
+0.000370 0.000899 -0.001085 0.001099 -0.000727 -0.003943 
+0.003466 0.001960 0.001150 0.001616 0.000631 0.002247 
+0.000150 0.000570 0.001129 0.000309 -0.002788 0.002009 
+-0.001386 -0.002838 0.001653 -0.000505 -0.000826 -0.001890 
+-0.002883 0.001313 -0.004689 -0.003283 0.001085 -0.007113 
+-0.004990 -0.002361 -0.005770 -0.002414 -0.001705 -0.004018 
+0.001496 -0.001575 -0.000079 -0.000067 0.002851 0.001259 
+0.003282 0.006146 0.000627 0.002323 0.003867 -0.001931 
+-0.002053 0.004017 -0.001022 -0.002608 -0.000388 -0.001247 
+0.001527 -0.002651 -0.001666 0.007248 0.000910 -0.002531 
+-0.005503 0.011460 -0.005936 -0.020545 0.017600 -0.016038 
+-3.448718 1.641026 -1.376068 -3.755906 1.500000 -1.145669 
+-3.307692 1.330317 -0.846154 -0.019055 0.010829 -0.006303 
+-0.001455 0.003963 -0.009311 0.009080 0.005940 -0.007077 
+0.008427 0.000637 -0.004060 0.008611 -0.004167 -0.005517 
+0.016300 0.002126 -0.003839 0.018295 -0.002611 -0.004730 
+0.014457 0.011713 -0.006991 -0.000090 -0.005551 -0.031737 
+-0.004693 -0.006123 -0.024830 -0.003534 -0.003070 -0.020871 
+0.000951 0.003953 -0.014470 0.000101 -0.001427 -0.000967 
+-0.010000 0.000272 0.000372 -0.009817 0.003020 0.001421 
+-0.006258 0.002790 0.001620 -0.003408 -0.000333 -0.004002 
+0.005874 -0.000045 -0.012874 0.008970 0.006156 -0.014131 
+0.001142 0.001731 -0.009513 -0.007305 -0.005264 -0.000258 
+-0.006832 0.004584 0.007958 0.002636 -0.000780 0.004954 
+0.000230 -0.001502 -0.001813 0.005720 -0.000395 -0.002873 
+0.004725 0.001183 0.000237 0.000270 0.003611 -0.000467 
+-0.000408 0.004138 -0.003616 -0.001096 0.002331 -0.008420 
+0.002278 0.001376 -0.009134 -0.000188 0.002272 -0.006245 
+0.001339 -0.000584 -0.001700 -0.001224 -0.000033 0.000348 
+-0.002688 -0.001075 0.000538 -0.003689 -0.006166 0.004111 
+-0.004435 -0.007984 0.006210 -0.002857 -0.006373 0.003770 
+-0.001022 -0.004682 -0.001370 0.002131 -0.001903 -0.002653 
+0.001097 -0.000584 0.003044 -0.000163 -0.003948 -0.000859 
+-0.002159 -0.002164 0.002134 0.000064 -0.000659 0.000978 
+0.003910 -0.001022 0.004151 0.000798 0.000447 0.004246 
+0.001705 -0.000883 0.002537 -0.002364 0.001363 -0.001936 
+-0.004687 0.001423 -0.000724 -0.002923 -0.001530 0.000944 
+-0.002068 -0.003915 0.003658 0.001642 -0.002831 0.002006 
+-0.000593 0.000579 -0.000148 -0.000282 -0.000522 -0.001414 
+0.004762 -0.000140 -0.002297 0.004922 0.001210 -0.002607 
+0.002813 0.001462 -0.001224 0.000591 0.000591 -0.000551 
+0.001154 -0.001425 -0.001889 0.003463 -0.002290 -0.001303 
+0.000396 -0.000010 0.000448 -0.001851 0.001754 0.002318 
+-0.003124 -0.001986 0.001869 0.001278 -0.004730 0.001585 
+0.002450 -0.003758 0.001824 0.000109 0.000874 0.000765 
+-0.000357 0.003442 0.001997 0.000619 0.004111 0.001600 
+-0.002570 0.003747 -0.003376 -0.001504 -0.001558 -0.002234 
+0.017499 -0.004294 0.000917 0.003764 0.014493 -0.005187 
+-0.002474 0.016011 -0.007226 -0.013362 0.015806 -0.016689 
+-0.019776 0.014262 -0.017075 -0.016779 0.012264 -0.010828 
+-0.005274 0.003160 -0.000631 0.013102 -0.000329 -0.001008 
+0.005338 0.010610 -0.002075 0.009923 0.005614 0.001751 
+0.004205 0.008124 -0.000964 0.012164 0.001966 0.000585 
+0.013757 0.000777 0.002715 0.007211 -0.001196 -0.001136 
+0.000523 -0.001690 -0.005240 -0.000722 -0.001958 -0.005546 
+0.004261 -0.000261 -0.003660 0.009324 0.001472 0.000090 
+0.004357 0.000576 0.001622 -0.003120 0.002033 0.001451 
+-0.005953 0.003542 0.002732 -0.005684 0.003040 0.002738 
+-0.004208 0.001331 0.001163 -0.001319 -0.000153 -0.001402 
+0.002569 -0.000860 -0.004694 0.005885 -0.000427 -0.005579 
+0.004850 0.000312 -0.003097 -0.002421 -0.000281 0.001015 
+-0.010203 -0.000710 0.002549 -0.006934 0.000403 0.000070 
+0.001234 -0.009470 0.000887 0.003835 -0.008889 -0.003594 
+-0.001744 -0.007197 0.000413 -0.004036 -0.002339 0.007173 
+-0.000512 -0.000189 0.003263 0.000207 -0.002066 -0.003445 
+0.001292 -0.004829 -0.004187 -0.001431 -0.003820 -0.001692 
+-0.000067 -0.002148 -0.001007 -0.000170 -0.002119 0.002800 
+-0.002248 -0.001989 0.000526 0.001135 -0.000723 -0.000767 
+0.001358 -0.001417 -0.002007 0.003186 -0.000353 -0.002373 
+0.003560 -0.001596 -0.000276 0.001828 -0.001953 0.003656 
+-0.003258 -0.001663 0.003266 -0.002529 -0.004140 0.001299 
+-0.004998 -0.006806 -0.000554 -0.009335 -0.006425 0.002667 
+-0.005988 -0.007813 0.003026 -0.001309 -0.003920 0.001443 
+0.000857 0.001091 -0.000233 0.000956 0.002431 -0.000902 
+0.000795 0.001008 0.000445 -0.000155 -0.000133 0.000009 
+0.000148 -0.002180 0.001108 0.001088 -0.003117 -0.000206 
+0.001711 -0.003067 0.001246 0.004522 0.000293 0.005122 
+-0.004559 0.000572 0.003802 -0.002140 -0.005687 0.005659 
+-0.002126 -0.005589 0.002263 0.000877 -0.005203 -0.000717 
+0.001784 -0.002423 -0.003662 0.002788 -0.002747 -0.003268 
+0.000005 -0.002203 -0.003795 -0.001274 -0.000885 -0.002623 
+0.000698 0.000725 -0.000155 -0.000079 -0.000658 0.001792 
+0.001381 -0.002302 0.001841 -0.002742 -0.002229 0.003120 
+-0.003183 -0.000600 0.000785 0.000105 0.001792 -0.000984 
+-0.002669 0.003471 -0.002899 -0.002148 0.000256 -0.001756 
+0.002767 -0.007694 0.002461 0.004898 -0.010599 0.003227 
+-0.000583 -0.005202 0.001402 -0.006247 0.001921 -0.002950 
+-0.005662 0.004035 -0.005422 0.000183 0.001078 -0.002053 
+0.003087 -0.003794 -0.003599 0.008202 0.000523 -0.006764 
+0.003447 0.004581 -0.003837 0.002090 0.004243 -0.002452 
+0.005321 -0.000351 0.001170 0.000915 -0.001012 0.004605 
+-0.001920 0.001661 0.002262 -0.005176 0.001044 -0.002299 
+-0.002189 -0.004463 -0.002944 0.000726 -0.005092 -0.004541 
+0.003850 -0.002942 -0.004283 0.005506 -0.002442 -0.001709 
+0.003686 -0.003196 -0.002787 0.004026 -0.003188 -0.003876 
+0.003097 -0.001715 -0.002782 -0.000297 -0.000851 -0.001172 
+-0.001276 -0.000850 -0.000941 0.000436 -0.001732 -0.001601 
+0.001377 -0.003441 -0.003439 0.005861 -0.001519 -0.002876 
+0.001256 0.000305 -0.002053 -0.002120 -0.001700 -0.001509 
+-0.004373 -0.003346 -0.000596 -0.005713 -0.005594 0.001429 
+-0.003819 -0.006739 -0.001206 -0.004299 -0.003369 -0.000151 
+-0.000771 0.001612 0.000783 -0.000181 0.003641 -0.001625 
+0.000150 -0.001272 0.000971 -0.001979 -0.004565 0.001422 
+-0.000402 -0.002323 -0.002362 -0.001137 0.003440 -0.001141 
+0.005718 0.002222 -0.005095 0.001904 0.002043 0.001988 
+0.002521 -0.000270 0.000819 0.003136 -0.002089 -0.001475 
+0.002079 -0.000542 -0.003868 0.004215 -0.002214 0.000357 
+0.005709 0.001341 -0.002562 0.001641 0.003672 -0.001328 
+0.000409 0.000498 0.002026 -0.000956 0.001001 0.004937 
+-0.001274 0.000298 0.001572 -0.001008 -0.001371 -0.001008 
+-0.001054 -0.001924 -0.004112 -0.003404 -0.002914 -0.000517 
+-0.002260 0.000057 -0.000906 0.000985 -0.003047 0.001250 
+-0.000356 -0.004157 0.001398 -0.000865 0.000286 -0.000772 
+0.000708 -0.004310 0.000892 0.000897 -0.003866 0.000789 
+0.002274 -0.002485 -0.003253 0.006798 0.000399 -0.003100 
+0.000338 0.000840 0.000571 -0.000281 0.000880 -0.000098 
+0.000170 -0.001006 -0.000505 -0.000795 -0.002557 0.000311 
+0.001837 -0.000967 0.001257 0.000953 -0.000041 0.001672 
+0.000146 -0.001606 0.003212 0.002250 -0.001513 0.001483 
+0.000946 -0.000514 0.002691 -0.000769 -0.000006 0.001950 
+-0.002315 -0.004461 -0.000885 0.000372 -0.004426 -0.002393 
+0.002332 -0.003011 -0.001420 0.000019 -0.000415 -0.001406 
+-0.000457 0.000796 -0.000768 -0.001898 0.001798 -0.002257 
+0.002508 0.006782 -0.007224 -0.000711 -0.003504 -0.003462 
+0.002648 -0.004030 -0.000252 0.004501 -0.004748 -0.000670 
+0.002803 -0.000081 0.001425 0.002727 -0.001350 0.001588 
+0.003589 0.001521 -0.004588 -0.000455 0.001996 -0.007254 
+0.000533 0.001724 0.000486 -0.002570 0.002336 -0.000289 
+-0.001428 0.001513 -0.000416 0.000290 0.001360 -0.001434 
+-0.000889 -0.000593 -0.003481 -0.000088 -0.000365 -0.003736 
+-0.000181 -0.001688 -0.005056 -0.001167 -0.004082 -0.004861 
+-0.006004 -0.003502 -0.001311 -0.005376 0.000347 -0.000892 
+-0.001365 -0.000952 -0.001692 -0.001159 -0.001161 -0.000230 
+0.001902 0.000755 -0.000865 0.004078 0.000090 0.000533 
+0.004470 0.001338 0.000473 0.002444 -0.000342 -0.000435 
+0.000910 -0.000302 -0.000239 0.000943 -0.000154 -0.000181 
+0.003396 0.000499 -0.002215 0.002993 0.002993 -0.004818 
+0.001553 0.000074 -0.002803 -0.000317 -0.000259 0.000393 
+0.002474 0.003266 0.001966 0.011138 0.003499 0.002370 
+0.009733 0.000815 -0.009527 0.004908 -0.003194 -0.005347 
+0.001017 0.001429 -0.001610 -0.001572 0.001954 -0.002094 
+-0.000124 0.000499 -0.001024 0.001192 -0.002548 -0.000489 
+0.001441 -0.000135 -0.000058 -0.002688 -0.000747 0.002211 
+-0.004168 0.000402 0.003797 -0.003206 0.001468 -0.000103 
+0.003492 0.000669 0.000112 0.008054 -0.000805 -0.002143 
+0.006327 -0.002007 0.000544 0.002920 -0.000956 0.001964 
+-0.000993 -0.001245 -0.000166 0.000458 0.000091 -0.000249 
+0.001280 -0.000640 -0.002560 -0.000033 0.000230 -0.004062 
+-0.003968 -0.001573 -0.001940 -0.001363 -0.001262 -0.000632 
+0.003219 0.000035 -0.000597 0.005206 -0.000675 0.000289 
+0.000000 -0.000615 -0.000692 -0.000005 -0.001208 -0.000885 
+0.000829 -0.001839 -0.000496 0.001482 -0.005624 0.004177 
+-0.002587 -0.008053 0.004527 0.001353 -0.005740 -0.001011 
+0.004850 -0.003452 0.000741 0.001688 -0.000792 0.001467 
+0.002736 -0.003876 -0.003419 -0.001374 -0.001270 -0.000260 
+-0.001730 -0.003460 0.001587 -0.003050 -0.001303 0.001225 
+-0.001018 0.000013 -0.000394 0.000387 -0.000228 -0.000015 
+0.001139 -0.000438 0.001382 -0.000510 -0.001293 0.003106 
+-0.000790 -0.001484 0.001129 0.000325 0.001485 -0.001822 
+0.000740 -0.000156 -0.003781 -0.000243 0.000251 -0.000764 
+0.000940 -0.000350 0.002341 0.000920 -0.002331 0.001717 
+0.000661 -0.000644 -0.000577 0.000581 -0.003467 -0.002578 
+-0.000002 -0.003640 -0.002145 -0.000327 -0.002244 -0.003224 
+0.006977 0.004186 -0.002791 0.005957 0.004424 -0.008337 
+0.005362 0.000851 -0.002582 0.002177 0.003248 -0.002463 
+-0.000961 0.001290 -0.001012 -0.000393 -0.001326 -0.000759 
+-0.001954 -0.002088 -0.002399 -0.005650 -0.001244 -0.002806 
+-0.006240 0.000442 -0.000995 -0.001898 0.000574 -0.001420 
+0.001080 -0.001529 -0.003405 0.002263 -0.001759 -0.004057 
+0.003145 -0.000806 -0.004758 0.000799 0.002236 -0.007507 
+0.000698 -0.001321 -0.006528 0.004763 -0.002229 -0.005857 
+0.006401 -0.001944 -0.005437 0.002586 -0.001798 -0.001305 
+-0.002655 -0.001189 -0.001543 -0.002479 -0.000802 -0.002161 
+-0.000772 -0.000951 -0.001337 0.004640 -0.000941 -0.001123 
+0.009610 0.002633 -0.007196 0.005968 0.004201 -0.009754 
+-0.000929 0.003410 -0.004604 -0.000908 -0.003343 -0.001605 
+-0.004830 -0.006197 0.003015 -0.004453 -0.006866 0.008275 
+-0.004156 0.001067 0.003805 0.001787 0.005511 -0.001398 
+0.002458 0.004632 -0.004087 0.001993 0.002500 -0.001993 
+-0.000580 0.001104 -0.002698 -0.000529 -0.000584 -0.004172 
+0.003679 -0.000897 -0.005993 0.001687 -0.002466 -0.001622 
+0.000551 0.001515 -0.003561 -0.001870 -0.002671 -0.000777 
+-0.001579 -0.004860 -0.002253 -0.001546 -0.003815 -0.002639 
+-0.000790 -0.002076 -0.002121 0.000437 -0.000037 -0.001642 
+-0.000039 0.000547 -0.000117 0.002528 0.000100 -0.000776 
+0.002689 0.000921 -0.002542 0.000827 0.000133 0.000347 
+0.000608 -0.002844 -0.000451 0.001535 -0.003465 0.002323 
+0.002798 -0.001493 0.000682 0.003086 -0.000784 -0.001240 
+-0.000279 -0.000014 -0.002523 0.000971 -0.002129 -0.002347 
+0.000331 -0.001353 -0.003773 0.002969 0.003970 -0.006262 
+0.005596 0.001901 -0.004294 -0.000182 0.003927 -0.001964 
+0.005900 0.001739 -0.001000 0.000732 0.001707 0.001463 
+0.005197 0.005075 -0.003342 0.004060 0.002728 -0.007600 
+0.002193 0.004112 -0.003187 -0.004606 0.000628 0.000568 
+-0.001821 -0.004903 -0.001307 0.002021 -0.006289 0.002413 
+0.004776 -0.004680 0.002007 0.004770 -0.001765 -0.001438 
+0.001751 -0.000784 -0.001915 0.001153 0.001228 -0.001855 
+-0.000626 -0.000328 -0.001744 0.001016 -0.001473 0.000764 
+0.001928 -0.003789 0.003437 -0.006360 -0.010820 0.003799 
+-0.002201 -0.006066 -0.007569 -0.000499 -0.009104 -0.005410 
+0.000559 -0.005685 -0.000927 -0.000244 0.001166 -0.003093 
+0.004321 -0.000291 -0.003805 -0.000810 -0.000888 -0.002976 
+-0.004079 -0.000152 -0.001571 -0.000578 -0.001101 -0.001334 
+0.002122 0.002446 -0.005039 0.003931 0.002135 -0.004673 
+0.001478 -0.000637 -0.001111 -0.003617 -0.003124 -0.000800 
+-0.004708 -0.002513 -0.001727 -0.003566 0.000774 0.004492 
+0.002065 -0.000736 0.002173 0.003448 0.002789 -0.002440 
+0.001170 0.003424 -0.001144 -0.001276 -0.001801 -0.000150 
+-0.001258 -0.003469 -0.002262 0.003405 -0.003141 -0.003288 
+0.006370 0.001373 -0.003941 0.004622 0.002336 -0.002308 
+0.000730 0.000258 -0.000329 -0.000646 0.000285 -0.000976 
+0.002778 0.002537 -0.004882 0.006461 0.005746 -0.008418 
+0.006312 0.003778 -0.008560 0.003548 -0.000195 -0.005257 
+-0.002031 -0.004382 -0.001976 -0.005342 -0.007142 0.002174 
+-0.009795 -0.006869 0.006801 -0.012063 -0.005461 0.011686 
+-0.009952 -0.001015 0.010991 0.000086 0.004269 0.002081 
+0.002417 0.004371 -0.003521 0.002320 0.003084 -0.003233 
+-0.002380 0.002033 -0.000979 -0.005747 0.003592 0.001580 
+-0.001660 0.000957 0.002884 -0.000394 -0.004167 -0.001072 
+-0.002842 -0.005689 -0.001704 -0.004662 -0.001260 -0.001688 
+0.000664 -0.000381 0.002559 -0.001823 -0.005086 -0.000256 
+-0.004020 -0.005671 0.002277 -0.004022 -0.007332 0.000458 
+-0.002938 -0.002586 -0.001242 0.002689 0.000352 -0.002930 
+0.006851 0.005341 -0.004031 0.006641 0.005153 -0.001718 
+0.001187 -0.002459 -0.005172 0.001825 -0.001825 -0.002555 
+0.002733 0.000171 -0.002450 0.000067 0.001584 -0.002733 
+0.000118 -0.000460 -0.001083 0.000055 -0.001585 0.002978 
+0.000000 0.000000 0.000000 -0.002022 -0.001749 0.000546 
+-0.000383 -0.001758 -0.000709 -0.002100 -0.002916 0.000117 
+-0.006322 -0.003394 0.002158 0.000413 -0.003512 -0.000868 
+0.005838 0.000271 -0.001487 0.003760 0.004038 -0.001427 
+0.000082 0.002866 0.001013 -0.002115 -0.001119 0.001871 
+0.001606 -0.003336 0.002102 0.000138 -0.004002 -0.001037 
+0.001548 0.003693 0.000317 0.002717 0.003094 -0.007685 
+-0.001166 0.001011 -0.003622 -0.001595 -0.000742 -0.000801 
+-0.000151 -0.001308 0.000569 -0.001059 0.003005 0.000255 
+-0.003654 0.005342 0.001971 -0.002513 -0.002136 -0.002149 
+0.005300 -0.005462 0.001196 0.006815 -0.007036 0.002321 
+0.003587 -0.005091 -0.000856 0.002853 -0.000187 -0.002667 
+0.000000 -0.003984 -0.003821 -0.001463 -0.004508 -0.002194 
+-0.001182 -0.001305 -0.003483 -0.001499 0.000323 -0.003320 
+-0.001189 -0.004994 -0.000714 -0.007116 -0.006931 0.000185 
+-0.003836 -0.000389 -0.003206 -0.003194 -0.000020 -0.004023 
+-0.000728 -0.000242 -0.000394 0.002766 0.000183 -0.000104 
+0.000669 -0.000238 -0.000886 -0.002735 -0.000151 -0.001171 
+-0.002120 -0.001270 -0.000005 0.000307 -0.000974 0.002220 
+0.001751 -0.000734 0.002768 0.001412 0.001243 0.000113 
+-0.000079 0.000455 0.000471 -0.001534 0.000094 0.002170 
+0.001376 -0.000569 0.003320 0.000234 0.002261 0.001834 
+-0.000370 0.000462 -0.003712 0.004478 0.001655 -0.006620 
+0.002286 0.000980 -0.006288 -0.000682 -0.001854 -0.005752 
+-0.000139 -0.000558 -0.005926 0.002425 -0.001824 -0.002225 
+-0.000750 -0.002889 -0.000864 -0.003412 -0.004368 0.001388 
+-0.003423 -0.003171 -0.000076 0.001137 -0.002639 -0.001718 
+-0.001101 -0.000637 -0.005548 0.000580 -0.001050 -0.007864 
+0.001556 -0.002759 -0.005664 0.001579 -0.001403 -0.003420 
+0.000811 -0.000135 -0.001838 0.000110 0.000484 -0.000405 
+0.000598 -0.000157 0.000327 0.000875 -0.000765 -0.000364 
+-0.002444 -0.002342 0.001120 -0.004308 -0.005719 0.002498 
+-0.003200 -0.006151 0.004488 0.000285 -0.003628 0.005335 
+-0.000109 0.001377 0.002645 -0.000087 0.001078 0.000691 
+-0.000140 0.003093 -0.002709 0.001486 0.001998 -0.002991 
+0.000457 0.001126 0.000302 -0.000183 0.000633 -0.000586 
+0.000413 0.002255 -0.001818 0.000329 0.000511 -0.002506 
+0.000285 -0.001317 0.002211 0.000514 -0.002492 0.005573 
+0.000557 -0.000662 0.004004 0.000434 0.001735 0.000424 
+0.001326 0.001505 0.000789 -0.001649 -0.000825 0.003421 
+-0.002000 -0.001667 -0.000667 0.002826 -0.002318 -0.001658 
+0.003731 -0.000166 -0.000938 0.000264 0.000307 0.000159 
+-0.003039 -0.001299 -0.002450 -0.003226 0.000104 -0.001450 
+0.001070 -0.001053 0.002614 0.001938 -0.004308 0.002692 
+-0.000102 0.000678 -0.000051 0.000684 0.003871 -0.000815 
+0.001005 0.003006 -0.000369 -0.003893 0.001946 -0.000973 
+-0.000791 0.002335 -0.002887 -0.000133 0.000284 -0.002221 
+0.002819 -0.003464 0.001208 0.003305 -0.009321 0.002550 
+0.004612 -0.004701 0.002347 0.001170 -0.001006 -0.000031 
+-0.002933 0.002149 -0.003035 -0.000164 -0.000611 -0.004724 
+-0.001433 -0.002268 -0.003521 0.000189 -0.002713 0.001215 
+-0.003864 -0.001550 0.000552 -0.005333 0.000885 0.000123 
+-0.003793 0.001398 -0.000569 -0.001004 -0.001109 -0.001297 
+0.001601 -0.002570 -0.000965 0.003394 -0.001861 -0.002517 
+0.002462 0.001504 -0.001782 0.001510 0.003774 -0.002441 
+0.004230 0.006573 -0.005011 -0.002368 0.003176 -0.000108 
+-0.003511 -0.000867 -0.004756 -0.001114 -0.001368 -0.002501 
+0.001034 0.001136 0.000087 0.003577 0.003426 -0.003959 
+0.004534 0.002627 -0.005290 0.001435 0.000497 -0.007558 
+0.000997 0.003423 -0.002997 0.003807 0.003768 -0.001388 
+0.002253 0.003187 -0.002473 -0.000344 0.002786 -0.003664 
+-0.001207 0.003281 -0.005171 0.004194 -0.000806 -0.000806 
+0.007250 0.004650 -0.007989 0.003988 0.000862 -0.006252 
+0.000573 -0.003425 -0.001787 -0.002681 -0.003700 0.001474 
+-0.003475 -0.001727 0.001078 -0.000416 -0.001620 -0.000827 
+-0.000942 -0.001547 -0.002937 -0.000644 -0.000344 -0.004318 
+-0.000097 -0.000941 -0.001728 0.000488 -0.003638 0.001318 
+-0.001861 -0.003905 0.006788 0.000802 -0.001511 0.004965 
+-0.002852 -0.007434 -0.000560 -0.006148 -0.002431 0.002718 
+-0.000043 -0.002369 0.004823 0.000000 -0.005909 0.003939 
+-0.001741 -0.000771 0.002711 0.001567 0.002239 0.000746 
+0.000939 0.001249 0.001171 -0.000368 0.000304 -0.000029 
+-0.000379 0.000884 -0.000945 0.001080 -0.000520 -0.000240 
+-0.001040 0.001172 -0.002774 -0.001197 0.001324 -0.002402 
+0.000872 -0.000425 0.000424 0.001265 -0.004694 0.004201 
+0.002928 -0.003733 0.008492 0.000111 -0.003629 0.000044 
+-0.002806 -0.000854 -0.000523 -0.002701 0.002204 -0.003803 
+-0.000167 0.001787 -0.007983 -0.002077 -0.001662 -0.002542 
+-0.004526 -0.004815 0.003724 -0.003014 0.000769 0.000861 
+-0.000996 0.007373 -0.000285 0.001853 0.007918 0.000899 
+0.003504 0.002292 -0.001185 0.002264 -0.003475 0.001698 
+0.000897 -0.000571 -0.000870 0.002605 0.002538 -0.006346 
+-0.000525 0.000020 -0.000089 0.000420 0.004169 -0.000224 
+-0.000004 0.000171 -0.000006 -0.000922 0.001181 -0.000085 
+-0.005607 0.004415 -0.004132 -0.004671 0.003000 -0.007891 
+-0.008698 -0.002537 0.002669 0.002113 -0.003376 0.004274 
+0.001143 -0.003178 -0.000612 -0.002800 -0.002648 -0.002119 
+0.000071 -0.000484 0.000079 -0.002398 0.002355 -0.001006 
+-0.001479 -0.001494 -0.001603 0.000702 0.001124 -0.003629 
+0.002222 0.000952 -0.003651 0.002076 -0.001790 -0.003543 
+0.003798 0.000060 -0.001988 0.004264 0.000678 -0.001502 
+0.001783 -0.000348 -0.000078 -0.000430 -0.001513 0.001720 
+-0.000059 -0.000025 0.000276 0.000885 0.002065 -0.003906 
+-0.000222 0.001500 -0.006530 0.000931 -0.000598 -0.004206 
+0.004880 -0.002736 -0.001424 0.005733 -0.005718 -0.002455 
+0.006713 -0.002137 -0.000151 0.002403 0.000539 -0.002305 
+-0.001481 -0.000538 -0.000820 -0.004024 -0.001620 0.002353 
+-0.001543 -0.000984 -0.001170 -0.000599 -0.004056 0.000980 
+-0.000923 -0.001398 -0.001007 -0.000680 0.000716 -0.001029 
+0.000965 0.000724 -0.000305 0.000191 -0.000084 0.000498 
+-0.000424 0.000127 0.000621 -0.000071 -0.002084 -0.000794 
+-0.001074 -0.002296 -0.001370 0.000912 0.000080 -0.002036 
+0.003386 0.001876 -0.001857 -0.000813 0.000336 0.000293 
+-0.002711 0.002324 -0.003388 -0.000576 -0.000245 -0.002466 
+0.000559 -0.000921 -0.002005 -0.000615 -0.002154 -0.002462 
+0.002162 -0.003401 -0.004577 0.001975 -0.000888 -0.006317 
+-0.001339 -0.001436 -0.002485 -0.000355 -0.002218 0.000466 
+0.000273 -0.000682 0.001119 0.001556 0.000402 0.000684 
+0.003075 0.000431 -0.000506 0.001978 -0.000885 0.000156 
+0.000407 -0.002652 0.000325 0.001671 -0.001612 -0.000459 
+0.001250 -0.000956 -0.000637 -0.000502 0.000355 -0.000188 
+-0.004097 -0.000678 0.000709 -0.005829 -0.002609 0.000402 
+-0.003594 -0.004141 0.000469 -0.002248 -0.002016 0.000000 
+-0.001513 -0.002024 0.000107 -0.002124 -0.002569 -0.001105 
+-0.001417 -0.003145 -0.000984 -0.000733 -0.000489 0.000733 
+0.002167 -0.000098 -0.000392 0.000538 0.000084 0.001076 
+-0.001211 -0.003252 -0.001190 0.000479 -0.001872 -0.002606 
+0.000675 -0.001518 -0.001889 0.000292 -0.001886 -0.001195 
+-0.004400 -0.001768 0.005304 -0.003658 -0.005336 0.001960 
+-0.001035 -0.000921 -0.000947 0.002072 0.002312 -0.000785 
+-0.002621 0.001962 -0.000854 0.000229 0.000773 -0.002825 
+0.002512 0.001151 -0.002215 0.002452 0.005376 -0.002667 
+-0.000926 0.008692 -0.004789 0.000860 0.007477 -0.006982 
+-0.000991 0.000014 -0.001358 0.001721 -0.000845 0.001947 
+0.003274 0.000024 0.002706 0.002149 0.001086 -0.000797 
+-0.002111 -0.000266 0.002352 -0.001634 -0.002065 0.005549 
+0.001548 -0.002336 0.000744 -0.001110 -0.001832 -0.002004 
+0.000617 -0.000718 -0.000134 0.006740 -0.000170 -0.003090 
+0.005250 0.004036 -0.008482 0.003341 0.005351 -0.007688 
+0.000050 0.006891 0.000067 -0.001175 0.002240 -0.000109 
+0.000240 -0.000800 -0.000560 0.001227 0.000098 -0.006626 
+0.001009 -0.001507 -0.007492 0.003278 -0.003752 -0.005793 
+0.005535 0.000128 -0.005509 0.001767 -0.001906 -0.002078 
+0.000559 -0.000671 -0.001570 0.000762 -0.001811 -0.003208 
+0.005116 -0.002501 -0.002084 0.005968 -0.001546 -0.002588 
+0.001680 -0.001155 -0.001995 -0.000397 -0.000278 0.000278 
+0.001236 0.003543 -0.000824 0.005771 0.004961 -0.002632 
+-0.001756 -0.000534 -0.002290 0.000775 0.002326 -0.003876 
+0.000867 -0.003351 0.002773 -0.001170 -0.006450 0.007032 
+-0.000756 -0.002070 -0.000942 -0.002046 0.000411 0.002319 
+0.001786 0.005387 -0.005072 0.002254 0.006757 -0.008635 
+0.000160 0.000560 -0.004068 -0.000256 -0.002248 0.004858 
+-0.003504 -0.000949 0.007956 -0.000909 -0.002064 0.000163 
+-0.001443 -0.000575 -0.002368 -0.000952 -0.002540 0.000952 
+-0.003823 -0.005119 0.000887 -0.003867 -0.006019 0.002914 
+-0.002600 -0.001861 -0.000188 0.001767 -0.001576 -0.000852 
+0.002669 0.000943 -0.000604 -0.001244 0.001294 0.000710 
+-0.002289 0.005873 -0.004184 -0.000326 0.004028 -0.003295 
+0.005733 0.000533 -0.001467 0.006328 0.003359 -0.002578 
+0.004643 0.003133 -0.002798 0.002687 0.001229 0.000307 
+0.004105 -0.001579 -0.001789 0.006916 -0.003485 -0.001729 
+0.006023 -0.003408 -0.003647 0.002174 -0.003014 -0.000954 
+0.000510 -0.001244 0.001590 0.001021 0.001955 -0.001517 
+0.005771 0.006541 -0.003518 0.000787 0.006659 -0.000860 
+-0.003052 -0.000315 0.000509 -0.001258 -0.001665 -0.002355 
+0.000793 -0.001771 -0.001404 0.001486 -0.001866 -0.001429 
+0.002581 0.000000 -0.001532 0.001774 0.001790 -0.003581 
+-0.000846 0.000259 -0.005061 -0.002356 -0.001180 -0.002598 
+-0.000289 -0.002075 -0.001308 0.000131 0.000409 -0.002612 
+0.006314 0.003066 -0.003959 -0.001166 0.008339 0.000149 
+-0.003205 0.013911 -0.007029 -0.004667 0.013385 -0.009382 
+0.006003 0.009818 -0.014757 -0.001995 0.002957 -0.008311 
+-0.002146 -0.001299 -0.003012 -0.000207 -0.001590 -0.001470 
+-0.000235 -0.000649 -0.000567 0.003083 0.000368 -0.003145 
+0.000262 0.000634 -0.003550 -0.000339 -0.000448 -0.003318 
+0.000173 -0.001235 -0.003262 -0.000509 -0.002126 -0.002293 
+-0.000229 -0.000397 -0.002226 0.000695 0.000313 -0.000573 
+-0.000469 0.001067 0.001309 0.001208 -0.000660 0.003952 
+0.003404 0.000764 0.001389 0.000979 0.001425 -0.001269 
+-0.000060 0.001651 -0.000418 -0.003960 -0.003219 -0.002080 
+0.001421 -0.002030 -0.004833 0.001301 -0.003066 -0.005850 
+0.000899 -0.002889 -0.001137 0.002570 -0.000514 -0.001215 
+-0.000994 -0.002598 0.000632 -0.004394 -0.004839 0.001758 
+-0.005447 -0.004787 0.000435 -0.002969 -0.002595 -0.000125 
+-0.000670 -0.000972 0.000090 -0.000750 -0.000380 -0.000367 
+-0.002226 -0.000469 -0.001083 -0.002803 -0.002500 -0.003106 
+0.002206 -0.002118 -0.001698 0.000607 -0.000829 0.000300 
+-0.000103 0.000735 0.001241 -0.000873 0.002962 0.000084 
+0.000397 0.004455 -0.004094 0.003840 0.003709 -0.006757 
+0.002189 0.001699 -0.005214 -0.000343 -0.001876 -0.002619 
+-0.002429 -0.002868 -0.000665 -0.000141 -0.004159 -0.001579 
+-0.000615 -0.002605 -0.002823 -0.002056 -0.000356 -0.002450 
+-0.003321 0.000744 -0.001833 -0.005134 -0.001274 -0.000309 
+-0.003019 -0.002873 0.000583 0.000917 -0.003427 -0.001323 
+0.001400 -0.001766 -0.003958 0.000419 0.000430 -0.005606 
+0.000752 0.002282 -0.004310 0.001937 0.000698 -0.002842 
+-0.000315 0.000876 -0.000933 -0.002651 -0.000502 0.000431 
+-0.001168 -0.000984 -0.000737 -0.001343 -0.000844 -0.001415 
+0.001353 -0.002328 -0.000466 -0.000971 -0.001860 -0.002670 
+-0.000896 -0.001868 -0.001920 -0.000982 -0.000792 -0.001249 
+0.000256 -0.000431 -0.000574 0.001102 -0.001102 -0.001102 
+-0.001017 0.000000 -0.001441 -0.002627 -0.004237 0.000000 
+0.000581 0.001485 -0.003616 0.001322 0.001379 -0.003793 
+-0.000157 -0.000787 -0.001102 0.005669 -0.000372 -0.000266 
+0.002292 -0.000929 0.000130 0.000250 -0.000381 -0.000081 
+-0.003108 -0.003709 0.002155 0.000281 -0.000841 0.001894 
+0.001637 0.001142 -0.004355 0.008965 0.006392 -0.003478 
+0.006531 0.006136 -0.009642 0.003638 -0.001637 -0.007154 
+-0.007191 0.012172 -0.010674 0.004524 0.007548 -0.011022 
+-0.002708 -0.001325 -0.001871 -0.000945 -0.000708 -0.001575 
+0.000274 0.000019 0.000566 0.000429 -0.001124 0.000593 
+0.000205 -0.001557 0.000615 -0.000039 -0.001258 -0.002083 
+-0.002270 -0.002805 -0.001887 -0.002409 -0.002068 -0.002535 
+-0.001801 0.000498 -0.004525 0.002063 0.001310 -0.005437 
+0.004648 0.002871 -0.002275 0.003956 0.003451 0.000355 
+0.002678 0.001167 0.002483 0.000067 -0.000180 -0.000112 
+0.000381 -0.001058 -0.000334 -0.000793 0.000051 -0.001387 
+0.000260 0.003142 -0.002092 -0.003005 0.003445 -0.001564 
+-0.001693 0.004028 -0.000822 -0.000216 0.001623 0.000110 
+-0.002860 -0.001189 0.000202 -0.001628 0.000078 -0.000078 
+-0.000058 0.002057 -0.002051 0.001088 0.001812 -0.003081 
+0.000626 -0.003129 -0.001270 0.002491 -0.005575 0.003676 
+-0.002908 -0.001939 0.003740 0.000269 0.000434 0.000063 
+-0.000926 -0.000291 -0.002434 -0.002565 0.000243 -0.004193 
+-0.001595 -0.004504 -0.003988 -0.001822 -0.007397 -0.000708 
+-0.005381 -0.005459 0.003743 -0.003546 -0.003530 0.003553 
+-0.000833 -0.002450 -0.000064 0.001779 -0.001821 -0.001793 
+0.000079 -0.000989 -0.001552 -0.001084 -0.002040 0.001090 
+-0.000989 -0.002842 0.001092 0.000453 -0.001360 -0.001439 
+0.001025 -0.000650 -0.003008 0.001891 0.000846 -0.001468 
+0.000589 0.000589 -0.000236 0.000865 -0.001009 0.000317 
+0.000802 -0.001321 -0.001344 -0.001154 0.000216 -0.001976 
+0.000253 0.002060 -0.001621 0.002683 0.001203 -0.004209 
+0.001478 -0.000319 -0.003074 -0.000543 -0.000552 -0.001684 
+-0.004116 -0.000675 -0.001315 -0.004427 0.000076 -0.001858 
+-0.002484 -0.000726 -0.001645 -0.001410 -0.000118 -0.000767 
+-0.001054 0.000070 -0.000170 -0.000564 -0.001503 -0.002879 
+-0.001587 -0.002381 -0.001984 -0.000795 -0.002167 -0.001192 
+-0.000741 -0.001471 0.000733 0.001098 -0.002115 0.001066 
+0.002077 -0.001906 -0.000259 0.003411 0.000780 -0.002656 
+-0.000938 0.000188 0.000894 -0.003368 -0.006713 0.002230 
+-0.001281 -0.005354 -0.000801 0.001139 -0.001806 -0.000400 
+0.005231 0.000000 -0.002308 -0.000491 0.000026 -0.000956 
+0.000200 -0.000150 -0.005078 -0.001673 0.001407 -0.001761 
+-0.000383 -0.001553 0.000975 0.000065 -0.004823 0.004153 
+-0.001062 -0.002079 -0.000324 -0.001057 0.001585 -0.007043 
+-0.004133 0.011423 -0.011665 0.004106 0.010804 0.000864 
+0.000085 0.001762 0.001040 -0.002431 -0.001373 -0.001129 
+-0.001283 -0.001038 -0.000691 0.001450 -0.001119 -0.001187 
+-0.000276 -0.000517 0.001794 0.000622 -0.002441 0.001797 
+-0.001926 -0.001498 0.001364 -0.003169 -0.003464 0.003423 
+-0.003136 -0.005942 0.004949 -0.006842 -0.004768 0.002627 
+-0.001801 -0.005172 -0.001085 0.002863 -0.004274 -0.003803 
+0.000962 0.002243 -0.002403 0.001653 0.000308 0.000112 
+0.001333 -0.000552 0.003311 0.001957 -0.000435 0.002269 
+0.002161 0.001907 -0.001780 -0.001633 0.004000 -0.001400 
+-0.001417 0.003822 -0.002373 0.001496 0.002790 -0.001362 
+0.001578 0.000929 -0.003081 0.000962 0.001335 -0.003499 
+-0.000033 0.001871 -0.002987 -0.002855 -0.000995 -0.001263 
+-0.005238 -0.004136 0.000119 -0.007131 -0.003197 -0.001721 
+-0.001459 0.001824 0.001220 -0.000801 0.001567 -0.000089 
+0.001182 0.002914 -0.003379 0.002840 0.000292 -0.004302 
+0.001910 -0.002961 -0.001815 -0.002432 -0.004232 0.000267 
+0.000317 -0.001663 -0.001900 -0.001288 -0.004691 0.001902 
+-0.000886 -0.002585 -0.000554 0.002071 -0.001924 -0.001833 
+-0.002115 -0.000278 -0.001923 0.001033 -0.000970 -0.003931 
+-0.000708 -0.003529 -0.001629 -0.002381 -0.005681 -0.003095 
+0.002201 -0.007367 -0.001213 0.000223 -0.005615 -0.003198 
+0.000878 -0.002827 0.000342 -0.002283 0.000570 0.000950 
+-0.005859 -0.004375 0.002891 -0.004472 -0.005289 -0.002400 
+-0.001853 -0.002114 -0.002619 -0.000407 -0.000401 -0.001124 
+-0.002190 -0.000495 -0.000520 -0.005155 -0.000841 -0.000069 
+-0.005965 -0.000179 0.000172 -0.003923 0.000995 0.000545 
+-0.000968 0.000692 0.000251 0.001090 -0.003271 0.000000 
+0.001642 -0.002388 -0.001567 -0.000412 -0.003894 0.000062 
+-0.000483 -0.001691 0.000160 -0.000508 0.000000 0.001864 
+-0.001739 -0.000054 0.003560 -0.000288 0.001991 0.003059 
+0.001202 0.000538 -0.000221 0.002104 -0.000187 -0.000731 
+0.001439 0.002924 0.000192 -0.000700 0.005372 -0.000963 
+-0.000190 0.002162 0.000327 0.002212 -0.000507 0.001191 
+0.003038 -0.000351 -0.000194 0.002113 0.000005 -0.002151 
+-0.001688 0.004272 0.000448 0.002490 0.006138 -0.003503 
+0.001656 0.000762 0.000188 0.001910 -0.000826 0.002315 
+0.001700 0.000756 0.001464 0.001375 0.012951 -0.000147 
+-0.002757 0.014824 -0.005661 -0.006255 0.006902 -0.002674 
+-0.003726 -0.003408 0.000767 0.002140 -0.005981 0.002873 
+0.001791 -0.003753 -0.000206 0.002418 0.005101 -0.005498 
+-0.001056 0.003561 -0.006971 -0.002550 0.001324 -0.006048 
+0.001779 0.000023 -0.004826 0.000978 -0.002543 -0.003934 
+-0.000900 -0.001537 -0.000988 -0.001965 -0.000657 0.000873 
+-0.001785 0.000378 0.001045 -0.000751 -0.000226 0.000084 
+-0.001881 -0.002052 0.000385 -0.004716 -0.004269 0.003059 
+-0.005743 -0.003939 0.003539 -0.001696 -0.000429 -0.000214 
+0.002572 0.004257 -0.007124 0.004274 0.005983 -0.009402 
+-0.003311 0.001980 -0.005303 -0.002404 0.000292 -0.001338 
+-0.002612 -0.002077 0.000280 -0.001416 -0.001378 0.002803 
+-0.000319 -0.001721 0.000043 0.002610 -0.000393 -0.000173 
+0.003635 -0.000694 -0.002594 0.000773 0.000137 -0.001172 
+-0.002435 0.002366 0.001029 -0.000016 0.004189 0.001433 
+0.000933 0.005022 -0.003934 0.002237 0.005697 -0.002475 
+0.002841 0.001215 -0.001338 0.000352 -0.003614 0.001279 
+0.000526 -0.005263 0.001579 -0.001511 -0.002756 0.000166 
+0.001382 -0.000488 -0.001626 0.002188 -0.000461 -0.002117 
+-0.000376 -0.002201 -0.000732 -0.000087 -0.002341 -0.003439 
+0.000013 -0.001991 -0.002317 -0.001071 -0.002448 -0.000758 
+-0.001403 -0.005171 0.001414 -0.003476 -0.006471 0.002979 
+-0.001629 -0.005329 0.004001 -0.001156 -0.001793 0.001015 
+0.000192 -0.000064 -0.001120 0.000286 -0.000536 -0.000425 
+0.000413 -0.001513 0.000034 0.002785 -0.000294 -0.000696 
+0.003383 0.000247 -0.003136 0.001992 -0.001959 -0.000584 
+0.001154 -0.002956 -0.001779 -0.001007 -0.000431 -0.000233 
+-0.003301 -0.000207 0.004640 -0.002952 0.001234 0.004669 
+-0.001667 0.000152 0.002045 -0.001933 0.000043 -0.000462 
+-0.002176 0.000443 -0.002709 -0.000595 0.001444 -0.002703 
+0.000931 0.000522 0.000817 -0.001546 -0.002309 0.004236 
+-0.001592 -0.003563 0.005218 -0.000791 -0.001872 0.004272 
+0.005908 0.002736 -0.006617 -0.005878 -0.004915 0.003482 
+-0.012959 -0.012629 0.011419 -0.013768 -0.012299 0.014743 
+-0.006649 -0.009646 0.011374 0.000829 -0.004225 0.003588 
+0.001626 -0.000536 0.000915 -0.001320 0.000959 -0.000612 
+0.000107 0.004329 -0.000175 0.003527 0.006758 -0.000916 
+0.003218 0.006262 -0.001715 -0.000492 0.004884 -0.005688 
+-0.005897 -0.002318 -0.004266 -0.000910 -0.001144 0.000929 
+0.012071 0.004454 0.005450 -0.013645 -0.000648 0.012937 
+-0.008481 0.001254 -0.011104 0.009411 0.011430 0.006763 
+0.002626 0.005194 0.001562 -0.000247 -0.000266 -0.002912 
+-0.003253 -0.003439 -0.005311 -0.008080 -0.002055 -0.002560 
+-0.003111 -0.002900 0.002014 0.003560 0.003358 0.001275 
+-0.000128 -0.003216 0.002240 -0.001680 -0.036945 0.025979 
+-0.307392 0.294438 -0.612824 0.000744 -0.001094 -0.016429 
+-0.003577 -0.009279 0.010127 -0.012848 -0.014710 0.019649 
+-0.021388 -0.024963 0.039413 0.010056 -0.020180 0.066557 
+-0.139066 0.082198 0.088407 -0.000377 0.002579 -0.000784 
+0.013936 0.011964 -0.012966 0.006205 -0.008348 0.006237 
+-0.000685 -0.070717 0.028618 -0.228930 0.079639 0.004975 
+-0.002522 0.016828 0.013649 0.063745 -0.001275 0.003825 
+-0.006832 -0.026860 -0.003499 -0.012196 -0.009196 0.002699 
+0.000580 -0.021519 -0.003833 -0.021567 -0.017481 -0.007635 
+-0.023996 -0.002755 0.002234 0.005311 0.016536 -0.012174 
+0.005973 0.001770 -0.011816 0.006687 0.000623 -0.004744 
+0.004333 0.003097 -0.002032 -0.005129 0.001473 -0.000366 
+-0.007218 0.001165 0.003300 -0.001038 -0.000085 0.000682 
+0.005049 0.000066 -0.000047 0.004452 0.002514 0.001718 
+-0.000546 0.000246 -0.001193 -0.004290 -0.000855 -0.000788 
+-0.001386 0.002544 -0.004902 0.006397 0.010070 -0.010577 
+-0.000385 0.000645 -0.000716 0.002767 -0.002696 0.003358 
+0.000313 -0.001259 -0.000291 0.000010 0.002480 -0.002486 
+-0.002737 -0.000036 -0.001864 -0.000131 -0.003581 -0.001309 
+0.010284 -0.011093 0.002304 0.012473 -0.016253 0.007871 
+0.005650 -0.023618 0.009409 0.008418 -0.021694 0.000464 
+0.008178 -0.012779 0.000254 0.003778 -0.005334 0.001391 
+-0.003857 -0.004984 0.003085 -0.000382 -0.004804 -0.000420 
+0.001348 -0.002524 0.001905 0.000839 -0.002041 -0.000068 
+-0.004435 -0.004619 0.001628 -0.005050 -0.006452 0.002981 
+0.004533 0.000308 -0.003395 -0.000928 0.000982 -0.002291 
+-0.004105 -0.003286 0.004110 -0.002934 -0.004271 0.006348 
+0.000844 -0.000890 0.000362 0.005678 0.003023 -0.005624 
+0.004494 -0.004552 -0.003534 -0.002748 -0.006792 0.000302 
+-0.001166 -0.005236 0.000912 0.006760 0.004552 -0.002641 
+0.012114 0.013984 -0.009878 0.003399 0.008206 -0.013150 
+-0.000563 -0.006604 -0.001026 -0.002738 -0.013470 0.013212 
+-0.006061 -0.008045 0.014061 -0.008508 -0.009111 0.008131 
+-0.011517 -0.020111 0.002592 0.037698 0.017635 0.022799 
+0.003213 0.013951 0.004587 0.000124 0.000285 0.003402 
+-0.001340 -0.007505 -0.006156 -0.003705 -0.000149 -0.005232 
+-0.005783 -0.004058 -0.000517 -0.000429 -0.001943 0.003126 
+0.004159 0.000541 0.005290 -0.004309 -0.008188 0.009387 
+-0.008796 0.007207 -0.033667 0.022991 -0.002801 -0.020452 
+0.014528 0.022948 -0.018507 -0.001818 0.000104 0.003054 
+0.000836 -0.008877 0.016660 -0.006779 -0.010875 0.015465 
+-0.034640 -0.021003 -0.005666 0.007759 0.002074 -0.012174 
+0.021234 0.017127 -0.016099 0.004596 0.005757 -0.001871 
+-0.045975 -0.047370 0.013195 -0.092876 -0.038491 -0.000614 
+0.036261 -0.066757 0.052883 0.029766 -0.030569 0.018029 
+-0.047778 0.012222 0.020317 -0.062286 -0.027543 0.015771 
+-0.081874 -0.008124 -0.019798 0.012837 0.073691 0.026764 
+0.014162 0.028178 -0.012660 0.006806 0.000720 -0.014017 
+0.007346 -0.004190 -0.004581 0.003739 -0.002941 0.001570 
+0.005522 -0.001830 -0.000364 0.007675 -0.003059 -0.004134 
+0.008304 -0.002100 -0.005444 0.008304 0.001223 -0.003912 
+0.003775 0.002917 -0.000103 0.000465 0.000905 -0.002862 
+0.001549 0.002004 -0.001918 -0.002757 0.002415 -0.001897 
+-0.003413 0.000104 -0.003386 -0.002564 0.007823 -0.006979 
+-0.008322 0.003510 -0.003757 0.000691 -0.006251 0.001127 
+-0.000927 -0.004688 -0.000939 -0.002634 0.001585 -0.001769 
+-0.001463 0.004568 -0.006927 -0.004776 0.001190 -0.001817 
+0.002876 -0.007382 -0.001925 -0.007289 -0.010334 -0.002444 
+0.015866 -0.012871 -0.000663 0.015577 -0.013971 0.004857 
+0.006106 -0.006968 0.011671 -0.006280 -0.007875 0.007216 
+-0.001681 -0.003266 -0.000893 -0.000426 -0.000081 -0.001677 
+0.000606 -0.000014 -0.004787 -0.000414 -0.002266 -0.003381 
+0.001662 -0.002424 -0.002016 -0.001663 -0.001633 -0.001145 
+0.000404 -0.002093 -0.002268 0.001233 -0.002131 -0.004787 
+-0.003360 -0.001098 -0.003996 -0.002200 -0.000841 -0.001225 
+-0.007299 -0.001439 0.001572 -0.000622 -0.001068 0.006693 
+-0.002528 0.000633 0.001278 0.000657 -0.002354 -0.003419 
+0.003706 -0.002877 -0.000301 0.004474 0.001776 -0.001996 
+0.008384 0.007625 -0.007218 0.006230 0.007998 -0.010210 
+-0.001464 0.000630 0.006821 -0.002103 -0.003289 0.003720 
+-0.002639 -0.000769 -0.000633 -0.000551 -0.001046 -0.001326 
+0.004185 0.007938 0.006597 0.027984 0.079879 0.012823 
+0.003152 0.005787 -0.002265 0.000004 0.002487 -0.002615 
+-0.002154 -0.008198 -0.006031 0.002675 -0.005384 -0.002149 
+-0.009181 -0.005028 -0.002076 -0.004568 -0.004226 0.002953 
+0.002374 0.001954 0.004997 -0.001236 -0.001931 0.003539 
+-0.000192 0.000823 -0.001337 0.005466 0.017441 -0.013442 
+0.003002 0.023289 -0.005221 0.004652 0.006294 -0.000839 
+-0.003861 -0.006018 -0.002289 -0.004138 -0.004722 -0.001086 
+0.005795 0.009245 -0.009281 0.013627 0.012252 -0.012661 
+0.005920 0.012655 -0.010095 0.000170 0.009662 -0.006793 
+-0.022757 -0.008129 0.003075 -0.040819 -0.029842 0.010164 
+-0.028998 -0.043781 0.018850 -0.021777 -0.016967 0.007813 
+-0.037274 -0.004529 0.003079 -0.026094 -0.001484 -0.009122 
+-0.052878 -0.045552 -0.024146 0.126614 -0.000304 -0.014298 
+0.028590 -0.021176 -0.027067 0.007241 -0.013823 -0.010256 
+0.011179 -0.009941 -0.008729 0.013447 -0.009943 -0.005274 
+0.016057 -0.010673 -0.008406 0.013807 -0.009306 -0.013062 
+0.012774 -0.008195 -0.010874 0.007324 -0.010081 -0.006297 
+0.005223 -0.007119 -0.006490 0.006712 -0.003543 -0.004156 
+0.005068 -0.001726 -0.001707 -0.000386 0.000541 0.000667 
+-0.003019 0.003312 -0.000754 -0.007275 0.009527 -0.005096 
+-0.001121 -0.005234 -0.001121 -0.000427 -0.009477 0.000884 
+0.002405 0.000345 0.001006 0.004350 0.002390 -0.010021 
+-0.005288 0.006999 -0.016606 -0.004370 0.005607 -0.012404 
+0.001699 -0.007790 -0.004433 0.005908 -0.004271 -0.003121 
+0.011764 -0.013144 0.001759 0.008251 -0.017890 0.003783 
+0.002622 -0.012394 0.002617 -0.001963 -0.006030 0.001159 
+-0.002184 -0.005326 -0.000553 -0.001286 -0.006263 -0.001968 
+0.000109 -0.006221 -0.003429 -0.000231 -0.004119 -0.001786 
+0.000220 -0.000198 -0.000090 -0.001365 0.000779 0.001894 
+0.001251 0.002530 -0.007544 0.000712 0.003285 -0.008413 
+-0.002887 0.001601 -0.001150 0.002143 -0.000501 0.000254 
+0.003217 -0.001550 -0.000660 0.003200 -0.000507 -0.003833 
+0.004254 0.000217 -0.007422 0.002316 -0.002899 -0.010193 
+0.007253 -0.005536 -0.007927 0.004453 -0.000486 -0.001391 
+-0.005385 0.001212 0.001284 -0.009720 0.001388 0.006231 
+0.002407 0.002801 0.000115 0.000138 -0.001597 -0.010037 
+-0.003445 -0.005150 -0.000651 -0.003117 -0.009566 -0.001045 
+-0.000850 -0.004175 0.003145 0.013753 0.020937 -0.015718 
+-0.003770 -0.021417 -0.004010 -0.004724 -0.009737 -0.004480 
+-0.007519 -0.012940 0.004645 -0.001161 -0.007277 -0.004734 
+-0.001349 -0.005496 0.000993 -0.005819 -0.005518 -0.000724 
+-0.005240 -0.004624 0.000563 0.000528 -0.000473 0.001515 
+0.003265 -0.005135 0.003137 0.001348 -0.011861 0.002647 
+0.008287 0.016881 -0.007152 0.022353 0.024098 -0.009431 
+0.006159 -0.000754 -0.008031 0.005917 0.001357 -0.007838 
+0.008975 0.007064 -0.007022 0.012030 0.007015 -0.009579 
+-0.000855 0.011226 -0.009417 0.002521 0.012397 -0.005793 
+0.002609 0.012500 0.000702 -0.007846 0.011885 -0.000233 
+-0.013429 0.006229 -0.002183 -0.004666 0.001207 -0.000662 
+-0.000146 -0.003510 0.000332 -0.000918 -0.002041 -0.000306 
+0.010822 -0.003502 0.000080 0.030555 0.003955 -0.003683 
+0.070643 -0.029105 -0.019618 0.024733 -0.009244 -0.014028 
+0.016454 -0.007107 -0.007808 0.015692 -0.012406 -0.006809 
+0.005950 -0.016795 -0.009460 0.005118 -0.009235 -0.008292 
+0.010919 -0.005699 -0.007245 0.010478 -0.007280 -0.008465 
+0.005303 -0.005188 -0.009788 -0.000593 0.000402 -0.002450 
+-0.001177 -0.000201 -0.002000 -0.001234 0.000186 -0.000183 
+-0.000035 0.000830 0.001116 -0.004793 -0.001679 -0.023250 
+-0.007658 0.004607 -0.004552 0.001752 0.002969 -0.000840 
+0.013674 0.009445 -0.008305 0.001428 0.013766 -0.014445 
+-0.001969 0.008731 -0.013903 -0.003109 -0.004363 -0.007567 
+-0.009116 0.000935 -0.007047 0.000130 -0.000188 -0.002842 
+-0.000746 -0.014866 0.013669 -0.013354 -0.023592 0.007567 
+-0.014440 -0.014365 0.003453 -0.008729 -0.004988 -0.001501 
+-0.001957 -0.003900 -0.001831 -0.000189 -0.004362 -0.000346 
+-0.000883 -0.003866 0.000056 -0.003047 -0.000595 -0.001288 
+-0.001700 -0.000564 -0.002685 0.000069 -0.000038 -0.001488 
+0.006037 0.002255 -0.009659 0.006177 -0.003049 -0.006017 
+0.001624 -0.004726 -0.004153 -0.000609 0.001389 -0.006574 
+0.005911 0.006206 -0.008805 0.010368 0.002370 -0.011612 
+0.007279 -0.006748 -0.009304 0.000176 -0.006105 -0.008614 
+0.000980 -0.005120 -0.004414 0.002716 -0.006366 -0.002538 
+0.003434 0.007417 -0.006559 0.001093 0.017260 -0.013360 
+-0.001323 0.012608 0.000505 -0.000219 0.002456 -0.001392 
+0.001454 -0.005947 0.001812 -0.004824 -0.010000 0.004453 
+-0.005094 -0.005019 0.009274 -0.004123 -0.001854 0.004907 
+-0.026158 -0.012865 0.019259 -0.010382 -0.009480 0.005961 
+-0.010723 -0.012307 0.012360 -0.003147 -0.005187 -0.002176 
+-0.004043 -0.005904 -0.002021 -0.004430 -0.008239 -0.002241 
+-0.004157 -0.008183 -0.001317 -0.000472 -0.001746 -0.000298 
+0.001996 0.001035 0.002184 -0.000194 -0.011640 0.000073 
+0.000870 -0.000165 0.004803 0.008675 0.014388 0.004517 
+0.009995 0.031661 0.002137 -0.005290 -0.004710 0.009285 
+-0.006620 -0.006717 0.005251 0.000692 -0.000064 -0.003012 
+0.003452 0.000294 0.002582 0.002468 0.008557 0.009675 
+0.007556 0.011745 0.010554 0.028574 0.010633 0.004652 
+0.011691 0.012646 0.011680 0.002854 -0.026195 -0.022257 
+0.024637 -0.014725 0.003245 0.032617 0.000186 -0.005331 
+0.008091 -0.005669 0.000203 0.015621 0.001442 0.009256 
+-0.011055 -0.054884 -0.010303 -0.004138 -0.009466 -0.002494 
+0.010868 -0.001166 -0.000429 0.000558 -0.029138 -0.014239 
+-0.012500 -0.032272 -0.011366 -0.011222 -0.007626 -0.003356 
+-0.000166 0.007582 0.008787 0.023780 0.004447 -0.007976 
+0.009170 0.005314 -0.008137 -0.006725 -0.004133 0.002427 
+-0.000994 -0.000201 -0.001149 -0.005796 0.000484 -0.006922 
+-0.013571 -0.007322 -0.049660 0.036114 0.032457 -0.000174 
+0.028010 0.018490 0.002145 0.003223 0.008455 -0.002423 
+-0.005366 -0.002969 -0.009062 -0.005465 -0.003981 -0.008670 
+-0.005373 0.001502 -0.003894 -0.001634 0.002345 -0.008416 
+-0.008025 0.000420 -0.005330 -0.018334 -0.001769 0.003387 
+-0.020520 -0.020835 -0.001653 -0.023135 -0.023856 -0.005441 
+-0.025317 -0.025360 -0.008248 -0.018134 -0.017027 -0.009749 
+-0.004379 -0.006875 -0.003816 0.000809 0.000811 0.000652 
+0.001543 0.001794 0.001126 0.000604 -0.003059 -0.000265 
+-0.000884 -0.009318 -0.001530 0.000063 -0.009428 -0.001911 
+0.000270 -0.001293 -0.000356 0.005796 -0.001871 -0.001597 
+0.005215 -0.000141 -0.002840 0.005389 0.000680 -0.003828 
+0.000400 0.003338 0.000578 0.004146 -0.005156 -0.008421 
+0.001239 -0.005099 -0.011157 0.000802 -0.003390 -0.011488 
+0.004832 -0.003244 -0.007065 0.002260 -0.004698 -0.004315 
+0.009898 0.000211 -0.008810 -0.004778 0.025972 -0.039945 
+0.000778 0.017152 -0.007508 0.000968 0.006185 -0.002491 
+-0.003950 0.000052 0.005543 -0.003961 -0.002369 0.016450 
+-0.001258 -0.003461 0.017069 -0.000177 -0.007961 0.004432 
+-0.000704 -0.008165 0.004178 -0.008973 -0.000078 -0.005357 
+-0.003315 -0.009007 -0.000692 -0.003170 -0.008058 -0.000205 
+-0.004281 -0.004917 0.001282 -0.002454 -0.002969 -0.000822 
+0.000673 -0.004204 -0.001029 0.000219 -0.006232 0.001920 
+0.000059 -0.003857 0.000672 -0.000730 0.000188 -0.000401 
+-0.011605 -0.012713 -0.001494 -0.011002 -0.012604 -0.002960 
+-0.000889 0.000184 -0.000992 0.008405 -0.021723 0.010839 
+-0.001833 0.007824 0.012949 0.008435 -0.001164 0.020851 
+0.012886 -0.004515 0.018376 0.008708 -0.000759 0.002583 
+-0.005512 -0.004636 -0.011286 -0.000925 -0.002406 -0.009436 
+-0.003442 0.007249 0.003598 0.000724 -0.012133 0.037419 
+-0.000784 -0.012591 0.019828 0.008544 -0.001291 0.008672 
+0.027139 0.009004 0.029812 0.021012 -0.010614 0.004432 
+-0.023124 -0.116501 0.040473 -0.000306 -0.000168 0.000095 
+-0.011146 0.096219 0.010161 -0.000636 0.008530 0.015833 
+-0.010405 0.003947 0.012912 -0.014822 -0.003811 0.002373 
+-0.002263 0.008031 0.001106 0.018334 0.023431 -0.000629 
+0.005728 0.005499 -0.002572 -0.013824 -0.008105 -0.000835 
+-0.016789 -0.006354 -0.005186 -0.010668 -0.005122 -0.007018 
+-0.002574 0.002978 -0.045001 -0.015186 -0.025236 -0.010068 
+0.050817 -0.032958 0.018425 0.017120 -0.017375 0.018507 
+0.005289 -0.016878 0.001722 -0.006072 -0.020835 0.002718 
+-0.001910 -0.006530 0.007016 -0.000912 0.001671 -0.007167 
+-0.011422 -0.005018 -0.006983 -0.010970 -0.019546 0.001742 
+-0.008405 -0.016615 -0.012345 -0.017250 -0.017126 -0.013403 
+-0.017481 -0.020874 -0.012536 -0.016656 -0.019529 -0.009800 
+-0.011814 -0.010391 -0.006141 -0.002094 -0.002924 -0.001852 
+0.000370 0.001117 0.000625 -0.000556 -0.000140 0.000885 
+-0.001341 -0.001277 0.000745 -0.002420 -0.000618 0.000709 
+-0.000032 0.000556 0.000431 -0.000235 0.000048 -0.000261 
+0.003592 -0.001452 -0.001025 0.006287 0.002635 -0.006178 
+0.002803 0.005280 -0.006016 -0.002332 0.003899 -0.003003 
+0.000492 -0.004601 -0.003355 0.001795 -0.008461 -0.012622 
+0.002434 -0.005225 -0.011327 0.000340 -0.004197 -0.004061 
+0.006147 0.012215 0.000436 0.080486 0.058541 0.011892 
+0.012292 0.040201 -0.036778 0.003397 0.003536 -0.009180 
+-0.007848 -0.004997 0.001830 -0.005540 -0.010862 0.008581 
+0.005053 -0.010268 0.012488 0.009663 -0.001850 0.005646 
+-0.003551 -0.000606 -0.004013 -0.008280 -0.002252 -0.017651 
+-0.006930 0.000787 -0.026619 -0.000740 0.000605 -0.010150 
+-0.000027 -0.001914 -0.001453 -0.001673 0.000464 0.002410 
+0.000063 0.002163 0.004739 0.003539 -0.000465 0.002415 
+0.001191 0.000177 0.001005 0.004240 0.002947 0.001287 
+-0.002029 -0.014314 0.001774 -0.012250 -0.005483 -0.000658 
+-0.000676 -0.009360 0.006469 -0.002617 -0.006751 0.015574 
+0.003762 0.001550 0.007576 -0.006292 0.006486 0.001550 
+-0.006384 0.004989 0.005192 -0.030849 -0.007799 0.000802 
+-0.018162 -0.010190 0.024855 -0.037883 0.011370 0.037848 
+-0.015380 0.008797 0.010681 -0.012935 0.005878 0.007232 
+-0.003509 -0.007213 0.012615 0.002080 0.000980 0.013765 
+-0.005183 -0.020769 -0.001956 -0.005267 0.000583 0.000813 
+0.012305 0.016806 -0.016425 0.006394 0.007063 -0.019273 
+0.012308 -0.004276 -0.030073 -0.004841 -0.003088 -0.004592 
+-0.015212 0.017348 0.004586 -0.008976 0.005435 0.003718 
+-0.007435 -0.006067 0.001561 -0.010440 -0.008224 0.002103 
+-0.000974 -0.005882 -0.003039 0.008621 -0.004126 -0.004132 
+0.015726 -0.004570 -0.001041 0.021643 -0.004118 0.003735 
+0.020963 -0.001395 0.011717 -0.001762 -0.006516 0.006594 
+-0.008863 0.001125 -0.003213 -0.000912 -0.001319 -0.001285 
+0.001894 -0.012833 -0.000818 0.001384 -0.018430 0.001934 
+0.002089 -0.014179 0.003851 -0.005265 -0.002264 0.003738 
+-0.004955 -0.005321 -0.002986 -0.002247 -0.013613 -0.002101 
+-0.001657 -0.017325 -0.010789 -0.008026 -0.014489 -0.016305 
+-0.010324 -0.017071 -0.011085 -0.007129 -0.016824 -0.008186 
+-0.006898 -0.013643 -0.004188 -0.006332 -0.007994 -0.001730 
+-0.004705 -0.002769 -0.001368 -0.002397 0.001944 -0.000429 
+0.001946 0.003899 -0.000108 0.003052 0.000875 -0.000432 
+-0.000894 0.000690 0.000299 -0.001404 0.001099 -0.001198 
+-0.000814 0.000875 -0.000768 0.004150 -0.000340 -0.002923 
+0.000229 0.001289 0.000934 -0.000775 0.002176 0.005920 
+0.001476 0.000991 0.001456 0.000426 -0.005430 -0.006186 
+-0.007356 -0.006480 -0.007129 -0.002004 -0.006142 -0.004045 
+0.003415 0.004841 0.003863 0.013147 0.013047 0.010949 
+-0.005960 -0.002790 -0.001189 0.009496 0.014667 -0.022939 
+-0.002461 -0.002903 -0.007372 0.003970 -0.001133 -0.001513 
+0.000803 -0.005623 0.006613 0.012559 -0.013403 0.023132 
+-0.003277 -0.017191 0.026738 0.009111 -0.013597 0.002807 
+0.002575 -0.007209 -0.001999 -0.002539 -0.001581 -0.003277 
+-0.001006 -0.002583 0.000835 0.001604 -0.003585 0.004507 
+-0.000421 -0.000366 -0.001767 -0.004211 -0.000276 -0.000424 
+0.001322 0.003699 0.002399 0.005090 -0.003301 -0.000196 
+0.005576 -0.017755 0.002653 -0.021284 -0.004415 -0.003258 
+-0.007487 -0.008256 0.000684 0.005762 0.003188 0.000363 
+0.014195 0.006134 -0.005320 0.000437 0.005198 -0.008016 
+-0.003817 0.001419 0.001197 -0.010252 -0.005213 0.003412 
+-0.017897 0.003036 0.010232 0.008979 -0.008082 0.007184 
+-0.000262 -0.000560 0.003535 -0.007256 -0.003890 0.008057 
+-0.000179 0.001308 0.014186 -0.017730 -0.048689 -0.010257 
+-0.040194 -0.034701 0.021551 -0.010304 0.008586 0.004873 
+-0.005864 0.010160 0.000475 -0.008064 0.003931 0.001434 
+-0.005601 -0.001277 0.003119 -0.001305 0.001033 0.004606 
+-0.007467 0.006433 0.012819 -0.018859 0.008587 0.011047 
+-0.016633 -0.009811 0.004724 -0.001987 -0.026786 -0.003555 
+0.004091 -0.015153 -0.019699 0.023667 0.000948 -0.014949 
+0.021710 0.002513 0.000472 0.013581 0.004500 0.009911 
+0.016437 0.007027 0.016192 -0.000439 0.004298 -0.003070 
+-0.003241 -0.001884 -0.010830 -0.002489 -0.008152 -0.011236 
+0.007309 -0.009807 -0.003559 0.017058 -0.006320 -0.002566 
+0.018697 0.001073 -0.007172 0.011260 0.014166 0.000755 
+-0.010975 0.015563 -0.000805 -0.001807 0.001582 -0.005208 
+0.000069 -0.014028 -0.004752 -0.003814 -0.019398 -0.008598 
+-0.003360 -0.003355 0.004791 0.006285 -0.020245 0.002998 
+0.000673 -0.017986 0.001836 -0.005285 -0.009143 0.001451 
+-0.007026 -0.004070 -0.000354 -0.004361 -0.002179 0.000545 
+0.000421 -0.001092 0.000382 0.002474 -0.000215 0.000662 
+-0.000589 0.000235 -0.001951 0.001264 0.002511 -0.003152 
+0.002052 -0.000344 -0.002471 0.000402 0.000034 -0.001089 
+-0.001111 -0.001288 0.000650 0.001431 0.001932 0.000086 
+0.004199 0.004113 -0.000071 -0.003546 0.000629 0.001671 
+-0.010618 -0.007049 0.003599 -0.000884 -0.001501 -0.001387 
+0.008603 -0.001024 0.005480 -0.007465 -0.013344 0.013545 
+-0.030427 -0.040977 0.028813 -0.002267 -0.013133 0.007333 
+-0.004762 -0.006640 0.001120 0.003960 0.001331 -0.001411 
+-0.003622 0.006133 0.008308 0.010439 0.007016 0.016023 
+0.006987 0.003902 0.018203 0.007766 -0.007471 0.006408 
+0.000730 -0.001181 0.001055 0.002355 0.004452 -0.006236 
+-0.002703 0.000041 -0.000045 -0.002902 -0.005265 0.003126 
+-0.002261 -0.003028 -0.008221 -0.005358 0.023423 -0.015118 
+0.030310 0.016811 -0.005200 0.003776 -0.002972 -0.003648 
+0.006058 -0.007811 -0.002608 -0.005936 -0.008697 -0.003482 
+-0.005408 -0.003774 0.000088 0.009294 -0.003727 -0.012102 
+0.003447 0.002876 0.001968 0.007535 -0.006131 0.002616 
+0.007381 -0.008881 -0.010469 0.004458 -0.005942 0.005518 
+0.011070 -0.004455 -0.001482 0.007895 -0.005971 -0.001758 
+0.007835 -0.000411 -0.000956 -0.004560 -0.015612 0.013874 
+0.004311 -0.009593 -0.000770 -0.010940 0.003431 -0.004489 
+-0.000828 -0.000616 0.000520 -0.010981 0.002170 0.009001 
+-0.008366 0.017656 0.018193 0.004895 0.010867 0.005945 
+-0.013695 0.017055 -0.006023 -0.017503 0.006435 0.018987 
+-0.013425 0.001733 0.022699 -0.016497 0.001893 0.022018 
+-0.014376 -0.011656 0.005843 0.036079 -0.015333 -0.014856 
+0.050823 -0.004622 -0.022287 0.026243 0.007367 -0.003586 
+0.003065 0.009187 0.004023 -0.006404 0.018096 0.005428 
+-0.012094 0.008761 0.002086 -0.005000 -0.011154 -0.013077 
+0.003915 -0.014303 -0.019306 0.008181 -0.011812 -0.012398 
+0.010673 -0.002599 -0.012327 0.007358 -0.004244 -0.014377 
+0.011699 0.005549 -0.018311 0.003852 0.014176 -0.006245 
+-0.004320 -0.004252 -0.002109 -0.006102 -0.012481 0.004248 
+-0.003642 -0.020882 -0.007454 0.004609 -0.025932 -0.015506 
+0.015062 -0.009994 -0.012687 0.006873 -0.002938 -0.000343 
+-0.003259 0.000119 0.000465 -0.002525 0.000864 -0.001804 
+-0.000594 0.000275 -0.000060 -0.002035 -0.001757 -0.000146 
+-0.002059 -0.003319 -0.001035 -0.000768 -0.003123 -0.001492 
+-0.002932 0.000101 0.003539 -0.001322 -0.001512 0.001605 
+-0.001585 -0.000947 -0.001005 0.000376 0.000035 -0.000944 
+0.003404 0.001293 -0.000151 0.006437 0.000497 -0.002609 
+0.004903 0.000404 -0.003061 -0.000460 -0.000160 0.000229 
+-0.004127 -0.002740 0.004476 -0.000272 -0.002351 0.002144 
+0.006439 0.005776 -0.001354 -0.007706 -0.001628 -0.003464 
+-0.011090 -0.007819 0.002382 0.004791 0.003160 -0.016842 
+0.002476 0.024008 -0.030887 0.012934 -0.000531 0.014536 
+0.009257 -0.000226 0.014731 -0.008298 0.008361 0.010219 
+-0.007516 -0.000566 -0.002796 -0.001579 -0.003262 -0.000516 
+0.003709 0.005831 -0.003150 0.006223 0.005958 -0.002123 
+0.003357 0.003219 0.002887 -0.002775 0.007066 0.002481 
+-0.004322 0.000187 0.009435 -0.001965 -0.002140 0.006847 
+0.000196 0.004315 -0.007674 -0.018788 -0.001677 -0.000412 
+-0.002263 -0.015210 -0.006140 0.013756 -0.016578 -0.000737 
+-0.006634 0.004314 0.002024 -0.010194 -0.010393 -0.021040 
+-0.007743 -0.009726 0.004219 -0.005175 -0.018902 0.007144 
+0.010294 -0.024867 0.003730 0.003856 -0.004781 -0.005559 
+0.005089 0.007158 -0.003824 0.008516 0.011027 -0.004516 
+0.004567 0.002426 -0.007762 0.001831 -0.008609 0.012966 
+-0.008116 0.002138 0.007319 -0.014172 -0.021527 -0.006518 
+0.009396 -0.005612 -0.009689 -0.002780 0.007586 -0.002020 
+-0.023333 0.022038 0.006714 -3.953271 3.570093 2.261682 
+-4.015038 2.939850 2.578947 -3.136364 1.805195 2.240260 
+-0.027937 0.013544 0.012214 -0.021215 0.010360 0.016407 
+-0.019571 -0.000519 0.018313 -0.005918 -0.024395 -0.000202 
+-0.001344 -0.019122 -0.000830 0.011525 -0.007323 -0.003364 
+0.006007 -0.008175 0.002134 -0.005926 0.004735 0.006676 
+0.000753 -0.006245 -0.001541 -0.002293 -0.012435 -0.021608 
+0.010148 -0.004256 -0.023286 0.008233 -0.003060 -0.006849 
+0.004191 -0.005688 0.001497 0.000876 -0.007856 -0.000724 
+-0.002632 0.001057 -0.013497 0.005634 0.043717 -0.017604 
+-0.017038 0.015687 -0.010285 -0.016100 -0.024875 0.019045 
+0.002248 -0.030705 -0.015389 0.018653 -0.030788 -0.010937 
+0.009318 -0.014424 0.008014 0.006111 0.015113 0.000066 
+-0.002541 0.035689 -0.000766 -0.005929 -0.006126 -0.002286 
+-0.005458 -0.002876 -0.003278 0.006489 -0.004186 0.001409 
+0.004533 -0.005521 -0.001261 0.000685 -0.008150 -0.001758 
+-0.000664 0.000195 -0.001406 -0.000830 -0.001021 -0.002425 
+0.000004 -0.000289 -0.003734 0.004211 0.003845 -0.005433 
+0.000942 0.009348 -0.002554 0.000469 0.001309 0.002093 
+0.002874 0.002464 0.000475 -0.000062 0.001834 0.001830 
+-0.002121 0.000670 0.004870 -0.002054 -0.000461 0.001510 
+-0.004304 -0.007352 -0.003835 -0.003354 -0.019835 -0.014182 
+-0.000130 -0.015223 -0.020120 -0.000896 -0.004550 -0.027230 
+-0.005325 0.018323 -0.039613 0.000892 0.002711 0.021021 
+0.006499 0.007384 0.002484 -0.001618 0.004030 -0.001922 
+-0.004035 0.005762 -0.002113 0.006481 -0.001777 0.001305 
+0.012632 0.008989 0.004817 0.006036 0.020867 0.013194 
+-0.000665 0.028293 0.013261 0.000042 0.024540 0.008077 
+-0.006241 0.015817 0.013523 -0.002123 -0.000902 0.015917 
+-0.006373 -0.010514 0.013487 -0.007531 -0.012234 0.008663 
+-0.001901 -0.000851 0.000480 -0.008187 -0.023881 0.012990 
+0.010007 -0.043084 0.017997 -0.029234 -0.039903 -0.007746 
+-0.009230 -0.020803 0.016762 -0.005830 -0.008957 0.008371 
+0.001924 -0.002405 -0.001732 -0.001848 0.009163 0.001062 
+0.001466 -0.002538 0.006864 0.006449 -0.001940 0.009847 
+0.013929 -0.002012 0.007317 0.013285 -0.011831 0.007436 
+-0.010358 -0.009284 0.001493 0.008948 -0.010997 -0.007445 
+0.010767 -0.000696 -0.012558 0.004322 0.018897 -0.002258 
+-0.011302 0.039082 0.009508 -3.795775 4.154930 2.345070 
+-3.994152 3.345029 2.561404 -3.016760 2.324022 2.106145 
+-0.025848 0.017301 0.011327 -0.022343 0.014648 0.016982 
+-0.008530 0.010639 0.024916 0.005045 -0.004178 0.009142 
+-0.010084 -0.013268 0.001807 -0.005173 -0.012458 0.001859 
+-0.010106 -0.003545 -0.001863 -0.003833 -0.017115 0.003604 
+-0.000941 -0.028502 0.002181 0.003701 -0.017513 -0.005647 
+0.001345 -0.007688 -0.005517 -0.002950 -0.000828 0.001446 
+-0.000193 0.001872 0.001101 -0.000549 -0.003695 -0.001559 
+-0.000130 -0.004660 -0.019877 0.019355 0.044120 -0.008870 
+-0.001342 0.051484 0.014381 -0.018293 0.019993 0.022893 
+-0.002070 -0.017199 0.004862 0.002563 -0.022355 -0.011121 
+0.012336 -0.014365 -0.005647 0.016020 0.009300 0.004569 
+0.016807 0.019265 -0.002333 -0.011062 0.000457 -0.002078 
+-0.000772 -0.008313 -0.002684 -0.006265 -0.005357 -0.002260 
+0.001072 -0.005884 0.003131 0.002673 -0.005253 0.002630 
+0.000059 0.002181 -0.000676 0.000138 0.004965 -0.001447 
+0.005175 0.004919 -0.002152 -0.002082 0.006992 0.000100 
+0.000247 0.006415 -0.001953 0.002469 0.005538 -0.003719 
+0.000985 0.005245 -0.004759 0.000956 0.006558 -0.002655 
+0.000057 0.006251 0.002252 0.000194 -0.001990 -0.001316 
+-0.006498 -0.013622 -0.020953 -0.009584 -0.019494 -0.016685 
+0.003617 -0.024518 -0.016631 -0.006993 -0.014047 -0.015063 
+-0.003058 -0.004600 0.011486 0.004716 -0.001327 0.003758 
+-0.005003 -0.000510 0.003618 -0.005409 0.000746 -0.002441 
+-0.005864 -0.026761 0.012678 0.007717 -0.002525 0.003592 
+0.010331 0.023833 0.014581 -0.001156 0.038464 0.021595 
+-1.045802 4.755725 1.908397 -1.427536 3.934783 2.355072 
+-0.011523 0.024068 0.020046 -0.002463 0.001201 0.017030 
+0.000421 -0.003674 0.009549 0.001346 0.000304 0.001011 
+0.000070 0.001249 -0.002333 -0.001194 -0.003104 0.003001 
+0.003800 -0.007712 0.008376 0.024415 -0.003244 0.022642 
+-0.024450 0.002569 0.023289 -0.028782 0.045708 0.032120 
+-0.005932 0.017037 0.002701 -0.015397 0.000656 -0.002303 
+-0.015350 -0.010805 0.011725 0.013994 -0.012316 0.013291 
+-0.009809 -0.000004 0.018019 0.004403 -0.008659 -0.003180 
+0.004002 -0.006759 -0.011358 0.002358 -0.003096 0.006649 
+0.000523 -0.009588 0.006985 0.009185 0.023081 0.002061 
+-2.205357 5.464286 1.616071 -3.423077 5.203297 2.192308 
+-3.696833 3.927602 1.941176 -3.252381 2.680952 1.509524 
+-0.018322 0.021212 0.021377 -0.011181 0.023915 0.007385 
+-0.008048 0.014656 -0.000642 0.001584 0.000496 0.002626 
+-0.000500 0.000000 0.000500 -0.020385 -0.010058 0.002719 
+-0.036000 -0.030882 0.018692 -0.024780 -0.046721 0.015733 
+0.007551 -0.032020 -0.009369 0.019321 -0.012213 -0.007297 
+0.008888 -0.004468 -0.003172 0.000540 0.006614 -0.000790 
+0.002558 0.009608 -0.003162 0.003536 0.008602 -0.001679 
+-0.000424 0.001810 -0.013505 -0.009397 -0.004641 -0.011530 
+-0.004126 0.006472 -0.001339 0.000207 0.006244 0.008584 
+-0.004060 0.003226 0.004116 -0.008095 -0.008215 -0.003503 
+-0.003541 -0.002364 -0.004744 0.002235 0.001650 -0.000211 
+0.008557 0.000854 -0.000669 0.009449 0.003851 0.003247 
+0.000419 0.002550 -0.000834 -0.006502 -0.000729 -0.002802 
+-0.003013 -0.001904 -0.001247 -0.000447 -0.000800 0.000421 
+0.001482 -0.000118 0.000913 0.001678 0.001962 0.000307 
+0.000362 0.002619 0.001743 -0.000910 0.002051 0.001382 
+0.000938 0.001339 -0.002679 0.005280 -0.000315 -0.005312 
+0.002524 -0.001286 -0.007145 0.001379 0.001480 -0.002989 
+-0.002493 -0.001386 0.004581 -0.008507 -0.003227 0.000399 
+0.002763 -0.001058 -0.019710 0.002535 -0.012447 -0.020729 
+-0.000916 -0.017276 -0.016459 -0.003102 -0.009463 -0.014338 
+0.001393 0.001264 -0.008734 0.009201 0.012829 0.003000 
+0.013143 0.017053 0.003681 -0.016637 -0.014444 0.001232 
+0.035114 -0.071439 0.023009 -0.001321 0.005020 0.001358 
+0.008828 0.037314 0.019571 0.513158 5.736842 2.177632 
+-0.616667 6.066667 2.755556 -1.262570 4.927374 3.195531 
+-1.100592 2.828402 2.668639 -0.006742 0.010438 0.013560 
+-0.002932 -0.003004 0.008035 -0.002867 -0.002973 -0.001448 
+-0.001101 -0.000553 -0.000961 0.002816 0.000986 -0.002522 
+0.005362 0.003835 -0.002895 0.004119 0.000713 -0.005322 
+-0.002489 0.000428 -0.004818 -0.004370 -0.000236 -0.005723 
+-0.003592 -0.000699 -0.003700 -0.000547 -0.000276 -0.000497 
+0.010566 0.004253 -0.007741 0.106507 0.027980 -0.016491 
+-0.086857 0.044286 0.003429 -0.007112 0.005156 0.006264 
+-0.000334 -0.001154 0.006407 -0.004124 -0.006335 0.012062 
+-0.000280 -0.010467 0.007773 -0.007439 0.028110 0.005405 
+-2.646259 6.272109 1.374150 -3.115044 6.053097 1.902655 
+-3.008130 4.849594 1.512195 -2.500000 3.308411 0.850467 
+-0.005123 0.024999 0.007790 -0.014692 0.027980 0.001851 
+-0.015519 0.011777 -0.003784 0.003634 0.037099 -0.027671 
+-0.011304 -0.009348 0.002391 -0.035879 -0.056507 -0.006083 
+-0.033038 -0.067210 -0.001772 0.001659 -0.024461 -0.014635 
+0.015123 0.005919 -0.031208 0.019328 0.010893 -0.030590 
+0.012154 0.010185 -0.020697 0.004795 0.007955 -0.013762 
+0.001392 0.003524 -0.010893 -0.000809 -0.001871 -0.009644 
+-0.003683 -0.005315 -0.008893 -0.008773 -0.003119 -0.009184 
+-0.006863 0.002927 -0.006337 -0.004150 0.004677 -0.002181 
+-0.003549 0.003277 0.000656 -0.004287 -0.001821 0.002252 
+-0.008334 -0.008167 0.001767 -0.006543 -0.011103 -0.000342 
+-0.001684 -0.005792 0.002001 0.005172 -0.000809 0.000341 
+0.008436 -0.000649 -0.001186 0.004915 -0.002299 -0.000672 
+-0.000746 -0.002728 -0.000569 -0.002788 -0.001715 0.003109 
+0.002011 -0.001430 0.000217 -0.000412 -0.000690 0.000288 
+-0.001527 0.001748 0.000229 -0.000859 -0.001028 -0.000799 
+0.000822 0.004836 -0.004219 0.004701 -0.001817 -0.000214 
+0.005600 0.000335 -0.003686 0.001213 0.003561 0.000203 
+-0.001761 0.001766 0.004023 -0.002573 0.001460 0.004460 
+-0.002378 -0.000246 -0.002225 0.002943 0.001612 -0.006658 
+0.004241 -0.007775 -0.006547 0.002459 -0.007625 -0.009594 
+-0.002221 -0.000388 -0.007969 0.003697 0.008956 0.003833 
+0.008941 -0.011551 0.009120 -0.009885 -0.040700 0.029448 
+-0.006898 -0.007753 0.028686 -0.000760 0.012722 0.008792 
+1.158273 4.726619 2.690647 1.078534 6.685864 3.450262 
+0.336364 6.904545 3.772727 -0.354369 5.567961 4.174757 
+-0.271676 3.248555 3.583815 -0.007999 0.004470 0.014269 
+-0.001202 -0.003123 0.010247 -0.005717 -0.005093 0.002680 
+-0.000333 0.001764 -0.000613 0.001279 -0.001448 0.000416 
+0.002984 -0.003719 0.000427 0.000530 0.001659 0.005803 
+-0.002611 0.002562 0.002028 -0.000787 0.000001 -0.001580 
+-0.001927 -0.000997 -0.003573 -0.001751 -0.001253 -0.001517 
+0.000468 0.000030 0.003514 -0.002225 -0.000326 0.007867 
+-0.000539 -0.000261 0.004290 -0.000890 0.000205 0.000956 
+0.000064 -0.000694 0.001140 -0.001259 -0.006143 0.004698 
+-0.000531 -0.007540 0.002117 -0.011635 0.043951 0.005956 
+-2.596774 7.553763 1.559140 -2.860465 7.174418 1.802326 
+-2.584000 5.676000 1.384000 -1.655000 3.570000 0.595000 
+-0.001937 0.015445 0.000109 0.003834 -0.017287 -0.007998 
+0.022685 -0.052642 0.015158 0.014598 -0.014811 -0.002955 
+0.006020 -0.030347 -0.036441 -0.013977 -0.041534 -0.042784 
+-0.009628 -0.027927 -0.029439 0.001520 -0.005482 0.000685 
+0.006253 0.021106 -0.008598 0.007660 0.018452 -0.010181 
+0.007138 0.006919 -0.007764 0.003133 0.003752 -0.004507 
+-0.004848 0.001859 -0.003632 -0.003925 0.001575 0.002312 
+-0.003243 0.001724 0.002109 -0.001519 0.000955 0.000374 
+-0.002285 0.000518 -0.000903 -0.006146 0.001995 -0.003618 
+-0.008152 0.002874 -0.002418 -0.002570 -0.000051 0.000206 
+0.004265 -0.002241 -0.002578 0.009068 -0.003869 -0.002539 
+0.005950 -0.008306 -0.000372 0.002133 -0.004973 -0.001283 
+0.000193 -0.000714 0.000044 -0.003466 -0.001427 -0.002077 
+-0.002510 -0.005615 -0.002692 -0.003248 -0.005718 -0.001906 
+0.002411 0.000195 -0.001242 0.001485 0.001768 0.000334 
+-0.000712 0.001363 0.000370 0.000699 0.003494 -0.009237 
+0.001816 -0.004036 -0.005368 0.002867 -0.001911 -0.006172 
+0.006422 0.004812 -0.008023 0.006378 0.005480 0.001827 
+0.002686 -0.001021 -0.000929 -0.000071 0.001138 0.001127 
+-0.001591 0.001742 0.002278 -0.001813 -0.000450 0.002080 
+0.000113 -0.003378 0.001807 0.002089 -0.002156 0.001609 
+0.000218 -0.000113 0.000215 0.007628 0.003634 0.007358 
+0.003276 -0.004386 0.001650 0.002229 -0.015416 0.016537 
+0.001971 -0.003970 0.008161 -0.001479 0.017251 0.010115 
+0.692737 5.139665 4.139665 0.942149 7.008265 4.123967 
+0.558491 6.981132 4.143396 0.260504 5.663866 4.151260 
+0.608939 3.737430 3.033520 -0.004210 0.007515 0.004202 
+0.008062 -0.010892 0.004925 0.000645 -0.003857 0.002364 
+0.001090 0.003369 -0.001581 -0.001812 -0.001236 0.000503 
+-0.003558 -0.008795 0.004788 0.000927 -0.005421 0.006474 
+0.004522 0.000508 0.003627 0.001185 -0.000242 0.000676 
+-0.002267 0.000991 0.000717 -0.001923 -0.002165 0.003714 
+-0.002454 0.001305 0.002013 -0.001970 -0.000005 0.003986 
+-0.002259 -0.000271 0.000614 -0.001191 0.003021 -0.002816 
+-0.001106 0.000726 0.000418 0.004226 -0.007311 0.003046 
+0.007268 -0.012649 0.002699 -0.616071 5.982143 0.776786 
+-1.780702 8.627193 1.640351 -2.226481 8.163763 1.972125 
+-1.767347 6.371428 1.673469 -0.006876 0.032412 0.008260 
+0.000621 -0.005984 0.006237 -0.023364 -0.052579 0.010201 
+0.010488 -0.091613 -0.054517 0.020584 -0.033131 -0.023004 
+0.004417 -0.006309 -0.009809 -0.014639 -0.005801 -0.005885 
+-0.020798 -0.005772 0.005211 -0.003397 -0.016190 0.000799 
+-0.000190 0.006637 0.004103 -0.001855 0.003919 0.005627 
+-0.001814 -0.000256 0.001585 -0.001063 -0.000432 0.000386 
+-0.003778 0.000893 -0.004071 -0.005493 0.004526 -0.001934 
+-0.003252 -0.001357 0.000908 0.001835 -0.005522 -0.000021 
+0.003840 -0.004205 0.000867 0.000440 -0.001359 0.000285 
+-0.000552 0.000631 -0.000394 0.002496 0.000940 -0.001102 
+-0.000018 -0.001034 -0.000881 0.005456 -0.004159 -0.000970 
+0.003573 0.000035 -0.002494 0.002006 -0.000281 0.000893 
+0.002867 -0.000852 -0.001038 0.001093 -0.000884 -0.002288 
+0.000000 -0.001339 -0.003214 0.000453 0.000760 -0.002166 
+-0.000771 -0.002317 -0.003185 -0.003201 -0.001306 -0.001675 
+0.001712 0.001615 -0.000469 -0.002649 0.000280 -0.007858 
+0.001002 -0.004383 -0.005116 0.003712 -0.000656 -0.004859 
+-0.000533 -0.001427 -0.001400 0.005328 -0.003986 -0.004154 
+0.002372 -0.002271 0.000368 -0.000426 0.006629 -0.002087 
+0.001853 0.005576 -0.000579 0.000482 -0.001928 0.005833 
+-0.002974 -0.012537 0.009020 -0.006703 -0.009788 0.005644 
+-0.000249 -0.000967 -0.001286 0.001468 -0.000038 -0.000314 
+0.000224 -0.002423 0.004526 -0.001039 -0.010463 0.014084 
+0.003811 -0.001536 0.010883 0.001032 0.021935 0.012335 
+0.207792 5.025974 4.090909 0.528053 6.666667 3.818482 
+0.445161 6.658064 3.525806 0.360595 5.460967 3.185874 
+0.783505 4.097938 2.030928 -0.000366 0.011692 -0.004783 
+0.008632 -0.018056 0.001379 -0.005540 -0.006782 -0.000102 
+-0.002238 0.001084 -0.000814 -0.002238 -0.000657 0.000640 
+0.001821 -0.007852 0.003481 0.004846 -0.003313 0.003673 
+0.007904 0.005225 0.000067 0.003701 0.001270 -0.001232 
+-0.000771 -0.001584 0.002427 -0.001295 -0.004953 0.003831 
+-0.000096 -0.004597 0.002875 -0.000107 -0.001701 0.001632 
+-0.001107 0.000107 0.000012 -0.002201 -0.000009 0.002002 
+-0.001345 -0.002288 0.005934 0.004361 -0.009129 0.010776 
+0.004044 -0.003733 0.002998 -0.736111 7.111111 1.534722 
+-1.345455 8.956364 2.163636 -1.711538 8.785256 2.605769 
+-0.534188 7.111111 2.893162 -0.005272 0.030713 0.009993 
+-0.001814 -0.005217 0.001163 -0.018755 -0.017048 0.005840 
+-0.002364 -0.000230 0.000273 0.000815 0.001473 0.003766 
+0.001556 0.000759 0.002053 -0.008700 -0.009269 0.004021 
+0.001025 -0.023258 0.008989 0.004371 -0.003531 -0.001525 
+-0.010515 -0.006117 -0.010186 -0.008780 -0.009793 -0.002456 
+-0.007503 -0.013945 -0.010139 -0.004520 -0.003744 -0.007071 
+-0.001306 0.000837 -0.002121 0.000356 -0.001324 0.000604 
+0.001735 -0.011438 0.000636 0.001908 -0.010993 -0.001925 
+0.000897 -0.000868 0.000108 0.000291 0.004932 0.000881 
+0.000163 -0.000329 0.000252 -0.002714 -0.000222 0.004505 
+-0.001616 -0.008219 0.001023 -0.006466 -0.006468 0.001629 
+-0.003832 0.001239 -0.000666 0.000159 -0.000249 -0.004037 
+0.001583 -0.001476 -0.004297 0.001608 0.000594 -0.001977 
+-0.000074 -0.000440 0.000178 0.002237 -0.000128 -0.003143 
+0.001328 -0.005490 0.002947 0.002143 -0.000851 -0.000788 
+0.002668 -0.000696 -0.003944 0.000580 -0.003348 -0.004138 
+-0.000146 0.000380 -0.000906 -0.000203 -0.001856 -0.003772 
+0.000000 -0.003333 -0.004773 -0.002625 -0.005122 -0.005714 
+-0.001421 -0.003850 -0.002429 0.000310 0.004765 0.000753 
+0.002023 0.000064 0.000434 0.000627 0.000513 0.002404 
+-0.000912 -0.000401 -0.001243 -0.009659 -0.012716 0.003355 
+-0.012277 -0.008272 -0.001898 -0.011224 -0.007664 -0.005121 
+0.005874 -0.009851 0.004161 -0.008335 -0.007348 0.016467 
+-0.002293 0.011148 0.016648 -0.003212 0.025480 0.018014 
+-0.989510 4.653846 3.006993 -0.607143 6.189560 2.862637 
+-0.344311 6.500000 2.505988 -0.284585 5.256917 2.233202 
+-0.138122 3.535912 1.812155 -0.005397 0.007215 0.007523 
+-0.006612 -0.001179 0.002552 -0.010269 0.005028 -0.002349 
+-0.000383 -0.008239 0.004100 0.006715 -0.012853 0.000644 
+0.014371 -0.009283 0.000167 0.009141 0.004620 0.003500 
+0.003604 0.010956 0.002274 0.001516 0.005413 0.000758 
+-0.002514 -0.002606 -0.000019 -0.001271 -0.008343 -0.000927 
+0.001172 -0.009555 0.002424 0.001982 -0.003849 0.003434 
+0.005120 -0.000640 -0.002672 0.008417 -0.000602 -0.003485 
+0.007414 -0.003645 0.003813 0.003957 -0.010752 0.013241 
+-0.004739 -0.005514 -0.005195 -0.918605 6.500000 2.732558 
+-0.558065 8.383871 3.045161 -0.283582 8.537313 3.229851 
+1.236287 7.215190 3.784810 2.288344 3.337423 1.355828 
+-0.000576 -0.000820 -0.000953 -0.006771 -0.004005 0.005644 
+-0.004193 -0.001784 0.007993 0.000450 -0.000436 0.010525 
+0.000280 0.001893 0.009036 0.002389 -0.006356 0.005111 
+0.003783 -0.010380 -0.013639 -0.009039 0.023318 -0.077551 
+-0.000877 0.038567 -0.056410 0.000966 0.016216 -0.026280 
+0.003309 0.004654 -0.010519 0.003906 -0.003009 -0.003626 
+0.002207 0.001194 0.002502 0.001664 0.001362 0.002394 
+0.001447 -0.002534 -0.001197 -0.001411 -0.001510 -0.001653 
+-0.002974 0.004883 0.000841 -0.002499 0.006761 0.000340 
+-0.003896 0.000000 -0.001091 0.000857 -0.004286 0.001017 
+-0.005292 -0.002788 0.006155 -0.004400 -0.000921 0.004238 
+-0.002625 0.000143 0.001079 -0.000549 -0.001927 -0.002660 
+-0.001002 -0.004527 -0.000974 -0.000286 -0.001178 0.000874 
+0.000867 0.001524 -0.001860 0.005191 0.001280 -0.002240 
+0.004724 -0.001707 -0.007964 0.003733 -0.000076 -0.011198 
+0.002920 -0.001062 -0.005840 -0.001432 -0.006193 -0.002046 
+-0.000572 -0.006308 -0.000594 -0.002701 -0.004082 0.000592 
+-0.004299 -0.007164 -0.004775 -0.008165 -0.005880 -0.002309 
+-0.008936 0.000931 0.000634 -0.005140 0.006307 0.000943 
+-0.001699 0.005146 -0.001871 0.001357 -0.002035 -0.004364 
+-0.004668 -0.004704 -0.006344 0.002344 -0.010443 -0.002174 
+-0.006326 -0.001475 -0.004026 -0.003348 -0.005922 -0.008335 
+-0.009735 -0.008530 -0.007770 -0.017303 -0.016941 0.009144 
+-0.007898 0.027011 0.022643 -1.798122 2.807512 2.107981 
+-2.153355 4.674121 2.319489 -1.914894 6.130319 2.263298 
+-1.595541 6.630573 2.159236 -1.333333 5.398907 2.098361 
+-0.013877 0.017549 0.019454 -0.013711 0.010307 0.005721 
+0.000673 0.028857 0.007641 0.002973 0.030526 0.005488 
+0.003924 -0.001749 0.002554 0.002999 -0.013161 0.003939 
+0.001623 -0.001034 0.000328 0.000988 0.006598 0.000849 
+0.001877 0.002053 0.001055 0.001948 -0.006442 0.001523 
+-0.006920 -0.006025 0.001775 -0.007608 -0.002958 0.001716 
+-0.002605 -0.005374 0.000620 0.001895 -0.006766 0.004097 
+0.005623 -0.003974 0.000629 0.010071 -0.001290 -0.004759 
+0.012738 -0.000680 -0.003164 0.007625 -0.004594 0.011745 
+-0.002419 -0.009954 -0.016651 0.011299 6.175141 2.378531 
+0.660317 7.717460 3.019048 1.622419 7.657817 3.277286 
+3.078125 6.210938 3.097656 2.688524 2.480874 0.726776 
+0.004701 -0.013601 0.002645 0.005495 -0.007980 -0.003030 
+0.000722 0.000330 0.005281 -0.002600 0.004971 0.002367 
+-0.000291 0.000095 0.003473 0.004460 -0.005938 -0.006389 
+0.031470 0.005623 -0.040812 -0.000739 0.002844 -0.048172 
+-0.000989 0.003945 -0.015832 0.000104 -0.002713 0.007143 
+-0.000897 -0.002118 0.010975 -0.002603 -0.000024 0.001582 
+0.000685 -0.001614 -0.004950 0.001860 -0.001738 -0.003218 
+0.001529 -0.001057 -0.000870 0.001199 -0.001241 -0.001889 
+0.000311 -0.003196 -0.002815 -0.001083 -0.006312 -0.007454 
+0.003568 -0.002637 -0.001237 -0.000702 -0.003666 0.013142 
+-0.004297 -0.007344 0.000000 -0.000624 -0.000897 0.007801 
+0.000450 -0.001775 0.001554 -0.000077 -0.004139 0.001489 
+0.001441 -0.002910 0.001531 0.003328 0.000167 -0.002137 
+0.004418 0.004536 -0.002684 -0.003807 -0.002672 -0.003067 
+0.003128 -0.000951 -0.007122 0.001245 -0.005325 -0.005718 
+0.003114 -0.004390 0.001197 0.000754 -0.001146 -0.000545 
+0.001975 0.002876 -0.000083 0.002099 -0.001698 -0.001484 
+0.001676 -0.007061 -0.002184 0.001348 -0.002616 -0.002893 
+0.002586 0.000095 0.000284 0.005071 0.000405 0.000128 
+0.002971 -0.000188 -0.000076 0.001113 0.000537 0.000046 
+0.002258 -0.001175 -0.000395 0.003225 -0.003173 -0.000936 
+0.001209 -0.001113 -0.001762 0.000998 0.000362 -0.001747 
+0.000765 0.001102 -0.010675 0.004917 -0.033697 -0.001028 
+-2.118644 -0.940678 2.203390 -2.164021 6.137566 2.227513 
+-2.509363 6.131086 1.992509 -2.519480 6.743506 1.990260 
+-2.424490 6.534694 2.159184 -2.371681 5.061947 2.415929 
+0.014184 -0.007032 0.006610 -0.009033 -0.014489 0.000490 
+-0.008913 0.027402 0.007594 -0.000083 0.020854 0.008792 
+-0.008259 -0.003959 0.002196 -0.015827 -0.014916 0.004583 
+-0.009440 0.004401 -0.006367 0.000089 0.010177 -0.002841 
+0.004287 0.001950 0.003883 -0.000133 -0.000833 0.006982 
+-0.002791 0.000598 0.006274 -0.005437 -0.001358 0.003126 
+-0.002907 -0.002214 0.001287 -0.001769 -0.008631 0.003822 
+-0.003728 -0.008497 0.006572 -0.003180 -0.001788 0.002545 
+0.005292 0.000953 -0.002055 0.011956 -0.011771 0.021302 
+0.000728 0.004603 -0.032755 0.987730 6.797546 1.754601 
+1.359862 7.539793 2.768166 2.228758 7.062091 3.287582 
+3.310638 5.374468 3.212766 0.009744 0.009165 0.017632 
+0.005935 -0.011222 -0.005964 -0.000834 0.000613 0.002751 
+0.002360 0.001997 -0.005495 0.005312 0.009779 -0.021256 
+0.000031 0.018962 -0.026257 0.012046 0.005318 -0.029956 
+-0.000090 0.001627 -0.012362 0.002209 -0.001096 -0.000775 
+0.005167 -0.001360 0.003308 -0.000919 -0.001943 0.007970 
+-0.004832 -0.002141 0.008861 -0.003082 -0.000126 0.004088 
+0.002244 -0.000403 -0.000634 0.006933 -0.002127 -0.003803 
+0.006882 -0.004085 -0.004857 0.003747 -0.004671 -0.006937 
+0.000840 0.000244 -0.005798 0.001456 -0.005803 0.008115 
+-0.001330 -0.006275 0.014324 -0.000860 -0.007742 0.011527 
+-0.000834 -0.003871 0.006471 0.001563 -0.003650 0.001739 
+0.000070 -0.001305 0.001160 -0.002734 0.002011 -0.000920 
+-0.001647 0.004234 -0.003856 0.000824 0.002919 -0.002246 
+-0.004795 -0.005027 -0.005496 -0.002271 -0.004942 -0.006908 
+-0.001602 0.001942 -0.005974 -0.001681 0.000779 -0.002664 
+-0.002628 -0.000915 0.001393 -0.004468 0.000112 0.000676 
+-0.002362 0.004961 0.001811 0.002397 0.001486 -0.000624 
+-0.000814 0.001255 -0.003208 -0.000338 -0.002639 -0.000174 
+0.004322 -0.004512 0.001966 0.009073 -0.003239 -0.001403 
+0.001817 0.003115 -0.004057 -0.002272 0.007530 -0.002281 
+-0.002527 0.007705 0.001353 -0.000579 0.004744 0.002575 
+-0.002641 0.000875 0.003082 0.000566 0.001436 0.006828 
+0.008170 0.009860 0.000067 0.006824 0.010910 -0.011160 
+0.227848 -6.189873 0.518987 -1.514286 5.238095 1.304762 
+-2.169935 3.104575 1.562091 -2.209945 4.215470 1.734807 
+-2.373418 4.158228 2.069620 -0.003647 0.032018 0.017042 
+0.004818 0.005250 -0.000238 -0.002718 -0.041383 -0.006242 
+-0.004566 -0.006680 -0.001096 -0.005992 -0.002522 0.002350 
+-0.007350 -0.016377 0.004422 -0.009627 -0.024992 0.006522 
+-0.001837 -0.003922 -0.000283 0.003285 0.005181 0.002114 
+0.005281 0.001852 0.003555 -0.000692 -0.001184 0.000336 
+0.003727 -0.010583 -0.004736 -0.002948 -0.012793 0.001379 
+-0.011874 -0.013431 0.003898 -0.016647 -0.010148 0.005962 
+-0.014184 -0.002466 0.005922 -0.002913 0.001458 0.002172 
+0.002096 -0.017810 -0.006904 0.029392 -0.023361 -0.024238 
+-0.003590 0.001027 -0.014750 1.209150 6.352941 0.790850 
+1.595041 7.202479 1.991736 2.203252 6.833333 2.504065 
+2.867403 5.270718 1.425414 0.011544 0.008129 0.012006 
+0.001647 -0.008667 -0.007072 -0.009235 0.004128 0.001246 
+-0.009901 -0.000163 0.004617 0.006562 0.018605 -0.010848 
+0.005317 -0.000857 -0.018197 0.001674 0.004290 -0.021104 
+0.003962 -0.001367 -0.003408 0.006320 -0.005726 0.005817 
+0.003595 -0.005188 0.007011 -0.000389 -0.007950 0.000565 
+-0.006530 -0.005565 0.000901 -0.002378 0.001580 0.004041 
+0.001272 0.001250 0.003779 0.006822 0.002984 0.000116 
+0.008999 0.006394 -0.007075 0.005142 0.006995 -0.007202 
+0.002455 -0.000086 -0.000309 0.001703 -0.010218 0.001870 
+-0.005701 -0.010466 0.004287 -0.002865 -0.005990 0.002214 
+-0.000677 -0.001457 0.002991 -0.001297 -0.000733 0.003208 
+-0.003117 0.000841 0.001946 -0.002468 0.002862 0.000790 
+0.000229 -0.000229 -0.000688 -0.003463 -0.000423 -0.003730 
+-0.001959 -0.000848 -0.003655 -0.000839 -0.003277 -0.000659 
+-0.001537 0.002194 -0.003494 -0.002571 0.001156 0.000751 
+-0.004023 -0.000165 0.002668 -0.002254 -0.003032 0.006032 
+0.001450 0.000374 0.000697 0.001261 0.001471 0.000630 
+-0.001902 0.003852 -0.000951 -0.000615 0.001882 -0.007070 
+0.000201 0.000825 -0.005283 0.005694 0.000725 -0.003315 
+0.004351 -0.003794 -0.005813 -0.002735 0.002954 -0.006565 
+0.002608 0.006785 -0.007315 0.002636 -0.000155 -0.002868 
+-0.000883 -0.001298 -0.000403 -0.000039 0.003079 0.000581 
+0.005664 0.009365 0.000673 0.009530 0.014881 0.002490 
+0.008176 0.012221 -0.007742 -0.008647 -0.033718 -0.036245 
+-0.019584 -0.048243 -0.032605 -0.007396 -0.021182 -0.016249 
+-0.006024 0.004122 0.004318 -0.013469 0.008066 0.007048 
+-0.004259 0.007105 0.006276 0.006246 -0.011096 -0.004664 
+-0.001072 -0.027045 0.003699 -0.006363 -0.012840 0.005307 
+-0.008227 -0.000181 0.002861 -0.004388 -0.003725 -0.000913 
+-0.000484 -0.008753 -0.000800 0.000061 -0.003941 -0.000215 
+0.000451 -0.003278 -0.000796 0.002856 -0.004372 -0.004347 
+0.005821 0.000528 -0.003136 -0.004225 -0.003934 -0.001045 
+-0.008521 -0.010691 0.002124 -0.013288 -0.008223 0.001403 
+-0.010027 0.000369 0.003735 0.000959 0.003964 0.001739 
+0.004534 -0.009126 -0.011680 0.012878 -0.022937 -0.020939 
+0.010821 -0.032065 -0.002175 1.496503 6.055944 0.146853 
+2.026596 8.718085 0.808511 2.393064 8.346821 1.583815 
+2.439655 6.551724 -3.060345 -0.010027 -0.004002 -0.004681 
+-0.009415 -0.016573 -0.017004 -0.006199 0.004620 -0.001815 
+0.006328 0.009791 0.000563 -0.001234 0.003775 0.007445 
+-0.000617 -0.000007 0.003287 0.000457 0.000210 -0.001877 
+0.004211 -0.000927 -0.000691 0.002721 -0.004022 0.006641 
+0.003946 -0.003566 0.007363 -0.001727 0.001825 -0.000198 
+-0.002515 0.000947 0.002396 -0.000021 0.000797 0.001080 
+0.003796 0.000348 0.000450 0.004754 0.001107 -0.001107 
+0.006140 0.005383 -0.002901 -0.000365 0.006497 -0.005768 
+0.000992 0.000842 -0.004001 -0.002086 -0.000562 -0.000808 
+-0.001309 0.000102 -0.000497 0.003607 -0.006658 0.002222 
+0.002040 -0.000609 0.001032 -0.000367 -0.000386 0.000271 
+-0.000688 0.000124 0.001430 -0.004313 -0.004326 0.003228 
+-0.002441 0.000328 0.003569 -0.003437 0.000534 -0.000568 
+-0.000986 -0.001630 -0.002697 -0.000016 0.001761 0.000784 
+0.001652 0.001646 -0.003585 0.000215 0.000421 -0.004639 
+-0.000622 0.003145 -0.006342 -0.000616 -0.002260 -0.001936 
+0.003591 -0.005136 0.000376 -0.000548 -0.003940 -0.001025 
+0.001289 0.000661 -0.002579 0.003310 -0.001884 -0.005881 
+0.007729 0.002640 -0.005406 0.005316 0.001892 -0.001488 
+0.000168 -0.000051 -0.000041 -0.000737 0.000336 -0.000436 
+0.000896 -0.001206 0.002086 0.001486 -0.003467 -0.000238 
+0.001425 -0.001167 -0.003335 0.003650 0.002190 -0.001752 
+0.002038 0.001360 0.000496 0.001665 -0.003111 0.003511 
+-0.004444 -0.004266 0.007819 -0.001967 0.002851 0.003371 
+0.002730 0.008544 0.003810 0.005927 0.003615 -0.001225 
+0.003404 -0.004583 0.001891 0.004102 -0.001536 -0.000552 
+-0.000057 -0.000344 -0.000040 -0.010828 -0.005758 0.006338 
+-0.000371 -0.007863 0.019710 -0.015922 -0.011729 0.008899 
+-0.005640 0.001545 0.002439 0.001917 -0.000084 -0.000124 
+0.003304 -0.008922 0.000352 0.002530 -0.012682 0.003311 
+0.002426 -0.007946 0.003262 0.000011 -0.001024 0.000189 
+0.002677 0.000441 0.000812 -0.000410 -0.000433 -0.001387 
+-0.003411 -0.000910 0.001181 -0.004479 -0.000921 0.000575 
+-0.001070 0.003307 -0.000550 0.002577 0.007027 -0.001943 
+0.011551 0.003870 -0.001893 -0.002183 0.000082 0.000162 
+-0.009168 -0.031540 0.011564 -0.525253 2.404040 1.020202 
+1.150000 5.075000 1.558333 1.763158 5.508772 1.956140 
+0.010828 0.050242 0.013738 -0.016050 0.003468 -0.003117 
+-0.006831 -0.025024 -0.021778 0.001364 0.000377 0.006780 
+0.003572 -0.003638 0.003396 0.002700 -0.005990 0.001987 
+0.001556 -0.008492 0.003445 -0.000377 -0.002162 0.000440 
+0.004276 -0.001038 0.004453 0.003957 -0.002916 0.001734 
+0.002132 -0.001996 -0.000727 -0.001126 0.001725 0.001153 
+-0.003698 0.010413 -0.004720 0.001035 0.008801 -0.000363 
+0.001756 -0.000135 -0.001096 0.001505 -0.002592 0.003926 
+0.002147 0.004238 0.000311 0.001027 0.003453 -0.002382 
+-0.000749 0.002601 -0.002876 -0.004820 -0.000501 0.000565 
+-0.001251 -0.001030 0.003750 0.000554 -0.002167 0.003136 
+0.002770 -0.001802 -0.002568 0.000387 0.000074 -0.001954 
+-0.000293 -0.001462 0.001683 -0.003333 -0.000096 -0.000115 
+0.000065 -0.000541 -0.000553 -0.000254 -0.001927 -0.001833 
+0.000859 -0.002156 -0.002875 0.000971 0.000814 -0.003097 
+0.004268 0.000341 -0.004440 0.003871 -0.000335 -0.001172 
+0.005008 0.002136 0.002614 0.005329 0.004146 0.001184 
+0.001508 -0.002088 -0.000638 0.000583 0.000720 -0.005040 
+0.000355 0.003634 -0.002923 0.003061 0.003707 -0.000805 
+0.001021 0.000898 0.000984 -0.001291 -0.000452 -0.001918 
+-0.004647 0.000300 -0.001237 -0.001253 0.001270 -0.001123 
+0.000764 0.000394 0.002291 0.001209 0.002720 -0.000455 
+0.002618 0.005792 -0.002698 0.004419 0.002083 -0.000338 
+-0.000334 0.001739 0.000528 -0.001715 -0.005320 -0.001185 
+-0.003165 -0.007799 0.000820 0.001331 -0.001006 0.002487 
+0.004278 0.008821 0.001034 0.001416 0.000904 -0.001739 
+0.004353 -0.002629 0.011083 0.002229 0.005286 0.006092 
+-0.003633 0.001150 0.003608 -0.010896 0.001661 0.001262 
+-0.017725 0.000342 0.005010 -0.017341 -0.007534 0.006191 
+-0.007256 -0.010195 0.007967 0.003686 -0.014262 0.000855 
+0.011740 -0.004493 0.000255 0.014509 0.005649 0.007852 
+0.012355 0.011610 0.003320 0.008672 0.008034 -0.002715 
+0.000097 -0.000083 -0.003193 0.000111 0.000093 -0.000405 
+-0.006002 0.001487 0.001876 -0.007700 0.000301 0.001697 
+-0.004472 -0.001956 0.005326 0.001619 -0.000534 0.010029 
+0.007105 0.001418 0.009316 -0.003215 0.002187 -0.005740 
+-0.013422 0.022676 -0.019625 -0.031586 0.009461 -0.001054 
+-0.034123 -0.031677 -0.049454 -0.009785 -0.038376 -0.027766 
+0.003761 0.006636 -0.001858 0.007513 0.001482 -0.006094 
+-0.006160 -0.002110 -0.004142 0.007755 -0.009580 0.004564 
+0.005088 -0.005557 0.008092 0.001410 -0.005665 0.006770 
+-0.002549 -0.008960 0.002761 0.002004 -0.001030 -0.001076 
+0.001668 -0.001245 0.003384 -0.001748 0.001234 0.002012 
+-0.006614 0.001894 -0.000509 0.000812 -0.001154 -0.002040 
+0.005882 0.008263 -0.006200 0.009468 0.004996 0.000821 
+0.003991 0.000806 0.003370 0.000513 0.002354 0.003531 
+-0.000603 -0.003371 0.005782 0.000299 0.001488 -0.002887 
+0.002471 0.001534 -0.005151 0.000987 -0.000207 -0.000395 
+-0.000218 -0.001473 0.000144 0.000346 0.000075 0.000890 
+-0.001242 0.002018 0.001680 -0.001305 -0.000576 0.002745 
+-0.001066 -0.004091 0.002876 -0.002231 -0.005323 -0.001913 
+-0.005197 -0.002913 -0.003386 0.000357 0.002389 -0.001098 
+0.000213 0.000213 -0.002133 -0.000989 -0.000741 0.000732 
+0.006703 0.004026 -0.004690 0.007917 0.004341 -0.004768 
+0.000265 0.000979 0.001243 0.000315 0.003147 0.000732 
+-0.000365 0.000662 0.001496 0.004144 0.004706 -0.000375 
+0.004322 0.007458 -0.005085 0.002465 -0.000337 -0.003087 
+-0.002897 0.001936 0.000251 -0.001422 -0.001466 -0.001422 
+-0.002090 0.002910 0.000819 0.000872 0.003329 0.000699 
+0.005316 0.003911 -0.007322 0.005914 -0.002062 -0.006077 
+0.007504 0.003746 -0.004693 0.006904 0.001257 -0.002885 
+0.000886 -0.000277 0.000259 0.000825 -0.000404 0.000200 
+-0.000023 -0.000170 0.000054 0.001401 0.000761 0.000153 
+0.000540 0.001353 0.002451 -0.000939 -0.002275 0.003876 
+0.002958 -0.003846 0.004986 0.007388 -0.002021 0.004012 
+0.010370 -0.004693 -0.004141 0.001476 -0.001482 0.004108 
+-0.001389 -0.003377 0.011904 -0.006932 -0.011850 0.026479 
+-0.008296 -0.014183 0.028016 0.005907 -0.006823 0.016336 
+0.007408 -0.001755 0.003024 0.006822 0.005887 -0.000128 
+0.004580 0.005398 0.001140 0.002440 0.000281 0.001939 
+0.001352 -0.004188 0.002042 -0.000610 -0.005607 0.003376 
+0.000157 -0.003197 0.002244 0.001656 0.000153 -0.001428 
+-0.002979 -0.000383 0.001720 -0.002333 -0.006175 0.023540 
+-0.000599 0.003369 0.021929 0.001474 0.001728 0.009475 
+0.002324 0.000379 -0.008937 0.010892 -0.002850 -0.027951 
+0.034904 0.023829 -0.018355 0.000421 0.014305 -0.004525 
+-0.003423 0.006376 0.000793 -0.006576 0.003591 0.005284 
+-0.007827 0.007355 0.003633 0.000530 0.001728 -0.000550 
+-0.000557 -0.002328 0.000804 -0.000161 -0.003478 0.000336 
+-0.001184 -0.003677 0.000527 0.001654 -0.000433 -0.000127 
+0.001948 -0.002901 0.004521 -0.002074 -0.001297 0.005809 
+-0.008733 0.001195 0.002272 -0.001878 0.001049 0.004771 
+0.000585 -0.002553 0.003625 0.001907 -0.000355 0.001885 
+0.000360 0.000721 0.001081 0.000763 0.003547 -0.002650 
+-0.002690 0.001371 -0.005030 -0.003257 -0.000067 -0.006575 
+-0.001469 -0.000793 -0.005042 -0.001387 -0.001139 -0.001534 
+0.001341 -0.001135 0.001129 0.000894 -0.001600 0.000756 
+-0.000043 0.001364 -0.002529 -0.000942 0.001570 -0.002373 
+0.001126 0.000769 0.000054 -0.003192 -0.004511 0.001107 
+-0.001882 -0.004683 0.000011 -0.002994 0.002742 -0.001603 
+-0.002042 0.003859 -0.005826 -0.002923 0.001145 -0.004310 
+-0.003176 -0.005650 -0.002831 0.001181 0.001431 -0.001306 
+-0.001572 0.000799 -0.002344 0.003070 0.001559 0.000151 
+0.002207 0.001437 -0.000135 0.003190 0.001840 -0.000512 
+0.000985 0.004384 -0.000714 0.003304 0.003104 0.001035 
+0.001595 0.003793 0.001595 0.001273 0.003590 0.001235 
+0.000161 0.002213 0.000021 0.001533 0.001909 -0.001459 
+0.001542 0.002251 -0.003168 0.000356 0.002315 -0.000732 
+-0.000859 0.002733 0.000991 0.000662 0.002764 -0.001036 
+-0.002109 0.001067 -0.001166 -0.002354 -0.000362 -0.000488 
+-0.000391 -0.000116 0.000055 -0.000136 0.000007 -0.000129 
+-0.000398 0.000086 -0.001303 -0.002482 0.000166 -0.004277 
+-0.001986 0.001706 -0.003476 0.001317 0.001257 0.001202 
+-0.002039 -0.006152 -0.001649 -0.006462 -0.014529 0.006447 
+-0.005305 -0.054815 0.034012 0.028237 -0.095271 0.088271 
+-0.032929 -0.140724 0.197279 -0.031139 0.004946 -0.026831 
+-0.002581 -0.001728 -0.000593 -0.003556 0.000294 -0.001871 
+-0.000845 -0.001357 0.000005 0.001499 -0.002298 0.001127 
+-0.000470 -0.004421 0.003010 -0.003553 -0.006671 0.006632 
+-0.005190 -0.012256 0.011940 -0.018373 0.000383 0.008930 
+-0.012513 -0.002802 0.010006 -0.012606 0.002818 0.003717 
+-0.005733 0.015733 -0.003067 0.000595 0.029160 -0.002722 
+0.005305 0.055717 -0.034467 0.049973 -0.076452 -0.043562 
+-0.001959 0.005955 0.000039 -0.002669 0.008257 0.000761 
+-0.003880 0.005150 0.002868 -0.001661 -0.004429 0.004425 
+-0.004326 -0.006770 0.001451 0.001790 -0.001766 -0.000573 
+0.001670 -0.000088 -0.002887 -0.000365 0.000081 0.000586 
+-0.003985 -0.002366 0.006662 -0.003615 -0.005516 0.010926 
+-0.003124 -0.007707 0.008748 -0.001574 -0.003457 0.000734 
+-0.001062 0.002059 -0.002642 -0.000488 0.002446 -0.000504 
+0.000445 -0.000978 0.002075 -0.000218 -0.001849 0.001928 
+-0.000190 -0.001466 0.000379 -0.001203 0.000338 -0.002932 
+0.000417 -0.002778 -0.001721 0.000155 -0.004627 -0.001476 
+-0.001833 -0.003222 -0.001889 0.001026 -0.001212 0.000215 
+0.000053 -0.000823 0.002122 -0.000072 -0.000560 0.001265 
+0.002089 0.001455 -0.002468 0.002306 -0.002649 -0.003640 
+-0.001251 -0.002207 -0.005040 -0.000614 0.001947 -0.003492 
+-0.000199 -0.001047 0.000019 -0.000012 -0.001827 -0.001076 
+0.001669 -0.001579 -0.000556 0.001087 -0.002348 0.000272 
+-0.005228 -0.002790 -0.000128 -0.001360 -0.000136 0.000408 
+0.002906 -0.001219 -0.001401 0.004602 0.001701 -0.002784 
+0.001316 0.000323 -0.003509 0.000118 -0.002043 -0.000242 
+0.001597 -0.000765 -0.000096 0.001083 0.001458 0.001458 
+-0.000642 0.003943 0.002267 -0.003013 0.000998 0.000800 
+-0.003018 -0.002594 0.001403 -0.000581 0.000291 -0.002906 
+-0.002642 -0.005585 0.001170 -0.000554 -0.001658 0.003329 
+0.000187 0.000352 0.001285 0.001119 -0.001177 -0.001707 
+-0.000127 -0.001674 -0.000762 -0.000023 -0.000225 -0.000021 
+0.000776 0.000064 0.000338 0.000017 0.000214 -0.000274 
+-0.000836 0.000677 -0.003130 -0.002208 0.000345 -0.002375 
+0.000616 -0.001620 0.001637 0.002877 -0.001508 0.007182 
+0.001919 0.001776 -0.004720 0.014405 -0.004881 -0.014524 
+0.006935 0.006678 -0.014629 0.006583 0.005332 0.001001 
+0.020227 0.013148 -0.020227 -0.076543 0.011057 -0.088674 
+0.011465 0.006454 0.019502 -0.000181 0.006222 -0.002567 
+0.003560 0.010882 -0.005022 0.003242 0.004211 -0.003103 
+0.012676 0.005278 -0.007704 0.018013 0.001805 -0.009129 
+0.054884 -0.043050 -0.005850 -0.066248 0.188121 0.041273 
+0.013481 -0.020115 0.050786 0.005121 -0.007537 -0.003241 
+-0.004587 0.003310 -0.000791 -0.014490 0.003829 0.001841 
+-0.014786 0.000765 0.005908 -0.014245 0.000733 0.006985 
+-0.006984 0.010171 0.001346 -0.000915 0.003141 -0.000050 
+-0.002518 0.001552 0.002146 -0.005857 -0.004085 0.005344 
+-0.005042 -0.001534 0.005356 0.000531 0.000722 -0.002629 
+0.001718 0.002643 -0.007911 0.001273 0.001225 -0.004511 
+-0.001950 0.000063 0.001742 -0.003913 -0.003984 0.004552 
+-0.002858 -0.001722 0.004185 -0.001119 0.000777 0.002650 
+0.000082 0.000327 0.003889 -0.002829 0.000199 0.005141 
+-0.003101 -0.000099 0.004286 -0.002091 -0.001001 0.002252 
+0.000375 -0.002147 0.002012 -0.000637 -0.004374 0.003899 
+-0.002299 -0.006748 0.001072 -0.002554 -0.003617 -0.001382 
+-0.000776 -0.000209 0.000127 -0.000191 0.000330 0.001974 
+-0.001433 0.002866 0.000472 0.001622 0.003031 -0.001132 
+-0.001088 -0.000032 -0.001162 0.000300 -0.000438 -0.000714 
+-0.000635 -0.000108 0.000756 -0.000622 -0.002834 0.000530 
+-0.000310 -0.000373 -0.000528 -0.004082 -0.000408 0.003934 
+-0.004881 -0.000777 0.003662 -0.002107 -0.000445 -0.000563 
+0.000492 -0.001977 0.000254 -0.001644 -0.002522 0.001869 
+0.003214 -0.006571 0.001553 0.002614 -0.003233 -0.000214 
+0.000079 -0.004711 0.000106 -0.003634 -0.006110 0.002971 
+-0.003217 -0.007061 0.003530 -0.002622 -0.005987 0.003092 
+0.000647 -0.001794 0.000938 -0.001558 -0.000223 0.000726 
+0.000445 0.000200 0.000216 -0.001552 -0.001530 0.000758 
+-0.002446 -0.000489 0.002641 0.000397 -0.000793 -0.001570 
+-0.001803 0.000000 -0.002541 -0.000623 -0.000693 -0.001888 
+-0.001099 -0.002659 -0.001250 -0.000267 -0.003513 -0.000603 
+0.001430 -0.002035 -0.000086 -0.000782 0.001718 -0.003096 
+-0.000105 0.002764 -0.004378 -0.002533 0.000259 -0.001769 
+-0.002815 -0.003904 -0.000329 -0.001226 -0.004940 0.001769 
+-0.002882 -0.000118 0.006376 0.000654 -0.003759 -0.002649 
+0.003266 -0.004179 -0.009819 0.004322 0.000850 -0.001832 
+-0.000845 -0.003848 0.004060 -0.002083 -0.006463 0.008226 
+-0.005683 -0.005561 0.009549 -0.007368 -0.009716 0.014709 
+-0.006821 -0.013025 0.009946 -0.018659 -0.026626 0.007974 
+0.034832 0.026358 -0.025742 0.023665 0.015193 -0.030660 
+0.015428 0.008391 -0.016671 0.012163 -0.000159 -0.001988 
+0.001354 0.000135 -0.000406 0.000869 0.000700 -0.001843 
+0.004005 -0.001836 -0.009707 -0.006040 0.014904 -0.007130 
+-0.000958 0.011029 -0.002464 0.003345 0.008745 -0.004836 
+-0.000766 0.000032 0.002854 -0.001502 -0.006226 0.004999 
+0.000183 -0.002847 0.005428 -0.002461 0.000646 0.004189 
+-0.001929 -0.001861 0.003685 -0.000827 0.000350 -0.000149 
+0.000405 0.001143 -0.000433 0.000959 -0.002661 -0.001358 
+-0.001890 -0.005127 -0.001086 -0.000465 -0.002549 0.000703 
+0.001014 0.003868 -0.000909 0.005423 0.007799 -0.002740 
+0.003103 -0.001547 -0.000757 0.000937 -0.000937 -0.001071 
+0.000549 -0.000119 -0.000186 -0.000348 -0.000599 0.000499 
+0.000023 -0.000594 0.002925 0.001402 0.000299 0.002368 
+0.001206 -0.004825 0.005294 -0.006542 -0.003263 0.000666 
+-0.004880 -0.001240 -0.000679 -0.003218 -0.000340 -0.001202 
+-0.001806 -0.000202 -0.002605 -0.000619 0.000825 -0.004365 
+-0.000829 -0.001238 -0.001136 0.000444 -0.000029 -0.000156 
+0.001100 -0.001388 0.000528 0.002575 -0.003110 -0.000323 
+0.000744 -0.002562 0.001653 0.000455 -0.001322 0.002190 
+0.000000 -0.003033 0.001475 0.000184 -0.000215 -0.000612 
+0.001349 0.001384 -0.000282 0.002237 -0.001869 0.000564 
+0.000756 -0.004451 0.000356 0.002590 -0.002700 -0.000055 
+0.001951 -0.000268 -0.000875 0.001891 0.000262 -0.000152 
+0.000135 0.000820 0.002165 -0.000634 0.000844 0.003307 
+-0.001023 -0.000122 0.001687 -0.001464 0.001199 -0.000537 
+-0.002143 0.000330 0.000925 -0.004821 0.000345 0.002805 
+-0.008912 -0.001682 0.003321 -0.001175 -0.005137 0.007486 
+-0.007934 -0.000355 0.002131 -0.005724 -0.002077 0.001571 
+-0.003092 -0.000232 0.000696 -0.000886 0.000017 0.000049 
+0.000221 -0.000191 -0.000037 0.001757 0.001218 -0.001499 
+0.001307 0.001479 -0.001234 -0.000492 0.000732 -0.000689 
+-0.001315 0.000860 -0.002188 -0.000823 -0.000128 -0.001386 
+-0.001612 -0.000866 0.006939 0.000131 0.000107 0.010022 
+-0.001846 -0.003667 0.009944 -0.005751 -0.007794 0.006587 
+-0.008868 -0.007034 0.002746 -0.008653 -0.006169 0.004426 
+-0.004885 -0.005452 0.009005 -0.002866 -0.006435 0.009296 
+-0.002390 -0.009073 0.007435 -0.002278 -0.005808 0.005777 
+-0.005675 -0.003910 0.003006 -0.006222 -0.003017 0.000785 
+-0.001078 -0.006641 0.002132 0.000581 -0.007116 0.001374 
+-0.000444 -0.005933 0.002913 -0.000838 -0.005518 0.003510 
+0.000612 -0.006082 0.006913 -0.011994 -0.003099 -0.006062 
+-0.009211 0.006974 -0.012566 -0.008684 0.006731 -0.012593 
+-0.002066 -0.000275 0.005175 -0.002199 -0.004467 0.007318 
+-0.000933 -0.001609 0.005215 -0.000092 -0.001776 0.001837 
+-0.002720 -0.003101 0.001435 -0.005819 -0.003880 0.000701 
+-0.007207 -0.003123 0.002131 -0.004570 -0.003769 0.005265 
+-0.000084 -0.006091 0.001960 0.000192 -0.004664 0.001556 
+0.000320 -0.000671 -0.000096 -0.000288 0.002252 -0.000462 
+-0.000560 0.000874 0.000123 -0.000672 -0.001648 0.000330 
+0.001223 -0.000327 0.000435 0.005432 0.004354 -0.000364 
+0.003518 0.003318 -0.009182 -0.002453 0.003397 -0.003774 
+0.000304 0.004605 -0.002265 -0.000442 0.002145 -0.001712 
+-0.000500 -0.000510 -0.002039 0.000078 -0.006524 -0.001467 
+-0.000492 -0.006148 -0.002623 -0.002541 -0.000848 -0.002969 
+-0.004104 0.001193 -0.001417 -0.003982 0.001113 0.000367 
+-0.000840 -0.000905 0.001357 0.002379 -0.000247 0.002150 
+0.001660 -0.001161 0.001825 0.000000 0.000000 0.000000 
+-0.004447 -0.003204 0.001551 -0.003940 -0.003290 0.001861 
+0.002377 0.002199 -0.000337 0.003048 0.002078 -0.000381 
+0.001827 0.000869 -0.000035 -0.000017 0.000004 0.001855 
+-0.002661 -0.003672 0.003120 -0.003886 -0.000941 0.002673 
+-0.000154 -0.002390 0.001927 0.002401 0.000864 -0.001592 
+0.001634 0.003328 -0.004979 0.000060 0.004254 -0.003309 
+-0.001323 0.001238 -0.001217 -0.000568 -0.003182 0.001023 
+-0.001641 -0.005472 0.003554 -0.002775 -0.005718 0.006561 
+-0.005643 -0.004031 0.003793 0.001322 -0.000661 -0.000783 
+0.003504 -0.000513 -0.004017 0.007266 0.003741 -0.003335 
+0.003355 0.003667 -0.003121 0.001036 0.001153 -0.000947 
+-0.000526 0.000545 -0.000519 -0.000380 0.003760 -0.006487 
+0.007126 0.002588 -0.006352 -0.001066 -0.001282 -0.003064 
+-0.002454 0.000926 -0.001536 -0.000841 0.000185 -0.000143 
+0.001487 0.000847 0.001185 0.001358 0.000232 0.002410 
+0.000401 -0.000452 0.002542 -0.000972 0.000902 -0.001120 
+-0.000042 0.004355 -0.007493 0.003857 0.004692 -0.010369 
+0.000804 0.001991 -0.005217 -0.008426 -0.001175 0.003434 
+-0.007905 -0.000236 0.003105 -0.003723 0.001741 -0.001681 
+-0.007700 -0.001193 0.001508 -0.010274 -0.007084 0.005198 
+-0.006671 -0.005056 0.002220 -0.001877 -0.002182 -0.002806 
+0.002002 0.000825 -0.000328 0.001098 0.002274 -0.001685 
+-0.002902 0.003033 -0.004424 0.001961 0.014199 -0.009355 
+0.008910 0.007153 -0.009078 0.004268 -0.002303 -0.003760 
+0.000233 -0.002729 0.001217 -0.000933 -0.001379 0.003189 
+-0.004440 -0.003335 0.000193 -0.006635 -0.006562 -0.000018 
+-0.006848 -0.007232 0.003733 -0.003307 -0.003819 0.006043 
+-0.002308 0.000000 0.004462 -0.001466 -0.002405 0.005110 
+-0.003232 -0.005030 0.006643 -0.008246 -0.004768 0.003693 
+-0.000952 -0.003761 0.003332 -0.000365 -0.001297 -0.000167 
+0.003674 0.000212 -0.001351 0.004245 -0.000199 -0.002023 
+0.004091 -0.000414 -0.002434 0.002024 0.005204 -0.002168 
+-0.000429 0.001683 0.000199 -0.000551 -0.000580 0.000812 
+-0.000508 -0.003553 0.001345 -0.001468 -0.002876 0.000469 
+0.002251 -0.001305 -0.002179 0.002835 -0.000638 -0.002066 
+0.002554 -0.000923 0.000228 0.000000 -0.002435 -0.000348 
+0.000443 -0.001059 -0.002291 -0.002096 -0.003434 -0.001620 
+-0.001457 -0.004286 -0.000833 0.001198 -0.004769 0.000612 
+0.001466 -0.002398 0.001730 -0.000353 -0.000861 0.001855 
+0.000190 -0.004505 0.002852 -0.001817 -0.002171 0.002189 
+-0.002062 -0.003438 0.001374 -0.004923 -0.003077 0.001077 
+-0.002583 -0.007735 0.005533 0.000425 -0.000354 0.004746 
+-0.002830 0.000400 0.001944 -0.000131 0.000183 0.000721 
+-0.000012 0.000012 0.000138 0.000085 0.001100 0.000203 
+-0.002216 0.001402 -0.000533 -0.001909 0.000418 -0.000974 
+0.003226 0.001452 -0.002742 0.001459 -0.000839 -0.001712 
+-0.002004 -0.000877 0.001066 -0.002358 -0.001262 -0.000582 
+-0.000677 0.001056 -0.003497 0.001673 -0.001115 -0.005583 
+0.002259 -0.003388 -0.004365 0.001318 -0.004907 -0.001472 
+0.000706 -0.003793 -0.001487 0.001741 -0.000989 0.000029 
+0.000955 -0.003056 -0.004417 0.002917 -0.003235 -0.001793 
+0.002196 -0.002719 -0.001077 0.003087 -0.001238 0.003431 
+0.003725 0.000340 0.006884 0.001530 0.000168 0.002546 
+-0.002781 -0.004499 -0.014715 0.001293 -0.010240 -0.022612 
+-0.002921 -0.013139 -0.010658 0.009298 0.010321 -0.034459 
+0.011273 0.000287 -0.030439 -0.007487 0.000045 0.001304 
+-0.015115 -0.010070 0.016902 -0.010575 -0.012374 0.004019 
+-0.022190 -0.014624 0.013543 -0.031333 -0.019333 0.003000 
+-0.036873 -0.017081 0.010401 -0.014291 -0.010868 0.000994 
+-0.002198 -0.001999 -0.004416 0.004617 0.002612 -0.005643 
+0.006994 0.006162 -0.001445 0.006055 0.000693 0.001517 
+-0.000227 -0.006270 0.005129 -0.002143 -0.006325 0.006221 
+0.000322 -0.003298 0.004481 -0.001301 0.000379 -0.000132 
+-0.002019 -0.004036 0.002002 -0.004251 -0.003585 -0.000542 
+0.000522 0.000347 -0.000586 0.001110 -0.001491 -0.002995 
+0.000795 0.002430 0.000814 -0.002433 0.002177 0.002919 
+-0.001791 -0.002650 0.003152 -0.002944 -0.002518 -0.001701 
+0.000892 0.002941 -0.002272 0.004766 0.004951 -0.001712 
+0.001494 -0.001954 -0.000460 -0.000584 -0.000256 -0.000467 
+-0.003279 -0.000294 -0.003221 -0.004303 -0.001230 -0.004303 
+-0.004185 -0.001067 -0.001518 -0.004500 -0.001500 0.002250 
+-0.002521 -0.002185 -0.001092 -0.001692 -0.003199 0.000392 
+-0.002109 -0.002076 0.000695 -0.001556 -0.001644 0.001081 
+0.000648 0.001315 0.000006 0.003561 0.002322 -0.001961 
+0.003568 0.000350 -0.001009 0.000931 -0.000269 0.002571 
+-0.000578 0.000054 -0.000313 -0.000262 -0.002701 -0.003139 
+0.001400 -0.000607 -0.001665 -0.002303 0.001062 -0.002244 
+0.001139 -0.002178 -0.002944 -0.001494 -0.000915 -0.001951 
+-0.000668 -0.001803 -0.001166 -0.003709 -0.002036 0.000473 
+-0.000373 -0.003353 0.000236 0.000788 0.001203 -0.001745 
+0.003772 0.000154 -0.002603 -0.000178 -0.000401 0.000900 
+-0.006271 -0.003451 0.001878 -0.001909 0.000367 -0.001291 
+-0.000111 -0.002235 -0.002318 0.002238 0.000159 -0.000378 
+0.000042 -0.000169 -0.000320 -0.000494 -0.003128 -0.000873 
+-0.002128 -0.004128 -0.003103 -0.002345 -0.000600 -0.004772 
+-0.002757 0.001871 -0.005352 -0.002140 0.000428 -0.003083 
+-0.000101 0.002563 -0.002361 0.001466 -0.000539 0.001190 
+0.003395 0.001502 0.002216 0.002844 0.002094 0.001779 
+0.002101 -0.000851 0.000465 0.002365 -0.004521 -0.001959 
+0.004128 -0.005158 -0.001382 0.005315 -0.000732 0.005305 
+0.007562 0.003307 0.007306 0.004673 0.001284 0.001001 
+0.006090 0.004743 -0.013895 -0.001333 -0.000390 0.008922 
+0.001187 0.004121 0.035897 0.007423 0.005769 0.045723 
+0.008804 0.005874 0.044981 0.009229 0.004730 0.037690 
+0.011699 0.003353 0.026785 0.014542 0.002373 0.011288 
+0.013156 0.001427 -0.003156 0.007932 0.000271 -0.001397 
+-0.001847 0.001752 0.004173 -0.007139 0.004046 0.001247 
+-0.003533 -0.003408 0.000402 -0.001550 -0.001364 -0.003535 
+0.000663 0.000157 -0.002837 0.001550 -0.002064 -0.000779 
+0.001519 -0.001107 0.001325 0.000192 -0.000191 0.000544 
+-0.000335 0.000847 0.000224 0.001697 0.000986 -0.000926 
+-0.000097 -0.000362 -0.002910 -0.003498 0.000776 -0.001578 
+-0.002056 0.000563 0.000549 -0.002136 -0.001628 0.001475 
+0.001662 -0.000311 0.003196 0.001411 -0.000659 0.001749 
+-0.001437 0.000343 -0.001044 -0.003190 0.000600 -0.000076 
+-0.001225 0.001490 0.001234 0.000016 0.001622 0.000643 
+0.002763 0.000659 -0.000011 0.004786 -0.000504 -0.000092 
+0.002915 -0.000589 -0.000258 -0.002345 0.000150 0.001073 
+-0.004701 0.000227 0.004549 -0.006619 -0.004046 -0.002298 
+-0.004653 -0.002894 0.001482 -0.002024 -0.001700 0.002202 
+-0.002072 0.000618 0.002775 -0.002858 0.002108 0.001885 
+-0.000919 0.000594 0.000996 0.000621 -0.002012 -0.000865 
+0.001689 -0.004252 -0.000652 0.003059 -0.001575 0.000183 
+0.000593 0.001157 -0.001242 0.002016 0.003145 -0.002903 
+-0.001800 0.005800 -0.005600 -0.001584 0.006456 -0.005011 
+-0.001048 0.002459 -0.003628 -0.000158 0.003328 -0.007922 
+0.002016 0.004773 -0.005727 0.005081 0.000581 -0.001535 
+0.005813 -0.000752 -0.001829 0.006825 -0.000159 0.000159 
+0.007314 -0.000327 0.001921 0.004461 0.001126 0.003502 
+0.003503 -0.003198 -0.002132 0.003876 0.001365 -0.002698 
+0.000184 -0.000615 0.000230 0.000506 -0.000780 0.000047 
+0.001159 -0.000864 0.000150 0.001652 -0.001403 0.000280 
+0.001478 -0.003015 -0.000213 -0.000039 -0.004230 0.002846 
+-0.000425 -0.000727 -0.002232 -0.002966 -0.000823 -0.003146 
+0.000173 0.000599 0.000461 0.002102 0.005161 0.002572 
+0.004592 0.003078 0.004281 0.000200 0.003466 0.002451 
+-0.005659 0.000448 -0.000549 -0.007457 -0.002001 -0.005742 
+-0.006161 -0.002327 -0.009192 -0.008295 -0.004111 -0.002449 
+-0.013157 -0.001692 -0.008465 -0.011389 -0.005823 -0.022565 
+-0.017162 -0.000467 -0.015913 -0.019735 0.005507 0.003520 
+-0.007358 0.007805 0.034271 0.205645 0.302419 6.302419 
+0.931818 0.373377 6.626623 1.378571 0.507143 5.328571 
+1.673367 0.547739 2.723618 0.016462 0.005089 -0.004676 
+0.011968 -0.002418 -0.017655 0.007608 -0.004340 -0.011981 
+0.009818 -0.001800 -0.008231 0.015500 0.001855 -0.007293 
+0.011840 0.006937 0.001762 0.013646 0.004208 -0.018515 
+0.007123 0.003881 -0.003721 0.003172 0.003163 0.000996 
+0.000597 0.000359 0.000164 -0.000401 -0.002223 0.001304 
+0.001160 -0.002007 0.001744 0.001846 0.001156 -0.000830 
+-0.000827 -0.004211 -0.003083 -0.000831 0.004717 -0.002101 
+-0.001227 0.004433 -0.001287 -0.001530 0.001604 -0.000623 
+0.000635 0.000128 -0.002987 0.001173 -0.001285 -0.001227 
+0.004170 0.001668 0.001001 0.001519 0.002915 -0.001683 
+0.000234 0.005417 -0.003490 0.001964 0.005600 -0.004200 
+0.001575 0.001326 -0.001672 0.000368 -0.002602 0.004495 
+0.001723 -0.002680 0.001110 -0.003294 -0.000777 -0.002716 
+0.000985 -0.000710 -0.004665 0.001864 0.002620 -0.002567 
+-0.000165 0.001773 0.002626 -0.001921 0.002561 0.001921 
+-0.005543 0.000460 -0.001915 -0.001045 -0.002509 0.000209 
+0.000980 0.000186 0.001653 0.004436 -0.002633 0.005154 
+0.004325 -0.005455 0.004169 0.001714 -0.001905 0.000651 
+0.001120 0.004175 0.000759 0.000302 -0.000030 0.000015 
+0.001949 0.001922 -0.007663 0.000560 -0.001937 -0.004841 
+0.007521 0.005537 -0.002176 0.006655 0.005470 -0.003130 
+0.004308 0.002692 -0.001615 -0.000722 0.000157 -0.000454 
+-0.000194 -0.002852 0.000831 -0.000904 -0.001725 -0.000726 
+-0.002786 -0.000920 0.000274 -0.000596 -0.001649 -0.001573 
+0.000036 0.000947 -0.001821 0.000504 -0.000504 0.002521 
+-0.000165 -0.005694 0.004126 -0.001340 -0.005863 -0.000057 
+0.001619 -0.003824 -0.003666 0.002992 -0.001619 -0.003279 
+0.000443 -0.000900 -0.001712 0.000861 -0.001939 -0.001621 
+-0.000304 -0.003220 -0.003334 0.005987 -0.001275 -0.003033 
+0.007472 0.000928 -0.003178 0.001490 -0.000008 0.001611 
+-0.001102 0.002108 -0.000585 -0.005279 0.003401 -0.003007 
+-0.006924 -0.002139 -0.008702 -0.017343 0.004826 -0.011214 
+-0.028917 0.001436 -0.006842 -0.036659 0.004625 -0.002432 
+-0.037516 0.007841 -0.006199 -3.772727 -0.181818 -1.272727 
+-3.341667 -0.608333 -1.870833 -2.503425 -0.609589 -1.071918 
+-1.305233 -0.171512 2.343023 0.006579 0.177632 6.067983 
+0.879925 0.371482 6.731707 1.338742 0.383367 5.239351 
+1.577608 -0.127226 2.328244 1.926910 -0.607973 -0.780731 
+2.207547 -0.377358 -2.212264 0.022824 -0.002627 -0.011987 
+0.023691 0.002030 -0.009262 0.024501 0.005418 -0.012430 
+0.016420 0.004165 -0.010068 -0.004074 0.003863 0.000797 
+-0.022789 -0.003273 0.037062 -0.005671 0.001800 0.019333 
+0.002675 0.000895 0.003646 0.000672 0.001299 -0.001640 
+0.001097 0.001720 -0.001938 0.002886 0.002405 -0.004137 
+0.004261 0.002468 -0.003153 0.001608 0.003309 -0.000247 
+-0.000892 0.004006 0.000444 -0.001273 0.005435 0.000529 
+-0.000462 0.007462 -0.000959 0.002860 0.007169 0.000010 
+-0.000019 0.000050 -0.000023 -0.003638 0.001534 0.000682 
+-0.002977 0.004481 0.000055 0.000231 0.003756 -0.000285 
+-0.001169 -0.001523 0.000272 -0.000128 -0.007885 -0.001830 
+0.000245 -0.006535 -0.002035 -0.001512 -0.001894 -0.002269 
+0.000869 0.004081 -0.005253 -0.000699 0.002481 -0.001836 
+0.001117 -0.001760 0.002267 0.000004 -0.004097 0.006561 
+-0.005000 0.001107 0.007751 -0.006287 0.002190 0.002284 
+-0.004046 -0.000916 -0.002687 -0.000300 0.000654 -0.002362 
+0.003732 0.001703 0.000544 0.003906 0.001947 0.003354 
+0.001560 -0.001319 0.002044 0.001679 0.000123 -0.000082 
+-0.001428 -0.001462 -0.001071 0.000533 -0.002187 -0.001547 
+0.002284 -0.004237 -0.005396 0.002517 0.002414 -0.003339 
+0.004713 0.004506 -0.000858 0.005195 0.004531 -0.000611 
+0.004000 0.003602 0.000399 0.000723 0.004032 0.000542 
+-0.001531 0.001729 0.000701 0.001632 -0.000741 -0.002009 
+0.001939 -0.002211 -0.001803 -0.000664 -0.000237 -0.000159 
+0.000096 -0.000282 -0.001203 -0.000016 -0.001739 -0.002472 
+-0.001099 0.001324 -0.004526 -0.001833 0.001184 -0.003110 
+-0.000163 -0.000922 -0.002934 -0.001799 -0.001913 -0.002658 
+-0.000519 -0.000753 0.000019 0.002580 -0.001753 -0.000260 
+0.003543 -0.001298 0.002175 0.002403 -0.001387 -0.000567 
+0.000110 0.000915 -0.006697 -0.002362 0.007149 0.000808 
+-0.029817 0.005491 -0.003444 -0.037113 0.014093 -0.011107 
+-4.090909 0.375758 -0.284848 -4.067265 0.116592 -0.197309 
+-4.485830 0.218623 -0.489879 -4.708487 0.184502 -1.531365 
+-3.941896 -0.207951 -1.963303 -2.615979 -0.448454 -1.211340 
+-1.413793 -0.360920 1.832184 -0.383534 -0.172691 4.913655 
+0.385932 -0.079848 5.399240 0.790650 -0.252033 3.896342 
+1.126437 -0.588506 1.248276 1.695055 -0.456044 -0.947802 
+2.409775 0.296992 -1.887218 0.021432 0.003711 -0.022239 
+0.022549 0.002766 -0.007742 0.018485 0.000739 -0.009041 
+0.011886 0.001841 -0.012363 -0.008507 -0.004526 0.008105 
+-0.018997 -0.027060 0.003742 -0.010318 -0.012933 0.006341 
+-0.003811 -0.003058 -0.004508 -0.000962 0.002194 -0.004327 
+0.000477 0.002470 -0.000962 -0.001847 -0.000624 0.004429 
+-0.003727 -0.002897 0.001945 -0.003351 -0.002058 -0.000506 
+-0.005724 -0.001160 -0.003898 -0.004096 -0.000446 -0.004943 
+0.000794 -0.003529 0.001985 -0.002188 -0.006632 0.011215 
+-0.002768 -0.005798 0.001450 0.000865 0.003835 0.003120 
+0.005027 0.003140 0.003643 0.002893 0.003720 0.002825 
+-0.000849 0.001428 -0.004304 -0.001688 0.000658 -0.003243 
+-0.000307 -0.000011 -0.000465 0.000306 0.000191 0.000206 
+0.000277 -0.000583 -0.000668 -0.001518 -0.001826 -0.002128 
+0.000883 -0.000217 0.000001 0.001579 -0.001800 0.000808 
+0.001868 -0.002191 0.008844 -0.000128 -0.000938 0.009724 
+-0.001515 -0.001205 0.006176 0.000990 -0.001136 0.000787 
+-0.000437 0.000842 -0.000922 -0.002062 0.001056 -0.003280 
+-0.000370 0.002593 -0.004074 -0.003035 0.003849 -0.000201 
+-0.003270 0.002733 -0.000122 -0.003484 -0.000504 0.001627 
+-0.002373 -0.000554 0.000081 0.000180 0.001439 -0.001159 
+0.001013 0.002998 -0.000786 0.002280 -0.001824 -0.004385 
+0.001398 -0.002140 -0.004118 -0.000184 -0.002107 -0.002587 
+0.000912 -0.003961 -0.001152 0.000000 -0.005690 -0.002414 
+-0.000687 -0.003940 -0.001420 -0.001908 -0.000400 -0.001883 
+0.000423 -0.001851 -0.003345 -0.001577 0.002690 -0.004582 
+0.000185 -0.002501 -0.001574 0.001663 -0.001937 -0.002491 
+0.003806 -0.001236 -0.000686 0.003163 0.003952 -0.000098 
+0.003322 0.003535 -0.003694 -0.000266 -0.000344 -0.000338 
+0.000242 0.000116 0.002063 0.000597 -0.001216 0.001589 
+-0.002428 -0.001102 0.000069 -0.016723 0.009156 -0.005840 
+-0.028002 0.013369 -0.011597 -3.851163 0.818605 -0.372093 
+-3.828194 0.722467 -0.511013 -3.330049 0.753695 -0.290640 
+-0.024820 0.012488 -0.001842 -0.025370 0.016703 -0.016712 
+-0.013256 0.000975 -0.039664 -0.000296 -0.009548 -0.032223 
+-0.001963 -0.001775 -0.002511 -0.004853 0.004398 0.014329 
+-0.006900 0.005185 0.015630 -0.008617 0.003529 0.003579 
+-0.009217 -0.003928 -0.025751 -0.003728 -0.011098 -0.040785 
+0.003935 -0.004677 -0.017985 0.008543 -0.000993 0.003353 
+0.008501 -0.003831 0.004992 0.010618 -0.005083 0.000579 
+-0.006471 -0.010216 0.009375 -0.012147 0.009402 0.003206 
+0.009411 0.006747 0.008337 0.003959 0.000451 0.002768 
+-0.001436 -0.005008 0.004255 -0.003900 -0.006814 0.009382 
+-0.003193 -0.005688 0.005843 -0.002269 -0.003567 0.000786 
+0.002136 -0.000699 -0.001108 0.004180 0.001328 0.000798 
+0.000905 0.001522 0.000870 -0.004595 0.004321 -0.005075 
+-0.001718 -0.002598 -0.003294 -0.004439 0.000015 0.001803 
+-0.002779 -0.001969 0.004157 -0.000192 0.000326 -0.000892 
+0.002637 -0.000036 -0.005182 0.001244 -0.000414 -0.002560 
+-0.000227 -0.000027 0.000901 -0.000904 0.000456 -0.000383 
+-0.002074 -0.003606 -0.000934 0.001959 -0.001432 -0.001478 
+0.000775 -0.002508 -0.003921 -0.000750 -0.004341 -0.000178 
+0.003377 -0.002057 0.001582 0.001722 -0.002627 -0.001429 
+-0.000664 -0.000650 -0.000126 -0.001814 0.001617 0.000432 
+-0.002179 -0.000823 0.007587 -0.007506 -0.008382 0.003107 
+-0.005335 -0.005679 -0.001586 -0.004342 -0.001012 -0.003160 
+-0.001289 0.001630 -0.006406 0.002245 0.004113 -0.001308 
+0.001217 0.002944 0.000099 0.002185 -0.002185 0.002521 
+-0.000976 -0.000412 -0.002728 -0.000280 0.000658 -0.001053 
+0.000321 0.000742 0.002769 0.001363 0.002242 0.004566 
+0.000656 0.001670 0.001841 -0.000283 -0.002790 -0.001340 
+0.000870 -0.003391 0.002522 -0.000109 0.000093 0.000013 
+-0.002603 0.000435 -0.001600 -0.003418 -0.000692 -0.000427 
+0.000120 -0.000239 -0.001071 0.005105 0.000258 0.002046 
+0.006665 0.003714 -0.000083 0.005779 0.002419 -0.000791 
+0.003920 0.001626 -0.000182 -0.000211 0.003452 -0.000889 
+-0.003119 0.000724 -0.001496 -0.001794 -0.003025 -0.002080 
+0.007004 -0.008224 -0.001051 0.019131 -0.001808 0.003702 
+0.001386 0.004048 0.000958 -0.023035 0.006776 -0.007767 
+-0.030134 0.007921 -0.004402 -0.020330 0.014109 -0.002553 
+-0.002758 0.007990 -0.009762 0.047029 -0.017977 -0.020869 
+0.035395 0.011056 0.027824 -0.006212 -0.013193 -0.003435 
+-0.019241 -0.002124 -0.010036 -0.012506 0.005802 -0.023109 
+-0.007057 -0.006148 -0.019584 -0.003885 -0.004685 -0.008809 
+-0.005577 -0.002208 -0.005593 -0.006544 -0.000873 -0.011629 
+0.000930 -0.001260 -0.030370 0.019499 -0.001509 -0.065696 
+-0.000850 0.002693 -0.008641 0.001579 -0.004701 0.015255 
+-0.001455 0.000929 0.012411 -0.005374 0.000712 0.005682 
+-0.002288 0.000273 0.003191 0.002363 0.000911 0.004464 
+0.006490 0.002946 0.004150 0.014587 0.004368 -0.005944 
+0.024714 -0.005072 -0.012332 -0.005284 0.011480 -0.013648 
+0.000524 0.004820 -0.006081 -0.001178 0.000089 0.001666 
+-0.002901 0.001162 0.001138 -0.002242 0.001889 0.001115 
+0.002113 0.000794 -0.001083 -0.000943 0.002853 -0.004676 
+-0.002733 0.001533 -0.000368 -0.003311 -0.003731 0.002810 
+-0.003865 -0.003289 0.002476 -0.001729 -0.000233 -0.002081 
+-0.000117 0.000117 -0.002188 -0.001408 0.000850 0.000689 
+-0.001197 0.002379 0.000443 -0.002201 -0.000229 0.004689 
+-0.001330 -0.002566 0.002934 0.001729 -0.002308 -0.000283 
+0.001642 -0.000395 -0.000331 0.001249 -0.001257 0.001560 
+0.000494 -0.000575 0.002623 0.000828 -0.003478 0.001944 
+0.002292 -0.003934 0.002143 0.002258 -0.002165 0.003044 
+-0.006307 0.001807 0.002440 -0.009121 0.004778 -0.002336 
+-0.005778 0.002719 -0.002334 -0.001117 -0.000097 -0.001088 
+0.000980 -0.001987 0.002588 -0.001704 -0.002513 -0.000973 
+0.002812 -0.004574 0.002378 0.003662 -0.002966 0.003406 
+-0.002111 0.000154 0.000639 0.000677 0.001294 0.002814 
+0.002354 -0.002644 0.007898 -0.000696 -0.003889 0.004642 
+0.000000 -0.000087 0.000174 0.002418 0.002696 -0.002821 
+0.000804 0.004590 -0.004286 -0.001370 0.005246 -0.002171 
+-0.001910 0.004193 0.000914 0.000000 0.002481 0.001353 
+-0.000653 0.001110 -0.000424 -0.001560 0.000743 -0.000940 
+-0.001049 0.000525 -0.000410 0.001190 0.004624 0.000839 
+-0.000492 0.003672 0.001065 -0.002861 -0.000427 0.000324 
+-0.002031 -0.004200 -0.002813 0.003515 -0.006644 -0.000963 
+0.006595 -0.002887 -0.007733 0.010812 0.006445 0.001282 
+-0.009526 0.004305 -0.001877 -0.012414 0.000851 -0.001081 
+-0.002947 0.000798 -0.001429 0.012115 -0.002204 -0.008497 
+0.011187 -0.008912 -0.011034 0.012116 -0.002181 -0.005041 
+0.000485 0.000294 0.000896 -0.003455 -0.003125 0.005875 
+0.004901 0.002206 -0.001351 0.014534 -0.007796 0.000045 
+0.003690 -0.004268 -0.002916 0.001781 -0.000015 -0.002076 
+-0.001526 -0.003611 0.004326 -0.006685 -0.005769 0.004121 
+0.001441 0.003659 0.003260 0.003829 0.000311 0.002713 
+0.003955 -0.001005 0.000675 0.002206 -0.002222 -0.001882 
+0.002309 -0.003275 -0.003225 0.002498 -0.003475 -0.005107 
+0.002099 -0.003795 -0.006940 -0.001470 -0.005401 -0.007059 
+-0.005393 -0.006256 -0.005739 -0.004564 -0.003910 -0.006089 
+0.000435 -0.001169 -0.007133 0.003492 -0.001779 -0.001274 
+0.003191 -0.003897 0.007414 -0.003196 -0.007338 0.009499 
+-0.000919 -0.003649 0.000685 0.002762 0.000370 -0.000274 
+0.000654 -0.000146 -0.000307 -0.000512 -0.000589 0.002800 
+0.000007 0.000336 0.001386 0.000313 0.000782 -0.001769 
+0.000500 0.002999 -0.004921 0.000914 -0.001559 -0.002204 
+-0.000250 -0.000652 -0.000936 -0.001285 -0.001500 -0.001010 
+-0.002465 -0.002365 -0.000406 -0.003248 -0.002116 0.001195 
+-0.003732 -0.001733 -0.000755 -0.000746 -0.001526 -0.000211 
+-0.000050 -0.000121 -0.000060 -0.000085 0.000704 0.000422 
+-0.001163 -0.000989 0.002230 -0.000364 -0.002546 0.002598 
+-0.003370 -0.001393 0.001630 -0.002862 -0.001538 0.002462 
+-0.001727 -0.000020 0.002110 -0.001036 0.001391 0.000908 
+-0.001714 0.001823 0.000527 -0.002546 0.000883 -0.000078 
+-0.003729 -0.002923 0.000932 0.000757 -0.000207 0.001477 
+0.003603 -0.001486 -0.000513 0.006757 -0.000634 0.000710 
+0.003223 -0.001822 0.006719 0.005142 -0.002645 0.004116 
+0.000305 -0.000610 -0.001017 0.001615 0.000971 -0.000047 
+0.001303 -0.004465 0.002622 -0.000325 -0.008336 0.008243 
+0.001946 0.001307 0.005853 -0.001284 0.000523 -0.002114 
+-0.002766 0.000589 -0.004670 -0.002624 0.000899 -0.000290 
+0.000696 -0.000242 0.004298 0.000319 -0.000544 0.003940 
+-0.001206 -0.000708 -0.002273 0.002271 0.002656 -0.005110 
+-0.001960 0.001585 0.000046 -0.000429 0.000100 -0.000217 
+0.002380 -0.001842 -0.000053 0.002242 -0.002077 -0.000926 
+-0.002812 -0.000204 -0.004182 -0.004418 -0.001059 -0.005746 
+0.001690 -0.002728 -0.005230 0.005482 -0.003314 -0.001727 
+0.002925 -0.002545 0.000981 -0.002593 0.000667 0.000593 
+-0.007696 -0.001288 -0.002482 -0.005258 -0.000162 -0.004166 
+-0.001885 -0.001097 -0.001272 -0.001482 0.000106 0.006525 
+-0.002087 0.002402 0.005059 -0.003629 0.001488 0.003234 
+-0.002163 0.000271 0.001623 0.000007 -0.001783 -0.001277 
+0.002317 -0.005430 -0.005786 0.001696 -0.006326 -0.006933 
+0.000524 -0.002999 -0.003174 0.000678 -0.000015 0.000209 
+0.001479 0.000504 0.001149 0.002997 -0.000875 -0.000823 
+0.002144 -0.001254 -0.002617 -0.000788 -0.000155 -0.002536 
+-0.002088 0.000657 -0.002906 -0.002443 -0.002650 -0.004925 
+0.000495 -0.004244 -0.005656 0.002150 -0.002213 -0.004495 
+-0.000152 -0.000285 -0.000933 -0.005551 -0.000319 -0.000238 
+-0.008099 -0.001453 0.001839 -0.005164 -0.000836 0.001400 
+-0.000070 0.000865 -0.000048 0.003416 -0.001454 -0.001198 
+0.004138 -0.001531 -0.000970 0.002901 -0.003529 0.001412 
+-0.000073 -0.005768 0.000641 0.001062 -0.000701 0.001506 
+-0.000115 0.003453 0.000230 0.001271 0.003983 -0.006525 
+-0.002447 0.003505 -0.001446 -0.003239 0.001210 -0.002429 
+-0.001250 0.001094 0.001250 -0.002640 0.001820 0.000747 
+-0.002393 0.001984 0.000374 -0.000593 0.000201 -0.000752 
+-0.001793 -0.002993 0.002964 -0.004289 -0.001838 0.001818 
+0.001895 -0.001394 -0.000805 0.004900 0.000086 0.000759 
+0.001302 -0.004900 0.000553 0.003269 -0.005979 -0.000793 
+0.002673 -0.001743 -0.002357 0.000146 0.000077 0.000567 
+0.001139 -0.000578 0.001624 0.000430 -0.001255 -0.000785 
+0.000044 -0.002486 -0.002627 -0.000408 -0.001746 -0.003807 
+0.000405 -0.001806 -0.001074 0.000450 -0.002394 -0.000532 
+0.001339 -0.006217 0.004272 -0.000060 -0.001582 0.004257 
+-0.004016 -0.002402 0.002402 0.001152 -0.002913 0.002575 
+0.004821 0.000338 -0.000409 0.006463 -0.001651 0.001311 
+0.000275 -0.000083 -0.000004 -0.004546 -0.000188 0.000759 
+-0.001808 0.000573 0.002469 0.002683 -0.003107 0.003461 
+0.000017 -0.010000 -0.000034 -0.000007 -0.001197 -0.005987 
+-0.002331 0.002331 -0.007288 -0.001892 -0.001409 -0.003040 
+0.001261 -0.000734 0.000495 0.003975 -0.003205 0.002832 
+0.002815 -0.001342 0.002285 -0.000227 0.000909 -0.000114 
+0.001441 -0.002290 0.000211 0.004437 -0.006931 -0.000216 
+0.005940 -0.006482 -0.003606 0.004651 0.002295 -0.006311 
+-0.004107 -0.000067 -0.004147 -0.004770 0.000152 -0.002649 
+-0.002988 -0.000616 -0.000168 -0.002008 -0.002126 0.000827 
+-0.001705 -0.003332 -0.002391 -0.003984 -0.002650 -0.000918 
+-0.003178 0.000000 0.000000 -0.000450 0.001196 0.001212 
+0.000860 0.001069 0.002078 0.000296 0.000055 0.000003 
+-0.000427 -0.002917 -0.005745 -0.001624 -0.006101 -0.009152 
+-0.003735 -0.005846 -0.007132 -0.003285 -0.003048 -0.003728 
+0.000219 -0.002186 -0.002095 -0.000063 -0.001485 -0.008733 
+0.002873 -0.002155 -0.011549 0.002469 0.001490 -0.005592 
+-0.000418 0.000836 0.002463 -0.007737 -0.000128 0.002472 
+-0.000915 -0.002100 0.006487 -0.006755 -0.004364 -0.000615 
+-0.005683 -0.006731 0.000172 -0.003616 -0.004209 -0.001785 
+-0.001763 -0.001919 -0.000414 0.004504 -0.003293 -0.001908 
+0.006872 -0.004664 -0.004836 0.006935 -0.006321 -0.005452 
+0.005327 -0.004169 0.000010 0.001912 -0.003687 0.000905 
+0.002520 -0.002455 0.000753 0.001643 -0.000290 -0.002948 
+0.006308 0.000956 -0.002922 0.000846 -0.000562 -0.000946 
+-0.006873 0.003338 -0.001066 -0.004641 -0.003903 -0.001519 
+-0.005071 -0.001772 0.001283 -0.001783 -0.002423 -0.001627 
+-0.002217 -0.001958 -0.000963 0.000890 -0.000912 0.000286 
+-0.005417 -0.002140 0.002725 0.002918 -0.001266 -0.000556 
+0.003651 -0.002521 -0.001976 0.001100 0.003808 -0.001419 
+0.001114 0.002143 -0.005968 0.000200 -0.001756 -0.001828 
+0.001951 -0.003002 -0.001942 0.004850 -0.003861 0.001667 
+0.000989 -0.001720 0.001364 0.000043 -0.000216 -0.001082 
+0.001006 -0.003070 0.001413 -0.000409 -0.007048 0.007273 
+-0.005105 -0.000777 0.003939 0.000987 -0.001508 0.000404 
+0.002070 -0.001132 -0.008520 0.005615 0.008385 -0.009769 
+-0.001966 0.004082 -0.005675 0.006301 -0.001350 0.001126 
+0.001027 -0.000577 0.001462 -0.000664 0.000940 -0.000047 
+-0.000761 0.000077 0.000457 0.000000 -0.002273 0.001513 
+0.001409 -0.003734 0.000843 0.003545 -0.001030 0.001879 
+0.001171 -0.001629 -0.000327 -0.000297 -0.001877 -0.002498 
+0.000112 -0.000924 -0.002419 -0.000789 0.000532 -0.001341 
+0.001269 -0.001204 0.000352 0.001280 -0.001513 0.000222 
+-0.000665 -0.002432 -0.000885 0.002413 -0.004634 -0.000153 
+0.003813 -0.007689 0.001394 0.001465 -0.003758 0.000746 
+-0.000961 0.004922 -0.004203 -0.001066 0.002477 -0.008124 
+-0.000427 0.001111 -0.004528 0.002066 -0.000777 -0.002331 
+0.004276 -0.001129 -0.002155 0.002112 -0.001109 -0.000655 
+-0.001514 -0.002464 -0.002695 -0.000594 -0.000770 -0.001640 
+-0.001355 -0.000115 0.001760 -0.000252 -0.000034 0.000932 
+-0.000392 -0.000219 -0.001042 -0.001515 -0.003030 0.000000 
+-0.003959 -0.004443 0.000072 -0.004501 -0.004031 0.001370 
+-0.001593 0.000797 0.000163 0.001902 -0.003895 -0.000430 
+0.003330 -0.005034 -0.004170 0.003463 -0.004161 -0.004939 
+-0.000390 -0.003618 -0.005270 -0.002778 -0.002738 -0.004117 
+-0.003297 -0.003669 -0.002150 -0.003094 -0.003929 -0.000557 
+-0.000776 -0.001908 -0.001940 0.001073 0.002861 -0.003729 
+0.002875 -0.001727 -0.002876 -0.000218 -0.001122 -0.000775 
+0.003070 0.000415 0.003153 0.003025 0.004453 0.000362 
+0.007877 -0.000741 -0.002993 0.008087 -0.006836 -0.008306 
+0.004428 -0.004183 -0.010050 0.005743 -0.000795 -0.000972 
+0.004366 -0.001903 0.000672 0.003370 -0.000926 0.000148 
+0.003028 -0.000418 -0.001168 0.000707 0.000025 -0.000429 
+-0.000950 -0.001120 0.001267 0.000395 -0.001164 -0.000723 
+-0.002203 -0.002373 -0.001525 -0.000904 -0.002260 -0.004286 
+-0.001700 -0.001677 -0.000889 0.000613 0.000322 0.000594 
+0.002013 0.000577 0.001151 0.003533 -0.001175 -0.005094 
+-0.000038 0.004899 -0.004871 -0.002837 -0.004175 -0.001087 
+-0.002370 -0.004889 0.000000 0.001710 -0.000774 -0.002691 
+0.004965 -0.001199 -0.002808 0.002096 -0.002074 -0.001994 
+-0.002002 0.003433 -0.000763 -0.001577 0.000721 -0.002518 
+0.000662 0.000018 0.002178 0.001006 -0.000309 0.002128 
+0.001640 -0.000820 -0.000410 0.007173 0.000033 -0.004715 
+-0.000194 0.001900 0.000598 -0.001965 0.001218 -0.003087 
+-0.000806 -0.004021 0.002815 0.003336 -0.002957 0.005346 
+0.002615 -0.001411 0.000629 -0.003489 -0.002944 0.000704 
+-0.002233 0.000936 0.000109 0.000873 -0.001825 -0.003259 
+0.002584 0.002326 -0.000207 0.006587 0.000238 -0.005768 
+0.000916 0.003466 -0.008502 -0.002507 0.006208 -0.004820 
+0.000507 0.002327 -0.002017 0.000938 -0.002331 0.001197 
+0.003093 -0.002285 0.002633 0.001995 -0.001315 0.000799 
+0.003187 0.001471 -0.000981 0.004532 -0.003951 -0.000821 
+0.004305 -0.005757 0.000073 0.001112 -0.002179 -0.002013 
+0.001529 0.001125 -0.000894 -0.000753 -0.000280 0.001430 
+-0.001127 -0.001500 0.000676 0.000559 -0.000969 -0.001055 
+0.001399 -0.001658 -0.002383 0.002884 0.001913 -0.002914 
+0.000946 -0.002065 0.002452 0.001802 -0.006072 0.002765 
+-0.001034 -0.005086 0.000000 0.000407 -0.005839 0.003829 
+-0.001453 -0.005374 0.005780 -0.003469 -0.002531 0.002905 
+-0.000791 0.000466 -0.002471 0.002615 0.002536 -0.005170 
+0.004444 0.004056 -0.006278 0.005147 0.004282 -0.002292 
+0.000434 0.001653 0.000470 -0.002741 -0.003084 0.001026 
+-0.005592 -0.003212 -0.000720 -0.002615 0.000731 -0.000731 
+0.001990 0.001021 -0.002959 -0.000177 0.002789 -0.003084 
+-0.003125 0.001116 0.000967 -0.003706 -0.002073 0.001888 
+-0.004519 -0.000563 0.001126 -0.002753 -0.003360 0.001324 
+-0.001961 -0.003575 0.003451 -0.003148 -0.004079 -0.002002 
+-0.009726 -0.007510 -0.002985 -0.005699 -0.010957 -0.005649 
+-0.001044 -0.007071 -0.007972 0.000590 -0.000769 -0.004786 
+0.001942 0.004885 -0.000634 0.001789 0.006051 0.000797 
+-0.000517 0.002471 0.000720 -0.000934 0.001705 -0.005607 
+0.001085 -0.000830 -0.003560 -0.002471 0.000217 -0.001543 
+-0.002993 0.000350 -0.001391 -0.003474 -0.001714 0.000006 
+0.000655 -0.000091 -0.000132 0.005203 0.003799 0.003312 
+0.000000 0.008682 -0.003566 -0.003962 0.006689 -0.005197 
+0.002383 0.005155 -0.006651 0.001926 0.000975 -0.004446 
+0.001414 0.001642 -0.002394 -0.000038 0.002410 -0.002476 
+-0.001632 0.001758 -0.001283 0.001221 -0.001042 -0.002614 
+0.000297 -0.004352 0.000034 0.002350 -0.005166 0.000864 
+0.001043 -0.003177 0.000316 -0.000704 -0.001186 0.001854 
+-0.002201 -0.000666 0.003939 -0.004199 0.004124 0.002874 
+-0.003284 -0.000592 0.000305 -0.002249 -0.004165 0.001197 
+0.000601 -0.003322 0.001512 0.001558 -0.000882 -0.000471 
+0.001503 0.000000 -0.001002 0.001147 -0.000432 -0.002425 
+0.004104 -0.001395 -0.002215 0.004552 -0.001193 -0.002143 
+0.000945 -0.002992 0.001496 -0.003543 -0.001144 -0.003718 
+-0.003759 -0.004216 -0.004308 0.004208 0.003376 -0.003200 
+0.001240 -0.001240 -0.009339 0.001124 -0.002871 -0.002034 
+0.002898 0.000779 0.003030 0.002889 0.003643 0.000173 
+-0.001297 -0.000362 0.001775 0.001118 -0.003209 0.003115 
+0.003468 -0.002981 0.001926 -0.000667 -0.000939 -0.000586 
+-0.000639 -0.003472 0.004111 -0.002941 -0.002899 0.002983 
+0.001501 -0.001255 0.000159 0.003699 -0.000528 -0.004227 
+0.004114 0.000074 -0.004558 0.001071 0.000535 -0.002441 
+-0.002096 -0.000720 -0.000592 -0.004738 -0.001212 -0.000333 
+-0.004426 -0.001646 -0.001852 -0.001390 -0.001819 -0.001333 
+0.000062 -0.000289 -0.000130 0.000347 0.000239 0.000075 
+0.000607 -0.001477 -0.000767 -0.000900 -0.002876 -0.002404 
+-0.000973 -0.000174 -0.001671 -0.000609 0.000509 -0.000620 
+-0.000400 0.001200 -0.001200 -0.000327 0.000871 -0.001459 
+0.000043 0.000357 -0.000960 0.000561 0.000243 0.000432 
+0.000024 -0.001454 0.001599 -0.002308 0.000309 -0.001127 
+-0.005665 -0.002266 -0.000150 0.001338 -0.000480 -0.000429 
+0.003660 -0.000669 0.000427 0.007524 0.000337 -0.003907 
+0.002772 0.001668 -0.002918 0.000059 -0.000033 0.000323 
+-0.002193 -0.004774 -0.000689 -0.002884 -0.009647 -0.000769 
+-0.002484 -0.008536 0.000702 -0.000303 -0.004074 0.000943 
+-0.001807 0.003135 -0.001918 -0.005692 0.000769 0.000385 
+0.000097 -0.000108 -0.000316 0.002590 0.003678 0.000138 
+0.004590 0.000888 -0.000519 0.000310 0.000248 -0.000250 
+-0.003081 -0.003605 0.003537 0.000419 -0.000938 -0.000399 
+0.006006 0.000922 0.004249 0.005143 0.003005 0.004897 
+0.000727 0.003671 0.003083 -0.002925 0.001959 0.001301 
+-0.000532 0.000968 0.000246 0.000553 0.003095 0.000922 
+0.010712 0.003078 -0.001909 0.003891 0.005556 -0.000764 
+0.001118 0.004499 -0.002139 0.003899 0.002788 -0.001674 
+0.006902 -0.000405 0.002518 0.004645 -0.001910 0.006181 
+-0.001196 -0.004762 0.008304 -0.006498 -0.001122 0.005673 
+0.000504 0.001050 0.002362 0.005032 0.001393 0.000643 
+0.001864 0.002389 -0.004891 0.003696 0.000377 -0.004551 
+0.001285 -0.001553 -0.004052 -0.001053 -0.001214 -0.003062 
+-0.002154 -0.001000 -0.001538 -0.000556 -0.001102 -0.000618 
+0.000021 0.001261 0.000276 0.002385 0.000709 -0.000135 
+0.001929 -0.002874 -0.003040 0.004133 -0.003895 0.002169 
+0.000431 -0.002080 0.005183 0.001099 -0.001125 0.004362 
+0.003632 0.003492 0.000675 0.000155 0.002878 -0.000256 
+-0.000368 -0.004719 -0.000285 0.001466 -0.004657 0.000969 
+0.000839 -0.002039 0.000255 0.000023 -0.000121 0.000254 
+-0.000754 -0.001285 0.000274 -0.001086 -0.002906 0.002248 
+-0.001583 -0.000038 -0.000192 0.000950 0.000056 -0.003017 
+0.001474 0.000786 -0.005765 0.001756 0.000000 -0.005344 
+0.002796 0.001179 -0.003167 0.004029 0.000789 -0.000769 
+0.002692 0.000006 0.000047 0.001163 -0.004853 -0.001457 
+-0.000349 -0.006807 -0.002051 -0.001920 -0.001920 -0.002800 
+-0.000133 0.005193 -0.005358 0.000949 0.007513 -0.006564 
+0.002154 0.002154 -0.005769 -0.001026 -0.000428 -0.000340 
+-0.002503 -0.004213 0.003949 0.000709 -0.004961 0.001181 
+0.000581 -0.000644 0.002072 -0.001479 0.000601 0.001062 
+-0.002231 0.000639 -0.001687 -0.002552 -0.000106 -0.003525 
+-0.002527 -0.002193 -0.001621 -0.005972 -0.001478 0.002895 
+-0.004961 0.001169 0.001753 -0.001284 -0.001153 0.000921 
+0.000898 -0.000085 -0.002534 0.000142 0.000355 -0.000071 
+-0.001155 -0.000734 0.002874 -0.001216 -0.003373 0.004188 
+-0.003459 -0.005766 0.001483 0.002497 -0.008560 0.001691 
+-0.000421 -0.007458 -0.000231 -0.000412 -0.001118 0.001539 
+-0.000922 0.005648 -0.001084 0.003192 0.001846 0.000500 
+0.005164 0.003099 -0.001496 0.002812 -0.003690 0.001057 
+0.000766 -0.002059 0.000502 0.001243 -0.001363 -0.002105 
+0.002931 -0.000821 -0.002170 0.004538 -0.000701 -0.000637 
+0.003472 -0.000713 0.000730 0.000338 0.000036 0.000207 
+-0.001095 -0.000622 -0.000829 -0.000359 -0.002288 -0.000585 
+0.000492 -0.003643 0.001230 0.001040 -0.002560 0.002320 
+0.003746 -0.000936 -0.002320 0.001746 -0.004921 -0.001270 
+0.003071 -0.002835 0.000472 0.003117 -0.001046 -0.000022 
+-0.000397 -0.002642 -0.000755 -0.002925 -0.006990 0.000380 
+-0.007412 -0.005652 0.000587 -0.004536 -0.002520 0.000850 
+-0.001166 0.001524 0.000187 -0.000876 0.000549 0.000734 
+0.002277 -0.001287 -0.003332 0.000824 -0.002042 -0.001898 
+0.001446 -0.001886 -0.002044 -0.000686 -0.002373 0.002003 
+-0.001261 -0.009697 0.001326 0.002339 -0.008582 0.002638 
+0.000895 0.000529 0.000253 0.002101 0.004960 0.000827 
+-0.002757 0.000369 -0.005046 -0.001715 -0.015759 -0.005170 
+0.009384 -0.017829 0.005504 -0.004451 -0.010087 0.007253 
+-0.002241 -0.001691 -0.004210 0.000335 0.015526 -0.010548 
+-0.004858 0.008690 -0.005445 0.000636 -0.003863 0.000012 
+0.001202 -0.008653 0.004328 -0.004108 -0.009424 0.002418 
+-0.003665 -0.001981 -0.000034 0.002266 -0.000234 -0.001289 
+0.004084 0.003120 -0.001750 0.003758 0.002422 -0.001503 
+0.000033 -0.004111 -0.004106 -0.001425 -0.002396 -0.005190 
+-0.002477 0.001136 -0.002733 -0.004081 0.002008 -0.000319 
+-0.001989 -0.000045 0.001162 -0.000045 -0.000545 -0.000590 
+0.002074 -0.002427 -0.001683 0.001397 -0.001860 -0.003950 
+-0.001333 -0.000642 -0.004492 -0.002287 -0.003048 -0.002921 
+-0.001258 -0.001273 -0.000148 -0.001440 -0.001040 -0.001280 
+-0.001640 -0.000458 0.001081 0.000848 -0.001540 0.002401 
+0.002635 -0.001056 -0.000018 0.001591 -0.001606 -0.001087 
+0.001045 -0.001497 0.000452 0.002780 -0.002864 0.002356 
+0.003552 -0.004897 0.003931 0.003386 -0.003181 0.001471 
+0.001302 -0.001633 -0.000899 -0.000982 -0.000749 -0.001731 
+-0.000424 -0.000989 -0.000918 -0.001321 -0.000240 -0.000720 
+-0.000214 0.000529 0.000156 -0.001023 -0.003273 0.000672 
+-0.004242 -0.006856 0.003510 -0.004132 -0.007626 0.006792 
+-0.001242 -0.004150 0.003819 0.000372 0.003662 0.000338 
+0.001837 0.008033 -0.001718 -0.000990 0.003136 -0.005450 
+-0.001444 0.004312 -0.004725 -0.004197 0.003504 -0.003643 
+-0.001343 0.004403 -0.004403 0.003271 0.003750 -0.001779 
+0.002990 -0.000865 -0.000698 -0.000122 -0.000490 -0.001249 
+-0.001667 0.000478 0.000433 -0.000294 0.000494 0.000384 
+0.002501 0.002843 -0.001961 0.001589 -0.000027 -0.004672 
+0.000215 -0.001481 -0.000525 -0.000429 -0.001215 0.001129 
+-0.002769 -0.000891 0.002180 -0.003801 -0.000398 0.000507 
+-0.002460 -0.002242 -0.001736 -0.000384 -0.001669 0.000518 
+-0.002436 0.001795 0.003333 0.001113 0.002231 0.004452 
+0.000112 0.001231 0.002937 0.000260 -0.000401 -0.001394 
+0.000491 0.000255 -0.003471 0.000200 0.002105 -0.000267 
+0.001670 -0.003339 0.000174 0.000718 -0.004553 -0.001192 
+0.001600 -0.001562 -0.000669 0.001105 -0.000820 0.000013 
+0.000939 -0.003572 0.000436 0.002754 -0.002456 -0.001737 
+0.000344 0.003265 -0.000789 0.002019 0.007674 -0.000940 
+0.000527 0.001695 0.000037 -0.003141 -0.010460 -0.000804 
+-0.004427 -0.013550 -0.003728 0.006162 -0.013031 -0.002723 
+-0.000044 -0.005905 -0.000921 0.000512 0.005997 -0.005867 
+0.008087 0.008101 -0.008082 -0.000342 -0.001975 -0.005575 
+0.001299 -0.001723 -0.000613 -0.002417 0.000767 0.001381 
+-0.000804 0.000804 0.000179 0.001002 0.001983 -0.001032 
+0.001985 0.001032 -0.001615 0.001741 -0.000930 -0.001428 
+0.001594 -0.001633 -0.001691 0.001600 -0.001250 -0.001200 
+-0.000288 -0.000782 -0.000947 -0.001933 0.000202 -0.000403 
+-0.001221 0.000287 0.000119 0.000923 -0.000615 -0.000917 
+0.000331 -0.001387 -0.001734 -0.002345 -0.001631 -0.001274 
+-0.003159 -0.002587 0.000933 -0.002173 -0.001139 0.000621 
+0.000914 0.000526 -0.000083 0.002049 -0.000004 0.001023 
+0.000628 -0.001676 -0.001240 0.001966 -0.001880 -0.001368 
+0.002129 0.000540 -0.001136 0.001394 0.004396 -0.003603 
+0.001515 0.004472 -0.005805 0.000137 0.000478 -0.003307 
+-0.000081 -0.003083 0.000648 -0.003148 -0.000815 0.001519 
+-0.002522 0.000752 0.001867 -0.003359 0.000607 -0.000101 
+-0.003444 -0.001949 -0.001768 -0.005286 -0.004412 0.002935 
+-0.002503 -0.002735 0.004365 -0.000424 -0.000135 0.000665 
+0.000879 0.002013 -0.003575 0.007542 0.002547 -0.001827 
+0.007344 -0.001621 -0.003558 0.002537 -0.001913 -0.004091 
+0.000340 0.001219 -0.002119 -0.001122 0.000788 -0.003330 
+-0.002276 -0.000407 -0.003415 -0.000957 -0.000214 -0.000667 
+0.003050 0.000296 0.001107 0.000304 0.001063 0.001250 
+-0.000159 -0.000830 0.000564 -0.000025 -0.002324 0.000148 
+-0.003288 -0.003021 -0.001007 -0.000514 -0.002029 0.000903 
+0.000421 0.000191 -0.000634 -0.000499 0.000345 0.000141 
+-0.000152 0.002697 0.001918 -0.001586 0.001662 0.001398 
+-0.000830 0.000574 -0.000448 0.004323 -0.000385 -0.002135 
+0.005077 0.000514 -0.004691 0.002187 0.000119 -0.001606 
+0.001803 -0.000511 0.000068 0.001508 -0.004869 0.000974 
+0.002155 -0.004910 0.001342 0.001507 -0.004404 0.000193 
+0.000368 -0.005054 0.001286 -0.001500 -0.006286 -0.002595 
+-0.000831 -0.000614 -0.002388 -0.003033 -0.000594 -0.003562 
+-0.004120 0.000404 -0.002303 -0.000580 0.000248 0.000748 
+-0.000415 -0.001417 -0.000725 0.003673 0.001258 -0.001737 
+0.003695 0.002067 -0.003282 0.002913 0.001058 -0.000754 
+-0.002302 -0.001959 -0.002661 -0.003394 -0.007720 -0.003082 
+-0.004916 -0.005617 -0.000041 0.005001 -0.002425 -0.000163 
+0.001017 -0.004798 -0.002319 -0.000069 -0.000880 -0.000435 
+-0.001109 -0.000825 0.000877 -0.000462 -0.003187 -0.001678 
+0.000426 -0.003201 -0.002392 0.000326 0.000013 -0.000502 
+0.001589 0.001606 -0.001293 0.005236 0.007688 -0.002842 
+-0.002297 0.003011 -0.001583 0.000500 0.000399 0.000740 
+-0.000735 -0.000287 -0.001054 -0.000866 0.002677 -0.000866 
+-0.001993 0.002929 0.000877 0.000251 0.001929 0.001458 
+0.003105 -0.002395 -0.000142 0.004274 -0.004100 -0.001049 
+0.000028 -0.000732 -0.002912 -0.002443 -0.001713 -0.001698 
+-0.001734 0.001950 -0.002384 0.000860 0.001293 0.000623 
+0.003498 0.000003 -0.002794 -0.002272 0.002570 -0.002371 
+0.000516 -0.002811 -0.001248 -0.000401 -0.002363 -0.000936 
+0.000773 0.001008 0.000402 0.002661 0.001797 -0.000724 
+-0.000104 -0.000929 -0.001178 -0.001554 -0.004734 -0.001789 
+-0.002633 -0.005054 -0.001482 -0.001103 -0.000990 -0.002405 
+0.000268 0.000902 -0.002523 -0.001879 0.001124 -0.001267 
+-0.000862 -0.001341 -0.000926 -0.004358 -0.000455 0.002995 
+-0.001735 -0.004266 0.004552 -0.000595 -0.004678 0.002849 
+0.000932 -0.003025 -0.000984 0.000280 -0.002404 -0.000126 
+-0.000554 -0.002601 0.001319 -0.002087 -0.003457 0.003010 
+-0.003579 -0.004455 0.001167 -0.005463 -0.001716 -0.000990 
+-0.002837 -0.004346 -0.002207 -0.000855 -0.005064 -0.001151 
+0.000872 -0.004792 0.001039 -0.000751 -0.000853 -0.000398 
+0.000808 -0.000500 -0.001154 0.002369 0.000588 -0.001390 
+0.000515 0.000353 0.000388 -0.002073 0.001484 -0.000984 
+-0.001863 0.001973 -0.002041 -0.003615 -0.000404 -0.001239 
+-0.007945 -0.004077 0.002498 -0.006884 -0.003833 0.001527 
+-0.001011 -0.000226 0.000215 0.002719 0.001257 0.000323 
+-0.000045 0.001504 -0.000015 -0.003209 -0.000081 -0.000113 
+-0.001036 -0.000968 -0.000628 0.000029 0.000000 0.000157 
+0.001134 -0.002107 0.002787 0.000634 -0.003159 0.006735 
+-0.001777 -0.005283 0.007041 0.002029 -0.003632 0.003815 
+0.002573 0.001008 -0.004271 0.001472 -0.000766 -0.005064 
+0.000172 -0.003971 -0.003064 -0.000698 -0.003411 -0.002713 
+0.000331 -0.000876 -0.001863 -0.000111 0.003203 -0.000556 
+-0.000367 0.002060 -0.001986 -0.000929 0.005118 0.001858 
+0.000923 0.001669 -0.000072 0.003756 -0.004243 -0.006682 
+0.001821 -0.001962 -0.008676 0.007360 0.000535 -0.004324 
+0.005303 -0.003575 -0.005102 0.001636 -0.000623 -0.005284 
+0.002199 -0.001336 -0.002826 -0.001971 -0.006765 -0.002877 
+-0.000623 -0.004383 -0.002650 -0.001180 0.000141 -0.001959 
+-0.001421 0.006482 -0.000814 0.000615 0.003865 0.001991 
+0.002888 0.002358 -0.005126 -0.003273 -0.001374 -0.002893 
+0.004092 -0.001585 -0.003828 0.002211 -0.001627 -0.005358 
+0.000723 -0.001655 -0.002346 0.002229 0.000899 -0.002562 
+0.000990 -0.000250 -0.004952 0.000333 -0.000598 -0.005386 
+0.001453 -0.000123 -0.003770 -0.002377 0.003251 -0.000908 
+-0.001594 0.004829 -0.001124 -0.002081 0.000919 -0.000206 
+-0.000017 -0.002279 -0.002259 0.000072 -0.001815 -0.003810 
+0.001640 -0.000511 -0.002769 0.001233 0.001572 -0.001456 
+0.000508 0.000339 0.000763 -0.000974 0.001319 -0.003740 
+0.000071 0.000534 -0.006162 0.000182 -0.000030 -0.005840 
+-0.000741 -0.001164 -0.002646 -0.000446 -0.000052 -0.000499 
+0.000394 0.000037 0.000148 0.000005 0.000315 0.000019 
+0.000469 0.000602 -0.000076 0.001408 0.000793 -0.000436 
+0.000089 0.000032 -0.000683 0.001775 0.001506 -0.004086 
+0.001641 0.004540 -0.008091 0.011282 0.003410 -0.006753 
+0.007159 0.002856 -0.004373 0.000409 0.000655 -0.000202 
+-0.005084 -0.000481 -0.001924 -0.002093 -0.003893 -0.005431 
+0.000005 -0.004665 -0.000516 -0.000843 -0.002942 -0.003021 
+-0.003955 -0.004286 0.000507 -0.004652 -0.005635 0.001960 
+-0.002334 -0.002366 0.000467 0.002030 -0.001779 -0.003702 
+0.002206 -0.002923 -0.005037 -0.002117 -0.001671 -0.002881 
+-0.002397 -0.003226 -0.001184 -0.004168 -0.005846 0.001592 
+-0.002965 -0.006532 -0.000131 -0.001419 -0.004193 -0.001178 
+-0.001005 -0.000973 -0.000188 0.002060 -0.000825 0.002225 
+0.001386 0.001032 0.000668 0.002675 0.001996 0.000335 
+0.001471 -0.001641 -0.002261 0.002231 -0.004172 0.002036 
+0.000234 -0.008405 0.004511 -0.004439 -0.008093 0.000261 
+-0.000350 -0.003370 -0.001714 -0.000065 -0.000342 -0.000628 
+0.000352 0.004789 -0.000337 0.001563 0.001908 0.001809 
+0.000735 0.000459 0.004206 0.000671 -0.001441 0.003168 
+0.000979 -0.002214 0.001416 0.000718 -0.001269 -0.000133 
+0.001658 0.002384 -0.001837 0.005496 0.005484 0.000846 
+0.003296 -0.002973 0.000565 0.005794 -0.006356 -0.002666 
+0.004925 -0.005858 -0.005858 0.006140 -0.003068 -0.005611 
+0.004975 -0.000191 -0.008592 0.004155 0.004806 -0.010029 
+0.003284 0.003046 -0.001585 0.000564 -0.007752 -0.001380 
+0.001367 -0.007381 -0.002521 0.004383 -0.001864 -0.006903 
+-0.003102 0.002610 -0.006400 0.000166 0.003597 0.001003 
+0.003810 0.002645 -0.003432 -0.000486 -0.001687 0.000286 
+0.002308 -0.003236 0.000230 0.001237 -0.002000 0.000530 
+0.000891 0.000699 -0.000286 -0.001074 0.000666 -0.000190 
+0.000073 -0.002427 -0.000673 0.004858 -0.002830 -0.003435 
+0.006142 -0.000680 -0.004767 0.002096 -0.001105 -0.003429 
+-0.002721 0.003474 -0.002875 -0.002015 0.004972 -0.005330 
+0.000810 0.004049 -0.007281 0.001723 0.003785 -0.004124 
+0.002433 0.001217 0.001583 0.000476 -0.003059 0.000442 
+-0.005325 -0.005050 0.002047 -0.006422 -0.002912 0.003169 
+-0.003333 -0.001175 0.002158 -0.000457 0.000023 0.001323 
+0.000130 -0.000307 0.000013 0.000941 0.000165 -0.002048 
+0.000436 0.001308 -0.004060 0.002372 0.001016 -0.003670 
+0.000262 -0.000634 0.000465 -0.000803 -0.004555 0.000597 
+-0.001992 -0.003308 -0.001605 -0.000774 -0.002772 -0.000496 
+0.000673 -0.001416 -0.002212 0.004593 -0.000512 -0.003117 
+0.001345 -0.000422 -0.004322 0.000993 -0.000652 -0.001412 
+-0.001030 0.000141 0.000310 -0.001003 -0.001204 -0.000420 
+-0.000433 -0.002084 -0.000176 -0.000256 -0.001107 0.000509 
+0.000472 -0.001471 -0.000714 0.000822 -0.003347 0.000578 
+0.001947 -0.004002 0.003909 0.000580 -0.001414 0.003026 
+0.000826 0.003308 -0.002892 -0.001709 0.002991 -0.005079 
+-0.000292 -0.000781 -0.001139 -0.000247 -0.001440 -0.000349 
+-0.001549 -0.002582 -0.000650 0.001373 -0.000778 0.000137 
+0.001882 -0.002066 -0.000417 0.001827 -0.001590 0.000061 
+0.000642 -0.000583 -0.000566 -0.002118 -0.001062 0.000699 
+0.000071 -0.004650 0.002484 0.001975 -0.002590 0.001483 
+-0.000397 -0.000141 -0.000577 0.002667 0.002005 -0.008020 
+0.000640 0.001162 -0.006412 -0.000963 -0.000125 0.001297 
+0.000190 -0.002891 0.000042 0.002245 0.000286 -0.003203 
+0.007164 -0.000846 -0.003638 0.008238 0.003360 -0.002900 
+0.004370 -0.000791 -0.002298 -0.000581 0.001640 0.002268 
+-0.003084 0.000136 0.005034 -0.004882 0.001732 0.001732 
+-0.003872 -0.000618 -0.001225 -0.002110 -0.002152 -0.001615 
+0.000534 -0.002467 -0.002752 0.003648 -0.000957 -0.005159 
+0.005011 0.000829 -0.004731 0.002414 0.000497 -0.000650 
+-0.000268 -0.003647 -0.001019 0.000850 -0.002913 -0.001758 
+0.000244 -0.002342 -0.002475 0.001085 -0.001581 -0.003163 
+-0.001430 -0.000012 -0.001953 -0.001331 -0.000279 -0.000086 
+-0.000394 -0.001883 0.000934 -0.001387 -0.001159 0.001407 
+0.000883 -0.001457 0.000963 0.001278 -0.000131 -0.001222 
+0.002569 0.000991 -0.001352 0.001828 0.001623 -0.001258 
+0.001889 0.001768 -0.003596 -0.001282 0.001368 0.000085 
+0.006667 0.008120 -0.003333 0.007107 0.004328 -0.001977 
+0.005195 -0.001040 -0.000445 0.002369 -0.000517 0.000912 
+0.001527 0.000752 -0.001868 0.001619 -0.000731 -0.000941 
+0.001226 -0.000528 -0.000020 0.001996 0.001007 -0.002513 
+0.003234 0.003476 -0.003880 0.004603 0.001633 -0.003663 
+0.002609 -0.002558 -0.000703 0.000818 -0.002961 0.002572 
+-0.000516 0.000407 0.000072 -0.001323 0.003461 0.000204 
+-0.000736 0.002325 -0.004145 0.002803 -0.000081 -0.001201 
+0.001653 -0.002630 0.000667 -0.000062 -0.001630 0.000223 
+-0.001465 0.000977 0.000365 -0.000300 0.000767 0.001674 
+-0.001011 -0.000919 0.002228 0.000462 -0.002275 -0.001595 
+-0.001349 -0.002548 -0.002597 0.000771 0.001003 -0.005826 
+0.004219 0.000925 -0.002788 0.000791 0.001950 0.001102 
+-0.000628 -0.000809 0.002888 -0.003530 0.005077 0.001151 
+0.001033 0.003723 -0.002417 0.001808 0.000217 -0.001952 
+0.000303 0.000000 0.000000 0.000649 0.000166 0.002458 
+0.002054 -0.000292 0.001079 0.002509 -0.001803 -0.001131 
+0.002369 -0.001351 -0.001820 0.000448 -0.001148 0.000028 
+-0.000756 -0.000006 -0.000066 0.000638 0.000293 0.000641 
+0.000587 -0.000340 -0.000155 0.000079 -0.000095 0.001111 
+0.000663 -0.001201 0.000704 -0.002143 -0.000857 0.002143 
+-0.000337 -0.000113 0.001260 -0.000081 0.000389 0.000523 
+0.000114 0.001425 0.001652 0.001294 0.004291 0.000307 
+0.000085 0.001637 0.001208 0.001135 -0.002895 -0.000024 
+-0.011687 -0.001755 0.004875 -0.015003 0.002698 0.010744 
+-0.008151 0.003860 0.015804 -0.004471 -0.004875 0.012366 
+-0.000563 -0.006349 0.007876 0.000667 -0.004365 0.009347 
+-0.007030 -0.008904 0.008339 -0.003715 -0.000517 0.001909 
+0.005871 0.011601 -0.002255 0.007409 0.010180 -0.000469 
+0.000322 0.000847 0.000055 -0.002362 -0.001917 0.000104 
+-0.000722 -0.004779 0.002598 0.000539 -0.001588 0.005806 
+0.004546 0.004831 -0.004886 -0.003875 0.005348 -0.006856 
+-0.018821 -0.010081 0.012100 -0.003808 -0.002839 -0.006083 
+-0.000638 -0.001256 -0.002563 -0.000309 -0.001085 0.001889 
+-0.001373 -0.003269 0.000251 -0.000401 -0.002500 -0.002342 
+-0.000061 -0.000804 -0.003908 -0.001445 -0.000942 -0.001788 
+-0.000044 0.000107 -0.000806 0.003659 0.002094 0.004854 
+0.006825 -0.009365 0.029651 0.015829 -0.011498 -0.025253 
+-0.000848 -0.003397 -0.016697 -0.014040 -0.002651 -0.013804 
+-0.010908 -0.003127 0.009454 -0.000376 -0.003499 0.006188 
+-0.002989 0.025048 -0.024609 0.014769 -0.025846 0.023333 
+0.012300 -0.015999 0.005936 0.004311 0.000476 -0.004272 
+-0.000232 0.004766 -0.009422 -0.001083 0.016166 -0.015514 
+-0.033584 -0.006438 0.007430 -0.047985 -0.016755 0.001214 
+-0.038809 -0.014327 -0.004471 0.023986 0.012446 -0.003418 
+0.028460 0.009602 -0.006564 0.017882 0.005791 -0.009127 
+0.002704 0.001145 -0.003296 0.001795 -0.002872 0.004769 
+0.002903 -0.003377 0.002951 0.003240 -0.003485 -0.000383 
+0.002659 -0.002425 -0.001258 0.003249 -0.000291 -0.001922 
+0.004459 0.000637 -0.002189 0.003014 -0.000836 0.001184 
+0.002633 -0.003861 0.002550 0.002638 -0.004441 0.002695 
+0.004509 -0.001291 -0.001488 0.003030 -0.000339 0.001395 
+0.003120 -0.002132 -0.002578 0.003698 -0.001711 0.003019 
+0.008740 -0.004712 0.010798 0.001302 0.006348 0.000698 
+-0.002691 -0.000022 -0.003060 -0.000952 -0.002688 0.000444 
+0.002897 -0.001105 -0.001475 -0.002708 0.009626 -0.007238 
+-0.003106 0.003843 -0.001785 0.005545 -0.015577 0.002481 
+0.003028 -0.015220 0.011999 0.011353 -0.008497 0.005707 
+0.009673 -0.005533 -0.000825 0.009065 -0.002627 -0.003987 
+0.011274 0.003428 0.000412 0.005475 0.002169 0.005725 
+0.001075 0.002419 0.001108 -0.004051 0.002174 0.000200 
+-0.002708 -0.001095 -0.001192 0.002916 -0.005259 0.000299 
+-0.002796 0.001097 0.001751 -0.001413 0.000387 0.004488 
+0.002431 0.001082 0.000440 0.004495 -0.001125 -0.000964 
+0.001959 0.000949 0.000121 0.001316 0.000342 0.000158 
+-0.000185 -0.001394 -0.001652 -0.002341 -0.004823 0.000796 
+-0.005369 -0.006793 0.002435 -0.000863 -0.000015 0.000108 
+0.001893 0.006859 -0.002668 0.000272 0.001038 -0.000758 
+-0.000532 -0.002054 0.002038 -0.000080 0.001221 0.000131 
+0.002181 0.002730 -0.001358 0.002867 0.006901 -0.007219 
+0.008240 0.025675 -0.027045 0.008192 0.019271 -0.030325 
+0.001159 0.002031 -0.008629 0.001781 0.001322 -0.002549 
+0.000229 0.002489 -0.001365 -0.002866 0.001464 -0.000484 
+-0.000672 -0.000341 -0.001375 -0.000588 -0.002104 0.000645 
+-0.000034 0.002321 -0.000912 0.002090 0.001381 -0.001045 
+-0.001225 -0.001094 0.000777 -0.083317 -0.032584 0.012024 
+-0.002325 -0.017226 -0.010741 0.000045 -0.012810 -0.000373 
+0.010257 -0.009598 -0.003291 0.014648 0.004683 -0.019390 
+0.004374 0.020928 -0.027891 -0.004082 -0.015007 0.035116 
+0.002209 -0.010640 0.019241 0.000741 -0.008455 0.009681 
+-0.001469 -0.007727 0.007373 -0.003027 -0.007223 0.005619 
+-0.006183 -0.010055 0.007880 -0.025527 -0.027422 0.020302 
+-0.030861 -0.034723 0.025549 -0.008637 -0.014558 0.005159 
+-0.001778 -0.002363 0.002035 -0.000544 -0.000772 0.002255 
+0.005392 -0.003573 0.002143 0.005692 -0.004519 0.002375 
+0.002271 -0.001188 0.001549 -0.004746 0.000881 0.003265 
+-0.006870 0.001832 0.003638 -0.000787 0.000523 -0.001431 
+0.001584 -0.003223 -0.005268 0.004909 -0.002004 -0.005683 
+0.003678 -0.001250 -0.005044 0.002922 -0.001723 -0.001498 
+0.006613 -0.003172 -0.000280 0.003832 -0.001139 0.002249 
+-0.001518 0.000773 -0.003872 -0.000179 0.000581 -0.000026 
+0.005887 0.011691 0.009868 0.000836 -0.016145 -0.000945 
+-0.003392 -0.015194 -0.000516 0.000768 -0.004313 0.002806 
+0.002275 0.006211 -0.007199 -0.010708 0.015433 0.002889 
+-0.007409 0.006848 -0.004375 -0.004991 -0.006555 -0.000993 
+0.002069 -0.001200 0.001132 0.003970 -0.002054 -0.003532 
+0.001542 -0.000360 -0.004572 0.009206 0.003458 -0.001900 
+0.001965 0.002226 0.003482 0.001000 0.002090 0.001752 
+-0.000836 0.002138 -0.000036 -0.006123 -0.001038 -0.000575 
+-0.006206 -0.005631 -0.001143 -0.002276 -0.007642 0.000000 
+0.007991 0.001900 -0.003570 -0.003809 -0.002573 -0.003980 
+0.002300 0.000562 -0.009829 0.001368 0.004438 -0.002803 
+0.003802 0.005857 -0.001733 0.006409 0.003563 -0.001453 
+0.001550 0.000648 -0.000473 -0.003401 -0.005101 0.001731 
+-0.002333 -0.003062 0.001650 0.012130 0.003974 -0.004459 
+0.005474 0.002409 -0.000612 -0.007803 0.001961 -0.004503 
+-0.003281 0.003881 -0.010512 0.001425 0.000989 -0.000529 
+0.000543 -0.004504 0.003015 0.000790 -0.005646 -0.006264 
+0.004891 0.012359 -0.008050 0.021963 0.019689 0.003485 
+0.015703 0.011241 -0.010553 0.004370 0.006162 0.002715 
+0.000639 -0.000573 0.005170 -0.002835 0.000987 -0.002668 
+-0.001729 -0.003130 -0.003602 -0.001165 -0.001041 -0.002069 
+0.004722 0.009039 -0.000936 0.005554 0.000645 -0.003537 
+0.002573 0.002473 -0.001289 0.003299 0.002126 0.005971 
+-0.000775 0.001698 0.001263 -0.002587 0.006551 -0.004555 
+0.000235 0.002164 -0.000364 0.002296 -0.005160 0.000975 
+-0.000339 -0.014474 -0.000008 0.009148 -0.003659 0.004002 
+0.012352 0.004296 0.006633 0.005304 -0.000417 0.009930 
+-0.003241 0.001988 0.007586 -0.001070 -0.006699 0.008324 
+0.002874 -0.001704 0.002197 0.001470 0.001640 -0.001542 
+0.005595 0.006263 0.003373 0.015304 0.017476 0.009435 
+-0.001123 0.001474 -0.002703 0.007401 -0.005149 -0.000400 
+0.016701 -0.010582 0.001050 0.012835 -0.011020 -0.000030 
+0.009500 -0.007153 -0.000657 0.009685 -0.003745 -0.001520 
+0.009894 -0.002015 -0.004283 0.008749 -0.003704 -0.007839 
+0.007843 -0.004842 -0.006713 0.005154 -0.000960 -0.007663 
+0.003212 0.005164 -0.006946 0.000327 0.011321 -0.001829 
+0.002958 0.004404 0.002496 0.000161 0.002013 0.002384 
+0.005307 0.013574 -0.001419 -0.003797 0.004613 -0.001557 
+-0.010718 0.009953 -0.009750 -0.004878 0.004661 -0.002906 
+0.001958 -0.003575 0.002423 0.004686 0.000753 0.000190 
+-0.005329 0.017726 -0.005625 -0.016011 0.017999 -0.005281 
+-0.011103 0.011043 -0.002641 -0.004493 0.004591 -0.001051 
+-0.000183 -0.000122 0.000848 -0.000371 0.000262 0.000007 
+0.003435 0.002599 -0.009446 0.006467 0.013157 -0.005982 
+-0.001153 0.002179 -0.003112 -0.002229 -0.003227 -0.002068 
+-0.002093 -0.005128 -0.001800 -0.003931 -0.005612 -0.002025 
+-0.004741 -0.006476 -0.000104 -0.003085 -0.003233 0.000969 
+0.004320 0.002690 -0.004374 -0.002601 -0.005398 -0.002270 
+-0.003254 0.002240 -0.009822 0.008071 -0.001070 -0.009216 
+0.010965 0.007891 -0.000439 0.010722 0.002410 -0.001496 
+0.003440 0.003705 -0.000801 -0.001461 -0.001991 0.001175 
+-0.004404 -0.002089 0.003906 0.005215 0.009820 -0.004125 
+0.006562 0.001432 -0.000314 -0.005908 -0.010988 0.003628 
+-0.005376 -0.009780 0.006719 -0.004181 -0.015872 0.006079 
+-0.010100 -0.021199 0.001335 -0.004471 -0.015571 -0.000099 
+-0.000726 -0.011435 -0.001063 -0.006354 -0.012364 0.000563 
+0.013624 -0.007577 0.000844 -0.000737 0.002037 0.003404 
+-0.000628 -0.002246 0.005011 -0.002887 -0.005675 -0.004063 
+-0.002561 -0.007844 -0.002989 -0.003517 -0.006283 -0.003046 
+0.000553 0.000711 -0.000639 0.005911 0.006333 -0.003536 
+0.003416 0.002280 0.000066 0.002496 0.003508 0.000569 
+0.006617 -0.001316 0.008692 -0.003840 0.012320 -0.001733 
+0.002385 0.002747 -0.005261 -0.006595 -0.008166 0.009478 
+-0.001412 -0.011057 0.003573 0.011478 0.015467 -0.002993 
+0.005315 0.021446 -0.013772 0.007559 0.012269 -0.010316 
+0.002691 0.009748 -0.006885 -0.000470 0.002179 -0.007665 
+0.002704 -0.000748 -0.006349 0.004460 -0.005022 -0.005065 
+-0.003017 0.000652 -0.007551 0.019123 0.001791 -0.023302 
+0.000291 0.000324 0.002398 0.000932 -0.006112 -0.000748 
+0.009235 -0.008434 -0.004386 0.012800 -0.006769 -0.006952 
+0.014899 -0.006821 -0.008098 0.015296 -0.008462 -0.006979 
+0.012790 -0.009790 -0.004390 0.008030 -0.009620 -0.003633 
+0.005437 -0.006791 -0.005613 0.004523 -0.004095 -0.005071 
+0.003288 0.000602 -0.004780 0.006457 0.002921 0.000387 
+0.003018 -0.004365 -0.003601 0.005102 -0.004331 -0.006619 
+0.001964 -0.005380 -0.004842 -0.005719 -0.002975 -0.007771 
+-0.013613 0.000968 -0.026078 0.017485 0.016493 -0.001016 
+0.016450 0.011705 0.001863 -0.002039 0.008997 -0.006986 
+-0.009939 0.011324 -0.011033 -0.009851 0.009692 -0.010651 
+-0.010349 0.004159 -0.003990 -0.005644 0.000808 0.004409 
+-0.000582 -0.007697 0.007537 -0.001955 -0.006136 0.005570 
+0.002849 0.004056 -0.004833 0.005789 0.008467 0.001862 
+0.000221 0.000380 0.000568 -0.000405 -0.002653 -0.000613 
+0.001083 -0.003287 -0.000845 0.000443 -0.001603 -0.002304 
+0.000397 -0.003076 -0.002723 0.001052 -0.003850 -0.001092 
+-0.000285 0.005195 -0.006462 0.001411 0.000944 -0.009328 
+0.001398 0.002792 -0.010970 0.003128 0.000495 -0.011350 
+0.004901 0.003447 -0.007493 0.004010 0.004730 -0.004984 
+0.005741 0.000270 -0.005541 -0.000149 -0.004891 -0.002146 
+-0.009276 -0.016692 0.008056 -0.003273 -0.020281 0.006165 
+-0.002790 0.011005 -0.007317 0.011818 0.002580 -0.000258 
+-0.000747 0.002530 0.000230 -0.000466 -0.000403 -0.000330 
+0.002432 -0.001945 -0.000417 -0.000741 -0.003126 -0.001007 
+-0.005212 -0.004633 0.001494 -0.007836 -0.001210 -0.013138 
+-0.001947 0.004159 -0.008910 -0.001298 -0.000658 0.002455 
+-0.003428 -0.006059 0.000861 -0.004299 -0.005972 -0.004054 
+-0.005131 -0.005689 -0.000805 -0.001723 -0.007275 0.000394 
+-0.001763 -0.004335 -0.002509 -0.000654 0.006828 -0.002689 
+0.004809 -0.000650 -0.002252 0.001348 0.002979 0.000225 
+0.004398 0.010754 -0.004574 0.012527 0.024652 -0.008377 
+0.007392 0.022234 0.000156 -0.009444 -0.004415 0.001413 
+-0.001350 0.001462 0.013600 -0.006598 -0.005307 -0.002232 
+-0.015561 -0.007974 -0.002078 -0.002391 -0.004385 -0.010957 
+0.000445 0.001047 -0.007270 0.005289 0.002915 -0.004829 
+0.006009 -0.001649 -0.006853 -0.001606 -0.000142 -0.002863 
+-0.001420 0.002344 0.003384 -0.000516 0.000330 -0.000530 
+-0.002890 -0.013034 -0.000558 0.006260 -0.018531 -0.000584 
+0.009425 -0.010316 -0.003957 0.010822 -0.005000 -0.004425 
+0.011567 -0.005991 -0.005036 0.009955 -0.008729 -0.006827 
+0.005636 -0.008520 -0.007225 0.002168 -0.006060 -0.007103 
+0.000443 -0.003761 -0.008992 0.001708 0.001651 -0.016540 
+0.006650 0.013755 -0.003561 -0.000848 -0.002056 -0.002714 
+-0.000822 -0.002907 0.001285 -0.001966 -0.007507 -0.006903 
+-0.008400 0.001424 -0.006750 -0.030074 0.015021 -0.007195 
+0.007435 -0.006660 -0.067066 0.006401 0.000366 0.006099 
+0.000045 -0.004591 0.001583 -0.006770 -0.002837 -0.004890 
+-0.002430 -0.001483 0.000191 0.001186 -0.002948 0.004475 
+-0.006538 -0.004092 0.007651 -0.012492 -0.007353 0.005401 
+-0.008420 -0.010099 0.003191 -0.006349 -0.011780 -0.001716 
+-0.007117 -0.008655 0.000178 0.001730 0.004555 0.003107 
+0.003061 0.010594 0.001457 0.000974 0.005005 -0.000606 
+-0.000141 -0.000370 -0.000920 -0.000088 -0.002957 0.000343 
+-0.000919 -0.002195 0.001255 0.000326 0.000119 -0.001301 
+0.000538 -0.003356 -0.003251 -0.000711 -0.004129 -0.002541 
+-0.008345 -0.003953 -0.001957 -0.006063 0.005457 -0.000835 
+-0.000302 0.002164 -0.000162 0.001592 0.000552 -0.000329 
+-0.000986 0.000366 0.000040 -0.000776 -0.000555 -0.002337 
+-0.002710 -0.004614 0.002371 -0.016408 -0.020829 0.025854 
+-0.033518 -0.013509 0.015031 -0.001531 0.014181 -0.046456 
+0.001585 0.021665 -0.004831 0.004097 0.009273 0.002321 
+0.006996 0.002693 0.001592 0.002674 0.000150 -0.000496 
+-0.001558 0.004012 0.004877 0.006291 0.004996 0.004358 
+0.009656 0.005629 -0.002341 -0.000329 -0.001118 -0.000953 
+0.004009 -0.002685 -0.009835 -0.001152 -0.003133 -0.002806 
+-0.004335 -0.005578 0.001108 -0.005657 -0.003434 0.002676 
+-0.002426 -0.003838 0.001933 -0.000319 0.000407 0.001214 
+0.005367 0.001412 -0.000458 0.007526 0.001342 -0.001662 
+0.002881 0.005773 -0.003214 -0.000173 0.009467 -0.006266 
+0.002791 0.014280 -0.004710 0.007218 0.005218 -0.001579 
+0.003596 0.008463 -0.000968 -0.011808 0.007821 -0.003489 
+0.007308 0.019716 -0.011266 0.015190 0.012617 -0.014232 
+0.020079 -0.002350 -0.013754 0.012192 0.002258 0.011905 
+0.004304 -0.006811 -0.006038 -0.001152 0.000245 0.003836 
+-0.003705 -0.010402 0.000167 0.005386 -0.023037 0.027823 
+0.009408 -0.017061 0.000885 0.016350 -0.007751 0.000422 
+0.017005 -0.008853 0.003102 0.014225 -0.015978 0.001364 
+0.002217 -0.014540 -0.004996 -0.010337 -0.005355 -0.003020 
+-0.007268 -0.000529 -0.001129 -0.002532 0.000405 -0.000448 
+0.005209 -0.004314 -0.016296 -0.005192 0.010007 -0.008643 
+0.000257 -0.004273 -0.004373 0.001744 -0.001967 -0.000604 
+-0.005933 -0.006867 0.000631 0.001287 -0.007443 0.005797 
+-0.002021 -0.002083 0.027616 -0.011837 0.015474 0.068538 
+0.052857 -0.007119 -0.040936 0.017742 -0.018948 0.001396 
+0.005370 -0.013111 0.007032 0.002180 -0.009366 0.007281 
+0.014583 -0.003706 0.004324 0.019791 0.002676 -0.005066 
+0.011047 0.009916 -0.007186 -0.003046 -0.001360 -0.003954 
+-0.007171 -0.012567 -0.005847 -0.016080 -0.012835 -0.003453 
+-0.021097 -0.011316 0.001851 -0.019535 -0.001683 -0.002804 
+-0.002683 0.000377 -0.006155 0.000740 0.001344 -0.000354 
+0.003227 0.002272 0.001726 0.001197 0.000311 0.001911 
+-0.003890 -0.000769 0.001766 0.000019 -0.000277 -0.000905 
+0.000879 -0.001749 0.000830 0.000721 0.000252 -0.000645 
+-0.002325 -0.000750 -0.000514 -0.001865 -0.003679 -0.001135 
+0.001676 -0.003832 -0.003113 0.002119 -0.001332 -0.000412 
+-0.000713 0.000343 0.000033 -0.002301 -0.002306 -0.001206 
+-0.002575 -0.000865 -0.004140 0.000331 0.000184 0.000885 
+0.013930 0.001674 0.034207 0.074444 0.025556 -0.038889 
+-0.004464 0.008327 -0.018987 -0.000889 0.010546 -0.004734 
+-0.004747 0.002459 -0.002206 -0.007150 -0.005779 0.001256 
+-0.001838 -0.009095 0.005141 0.007164 -0.004412 0.002251 
+0.009564 -0.005465 -0.014005 0.013692 0.002223 -0.026796 
+-0.009848 0.008660 -0.019442 0.000522 0.008256 -0.005055 
+0.000145 0.000052 0.000459 -0.002640 -0.001425 0.001448 
+-0.001739 0.000580 0.001541 0.000791 0.002809 0.000801 
+-0.003640 0.005062 -0.004333 0.002567 0.000211 -0.001322 
+-0.000336 -0.001623 0.000269 -0.002896 0.005459 -0.003818 
+-0.000717 0.006098 -0.002576 0.003642 -0.008856 0.002066 
+0.004789 0.001518 0.001654 0.009023 0.022858 -0.012286 
+0.019523 0.004853 -0.025806 0.027057 0.017018 0.001898 
+-0.013526 0.013032 -0.005825 -0.009756 0.011997 -0.004899 
+-0.004840 0.005154 -0.007606 0.000659 -0.003254 0.000713 
+-0.001486 0.010546 -0.004504 0.010151 -0.008019 -0.006158 
+0.007584 -0.007240 -0.003851 0.006835 -0.007681 -0.000232 
+0.005440 -0.008926 0.004846 0.000622 -0.006786 0.004785 
+-0.001603 0.004672 -0.003877 -0.003458 0.023204 -0.009515 
+-0.006763 0.020682 -0.002266 -0.009047 -0.001031 -0.010536 
+-0.009593 -0.010604 -0.016750 -0.003104 -0.011005 -0.020576 
+0.007229 -0.006010 -0.009052 0.002259 0.000432 -0.002679 
+-0.000202 -0.000409 -0.000181 -0.002793 -0.001456 0.005497 
+0.002967 0.005582 0.000348 0.011746 0.008248 0.004977 
+0.011733 0.003865 0.004348 0.015288 0.000623 -0.004375 
+0.014542 0.000939 0.003169 0.005333 -0.011900 -0.003967 
+0.000510 -0.018027 0.029150 0.006356 0.009701 -0.002342 
+0.007457 0.017727 -0.010813 -0.003998 0.008923 0.002149 
+-0.008979 0.008159 0.005292 -0.018736 0.001436 0.001975 
+-0.022336 -0.008573 -0.001964 -0.022481 -0.022282 -0.011808 
+-0.003854 -0.039266 -0.012994 0.008698 -0.008264 0.008656 
+0.009428 0.012801 -0.003694 0.003627 0.009173 -0.005767 
+-0.004908 -0.000827 -0.001042 -0.008318 -0.005925 0.003369 
+0.002250 0.006249 -0.004961 0.011482 0.005101 -0.009483 
+0.008367 -0.001721 -0.002126 0.004435 -0.005007 -0.000304 
+0.003601 -0.001993 0.000986 0.002957 0.001869 -0.003751 
+-0.000110 -0.001786 -0.003285 -0.004557 -0.004041 -0.003748 
+-0.006682 -0.004287 -0.004335 -0.006872 -0.007735 -0.002023 
+-0.003163 -0.000925 -0.003197 0.011988 0.008014 -0.000763 
+0.026968 0.013638 -0.015590 -0.001293 -0.002317 -0.000799 
+-0.012192 -0.002829 -0.002578 -0.010204 0.001631 0.000551 
+0.000385 0.003058 -0.000565 0.006230 -0.001293 -0.001411 
+0.004781 -0.002706 -0.005774 0.004532 0.013388 -0.003930 
+-0.009151 0.023120 -0.002302 -0.003021 0.014560 -0.002116 
+0.001780 0.004317 -0.001394 0.001255 0.000271 -0.001429 
+0.000212 0.000532 0.000443 -0.000340 0.007968 0.002511 
+-0.000312 0.010773 -0.001623 0.003051 0.002296 0.000418 
+0.001666 -0.000624 0.000379 0.000293 0.008815 -0.001158 
+-0.001699 -0.001525 -0.000547 -0.008514 -0.017904 -0.007805 
+-0.003905 -0.002949 0.001358 -0.003592 -0.008093 0.011363 
+-0.014440 -0.007399 0.003595 -0.014412 -0.009853 -0.000441 
+-0.007433 0.008043 -0.000444 -0.001266 0.006634 -0.002404 
+-0.000934 0.005582 -0.004676 -0.001373 0.016652 -0.015368 
+-0.005097 0.006856 -0.007652 -0.001759 -0.000388 0.001631 
+-0.008506 -0.007845 0.004080 -0.008159 -0.009601 0.002510 
+-0.005484 -0.008372 0.002511 -0.005714 -0.003309 0.001110 
+-0.003253 -0.002844 0.000735 -0.005760 -0.004841 0.003717 
+-0.014653 -0.005931 0.008378 -0.007679 -0.001116 -0.004034 
+-0.002961 -0.006261 -0.012073 0.003677 -0.006185 -0.011035 
+0.002911 -0.004277 -0.004889 0.001772 -0.000440 -0.001194 
+0.001079 -0.001329 0.004709 -0.000561 -0.011452 0.007442 
+0.010944 -0.020449 0.021858 -0.001151 -0.014430 0.008993 
+-0.000947 0.004738 0.003222 0.004837 -0.000698 0.001509 
+0.011865 0.003033 -0.001070 0.009407 0.006034 0.004737 
+0.013274 -0.000684 0.013863 0.016998 -0.005708 0.000608 
+0.001850 0.005047 -0.006108 -0.009096 0.010749 0.001628 
+-0.004571 0.004796 0.005201 0.000427 -0.007574 -0.007426 
+0.001498 -0.026693 -0.014385 0.005724 -0.036367 -0.017772 
+0.004665 -0.029987 -0.018919 -0.002147 -0.006419 -0.005427 
+-0.012777 0.016974 0.000059 -0.006425 0.017158 -0.005556 
+-0.001925 0.002996 -0.001694 0.002043 -0.005505 0.004488 
+0.002724 0.000331 -0.002906 0.005317 -0.001090 -0.004861 
+0.005412 -0.002168 -0.003791 0.001169 -0.001425 -0.000773 
+-0.003006 -0.000643 0.000771 -0.000017 0.000340 0.000077 
+-0.000161 0.001611 -0.003867 0.001977 0.001462 0.001593 
+-0.009318 -0.001584 0.003143 -0.007503 -0.007358 -0.001072 
+-0.002268 -0.004009 0.000258 0.001807 0.003028 -0.001125 
+0.010815 0.011458 0.001265 0.013175 0.017122 0.002666 
+-0.001368 -0.003936 0.008406 -0.001625 -0.008619 0.002994 
+0.008490 -0.001296 0.000670 0.011812 0.003449 -0.005122 
+0.015007 0.010047 -0.010766 0.013508 0.014615 0.003216 
+0.007847 0.009981 0.006898 0.000531 0.001950 0.000817 
+-0.004396 0.000918 -0.001389 -0.003243 0.006269 -0.006323 
+-0.002893 0.007016 0.000963 0.001533 0.004266 0.000648 
+0.004543 0.001636 -0.000491 0.005684 -0.000688 0.000694 
+0.003719 0.001587 0.001467 0.000094 0.001811 0.000137 
+0.002690 -0.006475 0.002444 0.003556 0.005211 0.002114 
+-0.005379 0.003198 0.002932 -0.006473 -0.013953 0.000097 
+-0.000344 -0.025048 0.010408 -0.013684 -0.028290 0.014837 
+-0.017125 -0.015000 0.017125 -0.009483 0.005042 0.000240 
+0.014011 -0.012489 -0.001576 -0.003044 0.002636 0.018107 
+0.005275 -0.016357 -0.001632 -0.008932 -0.010257 -0.003083 
+-0.013120 -0.004286 0.004528 -0.007033 -0.004520 0.003383 
+-0.001844 0.000315 0.000937 -0.001044 0.004625 0.002527 
+0.000900 0.002915 0.002657 -0.009886 -0.006017 0.006735 
+-0.014788 -0.019248 0.001671 -0.005971 -0.021346 -0.004532 
+0.001726 -0.000618 -0.008838 0.004567 0.002692 -0.005573 
+0.003656 -0.000018 -0.002882 0.004141 -0.000141 -0.000307 
+0.002881 -0.004853 -0.000165 0.006207 -0.015341 0.002453 
+0.017966 0.009653 -0.047604 -0.028623 0.035364 -0.042088 
+-0.004480 0.011837 0.008683 0.005888 0.000739 0.004185 
+-0.002227 -0.003605 -0.003059 0.001679 0.000031 0.002842 
+-0.002522 0.000339 -0.000160 -0.014590 0.003410 0.004003 
+-0.005270 0.000731 0.003294 0.007579 -0.006011 -0.002774 
+0.019269 -0.010889 -0.009565 0.016501 -0.012027 -0.023658 
+0.007570 -0.010727 -0.027323 0.007485 -0.003050 -0.021959 
+0.004852 -0.001979 -0.009704 -0.006544 0.002510 0.002290 
+-0.008559 0.004678 0.002261 -0.002202 0.004548 -0.000986 
+0.001430 -0.001724 0.000399 0.003947 -0.005595 0.002038 
+-0.001342 0.000122 -0.000444 -0.001865 -0.004512 -0.002802 
+-0.000861 -0.007011 -0.001428 -0.003240 -0.003673 0.000270 
+-0.003819 0.000125 0.000330 -0.001584 0.000757 0.001004 
+0.001168 0.000965 0.000298 0.001922 0.002410 -0.001516 
+-0.003907 0.004801 -0.002530 0.002451 -0.002260 -0.002928 
+0.006903 0.000012 -0.002591 0.007603 0.001164 0.003221 
+0.004417 0.001118 0.004297 0.005273 0.006908 0.000007 
+0.002010 0.002782 -0.000745 0.004931 -0.008698 0.027491 
+-0.003423 -0.013816 0.012248 0.003960 -0.015917 0.012322 
+0.015373 -0.019047 0.008704 0.016843 -0.008317 0.009682 
+0.007625 0.000695 0.008240 0.001702 0.003969 0.002373 
+-0.001519 0.003592 -0.000077 0.000694 -0.001487 -0.000789 
+-0.002239 -0.002098 0.003373 0.000060 -0.008760 0.003215 
+0.003576 -0.007269 -0.001560 0.001775 -0.004420 -0.001657 
+-0.005263 -0.003287 -0.000164 -0.007058 -0.003731 -0.000852 
+0.003826 -0.004363 0.001990 0.014818 0.007513 0.008514 
+-0.018015 0.023410 0.005822 -0.007701 0.002545 0.004488 
+-0.000936 0.000109 0.000121 0.002514 -0.006261 0.001047 
+-0.005308 -0.010971 0.017577 -0.022500 0.002500 -0.005000 
+0.003634 -0.007670 0.007311 0.001218 -0.006444 0.005071 
+0.003268 -0.008206 0.000472 -0.007114 -0.008500 0.000994 
+0.009020 0.005579 -0.009495 0.008555 0.004320 -0.009776 
+0.008556 0.005644 -0.001843 -0.000584 0.009851 0.002597 
+-0.004821 0.007517 -0.002599 -0.007342 -0.001522 0.007962 
+-0.012608 -0.007315 0.006028 -0.010006 -0.009104 0.000128 
+-0.001823 -0.008931 -0.005864 0.002012 -0.007174 0.000504 
+0.003035 -0.004539 -0.000430 0.000871 -0.001613 -0.003012 
+0.002546 -0.003256 -0.000530 -0.002274 -0.001990 0.013624 
+-0.045844 -0.004675 -0.020130 -0.001976 0.004501 0.004921 
+0.001704 -0.002675 0.000074 0.011932 -0.001136 -0.002841 
+0.000812 0.001828 -0.002980 0.000755 0.000596 -0.000114 
+-0.008317 0.007993 -0.004813 -0.033406 0.009151 0.005154 
+-0.017570 -0.014041 0.011619 0.012029 -0.031464 -0.011554 
+2.737430 -4.072626 -1.765363 3.183575 -4.376812 -2.048309 
+3.251231 -3.911330 -1.669951 3.005556 -3.094445 -0.711111 
+0.014312 0.000261 0.014194 0.006916 0.001444 0.009424 
+0.001674 -0.005343 -0.011640 -0.010389 -0.003077 -0.002383 
+-0.002970 -0.006355 -0.003317 0.001593 -0.007733 -0.001648 
+0.000540 -0.003611 0.000043 -0.002770 -0.009139 0.003416 
+-0.000538 -0.007206 0.000280 -0.000235 -0.002415 -0.001655 
+0.002962 0.000480 0.001066 0.004677 0.002638 0.001733 
+0.001444 0.002176 0.000512 0.000460 -0.001305 -0.002358 
+-0.002803 -0.002110 -0.011544 -0.000934 -0.002993 -0.000835 
+0.016935 0.004871 -0.001093 0.003856 0.000503 0.011297 
+0.003616 -0.005760 -0.002272 -0.008759 -0.009469 0.018332 
+0.000982 -0.020940 0.022151 0.009685 -0.015351 0.017515 
+0.005075 -0.027809 0.044807 -0.108750 -0.042731 0.048144 
+-0.025612 -0.027518 0.004967 0.009020 -0.024392 0.018319 
+0.004487 -0.001015 0.010955 0.006844 0.007105 0.002966 
+0.008210 0.006003 0.000353 0.002240 -0.000600 0.004783 
+0.007228 -0.002918 0.002387 0.000672 -0.002068 0.005594 
+0.003162 -0.000360 0.001645 0.004698 -0.001228 0.000745 
+-0.000104 -0.004460 0.000608 -0.004348 -0.006304 0.000000 
+-0.000124 -0.005834 -0.000710 0.003150 -0.009529 0.002724 
+0.007043 -0.002365 0.003358 0.058403 0.016384 -0.001166 
+-0.000915 0.003467 0.004139 -0.002272 -0.001262 -0.003695 
+0.016032 -0.024472 0.000103 -0.004964 0.008677 0.006617 
+-0.006582 -0.006400 0.004334 0.006360 -0.005023 0.000275 
+-0.017762 -0.017928 -0.001420 -0.004140 -0.002907 0.005034 
+0.009244 -0.002555 -0.006291 0.013896 -0.004152 -0.010193 
+0.010908 0.002089 -0.005904 0.004239 0.005516 -0.000167 
+-0.012526 0.010922 0.004333 -0.017622 0.002496 0.009903 
+-0.015876 0.008839 0.005551 -0.007299 0.012288 0.002671 
+-0.006860 -0.006577 0.000668 -0.003146 -0.004230 -0.005905 
+0.004513 -0.002376 -0.001724 0.005180 -0.003032 0.004541 
+-0.000556 -0.004144 0.009388 -0.050488 -0.069626 0.057664 
+0.010231 -0.011407 0.018473 0.002513 -0.008777 0.007463 
+0.017033 0.000817 -0.005175 0.016454 0.001187 0.001675 
+0.014163 -0.002009 -0.002086 0.007575 0.000146 0.000605 
+0.003214 0.009419 -0.003368 -0.010377 0.011223 -0.006184 
+-0.019467 -0.007481 0.009855 0.007107 -0.028262 -0.014785 
+2.425150 -3.766467 -2.383234 2.949495 -4.454545 -2.792929 
+3.042056 -4.313084 -2.018692 2.939131 -2.991304 -0.526087 
+2.974249 -1.703863 0.600858 3.137566 -1.021164 0.846561 
+0.016630 0.004773 0.011993 0.003815 0.004391 -0.006976 
+-0.004374 -0.008493 -0.005055 -0.000619 -0.009225 -0.002257 
+-0.001610 -0.000956 -0.002254 0.000016 -0.000372 -0.002796 
+-0.001841 0.000445 -0.005108 0.003106 -0.000156 -0.003340 
+0.001183 0.000301 0.001321 0.006353 0.003049 0.000606 
+0.001957 0.002599 -0.000127 -0.002257 -0.001347 0.001776 
+-0.002299 -0.005583 -0.001250 0.001002 -0.000671 0.002101 
+0.019164 -0.005186 -0.008633 0.012305 -0.021007 -0.015952 
+0.009110 -0.020434 -0.014727 0.000481 -0.008971 -0.008276 
+-0.004028 -0.010631 0.031819 0.001920 -0.017538 0.019309 
+-0.003961 -0.015213 0.015043 -0.033779 -0.019048 0.008356 
+-0.041499 0.020322 -0.014906 0.004233 0.006302 -0.013608 
+-0.000805 0.005362 0.003114 0.009688 0.008409 -0.000035 
+0.011720 0.016564 0.002901 0.005961 0.013546 0.010275 
+0.002359 0.004809 0.009428 -0.000285 -0.000952 0.006332 
+0.002168 -0.001414 0.002752 0.006152 0.003402 0.000740 
+0.006345 0.005469 -0.000409 0.002830 0.002493 0.001093 
+0.001311 -0.003907 0.002181 -0.002067 -0.015805 0.002351 
+-0.008289 -0.021953 0.010890 0.052842 -0.023417 0.021103 
+-0.046142 -0.012967 0.017392 -0.019943 -0.018685 0.008485 
+0.015223 -0.002293 0.003880 0.006785 0.012088 -0.010573 
+0.002899 0.025368 0.007208 -0.004553 0.010991 0.001662 
+-0.007946 -0.006634 0.013347 -0.000531 -0.002507 0.004840 
+-0.004783 -0.005220 0.003799 0.002378 -0.013842 -0.004893 
+0.021607 0.014535 -0.022457 0.005679 0.026232 -0.001789 
+-0.002877 0.017510 0.006385 -0.009593 0.010467 0.009893 
+-0.010452 0.016352 0.006455 -0.004112 0.017641 -0.001609 
+-0.004943 0.004321 0.005735 0.002939 -0.000603 0.008891 
+0.000041 0.001439 0.011695 -0.005842 0.002681 0.004279 
+-0.006300 0.004022 -0.000685 -0.005323 -0.021509 -0.058043 
+0.008743 -0.008862 -0.004338 0.003737 -0.007488 -0.000843 
+0.006938 0.001866 -0.000276 0.007092 0.004572 -0.000100 
+0.004584 -0.005071 0.000047 0.002727 -0.008772 -0.000709 
+0.000083 -0.002861 0.000175 -0.001543 0.007022 -0.001920 
+-0.007029 0.003006 -0.000693 -0.002019 -0.015429 -0.004190 
+0.010860 -0.029076 -0.019154 0.011393 -0.033762 -0.031670 
+0.010979 -0.014665 -0.031251 0.014335 0.002205 -0.008106 
+0.016222 0.005998 0.008257 0.017268 0.005417 0.009594 
+0.016274 -0.001412 0.010168 0.003295 0.000509 0.002775 
+-0.001953 0.000733 -0.010137 -0.000818 -0.006580 -0.003462 
+0.003452 -0.001482 -0.003708 0.001277 -0.000954 -0.003290 
+-0.002033 0.002498 -0.001444 -0.001636 0.004655 -0.002362 
+-0.000358 0.003547 -0.000079 0.003219 -0.000061 0.001333 
+-0.000474 -0.003390 0.000615 -0.003679 -0.004103 0.005948 
+-0.003176 -0.004299 0.007658 0.000768 0.000169 -0.004146 
+0.008000 -0.013063 -0.022165 0.007587 -0.023571 -0.023390 
+0.014278 -0.020821 -0.021192 0.010820 -0.013645 -0.015721 
+0.000232 -0.002460 -0.002029 -0.006131 -0.003169 0.006382 
+-0.006170 -0.000387 -0.000234 -0.004074 -0.003605 0.002422 
+-0.000729 -0.002032 0.002701 0.006393 0.005801 -0.012832 
+0.011816 0.000576 -0.015424 0.005558 0.024249 0.018861 
+-0.004422 0.045167 0.026614 -0.009064 0.043967 0.020713 
+-0.001336 0.026478 0.004336 -0.006175 -0.003362 0.000219 
+0.001510 -0.002443 0.007483 0.004252 -0.002848 -0.000468 
+0.002595 -0.000563 -0.000821 -0.000601 0.000718 -0.000392 
+-0.001147 -0.001805 0.003867 -0.000974 -0.000288 0.001366 
+-0.005144 0.001513 0.006090 -0.015466 0.001112 0.011715 
+-0.015448 -0.003591 0.011244 -0.013745 -0.005597 0.008567 
+-0.008581 -0.004288 0.005426 -0.000864 -0.002178 0.003236 
+0.001371 0.001580 -0.002722 0.003885 0.001920 -0.012369 
+0.000424 0.000898 -0.006083 -0.003648 0.000127 0.001029 
+-0.001217 -0.004429 0.002615 0.001803 -0.013271 -0.014271 
+0.087993 0.031880 0.007491 0.009726 0.039783 0.008609 
+-0.003152 0.026483 0.005609 -0.002604 0.015932 0.012371 
+-0.002603 0.018484 0.011870 -0.012236 0.016921 -0.006617 
+-0.009530 0.001984 0.006623 0.006434 -0.007162 0.008308 
+0.003213 -0.000980 0.007604 -0.029356 0.016205 0.021538 
+-0.000205 -0.021555 -0.028675 0.006162 -0.004464 -0.006056 
+0.004528 -0.003161 -0.001291 -0.002265 -0.015574 -0.000057 
+0.000943 -0.007638 -0.000065 0.004850 0.003013 -0.000360 
+0.003113 -0.001393 0.000626 -0.001941 -0.009578 -0.003923 
+-0.009160 -0.006865 -0.003315 -0.011079 0.003817 -0.000398 
+-0.009193 0.006743 0.000119 -0.002691 -0.005713 -0.000094 
+0.001154 -0.017615 -0.010462 0.000204 -0.013907 -0.017152 
+0.003786 -0.005083 -0.006281 -0.011797 0.011517 0.001417 
+-0.022772 0.005432 -0.005256 -0.015912 -0.008939 0.002755 
+-0.004421 -0.004238 0.002075 0.000103 -0.000758 0.000108 
+0.003010 -0.001026 -0.003487 0.003329 0.001199 -0.005330 
+0.002772 -0.002087 0.000634 -0.001602 -0.000370 0.005217 
+-0.003278 -0.000816 -0.002206 -0.002505 0.003754 -0.000383 
+0.000835 0.005459 -0.001242 0.004197 0.001741 -0.005640 
+0.002401 -0.001571 -0.002359 -0.001868 0.000470 0.003737 
+-0.001367 0.002166 0.007014 0.002705 0.000240 -0.005919 
+0.014522 0.000396 -0.020377 0.013226 -0.009442 -0.025190 
+0.015657 0.000413 -0.008283 0.009589 -0.015148 -0.011698 
+0.002735 -0.010174 -0.005392 -0.006399 -0.003118 0.000875 
+-0.009144 -0.000682 0.004439 -0.010596 -0.006374 0.005095 
+-0.011343 -0.009044 0.010023 -0.010864 -0.007102 -0.001560 
+-0.002793 0.011406 0.004208 -0.006779 0.045808 0.022458 
+-1.715385 5.484615 3.307692 -2.055556 4.902778 3.340278 
+-1.892086 3.208633 2.964029 -0.018953 0.008965 0.017898 
+-0.004632 -0.005943 0.014982 0.002999 -0.003412 0.002327 
+0.003317 0.006205 -0.003143 0.001333 0.005525 -0.000771 
+-0.001062 -0.003063 -0.001573 0.002050 -0.005286 -0.000442 
+0.003661 0.000301 0.000481 0.001115 0.004844 0.002446 
+-0.001601 0.002974 0.003312 -0.001527 0.000170 0.002294 
+0.000900 -0.000365 0.002080 0.001481 -0.000380 0.001969 
+0.001127 -0.000302 -0.001936 -0.000979 -0.002423 -0.005711 
+-0.006303 0.000507 -0.002159 -0.007463 0.001115 0.005064 
+-0.000939 -0.005436 0.006899 0.006645 -0.035587 0.018656 
+0.050404 0.049930 0.038168 -0.003106 0.055374 0.012943 
+-0.488372 4.087209 0.151163 -0.002866 0.026821 0.011363 
+0.001505 0.016228 0.012014 -0.006962 0.031265 0.013553 
+-0.026069 0.006657 -0.003038 -0.013921 0.002194 0.005097 
+-0.010082 -0.012058 0.000535 0.009829 -0.004499 -0.006350 
+0.019069 -0.018271 0.006039 0.009743 -0.009722 -0.001174 
+0.009406 -0.001703 -0.002216 0.004444 -0.006942 -0.001882 
+0.003411 -0.003203 -0.002084 0.009312 0.003319 0.005112 
+0.000486 0.004848 0.003090 -0.005335 -0.002164 -0.004052 
+-0.017666 -0.008006 -0.007918 -0.018361 -0.003841 -0.003621 
+-0.001499 -0.000709 -0.000580 0.004237 0.011868 -0.007688 
+-0.001618 0.009576 -0.007687 -0.006467 0.003843 -0.003443 
+-0.004533 0.004838 -0.000159 -0.002728 0.004704 0.002508 
+-0.002046 0.001746 0.001731 -0.000409 0.000224 0.000775 
+0.001208 -0.000080 0.000374 0.000433 -0.000840 -0.000078 
+0.000492 -0.003049 0.000216 0.000000 -0.005974 -0.002240 
+0.000600 -0.001718 0.001129 -0.000580 -0.000232 -0.000116 
+-0.003476 0.003439 -0.000557 -0.001136 0.008028 0.000888 
+0.002773 0.009740 -0.006257 0.004736 0.003429 -0.008201 
+0.001339 0.003780 -0.000944 0.002180 -0.001340 -0.000043 
+-0.001422 -0.000543 0.000403 0.001835 0.000408 -0.002745 
+0.004923 -0.001659 -0.008755 -0.001628 -0.003087 -0.010189 
+-0.002926 -0.007747 -0.006799 0.001240 -0.007905 -0.007720 
+-0.000458 -0.002752 -0.006075 -0.000706 0.000286 0.000554 
+0.002454 0.003459 0.005288 -0.002745 -0.004126 0.006684 
+-0.007041 -0.008220 0.013150 -0.015345 -0.011347 0.012983 
+-0.010030 0.030941 0.000228 -1.738806 6.059701 3.902985 
+-2.136842 6.115789 3.942105 -2.103448 4.990148 3.768473 
+-1.722543 3.421965 3.098266 -0.008655 0.015019 0.023118 
+-0.003332 -0.006535 0.022137 -0.004036 0.000613 -0.000255 
+-0.001539 0.012349 -0.004626 0.000078 0.007007 -0.002550 
+0.001848 0.000676 -0.000477 0.001337 -0.004701 0.004457 
+0.003927 -0.002245 0.003149 0.002716 0.000838 0.000919 
+-0.000760 -0.001709 0.000858 0.000878 -0.002672 0.002006 
+0.004885 0.000950 0.000505 0.004989 0.003904 0.000142 
+0.002862 0.003621 -0.000127 -0.000366 0.003008 -0.000526 
+-0.003928 0.002231 -0.001214 -0.005751 0.000205 0.002845 
+0.001792 -0.006082 0.006150 -0.012379 0.006257 0.033845 
+-0.012063 0.057161 0.031746 -0.312057 7.191489 0.652482 
+-0.538889 5.944445 0.638889 -0.983784 4.372973 0.729730 
+0.004184 0.019792 0.010389 -0.005863 -0.020539 0.014377 
+-0.026270 -0.077135 0.032021 -0.000149 -0.014697 0.014018 
+0.021694 -0.016032 0.005086 0.014804 -0.011149 0.008809 
+0.008285 -0.023004 0.009609 0.002143 -0.017101 -0.005474 
+0.004870 -0.001516 -0.001183 0.008615 0.006956 0.001807 
+0.010051 0.007456 0.003799 0.007657 0.002667 0.005900 
+0.001002 -0.000143 0.002205 -0.000462 -0.000490 -0.005806 
+0.000852 -0.002660 -0.010423 -0.000833 -0.001382 -0.004974 
+0.003507 0.000843 0.003323 0.004250 0.010503 0.003339 
+0.001846 0.013128 0.004970 0.001031 0.007494 0.004006 
+0.001896 0.000260 0.001493 0.003535 -0.003365 -0.001210 
+0.001893 0.008545 -0.004760 0.000664 0.004456 -0.003360 
+0.000204 -0.000842 0.000607 0.000675 -0.008111 0.002569 
+0.001949 -0.005944 -0.002229 0.007010 -0.003392 0.005971 
+0.000838 -0.002011 0.003519 0.005629 0.003320 0.000334 
+0.001268 0.008036 0.002133 0.003145 0.008185 0.001169 
+0.000583 0.005917 0.000583 0.007108 0.003570 0.001420 
+0.002577 -0.000517 -0.003350 -0.001880 -0.005078 -0.002188 
+-0.005146 -0.002957 -0.004628 -0.003473 -0.003526 -0.001377 
+-0.002253 0.001599 0.001177 -0.001570 0.002610 0.002141 
+-0.002854 -0.001267 0.002269 -0.000570 -0.001569 -0.001585 
+0.006203 0.004806 -0.008623 0.008387 -0.000541 -0.004731 
+0.002212 0.003711 0.007885 0.010824 -0.004892 0.006609 
+0.000594 -0.019750 0.005541 -0.007480 -0.003503 -0.000773 
+-0.495050 5.732673 2.801980 -0.751323 7.529100 3.708995 
+-1.078189 7.164609 3.884774 -1.083333 5.798245 3.850877 
+-0.695122 3.804878 3.134146 -0.006631 0.007173 0.016251 
+0.011724 -0.020236 0.010699 -0.013395 0.000946 -0.016260 
+-0.005746 0.003445 -0.009919 -0.006710 -0.004225 0.003852 
+-0.001384 -0.003633 0.009072 -0.001372 -0.003270 0.004957 
+0.005039 0.002057 0.002755 0.001069 -0.002014 0.005950 
+-0.004153 -0.001630 0.009209 0.000752 -0.001729 0.005741 
+0.009305 0.002699 -0.000843 0.009634 0.006889 -0.000875 
+0.005825 0.005198 -0.001624 0.001441 0.002833 -0.002768 
+-0.002440 0.001127 -0.001036 -0.005383 -0.000149 0.004070 
+0.000519 0.001592 0.003306 0.006091 0.019470 0.015886 
+0.137681 6.637681 1.971014 -0.519802 7.722772 2.019802 
+-0.821256 7.352657 2.101449 -1.027322 5.683060 1.803279 
+-0.003624 0.029177 0.015757 -0.011344 -0.019259 0.012985 
+-0.023345 -0.020041 0.030653 0.009982 -0.007214 0.017104 
+0.009808 -0.005407 0.003905 -0.005344 -0.007684 0.008147 
+-0.005897 -0.031765 -0.005212 -0.005125 -0.018045 -0.014728 
+-0.012359 -0.006067 -0.002170 -0.007047 0.000251 0.001614 
+0.002057 -0.000815 -0.000567 0.005365 -0.002320 -0.002326 
+0.003451 -0.002598 0.001887 0.001748 -0.002937 -0.001241 
+0.004299 -0.002164 -0.004008 -0.002717 0.000291 -0.000263 
+-0.009016 0.011776 -0.000586 -0.006134 0.017840 0.000531 
+-0.001706 0.013814 0.004194 0.004212 0.001002 0.002338 
+0.006609 -0.003826 -0.004348 0.000869 -0.006591 -0.000437 
+-0.004207 -0.004400 0.000741 -0.001716 -0.005905 0.001820 
+-0.002277 -0.002673 0.005195 -0.002367 -0.013277 0.004339 
+0.003741 -0.008605 0.011505 0.001370 -0.004899 0.010128 
+0.007536 -0.001343 -0.005406 0.003070 -0.002271 -0.001689 
+-0.000955 -0.000952 -0.002314 0.001347 -0.003259 -0.000937 
+0.004278 -0.003306 0.000792 0.003263 0.002266 -0.000181 
+0.000922 -0.000549 -0.001134 -0.000252 -0.000924 -0.002101 
+-0.003307 -0.000661 0.001319 -0.001404 0.004809 -0.002656 
+-0.002059 0.009745 -0.002571 0.000134 0.001657 -0.002132 
+-0.000994 -0.002125 0.001201 0.003264 0.001187 -0.001929 
+0.010405 0.003079 -0.007159 0.011763 0.005160 -0.009750 
+0.008873 0.002868 -0.002059 0.004666 0.001787 0.001915 
+-0.003125 -0.000953 -0.000740 -0.010219 0.026362 0.014492 
+-0.819876 6.602485 4.409938 -0.590551 7.795276 4.157480 
+-0.458042 7.251748 3.905594 -0.061475 5.819672 3.454918 
+0.477707 3.624204 2.458599 0.000755 -0.008084 0.007041 
+0.020236 -0.033620 -0.000229 -0.001163 -0.001300 -0.010963 
+0.000990 0.005896 0.001159 -0.000603 -0.005223 0.005073 
+-0.007370 -0.011631 0.015712 -0.017300 -0.001217 -0.003240 
+0.001961 0.017712 -0.002015 0.002443 0.010717 -0.003303 
+-0.000299 -0.000123 0.000091 0.002594 -0.000172 0.000732 
+0.003101 0.003658 0.000082 0.004171 0.003922 0.000844 
+0.002533 0.001168 -0.000341 -0.004932 0.001665 0.001418 
+-0.011805 0.003695 0.004638 -0.015813 -0.004518 0.015452 
+-0.020737 -0.004148 -0.001383 0.006539 0.027280 0.019373 
+-0.203297 7.115385 3.049451 -0.694981 8.386101 2.864865 
+-0.911017 8.377119 2.936441 -0.446429 6.732143 2.648809 
+-0.012356 0.019235 0.003410 -0.004047 -0.004013 -0.002094 
+0.002985 -0.002773 -0.006216 0.003860 -0.000713 -0.002289 
+-0.003459 -0.004751 0.001127 0.006618 -0.018074 -0.003069 
+0.009298 -0.037075 -0.011534 -0.003713 -0.044566 -0.018132 
+-0.002034 -0.018236 0.001875 -0.003121 -0.010650 0.009493 
+-0.005906 -0.013966 0.011764 -0.002114 -0.003928 0.008770 
+-0.002282 0.001207 -0.000032 -0.002606 -0.000399 -0.010447 
+0.004213 -0.003165 -0.006509 -0.000384 0.000464 0.000581 
+-0.012536 0.007563 0.004322 -0.014590 0.011483 -0.001013 
+-0.003241 0.003607 -0.002951 0.002612 -0.005656 0.003007 
+-0.000917 -0.003640 0.009780 -0.004336 -0.008672 0.010588 
+-0.000219 0.000219 0.010702 -0.006460 -0.004718 0.010784 
+-0.004491 -0.007225 0.005093 -0.006039 -0.003327 0.002693 
+-0.005801 0.000222 0.002499 -0.002632 0.003712 -0.004433 
+0.000357 -0.001233 -0.000778 -0.003602 -0.001157 -0.004964 
+0.000420 -0.004809 -0.002099 0.002211 -0.002783 -0.001878 
+-0.005963 -0.000249 -0.002819 0.000145 -0.001075 -0.002156 
+0.000035 -0.000548 -0.002855 0.002282 -0.001829 -0.003960 
+0.004822 0.000869 -0.001050 0.001259 0.009714 0.001431 
+0.000880 0.008516 -0.004585 0.000944 -0.000838 -0.002952 
+-0.002115 -0.004420 -0.004483 -0.000478 -0.004613 -0.003070 
+0.000982 0.003138 -0.003575 0.001136 0.005277 -0.006434 
+0.003593 -0.001391 0.002618 -0.007249 -0.004069 0.015316 
+-0.008588 0.013201 0.019409 -2.083333 3.220238 3.065476 
+-1.905455 5.741818 3.909091 -1.463977 6.847262 3.792507 
+-1.106250 6.612500 3.743750 -0.459574 5.442553 3.408511 
+0.372263 3.693431 2.321168 -0.000156 -0.015689 0.002385 
+-0.002335 -0.018299 -0.015144 0.000099 0.002620 -0.000285 
+0.004502 -0.000122 0.002291 -0.006073 -0.000318 0.003118 
+-0.012476 -0.004524 0.000994 -0.007255 0.007124 -0.000263 
+-0.000212 0.015846 0.009273 0.003294 0.012408 0.008051 
+0.003650 0.001913 0.000580 0.003742 -0.008128 -0.005149 
+-0.000164 -0.007611 0.000272 -0.001317 -0.000642 -0.000041 
+-0.002428 0.002530 -0.002482 -0.006789 0.004420 -0.004955 
+-0.004543 0.000324 -0.000646 -0.012010 -0.016562 0.014794 
+-0.001454 -0.026544 -0.003906 -0.001661 0.036429 0.019961 
+0.521368 7.910256 2.841880 0.094044 8.833856 3.050157 
+-0.052045 8.624536 3.375465 0.962733 6.490683 3.577640 
+-0.004853 0.006725 0.005754 0.002362 -0.017176 0.008292 
+-0.005166 -0.007974 0.004952 -0.005000 0.002402 0.000832 
+-0.004587 0.003608 0.004297 0.005366 -0.005152 0.004411 
+-0.001730 -0.047275 -0.005886 -0.006464 -0.001880 0.012960 
+0.001729 -0.000696 0.006099 0.002736 -0.000223 0.003820 
+-0.000016 -0.000126 -0.000331 -0.001220 -0.000151 -0.002824 
+0.000780 0.001454 -0.008627 0.001997 0.001145 -0.008138 
+0.001437 -0.000907 -0.002419 -0.003865 -0.000695 -0.001138 
+-0.007749 -0.001868 -0.003674 -0.004613 -0.002191 -0.006459 
+0.001522 -0.001870 -0.002693 0.004749 -0.003605 0.003762 
+-0.002615 -0.003568 0.003710 -0.000541 0.002031 0.000203 
+-0.000271 0.000577 0.000157 -0.004060 -0.000459 0.001236 
+-0.003805 0.004760 0.000740 0.001300 0.010286 -0.000208 
+0.006380 0.007476 -0.001501 -0.001447 -0.003625 -0.001561 
+0.001444 0.003465 0.000180 -0.001762 -0.000555 0.000982 
+-0.000293 -0.002423 0.002507 0.000589 0.000777 -0.002419 
+0.000770 -0.001599 -0.008650 0.001851 -0.001642 -0.007067 
+0.001194 -0.003065 -0.004482 0.003742 -0.002592 -0.000117 
+0.000908 0.003633 -0.000080 0.002710 0.005556 0.000136 
+0.003628 -0.002623 -0.004228 0.012973 -0.007819 -0.007021 
+0.003555 0.001524 -0.008649 -0.005726 -0.010303 -0.005695 
+-0.007379 -0.000724 0.002749 -0.000107 -0.004295 -0.004864 
+-0.002325 -0.010443 -0.002153 -0.018780 -0.005917 0.016398 
+-1.725275 3.241758 2.587912 -2.687050 3.633094 2.917266 
+-2.893300 5.332506 2.965261 -2.473193 6.419580 2.932401 
+-1.962617 6.757010 2.906542 -1.260870 5.913043 2.684783 
+-0.012962 0.041712 0.023564 -0.001012 0.006194 0.004645 
+0.006523 0.001687 -0.002921 -0.001204 0.018937 0.001630 
+-0.009759 -0.001201 0.000243 -0.005762 -0.000494 -0.001704 
+-0.000874 0.006317 0.001354 -0.000709 -0.000457 -0.001307 
+0.004383 -0.004730 0.004184 0.006029 -0.000964 0.002466 
+-0.000779 0.000576 0.000830 -0.001235 -0.003348 -0.001270 
+-0.000501 -0.008826 -0.000270 -0.001705 -0.006198 0.002554 
+-0.002010 0.004881 -0.003483 -0.009315 0.013127 -0.010625 
+0.007630 0.031163 0.013993 -0.005301 -0.037152 -0.005312 
+0.001745 -0.024124 -0.019484 1.406015 5.090226 0.624060 
+1.149826 8.163763 2.554007 1.142857 8.801587 3.100529 
+1.535032 8.321656 3.671974 2.833333 5.848958 4.187500 
+0.007802 0.013324 0.025955 0.006164 -0.016733 0.004841 
+-0.007391 0.004687 0.004576 -0.021305 0.009676 0.000775 
+-0.014833 0.008799 0.009176 0.001644 -0.009428 0.014095 
+0.004526 -0.002863 0.010250 0.001830 -0.000657 0.000357 
+0.001355 0.000714 0.004315 0.003429 0.000803 0.007160 
+0.004578 -0.001017 0.002593 0.002890 -0.000115 -0.004469 
+0.002572 0.001119 -0.004389 0.001338 0.000915 0.001056 
+-0.005752 -0.002211 0.004131 -0.003688 0.002221 -0.003145 
+-0.001360 0.000645 -0.003468 0.000081 -0.001158 -0.003373 
+0.000079 -0.004594 -0.002317 0.001658 -0.002349 -0.000345 
+-0.000160 0.000956 -0.002866 -0.001429 0.003083 -0.003474 
+0.003059 0.000455 -0.004753 0.000083 0.000687 0.000515 
+0.002072 0.001104 0.000896 0.004714 0.002699 -0.004471 
+0.003441 -0.001229 -0.004301 -0.000230 -0.003408 -0.001532 
+0.002047 0.003748 -0.011244 -0.004411 -0.004921 -0.005293 
+0.000000 -0.006612 0.000661 -0.006684 -0.002807 0.003704 
+0.002142 0.000594 0.001379 0.006671 -0.005265 0.000589 
+0.010020 0.002248 -0.006239 0.005161 -0.000974 -0.002142 
+-0.000112 -0.001237 -0.000292 0.002689 -0.001866 0.000765 
+0.002377 0.000836 0.003683 0.008771 0.004106 -0.003391 
+-0.002190 0.000132 -0.001816 -0.003158 -0.000419 -0.005292 
+-0.006522 -0.002978 -0.000417 0.004068 0.000533 -0.006026 
+0.005405 0.005877 -0.013798 -0.008100 -0.032807 -0.006009 
+-2.136095 0.124260 2.479290 -3.033457 5.654275 2.698885 
+-3.398396 6.385027 2.604278 -3.099738 7.099738 2.524934 
+-2.573705 7.011952 2.402390 -0.024735 0.040106 0.018272 
+-0.012056 0.006855 0.003694 -0.015872 0.003341 0.009296 
+-0.008325 0.028331 0.015173 0.006416 0.028834 0.007791 
+-0.004241 0.006949 -0.009477 0.008102 0.011717 -0.000370 
+0.003868 0.012893 0.004943 0.004927 -0.001784 0.006123 
+0.002576 -0.013530 0.005367 0.000002 -0.011757 0.006525 
+-0.004126 -0.005376 0.006626 -0.004880 -0.003706 0.007078 
+-0.006864 -0.011641 0.004494 -0.002697 -0.019268 0.005388 
+-0.001291 0.006319 -0.002183 -0.006260 0.027757 0.009524 
+0.007440 0.004452 -0.008522 0.040942 -0.048254 -0.018522 
+-0.019182 -0.034707 -0.010542 1.007634 6.038168 0.984733 
+1.749164 8.575251 2.729097 2.075949 8.860760 3.182278 
+2.576923 8.106509 3.668639 3.729730 5.725225 4.166667 
+3.900000 1.860000 2.526667 0.014193 -0.001058 0.010987 
+0.000094 0.005616 -0.000187 0.003660 0.007028 0.008263 
+0.002895 0.002226 0.012358 0.009048 -0.005499 0.009262 
+0.005330 -0.002257 0.001971 0.003479 -0.001299 -0.001543 
+0.004736 0.000561 -0.000490 -0.000634 -0.001039 0.002062 
+-0.000317 -0.003144 0.001565 -0.000797 0.001139 -0.001048 
+-0.000389 -0.000272 -0.002720 0.001745 -0.000405 -0.004143 
+0.000150 -0.000914 -0.004903 -0.000154 0.001210 -0.005724 
+0.001768 0.001465 -0.004866 0.001064 0.000599 0.000418 
+0.000300 -0.003107 -0.000246 0.002367 -0.003632 0.000027 
+0.001736 -0.003058 0.002149 0.000047 0.000009 -0.000820 
+0.002478 0.000797 -0.000851 0.003704 0.005203 0.002301 
+0.003597 0.002721 0.002768 -0.001015 -0.004391 0.003503 
+-0.008613 -0.004934 0.001341 -0.008375 -0.005295 -0.003498 
+-0.001896 0.000950 -0.004729 0.000784 -0.001400 -0.001386 
+-0.004830 -0.005198 0.000374 -0.001979 0.000973 0.003209 
+0.002012 0.000045 0.004431 0.005664 0.004560 0.001765 
+0.000000 0.000167 -0.001333 0.004188 -0.005018 -0.000627 
+0.005180 -0.007716 -0.003141 0.004721 -0.004956 -0.004465 
+0.004435 0.000000 0.001613 0.000021 0.005649 0.002381 
+-0.001034 0.006560 0.002890 0.001424 0.005469 0.001963 
+0.000847 0.006744 0.001628 0.005772 0.001713 0.001753 
+0.012322 0.007098 -0.005813 -0.007266 -0.009315 -0.000338 
+-1.134831 -9.078651 0.853933 -2.891892 5.378378 1.702703 
+-3.430303 4.157576 2.006061 -3.129032 5.096774 2.215054 
+-2.750000 5.166667 2.295455 -0.003995 0.003952 0.011677 
+-0.018610 -0.014003 0.014999 -0.005328 -0.082062 0.001064 
+-0.006467 0.004472 0.009490 0.000163 0.010055 0.008609 
+-0.001651 -0.007576 -0.012428 0.000792 -0.024554 -0.008396 
+-0.002855 -0.010692 0.000500 0.002886 0.001847 0.005674 
+0.000164 -0.000019 0.000861 0.002939 -0.006566 -0.004378 
+0.001450 -0.011627 0.000391 -0.001842 -0.011840 0.004915 
+-0.005889 -0.015037 0.004355 -0.007308 -0.022305 -0.002799 
+-0.006371 -0.009713 -0.006637 0.003377 -0.001501 -0.000135 
+0.014019 0.003096 -0.000313 -0.004080 -0.065086 0.013311 
+-0.013280 -0.060094 -0.018616 1.404762 9.079365 0.357143 
+2.599315 9.267123 2.328767 2.958333 8.960938 2.976562 
+3.129518 8.072289 3.379518 3.394366 5.854460 3.568075 
+3.380597 2.641791 1.604478 0.020958 0.007153 0.009569 
+0.018978 0.008249 0.001449 0.012307 -0.003626 0.000840 
+0.007774 -0.004537 0.002881 0.004513 -0.003580 0.000766 
+0.002794 -0.000862 0.000557 -0.000894 0.001259 0.001444 
+-0.001317 0.000256 0.004033 -0.003644 0.002404 -0.000108 
+-0.008407 -0.001275 -0.001391 -0.006029 -0.000232 -0.001159 
+-0.005725 -0.002385 0.005446 -0.004978 0.001404 0.005167 
+-0.000710 0.000587 -0.000153 -0.002197 0.001501 -0.002793 
+-0.001776 0.000431 -0.004629 0.002409 0.003832 -0.003613 
+-0.001212 -0.001560 0.001167 -0.001614 -0.001187 0.004887 
+-0.000265 -0.000065 0.000109 0.001000 -0.000254 -0.000451 
+0.000227 0.003523 0.001098 -0.003111 0.001861 0.000611 
+0.001570 0.002802 0.000934 0.000037 -0.003081 0.001587 
+-0.003278 -0.004583 -0.005180 -0.004666 -0.006420 -0.005767 
+0.001610 0.002803 0.000715 0.002839 0.002626 -0.000883 
+0.001880 -0.001216 -0.000311 0.001415 0.000036 -0.000520 
+0.000768 -0.002188 0.000341 -0.000242 0.000484 0.002984 
+0.000082 0.003111 0.000358 -0.000768 -0.002122 -0.003431 
+0.002204 0.004566 -0.008109 0.000816 -0.004170 -0.003376 
+0.001754 -0.000080 0.001040 0.001178 0.000256 0.001376 
+0.002434 0.003209 -0.000056 0.003964 0.003831 0.000232 
+0.001725 0.003329 0.002265 -0.000038 0.002581 0.006431 
+-0.000153 0.002853 0.006331 0.002667 0.003374 0.000452 
+0.000664 0.001387 -0.011654 -0.008715 -0.102053 -0.004587 
+-0.007486 -0.083155 -0.093720 -0.020142 -0.021675 -0.040443 
+0.000515 0.000188 -0.002743 0.013089 0.003733 -0.000171 
+0.030261 -0.001470 0.000253 0.012590 -0.012639 0.004170 
+0.010617 -0.021955 0.011132 0.000740 -0.012527 0.001746 
+-0.009494 -0.015823 -0.001788 -0.021078 -0.016344 -0.021721 
+-0.003263 -0.016720 -0.010605 0.000705 0.002340 0.000690 
+0.002341 0.007347 -0.000095 0.002454 0.001490 -0.005208 
+0.005897 -0.003864 -0.006599 0.004089 -0.009621 0.000441 
+-0.005093 -0.011319 0.006705 -0.013367 -0.009187 -0.000366 
+-0.005292 -0.000162 -0.002326 0.003724 0.002472 0.004895 
+-0.001733 -0.004274 0.008464 -0.016035 -0.026391 0.005749 
+-0.014631 -0.004728 -0.019854 1.747826 -1.686957 0.391304 
+2.840164 9.094262 2.049180 3.240260 10.055195 2.616883 
+3.466667 8.211764 2.921569 3.237180 5.666667 2.500000 
+0.011905 0.015825 0.009002 0.009527 -0.002216 -0.001219 
+0.004129 -0.000561 -0.004453 0.001939 -0.004678 0.002559 
+0.002876 -0.001658 0.004944 0.004586 0.005487 0.003543 
+0.001144 -0.001358 0.004186 0.002759 -0.000571 0.005921 
+0.001981 -0.001472 0.001914 -0.002303 0.001777 -0.003440 
+-0.002793 0.004674 -0.005628 -0.000313 0.000417 0.000000 
+0.002265 -0.000261 0.003746 -0.003918 0.002224 0.002768 
+-0.003457 0.003137 0.000203 -0.001717 0.005802 -0.002943 
+-0.002248 0.002582 -0.001698 -0.004533 0.000548 -0.000415 
+-0.009840 -0.004103 0.004294 -0.006179 -0.005497 0.004112 
+-0.000401 -0.001406 0.000364 -0.000094 0.002516 -0.002403 
+-0.002059 0.003857 0.001606 0.000587 0.003920 0.001600 
+0.001065 -0.000583 0.001014 0.002214 0.000020 0.000666 
+-0.002460 0.000639 -0.000889 -0.003983 0.001401 -0.000849 
+0.000503 0.000112 -0.001203 -0.000993 0.001230 -0.001422 
+-0.000484 0.000000 0.000806 0.001222 0.002444 0.003016 
+-0.003007 0.002072 0.001869 -0.001565 0.004538 -0.000626 
+-0.002573 0.005284 0.000028 0.001833 0.006452 0.000815 
+0.005116 0.002909 -0.004135 0.000966 -0.000027 -0.002239 
+-0.000524 0.001966 -0.000852 -0.000755 -0.000312 -0.002086 
+0.000650 0.002129 -0.000549 0.002297 -0.002068 0.000597 
+0.000905 -0.002602 0.000402 -0.001192 -0.000813 -0.000681 
+-0.000121 0.000019 -0.000637 0.000228 0.000012 -0.000032 
+-0.000120 -0.000812 0.002440 0.002653 0.002086 0.005044 
+0.009744 0.008139 0.002347 0.015222 -0.004088 -0.006326 
+0.002216 0.004481 -0.003283 0.013249 0.001811 -0.009726 
+0.002801 -0.002217 0.002006 0.002449 -0.002852 0.012308 
+0.002605 -0.002770 0.007767 -0.010193 0.000904 -0.000071 
+-0.010111 0.010382 -0.001618 0.003048 0.015138 -0.000799 
+0.004810 0.013685 -0.001426 0.009409 0.012316 -0.004304 
+0.010935 0.009425 -0.003045 0.007996 0.006708 -0.006614 
+0.001437 0.004496 -0.008593 -0.002843 0.004804 -0.001863 
+-0.007926 0.000805 0.004267 -0.007501 -0.004019 0.002099 
+-0.000925 -0.008224 0.007674 -0.003896 -0.000747 0.011722 
+0.000007 0.003166 0.006621 -0.007728 0.011418 0.002595 
+-0.006389 0.008738 0.009995 0.342857 -22.628571 1.700000 
+1.588710 2.846774 1.959677 1.993056 8.097222 1.729167 
+2.147541 5.491803 1.262295 0.016856 0.023535 0.016437 
+0.004249 -0.003582 -0.000891 -0.011327 -0.012184 -0.009557 
+-0.005994 -0.013424 0.001333 0.000416 -0.003705 0.006747 
+0.000729 0.002605 0.007769 0.006892 -0.004004 0.004933 
+0.002555 -0.001089 0.008444 0.000502 0.000344 0.000754 
+-0.009768 -0.008073 -0.001877 -0.003948 -0.003421 0.005333 
+-0.000842 0.000943 0.002591 0.000629 0.000565 0.001041 
+0.001896 0.001000 -0.000956 0.000997 0.002156 -0.006637 
+0.003846 0.000824 -0.009426 0.004237 0.004249 -0.008395 
+-0.000102 0.000656 -0.003091 -0.000325 -0.003020 -0.000289 
+-0.003545 -0.003753 0.004153 -0.000378 -0.000198 0.001121 
+-0.001334 0.003404 -0.004035 -0.001950 0.002064 -0.002993 
+0.003325 0.000421 0.000833 0.002770 -0.004663 0.000960 
+0.000430 -0.000876 -0.004859 -0.006851 -0.003484 -0.005442 
+-0.005348 -0.002137 -0.000213 -0.000185 -0.001595 0.003744 
+0.002339 0.000968 -0.004274 0.000226 -0.000452 -0.003790 
+0.000343 -0.001165 -0.001234 -0.001155 -0.001391 0.002546 
+0.000204 0.001889 0.002143 0.002527 0.005328 0.000758 
+0.003465 0.003967 0.000693 0.002452 -0.001127 0.000498 
+0.000972 -0.003726 0.003563 0.000494 -0.002796 0.002001 
+0.000539 0.001141 -0.000394 -0.001390 0.002876 -0.001127 
+-0.000069 0.001250 -0.000622 -0.000023 0.000170 -0.000286 
+0.001405 0.000295 -0.001612 0.003359 -0.000315 -0.001733 
+0.000462 0.001019 0.000135 -0.002153 0.000599 0.002531 
+-0.001370 0.002091 0.000043 0.004189 0.005261 -0.000178 
+0.008360 0.009485 -0.001465 0.006719 0.008998 0.001058 
+0.000299 -0.001057 0.000235 0.003821 -0.005084 -0.004176 
+-0.003018 0.006775 0.005934 -0.001708 0.015543 0.022222 
+-0.006882 0.008852 0.013638 -0.004856 -0.006119 -0.002629 
+0.002225 -0.000203 -0.001121 -0.005567 -0.002481 -0.012134 
+-0.013754 0.000673 -0.001592 -0.002088 -0.003372 0.004180 
+0.015234 0.008100 -0.003124 0.009517 0.006864 -0.003354 
+0.003905 0.001358 -0.000571 0.002162 -0.003052 0.001593 
+0.000868 -0.005926 0.002478 -0.003368 -0.012720 0.009249 
+-0.013300 -0.004144 0.013142 -0.013760 -0.001553 -0.003329 
+0.009304 -0.000002 0.000381 0.017019 0.000068 0.013081 
+0.017503 0.001809 0.008273 0.000487 0.019782 0.018608 
+-0.021192 -0.046669 -0.061213 -0.029021 -0.026679 -0.041633 
+-0.011058 -0.004463 -0.001693 -0.006781 0.012920 -0.006215 
+-0.015207 -0.004844 -0.004196 -0.000694 -0.018961 -0.001526 
+0.001294 -0.004269 0.004077 -0.002123 0.005819 0.000398 
+0.000737 0.005453 -0.000594 0.003065 -0.002276 0.000228 
+0.003369 -0.003348 0.001432 -0.002495 -0.000858 -0.001456 
+-0.005611 0.000932 0.002844 -0.002698 -0.000814 0.004111 
+-0.003237 -0.005332 0.003049 -0.002841 0.000240 0.004926 
+-0.001298 0.002782 0.003083 -0.002408 0.004589 0.002153 
+0.004018 0.003482 -0.005357 -0.001441 0.007072 -0.006254 
+-0.001171 0.001547 -0.003893 -0.002453 -0.001987 0.001149 
+0.001245 -0.002218 0.002125 0.002698 -0.003153 -0.004017 
+-0.000061 -0.002445 -0.006743 0.001186 0.000948 -0.000890 
+-0.002208 0.002208 0.001583 -0.006531 0.002737 0.000623 
+-0.008871 0.000000 -0.001935 -0.004727 -0.000285 -0.003728 
+-0.000228 0.000961 -0.002488 0.000738 -0.000454 -0.001452 
+-0.001233 0.000705 -0.005242 -0.001143 -0.000292 -0.005761 
+0.000503 -0.003384 -0.002633 0.002976 -0.000674 -0.002318 
+0.004572 0.002887 -0.003370 0.006563 0.005399 -0.000847 
+0.003846 0.003578 0.002236 0.000478 -0.000839 0.000754 
+-0.000917 -0.000729 0.003417 -0.002658 0.002475 0.000570 
+-0.001052 0.005156 0.004220 -0.001673 0.002939 0.002867 
+-0.000432 0.001279 0.001027 -0.000217 -0.000011 0.001019 
+0.000507 -0.001406 0.002159 0.000466 -0.001253 -0.001409 
+0.000809 -0.001618 0.000368 -0.001419 0.000151 0.001232 
+0.004890 0.002329 0.001770 0.005950 0.002893 0.003704 
+0.002091 0.005314 -0.000704 0.001156 0.002561 -0.001617 
+0.001004 0.002935 0.002005 -0.000461 0.001635 -0.000567 
+-0.000628 -0.002830 -0.000865 -0.015239 -0.023332 0.004925 
+-0.031035 -0.046656 0.021934 -0.000472 -0.051076 0.011594 
+0.005316 -0.001852 -0.000851 -0.003954 0.013194 0.001825 
+-0.016629 0.008546 -0.005032 0.006067 0.018330 -0.032129 
+0.056667 0.035000 -0.026333 0.007271 0.003529 0.001950 
+-0.003266 -0.003498 0.013130 0.003832 -0.001199 0.011553 
+0.002716 -0.002250 0.007423 -0.004867 -0.000307 0.011262 
+-0.012322 -0.003534 0.012513 -0.005858 0.001801 0.002097 
+0.003358 0.009567 -0.016597 0.025624 -0.005691 -0.018727 
+-0.018828 -0.056584 -0.037710 0.445683 0.768114 0.138581 
+-0.009615 0.096262 -0.021972 -0.006072 0.011428 0.001371 
+-0.003856 0.002114 -0.000442 -0.009751 0.004359 0.001415 
+-0.011352 0.005267 0.002707 -0.004949 0.007166 -0.000955 
+-0.001009 0.003203 -0.000705 -0.000771 0.001475 0.000209 
+-0.001314 0.001379 -0.000493 -0.000368 0.001053 -0.000940 
+0.000804 -0.000533 -0.001237 0.001043 0.000380 -0.002006 
+0.001212 -0.000205 -0.001355 -0.000887 -0.000756 0.000666 
+-0.004157 -0.002064 0.004897 -0.007235 -0.004812 0.008081 
+-0.007263 -0.005900 0.008687 -0.000161 -0.000627 -0.000255 
+-0.002079 0.002876 0.001334 -0.001202 0.001303 0.000011 
+-0.002404 -0.001117 -0.001877 -0.001700 0.001781 -0.002325 
+0.000924 0.000309 -0.004087 0.001550 -0.001966 -0.002581 
+-0.001043 -0.000421 -0.002067 0.000323 0.001183 -0.001582 
+-0.000928 0.002487 -0.000584 -0.000476 0.002302 0.001032 
+-0.005341 -0.000909 -0.001477 -0.005553 -0.001707 -0.000267 
+-0.004626 -0.003561 -0.004449 -0.002845 -0.002406 -0.003983 
+-0.000913 0.000053 0.000311 -0.002576 -0.001160 0.001450 
+0.000000 -0.001145 0.001221 -0.000831 -0.001369 -0.000928 
+-0.002360 -0.001255 -0.000678 -0.003009 -0.001239 -0.000649 
+-0.000623 -0.000852 -0.001374 0.001636 0.000903 -0.000384 
+-0.000314 0.002061 0.002113 -0.004884 0.003193 0.003912 
+-0.007114 0.002945 0.004436 -0.005943 0.001230 0.003074 
+-0.001463 0.000976 0.002439 -0.000184 -0.000134 0.001984 
+-0.002308 -0.001567 0.001650 -0.004328 -0.000737 0.002950 
+0.001039 -0.000894 0.003232 0.000818 -0.000184 0.004343 
+0.000025 0.000383 0.002800 0.001674 0.001171 -0.000559 
+0.002140 0.002282 0.000818 0.001297 0.004808 -0.000082 
+0.003190 0.007708 -0.000928 0.005393 0.009008 0.002194 
+0.006218 0.002036 0.002406 -0.000573 0.000953 -0.004760 
+-0.002634 0.002631 -0.005918 -0.006630 0.001635 -0.002265 
+-0.001213 -0.002530 0.003155 0.008590 -0.001181 0.003486 
+0.019388 0.022256 -0.015554 0.048998 0.061348 -0.063187 
+0.040431 0.008007 -0.008498 -0.000760 -0.014515 0.011476 
+-0.008761 -0.016686 0.008534 -0.001512 -0.005947 0.000758 
+-0.000136 0.001031 -0.000162 -0.001928 0.001711 -0.000794 
+-0.001012 -0.003680 0.002156 -0.001490 -0.001094 0.000488 
+0.008879 0.002242 -0.012086 0.036626 -0.019409 -0.020591 
+-0.046453 -0.044525 -0.042252 0.009762 0.003880 0.019414 
+-0.001439 0.003704 0.002749 -0.003312 0.005598 -0.000495 
+-0.004168 0.004383 0.000431 -0.005569 0.000683 0.001028 
+-0.002239 0.001442 0.000964 -0.000096 0.001161 -0.002456 
+0.001083 -0.001086 -0.000282 -0.001184 -0.005724 0.003481 
+-0.003067 -0.003647 0.005589 -0.003081 0.000587 0.004817 
+-0.000199 0.000356 0.003267 -0.000278 -0.000750 0.001139 
+-0.002217 -0.005474 0.001975 -0.003729 -0.000678 -0.001695 
+-0.002193 0.000030 0.008050 -0.002184 0.004340 0.005280 
+0.000785 0.001882 0.001622 -0.000986 -0.000506 -0.001778 
+-0.000555 -0.001984 -0.001648 -0.000482 -0.002814 -0.000894 
+-0.002273 -0.001616 0.001578 0.002326 0.001282 -0.004456 
+0.002782 0.001204 -0.010227 -0.002653 -0.001048 -0.003003 
+0.004303 0.001270 -0.002787 0.002082 -0.000381 -0.005865 
+0.001840 0.000880 0.000000 0.004186 0.001129 -0.002512 
+0.000611 -0.001652 -0.000581 -0.004608 -0.002685 0.000127 
+-0.005839 -0.002469 -0.000540 -0.004868 0.001054 -0.003364 
+-0.001097 -0.007513 0.002364 0.002416 -0.005103 0.003800 
+0.004068 -0.002453 0.000964 0.003021 -0.001695 -0.001364 
+0.000431 -0.005726 0.002755 -0.001743 -0.005554 0.002662 
+-0.002766 -0.002835 -0.000790 0.000989 0.001318 -0.005520 
+0.002309 -0.000087 -0.000353 0.000383 -0.000039 0.000059 
+-0.002695 -0.003724 -0.001449 0.000553 -0.001763 -0.001972 
+-0.001283 0.000405 -0.003479 0.002478 0.001294 -0.002807 
+-0.000036 -0.000033 0.001885 -0.004712 -0.001128 0.003683 
+-0.000705 0.000540 0.000862 0.002240 0.000292 -0.000058 
+-0.001156 0.003725 0.000303 0.000165 0.006337 -0.006996 
+0.001429 0.003897 0.000845 0.000931 -0.000596 0.001839 
+-0.001386 -0.003067 0.001225 -0.002193 -0.003340 -0.003216 
+0.001011 0.001564 -0.010902 -0.000259 -0.000507 -0.008304 
+0.003331 0.000949 -0.010834 0.002142 0.002267 -0.006238 
+-0.002117 0.000341 -0.000207 -0.003890 -0.002689 0.004598 
+-0.002838 -0.002958 0.005269 -0.001059 -0.001013 0.002277 
+-0.000924 -0.000595 0.001495 -0.002089 -0.000489 0.000960 
+-0.001538 -0.001416 0.001057 -0.006613 -0.006940 0.003433 
+-0.014608 -0.011474 0.008089 -0.010427 -0.006751 0.008249 
+0.001096 0.001282 -0.001872 0.008408 0.005645 -0.009602 
+0.009971 0.006301 -0.009254 0.013719 0.006696 -0.007839 
+0.019687 0.003052 -0.000191 0.008088 -0.007970 -0.002414 
+0.001561 0.001220 -0.006343 0.001151 0.010336 -0.006716 
+0.005726 0.013952 -0.001666 0.006351 0.008744 0.001425 
+0.001198 -0.001385 0.000622 0.002192 -0.002925 -0.000725 
+0.000329 -0.002750 0.003088 -0.005299 -0.000339 0.002591 
+-0.006488 -0.007196 0.002316 -0.005556 -0.003597 0.001470 
+-0.001739 -0.000696 0.002845 0.000618 -0.000904 0.000540 
+0.001140 -0.002893 0.000207 0.002489 -0.003083 -0.000626 
+0.003558 -0.000181 -0.004523 0.004661 0.000330 -0.005287 
+0.003386 0.000260 -0.003077 -0.000079 0.000256 -0.000118 
+-0.002177 -0.001441 0.001378 -0.002351 -0.000946 0.001700 
+-0.000241 -0.000077 0.000330 0.002188 -0.001463 -0.003626 
+-0.001267 0.002034 -0.005835 0.004472 0.002722 -0.006222 
+0.003170 0.003882 -0.002430 0.001831 0.001116 -0.000455 
+0.000274 0.000715 -0.001415 0.002992 0.000760 -0.002802 
+0.003488 0.002191 -0.001180 0.002619 -0.000397 0.001825 
+-0.000032 -0.002213 0.003515 -0.000921 -0.001544 -0.003399 
+-0.001859 -0.000239 -0.001822 0.003971 -0.004410 -0.000229 
+0.002855 -0.004027 -0.001867 -0.000192 -0.005108 0.001233 
+0.000396 -0.001060 0.002390 -0.002127 -0.005902 -0.000138 
+0.002818 -0.003537 -0.001021 0.004181 0.002509 -0.003388 
+-0.000634 0.000596 -0.000196 0.004450 0.001599 -0.000062 
+0.002575 0.002070 -0.001688 0.001204 -0.000280 -0.002129 
+0.002034 -0.001102 -0.000085 0.001382 0.000431 0.000842 
+0.000497 0.002273 0.000327 -0.000314 0.000519 -0.000342 
+-0.000608 -0.000107 -0.000060 0.000724 -0.004930 -0.003119 
+0.000040 -0.004589 -0.002476 -0.000920 -0.001923 -0.001087 
+-0.001150 -0.000153 -0.000523 0.000245 -0.000624 -0.000001 
+0.000407 -0.002314 0.000969 -0.000890 -0.002457 0.001302 
+-0.001033 0.001013 0.002455 0.002427 -0.000394 0.003054 
+0.000576 -0.000731 -0.000632 0.000124 0.000261 -0.001345 
+-0.000177 -0.000103 -0.000660 0.000286 -0.000312 0.000783 
+-0.000748 -0.001257 0.003206 -0.003005 -0.002244 0.002245 
+-0.003662 -0.000009 -0.002028 -0.006721 0.002584 -0.002325 
+-0.006221 0.003578 0.000648 -0.005626 0.000582 0.003846 
+-0.005372 -0.004144 0.004911 -0.002112 -0.004405 0.005435 
+-0.000922 -0.002665 0.004236 -0.001957 -0.001987 0.004475 
+-0.000684 -0.002817 0.003516 -0.000913 -0.001531 0.001483 
+-0.004270 -0.001572 -0.002376 -0.009626 -0.002907 0.001262 
+-0.004469 -0.004519 0.005293 -0.001193 -0.001516 0.005085 
+0.000753 0.000528 0.000620 -0.001497 -0.000096 -0.000810 
+0.000533 -0.000438 0.000163 0.001501 -0.002888 0.000282 
+0.000107 -0.004213 -0.001547 0.000373 -0.000249 -0.000308 
+-0.002440 -0.003320 0.003920 -0.002328 -0.003208 0.004036 
+-0.003093 -0.002460 -0.000012 -0.004148 -0.002669 0.000757 
+-0.003362 -0.004138 0.005172 0.000543 -0.000814 0.002437 
+-0.002688 -0.000483 -0.003906 -0.003955 0.000244 0.000659 
+-0.002204 -0.000551 0.001791 -0.003671 -0.000847 0.004270 
+-0.003700 -0.001481 0.004588 -0.003250 -0.002770 0.002473 
+-0.003311 -0.004802 0.000836 -0.002941 -0.004766 -0.000439 
+-0.001668 -0.001654 0.000185 0.001275 0.002710 -0.002451 
+0.000062 0.001687 -0.001872 -0.001081 -0.002366 -0.001509 
+-0.004919 -0.005035 0.004873 -0.002008 -0.002216 0.002648 
+0.000027 0.000211 0.000177 0.000100 -0.000630 -0.000133 
+0.000442 -0.004290 0.001238 -0.001174 -0.003399 -0.001669 
+-0.000223 -0.000627 -0.000647 0.001191 -0.000764 0.000685 
+0.000064 0.000288 0.001678 -0.001268 -0.000863 0.002517 
+-0.001935 -0.000126 0.001474 -0.000372 -0.000427 0.001251 
+-0.000935 0.000076 0.000829 -0.000822 -0.000030 -0.000439 
+0.000946 -0.002375 -0.000132 -0.000997 -0.000492 -0.001648 
+0.001006 -0.000446 -0.001690 0.003175 0.000597 -0.001806 
+0.001982 -0.001273 -0.001171 -0.000053 -0.001152 -0.001938 
+-0.000930 -0.000226 0.000199 0.000523 -0.002904 0.001638 
+-0.000279 -0.004032 0.000186 -0.000415 -0.003353 -0.000527 
+0.002598 -0.002047 0.001496 0.001531 -0.001616 -0.000482 
+-0.000022 -0.001188 0.000727 0.000018 -0.001199 0.000105 
+0.000355 -0.000637 -0.001670 0.004407 -0.000138 0.000170 
+0.003741 -0.000907 0.001902 -0.001010 -0.001320 -0.001218 
+-0.003008 0.000380 0.001571 -0.002066 0.003222 -0.006910 
+0.000858 -0.000506 -0.015397 0.007368 -0.004051 -0.024940 
+0.004419 -0.001599 -0.021857 -0.005385 -0.002399 -0.012600 
+-0.014000 -0.002543 -0.011098 -0.021018 0.000434 -0.005476 
+-0.022365 0.002034 0.009138 -0.018421 -0.002345 0.017322 
+-0.006014 -0.002061 0.006113 0.007644 0.006146 -0.001808 
+0.006507 0.005180 -0.001351 0.001867 0.001160 0.001502 
+-0.002106 -0.001087 0.003090 -0.001763 -0.002054 -0.000255 
+-0.003957 -0.000994 -0.001311 -0.001950 0.000272 -0.001373 
+0.001345 -0.000219 0.000724 0.000886 -0.000088 -0.000755 
+-0.002493 0.000307 -0.000357 -0.003885 0.002769 -0.000360 
+-0.002229 0.001800 -0.000474 -0.001273 -0.003285 -0.000178 
+0.000184 -0.001866 -0.003657 -0.001389 -0.000993 -0.002785 
+-0.000937 0.001874 -0.000469 0.001294 0.001460 -0.000717 
+0.001489 0.002102 -0.000094 0.000619 -0.000627 0.000416 
+-0.000017 -0.002878 0.001805 -0.002829 -0.005938 -0.000280 
+-0.003179 0.000464 -0.000994 -0.002203 0.000000 -0.002966 
+-0.000087 -0.000746 -0.002524 0.000420 -0.000424 0.000362 
+-0.000133 -0.001102 0.001035 0.001391 -0.000037 0.000043 
+-0.000256 0.001368 -0.002906 0.003404 0.004391 -0.002743 
+0.002037 0.000222 -0.003308 0.000495 -0.002540 -0.002310 
+-0.003652 -0.007108 0.001938 -0.003028 -0.006313 0.004817 
+-0.001561 -0.005211 0.003600 0.000755 -0.003907 -0.000677 
+0.001626 -0.000520 -0.002048 0.001344 -0.000134 -0.001263 
+0.000126 -0.001051 0.000743 -0.000480 -0.001840 0.000000 
+-0.001349 -0.004877 0.004772 -0.000728 -0.001774 0.000502 
+0.004470 -0.000472 -0.004530 0.004325 0.000909 -0.006797 
+0.004582 0.000867 -0.003065 0.000669 0.000064 -0.000565 
+-0.001569 -0.002308 0.000785 -0.001231 -0.000676 0.004054 
+0.000071 0.000837 0.000332 -0.000377 -0.000684 0.000144 
+-0.002424 -0.001970 0.002197 -0.003928 -0.006253 0.001602 
+-0.005007 -0.003362 -0.000141 0.002320 -0.001059 -0.002648 
+0.005476 0.000000 -0.003492 0.001135 0.002996 0.000385 
+0.001131 -0.000005 0.000377 0.000004 -0.001563 -0.001304 
+-0.000648 -0.000796 -0.001999 -0.000321 0.000203 -0.000903 
+0.002604 0.001275 0.001791 0.002075 0.001596 0.004073 
+0.002122 0.001890 0.001996 0.002447 0.000798 0.000379 
+0.002599 0.002652 0.000176 0.000724 0.001627 -0.001932 
+-0.000233 0.000199 0.001059 -0.001225 0.000151 -0.002465 
+-0.004055 -0.003241 -0.010832 0.012537 -0.005255 -0.004794 
+0.004756 0.015342 -0.007275 -0.012861 0.006639 -0.014107 
+-0.023064 -0.001792 -0.010511 -0.017273 -0.000591 0.000262 
+-0.005632 -0.000404 0.005386 -0.008582 0.000213 0.001623 
+-0.006383 -0.008605 -0.009157 -0.013353 0.004376 -0.004094 
+-0.005036 -0.001919 -0.002231 -0.001544 -0.000257 0.003162 
+-0.004037 -0.002899 0.003078 -0.003535 -0.004125 0.000756 
+-0.004393 -0.001488 -0.000799 -0.001497 -0.001575 0.001636 
+-0.001057 -0.004357 0.001475 0.001035 -0.006369 -0.000548 
+0.002143 -0.004737 -0.000793 0.001868 -0.002873 -0.000323 
+0.000805 -0.004364 0.000431 0.000644 0.001225 0.002741 
+0.002092 -0.002820 -0.000682 0.000835 0.000185 -0.003943 
+-0.004711 0.000725 -0.003175 -0.006959 -0.002184 0.000279 
+-0.003211 -0.001594 0.001575 0.002026 0.000319 -0.000581 
+0.000879 -0.000135 -0.003040 0.000521 -0.001330 -0.000059 
+-0.000188 -0.002212 0.001503 -0.004512 0.000803 0.000248 
+0.000085 0.001183 -0.002255 0.002026 -0.001250 -0.003545 
+-0.000066 -0.004050 -0.000033 -0.001521 -0.002607 -0.001739 
+0.000769 0.001436 -0.000718 0.000900 0.002522 0.001657 
+-0.002096 0.000978 0.000885 -0.005979 -0.007395 0.001329 
+-0.002173 -0.003384 0.007248 -0.002350 0.000522 0.001382 
+-0.001638 -0.000771 0.002120 -0.000431 -0.003941 0.002192 
+-0.005702 -0.005207 0.003802 -0.002071 -0.005520 0.005523 
+-0.002203 -0.003364 -0.001362 0.000830 0.000146 -0.000405 
+0.001703 -0.001254 -0.000651 0.000004 -0.002873 0.001736 
+-0.000970 -0.002076 0.001399 0.001890 -0.000016 -0.000110 
+-0.001218 -0.002062 -0.001689 0.002331 -0.005190 -0.002144 
+-0.004440 -0.005016 -0.000877 -0.002426 -0.004512 0.002596 
+0.003774 0.000584 0.002995 0.005624 -0.001518 -0.001249 
+0.002384 -0.001121 -0.001489 -0.002609 -0.001671 -0.000982 
+-0.002987 -0.001797 0.001792 -0.001718 -0.000284 -0.001150 
+-0.000312 0.001560 -0.001496 -0.000152 0.001210 -0.000607 
+-0.000841 -0.000405 -0.000746 -0.000902 -0.001436 -0.003590 
+0.000266 -0.001722 -0.004900 0.000813 -0.004878 -0.001040 
+-0.002990 -0.004086 0.003787 0.002499 -0.002871 0.003562 
+-0.005745 -0.001237 0.003320 -0.001692 -0.001825 0.002236 
+-0.000213 0.003187 0.000422 -0.001316 0.003773 0.002993 
+-0.002234 0.002943 0.001504 -0.007304 0.002148 -0.010098 
+-0.009775 0.003072 -0.017819 -0.015641 0.003770 -0.000511 
+-0.006718 0.005023 0.019815 0.000363 0.006436 0.028195 
+0.004816 0.008730 0.028407 0.007440 0.010080 0.025400 
+0.003718 0.009146 0.021805 -0.013288 -0.001408 0.016601 
+-0.030837 -0.015013 0.005964 -0.029342 -0.019180 0.002861 
+-0.025046 -0.003287 0.004352 -0.009237 -0.012200 0.015224 
+-0.010680 -0.016642 0.007312 -0.007140 -0.009886 0.000273 
+-0.000590 0.000519 -0.002968 0.004947 0.003249 -0.005636 
+0.004168 0.003283 -0.001984 0.001447 -0.001661 0.000367 
+0.000608 -0.005835 0.000472 -0.001341 -0.007328 -0.000635 
+-0.002175 -0.000509 -0.002777 -0.002492 0.001033 -0.003213 
+-0.002163 0.000778 -0.003873 -0.001538 0.000847 -0.001322 
+-0.000657 -0.001303 -0.000283 0.000696 -0.001391 0.002681 
+0.000000 -0.002985 0.000000 -0.000283 -0.000401 -0.001291 
+-0.000183 0.000367 -0.003167 0.000216 0.000474 0.000345 
+-0.002241 -0.001064 0.003305 -0.003508 -0.002058 0.005022 
+-0.003609 -0.002715 0.001815 -0.001744 -0.001111 -0.002217 
+-0.001111 -0.001111 -0.003675 -0.005040 0.001008 -0.004483 
+-0.003511 -0.001041 -0.003317 -0.002589 0.000090 0.002453 
+-0.010086 0.000000 0.002328 -0.011524 -0.003618 0.004288 
+-0.007451 -0.002078 0.004421 -0.002105 0.000884 0.002053 
+0.004592 -0.001009 0.006156 -0.000731 -0.001981 0.001270 
+0.002281 0.001801 0.000795 0.000617 0.001621 0.001274 
+0.003587 0.003902 -0.005223 0.004296 0.004268 -0.005723 
+0.000348 0.000182 0.001353 -0.000063 -0.000032 0.000079 
+0.002677 0.000096 -0.001976 0.002083 0.002552 -0.001510 
+0.003689 0.000527 -0.005007 0.004937 -0.001356 -0.002206 
+0.001728 -0.002173 -0.001262 -0.000569 0.001122 -0.000006 
+-0.000786 -0.000867 -0.002465 0.000617 -0.002262 -0.000647 
+-0.000877 -0.003229 0.003814 0.000734 -0.001712 -0.000491 
+0.000024 0.000167 -0.003730 0.000622 -0.000837 -0.004401 
+0.002562 0.000126 -0.002878 0.001687 -0.001918 0.000629 
+0.001419 -0.001315 0.000365 -0.000204 -0.000738 0.001757 
+-0.001417 -0.001957 0.002300 -0.000399 -0.002318 0.001104 
+-0.001752 0.001026 -0.000202 -0.005205 0.001360 0.002157 
+-0.003606 0.000803 0.000967 0.000703 -0.000949 -0.000073 
+-0.000218 -0.001102 -0.001192 0.000349 -0.002631 -0.001525 
+0.005989 -0.008246 0.000604 0.014025 -0.008807 -0.002425 
+0.002786 -0.008051 -0.006269 -0.014636 0.010770 0.005869 
+-0.008950 0.013936 0.024727 -0.138889 0.805556 4.838889 
+0.709091 0.809091 5.790909 1.515152 0.954545 5.212121 
+0.017785 0.018818 0.029646 0.019123 0.009256 0.004920 
+0.009183 -0.000635 -0.007503 0.001232 -0.003008 -0.004384 
+-0.004902 -0.000683 0.003081 -0.009157 0.006612 -0.005980 
+-0.002238 -0.012655 0.001219 -0.003500 -0.008075 -0.000574 
+-0.002239 -0.000919 0.002051 0.001567 -0.000698 0.002127 
+0.002016 0.002852 -0.001561 0.002742 0.003722 -0.001641 
+0.001496 0.002178 -0.000273 -0.001202 -0.001688 -0.001533 
+0.000722 -0.002830 -0.004326 0.001619 -0.000827 -0.002925 
+-0.000438 -0.000405 0.000473 0.001850 -0.004008 0.001985 
+0.003783 -0.000822 0.002765 0.000229 0.001025 0.001618 
+-0.002135 0.000941 0.000114 -0.002250 -0.001143 -0.000623 
+-0.002210 -0.000777 0.000634 -0.001427 0.000150 0.000601 
+-0.004262 -0.002101 0.001661 -0.006666 -0.000129 0.001217 
+-0.002496 -0.000507 0.001490 -0.000457 -0.000846 -0.004069 
+0.007633 0.000058 -0.007167 0.008999 0.003489 -0.007345 
+0.002937 0.005560 -0.004305 0.000272 0.000012 -0.002472 
+-0.000861 0.000130 0.001461 -0.004768 -0.000443 0.003492 
+-0.002318 -0.002318 0.003636 0.000442 0.000309 0.004123 
+0.001586 -0.000216 0.005263 0.000546 -0.002941 0.005252 
+0.001912 -0.001673 0.002828 0.000966 -0.001407 0.000420 
+0.002278 -0.000456 -0.002846 -0.000748 0.001350 -0.002020 
+0.000198 -0.002072 -0.005880 0.003893 0.005445 -0.002334 
+0.003728 0.006865 -0.006806 0.000445 0.005789 -0.004656 
+-0.000961 0.002822 -0.001875 -0.001351 0.000349 0.000770 
+-0.000802 -0.000985 0.001337 0.000348 -0.001741 0.000945 
+-0.001667 -0.004071 0.001202 -0.001885 -0.003875 0.004807 
+-0.001718 -0.004284 0.003716 -0.000290 -0.002282 -0.000573 
+0.000283 -0.000953 -0.000358 0.000880 0.000081 -0.000733 
+0.002826 0.001639 0.000807 -0.000521 0.003200 -0.004165 
+0.005263 0.003800 -0.007076 0.004876 0.002774 -0.002582 
+0.000941 0.000160 0.000256 0.000308 0.000575 0.000822 
+-0.000149 0.000378 0.000118 -0.002860 0.001682 0.000504 
+-0.000430 0.001295 0.001791 0.002458 -0.001193 -0.000887 
+-0.000664 -0.001011 -0.006230 0.001670 -0.001216 -0.002732 
+-0.022354 -0.012457 0.011245 -0.000940 -0.015418 -0.000512 
+-0.005017 -0.001580 -0.005111 -0.011890 0.008480 0.000812 
+-1.297398 0.724907 3.118959 -0.473684 0.831025 6.229917 
+0.537129 0.933168 7.237624 1.451351 0.983784 6.021622 
+1.993220 0.864407 3.369492 0.017269 0.010817 0.003840 
+0.012035 0.004707 -0.007324 0.002964 0.004042 -0.000703 
+-0.000788 0.014231 0.004961 -0.003412 0.008614 0.006887 
+0.005197 0.016695 -0.021151 0.001518 -0.000570 -0.001067 
+-0.004874 -0.001247 0.001018 0.000452 0.002262 0.002312 
+0.001265 0.000113 0.001477 0.004379 0.000975 -0.005170 
+0.001851 0.005920 -0.005900 -0.000817 0.001863 -0.004614 
+0.000774 0.000739 -0.006089 0.005906 0.002867 -0.005189 
+-0.000061 0.000153 -0.003926 -0.000007 -0.002227 0.001057 
+0.002386 -0.003953 0.002590 -0.003873 0.000845 0.001080 
+-0.002364 0.001211 0.001925 -0.001575 0.002809 0.000445 
+-0.003404 0.000890 -0.001058 -0.001014 -0.002389 0.000231 
+-0.001014 -0.002522 0.002303 -0.001722 -0.000144 -0.000622 
+0.000037 0.000259 -0.000168 -0.000316 -0.000328 -0.002784 
+-0.002406 -0.000602 -0.002256 0.000334 -0.000340 -0.002472 
+-0.001025 -0.001687 -0.000465 -0.000988 -0.003605 0.001012 
+-0.000350 -0.002389 0.000430 0.002030 -0.000484 0.001401 
+0.001903 -0.002538 -0.000172 0.003663 -0.001316 0.000563 
+0.000083 -0.000021 0.005439 -0.001081 -0.004445 0.001553 
+-0.000089 0.002233 -0.000151 -0.000307 0.004072 0.000077 
+0.000336 0.000650 -0.000609 0.000805 -0.003843 -0.004101 
+-0.003174 0.005198 -0.006577 -0.001377 0.005536 -0.008431 
+0.002047 0.005092 -0.006330 -0.002007 0.001321 -0.001518 
+-0.000863 0.001564 0.000778 0.000464 0.003075 0.004676 
+0.000325 0.005348 0.005378 -0.003044 0.002652 0.003310 
+-0.001294 -0.000316 0.000561 -0.001890 -0.000472 -0.001890 
+-0.001536 -0.002310 -0.001345 -0.001123 -0.003570 -0.000346 
+-0.000655 0.000013 0.001032 -0.005527 0.000036 -0.000460 
+-0.004011 0.001154 0.001212 -0.002378 0.000262 -0.001176 
+0.001073 -0.004226 -0.003709 0.001763 -0.006573 -0.005298 
+0.003997 -0.006273 -0.003048 0.003659 -0.003488 0.000677 
+0.001386 -0.000102 0.001187 -0.000373 0.002282 0.001867 
+0.001385 -0.000545 0.000455 0.010788 -0.002832 -0.006282 
+0.017233 -0.007001 -0.000036 0.013198 -0.002513 -0.003808 
+-0.107144 0.005100 0.008013 -0.046663 0.018333 -0.029460 
+-0.014737 0.004844 -0.019688 -0.003469 0.001405 -0.008022 
+-1.368071 0.299335 2.467849 -0.695568 0.537572 5.196532 
+0.284133 0.669742 5.605166 1.105263 0.511278 4.144737 
+1.462626 0.319192 2.066667 1.511688 0.366234 0.353247 
+0.003146 0.003359 -0.012106 0.006828 0.004393 -0.009803 
+-0.004414 0.012904 0.000372 -0.014427 0.007281 0.002834 
+-0.011459 0.002126 -0.002588 -0.008341 -0.006278 -0.000716 
+-0.005618 -0.000946 -0.000379 0.001185 0.000660 0.000730 
+0.002203 0.000261 0.000391 0.001707 0.002348 -0.000478 
+0.000412 0.002235 0.000875 -0.000211 0.002015 0.002579 
+-0.003445 0.002887 0.001584 0.001966 0.001286 0.001378 
+0.001684 0.000687 0.000274 0.000019 -0.000579 0.001264 
+0.000424 -0.002033 0.004025 -0.000249 -0.002244 0.003451 
+-0.000187 -0.000429 0.000642 -0.000972 -0.001356 0.000196 
+-0.002424 -0.000257 0.000093 -0.002118 -0.000019 -0.000294 
+-0.002157 -0.004673 0.000419 -0.003607 -0.001227 0.000110 
+-0.003915 -0.001256 -0.000293 -0.001081 -0.004896 0.001876 
+-0.001704 -0.006175 0.002347 -0.003280 -0.002307 -0.001820 
+0.001597 -0.003894 -0.000052 -0.000456 -0.001251 0.000946 
+-0.003648 0.000397 0.002117 -0.005701 0.001549 0.001684 
+-0.006814 -0.000088 -0.000088 -0.006284 0.002422 0.003935 
+-0.008179 0.002049 0.007609 -0.007626 -0.004576 0.008584 
+0.000773 -0.002881 -0.000517 -0.001101 -0.002935 -0.003706 
+0.001654 -0.005687 -0.002050 0.003287 -0.004350 -0.004374 
+-0.004409 0.000554 -0.002581 -0.004150 -0.002763 -0.002765 
+0.001797 -0.001101 -0.005481 0.001983 -0.002314 -0.003810 
+0.001991 -0.002259 -0.000537 0.003609 -0.000608 -0.000371 
+0.003727 -0.000989 -0.001133 0.002726 -0.002306 -0.001114 
+0.001120 -0.000582 -0.000748 0.000323 0.000881 -0.001101 
+-0.000724 0.002073 0.001369 -0.001861 -0.001112 -0.003529 
+-0.002516 0.000839 -0.007548 -0.002221 0.004441 -0.004779 
+0.001210 0.003914 0.001494 0.000642 0.003955 0.002081 
+0.000000 0.000000 0.003252 0.002138 -0.000121 0.004519 
+0.000716 -0.002259 0.000771 -0.004102 -0.001724 -0.002288 
+-0.001960 -0.002482 -0.004050 0.002672 -0.007717 0.000951 
+0.019850 -0.008574 -0.007702 0.026865 -0.006851 0.003788 
+0.007243 -0.006504 0.001183 -0.005741 -0.004403 0.000516 
+-0.003046 0.003019 0.002881 -0.001939 -0.006784 -0.003783 
+0.000948 -0.004259 -0.021433 -0.004105 -0.008321 -0.011710 
+-0.008274 0.000106 0.008942 -0.559659 -0.082386 2.204545 
+-0.292350 -0.150273 1.964481 0.003855 0.001853 0.003792 
+0.006826 -0.008118 -0.007966 0.005517 -0.011486 -0.015784 
+-0.002622 -0.003982 -0.013781 -0.013269 0.011761 0.000980 
+-0.015740 -0.001224 0.011542 -0.008877 -0.010170 0.003635 
+0.001024 -0.002941 -0.000013 0.009025 0.008564 0.002640 
+0.008011 0.011391 0.006388 -0.000607 0.002777 0.002061 
+-0.019482 -0.006578 0.011911 -0.003814 -0.012497 0.017148 
+0.000219 0.000173 0.009311 0.001086 0.005684 -0.000581 
+0.000075 0.003127 -0.004445 0.000206 0.001470 -0.005643 
+-0.003915 0.002800 -0.006499 -0.004434 0.005129 -0.006000 
+0.000697 0.004849 -0.003541 0.002430 -0.000318 -0.000151 
+0.002755 -0.001019 -0.000358 0.003716 0.002145 0.000435 
+0.004234 0.007586 0.001598 0.004957 0.002472 -0.008241 
+-0.003642 0.001890 -0.000606 -0.005950 0.001293 -0.002652 
+-0.006800 -0.000840 -0.001699 -0.004350 -0.000873 -0.001687 
+-0.002538 -0.002308 0.000923 0.002521 -0.002765 0.001013 
+0.003848 -0.004340 0.001700 0.002410 -0.002081 0.002339 
+-0.001165 0.000560 -0.000622 -0.000294 -0.000786 -0.000411 
+0.000294 -0.000476 0.000513 0.004048 -0.004824 0.002519 
+-0.001477 -0.002065 -0.000753 -0.000196 -0.002725 -0.001391 
+-0.000337 0.000488 -0.002971 -0.000268 -0.000222 -0.003067 
+0.001965 0.004211 -0.003000 0.003184 0.005094 -0.001301 
+-0.005104 0.000881 -0.000845 -0.005361 0.002999 0.001088 
+-0.002375 0.003680 0.005064 0.001902 0.001362 0.002137 
+-0.001290 -0.005363 0.000358 0.000136 -0.005487 0.001032 
+0.004078 -0.003095 0.000429 0.005227 -0.003074 0.002119 
+0.003742 -0.001424 -0.000773 -0.001066 0.001967 -0.000164 
+-0.003556 0.005238 0.001940 -0.004511 0.003282 0.001504 
+-0.001620 0.001168 -0.004489 0.001609 0.003091 -0.004479 
+0.002031 0.003446 -0.004212 0.001801 0.002882 -0.002377 
+0.000000 0.000916 0.000305 -0.000166 -0.001600 -0.000374 
+-0.000597 -0.003218 -0.002559 -0.000901 -0.004264 -0.006460 
+0.002840 -0.001238 -0.007906 -0.003496 -0.003086 -0.000364 
+-0.005007 0.000854 0.000408 0.000839 -0.000683 -0.000784 
+0.001913 0.000114 -0.003642 -0.001351 -0.013265 0.008550 
+0.002270 -0.008229 0.008496 -0.001319 0.000081 -0.000763 
+-0.003205 -0.001444 0.000135 -0.011918 0.012541 -0.033202 
+-0.008202 -0.005878 -0.022093 -0.005345 -0.003070 -0.005326 
+-0.002829 -0.001262 -0.003508 0.001121 -0.005782 -0.014693 
+0.007471 -0.012231 -0.040189 0.009776 -0.007205 -0.042110 
+0.004526 -0.008082 -0.014521 -0.001902 -0.003206 0.003861 
+-0.002845 0.000288 0.004950 -0.005958 -0.000342 0.001659 
+-0.004167 -0.001879 0.001712 -0.000271 -0.002703 0.004423 
+-0.002881 -0.009382 0.007124 -0.008973 -0.009452 0.007698 
+-0.011084 -0.007515 0.015413 -0.003896 0.000825 0.005696 
+0.000188 0.003181 -0.000606 -0.000341 -0.001576 0.000014 
+-0.006619 -0.005709 0.001241 -0.005465 -0.000673 -0.004704 
+-0.001751 -0.000817 -0.003151 -0.000420 0.000778 0.000661 
+-0.003206 0.002824 -0.002137 -0.000820 0.002683 -0.004927 
+-0.002467 0.002067 -0.003769 -0.001066 0.000300 -0.000476 
+0.001158 -0.003092 -0.003298 0.001242 -0.001004 -0.000588 
+0.001793 0.000548 -0.000448 0.002093 -0.000095 -0.001734 
+-0.001377 -0.001536 -0.001661 -0.000072 -0.001587 0.000252 
+-0.004151 -0.001483 -0.000479 -0.002350 -0.002847 0.000071 
+-0.000890 0.000273 -0.000125 -0.000230 -0.000308 -0.001514 
+-0.000355 -0.000190 -0.000373 -0.000424 0.001492 0.000666 
+-0.000251 -0.001077 -0.000381 -0.011163 0.000814 0.004070 
+-0.003919 -0.002095 -0.004441 0.001669 -0.007376 -0.001846 
+0.002270 -0.003319 0.002361 0.003880 0.001078 0.001294 
+-0.000801 0.002192 0.002359 0.001927 0.006152 0.003735 
+-0.015092 -0.002325 -0.000475 -0.001712 0.001588 0.001769 
+0.006190 -0.009444 0.006032 0.002596 -0.006776 0.009372 
+0.007025 -0.002690 0.001009 0.005246 -0.000295 -0.000148 
+0.002890 -0.001125 -0.000698 0.001534 -0.004560 -0.001129 
+0.000512 -0.001128 -0.001573 -0.001496 0.000998 -0.001250 
+-0.005846 -0.001647 -0.000274 -0.004834 0.001062 -0.003135 
+-0.002419 0.001206 0.001235 0.001901 0.001301 -0.000901 
+0.007258 0.007977 0.000798 0.005082 0.010081 -0.000391 
+-0.002902 0.005528 -0.005729 -0.004895 0.001919 -0.003598 
+-0.000378 -0.000895 -0.002670 0.002859 -0.003436 -0.002869 
+0.003665 -0.002762 -0.005862 -0.000499 -0.000884 -0.004028 
+0.000029 -0.000162 -0.001740 0.002819 -0.000812 -0.000687 
+0.002412 0.000167 0.000077 -0.003432 -0.001175 -0.000071 
+-0.009479 -0.004214 0.001578 -0.008080 -0.004241 0.002258 
+-0.001209 -0.000890 -0.002423 0.002236 -0.003171 -0.004820 
+0.008870 0.005596 -0.001525 0.006275 0.011963 -0.023590 
+0.001720 0.009482 -0.038710 -0.010423 0.008997 -0.046658 
+-0.025357 -0.003643 -0.025143 -0.007439 0.003990 -0.008191 
+-0.005569 0.005541 0.004123 -0.002081 0.002258 0.001471 
+-0.000138 -0.002400 -0.003615 0.004234 -0.003585 -0.005113 
+0.007886 -0.000298 -0.003861 0.008157 0.002103 -0.001320 
+0.002697 -0.000316 -0.001457 -0.001694 -0.000413 -0.007581 
+0.002255 0.002450 -0.010872 0.003999 0.001232 -0.006133 
+0.000185 -0.000834 0.002459 -0.001407 -0.002559 0.005599 
+-0.004241 -0.003637 0.000805 -0.000147 -0.002323 -0.001989 
+0.002015 0.001404 -0.000140 0.000778 -0.000167 0.000622 
+-0.003050 -0.001320 0.004868 -0.000688 -0.002538 -0.000036 
+0.000334 -0.001580 0.001141 0.001746 -0.001508 0.001746 
+0.003354 0.001863 -0.001861 0.001101 0.000639 -0.003175 
+0.001135 -0.000652 -0.002391 -0.002805 -0.000165 -0.002214 
+-0.002074 -0.001781 -0.001444 0.001562 0.000867 -0.002374 
+0.000511 -0.000964 -0.001672 0.004155 0.004345 -0.000920 
+-0.001474 0.000942 0.000962 -0.000647 -0.004188 0.004358 
+-0.002621 -0.007689 0.004855 -0.003102 -0.004100 -0.000212 
+-0.002729 0.000391 -0.000456 -0.003523 0.000737 0.000003 
+-0.002143 -0.001141 -0.000893 -0.000045 -0.004932 -0.002186 
+-0.002944 -0.006451 -0.001208 -0.007502 -0.003216 0.000940 
+-0.004267 0.001474 0.000750 0.001156 0.000309 0.002108 
+-0.000914 0.000197 -0.000348 0.006287 0.000680 -0.004210 
+0.009998 0.003541 -0.010642 0.008310 0.006317 -0.007605 
+-0.001474 0.002134 -0.004360 -0.000160 -0.001901 -0.000426 
+-0.001008 -0.001555 0.003571 -0.000192 0.000462 -0.000188 
+-0.001108 0.002681 -0.003969 -0.000033 -0.001887 -0.003828 
+0.001273 -0.003440 -0.002308 0.003689 -0.004505 0.000932 
+0.009830 -0.000020 -0.005866 0.000915 -0.003371 -0.007368 
+0.002408 0.005176 -0.010473 -0.004125 0.000030 -0.006387 
+-0.002069 -0.000723 -0.003586 0.000868 -0.002549 -0.001114 
+-0.000657 -0.002137 -0.000958 -0.000499 0.003394 -0.001662 
+-0.000261 0.004492 -0.009871 0.000316 0.002494 -0.012073 
+-0.002382 0.002415 -0.006721 -0.001908 0.004962 -0.002290 
+-0.004241 0.001149 -0.003004 0.000318 0.001356 -0.000596 
+0.001273 0.002588 -0.002822 0.002740 0.001893 -0.001511 
+0.001214 0.000572 0.000207 0.003130 0.000041 -0.000541 
+0.009031 0.001161 -0.002753 0.011134 0.003839 -0.007284 
+0.006249 -0.000237 -0.006745 -0.002962 -0.004422 -0.004949 
+-0.004893 0.000019 -0.002016 -0.004882 0.004571 0.002241 
+-0.004891 0.004936 0.004097 -0.002983 0.002382 0.002718 
+-0.000227 -0.000791 -0.001716 0.000727 -0.002462 -0.004307 
+0.000134 -0.001219 -0.003687 -0.000741 -0.000576 -0.000483 
+-0.001785 -0.000173 0.001652 -0.001232 -0.000448 -0.000717 
+-0.001481 -0.000110 -0.003337 -0.001760 0.002180 -0.008108 
+0.003933 0.004325 -0.010866 0.008064 0.008451 -0.007266 
+0.006694 0.003719 -0.000579 -0.000437 -0.004333 -0.000513 
+0.002562 -0.007687 0.001797 0.000051 -0.000832 -0.002142 
+-0.005899 -0.001799 -0.002574 0.002126 -0.005851 -0.000890 
+0.000663 -0.002812 -0.000866 -0.001016 -0.000192 -0.002838 
+0.002439 0.002544 -0.005053 -0.001864 -0.000735 -0.004010 
+-0.001056 -0.002150 -0.001644 0.000182 -0.000275 -0.000439 
+0.001414 0.003329 -0.001764 0.002000 0.004251 -0.004812 
+0.000608 0.003699 -0.003463 -0.004754 0.000192 -0.001533 
+-0.000415 -0.002938 -0.000378 0.003805 -0.002438 -0.001686 
+0.002968 0.001113 -0.002968 -0.002656 0.000650 -0.001722 
+-0.004650 0.000490 -0.001824 -0.001816 -0.000714 -0.001147 
+0.000626 -0.003708 -0.000076 0.001138 -0.003184 -0.002054 
+-0.002061 -0.003192 -0.001564 -0.000406 -0.000012 -0.000854 
+0.001533 -0.000611 -0.000107 0.003898 0.002102 0.001051 
+0.005204 0.000681 -0.005982 -0.001005 0.001435 -0.006748 
+-0.002985 0.003886 -0.004280 -0.002504 0.001414 -0.004021 
+0.001319 -0.001675 -0.001948 0.003033 -0.003033 0.001803 
+-0.000051 -0.001189 -0.000531 -0.005025 0.000393 -0.001492 
+-0.006506 0.001726 -0.001129 -0.003006 -0.000878 -0.002607 
+0.001925 -0.001173 -0.003697 0.003026 0.003479 -0.004997 
+-0.001753 0.003977 -0.000427 -0.000205 0.006128 -0.006949 
+-0.003319 0.001086 -0.005146 -0.001623 -0.003099 -0.003679 
+0.002526 -0.003555 -0.001968 0.004027 -0.001599 -0.000858 
+-0.000129 -0.000117 0.000143 0.001389 0.000102 -0.001927 
+0.003395 -0.001395 -0.007409 0.001109 -0.002319 -0.008973 
+0.003006 0.005988 -0.010496 -0.002657 0.000075 -0.000228 
+-0.002901 -0.001163 -0.001654 -0.000086 -0.001557 -0.002206 
+0.001465 -0.000834 -0.003561 0.000695 -0.002126 -0.002076 
+0.002088 -0.001460 -0.000929 0.003095 -0.000945 -0.000815 
+0.003050 -0.000568 -0.001933 0.000541 -0.002055 -0.002188 
+-0.005711 -0.002181 -0.000628 -0.007150 0.002532 0.003159 
+-0.005469 0.005186 0.004683 -0.004522 0.004336 0.002586 
+-0.001461 0.001170 0.000286 0.002812 -0.002577 -0.001145 
+0.005522 -0.004313 -0.002696 0.001970 -0.003793 0.000223 
+-0.004599 -0.000655 -0.001399 -0.001645 -0.004292 0.001187 
+0.001398 -0.000180 -0.002045 0.004376 0.000123 -0.003083 
+-0.000503 0.000041 -0.005622 0.002909 0.002185 -0.003999 
+0.004877 0.005948 -0.002333 0.010442 0.005645 -0.004801 
+0.009227 0.002194 -0.005202 0.001385 -0.000816 -0.004132 
+0.000331 -0.003146 -0.004944 -0.000608 -0.005932 -0.003559 
+0.000912 -0.002908 -0.002026 -0.000184 0.000090 0.000983 
+-0.002371 0.002792 0.002526 -0.006475 -0.006475 0.003443 
+-0.007785 -0.000675 0.000428 0.001052 -0.000580 0.001364 
+-0.000834 -0.003702 0.000967 0.000508 -0.002291 -0.001883 
+0.000762 -0.002731 -0.001851 -0.000723 -0.000834 -0.002336 
+-0.000567 0.001577 -0.002161 0.000180 0.001106 -0.004575 
+0.000640 0.001128 -0.005372 -0.003510 0.002165 -0.000033 
+-0.000882 0.000772 -0.003479 -0.001051 0.004340 -0.001111 
+-0.001742 0.004743 0.000958 0.000997 0.005783 -0.009470 
+-0.000647 -0.002654 -0.005022 -0.002101 -0.006220 -0.003224 
+-0.002446 -0.007538 0.002568 -0.000235 -0.004790 0.004060 
+-0.005656 -0.000959 0.001390 -0.003610 -0.002210 0.002547 
+-0.001782 -0.000505 -0.000867 -0.000668 0.002667 0.000917 
+0.000936 0.002427 -0.001701 0.002597 -0.002879 0.001450 
+0.001017 -0.002254 0.004508 -0.000963 -0.004447 0.001313 
+-0.001033 -0.000616 -0.000159 0.000565 0.000754 -0.001257 
+0.000916 -0.001560 0.000251 0.000405 -0.004353 -0.000770 
+0.004016 -0.002968 0.000175 -0.000186 0.001212 -0.000817 
+0.000622 0.001332 -0.001381 0.002231 -0.000016 -0.000073 
+0.001921 -0.005970 0.001623 -0.000328 -0.009789 0.001559 
+-0.006569 -0.010305 -0.002457 -0.009527 -0.007665 0.004287 
+0.003071 -0.005211 0.001352 0.007021 -0.004588 -0.005737 
+0.003428 -0.002511 -0.006296 0.000043 -0.000277 -0.000107 
+-0.004069 0.000983 -0.000519 -0.001846 0.000693 -0.000128 
+-0.000238 -0.000368 -0.000276 -0.002484 -0.000621 -0.001984 
+0.000401 -0.000838 -0.000365 -0.003356 0.000839 -0.002248 
+-0.000182 0.000208 -0.000026 -0.000220 0.001311 -0.001820 
+0.000969 0.002192 -0.002113 0.001965 -0.001767 -0.000567 
+0.002257 -0.004354 -0.001756 0.002177 -0.003480 -0.001211 
+0.001453 -0.001986 -0.000584 0.000183 -0.001704 -0.000799 
+-0.000989 -0.001984 -0.001621 -0.002224 -0.000261 -0.002530 
+-0.000470 0.000293 -0.002687 0.000384 -0.000494 -0.000465 
+-0.004691 0.001350 -0.000286 -0.004369 -0.001311 -0.000635 
+-0.000194 0.004502 -0.000466 0.002528 0.000931 -0.001555 
+-0.001037 -0.002935 -0.001433 -0.004195 -0.003430 0.002187 
+-0.000880 0.001731 0.001903 0.001193 0.004977 -0.002247 
+0.005003 -0.001355 -0.002194 0.004939 -0.001196 -0.004956 
+0.004658 -0.008209 -0.001704 0.004019 -0.003122 0.000526 
+0.001337 0.000016 -0.001660 0.001577 0.001111 -0.000774 
+-0.000489 -0.000879 -0.000414 -0.003076 -0.002267 -0.000984 
+-0.000948 0.000371 -0.001030 -0.001937 -0.000586 0.002112 
+-0.002321 -0.000463 0.000671 -0.001880 0.000937 0.000758 
+-0.000552 0.001855 0.002339 0.000902 0.000678 0.002220 
+0.004945 -0.000374 -0.002644 -0.000850 -0.002719 -0.004590 
+-0.004466 0.003015 -0.006336 -0.002220 0.001049 -0.004542 
+0.001294 -0.004918 0.000234 0.001498 0.000866 -0.000599 
+0.005946 0.000505 -0.000246 -0.000981 0.001115 0.001396 
+-0.003876 0.004675 0.000912 -0.000551 -0.000630 0.000866 
+-0.001224 0.001391 -0.000677 -0.001640 -0.002316 -0.002891 
+-0.005221 -0.004602 -0.001504 -0.005362 -0.001895 0.002311 
+0.000804 0.005554 0.000096 -0.000403 -0.000470 -0.002114 
+-0.000613 -0.000131 -0.001925 -0.001854 -0.002548 0.000004 
+-0.000894 -0.000587 0.000419 0.001538 0.000197 0.000296 
+-0.000455 -0.001147 -0.002160 -0.000644 -0.001318 -0.003939 
+0.001818 -0.002567 -0.000642 0.004032 -0.002500 0.000474 
+0.003626 0.000033 0.001119 0.000972 0.002419 -0.005787 
+0.003298 0.001820 -0.001674 -0.000975 -0.000266 -0.003839 
+-0.000509 -0.001930 -0.001490 -0.001148 -0.005444 0.000113 
+-0.002575 -0.007699 0.004006 -0.000436 -0.004648 0.004287 
+0.000419 -0.000958 0.000632 0.000643 0.002306 -0.002779 
+-0.000561 0.000925 -0.005160 -0.000538 -0.000296 -0.000511 
+0.001782 0.001949 -0.000939 0.000153 -0.000128 0.000117 
+-0.002194 -0.004387 0.000403 -0.002851 -0.006694 0.002851 
+-0.003738 -0.006230 0.001869 -0.001224 -0.004189 -0.001475 
+0.002315 -0.002782 0.001254 0.003277 -0.000923 0.007775 
+-0.002184 -0.013657 0.007716 0.001067 -0.006957 0.000203 
+0.003926 -0.000342 -0.000221 0.002971 0.002226 -0.000247 
+-0.000665 -0.001724 0.000258 -0.001312 -0.004824 0.002574 
+-0.003339 -0.000885 0.001348 -0.001203 -0.000624 -0.002229 
+0.001404 -0.001177 -0.003773 0.002453 -0.000587 -0.001867 
+-0.000452 -0.000133 -0.000417 -0.002502 0.004666 -0.001657 
+-0.000424 0.006471 -0.003032 0.004371 0.000519 -0.003033 
+0.005508 0.003611 -0.003037 0.001244 0.003749 -0.001424 
+-0.000346 0.002341 0.002311 0.000921 0.002032 0.000259 
+0.004666 -0.000954 -0.000970 0.002021 -0.003621 0.000084 
+-0.000201 -0.004149 -0.006176 0.002045 -0.001860 -0.008870 
+0.002206 -0.001308 -0.007551 0.000787 0.000439 -0.006219 
+0.001610 -0.000006 -0.001893 -0.000208 0.000704 0.001498 
+-0.000117 -0.002109 0.004102 0.001241 -0.003539 0.001215 
+0.000773 -0.002135 0.000053 -0.002137 0.000461 -0.000083 
+-0.004723 -0.001909 0.000804 -0.001765 -0.003604 0.000662 
+-0.001486 0.000473 -0.002095 -0.003921 -0.001692 0.000230 
+-0.006107 -0.004159 0.002023 -0.006190 -0.001151 0.003452 
+-0.004295 -0.004996 0.001052 -0.000937 -0.000937 -0.001022 
+-0.000329 0.000030 -0.000069 0.002380 -0.000869 -0.001954 
+0.002593 0.000707 0.000567 0.002407 -0.005904 0.003312 
+0.001464 -0.002961 0.000137 0.000351 0.000472 0.004223 
+0.000016 -0.000097 -0.000513 -0.003130 -0.003328 -0.001331 
+0.000708 0.003022 0.002499 0.002124 0.002088 0.003534 
+-0.001387 -0.000946 0.002942 -0.000578 -0.001845 -0.000248 
+0.001310 -0.002817 -0.003571 0.002789 -0.003353 -0.006266 
+0.006843 0.000978 -0.010000 0.004955 0.006306 -0.011240 
+0.002774 0.002959 -0.009254 -0.001049 0.000328 -0.003124 
+0.001665 -0.000820 0.002434 0.001248 -0.000238 0.000548 
+0.000090 0.000144 -0.004475 -0.000632 0.004526 -0.005376 
+0.000757 0.002397 0.000280 0.004650 0.001379 -0.000374 
+0.005055 0.001952 -0.002452 0.001545 0.001945 -0.002673 
+-0.000012 0.001331 0.000460 0.000036 -0.000233 0.000375 
+0.005866 0.000980 -0.000651 0.005762 0.001677 -0.007876 
+0.005536 0.001654 -0.007437 -0.000027 0.002282 -0.001539 
+0.001185 -0.000388 -0.004147 0.003810 0.002063 -0.001905 
+0.002075 -0.000337 0.000467 0.000276 0.000276 -0.001339 
+-0.003072 -0.003404 0.003324 -0.002893 -0.000868 0.005067 
+0.002167 0.000970 0.000924 0.003983 -0.000708 -0.000200 
+0.004211 -0.002237 -0.001153 0.004588 -0.003441 -0.001147 
+0.003887 -0.001927 0.001050 0.002931 0.002615 0.000527 
+0.002125 0.000626 0.001169 0.000106 0.000320 0.000818 
+-0.000265 -0.000259 -0.000214 -0.000595 -0.000838 -0.000668 
+-0.002850 0.001698 -0.000788 -0.002240 0.002413 0.000674 
+0.000468 0.002365 -0.001027 0.002067 0.000064 -0.002905 
+0.002056 0.001752 -0.004407 0.002510 0.001224 -0.002877 
+-0.001063 -0.004014 0.000143 -0.002925 -0.008002 -0.001347 
+0.000377 -0.008062 -0.002857 0.001798 -0.005233 -0.000901 
+-0.000104 -0.000724 -0.000101 -0.000118 0.000717 -0.000321 
+-0.000413 0.000217 0.002903 -0.000400 0.000940 0.001871 
+0.001926 0.002189 0.001137 0.000192 0.001401 0.000550 
+-0.003624 -0.001654 0.001611 -0.005778 -0.004025 -0.001882 
+-0.003357 -0.003377 -0.001116 0.000891 -0.001920 0.000624 
+0.003974 -0.000350 0.001724 0.001870 0.000813 0.002927 
+-0.000566 0.001384 -0.000349 -0.002447 -0.000233 -0.001787 
+-0.002904 -0.001465 0.000025 -0.001427 -0.004106 0.000291 
+-0.001709 -0.001893 -0.001678 -0.002473 -0.000587 -0.001530 
+0.001657 0.002547 -0.006383 0.002109 0.003358 -0.004009 
+0.000511 0.003095 -0.000884 0.000263 0.000674 0.001538 
+-0.000341 -0.000496 0.005625 -0.002715 -0.001209 0.007345 
+-0.002792 -0.002823 0.005225 -0.001312 -0.004787 0.003110 
+-0.004666 -0.006580 0.004283 -0.004720 -0.002440 0.000549 
+-0.001535 -0.000798 -0.001925 0.000144 0.000054 -0.003411 
+-0.001897 0.000575 -0.002337 -0.000236 0.000633 -0.004592 
+-0.003530 -0.001132 -0.000400 -0.005755 -0.003366 -0.004358 
+-0.007861 -0.002999 -0.001546 -0.001619 -0.004892 -0.002327 
+-0.002684 0.000721 -0.001252 -0.005772 -0.001303 -0.000084 
+-0.001998 -0.002930 -0.001708 -0.000928 -0.001975 -0.002517 
+0.000548 -0.003052 -0.002032 0.000001 -0.002729 -0.000722 
+-0.002159 -0.002618 0.001576 -0.001261 0.000155 0.001659 
+-0.003167 -0.001196 -0.000299 -0.000163 0.002755 -0.003079 
+0.001432 0.005183 -0.005887 0.000960 0.004954 -0.006121 
+0.001246 0.000497 -0.001498 -0.001843 -0.001929 0.002808 
+-0.001390 -0.004246 0.004621 -0.002149 -0.003227 0.002689 
+0.000216 -0.000615 0.000917 -0.000084 -0.000547 -0.000113 
+-0.005558 -0.000695 0.002344 -0.005838 -0.000714 0.002745 
+-0.002374 0.000916 0.001995 0.000275 0.001179 0.001355 
+0.000299 0.000644 0.000498 0.000014 -0.000391 -0.000202 
+0.000148 -0.001592 -0.000218 0.000847 -0.003983 0.000000 
+-0.000245 -0.006961 0.001574 -0.001092 -0.006218 0.001597 
+-0.000217 -0.003343 -0.000782 0.001721 0.000250 -0.006872 
+0.000124 0.003251 -0.006130 -0.000342 0.001936 -0.001623 
+-0.002016 -0.000107 0.000267 -0.003381 -0.000932 -0.000389 
+-0.001626 -0.000413 0.000080 0.000872 -0.000854 -0.001316 
+-0.000321 -0.000295 -0.001245 -0.000006 -0.006400 0.000002 
+0.000780 -0.008527 -0.001799 0.001179 -0.008352 -0.001370 
+0.000327 -0.006435 0.000359 -0.001626 -0.001486 0.000452 
+0.001616 -0.001118 -0.002489 0.001868 -0.000756 -0.002942 
+0.002910 -0.000342 0.000109 0.000506 -0.001326 0.001961 
+-0.005042 -0.004569 0.003083 -0.003290 -0.007432 0.002748 
+0.002229 -0.003751 0.000018 0.002763 0.000889 -0.005230 
+-0.000131 -0.000430 -0.000495 -0.000083 0.001734 0.000082 
+0.002055 -0.000761 0.002144 0.002782 -0.001293 0.000647 
+0.000404 -0.000153 -0.001617 -0.001400 -0.000277 -0.002815 
+-0.003883 -0.002095 -0.002171 -0.001831 -0.001698 -0.001437 
+0.000887 -0.002171 0.002219 0.003516 0.001082 -0.002650 
+0.002195 -0.002576 -0.001215 0.000648 -0.000368 -0.002595 
+0.000569 0.000331 -0.001375 0.001167 -0.000116 -0.000735 
+-0.002073 -0.001428 -0.003048 -0.000793 0.000108 -0.003427 
+0.004390 0.001664 0.000476 0.003831 0.001453 0.002084 
+0.003194 0.000556 0.001722 0.002362 0.001067 -0.000977 
+-0.000729 -0.000593 -0.002311 -0.002815 -0.000737 -0.002092 
+0.003041 0.000116 -0.007999 0.001769 0.005319 -0.012692 
+0.005819 0.009664 -0.006369 0.001437 -0.006359 0.002824 
+0.001608 -0.019584 0.001637 -0.001601 -0.020236 -0.001211 
+0.001941 -0.013730 -0.002598 0.000470 -0.003644 -0.009376 
+-0.003336 -0.001792 -0.001758 -0.003954 -0.003878 0.004718 
+-0.002993 -0.005962 0.006545 -0.002114 -0.001866 0.002430 
+-0.000078 0.003024 -0.000302 0.002117 0.004274 0.000314 
+0.002515 0.004315 -0.001652 0.003607 0.001766 -0.001841 
+0.002203 -0.000057 -0.003595 0.002031 -0.001125 -0.002603 
+0.000487 -0.001308 -0.002642 -0.003576 -0.002366 -0.001586 
+-0.001614 -0.002823 0.000448 -0.002142 -0.003118 -0.000315 
+-0.002584 -0.001175 -0.000236 -0.000846 -0.001000 -0.002077 
+0.003315 -0.001696 -0.002775 0.000644 0.003523 -0.001439 
+0.002283 0.002108 -0.008251 0.003490 0.002961 -0.004600 
+0.001882 0.001536 0.000714 0.000078 -0.000985 0.003472 
+-0.002119 -0.002279 0.001862 -0.002026 0.001970 -0.001269 
+-0.000067 0.006656 -0.003899 0.001451 0.005201 -0.004752 
+0.000108 0.002643 -0.001753 0.000599 0.002435 -0.001237 
+0.001360 0.001482 -0.005805 0.003615 0.002588 -0.007268 
+0.002101 0.003873 -0.002768 0.001061 0.000455 -0.000303 
+-0.002727 -0.001225 0.002911 -0.007055 -0.002389 0.000419 
+-0.003676 -0.003587 -0.000344 0.002349 -0.002909 -0.000643 
+0.004219 -0.003320 0.000330 0.001192 -0.003554 0.002890 
+-0.003598 -0.002178 0.002083 -0.004357 -0.003025 0.001873 
+-0.005301 -0.002120 0.001716 -0.006316 -0.004436 0.001880 
+-0.006289 -0.003356 0.002389 -0.003933 -0.001080 0.001628 
+0.000397 0.001306 0.001960 0.001587 -0.000297 0.003270 
+0.000312 0.000313 0.000862 0.001341 -0.003438 -0.000956 
+0.003206 -0.001552 0.002144 0.002135 -0.001443 0.004049 
+0.002369 -0.001644 0.003335 -0.000911 -0.000118 0.000029 
+0.000992 -0.002786 -0.002252 0.003474 -0.000654 -0.003193 
+0.001181 0.002396 -0.001204 0.000855 0.001410 -0.001665 
+-0.002367 0.001015 0.000000 -0.001388 0.003743 0.000296 
+0.000896 0.001064 -0.000952 -0.000763 0.000725 -0.005078 
+0.004398 0.001821 -0.005154 0.000926 -0.000015 -0.004152 
+0.000165 -0.000739 0.000185 -0.001250 -0.000309 -0.000079 
+-0.002766 -0.001885 0.002008 -0.004232 0.002011 0.000900 
+-0.001352 0.000328 -0.001352 0.000970 0.001622 -0.001817 
+0.001393 0.000914 -0.004031 -0.001543 0.005318 -0.000403 
+-0.000666 0.002580 0.001438 -0.000553 -0.010945 -0.000713 
+-0.002968 -0.012592 0.003151 0.003448 -0.007051 0.002983 
+0.003089 -0.001386 -0.005522 -0.001476 0.009630 -0.005658 
+-0.001801 0.011337 -0.001502 0.000199 0.002245 0.000024 
+0.001101 -0.000771 -0.001568 -0.002016 0.001757 -0.000452 
+-0.003405 0.002760 -0.001389 -0.000012 -0.000734 -0.000319 
+0.002776 -0.000475 -0.004816 0.006169 0.001000 -0.007338 
+0.001423 -0.001626 -0.008750 0.000947 -0.000308 -0.007290 
+-0.001555 -0.001597 -0.001555 -0.003352 -0.001602 0.002123 
+-0.005606 -0.001999 0.001383 -0.004519 0.000858 -0.000181 
+-0.004711 -0.000603 0.004223 -0.003239 -0.002116 0.000288 
+-0.001004 -0.000182 -0.003928 0.000509 0.002271 -0.005542 
+0.002561 0.003938 -0.003426 0.003728 0.002199 -0.001752 
+0.001438 0.000709 -0.003667 -0.003573 0.002340 -0.004382 
+-0.003254 0.002553 -0.000367 0.000150 0.002764 -0.000055 
+0.002187 0.002728 -0.000221 -0.001201 0.002229 -0.002688 
+-0.004031 -0.001328 -0.001344 -0.004504 -0.002938 0.000261 
+-0.002327 -0.001953 0.001092 -0.003551 -0.001301 0.001000 
+-0.004333 -0.004567 -0.000820 -0.003723 -0.000990 -0.001901 
+-0.001729 -0.003167 0.001725 -0.000547 -0.002256 -0.000813 
+-0.001310 -0.005558 -0.002269 -0.001945 -0.009878 -0.001603 
+-0.001511 -0.009652 0.001854 -0.001044 -0.002690 0.001305 
+0.000952 0.002439 -0.001020 -0.002047 0.002913 0.000000 
+-0.000143 -0.001195 -0.001911 -0.002254 0.000780 -0.002035 
+-0.003302 -0.000685 -0.004019 -0.001468 0.001695 -0.003729 
+0.000158 -0.001014 -0.004282 -0.000658 -0.001303 -0.000980 
+0.000119 -0.000413 -0.000239 0.000985 0.001581 0.000471 
+0.002456 0.001491 0.003395 -0.000406 0.000313 0.002156 
+-0.000363 0.000247 0.000392 -0.002687 -0.002777 -0.002330 
+-0.000920 -0.003281 -0.003007 -0.000361 -0.001479 -0.001864 
+0.002509 -0.001356 0.000316 0.005210 0.002808 -0.000407 
+0.005370 -0.002387 -0.003307 -0.000462 -0.000198 -0.002344 
+-0.000597 0.002687 -0.001597 -0.000463 -0.000271 0.001246 
+-0.000351 -0.005203 0.003298 0.001009 -0.007967 0.003064 
+-0.001343 0.000283 -0.001520 -0.000543 0.003398 -0.006025 
+0.001210 0.000000 -0.009194 -0.002086 0.000263 -0.005731 
+0.000126 -0.000063 -0.001102 -0.002795 -0.007635 0.002364 
+-0.001707 -0.004998 0.001168 0.002351 0.001072 -0.001337 
+0.003858 -0.002071 0.000205 0.001228 -0.011450 0.000687 
+-0.001519 -0.012229 0.004435 0.001334 -0.005988 0.004078 
+0.000878 -0.001535 0.000363 -0.000348 0.003202 -0.001142 
+-0.003306 0.002021 -0.004959 0.000175 -0.001400 -0.000384 
+0.000039 -0.001054 -0.000903 -0.000320 0.001119 0.000864 
+-0.001958 -0.001211 -0.000264 -0.002813 -0.002483 0.000966 
+0.000387 -0.004765 0.000665 0.001035 -0.003763 -0.004046 
+0.002640 -0.002921 -0.002851 -0.000996 -0.001804 0.001618 
+-0.003614 -0.000723 0.001048 -0.005968 -0.000235 0.000391 
+-0.006522 -0.001414 -0.000145 -0.005851 -0.001888 0.001370 
+-0.001275 0.000159 0.001598 0.001619 -0.003012 0.002899 
+0.002634 -0.005040 -0.000439 0.006905 -0.001952 -0.000651 
+0.001351 -0.000284 0.001209 0.006268 0.002683 -0.001195 
+-0.001075 0.000538 -0.000538 -0.003612 -0.000776 0.001365 
+-0.002756 -0.001631 0.000109 0.000476 0.000354 0.000105 
+0.001005 0.002090 0.000065 0.000161 -0.000299 -0.000405 
+-0.002449 -0.003736 -0.003485 -0.004406 -0.002247 -0.000284 
+0.000895 -0.002768 -0.000433 0.003468 -0.001256 -0.000538 
+0.001785 -0.003073 -0.000011 0.001518 -0.002217 -0.002547 
+-0.000661 -0.000782 -0.000576 0.002062 -0.000627 0.001836 
+0.000605 -0.001121 -0.000461 -0.002553 -0.004667 0.000907 
+-0.000496 -0.004965 0.001489 -0.004327 -0.002531 0.001497 
+-0.003640 -0.004931 0.000981 -0.004951 -0.004373 0.000949 
+-0.001709 -0.002858 0.004549 0.000410 -0.001024 0.000164 
+0.001921 0.000279 -0.001468 0.004319 0.001579 -0.002657 
+0.007129 -0.001462 -0.002690 0.002794 -0.002438 0.000900 
+0.002039 -0.002815 0.000510 -0.001926 0.000163 0.000272 
+-0.004179 -0.004514 0.005708 -0.002762 -0.000353 0.000779 
+0.000325 0.005002 -0.001394 0.002519 0.001394 -0.004497 
+-0.001339 -0.000706 0.000819 -0.003919 -0.003130 0.003135 
+-0.002411 -0.002060 0.003397 -0.002419 0.000484 0.001210 
+-0.003737 0.001272 0.001128 -0.002914 0.000770 0.001775 
+-0.000230 0.000575 0.001282 0.001692 -0.001352 0.001360 
+-0.000708 -0.004956 0.000708 -0.001276 -0.002223 -0.000865 
+-0.002441 -0.000962 -0.005771 0.002965 -0.000083 -0.002060 
+0.006927 0.006364 -0.002221 0.006149 0.006860 0.003074 
+0.001233 0.002134 -0.003865 -0.001783 -0.002791 -0.000775 
+-0.001283 -0.004094 0.001717 -0.002549 -0.001916 0.001018 
+0.000775 -0.000377 0.001011 0.005592 -0.003917 0.000569 
+0.002309 -0.005966 -0.010943 0.004781 -0.011585 -0.000227 
+0.004387 -0.001299 -0.002732 0.000183 0.003997 -0.003118 
+-0.002464 0.004309 0.001012 -0.003098 0.000149 0.003294 
+-0.001560 0.001557 0.001801 0.001133 0.001797 0.000195 
+-0.002145 0.000613 -0.000204 -0.002119 -0.001415 -0.000959 
+-0.002000 -0.001548 -0.000563 -0.001508 0.000000 -0.002222 
+0.001973 0.001387 -0.000587 0.001232 0.002331 -0.002023 
+0.001342 -0.000330 -0.000029 -0.000563 -0.001760 0.000102 
+-0.001332 0.000191 0.000543 -0.001719 0.004375 -0.002344 
+0.000000 0.005748 -0.003543 0.000638 0.002344 -0.003762 
+0.002742 0.000887 -0.001774 0.000872 -0.001214 -0.003564 
+0.001118 -0.001451 -0.001974 -0.004044 0.000556 -0.002300 
+-0.004726 0.000040 -0.003797 -0.004400 0.001148 -0.000209 
+0.000814 0.001483 -0.000339 0.002093 0.001707 -0.000512 
+-0.001649 -0.000607 -0.002286 -0.004228 -0.004228 -0.001463 
+-0.003188 -0.001375 -0.002969 -0.002167 -0.001851 -0.001392 
+-0.001059 -0.001078 -0.000714 -0.000351 -0.002596 -0.001100 
+-0.001168 -0.004513 0.001424 -0.002017 -0.001821 0.004161 
+0.001629 -0.000281 0.005065 0.004325 0.000585 0.005093 
+-0.000223 -0.000044 -0.000001 -0.007202 -0.005282 0.002641 
+-0.007863 -0.008907 0.002352 -0.008617 -0.006039 0.002154 
+-0.004567 -0.004666 -0.001007 -0.001733 -0.001530 -0.000498 
+0.000733 -0.001049 -0.000854 0.000214 -0.001159 -0.002312 
+-0.000499 -0.001462 -0.001771 -0.001088 -0.001629 -0.000007 
+-0.000445 -0.001567 0.000565 -0.001166 0.001686 -0.000595 
+-0.001508 0.002428 -0.001176 0.000072 0.001023 -0.001131 
+-0.001896 -0.001755 0.003369 -0.004638 -0.003062 0.003707 
+-0.001385 -0.000852 0.000427 0.001145 0.000931 0.000923 
+-0.000321 0.001249 -0.000153 0.000342 -0.002435 0.002522 
+-0.004393 -0.004917 0.001647 0.000012 -0.001300 -0.000537 
+0.001309 -0.000284 0.000044 -0.001275 -0.003020 0.001141 
+0.000345 -0.006581 0.001208 -0.000657 -0.005387 0.000112 
+0.003062 -0.001120 -0.001387 0.001621 -0.002137 -0.000590 
+-0.001578 -0.000556 0.000467 -0.001414 0.000510 -0.001167 
+0.000485 -0.000727 -0.002441 0.005445 -0.000987 -0.001483 
+0.004093 -0.001452 -0.002006 0.000160 -0.000456 -0.000566 
+-0.001194 0.002214 0.002472 -0.001440 0.001660 0.003070 
+0.002206 -0.001296 -0.002184 0.009464 -0.006362 -0.002369 
+-0.005787 -0.002909 -0.000679 0.010497 -0.019559 -0.001009 
+0.006504 -0.009865 0.001251 -0.001144 0.001680 -0.001146 
+-0.000412 0.004422 -0.000068 0.000947 0.003515 -0.001115 
+0.001564 0.003232 -0.001555 0.001111 0.003198 -0.002087 
+0.000839 0.003026 -0.000203 0.000620 -0.000310 0.000222 
+0.000214 -0.004171 -0.000785 -0.002366 -0.005989 -0.000980 
+-0.002833 -0.005870 -0.000729 0.000201 -0.003148 -0.001239 
+0.003087 -0.000359 0.001660 0.002255 0.000878 0.003552 
+-0.001746 0.000865 0.002601 -0.001643 -0.000217 -0.000910 
+0.000281 -0.002173 -0.003796 0.002244 -0.003172 -0.006961 
+0.001558 -0.001511 -0.007651 -0.001619 -0.005100 -0.001781 
+-0.005301 -0.002405 -0.001913 -0.000958 -0.000569 -0.002639 
+0.004643 0.000238 -0.004484 0.004310 0.002319 -0.002264 
+-0.001298 -0.001458 0.000032 -0.003813 -0.002027 -0.002133 
+-0.003772 -0.000797 -0.001514 -0.003592 -0.002136 0.004531 
+0.000660 -0.000480 0.004409 0.002476 -0.000163 0.001792 
+0.007492 0.002365 -0.001380 0.006482 0.003978 -0.007070 
+0.003902 0.001789 -0.000894 -0.002022 -0.000652 -0.001442 
+0.000505 0.001010 -0.000505 0.000988 0.005200 -0.002787 
+-0.001394 0.007019 -0.001394 0.002874 -0.002402 -0.002830 
+-0.000467 -0.006103 -0.006732 -0.002994 -0.006408 -0.004327 
+-0.004780 -0.004859 -0.002632 -0.002667 -0.006926 0.000109 
+-0.003173 -0.007192 0.000692 -0.007280 -0.004969 0.001019 
+-0.007206 -0.004496 0.000258 -0.002874 -0.000910 -0.002136 
+0.001137 -0.003974 -0.001891 0.000465 -0.004204 -0.001900 
+0.001363 -0.004701 -0.001441 0.000296 -0.005076 -0.000556 
+0.001337 -0.003069 -0.001883 -0.002524 -0.000751 -0.001741 
+-0.000931 -0.000138 0.000416 0.000270 0.000769 0.000620 
+-0.001019 0.000741 -0.000648 0.001612 -0.000435 -0.001524 
+-0.000460 -0.000360 -0.000308 -0.000787 0.000429 0.000125 
+0.000098 0.000620 -0.000591 -0.000051 -0.000196 -0.000601 
+-0.001131 -0.000766 -0.002384 -0.001816 0.001066 -0.002947 
+0.000946 0.000147 -0.002449 0.000168 -0.001839 -0.003065 
+0.000224 0.000179 -0.001857 -0.000345 0.002071 0.000084 
+-0.001513 0.002773 -0.003025 -0.000430 0.003713 -0.004564 
+0.000844 0.000128 -0.001654 -0.001741 -0.001648 0.003670 
+-0.005974 0.000073 0.002735 -0.000058 0.001792 0.003062 
+0.002554 -0.006043 -0.000498 0.004378 -0.015362 -0.001262 
+0.002856 -0.020531 -0.012275 0.009100 -0.015271 -0.012054 
+0.002417 -0.004105 0.002264 -0.008874 -0.006533 0.004372 
+-0.004434 -0.004208 0.003098 0.000167 -0.002599 -0.000448 
+0.000702 0.000165 -0.003512 -0.000489 0.001667 -0.000134 
+0.001997 -0.000399 -0.000769 0.002590 0.003269 -0.000792 
+0.001690 0.002521 -0.000260 -0.002704 0.001192 0.001830 
+-0.001978 0.000582 0.003377 -0.001622 0.001185 0.002744 
+-0.002133 0.000555 0.000263 -0.000796 -0.001492 -0.000116 
+0.003529 -0.000184 -0.000020 0.005777 -0.001642 0.000912 
+0.007511 -0.001647 -0.000670 0.002541 0.001476 -0.001775 
+0.000263 -0.000588 -0.000982 0.000335 -0.001062 -0.001649 
+0.000456 -0.001115 -0.002493 -0.000246 -0.000419 -0.003030 
+-0.000616 -0.002359 -0.002147 -0.000566 -0.002281 -0.000002 
+0.000655 0.000063 0.000169 0.002762 0.001731 0.001348 
+0.002198 0.002857 -0.003297 -0.000764 0.000271 -0.001511 
+-0.001291 0.001203 -0.001614 0.001940 0.001522 -0.004567 
+0.001718 -0.001082 -0.003944 0.000993 -0.001270 -0.002660 
+0.002734 -0.000906 -0.000453 0.000776 -0.002920 -0.000392 
+0.002642 -0.001010 -0.002879 -0.000921 -0.001818 -0.005347 
+-0.001578 0.000754 -0.005083 -0.000609 -0.001065 -0.000359 
+-0.005079 -0.004105 0.001453 -0.006575 -0.005314 0.002087 
+-0.003923 -0.003859 -0.000671 0.000157 -0.003020 -0.001854 
+0.001471 -0.004569 0.001266 -0.000415 -0.004296 0.001238 
+-0.003269 -0.000895 -0.000800 -0.002016 -0.000250 -0.000176 
+0.001960 -0.001223 -0.000367 0.004252 -0.003118 -0.001039 
+0.000573 -0.002760 -0.003333 0.000517 -0.006460 0.001189 
+-0.002437 -0.004789 0.000290 -0.001131 -0.001963 0.001071 
+0.003449 0.001533 0.003145 0.002568 0.001659 0.001794 
+-0.000812 -0.003328 0.003551 -0.006156 -0.003211 -0.000497 
+-0.007864 -0.001137 0.000786 -0.004519 -0.000403 0.001176 
+-0.000336 0.000279 0.000583 0.001814 0.001550 0.001701 
+0.004448 -0.000160 0.001910 0.001188 -0.002239 0.000413 
+-0.001674 -0.000665 -0.000721 -0.000759 0.000082 0.000162 
+-0.009397 -0.000834 0.011848 -0.008576 0.003988 0.010094 
+-0.000155 0.004450 0.005336 0.000222 0.000407 0.000092 
+-0.002628 -0.002132 -0.001456 -0.005144 -0.009957 0.004686 
+-0.008487 -0.012691 0.011597 -0.007944 -0.013914 0.009028 
+0.006893 -0.003991 -0.002744 -0.010581 0.039564 -0.031787 
+-0.009218 0.033044 -0.022837 -0.000216 0.006801 -0.006670 
+-0.000882 0.000249 -0.000228 -0.000179 -0.002870 -0.000013 
+0.004628 -0.000407 -0.003517 -0.003081 0.002528 -0.003108 
+-0.010000 -0.000440 -0.010308 -0.006216 -0.018169 -0.021039 
+-0.010724 -0.012164 -0.007893 -0.006663 -0.012549 -0.000367 
+-0.001373 -0.006767 -0.001877 -0.001741 -0.005082 -0.003291 
+-0.003105 -0.004249 -0.002904 -0.001387 0.000043 0.000620 
+0.002535 0.005802 0.004316 0.007270 0.009718 0.005256 
+0.003353 0.018778 -0.009054 -0.012714 -0.004216 -0.003519 
+-0.029593 -0.017584 0.006934 -0.010734 -0.009369 -0.004111 
+-0.005934 -0.006099 -0.006429 -0.002327 -0.004639 -0.004401 
+0.013520 0.027088 -0.023723 0.021572 0.023712 -0.028788 
+0.012919 -0.020287 -0.012049 0.019172 -0.015227 -0.010360 
+0.011221 -0.003478 -0.005922 0.002739 -0.008146 0.010862 
+-0.004570 -0.011679 0.005121 -0.009764 -0.009773 0.011162 
+-0.000512 -0.008762 0.005924 0.002346 -0.000778 0.000662 
+-0.000085 -0.001066 0.000110 0.002932 -0.002824 -0.001160 
+0.002308 -0.003495 0.007055 -0.002851 0.001713 -0.000964 
+-0.003732 0.003408 -0.000504 0.001416 -0.002150 -0.004893 
+0.004493 -0.005442 -0.008007 0.004073 -0.004668 -0.008876 
+0.001385 -0.003531 -0.005402 0.002758 0.000398 -0.000504 
+0.000871 0.002086 -0.003877 -0.002154 0.006028 -0.002848 
+-0.012014 0.020602 0.002314 -0.005629 0.004074 -0.005879 
+0.002283 -0.004073 0.000500 -0.000144 -0.003599 0.003211 
+-0.000266 0.000853 -0.000102 -0.002739 0.001738 -0.002576 
+0.006041 0.006581 0.002304 0.002479 0.000831 0.001098 
+0.000845 -0.002462 0.001529 -0.004015 0.001529 -0.000749 
+-0.009929 0.011142 -0.002810 -0.011797 0.007365 -0.002472 
+-0.006567 0.002419 -0.002254 -0.002601 0.003538 -0.005338 
+-0.005666 0.001560 -0.006118 -0.009929 0.002081 -0.004191 
+-0.009725 0.001986 -0.001827 -0.009212 0.002758 -0.001014 
+-0.009510 0.000556 -0.003102 -0.002514 -0.000229 -0.003257 
+0.002147 0.002552 -0.000914 0.002712 0.003869 -0.000947 
+-0.000293 0.000444 0.002720 0.004210 0.001224 -0.000292 
+0.005482 0.003081 -0.003127 0.002478 0.003999 -0.001286 
+-0.000280 0.000081 -0.000344 -0.000827 -0.002050 0.002417 
+-0.001587 -0.004143 0.001290 0.005440 -0.005539 -0.006253 
+0.046598 -0.001852 -0.017952 0.035288 0.003371 0.004322 
+0.020084 0.015845 0.008257 0.011406 0.013028 -0.003055 
+0.009889 0.005316 -0.003162 0.006308 -0.002257 0.000772 
+0.003062 -0.002904 0.001148 0.003614 -0.001032 -0.003407 
+-0.001797 0.000624 -0.003376 0.010289 0.015744 -0.017686 
+0.000680 0.014966 -0.011957 -0.002422 0.009224 -0.003665 
+-0.003644 0.000403 -0.002636 -0.004357 -0.003592 -0.003261 
+-0.007730 -0.001753 -0.000659 -0.007540 -0.000709 0.002349 
+-0.004730 -0.002618 0.000148 -0.003419 -0.003305 -0.001958 
+-0.005182 -0.002137 0.001489 -0.017468 -0.016400 0.020622 
+-0.005840 -0.029637 0.017607 -0.022766 -0.027476 0.019855 
+-0.013537 0.000572 -0.009574 -0.009696 0.005456 -0.006689 
+0.005025 0.007449 -0.010395 0.008554 0.002759 0.001711 
+-0.001539 -0.006601 0.000040 -0.009756 -0.008004 -0.002283 
+-0.007574 -0.005423 -0.002502 0.001954 -0.005193 -0.005426 
+0.006450 0.000667 -0.006722 0.001051 -0.001144 0.002328 
+0.000559 0.000524 0.003829 0.001094 -0.001227 -0.000932 
+0.010924 -0.007719 0.001003 0.044425 -0.030562 0.038546 
+-0.012496 -0.034757 -0.003744 -0.001325 0.004567 0.006485 
+-0.000320 0.000460 0.000533 0.001599 0.000302 -0.003559 
+0.003459 0.003599 -0.004956 0.004856 0.004166 -0.009308 
+0.001984 -0.001331 -0.009476 0.003483 -0.000392 -0.002366 
+0.001819 -0.001470 -0.002150 0.000806 -0.003653 0.003458 
+-0.001639 -0.000884 -0.000981 -0.003266 0.004036 -0.011560 
+0.000347 0.003448 -0.007642 -0.004724 -0.001753 -0.003429 
+0.001360 -0.003020 -0.000143 -0.003554 0.008426 -0.000411 
+-0.011881 -0.005956 -0.006149 -0.002578 -0.017690 0.002531 
+0.001607 -0.009953 0.003727 -0.004675 0.003273 -0.004506 
+-0.011115 0.010924 -0.008342 -0.012347 0.009782 -0.009031 
+-0.008209 0.010808 -0.006497 -0.006962 0.007419 -0.006101 
+-0.003961 0.003964 -0.003319 -0.001107 0.000060 0.001720 
+-0.000663 -0.003327 0.005516 0.003291 -0.001095 0.001537 
+-0.002561 0.000483 -0.000135 -0.006970 -0.002563 -0.002087 
+-0.005071 -0.004520 -0.001816 0.000264 0.001351 -0.000742 
+-0.000550 0.000604 -0.003798 0.001320 0.003539 -0.005578 
+0.002796 0.006880 -0.006730 0.006186 0.007178 -0.005424 
+0.004501 -0.000610 -0.000047 -0.000900 0.002689 -0.001734 
+-0.000925 -0.005016 0.000731 -0.008535 -0.017158 0.011618 
+-0.006637 -0.043412 0.008840 0.014495 0.001930 0.005627 
+0.008219 0.000832 0.002355 0.005858 0.004158 -0.002039 
+0.008172 0.003874 -0.006535 0.006331 -0.016227 0.011921 
+0.010920 -0.014007 0.013131 0.000697 -0.004877 0.001161 
+0.000315 -0.001419 -0.003232 0.005707 0.004380 -0.004945 
+0.002704 0.007796 -0.011237 0.000204 0.005823 -0.008076 
+-0.001441 -0.001350 -0.002513 -0.001768 -0.003745 -0.001424 
+-0.004150 -0.001743 -0.001628 -0.002986 -0.001713 -0.001744 
+-0.000243 -0.000626 -0.002171 0.000498 -0.001226 -0.001637 
+-0.002613 0.000042 0.002651 -0.001600 -0.000367 0.006886 
+0.007971 0.006512 -0.003649 0.000248 -0.000069 -0.000160 
+-0.000258 -0.008915 -0.001564 0.006621 -0.000514 0.000461 
+-0.023134 -0.027624 0.018783 -0.048841 -0.084192 0.019924 
+-0.034752 -0.050794 -0.000652 -0.019006 -0.012373 -0.004097 
+-0.010490 0.000917 -0.005958 -0.001802 0.009766 -0.003290 
+0.001842 0.014644 -0.002180 -0.004405 0.010313 -0.002665 
+-0.008362 0.007289 0.002518 -0.001576 0.002354 0.001658 
+0.029662 -0.030031 -0.007184 0.112356 -0.066272 0.014192 
+-0.004580 0.003879 -0.009500 -0.000636 0.000399 0.000411 
+0.003532 -0.001557 0.002523 0.005760 -0.002344 0.000451 
+0.004689 -0.002111 -0.002817 0.001016 -0.001652 -0.004478 
+-0.002183 -0.006002 -0.000618 0.000224 -0.003686 0.003819 
+-0.001584 -0.003839 0.014278 -0.002086 0.004243 -0.000656 
+-0.006248 0.001929 -0.009369 -0.001417 0.001762 -0.002663 
+-0.000290 0.000555 0.000184 -0.003081 0.001200 -0.003617 
+-0.002502 0.001692 -0.002932 -0.009680 0.015493 -0.033494 
+-0.018996 0.008762 -0.008799 0.001019 -0.001176 0.001048 
+-0.003065 -0.004865 -0.002524 -0.007982 -0.001073 -0.010534 
+-0.011752 0.002303 -0.010497 -0.009608 0.006215 -0.010080 
+-0.008034 0.005101 -0.006085 -0.002840 0.002365 -0.001423 
+0.001521 -0.005282 -0.003083 -0.009661 -0.014798 -0.002775 
+-0.000078 -0.005327 0.003884 -0.001350 0.001487 0.002153 
+-0.003709 0.003197 0.001667 -0.007221 0.000645 -0.001733 
+-0.005505 -0.003592 -0.000976 0.000458 -0.000957 0.000010 
+0.003557 0.003690 -0.009161 0.006019 -0.000723 -0.006942 
+-0.002720 -0.000851 -0.001283 -0.001148 0.001745 -0.003342 
+0.002739 0.006378 -0.006544 0.003807 0.004240 -0.007416 
+-0.000794 -0.002614 -0.002739 -0.006940 -0.009307 0.004044 
+-0.006661 -0.007927 0.000487 0.031146 0.058854 0.010390 
+-0.003028 0.015947 -0.027034 0.008407 0.021862 -0.014370 
+0.014535 0.019930 -0.021762 -0.015288 0.047484 -0.044021 
+-0.005654 0.009578 -0.021247 0.010389 0.003724 0.006346 
+0.010690 0.002547 -0.002140 0.003937 0.012944 -0.004208 
+0.005164 0.012401 -0.004599 0.004966 0.007363 0.000506 
+0.002446 0.001571 0.003089 -0.000390 -0.000871 -0.000009 
+-0.002493 -0.000255 -0.001061 -0.000948 0.000274 0.000159 
+-0.000986 0.001976 -0.000482 0.000879 0.000610 -0.000308 
+0.001212 -0.001191 -0.001287 0.001070 0.000734 0.001440 
+0.002497 0.000765 0.002506 0.005844 0.006448 -0.007524 
+0.021313 0.019811 -0.014432 0.023202 0.021926 -0.023435 
+-0.061289 -0.003914 0.027388 -0.003430 -0.034045 0.026652 
+0.000463 -0.007393 -0.004245 0.000089 0.001387 0.001220 
+0.007500 -0.000167 0.002236 -0.006386 -0.016959 0.009056 
+-0.009885 -0.003780 0.001618 -0.007895 0.015786 -0.007630 
+-0.009210 0.003092 0.001842 0.010756 -0.020315 0.012426 
+-0.029124 0.021201 -0.025903 -0.003658 0.005954 -0.013647 
+0.007511 -0.004131 -0.007564 0.009625 -0.004879 -0.002538 
+0.010552 -0.004474 -0.001975 0.012920 -0.006084 -0.004451 
+0.012742 -0.005006 -0.007239 0.006652 -0.002256 -0.007922 
+0.000666 -0.000470 -0.000861 -0.003468 0.001942 0.007700 
+-0.024767 -0.015802 0.063441 0.001490 -0.005973 -0.001659 
+0.000376 -0.000278 -0.013146 0.002011 0.000152 -0.003710 
+-0.002227 0.000197 -0.001795 -0.002168 0.000836 -0.003201 
+-0.007712 0.005408 -0.016283 0.003757 -0.001619 -0.026685 
+-0.029698 -0.019485 -0.000791 -0.001933 0.005330 -0.003209 
+-0.002433 0.004476 -0.004523 -0.004791 0.002037 -0.006480 
+-0.006079 0.002426 -0.006173 -0.008746 0.001892 -0.003083 
+-0.007480 0.002806 0.000626 -0.001336 -0.003815 -0.002671 
+0.001403 -0.014528 0.001250 -0.000480 -0.015281 0.004339 
+-0.002693 -0.009933 0.006240 -0.000850 -0.001381 0.004384 
+-0.003194 0.002327 0.002591 -0.002079 -0.000204 0.001283 
+-0.000141 -0.000106 -0.000359 0.000958 -0.001546 -0.001219 
+0.008166 0.008155 -0.006375 0.008616 0.005104 -0.005622 
+0.006382 0.000691 -0.006990 0.001521 0.001726 -0.007415 
+-0.000381 0.004671 -0.004309 -0.001527 0.000788 -0.002074 
+0.001507 0.000899 -0.002705 0.005588 0.005899 -0.005562 
+0.012169 0.013448 -0.003658 0.029691 0.021500 0.005795 
+0.026888 0.005638 -0.002323 0.007025 0.005825 -0.001827 
+-0.001414 0.018495 -0.001156 -0.031380 0.046667 0.005604 
+-0.048462 0.055966 -0.031554 0.025049 0.018555 0.007761 
+0.016973 0.015604 0.000333 0.017805 0.013346 -0.010010 
+0.017313 0.008076 -0.009459 0.016343 0.011038 0.008252 
+0.005805 0.003137 0.006939 -0.001188 -0.000838 -0.001018 
+-0.002739 0.000048 -0.001904 -0.000772 0.000280 -0.000149 
+-0.000644 -0.001005 -0.001033 -0.000662 -0.002349 -0.001631 
+0.000596 -0.000444 -0.004728 0.000288 -0.001078 -0.002760 
+-0.001342 -0.004190 0.000915 -0.002985 -0.004486 0.000765 
+0.000834 0.002350 -0.001373 -0.002581 -0.001670 0.000748 
+-0.011812 -0.010514 0.003963 -0.004188 0.002298 -0.001937 
+0.004707 0.009749 -0.005795 -0.000589 0.005609 -0.003265 
+0.004889 0.012040 -0.009901 -0.006184 -0.019217 0.013096 
+-0.006270 0.001713 -0.004588 0.019210 -0.001130 -0.024231 
+0.035997 -0.015535 -0.019879 0.010304 -0.041565 0.037291 
+0.000388 -0.001694 0.002226 0.008340 -0.006313 -0.005447 
+0.013494 -0.008018 -0.007480 0.016108 -0.006812 -0.005197 
+0.010101 -0.004581 0.004471 0.008811 -0.009367 -0.005239 
+0.006239 -0.006310 -0.007253 0.001376 -0.001916 -0.007566 
+-0.004235 0.004969 -0.001741 -0.018916 0.021927 0.026044 
+-0.086509 -0.012540 -0.022090 -0.003692 -0.008160 -0.009808 
+-0.002611 -0.005850 -0.006323 -0.005110 -0.001287 -0.007047 
+-0.005064 0.002095 -0.005516 -0.009734 0.005683 -0.003998 
+-0.027442 0.016437 -0.011978 -0.037840 0.025178 -0.034675 
+-0.012339 0.013576 0.015435 0.006194 0.001401 0.010315 
+0.001554 -0.000677 0.002189 0.000583 0.000976 -0.001437 
+-0.000323 -0.000177 -0.000664 -0.001769 0.001904 0.000533 
+-0.007050 -0.005038 -0.000159 -0.005092 -0.010021 0.004902 
+-0.002618 -0.010743 0.003708 -0.002025 -0.009197 0.002153 
+-0.004547 -0.004326 0.002169 -0.001748 -0.001096 0.006095 
+0.000252 -0.001203 0.002192 0.000617 -0.001177 0.000748 
+-0.000710 -0.000931 0.001591 -0.001432 -0.001140 0.002194 
+-0.003306 0.001700 -0.002018 -0.002818 0.000678 -0.002782 
+0.000443 0.003091 -0.003506 0.001791 0.004560 -0.005028 
+0.000896 0.005743 -0.002558 0.002129 0.003309 -0.001170 
+-0.000474 0.002146 -0.003277 0.001143 0.001582 -0.000881 
+0.001669 0.000010 0.003221 0.003900 -0.000090 0.004923 
+0.012945 0.001218 0.012318 0.012714 -0.031357 0.034071 
+0.003000 -0.066000 0.000000 0.002117 -0.075354 -0.010523 
+-0.010666 -0.046154 -0.009492 -0.012071 -0.012593 -0.005062 
+-0.008330 -0.004439 -0.002051 -0.007491 -0.000098 0.000366 
+-0.003864 0.005789 0.000715 0.002194 0.008513 -0.002184 
+0.000521 0.004231 -0.006262 -0.000808 0.000637 -0.003973 
+-0.000879 -0.002379 0.000858 0.000405 -0.003040 0.002460 
+-0.000211 -0.001066 -0.000300 0.000596 0.005098 -0.000689 
+0.003943 0.003690 0.000684 -0.000783 -0.001878 -0.003527 
+-0.003982 -0.006227 -0.001799 -0.005629 -0.000499 -0.000081 
+-0.003240 0.001148 -0.001199 -0.001594 -0.002653 0.001021 
+-0.004666 -0.007125 0.000227 -0.014235 -0.009613 -0.004881 
+-0.041218 -0.047027 -0.012154 -0.010677 -0.010887 -0.010935 
+-0.020178 -0.015827 -0.021084 -0.030424 -0.012811 0.042523 
+0.000964 0.015823 0.015125 0.007480 0.030580 -0.023601 
+0.057955 0.076647 -0.138030 -0.001071 -0.001652 0.002835 
+0.003225 -0.007891 0.002611 0.004858 -0.010778 -0.001619 
+0.009263 -0.008494 -0.005543 0.014014 -0.006482 -0.000629 
+0.010720 -0.006951 0.000551 0.005548 -0.006624 -0.002427 
+0.000839 -0.003399 -0.003276 -0.003917 0.002791 -0.001051 
+-0.014284 0.013624 0.000687 -0.053776 0.015386 0.017152 
+-0.028676 0.019014 -0.000783 -0.020445 0.014092 -0.009247 
+-0.011427 0.002086 -0.010568 -0.011366 0.003721 0.002931 
+-0.007781 0.002764 0.031801 0.002438 0.002723 0.106785 
+-0.050536 -0.087599 0.053341 -0.008519 0.014287 -0.006349 
+-0.015252 0.008054 -0.007131 -0.006298 0.003165 0.002136 
+-0.000924 0.001660 -0.001259 -0.006285 -0.007690 0.005348 
+-0.012791 -0.004480 0.007404 -0.005902 -0.000884 0.001981 
+0.001655 0.001893 -0.002454 0.000521 0.002960 -0.002453 
+-0.005146 -0.001525 0.000462 -0.006884 -0.010225 -0.000005 
+-0.002118 -0.011831 -0.001401 0.000090 -0.003599 -0.002550 
+0.000757 0.000667 0.000389 -0.000598 -0.000201 -0.001507 
+-0.002167 0.000243 -0.002847 -0.001735 0.001506 -0.001199 
+-0.000881 -0.002512 -0.000061 -0.001811 -0.005079 -0.002207 
+0.000997 -0.003110 -0.002040 0.002139 0.000488 -0.001362 
+0.004092 0.001462 -0.003625 0.003287 0.000988 -0.005646 
+-0.001167 -0.000033 -0.000290 -0.005080 0.001421 0.000289 
+-0.005258 -0.008422 0.003452 -0.004822 -0.003405 -0.003249 
+-0.000726 0.003926 -0.004698 0.004756 -0.013914 0.014424 
+-0.016605 -0.080346 0.062134 -0.015571 0.005670 0.016333 
+-0.035650 -0.044884 -0.018154 -0.023280 -0.010918 -0.005692 
+-0.006832 0.004525 -0.003260 -0.000199 0.008164 -0.002905 
+-0.001361 0.003583 -0.001072 0.004414 0.000699 -0.005889 
+0.023047 0.023034 -0.018946 0.003378 0.008417 -0.002083 
+0.000745 0.001788 -0.002087 0.001125 0.001528 -0.005075 
+0.003020 -0.001223 -0.001079 0.001404 0.008490 -0.006935 
+0.000288 0.004337 -0.003349 0.001165 -0.004451 0.001676 
+0.001116 -0.001718 -0.000363 -0.000634 0.002030 -0.000844 
+0.002012 -0.000787 0.001064 0.001266 -0.003636 0.001296 
+-0.001489 0.005672 -0.001271 0.000229 0.010774 -0.002145 
+-0.000196 -0.013846 0.002470 0.000277 0.000195 0.000007 
+-0.033978 -0.010424 0.012672 -0.018901 -0.019212 0.016498 
+-0.009417 0.008770 0.015588 -0.008403 0.007937 0.001992 
+-0.003975 -0.016015 0.022784 0.000761 0.001298 -0.001492 
+0.002510 0.001249 -0.003161 0.000498 -0.004189 0.000286 
+-0.000239 -0.004330 -0.002933 0.006613 -0.005167 -0.001537 
+0.005045 -0.002240 0.001411 -0.000021 0.001641 0.000609 
+-0.006307 0.007222 -0.000822 -0.012509 0.018413 -0.001572 
+-0.037541 0.111940 -0.052362 -0.029679 0.064720 -0.007972 
+-0.011752 0.022277 0.002219 -0.006557 0.002131 0.004775 
+-0.003274 -0.002268 0.001132 -0.011806 -0.034975 0.010268 
+-0.022999 -0.061945 0.012613 -0.056139 -0.032442 0.005783 
+-0.003873 0.045235 0.018906 -0.018297 0.021594 -0.011765 
+-0.009105 0.012798 -0.005152 -0.011218 0.001209 0.002070 
+-0.006906 -0.006343 0.004386 -0.006018 -0.010575 0.007453 
+-0.006757 -0.004914 0.005908 -0.005984 0.003578 0.001205 
+-0.003342 0.003463 -0.000933 0.000533 -0.003934 0.001480 
+0.000760 -0.016303 0.000140 -0.004354 -0.022682 -0.007518 
+-0.008126 -0.011016 -0.002402 -0.002585 0.007590 0.002061 
+-0.001653 0.007707 0.006846 -0.001239 -0.000077 -0.000806 
+-0.001119 0.002758 -0.009631 -0.001549 0.005214 -0.010337 
+-0.000038 0.001031 0.000190 0.000995 0.002759 0.000905 
+0.000513 0.000754 0.001344 0.000933 -0.000708 -0.002034 
+-0.001099 0.001398 -0.005788 0.004156 0.002604 -0.003635 
+0.002628 0.003792 0.007669 -0.005530 -0.001423 0.006552 
+-0.002482 -0.000324 -0.000608 -0.000553 -0.000942 0.000495 
+0.000155 -0.000935 0.001252 -0.003070 -0.007693 0.004773 
+-0.013063 -0.024277 0.011671 -0.027344 -0.033483 0.025983 
+-0.008200 0.003450 0.023379 0.017219 0.013615 0.011946 
+0.031656 0.014111 -0.001811 0.031134 0.007251 0.005207 
+0.026129 -0.008215 0.023953 0.023843 -0.004578 0.027521 
+0.041380 0.085202 -0.080439 0.000797 0.000749 0.001355 
+-0.002615 -0.004035 0.001562 -0.002474 -0.003024 -0.000011 
+0.000588 0.002665 0.000643 -0.000149 0.005191 -0.001175 
+-0.001005 -0.000618 -0.000840 -0.002857 -0.005897 0.000061 
+0.001007 -0.002031 -0.001665 0.000836 -0.001321 -0.000485 
+0.004026 -0.005128 0.003923 0.002603 -0.004506 0.002553 
+0.001229 0.006217 -0.001604 0.008247 0.010158 0.000349 
+0.012953 0.012517 0.000040 0.013813 0.003956 -0.000062 
+0.025575 0.010238 -0.004074 -0.004436 0.006786 0.004254 
+-0.002260 -0.017115 0.008777 -0.010642 -0.032333 0.018388 
+-0.013726 -0.025494 0.025540 -0.006448 -0.002223 0.008893 
+-0.000459 0.003654 -0.001071 0.001995 0.000414 -0.001961 
+-0.002357 -0.004933 -0.002545 -0.002231 -0.006140 -0.002229 
+-0.001965 0.001737 -0.002389 -0.001595 0.008406 -0.001833 
+-0.004798 0.008018 -0.003681 -0.003704 0.007454 0.006048 
+-0.019868 0.013400 0.015368 -0.026757 0.022333 0.004132 
+-0.004629 0.015341 -0.000654 0.004992 -0.005753 0.002083 
+-0.009741 -0.025691 -0.000531 -0.018134 -0.062438 0.006210 
+0.014995 -0.094851 -0.018343 0.027556 0.013618 -0.004396 
+-0.017686 0.055839 0.022924 -0.005329 0.005416 -0.001770 
+0.001891 -0.006979 -0.003914 0.002057 -0.013939 0.008706 
+-0.001818 -0.014308 0.011445 -0.004894 -0.009771 0.008689 
+-0.006599 -0.004491 0.004352 -0.005456 0.001035 0.000536 
+0.000953 0.004147 0.001084 0.005249 -0.007318 0.003983 
+0.005148 -0.020747 0.001066 -0.007341 -0.013290 0.004661 
+-0.017061 0.006309 -0.001653 -0.019522 0.021173 -0.003468 
+-0.012055 0.020867 -0.001707 -0.011759 0.004799 0.005217 
+-0.002842 -0.003312 0.000540 -0.000881 -0.001235 -0.001634 
+-0.002426 0.001248 -0.001401 -0.002486 0.000049 -0.003723 
+0.001090 -0.003170 -0.007548 0.002886 -0.004585 -0.004868 
+-0.002015 0.001140 0.000775 -0.003527 0.006214 -0.002708 
+-0.003669 -0.002300 0.006524 -0.008574 -0.006143 0.003298 
+-0.005823 -0.001779 0.001805 -0.001942 0.000660 0.000445 
+0.001282 -0.003120 0.001325 -0.000042 -0.004641 0.002847 
+0.000968 -0.001660 0.002086 0.006726 0.002733 0.001253 
+0.013971 0.002632 0.007790 -0.004326 -0.004523 0.013631 
+0.007979 -0.034451 0.003783 0.000979 -0.008759 0.006968 
+-0.030658 0.030111 -0.053315 0.077547 -0.001622 -0.055322 
+-0.015887 -0.009029 -0.025793 -0.005850 0.000091 -0.006452 
+-0.000600 -0.001933 0.001471 -0.006296 -0.000876 0.007554 
+-0.006301 0.001016 0.005163 -0.001771 0.001151 0.000950 
+0.002310 -0.002701 0.001591 -0.002221 -0.004358 -0.000653 
+-0.005830 -0.004792 0.001152 -0.006719 -0.002552 -0.000684 
+-0.003156 -0.001967 -0.002735 -0.004508 -0.003836 0.000197 
+-0.004166 -0.001641 -0.000412 -0.005408 -0.003932 -0.001190 
+-0.010635 -0.004546 -0.003025 -0.002986 -0.006041 0.000549 
+-0.002570 -0.022389 0.002378 -0.006569 0.020081 -0.007177 
+0.000584 -0.001975 0.001183 -0.000521 -0.010605 0.007981 
+-0.008957 -0.011898 0.013934 -0.009637 -0.011012 0.009636 
+-0.003816 -0.003043 0.001565 0.002588 0.000659 -0.001043 
+-0.000226 0.000921 -0.005575 -0.000945 0.002217 -0.002344 
+-0.001954 -0.001790 -0.000952 0.000141 -0.000736 0.003512 
+-0.001898 -0.005089 0.009308 -0.025587 -0.016579 0.015823 
+-0.017027 0.005808 -0.001777 0.000106 0.001859 0.005276 
+0.012784 -0.011009 -0.006971 0.013974 -0.010485 0.007370 
+0.005996 -0.018944 0.008101 0.004702 -0.024353 0.005531 
+0.051105 -0.043804 0.008333 0.006021 -0.012073 0.014142 
+-0.003897 0.003298 0.000033 -0.000059 -0.005840 -0.005532 
+0.000549 -0.000837 0.001609 -0.011841 -0.013207 0.014638 
+-0.013234 -0.015729 0.014336 -0.008920 -0.008793 0.007375 
+-0.004963 0.003070 -0.001304 0.006782 0.017378 -0.009461 
+0.022587 0.019923 0.002307 0.011474 0.003634 0.004655 
+0.002866 -0.000226 -0.000993 -0.001474 -0.002691 0.009329 
+-0.003011 -0.006255 0.016517 -0.003040 -0.001228 0.018750 
+-0.005982 0.004400 0.010783 -0.003568 -0.002772 -0.000465 
+0.002143 0.001041 -0.006673 0.000373 -0.010959 -0.002608 
+-0.000897 -0.003457 0.001605 -0.000689 -0.004479 -0.002450 
+-0.001070 -0.005772 -0.003986 -0.004525 -0.006063 -0.004174 
+-0.007133 -0.002534 -0.003516 -0.002684 0.001516 0.001287 
+-0.001577 -0.004419 0.011159 -0.005511 -0.002588 0.000937 
+-0.001025 0.002777 0.000859 0.002037 -0.000239 -0.000067 
+0.001863 -0.007378 -0.001714 -0.002246 -0.011051 -0.002313 
+-0.006524 -0.007766 -0.001990 -0.005108 -0.002058 -0.002458 
+0.001299 -0.001809 0.001738 0.000977 -0.009008 0.015246 
+-0.013991 -0.034983 -0.009119 -0.087636 -0.083303 0.003123 
+-0.122324 0.179467 -0.132034 0.016726 -0.049233 -0.011600 
+0.011658 -0.020506 -0.003106 -0.000677 -0.003000 -0.001661 
+0.001836 0.002613 -0.007152 0.000946 -0.000644 -0.000977 
+-0.001323 -0.002654 0.000971 -0.000317 -0.001619 -0.000327 
+0.001827 -0.002309 -0.000209 -0.000361 -0.003836 0.000336 
+-0.004008 -0.004178 -0.002804 -0.008772 -0.000771 -0.001041 
+-0.007843 -0.002773 0.001653 -0.001607 -0.001244 0.000233 
+-0.000434 -0.000797 -0.000109 -0.004338 -0.002137 -0.003160 
+-0.006085 -0.004379 -0.005337 -0.008611 -0.002365 -0.006103 
+-0.000981 -0.005822 0.001026 0.002673 0.008490 -0.005260 
+0.001448 0.001105 -0.001401 -0.003244 -0.003478 0.003451 
+-0.011038 -0.008539 0.005051 -0.012037 -0.010494 0.000636 
+-0.005264 -0.005955 -0.001893 0.001878 -0.000500 -0.003630 
+0.003184 0.003916 -0.006884 0.002237 0.000016 -0.003743 
+-0.000564 0.000744 -0.001763 0.001133 -0.005673 0.001961 
+0.006818 -0.016394 -0.003567 0.000465 -0.011434 -0.001167 
+-0.000105 -0.003732 -0.001971 0.001227 -0.004102 -0.001043 
+0.002658 -0.006686 -0.000656 0.010075 -0.005918 -0.004805 
+0.009382 0.006723 -0.011036 0.004660 0.032054 -0.077242 
+-0.029957 0.004416 0.005141 0.005372 -0.006644 0.033891 
+0.001209 -0.002137 -0.006241 0.000510 0.002049 -0.010801 
+0.000120 0.009305 -0.008545 -0.008342 0.004839 0.001441 
+-0.017099 -0.005154 0.005906 -0.014967 -0.006881 0.002845 
+-0.002254 0.003067 -0.000816 0.008314 -0.004865 -0.008932 
+1.957747 -0.014085 -1.781690 0.020503 -0.012957 -0.016576 
+0.018769 -0.011530 -0.015963 0.017103 -0.002948 -0.009995 
+0.020476 0.007051 0.002405 0.027563 0.011033 0.009644 
+0.025100 0.010165 0.002420 0.002198 0.004287 -0.011126 
+-0.010992 0.005088 -0.005771 0.000603 -0.000708 -0.003296 
+-0.003519 -0.003196 -0.000088 -0.001070 -0.002545 -0.000586 
+-0.000715 -0.002965 -0.001496 -0.004432 -0.003287 -0.003429 
+-0.005751 -0.000787 -0.000196 -0.004917 0.000760 0.004254 
+-0.002048 -0.004495 0.006320 0.002048 0.000215 0.003291 
+0.002152 0.002060 0.001314 0.000433 0.000659 0.000256 
+-0.001104 -0.001510 -0.000714 -0.005577 -0.002001 -0.002421 
+-0.012463 -0.001695 -0.004718 -0.013746 -0.000426 -0.003174 
+-0.006797 -0.004181 -0.001702 -0.002481 -0.012279 0.012263 
+-0.004113 -0.005778 0.011575 -0.004924 -0.002397 0.001515 
+-0.002913 0.004254 -0.006844 0.018399 -0.009417 0.012355 
+0.014751 -0.008126 0.000022 0.004987 -0.005109 -0.003208 
+0.001164 0.000850 -0.002036 -0.000277 0.000739 -0.000041 
+0.001235 -0.000571 -0.001266 0.002792 -0.001145 -0.003516 
+0.002847 0.000912 -0.000421 0.001069 0.000061 0.000413 
+0.001432 -0.002356 0.001141 0.002529 -0.002606 0.000765 
+0.000553 0.003203 0.002229 0.002964 0.003008 0.002103 
+0.002563 0.000724 0.000437 0.001139 -0.001468 -0.000424 
+0.001297 -0.004773 0.000697 0.003379 0.006675 -0.001612 
+0.019282 0.026174 -0.014218 0.015845 0.012091 -0.009242 
+0.004936 -0.002405 -0.002977 -0.004202 -0.005623 -0.003398 
+-0.008033 -0.007942 -0.003049 -0.008599 -0.007007 0.000811 
+-0.003052 -0.000955 0.000959 0.002469 0.000312 -0.000503 
+0.004234 -0.000861 -0.001582 0.004394 -0.001611 -0.003174 
+0.002634 -0.001618 -0.006568 0.002352 -0.006846 -0.006122 
+0.005019 -0.027043 -0.013317 -0.013545 -0.010515 -0.016147 
+-0.005053 0.006612 -0.003481 0.002630 0.009623 -0.006689 
+-0.008495 0.010028 -0.003300 0.002260 0.008998 -0.007116 
+0.024884 -0.015410 -0.033167 -0.001773 -0.024540 -0.009350 
+-0.013188 -0.011615 0.047035 0.004680 -0.005614 0.013095 
+0.005025 -0.001371 -0.003616 0.005994 0.004452 -0.005156 
+0.006634 0.005664 -0.004247 0.000994 0.006525 -0.003658 
+-0.010996 0.008262 0.000699 -0.017347 0.001676 0.009285 
+0.000490 -0.007574 0.003515 0.015403 -0.018056 -0.012418 
+1.822785 -3.451477 -1.940928 2.319502 -3.784232 -2.286307 
+2.615023 -3.394366 -2.037559 2.878049 -2.448781 -0.526829 
+3.200855 -1.055556 0.914530 3.315789 0.153846 1.364372 
+2.990099 0.826733 1.326733 0.012987 0.010508 0.009905 
+-0.004809 -0.003760 -0.002088 -0.004555 0.001631 -0.003889 
+0.000650 -0.001783 -0.001391 0.000387 -0.001387 -0.000694 
+-0.002485 -0.002173 0.000984 -0.007099 -0.002674 -0.004516 
+0.000662 -0.002503 -0.003747 0.002802 -0.000096 -0.003640 
+-0.001025 -0.001959 0.000322 -0.010034 -0.006937 0.008687 
+-0.008838 0.001270 -0.001356 -0.005077 0.008183 0.004065 
+0.002140 0.016379 0.010435 -0.002778 0.014097 0.006606 
+-0.014424 -0.007164 0.000273 -0.019267 -0.014475 0.005416 
+-0.007305 -0.010339 0.008843 -0.001237 -0.002026 0.003742 
+0.003023 0.001057 -0.001337 0.005373 0.003471 -0.001859 
+0.005787 -0.004057 0.004749 0.010201 -0.001402 -0.007071 
+0.011137 0.002047 -0.010484 0.009706 0.008795 -0.005871 
+0.001505 0.007300 -0.000478 -0.001993 0.001957 0.004177 
+-0.000188 -0.002165 0.001369 -0.000167 -0.001566 -0.000241 
+0.001111 -0.000196 0.000000 -0.000282 -0.000642 -0.000738 
+0.001115 -0.003681 0.000424 0.001364 -0.007290 0.001636 
+0.004603 -0.006253 0.002571 0.006752 -0.002333 -0.000093 
+0.001019 0.000751 0.000331 -0.003237 -0.000293 0.000216 
+-0.001534 -0.001065 0.000097 0.002752 0.004457 -0.001286 
+0.005035 0.011254 -0.002781 0.008537 0.008956 0.001102 
+0.007374 -0.004693 -0.003389 -0.000372 -0.009295 -0.003591 
+-0.005226 -0.010594 0.003296 -0.004067 -0.003700 0.004581 
+-0.002374 0.004003 -0.000857 -0.005324 0.006398 0.000672 
+-0.001962 0.003989 0.002900 0.001098 0.001483 -0.000067 
+0.003892 -0.003091 -0.001762 0.003443 -0.002273 -0.012410 
+0.006026 0.004294 -0.028432 -0.014341 -0.015464 0.003936 
+-0.006620 -0.011665 0.005903 -0.000895 -0.004038 0.003246 
+-0.017676 0.007808 0.007466 -0.007114 0.006671 -0.002686 
+0.000212 0.005761 0.017884 -0.039300 0.001124 0.077115 
+-0.002640 -0.004708 0.016681 0.003363 -0.005613 0.004822 
+0.002934 -0.002379 0.001948 0.004851 -0.000409 0.001440 
+0.005994 -0.003533 0.002349 0.002775 -0.000828 0.001699 
+-0.000330 0.003372 -0.004073 -0.009478 0.008385 0.007917 
+-0.001113 -0.012117 0.001117 0.784038 -2.802817 -1.225352 
+1.261411 -3.817427 -2.116183 1.671296 -4.004630 -2.587963 
+1.959302 -2.982558 -2.098837 0.021257 -0.000592 -0.002767 
+0.018691 0.003309 0.009683 0.022452 0.002788 0.014699 
+0.019084 -0.000355 0.020000 0.012076 0.006776 0.017542 
+0.003084 0.007575 -0.000890 -0.007165 0.000035 -0.013470 
+0.000024 -0.000170 0.000195 -0.000761 -0.002108 -0.000542 
+-0.003756 -0.002136 -0.002705 -0.002841 -0.003600 -0.003327 
+0.000585 0.001058 -0.010463 0.001243 -0.001036 -0.000819 
+-0.004759 -0.003885 -0.001032 -0.008908 -0.005637 0.003955 
+-0.003448 -0.005395 0.009251 0.006853 0.004449 0.001610 
+0.007869 -0.000874 -0.016981 0.002333 -0.011529 -0.024700 
+-0.001571 -0.015496 -0.021768 -0.004957 -0.009232 -0.012373 
+0.003536 -0.002245 0.000915 -0.000086 0.000454 0.001026 
+-0.000070 0.002913 0.002101 0.001280 -0.004036 0.003715 
+-0.001140 -0.005003 0.009836 0.005289 -0.005035 -0.002872 
+0.003369 0.000633 0.000805 -0.000988 0.005468 0.003510 
+-0.003944 0.004101 0.012915 0.002801 -0.000046 0.008492 
+0.000392 -0.002066 0.003650 -0.000863 -0.001593 0.002260 
+-0.000610 0.000095 0.004015 -0.001058 0.001343 0.003956 
+0.000742 -0.001351 -0.001510 0.002134 -0.004014 0.000291 
+0.000842 -0.004062 0.002049 0.000760 -0.011224 0.003147 
+-0.005447 -0.013848 0.001502 -0.010564 -0.007849 0.007347 
+-0.007083 -0.002381 0.004040 -0.006316 -0.001050 0.000497 
+-0.004621 -0.000568 -0.001170 0.001245 -0.000718 0.000616 
+0.007531 -0.004537 0.000199 0.002984 -0.006686 -0.001456 
+-0.001365 -0.003619 0.002693 -0.002201 -0.000728 0.000384 
+-0.002444 0.002090 -0.001917 -0.003436 0.001878 -0.001381 
+-0.007996 0.001712 0.001747 -0.001978 -0.002504 0.006648 
+-0.004959 -0.002293 -0.000904 0.005253 -0.007070 -0.006207 
+0.012726 0.005121 -0.028797 -0.001711 -0.015558 0.009600 
+-0.025376 -0.046144 0.034020 -0.017590 -0.023125 0.020875 
+0.000464 0.004930 0.007717 -0.005222 0.018575 -0.000680 
+-0.056513 0.015950 0.042058 -0.006939 0.005521 0.007931 
+0.001280 -0.001519 -0.000965 -0.000038 -0.004724 0.000344 
+-0.000975 -0.004569 -0.001304 0.001298 -0.005564 -0.000705 
+0.004361 -0.008647 -0.000904 0.003178 -0.004913 0.001056 
+-0.001008 0.004428 -0.002747 -0.007321 0.008024 0.000558 
+-0.006301 -0.006550 -0.001585 0.002125 -0.023888 -0.018422 
+0.558824 -4.141177 -2.376471 0.472603 -4.219178 -2.760274 
+0.012947 -0.013074 -0.019945 0.002357 -0.001003 0.001218 
+-0.006984 0.003810 0.006984 -0.004180 -0.001004 -0.000859 
+0.000924 0.000359 -0.000888 -0.000383 0.000435 0.003287 
+-0.003693 0.002268 0.000857 -0.003544 0.001421 -0.005301 
+-0.003212 0.000678 -0.001411 -0.001585 -0.002571 -0.001905 
+-0.000616 -0.000567 -0.001490 -0.001520 0.002027 -0.009429 
+0.001538 0.015363 -0.009829 -0.003911 0.008906 -0.007280 
+-0.000020 -0.000724 -0.002393 0.000790 0.000570 -0.001641 
+0.006272 0.002613 -0.004271 0.009907 -0.001017 -0.011200 
+0.012761 -0.004197 -0.018322 0.008937 -0.009839 -0.028494 
+0.009614 -0.017962 -0.025340 0.005717 -0.014824 -0.015093 
+-0.005897 -0.008974 -0.005046 -0.008680 -0.007580 0.002665 
+-0.009534 -0.006712 0.005924 -0.009800 -0.011511 0.006023 
+-0.008333 -0.014634 0.001591 0.001373 -0.007530 0.007557 
+0.005117 -0.002772 0.000119 -0.005706 -0.006937 0.018908 
+-0.002461 0.022806 0.003991 -0.004350 0.021400 0.008736 
+-0.002846 0.010535 0.004804 -0.002950 -0.001908 0.004789 
+0.002013 -0.001393 0.001288 0.001460 -0.003382 -0.006577 
+0.010021 0.006735 -0.001011 0.003395 0.006782 0.001422 
+-0.000941 0.001280 0.000061 0.002319 -0.005864 0.010103 
+-0.001105 0.003124 0.010100 -0.001195 0.001488 0.010235 
+-0.003108 0.001114 0.006633 -0.004416 -0.002126 0.002458 
+-0.000857 -0.000905 -0.000243 0.002225 0.000425 -0.001561 
+0.004338 -0.000394 -0.002059 0.004838 -0.004544 0.000539 
+0.002837 -0.003970 0.001898 0.001771 -0.004004 0.001130 
+-0.001401 -0.007936 -0.002451 0.002750 -0.012691 0.002112 
+-0.005217 -0.008075 -0.000449 0.001092 0.004601 0.000378 
+-0.004737 0.004432 -0.002514 -0.002195 -0.004561 0.000444 
+-0.001903 -0.010047 -0.004807 0.017242 0.022362 -0.021092 
+0.015165 -0.010110 0.040000 -0.002447 -0.007228 0.015419 
+0.003205 -0.005859 0.007690 -0.007119 -0.012956 0.023354 
+-0.004267 -0.006324 0.014633 0.001467 -0.005804 0.002222 
+0.000943 -0.005727 -0.001739 -0.001289 -0.005162 -0.002428 
+-0.002419 -0.004653 -0.002949 -0.002858 -0.007666 -0.002573 
+-0.003565 -0.010798 -0.002566 -0.002882 -0.008245 -0.003878 
+-0.003313 -0.000929 -0.001875 -0.004615 0.006406 0.001145 
+-0.005501 -0.000552 -0.001354 -0.002504 -0.017658 -0.013597 
+-0.000686 -0.025580 -0.025142 -0.003856 -0.021631 -0.031787 
+-0.007425 -0.000687 -0.031606 -0.011142 0.007915 0.004238 
+-0.002491 0.005487 0.010863 0.005212 -0.002842 -0.000273 
+0.003222 -0.006263 -0.008576 -0.000563 -0.003465 -0.005790 
+0.001860 -0.002481 0.000310 -0.001712 -0.007970 0.002568 
+-0.004218 -0.003334 -0.004174 -0.001094 -0.001100 -0.003724 
+-0.000843 0.007168 -0.008496 0.008440 -0.002145 -0.008046 
+0.002112 0.000680 -0.012481 0.003493 0.002245 -0.008949 
+0.003694 0.001445 -0.005296 0.002945 0.000025 -0.001918 
+0.001179 -0.000982 -0.002554 0.007269 -0.004128 0.000574 
+0.008918 -0.018180 -0.006323 0.010624 -0.018096 -0.011505 
+0.007258 -0.007681 -0.020435 0.008295 -0.001214 -0.017855 
+0.002165 -0.001578 -0.011897 0.001234 -0.001906 -0.003060 
+-0.004673 -0.001146 0.003584 -0.005698 -0.005156 0.000000 
+-0.006592 0.001827 0.001573 0.004574 -0.007996 -0.006267 
+0.004756 -0.002651 0.001141 -0.017469 0.045099 0.028893 
+-0.019305 0.048103 0.023568 -0.016387 0.037970 0.013362 
+-0.019053 0.018993 0.006858 -0.009406 -0.001260 0.016750 
+0.007430 -0.014373 0.003593 0.023411 0.008639 -0.000037 
+0.008529 0.012763 -0.003971 -0.001857 0.000394 0.002529 
+-0.003968 0.000834 0.004138 -0.005733 -0.002896 0.002076 
+-0.001256 -0.002460 0.006027 -0.001023 -0.001970 0.009228 
+-0.001857 0.000531 0.008496 -0.001208 0.000104 0.004860 
+0.001693 0.000631 -0.001782 0.008476 0.002851 -0.003392 
+0.010702 0.004444 -0.002181 0.005938 0.003525 0.001885 
+0.001083 -0.000983 0.000288 -0.000794 -0.009572 -0.003694 
+-0.002140 -0.017560 0.000480 -0.005593 -0.016739 -0.006329 
+-0.001464 0.002002 -0.007072 -0.003026 0.019373 0.003790 
+0.001307 0.013329 -0.000747 -0.000809 0.000211 0.000082 
+-0.001116 -0.010283 -0.003729 0.000815 0.001530 -0.005823 
+0.018492 0.002560 -0.000068 0.012366 -0.000396 -0.004028 
+0.002306 -0.001108 0.000348 -0.007429 0.000558 0.002049 
+-0.007280 0.000536 0.001622 -0.000438 -0.007664 0.001108 
+0.001256 -0.006359 -0.005045 0.004500 -0.002975 -0.003798 
+0.007896 -0.002195 -0.001520 0.009016 -0.002142 0.000809 
+0.003695 -0.000450 0.000519 -0.003713 0.000892 0.000365 
+-0.005511 0.002681 0.002019 0.001660 0.001674 0.001941 
+0.005886 -0.004639 -0.000954 -0.009780 -0.008420 -0.009169 
+-0.013454 -0.014365 -0.010725 0.012763 0.003894 -0.009132 
+-0.009933 0.006348 -0.009925 -0.003177 0.003537 0.004645 
+0.000977 0.000717 0.008473 0.002683 -0.004249 0.006222 
+0.004216 -0.003802 0.000851 0.001428 -0.004775 0.001306 
+0.004587 -0.005032 0.002607 0.002904 -0.001993 0.004560 
+0.000121 -0.000962 -0.000770 -0.000864 -0.000387 -0.003226 
+0.002368 0.002477 -0.007403 0.003120 -0.001126 -0.008409 
+0.004867 -0.002104 -0.007317 0.004792 0.000848 -0.003102 
+0.000813 0.001517 -0.004497 -0.000192 -0.000421 -0.001452 
+-0.000299 -0.000769 -0.001026 0.000939 -0.003766 -0.004377 
+0.006846 -0.001862 -0.009221 0.006058 0.006150 -0.000439 
+0.010004 0.003624 -0.003864 0.008438 0.010587 -0.010849 
+0.005441 0.012236 -0.006184 0.010357 0.007856 0.001430 
+-0.000037 -0.000314 0.000710 -0.002269 -0.002901 0.000558 
+-0.000350 0.000575 0.001409 -0.000574 -0.002125 -0.002798 
+-0.030396 0.040513 0.014219 -3.158416 6.475247 2.574257 
+-2.554795 5.794520 2.938356 -2.398693 4.483660 3.013072 
+-0.030925 0.024706 0.016334 -0.016101 0.004336 0.023877 
+0.005870 -0.023978 0.001801 0.014951 0.002407 -0.012698 
+0.000364 -0.002243 -0.001240 -0.003596 0.000685 0.003365 
+0.001158 -0.000035 -0.001008 0.010253 0.000171 -0.013221 
+-0.000884 0.001410 0.002483 -0.007310 0.001632 0.011929 
+-0.004262 0.003378 0.012643 0.001165 0.000647 0.007050 
+0.009458 -0.000313 -0.001554 0.014339 0.008410 -0.003451 
+0.010128 0.010918 0.002762 0.000533 0.001627 0.001597 
+0.000452 -0.001427 -0.000758 -0.007335 0.000319 0.007243 
+-0.002281 -0.006795 0.010494 -0.001852 -0.005729 0.000373 
+0.005808 0.020188 0.013795 0.010491 0.037753 0.013513 
+0.008322 0.037321 0.000528 0.002025 0.023846 -0.005087 
+0.000095 0.002793 -0.000215 -0.008184 -0.007431 -0.004798 
+-0.000896 -0.010525 0.009462 -0.002612 -0.004783 0.004917 
+-0.004514 0.002247 -0.001200 0.001522 -0.002611 -0.003993 
+0.003764 -0.004037 -0.007220 0.003304 -0.001997 -0.003528 
+-0.000983 0.000047 0.000645 0.007007 0.001438 0.001040 
+0.013090 -0.003709 0.000800 0.010158 -0.005804 0.001270 
+0.006044 0.000353 0.006406 0.000049 0.004928 0.003471 
+-0.012034 -0.008624 -0.002282 -0.016352 -0.009077 -0.007756 
+-0.014731 0.002762 -0.006216 -0.010934 0.024762 -0.028622 
+-0.022082 0.020237 -0.010689 -0.006279 0.006438 0.002836 
+0.004162 -0.000058 0.008566 0.007104 -0.001337 0.005785 
+-0.001053 0.001862 0.002659 0.002054 -0.001357 0.000784 
+-0.001386 0.000883 0.001346 -0.002582 0.000557 0.006096 
+-0.001829 -0.000557 0.008030 -0.000575 0.000454 0.001213 
+0.000679 -0.000619 0.000283 -0.001480 0.000767 -0.002083 
+-0.004120 0.001873 -0.000806 -0.004065 0.000899 -0.001525 
+-0.000125 0.000747 -0.004603 0.004482 -0.001919 -0.006556 
+0.006446 0.001222 -0.003941 0.001805 -0.000675 -0.000495 
+0.000838 -0.001589 -0.000300 -0.000455 0.000228 -0.005902 
+-0.000426 0.003151 0.000541 -0.000528 0.001659 0.000372 
+0.000942 0.000609 0.000375 -0.000518 -0.000005 0.000462 
+0.000433 -0.000683 -0.001569 0.002905 -0.000521 -0.003548 
+0.003384 -0.000630 -0.003295 0.000275 0.000354 0.001131 
+-0.006344 0.001090 0.003929 -0.009657 0.014999 0.014457 
+-2.439560 6.307693 2.109890 -3.038961 7.090909 3.837662 
+-2.723404 6.436170 4.085106 -2.160714 5.130952 3.785714 
+-0.024748 0.032762 0.023341 -0.011795 0.007403 0.017765 
+0.008299 -0.020438 -0.001140 -0.009469 -0.010355 -0.013455 
+-0.008700 -0.000550 0.003709 -0.006851 -0.000597 0.010015 
+-0.000417 -0.000379 -0.007843 0.018979 0.016151 -0.015951 
+0.009003 0.005429 -0.005444 -0.000491 0.000688 0.001165 
+-0.003855 0.001891 0.002632 -0.000456 0.001922 0.002047 
+0.003311 -0.000588 0.002300 0.005066 0.004460 -0.001490 
+0.000487 0.008232 -0.005745 -0.002941 0.002614 -0.008561 
+-0.008311 0.002878 -0.001897 -0.005420 0.001875 0.001316 
+-0.004599 -0.015784 0.004716 0.006065 -0.000549 0.003663 
+0.014205 0.030174 0.013358 1.047619 5.206349 1.888889 
+0.487603 6.239669 1.950413 0.000041 0.045602 0.020651 
+-0.006466 0.009217 0.006570 -0.007881 -0.015524 -0.001894 
+-0.005833 -0.016384 0.001003 -0.006120 -0.004767 -0.000197 
+-0.008093 -0.001657 0.000490 -0.003202 -0.004388 0.005728 
+0.008556 -0.011057 0.005999 0.018468 -0.002918 0.007967 
+0.004527 0.003176 0.004150 0.000959 0.000082 0.000415 
+0.003085 -0.002440 -0.012384 0.000617 0.000009 0.000371 
+0.003293 0.011326 -0.022704 -0.000315 0.000654 -0.003660 
+-0.009535 -0.002596 -0.009860 -0.007201 -0.013183 -0.022220 
+-0.022452 -0.013149 -0.027074 -0.018299 0.014801 -0.015230 
+0.000058 0.005652 0.008679 0.004090 0.001721 0.005422 
+-0.003487 -0.007164 -0.003276 -0.004103 -0.013199 0.011178 
+0.002256 -0.000555 0.005277 0.004142 -0.003854 -0.001150 
+0.001435 -0.002227 -0.002606 -0.005444 0.002251 -0.001845 
+-0.007489 -0.002467 -0.002621 -0.000265 -0.001217 -0.003437 
+-0.003583 -0.000233 -0.002562 -0.003318 0.001595 -0.005880 
+-0.005952 0.001125 -0.003491 -0.002127 0.003119 0.001559 
+-0.001874 0.002485 -0.000822 0.005510 0.002501 0.001690 
+0.009653 0.000413 -0.007240 0.004841 -0.003921 -0.002202 
+0.000155 -0.000170 0.000450 0.001800 0.003507 -0.000331 
+0.001956 -0.001217 0.001469 0.000794 0.000749 0.000663 
+0.000331 -0.001050 0.001537 -0.002895 -0.000737 -0.000889 
+-0.005617 -0.000604 0.001703 -0.003058 -0.002063 -0.001653 
+0.001410 -0.000163 -0.001751 0.000504 0.001167 0.004869 
+-0.008687 0.005140 0.014232 -0.023291 0.026445 0.029575 
+-2.544828 6.434483 3.758621 -2.248869 7.217195 4.049774 
+-1.920635 6.599206 3.960317 -1.355000 5.490000 3.625000 
+-0.013280 0.033278 0.023055 0.007355 -0.017855 0.013004 
+-0.005161 -0.000503 -0.009666 -0.025607 -0.004768 -0.005494 
+-0.010964 0.007974 0.002800 -0.004162 0.001113 -0.001610 
+-0.000493 0.007447 -0.007881 0.000598 -0.000509 -0.002697 
+0.005256 -0.002323 0.002404 0.004858 -0.003925 0.002054 
+-0.000159 -0.007155 0.001960 0.000124 -0.003762 0.008613 
+-0.003922 -0.008262 0.010076 -0.010319 -0.004557 0.004017 
+-0.010548 -0.001278 -0.004615 -0.006241 0.000689 0.005072 
+-0.005236 0.007169 0.005683 -0.004211 -0.010598 -0.004813 
+-0.001486 -0.014474 -0.004247 0.001688 0.007858 0.000091 
+1.566929 4.314960 1.653543 0.937500 6.962500 3.125000 
+0.379518 7.325301 3.120482 -0.028169 4.943662 3.197183 
+-0.005239 0.013347 0.023428 -0.010631 -0.002763 0.006652 
+-0.004929 -0.006408 0.002236 -0.000810 0.004985 -0.002314 
+-0.000121 0.003467 -0.003399 0.001590 -0.006820 0.008835 
+-0.006680 -0.033701 0.004856 0.002887 -0.002756 0.005744 
+0.009621 0.000494 -0.014557 0.007697 -0.003621 -0.012609 
+0.005177 -0.002457 -0.005283 -0.003185 0.001212 -0.000061 
+-0.008201 0.003757 -0.000319 -0.010500 0.001815 -0.002504 
+-0.007031 -0.003283 -0.002353 0.000259 -0.001774 -0.004991 
+-0.000493 -0.002129 -0.004431 -0.001827 -0.002481 -0.004609 
+0.001622 -0.009305 -0.004122 -0.002207 -0.015436 -0.000139 
+-0.008636 -0.012786 0.009501 0.002532 -0.010974 0.006087 
+0.003355 -0.010561 -0.005047 0.001811 -0.009904 -0.006128 
+-0.002057 -0.003649 -0.004047 0.001969 0.001790 -0.006265 
+-0.001596 0.000218 -0.002428 0.000278 0.002477 -0.001136 
+-0.002884 0.001993 -0.005995 -0.002076 0.003893 -0.001111 
+-0.004043 0.000507 -0.001683 0.001036 -0.003120 -0.002408 
+0.004538 -0.006811 -0.003943 0.006643 -0.005047 -0.004783 
+0.003820 -0.001662 -0.005705 0.003234 0.001706 -0.004044 
+0.004289 0.001767 -0.002642 0.007121 0.000345 -0.001677 
+0.012522 0.001104 -0.004262 0.009382 0.001629 -0.007363 
+0.000692 -0.000803 -0.001932 -0.001000 0.000128 0.002729 
+0.002791 0.001085 0.000000 0.005197 -0.007521 -0.008618 
+0.003735 -0.009139 0.003309 -0.012289 -0.000111 0.021055 
+-2.742515 1.640719 3.568862 -3.619512 4.317073 4.385366 
+-2.907143 6.417857 4.325000 -2.234568 6.969136 4.033951 
+-1.606061 6.555555 3.659933 -1.000000 5.769231 3.163461 
+-0.011296 0.044921 0.020069 0.000082 -0.055714 -0.000182 
+0.005935 -0.031294 -0.014029 -0.013044 0.000280 0.004942 
+-0.004790 0.006341 -0.006129 0.000592 0.001975 -0.012253 
+-0.001945 -0.005298 -0.007011 0.000476 0.002084 0.003843 
+0.004220 0.002804 0.009083 0.002957 0.002778 0.004035 
+0.000054 -0.002044 -0.002670 -0.005625 -0.011888 -0.003543 
+-0.007386 -0.017659 0.010083 -0.021902 -0.007701 0.012091 
+0.002548 0.007052 -0.005875 0.018938 0.038059 0.003492 
+0.010594 0.011764 -0.004399 -0.006080 -0.020568 -0.001864 
+-0.003551 -0.005512 0.009964 0.003407 0.019223 -0.010884 
+1.793103 6.813793 2.889655 1.261803 8.369099 3.540772 
+0.819672 8.122951 3.393443 0.355191 6.371585 3.693989 
+0.009174 0.017992 0.034296 -0.003258 0.001909 0.020296 
+-0.007665 -0.014956 0.013089 -0.002788 -0.013939 0.012866 
+-0.004789 -0.008821 0.004773 0.011099 -0.018008 0.000735 
+0.004694 -0.001587 0.001264 -0.005714 0.000650 -0.005026 
+0.000204 -0.001641 -0.009994 0.008688 -0.003660 -0.009446 
+0.005633 -0.002004 -0.003011 -0.004860 0.002599 0.004324 
+-0.011511 0.004195 0.006796 -0.008664 -0.000540 0.004753 
+-0.001800 0.000103 -0.001996 0.000692 -0.000723 -0.004961 
+-0.002537 -0.002197 -0.004920 -0.005997 -0.003601 -0.003732 
+-0.005425 -0.004102 -0.002249 0.001158 -0.003711 0.000969 
+0.001275 -0.000146 -0.001521 0.001206 0.001093 -0.000051 
+-0.001821 -0.007068 -0.001892 -0.001451 -0.009321 -0.000216 
+-0.006350 -0.002816 -0.001379 -0.001369 -0.000635 -0.004799 
+0.001165 -0.000095 -0.005585 -0.001687 -0.000097 -0.004055 
+-0.001836 0.002952 0.001331 -0.004135 0.001642 0.004962 
+0.000672 -0.001242 0.000284 -0.000256 -0.004786 -0.000256 
+0.012612 -0.002991 -0.002275 0.003129 0.000749 -0.010040 
+0.002420 0.003867 -0.004866 0.003026 0.003487 -0.001974 
+0.001071 0.001609 -0.001228 0.000479 0.001102 -0.000860 
+0.000844 0.000380 -0.004316 0.002997 -0.002968 -0.006656 
+-0.002445 -0.004640 -0.004219 -0.003520 -0.004436 0.001028 
+0.004424 -0.000490 -0.001081 0.016281 -0.006017 -0.012033 
+0.006360 -0.015834 -0.011150 -1.739645 -1.337278 2.254438 
+-3.199170 3.282158 3.352697 -3.639566 4.756098 3.850949 
+-3.295745 6.185106 3.846808 -2.821177 6.990588 3.689412 
+-1.953069 7.231047 3.169675 -0.827815 6.741722 2.013245 
+-0.002823 0.002816 0.015311 -0.003997 -0.002009 0.001503 
+0.014839 0.000073 -0.001250 0.010088 0.014128 -0.004132 
+0.002429 -0.002223 0.001315 -0.010353 -0.001987 0.006378 
+0.004655 -0.003218 0.000572 0.000943 0.002526 -0.008368 
+0.000500 -0.000872 -0.002192 -0.001647 0.001084 0.000331 
+-0.002462 -0.001187 -0.001082 0.000643 -0.002516 -0.006346 
+-0.003276 -0.011515 -0.006317 -0.010748 -0.008959 0.005698 
+-0.002568 0.006970 0.011633 -0.001561 0.015006 -0.004604 
+0.005016 -0.001110 -0.000721 0.013605 -0.032053 0.007147 
+-0.010339 -0.000225 0.033637 -0.014762 0.020221 -0.033274 
+1.806630 8.044199 2.823205 1.922840 8.635802 3.580247 
+1.801724 8.287356 3.517241 2.019084 6.713740 3.782443 
+3.505050 3.373737 3.691919 3.632530 0.632530 2.813253 
+0.009764 -0.004018 0.021450 -0.008496 -0.017237 0.004165 
+-0.000538 -0.001927 -0.004291 0.008590 -0.004006 0.007125 
+0.004301 -0.000926 0.005354 -0.004036 0.001560 0.002151 
+-0.001506 0.000336 0.000745 0.009579 0.000266 -0.001506 
+0.010256 0.000865 -0.006456 0.002627 -0.000010 -0.001739 
+-0.002269 -0.003044 0.001226 0.004195 -0.000938 0.001311 
+0.005200 -0.002056 0.001177 0.003248 -0.003256 -0.001215 
+0.001269 0.000031 -0.006592 -0.001602 0.000569 -0.006085 
+0.001292 0.001839 -0.003143 0.005082 0.001960 -0.002494 
+0.007680 0.003618 -0.002412 -0.000144 0.003361 -0.001874 
+0.000947 0.000558 -0.004364 -0.001580 -0.001418 -0.003586 
+-0.000511 -0.000876 -0.003883 0.003357 -0.000544 -0.006345 
+0.000310 0.003529 -0.008869 -0.004397 0.005082 -0.011307 
+0.001158 0.000937 -0.000129 0.002154 -0.003692 0.006893 
+0.002164 -0.000391 0.000623 -0.000937 -0.000034 -0.002506 
+0.003797 -0.000188 -0.003064 0.005457 0.004202 0.001364 
+0.006982 0.001465 -0.004238 0.003817 -0.001076 -0.002438 
+-0.000572 -0.000216 -0.000501 -0.000055 0.002670 0.001163 
+0.000717 0.004853 -0.000049 0.004232 0.001989 -0.003568 
+-0.000811 -0.005022 -0.002047 -0.000528 -0.004971 -0.001813 
+-0.002632 0.003444 -0.002545 0.005370 -0.001400 -0.003042 
+0.018647 -0.025159 -0.012044 -0.259259 -5.348148 0.311111 
+-2.625641 1.358974 2.297436 -3.331269 5.517028 2.817338 
+-3.351981 6.850816 2.986014 -3.209677 7.725806 2.973118 
+-2.673684 8.057895 2.442105 -0.020167 0.023561 0.000757 
+-0.016578 -0.027521 -0.033253 -0.001113 0.003869 0.007686 
+0.012369 0.037807 0.011403 -0.009168 0.014920 0.002430 
+-0.001173 -0.000806 -0.001206 -0.017113 -0.011028 -0.000989 
+-0.013667 0.005891 0.010956 0.002025 -0.003710 0.000238 
+0.002821 -0.006994 -0.003439 0.001237 -0.005200 0.000814 
+0.001393 -0.001114 0.004116 0.000287 0.001713 0.001561 
+0.001378 0.000686 -0.004747 0.002305 -0.005191 -0.008783 
+0.002098 -0.003878 -0.001571 -0.006345 0.010066 0.000348 
+0.002948 -0.001372 0.002148 -0.014540 -0.030193 0.014877 
+0.056300 -0.096386 0.022580 0.012202 0.038376 0.018377 
+2.477157 8.705584 3.304569 2.997436 8.617949 3.392308 
+3.160521 8.232104 3.251627 3.593583 7.114973 3.278075 
+5.134387 4.664032 3.553360 5.565476 1.666667 3.238095 
+0.024643 -0.000967 0.028162 0.009475 0.004866 -0.002907 
+0.004893 -0.006380 -0.007116 0.001293 -0.000202 0.001724 
+-0.003838 0.002799 0.003607 -0.003671 -0.002998 0.003037 
+0.000138 0.001123 0.002429 0.006950 0.006676 0.001395 
+0.005525 0.008111 -0.003997 0.006960 0.003424 0.001712 
+0.003445 0.000025 0.004382 0.004452 0.000356 0.006623 
+0.002454 0.000512 0.002406 -0.001899 -0.001325 -0.003236 
+-0.002523 0.000781 -0.005676 -0.000872 0.000458 -0.002321 
+-0.001970 -0.001461 0.000267 -0.001293 -0.002236 -0.001320 
+0.002173 -0.001853 -0.003429 0.001998 0.001482 -0.002901 
+0.000626 0.000165 -0.000593 -0.002510 0.000550 -0.001853 
+-0.001109 -0.000112 -0.002831 0.005869 0.003248 -0.004296 
+-0.001126 0.001083 -0.009005 -0.003710 0.005906 -0.010108 
+-0.000021 0.001219 -0.000490 0.003287 -0.004126 -0.001229 
+-0.001271 -0.004348 -0.001102 -0.004380 0.002857 -0.003228 
+-0.002455 0.010198 0.000267 0.000031 0.011455 -0.002391 
+0.001743 0.002551 0.002570 0.004115 0.001210 -0.004911 
+0.003705 0.002852 -0.005437 0.002590 -0.001600 -0.002740 
+0.002020 0.004494 0.004411 0.000785 0.000501 0.005095 
+-0.000809 -0.000063 -0.000881 -0.001432 0.000117 -0.004489 
+0.001101 0.003570 -0.001083 -0.001701 0.002735 -0.000970 
+0.004793 -0.000401 -0.003413 0.008845 -0.014063 -0.020935 
+-0.000972 -0.028032 -0.018889 -1.236641 4.572519 0.427481 
+-2.520231 5.797688 1.601156 -3.089744 6.128205 1.903846 
+-0.037738 0.036671 0.012796 0.009289 -0.039410 -0.021283 
+-0.001305 -0.018460 -0.024520 0.002220 0.001078 -0.002747 
+-0.013056 0.010005 -0.004241 -0.000951 0.001415 -0.000715 
+-0.004872 -0.001222 -0.003717 -0.023602 -0.023651 0.002273 
+-0.008766 -0.023502 0.009857 -0.000234 0.000154 -0.002582 
+0.000792 0.004893 -0.006277 0.007853 0.001260 -0.005792 
+0.006702 -0.004025 -0.002228 0.004037 -0.004531 0.000504 
+0.003289 -0.006356 0.002132 0.004418 -0.011153 0.002941 
+-0.006456 -0.012037 -0.003693 0.000849 0.004237 0.003796 
+0.011735 0.000957 0.010054 -0.008797 -0.022313 0.017068 
+5.719298 -9.912281 0.263158 4.722222 5.740741 9.759259 
+3.592592 9.481482 4.370370 4.013124 8.753281 3.385827 
+4.286316 8.092631 3.267368 4.536160 7.154613 3.199501 
+4.957983 5.542017 3.197479 4.677419 2.919355 3.266129 
+0.021274 0.002955 0.009181 0.003193 -0.005446 -0.010481 
+0.003824 -0.004632 -0.004195 -0.001326 0.000238 -0.001674 
+-0.003446 0.003255 -0.002297 -0.001279 0.007946 0.005465 
+0.004981 0.003946 0.004938 0.001842 0.003009 -0.000508 
+-0.001368 0.004165 0.002049 -0.001463 0.001994 0.003007 
+0.000083 -0.001732 0.002464 0.001227 -0.003955 0.001364 
+-0.003694 -0.003350 -0.002815 -0.002745 -0.000106 -0.006194 
+-0.000458 0.000202 -0.001364 0.000466 -0.003602 0.001822 
+-0.000642 -0.002419 0.004315 -0.000493 -0.000665 0.001362 
+-0.003779 0.000572 0.001293 -0.000089 -0.002764 -0.000975 
+-0.004500 0.002539 0.005048 -0.006195 -0.004049 0.002284 
+0.000105 -0.001329 0.001378 -0.000507 0.000259 -0.000943 
+-0.001391 0.001478 0.000000 -0.000195 -0.002223 -0.006380 
+0.002492 0.001064 -0.000706 0.002375 -0.000029 0.001479 
+0.002016 0.000065 0.000290 0.001366 0.001098 -0.003650 
+-0.000833 0.000885 -0.003800 0.005208 0.006317 -0.001664 
+0.004324 0.000432 0.000256 0.006120 0.002958 -0.003631 
+0.006898 0.001869 -0.006805 0.003165 0.000239 -0.003703 
+-0.003794 -0.003255 -0.000477 -0.000891 -0.006136 0.003346 
+0.004076 -0.003938 -0.002590 0.002729 -0.003478 0.001320 
+0.006535 0.000067 0.000670 -0.000362 -0.000128 0.002205 
+-0.004006 0.002141 -0.002091 0.002045 -0.000216 -0.000304 
+0.018492 0.004553 -0.011086 0.004325 -0.013129 -0.021068 
+0.038404 -0.037600 -0.018851 0.014524 -0.001826 -0.013317 
+-0.003229 -0.019129 0.006851 0.000147 0.002656 0.002491 
+0.004744 0.001409 0.000145 -0.000216 0.006489 -0.003650 
+0.000679 0.007996 -0.008690 0.016657 0.004355 -0.002985 
+0.007317 -0.005274 -0.011678 -0.010250 -0.012201 -0.019645 
+-0.014239 -0.015947 -0.003750 -0.003209 -0.001306 0.010376 
+0.000133 0.004029 0.010953 0.002092 0.000430 0.000332 
+0.004464 -0.005275 -0.008722 0.006820 -0.005720 -0.010000 
+0.000014 -0.001137 0.003178 -0.044874 -0.016142 0.018089 
+-0.015025 -0.021594 -0.002850 0.001581 0.000127 0.004783 
+0.005883 0.003661 0.006018 0.006070 -0.014261 0.000967 
+-0.053962 -0.016003 -0.004365 -0.005515 0.012115 0.010626 
+3.313253 7.421687 2.638554 4.360465 8.736434 3.011628 
+5.037543 7.935153 3.156996 5.582644 6.442149 3.140496 
+5.671052 4.835526 2.888158 4.913043 3.913043 3.152174 
+0.029773 0.022809 -0.013783 0.002010 0.003478 -0.014851 
+-0.000588 0.002995 -0.000158 0.003000 0.004638 -0.002580 
+0.008280 0.004038 -0.002056 0.008000 0.005695 0.002551 
+0.003817 0.003679 0.002092 0.000857 0.001364 0.001114 
+-0.000294 0.001137 0.003542 -0.003143 -0.005935 0.005377 
+-0.001016 -0.007524 -0.001293 -0.002097 -0.001469 -0.001744 
+-0.004247 0.003597 -0.002637 -0.001289 0.002634 -0.002409 
+-0.000123 -0.004170 0.001034 -0.001976 -0.006845 0.003009 
+-0.002209 -0.003975 0.002131 -0.002296 -0.001901 0.001870 
+-0.005876 -0.004724 0.002143 -0.008886 -0.007697 0.002531 
+-0.007602 -0.004363 -0.000350 -0.001628 -0.000892 -0.001387 
+-0.000094 -0.003434 -0.000418 -0.005100 -0.003621 0.001123 
+-0.005480 0.001603 0.000396 -0.000726 0.000484 -0.000242 
+-0.000979 0.005462 -0.003915 0.003629 0.005161 -0.002500 
+0.006416 -0.002406 -0.002823 0.004654 -0.003102 -0.002727 
+0.003083 0.002500 -0.003083 0.001145 -0.000883 0.000978 
+0.000191 0.001239 0.001477 -0.000348 -0.000338 0.000798 
+-0.000190 0.000746 0.000119 0.000718 0.001608 0.000411 
+0.000283 0.000332 -0.000372 0.000452 -0.003065 -0.001331 
+-0.000180 -0.003398 -0.002139 0.000848 -0.001532 0.000530 
+-0.000656 0.000938 -0.000009 -0.001983 0.001596 -0.004352 
+0.000009 0.000197 -0.006444 -0.001833 0.000552 -0.003537 
+0.005715 0.000973 -0.000635 0.009912 0.005969 -0.001836 
+0.013129 0.008072 -0.001671 0.011326 0.008594 -0.002600 
+0.001417 0.000112 0.005012 0.003550 0.002344 0.002282 
+-0.003958 0.012254 -0.002544 -0.007717 0.010132 -0.001176 
+0.006784 0.011449 -0.004869 0.003618 0.000645 -0.004617 
+-0.000894 0.000804 -0.004489 -0.000983 0.000232 -0.010719 
+-0.001261 0.009550 -0.011712 0.008587 0.004511 0.002136 
+0.005486 0.006029 0.002505 0.004792 0.003042 -0.001855 
+-0.002560 0.001650 -0.004172 0.003881 0.005786 -0.013433 
+0.010671 0.004348 -0.018459 -0.053333 -0.000552 0.000230 
+-0.016926 -0.012958 0.007131 -0.003243 -0.000910 0.001254 
+-0.003133 -0.000702 0.000047 0.000577 -0.003167 -0.006897 
+0.002715 -0.006790 -0.008414 0.000324 -0.012647 -0.014412 
+0.006030 0.000469 0.001573 1.989691 4.402062 1.463917 
+0.028138 0.010569 0.038304 0.041197 0.003500 0.020960 
+0.028019 0.004370 -0.006164 0.008629 0.004070 -0.017129 
+0.003380 -0.001644 -0.004621 -0.001890 0.001349 0.001221 
+-0.001850 0.005268 0.002577 -0.001111 -0.001882 0.003212 
+0.001405 0.002397 0.004793 -0.001091 -0.001305 -0.001006 
+-0.002028 -0.002469 -0.001471 -0.001083 -0.000417 -0.001083 
+-0.005086 -0.001826 0.006650 -0.000890 -0.004696 -0.000741 
+-0.001182 -0.007476 0.003408 -0.002709 0.000548 0.003225 
+0.004257 0.000426 -0.001026 0.003992 0.003660 -0.003083 
+-0.001953 -0.001875 -0.001406 -0.002346 -0.005002 0.000569 
+-0.002480 -0.002340 0.001200 -0.000316 -0.000518 0.001563 
+0.001435 -0.005599 -0.000144 0.000549 -0.007378 0.002948 
+0.001941 -0.004684 0.000770 -0.002005 -0.001197 0.000819 
+-0.004342 -0.003935 0.002882 -0.002546 -0.003727 0.006273 
+-0.005375 -0.002756 0.002208 -0.003164 -0.004914 0.000539 
+-0.000646 -0.000052 -0.001908 0.000575 0.000543 -0.000368 
+0.000575 -0.000891 -0.002356 0.003182 -0.000934 -0.003393 
+0.002487 0.000024 -0.003815 0.001750 0.002362 -0.003885 
+-0.000212 0.000113 -0.000494 0.000872 -0.001240 -0.000639 
+0.001086 -0.001308 0.003332 0.000422 -0.003650 0.003291 
+-0.002097 -0.003436 0.003320 -0.000693 -0.004035 0.002740 
+-0.001012 -0.005544 0.001833 -0.001863 -0.006258 0.001499 
+-0.003077 -0.004796 0.000028 -0.001637 -0.003117 -0.000796 
+-0.001574 -0.002133 -0.000029 -0.000727 0.001018 -0.002776 
+0.002135 0.001826 -0.001409 0.003477 0.001747 -0.001834 
+0.001764 0.006672 0.002012 0.001292 0.005627 0.004657 
+0.003090 0.000098 0.006295 -0.002015 0.006396 0.001962 
+-0.004509 0.009629 0.002595 -0.008289 0.006032 0.000863 
+0.005575 0.001713 -0.004740 0.001596 -0.004610 -0.003974 
+0.001800 -0.003464 -0.001585 -0.003258 0.002608 -0.003988 
+-0.005469 0.008050 -0.012136 -0.002321 0.013658 -0.013033 
+0.002231 0.005493 -0.008603 0.002454 0.000028 -0.004098 
+0.002643 -0.000635 0.000291 -0.005841 -0.005340 0.003218 
+-0.012237 -0.011553 0.007396 -0.011565 -0.010256 0.005471 
+0.018441 -0.020508 0.037819 0.218301 -0.380251 0.173571 
+-0.000488 -0.000246 -0.000061 -0.003957 0.005166 0.009128 
+0.009799 0.007597 0.003164 -0.011447 -0.005814 -0.004185 
+-0.022846 -0.019051 -0.026469 -0.013499 -0.010800 0.037162 
+-0.047583 -0.071249 0.006513 -0.028428 -0.010132 -0.015385 
+-0.010373 0.004736 -0.016044 0.001220 -0.000061 -0.004044 
+0.001208 -0.003609 0.002662 0.000037 -0.000037 0.002388 
+-0.000780 -0.000002 0.002341 0.000332 -0.000337 0.001117 
+0.001255 -0.002022 -0.000533 -0.000161 -0.001134 -0.000127 
+-0.000279 0.001531 0.000549 -0.000968 0.002036 0.000027 
+-0.000010 0.000755 0.000438 -0.005669 0.003151 -0.000187 
+-0.010278 0.001881 0.005424 -0.006327 0.000039 0.005783 
+-0.001782 -0.003006 0.002168 -0.000093 -0.001652 -0.001775 
+-0.000411 -0.001240 -0.004912 -0.001203 0.001001 -0.005003 
+0.001004 -0.001349 -0.004613 0.001045 -0.001974 -0.004531 
+0.005263 0.000579 -0.005070 0.005056 0.002458 -0.004665 
+-0.001285 0.000926 -0.001954 -0.002436 -0.004759 0.003286 
+-0.006173 -0.006150 0.004607 -0.002298 -0.003761 0.002555 
+0.000892 0.000341 0.000105 0.001642 -0.001744 0.000020 
+-0.004644 0.001526 0.003066 -0.003538 0.000170 0.003136 
+-0.000127 0.000332 0.000747 0.000810 -0.000899 -0.001482 
+0.002410 0.000536 -0.004403 -0.000231 0.002379 -0.005417 
+-0.000666 0.000746 -0.004188 0.000497 -0.000722 0.000950 
+0.001196 -0.001402 -0.000598 -0.000682 -0.002372 0.003063 
+0.000872 -0.002245 0.000248 0.000926 -0.002639 -0.000544 
+0.000537 -0.002317 0.000634 -0.001577 -0.002618 0.001773 
+-0.002358 -0.003390 0.002511 -0.002468 -0.003435 0.001184 
+-0.002679 -0.000063 0.001039 -0.001874 -0.000150 -0.002149 
+0.000060 -0.000736 -0.001731 0.004063 0.001547 -0.000097 
+0.002349 0.004901 0.002247 0.002054 0.003128 0.002033 
+-0.000605 -0.002548 0.002961 -0.002364 -0.003829 -0.001918 
+-0.000219 -0.002327 -0.001771 -0.002994 -0.001815 -0.003986 
+0.000368 0.009184 -0.013841 0.000254 0.000513 -0.007916 
+0.005358 -0.002286 0.000500 0.002112 -0.002269 0.002229 
+0.002703 0.002532 -0.002812 -0.000416 0.005322 -0.002567 
+-0.000008 0.002046 -0.000458 0.001916 -0.001346 -0.000773 
+0.001952 -0.002290 -0.000079 -0.002907 -0.000692 -0.002043 
+-0.004352 -0.000686 -0.004026 -0.004847 -0.000756 -0.003359 
+-0.009971 -0.002081 0.001500 -0.009848 -0.004111 0.007510 
+0.002228 -0.003985 0.012320 -0.007687 -0.009286 0.005150 
+-0.035430 0.010498 -0.001446 -0.053261 0.000989 0.012264 
+-0.003963 0.014509 -0.000832 -0.005966 0.007954 0.001265 
+-0.006897 0.005123 0.002121 -0.012198 0.004228 0.000175 
+-0.004232 0.004328 0.005416 -0.000991 -0.000144 0.002341 
+0.002389 -0.000264 -0.002922 0.002507 -0.002108 -0.001776 
+0.000799 -0.000855 -0.000272 -0.001708 -0.000476 -0.002587 
+-0.002989 0.002944 -0.001555 0.000426 0.003511 -0.004218 
+-0.000593 -0.000183 -0.000129 -0.000570 -0.000611 -0.003883 
+-0.001232 0.000445 -0.004423 -0.001586 0.002071 -0.003657 
+-0.002220 0.000497 0.000364 0.001067 -0.001779 0.004190 
+0.002233 -0.002214 0.001940 0.000270 -0.003637 -0.000770 
+-0.001362 -0.000702 -0.000289 -0.000733 0.001924 -0.001777 
+0.000701 0.001123 -0.001309 -0.001707 0.001676 -0.004191 
+0.004286 0.001365 -0.002402 0.003352 -0.001348 -0.007432 
+0.000309 -0.000618 -0.007642 -0.002258 -0.002403 -0.005821 
+-0.005939 -0.001769 -0.004362 -0.003921 0.000457 -0.003729 
+-0.000818 -0.005678 -0.004091 -0.001546 -0.002577 -0.005537 
+0.000647 -0.002580 0.001531 0.001416 -0.003145 -0.001101 
+0.001283 -0.001864 -0.002679 -0.000930 -0.004186 0.000930 
+0.000809 0.000453 0.003026 0.001489 -0.001734 0.003444 
+0.001518 0.001083 -0.002299 0.006565 0.002363 -0.005065 
+0.007750 0.001773 -0.005754 0.003372 -0.000746 0.000077 
+0.001522 -0.002811 0.000629 -0.000397 -0.001730 -0.001226 
+-0.002873 -0.000559 -0.001485 -0.000240 0.000303 -0.002297 
+0.001279 0.000936 -0.002889 -0.002539 -0.000551 0.000025 
+-0.004325 0.000633 0.005063 0.000302 -0.001438 0.004469 
+-0.001248 -0.007278 -0.000209 0.000269 -0.001408 -0.001032 
+-0.000845 0.001053 -0.000074 -0.000928 -0.001989 0.000223 
+-0.001504 -0.004563 0.001373 -0.000815 -0.002949 -0.004067 
+-0.008587 0.009488 -0.018170 0.009224 0.019195 -0.024847 
+-0.001708 0.000301 -0.009918 0.001266 -0.003414 -0.002040 
+-0.003479 -0.004878 -0.002318 -0.007724 -0.008158 0.000370 
+-0.006695 -0.006329 0.002809 -0.000874 0.000219 0.000874 
+0.007501 0.004038 -0.003655 0.007255 0.000887 -0.007089 
+0.003771 -0.001370 -0.005531 0.000546 -0.000866 -0.001854 
+-0.000901 0.000869 0.001408 -0.002023 0.003018 0.000237 
+-0.001728 0.000492 -0.000063 -0.000852 0.000104 -0.000886 
+0.000369 0.000234 -0.000102 0.002450 0.001062 0.005507 
+0.008930 -0.000885 0.015651 0.012490 -0.005439 0.006674 
+-0.000093 0.000549 0.003357 -0.000906 0.007322 0.008385 
+-0.000814 0.011774 0.004301 -0.000769 0.005000 0.005128 
+0.000161 -0.003064 0.007812 0.000190 -0.003965 0.003741 
+0.000051 -0.001744 -0.001436 0.000849 -0.001311 -0.002764 
+0.000412 -0.004210 -0.000317 -0.002669 0.000168 0.003720 
+-0.001610 -0.001271 0.004237 -0.002030 -0.001519 0.001382 
+-0.002353 -0.000744 -0.000588 -0.002461 -0.002425 -0.000624 
+-0.000541 -0.000115 -0.000466 0.006661 0.001138 -0.006497 
+0.008597 0.003199 -0.010597 0.002743 0.002689 -0.008102 
+-0.002609 0.002188 -0.000503 -0.000929 0.000394 -0.000636 
+-0.000974 -0.000302 -0.000212 -0.000976 0.001057 -0.003089 
+-0.001638 0.000799 -0.005215 -0.002546 0.002228 -0.005242 
+-0.002730 0.001837 -0.003920 0.006112 0.002464 -0.003175 
+0.002087 0.000186 -0.005464 0.001267 -0.001597 -0.001875 
+-0.001331 0.000204 -0.000404 -0.002463 -0.000761 -0.001396 
+-0.002068 -0.000882 -0.002534 0.000000 -0.005806 -0.002339 
+-0.001281 -0.001812 0.002689 -0.003103 -0.003962 0.000308 
+-0.002180 -0.004665 -0.001435 -0.000589 -0.004279 -0.001585 
+-0.000938 -0.004130 -0.000558 -0.001711 -0.005132 0.000579 
+0.000565 -0.001102 -0.001074 -0.001303 -0.003908 0.000084 
+0.000804 -0.000287 -0.001760 0.004398 -0.001020 -0.002847 
+0.002861 -0.001818 -0.001802 0.001348 -0.000289 0.000313 
+-0.001754 -0.000966 0.003351 -0.001714 0.003047 0.001599 
+0.004766 0.002387 -0.003586 0.003824 0.006131 -0.003792 
+0.001066 0.000560 -0.001482 -0.000577 0.000724 -0.000882 
+-0.000008 -0.001569 -0.001581 0.000580 -0.001187 0.000656 
+-0.000292 -0.001115 0.001392 -0.000273 0.000709 0.000779 
+-0.000796 0.000321 -0.002556 -0.002210 -0.000687 -0.006179 
+-0.004406 -0.001687 -0.007848 -0.000605 -0.001416 -0.002800 
+-0.000984 -0.003711 -0.001403 -0.002532 -0.001030 -0.000476 
+-0.001662 0.000436 0.000089 -0.002183 -0.001776 0.001849 
+-0.004716 -0.003688 0.004051 0.001983 0.002063 0.000744 
+0.000332 0.005224 0.000148 -0.002316 0.004802 -0.005772 
+-0.003415 0.002576 -0.009066 -0.001536 -0.000725 -0.006928 
+0.000251 0.000848 0.001397 -0.005074 -0.006333 0.005933 
+-0.002823 -0.007253 0.003452 -0.003751 -0.002916 0.000070 
+0.001499 -0.002904 -0.003556 0.000369 -0.003513 -0.005623 
+-0.000231 -0.000101 -0.000262 0.000677 -0.000379 0.005600 
+-0.002234 0.000766 0.001214 -0.000044 0.008573 -0.002804 
+-0.001583 0.008181 -0.002331 -0.000906 0.002213 -0.000306 
+0.000364 -0.001810 0.000895 0.000275 -0.002417 -0.000825 
+0.000796 0.000027 -0.001457 -0.000882 -0.000685 -0.000145 
+-0.002080 0.000293 0.003927 -0.005448 -0.000946 0.005545 
+-0.006197 -0.003381 0.001784 -0.003740 -0.000081 -0.001151 
+-0.001981 0.001055 -0.000632 0.001355 -0.001423 0.005146 
+-0.001692 -0.005286 0.004581 0.000565 -0.002373 -0.000824 
+-0.000213 -0.001189 -0.002194 -0.000611 0.001047 -0.000994 
+-0.002270 -0.001605 0.002612 -0.002593 -0.002582 0.000862 
+-0.001158 0.000565 -0.001751 -0.000770 0.002919 -0.003416 
+-0.001416 0.001225 -0.001838 -0.000688 -0.002042 0.001675 
+-0.001070 -0.001519 0.003748 -0.000917 -0.000749 0.001701 
+0.000194 -0.000242 0.000145 0.000228 -0.001695 -0.001679 
+-0.000344 -0.001416 -0.001550 0.002000 -0.001336 -0.001603 
+0.001435 -0.002395 -0.002859 0.003883 -0.002626 -0.002874 
+0.004959 0.004959 -0.003689 0.000683 0.000174 -0.000361 
+-0.004307 -0.001077 0.002742 -0.006485 -0.004850 0.003299 
+-0.001494 -0.003108 0.005409 -0.001918 -0.002628 0.002547 
+-0.000992 -0.002254 0.001349 0.001213 -0.002496 -0.000451 
+0.001491 -0.003686 -0.000352 0.001757 -0.002913 -0.001579 
+0.000037 -0.003730 -0.001612 -0.000821 -0.004503 0.000923 
+-0.001470 -0.002899 0.000275 0.002182 0.000838 0.000632 
+0.003799 -0.000697 -0.000225 0.000933 -0.000077 -0.002300 
+-0.001065 0.001178 -0.001741 -0.002663 0.000886 -0.002669 
+-0.001501 -0.000758 -0.000004 0.001111 0.000959 0.000738 
+0.000244 0.000610 0.000933 0.000205 -0.000206 0.000531 
+0.000432 -0.000756 -0.000996 0.002606 0.001366 -0.003345 
+0.000860 0.000710 0.000161 -0.006681 -0.001802 -0.001450 
+-0.010502 -0.008643 -0.001292 -0.003260 -0.003079 0.005479 
+0.002810 -0.002702 -0.005545 0.005051 -0.004376 -0.003210 
+0.001457 -0.002723 -0.001372 -0.007755 -0.007367 -0.000194 
+-0.011077 -0.004472 -0.003766 -0.002263 0.000824 -0.001232 
+0.001184 -0.002160 -0.002047 0.007692 -0.006158 -0.002362 
+0.009847 -0.000945 -0.008614 0.002035 0.000595 -0.001480 
+0.000069 0.001153 0.004023 0.000925 0.000297 0.003536 
+-0.001253 -0.002370 0.001250 -0.003845 -0.005466 -0.000019 
+-0.003766 -0.009036 -0.000727 -0.003313 -0.008083 0.004061 
+-0.004480 -0.002019 0.004769 -0.007638 0.002198 0.003077 
+-0.002747 0.004341 0.003727 -0.001513 0.002305 0.002759 
+0.000382 -0.000654 0.001018 0.000624 -0.002113 0.000963 
+0.000784 -0.001097 0.002240 0.000787 -0.001125 0.004389 
+-0.000725 -0.002469 0.005081 -0.001462 -0.000385 0.000000 
+0.000260 0.000156 0.000693 -0.000314 0.001151 -0.002951 
+0.000974 0.001518 -0.005309 0.000577 0.001123 -0.003945 
+-0.000574 0.001148 0.000348 -0.003932 0.001966 0.003932 
+-0.004369 0.002330 0.003833 -0.003726 0.001167 0.001150 
+-0.003072 -0.000736 -0.001280 -0.001307 -0.000503 -0.001910 
+0.000245 0.000409 -0.000123 -0.001760 -0.000777 0.003007 
+-0.003325 -0.000211 0.004453 -0.000413 -0.001598 0.003441 
+0.001537 -0.005844 0.000873 -0.001303 -0.004998 -0.002477 
+-0.000113 -0.005024 -0.000670 -0.000212 -0.002908 0.000415 
+0.001849 -0.001138 -0.000258 0.000775 -0.002533 -0.001045 
+0.000307 -0.003689 -0.002690 0.000941 -0.007032 0.000914 
+0.000990 0.001740 -0.001695 -0.000094 0.002843 -0.002104 
+0.000691 0.002735 0.000393 -0.000116 -0.000309 -0.001236 
+0.001486 -0.001408 -0.002532 0.003407 -0.003977 -0.000380 
+-0.001440 -0.002160 0.002000 0.001556 0.000621 0.000229 
+0.001311 -0.000656 0.000820 -0.000334 -0.000402 -0.000200 
+-0.003632 -0.002848 0.000348 -0.006518 -0.003847 -0.002218 
+-0.001874 -0.000702 -0.003044 0.001399 -0.000505 0.000218 
+0.001677 -0.000232 0.000083 0.001823 0.000102 -0.000234 
+0.001691 0.000930 -0.003129 0.000353 0.002151 -0.002633 
+0.000996 -0.000178 -0.000284 0.002032 -0.002059 0.000488 
+0.000558 -0.000755 -0.001620 0.000048 -0.000577 -0.002425 
+-0.000256 -0.001763 -0.002306 -0.002325 -0.003728 -0.000175 
+-0.005444 -0.003963 -0.000957 -0.006427 -0.005188 -0.001862 
+-0.006930 -0.006535 0.004366 0.002545 -0.002535 0.000023 
+0.009034 -0.007391 -0.001994 0.017917 -0.005504 -0.007706 
+0.012780 -0.000529 -0.012372 0.004256 -0.007513 -0.009175 
+-0.005686 -0.008431 -0.010980 -0.008404 -0.010935 -0.013765 
+-0.008214 -0.012571 -0.015738 -0.004662 -0.017092 -0.003000 
+0.004898 -0.013393 0.007503 -0.007577 -0.005746 -0.006131 
+0.009198 0.001642 -0.006312 0.009581 0.004291 -0.006432 
+0.005980 0.002093 -0.006500 0.003123 0.003381 -0.005473 
+0.006393 -0.001480 -0.004441 0.007019 0.001635 -0.003327 
+0.000342 0.006553 -0.000251 -0.001615 0.007025 0.003452 
+-0.002551 0.003323 0.004231 -0.000238 0.000192 0.002358 
+0.001336 -0.001081 0.000412 0.001003 0.001672 -0.003385 
+0.003124 0.003488 -0.001874 -0.001289 0.001289 -0.003047 
+-0.002808 0.001995 0.000814 -0.003037 0.000607 0.003571 
+-0.000132 0.000688 0.004153 0.001284 -0.001829 -0.000037 
+0.001949 -0.002862 -0.004142 -0.003982 0.000885 -0.002212 
+-0.005295 0.004188 -0.000741 -0.004494 0.004078 0.000302 
+-0.000697 0.000724 0.000301 0.000194 -0.003404 -0.003501 
+0.003870 -0.002162 -0.004672 0.003364 -0.002541 -0.004485 
+-0.000178 0.000267 -0.002562 -0.002311 -0.001489 0.003996 
+-0.009749 -0.007674 0.004178 0.001283 -0.006708 -0.001429 
+0.000220 -0.004653 0.003884 -0.000496 0.000253 -0.000063 
+0.000377 0.001282 0.000887 0.000486 -0.002260 0.001725 
+0.001181 -0.000556 0.001979 0.003747 -0.002722 -0.002407 
+0.000372 -0.002672 -0.004344 -0.002191 -0.002849 -0.003616 
+0.001589 -0.002249 -0.000467 -0.000210 -0.000042 -0.000357 
+-0.000673 0.001037 -0.000356 0.012261 0.001502 -0.006254 
+0.006492 -0.005070 -0.002380 0.005733 -0.001860 -0.003961 
+-0.000074 -0.001998 -0.001970 -0.002126 -0.007362 0.002323 
+0.000807 -0.004714 0.008620 -0.002897 -0.005985 0.000902 
+0.000247 -0.001706 -0.002806 0.004458 -0.001374 -0.002229 
+0.004415 -0.002936 -0.002204 0.003462 -0.003115 -0.003115 
+0.002521 -0.000316 -0.000940 0.001374 0.001115 -0.000478 
+0.001108 0.003815 -0.000602 0.000562 0.002749 -0.001593 
+-0.002016 0.000152 -0.000183 -0.004644 -0.002906 0.001978 
+-0.000887 -0.005526 0.000791 -0.002517 -0.004449 0.001508 
+-0.000288 -0.002780 -0.002535 0.000826 -0.003009 -0.004079 
+-0.002556 -0.004259 -0.003231 -0.005627 -0.009844 0.001557 
+0.001828 -0.005252 0.002475 0.000323 0.000097 -0.009344 
+-0.004394 0.003403 -0.020551 0.003514 0.006486 -0.003243 
+0.001101 -0.001257 0.004790 -0.010267 0.002925 0.008148 
+-0.017576 0.001988 0.007853 -0.008754 0.000480 0.002664 
+0.001605 -0.000796 -0.003580 -0.003253 -0.000267 -0.002648 
+-0.022956 -0.008638 0.001829 -0.028851 -0.014985 0.005881 
+-0.008638 -0.009901 0.008798 0.000053 -0.005307 -0.002720 
+-0.002044 -0.003536 -0.001642 -0.003085 -0.003935 0.002147 
+-0.002800 -0.004283 0.000148 -0.003022 -0.002592 -0.000785 
+-0.000381 -0.001098 -0.000862 0.000637 -0.000255 0.000374 
+-0.000994 0.001277 -0.000697 -0.001028 0.002779 -0.001618 
+-0.004704 0.002589 -0.000413 -0.007095 -0.000760 -0.003182 
+-0.003554 -0.002297 -0.002731 -0.003204 0.001694 -0.000534 
+-0.002695 -0.000721 -0.000114 -0.006642 -0.002112 0.002073 
+-0.006302 -0.003628 0.003234 -0.002733 -0.002967 0.000137 
+-0.001137 0.000027 -0.003249 -0.001065 0.001430 0.000784 
+-0.002562 0.002309 0.004081 -0.005545 0.000152 0.003229 
+0.000572 0.001278 0.000774 0.000130 0.000224 0.000838 
+0.004000 0.000368 0.001471 0.000661 0.001223 0.002446 
+-0.001093 0.000987 0.000670 -0.001039 -0.000267 -0.001318 
+-0.001795 -0.000424 -0.001334 -0.003755 -0.000957 0.000567 
+-0.002328 -0.001897 0.001155 0.000489 -0.001052 -0.000349 
+0.002525 -0.001467 0.001808 0.003003 -0.002405 0.001599 
+0.000100 0.000335 0.000749 0.000185 -0.000627 -0.001648 
+0.003519 0.005743 -0.005113 0.001970 0.005703 -0.005506 
+-0.003389 -0.004603 -0.003627 -0.003600 -0.006043 -0.003827 
+-0.003441 -0.004428 -0.004072 -0.001483 -0.002413 -0.004790 
+-0.000609 0.001592 -0.003668 0.000940 0.000940 0.000342 
+0.003009 -0.000445 -0.002159 -0.000206 -0.002677 -0.001749 
+-0.000079 -0.006349 0.000079 -0.001781 -0.008640 -0.000792 
+-0.005409 -0.007021 -0.003363 -0.003352 -0.009162 0.004244 
+-0.001513 -0.004384 -0.004477 -0.001787 -0.002436 -0.004981 
+0.002256 -0.002180 -0.002180 0.001410 -0.000480 0.000395 
+-0.003531 -0.003213 0.000053 -0.000124 -0.001488 0.004300 
+-0.000772 0.000276 0.000000 0.000152 0.000207 -0.000393 
+0.001629 0.001598 0.000501 0.000976 0.000907 0.001291 
+-0.000212 0.000133 0.000138 -0.001224 -0.000417 0.000340 
+-0.003422 -0.000537 0.003293 -0.002675 -0.000208 0.006910 
+-0.000342 0.004600 -0.000193 0.001038 0.007385 -0.007809 
+0.000571 -0.000188 -0.005829 -0.013067 0.005301 0.006494 
+-0.014653 0.012897 0.020442 -0.002763 0.017038 0.029693 
+0.007612 0.019336 0.033577 0.013069 0.017470 0.033254 
+0.014953 0.011409 0.028210 0.009533 0.005519 0.015825 
+-0.001743 -0.000917 -0.000027 -0.002781 -0.005015 -0.005464 
+-0.001493 -0.005495 -0.008156 0.004732 -0.012371 0.001353 
+0.003323 -0.006958 -0.001188 -0.001944 -0.003056 -0.002778 
+0.003133 -0.001017 -0.000216 0.005809 -0.003012 -0.001439 
+0.001444 -0.005733 -0.003053 -0.001050 -0.004537 -0.003880 
+-0.000074 -0.002940 -0.001085 -0.000836 -0.002436 0.002243 
+-0.000497 -0.001886 0.002408 -0.002237 0.001197 -0.000945 
+-0.005011 -0.004163 -0.002468 -0.001228 -0.002642 -0.002159 
+-0.001973 -0.000107 -0.001867 -0.000306 0.001427 0.001868 
+0.000926 0.000501 0.001134 -0.000133 -0.000163 -0.000841 
+-0.002148 -0.000726 -0.002036 -0.005230 0.000093 -0.001518 
+-0.001253 -0.001504 0.001240 -0.002956 -0.001847 -0.000002 
+-0.001336 0.000489 0.000423 0.000432 -0.001319 -0.002918 
+0.001102 0.000123 -0.003671 -0.000620 0.000509 -0.002991 
+-0.000875 -0.000138 -0.003777 -0.001667 0.000847 -0.004524 
+-0.000956 -0.000406 -0.003302 0.001344 0.000305 -0.001029 
+-0.001007 -0.000501 0.000955 -0.004329 -0.002660 0.002556 
+0.001735 0.001706 0.001923 0.005085 0.001692 0.006533 
+0.001597 0.001317 0.003424 0.001185 0.000921 -0.002771 
+0.000245 0.003781 -0.005743 -0.001846 0.003813 -0.000655 
+-0.003159 -0.001258 -0.000374 -0.000692 0.000546 -0.002294 
+-0.000397 -0.000270 -0.000532 0.001738 -0.000503 -0.001849 
+0.000094 -0.000655 -0.001433 0.000526 0.000241 -0.000250 
+0.003223 0.000831 0.000982 0.001983 -0.000138 0.002198 
+0.000156 -0.000391 0.000469 -0.004892 0.000226 0.002627 
+-0.007771 0.001194 0.001448 -0.005016 0.000684 -0.000315 
+-0.000487 -0.001225 -0.002531 -0.001609 0.007453 -0.003825 
+0.000967 -0.003753 -0.002957 0.001153 -0.001508 -0.003902 
+-0.001543 -0.006023 0.001115 0.000664 -0.003846 -0.000507 
+0.000759 -0.000599 0.000230 0.000118 0.000437 0.000910 
+0.000287 -0.000549 0.000232 -0.002231 0.000810 -0.000240 
+-0.000401 0.000108 0.000174 0.000044 -0.000466 0.000355 
+-0.003548 -0.005083 0.003344 -0.006637 -0.011646 0.005119 
+-0.003824 -0.013826 -0.003736 -0.014404 -0.014575 0.006778 
+-0.002278 0.004326 0.011400 -0.016475 0.014015 0.016309 
+-1.970874 1.281553 3.223301 -0.947566 1.550562 4.947566 
+0.390572 1.643098 5.919192 1.463158 1.589474 5.596491 
+1.995798 1.357143 4.281513 0.016672 0.011888 0.026055 
+0.008398 0.008109 0.009310 0.004747 0.008445 -0.012843 
+0.003021 0.008941 -0.008071 -0.001913 0.003252 -0.010577 
+-0.001795 0.005071 -0.005086 0.000161 0.002089 -0.004188 
+0.005702 -0.001575 -0.000256 0.007889 -0.001506 -0.002543 
+0.005483 -0.006345 -0.000313 -0.001725 0.000219 0.002075 
+-0.001720 -0.002286 0.000802 0.000396 -0.001459 -0.004082 
+-0.001156 -0.002741 -0.006354 -0.000328 0.001730 -0.003242 
+-0.000619 -0.001029 -0.005354 -0.003806 -0.001575 -0.002979 
+-0.004893 -0.002159 -0.000250 -0.003600 -0.002438 -0.000193 
+-0.000821 -0.001691 -0.002451 0.000438 0.003723 -0.001387 
+-0.000207 -0.001961 -0.002147 -0.002279 -0.003357 0.000397 
+-0.000812 -0.001843 0.002952 -0.002092 0.000068 0.001655 
+-0.000782 0.000082 0.001173 -0.000147 0.000098 0.000794 
+-0.001577 -0.001767 -0.000870 -0.000104 -0.001872 -0.000926 
+0.000137 0.000889 0.001334 0.003343 0.001960 0.006127 
+0.007421 0.003093 0.004604 -0.000072 0.000240 0.005243 
+0.002304 -0.002780 0.005131 0.002339 -0.006222 0.004155 
+0.000845 -0.003476 0.006298 0.000012 -0.000052 0.001875 
+0.003267 0.004628 0.000476 -0.000077 0.001207 -0.000279 
+-0.001317 -0.003535 0.000901 -0.003680 0.000289 -0.000722 
+-0.002950 -0.001294 0.000750 -0.002655 -0.002549 0.003399 
+-0.003523 -0.001268 0.001409 0.000323 -0.000224 -0.000752 
+0.002639 -0.000639 -0.000656 0.001454 -0.000893 0.001800 
+-0.000019 -0.001482 0.003827 -0.001417 0.000645 0.002257 
+-0.001438 -0.000587 -0.002210 -0.001946 -0.003704 -0.004542 
+-0.002832 -0.005956 -0.003066 -0.003102 -0.003704 -0.002125 
+-0.002911 -0.000085 -0.001498 -0.002163 0.003008 -0.003460 
+-0.001190 0.002982 -0.003872 0.004444 -0.000940 -0.004786 
+-0.000651 -0.002302 -0.001555 -0.000836 -0.001013 -0.000560 
+-0.000914 0.000068 0.000027 -0.000699 0.000281 -0.000120 
+-0.000681 0.000259 -0.000280 -0.001697 -0.000682 -0.002027 
+-0.002785 -0.003057 -0.004192 -0.003661 -0.004314 -0.002879 
+-0.009106 0.001194 -0.001786 -0.001215 0.001893 -0.003073 
+-0.002146 -0.002750 -0.002251 0.001241 -0.017130 -0.002312 
+0.000757 -0.005039 -0.001575 -0.002094 0.012419 0.009687 
+-1.771144 1.221393 3.079602 -1.137045 1.490364 4.880085 
+0.251546 1.657732 5.375258 1.644033 1.685185 4.502058 
+2.104804 1.569869 3.403930 1.753582 1.472779 2.779370 
+0.006559 0.014944 0.023786 -0.003795 0.012563 -0.016335 
+-0.007186 0.001810 -0.018607 -0.000829 0.000634 -0.003302 
+-0.001345 0.002538 -0.000789 -0.005908 -0.001268 0.000646 
+-0.004271 -0.001982 -0.002217 -0.000893 0.002683 0.002188 
+-0.001216 0.002485 0.002744 0.000120 0.000766 0.000707 
+-0.000555 -0.001873 -0.000088 -0.000125 -0.002833 0.000875 
+-0.001166 -0.001978 -0.001697 -0.000334 -0.000172 -0.003200 
+0.000573 -0.001293 0.000933 0.002530 -0.003341 0.003353 
+0.002790 -0.001736 0.001970 0.001852 -0.001129 0.000139 
+0.006842 -0.001207 -0.006574 0.000293 -0.001920 -0.005694 
+-0.005259 -0.001206 0.001976 0.001364 -0.002827 0.003162 
+-0.001420 -0.005087 0.001299 -0.001750 -0.000583 0.002333 
+-0.001420 0.001079 0.001091 0.002108 0.002814 0.001079 
+0.001450 -0.000463 0.001471 0.004696 0.000225 -0.002608 
+0.003192 0.000482 -0.002791 0.001579 0.002412 -0.001303 
+0.003224 0.000806 0.000370 0.002016 -0.000838 0.000739 
+0.001887 -0.001436 0.000040 -0.007469 -0.003861 0.003103 
+-0.005255 0.001730 0.000624 -0.004373 -0.004915 -0.001458 
+-0.005106 0.001352 0.003804 -0.002444 -0.001278 -0.002278 
+0.002540 -0.002198 -0.001138 0.002618 -0.001865 -0.005266 
+0.003725 -0.004194 0.001392 0.001676 -0.004070 -0.001573 
+-0.003692 -0.004660 -0.000932 0.002096 0.000289 -0.000723 
+0.006615 0.003804 -0.001444 0.006347 0.004581 -0.001016 
+0.004338 0.002251 0.000334 0.002562 -0.000774 0.001026 
+0.000187 -0.002146 -0.002053 -0.001793 0.001651 -0.004097 
+-0.003341 0.001798 0.000657 -0.007803 -0.001680 -0.000480 
+-0.006369 -0.003133 -0.001286 -0.003268 -0.000580 -0.001843 
+0.001374 0.000763 -0.000458 0.001360 -0.001268 -0.004531 
+-0.001606 -0.004185 0.002981 0.000401 -0.000362 -0.000498 
+0.000579 0.000267 0.004580 0.001104 -0.000010 0.002434 
+-0.001040 0.001349 0.000739 -0.005381 0.001158 -0.002867 
+-0.009869 -0.004325 -0.004295 -0.001303 -0.006283 -0.003293 
+-0.004996 -0.001516 -0.000987 0.001559 0.005000 0.003364 
+0.004371 -0.001175 0.019944 0.021979 0.012903 -0.021516 
+0.002346 -0.007050 -0.006143 -0.005713 -0.000113 0.007278 
+-1.236111 0.913889 1.869444 -0.612500 1.166667 3.000000 
+0.406475 1.363309 2.737410 1.421150 1.428571 2.020408 
+1.802784 1.303944 1.459397 1.352313 1.092527 1.224199 
+0.005433 0.008441 0.012373 0.002058 -0.001043 0.002087 
+0.002141 0.002068 -0.003350 -0.003006 0.001808 0.002839 
+-0.008836 0.005339 0.006271 -0.005245 0.005037 0.002889 
+0.001622 -0.000160 0.000650 0.004997 -0.002733 0.001551 
+0.009313 -0.002563 0.001269 0.003819 -0.000712 -0.004461 
+-0.000023 -0.003183 0.000605 -0.001064 -0.004508 0.003580 
+0.000414 -0.005182 0.001312 -0.000822 -0.004178 -0.000492 
+0.000842 -0.003710 -0.000506 0.002084 -0.000936 0.001790 
+0.003364 0.004774 -0.001989 0.001870 0.001792 -0.008066 
+-0.001869 0.001082 -0.008856 -0.002357 -0.000821 0.000667 
+-0.000284 -0.001068 -0.001585 0.001745 0.001267 0.001534 
+0.002045 0.001540 -0.001823 0.002892 0.003306 0.000222 
+0.000492 -0.000804 -0.000435 -0.003150 -0.002139 0.000029 
+-0.002922 -0.001210 -0.003582 -0.003150 0.000539 -0.003378 
+-0.002138 -0.000513 -0.003031 0.000311 0.001324 -0.003612 
+0.001337 -0.001460 -0.001907 0.000564 -0.000978 -0.001055 
+0.000566 0.000985 0.000178 0.002322 -0.001441 -0.000239 
+-0.000531 -0.000765 -0.000775 -0.006561 -0.000946 0.002062 
+-0.004399 -0.005448 0.003460 -0.002187 -0.000936 -0.000094 
+0.002932 -0.000458 -0.003491 0.004118 -0.000686 -0.004800 
+-0.002924 0.000496 0.004840 -0.008358 -0.000913 0.003652 
+-0.001791 -0.001591 0.002388 0.000615 -0.000285 -0.001140 
+0.003796 0.001016 -0.001092 0.001084 -0.001021 -0.001201 
+-0.000655 -0.000797 -0.001586 0.001088 -0.001743 0.000720 
+0.002339 -0.001774 0.001048 0.000086 -0.001346 0.000957 
+-0.001874 0.001055 0.000062 -0.002659 -0.001461 0.001236 
+-0.000402 0.001628 -0.001070 0.000047 -0.000392 -0.002670 
+0.000906 -0.000301 -0.002562 -0.000827 -0.000827 -0.001732 
+0.001114 -0.002955 0.001426 0.004093 -0.003676 0.000586 
+0.004794 -0.003656 0.000177 0.002514 -0.002216 0.000028 
+-0.001952 -0.000538 -0.002502 -0.005892 -0.000814 -0.006588 
+-0.011359 -0.002277 -0.003782 -0.001264 -0.005039 0.000904 
+-0.005110 -0.005317 0.001172 -0.007822 -0.002190 0.001100 
+-0.003960 -0.001828 -0.001051 0.000270 0.001221 -0.001655 
+-0.004712 0.013086 -0.030804 0.009406 -0.001139 -0.058214 
+-0.007882 -0.004326 -0.003431 -0.006762 -0.001358 0.008923 
+-0.005385 0.000485 0.006348 -0.002008 -0.000093 -0.003649 
+0.003977 -0.009439 -0.025514 0.018170 -0.029543 -0.073493 
+0.014048 -0.005380 -0.022094 0.002925 -0.001421 -0.001751 
+-0.000289 -0.001010 -0.000445 0.000597 -0.004526 -0.004752 
+-0.007426 -0.008020 -0.004768 -0.006947 -0.006162 -0.003175 
+-0.001270 -0.002981 -0.001444 0.002524 0.002058 0.000530 
+0.006390 0.003668 -0.002469 0.003519 -0.000746 -0.002459 
+0.002123 0.001538 -0.004336 0.001570 0.003120 -0.005364 
+-0.000923 0.001054 -0.001377 -0.001042 -0.002007 -0.000265 
+-0.001231 -0.001958 -0.001268 0.000197 -0.001732 -0.000669 
+0.000500 0.000972 -0.001482 -0.004654 0.000810 -0.000204 
+-0.002908 -0.004312 -0.000694 0.000376 -0.003860 -0.000892 
+0.000476 -0.001199 -0.000749 0.002330 0.001259 0.001842 
+0.000673 0.001453 0.003509 0.001421 0.001163 0.000663 
+0.000682 0.001480 -0.001241 0.000998 0.001989 -0.003845 
+0.003074 0.002963 -0.003074 -0.002019 0.001464 -0.004594 
+0.001121 -0.000498 -0.002407 0.000675 -0.001222 0.000089 
+0.000679 -0.000730 0.001455 -0.001256 0.001361 0.000458 
+-0.001173 0.000450 -0.001241 0.000129 -0.003813 -0.002530 
+0.001652 -0.008311 -0.005001 -0.003574 -0.014669 -0.000053 
+-0.002513 -0.007949 -0.000324 -0.000592 -0.002255 0.000183 
+0.002023 0.000754 0.000931 0.001062 0.001813 0.000451 
+-0.005755 -0.005071 0.003041 -0.004866 -0.004283 0.004885 
+0.001772 -0.004739 -0.000020 0.000947 -0.004379 -0.000465 
+0.002802 -0.001392 -0.000307 0.004272 -0.001459 -0.002677 
+0.004892 -0.001690 -0.006899 0.006599 0.000260 -0.007729 
+-0.000071 0.000107 -0.008231 0.002703 -0.003315 -0.004132 
+0.004935 0.000310 -0.002688 -0.000767 -0.003256 0.000997 
+-0.005858 -0.008059 0.006020 -0.006363 -0.002574 0.000608 
+0.004087 -0.003350 0.000066 0.001450 -0.002058 0.000764 
+0.006343 0.000412 -0.003971 -0.000209 -0.003478 -0.004001 
+-0.002707 -0.003082 -0.003142 -0.004361 0.002227 -0.002307 
+-0.003324 0.007529 -0.004372 -0.002555 0.005225 -0.006130 
+-0.001193 0.000571 -0.003791 -0.000532 -0.001060 -0.002226 
+-0.002340 -0.001888 -0.001777 -0.005222 -0.003118 -0.001784 
+-0.006347 -0.005443 0.001790 -0.004227 -0.005912 0.004396 
+-0.002922 -0.002310 0.003353 -0.000562 -0.000529 -0.001689 
+0.005216 0.007567 -0.014914 0.009968 0.000782 -0.028495 
+0.010276 -0.001802 -0.041570 -0.000474 -0.002627 -0.041477 
+-0.006915 -0.005320 -0.019914 -0.004295 0.000415 0.001588 
+-0.007438 -0.006574 0.004093 0.000677 -0.004625 0.002776 
+0.003054 -0.000333 -0.010108 -0.000692 0.001395 -0.011362 
+-0.003981 0.000925 -0.006430 -0.006105 -0.001465 -0.002373 
+-0.002986 0.003739 -0.004441 0.002011 0.004277 -0.009536 
+0.006158 0.004253 -0.010394 0.006422 0.005323 -0.006726 
+0.002815 0.004200 -0.003639 0.000800 0.001643 -0.001411 
+0.000716 -0.002000 -0.000975 0.000283 -0.005183 -0.002026 
+-0.001301 -0.007100 -0.000949 -0.003325 -0.003915 -0.001368 
+0.001959 -0.002118 -0.002285 0.001681 -0.001357 -0.000889 
+0.000877 -0.001619 0.001148 0.000043 -0.002399 0.002890 
+-0.000163 -0.000557 0.002783 -0.002556 -0.001643 0.000732 
+-0.001601 -0.003451 -0.000551 -0.004185 -0.000890 0.000339 
+-0.001160 0.000458 0.001317 0.002751 0.004810 0.001030 
+0.003700 0.000808 -0.002297 0.002209 0.000844 0.000225 
+-0.000385 0.001382 0.000306 0.000001 -0.001401 0.000694 
+0.001300 -0.002484 -0.000029 0.001222 -0.002361 -0.001110 
+-0.003466 -0.002839 -0.000754 -0.005030 0.000462 -0.001557 
+-0.002764 0.000029 -0.001446 -0.002370 -0.000124 -0.001646 
+-0.001585 -0.002079 -0.002946 0.000498 -0.004959 -0.000162 
+-0.000704 -0.007040 0.004928 0.002303 -0.001064 0.007104 
+-0.004275 -0.002231 -0.001079 -0.000311 -0.000838 -0.001174 
+0.006852 0.000889 0.000230 -0.000644 0.001250 0.000870 
+0.000000 0.005246 -0.001311 -0.001154 -0.000282 -0.003026 
+-0.007379 -0.006724 0.000655 -0.001641 -0.003920 -0.001547 
+-0.000567 0.001605 -0.002003 -0.000087 0.002886 -0.002099 
+0.000284 -0.000475 -0.001851 0.001656 -0.000905 -0.000055 
+0.000950 -0.005521 0.005675 -0.001192 -0.002239 -0.001642 
+-0.001759 0.000735 0.000669 -0.002787 0.000259 0.000880 
+0.000553 -0.003869 0.001811 -0.001011 -0.006749 -0.002158 
+-0.002467 -0.004082 0.001485 0.000768 0.001799 -0.001203 
+0.002724 0.004004 -0.003152 0.003056 0.003396 -0.003856 
+0.001639 0.001105 -0.004902 0.000488 -0.001275 -0.005001 
+-0.000399 -0.001517 -0.003533 -0.002580 -0.000385 -0.000152 
+-0.004812 -0.000525 0.003701 -0.002403 -0.000985 0.003459 
+0.001296 0.000481 -0.002054 0.005463 -0.000594 -0.008183 
+0.009366 -0.004271 -0.010424 0.009891 -0.003886 -0.008894 
+0.009046 -0.000378 -0.007177 0.002502 -0.001505 -0.003897 
+-0.004129 -0.000077 -0.003341 0.001745 -0.002137 0.000586 
+0.002686 -0.001727 0.000859 0.002283 -0.002354 -0.002989 
+-0.002388 -0.001160 -0.005710 -0.004884 0.000084 -0.005153 
+-0.006342 -0.000485 -0.002723 -0.004329 -0.001574 -0.000529 
+-0.000678 -0.000563 -0.001363 0.003412 0.000683 -0.002961 
+0.003448 -0.001303 -0.004253 0.000113 0.000040 -0.004657 
+-0.000938 0.001499 -0.004036 0.004646 0.000996 -0.004712 
+0.004775 -0.002324 -0.002524 0.003005 -0.002736 -0.003423 
+0.001791 0.001622 -0.002853 -0.003309 -0.001847 -0.000126 
+-0.003583 -0.004236 0.000420 -0.001971 -0.002330 0.002589 
+0.001232 -0.003090 0.001403 0.001084 -0.003955 -0.000336 
+-0.002004 -0.001629 -0.003168 -0.000563 -0.001892 -0.000306 
+-0.002674 0.003688 -0.004634 -0.001929 -0.000892 -0.003667 
+0.007900 -0.000567 -0.007063 0.003325 0.002779 -0.005417 
+-0.000910 -0.001433 -0.001418 -0.001961 -0.002500 -0.000490 
+0.001277 0.003338 -0.003114 0.002587 0.001407 -0.010558 
+0.000376 -0.002995 -0.005540 -0.004815 -0.002554 -0.003671 
+-0.008987 -0.000559 -0.001681 -0.006472 -0.005588 0.003288 
+-0.001054 -0.002098 0.001773 0.000440 0.000296 0.001196 
+0.001306 -0.002892 0.000355 -0.001524 -0.005147 0.002199 
+-0.001650 0.000924 -0.000271 0.000493 0.005480 0.000901 
+0.002002 -0.000972 -0.001616 0.003957 -0.002141 -0.000921 
+0.003370 -0.001180 -0.001520 0.003471 0.000744 0.001240 
+0.003388 -0.000136 0.001762 -0.000525 -0.000262 0.002131 
+-0.002645 0.000137 -0.000683 -0.000310 0.000823 -0.002773 
+0.000717 0.000392 -0.001712 -0.000132 -0.001116 -0.000933 
+0.000330 -0.000574 -0.000726 -0.003113 -0.000125 0.004234 
+-0.004535 -0.003549 -0.000089 -0.002108 -0.001322 -0.001186 
+-0.002419 -0.003185 -0.000906 -0.000689 -0.002619 -0.002239 
+-0.000447 -0.001484 -0.000522 0.001789 0.002664 -0.000191 
+0.000297 0.001462 -0.000511 -0.002005 -0.001743 0.001218 
+-0.001817 -0.001580 0.000693 0.000184 -0.000500 -0.001456 
+-0.002899 -0.000122 -0.003038 -0.001775 -0.000253 -0.006340 
+0.002065 -0.003043 -0.002065 0.000774 -0.004069 -0.001145 
+-0.000599 -0.002732 0.000944 -0.001460 -0.000858 0.001744 
+-0.001999 0.000672 0.002323 -0.000398 0.002570 0.003213 
+0.003237 0.003464 0.002930 0.006002 0.001869 -0.000270 
+0.007087 0.001261 -0.002413 0.005488 0.003015 0.000936 
+-0.002229 0.004119 0.005158 -0.005260 0.005834 0.003449 
+-0.003036 0.003950 0.001647 -0.001073 0.001496 0.000869 
+-0.001435 0.000628 -0.000014 -0.003003 0.001090 -0.000005 
+-0.003014 0.000801 -0.000815 -0.000834 -0.001578 -0.001903 
+0.001759 -0.001514 -0.002564 0.001230 -0.000469 -0.002519 
+-0.000175 0.000082 -0.001672 0.002040 -0.001163 -0.004393 
+0.006477 0.003114 -0.001718 0.003488 0.006928 -0.000848 
+0.001591 0.005191 -0.001584 0.001394 0.002005 -0.000706 
+0.002127 -0.002589 0.000610 0.001623 -0.003950 0.000939 
+-0.001603 0.001883 -0.001934 -0.000858 0.000182 -0.005666 
+-0.001065 -0.000126 -0.001182 0.001225 -0.001145 0.000815 
+-0.001780 -0.001102 0.005085 0.000801 -0.000700 0.001101 
+-0.000139 -0.001807 -0.002073 -0.001402 -0.003437 -0.002834 
+-0.001981 -0.003699 0.001651 0.000165 0.000216 0.000720 
+0.001889 0.004713 0.000412 0.004320 0.000560 -0.007040 
+-0.001434 0.001136 -0.002150 -0.000676 -0.001304 -0.000545 
+0.001370 0.000406 -0.003603 -0.003163 0.003205 -0.003483 
+0.002040 0.000162 0.000358 0.007779 0.000929 -0.002371 
+0.002517 0.005033 -0.003917 0.004454 0.000819 -0.000143 
+0.002436 0.001790 0.000807 0.000733 0.002093 0.001883 
+-0.001846 0.001258 0.002328 -0.003600 -0.002480 0.001200 
+-0.004315 -0.006280 0.000526 -0.002014 -0.001733 -0.002155 
+0.002002 0.001405 -0.000269 0.004997 -0.002436 0.000929 
+0.003223 -0.004316 -0.000617 -0.000342 -0.001511 0.001122 
+-0.001259 0.000199 -0.003378 -0.000913 -0.000279 -0.001807 
+-0.000715 -0.000680 0.000069 -0.000439 -0.000758 -0.000515 
+0.000273 -0.000142 -0.003464 0.000858 -0.001505 -0.003466 
+-0.000688 -0.000214 -0.000909 -0.000464 -0.000666 0.000017 
+-0.001862 0.000366 0.002289 -0.003310 -0.002058 -0.002615 
+-0.006437 -0.004520 0.002304 -0.004116 -0.002004 0.001955 
+-0.003162 -0.002077 0.000983 -0.000252 -0.000415 -0.000730 
+-0.003317 -0.002372 0.001605 -0.001860 -0.000659 -0.000796 
+-0.000068 -0.000255 -0.001599 0.000734 -0.001101 -0.002077 
+0.001467 -0.000539 -0.000120 -0.000334 -0.001454 0.001911 
+-0.001387 -0.004553 0.001206 -0.004071 -0.003280 -0.001165 
+-0.004535 -0.001435 -0.000438 -0.003273 -0.000897 -0.000425 
+-0.001968 -0.000905 0.000214 -0.000688 -0.000534 0.000208 
+-0.002225 -0.001544 0.000643 -0.004045 -0.000967 -0.000015 
+-0.001880 0.000214 -0.000432 0.000306 -0.001734 -0.001334 
+0.001451 -0.003346 -0.002403 0.001068 -0.002819 -0.002776 
+-0.001250 -0.001195 -0.002403 -0.003769 0.000000 0.000769 
+-0.005466 -0.008855 0.002733 -0.004029 -0.009775 0.006340 
+-0.006075 -0.004874 0.005085 -0.002743 -0.003429 0.004098 
+-0.004162 -0.003663 0.001348 -0.002177 -0.005993 0.003539 
+0.001084 0.000370 0.000545 0.010066 0.004154 -0.001227 
+0.014164 0.010605 0.001469 0.010602 0.008378 0.001091 
+0.007677 0.000033 0.001367 0.004471 -0.000744 0.000406 
+0.002643 0.000099 -0.000185 0.000661 0.002935 -0.006409 
+-0.002706 0.000118 -0.000588 -0.000947 -0.003965 0.003591 
+0.002497 -0.004109 0.000316 0.001988 -0.004973 -0.001004 
+-0.000519 -0.004652 -0.000353 -0.002689 -0.000769 0.002309 
+-0.000978 0.000881 0.002156 0.000625 -0.001240 -0.000769 
+-0.001660 -0.002046 -0.003662 0.001088 -0.000472 -0.007469 
+-0.000808 0.002486 -0.004934 0.001587 0.001354 -0.002395 
+-0.000852 0.000226 -0.000864 0.000013 0.001276 -0.004660 
+0.001458 -0.002120 -0.005809 -0.001562 -0.004375 -0.004688 
+0.000804 -0.004546 -0.002367 0.000604 -0.001570 -0.001409 
+0.002802 0.001825 -0.002476 0.001512 0.007039 -0.004587 
+0.001316 -0.000452 -0.000527 -0.001147 -0.004483 -0.002224 
+0.007283 0.001219 -0.003117 0.006513 0.003392 -0.007554 
+0.002764 0.000000 -0.004553 0.000630 0.000375 -0.000415 
+0.001800 0.002044 -0.001081 0.003248 0.005111 -0.002322 
+0.002185 0.002951 -0.001989 -0.000546 -0.001840 0.001366 
+-0.000902 -0.006329 0.001273 0.002255 -0.007257 -0.001162 
+0.007303 0.000759 -0.004680 0.004512 0.005130 -0.003498 
+0.000562 0.004240 -0.001438 -0.002059 0.000314 -0.000303 
+-0.002189 0.001053 0.000321 -0.002864 0.002478 -0.000618 
+-0.002759 0.002002 -0.000600 -0.002544 0.000387 -0.000158 
+-0.000588 -0.000425 -0.001545 0.001455 -0.001051 -0.001374 
+-0.000872 -0.002104 -0.000722 0.000081 -0.002225 0.001419 
+-0.000336 -0.000336 0.001269 0.000394 -0.004335 -0.001077 
+-0.002009 -0.006098 -0.002583 -0.000200 -0.003932 -0.000287 
+0.003674 0.001321 -0.001311 0.004170 0.006423 -0.001446 
+0.002320 0.004580 -0.006661 0.000691 0.000291 -0.006438 
+0.002501 -0.000499 -0.004669 0.003948 0.001631 -0.003131 
+0.002911 0.000656 -0.000804 -0.000590 -0.003540 -0.001227 
+0.000384 -0.003428 -0.001400 0.000644 0.000355 0.000688 
+-0.000167 0.003236 0.001481 0.000106 0.004370 0.000700 
+0.000968 -0.002668 -0.003401 0.000898 -0.004968 -0.003242 
+-0.002937 -0.001048 -0.002095 -0.000546 0.000092 -0.001735 
+0.002519 0.003359 0.000000 0.003466 0.001922 -0.001267 
+0.000299 0.000047 -0.000802 0.000494 -0.001025 -0.000719 
+0.001613 0.003297 -0.002068 0.004088 0.001764 0.003270 
+0.007034 0.005338 0.001842 0.002943 0.004592 0.002031 
+-0.001127 0.002473 0.001444 0.000783 0.001539 0.002086 
+-0.000317 0.000141 -0.001935 0.002704 -0.001015 -0.004466 
+0.003245 -0.000847 -0.004736 0.004684 -0.000393 -0.002387 
+0.000620 0.001121 0.000993 0.001845 0.003881 -0.004963 
+0.001701 -0.000122 -0.001013 -0.001971 -0.000659 -0.000412 
+-0.000439 -0.000127 -0.000201 0.001211 -0.000756 -0.000121 
+0.001526 -0.001124 -0.003693 0.002096 0.000188 -0.001431 
+0.000022 -0.000030 -0.000072 -0.000103 -0.000060 0.000128 
+0.000065 -0.000520 -0.000803 -0.000851 -0.001161 -0.001238 
+0.001042 -0.000480 -0.000342 0.003558 -0.000939 0.000251 
+0.005552 -0.002595 -0.000543 0.001895 -0.003649 -0.003004 
+0.001819 -0.003505 0.001327 -0.000703 0.000879 0.001991 
+-0.003881 0.002226 -0.001667 0.000171 0.000333 0.000624 
+-0.000588 -0.000996 -0.001836 0.001477 -0.001895 0.001102 
+0.000620 -0.000837 0.004439 -0.002703 -0.003956 0.003264 
+-0.001845 -0.001177 0.001010 -0.000080 0.002800 0.002720 
+0.002256 0.001920 0.001995 0.001524 -0.000084 -0.000889 
+-0.000770 -0.002685 -0.003706 -0.001557 -0.000992 -0.002459 
+0.001269 0.000063 -0.001509 -0.000952 -0.000940 -0.004255 
+-0.003197 0.008852 -0.000082 0.000561 0.011565 -0.000983 
+-0.000977 0.004342 -0.000179 -0.002975 -0.002823 0.002151 
+0.001109 -0.002048 0.000532 -0.000848 0.001368 0.001100 
+-0.003095 0.003172 0.000429 -0.002935 0.002765 0.000546 
+-0.001359 0.001680 -0.000611 0.000751 0.001309 -0.001499 
+0.003074 0.001118 0.001956 0.002584 -0.001189 0.002300 
+0.001725 -0.003839 -0.001628 0.006345 -0.003213 -0.003976 
+0.006066 -0.000767 -0.000096 0.002215 0.001138 0.000369 
+0.000488 -0.000976 -0.000976 -0.000620 -0.001860 0.003223 
+-0.000331 -0.001543 0.003968 -0.000773 -0.001420 -0.000483 
+-0.000962 -0.005252 -0.003752 -0.002991 -0.006358 -0.004882 
+-0.001731 -0.003376 -0.003298 0.000036 -0.000128 -0.000059 
+-0.000854 0.001366 0.000851 -0.002341 0.000744 -0.000122 
+-0.002066 -0.000777 -0.001616 -0.000533 -0.001653 -0.002187 
+0.001905 -0.001161 -0.000883 -0.000678 0.000705 -0.000515 
+-0.001379 0.001759 -0.001914 -0.002459 0.000641 0.000606 
+-0.002586 -0.002105 -0.001383 0.000000 -0.000708 0.000067 
+0.006420 0.001873 -0.004977 -0.000128 0.004559 -0.006292 
+0.002228 0.001303 0.001095 0.002699 0.001098 -0.000096 
+0.002823 0.001331 -0.000547 0.001834 0.001823 -0.000091 
+-0.000591 0.000985 -0.000197 -0.003066 -0.001019 -0.000126 
+-0.002663 -0.003103 -0.000884 0.000575 -0.001845 -0.003388 
+0.001774 -0.001524 -0.000508 -0.001291 -0.002201 -0.001061 
+-0.005324 -0.004374 0.000325 -0.005577 -0.003776 -0.002462 
+-0.003167 -0.003449 -0.002319 -0.000102 -0.003441 -0.000857 
+0.003103 -0.003958 -0.001604 -0.000307 -0.003840 -0.000690 
+-0.001851 -0.001202 -0.002895 -0.002260 -0.001429 -0.000405 
+0.001297 0.000592 -0.003224 -0.001575 -0.001496 -0.001575 
+0.000540 -0.001180 -0.000226 0.000123 -0.000231 0.000075 
+0.001129 -0.001384 -0.000022 0.003532 -0.004358 -0.001283 
+0.003393 -0.005525 -0.001841 -0.000518 -0.002238 -0.001896 
+-0.000411 0.005071 -0.003125 0.003651 0.005635 0.000397 
+-0.001440 0.000702 -0.000862 -0.002183 0.001456 0.000000 
+-0.002146 -0.002601 -0.001187 0.000783 -0.001064 -0.000113 
+0.004370 0.001654 -0.003661 0.002865 0.003854 -0.000495 
+0.000192 -0.000766 0.000888 -0.000699 -0.001953 0.003995 
+-0.000843 -0.002336 0.003852 -0.002752 -0.000634 0.001033 
+-0.003078 0.004159 -0.003320 -0.000284 -0.000917 -0.005103 
+0.001204 0.014440 0.001675 -0.000097 0.015635 0.001405 
+-0.002670 0.006098 0.004080 -0.005758 -0.000047 0.000974 
+-0.001960 0.001306 0.001825 -0.002071 -0.001798 -0.001013 
+-0.000390 0.001759 -0.000649 0.000881 0.002565 -0.002530 
+0.002198 0.002272 -0.004469 -0.001069 0.001147 -0.006335 
+-0.000645 0.000107 -0.005912 -0.000180 0.000471 -0.000873 
+-0.003443 -0.003174 0.002380 -0.000209 -0.001208 -0.000918 
+-0.002715 0.000353 -0.002245 -0.002778 0.001487 0.000331 
+-0.001574 0.002240 0.000484 0.000486 0.003257 0.000283 
+0.004811 0.003803 0.000092 0.006514 0.001159 -0.000976 
+0.006739 -0.000162 -0.000723 0.006491 -0.000561 0.000795 
+0.003256 0.000913 0.003134 -0.000645 0.003410 0.002303 
+-0.003024 0.003182 0.002016 -0.001771 0.001475 -0.001344 
+-0.001394 0.000935 -0.001015 0.000322 0.001937 -0.000395 
+-0.000554 0.000369 -0.003120 0.000145 0.001402 0.000655 
+0.001076 0.001600 0.000475 0.002664 0.002270 -0.001234 
+-0.001637 -0.000414 -0.001775 0.001810 0.002455 -0.001066 
+0.000887 0.002778 -0.002381 -0.000023 0.000284 -0.000578 
+-0.000323 -0.004386 0.000261 -0.002843 -0.006528 0.001188 
+-0.000923 -0.003554 0.000384 0.003084 0.003566 -0.000705 
+0.002077 0.006905 0.000156 0.001569 0.001606 0.001569 
+-0.003230 -0.002533 0.002496 -0.001728 -0.004026 0.003270 
+-0.000248 0.001870 -0.001981 0.004135 0.004859 -0.000487 
+0.003966 0.001591 -0.001658 -0.000429 -0.004467 0.000380 
+-0.004033 -0.006833 0.000187 -0.004770 -0.003651 -0.000477 
+-0.002474 0.000767 0.000939 -0.000919 -0.001247 -0.000617 
+-0.000345 -0.001489 0.001558 0.000958 -0.000616 -0.000291 
+0.001248 -0.000402 -0.001069 0.003118 0.000398 0.001615 
+0.000511 -0.001499 0.002936 0.003353 0.000792 0.001609 
+0.006984 -0.005709 -0.003826 0.000325 -0.002902 -0.001918 
+0.001766 -0.000157 0.001652 -0.000973 -0.002053 0.001027 
+-0.001932 -0.000889 0.000705 -0.001316 0.001034 -0.000164 
+-0.000861 -0.008281 0.002098 0.001822 -0.002178 -0.001069 
+0.001548 -0.001548 -0.001508 0.001390 -0.001507 -0.003715 
+0.004018 0.004304 -0.008464 0.003943 0.009777 -0.004989 
+-0.000815 0.002158 -0.002197 0.003662 -0.002319 0.001757 
+0.000451 -0.003451 -0.004051 -0.006079 -0.002128 -0.005152 
+0.001181 0.006932 -0.013417 -0.002174 0.020339 0.002713 
+-0.005801 0.020086 0.000205 -0.007091 0.011250 0.000357 
+-0.006371 0.000388 0.001028 -0.005536 -0.004828 0.002025 
+0.001081 -0.007201 0.003151 0.000611 -0.000619 0.003098 
+-0.000444 0.000947 -0.001560 -0.000199 0.004718 -0.003079 
+0.000385 0.003692 -0.003692 0.000720 0.001517 -0.001251 
+0.000531 -0.001929 0.000762 0.001380 -0.002496 0.001949 
+-0.000971 -0.004720 -0.000536 -0.001522 -0.000877 0.000554 
+-0.002788 0.003440 -0.001601 0.001415 0.004640 -0.002123 
+-0.000531 0.003633 -0.001900 -0.000732 0.000241 -0.000151 
+-0.000813 -0.002242 -0.000320 0.001097 -0.003392 -0.001915 
+0.003902 -0.004225 -0.003012 0.003426 -0.005680 -0.003410 
+0.001375 -0.005250 -0.003625 -0.000422 -0.004693 -0.001002 
+-0.000681 -0.002551 -0.001530 0.000591 -0.000400 -0.000289 
+-0.000641 0.001649 0.000138 -0.001220 0.001654 -0.001220 
+-0.002222 0.000257 -0.000043 -0.003522 -0.000494 -0.001009 
+-0.002890 0.001682 -0.003246 -0.000816 0.000466 -0.006953 
+0.002142 0.001742 -0.007769 -0.000242 -0.001468 -0.000935 
+0.000197 -0.003318 -0.001653 -0.001322 -0.004977 -0.001438 
+-0.002127 -0.000813 -0.001430 0.002492 -0.000708 -0.001050 
+0.000878 -0.000013 -0.000510 -0.000979 0.001077 0.000509 
+-0.000067 0.001082 0.000039 0.001035 0.001222 -0.000307 
+0.001293 0.000051 -0.000912 -0.000516 -0.001349 0.000325 
+-0.002796 -0.001425 -0.000054 -0.002807 0.001666 -0.003148 
+-0.000990 0.003359 -0.003593 -0.003311 0.002081 -0.000419 
+-0.002405 -0.000611 -0.002405 -0.001736 -0.001508 -0.001105 
+0.001371 -0.002135 0.000474 0.003562 -0.003422 -0.000093 
+0.001015 -0.003141 -0.002432 -0.001588 -0.001956 -0.001714 
+-0.002456 -0.000530 -0.002149 -0.003088 -0.000283 -0.000063 
+0.001434 -0.008604 0.002397 -0.006156 -0.011671 0.006326 
+-0.003502 -0.010395 0.005184 -0.001701 -0.002997 -0.002369 
+0.003928 0.003031 -0.005039 0.004158 0.009236 -0.006935 
+0.003413 0.002804 -0.008288 0.003093 0.000170 -0.003604 
+0.005629 0.001615 -0.002294 -0.000251 -0.000077 -0.000379 
+-0.000726 -0.000040 0.001492 -0.001834 -0.000353 0.000735 
+-0.001826 -0.000430 -0.001612 0.003976 0.003292 -0.007910 
+0.000917 0.003089 0.000507 -0.000705 -0.004952 -0.002259 
+0.000893 -0.003701 -0.003420 -0.004117 0.006227 0.005365 
+-0.011387 0.030327 -0.016946 -0.006499 0.039087 -0.004075 
+-0.008534 0.026563 0.002455 -0.006759 0.008859 0.002092 
+-0.005375 -0.002424 -0.000939 -0.006222 -0.004056 0.001111 
+-0.002207 -0.002213 0.003528 -0.000352 0.001034 0.000128 
+0.002556 0.003367 0.000321 0.001537 0.004359 0.001570 
+-0.003253 0.002159 -0.002180 0.000850 0.004585 -0.003771 
+0.000671 0.000104 -0.001908 -0.001562 -0.000678 0.000261 
+-0.003112 -0.000330 0.001627 -0.004423 0.000822 0.002785 
+-0.004923 0.001923 0.000000 -0.001568 0.003647 -0.002872 
+0.000430 0.006188 -0.002983 0.003634 0.006533 -0.002661 
+-0.000478 0.000718 -0.004622 0.003250 -0.000500 0.000250 
+0.003746 -0.003663 -0.000337 0.001597 -0.005042 0.000000 
+-0.001087 -0.004500 -0.000320 -0.000455 -0.001956 -0.001238 
+0.000726 0.000811 -0.000783 0.000257 0.000097 0.000059 
+-0.000304 -0.001100 -0.001381 -0.000161 -0.000685 -0.002056 
+0.002196 0.001042 -0.002122 0.005273 0.002233 -0.003094 
+0.006481 0.002963 -0.005317 0.006275 0.002577 -0.005883 
+0.001644 0.003078 -0.005351 0.000532 -0.000354 -0.002670 
+0.000535 -0.001425 0.001866 -0.006280 -0.007952 0.003530 
+-0.008372 -0.002927 0.003162 -0.002324 -0.006162 0.005392 
+0.000453 -0.001341 0.000074 0.002218 0.006523 -0.000115 
+0.000414 0.007815 -0.000725 -0.002462 -0.000298 0.000364 
+-0.004232 -0.002665 0.002374 -0.002628 -0.002795 0.000713 
+0.000198 -0.001053 0.000022 0.001194 -0.000299 -0.000896 
+0.001483 -0.000769 0.000550 0.000845 -0.001412 0.002076 
+0.000680 -0.001813 0.000680 0.002011 -0.000767 0.000265 
+0.002835 -0.001416 0.000530 0.003312 -0.000804 0.000472 
+0.002655 -0.000323 0.001017 -0.000632 0.004111 0.000949 
+-0.002318 0.004621 -0.000773 -0.000884 0.002141 -0.001917 
+0.000412 0.000513 0.000415 0.003415 -0.002033 0.000325 
+-0.000730 -0.000656 0.000534 -0.001016 -0.000153 -0.001072 
+-0.000416 0.001016 -0.000971 -0.000844 0.002661 -0.002402 
+0.000147 -0.001559 -0.006025 0.003990 0.001923 -0.007548 
+0.000563 -0.000163 0.000145 0.004565 0.001445 -0.001336 
+0.005611 0.002154 -0.001133 -0.001310 -0.000831 -0.001114 
+-0.005561 0.000517 -0.001866 -0.001329 -0.003990 0.003979 
+0.001337 -0.005748 0.003721 -0.000937 -0.008109 0.001401 
+-0.001440 0.002053 -0.006412 -0.012467 0.019392 -0.014235 
+-0.009339 0.038844 -0.012102 -0.007332 0.037395 0.000021 
+-0.000842 0.023973 0.006200 0.004345 0.005636 0.002829 
+-0.004484 -0.010160 -0.000268 -0.000044 -0.008709 0.001650 
+0.002460 0.000083 -0.002687 0.000807 0.000333 -0.000214 
+-0.003532 0.000675 -0.001597 -0.002741 -0.000848 -0.000294 
+-0.002352 -0.003646 0.002419 0.001897 -0.005690 0.001190 
+0.000491 -0.006122 -0.001713 -0.002526 -0.000872 -0.000690 
+-0.001683 0.001143 -0.002381 0.000000 0.005059 -0.000843 
+0.002400 0.003939 0.001169 0.000991 0.003210 -0.001770 
+0.000182 0.000799 -0.001753 -0.000127 -0.000921 -0.002373 
+0.000415 -0.002727 -0.000508 -0.000690 -0.003510 0.000465 
+-0.002200 -0.002120 0.000450 -0.001421 0.000393 0.000466 
+-0.000171 0.000245 0.000252 0.000307 -0.001031 0.000828 
+-0.000359 -0.001966 0.001349 0.000608 -0.000375 0.000454 
+0.001478 0.002608 0.000108 0.001299 0.003937 -0.000134 
+0.000033 0.004344 -0.000016 0.000705 0.001192 0.000840 
+-0.000909 -0.000144 -0.000750 0.002893 -0.001983 -0.001322 
+0.000665 -0.003112 -0.001116 -0.000247 -0.000878 -0.000850 
+-0.001047 -0.000356 -0.001453 -0.000219 -0.001529 0.000382 
+-0.002584 -0.007099 -0.002213 -0.006838 -0.001618 0.001985 
+-0.002586 -0.000427 0.000195 0.001928 0.005828 0.000407 
+0.002755 0.005227 -0.000427 0.000765 0.000349 -0.000169 
+0.001044 -0.000566 0.000183 0.001508 0.002628 0.000188 
+0.002419 0.003548 -0.001210 0.000628 0.000219 -0.000847 
+0.000369 -0.000873 -0.000054 0.000076 -0.000497 -0.000310 
+0.000182 -0.001290 -0.001210 -0.000274 -0.000990 -0.001827 
+0.000276 -0.001119 0.000108 0.002279 0.002009 0.000201 
+0.007072 0.005645 -0.004137 0.007585 0.005165 -0.008123 
+0.004485 0.000711 -0.003109 -0.004321 -0.003591 0.000999 
+-0.004846 -0.005724 0.006309 0.003683 -0.003978 -0.000296 
+-0.000775 -0.006759 -0.001674 -0.002377 -0.003314 -0.001420 
+0.000533 -0.000943 -0.000082 -0.000030 -0.000121 -0.001453 
+0.000520 0.001130 -0.001861 -0.000209 -0.000197 0.000242 
+-0.004497 -0.001138 -0.000053 -0.002544 0.001552 0.001440 
+-0.000019 0.000171 0.000119 0.001291 0.000394 -0.003874 
+-0.000737 -0.001462 -0.001317 0.000168 -0.000208 -0.000037 
+-0.001317 -0.008163 0.003337 0.001685 -0.002536 -0.003056 
+-0.001642 0.000710 0.000936 -0.010856 0.013931 -0.016504 
+-1.155039 4.542635 -0.550388 -0.012495 0.042347 0.003035 
+-0.000819 0.026946 0.008241 0.009423 0.008310 -0.000785 
+0.001320 -0.008589 0.001125 0.001232 -0.006438 0.003708 
+-0.001916 -0.002374 0.002383 -0.001308 -0.001822 -0.001366 
+0.001272 0.001781 -0.003308 0.003477 -0.000869 -0.003731 
+0.001730 0.001492 -0.004681 0.001849 -0.001270 -0.004161 
+0.001675 -0.001382 -0.003350 0.001765 0.000358 -0.001944 
+0.000546 -0.000345 -0.000119 -0.000866 -0.002420 -0.000269 
+0.000779 -0.001129 -0.000550 0.001888 0.002763 0.000250 
+-0.002041 0.004444 0.000181 -0.000901 0.003273 -0.001709 
+0.000712 0.000136 -0.000871 -0.000236 0.000356 -0.000553 
+-0.001954 -0.000995 -0.003856 0.001839 -0.003968 -0.002575 
+0.000023 -0.003289 0.000975 -0.000717 -0.002595 0.000196 
+0.000682 -0.001216 -0.000203 -0.000407 0.001539 -0.002354 
+0.000546 0.001017 -0.002825 -0.000530 0.000307 -0.001423 
+-0.001221 -0.000999 -0.000472 -0.000339 -0.000796 -0.000089 
+0.000871 0.000634 0.000336 0.000204 0.000937 -0.002368 
+-0.000145 0.002756 -0.002225 0.000926 0.002940 -0.000389 
+0.003077 0.002098 0.000752 0.003043 0.000435 0.001304 
+0.003020 0.000199 -0.000131 0.001425 0.001572 -0.000302 
+-0.000737 0.003313 0.001314 -0.002728 0.002727 0.003252 
+-0.005433 0.001180 0.003885 -0.007351 0.001006 0.005523 
+-0.005174 0.002055 0.008151 -0.003060 0.003324 0.003799 
+0.000831 0.000907 0.001107 0.003241 -0.001939 -0.002541 
+0.002562 -0.001962 -0.003004 0.000218 -0.000229 -0.000507 
+-0.001229 -0.000768 0.001691 -0.000792 -0.002550 0.002105 
+-0.001043 0.000417 0.002636 -0.003948 -0.002956 0.001634 
+-0.004425 -0.001600 -0.002975 -0.007351 -0.003244 -0.002956 
+-0.007500 -0.005988 0.000029 -0.002353 -0.006361 0.005401 
+0.001098 -0.003804 0.005922 0.002694 -0.005403 -0.000014 
+0.002823 -0.002352 -0.002358 -0.002502 -0.000631 0.000022 
+0.000319 0.000247 0.000416 0.000842 0.000771 -0.000069 
+0.001290 0.000633 -0.001004 0.001864 -0.000023 -0.002068 
+0.003814 0.006899 -0.001907 0.002868 0.002533 -0.003036 
+-0.000964 -0.001220 -0.003601 -0.000394 -0.000328 -0.000416 
+0.002273 0.003969 0.000712 0.001880 0.002648 0.003204 
+0.005259 -0.000733 -0.000733 0.000746 -0.003041 0.000517 
+-0.007482 0.008916 -0.000846 -0.006281 0.020651 -0.016666 
+-0.001665 0.040932 -0.006820 -0.000781 0.038651 0.005549 
+0.014198 0.024484 0.012598 0.005744 0.007905 -0.003715 
+0.000309 -0.003943 0.000608 -0.000069 -0.002401 0.000783 
+-0.003455 -0.001604 -0.001414 -0.001961 -0.000781 -0.001487 
+0.000338 -0.000716 -0.000613 0.001136 -0.000487 -0.000446 
+0.000333 -0.000799 -0.000413 0.000079 -0.002400 -0.000686 
+0.002194 -0.003687 -0.002287 -0.000231 -0.002154 -0.004308 
+0.000840 -0.003330 -0.001237 0.001727 0.002811 0.001707 
+0.003400 0.008130 -0.000378 0.003615 0.005905 0.000764 
+0.000349 -0.001594 -0.002217 0.001621 -0.002837 -0.004959 
+0.001024 -0.004664 -0.004232 0.000953 -0.002600 -0.002917 
+0.000666 0.000251 -0.002249 0.003485 0.001977 -0.001173 
+0.004732 0.002339 -0.001108 0.003926 0.000537 -0.001995 
+0.001881 -0.003205 -0.000886 0.000679 -0.002680 0.000500 
+-0.002140 -0.000632 -0.001536 -0.003289 -0.000314 -0.003352 
+-0.004207 -0.005115 -0.001195 -0.005200 -0.000047 -0.000188 
+0.001302 -0.001280 -0.002997 0.010256 0.003567 -0.007314 
+0.012000 0.006000 -0.009160 0.003741 0.005266 -0.005172 
+0.000086 0.000373 -0.000226 -0.005357 0.001638 0.001196 
+-0.004555 0.001789 0.000375 -0.004972 -0.000528 0.001875 
+-0.003478 -0.003515 0.002745 -0.002596 0.001866 -0.001519 
+-0.006002 -0.003176 -0.001778 -0.005564 -0.005188 -0.000457 
+-0.007148 -0.007166 0.001767 0.001617 -0.007277 0.002910 
+0.000522 -0.001005 -0.002108 -0.001172 -0.001413 -0.004805 
+0.001640 -0.000369 -0.005424 0.000748 0.000186 -0.003559 
+-0.000919 -0.002426 -0.000257 -0.001050 -0.003666 0.002369 
+-0.000871 0.000303 0.002575 -0.004276 -0.003786 -0.001469 
+-0.003068 -0.001998 -0.002297 0.000169 -0.001055 0.000090 
+-0.000685 -0.000967 0.001854 -0.000845 -0.001241 0.004472 
+-0.002787 -0.004590 -0.001393 0.000800 -0.002080 -0.001920 
+0.001241 -0.001843 -0.001595 0.000106 -0.004312 0.003783 
+0.003778 -0.001736 0.003931 0.001236 -0.002195 0.000618 
+-0.000419 -0.001678 0.001557 -0.000067 0.000293 0.000326 
+-0.004909 -0.000136 -0.000863 -0.002778 0.002320 0.000843 
+-0.000123 0.000938 0.000382 -0.002165 -0.000201 -0.003348 
+-0.002616 -0.002547 0.000958 -0.000994 -0.003993 0.002990 
+0.000800 -0.004745 0.003743 -0.000399 -0.004235 -0.000854 
+-0.004210 0.005745 -0.001235 -0.003473 0.008284 -0.010072 
+-0.001190 0.023918 -0.005892 -0.003974 0.024610 -0.001166 
+-0.001299 0.008669 0.001947 -0.000098 -0.008475 -0.002671 
+0.000422 -0.008196 -0.002901 0.002771 -0.001047 -0.002428 
+-0.003784 0.001725 -0.003377 0.002332 0.004665 -0.005831 
+0.002252 0.001696 0.000306 0.002661 -0.000949 0.000237 
+0.004309 -0.000805 -0.000268 0.005110 -0.001158 -0.002089 
+0.002592 -0.002286 -0.002648 0.000633 -0.001439 -0.001459 
+0.000544 -0.000355 -0.000117 0.003734 0.002992 -0.001014 
+0.005402 0.004858 -0.005399 0.002973 0.005348 -0.005867 
+-0.000476 0.003407 -0.005494 0.001322 0.000000 -0.004545 
+-0.000946 0.000702 -0.002197 -0.002160 -0.000480 0.000000 
+-0.002417 0.000310 -0.003149 -0.001874 0.002517 -0.001412 
+0.002350 0.000265 -0.005420 0.000070 -0.002866 -0.004895 
+0.000000 -0.002632 -0.004135 0.000666 -0.002208 -0.001276 
+-0.000140 0.000592 0.000378 0.000323 0.002141 0.000612 
+0.000708 -0.000323 -0.000481 0.003287 -0.001643 -0.003101 
+0.006656 0.002099 -0.003738 0.002850 -0.000133 -0.002563 
+-0.004392 -0.000945 -0.003613 0.000532 -0.002027 0.000721 
+0.000460 -0.001720 -0.001499 0.000780 -0.001686 -0.002248 
+0.002006 -0.004004 0.002020 0.001182 -0.000909 -0.000909 
+-0.001704 -0.001850 0.000119 -0.002139 -0.003180 -0.000870 
+-0.003754 -0.002889 -0.002474 0.000447 -0.002778 -0.002045 
+0.001315 -0.002770 -0.003900 0.000809 -0.005221 -0.002206 
+-0.002012 -0.004746 -0.001819 -0.003215 -0.001983 -0.000565 
+0.002331 -0.001419 0.002331 0.001085 0.001853 0.001429 
+-0.000683 0.000158 -0.002996 -0.000329 -0.001182 -0.002761 
+0.000454 0.000528 0.000098 0.004539 0.002869 -0.002569 
+0.005597 0.005710 -0.004169 0.001288 -0.000887 -0.003547 
+0.000059 0.003500 -0.000518 -0.001386 0.000579 0.001093 
+0.001133 -0.002427 -0.000269 0.000121 -0.004286 -0.000844 
+0.000265 -0.002016 -0.000248 0.000770 0.001739 0.000878 
+0.000445 0.003040 0.001598 -0.001669 0.001509 0.002223 
+-0.002649 -0.002651 0.004240 -0.004583 -0.004475 0.001182 
+-0.005299 -0.003106 0.012967 -0.004189 -0.002668 0.009425 
+0.001354 -0.000791 -0.000120 0.002332 0.004238 -0.007581 
+0.001216 0.000426 -0.002562 -0.005202 -0.006383 0.002830 
+-0.007302 -0.009242 0.005483 0.029025 -0.006525 -0.028778 
+-0.021312 -0.020576 -0.014542 -0.004780 -0.012316 0.019668 
+-0.004845 -0.021872 0.036017 -0.004208 -0.010015 0.007324 
+0.008417 0.008130 -0.003934 0.009082 0.008696 -0.005301 
+0.004113 -0.001665 0.004375 0.005077 0.000797 0.001650 
+0.004110 0.001487 -0.001316 -0.003498 -0.003276 0.001719 
+-0.017345 -0.005701 0.001888 -0.019146 -0.010958 -0.000422 
+0.000359 -0.003672 -0.001461 0.012682 -0.006351 -0.003809 
+0.009510 -0.009328 -0.005958 0.014671 0.007310 0.003368 
+0.000459 0.008724 0.011020 0.003982 -0.002942 -0.006152 
+-0.012609 -0.010764 -0.002990 -0.015770 -0.028350 0.001772 
+-0.028211 -0.012255 0.005472 0.003426 0.026452 -0.007617 
+0.023539 0.024118 0.001623 0.052956 0.044807 -0.016804 
+-0.002368 -0.003760 -0.000319 0.002069 -0.006418 0.000671 
+0.024045 0.052064 0.017145 -0.009040 -0.041128 0.028233 
+0.002755 -0.016106 0.011308 0.000176 -0.004559 0.001218 
+-0.000187 0.003448 -0.008553 -0.004919 0.010075 -0.005825 
+-0.006476 0.007548 -0.002155 0.015280 0.017442 0.001626 
+0.019111 0.003421 0.001045 -0.001194 -0.007217 0.002049 
+0.008810 -0.000417 -0.017202 -0.047271 0.010987 0.007992 
+-0.008048 0.013885 0.018193 -0.001294 0.000812 -0.000297 
+0.001571 -0.004373 -0.003632 0.001571 -0.003917 -0.002635 
+0.002291 -0.001199 -0.000609 0.007487 0.006031 -0.002353 
+0.007092 0.008724 -0.008284 0.001317 -0.002511 -0.000498 
+0.010163 0.032780 -0.028739 -0.002178 0.002197 -0.009168 
+0.000190 -0.000513 -0.000554 -0.000090 0.001092 0.000489 
+-0.000216 -0.000302 0.000389 0.001584 -0.003041 -0.000319 
+0.001306 -0.017786 -0.005254 0.003099 0.002589 -0.001747 
+0.006978 0.011953 -0.003433 0.002244 0.001048 0.000996 
+-0.002290 -0.008122 -0.002434 -0.010849 0.008064 -0.004085 
+-0.015860 0.012111 -0.006490 -0.013427 -0.005014 -0.006965 
+-0.016630 0.006071 -0.006081 -0.010679 0.003169 -0.007138 
+-0.000678 0.000305 -0.006094 0.006372 -0.000579 -0.000771 
+0.009518 0.000931 0.003049 0.009888 0.001990 0.003252 
+0.010813 0.002714 0.001680 0.012083 0.006222 0.001459 
+0.001878 -0.000186 0.002001 0.002976 0.000241 0.001573 
+0.004408 0.001965 -0.003109 0.004418 0.003712 -0.004983 
+0.003230 0.004579 -0.002730 0.001628 -0.000215 -0.003685 
+-0.001821 -0.003021 -0.001207 -0.003812 -0.006548 0.009417 
+-0.000200 -0.020996 0.004267 0.028701 0.001305 -0.020909 
+-0.039552 -0.015843 -0.006271 -0.011515 -0.022503 0.000946 
+-0.002030 -0.001314 0.000554 0.009117 0.019986 -0.029949 
+0.036319 0.022419 -0.001140 0.007675 0.007114 0.000570 
+-0.006036 -0.002616 0.001216 -0.010028 -0.001724 -0.001075 
+0.001262 -0.007841 0.002591 0.004998 0.006399 0.001233 
+0.000478 0.011322 0.004188 -0.004461 0.001569 0.001306 
+-0.001885 -0.002369 -0.001936 -0.000640 -0.000684 -0.000614 
+-0.006851 0.010722 0.011359 -0.005949 0.011642 0.008923 
+0.003136 0.000974 0.001511 -0.003623 0.000130 -0.010042 
+-0.011790 0.000675 -0.004843 -0.003396 -0.000881 -0.001803 
+-0.040394 0.056479 0.019245 -0.006454 -0.042819 -0.040514 
+0.001185 0.001259 0.013481 0.002948 0.004469 -0.014310 
+0.117717 0.097417 0.065683 -0.003277 -0.001845 -0.006650 
+-0.002685 0.004909 -0.001445 0.005621 0.011329 -0.005421 
+0.007226 0.005502 -0.008573 0.006197 0.015015 -0.017599 
+0.003832 0.016259 -0.006499 0.003179 0.009936 -0.003277 
+0.005378 0.005524 -0.005082 0.004697 -0.013333 0.017424 
+0.000670 0.002101 -0.012456 -0.001707 -0.002382 -0.019930 
+-0.001185 -0.001862 -0.005317 0.000355 -0.002892 -0.003558 
+0.001986 -0.003020 -0.002881 0.003052 -0.001800 -0.000551 
+0.002763 0.001503 -0.000614 -0.000472 0.000938 0.000406 
+-0.000529 0.000686 0.000488 0.005568 -0.019837 0.020166 
+-0.001064 0.000291 -0.004208 -0.004837 0.005740 -0.006055 
+-0.002222 0.001560 -0.002208 -0.003436 0.000945 0.000185 
+-0.001450 0.002996 -0.003446 -0.000436 -0.000267 -0.001955 
+0.013444 -0.025638 0.009478 0.033004 0.067004 -0.022859 
+-0.002433 0.049006 -0.023318 -0.001968 -0.000190 -0.003561 
+-0.002866 -0.001088 -0.006103 -0.005582 0.001132 -0.007940 
+-0.006896 0.007085 0.001078 -0.006282 0.007743 0.001463 
+-0.005753 0.005200 0.004402 -0.010820 -0.001482 -0.000294 
+-0.002031 -0.008350 -0.002000 -0.001876 -0.001203 0.001309 
+-0.000926 -0.002555 0.004528 -0.004586 -0.008181 0.006896 
+-0.004831 -0.007600 0.001901 0.002270 0.004914 -0.000084 
+0.000219 -0.002848 -0.002636 0.003593 -0.003231 -0.004721 
+0.001583 0.000047 -0.006602 0.000873 0.000666 -0.004492 
+-0.000472 0.000191 -0.002730 0.001803 0.001785 -0.003328 
+-0.000412 -0.000633 -0.000010 0.000229 -0.004583 0.006880 
+0.003961 -0.012803 0.014740 -0.008879 -0.053989 0.041710 
+0.001055 -0.001382 0.000182 -0.015221 0.026222 -0.030908 
+0.026715 -0.000319 -0.009290 -0.036698 -0.022680 0.064914 
+0.125068 -0.010615 0.068383 -0.022910 -0.022995 -0.000979 
+-0.014417 -0.020753 0.006247 -0.006658 -0.014407 0.006901 
+0.000893 0.008377 -0.003958 0.001936 0.017437 0.000075 
+-0.003869 0.008618 0.000452 -0.002674 -0.001671 -0.001246 
+0.001169 -0.003601 -0.002498 0.002085 -0.000539 -0.001142 
+0.001894 0.003950 0.007116 0.002031 0.004635 0.007530 
+0.002585 0.003583 0.004451 0.007300 0.002113 0.000161 
+0.012242 0.006112 -0.008248 0.019234 0.009031 0.002247 
+-0.000493 0.000033 0.000634 -0.000780 0.000174 0.000619 
+-0.000402 0.000140 0.000302 0.026807 -0.028175 0.001193 
+0.010118 0.014536 0.007125 -0.002968 -0.008898 0.000128 
+0.002777 0.003660 -0.001053 0.010059 0.012171 -0.013180 
+0.014027 0.006438 -0.009493 0.016522 -0.002073 0.005565 
+0.011227 0.000620 0.003348 -0.003336 0.002829 -0.002294 
+-0.007416 0.012052 -0.017619 -0.003057 0.004648 -0.010695 
+0.000893 -0.000274 -0.005709 0.000827 -0.000805 -0.004802 
+0.000731 -0.001029 -0.003109 0.000636 -0.001355 -0.002637 
+0.000218 -0.000738 -0.000734 -0.002082 -0.000898 -0.000534 
+-0.003087 -0.002675 0.002246 -0.000995 -0.004073 0.002990 
+0.002777 -0.010226 0.008380 -0.000134 -0.007133 -0.018253 
+-0.009109 0.007401 -0.013951 -0.000966 0.002043 0.000295 
+0.000262 -0.001179 0.000039 -0.003163 -0.000995 0.003954 
+-0.002665 0.002854 0.001805 -0.001975 0.002991 -0.003158 
+0.003913 -0.003960 -0.009994 -0.016768 0.007929 0.003147 
+-0.008253 0.013286 0.000735 -0.005664 0.004354 -0.004520 
+-0.007656 0.005608 -0.006049 -0.003786 0.004662 -0.004751 
+-0.001114 -0.000216 0.002411 0.004879 -0.001311 0.008353 
+-0.004660 -0.011590 0.005571 -0.008399 -0.003460 0.006893 
+-0.004871 -0.001038 0.005583 -0.003389 -0.001074 0.004641 
+-0.002341 -0.000874 0.003484 -0.003738 -0.001675 0.000852 
+-0.006992 -0.002646 -0.002838 0.001419 -0.003310 -0.000447 
+0.001980 0.006708 -0.004497 -0.000920 0.003856 -0.003093 
+0.000634 -0.003377 -0.000436 -0.000126 -0.002598 -0.000893 
+0.000972 -0.000535 -0.002544 0.003075 0.002638 -0.000137 
+0.003980 0.002289 0.001848 0.007380 0.003509 0.001817 
+0.010745 0.005233 0.002153 0.015263 -0.001173 0.009514 
+0.026205 -0.004607 0.021532 0.023726 0.029052 0.005262 
+0.058672 0.029323 -0.000022 -0.006574 0.030588 0.026298 
+0.060770 0.024550 -0.004581 -0.016695 -0.026331 0.006066 
+-0.000678 -0.042615 0.011345 0.000958 -0.024385 0.005260 
+0.001419 -0.005397 0.005333 0.005616 -0.008125 0.008100 
+-0.001989 -0.012816 0.003270 -0.005585 -0.005868 -0.002790 
+-0.003622 -0.000367 -0.002751 -0.003456 0.001618 0.000539 
+-0.001956 -0.000021 -0.001128 0.000968 -0.000016 -0.002530 
+0.000790 0.000704 0.000702 0.000417 0.001930 0.002101 
+0.003064 0.001785 0.002588 0.001427 -0.000214 0.004760 
+-0.006799 -0.003455 0.007164 -0.013684 -0.003147 0.004970 
+-0.000105 -0.002353 0.004139 0.015348 0.005118 0.002662 
+0.037576 -0.073280 0.061518 -0.001429 -0.000649 0.003606 
+0.023333 0.009051 -0.005570 0.027244 0.011977 -0.015949 
+0.027030 -0.021381 -0.033837 0.053692 0.005395 0.021253 
+0.019508 0.052156 0.028411 -0.019785 0.013899 -0.021931 
+0.001194 -0.000263 -0.010756 0.005416 -0.003341 -0.004273 
+0.003622 -0.001582 -0.000462 0.000978 0.000896 0.001355 
+-0.001112 -0.000459 -0.000622 -0.002019 -0.002701 -0.001669 
+-0.002970 -0.001167 -0.000431 -0.001435 0.000001 0.000494 
+-0.001045 -0.000903 0.002431 0.001773 -0.002392 -0.000902 
+0.006006 -0.007544 -0.001891 -0.005487 0.001410 -0.016147 
+-0.001283 0.000487 -0.001559 0.005091 0.003326 0.003790 
+0.006901 0.002368 -0.003711 -0.000725 0.001117 -0.000725 
+-0.008112 0.003739 0.006795 -0.010286 0.014566 0.006459 
+0.000411 0.033309 -0.012150 -0.001762 -0.000930 -0.011723 
+-0.001503 -0.000214 -0.001980 -0.003990 0.002259 -0.002967 
+-0.005034 0.001875 -0.003384 -0.004753 0.000198 -0.001834 
+-0.004946 0.000878 -0.000466 -0.008268 -0.006648 0.002492 
+-0.007068 -0.004993 0.004312 -0.001939 -0.000842 0.000884 
+0.000776 0.002567 -0.001394 0.001531 0.003117 -0.001784 
+0.000113 0.002520 -0.003115 -0.001654 -0.000884 -0.001570 
+-0.000512 -0.000289 0.000034 0.000708 0.000301 0.000505 
+0.004181 0.005797 -0.004593 0.002228 0.002805 -0.006549 
+-0.000769 0.003403 -0.007613 0.002099 0.002900 -0.008256 
+0.001909 0.001559 -0.006468 0.003709 -0.000914 -0.002673 
+0.003151 0.003649 0.001024 0.003857 0.003909 0.002384 
+0.005406 0.001877 0.002502 0.006825 0.000228 0.003262 
+0.005963 -0.007292 0.007457 -0.007493 -0.040381 0.024978 
+-0.025598 -0.063629 0.053546 0.018293 -0.014934 -0.007092 
+0.028435 0.008299 0.011259 0.029371 0.047642 -0.014340 
+0.004930 0.004186 0.002535 -0.007433 -0.010782 0.008037 
+0.002515 -0.003199 -0.004628 0.018966 0.002925 0.006825 
+0.001142 -0.011174 0.014562 -0.004595 -0.009053 -0.002710 
+-0.000599 -0.003986 -0.001576 0.000619 -0.001353 0.000249 
+-0.004943 -0.000168 -0.000635 -0.000180 0.000056 -0.005789 
+0.001425 -0.000879 -0.002507 -0.004951 0.000241 -0.000720 
+-0.004317 0.001800 0.005328 -0.003924 -0.001870 0.004975 
+-0.004689 -0.003580 0.004339 -0.005407 -0.004280 0.003177 
+0.000051 -0.000661 0.000735 0.008345 0.004343 0.002661 
+0.025420 0.001077 0.015944 0.010897 0.015746 -0.011082 
+0.011081 0.035500 -0.029438 0.003678 0.010772 -0.012830 
+-0.011667 -0.012333 0.020000 0.004291 -0.000127 -0.001086 
+0.014511 0.015554 -0.021204 0.006007 0.014791 -0.017697 
+0.003534 0.000301 -0.005288 0.004766 -0.005391 0.003750 
+0.000678 -0.000069 0.000077 0.002157 -0.002186 -0.002176 
+-0.000557 -0.003095 -0.000631 -0.007261 -0.005185 -0.000134 
+-0.007641 -0.002702 0.003245 -0.002213 0.001958 0.000863 
+-0.001959 0.002171 0.000315 -0.001017 0.003109 0.006983 
+-0.043491 -0.050034 -0.088136 -0.009123 -0.000778 -0.023768 
+-0.000095 -0.002048 0.000064 -0.002357 -0.003960 0.003101 
+-0.005541 0.001709 0.004116 0.016138 -0.009593 -0.009198 
+0.019129 0.004798 -0.045037 -0.009049 -0.031035 -0.001310 
+-0.018104 0.005127 0.018743 0.003623 0.003592 0.006543 
+0.000695 -0.004555 0.000768 -0.001841 -0.010602 0.001020 
+-0.001417 -0.009726 0.003074 -0.002335 -0.009107 0.003407 
+-0.003183 -0.008481 0.005031 -0.003405 -0.006078 0.006019 
+-0.003290 -0.004272 0.005274 -0.004374 -0.004471 0.003555 
+-0.005023 -0.002746 0.000766 -0.003371 0.001698 0.001087 
+0.000164 0.000744 -0.000219 0.001804 -0.003589 0.000872 
+-0.000529 -0.004040 -0.001521 -0.001506 -0.000692 0.002828 
+0.002603 0.003149 -0.003628 0.004118 0.001196 -0.005007 
+0.000803 -0.002048 -0.003346 -0.004628 0.001010 -0.003168 
+-0.000678 0.003785 -0.002301 0.005597 0.002646 -0.003639 
+0.003980 0.001385 -0.004889 0.001662 0.003880 0.000093 
+0.002659 0.001670 0.002362 0.002681 0.002424 0.000778 
+0.004539 0.000564 0.002370 0.001726 -0.013281 0.012242 
+-0.009145 -0.030147 0.035144 0.010914 -0.013327 0.028728 
+0.009353 0.016674 -0.006507 0.054793 -0.009000 -0.023483 
+0.006708 -0.010846 0.024326 -0.010340 -0.017625 0.017257 
+-0.007667 -0.007667 0.015333 0.000554 0.009791 -0.005684 
+-0.002612 0.013739 -0.008914 0.000464 -0.005744 0.002165 
+-0.000226 -0.005883 0.001743 -0.001837 -0.006341 -0.000792 
+-0.000188 -0.004428 -0.000471 -0.001499 0.004480 -0.004418 
+-0.000018 0.005578 -0.004068 0.000857 -0.000434 0.000149 
+0.000207 -0.001292 0.000440 0.000364 0.001983 -0.000855 
+0.001438 0.000960 0.000911 -0.000382 -0.002611 -0.000446 
+0.002591 0.002708 -0.000859 0.007128 0.006669 -0.002441 
+0.008896 0.007153 -0.001798 0.005385 0.002356 0.000351 
+-0.004287 -0.005035 0.002998 0.000770 -0.009740 0.007942 
+0.017173 -0.015647 0.006960 -0.022968 -0.005430 0.015548 
+-0.004252 -0.008123 0.004180 0.002824 -0.002004 -0.000500 
+0.004295 -0.000112 -0.001950 0.001137 -0.003722 0.001103 
+-0.000747 -0.003180 -0.001558 -0.000192 -0.000890 -0.000971 
+0.001500 -0.000192 -0.003735 -0.002635 -0.000653 -0.003826 
+-0.001514 -0.002171 -0.003088 -0.001196 0.003039 0.000784 
+0.002039 0.001620 0.007509 0.007525 0.005420 0.034789 
+0.005440 -0.005500 -0.002857 -0.006954 0.001171 -0.008573 
+-0.007691 0.004013 -0.001445 -0.006206 -0.010269 0.026621 
+-0.009444 0.010702 -0.039181 -0.022170 -0.040528 -0.024888 
+-0.033185 0.001831 0.022530 -0.027328 -0.035943 -0.003386 
+-0.021852 -0.009473 -0.012806 -0.003490 0.006206 0.003945 
+0.005317 -0.002822 0.008556 0.005997 -0.006280 0.008724 
+0.002287 -0.005585 0.007605 -0.001340 -0.003413 0.005691 
+-0.002832 -0.003729 0.006132 -0.002552 -0.006202 0.007538 
+-0.001487 -0.008534 0.005060 -0.001377 -0.007752 0.000910 
+-0.003070 -0.003242 -0.000595 -0.002315 0.002335 -0.000335 
+-0.001874 0.003246 0.002031 0.000525 0.001077 0.003781 
+0.001112 -0.000209 0.000655 0.002258 -0.001040 -0.001544 
+0.003622 0.006736 -0.005275 0.007056 0.004911 -0.004670 
+0.007133 0.001834 -0.001570 0.005302 0.000057 -0.000523 
+0.004544 0.000022 -0.002673 0.003141 0.000400 -0.003008 
+0.000575 -0.000699 0.001579 0.001257 0.003362 0.002128 
+0.003161 0.004936 0.000620 -0.000851 0.003078 -0.003348 
+-0.006153 -0.005037 0.001919 -0.004001 -0.012845 0.009217 
+0.004176 -0.011581 0.011648 0.009479 -0.002240 0.010147 
+0.008717 -0.002016 0.018742 -0.017571 0.013506 0.064111 
+0.038702 0.009095 0.016474 -0.012634 0.061688 0.008925 
+-0.008406 0.020616 0.010399 -0.007027 0.007741 -0.005805 
+-0.001619 0.010004 -0.005206 -0.004495 0.003557 -0.010361 
+-0.000750 0.000064 -0.004728 0.000963 -0.001053 -0.003131 
+0.001605 0.001987 -0.001541 0.000494 0.005615 -0.003159 
+0.000321 0.004717 -0.003559 0.003357 0.002146 -0.002222 
+0.003968 0.003180 -0.003588 0.002450 0.001004 -0.007292 
+0.005983 -0.000092 -0.004763 -0.000557 -0.002992 -0.004976 
+0.002334 0.000698 -0.001937 0.003187 0.002944 -0.001232 
+0.002812 0.003515 -0.000161 0.003738 0.002359 0.000909 
+0.004534 0.000014 0.001792 0.001022 -0.004894 0.003152 
+-0.006164 -0.007557 0.003427 -0.014225 -0.015369 0.011777 
+-0.001073 -0.005423 0.003058 0.002661 0.002343 -0.003980 
+0.000764 0.001729 -0.003751 0.002160 0.002410 0.002541 
+0.000611 -0.000683 0.000768 -0.000089 -0.000111 -0.000889 
+0.004752 0.004572 -0.005451 0.003612 0.007529 -0.001981 
+-0.001148 -0.001428 -0.003226 -0.001241 -0.001888 -0.006810 
+0.002068 -0.004143 -0.001575 -0.005251 0.011895 -0.044049 
+0.000254 0.011396 0.011181 0.006463 0.002398 0.003261 
+0.008166 -0.016354 -0.002468 -0.014930 0.011350 0.025456 
+0.009962 0.043125 -0.017433 -0.004265 0.013051 -0.019449 
+-0.029467 -0.017733 0.030667 0.029112 -0.040160 0.010446 
+0.001892 -0.030535 -0.012993 0.003814 -0.004248 -0.001776 
+-0.001581 0.000189 0.002362 -0.002868 0.000064 0.003330 
+-0.002993 -0.001016 0.004016 -0.001450 -0.001803 0.003217 
+0.001072 -0.005049 0.003836 -0.000777 -0.011638 -0.002693 
+0.001412 -0.011977 -0.004889 -0.003562 -0.010266 -0.002416 
+-0.001861 0.002927 -0.000378 0.001346 0.011778 -0.000262 
+-0.002166 0.004049 0.002673 -0.003761 0.001164 -0.001154 
+-0.007583 -0.000254 -0.003932 -0.010757 -0.006781 -0.000950 
+0.000558 0.002591 -0.002883 -0.001423 -0.001515 -0.001846 
+0.001733 -0.007653 -0.002698 0.005009 -0.003830 -0.007742 
+0.001711 -0.000879 -0.011100 -0.005131 -0.003739 -0.002719 
+-0.002087 -0.004462 0.002628 -0.000083 0.000659 0.000090 
+0.003069 0.002261 -0.002587 -0.004285 0.001358 -0.003314 
+-0.006355 -0.001520 0.000933 -0.003488 -0.008177 0.004463 
+-0.000332 -0.012999 0.006624 -0.000305 -0.014729 0.007975 
+0.000763 -0.015141 0.012800 0.005724 -0.009886 0.018335 
+0.011781 0.010619 0.004669 0.019740 0.006749 -0.016898 
+0.006526 0.014500 -0.007769 -0.007412 0.001975 -0.000082 
+-0.004253 -0.004462 -0.000859 -0.006047 -0.001335 -0.011829 
+0.001480 0.004786 -0.006988 0.002328 0.003866 -0.002717 
+0.003094 0.001546 -0.001621 0.000693 -0.001240 -0.004667 
+0.001868 0.000895 -0.003346 -0.002636 -0.001987 -0.002999 
+-0.001973 0.000754 -0.003094 0.003051 0.001085 -0.003560 
+0.002280 -0.004600 0.001920 -0.002629 -0.005967 0.006018 
+-0.007867 -0.004575 0.004453 -0.001955 -0.005797 -0.002851 
+-0.001725 -0.010956 -0.003436 -0.005060 -0.009471 -0.003454 
+-0.004207 0.001854 -0.001073 -0.004006 0.005628 -0.001168 
+-0.005118 -0.002353 0.002364 -0.002930 -0.004473 0.004628 
+-0.001730 -0.003516 0.004193 -0.000006 -0.000860 0.001113 
+0.002848 0.000435 0.001470 0.005950 0.004739 -0.004232 
+0.003864 0.001827 -0.000708 -0.000204 -0.000429 -0.000037 
+0.000333 -0.001016 -0.000127 0.000438 -0.002642 -0.001632 
+0.001246 -0.003314 -0.006153 0.042724 -0.058786 0.043577 
+0.024331 -0.105669 0.069719 -0.001508 0.003613 0.016542 
+0.004554 -0.000031 0.007537 0.005266 -0.003903 0.000391 
+0.002439 -0.020527 0.011613 0.044911 0.064647 -0.051325 
+0.017709 0.073158 -0.004427 0.045001 0.006957 0.020248 
+0.087352 -0.006666 -0.123597 0.008503 -0.016964 -0.013401 
+0.002128 -0.001437 0.006155 -0.008208 -0.005621 0.018418 
+-0.004024 -0.004678 0.009356 0.001581 -0.000472 -0.001046 
+0.003757 0.001155 -0.004298 0.004604 -0.000008 0.000311 
+0.002800 -0.008014 -0.002482 0.000038 -0.007788 -0.007420 
+-0.008775 -0.007370 -0.001224 -0.005359 0.006031 -0.000256 
+0.002549 0.014301 -0.000799 0.001109 0.007770 0.004729 
+-0.000010 0.000610 0.000680 -0.005585 -0.000546 -0.003304 
+-0.012652 -0.011193 0.002466 0.000782 -0.016413 0.002705 
+-0.000859 -0.002617 -0.000529 0.000203 -0.003844 -0.002003 
+0.000336 -0.004271 -0.006772 0.000315 -0.004894 -0.009712 
+-0.004279 -0.005835 -0.004318 -0.001504 -0.008383 0.009073 
+-0.001253 -0.005979 0.003824 -0.000890 -0.003982 0.000987 
+-0.002014 -0.002380 0.003488 -0.002842 -0.000511 0.001914 
+-0.000343 -0.000290 0.000253 0.000483 -0.000545 0.000639 
+-0.000515 -0.001036 0.000261 -0.000702 -0.000079 -0.000463 
+0.004987 0.002045 0.002474 0.011447 -0.001388 0.014569 
+0.020043 -0.000874 0.012082 0.000327 0.003019 0.000856 
+-0.003046 0.005057 0.002089 -0.007764 0.017695 0.005622 
+0.002266 0.003116 0.001597 -0.001812 0.017577 -0.012543 
+-0.002211 0.011869 -0.003268 0.000187 0.005305 -0.001858 
+0.000851 -0.001118 -0.000322 0.000382 -0.003671 -0.005327 
+0.002256 -0.000983 -0.002322 -0.002705 0.000101 -0.000367 
+-0.001035 0.000259 0.000213 0.003362 -0.000913 -0.001732 
+0.001384 -0.002146 -0.001085 0.000763 0.000648 0.000723 
+-0.002842 -0.000973 0.005016 0.000645 -0.000660 -0.000506 
+-0.000207 -0.010420 -0.001863 -0.003785 -0.007054 0.001039 
+-0.001857 0.002462 -0.001579 0.002486 0.007821 -0.004717 
+0.004521 0.003642 -0.003851 0.001629 -0.001375 -0.000304 
+-0.002189 -0.004659 0.003460 0.000614 -0.001081 0.005928 
+0.004204 -0.004921 -0.000255 0.006784 -0.002554 -0.007714 
+-0.001832 0.002563 -0.003261 -0.001670 0.000604 -0.002386 
+-0.000494 -0.000339 0.001143 0.002032 -0.002719 -0.000555 
+-0.003216 0.004412 -0.004554 0.010035 -0.013633 0.048377 
+0.038894 -0.021086 0.040034 0.008142 -0.004534 0.010091 
+-0.005528 -0.007480 0.002406 0.007046 -0.011871 -0.002789 
+0.018638 0.029724 -0.019856 0.070000 0.150505 0.017706 
+0.009909 -0.012138 -0.002854 0.007875 -0.014839 0.008192 
+0.016066 0.002834 -0.020994 -0.001432 0.003574 -0.008573 
+-0.008039 0.006600 -0.000667 -0.008084 0.001716 0.004683 
+-0.004304 -0.001972 0.004412 0.002444 0.000405 -0.000831 
+0.003802 -0.003596 -0.000989 0.002945 -0.005072 -0.009147 
+-0.004687 -0.002629 -0.005965 -0.013987 -0.000480 0.002086 
+-0.013724 0.001902 0.003640 -0.004423 0.004094 -0.000582 
+0.002069 0.002660 0.003125 0.002985 -0.002317 0.002616 
+0.001175 -0.004526 0.000337 -0.014791 -0.008115 0.007538 
+-0.007937 -0.004619 0.007760 0.006273 -0.002211 -0.003557 
+0.002977 -0.001386 -0.000896 0.002324 -0.004230 -0.005792 
+-0.000874 0.000003 -0.009606 0.003772 0.001672 -0.007455 
+0.000815 -0.000444 -0.001157 0.005792 -0.003234 0.002734 
+0.003028 -0.009083 0.006972 -0.006763 -0.006080 0.005296 
+-0.005945 -0.005957 0.005695 -0.001510 -0.004439 0.003330 
+0.000122 -0.004448 0.002485 -0.001440 -0.005549 0.001408 
+-0.002544 -0.003690 -0.000585 -0.001741 0.000256 -0.002289 
+0.001303 0.004030 -0.001235 0.006097 0.007613 0.004694 
+0.013703 0.015841 0.003614 -0.067389 0.040420 -0.000680 
+-0.004393 0.030935 -0.005516 0.030249 0.036550 0.002318 
+0.034074 0.047346 -0.001519 -0.001991 0.008558 -0.014104 
+-0.000720 0.006927 -0.005266 0.000568 0.004075 -0.001261 
+-0.001048 -0.001021 -0.000550 0.000431 -0.001641 -0.002133 
+0.000964 0.000049 -0.000919 0.000828 0.001048 -0.000553 
+0.001146 0.000222 -0.000687 0.000835 0.000461 0.000387 
+0.003470 0.002643 -0.003759 0.003669 0.008561 -0.004822 
+0.004463 0.007566 -0.005194 0.004938 0.000988 -0.002965 
+0.003577 -0.001551 0.000030 0.001683 -0.000377 0.000126 
+0.000732 0.001936 -0.001060 0.001298 0.001834 -0.001673 
+-0.000651 0.000201 -0.000476 0.000906 -0.001545 -0.000441 
+-0.001480 -0.000169 0.003295 0.002398 -0.001346 0.003253 
+0.005622 -0.001057 -0.000953 0.005728 -0.002997 -0.005253 
+-0.000840 -0.001328 -0.009031 0.002132 0.002211 0.000175 
+0.003373 0.001124 -0.005009 0.000102 -0.000189 -0.000541 
+0.001573 0.007194 -0.000470 0.009835 0.043100 -0.021946 
+-0.010949 -0.008312 -0.011802 -0.004350 -0.011321 0.002759 
+0.012645 0.005636 -0.007065 0.026076 0.008500 -0.027050 
+0.054013 0.033295 -0.032019 -0.025710 0.030679 -0.037773 
+-0.020844 0.041443 -0.017274 0.004407 0.003053 -0.005865 
+0.000061 -0.006810 0.010218 -0.004027 -0.001056 0.004874 
+-0.005333 0.003208 0.000475 -0.002781 0.003778 -0.000458 
+-0.000634 0.001244 -0.000046 -0.001126 0.000706 -0.002154 
+-0.004167 0.006183 -0.005714 -0.009629 0.015307 -0.010451 
+-0.012284 0.016158 -0.001118 -0.006934 0.008539 0.000424 
+-0.006497 -0.000902 -0.000563 -0.007788 -0.005738 0.008392 
+-0.008329 -0.004327 0.010364 0.001154 0.003621 0.012706 
+0.007889 0.000035 0.012124 0.005674 -0.002598 0.010524 
+-0.000534 -0.003593 0.006175 -0.002708 0.003590 0.001272 
+0.002437 -0.003811 -0.003421 -0.000752 -0.003987 -0.004438 
+0.000779 0.001402 -0.007006 -0.003299 -0.002277 -0.005013 
+-0.004167 -0.003193 -0.004682 0.001221 -0.005303 -0.002621 
+0.006046 -0.000850 -0.001974 0.001264 0.000300 -0.000401 
+-0.000698 0.000597 0.001492 -0.001218 -0.001079 0.000171 
+0.000000 -0.001686 -0.001773 0.001598 -0.003627 -0.001854 
+-0.002696 -0.004853 -0.003139 -0.007101 -0.004833 -0.004666 
+-0.006679 -0.003945 -0.005342 -0.003480 -0.002292 -0.002153 
+0.004257 0.003111 -0.001928 0.012076 0.005431 -0.006719 
+0.014102 0.010509 -0.007611 0.013085 0.018679 -0.002051 
+0.013083 -0.006266 -0.016764 0.004489 -0.003349 -0.007468 
+0.003258 0.000325 -0.004333 0.000251 0.000158 0.000097 
+0.001188 0.000908 0.003467 0.003059 -0.001228 0.005334 
+-0.000022 0.000302 0.001749 -0.000127 0.000303 0.000935 
+-0.002970 -0.000017 0.002945 0.000107 0.001103 0.001099 
+0.000739 -0.000576 0.000807 0.000395 -0.000782 -0.000281 
+0.001183 -0.000673 -0.001093 -0.000692 -0.000576 -0.000423 
+-0.001251 -0.001374 -0.000546 -0.000439 0.000340 0.000179 
+0.001188 0.001395 0.000239 0.000550 -0.000897 -0.000788 
+0.001350 -0.000973 0.000296 0.001692 -0.001359 0.001611 
+0.002998 0.000285 0.002480 0.006516 0.004079 -0.006680 
+0.004421 0.000143 -0.009998 0.003620 0.002052 -0.008990 
+0.002151 0.001994 -0.002448 0.000115 -0.001046 -0.003347 
+0.001095 -0.002496 -0.002103 -0.002809 -0.003581 -0.005348 
+-0.005830 0.003859 -0.006297 -0.005568 0.014336 -0.014976 
+0.023668 0.005760 -0.007816 0.031006 0.005647 -0.008186 
+0.048151 0.026717 -0.026694 0.029389 0.025761 -0.013742 
+0.010606 0.001816 -0.000065 -0.007485 0.006956 -0.000502 
+-0.009148 -0.000232 0.007113 -0.001524 -0.005326 0.010049 
+-0.002316 -0.003386 0.008216 -0.006671 -0.003051 0.007012 
+-0.009081 -0.004359 0.002282 -0.004762 -0.000095 -0.001333 
+-0.000663 0.001469 0.002968 0.001278 0.000256 0.004148 
+0.004960 0.000803 -0.000295 0.000949 -0.005706 -0.006286 
+-0.001494 -0.009719 -0.008189 -0.000885 -0.013222 -0.006297 
+-0.001269 -0.013182 -0.000242 -0.006162 -0.002931 0.001665 
+0.005692 0.013436 0.003182 0.017721 0.013592 0.014235 
+0.025093 0.011685 0.017697 0.020147 0.010126 0.021413 
+0.010931 0.004223 0.010856 -0.000940 0.004161 -0.005539 
+0.006653 0.003137 -0.008019 0.002579 0.003252 -0.006806 
+-0.001872 0.000233 -0.004886 -0.002657 -0.003286 -0.003437 
+0.000198 -0.005585 -0.002922 0.003503 -0.005002 -0.004895 
+-0.002200 -0.003194 -0.005685 0.001915 -0.001290 -0.001323 
+0.000053 -0.003318 -0.002297 -0.002207 -0.003154 -0.002625 
+-0.002511 -0.001480 -0.001636 -0.005270 -0.000564 -0.001305 
+-0.007585 -0.000662 -0.001839 -0.007096 -0.000810 -0.002347 
+-0.004722 0.000811 -0.000961 0.002048 0.004146 -0.001937 
+0.003892 -0.001321 -0.007011 0.006182 0.001757 -0.005861 
+-0.002053 -0.002412 -0.001500 -0.011567 -0.009380 0.002453 
+0.003707 -0.007807 -0.010183 0.001681 -0.006771 -0.006989 
+-0.000771 -0.000287 -0.006157 0.000746 0.000776 -0.003298 
+0.001669 -0.001021 0.001165 0.003263 -0.004021 0.001865 
+0.001216 -0.004603 0.000374 -0.003190 -0.005092 -0.000512 
+-0.003490 -0.005161 -0.000063 -0.002273 -0.002945 -0.000052 
+0.001897 -0.001446 0.000829 0.003542 -0.000048 0.001230 
+0.001502 -0.001518 0.000210 -0.002616 -0.005675 0.000120 
+-0.004460 -0.007437 0.000119 -0.003669 -0.002423 -0.000259 
+-0.000451 0.000923 0.000403 0.000924 -0.000927 -0.000346 
+-0.001406 -0.003472 -0.000796 -0.002378 -0.004768 0.000036 
+0.000614 -0.003732 0.001453 0.003102 -0.002798 -0.000595 
+0.004437 -0.001058 -0.005872 0.003827 0.001782 -0.000464 
+-0.002279 -0.003312 -0.002135 -0.001941 0.000781 -0.001885 
+-0.002643 0.001302 0.001242 -0.001417 0.003857 -0.006133 
+-0.005092 0.008305 -0.003217 -0.011298 0.007198 -0.017248 
+0.047636 -0.028270 -0.033561 0.014308 0.004789 0.003274 
+-0.004826 0.027747 -0.003746 -0.001290 0.000407 0.000010 
+0.004250 0.008695 -0.002557 -0.002956 0.010766 -0.004191 
+-0.002122 -0.001728 0.005522 0.001958 -0.002021 0.002829 
+-0.001220 0.000449 -0.000929 -0.005119 -0.003743 0.000297 
+-0.003756 -0.003594 -0.001678 0.000111 0.002665 0.000631 
+-0.000971 0.009755 0.004699 -0.001815 0.004162 0.002690 
+0.007321 -0.013030 -0.008348 0.010242 -0.023568 -0.020095 
+0.655172 -3.167488 -1.689655 0.006766 -0.027609 -0.013702 
+0.007214 -0.015874 -0.006673 -0.000547 0.001233 0.000015 
+0.010626 0.011496 0.004972 0.018701 0.006561 0.012387 
+2.372340 0.638298 2.436170 2.427778 0.755556 2.666667 
+0.017887 0.007132 0.016022 0.003003 0.001220 0.000614 
+-0.000624 0.000070 0.000337 -0.007337 -0.003957 0.002049 
+-0.002783 -0.001602 -0.003571 0.004475 0.000878 -0.004874 
+0.007957 -0.002197 -0.006795 0.003691 -0.002279 -0.006594 
+-0.001291 -0.001169 -0.004444 -0.004414 0.001710 -0.003907 
+-0.000732 -0.000060 -0.000112 0.001080 0.003087 0.001443 
+-0.002165 0.003917 0.001227 -0.004244 -0.002768 -0.001549 
+-0.001683 -0.008489 -0.003647 0.002596 -0.003424 -0.001198 
+0.000294 0.004587 0.001254 -0.001272 0.004163 0.002837 
+-0.000431 0.003772 -0.004442 0.000284 0.004643 -0.007088 
+-0.001039 0.003916 -0.004956 -0.011677 0.004108 -0.001555 
+-0.003228 0.000090 -0.004783 -0.004979 0.000095 0.001288 
+-0.000464 -0.000187 0.001326 0.000438 0.001425 -0.001776 
+-0.000310 0.000694 -0.000554 0.000833 -0.006163 0.003205 
+-0.001307 -0.009661 0.008709 -0.003661 -0.004480 0.005369 
+-0.001134 -0.005389 -0.001040 0.000483 -0.002853 -0.000405 
+0.003047 0.000439 0.001318 0.005525 0.002322 0.001984 
+0.002231 -0.000651 0.000013 -0.004297 -0.006754 0.001855 
+-0.007130 -0.011469 0.003791 -0.005024 -0.010828 0.002118 
+-0.005310 -0.004217 -0.000532 -0.005654 -0.003191 -0.000007 
+-0.005736 -0.006049 -0.000427 -0.004830 -0.007376 -0.000866 
+-0.002770 -0.005661 0.000780 -0.002463 -0.001928 0.003195 
+-0.000464 0.000993 0.000449 0.001869 0.000282 0.000581 
+0.001674 -0.000086 0.001148 0.000592 -0.000190 0.002767 
+0.000729 0.000167 -0.000669 0.003199 0.006179 -0.005724 
+-0.005214 0.013721 -0.010754 -0.005783 -0.012067 -0.012480 
+-0.002857 -0.067782 0.025822 -0.029605 -0.004763 0.025106 
+-0.015741 -0.015268 0.010153 0.006925 -0.014232 0.003773 
+0.005220 0.003955 -0.005269 -0.000708 0.002285 -0.001531 
+0.001144 -0.001693 0.001027 0.000942 -0.002683 -0.003387 
+-0.002645 -0.003847 -0.002645 -0.001302 -0.001008 -0.000186 
+-0.001284 -0.001786 0.001254 -0.000098 -0.000267 0.002865 
+0.000296 0.005067 0.007777 0.000179 0.001672 0.003103 
+0.003602 -0.016971 -0.007357 0.493562 -2.888412 -1.592275 
+0.467249 -3.235808 -2.104804 0.464706 -2.705882 -2.441176 
+0.003443 -0.013517 -0.016817 0.006531 -0.002057 0.002890 
+0.006302 -0.000327 0.001483 0.003714 0.004919 0.009101 
+0.010413 0.006662 0.018941 0.010088 0.009372 0.014228 
+0.003575 0.003569 0.000258 0.001293 -0.005300 0.001418 
+-0.001221 -0.003504 0.006026 -0.001727 0.002482 0.004200 
+-0.002479 0.002987 0.001066 0.002356 0.004501 0.001209 
+0.002243 0.003757 -0.000056 0.002547 0.001333 -0.002067 
+0.004661 0.002232 -0.004178 0.005031 0.006053 -0.006374 
+0.009368 0.008274 -0.004147 0.012365 0.002798 -0.009289 
+0.013230 -0.000992 -0.017526 0.010736 -0.000854 -0.025527 
+0.003330 -0.000227 -0.024674 0.000123 0.000922 -0.011192 
+0.001770 -0.001525 0.001034 -0.005262 -0.006389 0.004661 
+0.000490 -0.005881 0.007349 -0.011787 -0.003852 0.005012 
+-0.011479 0.007453 -0.000056 -0.012517 0.006866 -0.000074 
+-0.007373 0.001228 -0.000673 -0.001961 0.000343 -0.000696 
+-0.000660 -0.000435 -0.000157 -0.000866 0.002655 -0.005732 
+-0.003143 0.005669 -0.004861 -0.002634 -0.001402 0.001109 
+0.002818 0.002229 0.008584 0.005541 0.001624 -0.001974 
+0.003549 -0.001948 -0.002808 0.001453 -0.000445 -0.000502 
+0.001375 0.001382 0.003577 0.000986 0.003342 0.003032 
+-0.004722 -0.001181 0.000925 -0.008206 -0.007096 0.010096 
+-0.005343 -0.002195 0.012758 -0.001108 -0.003427 0.006253 
+0.000938 -0.001478 0.000733 0.000940 -0.003074 -0.001248 
+-0.000159 -0.003643 -0.002129 -0.000054 -0.003233 -0.001334 
+0.001567 -0.001112 -0.000730 0.001778 0.002271 0.000145 
+-0.000348 0.002171 0.002359 -0.001236 0.002185 0.002239 
+0.001486 0.002167 0.003356 0.000226 0.000864 0.006986 
+0.003006 0.006692 -0.002340 0.002238 0.012010 -0.002260 
+0.005650 0.013581 -0.011191 0.000586 0.000644 -0.000224 
+-0.013844 -0.010551 0.011544 -0.009028 -0.005080 0.006848 
+0.007003 -0.003392 0.001110 0.008409 0.005604 -0.007611 
+0.000467 0.006042 -0.004649 0.000900 -0.000874 -0.000846 
+-0.001949 -0.007049 -0.002802 -0.004804 -0.001395 -0.000382 
+-0.003118 0.000516 -0.000323 -0.004694 -0.001423 -0.001565 
+-0.000711 -0.002003 -0.002068 -0.000524 -0.002109 0.000622 
+-0.005125 0.003841 0.002775 -0.004989 -0.000982 0.013072 
+-0.005620 -0.011176 -0.004987 0.082927 -2.560976 -1.819512 
+0.130208 -3.046875 -3.057292 0.050000 -3.142857 -3.421429 
+-0.003114 -0.024111 -0.015216 -0.000715 -0.010537 -0.001528 
+0.000914 -0.013611 0.006665 -0.002646 -0.003275 0.005469 
+0.002411 -0.003526 -0.005867 -0.001250 -0.006526 -0.002126 
+-0.002355 -0.005331 0.001461 0.000201 -0.001280 0.002535 
+-0.001103 0.001815 0.001402 -0.001326 0.004263 -0.006731 
+0.005743 0.007251 0.001209 0.001247 0.000173 -0.000473 
+-0.005568 -0.002283 0.001117 -0.003361 0.001563 -0.000928 
+-0.000865 0.001892 -0.001676 0.012247 0.004896 -0.006106 
+0.018225 -0.001750 -0.010192 0.022459 -0.006909 -0.017718 
+0.025231 -0.000341 -0.022504 0.000968 -0.005491 -0.028100 
+0.005104 -0.008930 -0.021958 0.006391 -0.005345 -0.013922 
+0.008302 0.001545 -0.013117 0.009847 0.004987 -0.003890 
+-0.001299 0.001586 0.000270 -0.006562 0.006926 0.006718 
+-0.007867 0.007417 0.005543 -0.012073 -0.008164 0.003114 
+-0.004082 -0.003111 -0.002161 -0.006763 0.002234 -0.001758 
+-0.010238 0.001781 -0.008521 -0.008151 0.000884 -0.000964 
+-0.005988 0.001059 -0.000498 -0.003914 -0.000382 0.003385 
+0.012882 0.002069 0.001779 0.011225 0.001066 -0.005116 
+0.003263 -0.002338 -0.003017 0.000514 -0.000872 -0.001181 
+0.000596 -0.000538 -0.000814 0.004210 0.002056 -0.000532 
+0.000533 0.000965 -0.000425 -0.003036 -0.002916 0.004572 
+0.001591 0.000695 0.006724 0.000889 -0.000683 0.002517 
+0.001752 -0.002797 -0.003225 0.006423 -0.005729 -0.003341 
+0.002727 -0.004432 -0.003319 -0.003955 -0.005960 0.002019 
+-0.004223 -0.003608 0.002341 0.001944 0.001599 0.001443 
+-0.000533 0.000160 -0.000468 -0.003418 0.000007 -0.005432 
+-0.002374 0.000485 -0.004385 0.001819 0.000914 -0.000837 
+0.003091 0.003333 -0.000701 -0.001049 0.005332 0.000076 
+-0.006672 -0.000054 -0.000738 -0.003569 0.001109 -0.000176 
+0.000268 -0.004578 0.007339 0.004453 -0.003456 0.003898 
+0.006416 0.000010 -0.004608 0.002672 0.004461 -0.012040 
+0.003305 -0.001042 -0.005184 -0.003113 -0.001841 -0.002417 
+-0.003815 -0.001098 -0.000924 -0.001410 -0.000336 -0.001735 
+-0.000731 -0.000936 -0.003875 -0.001713 -0.003223 -0.005335 
+-0.000039 -0.004202 -0.005764 -0.000765 -0.003117 -0.004493 
+-0.003681 0.003248 0.001008 -0.008115 0.008180 0.005777 
+-0.009858 -0.002168 -0.001424 -0.001805 -0.019352 -0.016306 
+0.001383 -0.030541 -0.022896 -0.002427 -0.032879 -0.020592 
+0.001283 -0.025762 -0.009588 0.003211 -0.013766 0.000556 
+0.004975 -0.005638 0.002797 0.002324 -0.001428 -0.003139 
+0.001586 -0.000303 -0.001295 0.001318 0.001532 0.003026 
+0.001004 -0.003863 0.003268 -0.001054 0.001077 -0.001110 
+0.000312 -0.000168 0.001939 0.001130 -0.000129 0.001241 
+0.000292 -0.001671 0.000799 0.000095 -0.001060 0.000675 
+-0.000985 0.000158 -0.004119 -0.002978 0.005224 -0.003466 
+0.000899 0.001256 -0.007000 0.002660 -0.001615 -0.005221 
+0.011748 0.002781 -0.011795 0.013517 -0.004710 0.002672 
+0.014939 -0.020384 -0.009870 0.010038 -0.015209 -0.015426 
+-0.000610 -0.008140 -0.010400 -0.004335 -0.004473 -0.005008 
+-0.002484 -0.001772 -0.001538 0.000085 0.002356 0.000884 
+-0.003867 0.002937 0.004020 -0.007509 -0.000433 0.005632 
+-0.007802 -0.000298 -0.000235 -0.000381 0.000882 0.000994 
+-0.006470 0.003631 0.004095 -0.017711 0.003496 -0.010083 
+-0.014906 0.018299 0.000694 -0.013016 0.009935 0.004241 
+-0.016569 -0.001743 0.008733 -0.007100 -0.003528 0.016425 
+0.026060 -0.008012 -0.018183 0.018032 -0.001809 -0.016409 
+0.007974 -0.004617 -0.006625 0.002336 -0.004361 -0.004412 
+0.001499 -0.004116 -0.003958 0.002374 0.002979 -0.000841 
+-0.001431 0.001984 0.002246 0.000238 0.001345 0.001416 
+0.003006 -0.001038 0.000298 0.002359 -0.003181 -0.002415 
+0.000745 -0.003618 -0.005103 0.002215 -0.003914 -0.005775 
+-0.001957 -0.006112 -0.000655 -0.002540 -0.004979 0.006705 
+-0.008275 -0.001698 0.002713 0.000489 0.001974 0.007219 
+-0.000912 0.001113 0.001092 -0.004662 0.001506 -0.008977 
+-0.003558 0.003098 -0.005533 0.003984 0.002024 0.000836 
+0.007115 -0.000381 -0.000919 0.003966 -0.004521 -0.003915 
+0.000913 -0.008847 -0.005868 0.000836 -0.009674 -0.002280 
+-0.001647 -0.008984 0.002540 -0.005688 -0.006236 0.005589 
+-0.008029 -0.001055 0.004428 -0.004748 0.004497 -0.002051 
+0.003104 0.003386 -0.006382 0.004971 0.000576 0.001137 
+0.000242 -0.000551 0.004812 -0.000665 -0.000217 0.001599 
+0.000871 -0.000335 -0.002511 0.001215 -0.001881 -0.003014 
+0.000313 -0.001950 -0.001894 -0.001220 -0.001328 -0.001105 
+-0.002886 0.000749 -0.000268 -0.005160 0.002005 -0.001162 
+-0.012030 -0.002816 -0.003252 -0.002289 -0.014681 -0.007641 
+0.006567 -0.020744 -0.017640 0.003428 -0.013578 -0.022259 
+0.001427 -0.003319 0.001009 0.001241 -0.007312 -0.000901 
+0.004041 -0.009837 0.005547 0.002600 -0.006588 0.001386 
+-0.002309 -0.003893 0.002912 0.000351 -0.003861 0.010168 
+-0.000751 0.003039 0.003377 -0.008022 -0.006487 0.002517 
+-0.001578 0.002822 -0.000925 -0.002998 0.000970 -0.001830 
+-0.004430 0.000369 -0.000415 -0.001845 -0.001012 -0.001727 
+0.004215 0.002975 0.001736 0.006589 0.005933 -0.007705 
+0.001324 0.001144 -0.006380 -0.000010 -0.001269 -0.001697 
+0.003008 0.002776 -0.008931 0.000942 -0.002826 -0.008017 
+0.003445 -0.006442 -0.002605 0.003208 -0.005377 -0.000566 
+-0.000749 -0.001064 -0.000255 -0.005948 -0.003174 0.004062 
+-0.009406 -0.007806 0.007594 -0.007585 -0.005295 0.006113 
+0.003136 0.000304 -0.001720 0.010918 0.000126 -0.004787 
+0.000371 -0.006882 0.001197 -0.000324 -0.008813 0.006553 
+-0.025605 0.024091 0.003954 -0.029948 0.045558 0.011695 
+-0.016833 0.033297 0.012677 -0.015244 0.020786 0.011482 
+-0.016167 0.005282 0.016701 -0.007909 -0.017508 0.016317 
+0.019640 -0.006306 -0.017117 0.006534 -0.000703 -0.009555 
+0.008677 -0.001164 -0.003439 0.013836 -0.009505 -0.000301 
+0.012824 -0.004522 -0.008054 -0.001136 0.001609 0.001885 
+-0.009491 0.002824 0.007612 -0.007629 0.002736 0.002860 
+-0.001005 -0.001866 -0.002550 0.003330 -0.005061 -0.005740 
+0.004125 -0.004283 -0.006292 0.003549 -0.000251 -0.007155 
+-0.000540 0.000080 -0.006576 0.000393 0.000062 -0.003060 
+0.000076 0.001682 0.001380 0.000064 0.002152 0.002011 
+-0.000461 0.001119 -0.002127 -0.013255 0.003525 -0.000186 
+-0.008616 0.006926 -0.005585 0.004513 0.012341 0.004444 
+0.008654 0.008127 0.007353 0.006037 0.000387 -0.000031 
+-0.004343 -0.008416 -0.001711 -0.006496 -0.011422 0.007846 
+-0.008570 -0.002735 0.013632 -0.015019 -0.001613 0.013150 
+-0.019258 -0.000481 0.007196 -0.016081 0.006775 -0.003154 
+-0.003672 0.009439 -0.013425 0.004910 0.004556 -0.009067 
+0.002490 0.001757 0.001446 0.004190 0.001707 0.004346 
+0.004616 0.001741 0.001745 0.001166 0.002014 0.001424 
+-0.005412 -0.000788 -0.000040 -0.007082 -0.003702 -0.001774 
+-0.000301 -0.002957 -0.001350 0.004185 0.006075 0.001928 
+0.000061 0.019898 0.000392 0.001359 0.007413 0.001473 
+0.000005 -0.004275 -0.024263 -0.006485 -0.000853 -0.005303 
+-0.000144 -0.000555 -0.000389 0.003295 -0.002296 0.000868 
+0.004020 -0.010721 0.002435 -0.002799 -0.005661 -0.003939 
+0.003267 -0.002454 -0.000044 0.001898 -0.000798 0.001326 
+-0.003293 -0.001644 -0.002057 -0.010305 -0.006863 0.003751 
+0.000529 -0.003533 -0.003605 0.001567 0.004069 -0.009378 
+0.003649 0.002929 -0.007968 0.002847 0.001424 -0.004831 
+0.001515 0.004083 -0.003410 0.001536 0.000036 -0.002309 
+-0.001067 -0.001281 -0.000092 -0.002821 0.002321 -0.001364 
+-0.003378 0.003284 -0.002872 -0.001787 0.000772 -0.002995 
+-0.001842 -0.002158 0.000474 -0.001491 0.000149 0.000447 
+-0.001954 0.001784 0.002062 -0.003565 0.003604 0.004033 
+-0.004363 0.002879 0.004607 -0.001799 0.000630 0.001725 
+0.003092 -0.000850 -0.002527 0.002023 -0.000152 -0.000628 
+-0.005895 0.004660 0.011571 -0.014026 0.013681 0.033333 
+-2.678161 5.643678 3.563218 -3.214815 5.859259 3.200000 
+-3.083333 4.410256 2.852564 -0.026395 0.026592 0.020102 
+-0.016246 0.002541 0.022220 -0.008148 -0.044434 0.017363 
+0.000225 0.001515 -0.007702 -0.005133 0.003092 0.002806 
+-0.006849 -0.004869 -0.000335 0.001494 -0.006329 -0.000325 
+0.016939 -0.002690 -0.002242 0.003727 0.007704 -0.002263 
+-0.003712 -0.000181 0.004376 -0.011986 -0.002874 0.002007 
+-0.005087 0.000011 -0.003040 0.000827 -0.001397 -0.002882 
+0.003324 -0.002065 -0.008278 0.005553 0.001851 -0.012128 
+0.003884 0.005248 -0.007936 0.003876 0.006038 -0.002240 
+0.005349 0.002717 0.001575 0.002103 -0.003863 0.001896 
+0.002201 -0.004848 -0.005031 -0.001038 0.004841 0.000644 
+0.005120 0.023178 0.009758 0.012880 0.032945 0.020606 
+0.014109 0.029050 0.017792 0.007502 0.016512 0.005911 
+-0.005645 -0.002015 0.002243 -0.015829 -0.014480 0.008034 
+-0.021467 -0.017989 0.016781 -0.017624 -0.005892 0.011401 
+0.003321 0.006116 -0.000509 0.005048 0.010804 0.001868 
+-0.006622 -0.001515 -0.006510 -0.001042 -0.000803 -0.008532 
+0.005101 -0.000663 0.005739 0.006742 0.002610 0.006743 
+0.003964 0.000736 0.001213 -0.005983 0.001407 -0.001136 
+-0.008140 0.004488 -0.000876 -0.006177 0.001667 -0.001579 
+0.001526 -0.002864 -0.004162 0.014846 0.000299 -0.015665 
+0.019252 -0.003652 -0.021977 -0.001150 -0.009264 -0.011541 
+-0.001052 -0.001888 -0.003315 0.007053 -0.002967 0.006121 
+0.007739 -0.001599 0.007439 0.003904 0.000544 0.006513 
+-0.000478 -0.010221 0.005051 0.003433 -0.004998 -0.001375 
+0.003646 -0.003633 0.000482 -0.000789 0.002912 -0.000277 
+-0.003483 0.010880 -0.004234 -0.001094 0.010258 -0.000712 
+0.001123 -0.000560 -0.002665 0.003280 -0.002560 0.000208 
+0.006337 0.001117 -0.001619 0.004777 0.003674 -0.001469 
+0.002691 0.000485 0.000344 -0.002198 -0.003102 -0.001532 
+-0.006011 -0.001531 0.000596 -0.002282 -0.000847 -0.001706 
+0.000571 0.000729 -0.000115 0.002636 0.005838 -0.002882 
+-0.000651 0.005217 -0.001024 0.000043 0.001565 -0.000043 
+-0.003026 0.001271 0.004272 -0.001301 0.002568 0.003369 
+0.003032 -0.002474 -0.001250 0.002872 -0.006711 -0.001646 
+-0.001717 0.003941 0.004471 -0.017839 0.011193 0.021547 
+-2.721519 1.613924 3.936709 -3.356250 4.037500 5.093750 
+-3.468421 6.126316 4.615789 -3.271111 6.453333 3.848889 
+-3.032864 5.469483 3.469484 -2.829932 3.843537 2.918367 
+-0.013196 0.010536 0.025767 0.018183 -0.034708 0.003649 
+0.004299 -0.006722 -0.001577 -0.000578 0.003956 -0.003378 
+-0.001130 -0.003178 -0.007183 0.006155 -0.007926 -0.005332 
+0.001978 -0.000290 0.003157 0.000809 0.007151 0.006497 
+-0.002229 0.005844 0.005309 -0.005302 0.001663 0.003606 
+-0.004605 -0.003345 0.005186 -0.001668 -0.004387 0.004517 
+-0.001313 -0.007599 -0.002505 0.004437 -0.004571 -0.007395 
+0.002722 0.005251 -0.003759 0.003354 0.009801 0.000161 
+0.008710 0.004101 0.001060 0.003471 -0.008053 0.000250 
+0.004956 -0.011233 -0.005125 -0.008371 0.001986 -0.007365 
+0.013925 0.028902 0.023478 1.904000 4.416000 3.184000 
+1.618056 4.840278 2.881944 0.954198 4.328244 2.816794 
+0.000733 0.017759 0.028607 -0.011568 0.004103 0.017790 
+-0.018429 -0.004991 0.015298 -0.015068 -0.013478 0.011710 
+-0.006369 -0.005787 0.006374 0.002053 -0.005334 -0.005355 
+0.008046 -0.008088 -0.011156 0.008197 -0.004676 -0.004127 
+0.007265 -0.001683 0.002735 0.007092 0.001286 0.004257 
+0.002894 0.002263 0.003490 -0.003125 0.003140 0.003389 
+-0.006134 0.004471 0.002988 -0.008907 0.002907 0.001156 
+-0.011979 -0.002952 0.000145 -0.010347 -0.007456 -0.004848 
+-0.006660 -0.007661 -0.009019 -0.000031 -0.005178 -0.008204 
+0.004071 -0.002818 -0.003383 0.004534 -0.002461 0.002074 
+0.001592 -0.001831 0.008160 -0.006614 -0.009506 0.011300 
+-0.000247 -0.004597 0.012850 0.000877 0.000526 0.001091 
+0.000360 0.000698 0.000260 0.000163 0.006049 -0.005171 
+0.002006 0.002979 -0.010411 0.002574 0.006066 -0.007905 
+-0.001951 -0.003333 0.002764 0.001291 -0.000897 0.001631 
+0.006333 0.000630 -0.001185 0.002355 -0.003635 0.001434 
+0.001174 -0.005487 0.000250 -0.003040 -0.004763 -0.000868 
+-0.000017 -0.001488 0.000050 -0.000521 0.001423 0.000312 
+0.000076 0.000926 -0.000337 0.001844 0.001552 0.002092 
+-0.001145 0.000517 -0.001374 0.009627 -0.000164 -0.003427 
+0.003672 0.002462 -0.002317 -0.000469 0.001406 0.002812 
+0.004497 -0.003623 -0.002773 -0.005416 -0.010904 -0.005386 
+-0.008190 -0.020206 0.009348 -2.848168 0.586387 3.696335 
+-4.012346 2.654321 4.917696 -4.418118 4.526133 5.390244 
+-3.682927 6.295732 4.777439 -2.852090 6.868167 4.096463 
+-2.087866 6.443515 3.539749 -1.916084 6.034965 3.027972 
+-0.004569 -0.022198 0.026504 -0.015552 -0.043576 -0.006642 
+0.001954 -0.000287 -0.005230 -0.001446 0.006540 0.005425 
+0.001115 -0.002685 0.001697 0.011645 -0.003134 -0.018120 
+-0.003936 0.007312 -0.013895 -0.002160 0.008934 0.003630 
+-0.001489 0.003515 0.006338 -0.000517 -0.000527 -0.001074 
+-0.001470 -0.003694 -0.005916 -0.005187 -0.005997 -0.003294 
+-0.009330 -0.010891 0.005254 -0.010569 -0.006675 0.005146 
+-0.000098 0.000752 0.000812 0.007367 0.010318 -0.001944 
+0.012362 0.006490 0.003015 0.006606 -0.008917 0.002790 
+-0.002840 -0.027417 -0.007642 -0.001503 -0.009349 -0.015441 
+0.013725 0.032649 0.015124 1.900585 5.298245 3.216374 
+2.161905 6.309524 3.238095 2.000000 6.179104 3.199005 
+1.785714 3.890110 3.593407 2.117647 1.152941 3.788235 
+0.009710 0.007444 0.036253 0.004974 -0.012648 0.024741 
+-0.027720 -0.016621 -0.000280 -0.004464 -0.008289 -0.017855 
+0.002962 -0.007371 -0.009664 0.004404 -0.003307 -0.004890 
+0.003550 -0.000387 -0.001046 0.005716 0.003134 0.001955 
+0.004329 0.002848 0.002050 -0.002039 -0.000208 -0.000256 
+-0.008629 -0.002110 -0.001365 -0.011104 -0.004424 0.001908 
+-0.006092 0.001969 -0.000124 -0.003579 -0.000180 -0.003206 
+-0.002028 -0.002730 -0.005868 0.000526 -0.002260 -0.006659 
+0.000168 0.000083 -0.001978 -0.002287 -0.003673 0.004254 
+0.002014 -0.001390 0.002878 0.001103 -0.001378 0.002276 
+-0.001677 -0.003037 -0.001525 -0.002707 -0.000284 -0.000931 
+-0.003423 0.000920 -0.000657 -0.002799 0.000121 -0.003213 
+-0.000102 -0.000974 -0.006148 0.005185 0.005331 -0.006550 
+-0.004034 -0.008824 0.002177 -0.007947 -0.007041 0.003415 
+-0.004523 -0.001352 -0.001626 -0.000001 -0.002406 -0.003369 
+0.001849 -0.002966 -0.003337 0.000043 -0.002412 -0.002670 
+0.001484 -0.000315 0.001214 0.000681 0.004850 0.003461 
+-0.001672 0.005993 0.005794 -0.001272 0.003976 0.002139 
+0.000651 0.000776 0.000462 0.014134 0.001271 -0.002515 
+0.009996 0.000171 -0.004476 -0.000775 -0.001088 -0.000273 
+0.001538 -0.002808 -0.001623 0.022873 -0.011646 -0.008006 
+-0.005123 -0.016218 -0.017724 -2.018405 -1.214724 2.613497 
+-3.728302 3.471698 3.762264 -3.610973 5.364090 4.134663 
+-3.121475 6.438178 4.201735 -2.697548 7.226158 3.972752 
+-1.758794 7.668342 3.211055 -1.051020 -0.112245 2.663265 
+-0.013530 -0.078713 0.025079 0.014478 0.001587 0.004138 
+0.005733 0.016821 0.014909 0.003008 0.000719 0.010903 
+-0.002057 -0.000077 0.011935 -0.011304 0.002214 0.002725 
+-0.012619 0.018943 -0.014958 0.001087 0.004407 -0.006170 
+0.000565 -0.005716 -0.000983 0.000793 -0.001038 -0.001866 
+0.001380 -0.000185 -0.001694 0.002528 0.001943 -0.002469 
+-0.002116 -0.004203 0.003844 0.001876 -0.013078 0.016726 
+-0.005436 -0.000439 0.009620 0.002896 0.008751 0.003394 
+0.004676 0.011344 -0.000669 0.008133 -0.003121 0.005655 
+0.001321 -0.019637 0.012161 -0.009113 -0.020130 0.003148 
+0.018098 0.039777 0.010929 2.818627 6.700980 3.338235 
+3.374193 7.119355 3.390323 3.556231 6.680851 3.452888 
+3.920139 5.204861 4.003472 4.853557 3.071130 4.715481 
+5.207317 1.158537 4.804878 0.024480 -0.003203 0.034017 
+0.003274 -0.000464 -0.008716 0.002424 -0.009100 -0.010180 
+0.003279 -0.004496 0.000202 0.001800 -0.000887 -0.006009 
+-0.004669 0.001364 -0.005068 -0.005102 0.007379 -0.004009 
+-0.003000 0.004088 -0.005723 -0.001933 0.003025 -0.001933 
+-0.002030 0.001101 0.000255 -0.000318 0.000836 0.001221 
+0.000076 -0.001346 -0.001156 0.000325 -0.006098 -0.002358 
+0.001135 -0.004540 -0.008906 -0.002680 -0.005876 -0.006688 
+0.006526 -0.003883 -0.004839 0.001480 -0.004554 -0.002735 
+0.000764 -0.002270 0.000973 -0.000821 0.002051 0.000410 
+-0.002839 0.002140 -0.000724 -0.006175 -0.001293 -0.000391 
+-0.005530 -0.003906 0.000176 -0.002439 0.001881 0.001341 
+-0.001739 0.003410 -0.000204 0.002397 0.002661 0.000380 
+-0.000212 -0.000571 -0.001430 0.001723 -0.009051 0.003580 
+0.001275 -0.006307 -0.000246 -0.002165 -0.000550 0.001083 
+-0.003781 0.002073 -0.002111 -0.001321 0.003196 -0.002949 
+0.002955 0.005069 -0.000208 0.004248 0.000059 0.007279 
+-0.000503 -0.000995 0.003296 -0.000005 0.002474 -0.002057 
+0.004359 0.003529 -0.005882 0.007878 0.004764 -0.003014 
+0.004119 -0.002838 -0.000427 -0.002644 -0.006701 0.000287 
+-0.002028 0.001953 -0.001412 0.007361 0.006827 0.000015 
+0.020588 -0.011446 -0.003755 -0.009387 -0.020517 -0.010699 
+-1.551351 1.583784 1.318919 -2.493056 4.569445 2.878472 
+-2.777108 7.066265 3.587349 -2.908714 7.780083 3.560166 
+-2.422680 4.371134 1.979381 0.075613 -0.059203 -0.040939 
+-0.013505 -0.055446 0.011034 -0.000290 0.010048 0.003188 
+-0.012100 0.011150 0.006933 0.003369 -0.002769 0.002494 
+0.005129 -0.000758 -0.001691 -0.005202 0.008415 0.007472 
+0.000853 0.001036 0.001003 -0.004126 -0.012903 -0.005187 
+-0.001827 -0.009394 -0.005808 -0.000305 -0.000496 0.001749 
+0.004589 0.003551 0.005572 0.000972 0.001034 0.009078 
+0.000706 -0.007254 0.007082 0.004315 -0.031311 0.006316 
+-0.001647 -0.028588 0.010000 0.000146 0.002826 -0.008188 
+-0.003160 0.007627 -0.007538 0.008982 0.001450 0.000853 
+-0.004082 -0.028999 0.007366 0.001336 -0.087325 0.056137 
+3.095238 4.904762 6.190476 3.971963 7.920561 4.420561 
+4.455665 7.325123 3.753695 4.804124 6.880413 3.709278 
+5.577017 6.215159 4.058680 6.751825 4.580292 4.609489 
+6.055901 2.018634 4.627329 0.025895 0.002045 0.009722 
+0.011421 -0.000359 -0.010211 0.005437 -0.001015 -0.003676 
+0.000594 -0.001512 0.004546 -0.003664 -0.001005 0.001735 
+-0.000927 -0.000207 -0.003022 -0.001173 0.000432 0.000170 
+0.003387 0.003559 0.001448 0.002566 0.002873 0.004916 
+0.002870 -0.002087 0.004696 0.007027 -0.001757 0.001757 
+-0.003490 -0.003818 -0.000214 -0.002024 -0.008808 -0.005255 
+0.001011 -0.005790 -0.005977 0.000547 -0.003669 0.000273 
+0.000988 -0.001605 -0.000321 -0.000089 0.000605 -0.000285 
+-0.008217 -0.002963 -0.000472 -0.007546 0.003430 0.003171 
+-0.006310 0.000474 -0.000552 -0.002597 -0.001748 0.000774 
+0.000150 -0.001690 -0.005222 0.002925 0.001576 -0.002058 
+0.004206 -0.002250 0.000971 0.002745 -0.001904 0.000864 
+0.003095 0.003730 -0.002540 0.007420 0.004312 -0.000255 
+0.006311 0.000020 -0.000285 -0.001631 0.000293 0.000193 
+-0.004940 0.000307 0.000340 0.001129 0.004274 -0.002097 
+0.003227 -0.000654 0.001599 0.005389 -0.001313 -0.004281 
+0.004853 0.000987 -0.003742 0.003907 0.001388 -0.004369 
+0.004278 0.002416 -0.001507 -0.001152 -0.000901 0.000294 
+-0.006116 0.000000 -0.002893 -0.004260 -0.001821 -0.001263 
+0.002464 0.002312 0.000422 -0.000949 0.003304 0.003549 
+-0.001621 -0.001294 -0.003117 0.007550 -0.004875 -0.015793 
+0.019304 -0.011162 -0.013305 0.005698 -0.001836 -0.003869 
+-0.012563 0.009330 0.028332 -0.025969 0.008065 0.014250 
+0.020802 -0.021318 0.013824 0.006266 0.008049 0.005121 
+-0.009358 -0.001578 -0.007127 -0.017584 -0.004098 0.014130 
+-0.004988 0.001388 0.021037 0.007108 -0.006997 0.003693 
+0.009064 -0.006196 -0.003035 -0.003616 -0.015977 -0.005286 
+-0.007848 -0.024443 -0.001798 -0.001726 -0.003268 -0.008371 
+0.004365 0.010576 -0.002745 0.006869 0.005671 0.003412 
+0.004687 -0.000321 0.002455 0.001491 -0.003469 -0.002234 
+-0.002400 -0.003409 -0.010070 -0.010806 -0.017550 -0.010580 
+0.005044 -0.006973 0.004154 0.000135 -0.002205 -0.008669 
+-0.003484 0.005395 -0.001512 0.000651 0.005447 -0.006725 
+-0.001150 -0.030341 0.009445 5.421052 -12.684211 0.912281 
+5.701299 5.584415 5.844156 5.225490 8.607843 4.828432 
+5.606648 7.767313 4.036011 5.929078 7.106383 3.825059 
+6.345714 6.034286 3.951429 6.032407 4.037037 4.217593 
+3.704545 1.712121 3.818182 0.024103 0.008651 0.002060 
+0.009932 0.010845 -0.013129 0.004585 -0.005212 0.003409 
+-0.007329 -0.006490 -0.002539 0.000177 0.000415 0.000488 
+0.004900 0.001786 0.004338 0.003957 0.005349 0.006982 
+0.001128 0.007602 0.004507 -0.000747 0.003485 0.000187 
+-0.000435 -0.005461 0.001494 -0.004579 -0.007631 0.002289 
+-0.003671 -0.007097 -0.003026 -0.003542 -0.000122 -0.004763 
+-0.000010 0.001889 -0.001338 0.003286 -0.000185 0.002269 
+0.001451 0.000183 0.001998 -0.004705 0.001059 -0.001293 
+-0.006279 -0.001144 -0.001526 -0.001278 -0.003473 -0.000277 
+-0.000656 -0.002507 0.002328 0.000768 -0.001533 0.000259 
+0.004039 -0.000489 -0.000613 0.000135 -0.000299 0.000745 
+-0.000349 -0.004187 -0.001864 -0.001140 -0.002870 -0.001794 
+0.006530 0.003415 0.002486 0.003600 0.001109 0.002770 
+0.002689 -0.000463 0.001561 -0.000236 -0.004833 0.003222 
+0.003683 0.000032 0.001633 0.001249 0.003405 0.000258 
+0.001513 0.001304 -0.003079 -0.000690 0.001887 -0.002740 
+-0.000238 -0.000977 -0.000125 0.000664 -0.000089 -0.000211 
+-0.000023 -0.002262 0.000136 -0.002252 -0.004910 -0.001932 
+-0.002693 -0.001077 -0.005537 0.000356 -0.001639 0.000051 
+0.001705 -0.003885 0.000246 -0.003551 -0.008959 0.002879 
+-0.003221 -0.009481 0.001975 0.001349 -0.002531 -0.000870 
+0.006368 0.005973 -0.001924 0.007127 0.006125 -0.003178 
+0.002066 -0.017028 -0.007642 -0.002557 -0.017792 -0.009399 
+-0.002675 0.003279 0.004077 -0.000926 0.001923 0.002488 
+0.007691 0.001374 -0.002053 0.005590 0.000499 -0.007616 
+0.005756 -0.003916 0.002135 0.004265 -0.010000 0.000284 
+-0.000208 -0.010136 -0.005631 -0.007021 -0.001311 -0.007867 
+0.001957 0.009499 -0.004252 0.014007 0.016792 -0.004150 
+0.015541 0.012478 0.003285 0.009512 0.003206 0.001759 
+0.003573 -0.002964 -0.002971 -0.002274 -0.004498 -0.006306 
+-0.008377 -0.000123 -0.006106 -0.004724 -0.003498 0.003712 
+-0.002761 -0.004147 0.004922 0.001299 0.001480 -0.001149 
+0.007691 -0.000581 -0.000800 0.005353 -0.002152 -0.002412 
+-0.014980 -0.017026 0.006219 -0.061290 -0.017954 -0.023756 
+0.008879 0.031403 0.010230 5.300752 7.180451 3.751880 
+6.375000 7.732143 4.220238 6.503268 6.372549 3.869281 
+5.102564 3.205128 2.606838 0.006833 0.006651 0.010516 
+0.000268 0.002374 0.001455 0.000000 0.003025 -0.006050 
+0.001334 -0.000389 -0.000249 -0.000181 -0.000289 -0.000932 
+0.000099 0.001297 0.001028 -0.000017 0.002311 0.001259 
+0.004941 -0.001036 0.002941 0.000509 -0.004023 0.000274 
+-0.003016 -0.003585 -0.001821 -0.003076 -0.000291 0.002591 
+0.000073 0.001464 0.000542 -0.002042 -0.002636 -0.000138 
+-0.004621 -0.002691 -0.004329 0.000677 -0.003499 -0.001507 
+-0.000599 -0.004885 0.000368 0.001368 -0.003202 -0.000630 
+0.001806 0.000143 0.001251 0.005887 0.001734 -0.005202 
+0.004467 0.003533 -0.005067 -0.000087 -0.000189 -0.000211 
+-0.002151 -0.003253 0.000721 -0.002815 -0.005815 -0.000031 
+-0.000171 0.000019 0.001172 0.002340 -0.003180 0.000654 
+0.002580 -0.002084 -0.001399 0.001478 -0.000731 -0.000167 
+0.002960 -0.000056 0.000226 0.001120 -0.000862 0.000492 
+-0.000720 -0.002880 0.000000 0.000493 -0.004506 -0.000594 
+0.003026 -0.005317 -0.000403 0.002979 -0.003337 0.003133 
+-0.000539 -0.000269 0.001077 -0.001413 -0.000291 0.001737 
+-0.004055 0.000333 0.002459 -0.005881 -0.002760 0.002718 
+-0.004070 -0.001959 -0.000829 -0.000071 0.001218 0.002340 
+0.000280 0.000157 0.000006 -0.000970 -0.000526 -0.002735 
+-0.002016 0.001008 -0.002240 -0.004256 -0.000608 -0.001040 
+-0.000202 0.000000 -0.000202 0.002398 0.001170 -0.000175 
+0.003643 -0.002512 -0.000328 0.001135 -0.000621 -0.000928 
+0.000315 0.000432 0.000378 -0.000093 -0.000346 -0.000508 
+-0.002150 -0.000800 -0.000458 0.000661 0.001045 0.000136 
+0.001095 0.008485 -0.006776 -0.000266 0.011794 -0.019525 
+0.006672 0.010093 -0.013039 -0.009256 -0.012732 -0.003139 
+-0.004628 -0.017613 -0.000790 -0.001767 -0.008772 -0.000482 
+-0.000050 0.001306 -0.000413 0.000221 0.003410 0.000889 
+0.005948 -0.001179 -0.005008 0.001610 0.001797 -0.004296 
+0.001149 0.004347 -0.005387 0.002841 0.009277 -0.007431 
+0.004839 0.004083 -0.008676 0.001940 0.006211 -0.003042 
+-0.000629 0.002650 0.000633 -0.001692 -0.001134 -0.000973 
+-0.003782 -0.003890 -0.003411 -0.013165 -0.007223 0.000813 
+-0.009399 -0.006807 0.006158 -0.005624 -0.004786 -0.001511 
+-0.000860 -0.017276 -0.013703 0.002446 -0.010854 -0.036027 
+-0.014057 -0.014162 -0.086064 -0.071875 -0.045877 -0.069107 
+-0.004388 -0.014963 -0.019060 -0.000595 0.000415 -0.010470 
+0.002586 -0.002994 -0.005000 -0.005000 -0.001457 -0.003277 
+-0.004804 -0.000459 0.002352 0.000074 0.000204 -0.000741 
+0.003172 0.005896 0.001394 0.002676 0.001493 0.000221 
+-0.002319 -0.000720 -0.000064 -0.003077 0.001154 0.000000 
+-0.000884 0.000628 -0.000787 -0.001504 0.001390 -0.000476 
+-0.001226 0.001513 0.000111 -0.002310 -0.004532 0.001111 
+0.000141 -0.003210 0.004498 -0.000033 -0.005366 0.000260 
+-0.002531 -0.003548 -0.003077 -0.000363 -0.000668 -0.003216 
+0.000170 0.000522 0.000430 0.003049 0.003033 0.001663 
+0.002252 0.002705 -0.000643 0.000813 -0.000645 -0.001084 
+-0.000367 -0.004394 0.000805 0.001364 -0.004643 -0.000958 
+-0.000903 0.000694 0.000486 -0.002206 0.000024 -0.000776 
+-0.001402 0.004092 -0.000253 -0.001177 0.000191 -0.000788 
+0.000238 -0.000476 -0.000159 -0.001654 -0.001890 0.000000 
+0.000873 -0.000635 0.001111 0.002560 -0.001296 -0.000432 
+0.001262 -0.003111 -0.000992 0.000265 -0.003228 0.001481 
+-0.000666 -0.002720 -0.000499 -0.001204 -0.001150 -0.000124 
+-0.001708 -0.001598 -0.000028 -0.001710 -0.002913 -0.000302 
+0.000752 -0.001409 0.000188 -0.000351 0.001053 0.000088 
+0.000575 0.005507 -0.000741 0.000962 0.003912 0.000262 
+-0.001104 -0.000876 0.002587 0.001203 -0.002660 -0.000971 
+-0.000194 -0.006797 -0.000485 -0.000895 -0.005367 -0.003576 
+-0.000590 -0.002123 -0.003110 -0.000093 0.001420 0.001189 
+0.001863 0.003722 0.004558 0.002388 0.004115 0.004628 
+0.000950 0.001457 0.002454 0.000851 0.000123 0.002312 
+-0.000061 0.001537 0.003244 -0.002617 0.006155 -0.002864 
+0.010641 0.006097 -0.022891 0.000136 -0.008354 -0.013231 
+-0.000123 0.004351 -0.007768 -0.004429 -0.002053 -0.005512 
+-0.004771 -0.007800 -0.008632 -0.008797 -0.002351 -0.011608 
+-0.008235 -0.002656 -0.005499 -0.004692 -0.003089 -0.002411 
+-0.000977 -0.004395 -0.001611 0.001930 -0.002705 -0.001280 
+0.002190 0.000965 0.000013 0.005530 0.003254 0.000276 
+0.005318 0.002532 -0.004800 -0.001800 0.001685 -0.004829 
+-0.003642 -0.001860 0.003038 -0.006300 -0.006853 0.001668 
+-0.003956 -0.003269 -0.001240 -0.003225 -0.002771 -0.001923 
+-0.007984 -0.009810 -0.006739 -0.021233 -0.030405 0.000783 
+-0.024929 -0.006101 -0.014970 -0.006449 -0.000849 -0.011100 
+-0.001282 0.000114 -0.005426 0.000339 -0.001043 -0.001484 
+-0.000737 -0.000417 -0.002288 -0.002713 -0.003686 0.000220 
+-0.000183 -0.001099 -0.002016 -0.002989 0.000921 -0.001380 
+-0.003460 0.001293 -0.000951 -0.000434 0.001415 -0.000082 
+0.002554 0.000301 -0.000526 -0.000227 -0.000417 -0.000348 
+-0.001680 -0.000445 -0.000920 -0.001699 -0.002230 -0.000935 
+-0.000633 -0.003336 0.000276 -0.000498 -0.003429 0.001683 
+-0.001170 -0.004443 0.003625 -0.001610 0.000665 0.000997 
+-0.003197 -0.001101 0.002858 -0.004547 -0.001408 0.000116 
+-0.003833 -0.002006 -0.000359 -0.000895 0.000086 0.000715 
+0.001120 0.000240 -0.000880 0.000800 -0.000659 0.000165 
+0.001024 -0.002240 -0.000512 0.000222 0.000661 -0.002857 
+0.001479 0.003598 -0.004506 -0.000503 0.004568 -0.005013 
+-0.001639 0.002951 -0.000656 -0.002894 -0.002429 0.000066 
+-0.002950 0.001133 0.001587 -0.004240 0.000720 0.002720 
+-0.000877 0.001514 0.001642 -0.000387 -0.000063 0.001987 
+-0.001328 0.000602 -0.000722 -0.001337 0.001504 -0.001838 
+-0.001352 0.001834 -0.001430 0.001259 0.001096 0.001205 
+0.006786 0.000939 -0.000966 0.005462 -0.001109 0.000555 
+-0.000316 -0.000701 0.000578 0.000579 -0.000107 -0.000307 
+-0.000071 0.004158 -0.000423 0.001686 0.001429 -0.000024 
+-0.001343 -0.000732 0.003667 -0.003008 -0.000894 0.001220 
+-0.001232 -0.001913 -0.000170 0.000857 -0.003438 -0.002577 
+-0.000642 -0.002066 -0.002350 -0.001870 -0.000378 0.001246 
+-0.001726 0.001949 0.002805 0.001372 0.000284 0.002671 
+-0.000552 -0.002797 0.002479 -0.003436 -0.007567 0.001850 
+-0.002409 -0.005640 0.000727 0.002783 0.002520 -0.000843 
+0.004954 -0.004154 -0.005697 0.008716 -0.003385 -0.003425 
+0.000775 -0.007455 -0.004454 -0.005061 -0.004767 -0.004823 
+0.002525 -0.001353 0.002132 0.000766 -0.000360 0.001731 
+-0.000622 0.000884 -0.000094 0.001495 0.000279 0.000573 
+0.004992 -0.001331 -0.000355 0.008581 -0.001125 -0.000916 
+0.009733 -0.000156 0.001000 0.006825 -0.000320 0.001843 
+0.003419 0.000117 0.000739 -0.000713 -0.000538 -0.000748 
+-0.001526 -0.002209 -0.002668 -0.000394 0.002167 -0.005838 
+0.001306 0.000127 0.000796 0.005247 -0.000257 -0.001141 
+0.001762 -0.004209 0.010547 0.001474 0.003004 0.002923 
+-0.003155 0.003676 0.002505 -0.002701 0.003015 -0.000834 
+-0.000497 0.000852 0.001089 0.000715 -0.002110 0.004577 
+0.001508 -0.004308 0.004523 0.000845 -0.002891 0.001182 
+-0.000252 -0.000322 -0.000062 0.002519 0.002453 -0.000881 
+0.001508 0.003304 -0.003240 -0.001804 0.001682 -0.001921 
+-0.001694 0.000328 -0.000711 -0.000199 0.000994 -0.000036 
+-0.000738 0.000983 -0.000313 -0.002182 0.001503 -0.000836 
+0.000508 0.004576 -0.004831 0.002878 0.004825 -0.008190 
+0.001901 0.002562 -0.005124 -0.003028 -0.001861 0.000694 
+-0.007667 -0.002217 0.004433 -0.007167 0.000000 0.001167 
+-0.002583 0.002167 -0.002167 0.003259 0.002481 0.000852 
+0.002591 0.004801 0.000261 0.000889 0.000816 -0.000332 
+-0.000935 -0.000826 -0.001318 0.001755 -0.000965 0.000169 
+0.003904 -0.000254 -0.000515 0.003238 -0.000586 -0.002906 
+0.002221 -0.000018 -0.006726 -0.000529 -0.002725 -0.007240 
+-0.004234 -0.006351 0.001705 -0.002959 -0.007041 0.003061 
+-0.001667 -0.003864 0.000000 0.002727 0.000000 -0.001818 
+0.005520 0.006682 -0.002252 0.002289 0.006168 -0.001024 
+-0.000548 -0.000247 -0.001795 -0.004936 -0.003201 0.002712 
+-0.003388 -0.002527 0.004249 0.000860 0.000674 0.000299 
+-0.000374 0.000068 -0.000558 0.002104 0.000087 -0.003791 
+-0.001681 -0.000991 0.000496 -0.000410 -0.001863 0.000422 
+-0.000100 0.000717 0.000090 -0.000251 0.001006 -0.002016 
+0.003228 -0.000142 -0.000047 -0.000549 -0.000649 -0.001215 
+-0.001690 -0.002001 -0.000383 -0.003088 -0.002381 0.002091 
+-0.003455 -0.003926 0.003033 -0.005597 -0.000224 0.004275 
+-0.000338 0.000851 0.002338 0.000562 -0.003810 -0.001127 
+-0.001030 -0.004568 -0.002394 -0.001609 -0.003125 0.001166 
+-0.001694 0.002760 0.003853 0.000855 0.000633 0.000782 
+0.001045 -0.002703 -0.002279 0.000136 -0.002492 -0.004040 
+-0.000759 0.000348 -0.000073 -0.000295 -0.000332 0.004652 
+-0.001986 -0.001387 0.003359 0.000847 -0.000070 0.000623 
+0.002536 0.000297 -0.000268 0.000500 -0.000226 -0.001066 
+-0.001646 -0.004492 -0.001491 0.000042 -0.003829 -0.001726 
+-0.000209 -0.001301 -0.000493 0.000074 -0.000397 -0.000153 
+-0.003270 -0.002308 0.001386 -0.005952 -0.004027 0.004240 
+-0.001666 0.001847 0.003841 0.006931 0.009483 0.007568 
+0.008760 0.013878 0.013730 0.005452 0.008554 0.012884 
+-0.001030 0.001549 0.003337 -0.001251 0.002150 -0.003810 
+0.000564 0.001871 -0.003864 0.000683 0.001360 -0.001435 
+-0.001455 0.000163 0.000810 -0.001412 0.001086 -0.000073 
+-0.006609 -0.002644 0.002222 -0.002604 0.000279 -0.000124 
+0.000000 -0.000157 -0.000630 -0.001706 -0.000013 -0.000885 
+-0.002337 0.001054 -0.001007 -0.000660 -0.000523 -0.001135 
+-0.001160 -0.003707 -0.000515 -0.000617 -0.003153 0.000399 
+0.002341 -0.001227 -0.000952 0.004009 0.000848 -0.001970 
+0.000528 0.000455 0.000018 -0.000537 -0.003852 -0.002463 
+-0.004620 -0.005880 -0.000315 -0.004036 -0.002687 0.001512 
+-0.001564 0.001682 -0.000685 -0.000609 0.002061 -0.000878 
+-0.001463 -0.000894 0.000000 -0.002541 -0.003221 -0.000805 
+0.001033 0.000159 -0.003179 -0.001849 0.003229 -0.004167 
+-0.002033 0.002172 -0.000309 0.001336 0.000352 -0.000409 
+0.000995 0.000610 -0.003755 -0.001701 0.000678 -0.004227 
+-0.000818 -0.000710 -0.000649 0.002582 0.000418 -0.000828 
+0.002558 0.001331 0.000423 -0.002054 0.000140 0.003174 
+-0.004062 0.000602 0.005565 -0.002859 -0.005577 0.007357 
+-0.001722 -0.002106 0.003121 -0.000147 -0.000391 -0.000269 
+-0.000916 -0.001271 -0.001000 -0.000104 -0.003117 -0.000753 
+-0.002090 -0.004806 0.000021 -0.006468 -0.003902 0.000308 
+-0.002289 0.002269 0.003000 -0.000907 -0.001943 0.008206 
+-0.001546 -0.001893 0.004227 0.000830 0.001705 0.000018 
+0.002246 0.001336 0.000516 0.000999 0.002614 -0.001076 
+-0.001021 0.000880 0.000624 -0.002568 0.000284 0.001836 
+-0.000702 -0.004225 -0.001159 0.000644 -0.004524 -0.000792 
+0.001653 -0.005667 0.001733 0.002139 -0.005341 0.004237 
+0.008228 0.001198 0.000463 -0.000685 -0.001833 -0.001493 
+-0.002093 -0.004493 -0.004600 0.002027 -0.004622 -0.005603 
+0.003594 0.004181 -0.009537 -0.001002 0.009567 0.001466 
+-0.001867 0.003086 0.002562 -0.003965 0.000021 -0.002603 
+-0.000400 -0.000075 -0.003352 0.002164 -0.001429 -0.002707 
+0.007645 -0.001955 -0.003516 0.011856 0.001596 -0.004066 
+0.003769 -0.000790 -0.003092 -0.003331 -0.002591 -0.000071 
+-0.002658 0.000323 0.002460 0.002172 -0.001026 0.002618 
+0.003089 0.003480 -0.001484 -0.000047 -0.001684 -0.000510 
+-0.009036 -0.006943 0.001489 -0.004452 -0.002782 -0.002003 
+0.001917 0.003860 0.005255 -0.001209 0.000769 0.000879 
+-0.001443 -0.000710 0.001644 -0.003022 -0.003348 0.005250 
+-0.001943 -0.005391 0.005513 -0.001686 -0.005902 0.002024 
+-0.000868 -0.000942 0.002391 -0.000768 -0.001609 0.003434 
+-0.001221 -0.002028 0.004491 0.000652 -0.002606 0.004308 
+0.000724 -0.001878 0.002627 -0.001284 0.000903 -0.000936 
+-0.008102 -0.002207 -0.000267 -0.004628 -0.002259 0.002540 
+-0.002076 -0.000044 0.000460 -0.001017 -0.000567 -0.002836 
+0.000188 -0.000416 -0.001329 -0.000697 0.000697 0.000574 
+-0.001729 -0.000961 -0.002370 -0.000548 -0.001193 -0.001903 
+-0.002066 -0.003829 -0.000805 0.000046 -0.005296 0.002578 
+-0.001942 -0.003870 0.003548 -0.001498 -0.004565 -0.000357 
+-0.001818 0.000909 0.000331 -0.001311 -0.000615 -0.002008 
+-0.000250 0.004289 -0.003930 0.001456 0.004680 -0.006448 
+0.001054 0.001739 -0.007169 -0.000327 -0.001390 -0.006457 
+-0.002930 -0.004571 -0.003792 -0.003391 -0.004605 -0.000917 
+-0.000383 -0.002280 -0.007337 0.004312 0.000379 -0.005025 
+0.004105 0.002656 0.000181 0.000013 0.001436 0.004160 
+0.000223 -0.004268 0.003966 -0.000880 -0.003473 0.000119 
+0.000574 0.000504 0.000653 0.003790 0.002648 -0.002739 
+0.004041 0.001998 -0.002881 0.000905 0.000336 -0.001982 
+-0.002205 -0.000598 0.000524 -0.002372 -0.000365 0.002479 
+0.000349 -0.000063 0.000826 0.001061 -0.001751 -0.003675 
+0.000345 -0.003727 -0.004405 -0.000584 -0.001289 -0.004160 
+-0.000837 0.001298 -0.001315 -0.002303 -0.001966 0.002338 
+-0.004536 -0.007166 0.002695 -0.005595 -0.002857 -0.000833 
+-0.000079 -0.002520 -0.000866 0.001182 -0.000037 0.001961 
+0.002051 0.003026 -0.000092 0.000127 0.000218 -0.000229 
+-0.005652 -0.007254 0.000091 -0.008415 -0.009235 -0.002514 
+-0.005049 -0.000024 -0.004103 0.002611 0.000050 -0.004623 
+0.001997 0.001599 0.003029 0.002011 0.002208 0.002693 
+0.000915 -0.004468 -0.003757 -0.002339 -0.006488 -0.011873 
+-0.002751 -0.007092 -0.016740 -0.008310 -0.011130 -0.015393 
+-0.015541 -0.007480 -0.013967 -0.016848 -0.009828 -0.007537 
+-0.003576 -0.013223 -0.007224 0.003664 -0.007424 -0.008088 
+0.007522 -0.000611 -0.005721 0.006997 0.002056 -0.002754 
+0.003641 0.000738 -0.003727 0.005342 0.000177 -0.004978 
+0.006460 -0.002756 -0.009430 0.011099 -0.002738 0.000412 
+0.005873 0.004778 -0.001380 0.000146 0.004328 0.001536 
+-0.001949 0.002212 0.001426 -0.001228 -0.000434 0.001144 
+-0.000179 -0.002055 0.002337 -0.000029 -0.001926 0.002903 
+-0.003129 -0.001565 -0.001210 -0.001220 0.000146 -0.000195 
+0.001110 -0.003418 -0.001409 0.002173 -0.000312 -0.000013 
+0.000298 -0.001816 0.001518 -0.003004 -0.001886 0.001746 
+-0.008489 0.000807 0.000891 -0.008715 -0.001352 0.001277 
+-0.005207 -0.002144 0.000357 -0.000992 0.000661 0.001074 
+-0.002159 0.000117 -0.001225 -0.005686 -0.003159 0.002888 
+-0.000340 -0.002281 0.001522 0.005019 -0.000075 -0.001863 
+0.000342 0.002137 0.000342 0.000450 0.002552 0.000150 
+-0.002778 0.000154 -0.000028 -0.004879 -0.000395 0.004319 
+-0.000994 -0.000795 0.002689 0.002185 0.000194 -0.000310 
+0.002393 0.001016 -0.000836 0.000847 0.001116 -0.000893 
+-0.000968 0.001915 -0.003359 -0.001521 0.000831 -0.005328 
+-0.002505 -0.002895 -0.003025 -0.005204 -0.004459 0.000741 
+-0.002276 -0.000538 -0.004004 -0.001749 -0.000806 -0.004129 
+-0.001118 -0.002008 -0.001980 0.000518 -0.002548 -0.000227 
+0.001835 -0.001731 0.000207 0.000967 -0.000220 0.000132 
+0.000308 0.001000 0.000769 0.000254 -0.000712 0.002341 
+0.000845 -0.002844 0.001281 -0.000599 -0.006329 0.001140 
+-0.001946 -0.007921 -0.001275 0.000000 -0.005161 -0.004274 
+0.004426 -0.001066 0.000000 0.000108 -0.001017 -0.000041 
+0.000093 -0.001662 -0.002330 -0.001231 -0.000101 0.001977 
+-0.000552 -0.000995 0.001916 0.001375 -0.000036 -0.000507 
+0.000800 -0.000449 -0.001194 -0.001822 -0.001068 0.002859 
+-0.000431 -0.005070 0.001975 0.001755 -0.001582 0.002972 
+0.000174 0.000367 0.000918 0.000114 -0.001040 -0.003406 
+0.000878 -0.007359 -0.002769 0.000863 -0.011004 -0.000180 
+0.004424 -0.002784 -0.004754 0.003162 -0.000565 -0.020105 
+0.005858 -0.003946 -0.024695 0.001249 -0.006257 -0.017934 
+-0.008805 -0.014503 -0.006994 -0.002188 -0.013107 -0.005824 
+0.000317 -0.005638 -0.009086 0.001662 -0.000812 -0.013032 
+-0.004819 0.000103 -0.009467 -0.017297 -0.002744 -0.007879 
+-0.023692 -0.012056 -0.007904 -0.007706 -0.004433 -0.013436 
+0.002523 -0.004192 -0.009855 0.003984 0.000040 -0.004497 
+0.002933 0.000982 -0.002285 0.003958 0.001707 -0.003656 
+0.002127 0.002077 -0.004320 -0.000062 -0.001521 0.000621 
+-0.007532 -0.009731 0.004768 -0.004367 -0.010278 0.005917 
+-0.001725 -0.005556 0.003920 -0.000812 -0.001849 0.003023 
+-0.001367 -0.000615 0.002024 -0.003473 -0.001096 0.000040 
+-0.002920 0.000611 -0.001607 -0.001686 0.000797 -0.003891 
+-0.000440 0.000456 0.000891 -0.002752 0.002122 0.002852 
+-0.001456 0.000242 0.001782 0.001271 -0.000642 -0.003211 
+0.004902 0.000308 -0.002297 0.003975 0.005000 -0.001325 
+0.004167 0.001833 -0.002333 0.002948 -0.000716 -0.003664 
+0.001311 -0.004221 -0.004221 -0.000883 -0.005235 -0.004668 
+-0.004399 -0.003567 -0.003328 -0.001040 -0.000809 -0.004160 
+0.000541 -0.001896 -0.002258 -0.003689 -0.003689 0.003689 
+-0.006237 -0.000520 0.007642 -0.006656 -0.002496 0.007642 
+0.001060 -0.005159 0.003711 0.002742 -0.002252 0.001175 
+-0.001325 0.000312 0.002262 -0.001935 -0.002983 0.003548 
+-0.002626 -0.000579 0.000287 -0.000961 0.002682 -0.002615 
+-0.002494 -0.000561 -0.003242 -0.005025 -0.002443 -0.001891 
+0.007109 0.000780 -0.001495 0.002800 -0.001013 -0.000010 
+0.001395 -0.002807 0.001200 -0.001026 -0.004852 0.004201 
+-0.004849 -0.003560 0.002946 -0.004608 -0.000406 0.000106 
+-0.002679 0.000979 0.000097 -0.000825 0.000788 0.000772 
+-0.000181 -0.000431 -0.000499 -0.001315 -0.002502 -0.002409 
+-0.002099 -0.004034 -0.003680 -0.000340 -0.004400 -0.003917 
+0.001472 -0.004154 -0.002142 0.002047 -0.001602 -0.002106 
+0.001137 0.000130 -0.001975 -0.000530 -0.001742 0.000455 
+-0.003739 -0.001772 -0.000237 -0.002741 0.000000 0.000963 
+-0.001716 0.000276 -0.000184 -0.001000 0.001963 -0.001481 
+-0.000682 0.001579 -0.001107 0.000018 0.000276 0.000492 
+-0.000096 0.000588 0.000393 0.003520 0.001393 -0.002732 
+0.008503 -0.001556 -0.004698 0.009414 -0.006388 -0.004539 
+0.002377 -0.010620 -0.009729 -0.004346 -0.002927 -0.008518 
+0.003877 0.000303 -0.006013 0.000021 -0.000326 -0.003815 
+-0.007435 0.000242 -0.002321 -0.006601 0.006112 0.008319 
+0.006670 0.013572 0.017037 0.016718 0.010191 0.016890 
+0.015282 0.005057 0.011482 0.003975 0.002322 0.008284 
+-0.009894 -0.005072 0.006173 -0.015937 -0.015488 0.001139 
+-0.013838 -0.001413 0.009932 -0.013876 -0.010628 -0.004835 
+-0.005453 -0.019286 -0.005214 -0.003666 -0.014953 -0.004527 
+-0.003987 -0.006600 -0.001298 -0.001102 -0.000858 -0.000895 
+-0.001147 -0.000921 -0.004548 0.002943 -0.002071 -0.009308 
+0.003829 -0.004012 -0.007474 0.001334 -0.003707 -0.004770 
+-0.000012 -0.003108 -0.002448 -0.002029 0.000094 -0.000564 
+-0.004534 -0.003088 0.000780 -0.002720 -0.003670 0.003055 
+0.000823 -0.000906 0.003417 0.001300 0.002794 0.002630 
+0.002843 0.002030 0.000337 0.002219 -0.001025 -0.000037 
+0.000393 -0.002101 -0.000308 -0.004066 -0.002033 0.001818 
+-0.005707 0.001961 -0.000354 -0.001597 0.004437 -0.002218 
+0.000453 -0.001297 -0.000506 0.004383 -0.000649 -0.006497 
+0.003322 0.003111 -0.003164 -0.000420 0.003815 -0.002047 
+-0.001183 0.002821 -0.002785 -0.000226 0.001709 -0.000301 
+0.002723 0.001148 0.001434 0.002583 0.001360 0.000409 
+0.001623 0.000616 -0.001254 0.002076 0.000233 -0.001949 
+0.003970 -0.000143 -0.002069 0.004637 0.000241 -0.000738 
+0.003325 0.000932 0.000667 0.000281 0.000141 0.002422 
+-0.002730 -0.003377 0.003877 -0.004806 -0.002403 0.001567 
+0.002307 0.000438 -0.002874 0.005272 0.001346 -0.001102 
+0.000269 0.001983 0.001986 -0.006057 0.000419 0.000539 
+-0.007236 -0.000815 -0.000133 -0.005272 -0.000136 0.002432 
+-0.002066 0.000298 0.000149 -0.003642 -0.000484 0.000891 
+-0.003014 -0.002495 -0.000265 -0.001234 -0.002651 -0.001737 
+-0.000289 -0.002020 -0.001148 -0.000700 0.000066 0.001165 
+0.000035 -0.000274 0.001592 0.000132 -0.000256 0.000201 
+-0.000154 -0.001317 0.000530 -0.000259 -0.003418 -0.001942 
+0.001145 -0.000763 -0.000640 -0.003634 -0.006857 0.000469 
+-0.001100 -0.004750 -0.001123 -0.000208 -0.000911 0.000048 
+-0.000827 0.001325 -0.000320 0.000820 0.002566 -0.001958 
+0.002546 0.000818 -0.001663 0.002996 -0.001633 -0.002347 
+0.004245 -0.002775 -0.003801 0.010214 -0.003809 -0.009215 
+0.009996 -0.000721 -0.000690 -0.002490 -0.002869 0.008319 
+-0.012784 0.003984 0.009136 -0.018877 0.007458 0.016317 
+-0.020175 0.010668 0.022956 -0.014543 0.016114 0.026264 
+-0.017442 1.587209 3.482558 1.728814 1.898305 3.666667 
+2.768817 1.790323 3.107527 2.653409 1.386364 2.352273 
+0.018698 0.005864 0.015559 0.007822 0.004102 0.006366 
+-0.002170 0.007108 -0.010578 -0.003235 0.002955 -0.020289 
+-0.003253 -0.002334 -0.007985 0.001099 -0.002930 -0.004150 
+0.000754 -0.001890 -0.002427 0.003939 0.001326 0.000489 
+0.001220 0.001025 0.001395 0.000324 -0.002478 -0.001695 
+0.001828 -0.002866 -0.000111 0.001386 -0.002418 0.001451 
+-0.000823 -0.004544 -0.001786 -0.002281 -0.002801 -0.002047 
+0.000731 0.000876 -0.002411 -0.000763 0.000722 -0.001226 
+-0.000243 -0.000115 -0.000049 0.000325 0.000085 -0.000024 
+0.001225 0.000756 0.000235 0.002038 0.002237 0.000326 
+0.001094 0.002080 0.000219 -0.001791 -0.000208 0.001950 
+-0.001895 0.000632 0.003860 -0.000315 -0.000811 0.003859 
+0.000075 -0.000279 0.001583 -0.000628 0.000112 -0.000695 
+-0.002531 -0.001243 -0.002888 -0.002564 -0.003744 -0.002859 
+-0.002615 -0.002538 -0.000821 -0.000858 0.000435 -0.000037 
+0.003032 0.003045 0.002500 0.003634 0.003803 0.003935 
+0.004234 0.000670 0.001584 -0.000851 0.000385 0.001527 
+-0.005034 0.000334 0.002281 -0.002233 -0.000726 0.000095 
+0.001829 -0.002740 -0.001989 -0.000390 -0.003069 -0.003495 
+-0.005051 -0.003702 0.001662 -0.004739 -0.001434 0.000778 
+-0.000843 0.000197 -0.001715 -0.002413 0.001267 -0.001202 
+-0.002000 -0.001502 -0.001929 -0.000335 -0.002320 -0.002469 
+0.001593 -0.000610 -0.002914 0.001735 0.001050 -0.001572 
+0.000381 0.000781 0.000960 -0.000084 0.000572 0.002458 
+0.001463 -0.000665 -0.000931 -0.000424 -0.006995 0.001095 
+-0.002839 -0.005061 0.001056 -0.003302 -0.002340 -0.001911 
+-0.003035 0.000846 -0.002189 -0.003664 0.000640 -0.001244 
+-0.002663 -0.001933 -0.002135 0.000099 -0.001798 -0.000513 
+0.000709 0.000514 -0.003863 0.001743 0.004612 0.001068 
+0.002047 0.002674 -0.001992 0.000340 -0.000839 -0.002417 
+-0.000448 -0.000118 -0.001325 0.000703 0.001759 -0.003473 
+0.004262 0.002628 -0.004243 0.003674 0.000159 -0.001227 
+0.002170 0.002380 0.000929 0.008151 0.000736 -0.000128 
+0.009708 -0.000225 -0.004741 -0.003840 -0.004805 0.003633 
+-0.012687 0.004038 0.011703 -2.379182 1.100372 2.301115 
+-2.649275 1.518841 3.492754 -1.965616 1.653295 4.252149 
+0.000000 1.867470 4.370482 2.168571 2.125714 3.862857 
+3.085052 2.087629 3.360825 2.830239 1.761273 3.037135 
+2.133094 1.158273 2.345324 0.010070 0.000255 0.010290 
+-0.005417 -0.007384 -0.000473 -0.007870 0.004008 -0.000896 
+-0.002124 0.003508 0.000860 0.001447 0.001272 0.001053 
+0.001445 0.002370 0.000734 0.001710 0.005298 0.002726 
+0.005490 0.004842 0.004344 0.000747 0.002743 -0.000340 
+0.000926 -0.001079 -0.002151 0.000449 0.000538 -0.001480 
+-0.003249 0.000602 -0.003932 -0.002243 0.000977 -0.004054 
+0.002601 0.004302 -0.001167 0.001312 0.005244 -0.003205 
+0.001007 0.001286 0.000237 0.001207 -0.005325 -0.001543 
+0.001101 -0.006659 -0.002674 0.005132 0.000453 -0.004051 
+0.002046 0.004343 0.001980 -0.001352 0.000467 0.000188 
+0.000186 0.000730 -0.000997 0.002721 -0.001940 0.001011 
+0.002537 -0.002936 0.001181 0.001144 -0.000686 0.001407 
+0.000270 -0.000403 -0.000410 -0.000738 -0.004226 -0.001546 
+-0.002786 -0.007472 0.002408 0.003499 -0.006296 0.001711 
+0.002727 0.001636 0.002182 0.003589 0.000485 0.002070 
+0.001663 0.001934 0.003249 0.002734 -0.000796 0.001347 
+0.003255 -0.001148 0.003001 0.001105 -0.003850 0.004949 
+0.002181 -0.003600 0.001340 -0.000757 -0.002827 -0.000278 
+-0.001171 -0.003399 -0.000945 0.001463 -0.003049 -0.003049 
+0.000350 -0.001787 -0.004002 0.002009 -0.001697 0.000571 
+-0.001681 -0.002236 0.004192 -0.005684 -0.002146 -0.000113 
+-0.004135 -0.004067 -0.002229 -0.000903 0.000970 -0.000396 
+0.006502 0.003237 0.000057 0.009255 0.004880 -0.001750 
+0.003984 0.002806 -0.004278 0.001111 0.000461 -0.005095 
+-0.001807 -0.000461 -0.001240 0.002852 -0.003505 -0.008992 
+-0.000697 -0.003937 -0.005274 -0.004442 -0.001546 -0.003053 
+-0.003383 -0.004348 -0.003114 -0.005247 -0.004480 -0.000547 
+-0.002852 -0.002568 -0.001034 -0.001244 -0.000154 -0.002382 
+-0.000555 0.000385 -0.003203 0.000717 0.002157 -0.001087 
+-0.000957 0.000870 0.002443 -0.001155 0.001742 0.001790 
+-0.001799 0.000933 -0.002857 -0.004206 -0.003432 -0.002647 
+-0.004792 -0.001237 -0.000502 -0.002237 -0.001303 0.003325 
+0.009737 0.000071 0.000761 0.001022 -0.007658 -0.002059 
+-0.008088 0.000481 0.009062 -2.226629 0.784703 1.458923 
+-2.608076 1.142518 2.451306 -1.895000 1.540000 3.632500 
+0.517413 2.057214 3.601990 2.490605 2.102296 2.676409 
+2.700382 1.872137 2.242366 2.264840 1.557078 2.203196 
+1.720755 1.026415 2.143396 0.014511 0.001909 0.011246 
+0.008503 -0.002046 0.002091 -0.001094 -0.003308 0.002597 
+-0.005700 -0.003368 0.005934 -0.003293 -0.001077 0.003354 
+0.001210 0.001874 0.000497 0.001019 0.002481 0.002993 
+-0.000108 -0.002068 0.001500 -0.001987 -0.004087 0.000451 
+0.000208 -0.001992 -0.003367 0.001270 0.002262 -0.002782 
+0.002182 0.001146 -0.001365 -0.000818 -0.001420 -0.000131 
+-0.000751 -0.002931 0.001768 0.000267 -0.001916 0.001319 
+-0.000194 0.003870 0.004436 0.001208 0.002608 0.000952 
+0.000229 -0.000137 -0.002705 0.001723 -0.000240 -0.003768 
+0.000679 0.001596 -0.001561 0.001436 0.000027 -0.000271 
+-0.000458 -0.002172 0.001331 -0.005161 -0.004170 0.003483 
+-0.003791 -0.004872 -0.003186 -0.002572 -0.003132 -0.002487 
+-0.002353 -0.001217 0.000487 -0.000382 0.000791 0.000807 
+-0.002876 0.000792 0.004724 0.000666 -0.003111 0.006577 
+-0.000568 -0.000552 0.005419 -0.001284 0.001548 0.003099 
+-0.001619 0.001709 0.002212 -0.000332 -0.000735 0.002133 
+0.000894 -0.000944 -0.000816 0.001759 0.000060 0.001930 
+-0.000601 -0.002567 0.006642 -0.001203 -0.005034 0.003305 
+-0.004132 -0.003306 -0.000826 -0.005145 -0.001682 -0.005778 
+0.000191 -0.000887 0.001039 -0.000496 0.000792 0.000666 
+-0.002651 -0.000468 -0.002047 0.001480 0.001432 -0.008761 
+-0.002826 0.000237 -0.004306 0.001533 0.001679 0.000000 
+-0.000434 0.000288 0.000556 -0.001410 0.000556 0.003139 
+-0.005999 -0.003049 0.005116 -0.002917 -0.004101 -0.001390 
+-0.002976 -0.001919 -0.000409 -0.001284 0.000496 0.000042 
+0.000960 -0.000320 -0.005120 0.002437 0.000480 -0.001409 
+0.001084 0.000721 0.001875 0.000469 -0.000469 0.001328 
+-0.000064 -0.000352 0.000374 -0.001066 -0.002099 -0.000282 
+0.001127 -0.002406 -0.000590 -0.000586 -0.002775 -0.000464 
+0.000025 -0.005099 -0.000480 -0.000650 -0.005032 0.000807 
+0.004331 -0.001915 0.001953 0.000837 -0.003411 -0.000881 
+0.000589 0.000769 -0.002017 -0.000227 0.002364 -0.001036 
+0.002477 0.001509 -0.005759 -0.001140 0.004590 -0.017897 
+-0.003940 -0.018425 -0.025591 -0.017567 -0.011434 -0.012067 
+-0.016824 -0.001152 0.011342 -0.008649 -0.004084 0.015121 
+-0.001464 -0.002358 0.004992 0.015786 -0.001158 0.006169 
+0.019634 -0.001348 0.006864 0.015589 -0.005184 -0.001438 
+0.007329 -0.007131 -0.006221 0.005468 0.006762 0.003403 
+-0.002484 0.002333 -0.000158 -0.008828 -0.008547 0.000569 
+-0.005842 -0.008619 0.002360 0.001367 -0.001210 -0.001608 
+0.007223 -0.003602 0.000326 0.000383 -0.002527 -0.000417 
+0.000232 0.004516 -0.002118 0.002943 0.000299 -0.005204 
+0.000743 -0.001883 -0.000672 -0.000125 -0.000977 -0.000313 
+-0.000979 0.000868 -0.000589 0.001136 0.002182 -0.004364 
+0.003321 0.002484 0.000342 0.002120 0.000655 -0.000686 
+-0.001020 0.000088 0.000592 -0.006143 -0.000955 -0.003248 
+-0.003572 -0.004000 -0.003547 0.002060 -0.001383 -0.006119 
+0.000909 -0.003636 -0.004015 0.001977 0.000171 -0.000483 
+0.000863 -0.000370 0.008462 -0.005166 -0.001335 0.000624 
+-0.000439 0.000012 0.000038 0.001654 0.004752 -0.009504 
+-0.000412 0.001858 0.000337 -0.005436 -0.002862 0.001945 
+-0.007457 -0.004743 0.006782 -0.002415 0.000918 0.000344 
+0.001332 -0.000238 0.000722 0.000855 -0.001651 0.001207 
+0.001783 -0.001615 -0.000775 0.000169 -0.002483 -0.001771 
+-0.002136 0.000179 -0.000619 -0.003543 0.002177 0.001734 
+-0.001601 -0.001084 0.001240 -0.002961 -0.003622 -0.001512 
+-0.002104 -0.005482 0.000211 -0.002311 -0.004900 -0.000290 
+0.000332 -0.000350 0.000254 0.004602 0.002303 0.001642 
+-0.000392 0.001468 -0.001328 0.002775 0.000752 -0.005005 
+0.001727 -0.000719 -0.000288 0.000603 0.000283 0.002649 
+-0.000338 -0.000165 0.005374 -0.000085 -0.001048 -0.000342 
+-0.000363 0.002903 -0.001815 -0.000333 0.001853 -0.001093 
+-0.000088 -0.001042 -0.001256 0.000224 -0.001335 -0.001059 
+0.004914 -0.000761 0.000887 0.005001 -0.000148 0.001946 
+0.003866 -0.000244 0.001299 0.000270 -0.001757 -0.001718 
+-0.002176 -0.001168 0.000484 -0.003063 -0.002246 -0.004309 
+-0.005280 -0.001241 -0.005290 -0.001917 -0.001485 0.000309 
+0.004473 0.001875 -0.001417 0.006588 0.002727 -0.001923 
+0.002988 0.001433 -0.000317 -0.000195 -0.000937 0.000936 
+-0.000048 -0.001982 0.000176 0.002286 -0.003055 -0.002010 
+0.004000 -0.005102 -0.001235 0.000297 -0.004842 0.002309 
+-0.005652 -0.002795 -0.001723 -0.006575 0.004691 -0.005744 
+-0.007241 0.000515 -0.003116 -0.001635 -0.000579 -0.011141 
+-0.004719 -0.000060 -0.015350 -0.019324 0.001012 0.005703 
+-0.013727 -0.004339 0.017456 0.000099 -0.001563 0.005444 
+0.000982 0.001072 0.002139 -0.003884 -0.002231 -0.000450 
+-0.006584 -0.002281 0.002969 -0.004887 0.002832 0.002197 
+-0.005435 0.001790 0.000350 -0.002188 0.001954 -0.000161 
+-0.000363 0.000835 0.000607 0.000759 -0.000432 -0.000580 
+0.003568 -0.002336 -0.003898 0.005193 -0.001327 -0.007025 
+0.004685 -0.000670 -0.006290 0.002018 0.000777 0.000688 
+-0.001095 -0.000566 0.000394 -0.003692 -0.000768 0.001057 
+-0.002836 -0.001491 -0.001684 0.000562 -0.001131 -0.003481 
+0.000882 -0.000405 -0.003629 0.001993 -0.001281 -0.000216 
+0.002408 -0.003561 0.002677 0.002208 -0.001800 0.002031 
+0.000560 0.001255 -0.001368 0.000391 0.000969 -0.003458 
+-0.000782 -0.000733 -0.001045 -0.001040 0.002000 -0.001931 
+-0.001290 0.008288 -0.005580 0.007563 0.007313 0.000731 
+0.006941 0.002215 -0.003914 -0.003433 -0.001487 0.002988 
+-0.007340 -0.003249 0.008064 -0.002818 -0.002237 0.007235 
+0.000129 0.001638 0.004756 0.000924 0.002029 0.004019 
+0.000406 0.000997 0.001237 -0.003052 -0.004290 -0.002710 
+-0.000275 -0.002415 -0.002716 0.000933 -0.003895 -0.002740 
+-0.000938 -0.001420 -0.001918 -0.002772 0.003356 -0.003014 
+-0.006788 0.002974 -0.000413 -0.008917 0.001483 0.002967 
+0.001087 0.005144 -0.002045 0.000069 0.002389 -0.004303 
+-0.000022 0.000151 -0.002308 -0.002727 0.000000 -0.002727 
+0.000239 -0.001770 -0.003738 0.001884 -0.002372 -0.003883 
+0.002417 -0.000078 -0.003782 -0.000457 0.002748 -0.003666 
+-0.001281 0.000223 -0.001446 0.001062 -0.000386 -0.000115 
+0.002965 -0.001230 -0.001454 0.002957 -0.001257 -0.002252 
+0.001511 -0.000491 -0.000672 0.001375 -0.002042 0.002398 
+0.002803 -0.003285 0.004242 0.001780 -0.001653 0.000223 
+-0.000276 -0.000876 -0.001693 -0.001797 0.002250 -0.006049 
+0.001488 0.005809 -0.006143 0.002028 0.004646 -0.006601 
+0.002745 0.001924 -0.003751 0.000113 -0.002818 -0.001499 
+0.000382 -0.007463 0.002675 -0.003814 -0.005896 0.006534 
+0.000715 -0.001571 0.005651 0.001518 -0.000278 0.004016 
+-0.002371 -0.000490 0.004634 -0.003658 -0.002811 0.005911 
+0.000456 -0.000057 0.004006 0.003239 0.006749 -0.001026 
+-0.000449 0.008951 -0.002659 -0.007056 0.004119 -0.006487 
+-0.014784 -0.005970 -0.012720 -0.041224 -0.011967 0.000240 
+-0.014685 0.012735 0.007409 0.000409 -0.000620 -0.001383 
+0.001078 -0.001104 -0.004307 0.000635 0.000800 -0.004508 
+-0.000258 -0.000258 -0.003950 -0.001611 -0.001744 -0.004436 
+-0.002068 -0.004173 -0.004278 -0.001896 -0.003147 -0.003871 
+0.000798 0.000423 -0.000926 0.003843 0.000109 -0.002607 
+0.004101 0.001205 -0.005263 0.000652 0.001738 -0.006372 
+0.005508 0.005565 -0.003771 0.005196 0.004494 -0.004951 
+0.001541 0.002207 -0.003258 -0.002645 0.000043 -0.000131 
+-0.003072 -0.000288 -0.000496 -0.000280 -0.001191 -0.001962 
+0.002125 0.000654 -0.003577 0.001807 0.000471 -0.000232 
+0.002672 -0.000503 0.002169 -0.001620 -0.006606 0.006232 
+-0.001973 -0.000658 -0.001096 -0.000134 -0.001171 -0.001892 
+0.004904 0.000673 -0.005977 0.000119 0.004681 -0.002902 
+0.001250 0.000555 0.000439 -0.002032 -0.000185 0.001201 
+-0.002935 -0.002396 -0.000279 -0.004335 -0.000728 0.001346 
+-0.002495 -0.000800 0.000883 -0.000713 -0.000650 0.000825 
+-0.001308 -0.003897 -0.000406 -0.003321 -0.005871 -0.001876 
+-0.001688 -0.002795 -0.003430 -0.001015 -0.000631 -0.002222 
+-0.001425 -0.000195 -0.001999 -0.000755 -0.000275 -0.002458 
+-0.004892 0.000661 -0.001031 -0.000796 -0.000857 -0.001714 
+-0.000083 -0.000237 0.002325 -0.001301 -0.000560 -0.000018 
+0.000097 -0.000476 -0.000579 0.000619 0.000367 -0.000373 
+0.001447 0.002224 0.000796 0.001883 0.002803 0.001332 
+0.001994 0.001058 0.000930 -0.000808 -0.000504 0.000061 
+-0.000319 -0.000426 0.001452 0.001577 0.001314 0.000556 
+0.003362 0.004080 -0.001078 0.004806 0.002258 -0.001714 
+0.005710 -0.001071 -0.002874 0.004207 -0.003357 -0.002980 
+0.000271 -0.002302 0.001234 -0.003529 0.004014 0.003302 
+0.001534 0.001862 0.007295 0.000055 0.000117 -0.000419 
+0.002461 0.002395 -0.003878 0.000392 0.004721 -0.004408 
+-0.000917 0.002479 -0.003386 0.000209 -0.000624 0.000866 
+-0.002684 -0.000596 0.005468 -0.002173 -0.000156 0.006138 
+-0.000102 0.000409 0.003575 0.004231 -0.003378 0.003182 
+0.003446 -0.002127 -0.000770 -0.000470 -0.004249 0.002560 
+-0.001305 -0.004894 0.001966 -0.000802 -0.001421 0.001413 
+0.001825 0.001340 0.000195 0.002616 0.002628 -0.001546 
+0.003236 0.003727 -0.003453 0.006627 0.004775 -0.004418 
+0.009599 0.002220 -0.002182 0.001270 -0.000024 0.001137 
+-0.004710 0.003189 -0.002722 0.000049 0.002921 -0.005703 
+0.003517 -0.000802 -0.006848 0.003065 -0.002642 -0.004105 
+0.001097 -0.001178 -0.000290 0.000491 -0.000514 0.001532 
+-0.000611 -0.000472 0.002126 -0.002269 -0.001879 0.002200 
+-0.001868 -0.001187 0.003123 -0.001376 -0.000171 0.002296 
+-0.000030 0.000312 -0.000546 0.000070 0.001237 -0.000340 
+-0.000006 -0.001981 -0.000024 0.001383 -0.004707 0.000639 
+-0.001011 -0.000155 -0.000568 -0.002654 -0.001113 -0.003612 
+-0.002442 -0.001647 -0.004619 -0.001071 -0.003594 -0.002533 
+-0.003397 -0.003130 0.001844 -0.003269 -0.004058 0.002376 
+-0.001328 -0.003656 0.001828 -0.000630 -0.002441 -0.000787 
+-0.000251 0.001188 -0.001234 0.000379 0.000574 0.000012 
+-0.001867 -0.000337 -0.001979 -0.001387 -0.002619 -0.002523 
+-0.001504 -0.000771 -0.002752 0.001860 0.001763 -0.005676 
+0.000503 0.003017 -0.004186 -0.000147 0.000737 -0.001333 
+-0.005303 -0.003427 0.000775 -0.006221 -0.004578 -0.002099 
+-0.004560 -0.003528 -0.001845 0.000360 -0.000499 -0.006648 
+0.000246 -0.000865 -0.000353 0.000107 -0.001603 -0.001349 
+-0.001792 -0.001492 -0.002220 0.001393 -0.002786 -0.001161 
+0.000517 -0.003371 -0.001384 0.000389 -0.001544 0.000858 
+-0.000847 -0.002696 0.002054 -0.003828 -0.002754 0.001856 
+-0.000270 -0.004312 -0.001809 -0.004293 -0.002500 0.002576 
+-0.004397 0.002053 0.001591 -0.002195 0.002735 -0.001095 
+-0.001867 -0.000053 -0.001813 -0.002865 -0.001531 -0.000414 
+0.000218 -0.001003 0.000779 0.006683 0.001103 -0.001135 
+0.010791 -0.002470 -0.002763 0.008669 -0.004893 -0.004102 
+0.003100 -0.001716 -0.006968 0.001307 0.006173 -0.002197 
+-0.001519 0.010262 -0.012901 0.000562 0.008907 -0.009506 
+-0.001141 0.003693 -0.002228 -0.003909 -0.001270 0.001191 
+-0.003434 -0.001596 0.001319 -0.001348 0.002462 -0.005198 
+0.005321 0.004797 -0.006425 0.005427 0.003430 -0.008347 
+-0.000472 0.000295 -0.001298 -0.001721 -0.001226 0.003722 
+-0.000325 -0.002129 0.005721 -0.001722 -0.007468 0.001535 
+-0.002277 -0.006546 -0.000677 -0.005739 -0.003000 0.001174 
+-0.002681 0.000631 -0.001034 -0.001093 0.000664 -0.002439 
+-0.000855 0.001997 -0.003023 0.000123 0.002758 -0.004236 
+0.001912 0.001872 -0.000609 -0.001224 0.002474 0.003423 
+-0.003148 0.002056 0.003393 -0.003507 0.000861 0.003978 
+-0.002332 0.000889 0.004051 0.000144 -0.000298 0.000833 
+0.000355 -0.001325 -0.001294 -0.000018 -0.000684 -0.001106 
+-0.000898 0.000731 0.000047 -0.001479 0.000652 0.001027 
+-0.001107 -0.000436 0.000819 -0.000221 -0.001120 0.000088 
+0.001980 0.000611 -0.000332 0.003689 0.001713 -0.003997 
+0.002971 0.006395 -0.005178 0.003624 0.000705 -0.004480 
+0.001324 0.001050 -0.003440 -0.002675 -0.001243 -0.000895 
+-0.004044 -0.004506 0.001929 -0.002863 -0.004985 0.000625 
+-0.000924 -0.000856 -0.001522 0.000404 0.002406 -0.001521 
+-0.000623 0.002363 0.001340 -0.004666 -0.002135 0.001277 
+-0.003502 -0.004724 -0.002813 -0.001755 -0.003932 -0.004976 
+-0.002049 0.001230 -0.003279 -0.000222 -0.001407 -0.001867 
+-0.000631 -0.000093 -0.000537 -0.000675 -0.000025 -0.000540 
+-0.000697 -0.000199 -0.000796 -0.000647 0.000085 -0.003065 
+-0.001059 0.000491 -0.002894 -0.001225 -0.000861 0.000057 
+0.000747 -0.003728 0.000248 0.001407 -0.003771 -0.003714 
+-0.000033 -0.004005 -0.001235 -0.000486 -0.001811 0.000534 
+0.001466 -0.001015 0.003819 -0.002871 -0.001788 -0.000009 
+-0.001060 -0.005362 0.000291 0.001612 -0.004695 -0.004846 
+0.001215 -0.005187 -0.004615 0.001903 -0.003835 0.000004 
+0.000426 0.000641 0.001243 0.000881 0.000838 0.000481 
+0.003324 -0.003021 -0.003440 0.004823 0.001331 -0.002697 
+0.006373 0.003447 -0.002829 0.006938 0.004146 -0.001571 
+0.004607 0.000924 -0.004615 -0.001644 0.000934 -0.003028 
+0.001078 0.001710 0.000078 0.000776 0.001089 0.002321 
+0.000092 -0.003665 -0.001613 0.001667 -0.007721 -0.000813 
+-0.007232 0.000530 -0.001506 -0.014938 0.004706 -0.015458 
+-0.008232 0.026556 -0.015646 -0.007199 0.019795 -0.006393 
+-0.006184 0.006230 -0.001124 -0.004045 -0.004790 -0.000768 
+0.001680 -0.002368 -0.001258 0.002996 0.000578 -0.001949 
+-0.000573 -0.001517 -0.001332 0.001783 0.001202 -0.002132 
+-0.000065 -0.000433 0.000596 0.000675 0.000099 0.000842 
+-0.000309 -0.000103 -0.000274 -0.002095 0.000479 -0.004131 
+-0.000005 0.000574 -0.001419 -0.000622 -0.002114 0.002736 
+0.000068 -0.003131 0.001947 -0.000023 -0.000266 0.000023 
+-0.000549 0.004300 -0.002639 0.005596 0.007907 -0.004793 
+0.006379 0.005919 -0.000974 0.000225 0.000775 0.000338 
+-0.005132 -0.006905 0.000331 -0.007208 -0.006203 -0.002609 
+-0.001751 0.000713 -0.001186 -0.000292 0.001240 0.001309 
+0.000889 0.000131 0.001386 0.001171 -0.001547 0.000314 
+0.000364 -0.001572 -0.000208 0.002519 -0.000160 -0.000053 
+0.003275 0.000392 -0.003755 0.001895 -0.001492 -0.001048 
+-0.002390 -0.003020 -0.000090 -0.001504 0.001437 -0.002473 
+0.000238 0.003001 -0.003512 0.002543 0.003740 -0.003943 
+-0.000425 0.002944 -0.003850 0.000861 -0.001660 -0.005578 
+0.001503 -0.000329 -0.003876 0.000681 0.006664 -0.000962 
+0.002208 0.010072 -0.002865 0.001117 0.008019 -0.002615 
+-0.001390 0.002065 -0.003195 -0.001145 0.000687 0.000458 
+-0.000312 -0.002545 -0.002990 0.000583 0.000583 -0.003583 
+0.001403 -0.002449 -0.002790 0.002264 -0.002309 -0.004119 
+0.002820 -0.001504 -0.002669 0.000859 -0.001203 0.000731 
+-0.002202 -0.000440 0.001812 -0.000801 -0.004036 0.002467 
+-0.000247 -0.002127 0.000512 -0.000939 0.000500 -0.004974 
+-0.000656 -0.004787 -0.002393 -0.001562 -0.004088 -0.004731 
+-0.000385 -0.000885 -0.000885 0.001229 0.002524 0.001164 
+0.002073 0.001414 -0.000126 -0.000909 -0.002270 -0.002990 
+0.000286 -0.005145 -0.004611 0.001480 -0.005902 -0.002358 
+0.002306 -0.003020 -0.004439 -0.001084 -0.002087 -0.003417 
+-0.002500 0.000625 -0.001875 0.002735 0.002982 -0.001080 
+0.002299 -0.003112 -0.002744 0.003192 -0.002284 -0.004525 
+0.003337 -0.001375 -0.004318 0.000812 0.001083 -0.002331 
+0.000000 0.001769 0.000385 -0.001266 0.000904 0.001024 
+0.001822 0.000216 -0.002578 0.004444 -0.002196 -0.004498 
+0.005998 -0.009453 -0.004172 0.002618 -0.001901 0.000057 
+-0.017018 0.016821 -0.006827 -2.140625 4.109375 -1.921875 
+-2.233333 4.233333 -1.800000 -0.014659 0.030879 -0.010594 
+-0.001864 0.013254 -0.000213 0.004714 -0.004363 0.000426 
+0.001733 -0.002198 0.002755 0.000091 -0.003652 -0.003014 
+-0.003448 0.001825 -0.000253 -0.003636 0.003274 -0.003316 
+-0.003308 0.005550 -0.003682 -0.003272 0.000957 -0.006505 
+-0.001392 -0.001930 -0.004759 0.001574 -0.000519 -0.005773 
+0.001501 -0.001203 -0.006139 0.000616 -0.001469 -0.006113 
+0.000498 -0.001905 -0.002626 -0.000579 -0.000572 -0.000716 
+0.000205 0.001886 -0.002787 0.002789 0.001001 -0.000384 
+0.003836 -0.000582 -0.002846 0.003420 0.000541 -0.003868 
+0.002192 0.001521 -0.000605 0.000853 0.002776 0.002750 
+0.001587 0.001027 0.002049 0.000293 -0.001354 -0.000789 
+-0.001493 -0.001342 -0.002161 -0.002806 0.000029 -0.001481 
+-0.001913 0.000868 -0.001131 -0.000534 0.001069 0.000992 
+-0.000751 0.000795 -0.002605 -0.002610 0.000258 -0.004833 
+0.000364 0.004101 -0.005651 -0.001754 0.004962 -0.002206 
+-0.002476 0.002932 -0.001368 0.002771 0.004554 -0.001361 
+-0.000734 0.003143 -0.000358 0.001681 0.004486 -0.005852 
+0.004486 0.006381 -0.004321 0.001535 0.008804 0.000318 
+-0.001414 0.008874 -0.002513 0.002784 0.003341 0.000985 
+0.000264 -0.000180 0.000792 -0.002443 -0.002534 -0.003951 
+-0.001762 0.001398 -0.005773 -0.000618 0.001003 -0.004398 
+0.001209 -0.000560 -0.002270 0.003419 -0.001977 -0.002126 
+0.003189 -0.003307 -0.000708 -0.001491 -0.003137 0.001801 
+-0.001496 0.000748 0.004245 0.001072 0.001340 0.001575 
+0.001387 0.000202 0.000819 -0.000980 -0.001242 -0.000359 
+-0.001236 -0.003631 -0.001082 -0.002326 -0.002097 0.000465 
+-0.001124 0.000226 -0.000116 -0.000676 -0.002196 -0.000458 
+0.001007 -0.000731 0.000006 -0.001258 -0.001483 -0.001807 
+-0.002247 -0.002972 -0.002149 -0.004501 -0.005038 -0.000322 
+0.001707 -0.006278 0.000281 0.000921 -0.005155 0.001485 
+0.001440 0.001490 -0.000524 0.000381 0.005464 -0.001954 
+0.001933 -0.003605 -0.004247 -0.001288 -0.002751 -0.000538 
+-0.000506 -0.001874 0.002578 0.004569 -0.001382 -0.000316 
+0.002157 -0.003557 -0.002745 0.000834 0.000525 -0.001493 
+-0.000472 0.001189 0.001222 -0.000469 -0.004686 0.003333 
+0.005536 -0.010804 0.000357 -0.001016 0.003297 -0.007995 
+-0.020252 0.034945 -0.014209 -1.950311 4.677019 -1.658385 
+-1.958974 4.030769 -1.635897 -1.143646 2.961326 -1.403315 
+-0.001128 0.012492 0.000458 0.004561 -0.002313 0.003904 
+-0.000408 -0.002427 0.000026 -0.001533 0.002814 -0.003161 
+-0.002919 0.000236 0.002025 0.000435 0.001535 -0.001856 
+-0.002391 0.000471 0.000254 -0.002650 0.001588 -0.001143 
+-0.001424 0.001728 -0.001553 -0.000360 0.000763 -0.002190 
+0.000218 0.002357 -0.002480 0.000972 0.002016 -0.003693 
+-0.002975 0.001362 -0.001634 -0.004536 -0.001458 -0.003055 
+-0.003020 0.000332 -0.003241 -0.002281 0.001825 -0.003017 
+0.000686 -0.000397 -0.000618 0.001957 -0.000359 -0.001891 
+0.001738 -0.001858 -0.002581 0.002604 -0.001978 -0.001923 
+0.002385 -0.000769 0.000769 0.000286 0.001227 0.001352 
+-0.000787 0.001091 0.000105 0.001275 -0.002260 -0.003574 
+0.003916 -0.003953 -0.001566 0.004419 -0.002995 -0.001347 
+0.004199 -0.002257 0.001942 0.001261 -0.002160 0.000023 
+0.000149 -0.003980 -0.000788 0.000409 -0.003591 -0.003301 
+0.001942 0.000332 -0.002720 0.002408 0.000068 0.000441 
+-0.001177 0.002045 -0.001717 -0.002540 0.000806 0.002540 
+-0.006058 -0.000003 0.005407 -0.005215 0.002916 0.007312 
+-0.003162 0.005564 0.004638 -0.000602 0.002830 -0.000999 
+-0.002260 0.000334 -0.003431 -0.002463 -0.000063 -0.003355 
+-0.001061 0.001364 -0.000530 0.001396 0.002253 0.000967 
+-0.000171 0.002093 0.001829 -0.000145 -0.001283 -0.000885 
+-0.000298 -0.004770 -0.001789 0.001401 -0.005979 -0.002258 
+0.004897 -0.004587 -0.001877 0.004049 -0.003426 0.001557 
+-0.000442 -0.001535 0.000861 -0.002255 -0.003911 0.001799 
+-0.003779 -0.002395 0.000586 -0.000715 -0.000179 -0.001280 
+0.000452 0.001418 -0.002237 -0.000411 0.000176 -0.000234 
+-0.000439 -0.000878 0.001951 0.001428 0.000366 0.001627 
+0.004494 0.000247 -0.001011 0.003894 -0.001549 0.001110 
+0.004081 -0.001161 0.001669 0.003401 -0.000562 0.001799 
+0.002347 -0.000056 -0.002236 0.001905 0.002465 -0.003417 
+0.004447 0.004616 -0.003262 0.001249 0.002715 -0.001667 
+0.000252 -0.000868 0.002003 -0.000832 0.000216 0.000974 
+-0.000294 -0.000480 -0.000209 0.000378 0.001747 -0.001694 
+0.002475 0.002197 -0.002546 0.001484 -0.002939 0.001671 
+0.001070 -0.007450 -0.000980 -0.003210 0.014103 -0.004766 
+-1.891156 4.047619 -1.136054 -2.278049 4.824390 -1.478049 
+-1.889868 4.546256 -1.533040 -0.767196 3.439153 -1.306878 
+0.000045 0.011266 0.001842 -0.000757 -0.004286 0.001761 
+0.002855 -0.002147 0.000742 -0.001507 0.003981 0.001515 
+-0.001417 0.001337 -0.002594 0.000317 0.001364 -0.003490 
+0.003544 -0.000526 -0.004365 0.003882 0.000725 -0.002389 
+-0.000370 0.000053 -0.001854 0.000725 -0.003587 0.000215 
+0.002016 -0.001753 0.000953 0.003134 0.000728 -0.000910 
+0.000694 0.004131 -0.003266 -0.001326 0.005179 -0.008779 
+-0.001113 0.000581 -0.010896 -0.003435 -0.001034 -0.003786 
+-0.001371 0.000274 0.000152 -0.001872 -0.001970 0.000922 
+-0.000807 -0.001902 -0.000037 0.002144 -0.000773 -0.000238 
+0.000367 -0.001074 -0.000101 -0.000279 -0.000852 -0.000885 
+0.000147 0.000169 -0.001154 0.001620 0.002175 0.000267 
+-0.000399 0.001048 -0.002520 0.000496 -0.003957 -0.002457 
+0.002134 -0.005365 -0.000020 -0.004633 -0.006134 0.002648 
+-0.003478 -0.005063 0.003794 -0.002785 -0.003042 -0.000322 
+0.000157 -0.001322 -0.002347 0.000130 -0.000898 -0.001512 
+0.000634 0.000910 -0.001728 0.000514 -0.001417 -0.000287 
+-0.001469 -0.002352 -0.000777 -0.001441 -0.000449 0.002504 
+0.001300 0.004817 0.002615 0.000621 0.007903 0.001606 
+0.000643 0.002863 0.000168 0.000778 -0.002417 0.001555 
+0.000314 -0.001867 0.002596 -0.002026 0.003265 0.001708 
+-0.001301 0.001355 0.000687 -0.000711 -0.001402 -0.002743 
+-0.002469 -0.002259 -0.000997 0.001291 -0.000777 -0.002845 
+0.004834 -0.001068 -0.003215 0.002146 -0.000898 -0.000207 
+-0.001053 0.000241 -0.000797 -0.000176 0.001171 -0.001054 
+0.003760 0.002209 -0.005194 0.004345 0.002816 -0.007376 
+0.002525 0.004348 -0.003787 0.000780 0.003037 -0.001833 
+0.000645 0.002097 -0.000806 0.000504 -0.000064 -0.000814 
+0.000906 -0.000212 0.000579 0.001976 -0.001249 0.000830 
+0.001932 -0.002908 0.000234 0.001877 -0.001619 0.001456 
+0.001661 -0.000333 0.001824 0.002106 0.000758 0.001246 
+0.001481 -0.002318 -0.001856 0.002616 -0.003596 -0.000242 
+0.002000 -0.006000 0.000004 0.006339 -0.004138 -0.001773 
+0.003410 0.001155 -0.007240 0.001404 0.001712 -0.003278 
+-0.001459 -0.001036 -0.000965 0.002713 -0.006376 0.000512 
+-0.000673 0.000139 -0.000393 -0.008903 0.032909 -0.005643 
+-1.935673 5.058479 -1.000000 -2.268085 5.263830 -1.000000 
+-2.033473 4.690377 -0.866109 -1.109890 3.263736 -0.626374 
+-0.000344 0.007059 -0.000236 -0.001293 -0.002660 -0.003496 
+-0.001044 -0.000198 -0.001703 -0.001228 0.005517 -0.000622 
+-0.001016 0.004571 -0.000915 -0.001094 -0.000896 0.001532 
+-0.003636 -0.005142 0.001236 -0.001318 -0.006122 -0.001373 
+0.001990 -0.007201 -0.000253 0.001904 -0.004651 -0.001666 
+0.001951 -0.000495 -0.001194 0.001394 0.000801 0.000511 
+-0.000108 0.000825 0.000056 -0.000437 0.001591 -0.001159 
+-0.001003 0.001448 -0.001527 -0.002391 -0.001719 -0.001913 
+0.001313 -0.002610 -0.000099 0.001851 -0.004946 0.001158 
+0.002053 -0.004238 -0.000314 -0.000321 -0.001860 -0.000182 
+-0.003441 0.001028 -0.004513 -0.002384 0.001841 -0.003871 
+-0.000560 0.000842 -0.002507 0.000454 -0.001916 0.000277 
+-0.003789 -0.004980 0.000198 -0.003259 -0.003237 -0.000558 
+-0.000036 0.000234 -0.000325 0.000562 0.000642 -0.000553 
+-0.002941 0.000141 -0.000188 0.000149 -0.001901 -0.000298 
+0.001845 -0.000459 -0.003574 0.006792 0.004194 -0.003237 
+0.006335 0.000135 -0.005930 0.000704 -0.002548 -0.001959 
+-0.002353 -0.008979 0.001486 -0.001312 -0.008434 0.002851 
+0.001073 0.000189 0.000999 -0.000903 0.000226 -0.003535 
+-0.003473 0.003730 -0.001195 -0.002713 -0.003616 -0.001118 
+-0.002289 -0.007410 0.001673 -0.002000 -0.004578 0.003052 
+-0.001446 -0.001195 0.002036 0.000734 -0.000696 0.001238 
+0.002075 -0.001614 0.002029 0.004093 0.000000 -0.001364 
+0.001797 -0.001052 -0.004210 -0.000121 -0.002162 -0.002102 
+-0.001066 -0.000132 -0.001736 0.001470 0.000237 0.000446 
+0.001508 0.001147 -0.000141 -0.000789 0.000038 0.000451 
+-0.002298 0.001133 -0.000409 -0.000214 0.000934 -0.001225 
+0.001892 -0.001024 -0.001051 -0.001222 -0.005484 -0.002159 
+-0.005316 -0.004244 -0.003579 -0.008441 -0.003118 0.002204 
+0.002001 -0.006779 0.005197 0.004688 -0.001223 0.003512 
+0.004411 0.000662 0.002218 0.003689 0.002421 -0.000884 
+-0.000806 0.001408 -0.001372 0.002684 -0.003269 0.001806 
+0.007626 -0.005178 0.000546 0.001710 -0.005426 0.006774 
+-0.002443 -0.000914 0.005085 -0.005956 0.001049 0.003591 
+-0.004081 0.002678 -0.000038 -0.000273 -0.003230 -0.002669 
+-0.002296 0.000310 0.004973 -0.016139 0.034899 -0.006054 
+-1.984772 5.675127 -1.005076 -2.074074 5.893004 -1.000000 
+-1.803571 4.897321 -0.790179 -0.011099 0.025980 -0.002304 
+-0.000576 0.000551 -0.000683 -0.003175 -0.004642 -0.002770 
+-0.000833 -0.002574 -0.000346 0.000224 0.000004 -0.000153 
+0.002641 -0.001115 -0.001186 0.002696 -0.002087 -0.000525 
+0.000045 -0.001310 0.001546 0.000377 -0.000629 0.002903 
+-0.004878 -0.004228 0.000650 -0.001034 -0.006203 0.000635 
+-0.000973 -0.004466 0.000573 -0.003192 -0.003308 0.003192 
+-0.005356 -0.003777 0.001992 -0.002832 -0.001817 0.000197 
+-0.000113 0.001320 -0.002375 -0.000997 0.002244 -0.003361 
+0.000231 0.002355 -0.003995 0.003139 0.002474 -0.002212 
+0.002687 -0.001257 -0.002927 0.000980 -0.001345 -0.003820 
+0.000632 -0.000676 -0.001265 0.001266 -0.000781 0.001338 
+0.001036 -0.000295 0.002523 -0.000042 -0.003466 0.001670 
+0.000681 -0.002311 0.000138 0.001257 -0.002259 -0.000334 
+0.002595 -0.002278 -0.001013 0.001335 -0.000871 0.000478 
+-0.001979 -0.000774 -0.000539 -0.001326 -0.001588 -0.001573 
+0.000000 0.000320 -0.002320 0.004427 0.001893 -0.002533 
+-0.002505 0.004248 -0.002853 -0.002056 -0.003042 -0.000082 
+-0.006524 -0.004893 -0.001705 -0.002984 -0.008006 0.004184 
+-0.001232 -0.000502 0.000112 0.001714 0.005265 -0.005338 
+0.007557 0.000498 0.000459 0.010963 0.005860 0.003279 
+0.004930 -0.000659 0.003654 0.001672 -0.001668 -0.001437 
+-0.004953 -0.002277 0.001901 -0.001353 -0.004511 -0.001353 
+0.001786 -0.004738 0.002095 -0.002520 -0.004228 0.000000 
+-0.001138 -0.000847 0.001561 0.000046 -0.000092 -0.000534 
+-0.000712 -0.002813 0.000566 -0.002266 -0.003338 0.001312 
+-0.002584 0.000970 -0.002099 -0.002712 0.004626 0.000390 
+-0.000909 0.003510 0.000867 0.002429 -0.001313 0.000739 
+0.001876 0.000234 0.002823 -0.002351 -0.006700 -0.002115 
+0.002692 -0.006493 0.000541 0.001324 -0.002225 0.001866 
+0.000633 -0.001008 0.002531 0.000435 -0.000957 0.000087 
+-0.001764 -0.002023 0.001377 0.001729 -0.000743 -0.000052 
+-0.001269 -0.001632 -0.000794 -0.000163 0.000126 -0.002775 
+0.006637 -0.000357 -0.002355 0.005444 -0.004888 0.000337 
+0.000558 -0.000258 0.002444 -0.000077 0.001582 -0.001057 
+-0.000767 -0.005539 -0.002796 0.000899 -0.015688 -0.001798 
+-0.003591 0.003804 -0.003120 -1.316129 3.890323 -0.193548 
+-1.986726 5.234513 -0.243363 -2.003968 5.297619 -0.321429 
+-1.490476 4.214286 -0.280952 -0.007509 0.015950 0.000861 
+0.000733 -0.004107 -0.002798 -0.001492 -0.000873 -0.000746 
+-0.003922 0.003518 -0.003154 0.001788 0.006970 0.000894 
+0.001927 -0.001063 -0.002359 0.004308 -0.004131 -0.001763 
+0.002597 -0.003410 -0.001602 0.000486 -0.000194 -0.000486 
+-0.001898 -0.004545 0.004224 -0.003797 -0.005246 0.005109 
+-0.003258 -0.001136 0.003636 -0.002251 0.003068 -0.000920 
+0.000063 0.003807 -0.003823 0.000696 0.001393 -0.003852 
+0.000000 -0.003664 -0.003511 -0.000460 -0.005265 -0.002811 
+-0.001279 -0.003223 -0.001427 0.001667 0.001171 -0.001532 
+0.000407 0.001598 -0.004297 0.001616 -0.000948 -0.003078 
+0.002556 -0.001232 -0.001830 -0.000168 -0.001943 -0.001487 
+0.001128 -0.001880 -0.000075 0.000864 -0.002582 -0.001117 
+0.003350 -0.000053 0.001383 0.005160 0.004048 0.001147 
+0.004456 0.002063 -0.001337 -0.000810 -0.002213 -0.000263 
+-0.001113 -0.003790 -0.001512 0.000334 -0.003638 -0.003370 
+0.003714 0.004229 -0.004057 -0.001690 -0.000019 -0.000695 
+-0.001102 0.003846 0.001479 -0.000556 0.000285 -0.000065 
+-0.000452 -0.001067 0.001700 0.000530 -0.006513 -0.001544 
+-0.000233 0.005683 -0.001394 0.000574 0.015255 -0.006205 
+0.002945 0.011696 -0.007411 0.002403 0.003361 0.001064 
+0.002109 -0.005373 0.000358 0.000935 -0.005185 0.000799 
+-0.000534 -0.002519 -0.000534 -0.002001 -0.004390 -0.000774 
+-0.004012 -0.002103 -0.003326 -0.000780 0.000488 0.001783 
+-0.001759 -0.000200 0.001180 0.000000 -0.001298 -0.001374 
+0.001882 -0.003467 0.000529 0.001401 -0.003530 0.002532 
+0.000061 0.001131 0.000824 -0.000042 0.001675 0.001225 
+-0.000400 0.001220 -0.000740 0.000379 -0.004164 0.003984 
+-0.002035 -0.010495 0.003212 -0.005943 -0.008102 0.003891 
+-0.003398 -0.002664 -0.000598 0.001623 -0.001211 0.000434 
+0.000587 0.000909 0.001760 0.002443 0.002959 0.001446 
+0.003519 0.002568 0.000634 0.000038 -0.000714 0.000464 
+0.003359 -0.000517 -0.001293 0.001473 -0.000015 -0.000136 
+0.000845 -0.000199 0.002436 0.003102 -0.004867 0.001176 
+0.002729 0.000217 -0.000547 -0.000802 -0.000531 -0.000705 
+0.000293 -0.008826 -0.004856 -0.001708 -0.015099 -0.003538 
+-0.003011 0.013163 0.001831 -1.316384 4.655367 0.305085 
+-1.639485 5.965665 -0.154506 -1.596567 5.952790 -0.433476 
+-1.289773 4.352273 -0.488636 -0.006380 0.006663 -0.001735 
+-0.001248 -0.008435 -0.006393 0.000208 -0.003622 0.000338 
+0.002186 0.003706 -0.000854 -0.001912 0.000174 -0.000075 
+-0.000682 -0.001086 0.001551 0.001203 -0.003451 0.000575 
+0.001484 0.000463 -0.000789 0.000325 0.000224 -0.000043 
+-0.002013 -0.001429 0.001710 0.000242 -0.003631 0.001332 
+0.000518 -0.003099 -0.001329 0.001416 -0.001939 -0.000677 
+-0.000227 -0.002293 -0.000985 0.001379 -0.001859 -0.001769 
+0.002761 -0.002435 -0.001615 0.000535 -0.001305 -0.003249 
+0.000259 0.006379 0.000259 0.002643 0.006038 -0.006984 
+0.001704 0.002538 -0.003937 0.000623 -0.001465 -0.002675 
+0.000467 -0.000661 -0.002540 0.002967 -0.001815 0.000105 
+0.002166 -0.000621 0.002835 0.001871 -0.000538 0.001403 
+-0.002785 -0.001722 0.000595 -0.005213 -0.000021 0.000774 
+-0.005446 -0.000757 0.001530 -0.003670 -0.003340 0.000813 
+0.000481 -0.002901 0.002438 -0.000244 -0.002454 0.003091 
+-0.000897 -0.002215 0.002479 -0.003286 0.000863 0.002942 
+-0.003061 -0.001934 0.002414 -0.001657 -0.006622 0.002033 
+0.000760 -0.004939 0.003945 0.002420 -0.005750 -0.001583 
+-0.000605 0.009753 -0.003959 -0.001191 0.014142 -0.008869 
+0.002801 0.010407 -0.006739 0.003216 0.001987 -0.002457 
+0.005087 -0.008815 0.002659 0.000228 -0.005023 0.001895 
+-0.001961 0.000712 -0.002051 -0.002075 -0.000736 -0.000373 
+-0.001969 -0.000097 0.000778 -0.000687 0.001292 0.001938 
+-0.000758 -0.000212 -0.000106 0.001185 -0.002108 0.001316 
+-0.001352 -0.004055 0.001953 -0.003000 -0.003000 0.002240 
+-0.002453 0.000853 0.001653 0.000570 0.000403 0.001443 
+0.000306 -0.000082 0.000135 -0.002063 -0.000029 0.001074 
+-0.003840 0.000832 0.001664 -0.002870 -0.000158 0.001610 
+-0.001750 -0.000936 0.000368 -0.001773 -0.002080 0.000219 
+-0.003677 -0.001501 -0.000713 -0.005985 -0.001104 0.002849 
+-0.005221 -0.000303 0.000573 -0.002487 -0.007096 0.003409 
+0.000153 0.001450 0.001450 0.000416 -0.000580 -0.000343 
+0.001149 -0.002623 -0.002866 0.000747 -0.001450 0.000889 
+0.000266 0.003572 -0.000768 -0.001806 0.004305 -0.001168 
+0.000313 -0.007644 -0.001737 0.001742 -0.012312 -0.002978 
+-0.003774 0.016955 0.002159 -1.548387 4.790323 0.526882 
+-1.642241 6.012931 0.323276 -1.413146 5.821596 0.215962 
+-0.013449 0.035378 0.006194 -0.002143 0.001060 -0.000947 
+-0.004464 -0.007023 -0.005178 -0.002561 0.003860 -0.004846 
+-0.003703 0.001336 -0.002959 -0.002034 0.000846 -0.002007 
+-0.001253 -0.001049 0.000496 -0.001859 -0.003610 0.002058 
+-0.002724 -0.001417 0.001196 -0.001692 -0.003086 -0.000386 
+-0.002437 -0.003524 0.003220 -0.003034 -0.002356 0.003324 
+-0.002032 -0.000263 0.000626 -0.000339 -0.001108 -0.000473 
+-0.001288 -0.002150 -0.003117 -0.000440 -0.002776 -0.003193 
+-0.001581 -0.004702 -0.002955 -0.003260 -0.001309 0.000657 
+-0.000891 -0.001655 -0.004533 -0.001775 -0.001077 -0.002530 
+-0.000711 -0.000204 -0.000999 0.003036 -0.000168 -0.001602 
+0.005416 -0.001623 -0.001189 0.006250 -0.000562 -0.003370 
+0.005456 0.000570 -0.004477 0.004002 0.000430 -0.001614 
+0.001834 0.000977 -0.000482 0.000468 -0.000240 0.000003 
+-0.001868 -0.001607 0.000538 -0.000604 -0.003029 -0.001506 
+0.000196 -0.002598 -0.002553 0.000860 -0.002579 -0.005455 
+0.003367 -0.000543 -0.006825 0.003908 0.002782 -0.003724 
+-0.000565 0.002574 -0.000503 0.000333 -0.005242 0.002889 
+-0.002969 -0.009875 -0.004933 0.003483 -0.008468 -0.001618 
+0.001814 0.009269 -0.006215 0.000089 0.015903 -0.011775 
+0.003169 0.013552 -0.009161 0.000906 0.002379 -0.001368 
+-0.002122 -0.011238 -0.000379 -0.000216 -0.009482 -0.004509 
+0.000555 -0.001501 -0.002246 0.001286 -0.000180 -0.000457 
+0.002685 0.000723 -0.000697 0.000576 0.000247 -0.000833 
+-0.003436 -0.003128 0.001128 -0.006962 -0.001577 -0.000462 
+-0.006032 -0.002705 0.003436 -0.000606 -0.002424 -0.000758 
+0.001224 0.001177 0.001383 0.001709 0.003900 0.001002 
+-0.000674 0.004331 -0.000371 -0.000333 -0.000117 0.000233 
+-0.001021 -0.002619 0.003952 -0.000845 -0.005687 0.006223 
+-0.004153 -0.004275 0.002076 -0.000115 0.002692 -0.000115 
+0.001133 0.007890 -0.001283 -0.000455 0.003642 -0.002185 
+0.000645 -0.003550 0.001597 0.001040 -0.004790 0.006774 
+-0.013157 -0.007278 0.025586 -0.007842 -0.007523 0.013361 
+0.004843 -0.001497 -0.000314 0.006152 -0.002710 -0.007226 
+0.000285 0.000285 0.002100 0.003673 0.003610 0.003633 
+0.012674 0.017341 -0.010064 0.013739 0.022282 -0.022703 
+0.020540 0.011875 0.008818 -0.043008 0.025720 0.071256 
+0.016087 -0.010046 0.015052 0.061395 -0.053342 -0.041263 
+-0.014656 -0.011345 -0.021651 -0.032001 -0.004113 -0.008097 
+-0.054326 -0.032837 0.005054 -0.067829 -0.053248 0.027780 
+-0.050577 -0.041000 0.010115 -0.035776 -0.012894 -0.015540 
+0.009688 -0.004934 0.045257 -0.013105 -0.017276 0.003581 
+-0.024542 -0.018783 -0.008505 0.000990 -0.026908 0.005955 
+0.003582 -0.014471 0.002635 0.006019 -0.003097 0.000426 
+0.005142 0.003519 0.000488 0.003592 0.002676 0.000537 
+0.005099 0.003588 0.000537 0.007998 -0.005492 -0.002472 
+0.005756 -0.004037 -0.001602 0.001021 0.006777 0.000233 
+0.000771 0.010616 -0.000497 0.004210 0.007826 0.000019 
+-0.007686 0.001982 -0.000735 -0.019206 0.002975 0.001238 
+-0.007259 0.009873 0.000910 0.001914 0.009727 -0.000813 
+-0.000793 -0.001005 0.000051 -0.013420 -0.018362 -0.000749 
+-0.008203 -0.029259 -0.005244 -0.023299 -0.010387 0.038551 
+-0.038314 0.014186 -0.014477 0.014101 -0.006533 -0.024989 
+0.004979 0.011138 0.001376 0.005148 0.007447 0.000795 
+0.003289 0.000237 0.004711 0.018063 0.010875 0.000481 
+-0.034224 -0.000248 0.020932 -0.013514 0.008901 0.009203 
+0.004038 0.003434 0.004387 0.002606 0.007931 0.004959 
+-0.014882 -0.001551 -0.000423 -0.010769 -0.010603 -0.003846 
+0.000986 0.000456 -0.000005 0.003056 0.008694 -0.001640 
+0.019841 0.003016 -0.028254 -0.003713 0.008297 -0.011553 
+-0.005115 0.006772 -0.002230 -0.001325 0.003136 0.000255 
+-0.004164 0.000267 0.000281 -0.005432 0.002046 0.000860 
+-0.004104 0.004696 -0.005244 0.005059 -0.004887 -0.001420 
+0.043822 0.005576 -0.021025 0.011799 -0.002884 0.008862 
+0.003023 -0.005579 0.003367 -0.000538 -0.006642 -0.003065 
+-0.006554 -0.000702 -0.008669 -0.015336 0.001967 0.001022 
+-0.011446 0.012182 -0.010033 -0.014509 0.010340 -0.010720 
+-0.009467 0.002038 -0.008832 0.003067 0.002706 -0.001966 
+0.008474 0.003691 0.005258 0.008058 0.001366 0.009865 
+0.002485 -0.001706 0.009896 0.009840 0.009709 0.001769 
+-0.004514 0.002374 0.005865 -0.002196 -0.000240 0.002503 
+-0.000038 -0.000151 0.000323 -0.000091 -0.005104 -0.001139 
+-0.000527 0.000439 -0.004129 0.000517 0.002742 -0.007983 
+0.001676 0.004604 -0.007654 0.002495 0.006172 -0.005659 
+0.016643 0.013067 -0.006443 0.025395 -0.008405 0.012485 
+0.004802 -0.038668 0.023887 0.006580 -0.007429 0.003856 
+0.000026 -0.004341 0.000771 -0.048954 -0.044880 0.026810 
+-0.012994 -0.017935 0.078877 -0.057559 -0.021519 0.046382 
+0.025049 -0.019510 -0.004216 0.008320 -0.008766 0.000077 
+-0.008171 0.010413 0.003978 -0.030852 0.008000 0.038111 
+-0.070886 0.046906 0.029624 0.001772 -0.011380 -0.001117 
+0.002182 0.000158 -0.000633 0.001263 0.004066 -0.000660 
+-0.002029 0.001143 -0.001013 -0.019858 -0.011868 -0.000658 
+-0.032693 -0.007248 0.000035 -0.007497 -0.012540 -0.001701 
+-0.010711 -0.011674 -0.001811 -0.009093 -0.008918 -0.003041 
+-0.002692 -0.004754 -0.002026 -0.002030 -0.000567 -0.000445 
+-0.012404 -0.002008 -0.003281 -0.028843 0.000371 -0.003313 
+-0.002374 -0.006735 -0.002509 0.002586 -0.009786 -0.005357 
+-0.002844 -0.008619 -0.005251 -0.016267 -0.014533 -0.007067 
+-0.025117 -0.015289 -0.012441 -0.004396 -0.011732 -0.011481 
+-0.033338 0.077497 0.007931 -0.109140 -0.069219 -0.003084 
+-0.038177 -0.055210 0.050806 0.008125 0.012078 -0.001592 
+0.000481 0.030781 -0.017565 -0.004227 0.005194 -0.027177 
+-0.008751 -0.004320 -0.013458 -0.004391 -0.006086 -0.008362 
+0.000048 -0.005527 -0.004118 0.002085 -0.002837 -0.001621 
+0.002931 -0.000174 -0.000624 -0.002468 -0.006353 -0.000523 
+-0.004723 -0.009401 0.001844 -0.003292 0.003897 0.005401 
+0.010415 -0.008004 -0.005497 0.000127 -0.003793 -0.001305 
+-0.000521 0.002826 -0.000353 -0.004400 -0.002523 0.000110 
+-0.001648 -0.004202 0.001962 0.004676 -0.002671 -0.001505 
+0.001887 -0.001264 -0.000289 0.015090 -0.000257 0.011973 
+0.001368 0.018310 -0.018046 0.003691 -0.000587 0.008679 
+0.000034 -0.005241 0.000539 -0.005990 -0.003784 -0.004610 
+-0.008022 -0.000863 -0.001664 -0.000541 0.001466 -0.004405 
+-0.002907 -0.002946 -0.003516 -0.001908 -0.000293 -0.000299 
+-0.004096 0.001868 0.000199 -0.006794 0.001162 0.003030 
+-0.001677 0.002032 -0.000177 0.002495 0.000027 0.000347 
+0.005942 -0.000614 -0.001123 0.003439 -0.002032 -0.000300 
+0.001949 -0.002809 -0.002203 0.000597 -0.003903 -0.002881 
+0.000726 -0.003000 -0.004029 0.000977 -0.001557 -0.006350 
+-0.000277 0.000371 -0.005639 -0.000443 -0.000457 -0.000137 
+-0.001782 -0.004399 0.003980 -0.003274 -0.003825 0.002326 
+-0.000374 0.001111 -0.001073 0.002286 0.004033 -0.002300 
+-0.000311 -0.002908 0.002058 0.005234 -0.003209 0.004483 
+0.013563 0.009440 0.003490 -0.002626 0.004876 0.018193 
+0.007857 0.002624 0.026238 0.010642 0.001925 0.011123 
+-0.004530 0.001368 -0.004786 -0.001874 -0.003074 -0.012370 
+0.002963 -0.012022 0.014426 0.000494 -0.000483 0.002769 
+0.011694 0.024917 -0.014013 0.000975 -0.015311 -0.007265 
+-0.000382 0.002281 -0.008225 0.000920 0.002185 -0.005499 
+-0.000472 0.001527 -0.002659 -0.002000 0.001855 -0.003732 
+-0.002529 0.003822 -0.006104 -0.002087 0.002465 -0.002800 
+-0.004023 -0.004263 0.001044 -0.012416 -0.016170 0.003446 
+-0.023255 -0.023218 0.005612 -0.037751 -0.012383 0.004724 
+-0.050989 -0.027804 0.009315 -0.064969 0.023323 -0.015353 
+0.006308 0.046438 -0.022050 0.020541 0.021753 -0.002391 
+0.063734 0.083766 0.006071 0.013927 0.028521 0.003008 
+0.012505 0.028480 -0.004802 -0.016554 0.015625 -0.008637 
+-0.096202 0.035947 -0.019001 -0.082730 0.005455 0.011405 
+-0.053367 -0.004185 0.013190 0.014861 -0.008304 -0.007989 
+0.013693 -0.011298 0.000710 0.003929 -0.000582 0.002751 
+-0.001740 -0.000401 -0.001255 -0.002396 -0.003926 -0.003156 
+-0.001785 -0.004844 -0.002173 -0.003002 -0.002671 0.000057 
+-0.002811 0.002039 0.001316 -0.005925 0.001091 0.002091 
+-0.015710 -0.015287 0.014948 0.002989 -0.001928 0.013209 
+0.002115 -0.011647 -0.001857 -0.007591 -0.022353 -0.004574 
+-0.007891 -0.013518 0.003264 -0.011773 -0.007988 0.006339 
+-0.008028 -0.006370 0.010327 0.006711 -0.007227 -0.000580 
+-0.007692 0.000615 -0.000308 0.003779 0.001890 -0.002519 
+-0.000657 0.001642 0.004286 -0.002386 0.013561 -0.001464 
+-0.000167 0.020446 -0.004856 0.001977 0.014045 -0.005733 
+-0.000446 0.004372 -0.003857 0.001124 -0.004064 -0.000259 
+0.001222 -0.002928 0.002713 0.004059 -0.001589 0.001643 
+0.002243 -0.001376 0.001795 -0.004734 -0.000273 0.003952 
+-0.010284 -0.002092 0.003520 -0.006104 -0.002874 -0.001479 
+0.003953 0.002937 -0.004901 0.004754 -0.000700 -0.007410 
+-0.002880 -0.001840 -0.000928 -0.000521 0.000141 -0.000323 
+0.000536 -0.006116 -0.005029 0.000871 -0.000262 -0.005252 
+-0.000094 0.001339 0.000283 -0.000043 -0.002394 0.004380 
+-0.001802 -0.003845 0.002427 -0.001880 -0.002035 0.000593 
+0.000879 -0.000194 0.000327 0.001881 -0.000172 0.001073 
+0.001695 -0.003147 0.004291 0.003897 -0.008497 0.009846 
+0.009032 0.005770 0.004015 -0.007780 0.023714 0.001183 
+0.003419 -0.034709 -0.004616 0.002005 -0.011223 0.019773 
+-0.018039 0.024803 -0.022857 -0.007066 0.005987 0.013810 
+-0.001214 -0.001122 0.001461 0.001729 0.010617 -0.006929 
+0.003102 0.012380 -0.006189 -0.000552 -0.020936 0.005712 
+0.001181 -0.002550 0.000698 0.000047 0.000189 -0.000857 
+-0.002176 0.000888 -0.001360 -0.001723 -0.000672 -0.002067 
+-0.001345 -0.000901 -0.001642 -0.000568 0.001065 -0.004942 
+0.002022 0.001221 -0.003808 -0.001806 -0.002835 0.007685 
+-0.005117 -0.004958 0.011060 -0.004353 -0.001165 0.001759 
+-0.002728 0.001177 -0.002028 -0.000748 0.001889 -0.002604 
+-0.002937 -0.001689 0.000992 -0.010053 -0.004366 -0.000143 
+-0.011230 0.008008 -0.016363 0.010622 0.016646 -0.015583 
+-0.002197 -0.011172 0.011328 -0.010203 -0.016841 0.015735 
+-0.023354 -0.008093 0.010991 0.025173 0.012809 -0.046802 
+-0.002617 -0.003979 -0.046870 0.002107 -0.003265 -0.002900 
+0.001003 -0.000641 -0.000311 -0.004677 0.001812 -0.000341 
+-0.002738 -0.001175 -0.002152 -0.003795 -0.003237 -0.001439 
+-0.002295 -0.003570 -0.000228 -0.002668 -0.005214 0.000435 
+-0.004567 -0.004613 0.002983 -0.001637 0.010790 -0.000446 
+-0.006425 0.023413 -0.005852 0.007567 0.045774 -0.059226 
+-0.017469 -0.023361 0.001163 -0.030902 -0.036546 0.008900 
+-0.017221 -0.001373 0.003604 -0.001615 -0.002022 0.001834 
+-0.012294 -0.023432 0.039795 -0.017374 -0.028838 0.023283 
+-0.022570 -0.012055 0.009034 0.002963 0.002988 -0.023756 
+0.018874 0.030198 0.007714 0.007971 0.015665 0.007544 
+0.000950 0.009447 0.003044 -0.003196 0.005606 -0.004885 
+0.000805 0.000229 -0.004094 -0.002192 -0.004689 0.004818 
+-0.003802 -0.005641 0.004688 -0.000866 -0.002084 0.001713 
+-0.000606 0.000289 -0.000401 -0.004173 -0.001105 -0.000646 
+-0.005958 -0.003232 0.003321 -0.006911 -0.001061 0.003765 
+-0.003660 -0.002077 -0.000458 0.002047 -0.003903 0.000677 
+0.001049 0.001272 0.002677 0.000813 0.000031 -0.002726 
+0.003344 0.000836 -0.004526 -0.000035 -0.000037 0.000033 
+-0.000762 0.000981 0.005117 -0.001460 -0.001884 0.002730 
+0.000262 0.000487 0.000478 -0.000120 -0.001223 0.000320 
+0.002878 -0.003316 0.000802 0.002719 -0.002265 0.001922 
+0.002305 -0.000383 0.002476 0.000904 -0.000126 0.001055 
+-0.009676 -0.003199 -0.004875 -0.049779 -0.031005 -0.004641 
+-0.075326 -0.066894 0.032962 -0.001898 -0.012955 0.007233 
+0.004968 0.008496 -0.013935 0.003072 0.002239 -0.001992 
+-0.002940 0.006084 0.000233 -0.007882 0.001965 -0.001415 
+0.001362 0.009580 -0.003292 0.006083 0.019601 0.019091 
+0.000469 -0.006251 0.001763 0.000182 -0.002746 -0.000233 
+0.000821 -0.002299 -0.001081 0.000161 -0.002865 -0.000744 
+-0.000675 0.000400 -0.001303 0.001702 0.001064 -0.005576 
+0.002676 0.000089 -0.005505 0.002503 -0.000278 -0.000812 
+0.000205 0.000759 0.002184 -0.002908 -0.000949 0.002045 
+-0.002473 -0.000494 0.000390 -0.000229 0.000780 -0.001395 
+0.000413 0.001497 -0.001497 -0.000812 -0.000303 -0.000205 
+-0.004117 -0.003735 0.001281 -0.001491 0.000072 -0.000919 
+-0.003627 0.000885 0.001828 -0.002812 0.000984 -0.002621 
+0.002860 -0.002001 -0.006127 0.001256 -0.000444 -0.001969 
+0.002691 -0.001800 -0.005275 0.002048 -0.002841 -0.003194 
+0.000914 -0.001273 -0.002166 -0.003650 -0.000890 -0.000672 
+-0.007876 -0.002736 0.000929 -0.005452 -0.002211 -0.001485 
+-0.000227 0.002232 0.000188 0.004730 0.004496 -0.003247 
+0.000709 -0.002422 -0.000665 -0.000708 -0.005982 0.010431 
+-0.010012 0.009775 -0.021068 0.080611 0.074615 -0.099578 
+0.075731 0.008865 -0.005172 -0.022591 -0.051427 0.009905 
+-0.019978 -0.019860 -0.003144 -0.025748 -0.035014 0.028360 
+-0.008360 -0.044765 0.011377 0.006000 0.001026 -0.001795 
+0.011522 0.009875 -0.009052 0.000409 -0.009432 -0.003219 
+0.004213 0.000650 0.003431 0.001212 0.003030 0.007576 
+0.000357 -0.000318 0.005217 -0.000345 -0.000112 0.001471 
+-0.000949 0.000082 0.000733 -0.002146 -0.003202 0.002048 
+-0.001435 -0.004520 0.002347 0.000182 -0.001850 0.000846 
+-0.002192 0.000108 0.000162 -0.005156 -0.000748 -0.002010 
+-0.003241 -0.001825 -0.003083 -0.003986 -0.001085 0.000962 
+-0.004018 -0.000441 -0.000931 -0.002693 -0.000222 -0.002703 
+-0.000431 -0.000980 -0.000408 0.003250 0.001542 -0.004531 
+0.007460 0.001275 -0.003943 0.001608 0.003300 0.000029 
+0.002057 0.003537 -0.000938 0.001262 0.000252 -0.002595 
+-0.000752 0.000006 -0.002548 -0.000055 -0.000332 0.000055 
+0.003017 0.001874 -0.000713 0.003717 0.005138 -0.000494 
+0.005534 0.006059 0.000273 0.006363 0.003827 0.002004 
+0.002760 -0.000036 0.001905 -0.007298 -0.002114 -0.001945 
+-0.027466 0.005904 -0.004498 0.002605 -0.007940 -0.002052 
+-0.005415 -0.006155 0.000888 -0.013660 0.001616 0.002383 
+-0.014960 0.002548 0.003762 -0.007451 0.004316 -0.000738 
+-0.001833 0.008352 -0.003128 -0.007592 0.023114 0.018918 
+-0.000102 -0.006889 -0.000930 0.001077 -0.004971 -0.002057 
+-0.000046 -0.000269 -0.002646 -0.000026 -0.000699 -0.002069 
+-0.001597 0.002195 -0.002325 -0.000157 0.003295 -0.002858 
+0.000446 0.003340 -0.005886 0.002545 0.007446 -0.007952 
+0.002260 0.006232 -0.008137 -0.000367 -0.000076 -0.000198 
+0.002335 -0.005096 -0.000130 0.002161 -0.000526 0.000102 
+0.001522 0.001557 -0.000333 0.002574 0.002463 0.000136 
+0.001807 -0.000499 0.001487 -0.001152 -0.005330 0.004582 
+-0.003017 -0.002959 0.003647 -0.001134 0.000165 0.000891 
+0.000296 -0.000291 0.000006 0.000383 -0.000215 -0.001011 
+0.002642 0.000249 -0.000672 -0.000426 0.001527 0.000482 
+-0.001227 -0.001020 -0.000388 -0.001157 -0.000858 -0.001275 
+-0.003269 -0.001662 -0.000044 -0.004003 -0.004116 -0.002463 
+-0.003204 -0.000638 0.001387 -0.002337 0.002620 0.000776 
+0.000746 -0.002317 0.002155 0.010998 -0.015017 0.007930 
+-0.007694 0.003136 0.031765 -0.034432 -0.046287 -0.005112 
+-0.001377 -0.047974 -0.016657 0.013836 -0.023859 -0.003802 
+-0.001253 -0.011605 -0.001577 -0.000831 -0.010090 -0.005975 
+0.002166 -0.011011 -0.000909 0.181952 -0.139963 0.092500 
+0.019206 0.018355 0.039871 0.000222 0.000240 0.001320 
+-0.006751 0.001799 0.016941 -0.004514 -0.000093 0.007988 
+-0.003575 -0.000469 0.005831 -0.004010 -0.004429 0.009277 
+-0.001109 -0.004635 0.005459 0.001814 -0.002450 0.000774 
+0.001766 -0.001214 0.000611 -0.001896 -0.002191 0.003157 
+-0.002460 -0.003555 0.000318 -0.001770 -0.001034 -0.000646 
+-0.002476 -0.001256 -0.001493 -0.004536 -0.005116 -0.001675 
+-0.005102 -0.007040 -0.001873 -0.003414 -0.006110 -0.000599 
+-0.001653 -0.004558 0.002003 -0.001567 -0.002675 0.001133 
+0.001428 -0.000764 -0.000771 0.005240 0.003668 -0.000553 
+0.004158 0.003827 -0.005967 0.002365 -0.000238 -0.005278 
+0.001630 -0.000907 -0.002299 0.000422 -0.000396 -0.000317 
+-0.001603 0.000622 -0.006077 0.003554 0.006057 -0.006157 
+0.005672 0.006052 -0.002867 0.008162 0.006427 -0.001402 
+0.007181 0.006444 -0.002336 0.002343 0.007787 -0.006022 
+-0.008253 0.004711 -0.007569 -0.022041 -0.057516 0.010347 
+-0.009088 -0.000583 0.002148 0.002055 0.003400 -0.000441 
+-0.019036 0.009084 0.005039 -0.008101 0.012352 0.000163 
+-0.001143 0.009755 -0.002587 0.010403 0.010568 -0.028054 
+-0.000212 -0.004086 -0.002562 -0.000051 -0.000998 -0.004594 
+0.000907 -0.001642 -0.002870 0.003749 0.005137 -0.001267 
+-0.001683 0.007268 -0.002570 0.000042 0.000269 -0.001147 
+0.000247 0.002070 -0.004644 0.001448 0.004754 -0.009373 
+-0.000940 0.001367 -0.007049 0.001383 -0.004212 -0.000229 
+0.000606 -0.007048 0.000959 -0.001715 -0.006679 0.001877 
+-0.000546 -0.004073 0.002194 0.000331 -0.000326 0.000930 
+0.002859 0.003383 -0.001611 0.005050 0.004824 -0.004430 
+0.004749 0.003749 -0.003884 0.001382 -0.000465 -0.000145 
+0.000372 -0.001617 -0.000107 0.002564 0.002746 0.005569 
+-0.001416 -0.000263 0.003562 -0.002683 0.000675 -0.001972 
+-0.000156 0.000405 -0.000804 0.001006 -0.000401 0.001809 
+0.003490 -0.004117 0.000886 0.001085 -0.005255 -0.000884 
+-0.001992 -0.004743 0.004536 -0.004614 -0.001478 0.007362 
+-0.003568 0.004503 0.001562 0.007440 -0.020034 0.001445 
+-0.043463 -0.000466 -0.005372 -0.028604 -0.048760 -0.023099 
+-0.028826 -0.048095 -0.003494 0.047105 -0.045292 -0.049825 
+0.057778 -0.030069 -0.001181 0.033826 -0.031838 0.008180 
+-0.027587 -0.062233 0.000448 0.238507 -0.027198 -0.026243 
+0.001260 0.011637 -0.023720 -0.003240 0.004188 -0.005385 
+-0.005728 -0.002826 0.009625 -0.000816 -0.004689 0.009368 
+0.004849 -0.002623 -0.001213 0.003162 -0.001024 -0.000807 
+-0.002543 -0.001156 0.002656 -0.003323 -0.005597 -0.000062 
+0.000068 -0.004719 0.000709 -0.003596 -0.003566 0.001196 
+0.000416 -0.001938 0.000113 0.001477 0.000547 0.001810 
+-0.000104 -0.000047 -0.000479 -0.003105 -0.000238 -0.000815 
+-0.007486 -0.003174 -0.002102 -0.007372 -0.004451 -0.002921 
+-0.001384 -0.001634 0.004506 -0.002189 0.000128 0.004571 
+-0.001176 -0.000679 0.001737 0.004434 -0.002095 -0.003694 
+0.003482 -0.000601 -0.010830 0.004385 0.001547 -0.005781 
+0.002238 0.004358 -0.000283 -0.000371 0.002269 0.000221 
+-0.001213 0.000633 -0.001392 -0.000812 0.000187 0.000211 
+0.001324 0.000313 -0.000249 0.003354 0.001956 -0.000807 
+0.002925 0.002178 -0.000061 -0.000532 -0.002527 0.001308 
+-0.008227 -0.011825 0.001457 -0.024150 -0.023338 0.000153 
+-0.011395 -0.007844 0.002047 0.008601 0.012290 -0.005645 
+-0.019512 0.011115 0.000159 -0.013589 0.002840 0.000446 
+0.000655 0.000911 0.000080 0.016463 0.019651 -0.017100 
+0.000047 0.000646 -0.001503 -0.000984 0.002387 -0.004251 
+0.002980 0.003090 -0.000158 0.003648 0.003943 -0.004217 
+0.000403 0.002512 -0.003504 0.000515 -0.000229 -0.002429 
+0.001327 0.001733 -0.003656 0.000669 0.003014 -0.003489 
+-0.000774 0.001962 -0.000241 0.000369 -0.000510 0.001670 
+-0.001205 -0.003997 0.001711 -0.003969 -0.007725 0.003643 
+-0.005777 -0.008635 0.006719 -0.003450 -0.001791 -0.002093 
+0.000973 0.002080 -0.000427 0.006071 0.009814 -0.005685 
+0.009264 0.011127 -0.006455 0.002356 0.007180 0.008089 
+-0.000990 -0.002156 0.017234 -0.004943 -0.008037 0.016484 
+-0.003495 -0.006239 0.004416 -0.000602 -0.002050 -0.000355 
+-0.001439 0.001771 -0.003004 0.000735 0.003023 -0.001068 
+0.003793 0.002781 -0.001323 0.003157 0.000734 -0.003718 
+0.001259 -0.001643 -0.002031 0.000132 -0.012726 0.023770 
+-0.009286 0.012269 0.010742 0.004916 -0.019901 0.002675 
+0.019284 -0.010534 -0.003548 0.019652 0.005691 -0.012073 
+0.034807 0.033407 -0.076570 0.019336 0.079009 -0.025636 
+-0.009593 0.002757 0.003437 -0.028796 -0.022617 0.023586 
+-0.043502 -0.023991 0.013919 -0.036155 0.007225 0.007239 
+-0.011899 0.008328 0.003324 -0.002102 0.003340 -0.002403 
+0.000882 0.001890 -0.002803 0.001934 0.000132 -0.000844 
+0.004537 -0.000630 -0.006835 0.006791 0.004016 -0.004674 
+-0.001123 0.004525 -0.001251 -0.005760 -0.002024 0.001523 
+-0.004993 -0.004328 0.004361 -0.004047 -0.002064 0.000317 
+-0.002017 0.000234 -0.002158 -0.000678 -0.002195 -0.001733 
+-0.004629 -0.006379 -0.004551 -0.011725 -0.007866 -0.003658 
+-0.011239 -0.005866 -0.000539 -0.004697 -0.004911 0.000062 
+-0.000659 0.002378 0.002004 0.002942 0.007178 -0.004991 
+0.002358 0.001439 -0.008134 -0.003482 -0.007146 -0.009276 
+0.001821 -0.010993 -0.003264 0.009107 -0.001301 -0.011583 
+0.002068 -0.002099 -0.009034 -0.000554 -0.007042 -0.002302 
+0.000487 -0.008330 0.003175 0.001257 -0.005603 0.004819 
+0.000061 -0.002040 0.002381 -0.000451 0.001245 -0.001389 
+-0.001558 0.002921 -0.003474 -0.001687 0.000181 -0.001824 
+-0.002401 -0.005668 0.000831 -0.007273 -0.008457 0.001242 
+-0.011791 0.000075 0.000296 -0.006798 0.005991 -0.000496 
+-0.008202 -0.000359 0.001645 -0.005714 -0.006442 0.001850 
+-0.002685 -0.005833 -0.000549 -0.009579 -0.004117 0.004999 
+0.000563 -0.003068 0.000039 -0.000120 -0.001496 -0.000524 
+-0.002915 -0.002220 0.000438 -0.000485 -0.003063 0.000747 
+0.001264 -0.001082 -0.002067 0.003096 0.002510 -0.000251 
+0.000986 0.003594 -0.001217 -0.002233 -0.000460 0.002318 
+-0.001332 -0.000033 0.002939 0.001361 -0.000338 0.000916 
+0.001859 -0.001739 0.002679 -0.001320 -0.006190 0.005982 
+-0.002838 -0.003145 -0.005002 -0.004269 -0.007600 -0.005550 
+-0.001024 -0.003387 -0.003645 0.002443 -0.000535 -0.003131 
+-0.001488 0.002595 -0.003607 -0.003315 0.005308 0.000234 
+-0.006192 0.001048 0.002680 -0.004062 -0.000488 -0.000527 
+-0.001901 -0.001232 -0.002732 0.001760 -0.000226 -0.005632 
+0.000501 -0.001187 -0.003918 0.000922 0.006344 -0.002469 
+0.002325 0.007120 -0.005223 0.003098 0.003319 -0.008737 
+-0.000595 0.001891 -0.004889 -0.001615 -0.007220 0.009958 
+0.005830 -0.004998 0.024049 -0.021965 -0.018535 -0.034303 
+-0.005542 0.025808 -0.059781 0.008317 -0.015537 0.004551 
+0.040909 0.021545 -0.007387 -0.037432 0.037104 -0.001249 
+-0.027794 0.017129 0.002024 -0.010176 0.004041 -0.000788 
+-0.002955 -0.005901 0.008570 -0.004932 -0.004589 0.013687 
+-0.005465 0.000841 0.005523 -0.003004 0.003509 -0.001471 
+0.000655 0.002685 -0.003280 0.002737 -0.000959 -0.002920 
+0.003180 -0.002784 -0.003599 0.001785 -0.001435 -0.004479 
+0.000861 0.002316 0.000683 -0.003196 0.002857 0.001229 
+-0.005567 0.000440 0.004812 -0.002628 0.002190 0.001752 
+-0.001084 -0.002984 -0.003379 -0.001249 -0.006360 -0.002312 
+-0.001182 -0.008857 -0.002637 -0.010098 -0.004270 -0.002666 
+-0.013504 -0.004530 0.005232 -0.000996 -0.005204 -0.000615 
+0.005029 0.000678 0.001741 -0.000040 0.002176 -0.001965 
+0.001150 0.001055 -0.009033 0.001839 0.001126 -0.013538 
+0.002257 0.007887 -0.016318 0.002955 0.003929 -0.013421 
+0.001164 -0.002403 -0.005270 -0.000823 -0.004786 -0.001762 
+-0.001538 -0.002381 -0.003131 -0.000603 0.002364 -0.001999 
+0.002510 0.003267 -0.001448 0.003654 0.000711 -0.002109 
+0.000103 0.000043 -0.000921 -0.000682 0.000178 -0.001209 
+-0.002389 -0.001618 -0.000462 -0.004718 -0.006921 0.002173 
+-0.009096 -0.006469 0.002485 -0.008672 -0.002114 0.001270 
+-0.005431 -0.003566 0.001011 -0.004922 -0.002788 -0.000709 
+-0.004666 -0.000319 -0.001887 0.002334 -0.004496 0.002232 
+0.001593 -0.003631 0.000002 -0.000058 -0.002855 0.000868 
+-0.003087 -0.003106 0.002839 -0.000873 -0.002343 0.002121 
+0.001855 -0.000482 -0.001252 0.001631 0.000755 -0.000328 
+-0.000623 -0.000387 0.000503 -0.000670 -0.004053 0.003913 
+0.001463 -0.004443 0.003880 -0.001556 -0.003739 0.000881 
+-0.002431 -0.006723 -0.003282 -0.001281 -0.007801 -0.003872 
+-0.002487 -0.006204 -0.002697 0.000128 -0.002438 -0.004695 
+-0.001724 0.003618 -0.002873 0.002236 0.006201 -0.003581 
+0.005190 0.005566 -0.001909 0.002078 0.004356 -0.000443 
+-0.001182 0.002339 -0.005185 0.002316 0.004464 -0.006473 
+0.003264 0.000481 -0.007174 0.000638 0.000237 -0.001103 
+-0.002612 -0.000904 0.003364 -0.002745 0.000693 0.002238 
+0.001011 -0.000429 -0.000771 0.001845 -0.000144 0.001443 
+0.000661 0.000167 0.000669 -0.001897 -0.004988 0.005197 
+0.005006 0.058747 -0.033909 -0.032156 -0.008769 -0.107429 
+0.014767 -0.050548 0.014199 -0.019416 -0.045614 0.038720 
+-0.026878 -0.032834 0.035187 -0.025554 -0.002298 0.014346 
+-0.015584 0.002361 0.007145 -0.004434 -0.001230 0.004425 
+0.001233 -0.004901 0.007147 0.000430 -0.003689 0.009536 
+-0.003055 -0.000877 0.007268 -0.003842 0.001714 0.004122 
+-0.001369 -0.001046 0.001601 0.004183 -0.001730 0.002294 
+0.008816 -0.001942 -0.003457 0.005814 -0.007837 -0.006906 
+-0.001600 -0.004119 -0.004535 -0.006660 -0.000185 0.003022 
+-0.002745 -0.001608 0.005877 -0.002976 0.001385 0.001365 
+0.002293 -0.007896 -0.000349 0.001683 -0.010513 0.006992 
+0.003244 -0.002306 0.011788 0.006168 0.003532 0.010315 
+0.005052 0.001415 0.004138 -0.001371 0.000407 -0.004260 
+0.008180 -0.000131 -0.001257 0.004447 0.002976 0.000164 
+0.000509 0.004461 -0.001669 0.001648 0.007427 -0.002368 
+0.005184 0.007789 0.001743 -0.001531 0.004123 0.005620 
+-0.002306 0.003403 0.004138 0.001044 0.003989 0.000963 
+0.005601 0.002321 -0.002926 0.002164 0.007432 -0.006416 
+0.006333 0.004426 -0.000766 0.004194 -0.001537 -0.000254 
+-0.002894 -0.002842 0.004367 -0.003904 -0.003749 0.001300 
+-0.003111 0.000805 -0.002141 0.000434 0.002381 -0.000658 
+-0.000409 -0.003261 0.000572 -0.007303 -0.005450 0.001089 
+-0.007352 -0.001415 -0.001804 -0.004234 0.007131 -0.001311 
+0.000588 0.008042 0.001443 0.002672 -0.008735 -0.001884 
+-0.001258 -0.004259 0.000223 -0.002652 -0.001289 0.001331 
+0.000874 -0.000189 0.000119 0.004628 0.000632 -0.001557 
+0.001931 0.000068 0.000435 -0.001941 -0.003205 0.005408 
+-0.004938 -0.004896 0.008621 -0.006712 -0.003982 0.005705 
+-0.003340 0.002089 0.001330 -0.001178 0.001586 0.000353 
+0.000601 -0.001431 -0.000956 0.000695 -0.003902 -0.000785 
+-0.001299 -0.004274 -0.001823 -0.001215 -0.004427 0.000084 
+-0.000939 -0.002098 -0.001299 0.003227 -0.002403 -0.000911 
+0.004108 -0.002931 -0.002293 0.003142 0.001088 -0.002585 
+-0.000421 0.001725 -0.001543 0.001008 0.003485 -0.002163 
+0.002380 0.002306 -0.005678 -0.001264 0.001386 -0.002205 
+-0.003548 -0.000313 0.002388 -0.000583 -0.000674 0.004172 
+0.003937 -0.001393 0.004753 0.004573 -0.001239 0.002170 
+0.001331 -0.000961 0.001829 -0.000702 0.002392 0.006894 
+-0.004840 0.006391 -0.073764 0.034099 0.003945 -0.021699 
+-0.012985 -0.005168 0.012654 0.002395 -0.009088 0.008233 
+-0.002647 -0.010403 0.011952 -0.010519 -0.003219 0.008086 
+-0.002273 0.003713 -0.002020 0.003995 -0.000185 -0.007606 
+0.003839 -0.003154 -0.002850 -0.004202 -0.001511 -0.000362 
+-0.001971 -0.004501 0.009920 -0.002999 -0.004400 0.010265 
+-0.001470 -0.006873 0.010376 0.004743 -0.000010 0.006601 
+0.007467 -0.002428 0.001601 0.004069 -0.000925 -0.006161 
+-0.003649 0.008212 -0.004001 -0.006165 0.006983 -0.003945 
+-0.001987 0.002463 0.008424 -0.007806 0.003128 0.001252 
+-0.006787 -0.001059 0.000469 0.007520 -0.008737 0.001704 
+0.017638 0.004400 0.005847 0.020649 0.013585 0.016774 
+0.019636 0.013381 0.017318 0.012323 0.002635 0.002477 
+0.007437 0.003623 -0.005587 -0.000063 0.003698 -0.001157 
+-0.001069 0.003488 -0.004707 0.002417 0.004954 -0.001550 
+-0.000836 0.003608 0.004789 -0.001327 0.001585 0.004068 
+0.001000 -0.001340 0.000144 0.004398 -0.001951 -0.001151 
+0.003772 -0.002666 -0.002369 -0.000702 -0.001252 -0.001141 
+-0.001635 -0.000987 0.000911 -0.003093 -0.000401 0.000820 
+-0.002693 -0.002320 0.000162 -0.001619 -0.001822 -0.000165 
+-0.001015 0.000545 -0.000475 0.000218 0.003884 0.000768 
+0.002566 0.002000 0.001748 0.000634 -0.001157 -0.003199 
+-0.003234 -0.000356 -0.004283 -0.006144 0.003305 -0.002939 
+0.000260 0.004815 -0.004301 -0.001786 -0.006953 -0.003027 
+-0.004679 -0.002281 0.002907 -0.003828 -0.001556 0.003854 
+-0.000331 -0.001348 0.002994 0.001825 -0.001549 0.004315 
+-0.000740 -0.004675 0.007258 -0.003853 -0.003615 0.010577 
+-0.006334 -0.006552 0.004787 -0.003250 -0.000624 -0.000589 
+-0.002335 -0.000180 -0.001109 -0.000885 -0.002578 0.004155 
+-0.005810 -0.004469 0.000323 -0.004049 -0.001139 0.001146 
+0.001165 0.000488 0.000620 0.001889 -0.000976 0.002107 
+0.002471 0.000628 -0.001362 0.000707 0.000290 -0.000999 
+-0.002874 -0.000427 0.001694 -0.002736 -0.000718 -0.000670 
+-0.000422 0.002379 -0.001534 0.004302 0.001914 -0.006063 
+-0.000001 -0.001614 -0.002584 -0.002692 -0.000204 -0.001625 
+-0.000966 0.003668 0.002629 -0.000388 0.004441 0.003067 
+0.004533 0.000850 0.002933 0.005508 -0.001924 0.001513 
+0.001821 -0.000112 0.004966 -0.000804 0.011278 0.004841 
+0.001174 -0.002449 0.002301 -0.006069 -0.008156 0.007878 
+-0.000930 -0.001774 0.001929 0.003497 -0.007116 0.003546 
+-0.003339 -0.005736 0.005508 -0.002738 0.001689 0.000089 
+0.001004 0.001568 -0.006524 0.001641 -0.000039 0.001547 
+0.002802 -0.000327 0.001040 -0.002776 -0.000971 0.005330 
+0.002318 -0.000930 0.003089 0.002539 -0.004813 0.006652 
+0.003768 -0.004154 0.008666 0.001540 -0.003429 0.007982 
+0.004283 0.003181 -0.000747 0.002165 -0.000124 0.000142 
+-0.003597 -0.001710 -0.001891 -0.007730 0.001685 -0.000371 
+-0.000443 0.001142 0.007415 -0.004801 0.008923 0.000878 
+-0.000569 0.000568 0.003976 0.009321 -0.003351 0.010410 
+0.023862 -0.003361 0.020632 2.578947 0.126316 3.073684 
+2.238636 0.426136 2.636364 0.012086 0.006888 0.007962 
+0.001096 0.002751 -0.003210 -0.001023 0.001362 -0.004802 
+0.000908 0.001870 -0.007419 0.000731 -0.002039 -0.007367 
+0.002300 -0.003095 -0.005268 0.004850 -0.004715 -0.002866 
+0.005175 -0.004905 -0.004991 0.004151 -0.005319 -0.000046 
+-0.002267 -0.005160 -0.000152 -0.005450 -0.000327 -0.001302 
+-0.006011 0.002506 0.002040 -0.005477 0.001355 0.002937 
+-0.007159 -0.001904 0.000357 -0.006416 -0.003666 -0.003337 
+-0.003535 -0.002983 -0.004033 -0.002216 0.000986 -0.001447 
+-0.002268 0.006846 0.001441 -0.001273 0.001817 0.002037 
+-0.002935 0.000108 -0.000102 -0.003534 -0.003712 0.001542 
+-0.002809 0.000751 -0.005861 -0.006078 -0.003348 -0.002398 
+-0.004295 -0.008091 0.006458 -0.008709 -0.008727 0.004850 
+0.001268 -0.006010 0.004199 0.001827 -0.003378 0.003399 
+-0.000423 -0.003523 0.002336 -0.001121 -0.003384 0.001064 
+0.001297 -0.002347 -0.000191 0.002324 -0.003479 -0.001572 
+0.001067 -0.004656 -0.002546 -0.000975 -0.004561 -0.002725 
+-0.000326 -0.003924 -0.001162 -0.000262 -0.000984 -0.000525 
+0.000672 0.002392 0.001996 0.002177 0.004203 0.001302 
+0.000443 0.002816 -0.000007 -0.003925 -0.002170 0.001353 
+-0.003941 -0.001063 -0.001744 0.001044 -0.000214 0.000935 
+0.000650 -0.001237 0.001073 0.002652 -0.003014 -0.002855 
+0.000609 0.000522 0.000314 0.000136 0.000618 0.003744 
+-0.000692 0.004440 0.006663 -0.000741 0.005894 0.005521 
+-0.000204 0.003215 0.003888 0.000607 0.001240 0.004520 
+0.001274 0.002155 0.005236 -0.006381 -0.006167 -0.001431 
+-0.011812 -0.007443 0.006108 0.000059 -0.003103 0.002720 
+0.005569 -0.003489 -0.000402 0.003716 -0.000919 -0.001075 
+0.003159 0.006317 -0.002867 0.004047 0.009555 -0.007508 
+0.005373 0.007328 0.002587 0.005553 0.001626 0.000727 
+0.001226 -0.002095 0.000985 -0.003555 -0.003461 0.002526 
+-0.001773 0.000948 0.001069 0.001381 -0.000252 0.004922 
+0.000059 0.001239 0.005310 0.007696 0.002045 0.001564 
+0.003065 -0.012154 -0.009144 0.003134 -0.019102 -0.016429 
+0.001384 -0.017942 -0.016048 -0.000760 -0.011662 -0.007660 
+-0.001283 0.003343 0.001173 -0.000912 0.010463 0.007936 
+0.007143 0.006604 0.005463 0.008824 0.002978 0.000370 
+0.004691 0.005454 0.014467 0.005912 0.007312 0.020686 
+0.008319 0.008787 0.012927 0.009636 -0.001963 0.006940 
+-0.001685 -0.002857 0.003043 0.000360 0.001417 -0.002476 
+0.003733 0.005229 -0.005850 -0.001028 0.005433 -0.010425 
+0.003133 0.000056 -0.007024 0.003870 -0.002787 -0.004399 
+0.003521 -0.006586 -0.003088 0.002135 -0.002252 -0.000457 
+-0.002309 0.003914 0.000324 0.001230 0.007226 -0.000270 
+0.006334 -0.000518 -0.000930 0.005956 -0.008219 0.000522 
+0.001899 -0.010104 -0.005892 -0.005508 -0.006864 -0.006737 
+-0.007027 -0.001662 -0.001071 0.000241 0.005450 0.001012 
+0.002862 0.006660 0.001784 0.002259 0.003411 0.002856 
+-0.001584 -0.001411 0.006604 -0.003073 -0.002731 -0.008115 
+-0.007906 -0.000721 -0.010043 -0.017515 -0.004814 -0.003172 
+-0.014988 -0.009968 -0.006435 -0.016194 -0.007570 -0.004887 
+-0.008800 0.000240 0.002160 -0.001411 -0.004505 -0.002270 
+-0.000207 -0.001992 -0.003769 -0.000703 -0.000233 -0.005445 
+-0.002451 -0.001465 -0.002419 0.001460 -0.000060 -0.000426 
+0.001995 -0.000470 -0.003948 0.001698 0.000984 0.000243 
+0.001325 0.001202 -0.001082 0.000634 -0.000816 0.001413 
+0.001862 -0.001164 0.002366 0.002604 0.001087 -0.000026 
+0.000220 0.001077 0.001170 -0.003382 -0.001075 0.000373 
+-0.003698 -0.003670 -0.001556 -0.001621 -0.003845 -0.000747 
+0.000698 -0.001145 0.000261 0.002220 -0.000474 0.000799 
+0.003103 -0.000247 0.001824 0.002775 -0.000636 0.001557 
+0.000883 -0.000738 -0.000495 -0.001933 0.000874 -0.000589 
+-0.007057 0.002505 0.008127 -0.012865 0.003719 0.015409 
+-0.018233 0.002189 0.004657 -0.011951 -0.008975 0.008657 
+-0.004872 -0.005748 0.006416 -0.000990 -0.002577 0.002458 
+-0.001185 -0.002015 0.000625 -0.003861 -0.002002 -0.000753 
+0.001603 -0.000465 -0.000836 0.006354 0.003092 -0.004951 
+0.005245 0.000427 0.002558 0.002560 -0.005658 0.003491 
+-0.000400 -0.005417 0.001096 -0.000278 -0.003444 -0.001722 
+0.002220 -0.001057 -0.004922 -0.000847 0.002089 -0.000278 
+-0.000253 -0.002595 0.002313 0.002358 0.000480 0.006040 
+0.001873 -0.012269 -0.010683 0.245283 -2.146226 -2.127358 
+0.414634 -2.258537 -2.658537 0.003420 -0.018620 -0.024510 
+0.000282 -0.005146 -0.009760 -0.005876 0.002452 0.009195 
+0.001113 0.004373 0.006123 0.004524 0.002042 0.000911 
+-0.000158 -0.002400 0.000493 -0.000561 -0.010958 -0.005725 
+-0.004891 -0.003938 -0.005868 -0.003492 -0.001364 -0.000697 
+-0.004616 -0.005178 0.002262 -0.001746 -0.002823 0.000952 
+-0.001608 -0.001744 -0.004564 -0.001343 -0.001255 -0.002330 
+-0.003089 0.005077 -0.002317 0.000160 -0.001123 -0.004171 
+0.003685 -0.004988 -0.008230 0.009679 -0.006799 -0.008319 
+0.013752 -0.009381 -0.013759 0.021504 -0.004706 -0.020012 
+0.019274 -0.001075 0.002424 0.001032 -0.020443 -0.001048 
+-0.003993 -0.015280 -0.008830 -0.002695 0.004883 -0.004843 
+0.002526 0.007229 -0.004216 -0.003070 0.001261 0.000617 
+0.004200 -0.002971 0.005339 -0.005748 0.002718 0.003613 
+-0.008527 0.004576 -0.001022 -0.013500 0.003537 -0.009264 
+-0.017618 -0.000299 -0.010241 -0.015842 0.005947 -0.009355 
+-0.010518 0.006896 -0.011837 -0.010607 0.000207 -0.010875 
+-0.007022 -0.007347 -0.004414 -0.003318 -0.009593 -0.002894 
+-0.002100 -0.007500 -0.001100 -0.001782 -0.004427 -0.000653 
+-0.002493 -0.000981 -0.003515 0.000211 -0.001908 -0.004511 
+0.004122 -0.003931 -0.002555 0.006494 -0.001785 -0.002922 
+0.003776 -0.002414 -0.002418 0.005225 -0.000197 0.001183 
+0.003581 0.002081 -0.001908 0.000282 0.001816 -0.002185 
+0.004084 -0.001876 0.000318 0.000151 -0.002303 -0.001153 
+-0.002300 -0.002781 -0.000548 -0.000961 -0.001298 -0.000162 
+0.000249 -0.000425 -0.000165 0.000106 -0.001334 -0.000460 
+0.001856 -0.002067 0.000389 0.000634 -0.001223 -0.000172 
+-0.003099 0.000758 -0.007376 -0.004486 0.002037 -0.010373 
+-0.009142 0.002309 0.001504 -0.020337 -0.008199 0.009884 
+-0.005899 -0.008584 0.011592 -0.003381 -0.011288 -0.001867 
+-0.011131 -0.010932 0.003982 -0.006016 -0.007211 0.009324 
+-0.000400 -0.003570 0.007918 0.001479 0.000345 0.000262 
+0.004532 -0.001440 -0.008750 0.007113 -0.002857 -0.008830 
+0.005532 -0.000626 -0.005218 -0.000313 -0.000186 0.000350 
+-0.004371 -0.004141 0.002385 -0.004569 -0.002457 -0.001562 
+0.002324 -0.004733 -0.004904 0.000032 -0.000334 -0.000022 
+-0.005877 0.007782 -0.000253 -0.001592 -0.003449 0.013029 
+0.000277 -0.013564 -0.005077 0.481818 -1.895455 -2.277273 
+0.456410 -2.184615 -3.400000 0.005294 -0.019094 -0.035274 
+0.006330 -0.010144 -0.010793 -0.001536 -0.006821 0.000523 
+-0.000546 -0.000314 -0.000803 -0.000588 -0.002861 -0.003500 
+0.003824 -0.001829 -0.002826 0.001692 -0.003157 0.004158 
+-0.002424 -0.008237 0.003761 -0.001100 -0.002592 -0.003181 
+0.000726 0.000523 -0.000781 0.001770 0.002419 -0.002632 
+0.006274 0.002636 -0.001944 -0.000861 0.001514 0.000189 
+-0.000496 0.003220 -0.002205 -0.000124 0.003164 -0.001251 
+0.000867 0.003869 -0.001307 0.007612 0.009550 -0.009017 
+0.014015 -0.016212 -0.022803 0.023190 -0.014628 -0.028185 
+0.016247 -0.019034 -0.025479 0.009455 -0.017025 -0.019828 
+-0.001720 0.000335 -0.010589 -0.001204 0.000866 -0.003880 
+-0.001811 -0.000798 -0.001482 0.001844 -0.000642 0.005132 
+0.002922 0.006152 0.011996 -0.001763 0.010176 0.005488 
+-0.011000 0.004396 -0.000440 -0.007361 0.006922 -0.002455 
+-0.004477 0.003188 -0.008434 0.000063 0.001348 -0.009125 
+0.003307 0.005524 -0.008148 0.002579 0.008488 -0.007804 
+0.003246 0.003058 -0.011916 0.006754 -0.001598 -0.005020 
+-0.000281 0.000208 0.000246 -0.007590 0.000376 0.003406 
+-0.008636 0.001696 0.002108 -0.006330 -0.000077 -0.000300 
+-0.004067 -0.003134 -0.001096 -0.000944 -0.002187 -0.000666 
+0.000658 -0.000242 -0.000697 -0.000062 0.000106 0.000139 
+0.000467 -0.000036 0.000351 0.002558 -0.001042 0.001042 
+0.006145 -0.001322 0.001246 0.005046 -0.001169 -0.000728 
+-0.000591 -0.001827 -0.001015 -0.001579 -0.001373 -0.000381 
+0.001111 -0.000199 -0.000107 0.001401 -0.000877 0.000039 
+-0.000713 -0.001953 -0.001560 -0.002995 -0.001494 -0.003604 
+-0.001359 -0.000350 -0.003406 -0.002581 -0.002292 -0.001639 
+-0.010663 0.001170 -0.002414 -0.016091 0.004628 0.004303 
+-0.003376 -0.009781 -0.009954 -0.006728 -0.007315 0.004308 
+-0.000631 -0.010055 0.004068 0.000810 -0.013593 0.004222 
+0.008580 -0.012503 0.008670 0.012909 -0.003818 -0.012182 
+0.017483 -0.008094 -0.014548 0.010203 -0.003173 -0.007775 
+-0.001349 0.001131 0.002247 -0.007452 -0.001459 0.002986 
+-0.006797 -0.005413 -0.003550 -0.003234 -0.006475 -0.008697 
+-0.000495 -0.005246 -0.008317 -0.001993 -0.000950 -0.001754 
+-0.009599 0.002383 0.004230 -0.007610 -0.002721 0.001662 
+0.005056 -0.012142 -0.008952 0.007705 -0.022992 -0.018981 
+0.468531 -1.783217 -3.888112 0.003563 -0.014512 -0.031452 
+0.002309 -0.006763 -0.002285 0.005475 -0.001098 0.004013 
+0.006262 -0.005991 0.000903 0.004842 -0.006207 -0.003703 
+0.000097 -0.003753 -0.001755 -0.000484 0.002054 0.004500 
+-0.000034 0.001641 0.001795 0.000643 -0.003801 -0.001257 
+0.003846 -0.002731 0.001183 0.002158 -0.002054 -0.004421 
+0.006061 -0.003030 -0.008485 0.005057 0.003314 -0.013708 
+0.003813 0.003805 0.001730 -0.002596 0.002407 0.000639 
+-0.001568 0.002577 0.000182 0.002526 0.001215 0.001435 
+0.004671 -0.005985 -0.000800 0.007945 -0.009837 -0.012071 
+0.012503 0.000350 -0.011684 -0.000629 -0.006814 -0.001934 
+0.001001 0.000322 -0.005220 -0.001486 -0.003860 -0.001657 
+0.000671 0.000273 0.003764 -0.001758 0.003566 0.010393 
+-0.008998 0.001888 0.010443 -0.008187 0.002605 0.005894 
+-0.000976 0.000199 0.001975 0.005600 -0.004550 -0.000874 
+0.005524 -0.000385 0.001078 -0.006294 0.003137 0.000322 
+0.000112 0.007791 0.005425 0.010304 0.008515 0.000163 
+0.009647 0.007271 -0.020553 0.013434 -0.006244 -0.006913 
+0.001645 0.001287 -0.000205 -0.006996 0.003482 0.003541 
+-0.007125 0.005248 0.002664 -0.007969 0.004058 0.002363 
+-0.008274 -0.000279 0.002476 -0.003302 -0.001609 0.001047 
+-0.001710 -0.001224 -0.000234 -0.001728 -0.000526 -0.000683 
+-0.000142 -0.000583 -0.000845 0.002188 -0.001100 0.000396 
+0.006575 -0.000077 0.002721 0.010324 0.003668 0.002510 
+0.005654 0.005295 0.001137 0.001380 0.003268 0.000993 
+0.002063 0.001366 0.000264 0.001143 0.000033 0.000657 
+-0.002351 0.000052 -0.001490 -0.007931 0.000974 -0.003198 
+-0.008908 0.001327 0.001228 -0.005952 0.003215 -0.000706 
+-0.010764 -0.000661 0.000162 -0.016527 -0.004695 0.002587 
+-0.015549 -0.005069 0.003284 -0.004769 -0.001724 -0.000415 
+0.005806 -0.001395 0.003613 0.003563 -0.007069 0.003861 
+0.004287 -0.001396 0.006319 -0.009537 -0.004164 -0.004964 
+-0.008591 -0.005106 -0.003359 -0.000267 -0.004584 -0.003785 
+-0.003098 -0.000975 -0.000002 -0.007613 -0.001207 0.002170 
+-0.003487 -0.004649 -0.004325 0.002222 -0.005744 -0.010589 
+0.004710 -0.003849 -0.007770 0.004250 0.000666 0.000937 
+0.001648 0.003902 0.002730 0.000794 -0.001675 -0.001019 
+0.000605 -0.009686 -0.007456 -0.003667 -0.015635 -0.014700 
+-0.002630 -0.016218 -0.016380 0.001625 -0.011127 -0.008973 
+0.003984 -0.003820 -0.000709 0.007732 -0.006702 0.004889 
+0.008068 -0.008541 0.005553 0.006590 -0.004432 -0.001112 
+0.000990 -0.003392 0.006257 0.000678 0.001071 0.001004 
+-0.004062 0.000162 -0.000674 -0.002620 -0.002429 0.000331 
+0.002845 0.000042 -0.001590 0.001192 0.001818 -0.001729 
+0.003256 0.001498 -0.003777 0.001648 -0.000286 0.000638 
+0.001192 0.000533 0.001140 0.001023 0.000698 0.000386 
+0.000547 0.001344 0.000672 0.000426 0.004259 -0.000556 
+0.001878 0.004598 -0.000642 -0.000588 0.000382 0.000715 
+-0.002475 0.000464 0.000091 -0.001583 0.001459 -0.001016 
+-0.000059 0.002249 -0.005755 0.002082 -0.000780 -0.002437 
+-0.002640 -0.005724 0.000546 -0.006726 -0.007443 0.000731 
+-0.005695 -0.002763 0.000359 -0.000812 -0.004026 -0.004275 
+0.002790 -0.004157 -0.007047 0.000729 -0.000108 -0.000210 
+-0.014990 0.007928 0.007618 -0.021412 0.015297 0.010644 
+-0.015181 0.014473 0.011967 -0.007970 0.010350 0.008314 
+-0.007517 -0.008930 0.005618 0.005949 -0.019612 -0.001670 
+0.004205 -0.002563 -0.002001 -0.006730 0.001877 0.001624 
+-0.005621 0.001816 -0.000815 -0.000513 -0.002311 -0.001246 
+0.001296 -0.002898 -0.002325 -0.000757 0.000118 0.000726 
+-0.002368 0.000798 0.003148 -0.002611 0.001386 0.002946 
+-0.000016 -0.000148 -0.000194 0.000454 -0.002754 -0.001954 
+0.001593 -0.002186 -0.000872 0.006471 0.001289 -0.000023 
+0.000526 0.000282 -0.000161 -0.005269 -0.004449 0.002985 
+-0.004732 -0.005306 0.000472 -0.000204 -0.004812 -0.000355 
+-0.002215 -0.005106 -0.001957 -0.006877 -0.003595 -0.003852 
+-0.008535 -0.002423 0.007856 0.001509 -0.000568 0.001115 
+0.004008 0.001982 0.001838 0.003283 0.003741 0.001881 
+-0.001471 0.001243 0.002153 -0.005151 -0.002180 0.000246 
+-0.005015 -0.002046 -0.002749 -0.003205 -0.007493 -0.004516 
+-0.007564 -0.005752 -0.007304 -0.016208 -0.001791 -0.002776 
+-0.013386 0.006718 0.002472 -0.000392 0.012134 -0.004341 
+0.011409 0.000943 -0.007590 0.017347 0.003571 -0.003367 
+0.012210 0.002644 -0.003820 0.006325 0.001316 -0.002068 
+0.000900 0.000869 0.000786 -0.003924 0.002256 0.002371 
+-0.006105 0.000818 -0.001346 -0.010374 -0.001404 -0.003583 
+-0.017427 -0.000776 -0.001615 -0.001558 -0.000250 0.000671 
+0.003403 0.002738 -0.006702 0.000154 0.000315 0.001385 
+0.002666 0.002822 0.005937 0.006869 -0.001595 0.004803 
+-0.000117 -0.009052 0.009920 -0.003068 0.000683 0.004522 
+0.001821 -0.004235 0.000266 -0.002446 -0.003569 -0.002972 
+-0.009330 -0.002848 0.000655 -0.003966 0.000455 0.003686 
+-0.000966 -0.000462 0.002101 -0.003276 -0.002808 0.000468 
+-0.003349 -0.004573 0.002323 0.000603 -0.003968 0.002132 
+-0.000114 -0.000716 0.003748 0.000538 0.000991 -0.001101 
+-0.000227 0.002782 -0.000587 -0.000915 0.000860 -0.000490 
+-0.001518 0.000196 -0.000847 -0.001564 -0.000382 -0.000036 
+-0.000740 -0.000465 0.000506 -0.000252 0.000122 -0.000528 
+0.000702 -0.001402 -0.002357 0.004101 -0.001200 -0.003049 
+0.006440 -0.001959 -0.004480 0.005799 -0.001583 -0.001014 
+0.000737 0.006025 0.016727 -0.013629 0.011501 0.031822 
+-2.387597 1.100775 4.472868 -2.983740 2.390244 4.414634 
+-3.362903 3.145161 3.298387 -3.167883 2.642336 2.430657 
+-0.027872 0.016729 0.017158 -0.020273 -0.004395 0.015585 
+-0.004918 -0.031165 0.015484 0.021163 -0.009329 -0.002462 
+0.004692 0.006590 -0.005064 -0.006522 0.008045 -0.002194 
+-0.006513 0.003107 -0.008763 -0.002808 -0.005059 -0.007620 
+0.005939 0.005975 0.003194 0.004595 0.009619 0.013917 
+0.004018 0.007994 0.005412 0.000547 0.004248 -0.002048 
+0.005823 0.001017 0.000056 -0.000403 0.000375 -0.000230 
+0.000109 0.004084 0.001513 0.008569 0.007563 0.001761 
+-0.000418 0.002344 0.000824 -0.005776 -0.003765 0.005283 
+-0.004355 -0.006384 0.002676 0.000979 -0.010052 0.002585 
+-0.003152 -0.017556 -0.000166 -0.011407 -0.016599 -0.005747 
+-0.005404 0.000763 -0.005258 0.008524 0.008098 0.008477 
+0.018326 0.012308 0.013125 0.013143 0.011929 0.011124 
+0.000444 0.005411 0.007900 -0.008329 -0.000964 0.002262 
+-0.011469 -0.004972 -0.004126 -0.013128 -0.006826 -0.010887 
+-0.015246 -0.003622 -0.013799 -0.006846 0.006063 0.004714 
+-0.001436 0.001567 -0.002683 0.011430 -0.002613 0.004234 
+0.012966 0.000548 0.006262 0.007639 0.000339 -0.000225 
+-0.000989 -0.002554 -0.008280 -0.006100 -0.001590 -0.011485 
+-0.003380 -0.000875 -0.009451 0.003787 -0.002950 -0.006088 
+0.009038 -0.002221 -0.005986 0.003562 -0.000180 -0.008407 
+-0.005126 -0.002091 -0.012231 -0.005651 0.000048 -0.011561 
+-0.001919 0.000692 -0.004654 -0.000824 0.001088 0.001596 
+0.005440 -0.000279 0.004987 0.005350 0.003908 0.005123 
+0.001366 -0.000689 0.004799 -0.001579 -0.006038 -0.002359 
+-0.000987 -0.006073 -0.001443 -0.001278 -0.002571 -0.000108 
+0.000493 -0.000653 0.000355 -0.000472 0.000278 0.000995 
+-0.006695 -0.001703 -0.000568 -0.003625 -0.000132 -0.002461 
+-0.001253 -0.000934 -0.001329 0.001544 -0.001053 0.001053 
+0.000292 -0.000584 0.003723 -0.000671 0.001749 0.001923 
+-0.000964 0.000720 0.000718 0.000257 0.002169 0.000822 
+-0.001167 0.001624 -0.001072 0.000763 0.002933 -0.000948 
+-0.000571 0.003191 -0.002586 0.001399 -0.001678 -0.004921 
+0.001684 0.004033 0.002840 0.002087 0.007847 0.000145 
+0.014778 0.000868 -0.006164 0.001035 -0.015405 -0.000294 
+-1.762500 -1.106250 3.325000 -3.067797 1.677966 4.906780 
+-3.786517 2.629214 5.865169 -3.996032 4.063492 5.837302 
+-3.669492 5.199152 4.838983 -3.258373 5.000000 4.133971 
+-2.759494 4.088608 3.702532 -0.022960 0.041860 0.027620 
+0.008016 -0.074304 0.014490 0.031681 0.000730 -0.027224 
+0.002295 0.009420 -0.003165 -0.004584 0.009059 -0.000272 
+0.000298 0.003918 -0.009315 -0.003249 0.012688 -0.020472 
+-0.004966 0.008912 -0.004218 -0.000570 0.006619 0.005049 
+0.001423 -0.002133 -0.001238 0.005011 -0.004058 -0.008436 
+0.007419 0.004421 -0.014436 0.000745 0.006819 -0.012933 
+-0.004394 0.004114 -0.014389 -0.000996 0.012646 -0.002953 
+0.002157 0.009492 -0.002683 -0.002097 0.005144 0.002941 
+-0.003401 0.000258 0.001622 0.001521 -0.005828 0.001413 
+-0.001817 -0.013529 -0.000251 -0.009806 -0.008273 -0.005486 
+-0.006580 0.008032 -0.006653 0.013581 0.017707 0.014333 
+0.024668 0.023759 0.017967 0.021368 0.027445 0.021754 
+0.012078 0.022525 0.027603 0.004971 0.016320 0.026831 
+0.002225 0.009341 0.028500 -0.002083 -0.007058 0.034959 
+-0.005750 -0.019231 0.017832 -0.018397 0.005055 -0.008949 
+-0.005278 -0.001110 -0.010386 0.006032 -0.005839 -0.002068 
+0.008951 -0.002199 -0.002887 0.003270 -0.000311 -0.004152 
+0.001277 -0.001844 -0.007719 0.001966 -0.003092 -0.009084 
+0.004002 -0.003352 -0.006055 0.006001 -0.002327 -0.003013 
+0.005889 -0.001253 -0.003717 0.003867 -0.003059 -0.006264 
+0.001707 -0.004643 -0.007730 0.000913 -0.003324 -0.005455 
+0.000262 -0.000502 -0.000877 -0.000587 0.000349 0.002328 
+0.001085 -0.000770 0.001977 -0.000276 -0.003151 0.000748 
+-0.001240 -0.000466 0.001281 -0.003597 -0.004856 0.004151 
+-0.003469 -0.008050 0.001413 -0.000952 -0.001757 0.000739 
+0.005896 -0.001382 -0.007550 -0.000919 -0.001613 -0.008747 
+-0.001639 -0.010880 0.001026 -0.000386 -0.006700 0.004790 
+-0.000583 -0.000958 0.002344 0.001159 0.002504 0.001503 
+0.001965 0.000462 0.004098 0.000933 -0.000470 0.002993 
+-0.003139 -0.001011 0.000678 -0.000670 -0.000225 0.004569 
+-0.005205 0.003022 0.007822 -0.000335 0.001995 0.002566 
+-0.001283 -0.001948 -0.003872 0.007177 0.004637 -0.009718 
+-0.001120 0.001922 0.003257 -0.002379 0.003186 0.006259 
+0.008694 -0.002969 -0.008934 0.000726 -0.020411 -0.005834 
+-0.017660 -0.023597 0.021101 -3.618834 1.542601 4.807175 
+-3.925697 3.996904 5.250774 -3.769036 5.329949 5.269035 
+-3.482143 6.252551 5.089286 -3.246528 6.527778 4.934028 
+-2.791139 6.981013 4.715190 -2.916667 -2.059524 4.678571 
+-0.010405 -0.077628 0.013025 0.004517 0.000878 -0.019492 
+0.007579 0.005988 -0.001476 0.003161 -0.002226 0.008143 
+0.002940 -0.000202 -0.010462 0.017633 0.000941 -0.014106 
+-0.009270 0.014306 -0.006512 -0.000408 -0.001134 -0.001497 
+0.000178 -0.003399 -0.003037 -0.007962 0.001969 -0.001849 
+-0.003126 -0.001530 -0.000681 -0.000409 -0.000140 0.001260 
+-0.006155 -0.006839 0.006818 -0.009462 -0.012340 0.011083 
+-0.003260 -0.008527 0.004445 0.001182 0.001323 -0.001210 
+0.001098 0.004067 0.000655 -0.000994 -0.000740 -0.000686 
+-0.004817 -0.018161 -0.002788 -0.012779 -0.018916 -0.003067 
+0.001376 0.006007 0.000054 0.026730 0.022239 0.015768 
+3.104167 3.305556 2.895833 3.262857 4.308571 2.840000 
+2.908163 4.765306 3.428571 3.201923 3.701923 4.774038 
+4.333333 1.920398 5.875622 4.934640 0.339869 6.215686 
+0.037774 -0.009970 0.024844 0.011206 0.009645 -0.020550 
+-0.007783 -0.001574 -0.017890 -0.004674 0.001217 -0.003562 
+0.001429 -0.002501 -0.002025 0.002918 0.003335 -0.004349 
+0.006454 0.002374 -0.005113 0.005643 0.001757 -0.004501 
+0.004000 0.006033 -0.004424 0.000089 -0.001340 -0.002204 
+-0.001536 0.001413 -0.001714 -0.002812 -0.003186 -0.000435 
+-0.002285 -0.003994 -0.002807 -0.000193 -0.004798 -0.003674 
+0.003769 -0.001108 -0.000369 0.000395 -0.001511 -0.001576 
+0.000401 -0.000419 0.000168 -0.004315 -0.002616 0.001606 
+-0.001127 -0.002882 0.002956 -0.002787 -0.004375 -0.000310 
+-0.000706 -0.003575 -0.000232 -0.001851 0.001298 -0.001744 
+-0.001642 0.002241 -0.005940 -0.001320 0.000733 -0.003370 
+0.003589 -0.007131 -0.003493 0.000611 -0.005935 0.000735 
+-0.000744 0.001858 0.000606 0.000715 0.004411 0.003864 
+0.001327 0.000780 0.001579 0.000565 -0.001826 -0.001870 
+-0.000307 -0.000827 -0.000815 0.000333 -0.000685 0.001826 
+0.000727 0.001324 0.003021 -0.000356 0.002408 0.002151 
+-0.003227 0.005528 -0.005297 -0.002121 0.000114 0.000431 
+-0.005736 0.000706 0.003692 -0.009972 0.000317 0.007282 
+-0.005787 -0.000624 0.005007 0.005840 -0.002774 -0.006884 
+0.001287 -0.020014 0.004176 -0.017654 -0.017455 0.018224 
+-2.735294 3.478992 3.756303 -3.146342 6.075881 4.525745 
+-3.273458 7.021448 4.839142 -3.114537 7.982379 4.555066 
+-1.686046 3.732558 2.593023 0.280702 -14.684211 -0.122807 
+-0.012648 -0.024600 0.001488 -0.018994 0.011781 0.009965 
+-0.005771 0.002539 0.000606 0.009883 -0.002512 -0.010795 
+0.016803 0.014126 -0.006683 0.009019 0.007845 -0.009919 
+0.000641 0.006727 0.003026 -0.002068 -0.014682 0.001610 
+-0.001245 -0.013027 0.001602 -0.000399 0.000488 -0.001315 
+0.003055 0.002368 0.000887 0.004839 0.009689 -0.002624 
+0.000989 0.006426 0.006667 0.006780 -0.005989 0.006747 
+-0.007423 -0.005703 0.005077 0.004035 0.002557 -0.004424 
+0.006338 0.003973 -0.002971 0.003576 -0.003009 -0.000402 
+0.001810 -0.017842 -0.001293 0.001557 -0.026098 -0.005428 
+-0.030355 -0.027072 -0.011060 0.025575 0.028689 0.019453 
+3.763158 4.952631 4.978947 4.461794 5.421927 4.564784 
+4.763736 5.640110 4.717033 5.534060 5.166213 5.397820 
+7.081967 3.796721 6.114754 7.247423 1.711340 6.453608 
+4.079365 -0.246032 2.277778 0.020509 0.004990 -0.009391 
+0.008885 0.001885 -0.013597 -0.003358 0.001742 -0.002028 
+-0.004588 -0.000753 -0.004461 -0.000450 -0.004309 -0.002251 
+0.002153 0.000162 0.003941 0.005147 0.006459 0.004617 
+0.001707 0.007236 0.003089 -0.002091 0.002414 0.000181 
+-0.000796 -0.001831 -0.003287 -0.002690 -0.002181 -0.002422 
+-0.003702 -0.000205 -0.003230 -0.000226 -0.001041 -0.000493 
+0.004756 0.001158 -0.004957 0.005137 -0.001389 0.003318 
+0.004577 0.000358 0.000429 -0.001892 0.002195 0.000378 
+-0.005312 0.002710 -0.000054 -0.005628 -0.000383 -0.003005 
+-0.001764 0.001651 -0.000143 0.002318 0.004576 -0.005361 
+0.003437 0.005703 -0.003203 0.000986 0.002276 0.004513 
+0.002365 0.001959 0.001441 0.007583 0.001990 -0.000751 
+0.003217 0.001011 0.003571 0.000010 -0.004545 0.000008 
+-0.002323 -0.000452 -0.003211 0.000941 -0.000803 -0.001292 
+0.000122 0.007073 -0.001098 0.000724 0.000145 0.002787 
+0.006174 -0.001055 -0.001431 0.002087 0.002601 -0.007299 
+-0.000811 0.003425 -0.002144 -0.001877 -0.002977 0.004985 
+-0.002835 -0.004603 0.009163 -0.005575 -0.004308 0.007096 
+0.001348 -0.001486 0.002513 0.001999 -0.001422 0.000293 
+0.010424 -0.001623 -0.011421 0.013811 -0.002558 -0.003964 
+-0.009456 0.001017 0.007339 -1.886076 4.886076 2.544304 
+-2.049296 6.753521 3.176056 -1.278481 7.949367 2.455696 
+0.065770 -0.066548 -0.005061 0.043206 0.052808 -0.060769 
+-0.003493 -0.019600 0.007984 -0.010063 0.002237 0.016767 
+-0.002553 -0.017872 -0.001277 0.010444 0.008444 -0.003778 
+0.005050 0.017352 -0.002735 0.000536 0.012316 0.000648 
+-0.004961 -0.018026 0.002096 -0.009220 -0.033958 -0.000446 
+-0.005472 -0.017999 0.000401 -0.000359 -0.000626 0.000026 
+0.004741 -0.000734 0.002709 0.000691 0.000749 0.003610 
+0.001668 -0.003052 0.002995 -0.008642 -0.011924 -0.004203 
+0.001796 -0.002067 -0.001911 0.001466 -0.002842 -0.007113 
+-0.000072 0.001989 -0.006072 0.007375 0.000289 -0.006586 
+0.007408 -0.006155 0.003871 0.002434 -0.015082 -0.009606 
+-1.941176 -14.921569 2.745098 3.114943 2.862069 7.022988 
+5.072340 6.638298 5.493617 5.603133 6.383812 4.900783 
+5.825882 6.030588 4.840000 6.509749 5.339833 5.122563 
+6.690763 3.991968 5.297189 5.012987 2.272727 4.292208 
+0.020051 0.014129 0.013659 0.019127 0.006214 -0.002071 
+0.004681 -0.000195 -0.002461 -0.010978 -0.010217 0.003003 
+-0.002900 0.001917 -0.000579 0.006869 0.004750 0.005544 
+0.002101 -0.002536 0.002572 0.004594 0.002081 0.008198 
+0.003171 0.001856 0.004057 0.004152 -0.009325 0.002958 
+0.000949 -0.013738 0.004745 -0.005469 -0.008479 -0.008178 
+-0.003883 -0.000300 -0.008409 0.000171 -0.000293 -0.003551 
+0.004015 0.000935 0.003669 0.000135 -0.001597 0.001807 
+0.001038 -0.000504 -0.001211 -0.001913 0.000086 -0.000924 
+-0.000823 0.000327 -0.001325 -0.002210 0.000738 -0.002939 
+0.001262 0.001096 0.000405 -0.000003 0.005106 -0.010207 
+0.000313 -0.001472 -0.002970 0.003976 -0.001236 0.000227 
+0.000316 -0.003171 0.001052 -0.001271 -0.009458 0.001034 
+0.001731 -0.006586 0.007978 0.002295 -0.002577 0.002837 
+0.002496 -0.000653 -0.001659 0.005995 0.008529 -0.002926 
+-0.001509 0.005223 -0.000234 0.002104 0.002912 0.004087 
+-0.000909 0.000537 0.000970 -0.000967 0.001391 0.001208 
+-0.001290 -0.000312 0.000888 -0.000702 0.000357 0.000161 
+-0.000859 0.001932 -0.001074 -0.001795 -0.000185 -0.000264 
+0.000216 -0.000966 -0.001713 0.001181 -0.004854 -0.001756 
+0.002548 -0.003899 -0.000520 -0.000085 0.003226 -0.002106 
+0.001859 0.004584 -0.009424 0.018856 -0.011797 -0.015079 
+0.034923 -0.012329 -0.015016 0.016886 -0.003267 -0.005449 
+-0.012599 0.003507 -0.007169 -0.015124 -0.001074 0.008490 
+-0.000674 -0.000442 0.003326 0.004490 -0.002735 0.005469 
+-0.001624 -0.004200 -0.006494 0.005300 0.002281 -0.011372 
+0.009196 0.003482 -0.009821 0.000903 0.002257 -0.005273 
+-0.003399 -0.004444 -0.006144 -0.003108 -0.009602 0.001236 
+0.003281 0.004599 -0.002706 0.010191 0.006399 -0.000939 
+0.004235 0.001306 0.003629 0.000650 -0.000028 0.000767 
+-0.001116 -0.011108 -0.004227 0.001705 -0.001244 0.000864 
+0.001945 -0.002847 -0.009371 -0.005255 0.000525 -0.000788 
+-0.001397 0.004930 -0.007497 0.003427 0.001293 -0.005583 
+0.012787 -0.007740 -0.000310 -0.083233 -0.009248 -0.008221 
+8.288136 -13.932203 2.677966 7.329268 3.134146 6.317073 
+6.318471 7.624204 5.490446 6.690909 6.681818 4.800000 
+6.076190 5.104762 4.185714 4.653333 2.300000 2.753333 
+-0.006633 0.001709 0.001201 -0.010540 0.006595 -0.008653 
+0.009224 0.004263 0.003028 0.002697 -0.004194 -0.002694 
+-0.012110 -0.012813 0.001802 -0.002838 -0.001004 -0.002047 
+0.005104 0.007181 0.005434 0.001696 0.005800 0.006221 
+0.000663 0.001783 0.002609 0.000251 0.001049 0.003970 
+-0.006086 0.000245 0.011315 -0.010370 0.001528 0.001528 
+0.001342 -0.002415 0.004495 0.000078 -0.004358 -0.004800 
+-0.000189 -0.001817 -0.004896 0.003898 -0.000163 -0.002653 
+-0.000507 -0.000370 -0.000666 0.000209 0.000368 -0.002039 
+0.003360 0.000989 0.000651 0.001569 -0.001764 0.001565 
+0.002311 0.000525 -0.001435 0.000326 0.001958 -0.004385 
+0.003048 0.001070 -0.003404 0.001652 -0.002537 -0.000059 
+-0.000172 -0.003621 0.001897 0.000153 0.000802 -0.001276 
+-0.004309 -0.004832 0.006573 -0.003030 -0.000758 0.003114 
+-0.000623 0.000327 0.000085 0.000447 -0.002635 0.001123 
+0.002200 -0.006741 0.001320 0.000183 -0.008077 0.002921 
+-0.000615 -0.003025 -0.001373 0.001108 0.002847 -0.004429 
+-0.003847 0.005004 -0.000544 -0.004746 0.002183 0.004446 
+0.000135 0.002565 0.002677 -0.000644 0.000752 0.000559 
+-0.001387 -0.001387 -0.001008 -0.000259 -0.000249 -0.000717 
+0.000659 -0.000659 0.004496 -0.004990 -0.009221 0.003158 
+-0.003597 -0.006160 -0.001816 0.003204 -0.004813 -0.000648 
+0.000930 -0.003461 -0.004203 0.002874 -0.001888 -0.006576 
+0.002480 -0.002811 -0.007831 0.000337 -0.003857 -0.009380 
+-0.001591 -0.003829 -0.009020 -0.004403 -0.002013 -0.002039 
+-0.000543 0.002557 0.003564 0.002609 0.005716 -0.001019 
+-0.002228 0.004468 0.000405 0.001570 0.004296 -0.001621 
+-0.000108 0.006413 -0.005656 0.002833 0.001182 -0.002118 
+0.001965 0.001745 -0.004134 0.005715 0.001159 -0.003017 
+0.006605 0.001189 -0.003595 0.002738 0.002132 0.001718 
+-0.002544 0.002952 0.004338 -0.004514 0.002345 0.002337 
+-0.002948 0.000005 -0.000709 0.000236 -0.001257 0.001007 
+0.003157 0.001119 0.000553 -0.000412 0.000245 -0.001927 
+-0.001461 0.000071 -0.005092 0.002615 0.001261 0.001639 
+0.002917 -0.001352 0.000506 -0.000320 -0.004388 -0.004663 
+-0.007066 -0.012578 -0.011902 -0.014608 0.010606 -0.012064 
+0.024419 0.011437 0.034353 0.050176 0.013224 0.036421 
+0.039450 0.008766 0.007232 0.008479 0.010174 -0.014392 
+-0.004090 0.000094 -0.011007 0.002375 -0.004477 -0.009965 
+-0.000783 -0.002749 -0.005336 -0.002109 0.001538 0.002530 
+-0.004209 0.006144 0.000999 -0.001942 0.004427 0.001552 
+0.005455 0.001977 0.000549 0.002375 -0.003971 -0.000098 
+-0.002086 -0.006523 -0.000323 -0.005324 -0.001969 0.000333 
+-0.006464 0.000032 0.004088 -0.005855 -0.001532 0.006567 
+-0.000480 -0.000048 0.002447 0.001010 -0.004540 -0.002182 
+-0.001322 -0.002294 -0.002579 -0.001340 -0.000950 -0.001960 
+-0.000508 0.000068 -0.000224 0.002721 0.000231 0.002419 
+0.006200 -0.000284 0.001657 0.003792 -0.002128 -0.002752 
+-0.000896 -0.002315 -0.004394 -0.000941 -0.000377 -0.002589 
+0.000906 -0.003448 0.001448 -0.004654 -0.002037 0.002911 
+-0.002357 0.000849 -0.001419 -0.000691 -0.000669 -0.003700 
+-0.000022 0.000047 -0.000101 -0.001756 0.001328 0.001771 
+-0.001844 0.001894 0.000648 -0.000859 -0.002071 -0.000478 
+0.000954 -0.006022 -0.000390 0.001098 -0.005016 0.001772 
+0.000911 -0.000011 0.000809 0.000433 0.000578 -0.000887 
+-0.000452 -0.000036 0.000343 0.000283 -0.000747 -0.000575 
+0.000440 -0.001078 -0.001387 -0.001008 -0.000512 -0.002407 
+0.003855 -0.000185 -0.003308 0.000531 0.000584 -0.002645 
+-0.001511 -0.003097 0.000633 -0.000442 -0.004957 0.000343 
+0.000936 -0.003442 0.004075 0.002094 -0.002203 -0.001484 
+0.000871 -0.005102 -0.002258 -0.001260 -0.003589 -0.003379 
+-0.001551 0.000009 0.000373 0.000263 0.002062 0.004366 
+0.003612 0.002366 0.001627 0.003832 0.004497 -0.008016 
+0.002705 0.004169 -0.014278 -0.002562 0.001142 -0.009753 
+-0.004903 -0.003238 0.001169 -0.000844 -0.006180 0.002301 
+0.001251 -0.005227 -0.000970 -0.001081 0.000458 0.000175 
+-0.004221 0.006521 -0.004681 -0.000570 0.006038 -0.005698 
+0.002833 0.000729 -0.003305 0.003331 0.000529 -0.000752 
+0.004038 0.000097 -0.001031 0.003541 0.000189 -0.003298 
+0.004387 0.002769 -0.003176 0.002852 0.002540 0.000541 
+0.003101 0.001278 -0.000556 0.002059 -0.002111 -0.000313 
+-0.000376 -0.001154 0.000722 -0.000331 0.001495 -0.003172 
+0.000182 0.003355 -0.004243 0.000826 -0.000042 -0.003496 
+-0.001487 0.001954 0.000067 0.001233 -0.010305 -0.004083 
+-0.003813 -0.035450 -0.014117 -0.009282 -0.015947 -0.030798 
+-0.006326 -0.003896 -0.013229 -0.003659 -0.000355 -0.004876 
+-0.003465 -0.002221 -0.004090 -0.008571 -0.006088 0.001522 
+-0.004490 -0.003836 0.001933 -0.001682 0.001133 0.001735 
+-0.002262 0.000508 0.002355 -0.002559 -0.001308 0.000512 
+-0.001904 -0.001750 -0.000487 -0.002578 0.004219 -0.001875 
+-0.000159 0.006984 -0.008254 -0.000665 0.004201 -0.005706 
+-0.001405 0.001322 -0.002727 -0.000800 0.000599 -0.001465 
+0.003064 0.000178 -0.002087 0.003408 -0.003264 -0.000480 
+-0.000979 -0.004376 -0.002968 -0.002306 -0.000926 -0.000928 
+-0.001819 0.000493 0.000844 -0.001458 0.001571 0.000483 
+-0.001264 0.000163 -0.000824 0.000021 -0.001249 -0.001529 
+-0.000405 -0.000003 0.000435 -0.002989 -0.001195 0.000750 
+-0.003912 -0.004543 -0.000421 -0.003138 -0.004106 0.002173 
+-0.001222 -0.000984 0.000980 0.001132 0.001468 -0.002306 
+-0.000743 0.002599 0.001360 -0.003975 0.004098 0.004221 
+-0.002510 -0.004341 0.007869 0.000196 -0.005282 0.004564 
+-0.000443 -0.003421 0.002999 -0.002096 -0.003575 -0.000037 
+-0.001582 -0.002992 -0.001295 -0.000819 -0.002606 -0.001534 
+-0.000429 -0.002851 -0.002662 -0.001078 -0.001611 -0.003501 
+-0.000876 -0.002471 -0.001193 -0.000559 -0.002050 -0.000435 
+-0.000352 -0.000245 -0.000004 0.002387 -0.000498 -0.003736 
+0.000031 -0.002089 -0.004243 -0.004104 -0.001816 -0.002137 
+-0.002522 0.001032 -0.000916 -0.002016 -0.000645 -0.003952 
+-0.000860 0.001049 -0.005465 -0.000521 0.000201 -0.000832 
+0.000671 0.001811 0.002366 0.000605 0.003092 0.002980 
+0.001760 0.005245 -0.000920 -0.000416 0.006445 -0.006081 
+-0.001504 0.003168 -0.007142 0.001173 -0.003086 -0.002716 
+-0.004216 -0.003083 -0.002210 -0.005867 -0.002661 0.003275 
+-0.005446 -0.004897 -0.000181 -0.003884 -0.006764 -0.000998 
+-0.005354 -0.010358 -0.000553 -0.012799 -0.005013 0.004428 
+-0.009542 -0.004533 -0.002090 -0.002023 0.000486 0.000326 
+0.006891 0.007692 0.000114 0.007172 0.003273 0.000593 
+0.000858 -0.002536 -0.001985 0.001413 -0.002233 -0.001331 
+-0.000182 -0.001922 -0.001567 -0.002328 0.000448 -0.000599 
+0.007848 0.007901 -0.015678 -0.007011 -0.001145 -0.003720 
+-0.001939 -0.003426 -0.003009 0.003238 0.000621 0.001143 
+0.006773 0.002608 0.004621 0.009405 0.005425 0.002742 
+-0.000818 0.001465 -0.005728 0.000399 -0.000443 -0.001897 
+0.000607 0.000025 0.002730 0.000506 0.001659 0.003747 
+-0.001327 0.001845 0.000124 -0.004080 -0.000330 0.001102 
+0.000254 0.001347 0.000927 0.001746 0.001587 0.000000 
+-0.001980 0.000557 0.000753 -0.003435 -0.001694 0.001384 
+-0.001829 -0.002940 -0.002222 -0.000991 -0.002496 -0.002239 
+-0.000356 -0.001389 -0.001050 -0.001761 0.000583 -0.001111 
+-0.003200 0.001695 -0.001801 -0.002759 0.001667 -0.002213 
+-0.001245 -0.001413 0.000886 -0.003602 -0.003533 0.000612 
+-0.004100 -0.000848 0.002120 -0.001144 0.001020 0.003818 
+0.000149 0.001051 0.001353 -0.000177 -0.001039 -0.000663 
+-0.000020 -0.002824 0.000345 0.000714 -0.000958 0.002925 
+0.002398 0.002119 0.000148 0.003675 0.001359 0.000453 
+-0.000672 0.005126 -0.007143 0.003496 0.004065 -0.006992 
+0.003710 0.003168 -0.003602 0.003634 0.000630 -0.002423 
+-0.000877 -0.001029 -0.000928 -0.004639 0.001478 0.000963 
+-0.002637 0.000512 -0.000742 -0.001484 -0.000760 -0.002389 
+0.001269 -0.000067 0.000022 0.001252 -0.002389 0.000691 
+0.001905 -0.002446 0.001373 -0.000220 -0.000774 -0.002615 
+-0.001186 -0.004661 -0.004576 0.001210 -0.004194 -0.003065 
+-0.001027 -0.005520 0.000096 0.000245 -0.005300 0.003098 
+0.000184 -0.003103 0.002870 0.001622 0.000007 -0.000006 
+0.004695 0.000708 -0.003756 0.002850 0.003563 -0.004522 
+-0.000122 -0.000085 -0.000268 0.000549 -0.001035 0.000556 
+-0.001705 -0.002685 0.004200 -0.004374 -0.003109 0.000542 
+0.000676 0.000087 0.000328 0.001917 -0.001163 0.002614 
+0.000122 -0.001045 0.002271 0.000214 -0.002971 0.002782 
+0.001056 -0.006767 0.001104 -0.000053 -0.004670 -0.001732 
+-0.002210 0.000899 -0.000819 -0.007316 -0.000187 0.001709 
+-0.009405 -0.005306 0.004748 -0.005256 -0.007983 0.005087 
+0.002353 -0.005982 0.004309 0.006970 -0.002084 -0.000288 
+0.006606 -0.000104 -0.001432 0.004353 0.002313 -0.000018 
+0.002267 0.002902 0.002005 0.002165 0.001259 0.003044 
+0.001232 0.000693 0.002524 -0.002913 0.000808 0.000455 
+-0.004466 -0.000666 0.000274 0.000330 0.001555 0.000829 
+0.003206 0.003585 -0.001818 -0.000500 -0.000763 -0.001460 
+-0.007096 -0.001649 -0.003220 -0.006531 0.001824 0.000570 
+-0.006339 0.002307 -0.003166 -0.000915 0.003892 0.006269 
+-0.000188 0.001577 0.007260 0.000720 -0.000785 0.003232 
+0.001295 -0.002008 0.000093 0.000345 0.000123 0.000844 
+0.000911 0.002743 -0.003045 -0.002155 0.005335 0.000847 
+-0.001760 0.003071 0.003221 0.001491 0.000108 0.003198 
+0.000038 -0.004651 0.004555 -0.000757 -0.002422 0.000505 
+0.000117 -0.000781 -0.001445 0.000217 -0.001121 -0.002260 
+0.002332 -0.002155 -0.000152 0.002841 -0.001652 -0.000185 
+-0.000395 -0.002319 -0.000424 -0.002194 -0.000384 0.000956 
+-0.003471 -0.000041 0.000124 -0.002997 0.000389 0.001053 
+-0.001321 0.002659 0.000009 -0.000070 0.001603 -0.001092 
+0.001382 -0.000772 0.000772 -0.000923 -0.001010 0.000749 
+-0.000093 -0.001934 -0.000735 -0.001328 0.003047 -0.002031 
+0.002159 0.004317 -0.003254 0.003230 0.003390 -0.001196 
+0.004021 -0.000993 0.000390 0.001419 -0.002936 -0.000650 
+-0.002355 -0.001162 -0.003005 -0.004881 0.001477 -0.002158 
+-0.000867 -0.002430 -0.001286 0.001399 0.003415 -0.001791 
+0.002947 0.003643 0.000418 0.000491 -0.000226 -0.000296 
+-0.000436 -0.000506 -0.002263 0.001920 -0.003246 0.001187 
+0.001039 -0.006270 0.003125 0.001930 -0.001750 0.002068 
+0.005592 0.000948 -0.005735 0.005833 0.005000 -0.005000 
+-0.000942 -0.001573 -0.001571 -0.001598 -0.005033 0.001227 
+-0.001328 -0.005500 0.004403 0.002617 -0.002120 0.000586 
+0.005327 0.000965 -0.005887 0.002329 -0.001482 -0.007520 
+0.000998 -0.001296 -0.005075 0.000787 -0.001933 -0.002147 
+0.001704 -0.002778 0.002778 0.005866 -0.003026 0.000859 
+0.005058 -0.005744 0.001267 0.002760 -0.004352 0.001531 
+0.000059 -0.002499 -0.000388 -0.001905 -0.002990 -0.002643 
+-0.000262 -0.006694 -0.001994 0.005138 -0.007347 0.001285 
+0.002458 -0.006841 -0.004170 -0.000630 -0.002789 -0.006479 
+-0.000685 0.003192 -0.003742 -0.001805 0.000836 -0.000188 
+0.000295 -0.001968 0.000689 0.005536 0.002884 0.002275 
+-0.001768 -0.000080 0.006510 -0.001111 0.000397 0.000238 
+0.000378 0.005175 -0.000070 -0.000136 0.002275 0.001143 
+-0.000408 0.000830 0.001669 -0.000426 -0.000125 0.000863 
+0.000943 0.001293 0.000798 0.001479 0.001995 -0.000383 
+0.004712 0.005437 -0.003397 0.007581 0.007928 -0.007442 
+0.004557 -0.002277 -0.005432 -0.010296 -0.000338 -0.012194 
+-0.006231 0.001020 -0.005228 -0.001654 0.000941 0.000138 
+0.000820 -0.000475 -0.000206 0.000630 -0.000541 -0.003583 
+0.000233 0.000635 -0.005612 -0.001290 0.000000 -0.006129 
+-0.000289 -0.001698 -0.001554 -0.001815 0.003225 -0.002116 
+-0.002652 0.001474 -0.001705 -0.001000 -0.001154 -0.001538 
+0.001003 -0.001485 -0.002708 0.000658 -0.002013 -0.001770 
+-0.000922 -0.000432 -0.000526 -0.001565 0.001778 -0.001082 
+-0.000316 0.001421 -0.002333 0.002476 -0.002265 0.000071 
+0.003391 -0.002310 -0.005471 0.002139 -0.000475 -0.005050 
+0.001094 -0.000671 -0.002684 0.000472 -0.000609 -0.000717 
+0.002385 -0.001233 -0.000518 -0.001086 -0.000737 -0.001604 
+-0.003265 -0.002092 -0.000334 -0.003472 -0.001404 0.001366 
+-0.003557 0.000111 0.000972 -0.003774 0.001911 -0.003751 
+0.004185 0.004870 -0.005159 0.003417 0.002833 0.000000 
+0.002033 -0.000492 0.001016 0.000940 -0.002248 0.000872 
+-0.003831 -0.001704 -0.001533 -0.000042 0.000365 0.000034 
+-0.000854 -0.001854 -0.003057 -0.001330 -0.000690 -0.000766 
+-0.002141 0.000963 0.000588 -0.002089 0.001329 0.000760 
+-0.000762 -0.000580 -0.000893 0.000563 -0.000368 -0.002771 
+0.001317 -0.001425 -0.000215 0.002303 -0.000821 0.002310 
+0.003497 0.000697 0.001619 0.003159 0.001219 -0.001109 
+0.001235 -0.000061 -0.002462 -0.002049 0.000000 -0.000164 
+-0.004228 -0.001013 0.002365 -0.001749 0.000273 -0.001011 
+0.000036 0.002004 -0.004080 0.000256 0.000373 -0.005911 
+0.001740 0.000263 -0.003941 -0.000299 -0.002821 -0.000940 
+0.000455 -0.000947 -0.001104 0.000465 -0.004030 -0.000310 
+-0.000441 -0.000904 0.000766 -0.002235 -0.001266 -0.002124 
+-0.001327 -0.001695 -0.001491 -0.001482 -0.002699 0.000037 
+-0.002040 -0.001151 -0.002834 -0.001308 -0.001525 -0.007354 
+-0.007811 0.005350 -0.002533 -0.001924 0.005203 -0.008132 
+-0.003555 -0.001390 0.000621 -0.005600 -0.001309 -0.001216 
+-0.002642 -0.001184 -0.002064 0.000697 0.001807 0.003272 
+0.001117 0.000448 0.004976 0.000536 -0.000326 -0.001368 
+-0.001975 -0.001791 -0.001440 0.001040 -0.002575 -0.002482 
+0.007518 0.000241 -0.003540 0.011031 0.003428 -0.003025 
+0.009860 0.002248 -0.002410 0.003870 0.000587 -0.004240 
+0.002304 0.002701 -0.002752 0.003265 0.001695 -0.001488 
+0.001490 -0.001863 -0.000798 0.001476 -0.000923 0.005309 
+-0.000825 -0.002117 0.010655 -0.000366 -0.003249 0.007228 
+0.003852 -0.001514 0.000102 0.006043 0.001108 -0.004885 
+0.003114 0.000415 -0.005231 -0.002382 -0.000426 -0.003157 
+-0.003617 0.000959 -0.000088 -0.002745 -0.003359 0.000549 
+-0.002361 -0.001901 -0.002606 0.000026 0.000149 0.000268 
+-0.000423 0.000419 0.000101 -0.003898 -0.002091 -0.002509 
+0.000386 -0.003163 -0.004590 0.001707 -0.002409 -0.001927 
+-0.000362 0.002065 -0.002943 -0.001430 -0.000582 0.000423 
+0.000678 -0.001496 0.001745 0.002696 -0.002430 0.000038 
+0.001293 -0.000685 0.000185 -0.001547 0.001189 0.000095 
+-0.004159 0.000973 0.001504 -0.000500 -0.000718 0.001091 
+-0.000506 -0.000579 0.000236 -0.003410 -0.003841 0.002997 
+-0.007145 -0.006050 0.004668 -0.005707 -0.005642 0.000022 
+-0.001873 -0.002127 0.000169 0.000174 0.000881 -0.002118 
+-0.000452 -0.000014 -0.000972 -0.001290 -0.001613 0.000323 
+-0.000121 -0.000038 0.000066 0.002188 -0.001021 -0.000584 
+0.000851 0.000249 -0.001226 -0.003475 -0.003389 -0.000541 
+-0.002962 -0.003104 0.000995 -0.001639 0.000583 0.000431 
+0.003031 0.002565 0.001945 0.005001 0.002753 0.001658 
+0.002313 0.000970 0.002164 0.000439 -0.000469 0.000604 
+0.000425 -0.001589 -0.000074 0.001523 -0.000843 -0.000726 
+-0.000989 -0.000824 0.000163 -0.001759 -0.002174 -0.001176 
+-0.002507 -0.001432 -0.001881 0.000446 0.000214 -0.000976 
+0.002629 -0.002136 0.001111 0.003209 -0.002373 0.003612 
+-0.001980 -0.002969 0.004338 0.001374 -0.002863 0.002634 
+-0.001507 -0.002835 0.002895 0.000888 -0.002681 0.000917 
+0.000709 -0.002662 -0.000058 0.000334 -0.001249 0.000013 
+0.000919 0.000614 0.002336 0.002078 0.001561 0.003897 
+0.001130 0.001897 0.002084 0.000043 0.001797 -0.002775 
+0.000017 0.002870 -0.003513 -0.002767 0.002895 -0.001938 
+0.000463 -0.000882 -0.001154 0.006762 -0.003456 -0.004816 
+0.011705 -0.004559 -0.006400 0.012338 -0.004138 -0.004975 
+0.002305 -0.004289 -0.005985 -0.014624 -0.011842 -0.006967 
+-0.029405 -0.013984 -0.010668 -0.026511 -0.019011 -0.024593 
+-0.033914 -0.019635 -0.014280 -0.019138 -0.014604 -0.009007 
+-0.007813 -0.005067 -0.005804 -0.007211 -0.001295 -0.001539 
+-0.009719 -0.000939 0.003825 -0.009288 -0.008039 0.004539 
+-0.006381 -0.010371 0.001464 -0.004633 -0.008319 0.001259 
+-0.005078 -0.004595 0.001857 -0.003281 -0.002285 0.000767 
+-0.000083 -0.001816 -0.000359 0.000481 -0.003473 -0.000939 
+0.001460 -0.001470 0.001491 -0.005636 -0.006400 -0.000527 
+-0.003293 -0.005376 -0.002421 -0.000623 -0.002212 -0.002772 
+0.001305 -0.003047 -0.000875 0.002902 -0.005352 0.000951 
+0.002374 -0.002830 0.000677 -0.001552 0.001293 0.001207 
+0.003803 0.003803 -0.003419 0.003964 0.006902 -0.004102 
+0.001965 0.005206 -0.003292 0.002386 0.003228 -0.000795 
+0.000413 0.002206 -0.001345 -0.001086 0.001165 -0.001698 
+-0.000144 0.000594 -0.000786 0.001435 0.000989 -0.001226 
+0.000158 -0.000475 -0.002373 -0.003362 -0.000989 -0.000593 
+-0.002906 -0.001880 0.000855 0.000467 0.000496 0.001600 
+0.002532 0.001705 0.000811 0.000484 0.000325 0.000220 
+-0.002124 -0.002533 -0.001986 -0.001464 -0.003997 -0.004206 
+0.000052 -0.002383 -0.005029 0.001667 0.000087 -0.003978 
+-0.000333 0.002039 -0.000510 -0.002101 0.000183 -0.002046 
+0.017244 -0.003713 -0.005120 -0.001202 -0.000279 -0.006449 
+-0.000290 -0.001880 -0.002008 -0.001827 -0.003461 0.000581 
+0.000889 -0.002171 0.000197 0.002243 0.000733 -0.001288 
+0.002914 0.000232 0.001612 0.001491 -0.001745 0.002952 
+0.000972 -0.003158 0.002489 0.000671 -0.002661 -0.000830 
+-0.000660 -0.001662 -0.001569 -0.003541 -0.002456 -0.001000 
+-0.001622 0.001754 -0.001243 0.000051 0.001756 -0.005335 
+0.000940 0.001441 -0.003989 -0.000889 -0.002423 -0.000189 
+0.001214 -0.000835 0.000360 -0.003561 0.000375 0.002248 
+-0.000453 -0.005075 0.001587 0.001422 -0.002223 -0.000888 
+0.000479 -0.001879 -0.000587 0.000997 -0.002139 -0.000818 
+0.000953 -0.001039 0.001528 0.000014 0.001732 0.005405 
+0.000497 0.001690 0.005347 0.000952 -0.005406 -0.004394 
+0.012513 0.007619 -0.024497 0.019262 0.005552 -0.032672 
+0.020067 0.001573 -0.026043 0.016011 -0.000229 -0.014384 
+0.009823 -0.001430 -0.011637 -0.000099 -0.004804 -0.015190 
+-0.013227 -0.006672 -0.014656 -0.016845 -0.001076 -0.008573 
+-0.013492 0.002731 -0.000186 -0.012348 0.001990 0.004387 
+-0.011537 -0.001134 0.001148 -0.009658 -0.001810 -0.005545 
+-0.008969 0.000078 -0.005735 -0.003466 -0.003062 -0.005472 
+-0.002176 -0.000324 -0.003765 -0.001395 -0.000078 -0.001456 
+0.000732 0.001094 -0.001564 0.002570 0.002023 -0.005337 
+0.003739 0.001140 -0.006654 0.003184 -0.000353 -0.005028 
+0.001416 -0.001685 -0.002492 -0.001981 -0.002681 -0.000036 
+-0.003924 -0.002474 0.005544 -0.004783 -0.003142 0.004678 
+-0.003399 -0.002138 -0.000491 -0.001341 0.000078 -0.004528 
+-0.000698 0.001628 -0.004884 -0.000928 -0.000867 -0.002986 
+-0.000674 0.000471 -0.001619 0.003994 0.004974 -0.003467 
+-0.002880 0.003585 -0.003524 0.000410 0.005210 -0.001641 
+-0.002583 -0.000542 -0.001625 -0.000250 -0.001278 -0.002175 
+0.003156 0.001554 -0.002712 0.002336 0.004208 -0.004966 
+0.001473 0.003185 -0.005733 0.001112 0.001745 -0.004433 
+-0.000031 -0.000278 -0.001141 -0.000355 -0.002916 0.002940 
+-0.000237 -0.004695 0.001641 -0.001966 -0.002543 0.002813 
+-0.000748 -0.000643 -0.003457 -0.002302 0.000879 -0.004932 
+-0.002703 -0.001085 -0.002075 -0.000138 -0.002192 -0.000181 
+-0.001385 -0.003019 0.002517 -0.004441 -0.004474 -0.000441 
+-0.002517 -0.002404 -0.002734 -0.004080 -0.002583 -0.001791 
+0.000205 -0.001217 -0.001387 0.003359 -0.000153 -0.001846 
+0.006500 -0.001691 -0.001068 0.002144 0.002059 -0.005571 
+0.006380 0.003510 -0.007922 0.002060 0.005095 -0.009214 
+0.000678 0.005748 -0.003728 -0.000536 0.001249 0.001408 
+-0.002302 -0.000580 -0.000209 -0.000385 -0.001721 -0.001532 
+0.000216 -0.002064 -0.001703 0.003492 0.000149 -0.001075 
+0.003335 0.003719 -0.001975 0.000897 0.003500 -0.001384 
+-0.001418 0.000140 -0.000528 -0.000118 -0.003165 -0.001903 
+0.000798 -0.003392 -0.003192 -0.002879 0.000730 -0.002959 
+-0.003393 -0.000893 -0.004336 -0.001863 -0.000905 -0.001870 
+0.000438 -0.003241 0.003196 0.001432 -0.005583 0.006692 
+0.000569 -0.004303 0.010287 -0.003634 0.000005 0.011614 
+-0.000990 0.000665 0.002107 0.007389 -0.000037 -0.004093 
+0.002762 0.000940 -0.003125 -0.009397 0.001484 0.002888 
+-0.019301 0.002257 0.009007 -0.022930 0.002171 0.012950 
+-0.024628 0.001807 0.013333 -0.027270 0.001384 0.010092 
+-0.017105 0.005412 0.005654 0.010016 0.008041 0.010302 
+0.024899 0.005183 0.020120 0.028066 0.003921 0.021048 
+0.024313 0.004173 0.018266 0.019134 0.003464 0.014048 
+0.016903 0.004520 0.006472 0.021176 0.011226 -0.006817 
+0.020222 0.000404 -0.018585 0.006526 -0.003889 -0.000799 
+0.004046 -0.000990 0.000283 0.007048 -0.002484 0.006841 
+0.000867 0.000799 0.003485 -0.000574 -0.001938 -0.001726 
+-0.000518 -0.005172 -0.001392 -0.002807 -0.007268 0.000760 
+-0.003741 -0.006873 -0.001429 -0.005201 -0.006002 0.004198 
+-0.003408 -0.004901 0.000074 -0.000330 -0.001918 -0.003443 
+0.000335 0.001653 -0.004258 0.001451 0.002417 0.000236 
+-0.001207 0.003017 0.003017 -0.001383 0.002336 0.002014 
+-0.004190 -0.000522 0.003837 -0.004613 -0.004658 0.001411 
+-0.004291 -0.003140 0.002086 -0.002311 -0.000221 0.001332 
+-0.000365 0.000078 0.000335 0.000286 -0.001902 0.001965 
+0.001210 -0.000944 0.000399 0.001708 -0.002986 0.001924 
+0.001218 -0.002155 0.002904 0.001268 -0.002308 0.003837 
+-0.000051 -0.003393 0.005077 -0.001268 -0.000983 0.000684 
+0.003399 0.001900 -0.000859 0.006311 0.000785 -0.002765 
+0.003256 -0.001321 -0.002174 -0.002809 -0.000067 -0.001910 
+-0.001297 -0.002037 -0.001252 -0.003388 -0.004399 0.001011 
+-0.005106 -0.002553 0.004309 -0.002809 0.000351 0.002419 
+0.001629 -0.000938 -0.001855 -0.002499 -0.001683 0.000077 
+-0.003788 -0.000547 -0.002338 -0.002203 -0.001190 -0.002222 
+-0.000782 -0.000333 -0.000598 0.000019 0.000509 0.001371 
+0.000719 0.000145 0.001216 0.001371 -0.000643 -0.000750 
+0.000529 -0.000012 0.000037 0.000636 -0.001241 -0.000565 
+-0.000731 -0.000588 -0.000137 0.002638 0.002405 -0.001919 
+0.002983 0.002898 -0.003685 0.001279 0.000797 -0.001040 
+-0.000014 -0.001871 -0.000010 -0.001003 -0.002269 -0.001687 
+0.001869 -0.002251 -0.003369 -0.002210 -0.001081 -0.000693 
+-0.002929 -0.001543 -0.001672 -0.002521 -0.002212 0.000820 
+0.000475 -0.001141 0.001076 -0.000365 0.000191 0.001869 
+-0.000360 0.002963 0.002717 0.001144 0.004574 -0.001126 
+0.004662 -0.001193 -0.004886 -0.006138 -0.009447 0.006501 
+-0.013620 -0.007490 0.010833 -0.019478 -0.001139 0.013355 
+-2.974576 0.512712 1.677966 -3.589041 1.116438 2.571918 
+-3.891986 1.250871 3.142857 -3.780269 1.058296 3.121076 
+-0.028253 0.007512 0.006783 0.018133 0.012217 0.007952 
+3.261225 1.600000 2.995918 3.410494 1.660494 3.376543 
+3.145455 1.212121 3.109091 2.797710 0.282443 2.290076 
+0.020993 -0.004004 0.015020 0.012872 -0.001981 0.007588 
+0.006841 0.005018 -0.000209 0.012045 0.003644 -0.008653 
+0.005856 0.003763 0.001829 0.002104 0.001695 0.001146 
+0.000357 -0.000995 0.000020 -0.000178 -0.005764 0.000744 
+-0.001335 -0.006312 0.000413 -0.001166 -0.003564 0.000619 
+-0.001490 -0.000631 0.000230 -0.004101 -0.000450 -0.000926 
+-0.002168 0.001041 -0.003946 -0.003065 0.001973 -0.003458 
+0.002951 0.003531 -0.000810 0.005896 0.002829 -0.005684 
+0.000602 0.002095 -0.003164 -0.002437 -0.002386 0.001317 
+-0.003101 -0.003730 0.003176 -0.001276 -0.001754 0.003125 
+-0.000833 -0.000054 0.001853 -0.002444 0.000489 0.000677 
+-0.004607 -0.001131 -0.000504 -0.003795 -0.004560 -0.000132 
+-0.001042 -0.004659 0.003114 -0.000394 -0.002814 0.006416 
+-0.000565 -0.006371 0.001452 0.002530 -0.003580 0.001522 
+0.002925 0.001958 0.002440 0.000515 0.002448 0.001683 
+0.001867 -0.000822 -0.000138 0.005142 0.000016 -0.005128 
+0.001343 0.001370 -0.001625 0.000564 0.001654 0.004012 
+-0.000323 0.002390 0.004565 -0.000340 -0.008276 0.002305 
+-0.007760 -0.003760 0.005521 -0.004264 -0.004876 0.002132 
+0.000722 -0.001766 -0.001321 -0.001191 -0.002797 -0.002953 
+0.000166 -0.003836 -0.003450 0.000180 -0.004517 -0.001979 
+-0.001608 -0.001485 -0.001267 0.000654 -0.002686 -0.003410 
+-0.000296 0.000104 -0.002375 0.002811 0.002801 -0.003166 
+0.005648 0.002348 -0.001367 0.000891 0.002670 0.002668 
+-0.002330 -0.000757 0.000560 -0.002209 -0.000663 0.000580 
+0.000456 0.000732 -0.001275 0.002775 0.001294 0.000885 
+0.001633 -0.000755 0.001949 0.000582 -0.001273 0.002362 
+-0.000146 0.000910 0.001286 -0.005484 0.003285 -0.000428 
+-0.005817 0.000109 -0.001892 -0.002534 -0.000005 -0.006794 
+0.001959 0.005283 -0.003426 0.000147 0.003831 0.002913 
+-0.000392 -0.000263 0.006086 0.003237 0.001830 0.002841 
+0.015738 0.001319 -0.008344 -0.009493 -0.012746 0.008035 
+-0.016387 -0.007490 0.009050 -2.511848 -0.227488 0.834123 
+-3.150289 0.578035 1.898844 -3.452873 1.154023 2.760920 
+-3.757256 1.437995 3.358839 -4.049774 1.393665 3.579185 
+-0.027066 0.001137 0.004903 2.613924 1.550633 2.126582 
+3.058282 1.828221 2.923313 3.210046 1.636986 3.100457 
+3.426150 1.171913 2.927361 3.425249 0.495017 2.245847 
+2.813131 -0.050505 1.166667 0.015521 -0.002122 0.006980 
+0.006671 -0.002507 0.007067 0.000770 0.000820 0.003905 
+0.004252 0.002015 -0.001373 0.009110 0.000093 -0.001414 
+0.006092 -0.002480 0.000469 -0.000245 0.002020 -0.000787 
+0.000894 0.000976 -0.000509 -0.001338 -0.001165 -0.000140 
+-0.002355 -0.002333 -0.000132 -0.002556 0.001768 -0.000982 
+0.001914 0.001161 0.000359 0.005512 0.005743 0.000313 
+0.007465 0.002929 -0.001237 0.004444 0.000690 -0.000296 
+0.002445 -0.001098 -0.000621 0.001085 -0.000052 -0.000723 
+-0.000388 -0.001103 0.000436 0.000274 -0.001229 -0.000087 
+-0.001912 -0.000440 0.002503 -0.000316 -0.002707 0.000161 
+0.000580 -0.003478 0.000000 0.000683 -0.004251 -0.001030 
+0.000592 -0.002999 -0.001677 -0.000250 0.000375 0.000874 
+-0.003482 -0.001762 0.007005 0.001690 0.001675 0.004208 
+-0.000617 -0.000736 -0.000629 -0.002052 0.000030 -0.000286 
+0.000946 0.000540 -0.003999 0.003547 -0.001383 -0.000316 
+0.006148 0.001377 0.002754 0.001797 0.000702 0.004253 
+-0.008310 -0.000530 0.002019 -0.011677 -0.007022 0.002910 
+-0.008865 -0.004858 -0.001690 -0.001249 -0.001389 -0.004095 
+-0.000942 -0.002193 -0.002637 0.001413 -0.002790 -0.000290 
+0.001704 -0.002061 0.002824 0.001382 -0.001860 0.001614 
+0.002073 -0.002409 -0.001194 0.001752 0.000440 -0.000336 
+-0.000596 -0.001723 0.002960 -0.000614 -0.003489 0.000812 
+-0.001412 0.000421 -0.003384 0.000608 0.003508 -0.003441 
+0.002221 -0.002056 -0.000511 -0.002250 -0.004913 -0.000630 
+-0.002461 0.000507 0.005334 0.000472 -0.002063 0.004126 
+0.003071 0.002550 -0.002772 0.002670 0.005849 -0.006919 
+-0.002770 0.005191 -0.005715 -0.001565 -0.000615 -0.001645 
+0.003980 -0.001973 -0.003630 0.001073 -0.000515 -0.002201 
+-0.000739 -0.000193 0.000588 -0.004485 -0.002301 -0.000275 
+-0.009451 -0.006888 0.000371 -0.018363 -0.005467 0.006784 
+-0.013284 0.002743 0.002476 0.001050 -0.002166 -0.001783 
+0.015222 -0.005909 -0.010807 0.003394 -0.012643 -0.017273 
+-0.021426 -0.002264 0.011671 -3.103961 1.113861 1.965347 
+-3.432692 1.514423 2.086539 -0.029504 0.018738 0.014822 
+0.004448 0.014871 -0.006982 0.027919 0.020988 0.005875 
+3.315000 1.600000 1.380000 2.945312 1.230469 1.648438 
+2.400000 0.745455 1.322727 0.013864 -0.000732 0.007022 
+0.008563 0.000283 0.003272 0.003925 0.001878 0.003163 
+0.001323 -0.000189 0.007558 -0.001012 -0.003865 0.000938 
+-0.000525 -0.001058 -0.000503 0.001568 -0.001410 -0.001634 
+-0.001377 -0.000949 -0.001318 -0.008064 -0.008670 0.004621 
+-0.000534 -0.009484 0.013893 -0.006912 -0.017641 0.008178 
+-0.003958 -0.009307 0.006471 -0.000002 0.001058 0.003210 
+-0.001786 0.005303 0.002164 0.000070 0.005081 0.002982 
+-0.003085 0.000297 0.001370 -0.004646 -0.005207 -0.000702 
+-0.000558 -0.005293 -0.002785 -0.000902 0.003312 -0.003990 
+-0.003293 0.001402 -0.002132 -0.006733 -0.001139 0.002378 
+0.001010 -0.002692 0.003701 0.000889 -0.001146 0.001897 
+0.000302 -0.000032 -0.000397 0.000138 -0.001038 -0.000030 
+-0.003160 -0.004784 -0.000420 -0.000142 -0.002346 -0.002638 
+0.004831 -0.000596 -0.001490 0.001223 0.000627 -0.003683 
+0.006351 0.002473 0.002534 0.003525 0.000908 0.003667 
+0.001241 0.002309 0.002128 0.004547 -0.003002 -0.002686 
+0.002615 -0.002028 -0.001049 0.001407 -0.000179 0.001008 
+-0.001327 -0.000157 -0.000060 0.000617 -0.001595 -0.001093 
+0.001180 -0.002596 -0.001430 -0.000493 -0.004638 -0.004145 
+0.003598 0.008600 -0.004256 0.006380 0.004460 -0.000260 
+0.007073 0.004277 -0.002306 0.006988 0.002410 0.001145 
+0.007414 -0.000776 -0.005948 0.004264 0.000397 -0.005818 
+-0.001180 0.002072 -0.004957 -0.001251 0.002171 -0.005529 
+-0.002373 0.000651 -0.004235 0.003259 0.000600 -0.002740 
+0.001249 -0.004257 0.004217 0.006164 -0.007485 0.004991 
+0.001441 -0.004139 0.013536 -0.011204 -0.008262 0.007903 
+-0.006382 -0.000598 -0.005333 0.004181 0.002526 -0.005100 
+0.000133 0.008182 0.000028 0.000951 0.006183 -0.001613 
+-0.000971 0.000659 -0.000503 -0.001587 -0.003598 0.003145 
+0.000367 -0.005544 -0.000109 0.000416 0.000312 -0.001299 
+0.001239 0.001626 -0.000547 0.006540 0.003913 0.000598 
+0.010100 -0.000771 -0.002607 0.006897 -0.001282 -0.004635 
+0.003461 0.001628 -0.001070 -0.000587 0.000544 -0.000694 
+-0.004095 0.004243 0.000791 -0.008978 0.002632 0.000998 
+-0.003164 0.000814 -0.007474 0.003565 -0.004016 -0.014850 
+-0.003410 -0.004196 -0.003320 -0.012662 -0.009568 -0.014613 
+-0.094814 -0.026942 -0.081117 -0.072713 -0.018660 -0.039191 
+-0.004076 -0.001725 -0.003613 0.007384 0.005854 0.001868 
+0.002156 0.001496 -0.000079 -0.006548 -0.002372 -0.000016 
+-0.008296 -0.000553 -0.000200 -0.002603 -0.000648 0.000743 
+0.001145 0.002967 -0.002394 0.003520 0.003636 -0.001354 
+0.003795 0.003208 -0.002406 0.002546 0.003308 -0.002652 
+-0.000521 0.002352 -0.003571 0.000910 0.000701 -0.000478 
+0.001745 0.001056 0.001545 0.002282 0.003013 -0.001077 
+0.003826 0.000880 -0.001944 0.000090 0.001078 -0.006646 
+-0.002963 0.000425 -0.000340 -0.002589 -0.004853 0.001480 
+-0.000632 -0.006147 0.003777 0.002347 -0.006198 0.004694 
+-0.002476 -0.001541 0.003740 0.000617 -0.001556 0.002152 
+-0.000064 0.000524 0.000597 -0.000358 0.000043 -0.000294 
+-0.000561 -0.000631 -0.001662 -0.000892 -0.001509 -0.001017 
+0.000552 0.002707 -0.001973 0.003585 0.002871 -0.003681 
+0.002830 0.002486 -0.002102 0.000071 -0.001894 0.000537 
+-0.001396 -0.000562 -0.001451 0.000763 -0.004635 -0.003862 
+0.003343 -0.006691 -0.003239 0.002727 -0.006918 -0.002975 
+0.002843 -0.005408 -0.000927 0.001588 -0.004266 0.004152 
+-0.001576 -0.002151 0.005363 -0.002353 -0.002354 0.004392 
+-0.002419 -0.004421 0.008747 -0.006536 -0.001005 0.009832 
+-0.004136 -0.003164 0.003345 -0.000277 -0.002769 -0.000092 
+-0.000388 -0.002051 0.001641 0.000462 -0.000334 0.001168 
+-0.001672 -0.003054 0.000256 0.000000 -0.003984 -0.003089 
+0.003741 0.003155 -0.002641 0.001036 0.008321 -0.004164 
+0.003290 0.007073 -0.005489 0.003917 -0.000509 -0.003095 
+0.004962 -0.002552 -0.000707 0.003252 -0.001914 0.000566 
+-0.001207 0.000671 0.002415 -0.016000 -0.001151 -0.003166 
+-0.013504 0.014379 -0.004681 -0.007029 0.012794 -0.000876 
+-0.003314 0.008186 -0.000685 -0.003518 0.002999 -0.000214 
+-0.004732 -0.000916 0.000576 -0.006526 -0.006134 0.001034 
+-0.008173 -0.005444 0.007317 -0.007203 -0.004336 0.005588 
+-0.006016 -0.004900 0.003811 -0.000332 0.000533 0.002036 
+0.000815 -0.000074 -0.000370 0.000860 0.000843 -0.003459 
+-0.001233 0.002578 -0.004224 -0.001491 0.006048 -0.002058 
+0.005123 0.006176 -0.001763 0.007886 0.002922 -0.004447 
+0.008934 0.008863 -0.007686 -0.000590 0.012883 -0.007348 
+-0.011266 0.006197 -0.009251 -0.020004 -0.004080 -0.008035 
+-0.019369 -0.000120 0.005249 -0.009711 0.006524 -0.000916 
+-0.005596 0.004710 -0.005543 -0.002001 0.000350 -0.007587 
+0.000458 -0.003588 -0.008161 0.000496 -0.003084 -0.007020 
+0.000249 -0.000091 -0.002959 0.000602 -0.001272 0.001964 
+0.001393 -0.003207 0.003126 0.000616 -0.002412 0.002510 
+-0.002177 -0.001292 0.001666 -0.001667 -0.003473 0.001239 
+-0.001034 -0.002547 0.000715 0.002824 0.001180 0.000248 
+-0.000397 0.007793 -0.005388 0.002388 0.005692 -0.006905 
+0.002642 0.000334 -0.003824 0.000324 -0.001882 -0.000857 
+-0.001783 -0.002469 0.000777 -0.002717 -0.003635 0.001634 
+0.000485 -0.004940 0.001470 -0.000770 -0.003423 0.001843 
+0.002425 0.001543 -0.000441 0.003545 0.003233 -0.003217 
+0.001225 0.000055 -0.000341 -0.000140 0.000209 -0.000770 
+-0.001811 -0.002918 0.000603 -0.001269 0.000642 -0.002106 
+0.002924 0.003523 -0.003499 0.004745 0.000472 -0.002104 
+0.002347 -0.000290 -0.003646 0.001452 -0.002117 -0.001734 
+0.000431 -0.000244 -0.000357 -0.000612 -0.000308 0.000331 
+-0.000877 -0.001718 0.003367 -0.001445 0.001760 0.002294 
+-0.002833 0.000019 0.000248 0.000404 -0.000957 -0.001190 
+0.004280 -0.002705 0.000449 0.003023 0.005004 -0.002294 
+0.004486 0.003490 0.001952 0.004665 -0.000774 -0.001146 
+0.001648 -0.000739 -0.001715 0.002884 0.001246 -0.003109 
+-0.000210 0.000821 0.000341 -0.005688 -0.000883 0.001922 
+0.000336 -0.000895 0.000842 -0.000030 -0.000151 -0.001890 
+0.006632 0.002769 -0.005467 0.004187 -0.003209 -0.004950 
+0.006219 0.001577 -0.007007 0.003865 -0.005392 -0.005724 
+0.005078 -0.008772 -0.004299 -0.007548 -0.000927 -0.010331 
+-0.018180 0.020750 -0.014931 -0.029181 0.028068 -0.021527 
+-0.025384 0.031813 -0.017795 -0.012325 0.024594 -0.009106 
+0.001446 0.011041 -0.002477 0.003427 -0.001701 0.000260 
+0.003602 -0.002615 0.003366 -0.002403 -0.005507 0.007280 
+-0.003220 -0.001515 0.000379 -0.001218 0.003430 -0.000375 
+-0.000916 0.003988 -0.001347 -0.003316 0.001402 -0.003060 
+-0.001969 0.000617 0.000664 -0.001484 -0.000234 0.001484 
+-0.000836 -0.001295 0.001452 0.000998 -0.000262 0.002227 
+0.004508 0.000787 0.002634 0.005830 0.001261 0.001787 
+0.000918 0.000894 0.000305 -0.003619 0.001012 -0.004402 
+-0.003350 0.004405 -0.006474 -0.000752 0.000082 -0.004867 
+-0.006879 0.002942 -0.001855 -0.005725 0.004562 -0.000113 
+-0.003136 0.003256 0.001618 0.000384 -0.000653 0.001438 
+0.004378 -0.001890 -0.001906 0.003810 -0.001345 -0.005073 
+0.002956 -0.001143 -0.006071 0.003631 -0.000125 -0.005131 
+0.003257 0.000217 -0.001518 0.001368 -0.001256 0.002322 
+-0.000702 -0.001660 0.003023 0.001924 0.000409 0.001725 
+0.006587 0.002430 -0.000526 0.007001 0.003645 -0.002813 
+0.002137 0.003619 -0.002949 -0.001530 0.000368 0.000500 
+-0.001127 -0.000809 0.000901 0.002169 0.002298 0.000881 
+0.004115 0.004104 -0.001387 -0.001176 0.003950 -0.000026 
+-0.002296 0.000550 -0.002872 0.000109 -0.003554 -0.000471 
+0.000693 -0.003794 -0.000205 0.002545 -0.000719 -0.001208 
+0.001891 0.000003 -0.001334 -0.000573 -0.001919 0.001196 
+-0.004556 0.001028 -0.000754 -0.006082 -0.004440 -0.002170 
+-0.001318 -0.002054 -0.003495 0.001143 0.001215 0.000651 
+0.003737 0.002436 -0.002395 0.001395 0.000193 -0.001298 
+-0.002256 -0.001314 -0.000496 -0.001726 -0.003115 0.001324 
+0.000104 0.000063 -0.000072 0.002406 0.000501 -0.001349 
+0.001306 0.001081 0.000488 -0.001196 -0.002204 0.000105 
+-0.000690 -0.002141 -0.000082 0.003371 0.000123 0.001100 
+0.002268 0.003134 0.000829 0.002569 0.000367 0.001333 
+-0.001326 0.001401 -0.000564 0.001777 0.003992 -0.001650 
+0.001254 0.002727 -0.000209 -0.001602 -0.001836 -0.003125 
+0.000090 -0.000015 -0.002698 0.000047 -0.000878 0.000948 
+0.003592 -0.002152 0.000008 0.003090 0.001757 -0.001788 
+-0.000221 0.000262 -0.001236 0.000785 -0.003688 0.001120 
+-0.001795 -0.000046 -0.000430 -0.011546 0.013326 -0.014608 
+-0.027915 0.024877 -0.021802 -3.048193 3.289157 -1.903614 
+-2.617801 2.743455 -1.486911 -0.012938 0.018748 -0.008192 
+-0.000359 0.005927 0.000312 0.003117 -0.005137 0.000642 
+0.002494 -0.004087 0.001625 -0.000835 0.000709 -0.001988 
+-0.000040 0.004935 -0.004062 -0.004214 0.003895 -0.000310 
+-0.007563 -0.000979 -0.004733 -0.008421 -0.002499 -0.001666 
+-0.002302 -0.000287 -0.000597 0.001605 0.002719 0.001496 
+0.005091 0.004891 0.000407 -0.000584 -0.000455 0.001242 
+-0.005130 -0.001331 0.004793 -0.000357 -0.004004 0.002082 
+-0.000054 0.001009 0.001193 -0.002462 0.003516 -0.004929 
+0.002031 -0.003650 -0.005877 0.000851 0.008923 -0.010467 
+-0.001276 0.002975 -0.000989 -0.002333 -0.001926 0.002925 
+-0.000534 -0.003808 0.001596 0.001459 -0.002894 -0.000386 
+0.001731 -0.001788 -0.003363 0.004294 -0.001911 -0.002100 
+0.001187 -0.004258 -0.004432 -0.000892 -0.003292 -0.006333 
+-0.003119 -0.004253 -0.004309 -0.000986 -0.001427 0.000205 
+0.000858 0.002708 -0.001174 0.001614 -0.000911 -0.002190 
+0.005445 -0.001474 0.000777 0.006028 0.001179 -0.000502 
+0.002211 0.002064 0.000090 -0.000978 0.001591 -0.000560 
+-0.002035 -0.000352 -0.000988 -0.002434 -0.002161 0.001839 
+-0.001052 -0.005276 0.004324 0.000114 -0.003493 0.003596 
+-0.000011 0.001948 0.000764 -0.001157 0.005055 -0.000410 
+0.000096 0.005041 0.000061 -0.001380 0.000791 -0.000228 
+-0.001516 0.000671 0.001895 0.000073 0.000185 -0.000346 
+0.000712 -0.001532 -0.002399 -0.001644 -0.001487 -0.002831 
+-0.001450 0.001753 -0.000712 0.000236 0.000054 -0.000107 
+-0.000382 -0.001443 0.000133 -0.000528 -0.001256 0.000254 
+0.000073 -0.000924 -0.000661 -0.000151 -0.001262 -0.002138 
+-0.000189 -0.002762 -0.001135 -0.001630 -0.002542 -0.001023 
+-0.002497 -0.002329 -0.002216 0.000390 -0.001481 -0.002937 
+0.004581 0.000678 -0.002939 0.005462 -0.000498 0.000825 
+0.002066 -0.005471 0.003725 0.002873 -0.007663 0.003307 
+-0.005052 -0.010016 0.004203 -0.006809 -0.007628 0.003885 
+-0.000838 -0.004237 0.000201 0.000263 -0.001446 0.004806 
+0.001801 -0.002204 -0.000349 0.003352 -0.001676 0.000838 
+0.000707 -0.001536 0.000860 -0.000024 -0.001018 -0.000769 
+-0.000030 -0.004160 -0.000011 -0.001544 -0.006068 -0.000837 
+0.002883 0.005297 -0.008556 -0.016463 0.026731 -0.017034 
+-2.786885 3.792350 -1.885246 -2.922414 3.681035 -1.750000 
+-2.230435 2.913043 -1.447826 -0.008084 0.017230 -0.005300 
+0.002371 0.000195 0.003636 0.002879 -0.001124 -0.003971 
+0.004480 -0.000339 0.001749 0.000291 0.000046 0.000406 
+-0.000438 0.002678 -0.003262 -0.004424 0.001922 -0.002900 
+-0.005313 0.001953 -0.002500 -0.003944 0.000068 -0.002840 
+0.000016 -0.002041 -0.002907 0.003067 0.002014 -0.004213 
+0.002033 -0.002079 0.000923 -0.000928 -0.002623 0.004680 
+0.000425 -0.000393 0.000200 -0.001028 0.000009 -0.002207 
+-0.001118 0.000771 -0.006960 0.002428 0.003172 -0.010430 
+0.003002 -0.002038 -0.005308 0.003881 0.001916 -0.005662 
+0.002746 0.000272 -0.002360 0.001254 -0.000027 -0.000936 
+0.000828 -0.000594 -0.000917 0.001123 -0.000207 -0.002828 
+-0.002402 -0.000278 -0.003788 -0.000120 -0.000240 0.000100 
+-0.001028 -0.003528 -0.001472 -0.000790 0.000210 -0.002323 
+-0.000200 0.000449 -0.001774 -0.001860 -0.000233 0.002868 
+-0.003545 -0.000451 0.003102 0.000240 0.000377 0.000533 
+0.000647 0.001115 -0.000262 0.000450 -0.000738 -0.000196 
+0.000743 -0.004249 0.000069 -0.002040 -0.006522 -0.001878 
+-0.003470 -0.003256 -0.001179 0.001298 0.000613 0.002758 
+0.003738 0.000782 0.002238 0.002325 -0.002132 0.001319 
+-0.000084 -0.003758 -0.001420 -0.001560 -0.001940 -0.000712 
+0.001085 0.002109 -0.001814 -0.001091 0.001389 -0.003266 
+0.000452 -0.001608 -0.004155 0.000000 0.001522 -0.006449 
+0.000129 -0.002138 -0.003931 0.001316 -0.000838 0.000120 
+0.002649 0.001410 -0.000880 0.000229 0.001006 0.000586 
+0.002441 -0.000850 -0.004535 -0.000764 0.000001 -0.002683 
+-0.000758 -0.001445 -0.001507 0.001064 0.000816 -0.000127 
+0.003006 0.004864 -0.001491 0.001227 0.001460 0.001502 
+-0.001922 -0.000416 0.001797 -0.000262 -0.004769 0.003593 
+-0.002171 0.000499 0.000364 -0.002152 -0.000391 0.002034 
+0.000146 -0.002222 0.002076 0.000448 0.002515 0.002358 
+0.004161 0.003993 -0.000396 0.000038 0.000511 0.000776 
+-0.001221 0.001870 0.003168 0.001874 -0.005050 0.002689 
+-0.005737 -0.003091 0.004860 -0.000840 -0.003120 -0.000840 
+-0.000524 0.000604 -0.000188 -0.001232 -0.000308 0.000635 
+-0.002132 -0.003321 0.000239 -0.000474 -0.002410 -0.001778 
+-0.003661 0.011614 -0.008585 -2.356164 3.541096 -1.602740 
+-2.804545 4.250000 -2.045455 -2.309160 3.732824 -1.858779 
+-1.337607 2.619658 -1.329060 -0.004011 0.007994 -0.002721 
+0.004034 -0.007173 0.004885 -0.002235 -0.011062 0.006302 
+-0.000216 -0.003591 0.000732 0.004015 -0.000485 -0.001090 
+0.001231 -0.001296 -0.001968 0.001376 0.002717 -0.003694 
+-0.002937 0.002254 -0.001459 -0.003946 0.001973 -0.001315 
+-0.002823 0.002529 -0.000361 0.000065 0.004510 -0.002153 
+0.000557 0.003593 -0.002213 -0.001984 -0.001132 -0.002494 
+-0.000596 -0.003052 -0.001661 -0.002027 -0.002920 -0.004483 
+-0.000215 -0.004956 -0.009032 0.003680 -0.004900 -0.009693 
+0.008326 0.001780 -0.007906 0.006798 0.001046 -0.000923 
+-0.002458 0.004381 0.002426 -0.000450 0.000947 -0.001011 
+0.000151 -0.002746 -0.004075 0.001080 -0.003026 -0.002956 
+0.000545 -0.001360 -0.001267 -0.002026 0.000129 -0.000955 
+-0.002320 -0.000118 -0.000829 -0.001539 0.000772 -0.002317 
+-0.002729 0.001213 -0.002729 -0.004442 -0.000206 -0.002376 
+-0.003168 0.000703 -0.001358 0.000336 0.001671 -0.000735 
+0.002716 -0.000080 0.000345 0.002544 -0.003180 0.002642 
+0.002463 -0.003516 0.001570 -0.000219 -0.000112 -0.000050 
+-0.002958 0.005688 -0.001415 -0.000623 0.006981 0.000396 
+-0.001705 0.002413 -0.001963 0.001504 -0.002146 0.000889 
+0.002800 -0.003496 -0.001283 0.001623 -0.002064 0.003326 
+-0.000729 -0.000674 0.002525 -0.000443 0.000400 -0.000512 
+-0.001150 -0.002000 -0.000288 -0.000947 -0.004735 0.002576 
+0.002000 -0.000308 0.003385 -0.000739 -0.001280 0.003892 
+-0.001342 0.001399 0.000314 0.000020 -0.000111 -0.000003 
+-0.001957 -0.004266 0.004574 -0.004406 -0.008184 -0.001258 
+-0.003533 -0.005649 0.001737 -0.004313 -0.001985 -0.000391 
+-0.000861 -0.001054 -0.000224 0.001885 0.000532 -0.000443 
+0.003634 -0.000765 0.000364 0.002819 -0.001954 0.001767 
+-0.002093 -0.004994 0.006201 0.000319 -0.006040 0.000710 
+0.001479 -0.004060 0.001156 -0.000538 -0.001259 -0.001410 
+0.003109 -0.000387 0.000043 0.000515 0.000887 0.003453 
+-0.001187 -0.004981 0.007350 0.003009 -0.003339 0.001607 
+-0.001886 -0.000691 0.001249 -0.001253 0.000053 -0.002613 
+-0.000474 0.002841 -0.004640 0.000363 0.003525 -0.002035 
+0.000275 -0.001832 0.000214 0.003104 -0.002627 0.003176 
+-0.003734 0.014926 -0.002277 -1.868263 3.958084 -1.622754 
+-2.365854 4.296748 -1.922764 -2.065134 3.731801 -1.754789 
+-1.076923 2.586539 -1.259615 -0.003516 0.005973 -0.002804 
+0.003277 -0.006003 0.005328 0.002524 -0.006932 0.006166 
+-0.000097 -0.002603 0.003940 0.003589 -0.001657 0.003310 
+0.003036 -0.005298 0.006529 0.000892 -0.007834 0.003383 
+0.001313 -0.003711 0.007108 -0.002771 -0.001885 0.003079 
+-0.002001 -0.001185 0.001695 -0.001480 -0.000790 0.001316 
+-0.000488 -0.002555 0.001217 0.001516 -0.003398 0.001088 
+0.001978 -0.001117 0.001457 0.000603 0.001975 -0.001607 
+0.002140 -0.000150 -0.004851 0.002933 -0.002244 -0.005628 
+0.004068 -0.000551 -0.003798 0.005231 -0.000329 0.001881 
+0.003626 -0.001535 0.003592 0.003389 -0.002421 0.001748 
+0.002387 -0.002201 -0.000482 0.001707 -0.000966 -0.002879 
+0.002654 0.000846 -0.003153 0.003371 -0.001216 -0.001078 
+0.003337 -0.001428 0.000396 0.003073 -0.000493 0.000938 
+0.001726 -0.000475 0.001288 0.000985 0.000137 -0.000685 
+0.002456 -0.000777 -0.002005 0.002080 0.005966 -0.004521 
+0.001818 0.003839 -0.002643 -0.000492 -0.008013 0.003205 
+-0.005572 -0.014281 0.007066 -0.008691 -0.009267 0.002209 
+-0.007970 0.004205 -0.002510 -0.003488 0.013708 -0.000502 
+0.005161 0.003065 -0.003028 0.000409 0.000183 0.000145 
+0.000658 -0.002271 0.000710 0.001823 0.002008 -0.001325 
+0.001366 0.004148 -0.001384 0.000061 0.000110 -0.002061 
+-0.001473 -0.002886 -0.000060 -0.001316 -0.001521 0.002343 
+0.000972 0.001447 0.001037 0.000581 0.000570 -0.001545 
+-0.001651 -0.000179 0.001551 -0.004728 -0.005697 0.005051 
+-0.004320 0.000449 0.001009 -0.000036 0.000093 0.000500 
+0.000334 0.001938 -0.000769 -0.001687 0.001046 0.000011 
+-0.001415 -0.000935 -0.000392 0.002039 0.000706 0.002526 
+0.001681 -0.000914 -0.000249 0.000091 0.000399 -0.003314 
+-0.001102 -0.001754 -0.002004 0.001689 -0.002659 0.001683 
+0.001652 -0.004808 0.003835 0.005089 0.000000 0.001518 
+0.008385 0.003776 -0.003099 0.004623 0.002960 -0.000951 
+-0.000830 0.000501 -0.000588 -0.000301 -0.001318 -0.002105 
+-0.001194 -0.002090 0.000000 0.000779 -0.000280 -0.002379 
+-0.000288 -0.000414 -0.001210 -0.002151 0.004453 -0.003321 
+-0.000548 -0.000761 -0.001182 0.001158 -0.000165 0.006273 
+-0.004069 0.019163 0.000783 -1.492147 3.879581 -1.068063 
+-1.767068 3.943775 -1.248996 -1.589958 3.271966 -1.133891 
+-0.009881 0.018705 -0.006927 0.000583 -0.001068 0.001824 
+0.004517 -0.011327 0.009173 0.001774 -0.003013 0.002882 
+0.001031 -0.000373 -0.002663 0.002313 -0.004234 -0.001566 
+0.005359 -0.008039 0.003852 0.002538 -0.008938 0.003517 
+-0.002211 -0.006262 0.004534 -0.003917 -0.001775 0.004743 
+-0.000399 -0.000381 -0.002566 -0.002125 0.000894 -0.002863 
+0.000213 -0.000166 -0.000486 -0.000286 -0.000902 -0.002000 
+-0.000768 -0.002427 -0.003679 -0.000387 -0.001795 -0.003867 
+-0.001257 -0.001637 -0.000380 0.000117 0.000245 0.000193 
+0.003341 0.001033 0.000313 0.005043 0.000134 0.000957 
+0.002565 0.000016 0.001972 0.000451 0.000980 0.001075 
+-0.000863 -0.000082 -0.000841 -0.001499 -0.002641 -0.001630 
+-0.000677 -0.005062 -0.001520 0.002552 -0.005260 -0.000677 
+0.005919 -0.000784 -0.002649 0.005001 0.002562 -0.002262 
+0.000028 0.000085 0.000114 -0.000293 0.000579 0.001875 
+-0.000335 0.000012 -0.000184 0.001167 0.000825 0.000297 
+0.005478 0.002688 -0.001991 0.003946 -0.004745 0.001562 
+0.003302 -0.003835 0.001485 -0.001786 0.003716 -0.002422 
+-0.002378 0.013871 -0.006268 -0.000222 0.021656 -0.006164 
+0.005833 0.015464 -0.000167 0.002370 0.002954 0.001979 
+0.000848 -0.002116 0.002355 -0.001649 0.002596 0.001248 
+0.001005 0.000532 0.000612 -0.000650 -0.003393 0.002370 
+-0.004192 -0.003087 0.002176 -0.000977 -0.000940 -0.000640 
+-0.000597 -0.000434 -0.000759 0.001319 0.000006 -0.001978 
+-0.001475 -0.004231 0.000553 -0.001923 -0.004065 0.002710 
+0.000462 -0.000231 -0.001846 0.000555 -0.000999 -0.001610 
+0.002085 0.000947 0.000351 0.001975 0.003883 -0.002656 
+0.001213 -0.001653 -0.002790 0.003897 -0.001079 -0.005115 
+0.002817 -0.001267 -0.004487 0.001908 -0.002171 -0.001503 
+0.001995 -0.001628 0.001197 0.001468 -0.000608 0.001975 
+-0.000185 -0.000088 0.000006 -0.002041 0.000480 0.000395 
+-0.002371 -0.001378 0.002065 -0.003516 -0.002485 0.001192 
+-0.003295 0.000524 -0.000895 -0.002152 -0.004757 0.001485 
+-0.002691 -0.004950 -0.001827 -0.000049 -0.001398 -0.000564 
+-0.000529 0.001098 0.000336 0.000135 -0.001227 -0.002616 
+0.003692 -0.008195 -0.001457 0.001677 -0.002518 0.003728 
+-0.008804 0.027680 -0.001803 -1.263682 4.019900 -1.104478 
+-1.502128 3.663830 -0.974468 -1.365385 2.519231 -0.725962 
+-0.002225 0.006091 -0.004138 0.007264 -0.017991 -0.001243 
+0.007663 -0.011274 0.001634 0.002990 -0.002348 0.002088 
+-0.002896 -0.003914 -0.000326 -0.000941 -0.012618 0.004791 
+0.002667 -0.008000 0.004737 0.000666 0.002176 -0.002004 
+-0.003602 0.004496 0.001242 -0.000853 0.001092 0.002081 
+-0.003214 -0.004597 -0.000390 -0.000392 -0.000023 -0.000280 
+0.000287 0.001180 -0.002240 0.000070 -0.000235 -0.001729 
+-0.001052 -0.002471 0.000196 0.000057 0.000025 0.000294 
+0.002182 0.000563 -0.003138 0.003070 0.000248 -0.003699 
+0.000663 -0.000028 -0.002103 -0.001032 -0.000019 0.001117 
+0.001232 -0.001759 0.001441 0.000541 -0.003498 -0.000864 
+0.000260 -0.000726 -0.003123 0.002944 0.000646 -0.002431 
+-0.000279 -0.001366 -0.000307 -0.002513 -0.002782 0.000449 
+-0.000774 0.000105 0.000206 0.000471 0.002734 0.000559 
+0.000326 -0.001294 -0.000618 0.000022 -0.000139 -0.001648 
+-0.004867 -0.007423 0.002040 -0.001852 -0.000878 0.005021 
+-0.000819 -0.002215 0.000800 -0.001160 -0.005453 -0.001316 
+0.004304 -0.003952 -0.006324 0.006295 0.013755 -0.005176 
+0.002528 0.029024 -0.010504 -0.001603 0.035891 -0.013481 
+-0.005174 0.029015 -0.008737 -0.002651 0.001693 0.000999 
+-0.004845 -0.008653 0.003429 -0.000638 -0.006174 -0.000276 
+0.000732 0.000358 -0.000208 0.000553 0.002272 -0.001042 
+-0.000491 -0.000089 -0.002143 -0.004273 -0.002985 -0.001095 
+-0.006442 -0.003488 0.002147 -0.001699 0.000490 -0.000643 
+0.001535 -0.002842 0.005341 0.000726 -0.001597 0.003194 
+-0.000647 -0.004000 -0.003275 -0.002159 -0.000892 -0.004168 
+0.000105 -0.000148 -0.000075 0.000367 -0.002191 -0.000007 
+0.000119 -0.004872 -0.000380 0.001786 -0.002545 -0.002545 
+0.001720 -0.003244 0.001535 0.000414 -0.003520 0.004972 
+-0.004371 -0.001365 0.004008 0.002399 -0.004481 0.001879 
+-0.000535 -0.001722 0.000308 -0.000554 0.001500 -0.001786 
+-0.000160 0.000198 0.000107 -0.000455 -0.003180 -0.000682 
+0.000009 -0.001950 0.000481 0.002118 0.001873 -0.000950 
+0.004116 0.005442 -0.002790 0.000443 0.004434 -0.007094 
+-0.002632 0.002292 -0.001919 0.002015 -0.003604 -0.003412 
+0.008091 -0.005225 0.001689 0.004249 0.002668 0.005415 
+-0.007445 0.028151 -0.000344 -1.248756 3.333333 -0.651741 
+-1.260664 2.943128 -0.829384 -0.008733 0.017694 -0.005341 
+0.002503 -0.005487 -0.001782 -0.003117 -0.014836 -0.003275 
+0.004384 -0.004363 0.005069 0.001378 -0.001073 0.004161 
+0.000499 -0.006182 0.005351 0.001041 -0.009938 0.004621 
+0.002231 0.000025 0.000074 0.000619 -0.001538 0.001298 
+-0.003193 -0.001368 0.003306 -0.004669 -0.003691 0.002445 
+-0.002477 -0.000044 0.000689 0.000745 0.001731 -0.000060 
+0.001712 0.001927 -0.000786 0.003385 0.000923 -0.001231 
+-0.000181 0.000207 -0.000568 0.000285 0.000197 0.000112 
+0.000238 -0.000162 0.000521 0.001076 0.000448 0.000346 
+0.003224 0.001032 -0.000903 0.003263 -0.000275 -0.000791 
+0.002246 -0.003098 -0.000465 0.000678 -0.005687 -0.001398 
+0.000583 -0.003307 -0.003893 0.003460 0.001966 -0.006763 
+0.003236 0.006197 -0.003868 0.005276 0.003653 -0.001624 
+0.003796 0.000134 -0.006415 0.006365 -0.000886 -0.005882 
+0.003961 -0.000699 -0.007289 0.002632 -0.004333 -0.002106 
+-0.001288 -0.003202 0.002650 0.000501 0.002407 0.000292 
+0.002414 0.002963 0.002226 0.003431 -0.000614 -0.004189 
+0.001432 0.001811 -0.006643 0.002223 0.020633 -0.009331 
+-0.123529 3.647059 -1.158823 -0.285714 4.627329 -1.322981 
+0.000076 0.043596 -0.017527 -0.004161 0.010867 -0.002128 
+-0.011240 -0.012314 0.009604 -0.002599 -0.006027 0.005416 
+-0.002593 0.001720 0.001692 -0.001591 0.005709 -0.000982 
+0.000495 0.000652 -0.000255 -0.001586 -0.003024 0.003180 
+-0.004824 -0.004739 0.003423 -0.001301 -0.008871 0.000834 
+0.004907 -0.008599 0.001239 0.000568 -0.009264 -0.002360 
+0.002148 -0.002991 -0.002685 -0.001111 -0.001324 -0.001766 
+0.000578 -0.001232 -0.000251 0.002097 -0.002285 -0.001432 
+0.002943 -0.000626 -0.002673 0.001848 -0.000417 -0.002803 
+-0.000373 0.000149 -0.001119 -0.000317 -0.002857 0.000229 
+-0.000202 -0.000369 -0.001164 -0.001690 -0.000841 -0.001968 
+-0.001282 -0.002152 -0.001648 -0.000140 -0.001224 -0.003410 
+-0.000902 -0.001198 0.004495 -0.000952 -0.001746 0.000000 
+0.000295 -0.000260 0.000009 0.001012 -0.001488 0.000995 
+0.001382 -0.004095 0.001213 0.000448 -0.002910 0.000149 
+0.001403 -0.002273 0.002537 0.003924 -0.007043 -0.000866 
+0.009333 -0.006552 0.001036 0.001492 0.016155 0.004353 
+-0.009872 0.033836 -0.002306 -1.400990 3.346535 -0.227723 
+-0.011308 0.026555 -0.004813 -0.003364 0.010484 -0.005331 
+0.003594 -0.011792 -0.001961 0.008233 -0.003214 0.000433 
+0.000409 -0.000196 0.001934 -0.001436 0.000041 0.001026 
+0.004176 -0.003944 0.000866 0.004975 -0.005377 0.001357 
+0.000914 -0.000256 -0.001309 -0.000222 0.003236 -0.001437 
+0.000456 0.001966 -0.001289 0.000347 -0.000472 -0.000848 
+-0.002767 0.000075 -0.001008 -0.005524 -0.001103 -0.000020 
+-0.004939 -0.004755 -0.000246 0.000388 -0.004457 -0.003682 
+0.000698 0.000946 -0.002837 0.002171 0.000000 -0.003101 
+0.003411 0.000930 -0.002171 0.004923 -0.000169 -0.000508 
+0.003947 -0.000341 -0.001985 0.002030 -0.001769 -0.002146 
+0.000612 -0.002677 -0.001729 0.000539 -0.001925 -0.001050 
+0.000728 0.000832 -0.003259 0.005256 0.004438 -0.004578 
+0.003117 0.006346 -0.001809 -0.000063 0.003267 -0.001894 
+-0.001081 0.000077 0.000267 -0.004511 -0.003139 -0.001504 
+0.000323 -0.003811 -0.006912 0.002910 -0.004200 -0.005501 
+-0.000382 -0.000802 -0.000688 -0.003295 0.002791 0.003295 
+0.000343 0.000556 0.000495 -0.003988 -0.006742 -0.005413 
+-0.002334 -0.009551 -0.006856 0.002512 0.014020 -0.008766 
+0.173469 3.530612 -0.862245 -0.133663 4.787129 -1.089109 
+-0.158537 5.390244 -1.530488 0.000743 0.031932 -0.014586 
+-0.006537 -0.007573 0.001246 -0.003697 -0.007690 0.004574 
+0.000066 0.002236 -0.000856 -0.000479 -0.000127 -0.002464 
+-0.001661 0.002576 -0.001430 -0.000178 0.001954 -0.001020 
+0.001222 0.002722 0.002389 -0.002208 -0.000572 0.006935 
+-0.008689 -0.004467 0.009622 0.001977 -0.002600 0.008744 
+-0.000201 0.000482 0.001493 0.004988 0.001582 -0.003406 
+0.001021 -0.001885 -0.003457 0.001742 -0.003919 0.004000 
+-0.005285 0.001839 0.001533 -0.005112 0.000428 0.002558 
+0.001072 -0.001186 -0.001001 0.004365 0.000556 0.001905 
+0.006967 0.003987 -0.000755 0.003240 0.005048 0.000177 
+-0.000363 0.000314 -0.000230 0.001654 -0.001429 0.000927 
+0.004252 0.000354 0.000591 0.004961 -0.000280 0.001962 
+0.000420 -0.002546 0.002651 -0.001366 -0.006978 0.001440 
+-0.001216 -0.004765 0.000351 -0.002883 0.000638 0.000453 
+-0.000841 0.000355 0.002233 0.001060 -0.009160 0.004003 
+0.001521 -0.004247 0.000220 -0.003099 0.025870 0.005685 
+-0.763006 3.693642 0.046243 -0.837563 3.335025 -0.045685 
+-0.008232 0.018458 -0.002219 0.001018 -0.002878 -0.002801 
+0.003091 -0.014489 -0.002549 0.004552 -0.003462 -0.002564 
+0.000649 0.002885 0.001502 0.002063 -0.001755 -0.001570 
+0.004202 -0.005144 -0.000906 0.000926 -0.002946 -0.001262 
+-0.000485 0.000539 -0.001458 0.000848 -0.000691 -0.001099 
+0.004196 -0.000921 -0.001569 0.001692 0.000657 -0.001616 
+-0.000367 0.001187 -0.000181 -0.003443 -0.001042 -0.001600 
+-0.002275 -0.003276 -0.001412 -0.001265 -0.003042 0.001657 
+0.001307 -0.002840 0.004073 0.002217 0.000554 0.001504 
+0.001598 0.001043 0.001334 0.004053 -0.000455 -0.001539 
+0.003989 0.000011 -0.005916 -0.001156 0.002116 -0.001309 
+-0.001325 -0.001108 -0.002610 0.000100 0.000023 0.001109 
+-0.001157 -0.001955 0.002906 -0.002789 -0.002800 0.000931 
+-0.004153 -0.004784 -0.000151 -0.005335 -0.005776 0.000118 
+-0.005104 -0.005448 -0.001701 -0.000465 -0.000794 -0.004710 
+0.000289 -0.000950 -0.000540 -0.003195 -0.004793 0.003846 
+0.000171 -0.001789 0.006386 -0.003318 0.002488 0.005255 
+-0.001747 -0.002533 -0.000167 -0.004625 -0.011209 0.003390 
+0.000202 -0.020471 -0.004757 0.001304 0.003719 -0.004148 
+0.179612 3.048544 -0.436893 0.313559 4.817797 -0.762712 
+0.457944 5.588785 -1.088785 0.611511 5.014389 -1.093525 
+0.004419 0.005913 0.000615 -0.004901 -0.010911 0.007250 
+0.000208 -0.002981 0.002841 -0.000152 0.000879 0.001152 
+0.000390 0.000078 -0.001053 0.000356 -0.000324 -0.000874 
+-0.000676 -0.000973 -0.000560 -0.002929 -0.007416 0.001433 
+-0.003482 -0.013339 0.002517 -0.006319 -0.010421 -0.000195 
+-0.004322 -0.003919 -0.000711 0.000255 -0.000067 0.000110 
+0.001643 -0.002703 0.001269 0.001738 -0.000301 -0.002596 
+0.003972 0.008264 -0.000319 -0.001346 0.004148 -0.000165 
+0.000121 -0.001587 0.001836 0.002857 -0.003759 0.000902 
+0.000957 0.000186 0.001648 0.000432 0.001868 0.001263 
+-0.000487 -0.001140 0.003980 -0.005316 -0.004727 0.004556 
+-0.001967 -0.001022 -0.000413 -0.002566 0.000000 0.000285 
+0.000454 -0.000540 -0.001002 0.001038 -0.001245 0.000565 
+-0.002438 -0.001656 0.003493 -0.000455 0.000532 0.001939 
+0.003534 -0.011505 -0.000527 -0.001208 -0.018114 -0.001359 
+0.007144 0.000455 0.005378 -0.005419 0.031919 0.008621 
+-0.994413 3.882682 0.284916 -1.192708 3.036458 0.406250 
+-0.008893 0.012616 0.004154 0.003103 -0.007776 -0.002160 
+0.003375 -0.012672 -0.003553 0.001217 -0.003558 -0.005523 
+-0.000109 -0.002903 -0.003559 0.000236 -0.007055 -0.003134 
+-0.001719 -0.005126 0.000233 0.002266 -0.000762 -0.004454 
+-0.002345 0.001464 -0.002862 -0.001773 0.000758 -0.001652 
+0.000860 0.000210 -0.003190 0.002189 0.003137 -0.004202 
+0.001985 0.004976 -0.003648 -0.000889 0.003170 -0.001902 
+-0.003041 -0.001329 -0.000428 -0.001194 -0.002411 0.000003 
+0.001206 -0.001130 0.000535 0.000914 0.000137 0.000765 
+-0.000375 0.000242 -0.000872 0.000026 0.000175 -0.000009 
+-0.001034 0.001227 -0.001960 -0.000270 0.000813 -0.002427 
+0.001719 0.000306 -0.001619 0.001167 -0.000434 -0.000671 
+0.001399 -0.000590 -0.001197 0.002192 0.000453 -0.001209 
+-0.001497 0.003945 -0.002418 -0.001587 0.001506 -0.004192 
+-0.003943 -0.002102 -0.002578 -0.003524 -0.006245 -0.002980 
+-0.002992 -0.008251 -0.001617 -0.000667 -0.006559 0.002376 
+0.001357 -0.003760 -0.000729 -0.000154 0.001204 -0.002074 
+-0.000906 0.000837 -0.002754 -0.003289 -0.006782 0.002067 
+-0.000520 -0.015022 -0.005246 0.001894 0.005695 -0.003392 
+0.544041 3.170985 -0.652850 0.484979 5.064378 -1.068670 
+0.580786 5.917030 -1.423581 0.598802 5.562874 -1.604790 
+-0.000358 0.022021 -0.008557 -0.003824 -0.008357 0.000981 
+-0.001836 -0.001925 -0.002764 -0.002242 0.005937 -0.001705 
+-0.000514 0.004857 -0.000257 0.000804 -0.000086 0.000689 
+0.001654 -0.003288 0.001164 0.000271 -0.004161 0.001644 
+-0.000450 -0.003455 0.002552 -0.001694 -0.000028 0.001639 
+-0.000117 0.001170 0.000700 -0.003027 0.001304 0.000465 
+-0.000942 0.000346 -0.000208 0.000645 -0.000258 -0.000244 
+-0.000382 0.001485 -0.000203 -0.001252 0.002577 0.000098 
+-0.001692 0.000814 -0.000204 0.001454 -0.001098 0.000631 
+0.003233 -0.001961 0.000396 0.001088 -0.002828 0.000217 
+0.000191 -0.003112 0.001674 -0.001058 -0.004595 0.005190 
+-0.019612 0.004897 0.009331 -0.012291 0.002304 0.012416 
+0.002362 0.001787 -0.003413 0.002704 0.004040 0.001135 
+0.003542 -0.001355 0.000811 0.001179 -0.001325 0.001689 
+-0.001106 -0.000042 -0.000842 -0.007896 -0.000738 -0.003122 
+-0.022693 -0.015596 0.008667 -0.029798 -0.025527 0.013837 
+-0.024071 -0.019420 0.005525 -0.000126 -0.002077 0.000452 
+0.025856 -0.016661 0.003615 0.044181 -0.028959 -0.009226 
+0.019975 0.004391 0.021024 -0.010140 -0.013109 0.028319 
+-0.033529 -0.018251 0.013037 0.000415 0.011014 -0.003302 
+-0.004668 0.005763 0.002204 -0.009805 0.001541 0.002560 
+-0.001176 0.003944 0.000732 -0.000710 0.000481 0.000513 
+-0.000288 -0.000564 0.000204 0.000219 0.001758 -0.000293 
+-0.000048 0.003452 -0.000470 0.000596 0.002349 -0.000172 
+0.001701 -0.001049 0.000577 0.001689 -0.004161 0.000352 
+0.000203 -0.004270 -0.001342 0.007703 -0.000650 -0.003361 
+0.005910 0.000806 -0.002683 -0.000483 -0.004268 0.000950 
+-0.004612 -0.008941 0.001392 -0.004193 -0.007101 -0.000394 
+-0.000312 -0.002377 -0.000572 0.002948 0.000799 0.000494 
+0.002594 0.001783 0.000874 0.002457 -0.000755 0.001540 
+0.002778 -0.010854 0.003289 -0.012486 -0.032558 -0.008316 
+0.002240 -0.006717 -0.000706 0.012580 0.021168 0.002474 
+0.015926 0.025642 0.002781 0.000526 -0.002915 0.000293 
+-0.005169 0.007245 -0.000494 -0.006236 0.013839 -0.000190 
+-0.005308 0.006205 0.000645 -0.000308 -0.002363 -0.000311 
+0.007717 -0.010721 0.004593 -0.010875 -0.022484 0.002677 
+-0.062936 0.115407 -0.001163 -0.051000 0.018494 0.021576 
+0.005272 -0.014359 -0.007869 0.043024 0.116488 -0.005073 
+0.036898 0.040939 -0.036163 -0.000169 0.008437 0.006374 
+-0.011362 0.007875 0.001773 0.005122 0.015712 -0.002519 
+0.017471 0.020120 -0.007226 0.014224 0.014024 -0.007901 
+-0.002105 0.010839 -0.007646 -0.030763 0.008251 0.000693 
+-0.012736 0.003196 0.000616 0.027374 0.005172 0.022986 
+0.017026 -0.001057 0.015196 0.004018 0.003142 0.004727 
+-0.001489 0.003820 -0.001193 -0.004138 0.004166 -0.004128 
+0.001546 0.003407 -0.004324 -0.003520 0.002975 -0.003694 
+-0.002466 -0.001008 -0.001963 -0.005048 -0.003679 0.003267 
+0.001605 0.000631 0.006708 0.005782 0.005709 0.007265 
+0.005133 0.007067 0.008340 0.004660 0.006257 0.005974 
+-0.007055 -0.000133 0.015770 -0.000900 -0.001771 0.005552 
+0.002760 0.004579 -0.000950 -0.000489 -0.000395 -0.002314 
+0.005848 0.004052 0.000637 0.005363 0.009029 0.000642 
+0.006102 0.008158 -0.003585 0.000711 0.002881 -0.002527 
+-0.004748 -0.001181 0.000093 -0.006877 -0.004646 0.000931 
+-0.005758 -0.008882 0.001705 -0.004188 -0.025812 0.008175 
+0.000863 -0.066835 0.022187 0.023568 -0.078450 0.023257 
+-0.027377 0.166064 0.031573 0.016808 0.019614 -0.015757 
+-0.000317 0.009356 -0.002163 0.004775 0.002883 -0.001261 
+-0.004382 -0.005644 -0.000303 0.003171 0.006193 -0.002151 
+-0.007656 -0.000947 0.005332 -0.004744 -0.005274 0.003575 
+0.005231 -0.000645 -0.004441 0.010155 0.001792 -0.002340 
+0.003539 0.002525 0.000267 -0.002667 0.001271 -0.000271 
+-0.004856 -0.000047 -0.001160 -0.004340 -0.002602 -0.001394 
+-0.002482 -0.006019 0.000051 -0.000015 -0.005290 -0.000824 
+-0.000252 -0.002099 -0.000769 0.000203 -0.001095 -0.000536 
+0.000626 -0.002037 -0.000663 0.000267 -0.002768 -0.000796 
+-0.000819 -0.001944 -0.000974 -0.000725 0.001040 0.000501 
+-0.000133 0.001436 0.000776 0.001539 -0.000847 0.000025 
+0.003113 -0.004551 0.000073 -0.013026 -0.018506 -0.003592 
+-0.007017 -0.003972 0.001445 0.000387 0.001770 -0.000315 
+0.000082 0.004076 -0.001260 -0.003265 0.003894 -0.000789 
+-0.002583 0.005234 0.000405 -0.005602 0.012962 0.001787 
+-0.011155 0.015739 0.001928 -0.027496 -0.000391 -0.001342 
+-0.030769 -0.026914 -0.001682 -0.025323 -0.013267 0.018668 
+-0.044321 -0.034751 -0.002014 -0.091111 -0.079956 0.011422 
+-0.066923 -0.027692 -0.006923 -0.032451 -0.027321 0.027738 
+-0.042248 -0.002125 0.022816 -0.021809 -0.034855 -0.016032 
+-0.033657 -0.014138 0.007078 -0.029994 -0.003483 0.009764 
+0.045994 0.008271 -0.008904 0.059779 0.064950 -0.023288 
+-0.001600 0.043815 -0.032325 -0.024025 0.021300 -0.032000 
+0.001220 -0.003886 0.014864 0.007448 -0.006800 0.013301 
+0.001125 -0.001657 0.000724 0.000493 -0.001429 0.000285 
+-0.000173 0.000586 -0.000284 -0.000973 0.000478 -0.002875 
+-0.000610 -0.001152 -0.000435 -0.002251 0.002442 -0.000479 
+-0.001454 0.000756 -0.000905 -0.002282 -0.001863 0.003095 
+-0.001518 -0.002559 0.001479 0.006103 0.003860 0.003264 
+0.008297 0.004638 0.006013 0.006330 0.002199 0.003612 
+0.002530 0.001660 -0.004388 0.001389 0.003957 -0.001074 
+-0.001717 -0.000785 -0.002477 -0.000422 0.000177 -0.000878 
+0.000924 0.002777 0.001026 0.006795 0.000490 -0.005532 
+0.006032 0.002662 -0.003521 0.001544 0.000150 0.000247 
+-0.001147 -0.002961 0.002195 0.001114 -0.002337 0.002352 
+0.004536 0.002933 0.000936 0.002235 0.000864 0.000522 
+0.001386 -0.012562 0.005451 0.003582 -0.044842 0.019255 
+-0.054002 -0.024043 0.007851 0.032374 0.026798 -0.004444 
+0.024195 0.022188 -0.002363 -0.004776 -0.005262 0.001419 
+0.004523 -0.000896 -0.000859 0.006822 0.011413 -0.008160 
+-0.009710 -0.001414 0.004260 -0.008069 -0.009019 0.001870 
+0.005038 0.000929 -0.003509 0.004714 0.003935 -0.005822 
+0.002321 0.003674 -0.002979 -0.002937 0.000879 -0.001231 
+-0.004544 -0.002541 -0.001111 -0.003366 -0.003662 0.000300 
+-0.001092 -0.002149 0.000658 -0.000879 -0.000681 0.000047 
+-0.002659 -0.001053 -0.000140 -0.002617 -0.001066 -0.000002 
+0.000650 0.000800 0.000020 0.002325 0.002949 0.000193 
+-0.000603 0.001933 -0.000262 -0.006755 -0.001872 -0.001123 
+-0.009190 -0.004025 -0.001985 -0.006884 -0.005856 -0.004641 
+-0.012870 -0.017148 -0.012131 0.002006 -0.013246 -0.002708 
+-0.000441 -0.008611 -0.000687 -0.008390 -0.010324 -0.000076 
+-0.011376 -0.009188 -0.002603 -0.012516 0.000507 -0.005317 
+-0.017517 -0.003353 -0.009268 -0.025173 -0.028322 0.001015 
+-0.017334 -0.016529 0.037858 -0.004206 -0.008671 0.043161 
+0.004813 0.007964 0.027618 -0.001002 0.007219 0.008297 
+-0.012312 -0.013111 -0.005944 -0.029050 -0.057932 0.051853 
+-0.011635 -0.020988 0.002054 -0.015253 0.005413 0.000615 
+-0.012668 0.005112 -0.004384 -0.009485 -0.028378 0.021501 
+-0.002756 -0.013708 0.004778 0.007226 0.034415 0.006676 
+0.007685 -0.005944 -0.002899 -0.010933 -0.001943 -0.023726 
+-0.016420 0.017975 -0.004711 -0.004724 0.026552 0.012095 
+0.015582 0.020137 0.008690 -0.000051 0.013801 0.001442 
+0.000602 0.007136 0.002173 -0.003316 0.004335 -0.001768 
+-0.002412 0.000767 -0.002944 -0.001044 0.001415 -0.003715 
+0.001639 0.003696 -0.003809 0.002168 0.004311 -0.002508 
+0.001707 0.002710 -0.001831 -0.000718 -0.000878 0.000708 
+-0.001697 -0.004819 0.001381 -0.000380 -0.003812 -0.001021 
+0.002101 -0.003758 -0.000595 0.003986 -0.003185 -0.001078 
+0.000788 0.001591 0.001764 0.002937 -0.002895 -0.004362 
+-0.002688 -0.001434 -0.003930 -0.000644 0.003085 -0.004608 
+-0.000476 0.003904 0.000037 -0.000059 0.001281 0.002397 
+0.003641 0.002384 -0.002158 0.002672 0.004627 -0.001067 
+-0.001610 0.003426 -0.002691 -0.004204 -0.000852 -0.003157 
+-0.002948 -0.001088 -0.001790 0.000070 0.006469 -0.002260 
+0.004034 0.006556 -0.001869 -0.000970 -0.003842 0.001814 
+-0.027836 -0.019280 0.001464 -0.021176 -0.003820 0.000483 
+-0.001167 0.001215 0.000142 -0.000242 -0.000499 0.000224 
+0.015487 0.008130 -0.009002 0.007594 0.001666 -0.003851 
+-0.004989 -0.008593 0.003077 -0.003229 -0.007002 -0.000681 
+-0.000057 0.002211 -0.003547 -0.001514 0.000164 -0.005326 
+-0.000183 -0.003124 -0.002704 -0.000786 -0.004642 -0.002794 
+-0.005597 -0.006693 0.000450 -0.007168 -0.004096 0.002629 
+-0.005691 -0.000932 0.000394 -0.004135 0.000930 -0.001567 
+-0.002990 0.001371 -0.001452 -0.000020 0.001733 -0.002101 
+0.001186 0.001476 -0.001752 0.000328 -0.000158 0.000263 
+-0.001581 -0.004986 0.002437 -0.006639 -0.014224 0.003825 
+-0.012128 -0.023064 0.002349 -0.010944 -0.028101 -0.001177 
+-0.012438 -0.020370 -0.002262 -0.006375 0.007501 0.003412 
+0.005206 -0.000370 -0.001597 0.004466 -0.001362 -0.000438 
+-0.006172 0.010696 -0.000164 0.006717 0.025484 -0.002179 
+0.016251 0.003727 -0.025231 -0.004384 0.001158 -0.002829 
+-0.008795 -0.000318 -0.000858 -0.002848 -0.001599 -0.002052 
+0.001598 -0.002053 -0.001428 0.001805 -0.002591 -0.001306 
+0.001301 0.001725 0.000339 0.018793 0.012434 0.014116 
+0.023601 0.081467 0.007597 0.032000 -0.036422 -0.007004 
+0.079977 -0.009139 0.000762 0.052889 0.022222 -0.026444 
+0.034819 -0.032975 -0.015945 0.023267 -0.010421 -0.001452 
+0.014791 -0.003242 0.000405 0.001574 0.019537 -0.011343 
+0.000083 0.001004 -0.001599 -0.001500 -0.002487 0.007105 
+0.008863 0.011803 -0.002677 0.003273 -0.002982 0.002733 
+0.002469 -0.005027 0.009946 -0.000749 -0.000299 0.006139 
+-0.002112 0.001862 0.000038 -0.000418 0.000795 -0.002195 
+0.001793 0.000705 -0.002379 0.001274 0.001888 -0.003078 
+-0.001516 0.001633 -0.003392 -0.003498 -0.000053 -0.000986 
+-0.002004 -0.001470 0.000114 -0.001155 -0.001461 0.000072 
+-0.000494 -0.003176 0.001955 0.000701 -0.003594 0.002870 
+0.001651 0.003223 -0.000414 0.000780 0.000679 -0.000568 
+-0.001416 0.004828 -0.006609 0.001334 0.004587 -0.005548 
+0.000240 0.002245 -0.002723 0.000692 0.001180 0.000916 
+0.002111 0.000988 0.001003 0.000865 0.001372 0.000527 
+-0.000711 0.000274 -0.000037 -0.002508 -0.001190 -0.002148 
+-0.003502 -0.003412 -0.000737 -0.005011 -0.001052 -0.001403 
+-0.003902 0.004403 -0.003239 -0.003471 0.004702 -0.003822 
+-0.006166 0.000385 -0.002592 -0.010116 -0.004556 0.001242 
+0.002012 -0.000297 -0.000536 0.003160 0.004286 -0.003223 
+0.002794 0.005414 -0.003047 0.000116 -0.003108 0.001136 
+-0.000827 -0.008859 0.001140 -0.008821 -0.005077 0.000674 
+0.000683 -0.001319 -0.007355 -0.001649 -0.001679 -0.005021 
+0.000195 -0.000181 0.000090 0.000762 -0.001238 -0.000288 
+-0.002553 -0.001606 0.001028 -0.000299 0.001942 -0.002155 
+0.000533 -0.000119 -0.001710 -0.000535 0.000132 0.000500 
+0.000681 -0.000502 -0.000272 0.001602 -0.002246 -0.000723 
+0.004167 -0.002806 -0.001403 0.001613 -0.001755 -0.004529 
+0.000185 -0.000332 0.001431 0.001204 -0.002618 0.004624 
+-0.001795 -0.005288 0.004687 -0.007760 -0.006126 0.000733 
+-0.013473 0.004959 -0.013132 -0.010798 0.020838 -0.027896 
+0.005032 0.007057 -0.015916 0.002064 -0.001243 0.000813 
+-0.003251 -0.000683 0.006516 0.005356 -0.003260 0.002208 
+0.001934 -0.000647 0.002571 -0.001570 0.001119 0.001828 
+-0.003452 -0.001236 0.000498 -0.005096 -0.005550 -0.000966 
+-0.003600 -0.004524 0.000969 0.009281 0.005033 -0.004044 
+-0.002661 0.002041 -0.006791 0.000465 0.009606 -0.003088 
+-0.002762 0.074974 -0.007850 0.015424 0.030712 0.001664 
+0.067301 -0.018333 -0.007985 0.036560 0.012656 -0.020447 
+0.012547 0.005734 -0.025188 0.005218 0.000526 -0.002087 
+0.000921 0.001022 0.003519 -0.014961 0.015467 -0.011625 
+-0.113610 0.029724 -0.032622 -0.030763 -0.036000 0.069216 
+0.001873 -0.000727 0.006559 -0.000657 -0.001266 0.011329 
+-0.003387 -0.001271 0.008364 -0.004064 0.000580 0.004034 
+-0.002861 0.003582 -0.001224 0.000066 0.004908 -0.003441 
+0.001122 0.002899 -0.001707 -0.000747 0.001294 -0.001902 
+-0.002544 -0.000122 -0.000867 -0.003016 -0.002205 0.001427 
+0.000455 -0.001130 0.000953 0.000527 0.000249 0.001535 
+0.000044 -0.000561 -0.000739 -0.000525 -0.001211 0.002244 
+0.000575 0.001007 -0.000488 0.002720 0.003266 -0.002331 
+-0.003103 0.002971 -0.002602 -0.000892 -0.001615 0.000488 
+-0.000194 -0.000994 0.001763 0.000906 -0.000177 0.001116 
+0.002185 -0.001454 -0.000035 0.001946 -0.000332 -0.000114 
+0.003080 0.000476 -0.000633 0.001996 0.000797 0.000516 
+0.000041 0.001156 -0.000973 -0.001099 -0.001380 0.000633 
+-0.001995 -0.002821 0.001060 -0.003768 -0.004406 0.001306 
+-0.005740 -0.003562 0.000624 -0.002764 0.002895 -0.002614 
+0.002820 0.008547 -0.005695 -0.000001 0.007776 -0.003049 
+-0.002388 0.003783 -0.000577 0.002194 -0.002126 0.000483 
+0.002250 -0.004662 0.001821 -0.006065 -0.006604 -0.000237 
+0.000284 -0.001419 -0.005723 0.001127 0.003454 -0.001366 
+0.000437 0.001357 -0.002281 -0.002581 0.002544 -0.002321 
+0.002254 0.004155 -0.004085 0.002366 0.004652 -0.001616 
+0.000076 0.002580 -0.000906 -0.003080 0.001672 0.000942 
+-0.004023 -0.001430 -0.001719 -0.002434 -0.002705 -0.003599 
+0.000095 -0.000744 0.000090 0.000418 -0.000640 0.000062 
+0.002291 -0.000117 0.000162 0.004056 0.000289 0.000679 
+0.003314 0.000422 0.002569 0.002202 0.002016 -0.001270 
+-0.000235 0.004873 -0.008909 -0.001841 0.001597 -0.008374 
+-0.001367 0.000328 0.000945 0.000184 0.000991 0.002622 
+0.001770 0.000104 0.000837 0.001306 -0.000507 -0.000223 
+0.000014 0.000957 0.000314 -0.000159 -0.002774 0.000350 
+-0.000292 -0.006280 0.000220 -0.000936 -0.008861 -0.000570 
+-0.001975 -0.010159 0.001680 0.006694 -0.003868 0.002546 
+0.009275 -0.006107 -0.005630 0.000126 -0.003612 0.000507 
+-0.001100 0.006518 -0.001265 -0.008068 0.038832 -0.005500 
+-0.077103 0.008520 0.001600 -0.080414 -0.030917 0.020048 
+-0.005023 -0.022265 -0.000914 0.031332 -0.015240 0.000505 
+-0.021140 -0.025730 0.006086 -0.070000 -0.035776 0.024935 
+-0.078892 0.002231 0.002272 -0.033050 0.024640 -0.016189 
+-0.006286 0.002925 0.005305 -0.002924 -0.003507 0.012276 
+-0.002881 -0.002267 0.005876 -0.002044 0.000229 0.001081 
+-0.001128 0.001999 -0.001279 -0.001580 -0.001949 -0.002733 
+0.000547 0.001230 -0.006554 -0.000255 0.000458 -0.002706 
+-0.000043 -0.000908 0.001206 0.000224 -0.001808 0.000409 
+-0.000710 0.001741 -0.000185 -0.001797 0.002592 0.002064 
+-0.003595 -0.001433 0.000351 0.002479 -0.004094 -0.000765 
+-0.000758 -0.000509 0.000982 -0.001149 -0.000919 0.001240 
+-0.000950 -0.003600 0.000214 0.000328 -0.002434 0.004376 
+-0.001610 -0.001559 0.000330 -0.003206 -0.001416 -0.001436 
+-0.001888 -0.000168 -0.002162 -0.002117 0.000461 -0.000163 
+0.005124 0.003870 -0.000312 0.005469 0.006173 -0.003265 
+0.005351 0.003050 -0.003931 0.002912 0.004126 -0.004898 
+0.000859 0.006276 -0.005344 -0.000835 0.004802 -0.002106 
+-0.002432 -0.000108 -0.000193 -0.001815 -0.000280 -0.000099 
+0.000638 0.005019 -0.002183 0.001158 0.006322 -0.002898 
+0.001401 0.001580 -0.001037 0.003537 -0.002295 0.001165 
+0.000252 -0.003484 0.001012 -0.001622 -0.003525 -0.000388 
+0.000474 0.003108 -0.000959 0.002600 0.004771 -0.000740 
+-0.003258 0.005179 -0.003914 -0.003723 0.007338 -0.003816 
+-0.001816 0.006312 -0.003631 0.001409 0.004633 -0.004096 
+-0.001316 0.004541 -0.001290 -0.004930 0.000484 -0.001347 
+0.000772 -0.000710 -0.000988 0.000849 -0.000544 -0.002614 
+-0.001348 -0.000392 0.001092 -0.003486 -0.001939 0.001603 
+-0.002792 -0.006945 0.002484 -0.000413 -0.008207 0.005189 
+0.002784 -0.000656 0.002431 0.004366 -0.002038 -0.001602 
+0.010042 0.002180 -0.001322 0.001086 0.004446 0.003858 
+-0.002468 -0.000949 -0.000570 -0.007436 -0.005475 0.001499 
+-0.001097 -0.002516 0.001718 0.002265 0.008181 -0.003747 
+0.001017 0.006144 -0.010764 -0.002701 -0.000045 -0.000521 
+-0.002311 -0.007244 0.004452 -0.000813 -0.010103 0.003128 
+0.001452 -0.008776 -0.002234 0.002154 0.009929 -0.010788 
+-0.000056 -0.005044 -0.002090 0.003872 -0.002505 0.000309 
+0.001776 0.012298 -0.002237 0.003457 0.024953 -0.005371 
+-0.006281 0.013946 -0.002116 -0.003568 -0.003901 0.000854 
+-0.006828 -0.003688 0.001139 0.002483 0.013783 -0.007223 
+-0.004814 0.010996 -0.006411 0.002819 0.005635 -0.004022 
+0.009254 0.005930 -0.006894 -0.002676 0.001241 0.000610 
+-0.004150 -0.000585 0.008042 -0.002255 -0.003704 0.006212 
+0.003537 0.000234 -0.001190 0.005800 0.004883 -0.001478 
+0.000425 0.001355 0.000664 -0.000629 -0.002569 0.000979 
+0.000439 -0.001989 0.002130 -0.000059 -0.000389 0.000824 
+-0.000262 -0.000697 -0.000774 -0.000472 -0.002677 -0.001720 
+-0.001270 -0.004206 -0.000433 -0.001885 -0.003375 0.003422 
+-0.001655 -0.000685 0.005111 -0.004031 0.000094 0.002464 
+0.001083 -0.000707 -0.002949 0.003125 0.002291 -0.002201 
+0.006294 0.004492 -0.004079 0.010318 -0.000709 -0.003916 
+0.001962 -0.003282 -0.006556 -0.005129 -0.009463 -0.003495 
+-0.006013 -0.008812 0.001304 -0.001019 0.000194 0.000843 
+0.001401 0.000192 0.002094 -0.000375 0.002386 -0.000117 
+-0.000647 0.000722 -0.002099 0.001600 -0.000566 -0.003206 
+0.000309 0.000551 -0.003616 -0.000796 -0.000304 -0.000598 
+-0.000394 -0.002871 0.000710 -0.002548 -0.001058 0.000216 
+-0.004285 0.003360 -0.000637 -0.004052 0.003573 -0.000492 
+-0.002507 -0.000705 0.000803 -0.000138 -0.003427 0.000291 
+0.002610 -0.003237 0.002228 0.004173 -0.005623 0.002326 
+0.001159 -0.003930 0.001040 -0.001025 0.003198 -0.001628 
+-0.005218 0.007379 -0.004994 -0.002449 0.005288 -0.006370 
+0.000931 0.001106 -0.000558 -0.002293 0.000480 0.002133 
+-0.001508 0.000044 0.002738 -0.002425 -0.001666 0.003434 
+-0.004375 -0.000583 0.002774 -0.002972 0.000532 0.004370 
+-0.004213 -0.001962 0.006824 -0.009483 -0.006886 0.004276 
+-0.007241 -0.002163 -0.000969 -0.001598 -0.000749 -0.000689 
+0.001438 -0.003395 0.001772 0.005905 0.000440 -0.005582 
+0.006518 0.001903 -0.006827 0.001302 -0.000135 0.000553 
+-0.003390 -0.005706 0.005896 -0.002608 -0.003862 0.004816 
+0.003280 0.002866 -0.001808 0.004633 0.009162 -0.001861 
+-0.002782 0.003482 -0.000651 -0.004146 0.002198 0.000186 
+-0.009013 -0.001487 0.004143 -0.008701 0.000123 0.006479 
+-0.003316 -0.005769 0.009094 -0.012202 0.100077 -0.037266 
+0.029110 0.031983 -0.008235 0.001955 0.002208 -0.000462 
+-0.002580 -0.002547 0.000504 0.005245 -0.005470 0.003402 
+0.029429 0.000128 0.001126 0.022525 0.009703 -0.007343 
+-0.007435 0.011015 -0.004044 -0.011536 0.008782 -0.002024 
+-0.001149 0.006605 -0.004273 0.004429 0.004503 -0.002630 
+-0.000937 -0.000871 0.001597 -0.001885 0.001266 0.002719 
+-0.001991 0.001710 0.000922 0.003435 0.003224 -0.000908 
+-0.000948 0.005526 -0.005044 0.008158 -0.002447 -0.008154 
+0.007758 0.001111 -0.002217 0.002265 -0.003467 0.003667 
+0.001151 -0.005623 0.005506 -0.001120 -0.000677 -0.000968 
+-0.000895 -0.000731 -0.003460 -0.002257 -0.000928 -0.002208 
+-0.000294 -0.006276 -0.000991 0.002241 -0.008124 -0.002491 
+0.003846 -0.005293 -0.001586 0.000961 -0.001195 0.000151 
+-0.000568 -0.000487 -0.003289 0.001945 0.002468 -0.003982 
+0.002946 0.004936 -0.005543 -0.000851 -0.001004 -0.003465 
+0.002041 -0.005866 -0.002281 0.001380 -0.003378 -0.000959 
+0.004001 0.001595 -0.003445 0.005132 0.001683 -0.007054 
+0.003739 -0.001827 -0.004672 -0.002005 0.001620 -0.002438 
+-0.000227 0.001673 -0.001659 0.001776 -0.000264 0.000014 
+0.002444 -0.002414 0.000629 -0.000758 -0.004838 -0.000211 
+-0.004715 -0.003926 0.001649 -0.005133 -0.002025 0.001187 
+-0.003537 -0.000426 0.000753 -0.001050 -0.001222 0.000584 
+0.001407 -0.003357 0.000831 0.003617 -0.003803 0.003462 
+0.003283 -0.002718 0.003123 0.006207 -0.000545 -0.000755 
+0.003147 -0.002029 -0.003140 0.000549 0.002250 0.000259 
+-0.000333 0.007498 -0.002131 0.001121 0.005192 -0.004076 
+0.001360 0.000689 0.001736 -0.002121 -0.001147 0.003879 
+-0.003766 -0.002656 0.004333 -0.003559 -0.003408 0.003420 
+-0.001353 -0.001122 0.003706 -0.000562 -0.000199 0.002571 
+-0.001273 -0.000454 -0.000017 -0.001554 0.001962 -0.001394 
+-0.002057 0.000999 -0.001764 0.000851 0.001064 -0.001631 
+-0.000033 0.000159 -0.000079 0.002632 -0.002992 -0.000136 
+0.004535 -0.000714 -0.000004 -0.000899 0.002707 0.000075 
+-0.001026 0.002033 -0.001807 -0.000344 0.002389 -0.002635 
+-0.003450 0.003256 -0.005620 -0.000180 0.003778 -0.008090 
+-0.000030 0.001852 -0.002563 -0.003106 -0.004892 0.006912 
+-0.011517 -0.004713 0.008375 -0.005485 -0.002720 0.005795 
+-0.003320 -0.006886 -0.001270 -0.006098 0.033000 -0.018011 
+0.015348 0.048489 -0.001529 -0.000720 0.012621 -0.000250 
+-0.006468 -0.002905 0.001211 -0.000596 -0.009597 0.004193 
+0.006236 -0.004278 0.002147 0.006067 0.005950 -0.006672 
+0.003896 0.009133 -0.011968 0.003517 0.009029 -0.010015 
+0.001102 0.005121 -0.003232 -0.005650 -0.003915 0.006188 
+-0.000915 0.001421 0.009497 0.000057 -0.002731 -0.000950 
+0.000397 0.000180 -0.000086 0.002937 0.004152 -0.004027 
+0.004471 0.003532 -0.005286 0.003224 0.001876 -0.004392 
+0.001857 -0.004578 -0.005757 0.001631 -0.008536 -0.003492 
+0.002413 -0.006440 -0.001383 -0.000384 -0.002135 0.003167 
+-0.000382 0.000077 0.000348 -0.000718 -0.000386 -0.000767 
+-0.000869 -0.001651 -0.002160 -0.003180 0.001572 0.000843 
+-0.007265 0.000760 0.006451 -0.002170 -0.000792 0.002992 
+-0.000330 -0.001999 -0.002376 -0.001536 -0.003459 0.003060 
+-0.000925 -0.000854 0.003373 -0.002927 -0.002751 -0.001386 
+-0.004017 -0.008151 0.005438 -0.002196 -0.011077 0.005842 
+0.001744 -0.005784 0.001351 0.003724 -0.000368 -0.005071 
+0.004867 0.000057 -0.009048 0.001343 0.003529 -0.008992 
+0.001616 -0.002877 -0.003869 0.004323 -0.002122 0.000975 
+-0.000548 0.000363 0.002899 -0.003525 -0.001786 0.005293 
+-0.007893 0.000317 0.003833 -0.005679 -0.000752 0.000969 
+-0.001280 -0.002208 0.000384 0.000595 -0.003464 -0.000863 
+0.001790 -0.002062 -0.000780 0.001555 -0.002354 0.000336 
+-0.001835 -0.004941 -0.000326 0.005059 -0.000131 -0.001902 
+-0.001680 0.000038 -0.003161 -0.002755 0.004886 -0.000609 
+-0.003914 0.005143 -0.000610 0.002205 0.002615 0.000114 
+0.002512 0.001063 0.002521 0.000091 -0.001129 0.000599 
+-0.002289 -0.002006 0.000656 -0.000628 -0.000683 0.002104 
+0.002826 -0.000920 0.001354 -0.000368 0.000552 -0.001111 
+-0.001581 0.006808 -0.003527 0.001333 0.007653 -0.005231 
+0.003042 0.002615 -0.001096 -0.004014 0.003565 -0.004322 
+-0.001576 0.006298 -0.005411 0.004386 0.010195 -0.003480 
+0.000820 0.001501 0.004077 0.000692 -0.000946 -0.000425 
+0.002322 -0.000527 -0.002341 -0.004275 -0.002367 -0.001561 
+0.000857 -0.002621 -0.001259 -0.003730 -0.005598 -0.000830 
+-0.002920 0.000364 -0.006744 -0.003303 -0.000270 -0.000151 
+-0.005799 -0.004700 0.004251 -0.005488 -0.004961 0.002085 
+-0.002075 -0.005005 -0.000852 -0.002879 -0.013204 -0.007385 
+-0.003405 0.032802 -0.002708 -0.003593 0.011941 -0.000067 
+-0.006513 0.001044 0.001604 -0.000531 0.000640 -0.000094 
+0.005398 -0.001153 -0.000947 0.007060 -0.001088 -0.001651 
+0.006048 0.002280 -0.003626 0.003714 0.005071 -0.003504 
+-0.000697 0.002184 -0.003567 -0.000809 0.000151 -0.000514 
+-0.001199 -0.003272 -0.001604 -0.002273 -0.008348 0.001885 
+-0.001073 -0.004999 0.003928 -0.000129 0.000665 -0.000248 
+0.000017 0.002763 -0.002496 0.000226 -0.000739 -0.000716 
+-0.001044 -0.000433 0.000167 -0.000633 -0.000264 0.000173 
+-0.000669 -0.001077 -0.000356 -0.004277 0.000678 -0.001906 
+-0.000486 0.000271 -0.001187 0.001114 -0.001082 0.000836 
+0.002638 -0.003051 0.002767 0.002602 -0.002322 0.003502 
+-0.001952 -0.001378 0.004857 -0.001927 -0.002684 0.003052 
+0.001560 0.001418 -0.005461 0.000393 -0.001104 -0.002875 
+-0.002033 -0.002196 0.000730 -0.007308 -0.006569 0.004897 
+-0.008547 -0.011766 0.011896 -0.007210 -0.015616 0.009075 
+-0.003421 -0.009462 0.003956 0.000146 -0.003466 0.000249 
+-0.001487 -0.000800 -0.001906 -0.000419 -0.002834 -0.005996 
+0.002460 -0.005636 -0.005502 0.000807 -0.006734 -0.000988 
+-0.002186 -0.001918 0.005509 -0.003055 -0.000220 0.005272 
+-0.002766 -0.002287 0.001791 -0.000626 -0.002469 -0.000585 
+0.000297 -0.002362 -0.000833 -0.000395 -0.000982 -0.001249 
+-0.001937 0.000240 -0.001867 -0.002919 -0.002611 -0.002469 
+0.000681 -0.004260 0.000657 0.001490 -0.001393 -0.000056 
+-0.003674 0.002790 -0.001238 -0.007096 0.003915 -0.000968 
+-0.004040 -0.000176 -0.000337 0.001281 -0.000853 0.001730 
+0.001594 -0.002339 0.001276 -0.002843 -0.003300 -0.000649 
+-0.007459 -0.003770 0.000820 -0.001456 -0.000846 -0.000787 
+-0.001983 -0.002167 0.000271 -0.004096 -0.000422 0.002736 
+-0.003943 0.000244 0.002967 -0.002248 0.001641 0.004248 
+0.000662 -0.000810 0.002245 -0.001298 0.001863 -0.000786 
+0.002268 0.000805 -0.001384 0.001201 -0.000973 -0.002516 
+0.002923 -0.001366 -0.000599 0.003707 -0.002147 0.001027 
+0.000962 -0.003239 0.000192 -0.000281 -0.002332 -0.002101 
+-0.002241 -0.005245 -0.004737 0.001842 0.000524 -0.004990 
+0.006069 0.001615 -0.006236 0.006941 0.002796 -0.003427 
+0.004458 -0.000691 0.001164 -0.000123 -0.005454 0.002395 
+0.000948 -0.009387 -0.003208 -0.002919 -0.005403 -0.018432 
+-0.021779 0.000130 0.008679 -0.020146 -0.004285 0.010376 
+-0.012176 -0.002889 0.004153 0.001849 -0.001970 -0.000011 
+0.006472 -0.003909 -0.001756 0.003834 -0.003540 -0.000411 
+0.000343 -0.000195 -0.000043 0.000426 0.002544 -0.004092 
+-0.002105 0.001987 -0.001621 0.000705 -0.001004 0.000125 
+0.002094 -0.000123 0.000189 -0.001044 -0.000894 0.008397 
+0.004986 0.000971 0.002355 0.006074 -0.001289 0.002798 
+-0.000437 0.001517 -0.002545 -0.000491 0.002261 -0.003526 
+-0.004227 -0.000335 0.000844 -0.001993 0.000000 0.005482 
+-0.001155 0.002058 0.004231 -0.006652 -0.001271 -0.001898 
+-0.002472 0.003103 -0.003060 -0.003577 0.002624 0.004266 
+-0.001659 0.000054 0.000980 0.019250 0.014649 0.010788 
+0.028832 0.011790 0.017967 0.019776 0.001228 0.008631 
+0.000085 0.002521 -0.005491 0.003245 0.001921 -0.006490 
+-0.000761 -0.001555 -0.002352 -0.001659 -0.009912 0.005817 
+-0.004759 -0.011460 -0.004398 -0.012472 -0.013799 0.004441 
+-0.005445 -0.011221 -0.000283 -0.003350 -0.006562 -0.000680 
+-0.000675 -0.001726 -0.001299 -0.000169 0.000017 -0.000512 
+0.004077 0.001223 -0.002522 0.000176 -0.000831 -0.001036 
+-0.001585 0.001047 0.001423 -0.004643 -0.000742 0.001388 
+-0.002608 -0.000672 -0.002730 -0.003438 -0.001482 -0.003384 
+-0.001787 -0.002509 -0.003266 -0.000093 -0.003284 -0.002385 
+0.000469 -0.004016 -0.001222 0.001781 -0.004134 -0.000467 
+-0.000929 -0.004329 -0.000808 -0.005772 -0.001394 -0.002224 
+-0.007353 0.000682 -0.003068 -0.008701 -0.000045 -0.003251 
+-0.008072 -0.000664 0.002078 -0.002165 -0.003282 0.002854 
+-0.001996 -0.004050 0.001589 -0.002256 -0.005895 0.001263 
+-0.005984 -0.004148 0.008295 -0.003972 -0.006028 0.008528 
+0.000012 -0.003082 0.009189 -0.002637 -0.001345 0.008404 
+-0.002195 -0.001260 0.005189 0.000339 0.000831 0.002418 
+0.001445 0.000187 -0.000357 0.001968 -0.000126 0.000421 
+0.000010 0.000234 0.000457 0.000396 -0.000253 0.000040 
+0.004564 0.001285 0.001468 -0.000489 0.000000 0.001040 
+0.002628 -0.002099 0.002926 -0.001486 -0.005883 -0.004347 
+-0.001333 -0.011295 0.002475 0.007157 -0.007026 -0.003476 
+0.010051 -0.005149 -0.005341 0.010170 -0.004420 -0.000895 
+0.005732 -0.005727 0.000004 0.003770 -0.005492 -0.001107 
+0.003660 -0.002469 -0.006989 0.007895 0.001198 -0.010126 
+-0.003498 0.002602 -0.001045 -0.005959 -0.001832 0.002225 
+0.000146 -0.000075 0.000009 0.003190 -0.001572 -0.000672 
+-0.001557 -0.001906 0.004848 -0.000658 0.002558 0.006287 
+-0.009074 -0.000636 0.002705 -0.004189 0.005519 -0.003416 
+-0.003745 0.005199 -0.001674 -0.000431 0.004527 0.002371 
+0.003675 0.002450 0.006475 0.005588 0.003949 0.006332 
+0.002290 0.000333 0.004312 0.005589 -0.006005 -0.002032 
+0.006034 0.000142 -0.004052 0.002242 0.000309 -0.001913 
+-0.004256 0.000942 0.000423 -0.003600 -0.000535 0.006202 
+-0.008906 -0.004981 0.004101 -0.000797 0.000626 -0.000033 
+-0.000824 -0.001085 -0.002798 -0.004662 -0.001506 0.004729 
+0.013476 0.003306 0.008123 0.033141 0.010751 0.026659 
+3.652695 1.245509 2.796407 0.026159 0.015100 0.017268 
+0.001427 0.001050 -0.000704 0.001464 0.000056 -0.002867 
+-0.001016 -0.002469 -0.003194 -0.001362 -0.001981 -0.001762 
+-0.002410 -0.003410 0.002366 -0.005219 -0.009334 0.003199 
+-0.008847 -0.011468 -0.002050 -0.008546 -0.010111 -0.004815 
+-0.005050 -0.005514 -0.006365 -0.001460 -0.000992 -0.002643 
+0.000455 -0.000212 0.000889 -0.001202 0.002394 0.003028 
+0.000000 -0.000347 0.000764 -0.001993 -0.002944 -0.004010 
+-0.003447 -0.002978 -0.006590 -0.005110 -0.003011 -0.005543 
+-0.003979 -0.004087 -0.003183 -0.003209 -0.003499 -0.002685 
+-0.000629 -0.001775 -0.002187 -0.000754 -0.000389 -0.001073 
+-0.001947 0.001735 0.002213 -0.004081 0.002996 0.001248 
+-0.004164 -0.006197 -0.001706 -0.003669 -0.013259 0.003924 
+-0.003415 -0.000375 0.001747 0.000799 -0.007393 -0.000130 
+0.001031 -0.005874 0.002066 0.000083 -0.008175 0.007232 
+-0.007511 -0.006013 0.009004 -0.005082 -0.003566 -0.000410 
+0.000203 -0.004048 0.006677 0.000487 -0.001946 0.002857 
+0.000132 -0.002060 -0.000700 -0.002143 -0.003720 -0.001776 
+-0.005648 -0.004277 -0.000028 -0.004335 -0.004966 0.004255 
+-0.000405 -0.001685 0.000359 0.002452 0.002470 -0.001199 
+0.003237 0.002235 -0.001901 0.000567 -0.001407 0.001418 
+-0.002200 -0.006972 0.002888 -0.001091 -0.002009 0.003165 
+0.005144 -0.002080 -0.007028 0.007267 -0.004552 -0.008395 
+0.006375 -0.006530 -0.002985 0.007069 -0.004216 0.001828 
+0.003647 0.000041 0.007097 -0.002424 0.003865 0.005884 
+-0.008214 0.001362 -0.000281 -0.002189 0.005630 -0.002831 
+-0.000035 0.005446 -0.001312 0.001894 0.005239 0.000478 
+0.004856 0.004562 0.000160 0.002497 0.002054 0.001513 
+-0.006725 -0.003626 0.001550 -0.015934 -0.008541 0.007072 
+-0.014413 0.003258 0.000409 -0.004593 0.003510 -0.003885 
+-0.001838 0.005611 -0.000876 -0.000006 0.004923 0.003066 
+0.001959 0.000979 0.006414 0.002713 0.001422 0.006422 
+0.001174 0.000965 0.003203 -0.000742 0.001310 -0.002074 
+0.000727 0.004242 0.000250 -0.001867 0.002663 0.000347 
+-0.002155 -0.001330 -0.001730 -0.006011 -0.003874 -0.002661 
+-0.003813 -0.000691 -0.003514 -0.004324 0.001517 0.000627 
+0.000039 0.000300 0.000376 0.006107 0.001069 -0.002849 
+0.011967 -0.000776 0.010289 0.017452 0.006292 0.026740 
+2.668639 0.816568 2.579882 0.020837 0.009227 0.018449 
+0.005513 -0.000889 0.002698 0.001643 0.001317 0.002052 
+-0.001943 -0.000984 -0.000908 0.002126 -0.002236 -0.004235 
+0.004077 -0.001152 -0.008062 0.004847 -0.003915 -0.007228 
+-0.004770 -0.005695 -0.003795 -0.007245 -0.006752 -0.009933 
+-0.007200 -0.006925 -0.010213 -0.006947 -0.004929 -0.005602 
+-0.005140 -0.002712 0.000218 -0.003193 -0.000809 0.002292 
+-0.001368 -0.002284 -0.001930 -0.000451 -0.004971 -0.005078 
+-0.000065 -0.009076 -0.004150 -0.001230 -0.009076 -0.000984 
+0.000703 -0.006377 -0.001241 0.001090 -0.002442 -0.002155 
+0.004167 -0.003769 -0.003738 0.016780 -0.003266 -0.006947 
+0.006892 0.004974 -0.000435 -0.003328 0.002411 -0.004062 
+-0.006344 -0.001301 -0.009726 -0.014995 0.003969 -0.010000 
+-0.017721 -0.001313 -0.010919 -0.011369 0.000700 -0.003614 
+-0.004011 -0.002184 0.006707 -0.004370 -0.009352 0.002289 
+-0.002904 0.000928 0.002490 -0.002775 0.001492 0.003107 
+0.000000 0.002320 0.000000 0.002863 0.003308 -0.001959 
+0.001931 0.000214 -0.001503 -0.002014 -0.000935 0.002806 
+-0.004758 -0.000411 0.006401 -0.005930 -0.002497 -0.002982 
+-0.004803 -0.003283 0.002185 -0.002212 0.000301 0.001536 
+-0.002944 -0.000426 0.002703 -0.004271 -0.002882 0.005069 
+-0.002042 -0.001583 0.003886 0.002406 0.000485 -0.003687 
+0.003716 0.001659 -0.007812 -0.001051 -0.001738 -0.004156 
+0.000623 -0.001192 -0.000647 -0.001462 0.004823 0.004197 
+-0.000236 0.017580 0.007709 -0.003299 0.012315 -0.001443 
+-0.008575 0.002528 0.001743 -0.004320 0.004884 0.005399 
+-0.001095 0.004397 0.010003 0.002411 0.000359 0.012417 
+0.006245 -0.001787 0.010509 0.000260 -0.002633 0.007961 
+0.000312 -0.002139 0.002273 -0.002152 0.001154 -0.003351 
+0.000380 -0.000530 -0.003198 -0.001903 0.006255 0.002937 
+0.001077 0.000536 0.000934 -0.000943 -0.003464 0.004177 
+-0.002130 -0.000348 0.004761 -0.001119 0.002278 0.002588 
+-0.002838 0.004053 0.001809 0.004144 0.007210 0.001760 
+0.001079 -0.002811 -0.001881 0.000107 -0.010687 -0.008008 
+-0.001397 -0.013275 -0.008570 0.001606 -0.009977 -0.004199 
+-0.003060 0.001560 -0.003417 -0.010203 0.006655 0.006019 
+0.001192 0.000286 0.001404 0.000337 0.000753 0.000505 
+-0.001575 0.000098 -0.000696 -0.005422 -0.010515 -0.000367 
+-0.000839 0.000951 0.001860 0.005441 0.003088 0.005298 
+-0.000813 0.000940 0.002034 0.001741 0.001683 0.000696 
+-0.000130 -0.000578 -0.002225 -0.001882 -0.001829 -0.002927 
+-0.000636 -0.001008 -0.004233 0.004200 -0.001050 -0.009000 
+0.010581 -0.006649 -0.015787 0.005875 -0.009946 -0.001654 
+-0.006623 0.000803 -0.019560 -0.000316 -0.008375 -0.014023 
+-0.001405 -0.010133 -0.006630 -0.000298 -0.007638 -0.006063 
+-0.000468 -0.003636 -0.003223 -0.000550 -0.001034 -0.000859 
+0.000423 -0.001850 -0.001349 0.001828 -0.001647 -0.000716 
+0.006135 -0.001660 0.006281 0.006664 -0.001620 0.012204 
+0.002441 -0.007380 0.001903 0.012585 -0.007718 0.003247 
+-0.000667 -0.010871 0.000189 -0.010397 -0.010571 0.000624 
+-0.016116 -0.009715 -0.002770 -0.017225 -0.010444 -0.009627 
+-0.011352 -0.012686 -0.006830 -0.008511 -0.002529 0.000781 
+-0.004903 -0.001113 -0.000287 -0.000465 -0.001399 0.000387 
+0.004534 -0.000680 0.000101 0.003516 -0.000764 -0.002257 
+0.003695 -0.000772 -0.002414 0.004455 -0.001211 -0.001323 
+0.002252 -0.002999 0.001750 -0.004110 -0.006336 0.002349 
+-0.005615 -0.009305 0.001329 -0.003946 -0.005536 0.005517 
+-0.002418 0.000439 0.002692 -0.002936 0.000916 0.002398 
+-0.006189 -0.003306 0.001708 -0.004975 -0.005668 0.004849 
+-0.001079 0.000267 0.000457 0.002607 0.000676 -0.002542 
+0.000047 0.002654 0.000986 0.001043 -0.000344 0.001076 
+-0.001585 -0.000832 -0.001901 -0.002803 0.002435 0.000402 
+0.006038 0.014979 0.001148 0.010692 0.013664 0.001390 
+0.011128 0.002909 0.007093 0.005936 0.001017 0.006281 
+0.002819 0.000706 0.004703 0.003997 0.002106 0.007325 
+-0.006061 -0.009174 0.011401 -0.004662 -0.013656 0.009669 
+-0.001274 -0.005523 0.001406 0.004372 0.002605 -0.000953 
+-0.001308 0.004750 0.001511 0.000852 0.003640 0.004548 
+0.001207 -0.002543 0.004957 -0.000743 -0.004107 0.002569 
+0.002060 -0.000872 0.000743 -0.000605 0.000844 0.000316 
+-0.003009 0.002423 0.002769 -0.000573 -0.001191 -0.002480 
+0.005598 -0.011893 -0.009708 0.006842 -0.017208 -0.016832 
+0.000028 -0.022136 -0.016092 0.004859 -0.016686 -0.014180 
+-0.000092 -0.001240 -0.008479 -0.001145 0.002436 -0.003934 
+0.002307 0.005085 -0.000378 0.000562 -0.002607 0.001198 
+0.000887 -0.005774 -0.001233 0.000592 -0.004671 -0.006526 
+0.003393 -0.005239 -0.004034 0.001738 -0.000432 -0.002743 
+0.003142 0.001530 -0.001103 0.002731 0.000726 -0.001398 
+-0.004256 0.005104 -0.002554 0.000637 0.004303 -0.001168 
+0.000071 0.000252 -0.000291 0.004972 -0.000544 -0.003014 
+0.007515 0.000356 -0.012178 0.015906 -0.002147 -0.022776 
+0.021484 -0.011321 -0.026437 0.016530 -0.016800 -0.006016 
+0.007055 -0.003622 -0.015765 -0.001552 -0.005273 -0.010112 
+-0.005646 -0.005506 -0.004635 -0.003617 0.001078 -0.001915 
+-0.000667 0.000500 -0.000167 0.003554 0.002212 0.004054 
+0.003245 0.008633 0.008081 0.008604 -0.008559 0.013959 
+-0.010486 0.004828 0.008864 -0.002472 -0.003482 0.000628 
+0.002876 -0.002451 0.000740 -0.003229 -0.008841 0.007546 
+-0.010608 -0.010109 0.011627 -0.003319 -0.002212 0.002748 
+0.007743 0.005591 -0.005995 0.008566 0.005544 -0.006832 
+0.005268 0.001870 -0.003302 -0.000944 -0.000081 0.000277 
+-0.004589 -0.002064 0.001791 -0.002619 -0.004253 0.002261 
+-0.000935 -0.004523 -0.000117 -0.001584 -0.001440 -0.000033 
+-0.004364 -0.002123 0.002006 -0.009185 -0.002845 0.003124 
+-0.005184 -0.005431 0.007838 -0.002133 0.001376 0.001536 
+-0.002948 -0.000707 -0.000126 -0.005223 -0.003343 -0.000811 
+-0.007541 -0.007140 0.000185 -0.002989 -0.005969 0.001105 
+0.001478 -0.000910 -0.002180 0.000839 0.000559 0.000954 
+0.001366 0.001413 0.003175 0.002105 0.001798 0.004389 
+0.001414 0.003173 0.002926 0.005856 0.003597 0.003054 
+0.006054 0.003857 0.001560 0.002957 0.003002 0.001937 
+0.005021 -0.001439 0.002311 0.005341 -0.007514 0.005660 
+0.001391 -0.012264 -0.000114 -0.018534 -0.018039 0.029753 
+-0.015574 -0.019476 0.015280 -0.009105 -0.017424 0.000551 
+-0.001502 -0.012150 -0.006659 0.001600 -0.006652 -0.005405 
+0.000598 0.000494 0.000392 -0.002299 0.004128 0.002624 
+-0.005981 -0.000929 0.002887 -0.003648 0.000362 0.003816 
+-0.006819 0.001004 -0.000665 -0.010688 -0.009275 0.006511 
+-0.001083 0.001081 0.000689 0.007487 -0.008544 -0.007457 
+0.015807 -0.016040 -0.014322 1.736364 -2.218182 -1.672727 
+1.303371 -2.640450 -1.730337 0.004580 -0.026924 -0.015913 
+0.005829 -0.015379 -0.010985 -0.003324 -0.005930 -0.000063 
+0.001701 -0.004928 0.002848 0.003864 -0.004874 0.003576 
+0.003579 -0.002634 0.001985 0.000085 -0.001126 -0.002123 
+-0.004467 0.003090 -0.001444 -0.006166 0.003309 -0.002787 
+0.004512 -0.000117 -0.002719 0.005390 0.003163 -0.001301 
+-0.001142 0.000303 -0.000299 -0.003122 0.001573 -0.001315 
+-0.002023 0.003096 -0.002605 0.001335 0.001502 -0.000473 
+0.008678 0.003118 -0.004648 0.019132 0.001640 -0.004552 
+0.002652 -0.010010 -0.001859 0.011646 -0.007065 -0.018854 
+0.008379 -0.008768 -0.007304 -0.001595 -0.011671 -0.008009 
+0.005085 -0.007548 -0.012418 -0.000945 -0.011059 -0.009443 
+-0.000122 -0.002174 -0.006562 0.000280 0.007011 0.009946 
+-0.009488 -0.006546 0.010554 -0.003663 0.000939 0.009112 
+0.001298 -0.002433 -0.003281 -0.001232 -0.001923 -0.006441 
+0.006395 0.001230 -0.007955 -0.004632 -0.000895 -0.004780 
+-0.009686 -0.002958 -0.005876 -0.003462 -0.001045 -0.006492 
+0.003120 0.002114 -0.004562 0.002295 0.001349 -0.001313 
+0.001610 0.001118 -0.000564 0.002040 0.000342 -0.000695 
+0.000672 -0.002065 -0.000237 -0.000767 -0.003679 -0.000991 
+-0.000925 -0.002939 -0.001654 -0.000111 -0.001839 -0.001736 
+-0.001149 -0.000715 -0.000747 -0.004703 0.000919 0.001177 
+-0.005737 0.001982 -0.000099 -0.005204 -0.001468 -0.002585 
+-0.004681 -0.005223 -0.003087 -0.005139 -0.006392 -0.001723 
+-0.004968 -0.005809 0.000075 -0.003521 -0.003445 0.000181 
+-0.001088 -0.001078 -0.001077 -0.000009 -0.001224 -0.000914 
+0.000097 0.000026 0.000067 0.000710 0.004972 0.001557 
+0.000618 0.011610 0.002090 -0.000649 0.008103 0.000998 
+0.000311 -0.002475 -0.001090 -0.007481 -0.009280 -0.002754 
+-0.009039 -0.009647 -0.001792 -0.009345 -0.005935 -0.002107 
+-0.014293 -0.005908 0.002086 0.003596 -0.000283 0.008177 
+-0.007491 -0.024957 0.004996 0.002658 -0.012782 -0.009546 
+0.012647 -0.008143 -0.009422 0.014579 -0.003576 -0.006008 
+0.009946 0.000966 -0.002274 0.000231 0.000171 0.000109 
+-0.007155 -0.001516 -0.001014 -0.012395 -0.003220 -0.004211 
+-0.022121 -0.010674 0.000734 -0.011666 -0.007764 0.007846 
+0.000334 -0.004600 -0.000318 0.018045 -0.010608 -0.007123 
+2.740933 -2.000000 -1.259067 2.488506 -2.827586 -1.758621 
+0.012031 -0.031740 -0.016164 -0.001835 -0.020037 -0.013437 
+-0.012755 -0.010602 -0.003174 -0.008799 0.002125 0.002763 
+-0.000352 0.000340 -0.002624 0.000092 -0.000984 -0.000574 
+0.001961 -0.001569 0.001624 0.005562 0.004141 -0.000574 
+0.001083 0.005714 -0.000829 -0.003923 0.003400 -0.001922 
+0.000939 0.001319 -0.005826 0.005585 0.003760 -0.003988 
+0.001925 0.003697 -0.000950 0.002689 0.003610 -0.002381 
+0.004282 0.003459 -0.003120 0.005460 0.005518 -0.002316 
+0.002311 0.004823 0.001312 -0.000520 0.000855 -0.000142 
+-0.000509 0.000250 -0.002579 0.003254 0.006093 -0.002530 
+-0.001225 -0.000672 -0.001746 0.004848 -0.005955 -0.004594 
+0.009599 -0.004675 -0.011981 0.010101 -0.005890 -0.010808 
+0.000912 -0.005875 -0.000722 -0.005360 0.000611 0.014231 
+-0.001588 -0.001653 0.012951 0.008245 0.000446 -0.018568 
+0.027627 -0.015869 -0.044082 0.003944 -0.015531 -0.026679 
+-0.006461 0.001366 -0.004598 -0.007175 -0.000504 0.001606 
+0.004664 -0.002169 -0.001788 -0.004638 0.003318 -0.004972 
+-0.005331 -0.010060 -0.002130 -0.013084 -0.007692 0.005630 
+-0.005779 -0.003373 0.002456 0.002784 -0.001128 -0.001469 
+0.004438 -0.001748 -0.000923 0.002676 -0.001635 -0.000557 
+0.002362 -0.001950 -0.001006 0.006082 -0.003032 -0.002680 
+0.009049 -0.001677 -0.003442 0.005508 0.000773 -0.000094 
+-0.001271 0.002040 0.001443 -0.006064 0.000607 -0.000108 
+-0.004517 -0.000882 -0.000004 0.001623 0.000526 -0.000308 
+0.001930 0.000738 -0.000668 -0.001567 -0.002359 0.000061 
+-0.002486 -0.005174 -0.000849 -0.001346 -0.005673 -0.001487 
+0.000614 -0.004299 -0.000311 0.002934 -0.000232 0.001518 
+0.002868 0.004768 0.001990 -0.002159 0.003751 -0.001399 
+-0.010645 -0.000930 0.006199 -0.005709 0.001001 0.002452 
+-0.002115 -0.001867 0.003057 0.000568 0.002049 -0.001822 
+0.006026 0.004090 -0.013671 0.007914 -0.005094 -0.014631 
+0.010969 -0.008155 -0.007583 0.010502 -0.006371 -0.008653 
+0.014954 -0.004277 -0.002238 0.013423 0.000323 0.002479 
+0.009747 0.000887 -0.000984 0.000201 -0.010124 -0.005126 
+-0.006056 -0.017070 -0.004734 -0.007390 -0.015110 -0.001367 
+-0.008398 -0.009822 0.001063 -0.007789 -0.007353 0.000770 
+-0.000770 -0.008961 -0.002651 0.012562 -0.014409 -0.005500 
+0.022429 -0.024536 -0.008042 0.021977 -0.034576 -0.010875 
+0.012022 -0.030037 -0.007138 0.000476 -0.004179 0.001423 
+-0.006933 0.001840 0.002729 -0.001629 0.000937 0.003343 
+0.005872 -0.004007 -0.001006 0.003868 -0.007098 -0.000240 
+0.005249 0.000426 -0.003970 0.002774 0.000511 0.000965 
+-0.000537 0.004051 0.000885 -0.003724 0.001552 0.001183 
+0.001139 0.002934 0.001564 -0.000180 0.004245 0.004462 
+0.003296 -0.003489 0.002055 0.002804 -0.002408 0.005464 
+0.000944 0.001679 -0.000207 0.002945 0.003743 -0.002226 
+0.001431 0.003636 0.002785 -0.004042 0.002974 0.004429 
+-0.004388 0.000267 0.003192 -0.000642 0.000277 0.000610 
+0.003386 0.005250 0.000069 -0.000033 -0.000136 -0.002200 
+0.004224 0.001511 -0.008078 0.011657 -0.004194 -0.008679 
+0.005062 -0.011278 -0.003306 -0.003606 -0.003107 0.018414 
+-0.011597 -0.005379 0.028629 -0.011787 -0.002182 0.035789 
+-0.010594 0.003191 0.036925 -0.009512 0.009131 0.028822 
+-0.008114 0.011285 0.013246 -0.009820 0.003086 0.001868 
+-0.015594 -0.006448 0.000471 -0.012172 -0.010102 0.002106 
+-0.011266 -0.008914 -0.001022 -0.003375 -0.005257 0.000451 
+0.000459 -0.000664 -0.000350 0.000396 -0.000877 -0.000457 
+0.001071 -0.001991 -0.001299 0.002029 -0.000167 0.000353 
+-0.000323 0.004530 0.003122 -0.000445 0.006235 0.004313 
+0.003521 0.004502 0.001889 0.004754 0.003417 -0.000737 
+-0.000140 0.001753 0.000386 -0.006565 0.000222 -0.000151 
+-0.009024 -0.000951 -0.000061 -0.006347 -0.000942 0.001610 
+-0.003942 -0.000185 0.002321 -0.004424 -0.001115 0.002231 
+-0.003198 -0.003630 -0.000023 -0.001418 -0.004267 -0.001288 
+-0.002294 -0.003570 -0.002375 -0.001586 -0.000375 -0.001059 
+0.002556 0.005031 0.000586 -0.002909 -0.002557 0.002169 
+-0.003313 0.000959 0.009873 0.001160 -0.001650 -0.003198 
+0.006974 -0.007456 -0.011296 0.005864 -0.009950 -0.013531 
+-0.001568 -0.006246 -0.012329 -0.009388 -0.003006 -0.010379 
+-0.015937 -0.008074 -0.007699 -0.014455 -0.016775 -0.000690 
+-0.010354 -0.012243 0.004459 -0.004248 -0.004296 0.005566 
+-0.000802 -0.001053 0.001231 -0.002025 0.001436 -0.000652 
+-0.002170 0.003247 -0.000742 0.000636 0.001022 -0.000224 
+-0.000592 -0.004446 0.000331 -0.006762 -0.009818 -0.000475 
+-0.010463 -0.012491 -0.002537 -0.006595 -0.013153 -0.003895 
+0.002293 -0.014589 -0.003853 0.009714 -0.011053 -0.002066 
+0.006800 -0.002121 -0.004963 -0.000693 0.000700 0.001899 
+-0.003115 0.002294 0.004464 -0.004369 0.000109 0.003122 
+-0.005856 -0.004419 0.001654 0.003067 -0.003067 -0.000588 
+0.000446 -0.005289 -0.000149 0.002784 -0.001746 0.000454 
+0.001202 -0.001316 -0.000193 -0.002847 -0.004070 -0.001792 
+-0.005681 -0.007856 0.009487 -0.005731 -0.001945 0.006015 
+0.000186 0.000796 0.001203 0.003852 -0.000966 0.000434 
+0.002770 -0.000294 0.001651 0.004490 0.003103 0.000943 
+0.005737 0.003382 0.001380 0.003039 0.003842 0.001632 
+0.001245 0.001273 0.000171 0.001105 0.000810 -0.000868 
+0.000662 -0.001706 -0.000415 -0.003863 -0.005988 0.002042 
+-0.006088 -0.002838 0.002307 0.008104 -0.002583 -0.009878 
+0.010493 -0.013991 -0.031628 -0.003009 -0.009374 0.004449 
+-2.892655 0.841808 4.706215 -3.608871 1.508065 6.165323 
+-3.898374 2.235772 6.760163 -3.497382 3.329843 6.015707 
+-2.581560 3.978723 4.340425 -0.020053 0.027371 0.033088 
+-0.030022 0.011845 0.020002 -0.020995 -0.021176 0.027101 
+-0.003265 -0.009478 -0.010770 0.008102 -0.000335 -0.004011 
+-0.003349 0.005644 0.002847 -0.004881 0.007102 0.002749 
+-0.003092 0.002622 -0.000319 0.000349 0.000192 0.000174 
+-0.010850 -0.001667 0.000567 -0.017701 -0.007360 0.011471 
+-0.000245 0.000626 -0.000082 0.003025 0.002636 -0.011966 
+0.005592 0.009417 -0.007916 -0.004092 0.005366 -0.002243 
+-0.011132 -0.000025 -0.003263 -0.008616 -0.004319 0.000581 
+-0.004588 -0.003680 0.002012 -0.006474 -0.004204 0.004742 
+-0.006953 -0.000012 0.002765 0.001323 -0.001606 0.000314 
+-0.001894 -0.000485 -0.001706 -0.004217 0.002159 -0.001428 
+0.003048 0.006696 -0.001007 0.000261 -0.002084 -0.001292 
+0.010709 -0.000289 0.002967 0.014064 -0.000141 -0.000261 
+0.013112 0.003106 -0.000640 0.004524 0.001785 0.001946 
+-0.007388 0.001380 0.004363 -0.012946 -0.001210 0.012222 
+-0.011212 -0.007464 0.013501 -0.006319 -0.006155 0.005140 
+-0.005115 0.000753 -0.000497 -0.003930 0.006542 -0.003193 
+-0.001903 0.004220 -0.001757 0.000779 0.001469 -0.000747 
+0.001322 0.003895 -0.001412 -0.000646 0.006607 -0.002064 
+-0.005263 0.003645 -0.001101 -0.011131 -0.003903 0.000272 
+-0.013021 -0.010009 0.000806 -0.010108 -0.010687 0.001005 
+-0.006947 -0.004400 -0.004379 -0.008668 -0.000647 -0.004062 
+-0.010311 0.004551 -0.003465 -0.008498 0.005080 -0.001609 
+-0.003648 -0.001131 -0.001512 -0.000864 -0.001840 -0.001235 
+-0.001074 -0.002182 0.001212 -0.002211 -0.000635 0.001925 
+-0.000920 0.000102 -0.000228 -0.000220 0.000542 -0.000643 
+-0.001215 -0.002014 0.000313 0.003491 -0.003491 0.001983 
+-0.009897 -0.004470 -0.002300 -0.006692 -0.009769 0.003077 
+0.000353 -0.002253 -0.002362 0.002406 -0.000231 -0.000252 
+-0.000336 0.000000 0.001008 0.003094 -0.001120 0.001553 
+0.001178 -0.000553 -0.000842 -0.001883 0.000310 0.002233 
+-0.001385 0.001401 0.002447 0.000434 0.002159 -0.004792 
+-0.001173 -0.001753 -0.008258 -0.002379 -0.001738 -0.003828 
+-0.008684 -0.000472 -0.000583 -0.000248 -0.000925 -0.000543 
+0.018864 -0.001284 -0.030722 0.008417 -0.021384 -0.017630 
+-3.887500 -1.043750 5.075000 -4.452899 2.155797 6.057971 
+-4.299435 3.545198 6.330509 -4.065574 4.759563 6.281421 
+-3.838284 5.422442 6.013201 -3.350785 5.455497 5.596859 
+-2.796117 6.349514 5.844660 -0.051470 0.048871 0.053885 
+0.003907 -0.016956 -0.003025 -0.007312 0.016250 0.003333 
+-0.011318 0.001317 0.000988 -0.005208 -0.004950 -0.003843 
+-0.006281 0.016833 -0.008109 0.001691 0.017282 -0.012043 
+-0.003453 0.005272 0.000745 0.003287 -0.012076 0.011924 
+0.002460 -0.004298 0.000336 -0.001463 0.000212 -0.002706 
+0.002326 0.001281 -0.003918 0.000382 0.002880 -0.002208 
+0.001865 0.001941 0.001984 0.003534 0.001888 -0.000970 
+-0.000397 -0.001527 -0.000422 -0.004239 -0.005250 0.000604 
+-0.002776 -0.001736 -0.001092 0.004442 -0.005125 0.001763 
+0.004146 -0.004586 0.003736 0.000463 -0.005211 -0.001683 
+-0.000744 0.002545 -0.015205 0.003158 0.008640 -0.002237 
+0.014736 0.003246 0.000429 0.023112 0.002591 0.001984 
+0.020036 0.017278 0.019175 1.417808 2.890411 3.479452 
+2.717703 2.114833 4.569378 4.433884 1.053719 5.123967 
+5.223256 0.316279 5.069767 4.979730 -0.189189 3.378378 
+0.032610 0.002575 0.006357 0.020217 0.009477 -0.005890 
+0.002695 0.003684 -0.001824 -0.005360 -0.001575 0.000946 
+-0.004770 -0.002806 0.000824 -0.002159 0.000650 -0.000256 
+-0.000408 0.003498 -0.002342 0.000390 0.001882 -0.001985 
+-0.001460 -0.000925 0.000866 -0.004688 -0.003507 -0.001066 
+-0.007554 -0.004025 -0.004457 -0.007847 -0.001142 -0.007028 
+-0.004954 0.001567 -0.005864 0.000842 0.001663 -0.004997 
+0.001926 0.001663 0.000969 0.003037 -0.002612 0.001535 
+0.000602 -0.003925 0.000756 -0.001920 -0.001586 0.001517 
+-0.001215 -0.000187 -0.000253 -0.001230 -0.002285 0.000101 
+-0.003860 -0.003086 0.002824 -0.000147 0.000969 0.002114 
+-0.001529 -0.004309 -0.004622 -0.002039 -0.004184 -0.000170 
+0.000162 0.000303 0.000686 0.000958 -0.000330 0.002529 
+0.003384 -0.001910 0.004523 0.001670 -0.000699 0.000833 
+-0.006557 -0.005779 0.009491 -0.002174 -0.002313 0.003256 
+0.004553 0.001906 -0.001120 -0.000576 0.002431 0.001855 
+0.001762 0.006119 -0.002960 -0.002997 -0.002297 0.001401 
+-0.004536 -0.002375 0.001601 0.003898 -0.000835 0.000111 
+0.000897 -0.001449 -0.002588 0.009843 -0.015619 -0.016218 
+-0.020331 -0.031863 0.002235 -2.788820 2.167702 3.850932 
+-3.251701 4.476191 5.346939 -3.451948 5.753247 5.836364 
+-3.492163 6.467084 5.858934 -3.281046 8.529411 5.189542 
+-6.142857 11.492064 -0.285714 -6.463415 14.219512 1.707317 
+0.005579 0.012085 -0.010829 -0.021314 0.006443 0.008022 
+-0.007824 -0.012608 -0.003957 0.005363 -0.001358 -0.000822 
+-0.002985 0.013881 -0.013881 0.009645 0.006308 0.006765 
+0.010917 0.007896 0.002095 0.000528 -0.012274 0.001839 
+0.001080 -0.008641 0.000206 -0.000285 -0.000509 -0.001881 
+0.001913 0.000918 -0.001343 0.004115 0.008194 -0.003143 
+0.003974 0.013639 0.008122 0.021906 0.008787 0.012893 
+-0.002598 0.003416 0.004882 -0.001036 -0.003487 -0.002375 
+0.003969 -0.000446 -0.006157 0.006709 -0.004113 -0.002028 
+0.000424 -0.002878 -0.004608 0.001383 -0.005832 -0.009261 
+-0.004490 0.000952 0.001550 -0.017078 -0.011090 0.002905 
+0.028582 0.015574 0.015167 4.554745 3.386861 4.094891 
+4.778325 4.285714 4.246305 4.709459 4.354730 5.168919 
+5.737101 3.339066 5.886978 7.131455 2.124413 6.147887 
+7.905229 0.754902 6.124183 6.244318 -0.460227 4.914773 
+0.033936 -0.009111 0.009395 0.024091 -0.002954 -0.001343 
+0.002109 0.001492 0.000258 -0.008750 0.000317 -0.002360 
+-0.005122 -0.002862 -0.000374 0.004063 0.000812 0.002666 
+0.005805 0.001048 0.000133 -0.000246 0.001912 0.004925 
+-0.000757 0.000488 -0.001892 -0.004180 -0.003234 -0.003313 
+-0.006397 -0.000330 -0.004409 -0.004848 -0.000379 -0.006613 
+-0.000807 0.000469 -0.007279 0.007336 0.002917 -0.003277 
+0.007976 0.000377 0.003164 0.004411 -0.001365 0.002392 
+0.002258 -0.000114 -0.000028 0.004388 0.001628 -0.001380 
+-0.000135 0.001920 0.000911 -0.002579 0.001408 -0.001093 
+-0.000323 0.000334 0.000758 0.002802 0.005353 -0.000763 
+-0.000177 -0.003138 0.008201 -0.001469 -0.002064 0.007056 
+-0.000568 0.004005 0.005142 0.003678 0.002560 0.005757 
+0.002385 -0.002817 0.006666 -0.005518 0.000292 0.006685 
+0.001714 -0.005474 0.000619 0.001826 0.000584 -0.001607 
+0.007176 -0.001989 -0.002846 0.000120 -0.000300 -0.000473 
+-0.007821 -0.000618 0.003252 -0.004614 0.002048 0.003588 
+0.001366 0.002807 0.003187 0.008367 -0.000792 -0.000023 
+-0.000552 -0.005591 -0.004763 -0.001162 -0.006576 -0.009704 
+-0.003624 -0.005528 -0.010908 0.000310 0.000956 0.001067 
+-1.714286 1.952381 2.595238 -2.261111 4.033333 3.711111 
+-2.211382 5.089431 3.918699 -0.056549 0.051798 -0.010489 
+-0.129386 0.035061 -0.054816 -0.017016 0.032248 -0.021402 
+0.001440 0.002786 -0.002106 -0.006141 -0.009823 -0.008595 
+-0.003644 -0.009083 -0.004374 0.003706 0.006207 -0.000803 
+-0.004831 0.005844 0.012196 -0.006342 0.005855 0.014875 
+-0.011579 -0.011983 0.011647 0.000971 -0.017641 0.007659 
+-0.001368 -0.012743 0.002291 -0.001366 -0.005264 -0.003011 
+0.002467 0.000512 -0.005858 0.000317 0.006993 -0.000702 
+0.001151 0.004357 0.007784 0.004824 -0.001823 0.010302 
+-0.001558 -0.005968 -0.000012 -0.001451 -0.006036 -0.003328 
+-0.005784 -0.003640 0.001035 0.000488 0.000220 0.003282 
+0.002112 -0.001452 0.003333 0.002939 0.000112 0.008929 
+0.010648 -0.032881 0.002537 -0.079512 -0.022595 -0.082144 
+3.645833 3.927083 5.062500 5.268723 5.026432 6.233480 
+5.282353 5.217647 5.397059 5.524064 5.010695 5.697861 
+6.585714 4.111429 6.114286 6.759124 2.627737 5.912409 
+6.771084 0.885542 4.313253 0.019384 -0.020662 0.004720 
+0.017497 -0.002286 -0.001357 -0.001182 -0.005538 0.003692 
+-0.019443 -0.008060 -0.000143 -0.013559 -0.002027 -0.002898 
+0.000090 0.001330 0.000473 0.005807 -0.001893 0.004874 
+0.000538 -0.002392 0.008503 -0.001370 0.002335 0.003150 
+-0.006161 -0.000073 -0.003852 -0.007888 -0.006680 0.002330 
+0.001787 -0.004874 -0.003088 0.001008 -0.003195 -0.005526 
+0.003828 0.001435 -0.004143 0.002956 -0.002339 0.001804 
+0.005707 -0.000818 0.003639 0.004370 0.003824 0.001335 
+0.000016 0.002904 -0.003743 -0.001464 0.003319 0.001367 
+-0.005628 -0.000070 -0.002228 -0.003772 0.000393 -0.001333 
+0.000813 -0.000780 -0.001561 0.003009 0.000160 0.000768 
+-0.002723 -0.000910 0.002627 -0.001222 -0.001554 0.001859 
+0.001974 -0.001294 0.000061 0.002866 -0.000282 0.002431 
+0.000521 0.000248 0.002209 0.000834 0.000272 0.003119 
+0.003952 -0.000462 0.001858 0.004831 0.001227 0.000491 
+0.002900 -0.000005 -0.000583 -0.000144 -0.003667 0.000721 
+0.001301 -0.003252 -0.000407 0.002631 0.000569 -0.000516 
+0.002039 0.004815 -0.002689 0.004545 0.003195 -0.004050 
+0.001877 -0.002816 -0.004237 0.002419 -0.004116 -0.000897 
+-0.000365 -0.000170 0.002732 -0.000023 0.000100 0.000184 
+0.001975 -0.001654 -0.007122 0.015408 -0.013714 -0.018750 
+0.025124 -0.019852 -0.025746 0.009456 -0.008799 0.000928 
+0.001199 -0.003902 0.006370 0.004477 -0.000355 0.001009 
+-0.002196 -0.013169 -0.001465 0.000647 -0.007850 0.000103 
+0.005857 -0.000361 -0.002006 0.000064 -0.000441 0.000657 
+0.001112 -0.000231 0.000045 0.005396 -0.002757 -0.001080 
+0.001361 -0.003167 0.000898 -0.001974 -0.003753 0.005123 
+-0.002821 -0.008711 0.001556 -0.001258 -0.002684 -0.002557 
+0.004855 -0.001091 -0.000108 -0.000877 0.003728 0.002820 
+-0.000307 0.004886 0.002862 0.000213 -0.006364 0.000533 
+-0.000174 -0.004618 -0.001373 -0.003757 -0.006950 -0.001394 
+-0.006347 0.002200 0.002062 -0.003989 0.001478 -0.003681 
+0.008921 0.000066 0.006233 0.010153 0.003559 0.010924 
+0.004158 -0.001239 0.021672 1.672414 2.965517 -17.465517 
+5.211111 5.722222 2.677778 5.608187 5.614035 6.766082 
+5.470833 5.450000 5.404167 4.757991 4.698630 4.794520 
+3.294574 2.860465 3.286822 -0.043047 0.008066 -0.002668 
+-0.018358 0.004218 -0.011758 0.015529 0.005218 0.002587 
+0.005752 -0.007117 -0.002465 -0.019462 -0.010145 -0.010172 
+-0.012465 0.000499 -0.007783 0.000662 0.002794 0.003824 
+0.006292 0.009088 0.007090 0.003945 0.002070 0.008543 
+-0.001871 0.002505 0.003834 -0.005785 0.001590 -0.001621 
+-0.010261 -0.003940 -0.001450 0.000019 0.001537 -0.004666 
+-0.000883 -0.001982 -0.007985 -0.000277 0.002336 -0.000555 
+-0.000754 0.001959 0.002714 -0.000045 0.000815 0.001463 
+-0.002794 -0.001349 -0.003564 -0.000833 -0.002810 -0.005135 
+0.005789 -0.002204 -0.005509 0.000251 -0.001393 -0.002813 
+-0.000648 0.000060 0.001271 0.001191 0.001731 0.000785 
+0.000019 0.003391 0.001592 0.001861 0.001620 -0.000468 
+-0.004567 -0.004179 0.002284 0.000299 0.000388 -0.000776 
+0.002011 0.000574 -0.002687 -0.000737 -0.000441 -0.000585 
+-0.002176 -0.000513 0.000218 0.000800 0.000588 0.000751 
+0.006355 0.003528 0.000475 0.008078 0.004338 -0.001097 
+0.004099 0.001139 -0.002452 0.000758 -0.000726 -0.001677 
+0.002059 0.000392 -0.001634 0.000075 -0.000767 -0.002310 
+-0.000404 -0.000288 -0.000822 -0.000093 0.000139 0.000086 
+0.000336 0.000164 0.001676 0.000498 0.000205 0.002069 
+0.002151 -0.000262 0.000342 0.002719 -0.003083 -0.001489 
+-0.000362 -0.003424 -0.004074 0.001995 0.001770 -0.007034 
+0.007565 0.003765 -0.008474 0.008019 0.002376 -0.006812 
+0.002066 0.000639 -0.001942 -0.001172 -0.007500 -0.001172 
+-0.000503 -0.004539 -0.002482 0.000182 -0.000445 0.000078 
+0.009981 0.009820 -0.009179 0.005180 -0.002685 0.000240 
+0.002193 -0.005992 -0.006994 0.006564 -0.000271 -0.015630 
+0.004820 0.001486 -0.006966 0.002009 -0.002558 -0.004201 
+0.005571 0.002248 -0.006076 0.012021 0.003116 -0.004631 
+0.008354 -0.000975 0.000436 0.001429 0.000033 0.001621 
+0.000659 0.000950 0.001785 0.001288 -0.007156 0.005510 
+0.002069 -0.004760 0.000827 -0.011679 -0.008157 0.001669 
+-0.005559 0.001964 0.005209 -0.001863 0.002353 0.001471 
+0.010169 0.006667 -0.001017 0.004786 -0.001228 0.000411 
+-0.037884 -0.021775 -0.012762 -0.008583 0.028776 -0.005748 
+0.043119 0.020785 -0.003731 0.059288 0.022026 0.039914 
+5.255102 4.316327 3.387755 0.038621 0.007316 0.026348 
+0.010961 0.008384 0.003034 0.006445 -0.006263 -0.003107 
+0.012403 -0.004285 -0.009282 0.003780 -0.006965 -0.007105 
+-0.002643 -0.001491 -0.007513 -0.002940 0.003704 -0.003440 
+-0.004289 0.006072 0.000111 -0.001528 0.007942 0.000858 
+-0.002480 0.006535 -0.000622 -0.003056 0.003238 -0.002665 
+-0.001835 -0.002294 0.000000 -0.000904 -0.005520 0.002861 
+-0.000371 0.000279 -0.000159 -0.000275 0.000235 -0.004167 
+-0.000550 0.001734 -0.003052 0.000212 0.000217 -0.000238 
+-0.001422 -0.000773 0.002065 -0.004505 -0.003916 -0.002673 
+-0.003328 -0.001329 -0.006148 -0.000325 -0.001851 -0.006201 
+0.001029 -0.000572 -0.004167 0.000631 -0.002102 -0.002913 
+-0.001665 -0.000923 -0.002420 -0.001500 0.001048 -0.002935 
+0.000298 0.002298 -0.002076 -0.000208 0.000373 -0.000116 
+-0.002251 -0.001569 0.000270 -0.000032 -0.000101 0.000191 
+-0.000346 -0.000247 0.000395 -0.003107 -0.003086 0.001057 
+-0.003835 -0.002557 0.000647 -0.001582 -0.001101 -0.000680 
+0.001061 -0.000014 0.000930 0.001667 -0.000754 0.001512 
+0.001090 -0.000153 0.001036 0.000104 0.000079 0.000321 
+0.001120 -0.000698 0.000492 0.001770 0.000329 0.000572 
+0.001533 0.001881 -0.001324 0.002231 0.001736 -0.004380 
+0.000006 0.000468 0.000954 0.003266 -0.000484 0.004234 
+-0.001674 -0.001987 0.007146 0.002287 -0.001906 0.004031 
+-0.001945 -0.004386 -0.001004 0.000924 -0.001235 -0.003927 
+0.000403 -0.001111 -0.001871 -0.002305 -0.001085 -0.000610 
+-0.004357 -0.002848 -0.001520 -0.003861 -0.005599 -0.004307 
+-0.000862 -0.003988 -0.010994 0.004243 -0.004627 -0.011952 
+0.006853 0.005028 -0.009434 -0.001003 0.002700 -0.007865 
+-0.000742 0.001386 -0.006403 -0.003542 -0.000146 -0.003929 
+-0.003681 -0.001403 -0.003850 0.002500 -0.006659 -0.002854 
+0.008360 -0.003194 -0.007246 0.011849 -0.001069 -0.004580 
+0.008719 -0.002021 -0.002372 0.005128 -0.003506 -0.004080 
+0.009953 -0.004537 -0.002736 0.001696 0.009983 -0.012372 
+0.000000 0.005853 -0.002931 0.000324 -0.000108 0.003919 
+-0.007645 -0.007381 0.000857 -0.003302 -0.005460 -0.009149 
+0.002197 -0.006058 -0.009003 0.004813 -0.000351 0.000030 
+0.006299 0.007394 0.002318 -0.018795 -0.004797 0.014951 
+-0.015378 -0.026676 -0.002665 -0.006923 -0.034615 -0.002308 
+-0.021703 -0.026559 -0.028796 -0.011048 -0.014051 -0.015522 
+-0.004922 -0.004978 -0.007661 -0.002103 -0.001535 -0.003729 
+-0.004132 -0.000742 -0.000212 -0.003749 -0.000912 0.003836 
+-0.000965 -0.000041 0.004753 -0.001457 -0.004295 0.005535 
+-0.004657 0.000007 -0.001257 -0.003841 0.001139 -0.002488 
+-0.004090 0.005838 -0.003997 -0.000431 0.002418 -0.005670 
+-0.001995 0.000733 -0.000973 0.000941 -0.000292 -0.000270 
+0.001593 0.001275 -0.005338 -0.000332 0.001327 -0.006631 
+0.000118 0.000039 -0.005276 -0.000017 -0.000004 -0.004488 
+0.001686 0.000244 -0.004189 0.002915 0.000236 -0.001746 
+-0.001965 -0.000781 -0.000816 -0.003167 -0.004529 -0.003621 
+-0.002500 -0.002419 -0.004597 -0.001785 -0.001309 -0.001665 
+-0.002103 0.002359 -0.000284 -0.002059 0.000624 0.001715 
+-0.002601 -0.002249 0.003079 -0.001934 -0.001681 0.001579 
+-0.004331 -0.002865 -0.001146 -0.002371 -0.002111 -0.002858 
+-0.003430 -0.002167 -0.002830 -0.004506 -0.003320 0.000466 
+-0.001169 -0.001550 0.001464 0.003340 -0.000296 -0.000316 
+0.001721 -0.002131 -0.001146 0.000639 -0.002439 -0.001269 
+-0.001056 -0.003760 -0.002039 -0.001155 -0.005008 -0.000898 
+-0.001407 -0.005746 0.001311 -0.002246 -0.002918 0.001192 
+0.000470 0.001984 -0.000427 0.004083 0.005610 -0.001531 
+0.001317 0.005376 -0.001015 0.000202 -0.001129 -0.000202 
+-0.005723 -0.005073 0.003273 -0.006724 -0.001274 0.003596 
+-0.001802 -0.001636 0.002583 -0.000435 0.001863 0.003232 
+-0.001402 0.002452 0.002427 -0.002053 0.001531 0.001492 
+-0.000560 -0.000343 0.000099 -0.000768 -0.001662 -0.004822 
+-0.005481 -0.007941 -0.011117 -0.012407 -0.013975 -0.017383 
+-0.001792 -0.005927 -0.016761 0.002297 -0.002677 -0.010724 
+0.001749 -0.000350 -0.001440 -0.002838 -0.004302 0.004864 
+-0.005662 -0.007381 0.006615 -0.007134 -0.009247 0.004007 
+-0.003535 -0.006962 -0.001379 -0.002088 0.001837 -0.001287 
+0.000678 -0.000722 -0.003765 0.012253 0.008752 -0.006744 
+0.000241 -0.000306 -0.003469 0.001230 -0.001519 -0.001287 
+-0.000091 0.002203 -0.001376 0.002428 0.008614 -0.004399 
+-0.003892 0.002607 -0.003887 0.001787 -0.007163 -0.011646 
+0.004574 -0.003187 -0.011684 -0.000275 0.000092 -0.004865 
+-0.000197 0.001253 0.003103 0.002746 -0.001206 0.004744 
+-0.006149 0.002892 0.007212 -0.003953 0.003233 0.003230 
+-0.003704 0.004149 0.004085 -0.002950 0.004016 0.002767 
+-0.001578 0.001853 0.000394 0.000178 0.000977 0.002576 
+-0.001535 0.002112 0.000274 -0.000271 0.002143 -0.001443 
+0.000645 -0.000243 0.000964 0.000486 0.000028 -0.000770 
+-0.000909 0.000506 0.000196 -0.002824 -0.000067 0.002084 
+-0.003081 -0.004919 0.000367 -0.003810 0.000079 0.000159 
+-0.005571 -0.001517 0.002771 -0.006062 -0.001812 0.001024 
+-0.004945 0.000539 0.000734 -0.002205 0.001978 0.001344 
+-0.000633 0.001475 0.001790 -0.001160 0.000292 -0.000171 
+-0.000604 -0.001270 -0.001651 0.001150 -0.000300 -0.001135 
+-0.000078 0.000240 0.000224 -0.001538 -0.000211 -0.001007 
+-0.002570 -0.003915 -0.001420 -0.000225 -0.004065 0.000094 
+0.002086 -0.000887 -0.001839 0.003156 -0.000014 -0.001068 
+0.000928 -0.000754 -0.004002 0.001795 0.001609 -0.005549 
+-0.002186 -0.002630 -0.001426 -0.002259 -0.002898 -0.003217 
+-0.001196 -0.000534 -0.003192 0.000108 -0.000747 -0.000670 
+0.000628 -0.001923 -0.000805 -0.000498 -0.004352 0.002924 
+-0.001421 -0.002076 -0.001251 -0.002271 0.000806 -0.000303 
+-0.001532 0.000701 -0.000058 -0.002661 -0.003468 0.000000 
+-0.001210 -0.004516 -0.001210 0.000368 -0.001515 0.000752 
+0.002644 0.004181 -0.000949 0.004366 0.005093 -0.001455 
+0.002963 0.001290 -0.000456 -0.001875 -0.001200 -0.000425 
+-0.003005 -0.001694 -0.002158 -0.001609 -0.003620 0.000492 
+0.000667 -0.005344 0.003837 0.000532 0.000598 0.001410 
+-0.005560 0.001418 0.003630 -0.001199 0.002542 0.004458 
+0.000304 0.003690 0.002203 -0.000285 -0.001435 -0.000232 
+-0.006231 -0.009666 -0.004202 -0.007686 -0.004711 -0.007015 
+0.001911 0.000556 -0.005989 0.001156 0.000958 -0.002396 
+0.001758 -0.003149 0.000404 0.001898 -0.003845 0.002485 
+0.001319 -0.001125 0.001842 0.001864 0.002331 -0.000140 
+-0.000061 0.000124 0.000222 -0.006319 -0.003651 0.004271 
+-0.008063 -0.000379 0.002408 -0.002612 0.002059 0.002237 
+-0.000711 0.001919 0.002481 -0.001730 0.001384 0.001434 
+-0.002380 0.000082 0.000364 0.001742 -0.000305 0.000488 
+0.004026 0.001651 -0.004914 0.003087 -0.003567 -0.003966 
+-0.001250 -0.005450 -0.006152 -0.003257 -0.004118 -0.010490 
+-0.006559 -0.003178 -0.012204 0.012918 0.014018 -0.010676 
+-0.005404 0.010646 -0.006077 -0.005133 0.007166 0.001598 
+-0.003856 0.003917 -0.000201 -0.002308 0.000501 -0.001242 
+-0.000831 0.000943 0.000068 -0.000475 0.000214 -0.000279 
+-0.000650 0.000885 -0.000531 -0.000076 -0.001036 -0.000577 
+-0.001325 -0.000926 -0.001857 0.004312 0.001551 -0.004785 
+0.003050 0.003826 -0.008777 0.001938 0.003954 -0.006538 
+-0.001487 -0.000556 -0.001306 -0.002686 -0.004931 0.002135 
+-0.000625 -0.004531 -0.000312 -0.001155 -0.001886 -0.000307 
+-0.000039 -0.002017 -0.000572 -0.000146 -0.001096 -0.001301 
+-0.001610 0.000678 -0.002797 -0.001017 0.000254 -0.005508 
+0.000811 0.003416 -0.005284 0.002326 0.000488 -0.001551 
+0.002617 -0.000114 -0.000949 0.002663 -0.001286 -0.001469 
+0.003740 -0.000163 -0.003659 0.001909 -0.004479 -0.003202 
+0.004262 -0.003867 -0.003481 0.005935 -0.002236 -0.002236 
+0.005337 0.001166 -0.003834 0.002623 0.002528 -0.000281 
+0.000605 0.002177 0.000202 0.000161 0.000484 0.000806 
+0.001989 -0.002494 0.000989 0.001425 -0.004993 -0.001104 
+-0.001251 -0.002930 -0.002722 -0.001323 -0.000914 -0.002174 
+0.000204 0.001672 -0.000019 0.002977 0.001875 0.000992 
+0.003104 -0.000642 0.001318 0.001180 -0.004317 -0.000119 
+-0.004722 -0.006825 -0.001505 -0.006935 -0.007951 0.002600 
+-0.002962 -0.002988 0.002477 0.000989 0.001913 -0.001929 
+-0.001339 0.001969 -0.004016 0.000089 -0.000358 -0.005840 
+0.006081 0.001138 -0.006211 0.004103 -0.003393 -0.001657 
+-0.000920 -0.002518 -0.001902 -0.001685 -0.004369 0.001294 
+-0.003280 -0.002067 0.000795 0.003640 -0.000825 0.003728 
+0.002150 0.004318 0.002678 -0.001466 0.007243 -0.004436 
+-0.007123 0.004400 -0.006152 -0.009008 0.002586 -0.003768 
+-0.007296 0.005144 0.001530 0.000999 0.005496 0.002125 
+0.000484 0.003529 -0.001830 0.003532 0.001886 -0.002871 
+-0.000029 0.000503 -0.000114 -0.000169 -0.000697 -0.000947 
+0.000962 -0.001116 -0.002293 0.002459 -0.003166 -0.001552 
+0.000065 -0.003019 -0.004589 0.001645 -0.002513 -0.001717 
+0.002350 -0.000180 0.001656 0.001548 0.002922 0.001778 
+-0.000416 0.003272 0.001408 0.000002 0.001128 0.000495 
+0.001305 -0.003670 -0.000031 0.007083 -0.005271 -0.003547 
+0.002997 -0.006497 -0.007672 -0.003693 -0.006568 -0.010228 
+-0.006534 -0.001374 -0.007775 -0.004537 0.002978 0.000710 
+-0.002236 0.003324 0.004000 0.000085 0.000466 0.001170 
+0.001420 -0.002866 -0.001975 0.001302 -0.003370 -0.004135 
+0.000558 0.000558 -0.005582 -0.001858 -0.000204 -0.001544 
+-0.000625 -0.000550 -0.000413 0.000811 -0.001813 -0.002045 
+0.000159 0.001857 -0.003714 -0.002598 -0.000236 -0.001417 
+0.003484 0.001742 -0.003484 0.003790 0.000998 -0.004687 
+-0.000756 0.001008 -0.003782 -0.002059 -0.001983 0.002471 
+-0.001720 -0.001384 0.004992 -0.002759 -0.000187 0.002479 
+0.000418 0.000430 -0.000372 -0.001791 0.000138 -0.000468 
+-0.002320 -0.001419 0.002337 -0.001821 -0.000917 0.001278 
+0.001417 0.002572 -0.000772 0.002525 0.002604 0.001140 
+0.001665 -0.001295 0.000124 -0.000524 -0.005242 -0.000524 
+-0.002220 -0.005358 -0.000127 0.001612 -0.005088 -0.001780 
+-0.000467 -0.001442 -0.001716 -0.001174 -0.001928 -0.000465 
+-0.000625 -0.002266 -0.000234 0.004397 -0.000531 -0.003841 
+0.003520 0.001175 -0.004352 -0.000727 -0.001050 -0.001939 
+0.000347 -0.001374 -0.001366 -0.004841 -0.006051 0.003182 
+0.000593 0.000353 0.001412 0.002272 -0.001431 -0.000085 
+0.000262 -0.001207 -0.002493 -0.000150 -0.000530 -0.003249 
+-0.000569 -0.001220 0.001138 -0.006288 -0.002358 0.004426 
+-0.008225 -0.001045 0.004309 -0.004483 0.000280 0.003782 
+-0.002686 -0.001402 0.002537 -0.001040 -0.000960 0.000000 
+0.000476 -0.002577 0.000588 0.002732 -0.002086 0.001117 
+0.003228 -0.003150 -0.000630 0.003972 -0.001184 0.000638 
+0.002555 -0.000318 0.001409 0.001497 0.002374 -0.001214 
+-0.000418 -0.000890 -0.000901 0.000039 -0.001306 -0.001027 
+0.000101 0.000231 0.000189 0.000112 0.003528 -0.000757 
+0.000094 0.001700 -0.000369 0.000149 -0.001471 0.007158 
+-0.024674 -0.007592 0.010000 -0.010085 -0.011146 0.007079 
+-0.003729 -0.004021 0.000646 -0.001163 -0.001066 -0.001356 
+-0.001558 0.000618 -0.000221 -0.000349 0.001315 0.001005 
+-0.000806 -0.004080 -0.000731 0.001795 -0.001585 -0.003061 
+0.000114 -0.005507 -0.001429 -0.001356 -0.001987 0.000948 
+0.000078 0.000129 0.001478 0.000518 0.000028 -0.000177 
+0.000802 0.001350 -0.001525 0.000982 0.002011 -0.001535 
+-0.000956 0.001961 -0.000227 -0.003425 -0.000691 0.005182 
+-0.012073 -0.007440 0.004658 -0.001635 -0.002587 -0.004029 
+-0.001337 0.001599 0.000261 0.001293 0.000568 0.002366 
+0.002945 -0.000296 0.001254 0.000138 -0.001260 -0.001642 
+-0.004536 -0.003130 -0.003318 -0.004756 -0.000216 -0.005002 
+-0.003858 0.001612 -0.005333 -0.001937 0.002312 -0.000318 
+0.001492 0.001894 -0.000186 0.000394 0.001298 -0.000044 
+-0.001603 0.000611 -0.000076 -0.002681 -0.000285 -0.000887 
+-0.002609 -0.000280 -0.004039 -0.000053 0.002231 -0.000345 
+-0.003840 0.000165 0.000099 -0.002217 0.000837 0.003177 
+-0.006296 -0.006376 0.004732 -0.004122 -0.007557 0.002519 
+0.000929 -0.004676 0.002896 0.002103 -0.002017 0.001331 
+-0.000210 -0.001733 -0.000715 -0.001838 -0.001212 -0.000910 
+-0.000488 0.000680 0.000276 0.001559 0.002172 0.000309 
+0.000136 -0.000190 -0.000461 -0.002327 -0.001862 0.002327 
+0.000658 -0.000942 -0.000569 -0.001314 0.000057 -0.001330 
+0.001488 0.003211 -0.002467 0.000000 0.000424 -0.001610 
+0.002768 0.001648 0.001690 0.004597 0.000084 -0.000587 
+-0.002307 -0.001542 0.000983 -0.008013 -0.005068 0.002672 
+-0.007221 -0.003641 0.000413 -0.001221 -0.002736 -0.002638 
+0.000802 -0.004202 -0.002149 0.005230 -0.005692 -0.000889 
+0.008543 -0.003832 -0.001768 0.004895 -0.004125 0.000261 
+0.001222 -0.000416 0.003170 -0.002828 0.001559 0.000412 
+-0.004305 -0.000457 -0.001797 -0.001379 -0.002469 -0.003531 
+-0.001088 0.000632 -0.004071 -0.001596 -0.002065 0.000713 
+-0.002499 -0.003900 0.004889 -0.000096 0.000026 0.004154 
+0.002421 -0.000937 -0.000206 0.003236 0.000016 -0.003256 
+0.002371 0.001488 -0.001403 -0.000789 -0.000991 0.000627 
+-0.001720 -0.003020 0.003200 0.000254 -0.002103 0.002712 
+0.001500 -0.001899 -0.000728 0.000360 -0.001932 -0.001204 
+-0.000062 -0.000870 0.000353 0.000845 0.002406 -0.000781 
+0.003586 0.006398 -0.003807 0.003441 0.001054 -0.001065 
+-0.001197 -0.001016 -0.000613 -0.001318 -0.001109 -0.001091 
+0.000896 -0.000350 -0.000468 -0.001605 0.001058 0.000799 
+-0.009725 0.001388 -0.001886 -0.017025 -0.001477 -0.007400 
+-0.022671 0.000760 -0.007513 -0.025429 -0.001198 -0.004289 
+-0.022850 -0.003408 -0.001568 -0.019887 -0.004255 -0.002183 
+-0.016230 0.000021 -0.000866 -0.007690 0.001637 0.002798 
+-0.002003 -0.000089 0.002707 -0.005648 -0.007870 0.006759 
+0.004581 -0.008884 0.003824 0.004568 -0.002099 0.007921 
+0.002733 0.002324 0.006564 0.001329 0.002877 0.004704 
+0.002832 -0.000460 0.003229 0.000187 0.000522 0.000858 
+-0.003118 -0.000949 0.000253 -0.006282 -0.001051 0.000256 
+-0.007509 -0.002429 0.000718 -0.004792 0.004818 -0.000026 
+-0.003935 0.002257 -0.000946 0.001379 -0.000382 -0.002844 
+0.003876 -0.002813 -0.002101 0.003365 -0.002258 -0.001566 
+-0.000588 -0.000766 -0.001723 -0.004856 0.001874 -0.003677 
+-0.006610 0.002594 -0.002510 -0.004030 0.000442 -0.002181 
+-0.000991 -0.002477 -0.001667 -0.000419 -0.003511 -0.000382 
+0.000252 -0.002500 0.000176 0.001049 -0.000820 0.001443 
+0.000928 0.000628 0.000737 -0.001753 0.000278 0.000841 
+-0.001297 0.000107 0.001175 -0.001085 0.000901 0.001218 
+-0.000829 -0.000591 0.004140 -0.001315 -0.000861 0.004488 
+-0.002995 -0.001439 0.002642 -0.000530 -0.002557 0.001152 
+-0.000458 0.000647 0.000727 0.000290 0.003710 0.000581 
+-0.000193 0.002865 0.000523 -0.000869 -0.001109 0.001189 
+-0.004773 -0.003931 0.002910 -0.007291 -0.003845 0.007953 
+-0.004388 -0.003439 0.004625 -0.001566 -0.003267 0.000517 
+-0.002016 -0.003238 -0.002159 -0.002206 -0.004958 -0.000660 
+0.003669 -0.004220 0.001284 0.003369 -0.002910 0.003217 
+0.000945 -0.000508 -0.000466 -0.001312 -0.000538 -0.004540 
+-0.001444 -0.001447 -0.005796 -0.000100 -0.003634 -0.003133 
+-0.003195 -0.003071 -0.002209 -0.001255 -0.000130 -0.001393 
+-0.002001 0.000617 -0.001843 -0.002024 0.000810 -0.002826 
+-0.001111 -0.001461 -0.003684 0.000947 -0.000189 -0.004485 
+0.002068 0.002667 -0.005574 0.001884 0.005901 -0.004426 
+0.003105 0.003954 -0.003758 0.001647 0.000649 -0.003501 
+0.000612 -0.001206 -0.000524 0.000539 -0.000465 0.001136 
+-0.001092 0.001732 -0.001930 0.004993 0.006821 -0.011135 
+0.010128 0.001770 -0.014667 0.014037 0.001212 -0.012090 
+0.022659 0.002119 -0.010759 0.022446 0.000182 -0.019446 
+0.015981 0.009522 -0.017134 0.012168 -0.018358 -0.008722 
+0.002908 -0.017679 -0.016549 -0.012310 -0.012426 -0.010550 
+-0.016609 0.006855 0.005338 -0.031423 0.001791 -0.004164 
+-0.020774 -0.000850 -0.003831 -0.000728 -0.000383 -0.005771 
+0.004782 0.001770 -0.008734 -0.006825 0.001075 -0.004812 
+-0.019978 -0.003974 0.003024 -0.011175 0.002499 -0.000403 
+-0.002367 0.003056 -0.008747 0.004397 0.011048 -0.007759 
+0.002784 0.003859 -0.000412 -0.001721 -0.000118 0.002082 
+-0.002117 -0.001764 0.000997 0.000458 -0.003495 0.002945 
+-0.002322 0.000866 0.003154 -0.005265 0.000126 0.004511 
+-0.004043 -0.001974 0.001879 -0.000082 -0.000051 -0.004773 
+0.004041 -0.000784 -0.009453 0.004576 0.000583 -0.007529 
+0.000542 0.002201 -0.005199 0.000684 0.002991 0.000000 
+-0.000873 0.001059 -0.000931 -0.002341 0.001235 -0.000282 
+-0.006027 0.000193 -0.001013 0.000014 -0.001368 0.006767 
+-0.001514 -0.008542 0.006872 -0.000476 -0.008245 0.001453 
+0.000645 -0.003835 -0.000494 -0.001618 -0.001175 -0.001766 
+0.000771 0.001989 -0.003014 0.006167 0.002042 -0.001208 
+0.007914 0.001497 0.002139 0.004377 0.000798 0.005708 
+-0.002649 -0.004045 0.006277 -0.005082 -0.003969 -0.003899 
+-0.004776 -0.002511 -0.003824 -0.000667 -0.001075 -0.000358 
+0.002403 -0.001303 0.001706 0.001059 0.001356 0.001653 
+0.000516 -0.002492 -0.000060 0.001663 -0.000783 -0.004532 
+0.002531 -0.001112 -0.002839 -0.002457 -0.000788 -0.003221 
+0.000649 -0.001517 -0.000011 -0.003188 -0.006797 0.004431 
+-0.002891 -0.000711 -0.000853 0.000683 -0.000539 -0.002517 
+0.002452 -0.002930 0.000006 -0.000160 -0.001600 -0.000333 
+-0.000058 -0.001530 0.000178 -0.003350 -0.000604 -0.000306 
+-0.003561 0.000335 -0.002542 -0.003975 0.002386 -0.003093 
+-0.002277 0.001857 -0.004397 -0.001274 0.000289 -0.003275 
+0.001229 0.000162 -0.002717 -0.000085 -0.000745 -0.002159 
+0.000945 -0.001172 -0.001776 0.002194 -0.000703 -0.001523 
+0.002647 0.001107 -0.000770 0.002321 0.001825 -0.000898 
+0.001016 0.001589 -0.001903 -0.000617 0.001101 -0.000960 
+-0.000660 -0.001180 -0.001427 -0.000067 -0.000356 0.000032 
+0.006843 0.005070 -0.004240 0.001804 0.003385 -0.006630 
+-0.011261 0.000766 0.002070 -0.023227 -0.000555 0.011393 
+-0.027569 0.000045 0.015797 -0.021995 0.000859 0.015355 
+-0.009403 0.000890 0.010424 0.004242 0.001805 -0.000446 
+0.009936 -0.002121 -0.006848 0.000906 -0.009936 -0.000751 
+0.006676 0.003117 0.007460 0.015608 0.005456 0.019479 
+0.023509 0.003517 0.021547 0.027485 0.001505 0.017131 
+0.025588 0.001069 0.009300 0.017797 0.002302 0.002608 
+0.005795 0.002368 -0.001071 -0.007137 -0.001723 -0.002397 
+-0.011193 -0.009839 0.003735 -0.008012 -0.001490 0.019317 
+-0.002843 0.003420 0.013594 -0.001987 0.000368 0.007438 
+-0.000735 -0.001586 0.005002 -0.000795 0.000249 0.003246 
+-0.001862 -0.000051 -0.000410 -0.002608 0.002167 -0.001492 
+-0.002444 0.001125 0.000225 -0.000221 0.000000 -0.004118 
+0.002210 0.000067 -0.006005 0.000072 0.000503 -0.004922 
+0.000657 0.000281 0.000097 -0.000870 -0.000750 0.005341 
+-0.000766 -0.000171 0.007766 -0.000765 0.000177 0.007143 
+-0.001506 -0.000104 0.005351 -0.001362 -0.000627 0.003524 
+-0.001563 -0.001852 0.001736 0.000803 -0.001902 0.000972 
+0.001599 -0.002387 0.002015 0.002295 -0.001179 -0.000310 
+0.000057 -0.003131 0.000754 -0.000224 -0.001886 0.002605 
+-0.000363 -0.000508 0.004390 0.002309 0.000580 0.006335 
+0.002782 -0.003940 0.002894 0.000960 -0.002515 0.000828 
+-0.004121 -0.003107 -0.000697 -0.005085 -0.005243 0.002861 
+-0.004359 -0.003344 0.000913 -0.000128 -0.000795 -0.000396 
+-0.000513 0.000154 -0.000923 0.000079 -0.001429 -0.001508 
+0.001289 -0.001800 0.002602 0.000860 -0.000256 0.000197 
+0.000132 0.001150 0.000354 -0.000545 -0.000565 -0.001040 
+-0.000124 0.001265 -0.001128 -0.001437 0.001356 0.001533 
+0.000459 0.000165 0.001219 0.002815 0.000385 -0.000446 
+0.001792 0.000111 -0.001055 -0.000625 -0.001294 -0.000600 
+-0.002291 -0.002117 0.000247 -0.004329 0.000143 0.000983 
+-0.004774 -0.001618 0.000917 -0.002446 0.000901 -0.003265 
+0.003926 -0.002999 -0.000655 0.004230 -0.006425 0.000421 
+0.000018 -0.003059 0.000694 0.002960 0.001338 0.002061 
+0.001610 0.000569 0.001275 -0.002005 -0.002883 -0.000492 
+-0.003542 0.001105 -0.000130 -0.002677 0.001797 0.000181 
+0.002207 0.002595 0.000528 0.004178 -0.000568 -0.000435 
+-0.004598 -0.005312 0.003404 -0.017255 -0.005542 0.012150 
+-2.929515 -0.550661 1.378855 -3.475524 -0.150350 1.825175 
+-3.747634 0.293375 2.141956 -3.766892 0.756757 2.412162 
+-3.552036 1.171946 2.678733 -0.029090 0.009299 0.035810 
+-0.047720 -0.018977 0.029310 -0.013139 -0.026984 -0.006812 
+0.021204 0.007980 0.020219 2.947619 1.461905 3.176190 
+3.762238 1.381119 3.066434 4.038462 0.721154 2.689103 
+3.695205 -0.243151 2.191781 2.784810 -0.953587 1.746835 
+0.013646 -0.009799 0.015711 0.001925 -0.008404 0.005027 
+-0.016245 -0.009065 -0.007625 -0.025282 -0.004902 0.003144 
+-0.000363 -0.002344 -0.001005 0.000982 0.001342 0.003575 
+0.000653 0.000136 0.004025 -0.001233 -0.000824 0.002979 
+-0.001618 0.000212 -0.000447 -0.002593 0.002570 -0.001690 
+-0.002915 -0.000072 -0.003212 0.001628 0.000638 -0.004647 
+0.002339 0.001485 -0.001379 0.000048 0.003013 0.000349 
+-0.001193 0.001363 -0.005970 0.002173 0.002594 -0.007686 
+0.000089 0.001987 -0.002801 -0.002770 -0.004178 0.000063 
+-0.005084 -0.006228 0.003609 -0.005814 -0.006124 0.000000 
+-0.001769 -0.004367 -0.002911 -0.001543 -0.000747 -0.000338 
+-0.001767 0.000655 -0.002119 -0.001754 0.000192 -0.001030 
+0.002749 -0.001690 -0.001955 0.002289 -0.000488 -0.001526 
+0.000242 -0.000598 0.002391 -0.003010 -0.001757 0.002847 
+-0.002806 -0.002789 0.000790 -0.000167 -0.002716 -0.001086 
+0.001408 -0.004881 -0.001718 0.000000 -0.005032 0.001078 
+-0.002225 -0.003540 0.002211 -0.002430 -0.002713 0.003295 
+-0.001219 -0.002274 0.003945 -0.002080 -0.003408 0.001136 
+-0.001699 -0.006304 -0.001867 -0.003503 -0.005277 -0.001423 
+0.000460 0.000855 -0.004185 -0.001099 0.000401 -0.001961 
+0.000272 0.000124 0.000366 0.000013 -0.002074 -0.000315 
+0.002968 -0.000023 -0.003230 -0.001462 0.000233 -0.002307 
+0.005959 0.000833 -0.000204 0.000090 -0.002779 -0.000224 
+-0.002067 -0.004025 0.001664 -0.001483 -0.002423 -0.003313 
+0.002507 -0.001584 -0.006947 0.007198 -0.000429 -0.005867 
+0.006033 0.000259 -0.000349 0.000991 -0.001643 0.001061 
+-0.002041 0.001133 -0.000508 -0.004898 0.001572 0.000518 
+-0.005523 -0.000533 -0.002282 -0.007072 -0.000413 -0.005384 
+-0.008123 -0.001611 -0.003088 -0.000593 -0.003057 0.000296 
+0.007097 -0.001363 -0.000250 0.005334 -0.002306 -0.000853 
+-0.008089 -0.008859 0.001272 -2.425000 -1.115000 0.705000 
+-3.531915 -0.602837 1.372340 -4.232493 0.103641 2.081233 
+-4.607792 0.693506 2.781818 -4.468023 1.159884 3.273256 
+-3.700000 1.524000 3.296000 -2.966667 1.566667 2.846667 
+-0.027371 0.004097 0.045969 -0.001457 0.006250 0.000305 
+2.446154 2.076923 3.438462 3.088028 1.746479 3.521127 
+3.932039 1.220874 3.259709 4.472603 0.625571 3.002283 
+4.434066 0.079670 2.530220 3.674510 -0.282353 1.694118 
+0.018983 -0.005802 0.012912 0.008175 -0.003278 0.006081 
+0.000223 -0.002031 0.000861 -0.007725 0.001200 -0.003617 
+-0.002511 0.004814 -0.002673 -0.000405 0.000854 0.004619 
+-0.000831 -0.002619 0.008365 -0.003651 -0.002985 0.006901 
+-0.005417 0.000339 0.003681 -0.001128 0.002690 0.001039 
+0.000863 0.000572 -0.003392 0.003619 -0.003357 -0.007762 
+0.000914 -0.004114 -0.007541 0.002454 -0.003405 -0.005735 
+0.003888 0.002687 -0.005384 0.006002 0.000841 -0.000152 
+0.001828 -0.000154 0.001000 0.001114 -0.001273 0.003657 
+-0.004922 -0.007752 0.004922 -0.000069 -0.005888 -0.003030 
+-0.002099 -0.004736 -0.002440 0.002499 -0.000500 -0.005474 
+-0.001199 -0.000293 -0.003961 -0.000880 0.000160 -0.001382 
+-0.004943 -0.002812 0.000705 -0.005619 -0.002968 0.002778 
+-0.000886 -0.001006 -0.000355 0.000065 -0.001233 -0.000672 
+-0.002178 0.002661 -0.004901 0.004333 -0.000417 -0.002583 
+0.000560 0.003449 -0.003493 0.002623 0.000253 -0.002079 
+-0.000585 0.000696 0.000221 -0.001327 -0.000303 0.000528 
+0.003073 0.001302 0.001213 -0.000242 0.000178 -0.000831 
+0.002877 -0.000221 0.000388 0.001798 -0.000621 0.000128 
+-0.000225 0.000197 0.000101 -0.002089 0.000758 0.000153 
+-0.000787 -0.000743 0.000845 -0.000806 0.000841 -0.001470 
+0.002166 -0.001707 -0.000291 0.010988 0.004620 -0.001233 
+0.004738 0.002410 -0.004544 0.001540 -0.000662 -0.000962 
+-0.002261 -0.002335 -0.000301 0.002354 -0.001930 0.000907 
+0.006340 -0.005068 0.006168 0.008496 -0.004700 0.006279 
+-0.003945 0.000044 -0.001110 -0.006758 0.003282 -0.015404 
+-0.019291 0.015125 -0.011814 -0.024051 0.013212 -0.006272 
+-0.023467 0.008231 -0.003683 -0.016326 0.003810 -0.002478 
+-0.002526 0.001273 -0.000557 0.009647 0.000811 0.001087 
+0.012544 0.001181 0.001574 0.009351 0.001258 0.001731 
+0.011394 -0.004272 0.001247 0.022312 -0.016457 -0.011302 
+0.000650 -0.009748 -0.009595 -0.023092 -0.004309 0.012722 
+-3.545045 0.581081 2.018018 -3.567797 0.872881 2.444915 
+-3.037838 0.929730 2.313514 -0.016977 0.010566 0.021000 
+-6.016394 8.688524 1.311475 0.018933 0.016389 0.075454 
+0.015717 0.013481 0.024996 2.543071 1.468165 2.033708 
+3.590909 1.269480 1.860390 4.055762 0.806691 1.535316 
+0.026416 -0.005165 0.014316 0.013613 -0.003641 0.004722 
+0.009727 -0.006778 -0.000777 0.002073 -0.005356 -0.004100 
+-0.005287 0.002235 -0.004880 -0.006873 0.001775 -0.005869 
+-0.003213 0.001017 -0.001128 0.000380 -0.000886 0.003905 
+0.002505 -0.003062 0.004906 -0.006015 -0.006669 0.003660 
+-0.009898 -0.005347 0.002095 -0.007997 -0.002382 -0.002297 
+-0.001082 -0.001529 -0.001945 0.004141 0.000702 0.000042 
+0.003991 0.002917 0.002276 0.002401 0.002555 0.001883 
+-0.004144 -0.001657 0.003522 0.000256 0.000229 0.001801 
+-0.000519 -0.001745 -0.003576 -0.000787 -0.005849 -0.003273 
+-0.001343 -0.002958 0.001434 -0.002699 0.000117 -0.000821 
+-0.001690 0.001907 -0.000382 0.000527 -0.000037 0.000312 
+0.001799 -0.000922 0.000398 -0.000538 -0.000745 0.000662 
+-0.004111 -0.001291 -0.000278 -0.003197 0.000153 -0.002420 
+-0.001106 -0.000724 -0.001778 -0.000387 -0.001407 0.000245 
+0.003505 0.001537 0.002363 0.004443 0.001672 -0.002192 
+0.001137 -0.000487 0.003555 -0.002992 0.001406 0.002918 
+-0.007327 -0.004179 0.003000 -0.006771 -0.003415 0.002392 
+-0.002484 -0.000023 -0.002908 -0.000576 -0.000414 -0.003751 
+-0.005668 -0.004481 -0.001608 -0.000634 -0.002115 -0.001298 
+0.000259 0.000602 -0.000058 -0.001039 -0.000347 -0.000778 
+-0.004010 -0.000509 -0.000539 -0.002306 -0.000161 -0.001614 
+0.000917 -0.000535 0.000313 0.004672 -0.001651 -0.000420 
+0.002026 0.001052 0.000289 -0.003532 -0.003532 0.001746 
+-0.004526 -0.000679 0.000564 0.002562 -0.004548 0.002432 
+0.000402 -0.000727 0.000227 -0.012850 0.008687 -0.005171 
+-0.025545 0.030705 -0.008147 -4.304000 2.736000 -1.688000 
+-4.078313 2.493976 -1.566265 -3.437500 2.036458 -1.380208 
+-0.023277 0.015439 -0.006458 -0.007272 0.007484 -0.001918 
+0.003948 0.000403 0.000931 0.002965 -0.003154 0.001166 
+-0.002570 -0.002238 -0.001331 -0.003486 -0.002046 -0.003577 
+-0.001336 0.000031 -0.000617 0.002429 -0.000320 0.005685 
+-0.001490 0.003603 0.005730 -0.012299 0.003577 0.008577 
+-0.010804 0.004126 0.007874 -0.000692 -0.000253 0.004269 
+0.008514 -0.001023 -0.005193 -0.000441 -0.012409 -0.007403 
+-0.000608 -0.000473 0.000900 -0.011007 0.004375 0.000908 
+-0.008739 -0.000363 -0.001515 -0.007544 -0.005015 -0.008614 
+-0.010094 -0.006172 -0.015392 -0.003644 -0.001339 -0.007180 
+0.006791 0.000513 0.004373 0.007847 -0.004745 0.003512 
+-0.000978 -0.003155 0.000678 -0.004174 -0.002024 0.001517 
+-0.006289 0.002552 -0.001592 -0.001669 0.002046 -0.002548 
+0.000771 0.000278 -0.003124 -0.002575 -0.000277 -0.002837 
+-0.001684 -0.007079 -0.000162 -0.001780 -0.003814 0.004153 
+-0.000911 -0.001295 0.001912 0.002771 0.003303 0.000057 
+0.001344 0.007441 0.000915 0.002296 0.004238 0.001148 
+0.001441 0.000000 -0.000096 0.001523 -0.001903 -0.000303 
+0.000629 -0.002577 -0.000099 0.000792 -0.002191 0.000061 
+-0.003868 -0.002564 -0.001051 -0.000899 -0.001641 0.001049 
+-0.002086 -0.000267 -0.001569 0.006635 0.004642 -0.000817 
+0.007453 0.005343 -0.001195 -0.001331 0.001863 -0.007154 
+-0.000964 0.001108 -0.003240 -0.001649 -0.001532 0.000183 
+0.000606 -0.001683 0.000775 -0.001231 0.000539 0.000037 
+-0.000538 0.002263 0.001068 0.000047 0.000551 -0.000190 
+0.000874 -0.002410 0.001005 0.003246 -0.003495 -0.002735 
+0.002036 -0.003439 -0.006312 0.000507 -0.003280 -0.002695 
+-0.003494 -0.005465 0.000892 -0.005161 -0.005998 -0.000633 
+0.002045 -0.001026 0.000221 0.001292 -0.001292 0.002583 
+-0.003902 -0.007118 -0.001154 -0.002169 -0.001188 -0.004079 
+-0.002022 -0.000354 -0.000905 0.000434 0.000755 0.000059 
+0.000453 -0.001191 -0.000722 0.001956 -0.003145 -0.000056 
+0.001459 -0.001256 0.001791 0.006594 -0.000522 0.001126 
+0.000657 0.000361 0.001734 0.000384 -0.002049 0.001575 
+-0.002876 -0.007111 0.000719 0.000802 -0.006723 -0.001108 
+-0.005825 0.000803 -0.003574 -0.021836 0.017812 -0.014427 
+-3.949640 2.697842 -2.071942 -4.420000 2.460000 -1.775000 
+-4.065041 2.032520 -1.422764 -3.182927 1.617886 -1.162602 
+-0.018082 0.010782 -0.005802 -0.003187 0.003603 -0.000374 
+0.001139 -0.001675 -0.000245 0.002481 0.001186 -0.000774 
+-0.000625 0.000770 0.000541 -0.000688 0.002105 0.001301 
+-0.000873 0.000957 0.000555 0.003059 -0.003610 -0.000303 
+0.003819 0.000825 -0.001552 0.006635 -0.005717 -0.003493 
+-0.000974 -0.001927 -0.002436 0.002577 0.002680 -0.006082 
+0.006589 0.003887 -0.008854 0.005932 -0.000818 -0.001400 
+-0.006407 -0.006819 -0.003487 -0.016951 -0.004166 -0.007809 
+-0.026164 -0.002584 -0.006536 -0.013875 -0.003142 0.000062 
+0.000325 0.008672 -0.021144 -0.009510 -0.001079 -0.006819 
+0.001227 -0.000270 -0.007779 0.000220 -0.002719 0.001418 
+0.001573 -0.001970 0.001153 0.003740 -0.000442 -0.002478 
+0.003678 0.002873 -0.004795 0.000484 0.004113 -0.002339 
+-0.003923 -0.000135 -0.001803 -0.005560 -0.000495 0.003981 
+-0.002416 -0.001858 0.009107 -0.001481 -0.007704 0.001173 
+-0.005895 -0.007554 0.001406 -0.005585 -0.004478 0.006209 
+-0.001143 -0.004290 0.003138 0.000040 -0.000555 0.000197 
+0.000885 -0.000553 -0.000127 -0.001278 -0.000771 0.000501 
+-0.000142 -0.004550 0.003555 0.000819 -0.002262 0.002223 
+0.003205 0.001783 -0.002351 0.000253 0.003189 -0.005717 
+-0.000715 -0.000450 -0.002237 0.003704 0.002353 -0.004402 
+0.000534 0.002322 -0.001765 -0.000375 0.001994 -0.000158 
+-0.001181 -0.000636 0.000227 -0.001015 0.003899 -0.001004 
+0.000900 0.002734 -0.002347 0.001009 0.000099 -0.005695 
+0.002070 -0.004597 -0.002842 0.003230 -0.003072 0.001576 
+-0.005384 -0.006261 -0.000093 -0.008969 -0.009033 0.002148 
+-0.007065 -0.003018 -0.001124 0.000321 -0.008095 0.010596 
+-0.003663 -0.001723 0.003972 0.000733 -0.000133 -0.000716 
+0.003631 -0.001276 -0.003581 0.005183 -0.002310 -0.001648 
+0.000648 -0.000114 -0.001165 -0.002222 0.000367 -0.001128 
+-0.001978 0.000452 0.002401 -0.000599 0.003124 0.002578 
+-0.000398 0.000993 -0.000008 0.003270 -0.002595 -0.000311 
+0.008436 0.001301 -0.001875 0.006741 0.002951 -0.001938 
+0.002347 0.001285 -0.002411 0.001110 0.000423 -0.000658 
+-0.001065 -0.001406 -0.000531 -0.004371 -0.000174 -0.002639 
+-0.007828 0.015760 -0.010958 -3.877698 2.489209 -1.776978 
+-4.511521 2.700461 -1.718894 -3.992857 2.414286 -1.535714 
+-3.200717 1.939068 -1.279570 -0.017353 0.014684 -0.010693 
+-0.003943 0.003790 -0.001913 0.005154 -0.004919 0.003950 
+0.002733 -0.003912 0.002494 -0.000954 -0.001499 -0.004535 
+0.003658 -0.000181 -0.001938 0.001726 0.000314 -0.000990 
+-0.004424 -0.001737 -0.001147 -0.004317 -0.000501 -0.000888 
+-0.000005 0.001090 -0.002182 0.003300 0.005028 -0.005781 
+0.005253 0.004850 -0.008223 0.001824 0.001649 -0.005604 
+-0.001654 -0.002604 -0.002532 0.000243 -0.003040 -0.003385 
+-0.001383 -0.001945 -0.006676 -0.004266 0.000020 -0.004572 
+-0.004562 0.005866 -0.012182 -0.002045 0.003139 0.001830 
+0.000515 -0.000277 0.008599 -0.001594 -0.004281 0.012286 
+-0.003448 -0.003496 0.010907 -0.004462 0.000749 0.005793 
+-0.004946 -0.000010 0.000963 -0.001335 -0.001053 0.000185 
+0.000170 -0.000815 -0.001146 0.000656 -0.000984 -0.000738 
+-0.000797 0.001241 -0.000066 -0.000682 0.002166 0.000481 
+-0.001067 0.001492 0.001546 0.003123 -0.002659 0.004496 
+0.001906 -0.001685 0.001439 -0.001782 0.000801 -0.000504 
+-0.003947 -0.001436 -0.000174 -0.004274 -0.002832 0.000461 
+-0.003917 -0.003657 0.000790 -0.004596 -0.002665 0.000321 
+-0.004042 -0.003126 -0.002609 -0.003966 -0.001559 -0.002549 
+0.000276 0.001749 -0.003728 0.003633 0.001311 -0.004507 
+0.003440 0.003482 -0.003053 0.001660 -0.000231 -0.002395 
+0.001742 -0.000644 -0.001754 0.000737 -0.001049 -0.001773 
+0.000611 0.000773 -0.000486 0.001398 0.004982 -0.002028 
+0.004584 0.004038 -0.004150 0.003154 0.000576 -0.005983 
+0.001934 -0.001585 -0.005311 -0.000110 -0.002724 -0.002599 
+-0.001518 -0.000403 -0.000428 -0.004490 -0.000222 0.003493 
+-0.007104 -0.000455 0.005775 -0.009478 -0.002357 0.004900 
+-0.006066 -0.009215 0.006531 -0.007206 -0.004992 0.003119 
+-0.003239 -0.005749 0.002070 -0.000140 -0.003548 0.006775 
+0.000545 -0.004009 0.000692 -0.002991 0.000882 -0.000355 
+-0.000772 0.000479 -0.002280 0.000276 -0.001033 0.000810 
+0.002032 -0.004896 0.001501 0.001477 -0.005840 -0.000134 
+0.003212 -0.000936 0.000549 0.000693 0.003582 -0.005316 
+-0.002624 0.003072 -0.001133 -0.001381 0.001326 0.000393 
+-0.000102 -0.002223 -0.000910 0.003187 -0.002192 -0.001533 
+-0.011061 0.016664 -0.012259 -3.124352 2.891192 -1.678756 
+-3.712687 2.869403 -1.514925 -3.395760 2.427562 -1.289753 
+-2.216450 1.727273 -1.069264 -0.005836 0.005159 -0.007661 
+0.005036 -0.004441 -0.004393 0.001238 -0.003679 -0.001069 
+-0.000468 0.000828 -0.005496 0.002190 0.006458 -0.004844 
+0.005747 0.005640 -0.006751 0.002148 -0.001517 -0.000221 
+0.002007 0.000572 -0.002076 0.001246 -0.000184 0.000361 
+0.001435 0.000509 0.000162 0.001153 0.000534 -0.000261 
+0.000912 -0.000169 0.001988 -0.000229 -0.001006 0.004351 
+-0.000560 -0.004649 0.004854 0.001466 -0.005564 0.003570 
+-0.000222 -0.004356 0.003956 0.004334 0.001298 0.001847 
+0.006739 -0.002020 0.003410 0.003817 -0.002441 -0.001728 
+0.000408 0.000107 -0.001338 -0.002633 -0.000779 0.005264 
+-0.000446 -0.004029 0.008390 -0.003409 -0.005666 0.001143 
+0.002562 -0.003660 -0.000206 0.001265 -0.003215 0.000151 
+-0.000467 -0.002819 0.000999 -0.003113 -0.000775 0.002235 
+-0.003394 0.002587 -0.002807 0.000000 0.005748 -0.004488 
+0.000549 0.000681 -0.000434 -0.000214 -0.007196 0.004280 
+-0.002057 -0.006519 0.003278 0.000189 0.000132 -0.000011 
+0.000276 0.005962 -0.002227 -0.000220 0.000101 -0.006337 
+0.000284 0.002780 -0.002400 -0.001341 0.000570 -0.001643 
+-0.000749 -0.000803 -0.000831 -0.001448 -0.001806 0.000583 
+-0.000243 -0.002990 0.000845 0.000606 -0.000568 -0.000114 
+0.001763 0.001702 -0.000335 -0.000235 0.003496 -0.002571 
+-0.002868 0.001030 -0.000345 -0.002745 -0.001593 -0.000907 
+-0.003902 -0.001616 -0.002009 -0.003811 -0.004211 -0.002758 
+-0.001333 -0.004935 0.001826 -0.001887 -0.004492 0.001472 
+-0.002634 -0.002310 -0.003180 -0.002604 -0.003781 -0.000367 
+-0.004859 -0.004570 0.000429 -0.005809 -0.001187 0.002875 
+-0.003524 -0.003483 0.002363 -0.001684 -0.000318 0.001435 
+-0.001636 0.000707 0.002873 -0.001345 -0.002373 0.006047 
+-0.001920 -0.001817 0.005507 0.002774 -0.000413 0.003404 
+-0.001896 -0.004929 -0.001037 -0.001811 -0.001609 -0.001070 
+-0.000808 0.001597 -0.001124 0.000111 -0.000258 0.000470 
+0.002421 -0.000244 0.001808 0.004009 0.000440 -0.000681 
+0.004861 0.001439 -0.002782 0.001177 0.001678 -0.006762 
+-0.001633 0.003121 -0.004224 -0.002925 -0.000130 -0.003794 
+0.002336 -0.001722 0.002571 0.009560 0.000741 0.005510 
+-0.004648 0.017331 -0.003204 -1.967742 2.700461 -1.534562 
+-2.352273 2.662879 -1.503788 -1.987395 2.113445 -1.264706 
+-0.008350 0.010449 -0.006905 0.003468 -0.007384 0.007179 
+0.006416 -0.005518 -0.001145 0.002228 -0.002320 0.005410 
+0.001632 0.001054 -0.004420 0.008062 0.000284 -0.008843 
+0.006411 0.004631 -0.004703 0.002287 0.000106 -0.003147 
+-0.003246 0.003102 -0.000268 -0.005263 0.004964 -0.003252 
+-0.004092 0.005462 -0.002046 -0.000101 0.003472 -0.003270 
+0.000731 0.000234 0.000011 0.000076 -0.001480 0.001561 
+0.000267 -0.002123 0.001600 0.000675 -0.001006 0.001210 
+-0.002625 0.001148 -0.000763 -0.000336 0.002473 -0.000297 
+0.000312 0.001235 -0.002678 0.000584 -0.000220 -0.001030 
+-0.005429 -0.002984 0.001888 -0.004767 -0.002919 -0.002592 
+-0.000911 -0.000619 -0.001845 0.006843 0.001573 -0.005819 
+0.006002 -0.002481 -0.001032 0.001765 -0.003401 -0.000597 
+-0.001483 -0.005872 0.001423 -0.000873 -0.004590 0.001534 
+0.000451 0.000330 -0.000018 -0.000221 0.004112 -0.000023 
+-0.002787 0.001264 0.001521 0.000271 -0.004269 0.002418 
+-0.001881 0.000706 0.001313 -0.003349 0.006730 -0.002149 
+-0.007908 0.010647 -0.006714 -0.009817 0.011836 -0.010364 
+-0.008093 0.003151 -0.004165 -0.003006 -0.004042 0.000872 
+-0.003058 -0.006781 0.002016 -0.007285 -0.005255 0.001457 
+-0.004606 -0.002727 -0.002303 -0.001794 -0.001295 -0.002012 
+0.000180 0.001797 -0.004000 0.000792 0.000198 -0.001783 
+0.000912 -0.001317 -0.000597 0.002478 -0.001713 0.001450 
+0.001546 -0.000750 0.002793 0.000765 0.001368 0.002765 
+-0.002420 0.001839 0.003120 -0.002343 0.000491 0.001247 
+-0.000710 -0.001062 -0.001311 -0.000978 0.000073 -0.004295 
+0.000785 -0.001095 -0.000735 0.002923 -0.000822 -0.002355 
+0.006300 -0.000390 -0.000501 0.004144 -0.001092 -0.001865 
+0.000403 0.000210 0.000226 -0.000370 0.000086 0.001753 
+-0.000269 -0.002089 0.001746 -0.001526 -0.001055 0.002419 
+-0.000686 -0.002696 -0.000375 -0.003333 -0.001394 -0.002811 
+-0.002804 0.000330 -0.001232 -0.000273 -0.002101 -0.001460 
+-0.001600 -0.001129 -0.000826 -0.001440 -0.000228 -0.002511 
+-0.002185 -0.001429 0.000000 -0.003246 0.000554 -0.007260 
+-0.004222 0.001484 -0.007422 -0.002216 0.002831 -0.001527 
+0.006279 -0.004124 0.010383 0.010592 -0.003203 0.013506 
+-0.000771 0.018874 0.000303 -0.008590 0.025344 -0.012365 
+-1.119816 2.474654 -1.322581 -0.010868 0.014788 -0.010989 
+0.001754 -0.001842 -0.001581 0.007454 -0.015120 0.012352 
+0.005957 -0.006664 0.004318 0.000242 0.000097 -0.000918 
+0.000144 0.000146 -0.004048 -0.001057 -0.000943 -0.003351 
+0.005142 0.002010 -0.008624 0.004440 0.003932 -0.007748 
+0.002402 0.001708 -0.000421 0.000352 0.002994 -0.002055 
+-0.002944 0.002406 0.001783 -0.002246 0.002204 0.000303 
+-0.000217 -0.000245 -0.000282 0.000445 -0.002791 -0.000214 
+-0.000311 -0.003953 -0.000998 -0.001678 -0.004259 -0.002010 
+0.000978 -0.001630 0.001700 0.001502 -0.001852 -0.000387 
+-0.001087 0.001081 0.001241 -0.001427 0.000576 0.001485 
+-0.001001 -0.000166 0.000597 -0.000357 -0.000749 0.000285 
+-0.000187 -0.000495 0.000624 0.000323 0.001333 -0.001530 
+0.003076 0.003056 -0.002506 0.004961 0.003404 -0.005106 
+0.005142 -0.000092 -0.000689 0.001581 -0.002454 0.000673 
+-0.001719 -0.001594 0.003187 0.000890 -0.003810 0.002313 
+-0.003864 -0.006041 0.005996 0.003066 -0.008864 0.003948 
+0.000456 0.002905 -0.003995 0.002261 0.017288 -0.007709 
+-0.002006 0.026218 -0.011580 -0.004075 0.030787 -0.016503 
+-0.008805 0.018975 -0.013772 -0.004923 -0.010291 0.002509 
+-0.002919 -0.010611 0.004056 -0.001477 -0.002600 0.001385 
+0.002258 0.003039 -0.000173 0.002053 0.000830 -0.000732 
+0.000569 0.000496 0.001449 -0.000879 -0.002112 0.000632 
+-0.000197 -0.003066 -0.001549 0.000136 -0.000778 -0.002504 
+0.001081 -0.000389 -0.000791 0.000444 0.000937 -0.004228 
+-0.003477 0.002330 -0.003473 0.002859 0.003866 -0.003298 
+-0.000908 0.002016 -0.001283 -0.002641 -0.000206 0.003009 
+-0.003640 -0.005337 0.006314 0.001705 -0.009515 0.004619 
+-0.002534 -0.006537 0.000661 -0.000937 0.000083 -0.002309 
+-0.002303 0.001505 -0.000390 0.002870 0.001651 -0.000199 
+0.001443 0.002052 -0.001518 0.004710 0.001060 0.001366 
+0.000198 0.001075 0.000903 -0.000375 0.000167 0.000227 
+-0.000528 -0.000082 -0.000492 -0.001819 -0.000190 0.001018 
+-0.001678 0.001025 0.001911 0.000655 0.002640 0.001146 
+-0.001042 0.000391 0.000164 -0.004142 0.004110 0.000772 
+-0.001270 0.004464 0.001464 0.002863 -0.005611 0.004900 
+0.004304 -0.016557 0.012629 0.007572 0.003619 0.009595 
+-0.000750 0.021322 0.000261 -0.006528 0.023501 -0.008714 
+-0.010029 0.016451 -0.009788 -0.004067 0.004643 -0.001856 
+0.002627 -0.017061 -0.004339 0.000987 -0.007631 0.009092 
+-0.001487 -0.000537 0.004297 0.000206 0.000641 0.003483 
+0.002452 -0.003678 0.001430 -0.001907 -0.006209 0.004278 
+-0.002131 -0.000027 0.001279 0.000294 0.004706 -0.000147 
+-0.000064 0.002325 -0.007707 0.002659 0.008051 -0.005362 
+0.003246 0.006231 -0.000299 0.004255 -0.000165 -0.003597 
+0.001974 -0.001498 0.000936 -0.000183 -0.000592 -0.000308 
+-0.001093 -0.002403 -0.000657 -0.003455 -0.005055 0.001793 
+-0.000997 -0.001587 0.002494 0.002344 0.001389 -0.002566 
+0.002121 0.004568 -0.003235 0.001190 0.001728 -0.001782 
+0.000235 -0.000837 -0.000369 0.000331 -0.000122 -0.000508 
+-0.001274 0.002779 -0.002221 -0.001890 -0.000064 -0.006788 
+0.004211 0.000752 -0.003459 0.006253 0.005847 -0.003747 
+0.006573 0.004458 -0.001410 0.000525 -0.000643 0.000306 
+0.000471 -0.002332 -0.001550 0.001415 0.002093 -0.003269 
+0.002616 0.002918 0.000916 0.004721 -0.006445 -0.001011 
+0.000023 0.005524 -0.005735 0.001949 0.021093 -0.013701 
+0.431694 3.382514 -1.699454 0.331288 4.288343 -1.957055 
+0.002378 0.035210 -0.024187 -0.012394 0.001343 -0.002264 
+-0.004394 -0.011747 0.007138 -0.001525 -0.003374 -0.000238 
+-0.003414 0.000949 -0.001167 -0.001353 -0.001805 -0.002782 
+0.000279 -0.003457 -0.001991 0.003537 -0.003051 -0.001162 
+0.001770 0.000175 0.001712 0.002038 -0.002407 -0.000022 
+0.000004 0.000525 0.001450 0.003302 -0.005753 0.004153 
+-0.005863 -0.000420 0.007110 0.001931 -0.000401 0.003140 
+-0.001282 -0.004786 0.003592 0.000231 0.000540 0.000965 
+0.002169 -0.003247 0.004002 0.002058 0.000363 0.003710 
+0.003525 -0.001958 -0.000948 0.002028 -0.001765 0.000068 
+0.006339 0.003917 -0.001220 -0.000355 0.004708 -0.005644 
+0.001680 0.006723 0.003221 0.000443 0.004576 0.000664 
+0.001468 -0.002021 0.000106 0.001374 -0.001149 -0.002346 
+0.005908 0.006845 -0.003748 0.001081 0.006237 -0.001829 
+0.002381 0.002052 -0.000394 0.004411 -0.000685 0.001589 
+0.000569 -0.001575 0.000854 -0.002836 0.000478 -0.002522 
+-0.000695 0.001013 -0.001031 0.002904 -0.011763 -0.000520 
+0.004203 -0.007462 0.015386 0.006362 -0.000247 0.004438 
+-0.001325 0.011394 -0.001318 -0.005580 0.013611 -0.005310 
+-0.005057 0.006455 -0.002521 0.003676 -0.004742 -0.001559 
+0.000806 -0.008486 0.001996 -0.000266 -0.001255 0.000813 
+-0.000736 0.000166 -0.000714 0.002700 -0.003430 0.000069 
+0.005163 -0.003285 0.001173 0.002926 -0.000843 -0.001735 
+-0.000063 0.001164 -0.000561 -0.000875 0.001322 -0.000892 
+-0.003392 0.002362 -0.001494 -0.004031 0.004495 -0.003112 
+-0.003268 0.006238 -0.003094 -0.001544 0.004015 -0.001544 
+-0.000364 -0.001511 -0.002969 -0.000626 -0.000790 -0.000187 
+-0.000744 -0.000621 -0.000865 -0.000925 -0.000848 0.002554 
+-0.000801 0.000644 0.003394 0.002001 -0.000237 -0.000492 
+0.001189 -0.001713 -0.004376 -0.000332 -0.000312 -0.002438 
+0.000018 0.000139 0.000284 -0.000139 0.000266 -0.001065 
+0.001245 -0.000506 -0.001182 -0.001519 -0.002769 -0.001170 
+-0.000965 -0.000587 -0.003187 0.004617 0.001521 -0.001551 
+0.004126 0.001478 0.000326 0.001473 0.003566 -0.002093 
+0.003271 0.001384 -0.004405 0.000135 0.001165 0.000376 
+-0.000768 0.002799 -0.003296 0.001579 0.000565 -0.003299 
+-0.002322 0.005175 -0.007626 -0.003764 0.023799 -0.010627 
+0.628713 4.074257 -1.717822 0.370192 5.019231 -2.125000 
+-0.005682 4.738636 -2.079545 -0.001719 0.015011 -0.013602 
+-0.005014 -0.008101 0.005472 -0.000351 -0.001637 -0.002893 
+0.003237 0.008847 -0.006153 0.006514 0.009950 -0.005942 
+0.001996 0.005583 -0.004792 0.003147 0.000140 0.002098 
+0.000662 -0.003063 -0.003517 -0.001270 -0.006960 0.001027 
+-0.006527 -0.008080 0.005221 0.000391 -0.003191 -0.001335 
+0.000060 -0.001438 -0.001430 0.000784 -0.002781 -0.001547 
+-0.000879 0.000393 -0.000185 -0.002283 0.000204 0.001226 
+-0.001792 0.000264 0.000260 -0.000828 -0.000901 0.000282 
+0.000242 -0.000383 0.000535 -0.001293 -0.002257 0.000993 
+-0.002209 -0.002629 0.004393 0.001273 -0.003246 -0.000192 
+-0.001955 -0.004603 -0.002062 0.001212 -0.004156 -0.002373 
+-0.001181 -0.001823 0.002055 -0.001380 0.000815 0.002233 
+-0.002669 0.003991 0.002535 -0.003388 0.004840 0.000645 
+-0.002249 -0.000289 0.000986 0.001956 -0.003552 0.000180 
+0.000592 -0.002699 -0.000691 0.001533 0.000950 -0.002629 
+0.001239 -0.001954 -0.001299 0.004499 -0.007482 -0.001326 
+0.001616 -0.008922 0.001604 -0.001532 -0.002169 -0.000571 
+-0.004131 0.003527 -0.001222 -0.001792 0.003409 -0.001404 
+0.003895 -0.003338 0.000416 0.000715 -0.011441 -0.000138 
+-0.003599 -0.005340 0.004754 -0.000947 -0.003367 0.006314 
+-0.003106 0.000423 0.005440 -0.004971 -0.006685 -0.001982 
+-0.005018 -0.006059 0.002010 -0.005584 -0.001647 0.001590 
+-0.003431 0.002740 0.001938 -0.001033 -0.000110 0.004569 
+0.000425 -0.001421 0.001118 0.005507 0.003210 -0.001885 
+0.004903 0.007302 -0.001714 -0.000463 0.003062 -0.001075 
+0.000766 -0.003596 -0.005050 -0.003212 -0.004728 -0.004330 
+-0.004256 -0.004679 -0.003194 -0.005612 -0.001738 -0.002672 
+-0.006615 0.001734 -0.002961 -0.006188 0.002901 -0.003439 
+-0.001924 0.002650 -0.003953 0.003815 0.000489 -0.006740 
+0.004736 -0.000284 -0.009464 0.004763 0.001003 -0.008218 
+0.002158 0.003800 -0.002721 -0.000791 0.002187 -0.002311 
+-0.002749 0.003268 -0.002922 -0.000343 0.005462 -0.001512 
+0.001770 0.002512 -0.006612 0.000814 -0.000381 -0.005476 
+-0.001710 -0.001954 -0.003223 -0.000077 0.003656 -0.002497 
+-0.002126 0.004121 -0.004290 -0.000471 0.003035 -0.003051 
+-0.000411 0.007880 -0.005968 0.003143 0.024035 -0.008976 
+0.717593 3.986111 -1.564815 0.564516 5.104839 -2.044355 
+0.387665 5.180617 -2.171806 0.003376 0.031472 -0.017380 
+-0.000211 0.001576 -0.001111 0.003311 -0.003659 0.001275 
+0.004015 0.001694 0.000385 0.003325 0.002048 -0.000933 
+0.000097 -0.001237 0.002051 -0.000662 -0.003456 -0.002794 
+-0.001396 -0.002343 -0.002102 -0.000171 -0.002245 0.000234 
+-0.000443 -0.004635 0.000573 -0.002264 -0.003284 -0.000615 
+-0.000310 -0.000891 -0.000891 -0.001497 -0.003211 0.001213 
+-0.001368 -0.002459 0.000996 0.002582 -0.000793 -0.001273 
+0.002594 -0.000082 0.001179 0.001349 -0.000398 0.000259 
+-0.003410 -0.003692 0.003481 -0.004884 -0.006799 0.003507 
+-0.001636 -0.004238 0.005543 0.000695 -0.003018 0.005188 
+0.001613 -0.002637 0.003108 -0.004787 -0.002848 0.001165 
+0.002770 0.001790 -0.000535 0.003526 0.002882 0.001005 
+0.000959 0.003811 0.000902 0.000540 0.000047 0.000038 
+0.002091 0.000772 0.000589 0.001633 0.002160 0.001449 
+0.005391 0.000947 -0.000864 0.000728 -0.003278 0.000000 
+0.004587 -0.007394 0.001151 0.003281 -0.005420 0.000068 
+0.001940 0.004922 0.002370 0.002946 0.011371 0.002233 
+0.003419 0.006694 0.000171 0.001572 -0.005836 0.000658 
+-0.000394 -0.013421 0.002290 -0.000004 -0.007420 0.002569 
+0.000643 0.000525 -0.001036 -0.000618 0.001004 -0.000386 
+-0.001500 -0.004922 0.000750 -0.003847 -0.009628 0.001284 
+-0.005353 -0.007953 0.000412 -0.005859 -0.000562 -0.001125 
+-0.003780 0.000276 0.002244 -0.001175 -0.001221 0.001590 
+0.001571 0.000137 -0.001298 0.006109 -0.001015 -0.002069 
+0.006737 -0.002200 -0.002751 0.004067 -0.003707 -0.001909 
+0.001528 -0.001229 0.001429 0.001491 -0.000848 -0.000033 
+0.000130 0.001304 0.000238 0.001846 0.002635 -0.000128 
+0.003083 0.003245 -0.001190 0.003684 0.003006 -0.002338 
+0.002959 0.001775 -0.003050 0.002079 0.000379 -0.002931 
+0.000993 -0.000036 -0.002480 -0.001369 0.000774 -0.001982 
+-0.001833 -0.000137 0.000936 0.001129 0.001385 -0.001595 
+0.002613 0.003700 -0.005013 0.004328 0.001250 -0.008656 
+0.000918 -0.005506 -0.005726 -0.002291 -0.011225 0.003379 
+-0.001535 -0.009875 0.006390 -0.000284 -0.001250 0.002129 
+-0.000685 0.004043 -0.000098 -0.002943 -0.000931 -0.001807 
+-0.002848 -0.002794 -0.002444 0.002703 0.014298 -0.004752 
+0.777228 4.034654 -1.183168 0.960630 5.476378 -1.897638 
+0.721569 5.490196 -1.980392 0.102564 3.887179 -1.292308 
+-0.001184 0.006999 -0.005041 -0.001790 -0.005009 -0.000724 
+0.001883 0.000567 0.000059 0.002341 0.003541 -0.002593 
+0.001545 0.003735 -0.002275 0.002053 0.002249 -0.000330 
+0.001584 0.000261 -0.000650 0.000923 -0.001218 -0.000711 
+-0.000687 -0.002460 -0.001219 0.002731 -0.000880 -0.000303 
+0.004340 -0.002405 -0.001760 0.004699 -0.001127 -0.002118 
+0.002745 -0.001784 -0.001823 0.000137 0.001489 -0.001216 
+-0.001094 0.000869 -0.001448 0.001942 0.000084 0.000506 
+-0.000913 -0.000086 0.000114 -0.005677 -0.001911 0.002831 
+-0.000583 -0.003496 0.005000 -0.001818 -0.002195 0.000244 
+0.002049 -0.000675 0.000482 0.003671 0.002067 0.000107 
+0.001120 -0.002640 0.001120 0.003677 0.000926 -0.000026 
+0.003281 0.002740 -0.001071 0.001963 -0.001047 -0.001991 
+0.001957 -0.004366 0.001290 -0.000158 -0.002290 0.001187 
+-0.001776 -0.000053 -0.000336 0.000315 -0.001096 -0.003189 
+0.001634 -0.004935 -0.002560 0.010012 0.000479 -0.006355 
+-0.000361 0.005237 0.000676 0.000443 0.005571 0.001044 
+0.001749 0.001351 0.000055 0.000312 -0.003533 -0.001217 
+-0.000497 -0.002832 0.004600 -0.000580 -0.001724 0.001687 
+-0.000246 0.000826 -0.001429 -0.000297 -0.001060 -0.000339 
+-0.000291 -0.000281 -0.000121 0.004494 -0.001368 0.000597 
+0.004485 -0.001654 -0.000124 0.002093 -0.001535 0.000307 
+-0.000377 -0.001388 0.001705 -0.001022 0.000402 0.000786 
+-0.001263 0.000366 -0.001661 -0.001820 0.001199 -0.003431 
+-0.002576 0.001771 -0.002668 -0.001564 0.000542 -0.002038 
+0.000167 0.001755 0.000126 -0.000211 0.003135 -0.000831 
+0.002642 0.004718 -0.002756 0.004115 0.002877 -0.002275 
+0.000421 0.000140 -0.002018 -0.001229 0.000579 -0.002501 
+0.002748 -0.000918 -0.002973 0.004228 -0.002842 -0.004754 
+0.001478 -0.002141 -0.004744 0.000622 0.001180 0.000911 
+0.001162 0.002052 -0.001641 -0.002295 -0.001135 -0.001851 
+-0.003488 -0.002529 -0.000567 -0.000956 -0.004003 -0.001329 
+-0.000203 -0.004100 -0.000622 -0.000621 -0.007419 -0.000746 
+-0.000365 -0.009180 -0.001797 0.001879 -0.002681 -0.003824 
+0.003359 0.006432 -0.001854 0.002360 0.005490 -0.001719 
+0.004335 -0.006465 -0.006540 -0.001587 -0.001502 -0.000963 
+0.003215 0.025058 -0.008299 0.500000 4.934426 -1.512295 
+0.724528 5.581132 -1.879245 0.651376 4.568807 -1.628440 
+0.000789 0.018178 -0.006661 -0.001161 -0.005316 -0.001883 
+0.004334 -0.004414 0.000718 0.004823 0.002370 0.000028 
+0.001936 0.002582 0.000303 -0.000548 -0.000769 0.001235 
+-0.001255 -0.000075 0.001182 -0.002046 0.001146 -0.000612 
+-0.001063 0.001971 0.001366 -0.000331 0.000607 0.002209 
+0.001861 -0.000273 0.000673 0.000884 -0.001111 -0.001995 
+0.000453 -0.001804 -0.002277 -0.000844 0.000563 -0.001301 
+-0.000005 0.000973 -0.000591 -0.000247 -0.001452 0.000408 
+-0.000035 -0.004642 0.002906 0.002306 -0.005966 0.001758 
+-0.000008 -0.001815 0.001785 0.000738 0.000656 0.001148 
+0.004636 -0.001545 -0.003140 0.002387 -0.001552 -0.003304 
+0.000275 -0.000813 -0.001993 0.005104 0.003157 -0.006648 
+0.000660 0.002638 -0.007803 -0.000537 -0.003122 -0.003342 
+-0.002747 -0.003790 -0.000351 -0.000270 0.000112 0.000084 
+0.003142 0.004518 -0.002542 -0.001652 0.001198 -0.005765 
+-0.001430 0.001507 -0.000218 0.002707 0.004029 0.002542 
+0.002939 0.007531 0.001391 0.003228 0.005023 0.000668 
+0.004056 -0.001484 0.000089 -0.000562 -0.005782 -0.002421 
+-0.000440 -0.003111 0.003280 0.000720 -0.001335 0.000582 
+0.001048 0.001165 -0.000204 -0.000316 0.001636 0.001071 
+-0.003459 0.002075 0.001038 -0.004302 0.000724 0.000274 
+-0.001791 -0.001771 -0.000556 0.001465 -0.002527 -0.000874 
+0.000154 -0.003769 0.003538 -0.000347 0.000297 0.003308 
+-0.002443 0.001629 0.000368 -0.001533 0.000555 -0.001109 
+0.000874 0.001932 0.001565 0.000536 0.001370 0.003636 
+-0.000766 -0.000699 0.002461 -0.001928 -0.000274 -0.000718 
+-0.000902 0.001404 -0.000815 0.001024 0.000770 -0.000220 
+0.001971 -0.002001 0.002013 0.003213 -0.002782 0.002748 
+0.003539 -0.002367 0.001407 0.001301 -0.001604 0.001806 
+-0.000330 0.000220 0.001714 -0.002457 -0.001813 -0.000535 
+0.000329 0.003796 -0.000578 0.002807 0.006973 -0.006883 
+0.000280 0.005536 -0.004053 0.000009 -0.000983 0.000404 
+0.000576 -0.007072 0.001760 -0.001902 -0.010243 0.003288 
+0.001069 -0.007645 0.003781 0.000709 -0.003369 -0.002180 
+0.001508 0.003600 -0.003098 0.002217 0.003754 -0.000116 
+0.001507 -0.007410 -0.000377 0.001080 -0.004284 0.003409 
+0.006315 0.019182 -0.001727 0.845133 4.207964 -0.800885 
+0.715953 4.891051 -0.937743 0.488789 4.201794 -0.730942 
+0.001987 0.020603 -0.004084 -0.001084 -0.002023 -0.001679 
+0.002372 -0.004940 0.001184 -0.001695 -0.002624 0.000156 
+-0.002184 -0.002433 0.000842 0.002266 -0.001979 -0.000832 
+0.002716 -0.001419 -0.003446 0.003012 0.003012 -0.003614 
+-0.000671 0.003085 -0.000605 -0.000426 0.000664 -0.001040 
+-0.001104 -0.000821 0.000458 0.001017 -0.003102 -0.002264 
+-0.001211 -0.005577 0.002298 -0.002947 0.003007 0.003037 
+0.001438 0.001789 0.002411 0.000258 0.001846 -0.000981 
+0.001846 0.001807 -0.005449 0.000504 0.001833 -0.004003 
+-0.001742 -0.000323 0.000871 -0.001349 0.000045 0.003644 
+-0.000170 -0.002040 0.005517 0.003554 -0.003086 0.004178 
+0.001849 0.000155 0.000044 -0.000094 0.003346 -0.001051 
+0.000875 -0.000066 -0.003284 -0.000523 -0.001446 -0.000657 
+0.000837 0.000161 -0.000245 0.001360 -0.000824 -0.002885 
+0.000698 -0.001970 -0.002916 0.000492 -0.000982 -0.004102 
+-0.001967 0.002910 -0.004938 0.002473 0.010200 0.000951 
+0.002854 0.011532 0.000720 0.002677 0.006944 -0.000162 
+0.002432 0.001024 -0.000055 0.000189 -0.004693 -0.004377 
+0.002838 -0.000863 0.000688 0.004960 -0.000181 0.000042 
+0.004503 -0.001680 -0.000606 0.001732 -0.001327 0.002212 
+-0.000705 -0.002802 0.000969 -0.000979 -0.000960 -0.000054 
+0.001502 -0.000525 -0.000213 0.003956 -0.000040 -0.003980 
+0.000678 0.001021 -0.004406 -0.000577 0.001129 -0.002295 
+-0.001294 0.000294 -0.000647 -0.001909 0.000227 -0.000773 
+-0.002248 0.000602 -0.001400 -0.001986 0.001048 -0.001677 
+0.000198 0.000334 -0.001723 -0.000419 -0.002129 -0.001386 
+-0.000382 -0.003547 0.000516 0.001679 -0.004790 0.000315 
+0.001578 -0.004786 -0.001585 0.000614 -0.004609 -0.000983 
+-0.000295 -0.004068 0.000849 -0.002133 -0.004196 0.002133 
+-0.002463 -0.001409 -0.001527 0.001170 0.002110 -0.002746 
+0.001930 0.006294 -0.002783 -0.000047 0.005431 -0.001352 
+-0.000051 -0.000410 -0.000051 -0.001312 -0.003328 -0.001829 
+-0.001338 -0.002066 -0.001023 0.001023 -0.001883 0.001710 
+-0.001144 -0.005252 0.003553 -0.001156 -0.004060 0.003355 
+0.001931 0.000690 -0.001020 -0.000007 0.000079 0.000001 
+-0.001762 -0.012123 -0.003665 -0.006113 -0.020696 0.003596 
+0.001475 -0.000839 0.001835 0.477612 3.203980 -0.318408 
+0.909836 4.442623 -0.987705 0.809524 3.978355 -0.956710 
+0.002008 0.018428 -0.005091 -0.001577 -0.008634 -0.000283 
+-0.002526 -0.012576 0.006934 -0.002166 -0.003628 0.003411 
+0.002827 0.000902 0.000240 0.005765 -0.006018 -0.000849 
+0.001693 -0.008415 0.001678 -0.000469 0.000669 0.000160 
+-0.002698 0.004483 0.004205 0.001264 0.002968 0.002670 
+0.003529 -0.000592 -0.000793 0.004154 -0.000769 0.000615 
+0.005711 0.004594 -0.003778 0.004531 0.002555 -0.003077 
+0.002076 -0.004475 -0.002723 0.003903 -0.002885 0.000113 
+0.001102 -0.003330 0.000419 -0.000755 -0.000210 -0.000470 
+-0.002715 0.000847 -0.001445 -0.001823 -0.002091 -0.001286 
+-0.001162 -0.002859 0.001673 -0.001102 -0.005707 0.005763 
+-0.011311 -0.000740 -0.000945 -0.007689 -0.002739 0.009742 
+0.004266 -0.000026 0.000385 0.006337 -0.001751 -0.003132 
+0.001546 -0.002961 0.002163 -0.002035 -0.000701 0.002403 
+-0.002551 0.001083 -0.001658 -0.001590 0.003602 -0.002461 
+-0.001158 0.000834 -0.000489 -0.001754 -0.003966 0.001350 
+-0.002904 -0.005348 0.001720 -0.004286 -0.005482 0.001211 
+-0.005979 -0.006705 0.000478 -0.009495 -0.006963 -0.001609 
+-0.013440 -0.001841 -0.002136 -0.008701 -0.002386 0.001686 
+-0.006383 -0.003753 0.002270 -0.005093 -0.017075 0.007325 
+-0.003818 -0.007398 0.004298 0.001856 0.005878 -0.002125 
+-0.000510 0.001862 0.000633 -0.000670 -0.000029 0.001039 
+0.001270 0.001843 -0.002786 -0.000630 0.003852 0.000486 
+-0.000851 0.001744 0.001222 -0.002160 0.000839 0.000479 
+-0.005840 -0.002644 0.000610 0.000302 -0.003543 -0.000866 
+-0.000491 -0.003574 -0.002204 0.003087 -0.002474 -0.003466 
+0.001040 0.001426 -0.002620 0.000852 -0.000170 0.001817 
+0.000263 0.000355 0.002094 -0.004132 -0.002656 0.000840 
+-0.005271 -0.000364 -0.002550 -0.004580 0.000000 -0.003359 
+-0.000357 0.001603 -0.002732 0.000813 -0.000955 0.000538 
+-0.000556 -0.010305 -0.002576 0.000656 -0.017640 -0.003260 
+-0.000485 -0.011675 -0.000109 0.000692 -0.000229 0.000002 
+0.003481 0.002957 -0.001099 0.001914 0.000544 -0.000354 
+-0.000499 -0.001083 -0.000024 -0.000855 -0.001410 -0.000346 
+-0.001353 -0.001207 -0.000413 -0.003015 -0.000661 -0.000926 
+-0.003818 -0.001672 -0.001640 -0.002461 -0.006205 -0.001866 
+-0.004809 -0.011412 -0.003401 -0.010342 -0.006000 -0.002248 
+-0.009305 0.016455 -0.005189 -0.009318 0.023996 -0.007294 
+-0.001034 0.004395 -0.000768 0.011760 0.004165 0.000174 
+0.019916 -0.010813 0.000477 0.023109 -0.002479 -0.001611 
+0.012989 0.017169 0.006958 0.004792 -0.007083 0.002292 
+-0.007505 -0.024782 0.021850 0.039527 0.000036 -0.009893 
+0.027310 0.019460 0.004301 0.010256 0.008564 0.006103 
+0.014178 0.007500 0.014769 0.003741 -0.000526 0.004725 
+-0.002349 -0.005613 -0.002889 -0.005002 -0.004981 -0.005274 
+-0.005546 -0.003160 -0.004092 -0.006880 -0.001815 -0.000731 
+-0.005932 -0.001848 -0.003267 -0.006289 -0.001092 -0.003383 
+-0.003009 -0.000992 -0.002052 0.000452 0.001948 0.001997 
+0.001451 0.002681 0.005789 -0.000514 -0.002000 0.008457 
+-0.015362 0.009275 0.016923 0.000280 -0.000108 0.000396 
+0.006185 0.007579 -0.006484 0.001145 0.001019 -0.003924 
+0.001574 0.000564 -0.002456 0.005222 -0.000296 -0.002207 
+0.004865 0.000121 -0.001721 0.001719 0.002108 -0.001051 
+0.000079 0.002905 -0.001112 0.000737 0.002525 -0.000382 
+0.003057 0.002414 0.000765 0.005286 0.004749 0.000826 
+0.004773 0.005340 0.000072 0.000198 0.002705 -0.001122 
+-0.002876 -0.001779 0.000442 0.001879 -0.005338 0.002605 
+-0.001850 -0.006111 0.003543 -0.005148 -0.008217 0.005816 
+0.001606 0.001827 -0.001456 0.002751 0.004925 -0.002427 
+-0.001202 0.000939 0.000421 0.000560 -0.000351 -0.001361 
+0.003163 0.005921 -0.005089 -0.001572 0.004370 -0.002764 
+-0.001716 0.001026 -0.000988 -0.000892 -0.000743 0.000090 
+-0.000324 -0.000169 -0.001090 -0.001612 -0.000594 -0.001439 
+-0.000991 -0.002835 -0.000083 0.001055 -0.004076 -0.000501 
+0.000171 -0.001610 -0.001820 -0.000682 0.002192 -0.001971 
+0.000401 0.004280 -0.001439 0.000693 0.001699 -0.000359 
+0.000573 -0.001009 0.000024 0.001128 0.000886 0.000025 
+0.001484 0.005175 0.000613 0.000879 0.005886 0.000479 
+-0.000868 -0.002002 -0.000345 -0.003128 -0.009177 -0.000380 
+-0.006108 -0.005464 0.001673 -0.005932 0.000424 0.000699 
+-0.002002 0.001847 -0.000038 -0.000501 0.001088 0.000275 
+-0.000456 -0.000117 -0.000145 0.001781 -0.001108 -0.000537 
+0.003282 -0.001804 -0.000626 0.000482 -0.001481 -0.000052 
+-0.002815 -0.000878 -0.001467 -0.002648 -0.000789 -0.001932 
+-0.001980 -0.004296 -0.000532 -0.000593 -0.004240 0.000399 
+-0.005162 0.017825 -0.002825 -0.014905 0.026144 -0.004370 
+-0.013768 0.004525 -0.001257 0.010815 0.003955 -0.000060 
+0.030790 0.024586 -0.001828 0.019012 0.013122 0.000906 
+-0.001193 0.002231 -0.001025 -0.005593 0.005036 -0.013608 
+-0.047024 0.001634 0.033634 -0.019262 0.002230 -0.012470 
+-0.003771 0.005029 -0.010714 -0.006444 -0.005111 -0.011556 
+0.001918 -0.004992 -0.000733 0.005399 0.000717 0.006235 
+0.001082 0.002336 0.002256 -0.000141 -0.002673 -0.000048 
+-0.000342 -0.005363 -0.002772 -0.006267 -0.000402 -0.000481 
+-0.007351 -0.003087 0.000072 -0.007422 0.000182 -0.000752 
+-0.003582 0.001719 -0.001491 -0.000866 0.000638 0.001084 
+0.001967 0.005851 -0.002939 0.010148 0.006183 0.002537 
+-0.000390 0.003558 -0.001492 -0.001358 -0.004330 -0.004801 
+0.000021 -0.002630 -0.002807 0.000177 0.002337 -0.000947 
+0.003676 0.004017 -0.002558 0.004052 0.004086 -0.004131 
+0.001654 0.003432 -0.004315 0.004568 0.000257 -0.004080 
+0.002809 0.001162 0.000399 0.001589 0.000937 0.000342 
+0.002051 0.000144 0.000487 0.002002 -0.000702 0.000437 
+-0.000020 -0.002685 0.000967 -0.001013 -0.006717 0.002821 
+-0.001216 -0.011098 0.005613 -0.001274 -0.009379 0.005911 
+0.001409 -0.002392 0.001247 0.005205 0.003247 -0.003468 
+0.006555 0.004491 -0.004431 0.001502 0.002800 -0.001412 
+-0.004753 0.001257 -0.002359 -0.004436 -0.001681 -0.000694 
+0.002364 0.001760 -0.003230 0.000389 0.003004 -0.003653 
+-0.001045 0.002818 -0.002681 0.000867 0.001358 -0.002538 
+0.000257 0.000111 0.001219 0.005016 -0.000434 0.003422 
+0.000983 -0.002795 0.003498 -0.003415 -0.001274 0.003504 
+-0.005360 -0.001015 0.002556 -0.005567 0.000747 0.001942 
+-0.004584 0.002024 0.001480 -0.003148 0.000633 -0.000343 
+-0.001134 -0.003059 -0.001045 0.000737 -0.004282 -0.001417 
+0.000725 -0.002661 -0.000498 -0.000234 -0.001545 -0.000244 
+-0.002210 -0.001400 -0.000580 0.001674 -0.002002 -0.000905 
+-0.000754 0.000161 0.000459 -0.000179 0.002731 0.001092 
+0.001602 0.004673 0.002204 0.000134 0.006817 0.002517 
+-0.002601 0.006405 0.001284 -0.005960 0.000129 -0.000149 
+-0.005749 -0.005080 -0.001629 -0.001776 -0.005845 -0.002302 
+-0.001609 -0.002196 -0.001002 -0.004913 -0.001370 -0.002525 
+-0.007555 -0.011476 0.001763 -0.002340 -0.016787 0.004751 
+-0.002955 -0.008955 0.002253 -0.013710 0.005200 -0.003471 
+-0.021396 0.001179 -0.002341 -0.003616 -0.002308 -0.000128 
+0.016945 0.003376 0.001527 0.018188 0.006892 0.001960 
+-0.004751 -0.002370 -0.002465 0.002658 0.006154 -0.031894 
+0.016624 0.029016 0.010835 -0.006970 -0.055758 -0.013939 
+0.026958 -0.003357 -0.029196 -0.009382 0.040791 -0.024476 
+-0.006923 0.011389 0.005971 -0.004211 0.004925 0.002204 
+-0.001786 0.004526 -0.008566 -0.000240 0.005342 -0.010229 
+0.000455 0.001082 -0.004104 -0.001580 0.000199 0.000491 
+-0.003954 -0.001247 -0.000875 0.000458 0.000503 -0.000851 
+0.002712 -0.000738 0.000913 0.001516 -0.001406 0.000954 
+0.001258 -0.000206 0.000439 0.002725 0.000124 0.001063 
+0.001412 -0.004146 -0.003604 -0.003922 -0.006961 -0.007749 
+-0.001507 -0.002885 -0.007603 0.000362 -0.000598 -0.002554 
+-0.000565 0.000473 0.000744 -0.001326 0.001427 0.000931 
+-0.001015 0.002119 -0.000252 -0.000896 -0.000037 -0.001795 
+0.003121 -0.002836 -0.001705 -0.003543 -0.004704 0.000902 
+-0.003802 -0.002988 -0.000741 -0.001151 0.001574 -0.000568 
+-0.000680 0.001234 -0.000309 -0.003524 -0.004544 0.000677 
+-0.005400 -0.008360 0.003129 -0.003307 -0.005029 0.002551 
+0.002171 0.000384 -0.000624 0.004885 0.001937 -0.001913 
+0.001690 0.000774 -0.000470 -0.002823 -0.000780 -0.000820 
+-0.000827 -0.002258 -0.000082 -0.000821 -0.001786 -0.000383 
+0.000584 0.001984 -0.001019 -0.001359 0.001907 -0.001622 
+-0.002624 -0.000391 -0.000371 -0.001087 -0.002957 0.000618 
+0.002426 -0.001714 0.000621 0.000613 0.000040 0.001859 
+-0.002830 -0.000335 0.000642 -0.000817 -0.001313 -0.000905 
+-0.001570 0.002227 -0.000666 -0.000133 -0.000102 -0.002798 
+0.003146 0.004336 -0.009022 0.002294 0.002693 -0.009477 
+0.000395 -0.002973 -0.000931 0.000379 -0.007026 -0.000700 
+0.001166 -0.005758 -0.000306 0.000382 -0.001069 0.000107 
+-0.001051 0.001466 -0.000323 -0.001715 0.000828 0.000203 
+-0.002262 -0.000379 0.000388 -0.001176 -0.000216 0.000055 
+0.001467 0.001736 0.000435 0.002308 0.005726 0.000427 
+0.000070 0.007658 -0.000939 -0.003037 0.002159 -0.001320 
+-0.006794 -0.006041 -0.002139 -0.004887 -0.002732 -0.001177 
+0.000305 0.003031 0.001709 0.002577 0.005058 0.000649 
+0.005221 -0.008154 0.002135 0.004807 -0.011972 0.003458 
+0.002888 -0.004705 0.001780 0.000656 0.009730 -0.003043 
+-0.001533 0.017421 -0.004715 -0.001889 0.008845 -0.001911 
+-0.005128 -0.002849 -0.001051 -0.013316 -0.003405 -0.001661 
+0.014846 0.064239 -0.007612 0.009837 0.048031 -0.035261 
+0.005553 0.005562 -0.006675 -0.011780 -0.062967 0.020593 
+0.011656 -0.026250 -0.003278 -0.007077 0.032781 -0.039562 
+-0.005307 0.004009 -0.010113 -0.001820 0.001268 -0.001084 
+-0.001151 0.000075 0.001288 -0.000009 0.001362 -0.002709 
+0.000905 0.002469 -0.004550 0.000526 0.003631 -0.001406 
+-0.000622 0.003660 -0.003400 0.002559 0.003158 -0.006257 
+0.003383 0.004514 -0.002778 -0.001332 -0.000312 -0.000639 
+-0.004738 -0.004490 -0.005661 -0.006292 -0.009118 -0.002919 
+0.004027 0.007182 0.000223 0.006160 0.011845 -0.001666 
+0.003287 0.011153 -0.007415 0.001285 0.004338 -0.004191 
+-0.000687 -0.001346 -0.001668 0.000813 -0.003251 -0.001298 
+-0.000781 -0.000826 -0.000216 -0.000157 -0.000112 -0.000139 
+0.000048 0.000025 -0.000903 0.000135 -0.003284 -0.002625 
+-0.002380 -0.002899 -0.001387 0.000458 0.001901 -0.000442 
+0.005232 0.004783 -0.001213 0.004767 0.003864 -0.001469 
+0.002963 0.003385 -0.001028 0.003019 0.002088 -0.000757 
+0.001794 -0.001326 0.000010 -0.001447 -0.003828 0.001352 
+-0.002066 -0.002816 0.000826 0.000646 0.000253 0.000428 
+0.001924 0.000114 0.002595 0.000074 -0.006321 0.001096 
+-0.000840 -0.005796 0.005260 -0.000552 -0.003865 -0.000608 
+-0.001504 -0.003772 -0.000706 -0.001213 -0.002707 -0.001312 
+-0.001654 -0.000009 -0.001150 -0.001765 0.002166 0.000444 
+0.001891 0.004298 -0.002429 -0.000296 0.001704 -0.003636 
+-0.000404 -0.000147 -0.002753 -0.002393 -0.000150 0.000511 
+-0.002501 0.003087 -0.000141 -0.001246 0.004126 -0.001827 
+0.000496 0.001753 -0.004665 -0.000367 -0.001023 -0.000992 
+-0.001127 0.002500 -0.000317 -0.000394 0.006159 -0.001568 
+0.001256 0.004878 -0.000972 0.003765 -0.000922 0.000472 
+0.004659 -0.002212 -0.000259 0.004781 0.001269 -0.001020 
+0.003396 0.001753 -0.000939 0.001245 -0.001190 0.000553 
+0.000454 -0.001013 0.001700 0.001754 0.001979 -0.002287 
+0.000630 0.002357 -0.007615 0.001505 -0.003950 -0.002001 
+0.006550 0.006588 0.005143 0.006058 0.008073 -0.000924 
+0.004213 -0.003952 -0.000131 0.002728 -0.006551 0.002138 
+0.003098 -0.000967 0.000648 0.003656 0.004369 -0.000331 
+0.003910 0.006217 -0.000434 0.005467 0.007257 -0.000741 
+0.005089 0.004995 -0.001499 -0.000182 -0.006242 0.005421 
+0.000829 -0.000245 0.000107 -0.006430 0.005580 -0.003435 
+-0.014883 -0.011296 0.004724 -0.006174 -0.032413 0.015791 
+-0.009523 0.008069 -0.004143 -0.008812 0.012804 -0.009681 
+-0.003966 0.005281 -0.002079 -0.000011 0.002093 -0.003457 
+0.004078 0.000531 -0.002658 0.002829 -0.000643 -0.001129 
+0.000880 -0.000049 -0.000676 -0.000201 -0.001606 0.001405 
+-0.001522 0.001238 0.001303 -0.001945 0.002033 0.003220 
+-0.000768 0.001665 0.002560 -0.001728 0.001592 -0.001556 
+-0.003607 -0.001671 -0.002114 0.000082 0.002510 -0.000727 
+-0.000577 0.001281 0.001158 0.005843 0.009508 -0.004992 
+0.014361 0.013397 -0.008569 0.009759 0.012079 -0.003128 
+0.005072 0.005561 0.001914 0.002860 -0.000884 0.004669 
+-0.001952 -0.001909 0.004411 -0.005627 -0.001892 0.001475 
+-0.004262 -0.000877 0.001162 -0.001542 -0.000771 -0.000257 
+0.000127 -0.003997 0.000312 -0.000285 -0.006329 0.003000 
+0.001037 -0.005689 0.003243 0.004158 -0.001495 0.002815 
+0.005647 0.000932 0.000448 0.004576 -0.000045 -0.001081 
+0.001142 -0.000937 -0.000333 -0.000415 0.001166 0.000005 
+0.001488 0.004273 -0.000158 0.000805 0.004419 0.000098 
+0.001458 -0.000935 0.002283 0.000606 -0.008918 -0.000161 
+-0.004786 -0.007884 0.002884 0.000328 -0.005093 0.002516 
+-0.000805 -0.002535 0.000020 -0.000307 0.001715 -0.000262 
+0.001785 0.004732 0.000287 0.002567 0.003469 -0.000899 
+-0.000579 -0.000451 0.000800 0.000285 -0.003537 0.000795 
+-0.002707 -0.002366 -0.001228 0.001895 0.000822 -0.003359 
+0.006052 0.001643 -0.004597 0.005794 -0.001457 -0.006272 
+0.006472 0.001167 -0.004951 0.003650 0.004945 -0.004879 
+0.003383 0.006847 -0.003511 0.000184 0.007840 -0.000552 
+0.000442 0.003541 -0.002043 0.000742 0.001055 -0.000400 
+0.003063 -0.000354 -0.001284 0.001770 0.001183 -0.004175 
+-0.000408 0.001790 -0.003391 -0.002076 -0.001942 0.002347 
+-0.005930 -0.004839 0.008384 -0.006750 -0.004689 0.004338 
+-0.000869 -0.003394 -0.002225 0.001375 0.008372 -0.010196 
+-0.019758 0.013883 0.002568 -0.001937 -0.011026 0.000410 
+0.002274 -0.009434 -0.000342 0.003261 -0.004180 0.000533 
+0.002909 0.001540 0.000122 0.000499 0.003234 -0.000715 
+-0.001950 0.000004 -0.000641 0.000175 -0.001963 0.001004 
+0.003571 -0.002196 0.001539 -0.000161 -0.004797 0.004038 
+-0.008051 -0.008269 0.006980 -0.009955 -0.007583 0.005479 
+-0.003247 -0.003941 0.002207 0.008056 0.003182 -0.002472 
+0.000021 0.002995 -0.008832 -0.005074 0.004290 -0.003417 
+-0.002484 0.002895 -0.001623 0.000650 0.004192 -0.004451 
+0.001012 0.007366 -0.001644 -0.002762 0.002510 -0.002012 
+-0.001743 -0.000134 -0.001085 -0.000105 0.000358 0.000015 
+0.000401 0.000910 0.002075 -0.005058 -0.004895 0.007305 
+-0.001321 -0.003200 0.007709 -0.000847 -0.003919 0.000943 
+-0.005978 -0.000213 0.000197 -0.000667 -0.001509 0.001318 
+0.003703 0.002270 -0.007368 0.006208 0.000656 -0.007880 
+0.005883 -0.000298 -0.001230 0.000778 0.001194 -0.001491 
+0.000728 0.001220 -0.000567 0.001165 0.001766 -0.001954 
+0.001502 0.001381 -0.000826 -0.002957 -0.001475 0.000532 
+-0.005215 -0.003773 0.001922 -0.002831 -0.003061 0.001275 
+0.002046 -0.002451 0.001146 0.003941 -0.003454 0.001958 
+0.003442 -0.001583 0.000949 0.002455 -0.007742 0.001435 
+-0.001573 -0.007048 0.005051 0.000641 -0.003590 0.000470 
+0.002392 0.000014 -0.001161 0.003257 0.003017 -0.001377 
+0.002860 0.003965 -0.001158 0.000080 0.001076 0.000092 
+0.000700 -0.000226 0.001932 0.002267 0.002259 0.001319 
+-0.000154 0.002779 -0.000309 0.001310 0.000580 0.002125 
+0.000184 0.001013 -0.000494 0.001526 0.005141 -0.002199 
+0.001804 0.005467 -0.001518 -0.000266 0.001073 -0.000820 
+-0.003060 0.000397 0.004275 -0.000993 -0.001842 0.004453 
+-0.002316 -0.002121 -0.001658 0.002715 -0.001969 -0.003667 
+0.003197 0.002256 -0.004978 0.001622 0.003971 -0.003328 
+0.004589 0.004973 -0.005635 0.005641 0.001065 -0.011028 
+0.001208 -0.001695 -0.006383 0.001750 0.001520 0.002027 
+-0.002230 0.003250 0.002211 -0.001799 0.001482 0.000613 
+-0.000991 0.003428 -0.000094 -0.001700 0.007425 -0.005593 
+0.001931 0.002294 -0.002091 -0.003953 -0.001884 -0.001235 
+-0.002700 -0.008754 0.005191 -0.004393 -0.007614 0.006752 
+-0.001105 -0.004902 0.003520 -0.001510 -0.000504 -0.004353 
+-0.036076 -0.005513 -0.008087 0.004212 -0.024351 0.002227 
+0.002022 -0.016509 -0.001666 0.000372 -0.006452 -0.000359 
+0.000411 0.001726 0.000069 0.000429 0.006560 -0.000637 
+0.001271 0.005154 -0.001268 0.000577 -0.001077 0.000419 
+-0.002707 -0.005533 0.002411 -0.007091 -0.007013 0.003181 
+-0.007865 -0.006526 0.003634 -0.002825 -0.004446 0.003493 
+0.003146 -0.002300 0.002433 0.001798 -0.000504 0.000071 
+-0.001983 0.001333 -0.003451 -0.001578 0.002145 -0.004923 
+0.002409 0.005005 -0.005245 -0.000131 0.005916 0.001630 
+-0.000851 0.003038 -0.002457 -0.004090 -0.003205 -0.001526 
+-0.004280 -0.000383 0.004790 -0.000610 0.002219 0.003189 
+-0.002108 0.000294 0.000053 -0.001127 -0.000513 0.003060 
+-0.000167 -0.003625 0.000819 -0.001614 -0.000836 -0.000149 
+-0.002202 -0.000061 -0.004073 -0.006583 0.002955 -0.002880 
+0.002523 0.004336 -0.001101 -0.000191 -0.000187 0.000196 
+-0.006077 -0.010184 -0.001405 -0.002297 -0.014063 -0.006891 
+0.000467 -0.006759 -0.003579 0.000504 0.000806 -0.000638 
+0.000912 0.003060 -0.001502 0.002059 0.004274 -0.001700 
+0.004398 0.003059 -0.001317 0.002903 0.003004 -0.002002 
+0.005216 0.003053 0.002673 0.002451 0.004205 0.000002 
+0.001238 -0.001508 -0.000054 -0.002568 -0.005822 0.002626 
+-0.004885 -0.004943 0.003454 -0.002828 -0.000087 0.000207 
+0.002090 0.004189 -0.003301 0.003028 0.003404 -0.003935 
+0.004213 0.000046 0.002130 0.001549 -0.005633 0.006857 
+0.001889 -0.005819 0.004916 0.000685 0.002779 -0.001340 
+0.003744 0.005123 -0.006586 0.001646 0.003987 -0.005405 
+0.002488 0.005049 -0.005378 -0.000709 0.004366 -0.006825 
+-0.000555 0.005503 -0.002405 -0.002298 0.002868 -0.003536 
+-0.005213 0.002176 -0.000316 -0.003116 -0.000893 0.000238 
+-0.001103 -0.004080 -0.000147 -0.002801 -0.004169 0.000177 
+-0.001211 -0.000867 -0.002102 -0.002181 -0.000652 -0.001068 
+0.001116 0.000497 -0.000794 0.003622 -0.000071 -0.002600 
+0.002998 0.000716 -0.002511 0.002869 0.001867 -0.000066 
+0.003441 0.000188 0.003253 0.002030 -0.002182 0.004867 
+0.000180 -0.000253 0.000617 0.002265 0.004061 -0.002639 
+0.000929 0.002018 0.001443 -0.003927 0.000785 0.001570 
+-0.001826 -0.003704 -0.001835 -0.001587 -0.004300 -0.000178 
+-0.001332 0.002055 -0.003067 -0.011365 -0.002069 -0.007441 
+-0.014681 -0.013150 0.007641 0.011239 -0.027408 0.003228 
+0.003500 -0.015155 -0.000952 -0.002852 -0.004802 0.000195 
+-0.002609 0.001189 -0.000022 0.001066 0.004915 0.000313 
+0.003663 0.004053 -0.000269 -0.000402 -0.001819 0.000258 
+-0.005652 -0.004969 0.000076 -0.004068 -0.002628 0.000038 
+0.002845 0.001528 -0.000529 0.005756 0.002797 -0.000378 
+0.003211 0.000537 0.000618 0.000771 -0.003409 -0.003131 
+-0.001177 -0.001484 -0.001158 0.002510 0.002306 -0.000288 
+0.006063 0.001011 0.000942 0.006539 0.001040 0.000496 
+0.002760 0.002608 -0.004678 -0.000169 0.000725 -0.002146 
+-0.003191 -0.000930 0.003721 -0.002385 -0.003139 0.006930 
+-0.001364 -0.001143 0.003015 0.000206 -0.001033 0.000266 
+-0.001588 -0.001177 0.001280 -0.002085 -0.000430 -0.000193 
+0.000568 0.001516 0.000466 -0.000133 0.001354 -0.002317 
+-0.002266 -0.000649 0.001808 -0.003799 -0.001624 0.003847 
+-0.004601 -0.003886 0.001042 -0.001355 0.000521 -0.000378 
+-0.000013 -0.007650 0.003351 -0.002897 -0.006167 0.004346 
+-0.000626 -0.002433 -0.000124 0.001232 0.002128 0.000965 
+0.004135 0.003512 -0.003099 -0.001727 0.001881 0.002203 
+-0.001033 0.000860 0.004382 -0.000727 -0.000133 0.001092 
+0.003014 0.001210 -0.002966 -0.000867 0.003410 0.000356 
+-0.002278 0.003391 -0.005023 -0.004337 0.004218 -0.000486 
+-0.000487 0.001838 -0.002931 0.006901 0.003803 0.000000 
+0.004299 -0.003943 -0.001050 0.004689 -0.006018 0.003370 
+-0.000790 -0.010490 0.002160 -0.001936 -0.005050 0.002132 
+-0.000579 -0.000151 0.000250 -0.000069 0.002428 0.001166 
+-0.001916 0.004388 0.000119 -0.001023 0.002606 -0.000872 
+-0.000768 0.001876 0.001450 -0.002996 0.001886 0.003109 
+-0.002886 0.000989 0.001166 -0.000334 -0.001860 0.001002 
+0.000033 -0.001628 0.002515 -0.001527 -0.000571 0.002727 
+-0.002804 -0.000878 0.002229 -0.001321 0.003451 -0.001749 
+-0.001343 -0.000300 -0.003801 0.001492 -0.001302 -0.002789 
+0.004822 -0.001747 0.000462 0.005652 -0.000054 0.002724 
+0.004058 0.001247 0.004663 0.000261 0.002551 0.003584 
+0.000986 0.002425 0.001412 -0.000854 0.001707 0.001423 
+0.000298 0.000413 0.002112 0.001052 0.002718 0.001481 
+-0.000031 0.002989 -0.000441 -0.002221 0.001029 -0.001083 
+-0.002759 -0.001766 0.000736 -0.002239 -0.006376 0.004876 
+0.007653 -0.017524 0.009499 0.013625 -0.023930 -0.003210 
+0.003252 -0.008429 -0.001996 -0.003284 0.000299 0.000541 
+-0.005449 0.002410 0.000424 -0.003305 0.001327 0.000177 
+-0.001447 -0.001047 0.000040 -0.002031 0.000198 -0.000448 
+-0.004567 0.001906 -0.001028 0.001472 -0.000289 -0.001889 
+0.002904 0.000348 -0.001962 0.000430 -0.002165 0.001281 
+-0.002984 -0.003836 0.000424 -0.003301 -0.002058 0.000244 
+0.000726 -0.000308 0.000523 0.001692 0.001856 0.002600 
+0.000560 0.002068 -0.000985 0.001071 0.000969 -0.002878 
+0.000517 0.002570 -0.004668 -0.001527 -0.000608 -0.006095 
+-0.000609 -0.000347 -0.004494 0.002035 -0.001802 -0.000427 
+-0.004104 -0.002326 0.002190 -0.002848 -0.003987 -0.002088 
+-0.003089 -0.000922 -0.003124 -0.004740 0.001916 -0.000228 
+-0.007143 0.003088 0.003322 -0.006944 0.000121 0.002979 
+-0.000655 -0.001240 0.000488 -0.001714 0.000195 0.001667 
+-0.003474 -0.001192 0.003856 -0.004138 0.001172 0.002345 
+-0.002986 -0.011165 0.007583 -0.005455 -0.010568 0.005187 
+-0.003229 -0.003246 0.001652 0.000843 0.003721 -0.001110 
+0.000799 0.007576 0.001197 -0.000193 0.003326 0.000930 
+-0.000768 -0.003703 0.003003 -0.003313 -0.009200 0.002268 
+-0.003060 -0.007647 0.003516 -0.004910 -0.001753 0.004032 
+-0.003820 0.005060 0.000582 -0.002186 0.002000 -0.001871 
+0.002489 -0.000274 -0.002580 0.002742 -0.002722 -0.002784 
+0.003064 -0.003675 -0.000412 0.002092 -0.003953 0.002439 
+-0.000305 -0.005344 0.000146 0.000440 -0.003861 -0.001564 
+-0.000243 0.000243 0.000485 -0.000893 0.001246 0.003107 
+-0.001472 0.000463 0.003178 -0.001429 0.000906 0.001878 
+-0.000881 0.001166 0.003598 -0.002263 0.001556 0.004167 
+-0.002504 -0.000918 0.001940 -0.001538 -0.004201 0.002183 
+-0.001546 -0.005397 0.003798 0.000394 -0.002598 0.000596 
+-0.001077 0.002283 0.001198 0.000375 0.002849 -0.002623 
+-0.003462 -0.003985 -0.000425 -0.002449 -0.001026 -0.006392 
+0.000344 -0.001440 -0.002115 0.004812 -0.000678 0.002240 
+0.010967 0.003420 0.000440 0.002988 0.007394 -0.001698 
+-0.001613 0.003118 0.000669 -0.006694 0.001932 0.005023 
+-0.006402 0.000001 0.004798 -0.003058 0.003534 -0.001776 
+0.000202 0.002165 -0.006990 0.004568 -0.000298 -0.005375 
+0.004900 -0.000554 0.002636 0.000145 -0.007560 0.007907 
+0.011110 -0.018727 0.013526 0.006338 -0.015074 -0.004708 
+-0.002080 -0.006968 -0.000784 -0.006402 -0.000685 0.000255 
+-0.005166 0.003428 0.001536 -0.003810 0.001557 0.001567 
+-0.004833 -0.001915 -0.000547 -0.000614 -0.000670 -0.001737 
+-0.004460 -0.001843 -0.002323 -0.002493 0.004152 -0.001474 
+-0.001014 0.001813 -0.000052 -0.002093 -0.000403 0.001209 
+-0.004681 -0.002421 0.003255 -0.005809 0.000760 0.006967 
+-0.003828 0.003478 0.007472 -0.001398 0.002950 0.002806 
+0.001010 -0.000632 -0.001573 0.000829 -0.003349 -0.002907 
+-0.000665 -0.001287 -0.001792 -0.002163 0.000431 -0.000399 
+-0.001452 -0.000077 -0.002232 0.002226 -0.002359 -0.002159 
+0.002558 -0.004775 0.003581 0.004258 -0.002694 0.001598 
+0.001282 -0.001074 0.000278 -0.001338 0.000990 0.000048 
+-0.005422 0.001709 0.002572 -0.009439 -0.004072 0.005575 
+0.002302 0.000262 -0.001566 0.001706 0.000485 -0.001245 
+-0.002674 -0.001020 0.001402 -0.006889 -0.003160 0.000474 
+-0.001952 -0.010119 0.001130 -0.003791 -0.007040 -0.000789 
+-0.002468 0.000091 -0.002082 -0.000342 0.003469 -0.000172 
+-0.000522 0.000937 -0.000160 -0.002303 -0.003492 -0.000603 
+-0.004817 -0.003218 -0.002441 -0.003459 -0.001319 -0.004004 
+-0.001373 -0.003501 -0.000918 -0.001387 -0.000307 0.002599 
+0.001263 -0.000829 0.000976 0.002389 0.002225 -0.001508 
+0.001878 0.000154 -0.004169 0.000787 -0.001651 -0.001531 
+0.000460 -0.003344 0.000638 0.001441 -0.003115 0.000800 
+0.002260 -0.002869 0.001976 0.002600 0.000100 0.002500 
+-0.000721 0.000307 0.000804 -0.001832 0.001528 0.000256 
+-0.000840 0.001470 0.002152 -0.000734 0.000268 0.003590 
+-0.000187 -0.000290 0.001479 0.003340 0.004126 -0.001867 
+0.001941 0.002966 -0.003680 0.000000 0.000743 -0.000318 
+-0.003519 -0.000457 0.003800 -0.001786 0.001625 0.003436 
+-0.000887 0.000847 0.000797 0.002510 0.003044 0.001197 
+-0.001709 0.000481 -0.000781 -0.003298 -0.000902 -0.003570 
+-0.002409 -0.002720 -0.002396 0.000546 -0.000084 0.000213 
+-0.001098 0.001398 0.001929 -0.002630 0.002798 0.001460 
+-0.005235 0.003133 0.001255 -0.007406 0.000942 0.002002 
+-0.003253 0.000750 -0.000043 0.000929 -0.001899 -0.004313 
+0.006551 -0.005383 -0.006801 0.012713 -0.003975 -0.002578 
+0.006097 -0.013924 0.001175 0.006113 -0.015487 0.002725 
+0.010661 -0.015295 0.009549 0.007205 -0.006905 -0.003619 
+0.002007 -0.003364 -0.001768 -0.001358 0.002137 0.000548 
+-0.003240 0.003394 0.000452 -0.001948 0.000214 0.000257 
+-0.000427 0.000227 0.000333 0.001901 -0.001644 0.000193 
+-0.000109 -0.001651 0.003643 0.000370 0.000558 -0.000622 
+0.003838 0.002828 -0.002209 -0.001569 0.001385 -0.003138 
+-0.000167 -0.000972 -0.001802 -0.002753 0.000046 0.001277 
+-0.002805 -0.001841 0.002399 0.000956 0.000922 0.001685 
+-0.001987 0.001686 0.004429 -0.004055 0.001572 0.002396 
+-0.005055 -0.000414 0.000803 -0.004188 -0.000820 0.001225 
+-0.002013 0.000064 0.001971 -0.002462 -0.002008 -0.001721 
+0.002108 -0.004617 -0.000050 0.004604 -0.004303 0.000647 
+0.003011 -0.002496 0.002310 -0.000720 0.006047 0.003313 
+0.004453 0.004814 0.010701 0.004864 0.002903 0.012992 
+-0.000219 -0.002445 -0.002591 0.001051 -0.000706 -0.001070 
+-0.002050 0.000403 0.002543 -0.004392 -0.000430 0.006601 
+-0.004843 -0.001639 0.002409 -0.002112 -0.001860 -0.000026 
+-0.001147 0.000335 -0.001987 -0.001390 -0.000702 -0.000024 
+-0.003508 -0.003656 0.003116 -0.005970 -0.001060 0.001671 
+-0.004896 -0.001226 -0.001281 -0.001343 -0.000667 -0.002639 
+0.000227 0.000558 -0.002998 -0.000257 -0.001164 -0.000518 
+0.000574 -0.001090 0.000042 0.000550 -0.000568 0.000467 
+0.000388 -0.000020 -0.000084 -0.000049 -0.000607 -0.001425 
+-0.000254 -0.001060 -0.001223 0.001129 -0.000778 0.000270 
+0.002835 0.000991 -0.000258 -0.000740 -0.000601 0.002695 
+-0.000820 0.001142 -0.000685 0.000191 0.001970 0.001779 
+0.001402 0.000060 0.003364 -0.000918 0.000240 0.007805 
+0.001336 -0.000441 0.002522 0.000611 0.004779 -0.000680 
+-0.000298 0.000181 -0.002179 -0.002903 -0.001377 0.001239 
+-0.006801 -0.002485 0.004110 -0.000692 0.002000 0.004923 
+0.002239 0.000840 -0.001232 0.001605 0.000144 -0.002340 
+-0.000184 0.000131 0.000015 0.004383 0.003428 -0.003300 
+0.004304 -0.000645 -0.003563 0.001530 -0.000528 -0.000364 
+-0.001844 0.001937 0.002307 -0.002974 0.002356 0.004323 
+-0.002555 -0.001218 0.003847 0.002811 0.000253 -0.001845 
+0.007822 -0.000682 -0.010777 0.013578 -0.000177 -0.015855 
+0.019191 -0.009288 -0.009726 0.016432 -0.013789 -0.007370 
+0.012811 -0.016445 -0.003500 0.005694 -0.015767 0.000780 
+0.002274 -0.001600 0.004279 0.008453 0.006651 -0.006246 
+0.006825 0.001658 -0.009070 0.002682 -0.002018 -0.001861 
+-0.002008 -0.003271 -0.001872 -0.000680 -0.000424 -0.000540 
+-0.000176 -0.002287 0.003962 0.001239 -0.003973 0.002537 
+0.002778 -0.000872 -0.000841 0.002110 0.001591 -0.000036 
+0.002050 0.000153 -0.000222 -0.000349 0.000560 -0.003420 
+0.000381 0.000068 0.001075 0.003346 -0.000609 0.000006 
+0.001081 0.006257 0.000968 -0.000714 0.003606 0.000494 
+-0.001778 0.002388 0.000666 -0.001767 0.003583 0.003907 
+-0.003871 0.006960 0.001708 -0.004122 0.005420 -0.001298 
+-0.003252 0.001232 -0.000752 -0.001413 -0.002120 0.000222 
+-0.000723 -0.003552 -0.003090 -0.001701 -0.003997 -0.006264 
+0.004061 -0.003108 -0.005344 0.015587 0.008674 0.014001 
+0.023982 0.009794 0.023762 0.024165 0.009248 0.022299 
+-0.000456 0.001175 0.000552 -0.000827 0.004043 0.002067 
+0.001070 0.003091 0.003657 0.000117 -0.000309 0.002667 
+-0.000582 -0.002256 0.000276 -0.002062 0.000632 -0.001885 
+-0.002419 -0.000794 -0.001496 -0.002910 -0.002768 0.000060 
+-0.003639 -0.003233 -0.000634 -0.003773 -0.001729 -0.000661 
+-0.002966 -0.000271 0.003322 -0.002447 -0.000049 0.005244 
+-0.001775 -0.003133 0.001929 -0.004981 -0.002734 0.000185 
+-0.000903 -0.007221 -0.002191 -0.005243 -0.007475 -0.002203 
+-0.000611 -0.009608 -0.004693 0.000742 -0.002992 -0.004799 
+0.000079 -0.000010 0.000068 -0.000863 0.001347 0.003807 
+-0.000461 0.004617 0.004884 0.001274 0.003429 0.002366 
+0.002696 0.000123 0.001694 0.004051 -0.002115 0.002589 
+0.006283 -0.007474 0.003266 -0.000596 -0.019608 0.010849 
+0.006639 -0.012172 0.010896 0.005822 -0.006844 0.008176 
+0.003653 0.000005 0.006500 -0.008506 0.002683 0.009231 
+-0.005517 -0.003751 0.004520 -0.000665 -0.000024 0.002342 
+-0.000501 -0.000345 0.000470 0.000426 -0.000333 0.000132 
+0.000964 0.002449 0.000702 -0.000442 0.000203 -0.001106 
+0.003729 -0.002470 -0.002862 0.004791 0.000242 -0.000215 
+0.001626 0.002906 0.003675 -0.003572 0.001987 0.000843 
+-0.001592 -0.002065 0.000343 0.003981 -0.006014 0.000339 
+0.010518 -0.009649 -0.000729 0.016109 -0.012659 -0.008537 
+0.018356 -0.008916 -0.011094 0.013791 -0.005725 -0.006815 
+0.007295 -0.008321 -0.003913 -0.000269 -0.010673 -0.000355 
+-0.002769 -0.004163 0.001631 -0.006898 0.002515 -0.000587 
+-0.002533 0.005487 -0.000571 -0.002181 0.000051 0.000898 
+-0.000135 0.000444 0.000390 0.000154 -0.000330 0.003980 
+-0.000941 -0.000239 0.005236 -0.000886 -0.002070 0.001587 
+0.002979 0.000161 0.000119 0.000319 0.001451 0.000334 
+-0.000921 0.002942 -0.001306 -0.000580 0.002282 0.000825 
+0.000190 0.002466 0.002887 0.005719 -0.000928 0.004044 
+0.000866 -0.000658 0.000868 -0.002037 0.001282 -0.004634 
+-0.004051 0.002145 -0.001954 -0.002413 0.008082 -0.005441 
+-0.002414 0.007372 0.000520 -0.002747 0.003170 0.004506 
+-0.002624 0.000567 0.000262 0.001683 -0.000656 0.000874 
+-0.001469 -0.001093 -0.003810 -0.004418 0.000621 -0.015687 
+-0.002790 -0.005111 -0.005112 0.010188 0.003088 0.017066 
+0.015586 0.006790 0.027730 2.585000 0.985000 2.025000 
+-0.002609 0.000282 0.000081 -0.000754 0.003596 0.002425 
+0.001146 0.002790 0.001511 -0.000952 -0.001890 0.000655 
+-0.003023 -0.005044 -0.004937 -0.000476 -0.006317 -0.010894 
+-0.004134 -0.000700 -0.002816 -0.002219 0.001406 -0.002874 
+-0.002973 0.000181 -0.001592 -0.003484 0.000968 -0.000194 
+-0.000411 0.000647 0.001833 0.003199 0.000016 0.001160 
+0.000106 0.002203 0.000512 -0.002248 -0.002337 -0.002234 
+-0.004932 -0.003886 -0.007946 -0.009837 -0.012414 -0.001590 
+-0.003100 -0.016103 -0.003039 0.001432 -0.009987 -0.003811 
+-0.001416 -0.000453 -0.000779 -0.006455 0.005515 0.003757 
+-0.007037 0.003196 0.003521 -0.000389 0.000783 0.001147 
+0.003659 0.000533 0.000932 -0.006791 -0.001366 0.000756 
+-0.016534 0.005927 -0.003413 -0.018308 0.005812 -0.008237 
+-0.012803 0.005778 -0.002730 -0.009394 0.002646 0.006887 
+-0.009445 -0.002057 0.003034 -0.005302 0.002297 -0.000820 
+-0.002034 0.002579 -0.001229 -0.001212 -0.000957 0.001348 
+-0.002706 -0.001397 0.000929 0.000366 0.001062 0.000727 
+0.001975 0.001956 0.002135 0.000165 -0.000704 0.000739 
+-0.002893 -0.002468 0.000502 0.002292 0.000011 0.000158 
+0.005845 -0.000046 0.000230 0.001491 0.002083 -0.001044 
+-0.002148 -0.004714 -0.000222 -0.003309 -0.010080 -0.003342 
+-0.001549 -0.007717 -0.006030 0.003665 0.000717 -0.010503 
+-0.002639 0.004395 -0.004926 0.002820 0.000956 0.000853 
+0.001278 -0.001788 -0.000197 -0.000794 0.000315 -0.000339 
+-0.001151 0.000148 -0.000614 -0.004815 -0.002303 0.004097 
+-0.006547 -0.000489 0.001987 -0.001320 0.003961 0.001777 
+-0.001366 0.000710 0.000466 -0.003608 -0.002501 0.005483 
+-0.002965 -0.000753 0.008396 -0.001559 0.000712 0.004573 
+0.000417 -0.001062 -0.001962 -0.001980 -0.002482 -0.006819 
+-0.003774 0.000230 -0.006306 -0.001135 0.003933 -0.001769 
+0.001967 -0.000994 0.000041 0.003674 -0.002711 0.004619 
+0.004710 -0.003549 0.002459 -0.001705 -0.000251 -0.004705 
+-0.008349 0.003312 -0.009316 -0.008549 0.004668 -0.004218 
+-0.002590 0.003026 0.000820 0.000435 0.001578 -0.000158 
+-0.001764 0.001062 0.000583 -0.004161 0.002041 0.002487 
+-0.000700 -0.000261 0.004667 0.004758 -0.008126 0.000068 
+0.004429 -0.003277 -0.001961 0.002937 0.002962 0.003980 
+0.009786 0.005590 0.009669 0.013930 0.006029 0.012053 
+-0.002714 -0.001814 -0.002385 -0.001404 0.000048 0.000294 
+-0.000189 0.000728 0.000648 -0.001003 0.000677 -0.000549 
+-0.001364 -0.001601 -0.003660 -0.001116 -0.003958 -0.006448 
+0.000332 -0.005150 -0.006991 -0.003828 -0.000332 -0.003078 
+-0.000751 -0.000274 -0.004389 -0.001674 -0.002827 -0.006712 
+-0.002016 -0.004506 -0.003099 0.001622 -0.002018 -0.003058 
+0.000837 0.000504 -0.000177 -0.000133 -0.000272 0.000099 
+-0.000837 -0.004162 -0.000414 -0.000490 -0.007672 -0.002599 
+-0.000065 -0.007509 -0.000492 0.001453 -0.001394 0.001263 
+-0.001350 0.006040 -0.000551 -0.006994 0.005543 -0.002098 
+-0.004080 0.000579 -0.000932 -0.006326 -0.001023 0.001308 
+-0.009610 -0.008403 0.002069 -0.007876 -0.009620 -0.007216 
+-0.010451 -0.007501 -0.016729 -0.007184 -0.002465 -0.016900 
+-0.001805 0.003925 0.003236 -0.013738 0.002633 0.001257 
+-0.007030 0.003962 -0.000744 -0.002848 0.003754 0.000007 
+-0.001092 0.000081 -0.000087 0.000035 -0.000654 -0.000920 
+-0.002693 -0.008152 0.001878 -0.002529 -0.001757 0.000403 
+-0.002773 -0.000968 0.001488 -0.005498 -0.000167 0.000738 
+-0.003822 -0.001190 0.001225 -0.000253 -0.001240 0.001644 
+0.001373 -0.004392 0.003412 -0.000847 -0.006913 0.005501 
+-0.001957 -0.002602 0.006899 -0.002228 -0.002602 0.002658 
+0.000539 0.001387 -0.000304 0.001174 0.004010 -0.006235 
+-0.004442 0.002590 -0.002750 -0.003035 0.002485 -0.000859 
+0.000035 0.002613 0.001062 0.003960 0.005000 0.000360 
+0.001921 0.001150 -0.000313 0.005062 0.002575 0.001492 
+0.007945 0.001243 0.002914 0.008612 -0.001417 -0.000084 
+0.001816 -0.002332 -0.001211 -0.004223 -0.003891 0.006692 
+-0.001498 -0.001158 0.008004 -0.003919 -0.000039 -0.001503 
+0.000431 -0.000517 -0.009731 -0.000269 0.004448 -0.009300 
+0.000579 0.002748 -0.003689 -0.000898 0.000473 -0.000538 
+-0.003902 0.000880 0.002227 0.000000 -0.004344 0.000410 
+-0.005241 -0.007279 -0.004321 -0.000652 -0.003426 -0.013623 
+-0.003267 -0.005936 -0.013392 0.000441 -0.005665 -0.007552 
+0.007045 -0.002082 -0.003515 0.002197 -0.003560 0.004842 
+0.002624 0.002534 0.004078 -0.012862 0.002857 -0.003964 
+-0.017139 -0.020720 0.000119 -0.002345 -0.018917 -0.000338 
+0.002325 -0.006798 0.000547 0.004619 0.000034 -0.000556 
+0.005505 -0.000107 -0.003882 0.001369 0.000038 -0.011666 
+0.001295 0.002620 0.001819 0.000521 0.002270 0.001343 
+0.001619 0.002880 0.001027 0.002253 0.002725 -0.001926 
+-0.000287 -0.001947 -0.002477 0.000690 -0.004207 -0.006097 
+0.003722 -0.003500 -0.012785 0.011897 -0.000847 -0.020146 
+0.014895 0.000324 -0.019327 0.001996 -0.002183 -0.016031 
+-0.005676 -0.005362 -0.013639 -0.009607 -0.002841 -0.007403 
+-0.010426 0.001348 -0.001625 -0.005112 -0.001634 -0.002550 
+-0.000521 -0.002167 -0.002090 -0.001546 -0.000915 -0.001241 
+-0.005053 0.002572 -0.000926 -0.005256 -0.001543 -0.002983 
+-0.003431 -0.009913 -0.001861 -0.000750 -0.011149 -0.000236 
+0.001183 0.001694 0.000647 -0.005375 0.014866 0.000895 
+-0.013087 0.002397 0.008470 -0.004208 -0.004781 -0.001117 
+-0.003446 -0.007571 -0.005561 -0.003669 -0.005230 -0.001574 
+-0.004319 -0.002061 0.001815 -0.002164 -0.000093 0.000823 
+0.000125 0.001353 0.001134 -0.000342 0.002501 0.002147 
+-0.000299 0.000880 0.001001 0.001224 -0.000490 0.000382 
+0.000696 -0.005835 -0.002222 -0.006903 0.000863 0.002105 
+-0.007662 -0.005803 0.001156 -0.001615 -0.002474 -0.000755 
+0.000484 -0.000937 0.000969 0.001425 -0.002078 0.002657 
+-0.001808 -0.004145 0.003522 -0.007909 -0.000401 0.007143 
+-0.006756 -0.002241 0.005240 0.000403 -0.000847 -0.000422 
+0.004462 0.000084 -0.002702 0.000114 -0.000261 -0.001372 
+-0.003237 0.000556 -0.002667 -0.004568 -0.000492 -0.001044 
+0.002343 0.001626 0.000143 0.003790 0.005839 -0.000057 
+0.001786 0.003054 0.001226 0.003567 0.002531 0.002564 
+0.006192 0.003391 0.002443 0.006535 0.001047 -0.001550 
+0.002274 -0.001634 -0.002156 -0.000268 -0.003445 -0.000851 
+-0.001410 -0.003870 -0.001932 0.001777 -0.001697 -0.004741 
+0.003650 -0.002190 -0.006277 0.001233 0.001121 -0.004820 
+-0.003285 0.000325 0.000553 0.002124 0.000969 0.007529 
+-0.015513 0.001542 0.008300 -0.012103 -0.000317 -0.001047 
+0.009254 -0.000386 -0.013447 0.025125 -0.009909 -0.020952 
+2.977778 -1.044444 -1.927778 0.026976 -0.000309 -0.011278 
+0.010630 -0.003067 0.011723 0.018202 -0.012187 0.011588 
+0.023772 -0.009883 0.008422 0.024017 -0.004011 0.003035 
+0.002112 0.001759 -0.001563 -0.006140 0.006542 0.001747 
+-0.005902 -0.009336 -0.005822 0.000643 -0.004915 0.000245 
+0.005451 -0.002267 -0.006471 0.004546 0.005989 -0.009789 
+-0.001659 0.000400 0.002903 0.000513 0.001322 0.000320 
+0.000084 0.000835 -0.000329 -0.000875 0.000261 0.000748 
+0.000020 0.000000 -0.000192 -0.000542 -0.001303 -0.008871 
+0.003593 -0.006013 -0.018943 0.007488 0.009880 -0.021287 
+-0.004633 -0.000304 -0.019561 -0.001919 -0.009351 -0.006246 
+0.005094 -0.009229 -0.008719 -0.002303 -0.005258 -0.006388 
+-0.006436 -0.004148 -0.005800 -0.008431 0.001978 -0.006729 
+-0.007874 0.002960 -0.002788 -0.010505 0.009096 0.007536 
+-0.009057 0.009413 0.005724 -0.000388 0.003559 0.003498 
+0.004857 -0.005046 -0.002338 0.001314 -0.006206 -0.003528 
+0.000698 0.006741 0.000214 0.005211 0.006407 -0.001559 
+0.005379 0.006925 -0.004070 0.004108 0.012176 -0.003573 
+0.004466 0.012028 -0.002590 0.003088 0.005328 -0.003200 
+0.002108 -0.001879 -0.003688 0.001349 -0.002994 -0.003036 
+0.003202 -0.000400 -0.001315 0.004371 0.001013 -0.000896 
+0.003853 -0.001234 -0.001808 0.003240 -0.001957 -0.001222 
+-0.000108 -0.000183 -0.001973 -0.002428 -0.000831 0.000895 
+-0.001522 -0.001160 0.001032 -0.002842 -0.002931 -0.003464 
+0.000115 -0.000692 0.000423 -0.000839 -0.000105 -0.001515 
+-0.004005 0.000152 0.002026 -0.006758 0.001338 0.005397 
+-0.004453 0.000223 0.004175 0.001156 -0.002810 0.000486 
+0.000787 0.000095 0.000822 -0.001116 -0.002407 0.000398 
+-0.002194 -0.003388 -0.000851 -0.005590 0.000612 -0.001926 
+0.001618 0.004116 0.001185 0.006701 0.005423 0.002935 
+0.000887 0.006883 0.004030 0.001476 0.000472 0.001139 
+-0.001902 -0.007072 -0.001601 -0.000450 -0.004380 -0.002008 
+0.009288 -0.000100 -0.006779 0.012989 -0.002093 -0.009943 
+0.008764 -0.005602 -0.011173 0.002478 -0.003892 -0.010587 
+-0.000669 -0.001281 -0.006732 0.000719 0.000175 0.000360 
+-0.001350 0.013717 0.001000 -0.007432 0.007335 0.001128 
+-0.006645 0.003826 0.000805 0.007156 -0.000013 -0.005222 
+2.941799 -1.206349 -1.449735 4.560166 -1.879668 -1.568465 
+4.953901 -2.297872 -1.443262 4.936803 -2.338290 -1.141264 
+4.786408 -2.189320 -0.519417 4.531915 -1.929078 0.567376 
+0.039185 -0.014996 0.006951 0.025474 -0.011048 0.002152 
+0.014753 0.001954 0.005297 0.007966 0.001101 -0.004292 
+-0.001941 -0.001000 -0.004136 -0.002440 0.003657 -0.007344 
+-0.001377 0.004665 -0.007724 0.000502 0.002077 -0.006376 
+-0.000019 0.000499 -0.000597 -0.001297 0.000302 0.000586 
+-0.000817 0.001002 0.001215 0.000899 0.001689 0.000539 
+0.001102 0.001044 -0.000489 0.000231 0.000120 -0.000496 
+0.001585 -0.000339 -0.004618 0.003757 -0.002269 -0.009052 
+0.003053 -0.006373 -0.009358 0.001132 0.002378 0.000614 
+0.004512 -0.000755 0.003052 -0.000087 -0.000317 0.000521 
+-0.004752 -0.006000 -0.002126 -0.003285 -0.009242 -0.008430 
+-0.002032 0.005936 0.004310 -0.009757 -0.004335 0.010326 
+0.012876 0.003108 0.011937 0.019334 0.015052 -0.019652 
+0.031124 0.007329 -0.048018 0.006827 -0.014995 -0.023700 
+0.001712 -0.003448 -0.001749 0.001333 -0.000762 -0.002133 
+0.005001 0.001485 -0.010238 -0.002739 0.005155 -0.010470 
+-0.000639 0.004554 -0.002012 0.000268 -0.002710 0.000929 
+0.001186 -0.003660 0.000240 0.000748 -0.002645 0.001248 
+-0.000803 -0.003834 0.001855 0.001026 -0.005239 0.000277 
+0.004230 -0.004745 -0.001448 0.006490 -0.002435 -0.002041 
+0.005687 -0.000846 -0.001083 0.002457 -0.000265 0.000014 
+-0.001135 0.001576 0.000024 -0.003350 0.000543 -0.001497 
+-0.004015 0.000515 -0.001175 -0.000724 0.000018 -0.000082 
+0.004076 0.000793 -0.002859 0.003479 -0.001863 -0.003367 
+0.004680 -0.000634 -0.002387 0.004406 0.000598 -0.001104 
+0.002235 -0.000382 0.000057 -0.000401 -0.001970 -0.000121 
+-0.001222 -0.003537 0.000077 -0.001321 0.000573 -0.000915 
+-0.000374 0.009007 -0.000024 0.003490 0.010446 0.005312 
+0.005813 0.008404 0.007273 0.010717 0.001040 0.006903 
+0.002447 -0.007038 0.003771 0.007558 -0.015684 -0.020225 
+0.009024 -0.006840 -0.033071 0.003298 -0.011991 -0.017723 
+-0.005957 -0.007433 -0.004133 -0.012048 -0.003087 -0.000125 
+-0.007382 0.008015 0.003489 -0.002891 0.016488 -0.002204 
+-0.002851 0.006820 -0.002142 0.001715 -0.002832 0.000898 
+0.010527 -0.007044 -0.000184 0.026318 -0.008046 -0.005532 
+4.342975 -1.301653 -1.351240 5.594306 -2.010676 -1.274021 
+6.054983 -2.810997 -1.065292 6.078125 -3.367188 -0.914062 
+5.867347 -3.295918 -0.831633 5.205674 -2.510638 -0.546099 
+0.014884 -0.017030 0.017150 0.012878 -0.008450 -0.000043 
+0.002368 -0.001122 0.000840 -0.001840 -0.000262 -0.000969 
+-0.001543 -0.000635 -0.002077 -0.001094 0.003074 -0.003934 
+0.001956 -0.000924 -0.001229 -0.002393 0.001523 0.000254 
+0.000133 0.004754 0.000999 0.002427 0.000127 0.004011 
+0.002185 0.000587 -0.000017 -0.001361 -0.002138 -0.000031 
+-0.000785 -0.002044 0.002669 -0.001625 -0.000744 0.005149 
+-0.000889 -0.000174 0.006683 -0.003716 0.000214 0.006142 
+-0.004735 0.004931 0.003817 -0.002790 0.006944 0.002109 
+-0.000026 0.002259 0.002083 0.000883 -0.001747 0.000780 
+0.000784 -0.001644 0.000610 0.007080 0.003231 0.000686 
+0.002944 0.004583 -0.001364 -0.015571 -0.005711 0.008070 
+-0.017510 -0.012431 0.022769 -0.013360 -0.009887 0.030400 
+-0.008517 -0.005105 0.028191 -0.002748 -0.000634 0.011357 
+0.006185 -0.001741 -0.013148 0.002554 -0.009766 -0.009232 
+-0.004195 -0.001073 -0.000748 -0.001802 0.003934 -0.005837 
+-0.000151 -0.002828 0.001926 0.000414 -0.003294 0.002804 
+0.000171 -0.000976 0.000712 0.001058 0.000191 -0.000371 
+0.001439 -0.000236 -0.000019 0.002529 0.000773 0.000649 
+0.004101 0.001801 0.001599 0.004695 0.001553 0.001878 
+0.004162 0.000847 0.000612 0.001820 0.002050 0.000896 
+-0.002185 0.003567 0.001857 -0.004058 0.004076 0.000003 
+-0.003529 0.004154 0.000300 0.000350 0.001892 0.000927 
+0.004093 -0.000152 -0.003811 0.002984 -0.000721 -0.006558 
+0.004492 -0.000079 -0.006255 0.001078 -0.001267 -0.000599 
+-0.003149 0.000031 -0.001116 -0.002920 -0.001598 -0.001679 
+0.000690 -0.002327 -0.000906 0.005456 -0.000796 0.002497 
+0.006841 0.001175 0.005688 0.006186 -0.005520 0.004710 
+0.013545 -0.011004 -0.005547 0.005768 -0.007855 0.008411 
+-0.004782 -0.014195 -0.005092 -0.011916 -0.013142 -0.014925 
+-0.020114 -0.006698 -0.025836 -0.019078 0.003824 0.001534 
+-0.018474 -0.004174 0.010125 -0.012362 -0.000173 0.004091 
+-0.005286 0.003942 -0.002082 0.001468 0.002300 -0.003501 
+0.009039 -0.003231 -0.001636 0.019245 -0.008089 -0.001525 
+3.132420 -1.031963 -0.410959 4.158333 -1.129167 -0.629167 
+4.812000 -1.416000 -0.724000 5.284483 -2.030172 -0.737069 
+5.553192 -2.893617 -0.680851 5.232394 -3.401408 -0.542253 
+0.045212 -0.014003 -0.001851 0.025011 -0.009582 0.004408 
+0.010035 -0.006234 -0.001083 0.000422 -0.002042 -0.001993 
+-0.005094 0.000682 -0.000138 -0.005973 0.000859 0.001166 
+-0.003767 0.002178 0.000068 -0.003496 0.000081 0.000081 
+-0.003919 0.000944 -0.000378 -0.002097 -0.000274 0.000592 
+-0.000369 0.002318 0.004375 0.001541 0.003432 0.001098 
+0.006378 -0.004346 0.001468 0.003913 -0.005094 0.003101 
+0.001755 -0.003009 0.003634 0.001501 0.002886 0.001844 
+-0.000366 0.005216 0.000045 -0.002191 0.000095 0.003125 
+-0.003201 -0.000526 0.004678 -0.001850 -0.000859 0.001413 
+0.001219 0.000443 -0.000279 0.005577 0.000212 0.000995 
+0.004673 -0.001067 0.004035 0.018438 -0.003755 0.000852 
+0.006439 -0.014440 -0.001488 -3.518750 -1.087500 3.156250 
+-4.125490 0.231373 5.015687 -4.033784 0.807432 5.932433 
+-3.591093 1.461538 6.194332 -2.640718 2.461078 5.532934 
+-1.577586 2.965517 3.974138 -0.017223 0.010423 0.034515 
+-0.035309 -0.012963 0.020164 -0.019921 -0.020251 0.016420 
+0.004437 -0.000834 -0.007685 -0.005714 -0.001357 0.006373 
+-0.005531 -0.000471 0.001167 0.000698 0.001139 0.000724 
+0.003053 -0.001712 -0.000106 0.002907 -0.001497 -0.000541 
+-0.001469 -0.000446 -0.000474 -0.004002 -0.000581 -0.000777 
+-0.001178 0.000409 0.000536 0.001703 0.003185 -0.000267 
+-0.000467 0.001759 0.000789 -0.001089 0.000449 -0.000019 
+-0.001256 -0.000033 -0.000460 -0.002461 0.000478 0.000241 
+-0.003513 0.000484 0.002844 -0.000687 0.000231 0.001794 
+0.002059 0.000886 -0.002048 0.003055 0.000323 -0.001143 
+0.003741 -0.001875 0.000597 0.006287 -0.006279 0.001386 
+0.007198 -0.006524 -0.000580 0.008388 -0.002833 -0.004563 
+0.018071 -0.000281 -0.002309 0.024282 -0.011582 -0.003203 
+0.014821 -0.014439 0.002269 -0.021343 -0.014274 -0.018790 
+-0.027610 0.010394 -0.007146 -0.017352 0.003283 0.000287 
+-0.001231 -0.002391 0.008645 0.013238 -0.007365 0.013325 
+0.022610 -0.010284 0.009080 0.025467 -0.008769 0.001258 
+0.028181 -0.006259 -0.003559 3.358490 -0.386792 -0.382075 
+3.828326 -0.519313 -0.527897 4.118367 -0.759184 -0.583673 
+4.218624 -1.000000 -0.518219 4.181035 -1.168103 -0.327586 
+4.020725 -1.305699 -0.160622 0.031326 -0.021817 -0.004217 
+0.026605 -0.016547 -0.001284 0.000330 -0.010907 0.007494 
+-0.003772 -0.003706 -0.003096 -0.002728 0.003087 -0.000834 
+-0.003078 0.000355 -0.001924 -0.001416 0.001496 -0.003001 
+-0.001520 0.000690 -0.000310 -0.003361 0.001717 -0.002673 
+0.001005 0.000341 -0.002228 0.004786 0.007944 -0.000073 
+0.000620 0.008620 0.001829 0.002545 0.002557 0.004460 
+-0.000830 -0.000382 -0.003261 0.001874 0.000185 -0.001620 
+0.002347 -0.000187 0.000925 0.002891 -0.001584 0.000753 
+0.003095 -0.003071 0.001543 0.001865 -0.001634 -0.002916 
+-0.003006 -0.001963 0.000250 -0.007279 0.000007 0.007326 
+-0.004801 -0.003828 0.007509 -0.001425 -0.002581 -0.000391 
+-0.002176 -0.001189 -0.000060 -0.007764 -0.001111 0.002831 
+-0.003275 -0.004041 0.000005 0.018161 -0.007818 -0.011195 
+0.014614 -0.015501 -0.020733 -3.309859 -1.542253 2.922535 
+-4.907692 0.380769 5.342308 -4.976811 1.820290 6.156522 
+-4.696133 3.292818 6.806630 -4.200000 4.563077 7.040000 
+-3.825000 5.150000 6.933333 -4.220588 5.198529 6.948529 
+-6.507463 3.805970 8.343284 0.020016 -0.027338 -0.033197 
+0.000460 0.010754 -0.002929 -0.012756 -0.000390 0.007142 
+-0.008725 -0.001431 -0.001474 -0.007650 0.002500 -0.001974 
+-0.008698 0.010388 -0.000035 -0.006434 0.007346 0.001734 
+-0.005509 -0.003874 -0.002349 -0.008557 -0.013458 -0.002916 
+-0.003993 -0.007266 0.006255 -0.000849 0.000305 0.001738 
+-0.001134 -0.000838 0.000824 -0.002934 -0.004906 -0.004280 
+-0.002478 -0.003877 -0.003128 0.001549 0.004436 0.002222 
+-0.001350 0.008736 0.007550 -0.002344 0.003948 0.011563 
+-0.003747 0.000827 0.006012 0.000026 -0.000631 -0.000464 
+0.005527 -0.004648 -0.000594 0.007202 -0.008509 -0.001770 
+0.006179 -0.005387 -0.009053 0.004472 0.007168 -0.004245 
+0.002634 -0.004010 0.000752 0.005320 -0.014512 -0.004210 
+-0.000112 -0.016397 -0.019634 -0.028101 0.025889 0.000554 
+-0.004121 0.010114 0.027694 3.310105 1.174216 3.470383 
+4.898352 0.469780 3.870879 5.968661 -0.082621 3.655271 
+6.522648 -0.445993 2.588850 6.122530 -0.478261 0.893281 
+5.546875 -0.347656 -0.109375 5.315175 -0.295720 -0.392996 
+5.041841 -0.426778 -0.548117 4.370370 -0.777778 -0.560185 
+3.369792 -1.145833 -0.244792 0.021895 -0.013162 0.000868 
+0.007922 -0.008178 0.001370 -0.005364 0.001702 0.002975 
+-0.019754 0.001023 -0.002277 -0.018160 0.007246 -0.006283 
+-0.012058 0.007804 -0.004225 -0.006339 0.006629 -0.000025 
+-0.001822 0.001210 -0.000819 0.004040 0.000727 0.000162 
+0.004878 -0.001641 -0.002312 0.003009 -0.000092 0.001986 
+0.006371 0.003332 -0.002450 0.003771 0.005613 -0.002057 
+0.000202 0.005244 0.002463 -0.000601 0.004854 0.001963 
+0.007176 0.002443 0.000000 0.003603 -0.000977 0.001366 
+-0.001037 0.000102 0.002950 0.001197 -0.003333 -0.001795 
+0.005718 -0.003360 -0.001003 0.005041 0.000118 -0.000602 
+-0.000710 0.000314 0.001434 -0.003828 -0.000136 0.002332 
+-0.002337 -0.000017 0.001039 -0.001202 0.002442 0.002868 
+0.000210 0.003761 0.005019 -0.001476 -0.000030 -0.000994 
+0.001337 -0.002177 -0.001555 0.002452 0.000061 -0.001173 
+0.005404 -0.002523 -0.006860 -0.003912 -0.000483 -0.008675 
+-4.200000 0.069565 3.573913 -4.566667 2.757143 5.595238 
+-4.208333 4.336538 6.548077 -3.939297 5.083067 6.916933 
+-3.897436 5.010256 7.020513 -4.385542 4.626506 6.265060 
+-4.723404 10.489362 2.617021 0.031417 0.021806 -0.034820 
+-0.020933 0.001117 0.010974 -0.013416 0.000258 0.000343 
+-0.012380 -0.002925 -0.003156 -0.014028 0.006745 0.003272 
+-0.007495 0.019340 0.009089 0.002895 0.012468 0.009855 
+0.002191 -0.006831 -0.003230 -0.007092 -0.016681 0.005554 
+-0.001811 -0.006453 0.009923 -0.001321 0.001406 0.000662 
+-0.001419 -0.003834 -0.005839 -0.003051 0.002391 -0.011949 
+-0.001428 0.002259 -0.000860 0.008345 0.006240 0.002077 
+-0.000818 0.007289 0.007773 -0.004208 0.002147 0.007419 
+-0.002412 0.000975 0.001573 0.002016 -0.001668 -0.000033 
+0.000823 -0.002665 -0.001426 -0.005740 0.002751 -0.006917 
+-0.004785 0.010850 -0.018479 -0.008337 -0.006216 -0.003618 
+-0.013961 -0.019270 -0.010123 0.001993 -0.007212 -0.001204 
+0.015582 0.012273 0.028865 4.021739 4.717391 3.646739 
+5.103560 3.582524 4.990291 6.101580 2.069978 5.268623 
+7.180085 0.713983 5.033898 8.314285 -0.301299 4.288311 
+7.791667 -0.572917 3.079861 6.519149 -0.468085 1.727660 
+5.724138 -0.576355 0.532020 4.694118 -0.629412 -0.405882 
+0.034620 -0.007892 -0.014575 0.023349 0.003077 -0.009037 
+0.006672 0.000868 -0.000446 -0.003876 -0.002153 0.000368 
+-0.010827 0.005079 -0.002507 -0.018659 0.002591 0.000833 
+-0.020825 0.001211 0.000988 -0.017553 0.002432 0.001886 
+-0.005397 0.003702 -0.002194 -0.000243 0.000545 -0.000052 
+0.006635 0.001057 0.003719 0.000829 -0.002392 0.003860 
+0.001481 -0.001481 -0.002074 0.009632 0.007500 -0.007868 
+0.008121 0.001613 -0.007019 0.001896 -0.001390 -0.001691 
+-0.000652 -0.001337 0.000982 -0.001591 0.000558 -0.000095 
+-0.000156 0.000394 0.000005 -0.001762 -0.000176 0.000226 
+0.002057 0.000964 0.006042 0.001005 0.001508 0.004724 
+0.002947 0.001183 0.001170 0.000542 0.000840 0.000217 
+0.000517 -0.000508 -0.001551 0.000718 0.001436 -0.003162 
+0.000880 0.001610 -0.000981 -0.000887 0.002379 0.002379 
+-0.000580 0.002598 0.005473 -0.000972 0.002069 0.004014 
+0.003305 0.003823 0.001213 0.006117 -0.002238 0.000743 
+0.002466 -0.004372 -0.006567 0.003527 -0.005767 -0.012087 
+-0.010660 0.000694 -0.010288 -0.003277 -0.003427 0.016026 
+-2.031250 2.456250 3.250000 -1.891304 2.637681 3.369565 
+-0.006530 -0.005284 0.018568 0.059862 -0.063168 -0.032684 
+0.043964 0.022047 -0.081691 -0.012437 0.001573 0.009863 
+-0.010896 -0.015302 -0.003323 -0.009680 -0.015278 -0.008456 
+-0.011921 0.001458 -0.001908 -0.003312 0.004500 0.009848 
+0.003546 -0.000171 0.014394 0.010496 0.001062 0.009530 
+0.010156 0.002770 -0.003825 -0.000603 0.002182 0.000247 
+-0.001839 -0.005330 0.004776 -0.001596 -0.007338 0.000965 
+0.000791 -0.000629 -0.001809 0.000824 0.006727 -0.001060 
+0.005905 0.006127 0.008904 0.008338 -0.004177 0.003417 
+-0.015262 -0.008962 0.000282 -0.001535 -0.006206 -0.006043 
+0.007400 -0.001980 -0.006499 0.003324 -0.001892 -0.000853 
+0.000457 0.000605 0.000645 0.001894 0.003805 0.001608 
+-0.001129 -0.003464 -0.000042 0.004666 -0.040440 -0.012444 
+-0.058228 -0.002622 -0.062643 3.318681 3.153846 0.670330 
+3.884422 4.467337 5.085427 4.692053 4.665563 5.311258 
+5.853293 3.991018 5.667665 7.150877 2.526316 5.807017 
+7.831579 0.226316 5.278947 9.710280 -1.560748 3.186916 
+0.058881 -0.009029 0.006577 0.024937 -0.002208 0.005161 
+0.014371 -0.001471 0.004069 -0.001869 0.002550 -0.003432 
+0.001286 0.007933 -0.000656 0.006011 0.005547 0.004769 
+0.000762 0.002965 0.005704 -0.005300 0.002095 0.005205 
+-0.009929 -0.000428 0.003561 -0.011318 -0.003948 0.000188 
+-0.007875 -0.004849 0.003911 -0.001356 -0.002364 -0.006369 
+0.000510 -0.002897 -0.001676 0.003542 -0.000198 -0.001729 
+0.003112 -0.000795 0.002445 0.004504 -0.000653 0.000336 
+0.009149 0.002608 -0.001875 0.005038 -0.000578 -0.000868 
+-0.000829 0.000063 -0.003132 -0.001704 0.001286 -0.002272 
+-0.000865 0.001880 -0.001756 -0.001121 0.000873 -0.000830 
+0.001818 -0.001818 0.000909 0.000213 -0.001065 0.002000 
+-0.000682 0.002231 0.003596 0.002486 0.001548 0.006051 
+0.001385 -0.004959 0.007438 0.000990 -0.006979 0.004479 
+-0.000486 -0.002335 0.002616 0.001220 -0.000220 0.000308 
+0.001290 -0.000484 0.000323 -0.000520 -0.001476 -0.000055 
+-0.001891 0.000572 -0.001776 0.002119 0.004746 -0.001610 
+0.000171 0.000855 -0.002906 0.007015 0.002051 -0.004451 
+0.003624 0.001187 -0.011822 -0.001064 -0.000926 -0.008302 
+-0.000618 0.000797 0.001240 -0.003410 -0.001468 0.002906 
+0.004448 -0.006255 0.001513 0.004290 -0.009976 -0.013799 
+-0.005326 0.011792 -0.009748 0.012194 0.008864 -0.017522 
+0.004198 -0.003030 0.003378 0.004889 -0.006996 -0.001676 
+-0.002241 -0.010169 -0.001995 -0.007065 -0.005072 -0.003824 
+-0.003099 0.002424 -0.001817 -0.003542 0.002523 -0.000397 
+0.003475 0.001287 -0.003830 0.005290 -0.004446 -0.001487 
+0.000183 -0.002669 0.000786 -0.003081 -0.000988 0.002709 
+-0.003228 -0.002389 0.003248 -0.002858 -0.003254 0.000299 
+-0.001484 0.000137 -0.001204 -0.000039 0.001343 0.000539 
+0.001152 0.000951 0.001420 -0.003806 -0.006829 -0.000730 
+-0.008033 -0.007928 0.001379 -0.001025 -0.002607 -0.004407 
+-0.000163 -0.002302 -0.005083 -0.007157 -0.006503 -0.007527 
+-0.008116 -0.009943 -0.004535 0.000049 -0.008960 -0.001938 
+0.001386 -0.021092 -0.004176 -0.008175 -0.016254 0.015127 
+2.472727 2.363636 -16.981817 4.337079 3.853933 1.179775 
+4.229885 4.436781 6.005747 4.152838 4.676856 5.641922 
+3.932584 4.050562 5.511236 0.019983 -0.013132 0.042690 
+-0.024003 0.003333 -0.003333 -0.008543 0.003099 -0.006228 
+0.009748 -0.001305 0.001462 -0.005677 -0.007748 -0.009618 
+-0.016148 -0.002238 -0.015037 -0.009505 0.002688 -0.004501 
+-0.004444 0.003474 0.006558 -0.004589 -0.001574 0.006632 
+-0.008660 -0.003569 0.000258 -0.005498 -0.004382 0.000606 
+-0.000754 -0.003043 -0.001435 -0.000043 -0.002508 -0.001494 
+0.001206 -0.001057 -0.004183 -0.001012 -0.000415 -0.002106 
+0.001581 -0.001581 0.004044 0.003817 -0.002455 0.004239 
+0.000972 -0.001692 -0.001270 0.000113 0.000507 -0.005385 
+0.000000 0.004841 -0.005317 -0.002445 0.001571 -0.001098 
+-0.002865 -0.000378 -0.004390 -0.007427 -0.004327 -0.001550 
+0.000053 -0.000121 -0.000111 0.001487 0.000326 0.002772 
+-0.001008 -0.001860 0.003876 -0.001406 -0.001985 0.000496 
+0.000404 -0.000509 -0.000205 -0.001607 -0.000796 -0.000195 
+-0.001272 -0.003170 0.004129 -0.001270 -0.001746 0.000000 
+-0.000065 -0.000925 0.000450 0.000852 -0.001636 0.000697 
+-0.000634 -0.002472 0.000778 -0.001216 -0.001618 -0.002852 
+0.003526 -0.000110 -0.007493 0.005314 0.002411 -0.009288 
+0.003283 0.004289 -0.004752 -0.001056 0.002823 -0.002067 
+-0.000727 0.001971 -0.001389 -0.000121 0.001506 -0.001399 
+0.004713 0.003226 -0.001325 0.004519 -0.001003 -0.005189 
+0.001152 0.001612 -0.003575 0.001314 0.003660 -0.004392 
+0.001762 0.007046 -0.005517 0.005425 0.007975 -0.000844 
+0.005109 0.002332 -0.001080 -0.002439 -0.000966 0.000541 
+-0.002066 -0.003183 -0.001284 -0.003366 -0.002777 -0.005628 
+-0.003908 0.003267 -0.013417 -0.005455 -0.000656 -0.006060 
+-0.005398 0.005300 -0.001130 -0.005793 -0.001097 0.002687 
+-0.003372 -0.004347 0.000797 -0.002093 -0.001331 0.000488 
+-0.001194 0.000012 0.001397 -0.000986 -0.000219 0.001133 
+-0.002617 0.000157 0.000509 -0.002611 -0.000093 -0.001895 
+-0.004175 -0.001985 -0.004076 -0.004485 -0.004525 -0.003637 
+-0.001406 -0.007486 0.001952 -0.000758 -0.012807 0.011365 
+-0.002191 0.002271 0.003740 -0.000879 0.000073 0.000291 
+0.010197 0.012517 -0.000187 0.007979 0.005250 0.001865 
+-0.000936 -0.015148 -0.003903 0.002708 -0.016250 -0.016250 
+3.072727 3.109091 -11.545455 0.033765 0.039925 -0.015894 
+4.164835 4.230769 4.197802 3.842105 4.596491 4.912281 
+2.284314 3.529412 4.000000 0.002455 0.013397 0.009694 
+0.005006 -0.005495 -0.009205 0.004571 -0.004275 -0.016596 
+-0.002890 0.000924 -0.006403 -0.004904 0.002285 -0.003408 
+-0.004245 0.000499 -0.004767 0.001634 -0.000613 -0.004430 
+0.002974 0.007363 -0.003539 -0.000515 0.004032 -0.001911 
+-0.000949 -0.000625 -0.000470 0.001014 -0.000559 0.002199 
+0.004809 -0.000063 0.002158 0.000712 0.001857 -0.002452 
+-0.001558 0.001966 -0.004810 -0.007976 -0.000184 -0.001727 
+-0.004581 -0.000653 0.004645 -0.004233 -0.004644 0.001769 
+-0.002233 0.000383 -0.000445 -0.000991 0.000471 -0.001003 
+-0.001077 -0.000731 0.000731 0.000035 -0.000044 -0.000017 
+-0.004360 -0.003705 -0.000436 -0.004715 0.002170 0.001122 
+-0.004401 0.002454 0.001650 -0.004514 0.000103 0.001158 
+-0.002905 0.003712 -0.002672 0.000000 -0.001240 -0.003488 
+-0.002748 -0.004427 -0.001832 -0.004798 -0.003430 0.002171 
+-0.003995 -0.001485 0.001050 -0.000078 -0.001241 -0.000276 
+0.002481 -0.003178 0.001240 0.001538 0.000000 0.001538 
+-0.001034 -0.000749 0.000568 0.001353 0.000084 -0.000212 
+0.004155 -0.000693 0.001484 0.003333 -0.001119 0.000639 
+0.001128 0.002353 -0.000596 0.000678 0.003611 -0.002658 
+0.002063 0.002262 -0.002262 0.003646 0.002514 -0.000884 
+0.003367 0.001305 -0.002105 0.001981 0.000268 -0.001867 
+-0.000678 -0.003431 -0.002535 -0.001767 -0.003403 -0.002956 
+0.001452 0.001483 -0.005403 0.007335 0.005292 -0.007929 
+0.006247 0.001659 -0.005579 0.002351 -0.000850 0.001845 
+0.001268 -0.006384 0.000188 -0.001975 0.000256 -0.001093 
+-0.003873 -0.000055 -0.003862 -0.008258 0.003477 0.000325 
+-0.005952 0.002227 0.004143 -0.008730 -0.003869 0.004277 
+-0.007619 -0.000856 -0.000393 -0.003073 0.000768 0.000979 
+0.002746 -0.001310 -0.002360 0.005103 -0.000013 -0.001650 
+0.003979 -0.001160 -0.000411 0.000836 -0.003836 -0.004348 
+0.000811 -0.008632 -0.007796 0.000981 -0.007848 -0.005286 
+-0.006999 -0.007684 0.003243 -0.010798 -0.004544 0.007176 
+-0.004230 0.001212 0.003800 -0.006474 0.003333 -0.003141 
+0.014185 0.012574 -0.004937 -0.002270 0.005036 0.000682 
+-0.001322 -0.007428 0.001093 -0.010966 -0.010380 0.001130 
+-0.004338 0.007934 0.001270 0.009522 -0.001358 -0.005077 
+-0.017871 -0.013247 -0.026953 -0.034845 -0.034042 -0.009444 
+-0.005141 -0.018901 -0.012224 -0.002652 -0.000266 -0.007975 
+-0.004445 0.002801 -0.004050 -0.010077 -0.001725 0.003622 
+-0.006532 -0.001292 0.009545 0.000048 -0.006145 0.005619 
+-0.000462 0.000167 0.001382 0.000440 -0.000481 -0.000704 
+-0.000031 -0.000411 -0.000696 -0.000623 0.000575 0.000572 
+-0.003444 0.002187 0.000445 -0.002153 0.000128 -0.002300 
+-0.000973 -0.000385 -0.001291 -0.000488 -0.000469 -0.001126 
+-0.002439 -0.001290 -0.001829 -0.006494 -0.005256 0.000152 
+-0.000057 -0.005117 -0.002657 -0.000524 -0.000253 -0.001655 
+-0.001435 -0.000057 -0.002522 -0.001998 -0.001370 -0.003438 
+-0.001071 -0.003074 -0.002734 -0.002743 -0.006221 -0.000574 
+-0.002178 -0.001573 0.006776 0.001305 -0.001764 0.001997 
+-0.001628 -0.003225 0.000301 -0.001604 -0.000223 0.000201 
+-0.000431 0.002132 -0.000390 -0.000405 0.003281 -0.000068 
+-0.001274 0.000246 0.000418 -0.002636 -0.000076 -0.000134 
+-0.002178 -0.000951 0.005032 -0.005128 -0.003466 0.000554 
+0.001823 -0.000443 0.002760 0.001414 0.000334 -0.001997 
+0.003215 0.000791 -0.001002 0.000840 -0.004046 0.000840 
+0.002349 -0.006826 0.000807 0.001200 -0.004442 -0.000808 
+0.002202 -0.000735 -0.002496 0.002595 -0.000153 0.001221 
+0.002641 0.001308 -0.002311 0.000787 -0.000374 0.001630 
+-0.003767 -0.001154 0.000769 -0.001724 -0.002467 0.001967 
+-0.003322 -0.000877 0.001029 -0.002373 0.000087 0.002843 
+-0.005400 0.000044 0.004860 -0.007366 -0.000269 0.002949 
+-0.003114 -0.003033 -0.001464 0.000279 -0.004736 -0.003501 
+-0.000627 -0.007407 0.000775 -0.000610 -0.011770 -0.001062 
+-0.011681 -0.014125 0.006472 0.001852 -0.003963 0.003056 
+0.001853 -0.001803 -0.003104 0.000801 -0.000235 -0.003353 
+-0.005984 -0.002851 -0.000342 -0.006462 -0.009000 0.001615 
+0.000622 -0.003643 -0.001669 0.006385 -0.000695 0.000706 
+0.003324 -0.000851 0.000075 -0.005191 -0.007331 -0.004429 
+-0.009790 -0.022121 0.001994 -0.012800 -0.023457 0.007541 
+-0.016171 -0.011924 0.010193 -0.012723 -0.011700 0.004325 
+-0.011531 -0.008003 -0.003767 -0.005299 -0.014073 -0.013471 
+0.002406 -0.016659 -0.015022 0.005683 -0.009675 -0.005836 
+0.005800 -0.001667 -0.002400 0.004252 0.000211 -0.007283 
+-0.002456 -0.000379 -0.005491 -0.008126 0.002474 -0.001737 
+-0.007590 0.003317 -0.002706 -0.005711 0.002423 -0.003909 
+-0.002637 0.001297 -0.004004 -0.000251 0.000402 -0.001814 
+-0.002393 -0.002131 0.001114 -0.000223 0.000100 0.000593 
+0.001518 -0.001336 0.000252 0.005243 0.001001 -0.000254 
+0.006764 0.000398 -0.000938 0.003407 -0.001231 -0.000193 
+0.000812 -0.000513 0.000047 -0.001917 -0.000161 -0.000751 
+-0.000777 -0.001057 -0.001417 0.000752 -0.000520 -0.001454 
+0.000000 -0.000778 0.000156 -0.001427 -0.001604 -0.000449 
+-0.002219 -0.002141 -0.000872 -0.002099 -0.003819 -0.000107 
+-0.001960 -0.005086 0.001514 -0.002266 -0.003717 0.001337 
+-0.001144 -0.000376 -0.000948 -0.001339 -0.000551 -0.001195 
+-0.001826 -0.003191 -0.001206 -0.005050 -0.006659 0.006430 
+-0.005923 0.001251 0.004171 -0.002213 -0.000005 0.002206 
+-0.000256 -0.000546 -0.002278 0.004974 -0.002297 -0.005436 
+-0.001439 -0.000775 -0.000153 -0.001288 0.001960 -0.000448 
+-0.001543 0.001910 0.000749 -0.001290 0.000000 0.000645 
+-0.000996 -0.003030 0.000541 0.000250 -0.001252 0.001550 
+-0.001064 -0.000148 0.000808 0.001469 -0.000036 0.000385 
+-0.000109 -0.002861 0.000633 -0.003135 -0.005931 0.000410 
+-0.005196 -0.003865 0.002355 -0.002907 -0.002028 0.001998 
+-0.000489 -0.001377 0.000316 0.000274 -0.000847 -0.001021 
+-0.000368 0.000473 -0.004365 0.004326 0.004307 -0.007217 
+0.001632 0.003912 -0.009947 0.004524 0.003724 -0.004677 
+-0.000403 0.000186 -0.002248 -0.006624 0.002100 0.002943 
+-0.006837 0.001698 0.004664 -0.005086 0.002359 0.005286 
+-0.002839 0.002734 0.004409 0.000826 0.003860 0.001436 
+0.003970 0.002335 -0.002725 -0.000088 -0.005372 -0.008882 
+0.000334 -0.002454 -0.008167 0.000306 -0.001708 0.000684 
+0.000732 0.002190 0.003240 -0.001144 0.004336 0.001964 
+0.004974 0.005160 -0.001230 0.003379 0.006109 -0.004992 
+0.000041 -0.000509 0.000877 -0.001346 -0.006017 -0.003045 
+-0.007557 -0.012371 0.007294 -0.000690 0.000729 -0.002036 
+0.001343 -0.003604 -0.005121 0.003571 0.000185 0.000151 
+-0.001080 0.009724 -0.008421 0.000182 0.003003 -0.007191 
+0.001982 -0.003385 -0.003745 0.001176 -0.001160 -0.001482 
+0.001199 0.000677 -0.000259 0.002741 0.003618 -0.005122 
+-0.004441 0.000313 -0.002001 0.005012 0.006709 -0.002789 
+0.001328 -0.000618 -0.001640 -0.002478 0.003068 0.004046 
+-0.003677 0.004310 0.003013 -0.000581 0.001289 0.001094 
+0.001195 -0.001474 0.000377 0.001641 0.001406 -0.000388 
+0.001846 -0.000622 -0.000446 0.001014 -0.000069 -0.001751 
+0.000732 -0.003196 -0.001278 0.002641 -0.000323 0.000104 
+0.003952 0.006548 -0.003742 -0.000840 0.000820 -0.002404 
+0.000358 -0.000964 0.000468 -0.001428 -0.008569 0.002586 
+-0.003557 -0.007917 0.001607 -0.001319 -0.002292 0.000187 
+0.000791 0.001446 -0.001038 0.000014 0.002176 -0.000358 
+-0.000339 0.000095 -0.000108 -0.000127 -0.001132 0.000300 
+0.001126 -0.000435 -0.000808 0.003141 0.001176 -0.001218 
+0.001386 0.001613 0.001154 0.001076 0.000820 0.000847 
+0.000242 -0.002886 -0.000825 -0.004874 -0.006531 -0.000506 
+-0.005681 -0.005257 -0.000882 -0.002921 0.000986 -0.001414 
+-0.001552 0.007969 -0.002417 -0.001346 0.007343 -0.003623 
+-0.000491 -0.002290 -0.001025 -0.000405 -0.002461 -0.000992 
+-0.000393 -0.000904 -0.001071 -0.003490 -0.006667 -0.002326 
+-0.002944 -0.002756 -0.001962 -0.001351 0.001872 -0.001185 
+0.000591 0.002255 -0.004992 0.000117 -0.002059 -0.002410 
+-0.001053 -0.001353 0.000526 -0.000540 0.001340 0.000267 
+0.000541 0.000622 0.000737 0.000467 -0.001601 0.000067 
+-0.000922 -0.005571 -0.000147 -0.000676 -0.002742 -0.001127 
+-0.002424 0.000763 -0.000225 0.002846 -0.000986 0.000182 
+0.007473 -0.000035 -0.003783 0.001335 0.001300 0.000457 
+0.000381 -0.001314 -0.003398 -0.001068 -0.000267 -0.002240 
+-0.000149 0.001736 0.001321 0.001156 0.004996 0.004566 
+0.001365 0.005432 0.006716 0.001455 0.002505 0.001948 
+-0.003971 0.001106 -0.005102 -0.003581 0.001397 -0.006664 
+0.002677 0.006123 -0.003434 0.003264 0.005688 0.005494 
+0.000463 0.005581 0.001537 -0.001324 0.004732 -0.000715 
+0.001489 0.006744 -0.001944 0.004434 0.008877 -0.009071 
+0.004454 0.010482 -0.016293 0.004610 0.009340 -0.020297 
+-0.002690 0.002391 -0.019259 0.000557 0.001007 0.000864 
+0.008342 0.003582 0.002169 0.007129 0.003159 0.001458 
+0.002558 0.001612 0.000961 -0.000805 -0.001437 0.000162 
+-0.004218 -0.002402 0.000264 -0.003437 -0.001864 -0.002043 
+0.000691 -0.003000 -0.002706 0.001263 -0.005305 -0.005474 
+0.004394 -0.005067 -0.012156 0.001241 -0.005371 -0.009079 
+0.000896 -0.001920 -0.001437 0.000738 0.001297 0.003163 
+0.001955 0.001207 0.003635 0.002713 -0.001406 0.000449 
+0.000140 -0.003758 -0.002311 -0.001296 0.000003 0.002261 
+-0.009337 -0.003782 0.001608 -0.000871 -0.002143 0.000514 
+-0.000600 0.001171 -0.000345 0.000098 -0.001749 -0.001867 
+0.001259 -0.002984 -0.001619 -0.000647 0.000831 -0.000776 
+-0.002893 -0.000235 -0.001176 -0.004711 -0.001830 0.002288 
+-0.004575 0.000042 0.002172 -0.000678 0.000667 -0.000317 
+0.000913 0.003298 -0.003247 0.003453 0.005259 -0.001700 
+0.000631 0.001200 -0.000846 -0.002237 -0.001039 0.001618 
+-0.002956 -0.000800 0.000759 -0.000682 0.001119 0.000181 
+0.001056 0.000119 0.000873 0.000882 0.000831 0.001557 
+0.003277 0.002850 0.000870 0.002941 0.000053 0.000177 
+0.000634 -0.003859 -0.001057 -0.002441 -0.005248 -0.002941 
+-0.001485 -0.004994 -0.001991 -0.000594 -0.000846 0.001512 
+-0.003082 -0.001350 -0.001075 -0.002406 -0.004154 0.000477 
+-0.002199 -0.002797 0.005228 0.000364 -0.000587 0.004772 
+0.003300 -0.003616 0.000588 0.002704 -0.004375 0.001803 
+0.002758 -0.000859 -0.001839 0.003485 0.002462 -0.000996 
+0.000123 0.002769 0.000062 0.000240 -0.000589 -0.000081 
+0.003637 -0.000034 0.000687 0.001984 0.002381 0.001429 
+0.001325 0.002352 0.001754 -0.001161 0.000257 0.001373 
+-0.002792 -0.000592 -0.000761 -0.001094 0.001385 -0.003117 
+0.002367 0.002261 -0.002693 0.002129 0.000274 -0.000715 
+-0.000648 0.000326 0.002232 -0.000779 -0.004725 0.005940 
+-0.006540 -0.003794 0.005976 -0.000189 0.001887 0.005125 
+-0.000583 0.003765 0.003639 0.000299 0.004834 0.000998 
+-0.000051 0.000009 0.000445 -0.008344 0.003312 0.003871 
+-0.002614 -0.004378 0.004655 0.000951 0.005824 0.002277 
+0.000506 0.006768 0.001759 0.001752 0.003068 -0.000949 
+-0.002222 -0.003594 0.003353 -0.004090 -0.007760 0.005165 
+-0.003341 -0.004625 -0.002018 0.001930 -0.004035 -0.008070 
+0.001819 -0.002020 -0.000363 0.006257 0.002264 0.002878 
+0.005495 0.001171 0.000989 -0.001396 -0.004420 0.000078 
+-0.004491 -0.010756 0.005204 0.003011 -0.003678 0.011364 
+-0.001928 -0.000975 -0.001218 -0.004498 -0.003296 -0.002583 
+-0.002246 -0.002819 -0.002657 0.002817 0.001101 -0.002495 
+0.002655 -0.000975 0.002404 0.001431 0.000849 0.002839 
+0.000392 0.001672 0.003236 0.001086 0.000979 0.003043 
+0.002035 -0.001242 0.000513 -0.000914 -0.000466 -0.003985 
+0.000050 -0.001446 -0.001110 -0.002764 -0.003113 0.001164 
+-0.008508 -0.002412 0.001397 -0.000810 -0.002422 -0.000823 
+-0.001787 -0.002672 0.000949 -0.001256 0.000419 0.002248 
+-0.000651 -0.002340 0.003708 -0.002098 0.000477 0.003481 
+-0.005133 -0.003281 0.000811 -0.000728 -0.004466 0.000823 
+0.000034 -0.000679 -0.000790 0.001332 -0.000435 -0.000716 
+0.005140 0.003855 -0.002992 0.001263 0.000509 0.000931 
+-0.002066 -0.001782 -0.000162 -0.004918 -0.003696 0.000302 
+-0.002519 -0.000520 -0.000320 0.000204 0.001872 0.001678 
+0.001038 -0.000132 0.000722 0.001483 0.000600 -0.000918 
+0.000000 -0.003228 0.000000 -0.003178 -0.001767 0.003535 
+-0.001530 -0.003942 0.001015 -0.001132 -0.000540 -0.000447 
+-0.001603 -0.000271 0.000088 -0.000960 -0.001378 0.000172 
+-0.002703 -0.001399 0.001282 -0.003794 -0.003808 0.002085 
+-0.002546 0.001096 0.000034 0.000880 0.000456 0.000307 
+0.001009 -0.003925 0.001991 -0.001085 -0.004084 -0.002859 
+-0.001715 -0.005270 -0.001928 0.001701 -0.001033 -0.001433 
+0.003271 0.003271 -0.004586 0.004448 0.002792 -0.002878 
+0.002989 0.002169 -0.000820 0.003711 0.001927 0.000013 
+0.003772 0.002834 0.001884 0.000464 0.001412 0.000646 
+0.003236 -0.001387 -0.001111 -0.002128 -0.000851 0.002128 
+-0.004432 0.000858 0.001575 -0.001981 0.001127 -0.002084 
+-0.002004 0.001912 -0.004193 0.000008 -0.000777 -0.004247 
+0.001999 -0.000940 -0.002224 0.002777 -0.001072 0.000456 
+0.003176 -0.002239 0.000653 0.000989 -0.001618 -0.001051 
+0.000438 -0.000884 -0.001976 -0.000113 -0.005805 -0.007019 
+0.000385 -0.002692 -0.011923 0.004658 0.002929 -0.007180 
+0.008404 0.003950 -0.001865 0.004249 0.000454 0.000811 
+-0.003402 0.000807 0.002287 -0.001796 -0.000832 0.007079 
+-0.004343 -0.008382 0.009410 -0.006677 -0.004603 0.004173 
+-0.002979 -0.000078 -0.002457 0.002833 0.001447 -0.008251 
+-0.000032 -0.001587 -0.007968 -0.003328 0.003359 -0.008513 
+-0.003666 0.006516 -0.003324 -0.009548 -0.011071 0.001614 
+-0.014661 0.004307 -0.005171 -0.007937 0.003288 -0.000930 
+-0.000464 0.001547 0.001405 0.002128 0.000561 0.004450 
+0.001296 0.002072 0.004358 -0.000858 0.002833 0.003434 
+-0.001560 0.001450 0.002000 0.000374 0.000366 -0.001424 
+0.002185 0.001706 -0.003831 0.002530 0.000156 -0.005410 
+0.003653 -0.000584 -0.004309 0.005122 0.000955 -0.004066 
+0.004276 0.000934 -0.001294 0.003346 -0.000885 0.002288 
+0.001402 0.000561 0.001707 -0.001344 0.000054 -0.001989 
+-0.002963 0.003224 -0.004097 0.000060 0.000617 -0.001035 
+-0.000810 -0.003240 0.001053 -0.000129 -0.000760 0.000262 
+0.000370 0.002213 -0.004431 0.000198 -0.001284 -0.005926 
+0.001172 -0.001735 -0.004756 0.000130 0.000111 -0.001496 
+0.002160 0.002880 0.000480 0.002160 0.004743 0.001779 
+0.000303 0.001671 0.001286 -0.001805 -0.000414 -0.001801 
+-0.002607 -0.000517 -0.002179 -0.000656 -0.000054 0.000594 
+-0.002562 -0.002186 0.001732 -0.006615 -0.003204 0.000207 
+0.000910 -0.002378 0.004127 0.000196 -0.003391 -0.002609 
+-0.000860 0.003978 -0.002151 0.000240 0.005725 -0.004032 
+0.001969 -0.000070 -0.002009 -0.000872 -0.001068 0.000045 
+-0.002760 -0.000770 0.002095 0.001054 0.000809 0.001430 
+0.003147 -0.006334 0.004680 0.000741 -0.000253 0.000189 
+-0.004807 -0.001793 0.002584 -0.001297 -0.001284 0.001168 
+-0.001157 0.001087 -0.000588 0.001362 -0.002589 -0.003603 
+0.002082 -0.002124 -0.007044 0.002327 -0.000573 -0.006745 
+0.003215 -0.000671 -0.004167 0.001550 -0.002326 -0.001318 
+0.001341 -0.003017 0.000074 -0.002899 -0.000287 -0.001435 
+-0.001225 -0.002407 -0.002537 -0.001027 -0.000290 -0.002194 
+0.001408 -0.000266 0.000161 0.003235 -0.001416 0.003483 
+0.003135 -0.004278 0.001127 0.003975 0.000610 -0.003961 
+0.004091 0.005104 -0.008472 -0.000484 0.009194 -0.003713 
+0.009379 0.016586 -0.009792 0.022255 0.018113 -0.028001 
+0.036792 0.018790 -0.045563 0.039878 0.020472 -0.040367 
+0.036482 0.011809 -0.011517 0.016097 -0.003734 -0.009397 
+0.005030 -0.003413 -0.003645 0.000252 -0.002318 -0.001198 
+-0.000890 -0.001188 -0.001538 -0.001474 0.000488 0.000808 
+-0.004344 -0.001381 -0.002396 -0.004084 -0.005446 -0.004198 
+-0.006207 -0.008085 0.000407 -0.013565 -0.001668 0.006454 
+-0.027328 0.003789 0.003945 -0.026484 0.002122 -0.003767 
+-0.012914 0.000748 -0.011915 -0.003318 0.004175 -0.013702 
+0.001864 0.000386 -0.009370 0.000828 -0.003999 0.004221 
+0.000275 -0.001211 0.010523 -0.001058 0.001534 0.006699 
+0.004784 0.003912 -0.000249 -0.001012 0.001212 -0.001621 
+0.000110 -0.001488 -0.004353 -0.000842 -0.001056 -0.004011 
+-0.002407 -0.001924 -0.004487 -0.000488 -0.002877 -0.005737 
+0.001504 -0.000952 -0.003609 -0.001265 0.001718 0.002416 
+-0.002802 0.002802 0.009224 -0.006509 0.003147 0.004828 
+-0.004017 0.000000 0.000769 0.000259 -0.002500 -0.005172 
+0.001929 -0.003585 -0.004599 -0.000452 0.001135 -0.002242 
+-0.000384 0.001821 0.001453 -0.000415 0.000211 0.003109 
+-0.001100 -0.002703 -0.001298 -0.001407 -0.002792 -0.001418 
+-0.000976 -0.001620 -0.000896 0.000687 -0.001567 -0.000083 
+0.002459 -0.003345 -0.000715 0.001230 -0.004935 -0.002489 
+0.002684 -0.000088 -0.001123 0.000212 -0.000638 0.000923 
+-0.000987 -0.000848 0.002539 0.000488 0.000261 0.000913 
+0.001393 -0.000284 -0.001040 -0.001570 -0.002072 -0.001615 
+-0.001564 -0.001414 0.000936 -0.002505 0.001854 0.000631 
+-0.001822 -0.000316 -0.000685 -0.003943 0.001295 -0.000152 
+-0.000461 0.000571 0.001756 -0.000761 -0.001262 0.001530 
+-0.001270 -0.000794 0.000000 -0.000871 -0.002111 0.000076 
+-0.005128 -0.003419 0.001282 -0.000172 -0.004401 0.005873 
+0.001321 -0.002332 0.003886 0.000403 -0.000207 0.000019 
+-0.000342 -0.000767 -0.003108 0.000217 0.001014 -0.005725 
+0.001617 0.002288 -0.006541 0.001708 -0.000569 -0.004891 
+0.000022 -0.004101 0.000007 0.000678 -0.002745 0.003851 
+0.002388 -0.002205 0.002386 0.002656 -0.003207 0.001673 
+0.004601 -0.005479 0.001978 0.002900 -0.008763 0.004375 
+0.000843 -0.001026 -0.000498 -0.005074 0.000935 0.002811 
+-0.005419 -0.001034 0.000491 -0.009858 0.000208 -0.004746 
+-0.014322 0.002689 -0.004648 -0.017193 0.002052 -0.002342 
+-0.019279 -0.000441 0.000176 -0.019252 -0.002621 0.002448 
+-0.015315 -0.002641 0.003439 -0.008323 -0.001547 0.000095 
+-0.003632 -0.001931 -0.004537 -0.002243 -0.005165 -0.004163 
+-0.000240 -0.000726 0.003138 -0.012555 -0.004092 0.008848 
+0.000859 -0.002879 0.001284 0.006501 0.004069 0.007089 
+0.019466 0.000584 0.012445 0.026852 -0.001385 0.015514 
+0.023069 -0.001511 0.015146 0.015280 -0.001078 0.012314 
+0.007392 -0.000882 0.008490 0.001188 -0.000737 0.002744 
+0.000283 0.001174 -0.001846 -0.001123 0.002405 -0.000690 
+-0.001848 0.004178 0.005677 -0.000212 0.002377 0.003850 
+0.003582 0.001756 -0.001330 -0.001313 0.002614 -0.004386 
+0.000630 -0.001815 -0.003059 -0.000316 0.000123 -0.001559 
+-0.001356 -0.002712 -0.000205 0.000108 -0.001286 0.000045 
+0.001505 0.000463 -0.001937 0.002903 0.003415 -0.000626 
+0.000828 -0.000409 0.000053 -0.000228 -0.001150 0.002233 
+-0.001406 -0.000074 0.001776 -0.002907 -0.001181 -0.000778 
+-0.001538 -0.000024 -0.000552 0.000629 -0.001132 0.001951 
+0.000134 0.000078 -0.000302 0.000426 0.000028 -0.000119 
+-0.001175 -0.000607 -0.000318 -0.000552 -0.000977 -0.000357 
+0.000299 0.000779 0.000208 0.002732 0.003396 -0.002233 
+0.003430 0.003545 0.000046 -0.000231 0.001154 0.003500 
+-0.000806 -0.002339 0.002581 0.003786 -0.002932 0.000369 
+0.000180 -0.002650 -0.005525 -0.002210 -0.003611 -0.005343 
+-0.004259 -0.002369 -0.002566 -0.003335 0.000834 -0.000783 
+0.000450 0.000750 -0.000772 0.002991 0.001156 -0.002665 
+0.000929 -0.000943 -0.003545 -0.002629 -0.000522 -0.002466 
+-0.004830 -0.002208 0.000382 -0.000901 -0.003153 0.001240 
+0.000966 -0.000090 0.001525 0.002038 -0.002392 0.001269 
+0.003863 0.001672 0.001946 0.000166 -0.000018 0.000193 
+-0.000457 -0.000821 -0.002477 -0.000715 -0.002294 -0.002433 
+-0.001208 -0.001047 0.000349 -0.000241 0.000868 -0.000112 
+0.001182 0.001087 -0.001726 0.002083 -0.000613 -0.000960 
+0.002199 -0.000806 -0.000068 0.003948 -0.002028 -0.000117 
+0.005337 -0.003370 -0.000082 0.003502 -0.000413 0.001253 
+-0.004788 0.002573 -0.004033 -0.018328 0.008137 0.002257 
+-0.027935 0.011240 0.004801 -0.033083 0.010371 0.000757 
+-3.441860 0.563953 -0.453488 -3.275510 0.612245 -0.244898 
+-3.194093 0.362869 0.341772 -3.387543 0.069204 0.993080 
+-3.765244 -0.030488 1.533537 -4.204969 0.046584 2.003106 
+-4.452107 0.249042 2.375479 -4.238372 0.569767 2.494186 
+-0.029927 0.007434 0.022482 -0.011258 -0.005775 0.008902 
+0.004210 -0.006331 -0.004442 -0.014851 -0.004819 -0.011311 
+-0.006308 -0.018013 -0.005060 0.015973 -0.003286 0.009582 
+0.030952 0.005909 0.023623 4.082970 0.886463 2.406114 
+4.287719 0.550877 2.322807 3.956229 0.010101 2.080808 
+3.163498 -0.479087 1.775665 0.018002 -0.004983 0.017843 
+0.010251 -0.006574 0.011720 0.005671 0.000364 0.003648 
+0.005967 0.012906 -0.003774 0.002705 0.010948 -0.012326 
+0.000743 0.004225 -0.000694 0.001791 -0.002098 0.003691 
+0.001011 -0.003574 0.004572 0.002866 -0.001331 0.001456 
+0.002085 -0.002130 -0.000854 0.002605 -0.003497 -0.001676 
+-0.000164 -0.006647 -0.001833 0.000920 0.000067 -0.001519 
+0.001051 -0.000856 -0.001606 0.001723 0.000770 0.001333 
+0.001008 0.000062 -0.000001 -0.002573 -0.002667 -0.000921 
+-0.004458 -0.002059 -0.000516 -0.001378 0.000772 -0.000716 
+-0.001672 0.000474 -0.003470 -0.003916 -0.000733 -0.002978 
+-0.001530 -0.001418 0.001530 -0.000084 -0.000329 0.000177 
+0.000933 0.000429 -0.001235 0.002864 0.001227 -0.002937 
+0.002438 0.002455 -0.002484 0.000592 0.002085 -0.000528 
+-0.000955 0.003718 0.002132 0.001455 0.004007 0.002519 
+0.001150 0.002734 -0.000069 0.002654 -0.003842 -0.000581 
+0.001438 -0.001536 0.003350 -0.001775 -0.002358 0.003294 
+-0.002064 -0.001930 0.002083 -0.001253 0.000968 0.001880 
+-0.002860 -0.002561 -0.001414 -0.002251 -0.000489 -0.000558 
+0.000006 0.001031 0.000288 0.001338 0.000794 0.000858 
+0.000690 -0.000423 0.000680 0.000282 0.001041 0.000580 
+-0.001183 0.000860 -0.002151 -0.000096 0.000214 -0.004191 
+0.002124 0.000597 -0.003160 0.002257 -0.000376 0.001355 
+0.000616 0.000251 0.002936 0.000219 -0.000153 0.000519 
+0.001580 -0.003173 -0.003996 0.000385 -0.006370 -0.003881 
+0.001193 -0.005900 -0.001790 -0.001010 -0.002889 -0.001639 
+-0.002174 0.004649 0.001383 -0.023507 0.009529 -0.013663 
+-0.037894 0.012220 -0.014620 -4.825807 1.135484 -1.090323 
+-5.150537 0.682796 -0.720430 -4.859649 0.530702 -0.557018 
+-4.440860 0.548387 -0.390681 -4.120482 0.412651 0.000000 
+-4.069519 0.139037 0.625668 -4.412214 -0.025445 1.419847 
+-4.947917 0.072917 2.216146 -5.263768 0.402899 2.762319 
+-5.172794 0.834559 2.900735 -4.771739 1.222826 2.603261 
+-0.036964 0.012338 0.025973 -0.020272 -0.025193 0.016006 
+-0.018689 -0.033221 0.004179 0.004880 -0.005050 0.002823 
+0.000498 -0.006927 -0.002761 0.021940 0.010332 0.017003 
+3.410256 1.389744 2.830769 4.318471 1.079618 3.089172 
+4.982097 0.552430 3.033248 5.259842 0.060367 2.860892 
+4.957237 -0.220395 2.549342 4.082192 -0.168950 1.931507 
+0.031096 0.000565 0.011626 0.020698 0.000483 0.005920 
+0.004086 -0.000289 0.001196 -0.006749 -0.000785 0.001473 
+-0.003268 -0.006436 0.000859 0.001170 -0.004312 0.005329 
+0.004844 -0.002792 0.002970 0.006125 -0.003022 -0.000403 
+0.008105 -0.002250 -0.000618 0.003828 -0.004009 -0.001640 
+-0.001417 -0.003346 -0.001057 -0.002704 -0.000234 0.001803 
+0.000069 0.002931 0.001656 0.001313 0.001850 0.000572 
+0.000099 -0.003050 -0.000166 -0.003183 -0.006876 -0.000367 
+-0.002385 -0.000161 0.000599 0.002069 -0.002351 0.004606 
+0.000910 0.000177 -0.001744 0.001956 0.005867 -0.007630 
+-0.002618 0.000509 -0.003150 0.007318 -0.000147 -0.001137 
+0.001392 -0.003393 -0.000178 -0.003846 -0.001544 -0.000256 
+-0.000169 0.003826 0.001963 -0.000910 0.005147 0.001971 
+-0.000932 0.000221 0.000813 -0.001504 -0.005780 0.003524 
+-0.003373 -0.006097 -0.000547 -0.002326 -0.004931 -0.000139 
+-0.003046 -0.003483 0.001540 -0.002717 -0.002717 0.003841 
+-0.002376 0.000302 0.002871 -0.000551 0.002283 -0.000630 
+0.002589 -0.001841 0.000165 0.000187 -0.004826 -0.001385 
+-0.000354 -0.007823 -0.000496 -0.003989 -0.001916 -0.000270 
+-0.000211 0.002708 0.002132 -0.000304 0.001675 0.002233 
+-0.000212 -0.000037 -0.000701 0.005185 -0.000489 -0.000978 
+0.006644 -0.000473 -0.000499 0.005423 -0.000150 0.003524 
+0.003350 -0.003962 0.005302 0.003673 -0.000231 0.005958 
+0.004962 -0.003717 0.001241 0.003327 -0.001467 0.001424 
+-0.003873 -0.000137 -0.001298 -0.019683 0.003199 -0.005581 
+-0.038542 0.021474 -0.014497 -6.401316 1.789474 -1.717105 
+-6.465686 1.892157 -1.480392 -5.708171 1.525292 -1.042801 
+-4.804878 1.020906 -0.735192 -3.965753 0.575342 -0.520548 
+-3.569395 0.256228 -0.345196 -3.543396 0.033962 -0.150943 
+-3.700000 -0.112000 0.232000 -3.983740 -0.065041 0.918699 
+-4.192000 0.204000 1.704000 -4.177686 0.586777 2.111570 
+-3.921569 0.897059 1.916667 -0.032922 0.009987 0.012992 
+-0.019345 0.006529 0.009781 -0.004933 -0.005402 0.000406 
+-0.009625 -0.001757 -0.000362 -0.017655 -0.002549 -0.021363 
+0.005311 0.003573 0.005117 0.022954 0.011106 0.014965 
+2.651961 1.024510 2.068627 3.484962 0.838346 1.947368 
+4.126760 0.531690 1.728873 4.185185 0.197531 1.522634 
+3.262295 -0.071038 1.207650 0.022378 -0.001274 0.004642 
+0.018465 -0.002904 0.000078 0.016003 -0.000198 -0.000336 
+0.008484 0.006756 0.000289 -0.000989 0.003670 -0.001470 
+-0.009128 -0.000651 -0.001100 -0.002161 -0.004159 0.008731 
+0.002688 -0.002274 0.004822 0.000678 -0.002844 0.000564 
+0.000600 -0.000828 -0.000314 -0.003563 -0.000295 -0.006133 
+-0.002188 -0.002555 -0.001228 -0.000028 0.000074 -0.000085 
+0.000268 -0.001170 0.001989 -0.001658 -0.001415 -0.000889 
+0.000980 -0.000611 -0.003546 -0.000124 0.001443 -0.003383 
+0.000895 -0.002113 -0.000248 -0.001429 -0.001963 -0.000832 
+0.001863 0.000480 0.000551 0.002293 0.005172 0.001553 
+0.000484 0.006561 -0.002805 -0.004282 0.004085 -0.002377 
+-0.004680 0.000412 -0.000994 -0.000716 0.000357 -0.000295 
+0.002399 0.002168 0.000928 0.001766 0.000550 0.000344 
+-0.001797 0.000898 -0.000678 -0.003197 -0.001270 -0.000531 
+-0.002475 -0.000704 0.000970 -0.002987 -0.001894 0.001647 
+-0.002441 -0.004123 0.002543 -0.000571 -0.002856 0.003750 
+-0.000100 0.000711 0.002572 -0.003234 0.002495 0.000061 
+-0.002287 -0.007016 -0.000078 -0.004301 -0.003642 -0.002574 
+-0.002629 -0.000931 -0.000027 -0.000614 0.002150 -0.000155 
+-0.002002 0.001864 0.000048 -0.002009 0.000388 -0.000005 
+0.001359 -0.000073 -0.001703 0.004918 -0.002118 -0.002723 
+0.007900 -0.000143 -0.002567 0.007273 0.002120 -0.000479 
+0.004503 0.003060 0.001801 0.003226 0.000601 0.000899 
+0.001774 -0.000203 -0.000568 0.001261 -0.000315 -0.000189 
+-0.006240 0.001564 -0.000036 -0.021649 0.019949 -0.013502 
+-5.057804 2.265896 -1.832370 -5.306513 2.340996 -1.754789 
+-5.235119 1.973214 -1.422619 -4.959302 1.447674 -1.008721 
+-4.108772 0.852632 -0.540351 -0.019077 0.009104 -0.005851 
+-0.002102 0.000408 -0.001462 0.009968 -0.003113 -0.004374 
+0.009236 -0.000102 -0.001814 0.000314 -0.000359 0.005329 
+-0.001862 -0.001500 0.008161 -0.000826 -0.001618 0.005984 
+0.001369 -0.000607 0.000302 0.010337 -0.000282 0.002354 
+0.006128 0.001422 -0.004493 -0.000694 -0.000517 0.003832 
+-0.014813 0.002966 0.000086 -0.013259 0.004776 -0.002081 
+-0.007510 0.004512 -0.002819 -0.003829 0.002791 -0.002929 
+-0.004749 0.002584 -0.002196 -0.012673 0.006263 -0.010378 
+-0.022230 0.011269 -0.037037 -0.003733 0.012850 -0.028730 
+0.011233 0.005317 -0.004159 0.007647 -0.011058 0.004799 
+0.004170 -0.010691 0.000138 -0.000156 -0.002759 -0.004720 
+-0.003563 0.000929 -0.007233 0.000737 0.000769 -0.003946 
+0.000358 -0.002542 0.001560 0.001010 -0.002789 0.000199 
+-0.000477 0.000545 -0.003151 0.004848 0.003561 -0.000391 
+0.004488 0.002651 -0.001803 0.000358 0.001321 -0.000666 
+-0.000593 -0.000072 -0.001882 0.001841 -0.001142 -0.002172 
+-0.000107 -0.001248 0.001295 0.000198 -0.003325 0.001092 
+-0.003273 0.002069 0.000973 -0.002054 0.002150 0.002395 
+0.000429 -0.000340 0.000267 0.004455 -0.001269 0.001932 
+-0.002286 -0.000698 0.001984 -0.002856 -0.003961 0.002582 
+-0.004773 -0.002808 -0.001088 -0.001596 -0.001551 0.002476 
+-0.002514 -0.000629 -0.002306 -0.005676 -0.004765 -0.002201 
+-0.007754 -0.003797 -0.001899 -0.001705 0.002783 -0.000893 
+-0.003148 0.002841 0.002336 0.001108 0.000089 0.003894 
+0.000090 0.000182 0.000274 -0.002889 -0.004193 0.000420 
+-0.003726 -0.003526 0.001945 -0.001237 -0.000748 -0.001086 
+-0.000036 0.000248 -0.000045 -0.000382 0.001660 -0.001827 
+-0.000426 -0.004538 -0.003120 0.001831 -0.003705 -0.003605 
+0.000505 -0.002030 -0.000211 -0.001154 -0.000252 -0.001379 
+0.000110 -0.000645 -0.000947 -0.002265 -0.002540 -0.003590 
+0.000194 -0.004954 -0.001837 0.000960 -0.004689 0.001130 
+-0.000205 -0.001639 0.000205 0.000196 0.000374 -0.000050 
+0.000115 -0.000890 -0.000303 -0.002469 -0.000221 0.001090 
+-0.004149 0.001708 -0.002492 -0.002874 0.001911 -0.001481 
+-0.006779 0.013282 -0.006048 -3.329193 2.236025 -1.664596 
+-4.066667 2.251852 -1.592593 -4.150443 2.156342 -1.460177 
+-3.910494 1.941358 -1.302469 -2.983333 1.458333 -1.054167 
+-0.008002 0.005587 -0.006520 0.018038 -0.005463 -0.007792 
+0.026500 0.004123 -0.003023 0.013033 0.007820 0.000980 
+0.013044 -0.005093 -0.001806 0.013654 -0.006471 -0.003544 
+0.013495 -0.000660 -0.002256 0.004972 0.006543 -0.002151 
+0.006016 0.005454 -0.005202 0.004455 0.003345 -0.007028 
+0.003675 0.004959 -0.006343 0.002432 0.004042 -0.003242 
+-0.001636 -0.000899 0.001429 -0.010333 0.004377 0.000992 
+-0.012189 0.006488 -0.001187 -0.012567 0.007365 -0.002514 
+-0.009249 0.005162 0.001796 -0.004666 0.003273 -0.003427 
+-0.004888 0.002696 -0.001191 -0.008099 0.003733 -0.004003 
+-0.009513 0.004479 -0.004784 -0.005666 0.003245 -0.001532 
+-0.002107 0.000626 0.001654 0.000276 0.000398 0.001063 
+0.001903 -0.000218 -0.002782 0.002818 -0.002410 -0.005467 
+-0.004089 -0.002982 0.002085 -0.002205 0.001648 0.000215 
+0.003850 0.006444 -0.003248 0.005948 0.012287 -0.003410 
+0.010437 0.008480 -0.004436 0.000758 0.002643 -0.000774 
+-0.002082 -0.002779 0.000290 -0.002126 -0.000866 0.003448 
+-0.005273 0.002526 -0.000210 -0.005847 0.002218 -0.005287 
+-0.007188 0.000080 -0.003577 -0.002712 -0.003418 -0.000791 
+0.000731 -0.000462 -0.001115 -0.002444 -0.000558 0.001157 
+-0.003307 -0.002567 0.005134 -0.005285 -0.003171 0.001406 
+-0.003337 0.001357 -0.000105 -0.000013 0.000667 -0.003809 
+-0.000465 -0.001493 -0.000679 0.001382 -0.000713 -0.000175 
+-0.002866 -0.000148 -0.000670 0.000039 0.006550 -0.003851 
+-0.002406 0.001857 0.002105 -0.007034 -0.002157 0.011348 
+-0.010642 -0.006343 0.008762 -0.005466 -0.002537 0.003994 
+-0.002083 -0.001095 0.000391 0.001047 -0.000301 -0.000579 
+0.001060 -0.005955 -0.001287 -0.007359 -0.005641 -0.000687 
+-0.001024 -0.001339 0.001969 0.001201 -0.000369 -0.000168 
+0.001452 0.000889 0.002267 -0.001469 0.001652 0.002206 
+-0.001246 -0.000279 -0.000617 -0.000066 -0.004248 0.001378 
+0.002377 -0.001187 0.001542 0.002572 0.001764 -0.002319 
+-0.000916 0.002214 -0.000305 -0.002481 0.000000 -0.004961 
+-0.003176 -0.001729 -0.001270 -0.001560 -0.000458 -0.005412 
+0.001628 -0.002625 -0.003263 0.007964 0.005314 0.006304 
+-0.004976 0.008254 -0.001304 -2.804545 1.522727 -1.000000 
+-3.133829 1.765799 -1.133829 -2.813008 1.813008 -1.235772 
+-0.018914 0.012917 -0.009654 0.002374 -0.001585 0.001690 
+0.018526 -0.004209 0.016075 0.012090 -0.007671 0.007055 
+0.010927 0.001407 0.000348 0.010647 0.000896 -0.000138 
+0.009240 -0.003136 -0.001086 0.004339 -0.001565 -0.001872 
+-0.001321 0.000787 -0.002021 -0.002437 0.001315 -0.004704 
+0.001810 0.004585 -0.007696 0.003186 0.006493 -0.006873 
+-0.000913 0.004385 -0.000826 -0.003739 0.003348 0.001418 
+-0.003853 0.002804 0.002805 -0.002131 0.001230 0.002123 
+-0.002602 0.000305 0.004526 -0.000884 -0.006188 0.008841 
+-0.002030 -0.000711 0.007516 -0.001571 -0.000323 0.002422 
+0.001256 0.000708 -0.001065 0.001916 0.001386 -0.001328 
+-0.001197 0.000142 0.001265 -0.002324 0.001741 0.003620 
+-0.003812 -0.002643 0.002323 0.004559 -0.000536 0.001498 
+0.003977 0.003907 -0.002534 -0.001392 -0.001171 -0.000748 
+-0.002070 0.001571 0.003920 -0.005906 -0.001455 0.004608 
+0.000512 0.006921 -0.002250 0.007847 0.017505 -0.007072 
+0.012154 0.025180 -0.014086 0.016615 0.016123 -0.005442 
+-0.000900 0.003813 -0.003657 -0.001851 -0.003346 0.001459 
+-0.002448 -0.003051 0.000873 -0.000972 -0.001919 -0.002502 
+-0.000377 -0.000969 -0.003393 0.000394 0.000157 -0.001339 
+0.000363 -0.002539 0.000672 -0.005179 -0.005881 0.000896 
+-0.004857 -0.007822 0.002640 -0.002500 -0.007457 0.000746 
+0.000791 -0.004044 -0.001319 -0.000193 -0.000289 -0.000501 
+0.000397 0.000836 -0.000936 -0.000164 0.002911 -0.001164 
+-0.001841 0.001275 -0.001045 -0.004103 -0.002748 -0.000008 
+-0.005853 -0.002634 0.000589 -0.006372 0.000507 0.003451 
+-0.006621 -0.001202 0.001781 -0.001843 -0.002733 -0.000828 
+0.004191 -0.002328 -0.004110 0.005517 0.000631 -0.003374 
+0.000646 0.003159 -0.000660 -0.005820 0.002390 -0.000877 
+0.002628 0.000825 0.002096 0.003747 0.001589 0.002453 
+0.003580 0.004198 0.001975 0.000758 0.006946 -0.001534 
+0.000692 0.001692 -0.001154 -0.000170 -0.000538 0.000490 
+-0.002308 -0.000035 -0.000538 -0.002313 0.002886 -0.002024 
+-0.003184 0.002851 -0.002471 -0.002726 -0.000693 -0.004944 
+-0.003209 0.001350 -0.004332 0.001077 -0.003083 -0.003986 
+0.006690 -0.007167 0.001438 0.007697 0.000813 0.007269 
+-0.004476 0.012251 -0.001175 -0.012651 0.015537 -0.008877 
+-0.015704 0.014665 -0.009561 -0.012485 0.010631 -0.006968 
+0.002826 -0.001751 -0.000959 0.009476 -0.009110 -0.003114 
+0.005975 -0.003671 -0.005388 0.004608 0.002685 -0.002161 
+0.001767 -0.001791 -0.000959 0.002943 -0.003098 -0.002278 
+0.000006 0.000325 -0.004788 -0.004099 -0.000977 -0.004498 
+-0.001750 -0.003061 0.001189 -0.005328 -0.001160 -0.001823 
+-0.005630 -0.000889 -0.000357 -0.003546 -0.004568 -0.001869 
+-0.001476 -0.004513 -0.002009 0.000426 -0.005386 -0.000518 
+0.002266 -0.004387 0.001500 0.008966 0.000000 -0.006207 
+0.001575 -0.002092 -0.001429 0.001163 -0.001600 0.000877 
+0.001221 -0.001216 -0.000010 0.003874 0.001467 -0.001751 
+0.006145 0.002710 -0.000622 0.002312 0.003806 0.003333 
+0.003448 0.001896 0.004526 -0.002588 0.000625 0.003430 
+0.000721 -0.003533 0.002289 -0.000612 0.000184 -0.001699 
+-0.002955 -0.001189 -0.004178 -0.005138 -0.006275 -0.000888 
+-0.006808 -0.009814 0.004199 -0.000095 0.001751 0.001176 
+0.006897 0.015371 -0.009437 0.012987 0.024315 -0.015309 
+0.011426 0.029392 -0.017095 0.005022 0.023116 -0.019843 
+-0.010730 0.005355 -0.012868 -0.003292 -0.005003 -0.004737 
+-0.000401 -0.001818 -0.005439 -0.002284 -0.003102 -0.003755 
+-0.002972 -0.003095 -0.001415 -0.002390 -0.000293 0.001610 
+-0.001145 0.002819 -0.001253 -0.000235 -0.000131 -0.002077 
+-0.003382 -0.003632 -0.001987 -0.002517 -0.005982 -0.003718 
+-0.000231 -0.003266 -0.003651 -0.002336 -0.001168 -0.002336 
+-0.001192 -0.003178 0.000000 -0.006679 -0.001236 -0.003993 
+-0.007998 -0.001919 0.002954 -0.001818 -0.000374 0.002611 
+-0.002354 0.000010 0.000646 -0.003171 -0.000522 0.001582 
+-0.001831 -0.000702 0.001098 -0.001817 0.000769 0.000510 
+-0.004284 0.001279 0.005347 -0.007861 -0.000031 0.007145 
+-0.007502 0.001473 0.000500 -0.000045 0.003554 0.000669 
+-0.000678 -0.000807 -0.006577 -0.000039 0.002289 0.000255 
+0.002667 0.001435 -0.001172 0.002155 -0.001771 0.000128 
+0.001873 -0.001314 -0.000319 0.000786 0.000338 0.000064 
+-0.000878 -0.000775 -0.001269 0.001274 -0.000793 -0.000100 
+0.001615 -0.001254 -0.000279 -0.000358 -0.000673 0.000196 
+-0.000224 -0.000455 -0.004367 0.002703 -0.007263 -0.003982 
+0.004302 -0.010273 0.001491 0.009091 0.002823 0.005780 
+0.003212 0.011873 -0.002270 -0.006778 0.011946 -0.007031 
+-0.009733 0.008364 -0.002786 -0.002305 -0.009012 -0.007673 
+0.004328 -0.005343 0.005084 0.003191 -0.001225 -0.002619 
+0.001708 0.006046 -0.002801 0.000549 0.004051 0.001031 
+0.001022 -0.000969 0.001992 -0.000100 -0.000018 -0.000643 
+0.004848 0.005136 -0.003448 0.002132 0.001548 -0.005511 
+-0.000636 0.000280 -0.000922 -0.003139 -0.000226 0.002942 
+-0.001213 0.000748 0.003076 -0.000332 0.001281 0.000116 
+0.000277 0.001420 0.000408 0.002791 -0.001000 0.001615 
+0.000195 -0.003553 0.001653 -0.000946 -0.001949 0.002009 
+-0.000543 0.000567 -0.000239 -0.000975 0.000073 -0.002414 
+0.000426 -0.001245 -0.001751 -0.000298 -0.002602 0.001280 
+0.001029 -0.000389 0.000456 0.003502 0.003566 -0.006342 
+0.002296 0.004858 -0.010247 -0.001992 0.001992 -0.007656 
+-0.002947 0.000919 -0.002184 -0.001681 -0.001106 -0.000387 
+0.000672 0.000859 -0.001561 -0.000346 -0.002130 -0.000564 
+-0.006507 -0.008183 0.003403 -0.000429 -0.001044 0.001507 
+0.005207 0.015782 -0.008537 1.551219 2.604878 -1.604878 
+1.764151 3.353774 -2.108490 1.453488 3.819767 -2.424419 
+0.001460 0.019492 -0.018964 -0.015893 -0.003664 0.006198 
+-0.000828 -0.003645 0.000537 0.000466 -0.003304 -0.003145 
+0.001378 0.000564 -0.002567 -0.001742 -0.002824 0.000809 
+-0.002845 0.000863 0.001687 -0.001907 0.000817 -0.000979 
+0.000167 -0.001539 -0.001854 -0.000199 -0.003602 -0.001946 
+-0.000300 -0.001967 0.000509 0.000258 0.000081 -0.000404 
+0.000042 -0.003022 0.000781 -0.004145 -0.005630 0.003897 
+-0.000507 -0.007373 0.005593 -0.002583 -0.001878 0.001929 
+-0.003818 0.000480 0.001828 -0.001864 -0.000092 0.003884 
+-0.001614 0.000040 0.002270 0.002659 0.002334 0.002922 
+-0.002424 0.003753 0.004442 -0.007411 -0.002925 0.007790 
+-0.008607 -0.001815 0.003253 -0.000601 -0.005456 0.003137 
+-0.001626 0.000055 0.000447 -0.002249 0.000665 0.002056 
+-0.001929 0.000358 0.002660 -0.002016 -0.000806 0.001692 
+-0.000699 -0.000233 0.000526 0.002350 -0.002233 -0.000531 
+0.003952 -0.004676 -0.000945 0.007090 0.000098 -0.003300 
+0.001148 0.006492 -0.000443 -0.001931 0.001805 0.000433 
+-0.001053 -0.002250 -0.000790 -0.003947 -0.011311 0.006411 
+0.004626 -0.003391 0.001236 0.004331 0.003316 0.000978 
+0.002667 0.005741 -0.002204 -0.001243 0.000368 0.000168 
+-0.004082 -0.010583 0.001531 0.001463 -0.005348 0.005737 
+0.001083 -0.000524 -0.001226 0.000732 0.002855 -0.004428 
+-0.002073 0.001683 -0.002980 0.004633 0.003679 -0.005706 
+0.002931 0.001950 -0.008644 0.001930 0.005417 -0.004325 
+-0.000464 0.003650 -0.003620 0.000235 0.001220 -0.002502 
+0.004246 0.000123 -0.000603 0.003140 0.000940 -0.002042 
+-0.000658 -0.002276 0.001720 -0.003628 -0.005038 0.004987 
+-0.000777 -0.005493 0.005253 0.001780 -0.001229 0.001799 
+0.001612 -0.000459 0.000553 0.000276 -0.005165 0.002223 
+-0.000706 -0.005945 0.005644 -0.001673 -0.004579 0.005950 
+-0.002971 -0.002053 0.003541 -0.004010 0.002261 -0.000552 
+-0.002898 0.003392 -0.004606 -0.001010 0.003471 -0.005280 
+-0.001662 0.003324 -0.003824 0.000403 0.001413 -0.002891 
+-0.001802 -0.003522 -0.002950 0.002550 -0.005902 -0.002692 
+-0.002047 -0.005642 -0.002101 -0.002683 -0.006338 0.001110 
+-0.005209 -0.010590 0.006969 -0.004522 -0.005834 0.007849 
+0.004182 0.010192 -0.002852 0.009887 0.024897 -0.012747 
+1.072072 3.581081 -1.882883 1.114035 4.118421 -2.197368 
+0.819209 3.711864 -2.016949 -0.003241 0.007995 -0.009742 
+-0.000925 -0.003224 0.003285 -0.000332 -0.003354 -0.004919 
+0.001534 -0.000738 -0.005171 -0.000165 -0.000619 -0.001869 
+0.003242 0.000788 -0.001390 0.001775 0.002588 0.000098 
+0.000493 -0.000398 0.000099 -0.001060 -0.002597 0.002509 
+-0.000521 -0.001076 0.001678 0.000156 0.000469 -0.001953 
+0.003191 -0.002231 -0.002838 0.003533 -0.002560 -0.000731 
+-0.000863 -0.000529 0.000028 -0.002824 -0.001967 0.001204 
+-0.000810 -0.001562 0.001767 0.001014 -0.002658 -0.001960 
+-0.000385 0.001173 -0.001319 0.002631 0.000038 -0.002598 
+-0.002678 -0.001379 0.000144 -0.000955 -0.006768 -0.000122 
+0.000252 -0.007294 0.003944 0.000820 -0.001725 -0.000769 
+0.002275 -0.000169 0.000064 -0.000915 0.000950 -0.002657 
+-0.002707 0.000447 -0.000462 -0.002715 -0.000265 -0.000051 
+-0.001031 0.000224 0.000422 -0.000532 0.000255 -0.000044 
+0.000589 0.001593 0.001651 0.003088 -0.000515 0.002230 
+0.002188 -0.000687 -0.000344 0.000063 -0.001891 0.000333 
+-0.002271 0.000053 -0.000585 0.000146 0.002401 -0.002174 
+-0.000110 0.000518 0.000362 0.002868 0.005431 0.000147 
+0.001981 0.004814 -0.000596 -0.000813 0.000944 -0.004722 
+0.001056 -0.000841 0.000366 0.001751 -0.002030 0.001293 
+0.000005 -0.002815 0.003164 -0.002598 -0.001257 0.004190 
+-0.000503 -0.007892 0.003356 0.002023 -0.004946 0.000788 
+0.003458 -0.001158 -0.001264 0.002374 0.000523 -0.003179 
+-0.000046 0.001219 -0.001417 -0.000579 0.002049 -0.000145 
+-0.000207 0.001828 0.002966 -0.000163 -0.003409 -0.000348 
+-0.002853 -0.003332 -0.001425 0.000912 0.001343 -0.002286 
+0.000614 0.007689 -0.003526 0.001140 0.009054 -0.002535 
+-0.000621 0.001426 -0.000626 -0.002826 -0.004350 0.003185 
+-0.001699 -0.003201 0.002196 0.002034 0.000948 -0.001728 
+0.003278 0.002669 -0.003305 0.000237 0.000863 -0.000948 
+-0.005775 -0.001746 0.002775 -0.003672 -0.001668 0.004841 
+-0.001406 0.003259 -0.000717 0.001021 0.004282 -0.007032 
+-0.000411 0.003506 -0.004826 -0.005422 -0.001048 -0.000922 
+-0.003795 0.002796 -0.000300 -0.000489 0.003003 0.002097 
+0.000244 0.001065 -0.000983 0.000959 0.000034 0.000123 
+-0.001743 0.000693 -0.003308 0.002317 0.013233 -0.008153 
+0.785366 3.429268 -1.585366 1.044355 4.475806 -2.161290 
+0.759657 4.145923 -2.025751 0.003301 0.021704 -0.014716 
+-0.002680 0.005588 -0.005212 0.000000 -0.001064 -0.004255 
+-0.000583 0.001124 -0.002072 0.000039 0.000663 0.002527 
+0.001016 -0.000469 0.002188 -0.000481 -0.000880 -0.000448 
+0.001125 0.000660 -0.004348 -0.001426 -0.002374 -0.003420 
+-0.001273 -0.003710 -0.002501 0.000592 -0.003099 -0.000917 
+0.000676 -0.001402 -0.000614 -0.002609 -0.000726 -0.001344 
+-0.003168 -0.004980 0.000235 0.001347 -0.002953 0.001900 
+0.002918 -0.000349 0.003966 0.002929 0.001812 0.003697 
+-0.000296 -0.000430 0.000984 -0.002342 -0.003690 -0.000699 
+-0.001201 -0.003733 -0.001786 0.001391 -0.002522 -0.000838 
+0.001200 -0.000892 0.000222 -0.000117 0.000117 0.001641 
+-0.002775 -0.000214 -0.001434 -0.002388 -0.001837 -0.001872 
+-0.001012 -0.001388 -0.001329 0.000031 0.000061 0.000112 
+0.000596 0.000207 0.000431 0.001242 0.003174 0.000644 
+0.000351 0.002246 -0.003425 -0.001512 -0.000629 -0.002036 
+-0.002932 -0.002842 -0.001849 -0.003135 0.000250 0.002136 
+-0.001611 -0.001422 0.000394 0.001123 0.001026 -0.002020 
+-0.000091 0.000638 0.000077 -0.001539 -0.002517 -0.000973 
+0.000108 -0.000487 -0.002655 -0.001780 -0.004178 0.002920 
+-0.003047 -0.006625 0.001202 -0.000951 -0.004856 0.008376 
+-0.003826 -0.007085 0.002267 0.001292 0.000592 -0.002404 
+0.004090 0.003711 -0.006395 -0.000050 0.000547 0.000249 
+0.000814 -0.000865 -0.000254 -0.001660 -0.004666 0.004926 
+-0.004711 -0.003238 0.000360 -0.001585 0.005154 0.001813 
+0.000778 0.003097 0.003252 0.002933 0.002295 -0.003028 
+0.002142 0.000540 -0.001454 0.003471 -0.000559 -0.002471 
+0.001763 0.008791 -0.003422 0.008002 0.007612 -0.002619 
+0.001013 -0.000250 0.002464 -0.008285 -0.003697 0.010334 
+-0.007218 -0.007175 0.009395 -0.000437 -0.003023 0.001249 
+0.004847 0.001430 -0.005838 0.001175 0.002792 -0.008592 
+-0.000884 0.003384 -0.003202 0.000941 -0.000439 -0.001339 
+-0.000271 -0.002404 -0.001012 -0.000962 -0.000534 -0.002279 
+-0.002232 -0.001710 -0.002305 0.000236 0.000236 -0.006457 
+-0.001735 0.002319 -0.006556 -0.000353 0.004241 -0.006058 
+0.004476 0.005986 -0.002993 0.002092 0.003447 -0.000286 
+0.002911 -0.002601 -0.000944 0.004271 0.010417 -0.001933 
+0.941860 3.633721 -1.494186 1.082969 4.646288 -2.174673 
+0.962656 4.178423 -2.132780 0.601990 2.587065 -1.562189 
+-0.000557 0.006804 -0.006221 -0.000433 -0.002779 -0.002712 
+0.001340 -0.000117 -0.001338 -0.001121 -0.000135 -0.000242 
+-0.002736 -0.005473 0.000547 -0.002606 -0.007307 0.001101 
+-0.002023 -0.005133 0.003150 0.000621 -0.002067 -0.000980 
+-0.003391 -0.005072 -0.000708 -0.000987 -0.003680 0.001511 
+0.002035 0.000755 0.002330 0.003140 0.000579 -0.000579 
+-0.000875 -0.001650 0.000306 -0.004308 -0.003239 0.004294 
+-0.004313 -0.000246 0.005854 -0.000926 -0.000507 0.006062 
+-0.000849 0.001112 0.002686 -0.000115 -0.000654 -0.000429 
+-0.000411 -0.003386 -0.002163 -0.000131 -0.004341 -0.002725 
+-0.000077 -0.003834 -0.002556 0.000247 -0.003465 -0.001731 
+-0.000109 -0.000017 -0.000118 0.000154 0.000196 0.000542 
+0.004514 -0.000223 -0.004828 0.006832 0.003543 0.000162 
+0.001394 0.004728 0.000305 0.001201 0.003910 -0.002603 
+0.002918 0.001991 -0.002952 0.002875 0.002926 -0.000051 
+0.006601 -0.000798 0.000715 0.007823 0.001722 0.001186 
+0.004305 0.003943 0.001594 0.000066 0.002060 0.000997 
+-0.003518 -0.000105 -0.002087 -0.000583 -0.000943 -0.001974 
+0.002402 0.000863 -0.000583 0.002139 0.003225 0.001124 
+-0.000780 0.002708 0.001402 -0.000304 -0.000034 0.000101 
+0.001713 0.000670 -0.002477 0.003453 0.000460 -0.002348 
+0.002214 -0.000451 0.000069 0.000732 -0.002018 -0.002758 
+0.001872 -0.002177 -0.001032 0.000749 -0.003716 -0.000379 
+-0.000232 -0.002578 0.001347 -0.000980 -0.001376 0.001030 
+0.001163 0.000173 -0.000251 0.002419 0.002151 0.000940 
+0.003324 -0.001523 -0.002563 0.002155 -0.000108 0.002281 
+0.000163 -0.001615 0.001307 0.001469 0.000248 -0.000089 
+0.002453 0.002336 -0.002416 0.004783 0.005360 -0.004371 
+0.008255 0.004763 -0.005577 0.008362 0.001410 -0.005867 
+0.004676 -0.000900 -0.005009 0.001401 0.002535 -0.000776 
+0.000509 0.002190 -0.003540 0.001332 0.000175 -0.002901 
+0.000827 -0.000917 -0.002390 0.000914 -0.001294 -0.002056 
+0.000621 0.000597 -0.000667 -0.000002 0.004692 -0.000781 
+0.001291 0.004048 -0.002840 0.000936 0.003106 -0.004720 
+0.003652 0.002660 -0.004894 -0.001771 0.002285 -0.002150 
+0.001305 -0.001628 -0.001657 0.001114 0.000264 0.000312 
+0.003557 0.021823 -0.007039 0.437811 3.378109 -1.497512 
+0.074236 3.240175 -1.327511 0.002946 0.023551 -0.008217 
+0.001370 0.010147 -0.007284 0.000466 -0.002835 -0.002088 
+-0.000120 -0.006743 0.006954 -0.006787 -0.009279 0.004082 
+-0.001503 -0.005636 0.000794 -0.002094 -0.001665 -0.000552 
+0.003259 -0.000171 0.000188 0.004759 0.000642 -0.001945 
+0.004851 0.000293 -0.001052 0.004490 0.000423 -0.001932 
+0.003572 0.005566 -0.002825 0.002324 0.003745 0.001051 
+0.002118 -0.001705 0.000546 -0.003709 -0.003526 0.001282 
+-0.006335 -0.001042 0.002770 -0.003044 0.001936 0.003595 
+0.000790 0.001181 0.003827 0.003387 0.001048 -0.001097 
+0.003279 0.002535 0.002482 0.000988 0.000409 0.000595 
+-0.001762 -0.001804 0.000014 -0.002150 -0.000510 -0.001286 
+-0.000966 0.001059 -0.000535 -0.000960 -0.001442 0.000948 
+0.000789 -0.001593 -0.001590 0.002718 -0.001273 0.001450 
+0.002450 0.002664 -0.001352 0.001483 0.001135 -0.002637 
+-0.002645 -0.000388 -0.002575 -0.004122 0.000589 -0.000476 
+-0.004523 0.000047 -0.000322 -0.003444 0.000952 0.000808 
+-0.002500 0.002755 0.001873 -0.001154 0.001827 0.002044 
+-0.000971 -0.001685 0.000275 -0.004657 -0.004183 0.000711 
+-0.005780 -0.000863 -0.002164 -0.003163 0.000578 -0.002237 
+-0.001521 0.002946 -0.000830 0.002016 0.004341 -0.002791 
+0.002498 0.003701 -0.002909 0.003584 0.001845 0.000679 
+0.002114 -0.002274 0.001721 0.002051 -0.005199 0.002022 
+0.000734 -0.006655 0.002211 -0.002870 -0.004911 0.003614 
+-0.002561 -0.001423 0.002276 -0.000332 0.002005 -0.000980 
+0.001777 0.003414 -0.002375 0.001655 0.003443 -0.003234 
+0.003646 0.002456 -0.004818 0.005143 0.002689 -0.002571 
+0.002655 0.001549 0.000266 -0.000820 0.000184 0.000053 
+-0.001086 -0.001110 -0.000053 0.003065 0.001565 -0.001263 
+0.005405 0.002886 -0.004920 0.003159 0.001127 -0.003181 
+0.000058 -0.001680 0.000278 -0.002132 -0.000868 0.001737 
+-0.001897 0.001814 0.000627 -0.001515 0.001338 0.000328 
+-0.000792 0.000042 0.000604 -0.002410 -0.002001 0.001599 
+-0.000787 0.000627 -0.000488 0.002983 0.003537 -0.005526 
+-0.000739 -0.000234 -0.005602 -0.000891 0.002103 0.000272 
+0.000722 0.006231 0.001096 0.000000 0.006250 -0.006691 
+0.000251 -0.003113 -0.003124 0.005338 -0.005217 0.001933 
+0.006948 0.016689 -0.001338 0.007788 0.031039 -0.010103 
+0.490099 3.138614 -1.089109 0.000547 0.022074 -0.013182 
+-0.000736 0.011167 -0.009158 0.001246 -0.003497 -0.005219 
+0.000620 -0.009558 0.002301 0.001238 -0.003746 0.006346 
+-0.007048 -0.000886 0.001751 -0.001358 -0.007040 0.002445 
+-0.003607 -0.001659 0.000685 0.000337 -0.002187 -0.002121 
+0.001487 0.000949 -0.000589 0.001099 0.000741 0.002670 
+-0.000791 0.004755 0.002388 0.004202 0.002083 0.000557 
+-0.000726 -0.000952 0.001190 -0.002969 -0.005774 -0.000047 
+0.001809 -0.001848 0.001426 0.000482 -0.001157 0.004778 
+-0.000669 -0.005792 0.001782 0.001663 -0.001968 0.000942 
+0.001374 -0.002620 -0.000043 -0.001591 -0.005470 0.000063 
+-0.000388 -0.001940 0.004113 -0.000734 0.000315 -0.000785 
+0.003175 -0.002048 -0.002455 0.008205 -0.000643 -0.003037 
+0.005785 0.001899 -0.004010 0.000762 0.000616 -0.000513 
+-0.002724 0.001699 0.000256 0.002527 0.002749 0.000480 
+0.004130 0.002635 -0.002398 0.002622 -0.001073 -0.002821 
+0.003373 -0.001507 -0.000318 0.004199 0.000533 0.000222 
+0.005448 0.003651 -0.001198 -0.000992 0.001462 -0.002136 
+-0.002886 0.001302 -0.001414 -0.003560 0.001120 0.003560 
+-0.008770 -0.000351 0.002152 -0.005837 -0.001047 0.000055 
+-0.002016 -0.004186 0.003643 0.000037 -0.003566 0.002831 
+0.000382 -0.003485 -0.000208 0.001214 -0.001176 -0.000374 
+-0.000765 0.000911 -0.000692 -0.002891 -0.001607 0.000484 
+-0.003583 -0.003733 0.001960 -0.002139 -0.001304 0.001095 
+0.000522 0.000565 -0.002955 -0.001358 -0.000149 -0.003090 
+-0.002546 0.000833 -0.000479 -0.003265 -0.000425 0.002116 
+-0.002260 -0.003773 0.002042 -0.003778 -0.002828 0.000918 
+-0.001122 -0.002040 0.002077 -0.000639 -0.000332 0.000345 
+0.003086 0.002986 -0.001223 0.005444 0.007100 -0.003539 
+0.005736 0.008592 -0.004733 0.004110 0.004346 -0.002322 
+0.000615 -0.001814 -0.000855 -0.000400 -0.002958 -0.001017 
+0.001371 -0.000501 0.000282 0.002122 -0.000151 0.000612 
+0.000681 0.000334 0.000102 -0.000952 -0.000089 -0.001220 
+-0.000615 0.001445 -0.002551 0.000068 0.003417 -0.001380 
+-0.000141 0.001904 0.000775 -0.000870 0.000762 0.002219 
+-0.002003 0.003178 0.000241 0.002141 0.003558 -0.003496 
+0.000679 0.000528 -0.005585 0.000313 -0.006211 -0.006524 
+0.000805 -0.002889 0.000696 0.000404 0.015479 -0.003998 
+0.002545 0.024567 -0.007804 0.003042 0.022805 -0.010061 
+0.002542 0.010760 -0.007968 0.000420 -0.006388 -0.003191 
+-0.007518 -0.006477 0.004395 -0.000784 -0.000076 0.004896 
+0.000073 -0.000040 0.000531 0.002975 -0.000496 -0.001053 
+0.005060 0.000983 0.000470 0.004489 0.005571 0.002324 
+-0.000476 0.000476 -0.000238 0.002587 0.000759 -0.000908 
+0.000118 -0.001181 -0.000512 -0.000460 0.000187 -0.000076 
+-0.001286 -0.001636 0.001172 0.001381 -0.002772 0.001315 
+0.003440 -0.004457 0.001600 0.005361 -0.001340 0.001304 
+0.001943 -0.001179 0.000583 0.000560 -0.000760 -0.001080 
+0.000079 -0.001672 -0.001114 0.000611 -0.000700 -0.001009 
+0.000327 -0.000031 0.000442 -0.000342 0.000256 0.000256 
+0.000732 0.004425 -0.001031 0.004842 0.005070 -0.003323 
+0.007861 0.003884 -0.003169 0.005982 0.002142 -0.002881 
+0.001060 0.000182 -0.001717 -0.002016 -0.000402 0.000711 
+-0.001835 -0.000734 0.002936 0.000787 0.000233 0.004467 
+0.003726 0.000359 0.001501 0.005145 0.000681 -0.003291 
+0.002553 0.001318 -0.005735 0.000241 0.000644 -0.004012 
+-0.001160 0.000662 -0.002161 -0.000645 -0.000255 -0.001179 
+0.002433 0.003173 -0.001973 0.003615 0.000846 -0.004231 
+0.000658 0.004504 -0.003660 -0.000116 0.001729 0.000174 
+0.000060 -0.000151 0.000151 -0.000621 -0.000385 -0.001164 
+-0.001464 0.000857 -0.003179 -0.002631 0.001357 -0.003522 
+-0.001987 0.000019 -0.001998 -0.000665 0.001229 0.001128 
+-0.001136 -0.002321 -0.000420 -0.003784 -0.001086 0.001139 
+-0.002201 0.002015 -0.000485 -0.001074 0.002982 -0.003220 
+0.001347 0.004392 -0.003718 -0.001989 0.002499 -0.003264 
+-0.004000 0.001923 -0.001923 -0.004852 0.000943 -0.001123 
+-0.004053 0.000754 0.001979 -0.001286 0.001706 0.000057 
+-0.002687 0.000677 -0.002006 -0.001397 -0.000907 -0.000444 
+0.001023 0.000058 -0.000591 0.003686 0.000985 -0.001005 
+0.004708 0.002900 0.000119 0.003100 0.003820 -0.000871 
+0.001940 0.002341 -0.002363 0.001014 0.001577 0.000370 
+0.000429 0.002418 -0.000414 0.000536 0.001271 -0.000157 
+0.000937 -0.000039 0.000039 -0.000439 -0.000007 -0.001433 
+-0.001447 0.002934 -0.000113 0.006138 0.004427 -0.001893 
+0.000661 -0.000237 -0.007083 -0.003758 -0.007424 -0.001576 
+0.000604 -0.003740 0.001173 0.004575 0.010318 -0.000684 
+0.005783 0.017656 -0.004180 0.003195 0.014260 -0.006205 
+0.000589 0.001921 -0.001570 0.002879 -0.008154 0.005033 
+-0.006300 -0.010666 0.006466 -0.005752 0.000310 0.006097 
+-0.004032 0.001434 0.003762 -0.006642 -0.007209 0.004806 
+-0.000277 -0.007707 0.000641 0.000639 -0.001308 0.000959 
+0.003307 0.002447 -0.002156 -0.001964 0.001424 -0.000299 
+-0.002428 0.000966 -0.001255 -0.002860 0.000262 0.000780 
+-0.000037 -0.000570 0.002258 0.000251 -0.004322 0.003763 
+-0.008203 -0.001641 0.006637 -0.000360 -0.000075 0.004849 
+-0.000086 0.001500 -0.001693 0.004547 0.002376 -0.004342 
+-0.000353 0.000753 -0.001676 0.000993 0.000331 0.002383 
+0.001818 0.000177 0.001401 -0.000330 0.000523 -0.000202 
+-0.002710 0.001433 -0.003458 0.001998 0.001505 -0.004953 
+0.000101 0.000736 -0.003635 0.001614 -0.003327 -0.001515 
+0.000196 -0.000099 0.002606 -0.001148 -0.000032 0.003065 
+-0.001444 -0.000482 0.001096 0.000460 0.001572 -0.000340 
+-0.003143 -0.000807 -0.001870 -0.001235 0.002804 0.001374 
+-0.001321 0.001333 0.001530 -0.000922 -0.001332 0.001081 
+-0.000510 -0.000526 0.000165 0.002098 0.001430 0.000298 
+0.003286 0.005710 0.000143 0.004859 0.007740 -0.003332 
+0.000928 0.001307 -0.007631 0.007183 0.002052 -0.006615 
+0.005696 0.002964 -0.004039 0.003360 0.002990 -0.000154 
+0.001812 0.002244 0.000374 0.001617 0.001168 0.000303 
+-0.000977 0.000966 -0.001171 0.002905 0.000143 -0.002929 
+0.001133 0.000693 -0.001092 -0.000202 0.001059 -0.001248 
+-0.000197 0.002133 -0.002153 -0.000155 0.002289 -0.001099 
+-0.000414 0.000181 -0.000076 -0.003721 -0.002713 0.000000 
+-0.007432 -0.002598 0.004456 -0.007283 -0.002497 0.004905 
+-0.002181 0.000167 0.001511 -0.001271 0.001958 -0.001167 
+0.001799 0.006522 0.002217 0.003721 0.006498 0.001394 
+0.003058 0.005160 -0.002241 0.001133 0.003543 -0.002653 
+-0.001435 0.002296 -0.000742 -0.004160 -0.000816 0.000764 
+-0.004227 -0.002942 0.001747 -0.001477 -0.000419 0.000037 
+0.001863 -0.000384 -0.003400 0.001119 0.000448 -0.003358 
+-0.000748 -0.001184 -0.002493 -0.000393 -0.001542 -0.001059 
+0.001558 0.002670 -0.000800 0.000151 0.000184 -0.003140 
+0.000144 -0.004704 -0.003297 -0.002253 -0.013606 -0.002420 
+0.002384 -0.007352 -0.004372 0.001111 0.004299 0.000123 
+0.005131 0.011844 -0.001407 0.006604 0.007472 -0.002425 
+0.005937 -0.004590 0.000536 0.000554 -0.006726 0.008610 
+-0.005322 -0.008243 0.006944 -0.003549 -0.003162 0.005915 
+-0.001419 0.000013 0.001458 0.002550 -0.003167 -0.000266 
+0.000751 -0.003190 0.000259 0.000403 -0.002710 0.002335 
+-0.001266 -0.001793 0.006172 0.001351 0.000070 0.000763 
+-0.000476 -0.003478 0.001801 -0.000897 0.001410 -0.000949 
+0.000517 0.003539 0.002314 -0.002575 0.000696 0.004385 
+-0.005136 -0.000319 0.005628 -0.003747 -0.001783 0.003477 
+-0.000283 0.000857 0.000380 0.001759 0.001168 -0.000887 
+-0.000729 -0.000836 0.000311 -0.000895 -0.003535 -0.001476 
+-0.001468 -0.005268 -0.002408 -0.003312 -0.006287 -0.001745 
+-0.002279 -0.000375 -0.000863 -0.007293 -0.003636 0.001581 
+-0.007872 -0.009984 -0.004677 -0.011327 -0.012686 -0.002756 
+-0.010166 -0.007086 -0.002200 0.000462 0.002896 -0.002658 
+-0.002437 0.003329 -0.002674 -0.001312 -0.000374 0.001712 
+-0.004321 -0.003395 0.002099 -0.005847 0.001274 -0.001927 
+-0.001585 0.004412 -0.001848 0.000341 0.004728 -0.000922 
+0.000204 0.003711 -0.001212 0.000828 0.002675 -0.001310 
+0.003451 0.002420 -0.001055 0.004833 0.001700 -0.000854 
+0.001666 -0.000539 0.000211 -0.003369 -0.002181 0.001314 
+-0.004135 -0.000749 0.000722 -0.001131 -0.000291 -0.000313 
+0.001794 -0.001400 0.001788 -0.001806 0.000119 0.002762 
+-0.000268 -0.001405 -0.001347 -0.000994 -0.000435 -0.003354 
+-0.007509 -0.000643 -0.003343 -0.006102 0.000504 0.002507 
+-0.002028 0.001342 0.000902 -0.001644 -0.001482 -0.001547 
+0.002826 -0.001684 -0.003578 0.002202 -0.002127 -0.005240 
+0.000758 0.000455 -0.006136 -0.003067 0.000626 -0.001484 
+-0.001450 -0.001017 -0.000788 -0.000438 -0.001054 0.000196 
+-0.000053 0.000686 -0.000103 -0.003137 0.002334 -0.001353 
+-0.000837 0.000674 -0.000711 -0.001736 -0.005605 0.012350 
+-0.002732 -0.013681 0.008837 -0.001172 -0.001901 0.005313 
+-0.002462 -0.000821 -0.000403 0.001985 -0.001410 0.004029 
+0.000119 -0.000059 0.003926 -0.003073 0.001525 0.001532 
+-0.002059 0.001352 0.001580 -0.000100 -0.000016 0.000206 
+-0.000862 -0.000776 -0.000553 0.000318 -0.002770 -0.000954 
+-0.000896 0.002127 -0.000567 -0.003976 0.005376 0.000013 
+-0.001292 -0.003229 0.000332 0.000529 -0.006522 0.001604 
+0.001807 0.000788 0.000109 0.003838 0.012028 -0.003704 
+0.003754 0.010243 -0.002381 0.002849 -0.002027 0.001125 
+0.002697 -0.009770 0.003002 0.003173 -0.011575 0.003017 
+0.007934 -0.014331 0.001105 0.009856 -0.024037 -0.006034 
+0.015129 -0.011677 -0.003516 -0.008356 0.023152 0.019226 
+0.003907 0.003794 -0.002290 0.039094 -0.000821 -0.063567 
+-0.023115 0.045022 0.035705 -0.004365 0.025859 0.009852 
+-0.012704 0.010958 -0.005420 -0.005752 0.010165 -0.004383 
+-0.003488 0.009940 -0.003514 -0.001538 0.006353 0.000533 
+-0.000219 0.002306 0.001047 -0.000056 -0.000131 -0.000048 
+-0.001426 -0.000310 -0.004816 -0.003880 -0.002600 -0.003139 
+-0.004468 -0.002026 -0.001324 -0.003113 -0.001696 -0.001128 
+-0.010454 0.007503 0.002624 0.001416 0.000607 -0.000640 
+-0.002639 -0.006390 -0.005752 -0.004728 -0.008015 -0.001558 
+-0.004071 -0.003081 -0.002020 -0.001035 0.001857 -0.002021 
+0.006348 0.002872 0.001480 0.000440 0.001659 0.001642 
+-0.002865 0.001105 -0.000525 -0.001571 0.001083 -0.004659 
+-0.000184 0.008203 -0.006413 -0.000419 0.009171 -0.000615 
+0.000759 0.004741 -0.000156 0.001971 0.001387 -0.000473 
+0.005113 0.000112 -0.000539 0.005420 -0.000820 0.000158 
+0.001252 -0.002393 0.000571 -0.003820 -0.002787 0.000670 
+-0.005536 -0.001404 -0.000340 -0.002822 -0.000557 -0.001768 
+-0.000679 0.000695 -0.000659 0.001510 0.002588 -0.000814 
+0.000203 0.001120 -0.001973 -0.003577 -0.000640 -0.002777 
+-0.002160 0.000563 -0.000108 -0.000574 0.001757 -0.000385 
+-0.000488 0.003009 0.000103 -0.000537 0.001982 -0.001084 
+0.000489 -0.001952 -0.000344 0.003534 -0.004222 -0.003258 
+0.001244 0.002060 -0.002048 0.000329 0.002665 -0.001669 
+-0.001066 0.002844 -0.002631 -0.001100 0.003149 -0.001749 
+0.000213 0.000850 0.000127 -0.002377 0.000784 0.000470 
+-0.000598 -0.000680 -0.000142 -0.004623 0.000651 0.002457 
+-0.005016 -0.007102 -0.004639 -0.002664 -0.012005 -0.010477 
+-0.002352 -0.009048 -0.011484 0.002433 0.002012 -0.009561 
+0.002621 0.003786 -0.005631 0.000173 0.002181 -0.005060 
+-0.001855 0.002949 -0.003997 0.000027 -0.000182 -0.000766 
+0.000989 0.000673 0.000318 -0.000976 -0.000203 -0.000203 
+-0.003023 0.003347 -0.002407 -0.006587 0.002533 -0.000704 
+-0.003257 -0.007984 0.002970 -0.000589 -0.010441 0.003188 
+0.000341 -0.005973 0.002422 -0.000894 -0.000525 -0.000148 
+-0.003882 -0.000532 -0.001506 -0.005967 -0.006089 -0.000868 
+-0.003063 -0.011328 0.001890 0.002198 -0.014745 0.005841 
+0.002789 -0.038061 0.005600 -0.003573 -0.014456 -0.003603 
+0.038750 0.080414 0.020908 0.084476 0.096816 -0.016543 
+0.025405 0.054661 -0.047485 0.037119 0.046977 -0.018875 
+-0.046758 0.021242 0.000709 -0.022585 0.013168 -0.031782 
+-0.006884 0.002792 -0.004209 -0.002721 0.001101 -0.005067 
+-0.001671 0.003757 -0.007015 -0.002412 0.003183 -0.005176 
+-0.000567 -0.000536 -0.001849 0.000396 -0.000021 -0.003562 
+-0.002643 0.000481 -0.004009 -0.001613 0.001188 -0.002471 
+0.001215 -0.000619 0.000405 0.004520 0.000737 0.003849 
+-0.004839 0.008443 -0.000029 0.012926 0.005071 -0.005853 
+0.000611 0.000869 -0.002550 -0.000257 -0.000435 -0.000015 
+0.000285 -0.000128 -0.000098 0.001360 -0.002368 0.000139 
+0.001173 -0.003234 0.001524 0.000581 -0.001647 0.000526 
+0.000000 -0.000137 -0.000068 0.002762 0.004435 -0.002896 
+0.004829 0.005891 -0.004008 0.003601 0.002454 -0.004512 
+-0.001366 0.002217 -0.003509 -0.004561 -0.000401 -0.001257 
+-0.005044 -0.001546 -0.000642 -0.003621 -0.000975 -0.000035 
+0.000413 0.001029 0.000173 0.002896 0.001866 -0.000108 
+0.002062 -0.000714 0.001289 0.000828 -0.001619 0.001443 
+0.001652 0.003706 -0.000423 0.003381 0.010111 -0.003273 
+0.002532 0.009793 -0.001150 0.002297 0.006964 -0.000917 
+0.005343 0.003331 0.000866 0.004998 0.001259 0.001023 
+0.001484 0.003451 -0.000138 0.000090 0.001696 0.001094 
+0.000620 0.004380 0.000395 0.002610 0.001695 -0.000814 
+0.000853 0.004370 0.001280 0.002945 0.003224 -0.002259 
+0.000794 0.000829 -0.002653 -0.000063 -0.000344 -0.000939 
+0.002367 0.003624 -0.002508 0.002780 0.003649 -0.003922 
+0.000667 0.003252 -0.000341 0.001151 -0.001590 0.003208 
+-0.002646 -0.006442 -0.006005 -0.000320 -0.010221 -0.011089 
+0.003168 -0.003505 -0.010668 0.001893 0.002566 -0.008063 
+-0.001708 0.002140 -0.003428 -0.004044 0.001743 -0.000878 
+-0.005886 0.003101 -0.001631 -0.003628 0.005310 0.000159 
+0.002056 0.005081 -0.000147 0.000744 0.005010 0.001155 
+-0.005186 0.008888 -0.002999 -0.005408 0.005405 -0.001979 
+0.000613 -0.008944 0.002958 -0.000004 -0.013230 0.003540 
+0.000042 -0.009139 0.002047 -0.000952 -0.004445 0.000753 
+-0.003050 -0.002257 -0.000720 -0.003740 -0.002516 -0.000368 
+-0.001216 -0.003374 0.000921 0.006109 -0.001938 0.004089 
+0.015808 0.001910 0.008885 0.039660 0.039375 -0.007977 
+0.011756 0.106111 -0.052615 0.011160 0.038407 -0.030009 
+0.011921 0.016892 -0.015060 0.000684 0.007051 -0.002265 
+-0.039113 0.013938 0.000032 -0.009830 0.008644 -0.007169 
+-0.001490 0.001154 -0.001906 -0.001779 0.000030 0.001420 
+-0.004328 0.000758 0.001805 -0.004455 0.002266 -0.001663 
+-0.004120 -0.000283 -0.001846 -0.001802 0.000670 -0.000499 
+0.000900 0.000152 -0.000512 0.003771 0.002283 -0.002163 
+0.003101 0.005730 0.000113 0.002864 0.002336 0.002722 
+0.011999 0.008155 -0.006729 0.004889 0.004693 0.002335 
+-0.002800 0.006520 -0.011193 0.002068 0.003239 -0.004644 
+-0.001925 0.001787 0.001179 -0.001493 -0.001178 0.000466 
+0.000229 -0.000363 0.000139 -0.000022 0.001906 -0.003114 
+-0.000229 0.003092 -0.001543 0.002076 0.001054 0.001128 
+0.001671 0.004818 -0.003592 -0.001618 0.004622 -0.004299 
+-0.003435 0.002374 -0.006032 -0.005349 -0.001458 -0.003339 
+-0.003966 -0.002462 0.000336 -0.002430 -0.001272 0.001099 
+-0.002288 0.000533 0.002234 0.000181 0.001194 0.002457 
+-0.000586 -0.000039 0.000312 -0.000132 0.003631 -0.003869 
+0.004255 0.007189 -0.002612 0.004803 0.005840 -0.001238 
+0.004599 0.006350 -0.002205 -0.001353 0.005490 -0.001634 
+0.000059 0.002491 0.000599 0.002590 0.002310 -0.005547 
+0.001473 0.003808 -0.006232 -0.003347 0.000196 -0.001729 
+-0.002232 -0.000617 -0.003218 -0.002385 -0.000325 -0.000781 
+-0.002980 -0.002345 0.000963 -0.004579 -0.000981 -0.000709 
+-0.003953 -0.000035 0.000387 0.000436 -0.000263 -0.000198 
+0.002872 -0.000653 -0.001142 0.000923 -0.000662 -0.000444 
+-0.001228 0.000044 -0.000931 -0.002282 -0.003162 -0.001194 
+-0.006380 -0.003722 -0.002150 -0.003046 0.001210 -0.000541 
+0.002074 0.000017 -0.004152 0.001066 0.001143 -0.001198 
+-0.004035 0.003364 0.001349 -0.003634 0.004294 -0.000571 
+-0.005596 0.003727 -0.001268 -0.004092 0.006448 -0.002659 
+-0.000216 0.006688 -0.002539 0.001735 0.005722 -0.001423 
+-0.001077 0.005135 -0.000716 -0.002609 -0.001773 0.001442 
+0.001385 -0.012675 0.004298 0.000354 -0.015849 0.001643 
+0.000667 -0.009624 -0.000324 -0.000283 -0.004882 0.000554 
+-0.001146 -0.004283 0.000699 -0.001357 -0.004589 0.001105 
+-0.003354 -0.002836 0.000113 -0.004809 -0.002690 -0.000379 
+0.001052 -0.003245 0.002255 0.012710 0.003231 0.002157 
+0.018534 0.011490 -0.010708 0.004078 0.009559 -0.010754 
+-0.008908 0.000525 -0.001619 -0.014267 -0.006063 -0.000038 
+-0.005376 0.003767 -0.003441 -0.003109 0.003066 -0.001883 
+-0.003438 0.001255 0.001753 -0.006304 -0.002950 0.004090 
+-0.007061 -0.002259 0.005105 -0.005412 -0.003548 -0.000376 
+-0.001718 -0.001595 -0.000286 -0.000211 0.000645 0.000161 
+-0.000013 0.001688 0.000524 0.001036 0.002199 0.001881 
+0.000472 0.002713 0.001374 0.000247 0.001099 -0.000092 
+-0.006009 -0.006131 0.003742 -0.004327 -0.003341 0.000673 
+-0.001649 0.002971 -0.002763 -0.000184 0.000814 -0.001337 
+-0.000516 -0.002018 0.001697 -0.003381 -0.000211 0.001902 
+0.000993 0.002645 -0.000356 -0.000444 0.001403 -0.003614 
+-0.001985 0.000211 -0.003171 -0.002372 -0.001066 -0.000141 
+0.000585 -0.001447 -0.002432 -0.000265 -0.000153 -0.000651 
+-0.002930 -0.002149 -0.001350 -0.004023 -0.001918 0.003049 
+0.001052 -0.002605 0.000731 0.002035 -0.001620 -0.000038 
+-0.000548 -0.001599 0.000827 -0.000821 -0.003251 0.002452 
+-0.001304 -0.003752 0.000837 0.001023 -0.001367 -0.000855 
+-0.000583 -0.002155 0.000818 -0.000854 -0.001046 -0.000108 
+0.002589 0.006079 -0.001303 -0.000717 0.008093 -0.001946 
+0.000516 0.003304 -0.003077 -0.003097 0.000295 0.000864 
+-0.001784 0.000905 -0.002130 -0.002721 0.002242 -0.002900 
+-0.002299 0.000442 -0.001956 0.001069 0.001288 -0.001968 
+0.000552 0.001457 -0.001504 -0.003158 0.001150 -0.003537 
+-0.005610 0.003017 -0.004193 -0.003694 0.002193 -0.000873 
+0.000388 -0.001462 -0.000232 -0.000662 -0.001847 0.000577 
+-0.003496 -0.000147 0.000063 -0.002900 0.001954 -0.002359 
+0.000418 0.003493 -0.002841 0.002877 0.001892 -0.001242 
+0.000322 -0.001302 0.000604 -0.002486 -0.002051 -0.000877 
+-0.002405 -0.000268 -0.001837 -0.003105 0.001162 0.000876 
+-0.002180 0.001847 0.000961 -0.003533 0.001451 0.000664 
+-0.003379 0.000456 0.000016 -0.002835 -0.000906 0.000142 
+-0.003229 -0.001311 0.000415 -0.003462 -0.005805 0.000914 
+-0.003994 -0.013518 0.000295 -0.008082 -0.005901 -0.002150 
+0.000691 0.000193 0.003121 0.001089 -0.001968 -0.001356 
+-0.001086 -0.001505 -0.000861 -0.002937 -0.003182 -0.000522 
+-0.006170 -0.004899 -0.000209 -0.008055 -0.004201 -0.000686 
+-0.006012 -0.001745 -0.000629 0.001046 0.002359 -0.001341 
+0.002744 0.001364 -0.000935 -0.001248 -0.004207 0.002280 
+-0.004150 -0.006817 0.001626 -0.005285 0.002280 -0.000715 
+-0.003244 0.002553 -0.008332 -0.001207 0.001559 -0.006085 
+-0.000548 0.001767 -0.001750 -0.000296 0.002550 -0.000640 
+-0.001509 0.002178 0.000058 -0.000615 0.000558 0.000247 
+-0.000460 -0.000164 0.000035 0.000151 -0.000948 -0.000617 
+-0.001469 0.000330 -0.002710 -0.002860 -0.000647 -0.002363 
+-0.005732 -0.000819 -0.001170 -0.006653 -0.007823 0.002519 
+0.007865 0.013865 0.004126 -0.001638 0.010566 0.001419 
+-0.005511 -0.005850 -0.003850 -0.003766 -0.009530 -0.004261 
+-0.004470 -0.010491 -0.000502 -0.004406 -0.006728 0.002767 
+-0.000236 -0.002953 0.003425 0.000819 -0.002285 0.002069 
+0.000098 -0.002626 0.001740 -0.002864 0.001740 -0.000101 
+-0.002027 0.002125 -0.001157 -0.001994 0.002317 -0.002026 
+-0.002864 -0.001402 -0.002544 -0.004511 -0.007518 0.000160 
+-0.004891 -0.001990 -0.003620 -0.003859 -0.004044 -0.000079 
+0.002817 0.000635 -0.001071 0.006766 0.000050 -0.003107 
+0.004609 -0.001589 0.000133 0.001715 -0.001528 0.001295 
+0.000159 -0.004769 0.000064 -0.000080 -0.005146 -0.000695 
+0.000183 -0.002557 -0.000489 -0.001143 -0.000953 -0.000513 
+-0.000130 -0.000238 0.000089 -0.000287 0.001460 0.000427 
+-0.002979 0.004278 -0.000963 -0.002111 0.005016 -0.002123 
+-0.000934 0.005200 -0.003356 0.003041 0.004729 -0.004898 
+0.002539 0.008812 -0.004207 0.002562 0.005915 -0.005895 
+0.001350 0.004204 -0.005432 0.001288 0.003937 -0.003816 
+0.002493 0.003875 -0.002709 0.002053 0.003711 -0.002491 
+0.001165 0.001872 -0.001507 -0.000065 0.000194 0.000317 
+0.000098 -0.000612 -0.000480 0.000617 -0.001688 -0.001331 
+0.004446 0.000820 -0.002306 0.001303 0.000841 -0.001362 
+-0.003413 0.001535 0.003657 -0.007706 0.001357 0.002599 
+-0.006502 0.001421 0.001482 -0.002919 0.000301 0.000621 
+-0.000542 -0.000244 0.000025 -0.003168 -0.004045 0.000022 
+-0.008089 -0.008781 -0.000321 -0.006615 -0.011002 -0.001277 
+-0.004339 -0.006198 -0.003168 0.001742 -0.004186 0.010414 
+0.002589 -0.006508 0.009660 0.002629 -0.000374 0.005078 
+0.000158 -0.000399 -0.000070 -0.003738 -0.003376 0.000565 
+-0.006915 -0.008631 0.001392 -0.006534 -0.009996 0.000429 
+-0.005491 -0.005127 0.000292 -0.001049 -0.000619 0.000180 
+-0.000557 -0.002847 0.000684 0.000526 -0.005619 0.001781 
+0.002152 0.000702 -0.001035 -0.003676 0.004361 -0.007846 
+-0.005911 0.005079 -0.005333 -0.005379 0.001885 -0.002230 
+-0.000396 0.001906 -0.002174 -0.000500 0.001170 -0.004199 
+0.001874 0.003940 -0.003558 -0.000415 0.000854 -0.001122 
+0.000244 -0.000029 0.001638 -0.000457 0.000277 0.003750 
+-0.000076 0.000839 0.002328 -0.006016 -0.000879 -0.001149 
+-0.006182 -0.003384 0.001397 -0.008713 -0.003593 0.003155 
+0.002828 0.007157 -0.001814 0.010728 0.007735 0.006567 
+-0.002020 -0.007730 0.000046 -0.009392 -0.010897 -0.011847 
+-0.006704 -0.008894 -0.009221 -0.001240 -0.004279 -0.005453 
+-0.001540 0.000310 -0.002252 -0.003183 -0.004301 0.004043 
+-0.004440 -0.000370 0.000041 0.001009 0.000370 0.001527 
+0.000479 -0.001260 0.002438 -0.000185 0.001401 -0.000650 
+-0.003835 0.002140 -0.002052 -0.006321 0.001457 -0.001703 
+-0.004573 0.004711 0.001247 -0.001955 0.004462 -0.000207 
+-0.000254 0.002341 -0.001496 0.001490 -0.000015 -0.001030 
+0.002252 0.000501 0.001765 -0.000283 -0.001289 0.001800 
+-0.001302 -0.004142 -0.001125 -0.002652 -0.004011 -0.001221 
+-0.002766 -0.001420 0.000038 -0.000760 -0.000243 0.001292 
+0.000445 -0.001054 -0.001483 0.002494 -0.002223 -0.003109 
+-0.000321 0.001420 0.000987 -0.002241 0.005571 0.001014 
+-0.002347 0.006675 0.000626 0.002978 0.001981 -0.000968 
+0.005150 0.001565 -0.002424 0.004656 0.002414 -0.006043 
+-0.000411 0.000823 -0.006241 -0.001266 0.002103 -0.002487 
+-0.002830 -0.002697 0.000255 -0.001086 -0.004627 -0.000334 
+0.002323 -0.002263 0.004677 0.000198 0.001544 0.001766 
+0.002200 0.002191 -0.003357 0.000941 0.005510 -0.008824 
+0.004277 0.006453 -0.004262 -0.001398 0.004638 -0.001212 
+-0.003073 0.003253 0.002319 -0.006518 0.001011 0.003370 
+-0.003637 -0.002141 -0.000006 0.001245 0.003545 -0.002190 
+0.005117 0.001623 -0.001241 0.003134 -0.002996 0.001165 
+0.001095 -0.007654 0.000987 -0.001421 -0.010998 -0.001024 
+-0.003551 -0.006920 -0.003981 0.001367 -0.001781 0.004002 
+0.003629 -0.001055 0.000725 0.003345 0.002092 0.000420 
+-0.001237 0.000162 0.000536 -0.005534 -0.001979 -0.000042 
+-0.002182 0.002488 0.001532 0.002638 0.000268 0.007812 
+0.000991 -0.008250 0.007373 -0.001949 -0.004211 0.001565 
+-0.000154 -0.003251 0.000709 0.008411 0.000605 -0.002620 
+0.002289 -0.000524 -0.003947 -0.001806 0.001562 -0.001959 
+-0.000548 0.004735 -0.001121 -0.001042 0.002708 -0.002292 
+-0.001715 0.002798 -0.000497 -0.003294 -0.000028 -0.002429 
+-0.000411 0.000627 0.000022 -0.002638 -0.005099 -0.000133 
+-0.001671 -0.003352 0.005209 -0.002175 0.000584 0.004880 
+0.002515 0.001360 0.004364 0.000226 -0.000168 0.001221 
+-0.003554 -0.001656 0.002091 -0.006984 -0.007460 0.005003 
+-0.005834 0.001969 -0.007444 0.003938 0.008769 0.000651 
+0.016803 0.005967 0.003852 0.000338 -0.012899 -0.005414 
+-0.002469 -0.016872 -0.003929 -0.002827 -0.013328 -0.001615 
+-0.002937 -0.006351 0.001588 0.000069 0.000181 0.002457 
+0.003057 0.003320 0.001968 0.002144 0.001020 -0.000788 
+0.002345 -0.002791 0.002137 -0.000049 -0.002071 0.001250 
+-0.000267 0.000457 -0.000234 0.000000 -0.000676 -0.000789 
+0.002217 0.001861 -0.004506 0.000226 0.001382 -0.001273 
+-0.002871 0.000078 0.003104 -0.002657 0.000649 0.004370 
+-0.003037 -0.000121 0.001033 -0.001698 -0.003965 0.003106 
+0.000271 -0.001860 0.000271 -0.001728 0.004059 -0.001138 
+-0.001234 0.006383 -0.002866 -0.001421 0.002404 -0.001202 
+0.000581 0.000573 0.001155 0.000254 -0.001612 -0.000239 
+-0.001556 -0.003394 -0.000849 -0.001113 -0.003431 0.000017 
+-0.000645 0.001862 0.003706 0.001131 0.001582 0.002609 
+0.003620 -0.000777 -0.000522 0.005443 0.003021 -0.003534 
+0.004048 0.002981 -0.002531 0.001268 -0.000007 -0.000296 
+0.001404 -0.000802 0.002005 0.000736 -0.005626 0.001714 
+0.001899 0.000426 0.001163 0.000859 -0.001931 0.003646 
+0.000759 0.000656 -0.002627 -0.001583 0.003972 -0.006421 
+0.003510 0.006942 -0.000797 0.000484 0.007421 -0.001390 
+-0.000849 0.004370 0.003820 -0.003214 0.001000 0.000000 
+-0.003101 0.000037 0.003806 0.002576 0.001822 -0.001941 
+0.007276 0.001977 -0.002847 0.004113 -0.000908 0.000273 
+0.001706 -0.003814 0.001068 0.003876 -0.006263 0.000990 
+0.001111 -0.001273 -0.002971 -0.004496 -0.001782 0.002032 
+-0.004409 0.000860 -0.002317 0.000002 0.003519 0.002461 
+-0.001709 0.001133 0.000396 -0.001356 0.000768 -0.000384 
+-0.004849 0.002053 0.004260 -0.007834 -0.007424 0.007242 
+0.002761 0.001519 0.005384 0.004443 0.000800 0.004922 
+0.011636 0.000374 -0.001721 0.009418 -0.004176 -0.007117 
+0.002256 -0.002977 -0.001424 0.001147 -0.002868 0.002294 
+0.000459 -0.000451 0.001644 0.001712 0.000304 -0.002238 
+-0.000199 0.001192 -0.001397 -0.001463 -0.000148 0.002349 
+-0.003422 -0.003488 0.003815 -0.002301 -0.001529 0.004267 
+0.000514 -0.001853 0.001410 0.003878 0.001267 0.002580 
+-0.000858 0.001730 -0.000468 0.001107 0.000500 -0.002107 
+0.000759 0.001355 -0.000815 -0.001277 -0.002297 -0.002086 
+0.002353 0.005518 -0.005886 0.002323 0.005235 -0.004151 
+-0.000064 0.000355 -0.002341 0.001576 -0.013659 -0.002250 
+-0.008837 -0.017608 0.001086 -0.010513 -0.012327 0.004164 
+-0.003219 -0.004538 0.003843 0.004940 -0.000428 0.000165 
+0.008730 0.004225 0.001552 0.005369 0.005614 -0.000914 
+0.002647 0.000000 0.000000 -0.000047 0.002692 -0.002360 
+0.000072 0.001059 -0.000773 -0.000387 -0.000886 0.000631 
+-0.000378 -0.003083 -0.003026 -0.001335 -0.001254 -0.004241 
+-0.000779 0.000199 -0.002222 0.000031 -0.001612 0.000844 
+0.000040 -0.001208 0.005800 0.001516 -0.000645 0.004299 
+0.000239 0.001374 0.001449 0.000362 0.001552 0.000461 
+-0.000286 -0.002854 0.000649 -0.003740 -0.003902 0.005447 
+-0.003418 -0.005579 0.004029 -0.004284 -0.003928 0.001847 
+-0.003708 -0.003864 0.002050 -0.002524 -0.000888 0.004861 
+-0.002109 0.001527 0.001868 -0.003860 0.001607 0.001284 
+-0.001271 -0.000249 0.002187 0.002733 -0.000156 0.003684 
+0.000158 -0.002324 0.007328 0.004097 -0.001988 0.006267 
+-0.003567 0.002994 0.007207 -0.003442 0.002513 0.007479 
+-0.000957 0.002241 0.004903 0.003093 -0.003371 0.000407 
+0.005845 -0.002029 -0.004097 0.002407 0.002803 -0.001308 
+-0.002966 0.004371 -0.003044 -0.000186 0.007006 -0.002486 
+0.002381 0.004396 0.000763 0.001873 0.000653 0.000601 
+0.002764 -0.000109 -0.001175 0.002892 0.002292 -0.003875 
+0.004931 0.000363 -0.002819 0.001908 -0.002429 -0.000040 
+-0.002563 -0.003705 -0.002357 -0.004801 -0.004989 -0.003884 
+-0.003898 0.002401 0.001310 -0.010975 -0.003552 0.006839 
+-0.007060 -0.006912 0.006395 -0.005690 -0.004224 0.007155 
+0.001253 -0.000263 0.005155 0.000622 -0.003461 0.005498 
+-0.004983 -0.003399 0.006007 -0.000444 -0.001506 0.007851 
+0.001613 -0.003679 0.007300 0.000865 -0.002597 0.006782 
+0.000816 -0.002895 0.005240 0.003500 -0.001996 0.003046 
+-0.001069 -0.000790 0.001742 -0.002739 -0.001273 0.003857 
+-0.004119 -0.000679 0.000312 -0.002368 -0.002911 0.000411 
+0.001014 -0.000336 -0.002028 -0.001133 0.002298 -0.003054 
+-0.001443 0.002487 0.001121 -0.001136 0.002045 0.002879 
+-0.003154 -0.000507 0.002027 0.000429 0.000732 0.001035 
+0.001062 0.000298 0.000736 -0.000546 0.000047 0.000058 
+-0.003525 0.000013 -0.000381 -0.003447 0.001091 -0.000899 
+0.001870 0.004152 -0.000276 -0.002894 0.001826 0.002456 
+-0.004298 -0.000811 0.002269 -0.001319 -0.001574 0.000462 
+-0.004804 -0.004606 -0.002139 -0.005601 -0.005929 -0.003180 
+-0.002751 -0.001386 -0.002377 0.001632 0.000689 -0.001086 
+0.003130 0.003838 -0.001274 -0.000060 0.003790 -0.001955 
+-0.000996 0.001794 -0.001171 0.003434 0.000584 -0.004121 
+0.000621 0.004072 -0.005157 -0.000262 0.003208 -0.007137 
+-0.004704 0.000123 -0.006810 -0.004726 0.000978 -0.003962 
+0.000042 0.002584 -0.001350 0.005253 0.001205 -0.001735 
+0.001697 -0.000844 0.001310 -0.001861 0.002457 0.002517 
+-0.001431 0.003155 0.002589 -0.006975 -0.007547 -0.000640 
+-0.007854 -0.006851 0.002820 -0.002557 0.003047 0.002536 
+-0.003563 -0.003167 0.004354 -0.002524 -0.006091 0.005472 
+-0.004404 -0.007861 0.009869 -0.006951 -0.006484 0.011316 
+-0.010200 -0.005905 0.004833 -0.006826 -0.002192 0.002776 
+-0.001880 -0.001566 0.003759 -0.004230 0.002486 0.004375 
+-0.002422 0.000928 0.007317 -0.000262 -0.000556 0.003646 
+0.000554 -0.000184 -0.001020 0.000509 0.001194 -0.003421 
+-0.001251 0.001266 -0.003522 -0.002304 -0.000353 -0.003005 
+0.000120 0.000339 0.000058 -0.001243 0.001454 -0.004825 
+-0.002324 0.001581 -0.000875 -0.000809 0.002187 0.000091 
+-0.000009 0.000688 0.000738 0.000322 0.000355 0.000476 
+0.000649 0.002881 -0.001259 -0.000187 0.000675 0.000351 
+0.001278 -0.001607 -0.000531 0.000683 -0.002844 0.000356 
+-0.000599 -0.004352 -0.001905 -0.006300 -0.007182 -0.004163 
+-0.008317 -0.004567 -0.003607 -0.006767 -0.001317 0.001351 
+-0.003255 -0.000519 0.002701 -0.002405 -0.003058 0.002697 
+-0.001856 -0.000413 0.003455 0.000110 0.001377 0.003084 
+-0.000839 -0.001062 0.002591 -0.000343 -0.001978 0.004499 
+0.000356 -0.001451 0.005462 -0.000257 -0.003586 0.004868 
+-0.000063 -0.002771 0.003149 -0.001057 -0.000433 0.002382 
+-0.003822 0.001112 0.002496 -0.005371 0.002533 0.003174 
+-0.003123 0.001982 0.004265 -0.003085 0.000997 0.001592 
+-0.000669 0.004286 0.000390 -0.000187 0.006697 0.002263 
+-0.004736 0.008834 -0.003327 -0.002367 0.005863 0.000510 
+-0.002712 0.003237 0.001881 -0.002080 0.002752 0.001243 
+-0.001497 0.001071 -0.000987 -0.002626 -0.000034 -0.002394 
+-0.007172 0.000875 -0.000430 -0.011605 -0.001636 0.005607 
+0.004356 0.003343 -0.000203 0.002780 0.006169 0.001304 
+0.002491 0.008124 0.003240 0.000725 0.003876 0.002991 
+-0.000986 -0.000670 -0.003324 -0.001845 -0.004362 -0.002094 
+0.000251 -0.000511 0.001117 0.003302 0.003354 0.002184 
+0.001756 0.004833 0.001353 0.000104 0.002498 -0.002059 
+-0.001981 0.001165 -0.002654 -0.002815 0.001054 -0.002611 
+-0.002239 0.001675 -0.003725 -0.002020 -0.000023 -0.003913 
+-0.002057 -0.001041 -0.000002 -0.001004 -0.002956 0.001258 
+0.001752 -0.002306 0.002230 0.003324 -0.000726 0.000055 
+-0.000174 0.000095 -0.000130 -0.001943 0.001483 -0.000803 
+-0.006695 -0.004017 -0.000638 -0.007977 -0.004317 0.001775 
+-0.005950 0.000991 -0.000419 -0.001137 0.004441 -0.000965 
+-0.001206 0.001169 0.000787 0.000512 0.000120 0.004802 
+-0.003671 -0.000839 0.009013 -0.004143 -0.006712 0.009420 
+0.002718 -0.002638 0.004467 -0.001535 -0.000876 0.005367 
+-0.000159 -0.001339 0.003216 -0.000506 -0.000290 0.000762 
+-0.000652 0.001198 -0.001944 0.000047 0.001563 -0.003645 
+0.002060 -0.000430 -0.003226 0.000167 -0.001713 -0.000568 
+-0.000467 -0.000538 -0.000678 -0.000647 0.002288 -0.001966 
+-0.006542 0.004100 -0.001881 -0.005988 0.005011 -0.001714 
+-0.005882 0.000289 -0.000769 -0.000785 -0.001274 0.002655 
+-0.000115 0.002113 0.004857 -0.005024 0.006176 0.001859 
+-0.004480 0.003728 -0.000205 -0.001686 0.000650 -0.000228 
+-0.000296 -0.001629 -0.000792 0.001226 -0.004389 0.001861 
+-0.000854 -0.004539 -0.001487 -0.001152 -0.005010 -0.001026 
+0.001905 -0.002667 0.000212 0.003166 0.002204 -0.005458 
+-0.000655 0.004166 -0.003868 -0.002438 0.003535 -0.000867 
+0.001416 0.005932 0.004397 0.000149 0.004463 -0.005994 
+-0.002646 0.003826 -0.003268 -0.003552 0.003741 -0.001324 
+-0.004064 -0.001887 -0.001869 -0.002514 -0.003021 -0.001318 
+-0.001180 0.000359 -0.002308 -0.002678 0.000963 -0.002113 
+-0.003706 0.001730 0.000988 0.001959 0.001875 0.001203 
+0.001280 0.004782 0.000135 0.000776 0.000833 -0.000212 
+-0.003807 -0.002174 0.001657 -0.007557 -0.001886 -0.000270 
+-0.000818 0.000583 -0.001270 0.001171 0.001275 0.000534 
+-0.001008 -0.001234 0.000148 -0.002752 -0.000376 -0.001633 
+-0.002168 0.001547 -0.002037 -0.002076 0.000237 -0.004481 
+-0.001381 -0.000524 -0.006048 0.005398 0.003919 -0.001899 
+0.001633 0.002504 0.000776 0.004390 0.004165 0.000101 
+0.002745 0.002021 0.000383 -0.003771 -0.000957 0.000326 
+-0.006859 0.000106 -0.002734 -0.002666 -0.003320 -0.000936 
+0.000504 0.000864 0.000090 0.001129 0.001338 0.000914 
+0.000151 -0.000694 0.000711 -0.001567 0.000708 -0.000518 
+0.001056 0.000768 -0.001207 0.000729 0.006479 0.000079 
+0.000024 0.004613 0.001609 -0.002552 0.000438 0.005632 
+-0.001234 -0.003312 0.005519 -0.002596 -0.006521 0.004549 
+0.000544 -0.007382 0.001829 0.001174 -0.005769 0.003466 
+-0.000661 -0.003099 0.003099 -0.002441 0.000305 0.004417 
+-0.003550 0.003817 -0.000766 -0.004202 0.001106 -0.000285 
+-0.003027 -0.000937 0.001274 0.000320 0.000438 -0.000143 
+-0.000632 0.001739 -0.000866 0.000054 -0.000461 -0.000122 
+-0.000588 -0.000200 -0.000052 -0.000872 0.000885 0.003915 
+0.002158 0.004128 0.001983 0.002473 0.004342 -0.000086 
+0.001197 0.003592 -0.000634 0.000754 0.001454 -0.000842 
+-0.000126 0.001320 -0.000541 -0.001340 -0.000898 0.000874 
+-0.002915 -0.001682 0.003617 -0.001736 -0.001666 0.006361 
+-0.003351 -0.004425 0.005567 -0.004446 0.002714 0.004975 
+-0.004137 0.004762 0.004676 -0.004756 0.004879 0.000445 
+-0.001684 0.000347 0.000886 0.001083 0.000260 -0.000019 
+0.001966 -0.001064 -0.001431 0.002713 -0.003666 -0.003270 
+0.002604 -0.005633 -0.002885 0.006372 -0.000320 -0.001945 
+0.001051 -0.001167 -0.000828 0.002123 -0.000769 0.002265 
+-0.003610 -0.005218 -0.002232 -0.008147 -0.004893 -0.000108 
+-0.002377 -0.000007 0.002248 0.000324 -0.001459 -0.001176 
+-0.001836 -0.000819 -0.002655 0.000171 -0.001626 -0.000343 
+0.003576 0.001314 -0.004784 -0.001905 0.001914 -0.001811 
+-0.003549 0.006661 -0.001964 -0.000134 0.001548 0.001245 
+-0.005996 -0.003222 -0.003094 -0.007730 -0.001404 0.000818 
+-0.004983 -0.001665 -0.005244 -0.005370 -0.000466 -0.001938 
+-0.004041 0.002352 0.000921 -0.002070 0.002237 0.000024 
+0.002450 0.000041 0.000989 0.003883 0.000072 -0.001184 
+-0.001134 -0.001574 -0.000543 -0.006937 -0.001116 -0.000444 
+-0.005352 -0.003066 0.006119 -0.006193 -0.000775 0.002514 
+-0.002011 -0.002958 0.001581 -0.002290 -0.001903 -0.002429 
+-0.004366 -0.000662 -0.005690 0.000830 -0.000802 0.000952 
+0.007374 0.002530 0.003513 0.022492 0.005962 0.016250 
+0.001838 0.004484 0.002061 0.004633 0.002313 0.003202 
+0.002058 0.001894 0.001516 -0.000430 -0.000361 0.000034 
+0.001761 0.001106 -0.002967 0.005117 -0.000319 -0.001033 
+0.006016 0.002453 -0.001318 -0.001196 -0.000319 0.000280 
+-0.007119 -0.001603 0.000029 -0.000387 -0.004324 -0.001162 
+-0.000170 -0.000461 -0.002078 -0.000311 0.001087 -0.002692 
+0.000024 -0.000004 -0.001053 -0.000465 0.000465 0.000465 
+-0.007500 -0.002103 0.001508 -0.001453 0.000301 -0.001969 
+-0.000953 -0.000686 -0.002150 -0.003083 -0.002462 0.001799 
+-0.003935 -0.000190 0.004546 0.002774 0.005445 0.006431 
+0.000644 0.005174 0.002468 0.000128 0.000341 0.000906 
+-0.003865 -0.002471 0.003897 0.000363 -0.002805 0.000679 
+-0.000684 -0.001008 -0.000425 -0.004916 -0.002397 -0.001616 
+-0.007866 -0.003760 0.000631 -0.005750 -0.000019 0.004280 
+-0.007418 0.006298 0.005085 -0.012255 0.009424 0.000855 
+-0.012058 0.003138 -0.002521 0.001748 0.010490 -0.004687 
+-0.001507 0.004415 -0.002241 0.007197 0.002016 -0.002244 
+0.005123 0.003949 -0.000122 0.000565 0.002840 -0.000560 
+-0.002999 0.001338 -0.000187 -0.005872 0.002257 0.001071 
+-0.005770 0.004171 0.000767 -0.004163 0.004872 -0.003695 
+-0.000818 0.001425 -0.006772 0.008181 -0.001227 -0.008792 
+0.012395 0.002578 -0.008970 -0.001034 -0.000696 -0.004818 
+0.004170 -0.006136 -0.005027 0.001948 -0.004267 -0.006498 
+-0.001982 -0.001656 -0.006070 -0.004403 0.001593 -0.001221 
+-0.003150 0.002458 0.000145 -0.004677 -0.001921 0.000219 
+-0.007117 -0.003784 0.003333 -0.007071 0.001286 0.004018 
+-0.005061 -0.002065 -0.001391 -0.000662 -0.001105 0.000421 
+-0.001154 0.002094 -0.000826 -0.001661 0.003806 0.000778 
+0.002248 0.001313 -0.003500 0.003049 -0.000861 -0.002490 
+-0.001857 -0.001281 -0.002498 -0.002154 -0.007160 -0.002027 
+-0.002087 -0.004317 -0.002571 -0.000735 -0.000952 0.000367 
+-0.000679 0.001165 -0.000545 -0.002090 0.000009 -0.002282 
+-0.002708 -0.001624 -0.001895 0.004508 0.001615 -0.001013 
+0.006360 0.006093 -0.001800 0.003333 0.003807 -0.002880 
+-0.003909 0.001241 -0.004759 -0.004439 -0.000659 0.000123 
+-0.000223 0.000381 0.003243 0.001543 -0.001903 0.000010 
+-0.000309 -0.007036 -0.006989 -0.001376 -0.001435 -0.001026 
+0.015212 0.005035 0.017519 0.025297 0.010151 0.025160 
+0.000646 0.003875 0.002721 0.001421 0.005843 0.000506 
+0.004642 0.004231 0.001453 0.002117 0.003562 -0.002604 
+0.002350 0.003483 -0.003135 -0.000271 0.005226 -0.001444 
+-0.002146 0.002194 0.001905 -0.002549 0.000624 0.002226 
+-0.000004 0.000283 0.000188 -0.000110 0.001324 -0.003750 
+-0.000831 -0.000850 -0.001679 0.000786 0.000522 -0.000052 
+-0.001173 -0.000160 -0.000661 -0.002908 0.001034 0.000559 
+-0.001777 0.000026 -0.003205 -0.001382 -0.001039 -0.003508 
+-0.001446 0.001376 -0.001675 -0.000261 0.005294 0.000177 
+0.001950 0.010098 0.001758 0.003374 0.008140 0.001927 
+0.002530 0.000258 -0.000839 0.001874 -0.001133 -0.001688 
+0.002286 0.000515 0.000703 0.000987 0.000879 0.001405 
+-0.002370 -0.001547 -0.002961 -0.014533 -0.009741 -0.000373 
+-0.009888 0.006446 -0.003503 -0.012745 0.011512 0.000458 
+-0.016709 0.011113 0.002993 -0.015477 0.001048 0.003500 
+-0.000942 -0.000020 0.001949 -0.000458 0.005355 0.002425 
+0.000706 0.003222 -0.000032 0.003965 0.001806 0.000505 
+0.001880 0.001714 0.001217 0.000819 0.001244 0.000707 
+0.000414 -0.001167 -0.000001 -0.002737 -0.002948 -0.000775 
+-0.005212 -0.001635 -0.002664 -0.000845 -0.000093 -0.002476 
+-0.001168 -0.002225 -0.000095 0.002298 -0.003329 -0.003002 
+0.003251 -0.005942 -0.006952 0.003014 -0.003664 -0.009138 
+-0.000924 0.000204 -0.004795 -0.003541 0.000718 -0.003382 
+-0.002381 -0.002695 -0.002965 -0.000142 0.004306 0.000257 
+0.004510 0.009423 0.003813 0.007437 0.006945 0.001035 
+0.001497 0.002746 0.000746 -0.000709 0.003033 0.003132 
+-0.002591 0.003799 -0.002490 -0.004642 0.006367 -0.003152 
+-0.004471 0.005834 -0.000287 -0.002661 0.001150 0.000021 
+0.001382 0.004146 -0.006260 0.004116 0.006968 -0.009501 
+0.001360 0.007745 -0.005380 0.003610 0.004393 -0.000836 
+0.004815 0.000838 0.002263 0.000130 0.000975 0.003268 
+-0.002906 -0.000233 -0.002972 -0.008455 -0.005009 -0.006429 
+-0.012696 -0.003069 -0.001553 -0.010977 0.005265 0.004428 
+-0.008468 0.009116 -0.001166 -0.011805 0.005571 0.003139 
+-0.003426 -0.002135 0.001039 -0.007020 0.005318 -0.008797 
+-0.018570 0.005062 -0.009620 -0.025013 0.011648 -0.006622 
+-0.026801 0.001821 0.006527 0.002625 0.003338 0.002085 
+0.016431 0.007090 0.018046 0.017515 0.011023 0.022280 
+-0.002796 -0.001119 -0.001305 -0.001542 -0.001760 -0.000984 
+0.000752 -0.001319 -0.001159 -0.001164 0.001410 -0.003176 
+0.002631 0.002145 -0.003280 0.002917 0.002816 -0.002503 
+0.005084 0.001261 0.001055 0.001754 0.001013 -0.000709 
+0.000996 0.003324 -0.001205 0.000152 0.002989 -0.001214 
+-0.008975 -0.001023 -0.003792 -0.008463 -0.000391 0.000345 
+-0.003339 0.000564 -0.000737 0.000852 0.001481 0.001148 
+-0.001847 0.001478 -0.000580 -0.000603 -0.002805 -0.000787 
+-0.003679 -0.000063 -0.003705 -0.001360 0.002499 -0.000021 
+0.004348 0.007108 0.001990 0.005641 0.007105 0.002099 
+0.004543 0.003972 0.002226 0.007092 0.002910 0.003018 
+0.008234 0.002826 0.003290 -0.000589 0.001691 0.001802 
+-0.001300 0.005274 -0.006014 -0.014301 0.005797 -0.007599 
+-0.015837 0.008300 -0.006651 -0.016288 0.011831 -0.006958 
+-0.015627 0.012870 -0.008057 -0.010957 0.013351 -0.003708 
+-0.003855 0.008683 0.000777 -0.004258 0.001281 0.003495 
+-0.005391 -0.002323 0.000560 -0.003438 -0.002706 -0.002453 
+-0.001020 -0.002044 -0.002575 0.000604 -0.002150 -0.000773 
+-0.001799 -0.006356 0.003708 -0.005415 -0.005381 0.008446 
+-0.007942 -0.009474 0.007754 -0.006581 -0.009337 0.007349 
+-0.009667 0.000077 0.006999 -0.006327 0.003259 0.002034 
+-0.003108 0.002066 -0.002781 0.000319 0.001591 -0.005034 
+-0.000033 0.001371 -0.005690 -0.003385 0.000008 -0.002240 
+-0.002880 0.002107 -0.000517 0.001928 0.003286 0.001016 
+0.008652 0.004330 0.000387 0.003291 0.000462 -0.003656 
+-0.001035 0.009888 -0.009001 0.002771 0.010808 -0.005116 
+0.002930 0.006630 -0.004223 -0.002085 0.002069 -0.001693 
+-0.003301 0.003886 0.001086 -0.001256 0.002720 0.000186 
+0.000741 0.002040 -0.002826 0.003044 0.006771 -0.009137 
+0.011677 0.016580 -0.009181 0.008560 0.018419 -0.002174 
+0.007770 0.007677 0.000462 -0.001719 0.003602 0.001687 
+-0.007101 -0.004449 -0.001475 -0.004291 0.000899 -0.001594 
+0.006500 -0.000804 -0.004846 0.009747 -0.001449 0.001020 
+0.009621 -0.000738 0.007195 0.018790 -0.006363 0.010467 
+3.581818 -0.648485 1.460606 4.759740 -0.785714 1.025974 
+4.333333 -0.521368 0.316239 0.006309 -0.003373 0.004047 
+-0.032849 0.005691 -0.004620 -0.016130 0.009032 -0.010232 
+0.004300 -0.007829 0.001815 0.006506 0.004415 0.000430 
+0.003516 -0.003679 -0.005151 0.001214 -0.005245 -0.002307 
+-0.003119 -0.005847 0.000062 -0.003083 -0.003537 -0.000907 
+-0.000551 -0.001581 -0.001006 0.004789 -0.002861 -0.004796 
+0.006338 -0.005189 -0.010913 0.004856 0.002053 -0.006749 
+-0.001684 -0.004388 0.002887 -0.009612 -0.007547 0.003258 
+-0.016766 -0.008444 0.001130 -0.014533 -0.008532 -0.011345 
+-0.011061 -0.001996 0.003862 -0.003861 -0.002399 0.001280 
+-0.002142 -0.001371 0.002201 -0.004516 0.000702 0.001515 
+-0.002607 -0.000107 -0.002022 -0.002320 -0.002024 -0.002213 
+-0.003376 0.000275 -0.001337 -0.002591 0.004355 0.000547 
+-0.000730 0.007119 0.001894 -0.000397 0.007342 0.001162 
+-0.009599 0.004344 0.000719 -0.013351 0.004621 0.008457 
+-0.005129 0.007200 0.004184 -0.004243 0.007164 -0.002642 
+-0.010657 0.002810 -0.008205 -0.016682 0.002034 -0.002207 
+-0.009497 0.004778 -0.002648 -0.001474 0.002395 -0.003660 
+0.001972 0.000235 -0.001106 -0.000674 -0.003207 0.000915 
+-0.001628 -0.004260 -0.001813 0.001107 -0.003829 -0.000596 
+0.004145 0.000818 -0.004123 0.000823 -0.001074 -0.003535 
+-0.001056 -0.000662 -0.002379 -0.002166 -0.001516 -0.001696 
+-0.002244 -0.004735 0.002435 0.000685 -0.003219 0.005616 
+-0.007662 0.000987 0.004686 -0.008875 -0.009133 0.005625 
+-0.004581 -0.007669 0.006949 -0.002310 0.000769 0.004430 
+-0.002098 0.002518 0.001221 0.002557 0.007659 -0.000715 
+0.001525 0.006434 -0.000692 -0.000125 0.003066 0.000438 
+-0.003728 0.004901 0.003337 -0.002719 0.006576 -0.001247 
+0.000258 0.009042 0.000628 0.001846 0.005247 0.001195 
+0.003333 0.003451 -0.000232 0.001947 0.005039 -0.001460 
+0.000813 -0.000567 0.000889 -0.002028 -0.000132 0.002102 
+-0.002011 -0.001716 0.003650 0.001682 0.003274 -0.001543 
+-0.003057 0.001751 -0.000842 -0.006532 0.003365 -0.007661 
+-0.004743 -0.000653 -0.005884 0.009405 -0.002746 -0.004059 
+0.030286 -0.008669 -0.007142 4.681250 -1.525000 -1.418750 
+5.635417 -1.531250 -1.604167 6.017699 -1.415929 -1.097345 
+6.138340 -1.430830 -0.169960 6.206767 -1.661654 0.917293 
+6.359073 -1.922780 1.891892 6.396476 -1.911894 2.418502 
+5.832370 -1.502890 2.156069 0.033286 -0.006060 0.020620 
+0.010448 0.008419 -0.004192 -0.011123 0.008351 -0.006356 
+-0.007967 0.000547 -0.008777 0.003574 -0.006677 -0.000195 
+0.002885 0.000729 -0.004321 0.000456 -0.001113 -0.000998 
+-0.001505 -0.001888 0.001160 -0.001256 -0.005405 0.000828 
+-0.009461 -0.003298 0.005875 -0.006672 -0.008048 -0.006272 
+-0.004719 -0.015452 -0.007323 -0.001691 -0.016930 -0.005905 
+0.008741 -0.009138 -0.000997 -0.007835 -0.014586 -0.001148 
+-0.019288 -0.018364 -0.003386 -0.026636 -0.019263 -0.003568 
+-0.021632 -0.011528 -0.002582 -0.005409 0.000096 -0.002761 
+0.008936 0.005334 0.001942 0.009556 0.004825 0.003009 
+0.004796 0.000499 0.001502 -0.002035 0.000911 0.000248 
+-0.008485 0.003462 0.000221 -0.012383 0.002961 -0.000864 
+-0.012342 0.000930 -0.000692 -0.015207 0.001713 0.002404 
+-0.017996 0.002636 0.006986 -0.014949 -0.001440 0.007896 
+-0.011673 -0.004963 0.007090 -0.007348 -0.006799 0.006937 
+-0.006130 -0.004890 0.003115 -0.004078 -0.002551 0.001049 
+-0.000661 -0.002556 0.001199 0.000215 -0.004136 0.001803 
+-0.000141 -0.005084 0.004166 0.003907 -0.004650 0.002039 
+0.005097 -0.004073 -0.000989 0.004852 -0.001746 -0.002329 
+0.004932 0.001317 -0.005471 0.005513 0.006745 -0.006518 
+-0.001303 0.003346 0.000587 -0.002275 0.002022 -0.004301 
+-0.000626 0.001421 0.000916 -0.002931 -0.002988 0.005033 
+-0.002356 -0.003313 0.004055 0.000375 -0.002579 -0.003270 
+0.005850 0.000246 -0.005285 0.005217 0.000020 -0.002726 
+0.001758 -0.000467 -0.003128 0.004844 0.001730 -0.002477 
+0.005006 0.005241 -0.002079 -0.000842 0.004114 -0.002226 
+-0.006689 -0.000699 -0.000871 -0.005347 0.000483 0.000253 
+0.002170 0.001362 0.001508 0.005956 0.000667 0.000295 
+0.005072 0.000152 -0.002619 0.001751 0.000238 -0.000625 
+-0.002022 0.005027 0.001503 -0.001612 0.007813 -0.002280 
+-0.011324 0.005771 -0.002963 -0.005161 0.006584 -0.006800 
+-0.005739 0.003261 -0.009241 -0.008356 0.000877 -0.007635 
+0.005085 -0.002343 -0.006802 3.435754 -1.798883 -1.100559 
+6.073913 -2.543478 -1.686957 7.146853 -3.048951 -1.807692 
+7.390093 -3.414861 -1.464396 7.359649 -3.596491 -0.769006 
+7.364431 -3.448980 0.102041 7.395498 -3.048232 0.967846 
+7.197479 -2.567227 1.718487 6.145695 -1.907285 1.953642 
+0.027448 -0.015691 0.005049 0.001672 0.003221 -0.001578 
+-0.001347 -0.002388 -0.002536 -0.002541 -0.001038 -0.001520 
+-0.007848 -0.003203 0.002612 -0.005630 -0.005630 0.003277 
+-0.000126 -0.006169 0.001284 -0.004781 -0.004297 0.000720 
+-0.005349 -0.001570 0.001531 -0.005854 0.000678 0.003944 
+-0.005447 -0.011199 0.007794 -0.007339 -0.012071 -0.001026 
+-0.002073 -0.007975 0.001773 0.011952 0.003671 -0.008153 
+0.016703 -0.002102 -0.016270 0.006420 -0.006055 -0.006715 
+-0.015085 -0.013817 -0.001957 -0.026291 -0.017634 0.004909 
+-0.028752 -0.012020 0.003606 -0.025278 -0.006233 -0.001524 
+-0.009099 -0.000312 -0.002583 0.012271 0.003515 -0.003352 
+0.027750 0.010293 -0.011444 0.023908 0.025344 -0.022059 
+0.008057 0.015814 -0.002578 0.002614 -0.012279 -0.004591 
+-0.004769 -0.005789 -0.002153 -0.005763 -0.000119 -0.000111 
+-0.005263 -0.000797 -0.001212 0.001657 -0.000675 -0.003199 
+-0.000953 -0.000669 0.004247 0.000078 -0.004776 0.009448 
+0.002742 -0.003858 0.006850 0.002988 -0.000836 0.005159 
+0.004081 0.000132 0.005040 0.003207 -0.002791 0.006096 
+0.000341 -0.006629 0.004492 0.000403 -0.007640 0.002233 
+-0.000175 -0.006684 0.001704 -0.003338 -0.003390 0.001405 
+-0.003880 0.000278 -0.000860 -0.000918 0.001011 -0.000140 
+0.000770 0.000517 0.000550 -0.001697 -0.000300 -0.002496 
+-0.004128 -0.000571 0.003955 -0.007445 -0.004959 0.006691 
+-0.006469 -0.004824 0.003149 0.000919 -0.001764 0.000813 
+0.006946 -0.001670 -0.003259 0.008290 -0.002608 -0.003994 
+0.005411 -0.001614 -0.003318 0.003088 -0.001635 0.001943 
+0.002791 0.000950 0.001110 0.001895 0.004126 0.001182 
+0.001705 0.005625 0.004062 0.000850 0.008342 0.011737 
+0.001452 0.006367 0.009895 0.004872 -0.001099 -0.001401 
+0.010713 -0.004112 -0.009458 0.001971 -0.004955 -0.003884 
+-0.007905 -0.001706 0.003800 -0.011020 0.004420 -0.001252 
+-0.006368 0.007513 -0.011523 -0.001740 0.005837 -0.015574 
+0.005971 0.000318 -0.009499 0.023103 -0.009633 -0.005084 
+4.563560 -1.961864 -0.889831 6.528239 -2.239203 -1.328904 
+7.625360 -2.512968 -1.498559 8.100000 -2.988571 -1.305714 
+8.370607 -3.693291 -0.888179 8.507576 -4.125000 -0.416667 
+8.337963 -3.842592 0.000000 7.726191 -3.077381 0.416667 
+6.191667 -2.175000 0.766667 0.022025 -0.019717 0.002245 
+-0.002042 -0.004246 -0.003436 -0.004441 -0.001756 -0.006601 
+-0.004742 0.001692 -0.004299 -0.004068 0.004981 -0.003143 
+-0.001470 0.004156 -0.000979 0.001546 0.000107 0.000480 
+0.000836 0.005367 -0.002859 0.002607 0.002385 0.001319 
+0.000771 0.002994 0.002072 -0.002788 0.001653 0.002085 
+-0.005935 -0.001510 0.002061 -0.002936 -0.005222 0.003443 
+-0.000780 -0.003197 0.000910 -0.001572 0.000492 0.001540 
+0.000889 0.002227 -0.000946 0.012526 -0.000169 0.003477 
+-0.002577 -0.005091 0.001701 -0.007995 -0.015244 -0.000334 
+-3.004785 -1.631579 -0.349282 -4.373444 -1.834025 0.294606 
+-4.892000 -1.504000 1.152000 -4.094650 -0.798354 1.917696 
+-2.299539 -0.032258 2.156682 -0.000719 -0.002184 0.015389 
+0.014099 0.006888 0.001803 0.020327 0.011866 -0.006988 
+0.013970 0.004714 0.000564 0.012577 0.016914 0.004011 
+0.016421 0.005312 -0.003024 0.009962 0.005184 0.006961 
+0.002043 -0.005916 0.002633 0.002471 -0.003906 0.004592 
+0.002970 -0.003429 0.002625 0.003507 -0.003922 -0.000431 
+0.003890 -0.000576 -0.002221 0.003191 0.001368 -0.001722 
+0.004552 0.000149 -0.000522 0.001356 0.002352 -0.000610 
+-0.001311 -0.001763 0.000434 -0.005397 -0.001518 -0.001221 
+-0.005360 0.000016 -0.001250 -0.001673 0.000772 0.000280 
+0.001552 0.004804 -0.002325 0.000280 -0.000154 -0.001152 
+-0.003226 -0.001507 0.003061 -0.004240 -0.002923 0.006585 
+-0.001656 -0.004683 0.006863 -0.001095 -0.003950 0.002945 
+-0.000383 -0.001345 0.000792 0.000454 0.000794 -0.000729 
+0.002038 -0.000022 -0.000574 0.003115 -0.001181 0.002526 
+0.001365 0.000058 0.005657 -0.000501 0.005826 0.008721 
+0.000208 0.008110 0.006097 -0.000688 0.001503 0.000130 
+-0.013390 -0.023714 -0.008547 -0.009236 0.015816 -0.020207 
+-0.001328 0.015500 -0.041067 -0.000916 0.007817 -0.017975 
+0.004411 0.000561 -0.005611 0.009745 -0.001252 -0.001942 
+0.018804 -0.001866 -0.002008 3.543478 -1.125000 -0.565217 
+5.429787 -1.714894 -0.510638 6.699680 -2.089457 -0.613419 
+7.522546 -2.209549 -0.734748 8.209973 -2.312336 -0.805774 
+8.791140 -2.598101 -0.854430 9.307340 -3.321101 -0.834862 
+9.422222 -4.407407 -0.644444 8.033334 -4.544445 -0.411111 
+0.051379 -0.008207 0.003263 0.014925 -0.000499 0.001016 
+-0.005705 0.007906 -0.003830 -0.009215 0.006301 -0.002940 
+-0.003106 0.000343 -0.005127 0.001944 -0.001137 -0.006120 
+0.003121 0.002217 -0.005175 -0.001579 0.002206 -0.002641 
+0.001582 -0.000973 -0.005289 0.005902 0.000564 -0.007179 
+0.001066 -0.000298 0.001414 0.004179 0.003116 0.000988 
+0.005315 -0.000896 0.001405 0.002090 -0.002957 -0.002073 
+0.000821 -0.003203 -0.001848 0.001739 0.000391 -0.001774 
+0.000488 -0.000797 0.001833 -0.004435 -0.002386 0.000631 
+-0.006913 -0.002386 0.001840 -0.005506 -0.001095 0.001977 
+-0.002011 0.001980 0.000342 -0.006434 -0.001522 -0.001763 
+-0.024971 -0.016361 -0.004438 -4.940540 -2.432432 0.702703 
+-6.352313 -2.096085 2.113879 -6.186813 -1.239011 3.057692 
+-5.099738 -0.459318 3.787402 -3.392638 0.481595 4.368098 
+-1.809917 1.739669 4.925620 -1.333333 2.648809 5.339286 
+-2.440367 0.944954 5.834862 -0.015156 -0.073725 0.049835 
+0.016559 -0.022201 0.013028 0.000679 -0.001669 -0.019861 
+0.000722 -0.002314 0.003767 -0.001741 0.000596 0.007828 
+-0.001281 -0.000498 0.003612 0.001367 -0.000381 0.000900 
+-0.000183 -0.002575 0.000753 -0.003191 -0.003253 0.000366 
+-0.001136 -0.001093 -0.000300 0.001744 0.000265 0.000633 
+0.001547 -0.000236 0.000172 -0.000711 -0.000949 -0.002105 
+-0.002049 0.001025 -0.000579 -0.001245 0.003940 0.001439 
+-0.000836 0.004203 0.002128 -0.000003 0.000912 0.000820 
+-0.000934 -0.001938 -0.001519 0.001129 -0.000532 -0.002179 
+0.003377 0.001946 -0.000813 0.002395 0.000386 -0.000977 
+-0.000712 0.000075 0.000483 -0.001475 0.001887 -0.000386 
+-0.004011 0.003522 -0.005485 -0.002137 0.001534 -0.007644 
+0.004780 -0.000430 -0.004347 0.003276 -0.000060 0.000245 
+-0.010080 -0.007981 -0.006729 -0.024550 -0.011402 0.017794 
+-0.004070 0.001808 -0.001079 0.017382 -0.007728 0.002296 
+0.024862 -0.009505 0.010789 2.977876 -1.203540 1.442478 
+4.181818 -1.197628 1.367589 5.660448 -1.201493 1.085821 
+6.839041 -1.263699 0.777397 7.551622 -1.480826 0.436578 
+8.031008 -1.720930 0.124031 8.327411 -1.961929 -0.015228 
+8.376471 -2.170588 0.008824 8.508474 -2.173729 -0.042373 
+9.227642 -2.227642 -0.617886 0.097291 -0.044109 -0.020655 
+0.049086 -0.009543 -0.011201 -0.019690 -0.046367 0.017488 
+-0.004981 0.005064 0.010799 -0.014865 0.012926 -0.004604 
+-0.010168 0.005994 -0.002730 -0.002898 0.000809 -0.001965 
+-0.002678 -0.003184 -0.002611 -0.001578 -0.000877 0.002094 
+-0.003143 0.003911 -0.000308 -0.004229 0.006038 -0.001747 
+-0.003883 0.002338 -0.001611 -0.001590 0.000548 -0.002704 
+-0.003031 -0.003361 0.003608 -0.003547 -0.005893 0.002347 
+-0.004474 -0.005529 0.003129 0.003495 -0.001244 -0.002726 
+0.000600 -0.002101 -0.004801 0.002105 0.000835 -0.002415 
+-0.006025 -0.000900 0.000606 -0.001488 0.001340 0.006418 
+-0.005391 -0.000217 0.003078 -0.001645 0.005582 0.003884 
+-0.005783 0.003488 0.004945 -0.008227 -0.007725 0.002501 
+0.000726 -0.012848 0.004309 -0.030841 -0.021636 -0.010812 
+-5.881890 -2.897638 2.251969 -6.581498 -1.176211 3.753304 
+-6.201987 0.324503 4.857616 -5.170732 1.762195 6.225610 
+-3.974843 3.040880 7.229560 -3.329545 3.795455 7.537879 
+-3.656626 3.216867 7.433735 -4.813334 -0.973333 6.573333 
+-0.019593 -0.004135 -0.017458 -0.003954 0.018877 -0.015371 
+-0.005956 0.008340 0.010778 -0.002739 0.000747 0.009730 
+-0.006771 0.000186 0.001719 -0.002112 0.002435 -0.000394 
+0.000210 0.003710 0.001866 0.000779 0.002843 0.002024 
+0.000384 0.001449 0.000954 -0.002081 -0.000752 -0.000316 
+-0.004742 -0.003635 0.000614 -0.002228 -0.002756 0.002309 
+-0.000143 -0.000080 -0.000216 -0.001584 0.000532 -0.000770 
+-0.002471 0.000762 -0.001197 -0.001333 -0.001521 -0.000526 
+0.000689 -0.004362 -0.001224 -0.002821 -0.002971 0.000741 
+-0.004363 -0.001847 0.005842 -0.005180 -0.001405 0.005853 
+-0.001042 0.000757 0.006428 -0.001168 0.001735 0.003259 
+-0.000881 0.005708 -0.006233 0.003595 0.010536 -0.026956 
+0.004221 0.008026 -0.007483 -0.017974 -0.024056 -0.012859 
+-0.000145 -0.017672 0.016369 -0.007900 0.007023 0.014649 
+-0.000038 0.003916 0.014036 2.211539 -0.319231 2.115385 
+4.061625 -0.739496 2.526611 5.270677 -1.283208 2.644110 
+6.717557 -1.526718 2.343511 8.186352 -1.291339 1.713911 
+8.845745 -0.992021 1.109043 8.859599 -1.017192 0.707736 
+8.713286 -1.426573 0.409091 8.676617 -1.915423 0.154229 
+8.319327 -2.168067 0.126050 0.058480 -0.022678 -0.008147 
+0.022484 0.015454 -0.017949 -0.009770 0.003822 0.007650 
+-0.008600 -0.003024 0.017717 -0.009601 -0.002058 0.013940 
+-0.009265 0.004411 0.001451 -0.006974 0.005539 -0.005970 
+-0.003627 0.000794 -0.004725 0.001620 -0.002009 -0.000273 
+0.001643 -0.001236 -0.003358 0.000453 0.007200 -0.005703 
+-0.003064 0.010844 0.000135 -0.003702 0.006618 0.003589 
+-0.004444 0.000630 0.004019 0.001476 -0.001690 0.001507 
+-0.000247 -0.001501 -0.001244 -0.003687 -0.004107 0.006812 
+-0.003049 0.001590 0.004855 0.004322 0.002603 0.002238 
+0.004818 0.005077 -0.000577 0.000323 -0.001549 0.001541 
+-0.004909 -0.001506 0.003735 -0.005030 -0.003758 0.002908 
+-0.005065 0.001481 0.003256 -0.000799 0.001010 0.005763 
+0.000471 0.001276 0.000617 0.001453 -0.002571 -0.002818 
+-0.007317 -0.006176 -0.002420 -0.010015 -0.012648 -0.003029 
+-0.021443 -0.004583 -0.007085 -0.033724 -0.015731 0.019603 
+-4.946745 1.763314 4.177515 -4.914980 2.773279 6.016194 
+-4.425856 3.041825 6.885931 -3.572165 2.365979 7.195876 
+-2.620000 3.730000 6.350000 -2.840909 15.613636 2.500000 
+0.007864 0.014165 -0.052038 -0.010085 0.011709 0.011535 
+-0.004059 0.003363 0.006012 -0.000190 0.002637 0.001580 
+-0.003853 0.005342 0.004218 -0.004635 0.009233 0.008443 
+0.001981 0.007346 0.009781 0.008730 0.002407 0.004155 
+0.005098 -0.000151 -0.000662 -0.005527 -0.001135 0.001906 
+-0.008533 -0.002005 0.006687 -0.002382 -0.000996 0.006885 
+-0.001091 -0.001858 -0.002291 -0.005186 0.000646 -0.002270 
+-0.002851 0.003898 -0.000057 0.000735 0.004478 0.000707 
+0.001454 0.002164 0.000271 -0.003389 0.001198 0.003645 
+-0.005060 0.001523 0.006488 -0.003581 0.002308 0.000551 
+-0.001131 0.000862 -0.001115 -0.002887 0.001954 -0.006765 
+-0.004891 0.006259 -0.020494 -0.000297 -0.000551 -0.041509 
+-0.004781 -0.022125 -0.047565 -0.014914 -0.001257 -0.029730 
+-0.021960 0.018328 0.005843 -0.007176 0.011471 0.027754 
+2.371795 1.606838 3.474359 4.137184 0.595668 3.758123 
+6.208791 -1.051282 3.783883 8.525490 -1.956863 3.462745 
+9.898374 -1.617886 2.894309 9.824035 -1.047210 2.390558 
+9.454545 -0.807487 2.010695 9.132744 -0.858407 1.761062 
+0.075700 -0.032188 0.005536 0.061890 0.012658 -0.038222 
+-0.007278 0.029750 -0.008261 -0.000571 -0.001935 -0.012497 
+0.002788 -0.001070 -0.002383 0.000836 -0.004015 0.008469 
+-0.002637 -0.006439 0.012206 -0.005682 -0.003512 0.006108 
+-0.005693 0.000495 -0.003681 -0.006357 0.000160 0.000064 
+-0.003950 0.005450 -0.007841 0.003073 0.005920 -0.013548 
+0.011473 0.015307 -0.014349 0.008115 0.001081 0.002394 
+0.003423 0.004274 0.001709 -0.002734 -0.000316 0.002255 
+-0.002217 -0.000413 0.001116 0.003081 -0.002023 0.000694 
+0.000442 -0.000934 -0.000938 0.000938 -0.000601 -0.001916 
+0.001758 -0.001099 0.000110 -0.000277 -0.000469 0.000237 
+-0.002854 0.001828 0.004110 -0.005622 0.001645 0.005524 
+-0.004521 0.003341 0.003145 -0.005537 -0.004012 0.004895 
+-0.005906 -0.004409 0.000075 0.000020 -0.002302 -0.000498 
+0.004029 0.000534 0.001590 0.005123 0.001844 0.001230 
+0.006858 0.001119 -0.002360 0.007711 -0.001243 -0.010069 
+0.000423 -0.001837 -0.012543 -0.019343 0.005846 -0.000446 
+-0.016001 0.002973 0.031293 -0.025631 -0.005296 0.030292 
+-0.023405 -0.003000 0.024781 0.011881 -0.021202 0.022068 
+0.041019 -0.045005 -0.026054 0.035118 -0.007477 -0.007692 
+-0.008442 -0.007397 0.021493 -0.007860 -0.017294 0.013385 
+-0.007998 -0.009424 0.002175 -0.003546 0.001593 0.000465 
+-0.002483 0.004972 0.003419 0.002623 0.004974 0.006648 
+0.009094 0.006368 0.006560 0.008442 0.005207 0.000066 
+0.004170 0.002778 -0.001407 -0.001611 -0.000206 0.000852 
+-0.006777 -0.004599 0.006850 0.000472 -0.007073 0.007664 
+-0.009414 -0.006980 0.003355 -0.002577 -0.004052 -0.001704 
+0.001181 0.000124 0.000520 0.002121 0.001206 0.000677 
+-0.002379 0.000713 0.000437 -0.001824 0.002755 0.002262 
+0.002780 0.005114 0.001667 0.004487 0.001840 0.001198 
+0.000015 -0.002161 -0.000646 -0.001736 -0.003512 -0.002101 
+-0.001064 -0.004662 0.000862 -0.004283 -0.020579 -0.017653 
+0.012664 -0.031333 -0.029549 0.005761 -0.003843 -0.012721 
+-0.011951 0.020540 0.020275 1.342857 3.530612 3.991837 
+3.409266 3.081081 4.918919 5.026738 1.299465 5.411765 
+7.029703 -3.306931 5.277228 11.196970 -4.348485 3.500000 
+10.453125 -0.046875 2.312500 0.062474 -0.000494 0.015153 
+0.045304 -0.003120 -0.002540 0.027601 0.000558 0.008020 
+0.011642 -0.004183 0.002584 -0.000913 0.000401 -0.000389 
+-0.004317 0.001523 -0.005464 -0.003993 0.001039 -0.004625 
+-0.005637 -0.000351 0.000545 -0.007752 -0.007965 0.005541 
+-0.009000 -0.009348 -0.000623 -0.003566 -0.004109 -0.003566 
+0.000859 -0.000703 -0.001328 0.005524 0.005493 0.000679 
+0.004921 0.011619 -0.003873 0.002522 0.011654 0.000540 
+0.001607 0.002263 0.002099 0.003343 0.001034 -0.000440 
+0.000670 -0.000714 0.001842 0.000070 -0.000315 -0.000042 
+-0.000682 0.001387 -0.000235 0.000117 -0.000350 -0.002500 
+-0.003105 -0.000846 -0.000142 0.000794 0.001111 -0.002698 
+-0.000976 -0.000488 -0.003701 -0.002441 -0.001102 0.000000 
+-0.003072 0.001425 0.002040 -0.003669 0.000280 0.003376 
+-0.005285 -0.000536 0.003192 -0.004492 -0.001778 0.005107 
+-0.001747 -0.003593 0.004005 -0.001031 -0.001870 -0.001450 
+-0.001101 0.003438 -0.000771 0.001688 0.007785 -0.001260 
+0.006453 0.008300 -0.002153 0.011107 0.002105 -0.007122 
+0.008087 -0.000496 -0.005494 -0.000326 -0.000073 0.000761 
+-0.004000 -0.000478 0.005007 -0.002061 -0.000408 0.003528 
+-0.000302 0.001091 -0.000166 0.005536 0.008973 -0.001663 
+0.009945 0.006464 -0.004569 0.006111 0.001315 -0.004714 
+0.003785 -0.004582 0.000549 -0.003620 -0.007864 0.002451 
+-0.005830 -0.002406 -0.000756 -0.003100 0.001938 -0.000459 
+-0.004701 0.001941 -0.002249 0.000268 0.000379 0.000352 
+0.006102 0.005683 -0.001318 0.002764 0.003970 -0.002267 
+0.002444 0.001848 -0.001654 -0.000753 -0.001456 0.000515 
+-0.005112 -0.003417 0.002941 -0.004774 -0.004591 0.003304 
+-0.003697 -0.003247 -0.002390 -0.001578 -0.004704 -0.000324 
+-0.000271 -0.004218 0.000134 -0.002231 -0.002352 -0.001008 
+-0.003750 0.000944 0.000277 -0.000475 0.004482 0.003090 
+0.002364 0.003895 0.002876 0.002062 0.000006 -0.000402 
+-0.001113 -0.001224 -0.000634 -0.002665 0.000292 -0.001797 
+0.001141 -0.005045 0.003755 -0.007587 -0.009345 -0.009834 
+0.025955 -0.003211 -0.045685 0.008833 0.011269 -0.006765 
+0.699386 2.705522 3.926380 0.690476 3.966667 5.633333 
+0.778443 4.640718 6.287425 -0.004112 0.002679 0.053502 
+0.016261 -0.001869 -0.013141 0.004168 -0.006393 -0.012744 
+-0.001604 0.000194 -0.001074 -0.013784 0.004320 -0.002803 
+-0.009640 0.004742 -0.020115 -0.003777 -0.000613 -0.023041 
+-0.000457 0.000091 -0.014918 -0.003536 0.003234 -0.007472 
+-0.001989 0.005335 0.000294 -0.001221 -0.001439 -0.000028 
+-0.005078 -0.001529 -0.001864 -0.004165 0.000319 -0.004486 
+-0.006484 0.000252 -0.000288 -0.001151 0.000354 -0.000688 
+0.001618 0.001035 -0.000188 0.000389 -0.000574 0.002001 
+-0.006100 -0.004923 -0.000267 -0.001943 0.001732 0.000854 
+-0.001863 0.000203 -0.006116 -0.002509 0.002180 -0.006691 
+-0.004123 0.002296 -0.005414 -0.004843 0.001616 -0.004306 
+-0.004154 0.001381 -0.001412 -0.002048 0.000611 -0.001574 
+-0.000638 -0.000369 -0.000512 0.003480 0.002135 -0.001794 
+0.003771 0.000611 -0.002244 -0.001097 0.000454 -0.001175 
+-0.004127 -0.000322 0.002605 -0.003982 0.000303 0.003268 
+-0.001962 0.001721 -0.000619 0.003116 0.002840 -0.001696 
+0.002820 -0.000673 -0.003423 0.001361 -0.001146 -0.003293 
+-0.002562 -0.001257 -0.000624 -0.002499 0.003105 0.000530 
+-0.000709 0.001275 -0.000991 0.002400 -0.000454 0.000038 
+0.002910 0.000590 0.000551 0.005159 -0.002416 -0.000767 
+0.004463 -0.000956 -0.004053 0.002239 0.001056 -0.007371 
+-0.001025 0.001849 -0.005464 -0.001487 0.000036 -0.001320 
+-0.000607 0.000344 -0.000443 0.001933 0.003953 -0.001868 
+0.003414 0.005732 -0.001029 -0.000133 0.000226 0.000042 
+-0.003909 -0.003102 -0.003180 -0.003171 -0.003378 -0.005337 
+-0.006981 -0.005556 -0.009871 0.000121 0.005535 -0.000999 
+0.006412 0.005613 -0.010614 0.003670 -0.000837 -0.003678 
+-0.001065 -0.003386 0.000113 -0.004112 -0.000860 0.000687 
+-0.002942 0.001332 0.001546 0.000951 0.001787 0.000288 
+0.002286 0.000791 -0.000296 0.001325 -0.000760 0.000384 
+0.000402 -0.001501 0.000072 -0.000389 -0.000952 -0.000285 
+0.000733 0.000998 0.000446 0.000982 0.003404 0.001968 
+-0.000508 0.003526 0.003480 0.001601 0.002468 0.001520 
+0.002334 0.003926 0.001636 -0.001776 0.003169 0.000382 
+-0.005093 -0.004942 -0.003815 -0.011733 -0.002487 -0.009909 
+-0.020800 0.017843 -0.008253 0.028155 0.015937 -0.010846 
+0.029260 0.013687 0.043447 1.680412 3.989691 5.608247 
+-0.011389 -0.008830 0.032744 -0.018114 0.008973 0.004378 
+-0.007146 -0.002921 -0.013050 -0.003640 -0.000220 -0.013877 
+-0.006445 0.002061 -0.000800 -0.007692 0.002981 0.001612 
+-0.006370 0.001480 -0.005073 -0.003928 -0.001133 -0.005807 
+0.002419 0.006039 -0.008205 -0.000703 0.006312 -0.005380 
+-0.003057 0.003102 -0.003746 0.002049 -0.001200 -0.004536 
+0.004788 -0.000734 -0.005221 0.001104 -0.001898 -0.002928 
+-0.001165 0.002321 -0.004055 -0.002932 0.000335 -0.001759 
+-0.001267 -0.000996 -0.000061 -0.000697 -0.000921 0.000303 
+-0.001714 0.001287 -0.000269 -0.003433 -0.001076 -0.003765 
+0.000139 0.002551 -0.000809 -0.000958 0.004516 -0.005879 
+-0.000436 0.008058 -0.005953 -0.000087 0.001354 -0.006138 
+-0.003158 0.001112 -0.001436 -0.003917 -0.000172 -0.002088 
+-0.000485 0.001647 -0.005557 0.001233 -0.003273 -0.003072 
+-0.000168 -0.003215 -0.003300 -0.001134 -0.000357 -0.000809 
+-0.000181 0.000362 -0.000336 0.000709 0.001276 -0.000425 
+0.000301 0.000420 -0.000032 -0.001423 0.001423 0.000462 
+-0.000517 0.002326 0.000551 0.000461 0.003491 0.000724 
+-0.000273 0.000884 0.002444 -0.000666 0.001499 0.002480 
+-0.002544 -0.000060 0.003165 -0.003193 0.001022 0.000092 
+0.000612 0.000369 0.001018 0.003200 -0.001040 0.002160 
+0.001075 0.000430 -0.000430 0.002055 -0.000248 -0.002459 
+-0.000354 -0.001593 -0.002655 -0.001773 -0.004587 -0.001868 
+-0.006779 -0.003600 -0.002984 -0.007706 -0.000059 -0.001629 
+-0.003499 0.000367 -0.000310 -0.000695 -0.002834 -0.001429 
+-0.001516 -0.005016 -0.003485 0.000969 -0.007117 -0.002685 
+-0.004548 -0.011698 -0.001297 -0.002042 0.003926 -0.006439 
+0.003037 0.002376 -0.005663 -0.005921 -0.003789 0.002642 
+-0.012502 -0.001533 0.002270 -0.007671 0.000672 0.001917 
+-0.000217 -0.000060 0.000044 0.002290 -0.000050 -0.000769 
+0.001716 0.001309 0.001275 -0.000473 0.003125 0.002521 
+-0.001763 0.005521 0.002698 -0.000108 0.006794 0.002226 
+0.002229 0.002963 0.002084 0.004500 -0.006290 0.001185 
+0.005957 -0.006672 -0.007592 0.006598 -0.002968 -0.007426 
+0.006202 0.002393 -0.001817 0.000884 0.001946 0.000756 
+-0.002961 -0.002846 -0.001896 -0.006643 -0.002542 -0.003096 
+-0.000090 0.006509 -0.002661 0.000766 0.007105 -0.003990 
+-0.004594 0.000921 0.000284 -0.008791 -0.012541 -0.012475 
+-0.003974 -0.005915 -0.019427 -0.006851 0.000917 -0.012007 
+-0.006925 0.002198 -0.004874 -0.009626 0.002511 0.002077 
+-0.008423 -0.002063 0.006079 -0.000753 -0.001012 0.001864 
+-0.003311 -0.000378 -0.000450 -0.000126 -0.000203 0.000320 
+0.002525 -0.000050 -0.001328 0.000644 -0.002052 -0.002170 
+-0.000630 -0.000387 -0.000177 -0.004246 -0.004246 0.004127 
+-0.005082 -0.003770 0.005164 -0.000421 0.000391 0.000751 
+0.000370 0.000740 -0.002466 -0.002811 0.001646 -0.001063 
+-0.002600 0.000054 0.002048 -0.000122 0.001008 -0.000729 
+0.001307 0.003305 0.001691 0.001977 0.001769 0.000981 
+-0.001756 -0.000687 -0.002519 -0.006534 0.001692 -0.001633 
+-0.004674 0.002868 -0.001558 -0.001679 -0.001401 0.000656 
+-0.003651 0.000990 0.001584 -0.003459 -0.000174 -0.001406 
+-0.000412 0.000931 -0.003199 0.002163 -0.000104 -0.002658 
+0.001742 0.000473 -0.000177 0.000705 0.001364 -0.002039 
+-0.000150 -0.002293 -0.002293 -0.002481 -0.002932 0.000677 
+-0.001098 -0.002424 -0.001098 -0.003936 0.001467 0.002561 
+-0.002775 0.004024 0.001989 -0.002698 0.001868 0.002802 
+-0.001695 0.000073 0.006119 -0.005643 -0.009171 0.006702 
+-0.000134 -0.008289 -0.001605 -0.001531 -0.002064 -0.004610 
+0.001429 0.001345 -0.000504 0.000452 0.004145 0.000641 
+-0.002874 0.003459 0.001277 -0.002187 -0.000378 0.003415 
+-0.002971 -0.002919 0.002063 -0.001307 -0.002351 0.001113 
+-0.000542 0.004823 -0.002353 -0.001100 0.012854 -0.000170 
+0.002769 0.009534 0.003209 0.006804 -0.002176 -0.001755 
+0.007809 -0.004193 -0.003489 0.003707 -0.004019 -0.002291 
+-0.008086 -0.007836 -0.003001 -0.005136 0.004031 0.004970 
+-0.001215 0.004094 -0.002495 0.000742 0.000863 0.000265 
+-0.001434 0.000719 0.000578 -0.001814 -0.000984 -0.000245 
+-0.003159 -0.003657 -0.001338 -0.003889 -0.003338 -0.001795 
+-0.002779 -0.000803 -0.000989 0.000026 0.001342 0.000826 
+0.004421 0.001439 0.001089 0.004727 -0.000748 -0.000238 
+-0.001649 -0.002564 -0.001533 -0.003380 -0.002075 -0.007979 
+-0.011466 -0.007158 -0.009867 0.003344 -0.000110 -0.006979 
+0.003123 -0.002461 -0.003796 -0.002544 -0.000828 -0.000151 
+-0.006271 -0.000954 -0.001071 -0.006011 -0.001519 -0.000751 
+-0.004310 -0.000852 -0.000213 -0.001206 0.001108 -0.000539 
+-0.002223 0.001981 -0.003324 -0.004835 0.004165 -0.001223 
+-0.004611 0.003986 -0.002155 -0.003063 0.001331 -0.002957 
+-0.003514 -0.003274 -0.001535 0.000718 -0.000858 0.001837 
+-0.002496 0.000208 0.002520 -0.001922 -0.000791 0.001922 
+-0.000407 0.000171 -0.001220 0.001356 0.000188 -0.004358 
+0.004874 0.000051 -0.003528 0.006457 0.003927 -0.001125 
+0.004771 0.003564 0.000524 0.000375 -0.000104 0.001020 
+-0.002770 -0.003554 0.000241 -0.004242 -0.000372 -0.003236 
+-0.002965 -0.000174 0.001686 -0.004444 -0.002343 0.001202 
+-0.003928 -0.001602 -0.002041 -0.003139 -0.000092 -0.001746 
+-0.002492 0.001919 -0.001212 -0.003203 0.000733 0.001276 
+-0.001348 -0.003164 0.001142 -0.000855 -0.002748 0.002018 
+-0.002427 -0.000773 0.000827 -0.002867 0.001542 -0.003091 
+-0.000456 0.002511 -0.002968 -0.001824 -0.000526 -0.001095 
+0.001626 0.002590 -0.003913 0.002466 0.002986 -0.001164 
+0.000551 0.003668 0.000363 -0.002107 0.001130 -0.000412 
+-0.003766 -0.002625 -0.001483 -0.003444 -0.002818 -0.001567 
+0.000013 -0.000129 0.000245 0.000084 0.002511 -0.001702 
+0.000711 0.004293 -0.000718 -0.001128 0.000051 -0.000590 
+-0.003231 -0.001088 0.002719 -0.003150 -0.000444 0.004927 
+-0.004291 -0.003219 0.003643 -0.003039 -0.001313 -0.000375 
+-0.002402 0.002031 -0.003219 0.002479 -0.001913 -0.001739 
+0.004081 0.000950 -0.001586 0.001555 0.001296 0.000465 
+0.001234 0.000253 -0.000662 0.003552 0.000636 -0.003132 
+0.004570 0.001834 -0.003521 0.000330 0.000512 0.001000 
+-0.006090 -0.002631 0.005248 -0.008183 -0.003467 0.003708 
+-0.005142 -0.003165 -0.001621 -0.006302 -0.004129 -0.005413 
+-0.002386 -0.002739 -0.008535 -0.003963 -0.005969 -0.008309 
+-0.005335 0.001607 -0.008366 -0.001746 0.002091 -0.010434 
+-0.000272 0.003517 0.002322 0.006397 0.005257 0.002177 
+0.005944 0.002003 0.000097 0.005690 0.001307 0.000441 
+0.005289 0.003121 0.002053 0.003670 0.004358 0.002186 
+0.001135 0.001070 0.000362 -0.001891 -0.004047 -0.001089 
+-0.005334 -0.005178 0.000767 -0.009368 -0.002187 0.005033 
+-0.012789 0.000499 0.004758 -0.011613 0.000323 0.001935 
+-0.008357 -0.002378 -0.003989 -0.008193 -0.006681 -0.002828 
+-0.010037 -0.007322 -0.003867 -0.008628 -0.005009 -0.000765 
+-0.005170 0.002041 0.000272 -0.003615 0.001661 0.000649 
+-0.001907 0.001550 0.004868 0.001001 0.000690 0.004364 
+0.001861 -0.001439 0.001510 0.000531 -0.001613 0.000438 
+0.000937 -0.000213 -0.000054 0.000699 -0.004461 0.002015 
+-0.002308 -0.009234 0.004370 -0.002627 -0.001695 -0.001695 
+0.001266 -0.001529 -0.002508 0.003594 -0.001444 -0.004423 
+0.000038 -0.000513 -0.000327 -0.004886 0.001197 0.001080 
+-0.002287 0.002747 0.000298 0.001969 0.003910 0.000982 
+0.002787 0.002939 -0.000305 0.000669 0.000814 0.000755 
+-0.002856 0.001604 0.001804 -0.002866 0.001403 -0.000112 
+-0.002846 0.001570 -0.002001 -0.001929 0.001304 -0.004375 
+-0.001922 -0.001795 0.001344 -0.003601 0.002559 0.001293 
+-0.000952 0.004231 0.001248 0.002318 0.002795 -0.002388 
+-0.001194 -0.000260 -0.000579 -0.003905 0.000274 -0.000995 
+-0.003862 0.001353 -0.003004 -0.003242 0.001311 -0.003883 
+-0.000647 0.000108 0.000108 -0.000831 0.001338 -0.001001 
+0.000338 0.002505 -0.001348 0.000629 0.001287 -0.000867 
+-0.001550 0.000000 0.001240 0.000000 -0.005846 0.003154 
+-0.003238 -0.006762 0.001175 -0.002817 -0.003152 0.000336 
+-0.000154 -0.000772 -0.003307 0.002158 0.002239 -0.002932 
+0.000286 0.002334 -0.001387 -0.001068 -0.000379 -0.001406 
+-0.001570 -0.001324 0.000637 -0.001146 0.001345 -0.000305 
+-0.000411 0.002541 -0.000215 0.003393 0.002124 -0.001904 
+0.001856 -0.002246 -0.000347 0.000282 -0.002990 -0.001036 
+-0.001408 -0.003561 -0.001420 -0.005605 -0.003153 -0.000330 
+-0.007393 -0.001381 0.001373 -0.005445 0.000854 0.002623 
+-0.001175 0.000900 0.001591 0.000992 -0.000770 -0.002997 
+-0.000534 -0.001743 -0.007424 0.001645 -0.002579 -0.008121 
+0.002321 0.004057 -0.007276 0.002052 0.007062 -0.008202 
+0.001776 0.003735 -0.003164 -0.005909 -0.003344 0.000130 
+-0.007584 -0.011126 0.001155 -0.009929 -0.008276 -0.003971 
+-0.003158 -0.003006 -0.000687 0.002759 0.001543 0.000445 
+0.003284 0.003401 0.001035 0.001611 0.004667 0.000713 
+0.001589 0.004555 0.000583 -0.001532 0.001665 0.001376 
+-0.004475 -0.002391 0.004831 0.000393 -0.003689 0.003758 
+-0.002652 0.000210 -0.003186 -0.008302 -0.003740 -0.001027 
+-0.002133 -0.003862 0.001054 -0.001099 0.003657 -0.002526 
+-0.002389 0.007234 0.001264 -0.002167 0.006741 -0.001757 
+-0.004012 0.003594 -0.001162 -0.004173 0.002647 -0.000052 
+-0.001666 0.002993 0.001949 0.000574 0.002446 0.002552 
+0.000632 0.000647 0.001439 0.000493 -0.000426 -0.000172 
+-0.003576 -0.002522 0.000096 -0.006327 0.000955 0.000359 
+-0.007582 -0.001765 -0.000973 -0.003724 -0.002717 -0.003419 
+-0.002274 0.001427 -0.003084 0.002656 0.000730 -0.001007 
+0.001290 0.001532 -0.001813 0.000373 0.002504 0.000236 
+-0.000987 0.001790 0.000774 -0.000552 -0.000595 0.000068 
+-0.000076 -0.001603 0.002519 -0.002903 0.002516 0.001258 
+0.000496 0.004646 -0.002991 -0.001085 0.006135 -0.004788 
+-0.005093 0.001939 -0.001254 -0.000502 -0.000533 0.000745 
+-0.003187 0.001945 -0.002015 -0.003535 -0.000336 -0.000924 
+0.000547 0.000377 0.000200 0.002782 0.001925 0.000569 
+0.001865 0.000016 0.000654 -0.000139 -0.000581 -0.002020 
+-0.000716 -0.001350 -0.003499 -0.001568 -0.002195 -0.001484 
+-0.000166 -0.000666 -0.000490 0.002433 -0.000467 -0.000087 
+0.001228 0.001439 0.000854 0.000658 0.001429 0.000549 
+0.000187 -0.001573 0.002320 -0.002188 -0.000818 0.000276 
+0.003043 -0.006419 0.006752 0.002068 -0.005108 -0.001013 
+-0.000148 -0.001005 -0.000550 0.000116 0.001746 0.000093 
+-0.000160 -0.001106 0.000123 0.002063 -0.001016 -0.000508 
+0.004440 -0.001531 0.000131 0.002820 -0.001224 -0.000443 
+-0.002046 0.002216 -0.000852 -0.001824 0.000782 0.002864 
+-0.000819 -0.000193 0.001904 -0.000591 0.000748 -0.001548 
+-0.000475 -0.000211 -0.004379 -0.002563 0.000279 -0.002366 
+-0.005514 0.000634 -0.000681 -0.005565 0.000755 0.003020 
+-0.001140 0.005074 0.002173 -0.001965 0.008069 0.000596 
+-0.001531 0.006415 0.003197 -0.001917 0.004141 0.001494 
+-0.005250 -0.000656 0.004490 -0.003887 -0.009394 -0.001334 
+-0.005301 -0.014667 -0.001871 -0.007095 -0.016410 -0.001903 
+-0.007352 -0.012927 -0.000281 -0.005541 -0.006114 0.001277 
+-0.003499 -0.002013 0.005117 -0.014054 0.000483 -0.000970 
+-0.013333 -0.002537 -0.000951 -0.005493 0.002612 -0.008172 
+0.012309 0.005058 -0.005078 -0.001595 0.013454 0.002477 
+0.009876 0.011912 -0.012950 0.010069 0.002467 -0.009610 
+0.008154 -0.002543 -0.005927 0.004714 -0.004139 -0.002522 
+0.002260 -0.002801 -0.000367 -0.000460 0.000403 -0.000666 
+-0.002285 0.001107 -0.002061 -0.002703 0.001069 -0.003180 
+-0.002430 0.000759 -0.001678 -0.003362 0.001327 0.000245 
+-0.003288 0.001286 0.000187 -0.002555 0.000719 -0.000763 
+-0.002709 0.000891 -0.001454 -0.005200 -0.000169 -0.000034 
+-0.005636 -0.000231 0.002479 -0.002814 0.000712 0.003402 
+-0.001705 0.001818 0.001705 0.000114 0.001538 -0.000909 
+-0.000127 0.000737 -0.002494 -0.002179 0.002653 -0.002463 
+-0.001428 0.005293 -0.001104 -0.001224 0.006576 -0.003160 
+0.000000 0.004800 -0.003200 0.001683 0.002019 -0.000673 
+0.000930 0.000388 0.000775 -0.000781 0.000547 -0.000234 
+-0.000126 -0.000252 -0.002047 0.000178 0.001420 -0.003846 
+0.002068 0.001171 -0.004761 -0.002134 0.000071 -0.004885 
+-0.002880 0.000508 -0.005928 -0.003457 -0.000359 -0.003120 
+0.000608 -0.000478 -0.000579 0.000952 0.000113 -0.000323 
+-0.001102 -0.000824 -0.001578 -0.003164 -0.003602 -0.003320 
+-0.002670 -0.004658 -0.002651 -0.003231 -0.000130 -0.000990 
+-0.000366 0.001255 0.002458 -0.001638 0.000276 0.002153 
+-0.000076 0.000082 -0.000123 0.002375 0.003326 0.000713 
+0.000613 0.002382 0.001198 0.000189 -0.000189 0.003106 
+-0.000038 -0.007348 -0.000038 0.001367 -0.002773 0.000312 
+-0.002120 0.002120 0.001120 0.000000 0.001290 -0.002097 
+-0.003567 0.001745 -0.002947 -0.000278 0.002675 -0.001074 
+0.005063 0.002626 -0.002947 0.002561 -0.003211 -0.005198 
+0.002927 -0.003702 -0.006028 0.001988 0.000716 -0.004376 
+-0.002142 0.000643 -0.001661 -0.003630 0.000899 -0.001645 
+-0.003644 0.000581 -0.002052 -0.001782 0.000444 -0.000939 
+0.001607 -0.000727 -0.000385 0.003009 -0.001838 0.001514 
+0.001446 -0.002045 0.001734 0.000556 0.004324 0.001602 
+0.007949 0.007384 0.002111 0.010019 0.005821 -0.000117 
+0.003365 0.001651 -0.000504 -0.002209 0.001386 -0.003616 
+-0.004742 -0.005178 -0.002678 -0.000946 -0.002850 -0.000827 
+0.000856 -0.002982 -0.001035 -0.001258 -0.004781 -0.001181 
+-0.004905 -0.006610 0.001998 -0.002135 -0.005313 0.001825 
+0.006166 0.001515 0.000865 -0.000647 -0.001028 -0.000871 
+0.003270 -0.003716 -0.002865 0.009021 0.001769 -0.007645 
+-0.006932 0.001889 -0.001606 -0.003310 -0.001352 -0.000587 
+-0.005059 -0.006477 -0.004897 -0.009481 -0.007590 -0.007848 
+-0.008303 -0.005611 -0.007357 0.001176 -0.008824 -0.001961 
+0.001323 -0.004003 -0.002738 -0.001014 -0.000171 -0.001787 
+-0.002757 0.002225 -0.000861 -0.006092 0.002543 0.000611 
+-0.004298 -0.001860 0.002424 0.000844 0.000402 -0.001889 
+0.003662 0.003541 -0.005004 0.004307 0.004463 0.000052 
+0.002343 0.006333 -0.005552 0.002356 0.002528 -0.006014 
+-0.000086 0.000416 -0.005328 -0.003004 0.000449 -0.003539 
+-0.005710 0.001767 -0.000517 -0.006920 0.003256 0.002146 
+-0.004723 0.002879 0.003208 -0.000767 0.001547 0.001058 
+-0.000155 0.001690 -0.005070 0.004331 0.003189 -0.005472 
+0.004812 0.004739 -0.004921 -0.002571 0.005134 -0.003845 
+-0.001427 0.004430 0.002280 -0.001388 0.000431 0.005057 
+0.000735 0.001132 0.003397 0.002331 -0.001193 0.000084 
+-0.001363 -0.001567 -0.002214 -0.004180 0.000540 -0.000993 
+-0.001846 0.002074 0.000038 0.000806 0.000242 0.001048 
+0.002873 0.000867 0.000298 0.000536 0.001327 0.000433 
+0.000067 0.002518 0.000728 -0.001667 0.001372 -0.004705 
+-0.003813 -0.001169 0.001446 -0.000859 -0.000981 -0.000179 
+-0.000006 0.001070 -0.003657 -0.001630 0.002271 -0.000324 
+-0.002626 0.000220 0.001626 -0.001771 0.000153 -0.001328 
+0.000264 -0.001997 -0.001021 -0.000137 -0.005238 0.000759 
+-0.002743 -0.000707 0.000172 -0.002672 0.000582 -0.002434 
+-0.001887 -0.000080 -0.004134 0.005538 0.000000 -0.007231 
+0.004574 0.001346 -0.005652 0.002743 0.000280 -0.002760 
+0.002263 0.000529 -0.004332 -0.000188 0.002559 -0.006738 
+-0.001547 0.004640 -0.004748 0.001885 0.000960 -0.001956 
+0.001115 -0.000413 0.002024 0.002504 -0.002623 0.003910 
+0.002662 -0.004001 0.001897 0.005051 -0.003749 -0.004369 
+0.010148 -0.001754 -0.009016 0.010285 0.008962 -0.007037 
+0.010785 0.006143 -0.005014 0.010602 0.004354 -0.002687 
+0.008097 0.004063 -0.003994 0.006866 0.005144 -0.006324 
+0.005624 0.004612 -0.005071 0.004035 0.005043 -0.003973 
+0.003718 0.008972 -0.002313 -0.004955 0.006481 -0.007961 
+0.000082 0.002859 -0.005554 -0.005102 -0.008733 0.008151 
+0.002827 -0.009625 0.008405 -0.000540 0.001057 0.000303 
+-0.003111 0.013548 -0.001637 -0.005491 0.017420 -0.014138 
+-0.012882 0.007952 -0.012745 -0.011765 0.007307 -0.009772 
+-0.009568 0.008050 -0.011251 -0.012598 0.006200 -0.010091 
+-0.018318 0.003581 -0.002754 -0.005350 0.004489 -0.002336 
+-0.000211 0.000365 0.000168 0.001671 0.001306 0.003445 
+0.000811 0.001237 0.001076 -0.002358 -0.000493 0.000772 
+0.000328 0.003734 -0.004128 0.003167 -0.000132 -0.002573 
+-0.001458 -0.000495 -0.000260 -0.003626 -0.002243 0.002636 
+0.000660 -0.001829 0.000300 0.000611 -0.001546 0.000036 
+0.000655 -0.000602 0.000278 -0.004286 -0.004041 0.002425 
+-0.007647 -0.006126 0.002042 -0.005546 -0.001457 -0.000162 
+-0.000246 0.001623 0.000295 0.000755 0.001252 -0.004650 
+-0.000406 -0.001766 -0.003203 -0.001296 -0.000833 -0.001684 
+-0.001061 0.000212 0.000346 -0.000094 0.000694 0.001250 
+-0.000739 0.001543 0.001896 -0.002197 0.001470 0.001494 
+0.000115 0.000360 0.001235 0.002347 -0.000874 -0.000056 
+0.002385 -0.000315 -0.000495 -0.000558 -0.000667 0.000372 
+-0.004012 -0.001851 0.001234 -0.003115 -0.000276 -0.000643 
+-0.000324 -0.001130 -0.002017 0.001060 0.001138 -0.002788 
+-0.000985 0.001311 -0.001315 -0.000677 -0.000427 -0.000366 
+-0.005469 -0.008439 0.005487 -0.004240 -0.002140 0.003841 
+0.001409 0.002755 0.000660 0.001105 0.001539 0.000562 
+-0.004330 -0.000892 0.003394 -0.000615 -0.001208 -0.000739 
+0.004006 -0.002358 -0.000225 0.004456 -0.001090 -0.002148 
+0.000519 -0.002932 -0.000371 0.001194 0.001159 0.001932 
+0.001859 0.001293 0.001434 -0.000340 -0.000316 -0.000494 
+0.001884 -0.004096 -0.006943 0.002778 0.001642 -0.004168 
+-0.000916 -0.002106 0.001903 -0.000880 -0.003263 0.003628 
+0.000268 -0.001617 0.003779 -0.000340 0.000385 0.002422 
+-0.000368 0.001023 0.002502 0.000676 0.001809 0.003275 
+-0.002661 -0.000589 0.003740 -0.006094 -0.002650 -0.000479 
+-0.014349 -0.002175 -0.005585 -0.021030 0.004293 -0.006752 
+-0.019997 0.005231 -0.002725 -0.019179 0.002129 0.001345 
+-0.017506 -0.002136 0.004096 -0.011755 -0.004040 0.005498 
+-0.002665 -0.001079 0.003185 0.002085 0.005440 -0.005059 
+-0.002125 0.000439 -0.001985 -0.002364 0.005203 -0.001290 
+-0.004085 0.014590 -0.004668 -0.010247 0.012221 -0.002216 
+-0.003235 0.001740 0.001856 0.002551 -0.001341 -0.000733 
+0.007560 0.007487 -0.003532 0.002999 -0.002074 0.000114 
+0.011444 -0.003058 0.009484 0.015859 -0.002734 0.010303 
+0.016164 -0.001014 0.010448 0.014568 -0.000124 0.009051 
+0.012690 0.000695 0.003549 0.008451 0.000216 -0.001491 
+-0.000521 0.001009 0.000085 -0.001195 0.000897 0.004045 
+-0.001145 0.000061 0.001439 0.000764 0.001140 -0.003490 
+0.001466 -0.003045 -0.003609 0.000576 -0.001745 -0.005819 
+0.002268 0.001314 -0.005785 0.000133 0.001264 -0.007046 
+-0.001796 0.001241 -0.007741 0.000473 0.004092 -0.005404 
+-0.004126 0.004013 -0.003343 -0.005608 -0.002739 -0.003869 
+0.000429 -0.001838 -0.000187 0.000420 -0.001261 -0.000840 
+-0.000258 -0.002650 0.002638 0.000116 -0.000868 0.000868 
+0.000176 0.001343 -0.000191 0.001483 0.001386 -0.000458 
+-0.001965 0.000466 0.000738 -0.002739 0.002742 0.001815 
+-0.002485 0.003619 -0.001461 -0.004029 0.002618 -0.003760 
+-0.003111 0.003002 -0.003039 -0.001757 0.000950 -0.001843 
+-0.001645 0.000595 0.000247 -0.004051 -0.000322 0.000509 
+-0.001495 -0.002272 -0.000602 -0.002657 -0.002326 -0.001548 
+-0.001159 0.000262 0.000281 0.001313 -0.002308 -0.000975 
+0.000071 -0.001595 -0.000835 -0.003211 -0.000766 0.000219 
+0.000353 -0.000738 -0.001114 0.003096 -0.001498 -0.001712 
+0.003811 0.000562 0.000635 0.001550 0.004029 0.001775 
+0.000174 0.002712 -0.001454 -0.003232 -0.001010 -0.001414 
+-0.002430 -0.006002 -0.000683 -0.001098 -0.002515 -0.001311 
+0.001418 0.001314 0.001223 0.002862 0.001164 0.001795 
+0.001186 -0.000123 0.000368 -0.001180 -0.000803 -0.000363 
+-0.000662 0.000029 -0.000960 0.002930 0.000287 -0.003105 
+0.003833 0.003784 -0.001880 0.000989 0.003466 -0.003632 
+-0.003124 -0.000479 -0.002538 -0.006117 -0.002419 -0.004186 
+-0.013908 0.000000 0.005563 -0.010689 0.012511 -0.003482 
+-0.026677 0.010839 -0.005643 -3.751553 0.484472 -0.509317 
+-4.480447 0.357542 -0.413408 -4.612903 0.262673 -0.027650 
+-4.249057 0.154717 0.430189 -3.864583 0.020833 0.850694 
+-3.768627 -0.078431 1.313725 -3.820652 -0.038043 1.777174 
+-0.032648 0.002288 0.017833 -0.011503 -0.002452 0.007865 
+0.003365 -0.012458 0.003463 -0.003070 -0.009099 0.002292 
+-0.025384 -0.003739 -0.000778 -0.017653 0.005735 -0.001072 
+-0.006289 0.007317 -0.000072 -0.000581 0.007988 -0.002928 
+0.002099 -0.001131 0.000991 0.018529 0.003865 0.015484 
+3.442424 0.539394 1.618182 3.891213 0.263598 1.887029 
+3.996416 0.082437 2.000000 3.913208 0.101887 1.954717 
+3.590698 0.320930 1.641860 0.026899 0.009272 0.014114 
+0.014662 0.001530 0.009407 0.001870 -0.005464 -0.000367 
+-0.001308 -0.001108 -0.000079 0.000660 0.001089 -0.000277 
+-0.000476 0.000578 -0.000529 0.000594 0.000494 -0.000175 
+0.003723 0.002217 -0.005697 0.005617 0.002077 -0.006044 
+-0.002484 0.000591 -0.003471 -0.005075 0.002353 0.001456 
+-0.007267 -0.003451 -0.000322 -0.000598 -0.002139 -0.003892 
+0.002503 -0.002540 0.000042 0.003935 -0.005276 0.003463 
+0.004609 -0.006382 0.003156 0.003847 -0.003166 -0.000552 
+0.000232 0.000747 -0.000032 -0.005745 0.002710 0.000759 
+-0.009089 0.001172 0.001120 -0.005882 -0.001873 0.000427 
+-0.001320 0.000054 -0.001943 0.000137 -0.000345 0.001820 
+-0.000967 -0.002896 0.004829 -0.002339 -0.006397 0.000638 
+0.000200 -0.005811 -0.002622 0.001117 -0.004605 -0.001942 
+-0.000491 -0.000891 -0.000935 -0.003073 0.001222 0.000913 
+-0.007083 0.001728 0.001507 -0.008161 -0.002355 0.001960 
+-0.005241 0.002835 -0.003559 -0.005143 -0.000472 -0.002111 
+-0.000754 0.003203 0.003014 -0.003593 0.000817 0.001799 
+-0.002944 -0.001727 -0.001629 -0.001778 -0.000370 -0.004593 
+0.000293 -0.001376 -0.000408 0.002128 -0.000324 0.000135 
+0.001756 -0.000039 0.000630 0.001497 0.000559 -0.000044 
+0.000878 0.003706 0.000609 0.000184 0.005954 0.000074 
+-0.000146 0.004015 -0.000073 0.001294 0.001375 0.000269 
+0.003670 0.000022 0.000485 0.002272 0.001283 -0.001505 
+0.002014 0.003523 -0.001678 0.001067 0.004103 -0.000101 
+-0.005754 0.003777 -0.003555 -0.006835 0.008580 -0.010652 
+-0.028047 0.006587 -0.005099 -4.540146 0.912409 -0.817518 
+-5.730337 0.713483 -0.780899 -6.142260 0.669456 -0.640167 
+-6.049181 0.665574 -0.347541 -5.824363 0.549575 0.084986 
+-5.584487 0.351801 0.634349 -5.270769 0.209231 1.273846 
+-4.805448 0.198444 1.906615 -4.084746 0.259887 2.338983 
+-0.027695 -0.001069 0.016728 0.007810 -0.021889 0.000426 
+0.016045 -0.014563 -0.007238 -0.015225 -0.007054 -0.000292 
+-0.025984 -0.002171 -0.006403 -0.016762 -0.000815 -0.003914 
+-0.004879 -0.007972 -0.002148 0.002239 -0.005130 -0.008306 
+0.004564 0.000079 0.003314 0.022022 0.002766 0.009656 
+3.808743 0.213115 2.819672 4.904762 0.157509 3.168498 
+5.348571 0.157143 2.811429 5.491935 0.274194 2.268817 
+5.526946 0.508982 1.745509 5.282443 0.744275 1.255725 
+4.379679 0.732620 0.786096 0.019580 0.008924 0.007921 
+0.000575 0.004113 -0.004943 -0.006060 0.001441 -0.004749 
+-0.001148 -0.000896 0.000033 0.002158 -0.001723 0.004760 
+0.003704 -0.002544 0.003456 0.000480 0.002041 0.002197 
+-0.003399 -0.001724 0.002332 -0.006551 -0.005416 -0.000986 
+-0.003540 -0.006634 -0.002804 0.000335 -0.002084 -0.003014 
+0.009184 0.000412 -0.001364 0.005472 -0.000444 0.002037 
+0.002530 -0.002285 0.001748 -0.000282 0.001769 0.001464 
+-0.007439 0.003097 0.002682 -0.003397 -0.000392 -0.000458 
+-0.001596 -0.001063 -0.007176 -0.001593 0.001561 -0.006932 
+-0.000696 0.000220 -0.000576 -0.000180 -0.001394 0.002530 
+0.000312 0.001255 0.001643 -0.001631 0.001394 -0.000591 
+0.000882 -0.000686 -0.001453 0.000428 -0.001695 -0.001355 
+0.000566 -0.003904 0.001232 -0.002660 -0.004133 0.004924 
+-0.000503 -0.003776 -0.001007 -0.001644 -0.002148 0.006198 
+-0.002932 -0.000062 0.004336 -0.001890 0.000564 -0.001144 
+0.001607 0.004087 -0.001463 0.002629 0.001669 -0.000902 
+0.000065 0.000184 0.000099 -0.001837 0.002485 -0.004238 
+-0.000569 0.003047 -0.006898 0.007761 0.004078 -0.002670 
+0.006895 0.006734 0.001609 0.001295 0.004134 -0.003536 
+0.000442 -0.001332 -0.003665 0.000213 -0.001285 -0.000836 
+0.002900 -0.001396 0.000523 0.002965 -0.000719 0.002075 
+0.001590 -0.000060 -0.002414 -0.000024 -0.001127 0.000136 
+-0.000602 -0.001301 -0.000810 0.001167 -0.001494 -0.000767 
+0.001320 -0.001014 -0.004006 -0.009415 0.004206 -0.002468 
+-3.937500 1.006944 -1.277778 -5.570755 0.919811 -0.966981 
+-5.720280 0.786713 -0.590909 -5.657658 0.663664 -0.291291 
+-5.616959 0.514620 -0.017544 -5.447853 0.368098 0.251534 
+-4.911475 0.304918 0.567213 -4.010563 0.355634 0.880282 
+-2.890244 0.447154 0.943089 -0.014567 0.006418 0.010425 
+-0.005959 0.001711 0.006228 -0.000855 -0.009831 -0.005141 
+0.003296 -0.003895 0.004554 -0.016803 -0.001871 0.000633 
+-0.013861 0.005217 -0.003824 -0.021101 0.005501 -0.008102 
+-0.043834 -0.011490 0.004711 -0.009618 0.000003 -0.020201 
+0.019712 0.016253 0.006271 0.035827 0.013864 0.011207 
+4.131579 0.703947 1.914474 4.655172 0.267241 2.155172 
+4.941176 0.147059 1.895425 5.110448 0.256716 1.549254 
+5.208075 0.472050 1.167702 5.010453 0.585366 0.756098 
+4.202532 0.455696 0.413502 0.021847 0.001495 0.011333 
+0.009359 -0.000897 0.004430 0.005242 0.002823 0.001488 
+0.015396 0.007381 -0.006465 0.014355 0.010501 -0.005580 
+0.005452 0.003876 -0.004955 -0.000369 -0.000157 -0.000261 
+0.000157 0.002870 0.002588 0.004377 0.008525 -0.001690 
+0.005234 0.003904 -0.008666 0.001359 0.000049 -0.005728 
+-0.000280 -0.000480 -0.001592 0.003504 0.000110 0.000400 
+0.003744 -0.000649 0.002344 0.000605 -0.000498 0.000536 
+-0.002159 0.000175 -0.000298 -0.000575 0.002620 -0.001764 
+-0.002370 0.002282 -0.001068 -0.002630 -0.002995 0.001710 
+-0.006963 0.000193 0.004444 0.001182 -0.001703 0.000907 
+0.000109 -0.001246 0.000295 0.001244 0.000967 -0.000495 
+0.000952 -0.001624 0.000140 -0.004102 -0.004792 0.001404 
+-0.005865 -0.000212 -0.000354 -0.002169 0.000016 0.000800 
+0.002067 0.001716 -0.000363 0.002080 -0.001792 -0.000736 
+-0.002152 -0.001144 0.000169 -0.001407 -0.002867 -0.000839 
+0.000141 0.000660 -0.001033 0.003497 -0.000311 -0.003005 
+0.000892 -0.001661 -0.003969 0.000937 -0.000242 -0.003457 
+0.003453 0.002824 -0.001117 0.003509 0.005028 0.003279 
+0.000076 0.005546 0.003799 -0.001581 0.001445 0.003658 
+-0.000369 -0.001387 0.000539 0.002287 0.000077 -0.003752 
+0.003556 0.002996 -0.005038 0.001285 0.004641 -0.001302 
+0.000961 0.001738 0.000618 -0.005814 0.000127 0.004693 
+-0.006787 0.002097 0.005815 -0.000111 -0.000656 0.005330 
+0.011777 0.001912 0.003021 -0.007454 0.008330 -0.001456 
+-3.355856 1.454955 -1.216216 -4.128814 1.166102 -0.755932 
+-4.398714 0.813505 -0.414791 -4.041045 0.436567 -0.276119 
+-2.846939 0.107143 -0.331633 -0.006291 0.002882 -0.005317 
+0.012689 -0.002177 -0.004427 0.020000 0.000573 -0.001793 
+0.023097 -0.002144 -0.003084 0.024279 -0.007182 -0.001176 
+0.016951 0.001837 -0.001628 -0.004398 -0.002687 0.002801 
+-0.012891 -0.007252 0.005157 -0.009083 -0.007816 0.003171 
+-0.003080 -0.002439 -0.000680 0.002695 0.000807 -0.002979 
+0.001090 -0.010631 -0.009361 -0.004533 -0.013815 -0.001734 
+0.003387 -0.000720 0.001481 0.009458 0.007713 -0.000729 
+0.008389 -0.007026 -0.003392 -0.013758 -0.005300 -0.021827 
+-0.082965 -0.001019 -0.052864 -0.124403 -0.023549 -0.039210 
+-0.051200 -0.019381 -0.007510 -0.004426 -0.002004 -0.000469 
+0.012071 0.003885 -0.000079 0.018077 0.005700 0.001065 
+0.018878 0.011006 -0.001032 0.014061 0.013719 -0.004995 
+0.003672 0.014766 -0.013248 0.005844 0.005151 -0.016280 
+-0.009714 0.006424 -0.014324 0.000181 0.000410 -0.004158 
+-0.000162 -0.000534 -0.000673 0.001945 -0.003871 0.000906 
+0.004497 -0.000200 -0.000101 0.001535 0.003028 -0.001385 
+-0.003503 0.001033 -0.002732 -0.006745 -0.002825 -0.002225 
+-0.006536 -0.002047 -0.001796 -0.003284 0.000326 0.000293 
+0.000841 0.000025 0.000483 0.001120 -0.001120 0.001120 
+-0.000817 -0.000204 0.000235 -0.000711 0.001408 -0.001059 
+-0.000821 0.001232 -0.001639 0.004210 -0.001130 -0.001852 
+0.002670 0.000203 -0.001593 -0.001939 -0.000452 0.004016 
+-0.006515 0.003467 0.005742 -0.006158 0.003537 0.004283 
+-0.003147 -0.000277 0.000752 -0.001573 -0.006764 0.003255 
+0.001456 -0.005320 0.002848 -0.001633 -0.003123 0.002413 
+0.000093 -0.001421 0.002783 0.001057 -0.001024 0.003919 
+-0.003588 -0.001823 0.003190 -0.004071 0.001423 0.004110 
+-0.000794 0.000473 0.002018 0.002719 -0.002998 0.000534 
+0.006226 -0.004606 -0.001026 0.005353 -0.000529 0.000016 
+0.000827 0.001438 0.003945 -0.002308 -0.000256 0.004365 
+0.001844 0.006389 0.001122 0.001134 0.001216 -0.001220 
+-0.001249 -0.000469 0.000058 -0.000439 -0.003109 0.001509 
+-0.000170 -0.002727 0.001098 0.000875 -0.001369 0.001032 
+0.005362 -0.003170 0.003564 0.013108 -0.005479 0.011641 
+0.010684 0.004274 0.007738 -0.008331 0.009922 -0.003528 
+-0.020420 0.011708 -0.007675 -0.023233 0.012530 -0.006164 
+-0.016567 0.009337 -0.002919 0.008604 -0.002839 0.003912 
+0.032480 0.017472 0.001319 0.005231 0.009298 -0.009810 
+0.009459 0.002982 -0.008375 0.007089 0.003624 -0.001562 
+0.000840 0.000048 0.000407 -0.004445 -0.002289 0.000705 
+-0.006486 -0.002226 0.000982 -0.005001 -0.000534 0.000856 
+-0.004213 0.000299 0.002016 -0.006766 0.001102 0.004314 
+-0.010941 -0.000077 0.006285 -0.009128 -0.000016 0.005937 
+-0.002600 0.001568 0.002415 -0.000241 -0.000252 -0.000090 
+-0.005509 0.006975 -0.006260 -0.006017 0.008105 -0.005129 
+-0.006236 0.004811 -0.005993 -0.003418 0.000785 -0.003130 
+-0.000849 -0.000013 0.000313 0.000917 -0.000211 0.001789 
+-0.003270 -0.000928 -0.001865 -0.012816 -0.013440 -0.000544 
+-0.032000 0.011239 -0.002654 -0.002015 0.001808 0.003553 
+0.009904 0.010938 -0.007374 0.016067 0.012425 -0.008365 
+0.016954 0.019161 -0.006357 0.020458 0.026172 -0.010732 
+0.024150 0.025141 -0.015968 0.004721 0.009707 -0.010716 
+0.002810 0.004241 -0.005518 0.000731 0.001401 -0.002800 
+0.000265 -0.000932 0.000201 0.000422 -0.000626 0.000510 
+0.000103 -0.001071 -0.000852 -0.001321 -0.002301 -0.001581 
+0.000000 -0.004737 -0.001353 -0.003262 0.001360 0.000819 
+-0.003171 0.002117 0.003178 0.000426 0.002102 0.005155 
+0.003429 0.000858 0.002570 0.000922 0.002908 -0.000054 
+0.001296 -0.002211 -0.000556 -0.002942 -0.004684 -0.000763 
+-0.001066 -0.003343 -0.004074 -0.002091 0.002825 -0.000963 
+-0.001338 0.002960 0.004696 0.003617 0.004998 0.000112 
+0.000065 -0.000602 -0.000026 -0.004279 -0.001417 0.004632 
+0.000752 0.000947 0.005654 -0.001088 -0.001715 0.004176 
+0.008347 0.001570 0.000000 0.007599 0.003230 -0.007831 
+-0.000071 -0.003228 -0.000131 -0.000620 -0.006128 0.001699 
+0.002156 -0.003235 0.004016 0.002357 -0.001776 0.001714 
+0.001864 -0.000809 0.000249 0.001088 -0.000896 -0.000408 
+0.003112 0.000189 0.000802 0.002410 -0.000198 0.000054 
+0.001025 0.002489 -0.001736 -0.000686 0.000669 -0.001062 
+0.002649 -0.000421 0.000917 0.004094 -0.000083 0.000834 
+0.001169 -0.000872 0.000495 0.000603 -0.006595 0.000721 
+0.006944 -0.002109 0.006277 0.009356 0.001315 0.003813 
+0.003425 0.008328 0.000060 -0.004562 0.009334 -0.004606 
+-0.007792 0.005052 -0.003635 -0.000590 0.000302 0.000200 
+0.002654 -0.006856 -0.002705 0.008174 -0.006280 0.001862 
+0.006142 -0.001430 0.001297 0.002151 -0.003298 0.002461 
+0.001445 -0.004047 -0.002044 0.001230 -0.000788 -0.003107 
+0.000106 -0.000669 -0.005775 -0.004634 -0.003213 -0.003055 
+-0.005585 -0.002354 0.000868 -0.002575 0.001734 -0.000118 
+-0.000748 0.006601 -0.003047 -0.001064 0.007597 -0.003369 
+0.000146 0.004916 0.001454 0.000297 0.000227 0.008539 
+-0.000974 -0.005954 0.007728 -0.002109 0.001302 0.002822 
+-0.001009 0.001194 -0.002138 -0.001623 0.001197 -0.003111 
+0.000459 -0.000396 -0.001617 -0.000057 0.000796 0.000284 
+0.003111 -0.002672 0.001994 -0.007841 -0.006999 0.003693 
+-0.005615 -0.004915 0.002002 -0.003069 -0.004546 -0.000347 
+-0.009424 -0.008128 -0.000121 -0.011112 -0.000879 0.008482 
+0.002997 0.004804 -0.000606 0.012317 0.013843 -0.005559 
+1.924883 2.028169 -0.929577 2.455814 2.716279 -1.325581 
+2.610465 3.209302 -1.784884 0.012818 0.023579 -0.021258 
+-0.004468 0.009012 -0.000229 0.002309 0.001990 -0.003397 
+0.001319 0.000952 -0.003657 -0.001488 0.001572 -0.001717 
+0.000860 0.000175 0.000360 0.002424 0.001439 -0.000833 
+-0.002782 -0.001241 -0.000007 -0.007491 -0.006684 0.004149 
+-0.006946 -0.000798 0.006637 -0.004426 -0.000243 0.000608 
+0.002035 0.000457 0.000794 0.002326 -0.001340 0.001452 
+-0.000687 -0.001047 -0.000146 0.000008 0.000639 -0.003225 
+0.001868 0.000297 -0.005092 0.003137 0.000886 -0.005794 
+0.005422 0.001601 -0.002694 0.000710 -0.002318 -0.000488 
+-0.002362 -0.002490 0.001107 -0.001306 -0.000698 0.000299 
+0.000689 0.001449 0.000084 -0.000370 -0.000109 0.000091 
+-0.002264 -0.003488 0.004834 -0.001312 -0.005651 0.009316 
+0.001069 0.003482 -0.005804 0.004275 -0.001138 -0.001897 
+0.006635 0.000855 -0.001546 0.004285 0.000547 -0.002571 
+0.001432 -0.003026 0.002068 0.002185 -0.001385 0.002390 
+-0.000952 0.000860 0.000206 -0.000471 0.001886 -0.001544 
+-0.000193 -0.000852 -0.001332 -0.000190 -0.000095 -0.000095 
+-0.000053 -0.002441 0.000206 -0.001052 0.000299 -0.003157 
+-0.003969 0.000435 -0.001786 -0.000074 0.000172 -0.000329 
+0.004481 -0.001106 -0.000302 0.000764 0.000345 0.000007 
+-0.007422 0.000280 0.001196 -0.008237 0.001761 0.004924 
+-0.004802 -0.007219 0.002404 0.001775 -0.002647 0.002552 
+0.002501 0.000642 -0.001383 0.001851 0.004035 -0.003331 
+-0.002803 0.006441 0.000825 -0.000769 0.003691 -0.000769 
+-0.000255 0.002109 0.000644 0.002356 0.002778 -0.001553 
+0.002377 0.001132 -0.003977 -0.000968 -0.000071 -0.002763 
+-0.000172 -0.003316 -0.000694 -0.001231 -0.003810 -0.000234 
+-0.003783 0.001081 -0.000901 -0.001863 0.000453 -0.001111 
+-0.000889 0.002646 -0.000719 -0.001892 0.003903 -0.002815 
+-0.006556 0.003356 -0.001332 -0.002393 0.002161 -0.002410 
+-0.000550 -0.000461 -0.002917 0.000852 0.000185 -0.003618 
+-0.001164 0.000892 -0.000807 -0.000081 0.001462 0.000815 
+-0.002844 0.000324 0.002112 -0.004223 -0.002142 0.003160 
+-0.004996 -0.001096 0.003419 -0.003721 -0.002549 0.003907 
+-0.006273 -0.001753 0.002953 -0.009142 -0.004210 0.001239 
+-0.000058 -0.004755 -0.001669 0.006416 0.007946 -0.005961 
+0.013169 0.017986 -0.006258 2.145923 2.686695 -1.167382 
+2.605932 3.521186 -1.788136 2.445055 3.615385 -2.000000 
+0.010129 0.019222 -0.013454 0.002520 0.009209 -0.003644 
+0.005498 0.000949 -0.001271 0.000618 -0.001148 -0.000839 
+-0.000924 0.001639 0.001639 -0.001943 0.002601 0.004849 
+-0.001042 0.000563 0.000676 -0.000140 0.000289 0.001242 
+-0.003354 -0.006815 0.003177 -0.001516 -0.005323 0.005304 
+-0.000049 -0.001322 0.002300 -0.000621 0.000164 -0.000180 
+-0.003317 0.001766 -0.001185 -0.005224 0.000059 -0.000882 
+0.000389 0.000599 -0.000261 0.002992 0.001965 -0.001025 
+0.002265 0.000667 -0.003078 -0.002967 -0.002119 -0.001818 
+-0.005393 -0.003237 0.001971 -0.005112 -0.001789 0.002507 
+-0.004964 -0.000793 0.002418 -0.005055 -0.000141 0.000553 
+-0.000176 0.000484 -0.001221 -0.000982 -0.001587 -0.002746 
+0.001048 -0.004225 0.000884 -0.000623 -0.004159 0.001132 
+-0.001184 -0.002706 -0.001311 0.000498 -0.001396 -0.000797 
+0.001511 -0.000951 0.000754 0.003670 0.001028 -0.000178 
+0.003333 -0.000339 -0.003559 0.000650 -0.000383 -0.004352 
+0.002642 0.004281 -0.005072 0.002335 0.000423 -0.000365 
+-0.001403 -0.001815 -0.001153 -0.002351 -0.003565 -0.001434 
+0.000957 -0.002586 -0.001090 -0.000178 -0.001551 -0.002246 
+0.004948 0.004313 0.000971 0.003366 0.002849 -0.000226 
+-0.002146 -0.002552 0.002089 -0.005900 -0.006869 0.002984 
+-0.006280 -0.003025 0.002710 -0.003757 -0.000751 -0.002154 
+-0.000144 -0.000216 -0.001484 -0.002643 -0.001175 0.000169 
+-0.003968 0.001488 -0.000968 -0.004302 0.002252 -0.000993 
+0.000520 0.004412 -0.003279 0.003952 0.001490 -0.001304 
+0.003727 -0.002386 0.001269 0.003291 -0.001152 -0.001298 
+0.002714 -0.000882 -0.004376 0.002663 -0.002456 0.000638 
+0.003911 -0.000717 0.000780 0.002678 -0.000676 0.000731 
+0.001280 -0.001828 0.001191 0.000104 -0.002035 0.001974 
+-0.002606 -0.000747 0.001865 -0.001559 0.002036 0.000638 
+-0.000221 0.000889 -0.003084 0.001976 0.002194 -0.004393 
+-0.000858 0.004105 -0.000667 -0.000453 0.004615 -0.001087 
+0.000171 0.002213 -0.000683 -0.001260 -0.000650 0.001667 
+-0.003250 0.002014 -0.000682 0.000983 0.002953 -0.000913 
+0.001260 0.000534 -0.001260 -0.004364 -0.002934 -0.000113 
+-0.006507 -0.005251 0.001772 -0.002134 -0.002779 -0.000604 
+0.003504 0.003641 -0.001129 0.013869 0.017727 -0.009563 
+2.111111 3.226667 -1.840000 1.973684 3.438596 -2.070175 
+0.010448 0.022470 -0.015095 0.000802 0.007485 -0.004903 
+-0.000065 -0.000490 0.000202 -0.001100 -0.002871 -0.000156 
+-0.002343 0.002380 0.000541 0.000374 0.005597 0.001308 
+-0.002303 0.002584 -0.002613 -0.000703 0.003177 -0.000207 
+-0.000941 -0.002852 -0.000525 -0.001814 -0.002815 -0.001291 
+-0.000695 0.002970 -0.000422 -0.000184 0.004801 -0.003390 
+-0.001746 0.003128 -0.003404 -0.000052 -0.001246 -0.000622 
+-0.000925 -0.003201 0.000134 -0.001820 -0.002353 0.002034 
+-0.002728 -0.000852 0.003971 -0.002246 -0.000264 0.005490 
+-0.003262 -0.001669 0.001568 -0.003724 -0.000654 0.002352 
+-0.003215 -0.000806 0.001867 -0.000366 0.000060 0.000213 
+0.002498 -0.001736 -0.001625 -0.000240 -0.000561 -0.005591 
+0.001595 0.002054 -0.004697 -0.001757 0.005168 -0.006925 
+-0.002860 0.000014 -0.006663 0.001601 -0.002173 -0.002974 
+0.001520 -0.000579 -0.001705 0.000309 0.000965 -0.002504 
+-0.001532 -0.000387 -0.001258 -0.003640 -0.001549 0.000669 
+-0.002621 -0.001968 -0.000219 -0.000502 -0.001873 0.003127 
+-0.000191 -0.000025 -0.000635 0.001237 0.000954 0.000184 
+0.001676 0.002319 -0.001128 0.000187 0.002542 -0.003670 
+-0.000089 -0.000194 -0.000503 -0.000691 0.000037 0.000737 
+-0.001090 -0.006846 0.004362 -0.002907 -0.008837 0.000969 
+-0.001227 -0.004569 -0.001650 -0.001181 0.001614 -0.000060 
+-0.001817 0.003333 -0.000942 -0.001256 0.002644 -0.002859 
+0.002570 0.001914 -0.003144 0.001656 0.002293 -0.001647 
+-0.000861 0.001933 -0.000689 -0.000509 0.001759 -0.000401 
+0.000565 0.000945 -0.001966 0.000740 0.000987 -0.002057 
+0.002203 -0.001970 -0.000524 0.001713 -0.001545 0.002188 
+0.001214 0.001068 0.002352 -0.000884 0.000900 0.000184 
+-0.001548 -0.000402 -0.000409 0.000435 -0.000658 0.000209 
+0.002358 -0.001891 0.000825 0.002022 -0.002908 0.001305 
+0.000329 -0.003222 -0.001175 -0.002272 -0.000085 -0.002649 
+-0.002936 0.004049 -0.003896 -0.000202 0.008304 -0.005198 
+0.002578 0.006653 -0.003197 -0.001008 -0.001774 -0.006089 
+-0.001913 0.001011 -0.000312 -0.001422 -0.000054 0.000374 
+0.000725 0.000286 -0.000549 0.000000 0.001926 -0.003333 
+-0.003574 0.001898 -0.004932 -0.006320 0.000450 -0.005666 
+-0.009224 -0.001065 0.000593 -0.000495 0.000864 -0.001620 
+0.013609 0.023413 -0.013635 1.450237 3.118483 -1.805687 
+0.673077 2.634615 -1.375000 0.005333 0.014375 -0.009785 
+0.003406 0.007104 -0.003492 -0.000133 0.001622 0.000659 
+-0.002213 -0.000769 0.000059 -0.001459 0.001610 -0.003119 
+0.002506 -0.000298 -0.004440 0.002881 0.003404 -0.002656 
+-0.000358 0.000539 0.000235 -0.006016 0.000431 0.004546 
+-0.006137 -0.003278 0.006217 -0.004248 -0.001870 0.004169 
+-0.002850 0.001878 0.002721 -0.002195 0.000939 -0.000262 
+-0.000727 0.000310 0.000446 0.000521 -0.000205 -0.001826 
+-0.001947 -0.003895 -0.000175 -0.006528 -0.003058 0.005292 
+-0.003072 -0.004834 0.008003 0.000266 -0.002071 -0.000370 
+0.005361 0.000812 -0.000806 0.004769 -0.000341 -0.001704 
+0.002559 -0.000010 -0.001880 0.002480 0.002480 -0.001496 
+0.002195 0.003910 -0.004112 0.000504 0.001050 0.002310 
+0.001856 0.002978 0.002545 0.000814 0.000572 -0.001352 
+-0.001190 0.004517 -0.004271 0.002212 0.002463 -0.003351 
+0.001268 0.000113 -0.001448 0.001411 -0.000771 -0.000727 
+0.001221 -0.000622 0.000029 -0.000840 0.000232 -0.000471 
+-0.001925 0.000977 0.001296 -0.001813 0.000765 0.002433 
+-0.000910 0.000142 0.003690 -0.001068 0.000303 0.004129 
+0.000250 -0.001642 0.001809 0.001063 -0.002001 0.001717 
+0.000946 -0.005088 0.001134 -0.000939 -0.006372 0.001218 
+-0.002692 -0.005962 0.002269 -0.002030 -0.005674 0.000811 
+-0.000637 -0.005093 -0.001615 0.003102 -0.003349 -0.001646 
+0.002131 0.000116 -0.000273 0.000487 0.002622 0.000421 
+-0.000202 0.002991 0.001374 0.002070 0.003450 -0.001692 
+0.003399 0.002855 -0.006368 0.003029 0.003136 -0.008627 
+0.001389 0.001746 -0.007031 0.000215 -0.000176 -0.002773 
+0.000571 -0.000956 -0.000658 -0.001164 -0.000771 -0.001104 
+-0.003666 -0.001932 -0.001387 -0.003086 -0.002559 0.000406 
+-0.000544 0.002680 -0.000233 0.000420 0.004543 -0.002703 
+0.000308 0.003115 -0.001654 -0.000019 0.000513 -0.000301 
+-0.000698 0.000749 -0.000106 0.001635 0.002698 -0.001431 
+0.000799 0.001808 -0.005822 0.000161 0.002445 -0.003304 
+-0.003016 0.000466 0.001468 -0.003403 -0.003889 -0.000486 
+-0.005234 0.000781 0.000000 -0.000093 0.005802 -0.000557 
+-0.003454 0.006663 -0.005682 -0.000425 0.005815 -0.006261 
+0.000904 -0.006329 0.000168 -0.008094 -0.015413 0.011687 
+0.001646 0.004701 -0.001926 0.002755 0.019076 -0.009692 
+0.000362 0.020116 -0.009246 0.001107 0.016090 -0.005956 
+0.001267 0.006051 -0.004557 -0.000126 -0.003688 0.000179 
+-0.004060 -0.004593 0.002583 -0.001891 -0.002102 0.005460 
+-0.003185 -0.000247 0.005555 -0.006067 -0.005481 0.001441 
+-0.004710 -0.006461 -0.000725 -0.002877 -0.002777 -0.001541 
+-0.004827 0.000786 0.005744 0.000090 0.000179 0.007985 
+0.002499 0.001362 0.002110 0.001200 0.002096 -0.000409 
+0.001349 0.001397 -0.003757 -0.000896 -0.001493 -0.001940 
+-0.001219 -0.000731 -0.000487 -0.001360 -0.001151 0.000727 
+-0.000954 -0.000881 -0.000710 -0.001941 0.000336 -0.001594 
+-0.003427 0.001038 -0.000420 -0.002096 -0.001104 0.001902 
+-0.000893 -0.001701 -0.001488 -0.001687 -0.000333 -0.003910 
+0.006486 0.000541 -0.000674 -0.000984 0.002461 -0.004885 
+-0.002109 0.000273 -0.002695 -0.004488 0.000032 -0.000154 
+-0.001428 0.000213 -0.000795 0.001257 0.003532 -0.000204 
+0.005301 0.000736 -0.006112 -0.001312 0.003419 -0.006171 
+-0.001078 0.000097 -0.002188 -0.001190 -0.004169 0.003576 
+0.002993 -0.002494 0.003017 0.000382 -0.001018 -0.004323 
+0.002564 0.003531 -0.007671 0.002384 0.001343 -0.005044 
+0.000167 -0.000039 -0.001000 0.001284 -0.004538 0.002784 
+-0.003944 -0.006285 -0.001170 -0.002713 -0.002805 -0.003724 
+-0.000110 0.000047 -0.001894 0.000195 -0.000588 0.000532 
+-0.000444 0.001138 -0.001915 -0.001263 0.000083 -0.003225 
+-0.000157 -0.001039 -0.002331 0.000131 0.001743 -0.002571 
+0.000667 0.004583 -0.004583 0.000772 0.004138 -0.006412 
+0.002397 0.000389 -0.005506 0.004228 0.000000 -0.004228 
+0.004881 0.000155 -0.003047 0.002702 0.005921 -0.003390 
+0.001821 0.006361 0.000231 0.002381 0.003690 0.001309 
+0.000244 -0.000892 0.000367 -0.000896 -0.000613 0.001132 
+0.000765 0.001435 -0.002172 0.002507 0.003267 -0.004370 
+0.003305 0.004868 -0.001863 0.002050 0.004357 -0.004271 
+-0.000625 0.002556 -0.000548 -0.001404 -0.001899 -0.000943 
+0.000708 -0.000175 0.000268 -0.002256 -0.007759 0.003325 
+0.000887 -0.002733 0.000068 0.004151 -0.000091 0.000892 
+-0.000401 0.006467 -0.003835 -0.000260 0.001111 -0.000162 
+-0.003066 0.000071 0.000170 0.000310 0.000507 -0.001685 
+-0.003005 -0.004197 -0.004515 -0.006032 -0.002480 0.005966 
+-0.001069 -0.004280 -0.000081 -0.001972 0.005774 -0.003509 
+-0.001073 0.013564 -0.006782 -0.000216 0.015006 -0.009530 
+-0.001475 0.008046 -0.007788 -0.001316 0.001301 -0.001171 
+-0.002393 0.000254 0.000048 0.000153 0.000763 -0.003206 
+0.003188 -0.000156 -0.002391 -0.001440 -0.004640 0.000000 
+-0.001845 -0.004122 -0.003468 0.002129 -0.000420 -0.003235 
+0.003368 -0.001067 -0.001935 0.000126 -0.000446 -0.001007 
+-0.001457 -0.000928 -0.000353 -0.001516 0.000174 0.000779 
+-0.001579 0.000137 0.000618 -0.002367 0.000579 0.002470 
+-0.003517 -0.002431 0.004572 -0.003219 -0.003945 0.002672 
+-0.000981 -0.000739 0.001072 0.002869 0.003772 -0.003878 
+0.010041 0.003677 -0.010322 0.002007 0.006420 0.003846 
+0.002043 0.006119 0.001681 -0.001576 -0.000352 -0.000832 
+0.000415 0.002574 -0.002221 -0.000268 0.001354 0.000527 
+0.003171 -0.003581 -0.001080 0.008274 0.003322 -0.008397 
+0.000944 0.005030 -0.001928 -0.000512 0.002326 -0.000752 
+-0.000653 0.000844 -0.000390 -0.000262 -0.002482 -0.002831 
+0.001701 -0.002483 0.001259 0.005562 -0.000224 0.002674 
+0.005964 0.000426 0.001920 0.000834 0.000104 0.001210 
+-0.005090 -0.003937 -0.000816 -0.005286 -0.002498 -0.000527 
+-0.001343 -0.000637 -0.000935 0.000998 -0.000010 -0.001523 
+-0.000815 -0.000089 0.000656 -0.002958 0.001136 0.002658 
+-0.001145 0.001235 -0.000348 -0.001833 -0.000333 -0.001095 
+0.001891 0.001773 -0.001050 0.001893 0.002023 -0.003498 
+0.000283 -0.000472 -0.002740 -0.000703 -0.000370 0.001267 
+-0.000001 -0.002640 0.003520 -0.001230 -0.000811 0.002492 
+-0.002008 0.000572 -0.002243 0.000146 0.003069 -0.005202 
+-0.001190 0.003009 -0.002457 -0.001034 -0.000581 -0.000929 
+-0.004490 -0.002481 0.000297 -0.005130 -0.000592 -0.000871 
+-0.002539 0.001108 -0.000004 -0.001493 0.001249 0.001270 
+-0.000723 0.001049 -0.001416 0.000866 0.004313 -0.000645 
+-0.001899 0.001437 -0.001967 -0.000458 0.001479 -0.005564 
+-0.000203 0.004109 -0.000862 0.000319 0.002175 0.000352 
+0.000387 -0.000995 -0.000321 -0.001308 0.000654 -0.000654 
+-0.003309 -0.001845 -0.000530 -0.002650 -0.001287 -0.001189 
+0.000295 -0.001603 -0.002225 -0.000152 0.001374 -0.003915 
+-0.000588 0.004067 -0.003364 0.003999 0.003331 -0.004517 
+-0.000046 0.001031 -0.005194 -0.002202 -0.002518 0.002780 
+0.002182 -0.001720 0.001300 -0.001522 0.002942 -0.000864 
+-0.000770 0.009832 -0.002430 0.001498 0.011838 -0.004636 
+0.001560 0.005236 -0.003404 0.002015 -0.001427 0.002941 
+-0.002314 -0.005956 0.002415 -0.002339 -0.004244 0.002518 
+-0.004055 -0.000643 -0.000279 -0.003017 -0.001213 -0.001786 
+-0.001142 -0.001519 0.000985 -0.000622 -0.004147 0.001521 
+-0.002518 -0.004332 0.005172 -0.000426 -0.007372 0.003665 
+0.001338 -0.003749 0.005887 -0.002000 -0.000519 0.002741 
+0.001262 -0.001960 0.000913 0.000939 -0.002274 -0.000583 
+-0.005121 -0.000685 0.001532 -0.002731 -0.002180 0.002105 
+0.002221 -0.000333 0.001443 0.000943 -0.001851 0.001873 
+-0.000603 -0.005305 0.001868 -0.002886 -0.005385 -0.000666 
+0.001748 -0.003066 0.001285 0.001203 0.000125 0.002875 
+0.002657 0.001133 0.002540 -0.001122 0.003684 -0.000112 
+-0.002212 0.002776 -0.001192 0.002459 0.000999 -0.003406 
+0.001414 0.002836 -0.000421 0.001804 0.001132 0.000310 
+0.000311 -0.001572 0.000922 -0.000922 -0.002130 -0.002173 
+-0.002273 -0.000492 0.000198 -0.001994 0.001527 0.000714 
+-0.002798 0.000170 0.002202 -0.006316 -0.002291 0.002908 
+-0.006636 -0.001747 0.001396 -0.000459 -0.000877 -0.001615 
+0.001380 -0.002292 -0.000911 0.000000 -0.001231 0.000385 
+-0.001101 0.000602 0.001927 -0.001582 0.002056 0.001107 
+-0.000138 0.000609 0.000421 0.001837 -0.000667 -0.000919 
+0.001855 -0.002036 -0.001477 -0.000384 -0.001654 -0.000070 
+-0.002493 0.000054 -0.000612 -0.002923 0.000797 -0.000674 
+-0.001144 0.001549 0.000201 0.000194 -0.001306 -0.001258 
+-0.002910 0.000390 -0.007740 -0.001897 0.003672 -0.010291 
+-0.002934 0.001835 -0.008431 0.001164 0.005979 -0.008307 
+-0.000872 0.000645 -0.001407 -0.003508 0.000409 0.002220 
+-0.006172 0.000256 0.001289 -0.004559 0.004382 -0.002191 
+-0.000584 0.004922 -0.003045 0.002616 0.001020 -0.004256 
+0.002392 0.000253 -0.006853 0.001200 0.003060 -0.006733 
+-0.001352 0.003838 -0.005287 -0.004599 0.002613 -0.002020 
+-0.005206 0.001802 -0.000143 -0.003780 -0.000344 0.001037 
+0.000471 0.001589 -0.001883 0.002386 0.004324 -0.003428 
+0.008400 -0.000994 -0.001740 0.002901 -0.001497 0.002874 
+0.001082 0.001567 0.000634 -0.001176 0.002009 -0.001387 
+-0.001187 -0.001156 -0.001065 0.002661 -0.003031 0.002204 
+0.003197 -0.003082 -0.000287 -0.000323 0.000997 -0.000130 
+-0.003385 0.002661 -0.000407 -0.004840 -0.000579 0.001506 
+-0.003663 -0.006280 0.002878 0.000021 -0.003992 0.004932 
+0.001117 0.000023 -0.001022 0.003419 -0.000993 -0.002206 
+0.004520 -0.001053 -0.006027 0.001747 -0.002794 0.000854 
+0.000280 -0.007146 0.002765 -0.002818 -0.006904 0.004133 
+-0.003312 -0.004471 0.004389 -0.001947 -0.001315 0.003019 
+-0.000375 0.000469 0.000125 0.002242 -0.001326 -0.004451 
+0.002390 0.002148 -0.005808 0.003158 0.002131 -0.002289 
+0.002500 -0.000793 0.001190 0.001602 -0.003334 0.000825 
+0.002012 -0.002143 0.001059 0.001140 0.002620 0.000346 
+0.003171 0.002703 0.000667 -0.000809 0.000666 0.000273 
+-0.003257 -0.000420 -0.002138 -0.003689 0.000676 -0.003351 
+0.000718 -0.001124 -0.002371 0.005748 0.003784 -0.006559 
+0.007306 0.004049 -0.004173 0.002078 0.003972 0.001763 
+-0.000857 0.003611 -0.001130 -0.001889 -0.002848 0.000709 
+-0.001671 -0.003567 0.002830 -0.000216 -0.000717 0.002883 
+-0.000909 0.002381 0.001588 -0.001966 0.004292 0.002086 
+-0.001814 0.002607 0.000716 -0.000664 -0.001191 0.000344 
+0.000846 -0.001004 0.000803 0.002342 -0.001512 0.000360 
+0.002652 -0.001894 0.000000 0.002061 -0.000267 -0.000802 
+0.000424 -0.002921 -0.002721 -0.000771 -0.004293 -0.002798 
+-0.003793 -0.004127 -0.002549 -0.002124 0.000680 -0.002292 
+0.000620 -0.000788 -0.001526 -0.001912 -0.001892 -0.003764 
+-0.001544 0.001235 -0.000926 -0.002306 -0.003450 -0.000002 
+-0.000128 -0.003587 -0.002477 0.000957 -0.000252 -0.001555 
+0.003226 0.001862 -0.003797 0.005173 0.003524 -0.004055 
+0.002519 0.000321 0.000497 -0.000134 0.000687 -0.001674 
+0.000301 0.000359 -0.000494 -0.000301 -0.000071 -0.000018 
+0.000264 0.001497 0.001057 0.001271 0.004153 0.002696 
+0.001497 0.004501 0.002261 0.000709 0.001084 -0.000222 
+-0.001670 -0.002816 -0.001080 -0.003268 -0.003818 0.000035 
+-0.002701 -0.000270 -0.000180 -0.001680 -0.000924 -0.000764 
+-0.004723 -0.003957 -0.001675 -0.007270 -0.007270 0.000071 
+-0.004193 -0.006280 0.000512 0.000280 -0.000579 0.001074 
+0.005749 0.001191 -0.003505 -0.000034 0.000171 -0.006000 
+0.001366 0.000674 0.000003 -0.000509 -0.002572 0.000745 
+-0.004958 -0.004106 -0.000233 -0.004867 -0.001417 0.002465 
+-0.004862 0.000371 -0.000033 -0.002085 0.002908 0.001697 
+-0.003212 0.002667 0.000538 -0.003019 -0.003439 0.001653 
+0.000088 -0.007559 0.001836 -0.000816 -0.003964 0.003871 
+-0.002050 0.000758 0.000745 -0.003770 0.001925 0.000010 
+-0.005542 -0.001114 0.001902 -0.005859 -0.004344 0.004198 
+-0.002997 -0.007342 -0.000033 0.002096 -0.002418 -0.000133 
+0.001625 -0.000061 0.001005 -0.000640 -0.000560 0.002400 
+0.000610 -0.000874 0.000945 -0.003293 0.000980 0.000919 
+-0.004865 0.002076 0.001405 -0.004315 -0.000193 0.001288 
+-0.001736 0.001368 0.001765 -0.002231 0.002750 0.000196 
+-0.000414 0.002815 -0.000738 -0.000285 0.001213 0.004354 
+-0.001803 0.002566 0.002113 -0.002794 0.001170 0.000415 
+-0.005259 0.001005 0.000541 -0.004211 -0.003251 -0.002487 
+0.001153 0.005233 -0.000104 0.003399 0.002697 0.000366 
+0.002746 0.000767 0.000367 0.002230 -0.001149 -0.001143 
+0.000770 -0.001144 -0.001078 -0.000742 -0.000847 0.000170 
+-0.000616 -0.001557 0.001161 -0.001012 -0.001622 0.003179 
+-0.006282 0.001342 0.006968 -0.011415 -0.002289 0.005660 
+-0.009267 -0.007285 0.006803 0.001669 -0.002226 0.003008 
+0.003313 -0.000779 -0.001147 0.007682 0.004693 -0.003202 
+0.002633 0.005313 -0.004389 -0.000094 -0.000047 0.000315 
+-0.006586 -0.004397 0.002216 -0.008398 -0.000542 0.004425 
+-0.005192 -0.000454 0.002487 -0.001853 0.001698 -0.001184 
+-0.003095 0.001351 -0.002260 -0.002676 0.002482 -0.003117 
+-0.004741 -0.002037 -0.003000 -0.001470 -0.000561 -0.003554 
+-0.000738 0.000567 0.000290 -0.003185 -0.001251 0.002843 
+-0.003858 -0.002913 0.000000 -0.001797 -0.000694 -0.000830 
+-0.000121 0.003371 0.000376 0.001169 0.008154 0.000585 
+0.004192 0.008763 -0.004571 0.002030 -0.000488 -0.001708 
+-0.002121 0.001061 -0.003561 -0.002015 0.002838 -0.003455 
+-0.000775 0.002029 -0.002898 -0.000075 0.000205 -0.000548 
+-0.001232 -0.000678 0.001850 -0.002535 -0.001279 0.001285 
+-0.002345 -0.000282 -0.000163 -0.000607 0.000988 -0.002461 
+0.000779 0.001646 -0.002686 0.000801 0.000570 -0.000227 
+-0.000881 -0.001050 0.001511 0.000176 -0.001927 -0.001532 
+-0.004817 -0.003897 -0.003880 -0.005118 -0.003407 -0.001322 
+-0.000300 -0.001498 0.000659 0.001119 0.003371 0.001029 
+-0.003062 0.002087 -0.001625 -0.000702 0.004803 -0.001770 
+-0.002349 0.002756 -0.001621 0.001446 0.002962 0.000720 
+0.001174 0.002694 0.000197 -0.002170 -0.001249 0.000254 
+-0.002854 -0.003501 -0.002427 -0.000125 -0.001705 -0.000626 
+-0.000249 0.001512 -0.001781 0.000614 -0.000083 0.000282 
+0.000000 -0.002296 0.002593 -0.008841 -0.004710 0.003551 
+0.001773 -0.007981 0.001764 -0.001037 -0.005879 -0.002266 
+0.000266 -0.000442 -0.004510 -0.000787 0.001966 -0.001901 
+0.000364 -0.000044 0.000818 -0.002751 0.000241 0.002449 
+0.000210 -0.001255 0.000729 -0.002255 -0.004667 0.001353 
+-0.002130 -0.003746 0.001329 -0.002346 -0.001014 0.001051 
+-0.000039 0.000117 0.002422 0.001205 0.001652 -0.000281 
+0.001957 0.003253 0.001835 0.001572 0.004702 0.002874 
+0.001213 0.003549 0.001947 -0.000159 -0.001538 0.000603 
+-0.003352 0.001903 0.000228 -0.002423 0.001237 0.000367 
+0.000871 0.000967 0.000246 0.002944 0.001122 0.000311 
+0.001879 0.001376 0.000154 -0.000770 -0.000341 0.000441 
+-0.000715 -0.004155 -0.000863 -0.001508 -0.001320 -0.004478 
+0.001958 0.000244 -0.001946 0.002072 0.004013 0.000822 
+0.000163 0.002438 0.000890 -0.001304 -0.000954 0.001102 
+0.000360 -0.001295 0.001295 0.001753 0.001116 -0.002418 
+0.001543 0.004975 -0.003484 -0.000226 0.004253 -0.001336 
+0.002960 0.000847 0.003388 -0.001423 -0.001085 0.001507 
+0.000785 -0.000433 -0.000877 0.000133 0.000882 -0.005712 
+0.000354 0.000874 -0.007887 0.000000 0.005000 -0.006620 
+0.000262 0.002585 -0.005709 0.001784 0.000474 -0.005230 
+0.002244 -0.000630 -0.003504 -0.001222 -0.003215 -0.001157 
+-0.002584 -0.002532 -0.001912 -0.000869 0.000039 -0.000798 
+-0.000565 0.000073 -0.000727 -0.000720 -0.000226 -0.001070 
+-0.001562 0.000062 0.000125 -0.001120 0.001337 0.001987 
+0.000240 0.000960 -0.001200 0.001067 0.006140 -0.001736 
+-0.001084 0.004769 -0.001301 -0.000150 0.001504 -0.000075 
+0.002612 0.001615 -0.000404 0.002503 0.003369 -0.002435 
+-0.001327 0.001872 -0.004053 -0.004082 -0.000435 -0.001941 
+-0.004073 -0.003251 0.000862 -0.003125 -0.002137 0.001203 
+-0.001883 0.000827 0.000918 -0.000009 0.000550 0.000527 
+0.000788 -0.001680 0.001182 0.001060 -0.002847 0.001108 
+0.000635 -0.001824 0.000363 0.000384 0.000384 0.000096 
+-0.001878 0.003148 0.000122 -0.005990 -0.000520 0.003387 
+-0.009208 -0.001486 0.004039 -0.001756 0.002064 -0.000263 
+-0.001942 -0.004227 -0.000380 -0.001585 -0.001747 -0.002653 
+-0.003768 0.001214 0.000804 -0.002505 -0.001588 0.005316 
+0.000922 -0.003806 0.003687 -0.000135 -0.000975 -0.001232 
+0.001281 0.001103 -0.004623 -0.001308 0.005700 -0.001900 
+-0.002669 0.002588 0.000869 -0.001783 -0.001131 -0.000244 
+-0.000249 0.000029 -0.000109 0.002178 0.002389 -0.000058 
+0.002327 0.001188 0.001644 0.000566 0.002488 -0.002149 
+-0.000954 0.004866 0.002917 -0.003194 0.000710 0.007339 
+-0.005927 -0.002502 0.003872 -0.004375 -0.000182 0.000028 
+-0.001796 0.001392 -0.000969 -0.002286 0.001417 0.001691 
+0.000811 -0.000374 0.000272 0.002074 -0.002436 0.000263 
+0.000617 -0.000763 -0.000352 0.000415 0.003993 -0.000225 
+-0.019249 -0.008098 -0.003101 -0.028843 -0.021664 -0.013851 
+-2.386243 -3.185185 -1.492064 -2.257282 -2.820388 -1.199029 
+-0.012041 -0.024494 -0.008331 -0.003255 -0.008660 -0.001862 
+-0.000048 0.007325 0.004376 0.001832 0.003694 0.002609 
+-0.001609 -0.001256 -0.001026 -0.002021 -0.001002 -0.000390 
+0.002699 -0.000432 0.001354 0.004169 0.004126 -0.000258 
+0.004556 0.006802 -0.005871 0.000357 0.004301 -0.006686 
+0.004752 0.005668 -0.000668 0.001991 0.006562 0.000629 
+0.000451 0.006096 0.000263 -0.000532 0.003914 -0.001517 
+-0.000003 0.000277 0.000353 -0.001942 -0.000291 0.003981 
+-0.002463 -0.000984 0.002670 -0.004808 -0.002857 0.001499 
+-0.003377 -0.000379 -0.001899 -0.002381 0.002224 -0.000610 
+0.000293 0.002746 -0.000547 0.000101 -0.000401 0.000165 
+-0.001487 -0.001239 0.000293 -0.002177 0.003997 -0.000090 
+-0.003594 0.002264 -0.000694 -0.002082 0.000982 -0.000869 
+0.001455 0.004274 -0.001850 0.004756 0.003171 -0.001985 
+0.002556 0.005414 -0.002857 0.000978 0.002658 -0.002521 
+-0.000770 0.001621 -0.001986 -0.000712 0.003053 -0.002629 
+0.000097 0.001152 -0.003008 -0.001400 0.000340 0.000383 
+-0.003410 0.000697 0.002331 -0.004451 0.000663 0.002379 
+-0.003704 0.000859 0.003928 -0.004079 0.000246 0.004953 
+-0.004161 0.000618 0.002048 -0.003169 0.002609 0.000385 
+-0.002634 0.002958 -0.004747 0.000978 -0.000751 -0.002883 
+0.001268 -0.000183 -0.000613 0.000038 0.003242 -0.002657 
+-0.002527 0.000844 -0.001979 -0.003957 -0.005563 0.003234 
+0.001096 -0.012460 0.007734 0.001187 -0.014806 0.004914 
+-0.001962 -0.001286 -0.001265 0.000519 -0.004491 0.000723 
+0.000266 -0.000095 0.000201 0.002057 0.001642 0.000638 
+0.003433 0.002440 0.000725 0.003429 0.003627 0.000931 
+0.004035 0.003697 0.001469 0.004722 0.002515 0.002132 
+0.003469 0.003827 0.001326 -0.005025 0.005954 -0.003754 
+-0.000827 0.045917 -0.016618 0.004369 0.033540 -0.021111 
+-0.013529 -0.022317 0.018156 -0.035973 -0.135978 0.028360 
+0.010131 -0.002895 -0.011578 -0.007258 0.003126 -0.006036 
+-0.000306 -0.003424 -0.005804 0.005331 0.001025 -0.006138 
+0.009703 0.004612 -0.007271 0.001020 0.005714 -0.002244 
+-0.001284 0.003417 0.002987 -0.000434 0.000275 0.003222 
+0.001565 -0.000455 0.003026 0.001867 0.000009 0.001339 
+0.014366 0.050325 -0.001737 -0.003135 -0.003271 -0.016572 
+-0.015225 -0.024648 -0.017438 -0.015605 -0.024649 -0.010650 
+-0.013445 -0.018540 -0.007397 -0.006760 -0.008801 -0.005619 
+-0.000320 0.005861 -0.001761 0.001420 0.007405 0.002349 
+-0.001210 0.000720 0.001971 -0.002155 -0.001003 0.001275 
+-0.001185 -0.001985 0.000842 0.001203 -0.001104 0.000265 
+-0.001552 0.000329 0.001971 0.001181 -0.000443 0.000295 
+0.002818 0.002193 0.003665 0.003293 0.006224 0.001910 
+0.003070 0.000617 -0.003389 -0.000870 0.001654 -0.002512 
+-0.000428 0.001532 0.000408 -0.000371 0.000082 0.002272 
+0.002373 -0.000144 -0.000538 0.001886 -0.002451 0.001299 
+-0.000661 -0.000893 -0.001321 0.003756 0.002472 0.000519 
+0.002944 0.002035 0.000930 0.003294 -0.001394 0.000736 
+0.001165 -0.001508 0.000141 -0.002943 -0.000174 -0.002239 
+-0.005194 0.000045 -0.003289 -0.001938 -0.002442 -0.002442 
+-0.001638 -0.000781 0.000328 0.000000 0.001154 -0.001692 
+-0.002700 0.003354 -0.003165 -0.000294 0.002380 -0.004165 
+-0.000457 0.000875 -0.001563 -0.000224 0.000440 -0.001801 
+-0.000108 0.000034 -0.001969 0.000614 -0.001358 0.000320 
+0.001566 -0.003615 0.001566 -0.006840 -0.000242 -0.002586 
+-0.005744 -0.004894 -0.008934 0.001289 -0.003437 -0.004985 
+0.000941 0.001559 -0.001055 0.000763 0.004493 -0.001314 
+0.001040 0.004176 0.001392 0.002388 0.003683 0.001504 
+0.003432 0.002536 0.000510 0.004367 0.002522 -0.002213 
+0.001324 0.002928 -0.001627 -0.000434 -0.004669 0.002366 
+0.000632 -0.011569 0.006689 0.004476 -0.013356 0.001019 
+-0.001162 -0.011466 0.003221 0.000300 -0.005557 0.002761 
+-0.000064 -0.000413 0.000019 0.002772 0.003737 0.000482 
+0.004344 0.004245 0.000566 0.001940 0.003117 0.000255 
+-0.001089 0.002649 -0.000343 0.001528 0.004709 -0.000169 
+0.012105 0.011467 -0.000133 0.020051 0.015611 -0.003006 
+0.012703 0.005670 -0.004830 0.000610 -0.001124 0.001177 
+-0.003760 -0.005354 0.002314 0.002289 -0.008878 0.006244 
+-0.005063 0.006287 -0.004743 -0.004003 0.003919 -0.003955 
+-0.006043 0.002583 -0.001073 -0.006475 -0.000290 -0.001439 
+-0.000061 0.003133 -0.002800 0.003814 0.002615 -0.005444 
+0.001233 0.000253 -0.002409 -0.001208 -0.000190 0.002574 
+-0.003056 0.000018 0.006888 -0.005600 0.000315 0.006570 
+-0.014160 0.025507 0.014286 0.003451 0.004261 -0.002231 
+-0.001516 -0.009387 -0.010352 -0.002169 -0.012300 -0.004455 
+-0.004142 -0.009969 -0.001298 -0.003960 -0.003013 -0.001350 
+0.001511 0.005077 -0.002781 0.000560 -0.000046 0.000525 
+0.000684 0.005430 -0.001045 -0.000699 0.002426 0.000699 
+-0.000347 -0.000849 0.000079 -0.002088 -0.004010 0.001905 
+-0.002856 -0.006273 -0.000519 -0.000125 -0.003564 -0.000742 
+-0.000578 0.001319 -0.000994 -0.002022 0.002332 -0.001550 
+-0.001255 0.001611 -0.000886 -0.000510 -0.000478 0.000899 
+0.000688 0.000272 0.002923 -0.001100 0.001330 -0.000943 
+0.004580 0.005431 -0.005147 0.002823 0.005503 -0.001997 
+0.001552 0.006230 -0.003119 0.005689 0.005150 -0.007845 
+0.005167 -0.000020 0.000733 0.001553 -0.003114 -0.000411 
+-0.001440 -0.001864 -0.001536 -0.002714 0.001641 -0.000920 
+-0.003020 0.002295 -0.000483 -0.003583 0.000656 0.000813 
+-0.003019 0.000216 0.001270 0.001125 0.002411 -0.001928 
+0.002203 0.003366 -0.003480 -0.000939 0.001078 0.000427 
+-0.004088 -0.003787 0.004519 -0.004677 -0.003138 0.006200 
+-0.000543 -0.001411 0.001955 -0.000781 -0.000628 -0.000145 
+-0.000176 -0.007276 -0.003148 -0.002453 -0.012385 -0.006256 
+-0.003482 -0.010392 -0.009393 0.002019 -0.003503 -0.008368 
+0.002754 -0.000304 -0.002758 -0.000716 -0.000261 -0.000254 
+-0.004203 0.001301 -0.000525 -0.006778 0.001283 -0.000600 
+-0.005693 0.001197 0.002460 0.001106 0.000857 -0.002319 
+0.002815 0.000791 -0.003518 0.000705 -0.004945 0.001618 
+-0.001754 -0.012572 0.004934 -0.002329 -0.012574 0.005804 
+-0.002475 -0.005971 0.003401 -0.003173 0.002377 -0.000483 
+-0.007117 0.002211 -0.002760 -0.006374 -0.000271 -0.001473 
+-0.003087 -0.003921 0.000060 -0.000376 -0.002165 0.000586 
+0.001720 0.003981 -0.000723 0.002555 0.008528 -0.001452 
+0.001858 0.008504 -0.001661 0.000841 0.004524 -0.001480 
+-0.001270 -0.000652 0.000560 -0.000035 0.001577 -0.000756 
+0.002539 0.008054 0.000563 0.011060 0.004906 -0.011516 
+-0.003725 0.002986 0.003571 -0.003045 0.002499 0.003986 
+-0.005176 -0.001079 0.001196 -0.001774 -0.000869 -0.001263 
+-0.002588 0.000319 -0.001782 -0.001882 0.002521 -0.002775 
+-0.002092 0.001990 -0.003945 -0.004587 0.000787 -0.003678 
+0.000390 -0.003258 -0.003588 0.001164 -0.001017 0.000646 
+-0.002755 -0.005816 0.001985 0.007031 0.012854 0.012180 
+0.000298 0.005689 -0.004368 -0.004098 -0.008644 -0.002175 
+-0.009140 -0.009148 -0.000453 -0.005840 -0.005548 -0.001207 
+0.000544 -0.000211 0.000441 0.006087 0.005363 -0.000562 
+0.005237 0.004145 0.003036 0.002224 0.004979 -0.000273 
+-0.000547 0.001536 0.001172 -0.004090 -0.001250 0.003907 
+-0.005299 -0.001162 0.001279 -0.001246 0.002623 -0.002151 
+-0.000667 0.006310 -0.000526 -0.001427 0.006766 -0.004096 
+-0.002545 0.000059 0.000858 -0.000134 0.000067 0.003613 
+-0.000061 -0.000383 0.000977 0.000131 0.002139 -0.001334 
+-0.001292 -0.000023 0.000319 -0.000706 -0.000882 -0.000279 
+-0.000089 0.004599 0.001271 -0.002617 0.005904 -0.001340 
+0.001412 0.003362 0.003870 0.002450 0.001077 0.003221 
+0.001047 0.000079 0.002627 -0.000498 0.000596 -0.000889 
+-0.000986 0.000734 -0.000802 -0.002589 -0.001407 0.000816 
+-0.001976 -0.001629 0.000728 0.000848 0.000630 -0.001533 
+0.000663 0.002154 -0.002237 -0.000055 0.003022 0.000083 
+-0.001053 0.000530 0.000785 0.000096 0.001411 -0.000694 
+-0.000018 0.002403 -0.004973 -0.005236 0.002094 -0.006167 
+-0.005079 -0.006300 -0.006950 -0.002812 -0.009616 -0.011064 
+-0.001622 -0.005106 -0.011526 0.000416 0.003454 -0.004061 
+0.001567 0.005242 -0.002108 0.004625 0.004380 -0.001510 
+0.000856 0.002275 -0.000049 -0.004170 -0.001008 0.001086 
+-0.006270 -0.003900 0.001744 -0.001236 -0.004523 0.001672 
+0.001926 -0.003456 -0.003853 0.001893 -0.003981 -0.001018 
+0.000340 -0.006879 0.002642 -0.000947 -0.005140 0.004253 
+-0.003370 -0.000140 0.000754 -0.005225 0.002677 -0.002880 
+-0.005844 0.000730 -0.000709 -0.004498 0.002000 0.000000 
+-0.005762 -0.001930 -0.001069 -0.005978 -0.004559 -0.000465 
+-0.003624 0.000874 -0.001420 -0.000867 0.005359 -0.002526 
+-0.000131 0.003064 -0.001447 -0.001162 -0.000038 -0.000230 
+-0.000314 0.002757 -0.001713 0.000396 0.005523 -0.000602 
+0.003779 0.002010 -0.003243 0.000298 0.000072 -0.002057 
+-0.002195 0.001859 -0.000773 -0.001469 0.002521 -0.002523 
+-0.001530 0.002258 -0.000836 -0.001191 0.002327 -0.002097 
+0.001681 0.003019 -0.003159 -0.001152 0.002667 -0.001453 
+-0.000968 0.001606 -0.001826 0.000240 0.001857 -0.002129 
+0.000064 0.000549 -0.005265 -0.001951 0.000115 -0.004360 
+-0.033991 -0.010741 -0.004646 -0.003973 -0.002893 0.001144 
+0.003594 0.004970 -0.002109 0.000952 0.000406 0.003160 
+-0.004751 -0.005217 0.005829 -0.005531 -0.002412 0.003258 
+0.001329 -0.000539 0.001194 0.004266 0.000526 -0.003032 
+0.005477 -0.001626 -0.001339 0.003008 -0.003989 -0.000570 
+0.000221 -0.000401 -0.000612 0.000849 0.000474 0.000463 
+0.001111 0.000305 -0.001685 -0.001393 0.001955 -0.002932 
+0.000629 0.001371 -0.001887 -0.003722 0.002425 -0.001590 
+-0.000379 0.000228 0.000722 0.002876 0.001494 0.000488 
+-0.000650 -0.000305 0.000275 -0.002082 -0.002955 0.004153 
+-0.001506 -0.004011 0.001157 0.000426 0.001487 0.000950 
+0.000148 0.008509 0.000223 -0.003022 0.004032 -0.003031 
+-0.002164 0.005834 0.000876 -0.002257 0.005185 0.000024 
+-0.002025 0.005182 0.001863 0.001063 0.000421 0.002628 
+-0.001691 -0.002398 0.003768 0.000376 -0.000977 0.003158 
+0.001650 0.000201 -0.000175 0.002521 0.002406 -0.001133 
+0.000638 0.000019 -0.000774 -0.003071 -0.001716 -0.000631 
+-0.003025 -0.001712 0.000527 0.000117 -0.000378 0.000923 
+0.000215 0.000229 0.000772 -0.000975 0.001082 -0.000634 
+-0.000553 0.002395 -0.004047 0.003419 0.000376 0.000188 
+0.000910 -0.001069 -0.000431 -0.000980 0.000090 -0.000881 
+-0.004189 -0.000525 -0.001622 -0.005813 0.000617 -0.001174 
+0.002297 0.000583 -0.003216 0.000647 0.001357 -0.009119 
+0.003806 0.001155 -0.006946 0.003846 -0.000686 -0.001948 
+0.000569 -0.002868 -0.000444 -0.002133 -0.004237 0.001153 
+-0.000375 -0.005594 0.002266 0.002155 -0.003432 -0.000359 
+0.002949 0.004221 -0.004014 -0.000561 0.007845 -0.006506 
+-0.002122 0.005798 -0.005518 -0.000574 0.001144 -0.004006 
+0.001107 0.001414 -0.000137 -0.000247 0.000262 -0.000001 
+-0.001888 0.001272 -0.000100 -0.000872 0.003851 -0.002104 
+-0.000042 0.004942 -0.004575 -0.000946 0.002975 -0.004971 
+-0.001374 0.000880 -0.001890 0.007144 -0.000008 -0.002557 
+0.003060 -0.001346 -0.005727 -0.002389 0.002611 -0.002066 
+0.000127 0.006767 -0.000585 -0.000469 0.000263 0.000200 
+0.001367 -0.000999 0.001110 0.002561 0.003208 -0.000537 
+0.000021 0.002709 -0.006037 -0.001581 0.002810 -0.005533 
+-0.001411 0.000186 -0.002424 0.000180 -0.000237 -0.000451 
+-0.001847 -0.002966 0.000173 -0.007008 -0.001210 0.002611 
+-5.439394 -2.878788 -2.553030 -0.039402 -0.010745 -0.013205 
+0.035633 0.040789 -0.003325 0.019216 0.031990 0.001863 
+0.011224 0.005849 0.012428 0.008168 -0.000162 0.008099 
+0.005044 -0.000151 0.001479 0.000413 0.001861 -0.000835 
+-0.002569 -0.000751 -0.000968 0.000605 -0.001389 -0.000215 
+0.000515 -0.001846 0.000730 0.002981 0.003616 -0.000276 
+0.003819 0.005693 -0.003855 0.003527 0.004474 -0.002691 
+-0.003792 0.001750 -0.000875 -0.000901 0.003164 -0.002312 
+-0.001111 0.002206 -0.002724 0.002812 0.000401 -0.000203 
+0.002926 0.000567 0.002513 0.004497 -0.000942 0.003449 
+0.002717 0.000520 0.003296 0.000466 -0.000020 0.000775 
+-0.002182 -0.000838 -0.001529 -0.004286 0.000331 -0.000579 
+-0.000814 0.001488 0.001018 -0.000680 0.002811 0.001106 
+-0.001120 0.000080 0.000320 -0.000959 0.000276 -0.000158 
+-0.001155 -0.000083 0.000239 -0.000780 -0.000690 0.000653 
+0.000086 0.000859 -0.000258 0.002638 0.001979 -0.000534 
+0.001860 0.000680 0.000544 0.000022 0.000180 0.001691 
+-0.002004 -0.000139 0.001847 0.000268 -0.001104 0.001335 
+0.001752 -0.001480 -0.000236 0.001454 -0.000669 -0.000537 
+0.002678 0.004758 0.002080 -0.000593 0.004720 0.001258 
+0.000017 0.002005 0.000781 -0.000625 -0.000975 -0.001300 
+-0.004954 -0.002492 -0.002887 -0.007024 -0.001567 0.000238 
+-0.002667 0.000533 0.001164 0.000199 0.003552 -0.001534 
+0.000253 0.004486 -0.002993 -0.001499 0.001202 -0.000930 
+-0.001739 -0.004734 0.002211 -0.001945 0.000583 -0.000211 
+0.001027 -0.004434 0.001333 -0.000037 -0.004966 -0.000419 
+-0.001363 -0.001692 -0.001802 -0.003436 0.003979 -0.004159 
+-0.002846 0.004235 -0.004721 -0.001894 -0.001912 -0.003005 
+0.002808 -0.000796 -0.003004 -0.000016 0.000033 -0.003496 
+0.000826 0.000261 -0.000087 -0.000541 0.000552 0.001550 
+0.000270 -0.000729 0.001715 -0.002707 -0.004342 -0.000283 
+-0.001125 -0.001518 0.001876 0.004429 -0.000828 -0.001606 
+0.002566 -0.001658 0.000537 0.004126 0.005765 0.001355 
+0.003021 0.002954 -0.002478 -0.000319 0.000281 0.000725 
+-0.002018 -0.001265 0.000378 -0.000733 0.000273 0.000635 
+-0.001772 0.003193 -0.002844 -0.002372 0.004910 -0.004618 
+-0.003870 0.004110 -0.002526 -0.005399 -0.000442 0.000416 
+-0.007192 -0.005122 0.006827 -0.006093 -0.006893 0.008035 
+-4.621891 -2.004975 -1.995025 -0.037563 -0.017011 -0.022531 
+-0.013017 0.009973 -0.008673 0.025454 0.024966 -0.002724 
+0.014023 0.018842 0.007224 0.005721 -0.000240 0.006771 
+0.000581 -0.002200 0.001520 -0.002902 -0.000628 -0.002565 
+-0.002818 -0.001727 -0.005098 -0.000852 -0.001059 -0.003606 
+0.001063 -0.001184 -0.000242 0.001240 -0.000335 0.001710 
+-0.001680 0.001577 0.000723 0.002839 0.002271 0.002109 
+-0.003882 0.001256 0.000799 -0.001416 0.001087 0.001293 
+-0.001431 -0.002336 -0.003224 -0.001781 -0.003570 -0.000961 
+0.000695 -0.001416 -0.000395 0.000969 0.001929 0.003369 
+0.002622 0.000874 0.002098 -0.000166 -0.000419 -0.000230 
+-0.003183 0.000307 -0.002911 -0.003788 0.000815 -0.001836 
+-0.001769 -0.001769 -0.001263 -0.002452 -0.000807 -0.001314 
+-0.000775 -0.000317 -0.004265 -0.000383 0.004863 -0.005628 
+-0.001165 0.000848 -0.002960 -0.000157 -0.000500 0.001899 
+-0.001364 -0.002106 0.004212 -0.002554 -0.001565 0.002761 
+-0.003703 -0.000609 0.000379 -0.003727 -0.003990 0.001345 
+-0.004146 -0.007546 0.004627 -0.004422 -0.006778 0.001990 
+-0.000100 -0.002431 -0.002359 0.005329 -0.001912 -0.002672 
+0.004044 0.005000 0.000822 0.001234 0.003384 0.003331 
+-0.005055 0.001672 0.001484 -0.005248 -0.004898 0.003274 
+0.001366 -0.001561 0.000972 -0.003959 -0.005534 -0.001269 
+-0.002019 -0.002681 0.000679 -0.002252 0.002137 0.001394 
+-0.002617 0.003908 0.000762 -0.004420 0.001247 -0.000407 
+-0.004394 -0.005260 -0.001070 -0.000743 -0.004179 -0.004125 
+-0.000689 -0.000996 -0.002779 -0.001480 0.000403 -0.001750 
+-0.003169 -0.000383 0.002650 -0.002371 -0.000314 0.003788 
+-0.003563 0.000826 0.003459 -0.003977 -0.000564 0.004827 
+-0.003172 -0.000287 0.004541 -0.001416 0.001150 0.000087 
+-0.001364 0.000022 -0.002926 -0.001850 -0.000549 -0.004369 
+-0.003820 -0.005991 -0.003473 0.001567 -0.006044 0.001548 
+0.001823 -0.002060 0.002049 0.002047 0.000644 0.001798 
+0.003500 0.003293 0.001338 0.004990 0.004393 0.001011 
+0.002670 0.003408 0.003006 -0.000943 0.000785 -0.000973 
+-0.005274 -0.000841 0.002195 -0.006593 0.000904 0.001807 
+-0.002433 0.001051 0.003173 -0.000978 0.002603 0.003995 
+0.007262 0.009672 -0.005634 -0.003778 0.001832 0.003097 
+-0.006754 -0.005746 0.006754 -0.000898 -0.000623 -0.000669 
+-0.021850 0.010322 -0.007712 -0.016556 -0.006147 -0.020595 
+-0.017804 -0.006653 -0.008509 -0.004745 0.002157 -0.001565 
+0.000214 0.011272 -0.000676 0.001369 0.007082 -0.003120 
+-0.001554 0.010404 -0.004506 -0.000731 0.007912 -0.002646 
+0.000191 0.000502 -0.000734 -0.000559 -0.001105 -0.002210 
+-0.003092 -0.005933 -0.001589 -0.000482 0.000022 -0.002495 
+0.001426 0.003798 0.000713 -0.000465 0.003992 0.002984 
+-0.003563 -0.000920 0.003905 -0.005438 -0.005535 0.001224 
+-0.006828 -0.007406 0.000315 -0.007955 -0.006886 0.002201 
+-0.006713 -0.005629 0.005807 -0.001010 -0.004141 0.007963 
+0.001771 -0.000877 0.004347 0.001451 -0.000668 -0.000146 
+0.000105 0.002203 0.001267 0.000639 0.004016 0.002190 
+-0.000336 0.001254 0.003284 -0.000978 -0.000097 0.000693 
+0.001349 0.004244 -0.004106 -0.001462 0.004553 -0.002525 
+0.000284 -0.001321 0.000125 0.000341 -0.005625 0.003717 
+0.002711 -0.001084 0.003043 0.002077 -0.000986 -0.000980 
+0.002974 0.000726 -0.001233 0.000945 -0.003516 0.000141 
+0.000624 -0.006238 -0.001248 0.002354 -0.002059 0.000059 
+-0.004148 -0.000574 0.000568 -0.000449 -0.002451 -0.002355 
+0.005625 0.001975 -0.006184 0.007316 0.004684 -0.002194 
+-0.001791 0.004936 0.002091 -0.008424 -0.003803 0.004446 
+-0.007338 -0.006414 0.007917 -0.004326 -0.003182 0.001225 
+-0.001912 0.001659 -0.002249 0.001597 0.006370 -0.003532 
+-0.000561 0.003834 0.000787 -0.003810 0.001091 0.001247 
+0.001075 -0.002877 -0.001267 0.000459 -0.006189 -0.003229 
+0.001724 -0.003310 -0.000946 0.000355 0.001017 0.000420 
+-0.002438 -0.000832 0.002992 -0.002652 -0.002615 0.002462 
+-0.000973 0.000495 0.000231 -0.000564 0.001878 0.001662 
+0.000415 0.003376 0.003498 0.002314 0.003279 0.001977 
+0.001415 -0.000786 0.000026 0.002728 0.001310 -0.005178 
+0.001483 0.003187 -0.004206 0.001379 -0.000996 -0.001142 
+0.001269 -0.000266 0.003115 0.004093 -0.000785 0.003157 
+0.002671 0.001632 0.001918 0.000034 0.000195 0.000922 
+-0.000369 0.000392 -0.001613 0.000699 0.000382 -0.001400 
+0.000290 -0.000862 0.002166 0.001743 -0.003172 0.004487 
+0.000887 0.001342 0.002153 -0.003468 0.003672 0.001020 
+-0.001207 0.003837 0.005358 0.000430 0.004337 0.002524 
+-0.005403 -0.006794 0.004682 -0.000061 -0.001126 -0.001742 
+-0.005344 0.001715 -0.006707 -0.009213 0.000899 -0.004599 
+-0.009207 0.002180 -0.001830 -0.007822 -0.003071 -0.000870 
+-0.003734 -0.000571 0.000818 0.002710 0.010088 -0.004049 
+0.001152 0.014271 -0.009296 0.001648 0.012952 -0.003752 
+0.003747 0.003047 0.000663 -0.002335 -0.001534 0.001411 
+-0.003496 -0.002885 -0.001050 -0.000702 -0.000255 -0.003193 
+0.001368 0.003395 -0.003330 0.000468 0.003115 -0.001085 
+-0.001889 -0.001681 0.001220 -0.001762 -0.005544 0.002396 
+-0.000589 -0.006224 0.002249 -0.002759 -0.006005 0.001480 
+-0.005159 -0.005305 0.003349 -0.001688 -0.005304 0.004179 
+0.002924 -0.002951 0.001369 0.001703 -0.002186 -0.000383 
+0.003391 -0.000438 0.003026 -0.000286 -0.002304 0.004026 
+-0.000766 0.001679 0.001325 0.000479 0.003975 0.005248 
+0.001907 0.002593 0.004011 -0.001664 -0.005485 0.003171 
+-0.004662 -0.003871 0.004918 -0.000689 -0.000195 0.002642 
+0.002130 -0.000649 0.001221 0.005997 -0.000130 0.001012 
+0.000346 0.001600 -0.000263 0.003739 -0.002854 0.000793 
+0.001973 -0.000579 0.000669 0.000751 -0.000214 -0.000632 
+0.001241 -0.002007 -0.002007 0.000330 -0.002956 -0.002539 
+-0.001364 -0.001181 -0.002608 0.001092 0.000457 0.000606 
+0.003625 0.002367 -0.001624 -0.001722 0.000885 0.003347 
+-0.006310 -0.001415 0.003438 -0.002212 -0.002723 0.004980 
+0.000384 -0.000008 -0.000308 0.000761 0.003976 -0.005034 
+0.003069 0.000272 -0.001411 -0.001229 0.000655 0.001103 
+0.000054 -0.000345 -0.000688 -0.001927 -0.005868 -0.001932 
+0.000173 -0.001877 0.001306 0.002026 -0.002348 0.001534 
+-0.002695 -0.001986 0.001936 -0.002105 0.000778 0.001204 
+0.001273 0.000083 0.001008 0.001235 0.001684 0.001803 
+0.001622 0.006967 -0.000909 -0.002480 0.002493 -0.000900 
+-0.000795 0.000543 0.001093 -0.000281 -0.000510 -0.003453 
+-0.001210 0.001614 -0.006453 -0.003240 0.004694 -0.004421 
+0.004658 0.001454 -0.003401 0.000175 0.000718 -0.000497 
+0.000245 -0.002117 -0.000004 -0.000209 0.000956 -0.001162 
+-0.001997 0.002573 -0.003367 -0.001540 0.002412 -0.002678 
+-0.000305 0.000149 -0.000768 0.000837 -0.001091 0.000862 
+-0.002911 0.001476 0.005695 -0.001399 0.002273 0.005147 
+-0.001601 -0.002028 0.004804 0.000479 -0.000431 0.001761 
+0.000633 -0.001593 0.002440 -0.001920 0.000015 0.001344 
+0.002169 0.006251 -0.004962 -0.001490 0.001686 -0.002011 
+-0.002495 0.000161 0.000019 -0.000623 -0.004887 -0.000880 
+0.001614 -0.003314 -0.000542 0.000467 0.002163 -0.000445 
+-0.000937 0.005166 0.000446 -0.000082 0.002745 0.002476 
+0.000072 0.000468 -0.000778 0.001401 0.001069 -0.000500 
+0.001424 0.002658 -0.002317 0.001279 0.004901 -0.004331 
+0.003996 0.003130 -0.005461 0.002254 0.001533 -0.006400 
+0.002419 -0.002097 -0.002581 -0.001823 0.000894 -0.000953 
+0.001153 0.001429 -0.000548 0.003112 0.000692 -0.000513 
+0.001484 -0.000302 -0.000369 -0.000403 0.002194 0.006403 
+-0.001836 -0.002773 0.001415 -0.001625 -0.002300 0.001114 
+0.001126 0.001420 -0.000729 0.004798 0.001456 -0.005058 
+0.002028 -0.000576 -0.002292 0.000487 -0.000380 0.000687 
+0.002403 0.002047 0.003898 -0.001640 -0.000883 0.009969 
+-0.007242 -0.007924 0.009857 -0.004696 -0.004957 0.001739 
+-0.000056 0.004457 -0.002725 0.005698 0.006622 -0.003986 
+0.003200 -0.000012 -0.002257 -0.000613 -0.005591 0.002947 
+0.000833 -0.000218 0.000893 -0.001025 -0.001879 -0.003171 
+-0.002429 0.000854 -0.005121 0.000779 -0.001919 -0.000717 
+0.003609 -0.000199 0.001538 0.004833 0.005197 -0.001061 
+0.000828 0.003306 -0.005562 0.000418 0.003645 -0.001691 
+-0.000574 -0.000847 0.000121 0.000946 -0.001821 -0.001248 
+0.002491 -0.001950 -0.000189 0.002125 0.001510 -0.001206 
+0.001436 0.000995 -0.001844 0.000500 -0.000028 0.000588 
+-0.000811 -0.002722 0.000048 -0.002698 -0.002662 0.000190 
+-0.000466 -0.002245 0.000929 0.000018 -0.001353 0.000598 
+-0.000866 -0.000312 -0.000286 -0.001734 0.001047 -0.000756 
+-0.001566 -0.000259 -0.000870 -0.000986 -0.000415 0.000223 
+0.000192 0.000400 -0.000492 -0.000667 0.000303 0.001001 
+-0.002689 0.000810 0.001633 -0.003276 -0.000893 0.000002 
+0.001111 -0.000455 -0.003133 0.004603 0.000822 -0.004138 
+-0.001579 -0.000023 -0.002426 -0.000330 0.000784 0.000961 
+-0.000881 -0.000884 0.001762 0.000392 0.000125 -0.000242 
+-0.002555 0.000415 -0.001405 -0.000810 0.000280 -0.001688 
+0.000759 -0.004266 0.002040 -0.002221 0.000066 0.002817 
+0.002491 -0.000454 0.000721 0.001778 -0.000085 -0.000057 
+-0.001559 0.000408 -0.000507 -0.004059 0.001099 -0.001431 
+-0.004784 0.002451 0.000378 -0.006987 0.002041 0.005419 
+0.004004 0.007197 0.001970 0.000851 0.006354 0.002929 
+0.001852 0.000411 0.000032 0.004482 -0.000360 -0.003034 
+0.000634 0.001507 -0.000357 -0.004386 0.001887 0.001676 
+-0.007826 -0.001106 0.001547 -0.009017 -0.002356 0.000406 
+-0.003308 -0.003915 -0.000299 0.000801 0.002773 0.000608 
+0.000965 0.004687 0.000586 0.003387 0.004241 -0.004295 
+0.000939 0.000108 -0.004515 0.000768 0.002003 -0.001382 
+-0.000457 0.000816 0.000974 -0.000744 0.000940 0.000248 
+0.003462 0.002283 -0.000647 0.007707 0.005552 -0.001581 
+0.008318 0.007107 -0.002019 0.003987 0.007432 0.001053 
+0.000077 0.002745 -0.000801 0.000087 0.000541 -0.000566 
+0.000645 0.001537 -0.005373 0.002057 0.000655 -0.008217 
+0.004760 0.003803 -0.006724 -0.000133 0.004339 -0.002162 
+0.002021 -0.001730 0.002622 -0.003048 -0.005807 0.007259 
+0.000462 0.002307 0.006094 -0.001141 0.005625 0.002569 
+-0.003891 0.008801 -0.002068 0.002820 0.010459 -0.001030 
+0.004947 0.005523 0.000147 -0.000554 0.001608 0.002045 
+-0.002300 -0.002552 0.004205 -0.001329 -0.001346 0.002189 
+0.001248 -0.000328 -0.001415 0.000359 0.000521 -0.003808 
+-0.000485 0.002872 -0.003723 -0.002647 0.002640 -0.004195 
+-0.002237 0.002270 -0.004007 -0.001416 0.000570 -0.000265 
+-0.000265 -0.001764 -0.001221 0.000221 -0.001791 -0.000576 
+0.000229 -0.000382 0.001299 0.001210 0.001935 0.001210 
+0.000558 0.000496 0.000954 -0.001546 -0.001090 0.001000 
+-0.003098 -0.003380 -0.000519 -0.001872 0.001142 -0.000764 
+0.000092 0.000459 0.000735 0.002646 -0.001030 -0.001445 
+0.000996 -0.000968 -0.000874 -0.002101 -0.000874 0.000112 
+-0.002093 -0.000709 -0.000649 0.000427 -0.000256 0.000171 
+0.001064 -0.000596 0.001845 0.001259 0.001009 0.003368 
+-0.000793 0.002734 0.004386 -0.004183 -0.003084 0.004963 
+-0.000942 -0.003297 0.002672 -0.001591 -0.001388 0.000354 
+-0.001391 0.000710 0.000264 0.001223 -0.000323 0.002496 
+-0.002623 -0.001296 0.001512 0.000912 -0.000772 -0.001156 
+0.001010 -0.000919 -0.001104 -0.000964 0.001519 -0.000419 
+-0.002159 -0.002400 0.000080 0.001617 -0.004857 0.002587 
+0.001377 -0.003252 -0.002315 0.000805 -0.004605 0.000100 
+0.000766 -0.001898 -0.000423 -0.001604 0.002131 -0.000210 
+-0.003885 0.005147 -0.000121 -0.004706 0.007093 0.000779 
+0.003462 0.002737 0.000797 0.004699 0.004031 0.000753 
+0.007082 0.005891 0.001939 0.001789 0.002622 0.005000 
+0.010914 0.010063 -0.007720 0.007487 0.004515 -0.002125 
+0.000669 -0.002987 0.000014 -0.006684 -0.009545 0.004587 
+-0.000669 -0.001601 -0.002838 -0.001948 -0.004613 0.000075 
+0.003256 0.000620 0.002093 0.001904 0.001278 0.003851 
+-0.003608 -0.002638 0.006389 -0.008155 -0.002707 0.001882 
+-0.006345 -0.001881 0.002946 -0.004051 -0.002922 0.004088 
+-0.002130 -0.004916 0.008683 0.000688 -0.001877 0.009324 
+0.005082 0.002103 0.003421 0.008390 0.004508 -0.003166 
+0.007341 0.004343 -0.005803 0.002981 0.003510 -0.003732 
+-0.000812 0.001932 -0.000103 0.000573 0.000801 0.001683 
+0.000546 0.000345 0.001142 0.005521 0.001352 0.001394 
+0.005569 -0.000179 -0.000742 0.000012 -0.001528 0.001272 
+-0.005209 -0.002040 0.001776 -0.009475 0.004738 0.003197 
+-0.008449 0.008643 0.003045 -0.006828 0.010086 0.000681 
+-0.004384 0.007642 0.001675 -0.004918 0.001472 0.001275 
+-0.004768 -0.000340 0.002405 -0.001407 -0.004769 0.006101 
+0.004900 -0.005406 0.004719 0.006672 0.000462 0.003985 
+0.000989 0.000490 0.001080 -0.005159 -0.001054 -0.001331 
+-0.009659 -0.003864 0.001932 -0.010045 -0.002123 0.003970 
+-0.003269 0.000983 0.005858 0.000209 -0.000066 0.002420 
+-0.001971 -0.000598 -0.000565 -0.003221 -0.001241 0.000286 
+0.000059 -0.000710 -0.000192 0.002988 0.000702 -0.002486 
+-0.002833 0.002324 -0.001329 -0.002526 0.002883 -0.001304 
+-0.001579 0.001291 0.002937 0.001984 0.000034 0.001468 
+-0.000199 -0.000296 -0.000117 -0.001928 -0.003602 -0.000377 
+-0.001694 -0.002422 -0.001483 -0.000856 0.000642 0.001980 
+-0.000670 0.004724 0.000688 -0.000626 0.004002 -0.000907 
+-0.009786 -0.000614 0.003683 -0.005621 0.004344 0.004852 
+-0.005377 0.001472 0.004306 -0.004839 0.000836 0.000266 
+-0.003787 0.000098 -0.000301 -0.002778 0.000173 0.001127 
+-0.000510 -0.003265 0.000533 0.001884 -0.001408 -0.001708 
+0.002583 0.001104 -0.002771 0.000497 0.004482 0.000166 
+-0.005149 0.006236 0.000405 -0.007041 -0.000535 -0.001504 
+-0.005185 0.000065 -0.000645 -0.001398 -0.000636 -0.003762 
+-0.003611 -0.001505 -0.006990 -0.007827 -0.000150 -0.010818 
+-0.006279 -0.001779 -0.011558 0.000571 -0.001037 -0.003351 
+-0.002530 -0.001008 0.003650 -0.003144 -0.000335 0.004603 
+-0.000089 0.002633 0.004080 0.016576 0.008813 0.000908 
+0.017781 0.016933 -0.022579 0.015909 0.006582 -0.005329 
+0.001431 -0.001527 -0.000071 -0.007204 -0.008664 0.003616 
+-0.007257 -0.007767 0.003300 0.002855 -0.001539 -0.007205 
+0.010710 0.010126 -0.005961 0.008003 0.008160 -0.001867 
+0.000258 0.000568 0.003385 0.000851 -0.001701 0.001493 
+-0.000251 -0.005090 -0.001445 0.000635 -0.002527 -0.001831 
+-0.002960 -0.002094 0.005343 -0.006980 -0.001923 0.010938 
+-0.005652 0.002055 0.007843 -0.002125 0.005061 0.000229 
+-0.000848 0.006421 -0.003154 -0.000240 0.005313 -0.001120 
+0.003000 0.001584 0.001812 -0.000084 -0.002552 0.003054 
+0.005955 -0.002986 0.002978 0.003102 -0.002217 -0.001193 
+-0.000829 -0.000958 -0.000778 -0.000587 0.001089 0.001416 
+0.001190 0.001494 0.002806 0.000086 0.003697 0.001510 
+-0.008647 0.009137 -0.006254 -0.011542 0.009346 -0.006954 
+-0.009693 0.008839 -0.006839 -0.002858 0.005129 -0.010071 
+0.002949 -0.000077 -0.000886 -0.008553 -0.012161 0.001989 
+-0.001570 -0.006467 -0.000074 0.004510 0.002098 0.004413 
+0.000219 0.002875 -0.001286 -0.003193 -0.002237 -0.003721 
+0.001114 -0.008140 -0.006088 0.004164 -0.005707 -0.008316 
+0.003863 -0.001959 -0.007219 0.003901 -0.000709 -0.007447 
+0.003189 0.002220 -0.004406 -0.001128 -0.001068 0.000997 
+-0.002088 -0.004128 0.001205 -0.000510 0.000012 -0.000201 
+0.001176 -0.000106 0.000822 -0.000614 -0.000700 -0.001310 
+0.000608 -0.000779 -0.000762 -0.001382 -0.005372 0.002352 
+-0.002817 -0.005925 0.003595 -0.002766 -0.003220 -0.000843 
+0.000823 -0.000610 0.000889 -0.001942 0.003972 0.003030 
+-0.002112 0.006136 -0.001453 -0.005176 0.000175 -0.003702 
+-0.007387 0.001473 -0.001742 -0.006412 -0.000043 0.000462 
+-0.002273 0.001952 -0.000742 -0.001057 0.004132 0.001352 
+-0.001478 0.002581 0.001448 0.000740 0.002148 -0.003926 
+-0.000307 0.004042 -0.001837 -0.002201 -0.000860 0.000038 
+-0.008466 -0.002706 -0.000727 -0.011240 0.002810 0.003309 
+-0.002552 0.003491 0.006073 -0.008743 -0.003849 -0.000078 
+-0.008665 0.004373 -0.008826 -0.005365 0.000782 -0.003130 
+-0.006388 -0.003983 -0.011102 -0.008972 -0.004233 -0.015914 
+-0.000385 -0.000388 0.000076 0.014072 0.010015 0.011279 
+-0.000668 0.000126 0.000799 -0.001938 0.001154 0.004179 
+-0.002095 0.000702 0.003367 0.008987 0.007963 -0.001302 
+0.031254 0.016499 -0.008678 0.014301 0.006276 -0.005780 
+-0.012411 -0.012171 0.004484 -0.017099 -0.018179 0.007928 
+-0.012004 -0.011711 0.006930 -0.003350 -0.000887 -0.002777 
+0.008672 0.006651 -0.001884 0.011739 0.010090 -0.004529 
+0.005457 0.004245 -0.002188 -0.000611 -0.000644 -0.000060 
+-0.000598 0.000522 -0.002520 0.003133 0.002364 -0.000043 
+0.003212 0.001918 0.001101 -0.000130 -0.000206 -0.000358 
+-0.002975 0.000274 -0.001496 -0.003808 0.001771 0.000046 
+-0.003130 0.002540 0.001210 -0.001579 0.001134 0.000761 
+0.000762 0.000541 -0.000434 0.001236 0.000416 0.001806 
+0.001628 0.000845 0.002543 0.001214 -0.000240 0.001348 
+0.001715 -0.001444 -0.002519 0.003822 0.002401 -0.003828 
+-0.002795 0.004524 -0.003341 -0.009360 0.009777 -0.006083 
+-0.012768 0.012661 -0.001296 -0.007355 0.014260 -0.005051 
+-0.002457 0.010993 -0.006955 0.004102 -0.000193 -0.001497 
+0.002405 -0.002460 -0.001139 -0.004992 0.000004 -0.002748 
+-0.005603 -0.001285 -0.002164 0.001204 0.001311 0.001003 
+0.000116 0.004085 0.001554 -0.004309 0.006826 -0.004539 
+-0.002949 0.007586 -0.005375 0.011093 0.004314 -0.003567 
+0.005378 -0.004752 -0.008911 0.000881 -0.003300 -0.003258 
+-0.001269 -0.000913 -0.002531 -0.000692 -0.001765 -0.002289 
+-0.003560 -0.001594 -0.000043 -0.001147 -0.000636 -0.000800 
+0.001234 0.000087 0.000860 0.000547 0.001385 0.000344 
+-0.001039 0.000598 -0.000720 -0.001221 -0.001477 0.001667 
+-0.000067 -0.002303 0.000523 0.000945 0.000965 -0.001417 
+-0.001182 0.000839 -0.000477 -0.000892 0.000638 0.000176 
+0.000207 -0.001353 -0.000505 0.002730 -0.000698 -0.004160 
+0.002859 0.003707 -0.004547 -0.001663 0.002578 -0.002270 
+0.000709 0.001559 0.001701 0.000565 0.001600 0.002636 
+0.001066 0.000118 -0.002446 -0.004801 -0.001086 -0.005004 
+-0.008922 -0.001599 -0.005980 -0.010972 0.001302 -0.007689 
+-0.010398 0.004931 -0.011309 -0.015129 0.004918 -0.002677 
+-0.001226 0.000716 0.004752 0.014346 -0.003477 0.010066 
+0.021218 -0.002222 0.012165 0.016277 -0.002018 0.011501 
+0.025436 -0.007477 0.017989 0.016567 0.008263 0.006473 
+-0.016455 0.007330 -0.026054 0.017289 0.004898 0.022983 
+-0.001121 -0.002337 0.000061 -0.002451 -0.003196 0.003362 
+-0.003536 -0.002511 0.003225 -0.000231 0.004572 0.003357 
+0.014130 0.014023 -0.000566 0.006393 0.009715 -0.011364 
+-0.008840 -0.016068 0.001630 -2.233161 -2.347150 0.238342 
+-2.497630 -2.175355 0.180095 -0.025370 -0.015537 0.001893 
+-0.015810 -0.011024 0.003215 0.003534 0.002793 0.003151 
+0.005343 0.006664 0.005357 0.002905 0.004300 -0.000838 
+-0.000110 0.000376 -0.001441 -0.002536 0.001342 0.003182 
+0.000682 0.002049 0.003501 0.003088 0.001014 0.002100 
+0.002436 0.001260 0.000893 0.001589 0.002484 0.000423 
+0.001515 0.002555 0.000738 0.000419 0.001676 0.000838 
+-0.001521 0.002437 0.001036 -0.001704 0.005179 0.002100 
+0.000712 0.005790 0.004475 0.003871 0.001155 0.007531 
+0.002055 -0.004007 -0.000478 -0.002583 0.001876 -0.000553 
+-0.014581 0.009006 -0.003958 -0.019334 0.011904 -0.001526 
+-0.015293 0.009920 0.004381 -0.004533 0.002906 0.002723 
+0.004211 -0.002382 -0.001564 0.005196 -0.003043 -0.000925 
+0.001776 -0.000992 -0.000367 0.001681 -0.000975 -0.000619 
+0.002589 -0.001982 -0.001072 0.001272 -0.000882 -0.000195 
+-0.000217 0.002524 0.001190 0.000649 0.005551 0.000653 
+0.001875 0.004683 -0.003513 0.000527 0.001094 -0.002312 
+-0.002079 -0.000366 0.003097 -0.001945 0.000320 0.007008 
+-0.003415 0.000395 0.000237 -0.000310 -0.000335 0.000111 
+-0.002536 -0.003112 -0.001998 -0.003623 -0.001495 -0.004002 
+-0.001447 0.002314 0.000517 0.000071 0.004545 0.000014 
+-0.002289 -0.000887 0.001256 -0.000108 -0.000501 0.001214 
+0.003017 -0.000172 -0.002155 0.002892 -0.001197 -0.001847 
+0.001096 -0.000405 0.000200 -0.001349 -0.004327 -0.000333 
+0.002495 -0.002639 -0.000081 0.003395 0.001604 -0.009526 
+0.008716 0.003563 -0.013065 0.001035 0.003038 -0.007395 
+-0.003685 -0.007457 0.003217 -0.014123 0.000632 0.002720 
+-0.010244 0.008017 0.003912 -0.010919 0.015171 0.005419 
+0.000543 0.028867 -0.003969 0.004957 -0.002688 -0.003548 
+0.026824 -0.014432 -0.003621 4.138728 -1.578035 0.317919 
+4.850427 -2.162393 1.508547 5.592982 -2.357895 2.371930 
+6.278389 -2.271062 2.769231 7.051814 -2.145078 2.720207 
+7.471075 -1.471074 5.421488 5.571429 0.725275 4.186813 
+-0.001477 0.021120 -0.028135 0.000156 -0.007919 0.005254 
+-0.003088 -0.003986 0.000506 -0.004151 -0.000748 0.002198 
+-0.002928 -0.004687 0.004459 -0.005614 -0.003883 0.001054 
+-0.005421 -0.001870 0.003482 0.002884 -0.000641 -0.002243 
+-0.000516 -0.001131 -0.003357 -0.015606 -0.023979 0.002039 
+-3.487805 -2.459350 -0.154472 -4.014184 -2.670213 -0.042553 
+-3.937238 -2.489540 0.150628 -0.025565 -0.015834 0.000471 
+0.007736 0.003630 -0.006188 0.010133 -0.006872 0.006573 
+0.014261 0.011940 0.002543 0.003774 0.000484 0.005061 
+-0.004188 -0.002028 0.004804 -0.002573 0.002149 0.003889 
+-0.001031 0.003171 0.000056 -0.001402 0.005030 -0.000381 
+-0.001478 0.002102 0.000047 0.001393 -0.000093 0.000173 
+0.003391 0.002641 0.002027 0.001451 0.005909 0.004388 
+-0.003281 0.004747 0.004097 -0.007777 -0.000272 0.003087 
+-0.008830 -0.002983 -0.000613 -0.009437 0.002091 -0.002568 
+-0.009661 0.006722 -0.003275 -0.007738 0.005185 -0.001463 
+-0.002738 0.000411 0.000127 0.003149 -0.001201 -0.000644 
+0.005770 -0.000433 0.000468 0.005333 -0.000394 0.000757 
+0.006003 -0.001551 0.000509 0.007199 -0.003463 0.001531 
+0.004094 -0.003913 0.001910 0.001058 -0.002909 0.000079 
+-0.001342 -0.001919 -0.000609 -0.002872 -0.000226 0.001058 
+-0.001780 0.000899 0.001189 -0.001516 0.001314 0.000467 
+-0.003441 -0.000178 0.002249 -0.003676 0.000828 0.002639 
+-0.001975 0.001495 0.001555 0.000045 0.003150 -0.000009 
+-0.001546 0.005305 -0.001364 -0.002580 0.003271 -0.003489 
+-0.001171 -0.001696 0.000337 -0.000678 0.000872 0.006852 
+0.000284 0.002461 0.006536 0.000854 0.004170 0.004747 
+-0.000146 0.004913 0.004034 0.005959 0.002692 0.004294 
+0.004317 0.004898 0.002258 0.000329 0.001127 0.001030 
+-0.000823 -0.000927 -0.002399 0.003468 0.000094 -0.001289 
+0.004772 0.001508 -0.002396 -0.005389 0.004829 0.000681 
+0.002013 0.004612 0.003062 -0.008600 0.000712 0.009543 
+0.006764 -0.001204 0.000846 0.028493 -0.009160 -0.004991 
+4.306570 0.481752 -1.029197 4.898203 -1.209581 -0.604790 
+5.450893 -2.866071 0.334821 6.152249 -2.910035 1.304498 
+6.768769 -2.861862 2.252252 7.231231 -2.780781 3.042042 
+7.409091 -2.489511 3.479021 7.188073 -1.926605 3.564220 
+6.401197 -1.215569 3.023952 4.992701 -0.284672 2.036496 
+0.028638 0.012769 0.004516 -0.008904 0.013341 -0.013118 
+-0.002575 -0.005379 0.000572 -0.005344 -0.008458 0.004229 
+-0.000987 -0.001382 -0.002285 -0.004783 -0.010255 0.003052 
+-0.005571 -0.010120 0.006105 -0.009114 -0.010456 0.003592 
+-0.007863 -0.018031 -0.004474 -0.017040 -0.030319 -0.014142 
+-3.834951 -3.199029 -0.635922 -4.708207 -3.367781 -0.027356 
+-5.187845 -3.317680 0.397790 -4.973155 -2.714765 0.426174 
+-3.285024 -1.241546 -0.222222 0.000472 0.002620 -0.006773 
+0.027142 0.014273 -0.000996 0.021870 0.013594 0.001120 
+0.002981 0.002182 0.002150 -0.007311 -0.001478 0.000863 
+-0.008341 0.002008 0.002376 -0.006550 0.005763 0.003034 
+-0.003167 0.005346 0.001608 0.001155 0.002899 0.002172 
+0.002610 0.004507 0.007033 -0.004234 0.000225 0.007419 
+-0.010013 0.007040 0.001943 -0.007521 0.009501 0.000791 
+-0.000059 0.006680 0.000235 0.002496 0.004426 0.001876 
+0.003863 0.003087 0.002459 0.005370 0.000916 0.002666 
+0.005322 0.000628 0.002733 0.003213 0.000143 0.001450 
+0.000179 -0.002437 -0.000986 -0.000963 -0.007389 0.002656 
+0.005307 -0.003881 0.003251 0.006051 -0.000246 0.001331 
+0.004942 0.001538 0.000463 0.000853 0.001192 0.000994 
+0.000520 -0.003320 0.002379 -0.002575 -0.001728 -0.001930 
+-0.005547 -0.003706 0.001150 0.000268 -0.000080 -0.000468 
+-0.000250 0.004414 -0.007702 0.008592 -0.000460 -0.004321 
+0.003502 0.008191 -0.001366 -0.000092 0.007999 0.003130 
+-0.004164 0.001785 0.002290 0.002155 0.005930 -0.003504 
+0.000563 0.004152 -0.002267 0.000877 0.002858 -0.000788 
+0.001855 0.010539 0.002479 0.005088 0.012348 0.008093 
+0.006942 0.009846 0.004103 0.001788 0.006653 0.001546 
+-0.002934 0.004409 0.001707 -0.004645 0.001634 -0.002650 
+-0.007772 -0.000996 -0.006156 -0.007234 -0.000043 -0.009802 
+-0.012196 0.000720 0.001366 -0.001808 0.001726 0.004398 
+0.020584 -0.006031 -0.000563 4.308176 -0.610063 -1.132075 
+5.159575 -2.718085 -1.670213 5.104265 -3.616114 -1.635071 
+4.932127 -3.393665 -1.298643 4.995690 -3.099138 -0.650862 
+5.284000 -2.672000 0.320000 5.879845 -2.434108 1.465116 
+6.530172 -2.280172 2.625000 6.739884 -2.011561 3.601156 
+6.390909 -1.409091 3.954545 0.050935 -0.002619 0.027000 
+0.031919 0.010498 0.004581 0.012038 0.018249 -0.006440 
+0.002253 0.007203 -0.010091 0.015169 0.000316 -0.007051 
+-0.007208 -0.004612 0.001952 -0.009833 -0.008670 0.006499 
+-0.014486 -0.009917 0.001574 -0.001367 -0.009509 0.004454 
+-0.006848 -0.002203 0.006294 -0.004425 -0.002630 -0.000367 
+-0.009048 -0.016770 -0.003476 -0.020078 -0.023488 0.005248 
+-0.038362 -0.020165 -0.009859 -4.718750 -3.250000 -0.223958 
+-6.030303 -3.420455 0.500000 -6.535256 -3.185897 0.916667 
+-6.091195 -2.421384 0.849057 -5.169117 -1.474265 0.639706 
+-3.544041 -0.507772 0.461140 0.000417 0.000530 -0.002941 
+0.025009 0.013681 -0.017296 0.024247 0.016599 -0.007144 
+0.013309 0.003956 -0.000068 -0.000825 0.002531 0.000249 
+-0.009410 0.004767 0.001764 -0.010266 0.005092 0.003362 
+-0.003632 0.001130 0.001646 0.003799 -0.001643 0.004071 
+0.004193 -0.003862 0.001857 0.008717 0.001683 0.004623 
+0.007179 -0.002047 0.002610 0.005574 -0.003307 -0.000769 
+0.006986 -0.001441 0.000968 0.007603 0.002120 0.002224 
+0.005166 0.000894 0.000034 0.001922 -0.003808 0.004520 
+0.001356 -0.000529 0.001403 0.002969 -0.001069 -0.002674 
+0.003668 -0.001336 -0.004723 0.005650 0.001604 -0.004314 
+0.001200 0.003291 -0.000524 -0.000636 -0.001342 -0.001019 
+-0.000920 -0.004248 -0.000742 -0.003546 -0.006866 -0.000101 
+-0.004181 -0.005080 0.007101 -0.000279 -0.004601 0.002308 
+0.006195 0.000827 -0.007047 0.009688 0.004741 0.001685 
+0.001487 0.005550 0.000384 -0.000264 0.002690 -0.002062 
+-0.002866 0.002440 -0.004136 -0.006079 0.002928 -0.003759 
+-0.006152 0.008669 -0.001624 -0.004320 0.013648 -0.001086 
+0.003291 0.019696 0.002712 0.011278 0.017270 0.004196 
+0.006139 0.007891 0.002056 -0.009108 -0.002455 0.004524 
+-0.021467 -0.003613 0.002339 -0.013425 -0.007561 0.002741 
+-0.009202 -0.003594 -0.005924 0.008976 -0.004370 -0.008830 
+0.029993 -0.013019 -0.005074 4.523365 -2.457944 -0.528037 
+5.321300 -3.223827 -0.754513 5.599349 -3.087948 -0.908795 
+5.453287 -2.588235 -0.937716 5.038136 -2.190678 -0.949153 
+4.355191 -2.060109 -1.076503 4.115385 -2.147436 -0.974359 
+4.409722 -2.243056 -0.145833 0.041484 -0.009632 0.012441 
+0.027129 -0.006991 0.018998 0.008347 -0.000860 0.011629 
+0.006944 -0.000478 -0.002069 0.007578 -0.007703 -0.005717 
+0.001900 -0.006589 -0.006235 -0.002493 0.000593 -0.001039 
+0.002672 0.011417 0.000911 0.008035 0.010692 -0.003171 
+0.001671 0.002092 0.000373 -0.000320 -0.000007 0.000173 
+-0.007242 -0.003925 0.000966 -0.011681 -0.005391 0.000299 
+-0.004186 -0.009583 0.008521 -0.001733 0.002207 0.006020 
+0.003738 0.002128 -0.002523 -0.002398 -0.009697 0.002253 
+-0.013703 -0.010236 0.020177 -0.035394 -0.012590 -0.006470 
+-5.572917 -3.208333 -0.437500 -7.179348 -3.532609 0.831522 
+-7.629371 -2.919580 1.486014 -7.370370 -2.190883 1.669516 
+-6.590778 -1.538905 1.890490 -4.865517 -0.682759 1.875862 
+-0.014287 -0.003489 0.012448 0.013486 0.006735 0.001704 
+0.019053 0.002172 0.006770 0.007157 -0.012068 0.011976 
+0.001621 -0.012647 0.006154 -0.002948 -0.002682 -0.001430 
+-0.015134 -0.003786 -0.008360 -0.010822 -0.014509 -0.005465 
+0.007246 -0.013041 0.009209 0.010523 -0.007019 0.006621 
+0.008282 -0.004241 0.002179 0.006284 -0.001947 0.001113 
+0.006082 0.002281 0.001754 -0.000092 0.001767 0.001745 
+-0.002587 -0.005180 0.002215 -0.001037 -0.010035 0.003532 
+0.002325 -0.007639 0.004525 0.005029 -0.001954 0.000495 
+0.004989 0.003863 0.000218 0.001294 0.003356 0.000889 
+-0.000985 0.001079 -0.000141 -0.003051 0.000534 -0.002341 
+-0.001488 0.000672 -0.003029 -0.003696 -0.004515 0.002850 
+-0.006888 -0.007439 0.007122 -0.003858 -0.006634 0.003618 
+0.004830 -0.000579 -0.001198 0.006727 0.006621 -0.001041 
+0.005712 0.011723 -0.010241 0.001331 0.007040 -0.013905 
+-0.002334 0.001261 -0.007199 -0.002062 0.001468 0.005707 
+-0.007532 0.012355 0.004385 -0.004132 0.012866 0.002917 
+-0.000726 0.008691 0.002672 0.000317 0.004737 0.000988 
+-0.002629 0.005634 -0.000906 -0.003888 0.001195 0.004300 
+0.005988 -0.001863 0.004360 0.021810 -0.007296 0.002427 
+3.756098 -2.165854 0.175610 5.242537 -2.399254 -0.208955 
+6.000000 -2.505882 -0.408824 6.244681 -2.539894 -0.364362 
+6.320000 -2.620000 -0.191429 6.560885 -2.767528 -0.066421 
+6.742857 -2.834286 -0.177143 5.152381 -2.476191 -0.771429 
+0.012143 -0.002703 -0.013745 -0.013278 -0.003426 -0.014195 
+-0.011159 -0.000555 -0.005527 -0.003883 0.003444 0.001929 
+0.005969 0.007168 -0.002513 -0.001475 -0.000663 -0.011368 
+-0.004699 -0.003105 -0.006463 -0.006637 0.000083 -0.002854 
+-0.004771 0.003790 0.000503 -0.001511 0.004222 0.003232 
+-0.003415 0.005085 -0.002079 -0.003257 -0.001418 -0.004422 
+0.004029 -0.001186 -0.005449 0.000891 -0.002799 0.000941 
+-0.002538 -0.004477 -0.001424 -0.005166 -0.005413 -0.001180 
+-0.003967 -0.005602 -0.000316 0.001852 -0.005664 0.006405 
+0.000722 0.004336 0.007200 0.002634 0.005019 0.002602 
+0.000903 -0.004469 -0.003932 -0.012595 -0.022030 -0.003909 
+-0.043563 -0.016303 -0.003035 -0.075456 -0.050330 -0.005388 
+-9.386364 -3.590909 1.212121 -8.714859 -2.437751 2.152611 
+-7.784703 -1.679887 2.716714 -6.812169 -0.994709 3.251323 
+-5.324159 -0.021407 3.733945 -3.041353 1.063910 4.319549 
+-1.140426 1.331915 5.089362 -0.380488 0.229268 5.239024 
+0.572368 -1.394737 3.684211 0.014199 0.006336 0.007752 
+0.000735 0.015438 -0.006019 -0.018638 0.005381 0.001826 
+0.003865 -0.003588 0.013337 0.006062 -0.005334 0.006263 
+0.005298 -0.002119 0.002786 0.001522 0.000944 -0.000289 
+0.004583 -0.001081 0.006004 0.003884 -0.001119 0.003500 
+-0.002657 -0.003686 0.001380 -0.000093 -0.001246 -0.000808 
+0.002149 0.000797 -0.001157 0.003086 0.002772 0.000973 
+-0.000024 0.004254 0.001413 -0.002326 0.003612 0.000505 
+-0.003449 0.002301 -0.000287 -0.003988 0.000389 -0.003251 
+0.000705 -0.001401 -0.000398 -0.001142 -0.005097 0.003967 
+-0.006350 -0.003476 0.004203 -0.007526 -0.000726 0.005218 
+-0.002749 0.005603 0.003322 -0.002767 0.015177 -0.015098 
+-0.005323 0.008776 -0.022938 -0.007292 0.005421 -0.017368 
+-0.003419 -0.002072 0.004227 0.000651 0.005416 0.011790 
+0.001038 0.005921 0.005364 -0.001990 -0.000219 -0.000987 
+-0.001027 -0.003610 0.001115 0.009912 -0.008142 0.002023 
+0.023799 -0.015270 0.009623 3.375610 -2.600000 1.975610 
+4.692884 -2.737828 1.749064 5.679612 -2.744337 1.132686 
+6.402367 -2.591716 0.517751 7.031792 -2.439306 0.202312 
+7.537736 -2.358490 0.207547 7.810277 -2.272727 0.403162 
+7.706587 -2.215569 0.664671 7.279570 -2.408602 0.806452 
+0.056765 -0.023320 -0.002725 0.007856 -0.009977 -0.004569 
+-0.002620 0.002079 0.000413 -0.000536 0.001648 -0.001114 
+0.002501 0.003108 -0.003004 0.009457 0.002712 -0.008024 
+0.009973 -0.004219 -0.006318 0.003488 -0.002317 -0.001310 
+-0.002751 0.001934 0.000890 -0.004030 0.007638 0.003463 
+-0.002453 0.017014 -0.002963 -0.003217 0.005565 0.004946 
+-0.005795 0.006454 0.001471 -0.006804 -0.001240 -0.000442 
+0.005333 -0.001532 -0.002680 0.003296 -0.006322 0.000405 
+0.004476 -0.005827 -0.002376 0.007338 -0.004106 -0.003494 
+0.003907 0.001151 -0.002402 -0.002630 0.000118 0.005116 
+-0.000363 0.002369 0.004223 -0.000507 0.000232 0.003734 
+0.006857 0.005686 -0.000352 0.011862 0.007098 -0.002301 
+0.002879 -0.004925 -0.008086 -0.015625 -0.021875 -0.028125 
+-0.064098 -0.052839 -0.010705 -9.213593 -3.446602 1.446602 
+-8.797752 -1.685393 2.657303 -7.966942 -0.417355 3.665289 
+-6.740602 0.857143 5.142857 -4.898833 1.918288 6.622568 
+-2.762115 2.242291 7.405286 -1.308989 0.584270 7.117978 
+0.647541 -3.737705 4.180328 0.015445 -0.007277 0.004920 
+0.001262 0.010937 0.001514 -0.007095 -0.002457 0.013033 
+0.002119 -0.000473 0.003487 0.000916 0.000915 0.001903 
+0.000319 0.001318 0.000546 -0.002134 -0.004405 0.006463 
+0.004371 -0.007224 0.004130 0.003160 -0.002348 -0.001960 
+0.002249 0.001795 -0.000101 0.002201 0.003597 0.001127 
+0.000292 0.002066 0.001838 -0.002174 0.002443 0.002252 
+-0.003679 0.004707 0.002492 -0.004508 0.005847 0.002044 
+-0.004505 0.002914 0.000681 -0.002160 -0.000096 -0.006743 
+0.000790 -0.005649 -0.000648 -0.001888 -0.004647 -0.000351 
+-0.003304 -0.002102 0.001391 -0.005643 0.003740 0.007179 
+-0.006739 0.005604 0.009957 -0.004405 0.001344 0.009505 
+0.001644 -0.008425 0.004210 -0.003818 -0.005631 -0.015843 
+-0.019874 -0.029066 -0.009893 -0.022944 -0.022214 -0.000979 
+-0.021242 -0.023601 0.010681 -0.007151 0.003036 0.009262 
+0.003382 0.001054 0.006105 0.020235 -0.012419 0.005127 
+3.262673 -2.470046 1.944700 4.577359 -2.747170 1.943396 
+5.801444 -2.714802 1.855596 7.090551 -2.480315 1.539370 
+7.976191 -2.366667 1.057143 8.716129 -2.522581 0.664516 
+9.929293 -2.787879 0.545455 12.134615 -2.576923 0.653846 
+0.095827 -0.003489 -0.001287 0.004968 0.017897 -0.008515 
+-0.002485 0.004030 -0.002841 -0.001051 0.001293 -0.001217 
+-0.002292 0.000183 0.000767 -0.005148 -0.000053 0.000783 
+-0.006331 0.001130 -0.003744 -0.001571 -0.001466 -0.005077 
+0.003605 -0.000478 0.000158 0.006947 0.000122 0.001290 
+0.005962 0.000744 -0.002237 0.000988 0.001441 -0.001992 
+0.000401 0.002523 -0.003736 -0.000262 0.006797 -0.005657 
+-0.000738 0.006477 -0.002162 -0.002321 -0.001709 0.001093 
+-0.001173 -0.003703 -0.000374 0.000432 -0.007486 0.000241 
+0.003071 -0.006402 -0.004372 0.006315 -0.001752 -0.007606 
+0.005345 -0.000216 -0.001767 0.000490 -0.001143 0.004501 
+-0.004234 -0.001780 0.003241 -0.003136 -0.001256 0.002507 
+-0.000762 -0.000547 0.000833 0.003281 0.002056 -0.000894 
+0.006956 0.003994 -0.006881 0.005880 0.001181 -0.009966 
+-0.006001 -0.004550 -0.012702 0.001380 -0.029296 -0.005366 
+-0.034300 -0.035616 0.009646 -5.686131 0.664234 1.912409 
+-4.890710 1.688525 3.825137 -4.072917 1.942708 5.156250 
+-2.941176 1.405229 5.758170 -0.026000 -0.015253 0.040485 
+0.009616 -0.016041 0.030856 0.003111 -0.000093 0.000158 
+0.000345 -0.001339 0.010822 -0.000404 0.001964 0.000697 
+-0.002002 0.001957 -0.002168 -0.001471 0.003774 0.000339 
+0.000503 0.001600 0.004663 0.001660 -0.000111 0.002118 
+0.000700 -0.002534 -0.000497 0.001816 0.000349 0.000133 
+-0.000566 0.002005 0.000451 -0.003158 0.000711 0.000124 
+-0.001965 0.000179 -0.000581 0.000315 -0.001001 -0.000776 
+0.001131 0.000104 0.000166 -0.000351 0.000721 0.000502 
+-0.001469 -0.001869 -0.007277 -0.002427 0.004312 -0.002186 
+-0.002774 -0.002332 -0.000389 -0.001776 0.000985 0.001017 
+0.001526 0.006668 0.000950 0.001834 0.006362 0.002142 
+0.000097 0.002340 0.001176 -0.002327 -0.003554 0.002819 
+-0.004399 -0.007796 -0.005205 -0.023477 -0.006398 -0.007346 
+-0.023464 -0.001688 0.006087 -0.024640 0.003669 0.012435 
+-0.017111 0.002361 0.018467 -0.005088 -0.001305 0.026955 
+0.004228 0.010812 0.019151 -0.000511 -0.017321 0.003220 
+0.032614 -0.031617 0.008624 6.337209 -3.418605 1.337209 
+0.074458 -0.029783 0.026473 0.067279 -0.024541 0.029694 
+0.053661 -0.012806 0.017826 0.051853 -0.004595 -0.005688 
+0.039622 -0.009971 0.011178 0.029363 0.006791 -0.009152 
+-0.000440 0.001004 -0.002512 -0.008272 0.007147 -0.002193 
+-0.007098 0.006955 -0.004314 -0.002329 0.002232 -0.003027 
+-0.007112 -0.004285 0.002618 -0.001850 -0.015624 0.003908 
+-0.004397 -0.011063 0.006572 -0.001854 -0.001462 -0.000339 
+0.005682 -0.000816 -0.001224 0.007195 -0.003055 -0.005519 
+0.001886 -0.002608 -0.006408 0.005168 0.004951 -0.003018 
+0.003198 0.002171 0.002881 0.003933 0.002154 0.003373 
+0.002951 -0.000361 0.002885 0.003773 -0.004155 0.006829 
+-0.000447 -0.008040 0.002674 -0.001463 -0.007638 -0.000500 
+-0.002118 -0.004465 -0.001379 0.000353 -0.000707 -0.001501 
+0.004414 0.001035 -0.001668 0.007207 0.000407 -0.002483 
+-0.001505 0.002814 -0.004456 0.001189 0.005553 -0.000631 
+-0.000618 0.001399 0.002377 -0.002894 0.002035 -0.001899 
+0.000661 0.000957 -0.000877 0.004511 0.002008 0.000773 
+0.008360 0.000978 -0.002451 0.000913 -0.001530 -0.006537 
+-0.010762 0.005043 -0.005652 -0.013328 0.006612 0.009626 
+-0.019741 -0.000563 0.017948 -0.017464 -0.005344 0.022259 
+-0.003143 -0.011851 0.018348 0.009391 -0.012633 -0.007789 
+0.002247 0.013536 -0.007128 -0.002426 -0.004871 0.007302 
+-0.001050 -0.001517 0.006529 -0.000280 0.001372 -0.004431 
+-0.000699 0.002459 -0.005485 0.001525 0.001072 -0.000541 
+-0.000199 -0.000208 -0.000392 -0.000438 -0.000942 -0.001031 
+0.000527 -0.000306 -0.000094 -0.000146 -0.001176 -0.000324 
+-0.003259 -0.004813 -0.000280 -0.004466 -0.005854 0.000859 
+-0.002501 -0.002674 0.001031 -0.000278 -0.000302 0.000845 
+0.000691 -0.000024 0.000182 -0.000908 0.000325 -0.000169 
+-0.002531 -0.000050 0.000405 -0.002293 -0.002177 -0.000438 
+-0.000369 -0.003361 -0.000141 0.002001 0.000185 -0.000368 
+0.003846 0.004557 0.000484 0.002414 0.000242 0.000933 
+-0.000017 0.000391 0.000267 -0.002605 -0.004244 0.004236 
+-0.003358 -0.007909 0.003645 -0.004382 -0.018462 0.004521 
+-0.010460 -0.010629 0.010206 -0.021898 0.006467 0.014959 
+-2.128079 1.339901 2.650246 -1.073469 1.775510 4.008163 
+-0.440909 1.704545 4.718182 -0.285714 0.835714 4.642857 
+0.009615 -0.016892 0.027767 0.026383 0.006210 0.006008 
+0.017668 -0.014137 0.003486 0.016241 0.003140 0.006497 
+0.004737 0.004027 -0.006000 0.012642 0.004693 -0.022521 
+0.001223 0.000613 -0.017294 -0.009863 0.002676 -0.005437 
+-0.013912 0.004695 -0.003066 -0.010117 0.006961 -0.002383 
+-0.002587 0.012040 -0.002598 0.001181 -0.000159 -0.000262 
+-0.002382 0.000410 0.004015 -0.009929 0.000568 0.007133 
+-0.007968 0.002103 0.001457 -0.002879 0.003101 -0.003765 
+-0.003776 0.004500 -0.002094 -0.002950 -0.001743 -0.004424 
+0.003825 0.009486 -0.012846 -0.002932 0.009826 -0.005297 
+0.003773 0.005093 0.002683 -0.001877 0.003005 0.003941 
+0.001143 0.002510 0.006849 -0.001991 0.002118 0.002680 
+-0.003331 -0.003832 -0.005254 -0.002756 -0.002101 -0.004938 
+0.000997 0.005328 -0.003333 0.007709 0.001402 -0.001280 
+0.008473 -0.000978 -0.001739 0.005689 -0.002652 -0.006990 
+0.003516 -0.001707 -0.008129 -0.000600 0.001200 -0.005308 
+0.002515 -0.000397 -0.001953 -0.000063 -0.000006 0.000394 
+-0.005185 -0.004920 0.002791 -0.007055 -0.003761 0.007579 
+-0.004090 -0.002954 0.004847 0.004676 0.000599 -0.003040 
+0.002135 -0.003216 -0.005384 0.002232 0.003046 0.000669 
+0.000116 0.002873 0.000024 0.000376 0.001271 0.000226 
+0.000989 0.001007 -0.001370 0.000235 -0.000347 -0.004623 
+-0.001046 -0.000142 -0.005117 0.000998 0.000163 -0.002524 
+0.001345 -0.000120 -0.002090 0.001404 -0.000609 -0.001056 
+0.000372 -0.001261 -0.000192 -0.002101 -0.000696 -0.003054 
+-0.004985 -0.000143 -0.003169 -0.002282 0.000533 0.000179 
+0.001002 -0.000703 -0.000671 0.000280 -0.003293 -0.001504 
+0.000600 -0.000786 -0.000473 0.000723 0.004532 0.000222 
+0.000121 0.005058 0.000668 -0.001818 0.000809 0.001136 
+0.000029 -0.000682 0.001811 -0.001800 0.000420 0.000912 
+0.000504 0.003517 0.000035 0.002044 0.002746 0.000391 
+0.000955 -0.001044 0.000155 -0.001804 -0.002080 -0.000541 
+-0.002841 0.000575 0.001326 -0.001245 0.000495 0.001478 
+-0.000431 0.000324 -0.000260 -0.002758 -0.007819 0.007774 
+-0.005666 -0.013591 0.010305 -0.004817 -0.007523 0.002806 
+0.011714 0.001525 -0.010061 -0.009600 0.008658 0.014023 
+-2.247934 1.450413 3.396694 -2.171004 1.947955 4.784387 
+-1.869110 2.560210 5.649215 -0.020128 0.020971 0.056097 
+0.001269 -0.016485 -0.003467 -0.005687 0.002839 -0.034620 
+-0.007762 0.007054 -0.011186 -0.002154 -0.000695 -0.006065 
+0.003302 -0.003218 -0.012032 0.000870 -0.002843 -0.011539 
+-0.004025 0.000907 -0.005306 -0.006359 0.001006 -0.002282 
+-0.003768 0.000279 0.000355 -0.002059 0.005014 -0.000520 
+-0.001545 -0.000613 0.001573 -0.001180 -0.001357 0.003713 
+-0.002051 0.000243 0.001393 -0.003287 0.001682 -0.003873 
+0.001209 0.002021 -0.001869 -0.000077 0.001691 -0.000169 
+-0.000747 0.000907 -0.001653 -0.003326 0.001355 -0.004218 
+-0.001940 0.002874 -0.003091 -0.001582 -0.002747 -0.000626 
+0.001313 -0.003623 0.002650 0.000950 -0.004115 0.002846 
+0.000953 -0.000032 0.000789 0.003390 0.003814 -0.002119 
+-0.001158 0.002373 -0.001515 0.004676 0.000871 0.003209 
+0.001401 0.003228 -0.001201 0.000812 -0.000495 -0.000114 
+0.001585 0.000671 -0.000996 0.002620 0.003443 -0.003937 
+0.006114 0.006070 -0.006125 0.008286 0.006929 -0.005524 
+0.007506 0.001929 -0.000930 0.002595 -0.003175 -0.003634 
+-0.000614 -0.005008 -0.001444 -0.003028 -0.001951 0.000203 
+-0.001933 0.000739 0.001981 0.000673 0.001612 0.000909 
+0.003857 0.001029 -0.003445 0.008629 0.001165 -0.008152 
+0.009277 0.007078 -0.010236 0.000874 -0.001166 -0.007597 
+0.006459 0.001723 -0.002843 0.003576 0.001155 -0.000503 
+0.001964 0.001256 -0.002874 -0.000298 0.003436 -0.005266 
+0.000105 0.005534 -0.003294 0.000131 0.001627 0.000553 
+-0.001271 -0.000726 -0.001521 -0.003900 -0.000160 -0.003381 
+-0.007990 0.001491 -0.002705 -0.007524 0.001713 0.001681 
+-0.004263 0.000299 0.003260 -0.001171 0.001967 0.002108 
+-0.000513 0.003743 0.001158 -0.001701 0.001892 0.000919 
+-0.000339 -0.001380 0.000709 0.000845 -0.001342 -0.000863 
+-0.000583 0.001039 -0.000483 0.003027 0.004008 0.000245 
+0.000113 0.003889 0.000015 -0.000156 0.001802 0.000087 
+0.000402 0.000163 0.000159 0.000465 -0.000960 -0.000385 
+-0.001316 -0.001335 -0.001239 -0.003224 -0.001852 -0.000117 
+-0.002721 0.000623 0.001452 -0.000912 0.001779 -0.001067 
+-0.000690 -0.000448 -0.000646 -0.002756 0.006443 -0.008010 
+0.001729 0.014176 0.001225 0.010052 0.005560 0.005119 
+-0.002129 0.004594 0.032111 -0.011718 -0.003009 0.048359 
+-0.023418 -0.006041 0.046963 -0.019636 -0.012666 -0.009524 
+-0.003738 -0.000091 -0.015180 -0.003882 0.002478 -0.003632 
+-0.003816 0.001141 0.005674 -0.002393 0.000463 0.001847 
+-0.000105 -0.001299 -0.003793 -0.002036 0.000685 -0.001976 
+-0.000109 0.002470 0.001708 -0.001794 0.002506 0.000056 
+-0.000154 0.000547 -0.000085 -0.000556 0.001282 0.000140 
+-0.001642 0.000506 0.000951 -0.000529 -0.000340 -0.000025 
+0.000274 0.002375 -0.003258 0.002508 0.000647 -0.002103 
+0.002052 -0.002960 0.001894 -0.000378 -0.003739 0.001798 
+-0.000989 -0.001301 -0.001870 0.001291 -0.001291 -0.002951 
+-0.004591 0.001555 0.000181 -0.003328 0.004081 -0.004563 
+-0.001615 0.002385 -0.001615 0.002375 0.003533 -0.002287 
+0.005540 0.001125 0.000476 -0.000382 -0.000155 0.004526 
+0.000308 -0.001903 0.001660 0.000056 -0.000168 0.004320 
+0.001907 0.001010 0.001839 0.000898 0.001606 -0.000051 
+-0.001902 -0.000460 0.000140 -0.001116 -0.002956 -0.000525 
+-0.001870 -0.000611 0.001870 0.004798 0.002182 -0.001396 
+0.007535 0.000651 -0.004651 0.004148 -0.003123 0.000862 
+-0.001597 -0.003825 -0.001035 -0.001904 -0.003369 -0.000197 
+-0.001780 -0.000682 -0.001780 -0.001172 -0.000686 -0.000881 
+-0.001984 -0.000393 0.001414 -0.000044 -0.000135 0.001766 
+0.001752 0.003208 -0.000024 0.004928 -0.000988 0.000027 
+0.003865 0.003723 0.003209 -0.000117 0.003498 0.001175 
+-0.000816 0.001620 -0.000038 -0.001333 0.000074 -0.000126 
+-0.001172 -0.001053 -0.000781 -0.000671 0.000040 -0.000333 
+-0.001573 0.001376 0.000103 -0.004051 0.001685 -0.002073 
+-0.010473 -0.003524 -0.005743 -0.010908 -0.006521 0.004602 
+-0.002107 0.001502 0.002530 -0.000051 0.004636 0.000449 
+-0.000439 0.001002 0.000449 -0.000110 -0.003832 0.000157 
+0.001821 -0.003322 -0.000305 0.003157 0.000248 -0.000884 
+0.000580 0.001576 0.000104 -0.003757 -0.001138 0.000786 
+-0.004277 -0.002416 -0.001651 -0.001310 -0.001273 -0.001486 
+0.001175 -0.000541 0.000554 0.002771 -0.000981 0.000822 
+-0.002843 -0.003073 -0.002207 -0.004284 -0.004529 -0.000935 
+0.000366 -0.000603 -0.000642 0.003164 0.001562 0.000702 
+0.001981 0.003303 0.001171 0.001753 0.004971 -0.000936 
+0.003297 0.005962 -0.001286 0.001899 0.009419 0.001486 
+-0.000062 0.000193 0.000404 -0.001168 -0.004996 -0.007594 
+0.002601 -0.003467 -0.005858 -0.001448 0.000614 -0.001538 
+-0.000003 0.000353 0.000761 0.001318 -0.001574 -0.000475 
+0.001590 -0.001567 -0.002171 0.000513 0.001560 -0.004103 
+0.004078 0.003759 -0.005438 0.004261 0.002741 -0.003295 
+-0.000653 0.001147 -0.001837 -0.002885 -0.000108 -0.003431 
+-0.002844 0.000730 -0.004152 -0.000628 0.002280 -0.002368 
+0.000440 -0.002735 0.001465 -0.003232 -0.007241 0.004102 
+0.000034 -0.002587 0.004072 -0.000276 0.000151 -0.004545 
+0.004962 0.006579 -0.006579 0.004677 -0.001348 0.000211 
+0.000734 0.000623 0.000939 -0.000846 -0.000717 -0.001959 
+-0.004688 -0.000966 -0.001656 -0.004178 0.001636 -0.000726 
+-0.001538 -0.000627 0.000941 -0.001322 -0.000679 0.002983 
+-0.001904 -0.000319 0.001687 -0.004480 -0.000125 -0.000166 
+-0.000219 0.001875 -0.001471 -0.001934 -0.003625 0.002338 
+-0.001872 -0.008366 0.001235 -0.003126 -0.007947 0.003482 
+-0.005798 -0.005511 0.003500 -0.005055 0.000682 -0.000775 
+0.001110 -0.005977 0.002900 -0.001403 -0.007212 0.004849 
+-0.002602 -0.007317 0.003659 -0.002419 -0.006533 0.003752 
+-0.001578 -0.004734 0.002500 -0.000626 -0.001044 -0.001908 
+0.003041 0.000633 -0.005134 0.002946 0.002228 -0.001652 
+-0.002217 0.002374 0.001232 0.000642 -0.000663 0.002909 
+-0.002172 -0.000387 0.007150 -0.000948 0.001605 0.005191 
+0.001192 0.001472 0.004534 0.003463 0.003653 0.002642 
+-0.000436 0.001531 0.001251 -0.003852 -0.000817 -0.001298 
+-0.004968 -0.002297 -0.003245 -0.003874 -0.001808 -0.003639 
+-0.001117 -0.000508 -0.001521 0.000221 0.000496 0.000967 
+-0.003071 -0.000450 -0.000509 -0.003869 -0.002788 0.004480 
+-0.005183 -0.000649 0.006414 -0.007532 -0.000243 0.006317 
+-0.006525 -0.002289 0.002703 -0.002474 -0.003576 -0.000142 
+0.000397 -0.002522 -0.000796 0.000672 -0.000529 -0.000345 
+0.000818 -0.000215 -0.000146 0.001601 -0.001455 -0.000291 
+0.002485 -0.001486 0.000165 0.002942 0.000204 0.001656 
+0.002792 0.002090 0.003169 0.002439 0.001974 0.002423 
+0.000691 0.000090 0.000112 0.000294 0.000854 0.000402 
+0.000641 0.001884 0.001082 0.001444 0.000573 -0.000234 
+0.002341 -0.002312 -0.000649 0.000410 -0.001488 0.000200 
+-0.000584 0.001889 -0.001037 0.000900 0.003330 -0.001696 
+0.005869 0.003955 -0.005450 0.003606 -0.003076 -0.005016 
+-0.001318 0.001061 -0.001041 -0.001415 0.001933 -0.000738 
+-0.000897 -0.000966 -0.002090 -0.000635 0.000161 -0.000960 
+0.001348 -0.000694 -0.000509 -0.001744 0.000956 0.002909 
+-0.000622 -0.002705 0.001182 -0.001228 0.000126 -0.000189 
+-0.001749 0.000841 -0.000195 -0.002492 0.002874 -0.000960 
+-0.006364 0.000152 -0.000076 -0.003794 -0.001479 -0.002830 
+-0.002885 -0.000484 -0.001098 0.001665 0.000365 -0.003188 
+0.000011 -0.000019 -0.003985 0.000449 -0.001111 -0.004679 
+-0.001092 0.000341 -0.005836 -0.001806 0.001238 -0.001394 
+-0.001406 0.001225 -0.004078 -0.001510 -0.000499 -0.002445 
+0.001635 -0.001295 -0.002187 0.002113 0.000398 -0.003940 
+-0.001408 -0.000997 -0.004399 0.000200 -0.005000 -0.001400 
+-0.000227 -0.001979 -0.002752 0.001156 -0.001115 -0.001569 
+0.001777 0.000907 0.000057 0.001630 -0.000486 -0.001823 
+-0.001833 -0.001132 -0.001289 -0.002456 -0.000868 -0.002493 
+-0.002222 -0.002934 -0.000570 0.003115 -0.001307 -0.001637 
+0.002853 0.004066 -0.002164 0.000019 0.000459 0.000903 
+-0.006534 -0.001006 0.001786 -0.006020 -0.006428 -0.000684 
+-0.002680 -0.002960 0.001080 0.000309 0.001023 -0.001940 
+0.000471 0.002518 -0.000153 0.001096 0.003004 0.001542 
+0.001955 0.000312 0.001145 0.001788 -0.000098 0.000341 
+-0.000051 0.000254 0.001170 -0.000364 0.000355 0.001840 
+0.000218 0.000149 -0.001129 -0.000808 -0.001387 -0.003680 
+-0.000715 -0.001319 -0.001164 -0.005032 0.000615 -0.000889 
+-0.007467 0.000775 -0.004004 -0.007293 -0.003908 -0.008067 
+-0.011161 -0.009390 -0.009990 -0.013417 -0.002546 -0.003165 
+0.000430 -0.000952 -0.000522 -0.001244 0.000714 0.002344 
+-0.004490 0.000065 0.004981 -0.006382 -0.002150 0.002761 
+-0.004234 -0.004178 -0.000477 -0.001690 -0.004569 -0.002071 
+-0.000920 -0.003181 -0.001671 -0.002113 -0.001488 -0.000727 
+-0.002964 -0.000771 -0.000558 -0.002185 -0.000982 -0.000731 
+-0.001538 -0.000238 -0.000362 -0.002754 0.002184 0.000000 
+-0.002917 0.003153 -0.000848 -0.001148 -0.001533 -0.001280 
+-0.006045 -0.007830 -0.001907 -0.006637 -0.007734 0.004927 
+-0.007771 -0.006026 0.003464 -0.007124 -0.003530 0.000751 
+-0.003322 -0.004432 -0.002737 0.000631 -0.005721 -0.002389 
+0.001371 -0.001948 -0.000126 0.000162 0.001893 0.000125 
+0.002004 0.002730 -0.001866 0.001853 -0.001514 -0.000585 
+0.001792 -0.000501 0.001693 0.000469 0.000904 0.002974 
+0.000462 -0.000753 0.002362 -0.003537 -0.001442 -0.000185 
+-0.003979 -0.003142 0.001047 -0.003639 0.000189 0.004051 
+-0.004040 0.001878 0.002256 -0.002061 -0.000420 -0.000420 
+-0.002128 -0.001253 -0.001940 -0.001542 -0.002363 0.000721 
+-0.001296 0.001630 -0.001296 0.001237 0.003677 0.000430 
+0.003209 0.004417 -0.000270 0.001703 -0.000067 -0.003389 
+-0.002078 -0.004011 -0.001643 -0.005556 -0.000127 -0.001146 
+0.000300 -0.000400 -0.000379 -0.000470 0.000705 -0.001450 
+-0.002118 0.003068 -0.003030 -0.006348 0.000374 -0.000971 
+0.000307 0.000216 -0.000820 0.000088 -0.002391 -0.001858 
+0.002012 -0.001384 0.000713 0.001001 -0.002878 -0.001373 
+-0.000075 0.000485 -0.000485 -0.000520 0.001920 -0.001439 
+0.004892 -0.000044 -0.002578 0.005957 0.002241 -0.003381 
+0.005182 0.002589 -0.003111 0.002680 0.002123 -0.001712 
+0.000157 0.000000 -0.000236 -0.000078 0.000155 0.000543 
+-0.000049 -0.000293 0.000752 -0.000296 0.000202 0.000253 
+-0.002125 -0.000862 0.001849 -0.000867 -0.000699 0.002213 
+0.000315 0.000622 -0.000932 -0.000920 0.002064 -0.001897 
+-0.000801 0.000751 -0.000400 0.000707 0.001907 0.000922 
+-0.001221 0.003626 0.000214 -0.002493 0.004874 -0.001473 
+-0.003036 0.002277 -0.002353 -0.000918 -0.002496 -0.001779 
+-0.000833 -0.002440 -0.001148 0.000336 -0.000733 -0.001366 
+-0.000972 0.000360 -0.003663 -0.004997 -0.000767 -0.003203 
+-0.007358 -0.005642 0.003432 -0.009010 -0.001747 0.000180 
+-0.005672 -0.002216 0.000258 -0.002943 -0.002826 -0.001069 
+-0.002469 -0.004082 0.000163 0.001834 -0.004457 -0.003051 
+0.004614 -0.002796 -0.004485 0.002925 -0.003583 -0.002884 
+-0.002257 -0.002891 -0.001824 -0.004948 -0.001074 -0.000365 
+-0.003454 -0.000323 0.000562 -0.000948 -0.000816 -0.000454 
+0.000733 -0.002066 -0.001292 0.001428 -0.001572 -0.000761 
+0.000827 0.001127 0.000717 -0.000356 0.002925 0.001369 
+-0.001737 0.001492 0.000121 -0.001856 -0.000044 -0.002829 
+-0.001453 -0.001226 -0.001178 -0.002754 0.001141 0.001170 
+-0.006959 0.005225 0.001397 -0.007453 0.001675 0.002776 
+-0.003992 -0.002188 -0.001038 0.004524 -0.002475 -0.001717 
+0.006339 0.002024 0.001161 -0.002014 0.005486 0.000449 
+-0.002927 0.003824 -0.000901 -0.000115 -0.001176 -0.000560 
+0.000832 -0.001570 0.000041 -0.000378 -0.000454 -0.002391 
+0.000763 0.004751 -0.002404 -0.000549 -0.001648 -0.000164 
+-0.000823 -0.001822 -0.002850 0.000253 -0.003807 0.000890 
+-0.001000 -0.000271 -0.000163 0.000709 -0.000046 0.000313 
+0.007938 -0.001102 -0.003351 0.007426 0.002784 -0.006036 
+0.005546 0.001609 -0.002209 0.001058 0.003198 0.000886 
+-0.000221 0.001990 -0.001843 -0.001905 -0.000995 -0.000466 
+-0.001343 -0.004516 -0.004062 -0.001732 -0.001039 -0.002079 
+-0.000763 0.002362 -0.000509 -0.001536 0.004354 -0.002132 
+0.002496 0.002084 -0.005792 -0.002023 -0.001026 -0.004112 
+-0.001283 0.002058 -0.000400 -0.002014 -0.001649 0.000777 
+0.000709 -0.001890 -0.002205 -0.001705 -0.002403 -0.003411 
+-0.002741 0.001869 -0.001061 -0.002102 -0.001823 0.006212 
+0.003146 -0.000657 -0.003216 0.000466 -0.001086 -0.003571 
+0.001804 -0.000538 -0.004375 0.002923 0.000000 -0.002923 
+-0.000425 0.002425 -0.000315 -0.003008 0.003095 -0.000860 
+0.000333 0.001520 0.000770 0.001314 -0.001059 0.002275 
+0.000000 -0.000593 -0.000296 0.004761 0.002745 0.000257 
+0.003348 0.003087 -0.003462 0.004356 0.004741 -0.003459 
+0.006534 0.005620 0.001089 0.005198 0.004439 0.003364 
+0.002756 0.001158 0.000455 -0.001913 0.000517 0.002535 
+-0.001364 -0.000130 -0.000290 0.001253 -0.001137 -0.001513 
+0.001907 -0.001273 -0.001450 0.000024 -0.001609 -0.001239 
+-0.001059 -0.001240 -0.000609 -0.001318 -0.000470 0.000148 
+-0.002700 -0.000352 0.000158 -0.004481 0.001085 0.000779 
+-0.006216 -0.006437 0.000300 -0.004202 -0.003371 -0.004002 
+0.002204 0.007175 -0.008996 0.013365 0.017942 -0.007281 
+0.013687 0.007562 -0.003353 0.000076 0.001475 0.000769 
+-0.007424 0.002644 -0.000466 -0.004163 0.005002 0.002860 
+0.006190 0.004169 0.001480 0.008456 0.000114 -0.002457 
+0.006698 -0.004172 -0.003471 0.005510 -0.004840 -0.002322 
+0.004221 0.000887 0.000790 0.005710 0.006936 0.002603 
+0.006685 0.007469 -0.000364 0.000287 0.000778 -0.001270 
+-0.001072 -0.001944 -0.002073 -0.007485 -0.006171 -0.000334 
+-0.000702 -0.003454 0.001093 -0.002156 -0.000243 -0.002360 
+0.007500 0.000638 0.000066 0.007265 0.002998 -0.003496 
+0.001340 -0.002195 -0.002457 0.001278 -0.002490 -0.002867 
+0.000104 -0.001190 -0.001389 0.001687 0.000040 0.001480 
+0.002729 -0.001514 0.002061 -0.000830 -0.002214 0.002270 
+-0.001224 0.000409 -0.001091 -0.002470 0.001294 -0.001542 
+-0.002892 0.000079 -0.001157 -0.001384 -0.001083 0.001283 
+-0.001774 -0.000543 -0.004273 -0.003607 0.001639 -0.002787 
+-0.001870 0.000569 -0.001301 0.002301 0.008964 -0.000515 
+0.004683 0.004683 -0.003968 0.002678 0.001403 -0.000254 
+-0.000624 0.003138 0.000210 -0.002220 0.003417 -0.000916 
+-0.002121 0.001916 0.000258 -0.000138 -0.000010 0.000280 
+0.000272 -0.000475 -0.000045 -0.000581 -0.000707 -0.000126 
+-0.000597 -0.001703 -0.001576 0.000653 -0.002344 -0.002041 
+0.000264 -0.001692 -0.001118 -0.003313 -0.003030 -0.000113 
+-0.002939 -0.008481 0.002687 0.001521 -0.007818 -0.000578 
+-0.000577 -0.000210 -0.000997 -0.000877 0.001389 0.001024 
+-0.000022 0.000703 0.000807 0.002160 -0.000081 0.000135 
+0.001137 -0.001044 0.000464 -0.001056 0.000938 0.000472 
+-0.002264 -0.000477 -0.001188 -0.000255 0.004972 -0.001816 
+-0.001307 0.002340 -0.000532 0.000343 0.001127 -0.000392 
+-0.000444 -0.001677 -0.000860 0.002426 0.000426 0.000317 
+0.005177 0.002778 -0.000960 0.003881 0.003202 0.001970 
+0.001851 0.004632 0.002933 0.004385 0.006638 -0.002845 
+0.000558 -0.000140 -0.001183 -0.000857 0.000312 0.001478 
+-0.001699 -0.003912 -0.000078 -0.000192 -0.002253 0.000013 
+-0.002400 -0.002569 -0.000685 -0.001035 -0.002236 -0.000951 
+-0.001830 -0.000089 0.000051 -0.003477 0.002397 0.003177 
+-0.002283 0.001836 0.005131 0.001790 -0.002992 0.004008 
+0.000370 -0.004875 0.001209 0.001921 0.001291 0.000049 
+0.004851 0.005947 -0.005068 0.003859 0.006900 -0.010203 
+-0.004672 0.008067 -0.009146 -0.004322 0.002677 -0.000927 
+-0.003520 -0.001584 0.000507 -0.007478 -0.009229 0.002335 
+-0.006645 -0.016006 -0.003662 -0.005733 -0.004915 -0.002657 
+0.000764 -0.003518 -0.002371 0.003898 -0.008613 -0.001162 
+0.000126 -0.011863 0.002302 -0.006366 -0.007559 0.002329 
+-0.007263 0.000942 0.004118 -0.005256 0.001488 0.003331 
+-0.006815 -0.005328 0.003371 -0.004141 -0.011445 -0.004952 
+-0.001839 -0.010399 -0.006100 -0.006584 -0.005235 -0.007006 
+-0.002304 0.002271 -0.005004 0.001201 -0.001442 0.000070 
+0.002246 -0.000772 0.001513 -0.000137 0.002081 0.001336 
+-0.002541 0.003292 0.002041 -0.002666 0.001742 0.002117 
+-0.000935 0.000030 0.001581 0.000025 0.000119 -0.000181 
+0.000057 0.002536 -0.002422 0.000932 0.003379 -0.003699 
+0.000738 0.002705 -0.001329 0.000261 0.001695 0.000391 
+0.000000 0.001755 -0.000439 -0.001514 0.001570 -0.001599 
+-0.000827 -0.000157 0.000827 -0.000945 -0.000927 0.000618 
+0.000446 0.001916 -0.001470 0.007546 0.000915 -0.002363 
+0.001725 0.001356 0.000082 -0.006184 -0.001497 -0.000970 
+-0.008113 0.000829 -0.001599 -0.008787 -0.005007 0.005621 
+-0.004279 -0.002140 0.001240 0.000337 -0.000303 -0.000699 
+0.000611 -0.000270 -0.000432 -0.000763 -0.000271 -0.000948 
+-0.002137 -0.000331 -0.000744 -0.002976 -0.000981 -0.001083 
+-0.003402 -0.001696 -0.001437 -0.004758 0.001237 -0.001011 
+-0.007630 0.002543 0.001654 -0.006950 0.000062 -0.002379 
+-0.000639 0.000483 0.000153 -0.000400 -0.001492 -0.002106 
+-0.001727 0.000563 -0.004352 -0.002476 0.000931 0.000733 
+-0.001393 0.000524 -0.000316 0.001502 0.000391 0.001698 
+0.001386 0.000841 0.001874 0.000269 -0.000134 0.000224 
+-0.000379 0.000586 -0.000971 -0.000036 0.001301 -0.001694 
+0.000919 0.004474 -0.000343 0.006716 0.002038 -0.000240 
+0.002992 0.009847 -0.005985 -0.002783 0.002504 -0.006471 
+-0.000135 -0.001540 -0.006294 -0.000576 -0.003094 -0.006403 
+0.003792 -0.004400 -0.004245 0.003804 -0.002970 -0.001123 
+0.000956 -0.003649 0.000548 0.000880 -0.002268 0.003785 
+0.000333 0.000607 0.003637 -0.002583 0.002548 0.003744 
+-0.003557 0.001016 0.002043 0.001719 0.001301 -0.002934 
+0.005269 0.002094 -0.002739 0.001710 0.005078 0.000908 
+0.001263 0.007123 -0.004602 0.001969 0.006747 -0.007028 
+0.000151 0.005911 -0.006116 -0.002873 0.005889 -0.005067 
+-0.006380 0.004346 -0.007202 -0.008948 0.000919 -0.009157 
+-0.011819 -0.001414 -0.006905 -0.013268 0.000366 -0.000586 
+-0.001985 0.001951 -0.000345 0.005824 0.002965 -0.005382 
+0.006333 0.005647 -0.006406 0.005570 0.005708 -0.005691 
+0.001992 0.005428 -0.003958 -0.001478 0.005839 -0.001642 
+-0.004955 0.003721 -0.002611 -0.007196 0.000196 -0.004408 
+-0.012962 -0.001814 -0.005524 -0.015545 0.002040 -0.002336 
+-0.007422 0.002894 -0.002272 -0.003242 0.001909 -0.000028 
+-0.002195 0.000536 -0.000725 -0.002377 -0.002824 -0.002675 
+-0.001289 -0.002842 -0.003356 -0.001621 0.000257 -0.002379 
+0.000606 0.000480 -0.003586 0.003053 0.001246 -0.004673 
+0.002320 0.001724 -0.004975 0.000365 0.001029 -0.001433 
+-0.001584 -0.001606 0.000716 -0.002108 0.001032 -0.000234 
+-0.002780 0.004197 0.002001 -0.003787 0.006613 0.001211 
+-0.002417 0.005563 -0.000241 0.000240 0.001475 -0.000096 
+-0.000720 -0.000440 -0.003880 0.001788 0.003064 -0.002170 
+0.001980 -0.000224 -0.000780 -0.003495 -0.002559 0.002054 
+-0.004080 -0.001849 -0.001111 -0.001465 -0.001319 0.002455 
+0.000000 -0.000279 -0.000019 0.000098 0.000491 0.000225 
+0.000422 0.001358 0.001171 0.002753 0.001247 0.000726 
+0.002933 0.002390 0.000814 -0.000714 0.001270 0.004524 
+-0.001326 0.002524 0.003344 -0.001108 0.001806 0.002085 
+-0.001077 0.001152 0.000409 -0.002446 -0.000248 -0.000792 
+0.000925 0.000161 0.000273 -0.000333 0.002343 0.001544 
+0.002130 0.002201 0.003022 0.003298 0.003364 0.002838 
+0.001413 0.000132 0.003066 0.001442 -0.001197 0.002177 
+-0.003066 -0.004599 0.001533 -0.001760 -0.001548 0.000657 
+-0.000236 0.000520 0.000378 0.000059 -0.001114 0.000794 
+-0.001168 -0.002235 -0.001677 -0.000495 0.000521 -0.003099 
+-0.000547 -0.001556 -0.002909 -0.001335 -0.001016 -0.002231 
+-0.000486 0.001083 -0.000542 -0.002140 -0.000857 -0.005884 
+-0.000523 0.001254 -0.006536 0.001184 0.001795 -0.004044 
+-0.000440 0.001393 -0.000218 -0.000629 0.001228 0.002807 
+-0.000667 0.000468 0.004524 -0.001687 0.001304 0.003360 
+-0.002262 0.003388 0.001308 -0.004858 0.000279 0.000672 
+-0.004401 -0.003160 -0.003460 -0.004405 -0.005350 -0.003538 
+-0.004689 -0.003353 -0.000878 -0.002412 0.000698 0.001998 
+-0.000221 0.004960 0.000330 -0.004362 0.002566 -0.000108 
+-0.005820 0.000542 0.001658 -0.005070 -0.001157 0.000938 
+-0.003103 -0.001040 0.000006 -0.001635 0.000068 -0.000260 
+-0.006341 0.000238 0.002391 -0.008758 -0.000908 0.004720 
+-0.009029 -0.003881 0.002787 -0.008558 -0.005781 0.000602 
+-0.000086 -0.000260 0.000466 0.004110 -0.002873 0.001892 
+0.005244 0.000355 0.007309 0.006032 0.000694 0.007645 
+0.007488 0.001374 0.004981 0.008081 0.001158 0.002002 
+0.001610 0.001020 0.003383 -0.004037 0.006048 0.002720 
+-0.006857 0.003715 -0.000376 -0.006484 0.001372 -0.001546 
+-0.004312 -0.000676 -0.005545 -0.001569 -0.002251 -0.005367 
+0.000000 -0.001528 -0.003056 0.001013 -0.004197 0.000109 
+0.001022 -0.003872 0.001129 -0.002800 -0.000811 0.002028 
+-0.000921 0.000189 0.000581 0.002374 0.001283 -0.000319 
+-0.002382 0.005188 0.001615 -0.003089 0.002114 0.005854 
+-0.001682 0.000427 0.005072 -0.000394 0.000478 -0.000573 
+-0.000627 0.002084 -0.001643 -0.006473 0.001498 -0.000701 
+-0.011240 -0.004560 -0.001720 -0.005165 -0.003341 -0.004644 
+-0.001403 0.001246 0.000206 -0.002977 -0.002824 0.001069 
+-0.002353 -0.000459 -0.001020 -0.002621 -0.000419 -0.000556 
+-0.002115 -0.000496 0.002192 -0.001358 0.001410 0.003654 
+-0.002578 0.003359 -0.000391 -0.002155 0.003491 0.002568 
+0.002397 0.003802 0.002066 0.002857 0.000082 -0.002929 
+0.000911 -0.001099 0.000393 -0.001809 -0.001333 -0.002285 
+0.000512 -0.003480 0.003231 0.004295 0.005662 -0.001301 
+0.009239 0.003660 0.005182 0.001221 0.002651 0.005500 
+0.000074 -0.000221 0.005000 -0.001686 -0.000937 0.003614 
+-0.001292 0.000980 0.000031 0.000000 0.002269 0.002836 
+0.001742 0.001019 0.002547 0.003384 -0.000164 -0.000080 
+0.003591 -0.000702 -0.003199 0.003228 -0.002321 -0.002907 
+0.001456 -0.001258 -0.001239 -0.001069 -0.001565 -0.001153 
+-0.000771 -0.002312 0.001542 0.002964 0.000691 0.001007 
+0.007672 0.003288 -0.007786 -0.001966 0.006345 -0.004558 
+-0.001737 0.002173 -0.004047 -0.002165 0.001526 0.001487 
+-0.003323 0.001200 0.001301 -0.002391 0.002465 0.001419 
+-0.008956 0.002154 0.000406 -0.018075 0.004450 -0.001659 
+-0.021217 0.002850 -0.001753 -0.021747 -0.000731 0.000809 
+-0.018243 -0.001684 0.004143 -0.008242 -0.000464 0.003848 
+0.009114 -0.001930 -0.002691 0.010403 -0.001534 -0.007671 
+0.005076 -0.000168 -0.002136 -0.001141 -0.000268 0.000077 
+-0.003701 -0.001544 -0.000388 -0.003140 -0.001740 0.000766 
+-0.003463 -0.001423 0.001535 -0.006837 -0.000782 0.000657 
+-0.009327 -0.001876 -0.003117 -0.008182 -0.006163 -0.003873 
+0.002270 -0.003259 0.000444 0.015704 -0.001032 0.010024 
+0.025383 -0.000338 0.012436 3.245614 0.140351 0.938596 
+3.633484 0.099548 1.144796 3.962366 0.075269 1.301075 
+0.035039 0.010643 0.014680 0.027967 0.006890 0.011146 
+0.012720 0.004458 0.005676 0.001193 0.001019 -0.001838 
+-0.002232 0.002114 -0.004323 -0.000882 0.001993 -0.005022 
+-0.001860 -0.000620 -0.004651 -0.005878 -0.000868 -0.002868 
+-0.005232 -0.001807 0.004791 -0.001341 0.001147 -0.001043 
+0.001760 0.000777 -0.003854 0.001583 0.002281 0.000897 
+0.003479 -0.001636 0.004401 0.004528 -0.001655 0.005224 
+0.002495 -0.000840 0.002529 0.003701 0.000284 -0.005132 
+0.002631 0.001130 -0.000563 -0.003932 0.002151 0.001558 
+-0.004081 0.002776 0.002098 -0.002017 0.004911 -0.005350 
+0.000441 0.004010 -0.011134 0.000108 0.002231 -0.006853 
+-0.001059 -0.000091 0.002945 0.001081 -0.000039 0.007215 
+-0.002857 -0.003429 0.004286 -0.000224 -0.000597 0.001358 
+0.000238 -0.000244 -0.001188 -0.009956 -0.001798 -0.002323 
+-0.002923 0.000413 -0.002741 0.001243 -0.002192 -0.000881 
+0.002798 0.003960 -0.001025 -0.004320 0.001087 -0.003768 
+0.000247 -0.002338 -0.001741 0.000732 -0.002639 -0.002872 
+0.004115 -0.001104 -0.001481 0.000917 -0.001159 -0.001836 
+0.004679 0.007946 -0.005561 0.005636 0.000569 0.000056 
+-0.000355 0.001884 -0.000931 0.000218 -0.000121 0.001654 
+-0.000138 -0.001487 0.002852 0.001476 0.000629 0.001907 
+-0.000126 0.000107 -0.000816 -0.000394 -0.001456 -0.001548 
+-0.000052 -0.002177 -0.000006 -0.000035 -0.001958 -0.000035 
+0.001277 -0.000538 0.000215 0.000618 0.000385 -0.000454 
+0.000094 0.000066 -0.001335 0.000383 -0.000749 -0.001811 
+0.002436 -0.001862 -0.004526 0.011969 0.001973 0.000943 
+0.000760 0.001707 0.001203 -0.016853 0.004742 -0.003005 
+-0.027707 0.005509 -0.003431 -0.030477 0.003951 -0.000456 
+-0.030837 0.000710 0.003337 -0.027558 -0.002909 0.006123 
+-0.017001 -0.003955 0.005129 0.002793 -0.000304 -0.000859 
+0.010593 -0.007409 -0.002126 0.007313 -0.003330 -0.003232 
+0.002686 -0.005366 -0.000691 -0.000933 -0.008033 0.000473 
+-0.002998 -0.008427 0.000463 -0.004242 -0.005182 -0.000120 
+-0.007377 0.000953 -0.000180 -0.008459 0.004000 0.000277 
+-0.005904 0.000420 -0.001216 0.003443 -0.004191 -0.006138 
+0.011503 -0.003716 0.004468 0.026557 0.000166 0.012377 
+4.005076 0.314721 1.588832 4.853932 0.430712 1.823970 
+5.451104 0.514196 1.769716 5.823899 0.641509 1.569182 
+5.932836 0.787313 1.358209 5.685279 0.928934 1.218274 
+5.133333 1.103704 0.985185 0.036223 0.018879 0.004077 
+0.025025 0.003810 -0.008590 0.009132 0.005464 -0.006175 
+-0.004326 -0.001743 -0.000384 -0.005825 -0.001250 -0.004239 
+-0.001319 0.003011 0.000739 -0.001575 -0.000132 0.004923 
+-0.000140 -0.003074 -0.000825 0.001210 -0.005283 0.000148 
+-0.000523 -0.005198 -0.000005 -0.001664 0.000604 -0.002570 
+-0.001829 -0.000456 -0.005334 -0.001735 -0.000817 -0.003048 
+-0.001997 0.000707 -0.000848 -0.002399 0.000915 -0.000969 
+-0.003164 0.000764 -0.004173 -0.003724 0.001283 -0.006216 
+-0.002321 -0.001131 -0.003962 0.002156 -0.001212 -0.000268 
+0.003617 -0.000355 0.003617 0.002984 0.002432 0.003599 
+-0.001568 0.004483 0.000897 -0.005975 0.003997 0.004630 
+-0.002958 0.001995 -0.002307 -0.001884 -0.001616 -0.002262 
+-0.002482 -0.001708 0.000916 -0.000559 0.001097 -0.000680 
+-0.003411 -0.000326 -0.003200 -0.006096 -0.005136 -0.000321 
+0.002852 0.001197 0.001918 0.004859 0.000313 -0.000287 
+0.004403 0.002636 -0.002481 0.000173 0.004192 -0.003950 
+0.002313 -0.000794 -0.000560 -0.000842 -0.000039 0.002303 
+-0.002681 -0.003718 0.003643 -0.000712 -0.000141 -0.000064 
+0.002597 0.001749 -0.004591 0.005919 0.003375 -0.006938 
+-0.000935 0.000544 -0.004520 -0.000246 -0.000136 -0.002326 
+-0.000625 -0.001064 -0.001301 0.001988 -0.000202 -0.001095 
+0.001335 0.000457 -0.004753 0.002305 -0.001925 -0.004154 
+0.001491 -0.001687 -0.002698 0.003247 -0.001991 -0.000682 
+0.006950 -0.005556 0.002726 0.006725 -0.003301 0.002004 
+-0.004034 0.000505 -0.000891 -0.016804 0.002374 -0.000669 
+-0.023218 0.003484 0.000872 -0.022722 0.003307 0.000226 
+-0.016880 0.002851 -0.000259 -0.008133 0.001338 0.000837 
+0.002440 -0.002358 -0.001021 0.009312 -0.002568 -0.006921 
+0.015045 -0.002600 0.004105 0.002625 -0.004808 -0.000750 
+-0.000974 -0.002956 -0.000219 -0.001491 -0.002681 -0.000947 
+-0.003443 -0.001568 -0.001369 -0.006829 0.000491 -0.001045 
+-0.009830 0.000175 0.000226 -0.009384 -0.001211 -0.000592 
+-0.006907 -0.000231 -0.003308 -0.002851 0.000200 -0.004837 
+0.009929 0.004692 0.003401 0.024689 0.006124 0.015229 
+3.734463 0.531073 1.367232 4.468000 0.572000 1.556000 
+5.196141 0.627010 1.520900 5.747775 0.703264 1.255193 
+6.024390 0.829268 0.896341 6.098639 1.105442 0.625850 
+6.053498 1.514403 0.465021 6.028902 1.982659 0.283237 
+5.696078 2.539216 -1.088235 0.029627 0.017398 -0.024367 
+0.004038 0.009429 -0.013972 0.000087 0.002661 -0.005245 
+0.001122 -0.000240 0.001420 -0.002226 -0.002159 0.002638 
+-0.002529 -0.000562 0.001706 -0.002460 -0.000014 0.001550 
+-0.002322 -0.000950 -0.001898 -0.000767 0.000230 -0.003962 
+-0.001063 -0.001168 -0.003961 -0.003293 -0.001734 -0.003540 
+-0.003897 -0.001557 -0.002379 -0.000847 -0.000611 0.000678 
+0.000203 -0.001114 -0.000870 -0.002056 -0.002584 0.000881 
+-0.000824 -0.005133 0.001846 0.002078 -0.003801 0.002704 
+0.003507 -0.003006 0.001942 0.002333 -0.000389 0.002385 
+-0.000666 -0.000244 0.001717 -0.004899 0.001517 0.000933 
+-0.002857 0.001161 -0.004140 -0.002722 0.001864 -0.002793 
+-0.004298 0.000004 0.000018 -0.003988 -0.006800 0.001931 
+-0.005267 -0.008168 0.002901 0.002737 -0.005376 0.000147 
+0.004976 -0.000028 0.002510 0.005099 -0.001398 0.002018 
+0.002628 -0.000852 -0.001040 -0.001062 0.000688 -0.003933 
+0.001926 0.005944 -0.003034 0.004590 0.001436 -0.007378 
+0.002406 0.003876 -0.003747 0.001288 0.001159 -0.002446 
+-0.001544 0.000201 -0.000526 -0.001536 -0.001821 -0.000348 
+-0.001460 -0.001193 -0.000682 -0.000850 -0.001798 0.000588 
+-0.004831 -0.003098 0.000978 -0.005062 0.000657 0.000871 
+-0.000133 -0.000711 0.002460 0.000005 -0.002343 -0.000550 
+-0.002440 -0.004450 -0.000242 0.009050 -0.002978 -0.001027 
+0.016369 -0.002842 0.005002 0.015170 0.002873 0.003364 
+0.003186 0.003692 -0.000274 -0.008628 0.002578 0.000123 
+-0.011026 0.002730 0.003666 -0.004476 0.002491 -0.000274 
+0.001877 -0.004325 -0.002207 0.008142 -0.003267 -0.003119 
+0.010449 -0.001627 0.001462 0.005297 0.000562 0.000802 
+-0.000159 0.000779 -0.000512 -0.002868 -0.002789 0.000210 
+-0.003456 -0.002199 -0.002498 -0.003387 -0.000553 -0.001458 
+-0.003418 -0.000522 -0.000803 -0.002053 -0.001550 -0.000875 
+0.002045 -0.003232 -0.001194 0.004029 -0.003112 -0.000281 
+0.001384 0.000860 0.000538 0.000143 0.004667 -0.000503 
+-0.000508 -0.000378 0.000576 0.003485 -0.001959 -0.001203 
+0.004419 -0.002115 -0.001267 0.005136 -0.001865 -0.002954 
+0.016547 0.003688 -0.003651 0.028318 0.012460 -0.000275 
+4.245454 0.750000 0.422727 4.773234 1.133829 0.472119 
+4.858108 1.472973 0.243243 4.855072 1.818841 -0.210145 
+5.019608 2.323529 -0.725490 4.948718 2.931624 -1.196581 
+0.027069 0.022762 -0.010218 0.008347 0.010992 -0.008215 
+0.001368 0.003825 -0.004791 0.002015 -0.002286 0.002170 
+0.001955 -0.003359 -0.000050 -0.001164 -0.001022 -0.000390 
+0.000029 -0.000807 -0.001757 0.001813 -0.000370 -0.002560 
+0.002169 0.001157 0.001172 0.001183 0.002870 0.001273 
+-0.001988 0.000159 0.001489 -0.002516 -0.002340 0.002545 
+0.000823 -0.000034 0.000251 0.001196 0.000042 0.002449 
+0.000114 -0.000001 0.000449 0.001950 0.001198 -0.003218 
+-0.000462 -0.000138 -0.002585 -0.000925 0.000272 0.002126 
+-0.005065 0.001671 0.006663 -0.007030 0.001162 0.002098 
+-0.004024 -0.003782 -0.000375 0.000428 -0.001443 0.000466 
+-0.000192 -0.000072 -0.002290 -0.000582 -0.001128 0.000441 
+-0.000148 -0.000311 0.002296 0.002605 0.003770 -0.000261 
+0.002545 0.002835 -0.001964 0.000480 -0.000290 0.004030 
+0.004295 0.000766 0.003037 -0.003689 -0.002583 0.003074 
+0.002673 -0.001191 0.003545 0.005150 0.001232 -0.001791 
+0.005061 0.001632 -0.005605 0.007298 0.003407 -0.006258 
+0.007280 0.007534 -0.007123 0.004992 0.008968 -0.005279 
+0.001618 0.004631 -0.001007 -0.000997 -0.001538 0.000432 
+-0.001452 -0.001452 0.003387 -0.002704 -0.001844 -0.000596 
+-0.007091 -0.003503 -0.000095 -0.010388 -0.005395 0.001156 
+-0.005728 -0.001613 0.005928 0.001981 0.001670 0.001094 
+0.005165 0.002615 0.000586 0.002823 0.000419 -0.000385 
+0.000871 -0.002741 0.002421 0.002753 -0.002630 -0.000657 
+0.005451 -0.001326 -0.000953 0.001324 -0.001375 -0.001031 
+-0.000445 0.000886 0.000583 -0.005297 0.000522 -0.000578 
+-0.001455 -0.001086 0.001490 0.001922 0.001710 -0.004308 
+0.004881 0.008177 -0.006064 0.003616 0.008930 -0.003528 
+-0.001481 0.003159 -0.004807 -0.001831 -0.000836 -0.004714 
+-0.010715 0.004612 -0.005598 -0.001841 0.000941 0.000673 
+0.012174 0.005578 0.001195 0.010942 0.008445 -0.000523 
+0.001154 0.002487 -0.000980 -0.004605 -0.003044 0.003847 
+-0.007467 -0.001110 0.005071 -0.003166 0.002815 0.001405 
+-0.000865 0.001360 -0.002797 -0.003627 0.002138 -0.002261 
+-0.010113 -0.007079 -0.000006 -0.012166 0.000999 -0.002955 
+0.003804 0.000419 -0.002711 0.020414 0.010865 -0.002529 
+3.340000 0.925000 0.035000 4.016807 1.672269 -0.163866 
+4.643443 2.573771 -0.795082 4.932039 3.291262 -1.475728 
+4.442177 3.340136 -1.653061 0.027177 0.018468 -0.010596 
+0.011991 0.003623 -0.009858 0.006739 0.000174 0.000058 
+0.001682 -0.000436 -0.000012 0.000510 -0.000218 0.000198 
+0.000922 0.001452 -0.000104 0.003235 0.002022 -0.003356 
+0.002041 0.002156 -0.004537 0.001573 0.000363 -0.000308 
+0.000547 0.000658 0.001610 0.002221 -0.002132 0.001794 
+0.002075 0.001216 0.002468 0.003756 0.003065 0.002534 
+0.001810 0.001052 0.000908 -0.001387 -0.000496 0.001311 
+0.001043 -0.001273 -0.002394 -0.000219 -0.001369 -0.002336 
+0.003396 0.001941 0.000892 0.003547 0.002211 -0.001444 
+0.001176 -0.000721 -0.000779 -0.002016 -0.001243 0.001422 
+-0.000632 0.000192 0.003603 -0.002222 -0.001587 -0.000317 
+-0.001852 -0.000291 0.000608 -0.000453 -0.000698 0.000283 
+-0.003811 -0.003483 0.002268 -0.002236 -0.002385 0.000090 
+0.000971 0.002061 -0.002220 0.004756 0.004035 -0.000541 
+0.005145 0.002372 0.000483 0.004268 -0.000447 0.000732 
+0.000161 -0.001055 -0.001042 -0.001048 -0.001625 -0.001243 
+-0.000889 -0.000732 -0.000636 0.000499 0.001585 -0.003626 
+-0.001525 -0.002352 0.001200 -0.002667 -0.005051 0.001103 
+-0.001736 -0.005813 0.001078 -0.001377 -0.005344 0.000290 
+-0.003034 -0.004478 0.000467 -0.004638 -0.002680 -0.000246 
+-0.001904 -0.000406 0.002925 0.000156 0.002109 0.000000 
+0.003673 0.001788 -0.001858 0.004399 0.001409 -0.000332 
+0.002800 0.002230 0.000364 0.002104 0.001269 0.000374 
+0.000028 -0.001135 0.002149 -0.001561 -0.002242 0.002358 
+-0.002248 -0.002095 -0.000212 -0.001056 -0.000929 -0.000971 
+-0.000041 -0.000422 -0.000834 -0.000872 -0.000035 -0.000478 
+-0.000367 -0.001063 -0.001529 0.003124 -0.000738 -0.001780 
+0.004568 0.002049 -0.004068 0.003372 0.002645 -0.002643 
+0.001891 0.002142 -0.002737 -0.002616 0.006549 -0.008451 
+-0.001777 0.013045 -0.002520 0.002240 0.007454 -0.002239 
+0.000472 0.003135 -0.003792 0.000580 -0.000611 -0.002668 
+-0.001198 -0.000524 -0.002678 -0.008982 -0.001460 -0.000884 
+-0.009536 -0.000904 0.003370 -0.004641 0.000840 0.002321 
+-0.003074 0.002087 0.000595 -0.007340 -0.002210 -0.000719 
+-0.012145 -0.003936 0.000141 -0.004338 -0.001709 0.001323 
+0.007679 0.003373 0.002010 0.020225 0.009582 0.001192 
+3.435897 2.138462 -0.712821 3.908676 3.178082 -1.388128 
+3.509709 3.203883 -1.699029 2.651163 2.354651 -1.534884 
+0.015342 0.015530 -0.004098 0.007254 0.006358 -0.002576 
+0.000133 0.000447 0.000025 -0.003269 -0.000296 0.000539 
+-0.002590 0.000710 -0.001561 -0.000101 0.001377 -0.000061 
+-0.000605 -0.001814 0.000388 -0.003740 0.000376 -0.001610 
+0.000823 0.001234 0.000476 0.006312 0.004650 0.001351 
+0.006169 0.008262 -0.000193 0.004856 0.007076 0.000046 
+0.004698 0.001585 -0.003211 0.004727 0.002851 -0.005264 
+0.004312 0.002576 -0.006376 -0.000276 0.002693 -0.001775 
+-0.003930 -0.000386 0.001880 -0.003008 -0.002107 0.002253 
+-0.002092 -0.001075 0.001388 -0.001759 -0.001334 0.002582 
+-0.002145 0.000971 0.006283 -0.001918 0.002484 0.003655 
+-0.002450 -0.001077 0.002046 0.000711 -0.000705 0.002151 
+-0.000494 -0.000403 0.003339 0.000094 -0.000328 0.004341 
+-0.002409 -0.000458 0.003156 0.001949 -0.001464 0.000970 
+0.000885 -0.002214 -0.000443 0.004544 -0.000958 0.001913 
+0.006383 -0.000641 0.000181 0.003667 -0.000617 -0.001337 
+-0.001757 -0.001654 0.000103 0.001953 -0.001953 0.002422 
+-0.002181 -0.000669 0.002472 -0.001980 0.000889 -0.000121 
+0.001505 0.001182 0.000178 0.003021 0.000666 -0.001059 
+0.003295 -0.001325 -0.002279 0.002347 -0.000377 -0.002254 
+0.002078 0.001601 0.000454 0.000942 0.003134 0.000072 
+-0.000619 0.001203 -0.000041 -0.001579 -0.001950 -0.000433 
+-0.001692 -0.001692 -0.002406 -0.002289 0.001244 -0.003333 
+0.000137 0.003185 -0.000091 -0.001439 0.003864 -0.002424 
+-0.001102 0.001785 -0.000873 0.000825 0.000926 -0.001447 
+0.003167 0.002445 -0.003258 0.003971 0.003088 -0.000515 
+-0.001402 -0.000985 -0.002765 -0.000252 -0.001145 -0.003641 
+0.000480 0.001760 0.000160 -0.001209 0.004927 -0.002650 
+0.001511 0.006074 -0.004330 0.001704 0.006495 -0.005349 
+-0.000645 0.004562 -0.007260 -0.001492 0.001845 -0.007911 
+-0.001930 0.002353 -0.003958 -0.001535 0.004903 -0.001133 
+0.000829 0.005020 0.002340 0.000989 0.003722 -0.000116 
+0.000234 -0.000391 0.000078 -0.004653 -0.004571 -0.000551 
+-0.004488 -0.004202 0.000697 -0.004929 0.000274 0.001813 
+-0.005983 0.002641 -0.000162 -0.001470 0.001900 -0.002568 
+0.000090 0.000633 0.000918 -0.000329 -0.004715 0.006822 
+0.006858 -0.000384 0.005038 0.019640 0.018431 -0.004695 
+2.430000 2.490000 -1.235000 2.123077 2.266667 -1.384615 
+0.006555 0.020021 -0.008729 0.001373 0.008156 -0.005275 
+-0.000142 -0.000747 0.000856 -0.001814 0.001649 0.003381 
+-0.000774 0.000471 0.002747 0.001541 0.002580 -0.001507 
+-0.000567 0.002425 0.000141 0.000604 0.000600 -0.001008 
+0.001322 0.002410 0.000299 0.005183 0.004014 -0.001002 
+0.002955 0.001465 0.000354 -0.000865 0.000004 0.000751 
+-0.000380 -0.001696 -0.000350 0.002368 -0.001544 -0.000253 
+0.003073 -0.001925 -0.000789 0.003567 -0.000110 -0.001890 
+0.002623 -0.000299 0.000220 0.000355 0.001314 -0.000196 
+-0.001273 0.003454 0.000843 -0.003107 0.004356 0.000909 
+-0.001686 0.000625 -0.001449 -0.000323 -0.000017 0.004747 
+-0.000827 -0.001214 0.004160 -0.001033 -0.002737 0.000327 
+0.002431 -0.001995 0.002244 0.002782 -0.002068 0.000985 
+0.003220 0.001659 -0.001593 0.003630 0.004286 -0.002178 
+0.003629 0.004290 -0.000613 0.004556 0.003577 0.000814 
+0.007158 0.004226 0.000682 0.007675 0.004456 -0.006870 
+0.000763 0.007970 -0.001130 0.002014 0.000751 0.001509 
+0.002471 -0.002437 -0.003664 -0.000329 -0.003730 -0.000549 
+-0.001230 -0.001975 0.002343 -0.001226 -0.001584 0.001630 
+-0.000108 -0.000339 0.000056 0.000536 -0.000013 0.000311 
+0.000323 -0.000119 -0.001138 0.001306 -0.000280 -0.001540 
+0.000771 0.004990 -0.002435 -0.002536 0.002417 -0.002933 
+-0.001708 -0.001220 0.000149 -0.000973 -0.000465 0.002676 
+-0.001874 0.000924 0.002046 -0.002196 0.001077 -0.001444 
+0.000000 0.002419 -0.003387 0.001238 0.001088 -0.004567 
+0.001053 -0.000980 -0.005082 0.003698 -0.001024 -0.002506 
+0.002464 -0.001828 0.000081 0.001589 0.000923 0.000225 
+0.001982 0.002824 0.000248 0.002913 0.001082 0.002051 
+0.002663 -0.002065 0.002263 0.001772 -0.000514 0.001610 
+0.000300 0.000910 -0.001728 -0.002600 0.001713 -0.002426 
+-0.003762 0.002915 -0.000255 0.000048 0.001527 0.000385 
+-0.005687 0.002412 0.000684 -0.001514 0.001649 -0.001826 
+-0.002446 0.000069 -0.001943 -0.001606 -0.000525 0.000974 
+0.001256 0.001742 -0.000925 0.004061 0.003580 -0.002057 
+0.005390 0.001432 0.000197 0.000639 -0.000979 -0.000021 
+-0.000811 0.001771 -0.001896 -0.001161 -0.002017 -0.003889 
+-0.007504 -0.007925 0.003095 0.001834 -0.003385 0.005202 
+0.010093 0.007734 -0.000654 0.011189 0.014320 -0.004662 
+0.010046 0.014744 -0.007405 0.003792 0.009916 -0.008829 
+-0.000094 0.002008 -0.001897 0.000486 -0.000610 0.000272 
+-0.005040 -0.000082 0.001322 -0.001591 -0.000743 0.001660 
+-0.004154 -0.001497 0.001541 -0.003298 -0.006258 0.000581 
+-0.002799 -0.003174 -0.001674 -0.000354 0.002375 -0.000441 
+0.003162 0.003333 -0.001880 0.000301 0.002708 -0.000492 
+0.000104 -0.000161 0.000449 0.002261 0.000685 0.000462 
+0.003109 0.002843 -0.000640 0.002888 0.002480 -0.000557 
+0.001189 -0.000287 0.000738 -0.000390 -0.004724 -0.000455 
+-0.002545 -0.006848 -0.000381 -0.003771 -0.004857 -0.000443 
+-0.002002 -0.000572 -0.000107 -0.000200 0.000245 0.000511 
+0.000398 0.001510 -0.001783 0.000638 0.001128 -0.001313 
+-0.001926 0.000543 0.002409 -0.000246 -0.001503 0.000093 
+-0.000074 -0.002239 0.000268 -0.002062 -0.002224 -0.000030 
+-0.001984 -0.000720 -0.000900 -0.000478 -0.001032 0.000068 
+-0.000323 -0.001265 -0.000540 -0.001295 -0.000209 0.000269 
+0.002538 -0.001231 0.001923 0.000136 -0.000799 0.001695 
+-0.002327 -0.000069 -0.000530 -0.002461 -0.000424 0.001909 
+-0.000588 -0.001833 0.000837 -0.000717 -0.000919 0.000112 
+-0.001666 -0.000253 -0.004563 -0.000538 -0.000094 -0.003039 
+0.000655 -0.000210 -0.000261 0.001741 -0.001735 -0.000458 
+0.001335 -0.001352 -0.000157 -0.001767 -0.000459 0.002008 
+-0.000379 0.000130 -0.001065 -0.000428 0.000551 -0.000378 
+-0.000127 -0.000170 -0.001101 -0.003571 -0.002989 0.000427 
+-0.006267 -0.003458 0.001395 -0.003018 0.000753 0.000903 
+0.000590 -0.000442 0.000716 0.000946 -0.000344 0.000132 
+-0.001309 0.000515 -0.000162 -0.002277 0.000542 0.001299 
+0.000632 0.004484 -0.000537 0.002859 0.001447 0.000939 
+0.001927 -0.000330 -0.000889 0.000519 -0.004773 0.000317 
+0.002642 -0.002969 0.004261 0.003798 0.000401 0.001026 
+0.005466 0.003608 -0.005384 0.009110 0.003590 -0.006485 
+0.003511 -0.001785 -0.004164 -0.001937 0.002036 -0.000273 
+-0.002087 -0.000315 -0.000118 -0.001939 0.000697 0.000428 
+-0.000417 0.003441 -0.001808 0.003062 0.001877 0.000691 
+0.002741 0.000000 0.000370 0.004474 0.002370 -0.003689 
+0.006058 0.001679 -0.007080 -0.000388 0.003450 -0.010041 
+-0.008431 -0.004572 -0.001210 -0.008669 -0.014771 0.008982 
+-0.003636 -0.005311 0.001089 0.002583 0.009307 -0.003550 
+0.005949 0.012764 -0.005848 0.002785 0.007423 -0.005470 
+-0.001535 -0.000171 0.002661 -0.005662 -0.006467 0.002221 
+-0.004346 0.003824 0.001838 -0.000135 0.007963 -0.003847 
+-0.000686 0.002494 0.001222 -0.000486 0.001590 0.000828 
+0.002171 0.001155 -0.003465 0.000469 -0.000276 -0.001273 
+0.004275 0.000000 -0.003740 0.004493 0.001399 -0.002543 
+0.001632 -0.000595 -0.001188 0.000339 0.001022 0.000372 
+0.001217 0.002884 0.001314 -0.000290 0.004210 -0.001597 
+-0.000978 0.000186 -0.000180 -0.004400 -0.003853 0.002372 
+-0.006589 -0.002677 0.004942 -0.002495 0.000538 0.001089 
+0.001444 -0.000752 -0.000171 0.001413 -0.003406 -0.001648 
+0.000930 -0.002743 -0.002531 -0.002320 -0.002546 0.002037 
+0.001706 0.000009 0.000229 -0.000808 0.000482 0.001261 
+-0.002868 -0.000853 0.001085 -0.004297 -0.003797 0.001969 
+-0.003785 -0.003985 0.003786 0.000172 -0.000706 0.003419 
+0.005503 0.001152 0.001979 0.009402 0.002711 -0.000743 
+0.006725 0.001802 -0.003268 0.001445 0.001873 -0.002308 
+-0.001113 0.003323 -0.003138 0.000615 0.006892 -0.003446 
+0.004445 0.002202 0.000721 0.003401 0.004496 -0.003727 
+0.001559 0.003378 0.001851 0.001731 0.000273 0.002624 
+0.001385 -0.001899 0.002177 -0.001252 -0.003024 0.002973 
+-0.003755 0.001042 -0.000835 -0.000518 0.001553 0.001915 
+-0.000190 0.002824 -0.001362 0.000347 0.006768 -0.003089 
+0.011851 0.007368 -0.002135 0.007563 0.007184 -0.004821 
+0.003840 0.002410 -0.000225 0.001403 0.003158 -0.001461 
+0.003641 0.000420 0.000455 -0.000527 0.000471 -0.002951 
+0.000299 0.000478 -0.001031 -0.003749 0.000748 -0.000545 
+-0.000280 0.000594 -0.000545 -0.000157 0.001640 -0.000281 
+0.000853 0.000725 0.000260 -0.000707 0.000526 0.000832 
+-0.000464 0.000904 0.002064 0.000497 0.001333 0.000828 
+0.000757 0.001446 -0.003167 -0.001666 0.000194 -0.002156 
+-0.002670 -0.000149 -0.000342 -0.002969 -0.000420 0.001003 
+-0.001506 -0.000388 0.001339 -0.001213 0.001247 0.000701 
+-0.003211 -0.000270 -0.000931 0.000446 0.003631 -0.000256 
+-0.002218 0.001373 0.001443 0.003128 0.001976 -0.002883 
+0.001349 0.004337 -0.003873 0.000574 0.002190 -0.000479 
+-0.003598 -0.002978 -0.000043 -0.003561 -0.005058 0.001311 
+0.000491 0.001578 0.000250 0.005433 0.008265 -0.002713 
+0.004616 0.009445 -0.004174 0.001217 0.003329 -0.001399 
+-0.002015 -0.005397 0.000403 -0.000127 -0.000351 -0.000809 
+-0.001485 0.000736 0.000722 0.000064 -0.000387 0.000308 
+-0.000856 -0.002038 -0.003322 -0.001672 -0.005020 -0.002007 
+0.002385 -0.001788 -0.000510 0.004056 0.001338 0.000962 
+0.001065 -0.000114 0.000159 -0.002822 -0.003070 -0.000540 
+-0.003576 -0.003403 -0.001071 -0.001890 -0.000722 -0.000765 
+0.001172 0.003006 -0.001137 0.006873 0.003172 -0.002643 
+0.005815 0.002405 0.002606 0.002493 0.002695 0.001453 
+-0.002202 -0.001568 -0.000805 -0.005673 -0.003208 -0.001974 
+-0.004599 -0.000671 -0.001057 -0.002117 0.002593 0.000976 
+-0.001232 0.003025 0.001474 -0.002234 0.000088 0.000482 
+0.001431 0.001750 -0.002522 0.001235 0.002377 0.000584 
+0.000359 0.001772 -0.000066 -0.000481 0.001216 -0.000514 
+-0.001906 0.000060 0.000060 -0.003238 -0.001796 0.000170 
+-0.001213 -0.002921 -0.001452 0.000182 -0.000968 0.000810 
+-0.001448 -0.001208 0.001132 -0.001783 -0.001907 -0.000076 
+-0.001781 -0.001666 -0.001112 -0.001108 -0.002110 -0.000746 
+0.001484 0.001351 -0.002193 -0.000790 0.000725 -0.000327 
+0.002910 0.000648 0.001513 0.001959 0.003931 -0.001998 
+0.000777 -0.002142 -0.002793 0.002664 0.000008 -0.005218 
+0.001751 0.000993 -0.003631 0.000446 0.000995 -0.002456 
+0.000847 -0.002318 -0.000368 0.001339 0.000286 -0.002559 
+0.002833 0.003213 -0.002469 0.003474 0.005449 -0.003905 
+0.002568 0.003237 -0.003941 -0.000328 0.000209 -0.001032 
+-0.003497 -0.000511 0.003075 -0.001830 -0.001668 0.003765 
+-0.001771 0.004070 0.001267 0.000242 0.002051 0.000859 
+-0.002555 0.000322 -0.000569 -0.001965 0.000566 -0.001980 
+-0.003510 0.001501 -0.001292 -0.003809 0.001217 0.001270 
+-0.003165 -0.001342 0.003713 0.001225 -0.000646 0.002060 
+-0.001040 -0.002382 -0.002483 0.002335 0.000067 -0.008668 
+0.004365 0.005510 -0.006612 0.005289 -0.000958 -0.003123 
+0.000422 0.000838 -0.000694 -0.000429 -0.000230 -0.000382 
+-0.000022 0.001633 -0.001651 -0.000577 0.002700 -0.003067 
+0.000318 0.006278 -0.000751 0.006141 0.006612 -0.004094 
+0.003554 0.004735 0.003387 0.000030 -0.000637 -0.000970 
+-0.002534 -0.004631 0.000454 -0.005885 -0.004836 0.000540 
+-0.006466 -0.001947 0.001039 -0.003869 0.001626 -0.000213 
+-0.000454 0.002047 -0.000769 0.000817 -0.000327 0.000027 
+0.000194 -0.002364 -0.001085 -0.000194 0.000090 0.001343 
+0.000393 0.000210 0.000502 0.000515 0.002074 -0.000242 
+-0.001230 -0.000952 0.000675 -0.004961 0.002077 0.003893 
+-0.004551 0.001907 0.001237 0.000437 -0.001232 -0.001341 
+0.005186 -0.002593 -0.003458 0.005177 -0.001419 -0.002821 
+0.000052 0.001025 -0.002067 -0.001451 -0.001209 0.000726 
+-0.000287 -0.002578 0.000477 -0.003243 -0.003988 -0.000140 
+-0.004614 -0.004872 0.000837 -0.001725 -0.000323 0.001061 
+0.003316 -0.000518 0.000277 0.005132 0.001985 -0.000369 
+0.002580 -0.001256 0.000906 -0.001818 -0.003143 -0.001839 
+-0.004385 -0.003407 -0.000486 0.002773 0.002017 -0.001765 
+0.001006 -0.001508 -0.000680 0.001077 -0.001924 -0.001406 
+0.000284 -0.002794 -0.001343 0.000292 -0.002883 -0.000254 
+0.001964 0.001758 -0.000670 0.001407 0.007609 -0.001648 
+-0.001240 0.006443 -0.003687 -0.001258 0.001272 -0.005002 
+0.000116 0.001299 -0.003219 -0.000815 -0.000396 -0.003281 
+-0.000261 -0.001311 -0.004188 0.000655 -0.002309 -0.004445 
+0.000749 0.001908 -0.006745 -0.001293 0.003449 -0.008309 
+0.006167 0.001308 -0.010092 0.001813 0.006137 -0.003767 
+-0.000358 0.000033 -0.000878 -0.001477 -0.002954 0.000231 
+-0.003178 0.000401 -0.000100 -0.000171 0.002650 -0.002188 
+0.002901 0.002595 -0.001298 0.002889 0.003188 -0.000598 
+0.006728 0.001989 -0.001531 0.007194 -0.001218 -0.002728 
+0.003957 -0.000542 0.002694 0.001482 0.002297 0.001516 
+-0.004334 0.000432 0.000945 -0.004893 -0.000815 0.002448 
+-0.001069 -0.003275 0.002740 0.002172 -0.004646 -0.002475 
+0.000762 -0.004133 -0.002322 -0.000880 -0.001826 -0.000932 
+0.001481 0.000667 -0.000789 0.000837 -0.001576 -0.001214 
+0.000419 -0.000785 0.000384 0.000198 0.000522 0.000414 
+0.000803 0.002570 -0.001574 0.000920 0.004490 -0.002672 
+0.000602 0.005066 -0.001304 -0.000118 0.002653 0.001398 
+0.001651 0.001275 0.001025 0.001283 0.003103 -0.001716 
+0.000636 0.002799 -0.002163 -0.000536 -0.000336 0.001277 
+0.001385 -0.002615 0.000923 -0.001091 0.001497 0.003399 
+-0.001210 0.001747 0.000623 0.000701 0.003835 0.000078 
+0.002522 -0.000740 -0.001249 -0.000046 -0.002137 -0.000093 
+-0.002845 -0.001096 -0.000306 0.000064 0.002406 -0.000772 
+0.000099 0.003053 0.000179 0.000388 -0.000736 -0.000470 
+0.001935 -0.002869 -0.000768 0.001613 -0.001479 -0.000499 
+-0.001070 0.000770 -0.000523 -0.002184 0.003388 0.000937 
+-0.003079 0.003212 0.003012 -0.001567 0.002695 0.000627 
+0.000429 0.002429 -0.000357 -0.002201 0.000176 -0.003359 
+-0.001039 -0.001248 -0.003243 -0.002285 -0.005390 0.000820 
+-0.000412 0.000650 0.001212 0.000733 -0.005079 0.000488 
+-0.000477 -0.000922 0.002448 -0.000798 -0.000479 0.001678 
+-0.001279 -0.003191 0.001656 -0.000545 0.000446 -0.000031 
+-0.004083 -0.001161 0.001734 -0.001271 0.003460 -0.000463 
+0.000382 0.004130 0.002257 0.003430 0.002361 0.002924 
+0.004087 0.003432 0.000316 0.001698 0.003754 -0.000431 
+0.002142 0.001312 -0.000052 0.000963 -0.001089 0.001670 
+-0.000080 0.000297 0.000834 -0.000657 0.001316 0.000881 
+-0.002648 0.000003 0.002352 -0.002542 -0.002749 0.000210 
+-0.001091 -0.002367 0.000466 0.000315 0.000196 0.000404 
+0.001087 0.000719 0.001004 -0.000190 0.002480 0.000843 
+-0.000160 0.001924 0.000317 -0.000161 0.001290 -0.000806 
+0.000504 -0.000243 -0.001060 -0.000787 -0.000686 0.000706 
+-0.004599 0.000868 0.001215 -0.004035 0.003143 0.001173 
+-0.000301 0.006917 -0.000301 0.004431 0.001899 -0.003359 
+0.001058 -0.000112 -0.000058 0.001364 -0.001364 0.004242 
+-0.001417 -0.003323 0.005802 -0.001079 -0.001619 0.000925 
+0.000200 0.002405 -0.002673 0.000911 0.002211 -0.004986 
+0.001031 -0.001811 -0.002069 0.001464 0.001026 -0.000496 
+0.003599 0.003755 -0.002868 0.005164 0.005846 -0.005922 
+0.001555 0.001567 -0.007811 0.002600 0.000001 0.001041 
+0.003975 0.003893 -0.002951 0.003546 -0.000499 -0.002134 
+0.003165 -0.000583 -0.001258 0.000876 -0.000242 -0.000373 
+-0.002545 0.001654 -0.001781 0.000999 -0.001467 -0.001685 
+0.000057 -0.002165 -0.000631 -0.004390 -0.001301 -0.001572 
+-0.002138 -0.000615 -0.004277 -0.001642 -0.003285 -0.000894 
+-0.001458 0.000152 -0.002125 0.000201 -0.001723 -0.002081 
+0.000576 -0.001242 -0.000266 0.001284 0.001231 -0.003210 
+0.000635 0.001988 -0.003022 -0.000484 0.001810 -0.001789 
+-0.001213 0.000882 0.000772 -0.003591 -0.001089 0.000202 
+-0.001970 -0.001047 -0.000465 0.001001 -0.000445 -0.000584 
+0.000856 0.000575 -0.003169 -0.001862 0.005231 -0.000782 
+-0.004254 0.002774 0.001646 -0.003881 0.001612 -0.000837 
+-0.001417 0.001815 -0.000899 -0.000557 -0.000178 -0.000675 
+0.000332 -0.000455 0.000092 -0.000040 -0.000202 0.000161 
+-0.000077 0.000285 -0.000756 -0.000298 0.000490 -0.000249 
+-0.003227 -0.001291 0.002582 -0.006071 -0.004167 0.005312 
+-0.006003 -0.003316 0.001448 -0.000808 -0.001308 0.000808 
+-0.001129 -0.001607 -0.001636 -0.000082 -0.000993 -0.001597 
+0.000609 -0.002739 0.003636 -0.001073 -0.005028 0.003955 
+-0.001019 -0.004126 0.001166 -0.002040 -0.003260 -0.000004 
+0.001237 -0.002246 0.001790 0.001273 -0.001833 0.001564 
+0.000194 -0.000029 0.000184 0.002682 0.001089 0.000967 
+0.003751 0.001880 -0.003896 0.000215 -0.000972 -0.000984 
+0.000183 -0.000648 0.000298 0.001323 -0.002568 0.000734 
+0.000599 -0.002073 0.005348 -0.002476 -0.002640 0.010598 
+-0.005279 -0.005480 0.006860 0.000420 -0.001508 0.000832 
+0.002327 0.001673 0.000724 0.001926 0.000008 0.002875 
+-0.000038 -0.002105 0.006883 -0.000875 -0.001369 0.006223 
+0.000277 0.000154 0.000060 0.000349 0.000348 -0.004180 
+0.000084 0.003443 -0.001827 -0.004511 0.002030 0.002030 
+-0.005377 0.002555 0.001438 -0.000355 -0.000071 -0.002154 
+0.000520 0.002795 -0.002372 0.000153 -0.000634 0.000776 
+-0.000216 -0.002957 0.000986 -0.002044 -0.000584 0.002482 
+-0.000148 0.002815 -0.001333 0.002337 0.005098 0.000929 
+0.000820 0.003541 0.001636 0.001241 0.003526 0.001175 
+-0.000397 0.004044 -0.000794 0.000024 0.002478 -0.000761 
+-0.000220 -0.000920 -0.000842 -0.000708 0.000209 -0.002203 
+-0.005081 -0.001395 -0.002324 0.000056 -0.000379 -0.000661 
+-0.001252 0.001576 -0.000294 0.000302 0.001325 0.001308 
+0.003008 0.003926 0.000654 0.003855 0.005067 -0.001785 
+0.001636 0.004144 -0.000058 -0.000587 0.002676 -0.000053 
+-0.000114 0.001865 -0.000495 0.000527 -0.000439 -0.000084 
+0.000335 -0.001824 0.001302 -0.002264 -0.000414 -0.000174 
+-0.002699 0.000480 -0.000760 -0.002115 0.000653 -0.000591 
+-0.000902 -0.000451 0.000150 -0.003022 0.000504 0.001591 
+-0.004670 0.001806 0.001934 -0.006562 0.000469 0.002117 
+-0.003615 -0.004049 0.001447 0.000145 -0.001402 0.000645 
+0.000520 -0.000592 -0.000150 -0.001977 -0.000388 -0.001977 
+0.003111 0.000291 -0.002966 0.004211 0.001057 -0.002523 
+0.004124 0.002755 -0.001121 0.002690 0.003378 0.000680 
+0.000660 0.002342 0.001359 -0.000180 0.000385 0.000073 
+-0.000612 0.000465 -0.001837 -0.000391 -0.000083 -0.003625 
+-0.000501 -0.000125 -0.003253 -0.000657 -0.002066 -0.002723 
+-0.000349 -0.005816 0.000524 0.000608 -0.004676 -0.002662 
+-0.002126 -0.002016 -0.004198 -0.002166 -0.000649 -0.002209 
+-0.000349 -0.001144 -0.000688 -0.001639 -0.000820 0.002049 
+-0.003813 0.001787 0.003376 -0.006299 0.002598 -0.000394 
+-0.002756 0.000709 -0.004803 -0.002314 -0.001389 -0.003256 
+-0.001852 0.001406 -0.000583 0.000617 0.006312 -0.000035 
+0.003845 0.008073 0.000198 0.003945 0.001837 0.003356 
+0.002024 -0.001259 0.002381 0.000772 -0.001985 0.000576 
+0.001740 -0.000827 0.001275 0.002052 -0.004187 0.004256 
+0.001736 -0.002951 -0.002013 0.007339 0.006291 -0.007568 
+0.005883 0.006617 0.000531 -0.000416 -0.000764 -0.002048 
+-0.000533 0.000654 -0.000096 -0.000145 -0.000456 0.000780 
+0.000087 0.000002 -0.000598 -0.000732 -0.002179 0.000130 
+-0.002858 -0.004462 0.001905 -0.003812 -0.002606 -0.000280 
+-0.000953 0.000159 0.001221 0.000608 0.001566 0.001972 
+0.004729 0.003985 -0.000664 0.004949 0.002590 -0.002026 
+0.001615 -0.000808 -0.000808 -0.001629 0.001420 0.002629 
+-0.003253 0.000933 -0.000331 -0.003559 -0.001253 0.002030 
+0.001946 0.000185 -0.003164 0.001466 -0.000017 -0.008744 
+0.002346 -0.000723 -0.007217 0.002186 -0.001154 -0.001943 
+-0.000520 0.000087 0.001493 -0.001238 -0.001365 0.001619 
+0.001355 0.001448 -0.000938 0.002302 0.003740 -0.003280 
+0.004306 0.003425 -0.003524 0.001094 -0.002833 0.000256 
+0.000297 -0.001484 0.001260 -0.000218 -0.000960 0.000174 
+-0.001912 0.000474 0.000767 0.000863 0.002331 -0.002044 
+0.000905 0.006692 -0.004527 0.009396 0.003539 -0.001545 
+0.000452 -0.001263 -0.003877 0.000431 0.000268 -0.004677 
+0.000164 -0.000185 0.000226 0.002147 -0.000889 0.002294 
+0.003024 -0.000522 0.001653 0.004587 0.001904 -0.001525 
+0.004710 0.005140 -0.000061 -0.001181 0.000468 -0.002730 
+0.001099 0.001716 -0.004121 -0.001024 -0.001551 -0.001955 
+-0.000448 -0.002591 -0.002120 -0.001899 -0.003817 -0.001357 
+-0.003461 -0.000712 0.004173 -0.003722 -0.000714 -0.001504 
+0.001171 0.003391 -0.002846 -0.001231 0.002462 -0.004923 
+0.002761 0.005763 0.001671 0.003546 0.006784 0.001276 
+0.005165 0.001265 -0.000158 0.004962 0.003126 -0.007386 
+0.004166 0.002159 -0.001804 -0.002827 -0.000958 -0.001464 
+-0.000259 0.000690 -0.005185 -0.000862 0.001263 -0.000598 
+-0.001922 -0.003009 -0.000278 -0.003988 -0.004473 -0.001528 
+-0.007054 -0.000611 -0.001296 -0.004254 0.002690 -0.002263 
+-0.001378 0.000251 0.000435 -0.000217 -0.000109 0.003566 
+0.000009 0.001620 0.001634 -0.001811 0.002722 0.000003 
+-0.002147 0.000937 0.001158 -0.002981 0.000977 -0.000012 
+-0.005440 -0.005760 0.002800 0.001710 -0.006720 0.000650 
+-0.000891 -0.004105 0.001318 0.003710 0.002615 -0.001262 
+0.002186 0.001658 0.002028 0.000229 -0.001927 0.000811 
+0.000496 -0.000785 -0.001531 0.000430 -0.002642 -0.001482 
+-0.001797 -0.005872 -0.000209 -0.000667 -0.004915 -0.001346 
+0.002301 -0.000541 0.001128 0.001038 0.000219 0.001837 
+0.002827 0.005230 -0.003848 0.003172 0.004932 0.001869 
+0.001655 0.002994 0.003346 -0.000438 0.001556 0.003938 
+-0.001470 -0.002073 0.002808 -0.001420 -0.000685 0.002690 
+-0.000314 -0.003235 0.000990 -0.000979 -0.002525 0.000722 
+-0.003158 0.002180 0.000977 -0.003470 0.000851 -0.003438 
+0.000829 0.001319 -0.002807 0.001324 -0.001023 -0.000942 
+0.002867 -0.001704 0.001563 0.001475 -0.000102 0.000252 
+0.000627 -0.001552 -0.002795 0.002862 0.002380 -0.003473 
+0.000109 0.001087 -0.004785 -0.001016 0.000377 -0.000770 
+0.000155 0.000219 -0.000648 -0.000653 -0.001044 -0.000956 
+0.001994 -0.001555 -0.000980 0.000095 0.001186 0.000501 
+0.000032 0.004175 -0.001170 -0.002079 0.003119 -0.001328 
+-0.001515 0.001298 -0.001136 0.000191 -0.000191 -0.001450 
+0.005659 0.008837 0.000620 0.004250 0.007816 -0.008044 
+0.002168 0.001084 -0.005038 -0.003839 0.003980 -0.002888 
+-0.002930 0.002723 -0.002204 -0.000019 -0.000270 -0.000154 
+-0.000686 0.000923 0.000784 -0.003879 0.001473 0.000487 
+-0.002831 0.003278 -0.000135 0.003856 0.004168 0.001081 
+0.004812 0.006519 -0.005256 0.004905 0.003635 -0.001684 
+0.004558 0.000492 0.001618 0.003759 -0.001275 0.001649 
+0.001581 0.000851 -0.006445 0.002595 -0.000303 -0.000217 
+0.001094 -0.000388 -0.001183 -0.002337 -0.001049 0.001611 
+-0.001632 0.001397 0.001688 0.000564 0.000737 0.003396 
+-0.000728 -0.000094 0.000827 0.000278 0.003611 -0.001389 
+-0.000970 -0.000203 -0.000739 0.001703 -0.000342 -0.002684 
+0.000009 -0.001021 0.001592 0.000912 -0.000192 0.000860 
+0.002081 0.003217 0.000075 -0.000289 0.003131 0.001204 
+0.001172 0.001310 -0.001586 -0.000299 0.000646 -0.001641 
+-0.000528 0.000225 -0.000589 -0.000551 -0.000779 0.000282 
+0.000611 0.001282 0.001723 -0.000096 0.002754 0.001954 
+-0.003036 0.002810 -0.000607 -0.002173 0.003255 0.001634 
+-0.002379 0.002530 0.001216 -0.003818 -0.000717 -0.001828 
+-0.001207 0.001228 -0.002286 -0.000797 0.002692 -0.002441 
+0.002573 0.003964 -0.003649 0.004528 0.001044 0.001419 
+0.002838 0.000655 0.002538 0.001038 -0.000128 0.001169 
+-0.016785 -0.013460 -0.005340 -0.020422 -0.026998 -0.007930 
+-1.634259 -3.689815 -1.569444 -1.352113 -3.708920 -2.089202 
+-0.008748 -0.025742 -0.018366 -0.001595 -0.005801 -0.006722 
+0.001331 0.001764 0.001244 0.001666 -0.001753 0.001693 
+0.000597 0.000487 0.000130 0.003925 0.005884 -0.002941 
+0.004736 0.004117 -0.005577 0.000279 0.000166 0.000695 
+0.001675 -0.001081 0.000570 0.001800 -0.000132 0.003930 
+0.003201 0.002561 0.004083 0.003689 0.002664 0.002232 
+0.003434 -0.000188 -0.000465 -0.000532 -0.003682 -0.001616 
+-0.004022 -0.008192 0.004149 -0.005106 -0.006729 0.007756 
+-0.001515 -0.003644 0.003098 0.002793 -0.000533 0.000576 
+-0.002208 0.001578 -0.000917 -0.004307 0.003672 -0.000915 
+-0.000429 0.002300 0.000786 0.002398 -0.000819 0.000380 
+0.000840 -0.001061 -0.000751 0.002319 0.002779 -0.005405 
+0.000976 0.004359 -0.000252 0.000443 0.001319 0.000461 
+-0.000173 -0.000383 -0.000292 -0.000928 0.000012 -0.000924 
+0.002613 0.001172 -0.006128 -0.000037 -0.001791 -0.003619 
+-0.001610 -0.001599 -0.000001 -0.002947 -0.002547 -0.001525 
+-0.003135 -0.000589 -0.001748 -0.001060 -0.001186 -0.000811 
+0.000928 0.000074 -0.004826 0.002361 -0.000272 -0.004621 
+0.002707 -0.000328 -0.002458 -0.000650 0.002731 -0.002472 
+-0.001948 0.002504 -0.001719 -0.000908 0.000913 -0.002726 
+-0.003848 0.001453 0.002537 -0.001557 0.001176 0.005782 
+0.000255 0.000681 0.005076 -0.000099 -0.000084 0.001912 
+-0.004195 -0.002274 0.001958 -0.001126 -0.004044 -0.003091 
+-0.001840 -0.011733 0.006903 -0.001297 -0.006250 0.001575 
+0.003012 -0.002174 -0.000555 0.000619 -0.000765 0.000166 
+-0.002332 0.000663 0.001172 -0.001175 0.000097 0.001754 
+0.000922 -0.000451 -0.000290 0.004526 0.002435 -0.001675 
+0.005094 0.003268 0.000615 0.004738 0.002010 0.001125 
+0.003073 0.001687 0.000682 -0.000067 0.000862 -0.000134 
+-0.002312 0.001172 -0.000598 -0.003879 0.000619 -0.000709 
+-0.005035 -0.001237 -0.000036 -0.000649 0.001984 -0.000660 
+-0.000095 0.007308 -0.001348 -0.010755 -0.003433 -0.001865 
+-0.004907 0.006985 0.010991 -0.000406 0.000270 0.002025 
+0.002784 -0.000495 0.000874 0.003677 -0.000430 0.002647 
+0.001425 -0.003547 0.002990 -0.003227 -0.003927 0.004604 
+-0.002228 0.001811 0.002166 -0.004120 0.000882 -0.000590 
+0.055843 0.060368 -0.016055 -0.012629 -0.018438 -0.014556 
+-1.367816 -3.942529 -1.919540 -1.252252 -4.031531 -2.207207 
+-0.634615 -3.149039 -2.125000 -0.005295 -0.006623 -0.016165 
+0.002855 0.011011 -0.009818 0.003686 0.006250 -0.001536 
+0.000679 -0.000097 -0.001645 0.000056 -0.000583 -0.002308 
+0.002422 0.001638 -0.002576 0.000904 0.001262 -0.002401 
+-0.000678 -0.002568 0.000856 -0.001398 -0.001398 0.002119 
+0.001188 0.001152 0.001801 0.001350 0.002193 0.000843 
+0.003680 0.000058 -0.000013 0.003689 -0.002459 -0.002459 
+0.003668 -0.000707 0.000223 0.001213 -0.002028 0.000720 
+0.005075 0.002569 0.002665 0.002836 0.001283 0.003277 
+0.000531 0.002771 0.000852 0.000904 0.003951 0.000847 
+0.001417 0.000570 0.001357 0.001111 0.000194 0.000467 
+-0.001193 0.000367 0.003119 -0.001176 0.002228 0.001065 
+-0.000446 0.000452 0.000116 -0.001442 -0.000305 -0.001194 
+-0.001594 -0.001018 -0.001652 -0.002843 -0.002120 -0.000402 
+-0.003751 0.000243 -0.000799 -0.003852 0.001704 0.000000 
+-0.001574 0.001788 0.001414 -0.000766 0.000997 0.000720 
+-0.001525 0.000693 -0.000728 -0.001846 0.000946 -0.004248 
+-0.005096 0.000105 -0.009231 -0.006390 -0.004970 -0.010977 
+0.001173 -0.003138 -0.009257 0.000105 0.000317 -0.003793 
+-0.001307 0.000736 0.002017 -0.001350 -0.003639 0.005663 
+-0.000050 -0.002110 0.004597 0.003167 -0.001591 0.002909 
+0.002775 -0.001229 0.001248 0.001960 0.001463 -0.002429 
+-0.000673 0.000372 -0.002508 -0.003414 -0.004495 0.000830 
+-0.002701 -0.010025 0.002186 -0.003019 -0.005051 0.001618 
+0.000031 0.005354 -0.000016 0.000161 0.000693 0.001109 
+-0.001625 0.002524 -0.003647 0.000779 -0.001447 0.001002 
+0.002550 -0.002971 -0.000271 0.003010 -0.000080 0.000070 
+0.000554 0.002529 -0.000048 -0.000089 0.002824 -0.000341 
+0.000235 0.001745 -0.000158 -0.000133 0.000856 -0.000113 
+-0.001082 0.002678 -0.000468 -0.005579 0.004961 -0.001917 
+-0.003348 0.004528 -0.000082 0.003800 0.005036 0.000232 
+0.009213 0.006758 0.000075 0.001613 -0.001173 0.002754 
+0.001278 -0.001067 0.001373 0.000948 -0.001510 0.000404 
+-0.001372 -0.001680 -0.000269 -0.001583 -0.003107 0.000077 
+-0.007151 -0.006260 0.005874 -0.007158 -0.000495 0.006823 
+-0.004796 -0.000977 0.002109 -0.000837 -0.000439 0.001277 
+-0.053466 0.025300 0.058902 -0.025419 -0.022809 0.011139 
+-0.011287 -0.026335 -0.024362 -0.287356 -3.178161 -2.172414 
+-0.128079 -2.729064 -1.684729 -0.007800 -0.015623 -0.003575 
+-0.002189 -0.002758 -0.001547 -0.001559 0.004308 -0.000751 
+-0.005446 -0.001253 0.002583 -0.002336 -0.007899 0.002559 
+-0.001560 -0.005423 -0.000291 -0.000181 -0.001538 -0.001463 
+-0.000229 -0.000874 -0.001040 0.004327 -0.002985 -0.002090 
+0.002186 -0.001153 -0.000233 0.000675 0.000358 0.001391 
+0.000165 0.001322 0.000331 0.000417 -0.000819 0.000188 
+0.003886 0.001267 -0.001822 0.006815 0.004001 -0.004238 
+0.005747 0.005200 -0.001745 0.003129 0.003235 -0.001402 
+0.001938 0.002033 0.000312 0.000688 0.000972 0.001592 
+-0.000646 -0.001592 0.001483 -0.002527 -0.000283 0.003943 
+-0.000041 0.000993 0.004635 0.000211 0.001349 0.002663 
+-0.000346 0.000388 0.000282 -0.000520 -0.000412 -0.001720 
+-0.001649 0.002309 -0.002804 -0.002094 -0.000988 -0.002566 
+-0.003890 -0.000852 -0.001974 -0.003704 -0.001353 0.002327 
+-0.004231 -0.004544 0.003965 -0.004021 -0.003075 0.000904 
+-0.000253 0.001985 0.000332 0.000031 0.001935 -0.001546 
+0.000770 -0.006682 -0.009183 -0.007559 -0.010701 -0.015157 
+-0.004510 -0.003851 -0.016121 -0.000970 -0.001161 -0.006106 
+0.000438 0.001468 0.002374 -0.004001 -0.004678 0.006920 
+-0.003927 -0.002838 0.000933 0.000685 -0.000687 0.000478 
+0.002257 0.007196 0.000539 0.000300 0.002834 -0.006567 
+0.000225 0.002932 0.000048 0.001990 0.000121 0.001080 
+0.002923 -0.002386 -0.000780 0.003079 -0.001795 -0.002404 
+0.002260 0.001276 -0.000080 -0.003008 0.003046 -0.001300 
+-0.001965 0.002631 -0.001788 -0.000356 0.000029 0.000035 
+-0.000602 -0.002004 -0.000982 -0.001741 -0.002963 -0.000668 
+-0.002112 0.001606 0.000098 -0.002274 0.004700 -0.000628 
+-0.000670 0.003722 -0.000242 0.000449 0.001883 0.000686 
+-0.000814 0.002549 -0.000394 -0.005362 0.004730 -0.003419 
+-0.005095 0.007450 -0.003224 -0.001420 0.004667 -0.001913 
+-0.000312 -0.002635 0.004768 0.004221 -0.002601 0.003017 
+0.003206 -0.001862 0.002728 0.003987 0.000038 0.000758 
+-0.000619 0.001998 0.001573 -0.001096 0.002328 -0.000631 
+-0.001921 -0.000700 0.001306 0.001214 -0.001877 -0.001376 
+0.002190 -0.001303 -0.005090 0.001556 0.002418 -0.004326 
+-0.069924 -0.017914 0.090072 -0.045019 -0.002211 0.051672 
+0.000433 0.002097 0.000257 -0.008028 -0.019782 -0.014267 
+-0.009180 -0.020657 -0.016659 0.001090 -0.010365 -0.012917 
+0.001595 -0.002483 0.000430 -0.003943 0.006191 0.004170 
+-0.000103 0.000011 0.002778 -0.000855 -0.001044 0.000877 
+0.000438 -0.002491 -0.000023 0.000196 -0.000063 -0.000670 
+0.002438 0.001675 -0.001798 0.001555 0.001103 -0.005057 
+0.001467 0.001678 -0.002691 0.000703 0.000052 0.000341 
+0.000000 -0.001486 0.000198 -0.001619 -0.003284 0.002612 
+-0.000244 -0.002817 0.002422 -0.000005 -0.000679 0.001021 
+0.002752 0.000840 -0.001100 0.005835 0.004098 -0.001848 
+0.001697 0.004444 -0.002140 0.004384 0.001282 0.002032 
+0.003898 0.000000 -0.000085 0.002189 -0.000620 -0.001479 
+0.001070 -0.001274 -0.001598 -0.000501 -0.000551 -0.002204 
+0.000108 0.000378 -0.002002 -0.001337 -0.000363 0.000119 
+-0.001857 -0.001678 0.000315 -0.002994 -0.000249 -0.000666 
+-0.004560 0.000600 0.000600 -0.004900 0.000294 0.000100 
+-0.002742 -0.000048 0.000097 0.000320 0.000960 -0.000320 
+0.002548 0.001688 0.001059 -0.000945 -0.000709 -0.003543 
+-0.002960 -0.005346 -0.010531 -0.006456 -0.009891 -0.018048 
+-0.006882 -0.009387 -0.014549 -0.003136 -0.004744 -0.002332 
+-0.000769 0.001675 -0.000148 -0.001933 0.000261 0.001697 
+-0.001377 -0.000767 -0.000266 0.002591 0.000492 -0.001422 
+0.002178 0.006970 -0.005614 0.001430 0.005042 -0.005631 
+-0.000606 0.001379 -0.002758 -0.001272 -0.000438 0.000552 
+-0.001880 -0.000584 0.001656 -0.003625 0.000942 0.001596 
+-0.003961 0.000829 0.000891 -0.001715 0.001285 -0.000219 
+-0.001728 -0.000584 0.001533 -0.005720 0.000393 -0.000536 
+-0.006947 -0.001366 -0.002505 -0.004044 -0.005309 -0.000961 
+0.001934 -0.002687 -0.000752 0.001015 0.002257 0.000440 
+0.000087 0.004150 0.000428 0.000965 0.002964 0.001248 
+0.001063 0.002831 -0.000671 -0.000708 0.003232 -0.003565 
+-0.002241 0.001799 -0.000058 -0.002667 0.000431 0.003633 
+-0.001782 0.002328 0.002243 -0.001424 0.002958 0.001215 
+-0.000347 0.001875 -0.000694 -0.000613 0.002617 0.002111 
+-0.001815 0.000512 -0.000147 -0.001597 -0.000754 -0.001273 
+0.001366 -0.000562 -0.001435 0.003303 -0.000729 -0.001363 
+0.002587 0.000765 -0.002880 0.000960 0.001881 -0.001866 
+-6.321782 -4.396039 -2.851485 -5.358209 -3.813433 -2.417910 
+-0.029453 -0.012793 -0.004200 0.007076 -0.002419 -0.006282 
+0.000346 -0.003975 -0.006571 -0.000096 -0.001843 -0.007552 
+0.002862 -0.000867 -0.004410 -0.000833 0.004822 -0.005803 
+-0.000801 0.005927 -0.003685 -0.001380 0.000502 -0.001813 
+0.006780 0.002947 -0.002212 0.007514 0.007486 -0.000027 
+0.004909 0.004805 0.004021 0.001102 0.001026 0.000060 
+-0.001667 -0.001481 -0.001347 -0.000278 -0.000391 -0.000306 
+0.001363 0.000469 0.003052 -0.002705 -0.000775 0.003918 
+-0.004190 -0.000859 0.001463 -0.001476 -0.000091 0.000409 
+0.001071 0.001000 0.001571 0.000190 0.003507 0.000507 
+0.002288 0.004597 0.001652 0.007185 0.005440 -0.001959 
+0.002709 0.000659 0.002361 0.000561 -0.001084 -0.000089 
+-0.003057 -0.002184 -0.000374 0.000130 0.001862 0.002122 
+-0.003189 0.001726 0.003877 -0.004692 -0.001299 0.002343 
+-0.004159 -0.003596 0.002593 -0.002737 -0.003127 0.001258 
+-0.000327 -0.000693 0.000335 -0.000696 0.001626 0.001702 
+-0.002158 0.000340 -0.000665 -0.001628 -0.001083 -0.001022 
+-0.001000 0.001308 -0.001564 0.000027 0.002063 -0.004708 
+-0.000826 0.001783 -0.005953 -0.002488 -0.002231 -0.009036 
+0.000784 0.000439 -0.006903 0.000725 0.000094 -0.005451 
+0.000990 0.001640 -0.001674 -0.000668 0.000044 -0.000086 
+0.001211 -0.000913 0.000090 0.003324 0.000251 -0.003450 
+0.000882 0.000869 -0.004398 -0.001838 0.001250 -0.002426 
+0.000786 0.004759 -0.001931 0.000043 0.006291 -0.002943 
+-0.001415 0.000818 -0.002376 -0.001091 0.003519 0.002854 
+-0.003001 0.003609 0.002350 -0.002444 0.001876 0.000792 
+-0.001784 -0.000186 -0.002050 -0.003524 0.000767 -0.000729 
+-0.006157 0.000611 0.002120 -0.001676 0.000106 0.001862 
+0.002930 0.000593 -0.001984 0.003807 -0.000772 -0.002871 
+0.000301 0.000019 -0.001034 0.000000 0.005138 0.000917 
+0.004913 0.002973 -0.003101 0.005947 0.000206 -0.002757 
+0.003969 -0.002666 0.001920 0.002021 -0.000939 0.001455 
+-0.001474 -0.000015 -0.000946 -0.000659 0.001990 -0.001321 
+-0.002420 0.001765 0.002160 -0.003452 -0.002882 0.000948 
+-0.000437 -0.005316 0.000009 0.001174 -0.003102 0.002391 
+-0.003077 -0.006192 0.000038 -0.000300 -0.000085 0.000797 
+0.001165 -0.000180 0.000076 0.000579 -0.000203 0.001452 
+-5.385075 -4.797015 -2.743284 -4.988327 -5.568093 -2.727627 
+-4.006289 -6.081761 -2.477988 -0.023894 -0.035091 0.008734 
+0.014736 -0.000423 -0.000919 0.025708 0.010342 0.008838 
+0.008583 0.004063 0.008350 -0.002762 0.002471 0.003718 
+-0.000357 0.001240 -0.001326 -0.000441 0.001005 -0.000840 
+0.010052 0.003490 -0.001141 0.005737 0.005675 -0.003183 
+0.001003 0.003582 -0.000113 0.000975 0.001014 0.001481 
+0.001081 0.002978 -0.001275 0.000563 0.003667 -0.004829 
+0.004334 0.002447 0.001188 -0.000835 0.000673 0.000932 
+0.000270 0.000162 0.003250 0.000446 -0.001228 0.003735 
+0.000970 0.001045 0.001716 -0.000894 -0.002055 -0.002000 
+-0.003829 -0.000770 -0.002998 0.004414 0.003762 -0.006053 
+0.007070 0.001454 -0.001123 0.002460 0.000356 -0.001497 
+0.000168 0.002631 0.001453 -0.000403 0.004295 0.002585 
+-0.000500 0.005144 0.004488 -0.001669 0.004459 0.003433 
+0.000087 0.002026 -0.000216 0.000060 0.000324 -0.000027 
+0.000330 -0.000777 -0.003313 0.003628 -0.000823 -0.004332 
+0.003939 -0.000589 -0.002592 0.001368 -0.000539 -0.001548 
+-0.000826 -0.000424 -0.001052 -0.000783 0.000086 -0.000015 
+0.000000 0.000000 -0.000171 -0.000715 -0.000235 -0.000899 
+-0.003324 0.000489 0.000321 -0.004607 0.000776 0.001701 
+-0.002598 0.000916 0.001888 -0.000791 0.000557 0.000360 
+-0.000074 0.001302 -0.001679 -0.000865 0.000831 -0.002294 
+-0.001567 0.000134 0.000627 -0.003213 0.001940 0.003112 
+-0.004892 0.000732 0.003180 -0.001785 0.002247 0.002654 
+0.001101 0.000303 -0.000323 0.000487 -0.001675 0.000871 
+-0.001345 -0.005682 0.000709 -0.000105 -0.001713 -0.000352 
+-0.000267 0.003967 -0.001033 0.000208 0.007792 -0.004417 
+0.002824 0.000403 -0.002797 0.003958 0.001079 -0.000331 
+0.000576 0.000274 -0.001159 -0.001055 0.000743 -0.000074 
+-0.003735 0.001994 -0.000408 -0.001249 0.007261 -0.000455 
+-0.003096 0.003341 -0.002021 0.003032 0.000082 -0.003385 
+0.005774 0.001445 -0.003689 0.000045 0.002037 -0.000860 
+-0.001210 -0.002598 -0.005007 -0.001954 -0.003958 0.004253 
+-0.007478 -0.003167 0.004817 0.002282 -0.000134 0.003087 
+-0.000806 -0.001831 0.001411 0.000228 -0.001188 -0.000939 
+-0.000455 -0.001031 -0.000402 0.000547 0.000207 0.000108 
+0.003603 0.000000 0.000662 0.003603 0.000995 0.000796 
+-3.848039 -4.313725 -2.661765 -3.252137 -5.072649 -2.461539 
+-2.777778 -5.509259 -1.953704 -2.260606 -5.618182 -1.133333 
+-0.013491 -0.026656 0.005780 0.014073 0.019737 -0.013863 
+-0.010406 0.018296 0.004805 -0.003895 0.005897 0.000615 
+-0.000786 0.001979 -0.002205 0.002767 0.004923 0.002459 
+0.007303 -0.000193 -0.003929 -0.000058 -0.001077 0.000253 
+-0.001483 -0.001014 0.002741 -0.003498 0.001753 0.001181 
+-0.002511 0.003110 -0.000556 0.003636 0.004773 0.000000 
+0.003526 0.001007 -0.002966 0.002631 -0.002525 -0.000666 
+0.004418 -0.002610 0.001215 0.002337 -0.003411 0.000068 
+-0.002819 -0.004663 0.002360 -0.000894 -0.003380 0.001604 
+0.002349 -0.004035 -0.004200 0.005722 -0.001152 -0.005749 
+0.003195 0.000845 -0.002824 0.000528 -0.000361 0.000828 
+0.000412 0.000721 -0.000628 0.003127 0.003318 -0.000979 
+0.004382 0.002880 -0.001552 0.003935 0.001771 -0.001672 
+0.004748 -0.000322 -0.001503 0.004090 -0.002078 -0.002528 
+0.006683 -0.003492 -0.002024 0.009310 -0.004716 0.001028 
+0.007355 0.000000 0.001488 0.003797 0.000574 0.000599 
+0.000612 0.004208 0.000365 -0.001095 0.004145 0.000717 
+-0.001690 0.000779 0.002729 0.000038 -0.000199 0.002250 
+-0.001809 0.000417 0.002732 -0.004144 -0.000935 0.001085 
+-0.002437 -0.000214 -0.001560 0.001768 0.002297 -0.002607 
+-0.000549 0.003760 -0.000626 -0.003736 0.002877 0.002677 
+-0.004489 -0.000835 0.003757 -0.003531 -0.000273 0.003159 
+-0.003603 -0.000296 0.001240 -0.002302 0.000586 0.004188 
+-0.003251 -0.001318 0.003972 -0.002712 -0.001695 0.001694 
+-0.001103 -0.002692 0.001881 0.001618 -0.001840 0.000687 
+0.003661 0.002396 -0.001730 0.006939 0.004966 -0.004735 
+0.003719 0.007106 -0.009496 -0.001254 -0.001538 -0.001700 
+-0.002785 0.002186 -0.001537 0.004131 0.006612 -0.003032 
+0.004241 0.001004 -0.002649 -0.002352 0.001172 0.000863 
+-0.003052 0.002833 0.000635 -0.002461 -0.000633 0.000863 
+0.000626 -0.003051 -0.001283 0.001373 -0.002964 -0.007956 
+0.000490 -0.001599 -0.009005 0.000770 -0.002284 -0.002150 
+-0.005527 -0.002404 0.005682 -0.003736 0.002137 0.004139 
+0.002199 -0.000121 0.001024 -0.000499 0.002609 -0.001163 
+-0.000032 -0.000914 -0.003912 0.000168 -0.000481 0.002939 
+-0.002765 -0.009807 0.007705 0.002153 -0.006296 0.003699 
+-0.020293 -0.005522 -0.009309 -0.019289 -0.018018 -0.019741 
+-1.066326 -3.561224 -1.158163 -0.963158 -3.863158 -0.510526 
+-0.010745 -0.033936 0.007365 -0.010190 -0.013460 0.006987 
+0.001524 0.000556 0.001534 0.006031 0.007348 0.007037 
+0.004132 0.009088 0.004057 0.000447 0.004232 -0.000516 
+0.001962 -0.000124 -0.006134 -0.003128 0.000885 -0.006338 
+-0.003185 0.000456 -0.003705 -0.003220 0.001400 0.001494 
+-0.002773 -0.000611 0.000670 0.001176 0.001746 -0.001025 
+0.004416 0.005120 -0.001255 0.003813 0.005796 -0.000708 
+0.000755 0.000713 -0.000346 -0.004283 -0.003730 0.005048 
+-0.006397 -0.007833 0.005516 -0.003018 -0.003806 -0.000131 
+-0.000352 0.001300 -0.000308 -0.000540 0.000346 -0.000740 
+-0.001017 -0.004369 -0.003597 0.000312 -0.006121 -0.001413 
+0.002962 -0.002314 0.000185 0.005473 -0.002784 -0.002123 
+0.005250 0.000968 -0.001806 0.004213 0.000846 -0.001762 
+0.004414 -0.001619 -0.002898 0.001423 -0.002444 -0.002086 
+0.000747 -0.001981 0.000032 -0.002569 -0.002941 0.001187 
+-0.004022 -0.001621 0.001219 -0.001993 0.001500 -0.000314 
+-0.001172 0.005826 -0.002265 -0.002547 0.007924 -0.007104 
+-0.003835 0.009382 -0.004095 -0.000786 0.005840 -0.000873 
+0.001980 0.001168 -0.001675 0.002978 -0.001059 -0.000057 
+-0.001016 -0.000013 -0.001680 0.000451 0.002037 -0.001421 
+-0.000674 0.005979 0.001284 -0.000749 0.004721 0.005200 
+-0.000997 0.000082 0.005311 -0.002053 0.001373 0.002241 
+0.001618 0.001505 -0.000757 0.000338 -0.001260 -0.000200 
+-0.002250 -0.004454 -0.001319 0.000028 -0.003682 -0.001007 
+0.000664 -0.001003 -0.000565 0.002519 0.004323 -0.000677 
+0.002826 0.001333 -0.000353 -0.000392 -0.000508 -0.003174 
+-0.003256 0.000489 -0.005404 -0.003705 0.004482 -0.002677 
+0.006007 0.007639 -0.006477 0.004563 0.005882 -0.010170 
+0.002554 0.003948 -0.006878 -0.000156 0.001273 -0.002616 
+-0.003139 -0.001141 0.000909 -0.002941 0.000259 0.000481 
+-0.000696 0.001956 0.003278 -0.002453 0.003336 0.003533 
+-0.003682 0.002355 -0.000140 -0.003116 -0.001833 -0.001796 
+-0.001100 -0.004271 -0.000777 0.002280 -0.000641 0.000294 
+0.001100 0.001596 0.001162 -0.000264 0.002112 0.000814 
+0.001449 0.003551 -0.006885 -0.000208 -0.003449 -0.003330 
+-0.004469 -0.009576 0.004754 -0.007751 -0.001860 0.006129 
+-0.003997 0.004544 -0.003268 0.000672 0.002296 -0.003393 
+-0.001349 -0.011938 -0.012372 -0.002188 -0.024603 -0.004442 
+-0.005468 -0.025892 0.000932 -0.006778 -0.019297 0.004625 
+-0.005010 -0.006993 0.002629 0.000681 0.001357 -0.000342 
+0.004019 0.002727 -0.002230 0.002407 0.001905 -0.005911 
+0.000870 0.004152 -0.007265 0.003726 0.001343 -0.005217 
+0.000685 -0.000338 -0.003999 0.000031 -0.000669 -0.000933 
+0.001709 0.000370 0.001053 0.004369 0.002860 -0.000922 
+0.002707 0.005131 -0.003675 -0.000669 0.005202 -0.004226 
+-0.000668 0.002755 -0.002578 0.001318 0.001281 0.000802 
+0.001682 0.000633 0.002737 0.001705 0.001314 0.002106 
+-0.000702 0.000800 0.002341 -0.000189 -0.000813 0.003693 
+0.002828 -0.000462 -0.001365 0.009757 -0.002621 -0.003859 
+0.007983 -0.001681 0.003361 0.004487 -0.003976 -0.004030 
+0.003061 -0.000758 0.001607 -0.002265 -0.000072 0.002664 
+-0.002460 0.002307 0.000923 -0.001753 0.001499 -0.000426 
+-0.001546 0.000295 -0.000045 -0.001595 0.002647 -0.001279 
+-0.000440 0.004186 -0.001754 0.001569 0.002357 -0.000851 
+0.003323 0.002647 -0.001337 0.005129 0.004160 -0.008934 
+0.005290 0.009345 -0.011709 0.004757 0.008464 -0.002380 
+0.002952 0.001229 -0.000510 -0.000191 -0.000606 -0.000222 
+-0.001391 -0.000395 0.000664 0.000658 -0.000475 0.002704 
+0.000367 0.002712 0.002451 0.002935 0.002506 0.003386 
+0.002457 0.001543 0.003525 -0.000223 0.001142 0.002368 
+0.000618 -0.000887 -0.000062 0.002908 -0.002207 -0.001825 
+0.000838 -0.001688 -0.001774 -0.002621 -0.001164 -0.001678 
+-0.004569 -0.001020 -0.000420 -0.000660 -0.000923 -0.000834 
+-0.000227 -0.000596 -0.003280 -0.001615 0.000640 -0.000748 
+-0.000320 -0.000362 -0.000300 -0.000204 -0.002546 0.001944 
+0.004409 0.000154 -0.003271 0.006609 0.003493 -0.007317 
+-0.000032 -0.003296 -0.002650 -0.001172 -0.000781 -0.001172 
+-0.000722 -0.000556 -0.000103 -0.000380 0.000917 0.003906 
+0.000182 0.002341 0.003347 0.000060 0.002669 0.002572 
+-0.001651 -0.000555 -0.001038 -0.007277 -0.006149 0.002183 
+0.001075 -0.003494 0.003636 0.000316 -0.000263 0.000204 
+-0.002328 0.000423 -0.000091 -0.002388 -0.000235 -0.001096 
+0.000318 -0.000624 -0.000314 0.002182 0.000094 -0.002287 
+0.000261 -0.001675 0.001173 -0.000568 -0.000022 0.008241 
+-0.003685 0.011622 0.002281 0.014789 0.010584 -0.003001 
+0.009512 0.002667 -0.011277 0.002462 -0.016698 -0.007707 
+-0.004090 -0.022696 -0.001961 -0.007794 -0.023733 0.001630 
+-0.009970 -0.020601 0.002195 -0.002943 -0.010409 0.003256 
+-0.002525 0.002940 -0.001613 0.004270 0.002477 -0.001334 
+0.002563 0.001682 -0.000321 0.002711 0.001219 -0.001684 
+0.004991 0.003442 -0.002289 0.006155 0.005125 -0.003475 
+0.002120 0.005175 -0.004769 0.003082 0.001266 -0.004190 
+0.003579 0.004518 -0.005024 0.003978 0.006445 -0.004330 
+0.000831 0.005531 0.000814 -0.000271 0.001067 0.000253 
+0.003542 0.001817 -0.002536 0.002138 0.005912 0.001901 
+-0.000241 0.007274 -0.001935 -0.000724 0.002670 -0.000960 
+0.001217 0.000000 -0.001043 0.001880 0.001619 0.000931 
+0.010073 0.001697 -0.004612 0.005547 0.011331 0.000398 
+0.009730 0.013086 -0.002937 -0.008333 0.009701 0.000458 
+-0.006956 0.002702 0.003537 -0.001266 -0.002042 0.001311 
+0.004508 -0.000837 -0.000192 0.008837 0.002197 -0.000954 
+0.010271 0.004663 -0.000258 0.005475 0.005446 0.003741 
+0.002390 0.002190 -0.004489 0.002512 0.003570 -0.005721 
+0.002469 0.001732 -0.011364 -0.004112 0.002186 -0.003448 
+-0.003763 0.000151 0.000873 -0.006048 -0.001403 0.004976 
+-0.001000 0.000143 0.006143 0.000240 -0.000678 0.000908 
+-0.000239 -0.000524 -0.000566 0.000146 -0.000435 -0.000098 
+-0.000513 0.001479 0.001108 0.002340 0.002482 -0.001348 
+0.000444 0.002087 0.000423 0.000900 -0.001520 0.000104 
+0.001361 -0.000934 0.002088 -0.001972 -0.001222 0.001303 
+0.000390 -0.001106 -0.000325 0.000449 -0.001586 -0.000744 
+-0.001885 -0.002603 -0.004149 -0.001679 -0.001408 -0.002220 
+-0.001901 0.000994 0.001829 -0.002259 -0.000273 0.002507 
+0.003308 -0.002803 -0.000424 0.000913 -0.003272 0.000504 
+-0.001295 -0.001515 -0.004105 0.006838 -0.000976 -0.001756 
+0.006518 0.009884 -0.003179 -0.000892 0.003713 -0.000542 
+0.001165 -0.000084 0.002672 0.001355 0.001322 0.002002 
+-0.003510 -0.000068 0.001755 -0.001693 0.001384 0.003393 
+-0.000020 0.000086 0.000825 0.001421 -0.001847 -0.000143 
+0.002682 -0.000892 0.000899 0.000425 0.000485 0.002016 
+-0.001045 -0.002397 0.002101 0.000489 -0.001607 0.003072 
+0.002001 -0.002288 0.003618 0.002668 -0.001554 0.007832 
+-0.003337 -0.002191 0.001828 -0.002304 0.003804 0.007279 
+0.005705 0.005639 0.001077 -0.004374 -0.019373 -0.008255 
+-0.012230 -0.030381 -0.000391 -1.426229 -3.054645 0.420765 
+-0.013824 -0.025390 0.002741 -0.006191 -0.015451 0.000705 
+0.000776 0.004659 -0.001164 0.011770 0.010117 -0.005551 
+0.006944 0.008668 -0.002017 0.001529 0.003786 -0.002842 
+-0.000760 0.002747 0.000847 0.000881 0.000535 -0.000753 
+0.000341 -0.004664 0.000775 0.000670 -0.006000 0.001370 
+0.001361 -0.000348 -0.000917 -0.001644 0.002731 -0.001127 
+-0.000264 0.003610 -0.002081 0.000492 0.001989 -0.000377 
+0.003333 0.002048 0.003575 0.004630 -0.000783 -0.001211 
+0.004823 0.001364 -0.004426 0.002527 0.000173 -0.003739 
+-0.000348 -0.001171 0.000161 0.002472 0.000270 0.001357 
+0.003734 0.007007 -0.003252 0.008905 0.010769 -0.005249 
+0.001165 0.008739 -0.005801 -0.007158 0.001602 0.002584 
+-0.001609 -0.003946 0.003777 0.005233 -0.005215 -0.000203 
+0.008949 -0.003548 0.000099 0.009259 -0.004315 0.001859 
+0.006713 -0.005428 0.000882 0.003458 -0.000737 -0.001450 
+-0.003088 0.001961 -0.001530 -0.008300 -0.000301 0.000121 
+-0.006183 -0.002911 0.001879 -0.001129 -0.001421 0.002074 
+0.002678 0.001139 0.000362 0.002121 -0.000722 -0.001085 
+-0.000192 0.000051 0.001951 -0.002105 -0.003374 0.002672 
+-0.001126 -0.002873 0.003310 0.000930 -0.002239 0.001210 
+0.001544 0.000631 -0.001136 -0.000727 0.002341 0.001796 
+0.000000 0.005108 0.000144 -0.000661 0.001038 0.003116 
+-0.001247 -0.003133 0.002156 0.001951 0.000897 0.002289 
+0.005197 0.002425 -0.003811 -0.000745 0.000518 -0.000801 
+-0.000383 0.001694 -0.003224 -0.000568 0.002222 -0.002376 
+0.001315 0.002426 -0.002993 0.000418 -0.001046 -0.003361 
+0.000876 -0.003221 -0.001662 -0.001210 -0.002129 -0.001175 
+0.000592 0.000710 -0.000947 0.002983 0.005235 -0.004840 
+0.000762 0.005219 -0.007562 0.001526 0.002335 -0.006785 
+0.002225 0.001381 -0.005618 0.003702 0.003702 -0.001234 
+-0.001361 0.001874 -0.002027 -0.001336 0.001249 0.001941 
+-0.001305 -0.001122 0.006084 -0.002120 -0.003675 0.002431 
+0.005607 0.001205 0.001828 0.004040 -0.001469 -0.002080 
+0.000675 0.005761 0.001090 -0.002059 0.005302 0.001830 
+-0.001291 0.006893 0.003630 0.000530 0.006790 0.004572 
+-0.004267 -0.003092 0.001713 -0.003836 -0.002144 0.004567 
+0.010156 0.007140 -0.001135 -0.003553 -0.011388 -0.004226 
+-0.021600 -0.032702 0.006262 -2.224599 -3.481283 0.983957 
+-2.151042 -3.104167 0.760417 -0.016941 -0.022717 0.004479 
+-0.004400 -0.006368 0.000382 0.014796 0.013511 -0.000767 
+0.009661 0.022397 -0.006194 0.004754 0.007886 -0.002823 
+-0.000437 -0.001391 -0.000276 -0.002682 -0.003396 0.002614 
+0.000356 -0.002564 -0.001195 0.000528 -0.001288 -0.002729 
+0.000766 -0.000191 -0.000835 0.002171 -0.001511 -0.001603 
+0.004493 0.002951 -0.003312 0.006237 0.003778 0.001167 
+0.003139 0.001894 0.005465 0.000617 -0.001173 -0.000179 
+0.001668 -0.000797 -0.000687 0.004358 0.000313 -0.002104 
+0.006213 0.000976 -0.002908 0.005531 -0.001621 0.000250 
+-0.000405 0.001733 0.000292 -0.003694 0.006804 0.002701 
+-0.007627 0.005909 0.002201 -0.004091 -0.000492 0.001689 
+0.003611 -0.004175 -0.002258 0.008770 -0.004897 -0.003987 
+0.008607 -0.005992 -0.001837 0.005746 -0.005119 0.000361 
+0.002212 -0.001964 0.003729 -0.003282 0.001033 0.001946 
+-0.004531 0.000849 -0.005202 -0.000562 -0.001338 0.000285 
+0.007363 -0.001703 0.002132 0.010396 0.000963 0.003335 
+0.006460 0.005917 0.007424 0.001230 0.004596 0.000228 
+0.001084 -0.002224 0.001260 -0.000829 -0.000628 0.004696 
+-0.003877 -0.001636 0.005577 -0.000558 -0.001230 -0.000739 
+0.002153 -0.000889 -0.000509 0.002169 -0.000341 -0.002058 
+0.000293 0.002630 -0.000445 0.000792 0.002823 0.000767 
+0.001105 0.001312 0.002892 0.004551 0.001481 0.002003 
+0.000417 0.000482 0.001368 -0.000454 -0.000782 0.000868 
+-0.001237 -0.000803 -0.000033 -0.000827 -0.000182 0.000555 
+-0.000146 -0.003137 -0.001470 -0.002679 -0.005814 -0.002060 
+-0.004549 -0.004184 0.000206 -0.002761 0.000197 0.001846 
+-0.001306 0.002514 -0.000184 0.001578 0.001695 -0.000451 
+-0.000030 -0.001076 -0.003712 -0.000116 -0.000886 0.000101 
+-0.000653 0.001971 0.001349 0.001262 0.001281 0.002165 
+0.000263 0.000124 -0.001527 -0.000991 -0.000350 0.001542 
+-0.008226 -0.000887 0.004113 -0.005417 0.005399 0.003578 
+-0.005347 0.003275 0.001082 -0.004514 -0.001286 -0.001025 
+-0.004073 0.005729 -0.005130 -0.006354 0.009188 -0.002922 
+-0.005194 0.010358 -0.001940 -0.000375 0.005797 -0.002314 
+-0.000222 0.000000 0.000166 -0.000449 0.001511 0.002897 
+0.007359 0.009910 0.003430 0.002976 0.008908 0.010004 
+-0.013642 -0.022309 0.005189 -2.554404 -3.844560 1.264249 
+-2.786957 -3.682609 1.100000 -2.521951 -2.717073 0.882927 
+-0.010990 -0.011796 0.004076 0.005679 0.006402 0.000955 
+0.009877 0.015728 -0.002491 0.007742 0.008631 -0.002707 
+0.000972 0.000102 -0.001407 0.000072 -0.001876 -0.002612 
+0.003825 0.000435 -0.001434 0.002375 -0.000400 -0.000996 
+0.000038 0.002254 -0.001672 -0.000058 -0.000048 -0.000030 
+0.004403 0.001230 0.000609 0.007098 0.003986 -0.000841 
+0.001813 0.002614 -0.000768 0.000545 -0.002733 0.002281 
+0.001053 -0.000238 -0.000367 0.003925 0.001921 -0.000872 
+0.007117 0.004581 -0.000651 0.005795 0.003814 0.002322 
+-0.000137 0.002603 0.004823 -0.005479 0.002763 0.004191 
+-0.005279 -0.000500 0.000102 -0.001046 -0.004211 -0.001540 
+0.003877 -0.002951 -0.001817 0.006360 -0.002390 -0.002721 
+0.004871 -0.001886 -0.001935 0.001921 -0.001363 0.002554 
+0.000004 0.003878 0.003344 -0.020017 0.000248 -0.001926 
+-0.005945 0.003380 0.003837 0.006219 -0.000783 -0.013081 
+-0.003077 -0.004298 -0.006357 0.009339 -0.008782 -0.001863 
+0.006550 -0.007933 -0.006077 0.005178 0.001178 -0.009405 
+0.006913 0.001144 -0.005820 0.003150 0.002730 -0.000375 
+0.000354 -0.001196 -0.001247 -0.001982 -0.000307 0.002863 
+0.000834 0.001138 -0.000025 -0.000614 0.001904 -0.003522 
+-0.000077 0.001693 -0.000411 0.001446 0.002763 0.000881 
+0.001125 0.002274 -0.000376 -0.002702 0.001041 -0.000768 
+-0.001460 0.004208 0.001543 0.000025 -0.000465 0.000511 
+-0.003278 0.001371 0.001193 -0.002467 -0.002465 -0.002260 
+-0.008056 -0.000636 0.000330 -0.007185 0.001062 0.006777 
+-0.003200 0.001115 0.006482 -0.001522 0.000591 0.003281 
+-0.000665 0.001416 0.001166 -0.000492 0.000258 0.000240 
+-0.000028 0.000047 0.000017 0.001872 0.003046 -0.000335 
+-0.000004 0.001192 0.002560 -0.000634 0.001670 0.003600 
+-0.001836 -0.001867 0.003077 -0.002311 0.001890 -0.000194 
+-0.004092 -0.000962 -0.003854 -0.012117 0.004361 0.003287 
+-0.017109 -0.000227 0.004163 -0.016375 -0.005191 0.002302 
+-0.009446 -0.006081 -0.006027 -0.013481 0.004565 -0.012550 
+-0.014975 0.003883 -0.014646 -0.000757 0.001675 -0.000424 
+-0.000105 -0.000074 -0.000100 -0.002485 0.000195 0.001586 
+-0.002698 -0.000632 0.002067 0.014926 0.002994 -0.008158 
+-0.004276 -0.009899 -0.003405 -2.627219 -3.674556 1.142012 
+-3.464844 -3.777344 1.164062 -3.735075 -3.391791 1.227612 
+-3.216346 -2.245192 1.158654 -0.009583 -0.008733 0.007891 
+0.007184 0.005388 0.005700 0.004894 0.011121 0.000686 
+0.002915 0.004611 0.000186 -0.001565 0.001582 -0.002743 
+-0.000137 -0.000595 -0.000673 0.000485 0.000532 -0.000311 
+0.000604 -0.000929 -0.001644 0.003834 0.001469 -0.003996 
+0.007277 0.001286 -0.005551 -0.000016 0.001966 -0.006500 
+0.000363 0.002542 -0.001452 -0.001039 -0.003025 0.002807 
+-0.003453 -0.002049 -0.000674 -0.001933 -0.003054 -0.000005 
+0.001678 0.002056 -0.000138 0.001432 0.007914 0.002837 
+0.000307 0.011500 0.004373 -0.002243 0.008175 0.003938 
+-0.003121 0.000201 0.000673 -0.001016 -0.002357 -0.002258 
+-0.001686 -0.001708 -0.004492 -0.004500 0.002091 -0.003279 
+-0.003909 0.003721 0.001934 -0.003925 0.000538 -0.000366 
+-0.012569 -0.009196 0.004708 -0.010420 -0.003729 0.003495 
+-0.000592 0.000336 -0.000214 0.009472 -0.004018 -0.005118 
+0.007520 -0.009315 -0.014869 -0.003242 -0.000376 -0.020048 
+-0.001297 0.003660 -0.001711 0.002217 0.007773 -0.003288 
+0.005560 0.000173 -0.006120 0.003463 -0.001366 -0.003115 
+0.000442 -0.000264 -0.002581 0.001894 0.002677 -0.001503 
+0.000606 0.000000 -0.004167 0.004698 -0.001190 -0.003410 
+0.002423 -0.003133 -0.003538 -0.003200 -0.001904 -0.001305 
+-0.008759 -0.003445 0.000333 -0.007726 -0.001455 -0.000252 
+-0.002901 0.001853 -0.002001 -0.001838 0.004796 0.000448 
+-0.002411 0.003843 0.001799 -0.002991 0.002479 0.000000 
+-0.000948 -0.000259 -0.001552 0.001558 0.000044 0.001944 
+-0.002667 0.000152 0.000076 -0.002980 -0.005535 0.006598 
+0.001021 -0.001485 0.002226 -0.005432 0.001136 -0.000346 
+-0.001997 -0.001695 0.000755 -0.000857 0.001474 -0.001269 
+-0.001365 -0.001398 -0.003736 0.000739 -0.001088 -0.003270 
+0.001694 -0.001295 0.000446 -0.002247 0.004291 0.001125 
+-0.002092 0.001036 -0.003436 0.008484 -0.005494 0.001299 
+2.125000 -1.559783 1.038043 3.685567 -1.371134 1.417526 
+4.105590 -0.981366 1.360248 0.023533 0.001756 0.017511 
+0.016228 0.005502 0.005072 -0.001887 -0.000207 -0.005112 
+0.001524 -0.007144 -0.000405 -0.003764 -0.004953 0.004889 
+-0.002066 -0.003694 0.001762 0.002593 -0.003236 -0.002785 
+0.005981 -0.006565 0.005880 -0.027338 -0.030385 0.009950 
+-4.197183 -3.826291 1.042253 -4.910959 -4.075343 1.280822 
+-4.965398 -3.702422 1.304498 -4.036364 -2.363636 0.963636 
+-0.014809 -0.010159 0.005734 0.008512 0.004233 0.003147 
+0.006227 0.008338 0.000085 -0.001141 0.002358 0.005675 
+-0.008444 -0.004539 0.001297 -0.008693 -0.005466 0.003988 
+-0.000970 -0.004089 -0.001034 0.003850 -0.001821 0.000954 
+0.003608 -0.000327 0.000706 0.004557 -0.000149 0.001354 
+0.003781 -0.001471 0.002248 0.000401 0.001288 0.004413 
+-0.002029 -0.000922 0.004526 -0.001239 0.001008 0.001531 
+-0.001093 0.002861 0.001109 0.000526 0.007167 0.002650 
+0.003163 0.004128 0.003145 0.005126 -0.002374 0.002296 
+0.004422 -0.000387 0.000464 0.000320 0.000150 0.000323 
+-0.005455 -0.000783 0.001006 -0.008626 0.004623 0.000927 
+-0.011504 -0.004608 -0.003755 -0.013847 -0.007137 0.005685 
+-0.005169 -0.000003 0.004114 0.002646 -0.000494 -0.000688 
+0.008029 0.003299 -0.000915 0.005993 0.002170 -0.001538 
+-0.002584 -0.001534 -0.002197 -0.004239 -0.001746 -0.004054 
+-0.001695 0.001907 -0.001960 0.002455 0.005471 -0.004423 
+-0.000755 -0.000075 -0.002278 -0.007177 -0.001113 0.003143 
+-0.005167 -0.002895 0.002216 0.000342 0.000821 -0.001370 
+-0.002263 0.001447 -0.001502 -0.003551 0.001475 -0.001509 
+-0.003483 0.000520 -0.000397 -0.001580 -0.001435 -0.000548 
+-0.004276 -0.002504 -0.001148 -0.005773 -0.000610 -0.002584 
+-0.004085 0.002302 -0.001805 0.001228 0.003434 -0.005396 
+0.003626 -0.001744 -0.003419 0.011198 0.000353 -0.002214 
+0.008135 0.001659 -0.010061 0.000816 0.000921 -0.001895 
+-0.004820 -0.001239 0.005619 -0.003800 -0.001180 0.008136 
+0.000515 -0.005510 0.003277 -0.004224 -0.000563 -0.002533 
+-0.004840 0.000365 -0.003420 -0.005617 0.001504 -0.002290 
+-0.006810 -0.000036 -0.001225 -0.007247 0.001980 -0.001033 
+-0.002598 0.003185 -0.005767 0.008600 -0.000375 0.006191 
+0.027028 -0.013256 0.012848 4.379913 -1.855895 1.593886 
+5.941176 -2.297578 2.242214 7.757475 -2.435216 2.710963 
+8.855469 -2.390625 2.914062 8.635898 -2.035897 2.902564 
+7.896552 -0.855172 3.020690 5.785714 0.938776 2.163265 
+0.001964 -0.003858 -0.000537 -0.001429 -0.008051 0.003112 
+-0.000575 0.002670 0.002173 0.002677 0.010347 0.000439 
+-0.004003 0.006063 0.003607 -0.027844 -0.030417 0.016652 
+-5.092437 -4.151260 0.957983 -5.522124 -4.119469 0.747788 
+-5.746753 -3.879870 0.707792 -5.596875 -3.356250 0.709375 
+-4.870079 -2.460630 0.625984 -0.018462 -0.014915 0.002110 
+0.016029 0.008690 -0.013008 0.005556 0.002478 -0.006318 
+-0.003744 -0.002927 0.002743 0.001765 -0.006466 0.002270 
+-0.002067 -0.004031 0.005892 -0.000565 -0.002661 0.005565 
+-0.000584 -0.001960 0.004687 0.000000 -0.001528 0.001319 
+0.001691 -0.002011 -0.002176 0.003716 -0.002887 -0.000880 
+0.004280 -0.001127 0.002186 0.002433 0.000410 0.002517 
+0.002869 0.000769 0.002727 0.006389 0.000038 0.003518 
+0.010293 -0.005203 0.004221 0.006650 -0.011776 0.005995 
+0.000356 -0.010598 0.000989 0.003599 -0.009649 0.002819 
+0.003402 -0.006513 0.003939 0.002380 -0.003412 0.000369 
+-0.002060 -0.000040 -0.001730 -0.003929 0.003081 0.000758 
+-0.000247 0.001859 0.005342 0.002930 -0.000331 0.005227 
+0.007001 0.000816 0.001240 0.006368 0.001170 0.000498 
+0.000530 0.002553 0.002472 -0.001400 0.003515 0.002419 
+0.001332 0.003818 0.002573 0.004471 0.003923 0.002413 
+-0.000596 0.000360 0.000619 -0.000663 0.001639 0.000765 
+0.000657 -0.000183 -0.000702 0.002707 -0.000260 -0.002067 
+0.001244 -0.000359 0.000517 0.000774 0.003202 0.001539 
+0.000495 0.002679 -0.000016 0.002072 0.005254 0.000115 
+0.001797 0.004745 0.001530 0.000703 0.000528 0.001121 
+-0.000330 0.002717 -0.000053 0.003077 0.002236 0.002369 
+0.013736 0.002946 -0.000260 0.009411 0.007928 -0.005934 
+0.004008 0.000503 -0.001505 -0.000993 -0.000411 0.001818 
+-0.003024 0.001488 0.001913 -0.004910 0.002194 -0.002699 
+-0.001460 0.007187 -0.000069 0.002596 0.007149 0.000650 
+0.002915 0.003814 -0.001335 -0.006451 0.002002 -0.006165 
+-0.003534 0.011053 -0.002774 -0.006988 0.019033 -0.000149 
+0.003383 0.009649 0.004099 0.022020 -0.011824 0.011643 
+3.735426 -1.968610 2.040359 5.014286 -1.925000 2.607143 
+6.239865 -2.030406 2.945946 7.474638 -2.239130 3.144928 
+8.279352 -2.218623 3.194332 7.952586 -1.543103 3.103448 
+7.009217 -0.350230 2.958525 6.263803 0.865031 2.625767 
+-0.003010 -0.009102 0.006163 -0.007887 -0.008378 0.007265 
+-0.003699 -0.002931 0.005266 0.001697 0.003973 0.003230 
+0.001012 0.006110 0.003817 -0.017736 -0.008143 0.010682 
+-0.064383 -0.046558 0.014785 -6.916667 -4.351852 0.203704 
+-6.518182 -3.927273 0.277273 -6.537500 -3.812500 0.659375 
+-6.557522 -3.587021 1.032448 -5.737226 -2.532847 0.835766 
+-3.270408 -0.265306 -0.428571 -0.001994 -0.002619 -0.008656 
+0.001877 0.009835 -0.004680 0.007444 -0.000466 -0.000031 
+0.004218 -0.001320 -0.002005 0.000612 -0.000889 -0.000136 
+-0.001421 -0.001644 -0.005419 0.000122 -0.001669 -0.005573 
+-0.000036 -0.001162 -0.003186 -0.000253 0.000504 0.001226 
+0.000086 0.000887 0.004440 0.001648 -0.000153 0.003345 
+0.004494 -0.000309 0.002045 0.005212 -0.001900 -0.002353 
+0.006695 -0.004519 -0.002601 0.005996 0.002402 0.002433 
+0.007240 0.005955 -0.005617 0.003744 0.001771 0.003535 
+0.005290 0.001649 0.003359 0.004033 0.001251 0.002278 
+0.000994 0.001024 0.000911 0.000120 -0.000673 -0.000275 
+0.004105 -0.004726 0.002225 0.002873 -0.004366 0.006343 
+0.005186 -0.000729 -0.000231 0.006303 0.002509 -0.002446 
+0.004279 0.003895 -0.000043 0.000521 0.004271 0.000785 
+-0.000945 0.003399 0.001239 -0.000360 0.000804 0.001015 
+0.000911 0.001513 -0.001446 0.004311 -0.002004 0.000531 
+0.006246 -0.000182 0.000277 0.003889 0.000698 0.001490 
+0.002926 -0.000293 -0.000100 -0.000347 0.005984 -0.001389 
+0.001320 0.001040 -0.003400 0.002598 0.001963 -0.002748 
+0.004307 0.003395 -0.003381 0.005184 0.004076 -0.004499 
+0.002390 0.002470 -0.004489 0.000723 0.002298 -0.000245 
+0.000359 -0.000181 0.000288 -0.001555 -0.000465 0.000736 
+-0.005512 0.000308 0.000172 -0.007400 0.001574 0.000513 
+-0.004323 0.008251 0.002778 0.001417 0.012135 -0.004486 
+0.003504 -0.000124 -0.002496 0.006069 -0.000232 0.001494 
+0.001268 -0.004478 -0.002486 -0.005860 -0.004310 0.000717 
+-0.009038 0.005804 0.001220 -0.000010 0.011204 0.003014 
+0.013778 0.004207 0.006359 0.022499 -0.006992 0.006194 
+2.774566 -1.421965 2.028902 4.053571 -1.428571 2.613095 
+5.006410 -1.032051 2.519231 4.725352 -0.690141 1.915493 
+4.297710 -0.595420 1.396947 4.279070 -0.085271 1.155039 
+0.036173 0.003964 0.009815 0.026290 0.006239 0.010490 
+-0.003021 -0.009309 0.004603 -0.000386 -0.011097 0.002342 
+-0.007199 -0.000608 0.001004 -0.002443 -0.001054 0.005936 
+0.007313 0.010124 0.006792 0.019656 0.023491 -0.001438 
+0.019165 -0.001638 -0.007710 -0.049737 -0.043624 -0.018494 
+-7.339286 -3.785714 -0.214286 -7.455883 -3.745098 0.588235 
+-7.642599 -3.638989 1.162455 -7.610000 -3.286667 1.530000 
+-6.878229 -2.483395 1.416974 -5.142180 -1.246446 0.748815 
+-0.011283 -0.009479 0.009370 0.001381 0.006494 -0.010790 
+0.010010 0.004699 -0.002742 -0.001485 0.001501 -0.000284 
+-0.006474 -0.001854 0.000501 -0.005133 -0.004989 0.004568 
+-0.004016 -0.008171 0.005899 -0.005394 -0.007425 0.000525 
+-0.011700 -0.001784 -0.005889 -0.018386 0.003915 -0.006111 
+-0.011260 0.002160 0.000923 0.002121 -0.002935 -0.004811 
+-0.000714 -0.000298 -0.009817 -0.000295 -0.003453 -0.002781 
+0.002170 -0.000510 0.000069 0.003026 0.002157 0.003295 
+0.002535 0.002828 0.004576 0.001229 0.002208 0.002182 
+-0.000672 -0.000588 0.000000 -0.000808 -0.001445 0.002089 
+-0.001852 -0.000113 0.004018 -0.001092 0.001064 0.006407 
+0.001543 0.000138 0.006942 0.003564 -0.002930 0.003075 
+0.003068 -0.000095 0.000499 0.001390 0.003861 0.000482 
+0.002518 0.006225 -0.001883 0.004330 0.005438 -0.007063 
+0.001488 0.001966 -0.013924 -0.003243 -0.001834 -0.011449 
+-0.002045 -0.001794 -0.001860 -0.001569 -0.000306 0.002384 
+0.001187 0.003218 -0.001168 -0.002031 0.003327 -0.004237 
+0.000650 0.001800 -0.004394 0.000292 -0.000109 0.000064 
+0.002480 -0.000841 0.001529 0.004704 0.002964 0.000799 
+-0.000672 0.002675 -0.001012 -0.003014 0.001962 -0.002587 
+-0.006751 0.004450 0.000304 -0.006856 0.006390 -0.000304 
+-0.001669 0.011922 0.001705 -0.001261 0.003162 -0.002241 
+0.006568 -0.002471 0.006551 0.009583 -0.004538 0.000778 
+0.007083 -0.009862 -0.002250 0.004085 -0.010494 -0.001474 
+-0.000612 -0.008375 -0.000403 -0.004668 -0.005343 0.000693 
+-0.003585 -0.001765 0.000241 -0.000893 0.001813 -0.000528 
+0.006188 0.004863 -0.001648 0.006961 -0.002484 0.004528 
+0.006191 0.002699 0.013913 0.007076 0.003232 0.013235 
+0.007797 -0.000305 0.006004 0.010548 -0.000020 -0.006610 
+0.005798 0.014469 -0.013473 -0.010918 0.015672 -0.003587 
+-0.024599 0.007324 -0.005200 -0.020013 0.000840 -0.005060 
+0.000499 -0.000739 -0.003165 -0.002117 -0.003719 -0.001305 
+-0.004374 -0.004165 0.002174 0.000269 -0.003456 0.003752 
+0.005490 0.005166 0.005016 0.015367 0.014577 0.000500 
+0.022338 0.018693 -0.008161 0.008866 0.003925 -0.018941 
+-0.039937 -0.026065 -0.012458 -7.376471 -2.694118 -0.211765 
+-8.265306 -2.979592 0.530612 -8.617925 -2.919811 1.183962 
+-8.509960 -2.605578 1.836653 -7.902954 -2.147679 2.367089 
+-6.092896 -1.218579 2.060109 -0.020981 0.000876 0.006739 
+-0.006989 0.000822 -0.000125 -0.003269 0.006366 0.012546 
+-0.004462 -0.007785 0.032085 0.652174 -0.545894 3.599034 
+1.753927 -0.303665 2.984293 0.026343 -0.004460 0.015181 
+0.018718 -0.004168 0.010767 0.002622 -0.011503 0.005309 
+-0.019631 -0.018229 0.008757 -0.002116 0.004432 0.008602 
+0.003133 -0.002607 0.000699 0.005062 -0.003135 0.000638 
+0.006711 -0.001390 0.000908 0.008091 0.000325 0.000787 
+0.008345 0.001964 -0.001226 0.000536 -0.001868 -0.001639 
+0.002597 -0.002309 -0.000680 -0.001669 0.000966 0.002972 
+-0.010162 0.002346 0.010937 -0.012664 -0.005128 0.016293 
+-0.003991 -0.008267 0.012791 -0.000374 -0.006640 0.004462 
+-0.000425 -0.002481 -0.000587 -0.000904 0.002859 0.000715 
+-0.002406 0.008225 -0.001520 -0.000002 0.007278 -0.005897 
+0.004159 0.009361 -0.006903 0.000217 0.006780 -0.002905 
+-0.002309 0.000431 -0.004385 -0.005556 -0.000947 0.001602 
+-0.004856 -0.000336 0.004542 -0.002995 0.000661 0.005012 
+-0.004229 0.001396 0.004428 -0.004957 0.000170 0.000860 
+-0.001787 -0.000267 -0.000789 -0.001635 -0.000383 -0.001543 
+-0.004287 0.000901 -0.003061 -0.002553 0.000276 -0.002169 
+0.006837 0.001542 0.003150 0.017165 -0.005598 0.003510 
+0.023451 -0.004825 0.006847 0.021860 -0.006554 0.004234 
+0.012324 -0.010782 0.000304 0.002554 -0.012886 0.000154 
+-0.001906 -0.011971 0.001666 -0.001293 -0.007612 0.002327 
+0.000928 -0.000853 0.000399 -0.001250 -0.000551 -0.001507 
+-0.005118 0.001548 -0.001494 -0.009206 0.003929 -0.000125 
+-0.008454 0.007628 0.003681 -0.004341 0.011330 0.004546 
+0.000830 0.011584 0.004358 0.000925 0.009771 0.002271 
+0.002763 -0.000334 -0.004584 -0.012484 -0.000753 -0.007403 
+-0.010947 0.001591 -0.007208 -0.008108 0.001737 -0.003704 
+-0.003348 -0.001054 -0.003097 -0.002572 0.000164 0.000610 
+0.001603 0.002138 -0.006172 0.001842 0.001866 -0.004017 
+0.000108 0.000113 0.000773 -0.000672 0.000092 0.004572 
+0.000688 -0.002673 0.005876 0.005211 0.008162 0.004726 
+0.013629 0.014119 0.004326 0.017122 0.013190 0.007552 
+0.009972 -0.002615 0.012169 -0.023140 -0.032029 0.004927 
+-0.053477 -0.046243 0.005467 -8.603448 -2.646552 0.431034 
+-9.115151 -2.157576 1.478788 -8.739796 -1.617347 2.454082 
+-7.251232 -0.901478 2.660099 -4.655172 0.004926 1.827586 
+-2.946079 0.127451 1.916667 -2.010101 -0.545455 3.565657 
+-0.028436 -1.246446 4.938389 2.381974 -1.236052 4.596567 
+3.951965 -0.746725 3.292576 3.578680 -0.269036 2.162436 
+0.018304 0.002543 0.019572 0.013950 0.004854 0.016133 
+-0.004707 -0.002323 0.021700 -0.002985 0.005436 0.004263 
+0.000826 -0.000405 0.000169 0.004066 -0.000984 0.001236 
+0.006144 0.000407 0.001746 0.002174 0.002224 0.000901 
+-0.001359 -0.000677 0.002381 -0.000051 0.000147 0.000128 
+0.001735 0.004718 -0.002302 0.000316 0.007407 -0.000175 
+-0.007592 0.006040 0.003906 -0.013618 0.001551 0.000752 
+-0.004395 -0.000970 -0.002601 -0.003730 0.002249 -0.004650 
+-0.004638 0.004602 -0.003968 -0.004797 0.004487 0.002754 
+-0.002304 0.005857 0.004110 -0.002964 0.006758 0.002322 
+0.001382 0.004207 -0.001224 0.005542 0.000211 -0.004080 
+0.003909 -0.004551 -0.005472 -0.002916 -0.003620 -0.010045 
+-0.009593 -0.005131 -0.002973 -0.004206 -0.002325 0.004934 
+-0.003721 -0.000717 0.006165 -0.005927 0.001197 0.000950 
+-0.008187 -0.000273 -0.003548 -0.008813 -0.002478 -0.006809 
+0.004168 0.000633 -0.014430 0.017755 0.010007 0.004916 
+0.027336 -0.006525 0.009575 0.027137 -0.017148 0.007768 
+0.022163 -0.016928 0.003567 0.013412 -0.010660 0.001236 
+0.002379 -0.004611 0.001542 -0.004359 -0.002859 0.003193 
+-0.001137 -0.001654 0.004650 0.005602 -0.003926 -0.002865 
+0.007550 -0.007685 -0.002048 0.005310 -0.002423 -0.000313 
+-0.000943 0.004607 -0.000763 -0.004690 0.007037 -0.003597 
+-0.004069 0.009095 -0.003269 -0.005171 0.007064 -0.001908 
+-0.003107 0.005943 -0.003170 -0.003966 -0.000847 -0.001328 
+-0.011251 0.002857 -0.001947 -0.011265 0.005554 -0.001863 
+-0.007015 0.006740 0.000201 -0.002928 0.005932 0.001351 
+0.000749 0.004029 -0.000864 -0.000458 0.000098 -0.000163 
+-0.000213 -0.001069 0.000550 0.003015 -0.000382 -0.000742 
+0.000179 0.000056 -0.000100 -0.001887 -0.000836 0.001850 
+0.001019 0.000137 0.003746 0.007038 0.000843 0.003103 
+0.008287 0.008336 0.001746 0.010362 0.006380 0.001971 
+0.009867 0.004929 0.000360 0.010722 0.004222 -0.000750 
+0.000219 -0.001132 0.001358 -0.027251 -0.022589 0.012899 
+-7.230769 -1.868132 0.956044 -8.250000 -1.625000 2.041667 
+-7.563758 -0.986577 2.483222 -5.958580 -0.147929 2.573965 
+-3.934524 0.375000 3.113095 -1.610738 -0.087248 4.510067 
+1.525926 -1.311111 5.244444 4.589928 -1.762590 4.230216 
+5.342857 -1.007143 2.721429 0.029671 -0.010974 0.016313 
+0.003604 -0.003991 0.009510 -0.008863 0.000274 0.006564 
+-0.004699 0.010492 0.003032 -0.003354 0.005198 0.000693 
+-0.000830 0.000729 -0.000061 -0.000099 -0.001888 -0.000548 
+-0.002537 -0.000540 -0.000064 -0.002055 -0.003679 0.005682 
+-0.002093 -0.000452 0.004390 -0.001024 0.001476 0.002297 
+0.001549 0.001727 0.000039 0.004086 0.000876 -0.000491 
+0.002420 0.000970 0.000276 -0.001377 0.002120 0.000998 
+-0.003755 0.003715 0.000951 -0.001482 0.003440 0.001027 
+0.000418 0.002240 0.002103 -0.002425 0.003991 0.002311 
+-0.001654 0.005543 0.004793 -0.003230 0.006390 0.005453 
+-0.001700 0.002797 0.000620 0.001880 -0.002348 0.003362 
+0.001986 -0.000711 0.001078 0.005025 0.003475 -0.000124 
+0.015823 -0.001395 -0.002865 0.005731 -0.009051 0.001446 
+-0.005403 -0.005227 0.005974 -0.012277 0.002104 -0.002026 
+-0.003177 0.006491 -0.017045 0.017729 -0.003416 -0.012843 
+0.023111 -0.007348 0.005276 0.024269 -0.011514 0.006643 
+0.020561 -0.007018 0.003660 0.011117 -0.005943 0.003215 
+-0.000609 -0.006208 0.006704 -0.001786 -0.001418 0.005013 
+0.007635 -0.002195 -0.003106 0.017713 -0.001710 -0.001203 
+0.018487 0.004326 0.001982 0.012330 0.004781 0.001698 
+0.003528 0.000284 -0.002375 0.002190 -0.002550 -0.000281 
+0.000636 -0.000641 -0.001623 -0.001013 -0.002466 -0.001664 
+0.001985 -0.000535 -0.002078 0.003936 0.000532 -0.003144 
+0.001793 -0.000473 -0.002302 -0.002521 0.001239 -0.001604 
+-0.003722 0.002281 -0.002099 -0.001947 0.003112 -0.003181 
+0.001048 0.003988 -0.000886 0.003500 0.004093 0.002174 
+0.002491 0.002691 0.000874 -0.001174 -0.001801 -0.000633 
+0.002339 -0.002339 0.000887 -0.000165 -0.003598 0.001473 
+-0.001028 -0.003268 0.000569 0.001452 -0.002715 0.001172 
+0.001196 0.000258 0.001163 -0.000562 0.000945 0.001707 
+0.002178 0.003028 0.000668 0.000018 0.003667 0.000957 
+0.009520 0.000657 -0.002052 0.009863 0.002959 -0.004670 
+0.007394 0.003402 -0.000903 0.002201 -0.001259 0.004754 
+-0.008710 -0.010196 0.001779 -0.034106 -0.001698 0.004409 
+-0.040991 -0.011530 -0.000357 -0.033773 -0.004271 -0.002548 
+-0.019302 -0.002897 0.002088 0.000392 -0.010533 0.008222 
+0.019270 -0.013959 0.013880 0.027540 -0.010217 0.013274 
+0.018554 -0.007425 0.008633 0.004007 -0.001257 0.002514 
+-0.009046 -0.001695 0.000709 -0.002865 0.002818 -0.002538 
+-0.005051 0.004056 -0.002919 -0.001276 0.004900 0.000976 
+0.003900 0.005674 0.001736 0.002941 0.001942 0.000765 
+0.000002 -0.000754 0.000322 0.000086 0.001104 -0.000249 
+0.000968 0.004231 -0.002813 0.003736 0.001570 -0.002955 
+0.001706 -0.001291 -0.002078 0.003226 -0.002668 -0.002705 
+0.004566 -0.002895 -0.001865 -0.000067 -0.002951 -0.001427 
+-0.003671 -0.004403 -0.003129 -0.000136 -0.005228 -0.002440 
+0.000995 -0.002884 0.000632 0.001094 0.002651 -0.002225 
+-0.001419 0.003135 0.006529 -0.009064 0.001382 0.011307 
+-0.007542 0.000467 0.007892 -0.000763 0.001806 0.007346 
+-0.006325 0.000772 0.000912 -0.016313 0.002135 0.002311 
+-0.018750 0.001050 0.003167 -0.023509 -0.003305 0.007752 
+-0.030426 -0.007987 0.017135 -3.073446 -0.785311 2.508475 
+-0.025240 -0.000180 0.024586 -0.015904 -0.002310 0.016067 
+-0.003314 -0.006879 0.007538 0.002238 -0.000532 0.004480 
+-0.008571 0.004606 0.010816 -0.012568 0.003155 0.009341 
+-0.003090 -0.000156 -0.000255 0.009361 -0.008164 -0.012345 
+0.009195 -0.009469 -0.003012 0.006726 0.004415 0.003600 
+0.002746 0.016054 0.006769 0.001479 0.016229 0.005123 
+-0.002174 0.011108 0.001096 -0.002182 0.007583 -0.000011 
+-0.002127 0.001166 -0.000216 -0.004645 -0.007528 0.005688 
+-0.009682 -0.014235 0.003776 -0.003244 -0.003879 -0.005321 
+0.003740 0.001143 -0.005630 0.007886 0.006218 -0.003152 
+0.005145 0.005748 0.000987 -0.001207 0.003093 -0.000578 
+-0.000156 0.001682 -0.005496 0.002102 0.000087 0.001016 
+0.004916 0.001352 0.000347 0.003651 -0.003420 -0.003056 
+-0.001108 0.000224 -0.001892 -0.000012 -0.000849 0.000508 
+-0.000211 -0.001938 -0.000098 0.000739 -0.000117 0.000860 
+0.004708 0.004052 0.000398 0.010603 0.001034 -0.002069 
+0.004009 0.004770 -0.004146 0.002546 0.003182 -0.000312 
+0.001457 0.000989 0.000442 0.002776 0.000645 0.000078 
+0.003243 0.002964 -0.001113 0.005764 0.006294 0.004909 
+0.012175 0.006382 0.005429 0.006691 0.001079 -0.002318 
+-0.006127 -0.000789 -0.001371 -0.006649 -0.000096 0.000363 
+-0.004729 -0.005196 0.000821 -0.004039 -0.009655 0.000367 
+-0.002304 -0.008663 0.002852 -0.000991 0.001443 -0.000972 
+-0.003610 0.001289 -0.010635 0.002888 0.003420 -0.009931 
+0.001355 0.000267 -0.007353 -0.002967 0.001251 -0.005993 
+-0.003843 0.002187 -0.001476 -0.000900 0.003540 0.000118 
+-0.000010 0.000923 -0.000641 -0.001452 -0.001037 0.000070 
+-0.002500 -0.000747 -0.000188 -0.001484 0.000000 -0.000068 
+-0.000232 0.000486 0.000220 -0.001027 0.000095 -0.000229 
+-0.001307 -0.001945 -0.001645 0.000469 -0.002906 -0.002097 
+0.001149 -0.003000 -0.002132 -0.001301 -0.003204 -0.001729 
+-0.001754 -0.003602 -0.001976 0.000994 -0.002747 -0.000258 
+-0.000191 0.001393 -0.000890 0.001038 0.001669 0.000611 
+-0.001633 -0.000071 0.005827 -0.002885 -0.000682 0.003706 
+0.001753 0.000655 -0.002181 0.005369 0.003418 -0.008345 
+0.001705 -0.001729 0.000322 -0.014169 0.001585 0.010655 
+-0.023222 0.008338 0.017127 -3.670732 0.613821 1.873984 
+-3.856678 0.400651 3.286645 -3.863192 0.045603 4.355049 
+-3.663900 -0.302905 4.871369 -3.250000 -1.055556 4.826389 
+-0.000362 -0.002671 0.024664 -0.004943 0.001312 -0.003850 
+-0.002549 -0.001108 -0.004360 -0.015797 -0.006624 0.006783 
+-0.001743 0.005391 -0.010750 0.019148 0.013281 -0.024642 
+0.014726 0.007998 -0.019389 0.006080 -0.000830 -0.003603 
+-0.001492 -0.000918 -0.002952 -0.005915 0.002178 -0.003979 
+-0.005142 0.008381 -0.000865 -0.001331 0.005002 -0.001562 
+-0.003688 -0.007538 0.006254 -0.009116 -0.018621 0.005451 
+-0.000461 -0.004913 -0.006649 0.002479 0.003489 -0.009898 
+0.007869 0.008245 -0.001019 0.005364 0.003952 0.001679 
+0.003625 0.005379 0.000706 0.005521 0.008579 -0.003953 
+0.006245 0.012572 -0.001113 0.004070 0.009391 0.001357 
+-0.002655 -0.001014 0.003747 -0.002026 -0.005766 0.005666 
+-0.000471 -0.000471 -0.003116 -0.002422 0.000492 -0.004466 
+-0.002038 0.002824 -0.003901 0.000668 0.003389 -0.004073 
+0.002480 0.002009 -0.005121 0.002410 -0.000431 -0.006200 
+-0.000153 -0.001660 -0.002097 -0.000576 -0.000477 -0.000098 
+-0.001474 -0.001936 0.004103 -0.001169 -0.001654 0.005620 
+0.000632 -0.005108 0.004310 0.002803 -0.002650 -0.000312 
+0.004856 0.000402 -0.001434 0.007193 0.002767 -0.003732 
+0.010430 0.003325 -0.004927 0.009277 0.002907 -0.000477 
+0.000547 0.002246 0.001542 -0.008596 0.000567 0.003332 
+-0.007959 -0.004273 0.005193 0.000974 0.000552 -0.001737 
+0.007857 0.000949 -0.005966 -0.000256 0.000291 -0.000803 
+-0.003522 0.002492 0.002974 -0.003989 0.002981 0.000273 
+-0.000304 -0.000304 -0.000608 0.003313 0.004141 -0.002761 
+0.003611 0.000452 0.000486 0.000870 0.000358 0.000302 
+-0.000361 0.000768 0.000627 -0.000544 0.001751 0.001672 
+-0.003905 0.001356 0.003710 -0.004919 -0.000044 0.004871 
+-0.000469 -0.000167 0.002634 0.001732 -0.001097 -0.000075 
+0.000566 -0.003387 -0.001456 0.002008 -0.000921 -0.000710 
+0.006051 0.000107 0.000631 0.008662 -0.000634 0.000282 
+0.004398 0.002074 -0.000644 0.000166 0.001355 0.002878 
+0.001315 0.000055 0.001351 0.006292 0.000242 -0.006050 
+0.010675 0.002143 -0.007254 0.007237 0.002526 -0.007747 
+0.001523 0.005565 -0.008242 0.004381 0.003409 -0.003306 
+-0.004794 0.001207 0.008981 -3.204255 1.161702 2.055319 
+-3.793594 1.110320 3.790035 -4.177686 0.954545 5.074380 
+-4.291667 0.291667 5.798611 -0.014986 0.007093 0.048756 
+0.008367 -0.008000 -0.000858 -0.001514 0.001836 -0.002071 
+-0.013723 0.003939 0.007567 -0.001802 -0.000281 -0.001705 
+0.013802 -0.002461 -0.017233 0.010227 -0.004273 -0.007590 
+0.008725 0.000859 0.007392 0.000571 0.002977 0.004858 
+-0.006557 0.000663 -0.000243 -0.005838 0.002284 0.000199 
+-0.000506 0.002639 0.000726 -0.001987 -0.006361 0.001331 
+0.001924 -0.006356 -0.003052 0.001344 -0.002897 0.000226 
+0.001365 0.001767 -0.005450 -0.000404 0.003049 -0.000812 
+0.000903 -0.001078 0.000230 0.001031 0.000033 0.000100 
+0.001335 0.004280 0.000987 0.000540 0.011009 -0.001538 
+0.006608 0.012533 -0.001822 0.006143 -0.000564 -0.000178 
+-0.002532 -0.004769 0.004736 -0.006365 -0.007622 0.005167 
+0.003949 0.004797 0.001015 0.003836 0.002492 0.001534 
+-0.000519 0.002581 0.000968 -0.004618 0.002309 0.000515 
+-0.003696 0.000396 0.001586 0.000106 -0.000327 -0.000866 
+0.002218 -0.001385 -0.003802 0.004156 -0.001985 -0.001294 
+-0.000645 -0.001129 0.002581 -0.001941 -0.002133 0.005052 
+0.001069 -0.001069 0.006031 -0.002112 -0.001954 0.004471 
+-0.003037 -0.002423 0.003518 0.000054 -0.003194 0.001949 
+0.001776 -0.002604 0.000798 0.005730 -0.000268 -0.000620 
+0.005041 0.002280 -0.000238 0.001717 0.003218 0.001519 
+-0.001008 0.003443 0.002814 -0.000031 0.002082 0.003591 
+0.000170 0.000078 0.001038 -0.001843 0.000631 0.000079 
+-0.001726 0.000789 0.001148 -0.000677 -0.001437 -0.001920 
+0.000900 -0.001177 -0.002148 -0.000573 -0.001987 -0.001584 
+0.001025 0.000741 0.000750 0.003832 0.001342 0.001520 
+0.004593 0.000061 -0.000386 -0.001325 -0.001780 0.000170 
+-0.005276 -0.002363 0.003696 -0.001612 0.001791 0.002030 
+0.003964 -0.000248 0.002352 0.003973 0.000623 0.000444 
+0.000100 -0.000994 0.000988 -0.001600 -0.001756 0.002357 
+0.000079 0.000863 0.001687 0.001626 -0.000345 0.000179 
+0.000621 -0.001129 -0.001693 0.000134 -0.000484 -0.001088 
+0.000675 -0.000588 -0.000583 0.005706 0.003440 -0.001298 
+0.005719 0.002050 -0.005396 0.003188 0.002018 -0.002153 
+-0.001113 -0.001118 -0.001045 -0.002641 0.001964 -0.003387 
+-0.012583 0.001635 0.007171 -0.018483 -0.000346 0.017108 
+-0.025943 -0.001561 0.025266 -0.029775 -0.001996 0.029993 
+-0.008273 -0.009872 0.028426 0.012874 -0.010668 -0.014891 
+-0.000932 0.000913 -0.003605 -0.002745 0.002832 0.004953 
+0.000693 -0.000310 -0.000324 0.008343 -0.003227 -0.006266 
+0.007071 -0.002987 -0.002699 0.002279 0.002182 0.003299 
+0.000103 0.003551 0.001256 -0.001436 0.003190 0.001984 
+0.003766 0.000658 -0.001178 0.005608 0.001746 -0.004325 
+0.002863 0.001022 -0.000698 -0.002689 0.000136 0.002434 
+-0.005193 0.000263 0.000978 -0.002193 -0.000631 0.001434 
+-0.001118 -0.001621 -0.001188 0.001185 -0.000349 -0.000814 
+0.000510 0.001845 -0.001456 -0.000765 0.003157 -0.001855 
+0.002101 -0.001520 -0.000977 0.006613 -0.000524 -0.001396 
+0.009274 0.000016 -0.000032 0.008462 -0.001996 -0.000737 
+0.003739 0.004062 -0.002927 0.004051 0.001582 -0.001079 
+0.000241 0.002405 0.000904 -0.000492 0.002358 0.001853 
+0.001442 0.000451 -0.000542 -0.001236 -0.001617 0.000631 
+-0.001781 -0.002745 0.002607 -0.000988 -0.003636 0.003622 
+-0.002204 -0.003529 0.005289 -0.002855 -0.001347 0.000839 
+0.003444 -0.001160 0.002937 0.001856 0.001547 0.001854 
+0.001871 -0.000807 -0.000536 0.000076 -0.004530 0.000868 
+-0.001177 -0.006861 0.003610 -0.002742 0.001281 0.004484 
+-0.003332 0.000922 -0.000278 -0.004679 0.003095 0.000585 
+-0.003480 0.004553 0.001898 0.000167 0.005100 0.001700 
+0.002133 0.001785 0.002703 0.000217 -0.000501 0.000048 
+-0.001429 -0.000345 -0.003124 -0.002536 0.000213 -0.003166 
+-0.002265 0.001923 -0.001240 -0.002115 0.001681 0.001094 
+-0.000860 0.001417 0.001195 0.000708 0.000309 0.000721 
+0.002537 -0.000130 0.000593 0.002438 0.000549 0.000050 
+-0.002024 0.000072 0.001093 -0.004286 -0.000702 0.004108 
+-0.003242 -0.000422 0.003321 -0.000526 0.000376 0.000075 
+0.000260 -0.001432 -0.000407 -0.001460 -0.001369 0.000304 
+-0.004304 -0.000847 0.000505 -0.004518 0.000892 -0.000713 
+-0.001729 0.003622 -0.001220 0.000682 0.001182 -0.002364 
+0.000806 -0.000245 0.000271 0.000452 -0.001714 -0.000909 
+0.000521 -0.001648 -0.000918 0.002804 0.000576 -0.001520 
+0.002962 0.001540 -0.001936 0.000131 0.000654 -0.001400 
+-0.001136 -0.002327 0.000303 -0.003110 -0.004913 0.002716 
+-0.005613 -0.005279 0.009202 -0.009026 0.001197 0.011789 
+-0.003797 0.000267 0.005447 0.005186 0.005440 -0.003864 
+0.000312 -0.001618 -0.011359 -0.000742 -0.001574 -0.004931 
+-0.001282 0.000404 -0.001231 -0.001112 0.001318 -0.000251 
+0.001620 0.003162 0.002107 0.006847 0.005717 0.000203 
+0.005742 0.005238 -0.002086 0.001632 -0.001034 0.000406 
+-0.000435 0.000240 0.004188 0.000089 -0.000571 0.001621 
+-0.000440 0.001925 -0.000801 -0.000978 -0.001481 -0.005169 
+-0.000469 0.003677 -0.001905 0.000972 0.003222 -0.000553 
+0.000404 0.004594 0.001060 0.004449 0.002849 0.000608 
+0.000207 0.002072 -0.003876 0.002607 0.002089 -0.001283 
+0.000496 0.004460 -0.000693 0.001674 0.004764 -0.001351 
+0.002715 0.001720 -0.002285 -0.001806 -0.001463 -0.000301 
+-0.002522 0.002136 0.000682 -0.008600 -0.000160 0.008280 
+-0.007939 -0.001951 0.001985 -0.000963 -0.002860 0.001565 
+-0.002092 0.000975 -0.001597 -0.001276 -0.000198 -0.000828 
+-0.000352 -0.002087 -0.001003 -0.003464 -0.002615 0.000839 
+-0.001503 -0.005414 0.003316 -0.004401 0.001586 0.000389 
+-0.003738 -0.000955 0.006139 -0.002433 -0.001155 0.005825 
+-0.002931 -0.003904 0.002929 -0.001496 -0.004330 0.002667 
+-0.000420 -0.002853 0.002936 -0.000785 -0.001000 0.000262 
+0.001216 -0.001789 0.001646 -0.001294 -0.001376 0.001392 
+-0.004297 -0.002281 -0.001141 -0.005410 -0.002734 0.000492 
+-0.005131 -0.000144 0.002493 -0.000769 -0.000879 0.005484 
+0.001102 0.000349 0.001203 0.000633 0.000362 -0.002269 
+0.001064 0.000930 -0.004403 0.000605 -0.001175 -0.001436 
+-0.003975 -0.001569 -0.002217 -0.003185 -0.000295 -0.002893 
+-0.000517 0.000359 -0.000112 0.004736 0.001171 0.003499 
+0.006311 0.001526 0.000766 -0.000541 -0.001687 -0.000093 
+-0.001542 -0.000633 0.001328 -0.000017 0.002952 -0.000612 
+0.000894 0.004372 -0.003797 0.002230 0.002531 -0.004332 
+0.000694 -0.000122 -0.001744 -0.002423 -0.003500 0.000565 
+-0.002746 -0.001988 -0.000933 0.000069 0.001171 0.000879 
+0.001476 0.000668 0.002030 0.001501 0.000955 0.001022 
+0.000211 -0.001148 0.000005 -0.001449 -0.000923 -0.000973 
+0.000095 0.000202 0.000110 0.002538 0.000607 -0.000423 
+0.001564 -0.000228 -0.001221 0.000051 -0.000908 -0.001390 
+-0.000038 -0.003436 -0.001081 -0.002578 -0.001909 -0.003116 
+-0.002460 -0.003059 -0.006303 0.000183 -0.001082 -0.007513 
+0.007521 0.006202 -0.005444 0.002831 0.007448 -0.007337 
+-0.003775 0.006088 -0.000449 -0.004221 0.004067 0.001825 
+-0.002447 0.002289 -0.000593 0.000416 -0.000770 -0.000787 
+-0.000037 -0.000638 -0.000820 -0.001377 0.000932 0.000188 
+-0.001063 0.002441 -0.000748 -0.000060 0.001368 -0.000484 
+-0.000677 0.001232 -0.000739 -0.000980 0.000949 -0.001750 
+-0.001558 -0.000075 -0.003363 -0.002620 -0.002157 -0.000246 
+-0.003202 -0.000548 -0.002439 -0.000072 0.000430 -0.001061 
+0.001392 0.001062 0.000122 0.003418 0.001233 0.001205 
+0.004724 0.005363 -0.003557 0.004533 0.006502 -0.000040 
+-0.002756 0.006943 0.000286 0.003050 0.005422 -0.000271 
+-0.000314 0.002378 0.001570 -0.004577 0.000240 0.001330 
+-0.006510 -0.002023 0.003856 -0.006822 -0.003419 0.003040 
+-0.004653 -0.001852 -0.000430 0.000132 -0.003432 -0.001617 
+-0.000188 -0.002440 -0.000578 -0.000461 -0.000643 -0.000471 
+0.001835 0.001261 0.000262 0.000922 0.001766 -0.001690 
+0.000891 0.000505 -0.002517 0.006765 0.000000 -0.002574 
+0.002134 -0.002124 -0.004273 0.000497 0.000076 -0.000933 
+-0.004067 0.000252 0.002034 0.000892 -0.002395 0.006855 
+-0.003513 -0.002661 0.004684 0.001080 -0.002394 -0.000027 
+0.003062 0.000517 -0.000544 0.000480 0.002904 -0.000970 
+0.000000 0.001575 -0.004567 0.003333 0.000952 0.000000 
+0.002998 0.001102 0.000428 -0.000105 0.000210 0.000210 
+-0.000854 0.000906 0.000011 -0.000112 0.000585 0.000060 
+-0.000667 -0.000625 0.000156 -0.002083 -0.000718 -0.000660 
+-0.002210 0.000728 -0.001075 -0.001975 -0.000054 -0.001736 
+0.001865 -0.001176 0.000175 0.011322 0.005914 0.004620 
+0.011895 0.010143 -0.002278 0.000060 0.000702 -0.000070 
+-0.002427 -0.005152 0.002485 -0.000445 -0.004374 0.000710 
+0.002199 -0.000452 -0.001431 0.004136 0.002153 0.000394 
+0.001248 0.000070 0.002323 -0.002278 -0.002109 -0.000161 
+-0.001550 -0.000655 -0.001290 -0.001087 0.002065 0.000753 
+-0.002323 -0.000435 0.000895 0.000034 0.001150 -0.000009 
+-0.000576 -0.000773 -0.000752 0.000089 -0.003417 -0.001289 
+0.002475 -0.004536 -0.002119 0.002199 -0.002882 -0.002745 
+0.001520 -0.001418 -0.002242 0.002296 -0.000621 -0.001987 
+0.001715 0.000318 -0.000402 -0.001232 0.001642 0.000071 
+-0.001274 0.000371 -0.001020 0.000692 -0.001251 0.001933 
+0.001668 -0.000949 0.005172 -0.000380 0.000588 0.003422 
+-0.000476 0.001680 -0.000676 -0.001139 0.000915 -0.002876 
+0.000636 -0.001044 -0.001765 0.001514 -0.001969 -0.000303 
+-0.000938 -0.001047 -0.001255 -0.003576 0.001150 -0.001710 
+-0.000710 -0.001186 -0.000596 -0.005250 -0.000768 -0.002561 
+-0.000697 0.000620 -0.003607 -0.000250 -0.000702 -0.005059 
+-0.001963 0.002552 -0.001668 0.001183 0.001679 -0.004542 
+0.000154 0.000846 0.000846 -0.001183 -0.002748 0.001183 
+-0.002019 -0.001941 -0.003260 0.001640 -0.001862 -0.002934 
+0.001747 -0.000349 -0.006718 -0.000604 0.003022 -0.006692 
+-0.000852 0.001860 -0.000396 0.000308 -0.000225 -0.000110 
+-0.001333 -0.000737 0.000284 -0.000753 -0.000679 0.002524 
+-0.000590 -0.002332 0.001559 0.000021 0.000270 0.001265 
+0.000549 -0.002093 -0.001332 0.000421 -0.002540 -0.000281 
+0.006554 0.002302 -0.003964 0.007416 0.003598 -0.005002 
+0.005966 0.001334 -0.004160 -0.000387 0.001161 -0.002823 
+0.001261 0.000892 -0.000278 0.003419 0.000083 0.002262 
+0.002343 -0.003734 0.001948 -0.001130 -0.000323 0.001061 
+-0.002679 0.000937 0.002454 -0.002237 0.000154 0.005867 
+-0.002302 -0.003044 0.005413 -0.000622 -0.003832 0.003376 
+-0.001254 -0.002716 0.002090 -0.003820 -0.001655 -0.000810 
+-0.003570 0.001154 -0.001478 0.000789 0.003047 0.000072 
+0.002574 0.002189 0.002017 0.003078 0.000209 0.002260 
+-0.000567 -0.000790 -0.000774 -0.005126 -0.003765 -0.001276 
+-0.005138 -0.002759 -0.001338 -0.002754 0.001048 -0.000754 
+-0.000396 0.003070 0.002251 0.000709 0.002994 0.003466 
+0.000464 0.000507 0.000503 0.002508 -0.000317 -0.001194 
+0.004445 0.000621 -0.002002 0.003273 0.000757 -0.001411 
+0.001797 0.000221 -0.001325 0.001612 -0.001434 -0.001811 
+0.000267 -0.003282 -0.001449 -0.001138 -0.002490 -0.001368 
+-0.001262 0.000088 -0.000163 -0.001605 0.001320 0.002209 
+0.000222 0.000786 0.001834 0.001539 0.000931 0.000407 
+0.002401 0.000656 0.000929 0.002941 0.000416 0.002089 
+0.003052 0.000392 0.003307 0.003244 0.000855 0.003872 
+0.006452 0.001409 0.004631 0.009747 0.005408 0.001106 
+0.005354 0.005295 -0.000043 0.002274 0.001791 -0.000557 
+-0.000256 -0.001110 -0.000486 -0.003522 -0.001852 -0.000678 
+-0.003621 0.000089 -0.001872 -0.001397 0.002290 -0.000352 
+-0.000489 0.004466 0.001757 0.001367 0.003514 0.004716 
+0.000776 0.004429 0.003777 0.000655 0.004135 0.002847 
+0.000597 0.001252 -0.000021 0.000307 -0.000595 0.000351 
+-0.002167 -0.000860 0.001147 0.001681 -0.005346 -0.002754 
+-0.001536 -0.000633 0.001555 -0.004564 -0.001998 -0.000950 
+-0.003760 -0.001200 0.002560 -0.000651 -0.000642 -0.001369 
+0.000637 0.000501 -0.001454 -0.000155 0.002467 -0.001389 
+0.001516 0.002682 -0.003847 0.002786 0.004487 -0.007736 
+0.004953 0.005380 -0.007714 0.004759 0.002891 -0.002482 
+0.001409 0.001834 0.000797 0.000210 0.001588 -0.002218 
+0.004693 0.003522 -0.004695 0.004330 0.001865 -0.003274 
+0.001977 -0.003031 -0.003426 0.000685 -0.003102 -0.001378 
+0.004409 0.002274 -0.002514 0.005940 -0.000088 -0.000354 
+-0.000048 0.002477 0.001430 -0.000813 -0.003107 0.005733 
+0.004433 -0.000248 -0.002837 0.004090 0.003615 -0.003943 
+0.003807 0.004456 -0.002913 0.001973 0.003134 -0.000967 
+0.000025 0.001488 -0.000074 0.000911 0.000647 -0.000528 
+0.001136 0.002821 -0.001171 0.004056 -0.001297 0.003247 
+0.005606 -0.000074 0.003215 0.003404 -0.002270 0.001128 
+0.001273 -0.002334 -0.003529 0.000197 -0.001380 -0.004859 
+-0.000199 -0.001534 -0.002032 0.000385 -0.001182 0.000377 
+0.000171 -0.000192 0.000252 0.000537 0.000773 -0.000021 
+0.001571 0.002618 0.002033 0.001103 0.003310 0.003190 
+0.001296 0.003241 0.001574 -0.002348 0.003973 -0.003249 
+-0.005010 0.001197 -0.004147 -0.003639 0.002232 -0.000964 
+-0.000361 0.000963 0.003626 -0.000777 0.002424 0.003129 
+-0.001576 0.001643 0.002724 -0.001912 -0.000527 0.002746 
+0.001047 0.002928 0.000519 0.004256 0.006277 -0.000362 
+0.001044 0.004503 0.000363 -0.000021 0.000714 0.000279 
+0.002033 -0.000758 -0.000576 0.004840 0.000596 0.000593 
+0.007187 0.003323 0.001995 0.006062 0.003142 0.001924 
+0.002775 0.000891 0.000704 0.002423 -0.002264 -0.002072 
+0.003390 -0.004020 -0.002548 0.001709 -0.001996 -0.000742 
+-0.000653 0.001212 0.000052 0.001170 -0.001713 0.002117 
+-0.002946 -0.005745 0.003912 -0.002664 0.000765 -0.001484 
+0.002378 0.000575 -0.002229 0.000515 -0.000970 -0.000760 
+0.001621 -0.000343 -0.000733 0.005312 -0.000096 0.000008 
+0.004459 -0.000728 0.001331 -0.000325 0.001020 0.000138 
+-0.005501 0.000593 0.000261 -0.002526 0.002343 0.002266 
+0.001527 0.000129 0.003376 0.002768 -0.000541 0.003465 
+0.001885 -0.000184 0.000115 0.002250 0.001425 0.000475 
+0.000070 -0.001678 -0.001328 -0.000972 -0.001801 -0.002414 
+0.000028 -0.001931 -0.002547 -0.001698 0.001276 -0.000918 
+-0.001540 0.002063 -0.000678 -0.001983 -0.001517 0.000777 
+-0.002454 -0.003262 0.001324 -0.001039 -0.002021 0.001240 
+0.001712 0.000696 -0.001911 0.005021 0.002669 0.000922 
+0.002100 -0.001644 0.000626 0.001402 -0.000830 0.000627 
+-0.002317 -0.003030 0.000579 -0.001061 0.000227 0.000227 
+0.000000 0.000000 0.000000 -0.000797 0.000319 -0.001061 
+0.000379 0.001231 -0.000568 0.001783 0.000000 -0.002868 
+0.002757 0.005656 -0.006575 0.002389 0.005344 -0.000683 
+-0.003182 -0.001667 -0.001667 -0.001295 -0.000816 0.000563 
+-0.000714 -0.005227 -0.001307 0.001650 -0.005702 -0.000150 
+0.000093 -0.003684 -0.000653 0.000000 -0.001731 0.001731 
+0.001628 -0.000349 0.001202 0.001705 -0.000824 0.000767 
+0.002762 0.001794 0.000020 0.000300 0.000308 0.000133 
+-0.000634 -0.001332 -0.000913 0.001617 -0.001617 -0.001203 
+0.004689 -0.000274 -0.005236 0.005837 -0.002218 -0.003852 
+0.003170 -0.000597 0.001678 -0.000225 0.001904 0.003220 
+-0.000559 -0.003545 0.005224 -0.000702 -0.001112 -0.002205 
+-0.000086 -0.001155 -0.002417 -0.000051 -0.000044 0.000008 
+-0.002456 -0.001264 0.002730 -0.006221 -0.000253 0.003698 
+-0.006036 0.000968 0.003271 -0.004919 0.002852 0.002358 
+-0.003782 0.002636 0.000584 -0.003065 0.000479 0.000210 
+-0.005573 -0.000999 0.002386 -0.008174 -0.003440 0.004985 
+-0.010345 -0.003257 0.007111 -0.003229 -0.009680 0.008778 
+0.001466 -0.007171 -0.000343 0.006394 -0.002657 -0.001766 
+0.005627 -0.000155 0.000106 0.001388 0.001284 0.000423 
+-0.002310 0.002275 0.000480 -0.002778 0.001930 0.000684 
+-0.002908 -0.001607 -0.000371 -0.003553 -0.004847 -0.000475 
+-0.003251 -0.004247 -0.000134 -0.003431 -0.002677 -0.000365 
+-0.003844 -0.002339 -0.000860 -0.003734 -0.010031 0.004052 
+-0.008253 -0.001983 0.010666 -0.004821 -0.000811 0.001156 
+-0.000634 0.003884 -0.007898 0.000312 0.003284 0.000241 
+0.001367 0.001416 0.000688 0.001673 0.004336 0.002278 
+0.002151 0.005457 0.000846 0.000030 0.001065 -0.003991 
+0.001755 -0.002087 -0.004170 0.002583 -0.002606 -0.003204 
+0.002466 -0.001515 -0.000565 0.001005 -0.000147 0.000199 
+0.001469 -0.002305 -0.000260 0.000219 -0.002398 0.004431 
+-0.001815 0.000272 0.000091 0.000279 -0.001150 -0.000636 
+-0.000546 0.000957 0.000331 -0.002147 -0.000870 0.000068 
+-0.001330 -0.001307 -0.002625 0.000835 -0.000959 -0.001270 
+0.001185 -0.002940 0.002393 -0.001350 -0.001474 0.002084 
+0.001704 -0.000753 -0.001614 -0.000438 -0.001562 -0.003230 
+-0.002203 -0.001232 -0.002165 -0.000858 -0.000300 0.000901 
+-0.001537 -0.000361 0.002848 -0.001460 -0.002628 0.003066 
+-0.000175 0.001885 0.002892 -0.002585 0.001061 0.001335 
+0.003753 0.003176 -0.002745 0.002070 0.004971 -0.002590 
+0.002864 -0.000522 -0.000455 0.000743 -0.005227 -0.000715 
+0.002564 -0.003293 -0.000542 0.004029 0.000897 -0.000445 
+0.000606 0.000852 0.000268 0.003080 -0.000502 0.001581 
+0.003056 -0.000859 0.003283 0.002070 -0.000684 0.002994 
+0.000960 -0.001030 0.001405 -0.003950 -0.001261 0.002521 
+-0.000108 0.001561 0.002277 0.001378 0.002042 0.003769 
+0.002728 0.001423 0.001990 0.001326 -0.001080 0.000082 
+0.001476 -0.002123 -0.001385 0.004952 0.006034 -0.003288 
+0.003749 0.011405 -0.002210 0.007368 0.010111 -0.006427 
+0.002780 -0.001642 -0.005186 0.002944 -0.002453 -0.000809 
+-0.000315 -0.003113 -0.000513 0.000607 0.000059 -0.000614 
+-0.000149 0.002226 0.000306 -0.001085 0.002479 0.001374 
+-0.001633 0.001632 0.004695 -0.001349 0.000923 0.005252 
+-0.002956 0.000351 0.003772 -0.003377 -0.002003 0.002312 
+0.000135 -0.002875 0.002958 -0.001531 0.002041 0.003571 
+0.000798 -0.001415 0.004834 0.002325 -0.004860 0.003686 
+0.004548 -0.003797 -0.000133 0.004444 0.002254 -0.001715 
+0.002743 0.004982 -0.002121 0.000942 0.001543 -0.000498 
+-0.000735 -0.004309 0.001170 -0.000405 -0.003058 0.000634 
+0.002139 0.003363 -0.001445 0.003134 0.006632 -0.003717 
+0.002406 0.004952 -0.002141 0.001103 0.001246 -0.000103 
+0.000935 0.000283 0.000088 -0.000578 0.000526 0.000402 
+0.001362 0.000326 0.002560 -0.002175 -0.000576 0.001897 
+-0.004251 -0.003591 -0.001972 -0.005324 -0.000857 -0.006890 
+-0.005837 0.007708 -0.008563 -0.004576 0.009524 -0.007748 
+-0.003268 0.005267 -0.003506 -0.001449 0.000490 -0.002275 
+-0.000919 -0.001805 -0.002763 -0.001043 -0.001237 -0.001820 
+-0.001194 0.000063 0.000214 0.000204 0.001438 0.001498 
+0.001298 0.002400 -0.000108 0.003281 0.001640 0.000352 
+0.003735 0.003460 -0.000416 -0.000877 0.002101 0.000174 
+-0.000918 0.004031 -0.001956 -0.003413 -0.000698 -0.001397 
+-0.005303 -0.000079 -0.001326 -0.004346 0.002126 -0.000869 
+-0.000866 0.003044 -0.000609 0.000535 -0.001071 -0.000866 
+0.002163 -0.004973 0.000032 -0.001236 -0.004279 -0.002039 
+-0.003735 -0.002461 0.004814 -0.000495 0.001555 0.004712 
+-0.000386 0.002778 0.003164 0.001184 0.001033 0.002126 
+0.001105 -0.000466 0.001634 0.000523 0.000303 0.001350 
+0.002209 0.000790 0.000486 0.001731 0.001154 0.000000 
+-0.001890 -0.001071 0.000854 -0.005483 -0.000490 -0.001587 
+-0.000157 -0.003307 -0.002520 0.000951 -0.000501 -0.001350 
+0.003893 0.001667 0.002668 0.004973 0.000979 0.004218 
+0.005112 0.000465 0.003021 0.003263 0.000441 0.000944 
+-0.000438 -0.000112 0.000417 -0.001968 0.000870 0.000366 
+-0.001482 0.001160 0.000892 0.000884 0.003544 0.001949 
+0.000700 0.003460 0.001533 -0.002273 0.001608 0.000444 
+-0.002530 0.001324 -0.001443 -0.001135 -0.002230 -0.001010 
+0.001151 -0.002925 0.000066 0.004701 -0.001567 -0.006866 
+0.000944 -0.002984 -0.002198 0.001941 -0.000096 -0.000818 
+-0.000750 -0.001889 0.001927 -0.001431 -0.001587 0.001717 
+-0.000012 -0.001815 0.001461 0.000794 0.000710 0.003544 
+0.002139 0.000474 0.005056 0.003790 -0.002125 0.006409 
+0.002327 -0.002513 0.005518 0.000876 -0.000915 0.000284 
+-0.001310 0.002518 0.001513 0.000017 0.001304 0.001280 
+0.000899 0.002561 0.000960 0.006419 0.004232 -0.003603 
+0.006069 0.001803 -0.003426 0.003595 0.000485 -0.001675 
+0.003518 0.000969 -0.001502 0.005257 0.002508 -0.001439 
+0.004824 0.002010 0.000089 0.001705 -0.001383 0.000937 
+-0.001721 -0.001287 0.001516 -0.001799 0.000565 0.000655 
+-0.002238 0.001136 -0.001129 -0.001810 0.001458 -0.002064 
+-0.001580 0.001471 -0.001197 0.000862 -0.001093 -0.002012 
+-0.000715 -0.004276 0.002433 -0.002263 -0.007204 0.002275 
+-0.006301 -0.003785 0.003485 -0.006191 -0.001111 0.003573 
+-0.007687 0.001370 0.003203 -0.006170 0.002912 0.003072 
+-0.003306 0.001228 -0.000167 -0.004339 0.000713 -0.002560 
+-0.005360 0.004967 -0.006471 -0.004743 0.002887 -0.003701 
+-0.004299 0.000014 0.000295 -0.003751 -0.002084 0.002454 
+-0.001442 -0.001865 -0.000592 -0.000771 -0.001685 -0.002491 
+-0.001247 -0.000442 -0.003639 -0.001685 0.000674 -0.002584 
+-0.002722 -0.001118 -0.000688 -0.001505 0.000430 -0.000430 
+-0.000407 0.001260 -0.001260 -0.000105 0.004988 0.001062 
+-0.001436 0.000611 -0.000963 0.001347 -0.000924 -0.000133 
+-0.004072 -0.008617 0.006222 -0.003029 -0.010422 0.006787 
+-0.004603 0.001349 0.005952 0.003984 0.004025 0.000955 
+0.001919 0.004570 0.004418 0.000142 0.000033 0.000024 
+0.000888 -0.003965 0.001658 -0.000720 -0.001985 0.003440 
+-0.002551 0.000039 0.000338 -0.000687 -0.004867 0.000011 
+-0.005626 -0.004074 0.000233 0.000164 -0.000840 -0.001537 
+0.003528 0.002792 -0.005144 0.004516 0.004775 0.001257 
+0.000819 -0.000801 -0.000497 0.001358 -0.000555 0.000396 
+0.002430 0.000600 0.000218 0.000814 0.000723 -0.001522 
+-0.000211 0.000353 -0.000011 0.001567 0.000895 0.003197 
+0.002180 0.003884 0.001165 0.000088 0.000695 -0.000424 
+-0.001475 -0.000651 -0.000838 -0.000357 -0.001026 -0.002224 
+0.000084 -0.002251 -0.001576 -0.001763 -0.003284 -0.000615 
+-0.000705 0.000414 -0.000081 -0.000410 -0.000609 -0.001901 
+0.003681 0.003358 -0.000614 0.004012 0.004577 -0.001875 
+0.003925 0.003572 0.000135 0.003279 0.002139 -0.001699 
+0.001109 -0.002503 -0.001320 0.003911 -0.004465 0.000345 
+0.005424 -0.003859 0.000891 0.006594 -0.002409 -0.001343 
+0.007545 0.000804 -0.008860 0.006616 0.001751 -0.011587 
+0.003686 0.001074 -0.008130 -0.000378 0.000003 -0.004619 
+-0.004648 0.002441 -0.002960 -0.002530 0.005450 -0.001472 
+-0.000952 0.003447 -0.000986 -0.000252 -0.000513 0.000564 
+-0.000283 -0.001397 0.002591 -0.001806 -0.002310 0.002774 
+0.000370 -0.001450 0.003784 0.001840 -0.001998 0.002271 
+0.001744 -0.002713 0.001699 0.001510 -0.001606 0.000048 
+-0.001488 0.001251 -0.001958 -0.004928 0.004813 -0.006156 
+-0.006935 0.004744 -0.007665 0.003408 0.001270 -0.001843 
+-0.000781 -0.003585 0.000280 0.002276 -0.001419 0.000349 
+0.009484 0.002098 0.003076 0.017733 0.002616 0.007451 
+0.022605 0.003008 0.008982 0.019663 0.007173 0.006250 
+0.009556 0.006967 0.002890 0.001847 0.000578 -0.002113 
+-0.001519 0.002335 -0.006555 -0.001387 -0.002684 -0.004133 
+-0.003808 -0.001888 -0.001515 -0.002715 0.000622 -0.001187 
+0.000114 -0.001212 -0.000400 -0.001934 -0.000308 -0.001207 
+-0.002199 0.000129 -0.000703 0.001116 0.000084 -0.000799 
+-0.000144 0.002536 -0.002489 -0.000276 -0.000451 -0.000372 
+-0.002303 -0.000891 0.001513 -0.001968 -0.000130 0.003693 
+-0.003700 -0.001465 0.004286 -0.000866 -0.005373 -0.001083 
+0.000000 -0.006977 0.005349 -0.008291 -0.003927 0.005149 
+-0.005784 0.002280 0.001119 -0.002342 0.001889 -0.000042 
+-0.000147 -0.000173 -0.001026 0.005862 0.001217 -0.000497 
+0.003182 0.006087 -0.002057 -0.000904 0.004197 -0.000344 
+-0.000037 0.002016 -0.000056 -0.001122 -0.001199 0.000167 
+-0.000167 -0.001417 0.001250 0.003007 -0.002196 -0.002061 
+0.000691 -0.002542 -0.000861 -0.001354 -0.000257 -0.001830 
+-0.001365 -0.000569 -0.002353 -0.000758 0.001695 -0.001375 
+0.000632 -0.000777 -0.000420 0.000339 -0.000583 0.000018 
+0.001511 0.004187 0.000748 0.001163 0.004065 -0.002759 
+-0.000725 0.003267 -0.001744 0.001130 0.001121 0.003220 
+0.004311 -0.000363 0.000982 -0.000792 -0.001970 -0.000616 
+-0.003159 -0.004353 0.002997 0.001408 -0.002922 0.002280 
+0.003107 -0.000739 -0.000219 0.003414 0.001678 -0.002663 
+0.004680 -0.001412 -0.002229 0.002272 -0.002255 -0.000421 
+0.003311 -0.000843 -0.001848 0.000204 -0.000059 -0.004676 
+-0.000690 -0.000905 -0.002372 -0.001361 -0.003478 0.000810 
+-0.002793 -0.001449 0.004288 0.000236 0.000299 0.003980 
+0.001336 0.000964 0.004779 0.002410 0.001733 0.004693 
+0.003112 0.000615 0.002035 0.003313 0.000589 -0.005152 
+0.000113 0.004715 -0.009236 -0.002035 0.005365 -0.003850 
+-0.001635 -0.000864 0.001545 -0.002786 -0.004062 0.000471 
+0.000108 -0.000193 0.000664 -0.000133 -0.003961 -0.001210 
+-0.001185 -0.001654 -0.001412 0.001323 -0.001594 0.001672 
+0.002672 -0.000495 0.000083 0.000166 0.001527 0.000010 
+-0.005195 0.002438 -0.003385 -0.003970 0.002397 -0.006405 
+-0.002489 0.003024 -0.005784 -0.001330 0.000113 0.000600 
+-0.001184 0.000108 -0.000464 0.005722 -0.003213 0.001580 
+0.016449 -0.003002 0.003264 0.030479 0.001796 0.002636 
+4.337209 0.790698 0.616279 4.901841 1.214724 0.613497 
+4.563758 1.342282 0.550336 0.036149 0.014493 0.002146 
+0.019791 0.018141 0.002838 0.004052 0.001699 0.003499 
+-0.003604 -0.004009 -0.004576 -0.000709 -0.006189 -0.005745 
+-0.003277 0.002372 -0.007830 -0.001871 0.005515 -0.003199 
+-0.000900 0.002144 -0.002264 -0.000183 0.000689 0.000905 
+0.000243 -0.002868 0.000320 0.000777 -0.000580 0.000715 
+0.001398 0.001355 -0.001731 0.000573 -0.000018 -0.001182 
+-0.001736 -0.002299 -0.001854 0.000232 -0.001041 0.000461 
+-0.005247 -0.000021 -0.003569 -0.007713 0.000059 -0.001511 
+-0.005827 0.001921 -0.000973 -0.000102 0.003218 -0.000894 
+0.004142 0.000044 0.000580 0.002364 -0.000235 0.007180 
+0.003536 0.000415 0.005391 -0.002890 -0.006358 0.002312 
+-0.005345 0.001829 0.000970 -0.001375 -0.000051 -0.002670 
+0.001289 -0.001269 -0.000884 0.000859 -0.000387 0.002089 
+-0.003158 -0.002766 0.001928 -0.004835 -0.002052 -0.003047 
+-0.000589 0.002983 0.001558 0.001873 0.003022 0.003203 
+0.004919 0.000719 0.003671 0.009839 0.005726 0.000000 
+0.006922 0.000067 0.000780 0.005128 0.000349 -0.001089 
+0.003798 0.002768 -0.002152 0.001564 0.001849 -0.000039 
+0.000544 -0.000319 -0.000053 0.001052 -0.004035 0.002360 
+0.003082 -0.003385 0.000296 0.002077 -0.000667 -0.000955 
+0.000002 0.000012 -0.000496 -0.001692 -0.001636 -0.000350 
+0.001947 -0.001619 -0.000983 0.001738 -0.002931 -0.001301 
+0.000633 -0.001698 -0.000288 0.000810 -0.000351 0.000732 
+0.003072 -0.001144 0.001967 0.004338 -0.001524 0.002096 
+0.001372 -0.000327 0.000920 -0.002134 0.000792 0.000379 
+-0.001653 0.000615 0.001129 0.001041 0.001118 0.001237 
+0.002745 0.001182 0.000822 0.000979 0.000186 0.000206 
+-0.002815 -0.000538 -0.001710 -0.006055 0.001466 -0.002251 
+-0.006604 -0.000745 0.001020 -0.003966 -0.003449 0.001177 
+-0.000739 -0.003432 -0.001013 0.001042 -0.002593 -0.002389 
+-0.000109 -0.000873 -0.001064 0.004928 0.000206 0.003211 
+0.002727 0.003520 0.000037 0.001178 0.002663 0.000165 
+-0.000761 -0.000067 -0.000737 -0.000109 -0.001591 -0.000402 
+-0.000117 0.001600 -0.000165 -0.005087 0.003610 -0.003236 
+-0.001244 0.005849 0.002699 0.008048 0.004852 0.001490 
+0.017120 0.002151 0.002028 0.028695 0.002700 0.005395 
+3.965909 0.573864 0.556818 4.653465 1.024752 0.599010 
+5.253731 1.537313 0.353234 5.582353 2.029412 -0.182353 
+4.962406 2.203007 -1.030075 0.024562 0.022373 -0.006279 
+0.005697 0.008076 -0.007845 -0.002837 0.000470 -0.006062 
+-0.007895 -0.005085 -0.000526 -0.003092 0.001451 0.002241 
+-0.001824 0.000230 -0.000070 0.002258 0.001534 0.000268 
+-0.000193 -0.000880 0.000997 0.001559 0.000047 0.003638 
+0.000097 0.000290 0.000323 -0.000050 0.001268 -0.003245 
+0.000292 0.000293 -0.002621 -0.001918 -0.001945 0.001134 
+-0.005671 -0.001554 -0.001860 -0.001622 0.000341 -0.002672 
+-0.002143 -0.000611 0.004328 -0.003493 -0.000082 0.002925 
+-0.001729 -0.000354 0.001393 0.001275 0.000629 0.001642 
+-0.000032 0.001692 -0.002461 -0.001111 -0.000636 -0.005303 
+0.002066 -0.000137 -0.005796 0.000020 0.000078 -0.000065 
+0.000732 -0.004229 0.001205 0.000278 -0.004523 -0.000284 
+-0.002598 -0.003325 -0.000145 -0.003130 -0.002718 0.001359 
+0.002297 0.001484 0.003915 0.001838 0.001750 0.003762 
+0.001021 0.003081 0.002392 0.002832 0.004498 0.000542 
+0.002395 0.004185 0.001804 0.002959 0.000046 0.001827 
+0.000331 -0.003339 0.002496 -0.002721 -0.005476 0.000794 
+-0.004508 -0.004895 0.001091 -0.003918 -0.003872 0.002374 
+-0.003636 -0.000973 0.002894 -0.002850 -0.000950 0.003000 
+-0.002420 -0.003876 0.003633 -0.000677 -0.002420 0.004814 
+0.001095 -0.000727 0.001036 -0.000619 0.001023 0.000016 
+-0.000735 0.002552 -0.000841 -0.001203 0.002276 -0.001474 
+-0.002353 0.000611 0.000283 -0.002701 -0.001978 0.001786 
+-0.002436 -0.000455 0.001853 -0.000076 0.001222 -0.000813 
+0.003084 0.002175 -0.003007 0.004287 0.001354 -0.001930 
+0.002419 0.000993 -0.000637 -0.002276 0.000465 -0.002578 
+-0.000299 0.001269 -0.003507 -0.002341 0.000357 -0.005344 
+-0.004977 0.000773 0.001402 0.000268 -0.001416 -0.000459 
+-0.001622 -0.002060 0.000266 0.001298 -0.000204 0.000001 
+0.003199 -0.000551 0.001324 0.003669 0.000504 0.001386 
+0.006994 0.002529 -0.000663 0.008096 0.002807 0.000722 
+0.007287 0.003146 0.002291 0.003504 0.002828 0.000333 
+-0.005475 0.001092 -0.000162 -0.006144 0.002727 0.000687 
+-0.002024 0.001746 -0.000543 0.002972 0.001960 -0.000946 
+0.006212 0.003433 -0.003701 0.008801 0.006833 0.003396 
+0.019355 0.006001 0.005251 0.031259 0.004669 0.005933 
+4.000000 0.886598 0.664948 4.387755 1.494898 0.392857 
+4.224719 1.915730 -0.162921 3.557047 2.000000 -0.731544 
+0.020396 0.018922 -0.006781 0.004790 0.009013 -0.006337 
+-0.001417 0.003307 -0.006142 -0.010979 -0.004312 -0.006553 
+-0.008911 -0.003059 -0.002077 -0.004231 -0.001931 -0.000344 
+-0.001381 -0.004101 0.001094 -0.000764 -0.005208 0.002010 
+0.000133 -0.000717 -0.000279 0.003290 0.000572 0.000270 
+-0.001099 -0.000622 -0.002916 -0.001455 -0.000945 0.000146 
+-0.003536 -0.001148 -0.000628 0.000604 0.001370 0.000619 
+-0.002122 0.004092 -0.000189 -0.002295 0.000604 -0.000047 
+-0.002094 -0.001637 -0.000075 -0.000230 -0.001053 0.000165 
+0.000054 0.000942 0.001812 0.001089 0.001737 0.000957 
+0.001184 0.001208 0.000048 0.002616 -0.000895 0.000509 
+0.001324 -0.000735 0.000735 0.000399 -0.000233 0.000119 
+-0.000599 -0.000758 0.000120 -0.001053 -0.001831 0.000282 
+0.002791 -0.000136 -0.000589 0.005164 0.001003 0.000025 
+0.004815 0.000788 0.001044 0.003753 0.001782 0.001475 
+0.003228 0.006058 -0.001515 0.001569 0.002609 -0.004169 
+-0.001382 -0.001371 -0.002211 -0.000374 -0.000874 -0.002588 
+0.000132 0.000463 -0.002216 0.001820 0.002690 0.000040 
+-0.000134 -0.000782 0.002037 -0.002692 -0.002852 0.002170 
+-0.004326 -0.001379 0.001128 -0.003663 -0.000185 0.000582 
+-0.000380 -0.001791 0.000822 0.003071 -0.001568 0.000476 
+0.003435 0.000543 -0.002428 -0.000399 0.001291 0.000446 
+-0.001629 0.001481 -0.004532 -0.000055 0.000291 -0.002542 
+0.000693 -0.001461 -0.000794 -0.003051 -0.001737 0.001742 
+-0.004842 0.001921 0.003339 0.001010 0.000362 0.002956 
+-0.001275 0.001211 -0.000363 0.001366 0.000033 -0.000568 
+0.003150 -0.000095 -0.002111 0.003885 0.002289 -0.003584 
+0.003911 0.003272 -0.002783 0.000905 0.001644 0.000050 
+-0.001221 0.001233 0.000248 -0.000005 0.002299 0.000720 
+0.003938 0.004033 0.001276 0.009054 0.005752 0.000296 
+0.008664 0.003536 -0.000008 0.002687 -0.000325 -0.000120 
+-0.001780 -0.002196 -0.000348 -0.001465 -0.000668 0.000529 
+0.000861 0.002031 -0.001803 0.000425 0.003526 -0.001595 
+-0.002218 0.003082 -0.001055 -0.003788 0.002559 -0.001861 
+-0.001353 0.003308 -0.004511 0.000381 0.007515 -0.002008 
+0.002406 -0.002786 -0.005372 0.008121 0.001070 0.000904 
+0.018218 0.002716 0.006875 0.028459 0.009537 0.005059 
+3.229050 1.474860 -0.027933 3.028409 1.744318 -0.403409 
+0.024124 0.017089 -0.007341 0.016220 0.013026 -0.007929 
+0.008731 0.005310 -0.007111 0.003250 0.001677 -0.004298 
+-0.000540 0.004887 -0.002629 -0.005410 0.004442 -0.002369 
+-0.002486 0.002480 -0.001152 0.000644 -0.000378 0.000128 
+0.001686 -0.000051 0.000801 -0.000511 0.000100 0.001574 
+-0.002053 0.000442 -0.000300 -0.003211 -0.001037 0.000402 
+-0.004686 -0.006146 0.003188 -0.005504 -0.007783 0.005448 
+-0.004237 -0.004237 0.003359 -0.003502 0.001718 -0.001365 
+-0.002506 0.001579 -0.003744 0.000624 -0.000770 -0.000553 
+0.004141 0.000004 -0.001694 0.004904 0.003310 -0.004003 
+0.006759 0.005963 -0.004075 0.005064 0.001948 0.003283 
+0.002173 0.000885 0.002185 -0.001037 0.000926 0.001881 
+-0.000462 0.000039 -0.001197 -0.001153 0.002790 -0.002098 
+0.001928 0.000000 0.000482 0.002911 0.001849 0.001633 
+0.002229 0.004375 0.000562 -0.000007 0.004597 0.000001 
+0.001330 0.002012 -0.000324 0.000110 0.001227 -0.000623 
+0.000054 0.002906 0.000412 0.002369 0.001670 0.002478 
+-0.001820 0.000971 -0.003273 -0.001779 -0.000466 -0.004829 
+-0.001048 -0.001848 -0.001208 0.000761 -0.001522 -0.000448 
+0.001061 0.000641 0.000128 -0.000143 0.001092 -0.000184 
+-0.002004 -0.000292 0.001336 -0.002754 -0.000359 -0.000205 
+-0.001532 0.000258 -0.000295 -0.000633 0.000898 0.000415 
+0.000346 0.002662 0.001418 -0.000657 -0.000202 -0.000732 
+-0.002174 -0.001497 -0.001224 -0.002537 -0.001809 0.003166 
+0.001772 -0.000150 0.000310 0.005658 0.001286 -0.001993 
+0.004130 0.003021 -0.000586 0.001522 -0.001522 -0.000217 
+-0.002356 -0.003153 0.000999 -0.003114 -0.002981 0.002451 
+-0.002959 -0.000402 0.001461 -0.000111 0.001793 0.001010 
+-0.001198 0.001839 -0.001851 0.001779 0.004986 -0.002904 
+0.005189 0.006411 -0.000491 0.007788 0.005982 0.001308 
+0.005792 0.006929 0.002667 0.002122 0.007176 0.003114 
+0.006027 0.007318 -0.001096 0.007307 0.008001 -0.006686 
+0.004370 0.003632 0.001526 0.001943 -0.000762 -0.000425 
+0.000165 0.000077 -0.000470 0.000273 -0.000488 0.000307 
+-0.000855 0.000102 0.001140 0.001634 0.001242 0.000708 
+0.002202 0.002938 0.000727 -0.001059 -0.001525 0.000381 
+-0.006968 -0.006259 0.002561 -0.002272 -0.005006 0.004345 
+0.009908 0.002789 0.003864 0.016857 0.010233 0.000562 
+0.016318 0.012826 -0.001968 0.012561 0.011710 -0.004652 
+0.008084 0.009383 -0.005477 0.004108 0.005714 -0.003286 
+0.001756 0.000058 -0.001912 -0.001456 -0.000647 -0.001463 
+0.000603 -0.003852 0.000362 -0.000150 -0.005297 0.003689 
+-0.001444 -0.004081 0.002198 0.000783 -0.002270 -0.000685 
+0.002392 0.001326 -0.000336 0.004904 0.002531 0.000495 
+0.005326 0.002409 0.000712 0.000638 0.000081 0.000163 
+-0.004595 -0.002349 -0.004191 -0.004229 -0.002888 -0.007199 
+-0.000522 -0.004694 -0.003274 0.004542 -0.000526 -0.002812 
+0.002600 0.000192 -0.002642 0.000548 -0.002808 -0.000290 
+-0.001646 -0.006167 -0.000205 -0.002074 -0.005570 0.001585 
+-0.002238 -0.002508 -0.000115 -0.000327 -0.000544 -0.001890 
+-0.002129 -0.000532 -0.002698 0.001303 0.000827 -0.000222 
+0.000768 0.000228 -0.003012 -0.003511 -0.002231 -0.001594 
+-0.001388 -0.002554 -0.001333 0.000079 -0.000709 -0.000394 
+0.001825 0.002063 -0.003968 0.000255 0.002575 -0.000566 
+0.000400 0.002319 0.001988 0.004675 0.002370 0.003170 
+0.008734 0.003058 0.000788 0.005059 0.006061 -0.003532 
+0.000133 -0.000548 -0.002111 -0.001522 -0.002973 0.001855 
+-0.000205 0.001123 -0.000978 0.004728 0.003535 -0.007667 
+0.004579 0.010148 -0.001967 0.001185 0.001424 0.001272 
+0.001159 -0.001090 -0.000711 0.000896 -0.000123 -0.001317 
+-0.000738 0.000984 -0.003852 0.002025 0.002119 -0.003957 
+0.000595 -0.001432 -0.000588 -0.000162 -0.002745 0.005086 
+-0.003034 -0.004383 0.004912 0.000170 -0.002018 0.002387 
+0.000345 -0.000076 0.001838 -0.000993 -0.000461 0.002339 
+-0.000746 -0.003398 0.005947 -0.003660 -0.004659 -0.000938 
+-0.002917 0.001573 0.001097 -0.002847 0.001081 0.003590 
+-0.002063 0.001012 0.000299 0.002655 0.003505 -0.001998 
+0.003630 0.006382 0.000333 0.002018 0.005681 0.000406 
+-0.000046 0.004540 -0.001041 0.001680 0.004372 -0.002127 
+0.001526 0.002950 -0.003314 -0.000179 0.002068 -0.001404 
+0.000312 0.000446 0.000668 -0.001113 -0.000058 0.000611 
+-0.000634 0.000242 -0.001121 0.000460 0.001748 -0.002319 
+0.002451 0.003090 -0.001322 0.000254 0.004762 0.001522 
+0.002700 0.006040 0.002070 0.000361 0.001415 0.001482 
+-0.008118 -0.007406 -0.001546 -0.019164 -0.015261 0.005679 
+-0.012030 -0.018189 0.011319 0.003991 -0.003144 0.005252 
+0.014471 0.010855 -0.002223 0.015357 0.014155 -0.007097 
+0.008161 0.009489 -0.006027 -0.000071 0.002257 -0.000829 
+-0.003182 -0.000745 -0.001016 -0.004579 -0.002089 0.002010 
+-0.006415 -0.003024 0.002873 -0.007956 -0.002116 0.000473 
+0.000237 -0.003600 0.000577 0.002193 0.003060 -0.003019 
+0.006623 0.003480 -0.004799 -0.000319 -0.000798 -0.002980 
+0.000033 -0.000470 0.000339 -0.000196 0.000372 0.001727 
+-0.001004 0.001195 -0.000542 0.001069 0.001524 -0.000288 
+0.000354 -0.000354 -0.003097 0.000736 -0.001277 0.000238 
+-0.001266 -0.001803 0.002109 -0.001313 -0.000574 0.001265 
+-0.000226 0.002042 -0.000178 -0.003765 0.002998 -0.003837 
+0.003620 0.003642 0.000536 0.003768 0.007060 -0.001348 
+0.000419 0.004567 -0.002500 -0.000068 -0.000350 -0.000978 
+-0.003586 0.002860 0.001426 -0.000280 0.000440 0.001120 
+0.002490 -0.001487 -0.000037 0.001967 -0.003991 0.002661 
+0.003026 -0.005137 -0.000199 0.002531 0.001274 0.002699 
+0.001897 0.002945 0.006282 0.003216 -0.000127 0.005033 
+0.005504 0.001394 -0.003136 0.004691 0.005053 -0.005956 
+0.001107 0.005277 -0.006894 0.000577 0.006256 -0.006187 
+0.001157 0.005414 -0.004975 0.001282 0.002549 -0.000799 
+-0.001466 -0.001437 -0.001176 -0.001522 -0.004052 -0.001292 
+-0.002152 -0.002849 -0.000328 0.000333 0.001073 -0.000341 
+0.002126 0.003227 -0.001601 0.000649 0.003077 0.000804 
+-0.000649 -0.000838 0.000407 -0.001735 -0.003015 -0.001066 
+0.001267 -0.000564 -0.002021 0.003172 0.000841 -0.002994 
+0.002460 0.001825 -0.002063 -0.000988 -0.000744 0.000129 
+-0.002552 -0.005704 0.001820 -0.000884 -0.006577 0.001812 
+0.002092 -0.001720 0.002322 0.003750 0.004375 0.001145 
+0.005910 -0.000471 0.001028 0.000092 0.001658 0.000940 
+-0.001083 0.000379 -0.001387 -0.002546 -0.002640 -0.000840 
+-0.006074 -0.003034 0.005158 -0.007007 -0.001600 0.009960 
+-0.006657 0.000220 0.006449 -0.003591 0.002876 0.000142 
+-0.000356 0.001650 -0.002737 -0.001019 -0.001319 -0.001679 
+-0.001298 -0.000144 -0.000719 -0.001536 -0.002608 -0.000364 
+0.000233 -0.000036 -0.000815 0.000282 0.000683 -0.001934 
+-0.000926 0.003563 -0.002880 -0.000768 0.006505 -0.000686 
+0.000269 0.000444 -0.000744 -0.006284 -0.004021 0.001916 
+-0.006093 -0.007058 0.006331 -0.000235 -0.003025 0.004954 
+0.003497 0.003086 -0.001404 0.003233 0.007858 -0.003752 
+0.001677 0.006844 -0.001881 -0.000992 0.001218 0.000049 
+-0.000170 -0.000292 -0.004102 0.002791 0.000840 -0.004402 
+0.001078 0.002041 -0.002324 -0.001579 -0.000808 -0.001725 
+-0.000901 -0.000635 0.000013 0.002038 0.001755 -0.000626 
+0.002248 0.001148 0.001476 0.000179 0.001709 0.002239 
+-0.000744 0.002790 0.001966 -0.001154 -0.000619 0.003913 
+-0.001038 -0.000584 0.000129 -0.000184 -0.000982 -0.002700 
+0.000811 0.000074 -0.001681 0.002539 -0.001082 0.000142 
+0.002232 -0.002070 -0.002052 0.001166 -0.002975 -0.003107 
+-0.002412 -0.003161 -0.001475 -0.003990 0.000804 0.001623 
+-0.003102 0.000146 0.003102 -0.000714 -0.000911 0.000308 
+0.000225 -0.003476 -0.001750 -0.001326 -0.002346 -0.002244 
+0.000163 -0.002103 -0.000953 -0.001694 -0.003083 -0.000220 
+-0.003845 -0.002521 0.004600 -0.002795 -0.001715 0.005558 
+0.002558 -0.000991 0.003770 0.004228 0.001418 0.003523 
+0.005744 -0.001017 0.000060 0.003706 0.001235 -0.001029 
+0.001709 0.000533 0.001873 0.002655 -0.001281 0.000984 
+0.000205 0.001665 0.000361 0.001099 0.001904 -0.000237 
+0.002449 -0.001069 -0.002600 0.002059 0.001070 -0.004239 
+0.002891 -0.002802 -0.002581 0.001080 -0.004299 -0.000381 
+0.000762 -0.002277 0.000338 0.002924 0.000522 -0.001820 
+0.002530 0.002141 0.002102 0.002441 -0.000892 -0.000155 
+-0.004347 -0.003185 0.003604 -0.005348 -0.003744 0.006615 
+-0.002227 -0.001558 0.004747 0.000669 -0.000312 0.001467 
+0.000552 -0.000448 0.000035 0.001434 0.000021 -0.000268 
+0.003886 -0.000143 -0.001648 0.004982 -0.000123 -0.001869 
+0.000946 0.001023 -0.001126 0.000936 0.001064 -0.001546 
+0.005461 0.002722 -0.003980 0.009683 0.003213 -0.000644 
+0.004412 0.003494 0.000313 -0.001886 -0.001875 0.000401 
+-0.007006 -0.001522 0.002439 0.000359 0.000005 0.001078 
+0.000340 0.003072 0.000782 0.001474 0.003975 0.000187 
+-0.000144 0.003022 -0.001079 -0.000515 0.000110 -0.001140 
+-0.001131 -0.001765 -0.000995 0.001629 -0.001629 -0.001667 
+-0.000130 0.000232 -0.001363 0.001463 0.000400 -0.001687 
+0.005734 0.001703 -0.002397 0.006183 0.003359 -0.000534 
+0.000405 -0.000181 0.001756 -0.006288 -0.004267 0.002358 
+-0.007219 -0.003562 0.001593 -0.001472 0.002022 -0.001366 
+0.004898 0.006965 -0.003069 0.005669 0.005804 -0.001732 
+0.000620 -0.000176 -0.000012 -0.003607 -0.000050 -0.001256 
+-0.004395 -0.000056 0.005386 -0.004162 0.001079 0.001626 
+-0.000441 0.000683 0.001196 0.002426 -0.000673 -0.001571 
+0.003603 0.001548 -0.006194 0.003355 0.000578 -0.000155 
+-0.000831 0.003791 -0.000848 -0.002067 0.000754 0.000400 
+0.000028 0.000741 -0.001514 0.002052 -0.000703 -0.004264 
+-0.000038 -0.001402 -0.001515 0.004246 -0.000888 -0.001805 
+0.001004 -0.000626 -0.000393 0.000653 -0.000263 -0.000403 
+-0.000079 -0.000635 0.000625 0.003576 -0.000210 0.002795 
+0.000197 0.002483 0.004742 0.000416 0.001047 0.003796 
+-0.001360 -0.001055 -0.000632 -0.000876 -0.000275 -0.003918 
+-0.003581 -0.004907 -0.003604 -0.003090 -0.002783 -0.002107 
+-0.002632 -0.001521 0.001214 -0.002980 -0.002279 0.006960 
+-0.002233 0.001038 0.003856 -0.002153 0.001039 -0.002161 
+-0.000514 0.001118 -0.002933 0.000223 -0.000044 0.000879 
+0.000937 0.001477 0.000755 0.006434 0.000658 -0.000110 
+0.001415 0.003568 -0.001721 0.000831 0.000099 -0.001325 
+-0.002560 -0.002038 0.001698 -0.002016 -0.001860 0.002636 
+-0.000482 0.000325 0.001161 0.002482 0.000584 0.002117 
+-0.000197 0.002870 0.002280 0.002534 0.005746 0.000464 
+-0.000916 0.000916 0.000076 0.003844 0.001626 0.001101 
+0.003358 -0.002019 0.000721 0.001328 -0.001713 0.001144 
+-0.001214 0.000088 -0.000400 -0.002524 -0.000587 -0.000231 
+-0.000308 -0.001471 0.000123 0.002547 -0.000128 0.001095 
+0.001058 0.000703 0.001587 0.000890 -0.000254 0.000366 
+-0.001257 -0.001732 -0.001145 0.000183 -0.004101 -0.000836 
+0.003597 -0.002416 -0.000940 0.000444 0.000675 0.000783 
+0.002528 0.004696 -0.005852 0.002658 0.000120 -0.001295 
+0.001477 0.000336 0.000281 0.001641 0.000505 0.001240 
+0.000457 -0.000503 0.002581 0.001442 -0.001767 0.000535 
+0.000876 0.001459 0.000233 0.003560 0.002456 -0.001513 
+0.002704 0.001257 0.000732 -0.000884 0.000616 -0.000576 
+-0.000286 0.001350 -0.003967 0.001288 0.003450 -0.002957 
+0.000574 0.001613 -0.001470 -0.000347 0.000150 -0.000231 
+-0.000513 0.000104 -0.000376 0.000413 0.003204 -0.001189 
+0.000193 0.003401 -0.000658 0.000246 -0.000663 0.000472 
+-0.000647 -0.003597 0.004245 -0.002782 -0.005617 0.003068 
+0.000166 -0.001679 0.001830 -0.000772 0.003565 -0.000832 
+-0.000798 0.006188 -0.000494 -0.003935 0.002025 -0.002338 
+0.001927 -0.000642 -0.009489 -0.001320 -0.000508 -0.002159 
+-0.000300 -0.000278 -0.000843 -0.001469 -0.001242 -0.000449 
+0.001095 -0.001241 -0.001241 0.000302 0.000390 0.000639 
+-0.001146 0.002195 0.000367 -0.001184 0.001203 -0.001686 
+0.000991 0.000059 -0.001809 -0.001271 -0.004768 -0.000459 
+0.001209 -0.004028 -0.000695 0.001226 -0.001346 0.000547 
+0.001005 -0.000392 0.000613 0.001493 -0.000713 0.001123 
+0.000965 -0.000330 0.000813 -0.001827 0.000527 -0.000258 
+-0.001183 0.002272 0.000094 0.000629 -0.000306 -0.000414 
+0.003801 -0.002138 -0.002394 0.004222 -0.003518 -0.002727 
+0.002806 -0.001697 0.000141 -0.000375 0.000010 -0.000144 
+0.001752 -0.001154 0.000909 0.003115 -0.003035 0.002226 
+0.002933 -0.003244 0.002970 0.001357 -0.000083 -0.000602 
+0.001926 0.002026 -0.006482 0.005368 0.004100 -0.007088 
+0.004703 0.005315 -0.003565 0.003519 0.003717 -0.000884 
+0.001535 0.001914 -0.001915 0.000117 0.001684 -0.000543 
+-0.000167 -0.000833 0.001654 -0.002683 -0.002645 0.002169 
+-0.002050 -0.000665 0.001966 0.002476 0.001700 0.002253 
+0.004866 0.002311 0.002822 0.004127 0.003352 0.000811 
+0.000945 0.003383 -0.001219 -0.002026 0.001433 -0.001252 
+-0.000802 -0.001794 -0.001298 0.000807 -0.001385 -0.000894 
+0.002344 0.000311 -0.000646 0.004483 0.000445 -0.000259 
+0.001799 -0.000526 -0.003819 0.004927 0.001784 0.000061 
+-0.000694 0.000570 -0.000251 -0.002205 0.000806 -0.003150 
+-0.001597 0.000684 -0.000202 0.000941 -0.001446 -0.000529 
+0.001210 -0.001181 -0.001013 0.000578 0.000949 0.000771 
+0.000395 0.002495 -0.002958 -0.002539 -0.000433 -0.002461 
+-0.002371 -0.001496 -0.000520 -0.002044 -0.001134 -0.000544 
+0.001230 -0.003514 -0.000263 -0.001217 -0.001526 0.002453 
+0.000437 0.000714 -0.003294 0.003621 0.003953 -0.002535 
+0.001808 0.001500 -0.000058 0.000854 0.000138 0.000222 
+0.001488 0.000155 0.000812 0.001818 -0.001285 -0.001504 
+0.001501 0.001566 -0.001305 0.000218 -0.000151 0.000715 
+0.000324 0.000510 0.000062 0.003377 0.001894 -0.000260 
+0.005013 0.004060 -0.002089 0.003523 0.003811 -0.003046 
+-0.000218 -0.000631 -0.000364 -0.001508 0.001282 -0.003317 
+-0.000134 0.000762 -0.000205 -0.001624 0.000264 0.000708 
+0.000455 0.000017 0.000524 -0.000022 -0.000456 -0.000514 
+-0.002075 -0.001683 -0.001234 -0.000035 -0.000005 -0.000091 
+-0.002111 0.002918 -0.002028 0.003497 0.005263 0.000353 
+0.006846 0.002742 0.000997 0.001181 0.003077 0.000549 
+0.001132 0.000660 -0.000167 0.000546 -0.000338 -0.000446 
+0.002882 -0.002551 -0.002133 0.003968 -0.004415 -0.003191 
+0.003645 -0.004251 -0.002307 0.008538 0.003638 -0.004480 
+-0.000190 0.002449 -0.006304 -0.002209 0.001671 -0.003257 
+0.001496 0.001375 0.000752 0.001626 0.001083 -0.001301 
+0.003280 -0.002204 -0.001075 0.004538 -0.002146 0.001102 
+0.001438 -0.002891 0.002281 -0.001272 -0.001743 0.001355 
+0.000153 -0.001130 -0.000413 0.000042 -0.001900 -0.001050 
+-0.000945 0.000170 0.001377 -0.001010 -0.000096 0.001394 
+-0.003059 0.001739 0.004506 -0.001229 0.006828 0.005521 
+0.001885 0.012713 0.003432 0.006368 0.017198 -0.007535 
+0.006153 0.010689 -0.005126 0.002343 0.002735 -0.001110 
+-0.000672 -0.000738 0.000501 0.000284 -0.001169 0.000005 
+0.001768 0.001126 0.001609 -0.000159 -0.002698 0.005238 
+-0.002560 0.000768 0.001536 -0.003439 -0.003471 0.001656 
+-0.001197 -0.002107 -0.000050 -0.000256 -0.000415 -0.000866 
+0.000632 -0.000550 -0.000339 0.003338 0.000908 -0.002137 
+0.004897 0.000125 -0.002762 0.004173 -0.000790 -0.003383 
+0.004351 0.000426 -0.001940 0.001801 0.001215 -0.001230 
+-0.000192 -0.001011 0.000922 0.001757 -0.004084 0.002574 
+0.004222 -0.003066 0.000934 -0.000738 -0.000917 0.002772 
+0.002029 -0.000208 0.002476 -0.001379 -0.001867 0.002062 
+-0.004077 -0.001434 0.003107 -0.004126 -0.001469 0.000280 
+-0.000386 0.001410 -0.002102 -0.000028 0.002683 -0.002510 
+-0.001289 0.001225 -0.000899 -0.001662 -0.000536 -0.000449 
+0.000110 -0.000506 0.000081 0.000928 -0.001667 -0.001267 
+0.002028 -0.002422 -0.003688 0.000687 0.001219 -0.005221 
+-0.003106 -0.001884 -0.000565 -0.002656 -0.001781 -0.001004 
+-0.001096 0.000988 -0.001074 0.000514 0.004864 -0.004042 
+0.000846 0.006097 -0.001469 0.004545 0.002280 -0.003020 
+0.001163 0.000930 0.000388 -0.001318 0.000248 0.000496 
+-0.001899 0.000194 -0.002171 -0.000704 0.002517 -0.003827 
+0.000772 0.001581 0.000147 -0.002140 0.001014 0.001410 
+-0.003242 0.001001 0.001993 -0.003455 0.001290 0.000139 
+-0.000933 0.002978 -0.000318 -0.001278 0.000183 0.000287 
+-0.002262 -0.003116 -0.000323 -0.003886 -0.003025 0.001148 
+-0.002834 -0.000619 0.001401 -0.000884 0.000328 0.002525 
+0.000061 -0.000524 0.001219 0.000485 -0.001137 -0.001950 
+0.000725 -0.002416 -0.002477 -0.000010 -0.000910 -0.001074 
+0.000030 0.000287 0.001539 -0.003019 0.001073 0.001470 
+-0.002604 0.001771 -0.000833 -0.001772 -0.001801 -0.001194 
+-0.002403 -0.003063 0.000140 -0.002417 -0.002135 0.001745 
+-0.002209 -0.000075 0.000599 -0.001729 0.000295 -0.001189 
+-0.001260 -0.000231 -0.000840 0.000142 -0.001103 0.000061 
+0.000346 0.000473 -0.000041 0.002231 0.001139 0.001117 
+0.006660 0.000937 0.001856 0.011045 0.000032 -0.000877 
+0.002956 0.001748 -0.000350 0.002685 0.001538 0.001114 
+0.003333 0.001411 0.003057 0.004566 0.003548 0.001450 
+0.004756 0.006527 -0.001808 0.003121 0.006445 -0.003671 
+0.000580 0.002519 -0.003881 0.000096 0.002035 -0.002625 
+0.000669 0.004509 -0.003417 -0.000909 0.005909 -0.001288 
+-0.000684 0.002017 -0.002863 0.000936 -0.002115 0.001545 
+0.002301 -0.002945 0.002450 0.003965 -0.000274 -0.000305 
+0.003091 -0.002123 -0.001478 0.000635 0.003386 -0.000529 
+-0.000097 0.002504 -0.002119 -0.001423 0.002628 -0.000474 
+-0.001461 0.001230 -0.000784 -0.000652 -0.002141 0.000430 
+-0.002788 -0.002452 0.000775 -0.000429 -0.001462 0.002632 
+-0.000705 0.000811 0.000440 0.001445 0.003864 -0.001622 
+0.000686 0.001692 -0.002240 -0.000708 -0.000478 -0.000320 
+0.000394 -0.000124 0.000739 -0.000597 -0.000447 0.003220 
+0.000303 0.001880 0.001192 0.000884 0.000024 -0.001870 
+0.001939 -0.001581 -0.002378 0.001623 -0.000826 -0.000021 
+-0.000674 -0.001661 0.004012 -0.000061 0.001667 0.000030 
+0.001464 0.007985 -0.005125 0.007880 0.010108 -0.006436 
+0.001043 0.004245 0.001055 0.000219 -0.003869 0.000876 
+0.001187 -0.006998 -0.001719 -0.004356 -0.007984 -0.002722 
+0.000305 -0.002312 0.000356 0.002166 0.004232 -0.004477 
+0.002780 0.002038 -0.004199 0.000780 0.000350 -0.000672 
+-0.001035 0.001147 0.000967 -0.000730 0.002395 -0.000813 
+-0.001034 0.004038 -0.004807 0.000473 0.010080 -0.002284 
+-0.004115 0.004678 -0.002802 -0.001028 0.002626 -0.002736 
+0.000840 -0.000967 -0.001059 0.000024 -0.001736 -0.002158 
+0.000663 0.000000 -0.003314 0.002104 -0.000299 -0.002883 
+0.002120 -0.000637 -0.003395 0.000618 -0.000309 -0.003088 
+0.000272 -0.001753 -0.001210 -0.000672 -0.001224 -0.000612 
+0.001580 0.000123 -0.000543 0.000848 0.001064 -0.004040 
+-0.001090 0.001692 -0.000902 -0.003445 -0.004417 0.006515 
+-0.004036 -0.000130 -0.001745 0.001548 0.000290 0.001524 
+0.003137 0.000683 0.001067 0.000844 0.000465 -0.000267 
+0.000316 -0.001631 -0.000010 -0.000670 -0.001707 -0.000065 
+0.000814 0.000879 -0.000223 0.000170 0.000757 -0.002774 
+-0.002151 -0.002285 -0.002688 0.001159 -0.000659 -0.003970 
+0.004266 0.001897 -0.000598 0.003460 0.003349 0.002161 
+0.001881 0.001860 0.001947 0.001984 -0.001290 0.000354 
+-0.001801 0.000865 0.005422 -0.000132 -0.004359 0.005719 
+0.000616 -0.000013 0.000733 0.000828 0.002398 0.001994 
+0.005568 0.011811 0.000834 0.007641 0.014596 -0.007529 
+0.004517 0.010634 -0.008529 0.002322 0.008114 -0.002328 
+0.000928 0.002063 -0.000718 -0.000717 -0.000588 0.001656 
+-0.002764 -0.000673 0.002264 -0.000758 -0.000355 0.000731 
+0.002565 0.000898 -0.002159 0.005443 0.003681 -0.001601 
+0.000500 0.005737 -0.000648 -0.001385 0.001566 -0.002227 
+0.001346 0.000462 0.000423 -0.001297 -0.002517 0.003511 
+-0.001679 -0.003869 0.003358 0.001352 -0.000828 0.003809 
+0.000696 0.002230 0.002017 0.000326 -0.000225 0.000150 
+0.000869 0.001086 -0.003203 -0.001161 -0.001537 -0.001757 
+-0.001074 -0.002222 -0.001074 -0.002239 -0.002239 0.003507 
+0.001303 0.000910 0.001117 0.006616 0.003347 -0.003658 
+0.006452 0.001389 -0.006698 0.004689 0.002713 -0.000659 
+-0.001109 -0.000499 -0.000767 -0.003302 0.001003 0.000122 
+-0.003802 -0.000428 0.001432 -0.000323 0.001507 -0.000685 
+0.000971 0.003139 -0.000841 0.000686 0.002360 -0.001102 
+0.001643 0.002181 -0.000717 0.002681 0.001601 -0.002802 
+-0.000572 -0.000351 -0.001539 0.000796 -0.001401 -0.000687 
+0.001628 -0.000992 -0.001588 0.003896 0.002614 -0.002269 
+0.005898 0.008964 -0.000825 0.007070 0.010066 -0.001977 
+0.004108 -0.000822 -0.001818 -0.001185 -0.002074 -0.001185 
+-0.001679 -0.000876 0.002117 -0.002944 0.000561 -0.004485 
+-0.002328 0.002401 0.000013 0.000832 0.003749 -0.001211 
+0.000033 0.001240 -0.002277 0.001631 0.000136 -0.002246 
+0.001031 0.000802 -0.002370 -0.000920 0.000104 -0.000989 
+-0.002327 -0.001085 -0.000206 -0.001685 -0.000116 0.000181 
+0.002137 -0.000677 0.000929 0.004202 -0.002027 0.000478 
+0.004628 0.000698 -0.001543 0.002093 -0.000357 -0.000713 
+-0.002403 0.000093 0.000166 -0.003736 0.001118 0.000867 
+-0.000434 0.000855 0.000541 -0.000497 0.002241 -0.000041 
+-0.000149 0.000725 -0.004928 -0.003004 0.002004 -0.001666 
+-0.000824 0.002087 0.000464 0.004865 0.002034 0.001337 
+0.009695 0.001588 -0.002291 0.002973 0.000782 -0.003443 
+0.000000 -0.001194 0.002164 -0.001151 0.000291 -0.001343 
+-0.001394 0.004331 -0.000245 0.002371 0.002923 0.002099 
+0.004774 0.001091 0.000618 -0.000552 0.000507 0.003186 
+-0.000905 0.001228 -0.000129 0.000088 -0.001270 0.004724 
+0.001114 -0.001020 0.001532 0.000201 0.003903 0.000457 
+0.007928 0.009521 -0.002920 0.009120 0.008726 -0.006293 
+0.003087 0.003169 -0.002647 -0.003774 -0.001215 0.002545 
+-0.002917 -0.001639 0.004580 -0.000876 -0.000382 0.001927 
+0.000643 -0.000106 -0.000815 0.001259 0.000973 -0.000804 
+-0.000481 -0.000481 -0.001333 -0.001896 -0.001333 -0.000948 
+-0.002776 0.000244 -0.002021 -0.002149 0.000992 -0.001488 
+0.001374 -0.000435 -0.001305 0.000673 0.000658 -0.000367 
+-0.000210 -0.000959 -0.000063 0.000644 -0.000626 -0.000062 
+0.001934 0.002039 -0.001046 0.004238 0.002649 -0.003577 
+0.003715 0.003732 -0.003672 0.000322 0.003056 -0.004021 
+-0.000751 0.002683 -0.002879 -0.000547 0.001864 -0.000717 
+0.001604 0.002022 0.000648 0.002419 0.001376 -0.003321 
+0.000833 0.005823 -0.002199 0.000946 0.001175 -0.000356 
+0.000522 0.000109 0.000084 0.002061 -0.001231 -0.001288 
+0.005289 0.004103 0.000272 0.001437 0.000590 -0.003924 
+-0.001216 0.001474 0.000074 0.004374 0.003308 0.001875 
+0.003265 0.000669 -0.001781 -0.000252 0.001392 -0.000762 
+-0.000754 -0.001190 -0.000060 -0.003307 -0.001157 -0.002699 
+0.000348 -0.000632 -0.002746 0.001457 -0.000493 -0.000343 
+0.002644 0.003630 -0.001226 0.003288 0.004692 -0.003613 
+0.000544 0.001092 0.003092 0.000844 0.005888 0.000983 
+-0.000709 0.002729 -0.001382 -0.000143 0.000429 0.000571 
+-0.001532 -0.004538 -0.000023 -0.005211 -0.003706 0.002525 
+-0.000865 -0.000947 0.003069 -0.004266 0.000662 0.001442 
+-0.002335 0.000874 -0.001538 0.000680 0.001990 -0.000829 
+-0.000249 0.001437 -0.001953 0.003098 0.000577 -0.004200 
+0.003630 0.002826 -0.002718 0.002967 0.003213 -0.001027 
+0.001437 0.001118 0.000711 0.000631 -0.002303 0.000984 
+0.000000 -0.002912 -0.001618 -0.001372 -0.002331 -0.001779 
+-0.000326 0.000005 -0.004256 0.001038 0.001236 -0.006946 
+0.003544 -0.000494 -0.007446 0.005787 -0.001227 -0.003333 
+0.002400 -0.003200 0.001200 -0.000376 -0.002796 0.003118 
+-0.000630 0.000250 0.003768 0.003156 0.002291 0.003105 
+0.003104 0.001356 0.004365 0.000825 -0.001163 0.004462 
+-0.001256 -0.003265 -0.000301 -0.001829 -0.003283 -0.000672 
+-0.000321 0.000473 -0.000284 0.003659 0.004513 0.000732 
+0.001108 -0.002299 -0.001007 0.000796 -0.001236 0.000130 
+0.000476 -0.002158 -0.000402 -0.001443 -0.002886 -0.000922 
+0.003662 0.001044 -0.003072 0.007150 0.007228 -0.007949 
+0.009657 0.010816 -0.005389 0.007497 0.008616 -0.001073 
+0.001522 0.003433 -0.000202 -0.001139 -0.001804 0.001804 
+-0.000871 -0.003730 0.001120 0.000107 -0.003734 0.000806 
+-0.000349 -0.003958 0.000722 -0.002656 -0.004041 -0.000491 
+-0.003523 -0.003107 -0.002556 -0.001753 -0.000981 -0.004173 
+0.000918 -0.002050 -0.001308 0.001449 -0.001806 0.000320 
+0.002670 -0.001895 0.001618 0.002128 -0.001366 0.002010 
+0.001083 -0.000016 0.000422 -0.000428 0.001202 -0.001103 
+-0.001794 -0.000595 -0.001648 -0.001256 -0.003390 0.000497 
+-0.003984 -0.003359 0.001328 -0.000850 -0.002623 -0.000275 
+-0.001797 -0.000276 -0.001259 -0.005686 -0.001733 0.002098 
+-0.001366 -0.004099 0.001298 0.001006 -0.002199 -0.000223 
+0.004355 0.001064 -0.002482 0.002167 0.005419 -0.004524 
+0.002543 0.002698 -0.006988 0.002264 -0.000330 0.000473 
+0.002000 0.004985 -0.001662 0.000720 0.001274 -0.001250 
+-0.000528 -0.000292 0.000569 -0.003634 -0.000290 0.002088 
+-0.005987 0.000757 0.003277 -0.005617 0.001880 0.001912 
+-0.002946 0.000589 0.002270 0.000199 -0.000670 0.000833 
+0.002318 0.000335 -0.000099 0.002964 0.002440 0.002875 
+0.001647 0.003843 -0.000488 0.002059 0.002985 -0.003176 
+0.000711 0.000154 -0.004076 -0.000598 -0.000689 -0.002205 
+-0.000960 -0.001854 -0.002301 0.000226 -0.002481 -0.002932 
+0.000710 -0.000467 -0.004354 0.002571 0.000857 -0.003571 
+0.003145 0.001189 -0.003164 0.003384 0.005004 -0.001447 
+0.004572 0.005282 -0.001342 0.003961 0.008183 -0.003119 
+-0.001196 0.008966 -0.002244 0.005856 0.003805 -0.005074 
+0.003835 0.002500 -0.000517 0.000207 -0.000937 0.001047 
+-0.002621 -0.002229 0.001378 -0.003003 -0.001166 0.000951 
+-0.000883 -0.001072 0.000460 0.000821 -0.000748 -0.000614 
+0.002217 0.000279 -0.001062 0.001185 0.000846 0.002369 
+0.004961 0.001357 -0.001357 0.002931 0.000589 0.001907 
+0.003073 0.002658 0.001869 0.002207 0.002433 0.001599 
+0.000975 -0.000515 0.000803 -0.000890 -0.000476 -0.001405 
+-0.000727 0.000178 -0.001325 -0.000211 0.001310 0.001177 
+0.005502 -0.000949 0.001138 0.004307 0.006403 -0.000990 
+0.002956 0.005078 0.000548 -0.003639 0.003480 -0.004293 
+-0.002215 -0.006628 -0.002592 0.001288 -0.009706 -0.006043 
+0.004022 -0.005079 -0.006918 0.006674 -0.001096 -0.002093 
+0.002334 0.001256 0.002619 -0.000239 0.001565 -0.001073 
+-0.004530 0.000302 -0.001359 -0.003383 0.000997 -0.002918 
+-0.001357 0.000057 -0.001342 0.000941 -0.000858 0.000629 
+0.001297 -0.001761 0.000061 -0.000388 -0.001812 -0.000723 
+0.000647 -0.000296 -0.000673 0.001233 0.001287 0.000225 
+0.001795 0.001795 0.000000 0.003705 0.002932 -0.000135 
+0.002920 0.003139 -0.000511 -0.003393 0.000596 0.001946 
+-0.003083 -0.001107 0.005918 -0.000427 0.000908 0.001715 
+0.000295 0.000090 -0.000190 0.001422 0.000193 0.001845 
+0.002972 0.000134 0.003749 0.005818 0.002275 0.002024 
+0.005594 0.005147 0.000746 0.002246 0.007032 0.001481 
+-0.000630 0.005317 0.000820 0.002506 0.006485 -0.007078 
+-0.000379 0.003051 -0.002064 0.000315 0.001033 -0.000124 
+-0.001446 0.000046 -0.001337 -0.002446 0.001986 -0.002846 
+-0.001045 0.002731 -0.002276 0.000770 0.001507 -0.001339 
+0.000424 0.003820 0.000543 0.005237 0.006122 -0.000068 
+0.006646 0.001109 0.000006 0.003817 0.000318 0.001654 
+0.000992 0.001463 0.002325 0.000388 0.001411 0.001605 
+0.002515 -0.000044 0.000416 0.002629 -0.001046 -0.002077 
+-0.001163 0.003488 -0.001860 0.002653 0.004671 0.000111 
+0.005554 0.005493 0.002686 0.004339 0.009813 -0.001068 
+0.001855 0.001504 -0.000571 -0.001852 -0.006174 0.002470 
+-0.003086 -0.004885 0.005502 -0.003563 -0.000433 0.003452 
+-0.002256 -0.000451 0.001128 -0.000105 -0.000156 0.000086 
+0.000658 0.000221 0.000056 -0.001381 -0.000571 -0.000086 
+-0.004422 0.002568 0.001378 -0.004870 0.003889 -0.001184 
+-0.002842 0.000966 -0.001187 0.001319 -0.001060 -0.003466 
+0.004172 0.003749 -0.000990 0.000835 0.002355 0.000408 
+-0.000809 0.002508 0.000422 -0.001838 0.005262 0.000442 
+-0.004767 0.009689 -0.001734 -0.005736 0.008709 -0.003003 
+-0.006325 0.000260 -0.000379 -0.005034 -0.003004 -0.000567 
+-0.004132 -0.001895 0.001961 -0.001175 0.001362 0.002008 
+-0.000361 0.000824 0.000698 -0.000651 0.000580 -0.000204 
+-0.001423 -0.002347 -0.000259 -0.000870 -0.005434 0.001649 
+-0.002522 -0.007494 0.004341 -0.007127 -0.002027 0.002015 
+0.006648 0.017906 0.000858 -0.003813 -0.015598 -0.005145 
+-0.004525 -0.031937 -0.011388 -0.472527 -3.489011 -1.192308 
+-0.004338 -0.020304 -0.016764 -0.002311 -0.005212 -0.006300 
+0.002024 0.001090 0.002343 0.000692 -0.000579 -0.002317 
+0.001570 0.004188 -0.002388 0.003045 0.003471 -0.006045 
+-0.000118 -0.000316 -0.000916 0.000643 0.002052 0.000845 
+-0.000655 0.000252 -0.000218 -0.002254 -0.002012 -0.000792 
+-0.003793 -0.004224 0.000776 -0.004132 -0.002557 0.004523 
+-0.000794 0.001150 0.001127 0.002946 0.002266 0.001066 
+0.001059 -0.000131 0.000772 0.000628 -0.001256 0.000248 
+0.000070 0.000463 -0.000492 0.000870 0.003053 0.000219 
+-0.001207 0.001460 0.000872 0.001108 0.000654 0.001816 
+0.003573 0.000704 0.001924 0.002156 0.002073 0.000577 
+-0.000036 0.003903 0.000398 -0.000272 0.006116 -0.001940 
+0.005840 0.003382 -0.005945 0.004690 -0.002233 -0.003333 
+0.002655 -0.001706 0.000333 0.000303 -0.000340 0.000009 
+-0.000119 0.000858 -0.000113 0.000145 0.001763 -0.000368 
+0.001689 0.001347 -0.001650 0.002301 -0.000614 -0.000764 
+0.001674 0.000106 0.003691 0.000079 0.001286 0.003365 
+-0.004235 0.000036 -0.002171 -0.004981 -0.003160 -0.004387 
+-0.004565 -0.003250 -0.003142 -0.005672 -0.001111 0.001227 
+-0.003979 -0.004727 0.003027 -0.000838 0.002547 0.003419 
+0.002192 0.006440 0.001203 0.003033 0.003253 -0.000694 
+0.001488 0.001786 0.001726 0.000596 0.002306 0.001403 
+-0.001763 0.000588 -0.002824 -0.001260 0.000546 0.001117 
+-0.002737 -0.002096 0.002533 -0.002268 -0.000370 0.003031 
+-0.001095 0.000242 0.002066 -0.001818 -0.001692 0.000494 
+-0.002084 -0.003455 -0.000168 -0.002224 -0.002663 0.000161 
+-0.001124 0.000657 -0.002527 -0.001763 0.002194 -0.004964 
+-0.000885 0.000287 -0.000299 0.000848 0.001127 -0.000763 
+-0.000223 0.000026 0.000327 0.000816 0.000863 0.003022 
+0.000545 0.002865 0.002875 -0.002379 0.002467 -0.000127 
+-0.006751 0.001401 -0.001935 -0.005141 0.004224 -0.002374 
+0.001071 0.006586 -0.003709 0.003308 0.004578 -0.003586 
+-0.001158 0.000687 0.000381 -0.001487 0.000955 -0.000529 
+-0.001343 0.000568 -0.000655 -0.001674 0.000795 0.000233 
+-0.001168 0.000574 -0.000387 -0.000893 -0.001676 -0.001410 
+-0.001525 -0.000472 -0.000525 -0.000253 0.000421 -0.001483 
+0.026020 0.037209 -0.016952 0.002797 -0.009406 -0.006618 
+-0.004620 -0.036583 -0.012924 0.261307 -4.371859 -1.577889 
+0.204762 -3.695238 -1.252381 -0.005790 -0.017874 -0.007817 
+-0.007884 -0.006769 0.004285 -0.005174 -0.002522 0.004684 
+-0.000068 -0.000356 0.000089 0.002160 0.001760 -0.001452 
+0.001035 0.005155 -0.001193 -0.001082 0.006199 0.000936 
+0.001626 0.007722 -0.001535 -0.000303 0.005234 -0.002541 
+-0.004791 0.000989 0.002216 -0.006613 -0.001952 0.006397 
+-0.003588 -0.001654 0.007777 -0.002320 0.000984 0.004329 
+-0.000372 0.000498 0.001442 0.000357 0.000031 -0.000860 
+0.001611 0.005431 -0.000995 -0.001006 0.002433 0.001278 
+0.000287 0.000915 0.002048 0.002270 0.002209 0.003046 
+-0.002348 0.003108 0.000941 -0.005315 0.004385 0.001616 
+-0.004680 0.004037 0.000977 -0.000281 0.003860 -0.003832 
+0.002044 -0.000435 -0.002565 0.002449 -0.000736 -0.002484 
+0.001087 -0.000261 -0.003543 -0.000597 0.000205 -0.002322 
+-0.001985 0.000000 0.000382 -0.004011 -0.002521 0.000611 
+-0.000430 -0.004408 0.000322 0.000638 0.000765 -0.000546 
+0.001118 0.006296 0.000947 -0.000980 0.003309 -0.001806 
+-0.003124 -0.002187 -0.014653 -0.012323 -0.009827 -0.016722 
+0.003660 -0.005235 -0.014383 0.001105 0.004972 -0.009420 
+0.003072 0.007822 0.000299 0.002868 0.004814 -0.001605 
+0.001424 0.004212 0.000784 0.001804 0.002095 0.001979 
+0.005455 0.003788 -0.001894 0.006111 0.004335 -0.001182 
+0.005391 0.003037 -0.002951 0.000440 -0.000133 -0.000047 
+-0.003099 -0.001183 0.001304 -0.003399 -0.002148 -0.000634 
+-0.002632 -0.000501 0.000535 -0.001945 -0.001566 0.000408 
+-0.004154 -0.003382 0.000661 -0.004489 -0.002847 0.003102 
+-0.001481 0.000000 -0.001852 0.000757 0.002651 -0.007591 
+0.003755 0.004086 -0.007253 0.002481 -0.000311 -0.002722 
+0.000026 -0.001460 0.001882 0.000219 -0.000008 0.000959 
+-0.000939 0.000252 -0.000535 -0.000746 0.003283 0.000312 
+-0.002358 0.004522 -0.001184 -0.004685 0.001772 0.000363 
+-0.002970 0.000706 0.000050 -0.000038 0.000112 -0.000747 
+0.001656 0.000607 0.002446 0.002182 0.001637 0.002728 
+-0.000774 -0.000989 0.000274 -0.001234 0.002449 -0.000045 
+-0.000662 0.005682 -0.001545 0.004410 0.005821 -0.002821 
+0.000489 0.003560 -0.000125 -0.000625 0.002527 -0.002621 
+0.034096 0.012426 -0.020103 0.009466 -0.002044 -0.005984 
+0.004120 -0.025877 -0.010062 0.794737 -3.863158 -1.336842 
+0.292453 -3.462264 -1.320755 0.006651 -0.017306 0.000115 
+-0.001088 -0.004150 0.003438 -0.002502 -0.001739 0.003825 
+-0.001278 -0.001716 0.002600 -0.001037 -0.001905 0.000660 
+0.000157 0.006191 0.003380 -0.000840 0.006690 -0.001338 
+-0.002768 0.002098 0.000053 -0.002389 0.001119 -0.001489 
+-0.000962 0.000234 -0.000363 -0.000375 0.000344 -0.000522 
+0.000021 0.002530 -0.000964 0.000197 -0.002235 0.003495 
+0.000369 0.000093 0.003888 -0.001348 0.000454 0.002411 
+0.000494 0.002246 0.001564 0.001320 0.003688 -0.000044 
+0.003500 0.003071 -0.001705 0.003835 0.003118 -0.001179 
+0.000790 0.003421 0.003347 0.000528 0.000155 0.001323 
+0.004521 0.006505 -0.004301 -0.000348 0.004104 -0.006932 
+-0.000858 0.001365 -0.003985 -0.001719 0.000788 -0.000597 
+-0.003397 -0.000524 0.001962 -0.004200 -0.001893 0.002619 
+-0.003781 -0.002855 0.000965 -0.000516 -0.002117 -0.000117 
+-0.000700 -0.001066 0.001216 -0.000408 0.001006 0.000615 
+0.003390 0.003410 0.002113 -0.001049 0.005716 -0.002828 
+0.000355 -0.008663 -0.010908 -0.010866 -0.015622 -0.014716 
+-0.014660 -0.009709 -0.016366 -0.005834 -0.000427 -0.010733 
+0.001788 0.004651 -0.001718 0.000000 0.001259 -0.000839 
+-0.003719 0.000438 0.000809 -0.002007 0.000871 0.001537 
+0.000620 0.000646 -0.000737 0.002837 0.001335 0.000125 
+0.000354 0.000146 0.000035 -0.001460 0.000351 0.000444 
+-0.001487 -0.002110 0.002206 -0.001915 -0.004583 0.002949 
+-0.002918 -0.007321 0.001478 -0.005496 -0.005304 0.001543 
+-0.003243 -0.004427 0.001545 -0.001814 -0.002934 0.001344 
+-0.001219 0.000514 0.000068 -0.000704 -0.000392 -0.002143 
+0.001545 0.001917 -0.006359 0.002099 0.001504 -0.003305 
+0.001238 -0.001459 0.000068 0.000831 -0.000918 0.001277 
+0.000488 0.002096 0.000527 -0.000232 0.003378 -0.000380 
+-0.000370 0.001434 -0.000215 0.001128 -0.000948 -0.000718 
+-0.000156 -0.001206 -0.004951 -0.000038 -0.001151 -0.001802 
+0.000901 0.000780 0.002225 0.001492 0.001645 0.004181 
+0.001014 -0.001414 0.002121 0.000090 -0.000417 0.001075 
+-0.000109 -0.000446 -0.000373 -0.000470 -0.000757 0.002677 
+-0.004357 -0.003339 0.004255 -0.004911 -0.003846 -0.000463 
+-3.869281 -2.156863 -2.013072 -0.035079 -0.003450 -0.017064 
+-0.008225 0.000388 0.001031 0.013197 -0.021746 0.000879 
+0.005727 -0.016146 -0.020482 0.010946 -0.007790 -0.011968 
+0.001770 -0.002174 -0.010575 -0.001810 0.006638 -0.005517 
+-0.000521 0.001042 -0.002605 0.002900 0.001248 0.000470 
+0.002878 0.007051 -0.002746 -0.001051 0.003990 0.004269 
+-0.003828 -0.002683 0.003297 0.000001 -0.009024 0.003006 
+0.001588 -0.000334 -0.002088 0.000153 -0.000936 -0.003737 
+0.000653 -0.000609 0.000676 -0.000519 -0.001763 0.002489 
+-0.001847 -0.002911 0.001522 0.001300 -0.000622 0.000264 
+-0.001163 -0.000813 0.002182 0.001151 0.000778 0.001321 
+0.000984 0.002426 -0.002461 -0.001313 0.002397 -0.002822 
+-0.000211 0.003798 -0.003393 0.006428 0.002462 0.002903 
+-0.001145 0.002173 0.000159 -0.001364 0.000671 -0.002784 
+-0.002576 -0.002007 -0.002521 -0.003417 -0.001077 0.000522 
+-0.000663 -0.000430 -0.000381 0.000814 0.000565 0.000465 
+-0.000010 0.002359 0.002075 -0.002230 0.002173 0.000796 
+-0.001655 0.002270 -0.000164 0.002769 0.001105 -0.001296 
+0.006341 -0.001470 -0.000802 0.007037 0.003794 -0.007367 
+0.002458 -0.004243 -0.007517 -0.003500 -0.007423 -0.009205 
+-0.008318 -0.008838 -0.006883 -0.004819 -0.007686 -0.000732 
+-0.001487 -0.005452 0.004211 -0.007458 -0.004595 0.002524 
+-0.007501 -0.004926 0.000138 -0.005057 0.000147 -0.000674 
+0.000313 0.004335 0.002293 0.002371 0.001116 0.002737 
+0.004573 0.001366 0.000501 0.001360 0.001177 -0.000236 
+0.000630 0.000030 -0.000385 -0.000406 -0.000797 -0.000812 
+-0.000833 -0.001658 -0.000890 -0.001678 -0.002242 0.000552 
+-0.001537 -0.001651 0.000184 -0.000547 -0.000786 -0.000588 
+-0.001446 0.000669 0.000073 -0.002970 0.001608 -0.000627 
+-0.002028 0.002697 -0.002581 -0.000856 0.001576 -0.001257 
+-0.000466 -0.000468 0.001168 0.000438 -0.001290 -0.000195 
+-0.003207 0.000054 -0.000221 -0.002580 0.002970 -0.001011 
+0.000918 0.001770 -0.001463 0.001517 -0.000826 -0.003096 
+0.001161 -0.001455 -0.002675 0.000663 -0.001343 -0.002150 
+0.000935 -0.001725 -0.001028 0.002741 -0.001273 -0.000440 
+0.002972 -0.001266 0.001602 0.000466 0.000281 0.001808 
+-0.002512 -0.001069 0.004569 -0.008330 -0.001443 0.003262 
+-0.006936 0.003250 0.003343 -0.003434 0.005673 0.005424 
+-4.535256 -4.692307 -2.442308 -4.460177 -5.775811 -2.289086 
+-3.628378 -6.341216 -1.746622 -1.932432 -6.022522 -1.175676 
+-0.161491 -4.049689 -0.975155 0.001603 -0.014689 -0.010173 
+-0.005852 -0.005196 -0.008660 -0.007623 -0.000700 -0.001060 
+0.000030 -0.000099 0.002108 0.004656 0.002618 -0.002329 
+0.007874 0.005029 -0.003391 0.010234 0.001806 0.000435 
+0.002793 0.002276 -0.004308 0.002582 0.004098 -0.001964 
+0.000796 0.000285 -0.003460 0.000611 0.000575 -0.000359 
+0.001493 -0.000297 -0.000522 0.001342 0.000669 0.001170 
+-0.000920 0.000858 0.001349 -0.003484 0.000846 0.002331 
+-0.003843 0.000227 0.002460 -0.002315 0.000327 -0.000915 
+-0.000669 -0.001653 -0.003286 0.000173 -0.002098 -0.003459 
+0.002373 -0.000847 -0.002669 -0.000892 -0.000212 -0.003393 
+-0.002529 0.000980 -0.000320 -0.004918 -0.001087 -0.000887 
+-0.005199 -0.005898 0.005518 -0.002095 -0.003134 0.005552 
+0.002883 0.001522 -0.000208 0.005434 0.001014 0.003731 
+-0.001878 0.002842 0.003037 -0.008359 0.003033 0.000167 
+-0.009839 0.006250 0.004476 -0.009699 -0.003832 0.004473 
+-0.001707 -0.008480 0.003364 0.003412 -0.001203 0.000859 
+0.003749 0.011736 0.000274 0.002221 0.011352 0.001806 
+-0.004619 0.005969 -0.004087 -0.004397 0.003066 -0.000030 
+-0.002594 0.000525 0.001332 0.000399 0.001697 0.000827 
+-0.001960 0.000184 0.000761 -0.003609 -0.001502 -0.000527 
+-0.000043 0.000853 0.002773 0.000809 0.004852 -0.000538 
+0.000441 0.000220 0.001024 0.002653 -0.002598 0.002017 
+0.000077 -0.005425 0.003332 -0.001119 0.000000 0.000373 
+-0.000008 0.005109 -0.002584 0.001550 0.001162 -0.000157 
+-0.003392 0.000739 -0.000076 -0.003039 -0.001585 -0.000143 
+-0.004083 -0.002463 -0.002328 -0.003322 0.000426 -0.005324 
+-0.001024 0.003327 -0.003077 -0.001575 0.004676 -0.000884 
+0.000845 0.006045 -0.000243 0.002715 -0.000428 -0.001575 
+0.002574 -0.000724 -0.000345 0.000824 -0.000436 -0.000644 
+-0.000469 0.000535 -0.000557 -0.000607 0.002746 -0.001153 
+-0.000657 0.000656 0.001206 0.000501 -0.004142 0.003324 
+-0.002496 -0.006089 0.001726 -0.002476 -0.002418 0.002758 
+0.000770 0.000319 0.001628 0.000304 -0.000265 0.000218 
+-0.002707 -0.004909 0.002104 -0.003558 -0.006526 0.002839 
+-0.002186 -0.003097 0.004919 0.000239 0.002445 0.002369 
+-3.912134 -5.008368 -2.556485 -3.812834 -6.529412 -1.820856 
+-3.574766 -7.275701 -1.228972 -3.130194 -7.451524 -0.695291 
+-2.232759 -6.163793 -0.275862 -0.007627 -0.019767 0.000009 
+-0.000278 0.001356 0.004200 -0.002242 -0.001216 0.000423 
+0.001812 -0.007710 -0.004406 0.004189 0.001870 -0.002232 
+0.009380 0.000395 0.001423 0.005643 0.001160 -0.003681 
+0.004659 0.004845 -0.003715 -0.000408 0.012000 -0.001838 
+0.006911 0.010503 -0.011332 0.008042 0.010897 -0.009804 
+0.005385 0.003249 -0.007039 0.001497 -0.003483 -0.002966 
+0.000028 -0.000239 0.000965 0.000110 0.000388 -0.000666 
+0.000689 0.000151 -0.000043 -0.000964 0.000434 0.001851 
+-0.000343 0.000638 0.002909 0.001466 -0.000295 0.000473 
+-0.000483 0.000977 0.000009 -0.000288 0.000253 -0.001252 
+-0.001218 0.000406 0.001880 -0.003036 -0.001544 0.000895 
+0.004332 -0.002225 0.000585 0.004749 -0.001599 0.004717 
+0.000992 0.000819 0.003668 0.000847 0.007853 -0.000651 
+-0.000642 0.002375 -0.006628 -0.018442 0.007435 -0.000918 
+-0.018227 0.002819 0.005422 -0.004467 -0.005821 0.004342 
+0.009195 -0.008833 0.003434 0.013745 -0.005687 0.004446 
+0.009926 0.003234 0.001873 -0.000655 0.005269 -0.005364 
+-0.005907 0.003600 -0.003490 -0.004028 -0.000103 -0.003484 
+-0.003459 -0.002056 -0.001601 -0.001274 0.001323 -0.001149 
+0.000376 0.003308 -0.003011 -0.001302 0.002215 0.000055 
+-0.004235 0.001756 0.002047 -0.004870 0.001261 0.004087 
+-0.003300 0.002505 0.000876 -0.000877 -0.000176 -0.000652 
+-0.000094 -0.002259 -0.000722 0.002683 -0.001105 -0.001052 
+0.001767 0.000596 -0.001931 -0.002101 -0.000527 0.000004 
+-0.003197 -0.004917 -0.000121 -0.000742 -0.005000 -0.000742 
+0.000102 -0.002098 -0.000385 -0.000987 0.002538 -0.000157 
+-0.000703 0.005607 -0.003448 0.000412 0.001408 -0.002749 
+-0.000482 -0.000125 0.000678 0.000839 0.000005 0.001320 
+0.001842 -0.000933 -0.000957 0.001547 -0.000319 -0.005715 
+0.001728 0.002963 -0.004615 0.000405 0.001337 -0.000765 
+-0.000356 -0.000431 0.000043 0.001704 0.000242 0.002927 
+0.003512 0.000655 0.003408 0.001490 0.002228 0.001936 
+0.001049 0.000196 -0.001161 0.000643 0.000765 -0.003123 
+0.000618 -0.001959 0.001091 0.005470 -0.004051 0.003062 
+0.003629 -0.005041 0.002903 0.001215 0.000303 -0.000007 
+-0.034456 -0.030987 -0.038946 -2.959064 -6.257310 -2.409357 
+-2.981482 -6.962963 -1.009259 -2.865633 -6.803617 -0.348837 
+-2.487180 -5.993590 0.128205 -1.458101 -3.502793 0.474860 
+0.002647 0.014557 0.005385 0.014809 0.015191 0.004765 
+0.000376 0.000374 -0.000811 0.002288 -0.006114 -0.001579 
+0.000786 0.000064 -0.000332 -0.000146 0.002883 -0.001058 
+-0.001069 0.001851 -0.001007 0.000395 0.003409 -0.001466 
+0.003867 0.011745 -0.008626 0.012775 0.010131 -0.014409 
+0.008956 0.006351 -0.010598 0.000633 0.000814 -0.004975 
+-0.000366 -0.000073 0.000265 0.002624 0.003526 -0.001744 
+0.000887 0.001955 -0.003241 0.002408 -0.002225 0.001674 
+0.003001 0.000972 0.001765 0.000551 0.001149 0.000238 
+0.001337 0.003057 0.000488 0.003653 0.006184 -0.000496 
+0.007259 0.000000 -0.002074 0.008126 -0.003055 -0.001096 
+0.003636 0.001134 -0.001869 0.001230 -0.007153 -0.001367 
+0.000094 0.000510 -0.001682 -0.004235 0.000317 -0.007303 
+-0.006193 0.003137 -0.005851 -0.003604 -0.000024 0.001679 
+0.005877 -0.009316 0.005244 0.019368 -0.014456 0.006720 
+0.024821 -0.012136 0.009381 0.020729 -0.001413 0.008712 
+0.010241 0.002710 -0.000398 -0.003552 0.000745 -0.001108 
+-0.009433 -0.000324 -0.003136 -0.008977 -0.009345 0.001025 
+-0.005063 -0.007659 0.005652 -0.005862 -0.003050 0.002765 
+-0.000237 0.001809 0.002476 0.002319 0.003659 0.002371 
+-0.001768 0.003016 0.000806 -0.006205 0.002620 0.004093 
+-0.007027 0.003713 0.001683 -0.002051 0.000618 -0.000858 
+0.001134 -0.000290 -0.000765 0.004480 0.000710 -0.006130 
+0.009605 0.003314 -0.005134 0.002317 0.005400 -0.000873 
+0.000042 0.002338 -0.001028 -0.001614 0.000867 0.000035 
+-0.002415 0.002215 -0.001167 -0.002930 0.002427 -0.000638 
+-0.001417 0.000716 -0.000245 0.000076 0.000000 -0.000382 
+-0.000709 -0.000337 -0.001696 -0.002414 -0.000915 -0.002237 
+-0.001843 -0.000583 -0.003874 -0.002846 0.003471 -0.002314 
+-0.001745 0.000997 0.000249 -0.002688 -0.001909 -0.003253 
+-0.001510 -0.001533 -0.000967 0.000959 0.002809 0.000891 
+0.001369 0.005318 0.001259 0.001159 0.001779 0.000899 
+-0.002928 0.001366 -0.000293 -0.001099 -0.001230 -0.004526 
+-0.004206 0.000118 -0.005272 -0.000954 0.004484 -0.002786 
+-0.001797 0.003683 -0.002379 -0.001581 0.006029 0.000331 
+-0.025038 -0.003712 -0.010933 -0.019796 -0.031242 -0.027919 
+-2.508671 -6.410405 -0.456647 -2.879747 -6.072785 0.145570 
+-2.910769 -5.523077 0.504615 -2.486842 -4.135965 0.793860 
+-0.009826 -0.011189 0.009755 0.002084 0.015163 0.005677 
+0.009172 0.008110 0.006479 -0.001083 -0.000668 0.002124 
+-0.000279 -0.001429 -0.000836 -0.001864 0.005125 -0.000301 
+-0.001585 0.001948 0.002708 0.000430 0.003191 0.001960 
+0.000578 0.000913 0.000426 0.001370 0.003684 -0.001573 
+0.005832 0.004256 -0.001813 0.003373 0.006021 -0.000109 
+-0.000668 0.003626 -0.001590 0.002250 0.001250 -0.003000 
+0.006622 0.000130 -0.003630 0.007425 0.000289 -0.003022 
+0.001898 0.000813 -0.001368 -0.001791 -0.001058 0.001875 
+0.003809 0.004914 -0.003163 0.011864 0.008226 -0.009019 
+0.012276 -0.000808 -0.009293 0.005795 0.000236 0.001277 
+-0.004961 -0.004021 0.001806 -0.001914 -0.011937 0.005242 
+0.011440 -0.012910 -0.003498 0.021917 -0.008115 -0.001472 
+2.341837 -2.255102 -0.688776 2.648402 -2.255708 -0.351598 
+2.875000 -2.232759 -0.056034 2.899543 -2.100457 0.105023 
+0.016716 -0.019656 0.006077 0.009375 -0.005594 -0.005415 
+0.002751 0.005925 -0.004643 -0.007119 -0.001947 -0.001112 
+-0.006314 -0.000626 0.007970 -0.003653 -0.004161 0.010382 
+-0.008047 -0.004017 0.006496 -0.001583 -0.000346 -0.001652 
+-0.003309 0.000705 0.004576 -0.002128 0.002766 0.002128 
+0.002048 0.004570 -0.001444 0.003453 0.004460 0.000504 
+0.000992 0.001890 0.000071 0.000093 -0.003289 0.003278 
+0.000148 -0.001867 0.005600 0.000805 -0.003189 0.000310 
+0.004696 0.000776 -0.002591 0.006603 0.004714 -0.001158 
+0.003231 0.005434 -0.001475 -0.002633 0.003826 -0.000837 
+-0.003827 0.003130 -0.006436 -0.002274 0.003399 -0.005575 
+-0.000056 -0.000327 -0.003985 0.002926 0.000067 -0.003745 
+0.001101 -0.001327 -0.004842 0.001571 -0.000880 -0.004872 
+0.000492 0.001342 -0.001268 -0.002241 0.000367 -0.000564 
+-0.000472 -0.000743 -0.000945 -0.001516 -0.000979 -0.002091 
+-0.002181 -0.000912 -0.001613 -0.002622 0.001821 0.000459 
+-0.002840 0.003652 -0.000325 -0.003913 -0.000784 0.003137 
+-0.001785 0.001539 0.001722 0.000514 -0.001932 0.002579 
+0.000108 -0.001374 0.000660 0.001566 0.001465 -0.004495 
+-0.000890 -0.000670 -0.001979 -0.001159 0.001499 0.002911 
+0.005549 0.003621 -0.002956 -0.005895 -0.008635 0.008402 
+-0.027655 -0.046181 0.006193 -3.127049 -5.581967 0.758197 
+-3.230520 -5.350649 0.879870 -2.875472 -4.358490 0.954717 
+-0.011255 -0.023344 0.009232 -0.000743 0.008407 0.005412 
+0.007117 0.001017 0.003125 0.003179 0.004187 0.000311 
+-0.000833 -0.002009 -0.000528 0.001709 0.003964 -0.004966 
+-0.002829 0.006224 -0.005656 0.005847 0.000921 0.000596 
+-0.000611 -0.002278 -0.000131 -0.001641 -0.002376 0.000467 
+-0.000638 0.000140 0.000238 -0.001002 0.003417 0.000755 
+-0.000439 -0.000256 0.000638 -0.000625 0.000269 -0.000181 
+0.002417 0.000704 -0.000457 0.002689 0.004447 -0.001114 
+0.000038 0.002464 0.000402 0.002049 0.003367 0.000467 
+-0.001082 0.009071 -0.000335 0.006435 0.004060 -0.008189 
+0.004058 0.005476 -0.003512 -0.007111 0.003585 0.002946 
+-0.018323 -0.001576 0.008676 -0.002880 -0.011114 0.007796 
+0.014442 -0.025920 -0.009903 3.217778 -2.955555 -0.528889 
+3.432235 -3.032967 -0.428571 3.605735 -2.870968 -0.358423 
+3.703863 -2.553648 -0.356223 3.274854 -2.029240 -0.502924 
+0.023005 -0.009159 -0.005836 0.010538 0.002232 -0.003549 
+0.000254 0.002827 -0.002218 -0.006184 -0.004122 0.003092 
+-0.010523 -0.005040 0.009265 -0.009588 -0.003296 0.010190 
+-0.005839 -0.001668 0.004286 -0.000419 0.001229 0.000723 
+0.000950 0.002990 -0.000722 0.002656 0.001098 -0.000693 
+0.005205 -0.000642 -0.000166 0.001425 0.000471 0.003804 
+0.000798 -0.003909 0.002230 0.000616 -0.000835 0.005740 
+-0.006611 0.001170 0.006769 -0.007207 -0.000334 0.005094 
+-0.003307 -0.001018 0.001526 0.000744 0.003983 -0.000456 
+0.003592 0.004960 -0.000798 0.003073 0.001452 -0.001024 
+0.000952 -0.001429 -0.000476 0.000493 -0.001129 -0.001690 
+0.000061 0.001974 -0.001255 0.000976 0.001256 -0.003115 
+-0.000232 0.002026 -0.000530 -0.000429 0.003130 0.000706 
+-0.002615 0.002341 0.000416 -0.001943 0.000930 -0.000200 
+0.001915 -0.001504 -0.000558 0.004447 -0.003391 -0.000738 
+0.005649 -0.001867 -0.000577 0.005190 0.003855 -0.002690 
+0.001002 0.004118 -0.003966 0.002676 0.000231 -0.000831 
+0.004792 -0.001127 -0.001409 0.000596 0.000183 -0.002018 
+0.002481 -0.000238 -0.002441 0.000691 0.000467 -0.001070 
+0.001089 -0.001388 0.003841 0.003598 -0.002694 0.008813 
+0.004004 0.003345 0.006429 0.002998 -0.004910 0.009965 
+-0.019632 -0.039987 0.005383 -3.259887 -5.310734 0.519774 
+-3.450355 -5.343972 0.904255 -3.343750 -4.815972 1.190972 
+-2.460000 -3.170000 1.090000 -0.000418 0.002253 0.004095 
+0.006806 0.009182 0.000705 0.000623 0.006753 0.003609 
+0.000740 -0.000591 -0.001654 0.000479 0.001248 -0.004135 
+0.002322 0.002296 -0.003326 -0.000590 -0.001816 0.000340 
+-0.007083 -0.005078 -0.000768 -0.002850 -0.008470 0.000897 
+0.001897 -0.003321 0.004902 -0.000896 -0.001457 0.001204 
+-0.001345 0.000317 0.002083 0.001712 0.002665 0.001523 
+-0.001124 -0.002302 0.006807 -0.001824 -0.003214 0.003810 
+0.002562 -0.000908 -0.000634 0.000933 0.001883 0.002626 
+0.000773 0.009477 0.004268 0.004839 0.013495 0.000323 
+-0.003513 0.007565 0.002375 -0.002813 -0.000519 0.006388 
+-0.001679 -0.006771 0.006996 0.012690 -0.016244 0.003046 
+3.087432 -2.688524 -0.573770 3.544681 -2.923404 -0.591489 
+3.400000 -2.886792 -0.486792 3.264069 -2.606061 -0.324675 
+0.024081 -0.025141 -0.005074 0.024039 -0.014158 -0.009840 
+0.012629 -0.006711 0.003653 -0.001610 -0.009777 0.006794 
+-0.004860 -0.006063 0.005471 -0.005228 -0.003789 0.002460 
+-0.002331 -0.009143 0.004846 -0.005149 -0.001116 0.010514 
+-0.005594 0.000243 0.008610 -0.000071 0.000707 -0.000089 
+0.002461 0.000140 -0.006973 0.005692 -0.000635 -0.005057 
+0.000947 -0.002835 0.000013 0.000351 -0.001430 0.003662 
+0.000175 -0.001504 0.002337 -0.001275 -0.002823 -0.002835 
+-0.003948 -0.000824 -0.004641 -0.004518 -0.002899 -0.000104 
+-0.001986 -0.003337 0.001960 -0.000640 -0.000863 0.000471 
+0.000145 0.001428 -0.002400 0.002394 -0.000445 -0.000984 
+0.003545 0.000538 -0.000917 0.000316 -0.000236 -0.000883 
+-0.001383 -0.001195 0.001230 -0.002146 -0.000646 0.001577 
+-0.000832 0.001039 -0.000438 0.000036 0.003066 -0.003859 
+0.000498 0.000809 -0.007095 -0.000844 0.000433 -0.003619 
+0.001324 -0.000083 0.001351 0.005622 0.001593 0.000495 
+0.005650 0.002358 -0.004090 0.001105 0.002478 -0.005329 
+-0.003312 0.002208 -0.002290 -0.000713 0.000893 0.001815 
+0.005668 0.003401 -0.001323 0.002526 -0.002684 -0.005764 
+0.000779 0.004422 -0.010387 0.000185 0.002863 -0.004402 
+-0.001120 0.001742 0.005238 0.001097 -0.001209 0.010782 
+0.001846 0.003226 0.002541 -0.003384 -0.003490 0.002298 
+-0.008608 -0.051480 0.003008 -3.535088 -5.877193 0.543860 
+-3.941667 -5.383333 1.133333 -4.098305 -5.033898 1.461017 
+-3.565574 -3.852459 1.364754 -0.010999 -0.012004 0.006704 
+0.010319 0.012884 0.000235 0.004401 0.013426 -0.005789 
+0.007189 0.006715 -0.007602 0.003842 0.004122 -0.006861 
+0.002429 0.003014 -0.002497 0.000649 0.002948 -0.000039 
+-0.006409 -0.000753 -0.000848 -0.007040 -0.008385 0.003856 
+-0.003763 -0.001129 0.005508 0.002050 -0.002462 0.005738 
+0.005202 0.004980 0.003425 0.003618 0.002186 0.004193 
+0.001017 -0.000299 0.005202 0.002846 0.002587 0.002177 
+0.005022 0.006867 -0.005430 0.003113 -0.000703 -0.009072 
+-0.001807 0.001594 0.000264 -0.006235 0.006142 -0.000923 
+-0.006051 0.005092 0.002904 0.000299 -0.003956 0.002869 
+0.007165 -0.014987 -0.000175 0.019119 -0.021098 -0.001560 
+2.779412 -2.333333 -0.686275 3.469194 -2.279621 -1.052133 
+3.413408 -2.111732 -1.033520 0.023621 -0.010112 -0.002051 
+0.009429 -0.007919 -0.000705 -0.003397 -0.004649 0.001902 
+0.000441 -0.000980 0.001287 0.001575 0.001728 -0.005611 
+-0.000611 -0.006618 -0.000934 -0.000174 -0.015518 0.002594 
+0.000193 -0.009284 0.009266 -0.005641 -0.002409 0.007740 
+-0.007666 -0.001306 0.005424 -0.008078 0.001405 0.003262 
+-0.005556 -0.002562 0.002715 0.001430 -0.000366 -0.000372 
+0.004265 -0.001872 0.000657 0.002362 -0.001145 -0.000482 
+-0.001252 -0.001032 -0.001224 -0.002529 -0.000628 -0.002181 
+-0.001481 -0.000557 -0.001041 0.002212 -0.000101 0.000289 
+0.002924 0.002924 -0.001462 0.003833 0.003086 -0.002553 
+0.001558 0.003672 -0.002348 0.001562 0.003149 0.001403 
+0.000120 0.000235 0.000256 -0.001243 -0.002485 -0.002294 
+-0.002301 -0.002522 0.000565 -0.001110 -0.000366 0.001329 
+-0.000815 -0.000155 0.000621 -0.000350 -0.001655 -0.002704 
+0.001120 -0.001886 -0.002413 0.000729 -0.002176 0.002140 
+0.002762 -0.001958 0.002762 -0.001590 -0.002365 0.002373 
+-0.002162 0.000674 0.001594 -0.004214 0.003201 -0.000375 
+-0.004140 0.002124 -0.000273 0.000823 0.005633 -0.001740 
+0.000785 0.007018 -0.006822 -0.005954 0.006673 -0.007255 
+-0.006020 0.001581 -0.009425 -0.004474 0.000154 -0.005561 
+-0.000427 0.005072 -0.001057 -0.000489 0.004447 0.001121 
+0.005143 0.006712 0.000349 0.000772 0.001796 0.001325 
+-0.016199 -0.013465 0.002937 -0.038182 -0.061720 0.011874 
+-4.365714 -5.554286 1.771429 -4.552727 -4.952727 1.709091 
+-4.438162 -4.180212 1.671378 -3.236967 -2.374408 1.146919 
+0.005657 0.005336 -0.003706 0.021560 0.012577 -0.014815 
+0.010648 0.004633 -0.010458 0.003156 0.000309 -0.003847 
+0.000441 0.004779 -0.001324 0.002607 0.005988 -0.004252 
+0.002456 0.007484 -0.002245 0.001273 0.001456 -0.000626 
+0.000645 -0.000955 -0.000159 0.001466 -0.000343 0.001534 
+0.003824 0.002234 -0.001883 0.003435 0.002178 -0.003796 
+0.003223 -0.000488 -0.002673 0.003102 0.002465 -0.001298 
+0.001685 0.003994 -0.000725 0.001151 0.007887 0.003050 
+0.005420 0.011827 0.004437 -0.001351 0.009601 0.000873 
+0.000901 0.000955 -0.002622 0.010270 -0.007371 -0.002509 
+0.018776 -0.014608 -0.003137 0.023769 -0.018838 -0.004585 
+2.605128 -1.953846 -0.989744 0.020179 -0.023748 -0.007486 
+0.011356 -0.007324 -0.015921 0.006825 0.005815 -0.005714 
+0.006587 -0.012490 -0.005940 0.011814 -0.012100 0.000530 
+0.013128 -0.006157 0.002671 0.016148 0.000810 0.002365 
+0.023908 0.005786 -0.001161 0.019913 0.006417 -0.012354 
+0.001988 0.007350 -0.005001 0.000831 -0.003420 -0.006322 
+0.001627 -0.002239 -0.007799 0.000026 -0.003207 -0.001734 
+-0.001479 0.001016 0.006149 -0.001315 0.004464 0.004810 
+0.000203 0.000386 0.000069 0.001195 0.000934 0.002354 
+-0.001557 -0.002824 -0.000779 -0.001247 -0.001903 0.000080 
+0.002706 0.001368 0.000972 0.006011 0.005382 -0.001270 
+0.006586 0.004157 -0.006856 -0.000799 0.003609 -0.006443 
+-0.001301 0.002212 -0.000786 -0.000152 -0.000189 0.004358 
+0.001954 0.000362 0.002738 0.000924 -0.002536 -0.001118 
+0.002472 -0.001875 -0.001545 0.001813 -0.001008 -0.001461 
+-0.000911 0.000519 0.000491 -0.002300 0.002242 0.003059 
+-0.002717 0.002957 0.001987 -0.000757 0.002160 0.000913 
+-0.000468 0.000260 0.000070 -0.000714 -0.001951 0.003658 
+-0.005091 -0.002542 0.005286 -0.003200 0.000784 -0.000078 
+0.003514 0.004722 0.000247 0.005881 0.004188 -0.000550 
+-0.002101 0.000287 0.000374 -0.015385 0.000730 0.001733 
+-0.020175 -0.002834 0.004065 -0.011669 -0.004608 -0.001466 
+-0.003310 0.000905 -0.004537 -0.001578 0.002319 -0.005632 
+0.001947 0.004194 0.001745 0.000979 0.006942 0.004985 
+0.000249 0.003344 0.003617 -0.006941 -0.033945 0.009240 
+-4.710280 -5.158878 1.803738 -4.870968 -4.718894 1.677419 
+-5.061151 -4.449640 1.766187 -4.657371 -3.764940 1.601594 
+-0.018254 -0.021301 0.008565 0.010300 0.007065 -0.012228 
+0.015817 0.001326 -0.003234 0.004938 0.002264 -0.002007 
+0.000255 0.002203 0.000479 -0.000632 -0.000109 0.000622 
+0.000199 0.000041 -0.000846 -0.001316 0.003266 -0.002546 
+-0.000956 0.001282 -0.000087 0.001215 -0.000142 -0.000235 
+0.003790 -0.001613 -0.000983 0.006196 -0.000992 -0.004263 
+0.006828 -0.001442 -0.005572 0.000779 -0.004803 -0.002077 
+-0.000448 -0.001206 0.001178 0.004508 0.003983 0.004235 
+0.001262 0.008463 -0.005239 -0.000709 0.008736 0.000350 
+0.003144 -0.002784 -0.002969 0.011279 -0.009617 -0.004296 
+0.020856 -0.013089 -0.002879 0.025294 -0.019178 -0.003378 
+0.025247 -0.019223 -0.010563 0.014792 -0.009968 -0.003120 
+0.004795 0.004438 -0.001817 -0.000671 0.003912 -0.002789 
+0.003477 0.000903 -0.001258 0.010396 -0.004515 -0.002546 
+0.010637 -0.009003 -0.002201 0.009553 -0.013300 -0.000974 
+0.015292 -0.011676 0.001079 0.022213 0.008000 0.005029 
+0.024654 0.011295 -0.006610 0.004784 0.007150 -0.006108 
+0.005932 0.002191 -0.005040 0.002847 -0.003249 -0.003744 
+-0.000772 0.003565 0.000836 -0.000293 0.008276 0.000842 
+-0.002833 0.006598 -0.000910 -0.001214 0.000000 -0.002000 
+0.001944 0.002809 -0.000071 0.000645 0.003409 -0.001918 
+0.003578 -0.000947 0.000503 0.003902 -0.001150 -0.003951 
+-0.001599 -0.000484 0.000448 -0.005421 -0.002491 0.007034 
+-0.006262 -0.003513 0.001527 -0.000744 0.002233 0.002792 
+0.004297 0.001001 0.002402 0.003861 -0.001067 -0.000030 
+0.001477 -0.004218 -0.002488 -0.001360 -0.005912 -0.006184 
+-0.002593 -0.004767 -0.004250 -0.003273 0.002153 -0.000482 
+-0.003898 0.007411 -0.006244 -0.002000 0.008035 0.002009 
+-0.005414 0.000090 -0.001536 -0.006480 -0.001527 0.006101 
+-0.003109 -0.002203 0.011229 -0.001408 0.003761 0.003898 
+-0.001882 0.000188 -0.001655 0.003298 0.006417 0.000970 
+0.007899 -0.004289 0.000095 0.017288 -0.003763 0.005928 
+0.029276 -0.002750 0.011414 4.053255 -0.455621 1.236686 
+4.521429 -0.192857 1.042857 0.032195 0.011766 0.017712 
+-0.000321 0.001049 0.001191 0.005049 0.009376 0.000714 
+0.011088 0.013192 -0.003149 0.005851 0.003274 -0.004629 
+-0.020674 -0.033145 0.009187 -4.647059 -4.098039 1.248366 
+-5.190476 -4.363636 1.415584 -5.203187 -4.151394 1.438247 
+-4.470874 -3.276699 1.004854 -0.015639 -0.016795 0.005784 
+0.009088 0.005374 -0.004995 0.009155 0.008894 -0.004370 
+0.000867 0.003533 0.001647 -0.008248 -0.000845 0.003172 
+-0.010710 -0.008009 0.003899 -0.011758 -0.005644 -0.000880 
+-0.003123 0.001138 -0.001429 0.005424 -0.002594 0.000868 
+0.011481 -0.000785 0.002356 0.009967 -0.002928 0.004106 
+0.009664 -0.000501 -0.002063 0.002690 0.000312 0.000863 
+-0.002496 -0.002129 0.003716 -0.000289 0.000772 0.004482 
+0.000654 0.002356 -0.001904 -0.001852 0.004315 -0.000258 
+0.000100 -0.000986 -0.000250 0.005648 -0.005730 -0.002679 
+0.013157 -0.009036 -0.003788 0.016743 -0.009776 -0.004839 
+0.012412 -0.002769 -0.002199 -0.001115 0.000522 0.006546 
+-0.008281 -0.001760 0.003295 -0.004799 -0.002326 0.000185 
+0.000465 0.002678 0.000375 -0.000354 0.004581 0.003902 
+0.002793 -0.001169 0.002264 0.002978 -0.007102 -0.003125 
+0.000284 -0.009752 -0.003981 0.000603 -0.000280 -0.000077 
+0.001838 0.009371 0.003675 0.004050 0.002061 0.002333 
+0.001487 -0.000041 0.002275 -0.000398 -0.000058 0.003040 
+0.001304 0.003119 0.003537 -0.003584 0.006022 0.001788 
+0.000449 0.003189 -0.002623 -0.002543 -0.000423 -0.000344 
+-0.002287 -0.000146 -0.003166 0.000507 -0.001989 -0.001592 
+-0.000069 -0.004081 0.000468 -0.000507 -0.004529 0.001186 
+-0.004315 -0.000724 0.004832 -0.003909 0.004451 0.003966 
+-0.004976 0.003729 -0.000025 -0.002793 0.000424 -0.000084 
+-0.000525 0.001695 0.001322 -0.001955 0.000431 0.001049 
+-0.002145 -0.002502 0.003038 -0.001947 0.000822 0.000995 
+-0.003208 -0.000361 -0.002804 -0.004125 0.001142 -0.001951 
+0.003886 0.007771 -0.006357 -0.007027 0.009018 -0.002186 
+-0.004414 0.004753 -0.002264 -0.000721 0.001356 0.001907 
+-0.001377 -0.001607 -0.002837 -0.005114 0.000927 -0.006406 
+-0.001391 0.000597 -0.000397 0.016890 -0.006488 0.007314 
+4.420455 -0.823864 0.250000 5.541850 -1.422907 1.475771 
+6.687023 -1.545802 2.412214 7.854962 -1.484733 2.980916 
+8.604445 -1.368889 3.204444 8.875740 -1.118343 3.384615 
+0.007704 0.001137 -0.003135 0.005764 0.007716 -0.002767 
+0.006221 0.009354 -0.001027 0.004294 0.006831 -0.000234 
+-0.008326 -0.015867 -0.004313 -0.042332 -0.038193 0.007816 
+-5.210191 -4.286624 1.089172 -5.567442 -4.102325 1.269767 
+-5.529412 -3.819005 1.280543 -4.828571 -3.017143 0.822857 
+-0.015467 -0.009009 0.004224 0.013348 0.011846 0.004338 
+0.005770 0.013369 -0.002551 0.000364 0.002841 0.002234 
+-0.000195 -0.000652 0.000199 -0.004794 -0.000687 0.001252 
+-0.001732 0.000170 -0.000832 0.003117 -0.000142 0.001948 
+0.000505 -0.002065 -0.000080 0.004145 0.002281 -0.005474 
+0.004027 0.004602 -0.004027 -0.005269 0.000441 -0.005058 
+-0.005046 -0.001400 0.001301 -0.003931 0.001352 0.001414 
+-0.005103 0.005127 0.000985 -0.005869 0.005976 0.000411 
+-0.002117 0.001442 0.000166 0.003517 -0.003822 -0.001002 
+0.006114 -0.004499 -0.000949 0.001856 0.000623 0.003442 
+-0.005968 0.001244 0.010423 -0.004998 -0.001317 0.014678 
+-0.006507 -0.000624 0.009759 -0.009391 -0.002374 0.005230 
+-0.005979 -0.002633 0.004452 0.002569 0.000824 -0.000249 
+0.007874 0.004716 -0.003897 0.002272 0.000367 -0.006505 
+0.002230 0.003553 0.002566 0.001691 0.013318 0.002996 
+0.002539 0.015543 0.000440 0.001837 0.008851 0.001006 
+0.000958 0.001946 0.001805 0.000824 0.001192 0.000708 
+0.001111 0.001419 0.001677 0.003334 0.001817 0.000558 
+0.002338 0.000906 0.000151 0.001689 0.000197 -0.001018 
+0.002164 -0.001534 -0.001380 0.000231 -0.001437 0.002626 
+-0.001355 -0.000068 0.001061 -0.000497 0.000199 0.001293 
+-0.002331 0.003706 -0.001700 -0.004591 0.008449 -0.003626 
+-0.004172 0.007587 -0.004806 -0.003762 0.001961 0.000410 
+-0.003539 -0.004832 0.003843 -0.000257 -0.004387 0.006604 
+0.002359 -0.000911 0.003336 -0.000201 0.001897 0.002119 
+-0.005207 0.000140 0.001827 -0.000588 0.000329 -0.003098 
+-0.004602 0.004600 -0.004604 -0.002461 0.000352 -0.001581 
+-0.002077 0.000657 -0.000983 -0.006465 -0.003694 -0.004372 
+-0.014491 -0.000351 -0.005910 -0.010745 0.000311 -0.006593 
+0.006519 0.002430 0.004489 0.026572 -0.003849 0.011791 
+4.287081 -1.239234 1.593301 5.653680 -1.632035 2.177489 
+6.991803 -1.577869 2.659836 7.883019 -1.207547 2.879245 
+7.919580 -0.779720 2.902098 7.478261 -0.347826 2.989130 
+0.005102 0.004508 0.000722 0.004741 0.002529 -0.001011 
+0.002195 0.004337 0.000388 0.003421 0.005590 -0.001005 
+0.003286 0.002280 0.001293 -0.009414 -0.032660 -0.005655 
+-0.050423 -0.040854 0.005170 -5.671429 -4.207143 0.957143 
+-5.828877 -3.711230 1.037433 -5.287958 -2.937173 0.869110 
+-3.548780 -1.225610 0.030488 -0.003753 0.003844 0.002639 
+0.010295 0.005184 0.001791 0.000349 0.006879 0.001568 
+0.010826 0.003937 -0.005482 0.004889 -0.000235 -0.000941 
+-0.000902 0.000752 0.000301 -0.006438 0.000216 0.002532 
+-0.013187 0.000283 -0.001868 -0.015335 -0.001005 -0.001493 
+-0.011198 -0.001571 -0.001517 -0.001732 -0.000416 0.000015 
+0.007429 -0.000162 0.001053 0.009574 0.002820 -0.000033 
+0.004454 0.005403 -0.000021 -0.000517 0.004391 0.000500 
+-0.003064 0.002708 0.000570 -0.003546 0.002560 0.000766 
+-0.003757 0.004285 0.003202 -0.006354 0.006842 0.005202 
+-0.003158 0.010750 0.003178 0.004413 0.003708 0.001198 
+0.006339 -0.009450 0.001392 0.001509 -0.014784 0.001671 
+-0.000095 -0.010779 0.001541 -0.000710 -0.003588 0.000558 
+0.004294 0.001445 -0.001512 0.008902 0.004223 -0.005213 
+0.004766 0.004234 -0.006941 0.002558 0.009826 -0.000349 
+0.000541 0.007295 -0.000284 -0.000273 0.003013 0.000798 
+-0.000492 -0.000251 -0.000719 -0.000161 0.002721 -0.002781 
+-0.000103 0.005191 -0.003788 0.001223 0.005115 -0.004670 
+-0.000907 0.002684 -0.002594 0.002845 -0.002848 -0.001428 
+0.004859 0.002852 -0.001727 0.001355 -0.001296 -0.000118 
+-0.005013 -0.004044 0.000800 0.000101 -0.007402 0.000907 
+-0.006373 -0.003252 -0.003983 -0.006662 0.002726 -0.001402 
+-0.002650 0.001363 -0.002828 0.000907 -0.000168 -0.000012 
+0.001694 0.000321 0.001986 -0.000400 0.000225 0.001226 
+-0.000705 -0.002032 0.001451 -0.003293 -0.001690 0.001386 
+-0.001092 0.000685 0.002103 -0.000950 0.001150 -0.000415 
+0.005336 0.005634 -0.004179 0.006845 0.006725 -0.006123 
+0.003213 0.000913 0.000324 -0.009514 -0.002474 0.000190 
+-0.012448 0.000182 -0.007843 -0.006643 0.002778 -0.002249 
+0.006611 0.004396 0.000241 0.011285 -0.003847 -0.001811 
+0.017313 -0.007449 0.006040 0.027840 -0.005324 0.008169 
+0.040705 0.002387 0.006012 5.000000 0.376068 0.752137 
+5.444445 0.372549 1.307190 5.304124 0.298969 1.711340 
+-0.000140 -0.000620 0.000279 0.000008 -0.004862 0.004910 
+-0.002458 -0.000351 0.002889 0.004137 0.003061 -0.003582 
+0.010528 0.010025 -0.006262 0.008454 0.005543 0.001995 
+-0.001934 -0.033404 0.002845 -0.046804 -0.031659 -0.001934 
+-5.792079 -2.920792 0.267327 -5.813793 -2.358621 0.379310 
+-5.154762 -1.916667 0.380952 -3.753012 -1.228916 -0.156627 
+-0.013691 -0.002918 0.003129 0.004940 0.003889 -0.002346 
+0.010237 0.001628 -0.007168 0.008872 0.000687 -0.003240 
+0.002983 -0.001799 -0.001194 -0.004756 -0.001299 0.002688 
+-0.009640 0.001922 0.010517 -0.004124 -0.005753 0.020230 
+0.010741 -0.016762 0.022776 2.318681 -1.653846 2.230769 
+3.053892 -1.497006 1.724551 0.033264 -0.012922 0.009264 
+0.027507 -0.010338 0.004980 0.015375 -0.007449 0.002014 
+-0.001955 -0.003771 -0.002466 -0.017715 0.003385 -0.005205 
+-0.020435 -0.000682 0.004089 -0.005399 0.007527 -0.001203 
+0.000821 0.002649 0.003082 0.003388 -0.001798 -0.001148 
+-0.000037 -0.005713 -0.004085 -0.001860 -0.008260 -0.003282 
+-0.000925 -0.003420 0.001195 0.002222 0.000430 -0.000767 
+-0.000597 0.002128 -0.001050 -0.000437 0.002143 -0.000122 
+0.001175 -0.000740 -0.000097 0.002298 -0.002314 0.001632 
+0.000440 0.000086 0.000408 -0.002116 -0.000190 -0.000459 
+0.000863 -0.000469 -0.001385 0.007496 0.002528 -0.004832 
+0.007598 0.003619 -0.007552 0.001785 0.000025 -0.006342 
+-0.003210 0.002038 -0.003326 -0.005061 -0.002598 0.000201 
+0.000259 0.000018 0.001727 0.001661 -0.000644 0.000212 
+0.000270 -0.000343 -0.001380 0.000178 0.001379 -0.000648 
+0.000000 0.001066 0.000902 -0.000680 0.000786 0.001092 
+0.000821 0.000068 -0.000772 0.000152 -0.000193 0.000043 
+-0.001374 0.000916 0.000000 -0.004194 0.001185 -0.000100 
+-0.002806 0.000810 -0.000697 0.000511 -0.001435 0.002859 
+0.005328 -0.000802 0.002164 0.008016 0.004358 0.001464 
+0.007496 0.006902 0.002556 0.007577 0.005364 -0.003022 
+-0.000154 -0.000467 -0.002790 -0.002712 0.001835 -0.001516 
+-0.009447 -0.003238 -0.003859 -0.006068 0.001344 -0.003869 
+-0.005060 0.004996 0.002387 -0.003494 0.004560 -0.000550 
+-0.005400 0.001988 -0.004591 -0.006656 -0.000268 -0.010708 
+-0.009713 0.002786 -0.019774 -0.016285 0.030235 -0.030776 
+-0.081883 0.036958 -0.030545 -0.034606 -0.011875 -0.009078 
+0.000048 0.000434 -0.000620 -0.001232 -0.004515 -0.001175 
+-0.002139 -0.001574 -0.002004 -0.000281 0.004437 0.001456 
+0.007306 0.008618 -0.003709 0.009517 0.009458 -0.001324 
+0.010816 0.005521 0.004612 0.007363 -0.004914 0.008025 
+-0.021717 -0.014861 0.009787 -0.040915 -0.034194 0.007832 
+-6.229358 -1.862385 0.623853 -5.719008 -1.471074 0.429752 
+-0.041809 -0.001559 0.003459 -0.019670 0.007754 -0.002840 
+-0.002296 0.008690 -0.007134 0.006894 0.003842 -0.006818 
+0.007197 0.001715 0.000581 0.007089 -0.003384 0.012435 
+0.016652 0.000171 0.021684 2.411765 -1.534314 3.651961 
+4.193676 -1.873518 3.403162 4.483272 -1.773234 2.814126 
+4.403433 -1.454936 2.154506 3.783626 -1.298246 1.637427 
+0.021590 -0.016046 0.015138 0.012879 -0.013459 0.005446 
+0.004004 -0.005378 0.004772 -0.018518 -0.010821 0.001860 
+-0.008547 0.000822 -0.003815 0.000058 0.002951 0.002770 
+0.003140 0.000998 0.003174 0.002106 -0.000401 -0.000650 
+0.000513 0.000059 -0.003213 -0.004071 -0.001706 -0.005091 
+-0.000179 -0.000256 -0.000322 0.004421 0.003728 0.004997 
+0.005278 0.004578 0.009480 -0.001969 -0.002432 0.002064 
+-0.005965 0.001213 0.000685 -0.002777 -0.001075 0.000472 
+0.000177 0.000430 -0.000492 -0.000496 0.001817 0.000888 
+0.001632 -0.000539 -0.000548 0.003074 -0.001727 -0.001896 
+0.004827 -0.000645 -0.002997 0.006026 0.001663 -0.003112 
+0.003646 0.002769 -0.002215 -0.000034 0.000831 -0.002156 
+-0.001066 -0.001044 -0.001802 0.001538 0.000188 -0.001152 
+0.000990 0.004154 -0.001241 0.002564 0.005121 0.000362 
+0.000705 0.000050 0.000488 -0.001535 -0.005551 0.001890 
+-0.004846 -0.007557 -0.001128 -0.005597 -0.004802 -0.002952 
+-0.003009 -0.001212 -0.001410 0.001654 0.002151 -0.002689 
+0.004307 0.004772 0.000388 0.005345 0.003084 0.000266 
+0.003867 -0.000166 0.000433 0.000468 -0.002256 0.000140 
+-0.004913 -0.004899 0.004078 -0.000204 0.002279 0.004983 
+0.001241 -0.001457 0.001583 0.001874 0.000226 -0.000668 
+-0.001296 0.003319 -0.005291 0.001205 0.003047 -0.005094 
+-0.008579 0.005770 0.000436 -0.003522 0.008511 -0.000749 
+-0.003921 0.005018 -0.006744 -0.015525 -0.003451 -0.012868 
+-0.019651 0.007397 -0.009199 -0.011351 0.004809 0.000118 
+-0.011341 0.000804 0.005690 -0.023818 -0.006857 0.004638 
+0.000703 0.002422 -0.000391 0.002962 0.003885 -0.001385 
+0.005047 0.005307 -0.006473 0.004193 0.007181 -0.008177 
+0.003524 0.007626 -0.004223 0.008077 0.002994 -0.001379 
+0.012904 0.005393 -0.001866 0.017718 0.006871 0.000371 
+0.015827 0.005301 0.000552 -0.001042 0.001704 -0.000875 
+-0.026248 -0.002167 -0.005729 -0.046092 -0.000930 0.001010 
+-0.049770 -0.001464 0.000698 -0.039710 0.003788 -0.000232 
+-0.021031 0.011063 -0.003905 -0.002068 0.018925 -0.011161 
+0.004442 0.014970 -0.004396 0.016171 0.000095 0.015351 
+1.644809 -0.540984 3.590164 3.242424 -1.038961 3.731602 
+4.864754 -1.393443 3.463115 5.269767 -1.381395 2.790698 
+4.354037 -0.838509 1.813665 0.016490 -0.012796 0.003264 
+0.005310 -0.002837 -0.001995 0.005896 -0.001612 -0.001917 
+-0.000540 -0.008211 -0.000210 -0.002670 -0.001902 -0.002406 
+-0.003475 0.003387 0.000582 -0.004543 0.003027 0.000969 
+-0.004931 -0.003176 0.002539 0.000629 -0.002331 -0.000388 
+-0.001262 0.000238 -0.004005 -0.006326 0.002081 -0.006011 
+-0.006614 0.001549 0.000851 0.002113 0.004401 0.006565 
+0.003838 0.007225 0.005683 -0.001065 0.001981 0.009037 
+-0.006813 0.006580 0.002468 -0.007792 0.004512 0.004169 
+0.004312 0.007118 0.000827 0.003148 0.015981 -0.003531 
+0.009852 0.008136 0.000231 0.003848 -0.000509 -0.000646 
+0.001276 -0.002355 -0.000090 0.005944 -0.001285 -0.000469 
+0.011763 0.001576 -0.003392 0.013258 0.004060 -0.010680 
+0.009491 0.007691 -0.010560 0.008469 0.007934 -0.004030 
+0.004392 0.003215 -0.002873 0.001370 -0.000895 0.001272 
+-0.002310 -0.003581 0.000087 -0.000550 -0.004622 -0.002382 
+0.003489 -0.004379 -0.002379 0.006155 -0.003721 0.000399 
+0.007217 0.000004 0.001010 0.005721 0.004369 0.001161 
+0.002621 0.004417 0.000509 -0.002206 0.001709 0.000748 
+-0.006758 -0.002036 0.001278 -0.002686 0.001118 0.000775 
+-0.004474 -0.002062 -0.003360 -0.004702 -0.001383 -0.001303 
+-0.003042 0.001998 0.001247 -0.000129 0.006667 0.000386 
+-0.003282 0.001737 -0.002632 -0.004780 0.002301 -0.002249 
+-0.002348 0.002060 0.000115 0.005299 0.003275 -0.001531 
+0.007971 0.001826 -0.005891 0.003964 0.000058 -0.006068 
+-0.001321 -0.000493 -0.002207 -0.002972 0.001158 0.000566 
+-0.000938 0.001210 0.002555 -0.005654 0.000544 0.005011 
+0.002342 0.000544 -0.001411 0.002919 0.003786 -0.001800 
+-0.000945 0.003386 -0.000945 0.003165 0.001579 -0.007898 
+0.000096 0.006098 -0.003989 0.001703 0.008021 -0.000010 
+0.007107 0.009106 0.002360 0.008913 0.011336 -0.000378 
+0.009033 0.011601 0.002383 0.008209 0.008212 0.002984 
+-0.001484 0.003073 -0.002838 -0.008378 -0.010581 -0.007766 
+-0.036748 -0.006964 0.010058 -0.042958 -0.007889 0.007962 
+-0.026598 -0.001035 0.001602 0.002159 0.013497 -0.000141 
+0.007356 0.010576 0.006705 0.016501 0.008521 0.020267 
+0.023624 0.000633 0.029911 3.211539 -0.551282 3.583333 
+4.290323 -1.104839 3.653226 0.032592 -0.020236 0.027068 
+0.002576 -0.002507 0.013636 -0.010858 0.001173 0.000605 
+0.002728 0.003692 -0.012382 0.009279 0.002640 0.002885 
+0.002915 -0.005639 -0.001514 -0.001544 -0.001148 -0.002055 
+-0.002633 0.003446 0.001653 -0.005868 0.002648 0.003735 
+-0.001407 0.000230 0.003106 -0.000308 0.000807 0.001242 
+-0.000824 -0.000088 0.001308 -0.000735 -0.001315 0.000376 
+0.002269 -0.001312 -0.001316 0.001512 -0.000426 0.000393 
+-0.000165 0.001205 -0.000409 0.000685 0.001592 0.005500 
+-0.003144 0.007143 0.003459 -0.012147 0.002348 0.007487 
+-0.001088 0.003373 0.003566 0.022474 0.012275 -0.012804 
+0.031911 0.029832 -0.018885 0.013382 0.011828 -0.007031 
+-0.012308 -0.001392 0.003204 -0.024256 -0.005823 0.005464 
+-0.024628 -0.004561 0.005290 -0.016030 -0.001029 0.002668 
+-0.005539 0.000010 0.000843 0.003071 -0.000531 0.001141 
+0.006200 0.001080 -0.001748 0.000504 0.000857 0.001266 
+-0.003669 0.000651 -0.003607 -0.000519 -0.001600 -0.007286 
+0.006314 -0.001689 -0.010412 0.009672 0.000036 -0.009597 
+0.008000 -0.000932 -0.003861 -0.000650 0.000229 0.000669 
+-0.010331 -0.000974 0.002433 -0.011895 -0.000778 0.001483 
+-0.006095 0.002570 -0.000529 -0.002179 0.002241 0.000664 
+0.004285 -0.000704 0.000048 0.005093 -0.000767 -0.003480 
+-0.001371 0.003262 -0.004062 -0.002627 0.006585 -0.004832 
+-0.001040 0.005116 -0.007884 0.007169 0.009335 -0.000253 
+0.000624 0.002688 -0.003919 0.001686 0.000503 -0.003120 
+0.003245 0.000709 -0.002456 0.003320 0.003370 -0.001118 
+0.004302 0.004302 -0.000853 0.003050 0.000359 -0.004805 
+0.005935 0.001795 -0.004538 0.001651 0.001478 -0.000343 
+-0.003625 0.003159 -0.002645 -0.002693 0.004059 -0.003958 
+-0.000989 0.002897 -0.002989 0.001027 0.000405 0.000046 
+0.003445 -0.001801 -0.002173 0.003982 0.000326 -0.002090 
+0.000694 0.000528 -0.001662 -0.001552 0.006070 -0.000193 
+0.000626 0.007312 0.000055 0.008110 0.006013 -0.001295 
+0.012631 0.006572 -0.002428 0.008658 0.003657 0.007197 
+-0.004975 -0.006155 0.011675 -0.021734 -0.011347 0.012583 
+-0.021524 -0.006763 -0.006466 -0.004780 -0.003313 -0.004733 
+0.002216 0.005196 0.000962 0.012807 0.003364 0.006882 
+0.013828 0.000321 0.012630 0.019145 -0.002860 0.012585 
+0.016946 -0.000246 0.007797 -0.003709 -0.003269 -0.002397 
+-0.006622 -0.007535 0.000777 -0.009304 -0.000798 -0.002243 
+-0.012261 0.003883 -0.001664 -0.003860 -0.001201 -0.004087 
+0.001209 -0.003471 -0.002133 0.002763 -0.002512 0.000338 
+0.002749 -0.001065 0.001129 0.000351 -0.000878 -0.000398 
+-0.002381 -0.002619 0.000548 -0.002329 -0.003442 0.000369 
+-0.001480 -0.001831 0.000196 -0.001549 -0.000320 0.000483 
+-0.004344 -0.002356 -0.000683 -0.004458 -0.005351 -0.003488 
+-0.000459 -0.004871 -0.002875 0.001473 -0.001618 0.001392 
+0.000037 0.003471 0.001025 -0.003790 0.005146 0.001962 
+-0.001801 0.002517 0.003335 0.003897 0.001142 -0.002044 
+0.013473 0.000127 -0.012458 -0.001008 0.006615 -0.001598 
+-0.029490 -0.006592 0.017605 -4.379679 -1.010695 2.240642 
+-4.516129 -0.782258 2.217742 -4.215754 -0.527397 2.023973 
+-3.786713 -0.447552 1.930070 -3.214912 -0.684211 1.938596 
+-0.014909 -0.010142 0.024846 -0.007115 -0.003860 0.021196 
+-0.000613 -0.002271 -0.007259 0.007907 -0.004988 -0.004296 
+0.005091 -0.004348 -0.003070 0.005144 -0.004778 -0.004397 
+0.005320 -0.004637 -0.005313 0.003640 -0.004736 -0.005403 
+0.004179 -0.002902 -0.003435 0.003752 -0.000862 -0.001125 
+0.000167 0.000229 0.000191 -0.006929 0.001093 -0.001292 
+-0.012963 -0.000488 0.000592 -0.004690 -0.003055 -0.002132 
+-0.003000 0.001687 -0.001265 -0.004316 -0.000918 0.002731 
+-0.002487 0.002667 0.004642 -0.002869 0.001793 0.003228 
+0.000205 0.003575 -0.005175 0.005308 0.005734 -0.006360 
+-0.001301 0.002358 -0.001144 -0.000287 0.000465 -0.000317 
+0.000470 -0.000901 -0.000215 -0.000938 -0.001205 0.000222 
+-0.000889 0.000386 0.000510 -0.002319 0.000074 -0.001760 
+0.003088 -0.001287 -0.000225 0.002713 -0.001690 0.001899 
+0.001914 -0.001482 0.002054 0.000145 0.001080 -0.000323 
+0.000435 0.004281 -0.000447 0.003707 0.001862 0.000719 
+0.001396 0.001005 0.002906 -0.001120 -0.000050 -0.000048 
+0.001872 0.004397 0.000176 0.009681 0.005783 -0.000718 
+0.012051 0.004225 0.001131 0.006192 0.000088 0.007025 
+-0.002734 -0.005273 0.008313 -0.007206 -0.005441 0.006000 
+-0.003561 -0.002429 -0.000345 0.002884 -0.003307 -0.001669 
+0.001317 -0.001405 0.001971 0.001358 0.000331 0.000241 
+-0.002988 0.004961 0.000619 -0.009538 0.005180 -0.002557 
+-0.005334 0.006874 -0.001363 0.001822 0.005627 -0.008028 
+-0.008812 0.004836 0.005147 -0.013614 0.009159 0.012029 
+-0.013158 0.007430 0.003886 -0.008000 0.001333 -0.003333 
+-0.002870 -0.001380 -0.003118 -0.001233 -0.000172 -0.000744 
+-0.001289 -0.002826 -0.000819 -0.001901 -0.004754 -0.000395 
+-0.000237 -0.002950 -0.001523 0.002164 -0.000370 -0.003018 
+0.003458 0.000493 -0.002202 0.001907 0.001181 0.000137 
+-0.000697 0.000567 0.000554 -0.000540 -0.002117 -0.002166 
+-0.000131 -0.002632 -0.003179 -0.000775 -0.001572 -0.002456 
+-0.001912 0.000892 -0.002158 -0.000581 0.004723 -0.001141 
+0.001162 0.005014 0.000099 0.002112 0.003783 0.000596 
+0.006176 0.003796 -0.000348 0.000182 0.003454 -0.007610 
+-0.015891 -0.001918 0.015043 -4.703030 -0.860606 2.496970 
+-5.775934 -0.863071 3.037344 -5.741935 -0.516129 3.241935 
+-5.326087 -0.279503 3.515528 -5.055118 -0.472441 3.964567 
+-5.668965 -3.089655 4.993104 0.002972 -0.020368 0.025617 
+0.023260 -0.003458 -0.000344 0.015438 0.010933 -0.000544 
+0.001479 0.008566 0.002978 0.003608 -0.005963 -0.000603 
+0.007515 -0.012098 0.001289 0.009480 -0.001193 -0.002716 
+0.006612 0.004857 -0.001075 0.003745 0.005483 0.002117 
+0.001997 0.002936 0.001543 -0.004120 -0.003362 0.000257 
+-0.002165 0.000741 -0.003343 -0.002645 0.006898 -0.000555 
+0.000183 0.008491 0.002275 -0.002403 0.001933 0.004597 
+-0.004924 0.001127 0.009493 -0.002025 -0.000167 0.003761 
+0.003749 -0.002316 -0.002787 0.003783 -0.006078 -0.004244 
+0.000525 -0.001785 -0.000923 0.000648 0.007417 0.001502 
+0.003895 0.008788 -0.002283 0.000344 0.006855 -0.000206 
+-0.002067 0.004116 0.004600 -0.006058 0.005254 0.003753 
+0.003624 0.000987 -0.003298 -0.000116 -0.001082 -0.001681 
+-0.005696 -0.003918 -0.001748 -0.005417 -0.002590 -0.000824 
+-0.000092 0.001066 -0.000446 0.003235 0.003044 0.001143 
+0.000938 0.000188 -0.000542 -0.001543 -0.001739 0.000773 
+-0.000471 -0.001169 0.000140 0.004692 -0.000876 -0.001529 
+0.006263 -0.000300 -0.002312 0.002402 -0.001874 -0.001458 
+-0.002955 -0.001416 -0.001836 -0.008500 0.000557 0.003797 
+-0.006280 -0.000579 0.004509 0.002165 0.000821 0.000033 
+0.004813 0.000227 -0.002017 -0.004059 0.000551 0.002576 
+-0.007760 -0.005010 0.004702 -0.004676 -0.001036 -0.000581 
+0.007584 0.004629 -0.010650 0.003255 -0.000258 -0.007870 
+-0.002409 0.001932 0.000674 -0.004806 0.001732 -0.001255 
+-0.001567 -0.002224 -0.004448 0.003685 -0.000989 -0.008766 
+0.000479 -0.000184 -0.004211 -0.001148 0.000969 0.000717 
+-0.002301 -0.003365 0.000938 0.000774 -0.002539 -0.001767 
+0.003356 -0.000004 0.000277 0.002295 0.005758 -0.001300 
+0.006131 0.005732 0.000318 0.008097 0.003608 0.000553 
+0.007131 0.000766 0.000786 0.005016 -0.001140 -0.000110 
+0.001902 -0.001414 -0.001393 -0.000826 -0.000691 -0.001372 
+-0.001003 0.000892 0.000438 -0.000638 -0.003641 0.002913 
+0.000938 -0.002062 0.000529 0.006191 0.002993 -0.003739 
+0.010959 0.002637 -0.005514 0.006904 0.000109 -0.001895 
+-0.005405 0.004336 -0.007483 -0.021497 -0.015443 0.005529 
+-5.088608 -0.360759 2.265823 -5.925287 -0.247126 3.770115 
+-6.077419 -0.096774 4.922581 -5.820755 -0.433962 5.688679 
+-0.030182 -0.003093 0.073574 0.033613 -0.017772 -0.013141 
+0.022765 0.012927 -0.006300 -0.010102 -0.010804 0.003538 
+-0.018676 -0.015186 0.012098 -0.005194 -0.004232 0.004659 
+0.002766 0.004983 -0.003470 0.001730 0.004669 -0.002904 
+0.002372 0.001843 0.002514 -0.001618 0.000982 0.003650 
+-0.005011 -0.000161 -0.002143 -0.000911 -0.003163 -0.004789 
+0.004649 -0.003676 -0.003699 0.004075 -0.002009 -0.002592 
+-0.000431 0.000443 -0.000598 -0.004295 0.003397 -0.002901 
+-0.005743 0.001724 -0.008757 -0.000744 0.002009 -0.006745 
+0.002403 0.000462 0.000060 0.002252 0.000875 0.003335 
+0.001055 0.000011 0.002678 0.000052 0.004033 0.001220 
+0.005673 0.007030 -0.001991 0.003178 0.002326 -0.001163 
+-0.003632 -0.000499 0.002695 -0.003814 -0.001040 0.005149 
+0.001317 0.001583 -0.001846 -0.002045 0.001953 -0.004368 
+-0.003333 0.003407 -0.003704 -0.002981 0.001734 -0.000353 
+-0.001125 -0.002493 0.002090 0.000401 -0.000433 -0.000771 
+0.003054 -0.000020 -0.002234 0.001728 -0.002101 -0.000803 
+-0.001076 -0.005442 0.000559 0.002348 -0.005987 0.002290 
+-0.000307 0.000965 0.002682 0.000472 0.000788 0.001325 
+-0.000187 0.000252 0.000354 -0.003173 0.000186 -0.000891 
+-0.003945 -0.000381 -0.002736 -0.007121 0.000417 -0.001226 
+-0.004410 -0.003334 0.000344 -0.003685 -0.003773 0.003396 
+-0.003759 -0.003715 0.008808 0.000625 -0.003542 0.009928 
+0.002804 -0.004052 0.006314 0.003067 -0.002339 0.003173 
+0.000959 -0.001795 -0.002023 0.002046 -0.001310 0.000074 
+0.003578 0.001515 -0.000171 0.000052 -0.000290 0.000131 
+0.002161 -0.000071 -0.001852 0.000200 0.000862 0.000426 
+0.001019 0.000466 0.000525 0.002263 -0.000438 -0.000718 
+-0.001295 -0.001364 -0.000939 -0.001007 0.000576 0.000432 
+-0.000246 0.000434 -0.000163 0.001672 0.001812 -0.001316 
+0.001177 0.001240 -0.000166 -0.000415 0.000075 -0.000222 
+-0.000236 0.000724 -0.000156 0.001789 0.001254 -0.001386 
+0.000034 0.000238 -0.000518 0.000787 -0.000868 -0.001072 
+0.003614 0.003820 -0.005614 -0.000754 0.000103 -0.006171 
+0.007147 0.001220 -0.003188 -0.000351 -0.001153 -0.000802 
+-0.005462 -0.001956 0.005569 -0.016796 0.008349 0.001711 
+-0.022105 0.004403 0.007430 -0.024220 0.005960 0.021036 
+-0.021049 0.007118 0.031104 -0.002238 0.002036 0.002192 
+0.022660 0.011445 -0.009524 0.006399 0.008351 -0.004483 
+-0.004770 -0.000594 0.003726 0.000660 -0.002200 0.003929 
+0.005235 -0.000770 -0.003402 0.005071 0.001327 -0.005632 
+0.001725 0.000497 -0.001616 -0.000325 0.004670 0.001373 
+-0.000595 0.006117 0.004305 0.001073 0.003666 0.002740 
+0.001685 0.001460 0.001079 0.003388 0.001143 0.000725 
+0.004417 0.000804 0.000780 0.002563 0.000722 0.001897 
+-0.000682 0.001243 0.000814 0.000117 -0.000342 -0.002083 
+-0.004852 0.002296 -0.004852 0.000070 -0.001360 -0.001401 
+-0.001792 0.000815 -0.002362 -0.000891 -0.000484 -0.000990 
+0.001456 -0.000725 -0.000815 0.004395 0.000789 -0.000007 
+0.004225 0.002746 -0.000016 0.000460 0.002037 0.001091 
+-0.001527 0.001063 -0.001930 -0.001825 0.000000 -0.000556 
+-0.002718 -0.002213 0.000622 -0.000684 0.001483 -0.002666 
+-0.000215 0.006711 -0.002428 -0.001280 0.005120 -0.006640 
+-0.000131 0.005409 -0.001032 0.001183 0.003664 -0.001183 
+0.000651 0.003021 -0.000104 0.001229 0.001218 0.000718 
+0.001993 -0.000315 -0.000695 0.000800 0.000720 -0.000960 
+0.001077 0.002453 -0.001453 -0.001792 0.002208 -0.000576 
+-0.000174 0.000507 0.000542 -0.000165 -0.000291 -0.000016 
+-0.000583 -0.000193 0.000317 -0.003822 0.000585 0.001345 
+-0.007674 0.000584 -0.002415 -0.007922 -0.005925 0.000982 
+-0.001954 0.000461 -0.002395 -0.000948 -0.000144 -0.003799 
+-0.001137 0.001137 -0.003402 -0.003711 -0.000849 -0.000671 
+-0.000267 -0.003047 -0.002669 -0.000335 -0.000650 0.000201 
+0.000701 0.000934 -0.002160 -0.000205 0.000808 0.000855 
+0.000155 -0.000762 -0.000542 0.001122 -0.002032 -0.001049 
+0.001123 -0.000342 -0.000250 0.000604 0.002050 0.000976 
+0.000608 0.002324 0.001107 -0.000130 0.000727 0.000364 
+0.000195 -0.001470 0.000045 0.000021 -0.003324 0.001229 
+-0.000643 -0.003780 0.001761 0.000166 -0.000539 0.000697 
+0.002909 0.002967 -0.001796 0.005872 0.001276 -0.002094 
+0.002734 0.001612 0.002432 0.001367 0.004478 0.000228 
+-0.003382 0.000955 0.001798 -0.004322 -0.002511 0.003524 
+-0.003681 -0.000987 0.001085 0.001507 -0.001177 -0.002116 
+0.003018 0.001017 -0.005786 0.002553 0.003950 -0.005846 
+-0.001625 0.004961 -0.005424 0.010997 0.006669 -0.002782 
+0.000676 0.005799 -0.006879 -0.002692 0.000764 -0.003217 
+-0.003731 -0.000665 0.002008 -0.001384 -0.000281 0.002896 
+-0.000410 0.000343 -0.000208 -0.000785 0.001268 0.000942 
+-0.000505 0.004018 0.002495 -0.003025 0.004687 0.003338 
+-0.005590 0.005454 0.002064 -0.003805 0.005758 0.001661 
+-0.003463 0.003506 0.001307 0.000722 0.000440 -0.000259 
+0.001687 -0.003021 -0.001135 -0.002003 -0.003043 -0.004977 
+0.000166 -0.001767 -0.001689 0.001593 0.001904 -0.001783 
+0.001336 -0.001934 0.002565 -0.002776 -0.002487 0.001839 
+-0.000396 -0.000047 0.001664 -0.002194 0.003027 -0.000610 
+0.000137 0.003050 -0.000616 -0.000106 0.000251 0.000244 
+0.000548 -0.000304 0.000185 -0.000043 0.000269 0.000007 
+0.000344 0.002949 -0.001075 0.000352 0.004044 -0.001005 
+0.000198 0.003321 -0.000233 0.000989 0.002714 -0.000578 
+-0.005406 0.001044 -0.002647 -0.004236 0.001739 -0.003488 
+-0.001491 0.002267 -0.001749 0.000377 0.001340 -0.000291 
+-0.000459 0.000325 -0.000703 -0.002128 0.001909 0.000943 
+-0.002157 0.004653 0.000163 -0.001235 0.004939 -0.000744 
+0.000940 0.002821 0.000940 -0.000666 0.000544 0.002874 
+0.000241 0.001025 0.002177 0.001344 0.004416 -0.000764 
+-0.000974 0.004306 -0.001540 0.005118 0.002328 -0.001485 
+-0.001117 -0.000881 -0.000005 -0.005162 -0.003907 0.002300 
+-0.002465 -0.001877 0.001333 0.002679 0.001126 -0.002087 
+0.002931 -0.000102 -0.001936 -0.001953 0.000972 0.000103 
+0.001306 -0.000963 0.003146 0.001773 -0.002319 0.003454 
+-0.000924 -0.000190 -0.000187 0.000088 -0.000714 -0.000256 
+-0.003758 0.000871 -0.001679 -0.006562 0.001400 -0.000078 
+-0.005646 0.000311 0.000105 -0.002537 -0.001200 -0.000327 
+0.000947 -0.001055 -0.000698 0.000729 -0.000365 -0.000850 
+-0.000705 -0.000526 0.001158 0.001013 -0.000725 0.002414 
+0.000293 0.000412 -0.000218 0.002290 0.000662 -0.001161 
+0.000887 -0.000196 -0.000067 -0.000214 -0.001437 0.000161 
+-0.000437 -0.000853 0.000093 -0.000067 0.001902 -0.000723 
+0.000648 0.004324 -0.001874 0.000367 0.005315 0.000430 
+-0.003102 0.003661 0.001065 -0.006701 0.000087 0.000288 
+-0.006159 -0.003267 -0.000636 -0.002224 -0.001483 0.000072 
+0.003790 0.001840 -0.002106 0.007935 0.005466 -0.002554 
+0.010491 0.005113 -0.006330 0.007824 0.004837 -0.014908 
+0.006494 0.010065 -0.009416 0.004660 0.007833 -0.006967 
+0.000855 0.002407 -0.004714 -0.000030 0.000117 0.001239 
+0.000051 0.000494 0.001054 -0.000232 -0.000388 -0.000605 
+0.000227 -0.000650 -0.000841 0.000121 -0.000100 -0.000193 
+0.000034 0.000408 0.000680 0.000408 0.000365 0.000138 
+0.000458 -0.001173 -0.000413 -0.001188 -0.003565 -0.001485 
+-0.000911 -0.001935 -0.001895 -0.001399 0.001312 -0.000865 
+-0.001276 0.002435 -0.003904 -0.000398 0.001595 -0.003999 
+0.000955 0.000291 -0.001369 0.000515 -0.001137 0.000783 
+0.000051 0.003323 0.000651 -0.001507 0.000538 -0.000714 
+-0.001037 0.002139 -0.002267 0.000974 0.001433 -0.002444 
+0.000496 -0.000125 -0.001977 -0.000778 0.002149 -0.001233 
+-0.001697 0.001218 0.001008 -0.001411 -0.002465 -0.001235 
+-0.001526 -0.005664 -0.000787 -0.004474 -0.006775 -0.001662 
+0.002263 -0.003445 -0.002848 0.000874 -0.001774 -0.000673 
+0.000727 -0.001361 -0.000225 0.001527 -0.001037 -0.000194 
+0.002588 -0.000063 0.001263 0.000538 0.000846 -0.000538 
+-0.001210 -0.000423 0.002405 -0.000992 -0.002893 0.003058 
+-0.000041 -0.002038 0.002046 0.001503 -0.000644 -0.000677 
+0.001669 0.000056 -0.002230 0.001313 0.000293 -0.002103 
+0.003133 -0.000739 -0.000611 0.000929 0.002388 0.001060 
+-0.000562 -0.001343 0.001424 -0.000916 -0.004415 0.001665 
+-0.000783 -0.002965 0.002732 -0.000678 -0.000351 0.001587 
+-0.002590 0.000331 0.001012 -0.003850 0.000278 0.001093 
+-0.002903 0.000394 0.001984 -0.001391 -0.000096 0.000528 
+0.000013 0.000921 0.002571 0.000534 -0.000720 -0.000042 
+0.000177 -0.004179 -0.002125 0.000647 -0.004424 -0.001893 
+0.001327 -0.000014 -0.000280 0.001806 0.004595 0.000105 
+0.001454 0.005291 -0.000177 0.000403 0.002136 0.000099 
+-0.000747 -0.002383 0.001916 -0.002184 -0.003625 0.004880 
+-0.002630 -0.003524 0.004387 -0.002925 -0.001386 0.002276 
+-0.001450 0.000987 0.000144 0.001714 0.002151 0.000535 
+0.000956 0.002693 0.001533 -0.002089 0.002653 -0.000703 
+-0.001400 0.004912 -0.002981 -0.002294 0.003083 -0.000209 
+-0.000166 0.001254 0.000582 0.000944 -0.000752 -0.000404 
+0.000099 -0.002363 -0.001226 -0.001340 -0.001856 -0.000310 
+-0.001591 -0.000978 0.000858 -0.000638 -0.000256 0.000709 
+0.001410 0.000752 -0.001188 0.002112 0.001562 -0.001305 
+0.000487 -0.000821 0.001559 -0.003856 0.000394 0.000818 
+-0.001998 -0.001257 0.004037 0.000662 0.003441 0.000502 
+0.001385 0.006347 0.000559 0.002302 0.003574 -0.001194 
+-0.001960 -0.000420 -0.000724 -0.003437 0.000275 0.001054 
+-0.000233 -0.000078 0.000078 0.000914 -0.000305 -0.003594 
+0.000015 -0.000019 -0.006489 -0.001163 -0.004468 -0.004856 
+0.001312 -0.003893 -0.006500 -0.002419 0.001085 -0.004837 
+0.000534 0.002550 0.000603 -0.001008 -0.001448 -0.003567 
+-0.002283 -0.001611 -0.002380 -0.001624 -0.001094 -0.001906 
+0.003337 -0.000483 -0.001343 0.003535 -0.000975 -0.000156 
+0.001754 -0.001889 -0.000404 0.000153 -0.000448 -0.001646 
+-0.001564 0.000539 -0.002266 -0.001604 0.001022 -0.000879 
+-0.000168 -0.000867 0.000979 -0.000291 -0.004552 0.004084 
+-0.003977 -0.007994 0.005125 -0.004475 -0.002935 -0.002586 
+0.000662 -0.001691 -0.000074 -0.002468 -0.003762 -0.000780 
+-0.000837 -0.001069 -0.000239 0.004340 0.002685 0.002640 
+0.007695 -0.001328 0.000273 0.006875 0.001589 -0.000454 
+0.001797 0.001419 0.001014 -0.001318 0.000848 0.004473 
+-0.000385 -0.000469 0.002536 0.000115 0.000580 -0.001111 
+0.000515 0.000306 -0.001303 -0.000401 -0.000589 0.000491 
+0.000142 0.000396 0.001952 0.000083 -0.001150 0.000343 
+-0.000257 -0.002051 -0.001110 -0.002989 -0.003571 -0.000708 
+-0.003493 -0.003084 0.003538 -0.002040 -0.003676 0.001007 
+0.000045 0.000638 0.000124 0.001012 0.000971 0.000857 
+0.001588 -0.000588 -0.001401 0.000424 -0.000049 0.000141 
+-0.000130 0.000781 0.001079 -0.001517 0.001741 0.000820 
+-0.004016 0.002201 0.000097 -0.005854 0.000165 -0.000168 
+-0.003250 -0.001456 0.000667 0.002869 0.000658 -0.001134 
+0.005321 0.002332 -0.001913 0.003241 0.002993 -0.001955 
+0.001263 0.002106 -0.000682 -0.000241 0.000752 -0.000331 
+-0.000588 0.000578 0.000384 -0.000344 0.001131 0.000095 
+0.000818 0.001654 0.000324 0.000269 0.000443 0.000288 
+-0.000898 0.000142 -0.000700 -0.001058 0.000250 -0.000934 
+-0.001064 0.000462 -0.000858 -0.001027 0.000334 -0.000555 
+0.001662 0.001886 0.001008 0.004783 0.002504 0.000231 
+0.003465 0.000389 -0.000865 0.000573 -0.002628 -0.002088 
+-0.001961 -0.003189 -0.002590 -0.001617 -0.002338 -0.001692 
+0.000698 -0.001383 0.000421 -0.000223 0.002280 -0.001272 
+-0.002007 0.003384 -0.004222 -0.008555 0.001120 -0.002489 
+0.000040 0.000103 0.001895 0.001647 -0.000309 0.003140 
+0.005920 0.002714 0.002420 0.004360 0.000620 -0.001686 
+0.000242 0.000151 0.000588 -0.000594 -0.001097 0.000364 
+-0.000762 0.002286 -0.002032 0.000000 0.005038 -0.003008 
+-0.001043 0.000824 -0.001070 -0.000097 0.000018 0.000692 
+-0.000561 -0.003450 0.002410 -0.001125 0.000363 0.001051 
+0.003646 0.000535 -0.000619 0.002984 0.001238 0.000769 
+-0.001326 0.000869 0.000400 -0.001503 0.000606 0.000564 
+-0.001808 0.001808 -0.006538 0.000751 0.001425 0.000900 
+0.004284 0.004917 -0.004442 0.002127 0.002056 -0.004206 
+0.002231 0.002531 -0.004762 0.004254 0.004513 -0.006018 
+0.005598 0.002026 -0.002737 0.001096 0.000180 -0.000642 
+-0.001475 -0.002266 -0.000863 0.001432 -0.002978 -0.000515 
+0.003946 0.001252 -0.000361 -0.000717 0.000133 0.001227 
+-0.000226 0.000158 0.002645 0.000276 0.002520 0.000276 
+0.000328 0.003968 -0.000027 0.000579 0.003594 -0.000232 
+0.000444 0.002085 0.000598 0.001000 0.000507 -0.000127 
+0.002295 -0.000397 0.000949 0.000117 -0.002760 0.000804 
+-0.002306 -0.003048 0.005434 -0.000472 -0.006209 0.004684 
+-0.001909 -0.003474 0.001799 -0.002858 0.000495 -0.000220 
+-0.002995 0.002705 -0.000990 -0.001230 0.001672 -0.001427 
+0.000566 0.001395 0.000004 0.003005 0.003693 0.001448 
+0.001882 0.003633 0.002660 -0.000109 0.000659 0.000498 
+-0.002549 -0.001196 -0.002456 -0.003178 -0.001092 -0.003713 
+-0.002199 -0.000705 -0.003225 -0.000961 -0.000302 -0.001469 
+-0.002792 0.000246 -0.000229 -0.008661 -0.003936 0.001490 
+-0.004970 -0.002489 0.000827 0.002997 0.002235 -0.000422 
+0.004933 0.004478 -0.003863 0.000649 0.002181 -0.002969 
+0.000810 0.002041 -0.001596 -0.001370 0.001838 -0.000863 
+-0.001379 0.000000 -0.003448 -0.001833 -0.003190 -0.000485 
+-0.001615 -0.000720 -0.001281 -0.000528 0.001744 0.001610 
+-0.000942 0.000294 0.001579 -0.000439 -0.000332 -0.000185 
+-0.000426 -0.003042 -0.001178 -0.000848 -0.004018 -0.001561 
+-0.001518 -0.003259 -0.000884 -0.000019 -0.001311 -0.000318 
+0.002364 -0.000114 -0.000453 0.004564 0.001381 -0.000954 
+0.005533 0.002805 -0.001594 0.004829 0.001596 -0.000236 
+0.001243 0.000167 0.000621 -0.001625 0.000658 -0.001055 
+-0.001869 0.002436 -0.002239 0.001765 0.000960 -0.002535 
+0.002842 -0.001848 0.001622 0.003673 -0.001770 0.003673 
+0.001071 -0.002974 0.002870 -0.002000 0.000348 0.000348 
+-0.001749 0.003357 -0.002794 0.003111 0.005071 -0.003452 
+0.001466 0.000450 -0.000022 -0.002419 0.001423 0.001708 
+-0.002440 0.001986 0.000611 -0.000344 0.000468 0.000295 
+0.000520 -0.001436 -0.001564 0.000634 -0.002761 -0.002467 
+0.000809 -0.000257 0.000257 -0.000245 -0.000844 -0.002163 
+-0.000777 -0.000426 0.000877 -0.000295 0.000410 0.002295 
+0.005016 0.001672 -0.000078 0.005802 0.000009 -0.005826 
+0.004808 0.003154 -0.005808 0.001004 0.001697 -0.000675 
+0.000534 -0.001069 -0.001603 0.001808 0.001075 -0.001661 
+0.000430 0.000392 -0.000941 -0.001121 -0.001312 0.003226 
+-0.002993 -0.006232 0.004690 -0.006129 -0.004355 0.001774 
+0.001115 0.001739 -0.000223 0.002376 0.003513 -0.001342 
+0.001176 0.002646 -0.002792 -0.000078 -0.000543 -0.000310 
+0.003656 -0.001828 -0.000234 0.003415 0.000033 -0.001161 
+0.002035 0.002429 -0.000638 -0.001008 0.002252 -0.000551 
+-0.002307 0.000161 -0.001127 -0.001400 -0.000927 0.001341 
+-0.000681 -0.000926 0.004001 0.000834 -0.005384 0.004807 
+-0.003725 -0.006078 0.002451 0.001642 -0.003507 0.004925 
+-0.001018 -0.002591 0.000944 0.000821 0.000648 -0.000316 
+0.000573 -0.001603 0.000573 0.003090 -0.003964 -0.000999 
+0.001894 -0.002889 -0.000363 -0.000146 -0.000801 -0.000789 
+-0.001378 0.002664 -0.001433 -0.001902 0.004012 0.000419 
+0.001061 0.002433 0.004353 0.003508 -0.005566 0.005156 
+-0.005131 -0.010832 0.011536 -0.008004 -0.010397 0.006899 
+-0.004108 -0.002571 0.001995 0.004315 0.001991 -0.003222 
+0.005989 -0.000815 -0.005797 0.005050 -0.002085 -0.003321 
+0.003035 -0.000149 -0.000239 0.000950 0.002173 0.000267 
+-0.000129 0.001938 -0.000524 -0.000057 0.000090 -0.000132 
+0.000027 -0.002148 0.002328 -0.002290 -0.002264 0.003581 
+-0.003207 -0.002002 0.002029 -0.002664 -0.001891 -0.000294 
+-0.001732 -0.000275 -0.001622 -0.001207 0.003112 -0.000679 
+-0.000018 0.005733 0.001314 0.003882 0.004635 0.001615 
+0.007379 0.000096 -0.001388 0.005043 -0.002297 -0.003262 
+0.001268 -0.002167 -0.001592 -0.000259 -0.001112 -0.000435 
+-0.001887 -0.000252 -0.000509 -0.003523 0.000834 -0.000996 
+-0.002073 0.001794 -0.000543 0.001894 -0.000411 0.000112 
+0.006392 -0.000028 0.000737 0.005951 0.000669 0.001028 
+0.001382 -0.000209 0.001836 0.000697 -0.003566 0.003701 
+0.000031 0.000707 0.002888 -0.000428 -0.000965 0.000671 
+-0.000879 0.002372 -0.000516 -0.001819 0.002402 0.002814 
+-0.000792 -0.000566 0.003089 -0.000997 -0.000456 0.000855 
+-0.000937 0.000477 -0.002997 -0.001259 -0.000051 -0.006748 
+0.000107 0.000537 -0.007500 0.002511 -0.000497 -0.001203 
+0.000801 -0.000519 0.000241 0.001047 -0.000805 0.001208 
+0.000333 0.000281 0.000127 0.000902 0.000293 0.000235 
+0.005689 0.002431 -0.003258 -0.001578 0.001279 -0.000619 
+0.000303 -0.000040 -0.001273 -0.000141 -0.000507 0.000448 
+-0.000794 0.000525 -0.000315 -0.001909 0.000806 -0.000947 
+-0.001362 -0.001063 -0.000554 0.001527 -0.000534 0.001527 
+0.000531 0.000029 0.000027 0.001022 -0.000744 -0.000300 
+0.000757 -0.002291 -0.002369 -0.000157 -0.001409 -0.002441 
+0.001462 0.000340 -0.000575 0.001565 -0.002344 0.001248 
+0.000820 -0.002313 0.001088 0.002558 0.000348 0.003110 
+0.000545 0.001153 0.002211 0.000842 0.001535 -0.000231 
+-0.000629 0.000577 -0.000634 -0.000191 -0.000219 -0.000261 
+0.000275 -0.000986 -0.000249 0.000131 -0.000738 0.001345 
+0.000043 -0.001352 0.000972 -0.000305 -0.000852 -0.001037 
+0.000772 -0.001082 -0.002208 0.001097 -0.000990 -0.001969 
+-0.000941 -0.000477 0.001753 -0.008708 0.001278 0.002645 
+-0.011158 0.002684 0.008770 -0.003686 0.001476 0.010860 
+0.003844 0.002553 0.003717 -0.001270 0.001995 -0.000766 
+-0.003777 0.000884 0.001828 -0.001563 0.001364 -0.000399 
+0.004217 0.003730 -0.004145 0.007333 0.005116 -0.006179 
+0.004993 0.005157 -0.005587 0.002006 0.004857 -0.003018 
+0.001223 0.003867 -0.001175 0.001553 0.002694 0.000365 
+0.001369 0.001730 0.000565 0.000000 0.001442 -0.000304 
+-0.000381 0.002474 -0.000678 0.000422 0.003049 -0.001461 
+-0.001068 0.001238 0.000436 -0.003234 -0.001572 -0.002290 
+-0.001471 -0.005148 -0.001606 0.000781 -0.006588 0.001604 
+0.002684 -0.003723 0.004274 0.004523 0.000848 0.001799 
+0.001850 0.002679 -0.000777 -0.001185 -0.003544 -0.001111 
+-0.001863 -0.005316 -0.002662 0.002861 -0.002414 -0.002314 
+0.006009 -0.000268 0.000066 0.003171 -0.000562 0.000523 
+0.001951 0.000467 -0.005151 0.000997 -0.004519 -0.001883 
+0.001748 -0.002648 -0.001542 0.003577 0.000830 -0.000781 
+0.004058 0.004152 0.000377 -0.001768 0.004868 -0.000359 
+-0.001801 0.001797 -0.001939 -0.000629 -0.001001 -0.002533 
+0.006166 0.004933 -0.006166 0.002984 0.010363 -0.004395 
+-0.002724 0.009534 -0.002773 0.000703 0.004570 -0.003911 
+0.001460 0.002852 0.000200 0.000197 -0.000087 0.001007 
+-0.004300 -0.000873 0.001501 -0.005117 -0.000021 -0.001170 
+-0.002929 0.000576 -0.000494 0.001018 0.000226 -0.000152 
+0.000787 0.005853 -0.001295 0.002857 0.000000 -0.006015 
+-0.000253 0.005784 -0.001309 0.000211 0.000622 0.000365 
+0.000011 0.000575 0.001728 -0.000070 -0.000340 0.000543 
+-0.001094 0.002734 -0.001094 0.002351 0.005633 -0.003282 
+0.000506 0.000214 0.001271 0.002375 0.000140 0.003029 
+-0.000523 -0.001055 0.002277 0.000010 -0.001775 0.006490 
+-0.001102 -0.002441 0.006772 -0.000291 -0.001239 0.003940 
+0.000332 0.000216 0.001111 -0.000442 -0.000245 0.001818 
+0.001728 -0.002271 0.002764 0.003207 -0.003062 0.002481 
+0.004770 -0.000954 0.001575 0.000350 -0.000142 0.000060 
+-0.001601 0.000194 -0.001235 -0.000217 -0.000652 -0.000870 
+0.003502 0.000251 0.001209 0.007347 0.002271 -0.005377 
+0.004400 -0.000283 -0.007134 0.001819 -0.001295 -0.004706 
+0.000913 -0.002623 -0.002126 -0.000594 -0.003911 -0.000280 
+-0.000199 0.000190 0.000047 -0.001807 0.002707 -0.000140 
+-0.003131 0.003759 0.009702 0.001376 0.000805 0.001938 
+-0.002376 -0.004508 0.000548 -0.000002 -0.001101 0.000734 
+0.002526 0.004564 -0.003989 0.001762 0.008054 -0.005844 
+0.000985 0.007818 -0.005178 0.001030 0.005050 -0.004083 
+0.001082 0.003811 -0.003738 0.001673 0.005663 -0.003715 
+-0.000369 0.006154 0.000287 0.000136 0.002345 0.001059 
+0.000006 -0.004397 0.000829 -0.005489 -0.006881 0.002348 
+-0.004433 -0.002748 0.002744 -0.000843 -0.000907 -0.000359 
+-0.002157 -0.000534 -0.003372 -0.002553 -0.001423 -0.003663 
+-0.002894 -0.004739 -0.002447 -0.002307 -0.002191 -0.000154 
+-0.000170 0.001796 -0.002084 0.000594 0.000248 0.000040 
+-0.000066 -0.000704 0.002674 -0.001511 -0.005046 -0.000753 
+-0.001822 -0.005454 -0.002888 0.004068 -0.000944 -0.002022 
+0.008484 0.003587 -0.000620 0.003918 0.007216 -0.005322 
+-0.003633 0.001551 -0.005158 -0.003275 -0.001020 -0.003470 
+-0.000028 -0.000999 -0.000547 0.002237 0.000815 -0.000609 
+0.002432 0.001178 -0.001900 -0.002810 0.001736 -0.005455 
+-0.000856 0.005892 -0.002389 0.000231 0.003993 0.000307 
+0.003659 0.003411 0.001829 0.003102 0.004961 0.000001 
+0.002848 0.005582 -0.003829 0.002632 0.002259 -0.002731 
+0.000944 -0.000889 0.002889 0.001047 -0.001858 0.003643 
+-0.001647 -0.001022 0.001360 -0.003878 0.001170 -0.000244 
+-0.002999 0.001971 0.000786 -0.002390 -0.002071 0.005258 
+0.000937 -0.002430 0.003933 0.000667 -0.002258 0.000308 
+-0.000764 -0.002087 -0.000397 -0.001116 -0.001575 -0.001522 
+-0.000220 0.000000 0.001540 -0.002390 0.002060 -0.001754 
+-0.001048 0.002937 -0.002095 -0.002479 0.000965 -0.001193 
+-0.004086 0.004800 -0.003228 -0.004473 0.005541 -0.003405 
+-0.001565 -0.000683 -0.001998 -0.001005 -0.002199 -0.001885 
+-0.003092 -0.000768 -0.001818 -0.002094 0.001748 0.001293 
+0.001399 0.001166 0.002439 0.000274 -0.001660 0.001937 
+-0.000105 -0.000808 0.001265 -0.000865 0.003028 -0.000163 
+-0.000585 0.001112 -0.000333 0.000953 -0.000261 0.001717 
+0.001003 0.001606 0.003011 0.001559 0.002355 0.003551 
+0.003343 0.004355 0.001264 0.001072 0.004104 -0.000388 
+-0.000943 0.001431 0.000333 -0.000697 0.001046 0.001250 
+0.000645 0.001484 0.000258 -0.000671 -0.000302 -0.000560 
+-0.001580 -0.001951 -0.001308 -0.002441 0.001109 -0.001956 
+-0.002041 0.004041 -0.000326 -0.000091 0.004711 -0.002113 
+-0.000156 0.002015 -0.002804 -0.000340 0.001660 -0.003026 
+-0.000385 0.002379 -0.003739 0.000493 0.004045 -0.004075 
+0.001111 0.003912 -0.002441 0.001348 0.001033 -0.000561 
+0.001165 -0.000433 -0.000184 0.000954 -0.000824 0.002429 
+-0.000220 -0.000781 0.000507 -0.000254 -0.001033 0.000325 
+-0.000907 -0.001487 0.000025 -0.000735 -0.001107 0.000887 
+-0.001167 -0.000292 -0.000787 -0.000866 0.000204 -0.000051 
+-0.000350 -0.000017 0.000437 -0.000875 -0.000331 -0.000297 
+-0.001935 0.001257 -0.000029 -0.002459 0.003408 -0.000620 
+-0.002127 0.003459 -0.001259 0.000356 0.001395 0.000213 
+-0.000281 -0.003942 0.006468 -0.005039 -0.006020 0.000398 
+0.000119 -0.002797 -0.001406 0.001287 0.002079 0.001454 
+-0.000949 0.003331 0.002774 -0.003853 0.002385 -0.002485 
+-0.001792 0.001175 -0.005527 -0.001009 -0.000398 -0.002141 
+0.002209 0.002081 0.000685 0.000079 0.004729 -0.000094 
+-0.001140 0.005423 -0.000894 -0.002434 0.004523 -0.001174 
+-0.004388 0.002311 -0.001477 -0.004088 0.002372 -0.000244 
+-0.002984 -0.002364 0.005039 0.002367 -0.003180 0.001035 
+0.004180 0.000877 0.001729 0.003819 0.006365 -0.003310 
+0.003361 -0.000772 -0.005405 0.001134 -0.000912 -0.002516 
+0.000381 0.000627 0.001299 -0.002176 0.002259 0.005730 
+-0.004004 0.000119 0.005912 0.001052 0.001376 -0.000727 
+0.000184 0.004975 -0.004179 0.004979 0.003325 -0.003317 
+0.001469 0.001407 0.001150 0.000864 -0.001146 0.001308 
+-0.000160 -0.000604 0.001358 0.002018 -0.000176 -0.002145 
+0.003072 0.002684 -0.002108 -0.001868 -0.001214 -0.000337 
+-0.004061 -0.000779 -0.000472 0.000754 -0.001515 -0.004808 
+-0.001724 0.001284 0.000454 -0.004175 -0.002091 -0.000723 
+-0.003422 -0.003268 0.002489 -0.001098 0.000583 -0.000121 
+-0.002268 -0.000160 -0.000930 -0.001016 0.001692 -0.000212 
+0.001389 0.000347 0.000278 -0.000038 -0.001969 0.004519 
+-0.004083 -0.002037 0.004775 -0.002951 -0.001712 0.000878 
+0.001325 0.000509 -0.001409 -0.000385 0.001469 -0.000385 
+0.003178 -0.000101 -0.000447 -0.000310 -0.001068 0.000836 
+0.000721 0.000785 0.001106 0.002587 0.003559 -0.001079 
+0.004173 0.003058 -0.003441 0.000363 0.001035 -0.000776 
+-0.002269 -0.003268 0.000098 -0.003278 -0.002058 0.001219 
+0.000524 0.001555 -0.001950 0.001257 0.003687 -0.004871 
+-0.001285 0.003812 -0.002938 -0.003971 0.000909 0.000658 
+-0.003747 -0.002945 0.001231 -0.001123 -0.003385 0.000352 
+-0.000019 -0.000119 0.000003 0.000123 0.002695 0.000228 
+0.000799 0.001486 0.000553 0.000519 0.000774 -0.000294 
+0.001515 -0.001292 -0.000357 0.002103 -0.002331 -0.001840 
+-0.000269 -0.000269 -0.003308 0.001388 -0.001124 -0.002346 
+-0.000154 0.000768 0.000154 -0.000892 0.002436 0.000998 
+-0.000519 0.001072 0.001119 0.001699 0.000063 0.001480 
+0.001699 0.000403 -0.000016 0.000647 0.004577 -0.001067 
+-0.000828 0.007617 -0.000542 -0.002178 0.003796 -0.002904 
+-0.010057 -0.006842 0.000087 -0.011128 -0.006049 -0.005469 
+-0.005549 -0.001445 -0.002242 0.000171 0.002390 0.000761 
+0.003091 0.002053 0.000629 0.003896 -0.000604 0.000332 
+0.001354 -0.002765 -0.000944 0.000111 -0.001655 -0.005067 
+-0.001899 -0.002180 -0.001117 -0.001847 -0.002161 -0.003472 
+-0.002805 -0.004522 0.002177 -0.002830 0.000678 -0.001240 
+-0.002060 -0.001004 -0.002087 -0.003036 -0.002355 -0.003637 
+-0.001867 -0.005517 -0.001879 0.002781 -0.004196 0.000424 
+0.010765 -0.003061 0.001688 0.005233 0.006216 -0.006866 
+0.000382 -0.000297 -0.001181 -0.006308 0.000000 0.001231 
+-0.008296 -0.004681 0.003822 -0.009083 -0.003373 0.007082 
+-0.009375 -0.000713 0.000264 -0.001030 -0.002094 -0.000978 
+-0.000593 -0.001035 -0.000712 0.002727 0.001888 -0.004300 
+0.003061 0.000439 0.001233 0.001875 0.001204 0.000444 
+-0.000974 0.000141 -0.000280 -0.002070 0.001441 -0.001531 
+-0.000644 -0.000741 -0.003512 0.003642 -0.002209 -0.003573 
+0.002920 -0.000448 -0.002694 -0.001409 -0.001809 0.000053 
+-0.000012 0.000052 0.000008 0.001639 0.002132 -0.001186 
+0.002164 0.002863 -0.001228 -0.002031 0.000779 0.000487 
+-0.002321 0.000870 -0.000516 -0.000260 -0.000957 -0.001018 
+0.001022 -0.001789 -0.006525 0.003808 0.007159 -0.003427 
+-0.000390 0.001973 -0.002604 -0.000632 -0.004349 0.001696 
+-0.002204 -0.006975 0.003423 0.000357 -0.001257 0.003595 
+0.001179 -0.001046 0.001085 -0.000099 0.002802 0.002605 
+-0.003627 -0.000291 0.001423 -0.003508 -0.000692 -0.000485 
+-0.001244 0.001072 -0.001707 0.003714 0.002494 0.001364 
+0.005763 0.004064 -0.004903 0.003055 0.001441 -0.004554 
+0.002037 -0.000192 -0.002643 0.002591 0.001250 -0.000288 
+0.000599 0.000749 -0.000818 -0.001002 0.000705 -0.001076 
+-0.000121 -0.000027 -0.000522 0.002385 -0.000385 0.000999 
+0.003966 -0.001139 0.001964 0.004359 0.000471 0.001637 
+0.005209 0.003990 0.000097 0.003542 0.002020 -0.000128 
+-0.002367 -0.002002 0.000455 -0.009690 -0.007688 -0.001312 
+-0.011061 -0.007121 -0.001591 -0.000028 -0.002497 -0.002580 
+0.001628 0.000924 -0.002464 0.002567 0.005227 -0.002109 
+-0.002242 0.005042 -0.001010 0.001682 0.007187 -0.005587 
+0.005584 0.010610 -0.002720 0.005620 0.011387 -0.001460 
+0.003959 0.006425 -0.002042 -0.002456 -0.000965 0.000533 
+-0.006197 0.000157 0.003191 -0.007500 0.000777 0.003194 
+-0.008449 -0.001203 0.001712 -0.005705 -0.001282 0.000815 
+0.001425 0.002260 0.000034 0.006236 0.007456 0.002351 
+0.002716 0.008962 0.003081 0.000372 0.008210 -0.003361 
+-0.003212 0.001598 -0.004560 0.000681 -0.003343 -0.001423 
+-0.000928 -0.000649 -0.002582 0.000394 -0.001024 0.001638 
+-0.001139 -0.001942 0.000099 -0.001734 -0.002047 -0.001563 
+-0.000712 -0.001186 -0.002313 0.001192 -0.000657 -0.001617 
+0.003182 0.000039 -0.000349 -0.000188 0.000179 -0.001905 
+-0.000173 0.000196 0.001020 -0.000095 0.000969 0.001466 
+-0.001421 -0.000597 0.001077 0.000222 0.000004 -0.000532 
+0.000913 0.000495 0.000786 -0.000357 0.001062 -0.000708 
+0.001467 0.005198 -0.000482 0.005406 0.004814 0.000452 
+0.007946 0.002248 -0.000920 0.003299 0.004284 -0.000406 
+0.002529 0.001483 0.001009 0.001205 0.000714 0.000854 
+0.001828 -0.000198 -0.000128 0.002170 -0.000133 0.000257 
+0.000978 0.000949 0.001237 0.000262 0.002021 0.002001 
+-0.004984 -0.000016 0.002511 -0.001841 0.000230 0.001789 
+0.000084 0.000051 -0.000246 -0.002388 0.000415 -0.001003 
+-0.005156 -0.001774 0.001567 -0.004294 -0.002367 0.004046 
+-0.004405 -0.001185 -0.002444 -0.002821 -0.001802 -0.001134 
+-0.001612 -0.000895 -0.000506 -0.001554 -0.000486 -0.000467 
+-0.001561 0.000034 -0.001100 -0.000574 -0.000151 -0.000560 
+0.000811 0.002114 -0.000484 0.000287 0.000007 0.001591 
+-0.006349 -0.002411 0.002057 -0.000592 -0.002826 0.005033 
+-0.000813 -0.002021 -0.000558 0.000129 0.001442 -0.004102 
+0.000026 -0.001855 -0.003625 0.006187 -0.000576 0.000000 
+0.002887 -0.002839 0.000473 -0.000251 -0.000144 0.003019 
+-0.000570 -0.000614 0.001739 0.000983 0.000951 -0.001056 
+-0.000412 0.000349 -0.000400 -0.000838 -0.002046 0.004464 
+-0.000011 0.000007 0.006667 -0.002878 0.000113 0.001094 
+0.001740 0.005530 -0.001294 0.003352 0.005793 -0.005182 
+-0.002668 -0.001146 -0.002179 -0.004406 -0.002663 -0.001041 
+-0.004862 -0.001657 0.003399 -0.000047 -0.000030 0.003077 
+0.001102 0.000000 -0.001260 -0.001393 0.000479 -0.002940 
+0.000970 0.003558 -0.003477 0.005110 0.002297 0.000697 
+0.006715 0.000433 0.000305 0.005302 -0.001647 -0.001982 
+-0.000217 0.000502 -0.005015 -0.004258 0.000681 -0.003455 
+-0.005180 0.000603 -0.001557 -0.005064 -0.001112 0.000436 
+-0.005322 0.000246 0.003389 -0.004976 0.000922 0.002070 
+0.000593 0.002585 0.000750 0.008041 0.004524 0.002122 
+0.009975 0.006624 0.002584 0.006525 0.007475 -0.000070 
+0.000437 0.004412 0.000163 -0.004041 0.001394 0.001023 
+-0.003128 -0.000128 0.003256 -0.002857 -0.000548 -0.000137 
+-0.001806 0.001421 -0.000680 -0.003196 0.001107 0.002744 
+-0.002882 -0.001042 0.002436 0.001776 0.000146 0.000358 
+0.000523 0.001220 -0.003138 0.003269 0.001242 -0.003203 
+0.002017 0.000312 -0.001694 0.000302 -0.002569 -0.000665 
+-0.002257 -0.001660 -0.001469 -0.001790 0.000035 -0.002129 
+-0.002179 -0.000235 -0.001732 -0.003317 0.000683 -0.002249 
+-0.002069 0.001738 -0.000372 -0.003951 0.000484 -0.000995 
+0.000337 0.002430 0.001147 -0.001291 0.002583 0.003780 
+-0.000414 0.001201 -0.000292 0.001021 -0.000884 -0.002474 
+0.001035 -0.001158 -0.002648 0.002524 -0.000191 -0.003522 
+0.004049 -0.000308 -0.006406 0.006559 0.002068 -0.009198 
+0.000395 0.000513 0.001913 -0.001370 0.000075 -0.002669 
+-0.002636 0.000320 -0.001773 -0.003479 -0.000734 0.002909 
+-0.004955 -0.000239 0.002978 -0.003309 -0.001705 0.001677 
+-0.001463 0.001166 -0.000571 -0.002702 -0.001309 -0.001605 
+-0.000999 -0.001715 -0.000536 0.001754 -0.001069 -0.000733 
+0.003250 0.000629 -0.001688 0.001384 -0.000155 -0.001313 
+-0.001981 -0.003361 0.001436 -0.005059 -0.004723 0.000026 
+-0.002974 0.000668 -0.000522 -0.001544 -0.000119 -0.000079 
+0.001801 -0.000218 0.000024 0.004521 -0.000920 -0.000850 
+0.005912 0.000185 -0.003633 0.001635 -0.003736 -0.002217 
+-0.000156 -0.002214 -0.003002 -0.000253 -0.000023 -0.001380 
+-0.000514 0.000036 0.000747 0.002562 0.000891 -0.002514 
+0.003445 0.004607 -0.004033 0.000216 0.003485 -0.001961 
+0.000089 -0.000677 0.001799 -0.001129 0.000674 0.000676 
+0.002786 0.003308 -0.000647 -0.000711 0.003887 0.000167 
+-0.001494 0.001820 -0.000639 -0.001931 -0.000619 -0.002962 
+-0.002283 0.000602 -0.000972 -0.002134 0.000281 -0.001093 
+-0.001428 -0.000022 -0.001895 -0.001208 0.000027 -0.001866 
+-0.001053 -0.001702 -0.001098 -0.000603 -0.001310 -0.000851 
+-0.003147 0.001391 -0.000659 -0.002386 0.002208 -0.001904 
+-0.000017 0.001799 -0.003622 0.002266 -0.000260 -0.005224 
+0.000858 -0.000563 0.000086 -0.002069 0.001053 -0.001686 
+-0.002135 0.002486 -0.001585 -0.001345 0.002385 -0.001244 
+0.000065 0.001847 0.001695 0.002545 0.002143 0.001045 
+0.003814 0.003147 0.000632 0.002985 0.003287 0.000070 
+-0.000126 0.000201 0.000010 -0.002622 -0.003975 0.000628 
+-0.001767 -0.001808 0.001804 0.000386 0.000707 -0.004465 
+-0.000293 0.001518 -0.004451 0.000405 0.000527 0.000184 
+-0.000841 0.000097 0.003816 -0.001656 0.000722 0.001316 
+0.000124 0.004675 -0.001456 -0.000760 0.002607 -0.001386 
+-0.000871 -0.000266 -0.000754 -0.002568 -0.001439 0.000367 
+-0.000362 0.002021 -0.000404 -0.000053 0.002908 -0.002612 
+-0.002716 -0.000324 -0.000462 -0.006719 -0.005477 0.002629 
+-0.000744 -0.005574 -0.001446 -0.003727 0.001004 -0.000027 
+-0.000926 0.004082 0.001126 -0.001777 0.002546 -0.000025 
+-0.001499 0.001234 -0.000177 -0.002782 -0.006523 0.000480 
+0.001277 -0.001453 0.000396 0.001113 -0.000523 0.001882 
+-0.000149 -0.000199 0.000621 0.000696 0.002344 -0.001026 
+0.000193 -0.000960 -0.003160 -0.000911 0.000418 0.001270 
+-0.000823 -0.002726 -0.000391 -0.000084 0.000843 -0.001111 
+0.002323 0.002910 -0.004384 0.003085 0.003650 -0.001705 
+0.000857 0.004407 0.000214 0.001963 0.005214 -0.002174 
+0.003041 0.004978 -0.002212 0.002375 0.001904 -0.002853 
+0.000546 -0.000647 -0.001678 -0.000031 0.000639 -0.000976 
+0.001349 0.001347 -0.002029 0.000396 0.000396 -0.002374 
+-0.001798 0.000968 -0.000494 -0.000291 0.001220 0.000741 
+0.002587 0.002117 0.001155 0.003803 0.004331 -0.003908 
+0.000231 0.000917 -0.003216 -0.000224 -0.000784 0.001231 
+-0.002277 -0.002381 0.003323 -0.001626 -0.000773 0.001464 
+0.001136 0.002002 -0.001429 0.002265 0.003882 -0.000498 
+0.002936 0.002320 0.000734 0.003618 0.001179 0.000366 
+0.002992 0.000602 -0.000129 0.000762 0.000637 0.002170 
+-0.001948 0.000301 0.002283 -0.001964 -0.001135 0.001508 
+0.000556 -0.001422 -0.000757 0.002518 -0.000265 -0.002001 
+0.004016 -0.000445 -0.001174 0.003449 0.000226 -0.000075 
+0.001210 0.000759 0.000561 -0.001526 0.000194 -0.000475 
+-0.004330 -0.000654 -0.001049 -0.003885 0.001422 -0.002743 
+0.001253 0.001898 0.000498 0.000906 0.004579 -0.006510 
+0.004067 0.002280 -0.007790 0.003961 0.006191 -0.005201 
+0.000678 0.004812 -0.004150 -0.003032 0.002682 -0.000117 
+-0.003490 0.002605 -0.002665 -0.003961 0.001517 -0.001523 
+-0.001774 0.000607 -0.000043 0.002165 0.000714 -0.001153 
+0.004222 0.000857 0.002162 0.002519 0.001221 -0.000076 
+-0.005619 -0.000490 0.000811 -0.011387 -0.001641 0.003077 
+-0.009443 -0.001204 0.002658 -0.000032 -0.000040 0.000005 
+0.001749 0.002380 -0.003338 -0.000391 0.001763 -0.001829 
+-0.004217 -0.003321 -0.001408 -0.003067 -0.003414 0.000026 
+0.001182 -0.001284 -0.000282 0.001513 -0.000203 0.000933 
+0.000983 -0.001878 0.000673 -0.000220 -0.002864 0.002203 
+-0.001204 -0.000750 0.000478 -0.000553 -0.000688 -0.000133 
+-0.000477 -0.000158 -0.000249 0.002358 -0.003409 0.001353 
+0.002417 -0.004582 0.000621 -0.000398 -0.002507 -0.000554 
+-0.000141 -0.000317 0.000311 -0.000628 0.000399 -0.001427 
+-0.004015 -0.000511 -0.001679 -0.003522 -0.003884 0.001217 
+-0.001481 -0.002610 -0.001569 -0.001385 0.000231 -0.000692 
+0.001328 0.002625 -0.000162 0.002399 0.000534 -0.000495 
+0.003271 0.002138 -0.005600 0.001985 -0.000403 -0.002421 
+0.000440 0.000164 0.001848 -0.000767 -0.001074 0.003958 
+-0.000481 -0.001162 0.000556 0.001360 0.000640 0.000000 
+0.001920 0.001909 0.001060 0.003075 0.001488 -0.001686 
+0.004728 0.003377 -0.002792 0.005386 0.000823 -0.003434 
+0.004319 -0.002475 -0.002428 0.003897 -0.001667 0.000282 
+0.004639 0.006846 -0.006959 0.006744 0.010097 -0.008100 
+0.002609 0.007194 -0.007174 0.000810 0.001204 -0.002037 
+-0.000440 0.000918 0.000592 -0.000764 0.001808 0.001405 
+-0.000924 0.003351 -0.000387 0.000022 0.002835 -0.000720 
+-0.000724 -0.000026 0.000749 0.000874 -0.001140 -0.000982 
+-0.001118 -0.001810 -0.001850 0.000799 -0.001956 -0.003113 
+0.001021 0.001848 0.001708 0.000467 0.004296 0.000841 
+-0.004044 0.000740 0.000961 -0.006632 0.001945 0.003182 
+-0.007676 -0.002463 0.002999 -0.000540 -0.000068 -0.000606 
+0.001198 0.005209 -0.000195 0.003116 0.006450 0.000343 
+0.001144 -0.000669 0.000462 0.002529 0.000121 0.002682 
+0.002906 0.000053 0.001541 -0.001729 -0.000879 -0.000295 
+-0.004528 -0.002132 0.006208 -0.003635 0.003018 0.004803 
+-0.001716 0.003672 0.002454 -0.001768 0.003863 -0.002049 
+-0.001256 0.003368 -0.003951 -0.001302 0.004986 -0.001440 
+0.001957 0.006106 0.000637 0.004120 0.004104 -0.004111 
+0.001792 0.001156 -0.003758 -0.002065 -0.002171 -0.001747 
+-0.003081 0.000380 0.001589 -0.000964 0.003089 -0.001388 
+0.003269 0.007813 -0.003422 0.002129 0.008172 -0.005769 
+0.002555 0.004557 -0.002888 0.000735 -0.000979 -0.000413 
+-0.001397 -0.003275 -0.001153 -0.001623 -0.000593 -0.002746 
+-0.001753 0.002685 -0.000747 -0.000140 0.003401 -0.002281 
+-0.000806 0.000242 -0.000806 -0.003492 -0.003007 0.000427 
+-0.001792 -0.002665 0.002386 -0.000564 -0.000737 -0.000441 
+0.002667 0.002525 -0.000878 0.004777 0.003541 -0.002714 
+0.004112 0.000872 -0.002546 0.003268 -0.000396 -0.001562 
+0.003412 -0.001742 -0.002036 0.002340 -0.002083 -0.000782 
+0.001085 -0.001393 0.000145 0.000176 -0.002880 0.000389 
+0.000521 -0.001749 -0.000152 -0.000108 0.002266 -0.000748 
+0.002373 0.003326 0.002611 -0.000255 0.001127 0.000106 
+-0.001677 -0.002596 0.004138 0.001472 -0.002112 0.001412 
+0.002498 -0.001837 0.000560 0.005084 0.000807 -0.000834 
+-0.001455 -0.000364 -0.001908 0.001398 -0.001210 -0.003797 
+0.000439 -0.003747 -0.003307 -0.000194 -0.000798 -0.006117 
+0.003345 0.002878 -0.002338 -0.000383 0.000673 -0.000373 
+-0.001552 -0.001144 -0.000974 -0.003706 0.001957 0.003973 
+-0.003370 0.001204 -0.000522 0.000981 0.001228 -0.000562 
+0.002385 -0.001692 0.001000 0.001914 -0.000820 0.003829 
+0.000172 0.000700 0.002879 -0.000669 0.000523 -0.000706 
+-0.000133 0.001056 -0.003434 0.003456 -0.001926 -0.003985 
+0.004629 -0.003201 -0.000138 0.004769 -0.001849 0.002141 
+-0.000703 0.000980 0.000288 -0.000208 0.005530 0.001355 
+0.001083 0.004061 0.000081 0.001185 0.001647 -0.002812 
+-0.000192 0.000756 -0.005066 -0.001852 0.001598 -0.003639 
+-0.001111 0.002370 -0.000547 -0.002294 0.000285 0.002091 
+-0.000914 -0.001849 0.004598 0.000135 -0.000668 0.003468 
+-0.001617 -0.007011 0.001622 0.000591 -0.005502 0.002413 
+0.000982 -0.003372 0.003405 -0.001810 0.000620 0.000476 
+-0.000780 0.000103 -0.000470 -0.001491 -0.002268 -0.001267 
+-0.004918 -0.004790 0.001157 -0.000984 -0.001275 0.003466 
+-0.000774 0.003560 -0.000156 0.002573 0.005705 -0.001791 
+0.001842 0.003728 -0.003672 0.000488 -0.001424 -0.001970 
+-0.001112 -0.001523 -0.001889 -0.000376 -0.002071 -0.000258 
+-0.001412 -0.001842 0.000852 -0.001241 -0.001466 0.003383 
+0.000500 -0.001500 0.004000 -0.000838 0.001561 0.001027 
+-0.003434 0.002181 -0.001646 -0.002044 -0.000353 -0.003527 
+-0.000254 0.001513 -0.003093 0.000028 0.000142 0.000054 
+-0.001612 -0.000537 0.002149 -0.002961 -0.000681 -0.000056 
+-0.001139 -0.000094 -0.001341 -0.000116 -0.000688 -0.001436 
+-0.000339 0.003519 0.000626 0.001912 0.005466 0.000683 
+0.000124 -0.000380 -0.004544 -0.006148 -0.002550 -0.001677 
+-0.007791 -0.004179 0.001418 -0.002480 -0.002611 0.001865 
+0.001997 0.001983 -0.002725 0.001829 -0.000102 -0.002736 
+0.000491 0.000087 0.000964 0.000045 -0.000056 -0.000026 
+-0.005148 -0.003666 0.002945 -0.002883 -0.000880 0.000733 
+-0.001319 -0.000397 0.000106 -0.002149 -0.002166 0.000185 
+-0.004679 -0.002120 0.002130 -0.002509 -0.001282 0.002968 
+-0.000432 0.001157 -0.001938 0.001535 0.002995 -0.004206 
+0.001571 0.000712 -0.003325 -0.002154 -0.002154 -0.000081 
+-0.001851 -0.001922 0.004028 -0.002163 -0.001044 0.002685 
+0.001077 -0.000472 0.000617 -0.005210 -0.001377 0.002666 
+-0.008179 -0.001664 0.005094 -0.002844 -0.001140 0.009105 
+-0.005093 -0.004430 0.003613 0.001113 -0.000263 0.000192 
+0.001013 0.002918 0.001465 0.000955 0.001804 0.001567 
+0.002727 -0.001152 0.000576 0.001770 -0.000777 0.002921 
+0.000553 0.000257 0.001163 0.000438 0.003723 0.000438 
+0.003944 0.005255 -0.001479 0.003424 0.002976 -0.004267 
+0.002488 -0.000246 -0.003226 -0.000134 -0.000028 0.000038 
+-0.002635 0.001239 -0.000556 -0.000901 0.002417 0.000236 
+-0.001107 0.000603 -0.000468 -0.001506 0.003322 0.000532 
+-0.003376 0.000738 0.000067 -0.003864 -0.000074 0.001600 
+-0.004572 0.000580 0.003664 -0.005069 0.000089 0.003475 
+-0.002714 0.001185 0.001245 0.001451 0.001441 -0.000829 
+0.002338 -0.000904 -0.002897 0.002601 -0.000637 0.000557 
+0.000582 -0.001371 0.003583 -0.001061 0.000926 0.002821 
+0.000138 0.002139 -0.000889 0.000000 0.000612 -0.004014 
+-0.001075 -0.000553 -0.002899 -0.001149 -0.001594 0.000476 
+0.002450 0.001885 0.002636 -0.000522 0.003129 0.001406 
+0.004266 0.005782 -0.000427 0.001931 0.001671 -0.002611 
+0.001837 0.001001 -0.002538 0.004704 0.001223 -0.005425 
+0.008618 0.002163 -0.003688 0.001634 0.004225 -0.000972 
+-0.002527 -0.003239 -0.000065 -0.008333 0.000614 0.001841 
+-0.010046 -0.005802 0.006321 -0.004343 -0.003355 0.007106 
+-0.000698 -0.001756 0.003110 0.000079 0.000628 -0.000070 
+0.001303 0.001955 -0.002222 0.000687 0.001570 -0.002117 
+0.000112 0.000307 0.000469 -0.000134 0.000873 -0.000201 
+-0.000380 0.000364 -0.000976 -0.000806 0.003087 -0.003873 
+0.000583 0.004196 -0.005789 0.000075 0.000000 -0.003534 
+-0.001679 -0.001493 0.000560 -0.001852 -0.004815 0.002519 
+-0.002192 -0.004053 -0.000682 0.001755 -0.003988 -0.002677 
+0.002325 -0.002801 -0.001106 -0.000464 -0.001382 -0.000039 
+-0.002776 0.000541 -0.002437 0.001570 0.000868 -0.002561 
+-0.002030 0.002123 0.000940 -0.003499 0.001279 -0.000908 
+-0.000530 -0.003025 0.000392 -0.001787 -0.006010 0.004734 
+-0.003269 -0.004919 0.003422 -0.002979 -0.001631 0.001699 
+-0.001932 0.000480 0.001190 -0.000905 0.001152 0.000700 
+-0.002555 -0.000079 0.000680 -0.004373 0.000342 0.001231 
+-0.005642 -0.002060 0.001807 -0.004781 0.003021 -0.000488 
+0.004989 -0.003463 -0.002046 -0.000779 -0.001091 -0.003272 
+-0.000417 -0.000625 -0.001213 -0.000949 0.000507 0.000326 
+0.001836 0.000309 0.001439 0.003077 0.004111 0.001019 
+0.000868 0.002430 -0.000090 -0.002275 0.001812 -0.000543 
+0.000310 0.002280 -0.001961 0.003440 -0.000344 -0.003784 
+0.001766 0.002159 -0.002876 0.001320 0.000164 -0.002740 
+0.002698 -0.002285 -0.001038 0.001816 -0.000937 0.000386 
+0.002897 -0.000584 -0.000686 0.001630 -0.000009 -0.000499 
+0.000181 0.001377 0.000181 0.001880 0.002928 -0.001826 
+0.005038 0.000229 0.000229 0.001174 0.001372 -0.003196 
+-0.001506 0.000620 0.000458 -0.001173 0.002612 -0.000640 
+-0.001659 0.000818 0.003155 -0.000405 0.001778 0.001253 
+-0.000660 0.000500 0.002195 -0.002370 0.000162 0.000871 
+-0.001749 -0.000674 0.001299 0.001008 -0.001389 0.002223 
+0.002596 -0.001254 0.001246 0.000458 0.000556 -0.000752 
+0.001598 0.001681 0.000871 -0.001974 -0.001303 0.000438 
+-0.004405 -0.002173 0.003265 0.000567 -0.000337 0.004653 
+0.002436 0.000631 0.001167 0.005724 0.002262 -0.000811 
+0.006347 -0.000957 -0.004146 0.002354 -0.003767 -0.003632 
+-0.002857 -0.003690 -0.004168 -0.002315 -0.003506 -0.003277 
+-0.000613 -0.002204 -0.002959 -0.000196 -0.001072 -0.000878 
+-0.000069 0.000405 -0.000031 -0.000528 -0.000102 -0.000211 
+-0.000508 -0.001968 -0.000317 -0.002069 -0.002931 -0.002584 
+-0.000740 -0.000469 0.000685 0.000370 0.000724 -0.000229 
+0.002041 0.001073 -0.001177 0.001112 0.000730 -0.001668 
+0.000060 -0.001174 -0.000537 -0.000223 -0.002097 0.000335 
+0.000534 0.000712 -0.000757 0.001715 0.004307 -0.003019 
+0.000234 0.005636 -0.003702 0.001336 0.003416 -0.004871 
+0.002221 0.002922 -0.002263 -0.000284 0.000869 -0.001011 
+-0.001750 -0.001738 -0.001703 -0.000688 -0.001472 -0.001994 
+0.000477 0.001658 -0.003065 -0.001177 0.001476 -0.000966 
+-0.002578 0.000723 -0.001312 -0.006088 0.001024 -0.000398 
+-0.003750 -0.001292 0.001125 0.000917 0.004048 -0.004239 
+-0.002604 0.004543 -0.004783 0.002854 0.001864 -0.007979 
+0.004100 0.004336 -0.004817 0.003489 0.004175 -0.000884 
+0.000389 0.002032 0.001182 -0.003912 -0.001610 0.002071 
+-0.002998 -0.003621 -0.000312 0.000540 -0.000576 0.000540 
+0.002716 0.006154 -0.004045 0.005179 0.006838 -0.003479 
+-0.000237 -0.005846 -0.003082 0.001766 -0.006662 -0.000310 
+0.002852 -0.000791 0.003646 0.000189 0.003566 0.006615 
+0.004795 0.003905 0.004062 0.005898 0.003271 -0.002694 
+0.001264 0.001409 -0.005888 0.000572 0.002023 -0.002501 
+0.000447 0.000192 0.000032 -0.001077 0.000857 -0.001083 
+-0.001250 0.000625 0.003125 -0.003415 -0.002572 0.002723 
+-0.000098 -0.000326 -0.000098 0.005011 -0.000542 -0.002167 
+0.006525 0.001373 -0.002365 0.002758 0.001463 0.002110 
+0.000337 -0.000275 -0.000424 -0.000539 0.000474 0.000071 
+0.000619 0.002481 0.000372 -0.000038 0.001061 -0.000038 
+0.000997 -0.000108 -0.000835 -0.001641 -0.002205 -0.000564 
+-0.001011 -0.000481 0.002671 -0.000896 -0.001587 0.003558 
+-0.001088 -0.001160 0.001828 -0.000756 0.000193 0.000074 
+0.001103 0.000228 -0.000013 0.003175 -0.000413 0.000540 
+0.001082 -0.001082 0.001269 0.001254 0.003182 -0.003135 
+-0.003331 0.002767 -0.001115 0.002411 0.000208 -0.000596 
+0.001327 0.000963 0.001137 0.000395 -0.000247 0.003309 
+-0.000037 0.000809 -0.000037 -0.000417 0.003500 -0.001306 
+0.001168 0.003311 -0.000706 0.000755 0.002409 -0.000581 
+0.000151 0.003350 -0.002740 0.001033 0.000689 -0.006503 
+0.001004 0.001673 -0.006087 -0.000008 0.000370 -0.000950 
+-0.000076 -0.002273 0.002273 -0.001541 -0.001541 0.001504 
+0.000113 0.000602 -0.001090 0.002336 0.001550 -0.004696 
+0.002863 0.001601 -0.005613 0.001481 0.002644 -0.003282 
+0.000461 0.003191 -0.000461 -0.000818 0.003869 0.001635 
+0.000488 0.004547 0.001865 0.004720 0.005568 0.000368 
+0.007097 0.001606 0.001963 0.002228 0.000330 0.001348 
+-0.002094 0.000360 -0.001439 -0.000245 0.000671 0.001579 
+-0.007508 -0.004397 0.003337 -0.002876 -0.002395 -0.001810 
+-0.001467 -0.001241 -0.002640 -0.001314 0.001203 -0.005620 
+0.000590 0.001966 -0.004921 0.001273 0.000730 -0.000876 
+0.000812 -0.000280 -0.000317 -0.000319 -0.000050 -0.000052 
+-0.001945 0.002332 -0.001308 0.000761 0.001007 -0.000719 
+0.000507 0.000738 0.000101 0.002537 -0.001824 -0.001555 
+0.003657 -0.002084 -0.000981 0.002555 -0.000935 0.000421 
+0.001097 0.000009 0.000671 -0.001270 -0.000720 -0.001081 
+-0.001188 -0.002745 -0.002563 0.000422 0.000507 -0.004773 
+0.000060 0.002582 0.000522 0.001706 0.003018 -0.000263 
+0.007493 -0.003606 -0.005453 -0.001359 -0.001781 -0.002573 
+0.002952 0.006426 -0.001300 0.008925 0.007563 -0.000084 
+0.004910 0.011416 -0.002861 0.001636 0.013736 -0.000674 
+0.006804 0.010139 -0.003754 0.003789 0.010033 -0.007964 
+-0.001092 0.004657 -0.006186 0.002904 0.003972 -0.005631 
+0.003653 0.004676 -0.002082 0.003355 0.002392 -0.001307 
+0.000354 0.001237 -0.000354 -0.002945 0.001691 0.001187 
+-0.003906 0.003129 0.000979 -0.002387 0.001989 -0.000441 
+0.001119 -0.000324 -0.002296 0.005103 0.000711 -0.002196 
+0.002519 0.000763 -0.003588 -0.000522 0.001269 -0.004030 
+-0.002148 -0.000111 -0.004852 0.000133 -0.000616 -0.002199 
+0.001383 -0.001199 0.000922 0.001294 0.000499 -0.000868 
+-0.000407 0.000855 -0.000600 -0.001786 -0.002784 -0.000263 
+0.000749 -0.004202 -0.000603 0.002514 -0.000775 -0.001157 
+0.003394 0.004816 -0.003846 0.000308 0.008000 -0.003692 
+-0.000687 0.000000 -0.003359 -0.000053 0.003077 -0.000036 
+0.006200 0.000396 -0.000857 0.007904 0.002167 -0.000526 
+0.005169 0.004367 0.000307 -0.000434 0.002591 -0.003561 
+-0.003365 0.001835 -0.002755 -0.002307 0.006043 -0.004037 
+0.003141 0.001981 -0.006353 0.000819 -0.001110 -0.002326 
+0.000522 -0.000896 0.000746 0.006591 0.003509 -0.002106 
+0.006261 0.007306 -0.005814 0.002665 0.006741 0.000381 
+-0.001951 0.000865 -0.002710 -0.001732 -0.002412 -0.001902 
+0.001054 0.000837 -0.000784 0.004076 0.005472 -0.002114 
+0.000706 -0.000464 -0.002099 -0.003776 0.005627 -0.001466 
+-0.002182 -0.000050 0.001922 0.000308 -0.000877 -0.000292 
+0.001001 -0.000150 0.000301 -0.000310 -0.000516 -0.000739 
+-0.001370 -0.000649 -0.001418 -0.002033 -0.002247 -0.001471 
+-0.003052 0.000311 -0.001690 -0.004908 0.001455 0.001396 
+-0.005544 -0.004959 0.003792 -0.002364 -0.005379 -0.000182 
+0.000441 -0.002949 -0.002015 0.000176 0.000155 0.000075 
+-0.001156 -0.000498 0.002252 -0.001017 -0.000548 0.000853 
+-0.001655 -0.000135 0.000592 -0.001887 -0.001446 -0.000066 
+-0.000035 -0.002016 0.000268 -0.000491 0.000103 -0.000274 
+-0.001448 0.003050 -0.003913 -0.002277 0.003519 -0.003394 
+-0.001130 0.000936 0.001405 0.000846 0.001576 0.002617 
+0.000628 0.002442 0.001135 0.001163 0.001671 -0.000474 
+-0.001820 0.000370 0.000126 -0.002231 0.000852 -0.001378 
+0.000407 -0.001946 -0.000260 0.001858 -0.003429 0.001523 
+0.003764 -0.001209 0.001103 0.002794 0.002521 -0.001859 
+0.001374 0.005333 -0.005941 -0.000040 0.006570 -0.005995 
+0.000788 0.005586 -0.003188 0.001861 0.003375 -0.003181 
+-0.000153 0.002027 -0.001505 0.001687 -0.000995 0.001400 
+0.005092 -0.000161 0.001740 0.003128 -0.003284 -0.000272 
+0.002067 -0.002756 -0.001387 0.000007 -0.002093 0.001260 
+0.001151 -0.000682 0.001962 0.002090 -0.002478 -0.002244 
+0.000920 -0.000315 0.000805 -0.000568 -0.000662 -0.001335 
+-0.001833 0.001786 0.001016 -0.000297 -0.000198 0.002286 
+-0.000125 -0.000375 -0.000074 0.001978 -0.004104 -0.001978 
+-0.001379 -0.005785 -0.000134 -0.006014 -0.004972 0.001697 
+-0.006349 -0.001397 -0.000079 -0.001639 0.000475 -0.001051 
+0.000107 0.001034 0.000245 0.001058 0.000481 0.001046 
+-0.001816 -0.000549 0.000617 0.001064 -0.001126 0.002097 
+-0.005686 -0.000739 0.000341 -0.005992 -0.003567 0.003905 
+-0.002009 -0.003265 0.002726 0.000993 0.000564 0.000575 
+0.001396 0.001868 0.000447 0.000141 -0.001087 0.001605 
+-0.002429 -0.003500 0.003143 0.000118 -0.001492 0.001948 
+0.001903 0.000299 -0.003097 0.007125 0.000536 -0.002490 
+0.005708 0.005197 -0.007099 0.002794 0.000000 -0.006912 
+-0.000491 -0.002175 -0.005053 -0.001455 -0.000994 -0.001686 
+0.000682 0.000233 -0.000047 0.001496 -0.000664 -0.001996 
+-0.000488 -0.001248 -0.001424 -0.002401 0.000503 0.000484 
+-0.001314 0.000589 0.002824 -0.000933 -0.002473 0.001822 
+0.001251 -0.001274 0.002536 0.000713 -0.003565 -0.001846 
+-0.000936 0.001757 -0.002262 -0.004541 0.003075 -0.003492 
+-0.000549 -0.000630 -0.000097 0.002310 0.000736 -0.003360 
+0.000307 -0.000808 0.000253 -0.002430 -0.002668 0.001608 
+-0.001176 -0.000262 -0.000549 -0.001435 0.000158 -0.000391 
+0.002238 0.003030 -0.001492 0.000992 0.001933 -0.003067 
+0.002018 -0.000601 -0.000478 0.002034 -0.003421 0.000408 
+0.001031 -0.002478 -0.000299 -0.000803 0.000748 0.000130 
+-0.002313 0.001931 -0.001205 -0.001450 0.001768 -0.003423 
+-0.000635 0.000864 -0.003710 0.000791 -0.000106 0.001067 
+0.003723 -0.001110 0.003560 0.001772 -0.001238 0.001101 
+-0.001284 0.000810 -0.000526 -0.002677 0.001654 0.000000 
+-0.003208 0.000673 -0.000827 -0.003413 -0.000397 0.000556 
+-0.001139 -0.002844 -0.003310 -0.000565 0.000524 -0.000524 
+0.001852 0.001778 0.000288 0.004184 0.003101 -0.001135 
+0.004781 0.001726 -0.001428 0.003794 -0.000961 0.000775 
+0.002401 -0.003941 0.001212 -0.000278 -0.002510 0.000303 
+-0.001510 -0.000769 0.001208 -0.000192 -0.000072 0.000391 
+-0.001172 -0.001414 -0.001575 0.001469 0.000062 0.000765 
+0.002762 0.002963 0.000403 0.000412 0.001468 0.001781 
+0.001012 -0.003176 0.000992 -0.003289 -0.004902 0.002129 
+0.000291 -0.001691 -0.002655 -0.001271 0.002519 -0.002958 
+0.002981 0.005162 -0.001744 0.001186 0.001857 -0.003557 
+0.004313 0.002654 0.000265 0.002172 0.002848 -0.001864 
+-0.001271 0.003519 -0.001690 -0.002968 0.001545 0.000082 
+-0.000968 0.000161 0.001343 0.003092 -0.000677 -0.000862 
+0.003396 -0.000981 -0.005997 0.001947 0.009921 -0.007787 
+-0.002275 0.001413 -0.002894 -0.000192 0.001726 -0.001298 
+-0.000644 -0.000215 -0.002148 0.000156 -0.002283 -0.004047 
+-0.000483 0.004800 -0.003079 0.006124 0.005604 -0.001271 
+0.002836 0.003664 -0.000742 0.002239 0.001332 0.000589 
+0.002667 0.001314 -0.000905 0.003445 0.002824 -0.001594 
+0.003636 0.003997 -0.001585 0.004815 0.004892 -0.002828 
+0.005479 0.002258 0.000403 0.002920 0.000876 0.000657 
+-0.001065 0.000562 0.002790 -0.001957 -0.000709 0.001673 
+0.000554 0.000922 -0.001658 0.002358 0.003521 -0.003288 
+0.001901 0.003203 -0.002122 -0.000962 -0.000110 -0.000759 
+-0.001814 -0.002918 -0.002543 -0.003931 -0.003739 -0.002173 
+0.000889 -0.001704 -0.003037 0.005634 0.001064 -0.000039 
+-0.000285 0.002200 0.000992 0.000505 0.002056 -0.001985 
+-0.000309 -0.001100 -0.001365 0.000729 -0.001609 -0.000975 
+0.000434 -0.000482 -0.000668 -0.000064 0.000298 -0.001364 
+0.000065 -0.000175 0.000169 0.001037 -0.002770 0.001220 
+-0.001181 -0.003053 0.002783 0.000207 -0.000968 0.002695 
+-0.001207 -0.000242 -0.002253 -0.002018 -0.000562 -0.000449 
+-0.000021 -0.000622 -0.000217 0.000343 0.001159 0.000957 
+-0.000551 0.003959 -0.000639 0.003448 0.004237 -0.002164 
+0.003772 -0.002561 -0.000646 0.003577 -0.004224 0.002416 
+0.002492 -0.001246 0.004385 -0.001234 0.001017 0.002359 
+0.001246 0.003382 -0.000311 0.001814 0.004851 0.000726 
+0.000785 0.005073 -0.000088 -0.000857 0.003462 0.000135 
+0.005451 0.001889 -0.001902 0.003538 0.003171 -0.006067 
+0.003137 0.002893 -0.001688 0.003282 0.006484 -0.000532 
+0.004140 0.007735 0.002339 0.003265 0.006744 0.002441 
+0.005281 0.003293 0.000222 -0.000004 -0.000286 0.000063 
+-0.001670 0.002943 0.001895 0.002996 0.004102 0.000438 
+0.003251 0.004485 -0.003532 0.002517 0.001742 -0.001678 
+0.000000 -0.001718 0.001718 -0.003701 -0.003009 0.001623 
+-0.002767 0.001383 0.000526 -0.001321 -0.000763 -0.000354 
+-0.001438 0.001170 0.000903 -0.001292 -0.000598 -0.000484 
+-0.002462 -0.002350 -0.000649 0.001145 -0.003999 -0.001026 
+0.009085 0.000000 -0.003873 0.009672 0.006798 -0.002616 
+0.002070 0.003000 0.001177 -0.001159 -0.000841 -0.002256 
+-0.000621 0.000692 -0.000652 -0.002705 0.002705 0.001721 
+0.000320 0.004810 -0.001445 -0.002093 0.005878 -0.002695 
+-0.002497 0.002245 -0.003002 0.000611 -0.000076 -0.003893 
+0.002736 -0.001624 -0.003508 0.002081 0.001041 -0.003252 
+0.001593 -0.000218 -0.002408 0.002621 0.000093 -0.001451 
+-0.000397 0.001587 0.001628 -0.000361 -0.001046 0.001335 
+-0.001200 -0.002336 0.001168 -0.000304 -0.000344 0.001680 
+-0.000538 0.001993 -0.000459 0.001351 0.002691 -0.002649 
+0.000584 0.003641 -0.003418 0.000259 0.005007 -0.000691 
+-0.001704 0.003979 -0.000285 0.001064 0.003973 0.001773 
+-0.000702 0.002368 -0.000030 -0.001052 0.002890 -0.002879 
+0.001808 0.005398 -0.003144 -0.000568 0.000940 -0.002330 
+-0.005919 -0.005919 0.000147 -0.003559 0.000356 0.000652 
+0.001207 -0.000591 0.000128 0.001595 0.005960 -0.001637 
+0.000498 0.007520 -0.004559 -0.000510 0.002735 -0.004388 
+0.001960 -0.002262 -0.004531 -0.000422 -0.004854 -0.002504 
+0.001440 0.001510 0.001220 0.007838 0.000048 0.000079 
+0.006943 0.004755 -0.001571 0.004490 0.004026 -0.001141 
+0.002079 0.005155 -0.001364 0.000291 0.004496 0.000414 
+-0.000998 0.000559 0.002256 -0.003704 0.000662 0.005495 
+-0.002157 0.002567 0.003516 -0.000297 -0.000172 -0.000412 
+0.001484 -0.000267 -0.003471 0.003014 -0.001465 -0.005208 
+0.001619 -0.001218 -0.004285 0.000013 -0.000039 -0.000117 
+0.000521 -0.001042 0.004202 -0.004894 -0.004244 0.006517 
+-0.005686 -0.000641 0.004705 -0.004313 0.000264 0.000949 
+-0.002735 -0.001028 -0.001003 -0.001082 -0.000345 -0.000429 
+-0.000015 0.000030 -0.000152 0.002380 0.003902 -0.002107 
+-0.001065 0.008239 -0.001016 -0.001269 0.008321 0.001221 
+0.004696 0.005398 0.001542 0.004481 0.002350 -0.003216 
+0.002482 -0.002526 0.000526 -0.000132 -0.002856 0.001088 
+-0.001702 -0.000430 0.000337 -0.000988 0.003000 0.000847 
+-0.002123 0.004907 0.000411 -0.003505 0.003708 0.001524 
+-0.003039 0.001628 0.001257 -0.000379 0.000114 0.002681 
+-0.003486 -0.004759 0.000332 0.000290 -0.001821 -0.004097 
+-0.001453 0.002906 -0.006250 -0.000940 0.005397 -0.004701 
+-0.000572 0.001434 -0.001810 -0.000044 -0.000825 -0.000755 
+0.002211 0.002211 -0.003265 -0.001319 0.003972 -0.004611 
+-0.001322 0.005792 -0.004237 -0.000629 0.003445 -0.000950 
+0.000143 -0.001596 0.002026 -0.000065 0.000192 0.000208 
+-0.000869 -0.000831 -0.000687 -0.002385 -0.000966 0.000041 
+-0.002891 -0.001797 0.003516 -0.003254 -0.000833 -0.000833 
+0.000796 -0.000898 -0.000429 0.000070 -0.000047 -0.004427 
+0.004781 0.004028 -0.003519 0.000810 0.003195 -0.002452 
+-0.002446 -0.003042 0.000659 0.000299 -0.000146 0.001363 
+-0.000357 0.000902 0.000767 -0.000294 0.000441 0.000441 
+0.006930 0.008086 -0.001154 0.003806 0.003899 -0.001238 
+0.000028 0.001500 -0.000286 0.000074 0.003612 -0.001940 
+0.004748 0.003022 -0.006043 -0.000846 0.001058 -0.004632 
+-0.001553 0.002609 -0.003540 -0.004632 0.001158 -0.002835 
+-0.002776 0.001948 -0.001900 -0.000676 0.000238 -0.000123 
+-0.000526 -0.000376 0.001353 0.002115 -0.002115 0.002923 
+0.002702 -0.000676 0.002188 0.002236 -0.000093 -0.000606 
+0.001027 0.001868 -0.004520 0.001746 0.002157 -0.005391 
+0.004167 -0.000854 -0.000932 0.002895 -0.004794 0.004118 
+0.001249 -0.006090 0.004485 0.000232 -0.002141 0.002409 
+0.001143 0.000791 -0.000546 0.000265 -0.000490 0.000144 
+0.000212 -0.002957 0.000564 0.000765 -0.001842 0.001128 
+0.002126 0.003380 0.000999 0.007209 0.001898 0.001423 
+0.005067 0.002288 -0.000123 -0.003108 -0.001379 0.000950 
+-0.007185 -0.004212 0.002540 -0.002262 -0.003858 -0.000838 
+0.002552 -0.003330 0.002358 0.004543 -0.002966 0.001994 
+0.002863 -0.000999 -0.001744 -0.000931 -0.002111 -0.000104 
+-0.000547 -0.004628 -0.000820 -0.005728 -0.004558 -0.002587 
+-0.005418 -0.003870 -0.000580 -0.001922 -0.000803 0.000684 
+0.002467 0.003274 0.003134 0.005400 0.003536 0.005327 
+0.005773 0.008283 0.000869 0.001646 0.009516 0.000796 
+0.000783 0.003683 -0.001583 0.000559 -0.000331 -0.000070 
+0.000252 -0.000845 -0.000620 -0.000640 0.000695 -0.000042 
+-0.000190 0.001334 -0.000821 0.002067 0.000896 -0.002221 
+0.002297 -0.002576 -0.001184 0.002648 -0.001683 0.000181 
+0.000935 -0.000466 -0.000175 -0.001413 0.001887 0.000245 
+-0.001793 0.005039 -0.001457 0.000711 0.005112 -0.000404 
+0.001699 0.002830 -0.003156 -0.000285 0.002153 -0.001022 
+0.000113 0.001809 -0.001501 0.000196 0.002070 0.001841 
+-0.003215 0.000715 0.001397 -0.000328 -0.000342 -0.001237 
+0.001152 0.000326 -0.000695 -0.001406 0.001406 0.000078 
+-0.001821 0.000109 0.000215 -0.001685 -0.000853 0.000297 
+-0.000890 0.001297 0.000095 -0.000677 0.002350 0.000352 
+0.000081 0.002541 0.000034 0.002167 0.003225 -0.001075 
+0.000841 0.002808 -0.001404 -0.002499 -0.000141 0.001572 
+-0.005656 -0.000619 0.001767 -0.002451 -0.000838 0.001737 
+0.002172 0.003197 -0.001568 0.000753 0.004508 0.002380 
+-0.000078 0.001325 0.001515 -0.001254 0.000886 0.001390 
+-0.001363 -0.005330 0.004028 0.003156 -0.000455 0.005825 
+0.000117 -0.001284 0.001196 0.000674 0.002743 0.002059 
+0.000191 0.001692 0.001893 -0.000083 0.000777 0.001554 
+-0.000422 -0.000366 0.000220 0.001205 0.000174 -0.002035 
+0.000874 0.003494 -0.003955 0.003000 0.005077 -0.003462 
+0.000647 0.003809 -0.000575 0.000125 -0.000436 0.000548 
+-0.000089 -0.000965 0.001790 -0.000259 0.000302 0.000534 
+-0.000884 0.004191 -0.001263 -0.000446 0.006996 -0.002629 
+-0.001154 0.005071 -0.005769 -0.003474 0.001765 -0.001579 
+-0.003468 -0.000896 -0.000863 -0.002277 0.001216 -0.002223 
+0.000490 0.003132 -0.002805 0.000240 0.000491 -0.000522 
+-0.000219 -0.002530 0.003048 -0.000144 -0.002737 0.002009 
+0.000584 -0.000975 0.000430 0.000192 0.000136 -0.001065 
+-0.002044 0.000507 -0.000669 -0.002347 0.002062 -0.000733 
+-0.003846 0.000522 -0.000219 -0.006301 -0.002282 -0.000423 
+-0.006716 -0.001939 -0.002397 -0.004935 0.000312 -0.002604 
+-0.004777 0.001345 0.001036 -0.003494 0.003803 0.000924 
+-0.001147 0.000737 -0.000912 -0.001323 -0.002109 0.000331 
+0.000476 -0.002922 0.000486 0.000928 -0.001457 0.001590 
+0.001690 0.004458 -0.001605 -0.000657 0.015005 -0.001273 
+-0.001805 0.013639 0.003940 0.005268 0.002815 0.001338 
+0.006717 -0.007944 -0.000270 0.004967 -0.005986 0.001589 
+0.000000 0.001037 0.004593 -0.004389 0.003128 0.001958 
+-0.002287 0.001782 -0.001023 0.000419 -0.000206 0.000413 
+0.001001 0.000701 0.001484 0.001721 0.002750 0.000516 
+0.000269 0.003082 0.000409 -0.000539 0.001223 0.000008 
+-0.001201 0.001449 -0.000945 0.000093 0.001202 -0.003420 
+0.002377 0.002767 -0.006272 0.004125 0.001719 -0.005524 
+0.000044 0.001759 -0.000210 -0.000541 -0.002188 0.000891 
+0.000989 -0.002373 -0.001076 -0.001904 0.000695 -0.003696 
+0.000000 0.004000 -0.002519 -0.002680 0.004611 -0.001371 
+-0.000772 0.003250 0.000727 0.001374 0.004132 0.000688 
+0.001226 0.005138 0.000992 0.000566 0.003984 0.000121 
+-0.001493 0.001317 -0.000245 -0.003449 0.001028 -0.000409 
+-0.004897 0.002852 -0.002272 -0.004371 0.003196 -0.003988 
+-0.003575 0.002904 -0.002009 -0.001870 0.001870 -0.001626 
+-0.000645 0.001414 -0.002122 -0.000488 0.000411 -0.001439 
+-0.002951 -0.001238 0.002493 -0.004231 -0.006033 0.004715 
+-0.004478 -0.003821 -0.001054 -0.000569 -0.001829 -0.001605 
+0.001273 -0.000229 0.000301 -0.000947 0.001962 -0.001677 
+0.000796 -0.000185 -0.000872 0.000864 0.000958 0.001859 
+0.001820 0.001418 0.003853 -0.000695 0.001810 0.003153 
+-0.000878 0.002227 0.000038 0.000579 0.002362 -0.002304 
+0.000602 0.002478 -0.003186 0.000209 0.001570 -0.001689 
+-0.001642 -0.000071 0.000221 -0.001960 0.000189 -0.000328 
+-0.001103 0.004412 0.000956 -0.001020 0.003612 -0.001709 
+-0.002581 -0.000012 -0.001296 -0.003095 -0.001611 -0.001168 
+-0.002832 -0.001347 -0.000986 -0.001708 0.000704 -0.002663 
+0.001509 0.001591 -0.001848 0.000028 0.004488 -0.000125 
+-0.000251 0.000105 -0.000663 0.001096 0.000723 -0.002890 
+0.000649 0.000733 -0.003892 -0.001674 -0.001745 -0.003454 
+-0.003095 -0.002920 0.000105 -0.002258 -0.002556 0.000174 
+-0.000624 -0.001524 -0.000046 -0.002145 0.000360 -0.000705 
+-0.006927 -0.000332 -0.000102 -0.006379 0.002876 0.002371 
+-0.002647 0.002001 0.002427 0.000726 0.001047 0.001919 
+0.002239 0.000016 0.000134 0.001210 -0.000171 0.001266 
+-0.000521 0.000489 0.001710 -0.000622 0.003751 -0.000050 
+-0.000382 0.006104 -0.005081 -0.000477 0.008327 -0.007612 
+0.000614 -0.002630 -0.002835 0.004937 -0.010943 -0.004038 
+0.003501 -0.012398 -0.004321 -0.002845 -0.011801 -0.000110 
+-0.007674 -0.008731 0.008851 -0.006350 -0.001863 0.004192 
+0.000953 0.003961 -0.002112 0.000320 0.003689 -0.000230 
+0.001788 0.004206 -0.001357 0.001592 0.005448 0.001483 
+0.001222 0.004524 -0.000233 0.000548 -0.002178 0.000102 
+-0.002561 -0.007147 0.001854 -0.003562 -0.006440 0.001450 
+-0.001599 -0.001493 0.003496 0.000202 0.000567 0.006644 
+-0.000712 0.000327 0.006207 0.000488 -0.001758 0.000473 
+0.001510 -0.002217 -0.003434 -0.001119 -0.001279 -0.002011 
+-0.000617 0.001436 -0.000166 -0.000694 0.000202 -0.000612 
+-0.004249 0.000117 0.001572 -0.003730 -0.000779 0.000464 
+-0.002252 -0.001240 -0.000197 0.000654 -0.002359 0.000529 
+0.002320 -0.000126 0.000147 0.000491 0.002111 -0.002141 
+-0.003610 0.001786 -0.002275 -0.004976 0.001464 -0.001069 
+-0.002932 -0.000230 -0.001611 0.002938 0.002683 -0.004726 
+0.000728 0.005161 -0.007953 -0.000455 0.001294 -0.002808 
+0.001104 -0.000683 0.007304 -0.001501 -0.004530 0.000335 
+-0.008186 -0.006936 -0.016259 -0.006313 -0.016537 -0.018071 
+0.001801 -0.010589 -0.008044 -0.001544 0.007297 -0.001403 
+0.002867 0.002194 -0.000313 0.001479 0.001228 -0.000251 
+0.000163 -0.001086 -0.001659 -0.000461 0.000114 -0.000491 
+-0.000808 0.001765 0.003415 -0.003004 0.000573 0.000085 
+0.000285 0.000507 -0.000285 -0.000527 -0.000955 0.000856 
+-0.001325 -0.003723 0.001988 -0.002319 -0.003736 0.001494 
+-0.002185 0.000010 0.000144 -0.001880 0.002141 0.002472 
+-0.002300 -0.000376 0.000235 -0.000618 0.000358 -0.000843 
+-0.000397 0.000368 -0.001191 0.001048 0.004143 0.000683 
+0.001859 0.006321 -0.001611 0.001686 0.004112 -0.003123 
+0.001479 0.001841 -0.003660 0.002086 0.000689 -0.004850 
+0.001127 -0.001490 -0.004550 -0.000962 -0.002789 -0.001080 
+-0.002913 -0.001820 -0.000158 -0.002917 -0.000637 -0.000354 
+-0.002657 -0.002237 -0.000890 -0.002698 -0.000988 0.002921 
+-0.001971 0.001551 0.000412 -0.002505 0.002320 -0.000954 
+-0.001290 0.000821 -0.001418 0.002525 0.005745 -0.005050 
+0.003056 0.002277 -0.006555 0.001539 0.001374 -0.003651 
+-0.003014 0.000972 -0.000033 -0.003802 0.002653 0.001022 
+-0.001173 0.000504 0.000120 0.005617 -0.002594 -0.000133 
+0.010530 -0.006906 -0.006238 0.006266 -0.016150 -0.010609 
+0.003486 -0.014657 -0.006162 0.000371 -0.009317 -0.001813 
+-0.003330 -0.003319 0.001593 -0.000084 0.001792 0.000772 
+0.000956 0.000704 0.001941 -0.000704 0.002994 0.000177 
+0.000515 0.005745 -0.001843 0.000656 0.004640 -0.001312 
+0.000332 0.001540 -0.002091 0.001181 0.002490 -0.001067 
+0.003008 0.000182 -0.000474 0.002911 0.000044 -0.000849 
+0.000362 0.000110 -0.000060 0.000591 -0.000045 0.009318 
+-0.001136 0.001692 0.004866 -0.000289 -0.000274 -0.000507 
+0.000108 -0.000601 -0.000227 0.001462 -0.000546 -0.000160 
+0.000840 -0.001947 0.000344 -0.000355 -0.002491 0.001602 
+-0.001395 -0.004320 -0.001569 -0.006545 -0.005363 -0.003835 
+-0.008740 -0.006433 -0.000960 -0.003719 -0.002688 0.000426 
+0.000716 0.001639 0.000113 0.002277 -0.000938 -0.000046 
+0.000980 -0.000492 -0.002132 0.000723 -0.000594 -0.002384 
+0.003491 0.000161 -0.002943 0.002837 0.001876 -0.005563 
+0.000332 0.006514 -0.006880 0.007221 0.010471 -0.005417 
+-0.007538 0.007391 0.001316 -0.000333 0.006026 -0.007776 
+0.008782 -0.005378 -0.016119 -0.401198 -0.694611 -3.610778 
+-0.020718 -0.005681 -0.021444 -0.010823 0.007477 -0.018203 
+0.001053 0.001400 0.000218 0.002494 0.000075 0.006235 
+-0.006324 0.001838 0.004044 -0.003556 0.000807 0.000886 
+0.000357 -0.000468 0.002051 -0.000389 0.002936 -0.000142 
+0.000655 0.006339 -0.001804 -0.001569 0.005109 -0.002372 
+0.001864 0.001744 -0.001975 -0.000359 0.000085 -0.001213 
+-0.001417 0.000104 -0.000985 -0.000820 0.000673 -0.000092 
+0.001880 0.000000 -0.003158 -0.000614 0.002693 -0.000940 
+-0.003013 0.002008 -0.000670 -0.005107 0.002664 0.001888 
+-0.002970 0.002802 0.001093 0.000375 -0.000044 -0.000252 
+0.001683 -0.004689 0.001065 0.000000 0.000000 0.004107 
+-0.003016 -0.005604 0.001272 -0.003647 -0.002069 0.000122 
+-0.002935 0.000839 0.000070 -0.001878 0.001543 -0.000537 
+-0.000910 0.000369 -0.001530 0.000909 -0.000191 -0.001652 
+0.002032 -0.000214 -0.002799 0.000504 0.001404 -0.002449 
+-0.000317 0.002518 -0.000633 0.000588 0.002171 -0.003678 
+-0.000401 0.001213 -0.004264 -0.000825 0.001312 -0.002207 
+-0.000856 0.001185 0.001854 -0.005495 -0.002748 0.008243 
+0.007158 -0.001054 0.006955 0.005359 -0.004097 -0.001522 
+0.009883 -0.005231 -0.006468 0.007794 -0.005614 -0.012212 
+0.005226 -0.011720 -0.011174 0.006411 -0.005576 -0.006950 
+0.004232 0.002434 -0.004866 0.001346 0.000780 -0.002843 
+-0.001937 -0.001708 0.002300 -0.003263 -0.001554 0.001927 
+-0.003114 0.004408 0.000575 -0.001980 0.003566 -0.002063 
+-0.000191 0.000191 -0.001374 0.001263 0.000896 -0.000593 
+-0.000117 0.003408 -0.003711 0.001699 -0.000600 -0.002562 
+0.005674 0.003224 0.000495 -0.000242 -0.000238 0.001584 
+0.000374 -0.001792 -0.000895 -0.001771 -0.001853 -0.001410 
+0.000843 0.000118 -0.000605 0.003219 0.001395 0.000579 
+0.003596 0.003183 -0.002769 -0.002112 0.001370 -0.001674 
+-0.001301 0.000590 -0.001281 0.002140 -0.001655 0.001090 
+0.003355 -0.000929 0.000542 0.000804 0.001146 0.004225 
+0.001653 0.003248 0.001190 0.000096 0.002555 0.000433 
+0.001664 -0.001644 0.001205 0.004885 0.002068 0.001140 
+0.002950 0.006120 -0.000465 0.002704 0.010767 -0.002299 
+-0.002639 -0.001268 0.001038 -0.015941 -0.000106 -0.000914 
+-0.011099 -0.000101 0.001252 0.003047 -0.000365 -0.000146 
+0.008215 0.002058 -0.001893 0.003349 -0.006631 -0.003912 
+-0.006526 -0.007664 -0.014636 -0.005264 0.007071 -0.015635 
+-0.006611 0.006119 -0.003467 -0.000176 0.002495 0.002966 
+0.000847 0.001056 0.003453 -0.000105 0.000291 0.000212 
+-0.000899 -0.001124 -0.000780 -0.001958 -0.002554 -0.002904 
+-0.003101 -0.001712 -0.004555 -0.001059 0.000671 -0.001939 
+-0.002386 0.000140 0.001142 -0.000800 -0.000343 0.000255 
+0.000806 0.001099 -0.000769 0.001672 0.003343 -0.002090 
+0.003627 0.005859 -0.003069 0.006459 0.003269 0.000040 
+-0.001162 0.002751 -0.005560 -0.001593 0.003619 -0.003183 
+-0.001427 0.002276 -0.000192 0.000122 -0.000243 0.001478 
+0.002951 -0.001069 0.000674 -0.001360 -0.002269 -0.000350 
+-0.003478 -0.000896 0.000751 -0.002580 0.002458 0.001191 
+-0.002255 0.002331 -0.000517 -0.001258 0.000705 0.000593 
+-0.000083 0.000019 0.000833 0.002256 0.000475 -0.000119 
+0.001615 -0.000530 -0.003507 0.001512 0.000351 -0.004219 
+-0.000031 0.002084 -0.002495 0.000139 0.000146 -0.002088 
+-0.000293 -0.000504 0.001246 -0.003365 -0.003731 0.004014 
+-0.005179 0.001436 0.000522 -0.008324 0.001312 0.001240 
+-0.012515 -0.009058 -0.010853 -1.457143 -2.861905 -0.980952 
+-0.876000 -3.788000 -0.876000 -0.020921 -3.610879 -0.870293 
+-0.003863 -0.019797 -0.011953 0.004987 -0.008524 -0.009504 
+0.005122 0.007362 -0.007403 -0.002512 0.003083 0.001124 
+0.000800 -0.000700 -0.000879 0.000680 0.000399 0.002387 
+-0.002695 0.002695 0.004687 -0.006203 0.000574 0.004767 
+-0.006050 -0.005440 0.000903 0.002023 -0.003489 -0.002438 
+0.002945 -0.000332 -0.003484 0.005795 0.002865 -0.003101 
+0.001130 0.004006 0.004192 0.000166 0.001825 0.000945 
+-0.001171 -0.001194 -0.001857 -0.003035 0.000036 -0.001401 
+0.000439 -0.000624 -0.000023 0.003691 -0.000415 -0.002872 
+0.001457 0.001218 -0.007609 -0.001635 -0.001064 -0.005024 
+-0.002403 0.001336 -0.002268 -0.000690 0.001645 0.001371 
+-0.001559 0.001967 0.001304 0.003242 0.000721 0.003082 
+0.000274 0.000398 0.005602 0.000223 0.001505 0.003406 
+-0.000704 -0.001268 0.003289 0.001835 0.000114 0.002911 
+0.000587 0.001518 0.003317 -0.000681 0.000249 -0.002756 
+-0.026585 0.008783 0.001686 -0.018433 0.001796 0.018065 
+1.659341 -3.016484 1.395604 2.854167 -3.041667 1.406250 
+0.023730 -0.019937 0.017565 0.009011 -0.003790 0.013740 
+0.003534 0.006603 -0.003034 -0.004960 0.004615 -0.001275 
+-0.001660 0.002979 -0.000947 -0.000735 0.000598 0.002098 
+-0.005702 -0.001810 0.004058 -0.004003 -0.003857 0.004491 
+-0.002587 0.000660 0.000405 -0.003433 -0.000306 -0.001823 
+-0.003256 0.001128 -0.002128 0.000843 -0.002192 0.002459 
+-0.001305 -0.006309 0.001686 0.002849 -0.002787 0.002655 
+0.004132 0.002894 0.002704 0.005776 0.006285 -0.002036 
+0.002864 0.000787 0.000440 -0.002648 -0.000652 -0.001310 
+-0.001900 0.000478 -0.004034 0.001754 0.001406 -0.005255 
+0.001784 0.003794 -0.005149 0.000074 0.002858 -0.001327 
+-0.000157 0.000364 -0.000114 -0.000911 0.002096 0.001549 
+-0.003840 -0.001548 0.006103 -0.001333 -0.000961 0.003073 
+0.000189 0.001971 -0.000537 0.000622 0.003697 -0.002268 
+0.000226 0.002313 -0.000289 -0.000040 0.000153 0.000002 
+-0.000951 0.000795 -0.000409 -0.001998 0.002132 -0.002167 
+-0.003034 0.001103 0.000207 -0.000352 -0.004460 0.001584 
+-0.003608 -0.006296 0.002877 0.000663 0.000325 0.000748 
+-0.000846 0.001978 0.001494 -0.002312 0.001936 0.000915 
+-2.434579 -2.200935 -1.289720 -2.476038 -5.130991 -1.047923 
+-2.342391 -6.470109 -0.774457 -1.931464 -6.467290 -0.629283 
+-0.723301 -4.800971 -0.752427 0.004892 -0.004963 -0.014031 
+0.013300 0.016192 -0.000909 0.000188 -0.001091 -0.000384 
+-0.004187 -0.003968 -0.005172 -0.000987 -0.001965 -0.001800 
+-0.002006 0.002877 -0.001097 0.000836 -0.001642 0.001762 
+-0.001712 -0.010183 0.000788 -0.000113 -0.002054 -0.003107 
+0.001371 0.004559 -0.009585 0.003838 0.001040 0.004846 
+0.003704 -0.000657 0.003063 -0.001330 -0.000394 -0.000739 
+-0.005019 -0.000307 0.000140 -0.003781 -0.001360 -0.000664 
+-0.003756 -0.003374 -0.002003 0.000414 -0.003561 -0.003498 
+0.002654 -0.004580 0.000047 0.000394 0.001038 0.001240 
+0.001315 0.002851 -0.004934 -0.002736 0.002893 0.002085 
+-0.000725 0.000449 0.000596 0.000740 -0.001487 -0.001380 
+0.002459 -0.003996 0.001229 0.000744 -0.003016 0.001992 
+-0.002734 -0.001151 0.001583 -0.006894 0.002063 0.002250 
+-0.003225 -0.000179 0.006153 -0.004896 0.002921 0.004120 
+0.005577 -0.005958 0.008766 1.716895 -3.027397 0.863014 
+4.004132 -3.450413 1.380165 3.694323 -3.362445 1.681223 
+2.728723 -2.664894 1.489362 0.002267 -0.012271 0.008480 
+0.011248 0.010369 -0.003968 -0.000435 0.009210 0.004151 
+-0.000168 0.006805 -0.003587 -0.003155 0.000094 -0.003904 
+-0.004008 0.003425 -0.004476 -0.005451 -0.000905 0.003449 
+-0.005922 0.002961 0.003953 -0.007854 0.003401 0.002255 
+-0.003567 0.006585 0.000671 0.001469 0.002361 0.001076 
+0.003508 0.000090 -0.000705 0.004954 -0.001478 0.000410 
+0.000091 -0.000878 0.005812 -0.000551 0.000259 0.005021 
+-0.000454 -0.000040 0.000146 -0.001690 -0.000282 -0.005341 
+-0.001147 -0.004056 -0.005290 -0.004647 -0.002725 -0.001922 
+-0.000945 -0.001563 -0.000563 0.000547 0.001804 -0.000449 
+0.002165 0.002340 -0.000386 0.001083 -0.000438 0.002912 
+-0.000256 -0.001544 0.006237 -0.000803 -0.003591 0.003959 
+0.001679 -0.000045 -0.002286 0.005051 0.004282 -0.005821 
+0.006087 0.003839 -0.004369 0.003134 0.000822 -0.000026 
+-0.000416 -0.000284 -0.000165 -0.002009 0.002567 -0.001842 
+-0.000144 0.004185 -0.001477 0.001857 0.000146 -0.001114 
+-0.002050 -0.001931 -0.000608 -0.003047 0.000494 -0.000082 
+0.000732 0.001756 -0.000438 0.002223 0.001719 0.001130 
+-0.014465 -0.025204 -0.009193 -2.670370 -5.837037 -1.125926 
+-3.058172 -7.307479 -0.722992 -3.317143 -7.554286 -0.228571 
+-2.877119 -6.317797 0.004237 0.000216 -0.014272 -0.006929 
+0.002157 -0.001438 -0.006636 -0.000447 0.001361 0.002594 
+-0.008867 -0.010250 0.003577 -0.008472 -0.004238 0.000704 
+-0.004790 0.000629 0.000061 -0.002231 -0.001726 -0.000714 
+0.001948 -0.003115 -0.001571 0.000471 0.000030 -0.004843 
+0.008630 0.005215 -0.005940 0.004451 0.002078 -0.008393 
+0.002219 0.004247 -0.006054 0.003150 0.001260 -0.003780 
+-0.000897 0.000885 -0.005353 -0.001833 0.000014 -0.000002 
+0.001281 -0.002964 -0.001023 0.001727 -0.003762 -0.001244 
+0.000156 -0.003284 -0.000782 0.000518 0.001180 0.000802 
+0.004027 0.002360 0.001545 0.007206 0.005873 -0.001722 
+0.004337 0.002623 -0.004942 -0.000353 -0.000095 -0.001943 
+-0.002886 0.001234 -0.001169 -0.006278 0.000506 -0.003888 
+-0.006765 0.007353 0.003309 -0.005319 0.006895 0.006874 
+0.006274 -0.004727 -0.002009 1.860825 -2.752577 0.175258 
+3.349810 -3.482890 0.505703 4.272414 -3.596552 0.865517 
+4.158730 -3.420635 1.238095 3.302703 -2.843243 1.383784 
+0.021884 -0.018167 0.007023 0.014757 -0.003253 0.000050 
+0.003893 0.002832 -0.000315 -0.003976 0.004341 0.001193 
+-0.006524 0.005476 0.000349 -0.003907 0.004615 -0.001799 
+-0.002971 0.003104 -0.001959 -0.002358 0.002380 -0.000498 
+-0.007176 -0.002220 0.001480 -0.006197 -0.001915 -0.001640 
+-0.003951 -0.000445 0.000724 -0.001325 0.002278 -0.001095 
+-0.001171 0.001529 0.000462 -0.002904 -0.000533 0.004929 
+-0.000984 0.001361 0.004607 -0.001386 0.000522 0.002538 
+0.001190 0.000098 0.000269 0.002492 0.003432 -0.003440 
+0.002366 0.000904 -0.003571 -0.007513 0.000090 0.000668 
+-0.004341 0.001439 -0.003187 -0.004795 -0.004230 0.004523 
+-0.000182 0.000120 0.000279 0.000194 -0.000600 -0.002119 
+-0.003689 0.000442 -0.001548 -0.005125 -0.002425 0.002756 
+-0.002232 -0.004199 0.001160 0.000947 0.000490 -0.000668 
+0.003594 0.000422 0.001266 0.001645 0.001549 0.001530 
+-0.004238 -0.003127 0.004289 0.000209 -0.003218 0.002992 
+-0.001709 0.003220 -0.002240 -0.003681 0.005739 -0.003110 
+-0.002297 0.003675 -0.002066 -0.001561 0.000363 0.001779 
+-0.003637 -0.001775 -0.000013 -0.000248 -0.000981 0.001003 
+-0.008510 -0.008206 -0.002176 -2.890323 -5.322581 -1.058064 
+-3.451220 -7.081301 -0.516260 -3.799320 -7.207483 0.125850 
+-3.555102 -6.093877 0.314286 -0.010544 -0.024057 0.000009 
+0.014506 0.024620 -0.000242 0.007069 0.013508 0.009954 
+-0.001794 0.000892 0.003912 -0.000565 -0.001921 0.001807 
+-0.005701 -0.003227 0.002957 -0.000764 0.000891 0.005149 
+0.001339 -0.002229 0.005792 0.001145 0.000153 -0.000840 
+0.005663 0.002362 -0.001863 0.005604 0.009850 -0.002259 
+0.008270 0.002714 -0.001739 0.002737 0.001685 -0.005576 
+-0.001536 -0.001533 -0.001993 0.000187 -0.000310 -0.001813 
+0.001463 0.000748 -0.000206 -0.000150 -0.003434 -0.000252 
+-0.001899 -0.004577 -0.000899 0.000694 0.000160 0.001165 
+-0.002186 0.003279 -0.002895 0.004067 0.001248 -0.003629 
+-0.002309 -0.004938 0.001061 -0.000005 -0.003090 0.007079 
+-0.008655 0.001256 0.005888 -0.006464 -0.001552 0.001093 
+0.003916 -0.001871 0.000306 0.023257 -0.020255 -0.006109 
+3.259574 -3.638298 -0.417021 4.229730 -3.868243 -0.155405 
+4.681388 -3.864353 0.255520 4.451852 -3.707407 0.762963 
+3.870056 -3.129944 1.192090 0.028226 -0.021742 0.001989 
+0.024556 0.004852 -0.003193 0.005961 0.008781 0.000495 
+-0.001629 0.005924 -0.002336 -0.003952 0.005285 -0.000143 
+-0.002044 0.000322 -0.000531 -0.001380 -0.000558 -0.001967 
+-0.003732 0.001215 0.001736 -0.005255 -0.000897 0.001122 
+-0.000645 0.000383 -0.000859 0.002493 0.001925 0.003502 
+-0.001970 0.004043 0.002464 -0.004683 -0.001912 0.000787 
+-0.005136 -0.001799 0.001853 -0.000395 0.001190 -0.000089 
+0.003758 0.003996 -0.005547 0.004461 0.005356 -0.003480 
+-0.002555 -0.000398 -0.004950 0.000274 -0.001122 -0.000524 
+-0.003389 0.001132 0.002824 -0.004665 0.000333 0.001916 
+-0.001320 -0.002120 -0.001200 0.000151 -0.002732 -0.000569 
+0.005312 -0.000547 -0.001953 -0.000643 0.001328 0.000384 
+-0.002400 0.003657 0.000328 -0.006103 -0.001570 -0.000555 
+-0.002730 -0.003058 0.002315 0.000821 0.001128 -0.002026 
+-0.000560 -0.000256 -0.000128 -0.001753 0.001924 -0.000109 
+-0.000702 -0.001377 -0.000353 -0.001373 -0.003906 0.002259 
+-0.003859 0.000608 0.004286 -0.003299 0.000786 0.004081 
+-0.001862 -0.001526 0.003186 -0.000800 -0.002653 0.001937 
+-0.002463 -0.001376 0.001851 -0.005697 0.001814 0.003439 
+0.004308 0.021770 0.002664 -0.025871 -0.029773 -0.006447 
+-3.802632 -6.414474 0.105263 -4.106667 -6.377778 0.444444 
+-3.797468 -5.320675 0.658228 -2.212766 -2.760638 0.718085 
+0.001165 0.010800 0.005713 -0.000703 0.016370 0.010697 
+-0.000163 0.003415 0.002170 -0.000920 -0.003969 -0.000257 
+-0.003401 -0.001168 0.001555 -0.000016 0.000562 -0.000120 
+-0.002035 -0.001811 0.001340 -0.003485 -0.003653 0.002643 
+0.000724 -0.003620 0.000882 -0.000962 0.000792 -0.003596 
+-0.001298 -0.001058 -0.005204 -0.001220 0.000085 -0.003613 
+-0.000202 -0.002014 -0.000552 -0.000785 -0.002326 -0.000885 
+0.000503 -0.003936 0.003249 -0.002923 0.002850 0.001127 
+-0.007258 0.002007 0.003211 0.000714 0.003912 -0.001521 
+0.001663 0.008928 -0.005233 -0.003196 0.005713 -0.004517 
+-0.000763 -0.001340 0.004184 0.002481 -0.008569 0.004894 
+0.003321 -0.003141 -0.000072 0.013552 -0.008536 -0.004285 
+3.125000 -2.978261 -0.842391 3.903846 -4.050000 -0.838462 
+4.040498 -3.791277 -0.595016 4.355556 -3.568254 -0.400000 
+4.743802 -3.429752 -0.206612 4.900709 -3.148936 0.141844 
+0.040957 -0.022208 -0.003750 0.029935 0.016278 -0.003790 
+0.000719 0.014261 0.001065 -0.003227 0.006907 -0.001268 
+-0.004598 0.004434 0.001796 -0.002952 0.003209 0.003390 
+-0.001797 0.001344 -0.000637 0.000559 0.001049 -0.003776 
+-0.002113 -0.000854 0.000371 -0.003019 -0.000153 0.000722 
+0.000430 -0.000956 0.004037 0.003386 0.005565 0.002906 
+0.003946 0.004379 -0.001999 0.001835 0.000139 -0.005296 
+-0.001620 -0.002149 -0.006182 0.001385 0.002596 -0.003670 
+0.004384 0.003652 -0.001736 0.002832 0.003196 0.000678 
+-0.004143 0.000777 -0.002450 0.000574 -0.000498 -0.006039 
+0.001565 0.000012 -0.000984 -0.002927 0.001052 -0.002387 
+0.000000 0.001270 -0.003254 -0.000384 0.000639 -0.002939 
+0.002898 -0.001208 -0.004672 0.003614 0.000023 -0.007353 
+-0.000871 0.007671 -0.004489 -0.003406 0.005964 -0.006829 
+0.000049 0.005640 -0.006948 0.004841 0.004154 -0.007058 
+0.007414 0.000248 -0.002416 0.004047 0.003549 -0.000093 
+-0.000078 0.005769 0.001154 -0.002668 0.001840 -0.000951 
+-0.001358 0.000490 0.001314 -0.000170 -0.001969 0.000676 
+0.001302 -0.002045 -0.000447 0.001880 -0.001454 0.000734 
+-0.000579 0.000003 0.001561 -0.004399 0.002424 0.004887 
+0.009859 0.018333 0.000183 -0.012193 -0.006335 0.000304 
+-3.733333 -5.000000 0.657143 -4.087432 -5.644809 0.874317 
+-3.724576 -4.911017 1.076271 -2.660465 -3.330233 0.911628 
+-0.002828 -0.004699 0.002568 -0.002284 0.015525 0.001393 
+-0.006064 0.002169 0.008527 -0.009193 -0.009656 0.006629 
+-0.006929 -0.005543 0.002771 0.000160 -0.002471 -0.001422 
+-0.000735 -0.000764 -0.003353 -0.002718 -0.001725 -0.002184 
+-0.000247 -0.001125 -0.001564 0.000136 -0.001970 -0.001141 
+0.000863 -0.000780 -0.001531 0.000112 -0.000528 -0.004726 
+0.000178 0.000183 0.000101 0.001508 -0.003621 0.001031 
+-0.003254 -0.002664 0.004537 -0.000066 -0.000266 0.002783 
+0.000231 0.005556 -0.000123 0.004115 0.005609 -0.000257 
+0.001107 0.005440 -0.000211 -0.004359 0.002421 0.000133 
+-0.004269 0.000806 0.005061 0.003411 -0.009623 -0.001965 
+0.011630 -0.019093 -0.003547 2.653266 -3.140703 -0.768844 
+3.794677 -3.844106 -1.049430 4.239202 -3.724252 -1.029900 
+4.407273 -3.283636 -0.865455 4.254902 -2.607843 -0.759804 
+0.033283 -0.029954 -0.010833 0.013930 -0.025659 0.008207 
+0.036735 -0.000049 -0.000621 0.004330 -0.000241 -0.007645 
+0.009603 0.016097 0.006885 0.006316 0.004791 0.005704 
+0.001746 0.002089 0.004759 -0.002282 -0.001849 0.000638 
+-0.003831 -0.000059 -0.003073 -0.003086 -0.000841 -0.004582 
+-0.002204 0.002007 -0.001903 -0.000972 0.001842 0.001629 
+-0.001056 0.003247 0.000919 -0.003328 0.000652 0.001240 
+0.000190 -0.002361 -0.005177 -0.002256 0.000562 -0.008642 
+-0.004045 0.000906 -0.005434 -0.003623 0.002203 -0.003310 
+-0.001531 0.007233 -0.003361 0.000326 0.010641 0.000565 
+-0.002233 0.010169 -0.000231 0.002503 0.005100 -0.011686 
+-0.000535 -0.002202 -0.008557 -0.004409 -0.000072 -0.005276 
+-0.002811 -0.000236 0.003476 -0.003348 -0.001031 0.004600 
+-0.001381 0.001636 -0.000639 0.002937 0.000398 -0.006547 
+-0.002143 0.002806 -0.007982 -0.002221 0.001168 -0.001144 
+0.002238 0.001674 0.001860 0.005657 0.003788 -0.002320 
+0.004305 0.005828 -0.003961 -0.000864 0.003834 -0.003586 
+-0.005110 0.002451 0.002868 -0.002663 -0.001775 0.004538 
+-0.000478 0.001250 0.000119 0.006364 0.002219 -0.000873 
+0.007390 0.004205 -0.003037 0.002648 0.002928 0.000985 
+0.000274 -0.002951 0.003067 0.000435 -0.005563 0.007327 
+0.007181 0.012043 0.001385 0.001556 0.007514 -0.001723 
+-0.021587 -0.033323 0.008808 -3.714286 -5.032467 0.857143 
+-3.789238 -4.793722 0.901345 -3.269058 -3.905830 0.668161 
+-0.010270 -0.019626 0.006867 0.007505 0.016980 -0.005855 
+0.014814 0.017461 0.003359 -0.001498 0.000978 0.004350 
+-0.004395 -0.005466 0.004479 -0.006369 -0.002482 0.004379 
+-0.001393 -0.000668 0.002907 -0.004245 -0.000075 -0.000773 
+-0.003197 -0.000806 -0.000261 -0.001757 -0.001317 0.001863 
+0.000070 -0.000191 0.001788 0.000624 0.005239 -0.003183 
+0.003935 0.005851 -0.004631 0.000211 0.004994 -0.002288 
+-0.002686 0.003626 0.002408 -0.000677 -0.000123 -0.000397 
+0.001919 0.003815 -0.005854 0.000665 0.008515 -0.005981 
+-0.005639 0.006566 0.000080 -0.006671 -0.005252 0.006469 
+0.003323 -0.011163 0.000929 0.014085 -0.017557 -0.006092 
+2.697917 -3.015625 -1.052083 3.665385 -3.461539 -1.180769 
+3.858553 -3.486842 -1.194079 3.977444 -3.496241 -1.236842 
+4.650307 -3.110430 -1.306749 0.043736 -0.023434 -0.013248 
+0.006678 -0.008789 -0.012644 0.001806 -0.007381 0.008251 
+-0.010544 -0.008211 0.009497 -0.014678 -0.008794 0.006606 
+-0.000777 -0.000030 -0.000121 -0.012905 0.022479 -0.013034 
+0.004022 0.015265 0.010042 0.001391 -0.001704 0.002856 
+-0.000374 -0.001981 -0.001395 -0.002659 -0.000041 -0.003772 
+-0.002070 0.001245 -0.002783 0.000244 -0.000855 -0.001058 
+-0.000577 -0.001415 0.000149 -0.003562 0.001830 -0.000445 
+-0.002998 -0.000526 -0.001788 -0.000524 -0.001154 -0.002797 
+-0.000282 0.000705 -0.002215 0.000942 0.004796 -0.001814 
+0.003137 0.004873 -0.005041 -0.003183 0.001061 -0.004957 
+0.002924 0.003163 -0.008515 -0.000185 0.005244 -0.005984 
+-0.001910 0.002442 -0.005520 -0.006881 -0.000807 -0.005924 
+-0.008657 -0.001879 -0.004531 -0.004453 0.001312 -0.002063 
+-0.000680 -0.000462 -0.001102 -0.001272 0.003157 -0.001359 
+-0.002489 0.005809 -0.002927 -0.003174 0.003206 -0.001990 
+0.000899 0.000532 0.000092 0.002947 0.000943 -0.002888 
+0.002184 0.004239 -0.007548 -0.000567 -0.000486 -0.007840 
+-0.001105 -0.000285 -0.002198 -0.002947 0.001328 0.002092 
+0.001264 0.003780 -0.001084 0.001355 0.004300 0.001381 
+-0.000390 -0.000201 -0.001431 -0.002728 -0.001007 -0.000737 
+-0.004192 -0.002163 -0.004066 -0.005293 -0.000287 -0.009257 
+0.006315 0.011351 0.002376 0.009931 0.009644 0.002142 
+-0.007261 -0.017284 0.001899 -3.240741 -4.796296 0.731481 
+-4.093567 -4.918128 1.187135 -3.936585 -4.258537 1.414634 
+-2.827586 -2.804598 1.195402 0.003200 0.004086 -0.000932 
+0.033315 0.021849 -0.001931 0.007919 0.015744 -0.008706 
+-0.000220 0.000644 -0.003639 -0.006509 0.001262 -0.000179 
+-0.003573 0.000757 0.000887 -0.000208 0.001810 -0.000841 
+-0.001968 -0.001052 0.000843 -0.003050 -0.002936 -0.000122 
+-0.000841 -0.000999 0.000892 0.004442 0.000344 -0.000025 
+-0.000222 0.000390 -0.000338 -0.002627 0.003320 0.001096 
+-0.003007 0.003341 0.001503 -0.001509 0.001970 0.000293 
+-0.000009 -0.000137 -0.001932 -0.003530 -0.001069 -0.000788 
+-0.009262 -0.005092 0.000624 -0.002831 -0.004784 0.006715 
+0.012090 -0.018495 -0.007548 2.561497 -2.668449 -1.165775 
+3.538153 -3.373494 -1.224900 4.032374 -3.863309 -1.284173 
+3.823293 -4.220883 -1.297189 3.262857 -4.240000 -1.325714 
+0.011889 -0.039008 -0.013552 -0.001492 0.002567 -0.005907 
+0.006924 -0.008675 -0.005656 0.007025 -0.022745 -0.000758 
+-0.749035 -3.416988 -0.254826 -0.626335 -3.747331 -0.274021 
+-0.339921 -3.616601 -0.561265 0.670455 -1.352273 -0.750000 
+0.013640 0.014511 -0.001081 0.009167 0.004333 -0.000485 
+-0.003994 -0.005062 0.000889 -0.007973 -0.005096 -0.000523 
+-0.003808 -0.003352 0.000087 -0.001552 -0.000881 0.001216 
+0.002092 -0.003019 0.000921 0.000673 -0.001859 -0.000054 
+0.002696 0.000024 -0.000716 0.004673 0.000425 -0.002190 
+0.001352 -0.001133 -0.002664 -0.000017 0.002893 -0.002635 
+-0.003556 0.004542 -0.003357 -0.003292 0.004402 -0.000421 
+-0.002458 -0.000168 -0.000404 -0.000552 -0.000382 0.000805 
+-0.000390 0.000526 0.000516 -0.003678 0.000367 0.000990 
+-0.007889 -0.001732 0.001418 -0.009242 -0.002204 -0.001216 
+-0.003746 -0.001691 -0.004139 -0.002483 0.005017 -0.000350 
+-0.002745 0.007731 0.001934 -0.002452 0.005964 -0.001167 
+-0.001830 0.003137 -0.000744 0.000677 0.000522 -0.003836 
+-0.000800 0.002174 -0.002344 0.000280 0.002372 -0.000367 
+0.000304 0.000389 -0.000073 0.000540 0.002561 -0.000289 
+0.002080 0.002867 0.002046 -0.000809 0.001455 0.000889 
+-0.000355 -0.000414 -0.000342 -0.001123 0.001284 0.004245 
+0.001299 0.000918 0.002295 -0.002360 -0.001969 -0.002319 
+0.008050 0.007626 0.002807 0.014355 0.011519 0.002346 
+0.010429 -0.000223 0.005046 -0.020186 -0.033861 0.001693 
+-3.905172 -5.043103 2.025862 -4.121951 -4.445122 2.018293 
+-3.365714 -3.211429 1.611429 -0.013866 -0.009991 0.004678 
+0.016970 0.012885 -0.005478 0.014406 0.022194 -0.005646 
+0.007550 0.008236 -0.005505 0.001396 0.003562 -0.001975 
+-0.000418 -0.000218 -0.001000 -0.002013 0.002035 -0.001688 
+-0.006721 -0.001011 -0.000386 -0.006312 -0.003518 -0.003407 
+-0.002890 -0.005294 0.000720 0.004579 -0.000110 -0.001849 
+0.002095 -0.001848 0.000030 0.000057 -0.001051 0.001008 
+0.003229 0.000646 0.004234 0.000883 0.000498 -0.000300 
+-0.003119 -0.003546 0.003626 -0.008465 -0.006460 0.002650 
+-0.002649 -0.009103 0.005436 0.012056 -0.008320 0.001865 
+0.022664 -0.018136 -0.009317 2.977578 -2.560538 -0.887892 
+3.287356 -3.333333 -1.053640 3.708696 -4.126087 -1.321739 
+3.736842 -4.888158 -1.473684 0.028586 -0.008555 -0.002696 
+0.001511 -0.005188 -0.006755 -0.013417 0.004020 -0.001665 
+-0.007222 0.000000 -0.003210 -0.009894 -0.009554 -0.004588 
+-0.200000 -3.804255 -0.178723 -0.391566 -3.819277 -0.216867 
+-0.458333 -3.316667 -0.363889 -0.598540 -2.733577 -0.335766 
+-0.000816 -0.003491 -0.001222 0.003455 0.008699 -0.007853 
+0.002618 0.004396 -0.001432 -0.002300 -0.000508 -0.000161 
+-0.000711 0.000280 0.001606 0.002210 0.000235 0.003310 
+0.001979 -0.000867 0.002957 -0.001078 -0.000435 0.000784 
+-0.000565 -0.002021 -0.000059 0.002901 -0.000721 -0.000733 
+0.000912 0.000433 -0.000851 -0.003097 0.001702 -0.000244 
+-0.005083 0.001204 -0.001479 -0.005185 0.000993 -0.005346 
+-0.003086 0.001595 -0.006773 0.000840 0.000720 -0.002760 
+-0.000598 0.001542 0.003981 -0.002357 0.002639 0.006436 
+-0.004201 0.000288 0.003630 -0.007925 -0.002277 -0.001973 
+-0.006453 -0.002716 -0.006435 -0.002512 -0.000608 -0.003137 
+0.000898 0.002996 0.001437 0.002190 0.001496 -0.000935 
+-0.001330 0.000595 -0.000204 -0.003432 0.002007 -0.001746 
+-0.004063 -0.001109 -0.003113 -0.001705 0.000214 -0.001516 
+0.000017 0.001153 -0.000305 -0.000162 0.000739 -0.000341 
+0.000076 -0.001164 -0.001002 0.003102 -0.001499 -0.001664 
+0.006798 -0.001455 -0.001814 0.012258 -0.002797 -0.002559 
+0.020321 0.002114 0.003317 0.025968 0.002781 0.014780 
+0.001071 -0.002764 0.002051 0.011930 0.006226 0.000766 
+0.013301 0.006413 0.003360 0.004601 -0.011770 0.006998 
+-0.026998 -0.029506 -0.002472 -3.860870 -4.295652 1.939130 
+-3.701389 -3.479167 1.569444 -0.023009 -0.017599 0.006668 
+0.005137 0.006040 -0.001387 0.027065 0.018406 -0.006021 
+0.007866 0.021388 -0.016363 0.006981 0.011587 -0.009372 
+0.000831 0.006376 -0.005270 0.001917 0.002555 -0.001039 
+-0.000444 0.000903 0.001762 -0.008750 0.000312 0.000469 
+-0.007734 -0.001055 -0.001055 -0.001425 0.000963 -0.000563 
+0.001687 0.005227 0.003796 0.009910 0.006234 0.003278 
+-0.002215 0.002564 0.002758 -0.001741 0.005780 0.000488 
+-0.006618 0.001527 0.007128 -0.001429 -0.005527 0.006593 
+0.008113 -0.008376 0.001238 0.018362 -0.009817 -0.000343 
+0.025340 -0.015550 -0.001887 2.804878 -2.268293 -0.639024 
+2.712821 -2.887179 -0.948718 2.533333 -3.233333 -1.173333 
+0.027007 -0.015412 -0.008729 0.000080 -0.000596 0.000845 
+-0.001674 -0.004044 -0.000042 -0.006996 -0.003956 0.001129 
+-0.002893 -0.000977 0.005261 0.002671 -0.003367 0.001110 
+-0.000629 -0.000182 -0.003400 -0.015172 -0.011894 -0.009080 
+-1.400000 -2.500000 -0.040909 -0.009935 -0.011504 -0.012805 
+-0.008978 -0.020124 -0.001279 -0.000193 -0.002578 0.004865 
+0.008252 0.012442 0.002146 0.007230 0.009182 -0.006629 
+0.000128 0.000912 0.001394 0.002288 0.007072 0.003212 
+0.003352 0.004848 0.005022 0.002729 0.000556 0.000758 
+-0.001363 -0.002441 0.001348 -0.000591 -0.001783 0.002804 
+-0.004563 0.000832 0.002189 -0.001014 0.002872 -0.001295 
+-0.002012 0.004547 0.001602 -0.002686 0.001911 0.000135 
+-0.004035 0.002107 -0.002278 -0.005833 0.002651 -0.001129 
+-0.006564 0.000879 0.000206 -0.003548 -0.000032 -0.001022 
+0.001198 0.000103 -0.001377 0.001225 0.001002 0.000913 
+-0.003294 0.001175 0.000310 -0.001997 -0.002219 -0.001574 
+-0.000116 -0.001556 0.000243 -0.001670 0.004369 -0.000128 
+-0.002624 0.005148 0.000969 -0.003672 -0.000085 0.001099 
+-0.004926 -0.000267 0.000296 -0.006444 -0.000508 -0.001367 
+-0.010104 0.001445 0.000481 -0.006174 0.002644 -0.006566 
+-0.006190 0.004815 -0.001460 0.008836 0.005912 0.000951 
+0.028988 0.000272 0.005576 4.921212 -0.672727 0.884848 
+6.275132 -1.185185 1.830688 7.472081 -1.091371 2.573604 
+-0.001699 -0.001350 0.001035 0.003162 0.002347 -0.003867 
+0.012226 0.008987 -0.002176 0.012448 0.009222 0.001311 
+0.003252 -0.007780 0.004551 -0.024499 -0.020518 -0.008220 
+-0.035812 -0.032275 0.013027 -0.024636 -0.023305 0.002726 
+-0.007989 -0.004898 -0.000105 0.009916 0.007314 0.001106 
+0.015495 -0.001252 -0.003757 0.010812 0.014872 -0.010812 
+0.004872 0.006947 -0.006887 0.000685 -0.001110 -0.000800 
+0.000895 -0.000600 -0.000677 -0.002417 0.000357 0.000311 
+-0.002747 -0.002022 -0.001313 0.001796 -0.000780 0.000677 
+0.003610 0.001243 0.003033 0.001853 0.004258 0.003772 
+0.000064 0.010317 -0.000011 -0.005402 0.003959 -0.002409 
+0.003555 -0.003848 0.004349 0.018171 -0.012080 0.006402 
+0.025721 -0.016238 0.005307 2.763033 -1.734597 0.360190 
+2.842365 -1.709360 -0.098522 0.019736 -0.022354 0.003209 
+0.019995 -0.019331 -0.011537 0.011356 -0.006248 -0.007074 
+-0.006490 0.001573 0.001216 -0.008326 -0.003169 0.004219 
+-0.000780 -0.000247 0.002303 0.000815 -0.000035 0.000826 
+-0.002826 0.000777 -0.000995 -0.001098 0.008170 -0.001523 
+0.009145 0.014920 -0.003538 -0.003653 -0.003353 -0.006413 
+-0.014502 -0.014236 -0.002493 -0.017766 -0.016565 -0.000030 
+-0.015646 -0.014632 0.000154 -0.005343 -0.007705 0.000952 
+0.003901 0.008427 0.002637 0.012632 0.006395 -0.004974 
+0.000437 0.002978 -0.001295 -0.005293 0.002962 0.005101 
+-0.001580 -0.002284 0.002281 0.001354 0.000614 -0.000831 
+0.001471 -0.002206 0.001029 -0.003215 -0.004592 0.004267 
+-0.004592 -0.001021 0.002040 0.000114 0.001619 0.001466 
+-0.001192 0.001308 -0.000328 -0.004043 0.000387 0.003495 
+-0.009436 -0.001647 0.007308 -0.011334 -0.002447 0.005410 
+0.000000 -0.000963 0.002444 -0.001599 0.000489 0.003165 
+-0.000211 0.005752 0.002114 0.002681 0.008303 0.003996 
+0.002541 0.006779 0.004074 -0.001214 0.003151 0.000847 
+-0.002484 -0.003104 -0.000009 -0.006707 0.001276 -0.001439 
+0.001928 0.007710 -0.003692 0.002184 0.008257 0.001159 
+-0.007928 0.002267 0.005383 -0.016579 -0.006714 0.009550 
+-0.006176 -0.005238 -0.010294 -0.022785 -0.002633 -0.004840 
+-0.006578 0.001219 -0.000680 0.014869 0.002684 0.002294 
+0.035680 -0.000744 0.014296 5.524064 -0.593583 2.224599 
+6.540425 -0.800000 2.514894 7.061069 -0.740458 2.480916 
+0.000619 -0.003996 0.001797 0.000310 -0.001618 0.000097 
+0.005604 0.004264 -0.004966 0.010815 0.011826 -0.001801 
+0.010145 0.010625 -0.000051 0.004332 -0.001415 0.002268 
+-0.010798 -0.016544 0.005668 -0.006049 -0.024968 0.002634 
+-0.010619 -0.017283 -0.000784 -0.002511 -0.004319 0.000199 
+0.007264 0.008191 0.000144 0.003693 0.008321 0.006306 
+-0.001695 0.004202 -0.000642 -0.003815 -0.000411 -0.002959 
+0.000595 -0.001652 -0.000991 0.002975 -0.000365 -0.002178 
+0.005023 0.000541 0.000078 0.003814 -0.002058 0.002220 
+0.000424 0.000687 0.000110 -0.003676 0.002349 0.001554 
+0.000435 -0.001046 0.007451 0.012230 -0.014949 0.014397 
+3.013274 -2.199115 1.672566 3.891386 -2.382022 1.715356 
+3.838710 -2.397850 1.512545 3.270270 -2.173745 1.038610 
+2.657143 -1.638095 0.304762 0.006657 -0.014617 -0.004407 
+0.003645 -0.001370 -0.014252 -0.000903 0.002219 0.000156 
+-0.019294 -0.006579 -0.011606 -0.021736 -0.007040 0.004623 
+-0.007093 -0.007907 -0.000957 -0.005317 -0.006241 -0.002601 
+-0.004238 -0.002799 -0.002261 -0.007469 0.004236 0.000245 
+-0.001380 0.006565 0.001509 -0.001154 0.004331 -0.007021 
+-0.003115 -0.010613 -0.008643 -0.008832 -0.011780 -0.002091 
+-0.011172 -0.009700 -0.002794 -0.006553 -0.009570 -0.003460 
+0.001731 -0.002737 0.003484 0.016575 0.012016 0.000137 
+0.007190 0.016366 0.001917 -0.001323 0.004734 -0.004555 
+-0.006877 -0.003594 -0.001239 -0.001515 -0.003593 -0.000559 
+0.004132 0.001776 -0.000737 0.002454 0.001076 0.000696 
+-0.002879 0.000603 0.001637 -0.001334 0.000793 0.000409 
+0.000016 0.000513 -0.001079 0.001269 0.002539 0.000534 
+-0.002869 0.000818 -0.000820 -0.004017 0.000379 -0.001481 
+-0.001678 0.000488 0.001625 -0.002594 0.001729 0.001550 
+-0.001623 0.002183 0.003975 -0.001242 0.002150 0.003983 
+-0.000681 0.000535 0.001744 -0.000465 -0.000935 -0.001288 
+-0.003941 0.001120 0.001182 -0.004557 -0.000911 -0.003646 
+-0.001791 0.002090 -0.000746 -0.001878 -0.001341 0.004015 
+-0.004445 -0.003855 0.005174 -0.013502 -0.002693 -0.003530 
+-0.014489 -0.003734 -0.008752 -0.013798 -0.005672 -0.006370 
+-0.006667 -0.000397 0.001689 0.005935 -0.001774 0.000222 
+0.015413 -0.004971 0.000951 0.029275 -0.000787 -0.001298 
+0.037859 0.009726 0.007044 4.515528 -0.434783 1.260870 
+-0.001948 -0.005793 0.003461 -0.003615 -0.003690 0.002862 
+-0.000156 0.000443 0.001674 0.004201 0.001832 0.001975 
+0.006459 0.011569 -0.001082 0.008079 0.012372 -0.002594 
+0.003054 0.003491 -0.000407 -0.003711 -0.008774 -0.000707 
+-0.008107 -0.004332 -0.004385 -0.003894 0.001564 -0.001757 
+0.001842 0.009408 -0.001605 0.003148 0.008403 0.000878 
+0.000363 0.003145 -0.000506 0.000382 0.002308 -0.003886 
+-0.000390 0.000156 -0.001898 -0.000646 0.000190 0.001862 
+0.001696 -0.001881 0.001603 0.003225 0.000435 -0.003225 
+0.000536 0.000782 0.000305 0.005631 -0.000844 0.005405 
+1.010989 -1.840659 2.543956 3.434263 -2.498008 2.848606 
+4.645161 -2.690323 2.619355 4.734177 -2.629747 2.234177 
+4.134328 -2.343284 1.761194 2.856436 -1.806931 1.168317 
+0.015533 -0.011058 0.003928 0.003781 -0.002485 -0.004221 
+-0.002611 0.008780 -0.003593 -0.004150 0.000893 0.007629 
+-0.016661 0.001174 0.004225 -0.014757 0.001144 -0.005346 
+-0.005825 0.000272 -0.010262 0.000578 -0.002652 -0.006711 
+0.000002 -0.001858 -0.002025 -0.006635 0.001043 0.000695 
+-0.007940 -0.000913 0.007381 0.001063 -0.002541 -0.001045 
+0.004373 0.002577 -0.007183 0.000531 -0.007329 -0.010563 
+-0.006229 -0.012092 -0.006065 -0.009999 -0.014075 -0.001498 
+-0.012294 -0.010759 0.002110 -0.007218 -0.003657 0.000305 
+0.005091 0.002307 -0.002359 0.003022 0.008942 -0.003322 
+-0.003330 -0.002727 0.000268 -0.008063 -0.004384 0.003165 
+-0.002012 -0.001243 0.002748 0.001729 0.001019 0.001833 
+-0.000570 0.000877 0.000727 -0.002944 -0.001515 0.002617 
+-0.002360 0.001421 -0.001365 -0.000300 0.002775 0.001275 
+0.005200 0.010084 -0.006417 0.002678 0.003452 -0.006707 
+-0.000027 0.000074 -0.000203 0.000088 0.000180 0.003502 
+0.000918 -0.000216 0.004460 0.001014 -0.004173 0.003993 
+0.001203 -0.001178 -0.000677 0.000106 0.001664 -0.000194 
+0.000471 0.000708 0.000213 -0.006063 0.000337 0.000311 
+0.000131 -0.003109 0.002194 0.004166 -0.005163 -0.000332 
+0.003399 -0.004979 0.002495 -0.002271 -0.000650 -0.000908 
+-0.005534 0.002304 -0.004328 -0.005064 0.001638 -0.005687 
+-0.005727 -0.000431 -0.005005 -0.006068 -0.002161 -0.004497 
+-0.007418 -0.001915 -0.003798 -0.013309 0.001685 -0.007246 
+-0.022551 -0.003422 -0.012969 0.008237 -0.003256 -0.016741 
+0.000145 0.000167 0.000107 -0.001629 -0.000081 0.003835 
+-0.002581 -0.003069 0.003394 -0.002402 -0.001104 0.000346 
+-0.001523 0.003040 -0.003038 -0.002462 0.006946 -0.002962 
+0.000053 0.007898 0.000825 0.003758 0.005836 0.001685 
+0.000239 0.005009 0.000815 -0.000409 0.003531 0.002348 
+0.001545 0.002176 -0.006419 0.001949 0.001286 -0.008475 
+0.003442 -0.002535 -0.008328 0.003162 -0.003171 -0.004901 
+0.001908 -0.001154 -0.001856 -0.001035 -0.001193 -0.002480 
+-0.003922 -0.000869 -0.005382 -0.002772 0.000716 -0.006073 
+0.003127 -0.005053 0.003598 0.017721 -0.011902 0.013228 
+2.399039 -2.048077 3.057692 4.219008 -2.545455 3.239669 
+5.177489 -2.787879 3.051948 5.242774 -2.786127 2.508671 
+0.042078 -0.022575 0.016575 0.023395 -0.008519 0.005354 
+0.007993 0.000316 -0.008929 -0.001031 -0.000541 -0.012662 
+-0.007566 0.008750 -0.004607 -0.007245 0.005071 0.004981 
+-0.003595 0.004086 0.004543 -0.001032 0.001336 0.001413 
+-0.000999 0.000411 -0.000375 -0.002209 0.002076 -0.000466 
+-0.003265 0.000196 -0.002024 -0.005815 -0.004732 0.005711 
+-0.003869 -0.009105 0.006128 -0.005531 -0.006315 0.008175 
+0.000617 0.001692 0.000237 0.008739 0.005101 -0.008453 
+-0.002464 -0.013003 -0.005726 -0.010282 -0.014065 0.001152 
+-0.014654 -0.010897 0.003217 -0.019624 -0.011840 0.002180 
+-0.016865 -0.015805 0.005373 -0.007395 -0.008047 0.008510 
+0.002204 -0.001803 0.002804 0.000116 0.000457 0.000288 
+-0.000438 -0.001314 -0.000438 -0.000379 -0.001255 0.000146 
+0.002484 -0.001873 -0.001007 0.002756 -0.001741 0.000375 
+-0.003922 -0.002378 0.001627 0.000106 -0.002662 -0.000323 
+0.000198 0.000269 -0.002468 0.004814 0.003842 -0.004687 
+0.003614 0.001593 -0.001153 -0.002961 -0.001777 0.003862 
+-0.004137 -0.001533 0.010470 -0.000929 -0.001629 0.010614 
+-0.000534 -0.000349 0.005454 0.002149 0.001249 -0.001529 
+-0.004630 0.004217 -0.002280 -0.000313 -0.001748 -0.003340 
+-0.000603 0.000886 -0.005184 0.003463 -0.004096 -0.000984 
+0.004645 -0.003200 0.000567 0.000620 -0.001157 0.000620 
+0.000218 0.003758 -0.001835 0.001458 0.001733 0.001327 
+0.000677 0.001286 0.000350 -0.007616 -0.001870 -0.003281 
+-0.019694 0.000301 -0.002846 -0.011678 -0.001817 -0.006314 
+-0.004625 -0.003761 -0.010440 -0.027200 -0.013296 -0.014536 
+0.001138 -0.002836 0.001304 0.000257 -0.004586 0.002009 
+-0.000923 -0.000923 -0.000308 -0.004020 0.000977 -0.002596 
+-0.005669 0.004778 -0.003805 -0.003360 0.006304 -0.001707 
+0.000572 0.006637 0.000850 0.006940 0.001279 0.003645 
+0.006871 0.002086 -0.000485 0.004286 0.002397 0.001315 
+0.001010 0.000024 0.000761 -0.004564 0.000555 -0.001272 
+-0.009202 -0.003576 -0.004164 -0.002783 -0.006302 -0.006246 
+0.004790 -0.004888 -0.005525 0.001729 -0.004061 -0.002936 
+-0.006189 -0.003172 -0.004038 -0.001934 -0.002609 -0.003351 
+0.007667 -0.005542 0.010719 0.020355 -0.013007 0.013454 
+3.050955 -1.165605 2.828026 4.323077 -1.607692 3.107692 
+0.037956 -0.031479 0.025928 0.026514 -0.023075 0.021166 
+0.013123 -0.008453 0.012288 0.006975 0.005623 -0.007718 
+0.002226 0.002087 -0.021923 -0.006828 0.005622 -0.015622 
+-0.009290 0.004453 -0.005370 -0.004031 0.001586 -0.001031 
+-0.000547 -0.000519 -0.000496 -0.001506 -0.001446 0.000176 
+-0.001182 0.001129 0.002539 -0.004871 0.001496 0.001636 
+-0.005476 -0.000360 -0.000612 -0.001711 -0.003228 -0.004665 
+0.000054 -0.001835 -0.002478 -0.004508 -0.003508 0.008021 
+-0.009878 0.000256 0.011149 -0.001657 0.002632 0.004043 
+0.003864 -0.001735 -0.005469 -0.008222 -0.010748 -0.000095 
+-0.021690 -0.015623 0.005564 -2.946079 -1.656863 0.759804 
+-3.074074 -1.509259 0.939815 -0.023628 -0.015084 0.006519 
+-0.008999 -0.004809 0.001843 0.005730 0.004355 -0.008043 
+0.008708 0.007230 -0.004587 0.001161 -0.001366 -0.002238 
+-0.000116 0.001099 -0.001710 -0.002030 0.000200 0.001170 
+-0.004814 -0.004347 0.000798 -0.004309 -0.005159 0.001397 
+-0.001857 -0.000676 -0.000383 0.000906 -0.001416 -0.001127 
+0.000277 -0.000979 -0.002740 -0.003130 -0.000303 -0.002748 
+-0.006885 -0.001058 0.000414 -0.004044 -0.000394 0.002065 
+0.003645 -0.000583 -0.000562 0.002517 -0.002687 0.001280 
+-0.000444 -0.000593 -0.002420 -0.002776 0.002142 -0.002630 
+-0.003306 0.003106 -0.004053 -0.001750 0.002434 -0.005150 
+-0.000428 0.003370 -0.006058 0.006067 0.003326 -0.006132 
+0.009245 0.006820 -0.003769 0.009244 0.006905 -0.000951 
+0.004451 0.001470 0.001717 -0.003690 -0.005006 0.006269 
+-0.005500 -0.000124 0.005640 0.002075 -0.000135 0.001284 
+0.002172 0.000037 -0.001972 -0.015854 -0.006929 -0.000609 
+0.001884 -0.000324 0.000360 0.003736 -0.000845 0.002281 
+0.003138 -0.000703 0.003639 0.000503 0.000302 0.000589 
+0.001269 0.001679 -0.003436 0.000422 -0.000427 -0.000638 
+0.004326 0.001555 0.000224 0.005898 0.004790 -0.002155 
+0.002349 -0.000792 -0.002991 0.002157 0.005428 0.005080 
+0.004638 0.006617 0.001596 0.000698 -0.001142 0.002132 
+-0.002266 -0.010374 0.005189 0.000779 -0.013542 -0.004585 
+0.002142 -0.006347 -0.004540 -0.000999 -0.002725 -0.001273 
+-0.001987 0.005458 0.001387 -0.003173 0.006231 -0.003682 
+0.005159 0.007121 0.012241 0.011261 -0.007511 0.009290 
+0.014671 -0.005115 0.019393 0.018559 -0.000129 0.014051 
+0.009317 0.002999 0.000684 0.004447 0.001855 -0.000372 
+0.006784 0.004929 0.001643 -0.001073 0.007204 -0.006398 
+-0.009376 0.010933 -0.008666 -0.006706 0.007298 -0.008456 
+-0.005752 0.005607 -0.002936 -0.000237 0.004904 0.002060 
+0.001471 0.003126 -0.001334 -0.000110 -0.001736 0.002304 
+-0.000374 0.000272 -0.001719 -0.007664 -0.001298 -0.011541 
+0.002667 -0.009662 -0.014864 0.014172 -0.006311 -0.015729 
+0.001543 -0.001104 -0.002964 -0.002668 -0.002357 0.008759 
+-0.014126 0.004255 0.002604 -0.010411 -0.000417 0.006565 
+0.002826 -0.002683 -0.003030 -0.006279 -0.012656 -0.002930 
+-0.026611 -0.022111 0.012215 -3.860000 -2.160000 1.435000 
+-4.038610 -1.984556 1.679537 -3.929630 -1.648148 1.685185 
+-3.525862 -1.163793 1.456897 -0.015164 -0.014008 0.009931 
+-0.001094 -0.001916 -0.000809 -0.004026 0.004258 -0.003118 
+-0.004575 0.003289 -0.003437 -0.005210 0.006427 -0.001021 
+-0.000131 -0.000680 0.000525 0.000422 -0.008503 0.001749 
+0.000938 -0.011599 0.002962 -0.007474 -0.004411 0.002697 
+-0.001809 -0.002400 -0.001966 0.002232 0.002090 -0.000141 
+-0.000942 0.006811 -0.003292 0.001348 -0.001813 0.000626 
+0.002063 -0.007028 -0.000056 0.000072 -0.004565 -0.001304 
+-0.000107 -0.000220 -0.000081 -0.000629 0.001729 0.000226 
+-0.002761 0.001641 -0.004787 -0.002579 -0.002395 -0.006918 
+0.004981 0.006095 -0.006746 -0.002581 0.005359 -0.001648 
+-0.005751 0.003479 0.000326 -0.005552 -0.000846 -0.001150 
+-0.000897 -0.002459 -0.001618 0.000532 -0.000970 -0.002786 
+0.002997 -0.001107 0.001724 0.003194 -0.002310 0.002207 
+0.004881 0.000858 0.001533 0.002942 0.002834 0.000697 
+0.000971 0.003453 -0.000971 0.002044 0.001937 -0.002410 
+0.005164 0.000902 0.001940 0.002222 0.001115 0.003857 
+0.000874 0.001401 0.002229 0.004043 0.003280 -0.000694 
+0.001721 0.007105 -0.004622 -0.001127 0.006757 -0.001355 
+-0.002470 0.005115 -0.001414 -0.000617 0.003827 -0.004999 
+0.000097 0.001749 -0.004858 0.001728 0.000906 -0.001092 
+0.002917 0.000051 0.002677 0.001591 -0.002183 0.003418 
+-0.007422 -0.002479 -0.002529 -0.005152 -0.006363 0.000107 
+0.001855 0.007163 -0.002026 -0.002394 0.010008 -0.003373 
+0.003650 0.007566 -0.003723 0.005555 0.009839 0.002118 
+0.000896 0.005166 0.001748 -0.003547 0.002235 -0.000456 
+-0.004087 0.007377 -0.000763 -0.005997 0.011045 -0.001572 
+-0.008150 0.006322 -0.005214 -0.012420 0.001133 0.002178 
+-0.009184 0.004212 -0.000107 -0.004224 0.003013 -0.000132 
+-0.001975 0.004423 0.002200 -0.002663 0.002596 0.001172 
+-0.005437 -0.004354 0.006087 -0.003386 -0.005528 0.004107 
+-0.000287 -0.001753 -0.002159 0.005400 0.001754 -0.008794 
+0.003928 -0.011664 -0.006006 0.000255 -0.022832 -0.005421 
+-0.002497 -0.012273 0.005836 0.000264 0.000279 0.005581 
+-0.003869 0.006790 -0.002760 -0.003632 0.001716 0.001182 
+-0.001003 -0.008166 -0.002943 -0.007392 -0.016619 0.000002 
+-0.024661 -0.030468 0.015445 -4.320261 -2.601307 2.431373 
+-4.781116 -2.330472 2.626609 -5.155235 -2.050541 2.693141 
+-5.349624 -1.736842 2.744361 -4.781395 -1.190698 2.423256 
+-0.019086 0.005385 0.011121 0.010412 0.021171 -0.011726 
+0.004576 0.006698 -0.016845 -0.001519 -0.004708 0.002219 
+-0.006721 -0.010724 0.012514 -0.003233 -0.010481 0.008484 
+0.000482 -0.008496 0.000470 0.003309 -0.005784 0.000552 
+-0.001383 -0.006886 0.001000 -0.003989 -0.002339 0.001784 
+0.001793 0.001727 -0.002236 0.003352 -0.001397 0.000791 
+0.004229 -0.005021 -0.001823 -0.000931 -0.001851 -0.001296 
+-0.004063 0.000476 0.000638 -0.002962 0.001112 -0.000394 
+-0.003368 0.002187 -0.002649 0.003626 0.005956 -0.004907 
+-0.004038 0.003237 0.002644 -0.005396 0.003572 0.006808 
+-0.008395 0.003277 -0.002045 0.000282 -0.005289 -0.002767 
+0.005234 0.002565 -0.009340 0.007535 0.007249 -0.004395 
+0.002520 -0.000566 -0.000556 -0.002100 -0.004665 0.000370 
+0.000190 -0.000739 -0.000969 0.000322 0.003227 0.000385 
+0.000000 0.003116 0.000000 0.003048 0.003310 -0.000524 
+0.000274 0.001981 0.002864 -0.004498 -0.003514 0.001523 
+-0.002871 -0.004333 0.002932 0.000367 0.000249 0.002993 
+0.000039 0.001717 0.003086 0.003217 0.003430 0.003914 
+-0.001020 -0.001643 0.004282 -0.003179 0.001275 0.001067 
+-0.000350 -0.003616 -0.000733 0.000871 -0.002593 0.001402 
+-0.002374 -0.005004 0.005522 -0.006438 -0.012238 0.008064 
+-0.019269 -0.021814 0.007524 0.000970 -0.009164 0.012082 
+-0.001381 -0.008340 0.001152 -0.001499 0.005705 0.003552 
+-0.000289 0.012110 0.003575 0.000341 0.012576 0.002358 
+-0.000579 0.007487 0.000471 -0.000388 0.002454 0.000183 
+-0.003333 0.002159 -0.000247 -0.010055 -0.002590 0.007223 
+-0.009613 0.003623 0.003402 -0.002293 -0.000014 -0.005536 
+0.002429 -0.002072 -0.003857 0.003147 -0.001044 0.001467 
+0.000373 0.000372 0.001808 -0.003067 -0.000493 -0.002828 
+-0.001429 -0.001896 -0.005825 0.005249 0.004484 -0.007061 
+0.007595 0.007429 -0.002761 0.001274 0.001919 0.001408 
+-0.006232 -0.003172 -0.001780 -0.003059 -0.002756 -0.003307 
+0.001060 0.002635 0.005088 -0.001259 0.005298 0.005903 
+-0.000791 0.003754 0.001657 0.006338 0.001780 -0.000747 
+0.010523 0.002324 -0.006753 0.013067 0.001730 -0.006303 
+0.001569 -0.002642 -0.000938 -0.018827 -0.023550 0.019549 
+-4.739726 -1.321918 2.609589 -6.206522 -1.255435 3.076087 
+-7.126316 -1.463158 3.657895 -6.619632 -1.515337 3.650307 
+-0.022306 0.008838 0.003518 0.030681 0.032708 -0.012956 
+0.015158 -0.007147 0.002165 0.008820 0.004698 -0.007596 
+-0.001755 0.001001 0.000208 -0.002041 0.000523 0.000046 
+-0.001934 -0.000660 -0.000616 -0.009667 -0.007196 -0.000539 
+-0.010353 -0.008360 0.005040 -0.000236 -0.000488 0.000126 
+0.006168 0.000907 0.001347 0.004989 -0.000560 0.001742 
+0.001640 0.001072 0.001505 -0.006449 -0.000714 -0.001173 
+-0.006053 -0.002088 -0.001421 0.001313 0.003456 0.001741 
+0.003420 0.013669 -0.002025 -0.009757 0.007089 0.007259 
+-0.001151 0.000006 0.010346 -0.003414 -0.011740 0.000539 
+0.000413 -0.001087 -0.006575 0.001937 -0.004212 -0.002275 
+0.006170 0.007219 0.006540 0.007072 0.013521 0.002079 
+0.003694 0.005803 0.003158 0.000692 -0.000985 0.001969 
+0.000629 -0.000753 0.002082 -0.004971 0.005669 0.003628 
+0.001945 0.003619 -0.003214 0.001817 0.001870 -0.001975 
+-0.001005 -0.000980 -0.000276 -0.003296 -0.001318 -0.000136 
+-0.000234 0.000259 -0.001221 -0.000174 0.001221 -0.001263 
+-0.000351 0.000930 -0.000819 -0.000646 -0.001297 0.000162 
+0.002054 -0.001354 0.001014 0.004935 0.000887 0.001670 
+0.005709 -0.000172 0.002071 -0.001266 -0.001347 0.001640 
+-0.005962 -0.001957 0.002612 -0.003912 -0.010073 0.005842 
+-0.010420 -0.005986 0.005955 -0.007340 -0.002704 0.008750 
+-0.003436 -0.003031 0.004998 -0.001345 -0.006447 -0.000836 
+-0.001523 -0.002512 -0.000896 -0.003098 0.002340 -0.000900 
+-0.002770 -0.000904 -0.000141 -0.004487 -0.003698 0.004607 
+-0.002837 -0.001872 0.007716 0.000961 -0.000536 0.002146 
+0.001873 -0.001294 -0.002501 0.005560 -0.001255 -0.006061 
+0.005969 0.000539 -0.005410 0.000491 -0.000330 -0.000563 
+0.000695 -0.002217 0.000495 0.000141 -0.000906 -0.000078 
+0.001390 0.003827 -0.000559 0.002435 0.004380 -0.000464 
+0.000342 0.000278 -0.000334 -0.002612 -0.004034 -0.001535 
+-0.000833 -0.004628 -0.002638 0.004675 -0.001948 -0.000241 
+0.004565 -0.000828 0.002335 0.001052 -0.001021 -0.000191 
+0.000955 -0.002013 -0.003186 0.008432 0.000015 -0.001566 
+0.009537 -0.000001 -0.002024 0.008823 -0.000908 -0.004957 
+0.007787 -0.000372 -0.008610 -0.002479 -0.001623 0.001762 
+-0.038997 -0.013332 0.010461 -6.009804 -1.098039 2.784314 
+-6.055555 -1.305556 3.185185 -0.040187 -0.001909 0.027500 
+-0.002372 0.003027 -0.003861 0.006022 0.006944 -0.014726 
+0.010944 0.002771 -0.008356 0.005341 0.007088 -0.000792 
+0.001824 0.005409 0.001315 -0.003215 0.000332 -0.000640 
+-0.015056 -0.008273 0.004921 -0.008412 -0.005862 0.008148 
+-0.005239 0.001946 0.000449 -0.002408 0.004465 0.000384 
+0.000222 0.002473 0.002546 -0.000289 0.001574 0.001206 
+-0.007589 0.001277 -0.001255 -0.007724 -0.001106 0.001852 
+0.001921 0.003517 0.000877 0.000993 0.010571 0.000448 
+-0.008879 0.006463 0.002669 -0.009505 0.005769 0.007813 
+-0.003396 -0.007934 0.000027 -0.001571 -0.000465 -0.004079 
+0.006224 -0.000624 -0.003434 0.002623 0.001126 0.003703 
+-0.000610 0.004441 0.001654 -0.001483 0.002620 0.002999 
+0.004465 0.004443 -0.000416 0.002963 0.003031 -0.002641 
+-0.001871 -0.000864 0.001979 -0.001739 -0.001574 0.006265 
+0.000000 0.004406 -0.004685 0.000893 0.002201 -0.004531 
+0.000489 0.001541 -0.004586 0.001067 0.000440 -0.005096 
+0.001493 -0.000221 -0.004149 -0.000250 0.002171 -0.001879 
+0.003170 0.003517 -0.002041 0.005781 0.002191 -0.004755 
+0.004845 -0.000702 -0.005951 0.003097 0.000185 -0.002799 
+0.002581 0.001392 0.000547 0.000343 0.001567 0.002166 
+-0.000894 -0.003008 0.003692 -0.007292 -0.006385 0.004625 
+-0.005629 -0.005580 -0.001700 -0.006722 0.003066 0.001102 
+-0.004954 -0.000188 -0.000174 -0.005883 -0.001199 -0.005243 
+-0.004567 0.006861 -0.008028 -0.006571 0.009795 -0.003390 
+-0.008907 0.005516 -0.005784 -0.005904 -0.000281 -0.003854 
+-0.004535 -0.001643 -0.001501 -0.002559 -0.002384 -0.002079 
+-0.000828 0.002274 0.000054 0.000845 0.009095 -0.002671 
+0.002777 0.005842 0.000498 0.002063 0.000913 -0.000317 
+-0.001880 -0.000956 0.001636 -0.002566 -0.000290 0.001903 
+-0.001471 0.001574 0.002067 -0.000088 0.002444 0.001408 
+0.001159 0.002742 -0.001109 0.004551 0.002776 -0.002203 
+0.004181 0.002795 0.000416 0.001166 0.001754 0.000974 
+0.000720 0.000160 0.000514 0.000881 -0.000220 0.000535 
+0.001700 -0.001133 -0.001700 0.004097 0.004348 -0.005599 
+0.008385 0.001473 -0.002111 0.009803 0.002431 -0.001734 
+0.005449 0.002831 -0.001726 -0.004920 -0.000807 0.005950 
+-0.013486 -0.010024 0.012572 -0.021751 -0.000208 0.003348 
+-0.011910 -0.000999 0.002722 -0.001848 0.004868 0.002202 
+-0.002247 0.001629 0.000006 -0.005813 -0.004897 0.000672 
+-0.002403 -0.003347 -0.000090 0.003483 0.000521 -0.000662 
+0.005605 0.002088 0.001707 0.003725 0.000917 0.002213 
+-0.003995 0.000067 0.002559 -0.006852 -0.001506 0.000804 
+-0.007097 0.000511 -0.000521 -0.005258 0.004004 0.000026 
+-0.000264 0.006809 0.001487 0.004638 0.002633 0.000605 
+-0.001623 -0.000350 0.001113 -0.007105 0.000188 -0.000425 
+-0.007062 0.005132 -0.003024 -0.003638 0.007416 -0.002878 
+-0.002692 0.004401 0.000207 -0.005284 0.001586 0.003522 
+-0.008923 -0.000633 0.002534 -0.003975 -0.005826 -0.000226 
+-0.001840 -0.003371 -0.001461 -0.004225 -0.002725 -0.000309 
+-0.004525 -0.000179 0.001179 0.000983 0.000172 0.003810 
+0.004240 0.007480 -0.002585 0.005044 0.005133 -0.001447 
+-0.001840 -0.000108 -0.000030 -0.000714 0.002159 0.002176 
+-0.004183 -0.000477 0.000748 -0.001153 -0.000381 0.000026 
+0.000786 0.001535 -0.001851 0.002039 0.002720 -0.001588 
+0.001566 0.004050 0.001656 0.000443 0.003893 0.000166 
+0.001016 -0.000406 -0.000456 0.001957 0.000884 -0.001578 
+0.002538 0.001334 -0.001525 0.002538 0.003561 -0.002538 
+0.004536 0.004397 -0.003947 0.005491 0.003231 -0.004199 
+0.002040 0.000956 -0.001229 -0.006576 -0.000278 0.001591 
+-0.002918 0.001509 -0.002304 -0.000433 0.002180 0.000453 
+-0.004338 0.006167 0.001360 -0.006019 -0.001701 -0.001829 
+-0.007812 -0.000608 0.002273 -0.001887 -0.002563 -0.001971 
+0.000302 -0.002066 -0.004473 -0.001140 -0.002060 -0.004279 
+-0.000036 0.004294 -0.003933 0.000675 0.004465 -0.004315 
+-0.002361 0.004214 -0.005230 0.003411 0.003411 -0.005581 
+0.004761 0.001328 -0.004532 0.003092 -0.002507 -0.004806 
+0.003914 -0.003630 -0.006364 0.005455 -0.001543 -0.007616 
+0.004033 -0.000827 -0.004835 -0.000168 0.001002 -0.002340 
+0.000188 0.002608 -0.002925 0.001389 0.004744 -0.003800 
+-0.001759 0.003806 -0.000368 -0.002560 -0.000220 -0.001868 
+-0.000085 0.000539 -0.000033 -0.000094 0.003440 0.000848 
+0.000405 0.001952 -0.002762 0.002801 0.001406 -0.002977 
+0.002652 -0.000355 -0.000083 -0.000312 0.001009 0.000301 
+0.000238 0.003029 0.001608 0.001926 0.004168 0.002491 
+0.004512 0.005505 0.000960 0.004994 0.011516 -0.005113 
+0.003457 0.014822 -0.000361 -0.000438 0.012549 -0.001181 
+-0.006340 0.004235 -0.000255 -0.005312 0.002008 0.000746 
+-0.002402 0.000078 0.000598 -0.002430 -0.005942 -0.002399 
+0.000268 -0.006008 -0.005067 0.002110 -0.008090 0.002326 
+-0.001609 -0.005596 0.007013 -0.006297 -0.007037 0.003334 
+-0.003892 -0.005381 0.002001 -0.000212 -0.003370 0.001663 
+0.002497 -0.000942 0.001250 0.001021 0.001280 0.001277 
+-0.000403 0.001279 -0.002268 0.000231 0.001080 -0.003911 
+0.000185 -0.000207 -0.003284 -0.001152 0.000725 -0.002548 
+-0.000781 0.002112 -0.000374 -0.000772 0.001672 -0.000327 
+0.001114 0.000605 0.002069 0.001600 0.002049 0.000369 
+0.000927 -0.000025 0.001830 -0.003472 0.000341 -0.001161 
+-0.007572 0.000307 0.002092 -0.001915 0.000849 0.002911 
+0.000977 0.001778 0.000417 -0.000223 -0.000159 0.000254 
+-0.000956 -0.000774 0.001094 -0.001341 0.004662 0.000383 
+0.001112 0.002341 0.000537 0.001283 0.003520 0.000799 
+-0.000409 0.003114 0.002032 0.000321 0.000428 0.002958 
+0.000798 0.001909 0.002738 -0.001252 0.003905 0.002354 
+-0.002506 0.001803 0.001497 -0.001825 0.002791 0.001117 
+-0.001667 0.001782 0.000105 -0.001050 0.000189 0.000101 
+-0.001322 -0.000697 0.000842 -0.002443 0.000137 0.001025 
+-0.002708 -0.000158 0.000705 0.000078 -0.000213 -0.000204 
+0.004041 -0.000132 -0.000174 0.004777 0.000799 0.001070 
+0.004100 0.002598 0.000759 0.002779 0.004147 -0.000017 
+0.003252 0.004559 0.001315 0.001490 -0.001971 0.000915 
+0.002445 0.006134 0.001501 0.003345 0.003861 -0.002299 
+0.000982 0.002895 -0.002683 0.000913 0.002488 -0.001666 
+0.000000 0.002258 -0.002661 -0.000458 0.002723 0.000958 
+-0.002566 0.002149 0.000577 -0.002528 0.000599 -0.000410 
+0.001680 -0.000205 -0.001709 0.000310 -0.001115 -0.003488 
+-0.000094 -0.000473 -0.001666 -0.000078 -0.000014 0.000470 
+-0.000255 0.002197 0.000693 -0.000481 0.001999 0.000271 
+-0.001705 -0.001038 0.000249 -0.001576 -0.002596 -0.001305 
+-0.000576 0.000626 -0.001215 0.000704 0.003582 -0.002533 
+0.001410 -0.000015 -0.000757 -0.002074 -0.000922 0.001660 
+-0.003706 -0.005491 0.003569 -0.004169 -0.003513 0.005155 
+-0.002003 0.000759 0.001299 0.003911 0.004068 -0.002865 
+0.007928 0.006892 -0.005888 0.008141 0.007382 -0.007101 
+0.003316 0.005879 -0.005778 -0.000024 0.002383 -0.001432 
+-0.000885 0.000864 -0.000088 -0.002139 0.000819 -0.000404 
+-0.003755 -0.000477 -0.001876 -0.004505 -0.002116 -0.003481 
+-0.001311 -0.004441 -0.004421 0.001815 -0.003988 -0.005023 
+0.001422 -0.002998 -0.004780 -0.001090 -0.003456 -0.003632 
+-0.001998 -0.003227 -0.001836 -0.001290 -0.000326 0.000216 
+-0.001946 0.002290 0.001771 -0.003940 0.005968 -0.001772 
+-0.001707 0.005457 -0.000564 -0.000487 0.002823 0.002067 
+0.002544 -0.000619 -0.000455 0.001347 0.005385 -0.001224 
+0.000851 0.000676 0.000263 0.001327 0.000483 -0.000240 
+0.001468 0.003792 0.000232 0.003297 0.003107 -0.000676 
+-0.002272 0.004264 -0.003157 -0.004661 0.000321 -0.000974 
+-0.006772 -0.002544 0.001696 -0.000807 -0.004840 0.002578 
+-0.003888 -0.003588 0.001793 -0.002098 0.000108 0.001559 
+-0.000898 0.000337 0.001454 -0.001158 0.000758 0.002952 
+0.000897 0.001766 -0.000883 0.000342 0.001935 -0.001404 
+-0.001478 0.001001 0.000127 -0.000874 0.000446 0.001490 
+0.000813 -0.002007 0.001982 0.001979 -0.003926 0.000958 
+0.003253 -0.000866 0.000653 -0.002706 -0.001649 -0.000374 
+-0.004345 -0.000216 0.002366 -0.003416 0.002116 0.002566 
+-0.001640 0.000398 0.002906 0.000493 0.000469 0.000164 
+0.001919 -0.001716 -0.001227 0.004364 -0.000304 -0.001125 
+0.003993 0.002629 0.000512 0.000468 0.003140 0.000477 
+-0.001624 0.000757 0.000085 -0.002713 -0.000108 0.000630 
+-0.001483 0.000241 0.001253 0.000325 0.000062 0.000877 
+0.001820 0.001240 0.001168 0.001519 0.002444 -0.000127 
+0.001426 0.000127 -0.000160 -0.000458 -0.002578 0.000540 
+-0.002031 -0.002119 -0.001907 -0.001787 0.000187 -0.000263 
+0.000357 0.003685 0.001554 0.002363 0.004276 0.000191 
+0.001763 0.001641 -0.003230 -0.000392 0.000040 -0.005367 
+-0.002299 0.000243 -0.004074 -0.001338 0.002322 0.000288 
+-0.000967 0.000771 0.002322 0.001079 0.000182 -0.001190 
+0.004161 0.001804 0.000689 -0.001723 0.003580 -0.001856 
+-0.000401 0.002601 -0.000838 0.000095 -0.000528 0.000859 
+-0.000316 -0.000271 0.000706 -0.000511 0.001013 -0.001918 
+0.001354 0.000649 0.000324 0.000794 0.002201 0.001709 
+0.000313 0.001191 0.001931 -0.000840 0.001135 -0.001075 
+0.000301 0.001353 0.000526 0.002231 0.000050 -0.003380 
+0.004556 0.002678 -0.006114 0.005787 0.006512 -0.005104 
+0.004078 0.002684 0.000925 0.000803 -0.000448 -0.000310 
+0.001346 -0.003289 -0.001680 0.003780 -0.002267 -0.001134 
+-0.000558 0.001266 0.000493 0.000297 0.005245 0.001992 
+-0.002315 0.001519 0.000517 -0.005733 -0.002627 -0.000307 
+-0.004447 -0.000496 -0.000971 -0.002782 0.002454 0.001563 
+0.000866 0.002022 0.002415 0.003102 -0.000587 -0.000272 
+0.002558 -0.002429 -0.002235 0.001438 -0.002307 -0.001771 
+0.000945 -0.000987 -0.000861 0.000389 -0.000256 -0.000756 
+0.001394 0.000031 -0.000767 -0.000188 -0.001128 -0.000942 
+0.000533 -0.001144 -0.001053 0.002503 0.001371 -0.001337 
+0.000467 0.004497 -0.003526 -0.000676 0.005172 -0.004948 
+-0.002008 0.002616 -0.002156 -0.002197 -0.001411 0.000564 
+0.001094 0.000522 0.001069 0.001930 0.000204 0.002468 
+0.000714 0.000434 0.001485 -0.003991 -0.000197 0.002119 
+-0.000674 -0.000284 -0.001809 -0.000524 -0.000095 -0.000762 
+0.000131 0.000061 0.001587 -0.000257 0.000131 0.001266 
+-0.000166 0.001210 0.000116 -0.000678 -0.001129 0.000800 
+-0.001138 -0.001992 0.004268 -0.005902 -0.003709 0.001787 
+-0.001182 0.000263 -0.002146 -0.000365 0.003651 -0.003125 
+0.000597 0.002239 0.001194 0.002052 -0.002022 0.000676 
+-0.002504 -0.003673 0.001582 -0.003955 -0.001907 0.001476 
+-0.003420 -0.000417 0.000365 -0.002252 -0.000903 -0.002602 
+-0.000067 -0.002652 0.000433 -0.002638 -0.004013 0.003059 
+-0.002140 0.000634 -0.002008 -0.002205 0.000188 -0.003302 
+-0.002829 0.000209 -0.003380 0.000602 0.001805 -0.004141 
+0.000285 -0.000705 -0.000059 0.001142 0.000127 0.001338 
+0.000206 0.000495 0.000646 0.000744 0.000626 0.000445 
+0.002267 0.002028 -0.000259 0.001849 0.001038 -0.001272 
+-0.001203 -0.002214 -0.000328 -0.005401 -0.004599 0.001335 
+-0.008971 0.000118 0.000235 0.000058 -0.001097 0.001439 
+-0.000195 -0.000206 0.000601 0.003038 0.001488 -0.002846 
+0.004808 0.002022 0.001317 -0.001718 0.003669 -0.001528 
+-0.001117 0.003282 -0.004205 -0.000090 0.002086 -0.004487 
+-0.001473 0.003597 -0.003938 -0.002077 0.004639 -0.001177 
+0.001083 0.004751 0.000659 0.001254 0.003604 0.000836 
+0.002396 0.002830 0.000979 0.005196 0.002138 -0.001252 
+0.002718 0.003261 -0.003684 0.001723 -0.001514 0.000026 
+-0.001106 -0.001908 -0.000729 -0.000225 -0.000402 0.001265 
+0.001416 0.001906 0.002489 0.005060 0.000495 0.001617 
+-0.001172 -0.002517 0.001960 0.001256 -0.002498 0.000890 
+-0.000703 -0.000447 -0.000876 -0.000692 0.002514 -0.000333 
+-0.000019 0.001574 0.000769 -0.002850 0.002621 0.001525 
+-0.004855 0.002285 0.001022 -0.000984 0.000790 0.000469 
+0.002534 -0.001042 0.000035 -0.000211 -0.001980 -0.002556 
+0.001231 -0.000784 -0.000149 -0.002097 0.000591 0.003507 
+-0.002278 -0.000067 0.005414 -0.002589 0.000436 0.002756 
+-0.001753 0.000709 -0.000260 -0.000180 0.001960 -0.002311 
+0.002391 0.001993 -0.001506 0.002093 0.000195 -0.000131 
+-0.001455 0.000563 -0.003238 -0.000263 0.001565 -0.003006 
+-0.001591 0.001136 -0.002045 -0.001487 0.001410 -0.001205 
+-0.000350 0.000476 0.000077 -0.000200 -0.000848 0.002696 
+-0.000828 -0.002204 0.004129 0.000787 -0.001873 0.001286 
+-0.002900 -0.001865 0.003289 -0.002432 0.000082 0.002737 
+-0.002340 0.000435 0.002206 -0.000305 0.001603 0.003817 
+-0.002080 0.000025 0.001028 0.000955 0.000152 0.001909 
+0.000128 -0.000204 0.000614 0.003387 -0.000145 -0.000435 
+0.000184 0.000546 -0.001192 0.000672 -0.001866 0.000746 
+-0.000591 -0.003836 0.000627 -0.001285 -0.004536 0.002389 
+-0.001053 -0.002874 0.000871 -0.000244 0.000457 0.000063 
+-0.001142 0.000510 -0.000097 -0.000450 0.000262 -0.001385 
+-0.000032 -0.001524 0.001151 0.000583 -0.002444 -0.000813 
+-0.001038 -0.000653 -0.001356 -0.001588 0.000043 0.000245 
+-0.000653 -0.000439 -0.000111 -0.001102 -0.001832 -0.002199 
+-0.000471 -0.002474 -0.002193 0.000577 -0.002141 -0.000568 
+-0.000266 0.000174 0.000005 -0.001031 0.003350 -0.000467 
+0.000719 0.005712 -0.002228 0.002353 0.005982 -0.001309 
+0.001637 0.001159 -0.000153 -0.000653 -0.002854 0.001880 
+0.000181 -0.002754 0.002011 -0.000981 0.001308 0.000654 
+-0.000872 0.003946 -0.001080 0.000731 0.004055 -0.001247 
+0.003164 0.002104 0.000731 0.000911 0.000299 0.000680 
+-0.001339 0.000333 -0.001637 0.000399 0.002305 -0.004654 
+-0.001565 0.003778 -0.002118 -0.000274 0.003668 -0.001408 
+0.001220 0.002145 -0.000653 0.000787 0.000612 -0.000171 
+0.001105 -0.000787 0.000293 0.002177 -0.001148 0.000242 
+0.001183 0.000527 0.001068 -0.000742 -0.000074 -0.000819 
+-0.002183 0.001086 -0.002235 -0.000861 0.000430 -0.002689 
+0.002249 0.002172 -0.000970 0.004227 0.000905 0.000722 
+-0.000915 0.001675 0.002786 -0.002669 0.002745 -0.000861 
+-0.002697 0.001707 -0.001631 -0.001330 0.001995 -0.001271 
+-0.001227 0.002803 -0.001785 -0.002794 0.002113 -0.002231 
+-0.001854 0.000312 -0.000338 0.002058 0.001758 -0.001079 
+-0.001017 0.001461 -0.002794 0.000428 0.000288 -0.000020 
+0.000217 -0.000326 0.001329 -0.001034 -0.001959 0.000534 
+-0.004131 -0.001667 0.000798 -0.004619 -0.001847 0.000219 
+-0.002564 -0.000741 -0.000426 0.000139 -0.000386 0.000276 
+0.001602 -0.002977 -0.002159 0.000122 -0.000766 -0.004959 
+-0.000643 0.002164 -0.004035 0.000139 0.000703 -0.002949 
+-0.000779 0.000391 -0.001166 -0.001022 0.001268 -0.001481 
+-0.000618 0.002237 -0.001825 0.000795 0.001918 -0.001210 
+0.001339 0.000472 0.000000 -0.000097 -0.001246 0.000927 
+0.000761 -0.000080 -0.000370 0.002149 0.002889 -0.000247 
+0.000840 -0.000840 -0.001145 0.003528 -0.001493 0.000271 
+0.002939 -0.001898 -0.000225 0.000921 -0.001479 -0.001486 
+-0.000296 -0.000741 -0.003140 -0.000891 0.000635 -0.001514 
+-0.000619 -0.000669 0.002860 -0.001842 -0.002905 0.003113 
+-0.004071 -0.000120 0.001366 -0.002920 -0.001023 0.001190 
+-0.001338 -0.002422 -0.000149 0.000810 0.001691 0.005644 
+-0.002867 -0.001621 0.003378 -0.001250 0.001500 -0.000750 
+-0.000362 0.001852 -0.000103 -0.000143 0.000107 -0.000373 
+-0.000285 0.000254 -0.000119 -0.001624 0.001452 0.000042 
+-0.002442 0.003067 0.001471 -0.001548 0.002736 0.001888 
+0.001320 0.000483 0.000438 0.003362 -0.002192 -0.000458 
+0.002264 -0.003222 0.000626 -0.000530 -0.002032 0.001093 
+-0.001161 0.001401 -0.000288 0.000757 0.005961 -0.001348 
+0.005157 0.007554 -0.008414 -0.000707 -0.000075 -0.002027 
+-0.000738 0.001354 0.002994 -0.000427 0.002137 0.002937 
+-0.000762 0.001431 0.001868 -0.002419 -0.001368 0.000578 
+0.000294 -0.002752 -0.000875 0.001244 -0.002486 -0.000102 
+0.000579 -0.001032 0.000011 -0.003120 0.000269 -0.000514 
+-0.001353 -0.000835 -0.002794 -0.004115 0.001589 -0.003646 
+-0.003520 -0.000287 0.000242 -0.002691 -0.003388 0.000521 
+-0.002859 -0.004871 -0.000700 -0.003014 -0.004695 -0.002374 
+-0.001895 -0.001157 -0.002035 -0.003104 -0.001120 0.008448 
+-0.001347 0.000653 0.001185 0.001891 0.002411 -0.003512 
+0.002843 0.003622 -0.002211 0.002352 0.001927 0.000899 
+0.000407 0.002021 0.001784 0.000465 0.000609 0.000290 
+0.000141 -0.001440 0.000277 -0.000933 -0.003128 0.001476 
+-0.001091 -0.002138 0.001457 -0.001503 -0.001002 0.001212 
+-0.002928 0.003448 -0.000229 -0.000605 0.002459 -0.000332 
+0.000241 0.002879 0.001721 0.000586 0.000295 0.001780 
+0.003744 0.002012 -0.003234 0.004173 0.001873 -0.005883 
+0.002033 0.001585 -0.006302 -0.002242 -0.000350 -0.006234 
+-0.001157 -0.002826 -0.006163 -0.000771 0.001070 -0.005995 
+-0.001661 0.003788 -0.001107 -0.001364 0.002348 -0.002348 
+-0.001432 -0.000477 0.000152 0.000781 -0.001075 0.000100 
+0.001699 -0.001081 -0.001328 0.000804 -0.000511 -0.002500 
+-0.000531 -0.000117 -0.001944 -0.001220 -0.000169 0.000948 
+0.000073 -0.000746 0.002019 -0.000823 -0.001210 -0.001645 
+-0.000618 0.005103 0.002592 0.000150 0.005789 0.000451 
+0.000479 -0.000406 0.000007 -0.000023 -0.000197 -0.000202 
+-0.000360 -0.000766 -0.000422 -0.000038 -0.000617 0.000674 
+0.000037 -0.000148 0.000591 0.000356 -0.000420 0.001114 
+0.000641 -0.000574 0.001405 -0.000083 -0.000663 0.001615 
+-0.000943 -0.000893 0.001130 -0.001714 0.000251 -0.000151 
+-0.000272 0.002211 -0.000057 0.000116 0.001394 0.002782 
+-0.001704 0.000707 0.002744 0.000474 0.002956 0.000292 
+0.002704 0.006752 -0.002708 -0.001722 0.005304 -0.004136 
+-0.000352 0.000398 0.000111 0.002263 -0.000374 0.003778 
+0.002882 0.000373 0.006863 0.002088 -0.001038 0.000647 
+0.001717 0.001499 -0.002173 0.002995 0.000636 -0.001988 
+0.002705 -0.001235 -0.000453 0.002600 -0.000143 -0.000354 
+0.002663 0.003345 -0.000158 0.002232 0.005496 0.001103 
+0.002917 0.006461 -0.001488 0.000975 0.004546 0.000159 
+-0.000761 0.002609 0.002210 0.000517 0.002584 0.002748 
+0.004947 0.005494 0.000600 0.007040 0.002217 0.001875 
+0.000342 0.001543 0.001703 -0.002099 0.001029 -0.000784 
+-0.000784 -0.001178 -0.000972 0.001651 -0.001230 -0.000202 
+0.000820 0.000462 0.000526 -0.002136 -0.001857 0.000391 
+-0.004069 -0.002994 -0.000540 -0.000911 -0.001793 -0.000649 
+0.001985 -0.000481 0.000446 0.000105 0.000183 0.000163 
+-0.003650 -0.001786 0.000751 -0.000545 -0.001999 -0.000608 
+0.003219 0.000698 -0.003675 0.000576 -0.000623 0.000033 
+-0.000704 0.001184 0.000311 -0.001579 0.001997 0.000705 
+0.000090 0.000620 -0.000266 0.001216 -0.000356 -0.000011 
+-0.000446 -0.000089 0.000089 -0.001925 0.002141 -0.000373 
+-0.002434 0.003994 -0.002917 -0.001702 0.002387 -0.001943 
+0.000279 -0.000754 0.000492 -0.000116 -0.003864 0.000680 
+-0.000752 -0.003496 0.001057 -0.000418 0.000292 -0.000674 
+0.003207 0.001271 -0.002290 0.000500 0.001503 0.000127 
+0.000085 -0.000249 0.002530 -0.001484 -0.001589 -0.000884 
+-0.002356 0.001171 -0.004331 -0.003885 -0.000228 -0.002531 
+0.000170 0.002462 0.000634 -0.001546 0.003968 -0.001817 
+-0.001786 -0.000409 -0.000854 -0.000125 -0.000396 -0.000683 
+0.000472 -0.000824 -0.000320 -0.001942 -0.000259 0.000311 
+-0.000315 0.000546 0.001186 -0.000388 0.000292 0.000491 
+0.001333 0.000866 0.000493 0.002210 -0.002745 -0.000656 
+-0.001916 -0.000089 -0.001768 -0.002461 0.001320 -0.001555 
+0.000447 -0.000583 -0.000274 0.005860 0.000780 -0.002151 
+-0.000852 0.000802 -0.000886 -0.000664 0.000089 -0.002968 
+0.001391 0.004373 -0.003925 0.002261 0.006983 -0.004007 
+0.004193 0.006399 0.000551 0.002746 0.003032 -0.000310 
+-0.000504 -0.002248 -0.000814 -0.000937 -0.004656 -0.002328 
+0.001409 -0.004094 -0.000895 0.002308 0.005231 -0.002154 
+0.003693 0.007920 -0.001964 0.000992 0.005380 -0.000754 
+0.000467 0.002825 -0.000182 -0.000024 0.002101 -0.002628 
+0.000179 0.000677 -0.000865 -0.001376 0.000243 0.001041 
+-0.003320 0.001071 -0.000998 -0.003476 0.004102 -0.003747 
+-0.001949 0.004851 -0.001532 -0.001190 0.002404 -0.000298 
+-0.001476 0.001612 -0.000028 -0.001355 0.004009 -0.001025 
+0.000006 0.007809 -0.002741 0.004775 0.010199 -0.004298 
+0.005447 -0.001001 -0.004332 0.002261 0.005028 0.003183 
+0.001265 0.002120 -0.000321 0.000487 0.001872 0.002359 
+0.000465 -0.000686 0.003429 0.000504 0.000137 0.001188 
+-0.002334 0.000531 -0.000203 -0.004566 0.002545 -0.000673 
+-0.003323 0.001553 -0.002050 -0.001283 -0.001470 -0.000916 
+-0.002213 -0.003361 0.001431 -0.002465 -0.003515 0.000291 
+-0.000943 -0.000326 -0.000464 0.001426 0.002258 0.001140 
+0.002473 0.000518 0.002250 0.005565 -0.004435 0.000442 
+0.000519 -0.003729 -0.003315 -0.003964 -0.001900 0.000918 
+-0.001318 0.000933 0.001393 0.001221 0.000179 0.000918 
+0.001253 -0.000869 0.000095 0.004611 0.002134 -0.005059 
+0.001417 -0.001218 -0.000049 0.002510 0.000600 0.004786 
+0.003136 0.001265 0.006200 0.000564 0.001684 0.003247 
+-0.002060 0.001389 -0.001349 -0.001168 -0.000743 -0.002971 
+-0.001419 -0.001817 -0.001968 -0.000681 0.000827 -0.000981 
+0.003431 0.004984 -0.005179 0.002966 0.004701 -0.007701 
+0.002584 0.001481 -0.004824 -0.001710 0.002354 0.002185 
+0.001434 0.006959 -0.000726 0.001664 0.000956 -0.003586 
+-0.000372 -0.000620 -0.001807 0.000850 -0.001526 -0.001317 
+0.001250 0.000091 -0.004941 -0.001781 0.000224 -0.006622 
+0.001788 0.000190 -0.006773 -0.000777 0.002739 -0.004022 
+0.001201 0.003156 0.000640 -0.000078 -0.000663 0.000453 
+-0.000108 -0.000881 0.002615 -0.001040 -0.002457 0.000504 
+-0.000619 0.000209 0.001233 0.000035 -0.000467 -0.000326 
+-0.001458 -0.001074 0.000556 -0.001364 -0.003269 0.005986 
+-0.000655 -0.004146 0.002491 -0.000909 0.000088 0.000034 
+0.001077 0.001717 -0.001996 0.000366 0.001130 -0.002239 
+-0.000828 0.001603 0.001381 0.000245 0.000876 0.006272 
+0.000725 -0.001454 0.006907 0.000652 -0.003079 0.000405 
+0.001166 0.000103 -0.000657 0.002551 0.000313 -0.001644 
+0.001172 0.002545 -0.000254 -0.001742 0.002001 -0.000208 
+-0.002774 0.001041 -0.000242 -0.003523 0.000721 0.001170 
+-0.002295 -0.001423 0.001836 -0.000906 -0.000849 0.000709 
+-0.002193 -0.000997 -0.002016 -0.005285 0.003584 -0.004032 
+-0.006452 0.004981 -0.001132 -0.006562 0.002756 -0.001193 
+-0.004319 -0.000933 0.000770 -0.000399 -0.002208 0.001725 
+-0.000324 -0.000229 0.000483 -0.002005 0.003745 0.000524 
+-0.002569 0.002333 -0.001750 -0.002743 -0.000400 -0.000124 
+-0.003075 -0.000484 -0.000853 -0.001406 -0.001252 -0.000065 
+-0.000111 0.002963 0.000556 0.000813 0.003323 0.001185 
+-0.001406 -0.000587 0.000734 -0.001563 -0.001640 0.002403 
+-0.005496 -0.002231 -0.003905 -0.004938 -0.001104 -0.003505 
+-0.001476 -0.001163 -0.002656 0.000332 -0.000423 -0.001981 
+-0.000897 -0.001704 -0.001143 -0.001969 -0.002168 -0.001313 
+-0.001394 -0.000456 -0.001180 -0.000044 0.003077 -0.002128 
+0.001664 0.004641 -0.002693 0.001995 0.003256 -0.002109 
+0.001193 0.000684 0.000007 0.001919 -0.000858 -0.000451 
+0.003137 0.001464 0.001036 0.003213 0.002808 0.000680 
+0.001101 0.001468 -0.002412 -0.001368 -0.000258 -0.003459 
+-0.003123 -0.000350 -0.002653 -0.004173 0.000000 0.000000 
+-0.004043 0.001900 0.001248 -0.005084 0.004940 -0.001079 
+-0.000752 0.003208 -0.004411 -0.000079 0.001484 0.001252 
+-0.002005 0.000927 0.001078 -0.001906 0.000701 -0.000393 
+-0.002519 -0.000443 0.000354 -0.000788 0.001716 -0.000143 
+0.003973 0.008018 -0.003512 0.009218 0.000780 -0.004541 
+0.001818 0.003977 -0.006402 0.000641 0.000357 0.003402 
+-0.003042 0.002729 0.005235 -0.010097 -0.005994 0.008529 
+0.001333 -0.003643 0.000394 -0.001363 -0.000122 -0.002822 
+0.002167 0.001798 0.001226 0.001264 0.005962 -0.000227 
+0.006815 0.007781 -0.003300 0.005127 0.001303 -0.003531 
+-0.002428 0.001025 0.001158 -0.003517 -0.002651 0.000892 
+-0.001156 -0.000638 0.002491 0.003670 0.000852 -0.002491 
+-0.003482 -0.001819 0.001801 -0.000496 -0.002674 0.001804 
+-0.000541 -0.001523 0.003306 -0.000111 -0.000012 -0.000155 
+0.000560 0.000216 -0.003753 0.003835 0.002481 -0.004962 
+0.001605 0.003796 -0.004251 0.002391 0.000899 -0.001313 
+0.003100 -0.001836 0.002606 0.001137 -0.000372 0.002454 
+0.005956 -0.002847 -0.002135 0.000397 0.002112 -0.005267 
+-0.001702 -0.002102 -0.002273 -0.004192 0.000373 -0.003638 
+-0.003045 0.000822 -0.002465 -0.000594 -0.000399 -0.000686 
+0.000638 0.003719 -0.003646 -0.001785 0.003553 -0.003095 
+-0.003396 0.003799 -0.003914 -0.003315 0.005158 -0.003829 
+-0.000547 0.005334 -0.003640 -0.000617 0.003291 -0.004114 
+-0.002111 0.002788 -0.002892 -0.000066 0.002623 0.001573 
+0.003486 0.004332 -0.000278 -0.000158 0.000388 -0.000093 
+-0.003789 -0.001943 0.001959 -0.004080 -0.001097 -0.001394 
+-0.003280 0.000245 -0.001860 -0.001536 -0.000111 -0.001261 
+-0.001452 -0.004218 0.001564 -0.001332 -0.004556 0.005444 
+0.001820 -0.002064 0.002161 0.000902 0.001805 0.000000 
+-0.001160 0.001111 0.001740 -0.005949 -0.000942 0.002433 
+-0.002826 -0.002171 -0.001577 -0.000208 -0.000675 -0.001890 
+0.000645 -0.000521 -0.001776 -0.000994 -0.000334 0.000262 
+-0.000282 -0.000156 -0.000023 0.001980 -0.000269 0.000377 
+0.002275 0.001502 -0.000072 0.000575 0.002377 -0.001896 
+-0.000460 0.001724 -0.004706 0.001935 -0.000016 -0.005926 
+0.005516 -0.002392 -0.005704 0.000047 -0.003782 -0.004349 
+-0.000517 0.002240 -0.007584 -0.003626 0.000678 -0.004871 
+-0.005487 0.001135 -0.002636 -0.001585 -0.000616 -0.000715 
+-0.005626 -0.001475 0.004220 -0.003525 -0.001098 0.003741 
+-0.003887 0.001926 -0.002098 -0.003455 -0.001182 -0.003854 
+0.001668 -0.002762 -0.001702 0.005970 -0.002743 -0.003548 
+0.007139 -0.003119 -0.000954 0.005678 -0.001031 0.000163 
+0.003150 0.001889 -0.000378 0.002748 0.002061 0.000687 
+-0.001223 0.002867 0.002952 -0.001301 -0.000109 0.006614 
+-0.010354 0.000000 0.007434 0.002365 -0.004921 0.004264 
+0.002543 -0.004378 -0.002977 0.002498 -0.002329 -0.008673 
+0.001724 0.001711 -0.010331 0.003013 -0.001977 -0.005554 
+0.000526 -0.004357 0.000300 0.000411 0.001576 0.003403 
+-0.001917 -0.000111 0.000627 -0.002698 -0.002364 -0.001437 
+-0.002607 -0.004319 -0.000356 -0.003439 -0.006052 0.000912 
+-0.003859 -0.001041 -0.001712 -0.002081 -0.001124 -0.004141 
+0.001011 0.000749 -0.001133 0.001251 0.000294 0.001100 
+0.003611 0.001213 -0.000012 -0.000522 -0.000371 -0.001471 
+0.001709 0.002010 -0.008542 -0.000069 0.003050 -0.003962 
+-0.003863 -0.003513 0.001904 -0.003518 -0.008913 0.003887 
+0.000385 -0.005385 -0.000385 -0.000404 -0.001277 -0.002651 
+-0.000574 -0.000092 -0.000601 -0.001731 0.006766 0.000813 
+-0.002917 -0.000354 -0.000259 -0.005129 0.001747 -0.000515 
+-0.003777 -0.000914 -0.002200 -0.001533 0.000859 -0.000237 
+-0.000125 0.001911 -0.003043 -0.001857 -0.000707 -0.001735 
+-0.003492 -0.002225 -0.001225 -0.002158 -0.002504 -0.000289 
+-0.003476 -0.000386 -0.004318 -0.002041 0.000252 -0.004067 
+-0.001507 0.000552 -0.001194 -0.000221 -0.000257 0.000257 
+0.001270 0.000140 -0.001424 0.002762 0.000443 -0.001462 
+0.001886 0.000212 -0.000939 0.000597 -0.001785 0.000891 
+-0.002230 -0.003669 0.001511 0.000654 -0.004910 0.002296 
+0.000125 -0.000367 -0.001951 -0.001605 0.001697 -0.003760 
+0.000538 0.001742 -0.000495 -0.000941 -0.000134 0.000547 
+0.000361 0.000123 -0.001050 -0.002560 0.000364 -0.006036 
+-0.004265 0.004664 -0.002365 -0.002793 0.002778 -0.002774 
+0.001136 0.000014 0.000027 0.004394 0.001262 -0.000627 
+0.005192 0.003631 -0.002263 0.003455 0.003368 -0.004239 
+0.003229 0.000444 0.000647 0.004467 0.000920 0.005387 
+0.005490 0.002790 0.004809 0.005352 0.004746 0.000654 
+0.001126 0.003173 0.001828 -0.000819 0.000583 -0.000794 
+-0.002199 -0.003871 0.000225 -0.004311 -0.003175 -0.000616 
+-0.004586 0.000700 -0.002176 -0.002915 0.002472 -0.002013 
+0.000767 0.001105 0.001339 0.003017 -0.003949 0.003312 
+0.003676 -0.005414 0.004480 0.002435 -0.003592 0.000943 
+-0.003936 -0.000714 -0.002074 -0.000219 0.002489 -0.002090 
+-0.001779 0.001595 -0.002418 -0.002028 0.000319 -0.000063 
+-0.002181 -0.000011 0.001581 -0.003387 -0.000521 0.000846 
+-0.001279 0.000204 -0.001189 0.002098 -0.001871 -0.002209 
+0.001842 -0.002094 -0.003349 0.008427 -0.001516 0.001687 
+0.005102 -0.003569 0.004701 0.002727 -0.002679 0.005503 
+0.000254 -0.000901 0.003027 -0.000762 0.000450 -0.001142 
+-0.000291 -0.000726 -0.000904 0.003591 0.000480 -0.000778 
+0.000424 0.001182 0.000105 -0.001181 0.001654 0.005669 
+0.000212 -0.000710 -0.000618 -0.002889 0.000199 0.000841 
+-0.001055 0.000557 0.002977 0.000717 0.002024 0.001188 
+0.000862 -0.000296 0.000681 0.000307 -0.000347 0.000549 
+0.000087 -0.001872 0.004055 -0.003578 0.001743 0.003486 
+-0.000944 0.001752 0.001680 -0.002535 0.001948 -0.000879 
+-0.005211 0.003011 -0.002721 -0.006236 0.002649 -0.001560 
+0.000329 0.001980 -0.004375 0.000922 0.003354 -0.000699 
+0.000536 0.000797 0.001761 -0.001347 0.000193 0.001349 
+0.000485 0.000000 -0.000410 0.002294 0.001719 -0.000353 
+-0.002698 0.002734 -0.002698 -0.000633 0.002306 -0.000060 
+-0.003798 0.002928 0.001422 -0.001954 0.001462 -0.000169 
+0.001298 -0.000434 -0.000438 0.003319 0.003652 -0.001951 
+-0.000104 0.002575 -0.002615 -0.005174 -0.000085 -0.001303 
+-0.007457 0.000252 0.002108 -0.004223 0.000506 0.002129 
+0.000153 -0.000446 0.000669 0.000306 -0.000634 0.001503 
+-0.002076 -0.001744 0.004318 -0.003420 -0.001233 0.006195 
+-0.003216 0.000147 0.004236 -0.001856 0.000879 0.001270 
+-0.002168 -0.000206 0.000697 -0.003478 -0.000167 0.002986 
+-0.003219 -0.000059 0.001934 -0.001680 -0.000323 -0.003036 
+0.003522 0.004996 -0.009009 0.002848 0.010704 -0.005665 
+-0.001247 0.008833 -0.002577 -0.001145 0.006420 -0.000246 
+0.002320 0.000433 0.001783 0.002807 0.003524 0.000983 
+0.001023 0.001630 0.000045 -0.000461 0.002093 -0.000042 
+0.001389 0.002203 0.000176 0.001911 0.000827 0.000841 
+-0.001342 -0.001369 0.002426 -0.004464 -0.000731 0.001306 
+0.000186 -0.001425 -0.000123 0.000822 0.001282 0.000912 
+0.001217 0.001429 0.001497 0.001387 -0.000652 0.000373 
+-0.000735 0.000992 0.003342 -0.003249 0.002109 0.002335 
+-0.004714 0.000643 -0.001071 -0.001915 0.000101 0.001019 
+-0.000834 0.001336 -0.001504 -0.000537 0.000150 0.000378 
+-0.001019 -0.000268 0.000275 -0.001181 0.000623 -0.003181 
+0.002228 0.003631 0.001639 -0.000534 0.002449 0.002846 
+-0.002761 0.003537 0.002254 -0.000170 0.001618 -0.001959 
+-0.004618 0.001450 -0.001915 -0.003032 0.000023 -0.002245 
+-0.001088 -0.000530 -0.000394 -0.002181 -0.001863 0.002272 
+-0.000091 -0.001499 0.002454 0.002391 0.000584 -0.000557 
+0.001154 0.003729 -0.003327 0.001125 0.005992 -0.004729 
+0.001111 0.007551 -0.002935 0.000401 0.004700 -0.001593 
+-0.003089 0.002834 -0.001700 -0.000553 0.001445 -0.001360 
+0.002481 0.001550 0.000000 0.001170 0.000926 0.002637 
+0.000246 0.000542 0.002306 0.000297 0.000251 -0.000655 
+-0.001295 -0.001596 -0.002007 -0.002073 0.000494 -0.002474 
+-0.005497 0.002642 -0.000470 -0.005103 0.001418 -0.002305 
+-0.001495 0.004143 0.000424 0.002530 0.001574 0.000259 
+0.001368 0.001031 0.000151 -0.001533 0.001613 -0.000707 
+-0.000560 -0.000859 0.001845 -0.000290 -0.001826 0.001185 
+0.002182 -0.001507 0.002565 -0.001182 -0.001807 0.003716 
+-0.004405 -0.003686 0.001687 -0.004629 0.001975 0.001224 
+-0.001641 0.002176 -0.004280 0.000694 -0.000960 -0.001159 
+0.002545 0.002258 0.002306 -0.002369 0.001247 -0.000312 
+-0.003249 0.001521 -0.002698 -0.000177 0.000634 -0.004253 
+0.003582 0.004118 -0.003514 0.002532 0.005981 -0.001135 
+0.002559 0.003309 -0.001279 0.000576 0.000175 -0.000877 
+-0.000196 -0.000976 0.000196 -0.001971 -0.001095 -0.000175 
+-0.002087 -0.000118 -0.000394 -0.000762 0.000426 0.000440 
+0.000517 0.000340 0.001653 0.000772 0.000085 0.001753 
+0.000113 -0.000132 -0.000877 0.001231 0.000121 -0.005662 
+0.006132 0.002897 -0.007325 0.004117 0.006201 -0.000552 
+-0.000087 0.006914 -0.002384 -0.000128 0.004733 -0.003789 
+-0.000774 0.001195 -0.004152 0.002359 0.000319 -0.003317 
+0.001847 0.001373 -0.000318 0.002826 0.002176 0.002236 
+0.003271 0.002967 0.001924 0.002149 0.001345 -0.002499 
+-0.001237 0.002473 -0.004121 -0.000632 0.001066 -0.003107 
+0.000468 0.000076 -0.000515 -0.000560 -0.001086 -0.000153 
+-0.002909 -0.000173 -0.001066 -0.001631 0.001586 -0.003195 
+0.000340 0.000871 -0.000026 0.005980 0.001827 0.000856 
+0.003325 0.002264 -0.002936 -0.000055 0.005962 -0.002141 
+-0.001002 0.005127 -0.000780 -0.000556 0.000128 -0.000423 
+0.002033 -0.000065 0.000130 -0.000817 -0.003225 0.000996 
+-0.001024 -0.004472 -0.001770 -0.005683 -0.004748 -0.002590 
+-0.002152 -0.004773 0.000374 -0.000884 0.003890 -0.004315 
+0.001181 0.000169 -0.006567 -0.003109 0.002189 -0.000920 
+-0.000967 0.003104 -0.001730 -0.001296 -0.000519 -0.000620 
+-0.000367 -0.000535 -0.000758 0.000166 -0.000503 -0.000921 
+0.000772 -0.001026 -0.000190 0.000345 0.001724 -0.002000 
+0.001312 0.003305 -0.003573 0.000857 0.003194 -0.004558 
+0.001180 -0.002928 -0.004449 0.003550 -0.004547 -0.005897 
+0.003194 -0.002707 -0.004811 0.000192 -0.001040 0.000490 
+-0.002043 0.003273 0.002328 -0.004431 -0.000121 0.001669 
+-0.000956 -0.000848 -0.001661 -0.000590 -0.003067 -0.001014 
+-0.001667 -0.004066 0.000296 -0.002955 -0.002132 -0.001585 
+-0.001967 -0.001400 -0.002403 0.000980 -0.000414 -0.005641 
+0.001006 0.002366 -0.004171 -0.002346 0.000697 0.001041 
+-0.000864 -0.002464 0.004688 -0.004391 -0.003234 0.001310 
+-0.002850 -0.000226 -0.001210 -0.004028 0.002619 -0.001651 
+-0.005141 0.002795 -0.000449 -0.003459 0.002423 0.000684 
+-0.001609 0.001298 -0.000884 0.000014 -0.000143 -0.000990 
+-0.001079 0.001072 0.001283 -0.001551 0.001216 0.002183 
+-0.000634 -0.000805 0.002004 0.000813 0.000752 0.000041 
+-0.000228 0.002217 -0.001297 0.000098 0.001574 0.001082 
+-0.003066 0.000648 0.003340 -0.003308 -0.001017 0.004577 
+-0.000979 -0.003927 0.001229 0.001468 -0.000942 0.001169 
+0.001755 0.000881 0.002800 0.001475 0.001288 0.002593 
+0.001859 0.002229 0.000120 -0.000484 0.001196 -0.000573 
+-0.000393 0.000633 -0.000008 -0.000263 0.000607 -0.000012 
+0.001873 0.001834 -0.000701 0.002358 0.003894 -0.000278 
+0.002026 0.003648 -0.005680 0.001786 0.001493 -0.002377 
+0.000837 0.000564 -0.001436 0.001786 0.000830 -0.001749 
+0.001797 -0.000083 0.000448 0.001002 0.000661 0.000849 
+-0.001995 -0.002261 0.000012 -0.004250 -0.001443 -0.003109 
+0.001212 -0.000702 -0.005338 0.005327 0.005370 -0.005273 
+0.005637 0.003516 -0.003577 0.000362 0.001046 -0.001635 
+-0.001942 -0.002759 0.001515 -0.004430 -0.003573 0.000346 
+-0.003218 0.000393 0.000657 0.000841 0.001667 0.000719 
+0.003997 0.000600 -0.000912 0.003209 0.005803 -0.005447 
+-0.000324 0.004345 0.000281 0.000468 0.002191 -0.008443 
+0.002232 0.001335 0.000366 0.001718 -0.001293 0.001953 
+0.000883 -0.000774 0.002374 -0.000899 -0.000418 0.000350 
+-0.001559 0.001952 -0.000067 0.000334 0.003484 -0.002713 
+-0.002636 -0.001202 -0.003760 -0.000775 -0.000409 -0.000307 
+-0.001938 0.000000 -0.001938 -0.001445 -0.002578 -0.001445 
+-0.004103 -0.002626 0.000533 -0.003609 -0.001247 0.000721 
+-0.003578 0.000163 0.002819 -0.004770 -0.004074 0.002385 
+-0.002687 0.000824 0.001099 -0.002065 0.000063 -0.000406 
+-0.002585 -0.001323 0.001445 -0.001576 -0.000082 0.000177 
+-0.001307 0.004053 -0.001249 -0.001750 0.004347 -0.002009 
+-0.000815 0.000790 -0.002158 -0.003757 -0.002110 0.000326 
+-0.001164 -0.001293 -0.001595 -0.001140 0.004683 0.000939 
+-0.004848 0.003244 -0.001137 0.000142 0.003029 0.001215 
+0.001720 0.000608 0.002328 0.000545 0.001598 -0.000399 
+0.000163 0.002995 -0.000717 -0.002400 0.003502 -0.000612 
+-0.000780 -0.000910 -0.001174 -0.000146 -0.000373 -0.000294 
+0.000587 -0.000377 -0.000598 -0.000301 -0.000486 -0.000729 
+0.000734 0.000893 -0.000494 0.001926 0.002791 -0.000291 
+0.004014 0.004964 -0.001649 0.001311 0.004628 -0.003277 
+-0.001459 0.001773 -0.001662 -0.001155 0.001576 0.000446 
+-0.000940 0.001344 -0.000279 0.000813 0.004659 0.000480 
+-0.000430 0.005476 -0.001718 0.000458 0.003486 -0.000443 
+-0.002690 0.000730 -0.001236 -0.001606 0.000725 -0.001459 
+0.000547 0.001591 0.001034 0.001046 0.002264 0.002356 
+0.000237 0.001645 0.002070 -0.002197 0.000675 -0.000283 
+-0.002092 0.001491 0.000592 -0.001001 0.000804 0.001553 
+0.002239 0.002555 -0.002677 0.006279 0.004884 -0.000465 
+0.002994 0.002720 -0.000126 -0.001536 -0.000060 0.000748 
+-0.000852 -0.001363 -0.000681 0.001230 0.001385 -0.001380 
+0.003682 0.002676 -0.001341 0.001334 0.001059 0.000940 
+-0.002596 0.001301 0.001140 -0.002249 0.000655 0.000338 
+0.000505 -0.000501 -0.001001 0.001700 -0.000244 -0.002315 
+-0.000419 0.000408 -0.000683 -0.001892 -0.002008 -0.001451 
+-0.000938 -0.001603 -0.002046 0.002062 0.005584 -0.007299 
+-0.005265 0.004767 -0.004944 -0.000035 0.000002 -0.006134 
+0.001051 0.003652 -0.007218 -0.002244 0.003846 -0.005610 
+-0.000864 0.001091 -0.003801 -0.001075 -0.000351 -0.000012 
+-0.001417 -0.003418 0.000611 0.000602 -0.002005 0.000645 
+-0.002401 -0.001640 0.000839 0.000000 0.000880 0.002880 
+-0.000164 0.001582 0.002437 -0.001986 -0.000138 0.000302 
+-0.003630 0.000666 -0.001262 -0.002235 -0.000879 -0.000478 
+0.000063 0.000007 0.000201 -0.000127 -0.000065 -0.000408 
+-0.000640 -0.000286 -0.000791 0.000271 0.000465 -0.001047 
+0.000023 -0.000510 0.001576 0.000700 -0.002296 0.002023 
+-0.000995 -0.003701 0.001758 -0.002312 -0.004335 0.003472 
+-0.007795 0.000991 0.003259 -0.000930 0.003204 0.003619 
+0.002908 0.002902 0.002920 0.003593 0.004350 -0.002868 
+0.006465 0.005833 0.003481 -0.000639 0.004065 -0.001662 
+0.000036 -0.000835 -0.005660 -0.004800 -0.003800 -0.006500 
+0.000199 0.002186 -0.003009 0.002223 0.006915 -0.003835 
+0.001036 0.003784 -0.007222 0.000114 0.006564 -0.003786 
+0.002190 0.002271 0.000065 0.000158 0.001250 -0.001982 
+0.002458 0.001865 -0.001723 0.001834 -0.000429 -0.002447 
+-0.001439 0.000396 -0.000827 0.001036 0.002404 -0.003944 
+0.001150 0.002628 -0.003684 -0.000231 0.001454 -0.003023 
+-0.002331 0.004063 0.000580 -0.000489 0.002647 0.002618 
+0.001392 0.001566 -0.000156 0.000090 0.001341 -0.001179 
+-0.000178 0.000707 0.000539 -0.002580 0.000259 0.001191 
+-0.001942 0.001845 0.000880 -0.000045 0.002285 0.001422 
+0.000000 -0.000744 0.003058 -0.002220 -0.001680 0.001475 
+0.000317 -0.001288 -0.000040 0.002375 -0.000365 -0.000823 
+0.000345 -0.000487 0.000129 -0.000115 0.000109 0.001204 
+-0.004204 -0.002111 -0.000235 -0.001205 -0.001384 -0.001995 
+-0.000140 -0.001194 -0.000930 0.005516 -0.000069 0.001180 
+0.000570 0.003523 0.001744 0.007019 0.002249 -0.000380 
+0.003386 0.001556 -0.002066 0.000585 0.000188 -0.000561 
+-0.000659 0.000220 0.000894 -0.001941 -0.003903 0.001919 
+-0.002250 -0.003858 0.001894 -0.000628 -0.001123 0.001709 
+-0.000341 0.000511 0.000786 0.000508 0.003668 0.000486 
+0.000926 0.003627 0.000335 0.000651 0.002126 -0.001143 
+0.000290 0.002902 0.001154 0.000938 0.003077 0.000365 
+-0.001073 0.002902 -0.000063 -0.000253 0.001758 -0.000003 
+-0.000352 -0.000093 0.002417 -0.001894 0.000570 0.000405 
+-0.003583 0.002579 -0.003201 -0.001899 0.004008 -0.006334 
+0.000956 0.003041 -0.005718 0.000134 0.002796 -0.003280 
+0.000189 -0.000397 -0.004937 0.000595 -0.001777 -0.004782 
+-0.000240 -0.001848 -0.001127 -0.002701 -0.002826 0.003142 
+-0.006183 -0.000484 -0.000387 -0.004085 -0.000252 -0.004274 
+0.002150 -0.000058 -0.002673 0.001777 -0.001388 -0.003944 
+0.001354 -0.002239 0.000207 0.000493 -0.002183 0.002183 
+0.000706 0.000136 0.003288 0.000259 0.001767 0.002980 
+-0.001519 0.001010 0.002078 -0.003301 -0.000656 0.001655 
+-0.002154 -0.001859 -0.000531 -0.003697 -0.001080 0.000279 
+-0.006518 -0.003788 0.002607 -0.006215 0.000072 0.001608 
+-0.001933 0.000103 0.001096 0.000915 -0.000693 -0.000531 
+0.001682 -0.000826 0.001058 -0.000399 -0.002371 -0.000634 
+-0.004844 -0.007228 0.000880 -0.009290 0.000520 0.003800 
+-0.000683 0.005310 0.001755 0.003006 0.002638 -0.000628 
+0.002376 0.000660 -0.000709 0.002634 0.000927 -0.000219 
+0.001538 0.004346 -0.001269 0.000035 -0.000023 -0.004242 
+0.003126 0.001500 -0.005083 0.001840 0.000138 -0.003588 
+-0.000205 0.001840 -0.003516 -0.001135 0.003632 -0.005505 
+-0.001636 0.004691 -0.005262 -0.001854 0.000039 -0.004055 
+0.000253 -0.003691 -0.002208 -0.001738 -0.000435 -0.000299 
+-0.002969 -0.003147 -0.001143 -0.000929 -0.003036 -0.001790 
+0.001622 -0.001393 -0.002911 0.004696 -0.001012 -0.001350 
+0.003021 -0.001726 0.000508 -0.000292 0.000560 -0.001012 
+-0.000988 0.003977 -0.003483 0.001759 0.004553 -0.002290 
+0.004358 0.001058 -0.002097 0.003731 -0.001716 -0.001940 
+0.000779 0.001374 0.000145 -0.000002 0.000790 -0.001316 
+-0.000991 0.000726 -0.000579 0.000763 -0.001057 0.000439 
+0.008962 0.003682 0.001008 0.009320 -0.000578 -0.005714 
+0.004833 -0.002330 -0.003260 0.003584 -0.000169 0.000516 
+-0.003179 -0.002507 -0.000349 -0.002447 -0.001784 0.000408 
+0.002066 0.002247 -0.000340 0.002366 0.004946 -0.003656 
+0.000726 -0.000151 -0.002270 -0.002493 -0.001520 0.000183 
+-0.002865 -0.001146 0.001203 -0.000646 0.000075 0.000910 
+0.002008 0.000616 -0.000338 0.001724 0.000959 -0.002254 
+-0.001882 0.001136 -0.004283 -0.006909 0.005606 -0.003455 
+-0.008586 0.004411 -0.001576 -0.002803 0.003723 0.000505 
+-0.002502 -0.002339 0.000736 0.000111 -0.002592 -0.000885 
+-0.000743 -0.001157 -0.001437 -0.002604 0.002086 -0.004475 
+0.001279 0.001404 -0.003589 -0.000263 0.001275 -0.001254 
+0.000509 -0.002264 -0.001085 0.002065 -0.000219 -0.003603 
+0.004910 0.001514 -0.002845 0.001903 0.002561 -0.000699 
+-0.001960 0.002171 0.002675 -0.002742 0.001281 0.004316 
+-0.000654 -0.000065 0.003075 0.000264 0.000206 0.000179 
+0.001573 -0.000026 -0.001612 0.002008 0.000200 -0.000976 
+0.000922 -0.000534 -0.000817 -0.001374 -0.001454 -0.003555 
+0.000106 -0.005328 -0.000844 -0.001640 -0.002204 0.000701 
+0.001779 0.002042 0.002618 -0.000537 0.006087 0.001576 
+0.000576 0.004381 -0.001384 0.000102 -0.000025 -0.001942 
+-0.001421 -0.005030 -0.000341 -0.002051 -0.004422 -0.002331 
+-0.000570 -0.000246 -0.002381 -0.000553 0.000601 -0.000155 
+0.003244 0.007073 0.000324 0.005626 0.004640 -0.002756 
+-0.000419 0.000299 0.000000 0.000362 0.000528 0.001383 
+-0.000332 0.000375 0.000381 0.002374 0.002648 -0.001320 
+0.003125 0.003984 -0.003125 -0.000851 0.002951 -0.004484 
+-0.001446 0.000663 -0.004262 0.000904 0.000379 -0.005697 
+0.002000 0.005400 -0.003400 -0.000662 0.000473 -0.003310 
+0.001471 -0.002386 -0.002983 0.002196 -0.003204 -0.002377 
+0.000802 -0.001303 -0.001707 -0.001200 -0.001185 -0.001504 
+-0.006295 -0.002426 0.002326 -0.006517 -0.004608 0.004329 
+-0.005963 -0.002340 0.001921 -0.000891 -0.000001 0.001813 
+0.001840 -0.000532 0.000837 0.002761 -0.000504 0.001487 
+0.001858 -0.000169 0.002324 0.000570 -0.000985 0.001661 
+0.001326 -0.001540 0.000721 0.001835 0.000395 0.001132 
+0.000254 0.003132 0.001589 0.002750 0.000691 0.000010 
+0.001230 0.001538 -0.001269 -0.000543 -0.002357 0.001629 
+-0.000307 -0.002222 0.002715 -0.000150 0.000078 -0.000056 
+-0.001241 0.001241 -0.001655 -0.000488 0.000544 0.001900 
+-0.001374 -0.000442 0.002527 -0.000339 -0.000844 0.002715 
+0.001194 0.000133 0.001526 -0.000607 0.000027 -0.000119 
+-0.002143 -0.001010 -0.001346 -0.001549 0.000429 0.000220 
+-0.001192 0.003781 -0.002227 0.002296 0.003691 -0.003320 
+0.002382 0.003223 -0.003005 0.001278 0.002727 -0.003204 
+0.000987 0.000351 -0.001555 -0.000343 0.000397 0.001293 
+0.000026 0.000442 0.001174 -0.000849 0.001148 -0.001098 
+-0.000248 0.000534 -0.002670 0.000173 0.002523 -0.001604 
+-0.000028 0.000533 -0.000517 -0.000506 -0.000819 -0.000964 
+0.000420 -0.000551 -0.002757 -0.000969 0.000891 -0.004107 
+0.001519 0.003219 -0.004014 0.002209 0.001628 -0.001384 
+0.001347 0.000536 0.001492 0.001215 0.001276 0.001458 
+-0.001320 0.001444 0.002558 -0.003011 0.001061 0.002023 
+-0.002779 -0.000538 0.000024 -0.000545 -0.004019 -0.001013 
+0.001167 -0.002126 -0.000645 0.000820 0.002715 0.000179 
+-0.000931 0.001176 0.004261 0.001451 -0.000363 0.005414 
+0.000201 0.000551 0.000351 0.004843 -0.003200 -0.000865 
+0.003936 -0.000863 -0.004679 0.002562 0.001250 -0.001296 
+-0.003575 0.001377 0.002472 -0.007195 0.002475 0.005179 
+-0.000953 -0.001637 -0.001548 -0.002152 0.001165 -0.000488 
+-0.000646 0.003166 0.002209 0.000113 0.007003 0.000925 
+0.000116 0.007331 -0.002654 0.000692 0.005383 -0.003548 
+0.001583 0.002547 -0.002465 0.002165 0.000336 -0.001752 
+0.003793 0.000298 -0.002827 0.004364 0.002070 -0.003161 
+0.002813 0.000165 -0.004714 -0.000663 -0.003078 -0.003040 
+-0.001472 -0.003525 -0.002208 -0.002818 -0.001920 -0.001368 
+-0.003102 0.001446 -0.000615 -0.001969 0.002070 -0.001026 
+0.000768 0.002763 -0.002342 0.001926 -0.000169 -0.000393 
+-0.001806 -0.000445 0.000494 -0.000829 -0.002603 0.004032 
+-0.002493 -0.001106 0.005355 0.000812 -0.000211 0.001803 
+0.002713 -0.000872 -0.005280 0.004405 0.001158 -0.008537 
+0.003291 -0.001028 -0.004934 0.002094 0.002500 0.001246 
+0.000287 0.004113 0.000325 0.000817 0.000992 -0.002112 
+0.002032 0.000282 -0.003270 0.001852 0.000000 -0.004519 
+0.001185 0.001111 0.000000 0.000762 0.001911 -0.001147 
+0.000463 0.001282 0.000890 0.005208 0.002958 -0.003691 
+0.005506 0.009829 -0.004538 0.004412 0.008238 -0.006474 
+0.003033 0.000570 -0.003402 0.000472 -0.000215 -0.000423 
+0.000734 -0.000699 -0.001137 0.002252 -0.000747 -0.003501 
+0.000049 -0.002578 -0.004164 -0.002031 -0.001141 -0.002281 
+0.000110 -0.000445 -0.000408 0.002784 -0.001403 -0.001414 
+0.003773 -0.000726 -0.005511 0.003333 0.000927 -0.004261 
+0.001437 0.001825 -0.002166 -0.000459 0.003164 -0.002705 
+0.000473 0.008540 -0.000631 -0.003245 0.007533 0.000840 
+-0.001522 0.003729 0.004034 0.001158 -0.002088 0.002656 
+0.000868 -0.005238 -0.000896 -0.000924 -0.002017 -0.000924 
+-0.002760 0.001666 -0.003865 -0.002247 0.001985 -0.003495 
+-0.002461 -0.000073 -0.001914 0.001045 -0.000576 0.000079 
+0.003596 -0.000066 -0.002309 0.002240 -0.001699 -0.001218 
+0.000831 -0.002762 0.001390 0.000563 -0.002183 0.001393 
+0.000132 -0.000358 0.000047 0.004534 0.000427 -0.003985 
+0.000721 -0.000076 -0.002200 -0.002677 -0.003207 0.000778 
+-0.003809 -0.002016 -0.000949 -0.000032 0.000530 -0.002973 
+0.002707 0.000000 -0.001805 0.002539 -0.000687 0.003331 
+-0.001135 -0.003559 0.000140 0.000078 -0.002651 -0.000744 
+0.000090 -0.002048 -0.001013 -0.000453 -0.000667 -0.002265 
+-0.003351 -0.002637 0.001731 -0.004245 -0.004064 0.003366 
+0.001046 -0.002280 -0.003678 0.000673 -0.001729 -0.003066 
+-0.003688 0.000099 0.001455 -0.001714 0.003900 -0.001356 
+0.002745 0.007185 -0.003024 0.003059 0.005123 -0.000155 
+0.000259 -0.000148 0.000024 -0.001768 -0.001923 0.001135 
+-0.002560 -0.000778 0.002718 -0.002896 -0.001493 0.003313 
+-0.003205 -0.001023 0.003784 -0.002107 -0.002408 0.003285 
+-0.001212 -0.001039 0.001831 0.001422 -0.000711 0.000711 
+0.001375 -0.001690 0.000479 0.001293 -0.001366 -0.000288 
+0.000325 -0.000758 -0.000897 0.000865 -0.000300 -0.003213 
+0.000118 0.002089 -0.005164 0.002538 -0.001662 -0.002799 
+0.000495 0.000099 -0.003456 0.001362 -0.000197 0.000745 
+0.002380 -0.001572 0.002755 0.001791 -0.001119 0.001119 
+0.000566 0.002053 -0.001180 -0.000296 0.002592 -0.002481 
+0.000186 0.000289 -0.000892 0.002491 -0.002302 0.000603 
+0.002683 -0.000225 -0.000899 0.001293 0.001043 -0.001791 
+0.001354 0.002167 -0.000880 0.002995 0.001386 0.000233 
+0.004137 -0.000499 0.002604 0.005815 0.001739 0.000570 
+0.006418 0.004478 -0.000970 0.005593 0.002888 0.000596 
+0.003372 0.000121 0.000469 0.002058 -0.000059 -0.000530 
+0.002173 0.000948 -0.000414 0.000438 0.004234 -0.001898 
+0.001055 0.002830 -0.003310 0.003158 0.000376 -0.002782 
+0.001439 0.002928 -0.000586 0.000783 0.002343 -0.000434 
+-0.000376 0.002015 0.001008 -0.002519 0.000564 0.000977 
+-0.002785 0.003235 0.002388 -0.001659 0.003889 0.003699 
+-0.001599 0.004429 0.001168 -0.000177 0.002485 -0.000181 
+-0.000220 0.000698 -0.000779 -0.000177 0.001137 -0.000701 
+0.001628 0.002009 -0.003493 -0.000903 0.000823 -0.004246 
+-0.001573 0.002561 -0.001865 -0.000800 0.002407 -0.001780 
+-0.003407 0.001575 0.000715 -0.000365 0.000491 -0.000262 
+0.001236 -0.001463 0.000288 -0.002733 -0.000408 0.003019 
+0.001827 -0.005463 0.001375 -0.008811 -0.002477 0.003513 
+-0.000344 -0.001806 0.001518 0.000581 0.003517 0.000288 
+0.002561 0.003089 0.000990 0.001280 0.001798 0.000113 
+0.001069 0.002418 -0.000729 0.000738 0.003928 -0.000685 
+0.002728 0.001759 -0.003344 0.004274 -0.000092 -0.002369 
+0.007885 0.002477 -0.002272 0.011429 0.007056 -0.001411 
+0.010379 0.007803 0.000000 0.003677 0.006999 -0.001993 
+-0.000963 0.003115 -0.001869 -0.000363 0.000589 0.001704 
+0.001773 -0.001597 -0.002561 0.000311 -0.002573 0.000798 
+-0.000761 0.001426 -0.000399 0.000194 0.003164 -0.000186 
+0.000565 0.000647 0.000671 0.001867 -0.002667 0.000267 
+-0.000459 -0.004845 0.001073 -0.001443 -0.002844 0.002599 
+-0.000537 0.000130 0.001748 0.000645 -0.000566 -0.000578 
+0.001890 -0.003141 0.000458 -0.002632 -0.001504 0.001508 
+-0.001360 -0.003265 0.002121 -0.000420 0.000402 0.001114 
+0.003341 0.001479 0.000828 0.002316 0.000224 0.001638 
+0.001678 -0.000372 0.000821 -0.000735 -0.000184 0.004375 
+0.001537 -0.001045 0.002432 0.000929 0.000359 0.001157 
+0.000358 0.000362 -0.001432 0.000604 0.000935 -0.000302 
+-0.000571 0.001214 0.000000 -0.000737 0.000562 0.001754 
+-0.001765 -0.001250 0.001765 -0.002232 -0.003766 0.002916 
+-0.002009 -0.004248 0.003379 -0.000779 -0.001494 0.000758 
+-0.000623 0.002577 0.001095 -0.000085 0.006219 0.000980 
+0.000548 0.003544 -0.002089 -0.001742 0.000455 0.000758 
+-0.000350 0.000106 -0.000270 0.001118 0.001641 -0.000745 
+0.000321 0.002471 -0.001346 -0.001313 -0.000845 -0.000030 
+-0.004794 -0.001196 0.004190 -0.005047 0.000670 0.004718 
+-0.004763 -0.000582 0.001633 -0.003921 -0.001038 -0.000347 
+-0.002300 0.000575 0.000224 -0.000035 -0.005838 0.003552 
+-0.002057 -0.004558 -0.001072 -0.000281 -0.000887 -0.000813 
+-0.000457 0.003655 -0.002803 0.003727 0.004392 -0.001734 
+0.002647 0.001124 -0.002023 0.000400 0.000374 -0.000563 
+-0.002161 0.000289 0.000389 -0.001122 0.001403 0.000226 
+0.000011 0.000161 -0.000147 0.000710 0.000214 0.000206 
+-0.001191 0.000015 0.000441 -0.002756 -0.000567 -0.000756 
+-0.001679 -0.001044 -0.002995 0.000619 -0.000888 -0.003822 
+0.002450 0.000511 -0.002145 0.001248 0.000411 -0.000931 
+-0.000320 -0.000878 0.001269 -0.000811 -0.000830 0.001111 
+0.000084 0.001191 -0.001409 0.002078 0.003672 -0.002809 
+0.003130 0.002723 -0.001533 0.003394 0.000461 0.001199 
+0.002521 -0.004372 0.005905 -0.001261 -0.001195 0.006693 
+-0.004010 0.002421 0.004578 -0.002388 -0.000342 0.002393 
+-0.000810 -0.002267 0.001498 0.000340 -0.003787 0.000221 
+0.000341 -0.000597 -0.000061 -0.001610 0.001500 -0.000321 
+-0.000044 -0.000292 -0.000154 0.000041 -0.001310 0.003604 
+0.000496 -0.000992 0.002558 -0.001866 -0.001571 -0.000590 
+0.000059 0.002125 -0.002673 0.000702 0.002160 -0.003267 
+0.001628 0.000454 -0.000309 0.001001 -0.001441 -0.000806 
+-0.000220 -0.003404 -0.001903 0.002266 -0.000933 -0.002147 
+0.000509 -0.000044 -0.000209 -0.002339 -0.001641 0.000351 
+0.001239 -0.000803 0.002295 -0.000107 -0.002308 0.000071 
+0.002656 -0.002656 -0.001328 0.000910 -0.002470 -0.001326 
+-0.000240 0.000588 -0.000459 0.002220 0.003703 -0.000742 
+0.000385 0.000293 -0.004547 -0.000619 0.002360 -0.003153 
+0.001033 0.001476 -0.001768 -0.000522 -0.000352 -0.000349 
+-0.000971 -0.000682 -0.000680 -0.000028 -0.000123 0.000003 
+0.000368 -0.000240 0.000048 0.000018 -0.001553 0.001558 
+-0.001852 0.000000 0.001407 -0.002148 0.002222 -0.002222 
+-0.002660 0.002162 -0.003330 -0.001828 0.004265 -0.000376 
+-0.000146 0.002249 0.003329 0.000822 0.002007 0.004473 
+0.002640 0.003520 0.001760 0.000762 0.004812 -0.000421 
+-0.002499 0.002577 -0.001450 -0.003902 -0.001447 -0.002455 
+-0.002034 0.000746 0.000512 0.003131 0.003447 -0.001277 
+0.003499 0.002656 0.001315 -0.000066 -0.002118 -0.003806 
+-0.000553 0.001036 -0.004007 -0.001069 0.002531 -0.000487 
+-0.000107 0.003707 -0.000636 0.001209 0.001720 -0.001375 
+0.000826 0.000140 0.000238 0.000317 -0.001590 0.000914 
+-0.000752 0.001245 0.000681 -0.005755 0.000328 0.001089 
+-0.004342 -0.004583 0.003076 0.000360 -0.001417 0.001733 
+-0.000344 -0.000557 0.002278 -0.002945 0.001592 0.001870 
+-0.002376 0.002355 -0.000597 -0.002486 0.002768 -0.001610 
+-0.004011 0.002291 -0.001148 -0.001128 0.001051 -0.002667 
+-0.000956 0.004134 0.001111 0.000232 0.000916 0.000201 
+0.000103 -0.002666 -0.003331 -0.002730 0.000974 -0.000779 
+-0.004868 -0.003000 -0.004346 -0.000589 -0.001773 -0.002053 
+0.001177 -0.001728 -0.000197 0.001295 -0.001979 0.002505 
+-0.002290 -0.004675 0.001608 -0.000607 -0.001518 -0.000911 
+-0.005212 0.000259 0.005204 -0.000018 -0.001720 0.003589 
+0.001555 -0.001338 0.001348 0.000923 -0.003230 -0.000781 
+-0.003188 -0.002159 -0.000746 -0.004365 -0.002265 0.000991 
+-0.004346 -0.003162 0.001317 -0.002740 -0.002909 0.003413 
+-0.002451 -0.001436 0.002371 0.000848 -0.000818 0.002833 
+0.000732 -0.001511 0.000791 0.002269 0.003538 -0.002269 
+0.003510 0.005634 -0.003864 -0.003934 0.002255 -0.002807 
+0.000989 -0.001269 0.000628 -0.000389 0.001329 -0.000884 
+0.001212 0.001000 -0.002000 0.002751 0.001904 -0.000421 
+0.001091 -0.000031 0.001097 0.001984 -0.001270 -0.000238 
+0.002236 0.000542 -0.000616 0.002570 0.004142 -0.003205 
+0.000910 0.003645 -0.005284 0.003663 0.000121 -0.003300 
+0.005827 0.004248 -0.005038 0.009318 0.004909 -0.005727 
+0.008326 0.004505 -0.003720 0.002820 0.000470 -0.000896 
+-0.001973 0.000068 -0.000498 -0.002774 0.000391 -0.001327 
+-0.002929 0.003081 -0.002778 0.004275 0.003359 -0.000305 
+0.000909 0.000840 0.000546 0.000818 -0.001269 0.001308 
+0.000652 -0.000599 0.001317 0.000839 -0.001259 0.000000 
+0.001658 0.003538 -0.003203 -0.000351 0.002981 -0.002451 
+-0.001587 0.001922 -0.001373 -0.000149 0.000634 0.000696 
+0.001641 0.000460 0.001445 0.001040 -0.001568 0.000784 
+0.000104 -0.001201 -0.000232 -0.001123 -0.001442 -0.000687 
+-0.001266 -0.002080 -0.000452 -0.001507 -0.001432 -0.000214 
+-0.000025 -0.000232 -0.000096 0.000643 0.000971 0.000905 
+-0.000222 0.002086 0.001398 -0.000556 0.001563 -0.000111 
+0.000735 0.000812 -0.000895 0.003847 0.001751 -0.003560 
+0.003722 0.003027 -0.004895 0.003583 0.000354 -0.003733 
+0.001161 0.000789 0.000456 -0.000257 0.003033 0.000522 
+-0.000492 0.004478 0.000901 0.000292 0.002642 0.002202 
+-0.000145 0.001218 0.001578 -0.000602 0.000000 -0.001353 
+0.001420 0.002353 -0.004950 0.002534 0.005201 -0.006748 
+0.003005 0.004526 -0.006807 0.004222 0.001545 -0.001236 
+0.002543 -0.000103 -0.001162 0.001752 -0.000772 -0.002489 
+-0.000261 -0.001987 -0.001763 -0.000056 -0.002165 -0.001215 
+0.001189 -0.003199 0.001575 0.000423 -0.001606 -0.001860 
+-0.000984 -0.002262 -0.001461 -0.001650 -0.002026 -0.003716 
+-0.000705 -0.001200 -0.002984 0.002468 0.000955 -0.004756 
+-0.001023 0.003719 -0.002604 -0.001457 0.001236 -0.002299 
+0.000012 -0.000352 0.000060 -0.000556 -0.000635 0.001097 
+-0.001676 -0.001309 0.002698 -0.004153 -0.004208 0.000027 
+-0.004332 -0.003482 0.003098 0.001634 -0.000826 -0.000008 
+0.002972 -0.000337 0.001072 0.001639 -0.000441 -0.000179 
+-0.001817 -0.003102 -0.000771 -0.002983 -0.003863 -0.000640 
+0.000735 -0.002527 -0.000571 0.002351 0.001776 -0.000157 
+-0.000167 -0.000190 -0.001213 -0.001537 0.000816 -0.000385 
+0.001022 0.000796 0.002156 0.003430 0.002790 0.000457 
+0.006102 0.000343 -0.001462 0.001346 0.002020 0.001069 
+-0.000341 0.000098 -0.000083 0.000296 -0.000415 -0.000136 
+0.000221 0.000842 -0.003072 0.001271 0.001668 -0.006830 
+0.004923 0.008043 -0.003420 -0.000103 0.006548 -0.004046 
+0.002247 0.004673 -0.004524 -0.001741 0.003109 -0.001803 
+-0.002893 0.000359 -0.004746 -0.003167 -0.000621 -0.002950 
+0.000099 -0.000173 -0.000272 0.001532 0.002504 0.000268 
+0.003953 0.002865 -0.000663 0.005346 0.000944 -0.002688 
+0.003999 -0.001756 -0.003044 0.001998 -0.002298 -0.000250 
+0.002781 0.001971 0.000506 0.004632 0.006153 -0.003933 
+0.001914 0.003937 -0.006836 -0.000843 0.002949 -0.001729 
+0.000000 -0.001550 0.001783 -0.001406 -0.005259 0.003179 
+-0.002798 -0.002255 -0.001322 0.001473 -0.001212 -0.000863 
+0.002237 -0.001196 -0.000618 0.003828 0.000563 -0.001125 
+0.001654 0.003858 0.001654 -0.001111 0.000000 0.002302 
+-0.001882 -0.000961 0.000027 -0.001911 -0.001274 -0.000781 
+0.000268 -0.000853 -0.000054 0.001047 0.003372 -0.002791 
+0.000808 0.003139 -0.004993 -0.000357 0.000298 -0.003630 
+-0.000319 -0.000364 -0.000933 -0.002113 -0.001321 0.002463 
+-0.003661 -0.000407 0.003435 -0.002560 0.002445 0.000817 
+-0.000801 0.000260 -0.002553 0.000383 -0.000128 -0.003191 
+-0.002469 -0.001299 -0.000219 -0.000629 -0.001014 0.000927 
+0.001686 0.002477 0.000499 -0.001131 0.004636 -0.001242 
+0.001154 0.006077 -0.002462 0.001020 0.005937 -0.002373 
+0.000557 0.003521 -0.002620 -0.001470 0.001037 -0.001583 
+-0.001244 0.001838 -0.000249 -0.000197 0.002358 -0.001201 
+0.001499 0.001853 -0.004023 0.002370 0.005080 -0.001866 
+0.000170 0.000504 0.000357 0.000610 -0.001937 0.000799 
+-0.001876 -0.001038 -0.001355 -0.001684 0.003582 -0.002592 
+-0.002035 0.006442 -0.001646 0.001325 0.007579 -0.001182 
+0.003931 0.002417 -0.002240 -0.000020 0.000535 0.002855 
+0.000600 0.003855 0.000915 0.000176 -0.000121 -0.000476 
+-0.004847 0.002515 -0.002149 -0.002039 0.000513 0.002211 
+-0.000466 0.001138 0.000373 0.002485 0.000220 0.001877 
+0.000531 -0.000562 0.000109 -0.002969 -0.003594 0.002344 
+-0.004374 -0.001499 0.001171 0.000000 0.000849 0.000392 
+0.003028 0.001170 0.001807 0.000946 0.001089 0.000510 
+0.000326 -0.002043 -0.002140 0.000906 -0.001283 -0.000645 
+0.001781 0.000663 -0.000796 0.003427 0.000419 0.000073 
+0.001544 0.004150 -0.000911 0.003095 0.001829 0.002181 
+0.001104 -0.000093 0.002245 0.000446 -0.000064 0.002231 
+0.001314 0.000504 0.001544 0.004479 0.001495 -0.000502 
+0.007706 0.001028 -0.001818 0.007596 0.002142 -0.001753 
+0.003227 0.000797 -0.000101 -0.002152 0.002410 -0.000075 
+0.000228 0.001538 0.000867 0.000780 0.000525 0.001854 
+0.002227 -0.000625 0.001961 -0.000573 -0.002195 0.000607 
+-0.000480 0.000391 0.004494 -0.000101 0.003653 0.002289 
+-0.001510 0.002934 0.003100 -0.001370 0.000784 -0.000003 
+0.000438 0.001927 -0.003824 0.001822 0.000902 -0.004517 
+0.000602 0.000094 0.000495 -0.001258 -0.002872 0.000646 
+-0.002235 0.000731 0.005608 0.000398 0.001924 0.000575 
+0.001055 0.003043 -0.002265 0.001654 0.001163 -0.001648 
+0.000353 0.000433 -0.000655 -0.000200 0.000981 0.000423 
+-0.002519 0.000728 0.001092 -0.001641 -0.001641 0.003359 
+-0.002981 0.001318 0.003966 0.000954 0.003423 -0.000088 
+0.002791 0.004383 -0.007839 0.002401 0.000325 -0.008376 
+-0.002978 -0.001357 -0.001375 -0.003985 -0.002530 0.007232 
+-0.005611 -0.004212 0.004050 -0.001946 0.000893 0.002089 
+-0.004077 0.004470 0.000027 -0.000693 0.004529 -0.001720 
+-0.000129 -0.000928 -0.001001 -0.001295 -0.002158 -0.002158 
+-0.000307 0.000302 -0.003049 0.000100 0.003535 -0.001301 
+0.001332 0.002572 -0.000952 0.003235 0.001405 -0.000579 
+0.003397 0.003304 -0.000295 0.001611 0.002797 -0.004498 
+0.004246 0.003253 -0.000876 0.002088 0.005685 -0.001094 
+0.001431 0.006993 -0.000834 0.000000 0.004714 0.000357 
+-0.001616 0.002378 0.001347 -0.002189 0.001698 0.000191 
+-0.002048 0.000632 -0.000709 -0.002484 -0.002942 -0.001627 
+-0.002205 -0.004904 0.001870 -0.003867 -0.001133 0.002300 
+-0.002249 0.002728 -0.000641 -0.000456 0.001959 -0.002881 
+0.000601 -0.000558 -0.001469 -0.002680 0.001388 -0.000055 
+-0.002547 -0.000272 -0.001202 0.000502 -0.000326 -0.000585 
+0.005930 0.001542 -0.000783 0.004248 0.004857 -0.000210 
+0.000586 0.001459 -0.000337 -0.001996 -0.003943 0.004179 
+-0.002094 0.000092 -0.000179 0.001428 -0.002159 0.000183 
+-0.000376 -0.000198 -0.000271 0.000509 0.000846 -0.001148 
+0.003328 0.000709 -0.002443 0.000535 -0.003287 -0.000194 
+-0.003361 -0.003261 -0.001630 0.000319 0.001094 -0.000020 
+0.001509 0.005373 0.001744 0.001278 0.004880 0.004143 
+0.001587 0.002908 0.002298 -0.000685 -0.000463 0.001017 
+0.001531 -0.001167 -0.000691 0.005384 0.000949 -0.001179 
+0.003210 0.004096 -0.000759 0.001141 0.004156 -0.002711 
+0.005304 0.001768 -0.005652 -0.001928 0.003214 -0.003214 
+-0.000016 0.001901 -0.002005 -0.003337 -0.003006 -0.001396 
+-0.006442 -0.003699 -0.000596 -0.006007 -0.002396 0.002158 
+-0.004120 -0.000826 0.005255 -0.000883 0.000501 0.005513 
+-0.000718 0.001533 0.002019 -0.001562 0.000612 0.000985 
+0.000179 0.003513 -0.001655 0.001248 -0.000592 -0.001458 
+0.002652 0.000123 0.000659 -0.001259 0.000193 0.002420 
+-0.002235 -0.000652 0.002608 -0.002102 0.000585 -0.000109 
+-0.001284 0.001066 -0.001528 -0.001723 0.000450 -0.001093 
+-0.002665 -0.002286 -0.000271 -0.002286 -0.005004 -0.001027 
+-0.002362 -0.004619 -0.001026 -0.000214 0.000807 0.001911 
+0.000701 -0.000762 0.002502 0.001588 -0.001018 0.001213 
+0.003273 -0.000218 -0.002307 0.003489 0.005604 -0.003582 
+0.002222 0.001389 -0.000347 -0.007345 0.004364 -0.000218 
+-0.000788 -0.002060 0.001323 -0.001881 -0.003028 -0.000898 
+-0.000539 -0.000695 -0.000987 0.002227 0.004531 -0.002227 
+-0.001002 0.000686 0.002162 -0.001021 0.000273 0.003118 
+0.000533 0.001997 0.000266 0.001864 0.002714 -0.003224 
+-0.000200 0.003751 -0.002634 -0.001861 0.000328 -0.000438 
+-0.000942 0.002044 -0.002825 0.001442 0.002873 -0.004296 
+0.001124 0.000346 -0.002692 -0.003508 0.002908 0.001443 
+-0.002256 0.005464 0.000397 0.000850 0.003770 -0.000147 
+0.002568 0.001438 0.000230 0.001431 0.000146 0.000505 
+-0.002409 0.000914 0.000926 -0.004339 0.003015 0.001502 
+-0.000473 0.000999 0.004958 -0.000490 -0.002444 0.005311 
+0.000098 0.001014 -0.001301 0.002503 0.003755 -0.006000 
+0.000985 0.002689 -0.002463 -0.002383 -0.001000 0.002860 
+0.000472 -0.000412 0.000428 0.000508 0.001895 0.000954 
+0.000651 0.002557 -0.003567 -0.000406 0.002159 -0.003017 
+-0.000266 0.000121 -0.000508 -0.001253 0.000000 0.001392 
+0.000341 0.000939 0.001195 0.002541 0.000041 0.001025 
+0.002558 0.001927 -0.001783 0.000222 -0.000087 -0.001089 
+-0.000780 0.000941 -0.000702 0.000147 0.002713 -0.001334 
+0.003821 0.003253 -0.000239 0.002727 0.001266 0.000149 
+-0.000858 0.000774 0.000245 -0.001743 0.000956 -0.000412 
+0.000015 0.000603 -0.001451 0.000611 -0.000225 -0.000862 
+-0.000991 0.003063 0.001081 0.003555 0.000789 -0.006976 
+0.002198 0.003725 -0.006547 0.003512 0.002879 -0.003682 
+0.001420 0.001168 0.000749 0.000733 0.000787 0.002700 
+0.000989 0.000841 0.000594 0.001330 -0.000056 -0.002595 
+-0.001176 0.000063 -0.002852 -0.001589 -0.000170 0.000484 
+0.000172 -0.001404 0.001124 -0.000270 -0.000964 0.001108 
+-0.000281 -0.001102 0.003065 0.001336 0.000490 0.002940 
+0.000642 0.004006 0.001404 -0.000814 0.005290 0.001627 
+0.001542 0.003176 0.001606 -0.000036 0.000616 0.000723 
+-0.000271 -0.001526 -0.000136 0.000940 -0.001966 -0.001111 
+0.001488 -0.001339 0.000044 -0.000029 0.000313 0.000018 
+-0.001101 0.000886 -0.001188 -0.001593 -0.000825 -0.000077 
+0.000004 0.000147 0.001164 0.002516 0.004391 -0.003403 
+0.000675 0.012830 -0.010427 -0.007837 0.015032 -0.004679 
+-0.001435 0.004849 0.001961 0.001077 -0.001934 -0.002081 
+0.006895 -0.006940 -0.011506 0.005388 -0.007629 -0.023310 
+0.000359 -0.002842 -0.024881 -0.006483 0.008539 -0.018754 
+-0.000530 0.004839 0.001797 -0.002715 -0.002876 0.005108 
+-0.003926 -0.002603 0.005868 -0.000268 -0.002791 0.003316 
+0.000098 0.000442 0.000373 0.004255 0.002305 -0.004078 
+0.001098 0.004284 -0.001631 -0.002406 0.000451 -0.001203 
+-0.003182 -0.002191 0.003962 0.000280 0.001973 0.000287 
+0.001199 0.003285 -0.004484 0.000936 0.001166 0.000739 
+-0.000255 0.000459 -0.000024 -0.001245 0.000801 -0.000285 
+-0.001001 0.000742 -0.003931 -0.000726 -0.000300 -0.003495 
+-0.000976 0.000295 -0.001695 -0.001548 0.000556 0.000660 
+0.000409 -0.000070 0.000551 0.003300 -0.003014 -0.001525 
+0.004170 0.000791 0.000257 0.000729 0.001599 -0.003081 
+0.001278 0.001920 0.000260 -0.000568 -0.000007 0.000165 
+0.000016 -0.000291 -0.000867 -0.000312 -0.000312 0.001249 
+-0.001873 0.001424 0.003721 -0.002442 0.002294 0.004203 
+0.001706 0.001782 0.003034 0.002203 0.002305 -0.000193 
+-0.000482 -0.000607 -0.001051 -0.001054 -0.001142 -0.000106 
+-0.001027 0.002503 -0.002302 0.001345 0.000168 -0.001513 
+0.002413 0.001607 0.001515 0.004314 0.006361 0.000312 
+0.004078 0.004927 -0.000316 0.000147 -0.001402 0.000314 
+-0.004818 -0.004700 0.000631 -0.005657 -0.001392 0.002645 
+-0.001524 0.004778 -0.000554 -0.000302 0.007744 0.001006 
+0.001610 -0.000701 0.000769 0.005969 -0.001076 -0.000508 
+0.004691 -0.000912 -0.000259 0.004545 0.004463 0.001983 
+0.003938 0.002457 0.001933 0.002705 0.002532 0.000125 
+0.001723 0.002301 -0.000974 -0.001195 0.002331 -0.000221 
+-0.002436 0.000398 -0.003504 0.001203 0.001256 -0.005561 
+0.003856 -0.001110 -0.005355 -0.000690 0.001204 -0.002703 
+-0.001244 -0.000813 0.000100 0.000097 0.000148 0.000309 
+-0.000049 0.004632 -0.000107 0.004917 0.007972 -0.001718 
+0.002480 0.000528 -0.001584 -0.000155 0.000337 0.000626 
+-0.000859 -0.002100 -0.002161 0.000882 -0.002232 -0.003916 
+0.001458 -0.002408 -0.003125 0.003922 0.002815 -0.000980 
+0.003973 0.003412 -0.005035 0.005144 0.003022 -0.003826 
+0.002596 0.004258 -0.002802 0.000650 0.002301 -0.004751 
+-0.002210 0.007350 -0.005889 -0.004114 0.008699 -0.011882 
+-0.027032 0.005650 -0.001930 -0.011016 0.005454 0.007386 
+0.011422 -0.011613 -0.002091 0.534314 -3.279412 -1.333333 
+0.821990 -3.136126 -1.931937 -0.006674 -0.004931 -0.004433 
+-0.003988 0.008692 -0.004249 -0.005635 0.000000 0.005000 
+-0.001850 0.002744 0.002151 0.000073 0.001631 0.001926 
+0.000624 -0.000229 0.002597 0.000681 -0.001575 0.002724 
+0.000986 0.000765 0.001454 0.000049 0.001054 -0.000726 
+-0.001170 0.001115 0.000334 -0.000827 0.000578 -0.000868 
+0.001579 0.000157 -0.002819 0.001353 -0.000369 -0.001567 
+0.000209 0.000371 -0.002166 0.001171 0.005220 -0.005521 
+-0.000045 0.004801 -0.010745 -0.002920 0.002022 -0.008880 
+-0.001663 0.003298 -0.004818 -0.000383 0.000443 0.000251 
+0.001909 -0.002231 0.001912 0.000443 -0.001967 0.001898 
+0.002417 -0.002239 -0.001665 0.001866 0.000533 0.001100 
+-0.000074 0.001007 0.001067 0.002393 0.001142 -0.000564 
+-0.000328 0.001641 -0.001034 0.000149 -0.000233 0.002481 
+-0.000820 0.000050 0.007009 -0.002563 0.002136 0.007143 
+-0.001609 0.002134 0.004641 0.000419 0.003984 -0.000262 
+0.000465 0.002910 -0.003023 0.000000 0.001797 -0.002812 
+0.000082 0.002762 -0.001116 0.001331 0.003788 0.001390 
+-0.006032 -0.007957 -0.000299 -0.005066 -0.002551 0.001387 
+0.001842 0.000063 -0.000211 0.002912 -0.001152 -0.000173 
+-0.001777 -0.003920 -0.001214 -0.007900 -0.003695 -0.000099 
+-0.009074 0.001251 0.002573 -0.002263 0.005888 0.002461 
+-0.001307 0.005111 0.002511 0.003002 0.003988 0.003137 
+0.002996 0.005628 -0.003049 0.003887 0.004250 -0.004442 
+0.003280 0.002797 0.001093 0.001308 0.003199 -0.002918 
+-0.000122 0.000108 0.000304 -0.005394 -0.000577 0.001576 
+-0.005568 -0.000768 0.001116 0.000447 -0.000232 -0.000794 
+0.003240 0.003504 -0.000381 0.003275 0.000852 -0.000931 
+0.001901 -0.000807 0.000312 0.002532 0.000508 -0.000764 
+0.003755 -0.000626 -0.001579 0.000165 0.002545 -0.000448 
+-0.001403 0.003205 -0.000552 -0.004167 0.002121 0.001746 
+-0.000856 0.001050 0.001331 0.002031 0.000897 -0.000427 
+0.002984 0.001942 -0.000651 0.003189 0.004184 -0.001199 
+0.001701 0.003169 0.000170 0.000498 -0.000781 -0.000807 
+-0.000215 -0.001344 0.000473 -0.002299 0.007816 -0.006439 
+-0.008159 0.010698 -0.008612 0.000986 -0.000407 0.003674 
+1.994253 -2.614943 1.545977 2.227723 -3.297030 1.693069 
+1.472081 -3.076142 1.035533 0.012875 -0.019042 -0.005650 
+0.010795 -0.004596 -0.012778 0.006840 -0.002633 -0.008029 
+0.001345 0.000960 0.000359 -0.000417 0.000417 0.005227 
+-0.002015 -0.002705 -0.000246 0.000365 -0.001331 0.000734 
+0.001689 0.001761 -0.000185 0.001133 0.001217 -0.000180 
+0.001175 -0.000901 0.000401 0.000744 -0.002180 -0.001323 
+-0.000931 -0.001180 -0.002947 -0.000996 0.000866 -0.003020 
+-0.001595 -0.000068 0.000668 0.002600 0.002477 0.001212 
+0.001126 0.009649 0.000322 0.005559 0.007604 0.001930 
+0.006892 0.007497 -0.006156 0.002662 0.005676 -0.008221 
+0.001677 0.005508 -0.004193 0.002442 0.001491 0.001396 
+0.001584 0.001118 0.005123 -0.002086 -0.001131 0.002651 
+0.002130 0.000954 0.001220 0.002559 0.000612 0.001410 
+0.005841 0.002677 -0.006815 -0.000174 -0.000261 -0.003045 
+-0.000391 0.001412 0.000298 0.000023 0.000816 0.001820 
+0.000116 0.000544 0.001096 0.000959 0.000043 0.000362 
+0.001736 -0.001772 0.001152 0.001288 -0.002132 0.000368 
+0.000111 -0.000207 -0.000079 0.001037 0.003527 0.001600 
+0.002565 0.004155 -0.003911 0.004460 0.001428 -0.001721 
+0.003125 0.011866 0.000510 -0.002116 0.012002 0.003133 
+-0.001929 -0.000286 -0.000234 0.001156 -0.009625 -0.004439 
+0.003748 -0.007831 -0.003578 0.001823 -0.001684 -0.001261 
+-0.002091 0.002410 0.003534 -0.003122 0.009218 0.000299 
+-0.001657 0.007301 -0.000717 0.000141 0.004895 -0.004942 
+0.001667 0.007417 -0.003000 -0.000920 -0.000155 -0.000485 
+-0.000314 -0.002933 -0.004259 0.000102 -0.002763 -0.003377 
+-0.001318 -0.000347 -0.000885 -0.004687 0.000408 0.001498 
+-0.003457 0.000702 0.002656 0.001159 0.000210 0.000243 
+0.004002 0.001744 -0.003703 0.005056 0.001738 -0.001780 
+0.003977 0.000175 0.000325 0.003613 -0.000086 0.001518 
+0.003950 -0.001541 0.001789 0.002093 -0.002636 0.000155 
+-0.002515 0.001790 -0.001626 -0.003636 0.009473 -0.002247 
+-0.001083 0.008576 -0.000690 -0.000597 0.002318 0.001275 
+0.000902 0.002980 0.002258 0.004882 0.003578 -0.000035 
+0.000127 0.006282 -0.003613 -0.003528 -0.000203 -0.000062 
+0.000047 -0.001386 0.002432 0.007031 0.005078 0.001172 
+-0.000337 -0.000186 -0.001422 0.007667 -0.009600 0.003339 
+4.000000 -3.892430 1.848606 5.207921 -4.267327 2.363036 
+4.390625 -3.855469 2.429688 3.506410 -2.628205 2.019231 
+0.008790 -0.008891 -0.004305 0.002553 0.013931 -0.002399 
+0.001717 -0.000267 0.001928 0.002684 -0.005745 0.004481 
+-0.001761 -0.003131 0.004411 0.003149 -0.000287 -0.000107 
+0.000037 0.000761 0.000971 0.000262 0.000659 -0.000475 
+-0.000872 -0.003664 -0.000606 0.002343 -0.006115 -0.000715 
+0.002072 -0.001908 -0.000144 -0.000575 0.002470 0.002614 
+-0.004518 0.006722 0.002204 -0.000754 0.004462 0.002897 
+0.002545 -0.000985 0.003394 0.002057 -0.001035 0.000039 
+0.001400 0.004401 -0.005651 0.005990 0.005948 -0.004851 
+0.004592 0.002217 -0.003960 0.001517 0.006511 -0.003111 
+0.000582 0.006267 -0.000663 0.000472 0.002964 0.000784 
+0.001270 0.000079 -0.000873 0.000138 0.000698 -0.002822 
+-0.001333 0.000276 -0.003902 0.001030 -0.000324 -0.000082 
+0.004821 0.003358 0.001022 0.004904 0.002055 0.000311 
+0.003687 0.000220 -0.002068 0.002066 0.001032 -0.003780 
+0.000814 -0.000227 0.000155 -0.000777 -0.004112 0.001385 
+-0.000743 -0.002759 -0.000253 0.002857 -0.000571 0.001143 
+0.003504 0.003504 -0.001260 0.000565 0.001349 0.000813 
+-0.000788 0.027710 0.005258 -0.006391 0.006140 -0.000125 
+-0.008377 -0.022303 -0.006610 -0.008209 -0.029651 -0.006789 
+0.001003 -0.021725 -0.005162 -0.000386 0.002067 -0.009237 
+0.011778 0.021725 -0.000318 -0.002128 0.013911 -0.000328 
+-0.005111 0.004842 0.001883 0.001045 0.004480 0.003853 
+-0.003733 0.003565 0.001771 -0.000598 0.000111 -0.000481 
+-0.002520 -0.005897 -0.005141 -0.001055 -0.007224 -0.006025 
+-0.001500 -0.000640 -0.001209 0.005102 0.005077 0.002376 
+0.007944 0.003962 0.001317 0.002282 0.002608 0.003419 
+-0.000187 -0.000746 0.004715 -0.001511 0.002281 0.003194 
+0.000738 0.000145 -0.001978 0.007753 0.003896 -0.003046 
+0.002003 0.000608 -0.003499 0.003648 -0.003038 0.002843 
+-0.002795 0.002539 0.001841 -0.004071 0.003415 -0.002760 
+-0.001911 0.000363 -0.003076 -0.002000 -0.000751 0.000088 
+-0.003107 0.000744 0.001554 0.002347 0.002907 0.003547 
+0.001876 0.002605 -0.004376 -0.007056 0.002663 -0.007599 
+0.001093 -0.000347 -0.004666 0.002205 -0.002197 0.005005 
+0.018338 -0.022394 0.006862 1.389140 -3.171946 1.004525 
+3.433071 -3.692913 1.618110 4.688000 -4.012000 2.388000 
+4.374331 -3.828877 2.925134 0.025198 -0.035781 0.020581 
+0.021281 0.000406 -0.006345 0.003278 0.000427 0.003000 
+-0.002438 0.009328 0.001508 0.001130 0.001543 -0.002541 
+0.004959 0.007967 0.000000 0.000389 -0.000243 0.000236 
+0.000365 -0.001060 0.002057 -0.001009 -0.005869 0.002595 
+0.002418 -0.006027 0.001696 0.000970 -0.005128 0.001733 
+-0.000498 -0.000026 0.000865 -0.002648 0.006971 -0.000208 
+-0.001512 0.006783 0.000930 -0.002395 -0.003136 0.000185 
+0.000948 -0.003258 0.006959 0.001078 -0.001040 0.001850 
+-0.000126 0.005401 -0.000553 0.000732 0.002903 0.003084 
+0.003907 0.002138 0.001572 0.003383 0.003234 0.001620 
+0.001515 0.001303 0.000467 -0.001999 0.000017 0.000755 
+-0.000616 0.000072 -0.002395 -0.000220 -0.001407 -0.004260 
+0.002057 -0.002199 -0.003346 0.007178 0.003383 -0.005148 
+0.007587 0.003794 -0.004206 0.003042 -0.000483 -0.000347 
+-0.005781 -0.001945 0.004279 -0.011165 -0.000490 0.003781 
+-0.007975 0.000558 -0.000490 -0.002847 0.001138 -0.000302 
+0.001587 -0.000502 -0.000448 0.003366 -0.000100 -0.002908 
+0.001071 -0.000016 0.000479 0.002242 -0.002321 0.003557 
+-0.003582 0.009444 -0.000680 -0.009099 -0.025655 -0.008603 
+-1.417910 -4.497512 -0.099502 -1.175258 -4.154639 -0.335052 
+0.002139 -0.028706 -0.003063 0.007161 0.004076 -0.014928 
+0.002536 0.021342 0.001010 -0.004597 0.007720 -0.005621 
+-0.008374 0.003145 -0.002196 -0.003176 0.002338 0.002466 
+-0.001507 0.001234 0.000792 0.003053 -0.000800 0.000242 
+0.003961 -0.007038 -0.001556 0.000727 -0.007433 -0.003967 
+0.000905 -0.000683 0.000320 0.001135 -0.001806 -0.003353 
+0.006893 -0.000549 0.002005 0.005261 -0.000477 0.000850 
+-0.000872 -0.001159 0.000780 -0.002069 -0.001040 0.001510 
+0.000972 0.000359 -0.000792 0.004701 -0.001093 0.001187 
+0.000295 -0.003018 0.002204 0.000636 -0.002588 0.000046 
+-0.001793 0.000487 -0.001423 -0.001869 0.001230 -0.003738 
+-0.000985 -0.000530 -0.005000 -0.001292 -0.002585 -0.003231 
+-0.003185 -0.001652 0.000368 -0.007387 -0.003248 0.002038 
+-0.008041 0.006449 0.003875 -0.011849 0.009460 0.002969 
+-0.004839 0.015086 -0.002213 0.009573 -0.013725 0.003995 
+0.016212 -0.023390 0.007393 1.849315 -2.735160 0.885845 
+1.670270 -2.983784 1.318919 0.021635 -0.024012 0.024826 
+0.020485 -0.022328 0.022985 0.013449 0.000204 0.008898 
+-0.001347 0.003714 0.000516 -0.002924 0.005875 -0.006680 
+-0.004323 0.008028 0.000793 0.003866 0.007731 -0.003866 
+-0.001043 0.001533 -0.001051 -0.000724 -0.000078 0.002076 
+-0.003974 -0.004478 0.004158 0.002372 -0.004816 -0.000415 
+0.003408 -0.003551 0.000105 0.000369 -0.000470 0.000238 
+-0.004700 0.003477 0.002369 -0.004724 -0.003357 0.000871 
+-0.006973 -0.000911 0.003027 -0.002391 0.000392 0.000298 
+0.000901 -0.000250 -0.000300 0.001389 0.002435 -0.000352 
+-0.000985 0.002232 -0.001226 -0.002685 0.001181 -0.001584 
+0.004418 0.004134 -0.003346 0.002889 0.004715 0.000161 
+-0.002230 -0.000038 0.006312 -0.001192 0.002228 0.005734 
+-0.000469 0.000547 0.000156 -0.001086 -0.000934 -0.000808 
+0.001708 0.001462 -0.005123 0.002167 0.002206 0.000523 
+0.003222 -0.000394 -0.002819 0.001147 0.000347 -0.001814 
+-0.000351 -0.000661 0.000577 -0.004088 -0.000467 0.002204 
+-0.004735 -0.000379 0.001808 -0.002439 -0.002515 0.000229 
+0.000690 -0.002634 0.001528 0.000237 -0.003865 0.002543 
+-0.002598 -0.003051 -0.001113 0.000765 0.001012 0.001947 
+0.002428 0.004812 -0.007110 -0.011073 -0.026586 -0.003885 
+-1.445000 -4.115000 -0.225000 -1.340425 -4.026596 -0.218085 
+0.001851 -0.025128 0.001003 0.013164 0.005577 -0.010008 
+-0.003735 0.004335 0.003846 -0.000644 0.007356 0.000983 
+0.000049 -0.000933 -0.000815 -0.004307 0.001547 -0.000748 
+-0.001726 0.001675 0.000522 0.001743 -0.001370 -0.001053 
+0.004038 -0.003833 -0.002602 0.002326 -0.003171 -0.002541 
+0.005593 0.001349 0.000900 -0.000559 0.001396 -0.001653 
+-0.001008 0.000504 -0.003984 -0.000640 0.003664 -0.003994 
+-0.001704 0.003616 -0.002675 -0.001374 0.001033 -0.002848 
+0.000067 -0.001045 -0.002134 -0.000514 -0.001935 -0.000294 
+0.000375 -0.002376 -0.000126 -0.001018 -0.005328 0.000178 
+-0.000057 0.000060 -0.000333 0.001809 -0.006745 0.000531 
+-0.006486 -0.005013 -0.003540 -0.006473 -0.000313 0.002871 
+-0.011480 -0.002220 0.004721 -0.005964 0.007918 0.013334 
+-0.001766 0.023699 0.008686 0.002649 0.012571 0.010407 
+0.012966 -0.007812 0.003055 0.014391 -0.013548 0.001337 
+0.010837 -0.012402 0.001368 0.005890 -0.011195 0.005516 
+0.003966 -0.007879 0.008601 0.004652 -0.002109 0.000239 
+0.001961 -0.002970 0.001543 0.000645 -0.000626 -0.000428 
+-0.002025 0.005716 -0.005572 0.000257 0.011456 -0.000613 
+-0.000333 0.002267 -0.001700 -0.000052 0.002255 0.006216 
+0.000189 0.001514 0.004649 -0.000149 -0.000375 0.003142 
+-0.000511 -0.001514 -0.002254 0.000655 -0.002790 -0.002241 
+0.000706 -0.001449 -0.000610 -0.001945 0.000815 0.005586 
+-0.007855 0.003155 0.005907 -0.004310 0.003000 -0.001500 
+-0.000172 -0.000931 -0.002017 0.003181 -0.002151 -0.004489 
+0.004653 0.001113 -0.002383 -0.000209 0.000586 0.000180 
+0.000797 -0.001461 0.001628 0.000503 -0.001481 -0.001034 
+0.000169 0.000847 -0.004104 -0.000214 0.000201 0.000665 
+-0.007339 0.000383 0.004577 -0.005087 -0.010353 0.003511 
+-0.009793 -0.003557 0.007158 -0.003589 -0.003077 0.002048 
+-0.001835 0.000367 0.000153 -0.001756 -0.000488 0.001985 
+-0.001227 -0.002026 0.003135 -0.001946 -0.000157 0.001600 
+0.002182 0.001843 0.000008 0.002412 0.002177 0.001348 
+-0.002815 0.000035 0.000837 -0.002729 -0.000867 0.005015 
+-0.001400 -0.001490 0.002773 -0.000084 -0.001789 0.000626 
+0.000061 0.000442 -0.000129 -0.002248 0.001508 -0.001525 
+0.001980 0.007589 -0.000514 -0.013312 -0.013005 -0.002879 
+-1.680723 -3.662651 0.036145 -1.683230 -3.881988 -0.006211 
+-0.005741 -0.021133 0.000557 0.010813 0.006267 -0.000062 
+0.012781 0.001363 0.006026 0.006592 0.013402 0.001222 
+0.000520 0.000211 -0.000068 -0.001293 0.000834 -0.001373 
+0.001199 0.002422 -0.001523 0.004058 -0.001646 -0.001557 
+0.005299 -0.005618 -0.002379 0.007383 -0.001913 -0.001757 
+0.005687 -0.000129 0.000983 0.001552 0.005191 -0.000955 
+-0.002943 0.003101 -0.000928 -0.001498 -0.001092 -0.002269 
+-0.004331 0.001075 -0.002605 -0.002747 0.002296 -0.003575 
+-0.001403 -0.001024 -0.001896 -0.003292 0.000956 0.001035 
+0.001899 -0.004435 0.003825 -0.002555 -0.000134 0.002572 
+-0.000446 -0.002284 0.005125 -0.002992 -0.008740 0.000551 
+-0.001008 0.001209 0.001393 -0.011799 0.002810 -0.000562 
+-0.007448 0.015867 0.007222 0.002667 0.005722 0.013487 
+0.013785 -0.000328 0.005391 0.019079 -0.010491 0.000381 
+0.015250 -0.010558 0.001281 0.009227 -0.006935 0.000214 
+-0.000545 -0.008940 0.004194 0.000852 -0.004435 0.009652 
+0.013003 0.012158 0.004931 -0.012349 0.009163 -0.006020 
+-0.008373 0.026405 0.002805 0.003405 0.013557 0.002774 
+0.001260 0.002878 0.000929 0.002895 0.000570 0.000257 
+0.004579 -0.001665 -0.002031 0.000914 0.000080 0.002476 
+0.000308 -0.002018 0.001726 -0.004394 0.000815 0.000486 
+0.000700 0.001983 -0.005619 0.002543 0.001881 -0.007708 
+0.000537 -0.002282 -0.002793 -0.007970 0.001292 -0.001867 
+-0.006400 -0.000762 0.001485 0.000903 0.002740 -0.000432 
+0.000079 0.005515 -0.007210 0.004571 -0.000277 -0.007620 
+0.000404 -0.001352 -0.004051 -0.000973 -0.005350 0.000400 
+-0.000984 -0.005280 0.001201 -0.001778 -0.000603 0.001607 
+-0.001543 0.000305 -0.001575 -0.001538 0.000492 -0.002076 
+0.000081 0.002205 0.000485 0.000443 0.003357 0.003452 
+-0.001170 0.000878 0.004582 -0.001001 -0.002243 0.002451 
+-0.000180 -0.003346 -0.000237 0.000372 -0.001420 -0.002538 
+0.000682 0.000382 -0.002134 0.000048 0.000192 0.000324 
+-0.003870 0.003539 0.001552 0.002539 0.003539 0.002309 
+-0.002032 -0.000109 0.003129 -0.001164 0.000485 0.001225 
+0.002668 0.002786 -0.002253 0.004839 0.001561 -0.004956 
+-0.000276 0.002570 -0.004669 -0.001316 0.001578 -0.000686 
+0.003945 0.008115 -0.002242 -0.006562 -0.001410 -0.000281 
+-0.023809 -0.008675 0.001268 -0.019219 -0.031901 0.003981 
+-0.011351 -0.016953 -0.002702 0.003592 0.001618 -0.000322 
+0.013547 0.017449 -0.006340 0.002369 0.007678 0.008158 
+0.001699 0.002513 0.002944 -0.000081 -0.003710 0.002823 
+0.002284 0.002198 -0.000423 0.006032 0.005183 -0.000683 
+0.004052 -0.000963 0.001229 0.002041 -0.000517 0.000626 
+-0.003017 -0.002883 0.003098 -0.001660 -0.001243 -0.000831 
+-0.002445 0.000412 -0.000779 0.001765 -0.001323 -0.001539 
+0.003555 -0.002393 -0.001998 0.000606 0.000303 -0.001212 
+-0.004243 -0.000489 -0.000356 -0.005112 -0.004481 0.000803 
+-0.001146 -0.006190 0.003227 -0.001667 -0.004135 0.003790 
+-0.001276 -0.004344 0.000571 -0.000831 -0.003789 -0.000051 
+-0.006860 0.001351 -0.000208 -0.005101 0.006187 0.005873 
+0.004531 -0.000420 0.003056 0.018203 -0.009199 -0.003878 
+0.021423 -0.019831 -0.011628 0.016422 -0.022425 -0.008301 
+0.013471 -0.008233 -0.001228 0.003096 -0.003734 0.003569 
+-0.008905 -0.010759 -0.005141 -0.018384 -0.029056 0.018234 
+-0.019957 -0.019749 0.023677 -0.017614 -0.010648 0.012362 
+-0.002971 0.000090 -0.002893 -0.003604 0.027433 -0.001899 
+0.000938 0.005250 -0.003683 -0.000983 -0.008921 -0.004261 
+-0.003302 -0.000447 -0.002940 -0.001817 0.000284 -0.001954 
+0.000283 -0.000066 -0.002473 -0.001336 0.001060 -0.005047 
+0.001896 0.005129 -0.003184 0.004212 0.003395 -0.002293 
+0.001227 0.000821 -0.000192 -0.002419 -0.001393 -0.000106 
+0.000558 -0.000162 -0.000165 0.001691 -0.000252 -0.004432 
+0.000170 -0.000147 -0.003286 -0.002984 -0.000618 -0.001651 
+-0.000088 -0.000850 -0.002006 -0.003733 -0.004978 -0.000931 
+-0.003415 -0.000605 -0.001756 0.000075 0.000950 -0.004018 
+0.002032 0.001472 -0.004639 0.002152 0.000495 -0.002797 
+0.003120 -0.000094 -0.000117 0.004180 0.001223 0.001478 
+0.004262 0.000946 -0.001419 0.000099 -0.002124 -0.003584 
+-0.002206 -0.001713 -0.002063 -0.000506 -0.000166 -0.000410 
+0.002401 -0.000805 0.000528 0.003740 -0.000573 0.000573 
+0.001558 -0.002110 -0.000887 -0.000066 -0.000346 -0.001465 
+-0.000024 0.000925 -0.005880 0.003720 0.005977 -0.004236 
+-0.001043 0.001141 -0.000738 -0.001523 -0.001490 0.001196 
+0.001676 0.002970 0.000407 -0.000850 0.005223 -0.003885 
+0.003346 0.008603 0.003346 0.000824 0.006970 0.000860 
+-0.012187 -0.007563 0.005501 -0.007963 -0.018778 -0.003169 
+-0.011382 -0.012948 -0.000589 -0.001045 -0.003226 0.000264 
+0.006600 0.008596 -0.006401 0.005545 0.014636 0.002818 
+0.001072 0.005043 0.000693 -0.003724 -0.004909 0.004565 
+-0.001809 -0.004906 0.002606 0.002042 0.000490 0.000424 
+0.000000 0.002500 -0.000234 -0.002185 -0.000840 0.002878 
+-0.005057 -0.008060 0.001896 -0.004861 -0.008916 0.001188 
+-0.002280 -0.002318 0.000409 0.003917 0.003349 -0.000670 
+-0.001988 0.003574 -0.000781 0.003095 0.002738 -0.000950 
+-0.004112 0.005080 -0.002696 0.000363 0.000773 -0.001207 
+-0.002692 -0.002917 0.000485 -0.001857 -0.003991 -0.001985 
+-0.003610 -0.009153 0.003480 -0.004439 -0.003145 0.006166 
+0.003598 -0.000559 0.003957 0.014983 -0.011599 -0.001358 
+2.836735 -2.275510 -0.862245 2.932489 -2.987342 -0.970464 
+2.533058 -2.702479 -0.979339 1.629268 -2.360976 -0.936585 
+0.008700 -0.012521 -0.003712 -0.005807 -0.005731 -0.003050 
+-0.019104 -0.021172 0.008827 -1.870647 -3.661691 1.343284 
+-2.324786 -4.478632 0.726496 -2.396313 -4.894009 0.304147 
+-1.717647 -4.223529 -0.152941 -0.007241 -0.002412 0.000432 
+0.007174 0.003518 -0.006698 0.003615 0.003027 -0.001560 
+-0.001461 0.000078 -0.002572 -0.001496 -0.001282 -0.002595 
+0.003708 0.002846 -0.005262 0.000459 0.002986 -0.003320 
+-0.004344 0.001933 -0.001751 -0.003696 0.002091 0.001582 
+-0.000264 -0.000228 0.000006 0.002174 -0.001751 -0.001308 
+0.003887 0.000328 -0.001805 0.001288 0.002697 -0.001179 
+-0.004980 -0.002527 -0.003328 -0.006601 0.000847 -0.002141 
+-0.008145 -0.003356 -0.001124 -0.000200 -0.002687 -0.001708 
+-0.002605 0.001182 -0.005085 -0.002629 -0.000327 -0.004168 
+-0.004801 -0.001463 -0.002058 -0.004721 -0.001841 0.002588 
+-0.003700 0.000065 0.002272 -0.002949 -0.000642 0.000164 
+-0.000092 -0.000490 -0.001132 -0.000484 0.004964 -0.000605 
+-0.003147 0.006313 -0.001750 -0.000915 0.003658 -0.003594 
+0.000202 0.000787 -0.000646 -0.000569 -0.000940 -0.000701 
+0.005395 -0.002231 -0.003320 0.006140 -0.000398 -0.003704 
+0.002935 0.000089 -0.004625 -0.001514 0.006347 -0.000408 
+-0.001031 0.004550 -0.002133 -0.000535 0.001618 -0.000590 
+0.000482 0.001217 0.000066 -0.002633 0.001445 -0.006677 
+0.002342 0.004790 0.001249 -0.000526 0.003956 -0.001644 
+-0.008311 0.003436 0.000935 -0.009007 -0.000274 0.005827 
+-0.007274 -0.004095 0.000584 -0.002845 -0.004361 0.001731 
+0.000257 -0.001096 0.000031 0.002223 0.007351 0.003626 
+0.004306 0.007425 0.000507 -0.003358 0.001809 0.004553 
+-0.003088 -0.006829 0.005601 0.000722 -0.006261 0.003922 
+0.000577 -0.003999 0.000922 0.000740 -0.003060 -0.002911 
+0.002391 -0.002353 0.000588 -0.001282 -0.004581 -0.004228 
+-0.001927 -0.004213 -0.002481 0.000094 0.000852 0.000503 
+-0.001899 0.002279 0.003500 0.000184 -0.000319 0.001725 
+-0.001557 -0.000239 0.000653 -0.004932 -0.007507 0.000321 
+-0.009175 -0.008275 0.001675 -0.003917 -0.012959 -0.003041 
+0.001542 -0.000903 -0.000326 0.007038 -0.001600 0.000496 
+0.021548 -0.016218 -0.001370 3.347222 -2.930556 -0.888889 
+3.333333 -3.412371 -1.185567 3.085246 -3.039344 -1.213115 
+2.692000 -2.548000 -1.196000 0.020078 -0.020123 -0.007747 
+0.007820 -0.008847 -0.003888 -0.016618 -0.016045 0.000846 
+-0.020565 -0.019386 0.015648 -2.492228 -3.709845 1.098446 
+-2.708475 -4.972881 0.054237 -2.543081 -5.237598 -0.464752 
+-2.091623 -4.756545 -0.565445 -1.525548 -3.656934 -0.441606 
+-0.002384 -0.010530 -0.000762 -0.004085 0.008847 -0.003196 
+0.001547 0.001468 -0.000241 -0.002466 -0.001065 -0.000010 
+-0.002323 0.006376 -0.001704 0.000137 0.004321 -0.004287 
+-0.000605 0.000021 -0.000930 -0.000748 -0.001546 -0.000884 
+0.004593 0.001854 -0.002915 0.005593 0.004270 -0.005175 
+0.002931 0.004236 -0.003360 -0.000133 0.003137 -0.000293 
+-0.004063 0.000257 -0.001994 -0.004850 -0.004525 -0.002934 
+-0.005730 -0.006980 -0.002311 -0.001975 -0.003928 -0.005829 
+0.001048 0.004207 -0.009218 -0.000919 0.007805 -0.002493 
+-0.002219 -0.002364 -0.000574 -0.006454 -0.003067 -0.001864 
+-0.002334 -0.000026 -0.000344 -0.001685 -0.000923 0.003569 
+0.000959 0.003255 -0.000637 -0.002244 0.005710 -0.001108 
+-0.002886 0.001553 -0.002257 -0.001846 -0.002294 -0.005616 
+-0.001324 0.002039 -0.003527 -0.001454 0.001304 -0.003421 
+0.000001 0.003930 -0.002613 0.002562 0.002443 -0.006286 
+0.005932 0.007288 -0.000339 0.000833 0.002791 0.002231 
+-0.001337 0.002707 0.000625 0.000237 0.001795 -0.000301 
+0.000084 -0.001363 -0.000833 -0.003322 -0.000967 -0.005390 
+0.006747 0.004781 -0.002685 0.007482 0.007201 -0.005486 
+0.003813 0.010929 -0.003974 -0.002823 0.005963 -0.000892 
+-0.005150 -0.002208 -0.001258 -0.002235 -0.004512 0.008581 
+0.000895 -0.004973 0.003240 0.003804 0.002511 -0.003947 
+-0.003218 0.006187 0.002226 -0.005937 0.005649 0.002882 
+-0.002005 -0.004778 0.007724 -0.000287 -0.005936 -0.001139 
+0.000088 -0.005107 -0.002704 0.003596 -0.002766 -0.004149 
+0.001001 -0.002441 -0.000188 -0.000971 -0.000362 -0.007214 
+-0.000336 0.002017 -0.008049 -0.001941 0.000777 -0.005462 
+-0.001158 0.001990 -0.001055 0.000629 -0.000137 0.002660 
+-0.004360 -0.003532 0.003090 -0.003762 -0.005716 0.001447 
+-0.012152 -0.002154 -0.008523 -0.005043 -0.001509 -0.012253 
+0.005183 -0.006019 -0.005775 0.021424 -0.017313 0.000841 
+3.303030 -3.316017 -0.238095 3.782895 -3.628289 -0.773026 
+3.472222 -3.469136 -1.160494 2.814815 -3.151852 -1.325926 
+1.919540 -2.793103 -1.304598 0.013951 -0.013786 -0.007800 
+-0.000666 -0.003826 0.009315 -0.009601 -0.006040 -0.003177 
+-0.030519 -0.026711 0.004269 -3.421429 -4.707143 0.657143 
+-2.972332 -5.379447 -0.529644 -2.784264 -5.345178 -0.954315 
+-2.575980 -4.931373 -0.887255 -2.135714 -3.864286 -0.507143 
+-0.004266 -0.020171 0.002340 -0.001726 -0.001961 -0.001851 
+0.000575 0.004113 0.001786 -0.001436 -0.001238 0.001749 
+-0.003403 0.000290 -0.002419 -0.000569 0.003601 -0.005003 
+0.001909 0.001650 -0.006148 0.002623 0.002633 -0.002655 
+0.003131 -0.002384 -0.002270 0.000396 -0.000712 0.000524 
+-0.000653 0.000704 0.000330 0.000093 0.001465 0.000535 
+-0.001727 -0.000498 -0.000221 -0.003147 0.000821 -0.005336 
+-0.002079 -0.000907 -0.004779 0.002698 -0.002667 -0.005333 
+0.003252 0.006333 -0.009284 0.004141 0.003667 -0.012294 
+-0.004018 -0.000625 -0.006875 -0.003184 -0.002106 -0.004242 
+-0.008005 0.000197 0.003062 0.000190 0.001313 0.000880 
+-0.000286 0.001404 0.001619 -0.000192 0.001471 0.002769 
+0.000110 0.001212 0.001051 -0.001419 0.002384 -0.001646 
+-0.002027 0.001949 -0.002616 -0.000050 -0.002564 -0.001390 
+0.001533 -0.001817 0.002660 0.001998 0.004005 -0.001019 
+0.002837 -0.002719 -0.000329 -0.002323 -0.002202 -0.003814 
+-0.003428 0.001454 -0.002390 -0.003372 0.002723 0.002074 
+-0.000167 -0.000002 -0.000798 0.007890 0.004451 -0.006661 
+0.004403 0.004648 -0.003145 -0.001697 0.001712 -0.001625 
+0.002126 0.002061 -0.003942 0.000790 0.001790 -0.000537 
+0.001912 -0.002887 0.000942 0.005214 -0.003145 0.003594 
+0.000824 -0.002439 0.004800 -0.000540 0.001929 -0.000663 
+0.000516 0.006346 0.000413 -0.008363 0.003619 0.004896 
+-0.001872 0.002122 0.005365 -0.001680 -0.002247 -0.002698 
+-0.004764 -0.003925 -0.003542 -0.005403 -0.002319 -0.001508 
+-0.002864 0.000801 -0.001404 -0.001516 0.001729 -0.001018 
+0.001657 0.000285 -0.003261 0.001430 -0.001385 -0.005913 
+0.001280 -0.001717 -0.004731 -0.000389 0.002743 0.001568 
+-0.005530 0.000568 -0.001705 -0.007772 0.003622 0.001463 
+-0.006480 0.002669 -0.000028 0.007175 -0.003576 0.002331 
+2.058511 -2.547872 0.569149 3.323771 -3.250000 0.446721 
+3.869565 -3.538461 0.040134 3.936877 -3.511628 -0.375415 
+3.468880 -3.323652 -0.804979 2.314103 -3.019231 -1.262820 
+0.012894 -0.015920 -0.017976 0.005992 -0.005288 -0.000945 
+0.004809 0.012921 0.007449 0.003541 0.008731 -0.004613 
+-0.013572 -0.009335 0.012022 -0.038252 -0.007676 0.007427 
+-3.666667 -6.207207 -0.837838 -3.511628 -5.423256 -0.958140 
+-3.244361 -4.646616 -0.815789 -2.810345 -3.456897 -0.461207 
+-0.021300 -0.022768 -0.003167 -0.012193 -0.009632 -0.006364 
+0.003320 0.008909 -0.006859 0.009645 0.007373 -0.007445 
+0.002130 -0.000501 -0.002462 -0.000147 -0.001471 0.000882 
+0.002725 0.001935 0.000649 0.004327 0.000659 -0.000833 
+0.000595 -0.000132 -0.000252 0.000995 0.001576 0.000828 
+-0.001151 0.004044 0.001166 0.003357 0.005033 0.000479 
+0.001319 -0.000829 -0.001557 0.000698 -0.001462 -0.005097 
+-0.000106 -0.001494 -0.003841 0.000330 0.006563 -0.002097 
+-0.000133 0.004782 0.000350 -0.002162 0.001776 0.000849 
+-0.001917 -0.000364 0.001601 -0.002202 -0.002357 0.001181 
+-0.006517 0.000081 -0.001477 0.000333 -0.000538 0.000006 
+0.002675 -0.004015 0.003170 0.005660 -0.001987 0.003011 
+-0.000913 -0.000580 0.001826 -0.003074 0.002281 0.000337 
+-0.005252 0.001256 -0.002076 -0.003713 0.001553 -0.000237 
+0.000463 0.000621 -0.001482 0.005203 -0.000307 -0.004608 
+-0.000494 -0.003244 -0.004929 -0.013044 0.000097 -0.004299 
+-0.011080 0.007782 0.007469 -0.005212 0.009981 -0.001941 
+0.013763 0.001325 0.005320 0.033038 -0.006424 0.017000 
+0.002007 0.005106 -0.001313 0.000000 0.006111 0.002569 
+0.000978 0.004794 0.005087 0.002185 0.000258 0.001253 
+0.004139 0.001686 0.001944 0.005705 0.002313 0.001949 
+0.004139 0.000268 0.001397 -0.000703 -0.001765 0.002422 
+-0.002286 0.002271 0.002910 -0.001407 0.002765 0.002012 
+-0.002037 0.002240 0.000518 -0.002165 0.005436 -0.002819 
+-0.002135 0.002401 -0.004414 -0.004944 0.000076 -0.002283 
+-0.005447 0.000661 0.000253 -0.001566 0.001708 0.002404 
+-0.000363 0.001965 -0.000818 0.000979 -0.001990 -0.001648 
+0.002810 -0.001628 -0.003885 -0.000570 0.003964 -0.001645 
+-0.001631 0.001604 0.000005 0.003270 -0.001623 0.006419 
+0.014667 -0.009705 0.013341 2.326087 -3.252174 1.773913 
+3.955782 -3.431973 1.380952 4.425076 -3.278287 0.859327 
+4.353333 -2.953333 0.356667 4.027149 -2.538461 -0.104072 
+0.028697 -0.024004 -0.003854 0.014623 -0.011041 -0.003796 
+-0.001354 -0.006381 -0.001388 -0.001776 -0.003723 0.000478 
+0.005174 -0.000757 0.002395 0.004048 -0.004034 0.000587 
+-0.004619 0.005726 -0.002466 -0.019186 -0.015560 0.011162 
+-0.052394 -0.062070 -0.002756 -3.863636 -5.527273 0.272727 
+-3.336493 -4.227488 -0.208531 -3.109434 -3.433962 -0.426415 
+-2.731707 -2.691057 -0.369919 -0.017027 -0.021676 -0.002775 
+-0.005959 -0.007564 -0.008856 -0.000448 0.011314 -0.003024 
+0.008543 0.004790 -0.008085 0.001778 0.000599 -0.002071 
+0.003650 -0.001186 0.000520 0.005495 0.000599 -0.000695 
+0.002495 0.001189 -0.003162 0.000523 0.003313 -0.004603 
+-0.003905 0.006138 -0.002044 0.004092 0.007379 0.000013 
+-0.001329 0.002066 0.000015 0.000453 -0.000308 -0.001664 
+0.000263 -0.001187 -0.003357 -0.001510 -0.000355 -0.000059 
+-0.006150 0.002679 0.002240 -0.007605 0.002778 0.003780 
+-0.002754 -0.000466 0.000678 -0.000189 -0.001767 -0.006141 
+0.000937 -0.001684 -0.005341 -0.000278 0.000625 0.000853 
+0.001427 -0.001569 0.003627 0.001061 -0.000907 0.005240 
+0.000878 -0.000946 0.003876 -0.001142 0.001739 0.003970 
+0.000087 0.003952 0.000321 0.000452 0.002150 -0.001480 
+-0.001510 0.000741 -0.000302 -0.001480 0.000009 -0.001730 
+-0.011865 0.004557 0.000943 -0.021472 0.009257 0.002405 
+-0.010640 0.007878 0.004461 0.008557 -0.001000 0.001843 
+0.028873 -0.004112 0.015633 4.639344 0.005464 1.934426 
+-0.001202 -0.000432 0.000594 -0.003518 -0.001635 0.005339 
+0.000176 -0.003370 0.004093 0.000531 -0.000227 0.000461 
+-0.000223 0.002038 -0.001624 -0.000710 0.002716 -0.001918 
+0.001015 0.004682 -0.001976 0.002434 0.009191 -0.004302 
+0.007490 0.005815 -0.000479 0.001256 0.008588 -0.001141 
+0.001448 0.006833 -0.002306 0.003505 0.006212 -0.004301 
+0.002592 0.004760 -0.001205 -0.001661 0.004052 -0.000128 
+-0.004624 0.004693 0.000092 -0.003079 0.005283 -0.001050 
+0.000040 0.003996 -0.003541 0.002384 0.002242 -0.004490 
+0.000155 -0.001687 -0.003777 -0.001222 -0.000578 -0.004225 
+0.002029 -0.002688 0.003797 0.014908 -0.016468 0.012561 
+2.083682 -3.016737 2.196653 3.841424 -3.388350 2.110032 
+4.823708 -3.462006 1.820669 4.996403 -3.374101 1.424460 
+4.773684 -3.168421 0.915789 4.474576 -2.661017 0.338983 
+0.032632 -0.020699 0.000278 0.019640 -0.000241 -0.000577 
+0.002777 -0.001666 -0.000885 -0.003238 -0.008967 -0.001622 
+-0.000078 -0.011965 -0.000779 0.001562 -0.005488 0.002076 
+-0.001163 -0.004875 -0.011967 -0.015189 -0.013031 -0.009658 
+-0.013249 -0.010245 -0.026209 -0.020125 -0.051838 -0.007171 
+-3.267974 -4.150327 -0.483660 -3.422594 -3.460251 -0.251046 
+-3.362264 -3.075472 0.075472 -2.940171 -2.760684 0.217949 
+-0.022171 -0.021862 -0.001867 -0.008573 -0.005937 -0.007283 
+0.011405 0.003564 -0.009266 0.002116 0.005017 -0.003064 
+0.000230 0.000139 -0.000299 0.001461 0.002829 -0.000137 
+-0.001067 0.006279 -0.003817 0.000154 0.002974 -0.004908 
+-0.002201 -0.003888 -0.001243 0.000192 -0.000438 0.000552 
+0.000131 0.002464 0.001194 -0.000826 0.002769 0.001022 
+-0.001037 -0.000277 0.000833 -0.000775 -0.000471 0.000529 
+-0.000369 0.000466 0.001485 -0.000704 0.001647 0.003434 
+-0.001871 0.002156 0.003634 -0.003983 0.003142 0.000679 
+-0.001679 0.001522 0.001306 0.002850 0.002755 -0.001676 
+-0.000680 0.002362 -0.003003 0.002119 0.000085 -0.001187 
+-0.000579 0.002795 0.000256 -0.000265 0.000668 0.000989 
+0.000736 0.001412 0.001524 0.003278 -0.000159 0.001525 
+0.002648 -0.000646 -0.001231 -0.001655 -0.001524 -0.002181 
+-0.011311 0.000110 0.000769 -0.005912 0.006352 -0.000651 
+0.000146 0.001854 -0.003434 0.009274 -0.002130 -0.006689 
+0.020597 0.000957 -0.000690 0.029085 -0.004324 0.006076 
+-0.004187 -0.004764 0.002306 -0.001228 -0.001606 0.004935 
+-0.001986 -0.002258 0.002842 -0.001565 -0.000713 -0.000012 
+-0.001424 0.000497 -0.001592 -0.000751 0.000347 -0.003750 
+-0.003213 0.001789 -0.004664 -0.003928 0.005695 -0.006919 
+0.000822 0.005349 -0.007678 0.000187 0.001780 -0.001721 
+-0.003143 -0.000407 -0.000039 -0.005778 -0.001210 -0.003206 
+-0.006487 -0.000108 -0.003437 -0.004722 0.000186 -0.001420 
+-0.003757 0.000520 -0.000813 -0.004095 0.001075 -0.001841 
+-0.005544 0.000101 -0.002319 -0.003003 0.002775 -0.004616 
+-0.003161 0.000703 -0.005374 0.004708 0.003084 0.000260 
+0.014282 -0.015195 0.015730 2.037037 -2.417989 2.222222 
+2.899160 -2.861345 2.340336 4.141667 -3.220833 2.258333 
+5.102703 -3.556757 1.967568 5.601770 -3.663717 1.362832 
+0.055290 -0.028454 0.009914 0.044847 -0.010406 0.002847 
+0.025033 -0.000456 -0.003406 0.010256 0.001389 -0.001940 
+0.007687 -0.001915 -0.003100 0.006267 -0.009497 -0.003870 
+0.004083 -0.012698 0.000627 -0.000981 -0.004063 0.004136 
+0.001012 -0.001707 -0.001513 -0.002711 -0.001677 -0.000903 
+-0.007570 -0.011327 -0.003771 -0.011574 -0.003826 -0.023053 
+-0.033013 -0.044834 -0.015186 -3.910714 -4.071429 -0.309524 
+-3.879518 -3.658634 0.361446 -3.556364 -3.203636 0.589091 
+-2.843621 -2.407408 0.370370 -0.017010 -0.014952 0.000894 
+-0.002386 -0.002256 0.001751 0.008405 0.000223 -0.001176 
+0.000816 0.002386 0.001644 -0.003048 0.001766 0.001501 
+-0.001051 0.007073 -0.002461 0.004679 0.008127 -0.003015 
+0.003382 0.003034 -0.000734 0.001513 -0.001034 -0.000345 
+0.000976 0.002000 0.001122 0.002928 0.004953 0.002598 
+0.001372 0.003690 0.004321 -0.000471 0.002411 0.002853 
+-0.000651 -0.001269 0.000770 0.000581 -0.004250 0.000224 
+0.000346 -0.004615 0.003115 -0.004066 -0.002284 0.000873 
+-0.005335 0.003087 -0.002514 0.001119 0.006577 -0.002782 
+0.005475 0.003117 -0.005615 -0.000764 0.000255 -0.000446 
+-0.000039 -0.000158 -0.000023 -0.002263 -0.001875 0.000750 
+0.000509 -0.000076 0.002715 0.001763 0.005882 0.001171 
+-0.002359 0.005331 -0.000104 -0.004113 0.000998 -0.004931 
+-0.003902 0.000673 -0.000641 -0.002246 -0.009104 0.001416 
+0.001507 -0.001599 -0.000101 -0.001282 0.001856 0.000587 
+-0.004953 0.000803 -0.002089 0.000774 -0.005298 -0.005265 
+0.002505 -0.004313 -0.002365 0.001602 -0.004760 -0.000113 
+0.002775 -0.004900 -0.000075 0.001537 -0.001083 0.003306 
+-0.002308 -0.001987 0.003873 -0.004242 0.001628 -0.000218 
+-0.002741 -0.000350 -0.003143 0.004093 0.004124 0.001426 
+0.005193 0.006186 -0.000302 0.002614 0.003604 -0.002072 
+-0.002902 -0.000697 -0.003030 -0.003882 -0.003157 -0.006254 
+-0.004547 -0.002155 -0.006375 -0.006171 -0.001560 -0.002553 
+-0.001568 -0.001800 -0.003162 -0.002739 -0.001174 -0.002115 
+-0.004683 -0.003855 0.000141 -0.000784 -0.002853 -0.003325 
+-0.000075 0.001015 -0.007633 0.008947 -0.007780 0.001540 
+0.018616 -0.009577 0.013090 0.021856 -0.018738 0.014411 
+2.659864 -2.006803 2.680272 0.036163 -0.028154 0.029044 
+0.047451 -0.023345 0.023605 0.028102 0.001451 0.002723 
+0.010814 0.002869 -0.006688 0.009812 0.017146 -0.007640 
+0.005156 0.012710 -0.002542 0.002591 -0.000133 -0.000561 
+-0.000731 -0.005606 0.002374 -0.000669 -0.004499 -0.001223 
+-0.001716 -0.006291 -0.000235 -0.009369 -0.006290 -0.001632 
+-0.011208 -0.004719 -0.000504 -0.007850 -0.000236 0.000165 
+-0.007722 0.000205 0.000019 -0.011152 -0.005704 0.004308 
+-0.021076 -0.025434 -0.000763 -0.039577 -0.049428 -0.001427 
+-3.963351 -4.335079 0.513089 -3.985559 -3.657040 0.866426 
+-3.827119 -2.989830 0.942373 -3.258065 -2.112903 0.766129 
+-0.015940 -0.015990 0.006249 -0.002657 -0.003851 0.000762 
+0.002484 -0.000022 -0.000776 -0.000083 -0.000952 -0.000436 
+0.000991 0.000965 0.003678 0.003484 0.006260 0.001519 
+0.003267 0.007719 -0.002279 -0.000132 0.001010 -0.001231 
+0.000085 -0.005897 -0.000085 -0.000503 -0.001318 -0.000830 
+0.003298 0.003493 -0.002730 0.000199 0.002316 -0.005599 
+0.000693 0.002683 -0.002031 0.002340 -0.003014 0.000289 
+0.002492 -0.005097 0.001605 0.000213 -0.003475 0.002428 
+-0.000501 -0.001631 0.003388 0.000095 -0.000119 0.002090 
+-0.002118 0.004651 0.000265 0.000234 0.000800 0.000386 
+-0.000569 0.002276 0.000000 0.002232 0.000930 -0.001429 
+0.005391 0.002578 -0.000078 0.001000 0.001673 -0.007803 
+-0.004540 0.001433 -0.003406 -0.003826 0.001324 -0.004187 
+-0.002350 -0.004422 -0.001293 0.001207 -0.010429 -0.001241 
+0.003225 -0.007678 -0.000806 -0.000508 0.000645 -0.000020 
+-0.005743 0.006318 -0.004495 -0.011020 0.000897 -0.007949 
+-0.000593 -0.006210 -0.000698 0.001600 -0.008179 0.003678 
+0.002910 -0.006410 0.004043 0.001917 -0.002707 0.001917 
+-0.000440 0.001292 -0.000197 0.002250 0.004518 0.000860 
+0.004068 0.000593 0.000232 0.002422 -0.002198 -0.000181 
+0.001590 -0.001500 -0.000215 -0.000206 -0.000567 0.000176 
+-0.003565 -0.000063 -0.001147 -0.004377 -0.002784 0.001210 
+-0.005049 -0.006916 -0.002230 -0.004533 -0.007758 -0.002028 
+-0.005210 -0.003543 0.001612 -0.006667 -0.004245 0.001574 
+-0.006666 -0.006324 0.001171 -0.006001 -0.003609 0.000079 
+-0.000422 0.002544 -0.004486 0.005241 -0.001311 -0.001966 
+0.005037 0.003181 -0.004547 0.004732 -0.002838 0.008933 
+0.012249 -0.000376 0.012748 0.016660 -0.002250 0.008796 
+0.020177 0.000530 0.003104 0.006278 -0.003372 0.002067 
+-0.005264 0.000648 0.000405 -0.008475 -0.001100 0.000375 
+-0.005348 -0.005467 0.007071 0.003437 0.001016 0.002241 
+0.007852 -0.004358 0.000484 0.003938 -0.003166 0.001178 
+-0.001508 -0.000461 -0.001513 -0.004006 -0.001644 -0.005278 
+-0.010468 -0.002968 -0.001120 -0.007688 -0.005935 0.005305 
+-0.008658 -0.001797 0.007351 -0.004957 -0.000248 0.003023 
+-0.003733 -0.000571 0.003074 -0.024507 -0.025914 0.007189 
+-4.380531 -3.946903 0.920354 -4.649038 -3.798077 1.120192 
+-4.794326 -3.567376 1.471631 -4.750865 -3.200692 1.695502 
+-4.301724 -2.512931 1.547414 -0.015094 -0.015047 0.015116 
+0.000949 0.006742 -0.004019 0.006257 0.006915 -0.001977 
+-0.001446 0.000778 0.003647 -0.004026 -0.002189 0.006237 
+-0.001847 -0.001944 0.003516 -0.000860 -0.000019 -0.000305 
+-0.002387 0.000613 -0.000025 -0.002526 -0.003680 -0.002105 
+0.000399 0.001181 -0.001484 0.005308 0.000488 -0.006839 
+-0.000115 0.001779 -0.006196 0.002761 0.003354 -0.002215 
+0.003414 -0.000257 -0.000311 0.002833 -0.003569 0.004461 
+-0.002535 -0.006451 0.000749 -0.008932 -0.004843 0.005927 
+-0.002505 0.003005 0.003758 -0.003472 -0.000147 -0.005121 
+0.005772 0.002517 -0.010503 -0.002992 0.001040 -0.005984 
+0.001685 -0.003683 -0.004315 0.002301 -0.001135 -0.006897 
+0.000975 0.002398 -0.008513 0.005918 -0.001024 -0.003414 
+0.001679 -0.001077 0.000863 0.000609 -0.006293 0.000162 
+-0.001956 -0.003831 0.001361 0.001852 0.002750 -0.004305 
+-0.000589 0.001087 -0.003417 -0.009726 -0.006408 0.001771 
+-0.000821 -0.008029 0.001970 0.004306 -0.008792 0.000897 
+0.002464 -0.005468 0.002688 0.001230 0.000934 0.002737 
+-0.000818 0.005404 0.004996 0.000186 0.004151 -0.002829 
+0.003510 0.000304 0.001987 0.001577 -0.002854 0.004726 
+0.002244 -0.001260 0.000082 0.003627 0.004270 0.001958 
+0.003477 0.007988 0.002108 0.001299 0.006350 -0.000625 
+-0.001055 -0.000285 0.000200 -0.000641 -0.005180 -0.001837 
+-0.002514 -0.005513 -0.001732 -0.006569 -0.005422 -0.001230 
+-0.009123 -0.006836 -0.002245 -0.008862 -0.005205 -0.000481 
+-0.004134 -0.000600 -0.000531 0.000647 0.000598 -0.000998 
+0.002673 0.005388 -0.000809 0.001703 0.007275 -0.000014 
+0.002411 0.009272 -0.002011 0.002120 0.007577 -0.003914 
+0.003966 0.001476 0.000314 0.003352 -0.003379 0.002656 
+-0.004625 -0.004048 0.002486 -0.004314 0.000730 -0.000039 
+-0.000529 -0.000104 -0.002115 0.002841 0.000763 0.001966 
+0.000323 0.001778 0.003395 -0.007550 -0.000587 0.001594 
+-0.006220 -0.008951 -0.005268 -0.005875 -0.006481 -0.007334 
+-0.006556 -0.004106 -0.003839 -0.010869 -0.000340 0.001954 
+-0.008599 0.002171 0.002904 0.001633 0.005480 -0.001283 
+0.004921 0.003943 -0.004477 -0.007693 -0.014661 0.003573 
+-0.049861 -0.042116 0.018243 -5.558558 -4.036036 1.729730 
+-5.211055 -3.572864 1.743719 -5.304688 -3.355469 2.109375 
+-5.588235 -3.315126 2.567227 -4.397590 -2.216867 1.746988 
+0.002479 0.008868 -0.000783 0.006344 0.018211 -0.002654 
+0.002569 0.003586 -0.004512 -0.006323 0.001590 0.003158 
+-0.006033 -0.004128 0.003546 -0.002853 -0.004009 0.002354 
+-0.003586 -0.004971 -0.000997 -0.003033 -0.008722 -0.002979 
+0.001653 0.000000 -0.004545 -0.001109 -0.001751 -0.003621 
+0.004755 0.001161 -0.000255 -0.000194 0.004651 0.001257 
+-0.001465 0.001766 0.002488 -0.000949 -0.001903 -0.005227 
+0.001873 -0.002030 -0.000405 -0.001274 -0.001674 0.004892 
+-0.002910 -0.000299 0.004030 0.000501 0.006029 0.000083 
+-0.001806 0.005466 -0.000119 -0.001529 0.001232 -0.000644 
+-0.001508 -0.002659 -0.001032 -0.003623 -0.003235 0.002555 
+-0.002216 -0.001460 0.001590 -0.005611 0.000522 -0.002405 
+-0.007167 0.000907 -0.002422 -0.003079 0.000559 0.000603 
+-0.001445 0.000844 -0.000938 0.001499 -0.000237 -0.000083 
+0.004691 0.001202 0.002591 0.003814 0.001852 0.002908 
+0.002662 -0.001968 0.003703 0.005998 -0.000516 -0.000636 
+0.001036 -0.000751 -0.001060 -0.002387 0.000004 0.003821 
+-0.003149 0.000319 0.004175 0.000910 0.000643 -0.001963 
+0.001473 0.002061 -0.001020 0.000597 0.000618 -0.000081 
+0.001242 -0.000579 0.001422 -0.001310 0.005314 0.001920 
+0.000732 0.000994 0.004819 -0.000269 0.003750 0.002960 
+0.004927 0.000970 0.001070 0.002629 0.000480 0.001000 
+-0.004173 -0.001389 -0.000952 -0.013568 -0.005216 0.001012 
+-0.011986 -0.007734 0.003975 -0.002513 0.001348 0.004029 
+-0.001853 0.000328 0.002049 0.004357 0.005398 0.001110 
+0.000418 0.006947 0.001373 -0.000756 0.002124 -0.000080 
+-0.000860 -0.000554 -0.000417 0.003268 -0.000444 0.001095 
+0.006436 -0.000843 0.001383 0.004171 -0.000020 0.000157 
+0.000285 0.006070 -0.004938 -0.001804 0.005817 -0.009871 
+-0.002010 0.000741 -0.003166 -0.000464 0.000060 0.000963 
+-0.004589 -0.002279 0.000761 -0.006851 -0.003295 -0.003585 
+-0.006482 0.000538 -0.008571 -0.007918 0.002579 -0.009275 
+-0.003423 -0.005703 -0.008111 0.002153 -0.010562 -0.011819 
+0.012233 0.003198 -0.008949 0.010321 0.018523 -0.003322 
+0.009061 0.011644 0.004309 -0.001147 -0.009047 -0.009631 
+-0.008730 -0.007320 -0.015378 -0.032388 -0.045805 0.013494 
+-4.750000 -3.178571 1.553571 -5.154321 -2.648148 1.895062 
+-5.297753 -2.578652 2.269663 -4.269737 -1.888158 1.697368 
+-0.008612 0.001156 0.002097 0.006317 0.004658 0.000866 
+-0.000022 0.005255 -0.002131 0.002956 0.002895 0.000308 
+-0.005791 0.005901 0.004676 0.001307 -0.000203 0.005327 
+-0.005937 -0.013460 0.002774 0.001138 0.000448 -0.005819 
+0.008011 -0.005924 -0.009064 0.006614 -0.003307 -0.004016 
+0.003399 0.000638 0.004008 -0.000876 0.001818 0.001917 
+0.003754 -0.001468 -0.000633 0.003454 -0.005865 -0.004230 
+0.004073 -0.002424 -0.010375 0.005848 0.001509 -0.003377 
+0.000147 0.000662 0.000147 -0.000735 0.001961 0.000150 
+-0.002417 0.001345 -0.001986 -0.001389 0.001823 -0.000326 
+0.000000 0.000420 0.005462 -0.004639 0.002924 -0.003910 
+-0.008711 0.003981 -0.006357 -0.001864 0.000959 -0.010712 
+0.009112 0.008146 -0.011088 0.004755 0.006201 0.000270 
+0.001778 0.000841 0.002042 -0.001787 -0.004133 0.004703 
+0.001200 0.000649 -0.000372 -0.002632 0.006392 0.000001 
+-0.000629 -0.001357 0.001257 -0.001609 -0.003461 0.001999 
+-0.005931 -0.003687 0.001512 -0.007314 -0.004353 0.002475 
+-0.002603 -0.004100 -0.002560 0.004240 0.000955 -0.000297 
+0.002887 -0.000377 -0.003196 0.002326 0.000882 -0.000317 
+-0.000680 0.001420 -0.001524 -0.001620 0.000205 -0.002137 
+-0.001224 -0.002689 0.001634 -0.003033 -0.003386 0.009766 
+-0.005903 -0.000311 0.009009 0.003065 -0.002942 0.003585 
+-0.002909 -0.003499 -0.002298 -0.007149 -0.004362 0.001392 
+-0.002027 -0.000864 0.002753 0.000691 0.000884 0.002459 
+-0.002430 0.000123 -0.000367 -0.003027 0.003575 0.003004 
+0.000814 0.003757 0.003338 0.003124 0.002409 0.001073 
+0.000893 -0.000013 0.000166 -0.002109 -0.000679 0.000044 
+-0.002788 0.001772 -0.001142 0.002621 0.005909 -0.008931 
+0.003157 0.000613 -0.013029 0.000432 -0.001070 -0.002260 
+-0.001512 0.001182 0.000031 -0.001051 0.000683 0.000370 
+-0.001250 -0.000433 0.000187 0.006693 0.008264 -0.002435 
+0.008209 0.016175 -0.001094 0.005364 0.012919 -0.001079 
+0.002494 -0.001435 -0.012857 0.011505 -0.005337 -0.034612 
+0.006546 0.012210 -0.027769 -0.003520 0.009947 -0.009441 
+-0.001039 0.000150 -0.000802 0.001751 -0.002143 -0.005289 
+-0.000677 -0.002682 -0.007091 -0.013599 -0.009611 0.006512 
+-0.042162 -0.016185 0.012759 -0.052792 -0.019963 0.026886 
+-5.133929 -1.758929 2.535714 -0.041593 -0.014691 0.013876 
+-0.016144 0.000703 -0.002431 -0.000670 -0.000426 -0.000584 
+0.012824 0.010187 -0.014143 0.008065 0.001115 0.002692 
+-0.001902 0.002214 0.004686 -0.002798 -0.002102 0.002065 
+0.001280 -0.001305 -0.000398 0.008558 0.004920 -0.001143 
+-0.000283 0.000606 0.004427 -0.002681 0.002320 0.006010 
+-0.005530 0.001397 0.001557 -0.000774 -0.001751 -0.003226 
+0.003808 -0.004293 -0.003284 0.004289 -0.003883 -0.000928 
+0.009715 0.001613 0.000263 0.001854 -0.000571 -0.000833 
+-0.002985 -0.002028 -0.001248 -0.001501 -0.001727 -0.001061 
+0.001070 -0.001184 0.000925 -0.002683 -0.003174 0.001408 
+-0.006004 0.000997 -0.005545 -0.003012 -0.005033 -0.008410 
+0.000233 -0.004975 -0.007464 0.015676 0.003415 -0.006364 
+0.003282 0.008385 0.006799 -0.000567 0.004423 0.006043 
+-0.005866 -0.002067 0.013453 -0.019735 -0.010881 0.010819 
+-0.013111 -0.006533 0.004332 -0.007628 0.003156 0.001374 
+-0.000217 0.001087 -0.000290 -0.000360 0.000725 0.000143 
+-0.001016 -0.000601 0.000223 0.002126 -0.000040 -0.000088 
+0.006394 0.000932 -0.002217 0.004578 0.002830 0.000247 
+-0.000425 -0.001533 0.000395 -0.003554 -0.002506 0.000645 
+-0.001397 -0.000074 0.000000 0.003403 0.002939 -0.001360 
+0.006079 0.000728 0.002931 0.003472 -0.004890 0.004812 
+0.002262 0.000737 0.003191 0.002803 -0.000270 0.003583 
+0.006218 0.000639 0.000759 0.003927 0.002728 -0.006197 
+0.004366 0.009941 -0.005130 0.006514 0.001129 -0.001849 
+0.005556 -0.000370 -0.000688 0.004861 -0.000228 0.001088 
+0.003207 0.001568 -0.000626 0.001962 0.003710 -0.002075 
+0.001995 0.005991 -0.001379 0.002091 0.005923 0.000475 
+0.001949 0.000379 -0.006174 0.000329 -0.002049 -0.005138 
+-0.000855 -0.000148 -0.001788 -0.003838 0.001051 0.001296 
+-0.000709 -0.006256 -0.003354 -0.000093 -0.006417 -0.003510 
+0.003364 -0.000003 -0.003346 0.002223 0.004386 0.000814 
+0.000807 0.002177 0.001861 -0.001222 -0.004278 -0.005853 
+0.002530 -0.009177 -0.016858 -0.000949 -0.006975 -0.010339 
+-0.001750 0.001937 -0.001696 -0.000901 0.001195 -0.000336 
+0.000715 -0.000192 -0.001998 0.003482 0.002485 -0.002907 
+0.006559 0.005729 -0.001539 0.006181 0.002924 0.000925 
+0.000041 -0.000574 0.001020 -0.010823 -0.001849 0.000742 
+-0.025039 -0.000862 0.007231 -0.017644 -0.005072 0.019417 
+-0.002719 -0.002693 0.005171 0.006697 0.001642 -0.001728 
+0.002872 0.003732 0.002702 -0.000589 0.006141 0.002044 
+-0.001234 0.006283 -0.000729 -0.000043 0.004444 -0.000041 
+0.006642 0.005421 -0.002895 0.001698 -0.001243 -0.000088 
+-0.002666 0.002270 0.003136 -0.002007 0.001252 -0.003080 
+-0.003273 0.006220 -0.004662 0.003110 0.008156 -0.007384 
+0.003090 0.005164 0.002251 0.001295 0.002073 0.001295 
+-0.002537 -0.001673 -0.000985 -0.003501 -0.003931 -0.001499 
+-0.001151 -0.001377 -0.000627 0.000471 0.003740 0.001679 
+-0.001388 0.000132 -0.000162 -0.008260 0.001271 0.005859 
+-0.004981 0.002411 -0.003693 -0.001080 -0.002679 -0.005292 
+0.001061 0.001415 -0.000713 0.004722 0.000695 0.003769 
+0.000350 0.001132 0.003584 -0.000302 -0.000612 0.003265 
+-0.007155 -0.007702 0.006274 -0.005164 -0.010919 0.002686 
+-0.002475 -0.006046 0.003324 -0.001328 0.000972 0.000408 
+0.003913 0.001747 -0.002760 -0.000570 0.003586 -0.003382 
+-0.000845 0.003379 -0.003308 0.001208 0.001041 -0.002652 
+-0.001008 0.001021 -0.001787 -0.000692 -0.000380 -0.002283 
+-0.003211 0.001329 -0.000123 -0.006493 0.000127 0.000605 
+-0.005410 -0.004433 0.000676 -0.003181 -0.004065 0.000414 
+-0.000938 -0.001921 0.000268 -0.000227 -0.001866 0.000313 
+-0.000241 -0.004895 -0.000602 -0.000242 -0.005515 -0.001470 
+-0.000698 0.000400 0.001257 -0.000712 0.006658 0.001905 
+0.002150 0.007410 -0.003545 0.001280 0.001806 -0.005059 
+0.004834 0.005462 -0.004389 -0.001264 0.009403 -0.003589 
+-0.005110 0.008879 -0.002953 0.002131 0.007043 -0.003258 
+-0.000788 0.003401 -0.002015 -0.000292 0.000986 -0.001558 
+-0.000439 0.002195 -0.001819 -0.000242 0.003495 -0.002447 
+0.000330 0.001892 -0.003243 0.000148 0.000815 -0.003556 
+0.001822 0.002190 -0.003412 0.000982 0.001571 -0.003885 
+0.001327 -0.000620 -0.002112 -0.001526 0.001990 -0.002926 
+0.000241 0.002532 -0.003759 0.002340 0.002418 -0.006426 
+0.007792 -0.002146 -0.007073 -0.002201 -0.002706 -0.003421 
+-0.002331 -0.000659 -0.004123 -0.001713 -0.000040 -0.003725 
+-0.001184 0.000805 -0.001024 0.002466 0.005860 -0.003955 
+0.006144 0.008241 -0.002754 0.009742 0.005583 -0.003428 
+0.009684 0.003875 -0.005841 0.006483 0.003853 -0.005914 
+-0.000171 0.003674 -0.002405 -0.005699 0.000405 0.002093 
+-0.007965 -0.002870 0.000225 -0.004470 -0.001749 -0.001829 
+-0.000505 -0.001913 -0.001111 0.001575 -0.001460 -0.000119 
+0.001889 0.000264 -0.002252 0.001430 0.001136 -0.002279 
+-0.000465 0.000125 0.000385 -0.002382 0.001299 0.003391 
+-0.009640 -0.000216 0.000570 -0.010588 -0.004041 0.002189 
+-0.007916 -0.001496 -0.000610 -0.002541 0.000136 0.000833 
+0.002727 0.001174 0.003521 0.003770 0.003892 0.002965 
+0.001011 0.001129 -0.000114 -0.002621 -0.000843 -0.000043 
+-0.005147 0.001122 0.000679 -0.006346 0.003738 0.003897 
+-0.003516 0.004534 0.006507 -0.004524 0.001063 -0.003238 
+-0.000912 -0.008456 -0.001824 -0.002808 -0.008230 0.002434 
+-0.000623 -0.004446 -0.000904 -0.000634 -0.002728 -0.003272 
+0.001166 -0.003472 -0.000133 -0.002508 -0.005409 0.002290 
+-0.001966 -0.001971 0.000888 0.001900 -0.001364 -0.001395 
+-0.000640 -0.001733 0.000839 -0.000407 -0.001830 -0.000400 
+0.000472 -0.000099 0.000897 0.000452 0.000269 0.000920 
+-0.001129 0.000037 -0.000189 -0.001020 -0.003324 0.000264 
+-0.001559 -0.003962 0.002838 -0.002625 -0.003217 0.002265 
+0.000373 -0.000776 0.000431 0.000384 0.002685 0.001534 
+0.000266 0.000829 0.000716 -0.000010 0.001417 -0.000001 
+0.001158 0.000703 -0.004632 -0.001487 0.001642 -0.002561 
+-0.001358 0.001726 -0.001612 -0.001206 0.001589 -0.000506 
+-0.000338 0.001154 0.000605 -0.000521 0.000596 0.002184 
+-0.001319 -0.001274 0.003686 -0.000117 0.001988 0.000936 
+0.000390 -0.000201 0.003660 -0.000206 -0.001016 0.002160 
+-0.002606 -0.001166 0.000651 -0.003425 0.001975 -0.000705 
+0.000409 0.003729 -0.001433 0.003460 0.000350 0.000077 
+0.000149 -0.000552 -0.000972 -0.000450 0.001908 -0.001351 
+-0.001515 0.000239 -0.002154 0.001161 0.000631 -0.004946 
+0.004369 -0.000252 -0.006246 0.001982 -0.001164 -0.004827 
+-0.002488 -0.001938 -0.001856 -0.001763 0.001177 -0.001820 
+0.000069 0.003019 -0.000242 0.000537 0.006057 0.000283 
+0.001862 0.005300 -0.000046 -0.002064 0.000864 -0.001628 
+-0.002133 0.000388 -0.004383 -0.001609 0.001664 -0.003343 
+0.000125 0.002218 -0.002374 -0.000233 0.001086 -0.000333 
+0.001466 0.000635 -0.001442 0.005487 0.000595 -0.001382 
+0.005454 0.000231 -0.001746 0.003211 0.001974 -0.003390 
+0.000427 0.003643 -0.002290 -0.000485 0.003660 -0.000952 
+0.000390 0.003434 0.000415 -0.001282 0.001312 0.000889 
+-0.002191 -0.004380 0.001712 -0.001760 -0.004200 0.001839 
+-0.003756 -0.001150 -0.000309 -0.003797 0.001205 -0.001397 
+-0.002253 0.000412 -0.000586 -0.002026 -0.002338 -0.000551 
+-0.004123 -0.001729 -0.000834 -0.006889 0.002688 -0.000986 
+-0.008747 0.004888 0.000567 -0.007580 0.000628 0.001852 
+-0.000255 -0.000747 -0.000831 0.001186 0.002616 -0.003286 
+0.001862 0.004482 -0.002481 -0.001003 0.004014 0.000515 
+0.003104 0.000755 0.003604 0.000149 0.000249 0.003740 
+-0.000411 0.000599 0.002412 -0.002579 0.001961 -0.001033 
+-0.003259 -0.002173 -0.002214 -0.001808 -0.003804 -0.001323 
+-0.001073 -0.001395 0.000375 -0.004470 0.000840 -0.001210 
+-0.003769 -0.000177 -0.002197 -0.000709 -0.002059 -0.000911 
+-0.000226 -0.000455 -0.000641 0.000253 -0.000546 -0.000993 
+0.000352 -0.000234 -0.000068 0.001128 0.001895 0.002597 
+-0.003130 0.003084 0.002025 -0.005106 0.001693 0.000344 
+-0.000612 -0.000280 -0.000283 -0.000381 0.000003 -0.000059 
+-0.000977 0.001505 0.000739 0.000333 0.002369 0.001444 
+0.000134 -0.000597 0.000175 0.000182 0.001082 -0.000634 
+-0.000410 0.001179 -0.000306 -0.000470 0.000258 0.000176 
+-0.002348 -0.001716 0.000407 -0.001452 -0.004003 0.001789 
+-0.000519 -0.002523 0.001709 0.000407 0.001301 -0.001144 
+0.004146 0.002790 -0.004107 0.000387 0.007109 -0.005657 
+0.001421 0.004623 -0.000901 -0.002671 0.000397 0.003363 
+-0.002796 -0.004135 0.002695 -0.001083 -0.003596 0.000360 
+0.000130 0.000707 0.000478 -0.002952 0.001991 0.003613 
+-0.004706 -0.001551 0.004921 -0.001215 -0.001702 0.001704 
+0.000881 0.001402 -0.001834 0.004131 0.002845 -0.004924 
+0.005464 0.000600 -0.002898 0.001473 0.000417 0.000185 
+-0.001361 -0.001294 -0.000944 -0.000819 -0.001455 -0.001723 
+-0.001066 -0.001806 0.000503 0.000279 -0.000333 0.001454 
+0.000316 -0.002011 0.001510 0.000007 -0.001998 0.001164 
+-0.000825 0.001482 0.000458 -0.002067 0.005972 -0.001413 
+-0.001396 0.006070 -0.001289 -0.000496 0.003744 -0.000886 
+0.001659 0.000750 -0.001377 0.000883 -0.001974 -0.000308 
+0.000443 -0.002005 -0.001548 0.000243 -0.000628 -0.001139 
+-0.000486 -0.000352 -0.000404 -0.001469 -0.000856 -0.000640 
+-0.002045 0.000658 -0.003141 0.000673 0.001951 -0.003694 
+0.001962 0.001557 -0.002641 0.000119 0.000333 -0.001114 
+-0.000827 0.000764 0.001120 -0.005179 -0.000534 0.002959 
+-0.004619 -0.000834 -0.001934 -0.004043 -0.002840 -0.002391 
+-0.004101 -0.002631 -0.001805 -0.001445 -0.000461 -0.000478 
+-0.000773 0.002167 -0.000228 -0.000916 0.000337 -0.000553 
+-0.006283 -0.003935 0.001542 -0.006364 -0.001523 0.003675 
+-0.004792 0.000881 0.001955 -0.004662 0.000866 0.002313 
+-0.001036 -0.001223 0.004245 -0.000579 -0.001302 0.003529 
+0.000150 -0.000468 -0.000642 0.002880 0.000166 -0.001010 
+0.001895 0.001137 0.002540 -0.000789 0.001527 0.005473 
+-0.000840 0.001995 0.002651 -0.000103 0.001443 -0.001119 
+0.000473 -0.000064 -0.000670 -0.000935 0.001065 0.000195 
+-0.000344 -0.000513 -0.000858 -0.002441 -0.002713 -0.000091 
+-0.000478 -0.001624 -0.001910 0.001783 -0.000404 -0.001909 
+-0.000732 -0.000325 -0.001172 -0.000911 0.003285 0.001550 
+0.001709 0.000041 -0.000484 -0.000469 -0.000599 -0.000388 
+-0.001061 -0.000677 -0.000209 0.000423 0.001380 -0.000371 
+0.002453 0.002844 -0.002270 0.004497 0.004630 -0.000265 
+0.001111 0.001429 -0.002540 0.003652 0.001600 -0.000460 
+0.002256 0.002155 -0.001284 0.001909 0.003118 -0.001290 
+0.002749 0.002566 -0.002365 0.000360 0.000964 -0.001880 
+-0.000587 0.001170 0.000927 0.001164 0.003428 0.001101 
+0.004882 0.001125 0.001231 0.003224 0.000499 0.001830 
+0.000212 0.002210 0.002601 -0.002028 0.003019 0.002591 
+-0.001985 0.001562 0.001759 0.000263 0.000041 -0.001264 
+-0.000075 0.000839 -0.004420 -0.000291 0.000692 -0.006099 
+0.001312 -0.000484 -0.005458 -0.000590 0.000801 0.000047 
+-0.001274 0.003773 -0.001608 0.000713 0.003620 -0.005086 
+0.003372 0.002160 -0.000903 0.002842 0.003371 0.001418 
+0.002747 0.003819 0.000094 -0.000276 0.002297 0.000596 
+0.001292 0.000731 0.001236 -0.000662 -0.003015 0.004485 
+0.000353 -0.006594 0.005830 -0.000029 -0.006444 0.000089 
+0.002731 -0.000953 -0.000569 -0.004852 0.006461 -0.003389 
+-0.001693 0.004835 -0.001325 0.000023 0.000578 0.000380 
+-0.001042 -0.001884 0.000602 -0.001159 -0.000326 -0.001069 
+-0.000559 0.001671 -0.001678 -0.001640 0.001270 -0.001374 
+0.000821 0.001094 -0.002941 0.001386 0.001125 -0.004261 
+-0.000108 -0.000538 -0.003978 0.002271 -0.001312 -0.003113 
+0.003131 0.000939 0.000353 0.000025 0.003008 -0.001760 
+-0.000089 -0.000676 -0.001693 0.000034 0.000487 0.000786 
+-0.000278 0.000574 0.000474 0.001765 -0.002686 -0.000702 
+0.002792 -0.002863 0.000583 0.002895 0.001343 0.000731 
+0.002981 0.001876 -0.001501 0.001296 -0.000315 0.000688 
+-0.000556 -0.000457 0.001329 -0.000096 0.000018 -0.001089 
+-0.001112 0.001604 -0.002884 -0.000131 0.002626 -0.003225 
+0.000987 0.000253 -0.001955 0.002813 0.000026 -0.000317 
+0.000309 -0.001855 0.000320 0.002869 -0.000348 -0.000412 
+-0.000665 -0.000256 0.000313 -0.001406 0.000207 0.002839 
+-0.000909 0.001586 0.002070 0.000387 0.002584 0.000366 
+0.000831 -0.001525 -0.003779 0.002773 -0.001361 -0.000362 
+0.003763 0.005424 -0.003198 0.001774 0.001006 -0.005414 
+-0.000294 -0.000882 -0.000882 0.000028 -0.000179 0.000548 
+0.000353 -0.001000 0.000495 -0.000118 -0.000147 0.000077 
+0.000461 0.000296 0.001350 0.000357 -0.000018 -0.000279 
+0.000108 -0.003051 -0.000402 0.000141 -0.004441 0.000622 
+0.003622 -0.000315 0.000000 0.004766 -0.000193 0.000322 
+0.003084 0.002664 0.000525 -0.001146 -0.002130 0.001016 
+0.000450 -0.006106 0.002231 0.000254 -0.005659 -0.000305 
+0.001446 -0.001161 -0.000837 0.000122 -0.000221 0.000243 
+-0.000629 -0.000213 0.002140 0.000781 0.002000 0.001652 
+-0.001253 0.001377 0.000816 -0.003770 0.001664 -0.001086 
+-0.004774 0.001313 -0.000716 -0.003440 0.001207 0.000566 
+-0.001578 0.000495 0.000222 0.000749 -0.001125 -0.001187 
+0.001998 0.000654 -0.004031 0.003886 0.002437 -0.005271 
+0.003721 0.001979 -0.004513 -0.000006 0.001399 -0.002341 
+-0.001541 -0.000195 -0.000529 0.000299 0.000533 -0.000100 
+0.003464 0.002675 -0.000997 0.004186 0.002832 -0.001508 
+0.001324 0.000076 -0.001689 -0.001741 -0.002691 -0.001687 
+-0.002803 -0.002280 -0.001584 0.000555 -0.002217 -0.000137 
+-0.000041 -0.001897 0.000850 0.000353 -0.001879 -0.001324 
+0.000494 -0.002080 -0.000433 -0.001285 -0.000182 -0.002273 
+-0.000156 -0.000300 -0.000913 0.000241 -0.000889 -0.001024 
+-0.001831 -0.001202 -0.000621 -0.003354 -0.002972 -0.001963 
+-0.003032 -0.003664 0.002611 -0.004838 -0.003169 0.002837 
+-0.004688 0.001985 0.001129 -0.000968 0.002860 -0.000126 
+0.001079 0.003826 -0.001423 0.000636 0.003354 -0.000630 
+-0.001796 0.001642 0.000390 -0.001533 0.000894 0.004695 
+0.001339 0.000785 0.001282 0.000423 -0.001295 -0.000491 
+-0.000496 -0.002874 -0.002076 -0.000150 -0.001466 -0.001138 
+0.000878 0.002341 0.000250 0.000324 0.001113 -0.001319 
+0.000700 -0.000165 0.000973 -0.000851 0.000264 0.000353 
+-0.001455 0.000085 -0.001557 0.000455 0.000548 -0.006212 
+0.002503 0.001361 -0.011957 -0.000155 0.000140 -0.011983 
+-0.002005 0.000449 -0.006383 -0.000347 -0.001339 -0.000562 
+-0.000476 -0.000968 -0.001222 -0.003842 -0.000296 -0.001040 
+-0.003636 0.002731 0.001444 -0.001842 0.002385 0.002084 
+-0.003466 0.000968 -0.000562 -0.002474 0.002254 -0.004235 
+0.001336 -0.001783 -0.003032 0.003971 0.001084 -0.003022 
+0.001547 0.001586 -0.000764 -0.003805 0.002859 -0.001140 
+-0.003244 0.004378 -0.001758 -0.001509 0.002760 0.000666 
+0.003131 0.002019 0.000076 0.002924 0.001395 -0.001734 
+-0.005164 -0.001616 0.001301 -0.001190 0.000401 0.000388 
+0.000000 0.000000 -0.002615 -0.000036 0.000169 -0.000919 
+-0.000063 0.000738 0.002490 0.001578 -0.000865 0.000712 
+-0.001679 -0.004962 0.000000 0.000245 0.000005 -0.000039 
+0.001629 0.001670 -0.002498 -0.000136 -0.000275 0.000403 
+-0.000805 -0.002705 0.004280 -0.001304 -0.000930 0.003621 
+0.000612 0.003049 0.002012 -0.003211 0.002577 0.000076 
+-0.003172 0.002527 -0.000027 -0.003189 0.001377 -0.000886 
+-0.001081 -0.001180 -0.001436 -0.002865 0.000683 -0.005861 
+-0.000150 -0.000160 -0.000140 -0.000253 0.002691 0.001650 
+-0.000526 0.003776 0.003118 -0.001649 0.002700 0.000313 
+0.000006 -0.000308 -0.000345 -0.000049 -0.003161 -0.001502 
+-0.002973 -0.004254 -0.000202 -0.002776 -0.001166 0.002156 
+-0.001625 0.001029 -0.000731 0.000159 0.002857 -0.002698 
+-0.002134 0.000962 -0.001082 -0.000361 -0.001969 -0.000282 
+-0.000163 -0.002712 -0.001241 -0.000009 -0.002588 -0.000497 
+-0.000026 -0.000491 -0.000002 0.000512 0.003088 -0.000222 
+0.000789 0.003461 0.000581 -0.000550 0.001135 -0.000655 
+0.000219 -0.001142 0.000632 -0.000150 -0.001538 0.001462 
+0.000099 -0.000247 -0.000198 0.001333 -0.001617 -0.001127 
+0.002150 -0.000970 -0.002477 -0.000296 -0.000002 -0.000315 
+-0.000586 0.000221 0.002109 0.000079 -0.000231 0.001142 
+0.004671 0.004295 -0.000886 0.003336 0.005000 0.001483 
+0.003365 0.004056 -0.000220 0.001068 0.002033 0.001417 
+0.001526 -0.001591 0.003434 0.001624 -0.004496 0.004271 
+0.001509 -0.004042 0.001231 0.001140 0.000055 -0.001221 
+0.001730 0.004634 -0.001925 0.000673 0.005704 0.001771 
+-0.000291 0.003407 0.003855 0.000444 0.000952 0.000889 
+0.001009 -0.002058 -0.002213 0.000422 -0.002309 -0.003537 
+0.000589 -0.000981 -0.002109 0.001327 -0.000531 -0.001905 
+0.000394 0.004409 -0.001417 0.001735 0.003308 0.001302 
+0.001099 0.000496 0.000860 -0.003653 0.002201 0.001751 
+-0.006063 0.003029 0.003020 -0.002303 0.001385 -0.001610 
+-0.000356 0.000950 -0.002815 0.001303 0.002154 -0.005213 
+0.001721 0.003656 -0.004623 0.002609 0.001507 -0.002528 
+-0.000243 -0.001784 -0.002155 -0.002572 -0.000918 -0.003233 
+-0.002398 0.000089 -0.001479 -0.000823 0.000543 -0.000353 
+-0.001979 -0.003802 0.000521 -0.005591 -0.005433 -0.001811 
+0.002313 0.002612 -0.005821 0.000007 0.000437 -0.001733 
+-0.001364 -0.000161 -0.001124 -0.000877 -0.000175 -0.002982 
+0.002743 0.002274 -0.003611 0.000295 0.002016 0.001020 
+-0.000992 -0.000866 -0.000331 -0.003772 -0.001942 0.001486 
+-0.000997 -0.001199 -0.000051 0.000863 -0.001314 -0.001789 
+0.001847 -0.001431 -0.002085 0.001759 -0.001693 -0.001354 
+0.001289 -0.000870 -0.000103 0.000591 -0.000050 0.001333 
+0.000788 -0.000162 0.002144 -0.000184 0.000280 0.001480 
+0.000759 -0.001344 -0.000010 0.001785 0.000151 -0.003085 
+0.003701 0.003050 -0.005229 0.002825 0.000566 -0.004530 
+-0.002014 0.000101 -0.000943 -0.004250 -0.000050 -0.001771 
+-0.003573 -0.001025 -0.001349 -0.000175 0.000242 -0.000007 
+0.000889 0.000279 -0.000747 -0.000487 -0.000167 0.002257 
+-0.001050 0.000325 0.002126 0.001368 0.001965 -0.002988 
+0.000995 0.004366 -0.007889 -0.000295 0.000903 -0.008495 
+0.001533 -0.001657 -0.004575 0.000922 0.003687 -0.002537 
+-0.000012 0.000643 -0.000204 0.000415 0.002831 0.000149 
+0.003318 0.002913 0.003134 -0.001929 0.004283 0.001464 
+-0.001866 0.004543 -0.000509 -0.000877 0.002916 0.000154 
+0.000143 0.001783 0.002093 -0.002365 0.003172 0.002825 
+-0.005018 -0.003052 -0.001457 -0.004226 0.000057 -0.002331 
+-0.001154 0.001400 -0.000445 -0.000651 0.001174 -0.000392 
+-0.000240 0.000380 0.001331 0.002116 0.000405 0.000685 
+0.004315 -0.000392 -0.002460 0.005543 0.005514 -0.003331 
+0.003513 0.002476 0.000325 -0.001711 -0.002051 0.004757 
+-0.002786 -0.004513 0.006697 0.002232 0.000494 0.001756 
+-0.000588 0.007526 -0.001059 0.001353 0.010193 -0.001847 
+0.002288 0.005216 0.000086 0.001677 0.000941 0.001194 
+0.000308 0.000123 0.001569 0.000458 0.000511 -0.000902 
+0.001627 0.001137 0.000261 0.001963 0.000099 0.000599 
+-0.000881 0.001270 0.002203 0.000810 0.004110 0.002448 
+0.001254 0.004307 0.000878 -0.000024 0.000530 -0.000292 
+-0.000622 -0.000375 0.000935 -0.001556 -0.000877 -0.001316 
+0.000147 -0.000514 -0.002828 0.002944 0.000513 -0.003191 
+0.001537 0.002496 -0.002111 -0.001608 0.000610 -0.000832 
+-0.003793 -0.000072 -0.001718 -0.002712 -0.000350 -0.000557 
+0.002338 0.001193 -0.000249 0.003338 0.002323 -0.000447 
+-0.000461 0.001775 0.001455 -0.003604 0.001352 0.005078 
+-0.001190 -0.002553 0.006123 0.001888 0.000535 0.002282 
+0.005380 0.002108 -0.001887 0.002539 0.000988 0.001463 
+0.001889 -0.003624 -0.000142 -0.001603 -0.008333 0.003013 
+0.000501 0.000781 0.002417 0.001953 0.000108 -0.000579 
+0.002343 0.001256 -0.003860 0.001464 0.000818 -0.002471 
+-0.001476 -0.002584 0.001674 0.000555 -0.002951 -0.001612 
+0.001000 -0.000707 0.001936 -0.000192 0.001068 0.002297 
+0.001277 -0.000378 0.000175 0.000271 -0.000090 -0.000910 
+0.000244 -0.000217 -0.004882 -0.000777 -0.002431 -0.006281 
+0.002231 -0.002903 -0.005321 -0.002785 -0.000056 -0.001938 
+-0.001654 0.002072 -0.000412 -0.003231 0.000336 -0.000821 
+-0.002149 0.002924 -0.000984 0.000305 0.001921 -0.002863 
+0.001380 -0.000956 -0.000554 0.002334 -0.000195 0.002483 
+0.000218 0.000001 0.003025 -0.000368 -0.000391 0.001033 
+-0.002902 0.000828 -0.000556 -0.002453 0.002401 -0.001118 
+0.002128 -0.000282 -0.000469 0.000684 0.005470 -0.004741 
+0.001341 0.003327 -0.003891 0.000632 0.000320 -0.000622 
+0.001243 0.000342 0.001758 -0.000965 0.001338 0.000065 
+-0.000922 0.002273 -0.002429 -0.001704 -0.000963 0.000963 
+-0.006512 -0.007907 0.002326 -0.008507 -0.002773 0.000126 
+-0.002233 -0.000444 -0.001151 0.001848 0.001179 0.001077 
+0.000299 0.000139 -0.001096 -0.000385 0.001321 0.003005 
+-0.003236 0.002440 0.005230 -0.003947 -0.001439 0.004316 
+-0.000903 0.000816 -0.001146 -0.002137 0.002758 -0.003315 
+-0.003991 0.003097 -0.004438 -0.001282 0.002570 -0.005278 
+0.000787 0.002178 -0.002964 0.001859 0.000614 0.000900 
+-0.000828 0.000504 0.003284 -0.000711 0.005927 0.000953 
+-0.000018 0.006539 -0.001689 -0.001838 0.002056 -0.002025 
+-0.000791 0.000062 -0.001965 -0.001116 0.000558 0.000698 
+0.000499 0.001811 0.000399 -0.003520 0.000720 0.000000 
+-0.001548 0.000135 0.001249 0.000783 -0.000018 -0.001220 
+0.003277 -0.000749 0.000785 0.004036 -0.004211 0.002822 
+0.003835 -0.003964 0.004195 0.000749 -0.001623 0.002955 
+-0.000068 0.001728 0.000494 -0.000131 0.004004 0.000881 
+0.000542 0.004469 0.002575 -0.000377 0.003350 0.003915 
+-0.002358 -0.000564 0.002050 -0.000825 0.000702 0.000011 
+-0.000204 0.003769 -0.000074 -0.002658 0.002962 -0.004709 
+0.001254 0.001615 -0.004913 0.000672 -0.001320 0.001650 
+-0.001687 -0.002540 0.003399 -0.001242 -0.000098 0.000760 
+0.000441 0.000152 0.000237 0.000997 -0.000973 0.000719 
+-0.000458 0.000611 0.000763 -0.002946 -0.006061 0.002134 
+-0.005451 -0.003816 0.007086 -0.002594 -0.005744 0.009635 
+-0.005058 -0.007764 0.006344 -0.003293 -0.003710 -0.000468 
+-0.000591 -0.002386 -0.002411 -0.000989 -0.001945 -0.003328 
+-0.001361 0.001567 -0.002948 0.004196 -0.000787 -0.005182 
+0.000731 -0.000452 -0.004809 -0.001386 0.001367 -0.003894 
+-0.001845 0.001798 -0.001940 -0.001059 0.001102 -0.001059 
+-0.000862 0.001034 -0.001379 -0.001490 0.002451 -0.000099 
+-0.003235 0.002633 0.002610 -0.003405 0.000419 0.002610 
+-0.000909 -0.000977 0.001660 0.001867 -0.001045 0.000310 
+0.002408 -0.000956 -0.000177 0.001672 0.002205 -0.000163 
+0.000124 0.000513 0.000362 0.000074 0.000164 -0.000741 
+0.001920 0.001123 -0.000490 0.000850 0.003170 -0.000229 
+0.004911 0.000821 0.000004 -0.000227 0.000730 -0.001137 
+0.004236 0.002229 -0.003735 0.005232 0.000666 -0.001694 
+0.001474 0.000181 0.000351 -0.002341 0.001167 -0.000250 
+-0.001232 0.000833 -0.001743 0.000243 0.001561 -0.001952 
+0.001743 0.001398 0.001241 0.003813 0.000683 0.000683 
+0.003279 0.001066 0.000064 0.003175 0.003836 -0.002293 
+0.001490 0.006223 -0.000973 0.001165 0.004564 0.001309 
+0.001503 0.002397 0.001569 0.000374 0.001547 -0.000691 
+-0.002573 0.001207 -0.003345 -0.000870 0.000231 -0.006782 
+0.003355 -0.002199 -0.002128 0.003359 0.003581 0.000477 
+0.001421 0.005232 -0.001471 0.000908 -0.000330 0.001213 
+-0.003484 -0.001137 0.006703 -0.005343 -0.004623 -0.000484 
+-0.001357 -0.004187 -0.001829 -0.000546 -0.003168 -0.002458 
+-0.000350 -0.002268 -0.001876 0.002408 0.003421 -0.003803 
+0.000915 0.002974 -0.002440 -0.000306 -0.000612 0.000918 
+0.000528 -0.000854 0.001301 -0.000083 0.000372 0.001860 
+-0.000238 -0.000772 0.002711 0.000103 -0.002881 0.003088 
+-0.001568 -0.004455 0.003152 -0.000895 0.000075 0.000453 
+0.000031 -0.000063 -0.001354 0.001278 0.001060 -0.001944 
+0.002612 0.003925 0.001784 0.003038 0.001165 0.001234 
+0.000503 -0.000070 0.000267 -0.001482 -0.001503 -0.000496 
+-0.001828 -0.001886 -0.002171 0.003007 0.002591 -0.005681 
+0.004081 0.000982 -0.003501 0.002966 -0.001675 0.000419 
+-0.006094 0.000062 0.000031 -0.006067 -0.000676 0.003201 
+-0.004357 0.000886 0.002370 -0.000824 0.001665 0.003128 
+-0.001870 -0.001470 0.002360 -0.000799 -0.000938 0.000861 
+-0.000394 -0.001089 0.003504 -0.001006 -0.001310 0.006045 
+0.002944 -0.001538 0.002980 0.003243 0.002457 0.003425 
+0.003298 0.000074 0.000630 0.000016 -0.000892 -0.002992 
+-0.002054 -0.003865 -0.003746 -0.002194 0.000112 -0.003903 
+0.001562 0.002109 -0.005182 0.006016 0.006682 -0.002864 
+0.006442 -0.001236 -0.001683 0.001044 -0.001784 -0.004636 
+-0.003330 -0.000274 -0.001959 -0.003371 0.000237 -0.002715 
+-0.000473 0.001517 -0.006009 0.002650 0.002432 -0.002951 
+-0.001085 -0.000415 0.000425 -0.005398 0.000465 0.002058 
+-0.005460 0.000708 0.004736 -0.003082 -0.000100 0.000450 
+0.000323 0.001189 -0.001431 -0.000014 -0.000712 -0.000808 
+-0.001151 -0.000166 0.001060 0.000000 0.000000 -0.000522 
+0.003318 0.003761 -0.004314 0.005140 0.005868 -0.000660 
+0.004312 0.004809 -0.002275 0.003343 0.001003 -0.000303 
+0.002924 0.001272 0.001866 0.002269 0.003769 0.002269 
+0.003308 0.001330 0.001596 0.001915 0.000638 -0.003000 
+-0.002339 0.004834 -0.002807 -0.000981 0.005443 -0.002105 
+0.002616 0.006485 -0.001608 0.001332 0.005603 0.000710 
+0.001872 0.004669 -0.000970 -0.000293 0.000430 -0.000623 
+-0.002606 -0.003242 0.001939 -0.000524 -0.004508 0.001351 
+0.002522 -0.000625 -0.003846 0.006221 -0.000835 -0.003243 
+0.002407 0.000373 -0.000205 -0.003560 -0.000114 -0.000556 
+-0.001976 0.001904 -0.003391 -0.000694 0.003568 0.002282 
+-0.001706 0.004362 0.006691 -0.002014 0.006486 0.006467 
+0.001201 0.001460 0.002894 -0.002294 -0.006593 -0.000718 
+-0.001640 -0.000970 0.001152 0.002779 0.003261 -0.002094 
+-0.002162 -0.000839 -0.002736 -0.001650 -0.000115 0.000050 
+-0.003358 -0.001711 0.005449 -0.003158 -0.000366 0.003490 
+0.003173 0.000167 0.000635 0.002643 0.001091 0.000099 
+-0.000998 0.000300 0.002948 -0.002394 0.001000 0.002705 
+-0.002031 -0.002997 -0.000744 -0.002203 -0.000662 -0.003044 
+-0.001619 -0.000512 -0.001371 -0.001167 -0.001695 0.002702 
+0.001779 -0.001209 0.002189 0.001117 0.001218 0.001409 
+0.001849 0.007147 -0.000225 -0.001117 0.005659 -0.002163 
+0.003519 0.001840 -0.005052 0.005081 0.001384 -0.000045 
+-0.001070 0.002080 0.005210 -0.001194 0.001767 0.003057 
+0.001364 -0.000928 -0.000365 0.005000 0.000560 -0.003880 
+-0.001587 0.001377 -0.003595 0.000287 0.003178 -0.000860 
+-0.001630 0.001994 0.000595 0.004307 -0.000921 0.001286 
+0.004722 0.003022 0.003194 0.002512 0.001373 0.003247 
+0.000973 0.000521 0.001141 -0.000167 -0.000764 -0.000333 
+-0.001504 -0.000344 -0.002222 -0.000152 0.001622 -0.000280 
+-0.004391 0.002481 0.002980 -0.005196 0.002895 0.000436 
+-0.004983 0.002988 -0.001184 -0.003980 0.002475 -0.000486 
+-0.003127 0.000444 -0.001214 -0.001911 0.001908 -0.002135 
+-0.002505 0.002177 -0.002450 -0.000394 0.001410 -0.005245 
+-0.003171 -0.002141 -0.001199 -0.003130 -0.002736 0.002948 
+-0.003022 -0.003137 0.003935 -0.002060 -0.002365 0.001404 
+-0.000303 0.000151 -0.000466 0.000185 0.001848 0.000493 
+-0.000107 0.002277 0.002895 0.002247 -0.002670 0.005407 
+0.002775 -0.002126 0.003671 0.001446 -0.001170 0.002190 
+0.000019 -0.000155 -0.001037 0.001377 -0.001192 -0.003721 
+0.001074 -0.002921 -0.003005 -0.001902 -0.004390 -0.000634 
+-0.001244 -0.002534 0.002061 0.000220 -0.000938 0.000691 
+-0.002086 -0.001823 -0.002957 -0.003860 0.001685 -0.001631 
+-0.003423 0.001365 -0.001023 -0.002116 -0.001036 -0.000759 
+-0.003139 0.000344 0.003092 -0.002875 -0.004276 0.003068 
+-0.001368 -0.002158 -0.001011 -0.002008 0.002428 -0.004631 
+0.000466 0.005578 -0.001752 0.000737 0.002393 -0.000228 
+-0.004032 0.000188 0.002934 -0.006829 0.001839 0.001226 
+-0.003988 0.003190 0.000652 -0.003211 -0.000475 0.001648 
+0.000096 -0.001226 0.007585 0.003007 0.000950 0.005665 
+0.000853 -0.002238 -0.001327 0.003492 -0.000147 -0.001309 
+-0.003350 0.000488 -0.001675 -0.000639 0.000505 -0.006659 
+0.000309 0.000677 -0.000455 0.002413 0.001906 0.004035 
+0.001286 -0.003689 0.005924 -0.001679 -0.001260 0.002099 
+0.000382 0.000543 -0.000228 -0.001670 0.003913 -0.002041 
+-0.000160 0.001474 0.000720 0.002321 0.003167 -0.004825 
+-0.001818 0.003596 -0.006481 -0.003277 0.001189 -0.001661 
+-0.000022 -0.000723 0.000473 0.000410 -0.003924 0.001533 
+0.009405 0.001269 -0.001373 0.007008 -0.001102 0.005906 
+0.003329 0.004861 -0.000132 -0.000642 -0.001005 0.003115 
+-0.002806 -0.006266 0.005175 -0.000894 0.000004 0.004435 
+-0.001458 -0.001234 0.001851 -0.000014 0.001609 0.001777 
+0.005610 0.002024 0.000675 0.002540 -0.000733 0.003687 
+0.006970 0.000265 -0.000265 -0.000114 -0.001263 -0.000535 
+-0.000569 -0.000230 -0.000926 0.002199 0.000878 -0.000124 
+0.000384 0.002124 -0.000232 0.003751 0.005277 -0.000483 
+0.003650 0.001402 -0.001169 -0.001822 -0.000278 0.001998 
+-0.006707 -0.004871 0.002994 -0.007176 0.000136 -0.002000 
+-0.006101 0.004761 -0.000685 -0.006750 0.006525 0.001236 
+-0.005909 0.001272 -0.000434 -0.001162 0.003403 -0.000097 
+0.000489 -0.000065 -0.001897 0.003439 -0.001248 -0.001031 
+0.000381 -0.003022 0.000805 0.000269 -0.003910 0.002761 
+-0.002591 0.001075 0.000771 -0.000042 -0.000099 -0.000576 
+0.003146 0.001314 -0.003823 -0.002635 0.001224 -0.002134 
+-0.005202 -0.001944 -0.002756 -0.004162 -0.000482 0.000452 
+0.000143 -0.000326 0.002122 0.001958 -0.001046 0.001054 
+-0.000164 -0.000142 0.000311 -0.003723 -0.002857 0.000569 
+-0.005448 -0.003094 0.002777 -0.005361 -0.002900 0.005771 
+0.001145 0.001405 0.001691 0.002038 -0.002038 0.002692 
+0.001283 -0.000684 -0.000043 0.000781 0.000581 -0.000544 
+0.000977 -0.002505 -0.000722 0.002631 0.000078 0.000595 
+0.001433 0.001507 -0.000238 0.002330 0.003911 -0.001977 
+-0.001265 0.004375 -0.003059 0.000769 0.004038 -0.002500 
+-0.000086 -0.000167 -0.001966 -0.000372 -0.000072 -0.000692 
+0.002750 0.000003 -0.000122 0.006282 0.001688 -0.001560 
+0.004849 0.005372 -0.001873 0.000354 0.002961 0.001974 
+0.000576 0.000411 -0.002435 0.000934 0.002073 -0.003730 
+0.001797 0.002457 -0.001336 -0.000614 -0.000184 -0.000159 
+-0.004484 -0.001117 -0.001369 -0.004786 -0.001995 -0.001939 
+-0.001102 -0.003083 -0.001444 -0.000539 -0.002327 -0.000173 
+0.003058 -0.001376 0.003342 -0.000039 0.002613 0.003841 
+-0.000866 0.004597 -0.001039 -0.002163 0.004834 -0.001656 
+-0.004902 -0.000663 -0.003122 -0.005235 -0.003163 -0.003797 
+-0.002642 0.000173 -0.006494 -0.003379 0.000510 -0.002122 
+-0.002083 0.004520 -0.000114 0.001217 0.004214 0.000644 
+0.004247 0.000519 0.002253 0.009680 -0.000861 -0.002652 
+0.006630 -0.000200 0.001004 -0.001521 -0.000798 -0.000713 
+-0.001855 -0.002774 0.000010 -0.001311 0.000000 0.000540 
+0.003763 -0.000294 0.000866 0.002841 -0.002266 0.002916 
+-0.000820 0.001844 0.000290 -0.001368 -0.003118 0.000627 
+-0.002751 -0.001220 0.003004 0.004683 -0.001720 -0.002484 
+0.007574 -0.000993 0.000931 0.001030 -0.002197 -0.002288 
+-0.003123 0.008235 -0.003311 0.002607 0.009169 -0.008586 
+0.002107 0.004214 -0.006339 -0.000620 -0.000455 -0.000155 
+-0.002491 0.000086 -0.002286 -0.004125 0.003015 -0.003384 
+-0.004835 0.003867 -0.003773 -0.004519 0.003504 -0.002058 
+-0.005597 0.000968 -0.001278 -0.004235 0.001603 -0.000317 
+-0.001179 0.000844 -0.002002 0.001838 0.002309 -0.003198 
+0.003209 0.002104 -0.001640 0.003597 0.001429 -0.002521 
+0.002331 0.002782 -0.002180 0.001957 -0.000101 0.001755 
+-0.000353 0.000179 0.000033 -0.000826 0.000092 -0.001621 
+0.000177 0.000629 -0.001344 0.002131 0.002865 -0.002219 
+0.002311 0.002985 -0.003322 0.000000 0.000000 -0.002320 
+-0.001464 -0.001677 -0.002952 -0.001187 -0.002059 -0.000455 
+0.001709 -0.000455 0.002050 0.002419 0.000967 0.003382 
+0.000899 0.001724 0.004922 -0.002370 -0.000271 0.003420 
+0.000670 0.000301 0.000563 -0.000177 -0.000068 -0.001537 
+0.000589 0.001983 0.000273 -0.003080 0.001268 -0.000362 
+-0.002078 0.001000 -0.003167 0.002354 0.002237 -0.006927 
+0.004326 0.008917 -0.003242 -0.001041 0.010189 -0.005649 
+-0.003752 0.008049 -0.005898 -0.005528 0.003415 -0.003121 
+-0.004702 0.001598 -0.000561 -0.005208 0.000000 0.001667 
+-0.004717 -0.002417 0.001600 -0.003275 -0.002338 -0.001429 
+-0.001170 0.000431 -0.005521 0.001058 0.003140 -0.007204 
+0.000673 0.002731 -0.003954 -0.000014 -0.002211 -0.000755 
+-0.000594 -0.004786 -0.000524 -0.001597 -0.002639 -0.002144 
+-0.003513 0.000192 -0.001369 -0.005826 -0.002497 0.004211 
+-0.002761 -0.003455 -0.001946 -0.006957 -0.005504 0.000994 
+-0.004223 -0.000445 0.005742 -0.003366 0.001149 0.003850 
+-0.001278 0.000415 0.003990 -0.000744 -0.000134 0.003851 
+-0.000189 -0.001052 0.003332 0.000500 0.001792 0.000792 
+0.002703 -0.000773 0.001543 -0.000912 0.001208 -0.000620 
+-0.001099 0.000044 -0.002191 -0.005266 -0.002367 0.001643 
+-0.000420 0.000467 0.000657 -0.002470 -0.001951 -0.001542 
+-0.001508 -0.001433 0.001103 -0.001409 -0.000033 0.002297 
+-0.005356 -0.002134 0.002176 -0.003894 -0.003522 0.003293 
+-0.001651 -0.000720 0.001520 0.002465 -0.001250 0.000569 
+0.000352 -0.004081 -0.001292 0.000703 -0.001024 -0.000022 
+-0.001025 0.001721 -0.001580 -0.001981 0.002606 -0.001824 
+-0.001654 0.002463 -0.001567 -0.001726 0.003495 -0.001088 
+-0.003584 0.004737 -0.002807 -0.000115 0.010123 -0.003713 
+-0.005134 0.005462 -0.001115 -0.004509 0.003375 -0.001614 
+-0.003364 0.002236 -0.002013 -0.003521 0.001334 -0.002901 
+-0.002260 0.003133 -0.001238 -0.001281 0.001996 -0.000573 
+-0.000298 0.000016 0.000527 0.000581 0.000060 -0.000156 
+0.000125 -0.000960 -0.000603 -0.001103 -0.002405 -0.000601 
+-0.000255 -0.003575 0.002552 -0.000421 -0.002407 0.001556 
+0.000770 0.000541 -0.000708 0.001215 -0.001081 -0.002000 
+0.000673 -0.003182 -0.001866 0.000619 -0.002245 -0.001472 
+-0.000230 -0.000246 -0.001918 0.004199 0.008599 -0.003067 
+0.002789 0.007578 0.001953 0.002882 0.002958 0.001669 
+0.000152 0.000971 0.000540 -0.002015 -0.002687 0.005344 
+0.002359 -0.003653 0.002035 0.002197 -0.000261 0.001030 
+-0.000299 -0.001195 0.002063 -0.000101 0.000283 0.000817 
+-0.001149 0.000602 0.000265 -0.000129 0.000207 0.000259 
+0.000526 0.001617 -0.002669 0.000604 -0.000775 -0.003055 
+0.002000 -0.001500 -0.004500 0.003376 0.007503 0.000667 
+-0.001071 0.001320 -0.000112 -0.001806 -0.000566 -0.002420 
+-0.001841 -0.000869 -0.002818 -0.001901 -0.000479 -0.000239 
+-0.004322 -0.000012 0.003364 -0.004716 0.001951 0.005531 
+-0.007981 -0.001765 0.000401 -0.003671 -0.004279 0.000788 
+-0.000316 -0.003497 0.000252 0.000091 -0.000602 -0.000857 
+0.002316 0.002057 -0.002234 0.005929 0.003039 -0.004442 
+0.000855 0.001189 -0.006809 0.000384 0.005806 -0.003531 
+-0.000535 0.001505 0.002216 -0.003433 0.003582 0.000851 
+-0.002416 0.001382 -0.000517 0.000267 -0.001022 0.003466 
+0.001723 -0.003111 0.003062 0.001013 -0.000554 0.000296 
+0.000615 -0.000877 -0.000458 -0.000527 -0.000717 -0.002847 
+0.003523 0.004348 0.002036 0.002699 -0.000877 -0.000050 
+0.003011 -0.000898 -0.000322 0.001756 0.000725 0.000725 
+-0.001735 0.001530 -0.000530 -0.002774 -0.000590 0.002315 
+-0.001429 -0.001107 0.004252 -0.001869 -0.002974 0.003518 
+-0.001066 -0.003158 0.004985 -0.005379 -0.004069 0.004069 
+0.000001 -0.003329 0.003314 0.000164 -0.002437 0.000647 
+0.003583 -0.002683 -0.002389 0.000642 -0.005569 -0.000373 
+-0.000338 0.000789 -0.001353 -0.003683 0.000394 -0.003597 
+-0.001527 -0.000439 -0.001729 -0.000721 -0.003476 0.001240 
+0.001223 -0.001872 0.000092 0.001183 -0.001010 0.000317 
+-0.000288 0.004568 0.000355 -0.004532 0.004417 -0.002805 
+-0.004966 0.006389 0.000726 -0.003246 0.004108 -0.000473 
+-0.002196 0.000545 0.003576 0.000745 -0.000635 0.000914 
+0.000574 0.000485 0.001080 -0.001808 -0.002537 0.002325 
+-0.003795 -0.002690 0.001695 -0.002275 -0.000892 -0.000098 
+-0.001279 0.002035 -0.000233 -0.001435 0.002834 0.000951 
+-0.000461 0.001475 0.001060 -0.000106 0.000650 -0.001428 
+0.001376 0.000582 -0.004569 0.003280 0.001242 -0.004139 
+-0.000873 0.000079 -0.000873 -0.001662 -0.000226 -0.001544 
+-0.000774 -0.002053 -0.001627 0.002399 -0.000065 -0.000854 
+0.001078 0.002505 -0.000367 -0.000388 0.001132 0.001457 
+-0.001852 0.000882 -0.000221 -0.000085 0.002047 -0.003113 
+-0.000884 -0.002298 -0.004066 0.005016 -0.003857 -0.002082 
+0.000703 -0.001971 -0.001488 -0.003422 0.001243 -0.001021 
+-0.004784 0.002609 0.000035 -0.002622 0.002891 0.000613 
+-0.001200 0.001372 0.001983 0.000008 -0.000045 0.002833 
+0.000345 -0.000621 0.000310 0.001114 0.001333 -0.002675 
+0.002170 0.003950 -0.004731 0.000035 0.005337 -0.004884 
+-0.002829 0.003714 -0.001909 -0.001388 0.001086 0.000396 
+-0.004398 -0.003633 0.001163 -0.006774 -0.007826 0.002605 
+-0.006086 -0.007406 0.003911 -0.000704 -0.004301 0.003382 
+0.001761 -0.000783 -0.000078 0.002756 0.000291 0.000436 
+0.001488 0.003355 0.000834 -0.001955 0.002827 -0.000030 
+-0.004013 -0.000193 -0.000438 -0.001030 -0.001281 -0.003390 
+0.000134 -0.000309 0.000385 0.001169 -0.000642 0.001161 
+0.000117 0.000672 0.000179 0.002186 0.001671 -0.001814 
+-0.003316 0.000629 -0.001408 -0.002858 0.001671 -0.003160 
+0.000125 -0.000121 0.000508 0.002656 -0.000822 0.002366 
+0.001910 0.000480 0.002198 0.001110 0.002313 0.001053 
+-0.000226 0.001097 0.000183 -0.001568 -0.002025 0.000860 
+0.000068 -0.000901 0.002949 0.000234 -0.000104 0.000945 
+0.001732 0.003465 -0.001811 0.000456 0.000958 -0.003726 
+0.001596 -0.000957 -0.001915 -0.000609 -0.001754 -0.002189 
+0.001027 -0.001225 0.001119 -0.000474 -0.000589 0.001350 
+0.002593 0.001958 -0.000582 0.002364 -0.001372 -0.000311 
+-0.000751 -0.003697 -0.000243 -0.001460 0.000764 -0.004623 
+-0.002121 0.000848 -0.005066 -0.000824 0.001512 -0.002764 
+-0.000343 -0.000224 -0.000897 -0.001786 -0.001609 -0.002001 
+-0.003588 -0.000907 0.003095 -0.000969 0.001498 0.000114 
+0.000395 0.004362 -0.001330 0.006815 0.000939 -0.004227 
+0.007604 0.001170 -0.003060 0.002183 -0.002996 -0.001827 
+0.000663 -0.000268 -0.000093 -0.000112 -0.000349 -0.000665 
+0.002216 0.001181 -0.003202 0.002186 0.000978 -0.006389 
+0.002132 0.001844 -0.006763 0.000828 0.002069 -0.005704 
+-0.001734 0.003316 -0.002537 -0.001636 0.001142 0.000691 
+-0.000413 -0.000655 0.000712 -0.001584 -0.000883 -0.001939 
+-0.003742 0.001750 -0.001743 -0.003462 0.002966 -0.001402 
+-0.002382 -0.000645 -0.000649 -0.001380 -0.004004 0.002938 
+-0.000359 -0.004127 0.002661 -0.000118 -0.002177 0.002233 
+0.002085 0.000211 0.001563 0.000953 0.002464 0.001279 
+0.004431 0.003902 0.000265 0.001190 -0.002131 -0.002271 
+0.000312 -0.001817 -0.001105 -0.007056 -0.003497 0.000378 
+-0.003890 -0.002016 0.005988 -0.001370 -0.000464 0.004941 
+0.002182 -0.001121 0.001575 0.001346 -0.000508 0.000677 
+0.001642 0.001923 -0.000932 0.001864 0.001017 0.000932 
+0.001770 0.002481 -0.004361 0.000432 0.003024 -0.003435 
+-0.000058 0.003819 -0.005918 -0.002379 0.003572 -0.008335 
+-0.002459 0.002918 -0.007051 -0.001037 -0.000296 -0.002370 
+0.000149 -0.003114 0.003736 0.002370 -0.000428 0.003854 
+-0.000013 -0.000396 -0.001347 0.001264 0.000557 -0.004367 
+0.001173 0.000388 -0.005109 0.000205 0.000205 -0.004344 
+-0.001642 -0.000154 0.000237 0.003235 -0.000257 -0.000782 
+0.005768 0.000223 -0.000560 0.003727 -0.000174 -0.000571 
+0.000232 -0.000248 -0.000409 -0.001315 -0.003413 0.000028 
+-0.001331 -0.000787 0.002997 0.000303 0.000663 0.000553 
+0.000985 -0.001505 0.001254 0.001212 0.000153 -0.001221 
+0.001515 0.003030 0.000000 0.002045 0.000214 -0.001716 
+0.001729 -0.000425 -0.000241 0.001344 -0.002227 -0.000321 
+0.000478 -0.002033 -0.002392 -0.000293 -0.000641 -0.001721 
+-0.000323 0.002301 0.001085 -0.001042 -0.000322 0.005477 
+-0.002587 0.002148 0.003376 0.002518 -0.000994 0.003379 
+0.000540 -0.002391 0.002468 0.002852 0.000979 0.000029 
+0.004885 0.001314 0.000082 0.004237 -0.000209 -0.000814 
+-0.000071 0.001186 0.001966 0.002387 0.002620 0.000903 
+0.002723 -0.000775 0.000662 -0.001280 0.001907 -0.000303 
+-0.002847 0.004893 -0.001560 -0.002771 0.005877 -0.002464 
+-0.001319 0.002920 -0.002974 0.000645 0.000136 0.000558 
+-0.000187 0.000513 0.000039 -0.001653 0.001094 -0.000957 
+-0.000310 0.002815 -0.002130 -0.000274 0.002667 -0.000877 
+0.000086 0.000137 0.000061 0.000061 0.000476 -0.001307 
+0.001790 0.002378 -0.003580 0.001268 0.004926 -0.005687 
+0.001258 0.006217 -0.002628 -0.000097 0.002136 -0.000995 
+-0.000215 -0.001013 -0.000328 -0.000448 -0.000120 0.000696 
+-0.000592 0.001121 0.001845 0.000865 0.002162 -0.000656 
+-0.001240 0.000252 -0.001033 -0.000892 -0.002757 0.000922 
+-0.000238 -0.003056 0.002069 -0.000331 -0.000767 0.000667 
+-0.000611 0.002463 -0.000710 0.000429 0.001113 -0.001815 
+-0.000931 -0.001533 -0.000220 -0.000098 -0.001505 0.002404 
+0.000000 0.000588 0.000882 -0.001599 0.001518 -0.000248 
+-0.003427 0.000339 -0.000616 -0.003108 -0.001250 0.000975 
+0.001649 -0.000571 -0.001466 0.004888 0.001777 -0.007445 
+0.006385 0.001995 -0.008456 0.004834 0.004010 -0.005056 
+0.000730 0.002122 -0.001848 0.001093 -0.000093 0.000296 
+0.001936 0.000949 -0.002909 0.001976 0.001856 -0.001557 
+-0.001975 -0.000025 -0.002173 -0.001005 0.003486 -0.003029 
+-0.000385 0.002692 -0.001692 -0.000791 -0.000880 -0.001158 
+0.002355 -0.001186 -0.000695 0.005473 0.004768 -0.002709 
+0.010873 0.008183 -0.010286 0.007692 0.002900 -0.014163 
+0.001108 0.003923 -0.008550 -0.000454 -0.000798 -0.002151 
+-0.000506 0.000660 0.001913 -0.003245 0.000724 -0.002124 
+0.001841 0.000587 -0.003716 0.000705 0.002980 -0.002867 
+-0.000612 0.000280 0.000542 0.000170 0.003924 0.000154 
+-0.000889 0.001875 -0.001536 -0.000841 -0.001975 -0.003859 
+0.001610 -0.003172 -0.003348 0.003318 -0.000458 -0.000664 
+0.000070 0.002276 -0.002065 -0.000357 0.001520 -0.000535 
+-0.000839 0.000227 0.001372 0.002028 -0.000688 0.002362 
+-0.000302 0.002910 0.002433 -0.002959 0.003746 0.004116 
+-0.001487 0.004974 0.003974 -0.000233 0.000126 0.001011 
+0.003418 0.000889 -0.000340 0.005334 0.002387 -0.002469 
+0.006383 0.003914 -0.001235 -0.000892 0.004890 -0.006212 
+0.002481 0.005420 -0.002481 0.001532 0.002437 0.000736 
+-0.001503 -0.000055 0.003060 -0.000478 -0.000064 0.001649 
+-0.002482 -0.000048 -0.000407 -0.001691 0.001153 -0.002499 
+-0.001061 0.003220 -0.002139 0.003466 0.004063 -0.003864 
+0.003456 0.002733 -0.003190 0.003619 0.000560 -0.001045 
+0.000807 0.000570 -0.000049 0.000293 0.000023 -0.003594 
+-0.002793 0.002510 -0.003781 0.002375 0.003620 -0.001638 
+-0.000362 0.000883 0.001194 -0.000180 0.000252 0.000144 
+0.001194 0.000298 -0.002246 0.000557 0.004058 -0.003342 
+-0.001350 0.001441 -0.001711 -0.000421 0.000789 0.001366 
+0.000158 0.000621 -0.000046 0.004794 0.001298 -0.004229 
+0.003987 0.004317 -0.004850 -0.000580 0.002526 -0.003023 
+-0.003959 -0.002377 -0.003299 -0.006446 -0.002397 0.002157 
+-0.003001 0.000126 0.000832 -0.000427 0.000731 -0.000669 
+-0.000236 0.000116 0.000296 -0.001758 0.000761 0.001597 
+-0.002518 0.001582 0.000123 -0.001089 0.002392 -0.002066 
+0.001174 0.000995 -0.003624 -0.001160 0.003869 0.000608 
+-0.000290 0.002145 -0.000638 -0.001068 -0.001156 0.001779 
+0.000699 -0.000550 0.000283 0.002246 0.003652 -0.001826 
+0.005830 0.008881 -0.003746 0.002762 0.010721 -0.003246 
+0.002950 0.006671 -0.003221 0.001958 0.001242 -0.001472 
+-0.002323 0.001633 -0.000066 -0.000766 -0.000079 0.001916 
+-0.002655 -0.002225 0.000872 -0.000867 0.000501 -0.000772 
+-0.000458 -0.000687 0.000000 -0.000269 0.000116 -0.000257 
+0.000610 -0.000142 0.002848 -0.001526 -0.001286 0.002611 
+0.003802 -0.000438 0.004021 0.000241 0.000851 0.001688 
+-0.000253 0.001504 -0.001609 -0.000156 0.001479 -0.002465 
+0.000133 0.001360 -0.001520 0.004646 0.003086 0.002577 
+0.000213 0.004755 0.001936 -0.000115 0.005867 -0.002320 
+0.000547 0.003469 -0.006117 0.000550 0.002007 -0.005137 
+-0.000691 -0.002499 -0.001402 0.000303 0.000029 0.000526 
+0.000004 -0.002928 0.002912 -0.000152 -0.000219 0.000159 
+0.000224 0.001936 -0.000194 0.000379 0.001894 -0.001515 
+-0.000112 0.000714 0.000736 -0.001294 0.000572 0.001168 
+-0.002207 -0.000003 0.001647 -0.000990 0.000488 0.001596 
+0.001628 0.001143 0.000955 0.002934 -0.001126 0.001831 
+0.003268 -0.003443 -0.000632 -0.003685 -0.003361 0.001295 
+-0.000045 -0.006047 -0.000057 -0.004252 -0.001411 -0.001058 
+-0.000068 -0.001163 -0.000274 0.001859 0.000657 0.000110 
+-0.001398 0.000438 -0.001470 0.000773 0.000223 0.001345 
+-0.002421 0.000429 0.006956 -0.003226 -0.001491 0.003726 
+-0.001696 0.001063 -0.000464 -0.002400 0.000588 0.000273 
+-0.004873 -0.002964 0.001864 -0.006011 -0.003510 0.001135 
+-0.003698 -0.001675 0.000506 -0.001588 0.001822 -0.002880 
+-0.001926 0.001753 -0.002976 -0.001018 0.000204 -0.001018 
+-0.000713 -0.000528 0.001100 0.000116 -0.000042 0.000210 
+-0.001188 0.001382 -0.001243 -0.000905 0.001262 -0.000810 
+0.000987 -0.000864 -0.002409 0.001515 -0.001731 -0.000939 
+0.000364 -0.001091 0.000606 -0.000733 -0.002154 0.001319 
+0.000383 -0.003268 -0.000190 0.002668 -0.001133 -0.003518 
+0.002986 -0.001991 -0.002857 -0.000840 0.000653 -0.001209 
+-0.004263 0.000839 0.000138 -0.002175 0.003158 -0.003003 
+0.000282 0.002695 0.000568 0.002269 0.001673 -0.003044 
+0.001069 0.000998 -0.002852 0.002719 0.000544 -0.002719 
+0.003015 0.001985 -0.000115 0.001831 0.004267 -0.000388 
+-0.000728 0.001970 0.001036 -0.002756 0.001027 -0.000334 
+-0.003459 0.000030 0.000500 -0.001367 0.000689 -0.000542 
+0.001197 0.002825 -0.002054 0.003633 0.004333 -0.002911 
+0.003709 0.001012 -0.003233 0.000122 0.000324 -0.001192 
+-0.001567 -0.000454 0.000972 -0.000573 -0.000408 -0.000329 
+-0.000681 0.000135 -0.003142 -0.001464 -0.000366 -0.005039 
+-0.000508 0.001523 -0.003615 -0.000112 0.000206 -0.002279 
+-0.000194 -0.001642 -0.002614 0.002748 -0.002371 -0.003611 
+0.000583 -0.001227 -0.003479 -0.001358 0.000740 -0.003591 
+0.000054 0.000574 -0.002150 -0.001815 -0.004917 0.000297 
+-0.003438 -0.003326 0.002820 0.001155 -0.000632 0.002353 
+0.001667 -0.003770 -0.000942 -0.000430 -0.004769 -0.001003 
+-0.005049 -0.006583 -0.000041 -0.010057 -0.005672 0.004191 
+-0.008220 -0.002613 0.001816 0.000011 -0.000908 -0.000742 
+0.003444 -0.002349 -0.000628 0.002061 0.000985 0.001030 
+-0.000637 0.000492 -0.000009 -0.004886 -0.002092 -0.000697 
+-0.003586 -0.006604 0.001605 0.000014 -0.005072 -0.000029 
+0.002057 -0.001064 -0.001064 0.003046 0.003967 -0.002914 
+0.002448 0.004139 -0.001545 -0.001077 0.000846 0.000000 
+0.000013 -0.001224 -0.000474 -0.000800 0.000758 0.001094 
+-0.000257 -0.000100 0.000586 0.002275 0.000939 -0.001156 
+0.000076 0.001985 0.000687 0.000362 0.002441 -0.004158 
+-0.002463 0.000739 0.005197 -0.002004 0.002251 0.005050 
+-0.002560 -0.002497 -0.000999 -0.001566 -0.006157 0.001277 
+0.002774 -0.002756 -0.000766 0.004937 0.000480 -0.003027 
+0.003409 0.000222 0.001279 0.003623 -0.002629 0.001279 
+0.003810 -0.000685 0.000535 0.001679 0.000247 -0.000330 
+-0.001098 0.002292 -0.001241 -0.001659 0.001834 -0.001310 
+-0.000402 -0.001597 0.003206 -0.000022 0.000169 0.000160 
+-0.002484 0.002002 -0.000402 -0.001183 0.001303 0.002052 
+-0.000270 0.000902 0.001079 0.001212 -0.000606 0.001970 
+0.001386 -0.000462 0.003561 -0.000797 -0.007091 0.003902 
+0.000438 -0.000206 0.001671 0.004027 -0.001050 -0.003643 
+0.002978 -0.000993 -0.004403 0.001829 0.000261 -0.000803 
+0.000089 -0.000782 0.003325 0.000000 -0.000635 0.004286 
+-0.000171 0.001587 -0.000229 -0.000163 0.001186 -0.001430 
+-0.002273 -0.000227 -0.000682 -0.003043 -0.000330 -0.000689 
+-0.003352 0.000139 -0.002397 -0.002626 0.002130 -0.002922 
+-0.001766 0.001610 -0.001947 -0.001259 0.001670 0.000772 
+-0.000873 0.005389 0.002771 -0.002130 0.004447 0.000375 
+-0.002324 0.003613 -0.002588 0.000125 -0.000078 -0.004891 
+0.001377 0.002232 -0.004092 -0.000796 0.000631 -0.001207 
+-0.000546 -0.001900 0.000266 -0.000216 0.000907 0.001058 
+-0.002143 -0.000113 -0.000565 0.000752 0.001137 -0.001627 
+0.000251 0.000488 -0.000999 -0.000216 -0.000540 -0.001187 
+0.000563 0.002113 -0.002254 -0.000904 0.001206 -0.005282 
+-0.002005 0.005631 -0.003103 -0.000664 0.004331 -0.001607 
+-0.000652 -0.000810 0.000113 -0.000974 -0.002444 0.003058 
+0.000832 -0.002335 0.004275 0.002856 -0.001397 0.004215 
+0.003271 -0.003660 0.003328 -0.001142 -0.006475 0.001528 
+-0.006638 -0.004567 0.000584 -0.003714 -0.001610 0.001656 
+0.000211 0.000438 0.000249 0.001324 0.001245 0.001492 
+-0.000284 -0.000379 0.003435 -0.001212 -0.000265 -0.000417 
+-0.001892 -0.002204 -0.000481 -0.001461 0.000145 -0.000103 
+-0.000489 0.000902 0.000077 -0.000299 0.000283 0.000736 
+0.000148 -0.000078 0.000372 0.000348 -0.000103 0.000115 
+-0.001383 -0.000461 0.001172 0.001361 -0.001716 0.002480 
+0.000831 -0.001121 0.000209 0.000438 0.001971 -0.001752 
+0.001338 0.001801 -0.003589 0.002259 0.000076 -0.002741 
+0.003340 -0.001154 -0.002672 0.001860 0.000000 -0.003721 
+-0.002117 0.001326 -0.004993 -0.000427 0.000000 -0.000119 
+-0.002437 -0.002723 0.002286 0.000406 -0.002534 0.003079 
+0.001372 -0.002779 0.000186 0.002105 -0.000251 -0.000676 
+0.000631 0.001793 0.000604 -0.000078 0.003023 0.000000 
+0.001154 -0.000462 -0.002077 0.002231 0.001542 -0.001148 
+0.004536 0.002560 -0.002146 0.001723 -0.001115 0.000177 
+0.000515 -0.000985 -0.001394 0.001973 -0.001729 0.001165 
+0.002001 -0.000168 0.001610 -0.004525 -0.006335 0.004930 
+-0.002449 -0.005460 0.002547 0.001328 -0.000809 -0.001749 
+0.003488 0.002947 0.000295 -0.001580 0.001262 -0.000492 
+-0.002335 0.000121 -0.003180 -0.001753 0.000608 -0.002138 
+-0.003392 -0.001049 -0.000804 -0.000272 -0.000056 -0.001388 
+-0.000218 0.004361 -0.002613 0.003479 0.006969 -0.003443 
+-0.001111 0.005317 -0.001111 0.001261 0.000103 -0.000654 
+0.002921 0.000369 -0.002428 0.004226 0.002085 -0.002170 
+0.003817 0.000954 -0.000889 0.001507 -0.000044 -0.000887 
+0.001504 0.000451 -0.001429 0.001309 0.002565 0.000796 
+0.000905 -0.000718 0.000790 0.001999 -0.002266 -0.000401 
+0.001852 0.000324 0.001088 0.003194 0.000000 -0.007431 
+0.000922 0.003902 -0.010676 0.001720 0.008494 -0.009380 
+0.001582 0.007511 -0.005544 0.000410 0.003968 -0.000870 
+0.001135 0.000373 0.000665 -0.000562 -0.001292 0.002641 
+-0.001020 -0.001987 -0.001302 -0.002160 0.000417 -0.002507 
+0.002186 0.002302 -0.004691 0.004275 0.000338 -0.005074 
+0.000494 -0.000445 -0.002963 -0.004557 0.001256 -0.000511 
+-0.007108 0.001569 0.002770 -0.004583 0.002328 0.000182 
+0.001594 0.003261 -0.001232 0.003695 0.002662 -0.001682 
+0.001644 0.000216 -0.000783 -0.002109 -0.000004 -0.000002 
+-0.001403 0.000087 -0.001130 -0.001857 0.001269 0.002510 
+-0.004082 0.002788 0.000643 -0.004372 -0.000111 -0.002090 
+-0.001179 0.000852 -0.000490 -0.003988 -0.001335 0.002720 
+0.001659 0.001672 0.000680 0.003077 0.004458 0.001544 
+0.001491 0.003511 0.001639 0.001038 0.000999 0.001028 
+0.000425 0.000213 0.000142 0.003952 0.002577 -0.003174 
+0.003677 0.001778 -0.004104 0.001278 -0.000784 -0.000082 
+-0.003251 -0.002719 -0.000225 -0.001218 -0.005348 0.002831 
+0.001305 -0.001620 0.001073 -0.000512 -0.000445 -0.002605 
+-0.003117 -0.002163 -0.001209 -0.001870 0.001870 0.000076 
+0.002703 0.001874 -0.000929 0.003351 0.001340 -0.003316 
+0.002169 -0.001071 -0.001181 0.002768 -0.001418 0.000308 
+0.003169 -0.002223 0.001751 0.003318 -0.001591 0.000369 
+0.001818 -0.000443 0.000238 -0.000214 0.000050 -0.000209 
+-0.000149 0.000857 0.000552 0.000524 0.001244 -0.000589 
+0.000323 -0.000796 -0.003531 0.002319 -0.002306 -0.003482 
+0.001409 -0.001856 -0.004546 0.000042 0.000085 -0.004859 
+-0.000250 0.000031 -0.003427 -0.000995 0.000671 0.000013 
+-0.000009 0.000845 0.000957 0.000758 -0.000660 0.000079 
+0.000576 -0.002506 0.001930 0.000999 -0.000686 -0.000120 
+-0.000272 0.000217 0.000699 0.000556 -0.000193 0.000749 
+0.000062 -0.000834 0.001428 0.001552 -0.002319 0.000989 
+0.000503 -0.002803 -0.000586 -0.000260 -0.000339 0.000134 
+-0.000487 0.000847 -0.000772 -0.000605 0.000560 -0.000110 
+0.000712 -0.001264 -0.000724 0.000600 0.000341 -0.000762 
+-0.000753 0.001119 -0.001807 -0.001525 0.000835 -0.003957 
+-0.002205 0.002291 -0.000017 -0.000413 0.001731 -0.000129 
+0.002522 0.001255 -0.001907 0.003557 0.002622 -0.004542 
+0.004148 0.002532 -0.006260 0.004029 0.000732 -0.005003 
+0.003684 0.000192 -0.001536 0.001482 0.000031 0.001279 
+0.000979 -0.000969 0.002406 0.000291 -0.002366 0.001018 
+-0.002327 -0.001461 0.000081 -0.003047 0.002109 0.002656 
+-0.000190 -0.001143 -0.000227 -0.000235 0.000924 -0.001154 
+0.001997 0.000827 -0.004529 0.003479 0.003336 -0.004350 
+0.000247 0.003032 -0.002362 -0.000050 -0.000250 -0.000992 
+-0.003684 -0.000111 -0.000025 -0.003893 0.002252 0.000267 
+-0.003138 0.002799 0.002668 -0.000130 0.003155 0.000699 
+0.000159 0.000361 -0.001309 -0.001142 -0.000854 0.000365 
+-0.002464 -0.004541 0.002014 -0.000250 -0.001167 -0.000917 
+-0.001279 -0.000207 0.000192 0.004249 0.000449 -0.002268 
+0.004483 -0.001294 -0.002608 0.000070 -0.000781 -0.001817 
+-0.003217 0.000306 -0.000690 -0.003247 0.000810 0.001244 
+-0.002031 0.002214 0.000514 -0.000363 0.001437 -0.001871 
+0.003247 -0.000530 -0.003711 0.004381 -0.001993 -0.004697 
+0.002575 -0.000646 -0.003035 -0.001127 -0.000141 -0.000141 
+-0.000784 0.000310 0.004885 -0.003048 -0.001478 0.004382 
+-0.000387 0.000892 0.000408 0.002111 0.001365 0.000794 
+0.000675 -0.000198 0.000159 -0.000650 -0.001231 0.000362 
+-0.002106 -0.002783 0.001587 0.000780 -0.001795 0.000271 
+0.000413 -0.001445 -0.001290 -0.000236 0.000943 -0.000942 
+-0.001755 0.001729 -0.001174 -0.000943 0.001639 -0.001935 
+0.000169 0.002580 -0.001345 0.001181 -0.000033 -0.001155 
+-0.003148 -0.003648 0.003478 -0.008240 -0.005886 0.005000 
+-0.004679 -0.006191 0.005586 -0.001980 -0.004696 -0.001657 
+0.001465 0.000290 -0.002945 0.003755 0.001651 -0.002626 
+0.003662 0.000039 -0.002814 0.002068 -0.002895 -0.002932 
+0.001510 -0.003160 -0.003371 -0.003059 -0.001003 -0.001957 
+-0.000571 -0.002855 0.000154 0.000000 -0.000292 -0.000073 
+-0.000310 0.000930 -0.001549 0.000722 0.001915 -0.002415 
+-0.000497 0.002642 -0.001804 -0.001241 0.001241 0.000301 
+0.002030 0.001504 0.003008 -0.002737 0.005474 -0.001579 
+-0.000034 0.006647 -0.003424 -0.000734 0.005660 -0.002013 
+0.000768 0.003360 0.000256 -0.000529 0.001280 0.000794 
+0.001308 0.000212 0.001527 0.001137 0.001398 0.001028 
+0.000208 0.000422 0.000911 0.001887 0.003079 -0.003317 
+0.000512 0.005427 -0.000983 -0.001162 0.004478 0.000608 
+-0.002330 0.004088 0.000198 -0.002558 0.000930 -0.001085 
+-0.002578 -0.001575 -0.002100 -0.003539 -0.000453 -0.000721 
+-0.001550 -0.000071 -0.000460 0.000930 0.000504 0.000504 
+0.002472 0.000089 -0.000793 0.002360 -0.000193 0.000012 
+0.002206 -0.002393 0.001409 0.002783 0.000944 -0.000423 
+0.005212 0.000606 -0.000652 0.004773 0.001564 -0.001279 
+0.003216 -0.000132 -0.000511 0.001741 -0.002352 0.000595 
+0.002321 -0.000350 0.000424 0.001101 -0.000027 0.000716 
+0.001970 0.003333 -0.000985 0.000549 0.001964 -0.003464 
+-0.002500 -0.001800 -0.001257 -0.004871 -0.004854 0.002426 
+-0.004188 -0.005431 0.004980 -0.000842 -0.003750 0.001856 
+-0.000635 0.001423 -0.000617 -0.001261 0.003253 0.000040 
+-0.002988 -0.000527 -0.004130 -0.002183 0.005692 -0.003870 
+-0.001304 0.006286 -0.002026 -0.001835 0.005644 -0.003893 
+0.005980 0.005109 -0.005436 0.000043 0.000840 0.000315 
+-0.001751 0.000391 -0.001993 -0.002489 -0.001172 -0.001067 
+-0.002793 -0.000387 0.001079 0.001964 0.001150 0.000202 
+0.003863 -0.001718 -0.000863 0.004353 -0.000462 0.000726 
+0.001482 -0.000943 0.000449 -0.001807 0.000538 -0.000908 
+-0.004189 -0.002257 0.002013 -0.000737 -0.003686 0.000606 
+-0.002627 0.002537 -0.001388 0.000146 0.000362 -0.004940 
+0.001463 0.002034 -0.000651 -0.000453 -0.000684 -0.001560 
+-0.001569 0.000741 0.000227 -0.001053 0.002090 0.001083 
+-0.001090 0.000611 0.000328 -0.000811 -0.000598 -0.001280 
+0.000857 -0.002706 -0.000721 0.000404 0.000025 0.000707 
+-0.000057 -0.000310 -0.000339 0.001015 0.001188 -0.003985 
+0.001379 0.004743 -0.003859 0.001136 0.002711 -0.000311 
+-0.001318 -0.000501 0.003770 0.002118 -0.005662 0.004235 
+-0.002548 -0.003335 0.002171 0.001988 0.000429 -0.002298 
+0.002877 -0.001380 -0.003112 0.000148 -0.000074 -0.001037 
+0.001368 0.001100 -0.000281 0.002596 0.003505 -0.002271 
+0.004758 0.005394 -0.004473 0.002630 0.004097 -0.007018 
+-0.001207 -0.000617 -0.002435 -0.000043 0.000030 0.000010 
+0.000825 0.001236 0.001305 -0.000310 0.002013 0.001082 
+0.001570 0.001414 -0.000104 -0.000778 -0.001285 -0.002316 
+0.001464 -0.000470 -0.003190 0.000735 -0.000698 -0.001654 
+0.000703 0.000969 0.000627 -0.000542 0.000430 0.002468 
+-0.001682 0.002551 0.002860 -0.002228 0.001895 -0.000042 
+-0.001711 -0.000601 0.000674 -0.000202 -0.000211 0.000437 
+-0.000232 -0.000793 -0.000939 -0.000193 -0.000410 0.000530 
+0.000496 -0.000455 0.002564 0.000352 0.000860 0.001986 
+-0.001088 0.002129 0.000769 -0.001966 0.000846 0.003320 
+0.000233 0.001284 0.004812 0.000000 -0.000155 0.004884 
+0.002533 -0.001756 0.002955 -0.000421 -0.002108 -0.000632 
+0.001514 0.002489 -0.002624 -0.002282 0.001265 -0.004342 
+-0.003497 0.001231 -0.000740 -0.003692 -0.000390 0.000572 
+-0.000420 -0.000382 0.000420 -0.000844 0.000004 -0.000212 
+0.001213 -0.000303 -0.002615 -0.000270 0.000138 -0.000381 
+-0.001763 -0.000055 -0.002036 -0.003074 -0.000414 -0.000692 
+-0.001453 0.001690 -0.001169 -0.000186 0.004039 0.001361 
+-0.000289 0.000196 0.001409 0.003002 0.002971 -0.002756 
+-0.001201 0.000885 -0.000832 -0.000843 -0.000263 -0.007531 
+0.001964 -0.001016 -0.001432 0.000307 0.000236 0.000335 
+-0.002096 -0.000561 0.004328 -0.004180 -0.002599 0.005945 
+-0.002445 -0.002337 0.000691 0.002334 0.000290 0.000700 
+0.002773 -0.001483 0.000949 -0.000053 -0.004060 0.000013 
+-0.001952 -0.003459 0.000390 -0.000872 -0.000057 0.000574 
+-0.000464 0.000638 -0.002263 -0.001151 -0.001916 0.000256 
+-0.001826 0.002636 0.002429 -0.002156 0.001078 0.002109 
+-0.000348 0.002375 -0.000984 0.005258 0.001258 -0.002949 
+0.001938 -0.002943 -0.002090 0.001072 -0.002095 -0.000762 
+0.002857 -0.000697 -0.000034 0.001956 -0.000982 0.001291 
+0.002289 -0.000985 0.000213 -0.000573 0.005222 -0.004329 
+-0.000767 0.004758 -0.003485 -0.001211 0.001516 -0.001364 
+-0.000937 0.000781 -0.000625 -0.001055 -0.000039 -0.001837 
+0.000273 -0.000356 -0.000088 0.001057 -0.001123 -0.000044 
+0.001392 -0.000923 0.002737 0.000202 -0.001101 0.003700 
+-0.000290 -0.000343 0.000630 -0.000406 0.002109 -0.002839 
+0.001728 0.001728 -0.005294 0.002931 0.002466 -0.003862 
+0.001843 0.001390 -0.002263 0.000863 0.001684 -0.000125 
+-0.001965 0.003427 0.001005 -0.001737 0.000434 0.000873 
+0.000000 0.001524 0.000762 -0.001371 0.001841 -0.001038 
+-0.003331 0.002054 -0.001887 -0.002656 0.001797 -0.000937 
+0.000252 0.000523 -0.000843 0.004563 0.001866 0.000119 
+0.002097 0.000061 0.001428 -0.000934 -0.000056 -0.000349 
+-0.001631 0.000900 0.001485 -0.002467 0.001692 0.002336 
+-0.002877 0.001071 0.001749 -0.002467 0.000722 -0.002366 
+0.001223 -0.000547 -0.002950 0.000696 -0.001302 -0.002185 
+-0.000322 -0.000583 -0.001036 -0.000769 0.001734 -0.000144 
+-0.000426 0.002689 -0.000479 0.000914 0.002433 -0.000500 
+0.002326 0.000669 -0.000995 0.001985 0.001069 -0.002137 
+0.001098 0.000360 -0.000229 -0.001524 -0.000661 -0.001313 
+0.000532 -0.001091 -0.000138 -0.002002 -0.002187 0.002913 
+-0.002368 0.002010 -0.000613 -0.000052 0.006332 -0.000864 
+0.000988 0.004742 0.000196 -0.000370 -0.001437 0.002874 
+-0.002779 -0.007488 0.005219 -0.001021 -0.007445 -0.003302 
+0.002039 -0.001835 0.002059 -0.001956 -0.002132 0.001388 
+-0.001201 0.000651 -0.001682 -0.001948 0.003690 -0.003624 
+-0.003701 0.003286 -0.004076 0.000126 0.001566 -0.003096 
+-0.000430 0.001367 -0.001466 -0.000427 0.000886 -0.001227 
+0.001468 0.001933 0.000025 0.001262 -0.001058 0.001299 
+0.000626 -0.001475 -0.000147 0.001722 0.001805 0.000285 
+0.003429 -0.000155 -0.000797 0.003528 -0.001215 -0.004008 
+0.003647 -0.000982 -0.004034 0.001735 -0.002385 -0.002314 
+0.002197 -0.002197 -0.000076 0.000814 -0.004912 0.000683 
+0.002366 -0.003185 0.000455 0.002865 -0.000431 -0.003866 
+0.004451 0.003608 -0.008221 0.010601 0.001056 -0.007855 
+0.004667 -0.001401 -0.007773 0.004724 0.000945 -0.005496 
+0.004475 0.002720 -0.000834 0.000153 -0.000134 -0.000123 
+0.001952 0.001009 -0.001227 0.002511 0.000819 -0.001451 
+0.000371 -0.001311 0.000012 0.000601 -0.002501 0.002138 
+-0.000811 -0.001902 0.001381 -0.000996 0.000516 -0.001434 
+0.000383 0.001530 -0.005100 0.001735 0.000595 -0.006263 
+-0.000258 -0.001442 -0.004090 0.000417 0.003109 -0.002258 
+0.003863 0.005652 -0.005591 0.005565 0.005662 -0.007721 
+0.003000 0.005438 -0.004751 0.000742 0.001922 -0.000647 
+-0.000373 -0.001634 -0.000938 -0.001910 -0.000781 -0.001511 
+0.000901 0.001344 -0.002920 0.000449 0.005386 -0.001769 
+0.002899 0.004600 0.001007 0.002638 -0.000899 0.001094 
+-0.001504 -0.006370 0.001939 -0.003082 -0.003712 0.000786 
+-0.002213 0.003082 -0.002987 0.002052 0.002315 -0.006044 
+0.002300 0.000669 -0.003375 -0.000595 -0.000336 -0.000828 
+-0.000818 -0.003453 0.001453 -0.000397 -0.003175 0.002778 
+-0.000719 -0.000978 0.003335 0.004083 0.000983 0.002950 
+0.001978 0.002019 -0.000339 0.002185 0.000238 -0.001488 
+-0.000547 -0.001094 -0.001368 -0.000983 0.000180 -0.003037 
+-0.001249 0.000608 -0.001789 0.002206 0.003924 -0.000818 
+-0.000185 0.000125 -0.000221 -0.001523 0.001106 0.001988 
+-0.000794 0.000582 -0.000224 -0.001226 0.001250 -0.001771 
+0.000543 0.001785 -0.003485 -0.000971 -0.000049 0.001195 
+-0.004545 -0.000525 0.001944 0.001652 -0.002335 0.002307 
+-0.000318 -0.000682 0.000362 -0.000530 -0.000918 -0.000940 
+-0.003987 -0.001953 0.001099 0.000581 -0.001465 0.000505 
+0.000206 0.001851 0.002316 -0.000956 0.001838 0.001324 
+0.000089 -0.000478 -0.000972 0.001287 -0.001072 -0.001918 
+-0.000893 -0.004292 -0.001872 0.000728 -0.003006 -0.000431 
+0.001190 -0.003080 0.000422 0.001188 -0.002686 0.000365 
+-0.002736 -0.003214 -0.001955 -0.000347 -0.000568 -0.000715 
+0.001102 -0.000605 0.000166 0.002738 0.000187 -0.003228 
+0.001197 0.002594 -0.006185 -0.001900 0.004000 -0.000950 
+0.001788 0.000347 0.000530 0.000148 -0.000519 0.000321 
+-0.002222 -0.000949 0.004119 -0.001190 -0.001572 -0.000563 
+-0.000098 0.000584 0.000007 0.001539 0.003717 -0.000733 
+0.003231 -0.000789 0.001651 0.001661 -0.001235 0.000351 
+0.011344 0.000318 -0.004188 0.009493 0.000413 -0.009810 
+0.003714 0.005152 -0.008244 -0.002753 0.004791 -0.000932 
+-0.002883 0.000738 -0.002486 0.000345 0.001330 -0.000260 
+0.004885 0.004223 0.002511 0.010240 0.000366 -0.000471 
+0.005610 -0.002781 -0.001949 0.005882 -0.000169 -0.001355 
+0.002493 0.002629 -0.001681 0.000127 0.000171 0.000098 
+-0.000680 -0.002396 0.001484 -0.000945 -0.000570 0.001997 
+-0.000253 0.000568 0.000117 0.001452 0.004615 -0.002813 
+0.002791 0.005789 -0.004699 0.002792 0.005144 -0.003612 
+0.000799 0.002083 -0.002579 -0.000444 0.000222 0.000635 
+0.002178 -0.000951 0.000197 0.003969 -0.001080 -0.001621 
+0.003213 0.003104 -0.003853 0.001066 0.003219 -0.006220 
+-0.001387 0.000903 -0.004381 -0.001520 -0.000010 -0.001042 
+-0.002737 -0.000005 -0.000694 -0.002852 0.001272 -0.001463 
+-0.001729 0.001118 -0.001632 -0.000855 0.000171 -0.000625 
+-0.000469 -0.001059 0.001599 0.000326 -0.001251 0.003018 
+0.001427 0.001011 0.002450 0.001378 0.003280 0.002068 
+0.000672 0.003176 0.001970 0.001717 0.002542 0.001431 
+0.002182 -0.000090 -0.000590 0.002320 -0.002799 -0.004362 
+0.000246 -0.003677 -0.003907 -0.002973 0.000748 -0.000411 
+-0.004237 0.002029 -0.001717 -0.005200 0.001827 0.000592 
+-0.004522 0.001770 -0.000262 -0.003219 0.000858 -0.000568 
+-0.001233 0.000822 0.001527 0.001001 0.000065 0.002873 
+-0.000262 0.001905 0.001712 0.000629 0.001332 -0.003313 
+0.001834 0.003826 -0.004256 0.001622 0.002733 -0.003544 
+-0.000115 0.001522 -0.000033 0.001393 -0.001067 -0.001922 
+0.002585 0.000271 -0.002385 0.002180 0.002412 0.000822 
+0.001236 0.002346 -0.001280 0.001332 0.000200 0.001887 
+-0.000025 -0.001802 0.003115 -0.000080 -0.001578 0.003197 
+0.000969 -0.001102 0.000681 0.000104 0.000267 -0.000571 
+-0.000451 -0.001325 0.000907 -0.003995 -0.003821 0.001218 
+-0.000922 -0.001162 0.002726 0.000074 -0.000207 -0.000033 
+0.000121 0.002231 -0.000289 0.002090 0.000000 0.000522 
+0.000217 0.000656 -0.001290 -0.001018 0.001659 -0.003107 
+0.002155 0.004251 -0.002927 -0.000683 0.002439 -0.004049 
+-0.004161 0.002615 -0.000750 -0.004706 -0.002731 -0.000412 
+-0.002730 -0.003103 0.002234 0.001979 -0.000816 0.003220 
+0.004480 -0.003042 0.000594 0.002281 0.002479 0.001427 
+0.002836 0.002579 0.001893 0.000200 0.003092 0.002062 
+-0.001242 0.001742 -0.001055 -0.001044 -0.001056 -0.001311 
+-0.002691 -0.002244 -0.000629 0.003337 -0.001251 -0.000919 
+0.009366 0.000536 -0.003438 0.010244 0.001963 -0.003056 
+0.007119 0.003521 -0.000362 0.001086 0.005707 0.001915 
+-0.001020 0.003501 0.001384 -0.000086 0.000690 0.003030 
+-0.001984 0.000433 0.000712 -0.001882 -0.000753 0.004962 
+-0.001145 -0.001466 0.002931 -0.000191 -0.000590 0.001527 
+-0.000848 -0.000224 0.001377 -0.002677 0.000369 0.000984 
+-0.001589 0.001888 -0.000559 -0.000410 0.001035 -0.000201 
+0.001091 -0.000422 0.001223 0.003252 -0.001084 -0.000350 
+0.004511 0.005011 -0.001420 0.003968 0.008025 0.001039 
+0.004276 0.004128 0.002801 0.006815 0.001110 -0.000586 
+0.000382 -0.000146 -0.001529 -0.000147 0.000038 -0.000911 
+0.000313 0.001528 -0.000313 -0.001844 0.000484 -0.000652 
+-0.000829 -0.001465 -0.000053 -0.000022 -0.002688 0.001551 
+0.001034 -0.001304 0.001603 0.000690 0.001275 0.000818 
+-0.000523 0.002639 -0.000921 -0.001353 0.004349 -0.002883 
+-0.001105 0.004924 -0.004091 0.004017 0.001862 -0.003139 
+0.009665 -0.000917 -0.000366 0.013191 -0.002964 -0.002114 
+0.009791 -0.001745 -0.001162 0.003301 0.000378 -0.001678 
+-0.000461 0.002344 -0.002371 -0.000739 0.004163 -0.001179 
+0.000388 0.004333 0.002858 0.002688 0.006147 0.000770 
+0.000066 0.002618 0.000972 -0.000318 0.000642 0.000435 
+-0.000479 0.000742 -0.001069 -0.000239 0.000690 -0.001700 
+0.001446 0.000043 -0.001139 0.000518 0.000867 -0.000839 
+0.002356 0.002490 -0.002001 0.004461 0.004426 -0.003363 
+0.006343 0.003032 -0.003162 0.001966 0.002003 -0.000030 
+-0.001249 -0.001729 -0.000232 -0.001728 -0.000346 0.000290 
+0.000767 -0.000653 -0.000130 -0.000573 0.000188 -0.000509 
+-0.000584 0.000042 -0.000998 0.001075 -0.000315 0.000508 
+0.004008 0.002521 -0.000802 0.001948 0.005015 -0.001575 
+0.001945 0.001011 -0.001389 -0.003333 -0.000073 0.000622 
+-0.002281 0.001274 0.001206 -0.000246 -0.000909 0.000520 
+0.000839 -0.000419 -0.002419 -0.001462 -0.001229 -0.002570 
+-0.002278 -0.003301 -0.002717 -0.001168 -0.001787 -0.002234 
+0.000647 -0.002044 0.003300 0.002332 -0.000176 0.002135 
+0.000491 0.000203 0.000394 0.000000 -0.000149 -0.002688 
+-0.004421 0.000411 0.002867 -0.003056 -0.000458 0.001545 
+0.001285 -0.000321 -0.000370 0.000711 -0.002998 -0.000155 
+0.001485 -0.001834 -0.001048 0.001325 -0.000207 -0.002229 
+0.003741 0.002390 -0.006443 -0.000630 -0.000877 -0.001030 
+-0.001499 0.003304 -0.004111 0.000521 0.001224 0.000189 
+0.000677 -0.000137 0.004547 0.001610 0.000924 0.004889 
+0.003631 0.003182 0.001461 0.003561 0.003864 -0.003561 
+0.002747 0.002588 -0.005362 0.002662 -0.000934 -0.003269 
+0.003796 0.001752 -0.001460 0.001685 0.002165 -0.001605 
+-0.000359 0.000205 0.000000 -0.003799 -0.001335 0.002500 
+-0.004405 -0.002468 0.002074 -0.002761 -0.000345 -0.000790 
+-0.001550 0.001033 -0.002628 -0.001255 0.002490 -0.000225 
+0.002160 0.001279 0.002240 0.000347 -0.001390 -0.002047 
+-0.000915 -0.000597 -0.002517 -0.000794 0.002511 -0.003262 
+0.005083 0.000718 -0.002391 0.003668 0.002107 -0.000459 
+0.002414 0.001765 0.000098 0.000418 0.000289 0.000389 
+-0.000796 -0.002026 0.001957 -0.001608 -0.004633 0.001994 
+-0.005618 -0.002553 -0.001760 -0.002156 -0.002700 -0.003783 
+0.004929 -0.001953 0.005020 0.012077 -0.001720 0.008834 
+0.018192 -0.007472 0.001014 0.904255 -3.239362 0.585106 
+0.741463 -3.224390 0.146341 0.005364 -0.022804 -0.003991 
+0.001068 -0.011029 -0.002934 0.000075 0.000679 0.001197 
+0.002832 0.006935 0.004394 -0.001418 0.005440 0.001950 
+-0.000129 0.000997 0.001395 -0.000957 -0.000924 -0.002354 
+-0.000205 0.000000 -0.002945 -0.000400 -0.000190 -0.001923 
+0.000147 -0.001805 -0.000713 -0.000481 -0.000179 -0.000134 
+-0.000755 -0.000302 0.000584 0.000132 0.000716 -0.000522 
+0.001293 0.001102 -0.000373 -0.002912 0.001932 -0.000294 
+-0.000239 0.000227 -0.003976 -0.001423 -0.000210 -0.002737 
+0.000625 -0.001591 -0.001454 -0.000619 0.000579 -0.000507 
+-0.001075 0.001564 0.001742 0.003163 0.006399 -0.003039 
+-0.001457 0.001672 -0.001278 0.001982 -0.001082 -0.000902 
+-0.001057 -0.000060 -0.000587 -0.002417 -0.002222 0.000161 
+-0.001310 -0.004450 0.002837 0.002420 -0.003146 0.005565 
+0.002687 0.000304 0.002558 -0.000910 -0.000639 -0.000494 
+-0.001176 -0.002178 0.000229 0.002042 -0.000994 0.000318 
+0.003253 -0.002910 0.000080 0.000561 -0.000937 0.002899 
+0.001096 0.000987 0.001974 -0.002051 0.001322 0.000066 
+-0.003556 -0.001852 -0.000582 -0.000582 -0.001265 -0.001995 
+0.004426 0.001539 -0.001827 0.005242 0.002212 -0.002394 
+0.000039 -0.000023 -0.001579 -0.000808 0.000458 0.000572 
+0.001199 0.000425 0.000640 0.002972 -0.000053 -0.001776 
+0.001676 -0.003473 -0.002720 -0.001772 -0.002849 0.000024 
+-0.000746 -0.001504 0.000569 0.000395 0.001328 0.000537 
+0.002155 0.001960 -0.000953 0.002266 0.001151 -0.000910 
+0.002877 0.001216 -0.000570 0.005312 0.002379 0.000872 
+0.002964 0.001183 0.002831 0.000167 -0.001157 -0.000963 
+0.000049 -0.003549 0.001246 -0.005352 -0.003118 0.002194 
+-0.004569 -0.003583 -0.001873 -0.004044 -0.005071 0.000605 
+-0.006014 -0.005093 0.003480 -0.005000 0.000075 0.000000 
+0.000814 0.000126 -0.000223 0.004078 0.003273 -0.003706 
+0.004147 0.004924 -0.002151 0.002069 0.002679 0.000406 
+-0.001295 0.002446 0.000000 -0.002369 0.000202 0.000330 
+-0.003513 -0.003291 -0.002796 -0.005925 -0.001059 -0.001489 
+-0.003971 -0.009468 0.003561 -0.002129 -0.007711 -0.002541 
+-0.010128 0.004468 -0.013027 -0.001141 0.011192 -0.006103 
+0.017266 -0.015015 0.016648 3.009346 -3.219626 2.299065 
+3.162996 -3.841410 2.061674 2.386364 -3.977273 1.085227 
+0.012967 -0.002621 -0.008352 -0.003549 0.000668 -0.004044 
+0.000613 -0.001096 0.006484 0.004941 -0.005483 0.006568 
+0.003217 -0.000228 0.003790 -0.002226 0.000192 0.000214 
+-0.002862 0.000757 0.003432 -0.000792 0.002474 0.001975 
+-0.000665 0.001189 -0.000421 0.001198 -0.001373 -0.000050 
+0.000819 -0.003386 0.000388 -0.000034 0.000737 0.000598 
+-0.005597 0.000696 0.003290 -0.004274 -0.001257 0.001821 
+-0.004545 0.001183 -0.001972 -0.000192 0.000921 0.000414 
+0.000692 0.003242 -0.004128 -0.000063 -0.000354 -0.003021 
+-0.003163 0.003600 -0.003097 0.000725 0.003607 -0.005473 
+-0.002510 0.001749 -0.004092 -0.001404 0.004518 -0.000767 
+0.000298 0.000716 0.000323 -0.001311 -0.002102 -0.001928 
+-0.000179 -0.006705 0.001890 0.000859 -0.003913 0.001699 
+-0.000882 -0.001195 0.002024 0.000103 0.000554 0.005260 
+0.001498 0.001250 0.002677 -0.000571 -0.002613 -0.000267 
+0.001857 -0.001111 -0.000507 0.001311 0.000803 -0.002982 
+0.000671 0.000100 -0.001227 0.001250 0.000812 0.001625 
+0.003665 0.002850 0.000635 0.005587 0.002793 -0.002645 
+-0.006073 -0.002402 -0.001512 0.000921 -0.000987 -0.003735 
+0.006169 0.000976 -0.003388 0.006688 -0.000612 -0.000997 
+0.001514 -0.000960 0.000466 0.000092 0.000006 -0.000577 
+0.002367 -0.000129 0.000603 0.000718 0.001057 0.001259 
+-0.000013 -0.001191 -0.001016 -0.001448 -0.001276 -0.001597 
+-0.001274 0.000895 0.000543 -0.002379 -0.000212 0.004672 
+-0.003895 -0.002463 0.002205 -0.001388 0.000686 0.000750 
+0.003034 0.002955 -0.000245 0.003667 0.002727 0.000439 
+0.001148 0.001258 0.002269 0.000645 -0.003016 0.007554 
+-0.006984 -0.002937 0.004048 -0.001120 0.000536 0.001608 
+0.000159 -0.000366 -0.001950 -0.000480 -0.000432 -0.000864 
+0.002806 0.002105 -0.000317 0.001150 0.003437 0.003196 
+0.001388 0.000578 -0.000449 0.002750 -0.000759 0.000176 
+0.002417 0.001504 0.000793 0.005432 0.002189 0.000145 
+0.004369 0.001640 0.000411 -0.001707 0.001549 0.000409 
+-0.006194 0.001072 -0.002427 -0.008079 -0.005086 -0.003442 
+-0.003520 0.001516 -0.003508 -0.003795 0.001267 -0.005060 
+0.009470 0.003892 -0.009815 0.012057 -0.010302 0.004932 
+2.829670 -2.659341 1.500000 3.958333 -3.696970 2.511364 
+4.280303 -4.087121 2.981061 4.102564 -4.217949 3.038461 
+0.021152 -0.021476 0.023713 0.027011 0.010055 -0.010515 
+0.004046 0.016084 -0.001757 0.002328 0.004433 0.006209 
+0.002429 0.006222 0.001065 0.003876 0.006540 -0.005948 
+-0.000277 0.001105 -0.000516 0.000662 -0.004352 0.005499 
+0.001683 -0.005175 0.003679 0.001901 -0.003250 0.000411 
+0.002008 -0.002006 -0.000083 -0.000658 0.001069 0.000125 
+-0.004333 0.004683 -0.001367 -0.000145 0.001239 0.004587 
+0.000655 -0.000638 0.002206 -0.000131 -0.003959 0.001678 
+-0.000503 -0.002570 0.004831 -0.002483 -0.000038 -0.001383 
+-0.001165 0.002326 -0.000646 0.002504 0.003800 -0.003068 
+0.002135 0.003648 -0.002451 -0.000322 0.002441 0.000462 
+-0.002079 -0.000231 0.001593 -0.002735 -0.001123 -0.000545 
+-0.001893 -0.001650 -0.002691 -0.000316 -0.001294 -0.000006 
+-0.003052 0.004371 0.003485 -0.003571 0.006831 0.003664 
+-0.003229 0.003546 0.000881 -0.000801 -0.000953 -0.002148 
+0.000989 -0.003111 -0.001143 0.001801 -0.002164 -0.000477 
+0.001551 0.002336 -0.000121 0.000785 0.003337 -0.004129 
+0.000371 0.003163 -0.005760 0.002855 0.000988 -0.001839 
+-0.000935 -0.003165 0.004101 -0.001594 -0.004398 0.002101 
+-0.001642 -0.004077 0.000276 -0.000827 -0.004097 -0.000628 
+0.001695 -0.001186 -0.000169 0.003114 0.001894 0.001305 
+-0.000273 0.001616 0.002925 -0.004640 -0.001272 0.001088 
+-0.003689 0.000628 -0.000570 0.000800 -0.000685 -0.000816 
+0.002720 -0.001364 -0.001371 0.000649 -0.000362 -0.000239 
+-0.004651 -0.000115 -0.000746 -0.005855 0.000263 -0.000901 
+-0.002500 0.004236 -0.000303 -0.000703 -0.000184 -0.000345 
+-0.001971 0.000989 0.004153 -0.003334 0.002426 0.006803 
+-0.005315 0.000182 0.005787 -0.000332 -0.001362 0.000205 
+-0.000369 0.000361 0.000170 0.002103 0.000880 -0.000534 
+0.002705 0.001528 0.002582 -0.000458 0.001258 0.000381 
+-0.001793 0.002947 0.005701 -0.000449 0.001610 0.003887 
+0.003408 -0.001133 -0.000902 0.004080 -0.001868 -0.002055 
+0.002062 0.000604 0.000190 0.000573 0.003634 0.002630 
+-0.002891 0.002962 0.000867 -0.005978 -0.002529 0.000613 
+-0.007474 -0.000130 -0.003068 0.004995 0.006647 -0.001047 
+0.004701 -0.000845 0.004466 0.017627 -0.012642 0.001954 
+0.020451 -0.024940 0.008427 2.954545 -2.818182 1.829545 
+3.378378 -2.871622 2.628378 0.031787 -0.016176 0.029088 
+0.016384 -0.015971 0.028926 0.010387 -0.002120 -0.001816 
+-0.003692 0.003019 -0.007320 0.001355 0.005705 -0.000583 
+0.000319 0.003421 0.001084 -0.000256 0.000136 0.001069 
+0.000825 -0.000404 0.000892 -0.000349 -0.005234 0.003628 
+0.002652 -0.001601 0.002371 0.000608 -0.000390 0.000745 
+-0.000085 0.004214 0.000871 0.003048 0.007288 -0.000831 
+-0.003415 0.004268 -0.001992 -0.004694 0.001417 -0.000655 
+-0.004921 -0.004354 0.002322 -0.003776 -0.002626 0.010134 
+-0.003647 0.001445 0.000715 -0.006872 -0.004695 0.006985 
+-0.004511 -0.000537 0.003243 0.000037 0.001503 0.000394 
+0.001650 0.001476 0.002384 0.001013 0.000569 0.002490 
+-0.000120 -0.000300 -0.000120 0.000349 -0.001852 0.000256 
+-0.000171 -0.001865 -0.000367 -0.000235 -0.000105 -0.000529 
+-0.001903 0.001379 -0.000961 -0.002703 0.001848 -0.002581 
+-0.000491 0.001377 -0.005314 -0.000206 -0.000221 -0.002453 
+-0.000072 -0.000216 0.003520 -0.000625 0.002332 0.004563 
+0.001672 0.000890 0.001569 0.001015 0.005087 -0.007139 
+0.004265 -0.000801 -0.007533 -0.002324 -0.003175 0.001404 
+0.002938 -0.001062 -0.000970 0.003833 0.001348 -0.000933 
+-0.000239 -0.000790 -0.000040 -0.001930 -0.002439 -0.000237 
+0.002377 0.003101 -0.002185 -0.000395 0.007693 0.004734 
+0.002387 0.008045 0.006836 0.001049 0.005079 -0.001683 
+-0.001882 0.002171 -0.004090 -0.002797 0.002259 -0.003605 
+0.002352 -0.000192 0.001032 0.003562 -0.001476 0.001043 
+0.001286 -0.002597 -0.001120 -0.000613 -0.000473 -0.001272 
+-0.000526 0.002119 0.000224 0.000117 0.000125 0.002857 
+0.000853 -0.002444 0.005402 -0.003107 -0.000276 0.003555 
+0.000930 0.000864 0.000354 0.002331 0.004135 -0.002791 
+0.000855 0.003596 -0.000381 0.003169 0.000971 0.001705 
+-0.000382 0.002445 0.003450 0.002784 -0.000342 0.006925 
+0.003920 -0.000673 0.002643 -0.001972 -0.003244 -0.000089 
+0.000309 -0.005360 0.000824 0.000369 -0.001600 0.000246 
+-0.002244 0.003846 -0.000547 -0.002414 0.005747 -0.001040 
+-0.001745 0.002368 0.000754 -0.001091 0.000512 -0.000266 
+-0.002048 0.002510 0.000399 -0.002505 0.011694 -0.004327 
+0.003173 0.005396 0.002665 0.011362 -0.000245 0.000202 
+0.007290 -0.009103 0.002836 0.004591 -0.006449 0.008333 
+-0.001670 0.000786 0.000841 -0.001322 0.014754 -0.007058 
+-0.003873 0.004976 -0.001956 -0.003341 0.001890 0.003667 
+-0.002374 -0.002226 0.003834 0.000413 0.001987 0.000287 
+-0.003648 -0.000199 0.004193 0.001649 -0.001825 0.006735 
+0.000414 -0.000276 0.000000 0.002013 -0.000922 -0.001167 
+0.002862 -0.002287 -0.002261 -0.000332 -0.000150 -0.000381 
+-0.003214 0.003928 -0.002785 0.000351 0.000234 -0.003680 
+-0.000143 0.001793 -0.000765 0.000140 -0.003846 0.002482 
+-0.000336 -0.005491 0.005780 -0.006642 -0.004780 0.002109 
+-0.001602 -0.005696 -0.000532 -0.001680 -0.001797 -0.001680 
+0.000255 0.003156 -0.001120 -0.002905 0.003389 -0.001393 
+0.001582 0.004888 0.002420 0.004983 0.001654 -0.000397 
+0.003576 0.000981 0.001753 0.001277 0.002379 0.002835 
+0.000768 0.002394 0.001894 -0.000434 0.001298 -0.001013 
+0.003899 0.003856 -0.002871 0.006968 -0.001675 -0.004852 
+0.003845 -0.002752 0.001556 -0.001190 -0.005893 0.004080 
+-0.000638 -0.004058 0.000143 0.001977 0.000213 -0.000249 
+0.003003 0.002822 -0.004397 0.000284 0.000867 -0.004183 
+-0.005364 -0.000982 -0.002395 -0.006210 -0.006492 -0.001553 
+0.000515 -0.000764 -0.004550 0.003736 0.002741 0.001290 
+0.000060 -0.004179 -0.000167 -0.003091 -0.006965 0.000747 
+-0.000099 -0.001182 0.000224 0.002598 0.008360 -0.003690 
+-0.001191 0.007089 -0.007444 -0.003959 0.004014 -0.002868 
+-0.002964 0.001419 -0.002588 -0.002393 0.000312 -0.000900 
+0.003095 0.003971 -0.001960 0.006584 0.004615 -0.005605 
+0.002676 0.000666 -0.006009 -0.001442 0.001521 -0.002386 
+-0.000092 0.000322 0.000407 0.000410 -0.000418 0.002301 
+-0.000578 -0.001142 0.003538 0.000771 -0.001557 0.003105 
+0.001859 0.000499 0.000173 0.000662 0.001331 -0.001824 
+-0.000542 0.001881 -0.004391 -0.001631 0.002600 -0.002880 
+-0.002859 0.001577 0.003082 0.003120 0.001704 0.006326 
+0.005441 -0.002929 0.001105 0.003988 -0.004356 -0.003131 
+0.003508 0.002821 -0.001153 0.000168 0.001880 -0.002224 
+0.000357 -0.000257 -0.000324 0.000465 -0.001304 0.000716 
+0.002193 0.000418 0.000989 0.000453 0.000380 0.000755 
+0.008179 0.005905 -0.009264 0.000587 0.004681 0.002785 
+0.006623 0.001895 0.001681 0.004280 0.002239 -0.005953 
+0.000473 0.001370 -0.007059 -0.002211 0.000507 -0.004610 
+-0.000064 -0.000269 0.000977 -0.000733 0.000270 0.002489 
+-0.001317 0.000300 0.001319 -0.000903 -0.001722 0.000887 
+0.001013 -0.003490 0.004104 -0.002479 -0.001337 0.009946 
+-0.000231 0.005814 0.007618 0.001076 0.002781 0.001204 
+-0.000596 0.000329 -0.000395 0.001854 -0.003420 -0.005439 
+0.000341 -0.003291 -0.004174 -0.000229 -0.001203 -0.001514 
+-0.004674 0.000327 -0.000896 -0.005269 0.000541 -0.001621 
+-0.001784 -0.001156 -0.002819 0.001695 -0.002644 -0.005288 
+0.005051 -0.002512 -0.005079 0.002621 -0.005507 -0.005036 
+0.001816 -0.005307 -0.000128 0.001093 -0.004373 0.001093 
+-0.001704 -0.001200 0.000568 0.001318 0.001220 0.002051 
+0.002619 0.000890 -0.002060 0.000113 -0.000169 -0.001301 
+-0.001173 0.001144 0.001150 -0.005015 0.002607 0.004785 
+-0.002501 0.003822 0.003295 0.001562 -0.001051 0.001217 
+0.007463 -0.001493 -0.006905 0.003858 -0.005259 -0.003254 
+0.001736 0.000747 0.000149 -0.003427 -0.001468 -0.001678 
+-0.006559 -0.004112 0.002099 -0.000312 0.000694 -0.000367 
+0.001331 0.001597 -0.003660 -0.003095 0.000713 0.001940 
+-0.004428 -0.006644 0.000741 -0.007080 -0.004154 0.001170 
+0.002422 0.002943 -0.001494 0.000133 0.000595 -0.000087 
+-0.002528 -0.002834 0.000906 -0.001233 -0.002479 0.000963 
+0.002418 0.003669 0.000742 0.002400 0.000899 -0.003058 
+-0.000510 0.003151 -0.003200 -0.002308 0.001500 0.001038 
+-0.002764 0.002033 0.000321 -0.001260 0.000732 0.000388 
+0.003118 0.000940 -0.003326 0.006233 0.002071 -0.005911 
+0.006649 0.001603 -0.005362 0.004864 0.003872 -0.002391 
+0.001648 0.000666 -0.001294 -0.000540 -0.000752 0.000591 
+-0.000119 0.002355 0.002212 0.000864 0.003935 0.001265 
+0.001222 0.002602 -0.002083 -0.002138 0.000067 0.001353 
+-0.005084 -0.002002 0.003451 -0.003148 0.001836 0.002188 
+-0.000573 0.001656 0.000701 0.002197 -0.000396 -0.000324 
+0.002419 0.000597 0.001880 -0.002122 -0.003388 0.000567 
+0.000809 -0.002728 0.001459 -0.000501 0.003667 -0.001878 
+0.000422 0.004597 -0.003694 0.003446 0.000512 0.000505 
+0.003713 -0.003389 0.001929 0.004312 -0.000934 -0.004706 
+0.001235 0.004712 0.001337 0.001420 0.000512 0.001846 
+-0.000441 -0.002482 0.011136 -0.000631 -0.015137 0.011538 
+0.000248 -0.013388 0.010953 0.004367 -0.000623 0.002735 
+-0.003703 0.005384 -0.001322 0.000286 0.001338 0.002598 
+-0.001325 -0.003293 0.003360 0.002413 -0.004135 -0.000689 
+-0.000082 -0.001797 0.002182 -0.002670 -0.000642 0.002329 
+-0.006217 0.002353 0.001870 -0.004920 -0.000199 -0.001197 
+-0.001747 -0.000416 0.000591 0.001834 -0.001327 -0.001859 
+-0.000563 0.001001 -0.002109 -0.003221 0.003509 -0.002227 
+-0.003025 0.001293 -0.000751 -0.002354 0.000615 0.000832 
+-0.002302 -0.006815 -0.002425 0.002469 -0.005687 -0.001942 
+0.007133 -0.001516 -0.007351 0.004869 0.001186 0.001447 
+0.001072 -0.001423 0.000143 -0.005205 -0.002875 -0.000280 
+-0.006268 -0.001574 -0.000547 -0.000805 0.002945 -0.000494 
+0.002175 0.002615 -0.004460 0.003448 -0.001530 0.001821 
+-0.001625 -0.005581 0.001713 -0.000044 -0.002346 0.005377 
+-0.002179 0.001304 0.001647 -0.003197 -0.000884 0.000439 
+-0.000445 -0.002898 -0.001873 0.001458 0.001884 -0.007324 
+0.001591 0.000413 -0.008141 0.002178 0.002495 0.002009 
+-0.006135 0.000339 0.005745 -0.009068 -0.005447 0.008292 
+-0.008251 -0.001216 0.000120 -0.002124 0.000000 -0.001062 
+0.003606 0.004001 -0.003315 -0.000278 0.002021 0.000578 
+0.000895 0.000163 -0.000088 -0.000944 0.008024 0.001121 
+0.000910 0.004096 -0.000719 0.003959 0.000658 0.001069 
+0.004758 0.001073 0.001381 0.000894 0.002549 0.000910 
+-0.001821 0.002251 -0.000719 -0.005259 0.002711 0.000375 
+-0.002020 0.001882 0.000657 -0.001538 0.000612 -0.004473 
+0.004012 0.004037 -0.003439 -0.001373 0.001911 0.000164 
+-0.000956 0.002604 0.000535 -0.001006 0.001899 0.000315 
+0.001185 0.000595 -0.000596 0.002048 0.003099 0.002153 
+0.001302 0.004404 0.002933 -0.000251 0.002884 0.000816 
+0.000961 -0.000839 -0.001106 0.000118 -0.004974 0.001958 
+0.001046 -0.006821 0.002692 0.003254 -0.002646 0.002205 
+0.000885 -0.002448 -0.001834 0.000683 -0.002444 -0.001605 
+-0.004712 -0.003826 0.001153 -0.008059 -0.006066 0.009555 
+-0.008417 0.004634 0.003707 0.000000 0.010640 0.000800 
+0.010261 0.006981 -0.001429 0.004015 0.004061 -0.005472 
+-0.000096 -0.003057 0.000356 -0.005469 -0.005080 -0.000592 
+0.000016 -0.000896 -0.000276 0.000582 -0.005202 0.009051 
+-0.004795 -0.014275 0.015927 -1.117347 -2.474490 1.627551 
+-1.534091 -2.880682 1.840909 -0.018176 -0.013586 0.021543 
+-0.005349 -0.006081 0.011198 0.002565 -0.002039 0.001684 
+-0.000725 -0.005633 -0.001747 -0.001818 -0.003127 0.002852 
+-0.003348 -0.002171 0.001578 -0.004140 -0.000757 -0.001234 
+-0.003793 -0.000078 -0.000817 -0.000821 0.000784 -0.000748 
+-0.000703 -0.000324 0.000978 -0.001438 -0.000678 0.003522 
+-0.000780 0.000554 0.004692 -0.001197 0.000696 0.002547 
+-0.000275 -0.000296 0.000350 -0.001457 -0.001106 0.001158 
+-0.002070 -0.000383 -0.001071 -0.000639 -0.004539 -0.002534 
+0.000154 -0.001181 -0.002070 0.000360 0.000096 0.000219 
+-0.002007 0.000702 -0.001418 -0.005204 0.003009 -0.002853 
+-0.003928 0.004390 -0.004515 -0.000336 0.003509 -0.004679 
+0.002865 0.000837 0.000221 0.002621 -0.005030 0.002692 
+0.001907 -0.006421 0.003309 -0.000619 -0.003711 0.001980 
+-0.002162 0.002020 0.001117 0.000281 0.003891 -0.003422 
+0.001663 0.003467 -0.002829 0.003128 0.000205 -0.001667 
+0.000231 0.000347 -0.000150 -0.001460 0.002247 0.000636 
+-0.000784 0.003093 0.001912 0.001202 0.000960 0.000038 
+0.000762 -0.001245 -0.002793 -0.000717 0.000145 -0.003995 
+0.000846 0.002073 -0.003090 -0.000293 0.000289 -0.000782 
+0.000395 0.003189 0.003957 0.002976 0.001001 0.000283 
+0.003056 0.000278 0.000278 0.001639 0.000920 0.001101 
+-0.000647 -0.000802 -0.000431 -0.002419 -0.002071 -0.001266 
+-0.003282 -0.000332 -0.001304 -0.001739 -0.001766 -0.000065 
+-0.000668 -0.001589 -0.000283 -0.000912 0.000086 -0.000182 
+-0.001359 -0.000239 -0.002297 -0.000903 0.000391 -0.000597 
+-0.000405 0.001086 0.002368 0.000657 0.002609 0.003376 
+-0.001663 0.002249 0.005330 0.000048 -0.003370 0.004266 
+-0.001207 -0.006823 0.004986 -0.001293 -0.008691 0.003912 
+-0.003660 -0.003816 0.002414 -0.001750 -0.001679 0.001375 
+0.000865 -0.002220 0.001054 -0.001348 -0.001509 0.000268 
+0.000207 -0.001325 0.001698 -0.004156 -0.004149 0.001372 
+-0.002281 0.001141 0.002815 0.000000 0.005462 0.005769 
+0.009749 0.014799 0.006106 -0.001100 0.011113 0.012463 
+0.003678 0.003340 0.002637 0.001937 -0.004442 -0.001599 
+-0.002842 -0.004043 -0.000451 -0.007034 0.000931 0.000035 
+0.002745 -0.006799 0.015878 -0.014300 -0.011831 0.022229 
+-1.395122 -2.492683 1.951220 -2.012397 -3.719008 1.462810 
+-2.444882 -4.393701 1.098425 -2.385593 -4.173729 0.864407 
+-1.569307 -3.089109 0.806931 -0.007485 -0.015482 0.002682 
+0.003654 -0.005971 0.001354 -0.005179 0.000550 -0.000436 
+-0.000779 -0.004673 -0.000963 -0.008104 0.002324 0.002018 
+0.000920 0.004725 -0.001617 -0.000084 0.009160 -0.000630 
+0.000194 0.007661 -0.000871 -0.000511 0.001707 0.002473 
+-0.002575 -0.001355 0.002304 -0.001268 -0.003319 0.000149 
+0.000912 -0.002847 -0.001639 -0.002100 0.001663 -0.001039 
+-0.001583 0.001226 -0.004009 -0.000891 0.002280 -0.002438 
+0.000818 -0.000182 -0.000364 0.001651 0.000092 0.001560 
+0.005556 0.002037 -0.000185 0.004711 0.005165 -0.000496 
+0.000378 0.002864 -0.000316 -0.002241 -0.003793 -0.001222 
+0.001047 -0.009076 0.006282 -0.003607 -0.007705 0.006230 
+-0.001387 -0.003787 0.004107 -0.003412 -0.003990 0.003469 
+-0.006251 -0.005428 0.004938 -0.006579 0.000188 0.001880 
+0.000781 0.000899 0.000961 0.002181 0.002344 0.001527 
+0.000809 0.000731 0.000446 -0.001200 -0.000117 -0.000187 
+0.001429 0.000606 -0.001623 0.003990 0.002620 -0.004447 
+0.002287 -0.000069 -0.004229 0.000835 -0.001878 -0.001200 
+-0.005239 -0.001645 0.001277 -0.001719 -0.005448 0.003624 
+-0.002015 -0.000775 0.001450 0.003389 0.003711 -0.006910 
+0.004747 0.003152 -0.008937 0.000981 -0.000375 -0.003813 
+-0.001143 -0.000504 -0.001724 0.003337 -0.000844 -0.001966 
+0.009843 0.005918 -0.006358 -0.000349 0.004784 -0.000051 
+0.001197 -0.000037 0.000876 -0.001333 0.000000 0.001000 
+-0.000064 0.000629 -0.002592 -0.001381 -0.000971 -0.004416 
+-0.000908 -0.003385 -0.001815 0.001664 -0.000897 0.001041 
+0.002587 0.001837 0.001694 0.000651 -0.000630 -0.000714 
+-0.002179 -0.005659 0.000039 -0.003689 -0.006328 0.002590 
+-0.002808 -0.003222 0.003003 -0.001033 -0.000740 0.001735 
+-0.000417 0.000025 -0.000123 -0.000573 -0.000978 -0.001694 
+-0.004871 -0.005268 -0.001267 -0.004775 -0.006357 0.002729 
+-0.002190 0.001759 0.001753 0.009890 0.002476 0.005951 
+0.012156 -0.003419 0.002510 0.015911 -0.008965 -0.002906 
+0.009888 -0.015342 -0.006005 0.002564 -0.014223 -0.003042 
+-0.001713 -0.006220 0.000233 -0.003564 0.007925 0.003269 
+0.000395 0.018045 0.019254 -0.006205 0.008003 0.029038 
+-2.077844 -1.808383 2.371258 -3.008621 -4.668103 1.120690 
+-3.260417 -5.666667 0.208333 -3.262976 -5.678201 -0.217993 
+-3.025974 -5.173160 -0.606061 -0.012877 -0.029061 0.016174 
+0.000783 0.001154 -0.001807 0.002235 0.004176 -0.001219 
+0.000509 -0.004783 -0.000791 -0.003727 -0.001859 0.001121 
+-0.002548 0.009188 -0.002294 -0.002743 0.007962 -0.004909 
+-0.002070 0.003962 -0.003885 0.000914 0.002273 -0.003854 
+0.004367 0.000787 -0.005090 0.004747 0.001380 -0.003207 
+-0.000457 0.000279 0.000579 -0.004865 -0.002919 0.001121 
+-0.004465 0.002893 0.000786 -0.001207 0.003262 -0.002185 
+0.004022 -0.003379 -0.001290 0.010255 -0.003346 -0.005467 
+0.010118 0.000431 -0.007678 0.007239 -0.001529 -0.003894 
+-0.000923 0.003675 -0.000462 -0.003926 -0.002197 -0.000792 
+-0.006750 -0.001500 -0.001000 -0.002959 -0.000834 -0.000086 
+-0.000258 0.001269 0.000256 -0.003781 -0.002000 0.004321 
+-0.009884 -0.001085 0.007713 -0.009690 0.001338 0.010034 
+-0.008195 0.000321 0.005703 -0.001154 -0.001814 0.001037 
+0.003341 0.002957 -0.001708 0.002286 0.004542 -0.001246 
+-0.001068 0.001394 -0.001811 0.003245 0.003491 -0.002508 
+-0.000264 0.001444 -0.000652 -0.001290 -0.000766 0.003259 
+-0.006133 -0.006385 0.000069 -0.001647 -0.005937 -0.002026 
+-0.000091 -0.000150 -0.001383 0.005393 0.004314 -0.005111 
+-0.001896 0.003791 -0.005373 -0.001478 0.001606 -0.002379 
+-0.001676 0.000514 -0.000541 -0.001724 -0.000764 0.000297 
+0.000435 0.001080 0.000683 0.001237 0.000674 0.004401 
+0.004862 0.000631 0.003978 0.000790 0.005523 0.002191 
+0.003090 0.001920 0.000244 -0.002676 -0.000675 -0.002467 
+-0.003985 -0.005007 -0.001039 -0.000919 -0.001556 -0.000649 
+0.000504 0.003957 0.000000 0.000657 0.005501 -0.004773 
+-0.001617 0.002961 -0.000204 0.000776 0.000621 -0.000186 
+-0.001318 -0.003167 0.000985 -0.002932 -0.002481 -0.002932 
+0.002369 0.002969 -0.006318 0.001040 0.006978 -0.004652 
+0.000144 0.001406 -0.000126 -0.000242 0.000485 0.001061 
+0.005327 -0.001345 0.005617 0.018036 -0.008569 0.004129 
+0.026480 -0.018066 -0.005697 2.102326 -2.818605 -0.525581 
+0.013404 -0.023130 -0.005432 0.004871 -0.015427 0.000378 
+-0.001903 -0.006492 0.004233 0.002172 0.000602 0.001291 
+0.016133 0.013651 -0.004764 -0.001054 0.007718 0.021165 
+-0.011925 -0.009185 0.008259 -3.122699 -4.570552 0.226994 
+-3.236842 -5.473684 -0.482456 -3.271255 -5.473684 -0.817814 
+-3.099503 -5.014925 -0.810945 -0.020324 -0.020972 0.010207 
+0.014095 0.015523 0.009382 0.003752 0.004028 -0.007568 
+0.000817 -0.005705 -0.005554 -0.001877 -0.002437 -0.003310 
+-0.003128 0.001852 0.001605 -0.005748 0.000621 0.000131 
+-0.004775 -0.001828 -0.002980 -0.000304 -0.001164 -0.006942 
+0.002045 0.000954 -0.004931 -0.000226 0.002280 0.002046 
+0.001254 -0.000428 0.005230 -0.000074 0.000650 0.000010 
+-0.000948 0.002590 0.000679 0.001109 0.005260 -0.005654 
+-0.002288 0.003715 -0.006486 0.003096 0.003984 0.000884 
+0.007183 0.002187 -0.013066 0.004589 0.000999 -0.011612 
+0.000745 0.002783 -0.004783 -0.004775 0.000000 -0.001351 
+-0.000700 0.000873 0.001340 0.003907 0.005112 -0.001974 
+0.003730 0.005315 -0.005324 0.004800 0.002529 -0.000697 
+0.000612 -0.002031 0.006680 -0.002613 -0.003994 0.009309 
+-0.005212 -0.008608 0.002622 -0.001584 -0.005406 -0.003267 
+0.002263 -0.000803 0.000000 0.000046 0.002790 -0.001314 
+0.000684 0.002119 -0.002915 0.000481 -0.002584 -0.003185 
+-0.001244 -0.001665 -0.002113 -0.001243 0.000156 -0.001814 
+-0.005824 0.002385 -0.001770 -0.005134 -0.002699 -0.006883 
+0.003570 0.001585 -0.004827 0.003765 0.002365 -0.003813 
+-0.000396 0.002947 0.000320 0.000514 0.005006 0.000567 
+0.001270 0.005006 0.000576 -0.000136 0.003200 0.000359 
+-0.001104 -0.003595 -0.000642 -0.001236 -0.008651 0.002916 
+0.002720 -0.008933 0.004105 0.004602 -0.001751 0.002412 
+-0.002453 0.001273 0.005940 -0.003224 -0.005766 0.004166 
+-0.000982 -0.003543 0.000930 -0.000577 0.000923 -0.001420 
+-0.000829 0.005107 -0.002681 -0.000033 0.007391 -0.003843 
+-0.000857 0.006535 -0.000514 -0.002160 0.000704 0.000293 
+-0.005517 -0.004979 0.001715 -0.000901 -0.001259 0.003286 
+-0.004434 0.000554 -0.002500 0.000980 0.006061 -0.004863 
+0.003254 0.007323 -0.002848 0.007699 -0.004011 0.006731 
+0.017999 -0.015369 0.008974 2.176744 -2.506977 0.651163 
+2.226721 -2.688259 0.190283 2.038298 -2.353191 -0.161702 
+0.016910 -0.017154 -0.003047 0.007724 -0.008656 -0.001219 
+-0.001514 -0.003160 -0.001409 0.000627 0.001400 -0.000648 
+0.009311 0.014650 0.002849 -0.003736 0.031495 0.000522 
+-0.000819 0.003520 -0.009582 -0.018962 -0.010124 -0.005610 
+-2.072464 -4.347826 -0.637681 -2.532258 -4.354839 -0.854839 
+-2.558974 -3.958974 -0.482051 -0.020011 -0.026053 -0.005570 
+-0.001964 -0.008000 -0.004319 0.007071 0.005225 -0.001321 
+0.005134 0.002771 -0.002074 0.001150 -0.001687 -0.002166 
+-0.000477 -0.004847 -0.003824 -0.001221 -0.004590 -0.005769 
+-0.002897 -0.000844 -0.003407 0.001031 0.005155 -0.006186 
+0.004910 0.004463 -0.006720 0.002016 0.008528 -0.006150 
+-0.000020 0.008043 -0.004090 0.002807 0.002382 -0.003399 
+-0.001329 -0.000368 -0.004621 -0.000636 0.001278 -0.007718 
+0.006471 0.006134 -0.006471 0.001785 -0.002806 -0.005230 
+0.003479 0.003349 -0.007289 -0.001409 -0.000708 0.000249 
+-0.005574 0.000260 0.000710 -0.005299 0.003369 0.004453 
+-0.004383 0.004091 0.001377 0.000605 0.001779 -0.000608 
+0.000345 0.001289 -0.005431 0.004494 0.001128 -0.000247 
+0.004242 0.004006 -0.002055 -0.000085 -0.002203 -0.000932 
+-0.007678 -0.005859 -0.002292 -0.006942 -0.004294 -0.004471 
+-0.001573 -0.001672 -0.001872 -0.005113 0.006803 -0.003913 
+-0.006937 -0.000099 -0.002923 -0.007521 -0.001513 -0.001510 
+-0.007041 -0.001649 0.001340 -0.005770 0.004832 0.005483 
+-0.004807 0.003536 -0.001880 -0.000190 -0.009581 -0.003257 
+0.000530 -0.002598 0.000962 -0.002035 0.000303 0.000960 
+-0.004044 0.001147 0.000574 -0.001023 -0.001119 -0.000285 
+0.000060 -0.000745 0.002791 0.002680 0.001396 0.002778 
+0.003536 0.000334 0.003140 0.002027 -0.003558 0.003347 
+0.001776 -0.006661 0.001094 0.002076 -0.003238 -0.000046 
+-0.007712 -0.002939 0.002563 -0.000133 -0.001099 0.000303 
+-0.000030 0.003895 -0.003084 -0.000195 0.003195 -0.004824 
+0.000480 0.000074 -0.003360 -0.003212 -0.000729 -0.001705 
+-0.000485 -0.000251 -0.001186 -0.003557 -0.000505 0.000732 
+-0.003647 -0.000312 -0.003912 -0.004599 -0.004234 -0.004599 
+-0.003535 0.003982 -0.003297 -0.002981 0.006999 -0.005463 
+0.007713 -0.000839 0.004390 0.019249 -0.015121 0.006176 
+2.324873 -2.421320 0.934010 2.593458 -2.551402 0.761682 
+2.455000 -2.325000 0.390000 0.025164 -0.013475 0.001577 
+0.018406 -0.009809 -0.003328 0.009611 -0.000994 0.000542 
+0.004630 0.003171 -0.001552 0.004897 0.004019 0.001028 
+0.005807 0.006580 0.006626 0.006700 0.017258 0.012083 
+0.009082 0.028088 0.017610 0.006769 -0.001271 -0.006036 
+-0.027267 -0.037851 -0.000425 -3.310559 -4.527950 -0.254658 
+-3.643903 -4.517073 -0.760976 -3.730964 -4.192894 -1.208122 
+-0.022777 -0.030107 -0.003291 -0.003561 -0.003964 -0.000785 
+0.005399 0.001532 0.002371 0.008939 0.001061 -0.003636 
+0.006429 -0.003208 -0.004189 0.003663 -0.004250 -0.003278 
+-0.000296 -0.000455 -0.004985 0.000606 -0.000958 -0.002435 
+0.004579 0.004254 -0.001996 0.005230 0.008815 -0.004468 
+0.004558 0.009847 -0.005064 0.003305 0.005085 -0.009661 
+0.001531 -0.001598 -0.009233 0.006111 -0.003168 -0.006625 
+0.009856 0.002248 -0.008645 0.004637 0.006091 -0.008091 
+0.004310 -0.000690 -0.000862 -0.000323 0.000284 0.000148 
+0.000115 0.000002 0.000032 -0.001925 -0.001110 -0.000132 
+-0.004042 -0.003008 0.000565 -0.000314 0.001498 -0.001325 
+0.000446 0.005223 -0.002869 0.000036 0.004834 -0.005015 
+0.000391 0.004740 -0.003645 -0.001615 0.002736 -0.005255 
+-0.001447 -0.001447 -0.003947 -0.000491 0.004974 -0.004655 
+-0.000205 0.006031 -0.003486 -0.000374 0.005703 -0.003913 
+0.000076 0.004262 -0.002958 0.000849 0.002109 0.004272 
+0.002427 0.000539 0.003274 -0.008878 -0.008957 -0.001360 
+-0.002922 -0.009621 -0.009651 0.003746 -0.009833 -0.000500 
+0.002220 -0.007919 0.005190 0.000704 -0.006189 -0.000774 
+-0.006686 -0.004114 0.004000 -0.006930 -0.004388 0.003486 
+-0.002009 -0.004614 0.003842 0.001617 -0.001844 0.003940 
+0.002609 -0.002461 0.002983 0.000824 -0.001494 0.003876 
+0.000837 -0.003135 0.003176 -0.000354 -0.004600 -0.000349 
+-0.000976 -0.000871 -0.003473 0.000584 0.004004 -0.004910 
+0.000179 0.000342 -0.002712 -0.003779 -0.004813 0.000645 
+-0.006286 -0.005773 0.002821 -0.004676 0.000908 0.002270 
+-0.003007 0.000888 0.003810 -0.000011 0.000854 0.001246 
+0.005233 -0.001869 -0.004451 0.000323 0.000867 -0.013188 
+-0.001075 0.003857 -0.015621 0.004832 0.007404 0.003952 
+0.016869 -0.006189 0.008267 0.020056 -0.015683 0.003763 
+0.021283 -0.023085 0.003002 0.026887 -0.026220 0.007792 
+0.031590 -0.016334 0.008701 0.022179 0.001211 -0.001376 
+0.007768 0.000022 -0.003811 0.003373 0.003396 -0.000134 
+0.002863 0.004341 0.001255 0.005702 0.000576 0.000654 
+0.008984 -0.000974 0.003632 0.010650 0.002614 0.010169 
+0.008346 0.012840 0.013451 0.005464 0.015380 0.011699 
+-0.027915 -0.031676 0.011944 -3.983051 -4.635593 0.644068 
+-4.066298 -4.563536 -0.082873 -4.112676 -4.427230 -0.446009 
+-3.886139 -4.099010 -0.391089 -2.678788 -2.896970 -0.375758 
+-0.002746 -0.010186 -0.004947 0.001391 0.000133 -0.008611 
+0.001816 -0.002821 -0.003468 -0.000733 -0.008740 0.002229 
+-0.004748 -0.002976 -0.003396 -0.001975 -0.000313 0.000629 
+0.002802 0.003856 -0.000452 0.003062 0.005350 0.000842 
+0.004617 0.006382 -0.000398 0.006426 0.009667 -0.005541 
+-0.001763 0.003824 -0.009435 0.005466 -0.000027 0.000287 
+0.006193 -0.000134 -0.003590 0.006289 0.003088 -0.004605 
+0.005707 -0.000434 0.000340 0.003034 0.000381 0.003740 
+0.005505 0.001840 0.000265 0.002210 -0.001415 -0.001503 
+-0.001898 -0.000861 0.000324 -0.004741 0.003220 -0.001051 
+0.000198 0.005247 -0.000952 0.004100 -0.000060 -0.002110 
+-0.003264 -0.000320 -0.006193 0.003984 0.002655 -0.006646 
+-0.001441 -0.000163 -0.002606 -0.001258 0.004674 -0.001588 
+0.000592 -0.000984 -0.001882 0.001090 -0.000543 -0.001786 
+0.003236 -0.000296 0.001763 0.001815 -0.003485 0.004269 
+-0.006571 -0.006438 0.006361 -0.008889 0.000000 0.002460 
+-0.002283 -0.007869 0.001211 0.008588 0.001577 -0.006039 
+0.000877 -0.000260 0.005881 0.004173 -0.002451 0.006128 
+0.000653 -0.002885 0.006587 -0.005275 -0.004527 0.004518 
+-0.005018 -0.008392 0.007904 -0.005349 -0.005419 0.010797 
+-0.002648 0.000967 0.006828 -0.000375 -0.001535 -0.001836 
+0.000270 0.001217 -0.005553 0.010102 0.003162 -0.009084 
+0.012166 0.009515 -0.008111 0.009522 -0.000356 -0.006882 
+0.004108 0.000659 -0.007883 -0.001793 -0.000976 -0.004308 
+-0.003835 -0.002920 -0.000490 -0.002902 -0.003545 0.001188 
+-0.000252 -0.002800 0.001490 -0.000010 -0.000442 0.001275 
+-0.000641 0.000178 -0.000429 -0.002874 0.002471 -0.003286 
+0.003849 -0.000305 -0.004132 0.011902 -0.002410 0.005669 
+0.016963 -0.005971 0.005228 0.013682 -0.013039 0.004311 
+0.010705 -0.018085 0.010508 0.016256 -0.017409 0.012391 
+0.010727 -0.018017 -0.001973 0.004087 -0.008495 -0.001106 
+0.000069 0.002396 0.000594 0.000899 0.007484 0.004174 
+0.003479 0.004893 0.003056 0.004569 0.001175 0.000166 
+0.003429 0.000012 0.001804 0.002124 0.001709 0.004527 
+-0.002533 0.008400 0.000740 0.028394 0.041701 -0.034531 
+-0.000753 0.004675 -0.004060 -0.031984 -0.045563 0.009382 
+-4.835821 -4.865672 0.723881 -4.670103 -4.634021 0.350515 
+-4.416667 -4.140351 0.065789 -3.858490 -3.358490 -0.216981 
+-0.012000 -0.019629 -0.001846 0.012996 0.001385 -0.008026 
+0.004596 0.008305 -0.002399 -0.002862 -0.003292 0.002427 
+-0.005661 -0.008519 0.004497 -0.007611 -0.002653 0.004056 
+0.000664 -0.000150 -0.001374 0.000805 0.001742 -0.005096 
+0.002569 0.004625 -0.000894 -0.003510 0.004871 0.001719 
+-0.001055 0.006336 0.004921 0.001971 0.003250 -0.000464 
+0.002477 0.002280 -0.001235 0.002649 0.003223 0.001590 
+0.001252 0.005841 0.006937 0.005611 0.004656 0.005611 
+-0.004353 0.000247 0.005639 -0.000030 0.001403 0.000129 
+-0.002665 -0.002830 -0.002242 -0.003562 -0.001990 -0.005709 
+-0.005359 -0.000807 -0.001266 -0.004606 -0.000431 -0.001562 
+0.002602 0.005543 -0.008824 -0.002025 0.002537 0.000076 
+0.006208 0.003068 -0.005989 0.000275 0.001032 0.000034 
+-0.001863 0.001556 0.001635 -0.000312 -0.001660 0.003673 
+0.002038 0.001894 0.002475 0.000955 -0.000600 0.000666 
+0.001401 0.000065 -0.000546 -0.000511 -0.003073 0.000479 
+0.001735 -0.002329 0.001282 0.003461 0.002526 0.004371 
+-0.000693 -0.000696 0.004161 0.002393 -0.003661 0.000740 
+0.000794 -0.004989 0.003515 -0.000741 -0.006864 0.002637 
+0.000279 -0.004670 0.002423 -0.001486 -0.003445 0.000932 
+-0.000290 -0.004015 0.002349 0.002009 -0.002793 0.003367 
+0.002228 0.002226 -0.001211 0.004572 0.006815 -0.009885 
+0.006958 0.009238 -0.014880 -0.000688 0.008183 0.002180 
+0.000973 0.004298 0.001816 -0.001081 0.000090 -0.000652 
+-0.002488 0.000164 -0.004176 0.000136 -0.000461 -0.003117 
+-0.000578 -0.002988 0.001544 -0.000798 -0.000768 0.002804 
+-0.002418 -0.002429 -0.000411 -0.001583 0.000827 0.000510 
+0.000404 -0.000977 -0.001008 0.005423 0.000317 -0.000518 
+0.003133 -0.004368 0.001633 0.004562 -0.000605 0.005187 
+0.000864 -0.001465 -0.000187 -0.002453 -0.001184 -0.000047 
+0.000125 0.003647 -0.000963 0.001336 0.006628 -0.000543 
+0.000698 0.006947 0.001411 0.005441 0.006703 0.003455 
+0.011302 0.007388 0.001631 0.010443 0.004443 0.000843 
+0.002102 -0.001036 -0.000385 -0.001456 0.001413 -0.004905 
+0.003335 0.005966 -0.012385 0.022854 -0.000042 -0.015522 
+0.012282 -0.004495 -0.006832 0.000498 0.005082 -0.004983 
+-0.038336 -0.038693 0.005920 -5.318182 -4.704545 0.750000 
+-5.121053 -4.315790 0.821053 -4.418182 -3.350000 0.581818 
+-2.832487 -1.715736 -0.426396 0.011649 0.003109 -0.006659 
+0.025937 0.017922 -0.016005 0.013938 0.006501 -0.006599 
+-0.003465 -0.002068 0.004417 -0.009344 -0.008481 0.005784 
+-0.010288 -0.003165 0.004809 -0.005385 0.000350 0.002615 
+-0.002120 -0.000792 0.000955 -0.000418 -0.003953 0.001527 
+0.000018 -0.000671 -0.000771 0.004207 0.002047 0.001099 
+0.005568 0.001011 0.000218 0.000235 0.001431 0.000659 
+-0.002718 -0.004102 0.004763 -0.000402 0.000118 0.009839 
+-0.002163 0.002430 0.008572 -0.004368 0.002299 0.003104 
+-0.004374 0.001966 -0.001177 -0.004845 -0.000297 -0.003448 
+-0.004015 -0.002231 -0.003123 -0.001288 0.000634 -0.004636 
+0.004445 0.006544 -0.004075 0.007995 0.007173 -0.006972 
+0.001367 -0.001331 -0.001225 0.001772 0.005758 0.001290 
+0.004778 0.002597 0.002804 0.000888 0.001385 0.002632 
+0.001225 -0.002443 -0.001821 0.008710 0.000975 -0.005022 
+0.004285 -0.000397 0.001679 0.002639 -0.003271 0.001460 
+-0.000119 -0.007764 0.001390 -0.006349 -0.016193 0.000255 
+0.000056 -0.005959 0.002158 -0.003840 -0.007506 0.002456 
+-0.002502 -0.006344 -0.002131 0.001141 -0.003377 0.000401 
+0.000820 0.000758 0.001054 0.001019 0.003343 -0.001643 
+-0.002182 0.002507 0.000673 -0.002640 -0.002957 0.000692 
+-0.003010 -0.004669 0.006430 -0.001651 -0.002768 0.005724 
+0.001047 -0.000302 0.003922 -0.001275 0.002016 0.004156 
+-0.000261 0.001144 0.000061 -0.000429 -0.001531 -0.001059 
+0.000548 -0.001123 -0.000783 0.002105 0.000735 -0.000201 
+0.001020 0.001123 0.000723 -0.001385 -0.000200 -0.000157 
+-0.001353 -0.003722 -0.001316 -0.002865 -0.001256 0.000366 
+0.000064 0.000004 -0.001460 -0.000145 0.000296 0.000509 
+-0.000002 0.004737 -0.000001 -0.000404 0.003726 -0.001122 
+0.000380 0.003767 -0.001097 0.003456 0.005936 -0.001141 
+0.005330 0.008078 -0.000593 0.004573 0.008008 -0.000103 
+0.003533 0.005791 -0.000372 0.003764 0.002668 0.000058 
+0.005266 0.001772 0.000911 0.006311 0.003015 -0.002033 
+0.000170 0.002897 -0.003204 -0.007019 -0.004441 -0.006804 
+-0.011744 -0.000302 -0.003394 -0.006710 -0.000120 -0.000239 
+0.011246 0.001871 -0.003914 0.021969 0.009334 -0.009784 
+-0.002484 0.000944 0.000801 -0.040235 -0.035170 0.001290 
+-5.429752 -5.438016 1.661157 -5.176471 -4.605882 1.711765 
+-3.952381 -2.904762 0.857143 -0.011434 -0.004321 0.004786 
+0.017123 0.016853 -0.009351 0.022483 0.016013 -0.016616 
+0.006821 0.005795 -0.007259 -0.000030 -0.003099 0.002491 
+-0.008380 -0.000468 0.001350 -0.009550 -0.000992 0.003826 
+-0.002967 -0.002428 0.004755 0.002519 -0.002376 -0.005399 
+0.005478 -0.004488 -0.005017 -0.000496 -0.002810 0.005124 
+-0.000059 -0.003730 0.007908 0.000328 -0.000758 0.003679 
+-0.000860 -0.001395 -0.002687 0.000892 -0.000383 0.000464 
+0.003519 0.003534 -0.002046 -0.001153 -0.001488 0.007460 
+0.001887 -0.002359 0.010073 -0.001108 0.000295 0.004539 
+0.000599 -0.000278 -0.003860 0.005848 0.001808 -0.009865 
+0.004149 0.001919 -0.010302 0.000047 -0.002495 -0.003311 
+-0.006540 -0.002729 0.002936 -0.000718 0.001013 0.002468 
+0.001378 -0.001432 -0.002766 0.000981 -0.003551 -0.005317 
+0.000165 -0.001907 -0.006970 0.000116 -0.003302 -0.000348 
+-0.000738 -0.003828 -0.001098 -0.000315 -0.001213 -0.000180 
+-0.000048 0.001369 -0.001725 -0.004934 -0.004194 0.000290 
+-0.003486 -0.002463 0.002580 -0.007463 -0.000678 0.000678 
+-0.000017 0.000976 0.001710 0.000536 -0.000112 0.001038 
+-0.001645 0.003272 -0.000014 -0.006556 0.004884 -0.000418 
+-0.009866 0.001807 0.006281 -0.007339 -0.000129 0.006480 
+-0.004287 0.002028 0.004397 0.001681 0.003551 0.006984 
+0.002491 0.002039 0.008180 0.001679 -0.001204 0.002461 
+-0.000432 -0.003710 -0.000362 -0.003254 -0.003864 -0.000288 
+-0.001878 -0.002918 0.001439 -0.002044 -0.000533 -0.000061 
+-0.003696 0.002577 0.000396 -0.004949 0.002294 0.002334 
+-0.004292 0.000290 0.005225 -0.002500 -0.000343 0.005497 
+-0.003958 -0.001739 0.001065 -0.000424 0.001866 0.000085 
+-0.002513 0.000905 0.003015 0.004438 -0.002556 0.002909 
+0.007547 -0.002899 0.006043 0.008409 0.000835 0.003860 
+0.007010 0.003481 0.000448 0.003480 0.003189 -0.000789 
+0.002212 0.000024 0.000215 0.002081 -0.002284 0.003598 
+-0.002303 -0.000653 -0.000415 -0.007657 -0.003664 -0.007304 
+-0.010203 -0.002818 -0.011302 0.001480 -0.005359 -0.005749 
+0.005086 -0.000018 -0.002935 0.006943 0.009420 -0.001364 
+0.007494 0.017895 -0.011194 0.016543 0.015036 -0.008104 
+0.009517 0.007591 0.006935 -0.008222 -0.017482 -0.003257 
+-0.044533 -0.034563 0.006481 -4.534483 -4.543103 1.551724 
+-3.958621 -3.124138 1.013793 -0.024267 -0.010962 0.008255 
+0.002597 0.008761 -0.001657 0.022045 0.012639 -0.000262 
+-0.000798 0.002877 -0.006907 0.000164 -0.001947 0.003698 
+-0.014009 -0.005037 0.006621 -0.011818 -0.002453 0.011443 
+-0.009897 -0.000930 0.004906 -0.002223 -0.005507 0.004702 
+-0.000111 -0.011135 0.003126 -0.004355 -0.001935 -0.001774 
+-0.000328 -0.000237 0.000532 0.005116 0.004386 -0.003728 
+0.007474 0.006756 -0.004708 0.004346 0.002976 -0.001180 
+0.003701 -0.006977 0.003277 -0.002989 -0.012672 0.002275 
+-0.002613 -0.008709 0.004420 0.002962 0.000126 0.006476 
+0.003688 0.001267 -0.003210 -0.000630 0.009085 -0.007166 
+0.002511 0.005674 -0.009314 -0.001024 -0.004662 -0.008645 
+-0.006309 -0.010358 0.002259 -0.000207 -0.004956 0.006641 
+-0.004461 0.006801 0.001160 -0.011948 -0.000179 -0.003212 
+-0.006094 -0.000654 -0.012782 -0.007444 0.002518 -0.008798 
+-0.000741 -0.001791 -0.001258 0.011949 0.002513 -0.002359 
+0.003412 0.002864 0.004074 0.007372 0.006932 -0.002328 
+-0.004367 0.000854 -0.000079 -0.002009 -0.000105 -0.002361 
+0.000312 -0.000633 -0.003253 -0.001900 -0.001468 -0.003713 
+-0.001585 0.008790 -0.007081 -0.002131 0.005491 -0.005750 
+-0.000773 0.000457 -0.000027 0.000120 -0.003513 0.003165 
+0.002224 -0.001265 0.002542 0.002308 0.001630 0.001609 
+0.005146 0.002218 0.000174 0.006898 -0.001027 -0.000070 
+0.003817 -0.001904 0.005145 0.001583 -0.009945 -0.000290 
+-0.013073 -0.007272 0.003324 -0.007930 -0.007654 -0.001289 
+-0.005907 0.000932 -0.004624 -0.005182 0.003919 -0.000926 
+-0.003236 -0.000259 0.001342 0.000110 -0.000162 0.000119 
+0.001297 0.005236 -0.001761 0.003978 0.004546 0.000214 
+0.001488 0.002031 0.004527 0.003958 -0.001722 0.002311 
+0.002383 -0.002310 0.000199 0.002661 0.007144 -0.001545 
+0.000174 0.009779 -0.002973 -0.000554 0.004599 -0.001628 
+0.001492 0.000495 -0.002382 0.002401 -0.002556 -0.007718 
+0.001615 -0.000594 -0.010385 0.000555 0.001567 -0.009292 
+-0.000685 0.003018 -0.006354 -0.001483 -0.000671 -0.001502 
+0.006164 -0.004014 -0.004188 0.008601 -0.002875 -0.005144 
+0.005473 0.002517 -0.000457 0.005567 0.005887 0.001620 
+0.008028 0.003256 0.009111 0.002280 -0.005837 0.009387 
+-0.009035 -0.019930 0.005348 -0.024643 -0.021272 0.001420 
+-0.029293 -0.015952 0.007253 -0.019844 -0.016634 0.009418 
+-0.004991 -0.004675 -0.001311 0.002062 -0.001278 -0.000640 
+-0.002177 0.001653 0.001407 -0.003048 -0.001098 0.010443 
+-0.009243 -0.002408 0.008963 -0.004897 0.002649 0.004273 
+0.001011 0.006596 -0.000201 0.002941 -0.001146 0.000796 
+-0.000339 -0.009332 0.001394 0.000489 -0.007469 -0.003065 
+0.001471 -0.001147 -0.005059 0.007340 -0.002936 0.000882 
+0.000000 -0.000373 0.000746 0.000673 0.001843 0.000066 
+0.001403 -0.001235 -0.003639 0.000786 -0.005630 -0.000680 
+0.003261 0.001854 0.002613 0.005510 -0.001785 0.003908 
+-0.000327 -0.001854 0.003281 -0.002447 0.000483 0.000930 
+-0.000777 0.001447 -0.001983 -0.000022 0.001521 -0.000984 
+-0.002283 0.001604 -0.005925 -0.000040 0.000490 -0.000670 
+-0.000863 0.004002 -0.000718 -0.002444 0.001760 -0.003569 
+0.007076 0.004846 -0.007345 -0.000939 0.004612 -0.005723 
+0.001226 -0.000971 0.001788 0.007091 -0.002104 0.003978 
+0.008813 0.001722 0.001663 0.001435 0.004199 -0.003717 
+0.000237 0.001591 -0.000927 -0.000325 0.001377 -0.000115 
+0.003031 -0.000127 -0.004040 0.000480 0.007240 -0.005320 
+0.000548 0.003911 -0.006860 0.002910 0.001651 -0.000413 
+0.002105 0.000293 0.002053 -0.000224 -0.002759 0.002258 
+-0.002494 -0.001588 0.001738 -0.000532 -0.002569 0.001765 
+0.003178 -0.002216 0.001084 0.005769 -0.000057 0.000034 
+0.005104 0.001962 -0.000440 0.001269 0.000796 -0.001189 
+-0.001195 -0.003365 0.001695 -0.003522 -0.002705 -0.000467 
+-0.003402 -0.000107 -0.000501 -0.000377 0.000663 -0.000249 
+0.003225 0.000032 -0.000497 0.004363 0.002349 0.000986 
+0.000435 0.004511 0.005081 -0.001191 0.005960 0.003079 
+-0.000462 0.003281 0.000107 0.000781 0.001639 -0.000437 
+0.001363 0.003736 -0.000386 -0.000011 0.004654 -0.000182 
+-0.001172 0.005297 -0.001735 -0.000064 0.001323 -0.002009 
+-0.000890 0.000863 0.000316 -0.000654 0.000588 -0.002146 
+-0.000765 0.000749 -0.002550 0.000273 0.001482 -0.000538 
+0.000642 0.003567 0.000019 -0.003269 0.007301 -0.007271 
+-0.018441 0.001009 -0.003783 -0.007865 -0.012347 -0.003115 
+-0.010954 -0.009025 0.003163 -0.009638 -0.007242 0.004996 
+-0.001771 -0.003892 0.005796 0.001590 0.000332 0.000445 
+-0.002771 -0.001228 0.002180 -0.010485 -0.009564 0.011138 
+-0.012189 -0.014705 0.012733 -0.003686 -0.008190 0.006198 
+0.002807 0.001705 -0.003362 0.002242 0.006921 -0.004245 
+-0.003620 0.005545 -0.001094 -0.005254 0.004277 0.002994 
+-0.003344 0.000208 0.002858 0.000836 0.000954 -0.001807 
+0.003247 0.000577 -0.001411 -0.003230 -0.004132 -0.002299 
+-0.003700 -0.005671 -0.000480 -0.001291 -0.004386 0.006987 
+0.000086 -0.003462 0.009879 -0.000812 -0.001847 0.007939 
+0.000756 0.003277 0.004286 -0.000168 0.001040 -0.001502 
+0.004405 -0.000451 -0.003679 0.006632 0.005410 -0.005585 
+0.007285 0.000903 -0.005750 0.001071 0.001374 -0.003030 
+-0.005370 -0.004671 0.001035 -0.005499 -0.004236 -0.000849 
+-0.003311 -0.002577 0.002145 -0.000523 -0.001928 -0.000441 
+0.001486 0.001983 -0.009082 0.000213 0.001152 -0.011725 
+-0.001592 -0.000397 -0.003552 0.004977 -0.001301 0.001307 
+0.000575 -0.002156 0.000254 -0.000834 0.000201 0.003761 
+-0.000183 0.001706 0.002185 -0.003547 0.000997 0.001937 
+-0.003172 -0.002778 0.002156 -0.001885 0.000651 -0.001139 
+0.000166 -0.002129 -0.000969 0.002168 0.004698 0.001186 
+0.005014 0.002331 0.000352 -0.000751 0.000317 0.002052 
+0.000567 0.000051 0.001273 0.003636 0.000000 -0.002424 
+0.001617 0.000773 -0.001898 -0.000511 -0.001752 0.001688 
+-0.002472 -0.002942 0.004039 -0.001486 -0.001130 -0.000245 
+0.000833 -0.000264 -0.000047 0.000227 0.001488 -0.000165 
+-0.000075 0.000478 -0.000255 0.000877 -0.001164 0.001149 
+0.002244 -0.000732 0.002102 0.000206 0.001977 0.002363 
+-0.000951 0.000417 -0.002726 -0.001317 0.003709 -0.005292 
+-0.000932 0.002276 -0.001613 0.001201 -0.001535 0.000023 
+0.000204 0.000196 0.004583 -0.000976 0.002440 0.004392 
+-0.001612 0.001449 0.000605 0.001685 -0.000108 -0.002138 
+0.006626 -0.001063 -0.004238 0.007831 -0.000951 0.000676 
+0.004756 -0.002625 0.000163 0.001196 0.000614 0.001709 
+-0.000471 0.001967 0.003805 0.000701 -0.000711 0.000997 
+-0.001673 0.000423 0.000045 -0.000008 0.001301 0.000942 
+0.000034 -0.001580 0.002847 -0.002173 -0.006105 0.000635 
+-0.006213 -0.007543 -0.009548 -0.002184 -0.010714 -0.010920 
+-0.000683 -0.005993 -0.004207 -0.000185 0.000591 -0.000891 
+-0.004314 0.003477 -0.000464 -0.004278 -0.001215 0.000471 
+-0.001548 -0.002008 0.003121 -0.002248 -0.003866 0.004554 
+-0.002956 -0.000986 0.001696 -0.000514 0.003324 -0.000424 
+-0.000772 0.001130 0.000385 -0.002301 -0.001274 -0.001640 
+-0.004334 -0.000511 -0.002653 -0.001722 0.001489 0.000946 
+-0.000906 0.003113 -0.002538 -0.000354 0.000914 -0.005159 
+0.001475 0.002167 -0.003205 0.000517 0.001237 -0.000120 
+-0.000894 -0.001975 0.001278 0.000450 -0.004157 0.003811 
+0.001681 -0.000177 0.004071 -0.001419 0.001287 0.000341 
+-0.001301 0.000710 -0.002478 -0.000833 0.000907 -0.001520 
+0.001113 -0.001336 -0.001194 -0.000154 0.000350 -0.000179 
+-0.001418 0.000206 0.001818 -0.001946 -0.004239 0.001729 
+-0.001593 -0.004434 0.001799 -0.002485 -0.003485 0.001242 
+-0.003945 -0.004507 -0.002819 -0.005757 -0.005102 -0.001544 
+0.003851 -0.003511 -0.005589 -0.000823 -0.000164 -0.006833 
+-0.001226 0.004432 -0.003574 -0.002378 0.001545 -0.002329 
+-0.002986 0.001331 0.001800 0.000232 -0.000235 0.002079 
+0.000561 -0.001550 0.002247 -0.001262 -0.000842 0.001111 
+-0.000692 -0.006299 -0.001392 -0.000746 -0.003332 -0.003755 
+0.001932 -0.002581 -0.000318 0.002936 0.001501 -0.001591 
+0.002059 0.000697 -0.000863 -0.000601 -0.001203 0.002557 
+-0.001104 0.001663 0.001849 -0.002663 0.000592 0.004385 
+-0.004045 0.000868 0.003611 -0.004311 -0.001265 0.003382 
+-0.001992 -0.002073 0.002033 0.001571 0.000742 -0.000153 
+0.000281 0.003073 -0.000078 0.000544 0.001796 -0.004055 
+0.000467 0.001491 -0.000240 0.000280 -0.000471 0.000152 
+0.001330 -0.000090 0.001230 0.001328 0.001528 -0.000134 
+0.000960 0.000782 -0.004517 0.002241 -0.001664 -0.000241 
+0.000829 -0.005649 -0.000821 -0.000120 -0.001480 0.000422 
+0.000514 0.003120 0.003517 0.003365 0.002508 -0.002095 
+0.001184 0.000215 0.002440 0.000870 -0.001218 -0.000363 
+0.001887 -0.000184 -0.000603 -0.000495 0.002971 -0.004000 
+0.000692 0.002538 0.000923 -0.000615 -0.000456 0.000101 
+-0.001849 -0.002600 0.001911 -0.000572 -0.000777 -0.001047 
+0.000086 0.002798 -0.002299 0.000409 0.003099 -0.000795 
+0.000450 0.001245 0.002340 0.000502 -0.001464 0.003116 
+-0.000574 -0.002588 0.000113 0.005820 -0.005820 -0.007213 
+0.000477 -0.001319 -0.003661 0.000372 -0.000899 0.000088 
+0.000673 -0.002648 0.000755 -0.000974 -0.003174 -0.002805 
+-0.000617 0.002829 -0.001354 0.004063 0.007884 -0.004232 
+0.002708 0.009544 -0.001218 0.000566 0.005267 0.001412 
+0.000698 0.001916 0.001858 -0.002867 -0.001401 0.004373 
+-0.002857 -0.001282 0.000356 -0.000428 0.000516 -0.005011 
+0.002084 -0.000129 -0.006539 0.002349 -0.001697 -0.003191 
+0.000138 -0.000153 -0.000145 0.000088 0.001567 0.001698 
+0.000889 0.002075 0.003788 0.000768 0.000801 0.007285 
+-0.000527 0.000872 0.007068 -0.001219 0.000523 0.002612 
+-0.000287 -0.000270 -0.001593 0.003002 -0.003572 -0.003251 
+0.005087 -0.002493 -0.000835 0.000553 0.000376 0.002808 
+-0.003759 0.002842 0.004767 -0.002153 -0.003481 0.007122 
+-0.004902 -0.003888 0.001623 -0.002645 -0.001663 -0.000909 
+0.000825 -0.003993 0.000694 -0.002680 -0.000816 -0.000963 
+0.001342 -0.002578 -0.000959 -0.000668 -0.001881 -0.002246 
+-0.001485 0.001992 -0.001734 0.001422 0.001709 -0.005597 
+0.000288 0.000753 -0.002999 0.000355 0.000920 0.000451 
+-0.000922 -0.001017 0.003078 -0.002039 -0.004048 0.003280 
+0.000741 -0.006922 0.000142 -0.001047 -0.004315 -0.003540 
+-0.004392 -0.002379 0.002965 -0.002803 -0.002310 0.000730 
+-0.000437 -0.001427 -0.000326 -0.000400 -0.000830 -0.002422 
+0.000331 0.000244 0.001359 0.001837 0.003779 0.004514 
+-0.000089 0.003810 -0.000709 0.001905 0.001032 -0.002063 
+-0.001230 -0.001299 -0.002735 0.001245 -0.007467 0.002177 
+-0.001079 -0.009160 0.005036 -0.000934 -0.004845 -0.001233 
+0.002819 -0.002966 0.000343 0.000913 -0.000577 0.000531 
+0.001157 0.001901 0.000579 0.001207 -0.000191 0.000089 
+0.000872 -0.000858 0.003263 0.000050 -0.000809 0.005682 
+0.000895 -0.000801 0.004831 0.000445 -0.000348 0.000212 
+0.000224 -0.000299 -0.000224 -0.000045 0.003294 -0.003070 
+-0.000300 0.001958 0.000007 -0.000414 0.002178 -0.000576 
+0.000824 0.003546 -0.001368 0.001212 0.001429 -0.001368 
+-0.000402 -0.000684 -0.000060 -0.000063 -0.001022 -0.000120 
+0.002407 0.001161 0.001079 0.001863 0.005747 -0.002424 
+0.004110 0.004356 -0.002385 0.000319 0.001567 0.001461 
+0.000130 -0.001910 0.003117 -0.000121 -0.003456 0.001556 
+0.000391 -0.001692 -0.004948 -0.000781 0.000015 -0.004138 
+-0.000555 0.001379 0.000063 -0.000047 0.000446 0.001934 
+-0.000956 -0.000662 0.000000 0.000379 -0.000221 0.003092 
+0.001938 0.000813 0.001251 0.002297 0.001168 -0.002033 
+0.002585 0.003372 -0.002655 0.001082 0.004300 -0.003452 
+0.001316 0.002599 -0.001024 0.000412 0.001730 0.000357 
+-0.001880 0.000951 0.000084 -0.002672 -0.001495 -0.001590 
+0.000398 -0.001283 -0.001239 -0.004149 0.003634 -0.003919 
+-0.004866 0.001628 -0.003315 -0.000955 0.000936 -0.002982 
+0.003052 -0.000627 -0.002884 0.003426 -0.000710 -0.002121 
+0.001402 0.002200 -0.001716 -0.001303 0.002999 -0.000205 
+-0.001447 -0.000379 -0.000588 -0.000914 -0.005219 0.000204 
+-0.001552 -0.007049 0.000783 -0.002816 -0.003312 0.000055 
+-0.001417 0.001503 0.000743 0.001988 0.000989 0.001480 
+0.003972 -0.000331 0.001018 0.003818 -0.001531 0.000430 
+0.002213 -0.001326 0.000670 -0.000833 -0.002264 0.003301 
+-0.001432 -0.002691 0.004123 -0.003887 -0.004659 -0.000520 
+-0.001829 0.000953 -0.001341 0.001124 0.004214 -0.004523 
+-0.000941 0.003690 -0.003907 -0.001585 0.002651 0.001407 
+-0.001415 -0.003311 0.001885 -0.002656 -0.006197 -0.001905 
+0.000327 0.000928 -0.001726 0.000102 -0.001814 -0.002657 
+-0.000840 -0.000221 -0.000131 -0.004191 0.000543 0.001356 
+-0.002256 0.001333 0.002289 -0.001169 0.000163 0.002432 
+-0.000580 0.000806 0.000464 0.001728 -0.001469 0.001642 
+0.002350 -0.002864 -0.000073 0.001385 -0.001462 -0.000154 
+-0.000773 0.001007 0.000606 -0.003105 0.002177 0.001250 
+-0.007187 -0.005568 0.002733 -0.002850 -0.001159 -0.000893 
+0.002351 -0.002570 -0.000864 0.001419 0.000229 0.001359 
+0.004500 0.003773 0.002227 0.006068 0.004501 0.001167 
+0.005105 0.003241 0.000061 0.001847 0.000949 -0.000912 
+0.000466 -0.002768 0.001028 0.001032 -0.001905 0.000714 
+0.002277 0.001765 0.000455 0.000112 0.002714 0.000344 
+-0.001762 0.002280 -0.001048 -0.002715 0.001712 -0.001287 
+0.003390 -0.001018 -0.003956 0.002447 0.004404 -0.005528 
+0.000927 0.003256 -0.002472 0.001257 0.000393 -0.000106 
+0.001461 -0.001071 0.000506 -0.000423 -0.000562 0.000108 
+-0.001027 -0.000460 0.000921 0.002493 -0.000929 0.002118 
+0.000607 -0.002727 0.002798 0.000204 -0.004216 -0.000308 
+0.000268 -0.005362 -0.005588 0.000091 -0.002988 -0.002896 
+0.000151 -0.000185 0.001796 0.000095 0.000395 0.003252 
+0.000405 0.000471 0.002765 -0.000447 0.000997 0.000310 
+-0.001372 0.001017 -0.001073 -0.000743 -0.000219 -0.002403 
+0.000400 -0.000265 -0.000936 -0.001374 0.000231 -0.002016 
+0.000642 0.001826 -0.000680 0.001064 0.002118 -0.000101 
+0.000299 0.000615 -0.000211 0.001712 -0.000382 -0.002131 
+0.000954 0.004387 -0.002478 -0.000304 0.006693 -0.001596 
+-0.000748 0.000409 -0.000808 -0.001611 -0.000466 0.000355 
+-0.003080 -0.003635 0.001998 -0.001469 -0.002835 0.000112 
+0.002336 0.000753 0.000209 0.004313 0.003110 0.001417 
+0.003409 0.004015 0.000679 -0.000051 0.002282 -0.000142 
+-0.001511 -0.001591 -0.000248 -0.000767 -0.003183 0.001189 
+0.003529 -0.000028 -0.001907 0.001147 0.002570 -0.004959 
+-0.001703 0.001911 0.000409 -0.000077 -0.001024 0.007568 
+-0.001426 -0.001903 0.009023 0.000355 -0.000449 0.003101 
+-0.003872 -0.001198 -0.000830 -0.001758 -0.001802 -0.001628 
+-0.003099 -0.001037 -0.000517 -0.003358 0.000672 0.001343 
+-0.000542 0.001411 -0.000036 0.000084 -0.000832 -0.000897 
+0.001519 -0.002320 0.001842 -0.001660 -0.007196 -0.002767 
+0.001856 -0.002592 -0.001089 0.001386 -0.002020 0.000349 
+0.002266 0.000296 -0.001774 0.001102 -0.001417 -0.000315 
+-0.000779 0.002871 0.004246 -0.001681 0.004102 0.004416 
+-0.000485 0.001521 -0.000841 0.003134 0.001201 -0.001234 
+0.000849 -0.000441 0.000702 0.000110 0.001036 0.002950 
+0.000142 0.000956 0.003542 -0.000076 0.000050 0.000410 
+0.001206 -0.001218 -0.001119 -0.000077 -0.000489 0.001955 
+0.000986 -0.004699 0.002590 0.001431 -0.000115 0.001752 
+0.000309 0.005965 0.002194 0.003886 0.006133 0.003314 
+0.004496 0.003004 -0.000526 -0.001150 -0.001864 0.000350 
+-0.002370 -0.003556 0.004737 -0.000168 -0.001245 0.004140 
+-0.001176 0.000605 0.001549 -0.002121 0.002808 -0.000540 
+-0.002823 0.000246 -0.001823 -0.003492 -0.002656 -0.000721 
+-0.000925 -0.001102 0.000881 0.000176 0.002146 -0.002191 
+0.000641 0.004462 -0.003527 0.002105 0.003369 -0.000674 
+0.001625 -0.000008 0.000906 0.002634 -0.002164 0.000505 
+0.003064 -0.000842 -0.001448 -0.000025 -0.000854 -0.001270 
+0.000376 -0.001440 -0.000256 0.000837 -0.005927 0.003273 
+-0.003341 -0.010003 0.005253 0.001639 -0.003118 0.003820 
+-0.000110 0.002174 0.002944 -0.000895 0.003788 0.002338 
+0.002255 0.001912 0.002061 0.000588 0.001786 0.001809 
+0.001727 -0.000638 0.000781 0.000740 -0.001619 0.000875 
+0.000443 0.000575 -0.000184 0.000053 -0.001628 -0.003991 
+-0.000083 -0.000710 -0.001918 -0.001229 -0.002113 0.002352 
+-0.002325 -0.003237 0.003405 -0.003409 -0.004072 0.003222 
+-0.000189 -0.004553 0.003309 -0.000677 -0.003115 0.001377 
+-0.000113 0.000369 0.000326 -0.000357 0.002462 -0.000274 
+-0.001661 0.001406 -0.001268 -0.000814 -0.001032 -0.000628 
+0.002666 -0.000430 0.000037 0.005206 -0.000422 0.001414 
+0.003745 0.001550 0.001629 0.002556 0.002694 0.000004 
+0.000794 0.000396 -0.000358 -0.000808 -0.000963 0.001268 
+-0.001235 -0.000014 0.001723 -0.000647 0.001232 0.000012 
+0.001415 0.001552 0.001191 0.001229 -0.000230 -0.000267 
+0.001934 -0.002482 -0.001632 -0.000436 -0.006375 -0.000361 
+-0.000397 -0.003516 -0.001684 -0.001093 0.000423 -0.005290 
+0.000427 0.002306 -0.002552 -0.001667 0.001212 -0.001558 
+0.000232 0.000386 -0.001986 0.000860 -0.000340 -0.001804 
+-0.001892 -0.003346 -0.000538 -0.004653 -0.003291 -0.001839 
+-0.002521 -0.002929 -0.002766 -0.003654 -0.003654 -0.000385 
+0.000158 0.000847 -0.001219 0.000419 0.001057 0.000166 
+0.001932 0.001012 0.001290 0.000667 0.000168 -0.000713 
+0.002582 0.001336 -0.001585 0.000391 -0.002187 -0.000469 
+0.000079 -0.001732 0.000000 -0.003505 -0.002754 0.004162 
+-0.002446 -0.002068 0.004117 0.002081 -0.000545 0.000304 
+0.004211 0.000383 -0.000128 0.001694 -0.001302 -0.000195 
+0.000735 -0.000344 0.000360 0.000971 -0.000308 0.001179 
+-0.000064 0.000558 -0.000793 0.000123 -0.000971 -0.004451 
+-0.000433 -0.000513 -0.004693 -0.000316 0.000138 -0.001140 
+-0.000306 0.000524 0.000931 -0.000921 -0.000727 -0.000872 
+-0.003465 -0.000283 0.000567 -0.002638 -0.003386 -0.002638 
+-0.003773 -0.001173 -0.001427 -0.001672 -0.000341 -0.000055 
+-0.000069 -0.001730 0.001453 -0.000609 0.000475 0.000826 
+0.001436 0.002595 0.001623 0.002214 0.001614 0.001127 
+0.001595 0.000220 -0.000315 0.000573 -0.001817 -0.000449 
+0.000424 -0.000519 0.000051 -0.001265 0.001672 -0.003377 
+-0.000577 0.003996 -0.004671 0.000175 0.003376 -0.002347 
+-0.001017 0.000755 0.002016 0.000378 -0.000575 0.001900 
+-0.000369 0.001174 -0.001332 -0.000853 0.002362 -0.001211 
+0.001174 0.002354 -0.000332 0.000399 0.001134 0.000550 
+0.004878 -0.000420 -0.000559 0.001593 0.001027 0.001107 
+0.003250 0.001433 -0.001528 0.001649 0.000768 -0.002369 
+-0.000067 0.000187 -0.000913 -0.000236 0.000437 0.001105 
+0.000595 -0.001723 0.000313 -0.005514 -0.003657 0.006779 
+-0.004788 -0.004165 0.006564 -0.003507 -0.001970 0.001824 
+0.000166 0.001477 0.001098 0.001223 0.000801 0.000682 
+0.000284 -0.000798 -0.000610 0.000548 -0.003285 -0.002095 
+0.000973 -0.004703 -0.002980 0.001344 -0.004390 -0.002733 
+0.004152 -0.000262 -0.004074 0.002986 0.001299 -0.001878 
+-0.001112 -0.000958 0.000159 -0.003308 -0.001308 0.000077 
+-0.002710 -0.000344 -0.001527 -0.000031 0.000062 -0.004264 
+-0.002764 -0.002491 -0.006804 -0.000163 -0.003740 -0.003089 
+0.002465 0.000500 -0.001846 0.000645 0.002565 -0.003859 
+-0.001954 0.000154 -0.002252 -0.000689 0.002232 -0.003955 
+0.003645 0.000017 -0.002073 -0.000750 -0.000670 -0.000878 
+-0.002214 -0.001500 0.002214 -0.005711 -0.002463 0.002504 
+-0.005120 -0.001098 0.000091 -0.002217 0.000130 0.001440 
+-0.001464 -0.000293 0.001119 -0.001710 -0.000210 0.000360 
+0.001796 -0.001424 -0.000511 0.000298 -0.000745 -0.001288 
+-0.003664 -0.000336 0.001008 -0.003864 -0.000803 0.002409 
+-0.000290 -0.000870 0.003206 -0.001130 -0.000947 0.000437 
+0.000374 -0.000447 -0.000296 -0.001177 0.000792 -0.000046 
+-0.001772 0.000849 -0.000387 0.000093 -0.000234 0.000120 
+0.002132 -0.001132 0.000876 0.002988 -0.000247 0.001720 
+0.002219 0.000782 0.002051 0.000391 0.001144 -0.000045 
+-0.001492 0.000671 -0.004298 -0.002975 0.000378 -0.004546 
+-0.002989 0.001025 -0.002061 -0.001390 0.000900 -0.000142 
+0.002441 0.001919 0.000436 0.005225 0.001974 -0.001242 
+0.001959 -0.001353 -0.001987 -0.004326 -0.001298 0.003385 
+-0.006601 -0.004059 0.007709 -0.005059 -0.005199 0.006230 
+-0.002451 -0.003439 0.003813 0.000595 -0.000298 0.002066 
+-0.000170 -0.001840 0.001330 0.002180 0.000071 -0.000474 
+0.004392 0.002289 -0.000335 0.004627 0.003631 -0.001654 
+0.003218 0.001869 0.000014 -0.000729 0.001183 -0.000386 
+-0.000549 0.003220 -0.000528 0.000988 0.005098 0.000116 
+0.000494 -0.000023 -0.000597 0.000561 -0.000596 -0.002227 
+0.000336 -0.001506 -0.001368 -0.000029 -0.000475 -0.000263 
+0.001112 0.001464 -0.000045 0.004387 0.003623 -0.003124 
+0.004816 0.003600 -0.005156 0.003119 -0.000561 -0.001141 
+-0.000580 -0.003480 0.004205 -0.002348 -0.004360 0.003899 
+-0.000731 -0.001506 0.000554 -0.000217 -0.000068 -0.000024 
+-0.003842 0.001045 0.000395 -0.006155 0.002460 0.003676 
+-0.006354 -0.001203 0.001241 -0.002007 0.001221 -0.000087 
+0.001292 -0.000281 0.000083 0.002420 -0.002014 -0.000882 
+0.000444 -0.000570 -0.000498 -0.003451 0.000815 0.001852 
+-0.004435 -0.000945 0.002941 -0.002125 0.000087 0.001673 
+-0.000268 0.000467 -0.000227 0.001609 0.001716 -0.000871 
+0.002018 0.002694 -0.002692 0.001890 0.002668 -0.003557 
+0.002391 -0.000833 -0.002626 0.000492 -0.001582 -0.002973 
+-0.000209 -0.001628 -0.000628 0.000561 -0.000118 0.000976 
+0.000478 0.000073 0.001415 -0.002910 -0.002090 0.000522 
+-0.002514 0.001013 -0.000413 -0.001968 -0.001230 -0.003106 
+-0.001918 -0.004209 -0.002033 -0.004437 -0.005606 -0.001285 
+-0.000787 -0.003522 -0.002901 -0.000520 -0.003676 -0.000911 
+0.000183 -0.000407 0.000197 0.004104 0.000240 0.000034 
+0.004041 -0.001141 -0.000554 0.002425 -0.000590 -0.000461 
+0.002341 -0.001323 -0.002952 0.001436 -0.001795 -0.000359 
+0.005462 -0.001577 -0.001577 0.002846 -0.003574 -0.001340 
+0.000780 -0.003868 -0.001065 0.000465 -0.001860 0.000000 
+-0.000279 -0.000540 -0.000075 -0.002016 -0.001140 0.002803 
+-0.003115 0.001318 0.003745 0.001224 0.000743 0.002952 
+0.002553 -0.001543 0.001812 0.002667 -0.002116 0.001101 
+0.001245 -0.001190 0.000305 -0.000638 0.001043 0.000757 
+-0.000618 0.000186 -0.000380 0.003778 -0.001691 -0.001570 
+0.007945 -0.000423 -0.004378 0.007828 0.001102 -0.004697 
+0.003188 0.002388 -0.004458 -0.000224 0.000119 -0.002781 
+-0.001818 -0.001585 -0.000606 -0.002297 -0.001530 0.002968 
+-0.004362 -0.002132 0.001339 -0.001252 -0.002226 0.000463 
+-0.000023 -0.001998 0.001315 -0.001078 -0.001523 0.001999 
+-0.000498 -0.000105 0.000723 0.000781 0.001133 -0.001133 
+0.003598 0.004457 -0.002014 0.005011 0.005852 -0.005291 
+-0.001410 0.005277 -0.003639 0.000000 0.002063 -0.002857 
+-0.000030 -0.000255 0.000139 -0.000176 -0.001153 -0.001425 
+0.001749 -0.001490 -0.005594 0.000952 -0.001583 -0.004337 
+-0.000009 -0.000013 -0.000189 -0.000931 0.002387 0.000088 
+-0.000609 0.004261 -0.003696 -0.002325 0.001442 -0.006176 
+0.000541 -0.001761 -0.007600 0.001319 0.001654 -0.002425 
+-0.001333 0.000833 -0.001083 -0.001331 0.000658 -0.000665 
+-0.000229 -0.000706 -0.000368 0.000720 -0.001372 -0.000762 
+0.002723 -0.000738 -0.000851 0.005447 0.001789 -0.000732 
+0.001208 0.001580 0.000999 0.004265 0.003401 0.000854 
+0.004795 0.002437 0.000818 0.003138 0.001904 0.000720 
+0.000762 0.001366 0.000237 -0.002116 0.001935 0.001168 
+-0.000537 0.002065 0.003292 0.000541 0.003004 0.000760 
+-0.000167 0.002371 -0.000182 -0.003413 0.001606 0.000604 
+-0.003184 -0.001752 0.000961 -0.000076 0.000992 0.000534 
+-0.000621 0.000784 -0.000120 0.000259 -0.000449 0.000182 
+0.000671 -0.001450 0.000238 0.000077 -0.002006 -0.000348 
+-0.000902 -0.000902 -0.003008 0.000650 0.001256 -0.005718 
+0.003555 -0.001651 -0.002519 0.002615 -0.002322 -0.001559 
+0.000495 -0.001848 -0.000047 0.002384 0.000252 -0.002250 
+0.000567 -0.000858 -0.001718 -0.001580 0.001012 0.000173 
+-0.002012 0.000678 -0.000448 0.000178 -0.002000 -0.000133 
+0.003044 -0.003235 -0.001716 0.005146 -0.001479 -0.005019 
+0.000496 0.001985 0.000234 -0.001018 0.002468 0.000433 
+0.000806 0.001851 0.002126 0.000646 0.001354 0.000236 
+-0.000144 -0.000673 0.002883 -0.001718 -0.001290 0.005299 
+-0.005635 -0.002143 0.003889 -0.002302 -0.000238 0.003254 
+-0.000329 0.001278 0.002863 -0.001260 0.001620 0.002077 
+-0.003009 0.000791 -0.000765 -0.002810 0.000273 -0.004494 
+-0.002500 0.000196 -0.003432 -0.000946 0.000338 -0.000661 
+-0.000679 -0.001497 -0.000419 0.000026 -0.001817 -0.000263 
+0.002034 0.000509 0.000075 0.000120 0.000449 -0.000309 
+0.000252 -0.001872 -0.001462 0.000759 -0.000736 -0.001323 
+0.004158 0.002209 -0.000939 0.002199 0.005923 -0.001460 
+-0.000192 0.003169 -0.000923 -0.000748 0.000099 -0.000225 
+-0.000588 0.000456 -0.001098 0.000229 -0.000889 -0.001482 
+0.000422 0.001797 0.000238 -0.000495 0.001497 -0.000759 
+0.002143 0.001111 -0.002222 -0.000248 0.003914 -0.003354 
+-0.001827 0.000395 -0.001432 0.001274 0.003541 -0.004242 
+0.000316 0.000499 -0.001649 -0.000995 -0.000726 0.000461 
+0.004633 -0.002723 0.002507 0.003519 -0.005309 0.005214 
+0.001960 -0.004630 0.004150 0.000722 -0.001460 0.000008 
+-0.002268 0.000799 -0.004290 -0.002485 0.001583 -0.005308 
+0.000350 0.002917 -0.003037 0.001910 0.000525 0.001287 
+-0.001039 0.000738 0.002501 -0.000754 0.000206 0.002603 
+-0.002220 -0.000220 0.000892 0.002198 -0.000042 0.000536 
+0.004486 -0.001098 -0.001399 0.004111 0.000306 -0.006556 
+0.001432 0.006019 -0.005064 -0.001230 0.001230 -0.002049 
+-0.001654 -0.000810 0.000338 0.000045 0.001157 -0.000633 
+0.002071 0.004587 -0.000980 0.005463 0.003996 -0.001537 
+0.001938 -0.000200 -0.002960 -0.000149 -0.001524 0.000215 
+-0.001296 -0.002655 0.000759 -0.003239 -0.002012 0.000442 
+-0.001074 -0.000716 -0.001163 -0.000573 -0.000833 -0.000365 
+-0.001811 0.000000 0.001417 -0.000300 -0.000690 -0.000594 
+-0.000806 -0.002709 -0.001947 0.000000 -0.005462 0.000538 
+-0.003620 -0.000603 -0.000698 -0.000685 0.000075 -0.000903 
+0.001223 0.003087 0.000773 0.001608 0.004100 0.000293 
+0.000082 0.002467 -0.001398 0.000341 -0.000953 -0.002579 
+-0.001024 -0.001979 -0.002771 -0.002895 -0.003803 0.001174 
+-0.001173 -0.000232 0.000159 -0.001375 0.000232 -0.002251 
+-0.001150 -0.001215 -0.004101 -0.000064 -0.001993 -0.002457 
+0.001257 -0.000466 0.000512 -0.001426 0.001018 -0.000153 
+-0.001206 0.002090 0.000804 -0.000992 0.000960 -0.000371 
+0.001450 -0.000979 0.001292 0.001270 -0.002826 0.003533 
+-0.000472 -0.002756 0.000000 -0.000298 -0.001565 0.002309 
+-0.000039 0.000496 -0.000015 -0.001119 0.000561 -0.001174 
+-0.001003 0.001591 -0.000839 -0.001708 0.000908 -0.005172 
+-0.003155 0.001126 -0.005731 -0.003482 0.005104 -0.003516 
+0.003935 0.005158 -0.006249 0.002102 0.000458 -0.001663 
+0.000638 -0.000165 -0.000043 -0.000508 0.000412 -0.000500 
+-0.003258 0.003657 -0.004174 0.000517 0.006786 0.000869 
+0.001126 0.004169 -0.006375 0.000544 0.002041 -0.002902 
+0.000435 0.004042 -0.003738 0.006181 0.006352 -0.003666 
+0.005782 0.006878 -0.002552 0.002406 0.003157 -0.000109 
+0.001448 -0.000617 -0.000788 0.004319 -0.000463 -0.003105 
+0.008120 -0.002215 -0.004113 0.004703 -0.003506 -0.004231 
+0.003060 -0.001791 0.000373 0.001825 0.002426 -0.000145 
+0.003053 0.003863 0.000352 0.003778 0.002903 0.001521 
+0.002100 0.001700 0.003894 0.004046 -0.001671 0.006396 
+0.002094 -0.003696 0.006255 0.001080 -0.000455 0.001383 
+0.000451 0.004737 -0.002556 0.003962 0.007211 -0.001798 
+-0.000780 0.002738 0.002152 -0.001062 -0.000064 -0.001607 
+0.002582 0.000913 -0.004421 -0.000696 0.001613 -0.003310 
+-0.002689 -0.001840 -0.002813 -0.001022 -0.003035 -0.003106 
+0.003329 -0.001951 -0.005246 0.000517 0.002066 -0.008000 
+-0.000091 -0.000805 -0.006019 0.000869 -0.001667 0.000413 
+-0.007118 -0.005387 0.003175 -0.001452 -0.004297 0.002551 
+0.000385 0.001070 0.000641 0.004541 0.001514 -0.000541 
+0.000115 -0.001130 0.001145 -0.000062 -0.004103 0.001518 
+-0.002858 -0.004375 -0.000982 -0.001249 -0.001212 -0.000964 
+0.000965 0.003862 0.000840 0.002825 0.002656 -0.001159 
+0.001382 0.000861 0.000866 -0.002070 -0.001171 -0.000558 
+-0.004474 -0.000308 0.000589 0.000841 0.001546 0.002915 
+0.001124 -0.004939 0.000848 0.000502 -0.001108 0.000288 
+-0.001670 0.000970 -0.001666 -0.002602 0.000025 -0.001175 
+-0.002648 0.000411 -0.000366 0.000000 -0.001069 -0.001450 
+-0.001323 -0.000464 0.000166 -0.000157 -0.001994 0.000274 
+0.000326 -0.001612 -0.000367 -0.000258 -0.001102 -0.000732 
+-0.000154 -0.001716 -0.001156 0.001737 -0.004161 -0.000949 
+-0.000662 -0.007602 0.005068 -0.000552 -0.007830 0.002079 
+0.000373 -0.003582 0.002313 -0.000194 0.000134 0.001016 
+0.001883 0.002382 -0.001319 0.001069 -0.000350 0.002027 
+0.000674 0.002091 -0.001766 0.004719 0.001793 0.002102 
+-0.000001 0.000081 0.000098 0.002410 -0.000311 -0.002293 
+-0.001998 -0.001642 -0.002520 -0.002831 -0.000219 -0.003677 
+-0.001656 -0.000130 -0.005789 -0.001917 0.003915 -0.005558 
+-0.002998 -0.002595 -0.005415 0.000016 -0.002776 -0.005884 
+0.000089 -0.000922 -0.004291 -0.001590 -0.001272 -0.004345 
+0.000189 0.000442 -0.009022 0.000052 0.001229 -0.011285 
+0.001665 0.003357 -0.011235 0.006769 0.005668 -0.007163 
+0.006683 0.001614 -0.003624 0.003047 0.000696 -0.002873 
+0.002005 0.000597 -0.001450 0.002362 -0.000102 -0.000807 
+0.001843 -0.000956 -0.000263 0.000822 -0.000838 -0.000840 
+0.001745 -0.000424 0.000733 0.002873 -0.001039 -0.001059 
+0.003901 0.002537 -0.001691 0.003062 0.001697 -0.002317 
+0.000202 0.001574 0.000922 -0.000365 0.003114 0.002733 
+0.001680 0.003829 0.003905 0.002271 0.001633 0.004330 
+-0.000074 -0.001544 0.003608 0.000376 -0.000979 -0.000565 
+-0.001740 0.000735 -0.002655 0.005256 0.007166 -0.009551 
+-0.000781 -0.000078 -0.000859 0.000131 0.004142 0.001500 
+0.000935 0.003597 0.001655 0.001214 0.002221 0.001287 
+-0.000223 0.000809 -0.000696 0.000787 -0.000396 0.000566 
+0.006466 -0.002124 -0.007818 0.001864 0.002413 -0.006890 
+0.000722 0.006252 -0.003564 -0.003146 0.004916 -0.000111 
+-0.006013 0.002187 -0.001567 -0.003091 0.000312 -0.002253 
+0.001267 -0.000648 0.001353 0.005991 -0.000361 0.002589 
+0.002714 -0.001558 -0.002633 -0.000631 -0.000427 -0.001025 
+-0.003370 -0.000377 -0.002938 -0.003863 -0.000347 -0.001943 
+-0.003088 0.000370 -0.000649 -0.003435 -0.001450 0.000000 
+-0.004085 -0.002028 0.004761 0.001528 -0.000437 0.003637 
+0.004409 -0.001501 0.000863 -0.000184 -0.001557 -0.000638 
+0.001181 -0.001622 0.002142 0.000000 0.000000 0.000000 
+0.000457 0.000913 0.000945 -0.001529 0.001239 0.000132 
+-0.000758 0.000404 -0.000161 0.000596 -0.000183 0.000134 
+0.002879 -0.001364 0.001970 0.004135 0.000854 0.000641 
+0.002626 -0.001051 0.001510 0.000080 -0.001797 0.000177 
+-0.000194 -0.001901 -0.000778 0.000856 0.002289 -0.001721 
+0.002596 -0.000346 0.000778 0.002267 -0.000090 -0.000306 
+0.002775 0.000292 0.000863 0.002814 -0.000786 0.002214 
+0.002729 0.000606 0.000401 0.005226 0.000199 -0.002161 
+0.004182 0.003604 -0.001317 0.000007 0.000284 0.000066 
+-0.001148 0.000893 -0.003947 -0.004022 0.004016 -0.003403 
+-0.002572 0.003206 -0.002134 0.000312 -0.001475 0.000720 
+-0.002570 -0.001942 0.006090 0.001841 -0.000933 0.001817 
+-0.000811 -0.003875 -0.000631 -0.001303 0.001059 -0.001553 
+0.000230 0.001700 -0.005599 -0.001771 -0.000157 -0.004816 
+-0.002566 -0.001101 -0.002751 0.000278 -0.000327 -0.000641 
+-0.001860 0.002429 -0.002162 0.000714 -0.000159 -0.001270 
+0.001871 0.001307 0.000846 0.001822 -0.000179 0.003254 
+0.001304 0.000591 0.001944 -0.000174 0.000090 0.000098 
+0.000342 -0.000872 -0.002048 -0.001842 -0.002301 -0.001448 
+-0.001640 -0.004414 -0.000605 0.000603 -0.003941 0.000291 
+0.003676 -0.000138 0.000058 0.004689 0.001376 -0.002724 
+0.002890 0.000822 -0.003368 0.001442 0.000964 -0.001764 
+0.000234 -0.001484 0.000625 -0.003736 -0.002871 0.000904 
+-0.005774 -0.002876 0.000267 -0.004216 -0.001669 -0.001318 
+-0.000389 -0.001168 -0.002290 0.000338 -0.000169 -0.004154 
+-0.000383 0.000279 -0.003103 -0.001125 0.000746 -0.001869 
+0.000000 0.003467 -0.001156 0.005344 0.003544 -0.002427 
+0.005257 0.003772 -0.005079 0.002038 0.001591 -0.001335 
+-0.003596 -0.001658 0.001866 -0.006821 -0.002807 0.004391 
+-0.006735 -0.002686 0.002926 -0.003070 -0.000569 0.000670 
+0.001784 0.000471 0.000611 0.000104 -0.002068 0.003615 
+-0.001715 -0.001129 0.002205 0.001247 0.000270 -0.000660 
+0.001726 -0.002000 -0.000777 -0.003432 -0.000955 -0.005197 
+-0.002129 0.002736 -0.005069 0.000321 0.003406 -0.002112 
+-0.003990 0.001153 -0.000138 -0.005481 0.000415 0.003647 
+-0.004547 -0.002015 0.005161 -0.007323 -0.002393 -0.000702 
+-0.003730 0.001081 -0.000395 -0.002514 0.000117 0.000369 
+-0.003502 -0.002513 -0.000047 -0.005613 -0.001405 -0.000001 
+-0.001538 -0.001731 -0.000962 -0.002002 0.001481 -0.000737 
+0.000053 -0.002515 -0.001089 -0.004007 -0.005166 -0.002142 
+-0.004239 -0.001286 -0.001667 0.001819 0.002497 -0.006433 
+0.006881 0.007578 -0.001376 0.001083 0.001445 -0.003431 
+0.003315 -0.001395 0.003446 -0.001214 -0.007997 0.003606 
+0.004060 0.000350 -0.002097 0.006351 0.005440 0.000273 
+0.003979 0.004451 0.003309 0.001905 0.001806 0.000722 
+0.000104 -0.002868 0.001517 0.000000 -0.005899 0.001439 
+0.000432 -0.002806 -0.002158 -0.001448 -0.000249 -0.002580 
+-0.002228 0.006053 -0.002080 -0.000704 0.004625 -0.004809 
+0.000085 0.001933 0.000119 -0.000066 -0.001638 0.002073 
+0.001008 -0.000617 0.001916 0.001011 -0.002101 0.000053 
+0.001492 -0.001000 -0.002552 0.001061 -0.002092 -0.001724 
+0.004861 0.001527 0.000411 0.004661 0.002964 -0.003213 
+0.001128 0.000777 -0.004062 -0.001411 -0.000445 -0.003073 
+0.000267 0.001157 -0.001070 -0.000666 0.002202 0.000364 
+-0.000581 0.000711 -0.000046 -0.002426 -0.003676 0.002426 
+0.000687 -0.003234 0.000939 -0.000528 -0.000026 0.000189 
+-0.003090 -0.000723 -0.003353 -0.001486 -0.002514 -0.001423 
+0.000770 -0.004002 0.002566 0.002106 -0.004487 0.002326 
+0.000935 -0.002452 0.001018 0.000093 0.000016 -0.000068 
+0.000123 0.000292 -0.000333 0.000567 -0.000033 0.000370 
+0.000157 -0.000066 -0.000463 -0.001548 -0.001602 -0.000977 
+-0.001619 0.000845 -0.001142 -0.002547 0.000424 0.001185 
+0.000969 0.001725 0.000456 -0.000797 0.000864 -0.002540 
+0.002793 0.003985 -0.007851 0.001091 0.008179 -0.008361 
+0.000967 0.006627 -0.009797 0.005926 0.003660 -0.003329 
+0.000518 0.000796 -0.000217 -0.001536 -0.003197 0.002228 
+-0.001532 -0.002509 0.003283 0.001625 0.001103 0.001126 
+0.004796 0.001344 0.000034 0.004256 0.000373 -0.001710 
+0.003660 -0.000796 -0.001560 0.000749 -0.002057 -0.002010 
+0.001710 -0.002051 -0.000545 0.005000 0.000436 0.000546 
+0.000000 -0.007009 0.005214 -0.002439 -0.005152 -0.004406 
+-0.010894 -0.006584 -0.002769 -0.010718 -0.004065 0.000824 
+-0.006870 -0.000265 0.003966 -0.004633 -0.001065 0.001471 
+-0.001503 -0.002511 0.003940 0.000539 -0.001043 0.002384 
+-0.000155 -0.000129 0.001549 -0.000646 -0.002044 -0.000718 
+-0.001267 0.000447 -0.001692 -0.001384 0.003851 -0.004182 
+-0.001987 0.002479 -0.005298 -0.001494 0.001724 -0.003665 
+-0.001012 0.001284 -0.001654 0.000068 -0.000861 -0.000493 
+0.000915 0.000024 0.000069 0.004047 0.002406 -0.000143 
+0.003014 0.007222 0.000068 -0.000283 0.004087 0.000046 
+-0.001438 -0.000299 -0.001587 -0.003728 -0.003071 0.002139 
+-0.001473 -0.003232 0.003175 0.002979 -0.004058 0.002438 
+0.002827 -0.005299 0.004004 0.000625 -0.005312 0.005312 
+-0.002686 -0.004334 0.006674 -0.002100 -0.000970 0.006367 
+-0.002220 0.002047 0.001349 -0.003974 0.004918 -0.001391 
+0.003475 0.009554 -0.009372 0.004541 0.005941 -0.007465 
+0.005767 0.001251 -0.003967 0.005008 -0.003130 -0.001190 
+0.003284 -0.001642 0.001791 0.002112 0.000471 0.002366 
+0.003823 0.001615 -0.000911 0.003243 -0.000204 -0.007196 
+0.005879 -0.001430 -0.010328 0.007431 0.006738 -0.003022 
+-0.000430 0.000430 -0.002500 -0.002146 0.000663 0.001578 
+-0.003939 0.001672 0.001618 -0.001235 0.000815 -0.000971 
+-0.002761 -0.000560 0.000560 0.000370 -0.000461 -0.000191 
+0.000751 -0.001277 -0.000188 -0.001532 -0.001290 -0.000565 
+-0.001435 -0.000921 0.000284 -0.002383 -0.000373 0.000538 
+-0.002047 0.000754 0.000172 0.000034 -0.001344 0.002194 
+0.001102 -0.002266 0.000367 0.004151 0.001358 0.001381 
+0.003890 0.005470 -0.007203 -0.000982 0.005510 -0.004310 
+-0.000314 0.000628 -0.004959 -0.000441 -0.002067 -0.004862 
+-0.000160 -0.002401 -0.004164 -0.000322 0.000667 -0.002943 
+-0.000887 0.001515 -0.002478 -0.000590 -0.000157 -0.002649 
+0.006392 -0.000052 -0.003432 0.000320 0.001910 -0.001560 
+-0.000076 0.001615 -0.000569 0.000000 0.000000 0.000000 
+0.000615 -0.000163 -0.001375 -0.000068 -0.002171 0.000274 
+-0.005640 -0.002895 0.000875 -0.007878 -0.003195 0.000473 
+-0.007565 -0.003181 -0.000689 -0.004434 -0.002901 -0.000566 
+-0.000339 -0.000085 -0.000085 0.003118 0.001347 0.000689 
+0.004708 0.000221 0.002343 0.003080 -0.000068 0.000858 
+-0.001555 -0.000009 -0.001725 -0.003666 0.000409 -0.004331 
+-0.004878 -0.000921 -0.004758 -0.006567 -0.000867 -0.000520 
+-0.002555 -0.000186 0.000949 0.000021 -0.000270 -0.000268 
+0.001391 -0.002522 -0.001218 0.001308 -0.004632 0.000554 
+0.001726 -0.000902 0.001411 -0.000759 0.002145 0.001661 
+-0.003871 0.004956 0.001655 -0.007512 0.004088 -0.002431 
+-0.005619 -0.000812 0.001480 -0.002776 -0.000395 -0.000238 
+-0.000157 -0.002034 0.000691 -0.000850 -0.002056 -0.000421 
+-0.000730 -0.001642 -0.000122 -0.000253 -0.001013 0.001389 
+-0.001352 -0.001440 0.003410 -0.001978 -0.002727 0.003207 
+-0.000849 -0.003325 0.003254 0.002063 -0.002165 0.003049 
+0.000722 -0.001624 -0.001472 0.004783 -0.000531 -0.003955 
+0.000361 -0.000504 0.000555 0.002576 0.000088 0.001922 
+-0.000593 -0.000360 0.002606 -0.000218 0.000864 -0.000673 
+0.001227 0.005094 -0.002110 0.000821 0.003099 -0.003841 
+-0.001003 0.002124 -0.001738 0.000306 0.001020 -0.002551 
+0.003244 0.001426 0.001971 0.004910 0.003909 0.002052 
+0.003434 0.003434 0.000763 -0.001072 -0.001289 0.000944 
+-0.000825 -0.004236 -0.000981 -0.001192 -0.005399 0.003997 
+0.000600 -0.000179 -0.000383 0.001118 -0.000150 -0.001193 
+0.001473 0.002040 -0.002550 -0.002668 0.000499 -0.002293 
+-0.003625 -0.002673 -0.002296 -0.003855 -0.001141 -0.001724 
+0.000274 0.000440 -0.001741 -0.000056 0.001114 -0.002783 
+0.001242 0.004614 -0.001600 0.000651 0.003491 -0.001972 
+0.001068 -0.000171 -0.001410 0.000816 0.001360 -0.001000 
+0.000080 0.000769 0.001266 0.000789 -0.002707 0.003045 
+-0.000425 -0.001822 0.003918 0.000060 -0.002538 -0.000362 
+0.002980 0.001256 -0.003398 0.000892 -0.001234 -0.000577 
+-0.001639 -0.001090 -0.001528 -0.001417 -0.000188 -0.001699 
+-0.003566 -0.001857 0.002341 -0.000363 0.000532 0.000454 
+0.000068 0.000700 0.000474 0.002389 0.003485 0.000561 
+0.001403 -0.000345 0.002207 -0.000429 0.000991 0.001226 
+-0.000127 -0.000394 -0.001594 -0.001552 -0.001944 -0.002396 
+-0.000248 -0.001784 -0.000898 -0.000848 -0.000147 0.000391 
+0.000090 -0.000045 0.003358 -0.003336 -0.001773 -0.000280 
+0.001617 -0.003078 -0.003815 0.010401 -0.000113 -0.006541 
+0.014752 -0.002849 -0.007558 0.010793 -0.002481 -0.009850 
+0.006133 -0.001184 -0.004018 -0.000759 0.000086 0.000545 
+-0.005656 -0.001007 0.002310 -0.003628 0.000304 0.003526 
+-0.001163 -0.001206 0.000956 0.003216 -0.003731 0.000186 
+0.003895 -0.002361 -0.000925 -0.001985 -0.004077 -0.001019 
+-0.005802 0.000368 0.002576 -0.003595 -0.000530 -0.001483 
+-0.001072 -0.000724 -0.002158 -0.000487 0.000259 -0.000829 
+-0.000643 0.001027 0.002245 -0.004309 -0.000243 0.003945 
+-0.004442 -0.001087 0.002072 -0.004071 -0.002148 0.000888 
+-0.004727 -0.002483 0.004647 -0.002899 -0.004846 0.004877 
+-0.001831 -0.005627 0.005046 -0.002037 -0.007849 0.002956 
+-0.003539 -0.006988 0.004590 -0.001666 -0.005330 0.001668 
+-0.001845 -0.000404 -0.000620 0.000668 -0.001944 -0.002156 
+0.002088 -0.001320 -0.001470 0.002236 0.000160 0.000160 
+0.001159 -0.000571 0.001026 -0.000732 -0.002309 0.003726 
+-0.001287 -0.000652 0.006040 0.001181 0.002087 0.002244 
+-0.001887 0.002528 -0.001364 -0.000818 0.004719 -0.003209 
+0.002316 0.004835 -0.003919 0.005303 0.001288 -0.005152 
+0.006336 0.001132 -0.004526 0.004536 0.003797 -0.001233 
+-0.000361 0.000882 0.000649 0.001090 -0.002907 0.002624 
+-0.002639 -0.001736 -0.001736 0.000000 -0.004043 0.001915 
+0.000097 -0.000133 0.000060 -0.000908 0.000540 -0.000916 
+-0.000256 0.000195 -0.001327 -0.000168 -0.000041 -0.001045 
+-0.001141 0.000643 -0.000529 0.000350 0.000117 -0.000417 
+-0.001077 -0.001564 0.000625 -0.003124 -0.005260 0.002968 
+-0.004315 -0.005077 -0.001438 -0.002332 -0.002708 0.000167 
+0.001052 0.000846 -0.000938 0.001663 0.000067 -0.001433 
+0.000675 -0.000208 -0.000864 0.000967 -0.002296 -0.000524 
+0.000203 -0.004962 0.000068 -0.002231 -0.003347 0.000305 
+-0.001927 -0.001996 -0.000017 -0.004451 -0.000995 0.000379 
+-0.006433 -0.001553 -0.000012 -0.005058 -0.003480 -0.000451 
+-0.003977 -0.003832 0.001940 0.000102 -0.002787 0.000571 
+0.000982 -0.000801 0.000517 -0.002188 -0.000724 0.000868 
+-0.005666 0.000302 0.004256 -0.001374 0.003664 0.002061 
+0.000436 -0.000014 0.000275 0.003180 0.001670 -0.000847 
+0.002286 0.000048 -0.001260 -0.002493 -0.002472 0.000515 
+-0.002348 0.000000 0.001591 0.001224 -0.006364 -0.002938 
+0.001731 -0.003463 -0.009254 -0.000494 -0.003611 -0.008012 
+-0.000822 -0.001887 -0.003967 0.000385 0.000662 0.000625 
+-0.001672 -0.000027 0.001163 -0.000745 -0.003027 0.003674 
+-0.001994 -0.003847 -0.000163 -0.001545 0.001153 -0.001648 
+-0.000084 -0.000750 -0.002466 0.000758 -0.003241 0.000965 
+-0.004993 -0.006875 0.003519 0.000399 -0.005588 0.008258 
+0.002685 -0.000087 0.003970 0.003984 0.001911 0.001911 
+0.000622 0.001058 0.000871 -0.001811 -0.001847 0.003731 
+-0.002500 -0.001177 0.003532 0.000615 0.001360 0.000923 
+0.000394 0.001260 -0.000472 0.000011 -0.002137 -0.000720 
+-0.001084 -0.001589 0.000470 0.000641 0.001813 -0.000123 
+0.002619 0.003290 -0.000268 0.002459 0.000492 -0.000643 
+0.000428 -0.000714 -0.001159 0.000115 0.000326 -0.001403 
+0.001023 0.001325 -0.000177 0.001421 -0.001935 0.004141 
+0.000470 -0.005766 -0.001742 0.000787 -0.002019 -0.000365 
+0.003456 0.002699 0.000923 0.002945 0.005441 -0.003452 
+-0.001933 0.000612 -0.000227 -0.001289 0.001590 0.000981 
+-0.000119 0.000149 0.000090 0.000748 -0.000216 -0.000374 
+0.000282 0.000630 -0.000815 -0.000194 0.001144 -0.000946 
+0.003962 0.001251 -0.000830 0.001218 0.002254 0.000364 
+0.001534 -0.000019 0.001713 0.001229 0.000070 0.000093 
+0.002856 0.002092 -0.003077 -0.000825 0.003386 -0.006687 
+-0.001671 0.002105 -0.004477 -0.002185 -0.002452 -0.000425 
+0.000780 0.000959 0.003961 0.003492 0.007217 0.002095 
+0.007451 0.003758 -0.006242 0.001276 0.000033 -0.003876 
+-0.000086 -0.001210 0.001467 -0.003313 0.000994 -0.001988 
+-0.002108 0.002737 -0.000296 0.002674 0.002683 -0.000535 
+0.000560 -0.001348 -0.000594 0.002781 -0.001320 0.002424 
+0.003526 0.001593 0.001883 0.005261 0.005261 -0.004254 
+0.002426 0.002727 0.001472 -0.000591 0.001182 -0.003333 
+-0.001235 0.000722 0.000432 -0.004788 -0.001835 0.001255 
+-0.006593 -0.004123 -0.001511 0.000819 -0.002946 -0.002867 
+0.002700 0.002772 -0.002716 0.003454 0.007260 -0.001171 
+0.001394 0.005442 0.000179 0.000489 -0.001459 0.000489 
+-0.001032 -0.005540 0.000852 -0.001330 -0.002389 0.002457 
+-0.003062 -0.002000 -0.000625 -0.002275 -0.000107 -0.000589 
+0.000428 0.001084 -0.000475 0.002347 0.000572 0.000507 
+0.003015 -0.000884 -0.001419 -0.000076 -0.000957 -0.000125 
+-0.003818 -0.000076 0.001909 -0.005076 0.000000 -0.002803 
+-0.004111 0.000803 -0.001162 -0.003430 -0.000523 -0.001408 
+-0.003753 -0.001087 -0.000683 -0.002276 -0.000948 0.000106 
+0.001611 -0.000486 -0.001236 0.005819 0.003273 -0.002071 
+0.006221 0.004244 -0.003810 0.002233 0.004468 -0.001861 
+-0.001058 -0.000497 0.000669 -0.005040 -0.000695 0.004286 
+-0.002849 0.000926 0.004238 0.001067 -0.000996 -0.002963 
+0.002874 -0.002533 -0.008765 0.005231 0.001787 -0.008935 
+0.003163 0.003507 -0.002441 0.000720 -0.001056 0.001648 
+-0.001341 -0.001500 0.001253 0.000348 0.002238 -0.001048 
+0.001545 0.005546 -0.004900 0.001753 0.002229 -0.004221 
+0.001702 -0.003260 0.000519 0.002778 -0.001894 -0.000960 
+0.002816 -0.000971 0.001230 -0.000899 0.006822 -0.001798 
+0.009531 -0.002187 -0.006562 0.006408 0.004315 -0.010724 
+-0.000777 0.000557 0.000932 0.000297 0.000084 0.000135 
+0.001336 0.000839 -0.000576 0.000179 0.000744 -0.001641 
+-0.001779 0.000235 -0.001498 -0.002927 0.000340 0.000043 
+-0.000061 -0.000152 0.002080 0.000195 0.000195 0.002109 
+0.001615 -0.000505 0.000014 0.000223 0.000060 0.000147 
+-0.002760 0.000520 0.001900 -0.003215 0.001959 -0.001417 
+-0.001636 0.001104 -0.001340 -0.001039 0.001570 -0.001763 
+-0.001644 0.001678 -0.001073 0.000141 0.003063 0.001021 
+-0.003385 0.001803 0.001353 -0.002336 -0.002803 0.004571 
+-0.000063 -0.002367 0.001588 0.000818 0.002375 -0.001020 
+0.002678 0.004257 -0.004737 0.000000 0.003496 -0.003008 
+0.000449 0.000824 0.000113 0.000834 -0.000504 -0.000270 
+0.000703 -0.000280 0.000065 -0.001181 0.000787 -0.000394 
+-0.001564 0.000623 0.000073 0.000821 -0.000410 -0.000205 
+0.003058 -0.000351 -0.002356 0.003474 -0.000363 -0.003285 
+0.005175 0.001784 -0.001173 0.006519 0.006272 -0.000099 
+0.005381 0.006220 0.000607 0.001024 0.001816 0.000567 
+-0.002519 -0.000576 -0.000870 -0.000252 -0.000262 -0.000364 
+0.000652 0.003258 -0.001343 0.004096 0.005344 0.001692 
+0.001153 0.004581 0.000195 -0.004039 -0.000681 -0.000191 
+-0.006963 -0.004217 0.004337 -0.001619 0.001079 0.001940 
+-0.000552 -0.002696 -0.000845 0.003623 0.001113 -0.003591 
+0.004498 0.005830 -0.004108 0.003025 0.006431 -0.003531 
+0.000715 0.003006 -0.001205 -0.000970 0.000149 -0.000373 
+-0.000969 -0.000950 0.001755 0.000206 0.002025 -0.002541 
+0.002932 0.006919 -0.006880 0.000800 0.006479 -0.006915 
+-0.001180 0.000563 -0.002878 -0.007068 -0.003906 -0.001649 
+-0.004183 -0.004828 -0.000398 0.000424 0.000679 -0.001942 
+0.006679 0.001392 -0.001271 0.003293 0.003753 -0.000528 
+0.001365 -0.003516 0.003639 -0.005376 -0.001143 0.004692 
+-0.007290 -0.007290 0.004733 -0.000930 -0.002324 0.006740 
+-0.001834 -0.006548 0.005041 0.001403 -0.006235 0.001185 
+0.001269 -0.003121 -0.000995 0.002817 -0.002661 0.002972 
+0.000777 0.000698 0.001669 -0.001557 0.001674 0.001322 
+0.000138 0.002041 -0.000246 0.000876 -0.000628 -0.000045 
+0.001306 -0.001696 -0.000209 0.001133 -0.000593 0.001107 
+0.002946 0.003962 -0.004572 0.004870 0.004636 -0.005571 
+0.005079 0.001111 -0.003810 0.000349 -0.000251 0.000330 
+0.000955 0.003821 -0.002256 -0.001027 0.002412 -0.003100 
+-0.001439 0.001114 0.000496 0.001326 -0.000713 0.001181 
+0.000771 -0.002880 -0.000111 -0.000228 -0.002354 0.001994 
+0.000451 -0.000828 0.002567 -0.000165 0.000214 0.000905 
+-0.001076 -0.003387 -0.000380 -0.000998 -0.001117 -0.000459 
+-0.000074 0.000707 -0.001900 -0.000790 0.001343 -0.000042 
+-0.000560 0.000670 0.000104 0.001585 0.000669 -0.002465 
+0.001208 0.004869 -0.000311 -0.001439 0.001942 -0.000432 
+-0.001775 -0.000322 0.001342 -0.002996 -0.000609 0.003621 
+-0.000189 0.000264 0.000809 0.001572 0.004774 -0.004601 
+0.007928 0.005983 -0.006535 0.006115 0.002040 -0.002035 
+-0.000565 0.002339 0.000565 -0.004901 -0.000893 0.001845 
+-0.002694 -0.002520 0.000770 0.001895 -0.002665 0.000574 
+0.002648 -0.002256 0.000448 -0.000196 -0.000517 0.000907 
+-0.002207 0.002153 -0.000995 -0.003732 0.000570 -0.004559 
+-0.000804 -0.001327 -0.004220 0.000231 0.000020 -0.000268 
+-0.000501 0.002594 0.002626 0.000560 0.002949 0.001054 
+0.004085 0.001825 0.000758 0.004081 0.001667 0.002177 
+0.002445 0.000401 0.001752 0.001599 0.000687 -0.000112 
+0.000018 0.000237 -0.000343 -0.004337 0.001808 -0.003186 
+-0.006863 0.002561 -0.000037 -0.004320 -0.000526 0.001012 
+-0.000972 -0.000014 -0.001013 0.001759 0.001072 -0.001807 
+0.001939 0.000161 -0.000388 -0.001410 -0.003584 -0.000428 
+-0.000724 -0.005152 -0.000471 0.001683 -0.001541 0.000240 
+0.007175 0.001647 -0.001882 0.003234 0.002975 -0.009572 
+0.002889 -0.001792 -0.006294 0.003200 -0.003600 -0.000800 
+-0.000282 -0.004193 0.002420 0.001880 0.000682 -0.000469 
+-0.000815 0.003387 -0.000512 -0.002550 0.001541 0.003914 
+-0.002924 0.000210 0.003918 -0.000409 0.000865 0.000603 
+-0.001114 0.001867 -0.002769 0.001863 -0.001955 -0.002599 
+0.002679 0.002704 0.002568 0.000122 -0.000675 0.004964 
+0.005481 -0.002519 0.002519 0.000747 0.000908 -0.002182 
+0.002348 -0.000434 -0.002891 -0.001162 0.001051 -0.001330 
+-0.002068 0.002214 0.001773 0.000182 0.003152 0.001113 
+0.004136 0.000647 0.001458 0.006069 -0.000411 0.000725 
+0.005191 -0.000878 0.002634 0.001001 0.000984 -0.000034 
+0.002995 0.000542 -0.002087 0.004474 0.003481 -0.002237 
+0.003388 0.004091 -0.003036 0.002365 0.003891 -0.003174 
+0.001358 0.000438 -0.000594 0.000879 0.000032 0.002733 
+0.000173 -0.002462 0.000459 -0.002526 -0.001940 0.000903 
+-0.000259 -0.003498 -0.001685 -0.001611 -0.008858 0.001607 
+-0.008404 -0.005957 0.001958 -0.000388 -0.001258 -0.000910 
+0.000404 0.001219 -0.001758 0.003313 0.006026 -0.001038 
+-0.000385 0.004000 -0.000385 0.000326 0.000451 -0.000587 
+0.000842 -0.001151 -0.001053 0.000415 -0.001329 -0.001662 
+0.000189 -0.001569 0.000167 -0.001267 -0.002084 0.002860 
+0.000824 -0.000728 0.001469 -0.001865 -0.001039 -0.001058 
+-0.001646 -0.001450 -0.000235 -0.002179 -0.000028 -0.002096 
+-0.002599 -0.002247 0.001057 -0.001830 -0.001574 0.004431 
+0.000280 0.000120 0.002800 0.002797 -0.000812 -0.002159 
+0.003219 -0.001651 -0.005849 0.002352 0.000652 -0.005400 
+0.000395 0.002251 -0.000807 -0.002817 0.000741 0.002866 
+-0.003688 -0.001709 0.003077 -0.002199 -0.001964 0.002142 
+-0.000071 -0.001383 0.001383 0.001264 -0.001180 0.000573 
+0.000663 0.000362 -0.000556 0.001493 0.002239 -0.000746 
+0.003420 0.000909 -0.001371 -0.000641 -0.001333 -0.001974 
+-0.001172 -0.000761 -0.003208 -0.000405 -0.001049 -0.002586 
+0.002989 0.000374 -0.003214 0.001772 0.000966 -0.002536 
+-0.001142 -0.001305 -0.001418 -0.000158 -0.003923 -0.001109 
+-0.000382 -0.004297 -0.002070 -0.000802 -0.000196 -0.000156 
+-0.000212 0.000335 -0.002711 -0.002511 0.000322 -0.003567 
+-0.002934 0.000266 -0.004572 -0.002050 0.000576 -0.004784 
+0.000873 0.004013 -0.001802 0.001505 0.003843 -0.001001 
+0.001594 0.002633 0.001143 0.001421 0.001214 0.000698 
+0.002826 -0.001268 -0.001377 0.002436 -0.001467 -0.002416 
+0.000923 0.000544 -0.002568 0.000448 0.002612 0.000000 
+0.001415 0.002796 -0.004409 0.000843 0.000999 -0.002046 
+-0.001108 0.000338 0.001023 -0.000917 0.002272 0.001947 
+0.000039 0.003052 0.001789 0.001722 0.002915 0.001014 
+0.001254 0.000463 0.001384 0.000519 -0.000289 -0.000096 
+0.002450 -0.000606 -0.002682 0.004781 -0.000906 -0.002399 
+0.003849 0.002178 -0.000937 0.000514 0.002489 -0.000796 
+0.000206 0.002311 0.000427 0.002011 -0.000783 0.002234 
+0.001383 -0.001614 0.002121 0.000872 -0.000884 0.000575 
+-0.001926 -0.000815 0.003852 -0.000317 0.001946 0.001439 
+0.000742 0.001291 0.002184 -0.001319 0.001111 0.002049 
+0.001866 0.005220 -0.000671 -0.000248 0.000073 0.000919 
+-0.002485 -0.001045 0.003050 -0.001642 -0.004757 -0.000429 
+0.000086 -0.004000 0.000689 -0.000628 -0.003005 -0.001630 
+0.002236 -0.001995 0.001974 0.003059 -0.000946 0.001454 
+-0.000681 -0.000928 -0.000774 -0.000136 0.000054 -0.003071 
+-0.001945 -0.002919 -0.000489 -0.001734 -0.001418 0.002600 
+-0.002326 0.000000 0.001861 -0.003310 -0.000739 -0.000739 
+-0.001415 0.003150 -0.004532 -0.000341 0.001363 -0.003917 
+-0.000198 -0.001358 -0.001457 -0.000860 -0.002753 -0.001057 
+0.000513 -0.002211 -0.001020 0.001024 -0.001092 0.000410 
+0.000837 0.002394 0.000826 0.005334 0.006002 -0.002918 
+-0.000967 0.000576 -0.005450 -0.001156 0.000156 -0.001640 
+0.000906 0.001288 -0.003737 -0.000931 0.003884 -0.000800 
+-0.001459 0.000818 -0.000442 -0.000394 0.000277 0.000793 
+-0.000397 -0.001540 0.003856 0.000301 -0.001078 0.002251 
+0.000788 0.000269 -0.000802 -0.000721 0.000259 -0.000628 
+-0.003282 -0.002595 0.001832 -0.003596 -0.003594 0.002694 
+-0.001037 -0.001481 0.000296 0.003003 -0.000027 -0.002498 
+0.002464 0.001286 -0.003250 0.003551 0.001875 -0.000638 
+0.003921 -0.001174 0.000200 -0.000101 -0.000874 -0.001055 
+-0.001307 0.001642 -0.003268 -0.000484 0.001611 -0.002900 
+0.001709 0.000434 -0.001505 0.003715 -0.000963 -0.001548 
+0.003844 -0.000154 -0.001115 0.001068 -0.001281 0.000016 
+-0.000037 -0.001059 0.000056 0.000660 0.001285 0.000499 
+0.003262 0.003972 -0.002553 0.000393 0.003500 0.000393 
+-0.000315 -0.000284 -0.000693 -0.002952 -0.001771 0.000152 
+-0.001957 -0.002063 0.002928 0.002451 -0.007244 0.000919 
+-0.001182 -0.001544 -0.001081 -0.001910 -0.001410 -0.000910 
+-0.001515 -0.001629 -0.001629 0.000172 -0.000940 -0.002405 
+0.000927 0.000184 0.000079 0.002925 0.001180 0.001773 
+0.004365 0.002674 0.001783 0.002231 0.003250 0.000110 
+-0.000462 0.000077 -0.000475 -0.000591 0.001182 0.003712 
+-0.002491 -0.000484 0.004221 0.000441 -0.001242 0.000261 
+0.000618 -0.001212 0.000927 0.003925 -0.000355 -0.000147 
+0.002735 -0.000423 0.000893 -0.000526 -0.000743 0.003218 
+-0.002256 -0.003759 0.000752 -0.004254 -0.000487 0.001949 
+-0.001433 0.000911 -0.002464 0.002450 0.003675 -0.004615 
+0.003908 0.001830 -0.003288 0.001639 -0.000408 -0.001539 
+0.004253 0.002218 0.001758 0.001877 0.000785 0.000142 
+-0.001649 -0.000652 -0.000933 -0.002119 -0.000064 -0.001853 
+-0.004433 -0.001955 0.004922 -0.000548 -0.000413 0.003429 
+-0.000064 -0.000560 0.000735 0.000600 -0.000436 0.000895 
+0.000533 -0.000129 0.001838 0.000992 0.001667 0.001533 
+-0.000013 0.001581 -0.001459 0.000065 0.000453 -0.002030 
+-0.000747 -0.000564 -0.000830 -0.000298 0.000277 0.000028 
+0.000039 0.001266 -0.000499 0.000892 0.001020 -0.001525 
+0.000602 0.002407 -0.001450 0.000976 0.001142 0.001737 
+0.004981 -0.000076 0.001170 0.005156 0.002500 -0.001719 
+-0.001122 -0.000034 -0.003605 -0.004614 0.000429 -0.003058 
+-0.004012 0.000466 -0.002533 -0.001067 0.000701 -0.002113 
+-0.001040 0.000324 0.000841 -0.002410 0.002474 0.002523 
+-0.000476 -0.004273 0.003321 -0.003224 -0.001752 0.004137 
+-0.001124 0.000775 0.000891 0.000359 0.001641 -0.000641 
+0.001347 0.002305 -0.001088 0.003260 0.001716 -0.001613 
+0.002287 0.002364 -0.002171 -0.000551 -0.000394 0.000236 
+-0.000644 -0.002608 0.002641 -0.002004 -0.001686 0.000020 
+-0.000680 0.002868 -0.003072 0.002742 0.005393 -0.004812 
+0.004719 0.004048 -0.004385 0.003233 0.002373 -0.002669 
+-0.000873 -0.001309 -0.006119 0.001041 0.000826 -0.000456 
+0.001004 0.001814 0.000011 0.002675 0.002065 0.001203 
+0.003049 0.001447 0.001731 -0.000858 0.000580 0.000332 
+0.000221 0.001729 0.000175 -0.000073 0.002195 -0.001842 
+0.001877 0.001552 -0.002487 0.001200 -0.000932 -0.000939 
+0.000126 -0.001717 0.001843 -0.000902 -0.000229 0.002063 
+-0.001888 -0.001472 -0.000149 -0.000481 -0.001208 -0.000813 
+-0.001967 -0.000082 -0.001885 -0.001094 0.000446 0.002114 
+0.000000 -0.001119 0.002090 -0.000010 -0.000450 -0.000113 
+-0.003562 0.001370 0.001918 -0.001063 0.003375 0.003105 
+0.000714 0.003874 0.001835 -0.000478 0.002041 0.000670 
+-0.001009 0.001183 -0.001809 0.000649 0.001865 -0.002162 
+0.000284 -0.000378 -0.000752 0.001874 -0.000350 0.000963 
+0.000206 -0.002416 0.000818 0.001741 -0.000690 -0.001302 
+0.002485 -0.000334 -0.004487 0.003101 0.000402 -0.003709 
+0.001366 -0.001956 -0.001626 0.000104 -0.002864 0.001261 
+-0.001039 -0.001781 -0.003333 0.001775 0.001612 -0.004896 
+0.001830 -0.000460 -0.001224 0.004947 0.003967 -0.002956 
+0.000194 -0.002394 0.001417 -0.000487 -0.000590 0.000394 
+-0.000386 -0.002483 -0.005186 -0.000192 0.000433 -0.000338 
+-0.006463 -0.002662 0.003709 -0.007665 -0.005749 0.003566 
+-0.006177 -0.002896 -0.000486 -0.000496 -0.000161 -0.002265 
+0.001754 -0.002337 -0.000580 0.002361 0.000514 0.000817 
+0.002195 -0.000401 -0.001689 0.000874 -0.001311 -0.004242 
+-0.001215 -0.001259 -0.002430 0.000152 -0.001212 -0.000152 
+0.002316 -0.001038 -0.000199 0.002965 0.002009 -0.003443 
+-0.000824 0.001664 -0.003282 -0.001065 -0.000451 -0.001420 
+-0.000673 -0.001403 0.000898 0.001105 -0.000781 -0.000008 
+0.000654 -0.000260 -0.000114 -0.001129 -0.000889 0.000385 
+0.000000 0.000294 0.001838 -0.000355 0.000762 0.001368 
+-0.001077 -0.000462 0.000000 -0.000720 -0.002008 0.000076 
+-0.000620 -0.001687 -0.000280 0.001334 -0.001185 0.000470 
+0.000125 -0.000596 0.000612 0.000370 -0.002070 0.000889 
+-0.002472 -0.002265 0.003242 -0.001584 -0.002918 0.002549 
+0.000785 0.000119 0.000527 0.003424 0.000127 -0.001077 
+0.003559 0.001228 -0.001479 0.001077 0.000235 0.000396 
+0.000556 -0.002222 -0.000556 -0.001259 -0.000036 0.000737 
+-0.000648 0.001401 -0.002425 0.001860 0.006365 -0.003281 
+0.003950 0.007397 -0.003231 0.002754 0.002116 -0.004445 
+-0.001334 -0.001505 -0.001436 -0.004861 -0.002340 0.000018 
+-0.002551 -0.002399 0.001237 0.004436 -0.000226 0.000226 
+0.003715 0.002214 0.001644 0.003996 -0.002065 0.001310 
+0.002713 0.001938 -0.001550 0.000363 0.003431 -0.000807 
+-0.000688 0.001479 -0.000671 -0.000213 -0.002270 -0.000213 
+0.000838 -0.003147 0.000508 -0.000075 -0.000865 0.000714 
+0.001097 -0.000409 -0.001257 -0.000052 -0.001404 -0.001242 
+-0.004136 -0.001379 0.004697 -0.001492 -0.000351 -0.000535 
+0.000305 -0.002629 -0.001534 0.002513 -0.002084 -0.001753 
+0.000618 0.001691 -0.006002 -0.002421 0.000908 -0.002791 
+-0.003933 0.000720 -0.000519 -0.003239 -0.000846 -0.000874 
+-0.000456 -0.002445 -0.000567 0.000523 -0.002182 0.000447 
+-0.000740 -0.000952 0.001269 0.000131 -0.000615 0.001668 
+-0.000996 0.000148 -0.000003 -0.000168 -0.000507 0.000035 
+0.000850 -0.000110 -0.000549 0.001913 0.001590 -0.000750 
+0.000000 0.002937 -0.002063 0.002763 0.001011 -0.002359 
+0.002141 0.001218 -0.001477 0.001653 0.001476 -0.001246 
+0.001523 0.005554 -0.003727 0.000312 0.002350 -0.002974 
+0.000199 -0.000726 -0.000347 0.001320 -0.003472 0.001092 
+-0.005020 -0.004549 0.000283 -0.002252 -0.004659 0.002798 
+-0.000484 -0.001789 0.001644 -0.000936 -0.001205 0.000295 
+-0.004031 -0.000194 -0.000194 -0.001970 0.001418 0.002050 
+-0.000113 -0.000564 0.001805 0.001161 0.003676 -0.000388 
+0.006588 0.004881 -0.002381 0.004536 0.002071 -0.003393 
+-0.000390 0.000585 -0.000217 0.000042 -0.000165 -0.000046 
+0.000564 -0.000723 0.000082 0.004171 0.001946 -0.001279 
+0.000798 0.005133 -0.004961 -0.001560 0.006240 -0.005407 
+-0.005282 0.000539 -0.004203 -0.003810 -0.000534 -0.005145 
+0.001166 -0.001528 -0.003639 0.003891 0.002279 -0.002515 
+0.003518 0.003638 -0.002465 0.001384 0.003814 -0.001159 
+0.000200 0.000138 0.000231 -0.000249 -0.000414 -0.000861 
+-0.000091 -0.002056 -0.002950 -0.000955 -0.005178 -0.001603 
+-0.001510 -0.001530 -0.000968 -0.001492 0.003136 0.002193 
+0.002071 0.002507 0.004686 0.000775 -0.001294 0.007751 
+0.000000 -0.003028 0.007394 -0.000826 -0.001652 0.003841 
+0.000575 0.000943 0.000094 -0.000194 0.000429 -0.000831 
+-0.003047 0.000045 0.000009 -0.002379 0.000683 0.002159 
+0.003016 0.000641 -0.001092 0.007419 0.001414 -0.005180 
+0.005165 0.000619 -0.000896 0.000509 0.004102 -0.001028 
+-0.001527 -0.000622 0.000934 -0.000437 0.002121 0.000291 
+0.002707 0.001062 -0.000955 0.003309 0.001397 0.000000 
+0.004636 0.002083 0.001512 0.003259 0.004876 0.001617 
+0.002530 -0.000632 0.002406 -0.000449 0.000309 0.000523 
+-0.002394 -0.000264 -0.001381 -0.001107 -0.001183 -0.001221 
+0.000455 0.000606 0.000000 -0.000034 0.000865 0.000239 
+-0.001322 0.001607 0.001312 -0.002153 0.001434 -0.000020 
+-0.000217 0.001831 -0.003096 -0.001086 0.000834 -0.001463 
+0.000258 -0.000802 -0.001402 0.000331 -0.001963 -0.002970 
+0.000228 -0.005114 -0.002531 0.001030 -0.003162 -0.003430 
+-0.000770 -0.002805 -0.002342 -0.001782 -0.001239 0.000551 
+0.001066 0.000267 -0.001866 0.001516 -0.000927 -0.003371 
+-0.000554 0.000610 -0.003436 -0.000073 0.001511 -0.000504 
+0.001676 0.000545 -0.002782 0.001244 -0.000977 -0.001823 
+-0.002817 -0.000937 0.002548 -0.004669 -0.001251 -0.001282 
+0.000026 0.001948 -0.000910 0.002460 0.002570 -0.002907 
+0.005057 0.000719 -0.003024 0.006109 -0.001266 -0.002978 
+-0.000017 0.002271 -0.001161 -0.000940 -0.000336 -0.001935 
+-0.003448 0.000356 0.000751 -0.001158 0.000724 0.002320 
+-0.000738 -0.003218 0.002470 0.000406 -0.002993 0.001827 
+-0.000551 0.000010 0.002122 -0.003543 -0.000079 0.003148 
+0.000604 -0.001280 0.000780 -0.000542 -0.001912 -0.002026 
+0.003102 -0.003183 -0.003561 0.003090 0.000713 -0.004516 
+0.004392 0.001794 -0.000392 0.003533 -0.000228 -0.001094 
+0.000870 -0.000849 -0.000913 -0.003333 -0.000939 0.001879 
+-0.002569 -0.000927 0.004424 -0.000764 -0.001009 0.001854 
+-0.000720 0.001656 -0.001032 0.000906 0.005988 -0.003086 
+0.003788 0.003159 -0.001053 -0.000756 0.001000 0.002008 
+-0.002000 -0.000182 0.002270 0.000118 -0.000059 -0.000221 
+-0.000121 0.000242 -0.000909 -0.000150 0.002401 0.001726 
+0.004146 0.003059 0.000510 0.001288 -0.000849 -0.001435 
+0.002126 -0.002073 -0.000213 -0.001178 0.000347 0.000995 
+-0.001851 0.002067 0.004026 0.002810 -0.000702 0.004917 
+0.003781 0.002589 0.002793 0.002956 0.001240 -0.001597 
+0.000633 0.001086 -0.002309 0.000011 0.000212 -0.002031 
+0.000746 0.001194 -0.000469 0.000148 0.003040 0.000247 
+-0.000461 0.001843 0.000921 0.001725 -0.000068 -0.001461 
+0.000063 0.000303 -0.001862 -0.000125 -0.001229 0.000735 
+0.000844 -0.001630 0.000281 0.000768 0.001262 -0.001484 
+0.002760 0.004154 -0.004628 -0.001650 0.001827 -0.001561 
+0.001939 0.004112 -0.000802 0.001543 0.000379 0.000531 
+-0.000396 0.000353 0.000841 -0.000484 0.000807 -0.002030 
+0.005122 0.001955 -0.002376 0.006385 -0.000482 -0.000803 
+0.002667 0.000436 -0.003103 -0.000796 -0.000954 0.001397 
+-0.002486 -0.003207 0.004309 -0.001564 -0.002547 -0.001398 
+-0.000152 -0.001091 -0.001518 -0.001541 -0.000196 -0.002676 
+-0.001130 0.001091 -0.000668 -0.000773 -0.000397 0.000652 
+-0.001036 -0.001866 0.002429 -0.000835 -0.002943 0.001680 
+-0.000020 -0.003752 -0.000663 0.001594 -0.003124 -0.001721 
+0.000151 -0.001058 -0.002366 0.000043 0.001422 0.000387 
+0.001440 0.003365 -0.001093 -0.000234 0.000752 -0.000537 
+-0.001214 -0.001079 0.002327 -0.002219 -0.002910 0.002437 
+-0.002338 -0.002271 -0.001336 -0.000204 0.000714 -0.005726 
+0.003617 0.002064 -0.005559 0.003350 0.000797 -0.001811 
+0.005520 0.003440 0.000000 0.002268 0.004409 -0.004535 
+0.000037 0.001285 -0.002793 0.006056 0.000348 0.001183 
+0.003755 -0.000667 -0.001325 0.001192 0.000115 -0.000769 
+0.001476 0.002837 -0.003066 -0.002531 0.003460 -0.004132 
+0.000647 0.001512 0.000918 -0.000765 0.002583 -0.001338 
+-0.003703 0.002569 -0.000246 -0.004962 0.001886 0.000514 
+-0.000989 0.002498 -0.000087 0.003437 0.003303 -0.003034 
+0.000275 0.003941 -0.002289 0.003998 0.001496 0.002665 
+0.000575 -0.001631 0.000191 0.000532 -0.002266 -0.002108 
+-0.000682 -0.002328 -0.006260 -0.001699 0.001990 -0.006819 
+-0.002944 -0.000998 -0.000973 -0.000160 -0.003810 0.001217 
+0.000110 -0.003360 0.002631 0.000481 -0.001512 0.001597 
+-0.000212 0.001467 0.000974 -0.001221 0.001810 0.001803 
+-0.002544 0.000166 0.002074 -0.000805 0.000393 0.001667 
+-0.002034 0.000171 -0.001350 -0.001702 -0.001589 -0.002809 
+-0.001686 -0.000371 -0.000753 0.001188 -0.000363 -0.001638 
+0.002714 0.002751 0.000829 0.003730 0.005005 0.001026 
+0.004058 0.003152 0.000561 0.002013 0.001160 -0.001126 
+0.000668 -0.001530 0.001433 -0.001457 0.000080 0.002561 
+0.000195 0.000847 0.002836 0.002470 0.002140 -0.000880 
+0.005403 0.000632 -0.003717 0.004320 -0.001155 -0.002772 
+0.001214 -0.000878 -0.001014 -0.001031 -0.000795 -0.001566 
+-0.000416 0.000076 -0.004577 0.001759 0.001045 -0.006211 
+0.000553 0.002217 -0.002550 -0.002004 -0.002685 -0.000621 
+-0.001202 -0.004891 0.001449 0.000092 -0.001905 0.000458 
+0.000317 0.000913 -0.001548 -0.000323 0.000646 -0.001846 
+-0.000421 0.000706 -0.000556 0.002279 0.001985 -0.001691 
+0.001455 -0.000121 0.000546 0.001363 0.004815 0.000681 
+-0.000483 0.002638 -0.001914 -0.001027 0.001378 -0.000348 
+-0.001607 0.000995 0.000557 0.000032 0.002419 0.000012 
+-0.001507 0.000942 -0.000097 -0.001454 -0.000073 0.000386 
+-0.000292 -0.000087 0.000023 0.000218 -0.000872 -0.001200 
+0.001314 -0.000950 -0.001463 0.002415 0.004775 -0.002106 
+0.000355 -0.000522 -0.000197 0.001117 -0.000627 -0.000208 
+0.000589 0.000331 0.002106 -0.002717 0.001353 0.002700 
+-0.003716 -0.000989 0.003595 -0.001119 0.000358 -0.000268 
+-0.004103 -0.003474 -0.001626 -0.002836 -0.005702 -0.001082 
+-0.003638 -0.001416 0.000966 -0.004343 0.001410 -0.003419 
+0.000000 0.000531 -0.001947 0.006212 0.002712 0.001035 
+0.002530 -0.000628 -0.005706 -0.000779 -0.000600 -0.002975 
+-0.004545 -0.001112 0.001173 -0.001679 0.000080 0.002959 
+-0.000057 -0.000419 0.000454 0.002397 0.001984 -0.001405 
+0.001701 0.003512 0.003287 -0.001425 0.000448 0.003246 
+-0.002075 -0.002478 -0.000473 0.000471 -0.001568 -0.000535 
+0.000423 -0.001688 -0.000474 0.002713 -0.001416 0.000169 
+0.000780 0.000878 0.001124 -0.000228 -0.003259 0.004804 
+-0.000461 -0.003116 0.000732 0.000315 -0.000480 0.000057 
+0.003487 0.000675 -0.001713 0.002125 0.000536 -0.001121 
+-0.000156 -0.001226 -0.000817 -0.001129 -0.002073 -0.003202 
+0.000715 -0.001804 -0.004900 0.001356 0.000726 -0.003744 
+-0.002370 0.001481 -0.001778 -0.002192 0.000769 -0.002192 
+-0.003332 -0.002209 0.001098 -0.003607 -0.000924 0.004115 
+-0.003169 -0.000021 0.001647 -0.002171 0.000434 -0.000217 
+0.000388 0.001395 -0.001395 0.002030 -0.001459 0.000190 
+0.003968 -0.001856 -0.002918 0.001997 -0.000721 -0.002707 
+-0.002106 -0.000064 0.001105 -0.004832 -0.002323 0.006785 
+-0.004670 -0.004373 0.007578 -0.002856 0.000537 0.001439 
+-0.002109 -0.001914 -0.001914 0.000648 -0.000301 -0.000848 
+0.000254 -0.000007 0.000309 -0.000121 -0.000868 0.001055 
+-0.000651 0.000494 -0.001365 0.000148 0.001421 -0.003542 
+0.000843 0.000924 -0.002064 0.000618 -0.000096 -0.000536 
+0.000448 0.001427 -0.001362 -0.000640 0.004396 -0.002683 
+-0.003779 0.001808 -0.000164 -0.003286 0.001536 0.003107 
+-0.002156 0.000079 0.004939 -0.000883 0.000704 0.001785 
+0.002419 0.000018 0.000051 0.004623 0.002704 -0.001772 
+-0.000267 0.003669 0.000191 -0.000119 0.001608 0.000669 
+-0.000764 0.003451 -0.001317 0.001920 0.002500 -0.002440 
+0.002519 0.000661 -0.002136 0.001217 0.000229 -0.002718 
+-0.000395 0.000648 -0.000771 0.000704 -0.001077 0.001349 
+-0.000441 -0.005638 0.001409 0.000072 -0.000610 -0.003321 
+-0.000068 -0.003101 -0.005166 -0.000993 -0.000195 -0.004061 
+-0.001424 0.001239 -0.002975 -0.001984 0.001145 -0.000229 
+-0.001461 0.000461 0.000807 -0.001923 0.001556 0.000650 
+0.000149 0.001883 -0.001333 0.003422 0.003042 -0.001755 
+0.004602 0.003934 -0.000730 0.003248 0.005325 0.000197 
+0.000207 0.005545 0.000192 0.001074 0.001464 -0.001099 
+0.004070 0.004772 -0.002273 0.005243 -0.001488 -0.001171 
+0.001683 -0.002228 -0.003377 0.003275 -0.001881 -0.004093 
+-0.000144 -0.001612 -0.003772 -0.000037 -0.000782 0.001466 
+0.002040 0.000160 0.005160 0.001985 -0.002167 0.004877 
+0.003235 -0.002246 0.003898 0.001957 -0.001687 0.003396 
+0.000711 -0.000656 0.001148 -0.000745 0.001467 -0.000139 
+0.000101 0.001616 -0.000354 0.000000 -0.002105 -0.002331 
+0.002778 -0.001923 0.000819 0.000731 0.000309 0.000394 
+-0.000967 0.003488 -0.001290 -0.000282 0.004162 0.000776 
+0.002658 0.004375 -0.002127 0.003574 0.002326 -0.002707 
+0.003928 -0.000340 -0.003055 0.003314 -0.000475 -0.002222 
+0.000715 0.000817 -0.001430 -0.000636 0.000027 -0.001749 
+-0.000886 -0.002102 0.000196 0.000551 -0.001490 -0.001411 
+0.003261 -0.001141 0.001142 0.001092 -0.000142 0.000456 
+0.000481 -0.000581 -0.001281 0.002872 -0.000544 -0.002684 
+0.004280 0.000483 -0.002735 0.003802 0.000591 0.000083 
+0.001742 -0.000271 0.002708 0.000317 -0.000875 0.002941 
+0.002445 0.000000 0.001746 0.004365 0.000084 0.001472 
+0.003065 -0.001739 -0.000243 -0.002338 -0.002338 -0.001299 
+-0.005035 -0.000808 0.000373 -0.003906 -0.000481 -0.001122 
+-0.000670 0.000922 -0.000763 0.002500 0.000715 -0.002062 
+0.004124 0.000100 -0.002286 0.004171 0.000077 -0.002241 
+0.001716 -0.000345 -0.001050 -0.000164 0.000547 -0.000547 
+0.000813 -0.000379 -0.001872 0.003220 0.000611 -0.004849 
+0.000411 0.004465 -0.003437 -0.000623 0.003127 0.000429 
+-0.002231 0.000615 0.003077 0.000235 0.000841 0.000233 
+0.004839 -0.000242 -0.001774 0.001806 -0.001018 0.000676 
+0.000986 0.002404 -0.003576 -0.000316 0.001721 -0.002640 
+-0.000957 0.000779 -0.000853 -0.000778 -0.001332 0.001474 
+-0.000546 -0.000887 0.003030 0.000752 -0.000556 0.000457 
+0.000478 -0.000748 -0.001746 -0.000104 0.000199 -0.000154 
+-0.000274 0.001338 0.002555 -0.000991 0.001919 0.000935 
+-0.003687 0.002552 -0.001607 -0.002065 0.005395 -0.001046 
+0.004870 0.004704 -0.005778 -0.000571 0.001169 -0.000720 
+-0.001857 -0.001857 0.000714 -0.001737 -0.001154 0.001622 
+0.000590 0.001420 -0.000131 0.002813 0.002027 -0.000696 
+0.002131 -0.000198 0.000928 -0.000189 -0.001968 0.001189 
+-0.000539 -0.001383 0.001600 -0.000139 0.001740 0.002216 
+0.002554 0.000432 -0.000016 0.004595 0.001502 -0.001151 
+0.005135 0.008388 -0.003355 0.007825 0.000301 -0.011133 
+0.003111 -0.003686 -0.005682 0.003787 0.001004 -0.000661 
+0.001667 0.000002 0.003903 0.000841 -0.000445 0.002264 
+-0.004645 -0.002972 -0.001210 -0.001600 -0.003665 -0.003935 
+-0.000516 0.001648 -0.003024 0.001957 0.003704 -0.001965 
+0.002162 0.003020 0.001299 0.001760 -0.001898 0.001416 
+0.004971 0.000680 0.000212 0.000339 0.000968 -0.000214 
+-0.000621 -0.000475 -0.001898 -0.000928 0.000972 -0.002894 
+-0.000577 0.000938 -0.003314 -0.000295 0.000233 -0.001376 
+0.000139 -0.001387 0.001940 -0.000581 -0.001548 0.004755 
+-0.000687 -0.000746 0.004416 -0.000864 0.000641 0.000948 
+0.000166 0.000462 -0.002213 0.003326 0.001543 -0.002023 
+0.000623 0.000103 0.000790 -0.001255 -0.003817 0.000475 
+-0.003199 -0.002937 -0.001940 -0.004027 -0.000680 0.000313 
+-0.002039 -0.000444 0.000440 -0.000252 0.000060 0.001110 
+0.002173 0.002249 0.001793 0.002263 0.003252 0.003489 
+0.002936 0.002429 0.002474 -0.000827 0.000347 -0.000231 
+-0.004400 -0.000418 -0.002256 -0.003414 0.000652 -0.001231 
+0.002399 0.001825 0.002370 0.000408 0.004455 0.001564 
+0.001510 -0.001847 0.003045 0.001889 -0.001144 0.001281 
+-0.002270 -0.000294 0.000961 -0.000255 0.002795 0.001762 
+-0.000535 0.004776 0.000103 -0.002331 0.002370 0.000622 
+-0.000035 0.000300 -0.001087 0.000286 -0.001241 -0.000203 
+0.003576 0.001584 -0.004968 0.001562 0.003590 -0.002344 
+-0.001060 0.000675 0.003470 -0.002946 0.002085 0.001839 
+-0.002068 -0.000691 -0.000002 -0.000420 -0.000981 -0.002109 
+0.001505 -0.002280 -0.002790 -0.000859 -0.000959 -0.003710 
+-0.002348 0.000227 -0.002424 0.000261 0.000342 -0.000292 
+0.002474 -0.000475 -0.000463 0.001519 -0.000712 -0.001558 
+-0.000229 -0.000321 -0.003618 0.000852 -0.000775 -0.004746 
+0.004029 -0.000686 -0.001821 0.002315 -0.001559 0.002327 
+0.000104 -0.001205 0.000714 -0.001418 0.001418 -0.001547 
+0.000007 0.003005 -0.001490 0.000830 0.000367 -0.001123 
+0.003178 -0.001896 0.001264 0.002986 -0.003203 0.000427 
+0.001135 0.000738 0.001758 0.001694 0.000673 0.002724 
+0.001234 -0.000958 0.002001 -0.000494 -0.003382 0.003459 
+-0.002379 -0.004376 0.002846 -0.000583 -0.000168 0.002720 
+-0.002981 -0.000636 0.001753 -0.001356 0.004122 -0.001277 
+-0.003522 0.006559 -0.003167 0.002203 -0.000418 -0.003237 
+0.006830 0.007951 -0.003263 0.002332 0.001653 0.002951 
+0.000946 -0.000654 -0.000155 -0.003262 -0.003057 0.001246 
+-0.002017 -0.000641 0.001431 -0.000571 0.003875 -0.001062 
+0.000985 0.004786 -0.003099 0.000186 0.003378 -0.000966 
+-0.000169 -0.000508 0.000846 0.001411 -0.003370 -0.000346 
+0.003072 -0.003230 0.001453 -0.000154 -0.000524 0.001264 
+0.001456 0.000688 0.002122 0.002297 0.001266 0.002719 
+-0.000196 0.000407 0.000439 -0.004129 -0.002470 0.002259 
+-0.005644 -0.001818 0.001629 -0.003390 -0.000930 0.000823 
+-0.000662 -0.000106 0.000339 0.000909 -0.000411 0.000468 
+0.002342 0.002818 0.002532 0.005313 0.007486 0.001664 
+0.007076 0.006065 -0.002231 0.003431 0.004313 -0.000711 
+0.000291 0.000655 0.000699 0.000294 -0.001804 0.000038 
+-0.001915 -0.002123 -0.000985 -0.000227 -0.001149 0.000815 
+0.000374 0.000688 0.002545 0.002487 0.001669 0.002134 
+0.002765 0.002623 0.001164 -0.001816 0.001796 -0.001473 
+-0.002250 0.002013 -0.001620 0.003540 0.000075 -0.001393 
+0.011789 -0.001148 0.004550 0.009450 -0.012239 0.002053 
+-0.000704 -0.019743 0.005276 -0.006526 -0.012880 0.009611 
+-0.002780 -0.000721 0.003687 -0.002326 0.002264 0.001054 
+0.001091 0.005954 -0.002779 -0.000281 0.001393 -0.000574 
+-0.000799 0.000120 0.000874 -0.002109 0.000523 0.000941 
+-0.001601 0.002689 0.000745 0.003101 0.003636 0.000350 
+0.006458 0.003012 -0.000664 0.003129 0.003674 0.000510 
+0.001704 0.001885 -0.003073 0.001738 0.001054 -0.002116 
+0.001881 -0.001047 -0.002676 -0.000605 -0.000669 -0.002223 
+-0.000785 -0.000050 -0.000723 -0.002397 0.001550 -0.000657 
+-0.001651 0.002705 -0.000988 -0.002080 0.000313 -0.001988 
+-0.000379 0.000937 0.000176 0.002331 0.003103 0.001294 
+0.004439 0.001258 0.002848 0.002534 -0.001402 0.003144 
+0.000261 -0.001525 0.001567 -0.000603 0.002037 -0.000040 
+-0.000403 0.000897 -0.001931 0.004410 -0.000282 -0.003282 
+0.006672 0.003388 -0.004585 0.007100 0.003043 -0.005391 
+0.004290 0.004014 0.002053 0.003535 0.005095 -0.000301 
+0.002796 0.000981 -0.001169 0.000925 -0.000752 -0.001360 
+-0.000014 -0.002157 -0.001861 0.000887 -0.002551 0.000319 
+-0.003849 -0.000695 -0.003612 -0.004262 0.001696 -0.001778 
+-0.001937 0.000531 0.002452 -0.000885 0.000274 0.004443 
+0.000466 0.000466 0.003644 0.002568 0.001850 0.001399 
+0.002314 0.000133 0.001517 0.003157 -0.001489 0.002441 
+0.000031 -0.001000 -0.000157 0.000501 0.000472 -0.001534 
+-0.000018 0.001841 0.000979 -0.001523 0.004490 0.002773 
+-0.001784 0.004873 0.000970 -0.000191 0.002042 0.000376 
+-0.001630 -0.001964 0.000199 -0.001539 -0.000705 -0.000112 
+0.000364 0.002016 -0.001521 0.001190 0.004678 -0.004507 
+0.000088 0.000376 -0.003289 0.002469 -0.002254 -0.000178 
+-0.001659 -0.000088 0.002352 -0.001771 -0.003360 0.003214 
+-0.001518 -0.004180 0.002409 0.000000 -0.003206 0.003206 
+0.001981 -0.002184 0.001676 0.004700 0.000130 0.000576 
+0.004680 0.000593 0.000414 0.003183 -0.002062 -0.000745 
+0.001379 0.000700 -0.002684 0.002297 0.000128 -0.002807 
+0.000255 -0.000179 -0.002267 -0.000658 -0.002276 0.004012 
+-0.005822 -0.001852 0.005393 0.002220 -0.001834 0.008457 
+0.002610 0.001107 0.000838 -0.006540 0.008583 -0.006336 
+0.006653 0.013610 0.000645 0.010364 0.008893 0.004987 
+0.021969 -0.001285 0.002114 0.014155 0.003520 0.000783 
+-0.010029 -0.017373 0.007911 -0.002250 -0.000649 -0.002374 
+0.000270 -0.000517 -0.002562 0.001465 0.006731 -0.002947 
+0.000398 0.003568 -0.003310 0.000368 0.000252 0.000086 
+-0.001047 0.002098 0.000735 0.001497 0.004475 0.000472 
+0.002386 0.001445 -0.002184 0.003542 0.000000 -0.000764 
+0.002096 0.003028 -0.001164 0.001075 0.005163 0.000979 
+0.000728 0.002942 0.001885 0.003780 0.003780 -0.004409 
+0.002015 0.000271 -0.001292 0.000527 0.000278 0.000685 
+-0.001230 -0.001885 0.000328 -0.004350 0.000650 0.003049 
+-0.004813 0.000105 -0.001570 -0.000206 0.004048 -0.005125 
+0.002874 0.005173 -0.003415 0.001754 0.001263 0.000295 
+-0.002522 0.000212 -0.000047 -0.002944 0.003448 -0.000631 
+-0.001233 0.002938 -0.000095 0.001167 -0.002730 0.000708 
+0.002468 -0.007112 0.002761 0.002893 -0.003733 0.002422 
+0.003659 0.000878 0.001122 0.008839 0.005538 -0.000159 
+0.007041 0.008302 -0.002470 0.002362 0.000000 -0.002362 
+-0.000801 -0.000520 0.001569 -0.004831 -0.000398 0.002355 
+-0.003888 -0.000820 0.002782 -0.002810 0.002810 -0.003554 
+-0.003167 -0.001422 0.002036 -0.001286 0.001296 -0.000480 
+0.001821 0.001277 -0.002289 0.000561 0.001381 -0.000340 
+0.000713 0.003372 -0.002354 0.004266 0.002311 -0.002043 
+0.005337 0.005245 0.002139 0.006114 0.006999 -0.001480 
+0.000000 0.002936 -0.003761 0.001818 0.000273 -0.001818 
+0.000722 0.000870 -0.002022 0.000198 0.000955 -0.000330 
+-0.000374 -0.001203 0.000442 0.001282 -0.004161 -0.000366 
+0.001844 0.000350 0.000964 -0.002456 0.000876 0.004288 
+-0.003646 0.000608 0.002406 -0.001698 0.000970 0.000846 
+0.000589 -0.001730 -0.001190 0.004624 -0.002228 -0.003045 
+0.003763 -0.002985 0.001097 -0.000007 -0.003884 0.001913 
+-0.002834 -0.003181 0.003189 -0.002549 -0.000566 0.002675 
+-0.000273 -0.000479 0.001702 -0.001846 -0.002520 0.002697 
+-0.002802 -0.000894 0.000060 0.000180 0.000619 -0.000579 
+0.001167 0.002917 -0.003836 -0.001954 0.000244 -0.002230 
+-0.000022 -0.000169 -0.000512 -0.004964 -0.003536 0.002143 
+0.002754 -0.001251 0.001682 0.002238 -0.005277 0.002122 
+-0.002796 -0.001200 -0.001435 -0.003085 0.006851 -0.015636 
+0.001118 0.003339 0.001317 0.022213 -0.007787 0.009646 
+3.183673 -2.418367 3.214286 3.368159 -2.950249 4.323383 
+2.609272 -2.483444 4.132450 0.014105 -0.011386 0.007024 
+0.000811 0.002462 -0.000967 -0.000166 0.002423 0.000274 
+0.002710 0.001288 0.001045 -0.002168 -0.000378 0.000406 
+-0.001739 -0.001571 0.001454 0.000909 -0.000108 0.002192 
+0.002929 0.000156 0.001434 -0.000786 -0.004765 0.003143 
+0.002259 -0.002838 0.003229 0.002112 -0.000626 0.002226 
+0.000634 0.000527 0.000352 -0.002015 -0.002569 -0.001984 
+-0.003307 0.000000 -0.001339 -0.001654 -0.003862 0.000351 
+0.001123 0.001773 0.005275 -0.000428 -0.002711 0.005612 
+0.000203 -0.001385 0.001380 0.000474 0.000474 -0.004380 
+0.002022 0.003189 -0.004200 0.000207 0.001925 0.000273 
+-0.003569 -0.000122 0.001072 0.000565 0.003260 -0.000712 
+-0.000404 0.004545 -0.001614 0.001033 0.000073 -0.002023 
+-0.004095 -0.002607 -0.000456 -0.005565 -0.002163 0.002173 
+0.000857 0.000247 0.000165 0.006103 0.000564 -0.004000 
+0.000551 -0.002040 0.000662 0.002761 -0.001818 0.001548 
+-0.004801 -0.000071 0.000911 0.000041 0.002685 -0.002355 
+0.000112 0.003504 0.001029 0.000770 0.004143 -0.001415 
+0.001186 -0.000621 0.003435 0.000747 -0.000348 -0.000174 
+0.001172 0.000331 -0.000083 0.001794 -0.000354 0.000359 
+0.003058 0.001703 0.000047 0.003366 0.004244 -0.002927 
+0.003873 0.005697 -0.004706 0.004196 0.005804 -0.002589 
+-0.002295 0.000230 -0.002818 -0.004174 0.002385 -0.003186 
+-0.002609 0.003069 -0.005052 0.000125 0.003073 -0.003701 
+-0.000601 -0.000446 0.001031 -0.001594 0.001694 0.002824 
+-0.000707 0.001549 0.003932 -0.002003 0.001968 0.001513 
+0.000417 0.000000 0.001333 0.000879 0.001133 0.002501 
+0.000100 0.001183 0.000346 0.001871 0.000295 -0.000862 
+0.003584 -0.001222 -0.000704 0.000260 -0.001954 0.000293 
+-0.000223 -0.001033 -0.000165 -0.002919 0.000034 0.002946 
+-0.002641 0.003184 0.003794 -0.002402 0.002798 0.004345 
+0.000974 0.001019 0.001418 0.007681 0.005957 -0.002469 
+0.004553 0.006289 -0.001301 -0.003784 -0.000438 0.002134 
+-0.008100 -0.005389 0.003859 0.000782 -0.002057 -0.000494 
+0.000567 -0.001418 -0.001702 0.000761 -0.000658 -0.000416 
+-0.000735 -0.000387 -0.001031 0.002962 0.007494 -0.001179 
+0.007399 -0.000241 -0.000974 0.014448 -0.011100 0.010567 
+0.021888 -0.005574 0.027931 2.669118 -1.845588 3.272059 
+0.023637 0.004388 0.006442 0.010406 -0.007247 0.002563 
+0.000008 -0.003708 0.005095 -0.002197 0.001303 0.004652 
+-0.002731 -0.002969 0.004750 -0.001839 -0.000138 -0.000046 
+-0.001929 0.002921 -0.002189 -0.001701 -0.002606 -0.000203 
+-0.002439 -0.004153 0.004549 0.001231 0.000100 0.003442 
+0.000782 0.000547 0.001100 0.000441 0.000397 0.000797 
+-0.000809 0.000778 -0.000118 -0.002016 0.001242 0.000956 
+-0.006784 -0.004867 0.001770 -0.000585 -0.007158 0.003300 
+0.002672 -0.003030 0.005879 -0.003930 -0.001244 0.005174 
+-0.003867 0.001809 0.000621 -0.002640 0.002409 -0.003926 
+-0.000082 0.003301 -0.002889 0.002005 0.002339 0.001261 
+0.000564 -0.000147 0.003002 0.001709 -0.001952 0.000365 
+0.002716 -0.000990 -0.003046 0.000747 -0.000590 -0.000690 
+-0.004590 0.000866 0.002340 -0.005377 -0.006013 0.001929 
+-0.002249 -0.004824 0.002052 0.003877 0.000066 0.000222 
+0.006512 -0.002359 -0.004012 0.002533 -0.002859 -0.000575 
+-0.001860 -0.001513 0.001329 0.000737 0.002191 0.001140 
+0.000542 0.000154 -0.004170 0.000618 0.005181 -0.006152 
+0.001260 -0.001887 0.002148 0.000704 -0.003573 0.001784 
+0.003145 -0.002366 0.001573 0.003559 -0.001606 0.001033 
+0.002093 -0.001192 0.000745 0.000270 0.000013 0.000116 
+-0.000044 0.002120 -0.000671 0.001744 0.003945 -0.002723 
+0.001120 -0.000109 -0.003101 0.002528 -0.000620 0.001346 
+0.004341 0.000539 0.002350 0.001906 0.003811 -0.001102 
+0.002031 0.000123 -0.000409 -0.000679 0.000294 -0.000237 
+-0.000617 0.000652 -0.000780 -0.000111 0.000722 0.000306 
+0.001511 0.002070 -0.003660 0.003259 0.003258 -0.003802 
+0.002364 -0.001828 -0.002205 0.000516 -0.001032 -0.000645 
+0.003361 0.000751 0.002003 0.001302 0.000384 0.001720 
+0.000357 0.001624 0.001002 0.001282 0.000795 0.000949 
+0.000360 -0.001141 -0.000412 -0.002205 -0.002525 -0.001010 
+-0.001352 -0.001904 -0.000992 0.000688 -0.000236 -0.002037 
+-0.000285 0.000325 0.000300 -0.002041 -0.001615 0.000310 
+0.000877 -0.002073 0.000956 0.001112 -0.001149 0.000546 
+0.003002 -0.001900 -0.003077 0.004635 0.002072 0.001077 
+0.005893 0.007850 -0.003476 0.001574 0.007525 -0.003941 
+-0.001564 0.003075 -0.001472 -0.004356 0.002129 -0.000479 
+-0.004346 -0.000643 -0.001208 0.005391 0.009656 0.000798 
+-0.002879 0.009791 0.002338 0.000268 0.005080 0.005758 
+0.000623 0.001112 0.001863 -0.003357 -0.003163 0.002084 
+-0.000096 -0.000122 0.000117 0.003127 0.000363 -0.000196 
+0.002809 0.000354 -0.001506 0.000092 0.000968 -0.000853 
+-0.003363 -0.000059 -0.002740 -0.002775 0.000316 -0.002729 
+-0.002333 0.001087 -0.003756 -0.001715 0.000115 -0.004459 
+0.000807 -0.000579 -0.000824 -0.002743 -0.001974 -0.000395 
+-0.001267 -0.000894 -0.001143 -0.000956 -0.001730 -0.000939 
+-0.001419 -0.000833 -0.000571 -0.002851 0.000018 0.002575 
+-0.003748 0.001957 0.003249 -0.004400 0.000369 0.000074 
+-0.000438 0.000949 -0.000209 -0.000215 -0.000075 -0.000103 
+-0.002079 -0.001663 0.001557 -0.003288 -0.001315 0.001780 
+-0.001433 0.000108 0.001109 -0.000519 0.000635 -0.000026 
+-0.000582 0.001694 0.000607 -0.001285 0.001930 0.000719 
+-0.002616 0.000279 0.000414 -0.002426 -0.001911 0.001969 
+-0.002205 -0.003694 0.002999 -0.001233 -0.005240 0.002818 
+0.000264 -0.003145 0.004119 -0.000636 0.001078 0.004876 
+-0.003994 0.001557 0.003592 -0.001445 0.002308 -0.001254 
+-0.002204 -0.006789 0.001970 -0.001443 -0.007435 -0.002096 
+-0.000165 -0.003556 -0.001499 -0.001332 -0.001752 -0.000518 
+-0.000437 -0.001308 0.000073 -0.001321 0.000893 -0.000471 
+0.000487 0.003380 -0.001524 0.000603 0.001054 -0.001456 
+0.000011 -0.000822 -0.001103 0.002650 -0.001389 -0.000641 
+0.002774 0.002764 -0.002486 0.002450 0.002650 -0.002357 
+0.000884 0.001558 -0.001111 0.002804 -0.000883 -0.001852 
+0.005028 -0.004417 -0.002532 0.000842 -0.003906 -0.002365 
+-0.001375 0.000547 -0.000687 -0.000126 0.002057 -0.002532 
+0.000002 0.001217 -0.000521 0.001376 -0.000876 0.000239 
+-0.000328 -0.000523 0.002644 -0.002649 0.000309 0.001678 
+-0.000649 -0.000649 -0.000840 -0.000063 -0.000303 -0.000107 
+0.001526 -0.002302 -0.001367 -0.000118 -0.001275 -0.004002 
+-0.002255 -0.000273 -0.004439 -0.001317 -0.000749 0.000033 
+-0.002635 0.000291 0.004389 -0.004667 -0.000654 0.005196 
+0.002689 -0.002474 0.004922 0.000665 -0.001372 0.000369 
+0.002964 0.003479 -0.005305 0.000021 0.000130 0.000129 
+0.003250 0.001137 -0.001187 -0.001521 -0.001666 -0.000648 
+-0.004235 -0.006241 -0.005335 -0.009276 -0.006528 -0.011462 
+-0.003581 0.002738 -0.005004 -0.000381 0.002968 0.002120 
+-0.000507 0.002096 0.002589 0.000293 0.000773 0.001395 
+-0.000337 -0.001347 0.002214 -0.002183 -0.001389 0.000397 
+-0.000332 -0.001661 0.003333 0.001824 0.001905 0.001317 
+0.003490 0.002607 -0.002758 0.001088 0.000715 -0.004123 
+0.000402 -0.001846 -0.003022 -0.000476 -0.000626 -0.001330 
+-0.001719 0.000511 0.001330 0.000379 -0.002540 0.000568 
+-0.001771 -0.001207 0.000885 0.000217 0.000086 0.000461 
+-0.000672 0.000168 0.000588 -0.001501 -0.000041 0.001096 
+-0.001078 0.000094 -0.002768 0.000986 0.000243 -0.003259 
+0.000555 0.000087 -0.000989 0.000990 -0.000573 -0.001068 
+0.000623 -0.002267 -0.000987 0.001320 -0.003960 -0.001840 
+-0.005059 -0.005721 -0.003357 -0.001145 -0.001214 -0.003858 
+0.000793 -0.001743 -0.003893 0.001403 -0.001120 -0.001175 
+-0.000525 0.001316 0.000644 -0.000942 0.000404 -0.000841 
+0.000098 -0.000070 -0.000224 0.000976 -0.002460 -0.002929 
+0.000862 -0.005242 -0.001282 0.002203 -0.006619 0.004101 
+0.000864 -0.002277 0.005908 0.000132 0.001095 0.002492 
+-0.001674 0.003076 -0.000009 -0.000566 0.001342 0.001230 
+-0.001173 -0.003675 -0.002166 0.000511 -0.005196 -0.002850 
+0.001712 -0.003679 -0.002481 -0.003522 -0.002494 -0.001045 
+-0.001540 -0.001561 -0.000012 -0.000570 0.000336 -0.000097 
+0.000231 -0.000627 0.003136 0.001136 0.001822 0.001856 
+0.001381 0.000908 -0.000745 0.001263 0.001844 -0.001305 
+-0.002112 0.003879 -0.002112 -0.000564 0.000211 0.001928 
+0.000552 0.002973 -0.000680 0.000754 -0.000528 -0.003462 
+0.007465 0.001854 -0.005485 0.004884 0.003698 -0.005336 
+0.002564 0.001145 -0.002710 0.000334 -0.000024 0.001181 
+-0.000087 -0.001547 0.003374 -0.000072 -0.001377 0.002899 
+-0.001489 -0.000567 0.001135 -0.001151 0.000884 -0.000957 
+-0.001150 0.000031 -0.000951 0.000604 0.000170 0.000646 
+-0.000284 0.000164 -0.001438 0.002899 0.001159 -0.008116 
+0.006165 0.001534 -0.004631 -0.000043 0.003442 -0.002188 
+-0.000545 0.001059 0.003345 -0.000402 -0.001608 0.005468 
+0.003031 -0.000645 0.002579 0.000671 0.000413 0.001002 
+-0.001445 0.002123 -0.003249 0.002170 -0.000855 0.004271 
+0.003576 -0.003705 0.015845 -0.002137 -0.016829 0.022351 
+-0.000214 -0.020077 0.020619 0.002604 -0.008172 0.010869 
+-0.000359 0.000410 -0.000647 -0.000983 0.002182 0.000463 
+-0.001775 -0.004621 0.003012 -0.000853 -0.003570 0.004735 
+0.000804 -0.002106 -0.000571 0.002189 0.001171 0.002206 
+0.000134 0.001413 0.004660 0.001105 -0.002943 0.003301 
+0.002227 -0.000450 -0.001995 0.002039 -0.000077 -0.002930 
+0.000555 -0.001240 0.000638 0.001713 -0.000211 0.001537 
+0.000666 0.000505 0.002870 0.001525 0.000779 -0.000516 
+0.002511 -0.000373 -0.001915 0.000714 -0.000365 0.000192 
+0.000498 -0.001432 0.000082 0.000197 -0.001525 0.000970 
+-0.001772 0.001012 0.000127 -0.001217 0.000267 -0.002652 
+0.001805 0.001453 0.001195 0.004821 0.003036 0.003918 
+0.006992 0.003496 0.000569 0.003881 0.002571 -0.005239 
+0.000843 -0.003372 -0.004803 0.001814 -0.004142 -0.002070 
+0.000322 -0.002709 -0.001912 -0.000399 -0.001362 -0.000787 
+-0.001701 -0.000383 0.000666 -0.003479 -0.000146 0.002317 
+-0.002058 -0.002332 0.000378 0.002982 -0.000261 -0.003192 
+0.003075 -0.000892 -0.005386 -0.000661 -0.002097 0.000145 
+-0.002602 0.002160 0.003437 -0.003937 0.003119 0.000580 
+-0.003003 0.002163 -0.003127 0.000065 0.001425 0.000677 
+-0.000960 -0.002216 -0.002522 0.001119 -0.004177 -0.001535 
+0.003502 -0.005377 -0.000036 0.001962 -0.003345 -0.001299 
+-0.000417 -0.000622 0.001387 -0.003818 -0.000406 0.004077 
+-0.003919 -0.002221 0.001829 0.000825 -0.000401 0.000531 
+0.000599 0.001315 0.000482 0.000065 -0.002179 0.001830 
+0.000715 -0.007044 0.002506 -0.002411 -0.006257 0.000722 
+-0.000012 -0.002110 -0.000487 -0.000944 0.000769 -0.003538 
+0.000404 -0.001471 -0.002537 0.000446 0.001053 -0.000705 
+0.003095 0.000690 0.001029 0.001901 -0.001414 0.000035 
+-0.001053 0.000241 0.002451 0.000852 -0.000458 0.002488 
+0.001375 -0.000485 -0.001174 0.001108 -0.002181 -0.002891 
+0.000259 0.000120 0.000102 0.000697 -0.000538 0.001483 
+-0.000351 0.001124 0.004161 0.003568 0.000929 0.000383 
+0.004132 -0.002783 -0.003203 0.001213 -0.001192 -0.005147 
+0.000211 0.000548 -0.004936 0.003628 -0.003101 -0.004291 
+0.001742 -0.004172 -0.004957 0.005261 0.000166 -0.000574 
+-0.001164 0.000192 0.005703 -0.001456 -0.008364 0.019643 
+-0.409756 -1.687805 2.614634 -0.372727 -1.977273 2.750000 
+0.001025 -0.020855 0.018721 0.003018 -0.008706 0.014173 
+0.002930 -0.001179 0.007224 -0.000763 0.000454 0.004620 
+-0.005616 -0.000954 0.003828 -0.003804 -0.002014 -0.000412 
+-0.001374 0.001727 -0.001182 -0.000450 0.001048 -0.000011 
+0.000276 -0.001434 0.000166 -0.000830 -0.005290 0.003112 
+-0.002508 -0.006385 0.001831 -0.004271 -0.003322 0.000316 
+-0.003794 -0.002076 -0.001158 -0.001946 -0.000448 -0.001750 
+-0.000668 -0.000171 -0.001027 0.003781 -0.001040 -0.001689 
+0.004785 0.001042 -0.000604 0.002421 0.001600 0.000911 
+-0.001052 0.001691 -0.000276 0.000521 0.001566 -0.000043 
+-0.002342 0.002393 -0.000449 -0.004748 0.002184 -0.003724 
+-0.004479 -0.000740 -0.001911 -0.001058 -0.000499 0.001301 
+-0.000048 0.000073 0.000109 0.002479 -0.000661 -0.002479 
+0.000952 0.000411 -0.002988 -0.002124 -0.002053 -0.000803 
+-0.004328 -0.005587 0.001801 -0.001824 -0.007554 0.000520 
+0.000007 -0.001563 0.004686 0.002861 0.001431 0.001971 
+0.002213 0.002623 -0.002950 0.002421 0.000482 -0.006847 
+0.002575 0.000876 -0.003872 -0.000726 0.001214 -0.000800 
+-0.002132 0.002704 0.002003 -0.003325 0.000241 0.000086 
+-0.001262 -0.002694 -0.001029 -0.000049 -0.004561 -0.000072 
+-0.002106 -0.004065 -0.000301 -0.002177 -0.000435 0.002397 
+0.001235 -0.000432 -0.000491 0.001341 -0.000781 0.000161 
+0.000457 -0.001059 0.002913 -0.002569 -0.002560 0.001797 
+-0.000021 0.001915 0.000693 -0.000382 0.002136 0.001559 
+-0.000024 -0.000255 -0.000420 0.002448 -0.002909 -0.000887 
+0.002831 -0.004247 -0.002301 -0.005038 -0.008195 0.003762 
+0.002132 -0.006975 0.002747 0.000421 -0.002490 0.001565 
+-0.000089 0.000231 -0.000287 -0.000623 -0.000066 0.000217 
+0.000533 -0.001684 0.000917 -0.000057 -0.001558 0.000710 
+-0.001379 0.000470 -0.000493 -0.001815 0.000305 -0.001513 
+0.000617 -0.000414 -0.000406 0.001680 -0.001900 -0.000399 
+0.000109 0.000003 -0.000089 -0.002727 0.000785 -0.000792 
+-0.002164 -0.000951 -0.000859 0.001652 0.000059 -0.001371 
+0.005334 -0.000117 -0.002200 0.004707 0.001136 -0.003733 
+0.003658 0.000229 -0.002104 0.004867 -0.000980 -0.000963 
+0.007142 0.000790 -0.002973 -0.000569 0.000475 -0.000828 
+-0.000548 0.000304 0.009719 -0.003245 -0.010417 0.027081 
+-0.530612 -1.852041 3.443877 -0.674312 -2.155963 3.055046 
+-0.809302 -1.846512 2.065116 -0.009575 -0.010667 0.007929 
+-0.003856 0.001947 0.002013 0.002617 0.012055 -0.006756 
+0.004554 0.012264 -0.001353 -0.001122 0.004091 -0.003434 
+-0.002371 0.000632 -0.005149 -0.001238 0.001523 -0.001216 
+0.000790 -0.000112 -0.000625 0.000153 -0.000869 0.000239 
+-0.000789 -0.000917 0.001297 -0.000393 -0.000676 0.000467 
+-0.000389 -0.000892 -0.000467 -0.000448 -0.001556 -0.001457 
+-0.000196 -0.000985 -0.000378 0.000024 -0.001307 0.000400 
+-0.001270 -0.002294 0.001709 -0.000963 -0.002004 0.001293 
+-0.003697 -0.000143 0.000067 -0.004414 -0.000556 -0.005461 
+-0.000925 0.002091 -0.002845 -0.004290 0.001997 -0.000261 
+-0.003986 -0.004253 -0.002653 -0.000482 -0.004536 -0.001320 
+-0.001062 -0.001955 0.001967 0.001466 -0.001175 0.000245 
+0.003821 0.000429 -0.000245 0.000465 -0.001860 -0.005081 
+-0.001600 -0.002654 -0.005072 0.000358 -0.003258 -0.000955 
+-0.000989 -0.004164 0.002180 -0.000146 -0.006958 0.002087 
+0.000763 -0.007246 0.003862 -0.000901 -0.004188 0.001243 
+0.000116 0.000873 -0.002852 0.001630 -0.000924 -0.002967 
+0.000361 -0.004279 0.001281 0.001288 -0.005792 0.004044 
+-0.001906 -0.001945 0.002195 -0.001840 -0.002605 0.001991 
+0.001373 0.000073 0.001099 0.001845 -0.001210 -0.001395 
+0.001125 -0.001606 -0.002712 0.001295 -0.001353 -0.002976 
+0.000021 -0.004058 0.000085 0.002335 -0.001906 0.000333 
+-0.000086 0.000128 0.000362 -0.001181 0.001575 0.000787 
+0.000592 0.002058 0.002383 0.004292 0.001813 0.003556 
+0.005724 0.000345 -0.003656 -0.001304 -0.002522 0.001217 
+-0.000610 -0.006677 0.004954 -0.000135 -0.005759 0.008111 
+-0.001925 -0.002894 0.005097 -0.003174 -0.000896 0.002025 
+-0.005936 -0.005731 -0.001431 -0.003291 -0.004259 0.003678 
+-0.005044 -0.001625 0.002010 -0.003217 -0.001168 -0.000413 
+-0.001530 -0.000306 0.000379 -0.001506 -0.002433 0.003029 
+-0.003616 -0.004783 0.001669 -0.002845 -0.005579 -0.001053 
+-0.001828 -0.000946 -0.000530 0.001997 0.002749 -0.002000 
+0.001644 0.001985 -0.000426 -0.003367 -0.001769 0.002008 
+-0.004858 -0.005315 0.002004 -0.001092 -0.002177 0.000227 
+0.003069 0.004472 0.001395 0.001657 0.006503 -0.002082 
+-0.001345 0.007314 0.002534 -0.005512 0.006051 0.019714 
+-0.005360 -0.011974 0.028243 -1.079096 -1.977401 2.474576 
+-0.014786 -0.023078 0.013205 -0.012443 -0.014436 0.007162 
+-0.000809 0.005172 0.000292 0.007978 0.005813 0.008875 
+-0.002356 0.009425 -0.004242 0.000079 0.001900 0.000057 
+-0.001716 0.001373 -0.003137 0.001547 0.002444 -0.004708 
+0.000049 0.004390 -0.003008 0.000149 -0.000367 0.000217 
+-0.000276 -0.000326 0.001631 0.000213 -0.003361 -0.000155 
+0.000346 -0.003311 -0.001185 -0.000465 -0.003845 0.000043 
+0.002527 -0.002388 0.001941 0.003095 -0.001271 -0.000732 
+0.003571 0.002941 -0.003235 0.002559 0.004281 -0.001207 
+-0.003164 -0.000410 -0.000931 -0.004067 -0.004955 -0.003712 
+-0.004393 -0.006792 0.002364 -0.004033 0.000116 0.002695 
+0.003358 -0.002250 0.003027 0.000169 -0.000088 -0.001608 
+0.002564 0.001499 -0.002690 0.001288 0.002460 -0.000751 
+-0.000486 0.000668 -0.000425 0.000732 -0.000945 0.001477 
+0.001051 -0.003998 0.001153 -0.002210 -0.003349 0.000692 
+-0.003395 -0.003088 0.000925 -0.001427 -0.003300 -0.001160 
+0.001651 -0.003881 0.004908 -0.002146 -0.005408 0.005371 
+-0.003505 -0.002871 0.000953 -0.000845 -0.001108 0.002429 
+-0.003739 -0.002575 0.002451 -0.003441 -0.003170 0.001594 
+0.000874 -0.001508 0.002434 -0.002681 -0.002166 -0.000392 
+0.001184 0.000314 0.000749 0.000000 0.000000 0.000504 
+0.000839 -0.000947 0.000731 0.000811 -0.005521 0.001030 
+0.002246 -0.005441 0.000432 0.002782 -0.000293 -0.001126 
+-0.000845 0.000986 -0.004567 0.000259 0.002721 -0.000078 
+0.005153 0.001662 0.000883 0.004145 0.003640 0.001098 
+0.002992 0.001119 -0.007606 0.000182 0.003892 -0.000649 
+0.000509 0.003845 -0.000520 0.002133 0.002905 0.003427 
+0.000997 -0.000403 0.000363 0.000369 -0.004342 -0.002268 
+0.000902 -0.003834 -0.005097 0.001628 -0.003198 -0.001976 
+0.001108 -0.003581 -0.000296 -0.001368 -0.001763 -0.001945 
+-0.001044 0.000000 -0.003132 0.000589 -0.001660 -0.002168 
+0.000663 -0.000043 -0.001398 -0.000401 -0.000140 0.000381 
+0.001457 0.000563 0.000757 0.000368 0.006642 -0.000046 
+-0.000053 0.005128 0.000772 0.000047 0.001232 0.000208 
+0.001604 0.000055 -0.000122 0.002744 0.001686 0.000087 
+0.001881 0.003559 -0.001482 0.001649 0.002636 0.001840 
+0.003343 0.007032 0.004559 0.001643 0.008292 0.013544 
+-0.006652 0.000040 0.014149 -0.012534 -0.008754 0.007670 
+-0.012082 -0.012972 0.002839 -0.007761 -0.011789 -0.001038 
+-0.005504 -0.004753 -0.001841 -0.004641 -0.002510 0.003229 
+-0.002077 0.000564 -0.001370 -0.001156 -0.000797 -0.002727 
+0.000760 0.000098 -0.004707 0.000287 0.003449 -0.004809 
+-0.001197 0.000860 -0.001909 -0.000177 -0.002301 -0.001113 
+0.002119 -0.003622 0.001333 0.002457 -0.005697 -0.002348 
+-0.000595 -0.008720 -0.001904 -0.001478 -0.002423 0.002886 
+0.003950 -0.001988 0.001590 0.005720 0.001584 0.000116 
+0.005730 0.003141 0.000974 0.004791 0.001086 0.000157 
+0.001574 -0.000397 0.000657 0.001789 -0.006083 -0.001980 
+0.000465 -0.006981 -0.002629 -0.001445 -0.004795 -0.001324 
+0.000926 -0.001852 0.002963 0.002092 0.002511 0.000454 
+0.002711 0.003099 -0.000934 -0.000376 0.001697 0.000514 
+-0.005002 -0.000236 0.004524 -0.006886 -0.007460 0.004591 
+0.002582 -0.004112 -0.000160 -0.004561 -0.002400 0.000134 
+-0.005100 -0.002017 0.000958 -0.004355 0.000209 -0.000285 
+0.000703 -0.001050 -0.000714 0.000508 -0.002015 -0.003738 
+0.000831 0.000220 -0.004665 -0.003793 0.003793 -0.002672 
+0.000078 0.000235 -0.000704 -0.000671 -0.001196 0.000935 
+-0.002127 -0.001452 -0.000134 -0.000979 0.000692 -0.004996 
+0.001590 0.000127 -0.000168 0.001927 0.000128 0.001161 
+0.000897 0.003847 0.000492 0.001509 0.001402 0.000496 
+0.002217 0.000213 -0.000778 0.003030 0.000993 -0.000818 
+0.003651 0.000411 0.000103 0.006897 0.001359 -0.001245 
+0.005530 -0.000820 0.002624 0.001550 -0.001879 0.001839 
+-0.000381 0.000188 -0.000404 -0.000419 0.001511 -0.002183 
+-0.001094 0.002161 -0.000166 -0.000702 0.001233 -0.000525 
+-0.001882 -0.000753 -0.001364 0.000272 -0.001970 -0.001417 
+0.001772 -0.002057 0.000302 -0.000296 -0.001735 0.000804 
+-0.003358 0.000206 0.000500 -0.000555 0.001095 -0.001766 
+0.002670 0.001382 -0.004338 0.002963 0.002434 -0.007116 
+0.001845 -0.000693 -0.004407 0.004895 0.002931 -0.003234 
+0.002227 0.006800 0.000317 0.000994 0.002236 0.000537 
+-0.000577 -0.002079 -0.000447 -0.000636 -0.004073 -0.000578 
+-0.001196 -0.004141 0.000446 -0.002077 -0.003038 0.004981 
+-0.003727 0.000238 0.002617 -0.003545 0.003136 -0.000545 
+0.000717 0.008597 -0.004311 -0.002076 0.010822 0.001871 
+0.000186 0.003608 0.005807 -0.005671 -0.007036 0.001300 
+-0.008406 -0.016534 -0.001485 -0.009274 -0.015544 -0.001495 
+-0.008826 -0.012973 0.001551 -0.003747 -0.005299 0.002839 
+-0.001208 0.003896 0.001397 0.003481 0.004729 0.002118 
+-0.000707 -0.001566 0.000167 0.000460 -0.002922 -0.002019 
+-0.001689 -0.001236 -0.005892 -0.001055 -0.000800 0.001273 
+0.001417 -0.002125 0.002158 0.001759 -0.003281 0.000355 
+-0.001850 -0.005906 -0.001850 -0.000377 0.000119 -0.000352 
+0.001424 0.002072 -0.000417 0.000103 0.000841 -0.000216 
+-0.003716 -0.001923 0.000082 -0.004521 -0.004569 0.002110 
+0.001698 -0.004246 0.000413 -0.000633 -0.004454 -0.001753 
+0.000148 -0.002230 -0.001096 -0.000280 -0.001423 0.000266 
+-0.002257 -0.001600 -0.000715 0.002056 0.000328 -0.002175 
+0.003919 0.002934 -0.005877 0.003352 0.003460 -0.004406 
+0.000143 0.000801 -0.000232 -0.003620 -0.002405 0.001196 
+-0.003058 -0.003769 0.000201 -0.002268 -0.002362 -0.001134 
+-0.002319 -0.002071 -0.001612 -0.003425 -0.002592 -0.001605 
+0.000781 -0.003055 0.000643 -0.003910 -0.000393 0.001833 
+-0.003030 -0.002401 -0.000140 -0.000203 0.000306 -0.001829 
+-0.000828 0.000407 0.001307 -0.000926 0.002241 0.001048 
+-0.003512 -0.000971 0.000935 -0.003237 0.000936 -0.004415 
+-0.003205 0.000204 0.000231 -0.000430 -0.000184 -0.000691 
+-0.000881 0.000905 0.002155 0.001553 -0.000038 0.000626 
+0.004321 0.002401 -0.001353 0.002386 -0.000958 -0.002389 
+0.000905 -0.004166 -0.001766 0.002598 -0.003334 0.001046 
+0.002222 -0.001458 0.001529 0.000838 0.000946 0.000649 
+-0.001764 0.000063 -0.000312 -0.002694 -0.000963 0.000667 
+-0.001435 -0.002153 -0.000336 -0.002580 -0.000266 -0.001205 
+-0.001338 0.001109 -0.001379 -0.000284 0.001734 -0.001731 
+-0.001575 0.000510 -0.002395 -0.004459 0.000722 -0.001742 
+-0.004198 0.001709 -0.001139 -0.001832 0.002519 -0.000072 
+-0.001173 0.004262 0.000450 -0.001810 0.006517 -0.000359 
+-0.003743 0.006082 0.002339 0.003543 0.006732 0.002735 
+0.005669 0.000504 0.002583 0.002520 -0.003544 0.000356 
+-0.002213 -0.005111 0.000270 -0.001401 -0.003215 0.002128 
+0.000004 0.000924 0.000809 0.000611 -0.000264 0.001508 
+-0.003609 0.001553 0.002772 -0.001997 0.001066 -0.001768 
+0.002919 0.009619 -0.005657 0.004717 0.018232 -0.006191 
+0.006668 0.018438 -0.002189 0.001927 -0.008198 -0.002079 
+-0.014903 -0.022455 0.002557 -0.014711 -0.022839 0.000689 
+-0.011731 -0.014585 -0.000693 -0.004624 -0.004700 0.000113 
+0.002260 0.004928 0.001895 0.005555 0.002615 0.003433 
+0.001820 0.005165 -0.000398 0.002334 0.001402 -0.002839 
+0.000778 -0.001044 -0.004897 -0.001462 0.001371 -0.002104 
+-0.003983 -0.002127 0.004188 -0.007518 -0.005132 0.005901 
+-0.007794 -0.004749 0.001343 -0.001319 -0.002487 0.000644 
+0.000250 0.001546 -0.000564 -0.001805 0.003610 -0.003510 
+-0.002963 0.003472 -0.004589 0.000678 0.003978 -0.003094 
+0.002677 0.001583 -0.005518 0.003377 0.001965 -0.003070 
+0.000328 0.000548 -0.001645 -0.001544 -0.000883 -0.001530 
+0.000909 -0.000837 -0.003905 0.003169 -0.002669 -0.006173 
+0.004614 0.001086 -0.007359 0.004822 0.002659 -0.004074 
+0.001960 -0.000447 -0.001692 -0.002388 -0.002595 -0.001505 
+0.000654 -0.002616 -0.002910 -0.004876 0.000020 -0.005416 
+0.000298 0.003921 -0.000539 0.002661 -0.000720 -0.003082 
+0.002806 -0.003397 0.002362 -0.005906 -0.007210 0.000217 
+0.000925 -0.004625 0.002773 -0.010192 -0.007231 0.004269 
+-0.003796 -0.002290 0.007630 0.000214 -0.002724 0.005734 
+-0.001600 -0.000744 -0.000544 -0.001674 0.002736 -0.006247 
+-0.003767 0.000779 0.000503 -0.002206 0.001552 0.000768 
+0.000979 -0.001305 0.005887 -0.000855 -0.002566 0.006000 
+-0.001694 -0.001919 0.004592 -0.003667 -0.005222 0.003153 
+-0.004127 -0.005093 0.001785 -0.000457 -0.000974 0.000441 
+0.004101 -0.002050 -0.000756 0.004268 -0.002378 -0.002804 
+-0.000958 -0.005183 -0.003274 -0.002155 -0.003140 0.000143 
+0.002179 0.001953 -0.001069 -0.000189 0.000877 0.000103 
+0.005764 0.007608 -0.002478 0.001835 0.005502 -0.003992 
+-0.001380 0.001711 -0.003002 -0.000118 0.000162 -0.000180 
+0.002636 -0.002816 0.000106 0.000957 -0.003166 -0.001742 
+-0.000584 -0.000534 -0.001899 -0.002158 0.005492 -0.002518 
+0.001835 0.009353 0.003735 0.005329 0.009098 0.002269 
+0.002426 0.002857 0.000013 -0.001721 -0.000374 0.000259 
+-0.001507 -0.000214 -0.000992 0.001301 -0.000304 0.000153 
+0.001944 -0.000142 -0.000220 0.000018 0.000329 0.002142 
+0.001661 0.001208 0.001409 -0.000180 0.002737 0.001144 
+0.001751 0.005391 0.001291 0.003871 0.009549 0.001842 
+0.005136 0.011648 0.004295 0.006810 0.005509 0.003055 
+-0.008258 -0.008167 0.002663 -0.008916 -0.021714 0.004601 
+-0.011777 -0.020425 -0.003648 -0.016595 -0.014618 -0.000618 
+-0.009686 -0.007910 0.000830 0.001783 0.002198 0.000639 
+0.007414 0.000820 0.001504 0.008869 0.005798 -0.002362 
+0.003013 0.000633 -0.002407 -0.002394 -0.001258 0.000224 
+-0.004925 -0.001343 -0.000224 -0.004794 -0.000301 0.001199 
+-0.002614 -0.002347 0.000785 -0.001304 -0.001776 0.000770 
+0.001034 -0.001563 -0.002390 -0.000170 0.002120 0.000557 
+0.003293 0.006820 -0.007754 0.008592 0.000891 -0.003764 
+0.003415 -0.001545 0.000163 0.001979 0.002178 -0.007225 
+0.000120 0.005509 -0.007246 0.001414 0.001904 -0.011098 
+0.002712 -0.001431 -0.007719 -0.001065 0.002286 -0.006257 
+0.003703 0.002846 -0.003174 0.003812 -0.001240 -0.001560 
+0.002462 -0.002633 -0.000378 -0.000534 -0.001882 -0.001223 
+-0.002979 0.000975 -0.005010 -0.000397 0.005556 -0.002381 
+0.000586 -0.000574 0.000106 -0.000471 -0.006128 0.005858 
+-0.003168 -0.001417 0.007420 -0.003236 0.000552 0.004294 
+-0.003281 0.003281 -0.001875 -0.000742 0.002187 -0.001387 
+0.000993 -0.002184 0.002374 -0.000614 -0.000580 0.002592 
+0.000392 0.000556 0.001167 0.000495 0.005548 -0.000793 
+0.002702 -0.000541 0.001946 -0.000738 0.000824 0.002253 
+-0.001861 -0.003708 0.003333 0.001104 0.000163 0.000827 
+-0.001353 0.002623 0.002755 -0.002174 0.000788 0.000493 
+0.000948 -0.001528 0.002830 0.001175 -0.000036 0.003441 
+0.000802 -0.001170 0.003358 -0.000826 -0.000196 -0.000905 
+0.001256 -0.000818 -0.002154 0.004368 0.000851 -0.005035 
+0.004855 -0.000182 -0.001221 0.000703 0.000354 0.000100 
+-0.002148 0.001391 -0.001725 -0.003519 0.001574 -0.000956 
+0.000158 0.000817 0.000824 0.002446 -0.003424 0.001604 
+0.000423 -0.006382 0.002304 0.002214 -0.003171 0.000449 
+-0.000707 -0.003181 -0.002209 0.000075 -0.000295 -0.001486 
+0.000083 0.002450 0.000676 -0.003082 0.002995 0.000350 
+-0.005567 0.002175 0.002573 -0.005944 -0.000712 0.000489 
+-0.002454 -0.002222 0.000783 -0.000344 -0.001199 0.000222 
+-0.001264 -0.000257 0.000164 -0.001474 0.001178 -0.000249 
+-0.000343 0.000461 0.000471 0.003660 -0.000128 0.000190 
+0.005094 -0.000827 0.000747 0.003620 -0.000982 0.003139 
+0.003725 0.004750 0.004819 0.006684 0.015622 0.004543 
+-0.000512 0.012865 0.004340 -0.009664 -0.010663 0.008332 
+-0.015867 -0.024616 0.006719 -0.020342 -0.023532 -0.000532 
+-0.017956 -0.013566 0.000261 -0.003815 -0.000993 0.000717 
+0.011701 0.008845 -0.001632 0.010096 0.012766 -0.003754 
+0.003601 0.001952 -0.001634 0.000769 -0.000478 0.000866 
+-0.002087 0.000577 -0.000781 0.000320 0.005940 -0.002501 
+0.002247 0.008577 -0.005015 0.003910 0.006991 -0.005019 
+0.006818 0.004647 -0.004957 0.008244 0.005751 -0.002252 
+0.006297 0.005590 0.000454 0.002221 0.004476 0.001118 
+0.000680 0.000743 0.000382 0.000556 0.003016 0.000000 
+0.000277 0.004563 -0.002212 0.001342 0.000071 -0.000327 
+0.002696 -0.000495 -0.003056 0.003283 0.002345 -0.009748 
+0.005734 0.002284 -0.006317 0.003434 0.000044 -0.006803 
+0.003778 -0.000572 -0.002373 0.004477 0.003841 0.000853 
+0.009243 0.006881 0.000337 0.001445 -0.002109 -0.000137 
+-0.001099 -0.001384 -0.001517 -0.006897 0.000942 -0.002005 
+-0.005889 0.001094 -0.001112 0.000755 -0.002315 0.000201 
+0.006117 -0.003269 -0.003971 0.006148 -0.002444 -0.002741 
+0.003407 0.000180 -0.000016 0.002034 -0.002719 0.003304 
+0.003351 -0.004361 0.001564 0.000017 -0.005196 0.000952 
+0.000463 -0.004428 0.006307 -0.001465 0.001337 0.000588 
+-0.009362 -0.005260 0.003775 -0.000242 -0.010018 0.006624 
+0.000803 -0.006491 -0.001356 -0.002800 -0.000644 0.000547 
+-0.003248 0.001265 0.007042 0.000445 0.000726 0.008526 
+-0.001978 -0.007071 0.003028 -0.005125 -0.002885 -0.001512 
+-0.000829 0.006230 -0.006156 0.009086 0.000334 -0.007742 
+0.004726 -0.001770 -0.010086 0.000058 -0.003609 -0.002242 
+-0.002610 -0.002323 0.001765 0.000815 -0.002119 0.002890 
+0.001228 -0.001454 -0.002682 0.003824 -0.003753 0.002165 
+-0.002726 -0.001814 0.002813 -0.007160 -0.000212 0.002844 
+-0.006648 0.000819 0.001937 -0.004958 -0.002811 -0.000518 
+-0.006313 -0.005559 -0.002204 -0.008175 -0.004121 0.009890 
+-0.004560 -0.006665 0.004509 0.001336 -0.001178 0.000437 
+0.004577 0.003111 -0.001847 0.002855 0.003266 0.000568 
+-0.000587 0.001667 0.000682 0.001004 0.000781 0.001027 
+0.005696 -0.000447 0.001973 0.006362 0.000016 0.001686 
+-0.001963 0.000947 0.002351 -0.008738 0.003565 -0.000887 
+-0.008120 0.001542 -0.005092 -0.001039 0.009309 -0.007166 
+0.008987 0.014260 -0.008439 0.004300 -0.001364 -0.004312 
+-0.011305 -0.018139 0.000606 -0.014308 -0.022358 0.005760 
+-0.015390 -0.016510 0.001785 -0.008419 -0.005513 0.001540 
+0.005241 0.005159 -0.001136 0.012798 0.006514 -0.001059 
+0.005202 -0.001285 -0.002821 -0.000773 -0.000614 0.004151 
+-0.004927 -0.000706 0.003318 -0.001434 0.005126 0.000039 
+0.002127 0.010185 -0.004779 0.003145 0.007522 -0.003282 
+0.001804 -0.000100 0.000921 0.002492 -0.004740 0.001013 
+0.001108 -0.004107 0.000688 -0.001291 -0.000520 0.000046 
+-0.003195 0.003035 -0.000715 -0.002985 0.004493 0.001151 
+-0.002981 0.001429 0.001408 -0.002683 0.002109 0.001822 
+-0.003488 0.000890 0.002512 -0.003244 -0.002347 0.002495 
+-0.000805 -0.000639 0.000323 -0.001436 0.006285 -0.005865 
+0.006700 0.006520 -0.009292 0.010092 0.003969 -0.002846 
+0.006846 0.002385 0.001538 0.006326 0.006219 -0.003127 
+0.003101 0.008248 -0.004124 0.002016 0.004647 0.001743 
+0.002863 -0.000385 -0.000719 0.000696 -0.006383 -0.000329 
+0.001801 -0.005484 -0.001309 -0.005751 -0.002710 -0.000837 
+-0.004786 -0.003961 0.003816 -0.000139 -0.003368 0.004342 
+0.000868 0.000057 0.000561 -0.001003 -0.001686 -0.001168 
+-0.001070 0.000151 0.001656 -0.003408 0.000705 0.004701 
+-0.002784 -0.002244 0.004730 -0.000287 -0.001682 0.001988 
+0.000016 -0.000211 0.000373 -0.001713 0.000638 0.002486 
+-0.004112 -0.001407 0.002263 -0.002769 -0.002614 0.001725 
+-0.001776 0.000079 -0.001332 -0.001147 -0.000913 -0.002492 
+0.002336 0.001631 -0.004703 0.003891 0.004234 -0.007324 
+0.003013 0.005962 -0.003718 -0.002233 0.000484 -0.004234 
+-0.004289 -0.003203 -0.000066 -0.002984 -0.003303 0.004136 
+0.001200 -0.002488 0.005050 -0.001579 -0.000193 0.006471 
+0.000394 -0.005337 0.002087 -0.001990 -0.000917 -0.001366 
+-0.002777 0.000293 0.000679 -0.001927 -0.000396 0.000745 
+0.000732 -0.004748 0.002989 0.000249 -0.004201 0.008045 
+0.000279 -0.003029 0.000746 0.004068 0.002074 0.000520 
+0.003762 0.004874 0.001118 0.002656 0.004247 0.001416 
+0.002166 0.000634 0.001045 0.001438 -0.003525 0.001118 
+0.001635 -0.004525 0.000512 0.000528 0.000025 0.000680 
+-0.003825 -0.002732 0.001449 -0.000238 0.002078 -0.003554 
+-0.009759 0.002797 -0.005448 -0.002442 -0.000440 -0.008861 
+0.005152 0.002997 -0.011317 0.008488 0.007447 -0.009165 
+0.002310 -0.004966 -0.005255 -0.010026 -0.008577 -0.002190 
+-0.013902 -0.003884 0.005786 -0.009181 -0.005692 0.005199 
+-0.001398 0.002691 -0.000752 0.005007 0.006200 -0.000618 
+0.004282 0.004317 -0.001093 0.001361 -0.000489 -0.000314 
+-0.001133 0.001213 0.004358 -0.004220 0.002530 0.002860 
+-0.001573 0.005896 0.001911 -0.000847 0.003171 0.000878 
+0.001116 -0.003434 -0.000015 -0.000465 -0.010142 0.004916 
+0.000978 -0.010060 0.007976 -0.000774 -0.010238 0.006298 
+-0.003039 -0.007401 -0.000634 -0.001569 0.000811 -0.003095 
+-0.000393 0.003892 -0.004840 0.004929 0.006515 -0.001482 
+0.000288 0.000929 0.007173 -0.005894 -0.005748 0.007331 
+-0.007031 -0.002765 0.000528 -0.003787 0.002645 -0.000180 
+-0.001922 0.006068 -0.000568 0.000974 0.006370 -0.003238 
+0.003047 -0.000719 -0.000359 0.003131 0.001009 -0.000354 
+0.002952 0.003202 0.000045 0.002664 0.003635 0.001104 
+0.000003 0.002165 0.000866 -0.000574 -0.001862 0.000428 
+-0.003373 -0.004737 -0.001848 -0.011301 -0.004384 -0.002603 
+-0.007849 -0.006236 0.005537 -0.002624 -0.003177 0.001537 
+0.001049 0.003057 -0.000837 0.001161 0.004388 0.001444 
+-0.002058 0.001924 0.002640 -0.000862 0.000385 0.001450 
+-0.000504 0.000900 -0.000538 -0.001184 0.001980 -0.000622 
+-0.001725 0.003229 0.001043 0.000076 0.004656 0.000000 
+0.000333 0.000562 -0.001181 -0.000460 -0.000419 0.000891 
+-0.002570 0.000150 0.003021 -0.002913 0.001732 0.000866 
+-0.001337 0.000894 0.002742 0.000015 -0.000209 0.002095 
+-0.002159 -0.001919 0.003358 -0.007584 -0.003347 0.003976 
+-0.009212 -0.007093 0.001031 -0.009662 -0.006065 -0.000558 
+-0.007932 -0.003879 -0.002542 -0.003241 -0.000356 -0.002273 
+-0.000227 -0.003298 -0.000429 -0.000483 -0.000637 0.000474 
+0.000065 -0.001701 -0.004843 -0.000197 0.002817 -0.001736 
+-0.002185 0.000424 -0.000113 0.003164 -0.002658 0.002878 
+0.005640 0.000612 0.002644 0.004190 0.002215 0.001565 
+-0.001143 0.006318 -0.000271 -0.003434 0.003985 -0.000371 
+0.000216 -0.001825 0.000070 0.001759 -0.004549 0.003472 
+0.001440 -0.001119 0.004200 0.000393 -0.000922 0.003281 
+-0.003482 0.002113 -0.000726 -0.002372 0.000829 -0.006469 
+-0.004485 0.002353 -0.005971 -0.002742 0.000066 0.000072 
+0.003459 0.001701 -0.001680 0.008262 0.006587 -0.003010 
+0.006059 0.009342 0.002272 0.007544 -0.002755 -0.007102 
+-0.000231 -0.005148 -0.009104 -0.003896 -0.002788 -0.006468 
+-0.003240 0.001459 -0.003693 -0.000855 0.003640 -0.000632 
+0.000103 0.003729 -0.000705 -0.000703 0.000537 -0.000057 
+-0.003517 0.000592 0.000003 -0.004847 -0.000195 -0.001431 
+-0.006558 0.001066 -0.000703 -0.006665 -0.002756 0.001059 
+-0.001712 -0.005070 0.007619 0.004156 -0.002845 0.006656 
+0.002780 -0.002764 0.005533 -0.000521 -0.008747 -0.002791 
+0.001509 -0.004024 -0.006800 0.001255 0.000517 -0.003636 
+0.007466 0.001191 0.004345 0.007095 -0.001438 0.008657 
+0.003251 -0.001444 0.008319 -0.007886 -0.008141 0.005157 
+-0.008359 -0.002264 -0.002421 -0.005534 0.003435 -0.000336 
+-0.001964 0.005587 -0.000328 0.000945 0.004997 -0.000999 
+0.003543 0.002759 -0.006897 0.004646 -0.005380 -0.003725 
+0.002283 -0.003956 -0.003165 -0.004173 0.000079 0.000079 
+-0.009843 0.002399 0.000515 -0.010192 0.001970 -0.002998 
+-0.007497 -0.000481 -0.006152 -0.005154 0.000189 -0.005820 
+-0.001849 0.000376 -0.000215 -0.000520 -0.001434 -0.000264 
+0.000851 0.001820 0.000484 0.004337 0.003828 -0.001236 
+0.001333 -0.000431 -0.000287 0.002188 -0.003501 -0.003137 
+0.002833 -0.004914 -0.003162 0.001230 -0.002297 0.000276 
+-0.000571 0.000995 -0.000207 -0.005585 0.001717 0.005101 
+-0.002319 0.000216 0.003436 -0.002786 0.000043 0.000429 
+-0.001324 0.001324 -0.000662 -0.000360 0.001135 -0.000587 
+0.000269 0.000313 -0.000414 0.000893 0.000230 -0.000157 
+-0.000569 -0.000499 0.000185 -0.002720 -0.003764 0.001119 
+-0.003897 -0.005816 0.001653 -0.001352 -0.002807 0.003155 
+0.000216 0.001188 -0.000108 0.001162 0.003778 -0.000428 
+0.000713 0.003097 -0.001406 -0.001853 0.001507 -0.002347 
+-0.003897 0.003262 -0.000716 -0.002613 0.003297 0.001280 
+-0.000902 0.001959 0.000753 -0.000528 0.000363 -0.000089 
+0.000478 -0.000028 -0.002670 0.000947 0.001619 -0.001622 
+0.001154 0.002029 -0.001286 -0.000561 -0.000094 -0.000209 
+-0.002207 -0.005491 -0.000527 -0.004156 -0.004691 0.003850 
+-0.001466 -0.000420 0.002216 -0.001655 -0.000587 0.003405 
+-0.005037 -0.002622 0.002686 -0.005446 -0.003607 0.000643 
+0.001721 -0.004228 -0.006947 0.007305 0.000369 -0.008204 
+0.005530 0.003962 0.001128 0.004023 0.004920 -0.002367 
+0.001787 0.001550 0.000408 0.001606 -0.000434 0.001639 
+0.003162 -0.004761 0.000372 -0.000787 -0.005841 0.003222 
+-0.001746 -0.005902 0.007658 -0.000877 -0.004362 0.005094 
+0.000790 0.000824 -0.000672 -0.001990 0.004830 -0.005020 
+-0.002161 0.000935 -0.005946 -0.002625 -0.001255 0.001347 
+-0.002912 -0.003429 0.001411 -0.002010 -0.003497 0.002229 
+-0.001023 -0.000567 0.002061 -0.003644 -0.003872 -0.001003 
+0.000993 -0.006944 0.001485 0.001878 -0.004402 -0.000661 
+-0.001630 -0.002055 -0.000515 -0.003261 -0.000954 0.002255 
+-0.002236 -0.002384 0.006544 0.001887 -0.005716 0.007676 
+0.002743 -0.003097 0.004513 0.002445 -0.003521 0.001127 
+-0.000035 -0.004669 -0.001425 -0.006080 -0.006640 0.000000 
+-0.002661 -0.002097 0.000000 0.000613 0.001653 -0.002267 
+-0.001731 0.000157 -0.003200 -0.000201 -0.002954 -0.004337 
+0.002123 0.001800 -0.005062 -0.001631 0.002967 -0.000888 
+-0.003057 0.003584 0.000129 -0.004748 -0.000706 -0.000529 
+-0.001106 -0.005177 0.000369 0.001888 -0.000997 0.000563 
+-0.000660 0.000361 -0.003728 -0.003514 0.000594 -0.002764 
+-0.003277 0.003834 -0.001205 -0.001287 0.005055 -0.000179 
+-0.003232 0.000049 -0.000995 -0.001005 -0.000832 -0.001101 
+-0.000159 0.001058 -0.000044 0.000485 0.004321 -0.001243 
+0.002120 0.000399 -0.003444 -0.002091 0.000818 -0.000683 
+-0.003656 0.001219 -0.000625 -0.003517 0.001083 -0.001414 
+-0.000890 0.000694 -0.001079 0.000483 0.001095 0.005613 
+-0.001002 -0.002667 0.006561 0.000785 -0.004235 0.003278 
+0.001252 -0.004778 -0.002244 -0.000326 -0.003915 -0.002828 
+-0.002180 -0.003506 0.000780 -0.000568 -0.004532 0.000567 
+-0.000123 0.000117 0.001322 0.001244 0.001292 0.002150 
+-0.000392 0.000338 0.001219 -0.003235 0.001380 0.003432 
+-0.004868 0.002403 0.002434 0.000413 0.002246 0.000060 
+0.003336 0.003216 -0.002717 -0.002066 0.004426 -0.004131 
+0.002201 0.002075 -0.005877 -0.001128 -0.001695 -0.001606 
+-0.004914 -0.000350 0.000033 -0.002862 -0.001419 -0.001963 
+-0.004307 -0.000671 -0.000024 -0.002277 0.001318 -0.005400 
+-0.002136 -0.000817 -0.003137 -0.000300 -0.000325 -0.000785 
+-0.000511 -0.000592 -0.000505 -0.003441 -0.000992 -0.003530 
+0.005223 -0.010156 -0.005953 0.012653 -0.003797 -0.013840 
+0.004858 0.001314 -0.004581 -0.000509 0.000448 0.000661 
+0.000215 -0.003423 0.003138 -0.001987 -0.002771 0.003421 
+-0.004495 -0.003118 0.005976 -0.003484 -0.003489 0.009298 
+-0.002430 -0.003741 0.006283 0.000335 0.001310 -0.000158 
+0.001784 -0.000791 -0.000784 0.000155 0.003931 -0.004736 
+0.001154 0.004419 -0.001049 0.001474 0.003823 0.000291 
+0.001785 0.004222 -0.000784 0.001155 0.002701 -0.001014 
+0.000689 -0.000873 -0.001301 -0.002618 0.000754 -0.003505 
+-0.000023 0.001069 0.000793 0.006101 0.001783 0.002072 
+0.001778 -0.001981 0.001416 -0.002603 0.001006 0.000554 
+-0.004018 0.000662 0.002497 -0.003600 0.002480 -0.001360 
+0.001489 0.000094 -0.001632 0.005140 0.001917 -0.000083 
+0.003404 -0.004145 0.002443 -0.003549 -0.010816 0.001817 
+-0.007165 0.000000 0.001417 -0.004867 -0.002409 -0.000080 
+0.002020 0.001721 -0.003405 0.000466 -0.000785 -0.004566 
+-0.003620 0.001859 -0.005300 -0.004170 0.003799 -0.003670 
+-0.000846 0.005197 -0.000999 -0.000026 0.000967 -0.000269 
+-0.000050 -0.004151 0.000964 0.002014 -0.003561 0.000954 
+0.000711 -0.001868 -0.002670 -0.000315 -0.001505 -0.004705 
+-0.001833 -0.000232 -0.003937 -0.003343 -0.003804 -0.001023 
+-0.001454 -0.000974 0.000560 -0.002535 0.000495 0.000055 
+-0.002240 0.002318 -0.001643 -0.000814 0.004501 -0.002143 
+0.000214 0.005084 -0.002300 0.000585 0.003008 -0.001171 
+0.000218 -0.000654 0.000545 -0.000576 -0.000698 0.002697 
+-0.001310 0.000095 0.003036 -0.001700 0.000504 0.002372 
+0.001829 -0.000058 0.002498 0.004713 -0.003232 0.001556 
+0.004364 -0.005359 -0.001022 -0.002008 -0.004744 -0.003101 
+-0.005418 -0.003535 -0.000703 -0.002426 -0.002044 0.000535 
+0.003867 0.000124 -0.000345 0.004162 -0.000289 -0.003569 
+0.001074 -0.001777 -0.002521 0.000150 -0.000588 -0.001014 
+-0.000111 -0.000497 -0.000265 0.002951 0.000161 -0.000329 
+0.005605 0.002235 -0.002888 0.007144 0.006251 -0.004959 
+0.009625 0.010242 -0.003620 0.010526 0.004893 -0.003675 
+0.000964 0.000631 -0.000480 -0.004771 -0.006964 0.004001 
+0.001050 -0.003745 0.000603 -0.000180 0.000714 0.000035 
+0.002599 0.006569 -0.000018 -0.000727 0.004579 -0.001065 
+0.000637 0.000955 0.002390 0.000416 -0.003817 0.004169 
+-0.001155 -0.004333 -0.004389 0.012253 0.001998 -0.015782 
+0.005487 0.007408 -0.009983 0.000967 0.003386 -0.002599 
+0.000422 -0.000793 0.000887 -0.001807 -0.000157 -0.000659 
+-0.001903 -0.000069 -0.001193 -0.001002 0.000456 -0.000821 
+0.000470 0.006439 0.000939 0.000159 -0.000027 -0.001164 
+0.002356 0.000043 -0.003784 -0.000642 0.001210 -0.004258 
+-0.002129 -0.000212 -0.000444 0.000691 0.004066 -0.000961 
+0.000710 0.007708 -0.006085 -0.002011 0.006252 -0.000262 
+0.007479 0.006372 -0.005208 0.001643 -0.000528 -0.003641 
+0.003187 0.003449 0.000932 -0.000735 -0.000596 0.001881 
+-0.000901 0.000774 0.001893 -0.003014 -0.006087 0.002192 
+-0.000528 -0.004867 0.003436 -0.000657 -0.001515 0.002183 
+0.000443 0.000425 0.002408 -0.000395 0.000741 -0.002212 
+0.003655 0.003131 -0.006524 -0.004124 0.001643 -0.007052 
+-0.005833 0.000013 -0.005352 -0.005057 -0.000667 -0.000562 
+-0.002187 -0.000878 -0.000442 0.000602 -0.000437 -0.001603 
+0.000649 -0.001498 -0.004047 0.002952 0.001771 -0.006176 
+0.001785 0.005422 -0.004392 0.002475 0.002926 0.000024 
+0.002944 -0.001435 -0.000586 0.001967 -0.004406 -0.000006 
+0.002097 -0.002550 0.003433 0.002195 -0.002756 0.001889 
+-0.004453 -0.007688 0.008822 0.000639 -0.013984 0.003837 
+-0.001445 -0.001407 0.001293 -0.000851 -0.000488 -0.000209 
+-0.000206 -0.000647 -0.000376 0.000683 0.000054 0.000350 
+0.001321 0.001288 0.000587 0.001035 -0.000025 0.003682 
+-0.000478 -0.000822 0.003580 0.000105 -0.000749 0.000621 
+0.001797 0.001210 -0.000231 0.002614 0.001344 0.000629 
+0.002713 0.000201 0.000803 0.003556 0.001272 -0.002732 
+0.005347 0.003987 -0.003042 0.002415 0.002168 -0.004868 
+-0.002717 0.001471 -0.002002 -0.001342 0.003267 -0.001920 
+0.002387 0.003939 -0.001451 0.004013 0.003078 -0.002089 
+0.001821 0.000442 -0.001444 0.000596 -0.002059 0.000286 
+0.001231 -0.000154 -0.000153 0.004382 0.000175 -0.000631 
+0.005692 0.000621 -0.001552 0.003846 0.001989 -0.001530 
+0.001951 0.002412 -0.002374 0.002604 0.001366 -0.001522 
+0.002258 0.000491 0.000860 -0.000193 -0.002651 0.001701 
+-0.003478 -0.004059 0.001644 -0.002735 -0.003856 0.000582 
+0.000076 -0.000757 0.000304 0.000453 0.001648 0.001295 
+0.000019 0.002443 -0.000453 -0.000506 0.001965 -0.003572 
+0.000999 0.005245 -0.010615 0.006516 0.001597 -0.018852 
+0.001240 0.005065 -0.012648 -0.000196 0.004359 -0.005840 
+-0.000570 0.001062 -0.000545 -0.000750 -0.005109 0.002748 
+0.000920 -0.007265 0.004043 -0.000899 -0.002004 -0.002304 
+-0.002071 -0.001851 -0.002506 -0.002078 -0.000753 -0.002404 
+-0.000721 -0.001187 -0.000154 0.000200 -0.001215 0.000258 
+0.000848 -0.000458 0.000494 -0.002308 0.001304 0.001296 
+0.002037 0.004740 -0.002265 0.007300 0.002245 -0.010667 
+0.007833 0.002464 -0.012687 0.004663 0.002266 -0.004500 
+0.000204 -0.001523 0.004663 -0.005609 -0.005469 0.008675 
+-0.000498 -0.003431 -0.001722 -0.000546 0.000633 -0.000022 
+-0.000106 0.000398 0.001033 -0.001759 -0.000302 0.001404 
+0.001043 -0.000420 0.000828 -0.002121 -0.002033 0.003215 
+-0.002478 -0.001255 0.004416 -0.002210 0.000993 0.003522 
+-0.002439 -0.001597 0.000503 -0.004871 -0.003020 0.000632 
+-0.005231 -0.007369 0.001108 -0.004580 -0.003783 0.004729 
+-0.001000 -0.001385 -0.002385 -0.004003 -0.000274 -0.002153 
+-0.004231 0.000275 -0.002618 -0.004577 -0.001746 0.000269 
+-0.002891 -0.005036 0.005781 -0.000763 -0.006222 0.007719 
+0.002160 -0.002391 0.005783 -0.001374 -0.002187 0.002574 
+-0.001322 0.000390 -0.000450 -0.000509 -0.005196 -0.000612 
+-0.002521 -0.002002 0.003927 0.001082 -0.001484 0.001534 
+0.005276 0.000554 -0.003025 0.005444 0.000626 -0.008372 
+0.000412 -0.003212 -0.003335 -0.000795 -0.000901 -0.000318 
+-0.003721 -0.001916 0.001198 -0.004050 -0.001995 0.003898 
+-0.000866 0.000178 0.002467 0.005215 -0.002897 0.000157 
+0.006788 -0.003301 -0.002492 0.008786 0.002260 -0.003947 
+0.001873 0.002072 -0.003667 -0.001673 -0.000014 0.003103 
+-0.003535 -0.000816 0.005929 -0.000046 0.000320 0.004322 
+0.001312 0.001649 0.001705 0.001433 -0.000921 -0.000262 
+0.000843 -0.002876 0.003930 -0.000455 -0.002196 0.002475 
+0.000041 -0.000642 0.000407 0.001039 0.001274 0.000313 
+0.002460 0.003412 -0.001254 0.003878 0.004580 -0.001939 
+0.004326 0.001304 -0.001642 -0.001338 -0.000662 -0.002676 
+-0.000534 -0.001387 -0.001384 0.000793 0.000930 -0.000765 
+0.000105 -0.000734 -0.001803 0.000082 0.001646 -0.002385 
+-0.000068 0.001568 -0.000544 -0.000083 0.000022 -0.000301 
+-0.000309 -0.000244 -0.002199 -0.001120 0.000213 -0.008485 
+-0.003203 0.001106 -0.012789 0.000721 0.001382 -0.009712 
+-0.000269 0.001253 -0.002013 -0.000302 0.001192 -0.000802 
+0.003922 0.000590 -0.000894 0.002497 -0.003006 0.002016 
+-0.002177 0.000611 0.005497 -0.006800 -0.004219 0.003557 
+-0.001434 -0.001434 0.001395 0.004281 0.001829 -0.002625 
+0.004912 0.001582 -0.000213 0.001129 0.000927 0.000927 
+-0.001457 0.002447 0.000801 -0.001625 0.001472 -0.000193 
+-0.000109 0.000935 -0.003054 -0.000180 -0.001651 -0.004062 
+0.000630 -0.001793 -0.003329 0.000788 -0.000899 -0.003074 
+0.000595 -0.002241 -0.002890 0.000207 -0.003021 -0.002315 
+-0.000475 -0.001218 -0.001181 -0.001594 0.002252 -0.001313 
+0.002140 0.002313 0.000029 -0.001299 -0.000313 0.000319 
+0.000537 -0.001836 0.003331 0.001296 -0.002506 0.005833 
+0.001380 -0.003007 0.005444 0.002796 0.000396 0.004326 
+0.001071 0.000307 0.002645 -0.000010 0.000152 0.000340 
+-0.000196 -0.000014 -0.000601 -0.000705 0.001522 -0.001762 
+0.000363 0.001616 -0.001009 -0.001993 -0.001530 0.001490 
+-0.002565 -0.006078 -0.000644 -0.003416 -0.007687 0.002420 
+-0.003929 -0.005273 0.003592 -0.002436 -0.003592 0.000818 
+-0.001232 -0.002225 -0.003160 0.001326 0.002411 -0.004099 
+0.000000 0.000667 -0.000333 -0.002702 -0.003346 -0.001073 
+-0.001298 0.000000 0.001832 -0.003258 -0.001904 0.004444 
+0.001260 -0.001260 0.001603 -0.001747 -0.005817 -0.002457 
+-0.001572 -0.004723 0.000700 -0.000947 -0.003294 0.001441 
+-0.003151 -0.003260 0.002837 -0.004053 -0.002576 0.004053 
+-0.001706 -0.001434 0.002279 0.001396 0.000489 -0.001513 
+0.001527 0.001519 -0.000337 -0.000390 -0.000818 -0.001647 
+0.000031 -0.002459 0.000776 -0.000841 -0.002727 0.001249 
+0.001749 -0.002004 -0.001739 0.000596 -0.000843 -0.003529 
+0.000439 -0.000976 -0.001543 -0.003740 -0.002236 0.000569 
+-0.005034 -0.002823 -0.000959 -0.000288 -0.004407 -0.000186 
+0.000288 -0.000885 0.000991 0.000434 0.001827 -0.000616 
+0.002370 0.002728 -0.000462 0.001044 0.003239 0.000134 
+0.001798 0.000566 0.000857 0.005755 0.000641 -0.001336 
+0.004941 0.003706 -0.003706 0.004934 -0.000526 -0.002566 
+0.004856 0.000114 -0.002712 0.001698 0.000927 -0.004685 
+0.000272 0.003321 -0.003932 -0.000284 0.001063 -0.001389 
+0.000503 -0.002514 0.000157 0.000579 -0.003873 -0.000624 
+0.000514 -0.003274 -0.003292 0.000096 -0.000820 -0.001600 
+0.000267 -0.001285 0.001546 0.000022 -0.000730 0.001135 
+-0.000964 0.000997 -0.000542 -0.001496 0.002366 -0.001372 
+0.003682 0.002201 -0.001329 -0.000083 0.001575 -0.000743 
+0.005615 0.000751 0.000083 0.003448 0.000745 -0.002112 
+0.002489 0.001139 -0.001683 -0.001640 0.004250 -0.001230 
+0.005210 0.007870 -0.000525 0.006509 0.007909 -0.005349 
+-0.000303 0.000390 -0.002163 -0.001548 0.001756 0.000452 
+-0.002447 -0.000798 -0.000564 0.000057 -0.002858 -0.000757 
+0.000166 -0.002266 -0.004091 0.000772 -0.002494 -0.002271 
+0.001613 -0.000532 -0.000506 0.003306 0.000147 -0.000010 
+0.000248 -0.000976 0.000355 0.000505 -0.001359 -0.001645 
+-0.000935 0.000836 -0.000049 -0.002514 0.000457 -0.000748 
+-0.001314 0.001058 0.000532 -0.000707 0.002827 -0.001269 
+0.002467 0.000301 0.001102 0.005446 0.001099 0.000749 
+0.005532 0.003653 -0.001210 -0.000467 0.001121 -0.003061 
+-0.004755 -0.000652 -0.000997 -0.004227 -0.000334 -0.002448 
+-0.001792 0.000240 -0.000416 0.000368 -0.000138 0.001460 
+0.001087 0.003333 0.001377 0.000585 0.001555 0.002077 
+-0.001632 -0.004441 0.002902 -0.004560 -0.006955 0.002821 
+-0.006658 -0.005322 -0.001142 -0.004485 -0.001760 -0.002455 
+-0.000464 -0.001177 0.002682 0.000669 -0.000328 -0.000013 
+0.000150 -0.000451 0.000150 -0.002500 -0.004028 0.000948 
+-0.004445 -0.005670 0.002858 -0.003827 -0.005138 0.001195 
+0.000455 -0.001061 0.000303 -0.000209 0.001022 0.000021 
+-0.000350 0.000391 0.000140 0.000079 -0.002299 -0.000563 
+-0.000967 -0.002491 -0.002398 0.000675 -0.002850 0.000351 
+-0.000312 -0.000965 0.000695 0.001341 0.001100 -0.000688 
+0.002157 0.000823 -0.001192 0.001100 -0.000082 -0.000524 
+0.000047 -0.001827 0.000371 -0.001874 -0.001868 0.003471 
+-0.005532 -0.000538 0.000998 -0.004173 -0.000463 -0.000793 
+0.000227 -0.000256 0.000036 0.002903 0.002519 -0.002050 
+0.003429 0.000688 0.000054 -0.000090 0.000045 -0.000036 
+-0.001841 0.001032 -0.000921 -0.001545 0.004058 0.000541 
+0.004777 0.004461 -0.004058 0.001323 0.006137 -0.004999 
+0.000704 0.000138 -0.003728 0.001705 -0.001444 -0.000524 
+0.000675 -0.001798 0.000690 0.001312 -0.001551 0.003209 
+0.000790 -0.003185 0.003431 0.000429 -0.002793 0.002563 
+0.003306 0.003771 0.000765 -0.000873 0.003633 -0.002108 
+-0.000257 0.001653 -0.001281 -0.000079 -0.000867 -0.000152 
+-0.001829 0.002454 0.000096 0.000768 0.008730 -0.000525 
+0.002381 -0.001386 -0.001176 -0.001435 0.003338 0.000375 
+-0.001346 0.000231 -0.000269 -0.000835 -0.001671 0.000450 
+0.002327 -0.000774 -0.001052 0.004886 -0.000541 -0.001024 
+0.003017 -0.001273 -0.002403 0.000703 0.000905 -0.001738 
+-0.000530 0.001645 -0.000720 0.001729 0.000000 0.002331 
+-0.000866 0.000148 0.000737 -0.000840 -0.001640 0.001040 
+-0.000564 -0.001822 -0.000924 -0.000450 -0.000609 -0.000988 
+-0.001638 -0.000023 -0.001010 -0.000932 0.000022 -0.001142 
+0.000245 -0.000817 0.000625 0.001594 0.001469 -0.002147 
+0.002869 0.000697 0.001179 -0.001842 0.001462 -0.001220 
+0.000312 0.001239 -0.003098 0.000032 0.001308 -0.000482 
+0.000220 -0.000159 0.000693 0.000234 -0.000130 -0.000624 
+0.000383 0.002871 -0.002290 0.002328 0.002826 -0.003826 
+-0.001880 0.001698 -0.002597 -0.000557 -0.001176 -0.001238 
+-0.001272 -0.000748 -0.001486 -0.000301 -0.001049 0.001506 
+0.000716 -0.001252 0.000074 0.001996 -0.001796 -0.000233 
+0.000120 -0.001061 0.000676 -0.003762 -0.000152 0.000630 
+-0.003396 0.002269 -0.001884 0.000280 0.001958 -0.002500 
+0.003380 0.000563 -0.002254 0.000188 0.001507 -0.003116 
+-0.000509 -0.000891 -0.001611 -0.002711 -0.001984 -0.002275 
+-0.005179 -0.003699 -0.002630 -0.004167 -0.005784 -0.002869 
+-0.002846 -0.006583 -0.001317 -0.000769 -0.003163 0.001662 
+-0.000319 0.000188 -0.000230 -0.000779 0.000255 -0.000184 
+-0.000207 -0.000879 -0.001047 0.003233 -0.001078 -0.004041 
+0.003601 0.000749 -0.009127 -0.000986 0.002689 -0.001550 
+0.003172 0.001310 -0.000382 -0.002804 -0.002696 0.001813 
+-0.003463 -0.004145 0.002932 -0.002215 -0.002558 -0.000206 
+-0.000132 0.000471 -0.002089 0.001000 0.001331 -0.003992 
+0.001527 0.001924 0.000962 -0.000308 0.000308 0.000000 
+0.000212 -0.001060 -0.000636 -0.000860 -0.002025 -0.001223 
+-0.001464 -0.002813 -0.000855 -0.001327 -0.000806 -0.000241 
+0.001481 0.002984 -0.001974 0.000269 0.005661 -0.004182 
+0.002073 0.004503 -0.005170 0.001827 0.001550 -0.002467 
+-0.001224 0.000612 0.000000 0.000119 0.002084 0.000902 
+0.000238 0.004085 0.000659 0.000744 0.004206 0.000677 
+0.001112 -0.000055 0.000326 -0.000402 0.000762 0.001723 
+0.000090 0.000253 0.000672 0.000926 -0.000420 0.001378 
+0.002410 -0.002055 0.000728 0.003813 -0.000213 0.003387 
+0.000233 0.002624 -0.001340 0.003246 0.003929 -0.002049 
+0.003891 0.001589 -0.004220 0.004471 0.002209 -0.003585 
+0.004303 0.003883 -0.003022 0.003794 0.002056 -0.004748 
+0.000234 -0.001886 -0.001509 -0.003584 -0.000500 -0.001522 
+-0.001984 0.001134 0.001102 0.000968 -0.000710 0.000032 
+0.004232 -0.000455 0.000864 0.002874 -0.001570 0.002246 
+0.001508 0.000850 0.002759 0.000977 0.000122 0.001465 
+-0.000234 0.000156 -0.000438 -0.003450 -0.002974 0.000386 
+-0.001197 -0.005317 -0.001996 -0.002829 -0.002941 0.000140 
+-0.000458 0.000000 0.000382 -0.000692 -0.000154 0.001692 
+-0.003599 -0.000332 -0.000919 -0.001018 -0.002422 -0.001333 
+-0.001249 -0.001602 -0.001013 -0.000314 -0.001003 -0.000658 
+-0.001987 -0.001520 -0.000037 -0.003710 -0.003356 0.002646 
+-0.005429 -0.004431 0.001736 -0.005874 -0.004718 0.001526 
+-0.005769 -0.002692 0.001537 -0.003504 0.000000 0.003066 
+-0.001711 -0.001303 0.002374 -0.002416 -0.000492 0.001104 
+-0.001504 0.000848 0.001813 -0.003351 0.001138 0.001833 
+-0.002923 0.000613 0.001245 -0.000378 -0.000787 -0.000189 
+0.000030 0.000839 -0.001303 -0.001153 0.000251 0.000952 
+-0.003741 -0.002272 0.004388 -0.004452 -0.001138 0.005330 
+-0.004881 0.000713 -0.000200 -0.006231 -0.005428 -0.000420 
+-0.006605 -0.006744 0.002202 -0.003977 -0.005455 0.003977 
+-0.000095 -0.003014 0.003236 0.000025 -0.002188 0.003622 
+0.001325 -0.005439 0.000502 0.002848 -0.003734 -0.000594 
+0.002649 -0.002635 0.000022 0.006597 0.003866 -0.000412 
+0.001044 -0.001037 0.000269 -0.001730 -0.002680 0.003177 
+-0.002227 0.000324 -0.001416 -0.001884 0.002493 -0.005277 
+-0.000503 0.003429 -0.005972 0.000262 0.002047 -0.000609 
+0.001792 -0.001898 0.001822 0.001938 -0.001550 0.000775 
+-0.000985 -0.000916 0.000325 -0.002049 0.002177 -0.001980 
+-0.001753 0.003099 -0.001256 -0.000488 0.001057 -0.000325 
+0.000367 -0.000763 0.000287 0.000304 -0.000905 0.000095 
+0.000610 0.001694 0.000321 0.000721 0.002452 0.001857 
+-0.000641 0.001831 0.002369 0.001994 -0.002666 0.003243 
+0.000340 -0.002258 0.001173 0.000300 0.002366 -0.003898 
+0.001100 0.000168 0.000325 0.000605 -0.000248 0.001954 
+0.001618 -0.003386 0.003301 0.001697 -0.002086 0.001009 
+0.004094 0.002057 -0.002956 0.004811 0.004243 -0.002547 
+0.002547 0.000678 -0.001192 0.000723 0.000148 0.000731 
+0.001885 -0.001181 0.000911 0.001587 -0.000939 -0.000534 
+-0.003459 -0.000684 -0.001444 -0.004519 -0.002160 -0.000389 
+-0.002538 -0.000584 0.001243 0.000168 0.000074 -0.000039 
+0.000417 0.001670 -0.004516 -0.002072 0.001807 -0.006431 
+-0.000498 0.000913 -0.002545 0.000887 -0.002386 0.003066 
+-0.002243 -0.002233 0.001123 -0.002239 -0.002321 -0.000967 
+-0.003842 -0.004275 -0.002912 -0.003971 -0.004651 -0.002648 
+-0.003026 -0.003026 0.002017 -0.003618 -0.001538 0.002714 
+-0.003713 0.000659 0.001457 -0.002137 0.004468 -0.002681 
+-0.000471 0.006187 -0.003759 -0.000871 0.003826 -0.007348 
+0.000517 -0.004202 -0.003674 0.000000 -0.003134 -0.001045 
+0.000889 -0.000704 -0.000704 0.000168 0.000691 -0.001074 
+0.000590 0.001128 -0.001718 -0.002587 0.000251 -0.004634 
+-0.002693 0.000563 -0.003986 -0.000378 0.001546 -0.000801 
+0.000435 0.002130 0.000710 -0.000263 0.000130 0.000278 
+0.001592 -0.000200 -0.001998 0.005923 0.003489 -0.002920 
+0.007675 0.005662 -0.003416 0.007161 0.006875 -0.000477 
+0.001412 0.001838 0.000706 0.000190 0.001327 -0.001269 
+-0.000275 -0.001890 0.000292 -0.004258 -0.003502 0.001135 
+0.000171 -0.000229 0.001825 -0.001259 -0.000770 0.001066 
+0.001451 0.001407 0.000341 0.001051 0.002449 -0.000176 
+-0.000441 0.001838 0.000662 0.001620 0.000934 0.001806 
+0.003093 -0.002376 0.002668 0.003512 -0.002651 0.001963 
+-0.001089 -0.000638 -0.000520 -0.002381 -0.000298 0.004730 
+-0.000308 0.000462 0.003769 -0.001806 -0.002276 0.001011 
+0.000721 -0.002780 -0.000387 0.001749 -0.000657 -0.000802 
+-0.000794 0.002531 -0.004020 -0.000806 0.002601 -0.001079 
+-0.000956 -0.001214 0.000258 -0.001284 -0.001228 -0.000298 
+-0.000269 0.001676 0.000913 0.002383 0.000013 -0.001085 
+0.003902 0.001780 -0.004470 0.002600 0.001109 -0.003969 
+0.001879 -0.000060 -0.001275 0.001018 0.000280 -0.000738 
+0.003644 0.001214 0.001211 0.002721 0.002577 0.000571 
+0.000260 0.000962 0.000758 0.001462 -0.001673 0.002621 
+0.000822 -0.002672 0.005699 -0.000915 0.002027 0.003602 
+0.000449 0.004936 0.002508 -0.002341 0.004904 -0.002676 
+-0.001547 0.003638 -0.002195 -0.000325 0.002448 0.001633 
+0.008921 0.004791 0.000874 0.009518 0.005218 -0.002573 
+0.000862 0.002852 0.000208 -0.001459 -0.001713 -0.000643 
+-0.002461 -0.003091 -0.000523 -0.001282 -0.000906 -0.001812 
+0.000932 -0.003207 -0.002138 0.001833 -0.004150 0.000579 
+-0.001227 -0.005659 0.000989 0.000525 -0.006247 -0.000508 
+0.000801 -0.004435 -0.002232 0.001034 -0.001931 -0.001521 
+-0.000971 -0.003017 0.001329 -0.000591 -0.001758 -0.000953 
+-0.002142 -0.001771 -0.001398 -0.004327 -0.002184 -0.002518 
+-0.004791 -0.003440 -0.003341 -0.003922 -0.004714 -0.002489 
+0.000461 -0.004695 -0.000796 -0.002716 -0.002213 -0.001295 
+-0.006485 -0.000846 0.002162 -0.002164 -0.000258 0.003133 
+-0.001633 -0.001148 -0.003164 0.004383 0.000488 -0.003408 
+0.004521 0.004512 -0.004533 0.001908 0.004059 -0.002884 
+-0.002353 0.000846 -0.000846 -0.000012 -0.000935 -0.001005 
+-0.001235 -0.001637 -0.003504 -0.001095 0.002137 -0.001407 
+-0.004241 -0.001375 -0.001448 -0.002739 -0.002714 0.000317 
+-0.000985 -0.001664 0.000187 -0.000275 0.000000 -0.000551 
+0.002878 0.001259 -0.002338 0.000721 0.000546 -0.002469 
+0.000215 0.002209 -0.001713 -0.001446 0.003436 -0.001591 
+0.001567 0.000151 -0.000372 0.000224 0.003209 0.000149 
+-0.001591 -0.001364 0.002500 -0.005986 0.001070 0.006740 
+-0.002353 -0.001756 0.005883 0.000270 -0.000922 -0.001035 
+-0.001120 -0.003680 -0.000400 -0.001911 -0.003382 0.001634 
+-0.004122 -0.002739 0.000064 -0.001368 -0.000541 -0.001302 
+-0.000604 -0.000964 -0.001561 -0.005927 -0.005714 -0.002540 
+-0.003917 0.000257 0.004270 -0.001345 0.001436 0.000642 
+0.000695 0.001171 -0.000201 0.000910 -0.001516 0.001615 
+0.001837 0.000814 -0.000105 0.003367 -0.000123 0.000704 
+0.003023 0.000533 0.000400 -0.000176 0.000603 0.000464 
+0.002419 0.003643 -0.001457 0.000202 0.000675 -0.002924 
+0.000817 -0.000943 -0.000299 0.001921 -0.001965 0.001818 
+0.000903 -0.000460 -0.000276 0.001310 0.001479 -0.002095 
+0.001067 0.002650 -0.005506 -0.000615 -0.000543 -0.005539 
+-0.000553 0.000181 0.000313 0.001637 -0.002594 -0.002223 
+-0.000264 -0.002326 -0.004125 -0.000238 0.000274 -0.002975 
+-0.000031 -0.000352 0.001477 -0.001222 0.000181 0.003376 
+0.003000 0.000326 0.001678 -0.000124 0.000620 0.000242 
+-0.000550 0.001799 -0.000438 -0.000462 0.001110 -0.000239 
+0.001736 0.000847 -0.002270 -0.000207 0.002610 -0.003437 
+0.002665 0.003478 -0.000140 0.002741 0.000869 -0.000190 
+0.001510 -0.000814 0.000801 0.002825 0.000945 0.001254 
+0.002882 0.004203 0.000450 0.008803 0.002291 -0.004581 
+0.001975 -0.001975 -0.002521 0.000620 -0.004466 0.000558 
+-0.003762 -0.005741 0.003369 0.000385 -0.001580 -0.001053 
+0.002274 -0.001321 0.000608 0.001307 -0.000746 -0.000071 
+-0.000417 0.000620 0.000620 -0.000082 0.001535 0.001631 
+0.002358 0.001545 0.000569 0.003239 0.001140 -0.002288 
+0.000038 -0.000839 -0.001906 -0.001863 -0.002128 0.001329 
+-0.003733 -0.000531 0.001999 0.000250 0.000693 0.000306 
+-0.002391 -0.000124 -0.000833 -0.003914 -0.001651 0.002578 
+-0.002046 0.002346 0.002796 -0.005393 -0.008325 -0.001325 
+-0.005810 -0.005076 0.003333 0.000172 -0.000095 0.000151 
+0.001753 0.003381 -0.003415 0.002145 0.007468 -0.001070 
+0.000230 0.001818 0.000293 0.001071 -0.004566 0.002000 
+-0.001313 -0.004768 0.002863 -0.002092 -0.001338 0.002384 
+-0.002100 0.001160 0.002680 -0.000979 0.000272 0.001512 
+0.000345 -0.001005 -0.000045 0.002058 -0.000823 -0.001532 
+-0.002401 -0.001325 0.002360 -0.001775 -0.002662 0.005621 
+-0.006952 -0.002466 0.004042 0.000018 -0.002673 0.005179 
+0.000341 0.000976 0.004608 -0.003377 0.001345 0.002158 
+-0.002028 -0.002313 0.004631 0.000824 -0.002221 0.001952 
+0.001359 -0.003261 -0.000905 0.000953 -0.002683 -0.001557 
+-0.003190 -0.002770 -0.001255 -0.005390 -0.002464 0.002625 
+-0.002630 -0.000232 0.001311 0.000659 0.001301 -0.000782 
+0.002676 0.001646 -0.000927 0.003203 -0.000924 -0.000058 
+0.001163 -0.002868 0.000000 -0.001999 -0.002241 0.001635 
+-0.001836 0.002168 0.000625 -0.000471 0.003120 0.000118 
+0.002548 0.002992 -0.004335 -0.000456 -0.000527 -0.007372 
+-0.000294 -0.000864 -0.000504 0.000875 0.004079 -0.001766 
+0.000019 0.002771 -0.003071 0.000428 0.001149 -0.002810 
+-0.001557 0.000653 -0.001608 -0.000159 0.000111 0.000622 
+-0.000142 -0.001349 0.003029 -0.000652 -0.002877 0.003597 
+0.000342 -0.003002 0.000893 -0.000019 0.000903 -0.001565 
+0.001664 0.004181 -0.004246 0.004679 0.001883 -0.000669 
+0.001797 -0.000644 0.000362 -0.000497 0.001344 0.000815 
+-0.001901 0.005550 -0.000675 -0.000425 0.007680 -0.002131 
+0.002870 0.003061 -0.001243 -0.000316 0.000013 -0.000461 
+-0.000918 -0.001242 0.001972 0.000474 -0.000029 0.000813 
+0.002042 0.002139 -0.002919 0.003015 0.004020 -0.003554 
+0.001162 0.002665 -0.002955 -0.000085 0.000673 -0.000589 
+0.000211 -0.000893 0.000977 0.000394 -0.000004 0.000205 
+0.003871 -0.002523 -0.002696 0.003414 -0.001966 -0.002791 
+0.000995 0.000502 -0.000477 -0.000195 -0.002130 0.003661 
+0.001614 -0.002883 0.001657 -0.001828 -0.003036 0.000457 
+0.001635 -0.000349 -0.003200 -0.000796 0.003396 -0.003290 
+0.001199 0.002161 -0.003904 -0.003139 -0.000786 0.001558 
+-0.006441 0.000854 0.005562 -0.006030 -0.000243 0.007486 
+-0.002116 -0.003821 0.002557 -0.000382 -0.002290 0.001145 
+-0.002734 -0.004071 0.001349 -0.004165 -0.004812 0.006376 
+-0.001566 -0.003848 0.009916 -0.000882 0.001102 0.007493 
+-0.002704 -0.001690 0.005492 0.000137 -0.002078 0.000657 
+-0.001802 -0.001000 -0.001147 -0.001673 -0.000950 -0.001963 
+0.001952 -0.000300 -0.003127 0.004592 0.000570 -0.001851 
+-0.000614 0.000736 -0.000565 0.000093 -0.000950 -0.001178 
+0.001324 -0.003049 -0.000154 0.002767 -0.004101 -0.000075 
+0.002798 -0.001675 0.002001 -0.000569 0.000949 0.003606 
+-0.000216 -0.003142 0.000795 0.000389 -0.000968 0.000336 
+-0.000496 0.000484 -0.000213 -0.002984 0.002419 0.001290 
+-0.000105 0.004457 0.001402 0.004868 0.000899 -0.000836 
+0.000376 -0.000706 0.000713 -0.000022 0.001423 0.004828 
+-0.001996 -0.001888 0.000216 -0.000710 -0.002952 0.001424 
+0.001435 -0.004423 -0.000304 0.000614 -0.002965 0.000233 
+-0.002105 0.000150 -0.000150 -0.001884 0.000935 -0.002348 
+-0.000012 0.003345 -0.003020 0.003336 0.005706 -0.003530 
+0.005099 0.006613 -0.005993 0.002953 0.004679 -0.007211 
+0.000581 0.001581 -0.004551 -0.004399 -0.003602 -0.002264 
+-0.004030 -0.001136 0.003175 0.000054 -0.001534 0.001066 
+0.003296 0.000065 -0.001486 0.002988 0.000537 -0.000006 
+-0.000382 0.001155 0.001501 -0.001297 0.000949 0.000500 
+0.000664 -0.000923 0.000701 0.003077 0.000452 0.000865 
+0.002018 -0.001359 -0.000172 -0.000176 0.000871 0.000630 
+0.001940 -0.000301 -0.002102 0.003778 -0.003983 -0.003367 
+0.000345 -0.004039 -0.002669 -0.001241 -0.000501 -0.001453 
+-0.000672 0.001670 0.000425 0.000488 0.002096 0.001966 
+0.001798 0.001031 0.002230 0.003575 0.001401 -0.000773 
+0.005643 0.004130 -0.004082 0.008763 0.008846 -0.006572 
+0.010074 0.010282 -0.005414 0.005911 0.005689 0.000044 
+0.004160 -0.001811 -0.000378 0.002717 -0.004127 0.000407 
+0.002610 -0.002038 0.000077 0.002338 0.000972 -0.002596 
+0.000870 0.000899 -0.002430 0.000261 -0.000210 0.000176 
+0.000040 -0.001336 0.002236 -0.000611 -0.000862 0.002783 
+0.000976 0.000604 0.002325 0.001478 0.000988 -0.000768 
+0.002303 0.002097 -0.000288 -0.000150 0.001462 -0.004011 
+-0.000929 0.003495 -0.002487 -0.003248 0.001815 -0.001210 
+-0.000896 -0.000645 -0.000430 0.000804 -0.001789 0.000502 
+-0.000532 -0.004194 -0.000177 -0.004152 -0.001384 0.004160 
+-0.001280 0.000354 0.001769 0.000747 -0.000107 -0.000267 
+0.003620 0.002130 0.001917 0.001842 0.000143 0.000272 
+-0.002322 0.000432 0.002050 -0.002280 -0.001174 -0.000268 
+-0.004222 -0.001558 0.000328 -0.004212 -0.002521 0.000332 
+-0.005207 -0.002793 0.003380 -0.005197 -0.000006 0.001883 
+0.000184 0.001119 0.004026 0.000905 -0.000626 0.001474 
+0.000951 -0.000248 0.000822 0.004353 0.001008 0.000484 
+0.000302 0.000478 0.001024 0.003417 0.001511 -0.003417 
+0.001755 -0.000348 0.003684 -0.000121 -0.001901 0.002394 
+-0.001917 -0.000978 -0.000196 -0.001049 0.000901 -0.000828 
+0.001226 -0.000399 0.000914 0.001616 -0.000540 0.001747 
+-0.000268 0.001692 0.001135 -0.002177 0.002572 -0.001306 
+-0.001495 0.000140 0.002119 0.001850 -0.001388 0.004141 
+0.001515 -0.002648 0.002902 0.000214 -0.000856 -0.000833 
+0.001106 0.001189 -0.001594 -0.000947 0.000606 -0.000082 
+-0.001981 0.000385 0.000279 -0.001100 0.002270 -0.001708 
+-0.000144 -0.000719 -0.002878 -0.001622 -0.000961 -0.001262 
+0.000318 -0.004889 -0.002679 -0.001699 -0.003728 -0.004346 
+-0.001222 -0.002187 -0.003925 -0.000646 0.000023 -0.002768 
+-0.000172 0.001559 -0.003030 0.000313 -0.000069 -0.001024 
+-0.002974 0.001806 -0.000265 -0.000943 -0.000360 0.001729 
+-0.002477 -0.003470 0.002818 -0.002054 -0.005142 0.005141 
+0.000047 -0.002678 0.004404 0.003263 0.000859 0.000421 
+0.005055 0.001174 -0.000324 0.003315 0.000748 0.000167 
+-0.001302 0.001473 0.000770 -0.002354 0.002029 -0.000623 
+-0.000320 0.000799 -0.000560 0.000294 0.000212 -0.000042 
+0.000453 0.000036 0.000085 0.000638 0.000124 0.000553 
+0.001283 -0.000886 -0.001251 0.001350 0.001633 -0.005494 
+0.007939 0.001662 -0.005384 0.005240 -0.000079 -0.002197 
+0.001436 -0.002635 0.003881 -0.002418 -0.004385 0.001278 
+-0.002713 -0.001600 0.001480 -0.000864 -0.000301 0.001588 
+-0.000693 -0.000649 -0.000779 0.002266 -0.000764 -0.002252 
+0.000971 -0.000248 -0.002784 -0.000276 0.001726 -0.000115 
+-0.002421 0.001240 0.001624 0.001121 0.000172 0.001638 
+0.005812 -0.000598 0.000000 0.006552 -0.000905 -0.000905 
+0.000623 -0.000232 0.000512 -0.004627 -0.002048 -0.002407 
+-0.007789 -0.001757 -0.003037 -0.004899 -0.000612 -0.001336 
+0.000078 -0.002255 0.003946 0.001666 -0.003859 0.001603 
+0.000080 -0.000151 0.000133 -0.002648 -0.000411 -0.002777 
+-0.001001 -0.000561 -0.000914 0.000120 -0.000120 0.001203 
+0.000266 -0.003541 0.004428 -0.005405 -0.005164 0.007568 
+-0.007858 -0.008806 0.000832 -0.004162 -0.010568 0.000438 
+0.000000 -0.008231 0.007231 -0.001099 -0.007951 0.001918 
+0.002461 -0.002113 0.002361 0.006113 0.004770 0.000780 
+0.006267 0.007693 -0.003238 0.003520 0.005241 -0.003755 
+0.000074 -0.000548 -0.000958 0.000313 -0.001126 -0.000647 
+0.000000 0.000000 0.003116 -0.000350 -0.001662 0.002201 
+-0.001531 -0.002658 0.000823 0.000512 -0.002762 0.001096 
+0.000386 -0.000038 -0.000764 0.002895 0.003743 -0.002684 
+-0.000968 0.006451 -0.006891 -0.001508 0.003038 -0.005078 
+-0.000541 0.001005 -0.002125 0.000517 -0.002113 -0.001068 
+0.002306 -0.000104 -0.000658 0.000775 0.002549 -0.001070 
+-0.000523 0.002463 -0.001237 0.001185 0.000437 -0.001964 
+0.002651 -0.000972 -0.003370 0.003165 -0.000013 -0.001576 
+0.000499 -0.001632 -0.001210 -0.003288 -0.003711 -0.001696 
+-0.003680 -0.004902 -0.004086 -0.002117 0.000353 -0.002901 
+-0.001044 -0.001352 0.000885 -0.000258 0.001019 -0.000650 
+-0.000872 -0.000295 -0.002243 0.001074 0.000102 -0.000051 
+-0.000227 0.000123 0.000184 -0.003055 -0.000154 0.001037 
+-0.002835 -0.002635 0.004049 -0.000607 0.000589 0.001567 
+0.003833 0.004083 0.001083 0.003160 0.005517 -0.000669 
+0.000162 0.001476 0.002447 -0.006205 -0.001480 0.000677 
+-0.003624 -0.004405 -0.001556 -0.002126 -0.002126 -0.002126 
+-0.001295 0.000910 -0.004619 -0.000849 -0.000215 -0.000469 
+-0.001235 -0.000345 0.002580 0.000074 0.000261 0.002983 
+0.003843 0.001105 0.000473 0.001227 0.003285 -0.004472 
+-0.001721 -0.000263 -0.006185 0.005275 -0.001347 -0.007333 
+0.007498 0.003821 -0.006648 0.006529 0.003555 -0.001813 
+0.000333 -0.000024 0.000172 -0.001927 0.002973 -0.002112 
+0.002569 0.003426 -0.000523 0.005124 0.002314 0.002087 
+0.001214 0.002830 0.004718 0.003286 0.006571 0.002778 
+0.001380 0.000172 0.001129 0.003600 0.000499 -0.001995 
+0.003039 0.003015 -0.002898 0.001288 0.001503 -0.002250 
+-0.002665 -0.000723 0.000497 -0.000708 -0.003185 0.003445 
+-0.002240 -0.001742 0.004331 -0.001292 -0.000230 0.000623 
+-0.001366 -0.000763 -0.000152 -0.004000 -0.002215 -0.001108 
+-0.004013 -0.001080 -0.002192 -0.000895 0.000157 -0.000246 
+0.001430 0.004322 -0.000214 0.003103 0.003103 0.001293 
+0.002184 0.000556 0.000936 0.001089 -0.001292 -0.001883 
+-0.001599 -0.001454 -0.000106 -0.003265 0.001088 -0.001400 
+-0.002007 0.003343 -0.000362 -0.001381 0.002724 0.001145 
+0.002881 0.002850 -0.001839 0.000333 0.001138 -0.000278 
+0.000375 -0.001337 0.001006 0.001934 -0.000490 0.000790 
+0.002439 -0.001690 0.001951 0.000979 -0.003012 0.004519 
+0.000838 -0.001930 -0.000168 -0.000823 -0.002500 -0.000529 
+-0.000428 -0.003069 -0.000979 0.000487 -0.002812 -0.000495 
+0.003762 0.001089 0.000485 0.002398 0.004821 -0.003337 
+0.001402 0.004695 -0.002138 -0.000456 0.002070 -0.000074 
+-0.000659 0.000610 -0.002380 -0.001530 0.001284 -0.001776 
+-0.001217 0.002113 -0.000343 0.000006 0.000552 0.000943 
+0.000408 -0.000336 0.000743 0.000916 -0.001419 -0.001006 
+0.002963 0.002732 0.000304 0.000895 0.002130 -0.000579 
+0.000136 -0.000383 0.000079 -0.000932 -0.000208 -0.001264 
+0.003798 0.001962 -0.007534 0.005501 0.001242 -0.001558 
+0.001696 0.000067 -0.000346 0.001649 -0.002015 0.000458 
+0.004206 -0.001508 -0.002857 0.005252 0.001804 -0.004978 
+0.002862 0.003061 -0.003474 -0.002009 -0.000086 0.001310 
+-0.002664 -0.005996 0.004668 -0.004511 -0.006021 0.004904 
+-0.002492 -0.003254 0.004177 -0.000184 -0.002817 0.001308 
+0.000458 -0.000199 0.001684 -0.000325 -0.001260 0.001699 
+-0.000485 -0.000349 0.002154 -0.000822 0.000332 0.000734 
+-0.000604 0.000744 -0.003208 -0.004029 0.001871 -0.002014 
+0.001138 0.002781 -0.004803 -0.002337 0.002152 -0.005905 
+0.001130 0.004322 0.000015 0.002542 0.004887 -0.002986 
+0.000229 0.003915 0.002492 -0.000662 0.001512 0.005010 
+-0.001264 0.001827 0.004181 -0.002941 0.003460 0.001816 
+-0.002002 -0.000270 0.000427 0.000452 0.001214 -0.000253 
+0.000170 -0.000683 -0.000004 0.002118 -0.001660 0.000547 
+0.003109 0.000142 0.000223 0.001652 0.001323 -0.000702 
+0.000300 -0.000311 0.000115 0.000829 -0.002597 0.001440 
+0.000987 -0.002939 0.002369 -0.001873 -0.001103 0.001076 
+-0.003547 -0.001751 -0.000809 -0.002011 0.000736 -0.000515 
+0.000643 0.001859 0.001751 0.002257 0.000446 0.003045 
+0.004219 -0.000125 -0.000063 0.001417 -0.000566 -0.000154 
+-0.003070 0.000598 -0.001595 -0.002746 -0.001919 -0.002693 
+0.000000 -0.003185 -0.000148 -0.003010 -0.002629 -0.000890 
+-0.000456 0.000252 -0.001833 0.000457 0.000166 -0.000407 
+-0.000236 0.000572 0.000478 -0.000698 -0.002014 -0.001448 
+-0.002413 -0.002373 -0.000936 0.000529 0.000043 -0.000235 
+0.000565 -0.000542 -0.000501 -0.000961 -0.000238 0.003365 
+-0.002969 -0.002418 0.003902 -0.005838 0.000225 0.001123 
+0.000848 -0.000070 0.001911 0.001045 -0.000085 -0.001025 
+0.001381 0.000296 -0.002059 0.000128 -0.000027 0.000132 
+0.001132 -0.000641 0.002015 0.000617 -0.001388 0.002138 
+0.001765 0.000176 -0.000470 0.000595 0.000446 -0.003160 
+0.000265 0.002653 -0.005239 0.005660 0.002902 -0.005768 
+0.005456 0.002536 -0.003035 0.000907 -0.000417 -0.000798 
+-0.002050 0.001242 -0.001394 -0.002538 0.001165 -0.004099 
+-0.005652 0.000580 -0.004493 -0.002483 -0.000710 -0.005203 
+-0.001891 -0.002521 -0.000530 0.001298 0.000000 0.000000 
+0.003636 0.002348 -0.003636 0.005254 0.000746 -0.002627 
+0.002212 0.000441 -0.003535 0.001437 0.001362 -0.001866 
+0.001367 0.002660 -0.002526 0.001083 0.001952 -0.001610 
+-0.000960 -0.000960 0.001760 -0.003920 -0.003744 0.000995 
+-0.002098 -0.003041 0.000243 0.001283 0.000153 -0.000233 
+0.002078 0.000561 -0.000649 -0.000533 0.000396 0.001722 
+-0.004308 -0.002066 0.003913 -0.001572 -0.006340 0.004140 
+0.001125 -0.002757 -0.001282 0.002460 -0.000419 -0.002896 
+0.000803 0.004216 -0.002812 -0.000374 0.001345 -0.002167 
+0.001286 0.002184 -0.003547 -0.000578 -0.000064 -0.000663 
+-0.001435 0.001710 -0.002099 -0.000276 0.000522 -0.000450 
+0.001110 -0.000634 0.000026 0.000649 -0.000585 -0.000869 
+-0.000407 0.000681 -0.000561 -0.003132 0.001568 0.000129 
+-0.002858 0.001886 -0.001200 0.001616 -0.000541 -0.001729 
+0.002435 -0.000662 -0.003404 -0.000703 -0.000166 -0.002776 
+-0.000495 -0.000010 -0.001160 0.001001 0.001500 0.000728 
+0.007331 0.001429 -0.002932 0.000170 0.000899 -0.000829 
+0.002463 -0.002316 0.003350 0.003173 -0.002616 0.000209 
+0.000909 0.000195 -0.002273 -0.000559 -0.000719 -0.003876 
+-0.001145 -0.002084 -0.003551 -0.000344 -0.002247 -0.001670 
+0.001155 -0.001470 0.001076 0.002813 -0.000988 0.002933 
+-0.000074 -0.000168 -0.000028 -0.002262 0.000693 0.002400 
+-0.000201 -0.000302 -0.001615 -0.000872 0.001051 -0.000051 
+0.000943 -0.002689 -0.000617 0.000192 -0.002699 -0.000706 
+0.000109 -0.000109 0.000584 -0.000088 0.000447 0.000509 
+0.001243 0.000902 0.000274 0.001862 0.000935 0.000819 
+0.001860 0.000056 0.000740 0.000602 -0.001203 -0.000602 
+-0.002330 -0.002935 -0.001011 -0.001886 -0.005653 0.002832 
+0.002173 -0.002531 0.001280 0.002354 -0.001566 -0.000515 
+0.000251 -0.000937 -0.005232 0.000360 -0.001979 -0.002339 
+0.001351 -0.002341 -0.000434 -0.000741 -0.001693 -0.001217 
+0.000413 -0.000252 -0.000083 0.002709 -0.000299 -0.002925 
+0.002634 -0.003128 -0.000905 0.001765 -0.002500 0.000294 
+-0.000833 -0.000797 -0.000833 -0.001562 0.001320 -0.000902 
+0.000274 0.001228 -0.000370 -0.000152 -0.002530 0.001653 
+-0.000373 -0.003530 0.000706 0.001548 -0.000853 0.002223 
+0.002521 0.000066 0.000581 -0.000108 -0.002021 -0.000335 
+-0.001502 -0.001669 -0.003539 -0.001286 -0.001714 -0.003429 
+0.001210 0.001522 -0.003630 -0.000252 0.000397 -0.000178 
+0.000672 -0.000276 0.000588 -0.001922 0.000277 -0.001438 
+-0.006749 -0.001516 0.002894 -0.006485 -0.003464 0.000833 
+-0.001156 -0.001964 0.000269 0.001868 0.002816 -0.000297 
+0.008050 0.003778 -0.003704 0.008303 0.004581 -0.003770 
+0.003627 0.003676 -0.002072 0.000316 0.000852 -0.000535 
+0.000128 0.001289 0.001486 0.001763 0.003618 0.000230 
+0.003849 0.004687 -0.001087 -0.001419 0.002363 0.000282 
+-0.000368 -0.000126 -0.001555 0.000043 -0.003941 0.003559 
+-0.007075 -0.006647 0.001244 -0.000185 -0.002519 -0.000185 
+0.000344 0.000076 0.000344 0.001231 0.000290 -0.001450 
+0.000153 -0.000637 -0.002122 0.001437 -0.001550 -0.001723 
+0.004055 0.003107 -0.002149 0.004253 0.003232 -0.003776 
+0.000733 0.000419 -0.000595 -0.003985 -0.002068 0.001767 
+-0.003454 -0.000090 0.000971 -0.000100 0.000053 0.000540 
+0.000981 0.002860 -0.001594 0.001934 0.001427 -0.000760 
+0.000392 -0.000692 -0.000578 -0.000459 -0.002347 -0.000736 
+-0.002178 -0.002266 -0.001045 -0.002108 -0.002756 -0.001405 
+-0.001962 -0.001962 0.001000 0.001285 -0.002392 -0.000753 
+0.005733 0.002582 -0.003698 0.001789 0.004448 0.000222 
+-0.003770 0.002880 -0.001331 -0.003229 -0.002895 -0.000267 
+-0.002096 0.000988 0.002409 -0.000982 0.000413 0.001317 
+-0.000799 -0.002979 0.003887 -0.004580 -0.004629 0.005368 
+-0.004400 -0.007415 0.000163 -0.001603 -0.004443 -0.001878 
+-0.000424 -0.000295 -0.000439 0.002959 0.004848 -0.001634 
+-0.000474 0.003751 0.002052 0.001866 0.001407 0.003534 
+-0.000949 0.001725 0.002180 -0.005096 -0.001715 0.002315 
+-0.000756 -0.002504 0.000664 -0.000738 0.000236 -0.002363 
+0.000587 0.001047 0.000340 0.001712 0.000090 -0.000811 
+0.000302 0.000913 0.001347 0.000521 0.000695 0.001860 
+-0.001439 0.001364 -0.000833 -0.001171 0.001794 -0.002535 
+-0.003439 -0.002467 -0.001570 -0.001497 -0.001654 -0.002251 
+-0.001349 -0.000817 0.002452 0.002027 0.001096 -0.000177 
+0.002204 0.003555 -0.002503 0.002273 0.000287 -0.003253 
+0.001017 -0.000597 -0.001801 0.000522 0.000008 0.000026 
+0.000466 -0.000873 0.003839 -0.003511 -0.002977 -0.000611 
+0.000553 -0.001644 -0.001817 0.000956 -0.001544 -0.003603 
+0.002634 0.000172 -0.000616 0.000241 0.001765 0.000575 
+0.000839 0.001116 0.000896 -0.000511 -0.000310 -0.000426 
+-0.001718 -0.002143 -0.001888 0.000162 -0.000216 -0.003651 
+-0.000970 -0.002294 0.000639 -0.002822 -0.000504 -0.000050 
+0.000535 -0.001224 0.002871 0.000317 -0.004585 0.001861 
+0.000661 -0.003942 0.000908 0.001419 -0.002567 0.000146 
+0.002065 -0.000977 -0.000918 0.002239 -0.000448 -0.000448 
+0.000339 0.000095 -0.001927 0.000538 0.000923 -0.000538 
+-0.001246 -0.001636 -0.000805 -0.002937 -0.001237 -0.003093 
+-0.000356 -0.003803 -0.002024 -0.002366 -0.003680 -0.001580 
+-0.001443 -0.000371 -0.001583 -0.001192 0.001265 0.002457 
+-0.000318 -0.000424 0.001061 -0.002063 -0.002673 0.002551 
+-0.001219 -0.005093 0.002917 -0.002533 -0.003016 0.000569 
+-0.000722 0.001075 -0.001545 -0.000515 0.000446 -0.004463 
+0.007729 0.001110 -0.004610 0.004313 0.002623 0.000393 
+0.000540 0.000400 0.000250 -0.001630 -0.001954 -0.002932 
+-0.002717 -0.000418 -0.003615 -0.001581 -0.000113 -0.000465 
+-0.000578 0.000460 0.002242 -0.001266 0.001047 0.001767 
+-0.000886 0.000039 -0.000493 -0.000782 -0.002917 -0.000664 
+-0.000771 -0.002102 0.000066 -0.000822 0.000894 0.000545 
+-0.001752 0.000075 0.000575 -0.002157 0.001010 -0.000550 
+0.000791 -0.000895 0.000423 -0.000598 -0.003268 0.001782 
+0.001328 -0.000562 0.000281 0.000014 -0.000829 0.001026 
+-0.001256 -0.000901 0.001618 -0.003500 -0.001643 0.002024 
+-0.004179 -0.000450 -0.000270 -0.001621 -0.000557 -0.001773 
+-0.000344 -0.003206 -0.002252 0.001803 -0.001797 -0.000906 
+0.000613 0.001373 -0.002598 0.000325 0.002985 -0.001744 
+-0.003561 -0.000619 0.000213 -0.001631 0.001083 -0.000860 
+0.000325 0.000863 0.001838 0.000867 0.000986 0.000958 
+0.004051 0.000798 -0.002332 0.004193 -0.004961 -0.003839 
+-0.002025 0.001876 -0.001442 0.000811 0.004372 -0.001646 
+-0.000548 -0.000772 -0.001594 -0.000168 0.000549 -0.003585 
+-0.002439 -0.006436 -0.000880 -0.006995 -0.007923 0.000464 
+-0.003848 -0.001734 0.003388 0.000750 0.002800 -0.002141 
+0.003939 0.005242 -0.002912 0.000653 0.003865 -0.000952 
+-0.000429 0.001138 -0.000572 0.001680 0.001559 -0.004981 
+-0.001101 0.001664 -0.002733 -0.000231 0.000089 -0.000376 
+-0.001022 0.000606 0.000804 -0.003739 -0.001812 0.002159 
+-0.002871 -0.002238 0.000633 -0.001598 -0.001716 0.001362 
+0.000429 -0.002314 0.002229 0.000013 -0.001696 0.000936 
+0.000114 -0.000487 -0.000883 -0.000818 0.001319 -0.000892 
+-0.000154 0.002560 -0.000205 -0.002183 0.002145 0.000959 
+-0.001867 0.000434 -0.001401 -0.001543 0.001697 -0.003218 
+0.001493 0.001754 -0.003918 0.004421 0.001342 -0.002495 
+0.002776 0.001015 0.000720 -0.000362 -0.000886 0.000504 
+0.001288 -0.002248 -0.000859 0.000418 0.000291 0.000181 
+0.002683 -0.001047 0.000196 0.001755 0.000195 0.001209 
+-0.001495 0.001703 0.002927 -0.003482 -0.002595 0.007094 
+-0.000898 -0.001679 0.004450 0.001802 0.000421 -0.000302 
+0.000000 0.003139 -0.002263 0.002497 0.001665 -0.001791 
+0.000832 0.000119 -0.000526 -0.000361 -0.000180 0.000075 
+0.001179 0.003451 -0.001005 0.000188 0.006242 -0.002556 
+-0.001418 0.001456 -0.000447 0.000494 0.003374 -0.004938 
+-0.000812 -0.000588 -0.001983 -0.000026 -0.003133 0.000704 
+-0.003826 -0.001640 0.002766 -0.001831 -0.002071 0.001786 
+-0.000310 0.000778 0.000776 0.001093 -0.000433 -0.000136 
+0.001935 0.000808 0.000392 0.000932 -0.001338 -0.001707 
+0.001149 0.001162 -0.003472 0.000000 -0.003416 -0.004839 
+0.002726 -0.001336 -0.001840 0.006630 0.003046 0.000776 
+-0.001020 0.006614 0.000495 0.004080 0.000000 -0.000560 
+-0.000674 -0.001248 0.000282 0.000760 -0.003440 -0.000019 
+-0.001119 -0.000560 0.002238 0.000834 -0.000981 0.000434 
+0.002121 -0.001875 0.000962 0.003228 -0.002677 -0.001102 
+0.001980 -0.002981 -0.000750 0.001399 -0.001388 0.000539 
+0.002083 0.000345 0.005381 0.000979 0.000900 0.009899 
+-0.000840 -0.000802 0.010194 -0.001778 -0.000879 0.005753 
+-0.001414 0.000025 0.001389 -0.001734 -0.000269 -0.001599 
+0.000104 -0.001603 -0.000145 0.001699 0.000362 -0.001950 
+0.005055 0.001940 -0.001175 -0.000602 0.000981 -0.001069 
+-0.000340 -0.000368 -0.001205 0.001014 -0.000565 -0.001130 
+0.000452 -0.000632 0.000155 -0.001311 -0.002535 0.000699 
+-0.003964 0.000991 0.003615 -0.001778 0.000128 -0.001217 
+0.000462 -0.001433 0.000271 0.004179 0.001866 -0.003881 
+0.001186 -0.001740 -0.002505 -0.000925 -0.000265 -0.001667 
+-0.000323 -0.001461 -0.002251 -0.000242 0.000993 -0.000194 
+0.004085 0.000628 -0.004397 -0.000499 0.000264 -0.000602 
+0.001361 0.003305 -0.001749 0.006054 0.003098 -0.003576 
+0.005809 0.003252 -0.003589 0.000242 -0.000413 -0.000065 
+-0.000308 -0.000868 0.005934 -0.002083 0.002430 0.000843 
+-0.001382 0.002276 0.002439 -0.000056 0.002227 0.001695 
+-0.000368 -0.000147 0.004412 0.000601 0.001586 0.004181 
+-0.000892 0.003638 0.001854 -0.001671 0.000621 0.000192 
+-0.002376 0.002376 -0.001844 -0.000547 0.001802 0.000110 
+-0.000382 -0.000266 0.000242 0.000930 -0.000543 -0.000853 
+-0.000188 -0.000803 -0.000073 -0.002491 -0.001923 0.004193 
+-0.001226 0.001722 0.003691 0.000195 -0.000390 0.000000 
+-0.002228 0.002978 -0.003838 0.001265 0.006030 -0.006477 
+0.000950 0.002016 -0.005216 0.000479 -0.001902 -0.000956 
+0.000473 -0.002290 -0.000050 0.001727 -0.000658 0.001033 
+0.000238 0.001915 -0.000011 0.001927 0.004254 -0.000647 
+0.003158 0.002102 -0.001064 -0.000308 0.000140 -0.003739 
+0.000421 -0.001264 -0.004545 -0.000525 -0.002881 -0.002761 
+-0.000259 -0.003066 -0.000906 -0.001655 -0.002759 -0.000146 
+-0.000762 -0.003495 0.000577 0.000143 -0.001495 0.001269 
+0.003534 0.000729 0.001151 0.003479 0.003947 -0.001590 
+0.001671 0.000762 -0.003093 -0.001152 -0.003073 -0.003636 
+-0.001411 -0.002279 0.002267 -0.001452 -0.001057 0.003102 
+-0.000730 0.001470 0.002136 -0.001795 0.001455 -0.000146 
+-0.001251 0.000255 0.001847 0.000085 0.001185 0.002426 
+0.003185 0.000247 0.002718 0.002754 -0.001996 0.002070 
+0.003657 -0.001330 0.000166 0.000718 -0.001097 -0.000998 
+-0.000198 0.001798 -0.000771 -0.000093 0.003143 0.001063 
+-0.000191 0.001328 0.002235 0.001920 -0.000599 0.003184 
+0.001734 0.000289 0.003538 -0.000873 -0.001091 0.003534 
+0.000889 -0.001007 -0.000504 -0.001063 -0.000897 0.000819 
+0.002385 0.000466 -0.001041 0.002498 -0.001292 -0.000747 
+0.001135 -0.001025 0.000183 0.001084 -0.002954 0.000553 
+-0.000647 0.000871 0.000880 -0.001123 -0.001101 -0.001543 
+-0.003165 -0.001657 -0.000381 0.000982 -0.002328 -0.000738 
+0.000801 -0.003363 -0.002089 0.002208 -0.000949 -0.001766 
+0.001321 0.001772 -0.003233 0.002935 -0.000185 -0.004124 
+0.000245 0.000015 -0.002436 0.000009 -0.001185 -0.000100 
+0.000059 0.000157 -0.000033 -0.000443 0.000954 -0.000614 
+0.000335 0.000419 -0.002262 0.001691 -0.000062 -0.004090 
+0.004513 0.000802 -0.005043 0.002017 0.004519 -0.005352 
+0.001386 -0.000583 -0.004886 -0.001660 -0.003336 0.000219 
+-0.002975 -0.003071 0.002397 0.000557 0.000036 0.000569 
+0.001305 0.000560 -0.004011 0.000041 0.001070 -0.003697 
+-0.000254 -0.001677 -0.000608 -0.000098 -0.003912 0.001174 
+-0.002667 -0.003236 0.004314 -0.001758 -0.000213 0.003704 
+-0.000491 0.000100 0.000559 0.002477 0.000476 -0.002570 
+0.004407 0.004038 -0.000550 0.004848 0.002235 0.001326 
+0.003759 0.001597 0.000684 0.001061 0.000364 0.000727 
+-0.001390 0.000679 -0.000883 -0.001881 0.001194 -0.002045 
+0.000444 -0.000059 -0.000415 0.004975 0.001430 0.000012 
+0.006958 -0.001313 -0.002870 0.005803 -0.003586 -0.006433 
+0.006475 -0.000098 -0.001354 0.000954 -0.000216 0.000017 
+-0.002605 -0.000257 -0.000715 -0.004422 -0.001116 0.000563 
+-0.001679 0.000089 -0.000620 0.002603 -0.000710 -0.000687 
+0.000479 -0.000677 -0.000708 -0.001453 0.001923 -0.000619 
+-0.000504 0.001759 0.000603 0.001680 0.002191 -0.002250 
+0.000180 0.003008 -0.002705 0.001667 0.007957 -0.002124 
+0.008183 0.008003 -0.005216 0.001606 0.002394 -0.005402 
+0.000007 -0.000144 0.000176 -0.000364 -0.001734 0.002321 
+0.000743 -0.000807 0.000940 0.000409 0.000163 -0.001061 
+-0.000126 -0.000131 -0.000323 -0.000402 -0.001282 -0.000380 
+0.000043 -0.000285 -0.000218 0.002889 0.000556 0.000222 
+0.003244 0.001149 -0.002838 0.003680 0.002880 -0.002880 
+0.001048 -0.001397 -0.003730 0.003292 0.002169 -0.004189 
+0.003440 0.006825 0.001510 -0.000775 0.005710 0.004989 
+-0.001909 0.005024 0.002424 -0.000507 -0.004258 0.001072 
+-0.001308 -0.007547 0.005051 -0.000410 -0.005682 0.003867 
+0.000187 -0.001654 -0.001122 0.001932 0.002574 -0.002576 
+-0.000876 0.001977 -0.003295 -0.001932 -0.001104 0.001765 
+-0.000617 -0.001871 -0.000490 0.000193 -0.003644 -0.003387 
+-0.001645 -0.004554 -0.002086 -0.000184 0.000831 -0.000608 
+-0.003059 0.000763 -0.000572 -0.005530 -0.000626 0.000455 
+-0.004316 0.001210 0.000921 0.001278 0.000060 0.000180 
+0.006566 0.004596 -0.002626 0.003664 0.000463 -0.000741 
+-0.002803 -0.000985 0.002197 -0.003260 -0.001465 0.003022 
+0.000365 0.000072 -0.000130 0.003887 0.000815 -0.001620 
+0.002116 -0.001322 -0.000976 -0.000365 -0.000706 -0.001010 
+-0.000396 -0.000434 0.000680 0.002752 0.000410 0.000468 
+0.005397 0.000570 -0.002940 0.006884 0.001623 0.001217 
+0.005216 0.001616 -0.003544 0.002170 0.002146 -0.002525 
+0.000355 0.000649 -0.001483 -0.000832 0.000502 0.000623 
+-0.000974 0.002206 0.000249 -0.000639 0.002872 -0.000958 
+-0.001232 0.001232 -0.002536 -0.000868 0.001194 -0.003712 
+0.001704 0.001478 -0.005796 0.003951 0.005970 -0.003028 
+0.005094 0.002706 -0.003290 0.002860 -0.001448 0.000941 
+0.002425 0.000040 -0.003260 0.003775 0.001597 0.001161 
+-0.001547 0.000821 -0.002515 -0.000199 0.000348 -0.002782 
+0.000595 -0.000430 0.001000 0.000051 -0.001329 0.000562 
+0.000219 0.000696 -0.000143 0.000805 0.001459 -0.000855 
+-0.000359 0.000144 -0.000733 -0.001838 -0.001546 -0.000209 
+-0.002424 -0.000684 0.001711 0.001730 0.000220 0.000376 
+0.003323 0.001662 -0.002077 0.001916 0.000864 -0.000963 
+-0.000102 -0.002231 -0.000471 0.001892 0.001960 0.001148 
+0.004624 0.002201 -0.001685 0.003364 0.003350 -0.003968 
+0.003084 -0.000063 -0.002602 0.001123 -0.001378 -0.003145 
+0.003612 -0.001101 -0.003465 0.006004 -0.000467 -0.006104 
+0.005716 0.001082 -0.005160 -0.000464 -0.000279 -0.001955 
+-0.002917 -0.002728 0.002971 -0.002847 -0.001603 0.003714 
+-0.000615 0.000084 0.001077 -0.000513 -0.000299 -0.000299 
+0.000700 0.000392 -0.000308 0.001114 0.000644 -0.000198 
+0.001265 0.003046 -0.000938 0.001062 -0.000244 0.000922 
+0.001342 -0.001735 -0.000458 0.000866 -0.000789 -0.000103 
+-0.000505 -0.000597 0.000046 -0.000473 0.000000 -0.000047 
+-0.000163 -0.001742 -0.000952 -0.000301 -0.003483 0.002090 
+0.000630 -0.002999 0.001953 0.000763 -0.000900 0.000753 
+0.001160 -0.000151 -0.000177 0.001203 -0.000902 -0.003759 
+0.000682 -0.002434 -0.004380 0.004223 -0.001173 -0.004261 
+-0.001270 -0.000159 0.000000 0.001189 0.000020 0.002021 
+0.002519 0.000153 -0.002672 0.005105 0.001056 -0.001526 
+0.004441 0.001936 0.000105 0.003025 0.002537 0.000504 
+0.000821 0.001866 0.001866 -0.000545 -0.001940 -0.000091 
+-0.002724 -0.004023 0.003698 0.000548 -0.000043 0.002567 
+-0.000242 0.000099 -0.000813 -0.002109 0.001078 -0.002156 
+-0.002405 -0.001252 -0.002581 0.000016 -0.001540 -0.000889 
+0.001087 -0.000776 0.001489 0.000823 -0.000248 0.001511 
+0.000136 -0.000019 0.000195 0.000516 -0.000451 0.000232 
+0.002932 0.003459 -0.001729 0.000199 0.001294 -0.003333 
+-0.002130 0.000355 -0.002687 -0.002133 0.000853 -0.003259 
+-0.000875 0.000350 -0.003235 0.000730 -0.000912 -0.000912 
+0.001717 0.000990 -0.000870 0.000643 -0.001184 0.000140 
+-0.000421 -0.003763 0.002667 0.001571 -0.003143 0.001984 
+-0.000693 -0.001407 0.000700 0.000547 0.003205 -0.002385 
+0.002227 0.005069 -0.004234 0.002603 0.003170 -0.003887 
+0.002883 0.001400 -0.003134 0.003802 0.003507 -0.003289 
+0.003345 0.006046 -0.004696 0.003393 0.006417 -0.003872 
+0.000287 0.003731 -0.002296 0.001063 -0.000467 -0.000245 
+0.000037 0.000091 -0.000519 0.001543 0.000172 -0.002686 
+0.002821 0.000729 -0.002030 0.001466 0.001771 -0.000382 
+0.000094 -0.000571 -0.000001 -0.001993 -0.000725 -0.001372 
+-0.003774 -0.001288 -0.000738 -0.001071 0.000841 -0.002974 
+0.001983 0.004595 -0.004533 0.004797 0.004392 -0.005675 
+0.001912 0.003070 -0.002693 -0.001120 -0.001061 -0.000650 
+-0.001817 -0.001807 0.000467 0.000759 0.001327 -0.001135 
+0.005107 0.004133 -0.005587 0.005845 0.004608 -0.007447 
+0.003943 0.000994 -0.000888 -0.000316 -0.002337 -0.002060 
+-0.004550 -0.004772 0.003829 -0.005338 -0.001890 0.001120 
+-0.002305 0.000666 0.000748 -0.000326 -0.000069 -0.000008 
+-0.001102 -0.000843 -0.002269 0.000000 0.001917 -0.002000 
+-0.001870 0.002358 -0.001870 -0.001052 0.001050 -0.000631 
+0.000000 -0.000677 -0.000075 0.001003 -0.000476 -0.001479 
+0.000382 0.000229 -0.000534 0.000254 -0.001273 0.000226 
+-0.001555 -0.001879 0.001499 -0.002435 -0.000191 0.001271 
+-0.003740 0.000899 -0.003596 0.000673 -0.001713 -0.002088 
+0.002231 0.000231 -0.002000 0.001429 0.000164 -0.003679 
+0.003498 0.002989 -0.003435 0.002538 0.001393 -0.000100 
+0.000406 0.000481 0.000273 0.000135 -0.001413 -0.000770 
+-0.000852 -0.004612 0.000351 -0.000995 -0.003863 -0.002429 
+0.000087 -0.002780 -0.001416 0.002094 0.000530 -0.001745 
+0.001370 0.002863 -0.001411 -0.000514 0.002561 -0.002554 
+-0.001122 0.001507 -0.000955 -0.000759 -0.000777 0.001085 
+-0.000499 -0.003059 0.000355 0.000400 -0.002401 -0.004198 
+0.000096 0.000669 -0.006194 0.000525 0.001867 -0.003355 
+0.001114 -0.000103 0.000543 0.002667 -0.001002 -0.000333 
+0.005188 0.000725 -0.002594 0.004562 0.004562 -0.003139 
+0.003182 0.001327 -0.002961 -0.000382 -0.001195 0.000730 
+-0.000902 -0.000702 0.002707 0.000287 -0.000100 -0.000607 
+0.000907 -0.001481 -0.002328 0.000000 -0.002889 0.000889 
+-0.002537 -0.002687 0.002985 -0.002518 0.000334 0.001618 
+0.001850 -0.000032 -0.000494 0.004409 -0.000131 -0.002854 
+0.002159 -0.000284 -0.003665 0.000651 0.000309 -0.002052 
+0.001541 0.003082 -0.000246 0.004463 0.000000 0.001240 
+0.000040 0.000472 0.000587 -0.000694 -0.003567 0.000100 
+-0.001118 -0.003869 -0.000860 -0.002518 -0.002409 -0.002299 
+-0.000333 -0.000611 -0.001749 -0.000045 -0.000647 0.000489 
+0.000580 0.001222 -0.000187 0.002126 -0.001440 -0.003498 
+0.001265 0.001203 -0.001741 -0.002648 -0.002665 0.000122 
+-0.004228 -0.003817 0.002057 -0.002203 -0.001101 0.001884 
+0.002600 0.000055 0.000628 0.003621 -0.001127 -0.002494 
+0.004163 0.002802 -0.002681 0.005335 0.003365 -0.002505 
+0.004162 0.004761 -0.001798 0.000974 0.000115 -0.003035 
+0.001286 0.001785 -0.000499 -0.000942 0.002158 -0.002806 
+-0.002128 0.003471 -0.003978 0.002054 0.003989 -0.003869 
+0.000176 0.004967 -0.000802 -0.000441 0.002407 0.000237 
+-0.000397 0.000449 0.000190 -0.000395 -0.000128 -0.000370 
+-0.002566 -0.000859 0.000838 -0.000659 -0.002140 -0.001265 
+-0.000711 -0.003063 -0.002680 -0.003140 -0.004612 0.001537 
+0.001207 -0.002312 0.002003 0.000496 -0.002733 0.001237 
+0.000302 0.000135 0.000403 0.000614 0.000706 0.000113 
+-0.000707 0.002332 0.000042 0.000827 0.002836 0.001142 
+-0.000157 0.004427 0.001005 0.009072 0.004993 -0.000510 
+0.004084 -0.000017 0.001629 -0.000365 -0.002011 -0.003107 
+-0.002855 -0.001427 -0.000611 -0.005333 0.000008 0.004009 
+-0.000730 0.004750 0.002632 -0.002450 0.003851 0.003151 
+-0.000368 -0.002733 0.000530 -0.000705 -0.002523 0.001120 
+-0.000038 0.000038 -0.000379 0.001113 0.003798 0.000278 
+0.002682 0.004365 -0.001703 0.000665 0.002745 -0.000552 
+-0.000420 0.001840 -0.000383 0.000748 0.001591 0.001746 
+-0.000134 -0.001107 0.002652 -0.001102 0.001181 0.001811 
+0.000741 0.000629 0.000999 0.000930 0.000297 0.000085 
+0.000628 -0.001392 -0.000023 -0.000454 -0.003873 0.001688 
+-0.001610 -0.002799 0.001150 0.001071 0.000000 -0.001071 
+0.000168 -0.000674 -0.001684 -0.000602 0.000171 -0.001986 
+-0.001823 -0.001312 -0.001241 -0.001533 -0.003185 -0.000471 
+-0.001688 -0.002917 0.000310 0.000106 -0.001197 0.000528 
+0.000094 0.000199 0.000271 0.000049 0.000049 0.000097 
+0.000825 0.001981 -0.000770 0.000166 -0.000298 0.000991 
+0.001417 -0.001653 0.004265 -0.000896 -0.005804 0.006999 
+-0.002889 -0.006005 -0.002980 -0.000969 -0.001847 -0.002756 
+0.001744 0.001309 0.000544 0.005284 0.000672 0.001785 
+0.002760 -0.001901 0.001042 -0.000038 -0.000189 -0.000379 
+-0.001579 -0.000372 -0.000093 0.000227 0.001212 -0.001439 
+0.001298 0.001527 0.000763 -0.000889 0.002358 -0.000072 
+-0.003534 0.001729 0.000000 -0.002832 0.001742 -0.000405 
+0.000379 0.002879 -0.001439 0.002348 0.002930 -0.003419 
+0.001840 0.001959 -0.002998 0.000458 0.000250 -0.001248 
+0.000522 0.000291 0.000056 0.001978 0.002037 -0.000158 
+0.004369 0.002119 -0.000131 0.002314 0.002428 0.001636 
+0.001329 -0.001363 0.001338 -0.001970 -0.003215 0.002572 
+-0.000675 -0.000116 0.001640 -0.003493 -0.003493 0.000000 
+-0.001898 0.000326 0.000897 0.001150 0.000517 0.001523 
+0.001672 0.003507 0.001254 0.004685 0.000164 -0.003210 
+0.003120 0.000661 -0.000058 -0.000777 0.000826 0.001256 
+-0.002407 -0.001507 0.002857 -0.001084 -0.001223 -0.000057 
+-0.000156 0.002556 -0.002174 0.003498 0.001304 -0.002140 
+0.003258 -0.002025 0.000058 -0.000087 -0.001918 0.004519 
+-0.005154 0.000847 0.001186 -0.006538 -0.005166 0.003444 
+-0.004308 -0.000293 0.002634 -0.001431 0.000477 0.001385 
+-0.002765 -0.001809 0.002313 -0.004037 -0.001529 0.000178 
+-0.002143 -0.001231 -0.000112 0.001378 0.003600 -0.001659 
+0.002654 0.007040 -0.000379 0.002531 0.008632 -0.003965 
+0.000319 0.004608 -0.001948 0.001282 -0.000698 0.001132 
+0.004186 0.001617 -0.000231 0.000620 -0.001953 0.000977 
+-0.001783 -0.001628 0.000000 -0.000961 0.000411 0.000126 
+0.000573 -0.000926 -0.000390 -0.001574 -0.002697 -0.001398 
+-0.002074 -0.000810 -0.000946 0.000851 -0.001372 -0.000734 
+-0.002100 -0.006034 0.000611 -0.004580 -0.003053 0.006107 
+-0.001183 -0.000669 0.006378 0.000224 -0.002085 0.003481 
+0.002455 0.002620 -0.003602 0.001136 0.006420 -0.005284 
+0.000977 0.001429 -0.003383 -0.000288 -0.003172 0.003316 
+-0.002443 -0.007072 0.005304 0.001031 -0.005725 0.001031 
+0.001349 -0.002397 0.002323 0.000072 -0.001014 0.001522 
+0.000567 0.000567 -0.000284 0.001549 0.001162 0.000426 
+0.001939 -0.001871 0.001085 0.003569 -0.004594 0.002240 
+0.003118 -0.004158 0.004545 0.000893 -0.001530 0.003123 
+-0.001024 0.000000 0.001417 -0.000907 0.001590 0.001779 
+-0.000033 0.001901 0.001527 -0.000220 0.000572 0.000641 
+-0.000797 0.001565 -0.003073 0.000555 0.000395 0.000505 
+0.000360 -0.000928 -0.001046 -0.000176 -0.001032 -0.002357 
+-0.002667 0.001333 -0.000222 -0.009556 -0.004667 0.002444 
+-0.010162 -0.003346 0.003408 -0.003759 -0.002962 0.005278 
+0.000626 -0.001050 0.000761 0.000635 -0.001546 -0.000619 
+0.000667 -0.001709 -0.000917 0.001440 -0.001142 -0.001150 
+0.002515 -0.001264 0.000177 0.000344 -0.001158 0.000091 
+-0.000031 0.000062 0.000692 -0.001168 0.002040 0.001798 
+-0.004559 0.001127 0.001312 -0.004714 -0.002221 -0.001341 
+-0.000494 -0.002830 -0.002561 0.000763 0.000000 0.000763 
+0.002882 -0.000552 0.000154 0.001080 -0.000663 0.000944 
+-0.001235 0.000176 0.002756 -0.001900 -0.003717 0.002150 
+0.000161 -0.000522 -0.000804 -0.002097 0.001138 -0.002008 
+0.002898 0.002197 -0.000591 0.002110 -0.001723 -0.000156 
+0.001778 -0.003942 0.001182 0.003505 -0.003064 -0.000437 
+0.005677 0.002378 0.000046 0.004806 0.003653 -0.002240 
+0.001295 0.000716 -0.001760 -0.002624 -0.000895 -0.002089 
+-0.002086 -0.004093 0.001122 -0.000361 -0.002126 0.002203 
+-0.000886 -0.000347 0.002042 -0.001971 0.000265 -0.000240 
+-0.003247 0.000439 -0.000068 -0.002362 -0.000630 -0.000157 
+-0.000342 -0.001727 -0.001313 -0.000476 -0.002143 -0.003095 
+0.003034 0.000469 -0.003792 0.002973 0.000615 -0.001572 
+-0.001263 -0.000628 -0.000836 -0.004621 0.000039 0.000276 
+0.008155 0.003561 -0.006554 0.007932 0.003712 -0.006662 
+0.002823 0.001389 -0.004884 0.000337 0.003923 -0.001686 
+0.001788 0.002399 -0.005081 0.009125 0.005012 -0.006982 
+0.010134 0.004084 -0.007512 0.005240 0.001846 -0.003990 
+-0.000477 -0.000716 0.000310 -0.001787 -0.002756 0.003984 
+-0.003657 -0.002745 0.004265 0.001513 -0.001397 0.000303 
+0.004792 0.001880 0.001327 0.006165 0.003485 -0.001493 
+0.004736 0.001380 -0.001948 0.002574 -0.002334 -0.001000 
+0.002595 -0.002264 -0.001069 -0.000152 -0.000848 0.001697 
+-0.000786 -0.002451 -0.000121 -0.000047 -0.001007 -0.000186 
+-0.000764 -0.000141 0.000509 -0.002495 -0.000175 -0.004276 
+-0.001876 -0.000293 -0.004670 -0.000184 0.000244 -0.000050 
+-0.000493 0.000021 -0.000112 -0.001850 -0.001008 -0.000057 
+-0.001430 0.000559 -0.001878 -0.000860 0.003741 0.000711 
+-0.004487 0.001500 0.001490 0.001290 -0.000484 0.001774 
+-0.000258 0.001361 0.002868 0.000155 -0.000220 -0.000125 
+0.000961 -0.000549 -0.000504 0.000072 0.000072 0.001087 
+-0.000130 -0.001681 0.001356 0.000030 -0.001955 0.000060 
+-0.004060 -0.001805 0.000000 -0.003534 -0.000150 0.001805 
+-0.000738 0.001186 0.002438 0.000625 0.000781 -0.000234 
+0.001546 0.002344 -0.000258 0.003236 0.002211 0.000148 
+0.001705 0.000930 0.000233 -0.002667 -0.002403 0.001333 
+-0.000252 -0.004580 -0.001262 -0.003026 -0.001748 -0.003317 
+-0.000078 0.000063 0.000016 0.000941 0.002983 -0.000591 
+0.000905 -0.004077 0.001244 0.002060 -0.006081 -0.001415 
+-0.002997 -0.000959 -0.000689 -0.000138 0.000643 -0.000323 
+-0.000356 0.000835 0.000332 0.001555 0.001674 0.002248 
+0.002870 0.004240 -0.002327 0.001037 -0.000400 -0.000800 
+-0.000296 0.000029 -0.000301 -0.000135 -0.001352 0.000450 
+0.000314 -0.000242 0.000449 0.001924 0.000758 0.000894 
+0.001813 0.000952 -0.001575 -0.000144 -0.001209 0.000662 
+-0.000056 -0.000835 0.001335 0.002555 0.000252 -0.000555 
+0.003187 -0.001058 -0.002344 0.000350 -0.002579 -0.001895 
+-0.001098 -0.001234 -0.001467 -0.000538 -0.001085 -0.001264 
+-0.002239 -0.001343 -0.001343 -0.000025 -0.003308 0.003359 
+-0.002928 -0.003616 0.002608 -0.002063 -0.001981 0.000834 
+0.001026 0.000577 -0.000780 -0.000904 -0.001401 -0.002779 
+-0.001557 -0.001399 -0.001710 -0.003299 -0.001242 -0.000343 
+-0.000356 0.000091 -0.001337 0.002420 0.000385 -0.000909 
+0.003419 -0.000266 -0.001926 -0.001661 0.000392 0.001538 
+-0.001335 0.001772 0.005478 -0.001614 0.004428 0.002776 
+-0.000866 0.000282 0.003777 -0.004741 -0.005640 0.003223 
+0.000672 -0.002340 0.007073 -0.003805 0.001746 0.006362 
+-0.000042 0.002091 -0.001500 0.002178 0.004748 0.001194 
+0.001326 0.002744 0.000480 -0.000822 0.002443 -0.000164 
+0.002445 -0.000027 -0.001264 0.001735 0.001573 -0.001855 
+-0.002868 -0.000622 0.000166 -0.006780 -0.002713 0.000399 
+-0.004599 -0.002178 0.000242 0.001429 0.000614 -0.000366 
+0.004231 0.002743 -0.001802 0.002463 0.002313 -0.001343 
+0.000170 0.001614 -0.001317 0.000752 -0.001504 -0.004211 
+0.003562 0.000243 -0.002875 0.002224 0.000317 -0.000327 
+0.000532 0.000282 0.000296 0.002399 0.000225 0.000043 
+0.004362 0.001002 0.001674 0.003298 0.003556 0.002759 
+0.001646 0.002923 0.000380 -0.000218 -0.002529 0.002011 
+-0.002993 -0.002343 0.002856 -0.003250 -0.001424 -0.000120 
+-0.003701 -0.001083 -0.001855 -0.003100 -0.000209 -0.002421 
+-0.002304 -0.000162 -0.001298 -0.000490 -0.000641 -0.000274 
+0.002901 -0.000804 -0.002021 0.004374 -0.002079 -0.003954 
+0.001991 -0.001517 -0.004313 -0.000589 0.001036 -0.001113 
+-0.003349 0.001188 0.002066 -0.002923 0.000186 0.003532 
+-0.001065 -0.000202 0.002687 -0.000660 0.000170 0.002018 
+-0.000727 0.000252 0.000649 0.002125 0.004084 0.001035 
+-0.001073 0.002203 0.000057 0.000652 0.002500 -0.002283 
+0.000985 0.002500 -0.000985 0.001849 0.000084 -0.000261 
+0.000715 -0.001229 0.007119 -0.001173 0.004357 0.005975 
+0.001144 0.004005 -0.002258 -0.003029 0.003234 -0.004578 
+-0.002055 0.002224 -0.004057 0.000942 0.000646 0.000052 
+0.001434 0.000011 -0.001200 0.000452 0.001180 -0.001622 
+0.000997 -0.000487 -0.000294 -0.000308 -0.001272 0.002589 
+-0.000882 -0.000782 -0.002471 -0.003042 -0.000567 -0.001392 
+0.002495 0.000612 -0.001900 -0.000229 0.004149 -0.001238 
+-0.000740 0.000087 -0.000344 -0.001286 0.000198 0.000003 
+0.000300 0.000715 -0.001750 0.001708 0.000934 -0.004145 
+0.001421 0.000277 -0.002166 -0.000856 -0.000819 0.001345 
+-0.001026 -0.001477 0.000857 0.000583 0.000573 0.001203 
+-0.000050 -0.000471 0.000563 0.001927 -0.004091 0.001487 
+-0.002547 0.000661 0.006172 -0.005115 0.001590 0.005947 
+-0.007250 0.001002 -0.000926 -0.003178 0.000109 0.002092 
+0.001669 0.002458 0.001249 0.002801 0.002237 0.000683 
+0.000057 -0.000752 0.001113 -0.002429 0.000093 0.004252 
+-0.000731 0.000266 0.004107 0.004462 0.001375 0.000597 
+0.000161 0.004954 0.001920 -0.000106 0.005028 0.000523 
+-0.000944 0.000730 -0.001467 -0.001302 -0.003362 -0.000900 
+0.000006 -0.002614 -0.000740 -0.000945 -0.000032 -0.000536 
+-0.001716 0.001493 -0.002463 -0.003108 0.001769 -0.001554 
+-0.000281 0.000317 0.000164 0.000444 -0.001053 -0.000499 
+0.000990 -0.002664 0.000896 0.000197 -0.000926 0.001163 
+-0.000506 -0.000268 -0.002176 0.001141 0.000243 -0.002955 
+-0.000214 -0.000371 0.000108 -0.002390 -0.000022 0.000782 
+0.002126 0.000394 0.001339 0.004602 0.003681 0.000625 
+0.001678 0.002847 -0.002018 0.002316 -0.000054 -0.001939 
+0.002726 0.001234 -0.001197 0.000792 0.001378 -0.001653 
+-0.001059 -0.001791 -0.002303 -0.003858 -0.000529 -0.001851 
+-0.004000 0.001333 -0.000388 -0.003031 0.000835 -0.000199 
+-0.001054 -0.000844 0.000075 -0.000086 -0.001395 0.000214 
+0.000888 0.000540 -0.000915 -0.001236 0.004185 -0.002910 
+-0.001453 0.003359 -0.002906 0.003693 -0.001211 0.001245 
+0.004344 0.002082 0.000228 0.003327 0.000951 0.001628 
+-0.000423 0.001462 0.000423 -0.002522 -0.001136 0.002827 
+-0.003537 -0.001632 0.003357 0.000257 0.000768 0.001364 
+0.002468 0.000876 0.001831 -0.000714 0.002929 -0.001429 
+0.000456 0.001977 -0.003609 -0.000714 -0.001607 -0.000709 
+-0.003629 -0.003629 0.001210 -0.003022 -0.001374 0.003160 
+-0.004270 0.002832 -0.001372 -0.001519 0.000650 0.000953 
+0.001081 0.006132 -0.005102 0.005573 0.002775 -0.002746 
+0.006740 0.000975 -0.001330 0.002212 0.002669 -0.003763 
+0.001899 0.000147 -0.003050 0.000690 -0.004923 -0.000220 
+0.000439 -0.005377 0.003688 -0.002747 -0.001750 0.003248 
+-0.002886 0.001785 -0.001878 -0.001484 0.003838 -0.002960 
+-0.000864 0.003658 -0.003172 0.003457 0.002101 -0.004158 
+0.000846 0.002306 -0.001499 -0.000251 0.000576 -0.000175 
+-0.000234 -0.001764 0.000796 -0.001071 -0.001688 -0.000461 
+0.000763 -0.000820 0.000343 0.002370 0.000148 -0.003037 
+0.001357 0.000973 -0.008268 -0.001628 0.004566 -0.006901 
+-0.000722 0.000685 0.000613 -0.000979 0.001123 -0.001765 
+-0.000655 -0.000358 -0.002602 0.002997 0.000152 -0.004367 
+0.002740 0.002221 -0.004701 0.001230 0.002758 -0.002609 
+-0.003807 0.000401 -0.002454 -0.002673 0.002014 -0.000500 
+0.001837 0.002389 -0.001275 0.003247 -0.000033 -0.004022 
+0.000393 -0.001378 -0.000723 0.001571 -0.000407 0.000570 
+0.001189 -0.001141 -0.000339 0.001631 -0.000109 0.000627 
+0.001979 0.000731 0.002903 0.001805 -0.001245 0.002178 
+0.002274 -0.000948 0.000733 0.003467 -0.001871 0.000562 
+0.005966 -0.002351 -0.002003 0.004147 -0.000122 -0.005177 
+0.002517 0.000918 -0.003136 0.003865 0.000717 -0.000426 
+0.001274 -0.001279 0.000008 -0.002384 -0.002206 0.002086 
+-0.006507 -0.000390 0.001979 -0.005453 -0.000649 0.002532 
+-0.001071 -0.000153 0.001072 0.000329 0.001666 0.001291 
+-0.000622 0.001782 0.001005 0.000438 0.000802 0.000985 
+0.003964 0.001169 -0.000173 0.005176 0.000426 -0.001985 
+0.003953 -0.001882 -0.001317 0.001408 -0.001599 -0.002637 
+0.001068 0.000577 -0.001351 0.000819 0.002418 0.000831 
+0.000653 0.001061 -0.001633 0.001711 -0.000439 -0.004387 
+-0.000618 0.000518 -0.005466 0.004521 -0.001544 -0.006286 
+0.002528 0.005642 -0.003290 0.000868 0.002952 0.000062 
+0.000023 0.001602 0.000520 -0.001086 0.000968 0.000859 
+-0.001481 0.002471 -0.003295 -0.000739 0.001780 -0.000390 
+0.000175 -0.001228 -0.001957 -0.000080 -0.002143 -0.001811 
+0.001951 0.002064 -0.004242 0.000474 0.003597 -0.002556 
+0.001336 0.002239 -0.001697 0.000040 0.000345 0.003028 
+-0.001128 0.001317 0.003293 0.000120 -0.005504 -0.001053 
+-0.000059 -0.001814 -0.001338 -0.001389 0.001858 0.000243 
+-0.001971 0.001772 -0.001574 0.003654 0.001732 -0.002070 
+0.006367 0.002033 -0.001171 0.005936 0.000402 -0.001358 
+0.000999 -0.000395 -0.000745 -0.002837 -0.002939 0.003619 
+-0.003207 -0.006783 0.007483 -0.005398 -0.004071 0.000442 
+-0.000368 0.000141 -0.000003 0.001293 0.003450 0.001227 
+0.000500 0.005750 -0.001250 -0.000311 0.002101 -0.004119 
+0.000873 -0.001091 -0.000499 -0.001916 -0.002846 0.001040 
+0.000748 0.000564 0.000600 0.001353 -0.000199 0.001711 
+-0.000273 0.000069 0.000090 -0.002005 -0.000820 0.000809 
+0.000716 -0.000026 -0.000474 0.000362 0.003736 -0.004819 
+-0.003365 -0.000789 0.000816 -0.004033 -0.000181 0.002589 
+0.001072 -0.000036 0.000741 0.003642 -0.001135 0.003358 
+0.003167 -0.000396 -0.005806 0.005147 0.002104 -0.007017 
+0.002086 0.001293 -0.004276 0.000301 -0.002731 0.001290 
+0.000166 -0.004665 0.000562 0.001142 -0.001781 -0.000289 
+0.002955 0.001304 -0.002582 -0.001397 0.003413 -0.003632 
+-0.001482 0.002056 -0.001034 0.000194 -0.000018 0.000192 
+0.002007 0.000042 0.000314 -0.000656 -0.000326 0.001813 
+0.000013 -0.002379 0.002474 0.000261 -0.000667 0.000278 
+0.001082 -0.000944 -0.000420 0.001921 -0.001643 -0.002277 
+0.000842 -0.002162 -0.003356 0.001429 -0.000686 -0.002076 
+0.001415 0.000267 -0.002324 0.000086 0.005709 -0.003692 
+0.002190 0.004011 -0.005106 0.002501 0.001395 -0.000225 
+0.002659 0.000310 0.000169 0.002344 0.001389 -0.003723 
+-0.000988 0.000018 -0.004802 0.001198 0.000322 0.000407 
+0.002815 0.001489 -0.000911 0.003694 0.000518 -0.001334 
+0.005964 0.002941 0.000745 0.008631 0.007520 -0.003205 
+0.002359 -0.001887 -0.004526 -0.000072 -0.000669 -0.002967 
+-0.000376 0.001504 0.000602 -0.000715 0.000498 -0.000575 
+0.001278 -0.001220 -0.000650 0.001899 -0.001892 0.000296 
+0.000405 -0.001256 0.000292 0.000681 0.001361 0.001157 
+-0.000871 0.003173 0.004211 0.000272 0.002453 -0.000318 
+-0.000099 0.000224 0.000461 -0.000532 0.000443 -0.000281 
+-0.001344 -0.000483 -0.001559 -0.002348 0.000694 -0.001258 
+-0.001409 0.000940 -0.000671 0.000882 -0.001544 0.000630 
+0.000625 -0.002014 0.002431 0.000115 -0.000111 -0.000514 
+0.000282 -0.000476 -0.000585 -0.002008 -0.000825 -0.001865 
+-0.007128 -0.004871 -0.000218 -0.005197 -0.002766 0.000790 
+0.002003 0.001930 -0.000740 0.006846 0.006842 -0.003912 
+0.007760 0.006446 -0.002587 0.001336 0.004008 -0.002541 
+-0.000242 0.000726 0.000000 0.001985 -0.001148 0.003176 
+0.000862 -0.002586 0.000862 0.000167 -0.002783 -0.000033 
+0.000891 -0.002161 -0.000757 0.001811 -0.000206 0.001146 
+0.001369 0.000585 0.001979 0.000112 0.000284 0.000576 
+-0.000062 0.000436 -0.001704 -0.001037 0.000519 -0.001037 
+-0.000128 0.000411 0.002544 -0.000166 -0.001561 0.003533 
+0.000670 -0.000357 0.000522 -0.000963 0.000775 -0.000710 
+-0.001609 0.000703 0.001312 -0.002193 -0.002794 -0.001041 
+-0.002384 -0.003386 0.004870 -0.004067 -0.003135 0.003347 
+-0.001983 -0.001105 0.000956 0.003163 0.001099 0.000697 
+0.002976 0.000428 0.002554 -0.000720 0.000720 -0.002119 
+-0.002707 0.000285 -0.002422 -0.002598 -0.002426 -0.004653 
+0.000986 -0.003347 -0.000755 0.004758 -0.000219 -0.001667 
+0.003834 0.002307 -0.003177 0.000381 0.002683 -0.001907 
+0.000165 -0.000497 0.000576 -0.000584 -0.004621 0.001610 
+-0.001595 -0.005298 0.004282 -0.000804 -0.004914 0.003733 
+-0.001682 -0.002405 0.002843 -0.000700 0.000212 0.001588 
+-0.000603 0.002397 -0.001810 0.002225 -0.000312 -0.000097 
+0.004829 0.001116 0.001491 0.004467 0.002641 0.003747 
+0.001753 0.002941 0.003426 0.000161 0.001022 0.001850 
+0.000374 -0.000560 0.000857 0.000148 -0.001704 0.000466 
+-0.001212 -0.002079 0.000739 -0.001150 -0.001044 0.000719 
+0.000709 0.000473 -0.000304 0.002478 0.001540 -0.003440 
+0.004086 0.000411 -0.003649 0.003710 -0.001446 -0.002883 
+0.002917 -0.001459 -0.000150 0.004511 0.000872 -0.000436 
+0.005113 0.000090 -0.000271 0.001506 0.002593 0.000070 
+-0.000989 -0.001557 -0.001917 0.002500 0.000485 0.003877 
+0.001116 0.005073 0.012764 0.010282 0.001690 0.023991 
+0.007241 -0.005388 0.020433 0.001842 -0.007176 0.007822 
+-0.004820 -0.004931 -0.001136 -0.003408 0.002393 0.005696 
+-0.004308 0.001685 -0.001444 -0.001595 0.002194 -0.003230 
+-0.000339 -0.001069 0.000557 -0.000349 0.001264 0.002440 
+0.001171 -0.001028 0.002676 -0.000143 0.000171 -0.000229 
+0.000161 0.000216 -0.002588 -0.000075 0.001265 -0.000969 
+0.004077 0.002913 -0.001605 0.001764 0.000709 -0.000601 
+-0.002752 0.000543 0.002752 -0.004308 0.000000 0.000462 
+0.001240 0.001395 -0.002636 0.006200 -0.001157 -0.002996 
+0.005208 -0.001224 -0.004583 0.001641 0.003828 -0.001094 
+-0.000714 0.001508 0.000794 0.001077 0.000621 0.002490 
+0.003627 -0.000695 0.002634 0.003186 -0.000372 -0.000743 
+0.000000 0.000348 -0.005043 -0.002239 0.000379 -0.005398 
+-0.001861 0.000520 -0.002300 -0.000843 0.000975 0.000151 
+-0.001343 -0.000069 0.000046 -0.000955 0.000835 0.000758 
+-0.000020 0.000540 0.002522 -0.002490 -0.001187 0.004031 
+-0.002448 -0.002226 0.001447 -0.001488 -0.001011 0.001415 
+-0.000744 0.000187 0.000498 0.000363 -0.001584 -0.001137 
+0.002513 -0.000491 -0.000271 0.000894 0.001309 -0.000669 
+0.000194 0.000167 -0.000893 -0.002947 0.000324 0.001451 
+-0.003796 0.000635 0.002534 0.000782 0.002639 0.001134 
+-0.001534 0.006847 -0.003452 0.004702 0.005884 -0.003529 
+0.002361 0.001858 -0.002447 -0.000846 -0.000117 0.000407 
+-0.000561 0.000212 0.000096 0.000237 -0.000102 -0.000448 
+0.002014 -0.000544 0.003420 0.003523 -0.004523 0.003248 
+-0.000471 -0.007409 0.007518 -0.001341 -0.003098 0.011073 
+0.001085 0.000800 0.004570 -0.000136 -0.003154 -0.000680 
+0.000744 -0.000606 -0.005817 0.004045 0.002586 -0.005393 
+0.003130 0.005739 0.001304 0.002700 0.005485 0.003215 
+0.002490 0.001856 0.003063 0.001189 -0.002781 0.001496 
+-0.002318 -0.004027 0.002057 -0.002185 -0.001371 0.001490 
+0.000803 0.000182 -0.000636 0.002097 0.000572 -0.005942 
+0.000799 0.003487 -0.008208 0.002016 0.003097 -0.002463 
+0.001433 -0.000794 -0.001455 -0.001372 -0.001835 -0.000120 
+0.001232 -0.001865 -0.000323 0.003012 -0.001548 0.004034 
+-0.001385 -0.003757 0.006195 -0.001596 0.000884 -0.002513 
+-0.006824 0.002964 -0.011713 -0.001172 0.001126 -0.002347 
+0.013426 -0.003447 0.022699 1.312169 -0.804233 4.322752 
+1.297030 -0.950495 4.470297 0.016517 -0.011584 0.019047 
+0.002769 -0.005411 0.001685 -0.001705 0.001356 -0.004683 
+-0.000101 0.000270 -0.002540 -0.000763 -0.000251 0.000585 
+-0.001892 0.000547 0.002633 -0.000846 -0.000484 0.004845 
+-0.000780 -0.002043 0.003264 -0.001609 -0.001073 0.001448 
+0.000000 0.000105 -0.000026 0.003366 0.001700 0.002925 
+0.002037 0.001406 0.005551 0.000370 0.000389 0.004333 
+-0.000528 -0.000473 0.004866 -0.004214 -0.001306 0.005155 
+-0.001942 -0.002521 0.001192 -0.000278 -0.000174 -0.000191 
+0.005213 0.001100 -0.002195 0.003662 0.003707 -0.004162 
+0.001069 0.005988 -0.005746 -0.002294 0.001468 -0.002110 
+0.004623 -0.000264 -0.000132 0.001498 -0.001346 -0.001621 
+0.000268 -0.000439 -0.002051 -0.001773 0.000194 -0.004571 
+-0.002190 0.000306 -0.003576 -0.002220 0.000419 -0.000142 
+-0.004123 -0.000817 0.003977 -0.003250 -0.002407 0.003370 
+0.000832 -0.003838 0.003338 0.001812 -0.004831 0.005837 
+-0.005596 -0.001721 0.004092 -0.004659 0.001199 0.004204 
+0.000483 0.003333 0.002617 0.005000 0.005417 -0.005000 
+0.003740 -0.002864 -0.001188 -0.002771 -0.003161 -0.000327 
+-0.006898 -0.005171 0.006893 -0.007057 -0.000706 0.009398 
+-0.003539 -0.000487 0.005065 0.000648 0.002257 0.000195 
+0.002757 0.001485 -0.002479 0.000055 0.001880 -0.002046 
+-0.001204 0.002410 -0.000318 -0.001087 0.002757 0.000684 
+-0.000053 0.001792 -0.000129 0.000853 0.001258 -0.002185 
+0.001766 0.002152 0.001049 0.004788 -0.000344 -0.001309 
+0.002985 -0.001425 0.000717 -0.001789 0.000670 0.001170 
+-0.005853 0.000293 -0.000990 -0.003899 0.000367 -0.001554 
+0.000009 -0.000313 -0.001223 0.002040 0.001618 -0.000492 
+0.000751 0.000352 0.002264 0.001731 0.000961 0.002994 
+0.003809 -0.002581 0.003491 0.003032 -0.001852 0.003916 
+0.000925 -0.000351 0.002594 -0.000815 0.000395 0.000474 
+-0.000553 0.000489 0.000331 0.002849 0.000404 -0.001436 
+0.002016 0.005375 -0.004265 -0.000218 0.000327 -0.002340 
+-0.001324 -0.001339 -0.000506 -0.002921 -0.004539 0.000357 
+-0.001463 -0.002319 -0.000220 -0.000457 0.000651 -0.000587 
+-0.003687 0.003476 0.000314 -0.004023 0.006018 -0.002805 
+-0.001670 0.004458 -0.008040 0.005202 0.000383 0.001754 
+0.000485 -0.001427 0.023882 -0.001359 0.008365 0.031307 
+0.701219 -0.792683 3.890244 0.010118 0.004416 0.024387 
+0.000618 0.000006 0.006200 0.002005 -0.003206 -0.001936 
+0.001228 -0.001566 -0.004449 0.004549 0.002340 0.000491 
+-0.000532 0.002417 -0.001122 -0.001142 0.002489 -0.001950 
+0.001589 0.001569 0.000014 0.003014 -0.000820 0.002026 
+-0.000124 0.000745 0.003778 -0.000210 0.001238 0.001746 
+-0.002297 0.001088 0.000080 -0.004460 0.000842 -0.001500 
+-0.004433 0.000025 -0.002167 -0.003188 -0.002545 0.000839 
+0.000240 -0.002658 -0.000082 -0.001441 -0.002018 -0.000741 
+-0.004000 0.001118 -0.000671 -0.001064 0.001765 0.001364 
+0.001070 0.000004 -0.002346 -0.001058 0.000486 -0.006849 
+-0.000847 0.003850 -0.003927 0.003284 -0.000326 -0.005136 
+0.000397 -0.000530 -0.001255 -0.000446 0.000025 0.002625 
+-0.001138 0.001816 0.001525 -0.001495 0.000830 0.000051 
+0.000752 0.000152 -0.000856 0.000773 -0.005022 0.003284 
+-0.000769 -0.012908 0.007745 -0.006499 -0.008969 0.010402 
+-0.004981 -0.006574 0.002741 -0.001154 -0.000692 0.000000 
+-0.000265 0.003016 0.002387 0.001114 0.002655 0.001778 
+0.001422 -0.001990 -0.004549 -0.001621 0.000126 0.001328 
+-0.003460 -0.005154 0.003636 0.001781 -0.002414 0.002370 
+0.000404 -0.000439 0.000045 0.000574 0.002244 -0.002675 
+-0.002984 0.000000 -0.003629 -0.002087 0.000296 -0.001233 
+0.000645 0.002419 0.001244 0.004800 0.001449 -0.000905 
+0.000780 0.002452 -0.002111 0.000794 0.000360 -0.002852 
+0.000394 -0.001596 -0.003197 0.001075 -0.001882 -0.004839 
+0.001417 -0.001712 -0.004014 -0.002880 -0.000400 -0.002502 
+-0.006223 0.001056 -0.001861 -0.005214 0.000712 -0.001655 
+0.001390 0.002336 -0.002721 -0.000686 0.001549 -0.000272 
+-0.001595 -0.000383 0.005053 -0.003739 -0.000944 0.007054 
+-0.001866 -0.000115 0.004566 -0.000008 -0.000848 0.001713 
+-0.000083 0.000521 0.001193 -0.003058 -0.001156 -0.001496 
+-0.003721 -0.000941 -0.001338 0.000167 0.002443 -0.000585 
+-0.001226 0.002453 -0.001168 0.001754 -0.001096 0.000000 
+-0.000149 -0.001790 -0.000320 -0.001049 -0.000320 0.000880 
+-0.002375 0.000673 -0.001124 -0.001244 0.000523 -0.001102 
+-0.001424 0.006145 -0.000255 0.002172 0.007688 -0.006156 
+0.004312 0.011156 -0.016470 0.002589 0.006209 -0.015264 
+-0.001692 -0.001926 0.006725 -0.003810 -0.003786 0.016469 
+-0.001447 -0.003389 0.013029 0.001322 -0.001039 0.005744 
+0.000833 -0.000423 0.003182 0.002923 -0.001154 0.002538 
+0.004748 -0.000916 0.001083 0.005444 0.002040 0.000724 
+0.002360 0.001608 0.001228 -0.001022 -0.000411 0.000721 
+-0.002550 -0.003943 0.000697 -0.002556 -0.000093 -0.000155 
+-0.000388 -0.000426 -0.000940 -0.000363 -0.001199 -0.001149 
+-0.000635 -0.000723 -0.001012 -0.001549 0.000492 -0.001135 
+0.000068 0.001954 0.000257 -0.001554 0.003895 -0.006019 
+-0.003171 0.003664 -0.006260 -0.001329 -0.001644 -0.001982 
+0.002063 0.001737 -0.006947 0.001335 0.001245 -0.003157 
+0.000311 0.000300 -0.000255 -0.001219 -0.001302 -0.000829 
+-0.001700 -0.001728 -0.005268 0.000895 -0.001253 -0.007778 
+-0.001610 -0.002751 -0.003648 -0.003811 0.000246 0.002829 
+-0.001851 -0.001268 0.008617 -0.003691 -0.002897 0.004085 
+0.002083 -0.000127 -0.000373 0.005208 -0.002143 0.000237 
+0.005491 -0.004866 0.000774 0.003842 -0.003115 0.005518 
+0.002981 0.001585 0.003037 0.000765 0.000837 0.002053 
+-0.001799 0.000909 0.000814 -0.003163 -0.007022 0.005977 
+0.000026 0.001653 -0.002942 0.003560 -0.001264 -0.002254 
+0.001359 -0.003295 -0.000012 -0.000507 -0.003077 -0.001829 
+-0.002585 -0.001138 -0.005171 -0.003101 0.002280 -0.001869 
+-0.001745 -0.000843 0.005205 0.000781 -0.003125 0.008240 
+0.000525 -0.003675 0.005917 0.000347 -0.001098 0.000101 
+0.000599 0.001382 0.000020 -0.000513 -0.000193 -0.000089 
+0.000472 -0.000075 -0.001203 0.001781 -0.004246 -0.002603 
+-0.002381 -0.002048 0.000017 -0.000175 -0.000065 0.000454 
+-0.001031 -0.001366 -0.001255 -0.002505 0.000598 -0.001059 
+-0.003261 0.000278 -0.005517 -0.000964 0.001500 -0.003386 
+-0.000708 0.001247 0.002291 -0.000219 0.002847 0.001314 
+0.000622 0.002602 0.000399 0.000547 0.001406 0.000312 
+-0.002547 0.000180 0.000759 -0.001035 0.000250 0.006110 
+-0.000458 0.003377 0.002844 0.001539 0.003924 -0.000121 
+0.001258 0.003373 -0.002231 0.002898 -0.000006 0.000829 
+-0.000071 -0.003287 0.000833 0.000214 -0.001788 -0.003449 
+-0.003656 0.002342 -0.012900 0.000141 0.009153 -0.007670 
+0.005130 -0.002433 0.005205 0.008096 -0.002959 0.013715 
+0.007935 -0.003450 0.013761 0.007596 0.003382 0.000766 
+-0.004507 0.007915 -0.024921 -0.006397 0.011061 -0.006377 
+0.000408 0.001182 0.001061 0.003825 -0.001505 0.000292 
+0.001314 -0.002921 0.002524 0.000873 0.001903 0.003508 
+0.001761 -0.003606 0.000240 0.001304 -0.000696 0.000221 
+0.000094 -0.001053 0.000368 -0.003477 -0.001229 0.001634 
+0.000338 -0.003985 -0.001148 0.004917 -0.002791 0.001414 
+0.005274 -0.000830 0.003058 0.002385 -0.001022 0.000480 
+0.000516 0.001630 0.000255 -0.003473 -0.001386 -0.000321 
+-0.004348 0.000328 -0.001860 0.000148 0.004238 -0.001561 
+0.003051 0.001540 -0.002163 0.001521 -0.000177 -0.001864 
+0.001132 -0.004139 0.001203 0.001737 -0.005469 0.001303 
+0.002007 -0.003082 0.000789 0.000712 -0.001440 -0.001416 
+-0.000134 -0.001355 -0.004619 0.000726 -0.001043 -0.005718 
+0.000734 0.000329 -0.002048 -0.002066 -0.002899 0.005621 
+-0.004731 -0.012590 0.005453 -0.005411 -0.008094 -0.002465 
+-0.003667 -0.002473 -0.001134 0.000068 0.001653 0.000602 
+0.001271 0.002492 -0.000153 0.000470 -0.000727 0.001322 
+0.001946 -0.000272 0.001181 0.001433 0.001059 0.000966 
+-0.001573 -0.000207 0.002349 0.000705 -0.003781 0.003395 
+0.001036 -0.000255 0.000614 0.004118 -0.001132 -0.002265 
+0.004360 -0.003317 -0.002622 0.001672 -0.003001 -0.003076 
+-0.000324 -0.000382 -0.000554 -0.005914 -0.001777 0.006323 
+-0.005684 -0.006769 0.007388 -0.000168 -0.004170 0.007834 
+-0.002526 -0.000035 0.003356 0.003076 -0.000504 0.001025 
+0.000000 0.001018 0.000204 0.000671 0.000930 0.000834 
+0.001682 0.003766 -0.003272 -0.000638 0.003023 0.000283 
+-0.000835 -0.000269 -0.000654 0.001750 -0.000031 -0.003195 
+0.005619 0.001585 -0.003278 0.003783 0.000091 0.002017 
+0.000387 0.001567 0.002214 0.000117 0.001828 0.000700 
+0.001588 0.001524 -0.000746 0.000924 -0.000963 0.001518 
+0.000714 -0.000204 0.002519 -0.000892 -0.000535 0.000044 
+-0.000020 0.003757 -0.002725 0.002077 0.002859 0.003052 
+0.005753 0.005704 0.000885 0.002476 0.005474 0.000062 
+0.002757 0.004425 0.000021 0.003239 0.001198 -0.000305 
+0.002294 -0.002785 0.002253 0.000016 0.000410 0.002065 
+0.001734 0.000433 -0.005088 -0.003067 0.004321 0.000965 
+0.008034 -0.008173 0.017679 1.103139 -1.704036 2.910314 
+1.069444 -1.916667 3.240741 0.009621 -0.012902 0.024707 
+0.008359 0.004777 0.000610 -0.000899 0.000050 -0.008505 
+0.002622 0.005434 0.000702 0.000597 -0.003440 0.003669 
+-0.000012 -0.002507 0.001621 -0.001455 -0.001449 -0.000146 
+-0.003132 -0.001136 -0.002211 -0.002794 -0.001250 -0.001765 
+-0.003469 0.004178 -0.003706 -0.003105 0.002923 -0.000847 
+-0.001301 -0.000378 -0.000559 0.001981 -0.000795 0.001352 
+0.001596 0.000531 0.002886 0.003899 0.003827 -0.002253 
+-0.001041 0.004410 0.000591 -0.002446 0.000306 0.000047 
+0.000260 0.000405 -0.000314 -0.004309 0.002514 -0.001897 
+-0.005955 -0.001104 0.003011 -0.007416 -0.002342 0.005855 
+-0.007098 -0.000791 0.002679 -0.001871 0.000117 -0.001092 
+-0.000349 -0.001188 -0.004124 -0.000420 -0.000315 -0.006721 
+0.002062 -0.002525 -0.004772 0.002543 -0.000993 -0.001589 
+0.000346 -0.000279 -0.000254 -0.003479 -0.000602 -0.000658 
+-0.003415 -0.000614 -0.002207 -0.003921 -0.003677 -0.004569 
+-0.005025 -0.005518 -0.002476 -0.000668 -0.001558 -0.000371 
+0.000319 0.001159 -0.000058 -0.005548 -0.002837 -0.004000 
+-0.006339 -0.006186 0.000784 -0.000478 0.001629 -0.001455 
+-0.001591 0.005637 -0.007137 -0.001000 0.004833 -0.002167 
+-0.000905 -0.001424 0.004658 -0.000432 0.001100 0.001493 
+0.002173 -0.001178 -0.000334 0.005484 -0.002783 -0.003340 
+0.000289 -0.004399 -0.003643 0.001403 -0.001981 -0.001321 
+0.000206 0.000145 -0.000130 0.002761 0.005286 0.000549 
+0.001908 0.002881 0.003703 -0.002720 -0.002832 0.007135 
+-0.003640 -0.006088 0.006258 -0.002609 -0.003007 0.001069 
+-0.001297 0.002089 -0.000900 -0.001731 0.000478 -0.001856 
+-0.002941 -0.003592 -0.001486 -0.001027 -0.004122 0.000411 
+0.000162 0.000127 -0.000120 0.003109 -0.000444 0.002520 
+0.003612 0.001935 0.005417 0.002293 0.002822 0.001379 
+0.002044 -0.002253 -0.000052 0.000593 -0.005015 0.000728 
+0.001126 -0.003973 0.000459 -0.000140 -0.001979 0.000216 
+-0.001352 -0.001697 -0.001110 0.000519 -0.001559 0.000792 
+0.004086 -0.001024 -0.001728 0.001869 0.004337 -0.003326 
+0.009389 0.004268 -0.000833 0.006381 -0.001713 -0.001156 
+0.004619 -0.001672 -0.001362 0.003812 0.001824 -0.002572 
+-0.000415 0.002743 0.004829 0.002577 -0.003977 0.019561 
+0.305936 -1.552511 3.105023 0.719101 -2.003745 3.374532 
+0.730769 -1.992308 2.853846 0.002249 -0.016083 0.015110 
+0.001336 -0.003356 -0.001226 0.000185 0.006590 -0.002757 
+-0.005546 0.004685 0.003030 -0.007135 0.000503 0.006734 
+-0.002319 -0.001031 -0.000687 -0.000393 -0.000819 -0.000318 
+-0.000352 -0.000269 -0.000198 -0.000819 0.000619 -0.001705 
+-0.000779 0.003271 -0.000078 -0.001963 0.006333 -0.001556 
+-0.001592 0.004667 -0.002302 0.000554 -0.000325 0.001080 
+0.001978 -0.002646 0.001315 -0.003542 -0.004233 0.004982 
+-0.001436 -0.001028 0.003689 -0.000114 0.001138 0.002913 
+0.000423 0.003214 -0.000578 0.002771 0.002413 -0.003874 
+-0.000982 0.000721 -0.005731 -0.001947 -0.001988 -0.000504 
+-0.003992 -0.000184 0.002481 -0.002904 -0.001266 0.000608 
+0.002150 -0.003798 0.000438 0.005774 0.000026 -0.003526 
+0.007772 -0.000582 -0.004388 0.005520 0.002508 0.001338 
+0.001246 0.000310 0.000570 -0.000199 -0.001089 -0.001782 
+-0.001591 -0.001393 -0.002288 -0.001406 -0.002338 -0.001691 
+-0.000666 -0.001009 -0.000323 -0.001705 -0.000023 0.001372 
+-0.002708 -0.002667 0.002208 -0.008954 -0.002007 0.004888 
+-0.007922 0.002804 0.002195 -0.002209 0.001422 0.001115 
+0.000951 -0.000623 -0.002570 0.001208 0.006467 -0.004370 
+-0.000079 -0.001594 -0.001056 0.000138 0.001153 0.001079 
+0.001419 0.003919 0.003010 -0.001072 0.000914 0.003321 
+0.000992 -0.001989 0.001312 0.000313 -0.002011 -0.000380 
+0.000769 0.002400 -0.001575 0.000554 0.006231 -0.000738 
+0.002109 0.002469 0.001424 0.000562 -0.001055 0.001589 
+0.000914 -0.003600 0.000249 0.000970 -0.001735 -0.000383 
+-0.001587 -0.003174 0.000413 0.000292 -0.005808 -0.002280 
+-0.002278 -0.009298 0.000527 -0.004157 -0.007931 0.003870 
+-0.000670 -0.003365 0.004364 -0.000549 0.000302 0.001963 
+0.000688 -0.000134 0.001680 -0.000531 0.000193 0.002005 
+-0.002374 -0.001529 0.001703 0.000047 -0.001307 0.000761 
+0.001904 -0.002169 -0.000657 0.000230 -0.001762 -0.000265 
+0.000721 -0.000606 0.000898 0.002105 -0.000284 0.001233 
+0.004009 0.000625 -0.001748 0.006360 0.002800 -0.002120 
+0.005053 -0.000326 -0.003261 0.002768 -0.001916 -0.000744 
+-0.001498 0.001628 -0.003972 -0.002600 0.004358 -0.007178 
+-0.001964 0.002837 0.006572 -0.001917 -0.007877 0.024103 
+0.251282 -1.615385 3.338462 0.480198 -2.004951 3.316832 
+0.003101 -0.020497 0.023375 0.003567 -0.007774 0.004469 
+0.002395 0.004552 -0.001811 0.001654 0.001565 -0.004375 
+-0.001774 -0.001719 0.001938 -0.002117 0.000117 0.001445 
+-0.001236 0.002931 0.002525 -0.000505 0.001830 0.004124 
+0.001009 -0.001108 0.003172 0.003013 0.000159 0.002535 
+0.000500 0.003955 0.002002 -0.000606 0.000647 0.001963 
+-0.000814 0.001772 0.001161 0.001333 -0.003086 0.001520 
+0.001362 -0.005211 0.003595 0.002399 -0.002114 -0.000018 
+0.002342 0.001581 -0.001188 0.002676 0.001920 -0.001703 
+0.001857 0.001181 -0.003872 0.002048 0.001195 -0.004202 
+0.000645 0.002433 -0.002762 -0.000370 0.001424 0.000419 
+-0.000648 -0.000012 0.000335 0.000177 -0.003342 0.000009 
+0.002229 -0.004287 -0.000701 0.003473 -0.001116 -0.001489 
+0.001787 0.001524 -0.002366 0.000659 0.003078 0.000523 
+0.000310 0.001240 0.000698 0.000741 -0.002933 0.000761 
+0.000372 -0.003321 -0.002266 -0.002058 -0.002561 -0.000665 
+-0.002791 -0.002329 0.001262 -0.001307 -0.003743 0.005398 
+-0.000287 -0.001389 0.003623 -0.000995 -0.001102 -0.001078 
+-0.002468 -0.000499 -0.001331 -0.003189 0.000324 -0.000101 
+-0.000460 0.000019 0.000110 0.003122 0.005583 -0.004164 
+-0.000826 -0.002800 -0.001376 0.002558 0.001117 -0.001728 
+0.000876 0.001059 0.002936 -0.000465 0.005093 0.005862 
+0.000647 0.003919 0.006782 0.002574 0.000571 -0.000143 
+0.002484 0.001846 0.002963 0.003088 0.003408 -0.001488 
+0.002345 0.004059 -0.005319 0.003493 -0.002587 0.000907 
+0.003643 -0.001546 0.000858 0.001002 -0.000793 -0.000467 
+0.000529 -0.001328 -0.001979 0.000959 -0.002580 -0.000587 
+0.001764 -0.002809 -0.000418 -0.002578 0.000000 0.002187 
+-0.003219 -0.005173 0.001898 -0.001240 -0.002790 0.001940 
+-0.000300 -0.000901 0.003602 0.000166 0.000989 0.001430 
+-0.004351 -0.004227 -0.001190 -0.005781 -0.005322 -0.002432 
+-0.002753 0.000169 -0.001060 -0.000029 -0.000032 -0.000340 
+-0.001168 -0.001529 0.000871 0.000582 0.000194 -0.000224 
+0.002590 0.001097 -0.001339 0.004476 0.002909 -0.001867 
+0.004339 0.004722 -0.003128 0.003126 0.004134 -0.004557 
+-0.000168 0.001107 -0.006665 -0.000527 0.001262 -0.002781 
+-0.003242 -0.002007 0.008042 0.001751 -0.006021 0.021750 
+0.003808 -0.014941 0.022649 0.006437 -0.016318 0.016844 
+0.002197 -0.008591 0.005806 -0.004184 0.000052 -0.002401 
+-0.003107 0.002208 0.003912 -0.008189 -0.006579 0.008324 
+0.001285 -0.001713 0.004488 -0.001385 0.000168 -0.000653 
+-0.002064 0.004617 0.001956 -0.001706 0.002273 0.002134 
+0.001396 0.000056 -0.000321 0.000000 0.002979 -0.002270 
+0.002617 0.006418 -0.000483 -0.000212 0.003391 0.003039 
+-0.001394 0.001135 0.000616 -0.000077 -0.004590 -0.001157 
+0.004777 0.003214 -0.002268 0.007722 0.003516 -0.005707 
+0.002707 0.000924 -0.005823 -0.000546 -0.001074 -0.004932 
+-0.004408 0.000641 -0.002003 0.001221 0.000442 -0.004193 
+-0.000482 0.000314 -0.004122 -0.001137 0.000293 -0.000787 
+0.002028 0.002941 -0.003582 0.000073 0.004031 -0.004399 
+0.000909 0.003637 -0.004243 -0.002776 -0.000743 -0.000852 
+-0.002577 -0.003256 -0.003436 -0.006181 -0.004134 0.001024 
+-0.003522 -0.003887 -0.000595 -0.002653 -0.004226 0.001047 
+-0.002477 -0.006063 0.002789 -0.005568 -0.005233 0.004830 
+-0.003061 -0.003758 0.006725 -0.000559 -0.003314 0.001429 
+0.005789 -0.001794 0.002142 0.000016 -0.000767 0.000452 
+-0.000621 -0.001219 -0.001630 -0.004581 -0.001023 -0.002000 
+-0.002039 0.002973 -0.000396 -0.000228 0.002620 -0.002202 
+0.001570 -0.003647 -0.000138 -0.000885 -0.000772 -0.001812 
+0.000721 -0.000797 -0.002142 0.006141 0.000864 -0.000751 
+0.006931 0.004980 -0.000540 0.004328 0.002722 0.000580 
+0.000219 0.002993 0.000000 0.000415 0.001221 -0.004397 
+0.000526 -0.000067 -0.004635 0.000198 -0.002232 -0.001299 
+0.001032 -0.001410 -0.000472 -0.000050 -0.001298 -0.000335 
+-0.000115 -0.000311 0.000246 -0.001641 -0.000454 0.001471 
+0.000143 -0.000581 0.000068 0.001518 0.000250 -0.002778 
+-0.000880 0.001600 -0.003280 -0.000639 -0.000246 -0.000231 
+-0.001329 -0.002811 0.003095 -0.002454 -0.003108 0.002945 
+-0.000624 -0.002848 0.002875 -0.000649 -0.001737 0.002986 
+-0.003611 -0.002134 0.003678 -0.003752 -0.005012 0.002516 
+-0.002031 -0.004880 -0.000636 -0.001123 -0.004355 -0.001246 
+0.002135 -0.001601 -0.002846 0.004006 0.001734 -0.001361 
+0.004758 0.004143 -0.000734 0.002700 0.005007 -0.002911 
+0.001921 0.002319 -0.007883 0.001455 0.001188 -0.004498 
+0.001436 0.002883 0.001168 0.008145 0.002272 0.012090 
+0.005525 -0.000189 0.015303 0.002964 -0.001192 -0.000452 
+-0.000697 0.011102 -0.005756 -0.001548 0.006978 -0.001673 
+-0.001829 -0.000853 -0.000450 -0.004460 -0.003955 0.008912 
+-0.000712 -0.005627 0.000840 0.000076 -0.001425 0.005692 
+-0.001711 -0.002381 0.004863 0.000316 -0.002945 -0.000876 
+0.002890 -0.001622 0.001120 0.003258 -0.000909 0.001540 
+0.002518 -0.001655 -0.002230 0.000148 -0.000963 0.001259 
+-0.000196 -0.000119 -0.000139 0.004116 -0.000124 -0.001331 
+0.002349 -0.001163 -0.001310 -0.001142 -0.001995 0.001868 
+-0.001358 -0.002455 0.001605 -0.000146 0.000403 -0.001310 
+0.001611 0.001654 -0.006538 0.001554 0.004059 -0.008031 
+0.000745 0.003883 -0.004072 0.000588 -0.002353 -0.006381 
+0.002182 -0.001162 -0.003114 0.002809 0.002150 -0.003839 
+0.003672 0.002648 -0.002789 0.000930 0.001715 -0.000447 
+-0.002263 0.001954 -0.002070 -0.001206 0.001199 -0.002205 
+0.000256 -0.000494 -0.001499 -0.000441 -0.002697 0.000461 
+-0.001228 -0.003258 0.000802 -0.002083 -0.000272 0.000015 
+0.001658 -0.000797 -0.001972 -0.000437 -0.002206 -0.003205 
+-0.002243 -0.000432 0.003094 -0.003333 -0.005114 0.006392 
+-0.004817 0.001167 0.003809 -0.001511 -0.000523 -0.001474 
+0.001075 0.001935 -0.004729 -0.000794 0.002271 -0.002883 
+-0.000255 -0.001242 0.000777 -0.000714 -0.003304 -0.001040 
+0.001334 -0.002634 -0.001745 -0.004651 -0.004398 0.003873 
+-0.003415 -0.001077 0.006831 -0.003742 0.002753 0.004183 
+-0.001360 0.000370 0.002348 0.001418 -0.000032 -0.000378 
+0.002163 -0.000051 -0.003477 0.001800 0.004660 -0.004617 
+0.006221 0.006061 -0.003507 0.005539 -0.000718 -0.004461 
+0.000313 0.000006 -0.001089 -0.003149 -0.001881 0.000738 
+-0.003316 0.000950 -0.001175 0.001694 0.004113 -0.005323 
+0.010000 0.005875 -0.004708 0.002679 0.006393 -0.003369 
+-0.004359 -0.001685 -0.000465 -0.006288 -0.004928 0.003157 
+-0.001649 -0.002427 0.001576 0.001680 0.002596 -0.001082 
+0.001408 0.003913 -0.001723 0.001222 0.001624 -0.000803 
+0.002411 0.001570 -0.000607 0.004187 0.003490 -0.000752 
+0.003525 0.003381 0.000072 0.002168 0.000044 -0.000020 
+0.000041 -0.001459 0.001881 0.000072 0.000607 -0.000095 
+0.000813 0.004476 -0.003256 0.001751 0.003644 -0.003029 
+0.000457 0.000153 0.000128 -0.000637 0.001096 -0.000361 
+-0.002815 0.008046 -0.002759 -0.003563 0.014580 -0.005410 
+-0.002089 0.008037 -0.005625 0.000344 0.000433 0.000236 
+0.002284 -0.002150 0.002097 0.002684 -0.001158 0.001614 
+0.000721 -0.001853 0.000434 -0.000319 -0.002119 -0.000140 
+0.000606 -0.001765 -0.000791 0.001090 -0.000365 0.000318 
+0.001751 0.001279 -0.000396 0.001111 0.002861 -0.001144 
+0.002847 0.000020 -0.000389 0.003798 -0.002584 0.000940 
+0.000485 -0.001764 0.001745 -0.002284 -0.000496 -0.001443 
+-0.002550 -0.001265 0.002224 -0.004621 -0.006110 0.002553 
+-0.001617 -0.006415 0.002595 0.001767 -0.000980 0.002014 
+0.001147 0.003057 -0.005630 0.006094 -0.000570 -0.006959 
+0.000534 -0.004329 -0.006313 0.001805 -0.000654 -0.001779 
+0.002087 -0.002674 -0.000429 0.005456 -0.001002 -0.002169 
+0.009092 0.001871 -0.004293 0.005812 0.004940 -0.010113 
+0.007015 -0.001007 -0.003022 0.001326 0.001061 -0.000265 
+-0.004587 -0.004005 0.003424 -0.005988 -0.004355 0.005580 
+-0.006797 -0.001846 -0.000406 -0.002766 -0.000013 -0.001415 
+-0.002046 -0.000341 0.000000 -0.000150 -0.002181 -0.001895 
+-0.006074 0.000000 0.001556 -0.003857 -0.002406 -0.000874 
+0.000501 0.002338 -0.001276 0.005813 0.003883 -0.001668 
+0.005543 0.000924 -0.001393 0.001235 0.002432 -0.003192 
+0.001852 0.001962 -0.003029 0.000675 -0.000650 -0.001607 
+0.001228 -0.001381 -0.000102 -0.009406 -0.004972 0.004673 
+-0.010990 -0.001416 0.005744 -0.000936 -0.005196 0.004728 
+0.003844 -0.000657 0.002844 0.002118 -0.001622 -0.000305 
+0.000306 0.000534 -0.004351 -0.000144 0.002000 -0.004328 
+0.000466 0.000170 0.000480 0.003656 0.000989 0.000616 
+0.001226 -0.000142 0.001486 -0.004655 -0.002155 0.002500 
+-0.005608 -0.006080 -0.001488 -0.004821 -0.002636 -0.004068 
+-0.000386 -0.001039 -0.003382 0.001908 0.002313 -0.004140 
+0.000763 -0.000339 -0.001695 -0.004735 -0.003835 0.001677 
+-0.005771 -0.006750 0.001403 -0.003231 -0.003518 -0.000665 
+-0.002021 0.002383 0.003057 0.001200 0.000200 0.001800 
+0.003040 0.002692 -0.002588 0.002499 0.004700 -0.001896 
+0.002740 0.002976 -0.001096 0.002696 -0.000493 0.000686 
+0.003204 -0.001404 -0.000061 0.001953 -0.001811 -0.000494 
+0.001170 0.001120 -0.003461 -0.000409 0.000682 -0.004710 
+0.002847 0.006707 -0.004873 0.002371 0.010269 -0.006459 
+0.005553 0.016394 -0.009296 0.005822 0.012814 -0.008368 
+-0.002788 0.001356 0.002719 0.001218 -0.006304 0.006615 
+0.001803 -0.003348 0.001126 0.000968 0.000591 0.000167 
+0.002365 0.002685 -0.004385 -0.001748 -0.003256 -0.002236 
+-0.005047 -0.004988 0.001933 -0.005367 -0.002212 0.003985 
+-0.001745 0.004238 0.001828 -0.001656 0.004935 -0.001392 
+-0.000217 0.001729 -0.002981 -0.000099 -0.000136 0.000111 
+-0.001001 -0.003672 0.003006 -0.002674 -0.005973 0.000412 
+-0.001966 -0.006165 -0.000590 -0.000506 -0.004851 -0.001845 
+-0.000262 -0.002564 0.000288 -0.001724 -0.001653 -0.001359 
+-0.001549 -0.000540 -0.003077 0.003925 0.000841 -0.006543 
+0.006695 -0.000681 -0.006472 0.003461 0.001916 -0.005368 
+-0.001513 0.003288 -0.001233 -0.001893 0.002850 0.000448 
+0.001321 0.004392 -0.002199 0.001344 0.002521 -0.005017 
+0.006524 -0.000489 0.000425 -0.001654 -0.003463 -0.000629 
+-0.006267 -0.008907 0.005826 -0.009925 -0.002583 -0.004600 
+-0.006254 -0.001578 -0.001047 -0.000709 -0.001583 -0.000528 
+0.001150 -0.005067 0.002455 -0.000625 -0.004127 0.000616 
+-0.001630 -0.000889 -0.000444 -0.001171 -0.000075 -0.001757 
+0.000657 0.002298 -0.001641 0.004198 -0.001924 -0.003847 
+-0.000606 0.000172 0.000431 -0.002624 -0.000676 0.004077 
+-0.000335 0.000535 -0.000992 -0.000367 0.000456 -0.000225 
+-0.002718 -0.000422 0.000074 -0.004914 -0.002404 0.001054 
+-0.005617 -0.002332 0.000076 -0.002932 -0.002707 0.000150 
+0.000331 -0.001858 0.001781 0.000638 0.000203 0.001646 
+-0.000790 0.001830 -0.000925 -0.001344 -0.001287 -0.001628 
+0.000051 0.001871 -0.002628 0.000274 0.001182 0.000291 
+-0.003211 -0.002693 0.001847 -0.004941 -0.002912 0.001618 
+-0.005068 -0.000292 -0.002049 -0.004656 0.002393 -0.002586 
+-0.000171 0.001618 -0.000955 0.000874 -0.000569 0.002165 
+0.001577 0.001342 0.001238 0.002022 -0.000044 -0.002145 
+-0.001916 0.000808 0.000080 -0.002114 0.004146 0.002033 
+0.000991 0.002707 0.006141 -0.002178 0.004575 0.004502 
+-0.003177 0.002509 0.001439 -0.002172 0.001361 -0.000385 
+-0.000808 0.002424 -0.003360 0.007680 0.000000 -0.002640 
+0.004560 0.000317 -0.000091 -0.000847 -0.001360 -0.000212 
+-0.001097 0.002761 -0.001924 0.002665 0.009596 -0.004666 
+0.011213 0.010089 -0.005601 0.001504 0.009774 -0.000450 
+0.003566 0.009049 0.001595 0.004495 0.011730 0.000194 
+0.006955 0.011262 -0.002883 0.000643 0.006006 -0.000954 
+0.001271 0.000547 0.001110 -0.000538 -0.001851 -0.000128 
+0.000636 -0.002985 -0.002048 -0.000007 0.002083 -0.002598 
+-0.001057 -0.002827 0.000526 -0.006370 -0.003146 0.000907 
+-0.004213 0.000342 -0.001798 -0.000667 -0.001298 -0.001038 
+-0.001827 -0.000913 0.002913 0.000547 0.000607 -0.000506 
+0.001543 0.000121 -0.000429 0.000556 -0.000875 0.001548 
+-0.000332 -0.000844 0.001720 0.001792 0.001015 -0.003033 
+0.004235 -0.001314 -0.007689 0.002065 -0.003088 -0.004628 
+0.001144 0.005395 0.001471 0.003736 0.000155 -0.004824 
+0.004365 -0.000864 -0.003455 -0.000018 0.004459 -0.000903 
+0.000873 0.003192 -0.000464 -0.001007 0.001701 0.000025 
+-0.002058 0.001692 0.005488 -0.001238 -0.000345 0.005021 
+-0.002424 0.001562 -0.000862 -0.000325 -0.001023 -0.001162 
+-0.000226 -0.001329 -0.000581 -0.000668 -0.002459 -0.000968 
+-0.004789 -0.005367 -0.000116 -0.005194 -0.001078 0.003233 
+-0.002969 -0.002755 -0.000612 -0.000108 0.003674 -0.002101 
+0.003457 0.001060 -0.002355 0.000220 -0.000214 -0.000820 
+0.001522 -0.001218 -0.000101 -0.001707 -0.005173 0.001019 
+0.000970 -0.004191 0.000472 0.002775 -0.001551 0.004368 
+-0.009014 0.003185 -0.000912 -0.007832 -0.002802 -0.004936 
+-0.006245 -0.004621 -0.002792 -0.001911 -0.000653 0.000303 
+0.002691 0.002384 0.000074 -0.000383 0.001122 0.001438 
+-0.002897 -0.004084 0.004902 -0.002404 -0.004954 0.006622 
+-0.002130 -0.001271 0.000446 0.001834 0.006035 -0.006188 
+0.004963 0.012202 -0.000637 0.003265 0.002463 -0.001330 
+-0.002455 -0.003707 -0.000379 0.000756 -0.001256 0.000037 
+0.002003 0.001205 -0.002427 0.004495 0.006320 -0.001912 
+0.001861 0.002518 -0.003259 -0.000097 0.000275 -0.000404 
+-0.000421 -0.000197 -0.000836 -0.000909 0.000266 0.001597 
+0.002206 0.001287 0.002763 0.000000 0.003594 0.003359 
+-0.003094 -0.001547 0.004141 -0.003835 0.001323 0.004758 
+-0.002233 -0.000970 0.002959 0.001810 0.000231 -0.000367 
+0.003551 0.001766 -0.001450 0.003687 0.000983 -0.001756 
+0.003331 -0.001621 -0.001536 0.002187 -0.000984 -0.000328 
+0.001193 0.002422 -0.000561 0.003030 0.002038 0.000173 
+0.001354 -0.000353 -0.002854 -0.002551 0.001256 -0.002444 
+-0.002976 0.005425 0.000490 0.001257 0.009457 0.002035 
+0.008949 0.011111 -0.001271 0.006987 0.008340 -0.007104 
+0.000884 0.003255 -0.002928 -0.003451 -0.003164 0.000552 
+-0.006124 -0.005521 0.002265 -0.004762 -0.002875 0.000951 
+-0.002586 -0.000678 -0.000042 -0.003797 -0.002389 -0.001564 
+-0.005873 -0.003458 -0.002706 -0.005336 -0.001499 -0.001848 
+-0.003080 0.001981 -0.000218 -0.001583 0.002335 -0.002019 
+0.002885 0.000764 -0.003205 0.004947 -0.000468 -0.001086 
+0.001808 0.002076 -0.002617 0.000561 0.000593 -0.007860 
+0.002554 0.000533 -0.004625 0.004114 0.003015 -0.003002 
+0.002498 0.005222 -0.004919 -0.003179 0.004916 -0.005213 
+-0.002989 0.001258 -0.003226 0.002721 -0.001205 -0.002858 
+0.005921 0.003127 -0.001375 0.006944 0.005816 -0.004313 
+0.005409 0.002326 -0.005121 0.001240 -0.000327 -0.002162 
+-0.000469 -0.000967 -0.000639 -0.000489 0.000009 -0.000363 
+-0.000889 -0.000783 -0.002624 0.002991 -0.001675 -0.004906 
+-0.003608 -0.002431 -0.001385 -0.003613 0.000098 -0.002023 
+-0.001667 -0.000076 0.001243 0.001142 0.001320 -0.003105 
+0.002465 0.002110 -0.003986 -0.001048 0.001288 -0.000731 
+-0.003435 -0.001063 -0.000618 -0.001281 -0.004014 -0.001644 
+-0.001323 -0.007752 0.002069 -0.002682 -0.001741 0.002542 
+-0.008803 0.001410 0.003828 -0.006423 -0.000730 0.002117 
+-0.002279 -0.001997 -0.000056 0.002394 0.001132 0.001652 
+0.002391 -0.000359 0.003347 -0.000427 0.000440 0.002018 
+-0.001266 -0.002228 0.003253 -0.002343 -0.002330 -0.001635 
+-0.000713 0.002169 0.004344 0.003376 0.003197 0.003582 
+0.000658 0.006076 0.002281 0.005556 0.000161 0.000419 
+0.003212 0.001644 -0.004899 -0.000141 -0.000160 0.000085 
+-0.001286 -0.003052 0.003445 -0.003143 -0.003546 0.004002 
+-0.002853 -0.004195 0.002050 -0.000894 -0.000233 -0.004508 
+-0.000369 -0.003481 -0.001409 -0.003719 -0.000650 0.000199 
+-0.001169 0.002415 0.001064 -0.001113 0.002422 0.001441 
+-0.005358 -0.004478 0.002640 -0.000824 -0.001696 0.000112 
+0.001878 0.002583 -0.002053 0.002517 0.003213 -0.002153 
+0.000084 0.001262 -0.001514 -0.002043 -0.001641 -0.000463 
+-0.001011 -0.003573 0.001747 0.002225 -0.002677 0.000756 
+0.001761 0.000123 0.000492 -0.001201 0.000142 -0.000105 
+-0.003448 0.000385 -0.001264 -0.002701 0.000940 -0.000394 
+0.000433 0.001017 0.002522 0.005260 0.003094 0.002321 
+0.006204 0.005239 -0.001703 0.006400 0.007883 -0.002183 
+0.007690 0.005992 -0.001477 0.003406 0.003188 -0.001828 
+-0.001930 -0.003871 0.001162 -0.006550 -0.006792 0.000277 
+-0.007488 -0.003691 0.001854 -0.003674 0.001577 -0.002077 
+-0.002128 -0.000638 -0.006275 -0.001826 0.002310 -0.007052 
+-0.001106 0.002702 -0.003582 -0.000639 0.001654 -0.002494 
+-0.000329 0.001042 -0.001933 -0.001138 0.000057 -0.000273 
+-0.000973 -0.003850 0.000066 -0.000140 -0.004452 -0.000584 
+-0.000576 -0.003123 0.000933 -0.003216 -0.001199 -0.000247 
+-0.004766 0.000233 -0.003697 -0.005159 0.004918 -0.003095 
+0.004046 -0.000246 -0.004724 0.008532 0.003586 -0.007419 
+0.007630 0.004032 -0.005903 0.004782 0.003180 -0.006354 
+0.005733 -0.000636 -0.008008 0.006565 -0.000040 -0.008978 
+0.006778 -0.000348 -0.008864 -0.000500 -0.003678 -0.005648 
+-0.001597 0.002951 -0.007066 0.002044 0.001956 -0.005691 
+-0.000191 -0.000111 -0.001106 0.001508 0.000646 0.002892 
+0.003123 0.002474 -0.000518 -0.000717 -0.002919 0.000266 
+-0.005974 -0.006194 -0.001729 -0.004230 -0.005950 -0.003842 
+-0.006076 -0.003836 -0.002718 -0.009025 -0.004393 0.005855 
+-0.006904 0.000080 0.003082 -0.002419 0.000415 -0.001576 
+0.000698 0.002095 0.002619 0.002349 0.001705 -0.000429 
+0.000055 -0.001411 -0.000702 -0.001949 -0.003603 0.003509 
+0.000458 -0.000573 0.005530 -0.000714 -0.000317 0.003810 
+0.003858 0.002487 0.001586 0.002367 0.002679 0.003364 
+-0.005885 -0.000077 0.005885 -0.000076 0.001160 0.004272 
+-0.000899 0.001598 -0.002076 0.008558 0.005498 -0.002405 
+0.007316 0.002727 -0.005594 0.000396 0.000245 -0.000085 
+-0.004429 -0.001918 0.001031 -0.003843 -0.002251 -0.000039 
+0.000424 -0.000128 0.000370 -0.000968 -0.003764 0.003173 
+-0.001609 -0.005430 -0.002564 -0.004327 0.001854 -0.002358 
+-0.008618 -0.002033 0.000000 -0.005917 -0.001180 0.002340 
+-0.001745 -0.002874 0.002565 0.000675 0.000498 -0.000555 
+-0.000621 0.001384 -0.003238 0.000353 0.000942 -0.001800 
+-0.000668 0.002493 0.001195 0.001273 0.001061 0.000233 
+0.000203 0.000460 0.000109 -0.000379 0.000394 -0.000448 
+-0.001110 0.002120 -0.000478 -0.001280 0.003167 0.000729 
+0.001460 0.000121 0.000686 0.004668 0.000114 -0.005353 
+0.001821 0.002301 -0.001526 -0.000945 0.001867 -0.000531 
+-0.001810 0.006916 -0.003835 0.004550 0.008897 -0.001969 
+0.006821 0.005273 -0.002014 0.003374 0.002974 -0.001801 
+0.000308 -0.003691 0.000778 -0.004656 -0.004243 -0.001376 
+-0.005126 -0.001052 0.000546 0.001460 0.002564 0.000519 
+0.004302 0.001741 -0.001642 -0.002080 -0.000006 -0.001406 
+-0.004846 -0.000862 -0.000755 -0.003943 -0.004328 0.002115 
+-0.000326 0.003026 0.002059 -0.001667 0.007941 -0.005098 
+0.004495 0.007868 0.000132 0.007955 0.001150 0.000723 
+0.004971 -0.001698 -0.002746 0.001943 -0.002041 -0.001383 
+-0.000571 -0.000100 -0.001504 -0.001977 0.001748 -0.002069 
+-0.000902 0.001496 0.000680 0.003835 0.002447 -0.002273 
+0.003353 0.000476 -0.003528 -0.000877 -0.003026 0.001272 
+-0.000668 -0.007069 -0.000389 -0.001452 -0.003629 -0.003145 
+0.000838 0.000652 -0.006328 0.004470 0.000613 -0.006020 
+0.004038 0.002609 -0.004432 0.000407 0.000435 -0.002037 
+-0.004566 0.000787 -0.001419 -0.004828 -0.002723 0.001808 
+0.000254 0.000484 -0.001755 0.000238 -0.000197 -0.002018 
+-0.000352 -0.001758 -0.001406 -0.005916 -0.003978 -0.001050 
+-0.006712 -0.000990 0.003631 -0.002809 0.005097 -0.000164 
+0.002925 0.005774 -0.004311 0.000614 0.006688 0.001391 
+0.000564 0.000261 -0.000200 -0.001198 -0.000728 0.001348 
+-0.003046 -0.002705 0.003553 -0.000876 -0.003286 0.004382 
+0.001425 -0.000495 0.004057 0.006455 0.001866 0.003425 
+0.005468 -0.000021 0.003529 0.002932 -0.000142 0.001083 
+0.001145 0.002290 -0.001145 0.000625 0.002467 -0.002689 
+0.006064 0.003204 -0.004685 0.005175 0.000002 -0.002062 
+-0.003918 0.001575 -0.001499 -0.003413 0.003622 0.002689 
+-0.002295 0.002083 0.002754 -0.000695 0.000218 0.001927 
+-0.003083 -0.000581 0.001654 0.001278 -0.000190 0.000684 
+0.002249 0.000598 -0.002784 -0.000820 0.004155 -0.003596 
+-0.002575 0.002243 -0.003267 -0.000366 0.000894 0.000322 
+0.000474 -0.002402 0.001519 0.001371 -0.000502 -0.000650 
+-0.002224 0.001766 -0.002991 0.000006 0.000075 0.000455 
+-0.003124 -0.002468 0.002795 0.000586 -0.002380 -0.000769 
+-0.000868 -0.001313 -0.001704 -0.000330 0.002972 -0.001046 
+0.002606 0.000737 0.001746 0.004000 -0.003923 0.006248 
+0.003542 -0.003260 0.006958 0.000700 -0.000386 -0.001799 
+-0.006192 -0.002297 -0.002859 -0.008603 -0.000543 -0.002578 
+-0.005354 0.001726 -0.000120 -0.000103 -0.000054 -0.000612 
+0.004550 0.003000 -0.001365 0.001030 -0.001742 -0.001130 
+-0.003167 -0.004782 -0.001149 -0.004566 -0.003074 -0.004388 
+-0.004622 -0.001363 -0.005570 -0.004829 0.001336 -0.002241 
+-0.005818 -0.000187 0.001197 -0.005345 -0.000220 0.000712 
+-0.005047 -0.001133 -0.001898 -0.002119 -0.003109 -0.000432 
+-0.001916 0.000992 0.003715 -0.000438 0.007695 0.002740 
+0.004425 0.008764 0.000433 0.000784 0.004155 0.000274 
+0.004701 -0.002624 0.000708 -0.000047 0.000543 0.002794 
+-0.000645 0.001337 0.001447 -0.000052 -0.002932 0.001019 
+-0.000163 -0.003370 0.003762 -0.000847 -0.004019 0.003811 
+-0.001681 -0.001387 0.001975 -0.003057 0.000301 0.000609 
+-0.004832 0.002242 -0.001310 -0.001369 0.001069 -0.000888 
+0.000312 -0.000571 0.003896 0.000128 -0.000767 -0.000818 
+0.001968 -0.001097 -0.004026 -0.000530 -0.001558 -0.007228 
+-0.007676 0.003577 -0.005513 -0.009806 0.001720 0.001108 
+-0.008187 -0.003529 0.006650 -0.005802 -0.005344 0.000153 
+-0.000907 -0.001357 -0.000904 0.000930 0.001550 0.000078 
+-0.000017 0.003445 0.000368 -0.000118 0.000287 0.000152 
+0.000702 -0.000613 -0.000384 0.000816 -0.000299 0.000745 
+-0.001329 -0.000909 -0.004056 -0.001708 -0.001287 -0.005031 
+-0.000171 -0.000839 -0.003361 0.002193 -0.000653 -0.000716 
+0.003409 0.003209 -0.000080 -0.001009 0.002890 -0.002459 
+-0.003248 0.003064 0.000138 -0.003883 0.001680 -0.001888 
+-0.000128 0.000091 -0.000335 0.000016 0.000333 0.000409 
+0.000605 0.001473 0.001783 -0.003186 0.001593 0.003300 
+-0.005519 0.000835 0.002148 -0.002933 -0.000221 -0.000701 
+-0.000623 0.000988 0.001406 -0.002895 -0.001509 0.003139 
+-0.001169 0.003320 0.002548 -0.001579 0.001079 -0.000235 
+0.006491 0.002509 -0.005018 0.005749 0.006838 -0.003267 
+0.002759 0.002119 -0.003152 -0.002179 0.001577 -0.003479 
+-0.000553 0.001884 -0.000380 -0.001857 -0.002786 -0.004527 
+-0.000789 -0.001166 -0.004697 -0.000753 -0.002015 -0.002108 
+-0.004780 -0.001419 0.000821 -0.001934 0.000846 -0.000146 
+-0.000460 -0.003367 -0.003312 0.000379 -0.006570 0.000638 
+0.000463 -0.006064 0.004142 0.000595 -0.003862 0.005621 
+0.002386 -0.001170 0.003668 0.003309 0.001409 -0.000652 
+0.001992 -0.000492 -0.003441 -0.001251 0.000650 0.000018 
+-0.000854 0.002110 0.001251 0.002800 0.000018 -0.001737 
+0.003888 0.004091 -0.004430 0.006425 0.000594 0.000529 
+0.008738 -0.004452 -0.002061 0.005747 -0.002810 -0.005712 
+0.001071 -0.002020 -0.002744 -0.000535 -0.003187 0.003019 
+-0.000185 -0.000842 0.005131 -0.002060 -0.005324 0.002916 
+-0.000006 -0.001460 0.001110 -0.000872 -0.000468 0.001693 
+-0.001966 -0.001681 0.003654 -0.001844 -0.002581 0.001682 
+0.002222 0.000400 -0.001129 0.003153 -0.000761 -0.003594 
+-0.001450 -0.003507 0.000709 -0.003115 -0.007157 0.005599 
+-0.005103 -0.004651 0.004109 -0.000868 0.000676 -0.000332 
+0.004851 0.005393 0.000271 0.003974 0.002237 -0.001160 
+-0.002297 -0.001694 0.002319 -0.009163 -0.000040 0.004340 
+-0.006222 0.002751 -0.000957 0.002439 -0.001545 0.002439 
+-0.000868 -0.002351 0.010523 -0.002622 -0.005726 0.004611 
+-0.001988 -0.003518 -0.000972 0.000012 -0.001636 -0.001322 
+0.000961 -0.000939 -0.000781 0.000951 0.002977 -0.002560 
+-0.003954 0.000645 -0.001148 -0.004851 -0.000479 -0.001801 
+-0.001694 -0.001015 -0.000762 0.001084 -0.002151 -0.000944 
+-0.001104 -0.003799 -0.000187 -0.004663 -0.003109 0.001101 
+-0.002626 -0.000161 0.002188 0.000362 0.000722 -0.001325 
+-0.003083 0.002422 -0.004888 -0.002399 0.002133 -0.004443 
+-0.001103 0.001063 -0.000847 0.003301 0.000365 0.000732 
+0.003017 0.002812 -0.006858 0.000616 0.001604 -0.008512 
+-0.001521 0.001291 -0.006516 -0.002020 0.001247 -0.001587 
+-0.005164 -0.002705 0.004918 0.001951 -0.000262 0.002563 
+-0.005658 -0.000867 -0.001249 -0.005973 -0.004276 0.001823 
+-0.002198 -0.002808 0.000026 0.002672 -0.001533 0.000043 
+0.000854 -0.002842 -0.000287 0.001746 -0.001912 -0.001121 
+0.000049 0.004412 -0.003975 0.007605 0.007605 -0.003866 
+0.006154 0.000666 0.002219 0.000972 0.002041 0.003709 
+-0.002007 0.000366 -0.000425 -0.001679 -0.000262 -0.000865 
+0.000520 -0.000216 -0.002520 0.000633 0.000322 -0.002979 
+-0.000390 0.000608 -0.002309 -0.003762 -0.000484 -0.000609 
+-0.003586 0.000616 0.000994 -0.003661 0.001373 0.002248 
+-0.005929 -0.002551 0.000841 -0.001597 -0.003359 0.002396 
+-0.000947 0.000789 -0.000597 -0.002259 -0.000598 -0.000314 
+-0.000559 -0.000628 -0.000224 0.001453 -0.001178 0.000307 
+0.005091 -0.003354 -0.001557 0.006621 -0.002246 -0.003726 
+0.004576 0.002191 -0.001576 -0.002168 0.003825 -0.001207 
+0.003065 0.000997 -0.001842 0.002344 0.003874 -0.002630 
+0.001289 0.001233 0.000046 0.001298 -0.004283 0.003461 
+0.000782 -0.005984 0.009942 0.001960 -0.006198 0.011122 
+-0.000909 -0.006241 0.007281 -0.000954 -0.002603 0.003683 
+-0.003081 -0.000322 0.002128 -0.005856 0.000024 0.003572 
+-0.004193 -0.000102 0.005744 -0.000698 -0.001786 0.002735 
+0.004671 0.001689 -0.001490 0.006528 0.002189 -0.001747 
+0.002538 0.000605 -0.002003 -0.000618 -0.002090 0.003955 
+-0.000123 -0.001774 0.003714 0.000062 0.000747 -0.001042 
+0.000545 0.002500 -0.004959 0.001304 0.000763 -0.004548 
+0.005032 0.002874 0.000024 0.002438 0.003266 0.003841 
+0.001335 0.000623 0.004332 -0.004980 -0.004386 0.003940 
+-0.006796 -0.006196 -0.000353 -0.007710 -0.004581 0.001410 
+0.001654 -0.003780 0.000236 0.002096 -0.005591 -0.001212 
+0.005449 0.000000 -0.003892 -0.003123 0.002163 -0.001393 
+-0.000446 0.006599 0.002417 0.001965 0.006257 -0.000373 
+0.000600 -0.000399 0.000289 0.000546 -0.001362 0.002062 
+-0.000533 0.000602 -0.000092 -0.000368 0.004974 -0.001234 
+0.001017 0.004896 -0.001258 0.002162 0.001970 -0.001248 
+-0.001955 0.003547 -0.002741 -0.000181 0.001352 -0.001048 
+-0.002046 -0.001389 -0.000304 0.001318 0.000415 -0.000276 
+0.004321 0.000855 0.001534 0.005522 -0.002349 0.002687 
+0.007398 0.000334 0.000089 0.000535 0.000701 -0.001063 
+-0.000904 0.001245 0.003752 -0.002561 0.000579 -0.000069 
+-0.003274 -0.001968 0.002129 -0.000006 -0.000647 0.000054 
+0.001936 -0.000266 -0.001442 0.000868 -0.000860 -0.001380 
+0.000903 -0.000493 -0.001559 0.003256 -0.001093 -0.002756 
+0.005865 0.001880 -0.004436 0.000642 0.001927 -0.004390 
+0.000793 -0.001156 -0.001519 -0.003997 0.001689 0.001276 
+-0.003129 0.002993 0.002925 0.001483 0.001998 0.002924 
+0.002863 -0.001091 0.001335 0.007637 0.004650 -0.006177 
+0.005366 0.005240 0.000022 0.003853 0.001581 0.000844 
+0.002400 -0.000189 0.000097 -0.000691 -0.000115 -0.000388 
+-0.003006 0.000507 -0.000619 -0.000696 0.001146 -0.000676 
+-0.000618 0.001516 0.001602 -0.000679 -0.000580 -0.000140 
+-0.000871 -0.001077 -0.003069 -0.002422 0.000067 -0.008005 
+-0.002607 -0.005351 -0.010530 0.014264 -0.000887 -0.010693 
+0.003505 0.000393 -0.006619 0.001015 -0.001951 -0.002600 
+-0.000241 0.001897 -0.001937 0.000977 0.002651 -0.005164 
+-0.002172 -0.000914 -0.003313 -0.001160 0.000976 -0.000329 
+0.000960 -0.001194 0.003277 -0.000970 -0.005440 0.001813 
+0.002705 -0.000984 0.004032 -0.001304 -0.001738 0.007279 
+-0.004672 -0.001052 0.005436 -0.003981 0.001128 0.001929 
+-0.000408 0.000599 -0.003225 0.003569 -0.000427 -0.004759 
+0.004456 0.001290 -0.000416 -0.000980 0.000619 -0.003610 
+-0.000045 0.003021 -0.000505 0.000240 0.002883 -0.002451 
+-0.000131 0.002715 -0.000575 0.001116 -0.001391 -0.000716 
+-0.000010 -0.001894 0.000797 -0.001278 0.001327 -0.000835 
+0.000297 0.003844 -0.004626 0.000045 0.005923 -0.007662 
+0.002531 0.005414 -0.009890 -0.000686 0.000502 -0.000198 
+-0.004887 -0.003178 -0.001377 -0.002679 -0.004207 0.001699 
+-0.000098 -0.002777 0.000942 0.003913 -0.000115 -0.001437 
+-0.000510 -0.000214 -0.007532 -0.003019 0.006683 -0.002938 
+0.003409 0.007364 -0.002795 0.000292 0.002715 -0.000783 
+0.000406 -0.001398 -0.000030 0.000961 -0.000429 0.000513 
+-0.000673 0.001376 -0.001353 0.000288 -0.000347 0.000012 
+-0.000779 -0.005401 0.002227 -0.002104 -0.004132 0.005847 
+-0.002294 0.001886 0.002019 -0.001630 0.001358 0.000815 
+0.000535 -0.000761 -0.000563 0.001225 -0.001712 -0.000133 
+0.000274 -0.003445 0.000718 -0.002797 -0.003996 0.003788 
+-0.002351 0.000486 0.002405 0.000068 0.001086 -0.001357 
+0.003809 -0.001182 -0.001150 0.002243 -0.001627 -0.001284 
+0.000372 -0.000560 -0.001214 -0.002316 -0.000162 -0.000915 
+-0.001564 -0.000237 0.000986 0.000553 0.000771 -0.002429 
+-0.000051 0.001946 -0.003486 0.001686 0.002914 -0.002145 
+0.003037 0.001396 -0.001972 0.003700 0.001612 -0.002274 
+0.002871 0.002365 -0.001523 0.000884 0.001803 0.000748 
+-0.000014 0.000054 0.002231 -0.002385 -0.002346 0.002346 
+-0.000484 -0.001516 -0.000688 0.001268 0.000645 -0.000419 
+0.000310 0.000075 0.000069 -0.001077 -0.002846 -0.000538 
+-0.001797 -0.002736 -0.000895 -0.001834 -0.000470 -0.002069 
+-0.000868 0.005403 -0.000759 -0.000441 0.002904 0.000134 
+0.000275 -0.001469 0.004184 -0.001856 -0.006042 0.000468 
+-0.000136 -0.004069 -0.000228 -0.000309 -0.003663 -0.003830 
+-0.000378 -0.006050 -0.005634 0.001639 -0.006737 -0.000543 
+0.000202 -0.001622 -0.000157 -0.000226 0.002857 -0.002203 
+-0.000423 0.003649 -0.003188 0.001026 0.001536 -0.001731 
+0.001286 0.000096 0.000687 0.000546 -0.000313 0.002255 
+0.001485 0.002526 -0.002109 -0.001238 0.001281 0.000055 
+-0.001370 0.000537 -0.002673 -0.001703 0.003058 -0.001611 
+-0.003364 0.002358 0.002042 -0.003332 0.000028 0.002749 
+-0.001649 -0.000550 0.001712 0.000382 -0.003105 -0.001481 
+0.001186 -0.000492 -0.001153 0.000594 0.001028 -0.000981 
+-0.000031 -0.000029 0.000991 -0.003078 0.001893 0.001424 
+-0.000169 0.000017 0.000311 0.001373 0.000072 -0.001431 
+0.001139 -0.000672 -0.000217 0.000562 -0.000667 0.001349 
+-0.000694 -0.001611 0.002833 -0.000065 -0.001281 0.000420 
+0.002753 -0.000157 -0.003589 0.005734 0.002185 -0.005462 
+0.005560 0.001427 -0.004430 0.002402 0.003926 -0.002197 
+0.000669 -0.001011 -0.002567 -0.000268 0.000167 -0.000413 
+-0.003981 -0.001474 0.000154 -0.001146 -0.001974 0.000355 
+0.000946 0.002939 -0.000183 0.001831 0.000797 0.000844 
+0.001591 -0.001555 -0.003124 -0.004169 -0.001477 -0.000263 
+-0.007368 -0.004211 0.007368 -0.006118 -0.009990 0.002956 
+-0.005673 -0.006960 -0.001702 -0.006584 -0.005120 -0.002853 
+0.000810 0.001405 0.005431 0.000785 -0.000870 0.001553 
+0.001098 0.000593 -0.004566 0.000364 -0.001524 -0.004175 
+-0.001276 0.000039 0.000831 -0.002537 -0.001179 0.002358 
+-0.000277 -0.000412 0.002051 0.000183 0.000411 0.000411 
+0.000670 -0.001143 0.000192 -0.003840 -0.003059 0.001873 
+-0.005373 -0.000552 0.009990 -0.006844 -0.001141 0.009921 
+0.001655 -0.005200 0.002068 -0.000031 -0.002311 -0.000593 
+-0.000366 0.001405 -0.000073 0.000720 0.003167 0.000911 
+0.000145 0.000259 -0.000241 0.002870 -0.002750 0.000798 
+-0.001006 -0.002101 0.001163 -0.001286 -0.002406 0.000156 
+-0.002747 -0.002957 -0.001269 -0.001025 -0.000172 -0.002394 
+-0.003546 -0.001073 0.002076 -0.004600 -0.000859 0.003275 
+-0.005424 -0.002712 0.004167 -0.005316 -0.004682 0.001390 
+-0.003586 -0.001326 0.000302 0.000938 0.001189 -0.001699 
+0.001300 -0.000754 -0.000261 0.001282 -0.000821 0.002935 
+0.001182 -0.003974 0.003402 0.001011 -0.002453 0.000796 
+0.000595 -0.001588 0.001638 0.000239 -0.001570 0.000567 
+-0.000320 -0.003803 -0.002666 0.000450 -0.003150 -0.002917 
+-0.000196 0.001819 -0.000909 -0.000711 0.003979 -0.000244 
+0.003150 0.002913 -0.000236 0.001752 0.000198 -0.001322 
+-0.000228 -0.002534 -0.000720 -0.000802 -0.003517 0.001266 
+0.000261 0.000250 0.002041 -0.000279 0.000446 0.001520 
+-0.000532 0.002227 -0.001619 0.001209 0.004668 -0.000080 
+0.000570 0.002570 0.000571 -0.001242 0.000527 0.001299 
+-0.001938 -0.000416 0.001627 -0.000139 -0.000539 -0.000435 
+0.000519 -0.001666 -0.000860 0.003045 -0.001181 -0.002004 
+0.003284 0.000993 -0.000943 0.004098 0.000524 -0.001252 
+0.003192 0.003761 -0.004560 0.005237 0.003021 -0.004977 
+0.002985 -0.000777 -0.002150 -0.000310 -0.002460 0.001395 
+-0.006106 -0.004021 0.000360 -0.004101 -0.004295 -0.002585 
+-0.002818 -0.002850 -0.002086 -0.002979 -0.001796 0.000938 
+-0.001516 -0.002879 0.000772 -0.004164 -0.001135 0.000631 
+-0.000080 -0.001782 -0.000738 -0.002718 -0.003664 -0.002265 
+-0.002390 -0.005220 -0.000619 0.000680 -0.003308 -0.000136 
+-0.000144 0.001567 -0.002069 -0.000031 -0.000740 -0.000417 
+-0.000176 -0.002734 -0.002007 -0.006020 -0.005549 0.001475 
+0.001137 -0.003411 0.003411 -0.000454 0.002021 0.000477 
+-0.000921 0.002575 -0.000599 -0.002883 -0.001144 -0.003032 
+-0.000329 -0.002048 -0.001802 -0.001805 -0.001549 -0.003098 
+0.001393 -0.003980 0.000249 0.001208 -0.000881 -0.000078 
+-0.000924 0.000188 0.000109 -0.003322 -0.002541 0.001347 
+-0.002355 -0.004239 0.005290 -0.003677 -0.002023 0.002987 
+0.001515 0.000247 0.000432 0.002101 0.000466 0.001912 
+-0.000784 0.002288 0.001904 -0.004339 -0.000811 0.005292 
+-0.000073 -0.001728 0.001528 -0.001096 0.001002 -0.001695 
+-0.000967 0.001000 -0.001933 -0.003534 -0.001847 0.001251 
+-0.004320 -0.003354 -0.000312 -0.003767 -0.001041 0.000145 
+0.000229 -0.001559 0.001651 0.001509 -0.002972 -0.000691 
+0.001663 -0.003164 -0.001770 0.002454 -0.003414 -0.000320 
+-0.001318 -0.003051 0.003616 -0.006667 -0.006006 0.003337 
+-0.007115 -0.004279 0.001298 -0.003835 0.000288 -0.000692 
+-0.000175 0.003582 -0.001507 0.001857 0.003467 -0.001532 
+0.001517 0.001070 -0.002587 0.000324 -0.000647 -0.001324 
+0.000220 -0.000548 0.000325 0.000513 -0.000093 0.001235 
+0.000225 0.000459 0.001580 -0.000218 0.001290 -0.000448 
+-0.001683 0.001948 -0.004595 0.000481 0.002621 -0.006127 
+-0.000208 0.002167 -0.001566 -0.000398 0.001722 -0.000629 
+0.000435 -0.000501 -0.000775 0.001122 0.000427 -0.004148 
+-0.000169 0.000508 -0.004194 -0.001679 -0.000468 -0.001600 
+-0.000640 0.000464 0.000512 -0.000561 -0.000840 0.002428 
+-0.003051 -0.000701 -0.000117 -0.001635 0.001745 -0.000762 
+-0.001765 0.002648 -0.000738 -0.000007 0.002073 -0.002746 
+0.002376 0.000175 -0.000396 -0.000686 -0.003481 -0.001541 
+-0.001272 -0.004554 -0.003311 -0.000524 -0.004445 -0.002768 
+0.001014 -0.002368 -0.002060 0.002814 0.000830 -0.001547 
+0.005526 0.000668 -0.001142 0.004254 0.005875 -0.006550 
+0.004259 0.001901 -0.005501 -0.000951 -0.000625 -0.000211 
+-0.003014 -0.002417 -0.001300 -0.003755 -0.001733 -0.001502 
+-0.003407 -0.002004 -0.000673 -0.001917 -0.001251 0.001007 
+0.000112 -0.001291 -0.000926 0.001074 -0.001516 -0.003201 
+-0.000068 -0.000606 -0.003185 -0.000487 -0.001109 -0.000420 
+-0.004948 -0.001624 0.005182 -0.006281 -0.004364 0.003513 
+-0.001732 -0.002292 -0.004034 -0.001834 -0.000284 -0.003599 
+0.002536 0.001048 0.000286 0.000311 0.001127 -0.000442 
+-0.000659 0.002125 -0.000562 0.001683 -0.000561 -0.003252 
+0.005206 0.006111 -0.008262 0.005680 0.000748 -0.006735 
+-0.001497 -0.003411 -0.001622 -0.004154 -0.005308 -0.001769 
+-0.001604 -0.005704 -0.000847 -0.002398 -0.003965 0.000215 
+-0.003706 -0.002266 0.000823 -0.000326 -0.003800 0.000614 
+-0.001546 -0.004227 -0.000024 -0.001773 -0.003176 0.000048 
+0.000176 -0.002595 0.000117 -0.001603 -0.002176 0.003321 
+-0.002550 0.000433 0.002566 0.000760 0.000657 0.000689 
+0.001471 0.001807 0.001605 0.001103 0.005497 -0.001463 
+-0.002661 -0.000515 -0.001372 -0.007086 0.000607 -0.000892 
+-0.004390 -0.000389 -0.000722 0.002012 0.000024 -0.000541 
+0.005894 -0.001575 0.000701 0.002400 -0.002864 0.000272 
+0.000118 -0.001155 -0.002287 -0.000191 -0.000954 -0.003185 
+-0.001163 -0.003028 -0.000622 -0.002719 -0.002864 0.001408 
+-0.002953 -0.002288 0.001091 -0.001522 0.000479 -0.000502 
+-0.000449 0.003470 0.000077 -0.001145 0.002901 0.001069 
+-0.000467 0.003267 -0.003030 -0.002213 0.001929 -0.003234 
+-0.001086 0.000149 -0.001513 -0.000166 0.000960 -0.000606 
+0.000048 -0.001230 -0.000408 -0.000325 -0.002079 -0.001916 
+-0.001983 -0.000394 -0.002878 -0.001122 0.003301 0.000158 
+-0.000163 0.001777 -0.000195 -0.000486 -0.001636 -0.001648 
+-0.002395 0.001450 -0.001010 -0.000105 -0.000156 -0.001470 
+0.000022 0.001514 -0.000601 0.000274 0.001509 0.000137 
+-0.001200 0.001200 -0.001040 -0.000660 0.000768 0.000001 
+0.001208 0.001389 -0.000940 0.002773 0.001372 -0.000823 
+-0.001821 -0.000073 0.001072 -0.004479 -0.002783 0.000790 
+-0.003822 -0.002548 -0.001321 -0.003154 0.000158 -0.001318 
+-0.003516 0.001732 -0.001070 -0.004312 0.000079 0.000549 
+-0.005714 -0.003463 0.001851 -0.004400 -0.001351 -0.000737 
+-0.000814 -0.000752 -0.001191 0.003508 0.003508 -0.006613 
+0.002108 0.005377 -0.005764 -0.002073 0.001749 -0.001732 
+-0.004681 -0.001961 -0.002668 -0.007681 -0.006416 -0.000515 
+0.001367 -0.004360 0.000878 -0.003110 -0.004211 0.000869 
+-0.001088 0.001516 0.000287 0.000541 0.004700 0.004684 
+0.004566 0.003736 0.003903 0.005025 0.008438 -0.002626 
+0.003542 0.004737 -0.000389 -0.002943 -0.000818 -0.002381 
+-0.001256 -0.003549 -0.003807 -0.001060 -0.001922 -0.001334 
+0.001251 0.001527 -0.004410 -0.000415 0.005383 -0.001516 
+0.002621 0.004516 0.001731 -0.001138 0.000000 0.000000 
+-0.001657 0.000238 0.001160 -0.000554 -0.002000 0.000415 
+0.003022 -0.001059 -0.003218 0.002157 -0.000623 -0.004411 
+-0.000231 -0.001015 -0.002031 -0.002197 -0.000947 0.001241 
+-0.002182 -0.001758 0.003207 -0.001115 -0.000913 0.000162 
+0.000433 -0.002787 0.001217 -0.000935 -0.004277 0.001338 
+-0.002610 -0.005246 0.002655 -0.004270 -0.002242 0.001602 
+-0.000045 -0.000224 -0.001628 -0.001535 0.000601 -0.001241 
+0.006255 0.004076 0.000422 0.004046 0.005083 -0.005066 
+0.002734 0.001244 -0.003346 -0.002261 0.000019 -0.002331 
+-0.002462 -0.007314 -0.003014 0.000597 -0.003668 -0.001871 
+0.003957 0.001192 0.001247 0.002444 0.003563 0.002305 
+0.000325 -0.001615 0.001132 -0.002847 -0.003750 0.003153 
+0.000448 -0.002463 -0.002537 0.006131 0.004489 -0.005219 
+0.004017 0.007410 -0.002562 -0.000925 0.001696 -0.000350 
+-0.000351 -0.001017 -0.000686 -0.001315 -0.002092 -0.000885 
+-0.000855 -0.000851 -0.003425 -0.001593 0.000969 -0.004723 
+0.000541 0.001878 -0.003757 -0.000189 0.000464 -0.001239 
+0.000115 -0.000589 0.000866 0.000218 -0.001560 0.001915 
+-0.000455 0.001282 0.001023 -0.001468 0.008540 -0.006374 
+0.000488 0.010415 -0.009107 0.003695 0.006770 -0.006778 
+0.001157 -0.000293 -0.001019 -0.000880 -0.003486 0.000845 
+-0.004350 -0.001480 0.001659 -0.001488 -0.001962 0.000410 
+0.000052 -0.000524 0.001157 -0.000137 -0.001901 0.001540 
+0.000661 -0.002261 0.000330 0.000397 -0.001596 -0.000002 
+-0.001176 -0.001714 -0.000857 -0.004831 -0.001831 -0.000915 
+-0.003213 -0.000870 -0.001004 0.000550 0.003197 0.000162 
+0.004051 0.005941 -0.002392 0.002304 0.002455 -0.001093 
+0.000275 0.000367 -0.000004 0.000598 0.001733 0.000146 
+0.004959 0.002553 -0.002171 0.003065 0.004291 -0.006748 
+0.000872 -0.001104 -0.002442 -0.000269 0.001377 0.000189 
+-0.001875 0.000152 -0.000636 -0.002684 0.000837 0.000139 
+-0.001386 0.001144 -0.000941 -0.001220 -0.000551 -0.001220 
+-0.000001 0.000787 0.000436 0.001198 0.002090 0.001459 
+-0.001014 0.001788 0.000440 -0.000344 0.002500 0.000459 
+-0.000148 0.002094 0.001383 -0.001674 0.002569 0.000497 
+0.000464 0.001153 -0.000258 0.002922 -0.000475 -0.000648 
+0.004403 -0.001069 -0.000707 0.003166 0.001813 0.001359 
+0.001431 0.001380 -0.000665 -0.000735 -0.000980 0.004264 
+-0.002106 -0.003137 0.008037 -0.005764 -0.006635 0.006935 
+0.000133 -0.001644 0.001311 -0.000288 -0.003862 0.002434 
+-0.000312 -0.005856 0.002280 -0.001434 -0.003850 0.002494 
+-0.001384 -0.000644 0.001637 -0.001669 0.000589 0.001465 
+-0.001421 -0.000501 -0.000485 -0.002568 -0.005258 0.004483 
+-0.002458 -0.000158 0.003183 0.000872 0.000194 -0.000147 
+-0.000066 0.002964 -0.003230 -0.000978 0.002982 -0.002356 
+0.000880 0.000854 -0.000379 -0.000397 -0.000911 0.000844 
+0.000425 -0.000020 0.000722 0.000829 0.000105 -0.000370 
+0.000091 -0.000488 0.000494 -0.003469 -0.003906 -0.001156 
+-0.005194 -0.002665 0.001777 -0.002519 -0.004170 0.001734 
+-0.002892 -0.003383 0.001610 -0.000877 -0.002779 0.000221 
+0.001196 -0.000698 -0.005815 0.004638 0.001810 -0.007664 
+-0.001114 0.000466 -0.004174 0.000351 -0.000375 0.001987 
+0.001288 -0.003647 0.000130 -0.003412 -0.004265 -0.002218 
+-0.000571 0.000877 -0.004916 -0.001188 0.002155 -0.005147 
+-0.001989 -0.000035 -0.001599 0.000557 -0.002316 0.001145 
+0.000020 -0.000626 0.002254 -0.000606 0.001758 0.001477 
+-0.004400 0.001508 0.000937 -0.000702 -0.002252 -0.002980 
+0.000224 -0.001557 0.000138 -0.000577 -0.000585 0.002311 
+-0.001296 0.000675 0.000856 -0.001998 -0.000242 0.000557 
+-0.003101 0.002791 0.000310 -0.004253 -0.002743 -0.000688 
+-0.002515 -0.004152 -0.000039 -0.001933 -0.002017 -0.000252 
+0.001967 0.001494 -0.002150 0.000902 0.000735 -0.002455 
+-0.001109 -0.002005 0.002375 -0.002645 -0.005165 0.005165 
+-0.000413 -0.004545 0.000000 0.003184 0.002648 -0.001060 
+0.003856 0.006450 -0.002460 0.001666 0.003741 -0.000735 
+-0.000311 -0.002523 0.000359 -0.001120 -0.005630 0.000968 
+-0.000859 -0.003435 0.000095 -0.000698 -0.000219 -0.000274 
+-0.001473 0.000122 0.000729 -0.004574 -0.002326 0.002248 
+-0.001055 -0.002500 0.006758 -0.002270 -0.003007 0.002546 
+0.000220 -0.000756 -0.000165 -0.000398 -0.002971 -0.001281 
+-0.003259 -0.005393 -0.000030 -0.003014 -0.000589 -0.001940 
+-0.001288 -0.000788 -0.002283 -0.002214 -0.001830 -0.002109 
+-0.010234 -0.007044 0.000640 -0.013244 -0.005905 0.005371 
+-0.006363 -0.002231 0.003778 0.001022 0.004433 -0.001818 
+0.003413 0.008571 0.000000 -0.002325 0.007222 -0.000673 
+-0.001288 0.005076 0.000000 0.000318 0.001902 -0.000399 
+-0.000710 -0.001157 0.003905 -0.002428 -0.003070 0.006282 
+0.002275 0.003517 -0.002223 0.001265 -0.000068 -0.000701 
+-0.001818 -0.001132 -0.001102 -0.000606 0.000242 0.002656 
+-0.002996 -0.001248 0.001605 -0.000141 0.002499 0.002362 
+0.000970 0.003913 0.000985 0.001209 0.000716 -0.000962 
+0.000476 0.000210 -0.000168 -0.000508 -0.002031 -0.001583 
+0.000339 -0.001394 -0.001978 -0.000163 -0.001015 -0.000284 
+0.001325 0.001548 -0.001040 0.000918 0.001482 -0.003490 
+0.002387 0.001085 0.000289 0.002847 0.004575 -0.001517 
+-0.000935 0.000935 -0.004472 0.000928 -0.001089 -0.000896 
+-0.000242 -0.000719 -0.000677 -0.001250 0.000496 -0.000695 
+-0.002598 0.003053 -0.000382 -0.002977 0.001894 -0.001398 
+-0.000402 0.000187 -0.001328 0.002067 0.000481 0.000048 
+0.003479 -0.000525 -0.001116 0.002782 -0.000198 -0.001838 
+0.002303 0.000377 -0.001661 0.000388 -0.001023 -0.003070 
+-0.001240 0.001163 -0.003798 0.000422 0.003167 -0.002851 
+0.002065 0.000688 -0.001087 0.000177 -0.000698 -0.000492 
+0.000037 -0.001426 -0.001252 0.000292 0.001841 -0.003368 
+-0.002682 0.000504 -0.000468 -0.002320 0.003464 -0.003855 
+-0.000374 -0.000301 -0.002291 0.000048 -0.000322 0.001085 
+-0.001815 -0.002895 -0.000097 -0.000710 0.000929 0.001913 
+-0.000067 0.000547 0.000673 -0.000124 -0.002149 0.000675 
+-0.001234 -0.004436 -0.000499 -0.002742 -0.003525 -0.000167 
+-0.001184 0.000105 -0.000342 0.001885 -0.001032 -0.000594 
+0.000631 -0.002541 0.000090 -0.002341 -0.002091 -0.003324 
+-0.002773 0.001681 0.000000 -0.001947 0.000559 0.000002 
+0.000916 -0.000169 -0.000086 0.002257 -0.001167 -0.000677 
+0.000414 -0.001556 -0.000510 -0.003387 0.000693 -0.002987 
+-0.004843 -0.003307 -0.001772 -0.006094 -0.002237 -0.001678 
+0.001386 -0.002772 0.002598 -0.001397 -0.004762 0.000698 
+0.000645 -0.004144 0.000592 0.001739 -0.002149 -0.000156 
+0.001294 -0.000687 -0.000144 -0.000458 -0.000534 -0.001374 
+-0.001768 -0.000973 0.001212 -0.005266 -0.000912 0.000929 
+-0.006005 -0.001720 -0.000132 -0.003201 -0.002127 -0.001590 
+0.000029 -0.003636 0.000020 0.001672 -0.002537 -0.000597 
+0.000318 0.000463 -0.000713 -0.000694 0.003000 -0.000832 
+-0.000200 0.000143 0.000108 0.000922 0.001162 0.000756 
+0.000071 0.000758 -0.000019 0.000594 0.000343 -0.000637 
+0.000078 0.001569 0.000571 -0.002773 0.001345 0.003109 
+-0.001066 0.000906 -0.001162 0.001168 -0.001241 -0.000730 
+0.004589 -0.000442 -0.002057 0.003194 0.000076 -0.001582 
+-0.001047 0.000164 0.000643 -0.004117 0.000059 0.002071 
+-0.003723 -0.001641 0.002026 -0.002028 -0.001217 0.000406 
+0.000455 0.000334 0.001304 0.001140 -0.000227 0.003288 
+0.001489 -0.001354 0.000938 -0.000695 -0.000910 0.000547 
+0.000731 0.002590 -0.002836 -0.001453 0.003229 -0.003843 
+-0.000993 0.004364 -0.000112 -0.001441 0.002223 0.000673 
+0.000041 -0.000472 0.000296 -0.000192 -0.002016 0.000962 
+-0.001598 -0.001066 0.002664 -0.000595 0.000298 0.002727 
+-0.000675 0.002802 -0.001646 0.000047 0.003503 -0.004531 
+0.002299 0.002847 -0.002299 -0.000240 -0.000684 0.000969 
+-0.000807 -0.002761 0.002222 0.000560 -0.002707 0.001086 
+0.001653 0.000136 0.000886 0.004769 0.000000 -0.003462 
+0.004587 0.002699 -0.001259 0.000633 0.004433 -0.003561 
+-0.000956 0.003735 -0.001868 0.000025 0.002107 -0.003706 
+0.000019 0.003884 -0.004700 0.003064 0.007440 -0.005603 
+0.004141 0.000273 0.002135 0.002254 -0.000432 0.004497 
+0.001783 -0.001091 0.003688 0.000070 0.000575 0.000562 
+-0.002385 -0.000207 -0.000181 -0.000911 -0.001642 -0.001118 
+0.000210 -0.003112 -0.000897 0.000179 -0.003333 -0.001487 
+0.000049 0.001747 -0.003300 0.002762 0.000000 -0.000921 
+0.003162 0.000313 -0.001282 0.000433 -0.001280 0.000361 
+-0.001066 -0.002887 -0.002737 -0.007288 -0.003051 -0.002288 
+0.000248 -0.000992 -0.000744 -0.000555 0.000590 -0.000795 
+-0.001401 0.000645 -0.001603 -0.001870 -0.001870 -0.002290 
+-0.000212 -0.002646 -0.000582 -0.000636 -0.001580 0.002533 
+-0.006155 -0.002684 0.002160 -0.005816 -0.003078 0.000682 
+-0.002991 0.001920 -0.001708 0.000434 0.005133 0.001360 
+0.000236 -0.000565 -0.001412 -0.000980 0.001733 -0.001255 
+-0.002857 -0.003346 0.000708 -0.001843 0.001228 -0.002313 
+0.000626 0.001652 -0.003113 0.000255 0.002051 -0.002078 
+-0.001318 0.000451 -0.001777 0.000388 0.001567 -0.001447 
+0.001108 0.002869 -0.002131 0.001944 0.000873 -0.001865 
+-0.002025 -0.000750 -0.000393 -0.001251 -0.001847 -0.001289 
+-0.003814 0.002869 -0.002380 -0.005824 0.000138 0.001386 
+-0.003991 -0.002301 0.002917 -0.000522 -0.002436 0.002378 
+0.000565 0.000905 0.000281 0.001102 0.000236 -0.001261 
+0.002833 0.002433 -0.000837 0.002394 0.002307 -0.002359 
+-0.000576 0.001211 0.001037 -0.005105 -0.001522 0.003202 
+-0.008538 -0.000875 0.001715 -0.006435 0.001603 0.002145 
+-0.000984 0.002820 0.001138 0.003196 0.000721 0.003634 
+0.004125 0.000005 0.003727 -0.000336 0.000295 0.000593 
+-0.001033 -0.002339 0.001681 -0.001422 0.002413 -0.002408 
+-0.000524 0.002020 -0.004833 -0.001380 0.005731 -0.001963 
+-0.001650 0.003128 -0.000574 -0.000329 0.000794 0.000675 
+0.000084 -0.000336 0.000336 0.000855 0.000841 -0.002063 
+0.003852 0.003614 -0.004463 0.005808 0.005438 -0.005942 
+0.005856 0.000459 -0.009069 0.005648 0.004277 0.000098 
+0.005485 0.003374 -0.001392 0.002586 0.000229 -0.000647 
+-0.001124 -0.000881 0.000232 -0.000664 -0.000776 0.000607 
+0.001833 -0.000296 -0.000945 0.004594 0.000988 0.000644 
+0.000426 -0.000693 0.003945 -0.002241 -0.001450 0.003954 
+-0.000317 0.000666 0.000336 0.000169 0.000349 0.000606 
+-0.000216 0.002326 -0.001466 -0.000096 0.002963 0.001255 
+-0.004306 0.003030 -0.000333 0.001882 -0.000719 0.003324 
+0.000604 -0.001148 0.001906 0.000387 -0.001498 -0.002896 
+0.006405 0.002137 -0.005337 0.001035 -0.000087 -0.000164 
+-0.002293 -0.001266 0.000248 0.001985 0.000481 -0.001684 
+-0.000779 0.000657 -0.002700 0.001440 0.007200 -0.003840 
+0.003487 0.004360 -0.000434 0.001489 0.003766 0.000437 
+0.001813 0.001036 -0.001282 -0.000416 0.000706 -0.002988 
+-0.001222 0.001204 -0.000989 0.000141 -0.000484 -0.000315 
+-0.004709 -0.003434 0.007505 0.001197 -0.000653 0.006535 
+0.003021 -0.000944 0.000782 0.001822 -0.000617 0.000535 
+0.000061 0.001291 0.001844 -0.004005 -0.001502 0.002503 
+-0.003346 -0.004840 0.002530 -0.001495 -0.003865 0.003201 
+-0.000347 -0.000139 0.002836 -0.000382 0.002170 0.001724 
+-0.001569 0.001635 0.000915 -0.004212 0.000242 0.002934 
+-0.005829 -0.001926 0.003231 -0.004428 -0.002072 0.000196 
+0.000700 -0.001781 -0.000508 0.002412 -0.002284 -0.001823 
+-0.000369 -0.000620 -0.001477 0.001030 -0.000179 -0.001703 
+-0.005328 -0.001238 0.001088 -0.002968 -0.006115 0.001467 
+-0.000163 0.000788 0.000041 -0.000745 0.002562 0.002232 
+0.002164 0.004739 0.000187 0.002390 0.003475 -0.001059 
+0.001296 0.000470 0.001144 0.001309 -0.001411 -0.002088 
+0.000822 -0.000891 0.001341 0.001407 -0.002135 0.001906 
+-0.001373 0.001326 0.003839 -0.005773 -0.009010 0.003237 
+-0.004556 -0.006746 0.000167 -0.001405 -0.001516 -0.000386 
+-0.000084 0.000497 -0.001318 0.001278 0.002431 -0.003915 
+0.000629 0.001350 -0.002113 -0.000948 0.000397 0.002172 
+-0.001420 -0.000598 0.003134 -0.001266 -0.000070 0.001559 
+-0.000530 0.000344 -0.000036 -0.000226 0.000385 -0.000671 
+0.000640 0.002003 -0.001487 0.002156 0.002927 -0.004777 
+0.000613 0.005531 -0.007866 -0.000229 0.006057 -0.005495 
+-0.001733 0.002026 -0.001042 -0.002832 -0.001486 -0.000337 
+-0.000916 -0.000458 0.000000 -0.000396 0.000628 0.000176 
+-0.000124 0.000382 0.000060 0.002999 0.002030 -0.000500 
+0.004815 0.004561 -0.004257 0.007255 0.006412 -0.002025 
+0.007005 0.001247 -0.000256 0.002751 -0.002989 -0.001614 
+0.000598 0.001403 -0.003312 0.004026 0.001882 -0.002628 
+0.005697 -0.001794 -0.000764 0.000469 -0.003743 0.002334 
+-0.001525 -0.004065 0.003558 -0.004068 -0.000287 0.002742 
+-0.002958 0.003773 0.001080 -0.000409 0.001950 0.000818 
+0.000101 -0.001499 -0.000982 0.001570 -0.004171 -0.002466 
+0.002006 -0.002621 -0.004048 0.001347 -0.001668 -0.002495 
+0.002693 0.000257 -0.000696 0.002319 0.005101 -0.000066 
+0.001418 0.006371 0.000516 -0.000394 0.000866 0.000236 
+0.001292 -0.001292 -0.001292 0.000469 -0.000859 0.000938 
+0.000066 -0.000589 0.000499 -0.000509 0.000953 -0.002662 
+-0.002955 -0.000433 -0.000793 -0.001371 -0.002314 0.001445 
+-0.001302 -0.005695 0.003150 -0.000234 -0.006810 0.005099 
+0.001176 0.001311 0.002622 0.001000 -0.000082 -0.000051 
+0.000186 0.001122 -0.000048 0.002804 0.001224 -0.002647 
+-0.000113 -0.000957 -0.000450 -0.002187 -0.000836 0.000899 
+-0.002833 0.000081 0.001628 -0.001120 0.001127 0.002251 
+-0.000979 -0.000184 0.000449 -0.000524 -0.000596 0.001813 
+0.001599 0.001572 0.002304 0.000496 0.005950 0.002975 
+0.000808 0.004390 0.001294 0.000000 0.001163 0.000000 
+0.001209 0.003914 -0.002361 0.003905 0.006544 -0.005803 
+-0.001319 0.004001 0.000674 -0.000064 -0.000500 0.000445 
+-0.001070 -0.002437 0.002680 -0.000278 0.000000 0.000556 
+0.004101 0.007107 -0.002324 0.007331 0.006204 -0.003387 
+0.003252 0.001268 -0.004267 0.004117 0.002018 -0.001063 
+0.002977 -0.001374 0.002977 0.004524 -0.001970 0.002777 
+0.005827 -0.000786 0.000604 0.002190 -0.001533 0.000876 
+0.000631 0.000441 0.000209 -0.001072 -0.001521 0.000081 
+-0.000330 0.000512 0.001218 0.004234 0.001950 -0.002006 
+0.004049 0.000908 -0.005032 0.000400 0.000241 -0.000327 
+-0.005014 -0.003028 0.002058 -0.004668 -0.001656 0.001227 
+-0.000223 -0.000635 -0.001057 0.000200 -0.001770 -0.002617 
+-0.002216 -0.001222 -0.001854 -0.002966 -0.000223 -0.000234 
+-0.000188 0.001028 -0.001278 0.002677 -0.000272 -0.003995 
+0.005185 0.000741 -0.001926 0.001926 0.001973 -0.000587 
+-0.001114 0.003301 -0.000705 -0.001084 0.004296 -0.001076 
+-0.000795 0.003896 -0.001634 0.000477 0.004195 -0.003326 
+0.002451 0.004850 0.000600 -0.001133 0.002030 0.002303 
+-0.000429 0.002405 0.003756 0.001795 0.002956 0.001575 
+0.006593 0.003921 -0.002810 0.003583 0.000833 -0.008833 
+0.005346 0.002717 -0.005718 0.002027 0.002259 0.000286 
+0.000680 0.001097 0.000205 0.004597 0.000570 -0.001292 
+0.004385 -0.001161 0.000796 0.001063 -0.001364 0.000285 
+0.000497 -0.002262 -0.000267 -0.000472 -0.002726 -0.001680 
+-0.003178 0.000631 -0.004451 0.002026 0.003569 -0.007044 
+0.002037 0.001245 -0.003959 -0.000740 -0.000135 -0.000313 
+-0.002093 0.000465 -0.000465 -0.004462 0.002075 -0.001132 
+-0.006397 0.000338 -0.001284 -0.005241 -0.003251 -0.001275 
+-0.001787 -0.004159 -0.001190 0.002276 -0.002846 -0.002846 
+0.001935 0.004839 -0.000968 0.002088 -0.001023 0.000005 
+0.000231 -0.003271 -0.002626 -0.000374 -0.004659 0.002233 
+-0.000114 -0.000142 -0.000082 -0.001625 0.001884 0.000954 
+0.003595 0.001729 -0.001653 0.005403 0.004390 -0.003763 
+0.001466 0.003424 -0.005385 0.000838 0.000363 -0.001751 
+-0.001643 0.001669 -0.000506 -0.000479 0.000959 0.001240 
+-0.000861 0.000519 0.002286 -0.001084 -0.000908 0.002364 
+-0.000045 0.000499 0.002762 -0.000293 0.000842 0.001898 
+0.000528 0.000480 0.001399 0.000487 -0.001075 0.002129 
+0.001414 -0.001278 -0.000707 -0.000611 -0.000141 -0.001709 
+-0.002636 -0.002475 -0.002989 -0.005096 0.001377 -0.002700 
+-0.001172 -0.004057 0.003719 -0.000362 0.000545 0.005716 
+0.004419 0.003227 -0.000756 0.005315 0.003816 0.003033 
+0.002368 0.000075 0.002368 0.003281 -0.002891 -0.000078 
+0.003145 0.002926 -0.000503 -0.002391 0.002469 -0.000810 
+-0.001948 -0.001308 -0.002597 -0.000601 0.000480 -0.000455 
+-0.001918 -0.000240 0.002559 -0.002485 -0.002829 0.002760 
+0.001387 -0.000699 0.000781 0.002795 -0.000385 0.002681 
+0.001150 -0.000233 0.003134 -0.000576 -0.000186 0.000594 
+0.000433 0.000974 -0.002562 0.001092 0.000272 -0.001245 
+0.001931 0.000480 -0.000691 0.002129 0.000685 -0.000465 
+0.001149 -0.000403 -0.002482 0.000545 -0.000483 -0.002294 
+0.000365 -0.001072 0.000402 0.000398 -0.000015 0.000116 
+-0.000995 0.001024 -0.001130 0.000301 -0.000434 -0.001336 
+-0.003043 0.000853 -0.000975 -0.001890 0.000301 0.000730 
+-0.001048 0.000171 0.000007 -0.000450 0.003364 -0.002119 
+-0.001597 0.004591 -0.002894 0.000202 0.003843 -0.001213 
+-0.003813 0.002521 -0.001107 -0.000763 -0.000981 -0.001223 
+-0.001773 -0.001305 -0.001256 -0.000174 0.000129 -0.000258 
+-0.000063 -0.001817 0.001373 -0.000670 -0.001589 0.001520 
+0.000906 0.000384 -0.000590 0.005170 0.002745 -0.000168 
+0.005398 0.003109 0.003072 0.001503 0.000860 0.002148 
+0.001365 -0.001999 -0.002109 0.003308 0.000000 -0.004615 
+0.002872 -0.003065 -0.003210 0.002393 -0.000699 -0.000485 
+0.000551 0.000562 0.000984 -0.000756 0.001024 -0.000567 
+0.000462 -0.001692 -0.000615 0.002444 -0.001265 -0.000139 
+0.004998 0.001329 -0.002671 0.002506 0.004541 -0.003234 
+0.003704 0.002831 -0.002090 0.000792 -0.000982 -0.000413 
+0.001322 0.000592 0.004559 -0.000036 0.002910 0.000015 
+-0.001443 0.005116 0.002165 0.000804 0.005470 0.002446 
+0.002513 0.001743 0.000604 0.002899 -0.000264 -0.002672 
+0.003374 0.002008 -0.008233 0.005021 0.005966 -0.006239 
+0.001118 0.002670 -0.002359 -0.001020 -0.000310 0.001826 
+-0.000061 0.000300 0.001824 -0.000421 0.000901 0.000311 
+0.000182 0.001043 -0.001387 0.000944 0.000482 -0.001201 
+0.000301 -0.000589 0.000663 -0.002072 -0.002164 -0.000518 
+-0.004870 -0.000511 0.001233 -0.002685 -0.003023 0.000655 
+-0.000182 -0.003255 -0.000990 0.001760 -0.000600 -0.002920 
+0.000903 0.000484 -0.000452 -0.000468 0.002846 -0.001549 
+-0.000333 -0.000339 0.003009 -0.000442 -0.004993 0.004330 
+-0.001840 -0.001391 0.003552 -0.001990 0.000905 -0.001269 
+-0.002359 0.000779 -0.001614 0.000119 0.003652 0.000688 
+0.005111 -0.000449 -0.000641 0.002224 -0.001458 -0.000436 
+0.000772 -0.000235 -0.000804 -0.001569 -0.002173 0.004044 
+-0.004155 -0.005352 0.003873 -0.000490 -0.002786 -0.000045 
+-0.001803 0.001873 -0.000197 -0.000155 0.000000 -0.001008 
+-0.001441 -0.000064 -0.000244 -0.002704 -0.000525 0.000274 
+0.000143 -0.000192 0.000514 0.003863 0.001842 -0.002053 
+0.001749 0.004658 -0.001226 -0.000015 0.003335 0.001759 
+-0.000199 0.001365 0.001432 -0.000290 -0.000667 -0.000030 
+-0.000398 -0.002301 0.000215 0.000179 -0.001792 0.000537 
+-0.001109 0.000465 -0.002594 0.000994 0.001771 -0.005615 
+0.001918 0.002071 -0.007723 0.005024 0.001615 -0.004575 
+0.000705 0.000329 0.000357 0.001703 0.002424 -0.000960 
+0.005927 0.002443 -0.004163 0.007349 0.001157 -0.005267 
+0.006136 0.001678 -0.003424 0.000593 0.004956 -0.002974 
+0.000914 0.001371 -0.001053 -0.002135 0.000041 0.002259 
+-0.003885 -0.000134 0.001708 0.000545 -0.005224 0.003267 
+-0.002071 -0.002134 0.000890 0.002122 -0.000267 -0.000877 
+0.002254 -0.000819 0.000526 -0.001325 -0.000975 -0.002495 
+-0.001937 0.000035 -0.004736 -0.003757 -0.003362 -0.003563 
+-0.000580 -0.004403 -0.002255 0.000722 -0.002709 -0.003075 
+0.000251 -0.002868 -0.002022 0.000143 -0.001356 -0.000731 
+-0.000702 -0.001228 -0.000222 -0.001889 0.000759 -0.001422 
+0.000905 0.000803 -0.000402 0.000795 -0.000668 -0.001287 
+-0.001590 -0.001142 -0.000408 -0.003474 -0.002332 -0.000755 
+-0.002753 -0.002112 -0.000327 0.000836 0.002756 -0.000898 
+0.004587 0.003147 0.000853 0.003139 0.005195 0.000823 
+-0.000367 0.001837 -0.000735 -0.001385 0.000207 0.000176 
+-0.001550 0.000085 -0.000597 -0.000543 0.000153 -0.001378 
+0.000781 0.001139 -0.001258 0.002270 0.002031 0.000649 
+0.003689 0.001946 0.002166 0.003591 0.000767 0.002818 
+0.002308 -0.000654 0.000837 0.001316 -0.000917 -0.003389 
+-0.000913 0.002575 -0.002880 -0.003183 -0.001707 -0.003638 
+-0.003254 -0.001205 -0.003821 -0.004560 0.000667 -0.002600 
+-0.000796 0.000294 0.000845 0.000198 -0.002137 0.000700 
+0.000732 -0.004593 0.003618 0.001031 -0.005887 0.001237 
+0.001315 -0.002627 0.000660 0.001338 0.000051 -0.001237 
+0.000494 -0.000831 -0.001126 -0.000068 0.000013 0.000167 
+-0.002491 -0.002591 0.000081 0.000265 -0.000847 0.000040 
+0.000378 -0.002652 0.005687 0.000071 -0.000053 0.001852 
+0.000348 0.005040 -0.000983 -0.000676 0.002832 -0.000475 
+0.000189 -0.000757 -0.002448 0.000247 -0.001070 0.000437 
+-0.000296 0.001570 0.001751 -0.000127 -0.000790 0.001863 
+-0.000457 -0.000481 0.004090 -0.000847 -0.003295 0.003931 
+0.001049 -0.000401 0.002514 0.004180 0.001306 -0.001288 
+0.003551 -0.000721 -0.000021 0.001112 0.000770 0.001041 
+-0.001097 -0.001363 0.004060 -0.000647 0.001902 0.002378 
+0.002509 0.001079 0.000958 0.003274 -0.000660 -0.000005 
+0.001029 -0.001521 -0.002340 0.001634 0.000401 -0.003769 
+0.004698 0.001413 -0.002231 0.006016 0.003139 -0.000932 
+0.005773 0.006278 -0.005063 0.003302 0.001549 -0.007365 
+0.004649 0.003553 -0.003079 0.001348 0.002214 -0.003369 
+0.001010 0.000734 -0.003511 0.000697 0.001627 -0.002791 
+0.000564 0.001900 -0.000355 -0.000846 0.000923 0.002000 
+-0.000353 -0.000588 0.000923 0.001374 0.001003 -0.001616 
+0.000205 0.004817 -0.005330 0.004488 0.004971 -0.003418 
+-0.000702 0.000486 0.000116 -0.000510 0.000926 -0.001765 
+0.000406 0.000414 -0.001604 -0.001065 0.000286 -0.001860 
+-0.002026 0.000806 -0.003870 -0.003880 0.001407 -0.003173 
+-0.001700 0.001284 0.000092 -0.001301 -0.000383 -0.000302 
+-0.001556 -0.001111 0.001333 -0.000460 -0.001493 0.002066 
+-0.000736 -0.000047 0.002421 -0.000592 -0.000993 0.001978 
+-0.000546 -0.000107 -0.000024 0.000580 -0.001332 -0.000840 
+0.003168 0.000468 -0.001644 0.002105 0.004060 -0.001805 
+0.000396 0.002749 -0.000310 -0.000370 0.000257 -0.000233 
+0.000631 0.000345 -0.000774 0.000856 0.002159 0.001191 
+0.003336 0.002575 0.000979 0.001636 0.000479 -0.001745 
+-0.001048 0.000304 -0.001331 -0.004578 0.000883 -0.000502 
+-0.005960 0.000614 0.002257 -0.000895 -0.000084 -0.000469 
+0.000302 0.000414 0.000231 -0.000105 0.000747 0.000343 
+-0.000318 0.000185 -0.000477 0.000326 -0.000139 0.000293 
+-0.002014 -0.000948 -0.001126 -0.003741 -0.005111 0.003741 
+-0.001770 -0.003125 0.002749 0.000555 -0.001789 -0.000444 
+-0.001908 -0.003308 -0.001806 -0.000574 -0.004001 -0.001690 
+-0.001829 -0.002428 0.001349 0.003294 -0.000889 0.000824 
+0.003739 0.003793 -0.003308 0.006680 0.001085 -0.006764 
+0.001439 -0.001498 -0.005332 0.000783 -0.001536 -0.000874 
+-0.000350 -0.000111 0.002621 -0.002182 -0.001662 -0.000068 
+-0.001160 -0.003708 -0.001898 -0.001391 -0.003025 -0.002429 
+-0.002003 -0.000139 -0.002111 0.000063 0.000451 0.000743 
+-0.001339 -0.001260 0.002047 0.000821 -0.001784 -0.000928 
+-0.000984 -0.003552 -0.000768 -0.000336 -0.001716 -0.002425 
+0.000683 -0.001395 -0.002591 0.003372 -0.003720 0.000522 
+0.000407 -0.000034 0.001425 0.000963 0.001408 0.000590 
+-0.001495 0.004583 0.001593 -0.000386 0.002902 0.002322 
+-0.000050 -0.002306 0.002206 -0.002372 -0.005017 0.000524 
+-0.001987 -0.003756 0.002872 -0.002567 -0.001645 0.002343 
+0.001303 -0.002171 -0.000547 0.001458 -0.004305 0.000417 
+0.002148 -0.003771 0.001468 -0.002543 -0.002672 0.002543 
+-0.000520 0.000280 0.002238 0.000108 0.001973 -0.001235 
+0.000940 0.002336 -0.003761 0.004783 0.002319 -0.002464 
+0.002119 0.001504 -0.000013 -0.000460 0.000032 0.000517 
+0.001069 -0.001069 -0.001603 0.002629 -0.000199 -0.005677 
+0.003492 -0.000650 -0.004508 0.003145 0.000417 -0.000730 
+0.003455 0.002709 0.003127 0.002931 0.000825 0.003597 
+0.001406 -0.000020 0.002000 -0.000187 0.000075 -0.000652 
+-0.001132 -0.001034 -0.002707 -0.001212 -0.000571 -0.002565 
+0.001534 0.000450 -0.002037 0.002794 0.000227 -0.000327 
+-0.001277 0.000709 -0.000880 -0.001329 0.003880 -0.000712 
+0.001010 0.002045 0.000866 0.002838 0.000233 -0.000191 
+0.002957 0.000036 -0.001366 0.000407 0.000402 -0.000403 
+-0.003473 0.001638 -0.001026 -0.004744 0.002154 -0.002403 
+-0.000971 0.006853 -0.002199 0.003129 0.005975 -0.004268 
+0.000864 -0.000288 -0.002480 -0.001215 -0.000607 -0.000304 
+0.000277 0.001456 -0.001394 0.000207 0.001322 -0.003777 
+-0.000940 0.000447 -0.001533 -0.004773 -0.001952 0.005380 
+0.000562 -0.001872 0.006885 0.001970 -0.001607 0.002865 
+0.000000 -0.000866 -0.002913 0.002320 0.001298 -0.001038 
+0.001181 -0.000945 -0.000472 0.000289 -0.001270 -0.000257 
+-0.000082 -0.000264 0.000116 0.001246 0.002107 -0.001447 
+0.002244 0.003881 -0.001065 0.002549 0.001266 -0.000966 
+0.001468 -0.000605 -0.002236 0.000495 -0.001521 -0.003213 
+-0.000435 -0.001151 -0.002943 -0.000405 -0.000880 -0.001772 
+-0.000461 -0.000376 -0.000653 0.002404 0.001134 -0.000937 
+0.003608 0.004917 -0.001631 0.001947 0.003316 0.003053 
+-0.000089 -0.005853 -0.002982 -0.000480 -0.008812 -0.002777 
+-0.005006 -0.007359 -0.000585 -0.005207 -0.002346 0.003087 
+-0.003088 0.000201 0.002609 -0.000755 0.000738 -0.000041 
+0.003581 0.002151 -0.002880 0.004231 -0.000201 -0.002618 
+0.000967 -0.000232 -0.000559 -0.001896 -0.000318 -0.000789 
+-0.003734 -0.001851 -0.000065 -0.002640 -0.000988 -0.000120 
+-0.000304 0.000073 -0.000493 -0.000351 0.000070 0.000438 
+-0.000221 0.002801 -0.000934 -0.002501 -0.000265 0.003119 
+-0.002843 -0.000332 0.003001 -0.002954 -0.001604 -0.000068 
+-0.002264 -0.000965 -0.002132 -0.001314 -0.001299 -0.001979 
+0.000372 -0.000819 -0.001117 -0.000740 -0.000997 -0.002051 
+-0.003454 -0.007359 0.000434 -0.001335 -0.003761 0.004206 
+0.001566 -0.001691 0.000705 0.000555 -0.000261 -0.003085 
+0.001645 0.001942 -0.004523 0.003836 0.002547 -0.003407 
+0.004138 0.004040 -0.001824 0.002542 0.004149 -0.003933 
+0.002235 0.003919 -0.005830 0.001403 0.004224 -0.006325 
+0.005657 0.003433 -0.003236 0.003783 -0.000639 -0.002458 
+0.001748 -0.001132 -0.001541 0.000006 -0.002109 -0.000048 
+0.000040 -0.001156 0.001250 0.001912 -0.000462 0.001880 
+0.001396 0.002349 0.004442 0.002168 0.003182 0.001445 
+-0.002644 0.001232 0.000291 -0.005998 0.001673 -0.000140 
+-0.003984 -0.000450 0.000434 0.001101 0.001796 -0.004118 
+-0.001223 -0.001361 -0.003345 0.001861 -0.001093 -0.001803 
+-0.000984 -0.000492 0.001905 -0.000932 -0.004366 0.001047 
+-0.000829 -0.002598 -0.003841 -0.001929 -0.001957 -0.005927 
+0.000032 -0.002647 -0.003572 -0.000350 -0.002803 -0.000281 
+-0.001005 -0.004974 0.000899 -0.000719 -0.004619 0.000760 
+-0.000925 -0.001870 0.000054 -0.003064 -0.000816 -0.000858 
+-0.002655 0.001650 0.001288 -0.005389 -0.002241 0.009265 
+-0.005717 -0.004539 0.008909 -0.003117 -0.001274 0.001843 
+0.000075 -0.000526 0.000080 0.000416 -0.000197 -0.002981 
+0.000770 -0.000578 -0.004000 0.003030 -0.001224 -0.003351 
+0.004945 0.004208 -0.004234 0.003099 0.003410 -0.004146 
+0.000451 -0.000121 0.000407 -0.000755 -0.003508 0.000355 
+-0.002267 -0.000643 -0.001763 -0.003174 -0.000258 -0.001429 
+-0.002234 0.000422 0.000181 -0.002113 -0.001714 0.005283 
+0.001989 -0.000697 0.006562 0.000129 -0.000902 0.004318 
+0.000667 0.000388 -0.001333 0.004606 0.000772 -0.001731 
+0.003003 0.000500 -0.002344 0.001208 -0.004407 0.002665 
+-0.000931 -0.006316 0.000093 0.002540 -0.004426 -0.000500 
+0.002568 -0.003737 -0.001355 0.001715 -0.003036 -0.001671 
+0.000499 -0.001624 -0.000480 -0.000525 -0.000935 0.001576 
+-0.000484 -0.000814 0.003486 0.001685 -0.001688 0.003351 
+0.001285 -0.001232 -0.000439 -0.001650 -0.001464 -0.001739 
+-0.001034 -0.001369 0.000558 0.001377 0.001579 0.001224 
+0.002022 0.001960 0.003431 0.000165 -0.000316 0.000276 
+0.003636 0.002238 0.000000 0.000284 0.000227 -0.001390 
+-0.001423 0.001149 0.000774 -0.001788 0.001643 0.003101 
+0.000289 0.001301 0.001882 -0.001665 -0.000222 -0.000730 
+-0.001740 0.001212 0.000014 -0.000601 0.000689 -0.001010 
+-0.000477 -0.000225 -0.002371 0.001126 0.001351 -0.004030 
+0.000666 0.000499 -0.002117 -0.001619 -0.001536 0.002744 
+0.001327 -0.002211 0.004965 0.000674 -0.002191 0.002889 
+0.001388 0.000235 -0.003359 0.004244 0.005079 0.000943 
+0.001510 0.002591 0.002202 0.003715 -0.000662 -0.000086 
+0.001216 0.000698 -0.000060 -0.003671 -0.000683 0.001665 
+-0.000925 -0.001388 0.003233 0.001642 0.001940 -0.001791 
+-0.000693 0.004924 -0.003467 0.005092 0.007358 -0.004246 
+0.000188 0.003966 -0.006185 -0.004218 0.004299 -0.001540 
+-0.003355 0.002479 -0.002553 -0.001337 0.001700 0.001059 
+0.001863 -0.000082 0.001731 0.004575 0.002778 0.001144 
+0.001285 -0.001183 -0.001955 -0.000282 -0.000897 -0.001179 
+-0.001164 -0.002687 -0.002552 -0.002978 -0.005184 -0.001103 
+0.000000 -0.004015 -0.001818 0.000370 -0.001323 -0.001164 
+-0.003018 0.000104 0.001302 -0.003053 -0.000383 -0.001574 
+-0.000565 -0.002036 -0.001414 0.003354 -0.002093 -0.003560 
+0.001587 -0.001041 -0.001249 0.001216 -0.001619 -0.000242 
+0.000155 0.001240 0.002636 -0.003007 -0.008128 0.004917 
+-0.002315 -0.005993 0.006152 0.001648 -0.001697 0.002375 
+-0.003085 -0.003440 -0.001829 -0.002413 -0.002855 0.001250 
+0.000913 -0.003621 0.000248 -0.000806 -0.004028 0.001654 
+0.000185 0.000169 0.000998 0.000950 -0.002557 -0.000649 
+0.000211 -0.001355 0.000091 0.000050 -0.001165 0.000886 
+-0.001600 0.000296 0.003319 -0.002068 0.000689 0.001591 
+-0.000709 0.000522 -0.001007 -0.000896 0.000022 -0.000013 
+0.000713 0.000033 0.002578 0.000767 -0.000493 0.000229 
+-0.000254 0.000507 0.000000 0.002166 -0.000209 0.000846 
+0.003542 0.000161 0.001104 0.001394 -0.001338 0.000757 
+-0.001723 -0.002147 0.004134 -0.003784 -0.001779 0.005840 
+-0.004205 -0.004356 0.008485 -0.006047 -0.004279 0.011907 
+-0.006583 -0.003514 0.011228 -0.004412 -0.002152 0.002888 
+-0.001973 0.003627 -0.000853 -0.002299 0.000721 -0.001961 
+-0.000229 -0.001460 -0.001722 0.001089 -0.003252 -0.000943 
+0.000530 -0.002613 -0.000925 0.000148 -0.000510 -0.000167 
+0.000030 0.000930 -0.000586 -0.000118 -0.000021 -0.000516 
+0.000598 -0.000678 -0.000346 0.000795 0.001050 0.001358 
+-0.002221 0.000523 0.002586 -0.001365 -0.001467 0.006788 
+-0.001338 -0.001798 0.006438 0.000014 -0.001215 0.001285 
+0.000773 0.002603 -0.003569 0.003178 0.007925 -0.002034 
+0.000537 0.007336 -0.000246 0.000803 0.003285 0.000657 
+-0.005889 -0.002659 0.002406 -0.006360 -0.006355 0.005725 
+-0.003416 -0.004678 -0.000182 0.002778 -0.002556 -0.002190 
+0.001027 0.001908 -0.006897 -0.000282 0.001860 -0.000040 
+-0.000200 -0.001059 0.000286 0.003516 -0.003289 -0.001399 
+0.000780 -0.001623 -0.003836 0.003955 0.003507 -0.003955 
+0.004109 0.005974 -0.002521 0.000068 -0.000046 -0.000815 
+-0.000483 0.001353 0.002222 -0.003325 -0.000382 0.002790 
+-0.000159 -0.000298 0.000298 0.000900 0.001232 -0.004620 
+0.006278 -0.000194 -0.006472 0.002468 -0.002429 -0.004952 
+0.001532 -0.001053 -0.001656 0.001310 0.001163 -0.002061 
+0.002190 0.005146 -0.000766 0.002223 -0.000523 -0.004314 
+0.002921 -0.004309 -0.002555 -0.001312 -0.009927 -0.000572 
+-0.003777 -0.004868 0.005624 -0.001245 0.000515 0.004379 
+-0.001413 0.002185 -0.000300 -0.004152 0.000769 -0.000779 
+-0.005191 -0.000823 0.000118 -0.002357 -0.000357 0.002036 
+0.001328 -0.001328 0.000000 0.003569 -0.003386 -0.000649 
+0.000708 -0.004462 -0.000413 -0.003703 -0.002432 0.002499 
+-0.005147 -0.000074 0.003603 -0.002219 0.000959 0.001652 
+0.000769 -0.001885 -0.001885 0.002792 -0.001955 -0.001957 
+-0.000876 -0.000292 -0.001387 -0.006691 0.000077 0.000066 
+-0.007546 -0.001460 0.004528 -0.001465 0.000559 0.004881 
+0.002697 -0.002646 0.000051 0.004427 -0.002198 -0.002931 
+0.006832 -0.000762 -0.002387 0.005984 0.002981 -0.005609 
+0.003158 0.000434 -0.006606 0.000333 -0.001000 -0.005447 
+0.001483 0.001297 0.000710 -0.001385 -0.001102 0.001051 
+-0.000411 0.000196 0.000788 -0.000054 0.002423 -0.001924 
+-0.000308 0.002730 -0.000947 -0.002236 -0.000535 -0.001458 
+0.000144 -0.002611 -0.002315 0.000652 -0.000790 -0.001177 
+0.003160 0.000320 0.001240 0.001253 0.001528 -0.001822 
+0.001646 0.000110 -0.001564 0.001779 -0.001271 -0.000149 
+0.000430 -0.000468 0.000053 -0.000594 0.000107 -0.001238 
+-0.000100 -0.000152 -0.000735 0.000236 -0.000260 -0.001417 
+0.000474 0.001516 -0.002780 0.000669 -0.000578 -0.002058 
+0.000022 -0.000270 -0.000934 0.001322 0.001482 -0.001277 
+0.001818 0.004403 -0.002714 0.002126 0.006039 -0.002114 
+0.000307 0.005352 -0.001187 -0.001856 0.003675 -0.000004 
+0.001084 0.004094 -0.001806 -0.001250 0.002812 -0.002748 
+-0.000294 0.000846 0.000184 0.003039 0.001651 0.003899 
+0.000914 -0.001321 0.007470 -0.000855 -0.002921 0.008241 
+-0.003820 -0.003429 0.001841 -0.000340 -0.001820 -0.001981 
+-0.000152 -0.000530 0.000000 -0.002894 -0.002849 0.000467 
+-0.005232 -0.000374 -0.001762 -0.008669 0.002260 0.003484 
+-0.006567 0.000000 0.003657 -0.000510 0.000174 -0.000162 
+0.001692 0.001692 -0.001429 0.000096 -0.000289 -0.000074 
+-0.001801 0.000839 0.002492 -0.005674 0.001128 0.000376 
+-0.001036 -0.000374 -0.001583 -0.000614 -0.000642 -0.000474 
+0.000572 0.000177 0.000389 -0.000970 0.000326 0.000396 
+-0.001662 0.002979 -0.000095 -0.000606 0.003057 0.001239 
+-0.001068 0.000614 0.000609 -0.003100 -0.001260 0.006221 
+-0.002508 0.001672 0.008268 -0.003168 0.001417 0.000792 
+0.001523 0.003260 -0.001866 0.003772 0.004009 -0.003975 
+0.002668 0.000794 -0.002499 0.000032 -0.000945 -0.000028 
+-0.000820 0.000941 -0.001062 0.000539 -0.001267 -0.002242 
+0.000628 -0.000408 -0.000455 -0.004582 -0.004062 0.000916 
+-0.007044 -0.008750 -0.001006 -0.005748 -0.001299 -0.001299 
+0.000555 0.000100 -0.000281 0.004434 0.003801 -0.003692 
+-0.000389 0.003134 -0.003114 -0.001486 0.001486 -0.001087 
+-0.003357 -0.000086 0.000171 0.000356 0.001307 -0.000285 
+0.000272 0.001893 0.002844 0.000153 -0.002390 0.005975 
+-0.000067 -0.005814 0.006909 -0.000274 -0.004347 0.004182 
+-0.001684 0.000299 0.001113 -0.000780 0.002549 0.001033 
+-0.000202 0.002216 0.001561 0.000758 0.002368 0.001784 
+-0.000455 0.002032 0.000508 -0.001337 0.000314 0.000775 
+0.000142 -0.000880 0.000554 0.000719 -0.001705 0.000568 
+0.000711 -0.001114 -0.000323 -0.001047 0.000036 -0.000499 
+-0.002110 0.000329 -0.001302 -0.000951 -0.000657 -0.000900 
+0.000142 -0.000872 -0.000454 0.001514 -0.005529 0.002012 
+-0.002480 -0.003168 0.005919 -0.001544 -0.001912 -0.001397 
+0.001572 -0.002770 -0.001121 0.002230 -0.001731 -0.002183 
+0.003620 -0.000068 0.001344 -0.000268 -0.000750 0.002837 
+-0.000670 -0.001095 0.002550 -0.000342 -0.001452 0.000826 
+-0.000348 -0.000363 0.000155 -0.000097 0.000723 0.000606 
+0.001105 0.000847 0.001384 0.000501 0.000360 0.000373 
+-0.002791 -0.003908 0.006788 -0.001933 -0.004411 0.004535 
+0.000078 -0.001406 0.001406 0.002557 0.001209 0.000465 
+0.003175 -0.001048 0.002101 0.001460 -0.002675 0.006320 
+0.000076 0.000777 0.006524 -0.005495 -0.001808 0.003900 
+-0.002366 -0.000823 -0.000412 0.000782 -0.000077 -0.002664 
+0.000199 0.001080 -0.001577 0.000083 0.002740 0.002851 
+0.000304 0.003546 0.004560 -0.003267 0.001008 0.006031 
+-0.001384 -0.000671 -0.001180 0.000118 -0.001938 -0.001850 
+-0.000292 0.001276 -0.000684 0.001906 0.002532 0.001397 
+0.002734 0.004418 -0.001105 -0.001263 0.000997 -0.000533 
+-0.001727 -0.000416 0.001695 -0.000970 -0.001110 0.000833 
+-0.000606 0.000329 0.000259 -0.001278 0.000344 0.000038 
+-0.000964 -0.000453 0.000411 0.000860 -0.001930 -0.001500 
+0.004222 0.000667 -0.005852 0.005248 0.001643 -0.005116 
+0.001956 0.000479 -0.000911 0.000194 -0.000073 0.003226 
+-0.000611 0.000506 0.002252 0.000123 0.004046 -0.000617 
+-0.000013 0.000404 0.000821 -0.001077 -0.003769 0.002692 
+0.000410 -0.003457 0.003631 0.001548 -0.000524 -0.000569 
+0.004482 0.000538 -0.003729 0.002992 -0.001473 -0.002172 
+-0.001610 -0.003228 0.000645 -0.000107 -0.003101 -0.000089 
+0.001253 -0.000107 0.001147 -0.001648 -0.001414 -0.000048 
+-0.001554 -0.003110 -0.000524 -0.000821 -0.000970 -0.001944 
+-0.000305 0.000483 -0.001513 -0.000093 -0.001337 0.003193 
+0.000341 -0.006214 0.008129 -0.000011 -0.006609 0.007728 
+0.001175 -0.000898 0.000806 0.005398 0.005196 -0.003195 
+0.004747 0.006014 -0.000945 0.000886 -0.001769 -0.000665 
+-0.001621 -0.004864 0.004318 0.001318 -0.003450 0.001783 
+0.002408 -0.000600 -0.002704 0.000376 0.000791 0.000445 
+-0.000572 -0.000723 0.002982 -0.001095 -0.002379 0.002472 
+-0.001460 -0.003102 0.002007 -0.000735 -0.003309 0.000000 
+-0.000608 -0.001290 0.000681 0.000000 0.000148 0.000815 
+0.000228 -0.001049 0.002968 0.003015 -0.000493 0.005102 
+0.001823 0.003125 0.003517 0.001401 0.004466 0.001612 
+-0.000807 0.003008 0.000484 -0.002829 0.000319 0.001872 
+-0.002305 0.000480 -0.000292 -0.000394 -0.001255 -0.002080 
+0.000059 -0.000029 -0.006912 -0.002872 0.000710 -0.002883 
+-0.000872 0.002000 -0.002697 -0.003440 -0.001310 0.001363 
+-0.003119 0.001227 0.001509 -0.001378 -0.001279 -0.000254 
+-0.001664 0.000859 -0.000596 0.001184 -0.000275 -0.000994 
+0.001597 -0.000581 -0.001930 -0.000661 0.002494 -0.000997 
+0.001172 0.002225 -0.001629 0.000855 0.001498 -0.001492 
+-0.000295 -0.000886 -0.002197 0.000653 -0.002610 -0.002656 
+0.001002 -0.001171 -0.003098 0.002942 0.002908 -0.002959 
+-0.000642 0.001472 -0.002997 -0.000053 0.000022 -0.000011 
+-0.001691 -0.000096 -0.000116 -0.000784 -0.002440 0.003486 
+0.000758 -0.000652 0.000591 -0.000769 -0.001292 -0.000431 
+-0.001030 -0.002061 -0.001667 -0.002087 -0.000739 -0.001315 
+0.000703 0.001345 -0.002486 0.003355 0.003344 -0.005586 
+0.006467 0.002774 -0.002508 0.001447 -0.000018 0.000456 
+-0.000221 -0.001784 0.000596 0.000000 -0.000741 0.000889 
+0.001565 -0.000639 -0.000236 0.002727 -0.002044 -0.000973 
+0.000661 -0.002449 -0.001853 -0.001314 0.000686 0.001883 
+-0.005882 0.000643 0.000918 -0.000744 0.001642 0.001691 
+0.005537 0.003012 0.000496 0.004811 0.001136 -0.000067 
+-0.000909 -0.000909 -0.000682 -0.000048 -0.005271 0.000476 
+-0.000804 -0.005071 0.000497 -0.001923 -0.003590 0.002863 
+0.000200 -0.004457 0.004199 0.001448 -0.003445 0.001635 
+0.003068 0.002705 -0.001844 0.002083 0.010136 -0.002499 
+0.001997 0.010577 -0.003033 0.001526 0.002289 -0.002903 
+-0.003494 -0.002699 0.000474 -0.005040 -0.002581 0.002766 
+-0.004000 -0.000885 0.000885 -0.000465 0.000233 0.000930 
+0.000618 0.000442 -0.001260 0.004397 -0.003833 0.002351 
+0.003680 -0.002480 -0.001840 0.001113 -0.000554 -0.001035 
+-0.000217 -0.000916 -0.001437 -0.001644 -0.003555 0.000504 
+0.000920 -0.000963 0.001251 -0.000434 0.001324 0.001079 
+0.000448 0.002416 0.001909 0.000634 0.000238 0.001522 
+-0.001590 -0.002270 -0.000762 -0.003170 -0.001059 -0.002655 
+-0.001506 -0.002191 -0.003173 0.001444 -0.001074 -0.000222 
+0.003233 -0.000693 0.000564 0.002613 -0.002561 0.001973 
+0.001590 -0.003265 0.002929 -0.000444 -0.001169 0.001532 
+-0.000575 0.001054 -0.001436 -0.000017 0.002637 -0.001394 
+0.000919 0.001926 0.001837 0.005304 0.001407 0.000959 
+0.002869 0.000955 -0.000435 -0.000284 -0.000295 0.000119 
+-0.002493 -0.002245 0.001639 -0.002335 -0.002403 0.004398 
+-0.000711 -0.001324 0.004368 -0.001777 0.001335 0.000446 
+-0.003012 0.000496 0.002674 -0.003926 0.000090 0.004641 
+-0.003712 -0.001515 0.005909 -0.002828 -0.000328 0.001086 
+-0.001496 -0.000974 -0.000661 -0.000131 -0.000219 -0.000673 
+0.002578 0.000000 0.001250 0.000864 -0.002605 -0.002821 
+0.001481 -0.003549 -0.002808 -0.001032 -0.005198 -0.002421 
+0.000763 -0.002408 0.000596 0.001379 -0.002812 -0.001591 
+0.000561 -0.002422 -0.000638 -0.003294 -0.003778 -0.000968 
+-0.000992 0.001384 0.001062 -0.001821 0.000080 0.001223 
+-0.001651 -0.001359 -0.000048 -0.003393 -0.002340 -0.001036 
+-0.003979 -0.001986 -0.001979 -0.001308 -0.001479 -0.000296 
+0.001170 -0.000939 -0.000844 0.000110 -0.000346 0.001400 
+-0.005082 -0.001295 -0.000660 -0.005164 -0.005218 -0.000014 
+-0.000109 -0.002636 0.000837 0.002858 0.003009 -0.001688 
+0.001051 0.004872 -0.003487 0.000393 0.002480 -0.002799 
+0.001017 0.001085 -0.001483 0.002986 0.000067 -0.003075 
+-0.001167 0.003747 -0.003625 0.001003 0.008626 -0.002178 
+0.004044 0.005349 0.001189 0.005584 0.000508 -0.001160 
+0.001274 0.001429 -0.000656 0.000724 -0.001818 0.003442 
+-0.001102 -0.001102 0.003150 0.000436 -0.000321 -0.000475 
+-0.000516 -0.000195 -0.001474 -0.001414 0.000503 0.001036 
+-0.000409 -0.001823 0.002226 0.001289 -0.001052 0.002224 
+-0.000237 -0.000700 0.000167 -0.001334 -0.001032 -0.001121 
+-0.000094 -0.001138 0.000660 0.000080 0.001000 0.001522 
+-0.000284 0.003450 0.000599 0.000878 0.001281 0.001708 
+0.000805 0.003624 -0.000352 0.000270 0.000878 0.001416 
+-0.000947 -0.001827 0.001387 0.000161 -0.001630 0.001236 
+-0.000648 0.000526 -0.000259 0.000208 0.000598 0.000335 
+-0.000729 -0.001286 -0.000770 -0.005292 -0.001888 -0.001835 
+-0.001811 0.000220 -0.002945 -0.000248 -0.000233 0.000496 
+-0.002354 -0.000275 -0.000922 -0.001811 -0.001181 0.000000 
+0.000241 -0.000930 -0.000290 -0.000546 -0.001037 -0.002240 
+-0.002741 -0.001133 0.000378 -0.001937 -0.003229 0.002481 
+-0.002935 -0.002542 0.002215 0.000498 0.000841 -0.001025 
+0.003942 0.003205 -0.004081 0.002188 0.002017 -0.003197 
+-0.000824 -0.001610 0.002512 -0.005635 -0.005280 0.006344 
+-0.007426 -0.001971 0.005912 -0.002750 -0.002970 0.003319 
+0.000116 -0.001143 0.000570 -0.000645 0.000114 -0.000095 
+-0.000491 0.000841 0.001472 0.000138 0.000110 0.000752 
+0.000804 -0.000529 0.000055 0.001111 -0.001093 -0.000894 
+-0.000194 -0.000478 -0.000821 -0.001994 -0.000736 -0.000107 
+-0.001456 -0.001887 -0.000725 0.000599 -0.001049 -0.000704 
+0.001619 0.001704 -0.000320 0.001510 0.001939 0.000111 
+-0.002241 -0.000560 0.001746 -0.002738 0.000361 -0.000042 
+0.000717 -0.000294 -0.000012 -0.002288 -0.002322 -0.000027 
+-0.001498 -0.000628 0.000058 -0.001620 -0.000302 0.000192 
+-0.000548 0.000142 0.000588 -0.000250 0.001471 0.000500 
+0.000000 0.000000 0.000000 -0.000551 0.000551 0.003162 
+-0.003160 -0.000617 0.002543 -0.002444 0.000322 0.000805 
+-0.001983 -0.000458 -0.001024 -0.001752 -0.000094 -0.000054 
+-0.000074 -0.000370 0.000074 -0.000388 -0.003338 0.000596 
+-0.001268 -0.003125 0.002702 0.001888 -0.001881 -0.000911 
+0.000830 -0.000854 0.000276 0.000393 -0.000448 0.001724 
+0.001043 -0.000725 0.001217 -0.000138 -0.000605 0.000177 
+0.001765 0.001492 -0.002013 0.003534 0.005120 -0.001707 
+0.003046 0.004690 -0.001451 -0.001541 -0.000404 0.000025 
+-0.000456 -0.002357 -0.001977 -0.002963 -0.008992 -0.001664 
+-0.006323 -0.009868 0.003545 0.000404 -0.005430 0.008033 
+-0.002397 -0.004629 0.005703 -0.000616 -0.000779 -0.000245 
+-0.000352 -0.000792 -0.000467 -0.001949 -0.001873 -0.001935 
+-0.003027 -0.006539 -0.000411 -0.006191 -0.007489 0.005425 
+-0.003651 -0.003351 0.003471 0.001708 0.002851 0.000003 
+0.004274 0.001073 -0.001575 0.002312 -0.000129 0.000132 
+0.002145 -0.001436 0.002543 0.001460 -0.003898 0.001478 
+0.002944 -0.002944 -0.001371 -0.000331 -0.002548 -0.003608 
+0.000405 -0.001718 -0.003134 0.001618 -0.000750 -0.000250 
+0.002768 0.002027 -0.001302 0.003506 0.002580 -0.000720 
+0.004912 0.003079 0.000118 -0.000038 0.000257 -0.000665 
+-0.000382 -0.000611 0.000763 -0.002635 0.003027 -0.000178 
+-0.002147 0.003463 -0.000970 0.000380 -0.001398 -0.003813 
+0.000214 0.001078 -0.002374 -0.001397 0.000588 -0.002794 
+-0.003790 0.001083 -0.002826 -0.003669 -0.000951 -0.001226 
+-0.003994 -0.002231 0.002594 -0.004322 0.000633 0.002706 
+-0.004552 0.001100 0.002567 -0.005253 -0.001051 0.002164 
+-0.002515 -0.002584 -0.000793 0.000280 -0.002239 -0.000560 
+0.001643 -0.003287 0.001938 -0.001521 -0.005567 0.002152 
+-0.001554 -0.003814 0.002644 0.000165 -0.001243 0.001108 
+0.000787 -0.001211 -0.000078 0.004336 -0.001092 -0.000291 
+0.006257 -0.000690 -0.002382 0.006057 0.000235 -0.002958 
+0.004191 0.001250 -0.002941 -0.000252 -0.000284 -0.000441 
+-0.000980 -0.004545 -0.000392 -0.005606 -0.004848 0.000152 
+-0.006677 -0.003759 0.003338 -0.002095 -0.002137 0.002009 
+-0.000199 0.002437 -0.004350 -0.000476 0.006571 -0.004095 
+0.004069 0.004526 -0.003543 0.001183 0.000216 -0.004840 
+-0.001472 -0.001656 -0.005336 -0.002910 -0.003582 -0.000224 
+-0.000909 -0.002500 0.001212 -0.001170 -0.004187 0.003181 
+-0.004156 -0.003500 0.003391 -0.004702 -0.003662 0.001237 
+-0.004376 -0.001474 -0.000190 -0.001148 0.000724 -0.000549 
+0.000905 -0.002581 0.000489 0.001964 -0.004286 0.000491 
+0.001541 -0.003081 -0.001407 0.001517 -0.000069 -0.002082 
+0.002207 0.001784 -0.001596 -0.000482 0.000460 -0.000298 
+-0.000567 -0.000524 -0.001374 -0.000120 0.000080 0.000815 
+-0.000342 -0.002307 0.002580 0.000956 -0.002007 0.001720 
+0.001692 0.000000 0.001077 -0.000556 0.000142 0.000654 
+-0.002478 0.001374 -0.003301 -0.001289 0.001369 0.001737 
+0.001212 0.000445 0.000117 0.001498 -0.000778 -0.002310 
+-0.000911 -0.001510 -0.003932 0.000096 -0.001287 -0.003315 
+0.000653 -0.000033 -0.000273 -0.000277 0.000138 -0.001308 
+0.001544 -0.000388 -0.000883 0.000047 -0.004932 0.000436 
+-0.001096 -0.006870 0.002168 -0.001181 -0.004724 0.006693 
+-0.001646 0.001702 0.004227 0.000011 0.000929 0.000931 
+-0.000148 -0.000105 -0.000102 0.000669 -0.001339 0.000669 
+-0.001508 -0.001667 0.006349 -0.001760 0.000000 0.007280 
+-0.002181 0.000061 0.005699 -0.001247 -0.001393 0.004263 
+0.001275 -0.002148 0.002124 -0.001126 -0.001178 0.000307 
+0.003387 0.005161 -0.002258 -0.000396 -0.000109 -0.001154 
+0.000281 -0.001860 -0.000983 0.001995 -0.000783 -0.000934 
+0.002417 -0.000818 0.000473 0.003097 -0.001088 -0.000237 
+0.000570 0.000037 -0.000818 -0.002759 -0.001787 0.002434 
+-0.003830 -0.000795 0.001437 0.000203 -0.000015 0.000075 
+0.002642 0.000543 -0.002099 0.001912 -0.002500 -0.000221 
+0.001714 -0.000857 -0.000429 -0.000053 -0.000689 0.000668 
+0.000038 -0.001190 0.001419 -0.000215 -0.002312 0.001272 
+-0.001140 -0.001581 0.000256 0.000277 -0.000955 0.002361 
+-0.001069 -0.000707 0.004729 0.001392 -0.000986 0.003826 
+-0.003862 -0.007743 0.002585 -0.001163 -0.004221 0.003609 
+0.000284 -0.002269 0.001599 -0.000565 -0.001385 0.000679 
+-0.000539 -0.001649 0.000819 -0.000125 -0.001905 0.000927 
+-0.000778 -0.000692 0.003113 -0.001237 0.000317 0.004949 
+-0.004524 -0.000873 0.001984 -0.004928 -0.002620 0.002268 
+-0.002902 -0.003517 0.002140 0.000485 -0.000393 0.000450 
+0.000361 -0.001405 -0.001302 0.000235 -0.000334 -0.000079 
+0.000221 0.002132 -0.000368 0.001533 0.000000 -0.001533 
+-0.000047 -0.000775 -0.000916 -0.001165 -0.001942 -0.000597 
+-0.001101 -0.000884 -0.000870 0.001385 0.000977 -0.000244 
+0.003168 0.001298 -0.003168 0.003358 0.000175 -0.003709 
+0.001707 0.001392 -0.002110 -0.000675 0.000315 -0.000656 
+-0.003084 0.000499 0.001116 -0.002462 -0.001435 0.001037 
+-0.000733 -0.000213 -0.001205 0.001547 0.000541 -0.003321 
+-0.002145 0.001960 -0.001841 -0.002325 0.002285 -0.000331 
+-0.001843 0.001027 0.000785 -0.003721 0.000000 0.003953 
+-0.004814 -0.004889 0.003704 -0.001183 -0.004924 0.000687 
+0.000000 -0.004060 0.001203 0.000949 -0.004197 0.001496 
+-0.000858 0.000375 0.000134 -0.003305 -0.002387 0.003489 
+-0.000289 -0.001317 0.001486 0.000940 -0.000716 0.000712 
+-0.002307 -0.002493 0.000427 -0.004610 -0.005001 -0.002239 
+-0.001906 -0.005859 0.003813 -0.004660 -0.005884 0.001145 
+-0.003154 -0.002330 0.001649 -0.001048 0.000039 0.000007 
+-0.000800 0.000958 0.000746 0.001402 -0.000344 -0.003148 
+0.000000 -0.001570 0.000523 0.001631 -0.005144 0.000253 
+0.002242 -0.002430 0.000940 0.002009 0.001355 -0.002102 
+0.000773 0.003947 -0.004027 0.001166 0.001866 -0.002824 
+-0.000546 0.000370 0.000604 0.000023 0.001176 0.001919 
+-0.001603 0.000188 0.005466 0.003590 0.002881 0.000098 
+-0.000169 0.003432 0.003093 -0.000622 0.002816 0.006399 
+-0.003472 0.000003 0.005193 -0.003233 -0.002453 0.002647 
+-0.004061 -0.006794 0.005025 -0.004884 -0.007473 0.008959 
+0.000289 -0.003779 0.006726 -0.000915 0.001460 -0.000656 
+-0.000355 0.007131 -0.002944 -0.002510 0.004192 0.000934 
+-0.000681 0.001884 0.002546 0.001783 0.001140 0.001995 
+-0.000426 0.000426 0.000155 -0.000448 0.002463 -0.000149 
+0.001139 0.000288 -0.000651 0.002831 -0.000290 0.001089 
+0.002086 0.001867 0.000432 0.001551 0.003756 -0.001388 
+0.001133 0.002410 -0.005272 -0.000425 0.000142 -0.004627 
+-0.000982 0.000164 -0.001679 0.000410 0.001132 0.000693 
+0.002673 -0.000494 0.001387 0.003688 0.000352 0.001245 
+0.001957 0.000711 0.002669 0.001954 0.001714 0.002880 
+0.000106 0.002030 0.003638 -0.002676 0.000694 -0.000595 
+-0.003104 -0.002111 -0.001542 -0.001439 -0.001876 -0.001244 
+0.000410 0.001271 0.000169 0.002179 0.002672 0.001116 
+0.001371 0.000348 0.000621 -0.000681 -0.000072 -0.001101 
+-0.001169 -0.001818 -0.002568 -0.001293 -0.000420 -0.000490 
+-0.000016 0.001550 0.002511 0.000167 -0.000083 0.000667 
+0.001141 0.002214 -0.003640 -0.000192 -0.000500 -0.000432 
+-0.005872 -0.003561 0.003371 -0.000885 0.000911 0.002786 
+-0.000889 0.000279 -0.000064 -0.001556 0.000407 -0.001519 
+-0.002233 0.001640 -0.001323 -0.002126 0.001932 -0.000483 
+-0.000665 0.002994 -0.001673 -0.000832 0.003037 -0.000923 
+-0.000263 0.004248 0.000752 0.001158 0.003046 0.003869 
+-0.000828 0.003940 0.003340 0.000144 0.002914 0.002643 
+0.001679 0.002137 0.001679 0.000409 0.002333 -0.001652 
+0.001016 -0.002593 -0.005374 -0.001777 -0.001843 -0.004816 
+-0.002874 -0.000637 -0.001852 -0.001576 0.001761 0.000557 
+-0.002113 0.002021 0.001105 -0.003291 0.002448 0.000273 
+-0.004763 0.001401 -0.002242 -0.001293 0.003405 -0.003405 
+0.004341 0.001845 0.002388 0.004242 0.000829 0.005040 
+0.001333 -0.001328 0.001271 0.000183 0.000526 -0.002789 
+-0.002179 0.001732 -0.004188 -0.003654 0.000352 -0.002282 
+-0.003896 0.000561 -0.000878 -0.005262 -0.000567 0.000407 
+-0.000574 -0.003427 0.001122 0.000051 -0.001918 0.003194 
+0.000573 -0.000739 -0.000762 0.009746 0.003541 -0.004418 
+0.001268 -0.000230 -0.001730 -0.001504 -0.003911 -0.005567 
+-0.001659 -0.002120 -0.001628 0.001897 -0.000484 0.001674 
+0.000834 0.000047 0.004124 0.001695 -0.001072 0.000936 
+-0.001376 -0.004129 0.000918 -0.003081 -0.002019 0.002004 
+-0.000787 0.000039 -0.001084 -0.001209 0.002435 -0.000731 
+-0.001108 0.005246 -0.001170 0.002833 0.002614 -0.000246 
+0.000350 -0.000796 -0.001856 0.000113 -0.000295 -0.000646 
+0.000541 0.001144 0.001384 0.002987 -0.000029 0.002603 
+0.001120 0.000074 0.001493 0.001682 -0.001324 -0.000374 
+-0.001878 -0.002243 0.000549 -0.002429 -0.001362 0.001789 
+-0.001895 0.000892 0.000665 -0.000921 0.000548 0.001132 
+0.000494 0.002089 0.000454 0.000317 -0.001595 0.001242 
+0.000586 -0.003984 0.000586 -0.001936 -0.001970 0.002509 
+-0.001212 0.001734 0.000865 0.001606 0.003650 0.000018 
+0.001458 0.002102 0.000746 -0.001336 0.001345 0.001155 
+-0.000083 0.001429 0.001718 -0.000376 0.000968 0.000524 
+-0.000405 0.001493 0.000055 0.003268 0.002926 -0.003701 
+0.002219 0.000295 -0.001586 -0.000390 0.000237 0.001440 
+-0.001966 0.001270 0.002038 -0.002320 0.001715 0.000757 
+-0.001086 -0.001488 -0.000181 0.001951 -0.003902 0.002520 
+-0.000610 -0.005935 -0.000610 -0.003052 -0.003095 0.000029 
+0.000003 -0.001076 0.000184 0.000926 0.000729 0.004921 
+-0.001523 0.000566 0.006343 -0.001350 0.000371 0.003656 
+0.000486 -0.001207 0.001478 -0.000971 -0.002472 0.001280 
+-0.000592 -0.000612 0.003515 -0.000819 -0.000906 0.003867 
+-0.000844 -0.001222 0.004290 -0.002126 -0.000576 0.001498 
+-0.000547 0.003444 -0.003171 0.002286 0.003984 -0.002730 
+0.001318 -0.002016 -0.001163 -0.000016 -0.007189 -0.000804 
+-0.000128 -0.006449 -0.002952 -0.002711 -0.003407 -0.000904 
+-0.000889 0.002237 -0.005381 -0.002005 0.003142 -0.006356 
+-0.000889 0.004039 -0.005856 -0.000389 0.002806 -0.001716 
+-0.003214 -0.001414 0.001886 -0.003643 0.001244 0.003928 
+-0.000070 0.001919 0.002507 0.001067 0.001422 -0.000256 
+-0.001037 0.000198 -0.002658 -0.001915 0.000999 -0.003960 
+-0.003440 0.002449 -0.003528 -0.003327 0.000870 -0.002192 
+-0.002646 -0.000618 -0.001632 -0.002103 -0.000347 -0.003035 
+-0.000294 0.000127 -0.000675 -0.000440 -0.000922 0.003340 
+0.000356 0.001591 0.000741 0.002215 -0.000685 -0.001160 
+-0.003483 -0.012027 0.001896 -0.003841 -0.003194 -0.002871 
+0.000941 0.000337 0.000363 0.000000 0.000545 -0.000818 
+-0.000013 -0.000173 0.002139 -0.002116 0.001980 0.004744 
+-0.002428 -0.002471 0.002514 0.001554 0.000791 -0.000452 
+0.004293 0.007055 -0.005649 0.008009 0.006313 -0.006800 
+0.005182 0.007404 -0.001944 0.001881 -0.000964 -0.000289 
+0.000468 -0.001329 -0.001689 0.000650 0.000004 -0.002210 
+0.000098 0.000189 -0.002704 0.000504 -0.000004 -0.004015 
+0.002950 0.002230 -0.000647 -0.000757 -0.001884 -0.000142 
+-0.001397 -0.004991 0.000294 0.000529 -0.002269 0.000646 
+-0.001204 0.001644 -0.001412 0.001186 0.005896 -0.000967 
+0.000088 0.002194 -0.001026 0.000495 -0.003022 0.000663 
+0.000221 -0.001841 -0.002073 0.000318 -0.000085 0.000370 
+0.000143 0.000470 -0.000827 0.000147 0.002471 -0.001235 
+0.000489 0.000679 0.000021 0.002123 -0.000922 0.000776 
+0.002182 -0.001758 0.002255 0.002211 0.000121 0.001948 
+0.005112 0.003150 -0.004260 0.002269 0.003106 -0.005294 
+0.000134 -0.000179 -0.000970 -0.000296 0.001109 0.001797 
+-0.000349 0.002228 0.000043 0.002021 0.004563 -0.002787 
+0.000778 0.005340 -0.004916 -0.000069 0.001148 -0.003758 
+-0.001554 -0.000199 0.000560 -0.000934 -0.000012 0.002859 
+0.000172 0.001428 0.003485 0.000141 0.002742 0.002203 
+0.000072 0.000351 0.001244 -0.003298 -0.000385 -0.000017 
+-0.003125 -0.001574 -0.001310 -0.006566 -0.002023 0.002378 
+-0.003555 -0.003415 0.003976 -0.000384 -0.000400 -0.000656 
+0.000335 0.000947 -0.002195 -0.001035 -0.002237 0.001876 
+-0.000599 -0.005159 0.001681 -0.004975 -0.002857 -0.001421 
+-0.002258 -0.001864 0.000530 0.003037 -0.001847 -0.000340 
+0.004688 0.000194 -0.001470 0.003120 -0.002079 -0.002252 
+-0.000462 -0.000792 -0.005545 0.000337 0.001954 -0.006385 
+0.000791 0.000149 -0.001533 0.000911 -0.002989 0.005395 
+0.000799 -0.006548 0.004905 0.001662 -0.002339 0.001963 
+0.001377 0.003379 -0.000598 0.003739 0.003889 -0.004808 
+0.001214 0.001711 -0.003344 -0.000248 -0.000658 0.000301 
+-0.001145 -0.002089 0.000912 -0.002065 -0.001041 0.000897 
+-0.000459 -0.000436 0.001105 0.000411 -0.000454 0.001218 
+0.000730 -0.000475 0.001345 -0.000338 -0.001429 0.000949 
+0.000306 -0.000653 -0.000438 -0.000389 0.000580 0.000676 
+-0.001417 -0.000713 0.000993 0.000038 -0.000410 0.001443 
+0.002271 -0.002974 0.002526 -0.000732 -0.005880 -0.000004 
+-0.001259 -0.000712 -0.002025 -0.000387 0.000624 0.000361 
+0.000922 0.001161 0.001880 0.000053 0.000262 -0.000115 
+0.000633 0.000780 -0.004109 0.003273 0.002770 -0.005440 
+0.001691 0.003067 -0.003870 0.001024 0.000945 -0.002734 
+0.000812 -0.002138 -0.003935 -0.001681 0.000791 -0.001312 
+-0.000173 0.007204 -0.000559 0.002547 0.006446 -0.005597 
+0.000378 0.001909 0.001527 0.000713 0.001980 0.000498 
+0.001434 0.000746 -0.000252 0.002082 -0.001047 -0.001292 
+0.001370 -0.001840 -0.003178 0.001958 -0.000897 -0.002797 
+0.002487 -0.000529 -0.002540 0.001775 0.000001 0.000136 
+-0.000188 -0.003214 -0.000421 0.001080 -0.002105 -0.001004 
+-0.002414 -0.000680 0.001496 -0.001746 -0.000496 -0.000004 
+-0.000418 -0.000054 -0.000189 0.000227 0.000041 0.001197 
+0.000024 0.000510 0.001336 0.000924 0.000752 0.000157 
+0.002766 0.002262 0.000891 0.003400 0.004900 0.000465 
+0.002030 0.005139 -0.000936 0.001716 0.002684 -0.003869 
+-0.000659 0.001305 -0.005396 0.000055 -0.000650 -0.002128 
+-0.001891 0.003475 0.002082 -0.002560 0.006504 -0.001724 
+-0.000769 0.006824 -0.001222 -0.001096 0.004528 0.001377 
+-0.000717 0.003449 0.001946 -0.000956 0.003335 0.000096 
+-0.001073 0.001513 -0.001689 -0.001178 -0.000266 -0.000984 
+-0.001396 -0.002680 0.000369 -0.000103 -0.002143 0.001033 
+0.002588 0.003319 0.000806 0.006726 0.004510 -0.004906 
+0.002713 0.003256 -0.005349 -0.000960 -0.001755 -0.000987 
+-0.003999 -0.005567 0.001019 -0.004277 -0.003317 -0.000199 
+-0.000509 0.000254 -0.000509 0.000490 -0.001140 0.000356 
+0.003030 -0.001993 0.000750 0.003583 -0.001436 -0.001682 
+0.000425 -0.001723 -0.000434 -0.003170 -0.000905 -0.001057 
+-0.006581 -0.000562 0.000719 -0.005996 -0.000798 0.005459 
+-0.003931 -0.005380 0.007012 -0.001624 -0.004144 0.005920 
+-0.001368 -0.000522 0.006260 -0.001798 0.001015 0.003392 
+-0.000992 0.000728 -0.000690 -0.000196 -0.000395 -0.003148 
+-0.000423 -0.001269 -0.002692 -0.002748 0.001145 -0.000916 
+-0.001841 0.001675 0.001166 -0.002069 0.000132 0.001565 
+-0.002340 -0.000298 0.000693 -0.003319 -0.000661 -0.000711 
+-0.001739 0.000010 -0.002601 0.000198 -0.000862 -0.000003 
+0.003363 0.001239 -0.002421 0.005244 0.003749 -0.002464 
+0.003800 0.004543 -0.002469 0.001130 0.003864 -0.001001 
+0.002820 0.001077 0.000068 0.000653 0.000289 -0.003769 
+0.001865 0.000384 -0.004899 0.001866 0.001960 -0.005273 
+0.002788 0.000874 -0.003961 0.001733 -0.000177 -0.001474 
+-0.000428 0.001789 -0.000843 0.002333 0.001456 -0.002174 
+0.004541 -0.000347 -0.001045 0.002598 -0.000411 0.000602 
+-0.000132 -0.001124 0.000678 -0.000447 -0.000536 0.000238 
+0.002652 0.002652 0.000606 0.004385 0.003676 0.001909 
+0.003964 -0.001395 -0.000362 0.003555 -0.002969 -0.004414 
+0.002355 -0.001967 -0.004230 0.000973 -0.000918 -0.003254 
+-0.000350 0.000259 -0.001453 -0.000375 -0.002611 0.001441 
+0.000890 -0.001815 0.002012 0.000520 -0.001095 0.002279 
+-0.001824 -0.001959 0.003378 -0.003128 -0.003867 -0.000626 
+0.000201 -0.003469 0.001807 0.000136 0.000496 -0.001986 
+-0.000320 0.003064 -0.005555 -0.000537 0.002909 -0.003017 
+-0.002963 -0.001459 0.002553 -0.005321 -0.000149 0.008858 
+-0.005629 -0.000596 0.004966 -0.003294 0.000455 -0.004286 
+0.000707 0.005111 -0.006586 0.003773 0.006146 -0.000389 
+0.005336 -0.002522 0.009402 0.002988 -0.005745 0.027102 
+0.002971 -0.005211 0.029687 0.003370 -0.000947 0.012166 
+0.001153 -0.003174 -0.000371 -0.000835 -0.002849 0.002669 
+-0.001865 -0.003662 0.000921 0.001146 -0.001609 -0.001874 
+0.001075 -0.001840 -0.001106 0.002873 -0.001363 0.000944 
+0.002702 -0.002923 0.000088 0.002833 -0.001658 0.000646 
+0.001111 -0.001110 -0.000558 0.000020 0.001183 -0.001023 
+-0.000842 0.002088 -0.001886 -0.001659 -0.000176 -0.001165 
+0.000999 -0.000332 -0.003675 0.002806 0.000392 -0.002761 
+0.005453 0.001694 -0.002044 0.005424 0.000634 0.001652 
+0.001579 -0.001403 0.000614 -0.000010 0.000008 -0.000800 
+-0.000498 -0.000071 0.000216 -0.000914 0.000753 -0.003333 
+-0.002883 0.001981 -0.002432 -0.000524 0.000786 -0.000426 
+0.001171 -0.000318 0.000010 0.000212 -0.000226 0.000145 
+-0.001847 -0.000102 -0.002462 -0.001659 -0.000710 -0.003237 
+-0.002888 -0.003099 -0.001234 0.000317 -0.000013 -0.000833 
+0.000067 -0.000120 -0.000037 -0.000371 0.001205 0.001951 
+-0.001083 -0.000399 0.001211 0.000958 0.001026 0.001146 
+0.000357 0.001155 -0.000020 -0.000673 0.000811 0.000747 
+-0.002309 -0.002052 0.002822 -0.000875 -0.000120 0.004830 
+0.001753 0.003019 0.004873 0.003374 0.004638 0.003621 
+0.004190 0.002607 0.001325 -0.000566 -0.000112 -0.000848 
+0.002648 0.004793 -0.008269 0.003114 0.008254 -0.007453 
+0.003245 0.006995 -0.004892 0.003663 0.000087 -0.000894 
+0.002344 -0.000829 -0.001244 0.003125 0.001094 0.002031 
+0.000250 0.004261 0.003928 0.001490 -0.000243 -0.000332 
+0.004068 -0.001487 0.002083 0.001949 -0.000175 0.001569 
+0.000949 0.000660 0.000284 0.001494 0.002338 -0.005195 
+-0.002694 0.004820 -0.005854 0.000235 0.007114 0.001316 
+0.007788 0.006698 0.001970 0.006509 0.005424 -0.005391 
+0.003405 -0.000016 0.001080 0.002360 -0.004272 0.001457 
+0.001867 -0.003902 0.002236 0.000705 -0.002492 0.003747 
+-0.000650 -0.000590 0.003262 -0.000070 -0.000161 -0.000563 
+-0.001235 -0.001258 -0.004374 -0.001217 -0.002246 -0.003652 
+-0.002657 -0.003527 0.001787 -0.000676 0.001178 0.003477 
+-0.003902 -0.000094 0.001589 -0.003461 -0.003229 0.003739 
+-0.001397 0.001800 0.000484 -0.000827 -0.003292 0.000869 
+-0.001957 -0.003003 -0.004343 0.012453 0.003023 -0.004286 
+-0.004972 0.002303 0.012603 0.644330 0.170103 4.448453 
+0.331754 0.000000 5.246446 0.072626 0.016760 3.977654 
+0.000972 0.002304 0.011762 -0.001695 -0.000031 -0.006873 
+0.001207 0.001705 -0.006834 0.000903 0.001230 -0.001969 
+0.000812 0.001461 0.000254 -0.001977 0.000506 -0.000046 
+-0.002471 -0.001911 0.004382 0.000450 -0.003528 0.007433 
+0.001575 -0.000813 0.006196 -0.002677 0.001278 0.002142 
+0.002512 0.004868 0.002129 0.004662 0.006429 -0.001930 
+-0.000549 0.003020 -0.004665 -0.000513 -0.001097 -0.002964 
+-0.001064 -0.000758 -0.001556 0.001419 0.000661 0.000997 
+0.004155 0.005211 0.001253 -0.002904 0.005340 0.001499 
+-0.004288 0.005822 0.001580 -0.005496 0.004330 0.001034 
+-0.003460 0.004666 0.000301 -0.001360 0.005195 -0.001476 
+-0.000219 0.003768 -0.001529 -0.000377 0.000669 0.000183 
+0.000383 -0.001746 0.001342 -0.006512 -0.003163 0.002372 
+-0.007067 -0.000554 0.004573 -0.005217 -0.000447 0.003216 
+-0.000200 -0.000563 0.002067 0.004229 -0.001883 0.000493 
+0.007359 0.001630 -0.000049 0.004249 0.000238 0.002734 
+0.001906 0.002303 0.001618 0.000454 0.000828 0.001576 
+0.001348 0.001900 -0.000797 0.000000 0.002482 0.000803 
+-0.001270 0.000307 0.003346 -0.004472 -0.001846 0.002448 
+-0.002353 -0.002559 -0.001337 0.003227 -0.001665 -0.001987 
+0.001757 0.004727 -0.007431 0.004374 0.003530 -0.003715 
+0.002674 -0.000087 -0.000980 0.002946 -0.001334 -0.000800 
+0.005131 0.005924 -0.003160 0.006182 0.007951 0.001413 
+0.006866 0.006360 0.000434 0.003449 0.004012 0.000844 
+0.000577 -0.000385 0.001694 -0.001031 -0.003094 -0.000469 
+-0.004231 -0.002709 -0.002191 -0.000796 -0.001287 -0.002512 
+0.002588 0.003937 0.000496 0.006353 0.005476 0.000253 
+0.004127 0.002062 0.001035 -0.001484 -0.000457 0.002845 
+-0.001354 0.001114 0.000465 0.001067 -0.001339 0.000384 
+0.001833 -0.002479 0.000697 0.001788 -0.002805 0.000684 
+0.000511 -0.000171 -0.000428 0.001512 -0.000722 -0.000854 
+0.002288 0.001785 -0.005004 0.000203 -0.000916 -0.001882 
+-0.001299 -0.003936 0.004120 -0.000810 -0.002739 0.006005 
+-0.002621 -0.002447 0.003054 -0.003915 -0.004349 0.000869 
+-0.005936 -0.003995 0.002120 -0.001103 0.001050 -0.001887 
+-0.000765 -0.002224 -0.011099 0.006231 -0.001041 -0.006707 
+0.003833 0.006141 0.016826 0.506098 -0.024390 3.878049 
+0.144509 0.208092 4.317919 -0.000481 0.003927 0.031134 
+-0.001138 0.005219 0.005203 0.004053 0.000824 -0.010989 
+0.000924 0.003406 -0.002423 0.003356 0.001864 0.005341 
+0.000963 0.001341 0.004022 -0.000208 0.000261 0.000678 
+-0.000632 -0.000369 0.001528 -0.002134 -0.000012 0.000851 
+-0.001638 0.000238 0.000584 0.001020 0.002721 0.000291 
+0.005177 0.003607 -0.003374 -0.000117 0.003209 -0.000305 
+0.000554 0.000667 0.001626 -0.001972 0.001472 0.001944 
+-0.000695 -0.001870 -0.001217 -0.002009 -0.000972 -0.001993 
+-0.001905 -0.003730 0.002063 -0.002922 -0.005684 0.003453 
+-0.006529 -0.004821 0.004219 -0.006924 -0.002966 0.002206 
+-0.003992 -0.000552 0.000206 -0.000587 0.000154 0.000018 
+0.000000 -0.001475 0.000902 0.001928 -0.001290 0.000321 
+-0.000271 -0.000813 0.000566 -0.004272 0.000209 0.003776 
+-0.003564 0.001292 0.005977 -0.002842 0.000579 0.005615 
+-0.003208 -0.001604 0.002264 0.001748 0.003671 -0.000862 
+-0.000981 0.002933 -0.000255 0.006471 0.001986 0.000629 
+0.001710 0.004868 0.000085 -0.000872 0.003023 -0.004467 
+0.001048 -0.001940 0.000155 0.006596 0.000354 -0.002237 
+-0.000197 0.000083 0.000765 -0.005270 -0.002451 0.003922 
+-0.004139 -0.002572 0.001981 0.001736 -0.000326 -0.002821 
+0.002231 -0.001089 -0.001210 -0.000806 0.000806 -0.000806 
+0.000395 -0.000310 -0.000327 0.003471 -0.000546 0.000229 
+0.001794 0.004423 -0.001669 0.001058 0.005962 -0.001644 
+0.001843 0.001896 -0.005075 0.000341 -0.002831 -0.001510 
+0.000426 -0.004141 -0.000656 0.000417 -0.002375 -0.000827 
+0.001443 -0.001418 -0.002130 0.003552 -0.002039 -0.002703 
+0.006219 -0.001662 -0.001018 0.006587 0.000000 0.001270 
+0.001518 0.001627 0.004512 -0.005000 0.000665 0.004432 
+-0.006451 0.000638 0.001879 -0.000492 0.000912 0.000139 
+0.000432 -0.003831 0.005358 -0.002111 -0.000633 0.007132 
+-0.003580 -0.001027 0.000408 -0.000820 0.000974 0.000313 
+0.000000 0.001748 -0.001469 0.000770 -0.000717 -0.000519 
+0.000104 0.002336 0.000519 0.000306 0.003066 -0.004293 
+-0.002675 0.002360 0.000697 -0.004158 0.000877 -0.002483 
+-0.002924 -0.002924 0.002339 -0.003581 -0.002336 -0.002531 
+-0.008326 0.006568 -0.011685 -0.014938 0.011250 -0.010773 
+0.009232 -0.000371 -0.017226 0.004950 0.001401 0.004887 
+0.002434 -0.000008 0.009350 0.000842 0.001470 0.001168 
+0.002980 0.000543 -0.005885 0.003846 0.005122 -0.004098 
+0.000653 0.002002 0.003325 0.000875 0.001979 0.003375 
+0.000241 -0.000789 0.001866 0.000560 -0.001881 0.000807 
+-0.002266 -0.003323 0.001863 -0.001045 -0.003473 -0.000320 
+0.000748 -0.000741 0.000872 -0.000471 0.000429 0.001674 
+0.001060 -0.000400 -0.000373 -0.000182 -0.001327 -0.001463 
+-0.001377 -0.001543 -0.001763 -0.002308 0.000111 0.000442 
+0.000607 -0.001264 0.000525 0.000027 -0.004317 0.002240 
+0.000870 -0.005497 0.003017 -0.000315 -0.002512 0.003140 
+-0.002036 -0.000910 0.000642 -0.000349 0.002473 -0.001229 
+-0.000178 0.001092 0.000187 0.005732 -0.000702 -0.002379 
+0.003658 -0.003306 0.003048 0.004484 -0.000634 -0.000840 
+0.000830 0.002355 -0.003764 -0.002518 0.001960 -0.000585 
+-0.000117 0.002282 0.003126 0.000135 -0.006961 0.000030 
+0.000305 -0.004473 0.001830 0.002365 0.005617 -0.005617 
+0.004052 0.006460 -0.007084 -0.001432 -0.001029 -0.000456 
+-0.000595 -0.002939 -0.001482 -0.005728 0.004078 0.000389 
+-0.000903 0.000790 -0.001643 0.000886 -0.001267 0.000519 
+0.001803 -0.001361 0.000465 0.002385 -0.001027 0.001187 
+0.003288 -0.004051 0.002492 -0.000241 -0.000979 0.002295 
+0.003411 0.000430 -0.003391 0.005366 0.002012 -0.006587 
+0.006880 0.000734 0.000184 0.007712 -0.000331 -0.002011 
+0.002992 0.001228 -0.000614 -0.000308 0.001144 -0.000682 
+-0.002044 0.001202 -0.000840 0.000840 -0.000207 -0.001447 
+0.001544 -0.001753 -0.003040 0.002151 -0.003443 -0.001769 
+0.002105 -0.001574 -0.000311 0.003288 -0.001132 0.000054 
+0.007282 0.002814 -0.002666 0.000613 0.002913 -0.003586 
+-0.001576 0.003341 -0.000375 -0.005956 -0.000091 0.000228 
+-0.001507 -0.002897 0.000133 0.000064 -0.004337 0.001959 
+-0.005542 0.000519 0.002713 -0.003912 -0.005180 0.004235 
+-0.001097 -0.003026 0.000360 0.002630 0.000484 -0.001061 
+0.001773 -0.000971 -0.002451 0.005280 0.001499 -0.002918 
+0.002628 -0.001606 0.000073 0.001696 0.001579 0.000392 
+-0.003441 0.006104 -0.004568 -0.004836 0.006806 -0.008067 
+0.004247 -0.000674 0.008263 0.010215 -0.007599 0.023916 
+0.012964 -0.013139 0.026206 0.013762 -0.010209 0.018659 
+0.010876 -0.001067 0.006388 0.001092 -0.000846 0.002713 
+0.002511 -0.000941 0.003938 0.001606 -0.002203 0.002907 
+-0.001377 -0.000229 -0.000533 -0.003792 0.002069 -0.003043 
+0.000560 -0.000091 -0.000212 -0.000908 0.000102 0.001310 
+-0.003470 -0.000723 0.003615 -0.005870 -0.002322 0.004035 
+-0.006028 -0.001241 -0.001241 0.001141 0.000226 0.001502 
+0.001896 -0.004034 0.006899 0.000441 -0.005188 0.007551 
+-0.002887 -0.002212 0.005795 -0.007923 -0.001389 -0.000256 
+-0.003275 -0.002313 -0.003457 0.001582 0.001055 -0.001532 
+0.004251 0.001522 0.000633 0.001512 0.001186 -0.000977 
+0.000462 -0.002423 -0.003346 -0.000172 -0.002313 -0.000960 
+-0.001841 0.001428 -0.002457 -0.001225 0.002814 -0.001745 
+0.003030 0.004325 -0.002590 0.005590 -0.002096 0.001165 
+0.004397 -0.000879 -0.001979 -0.000112 0.000116 0.000182 
+-0.000868 0.003014 0.001634 0.000714 0.002175 0.002954 
+-0.002346 0.002985 0.002097 -0.000986 0.000223 -0.000175 
+0.002789 -0.001487 -0.000231 0.004239 -0.004846 0.000244 
+0.002416 -0.001980 -0.001773 -0.001210 -0.000387 0.000435 
+-0.002830 -0.004619 0.000249 -0.007498 -0.003562 0.001353 
+-0.001963 -0.001236 -0.001176 -0.001364 -0.000815 0.001057 
+0.001845 -0.000841 -0.001506 0.002910 -0.001344 -0.002680 
+0.002556 0.001064 -0.000323 -0.000589 -0.003459 0.002651 
+0.002192 -0.000388 0.002842 0.002388 0.003197 -0.002439 
+0.003306 0.006766 -0.006093 0.005393 0.002629 -0.002005 
+-0.001278 -0.000794 0.000232 -0.001352 0.000273 -0.001666 
+0.000852 0.001658 -0.001569 0.003154 0.000994 0.000697 
+0.002248 -0.001844 0.000643 -0.002602 -0.002602 0.003659 
+0.000509 -0.003353 0.002372 0.003776 -0.000773 -0.000105 
+0.002187 0.000045 -0.002555 0.001700 0.003440 -0.002128 
+-0.000156 0.001738 0.001228 -0.004286 0.000902 0.000902 
+-0.006852 -0.001164 0.005950 -0.010521 -0.002736 0.007589 
+-0.011396 -0.002905 0.003465 -0.004936 0.002542 -0.000947 
+0.003815 0.003883 -0.002416 0.006478 0.004618 0.000551 
+0.001104 0.007239 0.001295 0.004097 0.004466 -0.000672 
+0.000398 0.000068 -0.000091 -0.000213 -0.001097 0.003194 
+-0.002497 -0.000740 0.000046 -0.001499 0.000990 0.002549 
+0.009473 -0.006498 0.020625 1.411255 -1.787879 3.541126 
+1.426923 -2.107692 3.815385 1.023256 -2.079070 3.362791 
+-0.001989 -0.013004 0.020402 0.000659 0.000564 0.003811 
+-0.000033 0.000895 0.004767 0.002541 0.001275 0.004451 
+0.001545 -0.000736 -0.000814 0.004174 0.003009 -0.009026 
+-0.001963 0.001813 -0.004346 0.000057 -0.001426 0.001186 
+-0.005164 -0.002558 0.002317 -0.004044 -0.001223 -0.001091 
+-0.000939 -0.000812 -0.000995 0.002035 -0.001450 0.001286 
+0.002577 -0.001847 0.003624 0.000306 -0.002164 0.004398 
+-0.003522 -0.003343 0.001716 -0.004881 -0.003614 -0.000141 
+-0.004514 -0.000652 0.000413 -0.001502 -0.000075 0.000025 
+0.001463 0.001952 0.001708 0.001393 0.002274 0.000721 
+0.001126 0.000053 -0.001052 -0.000560 -0.001065 -0.002662 
+-0.001419 0.000710 -0.001613 -0.002949 -0.002028 0.000184 
+0.000060 -0.003189 -0.003040 0.001978 -0.003148 -0.008194 
+0.002694 -0.002245 -0.009130 0.001004 0.000721 -0.001881 
+-0.002406 0.000279 0.005752 -0.002953 0.002958 0.006898 
+-0.000314 0.005054 0.001095 0.002149 0.001966 0.000726 
+0.002524 -0.002937 0.001499 -0.003018 -0.005744 0.004121 
+-0.003674 -0.001010 0.001250 -0.000805 0.000501 0.001040 
+-0.000654 0.004504 -0.003080 0.001682 0.002335 0.000687 
+-0.002621 -0.001909 -0.001288 -0.001885 -0.000065 -0.000175 
+0.001721 0.001688 -0.002565 -0.000705 0.000620 -0.002116 
+0.000801 -0.001168 0.000184 -0.000393 -0.002214 0.001967 
+0.000040 -0.000252 0.001287 0.000475 -0.000260 -0.000560 
+-0.000144 0.000404 0.002647 -0.001674 -0.005714 0.004632 
+-0.002861 -0.008215 0.002651 -0.000007 -0.004673 0.001327 
+0.000743 0.000442 0.000009 0.000901 -0.000616 0.000183 
+0.000332 -0.001352 -0.000341 -0.000476 -0.002454 -0.001871 
+-0.000399 -0.000377 -0.001596 -0.000610 -0.000051 0.000451 
+-0.001768 -0.000712 0.001516 -0.001840 0.001976 0.000494 
+0.000595 0.001012 -0.000065 0.000301 -0.000075 -0.000602 
+0.000465 -0.000317 0.001672 -0.004150 0.000449 0.001685 
+-0.004309 -0.002911 0.001249 -0.001191 -0.001579 0.000692 
+0.002694 -0.000643 0.000744 0.002950 0.001495 0.000849 
+0.001776 0.001158 0.000384 0.000400 0.000016 0.000475 
+-0.000757 0.001953 -0.001915 0.000319 0.005639 -0.002319 
+-0.000004 -0.000695 -0.000743 0.007591 -0.004740 0.012929 
+0.853535 -1.287879 2.898990 1.427928 -1.891892 3.806306 
+1.455446 -2.366337 3.851485 0.009939 -0.023049 0.024722 
+0.005044 -0.003825 0.002720 -0.000811 0.001710 0.000307 
+-0.002993 -0.002588 0.003615 0.002972 -0.001675 0.006388 
+-0.000504 -0.001197 0.003898 0.002973 -0.001933 -0.003147 
+0.003134 -0.003486 -0.003556 0.001114 -0.003456 0.000076 
+-0.001883 -0.000541 0.000889 -0.000623 0.003280 0.000452 
+-0.000394 0.002099 -0.001007 0.000380 -0.003253 -0.001268 
+0.000575 -0.006075 -0.000504 -0.002206 -0.002613 0.003427 
+0.001139 0.002241 0.004486 0.002952 0.003464 0.002752 
+0.000124 0.000177 0.001909 -0.002575 -0.003745 0.000073 
+-0.006331 -0.003061 0.003026 -0.004968 -0.001279 0.003790 
+-0.001340 0.000333 0.001172 0.000643 0.002927 -0.001785 
+0.001071 0.000563 -0.003434 0.000939 0.000047 -0.001221 
+0.001513 0.000882 -0.002311 0.000877 0.005263 -0.003070 
+-0.004780 -0.000125 -0.009808 -0.001803 -0.001276 -0.005293 
+0.002852 -0.000124 -0.001886 0.005386 0.003669 -0.002921 
+0.008080 0.004743 0.000217 0.004705 0.005632 0.003475 
+0.002301 0.004996 -0.000588 -0.001121 0.002030 -0.002057 
+-0.001229 0.002115 -0.005868 -0.000362 0.002104 -0.005232 
+0.000091 0.002447 -0.001970 -0.000584 0.002035 -0.002561 
+-0.001783 -0.000349 -0.002907 -0.001120 0.005512 -0.003047 
+-0.000080 0.002628 0.000829 0.001114 0.001269 0.000477 
+-0.001627 -0.003133 0.003615 -0.000145 -0.002919 0.005947 
+0.002177 -0.003215 0.002746 0.004073 -0.002087 -0.000601 
+0.002452 -0.000232 -0.000799 -0.001425 -0.000842 0.001621 
+-0.004444 -0.001368 0.001162 -0.004406 -0.000845 0.005661 
+-0.006501 -0.001407 0.006324 -0.001179 0.002480 0.001951 
+-0.001182 -0.008177 0.002298 -0.001489 -0.006557 -0.000443 
+-0.001428 -0.003280 -0.002248 0.000800 -0.001360 -0.001520 
+-0.000058 -0.000405 -0.000359 -0.001676 -0.000442 -0.000597 
+-0.000432 0.000446 -0.000294 0.000243 -0.000751 0.000158 
+-0.001410 -0.002946 0.001159 -0.006622 -0.002486 0.002464 
+-0.002076 -0.004052 -0.003077 0.000342 -0.005887 0.000734 
+0.000229 -0.003664 0.000000 0.004692 -0.002515 -0.001548 
+0.002412 0.000112 -0.001421 0.000310 0.000383 0.000315 
+-0.002025 0.003965 0.000844 0.000976 0.008967 -0.008878 
+-0.000585 0.001206 0.000565 0.009537 -0.008065 0.011924 
+0.006485 -0.020491 0.021222 0.011779 -0.026237 0.027706 
+0.015851 -0.023437 0.025394 0.006412 0.000394 0.003383 
+0.001692 0.007191 -0.007966 -0.000350 0.006804 0.002018 
+-0.003999 0.002719 0.007598 -0.005030 0.002799 0.006652 
+-0.001569 0.001580 0.004114 0.002554 -0.000358 0.002785 
+0.002835 -0.000911 0.000478 -0.000398 -0.000080 -0.000429 
+-0.001507 -0.000933 -0.000658 -0.001449 0.000290 -0.001449 
+0.000079 -0.000143 0.000142 0.001479 -0.002994 0.000803 
+-0.001045 -0.005343 0.001103 -0.000725 -0.002464 0.003934 
+0.000010 -0.000523 0.004675 0.000300 0.003110 0.001964 
+-0.001860 -0.002201 0.001209 -0.005497 -0.007189 0.002328 
+-0.008242 -0.006049 0.001099 -0.005771 -0.001578 0.001951 
+-0.000569 -0.000029 0.000472 0.001524 -0.000180 -0.002869 
+0.000786 0.002281 -0.001271 0.002657 -0.001653 -0.002854 
+0.001550 -0.002978 -0.003396 -0.002940 -0.001062 -0.004902 
+-0.001091 0.003940 -0.004467 -0.002974 0.002370 -0.003880 
+0.004257 0.000408 -0.001386 0.005852 -0.000081 -0.002348 
+0.005387 0.000909 -0.001205 0.002447 0.001198 -0.001305 
+0.000919 0.002707 -0.001600 0.000650 0.002857 -0.000162 
+0.000156 0.000727 0.000675 0.000288 0.000978 0.002106 
+0.000206 0.000326 0.002487 -0.001101 -0.002246 0.002826 
+0.001148 -0.002051 -0.001981 0.001512 -0.003395 0.000091 
+0.000908 -0.000155 0.000743 0.000075 0.000667 -0.001635 
+0.000308 0.000508 0.001050 0.004200 -0.000719 0.002520 
+0.000543 -0.001806 -0.000690 0.000647 -0.002116 -0.000143 
+0.000876 -0.000530 0.000070 -0.002694 -0.001531 0.001016 
+-0.001209 0.000037 0.001604 -0.000561 0.000457 0.001037 
+-0.000306 0.001129 -0.000919 -0.003022 -0.000921 -0.000664 
+0.000000 -0.004553 0.000650 -0.005507 -0.002999 0.000547 
+-0.005052 -0.002177 -0.000904 -0.003818 -0.000707 -0.002070 
+-0.001604 -0.000421 -0.000585 0.001073 0.000063 0.000335 
+0.002579 0.002264 -0.001405 0.000719 0.000057 -0.000368 
+-0.003333 -0.000386 0.001079 -0.006921 -0.000364 0.000571 
+-0.006657 0.001136 -0.001464 -0.003815 0.002585 -0.001106 
+-0.000018 0.001679 0.000072 0.001488 0.000501 -0.001445 
+0.002934 0.004639 -0.002502 0.002907 0.004406 -0.000004 
+0.003519 0.003832 -0.001544 0.000533 0.003060 -0.004076 
+0.001499 0.003349 0.001405 -0.004356 0.000645 0.003776 
+-0.005304 -0.001882 0.008721 -0.002945 -0.002752 0.004808 
+-0.000287 0.001928 0.000709 -0.001425 0.002231 0.003480 
+-0.002106 0.002881 0.002961 -0.005488 0.002334 0.001009 
+-0.007094 -0.000838 0.001675 -0.000087 -0.001319 0.003221 
+0.000015 -0.000053 0.002687 0.001079 -0.001007 0.001079 
+0.002514 0.000259 -0.000033 0.000578 0.000690 -0.000873 
+-0.001724 -0.001789 -0.000846 -0.001883 -0.003635 -0.001669 
+-0.000007 -0.005437 -0.001109 0.000944 -0.006583 0.000322 
+-0.005154 -0.005777 0.005599 -0.001815 -0.002782 0.001613 
+0.000726 0.001452 0.000726 -0.000626 0.001952 -0.004330 
+-0.001340 0.002985 -0.001182 -0.003859 0.001938 0.000956 
+-0.001838 0.000594 0.000838 0.004348 0.002174 0.000181 
+0.007205 0.001863 -0.002752 0.001416 0.000036 -0.004183 
+-0.003196 -0.006322 0.000440 -0.000866 -0.005468 -0.003492 
+-0.006964 -0.001306 0.001087 -0.002085 -0.000796 -0.000011 
+0.000411 0.001364 -0.005045 0.000609 0.003443 -0.007892 
+-0.003309 -0.000153 -0.002106 -0.000088 -0.004395 -0.001525 
+-0.002075 -0.005052 0.002697 0.000834 -0.002352 0.003200 
+0.003216 0.002329 -0.001082 0.000910 -0.000545 0.000578 
+0.000563 0.001024 0.001498 -0.005544 0.001424 -0.000247 
+-0.006924 -0.002456 0.003352 -0.004286 0.000000 0.000238 
+-0.001911 -0.001447 0.002727 -0.002146 -0.003576 0.002576 
+-0.001501 -0.000300 0.001970 0.000448 0.000967 0.002193 
+0.002838 0.001971 0.000347 0.002030 0.000860 -0.001003 
+-0.000870 0.002324 -0.000631 -0.000439 0.000924 0.002171 
+-0.000091 -0.004370 -0.000057 -0.006317 -0.005810 -0.001337 
+-0.004991 -0.004244 -0.001660 -0.000280 -0.001689 -0.000715 
+-0.000175 0.001545 -0.000612 0.001675 0.000843 0.000700 
+-0.001152 -0.001403 -0.000581 -0.004863 -0.000874 -0.003989 
+-0.003603 -0.000562 0.001110 -0.002804 -0.003502 -0.000710 
+-0.001850 -0.003392 0.002732 0.001496 -0.002248 0.002380 
+0.003818 -0.001117 0.000702 0.003306 -0.000171 0.000853 
+0.000234 0.000002 0.000894 -0.001813 -0.000279 -0.000422 
+-0.001812 -0.000101 -0.002093 -0.000939 0.000637 -0.002541 
+-0.000030 0.001481 -0.000944 0.000580 0.001840 0.001203 
+0.001496 0.000112 0.000741 0.000774 0.002385 -0.000459 
+0.002918 0.002802 -0.000950 0.001032 0.002556 -0.005162 
+0.001271 0.004223 0.002686 -0.000802 0.005280 0.010357 
+0.003324 0.002811 0.012354 -0.000697 -0.004050 0.007787 
+-0.008706 0.003283 0.004120 -0.000400 0.000263 -0.000376 
+0.001006 -0.001777 0.000702 -0.000648 -0.001943 0.002951 
+-0.002977 -0.001432 0.002298 -0.000735 0.001055 0.003636 
+0.000111 0.000522 0.002065 0.001200 0.002579 -0.000868 
+0.005398 -0.003754 -0.001595 0.005073 0.003157 -0.008961 
+0.001713 0.001541 -0.007000 0.000270 -0.001622 -0.005177 
+-0.000589 -0.000290 -0.003101 -0.000876 -0.000843 -0.000099 
+-0.000625 0.000000 0.001563 -0.002139 -0.001302 0.001999 
+-0.001263 -0.001106 0.000159 0.000750 0.001644 -0.001489 
+0.000867 0.003193 -0.001854 -0.000926 0.000446 -0.001302 
+0.004258 -0.002258 -0.002896 0.005222 -0.001130 -0.007292 
+0.004386 0.000996 -0.008457 0.001852 0.000820 -0.007803 
+0.001416 -0.001770 -0.002823 -0.000360 -0.005400 0.004470 
+0.001328 -0.004604 0.006641 -0.002858 -0.002287 0.004571 
+-0.000744 -0.001302 -0.000372 -0.004589 -0.001191 -0.001304 
+-0.003047 0.001406 -0.001641 0.005415 0.000515 -0.001418 
+0.003856 0.000481 -0.004776 0.003097 0.001345 -0.001503 
+-0.000040 -0.000033 0.000279 -0.000743 0.000350 0.001179 
+-0.000378 0.000716 0.000193 -0.002109 -0.001073 0.000939 
+-0.001497 -0.000221 0.001302 -0.000005 -0.002877 -0.001155 
+0.003587 -0.001740 -0.000538 0.000215 0.000172 -0.001762 
+-0.000269 -0.000090 0.001567 -0.004769 -0.002831 0.002882 
+-0.000916 0.000122 0.000092 -0.000227 0.000807 0.003226 
+0.001559 0.002716 -0.002025 0.002092 0.004071 -0.003843 
+0.000489 0.000033 -0.002151 -0.002077 0.000320 0.002237 
+-0.009136 -0.005187 0.000023 -0.006758 -0.004667 0.002957 
+-0.003107 -0.000830 0.003344 -0.000922 -0.001744 -0.000034 
+-0.005049 -0.004610 0.000659 -0.004692 -0.005538 0.000846 
+-0.001063 -0.001949 0.000886 0.001469 0.000515 0.000435 
+0.000174 -0.002869 -0.001392 -0.000473 -0.005471 0.002190 
+-0.001686 -0.005703 0.002926 -0.000504 -0.002678 0.001729 
+0.000248 -0.001032 0.001754 -0.000456 -0.001963 0.004976 
+-0.001117 -0.003940 0.006391 -0.000156 -0.000979 0.000191 
+-0.001078 0.002554 -0.000552 -0.001501 0.002522 -0.000948 
+0.000174 0.001020 -0.002214 -0.000007 0.001932 0.000545 
+0.004609 0.004094 -0.001975 0.003437 0.005189 -0.006279 
+0.005581 0.002470 -0.001064 0.002074 0.002423 0.004290 
+0.002839 0.003464 0.005625 0.001679 -0.001667 0.001879 
+-0.006525 -0.002249 0.007631 0.000650 -0.003308 0.005118 
+-0.001082 -0.004834 0.002609 0.002994 -0.000075 0.000936 
+0.003867 0.004854 -0.001263 0.000457 0.004342 -0.000232 
+0.000208 0.001341 0.000452 0.002296 0.000700 -0.002195 
+0.004013 0.003314 -0.005933 0.009105 0.003684 -0.005907 
+0.003541 0.004772 -0.006462 0.001693 0.000725 -0.005074 
+0.001562 -0.000782 -0.003891 0.001233 -0.000959 -0.003125 
+0.004561 0.001825 -0.002677 0.001536 0.002048 -0.003106 
+-0.000401 -0.000100 -0.002815 -0.001183 -0.001110 -0.001063 
+-0.000901 -0.001234 -0.000058 -0.001354 -0.000299 -0.001643 
+0.005059 0.003469 -0.005175 0.004524 0.001005 -0.012134 
+0.000832 0.002631 -0.009213 0.001380 0.002373 -0.006026 
+0.005064 0.003525 -0.004313 0.006116 0.002308 0.000764 
+0.002869 0.000585 -0.000227 -0.004175 -0.000418 0.002912 
+-0.007755 -0.004731 0.001540 -0.004447 -0.003407 -0.002042 
+0.002259 -0.002729 -0.001853 0.006121 -0.000374 -0.001670 
+0.005066 0.000797 -0.001157 0.001641 0.000937 0.001406 
+-0.001443 0.001638 0.003026 -0.002736 -0.000342 0.003000 
+-0.000666 -0.000350 -0.000263 0.000246 -0.000882 0.000311 
+0.002988 -0.002323 -0.003153 -0.003542 -0.000352 0.001780 
+0.005493 0.002811 -0.000048 0.003533 0.001111 0.003155 
+-0.000151 -0.001833 0.006640 -0.005166 -0.005737 -0.000114 
+0.002717 0.000009 0.002730 0.002839 -0.001374 0.003617 
+0.002174 0.003551 0.002174 0.000347 0.004720 -0.003253 
+-0.001503 -0.001235 -0.005044 -0.000709 -0.006381 -0.002124 
+-0.007265 -0.007337 0.000507 -0.002443 -0.004795 0.000763 
+-0.000408 -0.000888 0.000371 -0.000849 -0.001761 0.000451 
+-0.000385 0.000196 0.000329 -0.003736 -0.004505 0.006791 
+-0.001701 -0.003915 0.004427 0.000113 0.000038 0.000526 
+0.000817 0.000978 -0.001461 -0.001792 -0.001321 -0.000139 
+-0.006326 -0.004134 0.002255 -0.009025 -0.003729 0.001737 
+-0.005835 -0.002564 -0.001167 0.000579 -0.001597 0.003475 
+-0.000683 -0.000407 0.007496 -0.001776 0.003042 0.005890 
+-0.003655 0.002797 0.001413 -0.003282 -0.000586 -0.001120 
+0.000389 0.000011 -0.001189 -0.001333 0.003573 -0.001092 
+0.003622 0.000775 0.001163 -0.000007 0.008710 -0.001092 
+0.000896 0.003414 -0.005496 0.000956 -0.000298 -0.003989 
+-0.000125 0.001807 0.000227 -0.000969 -0.000136 0.000421 
+-0.005426 -0.002569 0.008440 -0.003134 -0.007701 0.013447 
+-0.007352 -0.010785 0.011519 -0.005347 -0.005214 0.004278 
+-0.000307 0.001789 -0.000050 0.001704 0.003172 -0.002115 
+0.001061 0.000769 -0.002580 -0.000633 0.001395 -0.001788 
+0.000244 0.000881 0.000045 0.000199 0.000324 0.000382 
+0.000598 -0.002684 0.001940 0.000868 -0.000538 0.000246 
+-0.001111 0.000136 0.001680 -0.000710 -0.000289 0.000691 
+0.001320 0.001040 -0.000450 0.001223 0.003276 -0.000790 
+-0.000706 0.003376 -0.002394 -0.002927 0.001364 0.000418 
+-0.001461 -0.002958 -0.003069 -0.000506 -0.000582 -0.004319 
+0.005608 -0.000367 -0.006476 0.004463 -0.002246 -0.008720 
+0.003423 0.003446 -0.009140 0.006710 0.003009 -0.003786 
+0.006045 0.001282 0.000320 0.003372 0.002673 0.002282 
+0.000768 0.001836 0.000824 -0.000927 -0.003831 0.000726 
+-0.001095 -0.008843 0.000962 0.001816 -0.004465 -0.000833 
+-0.002044 -0.000527 0.000560 -0.001039 -0.001059 -0.001358 
+0.000014 -0.000622 0.001135 -0.004720 -0.002841 0.003551 
+0.000041 -0.003940 0.002041 0.000732 -0.003460 0.000202 
+0.000800 -0.001235 -0.004871 0.001618 -0.001362 -0.006600 
+0.003680 -0.000409 -0.004825 0.003866 0.000390 0.000937 
+-0.002021 0.003471 -0.001143 -0.001098 0.002036 -0.002385 
+0.001675 0.001554 0.000101 0.000289 -0.000020 0.002806 
+-0.002701 -0.002117 0.005328 0.001284 -0.000428 0.005996 
+0.000212 -0.001144 0.004725 0.001170 -0.001959 -0.000789 
+-0.001146 -0.000962 -0.000665 -0.000893 0.000284 -0.000948 
+-0.002799 -0.000492 -0.000330 -0.000302 -0.003445 0.000729 
+-0.000382 -0.005459 -0.001708 -0.001707 -0.004278 -0.003214 
+0.000304 -0.004497 -0.000676 -0.000340 -0.000846 0.002877 
+-0.001878 -0.002792 0.002646 -0.000163 -0.000987 0.001073 
+0.000059 0.000815 -0.000827 0.000056 0.002237 -0.002393 
+-0.001343 0.000568 -0.004133 -0.001851 -0.002551 0.000180 
+-0.003783 -0.001772 -0.001208 0.000431 -0.001470 -0.000189 
+0.000871 -0.001291 0.002088 0.001783 -0.001775 0.003588 
+-0.002077 0.000260 0.005106 -0.002854 -0.010607 0.003607 
+-0.000570 -0.008535 0.000486 -0.000859 -0.001200 0.000900 
+-0.001878 0.001029 -0.001338 0.002273 0.001667 0.001667 
+0.005240 0.006293 -0.002794 0.005260 0.004066 -0.002061 
+0.003895 0.000637 0.001109 0.000067 -0.002151 0.001388 
+-0.003151 -0.003250 0.000571 -0.006795 -0.004034 0.001045 
+-0.004676 0.000460 -0.004332 -0.013819 0.002043 -0.000738 
+-0.012026 0.000658 0.001159 -0.002276 0.004700 -0.002779 
+0.003485 0.009106 -0.006180 0.002150 0.009424 -0.002256 
+0.000634 0.003804 -0.000809 0.000479 -0.000860 0.000260 
+0.000335 -0.002910 0.000419 0.000650 -0.003893 -0.001726 
+0.003933 -0.003693 -0.002629 0.002018 -0.000095 0.000123 
+-0.001468 -0.000021 -0.001143 -0.001838 0.003114 -0.001263 
+-0.000326 0.005183 -0.000549 0.003005 0.003860 -0.003003 
+0.006719 0.002728 -0.004597 0.008952 0.001484 -0.001495 
+0.005005 -0.001497 -0.002164 0.001746 -0.002031 -0.003385 
+0.002963 -0.001323 -0.004788 0.004411 -0.000268 -0.004382 
+0.003970 0.002177 -0.003138 -0.000018 0.004991 0.001101 
+0.000150 0.001088 0.001269 0.000311 0.000018 -0.000045 
+0.001187 -0.000069 0.001575 -0.004026 -0.004027 0.004020 
+-0.005055 0.000562 0.001971 -0.001194 0.001463 0.000284 
+-0.000797 0.002174 0.000369 -0.005203 0.001951 0.000325 
+-0.001494 -0.001368 -0.002117 -0.004688 -0.002271 -0.001274 
+0.000999 -0.002288 -0.003702 0.002952 -0.002723 -0.004300 
+0.010190 0.005472 -0.005739 0.008875 0.003025 0.001675 
+0.000000 0.005573 -0.000153 0.000856 -0.000360 -0.001605 
+0.000639 -0.001234 -0.001732 0.001768 -0.000816 0.001224 
+0.000411 -0.002384 0.000391 -0.000217 -0.004110 0.002899 
+0.001223 -0.003880 -0.001012 0.001008 -0.002958 -0.003944 
+0.000613 -0.000833 -0.000097 0.003673 0.008667 0.001046 
+0.003241 0.001421 -0.000308 -0.004050 -0.000937 0.006812 
+-0.002064 -0.009026 0.000397 -0.001574 -0.006226 0.003117 
+0.001998 -0.002251 -0.000420 -0.000777 0.002292 -0.000076 
+-0.000961 0.002389 -0.002082 0.000000 -0.000081 -0.001129 
+0.000938 -0.000827 -0.004334 0.002147 0.004348 -0.005851 
+0.004272 0.005554 -0.006172 0.004374 0.002510 -0.000789 
+-0.000010 0.001712 0.001448 -0.000226 0.001445 0.001022 
+0.000697 0.001598 0.001381 0.001022 0.001037 0.002044 
+-0.000940 -0.001038 0.002626 -0.002548 -0.003809 0.002100 
+-0.005538 -0.003692 0.001259 -0.006039 -0.001066 0.000173 
+-0.000730 -0.000005 0.001477 0.000599 -0.000778 -0.001346 
+0.000498 0.001343 -0.006254 0.000136 0.002382 -0.005961 
+-0.001253 0.001174 0.003647 -0.003137 0.003030 0.002768 
+-0.005106 0.000757 0.000872 -0.005458 0.003462 0.001723 
+-0.005758 0.006147 -0.002335 -0.009557 -0.002552 -0.005417 
+-0.009063 -0.002873 0.004309 -0.002175 -0.002208 0.002257 
+0.001637 0.005192 0.000536 0.001728 0.003946 -0.000188 
+-0.002755 -0.000352 -0.000609 -0.000565 -0.000550 -0.001668 
+0.002193 -0.001915 -0.004968 0.001222 -0.001552 -0.009584 
+-0.000654 -0.003468 -0.007077 -0.000929 -0.003346 -0.004913 
+-0.001952 -0.002851 -0.002399 -0.000953 -0.001042 -0.002557 
+-0.000923 -0.000177 -0.001516 0.001700 -0.000632 0.000051 
+0.003719 0.000593 -0.001120 0.003186 0.005600 -0.002124 
+0.001247 0.003842 -0.001094 0.002020 -0.002115 -0.001539 
+0.001245 -0.003056 -0.001983 0.002589 -0.000364 -0.001194 
+0.002590 0.007984 -0.004535 -0.000061 0.006578 -0.002579 
+-0.001613 0.001309 -0.000675 -0.000939 -0.002856 -0.000332 
+-0.002355 -0.001689 -0.003080 -0.001069 -0.000677 -0.001019 
+-0.001679 0.000458 0.002362 -0.004884 -0.002336 0.002743 
+-0.006419 -0.001615 -0.000121 -0.005814 0.001404 0.000604 
+-0.003200 -0.000474 -0.001264 -0.001529 0.000218 -0.001310 
+-0.001654 -0.000543 -0.001757 0.001652 -0.001252 -0.002504 
+0.000362 0.002538 -0.000218 0.000167 -0.000723 0.000039 
+0.001665 -0.000608 0.000067 0.002961 -0.001328 0.001225 
+0.000282 0.000524 0.000918 -0.000764 -0.002158 0.000668 
+0.000981 0.000881 -0.001127 0.000276 0.001740 -0.003940 
+-0.000336 -0.000569 -0.001587 0.000939 -0.000353 0.000584 
+0.000987 -0.000337 -0.001187 0.000204 -0.000381 -0.001879 
+-0.001567 0.002881 -0.003117 -0.003224 0.001210 -0.000336 
+-0.000084 0.000096 -0.001040 0.000657 -0.001443 0.000524 
+0.000537 -0.001159 0.000085 -0.000711 -0.000622 -0.000470 
+-0.000347 -0.000288 -0.001097 -0.000486 0.000258 -0.001742 
+0.000055 0.002155 -0.001289 0.000714 0.000276 -0.001979 
+0.000213 0.001921 -0.000152 0.001137 0.001018 -0.000479 
+-0.002964 0.000823 -0.000655 -0.005566 0.005049 -0.000776 
+-0.006335 0.006109 -0.002866 -0.004374 0.006219 -0.002225 
+-0.001049 0.005041 -0.000179 0.000820 0.002260 0.000997 
+-0.003324 -0.000234 0.001257 -0.002870 -0.005662 0.004422 
+-0.000953 0.000027 -0.001606 -0.002563 0.001024 -0.001343 
+-0.001683 0.000519 -0.001315 -0.001679 0.000678 -0.000613 
+-0.003055 0.001067 0.001441 -0.005639 -0.000192 0.003081 
+-0.004831 -0.002536 0.002142 -0.003306 -0.003259 0.000840 
+-0.004090 -0.003274 -0.000365 0.001085 -0.005400 -0.001941 
+0.001846 -0.000807 0.000071 -0.005194 -0.002620 0.005303 
+-0.004918 -0.004865 0.003516 -0.006028 -0.002508 0.002266 
+-0.005693 -0.002621 -0.001446 -0.005026 -0.002825 -0.003863 
+-0.001823 0.000041 -0.005414 -0.001176 0.002263 -0.006238 
+-0.001874 0.004324 -0.005622 -0.002146 0.002692 -0.001717 
+-0.003496 -0.001682 -0.000228 -0.004159 -0.001099 0.000807 
+0.002792 0.000724 0.000088 0.008745 0.000076 -0.000768 
+0.005912 0.003355 -0.003197 0.000518 0.005660 -0.004867 
+0.000007 0.004824 -0.005105 0.003069 0.002360 -0.002295 
+0.000279 -0.002787 0.000557 0.004858 -0.001250 -0.000822 
+0.002563 0.002958 -0.001260 0.002343 0.001507 0.000085 
+-0.001155 -0.000006 -0.002258 -0.002889 0.000670 -0.001786 
+-0.003191 -0.001866 -0.001823 -0.002623 -0.000381 -0.001804 
+-0.000711 -0.000714 -0.003202 -0.004404 -0.001341 0.001015 
+-0.003006 -0.002154 -0.002524 0.000156 -0.000742 0.000430 
+0.001812 0.001906 -0.000581 0.002031 0.005504 -0.002397 
+0.002910 0.003642 -0.002946 -0.001762 -0.000222 -0.001374 
+-0.005020 -0.001630 0.003800 -0.000988 -0.000746 0.005311 
+0.004405 0.001066 0.000939 0.003105 0.000551 -0.000050 
+-0.001435 -0.002673 0.001516 -0.000803 0.000803 0.004380 
+0.000441 -0.000275 0.001562 0.000361 0.002362 0.001445 
+-0.000276 0.003041 0.002203 0.004667 0.002377 0.003904 
+0.000684 0.000679 0.004090 -0.001940 -0.000681 0.003836 
+-0.001794 -0.002626 -0.000397 -0.000755 -0.001735 -0.001425 
+-0.001503 -0.001325 -0.002907 -0.002675 0.000021 -0.002624 
+-0.003913 -0.001530 0.003061 0.001368 -0.003803 0.000556 
+0.000546 -0.000844 0.000972 0.002287 0.003540 -0.000650 
+0.001996 0.000724 0.002047 0.000721 0.000399 0.004074 
+0.001775 -0.000109 0.002678 0.003256 0.000504 0.000504 
+0.001860 0.000038 0.000043 -0.002415 -0.000038 0.000201 
+-0.004717 -0.001804 0.001491 -0.000199 0.000630 -0.001492 
+0.000167 0.004043 0.000100 0.001891 0.001257 -0.000262 
+-0.000621 -0.003457 0.003029 0.001421 -0.003313 0.000475 
+-0.000832 -0.000871 -0.000806 -0.000306 0.002249 0.000330 
+-0.001332 0.000640 -0.000677 -0.002334 0.001075 -0.001309 
+-0.007943 0.003688 0.003502 -0.002459 0.000524 -0.003278 
+0.005970 0.007644 -0.007232 0.004108 0.006161 -0.008350 
+0.005017 0.001723 -0.006640 0.003303 -0.001155 0.000166 
+0.001238 -0.001013 -0.001282 -0.002048 -0.002670 0.002970 
+-0.005049 -0.008151 0.002325 -0.000758 -0.005836 -0.000910 
+0.001360 0.003067 -0.002291 -0.002925 0.005495 -0.004760 
+-0.001293 -0.002564 -0.006478 0.001480 -0.007570 0.000665 
+0.001456 -0.007544 0.001919 0.001364 -0.001367 0.002047 
+0.001648 0.002140 -0.001128 0.001862 -0.000173 -0.000941 
+0.002471 -0.002677 -0.001310 0.005517 -0.001134 -0.002570 
+0.005705 -0.001888 -0.001971 0.002920 -0.002255 -0.000877 
+0.000622 -0.002894 -0.000658 0.000369 -0.001482 -0.000175 
+0.002550 0.002598 -0.004906 0.002683 -0.000266 -0.000346 
+-0.001699 0.000781 0.001221 -0.004256 -0.000257 0.001807 
+-0.002268 -0.001338 0.001498 -0.000329 -0.000374 0.000368 
+0.000682 0.001173 -0.000554 -0.000266 0.001748 -0.000282 
+-0.003352 -0.001915 0.001945 -0.007280 -0.008226 0.002056 
+-0.004708 -0.008965 0.002750 -0.000491 -0.002983 0.002159 
+0.003468 0.000752 -0.001243 0.000388 0.000775 -0.003178 
+-0.001025 -0.000422 -0.001266 -0.000753 0.001064 -0.000757 
+0.001173 0.003570 -0.000862 0.001162 0.004649 -0.001935 
+-0.002585 0.002049 0.003187 -0.000012 0.000802 0.002107 
+0.002076 0.002344 -0.001880 -0.001137 0.005000 -0.000758 
+-0.000221 0.004007 0.000625 0.001847 0.001259 0.004119 
+0.002013 0.001570 0.004490 0.002390 0.000382 0.002123 
+0.001916 -0.000195 0.000704 0.000335 -0.004648 0.002395 
+0.001521 -0.005898 -0.000065 -0.001960 -0.006184 -0.002801 
+-0.005101 -0.004872 -0.005710 -0.006554 0.001622 -0.003374 
+-0.005556 -0.005270 -0.000714 -0.000185 -0.001110 0.000000 
+0.001403 0.002948 -0.001682 0.005440 0.000866 0.000125 
+0.003921 -0.000396 -0.000219 0.001287 -0.000229 0.000881 
+0.000476 -0.000549 0.000286 -0.000486 -0.001051 0.001153 
+0.001886 -0.001099 0.004583 -0.000351 0.000069 0.000110 
+-0.003179 -0.004514 0.000134 -0.000857 -0.001952 -0.000211 
+-0.000142 0.000580 -0.000526 -0.000467 0.001090 -0.000516 
+0.000011 0.000987 -0.000256 0.001273 0.001803 0.000028 
+0.001845 0.002019 -0.000253 -0.000908 0.000230 -0.000810 
+-0.004584 -0.002754 -0.002247 -0.005181 -0.004458 -0.002651 
+-0.002227 -0.002400 0.001214 -0.002356 0.006642 0.005020 
+-0.000074 0.004500 0.002826 -0.000717 0.001997 -0.002026 
+0.002627 0.003043 -0.006515 0.001105 -0.002700 -0.002045 
+0.003018 -0.000155 -0.006485 -0.001470 -0.005041 -0.001453 
+0.001728 -0.005074 -0.001172 0.001267 -0.003666 0.005122 
+-0.002731 -0.002023 0.006801 -0.000924 0.000639 0.004445 
+0.000107 -0.001517 0.000566 0.001930 -0.007552 0.001603 
+0.003822 -0.010439 0.003082 -0.002056 -0.006734 0.005772 
+0.000465 -0.000166 -0.000734 0.000801 -0.001910 -0.003677 
+-0.000567 -0.001870 -0.003635 -0.000334 -0.002965 0.004399 
+-0.002492 -0.005975 0.005681 0.002644 -0.002338 0.002120 
+0.002526 -0.002299 -0.001164 0.005587 -0.000807 -0.004509 
+0.001832 0.004294 -0.009775 -0.001975 0.003385 -0.006389 
+-0.001339 -0.001589 -0.000091 -0.000239 -0.006316 0.004782 
+-0.001571 -0.005952 0.004714 -0.000480 -0.000606 0.000412 
+0.002294 0.004075 -0.001526 0.002407 0.002309 -0.000800 
+-0.001156 -0.003095 -0.000075 -0.003040 -0.007092 0.006391 
+-0.005817 -0.008414 0.009413 -0.005587 -0.008689 0.007136 
+-0.002086 -0.008690 0.001388 -0.005577 -0.005577 -0.002308 
+0.001524 -0.002508 -0.003146 -0.000298 0.000720 -0.002238 
+-0.001540 0.001307 0.000305 -0.001980 0.000045 0.001124 
+-0.003558 -0.001256 0.003611 -0.001626 -0.001467 -0.000437 
+-0.000189 0.001996 -0.000731 -0.000122 0.004647 -0.000560 
+-0.001731 0.004208 0.001058 0.000697 0.003043 0.002662 
+0.001106 0.003949 -0.000080 -0.001584 0.001939 0.001229 
+0.001168 -0.002336 0.003285 0.001314 -0.004819 0.006260 
+-0.005526 -0.010128 0.006435 -0.011734 -0.007127 0.002954 
+-0.006138 -0.003802 -0.002607 0.000299 0.000641 -0.005938 
+-0.001099 0.001372 -0.005207 -0.000369 -0.000378 0.000613 
+-0.003609 -0.001846 0.000882 0.001803 -0.000810 -0.000286 
+0.005244 0.001211 -0.000134 0.002462 0.003403 -0.003043 
+-0.002000 0.001887 -0.001078 -0.000755 -0.001017 0.001766 
+-0.003079 -0.004756 -0.001126 -0.001058 0.000339 -0.000111 
+-0.000427 -0.000184 -0.002544 -0.002559 0.000551 -0.002559 
+-0.003612 -0.000187 -0.002685 -0.000560 -0.000560 -0.002015 
+0.002234 0.001927 -0.001694 0.001437 0.000299 -0.002020 
+0.001100 -0.000364 0.002742 -0.002463 -0.003045 0.004329 
+-0.002354 -0.002817 0.002575 0.001258 0.001363 -0.001376 
+0.005932 0.003142 -0.005985 0.005544 -0.001265 -0.005335 
+0.000631 -0.000868 -0.001301 -0.000650 0.001405 0.001756 
+0.000662 0.001263 0.003085 0.002102 0.001346 0.001323 
+0.001518 -0.001027 0.001027 0.001074 -0.001676 0.001406 
+-0.000003 -0.000554 0.002648 -0.000759 0.000169 0.004211 
+-0.000338 -0.001397 0.004820 -0.000848 -0.000728 0.002394 
+0.001051 0.001266 -0.001842 0.002815 0.001086 -0.002383 
+0.000056 -0.001438 -0.001737 0.000496 -0.002643 0.003799 
+0.001060 -0.001947 0.001839 0.004034 -0.000636 0.001753 
+0.004751 0.001857 -0.002130 0.000723 -0.000174 -0.000543 
+-0.002788 0.000762 0.003103 -0.002386 0.004758 0.001197 
+0.001803 0.005922 -0.001860 0.001012 0.004557 -0.003039 
+0.002304 -0.000114 -0.004068 -0.002552 -0.001151 -0.001451 
+-0.005041 0.001292 0.000375 0.000032 -0.000436 -0.000208 
+-0.001954 -0.000986 0.003757 0.001667 0.001617 0.001340 
+0.003097 0.001001 -0.001682 0.001551 0.000870 0.000247 
+-0.001313 -0.000393 -0.003562 -0.000078 -0.001583 -0.004604 
+-0.001588 -0.001471 0.000112 -0.001388 -0.003243 -0.000962 
+-0.001816 -0.002327 -0.001787 0.001480 0.001024 -0.002212 
+0.000721 0.001635 -0.002255 -0.003814 0.000561 0.001122 
+-0.003934 -0.001235 -0.000424 -0.000083 0.000426 0.000076 
+0.000133 -0.000800 -0.001333 -0.002507 0.002788 -0.000324 
+-0.002402 0.001633 -0.001605 -0.001826 0.000771 -0.002219 
+0.001559 0.002683 -0.003748 0.006927 0.007068 -0.003182 
+0.004488 0.009028 0.003611 0.005267 0.007352 0.001777 
+0.003228 0.002534 0.000350 -0.001756 -0.001203 -0.000009 
+-0.002570 -0.007337 0.004218 -0.004229 -0.004947 0.002824 
+0.000038 0.000172 0.002171 0.002386 0.004143 -0.002126 
+0.004992 0.002422 -0.003856 0.003559 -0.000196 -0.001502 
+0.000346 -0.001309 -0.001848 -0.000316 -0.002510 -0.001225 
+-0.001507 -0.001629 0.000316 -0.000216 -0.001734 0.000361 
+-0.001838 -0.000405 -0.000138 -0.000735 -0.000330 -0.001619 
+0.002243 0.000598 -0.001013 0.002334 0.000221 -0.001976 
+-0.000468 0.000047 -0.000227 -0.003304 0.000881 -0.000624 
+-0.003781 0.000583 -0.002761 -0.000311 -0.001489 -0.002875 
+0.000027 -0.000684 -0.003098 -0.002286 -0.001476 -0.001522 
+-0.001891 -0.004221 0.001766 -0.004731 -0.002452 0.002614 
+-0.000432 -0.002337 0.000940 0.002194 0.001944 0.002692 
+0.001939 0.003015 0.003290 0.004215 0.006014 0.001202 
+-0.002646 0.007244 -0.004469 -0.001458 0.004506 0.002707 
+0.005534 0.004379 0.001463 0.003885 0.002920 -0.003368 
+0.000167 -0.002921 0.002696 -0.002217 -0.007149 0.008267 
+0.000818 -0.003312 0.008420 -0.003084 -0.001626 -0.000182 
+-0.000693 0.001566 -0.000282 0.001158 0.000522 -0.002774 
+0.001165 -0.000974 -0.000348 -0.005804 -0.004711 0.000277 
+-0.003383 -0.001383 -0.004237 -0.000232 -0.000212 0.001874 
+0.002951 -0.000459 0.000344 0.001264 -0.000576 0.000732 
+-0.000661 -0.001264 -0.001925 -0.001818 -0.000563 0.000699 
+-0.002247 -0.002106 0.006560 -0.000287 -0.001976 0.007139 
+0.001443 0.000454 0.004206 -0.000194 -0.000969 -0.000388 
+-0.001873 -0.001959 -0.001122 -0.004949 -0.000229 0.000357 
+-0.002613 -0.001574 0.004376 -0.000763 0.000763 0.001271 
+-0.002004 0.000989 -0.001275 0.000930 -0.000073 -0.002649 
+0.004570 0.003123 -0.004024 0.008330 0.003309 -0.001816 
+0.003016 0.002497 0.002444 0.000502 0.000676 -0.000052 
+-0.003575 -0.000358 0.000546 -0.004936 0.002900 -0.001823 
+-0.000366 0.002227 -0.001359 0.002788 -0.003174 0.000499 
+0.000027 -0.005249 -0.000796 0.000889 -0.000366 -0.005957 
+0.004290 0.003014 -0.012899 0.007577 0.009873 -0.012908 
+0.002654 0.000088 -0.002448 0.001159 -0.000737 -0.000421 
+-0.000811 0.001176 0.000091 0.000440 0.000731 -0.003800 
+0.001587 0.003958 -0.004585 0.000372 0.005632 -0.000553 
+0.001078 0.002755 0.000905 -0.000430 0.002020 0.000551 
+-0.000214 0.001178 -0.000750 0.000776 0.000873 -0.001719 
+0.003002 -0.000485 -0.003745 0.003777 0.000262 -0.001580 
+0.001239 0.001586 -0.001509 -0.000813 0.003055 0.000692 
+-0.000627 -0.000937 -0.001041 0.001277 0.001974 -0.004356 
+0.004891 0.002305 0.000047 0.000828 0.000603 -0.001103 
+0.003244 -0.000474 0.002114 -0.003946 -0.000662 -0.000577 
+-0.005295 -0.000878 0.000058 -0.000504 -0.000457 -0.000588 
+0.000646 -0.000503 -0.003000 0.000040 -0.000055 -0.001270 
+-0.000701 0.000876 -0.000963 -0.001243 0.000373 -0.003121 
+0.000039 0.002943 -0.005376 0.000556 0.001357 -0.004538 
+-0.003971 0.000366 0.000559 -0.001980 -0.004628 0.001564 
+-0.000496 -0.001324 0.003085 -0.000207 -0.000731 0.000016 
+0.001149 -0.000676 0.002946 0.000802 0.000606 0.002114 
+-0.000819 0.000941 0.000672 0.004757 0.001185 -0.000520 
+0.004755 0.004138 -0.003021 0.001064 0.002651 0.000578 
+0.003560 -0.000181 0.000676 0.001650 -0.000616 -0.002927 
+0.000726 -0.002220 0.001586 0.002354 -0.004344 0.000533 
+-0.000536 -0.004566 -0.000693 -0.001788 -0.001787 0.001317 
+-0.001513 0.000250 0.001462 -0.000812 0.000511 0.000615 
+0.000055 0.000322 -0.000323 0.000478 0.001065 0.000332 
+-0.000037 0.000427 0.000372 -0.000293 -0.001249 0.000511 
+-0.000024 -0.002764 -0.000073 -0.001074 -0.001277 -0.003648 
+-0.003565 0.001690 -0.001793 0.002708 0.004814 -0.002084 
+0.000280 0.003642 -0.002615 -0.000187 0.000987 0.001165 
+-0.003216 -0.000813 0.000677 -0.003731 -0.002238 0.003333 
+-0.002419 -0.000806 0.002016 0.002131 -0.000223 -0.001089 
+0.002893 -0.000170 -0.003361 -0.000230 -0.002453 -0.000587 
+-0.005505 0.001885 -0.001510 -0.001057 0.000832 0.001825 
+-0.000557 0.000734 0.000542 0.003086 0.003812 -0.001162 
+0.000310 0.001906 0.001959 -0.000960 0.001210 0.002645 
+-0.003109 0.001166 0.003714 -0.002209 -0.000141 0.000788 
+-0.000885 0.005975 -0.003393 0.001260 -0.003618 -0.002439 
+0.003825 0.002367 -0.004871 0.003922 0.000506 -0.011639 
+0.003128 -0.000199 -0.008726 0.000465 0.000171 -0.001285 
+0.000431 -0.000112 0.000618 0.000979 -0.000056 0.000252 
+0.000852 0.000346 -0.002105 0.001467 0.000026 -0.003197 
+0.000066 -0.000537 -0.002770 -0.000337 -0.000315 -0.001994 
+-0.002012 0.000671 -0.001788 0.001651 0.002039 -0.000929 
+0.002907 0.003543 -0.003675 0.002822 0.002136 -0.001106 
+-0.000633 -0.001010 0.000224 -0.001628 -0.002091 0.000751 
+0.000292 -0.000431 -0.000448 0.000287 0.000736 0.000293 
+-0.001584 0.000713 0.000703 -0.000373 0.001490 0.001583 
+0.003108 0.002990 0.002463 0.004525 0.004332 -0.002641 
+0.001235 0.001965 -0.001145 -0.000324 -0.001456 0.000391 
+-0.001603 0.001069 0.000534 -0.000082 -0.000424 0.003047 
+-0.000163 -0.000987 0.002373 -0.002845 0.000479 0.001754 
+-0.001677 0.001793 0.001638 -0.001672 0.000478 -0.002628 
+-0.001031 0.000118 -0.003064 -0.000771 -0.000510 -0.001372 
+-0.003796 -0.002272 0.000604 -0.000564 -0.001890 0.003384 
+-0.000403 -0.001756 0.001783 -0.000319 -0.001783 0.000072 
+-0.000043 -0.002395 0.000315 0.000483 -0.003223 0.002360 
+0.001102 -0.000562 0.004629 0.001827 0.002670 0.003768 
+0.000471 0.002394 0.001970 0.000320 0.001467 0.001385 
+0.000782 0.000480 0.000613 0.000607 -0.001093 0.001705 
+-0.002720 -0.001568 -0.002195 -0.001116 -0.005023 -0.001938 
+0.002679 0.000686 0.000327 0.001479 0.000076 -0.004558 
+-0.000107 0.001114 -0.002045 -0.001105 0.001082 0.000580 
+-0.001835 -0.000642 0.000000 0.002261 -0.000718 0.002426 
+-0.000991 -0.000507 0.003709 -0.001195 0.000152 0.001764 
+-0.001475 0.000311 0.000623 -0.000297 0.000977 -0.000283 
+-0.002228 0.002277 -0.004356 -0.001000 0.002517 0.000648 
+-0.002622 0.001017 0.003763 -0.004951 -0.000827 0.006189 
+0.000279 0.000629 0.003491 -0.000145 0.000901 -0.000995 
+0.000811 0.000735 -0.007031 -0.001975 0.002818 -0.003147 
+-0.003653 -0.003090 -0.003428 -0.002832 -0.000497 -0.003057 
+-0.001135 0.000454 -0.004553 0.000559 0.001151 -0.005714 
+0.000931 -0.000098 -0.002647 -0.000774 -0.000043 0.001740 
+-0.000747 0.000611 0.002868 -0.000882 0.000978 0.000681 
+-0.000352 0.000176 0.000160 0.001858 -0.000637 -0.000752 
+0.003678 0.000012 -0.001625 0.002778 0.001188 -0.001191 
+-0.000560 0.002199 0.000399 -0.001821 0.003339 0.003906 
+-0.002222 0.000889 0.001222 0.001040 0.001637 0.000760 
+-0.001811 0.001771 0.003421 0.000452 0.001150 0.002252 
+-0.000457 -0.001012 -0.000901 -0.000234 -0.002124 -0.001787 
+-0.000054 -0.002322 0.000828 -0.003664 -0.001298 0.002028 
+-0.000657 0.000547 0.006345 0.003246 -0.001673 -0.000420 
+0.005516 0.001197 -0.001735 0.001118 -0.000662 -0.000146 
+-0.002021 -0.000677 -0.001263 -0.000686 -0.000566 -0.000031 
+0.001879 0.002029 -0.001384 0.002211 0.003668 -0.005515 
+0.001952 0.003860 -0.006777 0.000491 0.003179 -0.004465 
+0.001144 0.002708 -0.001163 0.000316 0.001878 -0.000522 
+0.000740 0.002705 -0.000493 0.001249 0.003324 -0.002083 
+-0.000425 0.002490 -0.000967 -0.000761 0.000684 0.002134 
+-0.002875 -0.001393 0.002825 -0.002059 0.000390 -0.000167 
+0.001843 0.002054 0.000085 0.004099 0.002536 -0.000586 
+0.000877 0.001368 -0.000256 -0.002141 -0.002527 0.000035 
+-0.005780 -0.002171 0.001467 0.000329 -0.000034 0.001247 
+0.000184 -0.001535 0.002806 -0.000306 -0.001366 0.000239 
+-0.000655 -0.001060 -0.002490 -0.000448 -0.002056 -0.003526 
+-0.000950 -0.006077 0.002468 0.003568 -0.005982 0.007801 
+0.001356 -0.004830 0.004246 0.000408 -0.001528 -0.000512 
+-0.002551 -0.000194 -0.001252 -0.002317 0.000977 -0.002245 
+0.001043 0.000062 -0.001441 -0.000561 0.001669 -0.001360 
+0.001638 0.002338 -0.000896 0.000368 -0.000027 -0.002681 
+0.000188 -0.000359 -0.000871 0.002518 0.001424 -0.000369 
+0.005030 0.000992 0.001924 0.003403 -0.000291 0.001187 
+-0.002091 -0.003857 0.002207 -0.005286 -0.001709 0.000412 
+-0.001919 -0.000800 0.001852 -0.000459 -0.005037 0.001832 
+-0.001388 -0.005357 0.000198 -0.000397 -0.002712 0.002451 
+0.000266 0.000898 0.000086 0.002238 0.001505 -0.000727 
+-0.002205 0.001705 -0.001335 -0.000590 0.001974 -0.001174 
+-0.000365 -0.002018 -0.000375 -0.004863 -0.002277 -0.002596 
+-0.003441 -0.000668 -0.001993 -0.001160 0.003831 -0.000281 
+-0.001864 0.006469 -0.002017 0.000985 0.007517 -0.001503 
+-0.002431 0.002443 -0.001823 0.002694 -0.000920 -0.002456 
+0.000735 -0.002380 0.000563 0.000977 0.000407 0.000698 
+-0.001009 0.000117 -0.002496 0.000920 -0.001664 -0.000717 
+-0.000957 -0.002854 0.000274 -0.006485 -0.003967 0.001106 
+-0.000196 -0.001594 -0.000371 0.000910 0.000010 0.002725 
+0.002206 -0.001334 -0.001382 -0.000736 -0.000949 -0.004210 
+-0.003886 0.001706 0.001690 -0.001686 0.000031 0.002483 
+-0.000266 -0.000926 0.001148 0.000823 -0.001072 0.000743 
+-0.002576 -0.001828 0.000139 -0.003837 -0.003847 0.002554 
+-0.002308 -0.000692 0.002385 0.003333 0.000573 0.000521 
+0.003247 0.001499 -0.001698 -0.000476 -0.001015 -0.001058 
+-0.003835 -0.000487 -0.000650 -0.002543 -0.001464 0.000033 
+0.001532 0.000973 -0.001535 0.002511 0.004865 -0.001936 
+0.001419 0.005989 -0.001730 -0.001620 0.003915 -0.001215 
+0.000718 0.000886 -0.002406 0.002650 0.000590 -0.002553 
+0.001801 0.000829 -0.002179 0.000768 0.001866 -0.001515 
+0.000313 0.001191 -0.000618 -0.000529 -0.001804 0.000809 
+-0.001489 -0.002525 -0.001262 -0.001971 -0.002587 0.000015 
+0.000594 0.000063 0.000076 0.003063 0.001449 -0.004760 
+0.002676 0.001048 0.000095 -0.001555 0.004818 -0.004942 
+-0.000132 0.000460 -0.007099 -0.001538 0.000555 -0.002074 
+0.000537 -0.002014 0.002986 0.000317 -0.001868 -0.000851 
+0.000669 -0.002681 0.000282 -0.000373 -0.000026 -0.001682 
+-0.000575 0.002294 -0.001149 -0.000215 -0.000627 0.001457 
+0.000668 -0.002839 -0.000758 -0.000213 -0.001337 -0.003782 
+0.001827 0.002470 -0.003976 0.002756 0.003367 -0.002389 
+-0.003458 0.001672 -0.001497 -0.002009 0.002250 -0.001444 
+-0.000396 0.000073 -0.000756 0.000334 -0.001314 -0.000083 
+0.000035 0.000142 -0.002845 0.005461 -0.003542 -0.001707 
+0.008136 -0.000327 0.000723 0.003183 0.001234 -0.004198 
+-0.000952 -0.000791 0.002139 -0.005280 -0.001782 0.000828 
+-0.005408 0.000812 -0.003343 -0.002791 0.003372 -0.001844 
+0.000327 0.000360 -0.000158 -0.001828 -0.002387 0.000581 
+-0.001396 -0.001895 -0.000348 0.001077 0.000052 -0.002731 
+-0.001549 -0.001195 -0.001582 -0.002523 0.000206 -0.002395 
+0.000141 -0.002401 0.002684 0.000860 0.002841 0.002401 
+0.002739 0.001471 0.000961 0.001306 0.002382 -0.000923 
+-0.000017 -0.001119 -0.001103 -0.003891 -0.000809 0.001119 
+-0.002095 0.000729 -0.000200 0.000099 0.000708 -0.000604 
+0.000931 0.001956 -0.001288 -0.003994 0.000557 -0.003607 
+-0.002324 0.002887 -0.002395 -0.003392 -0.000504 0.001915 
+-0.002875 0.000602 0.002193 -0.003172 -0.000869 0.000707 
+-0.000895 -0.001298 -0.000487 0.002607 0.000635 0.001159 
+0.006228 0.001842 0.002053 0.005930 0.002251 0.002013 
+-0.000397 -0.000249 0.000100 -0.000385 0.000361 -0.003101 
+-0.000215 0.001063 -0.001253 -0.000224 -0.001697 0.000603 
+-0.000386 -0.004433 0.002253 -0.002057 -0.005839 0.000633 
+-0.005428 -0.002393 -0.001751 -0.006212 -0.003404 0.001958 
+-0.005180 -0.004988 0.003875 -0.004916 -0.001282 0.006412 
+-0.000646 -0.001348 0.002948 -0.000760 -0.000074 0.000407 
+-0.001676 -0.001928 -0.001953 0.000258 0.000356 -0.000526 
+0.003719 0.003107 0.000641 0.003262 0.001437 0.002460 
+-0.000266 0.003871 0.000562 -0.001516 -0.000533 -0.001475 
+-0.004619 -0.000740 0.000178 -0.002347 -0.001242 0.000546 
+0.000698 0.000487 0.000110 0.001391 0.001170 -0.000180 
+0.000244 0.000458 -0.000479 -0.000223 0.000712 -0.000209 
+0.001010 0.001417 -0.000647 0.002201 0.003176 -0.001710 
+0.003097 0.001377 -0.003971 0.000943 -0.000875 -0.001009 
+-0.001946 -0.000779 -0.000681 -0.000214 -0.002865 0.001403 
+-0.000542 -0.004733 0.002538 0.000501 -0.001750 -0.000498 
+-0.000066 0.000170 -0.000073 -0.000919 0.002120 -0.001995 
+-0.002998 0.001290 -0.003423 0.001283 -0.000016 -0.005126 
+0.000777 0.000302 -0.006358 0.000317 0.000952 -0.005708 
+0.001192 0.000654 -0.002000 -0.002854 -0.000416 0.001296 
+-0.001793 0.001987 0.000453 -0.002477 0.001900 0.000169 
+0.000020 0.000094 0.000290 -0.000055 0.001607 0.000474 
+0.001548 0.001382 -0.000883 -0.000426 -0.000635 -0.001693 
+-0.000048 -0.001693 -0.001161 0.000482 -0.000641 -0.000938 
+0.002735 0.002701 -0.002047 0.000095 0.006334 -0.001117 
+-0.003710 0.006118 -0.004095 -0.006380 0.003748 -0.002718 
+-0.005238 0.001513 -0.000985 -0.000885 0.000631 -0.000613 
+0.000398 -0.000815 0.000564 0.000231 -0.002367 0.000753 
+0.000569 -0.002012 -0.000295 0.000561 -0.000073 -0.001646 
+0.002275 0.002437 0.000621 0.000623 0.001816 0.000352 
+-0.002724 -0.001339 0.000316 -0.004427 -0.003967 0.001207 
+-0.004560 -0.003319 -0.001499 -0.001574 0.000257 -0.000721 
+-0.001411 0.004686 0.000060 0.001172 0.006951 -0.000647 
+0.003667 0.004029 -0.000661 -0.001166 -0.000578 -0.004228 
+-0.001526 -0.004852 -0.001957 -0.002059 -0.005021 -0.000591 
+0.001476 -0.002827 -0.002032 0.003042 -0.001217 -0.002434 
+-0.000966 0.000024 -0.002306 -0.001878 0.003756 -0.001374 
+0.003058 0.006446 -0.002023 0.000314 0.000451 -0.004275 
+-0.001341 -0.003561 -0.000447 -0.001835 -0.002165 0.000658 
+0.001163 0.000484 -0.002467 0.002952 0.000493 -0.003938 
+0.003134 0.001937 -0.001424 -0.000334 -0.001156 -0.000642 
+-0.000444 0.000045 -0.000821 -0.002639 -0.004692 -0.001075 
+-0.003544 -0.006388 0.000858 -0.006493 -0.002666 0.004266 
+-0.002745 -0.002225 0.002828 -0.001223 -0.001349 -0.000562 
+-0.000297 -0.000665 -0.000879 0.001810 0.000877 -0.003609 
+0.004861 0.000202 -0.002405 0.004897 -0.000897 -0.002069 
+0.002826 -0.001829 -0.002180 0.000711 -0.000444 -0.001747 
+-0.000171 -0.000171 -0.001197 -0.000020 0.000756 -0.000079 
+-0.001524 -0.001947 0.002540 -0.000529 -0.002776 0.002148 
+-0.000079 0.000008 -0.000102 0.003000 0.004306 -0.001979 
+0.004619 0.004333 -0.004357 0.002271 0.002237 -0.003648 
+0.001444 0.000829 -0.002345 0.003910 0.000000 -0.002105 
+0.003239 0.003338 -0.001245 0.000119 -0.000113 0.000471 
+-0.000187 -0.001157 0.002240 0.000787 -0.000889 0.002196 
+-0.000010 0.001082 0.001780 -0.000183 0.001830 0.003051 
+-0.005799 0.001134 0.010087 0.000539 -0.002870 0.006586 
+-0.000274 -0.000685 0.002578 0.000284 0.001399 -0.000865 
+0.000131 0.002031 -0.000939 -0.000106 -0.000344 0.000132 
+-0.000618 -0.002424 0.000228 -0.001080 -0.001163 0.000731 
+0.000646 -0.001938 -0.002846 -0.000423 0.000407 -0.000846 
+0.004583 0.001250 0.000917 0.001745 0.001200 -0.001563 
+-0.000415 -0.000732 -0.001900 -0.000313 -0.001340 -0.002939 
+0.001408 -0.001294 -0.004334 0.001693 -0.002004 -0.003468 
+-0.001040 -0.001011 -0.001695 -0.003054 0.000931 -0.000131 
+-0.001830 0.001126 -0.000020 0.000341 -0.000360 0.000013 
+0.000908 -0.001201 0.000306 -0.000010 -0.002880 -0.000008 
+-0.002792 -0.006951 0.002734 -0.008194 -0.004692 0.003467 
+-0.006846 -0.001608 -0.000078 -0.004707 -0.001345 -0.001284 
+-0.004857 -0.002930 0.000602 -0.000918 -0.001836 0.000492 
+-0.002986 0.001970 -0.002210 -0.000486 0.000953 0.000506 
+0.001494 0.001253 0.001268 -0.000619 0.001284 0.002375 
+-0.000418 0.000302 0.000773 0.000798 -0.001191 -0.000818 
+-0.000210 0.003148 -0.001175 0.001680 0.001355 -0.001761 
+0.002697 0.000292 -0.000363 0.003420 0.004565 -0.000572 
+0.005003 0.006951 -0.007792 -0.001613 0.006625 -0.006510 
+-0.002408 0.001022 -0.002681 0.000959 0.000199 -0.000130 
+0.001235 0.002879 -0.006177 -0.002458 0.000546 -0.002186 
+0.000281 0.000340 0.001212 0.004979 0.003673 -0.000183 
+0.001443 0.004176 -0.004380 0.001371 -0.001829 -0.002857 
+0.000971 0.002446 0.000036 0.000957 -0.000462 0.001430 
+-0.004158 -0.000899 0.002890 -0.001987 0.000243 0.001308 
+-0.001108 0.001179 -0.000286 -0.001409 0.001810 -0.000403 
+-0.000942 0.001272 -0.000524 0.000262 -0.001259 0.003415 
+-0.004139 -0.005390 0.005574 -0.003464 -0.006182 0.001187 
+-0.000703 -0.002292 -0.001070 -0.000874 -0.000862 -0.001386 
+0.000608 -0.001839 -0.002653 -0.000739 -0.003736 -0.003011 
+-0.003142 -0.005372 0.001795 -0.002936 -0.003307 0.003229 
+-0.000652 0.001591 0.001955 0.001626 0.002894 -0.003024 
+0.002382 0.002324 -0.003179 -0.001556 -0.000590 -0.000460 
+-0.002380 -0.003997 0.002206 -0.003145 -0.000492 0.001670 
+0.001778 -0.000192 -0.001190 0.002803 0.002879 -0.000076 
+0.002624 0.002201 -0.001863 0.000181 -0.000580 -0.000254 
+-0.000316 0.002935 -0.000159 -0.000490 0.006341 -0.002703 
+0.002083 0.006250 -0.006667 0.000138 0.000941 -0.005915 
+0.000607 -0.000313 -0.003131 0.000117 -0.000297 -0.000180 
+-0.000829 -0.001321 -0.000408 -0.000293 -0.003223 0.002520 
+-0.004240 -0.002368 0.001052 0.000505 0.001210 -0.001734 
+0.003914 -0.003080 -0.001631 0.003316 -0.004046 0.000618 
+0.000825 -0.004483 -0.001966 -0.002607 -0.004679 0.002786 
+-0.000678 0.002629 -0.001274 0.002500 0.000161 -0.003710 
+0.000768 -0.000397 -0.001629 -0.005128 -0.001905 0.000126 
+-0.006934 -0.001261 0.000690 -0.004947 0.002456 -0.001716 
+-0.003147 0.003069 -0.001367 -0.001861 0.000871 0.002454 
+0.000766 -0.000020 0.000521 0.001606 -0.002394 -0.000450 
+-0.000278 -0.002256 -0.002626 -0.003267 -0.001118 -0.003311 
+-0.005478 -0.005201 0.001373 -0.002982 -0.004617 0.000531 
+-0.001229 -0.001229 -0.002627 0.000389 -0.003782 -0.003113 
+-0.000767 -0.002919 0.001239 0.000760 -0.001289 0.003785 
+0.000958 0.002052 0.003561 0.001237 0.001459 -0.000884 
+-0.000196 0.000753 -0.001183 -0.000440 -0.000426 0.002022 
+-0.003145 0.001338 0.003249 0.001023 -0.000658 0.000176 
+0.004770 0.001111 -0.004851 0.004740 0.003535 -0.007927 
+0.006069 0.006069 -0.006718 0.001780 0.001553 0.001667 
+0.000762 -0.002258 0.000757 -0.001884 -0.006929 -0.000209 
+0.000024 -0.000260 -0.003182 0.000206 -0.000923 -0.000421 
+-0.003741 -0.002721 0.002381 0.000288 -0.000104 0.004076 
+0.000776 0.002582 0.002406 0.000751 0.002047 0.000019 
+0.001860 -0.001245 0.000315 0.001267 -0.000412 -0.001659 
+0.000850 -0.002233 -0.002060 0.000321 -0.000964 0.000000 
+-0.000787 -0.000461 -0.001004 -0.001349 -0.002273 -0.001355 
+-0.000443 -0.003639 0.000748 0.000195 -0.001510 -0.001330 
+0.002722 -0.000682 -0.001452 0.001583 -0.000014 0.000285 
+-0.000209 0.000502 -0.001191 0.001128 -0.001130 -0.003011 
+-0.001339 -0.003268 -0.003321 -0.000931 -0.001629 -0.004390 
+0.001402 -0.000052 -0.002440 -0.000653 0.002395 -0.001523 
+-0.002302 0.002816 -0.000760 -0.000492 0.000524 0.001181 
+-0.001891 -0.000679 0.000717 -0.001018 -0.000163 -0.001043 
+-0.000171 -0.001178 -0.000986 0.000603 -0.000283 -0.001752 
+0.003487 0.000026 -0.003436 0.000000 0.002748 -0.005878 
+0.004254 0.004980 -0.006332 -0.000420 0.001199 -0.002868 
+-0.000177 0.002076 0.002308 0.000405 0.002939 0.005972 
+0.005268 0.003773 0.001868 0.000752 0.002293 -0.007091 
+0.001774 0.001236 -0.007965 0.002731 -0.000280 -0.004411 
+-0.000537 -0.001450 -0.000859 -0.000841 -0.001191 -0.002102 
+-0.001188 -0.000804 0.001696 -0.000879 -0.001607 0.001463 
+-0.000061 -0.000015 -0.000118 0.000519 0.001394 0.000626 
+-0.001022 0.000171 0.000584 0.000329 -0.000402 0.001098 
+-0.002022 0.000637 -0.000879 -0.001744 0.000843 0.001203 
+-0.000447 0.001911 0.002269 -0.000797 0.001338 0.003422 
+-0.000429 0.000522 0.002549 0.000847 -0.000089 -0.000800 
+0.000384 -0.002461 -0.003770 -0.001176 -0.002903 -0.003921 
+-0.002171 -0.002806 -0.002434 -0.000465 -0.000310 -0.003101 
+0.000826 -0.000869 -0.004559 -0.001579 0.000702 -0.003065 
+-0.008238 -0.006233 0.001003 -0.005738 0.001060 -0.001931 
+0.001881 -0.001485 -0.003490 0.006318 0.000947 -0.002528 
+-0.001176 -0.001648 0.001099 -0.009229 -0.005518 0.001891 
+-0.005071 -0.004579 0.000194 0.003225 0.000356 -0.001231 
+0.000329 -0.000460 -0.001118 -0.000996 0.000331 0.002078 
+-0.002548 -0.003691 0.003201 -0.000047 -0.002053 -0.001408 
+0.001327 -0.002377 -0.002635 0.001723 0.003446 -0.001923 
+0.001949 0.001204 0.003755 0.000552 0.002746 0.002015 
+0.001936 0.001644 0.001607 -0.000729 0.003080 0.000852 
+-0.000392 -0.000282 -0.000233 -0.001086 -0.001444 -0.002556 
+-0.000883 -0.001596 -0.002583 0.000092 -0.000077 0.000161 
+0.000255 0.003822 0.003516 -0.000065 0.002486 0.005947 
+0.001052 -0.002108 0.005254 -0.002668 -0.003315 -0.001039 
+-0.002624 -0.003093 0.000735 -0.001611 0.001332 0.000473 
+-0.001661 0.001604 -0.001161 -0.001047 0.000419 0.000074 
+-0.000075 0.000448 0.000299 0.000748 0.000608 -0.000187 
+0.002604 0.000984 -0.001384 0.003768 -0.000522 -0.001836 
+-0.000210 -0.001490 -0.001435 -0.000796 -0.001326 -0.002008 
+0.001003 -0.000226 -0.001706 0.003622 0.000847 -0.002118 
+0.004566 0.002341 -0.006287 -0.001018 0.006590 -0.006056 
+0.002661 0.005857 -0.003996 0.000152 0.000972 -0.001534 
+-0.001455 -0.001716 -0.000410 0.000150 0.000125 -0.001756 
+0.004252 0.000354 -0.002038 0.001814 0.000543 0.000605 
+-0.000127 -0.000093 0.000377 -0.002304 0.000614 0.000954 
+-0.003922 0.000263 -0.001206 -0.000408 0.000460 -0.004051 
+0.000012 0.000471 -0.003767 0.000352 -0.002007 -0.002503 
+0.005366 -0.000427 -0.004289 0.000047 -0.000685 -0.005193 
+0.000014 0.003263 -0.005985 0.001752 0.004496 -0.003504 
+-0.002694 0.001500 -0.001578 -0.001587 0.000545 -0.001240 
+-0.004242 -0.003278 0.000964 -0.002303 -0.003701 0.003537 
+-0.001701 -0.003139 0.002744 -0.001975 -0.000224 0.002191 
+0.003162 -0.000199 0.001361 0.003655 -0.001545 0.004700 
+0.002096 -0.001784 0.003389 -0.001396 0.000966 0.000143 
+-0.001728 0.002747 -0.000101 -0.001446 0.000553 -0.000236 
+0.002451 -0.000118 -0.001299 0.002108 0.001426 -0.001859 
+0.002505 0.003510 -0.001836 0.000125 -0.000042 -0.001833 
+-0.001319 0.000064 -0.000688 -0.003212 0.000713 -0.001076 
+-0.003285 0.000332 -0.003406 -0.001254 0.003943 -0.004873 
+-0.001349 0.002317 -0.002289 -0.001573 0.001049 0.002121 
+-0.004719 -0.002475 0.003135 -0.001390 -0.000890 0.001466 
+0.000255 -0.000168 -0.000290 -0.000470 -0.002336 0.000004 
+-0.003745 -0.002739 0.000765 -0.001226 0.001159 0.000671 
+0.000866 0.001496 0.001548 0.001176 -0.002640 -0.003516 
+0.001213 -0.002049 0.000607 0.000124 -0.003073 -0.000770 
+-0.001205 0.001429 -0.000246 -0.004687 0.000398 -0.000133 
+-0.004451 -0.000935 0.002154 -0.001641 -0.002064 0.000244 
+0.000572 0.000188 0.000570 -0.000254 0.003272 0.002569 
+-0.002298 -0.000575 0.000698 -0.000707 -0.001149 -0.001017 
+-0.001017 -0.000718 -0.004160 -0.000891 0.000297 -0.003516 
+-0.001794 0.003007 -0.001633 0.003723 0.006642 0.001314 
+0.005709 0.002738 0.001629 0.003611 0.000122 0.002072 
+0.001482 -0.000386 0.001145 0.000687 -0.001758 -0.002004 
+0.000993 -0.002041 -0.004304 -0.002767 -0.001312 0.000292 
+-0.001988 -0.004068 -0.000361 -0.002761 -0.000910 0.002731 
+0.000565 0.000613 -0.000472 0.003189 0.002321 -0.003418 
+0.000607 0.000826 -0.002291 -0.001142 0.000487 0.002183 
+0.000158 -0.000095 0.002000 0.000531 -0.000302 -0.001365 
+0.001188 0.002126 -0.002206 -0.000625 0.002166 0.000397 
+-0.002867 0.000410 0.003492 -0.003238 0.000139 0.000954 
+-0.000593 -0.000992 -0.001621 0.000528 -0.001039 -0.001951 
+-0.000844 -0.001687 -0.000312 0.000147 -0.001681 -0.000266 
+0.000247 -0.002156 0.000813 0.000151 -0.002240 0.000577 
+0.000371 -0.001977 0.000206 0.000028 -0.000483 -0.000711 
+-0.000271 0.001326 -0.001602 0.000192 -0.001007 -0.001119 
+0.006322 -0.007291 0.001953 0.003170 -0.008252 0.002342 
+0.001261 -0.004175 0.000720 0.001573 -0.000168 -0.002234 
+0.001352 0.003449 0.001335 0.003307 0.001833 0.000647 
+-0.000532 -0.000365 0.000785 -0.000509 0.002063 0.001794 
+0.000750 -0.000356 0.000067 0.002583 0.001972 -0.003246 
+0.005714 0.001662 0.001039 0.001938 -0.000434 -0.001924 
+0.000838 0.004371 -0.002139 -0.000732 0.004931 -0.000822 
+-0.000421 0.002520 -0.000060 0.003725 0.003085 -0.000615 
+0.005643 0.001445 -0.001946 0.001040 -0.001210 0.000430 
+-0.002094 -0.001129 0.002424 -0.002671 -0.000146 -0.000608 
+-0.000235 0.000386 -0.004025 0.001627 0.000339 -0.005149 
+-0.000379 -0.000763 -0.000569 0.000003 -0.000547 -0.000128 
+0.000316 -0.001705 0.001370 -0.002800 -0.001976 0.002474 
+-0.000322 0.001073 0.000215 -0.000938 0.001522 -0.001818 
+-0.003637 -0.000977 -0.001912 -0.007202 -0.004026 -0.000213 
+-0.006347 -0.005215 0.002834 -0.003952 0.000000 0.000000 
+-0.003505 0.002340 -0.000587 -0.002613 0.002905 0.000904 
+-0.004059 -0.003525 0.002824 -0.000284 -0.004324 0.000873 
+-0.000131 0.001822 0.000333 0.002790 0.004252 0.002065 
+0.002500 0.002500 -0.000923 -0.000276 -0.000984 -0.000866 
+0.000521 -0.002576 0.001483 -0.003973 -0.003135 0.002301 
+-0.000813 -0.000316 0.001352 -0.001814 -0.001801 -0.000020 
+-0.003466 -0.000715 -0.002212 -0.004526 0.000552 0.000306 
+-0.002066 -0.000602 0.001636 -0.001292 0.000714 0.001581 
+-0.000135 0.000190 -0.000615 0.004643 -0.000035 -0.002760 
+0.009222 0.000244 -0.003376 0.009420 0.003175 -0.003017 
+0.001924 -0.001401 -0.000982 -0.000169 -0.001516 -0.002505 
+-0.001403 -0.002522 -0.003084 0.000021 -0.004670 -0.002303 
+0.000469 -0.000396 -0.000971 -0.001009 0.000155 -0.002044 
+-0.001071 0.001265 -0.004696 -0.002742 0.002361 -0.003253 
+-0.002381 -0.000466 -0.003674 0.000223 0.001967 -0.003674 
+0.003664 0.004832 -0.002721 0.004272 0.002733 -0.001274 
+0.001082 -0.002333 -0.000124 0.000790 -0.002962 -0.000248 
+0.004390 -0.000244 -0.002439 0.000024 -0.002400 -0.003160 
+-0.000677 -0.002174 -0.003529 -0.002345 -0.001438 -0.000642 
+-0.002101 -0.000525 0.000534 -0.000879 -0.000268 -0.000345 
+0.000619 -0.001916 -0.002093 0.000666 -0.004164 -0.001133 
+0.000008 -0.000997 -0.000438 0.001515 0.004593 0.000025 
+0.001669 0.001622 0.003007 0.000340 -0.001731 -0.000843 
+0.000094 -0.001878 -0.005213 0.003202 0.002701 -0.007724 
+0.004237 0.006080 -0.006019 0.003344 0.001390 -0.001414 
+-0.001627 -0.003855 0.003650 -0.001456 -0.005925 0.002674 
+-0.000121 -0.001774 -0.000861 0.000832 -0.002416 -0.002500 
+0.001393 -0.002241 -0.004163 0.000963 -0.000359 -0.001484 
+-0.004003 -0.001068 0.000833 -0.004089 -0.002855 0.000242 
+-0.001458 -0.002351 -0.000191 0.001739 -0.001225 -0.000573 
+0.002049 -0.001066 -0.003033 -0.000763 -0.002066 0.001144 
+-0.000002 -0.001628 0.006533 -0.002813 -0.002477 0.009417 
+-0.003541 -0.010089 0.006942 -0.002103 -0.012099 0.003683 
+-0.002068 -0.007950 0.001980 -0.000896 0.000161 0.004273 
+0.002211 0.001944 0.003010 0.000341 0.000171 0.003333 
+0.000103 0.001718 0.001821 0.001581 0.002219 -0.000025 
+0.002339 0.004915 -0.003521 0.003788 0.003251 -0.005398 
+-0.000434 -0.000518 -0.000476 -0.000998 0.000815 0.000042 
+-0.001515 0.001737 0.001555 -0.003703 -0.000115 -0.001205 
+-0.010195 -0.004915 0.000353 -0.012755 -0.006703 0.002819 
+-0.002728 -0.005855 0.004722 0.002099 0.001428 0.000176 
+0.007769 0.003339 -0.001922 0.007956 0.003672 -0.005356 
+0.007292 0.001141 -0.004440 0.003274 0.001399 0.001003 
+-0.002207 0.001225 0.000940 0.000424 -0.000816 -0.000036 
+0.001734 -0.002097 0.001734 0.000822 0.000075 0.001541 
+0.000352 0.002766 0.001735 0.000316 0.005902 -0.000839 
+-0.000156 0.003614 0.000251 0.001813 0.000701 0.003831 
+-0.000305 -0.003654 0.003885 -0.000937 -0.002289 0.003435 
+-0.000673 -0.000079 0.000832 0.000623 0.002432 -0.000786 
+0.002555 0.004964 -0.002409 0.004930 0.001402 -0.003686 
+0.000464 -0.000201 -0.001223 0.000219 -0.000903 -0.000410 
+-0.003770 -0.001141 -0.002976 0.000994 0.000090 -0.004658 
+0.005009 0.003102 -0.005212 0.007049 0.005146 -0.005694 
+0.008512 0.006176 -0.003657 0.008158 0.005919 -0.001853 
+0.005968 0.004565 -0.001369 0.002933 0.000907 0.002027 
+-0.000936 -0.002269 0.004285 0.002720 -0.002066 0.003478 
+0.003438 0.002642 -0.000255 0.000278 0.003016 -0.003532 
+0.006542 -0.001233 -0.003177 0.001234 -0.000774 -0.003241 
+-0.000312 -0.001777 -0.000488 0.000035 0.000265 -0.002713 
+0.002390 0.002286 -0.006375 0.005768 0.000049 -0.005210 
+-0.001360 -0.002329 -0.002621 0.000219 -0.001876 -0.000776 
+-0.000072 0.000067 -0.000607 -0.001431 0.002861 -0.003577 
+-0.000628 -0.001538 -0.003474 -0.000528 -0.000624 0.000128 
+-0.000745 -0.001168 0.001771 -0.002167 -0.003801 0.000355 
+0.000071 -0.000478 -0.001536 -0.000938 -0.000259 -0.002097 
+-0.001930 0.001832 -0.002807 -0.003951 -0.001530 0.000223 
+-0.000052 -0.002668 -0.002840 -0.002679 -0.010864 0.003472 
+-0.007972 -0.011133 0.003207 -0.004042 -0.006063 0.002021 
+-0.002758 -0.000820 0.000689 -0.001665 0.000000 -0.002497 
+-0.003174 -0.002510 0.004300 -0.005534 -0.001900 0.001404 
+-0.000831 -0.004109 -0.000623 -0.003291 -0.005505 -0.000126 
+-0.006181 -0.003833 -0.000718 0.000548 -0.002301 0.004713 
+-0.001110 0.002357 0.001817 0.002070 0.007193 0.000717 
+0.004601 0.003509 -0.000116 -0.000445 0.001921 -0.000738 
+-0.000072 0.000079 0.000084 0.003145 -0.000097 -0.000290 
+0.003871 -0.003157 0.000613 0.002730 -0.002366 0.000418 
+-0.001267 0.000606 0.000507 -0.001181 0.004674 0.002470 
+0.001196 0.001329 0.000668 -0.002838 0.000106 0.002184 
+-0.002076 -0.000556 0.003114 0.001546 0.001922 0.004450 
+0.004211 0.003083 0.000000 0.004476 0.001970 -0.000639 
+0.004519 0.000229 -0.002260 -0.000197 0.000400 -0.001986 
+0.002972 -0.000847 0.000627 0.004223 -0.000992 -0.002680 
+0.002092 -0.000303 -0.001469 -0.004545 -0.000037 0.002515 
+-0.002525 -0.001250 0.006313 -0.002949 0.001708 0.003336 
+0.001034 0.001563 -0.000620 0.004029 -0.000858 0.002908 
+0.000901 -0.002516 0.001539 -0.000961 -0.001710 -0.000140 
+0.001180 0.000143 -0.000264 0.002974 0.003222 0.000471 
+0.000515 0.004964 0.002573 0.000709 0.005295 0.002118 
+-0.000118 0.004454 -0.002852 0.001797 0.000899 -0.002319 
+-0.000331 -0.000917 -0.000180 -0.001964 -0.001844 -0.000534 
+-0.000848 -0.003311 -0.001317 0.003216 -0.001029 -0.004030 
+0.007931 0.003162 -0.002184 0.006996 0.007442 -0.005597 
+-0.000045 0.004324 -0.003916 0.001411 -0.002946 0.000643 
+-0.001600 -0.006696 0.002610 0.000640 -0.002482 0.001619 
+-0.000369 0.002239 0.001659 0.005561 0.004069 -0.000617 
+0.007666 0.002151 -0.001630 -0.001711 0.002369 -0.002763 
+0.005580 0.000987 -0.005240 0.000827 0.005112 -0.006208 
+0.002655 0.002450 -0.003021 0.002322 0.000709 -0.000581 
+0.002848 0.000502 0.001627 0.000117 0.000439 0.000517 
+0.000119 -0.000112 -0.002511 0.000555 -0.000295 -0.000750 
+-0.003414 0.001504 -0.003515 -0.001804 0.003303 -0.001826 
+-0.000153 0.000244 -0.000634 0.004756 0.002305 0.000865 
+0.003173 -0.000406 0.002228 0.003796 0.002699 0.001871 
+0.003917 0.005363 -0.004228 -0.000685 -0.000342 -0.001112 
+-0.001705 0.000502 0.000314 -0.002502 0.000045 0.000879 
+-0.002609 0.001468 0.000912 -0.002812 -0.000964 0.002483 
+-0.003644 -0.004122 0.002031 -0.000316 -0.000175 -0.000238 
+0.000252 -0.003201 0.003748 -0.003379 -0.004572 0.001027 
+-0.006986 -0.005399 -0.000053 -0.006914 -0.006562 -0.002305 
+-0.005932 -0.005958 -0.000026 -0.002794 -0.001580 -0.001065 
+0.002141 -0.000612 0.000403 0.003454 0.000462 -0.003072 
+0.003277 0.006774 -0.000074 0.003077 0.000013 -0.009270 
+0.006111 0.004446 -0.000348 0.003511 0.001538 0.001113 
+0.001501 0.002357 -0.000114 -0.002857 -0.000360 0.001192 
+-0.003760 0.001124 0.003798 -0.002195 0.000954 0.001590 
+-0.000806 0.001613 -0.002016 0.000540 -0.001685 -0.002110 
+0.003644 -0.003522 -0.001393 0.004449 -0.001830 0.002870 
+0.001333 -0.002667 0.003864 0.000628 -0.000994 0.002406 
+-0.001398 -0.000340 0.001711 -0.003445 -0.001148 0.002187 
+-0.001092 0.001426 0.002336 0.000795 -0.002913 0.001571 
+-0.002956 -0.005795 0.002049 0.001882 -0.001968 0.001767 
+-0.000130 -0.002565 0.006235 -0.001276 -0.002950 0.006353 
+0.000851 -0.003540 0.004302 0.003058 -0.000524 0.001834 
+0.001285 0.000813 -0.002569 0.002511 0.000967 -0.004572 
+0.003767 0.000338 -0.003809 0.002242 0.000071 -0.002128 
+0.000411 -0.000057 0.001510 -0.002023 -0.001543 0.001940 
+-0.003088 -0.001544 0.000000 0.000014 -0.000082 -0.002971 
+0.000994 0.000263 -0.000837 -0.002178 0.000459 -0.001603 
+-0.000675 0.003387 -0.001133 0.000323 0.003513 -0.001363 
+-0.000163 0.000961 -0.001809 0.002634 -0.001102 -0.000030 
+0.003719 -0.001202 -0.004695 -0.002127 -0.002019 -0.007283 
+0.000611 -0.002202 -0.009910 0.002958 -0.001606 -0.006929 
+0.004404 -0.000961 -0.003113 0.002957 -0.000217 0.001848 
+0.002053 0.000441 0.002388 0.001443 -0.000618 0.001813 
+-0.003136 0.002076 0.005257 -0.004499 0.001152 0.003182 
+-0.002050 0.000311 0.001604 0.001594 0.000925 -0.000072 
+0.004313 0.000624 0.001686 0.000272 0.001137 0.001460 
+-0.000883 0.002455 0.000019 -0.000687 0.001487 0.000571 
+0.000697 0.002324 -0.001926 -0.000270 0.003233 -0.002233 
+0.003061 0.004356 -0.002885 -0.000195 -0.001416 -0.006831 
+-0.002164 -0.001306 -0.001559 -0.001974 -0.000536 -0.000320 
+-0.004013 -0.000959 -0.000456 -0.006716 -0.002109 -0.000633 
+-0.006278 -0.005038 0.006278 -0.000900 -0.002224 0.005809 
+-0.000955 -0.000655 0.003088 -0.003548 -0.001153 0.000779 
+-0.001450 0.001030 -0.000449 0.000460 0.000743 0.001379 
+0.002901 -0.000015 0.000913 -0.000547 -0.000609 0.000906 
+-0.003643 -0.000003 0.004558 -0.009310 -0.001426 0.002718 
+-0.005861 0.001870 -0.001352 -0.002875 0.000855 -0.001414 
+-0.000175 -0.000636 -0.001892 -0.001493 -0.003744 0.003555 
+0.001045 -0.003830 0.000823 0.002502 -0.000972 0.002140 
+0.001589 0.000202 0.000792 -0.002000 0.000400 0.000400 
+-0.003520 -0.002452 0.000409 -0.002415 -0.003680 0.000724 
+-0.001649 -0.004175 -0.000428 -0.001609 -0.001673 -0.000853 
+-0.001509 -0.001292 0.002586 -0.001355 0.001929 0.000855 
+0.000243 0.001851 -0.001460 0.002926 0.001722 -0.000345 
+-0.000301 -0.002214 -0.001203 0.000621 -0.003245 0.000057 
+0.001725 -0.001383 -0.000208 -0.000026 -0.001510 0.004348 
+-0.001185 -0.003852 0.000000 0.000586 -0.003020 -0.002118 
+0.001366 -0.001493 -0.003007 0.001777 -0.000135 -0.000028 
+0.000851 -0.001619 0.000941 0.000159 0.003651 0.001746 
+0.005272 0.004389 -0.000428 0.000309 -0.000348 -0.000736 
+0.001601 -0.001476 0.000196 0.003047 -0.001505 -0.000889 
+0.002280 0.000630 -0.003300 -0.000508 -0.000731 -0.000943 
+0.000999 -0.002346 -0.001922 -0.000803 -0.003183 0.001668 
+0.000095 -0.000764 0.002847 -0.001879 0.001367 0.000470 
+-0.000723 0.002792 0.001155 -0.001384 0.000638 -0.000315 
+-0.001168 0.003449 -0.002157 -0.000893 0.005506 -0.001042 
+0.000457 0.004672 -0.001486 0.001667 0.001667 -0.005812 
+-0.000736 0.000884 -0.009407 -0.000184 0.003549 -0.008627 
+0.000306 0.003201 -0.003133 0.000262 0.000349 0.000977 
+-0.001295 0.000579 -0.000726 0.000795 0.002273 -0.005341 
+0.002630 0.004323 0.001987 0.005462 0.006502 -0.001219 
+0.003611 0.004466 -0.000214 0.002219 0.003321 -0.001481 
+0.000501 0.003237 0.000265 -0.001295 0.001980 0.000677 
+0.001236 0.000584 0.000880 0.002437 -0.001845 0.001530 
+-0.000629 0.000080 -0.001314 0.000592 0.005561 -0.003431 
+0.000575 0.001502 -0.004951 -0.001195 -0.002198 -0.000656 
+-0.002279 -0.004812 0.001647 -0.001705 -0.001550 0.001705 
+0.000041 0.003959 -0.002351 0.000211 0.006364 0.000094 
+0.000198 0.004351 0.000809 -0.002640 0.002177 0.000885 
+-0.003387 0.001233 0.002427 -0.001312 0.001146 0.000530 
+-0.000419 -0.000397 -0.000064 -0.001966 -0.001270 -0.002970 
+-0.000299 0.000257 -0.000361 -0.004038 -0.003703 0.002987 
+0.000060 0.000328 0.000299 0.000312 0.000352 0.002305 
+-0.001915 0.000071 0.001856 -0.003592 -0.000680 -0.002222 
+-0.002834 -0.000183 -0.003325 -0.002017 0.000403 -0.001210 
+-0.003993 0.000019 0.003946 -0.004129 0.003371 0.003484 
+-0.006219 -0.001570 -0.001821 -0.001797 -0.000305 0.000381 
+0.003342 0.000141 -0.001759 0.003716 0.001129 0.000524 
+0.002829 0.000421 0.000408 0.002909 -0.000933 0.000815 
+0.001952 -0.000191 -0.000523 0.002222 0.000311 -0.000208 
+0.002575 -0.001351 -0.000530 0.004013 -0.002073 -0.002170 
+0.002784 -0.001418 -0.003204 0.001182 0.002405 -0.001161 
+0.000000 0.001742 0.000758 -0.002018 0.000157 -0.002354 
+-0.001993 -0.000563 -0.000428 0.002560 -0.001520 0.000000 
+-0.002519 -0.000933 0.000311 0.002114 0.001294 -0.002935 
+0.001240 0.000603 -0.000004 -0.000827 -0.002786 -0.000253 
+-0.002315 -0.005188 0.000868 -0.002662 -0.002680 0.001317 
+-0.000365 0.000208 0.000729 -0.000107 0.000071 -0.000338 
+-0.000032 -0.000841 0.000447 0.001043 -0.000637 0.000843 
+0.000940 0.001064 -0.000718 0.002011 0.001735 -0.000606 
+0.002191 -0.000425 -0.000866 0.000000 0.000296 -0.001852 
+0.000751 0.001105 -0.000042 -0.000942 0.003043 0.000942 
+-0.002569 0.003412 -0.003757 -0.001959 0.004550 -0.004558 
+-0.000887 0.003072 -0.003082 0.000405 0.000083 -0.001371 
+-0.000312 -0.000430 -0.000502 -0.002093 -0.000149 -0.000645 
+-0.004073 0.000074 -0.001531 -0.004961 0.000059 -0.000034 
+-0.002795 -0.001502 0.000352 0.000291 -0.000778 -0.001102 
+0.001035 -0.000202 -0.001237 -0.001629 -0.000606 0.000795 
+-0.003969 -0.000995 0.002487 -0.004015 -0.002545 -0.000848 
+-0.001183 0.001183 -0.001069 0.000547 0.003359 -0.000859 
+0.000212 0.002327 0.000523 -0.001000 0.000280 0.000122 
+-0.001855 -0.000216 -0.001272 -0.001757 0.001137 -0.002972 
+-0.000098 -0.000293 -0.001805 -0.000981 -0.000171 0.000110 
+0.002432 -0.001042 -0.000373 0.002045 -0.001136 0.001136 
+0.000883 0.001733 0.001313 0.002244 -0.000748 -0.004646 
+-0.001088 -0.000124 -0.000943 -0.001850 -0.002213 0.001147 
+-0.002285 -0.001353 0.002452 -0.001319 0.000460 0.002048 
+0.000385 0.001399 -0.001566 0.004017 0.001004 -0.005610 
+-0.000126 0.004026 -0.009143 -0.000179 0.008249 -0.005739 
+-0.002119 0.003185 0.000826 0.000703 -0.001172 -0.000469 
+0.004183 -0.003493 -0.000712 0.001457 -0.000532 -0.001204 
+-0.003097 -0.002710 -0.001500 -0.001209 -0.002395 -0.001741 
+0.001270 -0.001485 -0.001431 0.004002 -0.002092 0.000588 
+0.002139 -0.002341 -0.000055 -0.003682 -0.003240 0.001436 
+-0.000791 -0.000457 0.001131 0.000913 0.003963 -0.003351 
+0.003660 0.000915 -0.003778 0.002263 0.004795 -0.001859 
+0.000842 0.002677 -0.002104 0.002621 0.002025 -0.003199 
+0.003083 0.003221 -0.000644 0.001137 0.003093 0.000541 
+0.000697 0.002285 0.000949 0.000224 0.001275 0.000339 
+0.000573 0.000896 -0.000092 0.000016 0.000564 -0.000358 
+0.000007 -0.000186 0.001391 -0.000711 0.000349 0.001701 
+0.000999 0.000158 -0.000105 0.001138 -0.000813 0.000163 
+-0.002794 0.000000 -0.000147 -0.001037 -0.002074 -0.001037 
+0.005153 0.001371 -0.005819 0.005953 0.002981 -0.005989 
+0.002320 0.003866 -0.002500 -0.000349 0.001667 0.001705 
+-0.002751 0.000390 0.001506 -0.001587 -0.001866 0.000415 
+-0.000794 -0.001533 0.000835 0.000112 -0.000501 0.000851 
+0.001449 0.000240 0.000004 0.002605 0.000159 -0.001346 
+0.002615 0.000231 -0.000769 0.000683 0.000190 0.001894 
+-0.001272 -0.001697 0.003387 0.000034 -0.002349 0.002112 
+-0.000855 0.000181 -0.002203 0.000574 -0.000145 -0.000623 
+0.000797 0.000360 -0.003588 0.000543 -0.001735 -0.003690 
+0.000000 -0.003566 -0.004186 0.002117 -0.002308 -0.001588 
+0.001439 -0.000159 0.000023 -0.000009 0.000029 -0.000011 
+-0.001265 -0.000854 -0.000467 0.000006 -0.001253 0.000306 
+0.000244 -0.002669 -0.000580 0.000228 -0.004184 -0.001217 
+-0.002357 -0.005777 -0.000729 -0.000073 -0.004496 0.000050 
+0.002746 0.001523 -0.002482 0.004048 0.004921 -0.004921 
+0.002037 0.005211 -0.000559 -0.001390 -0.000181 -0.000263 
+-0.001878 -0.002122 -0.001648 -0.000211 -0.000666 -0.000731 
+-0.001082 0.001082 0.001119 -0.001556 0.002252 -0.001689 
+-0.001057 0.002603 -0.002716 -0.000637 0.001979 -0.003605 
+0.000595 -0.000870 -0.005263 -0.000242 -0.003714 -0.002885 
+-0.004081 -0.002098 0.000529 -0.005246 0.000361 -0.000180 
+-0.001680 -0.000028 -0.000940 0.000928 0.000464 -0.001040 
+0.000548 0.000129 -0.000634 0.000632 -0.000326 0.000576 
+0.001484 0.000266 -0.000531 0.000703 0.002031 -0.002344 
+0.001825 0.000238 -0.002857 0.000055 -0.001120 -0.000037 
+-0.002168 0.000402 0.002340 -0.001341 0.002462 0.002588 
+0.000175 0.001140 0.001053 0.000000 0.002845 -0.004397 
+0.000838 0.000426 -0.002092 0.000555 0.000797 -0.000458 
+0.000954 0.001440 -0.001278 -0.001484 0.000519 -0.003117 
+-0.006105 -0.000107 -0.002549 -0.006703 -0.001352 -0.002176 
+-0.003284 -0.001006 0.001668 0.001800 -0.002447 0.001934 
+0.003589 -0.003002 -0.000594 0.003097 -0.000607 -0.000511 
+0.000320 0.000913 0.000421 0.000160 0.004280 0.000658 
+0.000954 0.003840 0.000260 0.001196 -0.001818 0.001127 
+0.001821 -0.006593 0.004735 -0.003579 -0.007529 0.008271 
+-0.001452 -0.003371 0.008212 -0.002842 -0.002010 0.003435 
+0.000172 -0.000580 -0.000608 0.003254 -0.000457 -0.000610 
+-0.001087 -0.002173 -0.002283 0.000104 -0.002910 -0.001453 
+0.003484 -0.003184 -0.001057 0.000122 -0.000368 0.000465 
+-0.001317 -0.000301 -0.001270 0.000882 0.000894 -0.000820 
+0.003497 0.003042 -0.000038 0.005769 0.003308 0.000000 
+0.004615 0.001923 0.000000 0.002033 -0.000291 -0.001258 
+0.001012 -0.002035 -0.001534 0.000114 -0.003152 -0.001491 
+-0.000400 -0.001584 0.000528 0.000524 -0.001818 -0.000555 
+-0.000429 -0.002360 0.000428 -0.000804 -0.001287 -0.000791 
+-0.000640 0.000420 -0.001242 0.000098 -0.000921 0.001401 
+-0.001765 -0.003788 0.005295 -0.003630 -0.005871 0.003095 
+-0.004954 -0.001939 0.001262 -0.002824 -0.003821 -0.001384 
+-0.002636 -0.003372 -0.003372 -0.003953 -0.001938 -0.001938 
+-0.003651 0.001217 0.002946 -0.002455 0.001754 0.000382 
+-0.001666 0.000493 -0.002284 -0.000524 -0.000368 -0.000150 
+-0.002779 -0.003676 0.001588 0.000572 -0.006291 0.005379 
+0.001913 -0.003537 0.003449 -0.000441 -0.000771 0.000606 
+0.003966 0.006446 0.000862 0.001740 0.006888 0.001113 
+-0.000882 0.002759 -0.000662 -0.000060 0.000758 -0.000606 
+0.002458 0.002910 -0.001809 0.004130 0.002826 -0.004130 
+0.003768 0.002174 -0.000870 0.001602 0.000049 0.000243 
+0.001430 0.001914 -0.002875 0.001565 -0.000336 -0.005595 
+-0.001823 -0.002395 -0.000458 -0.005294 -0.004889 0.007127 
+-0.006251 -0.006242 0.009368 -0.001896 -0.006814 0.004098 
+-0.000343 -0.002738 -0.000914 -0.002424 -0.000894 -0.003212 
+-0.000677 -0.002090 -0.003483 0.002811 -0.001608 -0.003013 
+0.000492 -0.001407 -0.001032 -0.005166 -0.005156 0.003690 
+-0.008251 -0.006114 0.003463 -0.002516 -0.001595 -0.001463 
+0.000775 -0.002110 -0.003703 -0.000256 -0.000938 -0.005544 
+-0.000394 0.002126 -0.004252 -0.000079 0.000655 -0.000291 
+0.000118 -0.001055 0.000127 0.000273 0.000673 -0.000357 
+-0.000299 0.001065 -0.001865 0.000729 0.001779 0.001028 
+-0.001149 -0.001766 0.000857 -0.000041 -0.007212 0.001113 
+0.000994 -0.007742 0.000382 0.000853 -0.002973 -0.000721 
+0.001345 0.001116 0.000072 0.001423 0.002253 0.001169 
+-0.001742 0.003190 -0.001066 -0.000051 0.001782 0.000430 
+0.000067 0.002158 0.003271 0.001649 0.000874 0.005220 
+0.000087 -0.000399 0.003785 -0.000977 -0.001558 0.001056 
+-0.001892 -0.004554 0.000308 0.000000 -0.005878 0.000916 
+-0.004291 -0.003047 0.004881 -0.003674 -0.002858 0.006464 
+-0.002566 -0.000959 0.003638 0.000055 0.000938 0.000552 
+0.000412 0.001026 0.001238 -0.000349 0.001303 0.002279 
+-0.002271 0.001740 0.002406 -0.001670 0.000397 0.000209 
+0.001872 0.000455 0.004654 0.000108 -0.003367 0.004182 
+0.001049 -0.000984 0.001137 0.002311 0.000272 -0.003037 
+0.003142 -0.000051 -0.003041 0.002562 -0.001563 0.001063 
+0.001771 -0.005029 0.004144 0.000132 -0.006208 0.004271 
+0.001905 -0.004552 0.003689 0.002690 -0.001667 0.002017 
+0.001106 -0.000031 0.000473 0.001045 0.002542 -0.002178 
+0.002287 0.003568 -0.002731 0.004051 0.002025 -0.001014 
+0.004039 -0.001422 0.000541 0.002016 -0.002016 -0.001473 
+0.000551 0.001143 -0.001584 -0.003530 0.001773 0.000348 
+0.000000 0.000075 0.001493 -0.004370 -0.002332 0.001313 
+0.000889 -0.001185 0.002148 0.002766 -0.003624 0.004461 
+0.000522 -0.005647 0.008779 0.003267 0.000023 0.001201 
+0.003230 0.001284 0.001378 0.005477 0.004496 0.000261 
+0.005074 0.003995 -0.003911 -0.002070 -0.001923 -0.001484 
+-0.001984 -0.003258 0.003648 0.000023 0.000692 0.000485 
+0.003382 -0.000990 -0.001237 0.002815 -0.000929 -0.004644 
+-0.000350 -0.001600 -0.000325 -0.002520 -0.000675 0.000990 
+-0.000492 -0.000369 0.001519 -0.000382 -0.000649 -0.000243 
+0.000742 -0.000774 0.001021 0.000804 -0.000779 -0.000091 
+-0.001719 0.002700 -0.000801 -0.002696 0.002990 -0.002402 
+0.005475 -0.000169 -0.001909 0.003486 -0.001438 -0.004893 
+0.001457 -0.001959 -0.002374 -0.000913 -0.001487 -0.000765 
+-0.000637 -0.001179 0.002570 0.000741 -0.002721 0.004288 
+0.001481 -0.000820 0.003122 0.002254 0.001956 -0.000213 
+0.000892 0.002732 -0.000379 0.000557 -0.000139 0.000534 
+-0.002846 -0.003808 0.003808 -0.002308 -0.002492 0.002806 
+0.000698 0.000070 -0.003283 0.003272 0.005221 -0.003272 
+0.003606 0.003621 -0.004318 0.001713 0.001584 -0.002762 
+0.001508 -0.002460 -0.000476 -0.001634 -0.003043 -0.002198 
+-0.000543 -0.005058 -0.004046 0.000176 -0.004373 -0.004787 
+0.000026 -0.001341 -0.000951 0.001927 0.000934 -0.000348 
+0.000833 -0.000119 0.001780 0.000926 -0.000224 -0.000845 
+0.003705 0.003540 -0.004996 0.006383 0.003208 -0.006372 
+0.004346 0.001980 -0.005556 0.001217 0.001534 -0.000503 
+0.001423 0.000732 -0.000100 -0.000147 -0.000735 0.000000 
+-0.001399 -0.001102 -0.000339 -0.001201 -0.000389 -0.000954 
+0.001488 -0.000374 -0.001104 -0.001109 -0.001663 -0.002647 
+0.001064 0.001259 -0.001844 0.005385 0.000577 -0.000577 
+0.004650 -0.000078 -0.003354 0.004314 0.001094 -0.001840 
+0.001324 0.005441 -0.005441 0.002741 0.000222 -0.006222 
+0.004195 -0.000863 -0.004234 0.002625 0.002905 -0.001155 
+0.001225 0.003664 -0.003252 0.000056 0.003184 -0.000768 
+0.001241 0.001460 0.000000 -0.000657 0.000135 0.000090 
+-0.002889 -0.000514 0.000356 -0.001823 -0.001125 -0.000220 
+0.000518 -0.000216 0.000259 0.004099 0.001004 -0.003137 
+0.001588 0.000681 -0.000074 -0.001770 -0.004609 0.002979 
+-0.003469 -0.005486 0.000404 -0.002836 -0.001119 -0.001119 
+-0.000866 0.002030 -0.001045 0.000054 0.001022 -0.000793 
+0.001138 -0.002185 0.000846 0.002551 -0.002677 -0.001276 
+0.005397 -0.000700 -0.000817 0.002743 -0.001191 -0.001118 
+0.000538 0.003150 -0.000054 -0.000295 0.004579 -0.002090 
+-0.000429 0.006199 -0.000792 -0.003470 0.002838 -0.001895 
+-0.002907 0.001791 -0.001458 -0.002505 -0.000572 -0.000054 
+0.000414 0.001466 -0.000526 0.001994 0.005239 -0.002873 
+0.002070 0.004524 -0.003435 0.001173 0.000811 -0.002553 
+0.000603 -0.001290 -0.002224 -0.000207 0.002534 -0.001221 
+0.001431 0.002198 -0.004528 0.000030 -0.000015 -0.002889 
+-0.000650 -0.000741 -0.001621 -0.001993 -0.000803 0.000664 
+-0.003082 0.001555 0.001473 -0.002732 0.001551 0.001110 
+0.000892 -0.000693 -0.000295 0.002442 -0.000784 -0.003619 
+0.003718 0.000263 -0.005846 0.002168 0.000431 -0.005786 
+-0.000113 -0.001405 -0.003931 -0.002470 0.000798 -0.002619 
+-0.000316 -0.002960 0.000842 -0.003622 -0.004192 0.000051 
+-0.001260 -0.000386 0.000103 0.003900 -0.005347 0.004047 
+0.004117 -0.004383 0.003169 0.002969 -0.003231 0.002882 
+0.002124 -0.004194 0.001175 0.003389 -0.000839 -0.001932 
+0.005413 -0.000947 0.002147 0.002215 0.000554 0.002769 
+0.000637 -0.002905 0.000173 -0.006532 -0.006924 -0.000098 
+-0.003123 -0.006650 0.004916 -0.001083 0.000776 0.001855 
+0.004277 0.004152 -0.004173 0.000974 0.006549 0.002066 
+-0.000671 0.000596 0.000348 -0.002378 -0.001006 -0.000427 
+-0.000979 -0.001986 -0.001374 0.001869 -0.002258 0.000801 
+-0.000476 -0.000203 -0.001423 -0.000889 0.000044 0.000089 
+0.001817 0.001928 0.001502 0.001897 0.000737 0.000652 
+0.000071 -0.001154 -0.001399 -0.001692 -0.002394 -0.002219 
+-0.001298 0.000165 -0.002176 0.000176 0.003121 -0.001297 
+0.001904 0.002215 0.000875 0.001353 -0.001265 -0.002683 
+-0.000256 -0.001545 -0.000247 -0.001003 0.000532 -0.001013 
+0.001342 0.002881 -0.000710 0.002821 0.003282 -0.003333 
+0.000941 0.003688 -0.003544 0.001514 0.001421 -0.002688 
+0.000000 -0.001618 -0.002353 0.002257 -0.004118 -0.001505 
+-0.001005 -0.005023 0.000821 -0.003206 -0.000916 -0.002290 
+-0.005694 -0.000525 0.002016 -0.002468 0.000751 -0.001778 
+-0.000113 0.002332 -0.001953 0.001880 0.001137 -0.001279 
+0.004030 -0.000094 -0.001640 0.004722 -0.000707 -0.004495 
+0.003584 0.000940 -0.006874 0.000788 0.001268 -0.004987 
+0.000651 0.000365 -0.001380 0.000000 -0.001641 -0.001328 
+0.000089 -0.000018 -0.004109 -0.003657 -0.000796 -0.005396 
+-0.003175 -0.003175 -0.004048 -0.001545 -0.002724 -0.002724 
+0.000723 -0.003289 -0.001105 0.000779 -0.002342 0.000191 
+-0.000671 -0.002479 0.003923 -0.001411 -0.000928 -0.001114 
+-0.000458 0.001456 -0.000224 0.000866 0.004481 -0.003539 
+0.001958 0.004337 -0.003472 -0.000005 0.000789 -0.000875 
+-0.001739 -0.000059 0.001149 -0.001840 0.000067 -0.000090 
+0.000423 0.000243 0.001180 0.001639 -0.004083 0.003556 
+0.000190 -0.007242 0.002794 0.001427 -0.001168 0.000324 
+-0.001951 -0.001052 -0.005904 -0.002578 0.000469 -0.002578 
+-0.001905 -0.002947 -0.000491 -0.005148 -0.004441 0.003380 
+-0.003948 -0.003965 0.001195 -0.002031 0.000112 -0.000544 
+-0.002560 0.000316 -0.000411 -0.002946 0.001027 -0.003356 
+-0.002076 0.003689 -0.003522 -0.000268 0.001930 0.000098 
+0.002447 -0.002447 0.002937 0.002164 -0.006970 0.003173 
+0.000168 -0.006098 0.001718 0.000327 -0.000218 0.002126 
+-0.002308 0.000157 0.001538 -0.001600 -0.002186 0.003057 
+0.001452 -0.001461 0.001951 0.002200 -0.000280 -0.001789 
+0.000495 0.002144 -0.000797 -0.002406 -0.000863 0.000582 
+-0.003370 -0.005231 0.001985 -0.003170 -0.001198 -0.000170 
+0.000260 -0.000637 0.002203 0.000179 -0.000268 0.000043 
+0.000655 -0.000267 -0.002233 0.000395 0.002285 -0.004218 
+0.003021 0.003551 -0.003096 0.003212 0.003042 0.000463 
+-0.000201 -0.001298 -0.002171 -0.002576 -0.001136 -0.000833 
+-0.002790 0.000684 0.000656 -0.000611 0.000168 0.000336 
+0.001796 -0.000584 -0.001586 0.002450 -0.001274 -0.002402 
+0.001742 -0.000249 -0.001556 0.001105 0.000163 -0.000344 
+-0.000149 0.000335 -0.000526 -0.002239 0.000209 -0.000104 
+-0.002572 0.000009 -0.000317 -0.000954 0.000243 0.001047 
+0.000785 0.000705 0.001102 0.000507 0.000638 0.001058 
+-0.000952 0.000095 -0.000262 -0.001876 0.001355 -0.001251 
+-0.003121 0.001248 -0.002701 -0.003879 -0.000970 0.001940 
+-0.002971 -0.001891 0.003309 0.000989 -0.001433 0.002661 
+0.002146 0.001875 0.001477 0.002400 0.003087 0.000228 
+0.000153 0.001201 -0.000899 -0.005397 -0.002222 0.000000 
+-0.009949 -0.000283 0.001763 -0.008157 0.001039 0.001024 
+-0.001890 0.002801 -0.000623 0.004045 0.003003 -0.002194 
+0.006587 0.000408 -0.002445 0.000914 -0.000255 -0.001902 
+-0.000113 0.002977 0.000132 -0.000602 0.003661 0.001705 
+0.001654 0.003684 -0.001278 0.003790 0.001281 0.000262 
+0.003609 0.000351 0.001584 0.003562 0.001248 0.001103 
+0.002050 -0.000187 0.000924 0.001241 -0.000563 -0.001341 
+0.002061 -0.000336 -0.002826 0.001222 -0.002607 0.000957 
+0.000916 -0.001145 -0.000763 0.000196 -0.001783 0.002371 
+-0.000794 -0.000716 -0.000755 -0.001687 -0.002317 -0.001267 
+-0.001211 -0.002253 -0.000441 -0.000653 0.001176 -0.000245 
+0.000622 0.002707 0.002293 0.001970 0.000657 -0.001493 
+0.002313 -0.000901 -0.002252 0.003528 -0.000095 -0.001208 
+0.001183 0.000407 -0.001241 -0.000492 -0.001381 0.001083 
+0.000202 -0.003760 0.000022 0.001275 -0.005964 0.000470 
+0.000417 -0.005360 -0.000546 -0.001980 -0.001529 -0.001404 
+-0.001791 -0.000524 -0.000591 -0.000155 0.000659 -0.000081 
+0.001628 0.001318 -0.001318 0.002403 -0.000954 -0.000191 
+0.001477 -0.001318 -0.000369 0.000195 0.000195 0.003906 
+-0.002316 0.002031 0.000579 -0.002347 0.001882 0.001409 
+-0.001598 0.000722 0.000560 -0.001985 -0.000550 0.000183 
+-0.000633 -0.002398 0.001448 -0.001706 -0.000690 0.001198 
+0.002473 0.002855 0.000663 0.004094 0.003484 -0.003520 
+0.004296 0.001494 0.000598 0.000070 0.000761 0.001235 
+-0.001192 0.000554 0.000054 0.002146 0.002002 -0.004526 
+0.002775 0.006152 -0.004345 0.000102 0.004853 -0.001833 
+0.001688 0.000362 0.000406 0.000966 0.002009 -0.000498 
+-0.001140 0.000581 -0.000402 -0.002092 0.000430 0.002485 
+-0.000863 -0.002386 0.003732 -0.000425 -0.004071 0.000485 
+0.001121 -0.004272 -0.002787 -0.002441 -0.000007 -0.006514 
+-0.001704 0.003259 -0.003407 0.001334 0.003713 -0.000464 
+0.003465 0.001772 -0.001013 -0.000394 -0.000620 -0.001968 
+-0.000209 -0.000236 0.000190 0.001330 -0.001439 0.001658 
+0.000998 -0.002170 0.003429 -0.002547 -0.002029 0.001252 
+-0.000141 -0.000359 0.000249 0.000046 -0.000565 0.002155 
+-0.002482 -0.003149 0.001574 -0.001246 -0.003188 0.002493 
+-0.002247 -0.001802 -0.002691 0.000369 0.002245 -0.001245 
+0.003157 0.002049 -0.001624 0.004454 0.004966 -0.000217 
+0.006567 0.005429 0.000403 0.001679 0.005801 -0.006106 
+0.003471 0.003547 -0.003190 0.001431 -0.000649 0.000311 
+-0.002926 -0.003335 0.001661 -0.002443 -0.004626 -0.001084 
+-0.002830 -0.001444 -0.001423 -0.000445 -0.000931 -0.000202 
+0.003026 0.000562 -0.001946 0.002791 -0.001548 -0.001854 
+0.002538 -0.000173 -0.000216 -0.000425 -0.000486 0.000668 
+-0.002674 -0.002551 0.002968 -0.002924 -0.001498 -0.000544 
+-0.001626 0.003182 -0.001697 -0.000458 0.004809 0.000458 
+-0.003697 0.001734 0.001003 -0.002458 0.000975 0.002470 
+-0.002454 -0.003253 0.000621 0.001681 -0.001498 -0.002733 
+0.001842 -0.002578 -0.004839 0.000853 0.004203 -0.007741 
+0.000457 0.005487 -0.008333 0.000845 0.001436 -0.007178 
+-0.001585 -0.002215 -0.003515 -0.000654 -0.004249 0.000769 
+-0.001369 -0.000023 0.003468 -0.001043 -0.000098 -0.000776 
+-0.002602 -0.000549 -0.001876 -0.003121 -0.003030 -0.002303 
+0.000008 -0.002298 -0.001277 0.004528 0.003234 -0.007405 
+0.003379 0.007871 -0.003743 0.003764 0.002596 -0.000805 
+0.000713 -0.001915 0.000075 -0.000225 0.000007 -0.000040 
+0.001432 0.002217 0.000435 0.002297 0.002437 0.000736 
+0.001212 -0.001374 0.004283 -0.002805 -0.001283 0.002395 
+-0.003447 0.001023 0.001212 -0.002463 0.000097 -0.000386 
+-0.001206 -0.004003 -0.000132 -0.000574 -0.007618 -0.000161 
+0.000153 -0.007960 0.001225 0.001622 -0.002215 0.005321 
+0.000006 -0.000794 -0.001018 -0.000246 -0.001869 -0.003738 
+-0.000436 -0.002717 -0.001721 0.000405 -0.001163 -0.000302 
+0.001675 0.001624 -0.000863 0.001051 0.000896 0.001168 
+0.000740 0.002228 0.003743 -0.001819 0.001206 0.004485 
+-0.003199 -0.001170 0.001748 -0.002984 -0.000903 -0.000064 
+-0.000988 0.000227 -0.000731 0.001249 -0.000750 -0.000226 
+0.000512 -0.000729 0.001501 -0.001879 -0.000909 0.001333 
+-0.000269 -0.000537 0.001119 -0.000733 0.000644 0.000177 
+0.001329 0.001661 -0.000580 0.000327 -0.000041 -0.000664 
+-0.004973 -0.002000 0.000553 -0.003838 -0.001162 -0.002980 
+-0.004422 0.000608 -0.000796 -0.003015 -0.001507 -0.000075 
+-0.001742 0.000530 0.000000 -0.000597 -0.000373 0.000373 
+0.000210 -0.002920 -0.000158 0.000348 -0.001520 0.001984 
+0.000198 -0.002812 -0.001624 0.004275 -0.000410 -0.003686 
+0.001037 0.000696 -0.003142 -0.000970 0.000869 -0.000793 
+-0.000180 0.000493 0.000038 0.000336 0.004096 -0.000685 
+0.000685 0.005954 -0.002531 0.006269 0.002060 0.000687 
+0.003461 -0.000589 0.001959 0.002724 -0.001802 0.000729 
+0.000591 -0.001172 -0.000422 0.000111 -0.000324 0.000210 
+0.000697 -0.000542 -0.000290 0.000211 -0.000189 -0.000863 
+-0.001088 -0.002328 0.000211 -0.001459 -0.000882 0.000871 
+-0.000566 0.000539 0.000466 -0.000345 0.000550 0.000401 
+-0.004290 -0.001481 0.000690 -0.005304 -0.002507 0.003290 
+-0.005397 -0.001604 0.001447 -0.001770 -0.000092 -0.000939 
+-0.000574 -0.000259 -0.002175 0.002378 0.000714 -0.006979 
+0.004038 0.005493 -0.003555 -0.001593 0.000593 -0.002778 
+-0.002801 -0.002219 -0.002684 -0.001175 -0.002830 0.000120 
+0.003726 0.000735 -0.001054 0.003252 0.004388 -0.004735 
+0.002275 0.004699 -0.004476 0.002790 0.000742 -0.000968 
+0.001627 -0.002063 0.001706 0.001162 -0.002334 0.001163 
+-0.001959 -0.001594 -0.001010 -0.006022 -0.001071 0.002409 
+-0.000049 -0.000931 0.000539 -0.000200 0.000260 -0.001120 
+0.000775 0.000111 -0.003154 -0.000536 -0.000924 -0.002821 
+-0.002293 -0.000089 -0.000751 -0.004242 0.000571 0.003428 
+-0.005111 -0.001200 0.003304 -0.004799 0.000380 0.002803 
+-0.004168 -0.000637 0.001285 -0.000363 0.000682 0.001501 
+-0.000158 -0.000482 0.000957 0.001550 0.002093 -0.000310 
+-0.000913 -0.000743 0.000774 -0.005760 -0.003669 0.001468 
+-0.005640 -0.003442 0.001831 -0.000646 -0.001662 0.001026 
+0.003210 -0.000917 -0.000692 0.004557 0.000293 -0.000773 
+0.002145 0.000439 -0.002584 0.001691 -0.000250 -0.000897 
+-0.002038 -0.001429 0.000087 -0.001718 -0.001818 0.001347 
+-0.000642 -0.001416 0.000669 0.000423 -0.000714 -0.002115 
+0.000776 -0.001548 -0.003488 0.000930 -0.000148 -0.001627 
+-0.000387 0.001667 0.000172 0.001069 0.002382 0.000794 
+0.001881 0.000656 0.000532 0.001165 -0.001054 0.000105 
+-0.000410 -0.000953 0.001260 -0.000462 0.001077 0.000154 
+0.000332 0.000728 0.001871 0.000998 -0.000503 0.000973 
+-0.000317 -0.002206 -0.000127 -0.001834 -0.002728 -0.001487 
+-0.006677 -0.002422 0.003155 -0.000076 0.000763 0.001852 
+-0.000113 0.001702 -0.000340 0.001039 -0.000209 -0.002493 
+-0.000333 -0.003783 -0.001673 0.000758 -0.004331 -0.001364 
+0.003980 0.000418 -0.001381 0.005432 0.003346 -0.002095 
+0.002201 0.001471 0.000365 -0.001270 -0.004574 -0.000847 
+-0.005197 -0.008061 0.002291 -0.004436 -0.001051 0.002802 
+-0.000641 0.001337 -0.001448 0.002203 0.001293 -0.002440 
+0.001059 -0.000577 0.000302 -0.000639 -0.004828 0.001354 
+-0.000145 -0.003534 -0.001385 0.002798 -0.000795 0.000064 
+0.001442 -0.001371 0.000615 0.000410 -0.000227 -0.000117 
+-0.000305 -0.000916 -0.002137 0.000615 -0.001173 0.000195 
+0.002774 -0.001450 -0.002219 -0.000590 -0.000943 -0.002714 
+-0.001360 -0.000649 -0.001103 -0.001289 -0.001762 -0.001031 
+0.001445 -0.002306 -0.002485 0.001395 -0.000310 -0.000233 
+-0.001720 -0.001783 -0.000770 -0.000546 -0.002059 -0.000702 
+-0.000493 0.000452 -0.000966 -0.001488 0.000206 -0.003437 
+-0.002965 0.003389 -0.004779 -0.000660 0.002192 -0.002830 
+0.000000 -0.002520 0.000236 0.006508 -0.002143 0.002143 
+0.001501 0.001811 0.002501 0.001437 0.006021 -0.000540 
+-0.001742 0.004193 -0.001677 -0.002652 0.000726 0.000720 
+-0.001696 0.000424 0.000465 -0.000231 -0.000169 0.000492 
+-0.000357 0.000802 0.001697 0.000782 0.000521 0.003389 
+-0.003223 -0.004834 0.007007 -0.000081 -0.005570 0.005326 
+0.000916 -0.002519 0.001832 -0.001949 0.002051 0.000103 
+-0.000870 0.002076 0.002412 -0.002005 -0.001432 0.004870 
+-0.000281 -0.000665 0.002365 -0.001012 0.000042 0.000942 
+-0.001305 -0.002241 0.001994 -0.002114 -0.005811 0.004048 
+-0.003053 -0.007107 0.002027 -0.000578 -0.003261 -0.000363 
+0.005212 0.000483 -0.003486 0.006098 -0.001634 -0.005340 
+0.003872 0.003454 -0.005352 -0.000862 0.001393 0.000133 
+0.002937 0.002937 -0.009206 -0.000011 -0.000731 -0.001417 
+-0.005060 -0.003320 0.004461 -0.004372 -0.000983 0.001039 
+0.000603 -0.003010 -0.000859 -0.000591 -0.002810 -0.000960 
+-0.001769 -0.003325 0.000495 -0.000581 -0.002891 0.003189 
+0.000652 0.000174 0.000522 0.004641 0.003268 -0.003007 
+0.007173 0.004543 -0.000752 0.002195 0.003150 0.001371 
+0.001209 -0.000078 0.000366 0.002545 -0.002627 -0.000264 
+0.001938 -0.004245 0.001015 0.003179 -0.002019 0.001085 
+-0.002256 -0.002556 0.001203 -0.001556 -0.001296 0.000704 
+-0.000066 -0.002063 -0.004078 0.000919 -0.000115 -0.004348 
+0.000283 -0.002493 0.000750 -0.003789 -0.005817 0.005110 
+-0.007637 -0.004832 0.005220 -0.005825 -0.000465 -0.001048 
+-0.002849 0.002477 -0.001274 0.001172 0.000725 0.000478 
+0.002924 -0.000714 -0.001897 0.000423 -0.002407 0.002831 
+-0.000039 -0.005267 0.001873 0.001284 -0.003580 0.001012 
+0.002017 -0.000056 -0.000421 0.000000 0.000735 -0.001029 
+-0.000279 -0.000279 0.001675 -0.001684 -0.001484 0.004023 
+-0.001336 -0.002672 0.001336 -0.001497 -0.001431 -0.000612 
+-0.000224 -0.001481 -0.000987 0.001267 0.000844 -0.005113 
+-0.000446 0.003022 -0.000867 0.001599 0.000463 0.000412 
+0.004264 -0.001625 0.000338 0.003410 0.004071 -0.000662 
+0.000455 0.000985 0.000455 0.000000 -0.001343 0.001343 
+-0.006584 -0.000548 0.002012 -0.001358 0.001457 0.000049 
+0.000149 0.000149 -0.000448 0.001493 0.001223 -0.001529 
+-0.001232 0.000538 -0.000113 -0.000609 0.000707 -0.000983 
+-0.001854 -0.001633 -0.001605 -0.004065 -0.000852 -0.002167 
+-0.002742 0.002993 -0.001487 0.000000 0.000153 0.001298 
+-0.001745 -0.002164 0.002618 -0.000620 -0.000413 0.002090 
+0.001353 -0.000440 -0.001454 0.001684 0.001603 -0.000281 
+0.000269 0.002916 -0.002809 0.000483 0.000850 -0.000934 
+0.001542 0.000100 0.001443 0.003051 0.002993 0.000116 
+0.002662 0.005826 -0.001222 -0.000692 0.004107 -0.001938 
+-0.003061 0.000473 0.001725 -0.002862 -0.001199 0.002338 
+-0.000497 -0.000593 -0.000038 0.000645 -0.001147 -0.000753 
+0.001092 -0.000728 -0.000076 -0.003945 -0.003621 0.002973 
+-0.006055 -0.004690 0.002998 -0.002082 -0.002051 -0.000613 
+-0.001220 0.001626 0.002033 0.002724 0.001341 -0.000976 
+0.000493 0.002656 -0.000786 0.001623 -0.003588 -0.004243 
+-0.001409 -0.000527 0.001132 0.000400 -0.000190 0.001223 
+0.000669 -0.000301 -0.000100 0.004984 0.004092 0.002430 
+0.002789 0.001190 0.000124 -0.000798 -0.000327 -0.001354 
+-0.001769 0.000042 -0.000777 -0.000520 0.000647 -0.001214 
+0.000163 0.002137 -0.002992 -0.001129 0.004715 -0.000282 
+0.000027 0.004381 -0.000935 0.003617 0.001841 -0.002031 
+0.004588 -0.001735 -0.002382 0.002995 -0.000571 -0.003508 
+0.002970 0.002941 -0.003012 0.001298 0.002372 -0.003390 
+0.000632 0.001645 -0.002120 0.001042 0.000530 -0.002413 
+0.003692 -0.002271 -0.002804 0.000319 -0.004840 -0.001868 
+-0.001647 -0.003780 -0.002433 -0.000644 -0.000166 -0.000194 
+0.002143 0.000292 -0.001460 0.003276 0.000377 -0.002834 
+0.000601 0.001022 -0.002404 0.001155 -0.000099 -0.001264 
+0.000875 0.000318 -0.000196 0.001207 0.000675 0.000544 
+0.000580 0.000253 0.000459 0.001192 -0.001045 0.000633 
+0.001796 0.000222 -0.000856 -0.000169 0.000749 0.001836 
+0.000095 0.000659 0.002569 -0.000163 0.000081 0.001180 
+-0.001309 -0.000624 -0.000879 -0.002399 -0.001512 -0.001977 
+-0.003600 -0.002498 -0.001223 -0.002753 -0.000525 0.000262 
+0.001518 -0.001192 0.003152 -0.000873 0.000984 0.001468 
+-0.001009 0.001484 -0.001335 -0.002063 0.000397 -0.000397 
+-0.004573 -0.003386 0.001418 -0.003070 -0.004396 0.001275 
+0.001466 -0.001902 -0.001406 0.003067 0.001316 -0.005257 
+-0.000097 0.003573 -0.004660 0.000530 0.001512 -0.002620 
+-0.000692 -0.000156 -0.000891 0.000122 -0.002216 -0.001338 
+-0.000317 -0.003010 -0.000386 0.001185 0.001475 0.000023 
+0.004491 0.001027 0.001785 0.004513 0.002572 0.002574 
+0.003587 0.001827 0.000601 0.000147 0.000265 -0.000300 
+-0.001835 -0.001976 -0.001806 -0.002251 -0.001998 -0.000682 
+-0.001329 -0.002738 0.002006 -0.001807 -0.002734 0.003257 
+-0.001392 -0.001483 0.003223 -0.000871 -0.000058 0.000465 
+0.001780 0.001864 -0.001864 0.003202 0.001885 -0.000517 
+0.001217 -0.000653 -0.000817 0.001174 -0.003683 -0.000482 
+0.000663 -0.001123 -0.001731 -0.001334 0.002827 -0.003823 
+0.001032 0.002063 -0.004762 -0.003750 -0.000254 -0.001601 
+-0.002098 -0.000921 -0.003490 -0.000611 -0.001414 -0.002041 
+0.005986 0.001433 -0.002905 0.000185 0.002393 -0.001265 
+0.002874 -0.001663 0.003232 0.000245 0.001090 0.000938 
+0.003662 -0.002858 -0.001160 0.006097 0.002188 -0.002034 
+0.003430 0.002732 0.000579 -0.000840 0.002430 0.003209 
+0.000506 0.002174 0.001308 0.000046 0.002031 0.001200 
+0.003074 0.001248 0.000491 0.001941 0.003802 -0.001218 
+0.000254 0.000664 -0.001871 0.001836 -0.000393 -0.001764 
+-0.000582 0.000646 -0.000194 -0.001793 -0.000302 0.001620 
+0.000273 -0.000075 0.004154 0.002747 0.000392 0.002290 
+0.001208 0.001583 -0.001126 0.001128 0.000738 -0.003733 
+0.000103 0.000766 -0.002098 -0.000007 -0.000461 0.000369 
+0.000676 -0.001818 -0.001130 0.001049 -0.003538 -0.001343 
+-0.001138 -0.001583 -0.001991 -0.001136 0.000903 -0.000913 
+-0.002957 0.000952 0.001328 -0.002015 -0.000154 -0.000719 
+-0.000222 -0.000402 -0.004019 0.000746 0.003171 0.000528 
+-0.000339 0.000822 0.000628 -0.001094 0.000426 -0.000009 
+-0.001640 -0.000201 -0.001104 -0.002134 0.000132 -0.001735 
+-0.001667 0.000764 -0.001528 -0.001871 -0.000665 -0.000754 
+-0.000759 0.001087 -0.000977 0.001043 0.003065 -0.002133 
+0.002762 0.002500 -0.002698 0.003043 0.002020 -0.000983 
+0.002785 0.002482 0.000281 0.002093 0.003113 -0.002145 
+0.003843 0.003893 -0.001023 0.000957 0.001854 -0.001489 
+-0.001763 0.000138 0.001803 -0.002060 -0.001447 -0.000253 
+-0.000084 -0.001465 0.000369 -0.001665 0.001382 0.001113 
+-0.001033 0.003590 -0.002197 -0.000591 0.001930 -0.005306 
+0.000646 0.000010 -0.002714 -0.000494 0.000930 0.001841 
+-0.001493 0.000423 0.002986 -0.001478 0.000647 -0.002069 
+-0.002075 0.000901 -0.003322 -0.000457 -0.000548 -0.001164 
+-0.000530 0.000388 0.000243 -0.000878 -0.000649 0.000147 
+0.000329 -0.000797 -0.000006 0.001730 0.000471 -0.000910 
+0.000696 0.002016 0.000077 -0.000447 0.001445 -0.001951 
+-0.002139 -0.002998 -0.000440 0.000595 -0.004401 -0.000830 
+-0.001021 -0.004524 -0.002405 -0.001895 0.000601 -0.005425 
+-0.000019 0.002642 -0.005228 0.000361 -0.000433 -0.001864 
+0.000053 -0.000285 -0.000682 0.001368 -0.000153 -0.000383 
+0.000143 -0.000859 0.000252 -0.000094 0.005041 -0.000567 
+-0.000618 0.002268 0.002218 -0.001028 0.002997 0.000834 
+-0.000746 0.001324 -0.001244 -0.001714 -0.000359 -0.001153 
+0.001436 -0.001002 -0.001996 0.000338 -0.001764 -0.000230 
+0.002180 -0.002932 0.004649 0.000463 -0.002277 -0.000683 
+-0.001535 0.002292 -0.002022 0.000210 0.004616 -0.002502 
+0.000869 0.004135 -0.004177 -0.001322 0.000486 -0.003829 
+-0.000901 -0.000263 -0.001841 0.001989 0.000261 0.000324 
+0.007118 -0.001365 -0.001946 0.003749 -0.003214 -0.006140 
+0.000665 0.000205 -0.008339 0.002297 -0.000623 -0.001309 
+-0.001950 -0.002107 0.000565 -0.001921 -0.002000 0.000698 
+-0.001221 -0.001635 0.000171 -0.001382 -0.002916 -0.001631 
+-0.001053 -0.000789 0.000789 0.002291 -0.001501 -0.002530 
+0.002372 -0.001936 0.000509 0.002538 -0.001269 0.004069 
+-0.003156 -0.002367 0.005655 -0.001830 -0.005976 0.005121 
+-0.000367 -0.003666 0.004275 0.000098 0.000222 0.002160 
+-0.003664 0.002997 -0.000011 -0.005754 -0.000450 -0.001734 
+-0.001350 0.001115 -0.002824 -0.000173 0.003159 -0.000889 
+-0.000392 0.001681 0.000437 -0.001374 0.000361 -0.001233 
+-0.001954 0.001520 -0.000956 -0.001460 0.002111 -0.000379 
+-0.000625 0.002150 0.000430 -0.000760 0.002827 0.000941 
+-0.000850 0.002037 0.001348 -0.000651 -0.000195 -0.000307 
+-0.001218 -0.001989 -0.002141 -0.002393 -0.001059 -0.001154 
+-0.001178 -0.000446 -0.001057 -0.000133 0.000513 -0.000611 
+0.001000 -0.001049 -0.001697 0.001141 0.000854 -0.001272 
+-0.000242 -0.000037 0.001359 -0.000542 0.000180 0.000461 
+0.000902 0.000277 -0.000118 0.001794 0.003953 -0.004783 
+-0.000350 0.006941 -0.006604 -0.001076 0.006352 -0.004359 
+0.001670 0.002189 -0.003144 0.001723 0.000783 0.000447 
+-0.000813 0.000834 0.001835 -0.003076 0.002062 0.001503 
+-0.002597 0.001566 0.001522 -0.001380 -0.000143 0.000946 
+-0.000709 0.001423 0.001263 0.000134 0.004042 0.000225 
+0.001145 0.003837 -0.000189 -0.001910 0.000165 -0.002674 
+-0.000797 -0.003437 -0.001461 -0.001471 -0.003106 -0.000882 
+0.000063 -0.000147 -0.003359 -0.002949 0.000980 -0.002731 
+-0.001039 0.002552 -0.001134 0.000574 0.000930 -0.000806 
+0.002049 0.000356 -0.000427 0.001639 -0.000965 0.000643 
+0.000082 -0.004519 -0.000753 -0.000844 -0.002377 0.000317 
+-0.000216 0.002266 -0.000084 -0.000347 0.003283 -0.002763 
+0.001221 -0.000500 -0.001250 -0.001432 -0.001440 -0.000963 
+-0.003393 -0.002852 0.001198 -0.002353 -0.000916 0.001734 
+-0.000164 -0.000085 0.001973 -0.000563 0.001259 0.002959 
+0.001784 0.004077 0.000517 -0.000561 -0.000576 -0.001712 
+-0.000996 -0.000798 0.004855 -0.000349 -0.000597 0.001324 
+-0.000221 0.003028 -0.004375 -0.000769 0.003861 -0.006756 
+-0.001189 0.001081 -0.004036 -0.001085 -0.001681 0.002316 
+0.000250 -0.004206 0.003482 0.002932 -0.001570 -0.000067 
+0.003790 0.001353 -0.004061 0.002678 0.001357 -0.003478 
+0.001115 -0.001280 -0.000797 -0.000649 -0.002138 -0.000913 
+-0.000524 -0.001106 -0.002305 -0.000204 -0.000025 -0.005276 
+0.000892 0.001785 -0.006077 0.000855 0.001251 -0.003910 
+0.000207 -0.001724 -0.002138 -0.000587 -0.002670 -0.003181 
+0.000328 -0.001565 -0.002934 0.000685 -0.000685 0.000890 
+-0.000658 -0.002864 0.005280 -0.001310 -0.005033 0.005151 
+0.000065 -0.003107 0.000777 0.001074 0.003214 -0.001266 
+0.000113 0.005524 -0.001097 0.000268 0.003392 -0.000125 
+0.000386 0.000501 0.000585 0.000570 0.000157 0.001800 
+0.000592 -0.000375 0.002031 0.001314 0.002302 -0.000112 
+-0.001888 0.001462 -0.002231 -0.002393 -0.001181 -0.003485 
+-0.002012 -0.002986 -0.002295 -0.004215 -0.000498 -0.000272 
+0.000070 -0.000430 -0.000395 0.002653 0.000983 -0.003085 
+-0.001845 0.002003 -0.002552 0.000101 0.000342 -0.000090 
+0.001701 0.000052 0.002621 0.000854 0.000112 -0.000654 
+0.000123 -0.001900 -0.004118 -0.000208 -0.002465 -0.001394 
+0.000792 0.000037 0.000281 0.003331 0.000812 -0.001583 
+0.003925 0.002794 -0.002714 0.000412 -0.000473 -0.002093 
+-0.001742 -0.003485 -0.000874 -0.001047 0.001047 -0.003176 
+0.001070 0.002223 -0.002482 -0.000759 0.003093 -0.000521 
+-0.003281 -0.000066 0.000263 -0.005489 -0.003315 -0.000743 
+-0.005970 -0.004075 -0.002323 -0.002532 -0.002884 -0.002851 
+0.000460 0.000723 -0.000937 0.000792 0.001167 0.002237 
+-0.000321 0.000381 0.003310 -0.000536 -0.000357 0.001416 
+0.001611 0.000952 -0.003441 -0.000840 0.004322 -0.004082 
+-0.000645 0.001445 -0.000896 -0.000800 -0.005440 0.000000 
+-0.003455 -0.006305 0.004276 -0.003684 -0.003365 0.001114 
+0.001614 -0.002341 -0.005032 0.004579 0.000226 -0.008480 
+0.005256 0.003797 -0.005955 0.002585 0.006113 -0.003407 
+0.001457 0.005089 -0.002675 0.000387 0.002812 -0.003300 
+-0.000118 0.001163 -0.002004 -0.000950 0.001710 0.000764 
+0.000593 -0.000283 0.000359 0.004570 0.004648 -0.000182 
+0.000990 -0.000708 -0.002272 0.000645 -0.000309 -0.000804 
+0.002328 0.001688 0.001990 0.000591 0.001192 0.005070 
+-0.002637 -0.004484 0.005847 -0.001781 -0.003385 -0.000392 
+-0.001913 0.000334 -0.000923 -0.000672 0.000843 0.000153 
+0.000429 -0.000910 0.000004 0.000204 -0.002177 0.000616 
+0.000898 -0.000746 0.000148 0.002748 0.000887 -0.003665 
+0.004074 0.002196 -0.004709 0.004008 -0.001336 -0.003840 
+0.000773 -0.001547 -0.000773 -0.000165 0.005348 -0.001599 
+0.000796 0.006995 -0.006677 0.003351 0.002852 -0.005677 
+0.004563 0.001082 -0.001162 0.004502 -0.000072 -0.000552 
+0.004228 -0.001059 -0.000816 0.003543 -0.000082 0.000643 
+0.002247 0.001580 0.001405 0.000029 0.001657 0.001084 
+-0.001693 0.001559 -0.000443 -0.003866 0.000446 -0.000297 
+-0.002365 -0.001382 -0.002049 -0.000384 -0.000076 -0.000549 
+0.000159 0.002437 -0.000197 0.001222 0.005365 -0.000486 
+0.001603 0.003664 -0.006068 -0.002174 0.001089 -0.003256 
+-0.002548 0.000154 -0.002074 -0.001912 -0.001249 -0.001177 
+-0.002547 -0.001476 0.001622 -0.004132 -0.000614 0.003271 
+-0.002890 0.001017 0.002354 -0.000319 -0.005588 -0.000799 
+0.003137 -0.003490 -0.001738 0.004337 0.003530 0.000302 
+0.005006 -0.000600 0.009604 -0.000119 -0.003694 0.022985 
+-0.001396 -0.004491 0.025328 -0.000107 -0.001473 0.012608 
+0.000377 0.001665 0.002685 -0.000210 0.004666 -0.001273 
+-0.000460 0.003218 -0.000565 -0.000205 -0.001576 0.001811 
+-0.001373 -0.002288 0.004167 0.001391 -0.001490 0.003402 
+0.001929 -0.000786 -0.001419 0.004675 0.000803 -0.003353 
+0.005481 0.001575 -0.000131 0.003787 0.002785 0.000025 
+0.001049 0.001447 -0.002629 -0.000287 0.000958 -0.002444 
+0.000238 -0.000859 0.000494 0.000984 -0.002500 0.003445 
+0.001004 -0.000331 0.000838 -0.000189 -0.000131 0.000714 
+0.000247 0.000090 0.001034 0.001970 -0.001456 0.003170 
+-0.002226 -0.003689 -0.001398 -0.002131 -0.000214 0.000322 
+-0.000645 -0.003040 0.001129 -0.005659 -0.001279 0.001279 
+-0.002539 -0.002619 0.000606 -0.000875 -0.001298 -0.002326 
+0.000117 -0.000340 -0.003270 0.000128 0.002407 -0.001271 
+-0.002900 -0.001146 0.001345 -0.006629 -0.000635 0.002956 
+-0.004242 0.000954 0.003349 0.000561 0.000935 0.000748 
+0.002351 0.002463 -0.001753 0.000409 -0.000171 -0.003677 
+-0.002261 -0.004193 -0.001632 -0.000044 -0.004179 -0.000055 
+0.004031 0.000200 -0.004237 0.003537 0.002776 -0.002575 
+-0.000301 -0.000526 0.002863 0.002440 -0.002722 0.005411 
+0.001925 -0.001584 0.001211 0.002993 -0.000356 -0.005380 
+0.003692 0.001780 -0.008122 0.002566 0.003571 -0.005740 
+0.001575 0.002588 -0.004744 0.003463 0.002078 -0.003629 
+0.002292 0.002869 -0.001732 0.001395 0.000776 -0.002632 
+-0.000554 0.000308 -0.000277 -0.000157 0.000463 -0.003424 
+0.000622 -0.000857 -0.001893 -0.001341 0.000814 -0.001030 
+0.000519 0.001094 -0.002015 0.002621 0.002100 -0.000128 
+0.005163 0.005129 -0.001294 0.007803 0.004755 -0.000402 
+0.005743 0.004455 0.003909 0.000426 0.005286 0.004656 
+-0.001321 0.004938 0.002957 -0.005251 -0.008421 0.009451 
+-0.001884 -0.013171 0.006404 -0.002714 -0.009996 0.002668 
+-0.001526 -0.002114 0.001991 0.001042 0.001167 0.002189 
+-0.001228 0.000390 0.001447 -0.001889 0.001679 0.000214 
+-0.000577 0.000385 -0.000221 0.004862 0.002115 -0.001054 
+0.003673 0.001923 -0.002458 0.000208 -0.000354 0.000637 
+-0.001781 -0.005310 0.004433 0.000997 -0.006021 0.005387 
+0.001078 0.000573 -0.001926 0.000883 0.001942 0.000174 
+-0.000934 0.006172 0.021777 0.096447 0.761421 4.401015 
+0.000000 0.375610 5.034146 -0.189655 -0.218391 3.718391 
+-0.001294 -0.007436 0.013757 -0.004963 -0.006318 -0.000896 
+-0.000827 0.001675 0.001757 0.002352 0.000161 0.004392 
+-0.000200 -0.005474 0.004932 -0.000209 -0.005406 0.005993 
+-0.002794 -0.005255 0.004204 -0.002263 -0.002649 0.002208 
+0.000955 -0.000663 0.000496 0.003190 -0.000648 0.002165 
+0.003469 -0.000298 0.003268 0.000870 -0.000838 0.001454 
+0.000363 -0.000708 0.000446 -0.000109 -0.001530 0.001749 
+-0.001232 -0.003473 0.000392 -0.003932 -0.000897 0.000897 
+-0.001294 0.000756 0.002588 -0.002287 0.001280 0.003812 
+-0.003815 -0.000668 0.001765 -0.001637 -0.002191 0.000246 
+-0.002355 0.000294 -0.001219 -0.006488 -0.000236 0.002831 
+-0.002602 0.000616 0.004998 -0.000779 0.000232 0.002275 
+0.000303 0.000303 0.000530 0.001950 -0.002600 0.000000 
+-0.001342 0.001247 0.000917 -0.008613 0.000316 0.003122 
+-0.004171 -0.004421 0.001849 -0.000134 -0.000167 0.001210 
+0.002042 0.003554 0.000102 -0.000568 0.004578 -0.005134 
+0.002829 0.004252 -0.006621 0.000250 0.002225 -0.003367 
+0.004362 0.000117 -0.002474 0.000133 -0.000929 -0.000723 
+-0.002206 -0.001099 0.002764 -0.001728 -0.001248 0.001560 
+0.002299 0.000609 -0.003536 -0.000313 0.002637 -0.006343 
+0.001216 0.004290 -0.001790 0.000000 0.000000 0.000775 
+-0.001579 -0.001061 0.000265 0.001434 0.000411 -0.003380 
+0.000121 0.001108 -0.003186 0.006644 0.002217 0.000016 
+0.000143 0.002242 0.000476 -0.000123 -0.000620 0.001569 
+-0.001874 -0.001236 0.002547 -0.003688 -0.001893 0.001517 
+-0.003858 0.000567 -0.000283 0.001105 0.001182 -0.000610 
+0.004739 0.000898 -0.001233 0.005266 -0.001263 0.001973 
+0.000856 0.000865 0.002255 0.000729 0.002872 -0.001641 
+-0.004786 0.000375 -0.000455 -0.005021 -0.001133 0.003975 
+-0.000407 -0.004650 0.004358 0.000279 -0.003628 0.001550 
+0.001635 -0.000774 -0.003508 0.006918 0.002462 -0.002638 
+0.002984 -0.000852 -0.004964 0.002896 0.001833 -0.001142 
+-0.000281 -0.000042 0.000500 -0.001373 -0.003262 -0.002832 
+-0.001647 0.000501 -0.009350 -0.002357 0.001534 -0.006832 
+-0.001070 -0.000612 0.000739 -0.001259 -0.000755 -0.003680 
+-0.002313 0.004298 -0.002953 0.007706 0.000290 -0.008126 
+0.004788 0.003435 0.013974 -0.082353 0.741176 3.647059 
+-0.160000 0.268571 4.114286 -0.002939 -0.001848 0.028873 
+0.001219 -0.002071 0.004510 -0.000805 0.002585 -0.003717 
+-0.001722 0.002466 0.001382 -0.000523 -0.001954 0.004363 
+-0.000953 0.000681 0.002941 -0.001767 -0.005564 -0.001767 
+-0.003553 -0.001472 0.003375 -0.001041 -0.000509 0.003217 
+0.000379 0.000795 -0.000075 0.000935 -0.002339 0.000468 
+-0.003680 -0.002000 0.000320 -0.008275 -0.005757 0.005397 
+-0.008560 -0.004736 0.007346 -0.005291 -0.000672 0.004200 
+-0.000991 -0.000991 0.002069 -0.004413 0.002754 0.002211 
+-0.005073 0.002593 0.000611 -0.002022 0.002909 -0.002109 
+0.000758 0.001537 -0.000238 -0.000325 -0.003300 -0.000429 
+-0.001985 -0.004644 -0.003125 -0.009008 -0.006483 0.003367 
+-0.004780 -0.001547 0.001733 0.002265 -0.000928 -0.000415 
+0.002335 -0.001032 -0.002440 -0.000652 0.000408 -0.000682 
+-0.003027 -0.000182 -0.000642 -0.000112 0.000191 -0.000065 
+0.005292 0.001337 -0.001147 0.003905 0.001725 -0.002725 
+0.004180 -0.004479 0.000747 -0.000774 -0.000130 0.001031 
+0.000409 0.000398 0.001311 -0.000101 0.011991 -0.003429 
+0.004985 0.003095 -0.002670 0.000779 0.003595 -0.001278 
+-0.002132 0.000982 0.001789 -0.000967 -0.000180 0.000559 
+0.002650 0.001094 -0.001624 0.004329 0.003774 -0.000625 
+-0.001706 0.007726 0.000301 0.000863 0.000876 0.001199 
+-0.001770 -0.003736 0.004029 0.002540 -0.002222 0.000873 
+0.001865 0.004758 0.000762 -0.000499 0.004190 -0.004888 
+-0.000160 -0.001714 0.000139 -0.004914 -0.006064 0.004287 
+0.001162 -0.000341 0.001964 -0.000979 0.001697 -0.000849 
+-0.002582 0.004393 -0.001342 0.004800 0.002800 0.001040 
+0.005241 0.000429 0.001454 0.003455 0.002938 -0.000074 
+-0.002394 0.001732 0.000829 -0.004219 0.000058 0.004025 
+-0.005405 -0.003850 0.004805 -0.003346 -0.002589 0.002001 
+0.000049 0.000498 -0.002787 -0.000193 0.005176 -0.003361 
+0.000978 0.005630 -0.003435 0.005887 0.006613 -0.002177 
+0.005686 -0.000685 0.001474 0.000661 0.001326 0.002117 
+-0.003607 -0.002922 0.003357 -0.004049 -0.007234 -0.000743 
+-0.003941 -0.001789 -0.008242 0.000434 0.005827 -0.013482 
+-0.000030 0.001207 -0.001395 0.001252 -0.005666 0.007276 
+0.004721 -0.005683 0.007879 0.011083 -0.001280 0.006380 
+0.012882 0.003049 0.004469 0.007325 0.003308 0.003604 
+-0.001538 -0.000547 0.002129 -0.003829 -0.004293 0.000420 
+-0.000213 0.002886 -0.000584 0.001518 0.006054 -0.002355 
+0.006397 0.004732 0.000710 0.005439 -0.000762 0.000632 
+-0.001176 -0.004555 0.004848 0.000800 -0.000807 0.001678 
+0.001974 -0.001872 0.000811 0.001679 -0.000154 0.002904 
+0.001487 -0.004096 0.002292 0.001884 -0.002591 -0.000177 
+-0.004839 0.002221 0.003413 -0.008242 0.002959 0.004227 
+-0.005122 0.003679 0.003844 -0.003894 -0.000708 0.003894 
+-0.000156 -0.000251 0.003378 -0.001010 0.001021 0.003003 
+-0.000884 0.001534 -0.000491 0.004653 0.001994 -0.000531 
+0.002165 -0.002814 0.002294 -0.000441 -0.008830 0.000631 
+0.001216 -0.011548 -0.001013 0.000347 -0.000639 -0.001240 
+-0.006188 0.001922 0.001019 -0.009412 0.002539 -0.001795 
+-0.010743 0.001191 -0.001024 -0.003113 0.006491 0.000756 
+-0.001493 0.003551 0.001004 0.000248 0.001587 0.000529 
+0.001883 0.000303 0.000519 -0.000970 0.000084 0.001454 
+0.000259 0.001885 0.000692 0.000229 0.001612 0.001264 
+0.000529 -0.000701 0.001759 0.000253 -0.000304 0.000139 
+0.002154 0.004652 -0.004093 -0.000545 0.002037 -0.002152 
+-0.003399 -0.002406 0.000503 -0.001743 -0.003576 0.001651 
+0.001417 0.000143 -0.001712 0.006063 0.002372 -0.002637 
+0.001527 -0.000323 -0.000114 -0.001684 0.001528 -0.000292 
+0.001579 0.001451 -0.000441 0.000586 0.000627 0.000858 
+0.002417 0.000920 -0.000052 0.001530 0.000383 0.000894 
+0.000523 0.000233 0.002125 -0.002133 0.000420 0.002913 
+-0.002572 -0.000094 0.000134 0.005145 0.003223 -0.004466 
+0.003700 0.004705 -0.009580 0.006650 0.004165 -0.004609 
+0.003663 0.000939 -0.001498 0.000551 0.000432 -0.000709 
+-0.001316 0.000600 -0.000035 -0.003658 -0.000403 0.003111 
+-0.004927 -0.006504 0.004271 -0.002486 -0.005350 0.003737 
+0.000619 0.001547 -0.000541 0.006538 0.005273 -0.007585 
+0.003124 0.006514 -0.003923 -0.000025 0.001100 -0.000871 
+0.001970 0.001708 -0.000891 -0.001968 0.002913 0.000968 
+-0.004424 -0.000683 0.001409 -0.004944 0.002020 0.000071 
+-0.002418 -0.003597 -0.003122 -0.003453 0.001285 -0.008140 
+-0.000319 0.003284 0.008599 0.005210 -0.012476 0.031807 
+1.252381 -1.880952 4.052381 1.434343 -2.146465 3.858586 
+0.013820 -0.019243 0.025564 0.000336 -0.001669 0.001716 
+-0.005779 0.007268 -0.006848 -0.001568 0.006276 0.000245 
+0.000531 0.000296 0.001041 -0.000480 0.000598 0.001627 
+0.001399 0.001272 0.001094 -0.000965 -0.004696 0.004525 
+-0.000958 -0.001152 0.004764 -0.003534 -0.000503 -0.000525 
+0.001753 -0.003384 -0.001059 0.001580 -0.002003 0.000921 
+-0.001483 0.000134 0.004297 -0.007755 0.004659 0.004375 
+-0.010821 0.001893 0.000543 -0.001452 -0.000319 0.000355 
+0.002737 0.005474 -0.000526 -0.000142 0.001336 0.001816 
+0.001260 -0.000131 0.001535 0.000696 -0.001006 -0.001085 
+0.002336 0.000379 -0.001460 -0.003418 -0.002466 -0.002276 
+-0.001630 0.000830 0.003138 -0.003407 -0.007536 0.009174 
+-0.005239 -0.009470 0.007329 -0.001514 -0.006842 0.005046 
+-0.011892 -0.000559 -0.001117 -0.003476 0.000785 0.005023 
+-0.003898 0.007797 0.000000 0.002719 0.011186 0.000604 
+0.002456 0.003785 0.003922 0.000450 0.000165 0.000625 
+-0.005460 -0.006269 0.005403 -0.000309 -0.005637 0.000978 
+0.002811 0.002189 0.000104 0.003352 -0.000027 -0.005787 
+0.004023 -0.000647 -0.003985 0.002815 -0.002208 0.001201 
+-0.001536 0.000445 0.000431 -0.002520 -0.003495 0.002996 
+-0.002107 -0.004472 0.005180 -0.000842 -0.001835 0.003025 
+0.000853 0.001368 0.000342 0.003305 -0.001033 -0.001674 
+0.006080 -0.002311 -0.003449 0.007210 -0.003565 -0.003997 
+0.004695 0.000105 -0.003854 0.001969 -0.000236 -0.002126 
+-0.000758 0.000791 -0.000648 -0.000160 -0.001040 0.000240 
+0.000111 -0.000632 0.000090 -0.001550 -0.000292 0.000546 
+0.000238 0.003667 -0.002594 0.000114 0.004247 -0.002207 
+0.001095 0.001920 -0.001915 -0.001206 -0.001156 0.000831 
+-0.002539 -0.003117 0.002561 -0.001776 -0.001734 0.001049 
+-0.001988 0.001652 -0.001435 -0.002310 0.003491 -0.002507 
+-0.005074 0.000000 0.002941 -0.004657 -0.003011 0.006233 
+-0.001088 -0.000455 0.004075 0.005995 -0.000661 -0.001344 
+0.002987 0.007249 -0.002853 0.005685 0.003572 -0.003983 
+0.001626 -0.002323 -0.001521 -0.003824 0.003529 -0.003629 
+-0.005201 0.002172 -0.003095 -0.007553 0.000037 -0.002677 
+-0.005542 -0.003214 -0.005467 0.001536 -0.002347 0.001416 
+0.011912 -0.004416 0.017879 1.672131 -1.677596 4.213115 
+1.855814 -2.311628 5.023256 1.645161 -2.586021 4.500000 
+-0.000222 -0.019831 0.016957 -0.002905 -0.004558 -0.003061 
+-0.004062 0.001533 -0.004149 -0.002506 0.001323 0.001344 
+0.000718 0.000492 0.001972 0.003852 -0.001973 -0.001477 
+-0.000055 -0.002119 -0.001212 -0.000103 -0.003210 0.003186 
+-0.000710 -0.001775 0.002699 -0.000187 -0.001333 -0.000487 
+0.000993 -0.002879 -0.001293 0.001140 -0.002746 0.001932 
+-0.000343 -0.000884 0.002764 0.001385 0.003285 -0.001068 
+0.000881 0.004088 -0.007296 0.000167 0.005206 -0.003934 
+0.002468 -0.000380 -0.003380 0.003953 -0.001772 -0.004431 
+0.004344 -0.000035 -0.004328 0.002875 -0.000053 -0.001097 
+-0.002551 -0.003080 -0.001259 -0.002821 -0.003368 -0.005279 
+-0.000837 0.000614 0.001339 -0.010023 -0.006969 0.006480 
+-0.011647 -0.007500 0.007180 -0.006349 -0.007286 0.002672 
+-0.003743 -0.000362 -0.004789 0.002957 0.003843 -0.004804 
+0.008190 0.005355 -0.001648 0.007758 0.005304 0.004774 
+0.000046 0.003248 0.001182 0.002799 0.002097 -0.002680 
+-0.003081 -0.004696 0.000419 -0.004602 -0.008719 0.004822 
+-0.002549 -0.003378 0.007484 0.001083 -0.003254 0.002353 
+0.000624 -0.000686 -0.000725 -0.002566 0.000487 -0.001470 
+-0.003451 -0.004347 0.002421 -0.000738 -0.000492 0.000000 
+0.003360 0.002534 0.002182 0.000493 0.003847 0.000033 
+-0.000013 -0.000539 -0.001142 -0.000688 -0.001255 -0.002227 
+-0.001243 -0.004127 -0.001679 0.002968 -0.000256 -0.002855 
+0.006400 0.003610 -0.002117 0.001050 0.004796 -0.007035 
+0.001329 -0.001161 -0.006085 -0.000675 -0.000612 -0.004473 
+-0.000323 -0.001285 -0.001064 -0.002762 -0.000292 0.000774 
+-0.001311 0.000379 -0.000064 -0.000981 -0.000130 -0.000454 
+-0.002181 0.000063 -0.001486 -0.001624 -0.000848 -0.001473 
+-0.000568 -0.000631 0.000821 0.001201 0.000634 -0.000043 
+0.001145 0.002309 0.000259 -0.003111 0.000169 -0.002063 
+-0.006601 -0.003143 0.001069 -0.006986 -0.005790 0.000661 
+-0.005641 -0.001488 0.000765 -0.004012 -0.001034 0.006410 
+-0.000698 0.001860 0.005116 0.001856 0.000409 0.000381 
+0.006366 0.003731 -0.005057 0.001126 0.007411 -0.001345 
+0.000746 0.005311 -0.002367 -0.002043 0.004799 -0.004572 
+-0.001154 0.002956 -0.007650 0.003435 -0.002171 0.004750 
+0.011560 -0.013012 0.008865 1.519737 -1.690789 3.269737 
+1.782946 -2.325581 4.108527 0.012075 -0.022294 0.025630 
+0.001307 -0.002493 0.000813 -0.002037 0.000237 -0.003183 
+0.000770 0.000634 0.001679 0.000199 0.000367 0.003856 
+0.001581 0.000664 0.002458 0.001290 -0.000825 -0.000125 
+0.000096 -0.002621 0.001794 -0.000722 -0.002071 0.001717 
+0.001580 0.000495 -0.000567 0.000965 0.000922 -0.003636 
+-0.000059 0.001605 -0.002775 -0.001179 0.001512 -0.000437 
+-0.001992 0.001532 -0.001195 0.000086 0.003412 -0.002678 
+0.002378 0.002443 -0.003312 0.002451 0.000761 -0.000678 
+0.001755 -0.001269 -0.000370 0.001813 -0.001585 -0.001435 
+0.001880 -0.002734 -0.001741 -0.001648 -0.004590 -0.002091 
+-0.004230 -0.003496 -0.003659 -0.000747 -0.000722 -0.003311 
+0.000532 -0.002484 -0.000412 0.000316 -0.000799 0.000164 
+-0.004186 0.001196 -0.006441 0.001135 0.003076 -0.001478 
+0.001358 0.005436 -0.007813 0.006240 0.003935 -0.007614 
+0.008367 0.006245 -0.004622 0.002006 0.004421 -0.002048 
+-0.000131 0.000366 0.001865 -0.008161 -0.000565 0.006666 
+-0.014179 -0.001748 0.001418 -0.011714 -0.003905 0.003238 
+-0.006288 -0.003598 -0.001006 -0.000797 0.000834 0.000464 
+-0.004729 0.004059 -0.002089 -0.006103 0.002906 -0.002179 
+0.001680 -0.000177 -0.001503 0.002949 0.001474 -0.004415 
+0.004166 0.001760 -0.005745 0.000086 0.003413 -0.003931 
+0.000804 0.002711 -0.000872 0.002157 0.001405 0.000278 
+0.000379 0.001459 -0.002851 0.002117 0.005401 -0.003493 
+0.003905 0.001751 -0.001929 0.003124 0.001695 -0.004154 
+0.001282 0.000621 -0.005419 0.001936 0.001877 -0.002966 
+-0.002047 -0.000588 -0.000906 -0.001813 -0.000753 -0.001372 
+0.000325 -0.001373 -0.001647 0.002262 -0.001609 -0.001111 
+0.000612 0.003048 0.000534 0.001044 0.003401 -0.000737 
+0.002255 0.001424 0.000182 0.002009 0.002133 -0.000481 
+0.000746 0.002120 -0.002249 -0.002332 0.000579 -0.001745 
+-0.003973 0.000094 0.001676 -0.003757 -0.000891 0.000552 
+-0.006084 -0.002333 0.001607 -0.007138 -0.006819 0.005213 
+-0.004032 -0.007419 0.006048 -0.001484 -0.003473 0.001515 
+0.000582 -0.000011 -0.002099 0.004646 -0.000103 -0.002478 
+0.003460 0.002111 -0.000284 0.001922 0.000928 -0.002893 
+0.000244 0.001192 0.001364 0.000338 -0.002668 0.001524 
+-0.000459 -0.009122 0.012863 0.002780 -0.009936 0.018933 
+0.002258 -0.001840 0.009031 0.003158 0.005671 -0.007135 
+0.000549 0.002728 -0.006449 -0.000225 0.000349 0.000480 
+-0.001396 -0.000249 0.003588 -0.000832 0.000101 0.002401 
+0.000655 0.000201 0.000579 0.000101 0.000018 0.000202 
+0.001037 -0.002209 -0.000335 -0.000735 -0.004487 0.001676 
+-0.000493 -0.001651 0.001706 -0.000098 0.001236 -0.001116 
+-0.001656 0.005067 -0.004435 -0.003047 0.009268 -0.003482 
+0.001204 0.009575 -0.004486 0.001482 0.003013 -0.005031 
+-0.000555 -0.000756 -0.001613 -0.002966 -0.001186 -0.001186 
+-0.002826 -0.000274 -0.001446 0.000378 -0.002645 0.001891 
+-0.003678 -0.001615 0.001825 -0.003562 -0.001160 -0.000640 
+-0.004624 -0.001178 -0.001838 -0.005040 0.000960 -0.004080 
+-0.000555 0.001479 0.000617 -0.000202 0.000262 0.000485 
+-0.000345 0.004569 -0.004224 0.004663 0.002416 -0.008428 
+0.006646 0.002214 -0.010091 0.006716 0.005597 -0.009328 
+0.006797 0.006539 -0.007667 0.005485 0.003549 -0.002698 
+-0.002576 -0.000637 0.001010 -0.010357 -0.005370 0.006960 
+-0.009581 -0.005756 0.008599 -0.001657 0.000663 0.003922 
+0.000153 0.004971 -0.003748 -0.000204 0.005953 -0.006138 
+-0.002665 0.005433 -0.006626 -0.004871 0.001498 -0.004580 
+0.002848 0.001739 0.000949 0.004654 0.001191 -0.004437 
+0.001934 0.001445 -0.001944 0.001186 0.000899 0.000162 
+0.002868 0.003721 -0.003566 0.005418 0.002504 -0.009318 
+0.000263 0.001826 -0.010447 0.005006 0.005409 -0.002260 
+0.000143 -0.002505 0.001391 -0.003345 -0.004902 0.005314 
+-0.005212 -0.003032 0.003649 -0.004657 -0.000024 0.001538 
+-0.000991 -0.000451 -0.000653 -0.000137 -0.002292 0.001261 
+0.000321 0.000925 -0.000094 0.002627 0.000175 -0.001332 
+0.002326 0.000681 -0.002126 0.000201 0.001032 0.000183 
+0.001390 0.000064 0.000293 0.002634 0.002467 -0.000780 
+0.002698 0.003361 -0.002827 0.000958 0.000430 -0.000812 
+-0.001339 -0.000981 0.002854 -0.001354 -0.001956 0.001183 
+-0.003500 0.000286 -0.000143 0.000566 -0.000045 -0.001045 
+0.000808 -0.001392 -0.003472 0.003547 -0.002054 -0.003502 
+0.002522 -0.003057 -0.004473 0.005328 0.000287 -0.005372 
+0.002744 0.002386 0.000477 0.000902 0.002167 0.000353 
+-0.000880 0.002740 0.004568 -0.001937 0.001607 0.003670 
+-0.000946 -0.002412 0.002331 -0.001239 -0.002124 0.001638 
+-0.002693 0.003674 -0.004988 -0.001459 0.004830 -0.005206 
+0.001112 0.002240 -0.003591 0.000158 -0.001235 -0.001365 
+-0.000529 -0.002784 -0.002725 0.000324 -0.004672 -0.004212 
+0.000728 -0.004152 -0.005172 0.000519 -0.002815 -0.004519 
+0.001244 -0.003083 -0.002465 -0.000138 -0.001246 -0.000245 
+-0.001585 -0.000362 0.000195 -0.000092 -0.000417 0.000334 
+-0.000595 -0.000698 -0.000794 0.001787 -0.000019 -0.000101 
+0.001280 0.000043 -0.000340 -0.000980 -0.000637 0.000580 
+-0.001587 -0.000740 0.001953 -0.001737 -0.001068 -0.000332 
+-0.003162 -0.002740 -0.001689 -0.000751 -0.005379 -0.002044 
+-0.001417 0.000032 -0.000078 -0.001501 0.003169 0.002935 
+-0.000705 0.003367 0.001825 -0.002772 0.002348 0.000042 
+-0.004414 -0.001283 0.000039 -0.004979 -0.001596 0.005806 
+-0.002893 0.000000 0.006694 0.001287 -0.003003 0.000569 
+0.001911 0.001485 -0.005931 0.003812 0.001726 -0.005872 
+0.003019 -0.001198 -0.001126 0.002417 -0.003842 -0.000965 
+0.004180 -0.002295 -0.002295 0.002784 0.002041 -0.001174 
+0.002054 0.001704 -0.000943 0.000668 0.000354 0.003388 
+0.001033 0.000382 0.001170 -0.001384 -0.001655 -0.002160 
+-0.001923 -0.003308 -0.004231 -0.004668 -0.001384 -0.001465 
+-0.000059 -0.000240 -0.000622 0.001212 0.000923 -0.000114 
+0.000032 0.001952 0.005794 0.000141 0.001950 0.004381 
+-0.000170 0.002908 -0.002795 0.001175 0.007197 -0.003613 
+0.003159 -0.001404 -0.007710 0.005142 0.001167 -0.003573 
+0.001595 -0.003351 0.000013 0.000846 -0.000455 -0.000037 
+0.001210 -0.004580 0.001814 -0.001101 -0.003184 0.002864 
+-0.000035 -0.001515 0.002951 0.000435 -0.003217 0.003279 
+-0.000580 -0.003366 0.003679 -0.000674 -0.001855 0.002636 
+-0.001677 -0.001199 0.001139 -0.001767 -0.002212 0.000305 
+-0.001081 -0.002667 0.001486 -0.003932 -0.001004 0.001305 
+-0.003984 -0.001857 0.002312 -0.004116 -0.001646 0.004677 
+-0.002663 -0.001970 0.004123 -0.000529 -0.000370 0.001439 
+0.000190 -0.000136 -0.000435 -0.001458 0.000105 -0.001715 
+-0.001619 -0.000558 0.000363 0.000913 -0.000633 0.000148 
+0.001317 -0.000523 0.001479 0.005840 -0.000943 -0.000568 
+0.000448 -0.000757 -0.003037 -0.003897 0.002465 -0.004109 
+-0.005018 0.001692 0.003516 0.001496 0.005044 0.008535 
+0.005560 0.010750 0.010316 0.003742 0.008004 0.007761 
+-0.004904 0.000488 -0.000006 0.000374 -0.000934 -0.002292 
+-0.000335 -0.001110 0.001793 -0.000689 -0.001835 0.002157 
+0.001542 -0.000421 0.002177 0.000586 -0.004124 -0.003125 
+-0.000901 -0.006611 -0.004341 -0.000990 -0.005942 -0.003643 
+0.000214 -0.002929 -0.002857 -0.001096 0.001501 -0.002136 
+-0.003654 0.004123 -0.001265 -0.000624 0.003712 -0.000238 
+-0.000625 -0.001085 -0.002499 0.001928 -0.004724 -0.000321 
+-0.001496 -0.004996 -0.000904 -0.004122 -0.003494 0.002002 
+-0.001294 -0.002736 -0.000249 -0.000333 -0.003417 0.001111 
+-0.001144 -0.004174 0.000317 -0.002630 -0.002034 -0.001578 
+-0.002933 0.001253 -0.000839 0.001053 0.001272 -0.000833 
+-0.000214 -0.001062 0.000447 0.000537 -0.002680 0.000891 
+0.000277 -0.000256 0.000180 -0.001520 0.000065 0.000136 
+-0.003849 -0.001117 0.002303 -0.005045 -0.004076 0.003958 
+-0.001142 -0.002611 0.003943 0.000762 -0.000241 0.000516 
+0.001687 0.000008 0.000385 0.001172 -0.002585 0.000085 
+0.000854 -0.001187 -0.001894 0.001855 0.004642 -0.001856 
+0.001329 0.004211 -0.005345 0.000205 -0.000079 -0.000801 
+-0.002757 -0.000898 -0.000395 -0.000196 -0.001811 -0.001804 
+-0.001532 -0.002808 -0.000887 -0.004479 -0.000521 0.001146 
+0.001810 0.001995 -0.002608 -0.001294 0.002994 0.000457 
+-0.000883 0.000514 -0.000570 0.000794 0.000379 0.002910 
+0.000401 0.003432 0.000915 -0.000574 0.004391 0.001234 
+-0.000111 0.002395 -0.002784 0.002794 0.001871 0.002173 
+0.001229 -0.000879 0.001345 -0.001203 0.000926 0.000667 
+-0.004152 -0.002346 0.000567 -0.000304 -0.005266 0.001114 
+-0.000776 -0.002175 0.001952 -0.000720 -0.000720 -0.001695 
+0.000442 -0.002620 -0.000536 0.000192 0.000614 -0.000627 
+0.001730 0.001467 -0.000278 0.000854 -0.000663 -0.001254 
+0.000049 -0.002031 -0.000739 -0.001164 -0.003239 0.000960 
+-0.002694 -0.002970 0.000551 -0.001286 -0.000577 0.002082 
+0.000053 0.001186 0.000990 0.000310 0.000293 -0.000034 
+-0.000175 -0.000036 -0.000019 -0.000417 -0.000290 0.003737 
+-0.000456 -0.002585 0.002998 0.000902 0.000045 0.001444 
+0.002211 0.000611 -0.000563 0.000379 -0.000275 -0.000963 
+0.000110 0.000146 -0.001428 -0.001174 -0.002274 -0.000856 
+0.000281 -0.002011 0.001363 -0.005138 0.000254 0.006442 
+-0.003111 0.003361 0.013690 -0.000163 0.000800 0.011763 
+-0.002942 0.000018 0.004319 0.000551 -0.001685 0.002199 
+-0.001114 -0.002071 0.005281 -0.003873 0.000137 0.004979 
+0.001202 -0.000349 0.000775 0.001527 0.000305 0.000840 
+0.002205 0.001122 0.000364 0.001557 -0.000009 -0.001225 
+-0.000156 -0.000244 -0.001294 -0.000459 -0.000682 -0.001453 
+0.000424 -0.000168 -0.000506 -0.001154 0.001942 -0.000244 
+-0.000590 0.001297 -0.001121 0.003297 -0.000341 -0.004887 
+0.000541 0.002644 -0.004542 -0.004153 0.000458 -0.002130 
+-0.005769 -0.001962 0.001962 -0.000908 -0.003056 0.003344 
+-0.001501 -0.000279 -0.002346 -0.003789 0.004876 -0.003100 
+-0.002239 0.006504 -0.002441 0.001563 0.001148 -0.006569 
+0.000531 -0.002358 -0.002974 0.000909 -0.002575 -0.001523 
+0.001584 -0.001283 -0.001433 0.001359 -0.000568 -0.000426 
+-0.001487 -0.002505 0.002440 -0.001807 -0.004653 0.006415 
+-0.003710 -0.003013 0.004639 0.001518 -0.000364 -0.000374 
+0.001145 -0.000981 -0.000100 -0.000848 -0.001348 -0.001637 
+-0.002542 0.001906 -0.002016 -0.001963 0.003363 0.002104 
+-0.003794 0.004120 0.002163 -0.001439 0.002000 0.004000 
+0.000169 0.000981 0.001856 0.001475 0.000042 -0.002087 
+-0.000242 -0.000484 -0.005242 0.002331 -0.001779 -0.006870 
+0.001038 -0.000814 0.000281 0.001079 0.000370 0.000177 
+-0.000915 -0.002214 0.003815 -0.001852 -0.004321 0.002977 
+-0.000310 -0.000317 0.003170 0.000490 0.000566 0.003170 
+0.006011 0.002770 -0.002028 0.002215 -0.000391 -0.005689 
+-0.001358 0.000819 -0.003391 -0.000796 0.000104 -0.000291 
+-0.002246 -0.002465 0.003759 -0.000802 -0.004010 0.001783 
+-0.000650 -0.000964 0.000886 -0.000015 -0.000464 -0.001252 
+-0.000025 -0.000477 0.000417 -0.000890 -0.000112 0.001672 
+0.000312 0.000241 -0.000331 0.002957 0.003086 -0.002127 
+0.005706 0.001146 -0.000485 0.004973 0.000614 -0.002546 
+0.001987 0.000696 -0.002386 -0.000319 0.000707 -0.000155 
+-0.001427 -0.002205 -0.000324 -0.002779 -0.001699 -0.000338 
+-0.003016 0.000579 0.001351 -0.003446 -0.000579 0.005183 
+-0.002548 0.000082 -0.000215 0.001036 0.003228 -0.000015 
+0.003131 0.003375 -0.000383 0.003538 0.000715 -0.002146 
+0.000155 -0.001471 -0.000882 -0.003148 -0.001168 0.000091 
+-0.002847 0.000890 0.000229 -0.000142 0.000148 -0.000030 
+0.000255 -0.003580 0.000569 -0.002499 -0.001033 0.001568 
+0.000443 -0.000041 0.001105 0.001844 -0.000981 0.001647 
+-0.001829 -0.007914 0.004713 -0.008681 -0.001769 0.004822 
+-0.001480 0.000476 0.001750 0.003110 0.003516 -0.005679 
+0.004470 0.003231 -0.005654 0.002067 0.001034 -0.002584 
+0.001790 -0.000066 -0.000944 -0.000274 -0.001134 -0.007316 
+0.001855 0.000593 -0.012317 -0.000058 -0.002172 -0.001145 
+0.000918 -0.000501 0.001014 0.001278 0.001271 0.003822 
+0.001905 0.000384 0.001572 0.000509 0.001562 -0.002287 
+-0.001732 0.002854 -0.002422 -0.001308 0.006285 -0.003363 
+-0.000970 0.008433 -0.006922 -0.002456 0.003794 -0.007245 
+0.002667 -0.000639 -0.003626 0.000525 0.000126 -0.004979 
+-0.001168 0.001581 -0.005355 0.000956 0.004927 -0.006542 
+0.003577 0.002299 -0.004854 0.002752 0.000093 -0.001008 
+0.001296 0.001823 0.002706 0.001224 0.003512 0.004070 
+-0.002927 0.000976 0.004390 -0.000725 -0.000851 -0.000728 
+0.001705 -0.000865 0.000102 0.002885 0.004154 -0.000577 
+-0.002693 0.002241 -0.002462 -0.004247 -0.001605 0.002541 
+-0.000304 -0.005777 0.003243 -0.003985 -0.000640 -0.000457 
+-0.006490 -0.003720 0.000818 -0.003256 -0.006589 0.002171 
+0.002502 -0.001636 -0.002983 0.001401 -0.001682 -0.006210 
+0.000726 -0.000583 -0.001024 0.001596 0.001590 0.000955 
+0.002000 0.002609 -0.000127 -0.000392 0.000200 0.000144 
+-0.005622 -0.001297 0.001731 -0.000989 -0.004704 0.005815 
+0.000089 -0.000727 0.001825 0.005319 0.002701 -0.005354 
+0.006360 0.006360 0.000000 0.004118 0.004047 -0.005709 
+0.000312 0.003768 -0.001005 -0.001174 0.003686 0.000530 
+-0.001398 0.001156 -0.001828 -0.001202 -0.000342 0.000900 
+-0.001210 -0.001355 0.004633 -0.002257 -0.003322 -0.002209 
+-0.000685 -0.003885 -0.000762 -0.000253 0.000844 -0.001680 
+-0.000533 0.001059 0.001284 0.002754 0.001124 0.000772 
+0.000581 0.000299 0.000846 -0.001254 -0.005244 0.001687 
+0.001404 -0.003689 -0.002373 0.002468 -0.000648 -0.001659 
+0.003790 0.001923 -0.001703 -0.000600 0.003328 0.001130 
+-0.000353 0.000890 0.000327 -0.000065 -0.002341 -0.001196 
+0.001530 -0.003561 -0.000306 0.003944 0.001062 -0.005992 
+0.005591 0.005780 0.001445 -0.000123 0.002973 0.002071 
+0.003846 0.005608 0.001869 0.001612 0.005504 -0.004837 
+0.004921 0.002748 -0.001683 0.003283 0.000836 0.000174 
+0.000325 0.000130 0.000574 -0.002820 -0.000989 -0.000454 
+-0.002672 -0.000755 -0.002284 -0.002274 0.001978 -0.000047 
+-0.000945 0.001260 -0.000945 0.002030 -0.002846 -0.002683 
+0.002633 -0.000604 -0.004920 0.000346 -0.001125 -0.000650 
+0.003339 -0.001041 0.000873 0.007383 -0.001924 -0.000870 
+0.009359 0.001063 -0.005790 0.003200 0.001070 -0.008362 
+-0.002259 0.002844 -0.005569 -0.002825 0.002424 -0.002016 
+0.002222 -0.000278 -0.003186 0.002334 0.002834 -0.001862 
+0.001191 0.003881 -0.002232 0.001308 0.005106 -0.003004 
+0.001615 0.004125 -0.002372 -0.000418 -0.000011 0.000028 
+-0.002871 -0.005287 0.001127 -0.003247 -0.004631 0.000663 
+0.000569 0.001453 -0.004171 0.008163 0.003176 -0.004987 
+0.007317 0.002380 -0.005295 0.004019 0.000861 -0.002846 
+0.001374 -0.000312 -0.001454 -0.001371 0.002534 -0.001330 
+-0.001237 -0.000402 -0.003158 -0.000391 -0.001700 -0.001247 
+0.002991 0.000893 -0.000805 0.002995 0.005028 -0.005067 
+-0.000669 0.004862 -0.005576 0.000910 0.003640 0.001026 
+0.000328 -0.003948 0.002620 0.001890 -0.005060 0.001556 
+-0.002114 -0.006010 0.003114 -0.000027 -0.003071 -0.000201 
+-0.000606 -0.001930 -0.004153 -0.000517 0.000345 -0.003879 
+0.000736 0.000828 0.001012 0.001104 -0.000008 -0.000254 
+0.001795 0.002091 -0.000259 -0.000708 -0.000559 -0.000760 
+-0.000031 -0.000334 0.000488 -0.000399 -0.003825 0.005021 
+-0.006688 -0.005966 0.001901 -0.002465 -0.001708 -0.001261 
+0.000384 0.003003 -0.001964 0.003222 0.002700 -0.001143 
+0.002963 0.001628 -0.000095 -0.001543 0.000985 -0.000197 
+-0.002205 0.003929 -0.002968 -0.000449 0.002405 -0.001806 
+0.001556 -0.000523 -0.000651 0.001163 -0.002539 -0.000822 
+0.000710 -0.000691 -0.001055 0.001217 0.001977 0.000240 
+0.002451 0.002741 0.000806 0.002145 0.003111 -0.000390 
+0.000646 0.002365 0.000082 -0.000084 -0.000109 0.000386 
+-0.001258 -0.001251 -0.001231 0.001184 -0.001735 -0.002524 
+-0.000769 0.000161 -0.000968 -0.001324 0.001724 0.001117 
+0.001236 0.000600 0.001691 0.000390 -0.001604 -0.000860 
+0.001571 -0.001896 -0.001029 0.002237 0.004097 -0.001489 
+-0.001115 0.002615 0.000808 0.004638 0.001835 0.002974 
+0.001208 0.003157 -0.001275 -0.000912 0.000616 0.001080 
+-0.000865 -0.000090 0.002543 -0.003273 0.000589 0.005141 
+-0.006884 0.000683 0.007467 -0.009237 -0.002323 0.007077 
+-0.001730 0.001475 -0.002018 -0.002756 0.003150 -0.001181 
+0.005418 0.001057 -0.007004 0.007338 -0.002752 -0.001840 
+0.001016 -0.000484 0.005733 0.002956 -0.001162 0.005731 
+-0.000960 0.000960 -0.000426 -0.002972 0.000710 0.002475 
+-0.001685 0.000094 0.001890 -0.003642 0.001161 0.001153 
+-0.004380 0.001349 -0.001953 -0.004313 -0.002852 -0.001545 
+-0.003234 -0.002815 0.001345 0.001941 -0.000353 -0.001250 
+0.003645 -0.003487 -0.000337 0.005954 -0.002481 -0.000165 
+0.003872 -0.003190 -0.002151 0.002446 -0.002868 -0.000532 
+0.001476 -0.001578 0.000553 -0.001031 -0.000871 0.000009 
+-0.002092 -0.002736 -0.005789 0.002459 -0.001722 -0.002950 
+-0.005341 0.001734 -0.002133 -0.005316 -0.002728 0.000462 
+-0.003121 -0.002520 -0.001783 -0.000998 -0.003745 -0.005822 
+0.002057 -0.002914 -0.007113 0.000188 -0.003106 -0.002416 
+-0.001553 -0.002942 0.003228 -0.003379 -0.001637 0.003205 
+-0.001319 0.001676 0.001769 -0.002507 0.002881 -0.002726 
+-0.000528 0.004712 -0.002808 -0.004459 0.000696 0.000780 
+-0.006375 -0.000053 -0.002260 -0.004151 -0.003838 -0.001220 
+-0.001996 -0.002229 0.001600 0.001933 0.001379 -0.001494 
+0.000552 0.000981 -0.000614 0.000609 -0.000534 -0.003429 
+0.002217 0.002590 -0.003205 0.004118 0.001260 -0.001143 
+0.003281 0.000981 0.001245 0.000226 -0.001278 0.000075 
+-0.003669 0.001467 0.001429 -0.002774 0.001425 -0.001349 
+0.002116 0.002131 0.000149 0.005474 0.001788 0.000440 
+0.000357 0.001440 0.000292 -0.001449 0.003622 -0.004454 
+0.000960 0.004348 -0.001280 0.000275 0.000266 -0.000805 
+0.000776 -0.003952 0.002176 -0.001571 -0.005592 0.001136 
+-0.004087 -0.003719 0.005579 0.001759 -0.001835 0.001147 
+0.002280 0.000733 0.002287 0.005265 0.003393 -0.000761 
+0.000402 0.002385 -0.002653 -0.000283 0.002664 0.002527 
+-0.002992 0.000327 0.000877 -0.001592 -0.000851 -0.001992 
+-0.000740 -0.001781 -0.002034 -0.000619 0.000238 -0.000286 
+0.001905 0.002560 -0.000783 0.002728 0.001776 -0.003212 
+0.003726 0.001803 -0.003125 0.002685 -0.002089 0.000605 
+-0.000204 -0.001213 0.001139 0.000455 0.000822 0.000213 
+-0.000723 0.001564 0.000434 -0.002278 0.002051 -0.000700 
+-0.002918 0.001756 0.000600 -0.004717 0.001750 0.004278 
+-0.009321 -0.000781 0.007963 -0.004257 -0.005265 0.004069 
+-0.000312 0.001790 -0.000926 0.001101 0.003098 0.000327 
+0.005939 -0.003774 -0.003829 0.005755 -0.002055 0.000756 
+-0.002113 -0.001096 0.004851 -0.002053 0.000180 0.005697 
+-0.005670 0.001153 0.004575 -0.004960 0.006027 0.002115 
+-0.002947 0.001089 0.003737 0.000042 -0.001119 0.002179 
+0.001264 -0.000809 -0.002109 0.000759 -0.000632 -0.000751 
+-0.002841 0.001262 0.001158 -0.003651 -0.000018 0.000012 
+0.000897 -0.002270 0.001509 0.003776 -0.003771 0.003775 
+0.001673 -0.002256 0.003326 0.000958 0.002567 -0.002481 
+0.003052 0.006434 -0.001588 -0.002269 0.004163 -0.002540 
+-0.001681 0.000013 -0.007403 0.000557 -0.001455 -0.004979 
+-0.000301 -0.001370 -0.000468 -0.001873 -0.002506 0.001848 
+-0.006218 -0.001880 0.000867 -0.002121 0.000379 -0.003485 
+-0.000593 0.000756 -0.005289 0.000558 -0.000418 -0.003864 
+0.000596 -0.000496 0.001738 -0.006393 -0.003279 0.006557 
+0.000113 0.000975 0.002290 -0.001363 -0.002503 -0.001180 
+-0.000444 0.000506 -0.002467 -0.001173 0.000902 0.000361 
+-0.002239 0.004511 0.000519 -0.002537 0.004348 -0.000815 
+-0.000066 0.003215 -0.001030 0.000627 0.002509 -0.001257 
+0.001461 -0.000398 -0.004219 0.004625 0.002250 -0.007604 
+0.003858 0.002047 -0.005709 0.002954 -0.000773 0.000865 
+0.002040 0.001127 0.004351 0.001086 0.000435 0.004270 
+0.002210 0.001921 0.003885 0.003585 0.003528 0.002106 
+0.000501 0.001459 -0.000341 0.003411 0.000279 -0.000093 
+0.000780 0.000722 0.000643 -0.003177 -0.002017 -0.000706 
+-0.003868 -0.001389 0.001208 -0.000307 -0.001665 0.000908 
+0.001225 0.000600 0.000237 -0.001391 0.001301 -0.000380 
+-0.002547 0.001646 -0.000838 -0.002035 -0.001057 -0.004450 
+0.002023 -0.003263 -0.001762 0.003583 -0.000435 -0.002261 
+0.001516 0.000411 -0.000371 -0.001081 0.000222 -0.001475 
+-0.003609 0.000007 -0.002701 -0.004154 -0.001962 -0.001962 
+-0.004154 -0.002308 -0.002000 -0.003697 -0.004253 0.001868 
+-0.001007 -0.002567 0.001436 0.002599 0.000465 -0.000470 
+0.004240 0.000423 0.001554 0.001481 -0.002760 0.004577 
+-0.001405 -0.004169 0.000584 0.000630 0.002464 0.000430 
+-0.000340 0.008540 0.001227 -0.003372 0.008841 0.000562 
+-0.003205 0.003610 0.000121 -0.000669 0.000222 0.001101 
+-0.000853 -0.000593 -0.001574 -0.000072 0.003008 -0.006396 
+-0.000254 0.004071 -0.005042 0.004548 0.000556 -0.002087 
+0.002914 -0.003508 0.000378 0.000000 0.000000 0.001171 
+-0.001354 -0.002421 0.001559 0.000861 0.000164 -0.000861 
+0.003613 -0.000332 -0.001479 0.001379 -0.003218 -0.003016 
+0.003397 -0.003385 -0.004156 0.004458 -0.002561 -0.006046 
+0.005957 -0.002377 -0.007160 0.008002 0.001842 -0.005634 
+0.005742 0.000612 -0.004162 0.002908 -0.000494 -0.001801 
+0.002821 -0.002812 -0.001686 0.002255 -0.008725 0.001274 
+-0.002095 -0.005894 0.003829 -0.002330 -0.001255 -0.000370 
+0.000382 -0.001553 -0.001377 0.001524 -0.002989 -0.000073 
+0.001906 -0.000767 0.002152 0.005606 0.003723 0.001194 
+0.006121 0.002142 0.000937 0.002402 0.001307 -0.000555 
+0.001287 -0.001213 -0.001912 -0.002495 0.001027 -0.004513 
+-0.001037 0.000820 -0.006332 0.000018 -0.001349 -0.003886 
+-0.001433 -0.001350 0.002782 -0.005117 -0.002974 -0.001815 
+-0.007480 -0.000397 0.000348 -0.003878 0.000121 -0.000484 
+-0.001786 -0.001806 -0.000494 -0.000784 -0.001763 -0.002000 
+0.001713 -0.000282 -0.000771 0.000005 0.000043 0.000049 
+-0.000892 0.000358 -0.000400 -0.001923 0.000811 -0.003897 
+0.000042 0.000300 0.000455 0.001516 -0.000438 -0.001490 
+0.001307 0.000420 -0.001148 -0.000328 -0.001234 0.001534 
+0.000366 -0.003244 0.005415 -0.000811 -0.001105 0.008092 
+-0.000658 0.001142 0.005599 0.001350 0.000214 0.002634 
+0.001976 -0.000892 0.001021 0.000963 -0.001346 0.002110 
+0.000569 -0.002179 0.000972 -0.001791 -0.004429 -0.000210 
+-0.003662 -0.005040 -0.001211 -0.001698 -0.001587 -0.000530 
+0.002352 0.003920 -0.001120 0.000013 0.003012 -0.002563 
+-0.001676 0.001856 -0.001436 -0.003885 -0.000777 -0.003108 
+-0.001511 0.001559 -0.002993 -0.001168 0.001314 -0.002250 
+0.004207 0.001608 -0.003090 0.002715 0.001666 -0.003400 
+0.000487 -0.002238 -0.002097 -0.003499 -0.003939 -0.000938 
+-0.007400 -0.001175 0.000900 -0.007939 -0.004453 0.006098 
+-0.008326 -0.000979 0.001024 -0.004651 0.002896 0.001737 
+-0.000916 0.000531 0.000007 0.000257 -0.002163 -0.000619 
+0.002511 -0.001460 -0.000081 0.003644 0.002046 0.000747 
+0.003349 0.004154 0.000267 0.002629 0.002241 0.001545 
+0.001074 -0.003546 0.006773 -0.005264 -0.005180 0.012823 
+0.002522 -0.002467 0.006497 0.000088 -0.002274 0.001217 
+-0.000374 -0.000517 0.000178 -0.003377 -0.000950 0.001204 
+-0.004850 -0.003138 -0.003994 -0.003345 -0.000941 0.003188 
+0.001059 -0.000601 -0.000940 0.002421 -0.001216 -0.002585 
+0.003485 0.000387 -0.002137 0.001032 -0.003846 -0.003565 
+0.002418 -0.006319 -0.001040 -0.000096 -0.006683 0.000558 
+-0.003439 -0.001531 0.000444 -0.000478 -0.002529 0.003101 
+0.000667 -0.000667 0.000381 0.008546 0.000674 -0.006794 
+0.004559 0.004058 -0.007585 0.002328 0.001897 -0.004147 
+0.000630 0.001551 -0.002256 0.001240 0.000441 -0.003428 
+0.003940 -0.002463 -0.004975 0.004690 -0.003737 -0.001929 
+0.004166 -0.000300 0.000360 0.003968 -0.000800 0.002395 
+0.003146 0.001657 0.002364 0.001322 -0.000409 -0.003520 
+0.002516 -0.002373 -0.007055 0.004623 -0.001489 -0.001998 
+0.001050 0.000587 -0.000082 -0.003027 -0.002438 0.003818 
+-0.007755 -0.006687 0.006068 0.000891 -0.002651 0.000012 
+-0.005985 -0.000243 0.004771 -0.000279 -0.000517 -0.000111 
+-0.001730 -0.002374 -0.002161 0.006474 0.001913 -0.006769 
+0.002548 -0.002948 -0.010248 0.001008 -0.002278 -0.004593 
+-0.000472 -0.000225 -0.000077 -0.000032 0.000887 -0.000012 
+-0.000845 -0.002545 -0.001890 -0.002516 0.000638 -0.002258 
+-0.002793 -0.000422 -0.002451 -0.001193 0.004387 -0.002625 
+-0.000329 0.003958 0.002246 -0.002508 0.002563 0.006938 
+-0.002310 0.002811 0.004286 -0.001129 -0.000121 -0.000103 
+-0.000735 -0.000114 -0.003366 -0.002204 -0.002289 -0.000144 
+0.000241 -0.006505 -0.000458 0.000178 -0.006392 -0.001952 
+-0.002449 -0.003415 -0.001740 0.000542 0.000327 -0.000075 
+0.000861 -0.001385 -0.000389 -0.001244 -0.003159 0.001471 
+-0.001760 -0.001012 0.001001 0.002030 -0.000677 0.002030 
+0.000326 0.001174 0.001752 -0.001123 0.001773 -0.003130 
+-0.000206 0.005579 -0.006250 -0.003954 0.002014 -0.008411 
+0.002955 0.002258 -0.004648 0.004690 0.002148 -0.000949 
+0.003628 0.000556 0.002119 -0.000278 -0.000042 -0.000259 
+-0.001593 -0.003174 -0.001598 0.000406 -0.001235 -0.000152 
+-0.001329 -0.002005 0.000676 0.004667 0.000519 -0.004667 
+-0.000290 -0.001646 -0.002566 0.000171 0.000270 -0.001780 
+-0.001925 -0.001831 0.001768 -0.000449 -0.002867 0.003358 
+-0.000080 -0.002204 0.004205 -0.001943 -0.001628 0.005234 
+-0.002604 0.000551 0.006413 0.000782 0.002398 0.006874 
+0.001660 0.001665 0.007061 -0.000773 0.001290 0.004368 
+-0.002135 0.001787 -0.000129 -0.003604 0.000739 -0.002852 
+-0.002494 -0.000268 -0.002769 -0.000928 -0.001148 -0.000369 
+-0.000751 -0.000605 0.001690 -0.000264 -0.000175 0.001248 
+0.000574 -0.002119 0.001103 -0.001052 0.000066 0.003611 
+-0.008105 -0.003842 0.002842 -0.002711 -0.003836 0.003294 
+0.004101 0.002065 -0.001297 0.010113 -0.000946 -0.004134 
+-0.003039 0.001032 -0.003134 0.000593 0.005932 -0.003866 
+-0.000025 0.002601 0.003592 -0.000310 0.002621 0.001910 
+-0.000531 -0.000487 -0.000119 0.000691 -0.002035 -0.002637 
+-0.000426 -0.001914 -0.000616 -0.003853 -0.001373 0.003461 
+0.000372 -0.001757 0.002062 0.000887 0.001592 -0.001970 
+0.004916 0.001405 -0.006536 0.003477 -0.000704 -0.003615 
+0.000483 -0.001916 0.002950 -0.005295 -0.001709 0.004240 
+-0.003320 -0.006149 0.007229 0.002391 -0.005511 0.007361 
+-0.000367 0.001833 0.001100 0.000847 -0.000137 0.002960 
+-0.000273 0.006824 -0.004543 0.004703 0.009436 -0.011314 
+-0.004773 0.000703 -0.010036 0.000855 0.001336 -0.000206 
+0.000174 0.000891 -0.000236 0.001629 0.003330 0.000189 
+-0.001561 0.001357 -0.000687 0.000401 0.002278 -0.002489 
+-0.000087 0.000776 -0.002105 -0.002420 0.001632 0.000405 
+-0.004229 0.003317 0.001223 -0.000899 0.005886 -0.000652 
+-0.001131 0.005390 -0.002341 0.002208 0.003223 -0.003274 
+0.002960 0.000611 0.002901 0.000659 -0.004277 0.003039 
+-0.000628 -0.006506 0.001073 0.001295 -0.004380 -0.000166 
+0.002792 -0.001606 0.000651 0.000020 0.000453 0.001850 
+-0.000367 -0.000125 -0.000108 0.000461 0.000274 -0.002234 
+0.001473 -0.001395 -0.002868 0.000986 -0.002878 -0.001115 
+0.001960 -0.002825 0.002296 -0.001840 -0.001136 0.006233 
+-0.004272 -0.002738 -0.003526 -0.001728 0.000551 -0.005284 
+0.001248 -0.000318 -0.005276 0.005193 0.005337 -0.000259 
+0.003855 0.004755 0.000643 -0.000452 0.000762 0.000357 
+-0.003796 -0.000438 -0.003222 -0.004712 0.000172 -0.004270 
+-0.003539 -0.000499 -0.004448 -0.002302 -0.003456 -0.003480 
+-0.000212 -0.002369 -0.003863 -0.001511 -0.000884 -0.002583 
+-0.000398 0.000867 0.001327 -0.000407 0.003297 0.002973 
+-0.000260 0.004745 0.001982 -0.000206 0.004112 -0.001892 
+-0.000343 0.000404 -0.002170 0.000258 0.000028 -0.000450 
+0.000273 -0.000006 0.000263 -0.000500 0.001362 0.000544 
+0.002142 0.001664 0.001764 -0.001905 -0.000951 0.000298 
+-0.006635 -0.006474 0.003433 -0.006138 -0.005383 0.005339 
+-0.000421 -0.000605 0.001079 0.004348 -0.002210 -0.003540 
+0.001564 -0.003367 -0.000116 0.000886 -0.000429 -0.000062 
+-0.005004 -0.005529 0.005494 0.000323 -0.003121 0.002905 
+0.000224 -0.001120 -0.002577 0.003355 -0.001017 -0.003891 
+0.004425 -0.000632 -0.002203 -0.000897 -0.003083 0.001495 
+0.000134 -0.006322 0.006523 -0.000839 -0.006644 0.003243 
+-0.000756 -0.002469 0.001053 0.001467 -0.000441 -0.001320 
+0.000935 -0.000758 -0.001985 0.000034 -0.001204 -0.000794 
+0.000762 0.002056 -0.001083 0.005239 0.001563 -0.005330 
+0.006521 0.001077 -0.005628 0.003802 -0.001849 -0.003446 
+0.000651 -0.002855 -0.001703 0.003536 -0.003189 0.004402 
+0.000357 -0.005294 0.007676 -0.000681 -0.004492 0.005008 
+-0.003342 0.001114 -0.002352 0.000664 0.006637 -0.010618 
+0.004006 0.011961 -0.007955 0.003639 0.006444 -0.002806 
+-0.000716 -0.000193 0.000551 -0.005273 0.001184 0.000576 
+-0.002361 0.005449 -0.003505 -0.001951 0.007073 -0.006585 
+0.005029 0.002075 -0.005108 0.004475 0.001549 -0.006396 
+0.001099 0.001096 -0.001213 -0.003141 0.001486 0.000069 
+-0.001835 0.003917 0.000245 -0.000899 0.003855 0.000231 
+0.004736 0.001551 -0.007673 0.002028 -0.000670 -0.002456 
+0.002737 -0.002875 0.001686 0.001149 -0.000232 0.002876 
+0.003095 0.004456 -0.000858 0.001850 0.004669 -0.000665 
+0.001070 -0.001331 0.000284 0.001391 -0.001353 -0.002165 
+0.001128 0.002545 -0.001558 0.001201 0.004837 -0.002431 
+0.003148 0.000377 -0.001990 -0.000465 -0.001621 -0.000850 
+-0.001109 -0.002062 -0.000776 -0.001299 -0.000543 0.000205 
+-0.000308 0.000219 0.000027 -0.000058 -0.000262 -0.001024 
+0.001432 -0.000116 -0.003322 0.004876 0.001048 -0.003053 
+0.006024 -0.000647 -0.002649 0.005717 -0.001253 -0.001341 
+0.002907 0.000194 -0.000698 0.000595 0.002906 -0.004294 
+-0.004390 -0.001184 0.000801 0.001589 -0.000234 -0.003531 
+-0.000227 -0.000108 -0.005316 0.002947 -0.001625 -0.000642 
+-0.000783 0.002572 0.000031 -0.001946 0.004276 0.002735 
+-0.003087 0.003018 0.002969 -0.002053 0.000207 0.000274 
+-0.002623 -0.000997 -0.000964 -0.000471 -0.002621 -0.000227 
+0.001008 -0.000371 0.000237 0.001560 -0.000798 0.000662 
+0.001723 -0.002491 -0.001024 0.003811 -0.000236 -0.004205 
+-0.001070 -0.001827 -0.001432 -0.004082 -0.001360 0.000152 
+-0.003966 0.000621 -0.000207 0.000841 0.003246 -0.002464 
+0.003762 0.000689 -0.004640 0.002547 -0.002727 -0.002337 
+0.000600 -0.002856 -0.001417 0.000527 -0.002877 -0.000767 
+0.001762 -0.001762 -0.000820 0.000969 -0.001987 -0.000534 
+0.000431 -0.001572 -0.001048 0.000359 -0.001704 -0.000830 
+0.001004 -0.001135 -0.000015 -0.001798 0.000227 -0.000032 
+-0.004316 0.000415 0.000920 -0.002305 0.000714 0.001646 
+0.000505 0.000748 -0.001410 0.001600 -0.000975 -0.003278 
+0.000335 -0.005238 -0.000805 -0.005372 -0.009547 0.001197 
+-0.004083 -0.009137 0.000897 -0.000810 -0.003499 -0.002267 
+0.002507 0.000149 -0.001236 0.000306 -0.000057 0.003030 
+-0.002697 -0.000718 0.007190 -0.003294 -0.003100 0.003876 
+-0.001667 0.002500 -0.004167 0.000105 0.009280 -0.007564 
+0.002927 0.007801 -0.004458 0.004731 -0.000301 -0.005763 
+0.005914 -0.001223 -0.003030 0.000824 0.001911 -0.000362 
+-0.002116 0.000026 -0.004339 -0.006726 0.000182 -0.001271 
+0.004976 0.000433 -0.004934 0.003620 0.000218 -0.001222 
+-0.000500 -0.000077 -0.000123 -0.002776 0.001074 0.000375 
+0.001005 0.004256 -0.002559 0.002391 -0.001652 -0.006412 
+0.004343 -0.000925 -0.001530 0.000106 -0.001298 -0.000289 
+-0.000753 -0.000120 0.000643 0.001471 0.004092 -0.001794 
+0.001779 0.007918 -0.003214 0.001118 0.005942 -0.001578 
+-0.000205 -0.001336 0.000023 -0.000800 -0.006748 0.001878 
+0.000063 -0.005331 0.001438 0.001795 0.002222 0.000684 
+0.005769 0.006281 -0.004916 0.006070 0.005040 -0.002207 
+0.001652 0.002093 -0.002049 -0.000893 -0.000021 0.000416 
+-0.000247 0.000259 0.000664 0.000396 -0.000508 -0.000122 
+0.000165 -0.000831 -0.000751 0.003152 -0.001083 -0.002141 
+0.004219 -0.000723 -0.003683 0.005031 -0.000933 -0.002824 
+0.002222 -0.001792 -0.003074 -0.002424 0.000427 -0.003989 
+-0.003248 0.001704 -0.000294 0.000587 0.000394 -0.001600 
+0.000000 0.001597 -0.004167 0.002670 0.001780 -0.004444 
+-0.000511 0.001022 -0.002996 -0.000118 -0.000748 -0.001452 
+-0.000091 -0.000357 -0.000942 -0.003508 -0.001250 -0.001204 
+-0.000047 -0.000921 -0.001806 -0.000524 0.000954 -0.000587 
+-0.001126 0.001093 0.002298 0.000266 0.000434 0.004001 
+0.003134 0.000799 0.001892 0.004731 -0.000460 0.000762 
+0.004618 -0.000160 -0.001093 0.001050 0.000875 -0.000389 
+-0.000180 0.001399 0.000399 -0.001644 0.002689 -0.002986 
+0.000986 0.003261 -0.002243 0.000131 -0.000880 -0.000209 
+0.002276 -0.002503 0.001428 0.001562 0.000610 0.001819 
+0.003150 -0.001473 -0.001055 -0.000765 0.000278 -0.000300 
+-0.000214 -0.000357 -0.000071 0.001335 -0.002048 -0.002423 
+0.000161 -0.002162 -0.002851 -0.000230 -0.000781 -0.000582 
+0.000305 0.001438 0.000583 0.000860 0.003352 -0.000927 
+0.000745 0.002635 -0.005365 0.004592 0.001984 -0.006680 
+0.005189 -0.001196 -0.003073 0.002034 -0.003895 -0.003582 
+0.000366 -0.004404 -0.004433 -0.000774 -0.003280 -0.002481 
+-0.000787 -0.000945 -0.000079 -0.004425 -0.001330 0.000911 
+-0.006604 -0.001980 0.000942 -0.003985 -0.000996 -0.001163 
+-0.000365 0.001251 -0.002060 0.001032 0.001746 -0.000635 
+-0.000316 -0.002055 0.000790 -0.000738 -0.001059 0.001589 
+-0.000231 0.000777 -0.002405 0.001147 0.007792 -0.004351 
+-0.001233 0.008760 -0.003698 0.004141 0.003649 -0.004634 
+0.007017 0.001898 -0.004435 0.006857 0.002286 -0.001714 
+0.001594 -0.002755 -0.000676 -0.001501 -0.006044 0.001475 
+-0.001793 -0.004879 0.003801 -0.004030 -0.002696 0.000014 
+0.001124 0.000098 -0.001650 0.004193 0.001347 -0.001938 
+0.002128 -0.001128 -0.000923 0.000412 -0.000240 -0.003813 
+0.001768 -0.000951 -0.002485 0.001524 -0.001783 -0.002486 
+0.000734 -0.000355 -0.002196 -0.000332 -0.000458 -0.000147 
+0.000702 0.000247 0.000721 0.000371 -0.000668 -0.001453 
+0.006528 0.003901 -0.006095 0.005013 0.001372 -0.000776 
+-0.001825 -0.000912 -0.000192 -0.003889 -0.003178 0.000454 
+-0.000861 -0.001347 0.002575 -0.000063 -0.000119 -0.000986 
+0.000690 0.002368 -0.002897 0.001667 0.000791 -0.002610 
+0.000999 0.000037 -0.000433 0.000061 -0.000754 -0.001448 
+0.000009 0.000562 -0.003938 -0.000201 0.002254 -0.004147 
+-0.001432 0.000101 -0.001206 -0.000285 -0.002561 0.000115 
+-0.000190 -0.001934 0.000509 -0.000588 0.000359 -0.000359 
+-0.000025 0.001204 -0.002958 -0.000114 0.003133 -0.004943 
+0.000838 0.005376 -0.007011 -0.002173 0.001981 -0.004364 
+-0.000642 0.000126 -0.002771 0.000137 -0.000695 -0.000846 
+-0.003312 0.001227 0.002208 0.000175 0.000456 0.000667 
+-0.000753 0.000983 0.001408 0.004484 0.002227 -0.000733 
+0.000844 -0.000112 -0.000169 -0.001110 -0.001703 0.005576 
+0.000561 -0.001050 0.002876 -0.000421 0.001684 -0.000917 
+0.002150 0.003543 0.000443 -0.000086 0.001376 -0.000023 
+-0.001539 -0.002865 0.000858 0.000589 -0.001138 0.001183 
+0.003748 -0.000375 -0.005357 0.002339 -0.002883 0.000213 
+0.001079 -0.000362 -0.000276 0.001382 0.002334 -0.001663 
+0.003569 0.003394 -0.006020 0.004084 0.002790 -0.007884 
+0.005582 0.000742 -0.003347 0.001753 0.001005 -0.002582 
+0.001951 0.002512 -0.001786 0.002639 0.001832 -0.002525 
+-0.005439 0.000275 -0.002266 -0.003800 -0.000760 -0.005066 
+-0.001487 0.000751 -0.000786 0.000561 0.000448 0.001537 
+0.001931 0.002389 -0.001293 -0.000622 0.001710 -0.005041 
+-0.001250 0.000657 -0.006568 -0.000702 -0.000225 -0.004520 
+-0.000455 -0.001362 -0.001355 -0.000396 -0.001466 -0.001941 
+0.002108 -0.001176 -0.004549 0.004140 -0.001330 -0.000684 
+0.000052 0.001629 -0.001189 0.000374 0.001282 -0.002037 
+0.000946 0.000630 -0.003779 0.000562 -0.000842 -0.003460 
+0.004085 0.000237 -0.000957 0.000406 -0.000442 0.000972 
+-0.000850 -0.002438 0.001002 -0.001200 -0.001171 0.000942 
+0.000591 0.000319 -0.001236 0.000824 0.001441 -0.003308 
+0.003118 0.000245 -0.000697 0.003543 -0.002620 -0.001271 
+0.003791 -0.002531 -0.001371 0.000987 -0.001908 -0.000395 
+0.001483 0.003647 -0.002403 0.002474 0.002565 -0.000909 
+0.000685 0.000172 0.000455 0.000874 -0.000368 0.000465 
+0.002717 0.001059 -0.000957 0.002049 0.002069 0.000207 
+-0.001244 0.000570 -0.000023 -0.002229 -0.000878 -0.000434 
+0.000090 -0.000250 -0.000859 0.000093 0.001300 -0.000370 
+0.000899 0.000160 0.000806 -0.000413 -0.002952 0.000349 
+-0.000105 -0.004182 0.001621 0.002049 -0.001727 0.000587 
+0.002020 0.002720 -0.000820 0.000060 0.003095 -0.003966 
+0.000597 0.001944 -0.005542 0.000000 0.002308 -0.005874 
+0.002585 0.001421 -0.005214 0.000047 -0.001438 -0.003060 
+0.001613 -0.003868 -0.000073 0.000809 -0.001692 -0.001288 
+0.001331 -0.003798 0.003619 -0.000004 0.000513 0.000601 
+0.002938 0.006309 -0.006370 -0.003334 0.001842 -0.007170 
+-0.001465 0.003295 -0.006049 0.000110 0.002992 -0.003984 
+0.000553 0.000108 0.000534 -0.000139 0.001102 0.002256 
+-0.002890 0.001904 0.004267 0.000145 -0.003199 0.004362 
+-0.003400 -0.003765 0.000122 0.000363 -0.004032 -0.001089 
+-0.001926 -0.005331 -0.000412 -0.007353 -0.002692 0.001523 
+-0.009049 -0.001554 0.001688 -0.009292 -0.005818 0.004336 
+-0.005103 -0.004497 0.004834 -0.003807 -0.001477 -0.002455 
+-0.000508 0.001693 -0.005091 -0.000297 0.002719 -0.001919 
+-0.003474 0.001142 0.000194 -0.004224 -0.000103 -0.000034 
+0.000090 -0.001307 -0.001428 -0.000305 -0.000017 -0.001194 
+0.001226 0.000477 0.001317 0.002562 -0.000290 -0.001760 
+0.000197 0.001841 -0.001970 -0.000951 -0.001153 -0.001841 
+-0.003329 0.000999 0.001150 0.000652 -0.006525 0.002386 
+-0.000822 -0.001790 0.001463 0.004610 -0.000156 -0.000312 
+-0.001392 0.002503 -0.000327 -0.001580 0.002235 -0.001624 
+-0.001583 -0.001199 -0.002382 -0.001849 -0.002840 -0.002134 
+-0.003050 -0.002676 -0.002018 -0.004779 -0.000365 -0.001157 
+0.001010 0.000859 -0.002357 0.002214 0.001946 -0.006174 
+0.003672 0.002346 -0.007675 0.003521 0.002732 -0.003752 
+-0.001984 0.000583 -0.001848 -0.000465 0.000514 -0.000319 
+0.004739 0.002063 -0.000527 0.002558 0.002093 0.001163 
+0.003004 0.001625 -0.000249 0.001290 -0.000849 0.000704 
+0.000650 -0.000837 0.001604 0.001411 -0.002806 -0.000011 
+0.001960 -0.001591 -0.000198 0.000824 -0.002619 0.002454 
+0.001758 -0.003529 0.000502 -0.000824 -0.002044 -0.000136 
+-0.001895 -0.002766 0.002202 -0.002560 -0.002850 0.003140 
+-0.002132 -0.004554 0.003002 -0.000349 -0.003452 0.000331 
+-0.001176 -0.000918 -0.001984 0.006346 0.001531 -0.000821 
+0.006069 0.005424 -0.003468 0.000960 0.002865 -0.003353 
+-0.001259 0.000574 -0.001679 -0.000645 -0.000629 -0.001339 
+0.000282 0.000386 -0.000907 0.002303 0.000939 -0.000151 
+0.002308 -0.000246 0.000123 0.000852 -0.000905 -0.000053 
+-0.001024 -0.000037 0.000009 -0.001671 0.001156 -0.005236 
+0.000789 0.002441 -0.005903 0.001414 0.004665 -0.004742 
+0.000224 0.004894 -0.000969 -0.001042 0.001599 -0.000103 
+-0.000120 0.000240 -0.000467 0.000117 -0.000046 0.000301 
+-0.000085 -0.000117 -0.000958 -0.000026 -0.000314 -0.002571 
+0.001046 -0.000677 -0.003526 -0.000403 -0.002405 -0.003829 
+-0.000028 -0.000346 -0.003688 0.001779 -0.000280 -0.005168 
+0.000664 0.002120 -0.001380 -0.000977 -0.002299 -0.000228 
+-0.001420 -0.001423 -0.001776 -0.002697 -0.004904 -0.000695 
+-0.005378 -0.000045 0.001882 0.000243 -0.000663 -0.000952 
+-0.000883 -0.003011 0.000721 -0.004393 -0.002773 0.002557 
+-0.002890 -0.003545 0.002699 -0.001071 -0.000799 -0.002551 
+0.000396 0.002632 -0.001695 0.002164 0.001412 -0.002729 
+-0.000721 0.001009 -0.000312 -0.003088 -0.000256 -0.000665 
+-0.003347 -0.001184 -0.000787 -0.001857 -0.002143 0.000929 
+-0.000200 -0.001456 -0.000105 0.000457 0.001028 -0.000293 
+0.002635 0.001744 -0.002424 0.003141 -0.000575 -0.004115 
+0.002720 -0.001923 -0.003048 -0.000058 -0.004215 -0.000174 
+-0.006907 -0.003916 0.003702 -0.009868 -0.004670 0.004141 
+-0.007393 -0.007393 -0.001026 -0.004479 -0.001135 -0.004390 
+0.000145 -0.001877 -0.002946 0.003846 0.002689 0.000769 
+0.005642 0.002591 -0.000588 0.003479 0.001153 -0.001024 
+-0.002480 0.001306 -0.003291 -0.005200 0.000141 -0.000008 
+-0.004836 -0.000498 0.000185 -0.001774 0.000000 -0.002016 
+0.001305 -0.000240 -0.005146 0.001382 -0.001301 -0.002602 
+-0.000812 0.001061 0.000713 0.000197 0.002324 0.001487 
+-0.001219 0.002246 0.001270 0.000310 0.001208 0.000242 
+0.003448 0.003223 -0.001413 0.004452 0.004325 -0.000350 
+0.000630 0.000123 0.000825 0.001475 -0.000309 0.001494 
+0.001372 -0.001414 -0.000019 -0.000646 -0.002354 -0.000512 
+0.000280 0.000353 0.000535 0.003481 -0.000333 0.000533 
+0.003815 -0.001595 0.000057 0.002507 -0.002259 0.003195 
+0.000538 -0.002901 0.004035 -0.000741 -0.002189 0.000808 
+0.003396 -0.000223 -0.004974 0.006634 0.005012 -0.012186 
+0.014153 0.007073 -0.003539 0.008977 0.003038 -0.000264 
+0.000039 -0.002560 -0.000660 -0.002068 -0.005011 0.004355 
+-0.003738 0.000616 0.002199 -0.001070 -0.000636 -0.001879 
+0.000457 -0.001502 -0.001053 -0.002413 -0.004733 -0.000550 
+-0.004070 -0.007222 -0.001110 -0.002628 -0.004062 -0.000986 
+0.000481 0.003619 -0.001979 0.001650 0.002242 -0.003494 
+-0.001926 -0.001223 0.001039 -0.002922 -0.003527 0.002821 
+-0.000515 -0.000512 -0.000015 -0.000776 0.001467 -0.003698 
+-0.000948 0.001779 -0.004483 -0.000271 -0.000732 -0.002713 
+0.000518 -0.000854 -0.000192 -0.000128 -0.000545 -0.000404 
+-0.000296 0.000772 -0.002428 -0.000330 0.000574 -0.002320 
+-0.001031 -0.000788 -0.001609 0.000122 0.000080 -0.001951 
+0.001734 -0.000340 -0.001994 -0.002500 -0.001917 0.000000 
+-0.004545 -0.003403 -0.002042 -0.004038 -0.000808 0.000417 
+-0.000753 0.000151 0.001917 0.000820 0.000681 0.000816 
+0.001816 0.001453 -0.000484 0.002454 0.001972 -0.002256 
+0.001935 0.003044 -0.003755 0.001763 0.002161 -0.002332 
+-0.000792 -0.000081 0.000516 -0.005151 -0.001632 0.001883 
+-0.004822 -0.002949 0.002481 -0.002354 -0.001992 0.001861 
+-0.001702 0.000944 -0.000373 -0.002064 0.002664 -0.003740 
+-0.001626 0.002801 -0.005464 -0.001749 0.003600 -0.003574 
+-0.001887 0.001677 -0.001852 0.003998 -0.001202 -0.001733 
+0.001321 -0.001938 -0.004142 0.002162 -0.001133 -0.001956 
+-0.000443 0.000059 -0.000846 -0.002023 -0.000890 -0.000283 
+-0.000845 0.000243 0.000826 0.001675 0.001305 0.001155 
+0.003435 0.000944 -0.000335 0.000210 -0.000890 -0.001400 
+-0.000723 0.005903 -0.005302 -0.000755 0.003928 -0.003435 
+0.001583 -0.001339 -0.000039 0.003908 0.000603 0.000306 
+0.002394 0.000197 -0.001070 0.001615 -0.000276 -0.002708 
+0.000298 -0.000189 -0.001101 -0.002082 0.002967 0.002396 
+0.000385 0.001001 -0.001444 0.000431 0.001298 0.000108 
+0.000882 0.002124 0.001373 0.000086 0.000833 -0.000300 
+0.000421 -0.000775 0.000089 0.000825 0.000137 0.000395 
+0.001126 -0.000392 0.000049 -0.000383 -0.001149 0.005177 
+0.001866 0.000644 -0.001078 0.002194 0.001875 0.001097 
+0.000542 0.003796 -0.002535 -0.000083 0.003570 -0.002202 
+-0.000940 0.002246 -0.002912 -0.001602 0.000633 -0.004162 
+-0.002002 -0.001561 -0.003915 -0.001788 -0.003207 -0.001919 
+0.001368 -0.001197 0.000000 0.000987 0.000704 -0.007185 
+-0.002067 0.000864 -0.003778 -0.000569 0.001638 0.000958 
+-0.001255 0.000152 0.003012 -0.000584 0.000584 -0.000438 
+0.005235 0.001877 -0.003358 0.006284 0.001774 -0.005915 
+0.000000 0.000157 -0.006299 0.001676 -0.002505 -0.002343 
+-0.000344 -0.001565 0.000611 -0.000098 -0.002888 -0.001100 
+0.001358 0.000027 0.001304 -0.000139 -0.000762 -0.000719 
+0.000029 0.000071 0.000020 -0.001124 0.001768 0.001059 
+0.000176 -0.000388 0.003119 0.000611 -0.002871 0.004344 
+-0.001500 -0.004100 0.005800 0.000342 -0.001463 0.000554 
+0.000348 -0.001637 0.002084 0.000237 -0.002958 0.004000 
+-0.000674 -0.003475 0.006122 -0.000918 -0.004016 0.004588 
+-0.003297 -0.002870 0.000256 -0.000770 0.000489 -0.003015 
+-0.001438 0.000863 -0.000576 -0.002505 -0.002724 0.001635 
+-0.002845 -0.005301 0.001535 -0.002154 -0.003049 -0.002602 
+-0.001561 -0.001951 0.001171 -0.001859 -0.001514 0.002369 
+-0.002068 -0.004879 0.002229 -0.006677 -0.002914 0.004033 
+-0.001397 -0.000833 0.001496 0.002174 0.002946 -0.001739 
+0.002952 0.005533 -0.000397 0.002165 0.005772 -0.001622 
+0.003133 0.001535 -0.001217 -0.000114 0.000731 0.001516 
+-0.000049 0.000434 0.000262 -0.003157 -0.002985 0.000057 
+-0.001302 -0.003483 -0.001964 0.001083 0.001629 -0.003802 
+0.002244 -0.003409 -0.001399 -0.004576 -0.004968 0.000144 
+-0.006087 -0.003927 0.004614 -0.001360 0.000159 -0.000174 
+0.003815 0.001743 0.002532 0.007675 0.001841 0.002669 
+0.005501 0.004517 0.000957 -0.000273 0.002203 0.002414 
+0.000072 -0.000289 0.001885 0.000042 -0.001518 -0.000880 
+0.001901 -0.001374 -0.001725 0.002834 0.000591 -0.000725 
+-0.001894 -0.000076 -0.001970 0.001880 0.002834 0.000567 
+0.002228 0.002444 -0.002732 -0.000544 0.000210 0.001784 
+-0.003055 -0.000633 -0.000981 -0.001788 -0.000461 -0.000923 
+-0.000990 0.000699 -0.000367 0.000519 0.000752 -0.000425 
+0.000034 0.000100 -0.000159 -0.000767 -0.002104 0.001654 
+-0.001866 -0.003768 0.003451 0.001910 -0.004206 0.002555 
+0.003249 -0.001321 0.000106 0.003146 0.000717 -0.000552 
+0.001967 0.000519 -0.000859 -0.002531 0.001387 -0.001460 
+-0.000668 0.001018 -0.003482 -0.001220 -0.002810 -0.002734 
+-0.002026 -0.001755 0.000536 0.001643 -0.001786 0.001073 
+0.001037 -0.001201 -0.003000 0.001416 0.000534 -0.006107 
+0.003119 0.002273 -0.001797 0.001413 0.001712 -0.000099 
+0.001193 0.001279 -0.000221 0.001576 0.001732 -0.000625 
+0.003333 0.000891 -0.000223 0.002476 -0.000746 -0.002601 
+-0.001149 -0.001776 -0.001410 -0.004254 -0.003952 0.001032 
+-0.006024 -0.004910 0.000329 -0.003969 -0.003389 0.001695 
+-0.000657 -0.001339 -0.005343 -0.000153 0.001067 -0.007160 
+0.005036 0.006043 -0.002518 -0.001289 0.003687 0.000686 
+-0.000770 0.003490 0.002618 -0.000299 0.002559 0.000992 
+-0.006929 0.001560 -0.005744 -0.000655 0.000307 -0.005748 
+0.000248 -0.002146 -0.001681 -0.001208 -0.004263 0.000579 
+-0.001184 -0.003510 -0.003092 -0.002354 -0.002441 -0.003287 
+0.001273 0.001596 -0.002782 0.001102 0.001227 -0.001875 
+0.001943 0.003206 -0.000324 0.002489 0.001635 0.002398 
+0.001275 -0.001163 0.000922 0.000165 -0.000716 0.001214 
+-0.003709 -0.000997 0.003922 -0.004756 -0.001880 0.005685 
+-0.004035 -0.004474 0.004474 -0.001291 -0.001657 0.002690 
+0.001003 0.001480 -0.001562 0.003792 0.002721 -0.000082 
+0.002164 0.001132 0.000837 -0.000674 0.002601 0.001397 
+-0.002921 0.002333 0.002222 -0.003672 0.001790 0.000803 
+-0.000791 0.000882 0.000149 0.002963 0.000913 -0.001083 
+0.003095 0.001032 -0.004286 0.001007 0.001414 -0.001739 
+-0.000950 0.000057 -0.001017 -0.000663 0.001233 0.000727 
+0.002377 0.003589 0.000207 0.001821 0.005393 -0.000141 
+0.000638 0.001792 0.003257 0.000374 0.002197 0.001967 
+-0.002388 -0.002824 0.004920 -0.000431 -0.005072 0.003674 
+-0.001167 -0.000894 -0.001118 -0.000346 -0.000938 -0.001085 
+0.000185 -0.001231 -0.000554 -0.000975 -0.000560 0.001451 
+-0.001716 -0.001165 0.001456 0.000333 -0.004060 -0.001663 
+0.000661 -0.004701 -0.001911 -0.000873 -0.005639 -0.000739 
+-0.002150 -0.003834 0.003117 -0.002901 -0.004957 0.000747 
+-0.004391 -0.005468 0.000230 -0.004173 -0.004987 0.000407 
+-0.002727 -0.002998 0.000068 0.001042 -0.001653 0.000984 
+0.004478 -0.000084 0.000852 0.004759 -0.001039 -0.000060 
+0.000230 -0.002855 0.001159 -0.002523 -0.000397 0.004381 
+-0.004670 0.000081 0.002112 0.000420 0.001128 -0.001168 
+-0.001156 0.001745 0.000594 -0.002368 0.000508 0.001468 
+-0.005897 -0.001951 0.002265 -0.004303 -0.003918 0.000701 
+-0.000500 -0.001715 -0.002289 -0.001128 -0.000684 -0.002256 
+0.001660 -0.000026 -0.005543 0.002142 0.000945 -0.004283 
+0.000679 0.002443 -0.002038 0.001763 0.001637 0.000944 
+-0.000603 -0.001240 -0.000006 -0.002346 -0.003399 -0.001238 
+-0.001028 -0.003805 -0.004158 0.003471 -0.003086 -0.005168 
+0.004787 0.003093 -0.007587 0.003946 0.002220 -0.005917 
+-0.000166 -0.000849 -0.001734 -0.000486 -0.002920 0.001621 
+-0.000465 -0.001277 -0.000349 -0.000243 0.001877 -0.000704 
+0.000084 0.003661 -0.001941 0.001174 0.002473 -0.003415 
+0.004527 -0.004801 -0.004274 -0.001170 0.002330 -0.010558 
+0.000928 0.006323 -0.010886 0.003711 0.004365 -0.006517 
+0.000143 -0.000293 0.000012 0.000024 -0.002185 0.001399 
+0.001579 -0.000728 0.001183 0.002227 0.000670 0.000844 
+0.000300 0.001391 0.002639 -0.000189 0.000760 0.003806 
+-0.001469 -0.001501 0.004480 0.000468 0.000640 0.000239 
+0.000294 0.002552 0.001895 -0.000472 0.002075 0.001540 
+-0.003110 0.002963 -0.000592 -0.003777 0.003613 -0.003434 
+-0.003151 0.001733 -0.002453 -0.002378 -0.000305 -0.001462 
+-0.001677 -0.000611 0.000110 -0.000486 -0.000002 0.000209 
+0.000289 0.001317 0.001143 0.000604 0.000052 0.000184 
+0.000502 -0.001171 -0.001625 0.004802 0.002779 -0.000674 
+-0.000225 -0.000542 -0.001278 -0.000421 -0.000272 -0.000897 
+-0.003353 -0.001545 -0.002297 -0.001001 0.001044 -0.007179 
+-0.000576 0.001103 -0.005540 -0.002339 -0.003154 0.001689 
+-0.002809 -0.001753 0.005061 0.002935 0.001128 0.002526 
+-0.001050 0.002009 -0.000228 0.002315 0.008173 -0.003218 
+-0.000620 -0.000694 -0.000497 -0.001808 -0.007423 0.003216 
+-0.002846 -0.004693 0.000908 0.001561 0.001297 -0.000404 
+0.000072 0.004964 0.000060 -0.001023 0.004511 -0.003068 
+-0.002890 0.003071 -0.003793 -0.003363 0.002969 -0.002651 
+-0.003624 -0.003397 -0.005123 -0.002022 -0.007488 -0.007002 
+-0.003060 -0.008174 -0.004085 -0.002518 -0.002272 -0.000338 
+0.001742 0.000833 0.000909 0.000902 0.000962 -0.000481 
+-0.000281 -0.002465 0.001681 -0.003617 -0.004278 0.004405 
+-0.007162 -0.002600 0.005334 -0.006779 0.000211 0.001457 
+0.000361 0.002685 -0.002426 0.002367 0.000878 -0.003869 
+0.002257 -0.001339 -0.000530 -0.002116 -0.003792 0.003087 
+0.000052 -0.006691 0.000125 -0.002899 -0.005833 -0.001414 
+-0.001556 -0.000222 -0.003095 0.000153 -0.000267 -0.000857 
+0.000742 0.000662 0.000821 0.000394 -0.001328 -0.000030 
+0.000197 0.000132 -0.000173 0.002012 0.000708 -0.000854 
+0.003784 0.005163 0.001378 0.002631 0.006781 0.001038 
+0.000407 0.004519 0.000407 -0.000667 0.001472 -0.003064 
+-0.000873 -0.000079 -0.003571 0.004146 0.000000 -0.002683 
+0.001029 0.001287 0.001287 0.001128 -0.000630 0.001909 
+0.000616 -0.001460 0.000471 0.000410 -0.001572 -0.001194 
+0.000136 -0.001142 -0.000804 0.000461 -0.002231 0.001757 
+-0.000451 -0.002042 0.001566 0.000147 -0.001935 -0.001213 
+0.000080 0.000002 -0.003113 0.001073 0.001600 -0.003969 
+0.003391 0.003074 -0.000251 0.002025 0.002257 -0.000170 
+0.000271 0.000125 0.000033 -0.000224 -0.000661 -0.001609 
+0.000359 -0.000405 -0.001609 -0.000574 -0.000220 -0.002979 
+0.000766 0.001452 -0.003241 0.001104 -0.000126 -0.002965 
+0.003359 -0.000114 -0.001137 -0.000701 -0.003164 -0.002414 
+-0.000431 -0.005948 -0.002931 -0.001148 -0.002018 -0.000863 
+-0.002269 0.005630 -0.002269 0.002517 0.006546 -0.004539 
+-0.000720 0.000200 0.002040 0.000072 -0.000122 0.000084 
+-0.001787 -0.004920 -0.001040 -0.002000 -0.003181 -0.000109 
+0.001714 -0.001282 -0.000673 0.000107 -0.001212 -0.000342 
+-0.002678 -0.003124 0.001679 -0.003068 -0.004846 0.002922 
+-0.000205 -0.001869 0.000955 -0.000846 0.003053 -0.000564 
+0.001278 0.005448 -0.007401 -0.000919 0.000952 -0.004242 
+-0.003847 0.001047 -0.001318 -0.006509 -0.002076 -0.000521 
+0.000686 -0.000743 -0.002164 0.003180 0.002632 -0.001060 
+0.001361 0.000525 -0.000051 -0.001930 -0.000883 0.000629 
+-0.002194 0.003168 -0.000804 0.002168 0.000879 -0.006014 
+0.001834 0.002185 -0.005900 0.000980 0.000780 -0.003031 
+-0.001503 0.001004 -0.001500 -0.001974 0.001688 0.000149 
+-0.001159 0.000376 0.003225 -0.000923 -0.000454 0.003636 
+-0.001315 -0.001490 0.001818 -0.000806 0.000062 0.000310 
+0.001547 0.001562 -0.000516 0.001928 0.002520 -0.001446 
+-0.000353 0.001595 0.000875 0.000936 0.000194 0.001841 
+0.001396 -0.000363 0.000243 0.001176 -0.000204 -0.001560 
+-0.000015 0.000026 -0.000031 -0.000926 0.000338 0.003363 
+-0.005521 -0.001649 0.007438 0.000489 -0.008333 0.004886 
+-0.001664 -0.007176 0.004992 -0.001798 -0.002434 -0.001481 
+0.000109 -0.000162 -0.000034 -0.001029 0.001058 0.000816 
+0.000247 -0.001074 0.000824 -0.000531 0.000144 -0.002112 
+-0.000210 -0.000678 -0.004856 0.002000 0.003500 -0.003583 
+0.002302 0.003095 0.000317 0.003646 0.002315 0.002642 
+0.003327 0.000448 0.002889 0.000622 0.001371 0.000777 
+0.001626 -0.001838 -0.004288 -0.001513 -0.003882 -0.003668 
+-0.002137 -0.003026 -0.001800 -0.000502 -0.000405 -0.000672 
+0.003373 -0.001198 0.000178 0.000059 0.000492 0.001055 
+-0.000417 0.002189 0.000054 -0.000460 0.002201 -0.002158 
+0.003260 0.007418 0.001575 -0.000415 0.003210 -0.001367 
+-0.000298 0.001151 -0.003386 0.000336 -0.001636 -0.004410 
+-0.001600 -0.004889 -0.004231 0.001291 -0.004077 -0.004876 
+0.002438 -0.003471 -0.004650 0.000432 -0.001690 -0.004381 
+-0.001333 0.002088 -0.001207 0.000102 0.003512 -0.003571 
+-0.002138 0.003015 -0.005646 -0.002726 -0.000628 -0.002640 
+0.000474 0.000392 -0.000462 -0.000282 -0.004679 0.003259 
+-0.003300 -0.005400 -0.001500 -0.000062 -0.002782 -0.002023 
+0.002984 0.000341 0.000097 0.004386 0.004929 -0.005388 
+-0.003363 0.000088 -0.000403 -0.003183 -0.002605 -0.002788 
+-0.002838 0.003664 0.002456 -0.004240 -0.005470 0.004968 
+0.001906 -0.000972 0.001189 0.001949 0.000651 0.002194 
+0.007569 0.001892 -0.004333 0.005057 0.010475 -0.005538 
+0.001000 0.006840 -0.000960 -0.000849 0.001764 -0.002070 
+-0.002686 0.001687 0.000875 0.000189 -0.001159 0.000591 
+-0.001112 -0.003099 -0.003300 0.000996 -0.003977 -0.002734 
+-0.000879 0.000371 -0.003069 0.000637 0.001745 -0.001615 
+0.000773 0.001954 -0.000353 0.002051 0.000187 0.001372 
+-0.000700 -0.002204 0.001414 -0.001785 -0.004235 0.000107 
+-0.002295 -0.000656 0.000164 -0.001129 0.000771 -0.000956 
+-0.000919 0.000190 0.000581 -0.001854 -0.002595 -0.000826 
+0.001177 0.002454 -0.001194 0.000641 0.002228 -0.000522 
+-0.000778 0.001404 -0.000365 -0.001535 0.001334 -0.000502 
+-0.001063 0.001967 0.000329 -0.000438 0.001753 0.000931 
+-0.000064 -0.000061 -0.000013 -0.001440 -0.001766 0.000697 
+0.000038 -0.001449 0.002299 0.003271 -0.002667 0.000115 
+0.003695 -0.003663 0.000037 0.002494 -0.003993 0.000373 
+0.001331 -0.000637 0.000312 0.000482 -0.001827 -0.000979 
+-0.000362 -0.002593 -0.000076 -0.000784 0.000038 0.000262 
+-0.000672 0.000848 0.000353 -0.000295 0.001383 -0.000644 
+-0.000366 0.000942 -0.003536 0.000561 0.000140 -0.003646 
+0.001731 -0.001800 -0.001835 0.003185 -0.001594 -0.003178 
+0.005087 -0.001587 -0.000565 0.004506 -0.003413 -0.000375 
+0.004057 -0.003738 -0.000266 0.004295 -0.002327 0.001075 
+0.002712 0.000385 0.000596 -0.000946 -0.001852 -0.000027 
+-0.000777 -0.003771 -0.001234 0.000700 -0.002694 -0.001917 
+-0.001603 0.000534 -0.001603 0.000228 0.003600 -0.003195 
+0.000801 0.005030 -0.003022 0.001377 0.001273 -0.001581 
+0.002049 -0.004023 -0.000192 0.000944 -0.003783 -0.000956 
+0.000580 -0.002383 -0.000866 0.000322 -0.002101 -0.000858 
+0.001646 -0.002310 -0.000953 0.001901 -0.001005 -0.001317 
+0.000265 0.000326 -0.002485 -0.000908 -0.001853 -0.002070 
+-0.002282 -0.002546 -0.000717 -0.001300 0.000209 0.001741 
+-0.001621 -0.000240 -0.002957 -0.004428 -0.002669 -0.000694 
+-0.005426 -0.006883 0.001839 -0.006739 -0.007056 0.000601 
+-0.000085 -0.001175 -0.002741 -0.000182 -0.002144 -0.002689 
+0.002066 0.002019 -0.002422 -0.001889 -0.000224 -0.000086 
+-0.003951 -0.003316 -0.002382 -0.003253 -0.003021 -0.002706 
+0.000039 -0.002113 -0.000337 0.001620 -0.001553 -0.001898 
+0.003484 -0.002681 -0.001468 0.001932 0.005495 -0.002532 
+-0.001295 0.001325 -0.003131 -0.001508 -0.000751 -0.003613 
+-0.002889 -0.000838 -0.002387 -0.002822 -0.002585 0.001995 
+0.001465 -0.002314 0.002220 0.000690 -0.000496 0.003449 
+0.002398 0.000737 -0.000439 0.005377 -0.000246 -0.000809 
+0.004463 -0.000452 0.000565 -0.000923 0.000946 0.001857 
+-0.005375 -0.000056 0.003509 -0.005121 -0.000310 0.002329 
+-0.000975 0.000749 0.000532 0.002582 0.002612 -0.001328 
+0.004600 0.002374 -0.002633 0.005473 0.001558 -0.000316 
+0.003123 0.002415 0.001864 0.002946 0.000364 0.001093 
+-0.002122 0.000059 -0.000794 0.000276 0.000037 -0.000599 
+0.000284 -0.000038 0.000597 -0.000182 0.000931 0.003816 
+-0.001165 0.002248 0.004296 0.001233 -0.000822 0.005038 
+0.001230 -0.000392 -0.000225 0.000954 -0.002308 -0.000477 
+0.001543 -0.000947 -0.000362 0.000760 -0.001894 0.001127 
+0.001875 0.001358 0.002520 0.003844 -0.001441 0.001449 
+0.003001 -0.001742 -0.003853 0.005109 -0.001368 -0.008571 
+0.001910 0.003268 -0.008192 -0.000182 -0.000476 -0.001974 
+-0.004963 -0.001366 0.000533 -0.005258 -0.002946 0.003575 
+-0.001852 -0.001036 0.001205 0.003496 0.001251 -0.000799 
+0.002172 0.002008 0.002131 0.003185 0.003065 -0.003185 
+0.000684 0.001117 -0.000164 -0.002146 -0.000926 0.000658 
+-0.000721 -0.000977 0.000266 0.002600 0.000743 -0.000439 
+0.002078 0.002698 -0.002479 0.001487 0.000777 -0.001249 
+-0.002278 0.000371 0.001267 -0.002833 0.001531 0.002855 
+-0.003139 0.000118 -0.000375 -0.000079 0.000415 -0.001113 
+0.000511 -0.000037 -0.001798 -0.004867 -0.002574 0.002351 
+-0.004829 0.002747 -0.002474 0.001347 -0.001721 0.006569 
+-0.002682 -0.004011 0.007191 -0.002186 -0.000665 0.000257 
+-0.000313 0.001716 -0.004045 0.003630 0.002791 -0.004957 
+-0.000205 0.003459 -0.004886 -0.002127 0.000661 -0.001229 
+-0.003934 -0.002459 -0.001967 -0.002186 -0.003563 -0.003683 
+-0.001678 -0.002215 -0.002463 0.000248 -0.000069 -0.000764 
+0.001725 -0.000282 0.000464 -0.000988 -0.001954 0.001058 
+-0.000800 -0.002869 -0.000441 0.001214 0.001723 -0.004456 
+0.000545 0.001411 -0.007982 0.001742 0.004087 -0.003708 
+0.000446 -0.001421 0.000413 0.001002 -0.004073 0.000989 
+-0.003199 -0.002814 0.004009 -0.000490 -0.001427 0.001656 
+-0.000673 -0.001610 0.000481 0.000755 -0.001298 0.001401 
+-0.000015 0.001028 -0.000783 0.001037 0.003333 -0.003407 
+0.000508 0.003951 -0.002063 -0.000315 0.001829 -0.000923 
+0.001174 0.000546 0.001575 -0.000119 0.000590 0.000395 
+0.004723 -0.000675 0.001147 0.002853 -0.001794 0.001024 
+0.002151 -0.001702 -0.000546 0.001713 0.000215 0.000611 
+0.000031 -0.000863 0.000451 0.000547 -0.001547 0.001136 
+0.000265 -0.001455 0.001339 0.001282 0.002101 0.003090 
+0.000250 0.004171 0.002447 0.000115 -0.000350 0.002432 
+-0.002579 -0.002302 -0.002579 -0.003945 -0.001315 -0.001417 
+-0.001885 0.000344 0.000303 -0.000449 0.000862 0.000981 
+0.001507 -0.000812 0.000883 -0.002515 -0.001491 -0.000559 
+-0.001698 -0.003174 0.000814 -0.000362 -0.001085 -0.002231 
+-0.000678 0.000733 -0.000922 0.001582 -0.000318 -0.001547 
+-0.000444 0.000228 0.000485 -0.000025 0.001232 0.000898 
+-0.000310 0.000211 -0.000064 -0.000006 -0.000793 -0.002402 
+0.003038 -0.001385 0.000269 0.001908 -0.001908 0.003817 
+0.000334 -0.000953 0.003051 -0.001961 0.000806 -0.002041 
+-0.002548 -0.000737 -0.000156 -0.001280 -0.000051 0.000629 
+-0.002183 -0.000629 0.001279 -0.001836 -0.000493 0.001245 
+0.000524 0.001250 0.001613 0.000985 -0.002405 0.001246 
+-0.000177 -0.002720 -0.000022 -0.003450 -0.001779 -0.000250 
+-0.000888 -0.002064 -0.001113 0.000630 0.001763 -0.003358 
+0.000312 0.001992 0.000971 0.004970 0.001067 0.000677 
+0.003095 0.000858 -0.001564 -0.000099 0.001035 -0.001621 
+-0.000119 -0.000229 -0.000067 0.000267 -0.000534 0.005072 
+-0.003141 -0.002050 0.004234 0.000092 -0.001436 -0.000317 
+0.000171 -0.000846 -0.000286 0.000091 0.000785 0.000811 
+0.000464 0.000537 0.003503 -0.000152 -0.002576 0.001061 
+-0.000034 -0.000984 0.001001 -0.000458 0.000305 -0.000763 
+-0.000492 -0.000455 -0.000492 -0.000141 0.001085 -0.000988 
+-0.000254 0.001064 0.000153 -0.001943 -0.001857 0.001891 
+-0.005447 -0.002683 0.005366 -0.007236 -0.001007 0.005034 
+-0.003740 -0.000765 0.003061 0.000894 0.000447 0.003130 
+0.001237 0.004025 0.005184 0.001944 0.007500 0.003499 
+0.004643 0.000623 0.001455 -0.000836 0.003896 0.002188 
+0.001214 0.004197 0.002492 0.004468 0.002984 0.000466 
+0.002069 -0.000849 -0.001691 0.000942 -0.002347 -0.000240 
+-0.002734 -0.003707 0.000304 -0.002602 -0.004011 -0.000984 
+-0.002061 -0.002115 -0.001004 -0.001314 0.000368 -0.002486 
+-0.000128 -0.000579 -0.001609 -0.000303 0.000682 -0.000076 
+-0.000535 -0.000591 -0.000417 -0.004898 -0.002826 0.002261 
+-0.004458 0.000542 -0.000509 0.000883 -0.002199 -0.000919 
+0.004516 0.000581 -0.000290 0.004320 -0.001515 -0.002256 
+0.001088 0.001294 -0.001554 -0.001168 0.001229 -0.001058 
+-0.000736 -0.000922 -0.001352 0.001344 -0.001665 -0.000914 
+0.001047 0.000469 0.002721 0.001187 0.002352 0.000004 
+-0.004377 -0.005220 0.001801 -0.005219 -0.008788 0.005656 
+-0.001364 -0.001508 -0.002525 -0.003390 -0.000861 -0.000824 
+-0.000795 0.000199 0.000211 0.001329 -0.000216 0.001176 
+0.001391 -0.000624 0.001199 0.000638 0.002721 0.000729 
+-0.000330 0.001674 -0.000311 -0.000590 0.000291 -0.000204 
+0.000152 0.000409 0.000588 0.001724 0.000513 0.001629 
+0.001918 -0.000457 0.002649 0.000734 -0.002970 0.003354 
+0.001556 -0.003952 0.002767 0.003051 -0.002783 0.000939 
+0.001505 -0.001689 -0.001444 0.000370 0.000759 0.000030 
+0.000507 -0.001344 0.000987 0.000037 0.001081 0.000392 
+0.000247 0.001961 0.000731 -0.001862 0.000482 0.001637 
+-0.002797 -0.002201 0.002262 -0.000472 -0.001496 -0.000787 
+0.001059 -0.001420 0.000351 -0.000887 0.000174 -0.000232 
+-0.000382 0.000226 0.000516 0.000140 -0.003499 0.001399 
+-0.001278 -0.004699 0.000207 0.000043 -0.001042 -0.001116 
+0.002883 0.002363 -0.001717 0.002273 0.005218 0.000499 
+-0.001286 0.006400 -0.000923 -0.000305 0.005495 0.000238 
+-0.002368 0.001577 0.003749 -0.003381 -0.001870 -0.000033 
+-0.000641 -0.001829 -0.001373 -0.000691 -0.000422 -0.001583 
+-0.000738 0.000004 -0.001683 0.001058 -0.000724 -0.000758 
+0.002353 0.000437 -0.001806 0.001269 0.000309 -0.000774 
+0.000000 -0.000159 -0.002063 -0.000307 -0.001355 -0.002077 
+0.003014 -0.002549 0.000223 0.001727 -0.002147 0.001291 
+-0.000751 -0.000117 -0.000904 -0.002426 0.001133 -0.001358 
+-0.002846 0.000076 0.000202 -0.000816 -0.000182 0.001629 
+0.000684 0.000390 0.002040 -0.001106 0.000050 0.001463 
+-0.003636 0.000780 0.001319 -0.003688 0.001302 0.001247 
+-0.002317 -0.000678 -0.001177 0.000018 -0.003977 -0.000810 
+0.001179 -0.001047 -0.004191 0.003054 0.001222 -0.003969 
+0.002983 0.000976 -0.000310 0.002439 -0.000329 0.000375 
+0.001845 -0.003174 -0.001124 0.000164 -0.004446 -0.002941 
+-0.002944 -0.003762 -0.001309 0.001893 -0.002464 0.000180 
+0.001024 -0.000945 0.002520 0.005413 -0.000919 -0.000509 
+0.000836 0.001756 0.001994 -0.001488 0.005006 0.002249 
+-0.003347 0.000938 0.001606 -0.002296 -0.000880 0.001196 
+-0.000969 -0.001532 -0.000506 -0.000349 -0.000671 -0.001814 
+0.000624 0.000492 -0.002725 -0.000856 -0.000223 -0.002756 
+0.001757 0.000833 -0.000541 0.000051 -0.000732 0.000126 
+-0.003459 0.000414 0.001241 0.000185 -0.000129 0.000032 
+0.000071 -0.000154 0.000143 0.000275 -0.000321 0.000574 
+0.000007 -0.000151 0.000833 -0.001221 -0.000996 0.001316 
+0.000417 -0.003096 0.002113 0.001838 -0.003378 0.000216 
+0.002766 -0.002869 -0.000620 0.005849 -0.001142 -0.005987 
+0.006353 0.008843 -0.003363 0.003085 0.006435 -0.000913 
+0.002065 0.004794 -0.000332 0.001015 0.005004 -0.002429 
+0.001790 0.004109 -0.004839 0.000290 0.002283 -0.002283 
+-0.000706 0.001691 0.000280 -0.003752 0.001185 0.002419 
+-0.000604 0.000689 0.001310 0.001746 -0.001056 0.000406 
+-0.000645 -0.003535 0.001280 -0.002271 -0.007147 0.003946 
+-0.003644 -0.006013 0.004873 -0.001949 -0.001222 -0.000569 
+-0.000849 0.001278 -0.000119 -0.000318 0.000170 -0.000507 
+-0.000208 0.000107 0.000694 0.000109 -0.000426 0.000683 
+-0.001786 -0.003678 -0.000999 -0.000096 -0.000362 -0.001678 
+0.002587 -0.000389 0.000570 0.003538 -0.000794 0.001779 
+0.001232 -0.000752 0.000988 -0.000134 0.000461 -0.002917 
+0.002455 -0.002191 -0.002685 0.000246 -0.004755 -0.001029 
+0.000218 -0.003006 -0.000343 0.000010 -0.000563 -0.000046 
+0.000011 -0.000116 0.000053 -0.003154 -0.000416 0.001265 
+-0.002078 -0.001389 -0.001160 0.000295 -0.001328 -0.006272 
+-0.002344 0.004438 -0.006866 -0.002430 0.001308 -0.006057 
+0.003254 -0.000400 -0.001560 0.000290 -0.002329 -0.000001 
+-0.000977 -0.000866 -0.000896 -0.001380 0.001774 -0.002711 
+-0.003282 0.001069 0.001069 -0.003525 0.002545 0.001373 
+-0.001363 0.000681 0.002741 0.000676 0.000057 0.000991 
+0.001268 -0.001389 -0.002309 0.001783 -0.000157 -0.004878 
+0.001010 -0.001213 -0.004145 0.000534 -0.000345 -0.000844 
+-0.001141 0.000489 0.002969 -0.005541 -0.002078 0.001154 
+-0.002999 0.001077 -0.000025 -0.001515 0.000479 -0.001142 
+-0.000627 0.000590 -0.000792 -0.003111 -0.000926 -0.000926 
+-0.002958 0.001607 -0.000071 -0.003128 0.000559 0.003574 
+-0.007559 -0.005512 0.000000 -0.001085 -0.000543 -0.001085 
+-0.002553 0.003048 0.007084 -0.001076 0.001312 0.004514 
+0.000678 0.000107 -0.003191 0.004278 0.001238 -0.007991 
+0.003556 0.002222 -0.006889 0.000968 0.002194 -0.001290 
+0.000625 -0.001440 0.003030 0.001353 -0.001353 -0.000676 
+-0.001467 -0.005582 0.000143 0.001347 -0.002145 -0.001796 
+-0.000261 -0.000460 -0.002196 -0.000613 -0.000416 -0.001321 
+0.004962 0.000275 -0.000934 0.003960 0.001641 0.000914 
+0.000246 -0.002412 -0.001952 -0.000083 -0.000031 -0.000139 
+0.000712 0.002450 0.002607 -0.000148 0.004202 0.002258 
+-0.000334 0.003189 0.000982 0.002006 0.002547 0.001510 
+0.002240 0.002072 -0.002716 -0.000692 0.000969 -0.001048 
+-0.001085 0.001383 -0.000881 0.000550 0.005325 -0.002024 
+0.003179 0.002537 -0.000015 -0.001707 0.001566 0.002846 
+-0.004852 -0.000820 0.002631 -0.002894 0.000024 0.001386 
+0.001832 0.000828 -0.000352 0.000198 0.001381 -0.000857 
+-0.001170 -0.003224 0.002517 -0.004802 -0.004116 0.002470 
+-0.001984 -0.000352 -0.000470 -0.000078 -0.000469 -0.000391 
+0.001449 0.000182 0.000928 0.001788 -0.000640 0.002555 
+-0.000578 -0.000869 0.000217 -0.001155 -0.000399 -0.000244 
+-0.000494 0.000558 -0.000044 -0.000334 -0.001751 0.003294 
+-0.000023 -0.003674 0.002465 0.001706 -0.001706 0.003889 
+0.002062 0.000660 0.003019 0.000089 -0.000336 -0.000840 
+0.004078 -0.000741 -0.003838 0.001842 -0.000592 0.000002 
+-0.003276 0.000846 -0.001806 -0.002547 -0.000682 -0.002781 
+-0.000919 -0.002256 -0.000734 -0.000436 -0.000504 -0.000524 
+0.003163 0.000793 -0.001777 -0.000003 0.002672 -0.002696 
+0.000111 0.002634 -0.000637 0.001309 0.001945 -0.000411 
+0.001361 0.000492 -0.000842 -0.001125 0.000667 -0.000708 
+0.001067 0.000965 -0.000256 -0.003074 -0.000893 0.001545 
+-0.006880 -0.004152 0.003382 -0.007750 -0.005772 0.004037 
+-0.005027 -0.000695 0.000040 0.001907 -0.001003 0.001808 
+-0.000140 0.000471 0.003501 -0.003881 0.002166 0.000810 
+-0.004837 0.001512 -0.004538 -0.003248 -0.002011 -0.002765 
+-0.000918 0.000162 0.000463 -0.002598 0.000016 0.002167 
+-0.004012 -0.002102 0.005564 -0.003106 -0.005783 0.004957 
+-0.003106 -0.008290 0.005925 -0.002939 -0.011239 0.006168 
+-0.006988 -0.009077 0.007685 -0.003538 -0.007607 -0.001592 
+-0.004000 -0.003732 -0.003307 -0.000045 0.000758 -0.001217 
+0.003102 -0.002140 -0.002404 0.006554 -0.001243 -0.004181 
+0.005705 0.004328 -0.001462 -0.000574 0.001417 -0.002294 
+-0.001217 -0.001335 0.002918 -0.000913 -0.004464 0.003596 
+0.000378 -0.003771 0.001582 0.000844 -0.001397 -0.000379 
+0.000452 -0.000939 -0.000319 0.000460 -0.001765 -0.000383 
+-0.000183 -0.000122 -0.000183 0.000701 0.000232 0.001400 
+0.000842 0.000089 0.000199 0.000679 -0.001383 -0.001408 
+-0.001328 -0.000918 -0.001986 -0.001265 -0.000993 0.000361 
+0.000042 -0.000296 0.000170 -0.000431 0.001400 0.000937 
+-0.001116 0.002789 0.001220 -0.000675 0.002024 0.000650 
+0.000244 -0.000427 -0.001984 0.001921 -0.003361 -0.005282 
+0.005682 -0.003788 -0.006818 0.008636 0.003182 0.000000 
+0.002710 0.001801 -0.001128 -0.002566 -0.000310 0.001694 
+-0.001994 0.000511 0.001629 0.000014 -0.000780 -0.000028 
+-0.001874 0.000435 0.001141 0.001857 -0.001236 0.002172 
+0.001281 -0.006370 0.001495 0.001049 -0.002261 0.001839 
+0.000208 0.000089 0.000056 -0.000891 -0.001948 -0.000626 
+-0.005040 -0.001840 0.006880 0.000801 -0.005081 0.001978 
+0.000195 -0.002282 0.003062 0.003258 0.002124 -0.001277 
+0.003440 0.000020 -0.003501 0.002481 0.000251 0.000210 
+0.001502 -0.000303 -0.000249 0.001420 -0.000243 0.002210 
+0.001472 -0.001591 0.003139 0.000130 -0.000887 0.000277 
+0.003020 0.000311 -0.001716 -0.001176 -0.002810 -0.000498 
+-0.002214 -0.004972 -0.002631 0.000806 -0.004457 -0.000817 
+0.000452 -0.002937 0.000000 0.000127 0.000636 -0.002426 
+0.003139 0.001241 -0.001095 0.001126 -0.000296 -0.000844 
+0.000051 -0.001750 -0.001218 0.000972 -0.000969 -0.002134 
+0.001880 -0.000128 -0.001805 0.000610 0.000729 0.000377 
+-0.000898 0.001045 0.002691 -0.001613 0.001089 0.002440 
+-0.000543 -0.000050 -0.000531 -0.002094 -0.001303 -0.002410 
+-0.002442 -0.000218 -0.004521 0.003332 -0.000952 -0.005692 
+0.002472 -0.003515 -0.003050 0.000701 -0.002075 -0.000939 
+-0.000481 -0.000853 -0.000927 0.000292 0.000132 -0.003493 
+0.002234 0.000059 -0.004028 0.000821 -0.000315 -0.001187 
+-0.001586 -0.000770 0.003027 -0.002057 -0.001117 0.004078 
+-0.001107 0.000486 0.001380 -0.000339 -0.001058 -0.001083 
+0.000681 -0.000145 -0.001395 0.001436 0.000572 -0.001634 
+0.001694 0.002168 -0.001796 -0.000309 -0.000183 -0.001180 
+-0.000464 -0.002878 -0.001653 -0.002622 -0.001365 -0.000553 
+-0.002449 0.000746 0.000853 -0.001339 0.000450 0.001444 
+-0.000316 -0.001395 0.002690 0.001487 -0.002763 0.002761 
+0.003230 -0.001259 0.002448 0.004008 -0.001641 -0.001091 
+0.000187 -0.000594 0.001103 -0.002797 -0.003729 0.004173 
+-0.005827 -0.001268 -0.001014 -0.001649 -0.004881 0.002053 
+0.007326 0.002460 -0.001548 0.001424 0.000493 -0.000658 
+-0.000425 -0.001808 0.000343 0.000498 0.000128 -0.000209 
+0.003365 0.000580 -0.003539 0.004312 0.002654 -0.005638 
+0.003877 0.002223 -0.005633 -0.000340 0.001543 -0.004404 
+-0.000217 0.000523 -0.000539 0.000566 -0.001406 0.002226 
+0.000763 -0.001145 0.003130 -0.000118 0.000901 -0.000311 
+0.000848 0.000944 -0.004289 0.003949 0.000043 -0.004747 
+0.000528 -0.001972 0.000176 0.000422 -0.004408 -0.000657 
+0.001899 -0.004274 0.002576 -0.001705 -0.004701 0.000784 
+0.001674 -0.000169 0.001088 0.002331 -0.000602 0.000602 
+0.002424 -0.001136 0.001212 0.000960 -0.004687 0.000841 
+0.000265 -0.003704 0.003505 0.000368 0.000043 0.001688 
+-0.001353 0.002008 0.000669 -0.002096 0.001995 0.000051 
+-0.001409 0.001257 -0.001000 -0.001072 0.001547 -0.001159 
+0.000081 0.003847 -0.003013 -0.002156 0.001760 -0.002983 
+-0.000600 0.003043 -0.002272 0.001863 0.003048 -0.001185 
+0.003012 0.003129 0.000718 0.000730 0.003691 0.001457 
+-0.001391 0.003248 0.000264 -0.000675 0.001438 0.000003 
+0.000152 -0.000649 0.001838 -0.000435 -0.000580 0.001594 
+-0.001051 -0.000725 -0.001051 -0.000113 0.000624 0.000570 
+-0.002364 -0.000455 0.004136 -0.003798 0.001008 0.001705 
+-0.002605 0.000579 0.000628 -0.000929 -0.000071 -0.003385 
+0.001343 0.002742 -0.004947 0.002978 0.002032 -0.003320 
+0.001113 0.000122 -0.002097 0.000895 -0.000336 -0.001603 
+0.004338 0.002424 -0.002809 0.002057 0.003357 -0.003934 
+0.002692 -0.000105 -0.002337 0.001249 -0.003122 -0.002498 
+0.001872 -0.001789 -0.003289 0.001027 0.000915 -0.003733 
+-0.000381 0.005172 -0.004596 -0.000800 0.007360 -0.001360 
+0.002868 0.003089 -0.002536 -0.000392 -0.000728 0.001025 
+-0.002372 -0.001914 0.003356 -0.001235 0.000141 0.000071 
+0.001662 0.003473 -0.005694 0.003206 0.004364 -0.007637 
+0.000072 -0.000018 -0.003664 -0.000245 0.001098 -0.000364 
+-0.002338 -0.001342 -0.000297 -0.001356 -0.001978 -0.001740 
+-0.001162 -0.002488 -0.002769 -0.001267 -0.001210 -0.001901 
+0.000903 -0.000847 -0.000113 0.002519 -0.002275 0.004550 
+0.006647 -0.000766 0.002815 0.007629 -0.001129 0.001051 
+0.003780 -0.002230 0.002278 -0.001407 -0.002381 0.003517 
+-0.002599 -0.002030 0.003857 -0.001300 -0.001600 0.002179 
+-0.002682 -0.001013 0.001924 0.000927 -0.001697 0.000461 
+0.002679 0.000108 -0.002138 0.000751 -0.001298 -0.003142 
+-0.001064 -0.001501 -0.003127 0.000535 -0.001169 -0.003750 
+0.001305 0.000257 -0.003166 0.001819 0.000128 -0.001211 
+0.000368 0.000185 0.000389 -0.001242 -0.000579 -0.000594 
+-0.002518 -0.003154 -0.000127 -0.000585 -0.001245 -0.001537 
+0.000547 0.000145 0.000013 0.002956 0.001364 0.001584 
+0.003220 0.001107 0.000973 0.000576 -0.000518 0.000259 
+-0.004334 -0.002012 -0.001856 -0.006800 -0.002818 -0.000164 
+-0.003787 -0.006581 0.003088 -0.001084 -0.003573 -0.000107 
+0.001020 0.001142 -0.000838 0.002396 0.000286 0.000911 
+-0.002989 -0.000847 0.002788 -0.003984 -0.002704 0.006193 
+-0.000837 -0.002244 0.002975 0.004459 0.003463 -0.002846 
+0.009262 0.005089 -0.001043 0.006452 0.004627 -0.007397 
+0.003777 -0.000270 -0.004231 0.002526 -0.000828 -0.002194 
+0.001001 -0.000691 -0.002537 0.000512 -0.002049 -0.001927 
+-0.001071 -0.001481 -0.000600 -0.000698 0.000812 0.000254 
+0.000055 0.001888 0.000304 -0.001290 -0.000076 -0.002752 
+0.001130 -0.001822 -0.002322 -0.001982 -0.001824 -0.000328 
+-0.000056 0.001407 0.000461 -0.001974 0.001096 0.000445 
+-0.000866 0.000185 -0.000507 -0.001164 -0.001920 -0.000389 
+-0.001357 -0.002054 0.000228 -0.001029 -0.001339 0.001149 
+-0.001077 -0.002063 0.000508 -0.003282 -0.003671 -0.000120 
+-0.002579 -0.002872 -0.002243 0.000624 -0.001049 -0.000091 
+0.000448 0.000482 0.001685 0.001532 0.001452 0.000971 
+0.002202 0.002282 0.000406 0.003073 0.003543 -0.000289 
+0.004388 0.002665 -0.000816 0.003259 0.001025 -0.000336 
+0.000972 0.000881 0.000152 0.001421 0.002382 -0.001549 
+0.003647 0.004064 -0.003196 0.005212 -0.001362 -0.002645 
+0.003909 0.001422 -0.004132 0.004724 -0.000322 -0.003137 
+0.004555 -0.002316 -0.004246 0.006167 -0.001038 -0.000692 
+0.002365 0.000165 -0.003547 0.000189 -0.001134 0.000569 
+-0.001575 0.002205 0.004567 -0.004288 0.003766 0.004605 
+-0.006183 0.001239 0.000551 -0.006792 -0.004426 0.001827 
+-0.004601 -0.006176 0.005267 0.000630 -0.000079 0.006850 
+0.003250 0.001429 -0.000689 0.004675 0.000368 -0.001891 
+0.002213 0.002941 0.001091 -0.002128 -0.000334 0.002045 
+-0.004758 -0.001855 0.003521 -0.000531 -0.000317 0.004661 
+0.002493 -0.000865 -0.001799 0.004180 0.004662 -0.004020 
+-0.001253 0.006099 -0.001610 -0.000743 0.001522 0.000637 
+0.000097 -0.000915 -0.000243 0.000744 -0.002238 0.000561 
+0.001295 -0.000971 0.000180 0.001028 0.000599 0.000503 
+0.001267 0.001344 0.000961 0.001601 0.001794 0.001223 
+0.000218 0.001667 0.000164 -0.000396 -0.001363 0.000110 
+-0.005859 -0.005391 0.002813 -0.005046 -0.005234 0.004293 
+-0.000255 -0.001399 -0.001335 0.004422 -0.000434 -0.003859 
+0.002508 -0.000065 -0.004886 0.001610 0.000412 -0.001748 
+-0.001594 0.000000 -0.000797 0.001403 0.001734 -0.004004 
+0.002738 0.002689 -0.007870 0.002848 0.001667 -0.008479 
+0.000082 -0.001023 -0.003629 -0.002237 -0.000005 -0.000564 
+0.000789 -0.003797 0.003279 0.001087 -0.000156 0.002226 
+0.007955 -0.000089 -0.000053 0.007506 0.001963 -0.004402 
+0.002209 -0.001210 -0.002011 0.000049 -0.002109 -0.000291 
+-0.000710 0.001055 -0.002494 -0.005618 0.001332 0.001738 
+-0.001769 0.001296 0.000865 0.001801 -0.001145 -0.000505 
+0.001795 -0.002615 0.000214 -0.000957 -0.000056 -0.002178 
+0.000665 0.001546 -0.001170 0.000438 0.000190 -0.000396 
+0.000656 -0.000298 -0.000374 0.001134 -0.000440 -0.001079 
+0.001082 -0.000078 -0.001623 0.000076 -0.000456 -0.001177 
+0.000475 0.000144 0.000039 -0.000667 0.000160 0.000848 
+-0.003605 0.000328 0.001639 -0.003712 -0.000455 0.003258 
+-0.001778 0.001839 0.002021 -0.000974 0.001109 0.001253 
+-0.000189 0.002016 0.001040 -0.003216 0.003362 -0.003128 
+0.000101 0.001416 -0.003077 -0.001788 -0.002696 0.002165 
+-0.006899 -0.005446 0.003086 -0.004106 -0.009056 0.001310 
+-0.000850 -0.007247 0.000301 -0.001004 0.000907 0.000775 
+-0.002115 -0.001708 -0.000465 0.000904 0.000314 0.002279 
+0.001512 0.000139 0.005820 -0.001410 -0.006667 0.006538 
+0.001775 -0.002579 0.003662 0.000486 -0.000806 0.000877 
+0.001924 0.000131 -0.001190 0.001521 -0.000401 -0.000232 
+-0.000012 0.000323 0.001111 -0.001317 -0.000066 0.000575 
+-0.000355 -0.001921 0.000153 0.000761 -0.004138 0.000795 
+0.001667 -0.005628 0.003962 -0.000854 -0.006220 0.004390 
+0.000215 -0.004071 0.004377 -0.000534 -0.001750 0.003025 
+-0.002903 -0.001601 0.001735 -0.003870 -0.001414 0.001606 
+-0.000942 0.001203 0.001241 0.001258 0.000612 0.003921 
+0.007741 -0.000731 -0.005404 0.002686 0.002225 -0.007905 
+0.002845 0.001986 -0.003417 0.000818 -0.001008 -0.001071 
+-0.000291 -0.002741 -0.001589 -0.000633 -0.001831 -0.003593 
+-0.000953 -0.001091 -0.000023 -0.001621 0.001310 -0.000822 
+0.000287 0.000049 -0.000305 0.002857 -0.002344 0.001317 
+0.002280 -0.001384 -0.001221 0.002441 0.000645 -0.001413 
+0.004773 0.002273 -0.002500 0.004273 0.000164 -0.001152 
+0.001118 -0.000823 0.001265 -0.003061 -0.004954 0.004508 
+-0.004798 -0.002542 0.001685 -0.001241 -0.000674 -0.000449 
+0.001069 0.003705 -0.002511 0.000317 0.000437 -0.000326 
+-0.000981 -0.003124 0.002172 -0.000024 -0.003324 0.002724 
+-0.001113 -0.002379 0.001657 -0.002049 -0.004812 0.000803 
+-0.001038 -0.006077 -0.001038 -0.000560 -0.003257 0.004377 
+0.000197 -0.000232 0.000318 0.002389 0.000265 -0.001250 
+0.002189 0.001642 -0.001128 -0.001267 -0.000760 0.000154 
+-0.005030 0.000493 -0.000509 -0.007268 0.000248 0.000461 
+-0.006332 0.000510 0.001503 -0.002505 -0.000037 0.000258 
+-0.000487 -0.001391 -0.001366 -0.000409 -0.001212 -0.002037 
+-0.003123 -0.000338 0.000616 -0.001066 0.000295 0.001445 
+0.003206 0.000000 -0.001221 0.000140 -0.000210 -0.003258 
+0.004207 -0.000384 -0.002286 0.000523 0.006241 0.002617 
+-0.001439 0.003237 0.002713 -0.001414 0.000515 0.001477 
+-0.002223 -0.001679 -0.000233 -0.000828 -0.002309 -0.000472 
+-0.001597 -0.003785 0.001769 -0.002327 -0.000815 -0.001591 
+0.000916 -0.000534 -0.000458 0.002765 0.002429 -0.003049 
+0.005960 0.005135 0.000718 0.006827 0.003498 -0.006150 
+0.000688 0.000824 -0.003287 -0.002064 0.000511 -0.001297 
+-0.001315 -0.004255 -0.000430 -0.001351 -0.000095 -0.002318 
+-0.000561 0.002908 -0.005920 0.000127 0.004675 -0.006185 
+0.004777 0.004246 -0.003525 0.000841 0.000696 0.002465 
+0.001121 0.002320 0.001346 -0.001173 -0.001901 0.002042 
+-0.001399 -0.001257 0.000213 0.000092 -0.000615 -0.000277 
+0.001034 0.000075 0.001292 -0.000814 -0.002442 0.000895 
+-0.002586 -0.003793 0.003586 -0.000884 -0.003104 0.003100 
+0.003541 -0.001749 0.001067 0.001740 -0.004285 -0.001006 
+0.001978 -0.004150 -0.002759 0.004314 0.000343 0.000931 
+-0.000793 0.000566 -0.000311 -0.002622 -0.001024 -0.002260 
+0.000308 -0.000846 0.000077 0.000239 -0.000072 -0.000215 
+-0.001047 -0.000512 -0.004723 -0.000034 -0.001275 -0.003962 
+0.000819 -0.001741 -0.001027 0.000064 -0.001125 -0.000439 
+-0.002603 -0.002183 0.000315 -0.000845 0.000022 -0.000108 
+0.003382 -0.000376 -0.001963 0.004261 0.000258 -0.003189 
+0.001216 0.000551 -0.002318 -0.000526 0.003032 0.002527 
+-0.001137 0.004186 0.002665 0.000776 -0.000028 0.001330 
+0.001763 0.000006 0.001748 -0.000700 -0.000832 -0.001228 
+0.001299 -0.003433 0.000325 0.000832 0.000430 0.000207 
+0.000840 0.002067 0.000345 0.000568 0.000273 0.002295 
+0.000454 -0.002772 0.001832 -0.000840 -0.004928 0.003359 
+-0.003265 -0.005582 0.000316 0.001781 -0.002418 0.000770 
+0.000856 -0.002906 0.001791 0.000732 -0.002397 0.002697 
+-0.000403 -0.001285 -0.000561 -0.000939 -0.003761 -0.000709 
+-0.002090 -0.002926 0.001942 0.000180 -0.005921 0.004216 
+-0.004154 -0.003184 0.005124 -0.004399 0.000636 0.004981 
+-0.001541 -0.000586 0.003862 -0.000039 -0.001668 0.001785 
+0.000184 0.000248 0.000128 0.002532 0.002041 -0.000413 
+0.002241 0.002930 -0.001034 0.000000 0.001846 -0.000462 
+-0.000577 0.000733 0.000370 -0.000665 0.000227 -0.000490 
+-0.000089 0.000596 -0.000297 -0.000209 0.000026 -0.000200 
+0.000383 -0.000104 -0.000388 0.000669 -0.000816 -0.001177 
+-0.002325 -0.002155 -0.000068 -0.001081 0.000711 -0.000557 
+-0.000584 0.000604 -0.002152 0.000696 0.000942 0.000901 
+-0.000157 0.000348 -0.000055 -0.001926 -0.004438 0.000419 
+-0.002424 -0.005758 0.000000 -0.000758 -0.001329 0.000886 
+0.000985 0.000682 0.000152 0.000326 -0.001538 0.001958 
+-0.002176 -0.004444 0.005077 -0.004472 -0.002276 0.000732 
+-0.000540 -0.001274 -0.000308 -0.000515 0.002926 -0.005075 
+0.002521 0.003365 -0.006100 0.000491 -0.000153 -0.002946 
+-0.001228 -0.000781 0.002835 -0.003548 -0.000363 0.004556 
+-0.000616 0.000601 0.004193 0.001227 -0.002107 0.002293 
+0.000448 -0.000596 -0.000902 0.001486 -0.001131 0.001033 
+-0.003158 -0.006180 0.001124 -0.007272 -0.008410 0.007025 
+-0.004098 -0.006589 0.008344 -0.004184 -0.002477 0.001861 
+0.002946 -0.001004 0.001607 0.002299 -0.002214 0.002597 
+-0.003547 -0.005092 0.002314 -0.002643 -0.003588 -0.000826 
+-0.000228 -0.000379 -0.000159 0.002848 -0.001424 -0.004480 
+-0.000567 0.001086 -0.000222 0.001030 0.001261 0.000573 
+0.001518 -0.000237 -0.001607 0.000370 0.000015 -0.000802 
+0.000582 -0.000602 -0.002348 0.000587 0.001016 -0.003206 
+0.001309 0.000121 -0.003297 0.002080 -0.000258 -0.003824 
+0.003466 -0.000924 -0.004846 0.004961 -0.000484 -0.005806 
+0.004883 0.002279 -0.005536 0.005173 0.001768 -0.002041 
+0.001214 0.000568 -0.001499 0.003951 0.003282 0.005760 
+0.001547 0.001114 -0.000087 -0.000614 -0.004299 -0.002598 
+0.000153 -0.005267 -0.004962 -0.000034 -0.000226 0.001714 
+-0.002000 -0.004367 0.001638 0.000667 0.000188 0.000080 
+0.002727 -0.000274 -0.002324 0.002228 0.001141 -0.003478 
+0.001324 -0.000809 -0.000809 0.001771 -0.002251 0.000135 
+-0.000307 -0.000951 -0.000297 0.000876 0.001052 -0.005077 
+-0.000391 -0.000293 -0.006063 -0.002940 -0.002782 -0.002625 
+-0.004343 -0.002089 0.000994 -0.002428 -0.001860 0.001604 
+-0.000909 0.002126 -0.002326 0.000830 0.002967 0.000436 
+0.001692 0.001144 -0.002811 0.003724 -0.000787 -0.002990 
+0.004852 -0.000577 -0.001086 0.000840 0.001237 -0.000412 
+-0.003122 0.000344 -0.000702 -0.003257 0.000806 -0.001024 
+-0.001008 0.000323 -0.001936 0.000000 -0.000561 -0.001041 
+-0.000714 -0.000897 -0.000360 -0.001245 -0.000714 0.000830 
+-0.002078 0.000316 -0.000723 -0.000033 0.002143 -0.001385 
+-0.000467 0.001302 -0.001010 0.000889 0.000375 0.000458 
+0.000470 -0.001176 0.000988 0.001434 0.002150 0.001439 
+0.003969 0.000153 -0.001221 0.003359 -0.001549 -0.001721 
+0.001298 -0.002012 -0.000718 -0.000153 -0.000808 -0.000202 
+0.001792 -0.000241 0.001872 0.002458 0.000392 0.002737 
+0.000874 -0.001030 0.002699 -0.001463 -0.004113 0.000514 
+-0.006211 -0.005563 0.000328 -0.005476 -0.003164 -0.000462 
+-0.000299 0.001858 -0.000615 0.001504 0.006106 0.000416 
+-0.002188 0.004033 -0.001688 0.000222 -0.001585 -0.003170 
+0.003930 0.000641 -0.003744 0.006801 0.001883 -0.000142 
+0.004520 0.001118 0.003937 0.002617 0.000406 0.001398 
+-0.000403 -0.000296 0.001088 -0.001455 -0.003710 0.002006 
+-0.001220 -0.002350 -0.000818 0.000552 -0.000391 -0.000225 
+0.001300 -0.001550 -0.000920 0.002770 -0.000931 -0.004608 
+0.004891 -0.000219 0.000000 0.001487 0.001454 0.000043 
+0.000251 0.000501 0.001253 -0.000726 0.000797 0.001836 
+0.000000 -0.000833 0.001288 -0.000187 -0.000416 -0.001204 
+-0.003212 0.000617 0.000631 -0.003167 -0.001006 0.001758 
+-0.002707 -0.003886 0.001965 -0.001474 -0.002437 0.000577 
+0.000524 0.000299 -0.000306 0.000051 0.001077 -0.000057 
+-0.001507 -0.001391 0.002087 -0.003040 0.001276 0.001539 
+-0.001540 0.001914 0.000946 -0.000938 0.002228 0.000996 
+-0.002075 0.001464 0.001180 0.001184 0.002338 0.000880 
+0.000731 -0.000731 -0.004769 -0.000648 0.000766 -0.000706 
+0.000171 -0.000007 0.000998 0.001143 -0.000461 0.001985 
+-0.000098 -0.001707 0.001169 -0.000896 -0.001493 0.000853 
+-0.001847 0.002100 -0.000637 0.000020 0.002202 0.000591 
+-0.000227 0.000292 0.001137 0.002653 -0.002202 0.000113 
+0.001340 -0.004232 0.002467 -0.001870 -0.003598 0.001524 
+-0.002207 -0.002076 0.000534 -0.000317 -0.001250 0.000119 
+0.001435 0.000796 -0.000219 0.002026 0.002758 -0.001705 
+0.001401 0.002053 -0.001053 -0.000559 -0.002112 0.000708 
+0.000685 -0.005328 0.001028 -0.002595 -0.005429 -0.001112 
+-0.004056 -0.002571 0.001803 -0.000712 0.000074 0.001118 
+0.000016 0.000078 0.000145 -0.000124 -0.001069 0.000477 
+0.000227 -0.000790 0.000279 -0.000287 0.000623 -0.001057 
+-0.002642 -0.002657 -0.002003 0.000577 -0.001264 -0.001783 
+0.003970 0.000372 0.000010 0.002657 0.002100 0.000939 
+-0.001351 -0.000869 0.005162 -0.000281 0.000303 -0.000039 
+-0.002881 -0.004773 0.002199 0.000852 -0.002893 -0.002068 
+0.001013 -0.002235 -0.000820 0.003284 0.001107 -0.000458 
+0.001134 0.001632 0.000120 0.000974 0.000779 0.000821 
+-0.000472 -0.002686 0.000738 -0.001471 -0.005191 0.000259 
+-0.003372 -0.005125 0.004050 -0.003706 -0.000070 0.001633 
+-0.001166 0.001812 0.001175 -0.001783 0.000750 -0.000752 
+-0.000604 -0.000714 -0.001505 0.000773 -0.002472 -0.001365 
+0.003803 -0.000496 -0.000874 0.005299 0.002723 -0.002772 
+0.002927 0.004575 -0.002557 0.000576 0.001288 -0.000288 
+0.000099 -0.002672 -0.000395 -0.000047 -0.003594 0.000063 
+-0.002598 -0.002501 -0.000625 -0.002455 -0.000564 -0.001825 
+-0.001257 0.000288 -0.000445 -0.000076 0.001136 0.000000 
+0.000180 0.000640 -0.000297 -0.001293 -0.001597 0.002617 
+-0.005805 -0.001565 0.003734 -0.004857 -0.000496 0.000718 
+-0.000213 0.000554 0.000320 -0.001711 0.000470 -0.003959 
+0.000589 -0.001918 -0.004282 0.001743 -0.002014 -0.000471 
+-0.002591 -0.003471 -0.001365 -0.002856 -0.001382 0.001344 
+0.000425 0.001174 0.001181 0.003566 0.003608 -0.000025 
+0.005934 0.001975 -0.006329 0.000021 -0.001145 -0.003328 
+0.004412 0.003088 -0.000882 0.000765 0.004988 -0.001728 
+-0.001136 0.004653 -0.000238 -0.000898 0.002764 0.000184 
+-0.000953 0.001051 0.001104 -0.000175 0.001375 0.000516 
+0.002456 0.000008 0.002108 0.002440 -0.002787 0.001549 
+0.000233 -0.003918 0.001578 -0.001257 -0.002119 0.000665 
+-0.002230 0.000173 -0.000086 -0.002657 -0.000845 -0.000966 
+-0.003613 -0.001095 0.000766 -0.003195 -0.000981 0.000616 
+-0.002191 -0.003088 0.004382 0.002416 -0.002322 0.002447 
+-0.001403 -0.002937 -0.001436 -0.003265 -0.003723 -0.001747 
+-0.001689 -0.002692 -0.001351 -0.001024 -0.000079 -0.002441 
+-0.001883 -0.000373 -0.001899 -0.000960 0.000960 0.000000 
+0.000296 -0.001186 -0.001473 -0.000842 -0.002147 -0.000295 
+-0.000133 -0.004564 0.001532 -0.001543 -0.007169 0.006887 
+-0.002299 -0.000624 0.008541 -0.002061 -0.001141 -0.000951 
+0.000150 -0.002531 0.001662 0.001088 -0.000572 -0.002400 
+-0.000002 -0.001095 -0.000783 -0.000246 0.001802 -0.000287 
+0.001167 -0.000112 0.000199 0.003508 -0.001111 -0.000585 
+0.005048 0.001418 -0.003029 0.002714 0.002108 -0.006430 
+0.001615 0.004654 -0.005731 -0.000890 0.002992 0.001550 
+0.000258 0.000681 0.000929 0.002427 -0.001359 0.000311 
+0.003601 0.000341 -0.001630 0.002044 0.000438 0.000438 
+-0.000590 0.000181 0.000165 -0.000434 0.001628 -0.002678 
+0.001301 0.002200 -0.003135 -0.000013 0.002141 -0.001216 
+-0.002357 0.001783 -0.000262 0.000173 0.002704 0.000586 
+0.003180 0.002629 0.001973 0.008613 0.002709 -0.000542 
+0.007551 -0.000535 -0.004585 0.003015 -0.002624 -0.001779 
+-0.000133 -0.002000 0.000053 0.000967 0.000978 0.000780 
+0.001207 0.001101 0.001127 0.000916 0.000951 0.000634 
+-0.000814 0.001323 0.000509 -0.000387 0.002155 0.000690 
+-0.001510 0.001484 0.000490 -0.001606 0.000058 0.000211 
+-0.001036 -0.000942 -0.000094 -0.001556 -0.002746 0.001160 
+0.000022 -0.005513 0.002723 -0.000472 -0.007480 0.000000 
+-0.001432 -0.007943 0.003255 -0.001172 -0.001191 -0.001588 
+-0.002583 -0.000417 -0.000583 -0.006048 0.001062 -0.000848 
+-0.006270 -0.000508 -0.000254 -0.001472 0.000981 -0.003150 
+0.001061 0.002096 -0.000513 0.001119 0.002889 -0.001397 
+0.001345 0.002362 -0.001779 -0.000560 0.000392 0.002493 
+-0.003083 0.002184 0.001560 -0.001747 0.001350 0.000715 
+0.000840 -0.000044 -0.000178 0.003001 0.004058 -0.000117 
+0.001863 0.003621 0.000837 0.000123 0.002295 0.000123 
+-0.000481 0.001080 0.000859 0.001481 0.000504 -0.000870 
+0.002232 -0.000516 -0.000916 0.000248 -0.000914 -0.000728 
+-0.001379 -0.001111 0.004425 -0.001333 -0.005128 -0.000103 
+-0.000722 -0.003970 -0.000074 -0.001203 -0.002099 -0.002077 
+0.001408 0.000000 -0.002958 0.002761 0.000045 -0.002984 
+0.001524 0.001346 -0.001686 -0.000811 -0.001117 0.001421 
+-0.000211 -0.001395 0.001192 0.001775 0.003103 0.000302 
+0.001888 0.005351 -0.003250 0.001453 0.002984 -0.001717 
+-0.003496 -0.001647 0.000186 0.000069 -0.001605 -0.001048 
+0.000239 -0.000983 -0.001274 0.001670 -0.000548 -0.004215 
+0.001367 0.000630 -0.002618 -0.004070 -0.001809 0.001338 
+-0.006929 -0.002067 0.003506 -0.003591 -0.000283 0.001771 
+0.001481 0.000295 -0.000121 0.002051 -0.000171 -0.002735 
+-0.001527 0.000140 -0.002333 -0.002591 -0.000616 0.001381 
+-0.000680 -0.001799 0.000883 0.000158 0.000552 -0.000197 
+-0.000086 -0.000737 0.000995 -0.000060 -0.002385 0.003100 
+-0.001618 -0.002756 0.002308 0.000116 0.000144 -0.000066 
+0.002515 0.001805 -0.003284 0.002272 -0.000369 -0.002622 
+-0.002167 0.004169 -0.002414 0.000644 0.002362 -0.000486 
+-0.000027 0.001689 -0.000014 0.000225 0.001184 -0.001017 
+0.000046 0.000159 0.000233 -0.000392 -0.001562 0.002154 
+0.001115 -0.000818 -0.000775 0.003427 -0.000082 0.000145 
+0.001538 0.000166 0.000848 0.000712 0.001186 -0.000252 
+0.001404 0.001204 -0.000453 -0.000529 0.000049 0.000133 
+-0.000503 0.000208 0.002664 0.000690 -0.001586 0.001941 
+0.002136 -0.002403 -0.000427 0.002912 0.000204 -0.002698 
+0.001000 0.001286 -0.000714 -0.000301 -0.001763 0.000383 
+0.000267 -0.004865 0.000030 0.000950 -0.004766 -0.000609 
+0.000045 -0.002256 -0.001448 -0.001536 -0.000903 -0.003323 
+-0.000972 -0.001533 -0.005247 0.000337 -0.000762 -0.004733 
+0.000148 -0.001021 -0.000403 0.001032 -0.000794 0.000000 
+0.001073 -0.000738 -0.000048 0.000480 -0.001344 0.000272 
+-0.001279 -0.002591 0.002322 -0.002213 -0.004754 -0.001475 
+-0.001782 -0.002615 0.006384 -0.004489 -0.002151 0.008013 
+-0.004217 -0.001481 0.005698 -0.001862 -0.000425 0.002384 
+-0.000527 0.002454 0.001754 -0.001487 0.003057 0.000506 
+-0.002204 0.002574 -0.000312 -0.002677 0.002764 -0.000432 
+-0.000548 0.002606 -0.000171 -0.001168 0.001423 -0.000097 
+-0.000435 0.001051 -0.001305 -0.001530 0.001333 -0.000826 
+-0.001038 0.000473 -0.000115 0.002199 -0.000093 -0.000883 
+0.000754 0.000750 -0.001004 -0.001403 -0.000726 0.002839 
+-0.003779 -0.001372 0.005781 -0.004805 -0.004271 0.003204 
+-0.002586 -0.000965 -0.000619 0.000795 0.000694 -0.001791 
+-0.000048 -0.001063 0.000858 -0.000868 -0.003332 0.002077 
+0.001727 0.001248 0.002577 -0.000735 0.001603 0.000680 
+0.000179 0.001288 -0.004816 0.003927 0.002170 -0.003575 
+0.003450 0.000604 0.001168 0.002278 -0.000152 0.002308 
+0.000337 -0.000194 0.000372 -0.001517 0.001091 -0.002131 
+-0.003004 0.000629 -0.002547 -0.001508 -0.000312 -0.001669 
+-0.001818 -0.000383 0.000143 -0.003380 -0.000614 0.001884 
+-0.003999 -0.000636 0.002680 -0.002255 -0.000687 0.002246 
+0.000270 0.000101 0.000299 0.000354 0.000894 -0.000525 
+0.000782 0.000660 -0.000253 0.001088 0.001767 -0.001769 
+0.000099 0.002807 -0.001443 0.000593 0.001074 0.000926 
+-0.000245 -0.001495 0.001740 -0.003617 -0.000890 0.001685 
+-0.003058 -0.001808 0.002799 -0.001446 0.001089 -0.000612 
+-0.000825 0.000127 -0.002986 0.000267 -0.000275 -0.001123 
+0.002381 0.000000 0.000136 0.001360 -0.001748 -0.000841 
+-0.000028 -0.001109 -0.003086 0.000974 0.002310 -0.003622 
+0.005214 0.005243 -0.001470 0.005434 0.003499 0.000965 
+0.001532 -0.001151 -0.000113 -0.000773 -0.004654 -0.001113 
+-0.001150 -0.003078 0.000524 0.000954 0.001453 -0.000678 
+0.001425 0.001552 -0.003817 0.000710 0.001326 -0.003928 
+-0.001175 -0.000250 -0.002789 0.000352 0.001498 -0.002527 
+0.004386 0.000877 -0.001754 0.003619 0.005015 0.000601 
+0.000247 0.002088 0.000215 0.000998 -0.000352 0.003309 
+-0.000045 -0.001289 0.003582 0.000270 -0.001485 -0.001908 
+-0.002313 -0.000522 -0.002313 0.001692 0.000752 -0.001692 
+-0.002344 0.000305 0.001042 -0.005189 -0.002326 0.001366 
+-0.003919 -0.005007 0.002068 0.000140 -0.004692 0.001068 
+0.003167 -0.000333 -0.001333 0.003319 0.003094 -0.001525 
+-0.001006 -0.004517 0.000803 -0.001179 -0.004202 -0.000943 
+-0.000735 -0.002142 -0.000132 0.000730 -0.000437 0.000485 
+-0.001562 -0.000357 0.001562 -0.003119 0.000729 0.003605 
+-0.001874 0.001827 0.002787 -0.001001 0.000858 0.001001 
+-0.002171 0.001796 -0.001503 -0.001054 0.001017 0.000778 
+-0.003837 -0.003070 0.003019 -0.002071 -0.001679 -0.000460 
+0.000168 0.003538 0.000648 0.007165 0.009346 -0.000312 
+0.000116 0.002135 -0.005858 0.000012 -0.000041 -0.000138 
+-0.003759 -0.000674 -0.000674 -0.001891 -0.001923 0.000526 
+-0.000153 -0.000820 -0.000256 0.000307 -0.001634 0.000206 
+-0.001875 -0.003750 0.003750 -0.002464 0.001690 0.001867 
+-0.001167 0.001244 0.000138 -0.001987 0.000914 -0.003863 
+0.000568 0.002031 -0.007372 0.001617 0.003007 0.000861 
+0.001181 -0.000206 0.001073 0.001086 -0.000174 0.001243 
+0.000108 0.000072 0.000174 -0.001045 0.000239 -0.000590 
+-0.001156 0.002020 0.000173 0.000889 0.003853 -0.000593 
+-0.000268 0.004098 -0.001671 -0.001747 0.003263 -0.001215 
+-0.000810 0.001831 -0.000810 0.000190 -0.000440 0.001202 
+-0.001140 -0.001712 -0.000569 -0.002911 -0.000727 -0.001838 
+-0.001624 0.001600 -0.000997 0.003311 0.000363 -0.001624 
+0.003850 0.002347 -0.000318 0.003695 0.000852 0.002275 
+0.001376 -0.000181 0.002497 -0.002260 -0.001978 -0.000283 
+-0.003866 -0.003267 0.002798 -0.002168 -0.004336 0.003217 
+-0.001316 -0.004153 0.002047 -0.003363 -0.000948 0.003560 
+-0.001614 0.001207 0.002598 -0.000948 0.001298 0.000161 
+0.000749 0.000224 -0.001672 0.002374 -0.000613 -0.001889 
+0.002560 -0.000880 -0.001999 0.002053 -0.001246 -0.002703 
+0.002193 -0.001666 -0.002972 0.003985 -0.000757 -0.000282 
+0.004358 0.002508 0.000849 0.001330 -0.000151 0.000299 
+-0.002128 -0.000252 -0.000112 -0.002688 -0.001055 -0.000588 
+-0.001846 0.004523 -0.000708 0.003084 0.004931 -0.002771 
+0.003186 0.006809 -0.000333 0.001487 0.003360 -0.000833 
+0.003064 -0.001283 0.000071 0.001009 -0.003045 0.002969 
+0.000065 0.000942 -0.001396 -0.000638 0.005231 -0.005103 
+0.001439 0.007041 -0.001760 0.000744 0.003718 -0.003718 
+-0.000709 0.000551 0.000866 -0.002802 -0.004014 0.003370 
+-0.003220 -0.006866 0.004607 -0.002269 -0.006844 0.003290 
+-0.000787 -0.001540 0.000760 0.000950 0.003184 -0.001732 
+0.004017 0.001487 -0.002974 0.001114 0.000905 -0.001383 
+-0.001621 -0.001355 0.002099 -0.001369 -0.003238 0.004940 
+-0.000042 -0.002373 0.004703 0.000618 -0.000584 0.001151 
+-0.001416 0.002043 -0.002144 -0.002829 0.002932 -0.002480 
+-0.002890 0.002123 0.000840 -0.005509 -0.002780 0.003797 
+-0.001313 -0.000209 -0.001045 0.001331 -0.000185 0.001075 
+0.006717 -0.000804 0.000136 0.002187 0.001242 -0.002983 
+-0.001940 -0.001940 -0.000075 -0.004203 -0.002977 0.001051 
+-0.002059 -0.002479 0.000831 0.001028 -0.001366 -0.000829 
+0.000839 -0.001224 -0.001224 -0.000813 -0.001032 -0.000313 
+-0.000406 0.001312 0.000037 -0.000540 0.000799 -0.001772 
+0.000072 -0.000632 -0.002987 0.000768 -0.001363 -0.002658 
+0.005593 0.004195 -0.002137 -0.000345 0.002045 0.001125 
+-0.000105 0.000429 0.000227 -0.000622 0.000010 -0.000368 
+0.001028 0.001788 0.000495 0.004126 0.004494 -0.000486 
+0.005285 0.001057 -0.002098 0.001678 0.001183 0.000710 
+-0.001984 0.001416 0.000199 -0.002847 0.002078 0.000050 
+-0.002985 0.000450 -0.000538 -0.003131 -0.001453 -0.003533 
+-0.002105 0.000195 -0.002671 0.001014 -0.003889 0.001210 
+0.001437 -0.002721 0.004097 0.000450 0.000404 0.000384 
+-0.000856 -0.002776 -0.003844 -0.002016 -0.002812 -0.003020 
+-0.000603 -0.001515 -0.000395 0.002289 0.000719 -0.001727 
+0.001604 -0.000150 -0.000495 -0.002907 -0.001128 -0.000044 
+-0.004347 -0.001663 0.001312 -0.001642 0.000508 -0.000494 
+0.000587 0.002054 -0.002384 -0.000826 -0.000257 0.000946 
+-0.006652 -0.004330 0.002243 -0.005103 -0.003455 -0.000937 
+-0.001603 -0.000232 -0.000606 -0.003019 0.001114 -0.000205 
+-0.004409 0.000756 0.000273 -0.002192 -0.002231 0.002115 
+0.000102 -0.001974 0.000319 0.002642 -0.000340 -0.002358 
+0.001798 0.001597 -0.003092 0.002647 0.002477 -0.000226 
+0.001757 0.005673 0.001598 -0.000935 0.006885 -0.003742 
+0.002198 0.001143 -0.003224 -0.002130 -0.001775 -0.000870 
+0.001535 -0.005044 0.001754 0.002182 -0.002433 -0.002937 
+0.003209 0.000356 -0.005170 0.002704 -0.000240 -0.005289 
+0.000857 -0.000451 0.000286 0.001477 0.000719 -0.000976 
+0.001365 0.000774 -0.001452 0.001048 0.001625 -0.002543 
+-0.001966 0.002677 -0.002594 0.000183 0.001904 0.000391 
+-0.000535 0.001467 0.000628 -0.002054 0.001326 0.000897 
+0.004861 0.000001 -0.001078 0.007245 0.001895 -0.001335 
+0.004865 0.003583 0.000302 0.001175 0.000118 0.000960 
+-0.008551 -0.000818 0.003662 -0.003535 -0.003122 0.006290 
+-0.001262 0.001945 0.000443 -0.001364 0.002121 -0.005152 
+-0.001099 0.002449 -0.006248 -0.002578 -0.000352 -0.005098 
+-0.001568 -0.000588 -0.001732 0.000178 -0.001451 0.000542 
+-0.002420 -0.002664 -0.000709 0.002491 -0.005313 -0.001440 
+-0.001351 -0.000520 -0.003250 0.001278 0.001048 -0.000591 
+0.000621 0.001458 0.000213 0.000051 0.000226 0.000019 
+0.000208 0.000556 0.000000 0.002982 0.000442 0.000801 
+0.001632 -0.002285 0.003239 0.000102 -0.001232 0.001355 
+-0.000170 0.000794 0.000015 0.000850 0.000688 0.000486 
+0.001645 -0.001249 0.001867 0.000276 -0.000070 0.000579 
+-0.002093 0.001781 -0.001708 -0.002180 0.001828 -0.001037 
+0.000811 0.001310 0.000116 -0.000282 -0.001536 0.000745 
+-0.000541 -0.001694 0.001262 -0.001340 -0.000893 0.002323 
+-0.000455 -0.000305 0.005472 0.000740 0.001997 0.004142 
+-0.000297 0.001784 0.000297 0.000000 0.001308 -0.001692 
+0.002880 -0.000808 -0.003713 -0.001145 -0.004565 0.002742 
+-0.003249 0.001354 0.016640 -0.005329 -0.002356 0.028588 
+-0.001596 -0.003271 0.027198 0.000743 -0.002027 0.013069 
+-0.001938 -0.005435 0.003653 -0.003911 -0.004043 -0.003651 
+-0.005194 -0.004204 0.002614 0.000263 -0.000301 0.001898 
+0.001110 0.001521 0.000123 0.000909 -0.000486 0.000137 
+0.001121 -0.002447 0.000816 -0.000572 -0.005037 0.000113 
+-0.006518 -0.006060 0.001143 -0.004028 0.000524 0.000138 
+0.002886 -0.000037 0.001200 0.005177 -0.000100 0.000660 
+-0.001000 -0.000692 0.002231 -0.005850 0.004089 0.001623 
+-0.005476 -0.004418 -0.004387 -0.004649 -0.005435 0.003281 
+0.002011 -0.000603 0.003167 0.002267 -0.000826 0.001389 
+0.000688 -0.000080 -0.001664 0.001344 0.001950 -0.003749 
+0.004476 0.002238 -0.005000 0.005269 0.003380 -0.004350 
+0.003503 0.001959 -0.001431 0.001396 -0.004378 0.002144 
+-0.001282 -0.007679 0.004211 -0.003765 -0.008389 0.004278 
+-0.000630 0.000540 0.001742 -0.002827 0.002235 -0.001446 
+-0.002289 0.002628 -0.005751 -0.001120 0.001000 0.001000 
+0.001753 0.004235 -0.002443 0.005353 0.003363 -0.000592 
+0.004999 0.004326 -0.001202 0.003318 0.004904 -0.002573 
+0.000532 0.002147 0.001269 0.001654 0.004900 0.001779 
+0.002013 0.003727 0.001701 0.001211 -0.002420 0.002201 
+0.000601 -0.004386 -0.000824 -0.005582 -0.006606 0.005698 
+-0.001549 -0.006312 0.001843 -0.004351 -0.004084 -0.001556 
+-0.001587 0.000552 -0.004548 -0.000597 -0.000561 -0.000621 
+0.003489 0.000829 -0.000264 0.000553 -0.001839 0.000183 
+-0.002324 -0.002127 -0.000287 0.000908 0.000545 -0.000773 
+0.005096 0.000589 -0.000658 0.001779 -0.000159 -0.002550 
+0.001691 0.002723 -0.002212 0.001872 0.004746 -0.000299 
+0.002066 0.003894 0.000397 0.005138 -0.001764 0.001476 
+0.006558 -0.004471 0.002435 0.003772 -0.001740 0.002322 
+0.001481 0.000249 0.000132 -0.001017 -0.001748 0.004041 
+0.001325 -0.000762 0.003337 0.001688 -0.002306 0.001814 
+0.000541 0.000553 -0.001771 0.002621 0.000703 0.000234 
+0.001895 0.000838 -0.004783 0.000842 -0.000081 -0.000440 
+0.003690 -0.000162 0.005151 0.005509 0.000570 0.006176 
+0.002491 -0.000765 0.000379 -0.000761 -0.000135 0.000205 
+-0.000815 -0.002824 0.000706 0.001249 -0.003514 -0.004264 
+-0.002112 -0.000160 -0.009759 -0.001622 0.000152 -0.002303 
+0.011442 0.004133 0.019946 -0.594595 0.329730 5.502703 
+-0.035354 0.398990 5.469697 -0.009478 0.000752 0.031087 
+-0.000252 -0.005414 0.004926 -0.008558 -0.002722 -0.007781 
+-0.000768 0.000575 -0.002883 0.002041 0.001536 0.001479 
+0.005000 0.001762 -0.000705 0.003134 -0.002239 -0.001642 
+-0.002074 -0.005732 0.002520 -0.004962 -0.004477 0.002984 
+-0.001615 0.001623 -0.001857 0.004215 0.000202 -0.003422 
+0.005159 0.005214 0.000195 0.000943 -0.003783 0.002845 
+-0.004923 0.001972 0.001960 -0.011395 -0.000897 -0.003774 
+-0.000674 0.003902 0.001124 -0.001179 0.000272 0.000353 
+0.003023 -0.000925 0.003007 0.003368 0.001573 0.001535 
+0.002631 0.000244 0.000537 0.002012 -0.000423 -0.000449 
+0.000685 0.000258 0.000168 -0.000466 0.000860 -0.001658 
+0.000542 0.000217 -0.003548 0.000380 -0.000470 -0.000734 
+0.000267 -0.007302 0.000200 -0.010853 -0.002143 0.008573 
+-0.005956 0.004997 -0.001759 -0.004814 0.005706 -0.003981 
+0.007917 0.001821 -0.001728 -0.000009 -0.000106 -0.000445 
+-0.000726 -0.000242 0.003145 -0.002083 -0.008136 0.000390 
+0.001721 -0.001926 -0.002100 0.000986 0.004376 -0.002330 
+0.000399 0.000146 0.005297 0.001566 0.001875 0.003523 
+0.000151 0.001170 0.000464 -0.000529 -0.000901 -0.001641 
+-0.001147 -0.000948 -0.003440 -0.000452 -0.002586 -0.001130 
+-0.001519 -0.004696 0.002743 -0.003384 -0.003689 0.004180 
+-0.000560 -0.000751 0.001126 0.001978 0.001326 -0.001815 
+0.001652 -0.000566 -0.000588 -0.001543 -0.000992 0.000441 
+-0.000758 0.002045 0.000985 0.003106 0.002282 0.003042 
+0.004091 0.002173 0.002445 0.000067 0.000210 0.000244 
+0.001590 0.006222 -0.006362 0.004978 0.006222 -0.002490 
+0.001659 0.002227 0.002220 0.000342 0.000672 0.001166 
+-0.001924 0.000674 -0.000894 -0.000323 0.002206 -0.000504 
+0.000941 0.000161 -0.000322 -0.000404 -0.001591 0.001048 
+-0.002231 -0.002231 0.001488 -0.001713 -0.002956 0.000897 
+-0.002079 -0.001392 -0.000911 0.003146 0.001221 -0.002793 
+0.004821 0.001838 -0.005930 0.004730 0.004119 -0.001640 
+-0.000428 0.003280 0.001950 0.000938 -0.000783 0.003749 
+-0.001265 -0.000337 -0.005143 0.000531 0.002190 -0.011349 
+-0.004609 -0.002310 -0.005587 0.001695 -0.000848 -0.001695 
+-0.008993 0.000411 -0.003470 -0.003541 0.003752 -0.006083 
+-0.006254 0.012068 0.010372 0.009616 -0.007330 0.015573 
+-0.001788 -0.015375 0.024197 -0.004823 -0.011821 0.021418 
+-0.000312 -0.006855 0.004357 0.002523 0.001821 -0.004120 
+0.007312 -0.000273 -0.000931 0.007612 0.001827 0.002436 
+0.002115 -0.002831 0.000560 0.000628 0.000647 -0.002865 
+-0.002286 0.002563 -0.003417 0.003067 0.005111 -0.002847 
+0.008581 0.005773 -0.003016 0.010337 0.004806 0.000582 
+0.000147 -0.000978 -0.000177 0.000300 -0.002147 0.002341 
+-0.003886 0.002172 0.005239 0.000956 0.003189 -0.002865 
+0.002076 0.009798 -0.004485 0.001114 0.006600 -0.002956 
+0.003529 0.002231 0.004095 0.002068 0.002048 0.002928 
+0.003156 -0.000361 0.001875 0.000650 0.000328 0.001615 
+0.002335 -0.002648 0.001709 -0.000510 0.000388 -0.000075 
+-0.006160 -0.004224 0.001408 -0.004932 -0.002755 0.000193 
+-0.001796 -0.001370 -0.002025 -0.006686 0.003266 0.002372 
+0.002184 0.001870 0.001401 0.007317 0.005390 0.001797 
+0.005642 -0.006258 -0.000924 0.010417 0.000301 -0.002410 
+-0.001373 -0.004020 0.002664 -0.006571 -0.003668 -0.004152 
+-0.004218 -0.001748 -0.006570 0.001924 -0.000067 -0.002159 
+-0.001881 -0.006705 0.000803 -0.001183 -0.006604 0.006804 
+-0.002591 -0.000699 0.004241 0.003748 0.004137 -0.003059 
+0.005521 -0.001418 -0.003987 -0.001624 -0.000661 -0.002945 
+-0.001102 -0.002203 0.001102 0.001327 -0.001097 0.003348 
+0.001111 -0.000277 0.002388 0.001368 -0.003810 -0.001857 
+0.002372 0.000159 -0.000422 0.001172 0.001415 0.001177 
+0.004400 -0.000474 0.000131 0.005477 0.001372 -0.000308 
+0.004102 0.002648 -0.001709 0.002892 0.003072 -0.004277 
+0.002424 0.001521 -0.002853 0.000033 0.000022 -0.001957 
+0.000571 -0.000952 -0.002878 -0.000941 0.001759 -0.002597 
+0.000485 0.000969 -0.001155 0.000046 -0.001301 0.001500 
+-0.000433 -0.001746 0.000951 -0.000432 0.001594 -0.000154 
+0.000189 0.003714 0.000877 0.003651 -0.000968 -0.004122 
+0.000738 0.003105 -0.003235 0.000284 0.002999 -0.000716 
+0.003061 -0.000304 -0.001691 0.002889 0.001204 0.002489 
+-0.002532 0.000960 0.001926 -0.003407 -0.000816 0.003710 
+0.000137 0.001743 -0.002758 -0.001867 0.010008 -0.004784 
+0.000258 0.002745 -0.003241 0.003790 -0.005308 0.011063 
+0.001455 -0.014536 0.025033 0.009435 -0.021992 0.020423 
+0.016541 -0.012397 0.010899 0.009220 0.000698 0.006221 
+-0.005792 0.001442 0.003239 -0.006953 -0.010137 0.005208 
+0.000458 -0.004307 0.006875 -0.001112 -0.000939 0.003527 
+0.000581 0.001081 -0.001162 0.000459 -0.000476 -0.001161 
+-0.003513 -0.002602 0.002083 0.000000 -0.001014 0.000507 
+0.000465 0.006320 -0.004460 0.010563 0.006763 -0.000966 
+0.005319 -0.003191 0.001064 0.000479 0.000366 0.001799 
+-0.004633 0.003400 -0.001345 -0.002350 0.006893 -0.005643 
+0.004149 0.002394 -0.007988 0.000766 0.003551 -0.007747 
+0.004187 0.006554 -0.004249 0.004892 0.008134 -0.003180 
+0.001251 0.003879 0.003675 0.004979 0.002163 0.003823 
+0.003623 -0.001477 -0.001322 0.005357 -0.002827 -0.003548 
+0.006565 -0.003055 -0.006761 0.003345 -0.001976 -0.005624 
+-0.003779 -0.003434 0.000988 -0.011890 -0.000485 -0.000066 
+-0.010841 0.004960 -0.003388 0.001949 0.004035 -0.004171 
+0.004379 0.003471 -0.002433 0.006492 -0.006956 0.001391 
+0.006184 -0.004553 0.005052 -0.002331 -0.001751 0.001681 
+-0.001433 -0.001186 -0.001510 0.001058 0.004980 -0.000648 
+-0.000196 0.007521 -0.003256 -0.003422 0.006409 -0.003516 
+0.001239 -0.000950 0.001363 -0.000664 -0.000860 0.001768 
+0.000601 0.000878 -0.000499 0.000452 -0.000436 -0.000123 
+-0.001810 -0.003104 -0.003473 -0.000987 -0.001334 -0.003416 
+-0.000370 0.000709 0.001348 -0.000085 0.001197 0.000342 
+0.002216 -0.000723 0.001478 0.002173 0.001563 0.002535 
+0.006992 0.004954 0.001505 0.003698 0.004251 0.001993 
+-0.000563 0.000370 -0.000572 0.002130 0.002629 -0.004833 
+0.005685 0.003619 -0.004998 0.006207 0.001717 -0.001638 
+0.000661 0.000106 0.000450 -0.003801 -0.002477 -0.002624 
+-0.002282 -0.002129 -0.004200 0.004033 -0.002051 -0.002401 
+0.002832 0.000620 0.002037 -0.001734 -0.004465 0.004228 
+0.000769 -0.000040 0.001286 -0.001852 -0.000207 -0.001465 
+-0.001020 -0.003508 -0.002369 0.005614 -0.000193 -0.001312 
+0.000000 0.007328 -0.009008 -0.001088 0.005381 -0.000254 
+-0.000270 0.000795 0.002358 -0.002730 -0.002891 0.003214 
+-0.007938 -0.002010 0.006564 -0.008615 -0.000962 0.003826 
+-0.003008 -0.003291 0.002831 -0.005199 -0.000722 -0.007221 
+-0.000721 -0.000391 0.003012 0.005148 -0.011462 0.030298 
+1.358140 -1.879070 4.762791 1.497797 -2.198238 4.867841 
+1.319767 -2.220930 3.627907 0.007202 -0.009519 0.004446 
+-0.006449 0.001963 0.001083 -0.002171 0.006903 0.002443 
+0.002949 0.002655 0.004169 0.002381 0.000527 -0.000938 
+-0.000696 0.000469 -0.003156 -0.001817 -0.005182 0.001413 
+-0.003988 0.002302 0.003186 -0.001789 -0.000672 0.000110 
+0.004943 -0.000885 -0.003246 0.002483 -0.003057 -0.004971 
+-0.002603 -0.000816 -0.003983 -0.009751 0.002454 -0.003762 
+-0.010000 0.000762 0.000711 0.000380 0.005583 -0.000228 
+0.002543 0.003021 -0.004187 0.002627 0.003220 -0.004407 
+-0.002151 0.002108 -0.006626 -0.001340 0.007371 -0.009200 
+-0.000711 0.005959 -0.007216 0.000879 0.001152 -0.003348 
+0.001003 -0.002416 0.000886 0.003180 -0.001993 -0.001216 
+0.001207 0.002797 -0.005689 0.002968 -0.003010 -0.005591 
+-0.001701 -0.001830 -0.000359 -0.002764 0.003069 0.002192 
+0.002284 0.011804 -0.006473 0.006882 0.004866 -0.002849 
+0.001694 -0.004487 0.002111 0.002944 -0.005669 0.004685 
+-0.003753 0.000159 0.004553 -0.001188 -0.003266 -0.001359 
+-0.000779 0.002399 0.002235 0.001516 0.003400 0.001570 
+0.001578 -0.001228 0.000339 0.000301 0.003221 -0.004931 
+0.000391 0.000260 -0.001563 0.002519 0.002086 -0.004555 
+0.001112 -0.000534 -0.000366 -0.000796 -0.000613 -0.000723 
+0.001478 0.001962 -0.001720 0.002192 0.003749 -0.002264 
+0.001220 -0.002339 -0.003508 0.000494 -0.004045 -0.001791 
+0.002653 -0.001371 0.001323 0.000388 0.002713 0.002481 
+0.001319 0.000621 -0.000407 -0.002026 -0.001653 -0.001440 
+-0.003610 0.000241 -0.003784 -0.002807 0.000930 -0.001746 
+0.004193 -0.000022 -0.001956 0.005316 0.001850 -0.000072 
+0.001925 0.000797 0.000535 0.000578 -0.000021 0.000686 
+0.001323 -0.000584 0.002682 0.002859 -0.001095 0.002698 
+0.001648 0.000113 -0.000762 -0.000662 0.002609 -0.000831 
+0.000355 0.000871 0.001130 0.001227 -0.003698 0.000543 
+0.002879 -0.004481 0.000553 0.006703 -0.001290 -0.005700 
+0.001188 0.000240 -0.005390 0.001289 0.002167 0.000558 
+-0.001612 -0.000441 -0.000682 -0.004082 0.001088 -0.000476 
+-0.001811 -0.000853 -0.001143 -0.000211 -0.001344 -0.001174 
+-0.002291 -0.000141 -0.004970 -0.001080 -0.000132 -0.002799 
+0.005472 -0.000054 0.013626 1.309677 -0.858065 3.580645 
+2.293413 -1.760479 5.000000 2.649635 -2.226277 5.109489 
+0.007239 -0.017537 0.027254 -0.005087 0.003800 -0.005716 
+-0.004679 0.005229 -0.007431 -0.002082 0.001762 -0.001570 
+0.002710 0.003438 -0.003409 0.003672 -0.000459 -0.006475 
+0.002440 0.004507 -0.005410 0.000000 0.001727 0.000288 
+0.001295 -0.003130 0.001560 -0.001797 -0.006816 0.003925 
+0.000105 -0.006683 0.005637 0.000805 -0.003027 -0.001522 
+-0.006106 -0.001803 -0.005669 -0.004193 0.004950 -0.003458 
+0.002538 0.006557 -0.003903 0.004236 0.004000 -0.003766 
+0.004648 0.001990 -0.002087 0.002287 0.000729 -0.002254 
+-0.000297 0.000100 -0.000886 0.000467 -0.001223 -0.000488 
+-0.001825 0.000000 -0.000146 0.001498 -0.002126 -0.002411 
+0.000707 -0.003004 -0.005203 -0.001138 -0.002560 -0.005690 
+-0.006316 0.000311 -0.001863 -0.005958 0.004215 0.003487 
+-0.004718 0.004641 0.002551 -0.000728 0.000920 -0.000270 
+0.004575 -0.001960 -0.001162 0.003302 -0.005352 -0.000126 
+0.002052 -0.002796 0.001749 -0.001889 0.002079 0.001758 
+-0.005425 0.001755 -0.005075 -0.001457 0.002612 -0.003974 
+0.001169 0.000740 -0.002779 0.003967 -0.001146 -0.000076 
+0.000206 0.000032 0.000061 -0.001879 0.003556 -0.007459 
+-0.001585 -0.005672 -0.000223 -0.003534 -0.001303 0.001585 
+0.000486 0.000166 -0.000107 0.003707 0.002787 -0.002236 
+0.004761 0.002913 -0.005363 0.003627 -0.000729 -0.006185 
+0.002911 -0.002121 -0.002061 0.002753 0.001046 -0.000422 
+0.002674 0.002936 0.000524 0.000883 0.001151 -0.000341 
+0.001115 -0.000615 -0.000115 0.000209 -0.000378 0.000154 
+-0.000805 0.000270 0.000892 -0.000204 -0.000340 0.003401 
+-0.003054 -0.004599 0.000378 0.001345 -0.002690 -0.001150 
+-0.000225 0.001472 -0.000471 0.002846 0.002583 0.001064 
+0.002587 -0.001012 0.003456 0.002493 -0.000410 0.001699 
+0.005716 0.004266 -0.003364 0.008038 0.008558 -0.004495 
+0.006805 0.006118 -0.000985 0.002904 0.001362 0.000621 
+0.002080 -0.001108 -0.000082 0.001335 0.001598 0.000404 
+0.004452 0.000238 -0.000798 0.002877 0.000682 0.000152 
+0.002512 0.001567 -0.000113 0.002555 0.000771 -0.000438 
+0.001167 -0.000839 0.000290 -0.001452 0.000199 -0.000658 
+0.000752 0.003429 0.000199 0.001101 0.002957 0.001618 
+0.004548 -0.008904 0.008546 0.004714 -0.015777 0.020764 
+0.011197 -0.020448 0.030082 0.009676 -0.016197 0.022596 
+-0.002463 0.004555 0.005363 -0.002343 0.002842 0.000474 
+-0.000008 0.000127 0.000293 0.000795 -0.003650 -0.000357 
+0.000580 -0.005499 0.000857 -0.000530 -0.000396 0.001630 
+-0.000608 0.003281 0.001456 0.005876 0.006578 -0.001241 
+0.007825 0.002412 -0.005165 0.003769 -0.000994 -0.002619 
+-0.001907 -0.003347 -0.003503 -0.009240 -0.007829 0.002708 
+-0.005105 -0.003510 0.002474 0.002690 0.001929 -0.001781 
+0.009084 0.006955 -0.002470 0.012503 0.002427 0.002473 
+0.009196 0.000707 -0.000266 0.000980 0.000354 -0.000340 
+-0.004161 -0.003919 0.001093 -0.006764 -0.004733 0.000012 
+-0.005063 0.000633 -0.002424 0.000240 -0.001918 -0.004264 
+-0.000908 -0.000551 -0.004863 -0.001267 0.003043 -0.005113 
+0.000244 0.005346 -0.004326 0.001336 0.003743 -0.004945 
+0.001447 0.000299 -0.001912 0.001749 -0.001787 0.001584 
+0.001540 -0.003350 -0.000874 0.000998 -0.001568 -0.000587 
+-0.001830 -0.001313 0.004544 -0.005428 0.001808 0.003416 
+-0.000106 0.001363 0.002120 -0.000321 -0.001283 -0.003091 
+0.001778 -0.002881 -0.007234 0.005008 -0.001513 -0.003506 
+0.002385 0.003421 -0.003986 -0.001386 -0.000873 -0.001686 
+0.001314 -0.001939 0.002952 0.000584 0.000000 0.003358 
+0.000672 0.002393 0.002377 0.003615 0.001657 0.000331 
+-0.000347 -0.000446 -0.004412 -0.006768 -0.004241 -0.003263 
+-0.001492 -0.002667 -0.001987 0.002597 0.001652 -0.004255 
+-0.000237 -0.000634 -0.003642 -0.000523 -0.001560 -0.000746 
+0.002304 -0.001563 0.000449 0.001444 -0.001180 -0.000468 
+0.000737 0.000767 -0.001121 0.002740 -0.000364 0.001127 
+0.001835 -0.002999 -0.000662 0.002535 -0.002459 -0.001178 
+0.002430 0.001626 0.001221 -0.003146 0.006017 0.002598 
+-0.006992 0.001398 -0.000932 -0.004213 -0.001502 -0.000634 
+-0.000599 -0.000064 -0.000376 0.001596 0.000493 0.000936 
+0.002493 0.001463 0.000565 -0.000426 0.001695 0.000425 
+-0.001605 -0.000197 0.000972 -0.000157 -0.000717 0.000535 
+-0.000488 0.000163 -0.002358 0.002543 0.001498 -0.000916 
+0.000989 0.002456 0.000196 0.000550 0.001263 0.001847 
+0.001001 -0.001191 0.001019 -0.000702 0.003338 -0.003266 
+0.002372 0.003939 -0.007341 0.000654 0.000700 -0.004541 
+0.003250 -0.002747 0.002122 0.005732 -0.003950 0.006850 
+-0.001797 -0.000333 0.006309 -0.002514 0.003835 -0.001230 
+-0.004150 0.003531 -0.000013 -0.000644 0.001198 0.001243 
+0.004543 0.001210 -0.000885 0.003941 -0.002275 0.001519 
+-0.003832 -0.004462 0.005092 0.000732 0.000278 0.001882 
+-0.002678 -0.001433 0.000405 0.000248 0.001826 -0.001477 
+0.000241 0.002962 -0.001860 -0.002563 0.001760 -0.005604 
+-0.001603 0.004931 -0.000357 -0.001722 0.003772 -0.001910 
+0.001575 0.001459 -0.000541 0.001783 0.001628 0.000155 
+0.001525 0.001611 0.000898 0.003214 -0.000837 0.001554 
+0.003041 -0.004591 -0.000332 -0.003235 -0.010263 0.000971 
+-0.003497 -0.010248 0.003538 -0.001107 -0.004904 -0.002808 
+0.002301 -0.000179 -0.007321 0.000606 -0.001807 -0.002710 
+0.000781 0.004881 -0.002213 0.002659 0.003991 -0.002091 
+0.004316 0.005077 -0.003478 0.006413 0.002422 -0.005679 
+0.002303 0.001152 -0.005530 0.000544 -0.000130 -0.000918 
+-0.001819 0.002613 0.000743 -0.000552 0.002064 0.001186 
+-0.005186 -0.001730 -0.001731 -0.002500 -0.000368 0.000490 
+0.000368 0.000759 0.006899 -0.002606 -0.000658 0.002442 
+-0.000680 -0.001680 0.002922 -0.000458 -0.000712 -0.002136 
+-0.000928 0.000200 -0.000247 0.002720 0.004240 0.000000 
+-0.001932 -0.000839 -0.000434 -0.001811 0.000779 0.000403 
+-0.000701 0.001803 0.000381 -0.003297 -0.002904 0.001406 
+-0.003504 -0.008012 -0.000189 -0.007570 -0.005742 -0.003306 
+-0.005364 -0.003831 -0.002107 -0.003077 -0.000711 0.000475 
+-0.001003 -0.001604 -0.002206 0.002518 -0.005469 -0.002361 
+0.002228 -0.004738 -0.001670 -0.002349 -0.001672 0.000080 
+-0.001678 0.001852 0.004803 -0.000117 0.001205 0.001294 
+0.000328 0.000256 0.000137 0.000209 0.000691 0.000219 
+-0.000340 0.000647 0.000446 -0.003859 0.001804 0.003747 
+-0.003361 0.003361 0.002327 -0.001317 0.002352 -0.000603 
+-0.001248 -0.002051 -0.000618 -0.001994 -0.005310 0.002532 
+-0.002889 -0.002942 0.005043 -0.002831 -0.000240 0.001272 
+-0.001769 0.002509 0.000558 -0.001876 0.000545 0.001094 
+-0.001951 -0.000336 0.001577 -0.000399 0.000673 0.001721 
+0.000333 0.001783 0.001276 0.001024 -0.000440 0.000628 
+-0.002045 -0.002419 0.001070 -0.002247 -0.000719 0.000474 
+0.000330 0.001660 -0.000626 -0.000765 0.002601 -0.002496 
+-0.000983 -0.000303 -0.004585 0.001057 -0.002440 -0.004346 
+-0.006291 0.001818 -0.009970 -0.003764 0.004426 -0.006413 
+-0.002183 0.002669 -0.003661 0.003955 0.002948 -0.002948 
+0.001903 -0.001654 -0.000115 0.002856 0.000264 -0.000580 
+-0.000384 -0.002928 0.000634 -0.001385 -0.002308 -0.002308 
+-0.002412 -0.004997 0.000373 -0.002941 -0.002112 -0.000580 
+-0.004392 0.002200 -0.001463 -0.005820 0.003030 -0.000414 
+0.000230 0.008708 -0.004584 0.006067 0.006923 -0.003222 
+0.000108 0.000451 0.000613 0.000478 0.004066 -0.001985 
+0.000997 0.004244 -0.001302 0.000093 0.002674 -0.003196 
+-0.000295 0.001424 -0.001591 0.002305 -0.002207 0.000190 
+0.001043 -0.005583 -0.001220 0.000318 -0.001900 -0.002178 
+0.000240 0.000155 0.000164 0.001122 0.001905 0.001246 
+0.001259 0.001094 -0.000687 0.003440 -0.001830 0.000701 
+0.002813 -0.001231 0.002357 -0.001690 -0.002577 0.000042 
+0.001268 -0.001040 0.000366 -0.004526 -0.000992 0.003320 
+-0.004362 -0.000440 0.002041 0.000832 0.001541 -0.003351 
+0.004533 0.000489 -0.006123 0.005657 0.002127 -0.000655 
+-0.000059 0.001966 0.006354 0.000217 0.004125 0.009517 
+0.004291 0.000496 0.007222 0.000919 0.003279 0.001531 
+0.001391 0.002481 0.000930 0.001723 0.002016 -0.000795 
+0.000438 0.000657 -0.002692 0.002868 0.000167 0.000250 
+0.002231 0.000102 0.000444 0.000496 0.001008 -0.003031 
+-0.001001 -0.000127 -0.000179 0.002167 -0.000740 -0.002736 
+0.000153 -0.001069 0.001985 0.003209 -0.003904 -0.000488 
+0.002037 -0.005330 0.000740 0.003801 -0.001797 -0.000963 
+0.002301 -0.002978 -0.003411 0.000231 -0.000163 -0.000923 
+-0.003961 -0.002083 0.006030 -0.002962 -0.004663 0.007793 
+-0.003184 0.000199 0.004572 -0.000003 -0.000135 -0.000561 
+0.000330 -0.002705 -0.001253 0.000408 -0.003252 0.001298 
+-0.000591 -0.001376 0.001221 0.002505 0.001293 -0.000020 
+0.002893 0.001636 -0.001178 0.000672 -0.000135 0.001169 
+-0.002475 -0.003410 0.004034 -0.000628 -0.004279 -0.000153 
+-0.005973 -0.004389 -0.000831 -0.003915 0.000283 0.003229 
+-0.002276 0.002124 0.000131 -0.000394 0.005974 0.000903 
+0.000345 0.007710 0.000444 0.003867 0.005503 -0.004239 
+0.000856 0.002258 -0.002355 0.000559 0.000040 0.000271 
+0.004675 0.000428 0.001909 0.002305 0.004181 0.007288 
+0.001417 0.000143 0.012290 -0.008547 -0.006730 0.017293 
+-0.006430 0.002822 0.011461 -0.000032 -0.000016 0.000476 
+0.001042 0.002042 -0.004740 0.000246 0.001059 0.001517 
+-0.001279 0.002942 0.001786 -0.002319 -0.002290 -0.000029 
+-0.000398 -0.004543 -0.001210 0.002394 -0.005741 -0.002343 
+0.004222 -0.001550 -0.004067 0.000620 0.001896 0.001264 
+-0.005254 0.007517 -0.000958 -0.003051 0.002593 -0.003355 
+0.003560 0.003404 0.000465 0.006681 -0.002305 -0.001087 
+0.006956 -0.000810 -0.005476 0.004102 0.002459 -0.005102 
+0.001616 -0.002591 -0.001618 0.001062 -0.001905 -0.005209 
+0.000972 0.001796 -0.005165 -0.002052 0.002541 -0.002932 
+-0.005565 0.003481 -0.001319 -0.008284 0.000405 0.002665 
+-0.002083 0.000108 0.001945 0.002102 0.000605 -0.001761 
+0.004138 0.000800 -0.003860 0.004995 -0.000750 -0.004339 
+-0.001977 -0.000133 -0.005132 -0.002195 -0.007018 -0.003494 
+0.000053 -0.007438 -0.000901 0.001348 -0.001348 -0.002261 
+-0.001302 -0.002611 -0.005238 0.001961 0.001636 -0.005720 
+0.001412 0.001621 -0.005094 0.004357 -0.000383 -0.000527 
+0.002157 0.002121 0.002561 -0.002595 -0.000847 0.003167 
+-0.001729 0.000908 0.001903 0.000176 -0.001978 0.001422 
+0.001225 0.000664 0.000363 0.000345 0.001436 -0.000455 
+0.003394 -0.000767 -0.001122 0.001165 -0.001553 -0.000588 
+0.005660 0.001876 -0.000757 0.003627 0.003178 -0.006643 
+0.004740 0.005938 -0.008935 0.002606 0.000602 -0.008619 
+0.003550 0.002111 0.002303 0.002409 -0.001006 -0.000695 
+0.000763 -0.002346 0.000512 0.001627 0.001627 0.002222 
+0.001084 0.001891 -0.000059 0.001098 0.000275 0.001185 
+-0.001591 0.000968 0.001383 0.000962 0.002580 0.001004 
+0.003547 0.001866 -0.003695 0.005937 0.005234 0.000000 
+0.002007 0.002070 -0.005446 -0.001815 0.000416 0.001161 
+-0.006079 -0.004699 0.006425 -0.003888 -0.007968 0.001392 
+-0.001342 -0.002606 -0.000181 0.000364 0.001575 -0.002430 
+0.000394 0.000431 0.001442 0.001530 -0.002040 0.000510 
+-0.000646 -0.005197 0.009083 0.002021 -0.002238 0.001642 
+-0.002993 -0.002502 -0.001206 0.000929 0.001016 -0.002525 
+0.001166 0.001382 -0.001651 -0.000979 0.001152 -0.000529 
+-0.000311 -0.001142 -0.000225 0.000435 -0.001873 -0.000664 
+0.002634 -0.000974 0.000780 -0.004227 -0.000363 0.007448 
+0.000786 0.004055 0.016382 -0.003390 -0.007296 0.011255 
+-0.003965 -0.000807 0.007966 0.000579 -0.003654 0.001376 
+0.000080 0.000055 0.000077 -0.000970 0.000753 0.002056 
+-0.005686 -0.004403 0.005809 -0.003898 0.000746 -0.002798 
+-0.001079 -0.001747 -0.002598 -0.000715 0.005731 -0.005966 
+-0.000659 0.010201 -0.003209 0.000674 0.007861 -0.005559 
+-0.000160 0.001113 -0.002072 0.001098 -0.001389 0.002011 
+0.003494 -0.006929 -0.000177 0.004171 -0.006548 0.000134 
+-0.001799 -0.001730 0.003291 -0.011806 -0.004922 0.000069 
+-0.012604 -0.003007 -0.000793 -0.006379 0.000895 0.000571 
+-0.003481 0.001958 0.002069 -0.001979 0.006298 0.003426 
+0.001126 0.002983 -0.000533 -0.001979 0.004425 -0.002935 
+0.003838 -0.002440 -0.005444 0.005177 -0.006748 -0.003266 
+0.005810 -0.003789 0.000111 0.002470 0.000706 -0.002014 
+0.001583 -0.002684 -0.003290 0.000000 -0.005379 -0.003788 
+-0.001904 -0.005944 -0.003780 -0.001236 -0.003156 -0.001744 
+0.002794 0.001799 -0.004719 -0.000006 0.002141 -0.000744 
+0.000453 0.002527 0.000728 -0.001794 0.001140 -0.001738 
+-0.003716 0.005093 0.004927 -0.006288 -0.001776 0.007461 
+-0.009744 -0.001685 0.002345 -0.001830 -0.004221 -0.002627 
+0.001210 0.002500 -0.003145 0.001552 0.000084 -0.003167 
+0.001053 0.000830 0.000332 0.002059 -0.000317 -0.000792 
+0.000173 -0.002519 0.000029 -0.000404 -0.001330 -0.001426 
+0.000890 -0.000254 -0.003333 0.005185 0.005407 -0.005852 
+0.001454 0.005589 -0.007043 -0.001369 0.003902 -0.002944 
+-0.002116 0.000820 0.001296 0.000658 -0.000823 0.000407 
+-0.000284 -0.000155 -0.001779 -0.002167 0.001872 -0.001664 
+-0.003402 0.002075 -0.001489 -0.001928 0.001517 -0.001093 
+0.001270 0.001792 -0.002763 -0.000125 -0.001590 -0.002816 
+-0.000403 0.002153 -0.001278 -0.002333 0.000583 -0.000583 
+-0.005295 0.001375 0.001787 -0.006746 -0.000407 0.002680 
+-0.001483 -0.000028 0.001823 -0.000203 0.000203 0.000081 
+0.001432 0.003976 -0.000381 -0.001509 0.000266 -0.000858 
+-0.002091 -0.000180 0.004303 -0.002644 -0.005101 0.002316 
+-0.002240 -0.003054 0.000581 -0.000253 -0.001846 -0.002579 
+-0.002066 -0.001555 0.000291 -0.001546 -0.004994 0.003626 
+0.000632 -0.003485 0.004423 0.001146 0.000026 0.000781 
+0.001084 -0.000246 0.001881 0.000836 0.000696 0.002973 
+0.002073 0.002576 0.001334 0.003995 0.000545 -0.003832 
+0.003044 -0.002978 -0.005842 -0.001295 -0.003237 -0.002193 
+-0.005543 -0.002138 0.003069 -0.009083 -0.003936 0.004360 
+-0.006375 0.002833 0.001129 -0.007120 0.001008 -0.003917 
+-0.004265 0.004095 -0.005374 0.002240 0.000597 -0.000837 
+0.002406 0.002422 0.001696 0.003110 0.000309 0.001429 
+0.005537 0.000407 -0.001201 0.003733 -0.000435 0.000273 
+0.000381 -0.001804 0.002044 -0.000594 -0.004335 0.004702 
+-0.003082 -0.003787 0.007007 -0.007699 0.001184 0.003405 
+-0.009257 0.003958 -0.004369 -0.009099 0.002890 -0.006801 
+-0.005909 -0.000807 -0.003487 -0.000140 0.000004 0.000462 
+0.007283 0.003081 -0.002241 -0.000478 -0.000531 -0.004462 
+0.000253 -0.002002 -0.002359 0.000134 -0.005772 0.002712 
+-0.002028 -0.007900 0.004804 0.000232 -0.005133 0.002550 
+0.002769 -0.001356 -0.002926 0.000063 0.002548 -0.002916 
+-0.000096 0.001559 -0.001299 -0.000400 -0.001366 0.001854 
+0.000360 0.001126 0.000244 0.002138 0.003226 0.000595 
+0.002493 0.004949 -0.002955 -0.000515 0.000988 -0.003136 
+-0.004569 -0.000997 0.002852 -0.007297 -0.000554 0.001131 
+-0.004316 -0.000538 0.001894 0.001948 0.000779 -0.004878 
+-0.000683 0.001284 0.000301 -0.000164 0.002295 -0.004262 
+-0.002414 0.003687 -0.001652 -0.002325 -0.000243 -0.000732 
+-0.001641 -0.000210 -0.000185 0.000472 0.000320 0.000322 
+0.001116 0.001283 -0.000795 0.000082 -0.000201 0.000033 
+-0.000286 0.001418 0.000132 0.000251 0.002881 -0.001877 
+0.001396 -0.000092 -0.003434 -0.000612 -0.002289 -0.002966 
+-0.001169 -0.002213 -0.001940 0.001024 -0.002047 -0.000930 
+0.000904 -0.002156 -0.001773 0.000131 -0.003250 0.000784 
+-0.001748 -0.001765 0.001311 0.000282 -0.001030 -0.000096 
+0.002344 -0.003828 -0.000859 0.000221 -0.002821 -0.003834 
+-0.002063 -0.007024 -0.000786 -0.004872 -0.003986 -0.000239 
+-0.006446 -0.001337 0.001852 -0.002818 0.000664 0.004973 
+-0.002910 0.000251 0.002458 -0.000595 -0.000180 0.000469 
+-0.000495 -0.000203 0.000130 -0.000155 0.000349 -0.000194 
+0.000760 0.001265 0.002526 0.003486 0.002034 0.001381 
+0.002123 0.000162 0.000874 -0.001744 0.001846 -0.001231 
+0.002495 -0.001318 -0.003468 0.001833 -0.000393 0.000022 
+0.004194 0.000767 0.000920 0.004124 0.001938 -0.003156 
+0.004365 -0.001442 -0.003844 0.003554 0.000012 -0.004119 
+0.001398 0.000675 -0.001458 -0.000765 -0.000437 0.001316 
+-0.000529 0.001763 0.001937 0.000000 0.003388 -0.001488 
+-0.001610 0.003594 -0.005694 0.002610 0.002842 -0.005452 
+0.001550 -0.001628 0.000000 0.002136 -0.000017 0.002205 
+0.004813 -0.003184 0.004783 0.003676 -0.004533 0.001987 
+0.002343 -0.002159 0.000241 -0.002812 0.001349 -0.000402 
+-0.009081 0.000307 -0.002179 -0.008752 0.002423 -0.001348 
+-0.003666 0.002070 -0.003921 -0.000860 0.002807 -0.006602 
+0.002166 -0.001509 -0.008201 -0.001619 -0.000851 -0.001448 
+0.002302 -0.000971 -0.001582 0.005000 0.000900 0.002700 
+0.000351 -0.001619 0.010132 0.001500 -0.008271 0.008767 
+0.000445 -0.003270 0.001955 -0.000462 0.003169 -0.002569 
+0.000544 0.003579 -0.005446 0.000788 0.002056 -0.003667 
+0.001679 0.002218 -0.001348 0.003279 0.004919 -0.000146 
+0.004299 0.007208 -0.000503 0.003304 0.005852 0.000565 
+-0.000357 0.003427 0.001351 -0.000498 0.002704 -0.000877 
+0.001131 0.001572 -0.004333 0.003089 -0.002520 -0.004146 
+0.001873 -0.002036 -0.002281 -0.002074 -0.000901 -0.001794 
+-0.003597 -0.000775 0.000760 -0.000717 -0.001453 0.000189 
+-0.000159 0.000327 -0.000010 -0.001490 0.000383 -0.000267 
+-0.000873 0.005752 -0.003389 -0.002387 0.003787 -0.002932 
+-0.004797 0.000395 -0.001314 0.000052 -0.001180 0.001537 
+0.001058 -0.001763 0.000368 0.000866 -0.000823 -0.001039 
+0.003817 0.002515 0.000629 0.003998 -0.000521 0.001275 
+0.004621 0.000308 0.001203 0.002566 0.001056 0.001015 
+0.001794 -0.000204 -0.001280 0.003505 -0.002000 -0.001947 
+0.003033 -0.004149 -0.001595 0.002581 -0.003213 0.000275 
+0.001165 -0.001722 0.000705 0.000627 -0.001595 0.000556 
+0.001463 -0.000132 -0.000922 0.000744 0.000083 -0.001290 
+-0.000403 -0.001343 0.000576 -0.000673 -0.001504 -0.000044 
+0.000341 -0.000813 -0.000049 0.000584 -0.000741 -0.000066 
+0.000275 -0.000446 0.000960 -0.000808 0.000102 0.000237 
+-0.001120 0.000179 0.001575 0.000948 -0.000727 0.005174 
+0.004802 -0.000485 0.003521 0.001953 0.002389 0.001802 
+-0.000349 0.001057 0.001357 -0.000639 -0.001187 -0.003032 
+-0.000483 0.000272 -0.005527 0.002016 0.000288 -0.002800 
+0.003007 0.001002 -0.002005 0.001233 -0.000232 -0.004237 
+-0.000833 0.000000 -0.004917 -0.004440 -0.000308 -0.000803 
+-0.006446 0.000611 0.005497 -0.006281 -0.001074 0.006281 
+-0.002272 0.000994 0.000567 -0.001882 0.000150 -0.003813 
+0.000673 0.000505 -0.006270 0.004627 0.000463 -0.004624 
+0.008372 0.000023 -0.000091 0.007180 0.000565 -0.001282 
+0.003459 0.001975 -0.000330 -0.000725 0.000220 0.000497 
+-0.000831 0.000217 0.001215 -0.000970 0.000416 -0.001197 
+0.002765 0.002715 -0.001433 0.004647 0.008025 -0.001437 
+0.003207 0.008197 -0.001203 0.001526 0.005746 -0.004489 
+0.003191 0.001952 -0.004992 0.002212 0.001290 -0.000877 
+-0.001993 0.001169 0.002828 -0.006815 -0.000701 0.004777 
+-0.007095 -0.005515 0.004713 -0.004142 -0.004840 0.003422 
+-0.000640 -0.000879 -0.000252 0.001638 0.002328 -0.000625 
+0.001852 0.000608 0.002011 -0.001189 -0.000711 0.004044 
+-0.001937 0.000403 0.002167 0.000706 -0.000353 -0.000515 
+0.004168 0.001328 -0.003862 0.003480 -0.001603 -0.004364 
+-0.000257 -0.000940 -0.002271 0.001360 -0.003190 0.002586 
+-0.000665 -0.000951 0.000823 -0.000661 0.001172 0.003084 
+0.001271 0.001780 0.002325 -0.001438 0.001550 0.001091 
+-0.001406 -0.002578 0.002015 -0.002833 -0.005749 0.000905 
+-0.003598 -0.004607 0.000559 0.000512 0.001682 -0.001036 
+-0.000251 0.001273 -0.000967 0.001095 -0.001295 -0.000148 
+0.001237 -0.003957 0.002475 0.003065 -0.004626 0.003056 
+0.002125 -0.002790 0.001567 -0.004264 -0.003292 0.002194 
+-0.000863 -0.000209 -0.000175 0.001916 0.001115 0.000370 
+0.002498 0.001239 0.000800 -0.000141 0.002460 0.000260 
+0.000836 0.002083 0.000471 0.000851 0.002527 -0.004093 
+-0.003137 0.002304 -0.002255 -0.001154 -0.001232 0.000469 
+-0.002034 -0.003509 0.002263 -0.001466 -0.005382 0.003775 
+0.000979 -0.004722 0.001808 0.000339 -0.000170 -0.000151 
+0.000691 0.003104 -0.001733 0.004281 0.003361 0.001325 
+0.007712 0.002350 -0.003464 0.005061 0.000220 -0.003983 
+0.000320 -0.000724 -0.001325 -0.002743 0.000516 0.001387 
+-0.000107 0.000338 0.000647 0.001228 -0.003899 0.000470 
+0.001221 -0.001005 0.001335 0.000216 0.000192 0.000116 
+-0.000126 -0.001130 0.002279 -0.003370 -0.000466 0.005261 
+-0.003319 -0.001058 0.004197 -0.001660 -0.000994 0.001586 
+0.000086 0.000104 0.000019 -0.001139 0.003683 0.000752 
+-0.002895 0.001266 0.000893 0.000345 -0.000015 0.000370 
+0.001423 0.000332 0.001575 -0.000515 -0.000012 0.004319 
+-0.001064 -0.003064 0.003902 -0.002250 -0.001425 0.001166 
+-0.001365 0.000128 -0.000062 -0.000546 -0.000238 0.000049 
+0.000569 0.002846 -0.000240 -0.003532 0.002324 -0.001627 
+0.005762 0.001292 -0.004220 0.002772 0.005686 -0.007819 
+-0.001794 0.002104 -0.003356 -0.000613 -0.000792 -0.000583 
+0.003332 0.001753 -0.004737 0.004667 0.005766 -0.008072 
+0.005892 0.006539 -0.006467 0.004113 0.005651 -0.000227 
+0.003809 -0.001410 0.000195 0.001945 -0.001027 -0.003005 
+-0.002338 -0.002576 -0.000370 -0.002102 -0.001567 0.003371 
+-0.007266 -0.001357 -0.000437 0.003969 0.001903 -0.003541 
+0.005635 0.005714 -0.005317 0.003819 0.003781 0.001140 
+0.002165 -0.001388 0.001533 -0.000873 -0.001743 0.000387 
+0.000111 0.000067 -0.000076 0.002105 0.000451 -0.000827 
+-0.000303 -0.000070 0.000109 -0.005120 -0.001591 0.002423 
+-0.005323 -0.003848 0.002632 -0.001151 -0.001079 -0.000889 
+0.002658 0.000275 -0.003209 0.002771 0.003013 -0.001177 
+0.001816 0.001768 -0.000644 0.000674 0.000509 -0.000034 
+-0.001607 -0.001230 -0.000095 -0.004122 -0.003481 0.000880 
+-0.004636 -0.003210 -0.001908 -0.001027 -0.002013 -0.005918 
+0.000797 0.001594 -0.000797 0.000878 -0.001485 -0.000509 
+0.001790 -0.000409 0.000836 0.000183 -0.000078 0.001535 
+-0.004644 -0.000580 0.005475 -0.007961 -0.003072 0.006809 
+-0.001031 -0.000718 0.007715 -0.000105 0.001343 0.002041 
+0.000347 0.001442 0.002564 0.000865 0.000112 0.004629 
+-0.001563 0.001218 0.005742 0.000491 0.002192 0.002203 
+-0.000457 -0.000031 -0.001504 -0.004621 0.001540 -0.001210 
+-0.002928 -0.000474 0.003322 -0.000561 -0.003850 0.000802 
+0.003750 -0.001848 0.003924 0.006896 0.002539 0.000379 
+0.003360 -0.002168 0.001192 0.003483 0.001693 -0.001501 
+0.001323 -0.000265 0.001360 -0.001129 0.000258 0.000516 
+-0.001078 0.000230 0.000379 -0.001251 0.001124 -0.002185 
+-0.001732 0.000984 -0.000984 -0.002765 -0.001217 0.000331 
+0.000340 -0.001701 -0.001020 0.000067 -0.001339 -0.000333 
+-0.000022 0.000622 0.001108 -0.000522 -0.001783 0.005178 
+-0.000596 -0.001655 0.006554 -0.002027 -0.002838 0.000541 
+0.000066 0.000148 0.000042 0.000835 0.001918 0.002296 
+-0.001804 0.005270 0.007021 -0.007413 0.001622 0.006498 
+-0.004328 -0.001908 0.000999 -0.003212 -0.003314 -0.001432 
+-0.003629 -0.002878 -0.002770 -0.004257 0.001322 -0.001668 
+-0.001346 0.003787 -0.003439 0.002115 0.003764 -0.003053 
+0.000649 0.003651 -0.001476 0.000777 0.002950 -0.002331 
+0.003125 0.002455 -0.005636 0.001460 0.000705 -0.006725 
+0.000244 -0.002437 -0.002991 -0.002627 0.000980 -0.001660 
+-0.000360 -0.000048 -0.003874 0.009490 0.008129 -0.008804 
+0.006717 0.013053 0.001775 0.000776 0.008316 -0.000935 
+0.000464 0.002256 -0.001051 0.000438 -0.002239 -0.002458 
+-0.002322 -0.003676 0.000159 -0.001095 -0.001721 -0.002196 
+0.001612 0.001975 -0.006709 0.006329 0.004654 -0.009619 
+0.009001 0.006948 -0.008446 0.008499 0.005926 -0.005771 
+0.005045 0.004489 -0.005060 0.000605 0.006210 -0.004641 
+-0.001772 0.004374 -0.000598 -0.000120 -0.000345 -0.000659 
+0.000257 -0.000735 0.001066 -0.000226 -0.002932 0.000301 
+-0.000049 0.001119 0.000461 -0.001254 0.004388 -0.002231 
+0.004020 0.004944 -0.004482 0.004470 -0.002992 -0.006864 
+0.002489 -0.006425 -0.006125 0.000263 -0.004407 -0.003295 
+-0.001736 -0.001563 -0.000406 -0.003833 -0.001887 -0.000743 
+-0.005390 -0.004962 -0.002310 -0.005562 -0.006103 -0.003347 
+-0.002776 0.004728 0.001307 0.000269 0.002073 0.001496 
+-0.000496 0.002732 -0.002276 -0.004861 0.004261 0.001303 
+-0.002571 0.002871 0.002614 -0.001855 0.002045 0.002202 
+-0.000804 0.002253 0.002573 0.003446 0.001504 -0.002966 
+0.004246 -0.000063 -0.003232 0.003117 0.001576 -0.001589 
+0.000257 0.001045 -0.000291 -0.000984 0.000492 0.001349 
+-0.000005 0.000013 0.001641 0.000542 -0.001400 0.000779 
+0.001337 -0.001324 0.000172 0.001146 -0.001085 -0.000752 
+-0.000053 -0.000899 0.000212 0.000806 -0.002325 -0.003094 
+-0.000576 0.001333 -0.003373 -0.000258 -0.001891 -0.000802 
+-0.003147 -0.001416 -0.000236 -0.003271 -0.003816 0.003542 
+-0.002991 -0.000502 0.002823 -0.001703 0.003013 -0.001647 
+-0.003116 0.004195 0.000024 -0.002209 -0.001807 0.000669 
+-0.000844 -0.003636 0.001234 0.000300 0.001698 0.003846 
+0.000291 -0.000522 0.004115 -0.000337 0.000377 0.001861 
+0.000186 0.000852 0.001253 0.001310 -0.000611 -0.000325 
+0.000094 -0.002921 0.000793 -0.001080 -0.003397 0.000900 
+-0.001640 -0.003598 0.002000 -0.004920 -0.004466 0.002100 
+-0.004921 0.006044 0.003334 0.000439 -0.002405 -0.003135 
+0.001426 -0.007637 -0.004377 0.003768 -0.007978 -0.000998 
+-0.001808 -0.009494 -0.001960 -0.000873 -0.004218 -0.002119 
+-0.000730 -0.001220 -0.000056 -0.000934 -0.000511 0.001818 
+0.000315 -0.000261 0.000665 0.000299 -0.000402 -0.004051 
+0.000313 -0.000350 -0.006812 0.000635 -0.001607 -0.002654 
+0.001866 -0.000459 0.001404 0.001432 0.001615 0.002507 
+-0.000531 0.004310 -0.001238 0.005488 -0.000497 -0.002991 
+-0.001242 -0.000382 0.000646 -0.004784 -0.004964 0.007311 
+-0.000717 -0.004905 0.004144 0.002747 -0.000914 -0.005676 
+0.004491 0.001846 -0.012058 0.006135 -0.001094 -0.012104 
+-0.000957 -0.005128 -0.005043 0.003176 0.001655 -0.008178 
+0.004171 0.003355 -0.005323 0.000470 0.002185 -0.001726 
+-0.000248 0.000469 -0.000164 -0.000811 -0.000359 -0.001070 
+-0.001357 -0.001900 -0.000272 -0.000075 -0.004958 0.003764 
+0.000000 -0.003520 0.006240 -0.000627 0.003137 0.002705 
+-0.002267 0.001700 -0.002667 0.004294 0.000194 -0.002933 
+0.002093 0.001146 -0.000866 0.000211 0.000080 -0.000080 
+0.001512 0.001220 0.000080 0.002428 0.001760 0.000182 
+0.000214 -0.001850 -0.001523 -0.002263 -0.001316 -0.004333 
+-0.001929 0.001250 -0.001144 -0.003253 0.006295 0.000354 
+-0.002784 0.005897 -0.003491 -0.001949 0.001418 -0.000859 
+0.001135 -0.000588 -0.000210 0.004329 0.000972 -0.002751 
+0.007540 0.002926 0.000462 0.003238 0.001044 0.003016 
+-0.000091 0.000334 0.000251 0.005604 0.000064 -0.005318 
+0.004084 0.004455 -0.007647 0.001808 0.001046 -0.004760 
+-0.000105 -0.000499 0.000892 0.001226 -0.001237 -0.001063 
+0.000384 -0.001200 -0.002352 -0.000813 0.000393 -0.005104 
+-0.004047 -0.000307 -0.002844 -0.002990 0.000388 -0.001121 
+-0.000979 0.003426 -0.001875 -0.000894 0.002129 0.000507 
+0.000654 -0.000801 -0.000547 -0.004701 -0.003093 0.000165 
+-0.007240 -0.004583 0.004417 -0.005276 -0.002538 0.000635 
+0.000312 0.002478 -0.000049 -0.003813 0.001394 0.000740 
+-0.002446 -0.001419 -0.001413 -0.000133 -0.002115 0.000282 
+0.001353 -0.000273 0.001382 -0.000586 -0.000117 0.002411 
+0.004349 -0.005548 -0.003373 0.003972 -0.000078 -0.006233 
+0.003374 0.000215 0.001633 0.004136 0.003288 0.001708 
+0.005464 0.004353 0.000896 0.006993 0.003319 -0.003366 
+0.002860 -0.000441 -0.005520 -0.003164 0.001804 -0.003763 
+-0.003586 0.002108 0.000445 -0.002665 -0.002264 -0.000653 
+0.000019 0.000667 0.003503 -0.005474 -0.005223 0.002882 
+-0.001736 -0.004519 0.004618 -0.002646 -0.004124 0.004640 
+-0.002302 -0.000497 0.003855 0.000147 -0.000928 0.003073 
+-0.000068 -0.003266 0.002995 -0.002857 -0.002118 0.005296 
+-0.001013 -0.000581 0.004024 -0.001977 -0.000208 0.000524 
+-0.001155 -0.002861 -0.001211 -0.003019 -0.002177 -0.001605 
+-0.007808 -0.003529 0.002417 -0.007486 -0.004223 0.007679 
+-0.005299 -0.003788 0.004104 -0.001412 -0.000949 0.000534 
+0.002439 -0.001585 -0.001220 0.003078 -0.001451 -0.004695 
+0.002396 0.000165 -0.003545 0.003691 -0.000704 0.001338 
+0.003822 -0.006823 0.003681 0.000145 -0.004899 0.003164 
+-0.000306 -0.001357 0.001134 -0.000411 -0.000247 0.000904 
+-0.001110 -0.001377 0.002113 -0.002090 -0.003709 0.003319 
+-0.001084 -0.002434 0.000623 -0.000407 0.005488 -0.003191 
+0.002501 0.011788 -0.002964 0.007257 0.007434 -0.007434 
+0.000814 0.002435 -0.002848 -0.003530 -0.001749 0.003053 
+-0.007981 -0.001149 0.003799 -0.006339 0.000758 0.001774 
+-0.002776 0.000821 0.000628 -0.002150 0.001805 -0.000309 
+0.002840 -0.000759 -0.000963 0.001644 0.003320 -0.001876 
+-0.001671 0.002268 -0.001215 -0.002477 -0.001194 0.002565 
+0.000426 -0.002771 0.002144 0.005635 0.001850 -0.000176 
+0.004398 0.001939 0.002040 0.000761 0.000802 0.000546 
+-0.001587 -0.001657 -0.000384 -0.003028 -0.000442 0.003096 
+-0.000249 -0.005415 0.001198 -0.001142 -0.004455 0.004925 
+-0.001104 -0.005423 0.004308 0.000318 -0.000570 0.000410 
+-0.003951 0.001390 -0.001788 0.001444 -0.001199 -0.004849 
+-0.000688 0.001202 -0.005213 0.000585 -0.000996 0.000050 
+0.001093 0.004213 -0.005787 -0.002872 0.005494 -0.004211 
+0.000000 0.000382 0.000286 -0.000273 -0.001158 0.000174 
+0.000264 -0.000120 0.000640 -0.000242 0.001187 0.001901 
+0.000442 0.004230 0.000179 -0.000378 0.001633 0.000527 
+-0.001120 -0.002527 -0.000157 -0.001224 -0.001094 -0.001185 
+-0.001044 -0.000276 -0.001373 -0.001472 -0.000981 -0.001594 
+0.000524 -0.006644 -0.001865 0.000467 -0.003472 -0.002337 
+0.001091 0.001839 0.000370 -0.001915 0.003095 -0.000445 
+-0.001635 0.004495 -0.000227 0.003429 0.001568 -0.000878 
+-0.001905 0.000008 -0.000096 -0.001901 0.000953 -0.001588 
+0.003148 0.006787 0.000320 0.000837 0.006798 0.000210 
+0.003734 0.001739 -0.000539 -0.001375 0.000501 -0.000024 
+-0.002795 0.003121 0.001998 -0.001339 0.001490 0.003050 
+-0.000221 0.000074 0.002295 0.001403 -0.001093 0.004697 
+-0.003621 -0.002064 -0.001876 -0.005249 -0.005769 -0.000404 
+-0.001587 -0.003646 -0.000242 -0.000562 -0.001194 0.000023 
+0.003458 -0.001077 -0.006087 0.005466 -0.001675 -0.006206 
+0.003760 -0.000313 -0.005948 0.001353 0.000614 -0.000982 
+-0.002067 -0.001378 0.005739 0.000701 -0.000224 0.000164 
+0.001858 -0.002587 -0.000934 0.002241 -0.002709 -0.001859 
+-0.001139 -0.001051 -0.001386 -0.007512 -0.003264 0.001554 
+0.003100 -0.009083 0.006200 -0.001134 -0.000700 0.003283 
+0.000755 0.001247 0.000767 -0.002531 -0.001533 0.001075 
+-0.004637 0.000437 0.003545 -0.001360 -0.005619 0.003115 
+-0.001036 -0.003685 0.000857 0.002058 0.000901 0.000328 
+0.002099 0.005460 -0.003817 0.000069 0.006750 -0.009146 
+-0.001536 0.004333 -0.009132 -0.001813 0.003461 -0.003033 
+-0.003517 0.001324 0.001754 -0.006404 -0.002467 0.001470 
+-0.005646 0.002288 0.002899 -0.005614 0.003817 0.000513 
+0.004241 -0.001804 -0.002522 0.003229 -0.004139 -0.002212 
+0.000845 -0.003568 0.000658 -0.001211 -0.000556 0.003534 
+0.000256 0.001339 0.000018 0.000283 0.000538 0.000317 
+0.001271 -0.002510 -0.000983 0.000564 -0.002387 -0.002119 
+-0.001479 -0.003062 0.000275 -0.000104 0.000133 0.001110 
+0.002134 0.002105 -0.000330 0.004077 0.000988 0.000618 
+0.001158 -0.000475 0.001082 -0.000828 -0.000315 -0.001951 
+-0.000687 0.000722 -0.005286 -0.000210 0.002821 -0.001198 
+0.000871 0.000278 0.000934 0.001971 -0.000916 0.001408 
+0.000726 0.001038 0.000725 0.001815 0.002492 -0.000358 
+0.001909 0.001454 -0.001236 -0.000345 0.000244 0.000715 
+0.000848 0.001354 0.002097 0.000923 0.002142 0.000476 
+-0.001454 0.001378 0.002345 -0.003499 -0.000044 0.001721 
+-0.001174 -0.000496 -0.000954 -0.001207 0.001210 -0.003621 
+0.003935 0.002365 -0.002717 0.002925 0.001487 -0.001140 
+0.000655 0.000407 -0.002890 0.000918 -0.000782 -0.000612 
+-0.000084 -0.000383 -0.000038 -0.001704 0.001991 -0.000455 
+-0.002830 0.001890 0.000949 -0.002439 0.001509 0.003045 
+-0.001937 0.001543 0.003612 0.000863 0.002493 0.001418 
+0.004312 0.004439 -0.001788 0.005510 0.000234 -0.002079 
+0.003697 -0.002334 0.003177 0.000333 -0.004800 0.007305 
+-0.002028 -0.005024 0.003575 0.001200 0.001200 0.001200 
+-0.001721 0.002274 0.002656 -0.001693 -0.000400 0.004326 
+-0.002819 0.001410 0.002571 -0.006624 -0.002374 0.000158 
+-0.003988 -0.002436 0.001711 -0.002703 -0.003444 0.002809 
+0.001726 -0.000752 0.000138 0.001545 -0.000241 -0.003852 
+0.002509 0.000167 -0.005203 0.002016 0.000342 -0.001143 
+-0.001458 -0.000066 0.002188 -0.000456 0.000346 0.001623 
+0.000810 -0.001595 -0.001857 0.002335 0.000314 -0.000523 
+0.001989 0.002402 -0.003071 -0.000033 0.000629 -0.001986 
+0.001209 0.001787 0.002602 0.000249 0.002601 0.003985 
+-0.001047 0.000102 0.005038 -0.002418 -0.002083 0.004064 
+-0.003926 -0.001277 0.003169 -0.003861 -0.000040 0.003991 
+-0.002791 -0.000375 0.004384 -0.002115 -0.000470 0.000469 
+0.000367 0.001628 -0.001313 0.000978 0.002633 -0.006269 
+0.003404 0.002837 -0.003828 0.003045 0.004042 -0.001995 
+0.003129 0.003646 -0.001905 0.001807 0.005140 -0.002188 
+0.001950 0.000954 -0.001005 -0.002480 -0.000843 -0.002022 
+0.000879 -0.002360 0.001685 0.001642 -0.001667 0.000025 
+0.001745 0.001095 -0.000962 0.001325 0.002816 0.001645 
+-0.001607 0.003731 0.001121 -0.000315 0.000358 -0.000202 
+0.000887 -0.002084 0.000799 0.000054 -0.000137 0.000590 
+-0.001108 -0.000771 -0.001133 -0.000025 -0.000613 -0.001054 
+-0.000311 0.000112 -0.000079 0.001532 -0.000584 0.000980 
+0.001105 -0.000411 0.001702 -0.000167 0.000643 0.000298 
+0.001003 0.000840 -0.002060 -0.000444 -0.000677 -0.000711 
+0.000114 -0.000737 -0.000014 0.000310 -0.000703 0.000806 
+0.001160 -0.000120 -0.001499 0.001913 0.002124 -0.005042 
+0.001500 0.001481 -0.007372 -0.001058 -0.000141 -0.004511 
+-0.002014 0.001914 0.000645 0.002890 0.001929 0.000868 
+0.006136 -0.000264 -0.002523 0.005380 -0.002235 -0.004509 
+0.000202 -0.001577 -0.004645 -0.003616 0.001249 -0.000885 
+-0.005608 -0.005228 0.002756 -0.001315 -0.004437 -0.000657 
+0.000000 0.000851 -0.003688 0.000264 -0.001122 -0.001453 
+-0.000098 0.000794 0.000113 0.001936 -0.002699 0.001644 
+0.003221 -0.001482 0.001956 -0.001213 0.001357 0.002491 
+-0.000494 -0.000013 0.000896 0.001120 0.000254 -0.002719 
+0.002195 0.000302 -0.002368 0.000355 0.000196 0.000717 
+-0.001504 -0.001397 0.003706 -0.001597 -0.002647 0.002647 
+-0.001209 -0.000228 -0.000289 -0.002036 0.002097 -0.000017 
+0.000100 0.001329 -0.000636 0.001643 -0.001221 -0.003133 
+0.000760 -0.003148 -0.005207 -0.000283 -0.003798 -0.004444 
+-0.002332 -0.003729 -0.002126 -0.001732 -0.003815 -0.001624 
+0.000647 -0.001500 -0.004248 0.001894 0.004015 -0.005909 
+-0.001340 0.005975 -0.005770 -0.000266 0.003397 -0.004728 
+-0.002552 -0.001198 -0.001159 -0.002835 -0.000709 -0.000709 
+-0.002267 -0.000279 0.000728 -0.002939 -0.000506 0.002337 
+-0.002762 -0.000135 0.003375 -0.001464 0.001054 0.001407 
+-0.000262 -0.000224 -0.000187 0.000410 -0.000734 -0.001042 
+-0.000680 -0.002405 0.003800 -0.000307 -0.004221 0.003953 
+-0.001274 -0.001694 0.001996 -0.002328 0.000948 -0.001293 
+-0.003306 -0.000372 -0.003100 0.000283 0.001048 -0.003016 
+0.001162 0.003978 -0.002976 0.004733 -0.001008 -0.003023 
+0.000169 -0.001687 -0.003372 0.000261 -0.000142 -0.001322 
+-0.004190 -0.001966 0.002304 0.000750 -0.000167 0.002354 
+-0.000085 0.002674 0.001814 0.003019 -0.000998 -0.000742 
+0.002331 -0.001996 -0.000211 0.000449 -0.001690 0.001938 
+-0.000020 -0.002373 0.000629 0.002690 -0.000071 -0.000359 
+0.001839 -0.000355 -0.000652 0.000422 -0.001163 -0.000640 
+-0.000772 -0.004783 0.002896 -0.002633 -0.004086 0.002391 
+0.000289 -0.002621 0.000362 -0.000087 -0.001656 -0.000470 
+-0.001443 -0.000800 -0.001233 -0.000337 0.000873 -0.000156 
+0.001880 0.001602 0.000810 0.002111 0.000109 0.003689 
+0.000468 -0.000239 0.004275 0.000696 -0.000474 0.000553 
+0.000137 -0.000472 -0.002061 -0.000326 -0.000534 -0.001794 
+-0.001767 0.000214 -0.001678 -0.000697 0.002829 -0.003423 
+0.001005 0.004988 -0.001830 -0.001479 0.002064 -0.000128 
+0.000230 0.002989 -0.001466 0.000827 0.000405 -0.000607 
+-0.000157 0.000159 -0.000369 0.001219 -0.001654 -0.004260 
+-0.001188 0.000170 -0.004029 -0.003163 -0.001781 -0.001164 
+-0.000102 -0.002746 0.000406 0.000463 -0.000755 -0.001043 
+0.000403 -0.000324 -0.002528 0.004295 0.000772 -0.000772 
+0.000111 -0.001000 0.000642 0.000749 -0.001632 0.004154 
+0.000906 -0.000200 0.005624 0.001478 0.002482 -0.000833 
+-0.001373 0.006268 -0.007225 -0.002171 0.004264 -0.006335 
+-0.002904 0.001321 -0.001998 -0.000264 0.001795 0.000380 
+0.000064 0.001239 0.003144 0.001845 -0.001437 0.004117 
+0.002146 -0.001073 0.002602 0.000191 -0.000325 -0.000477 
+-0.000112 0.001030 -0.001956 0.000362 -0.000527 -0.001480 
+-0.000509 -0.003056 0.001442 -0.002263 -0.004525 0.004646 
+-0.003524 -0.004656 0.005349 -0.002420 -0.003225 0.002557 
+-0.000706 -0.001518 -0.000536 0.000755 -0.001784 -0.001598 
+-0.000885 -0.001605 -0.000906 -0.000033 -0.000423 -0.000163 
+0.001036 0.002371 -0.002292 0.002531 0.000383 -0.001636 
+0.000098 -0.000141 -0.002713 0.000478 0.000795 -0.002043 
+0.000727 0.002364 0.000909 0.000195 -0.000092 0.001301 
+0.000080 0.000721 -0.001629 0.000517 -0.000965 -0.002482 
+0.000667 -0.001243 -0.000623 0.002030 -0.001518 -0.000475 
+0.003869 -0.001131 -0.002317 0.001085 0.000261 -0.002166 
+-0.002218 -0.000745 0.000407 0.000298 -0.002869 0.002089 
+0.000818 -0.001443 0.003166 0.000211 -0.001564 0.001649 
+-0.000093 -0.000484 0.001330 -0.000189 -0.000603 -0.001132 
+0.000977 -0.000827 -0.002161 0.000793 -0.002075 -0.004296 
+-0.001596 -0.002464 -0.004490 -0.000645 0.000276 -0.001603 
+0.003522 -0.002975 0.000501 -0.002420 -0.001853 0.001883 
+-0.000655 -0.001349 0.000350 0.002399 0.002256 0.000316 
+0.002024 0.001553 0.001485 0.000628 -0.000458 -0.000979 
+0.001090 -0.004681 0.001331 -0.004445 -0.001312 -0.001185 
+0.001428 -0.001270 0.002693 0.000044 -0.000078 0.000708 
+0.000727 0.001466 -0.004547 0.000301 0.002436 -0.004872 
+-0.001546 -0.000093 -0.000578 -0.001997 -0.002840 0.003079 
+-0.002499 -0.000384 0.004065 -0.000677 0.000494 0.001023 
+0.000174 -0.000132 0.000006 0.000795 0.000189 0.001236 
+0.000265 -0.000347 0.003541 0.000244 -0.000612 0.000748 
+0.001011 0.003897 -0.001029 0.003543 0.006413 -0.001973 
+0.003903 0.003210 -0.006346 0.001371 0.000171 0.000732 
+-0.003182 -0.005833 0.005476 -0.002587 -0.008905 0.002438 
+-0.005095 -0.004034 0.000170 0.000590 0.001126 -0.002213 
+0.000361 0.000514 -0.003035 0.000922 0.002910 -0.001356 
+-0.000396 0.000774 -0.003397 -0.000762 -0.001966 -0.003711 
+0.000241 0.000481 -0.004252 -0.000012 -0.000023 0.000143 
+-0.001415 -0.001323 0.004614 -0.000102 0.000070 -0.000175 
+-0.001252 0.001500 -0.004797 -0.001486 0.001726 -0.004578 
+-0.001817 -0.001860 -0.000057 0.000229 -0.000545 0.000942 
+-0.007438 -0.003005 0.002162 -0.003529 -0.001587 0.002614 
+-0.000081 -0.000884 0.001017 0.000443 -0.003058 -0.001884 
+0.000406 -0.003751 -0.001640 -0.000804 -0.000234 0.000996 
+-0.001073 0.001003 0.003831 -0.001785 0.000285 0.003019 
+-0.002166 0.000878 -0.002655 0.001513 0.003649 -0.004967 
+0.002728 0.001214 -0.003871 0.000170 -0.000172 -0.000294 
+-0.001806 -0.000002 0.001032 -0.000012 0.001508 -0.000007 
+-0.001575 0.001631 -0.000260 0.000366 -0.000684 -0.003509 
+0.000575 0.000299 -0.002807 -0.000981 0.001131 -0.000773 
+0.000020 -0.000005 -0.001681 0.002189 0.000378 -0.001722 
+0.001177 -0.000340 0.001102 0.000904 -0.000515 -0.000286 
+-0.000078 -0.000017 -0.000074 0.002654 0.005178 0.001842 
+0.008396 0.003430 0.003154 0.004084 0.004216 0.000988 
+0.000290 -0.000793 0.002736 -0.002402 -0.002136 0.002137 
+-0.001903 -0.004072 0.001369 -0.002766 -0.000948 0.001587 
+-0.001096 -0.000462 -0.001404 0.000215 0.001901 -0.006050 
+0.001917 0.005021 -0.006456 0.000711 -0.000959 -0.000304 
+-0.003934 -0.000621 -0.000517 -0.003533 0.002763 0.001302 
+0.000496 -0.002481 0.001091 0.002893 0.000408 0.000102 
+0.000061 0.003438 -0.001392 -0.001985 0.001201 -0.003329 
+-0.001575 -0.000913 -0.002005 0.000275 0.000263 -0.000248 
+0.003597 -0.000095 -0.000351 0.004442 -0.000828 -0.000216 
+0.003916 0.000271 0.001009 0.000280 -0.000841 0.001121 
+0.000323 -0.001200 0.001883 0.001695 -0.001122 0.002329 
+0.002240 0.001325 0.002536 0.002251 0.004450 0.002258 
+0.003085 0.005179 0.001212 0.000471 0.001108 -0.000410 
+-0.003456 -0.004103 0.001295 -0.001132 -0.004366 0.003559 
+-0.000596 -0.000167 0.000397 0.000352 0.003525 0.001057 
+0.001367 0.003883 -0.000434 0.000703 0.000875 0.000656 
+0.001438 -0.001317 0.000840 0.000608 -0.002400 0.000304 
+-0.000517 -0.000211 -0.000792 -0.000888 0.000073 -0.001353 
+-0.002745 0.000421 0.000919 -0.002555 -0.000368 0.003552 
+-0.002439 -0.002033 0.000244 -0.000209 0.001823 0.000235 
+-0.000856 0.004404 -0.000407 0.004430 0.003575 -0.008004 
+-0.001113 0.002277 -0.007064 -0.000782 0.002460 -0.006782 
+0.000858 0.001750 -0.002731 -0.000927 0.002194 -0.001655 
+-0.000440 0.002302 -0.001200 -0.000323 0.003090 -0.001770 
+-0.000862 0.003360 -0.000952 0.000142 0.001762 0.001873 
+-0.006179 0.001610 0.004829 -0.007354 -0.004233 0.006243 
+-0.000336 -0.000572 -0.000681 0.000046 -0.001312 0.000999 
+0.002335 0.001848 -0.001653 0.002084 0.001700 -0.003440 
+-0.001414 0.000666 -0.002640 -0.004060 -0.000608 -0.000246 
+-0.001926 -0.000079 0.000740 0.002553 0.000037 -0.001605 
+0.005315 -0.000890 -0.002287 0.003206 -0.002838 -0.000678 
+-0.002110 -0.003419 -0.000119 -0.003285 -0.002293 -0.001266 
+-0.000484 -0.000307 0.003341 0.000805 -0.001178 -0.000356 
+0.004310 0.000488 0.000610 0.001558 -0.003036 0.002490 
+-0.001088 -0.002546 0.002139 -0.001037 -0.002331 0.002592 
+-0.001760 -0.002480 0.003200 -0.002604 -0.004143 0.002889 
+-0.004046 -0.004876 0.000450 -0.002231 -0.003634 -0.004019 
+0.001750 0.000098 -0.003642 0.004263 0.002177 0.000056 
+0.002484 0.002399 0.001401 -0.001012 -0.000617 -0.000838 
+-0.002396 -0.004149 -0.002798 -0.002521 -0.002521 -0.001176 
+-0.000778 0.000627 -0.001058 0.001065 -0.000886 -0.003530 
+0.006473 0.001952 -0.006378 0.003205 0.005647 -0.004071 
+0.003228 0.002066 -0.000807 -0.000631 -0.000949 0.000821 
+-0.003366 -0.001503 0.001215 -0.003493 -0.000988 0.001378 
+-0.003871 0.000000 -0.000081 -0.001589 0.004377 0.000194 
+-0.002917 -0.001410 0.000195 -0.003499 -0.001300 0.001151 
+-0.002118 -0.002004 0.000974 -0.000385 -0.002692 0.000846 
+0.001018 -0.002864 0.002099 -0.000630 -0.001158 0.002066 
+0.002113 0.003451 0.001338 0.003308 0.001022 0.003569 
+0.002839 -0.001185 0.003626 0.002462 -0.004045 0.002930 
+-0.000883 -0.002582 -0.000010 -0.000030 0.002746 -0.000427 
+0.000244 0.003890 -0.002327 -0.000789 0.000513 -0.001004 
+-0.001412 -0.001313 0.000715 0.000595 0.000165 -0.000139 
+0.002283 0.000650 0.000457 0.000726 -0.001516 -0.000758 
+-0.002565 -0.005573 -0.001356 -0.006382 -0.004106 0.001138 
+-0.001029 -0.000888 0.000726 0.002033 0.003758 -0.002341 
+0.003041 0.002723 -0.002829 0.001657 -0.000214 -0.000374 
+-0.000853 0.002093 0.001938 -0.001093 0.004958 0.001111 
+-0.000174 0.003852 -0.000875 -0.001791 0.002090 -0.001172 
+-0.001398 0.000324 -0.005017 -0.002230 0.000464 -0.008627 
+-0.001674 0.001969 -0.006761 -0.000014 0.000832 0.000054 
+0.000322 0.001400 0.001746 0.000048 0.002412 -0.000128 
+0.001102 0.002566 -0.002862 -0.000588 0.001303 0.000864 
+-0.002791 -0.004395 0.003128 0.002296 -0.005935 0.003826 
+-0.000160 -0.001984 0.003306 -0.000017 0.000889 -0.000799 
+-0.001972 0.001159 -0.001334 -0.006189 -0.002470 0.000410 
+-0.007579 -0.005819 0.002616 -0.003831 -0.004141 0.002916 
+0.001732 -0.000041 0.000484 0.003729 0.000297 -0.001191 
+0.001904 -0.001747 0.000518 -0.000208 -0.002612 0.004194 
+-0.005399 -0.004094 0.007892 -0.005333 -0.011067 0.005733 
+-0.003223 -0.011405 0.004959 -0.004538 0.002269 0.003193 
+-0.000274 0.001739 -0.001835 0.000422 0.005382 -0.001935 
+0.000345 0.004516 0.000129 0.001863 0.002891 -0.000343 
+0.000046 -0.000006 -0.000036 -0.002328 0.000464 0.002101 
+-0.003406 -0.001811 0.001377 -0.000345 0.000524 -0.000177 
+0.001854 0.001943 -0.003846 0.001067 0.000192 -0.003519 
+-0.000509 0.000431 0.001014 -0.000838 0.001818 0.001967 
+-0.000160 0.002320 0.000160 -0.001358 0.000540 -0.001660 
+-0.003187 -0.000552 -0.002014 -0.002964 -0.001628 -0.001438 
+0.001956 -0.000011 -0.001637 0.004302 0.002609 -0.004275 
+0.002846 0.001662 -0.004739 0.000816 0.001803 -0.001089 
+0.000189 0.000136 -0.000557 -0.005247 -0.002862 0.000075 
+-0.007374 -0.002600 0.001941 -0.003765 0.000941 0.001923 
+-0.000636 -0.000795 -0.000583 -0.000076 -0.001984 -0.000744 
+-0.000328 -0.002509 -0.001236 0.002107 -0.001677 0.000133 
+0.002920 -0.001962 0.001612 0.002791 0.000446 0.000633 
+0.002070 0.000124 -0.000796 0.000392 0.000141 0.003365 
+0.001838 0.000074 0.004706 0.001205 -0.003979 0.004036 
+-0.000635 -0.004206 -0.000952 -0.003298 -0.002069 0.002057 
+-0.003497 0.001253 0.001723 -0.002949 0.002564 -0.002051 
+-0.001115 -0.000929 -0.001024 -0.000710 -0.000542 -0.000318 
+0.001729 0.001205 0.000544 0.004209 0.002677 -0.000324 
+0.002263 0.000720 -0.001811 0.000073 -0.001707 0.000024 
+-0.000870 -0.001210 0.000746 0.000917 0.001550 -0.002064 
+-0.000694 0.002778 -0.003910 0.001248 0.002857 -0.002496 
+-0.000178 0.000941 -0.001120 0.000211 0.002211 -0.000577 
+0.000743 0.004031 -0.000601 -0.000224 0.001932 -0.003332 
+-0.000220 -0.000049 -0.002028 0.000108 -0.001656 -0.002005 
+-0.002994 0.000509 -0.003347 -0.000145 0.001902 -0.002813 
+-0.000319 0.000933 -0.001690 -0.000494 -0.000088 -0.001364 
+-0.000325 -0.000632 -0.000088 0.000609 0.001031 0.000252 
+0.000952 -0.000260 0.001333 0.001571 -0.001714 0.000952 
+0.003820 -0.002388 -0.000455 -0.001049 -0.001301 0.000213 
+-0.000237 -0.004083 0.002010 0.000792 -0.002295 0.002771 
+-0.002340 0.000425 0.002198 0.000213 0.001920 0.000640 
+0.000388 -0.000383 -0.001191 0.000882 -0.001330 0.001229 
+-0.000609 0.000629 0.002594 -0.002824 -0.000827 -0.000103 
+-0.001172 -0.001231 0.000439 -0.000933 -0.000800 -0.001016 
+-0.001448 -0.000762 -0.001684 -0.001868 -0.001593 -0.000307 
+-0.005169 0.002136 -0.001068 -0.003529 -0.000581 -0.001777 
+0.000029 -0.002368 -0.000846 0.000820 -0.000847 0.000053 
+-0.001038 0.000654 0.001385 -0.003161 -0.000396 0.002963 
+-0.002088 -0.002509 0.003674 -0.002655 -0.002440 0.001489 
+0.001668 -0.000778 0.000123 0.000747 0.000770 0.000711 
+-0.001637 0.001821 0.001457 -0.000451 0.000908 0.001514 
+0.000554 -0.000806 -0.000658 0.000562 0.001145 -0.002530 
+0.000218 -0.000645 -0.000318 0.001393 0.000348 -0.002786 
+0.000354 0.001239 -0.004692 0.000276 0.001378 -0.004252 
+-0.001520 -0.000800 -0.001360 -0.001359 -0.002065 0.001725 
+0.001087 -0.006435 -0.003217 0.000577 -0.007059 0.000385 
+-0.000151 -0.004527 0.000453 0.000725 -0.001155 -0.000144 
+0.001136 -0.000224 0.000598 -0.000180 -0.003074 0.002560 
+-0.001883 -0.005932 0.003722 -0.002874 -0.004751 0.004364 
+-0.002122 -0.000357 0.003313 -0.001317 0.000829 0.000871 
+-0.002700 0.000558 0.000379 -0.003923 0.000259 0.000399 
+-0.002198 0.001862 -0.000046 -0.000763 0.003051 -0.000781 
+-0.000554 0.003875 0.000711 -0.001017 0.002626 0.001701 
+-0.001107 0.000402 0.001106 -0.000439 -0.000330 0.000078 
+0.000053 -0.000211 0.000299 0.000211 -0.000435 0.001025 
+0.000705 0.001039 -0.000633 0.005268 0.001891 -0.004007 
+0.008411 -0.000716 -0.002255 0.005647 -0.003954 -0.006216 
+0.006541 0.002386 -0.006664 0.004756 0.000212 -0.002299 
+0.002599 -0.000670 -0.001190 0.001646 -0.000921 -0.000558 
+0.000109 0.003125 0.000219 0.000190 0.002101 0.001142 
+0.002206 0.002906 0.002407 -0.000042 0.000075 -0.000442 
+-0.000589 0.001934 -0.002612 -0.000891 0.004417 -0.005551 
+0.003781 0.004303 -0.003259 -0.000414 0.002607 -0.000822 
+0.000368 -0.001801 0.001772 0.000393 -0.003367 0.002007 
+-0.001945 -0.001014 0.000254 -0.001010 -0.001009 0.000204 
+-0.003511 0.000070 0.000106 -0.003963 0.000657 -0.000757 
+-0.003748 -0.001572 0.004111 -0.002203 -0.000618 0.003802 
+-0.001611 0.001350 -0.000339 -0.001864 -0.000160 -0.004446 
+0.001441 -0.001000 -0.000834 0.002447 0.000939 -0.000448 
+-0.001459 -0.000212 0.001039 -0.004705 -0.000714 0.002850 
+-0.003189 0.001633 0.001975 0.001855 0.001774 0.001774 
+0.002891 0.004277 -0.002915 0.001239 0.002241 -0.001918 
+0.000077 0.000119 -0.000268 -0.001277 -0.000514 0.002735 
+-0.002255 0.000010 0.002763 0.000557 0.000192 0.000979 
+0.000085 0.000024 -0.000412 0.000786 0.001408 -0.001138 
+0.000978 0.002457 -0.000493 0.000876 0.000809 0.000893 
+0.000000 -0.002302 0.002302 -0.001429 -0.000535 -0.000334 
+-0.000138 0.001264 0.000717 0.001360 0.003114 0.002056 
+0.001045 0.003093 0.001992 -0.000534 0.002443 0.000534 
+-0.002397 0.001250 -0.000174 0.000378 0.001705 -0.000303 
+-0.000544 0.000816 -0.004135 0.002058 -0.001772 -0.002730 
+0.002989 0.000703 -0.003516 0.001888 0.000185 -0.001734 
+0.000238 -0.000238 -0.002143 0.000825 -0.000317 0.001206 
+-0.003748 -0.009270 0.002604 -0.000371 -0.004967 -0.001969 
+0.003619 -0.000757 -0.003520 0.000979 0.000965 -0.002946 
+0.000843 -0.001966 0.002097 -0.000694 0.000347 0.004876 
+-0.003603 -0.004441 0.003531 -0.001056 -0.001320 0.000616 
+0.000014 -0.000223 0.000366 -0.002182 -0.000637 0.000389 
+-0.002763 -0.005000 -0.000213 -0.003065 -0.004932 0.003089 
+-0.001333 -0.001215 -0.001144 0.001824 -0.000523 -0.001913 
+0.002030 0.001127 -0.000396 -0.000437 -0.001117 0.003140 
+-0.006997 -0.002214 0.004872 -0.006624 -0.003434 0.004959 
+-0.002939 -0.002912 0.000595 -0.000543 -0.000962 -0.000488 
+-0.001124 0.001686 -0.004923 0.001808 0.002071 0.001079 
+0.000078 0.001008 0.002016 0.000771 0.000140 -0.000543 
+0.003370 0.004500 -0.004278 0.007803 0.005209 -0.002603 
+0.006649 0.001916 -0.004752 0.002647 -0.000902 -0.002045 
+0.000700 -0.001796 -0.000094 0.000466 -0.001812 0.000958 
+-0.000507 0.000641 0.001548 0.000192 -0.000096 0.001474 
+-0.000253 0.001799 -0.000867 0.001915 0.005357 -0.006095 
+0.002801 0.000326 0.000560 -0.000771 0.000669 -0.001459 
+0.000506 -0.001189 0.001888 -0.000057 -0.001376 0.002279 
+0.002261 -0.002128 0.000532 0.001167 -0.000227 -0.002333 
+-0.000269 0.001336 0.000134 -0.000700 0.003729 -0.001196 
+-0.000244 0.002490 -0.002526 -0.000367 0.000926 -0.000255 
+0.000178 -0.000966 0.000480 -0.000619 -0.000812 0.000975 
+0.001478 0.000236 -0.000780 0.002809 -0.000862 -0.000771 
+0.001902 -0.000490 -0.001445 -0.001091 -0.000636 -0.000932 
+-0.002641 -0.001412 -0.001403 -0.002079 -0.000151 -0.003005 
+-0.003854 0.000495 -0.002917 -0.005675 0.001951 -0.000266 
+-0.006853 0.001147 0.002267 -0.004683 -0.000907 0.000075 
+0.001236 -0.000017 -0.002810 0.004146 -0.000153 -0.003057 
+-0.000913 0.001017 0.001537 -0.002923 -0.003341 0.006172 
+-0.007928 -0.002581 0.007373 -0.001684 0.000217 0.006194 
+-0.001613 -0.000242 0.003468 -0.001486 -0.001897 -0.000853 
+0.000379 -0.002128 -0.000405 0.004323 -0.000980 -0.000044 
+0.006645 0.001414 -0.002574 0.005629 0.002081 -0.003817 
+0.001898 0.000190 -0.003654 -0.000659 0.002333 -0.002159 
+-0.003144 0.003043 -0.000812 -0.003621 0.001650 0.001828 
+-0.001915 0.000661 0.001180 -0.000140 0.000046 -0.000007 
+0.000933 -0.000301 0.000373 0.003330 -0.000106 -0.002550 
+-0.002701 -0.002044 0.000657 -0.000631 -0.000714 -0.000742 
+0.000477 -0.005362 0.002383 -0.002692 -0.005362 0.002777 
+-0.002258 -0.002661 0.000625 0.002311 0.000074 -0.000836 
+0.004139 0.001497 0.001057 0.001429 0.003063 0.003500 
+0.000690 0.002857 0.005451 -0.004116 -0.005661 0.007203 
+-0.002002 -0.003882 0.002434 0.000352 -0.000472 -0.000191 
+0.001879 0.001352 0.001484 -0.001909 -0.000259 0.000245 
+-0.006317 -0.003250 0.001518 -0.006124 -0.005085 0.002186 
+-0.004493 -0.003090 0.001125 -0.003629 -0.002203 0.000907 
+-0.003858 -0.003858 0.000551 -0.002947 -0.002493 0.001364 
+-0.001443 0.002852 -0.000492 -0.000383 0.003603 0.000031 
+0.000951 0.000542 0.000754 0.000904 -0.002107 -0.000512 
+0.000423 -0.001996 -0.002701 0.001395 0.001085 0.000155 
+0.004996 -0.001064 -0.001637 0.001846 0.000348 0.001394 
+-0.003583 -0.002483 0.005799 -0.002932 -0.005263 0.003684 
+-0.003414 0.001987 0.002855 -0.000239 0.001693 -0.001540 
+-0.000306 0.003168 -0.002075 0.000241 0.002097 -0.001367 
+-0.000849 -0.001219 -0.001490 0.001439 -0.004198 0.001007 
+0.001198 -0.005938 0.002774 -0.001275 -0.005965 0.002503 
+0.001644 -0.001018 -0.000786 0.000945 -0.000517 -0.002622 
+0.002517 0.002254 -0.001291 -0.000444 0.002542 -0.001309 
+-0.001262 0.001082 0.001371 0.000325 0.002439 -0.000488 
+0.000185 0.001029 -0.003179 0.001589 -0.000403 -0.004411 
+0.004189 0.001356 -0.004558 0.002944 0.003680 -0.004655 
+0.001991 0.002090 -0.001642 0.000000 -0.001150 0.000796 
+0.000181 -0.001064 0.001112 0.001664 0.002528 -0.001782 
+0.002899 0.001949 -0.005865 0.003032 -0.000129 -0.002633 
+0.001366 -0.001926 -0.002306 0.001435 -0.003052 -0.001325 
+0.000021 0.000469 -0.001449 0.003865 0.005153 -0.001103 
+0.001926 0.007838 -0.001527 -0.000768 0.002347 0.000137 
+-0.007541 -0.002911 0.002184 -0.007433 -0.003649 0.000901 
+-0.002971 0.001804 -0.000849 0.001794 0.003690 -0.005058 
+0.003388 0.001009 -0.004291 0.001398 -0.000478 -0.002690 
+0.000618 0.000446 -0.001372 0.001431 0.003299 -0.001606 
+0.004118 0.004387 0.001395 0.001223 -0.000920 0.001513 
+0.001541 0.001739 0.000286 -0.000419 0.001465 -0.002407 
+-0.000605 0.001999 -0.001556 0.000081 0.000135 -0.000194 
+0.000906 -0.000063 0.000881 -0.000234 0.000117 -0.000352 
+0.001083 0.000920 0.001905 0.000601 0.001346 0.002055 
+-0.004504 -0.000840 0.004656 -0.000962 0.000641 0.006591 
+-0.001266 0.001452 0.002439 0.005480 0.007559 -0.001827 
+-0.000807 0.004755 -0.005474 0.000633 0.001685 -0.001171 
+-0.004032 -0.004031 0.000806 -0.003181 -0.005140 -0.001240 
+-0.001150 -0.002748 -0.001399 0.000133 -0.001165 0.002529 
+0.001765 0.000566 0.000113 0.002636 0.002686 0.000321 
+0.002631 0.003283 -0.002005 -0.000417 0.001615 -0.001224 
+-0.000008 -0.000590 0.000404 0.000408 -0.000539 0.001240 
+-0.000811 0.001069 0.002912 0.000521 -0.000132 0.000496 
+-0.001228 0.001145 -0.000768 -0.000846 -0.001292 -0.000646 
+-0.002443 0.000076 -0.001221 0.000265 -0.000872 -0.000960 
+0.000070 0.000853 -0.001175 -0.000951 -0.000221 -0.000365 
+-0.002944 -0.002208 -0.000849 -0.002432 -0.001521 -0.000354 
+0.003505 0.000902 -0.003067 0.003058 0.003285 -0.008516 
+0.008200 0.000925 -0.007275 -0.000489 0.001360 -0.009233 
+-0.000291 0.002460 -0.007868 -0.001545 0.004816 -0.001671 
+0.003296 0.005483 0.007341 0.000058 0.006180 0.008666 
+-0.000825 0.003499 0.002906 0.000230 0.000162 -0.000966 
+0.000519 0.000000 -0.000519 0.002261 -0.005559 0.002186 
+0.000631 -0.003315 -0.000346 0.002600 0.004778 0.000484 
+0.002970 0.001176 -0.000569 -0.004674 -0.000496 0.004047 
+-0.003700 -0.001278 0.007501 -0.002701 -0.000386 0.001811 
+0.001671 -0.001666 -0.004169 0.003295 -0.001469 -0.004986 
+0.001802 0.000068 -0.002753 0.002841 0.002095 0.000453 
+0.006045 0.004594 -0.002257 0.007972 0.003355 -0.003773 
+0.001405 0.002262 -0.004250 -0.006842 -0.004149 -0.002940 
+-0.009565 -0.008948 0.000378 -0.006087 -0.004882 0.003550 
+0.000675 -0.000199 0.000931 0.002206 -0.000885 -0.001687 
+0.000342 0.001253 0.001004 -0.000092 0.006984 -0.000018 
+0.001494 -0.001662 -0.002293 0.000340 -0.001047 -0.001137 
+-0.000720 -0.000947 -0.000291 0.000252 0.000807 0.000025 
+-0.000249 -0.000543 -0.001443 -0.001214 -0.000700 -0.001526 
+-0.003560 -0.000011 -0.000929 -0.002547 -0.000332 -0.001263 
+0.001381 0.001621 0.000865 0.004653 0.002540 0.003638 
+0.004954 0.003749 0.004094 0.002806 0.003021 0.002957 
+0.000459 0.001811 0.000470 -0.001931 0.000706 0.002237 
+-0.002002 -0.002305 -0.000637 -0.000201 -0.003953 0.001374 
+-0.002097 -0.001951 0.000926 -0.001747 0.000450 0.000865 
+-0.001223 0.000982 -0.000858 -0.001625 0.000997 -0.003040 
+0.000584 0.002950 -0.003564 0.002862 -0.000572 0.000630 
+0.001049 -0.000629 0.005891 0.001269 0.001269 0.006077 
+-0.000097 -0.000766 0.000577 0.003095 -0.000335 0.000056 
+0.001920 -0.001528 0.001257 0.002787 -0.001976 0.002849 
+0.002552 0.000102 0.002589 -0.001103 0.001549 0.002711 
+-0.000002 0.000072 -0.000598 -0.001344 -0.001680 -0.002000 
+-0.001929 -0.005647 -0.002230 -0.002500 -0.004268 0.003415 
+-0.000478 0.000107 -0.000733 0.000755 -0.001146 -0.002214 
+0.001619 -0.001999 -0.002189 0.001183 0.000844 -0.004394 
+0.000757 0.002191 -0.005172 -0.000045 0.002571 -0.002881 
+-0.002299 -0.000755 0.000157 -0.002826 -0.001964 0.002840 
+-0.001675 -0.000726 0.001219 0.000661 0.001622 -0.002749 
+0.002615 0.003002 -0.003752 0.002576 0.000076 -0.002652 
+-0.002504 -0.001701 -0.001905 0.000123 -0.001020 -0.003146 
+0.000429 0.000779 -0.003795 0.000061 -0.001156 0.000529 
+0.000893 -0.005690 0.001995 0.000910 -0.004611 0.001240 
+0.001486 -0.002535 -0.001523 0.001527 0.000050 -0.001111 
+-0.001324 -0.001412 -0.001735 -0.001038 0.001038 -0.000231 
+0.000076 0.001489 -0.001183 0.000047 0.000226 -0.001949 
+-0.001499 -0.000157 0.000230 -0.005372 -0.000364 0.002823 
+-0.005324 -0.000495 0.000960 -0.001247 -0.000852 0.000562 
+-0.000132 0.000530 -0.001457 -0.001558 -0.000437 -0.000738 
+-0.001174 -0.001066 0.000479 0.000567 0.000851 -0.001066 
+0.002405 0.003982 -0.001737 0.002531 0.003348 -0.000871 
+-0.003343 0.002550 -0.000198 -0.001705 0.001683 -0.000395 
+0.002080 0.001713 0.000028 0.001426 0.001481 -0.001277 
+-0.001484 -0.000865 -0.002100 -0.002577 -0.002157 -0.000868 
+-0.001554 0.000322 0.000624 -0.000780 0.002950 -0.000929 
+-0.001214 0.002196 -0.002404 -0.001965 0.000758 -0.001995 
+-0.003106 -0.001856 -0.000644 -0.002067 -0.000750 -0.002237 
+-0.005594 0.003109 -0.001598 -0.000615 0.003381 0.000589 
+-0.000973 0.004018 -0.003390 -0.003262 0.002447 0.000233 
+-0.002665 0.005362 0.002729 0.002399 0.006217 -0.000384 
+0.007041 0.002776 -0.005044 0.003735 -0.001019 -0.007760 
+0.001721 0.001238 -0.003896 -0.002964 -0.000071 0.002430 
+-0.003181 0.002469 0.000702 0.000365 -0.002856 -0.000888 
+0.000580 -0.004239 -0.000936 -0.000904 -0.003818 0.003943 
+-0.005407 -0.003346 0.004182 -0.004193 -0.002743 0.002585 
+-0.003572 -0.000872 0.001267 -0.003081 0.001313 0.001768 
+-0.003226 -0.001075 -0.000376 -0.000827 0.002030 0.000000 
+0.002556 -0.001141 -0.001331 0.002632 -0.001273 -0.002108 
+0.000969 -0.000277 0.000027 0.001611 -0.001277 0.003556 
+-0.001509 0.001223 0.003278 0.001408 0.001375 0.000846 
+0.000512 -0.000716 -0.000039 -0.001474 -0.002279 -0.002653 
+0.002168 -0.004859 -0.001090 0.002088 -0.004865 0.001944 
+0.002210 -0.001526 0.000882 -0.000304 -0.000306 -0.001534 
+0.000057 0.000149 -0.000926 -0.000179 0.000626 -0.000677 
+0.001421 0.002523 -0.002451 0.003960 0.000778 -0.001008 
+0.000387 0.001463 0.000800 -0.000078 0.001960 0.000575 
+-0.000148 0.000816 0.001087 0.000314 -0.000054 -0.003244 
+-0.000283 0.001130 -0.007008 -0.001269 0.002537 -0.007612 
+0.006537 0.002144 -0.003321 0.001382 0.004923 -0.004608 
+0.000335 0.002598 -0.001176 -0.006374 0.000921 0.005609 
+-0.000095 0.001966 0.000267 0.000305 0.001915 0.003708 
+0.000000 0.002158 0.001799 0.001270 0.000159 0.001587 
+-0.001042 0.005683 -0.002746 -0.003976 0.006067 -0.003402 
+0.003545 0.003164 -0.000507 -0.001198 -0.001363 -0.000328 
+-0.003541 -0.002205 -0.002739 -0.003277 0.001514 -0.000754 
+-0.003134 -0.002231 -0.001346 -0.002192 0.001141 -0.000893 
+-0.001615 0.000047 0.000665 -0.000764 -0.001953 -0.000413 
+-0.000239 -0.002492 -0.001451 -0.000109 -0.002011 -0.000732 
+-0.000363 -0.001451 0.000917 -0.000169 0.000339 0.001271 
+-0.002288 -0.000805 -0.000720 -0.002357 0.000955 -0.001537 
+-0.002508 0.000000 -0.000251 -0.001003 -0.004003 -0.000399 
+-0.000167 -0.000950 -0.002850 -0.002912 -0.002423 0.000009 
+-0.000509 -0.002863 0.003499 0.001103 -0.000449 0.002378 
+-0.001280 0.000467 -0.000769 -0.007122 -0.003781 0.002561 
+-0.002274 -0.006217 0.005914 0.000469 -0.004682 0.003906 
+-0.001169 -0.000235 -0.000897 -0.000952 -0.001063 0.000056 
+0.000095 0.000834 -0.000606 0.001743 0.001846 0.001525 
+0.001982 0.002336 0.000177 0.000942 0.000594 0.000575 
+-0.002703 -0.000179 -0.000677 -0.003049 0.000554 0.000310 
+-0.001274 0.000376 0.000067 -0.000864 0.002141 0.003234 
+-0.002980 0.001284 0.002686 -0.001475 -0.002541 0.000373 
+0.002812 -0.001920 0.002676 -0.001743 -0.004641 0.002917 
+-0.001360 -0.003123 -0.000093 -0.002260 -0.001333 0.000389 
+-0.000064 -0.000120 0.000029 0.000773 0.000905 -0.002016 
+-0.000400 -0.001119 0.000537 -0.000336 -0.004605 0.003722 
+0.002042 -0.004790 0.001967 -0.000681 -0.001865 0.000338 
+0.000533 0.001104 -0.002932 -0.000431 0.000473 0.000494 
+-0.000830 0.000578 0.000366 -0.000120 -0.002409 0.000013 
+0.002100 -0.002311 0.001591 0.000312 0.000084 0.001765 
+-0.001691 -0.001063 0.001755 -0.004175 -0.002934 0.002545 
+-0.004221 -0.002249 0.000177 0.002385 -0.001534 0.001930 
+-0.000315 -0.001905 0.002520 0.000529 0.000940 0.001454 
+0.001270 0.000757 0.001596 0.001334 0.000869 0.001354 
+0.001144 0.000764 0.000955 -0.000388 -0.000050 -0.000589 
+0.000522 0.000852 -0.000433 -0.000469 -0.002370 -0.000837 
+-0.000053 -0.002945 -0.001995 0.000377 -0.000420 -0.000095 
+0.000490 -0.003935 0.003537 0.001402 -0.003120 0.005658 
+-0.000723 -0.007143 0.007372 -0.004333 -0.007583 0.001181 
+0.000021 -0.001096 -0.000453 -0.000913 0.005537 -0.003740 
+0.002465 0.004796 -0.004482 0.002275 -0.000909 -0.001959 
+0.000956 -0.002699 -0.001715 -0.000671 -0.003471 0.000557 
+-0.001560 0.000752 0.000694 -0.003695 -0.003438 0.000924 
+-0.002813 -0.003102 -0.001861 -0.001172 -0.003047 -0.001875 
+0.000612 -0.001360 -0.002381 0.002465 -0.001122 -0.002019 
+0.003416 -0.002410 -0.002807 0.002774 -0.001569 -0.005662 
+-0.001239 0.000780 -0.003537 0.000277 0.007039 -0.000603 
+0.000038 0.001621 -0.001140 -0.002359 -0.001825 0.000166 
+-0.001193 -0.002428 -0.004047 -0.003664 -0.000932 -0.003555 
+-0.001419 0.003817 -0.006183 0.002327 -0.001552 -0.004444 
+-0.000155 -0.005965 -0.000619 0.000501 -0.005870 0.003864 
+-0.001421 -0.004600 0.004669 -0.000762 -0.000752 0.005419 
+0.000301 -0.000973 0.004674 -0.003797 -0.000422 0.006131 
+0.002013 0.000212 0.003797 0.002293 -0.000734 0.004503 
+0.002051 0.002158 0.002899 0.001161 0.002483 -0.002375 
+0.000060 0.000896 -0.003583 0.000291 -0.001395 -0.003782 
+0.003634 -0.000627 -0.002381 0.002165 -0.000593 -0.004725 
+0.004378 -0.001923 -0.001509 -0.001129 -0.001440 -0.002980 
+-0.002148 0.001513 -0.001420 -0.005289 -0.004716 0.001381 
+0.001672 -0.000104 0.006480 -0.003540 -0.003828 0.008850 
+0.001063 -0.004750 0.001642 -0.001673 -0.005583 0.001340 
+-0.004084 -0.003628 0.000939 -0.003582 0.000037 -0.000037 
+-0.000539 0.001951 -0.001596 0.001923 0.001776 0.000246 
+0.001166 -0.001977 -0.000017 -0.001014 -0.003043 0.001014 
+-0.001929 -0.003025 -0.002845 -0.001484 -0.001387 -0.004074 
+0.002620 0.001780 -0.006651 -0.000629 0.003572 -0.002686 
+-0.000115 0.000365 -0.001383 -0.000610 -0.001624 0.000509 
+-0.001399 -0.001399 -0.001538 -0.000259 -0.001542 -0.001027 
+-0.001789 -0.000976 0.000054 -0.003253 -0.001133 0.001351 
+-0.003004 -0.001273 -0.000656 -0.001988 0.000008 -0.004006 
+0.000202 0.002042 -0.001496 -0.000797 0.000369 -0.000420 
+-0.000474 -0.001125 0.002575 0.000192 -0.001155 0.003269 
+0.000488 0.000259 0.002294 0.000216 0.001081 0.001241 
+-0.002502 -0.000524 0.000929 -0.003488 0.000493 -0.000803 
+-0.002427 0.000260 -0.001777 -0.001543 0.002424 -0.000967 
+-0.000276 0.005417 -0.001411 0.000370 0.006432 -0.001582 
+0.000150 0.001064 -0.000006 -0.006890 -0.007152 0.001157 
+-0.000340 -0.004966 -0.002327 -0.000456 0.000091 -0.001591 
+0.000020 0.003393 -0.007257 0.009782 -0.002044 -0.004001 
+-0.001248 -0.001940 -0.005313 -0.002262 0.004553 -0.003044 
+-0.006836 0.002994 0.000678 -0.003742 -0.000499 -0.001538 
+-0.000536 -0.000271 -0.001344 0.000324 -0.000480 -0.001435 
+-0.000766 -0.000191 0.000159 -0.002578 -0.001570 0.001963 
+-0.001912 -0.003022 0.003323 -0.000475 -0.001025 0.001139 
+0.001083 0.001083 -0.003167 -0.000898 0.003453 -0.003314 
+-0.001116 0.000909 0.000091 -0.002923 0.000863 0.001007 
+-0.003500 0.000726 0.002950 0.001071 0.001836 0.002905 
+0.004098 0.005797 -0.000674 0.004345 0.006679 -0.003483 
+0.001571 0.001452 -0.003870 0.003605 0.000646 -0.002137 
+0.004016 0.001429 -0.001608 0.000610 0.000838 -0.001029 
+-0.002253 -0.003814 -0.000517 -0.005716 -0.003258 0.004457 
+0.002508 -0.001791 0.006279 0.000795 -0.000030 0.004002 
+0.007088 0.003459 -0.003037 0.004347 -0.001755 -0.005937 
+-0.000543 -0.002988 -0.003145 0.001320 0.000358 0.001994 
+0.003624 0.000516 0.000881 -0.000799 0.001672 0.000923 
+-0.001778 0.001511 0.001570 0.000088 -0.003178 0.006092 
+-0.000831 -0.000547 0.004409 -0.001974 0.000280 0.002289 
+-0.002389 -0.000413 0.001169 -0.000812 -0.002266 -0.000406 
+0.005087 0.000871 0.001346 0.001747 0.000582 0.002621 
+-0.000749 0.000108 0.001877 -0.000515 0.000606 -0.002000 
+0.003492 0.002886 -0.003731 0.002992 -0.000915 0.000131 
+-0.002521 -0.003361 -0.000233 -0.004070 -0.003984 -0.001473 
+-0.004374 -0.003245 -0.002060 -0.003752 -0.004111 -0.000745 
+0.002374 -0.000707 -0.004040 0.000000 -0.001119 -0.007985 
+0.002337 -0.002057 -0.004986 -0.000192 -0.000761 -0.001648 
+-0.000792 -0.001574 0.001545 0.000087 -0.000493 0.000104 
+-0.000903 -0.000395 -0.000158 0.001877 -0.001377 -0.001528 
+0.002547 -0.000739 -0.002855 0.001448 0.001629 -0.003112 
+-0.000998 0.003268 -0.003449 -0.001127 0.000137 -0.001554 
+0.000242 -0.002877 -0.001668 0.000672 -0.004960 0.001344 
+0.000349 -0.002946 0.001667 -0.000373 -0.000215 -0.000203 
+0.000023 0.001321 -0.000236 0.001548 0.001119 -0.000376 
+0.000964 -0.000307 0.000458 -0.001660 -0.000629 0.001763 
+-0.001311 0.000208 -0.001299 -0.000077 -0.000905 -0.004430 
+0.004734 0.003510 -0.010013 0.010666 0.005778 -0.004118 
+-0.003718 0.007683 -0.001873 -0.001030 0.007348 -0.002992 
+0.001033 0.006581 -0.004634 -0.000981 0.006917 -0.008896 
+0.001508 0.007500 -0.000151 -0.002493 0.003268 -0.000487 
+-0.000674 0.000208 -0.000515 0.000046 0.002807 0.000426 
+0.000107 -0.000675 -0.000196 0.003681 -0.002937 -0.004591 
+-0.001165 -0.004255 -0.004282 -0.003291 -0.001411 -0.001776 
+-0.000178 0.001856 0.000908 0.000387 0.003289 0.001824 
+0.001077 0.000790 0.000748 0.000429 -0.003149 -0.001374 
+-0.001293 -0.002631 0.000231 -0.003310 0.002577 -0.000971 
+-0.003546 0.004277 -0.002296 0.003217 0.001911 -0.001783 
+0.007198 -0.001726 -0.004988 0.006900 -0.004389 -0.004639 
+0.002925 -0.002052 -0.003837 0.000109 -0.000232 -0.001175 
+-0.001207 0.000204 -0.000194 -0.001383 -0.001491 -0.001597 
+-0.001826 -0.002481 0.000050 -0.000371 0.000430 -0.000156 
+0.001038 0.000770 -0.001674 0.001328 0.000250 -0.000125 
+0.001068 -0.000203 0.001984 -0.000500 -0.000507 0.002004 
+-0.000490 -0.000471 0.000716 -0.003767 -0.004853 -0.003732 
+-0.000694 -0.003562 0.000069 -0.003311 0.001511 0.002855 
+-0.001832 0.000950 0.004636 -0.002634 -0.000153 0.002634 
+-0.000363 -0.002341 0.001154 0.001138 -0.001244 0.000676 
+-0.000196 0.002465 0.003055 -0.003827 0.001900 0.004637 
+0.000169 -0.003898 0.000508 0.000219 -0.001694 -0.000055 
+0.000259 -0.001811 0.001270 0.001973 -0.001339 0.001738 
+0.002317 0.000631 0.002526 0.001579 -0.000723 0.001847 
+0.005091 0.004264 -0.001559 0.001943 0.001310 0.000649 
+-0.000756 -0.002269 -0.000756 -0.000103 -0.004238 -0.001111 
+0.002695 -0.001554 -0.004456 0.003317 -0.000708 -0.003372 
+0.001855 0.000205 -0.001237 -0.000469 -0.000152 0.000572 
+0.000784 -0.002353 0.001223 -0.003125 -0.007728 0.000296 
+-0.002478 -0.005381 0.005296 0.000915 -0.002136 0.002230 
+0.000267 -0.000296 0.000539 0.000170 -0.000648 0.000800 
+-0.001526 -0.001152 0.001942 0.000267 -0.000950 -0.002014 
+0.001394 -0.004940 -0.002231 0.000985 -0.002982 0.000684 
+0.000748 -0.000783 0.000944 0.000258 0.000597 0.001292 
+0.000181 0.000757 0.000560 0.000308 -0.000855 -0.000785 
+0.003630 0.000275 0.001634 0.003653 0.000576 -0.000518 
+0.002571 -0.000190 0.000747 0.000650 -0.000952 -0.005741 
+0.004651 0.000842 -0.007943 0.003921 0.000397 -0.002081 
+0.000857 0.000363 0.001237 -0.000261 0.000427 0.003126 
+-0.000731 0.002152 -0.000234 -0.000382 0.001204 0.001305 
+0.000748 0.003034 0.002045 -0.000522 0.001557 0.000774 
+-0.001501 -0.000692 -0.000438 0.000235 0.000171 0.000374 
+0.000494 0.003591 -0.000582 0.008393 -0.000735 -0.003462 
+0.000039 -0.000204 -0.001169 -0.000812 -0.000649 -0.000980 
+-0.000382 0.003618 -0.001206 0.002314 0.001865 0.000609 
+0.001632 -0.001791 -0.000474 -0.002551 -0.003359 -0.000404 
+-0.003460 -0.003449 0.003894 -0.002517 0.000248 0.002319 
+0.001569 0.000316 -0.001671 0.003249 0.001573 -0.001756 
+-0.000398 0.001767 -0.001026 -0.003348 0.000052 0.000462 
+-0.002337 0.002308 0.001687 0.000035 -0.000039 -0.000005 
+0.000296 0.003556 -0.001333 -0.000460 -0.000260 -0.000640 
+-0.000240 -0.000080 -0.000240 -0.000161 0.001935 0.002097 
+0.003360 0.004193 0.002526 0.001675 0.001955 0.004119 
+0.001716 0.000651 0.001937 0.002337 -0.002535 -0.000088 
+0.003518 -0.004610 0.001942 0.003648 -0.004365 0.004168 
+0.000508 -0.003559 0.003664 0.000019 0.000050 0.000181 
+0.002673 0.001370 -0.001610 0.003730 0.001858 -0.002293 
+0.001988 0.001045 -0.002485 0.000634 -0.000210 0.001532 
+0.003322 -0.001040 0.001845 0.003411 0.000057 0.002322 
+0.001991 -0.001617 -0.005838 -0.000098 -0.000804 -0.005512 
+0.000118 -0.001070 -0.001458 0.001773 0.000197 0.001231 
+0.002418 0.001209 0.002761 0.001985 0.004122 0.001985 
+0.000951 0.001881 0.002119 -0.000846 0.000715 -0.002860 
+-0.003379 -0.000225 0.000721 -0.003524 -0.001938 0.002349 
+-0.004062 0.000625 0.000625 -0.003023 0.001240 0.003023 
+-0.001766 0.002176 0.002989 -0.001242 0.002711 0.000563 
+-0.000643 0.001393 0.000536 0.003830 0.003191 0.000000 
+0.001843 0.000143 -0.001100 -0.000279 -0.000581 0.002311 
+-0.002184 -0.002541 0.002303 -0.001746 0.000389 0.001049 
+-0.002091 -0.000467 0.000178 -0.001970 -0.001448 -0.000546 
+-0.000224 -0.000267 -0.000409 0.000699 0.000296 0.000108 
+0.000681 0.001814 0.001818 -0.000340 -0.001270 0.000719 
+-0.002030 -0.001203 0.001654 0.000014 0.000009 -0.000009 
+-0.000990 0.001095 -0.000969 0.000359 0.001683 -0.004085 
+-0.001576 0.001873 -0.003217 -0.000543 0.001953 -0.005029 
+0.001820 0.003075 -0.006970 0.002902 0.006127 -0.001973 
+-0.001806 0.004314 -0.002729 -0.001072 0.004006 -0.003339 
+-0.000726 0.003274 -0.003523 0.005890 0.001948 -0.001904 
+0.001737 0.001675 0.001076 -0.001567 -0.000459 -0.000138 
+0.001395 0.000343 -0.000463 0.004577 0.000258 -0.005201 
+0.001521 0.000599 -0.004412 0.000126 -0.000975 0.002580 
+-0.005002 -0.002729 0.006820 -0.005950 -0.004958 0.007787 
+-0.001407 -0.001299 0.005735 -0.001207 0.000052 0.001155 
+0.002563 -0.001591 -0.000607 0.003063 -0.003090 0.001012 
+0.001388 -0.004267 0.002487 0.000810 -0.004112 0.001953 
+-0.000713 -0.002213 0.000731 0.000357 0.001780 -0.001025 
+-0.000068 0.004020 -0.002794 -0.001581 0.002165 -0.004498 
+-0.001061 0.000818 0.000273 -0.002426 0.002735 -0.000745 
+-0.004818 0.001759 0.000431 -0.003928 0.000602 -0.000032 
+-0.001024 -0.001220 -0.001142 0.000469 -0.000547 -0.002188 
+-0.003174 -0.002365 0.000841 -0.001320 -0.004715 0.005280 
+0.000239 -0.001693 0.005816 -0.002547 -0.002418 0.002935 
+-0.001641 -0.004992 0.002391 -0.003589 -0.004885 0.003058 
+-0.001517 -0.000625 0.004112 0.002095 -0.002592 0.002135 
+0.004036 -0.001986 0.000349 0.001417 -0.002731 0.000303 
+-0.002598 -0.005142 0.003428 -0.000584 0.000234 0.002756 
+0.001925 -0.001112 -0.000081 0.001513 -0.005863 -0.001134 
+-0.001235 -0.004500 -0.001154 0.000825 -0.002494 -0.000834 
+-0.000188 -0.000170 -0.001089 0.000572 0.001577 -0.003864 
+0.000234 -0.000934 -0.001765 -0.000334 -0.001965 -0.000374 
+-0.000856 -0.001163 -0.000642 0.001761 -0.001618 -0.001372 
+0.002462 -0.001870 -0.004363 0.002299 -0.000920 -0.001163 
+-0.000552 -0.000017 -0.000301 -0.002051 0.001764 0.000964 
+-0.001595 0.001889 -0.000552 -0.000326 -0.000254 -0.000362 
+-0.000042 -0.000639 0.001662 0.001664 -0.000736 0.001366 
+0.000432 -0.001026 -0.000138 -0.003974 0.000170 -0.000923 
+-0.004664 -0.000749 0.002447 -0.001428 -0.001165 0.000781 
+-0.001229 -0.000504 -0.000819 -0.000088 0.000134 -0.001727 
+0.001029 0.000388 -0.001109 0.001195 -0.000595 -0.000935 
+-0.000295 -0.001520 -0.000556 0.001502 -0.001970 -0.000142 
+0.001877 -0.004029 0.001527 -0.000790 -0.006962 0.000543 
+-0.001505 -0.005572 -0.000924 0.001594 -0.000797 -0.004211 
+-0.000024 -0.001855 -0.003498 -0.000195 0.000494 0.000269 
+-0.003862 0.001663 0.003533 -0.004215 0.001473 -0.000927 
+-0.001630 0.001537 -0.001687 -0.001173 0.003385 -0.002898 
+-0.000950 0.006122 -0.003849 -0.002442 0.003927 0.000352 
+0.000656 0.004196 0.001719 -0.002433 -0.000002 0.001460 
+-0.000828 -0.001227 0.001748 0.000259 -0.000377 -0.000061 
+0.000656 0.001331 0.000682 -0.000467 0.000567 0.002968 
+-0.000955 0.001589 0.001800 0.001026 -0.002742 0.001368 
+0.000509 -0.000249 0.001121 -0.001033 0.001447 0.001176 
+0.002643 0.003039 0.000265 -0.000347 0.003918 0.000879 
+-0.000342 0.002429 -0.000753 -0.001719 -0.000206 -0.000642 
+-0.000658 -0.001928 -0.002127 -0.001105 -0.002401 -0.002163 
+-0.001078 0.000501 -0.001905 -0.003552 -0.001214 0.000695 
+-0.003157 -0.003087 0.001783 -0.000598 -0.004405 0.002314 
+-0.000833 -0.001801 0.002634 0.000551 0.001341 -0.000303 
+-0.001244 0.002659 -0.000395 -0.001498 0.000708 -0.000581 
+0.000960 0.001452 -0.000467 0.000420 0.002026 -0.000915 
+0.000051 0.000102 -0.000085 -0.005179 -0.001037 0.002059 
+0.002067 -0.005966 -0.000533 -0.005442 -0.008767 0.005354 
+-0.000184 -0.003491 0.003674 0.002067 0.001085 0.003078 
+0.000022 -0.000383 0.002100 0.001418 -0.000457 0.000930 
+0.000226 0.001439 0.000790 -0.000206 0.000191 -0.001739 
+0.004382 -0.001600 -0.000835 0.000407 -0.001242 0.000075 
+-0.000951 -0.000066 -0.000439 0.001853 -0.001889 0.001671 
+0.000007 -0.002511 -0.001078 0.001812 -0.001943 -0.000535 
+0.002836 -0.003115 0.002696 0.001385 -0.001201 -0.001093 
+0.002565 -0.002145 -0.001110 0.002190 -0.001381 -0.000515 
+0.001225 -0.000270 -0.000085 0.001314 0.001705 0.001333 
+-0.000223 0.001879 0.002222 -0.000833 0.001079 0.000321 
+-0.000152 0.000457 -0.001812 0.000600 -0.000954 -0.003073 
+0.001602 -0.000229 -0.003258 0.001311 0.000983 -0.001128 
+-0.001185 -0.000296 -0.000444 -0.005529 -0.001862 0.002299 
+-0.003589 -0.005167 0.002919 -0.001028 -0.000927 0.000201 
+0.002595 0.000179 -0.003381 0.001342 -0.002368 -0.002703 
+0.000000 -0.003116 -0.003768 -0.000005 -0.004786 -0.001581 
+0.001744 -0.000620 -0.001744 0.000524 0.004923 0.000087 
+0.001935 0.006154 -0.000176 0.000233 0.003155 -0.000789 
+0.000566 -0.000550 0.000967 0.002344 -0.002181 0.001335 
+-0.000032 -0.000543 0.000220 0.001572 0.002426 -0.002108 
+0.003201 0.005253 -0.001333 0.001006 0.005281 0.000681 
+-0.000755 0.001740 -0.000660 0.000250 -0.000430 0.000626 
+-0.000374 0.000894 -0.000085 -0.003099 0.002586 -0.000739 
+0.000137 0.002897 -0.005541 0.001445 0.000052 -0.003770 
+0.000546 -0.003517 0.001857 -0.001181 -0.004294 -0.000505 
+-0.001563 -0.002540 -0.000529 -0.003690 -0.002345 0.000093 
+-0.007452 -0.002240 0.001612 -0.001865 0.002424 0.002842 
+0.000690 -0.003089 0.005458 0.000188 -0.001217 0.002145 
+-0.004801 -0.004527 -0.000274 -0.001009 -0.004036 0.002154 
+-0.001873 -0.002876 0.000803 -0.000018 -0.001993 -0.000974 
+-0.003096 -0.001977 0.001175 -0.004242 -0.006519 -0.000192 
+-0.000947 -0.005616 0.001826 -0.000164 -0.001168 0.000990 
+0.000667 0.001905 -0.001238 0.000196 0.001568 -0.003142 
+0.001885 -0.000816 -0.003043 -0.001242 -0.002470 -0.000992 
+-0.000848 -0.003825 -0.000419 -0.003881 -0.000836 -0.000627 
+0.000711 -0.003451 0.000268 -0.002914 -0.004503 0.001131 
+-0.005864 -0.000398 0.003379 -0.006142 0.000271 0.001896 
+-0.005120 -0.003520 0.000960 -0.000432 -0.003854 -0.001105 
+0.004956 -0.001474 0.002649 0.000451 0.001563 0.003516 
+-0.000726 0.003008 0.002542 -0.000729 0.002188 0.004286 
+-0.001298 -0.001099 0.007238 -0.004429 -0.001227 0.006711 
+-0.001148 0.001289 0.002213 0.000067 0.000064 -0.000928 
+0.000567 -0.000549 -0.003375 -0.000312 -0.001562 -0.004060 
+-0.000560 -0.001301 -0.001481 0.001365 -0.000997 0.002599 
+0.003185 -0.000519 0.002667 0.000410 -0.002239 -0.000410 
+0.001241 -0.001412 -0.001037 -0.001473 0.000490 0.000262 
+-0.003915 0.002833 -0.002041 -0.003425 0.004049 -0.002877 
+0.000000 0.004748 -0.003094 -0.001741 0.001641 -0.000697 
+0.000308 0.000734 0.001982 -0.001058 -0.001930 0.002552 
+-0.000078 -0.000004 -0.000246 -0.000803 -0.000596 -0.000497 
+0.002113 0.001323 -0.000896 0.000571 0.000286 -0.002256 
+-0.001742 0.000103 -0.000232 -0.003083 -0.000546 0.001228 
+-0.003059 -0.002897 0.001094 -0.000995 -0.004620 -0.000944 
+0.000498 -0.004635 -0.000455 0.002251 -0.000853 0.000450 
+0.004651 0.003876 -0.003876 0.004621 0.003763 -0.004407 
+0.004123 0.002278 -0.004448 0.005919 0.002067 -0.003194 
+0.005985 0.002962 -0.005008 0.007306 0.002951 -0.002263 
+0.001685 0.004270 -0.005673 0.002617 0.002978 -0.002025 
+-0.001981 0.000900 0.001223 -0.004747 -0.000821 -0.001320 
+-0.001203 -0.002273 -0.002767 0.000264 -0.001994 -0.001131 
+-0.000496 0.001018 -0.000984 -0.000142 0.003176 -0.004076 
+-0.001235 0.003717 -0.002131 -0.005323 -0.001290 0.001290 
+-0.006560 -0.001460 0.007534 -0.006090 -0.003479 0.003576 
+-0.002923 -0.002462 0.000000 -0.002692 -0.003343 0.000955 
+-0.003093 -0.001510 -0.000544 -0.000917 0.001983 0.000938 
+0.000800 0.001563 0.002558 -0.000069 0.000723 0.000818 
+-0.000509 0.001246 0.000452 -0.000735 0.001181 0.002093 
+-0.000446 0.000476 0.002677 -0.001165 -0.001797 -0.000109 
+-0.002470 -0.001720 0.001601 -0.000626 -0.001926 0.001413 
+-0.000096 -0.000436 -0.000174 0.003073 0.001676 0.000950 
+0.002846 -0.000990 0.001402 0.001640 -0.001875 0.001836 
+-0.001147 -0.003894 0.000954 -0.001251 -0.001288 0.000326 
+0.001087 -0.000123 -0.005085 0.002356 0.002153 -0.005448 
+-0.001313 0.002214 -0.003939 0.001742 -0.002203 -0.003304 
+-0.001241 -0.003468 0.000136 -0.005699 -0.004673 0.004852 
+-0.007671 -0.005654 0.007403 0.000867 0.000379 0.002493 
+-0.001606 -0.004414 0.004358 -0.001066 -0.000935 0.001300 
+-0.001366 0.003278 0.000729 -0.000832 0.001552 0.003520 
+0.000307 0.001614 0.003793 0.001701 0.001959 0.002648 
+0.003225 0.001470 -0.000664 0.003017 -0.000368 -0.003239 
+0.004493 0.001196 -0.000163 0.000310 0.000875 0.000707 
+-0.002391 0.000145 0.002391 -0.002277 -0.001439 -0.000238 
+0.000192 0.000288 -0.002059 0.000727 0.000379 -0.003197 
+-0.001795 -0.001393 -0.001285 -0.001386 0.000324 0.000028 
+0.002032 -0.002240 -0.000552 0.001579 -0.004206 -0.000701 
+0.002454 -0.002170 0.000436 0.000836 0.000139 -0.001385 
+0.000059 -0.001626 -0.000575 -0.000368 -0.002530 0.000474 
+-0.000683 -0.002812 0.001215 -0.002754 -0.002826 0.000000 
+-0.001309 0.000503 -0.000537 -0.001576 0.001210 0.001463 
+0.000513 0.000272 -0.000664 0.001171 0.000367 -0.000344 
+-0.001220 -0.000610 -0.002837 0.000745 -0.004917 -0.003775 
+0.001666 -0.003059 -0.002740 0.000247 -0.001177 -0.000680 
+-0.001837 -0.000086 0.002334 -0.003002 0.002219 0.002820 
+-0.001242 0.003803 0.003638 0.001649 0.004108 0.004003 
+0.001905 -0.000178 0.001244 0.000928 0.002256 -0.000730 
+-0.000266 0.000489 0.001714 -0.002219 -0.002465 0.000321 
+-0.004346 -0.005326 -0.002461 -0.005517 -0.004386 -0.005067 
+-0.002204 -0.001400 -0.003664 0.000059 -0.001880 0.000411 
+0.004115 0.000271 -0.000604 0.005196 -0.003216 -0.002348 
+0.004170 0.000281 -0.005633 -0.000730 0.001674 0.000036 
+-0.002038 0.000924 -0.000038 -0.003184 -0.001603 0.002547 
+-0.002656 -0.002188 0.002656 0.000720 -0.000880 0.000080 
+0.001393 0.001996 -0.000510 0.000060 0.000184 -0.000251 
+-0.001049 -0.002632 0.002285 -0.001441 -0.002179 0.004499 
+-0.000114 -0.000631 0.004694 0.000775 -0.002171 0.002713 
+-0.001580 -0.003023 0.002165 0.001111 0.000000 -0.000476 
+0.002937 0.000345 -0.001725 0.002460 0.000432 -0.001081 
+0.000437 -0.000952 0.000437 -0.000811 -0.002081 0.001935 
+-0.000502 -0.001685 0.002339 0.001335 -0.000275 0.000148 
+-0.000519 0.000620 -0.002594 0.000331 0.002915 -0.004177 
+-0.000242 0.001806 -0.003613 -0.000982 0.002302 0.001179 
+-0.002829 -0.000026 0.002009 -0.002290 0.000916 -0.001832 
+0.001201 -0.001338 0.000153 -0.000057 -0.005020 0.001957 
+-0.002586 -0.004421 -0.001143 0.001507 -0.003947 0.000694 
+-0.003842 -0.004303 0.002764 -0.000270 -0.000362 0.000199 
+0.000758 0.003671 0.000515 0.001263 0.004665 -0.002180 
+0.003741 0.007148 0.001926 0.002268 0.001471 0.004474 
+0.003271 -0.001128 0.002519 -0.002328 0.000457 0.002306 
+-0.000911 0.001120 -0.003151 -0.000833 0.000182 -0.000104 
+0.001155 -0.003465 0.001860 -0.000303 -0.003029 -0.000224 
+-0.000547 -0.001059 0.000501 0.000986 -0.003649 0.000296 
+0.000116 -0.002879 -0.001063 0.003284 -0.000577 -0.002363 
+0.001221 -0.000888 -0.003994 0.001407 -0.000148 -0.001481 
+0.000117 0.000765 -0.001710 0.001477 0.001102 -0.000326 
+0.000377 -0.000017 -0.000703 0.000360 0.000571 0.000406 
+-0.001440 -0.001028 0.000662 -0.000807 -0.000572 -0.000303 
+0.001752 0.000584 -0.000292 0.000949 0.000365 -0.000438 
+-0.001563 0.000388 0.004291 -0.002950 0.001827 0.003655 
+0.000083 0.000285 0.001755 0.001651 -0.000347 -0.002520 
+0.004168 0.001643 -0.003663 0.002443 0.002977 0.000000 
+-0.001053 0.003534 -0.001053 0.000896 0.002450 0.000544 
+0.000195 0.001219 0.000252 -0.001628 -0.000306 0.000079 
+-0.001315 -0.001427 -0.000699 0.000790 -0.001050 0.000963 
+0.005430 -0.000979 -0.001892 0.006767 -0.000972 -0.001506 
+0.003508 -0.001248 -0.000709 -0.000799 -0.001069 -0.000685 
+-0.002199 0.000015 -0.000057 -0.000520 0.001440 0.001269 
+0.000428 0.001716 0.001930 0.000736 0.000849 0.001423 
+-0.001613 -0.002063 0.003142 -0.001561 -0.003414 0.002026 
+-0.000510 -0.000265 -0.000305 0.000785 0.002462 -0.000262 
+0.000426 0.001303 -0.000872 0.000095 -0.000811 0.002019 
+-0.000375 0.000299 0.001797 0.001774 0.001267 0.001583 
+0.002214 0.003680 0.001184 0.002500 0.002654 -0.000215 
+0.000727 0.000652 -0.000576 0.001105 -0.002224 -0.000732 
+-0.001198 -0.003862 -0.002185 -0.000463 -0.002927 -0.001720 
+0.002359 -0.001840 0.001133 0.000535 0.001605 0.000930 
+0.001258 0.001613 -0.002215 0.002181 0.002253 -0.001962 
+0.003548 0.000742 -0.000371 0.004399 0.000723 0.002215 
+0.005420 -0.000302 -0.002861 0.006456 0.002596 -0.001583 
+0.005481 0.005305 -0.003408 0.004264 0.004640 -0.001989 
+-0.000580 0.002734 0.002900 -0.000225 -0.000406 0.000107 
+-0.000075 -0.002283 -0.001136 -0.001901 -0.001914 -0.002545 
+-0.002619 0.000556 -0.001508 -0.000500 0.000072 -0.001392 
+0.000506 0.000268 -0.000655 -0.000973 -0.003232 -0.001688 
+-0.000134 -0.001791 0.001684 -0.000145 0.002174 0.003333 
+0.000100 0.001807 0.002750 -0.001875 0.001304 -0.002200 
+0.001187 0.004983 -0.006406 0.000987 0.004499 -0.003036 
+0.002116 0.006486 -0.010752 -0.002290 0.005276 0.001379 
+0.005361 0.007567 0.000315 0.002385 0.004967 -0.003992 
+-0.001335 0.001347 -0.003412 -0.001308 -0.000797 -0.001912 
+0.001015 -0.000353 -0.000687 0.000902 0.000150 0.000075 
+-0.001780 0.001894 0.001932 -0.004005 0.001191 0.004258 
+-0.002381 0.004328 0.002976 -0.001983 0.000900 -0.000231 
+0.000193 -0.004590 0.001637 -0.000065 -0.008106 -0.000037 
+-0.007603 -0.006397 0.003282 -0.000288 -0.001779 0.000816 
+0.000432 0.002595 -0.002929 0.001466 0.002435 -0.003168 
+0.000017 0.000568 -0.000407 -0.000916 -0.000561 0.001290 
+0.001231 0.000646 -0.000236 0.002993 0.002883 -0.002883 
+0.001721 0.000622 -0.003746 0.000828 -0.000626 -0.001291 
+-0.000791 -0.000694 -0.001614 -0.002064 -0.001184 -0.001532 
+-0.000637 -0.000142 -0.000451 -0.000053 0.000384 -0.000244 
+-0.000889 0.000787 0.000399 0.000227 -0.000860 0.002067 
+-0.000462 -0.004767 0.003940 0.000403 -0.007690 0.000791 
+0.000109 -0.003680 -0.000078 0.000980 0.001811 0.000297 
+0.003237 0.003666 0.001146 0.004479 0.003272 -0.001904 
+0.002547 0.002756 -0.000500 0.002219 0.002573 -0.001672 
+0.004702 0.001405 -0.005190 0.000028 -0.000197 -0.005950 
+-0.000253 -0.002482 -0.001849 -0.003900 -0.003659 0.001216 
+-0.001780 -0.004924 0.001780 0.002963 -0.000634 0.000841 
+0.003012 -0.000635 -0.001025 0.001037 0.000293 -0.000953 
+0.000231 0.000411 -0.000636 -0.000621 -0.000280 -0.000791 
+-0.000596 0.000051 -0.001040 -0.000722 -0.001670 0.000151 
+-0.002092 0.001770 0.000414 -0.003897 0.000026 0.001974 
+0.001280 -0.006400 0.004453 0.000276 0.000189 0.000844 
+-0.004640 0.000217 0.001949 -0.007040 -0.000992 0.000496 
+-0.006080 -0.004800 0.000000 -0.003369 -0.008036 0.000649 
+-0.000806 -0.006850 -0.003224 0.001399 -0.002040 -0.005741 
+-0.001938 -0.000480 -0.004805 -0.003833 0.000143 -0.002833 
+-0.001220 -0.002916 -0.003164 -0.002807 -0.002958 -0.002162 
+-0.004427 -0.003016 0.000513 -0.000843 -0.002186 0.000955 
+0.001620 0.000069 -0.001363 0.001434 0.000356 -0.000286 
+0.000247 -0.001457 0.000043 0.000627 -0.000898 0.000413 
+0.001653 0.001890 0.000079 0.003919 0.004412 -0.002940 
+0.004156 0.003743 -0.001142 -0.000344 -0.000521 -0.000444 
+-0.002325 -0.002170 -0.001998 -0.003266 -0.003392 0.000586 
+-0.004899 -0.003050 -0.000869 -0.002273 -0.002955 -0.000682 
+0.001790 -0.000500 -0.000430 0.003707 0.003629 -0.002445 
+0.003921 0.005354 -0.001120 -0.000346 0.000173 -0.000866 
+-0.001730 -0.001158 0.001041 -0.001961 -0.001024 -0.000498 
+-0.001345 0.000517 0.000763 0.000953 0.001725 0.000291 
+0.001243 0.001511 0.000478 0.001658 0.001018 0.002356 
+0.000242 -0.000121 0.003258 -0.000186 -0.001481 0.001942 
+0.000379 -0.003374 0.002066 -0.000811 -0.004991 0.004788 
+0.000763 -0.001040 0.004439 0.002444 0.000356 0.000711 
+0.004769 0.005851 -0.001229 -0.001518 0.006934 -0.000759 
+-0.000711 0.004264 -0.004222 0.000211 0.001546 -0.003269 
+0.001966 -0.001274 -0.003422 0.003505 -0.003636 -0.003067 
+0.001513 -0.004613 -0.001538 0.000331 -0.004050 0.001653 
+-0.003978 -0.000995 0.003978 -0.002336 0.001519 0.003311 
+-0.000560 0.005120 -0.001120 0.004919 -0.001514 -0.002270 
+0.004030 0.005935 0.001272 0.002908 0.005267 -0.000181 
+-0.001107 0.001841 -0.000206 -0.002889 0.001232 -0.000894 
+-0.000142 0.004476 -0.003361 0.005367 0.003674 0.001445 
+-0.000091 0.000270 0.000268 0.004273 0.002977 -0.003418 
+0.006621 0.003064 -0.001112 0.008303 0.004720 0.000499 
+0.007200 0.008064 -0.001008 0.001977 0.007385 -0.002454 
+0.001586 0.002953 -0.003831 0.002002 0.001212 -0.001833 
+0.001171 0.000651 0.000078 -0.000180 -0.000523 0.002976 
+-0.004311 -0.004139 0.002284 -0.001616 -0.000556 0.000505 
+0.004448 -0.000019 -0.000773 0.003305 0.004588 0.001611 
+0.001059 0.002653 -0.002535 -0.002492 0.000088 0.003774 
+0.000641 -0.000699 0.007120 0.001350 0.000600 0.002437 
+-0.006747 -0.003710 0.006523 0.000285 -0.000031 0.000391 
+0.002661 0.003433 -0.000343 0.004334 0.002722 0.000791 
+0.001520 -0.000309 0.001551 0.000245 -0.002309 0.005005 
+-0.005395 -0.001320 0.006055 -0.001103 -0.000404 0.004007 
+-0.000130 -0.000208 0.000193 0.000895 -0.001415 -0.000077 
+0.000005 -0.000106 0.000609 -0.000394 -0.004590 0.001970 
+-0.004494 -0.001859 -0.000981 -0.001880 -0.000815 -0.001457 
+0.000168 -0.002060 -0.002258 -0.000532 -0.005565 -0.000710 
+-0.001291 -0.002057 -0.000520 0.000642 0.001235 0.000202 
+0.001324 0.003565 0.002674 0.002760 0.004971 -0.001521 
+0.001304 0.004705 -0.000072 0.001013 -0.000397 -0.000015 
+0.009054 -0.000965 -0.006103 0.004451 -0.003888 -0.003647 
+0.001560 -0.003503 -0.000656 -0.005648 -0.003565 -0.000031 
+-0.004761 0.000311 -0.000068 -0.002386 0.001052 -0.002313 
+0.000099 0.004247 -0.004049 0.001972 0.002326 -0.001913 
+-0.001393 -0.001245 0.000284 -0.003000 -0.000187 0.001875 
+-0.001512 -0.000388 0.000504 0.001280 0.000552 -0.000112 
+-0.000137 -0.001221 -0.000046 -0.002605 -0.005209 0.000388 
+-0.004096 -0.007145 0.001525 -0.001170 -0.004707 0.003537 
+0.001782 -0.000103 0.001427 0.001620 0.002531 -0.000709 
+-0.000881 0.001934 -0.000271 -0.003529 -0.000662 0.001397 
+-0.003888 -0.003535 0.004595 -0.003002 -0.004735 0.006235 
+-0.005796 -0.000572 0.001468 -0.006649 -0.000826 0.000870 
+-0.005205 -0.000579 0.000004 -0.002573 -0.000334 -0.000304 
+-0.001111 -0.002247 0.001689 -0.000938 -0.002585 0.004308 
+-0.000543 -0.000393 -0.000492 -0.001236 -0.000476 0.000285 
+-0.003440 -0.001320 0.000872 -0.003236 -0.004638 0.000311 
+-0.000425 -0.003762 -0.000316 0.001577 -0.001056 0.000276 
+0.004963 0.001150 -0.002338 0.000379 -0.000758 -0.004848 
+0.000963 -0.001348 -0.002520 0.002138 -0.000033 -0.001393 
+0.001138 0.001200 0.000228 -0.001426 -0.000399 -0.000171 
+-0.002738 -0.001786 -0.000238 -0.001259 -0.002069 0.000730 
+-0.000465 -0.001988 0.003644 0.000139 -0.000023 0.004609 
+-0.001986 -0.000246 0.001999 -0.000474 -0.005016 0.000753 
+0.000482 -0.001245 0.000363 -0.002571 0.002000 0.001714 
+-0.000583 0.002183 0.002867 -0.000512 0.002200 0.000656 
+0.000332 0.000412 -0.000817 -0.000240 -0.001003 0.000621 
+-0.002148 -0.002137 -0.000358 -0.001116 -0.000819 -0.000981 
+-0.000125 -0.000929 -0.000572 0.000947 -0.000746 0.000022 
+-0.000161 -0.001706 -0.000341 -0.000415 -0.001388 -0.000416 
+0.001902 0.000674 0.000920 0.003751 0.002440 0.000702 
+0.002032 0.001321 0.001831 -0.002304 0.000090 0.000798 
+-0.001869 -0.000748 0.001985 0.002061 -0.000976 -0.002025 
+0.004818 -0.001321 -0.001122 0.000412 -0.002294 -0.001853 
+-0.002066 0.000009 -0.001527 -0.002962 -0.000288 0.000183 
+-0.000038 -0.001328 -0.002286 0.002115 -0.002420 -0.002782 
+-0.000976 -0.000866 -0.000488 -0.001234 -0.000823 0.002636 
+-0.000862 0.000342 0.002573 0.000126 -0.000929 -0.002744 
+-0.002142 -0.003569 -0.006068 -0.003054 -0.000909 -0.008544 
+
diff --git a/data/gktbhFA.vtk b/data/gktbhFA.vtk
new file mode 100644
index 0000000..deb9d67
Binary files /dev/null and b/data/gktbhFA.vtk differ
diff --git a/data/gktbhL123.vtk b/data/gktbhL123.vtk
new file mode 100644
index 0000000..5831581
Binary files /dev/null and b/data/gktbhL123.vtk differ
diff --git a/data/head.120.vtk b/data/head.120.vtk
new file mode 100644
index 0000000..a3e7489
--- /dev/null
+++ b/data/head.120.vtk
@@ -0,0 +1,91541 @@
+# vtk DataFile Version 2.0
+quantize(resample(???),8)
+BINARY
+DATASET STRUCTURED_POINTS
+DIMENSIONS 120 120 130
+ORIGIN 0 0 0
+SPACING 2.26448 2.26448 2.27132
+POINT_DATA 1872000
+SCALARS nrrd94920 unsigned_char
+LOOKUP_TABLE default
+ [...]
+
+
+
+
+
+
+
+
+
+
+
+
+
+



			
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+														
+
	
+

+
+			
+




+


+
+
+					
+
			
+







+
+

+			
+
+	
+		
+


+	
+



+		

+
+
+
+
+			
+	
+
+		
+
		
+
+	
	
+

+				
	

	
+





+
+
+	
+
+		

		


		

		
		

+		
+
		
+


		
	
			
+

+				
+

+		
	
	
+

+	








+
+			
+
+
+
+
+

+
+	
+
+
+
+							
+

		


	

+		
+



+
+
+				
+
+


+		
+

+		
+
+			
+
+
+
+
+
+
+
+
+
+		
+

	

				



+					
+

+
+
	




+						

+

													
+
+
+





		
+
					
+
+
+

+

+									
+



+							
			
+



	

+	

+												





+		

+	



+				
+

+	

+																	
+
+		
+




+
		


+								
		

																				
+


+
+
+
	
+
		
+

+										
		

																											
+

+

+	
+

+										
+
+
+	

+	

																																									


+		
+

+	
+
		















+
+	


+																																															




+	




		
					
+
+
+







+
+
+


+																																																					




		

+
+
+						
+
+
+



+

+
+

													
+
+
+
+
+
+







+
+																														


+
+

+


							
+
+







+
+


+								
+
+
+
+
+
+
+









+																								
+


+			

	
							
+







+	
+
+
+


+							
+
+
+
+
+
+
+
+








+
+	
+
+





+
+																		
+

				
+
	
							
+







+
+
+	

+


+							
+
+
+
+
+
+
+
+







+			
+
+
+		
+
+






+																					

				

+

+				
+
+






+		
+	

+
+



+					
+
+
+
+
+
+
+
+
+
+





+
+			
+




+
+
+			
+
+








+
+																				

+	


+			
+






+			
+
+
+

+
+



+			
+
+	
+
+
+
+
+
+
+
+
+







+			
+









+











																				
					


+	
+




+
+				
+
+
+


+



+
+
+
+
+
+
+	
+
+
+
+
+
+





+
+
+

+			

















+
+
+
+


+																			
+
			
+

+

+
+




+
+
+	
+
+	
+

+
+
	


+
+
+
+
+
+
+
+
+
+
+
+
+
+




+	
+
+

				



+






+
+																																	

+	
+

+





+
+
+
+
+	
+
+	
+









+
+
+
+
+
+
+
+
+
+
+
+




+
+
+
+
+

				


+
+
+
+
+
+
+															

																			
+

+


+




+			
+
+
+
+		
+






















+	
+
+


+


+		
+


+
+																		
+





+													
+
+

+




+


+
+			
+
+	
+
+
+	


















+
+		
+





+
+	
+


+
+																	
+






+
+										
+
+










+
+
+
+		
+
+
+
+
+
+	
+




















+
+
+
+



	
+




+																
+






+
+
+									
+






+		
+
+
+
+
+


+
+
+
+
+


























+	
+












+															
+


+
+



+
+									
+






+		
+







+
+
+
+






















+





+
+
+









+
+														



+
+
+




+								
+
+









+
+
+










+
+
+


+
	
















+
+





+
+
+




+





+
+													


+
+
+





+								
+	
+
+
+





+
+
+
+











+




+














+
+
+
+

















+
+
+											
+










+
+
+
+
+	
+
+	
+	
+
+
+






+
+
+
+
















+












+
+
+
+

















+
+
+											
+




















+
+
+
















+










+
+















+
+
+											
























+
+	
+












+



+


+







+
+


















+
+										







+
+
+
+
+
+
+




+




+
+
+	
+
+






+





+


+
+
	
















+
+
+













+
+									
+








+
+
+
+
+



+

+


+	
+	
+
+
+






+
+




+

+
+















+
+
+
+
+












+
+								
+







+
+
+
+
+




+


	
+
+	
+
+
+
+






+
+





+
+
















+
+
+
+
+
+
+
+








+
+
+
+				
+
+
+











+
+
+
+
+


+


+



+
+
+	
+
+
+
+
+





+
+





+
+

	













+
+
+
+
+	
+
+
+
+
+





+
+
+
+	
+
+	
+














+
+




+

+
+



+
+
+	
+
+
+
+
+





+
+
+






+

+


















+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+




+























+
+



+
+
+	
+
+
+
+
+



+
+
+
+



+


+
+
+


















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+





























+
+



+
+
+
+
+







+
+
+
+



+
+


+
+






















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+
+






















+
+



+
+
+
+
+
+




+
+
+
+



+
+
+


+
+






















+
+
+
+
+
+
+
+
+
+
+
+
+





+
+













+





+



+
+




+
+
+
+
+


+



+
+
+



+




+


























+
+
+
+
+
+
+
+
+






+
+
+











+





+



	
+




+
+
+







+
+
+
+







+




















+
+











+
+
+
+













+





+



+	





+
+




+



+
+
+

+







	


















+









+
+
+
+
























+



+
+
+




+




+
+



+
+
+



+
+
+
+


































+
+
+














+







+



+




+
+
+









+



+
+
+


+
+
+
+



































+
+

+
+
+








+
+
+
+







+



+
+

+
+
+
+
+











+
+
+
+

+
+
+




































+

+
+
+
+










			
+





+
+



+
+

+
+
+
+
+










+
+
+
+


+























+















+
+
+












+	
+
+





+
+



+
+


+
+
+
+
+
+









+
+
+
+










































+
+
+
+









+	
+





+
+




+

+
+
+
+
+
+
+











+
+
+
+





































+
+
+










	
+






+




+


+
+
+
+
+
+
+










+
+
+
+
+













































+


+
+











+

+
+
+
+
+
+





+




+
+
+
+
+











+
































+



+












+

+
+
+
+
+
+










+
+
+

+











+





































+
+










+
+
+
+
+
+
+
+
+










+
+

+















































+














+
+

















+









































+




+

















+


























































































































































































































































































































































+
+





























































	






































































































































































































































































+	




































































































































































































































	














































































































































































+
























































+






















+

















+






























	










+	

+	


 [...]


		
 [...]
+





	
+





	
+
										 [...]
+

+											
+
+
+
+
+
+
+
+


+

+

+













				
+	
+
+	
+






+
+

+
+																						

+	



+	
+










+						

+					
+		
+





			
+
		
+
+
+		
+
+
+	



									
+


+								
+





+	
+
		
		
+
+

+						



							

+	
+

+																	

+	
+

+					






+				

+			
+


+															
+		
+

+					
+



+



+	
+
				
+	
+

																						


+										



+		
+

+

					
+	
+
+

																											


+									



+
+




+
+			
+
+
+



+
+
+
+
+											
+






+







+
+
+				
+


+								
+


+	



+						
+
+
+














+				


+						
+
+					
+
+
+
+
+






+											

	
+								
+
+
+


+
+


+							
+
+


+
+

+																										
+



+								
+
+	

+
+


											
+

+																					
+











		
+

+							
+





+



+																																								
+




+								

						





+	

+
+



+
+																																												







+				

+					



+	
+
+
+
+	
+

+
+



+	
+																																													
+

+
+



		

+				



+			
+
+
+
+
+

+
+


	
+
+
+																																																
+
+




+	

			
+


+					
+
+
+
+
+
+


+



+
+
+	
+
+																																																

	
+


+		
+


+							
+
+
+
+
+
+
+


+



+
+
+
+
+
+
+
+
+
+
+
+																																											



+	
+




+		
+


+
+
+
+
+
+
+
+
+
+
+
+
+

+
+


+
+
+	
+













+
+
+																																				

		

		
+
		
+















+	


+



+
+
+
+





















+
+																															


		
+
	
+
+	
















	






+
+
+
+










+
+

+
+
+
+










+
+									
+														
+
+


+		
+

+	


+


















+






+














+
+
+
+							
+
+








+					
+
+
+
+													
+


+					



+
+











+
+



	























+
+													
+
+







+
+
+



+												
+




+			
+














+
+
+


























+
+	
+
+																	
+
+








													
+
+



+
+
+
+













+
+







+




















+
+
+
+
+
+
+																			
+




																


+













+
+
+







+





















+



+
+
+
+
+
+																	
+			
+

																		













+
+
+
+
+
+





















+
+
+
+

+
+
+
+
+
+
+
+
+
+						
+
+









																
+






+
+
+
+
+
+
+
+
+
+
+
















+		
+
+
+
+
+
+
+
+


+
+
+
+









+
+
+		

+											
+		
+









	







+


+
+
+	
+
+
+
+
+
+
+
+










+
+
+
+
+
+
+			




+				
+
+
+
+
+
+






+



+
+
+

+
+
+
+
+
+
+
+
+	
+
+








+
+
+		
+
+
+
+
+
+


+
+






+	
+
+
+
+	
+

















+
+
+
+
+
+
+


+
+
+	
+






+
+
+
+
+
+
+
+
+

+




+		
+
+




+
+	
+
+	





	






















+
+
+
+
+
+





+
+
+
+
+


+
+


+


+		
+








+
+
+
+

























+
+

+
+
+
+






+
+













+
+
+








+
+
+
+



+






























+







+
+



















+
+
+




+

+



































+
+
+















+
+
+





	





































+
+
+



























































































+

































#
+











+
+



























+
+



















+
+))
+











+
























+
























+
+	,5






















































		
+
)<#





	








































+



+
+

+	8&









































+
+
+






+
+	0(













































+
+





+%&





















































+





















































































































"#$!

























	



































!%'(((% 






























+






























#(*,,,+)% 































+	






























"(,/00/.,*&























	






























 '+045543/-*$






















































$+157887640,' 



























































$,389::9974.)#




























































&-49;<;;:961,%


























































'.5:<==<;:73-&
















































'.7;=>==<;83,&















































'.7;=>>=<;83,%












































&.6;=>>==;82+#

















+
























$,4:<>>=<;70) 














	
+























)07;==<;95,$














		





















#+17:::950(






























$+14552.)!


























$),.-*%




























#&%!



















































	



























	























































+













+
















+






+







	
+
+






+	

 [...]
+
+






+
+





	


+			 [...]
+
+


+		
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

+
+
+
+
+


+

			
+




+
+


+
+
+
+					
+
		
+


+
+








			
+
+							
+



+		
+
		
+
+
+		
+
+
+
+	



+										
+

+							
+



+
+	
+
	
+
+			
+
+
+		
+

+							

+	

										
+
+
		
+

+	

				
+
					

+								
+
+	

	
+






+		


+
+				

+												


+	

+
		
+

+	
+



+
+
+			
+
																
+
+
+
+
+	
+

				


	
+
+	
+




+		
+	

												
+
+





+


+
+
+
+
+


+
+
+					


+			
+

		








+		
+	



+	
+
+
+


+
+
+					


+								
+
+
+
+
+





+
+				

		

									
+

+

+	
+



+
+
+
+



		
+

+											
+											






+								
+
+
+
+			
+

								
+


+								
+


+
+


+
+




+
+			
+
						
+



+

+			
+

																								
+


+



+						


+				




+
+
+	
+
+			
+

+																												







				

+				



+		
+
+
+
+					
+

+																													


+



+	

+			
+


+			
+
+
+
+
+
+
+			
+

+	
+
+
+																												

+
+

+		

+	
+


+
+
+			
+
+
+
+
+
+
+
+			
+


+
+






+																												


+	


		
+


+		
+
+
+				
+
+
+
+
+


+	
+	


+












+
+
+																		
+
+								
+



+


					
+
+
+				
+
+
+
+
+


+
+
+		






+
+





+
+
+
+









+								
+



+						
+

		

	

	
+		
+


+
+				
+
+
+
+


	
+	
+	
+




+
+
+
+
+
+
+
+
+							
+
+







+		
+





+							

			
+




+
+






+
+
+
+	
+
+


+
+	
+
+
+




	
+

+
+
		
+
+											
+
+






+		
+






+									
+

+					
+










+
+
+
+
+	
+



+
+
+
+
+












+		
+
+
+	
+
+												
+
+









+
+


+									
+
					
+










+
+
+
+
+
+
+
+




+
+
+	










+	
+
+
+
+
+
+
																
+





+	
+

						
+
					
+










+
+
+
+
+
+
+



	

+
+
+




+





+



+



+
+																		
+		

										
+





+














+
+
+
+
+








+




+















+															

+		
+								
+





















+
+
+





	















+
+									
+
+
+				

+													









+








+


	















+								
+	
+			
+
+
+
+	
											
+







+
+
































+
+
+
+
+				
+
+









		
+										

































+
+
+
+	
+
+
+
+
+









					
+




+


























+
+
+
+
+
+















+
+



+			
+


+

+





	







+
+

+
+



























+	
+


+







	




+
+
+






	
+






















	






+
+
+
+








#

+
+
+




























+
+










"1


























+
+
+
+









21
























+
+






	;0
+
























+<0
	
+












+
+
	











+90	

































+
+


+50	
+





























+
+

22	
+


























  
.5
+





	













$')*($
)8$
+




+
















#*.121/-)""81
+



















+
%-26898630+#6=





















%/59<===<:61+#/E$













#-5;=?????=<83,$&F*









",5;>?@AAAA@?=94-!

:%	








*3;>@AAAABBAA?=92)

+'
+






%/9>@AAA@@@AABA?=7.#
	




(3<?ABAA@@@@AABA?;2(
+

+


*6>ABBA@@@@@@AAB@=6,


,9?ABA@@??@@?@ABA>8-!






-:?BBA@@??@@?@AAA?9."


 .:@BBA@@??@@@@AAA@:."

"/;@BBAA@??@@?@ABB@:.""/;@BBAA@??@@?@ABB at 9-!!/:@BBAA@@?@AAAABB?8+
 -9 at BBBAA@@@@AABBB>5(



+6?BBBBAAAAAAABBA<1$
+
'3=ABBBBAAABBBBB at 9, 
	".:@BBBBBBBBBBBA=4&
+'3<@BCBBBBBCBB?9- ,6=@BCCBCCBA@;2%".7=@BBBBA??<4)

$.6<?@@@?<;4+!

$.59<==;83,"	$+/3442.) 
+

!%''%!























+
+
+
+













































		
 [...]



+
+

 [...]

 [...]

+
+



 [...]













 [...]
+ [...]
+
+
+
+

					
+
+
+
+
+
+
+
+
+																					
+
+	
	
+
+





+
+
+		
+	
+

+
+
+



+	
+
+
+		
+
+	
+
+	
+		
+
+
+		
+	
+
+		
+
+
+		
+	
+	
+
+	

+
+
	
+	
+				
+
+	
+


		
+

+	
+
+		
+	
+
+	
+
+	


+
+
+		
+


+	
+
+	
+
+	
+
+
+		
+			
+

	
		
+
+	
+
+
+
+
+
+
+		
+
+	

	
+		
+


+	
+	
+
		
+
+
+
+
+
+
+
+		
+
+
+
+
+
+		
+
+	
+

+

+			
+
+
+



+	
+

+		
+
+
+			
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+		
+


		
+
+
+
+

+
+
+		

+	
+



+						



+	
		

+

+			
+


+
+					
+
+
+
+
+
+			
+
+
+
+
+
+
+
+

+	
			


+		
+				


+					
+
+
+
+
+



+			

+	
+


+				
+
+					


+							

+





+
+		
+

+								
				
+



+		
+
+
+

+
+


+	
	
+


+											

+				






+				
+

+
+

+
+
		
		


+			
+								
+	

				
+


+
+
+
+




+
+
+
+
+			

+
+

+



+


		
+

+		
+
+
+


+							


				
+




+	


+
+
+
+
+
+
+

+



+
+		
+

+
+	
+
+
+










+







+
+
+
+	
+

+
+

+				
+
	
+





+		
+






+		
+


+		

+	

+
+






+








+		

+					

+
+






+			
+





+	
+



+	

	



+			


















	

+				
+







+						








+	
+
+	
+		
+






















+		








						
+
+
+	
+	
+
	
+



















+
+		






					
+
+
+
+
+
+
+
+
+
+

+
+














+








					
+











+






+










+					








+
+

















+
+


	

								
+


			
+
+















+







												
+


+



+				


















+






						
+

+


+	
+
+
+


+



+				
+



+























+			
+
+
+
+



+		
+





		



+
+














+			
+
+	
+
+


	
+













	


+














+

+



+		
+



+
+
+
+
+
!	
+
+
+
+
+
















+
+
+




+	
+









;.
	
+














+










+






+
+
+







,E
	
+
+
+
+
+
+
+
























+
+
+
+
+
+



+


+(5
		
+
+
+
+
+













+



+
+
+










	$4					
+
+
+	
+






















	


+
+
+







 
+	&$


		
+
+
+











+
+















+
+
+
+




!		
+
)%

	
+
+



+

























+

+

+



"		
#(+,/+"
		
+



+
+
+








+









+
+
+






+	
+ (/46665/'

	




+
+
+












+







	
+#,49<===<92)
	




















+






+
+#.7<>?@@@?>;4*
+































+
$.7>@@@@@@@@?<5*









+	























	
+"/9?A@@@??@@@@@=5*
































+
+
.9?AA@?>=>>??@A@<4)
+	




























+
+8?AA@>>=<<==?@AA@;3*





























&7?AA@>=<<<<<<=?ABB at 800
	





















2>AB@?=<<=>====>@ABB>3-:+




















%8ABA@>=>@BCBA?>>?ABCA:,(I1
























,=ABA@??BEILMKFA??@BCC>3
!D$










	














1?BA@?@@DHMUXSLEA?@ABC at 6$
&

































!5 at BA@?@CFNUSQVTIB@@ABCA8(	



































#7 at BBA@AELSZZRWZOCA at ABCA9)

































$7ABAA at BFMT\\RPWQGB at ABCA9*

























%8ABAA at BELT^^PWXNFB at ABBB:+
























&9ABBA at ADJS\^QU[PEAAABBA:+
























'9ABAA@@BGOXVOWXODAAABBA9)
























$(:ACBA@@AEKT[WMJHB@@ABB at 6&


















)(9ACBA@?@BHMRRKEDA@@ABB?3!

	





+!'7ACBA@??@DFECEFC@?@BCB</





(-"4?BBBA?>>@BCCAA@??ABCA8(


 7
.<BCBA@?>==>?@?=>@ABB>3 


:
(7 at BBBA@?=<===<=?ABBA:+
2/
0<BCBA@?>===<=>@ABB>3! >$5?BCBA@@?>?>?@ABB at 8)
9)*9?BBAA@@@@@@AABA</

+$=
-9?BBBAAAAAABBA=3%

+:/
.9?BBBBBBBBBA=5'
 B

 .8>ABCCBBB@;3&

0;
+59<>?>=;7/$


;/
&,./0//-'


	<$






	
3





+
+
+

+
+
#

+	




		3-0(

(*%"
	
+
+

+
		 [...]
+
+

 [...]
	
+


+







+
+






+


+ [...]
+
+
+		
+

+			
+

+
+		
+								
+
+	
+
+
+


+
+
+
+	
+
+
+			
+
+			
+	
+	
+						
+		
+
+
+				
+			
+	



+	
+
+					
+
+	
+
+

+
+	
+
+	
+		
+
+	
+	
+	
		
+		
+	
+
+	
+				
+
+		
+
+	
+
+		
+
	
+
		
+		
+
+
+
+		
+	
+
+
+
+		
+
+
+	
+
+		
+							
+
+
+
+		
+	
+
+
	
+
+			
+		
+
		
+
+		


+
+	
+		

		
	
+
+






		
+

+						
+
+		
+
+
+


			
	
+
+		
				
+
+


	
+

+
+			
+
+
+


+
+
+		
+
+			
+			
+
+
+
+
+
+
+
+
+	
+		
+


+		

							
+



+		
+
+	
+


+				
+


+			
+
+	
+


+						

+					
+
+



+		
+
			






+	
		


+									

						
+
+



+
+			
+		
+	


+		
+
	
+

+			
+
+								
+
										
+



+
+
+
+							


		





+	
+





+
+				
	
+

+							
+
+

+			
+
+
+
+
+


+
+
+		
+
+		
+


		














+

	

					
+






+		


+
+		
+
+




+		
+

+
+
+
+	
+
+


+









	

			













+			
+





+


+	
+
+
+
+	
+
+	





+

+

+
+
+
+

+

+	
+
+













			



+		

+


+







+	







+
+
+






+
+















+
+
+
+


+
+




+
+
		




+






	


+























						

	









		






+























	
+


+







+








		


























+
+
	
+
+

+
+










+
+
			



























		
+	
+




+













+			
+
+
+




	
























+			
+


+		


+
















+
+
+
+
+	
+






























								







		













+
+
+
+		




+






	


























+				
+
+		
	
+



		
+















+
+
+
+




+



	
































+	
+
+
+

+		
+	
		
+
+







+












+
+



+








































	
+
+				4$
		
+


+



























































+
+
+
+			
3G 				
+

























































	


+
+
+			
,<@(		
+		
+
+
+


















+


































+	
+

+


+	;O=(

	
+
+
+













+










































+
+

+	
+
+	>D+
 2' 

+	
+

+
+












+
+






































+
+
+

+
+
+
+:<

$+440,&#!
+				
+

















+

+




































+

+
+

+
+	
6<#,389;;94//&	
+

+
+













































+
+



.?
'17;=>>>><84.		
+


+

















































+$C
+4:=>====>?>:3&
	
+


+
+
+










		
































B(
+7=>=<;;;;<>?>;3%



+
+
+
+










































39*7>?><:9889:<>?@<2"

+











































D
(6>@?=:998899:<>@@;/
















































44#4>A@?;::::;:::;=@AA:*














	







+


























=
/<AA@=;;=?AA@?=<=>ABA6#



















+






+


























)5'9AB@=<=@EILNKGB?=>@BC>/



























































4&
3ACA?=?CHNTX[XRKD@>?ACB:&


























































5
'<CB@?@EMT]dghe_WME@@ACD?2


















































&4
1BDA at AFPZdmsvtqkdXNEAACDC;'




















































//8DCAADMZhsx}~{wpeXLDBCDFA9 





























































4,%>DCACHO_t}�����~yqcTHCBDED=@%



































































8),AECBEOYdt��������xjZLDBCDC85K$
































































:(0CEDDGRcs}�������wgYNECCED:!09






























































<(3DEDDHSfv����~���{oaSHDDEE=%#"



























































?(5DEEEHSet}��������vfUIEEEE?*
























































B*7DEEEHQbq}���|���}tcRHEEEE?+




















































E-9EEDEHP_nz����~���|r`OGEEEE>*



















































E/:EEDEGN\lx����z���|o]NGEEEE=(










































B2:EEDDFLYiu|����y~�zkZLFEEED:$





































<5:EEDDEJUcow{���xzwhUJEDEEC6

































269EEDCCFO]ir{|~sw�{raPFDDEEA0




















&66DEDCBCHS`lty{tqyuhXJDCDEE<%









23AEDBAABGO[hqpmotjZKCABDEC3




)/<DDBA@>>BJWehbfg[KB?ABDD>'

 (4BDCBA>==@FPQPXYMB>?ABDB4!
$)<CCBA?><;=ACCED?<=?ABC>-

! .>CBA?><:::==;:9;=?ABA7$

+
 1 at BA?>=;:88879:<>@AA;+
+#6 at A@?><;:988:;=?AA=/


"'9@@?>=<<<;;<=>@A>2
(#*9?@??>====>?@@=3!

0
*8>@@@@@@@A@?<3"
&6
)5<???>>>><8/ *= $.333/%'--'


,D !$#

	1D 	/I/%
,;/&


#
 [...]
	

	


+






+






+


+


	
	





+
+



+

 [...]


		
+

+
+






+
+





	

	 [...]
+			
+
+
+


				
+
+				
+			
+	
+		
+			
+
+	
+							

		
+								
+

	
+
+					


+		
+	
+	
+
+					
+
+
+
+	
+
+	

							
+	
+
+			
+
+

+	
											
+	
+	
+
+	
+		
+
						
+


+	
+	
+		
+
+
+
+		
+

+		
+			
+
+		
+				
+
+										
+

				
+						
+
+
+
+
+				
+	

+
+






+
+	
+


+								
+
+		
+
+
+
+				
+


						
+				

+
+

+



+					
+											
+


+
+
+
+		
+							
+


+	
+




+							
+
				
+						
+
+
+

+	
+	



		
+	

+	

	




+
+	
+								

+			
+							
+
+
+


+
+			
+
+		


+	


		
+
+


+
+						

	
+
+
+						







+



+
+
+			
+			

	

	
+










+

+
+
+				
+		








+		
+
+





+
+
+
+

					
+			



+
+

+


	

	
+
+		
















+	
+






+		
+
+
+
+
+
+		
+	
+
+		

+
							
+


	

		
+
















				
+	
+				



	
+



+	
		

+
+		
				






+
+
+
+
+
+
















+	

+
+
+

+


		
+




+	
+				


+


+























+
+		
+
+	
+



+		
+		





		
+			
+		
+

+




+
+


















+
+

	






















+





		

+		
+			



+	






















+
+




	
+

+
+

















+


+			
+
+


+


	

























+
+
			
+





















+
+	
+
+
+
+



+




























+


+		
	
+





















+
+
+	


+
+


+






























+

+		
+					



















+


+
+
+



+















+
















+
+
		
+

+				
+






















+
+
+
+






+


































	



+				
	



























+
+	













































+	

+	
+				:*	"(
+
























+
+
+


















































+
+		
+			
+%. 96	




































+
+
+





































+
+
+	
+
+		$J<

+
+
+
+



+

























+
+
+




































	


+
+			%>5*2/)&"
	
+
+



























+
+

+



































+
+
+

+
+
+	
+2.-07<9753*"
	
+
+




























































	
+
+

+

+	*+058;;<<<<:8-

+
+












+








































	

+

+
+
+	'.5:;;:99:;=>?<-
	
+
+






















































+





+		$19==;975678;=?@8*



+

























































	 0;?><86556779;=?>7'	
+

+






























































+
.;@?=:88;=>><::<>@>5"
+

























	
+








































-:@A?<:<BHLLJFA=;=?A=/





























































,9 at A@=;>FPX]]ZUMD?=>@A:'
































































)6 at BA?=>GTaiknlf\QF@>@B at 4





























































 6<CB@>@HUeqvy{zum`QE??AB=-




























	

































3<ACA??GUgt|����xo_NC?@CB9#






























	


































 ?>DC@@ETfu}~������xkYJA at BC@/





























+

































2BBDA at ETfv���������~ufUGAACD:%






























































@BDCADReu����~|����{qaOEABEA0




























































$GBECBKau����|xxyz{|}|ymYJCBDE9 



























































.GCECFSi{��ztoqrstx|}}vdRFCEE>%



























































4GDDCL_r����{vrtux|~~{nXHCDGA'






















































9FEDDNe{����������������rWMECEE7





















































<FEDFPf|���|yzx{�~������scRGDDCA=



















































=FFEFOez�uqiekz~rn{���}hRGEFD6D=














































=FFEGOcy�}somel���skov}�zePGEFF6&I*












































<FGFGOcx}|qkghm���njouz}s`NGFGF:
';




































:FFFGObu{yrjjjw��zflsyz}t]MGFGF< +#





































9FFEGOasyuqrolkz�~xpqy|{oZLGFGF:!
































7EFEGNapwutomkim|~�upw{zmXJFFGE8 


























3EFDFM^owxrpmgjr{�~mqx{wiUIEEGC2














/CFDEJWiuxtplgl~�xnqy|tcQHEEF>+









*AFDCGO_mwvolii{��ukpxxn[LFDED8&

%=FDCDJTaktuspoy��vqwwreSHDDE at 3 
!5EDBAEKS]juwyz���xvwpbRHCBDD=.+ at EB@ABHR]lvz���ufSFBABDB9&

#5DCA@?BHP\jsz}xz}xjXKB at ACD?2


,=DA@>?@DMXgqwyqpfYLC@@ACC:'

+ /=C@>?>?DJVemoaRPLF@?@BC?/
+!0 at B??==>BHLOQRMJG@>@AC at 3%8BA@><<=>?=>AB@=<>@BA6#

(<BA?=;::;=?><::<?AA6"


"*=B@><:988888:<>@A9%
!!,>A?=<:9999:;=@@9) 
0=@>>=<<<=>>?>4%


#29=>>>=979;93$
	
//179974.++( 	#:*#(*)%!





*C%

	
+D#




+
+%6

	







+	







	







+










+








+


+

















+








+
+


+
+
+
+













+









+


















+

























	


























































+



+









 [...]



		
+
+
+
+






+
+





	

	 [...]
+
+
+																												
+		
+		
+
+
+
+	
+
+		
+			
+			
+
+			
+
+
+								


	
+
+						
	
+

+				
+						
+	
+	
+
+
	
+
+
+
+
+				
+
+			
+
+
+

+


+									
+		
+		


+
+
+
					
+

					
+
+
								

+		
+					
+
+		
+	
+	

+
+
							
+

+						
+							
+		
+	
+		
+	
+				
+

+									
+
+										
+			
+		

+								
+



+											
+				




+	

+			
+
+	
+
+
+

+	
+
+
+					
+
+
+			
+								
+
+
+
+
+
+
+
+		
+	


			
+



+		
+

+													
+	
+
+						
+
+



+
+
+
+
+	
+
+		
+
+	
+	
+	
+


+
+
+				
+
+
+
+
+
+
+
+
+
+					
+	
+
+
+
+										
+
+



+
+
+					
+
+

		
		
+
+
+						
+
+







+	
+

+
+
+
+
+				
+

						
+
+









+				
+	
+













+
+		
+





+		
+
+
+
+
+							
+
+
+
+	
+
			






+







+
+
+		













+						
+




	
+
+

+	



			
+
+
+



+
+






+



+
+		
+
















+
+	
+
+

+	
+
+
+



+
+

		
+






+
+





+
+	
+


+
+
+		




















	
+	
+
+		





				

+
+







+		
+

+
+
+
+
+	

+

	























	
+





+			





+
+
+
+
+

+








+		
+

+
+
+
+






+
+





















+
+

+			
+
+
+	


+





















+
+
+
+
+

	
+

	
























+

+
						
+	
+


+
+




















+
+
+
+
+


+
+






























+				
+
+
+
+
+

























+
+
+
+


+
+
+






























+		
+		
+
+

+




+






















+



+
+
+
+	
+































		
+
+	
+
+	
			
+
+
+





























+
+
+
+




































	

+			
+
-.			
+
+

+
+

































+
+


































+
+

+			:3#C;			
+


+
+





































































	

			0
1F9

		
+


+
+








































































	

+
+
		
*<C4'! 


+


+
+
+




























	







































+


+
+	
(;?954441+ 
+
+





































































+
+


+
+	
"/8;;:899;<:7,		



+
+




























+


































+




+
+5:=<965568:=?=2"		



+

































































.:=?=:6456568:=?>5#	
+



































































+
+:??>;89>BB@=:8:=@?4 	



































































&8@@><;?GRYZXQH?;;>A>1



































































!6?A?<=CN]jrtrl`PC=<?A=+




































































2>B?==CRdv�����whTE>>AA8!





























+
+



































+<AA>=CQfy�������yiTE??B?0

































































7AA@>BPew��}{����xePC?AB;%


































































->BA>?Kbu�|rmux{���t]J@@BA3



























































!8BA?>FZr~~zrmiilqx~�{jSD?AC>*


























	






























+?C@?EWm}~vogdbbdflu|}vaLA at CB7
























	





























4BC at CRj|�xog`^_\_`gkqx|oWF at AD?+




















































 :CBANg}�yqhaZY[XY]adksyxgPCACD7





















































%?DAG`|�umh_YXXYZ[[`dluzs^KBCE?'






















































,CDCNm���zneWTX[cd^^_bjqz|lUFBEC0



















































3DCI^x����|s_efhikegffjry�y]IDEE5















































%:EDNk����������yoz~wtuz��v_OFFE8

















































*>EEQn��uqt~�����{����������pVGFE8












































.AEFSl�~oc\alnyytzy|��������rWHEF8 











































"3CFGSl�ylcWV]ceoyy|snqyuru}�pUHFG@*







































#4DFHSk{zm_Z_hhalyz|umkjjmq}�mTGFGC;!




































%8FFHSjzxmb`cfjjlx}{xg[jjhm}jRGFHC;<





























&;FFHSjywkccfhgdoxzzr]Odhio{{hQFFHD2D5

























'>GFHSixtia[dmg`dpxxwnfiffmxxdPFFHE0.H 
















'?GFGRhvsi`_elliimqtxreejjovubOFFHE07*







#:GEGRgvskcafjjjjoinog_`ggmur^NFGHC.#


"9GEFRetund`b_fflpklh^Y^ciounZLEGG@("9FEEM_qvqh`ZPUeflstlX[chjoshWJEGF;"!5DFDIXlvsneb`\dfo|�yjhdksspcSHEGD5
 .AFCFQbrvumgifer|�kbejqvuk[NEEFA. [...]
"5CEBEP_lu|{vonw��~simtyqbTICCFB2


 ->ECAHT`mvz}xoihw~~nrvsgWJCBDE<(

+
'5BDABJT`kv||ytkw�~xxkYKDACE at 1

+
",9CCACJS`luz||}~��{r`NDABDC7$
(0=CB at BIS`ktz{yyxvvm`RFAADC;)

!*3=BA at BGNXdpy|~ykb\RGA at CB9)


$,6?B@>?AGPYakpd]UHA>@BC;*

'08?A?==>CIJIJPMD><>AC=,",27=A?=;:;==::99;=@A<.
#-24<A?=:978889;=@@;0%
	%,/3=@?=<:99:<>?@=3&	
"'-3:>>==<===<;7.!

#(/78789852-&



'3,#&$





9$
	

		
+
"A&	







+
-







+




















+










+		
+
+	
+











+












+
+
+
+













+









+


















	









+


















	






















































+


















+










 [...]



		
+
+
+
+






+
+





	

	 [...]
+
+																									

+
+							
+	
+								
				
+												
+					
+
+										
+


			
+
+
+
+
+				
+				
+											
+				
+
+				
+	
+										
+
		
+	
+
+
+		
+			
+			
	
+		
+
+		
+
+					
+	
+				
+	

+
+
+

+
+
+		
+
+
+
+	

					
+	

+		

+	


+
+







		


+
+				
+	
	
+
+
+
			
+					
+
+
+
+
+		

+		
+				
+

				
+
+				
+
+


+
+		
+
+
+						
+
+



+
+
+			



+
+

+	
+
		
+
+		
+
+	
+



+	

+	

+
+		













+
+
+		
+



+

+	




+
+

+
+



+
+	
+		


+
+
+
+
+
+
+
+
+



			
+
	
+
+			
+


+


+
+
+
+
+
+
+




+
+
+			

	
+
+
+
+
+	
+
+
+
+
+
+
+
+

		
+


+



	
+
+
+
+


+
+


+	
		



		
+
+
+
+
+
+
+
+		
+
+
+
+


+			

+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+

+	
+
+
+
+			

+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+

+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+				

+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+			

	
+	
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
						

+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+	



+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
					$
+		
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

				
+	
)B:				



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
		
+
+<<


:JA			





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			



+
+
+
+
+
+


+
+
+
+	
+


+


+
+





+
+
+
+
+
		

+		/& 
!$+970-			


+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+		
+

+
+

+
+
+



+
+
+
+
+
+
+
+
+
+
+
+





+

+
+
+
+
+
		

+			 078:<9523/'
	


+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+	
+

+
+


+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+


+
+

+		
			&3;?>><99<=<8-		


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



+

+
+
+
+
+
+
+
+		
	

+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





+	

+			!/9??=;:879:<>?<2$	
+
+
+	
+



+
+
+
+
+
+
+
+
+
+
+
+	

+
+
+
+
+
+
+
+
+
+
+	
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+



+		

+		$5>A@=;:99;;::;=??8)	
+
+		



+
+
+
+
+
+
+
+
+

+
+
+




+
+
+
+
+
+
+
+
+
+			
+
	

+
+
+
+
+
+
+
+


+




+
+
+
+
+
+
+
+
+
+
+
+


+






+	


+	%6?A?=<?EKOQPKD>;<@A:(				

+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			

	
+

+






+








+
+
+
+
+
+
+
+
+
+














+!5?A?==DQamqnplaRD==@@9$		
+

+		
+




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+




+
+

+


+
+
+
+
+

+
+

+

+

+
+
+
+
+
+
+















0>A?=>GXk}�����|m[I?=@@6

+
+

+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

	


+
+
+
+
+
+	
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+





+
+



+




+<B@>?I[p���������saL@>A?.
+




+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


+
+


+
+




+
+
+

+

+
+	
+

+
+
+
+
+
+
+












#8AA?>G[p���ztty���v`J??B<%	
+
+


+



+
+

+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








+
+
+
+
+
+

+



+





+
+
+

+










1 at B@?EXo{~{pighkns{�qZF?AA4
+	
+












+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
	





+
+
+
+
+
+

+
+




+	
+

+
+


+










$;BA?BRjzzqk_\[^\_elv|{jQB?B>(	
+










+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


+




+
+

+
+
+
+

+
+
+
+
+

+
+
+
+
+
+














1 at B@@Jcvzqf_ZVUWYVZblu{v`I?AB7

+
+












+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+






+
+
+
+
+
+
+
+
+
+
+
+




+
+














$;BA at DZs{tg[WXUWZ[Z_ackuwnTC at B?-
+
+












+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+











+
+
+
+
+
+
+



+
+


















/AB at ARo}yjaXUWY]_`b`babn{{bI at AB:
+
+












+




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







+
+



+
+
+
+
+
+
+
+
+
+
+
+

















8CA?Ig~}rdYVUYaeeegedbciurTB?BA.
+
















+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+


	










+
+
+
+
+
+


+

+


















$>C?C\|�tbYVUV\ahegkjdbcfn~~cH?@C9

















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
	
+






+
+

+
+
+

+
+
+
+

+
+
+

















+ at B?Qv��m]TSRV]djillhecc_du�tWB?B@)
















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+





+


+
+
+
+
+

+
+
+
+
+

+
+
+
















.A at D`��snh`UXbmmonhfe_abdkylL>AC4

















+
+
+
+
+
+
+
+
+
+
+
+

+

+
+

+

+







+

+
+
+
+

+
+
+

+





















1A at Nw������peagsqmjfgh``dfnz�zVAAD;


















+
+

+
+
+
+
+
+
+
+
+

+
+
+















+
+
+

+
+
+
+






















&;AAc��������rvslfeejkoopry��z\C at C?&















+
+
+
+


+
+
+
+
+
+

+
+
+
+













+

+
+
+

+
+
+
+
+


















1@@Fq��z�������}ra]afmqx|������lI at C@+


















+
+
+
+
+
+
+
+
+
+

+
+














+

+



+























6B at Lw��k`bqx{pi_TTX^fjr}�����|O at CA/




















+
+
+
+

+










+







































9BAPy�zd\ZaktsdYPJHMSY[^l~}qlv�}R at CB3



















+
+
+


+











+







































$<BBT|�xe\\bltk[NJIFILONO]smhmu�zQABB6



















+

+


+

+

















































.?BCX~�ud[]fssbRIFFFGHHGHWrmeow�xPABB7

























+


















































1ACC\��sd\akteSNHEEFFFDACPosjmz�uNACC9












































































2BCC]��sa_dms`PIDCDFFFB at CQlpihs�rMABC=













































































0BCC\}|oa_foqaQGCBCEEDCBGRelc_m|pMABC>+












































































,ABBY{zna]bqucRIDCBCBCEGKSiqecooLACC87)




































+






































*ACAWz{ob[\lviTIECAAABEGJTipfesmKABD3-D




































+






































+ at C@Rw|nb][dumTIECAAAEGHKRdkhiuiH at CB09!










































































+ at C?Kq~tg]X^qnSIGECCEIJJLSckefu}cE at BA+










































































+?C?De�yj_V[kv_MGEFKPSSONQ`nkoz|\B at C?%









































































(=B@@Wz{re_ZdujWIGNZa\VTRUfqmv~vR at AC;










































































%:AA>Jo�zoe[]lscVT[hh][ZY]prs|�iH?BB3










































































%8 at B?C_}�yoebdmmhelwxukcgq|yz}tVA?C@*




































+





































!6 at B@?Oq|ynfdhlnko}�rfbkx|zx_G>AC;!



































	





































1>BA>E]x~vnhghehm{�{xijuz}{eJ@@CA3









































































+;AB@?Lg{~zrmeb]k{~}tgow{|lPA?BC<&










































































"6 at AA?BUmz��|tjh_\w|�qt{|pVE?AC>1










































































-<ABA?FWk}��xskbz�����}qYF@@B?5"




































	





































!4>BB@@GXiv��|uu�����wiVF@@B>5&



































	






































'8 at BA?@FQ`n{��~~���|pdRE@@B>6*










































































-<ABA@?CKUbjsz|xvmbYNC?@BA9,







































+






































5?BBA@>?BFINUakbSMGA>@BA>2






































+






































&9 at BAA@>>===@HIHA?>?@BB?6!













































































,:@AAAA?>=<;=====?ABA=5%







































+








































,7=@AAA@?====?@ABA=6+

+







































+







































$09=@@@??@@@@>94.%



















































































'-236898550(



















































































"%,(























































































+=0





























































































7 

























































































+	
+
+




























































































+
+

+
+
+
+
+
+
+
+




























































































+
+



+
+






+
+
























































































+




+
+
























































+











































+
+






















































+












































+

























































































































































+































































































+


























































































































































































































































































+
























































































+























































































+



























































































































































































































































































































































































































+










































































+	






































































	


















































































































































































































































	






		








		





	





	



	



		


+	

	 [...]
+						

+			
			
							
+									
+							
+				
	

+			
+
+

+				
+			
+	
+


	
+
+

		
+			

				
+
+
+				
+
+
+

+
+
				
+
+			





+

		


+		
+	








+


+	
+		

+		
+


+								
+

						
+





+					
+		
+
+	
+									
+
+	




									
+
+		
+


+						


+			
+					
+	
+		
+

								
+
	

																		

+							

	
											




									

			
								
+	




+											
+
+	
+
+												
+

+											
	
	8J0	
+				
+																					
+	
6<

 7G0
+	
																																				
+	."
$-25668;@2
	


											
+																	
+			
+
+				
+	
+
+(6;>???>=<=<7*
	
	
+	
																								
+	
+

+								
+

+					
+			"0;>?>=<<;;;<=><4$
+	
+

+																							
+
+
+
+	
+													
+				

+	(8>@><::;<<<;:;<>?9)	
	
+
																																												
+
+

+		):@?>;;?GNRTSNG@;:=@;*		
+

+
+											
+																																									
+
+		
+	(:@?=;>JZlx}}ysi[K>:=@;&		
+


																													
+																

+
+
+	%9A?=<ASj�������}lVC<>@8


																													
+

+
+
+															
+
	
+
	
6@@==DVp���~uks����s[E<?@4


+	
+
+
+																												
+													
+
	
+	0?A?=DYr��ypjcbahrx��v[E=@?*	


+

																									
+																							
+
		
#;B@>BVq��uhb[WZ]^beo|�tWA>A:


	
																																																									
+
			
1AA?@Pm��qc_`]ab_[[[^o~�lO??A1																											

+																															
+



#;B@>Ie}q_^adegffdbYYdo}zbG>A>%
	
+	
+																																																													



0AA>BXw�rb[`gdgikjkib]Xar~rUA?A5
+
																																																																
+


:B??LixdZ\ekhjmjlkihgYYgwzdH>@>(


																																	

+																																		
+


*@A>D]z�m[W`hggjmlhhjnoe\^nrS?>A7


+
+																														
+																																					
+
+
3B??Pqt_V[hlknmmhbadhmnhacz}cF=@?(


+
+
+																																
+																																		
+
+
+

;B>Ec�{]PUbjmpsoh_YYWZcnlffq�qQ>>A6

+
+																																	
+																																	
+
+	
+
+
+
&?A?Ty�w[SVgmoppeWSPPNOV`dfbi}}aD=A>#


+
+
+
+																																																																
+
+		
+
+
+
+A?Fj��ypqaiqqqo`QMJHGJP[di`]q�tQ=?B0


+
+
+																																																																
+
+
+
+	
+

+
+
1A?U�����rrupql[MHDBDFKYjmddo��aB>B9


+
+
+																																																																
+
+	
+
+
+

+
+
 9AB^�������}sqocRGC@@ADIUjox���hJ>A> 
+
+
+																																																																		
+
+
+
+
+

&>@Hq�������{qmdVHA@>>@BGTjz�����sR>@A)
+
+
+																																																																	
+
+
+
+	
+

3A>S��sgt��}qbVOGA??>=??BLax������\@@B0
+
+
+																																
+
+																															
+
+
+
+
+
+

8@?_��l`dpun`RF?????>=>>?FYn��tn��bA?B4
																																				
+																																			
+	
%;?Bg��dZ_jleXLC>=>???=>>?@Rsxqmk}�aA>B7
																																				
+																																
+
+				
+=>Ej�zd\cli`SG@>?>>??>?>>>Mpvpfh|�aA>B:	
+																																	
+																																							
1@>Fm�xa_jni\NC=?@???????>=Hirofh|�_A>B;

+
+																																																																									3A=Fo�s\ZgohYJ@=?@@@??????>Fcsoig|�]A>A<

+																																			
+
+																																					1A>Fp�rXUfqjWF>>?@@@???@@@>D]rqicz~\@>@<

+																																		
+
+	
+
+																																		
,A>Eq�q[UgrmXE>=?@@????????CXllfax}[@>@:
+																																			
+																																					
+@>Do�r]Rbrr]H>=?@@?@??????CWqn`bx}Z@>@8
																																	
+	
+	
+																																					
,@>Cj�s`T[mrgN?=>???@???@??CYqlce~|X?>@6%																																	
+	
+																																					
-@?@d�sbXYfqnTB>>>>?@??@@??BTme_gzV>?A17"																																
+
+
+
+
+																																		
+
+/@?>]�yf]\aqs_G??>>??>>@???ARk]]n�tQ=?A(08																																		
+
+
+
+	
+
+
+																														

0@?<Qy~m`ZalsjN????@?=>@@>>@Plc^pmJ<@?!/																																	
+
+		
+		
+																															
+0@@<Hn�paY^hsqZC?@??>>>????ASnaasfE<A;
																																	
+		
+
+	
+				
+																											
+/@@<Bc�wf^[aougL@??>??@@?@@F`rdi{|]@=B6
																												
+
+	
+
+		
+
+
+
+
+
+
+																														
,@@=>Vyk`\^ksp[GA??BDFECCGUmthr~tQ=?A-
																																
+	
+
+
+	
+
+																														
+
(>A><Km�yg_\akslWIFFMSSTMLTguqr~|eE<@?%
																														
+
+
+
+
+
+
+
+
+																															
+
$;A?<C`~�rbZVaowl\VX_eee_Y^pxu}oT>=B;

																													
+
+
+
+
+
+
+
+
+
+
+
+																														
 7A@=>Po�}pcZ\eqtnaclptrmjkuuz�u[D<@A/

+
+
+																												
+
+
+
+
+
+
+
+		
+																														
1?A>=D\x�{lc^Zblma]h{{|jkpr{�{eL=>B;!
		
+																										
+	
+
+
+
+	
+
+
+
+
+																															
':A@=?Nh��zph[Y[[X^n�yymhox�~kTB=A at 0
+
+
+																												
+
+
+
+	
+
+
+
+																																
+
1?A?=CUo��umf[XYal{~~�{y�~fTE>@A7"
+
+	
+																												
+
+
+
+
+
+	
+																																%8AA>>FZq���{rh`^o�����~�~lSD>@A<*

+
+																														
+
+
+	
+	
+																																	
+<B@=>GXm���ypmq�����ziSC>@B>/



+
+
+																												
+
+
+	
+
+																																		
+
1?A?==DTet��~������{sbMA>?B?2


+
+
+
+																														
+
+
+
+																																		
$8AA>==AIS]gmot���}qcUH?>?B at 3


+
+
+
+
+																											
+	
+
+	
+
+
+																																		
*<A@>=<=?BGMR[hjhbVH@=>@AA8$

+
+
+
+																															
+	
+																																				
+
0>AA?>====>ABEEB=<<=?AA at 6#
+
+
+
+
+
+
+																													
+
+
+
+																																				

1=AA@??>>>=<==>>?@AA?:0

	
+
+																															
+
+		
+																																					

-9?@AA@@@@?@@@@@=93+ 


+																																				
+	
+
+
+																																				
&06:<>?@A><<91(


																																					
+
+	
+																																						
+

#&).2.*,

+																																					
+
+	
+																																								
:3

+																																							
+
+	
+																																									




4


+																																							
+
+
+	
+
+
+																																									
+




+																																									
+
+
+
+	
+
+																																															
+
+


+																																													
+
+	
+																																														
+
+						
+
+
+
+																																									
+
+																																												
+
+								
+
+																																							
+
+	
+																																																																																																	
+																																																																																															
+
+																																																																																													
+																																																																																																																																																																																																																																																																																						
+																																																																																							
+																																																																																				
+
+																																																																																	
+	
+		
+																																																																													
+			
+		
+																																																																									
+	
+
+
+
+
+		
+
+																																																															
+
+		
+	
+		
+
+
+
+
+	
+																																																													
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																																									
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+										
+
+	
+																																							
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+			
+
+
+
+																																		
+				
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+												
+						
+			
+										
+
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+									
+								
+
+		
+						
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+								
+
+	
+
+
+	
+
+		
+						
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+	
+	
+			
+					
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+	
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+			


+
+







+
+
+
+
+
+
+
+	
+
+		
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+












+
+
+
+
+
+		
+
+			
+
+
+
+
+
+
+
+
+
+
+
+





+







+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+














+	
+
+
+
+

+
+
+
+
+










+	

+
+

+




+						 [...]
+									 [...]
+	
+													
+						
			
+
	
+

			
+				
+	
+			

+	
+

		
+
+

+
+			
+	
+			
+

+		
+				
+
	




+


+		
+


+




	
		
+		
+

+


+	



+					


+		
+

+		
+
+						
+
	

	
+			
+						
+
+		
+							
+






					
+					
+


+
+				
+
+	
+	
+
+
+
+
+			


+				
+
+										
+						

+																	



																			
+

+												
		
+																			


+																		


+
+

+																



+																		
		
+



+	8A
+		
+																					
+

+																								5:

$()*)$(9:'																																																	10**39<===<;;><+
+																																																		
+
+8=???>>>>=<==9.
	

+
+																				
+		
+
+	
+																								
+
+					
+		%3<?=<;:;;;:::;=>=6&	
+



+				
+													
+																			
+
+
+
+					
+	
+


	
+
+					
+	
+-;??=:9<BHLLJGB=;;=?:)



																															
+																			
+
+	
+
			
+			/<@>;:=IXgquutpgYJ?:<?<(

+
																																																
+

+
+-<@>;;DVm�������pZF;<@: 

+



																																																					

+
+
+(;A?;=I`x��~wtrry���|cI==@4
+
+


+																																																											

+		
 8A@;>Nh}�~qd_\Y\bir}��gK=>?,



+							
+																																												
+

+
+
+1@@<<Mi�ymgbeb_^[[]gt~eI=@<"


																																					
+						
+																				


+
+
$<A=;He~zrgdglnnnnh`Y[_j{{aE>A5	


+																																						
+																				

+
+	2@?;B]{�m[ailmijnrqgb_U`o}vXA?@,

																												
+												
																	
+

+	
"<A>?Qt�wcV_mib[_hgiiqhZZbs�mM>A;	
+																													

+
+				
+																											
		0@@=Gf~{i[_lp]SQRVY]`mrgYWd{|aC?A2	

+	
+																															

+																																

+

9A>@Vv|l\XjtjUKJKJLPS`oqaX\lsP>@=$
	

+
+																															
+																																	

%?@>Jj}q]Wcqp_MFFGDCFGN`pp^U`y}_B>A3

+
+																																																																	
+
.A>A[zu^VYcojUEACCA?@ADPdtq^[mnL=@="


+																																																														
+
+		
+


6A>JmrSK_jl_OEA@@?>>??DRgth[aux[@>A1

	
+																																																												
+
+
+

+
+

+


!;@A[|}fPNeqfWMFA>>>=>>>?DMZhhZmkH=@<


+
+
+
+																													
+
+																										
+
+
+
+




+
+
+
'??Ho�zdhbij`TKD?>>>>>????AOdhTb}yV>?A*


+
+
+																														
+																														
+
+




	
+
+A?V���v�zygZQJC>>>???????BSge^bq�hD>B4


+
+
+
+																																																												
+
+
+
+

+

	
3ACg������tcWMGB>>>???????CWkppns�rL=A=



+
+
+
+																															
+																											
+
+
+
+
+
+
+
+

!<@Fk�����}l]SJC>=>????????AUo�����zW@@@&

+
+
+
+																																																											
+
+
+
+	
+

+	
,??N����z|r^RJC=<=???@@???=>Ml������fA?B-
+
+
+
+																																																											
+
+	
+
+
+
+
+
+
+
8AAd�wfmto^LEA>==??@?@@?>=<=D[o|����sF>B2
+
+
+
+																														
+																												
+
+
+
+
+	
+
+
+
'>?Fr�l]hmeTE@>?????@?@@>>==<?Me||ut�uI=B7

+
+
+																														
+	
+																														
+			
+
+
.@>Jx}d]gi\KB???@???@?@@??>>=>Oixobh�vI=A;

+
+
+																														
+	
+
+
+																													
+
+	
+
+
+3A=Lzz`_ij]I@>>?@@@??@@@???>=>NfnhYc�tI<A> 
+
+																																
+	
+
+																												
+
+
+
+	
+	4A=Nzz`[hk\I@>>>?@@@?@@@???>>>Jaml^h�sH=@?"
+
+																																
+																																
+
+
+
+
+	4A=O}zVNfk]I?>>>?@@@@@@@???>?>G]nreiqH=@?$
+
+
+
+																															
+
+	
+																														
+
+
+	1A>N}|ZQZieK?>>>?@@@@@@@????@?DYmseg�pH=@?$
+
+
+																																
+
+																														
+	
+
+
+	
/A>M|}^W^giP@=>>?@@@@?@@???@@?BWnqbh�oG>@?#
+
+
+																														
+	
+
+
+																															
+			
.A>Lz{aX^hmXC=>>?@@@@?@@??@@@?C[qk`klF>@> 
+																															
+
+
+	
+	
+																																	
+
2A>Kyy`Z^jraI>=>?@@@@????@@@@>B]mXZl�jD>@9
+																																
+	
+																																			
+

6A>Iv}`X]jsiP?=>?@@?????@@@@@?CaoX\o�hB?@3																														
+
+
+
+
+
+																															
+	

9A>Gp�eZ^jrqZC=>??>>>??@@@@@?>E_md_q�b@?@1$																															
+
+
+
+
+
+
+
+
+
+		
+																								
+	
!9A>Cc�l^\gnrcI>=>>???@?@@@?>>>Ffn^_t~Y>@?,>
																									
+
+		
+
+
+
+
+
+
+
+
+
+
+
+																											
+	
!9A>@Wzs`YdlohRA=?????@@@???>?>Npm\cy{Q=@=
5+
			
+																						
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+																							
+
+	
6A>>Ssyh[akom^H>>????@@@????>?Ys_[g~rH=A8&																										
+
+
+
+
+
+
+		
+
+
+
+
+
+
+																										
+	

4A?=Ml~o`]gmpiTC>@@@@@?@???@?CcrZ`ogB=B3
+	
+																						
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+																							
+	
+2@?=Fa}qaZbkmqeOA?@@@??????@@MjeScz|[??A.
		
+																							
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																											
+
.@@=?Uwzka_fgpqbMA???>?AA??@F`t_]o�oK=@@(
		
+
+																							
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+																									
+*?A>=Oq�wg_bhpwtbNDBCBFIGCDGWurdm~_A=B;
																												
+
+
+
+
+
+
+
+
+
+
+
+		
+																									
+%;A?=Fc}�nc`dkqtsaROPKRTSPSZmxfjvnL<?A0
+				
+																					
+
+
+
+
+
+
+	
+
+
+
+
+																													
+ 4A@=?Tr�zmb`fjhknc_`_i`]`irteh{�xV>=A<$
+
+																									
+
+
+
+
+
+	
+
+
+
+		
+																												
,?A?=Fb{�wd`]``cjkjos{lhxuoihy��bD<?A3

+
+																											
+
+
+
+
+
+
+
+	
+																											
+	

"6A@>>Ol��vh`]X[^c_i�ziwsgeiy��fI=>A<&


+
+
+																									
+
+
+
+
+	
+
+
+
+
+																													
++=A@=@Vr��phc_W^cd|�{�k`jz�fK>>A?0

+
+
+
+																										
+
+
+	
+
+
+
+																															

3?A?<DYq���}ug^h|~�~{vgm{�ybK?>A at 6 
+
+
+
+
+																								
+		
+
+
+
+
+
+																															
+
&9A@><DWn|���zr|���vpr{{zoZG?>AA9&

+
+
+
+
+																									
+
+
+
+	
+
+
+																															
+
,<A?><CRcnu{}~��~�����r`M@=>AA:)




+
+	
+																								
+
+
+
+	
+
+
+
+
+
+																											
+	
+
0?A?>=@FLS]fpx|~pij^NC==?AA:)

+
+
+
+
+	
+																								
+	
+
+
+
+
+
+																													
+		
3?A?>=<=>BGMUZTNIFC?=>?@AA:,


+
+
+
+
+		
+
+																						
+	
+
+
+	
+
+
+
+																																
2>A@?>>>===>?>====>@AAA<2#


+	
+
+
+
+																									
+
+	
+
+	
+
+
+
+
+
+	
+
+																												
-<A@@@??????@@@AA?<94,!


+	
+
+
+
+
+																				
+			
+
+
+
+
+
+	
+
+
+	
+
+																															
$4<>?@AABBB@==<7/%



																															
+	
+
+
+
+	
+
+
+
+
+
+																																
+
 (,/-.5993*, 

																																
+
+
+
+
+
+
+	
+
+
+
+
+
+																																	

87

+																																
+
+
+
+
+
+
+	
+
+
+
+
+
+																																			
+



2


+																																				
+
+
+
+
+	
+
+
+																																								
+	





+			
+																																		
+
+
+
+
+	
+
+
+
+																																											
+
+
+




+	
+
+																																						
+
+
+
+
+
+
+																																											
+
+
+
+				
+		
+
+
+																																					
+
+
+	
+
+																																										
+
+
+
+
+	
+
+
+																																										
+
+	
+
+																																											
+
+
+
+		
+
+
+																																										
+
+
+
+																																										
+
+				
+
+																																											
+	
+																																															
+
+	
+																																								
+
+																																																			
+																																								
+	
+
+																																				
+							
+																																							
+
+		
+
+
+																																		
+
+							
+																													
+
+							
+	
+
+
+
+	
+																																														
+																									
+
+					
+
+
+
+
+	
+
+																																																			
+							
+									
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+																																												
+			
+		
+					
+	
+				
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+		
+
+	
+																																											
+	
+		
+	
+			
+	
+
+	
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+		
+
+	
+	
+
+			
+																										
+							
+
+	
+	
+	
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+									
+		
+									
+						
+				
+			
+	
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+			
+
+
+		
+			
+
+
+						
+			
+
+			
+	
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+		
+	
+
+
+
+			
+				
+
+
+
+	
+	
+	
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+










				
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+








+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+







+	
+	
+
+
+
+
+
+
+

+
+
+
+


+
+
+
+
+
+
+
+




		
+





+
+




+
+
+

+
+
+
+		









	 [...]
+
+												 [...]
+										
+
+			
+		

								
	
+
+		
+
	
+


+				
+

			

	
+
+	
+		
+
	


+	

			

	
			
+
	




+
+
	
	






			
+
+
+

+

					


+	
+
+
+
+

+
+			
+

+


+				
+
+				
+
+	
+
+	
+		







+			
+				
+
+

+
				



+
+		
+
+
+		
+
	
+
+



+																							
+

								
+												
		
																	
+		


+
+														
+
		
																			

																	

		
+


+
5+		
+																		

+

+																			
+
	
+5	!)035530+%
$;> 

+
+	
+																					
+
+																									
+	 =+,5;>???????=:6. 	

+																		
+																																3=?@?>==<<<=====:/


+


+																																																		&4<?=<;;<=??>=;:;=>=6$
+


+																	
+								
+									
+
+													
+			
+	
+/<??=;;ALXaegd_VKA<;=?9&
+



																
+
+
+																		
+
+
+

+
+
+
+					
+			
+
+		
+				
+0>@><;APex�������ygQ@:=?:!	
+



+
												
+

																																	
+			
+
+
+							->@=;<Iay��~}sryz���y`G;<@4


+																																																					

	
&<A>;?Qm��{peca`][erx��jK;=?)


																																																											
+
			
8A?<?Uq�mfa]bca\[[^_g~�oM<?:

								
+
+																																										
+		
+
	0@@=>Rr}mZeintvuqkbZTXh|�kI=@2

+	
+
+					
+
+																																																					
+
	
+
!<A>=Jn�pedglqopptsspg_[X`w�gF>?)

+		
+																																																											
+
		1@?<Dc�{fWfsk`WSUZ[agkpaSYl~}^A@;


+																																																														
+
+		
;A>?W{m_]nwbMEBADGLRbsm]Y^o�vQ?@2																																																														
+

+@@=Lo�ob]bsrWC>==>>ADPergY[cu�hE??(
+																																																															
+
	7A>A_}v_X\guaH?>>===>>APhpaY\jzT>A:
	

+
+
																																																												


+
 >@=NrycQXfsiN@>>?>>>>==BUnr_X_t�gD>@,



																														
+																													
+

	
)@?@_ziQM^orXC==??????>>>E\smXWfzwO;@9

+

+																														
+																											
+
+
+	
1A>Lrx_KOgs_I?==>???@???>>HbvfTVkza@?@(
	
+
+																																																										
+
+
+




8 at A_qWLVikNA>>==???@????>>H_s^HbzrK=A5


+
+	
+																																																						
+

!=@JqgNQemXD?>>>>???@@?@@?><DfhTZt}Z>@=!
+
+
+
+																													
+
+																								


(@@X�v_UatdI@>>>>>???@??@@@@=AZl\Sm�kC>A,
+
+
+
+																													
+																											
+
+
+





- at Bh�wtqsrXD?>>??>???@???@@@>AWohVkzN=B6

+
+
+
+
+
+																																																							
+
+
+
+
+
+


5?Do���|v`KA>>>?>?????????@?>ATn�n|��\>A<


+
+
+
+
+																																																							
+
+
+
+
+
+
+
+
)>?Kp���rbOD>=>>?>?????????@?=?Nf�����dA@@#	
+
+
+																														
+																											
+
+	
+
+
+
+

4 at B^~�xiVHD@=>>>>>??????????>=>FWl~���sH>B+	
+
+																															
+																									
+		
+
+	
+

+
+
!=@GnxedeZF?>>?????????????>=>?>?H]qwu��M=B4
+
+
+																														
+																																		
+

*A>K|xSX[VD=>?@@???????????>=>???Kg~eSw�P=B9

+
+
+																													
+																														
+				
+
+
0A=OqO[hVC=>@@@@???????????>>?>>JcybW|�Q<A=

+
+																																
+
+
+
+																												
+
+	
+
+3A=S�iPfmWB=?@@@?????????????=>>>G_p]Yx}Q<@?!
+
+																														
+
+																															
+
+
+
+
+
+4A=U�kSboZC=?@@?>??@?????????>??>D\rg\w~R=@@$
+
+																																	
+																														
+
+
+
+
4A>W�lR_m_F>?@@?=>?@?????????@@?>CXro]w~R=@@&
+
+
+
+																													
+																																
+	
+
+
1A>W�pQ`scI??@@?=??@@???@????@@@>AUqm^u{Q=@@'	
+
+
+																												
+	
+
+
+																													
+
+
+

+1A>V�nQ]rjN@?@@>>??@@??@@???@@@@>BZph_wyN=@@&	
+
+																													
+
+
+
+																															
+
+
+

4A>V�rU]poXB>??>>?@@@???????@@@?=D^o`bzxK>@?#	
+
+																													
+
+	
+																															
+	
+
+

8A>V�wX]prbH>>?>??@?????????@@@>=HV_`b{vG>@=


+
+
+																													
+	
+
+																																
+
$=A>U�}^_pqfO@>???@????>?@??@@@@?>Nfn`c}pD?A:
+																													
+
+
+
+
+
+																															
+
*@A>R}y`alpeSB>?????>>=>@@??@@@@>?Xxl`h�h@?@3																									
+	
+
+
+
+
+
+
+
+	
+	
+																										
+
+
+
*?@>NxzeajmcRD??@>>>>>>?@??@???@?Cevc\h�b?@>-																								
+			
+	
+
+
+
+
+
+
+
+
+																											
+	
(?@=Jpuf\gnbSF@?@>>>>=>>????>>??>Hop]_n}Y>@<0!																				
+			
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+																							
+	
'>A>Gj|fYfmfXJB??>??>>=>@?>>>>?>=PwlYatzQ=A:,;																						
+	
+
+
+
+
+
+
+		
+
+
+
+
+
+
+																								
+
+	
%=A>Cf�q]akj_QF?=?@@@???@?>>>>?>>Zwg[cztH=A9 <%																							
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+																						
+		
";A>@^~wb\fhf[MC>>@@@@?@@@???@@>Bdn\]ipB>A8$$	
+																							
+
+
+
+
+
+
+
+
+
+
+
+	
+																											

9B?=TuyiZ[dpiYKA>?@@@@@@@@@@@A at PpeN]s�d??B4	
+
+																						
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+																									
6A?=Hfxkb\cpsj\KB??@@@@?@@?@@@HfuaWc}xO<@@.
	
+
+																							
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
2A@=?Wrul`aftxn\OE??@@@?????>C_sgX`v�eA=A<"
+	
+
+																								
+
+
+
+
+	
+
+
+
+																													
,?A><Mt~oc^_hvzrfXHBAAA@@@AAEZvoWWm�uO<?B4
+	
+																							
+	
+
+
+
+	
+
+
+
+
+
+										
+																
+#;A?<Bd�zf`[Tjx|wm]PJJMKHGHL^us^Yl�^@<A>*
+	
+																										
+
+
+
+
+
+
+																														4AA>=Ln�w`ZZ`luwvpg]Xa^VZ\bqr^[n��jI<>A7



+																										
+
+
+
+
+	
+
+
+	
+
+						
+																		
+	
(<A@=?Tx�sb^\_hstrqefxslslonedn��pP>=@?+
+
+																										
+
+
+
+	
+
+
+
+						
+																						
+3 at A?<C`�wic^bhiildx�fjnjhder��sT@=@@4


+
+
+																											
+
+
+
+
+																															
#7A@>=Hf��ynjeaX[nqw}kj[`bev��qVB=@A:$
+
+
+
+																									
+
+
+
+	
+
+
+
+	
+																											
+';A?>=Gc~�ytka[]dkz~�meov�ycN@=@A=+


+
+
+
+																			
+					
+
+
+	
+
+
+
+	
+																										
+	
,>A?=<D^x����zshq����||}veRD>>@B=.


+
+
+	
+																				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+	
+
1?@?><@O]fpz�����|}ucPC>=>@B?1


+
+
+
+	
+																					
+
+
+
+
+
+
+	
+
+
+
+
+																											
+	
+
3 at A?>=<>AFMV_fea_\]YLB>=>?AA</


+
+
+
+
+	
+																						
+
+
+
+
+	
+	
+
+	
+
+																												
/>A@?>>==>>?AA at A@?>=>@@A@<1"


+
+
+
+
+																										
+
+
+
+	
+
+
+
+
+	
+																												
+'8 at A@???????>???@AAA@=6+


+	
+
+
+
+																							
+	
+
+
+
+	
+
+
+
+			
+																													,:?AAAABBBAB@===;6-"


+																														
+	
+
+
+
+	
+
+
+
+
+
+																															
%/35347;=<6*-#



																															
+
+
+
+
+
+	
+
+
+
+
+																																		


:8


+																																	
+
+
+
+
+	
+
+
+
+
+
+																																		
+


+,
																																				
+
+
+
+	
+
+
+
+																																							
+	



+																																						
+
+
+
+
+
+
+																																											
+
+
+
+
+





+		
+
+																																				
+
+
+	
+																																												
+
+
+
+
+			
+		
+	
+																																					
+
+	
+																																												
+
+
+
+
+
+
+
+
+
+
+
+																																								
+
+																																											
+
+
+
+
+
+
+
+
+
+
+
+	
+																																					
+	
+																																										
+
+
+
+	
+
+
+
+		
+	
+
+																																
+		
+																																												
+
+
+
+
+	
+
+
+					
+																																		
+
+
+
+
+																																			
+				
+
+	
+
+
+	
+					
+
+																													
+		
+
+
+																																			
+
+
+		
+	
+
+
+
+	
+	
+	
+		
+																												
+
+
+	
+
+
+																																
+
+
+
+			
+
+	
+
+	
+
+
+	
+
+																												
+
+	
+
+
+	
+																																
+
+
+			
+		
+
+
+
+	
+
+				
+		
+	
+													
+
+
+	
+	
+	
+
+	
+
+		
+
+																													
+
+					
+		
+	
+
+	
+
+	
+
+		
+			
+
+																		
+
+	
+
+
+		
+
+		
+																										
+					
+	
+
+
+		
+
+
+	
+
+							
+
+
+
+
+							
+		
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+																				
+	
+
+				
+		
+
+	
+
+
+
+
+
+
+
+				
+		
+
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+									
+							
+
+	
+		
+			
+		
+
+	
+
+
+	
+
+	
+
+
+
+	
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+							
+
+
+					
+	
+
+	
+			
+				
+
+	
+
+
+
+	
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+
+
+
+
+
+	
+	
+
+
+
+	
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+	



+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+



+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+



+		
+
+
+


+
+
+
+


+

+




+
+	








 [...]
+						
+		
+		
								
+	
+
+			
+					
+
+				
+					
+
+	
+
+
+
+			
+

+
+
+
+	
+			
+	

+				
+

+		
+
+
+
+	


+	
+

+
+	
+
+



+	

		


+

+			



+


	
+



			
+








+

+					
+
+
+					
+			
+		
+
+
+				
+
+				


		
+
+
+						
+




+

				
+			

+
+		


+

+							
+
					



+		
+													


+	
+					

										
+



+			
+													
+
+

																				


+


+		



																		

+																							

+
"

'058::862-$)D6	
+

+																		
+



																					
+	
+&G-
(3;>??>>>>?@@>92--	
+

+

																			
+


+																							
+		'5:=@?>=<;;;;<<=>>>9,
+

+
+																			
+
+			
+		
																								
+	$3=?><;;=BFIJHEA<:;>?<1	
	
+
+																			
+																																					*;??=;;DQaovy{xvm_NA:<>>4
	
		

+																														
+										
+
+																				
+	*=?=;;BVn�����������kP>:<?4

+
																	
+																				
+				
+
+	
+					
+							
+
+	
+
+	
&=@=:<Lh��vhadfggiy��{`F:<?)

+											
+
+
+																																		
+
+			
+
+
	
:A>;?Ut��sf[UVY]ZWV[ds��kJ;>7
+								
+																																										
+
+	
+
3@?<?Wy�}g__^blstja[ZX^k{�oM<>)
+																																																								
+		

+
(>@==Uv|qg`dkquuqvxrkd\V^i{�oK=8$																																																													
+		



	8A>=Mr}h[]fojeaVRW]cejm][\_x�jG?3

+																																																																			

		
*?@=Ei�obZaqdLGDA at ABFN]pnYXWg}�`B>$
+	
+					
+																											
+																															
+

+	7A>?Z~|d\bosT@>>>====@G\ti\]_n�yR@:

+	

+																										
+																															
+
+

	
+$>?=Lr~n\\huhJ>>??>>>?>>Gbpd_]cv�lE?5



+																														
+																												
+

	0A>Ab}pa\dppZB=>>>==>??>>Khpa[_g|}W?@-
	
+																																																												
+	9@=Nuv_Z_lrbJ>????>=????=?Snma^^l|jD?<


																																				
+																							

	
=??b~gR[gunR@??????>?????>CXol_[\qyO=@0

+
																																							
+
+																						
+
+&@>LtsTO]mr]D>??????>????@?>F_ngXKb}a@?9


																																																						
+
+				
+	
+

,AA^zgNWjqdJ=>???????????@@>=Icq^KUssJ>?(


																																																							
+






6 at HotZUfohR?>????>???????@@?==OijXPfyY>@5


	
+																																																					
+	
=?S~oQWklYC<?????????????@??>=AWpeN`vkB?=


+	
+
+																																																			
+


+


)@@e�nSembJ>>??@???????>??@???>=KgoSTszL>A+
	
+
+																																																					


		
+
+
+
+

1 at Dp�vfqcQ@=??@????????>?????@?<D^sd\v�X=A4

+
+
+																																																					
+

+	
+	
+
+
+	
+"<@Np��|kSB<>??@???????>??????@?=@Sq�y��c>@:
+
+
+
+
+																														
+																						
+		
+
+
+
+
+
0AAd���tVC<=>??????????>????????>=Jf���pE?? 
+
+
+																														
+																								
+			
+
+
+
+
:AFvxpUA=>????????????????????@?=?Kf���J>B(	
+
+																														
+																							
+	
+
+		
+
+
+#??Ky`PVN@>>?????????????????>??@@>=Gcpi��N=B1
+
+
+																														
+																													
+
+		
+
,A>OybPZQB>?>??@@????????????>??@@?=KhhYt�R<B8
+
+
+																													
+																															
+
+
+
+
+
1A=S|_T\RC>?>??@@????????????>??@@?>MljWn�V<A=

+
+																															
+																															
+
+
+
+3A=V�aVf[D>???@@??????????????>?@@?>MnpYn�Y<@?
+
+																														
+																															
+	
+
+
+4A>X~cZl`F>???@@?>??????????????@@?>JjsXj�[=?@#
+
+
+																														
+																															
+
+	
+
3A>[�hTfcH=>@@@@?>>?@???????????@@@>FjuZk�[=?@%
+
+
+																												
+
+
+																														
+
+
+	
+
3A?]�`OckM=>@@@??>??@@?????????@@@@?Gnu^k�Z>?@&
+
+
+																														
+
+																															
+
+

5A?_�bTdnU?>@@@??>??@?????????@@@@@>JmoYk�X>@@&	
+
+																													
+
+
+																															
+	


:A@`�lTfr\D>?@@?>>??@?????????@?????NlcXp~R=@?#
	
+
+
+																											
+
+	
+		
+	
+
+																								
+
+	

 =A at a�kZms^G>?@@?>??????>>????@@?>>>AXo][vyJ=@?!
	
+
+																												
+	
+
+																														
+
+

&@@@a�kamp\G>>@@@???????=>???@@@@?>=Edr][wrE=@= 
+
+
+
+																										
+
+
+
+																															
+
+A@@_�obnoYG?>??@@?????>>??????@@?><KpmZ[viD>A;

+
+																								
+
+		
+
+
+
+
+	
+	
+
+																								
+	
-A@?\�o_liWG???@@@?????????????@@@??WtdXaveB>@7

	
+																							
+
+		
+
+
+
+
+
+
+
+
+																									
+
+	
,A@>Y~oZhjXI@?@@@@?>??>????????@@@?Cdr`Xcx_@?>0
																								
+	
+
+	
+
+
+	
+
+
+
+
+																												
*A@>Vx_cm^MB??@@@????>>?@>>>?>??@>Jmp^ZkwX>@<+																										
+
+
+
+
+		
+
+
+
+
+
+	
+																									
(@@=Pz|b^fdUG??@@@@@@@@??@>=>>>>??>Rti]`otP>@:1
																										
+
+
+
+
+	
+
+
+
+
+
+
+
+																									
$@@=Ku~i_bi_NB????@@@@@@?@?>???@@@A]tc[^ssI=A942
																									
+
+
+
+
+
+
+
+
+
+
+
+
+																										
>A=En�l`^fhUHA?>>@@@@@@?@@?@@@@A?HlnYW`ymC=A8+?
																										
+
+
+
+
+
+
+
+
+
+
+																											

;A>?b{g\ZajeWI@>>@@@@@@?@A?@@@A@?UuhSTf}`?>A7
3

																										
+
+
+
+
+
+
+
+
+
+
+																											
7B?<Sxr[Y_engXH?=>@@@@@@?A@@@@?>Hgs`[d{{R=?A3

	
+
+																					
+	
+
+
+
+
+	
+
+
+
+								
+																			
1B?<Gk}l[Z_lqfSF?=>?@@@@@@A@@@>F_qf[`p�kD<A>)
+	
+
+
+																						
+
+
+
+	
+
+	
+
+											
+															
+,@@=>Uz{g]]fqncXKC@???@??@@@??E^qg_`m�yT<>B9
		
+																								
+
+
+
+
+
+
+																														$=A>;Ci~qc[^jqql_SKC@@@?@@???F]rhU[g|�dB<@@/

	
+																										
+
+
+	
+
+
+																													
6A?=<Qu~o\\_iosoeWNHEEEHFDEL\snTThz�rN<>A:"

																								
+		
+
+
+	
+
+																												
+	
+>@?=?[}zc\\]hqttj^UPVZXYZ]crnVV`x�zX?<@?-

+
+																							
+
+	
+
+
+
+	
+
+
+																												
6A@>=DeyfYY_emtth^]hujqqpleVTfz�{^D<?A6



+
+																									
+
+
+
+	
+
+
+
+			
+
+																							
&;A?>=Fd~}pb\_bc`lhen�svlcb_`n�y\E=?A<&

+
+
+																		
+
+
+				
+
+
+	
+
+
+																														,<@?><Eb}�znkd\Vadnw�ykUYfq��mVC=?A=-

+
+
+
+						
+													
+
+
+
+	
+
+
+
+
+	
+
+																												
.>A?><AXw����uka[e{��ufs~�|mZH?=?A?1


+
+
+
+																			
+
+
+
+
+
+
+
+
+	
+
+
+			
+
+																									0?A?><=J_pz���vz������weRF@=>@A?3




+
+
+
+
+																		
+	
+
+
+
+
+
+
+	
+
+
+																															/>A?>>=>EMV`iqwupmknk]MB>=>?A@:,


+
+
+
+	
+																			
+	
+
+
+
+
+
+	
+
+	
+																													
+(:A@??>=>?@BEIHHKHEC?=>?AA at 9,

+
	
+
+
+																						
+
+	
+
+
+
+	
+
+
+
+																															

0=AA@????>>===>??@@@A@<4)


		
+
+
+																						
+
+
+
+
+
+
+	
+
+
+
+																															
"2<@BBAAAAAAAA@<<==8.!


			
+	
+																								
+
+
+
+
+	
+
+
+	
+																															
+
&056679<>@>6)0$



+																																
+
+
+
+	
+
+
+
+																																	


"!>3



																																	
+
+
+	
+
+
+
+
+																																			


+

+%
+																																				
+
+
+
+
+
+																																							

	


+																																	
+				
+
+	
+
+																																										
+
+
+
+
+
+






+																																								
+	
+																																							
+	
+		
+
+
+
+
+
+				
+
+
+
+		
+																																			
+
+																																								
+		
+
+
+
+
+
+
+
+
+
+
+
+																																							
+	
+																																						
+
+		
+
+
+
+
+
+
+
+
+	
+
+
+																																					
+																																							
+
+
+		
+
+
+
+
+
+
+
+
+			
+
+																																			
+	
+																																				
+	
+		
+
+
+
+
+
+
+
+	
+				
+
+																													
+		
+
+
+
+	
+																																	
+
+		
+
+
+
+
+
+
+
+		
+			
+
+																											
+		
+	
+
+	
+																																
+
+
+	
+
+
+
+
+
+
+
+
+	
+
+
+	
+
+																											
+
+		
+	
+																																	
+
+
+	
+
+
+
+
+
+
+
+	
+	
+
+		
+																												
+
+
+		
+																															
+
+
+
+		
+
+
+
+
+
+
+
+			
+
+
+
+																									
+		
+
+		
+																												
+	
+
+
+
+		
+
+
+
+
+
+
+
+		
+	
+
+																							
+		
+
+
+
+		
+
+
+	
+		
+																				
+
+
+	
+		
+
+	
+
+
+
+	
+		
+	
+
+	
+						
+
+	
+			
+			
+
+
+	
+
+
+
+
+
+	
+
+	
+
+
+
+
+																
+
+
+
+	
+	
+
+	
+
+	
+
+
+
+	
+
+	
+
+
+
+
+			
+	
+	
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																
+
+
+
+
+	
+	
+
+		
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+		
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+								
+					
+
+
+
+
+
+
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+



+	
+
+
+
+
+
+
+
+
+
+
+
+				
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+
+
+
+
+
+
+
+
+
+		
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+	
+
+
+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+		
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+	
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+		
+
+
+







+


+
+



+		






+

					 [...]
+		
+	
	

+		

	
+
+

+

+		

				
+
+							

				

+							
+	
+		
+
+
+			
+		
+	
+
+								
+	
+
+




		
			
+

		
+				


+
+
+
+		

+

+	
+
+





+


+
	

	
+	
+


+







				
+
+				
+
+
+				
	
							
+
+				

				
+									
+



+
+
+											

+	

		
+								

+		

+	
													

+		
+
										
+		
+



+

+																		



+						
+
											
+	

	",38;<<:860'&'	
+
																					



+																						
+
+		)C% /8=@?>>>>>>@@?;2/)>1	


																	
+	

+

+																
+								
		371;@@?=<;:;::;;<=??;5+	



+																		

+	




+																		
+							
	.<?>=;;=CJQUVSOH@;:<>?9%	
																		
+			
+
+
+	
+																			
		4?>>;;BQcs~�����r]I=;=?<+

																										
+																								

+	
+
7?>;;ATm���vuutv{���}cI<;>=)


																																																				
+	
+6@=:;Kg��}ufU[[UW[]it��wY@;>:

																																							
+			
+
+										
+
+
+
+	2@>:<Su�~pc]YW]`aYOOY[ds��fE;>)
												
+																																						
+
+
+

+

+*??<=Ux�we]Z[_fqwvqe^cb^`i~�lG=2
																																																	
+	
+
+
+
+
+	
		;@=<Qvwoa[]aowxkackokoriYZfx�lG;0!																																																						
+
+		
+
+	
+
+1A?<Jq�dX^_lscZQEABIOVaosd\]_{�fD<3

				
+
+																																																			
+
+
+	


+


<@=Bf�p^Y^luZA=======AI\rraZXi~�]@;-			
+
+																																																									
+	


+
.@?=W}{c]]aq\@=>>?????>>G`uh]][n�{P=7!
																																																												
+
+
+

+:@=Gq�m`^cqcE>??????@@??>Jgo`Z[_r�iC=-
																																
+																									
+
+
+

+
(?>>]}qa`cokP>>????????????Pjma]X`w~S>9 
	
																																																						
+


+3@<Isx^\cnr\D=>??>??>>????>@Umk`[Rc�jB?3

																																																							
+


+	9@>]}iS_mreM?>??????>>?????>CZojcOQsyO=>&

																																						
+
+																				
+


	
+
<?HrwZUluiSB>???????>>??????>G`rnZNd}b??3																																							
														
+
+	
+		
+


+
+
 >?XygQ_qjVD<>???????>>?????@>=KdseNVwrG><
																																																						
+







)?DjrVTmlXF>=>???????>>???@??>=>Nfr[NfxT>@+	
+																																																			




5?OvdJ\scK?>>????>????????@??>>>ARmfPYvd@@6		
+																																																		
+	


	
+

"=?Y�hPglUA<>>????>?????>??@??>??>FakSMuvG?>

+	
+																																																	


+


	
+
+
+

-@@a�f]p^G<=??????>???>?>>???????>AVjW^y�S>A*
+
+
+																																																	
+



		
+
+			
+

4 at Gm�hpdL><?????????????>>????????>Lcln}�`>A3


+
+																																																	
+





+		
+
+		
+
+
$<@W{�~lO@==???????????>>?>???????>=CZu��jAA8

+
+																																																			



+
+
+					
+
+
+
+
3ABk�ulRB=>????????????>>?????????><=Jd}��uD@=

	
+
+																																																	

+
+									
+
+
+
;@FwnWTA>????????>>????>??????????>==>Q|t�|E?A$
	
+																																																		
+		
+						
+	
+
+
+(??Kyd]ZC>?@??????>>>?????????>?????==>Lkck�O=B,	
+
+																																																							
+
+
+
+	
+
.A>PzabdG>?@????@???>?????????>??@??>=@Ypcj�S=B4
+
+
+
+																																																										
+
+
+
+
+
4A>U{_^hJ>?@@?>??@@???????????>??@???=B`pWa~V=A9
+
+
+
+																																																											
+
+
+
+
+
5A>Z{_[iN>?@@???????????>?>???????@@@>Cat_c�[=@<
+
+
+
+
+																											
+																															
+
+
+

3A?^~]WoQ>?@????@?>>??????????????@@@>A\sR\}_=?>


+
+																																																												
+
+
+
+
+
3A?a\VoW??@???@@?>>??@???????>??@@@@?B_u^f�_=??

+
+
+																																																												
+
+	

8A at dy\Ui_B>???@@??>>?@??????????@@@@@?Cbxej�[=?@ 

+
+
+																																																											
+
+
+
+

=A at g�`TicE<>?@@??>>??@?????????@???@@?Ccsbi�X=@@ 

+
+	
+																												
+																													
+
+
+
+

"?@Ai�f[jcG=>?@@??>???@??>>?????????@@?Ghk\l�U=@?


+
+
+																												
+	
+																															
+

$?@Bk�daqbG>??@@?????????=>????@??>?@@?NmhYjzP=@?

+
+
+																													
+
+																													
+
+
%@@Bk~ciu\E>?@@@?????????>????@?????@?@Yq`VpwM=A?

+
+
+																										
+
+
+																															
+
(A at Bl�gjpYD?@@@??????????>??????@????>FgnYVoyM=A>


+
+																												
+
+
+
+		
+																									
+	
(B at Bj�ninZE?@@@??@???????????????@@@?=Noj[XpwL=A=
	
+																							
+		
+
+
+
+
+
+
+
+
+
+																							
+
+	
)B?Ah�ofm_H?@@@@@@???????????????@@@@@Wpd[\pnJ>A;
+
+
+																							
+
+	
+
+	
+
+
+
+
+
+																										
*A?@e�ocmeM@?@@@@@????????@>>????@@@?Cap]^`seE?@6
	
+																								
+
+
+
+		
+
+
+
+
+
+																										
&A??`�qclkRC?@@@@??@@@????@==>>???@@?Iio^Zat]@?=/
	
+																								
+
+
+
+	
+
+
+
+
+
+																										
 ?@=Z�o[el]I@?@@@??@@@@@@??????@@@@@@Qol]YdrV>@:(
																									
+
+
+
+
+
+
+
+
+
+																										
+
=@<R�tRVjfRD?@@@??@@@@@?????@@@@@@@C^peZRjsN=@9,
																									
+
+
+
+
+
+
+
+
+
+
+																										
 <@<IxvRSbk^MA?@@@?@@@@@@???@@@@@@@?Ljm]U]{pG=@88

																									
+
+
+
+
+
+
+
+
+
+
+																										

:A=@i�hSWdhZJ@>?@?@@@@@@???@@@@@@?B]pf^\p�eA=A5<+
																											
+
+
+	
+
+
+	
+	
+																								
8A>=Z�uYR]jhYH>=>>?@@@@@???@@@@@??Pnj`\cv|U=?A020
+																										
+
+
+	
+
+
+				
+																							
+3A?<Jx�gT[gniVE>==>?@@@@??@@@@@@?Iitc[_m�lF=@@)!(
																												
+
+
+
+
+											
+																	+@?<?_{q[V]kpfRD>=>?@@@A@@@@@@?>E_n]V\j~}V=>A= 
			
+																							
+	
+	
+
+																											
+	
"=@>;Eh}kY[_kqfSGA>>?@AA@@@@?>=E^tg[[dx�jD<@A3

+	
+																									
+
+	
+
+		
+																										
+5A>=;KpiXW^mrfWKD?>????@????H`rlXS[o�wO<>A;$
		
+																							
+
+
+
+
+
+
+
+
+																										
+&>@>==U~{]SV`nrmdZK@>?ADHHIJReqd[X[l�~\?<@?.

																									
+	
+
+
+	
+
+					
+																							
3A?>=A\}wbX]bgpwtdODGNYZ^djnrbOUdp��dD<?A7

																				
+				
+
+
+
+	
+
+
+
+
+																										
+";A??=A[z{h\ZZ`gnqlb^^ofimndZVZlz�}dF<?A='

+																						
+	
+
+
+
+
+
+
+
+
+																												
*>A@?=AZ|�p`\Z`[_klihwlaVV\gs|��qXC<?A?0

+
+
+																					
+
+
+
+
+
+
+	
+
+			
+																										,>A??>@Qm�wqna]VU`tzq_Zfs���u`K?=?A at 3


+
+																						
+
+
+
+
+
+	
+	
+																													
,>A??>=EXo}���zsl����zy��zfUJA=>@A=.

	
+																							
+
+
+	
+
+	
+
+			
+																										
(:A@?>=>FScmsv|~�xrv}vl]MC>=>@A?5#
+
	
+
+																								
+
+
+
+	
+
+
+
+																													

2?A@??>>AEHKOSURKHGFB>=>@AA>5%


+	
+
+
+																						
+
+
+	
+
+	
+
+																															
+$7 at BBA?>>========>??@@A@<2$


+	
+
+
+																								
+
+
+
+	
+
+
+																															
+
&5=ABBAAAA@@?@A@:;>>9.


																														
+
+
+
+	
+
+																																	
$-3789:<>@A>3*3#



+																																
+
+	
+
+
+																																		

 $!B*	

+																																	
+
+
+
+	
+																																		
+

+


+


+																																				
+	
+																																						
+




+																																						
+	
+																																					
+			
+		
+
+
+
+
+
+





																																								
+
+																																					
+
+
+
+		
+
+
+
+
+
+
+					
+
+																																					
+	
+																																				
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+	
+																																					
+		
+																																				
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+																																				
+	
+																																			
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+			
+																															
+
+
+
+
+																																	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+				
+																														
+
+
+
+																																
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+				
+																													
+		
+	
+																																
+
+
+
+
+		
+
+
+
+
+
+
+
+		
+		
+		
+																										
+	
+		
+																															
+
+
+
+		
+
+
+
+
+
+
+
+		
+		
+		
+																									
+
+
+		
+	
+																											
+
+
+
+
+	
+
+
+
+
+
+
+
+			
+		
+		
+																								
+
+
+		
+
+																									
+
+
+
+
+
+
+	
+
+
+
+	
+
+
+						
+		
+																							
+
+
+	
+
+	
+																						
+
+
+
+
+
+
+		
+
+
+
+
+
+
+						
+		
+					
+			
+		
+		
+
+		
+		
+
+
+
+
+
+																				
+
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+	
+			
+
+
+	
+
+
+
+
+
+
+			
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+									
+		
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+
+	
+
+
+	
+	
+	
+
+
+
+		
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+											
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+	
+		
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+			
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+

+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

+		
+

+			
+

+
+
+
+
+
+
+

+
+
+			



+

+
+
							 [...]
+							
+	

	


+
+
		

+		

+	
+
+				
+
	
						
+
		
+		
+
					
+
+		
+
+									

+								
+	






						
+



	



	
+

	

+



+
+	

+	

+	









+
+


		


									

+	

+









		
	

+													
+
+	
+
	
	
			
+
+								
+
+	
+
+
+	
+
+
+			
+
		

+														



									
+
		
+
		


+															





												
+
+			
$-49;;;:961'
+	

			

															


+			
+


+											
+

			&
%3:>@@?>>>>??@?;1$
55


+							
+											
+
+

						
+
+													

$F=*5>??>=<;;<;;;;<>???7,:2


																					
+

																			
+
+
+	&:=?><;=AIRZ^_ZUMC=;<>>=5"



																	
+				
+
+


+																		
+					%9>><:?L^n|�������zgQA;<>>3
+

	
+																
+	

+
+
+																		
+	&;><:>Nh}�{nldadlrv���qU@:=?5	
																				
																					
+

+&=?<:C`{�~odRVYRWVWV^mx��kK<<?-

+																																																		

+	
#<@<:Jn�}lb^]\YZ^_[[YYX^hw�{X>=:

																																																			
+
+
+
8@=9Kq�o]Y[[[`gptxtmhif^[aq��]@<0												
+																																		
+			
+
+
+
+
	0@>;Hp~g]Z[]dqzwiZYccdpsqf\[h��\@<4
								

+																																							
+
+		
+
+!>@<Bi�jTZ]anufYOB=<@CFPVpsaY\cz�Y?>3																																																									
+
+		
+
		3A=>\�v\Y[_ptV><=>>>===?CXtm_ZZb�}P>>*				
+																																																			
+		
+
		
=@9Ly}c\^YisS<<>?????@?>>Ebse\\\h�oE>6
	
+																													
+																												
+
+
+

	
/A>@h�m_\^ikQ>>?>?????@??>>Lkoa[`bn{]?<'
+	
+
+																																																									
+

+

	;@<R}va^_fpW@>????????????=?Sni]][UuxI>4

+
+
+																													
+																								




)@>Akzb]ajq^B=??????????????=AYok_YUn�_?>*


+																																																			
+

+
+3@=R{iWclp`F=>???>>?>>??????><C^pg\\^wuG?8
																																																										
+
+
+
+8 at BhxZ\nqaH>>????>>?>>>>??????>Harj]QhY>?(
																																					
+															
+	
+			

+			:?OwhRcqcK>=>????????>>>??????>>J`tjPX{lA?5																																																		
+
+



	
+

:A`tUTkgM?=>>????????>>>>??????=>IcnVQlxL>=																																																		


+
*>GngMZhTA=???>>?????>>>>>????>?>=?NfYLYuZ>@+

		
+																																																


+




7?UxXQidI=>???>???????>>>?????????>C^iRLkiA at 5
+
+
+
+																																															



	
+

+

%>?Y�idiYA=>???>???????>>>>???>>?????OjXSlwI><	
+
+																												
+															
+



			
+
+	
+


/@@]�gYI>>>??>>???????>>=>>??>>????>E^kcu~T>@!

+
+																													
+																
+




			
+
+	
+
+

8 at En�|dL?>?????????????>?>>????>????>?Row��`?B+

+																																																	

					
+
+
+
+
+,?@T��sW@>?????????????>>>>>?????????>=D]x��k?B3

+
+																																														


						
+
+
+
6ABl�eZI=??????????????>>>>????????>?>=>Hi��pAA9

+
+																																														



+	
+			
+
+	
+
+
 =@FtmLQD>?@??????>>>???>>>>>???????>?>>>G`y�vD?>
	
+																													
+																
+
+								
+
+
+
*@?JxbV[A>@@@?>????>>>???>>>>???????>>=>>F`fu�O>A"
	
+
+																											
+																											
+
+
+
3A>N{_^bB=??@??>>???>>>???>>>??>?????>>>=IhcYzV>B*
+
+
+
+																																																				
+
+
+
+
+
6A?S{\bfD>??@??>>????????>?>>??>???????>>Pl`[}Y>B0
+
+																																															
+												
+
+
+
+
7A?X~ZZlG>@@???>>????????>?=>???>????????PoZZ~Y=A5
+
+
+																												
+																
+
+												
+
+
+
+
9A?\�_TkM>@@@????????????>>>>??>>??@?????QmWU\=@9
+
+
+
+																																																										
+
+
+
+
;B?^�_TmR>?@?????@?>>?@????>???>??@@@????Qqea�\=@;
+
+
+
+																																																										
+
+
+
+
=A at axXXmV>??????@??>>????>?>?????@??@@@??Rsje�Z>@;

+
+
+																																																										
+
+
+
+
?AAf~a[mX?>?>??@??>>?????>??????????@@@?@VseeX>@;
+
+
+
+																												
+																													
+
+
+
 @ABkegrV@??>??@??>>?????=>????@????@@@?C^p^b|W?@;
+
+
+																												
+																																	
!@@Cn~dqtS@@@???@@????????>>???@@??>?@@@>FhnYb|W?A<
+
+
+																											
+	
+																													
+
+
"A at Co}fqrP?@@@????????????=>??????????@@>Nmj_lV>A<

+
+																											
+
+																													
+
+
"@?Cq�hspM?@@@@???????????>????@??????@?AWng]l}T>A<

+
+																											
+
+
+																												
+	
"@?Dq�holN?@@@@@??@??????????????@@????>D\laXm}S>A;

+
+																											
+
+
+
+
+	
+																									
+
$@?DreikO?@@@@@@@????????????????@@@@?=G`laWm|O>A:
																									
+		
+
+	
+
+
+	
+																								
+
+

%@?Co~dgjQ@?@@@@@@??????????=>??????@@?>Nina]uzL=B7

+																									
+
+
+		
+
+
+
+
+	
+																							
+
$@?Al~bbnWC>@@@@@????????@??>>??????@@>@XlhZ]wvI=B3

+
+																									
+
+	
+
+
+
+
+																									
+
#???ebYg]H??@@@@??@??@@@?????????@@@@>E`kdUUumF>A/

+
+																							
+
+
+
+
+
+
+
+
+
+																									
">@=]�iU[]PB>@@@@@?@??@@@?????@@@@@@@?>Leg]R_u^B?>*

+
+																							
+
+
+
+
+
+
+
+
+																									
+
!>@<R�nOVcZH?>@@@@@?@@@@@????@@@@@@@@?BWjg][pvS>?9#

+
+
+																							
+
+
+
+
+
+																										
+	

<@<HyvXQZ`RD=>?@@@??@@@@????@@@@@@@@?Nglc^_{tJ<@7 
+																										
+
+
+	
+
+
+																											
+9@=@lcQXc_NA=>?@@??@?@@????@@@@@@A?E_ng_[l�e@=?8'
+																											
+	
+		
+																										
+3A=<Y�uYR[e^L@>?@@???@@@????@@@@@A at AUmi`\cy�R<>>83																												
+
+		
+																											+A><Fx�dSVbh]I@>?@@?@@@?@??@?@@@@??Mjod]_o�iA<?<3;																											
+
+		
+
+						
+																
+			#??==Z�wZU`fh[H>>??@@@??@@@@????>=Hevf[[e~|P<=A8(6
																								
+
+
+
+	
+
+																												
8@><Ca}n][\ekZH@>?@@@?>@@A@@@@?>HaumWSUm�eA<?A.$
+																									
+
+
+
+
+
+																											
++@?><Dk�fTR[ln]MD@??@??@@@@@??@KdwoXNWczuK<>@;

+
+																						
+
+
+
+
+	
+	
+
+																										9A>>=Js{eWXborhZNE?>?@@?@@@AETgofTPUi�}W==@@/

	
+																	
+					
+
+
+	
+
+
+
+																										
+*@@?>=NvdSTZdink`NA?ABDIMQW]lpbQQYn�}\@=?A7
+
+																						
+	
+
+
+
+
+
+
+
+																											5A@?>?RwgUQSZanvj_YVTVZ_cdlugaciu�}[@=?A<$

																							
+
+
+
+
+
+	
+
+																												
+9A@??>Lp�ucVQLW`gnqp`ni[ZU^hirz��rS?<?A>+

+																								
+
+
+
+	
+
+
+
+																											
":A@??>Hd|~xm^UVXZXkiwnb[Xgy��u`J>=?A<(

+																										
+
+
+	
+																														
 8A@??=ASk}��~xukfw}~}�sx��yiXJ@=?A at 7!


+
+
+																						
+
+
+
+
+	
+
+																														
1?A@?>>DRew}~�����yrxwrfVKC?>?AA:+

+
+
+
+																						
+
+
+
+
+	
+																															
&8AA@?>>AHNRV\dgf]ROKF@==>@AA;-


		
+																									
+
+
+	
+																																
*;AAA@?>===>?AA@?>?@?@@A@:,

																												
+
+
+
+	
+
+																														
+(4;@AAAAA@@@@@@A>9;==6)
+
+																														
+
+	
+	
+																														

!+0578:;=?@@=/-6 


																																
+
+
+																																		


"$

B	

+																																		
+	
+																																	
+





+																																			
+	
+																																		
+
+		
+




																																	
+	
+
+
+
+																																					
+
+			
+
+
+
+
+
+



+


+																																						
+	
+																																			
+
+
+
+	
+
+
+
+
+
+
+
+
+		
+
+
+
+
+																																		
+
+		
+																															
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+																																					
+
+
+																																	
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+																																					
+
+																																
+	
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+																																			
+
+	
+																													
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+																																		
+	
+																														
+
+
+
+	
+			
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																													
+
+		
+																												
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+	
+																											
+	
+																												
+
+
+
+
+
+	
+
+
+
+
+
+	
+
+	
+
+
+
+
+	
+
+																									
+
+	
+
+																										
+
+
+
+
+
+		
+
+
+
+
+	
+
+	
+
+	
+				
+																								
+	
+																								
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+		
+
+			
+		
+																			
+
+
+
+																						
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+	
+
+		
+
+	
+	
+		
+								
+	
+
+		
+
+
+
+
+
+
+
+			
+																
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+			
+
+
+
+
+	
+
+
+
+			
+			
+	
+
+
+	
+
+
+
+	
+
+
+		
+								
+
+
+	
+		
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+	
+
+
+
+
+								
+
+
+
+
+	
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+			
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+						
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+		
+
+
+


+
+
+
+


+
+
+	
+


+

+

+
 [...]
+	


+	
+		

+	
	
+
					


+
+							
+
+		

+		
						

+		
		
+

+		
+
+						
+
			
+
+
+
+
+									
+



+
+									
+




				




+	






+

		
+
+




			


+		
+		

+












+
	



															


+
+



		

+
+				

	
+
+
+					
+

		
+

	

+												

+
+	
+



+			
+
			
+

																	
+
+	
+					
+		

		
$,28:;:984-"
			
	
+

+															
+								
+

+			
)5;>@@??>>>??@?:1#
+	


+																


	
+										
+		
+
+ :,
(8?@?>=;;<<<;;;<>?@>6,+B<
+


+																		



+	
+


+											

+7 at 9>?=<;>EOX_cd_XNE>;<=?=:?-


																		
+


			
+
+							
+		
	+;>=;;CVjy��������}mVC;:=><)


													
+
+			


+							
+
+		
+/>><:BZt~~vpla^ahmnv~�z_E:;>;&


+				
+															
+
+



																0?>;<Pp�oTELVXWWVZROZgx�yW?:>9
+																			




																			
+	/?>:?^�tc^WTW\]_b]\[Z^]`n��iF;?/
												
+																											
+
+	
(??:@by_Y[][_dgoruwnmqjc^^h{�uK<;&			
+																						
+																													


;@<=`�r_PV^bgs}xdTS``_lpwqf^Yn�wK==*	
+
+

+																																														
+
+

	2@>=ZtZ\]_ovtncOA=<=?ADL_tvcYaf�tH>='
+	
+
+		
+
+
+																																		
+
+
+	
+


+
	!>?<Nz{^U[\h{nR?<=>?>=>==<C^umb^Vp�jB?;

+							
+																																										
+
+
	

+2@:@m�cYY[cvgH<<>????>??>>=Hfqha\cx�[>?0
+			
+																																																			
+

+
+


+
>?;U�v]YVandF<==>?????????>>Njn_^_apzK>;!
+	
+
+																																																					
+
+
+
+


+0A=Es|gYXSgdF=?>>>??????????>AWlha_YY�h@>0
+
+
+
+
+																																																								



+
+
;@=\�h]^fg`I>??????????????>>=D[mj]\Yr~N=<

+

+
+
+																																																								


	
(@>FutYdmj`J>>????????>>?????><;E^ne^Yb~f?@/

+																																																								
+

	
+2@>[bVmp_H=>???>??>??>??????>=;<Ganh[UnyI>:																																																					
+
+


+
+	7?FqpR`tbH==??????>???>?>>?????><=HcpXT^|\=?(																																																			





			7?Ux[RlhJ>>>??????????>?>>??????>>>JicRRrqC?4																																																
+




+	

:BgnMXjR?>??>>>>??????>>>>??????>?>>SqVIe}N>=
+	
+																																														
+




/?HraKd`D>?????>>>????>>>>>???>>????>Cc\KRz]>@$


+
+																																															

		
+
+


:?UwXPkU?>?????>>>????>>>>>???>>???@?>SeUMmlA@/
	
+
+																																													


		
+
+		

)??\�negH=>?????>>>????>>>>>>??>>?????=D_hWbvH?7
+
+
+																																										






			
+
+
+	
+


6A?Y�}rU@>????>>>>>?????>?>>>??>>?????=>Nqo[}M>=

+																													
+														







+		
+
+	
+
+
+
&?@Dl�ybE>????>?>>>?????>>>>>>??>>>>???>=B`~g�T>@

+																														
+													
+





+				
+		
+
+0A at W}plO>????>?????????>>>>>>???>??>????>>Mxv�^>A%

+
+																																											
+





+
+
+			
+
+
+
+
8AAkuR\E>????>?????????>>>=>>??????>>????>Abv~b?B+

+
+																																										






+
+
+				
+
+
+

"=ACqiMQC>@?@??????>>????>>>=>?????>>?????>A_w�pEA4
+	
+																																										
+	
+

+								
+
+
+
+A at EtdSX@>??@???>????>????>>=>>????????>??>Bflq�O@<
+
+																																													
+								
+
+
+
2B?JwcZ^?=??????>>????????>>>>>?????>?????>@^j_|Q?@

+																																																					
+
+
+
5B?MwbdgB>@?????>>>???????>>=>>???????????=B_dYyS>A$


+																																															
+											
+
+
+7B?QwablH>@@????>>>???????>==>>??????>????=FdZYzU=A)

+
+																												
+																

+												
+
+	8B?V}_ZnL>@@@@????????????>>?>???????????@>Ii\Y}V=A.

+
+
+
+																										
+																													
+
+
+	:B?X~c[pQ>@?@???????>?????>?>????????????@?Gid[}U>A1
+
+
+
+																																																								
+
+
+
+
;A?]wXcsR>????>??@??>>????>?>??????????????GlkbV>A2
+
+
+																											
+																													
+
+	
+<A at ew\fqP?@??>>>????>???>>>>>>??@?????@????Knke�W>A3
+
+
+
+																										
+
+																															
+
=AAj~alqL?@@?????@?>>????>>>>>>?@?>>?@@????SpcV|Y>B3
+
+
+																											
+																															
+
+
<AApdtlG?@@?????@??>?????>>>???@????@@???A[o[^�X>B4
+
+
+																										
+	
+																													
+
+
<ABpzaseC>@@@????????????>=>>???@?????@@?>C`lZbX>B5
+
+
+																										
+
+
+																												
+

<@Cq{eqaC>@@@@????@??????>>????@?????????>Fdl]b�W>A3
+
+																											
+
+
+
+																												

=@Csv_l]C>@@@@@???@??????????????@???>???>Iej_j�W?B3
+																												
+
+
+			
+																								
+
!?@Csv^f]C>@@@@@@@@??>?????????????@???>??@Mhi_n�U>B4
+																								
+
+	
+
+	
+
+
+
+
+																								
+

#??CsyYbaF>?@@@@@@???????????=>>?????@???>APih\p�R>B2

+																									
+
+		
+
+																											
+

"?@AqzU]hJ>@@@@@@@???????@???????????@@?>>DUgaXsO>B/
+
+																									
+
+	
+
+
+
+
+																								
+

 ?@@l~YXiP??@@@@@@??@??@@@?????????@@@@?>>GYhZRt{J>B.
+
+
+																							
+
+
+
+
+
+
+
+																								
+

>@>d�_PdYB?@@@@@@@@???@@@????@@@@@@???@?AN^hZ\{tD>B,
+
+
+																								
+
+
+
+
+																										
+
>@=[�_O\aH??@?@@@@@???@@@?????@@@@@?@@@?EYfd[f�h??A(
+
+
+																									
+
+
+
+																									
+
+
+
;@<O�nSTeTB?@????????@@??????@@@@@@@@@?AOeja\q~Y=@?#
+
+
+
+																							
+		
+
+
+																								
+
+
+8@<Dz}XO[bL@????@????@????>??@@@@@@@@@?KaneZf{qL=?:

+
+
+
+																							
+	
+
+
+																											
2A==g�bRS_]G??@@@@?????@?????@@@@@@@@?E[kf_]p`@>=2
+
+
+																			
+				
+
+
+		
+																									
*@>;O�wXOZjYE??@@?@@??@@??@???@?@@@@>AUjid[`xvK;>;-																							
+			
+	
+	
+
+																									
!??=?f�mTSgoUD>?>@@@?@@@??@??????@?=>Ngk^YWh~a?<?92

																								
+	
+	
+
+																											
+8@><K�cV[lhUD>>@@@@@@???@@@??@@@?=Hdq^QT^wxJ<>>7<																									
+
+
+
+
+
+						
+																				+A>>>Z�wZSXgkXC=?@@@@@@??@A@@@@?>>IbqhWMNl]>=?:0;																						
+			
+
+	
+
+	
+
+																								

<@>>?Z�mVSZlm[J@>?@@@@@?@A@@@?>?LdqhXVYh�kC<>A0")

																	
+					
+
+
+
+	
+
+
+																										
+.A??>@b�nTOYkrjXIA>?@@@@@@@@?@ESnoc\\_i�uJ<>@>


+																		
+					
+
+
+
+
+																												
;A??>Ch�mTNUcpsiWKA?????ACDKZgvydYY`r�wQ=>@A.


	
+																		
+				
+
+
+	
+
+				
+																						
+(@@??>Cc�u_VZ[dmsn]SSOJHP[X]v{sf\bktrN=>@A5	
																								
+
+
+
+	
+
+				
+																							
. at A??>A[~}l`]Z]erwsqkehbniT[`]_iy�kK<>@A7	
+																						
+	
+
+
+	
+
+	
+
+																									. at A@???Tv�zoh_`dk`X]i~stiWWipz��t\E=>A at 2
+
																							
+
+
+
+
+	
+
+	
+																											*=A@?>=Hay��{sonb^^]z��vu}��yjYI?>@A;)
+
																								
+
+
+
+
+	
+	
+																											
+!7AA@?=>I^s����������}raVMC>>@A>1



+
+
+																								
+
+
+	
+
+																													
++;BA@?==CLU]bhnrpgWROKFA>>?AB>3!
+
+		
+																								
+
+
+	
+	
+																													
+:AAA?>==>??@AA@>==?@@@AB>3#
+
																														
+	
+
+
+																														
&3:?AAAA@@@@@@@@A<8;<:1!
+

																															
+
+																																

!*05679:<>@@?7'62
+

																																
+	
+																																	

" 
(9
+

																													
+					
+																																		
+
+






+																																	
+
+
+
+
+																																
+		
+



+																															
+		
+
+	
+																																
+
+
+
+
+			
+	
+
+	
+
+
+
+
+
+
+
+
+
+																																			
+	
+
+																																	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																	
+	
+
+																														
+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																	
+
+
+
+																																
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+																																	
+
+																														
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+																																
+	
+																													
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+
+
+		
+																											
+	
+
+
+		
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+		
+																									
+
+
+
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																											
+		
+																								
+	
+
+		
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																							
+
+
+	
+																							
+	
+
+	
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+														
+				
+
+
+
+	
+																			
+	
+
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+														
+		
+
+
+
+
+																				
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+	
+
+
+									
+				
+
+
+
+
+	
+
+		
+
+													
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+	
+			
+			
+
+
+
+
+	
+
+
+
+										
+	
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+				
+			
+	
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+			
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+	




+

+
+
+
 [...]
+

+	
	
+		
+			
+					
+
+
+
+
+

+				

				
+		
+
+
+	
+		
+
+					
+	
+
+		
+				

+		
+
+				
+
					
+	


+		
+



+				
+



		
+
+

+
+
+
+
+




+		
+
+	
+
+


		
+

	
+




+	
+

+		
+
+
+			
+
+
	
+








+
+	
		

										
+
+
+							







		



+				

			




+
					
+

	
+
+



+		


+	
+
+									
+

+




+
+





						
+
#)/468740(
					

													

	
+
+
+
+		
+
+		


			
)3:>????????@?<4'

+			
+
+	
+									
+
+							
+
+
+
+		
+


+8?@?><;;;<<;;;<>@@<0

+
+
+												


		
+
+		
+		E>.6>?=;:>DNW_cc_WMC<;;=?=::H6	

					



							
+
)=>><:;FYm{��������}lVD;:=>=>%

+							
	


													

+3>=;;Gay��umeb`dhgmu��zaH<;>=0


+										
+		

+

	
+

				
+			
	6?=:A\y�odaUWZZZ[WVSRYi{�|`D:=>,

		
+														

+
+												
+
+	6?=;In�wfWWXPWY^`_^_]ZZ[\]t�wO;=:


+																		




												2@=:Mvj^ZY]]`gksrtxptvrf_\dt�W=>+	
																				
+	
+
+
+		
+
+																
+
(?>9Lv{\WZ^ikrw~xcQQ]X_my~pb^_g|�[><,
																																											
+;?<Gs|dY[_lxtqlbP@====?BJ^qxgT[fw�X=?/																																															


+
/@=@ieXY[exkWKC>=>??=?>=<<AXtk[Y^|�Q=?)
+																																										
+			
+



=>9ViWY[]sqP?<<=????>?>>>=<Eduh\ai�tG><

+																																															
+		
+
+



	1A<CtsVUV^orU>===????>=>>>??>?Ojqg_`b|f?@2
+	
+	
+																																																
+

+

+
+
+
=?=_�fZZ\gkS>=>==>???>>?>????>AUnoc]Pl�P== 

+
+
+
+																																																	
+


+	
+
.A=Jyq[[bk^M>=>>>=>???>>?>?????=CZok\U^�m@?1
+
																																																								
+

+	
+:@>c~[Zlk_I==??>>>>>??>>>>??>??==F^naYYn�Q==


+
+																																																						
+
+
+$?>J{mPfoXE==??????????>=>>??>>>>>>Ien]XYyi??-
	
+																																																	
+
+
+
	/@?a�WTq_E>=>??????????>>>>??>>=>>>>NndYSi{J>9

+																																																	
+




+
5?HvoO^oN=>>>??????????>>>>??>>>>>?>?ZhYUZ]=?#
																																															
+



		
+9?WvZQn[@>??>>>>???????>>>>>???>>>??>CdhQRxrA at 0
																																															



+
+
+#=AfqLTeG=????>>>>??????>>>>>?????????>PjSLfyM>9
	
+																																														


+
+


4 at CtgM`T?>??????>=>????>>>>>???>??>???>A\\NTr\>>
	
+
+																																										

+		
+
+
+
+
$=>G|^ThI>???????>>>????>>>>>>??>>?>????=Jd_Omj@@%

	
+																																									
+


+			
+
+
+		

3A?Nqf_@=??>????>>>????>>>=>>??>>?????>>?SlXbsD at .
+
+
+
+
+																																						



+
+
+		
+	
+
+
+

<AAZ|{lK=??????>>>>>????>>>>>>??>>>???>=?=CacswE at 4
																																							
+





+	
+
+	
+
+
+	
+
+
'@@Fe}qY?>?????>>>>>>???>>>>>>>??>>>????>??>ThzvG at 9
+
+																														
+										








+						
+
+	
+
+0B at T~h^N=?????>>???????>>>>>>>???>>>>??????>Hcq�Q?<	
+
+																													
+									
+



+
+						
+
+
+
+
8B@`xPQG>?????>>>??????>>>===>>????>>???????B[f}\@?
	
+
+																																					
+

+



+
+		
+					
+
+
+
=A at fmOWE>??????>>???????>>>>=>>????>>??????>?ZezqCA)
+
+
+																																						
+
+
+





+
+							
+
+
+
+ @AAjhTcE=???????>>????????>>>>>????>>??>???>@ZahwGA2

+
+																																							
+	
+




+										
+
+
&AACqi^fD>???>?@?>>>???????>>>>>????>>???>????Yj`yJ at 8

+
+
+																																							
+
+
	
+										
+
+
)AAErd_dC>?????@?>>>???????>>>>>????>>???????@^e^zJ?=


+
+																																								
+											
+
+
+
,A at IubckG>@@@???>>>>??????>>>>>>????>>>?????=B`a]zL>?



+
+																																										
+
+													
+
+
1B at Lt[cpM>@@@@??>>>???????>>>>>???????>???@?>Aa_\}N>@"


+
+
+																																								
+															
+
+
+5B at Ov^muP>??????>??????????>>>>???????????@@?Bd]^O>A%


+
+
+																																																								
+
+
+6B?S|\gtO>?????>>????>?????>>>>?????????>?@@?Di\^�O?B&
+
+																																																										
+
+
8B?ZyTgoJ>@????>>???>>???>>=>==>???????????@?Gp_]{Q?B'
+
+
+																																																									
+
+
7B?_vYojF?@@??>>??@??>????>>>=>>?@?>>???????>Kq]YvS?B'
+
+																											
+																														
+6B?c}dr`@?@@@??>??@??>?????>>>>>???>??@?????>RoYc�U>B(	
+
+																																																								
+
+8A at h|fnV?>?@@@????@??>????>=>????@?>?????????WkW`�U>B(	
+																										
+
+	
+																										
+
+
9AAlzckQ???@@@@????@?>?????>?????????????????Uk^e�V>B(		
+																					
+			
+
+	
+																										
+
 <AAnrZgO?@??@@@@?????>?????>?????????>>>??@?@Tfeo�V?B)																										
+
+	
+																												
+
">@AorWfQ?@@???@@@????>???????>>>??????????@?AVicm�U>B+
+																								
+	
+																															
"@@AqyUeW@@@?????@@?????>????>>>>?????????@@?B[i_m�S>A*
+																								
+
+
+																															
 ?@AntTcaD?@@????@@??????????????????@??>>???C]dXk}P>A(
+
+																								
+
+			
+																										
>@?ltR[hL?@@@???@@?????@@??>???????@@???????F`VJi|L>A(
+
+																							
+
+
+			
+																										
;@>h�UZjU?@@@???@@@@????@@?>????@@@@???@@@?@Nh\QryF>A'
+
+																								
+
+																												
+
+8A<_�`RdaC?@@@??@@?????@@@??????@@@@??@@@??EZg^^�pA?@%	
+
+																								
+																											
+
4A<Q�nUXfL?@@@?????????@???>????@@@@@@@@@?APfg]e�d=@@ 	
+
+																																																					
1@<E}[SeXB?@@?????????????>???@@@@@@@@@??Kaic]r�V;A>	
+
+																							
+			
+																							
+	

,A==k�bR[dO?@@@@@@@????@@?????@???@@@@@?>F]lcVc~zG<B9
	
+
+																							
+	
+																										

$@>;S�sRKbdH?@@@@???@??@@???@??????????>BWleUTj~`>=A0

+
+																			
+
+
+
+
+
+																											
+

=?<At�^RWmZC>?@?>?@@??@@????????@@???>ASjiSL[~qI<>:"

+
+
+																				
+
+
+
+		
+																									
+
6@=;R�yTQajXC??@??@@@@@@????>?@@@@@@>>Oee\PQlX<=<1
+
+															
+
+		
+		
+
+
+		
+	
+				
+																			
)@>=?h�nRRdlXD??@@@@@@@@??@@?@@@@?@>>HfmUPLV}jB<>9.

																			
+	
+			
+
+
+
+				
+																				
+;@>=Gp�iQSbkZD>??@@@@@@?>@@@?@@@?=>LethUQYwyN=>=92
+
+																						
+	
+
+		
+																										.A>?>Fm�bIRdoaNA>???@@@??@A@@@@@>ASkvk_^\q�X=>@790
																					
+
+	
+
+
+	
+					
+																				<@>?=Iv�]Q[mql\LA>>?@??@AAA@??@H`qrg`[_q�c@>?@)0

																			
+
+
+
+
+	
+
+	
+		
+
+																					
+*A@>?>Jt�h\[ajql\LB?==>@?@AAEVep|m`^W[u�gB=?A6
																				
+
+
+	
+
+
+		
+
+																									4A@??>Jq�m[X]eouo`VQQNKCKUV`suvm`\[cw�eB=?A=


+																						
+
+
+
+
+	
+
+																									7B@?@>Hj�saa\_fsz|wqjdlglkabUUX\ir}]A=?B<"
+
+

																						
+
+
+
+
+		
+
+																										
6BA@?>C]}�ykdbahcZXWZrvveRZ^eq{�~lP>>@A8
+

																							
+
+
+
+
+
+																										

1 at B@?>>Ic~��xmh_YUgjv���mx���w`LA>?A>/
+
																								
+
+
+
+			
+																										
$9BB@?>>I]r�����������{pbSE>=?A at 6"
+
																										
+
+
+																													
+
*;AA@>==AL\ipqrtpe^_WPIC?>>@BA8&
+
																											
+
+																													
+

'8 at A@@?>>?AABC@>?>>??@AAB at 8'


+																													
+																													
!/9>ABBA@@@@@@??A at 87892$



+
+
+																											
+																														

&-24789;=>@?;.%@%
+


+	
+																						
+					
+																																
+





/"

+																													
+		
+	
+
+																										
+
+		






+																																	
+
+																															
+			
+
	



																																
+			
+																															
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+			
+
+
+
+
+																															
+
+
+																															
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																															
+
+	
+																												
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																														
+
+
+																													
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																													
+																												
+
+
+
+	
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																										
+	
+																												
+
+	
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																										
+
+																										
+			
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+
+																									
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+																								
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																			
+			
+																						
+
+	
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+		
+																	
+
+	
+																		
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+		
+
+													
+	
+
+																	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+									
+
+	
+
+		
+	
+									
+	
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+			
+
+
+
+
+		
+										
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+	
+						
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+


+
+
+
+
+
+
+
+
+
+
+

+
+
+	








+
	 [...]
+
+
		
+	
+
		
+

	
+	

+
+
+		
+
+					
+	
+
+


+
+			
		
+
+			
+
+
+
	
+					
+				
+	

				
								

+	
+
		

			

				
+
+
+
+
+								
+
+



+

+		
+						
+




+
+





+
+
+		
+



	
+


					
+	



+						
+	
+
+		
+
+
+


+
+
+
+







+
+
+

+

+

						
+
+
+

+			
+

	



+		

	




+			
+
+

+	
	

+


+

		
		
+	
+			


+				
+
+
+			
"(,/0/,' 
		
				
+					
+




+	
+			

					#19>?@@@???><95/&			
+
			
+		
+
+						
+
+





+			

+		
+

+	+:@@?=<<<;;;;<==>>;71#


+											
+

			
+		&!)<@@><;=CKSX\[XQIA<;<=<:4+#+&
		
+					
+
+		
+	
+@F9=><:<GYm{��������xfQB;;=>>?H-
	

+		
+
+												
+
+%=>=:<Kg��yridacfimz��y`G<<=>< 


								

+											
+
7><;Gg�~wmh__c_[ZWPU[]lz�cE:<>4

+	

													

												
			8?<<U{�ta[_]XY\\a`]\[[Z]]fq~yT=<>-
	


+														

+		

									
	7?<=]�}b][\begjosumuwvtnea^S^t�b?<:

									
+
+	
+
+
+
+
+
							
+		
	1@<=^�rYVY]lvyzytbRP[]chu�t`\aYf�hA=,														
+





+
+														
+
+	&?>:V�mTQXcqneb[SI?====?AHa|wd]ZVe�iA<)
																																									:?;L|pSOU`riPEC?;<>??>?>>==Jbso^`\b�c??-																																													

+
-@<?o{VROXktS>====>???>?>?>=;;Gho_`cr�W>?%
																																																	

+<?:X~aOTZlqaB=??>>>??>>>>>>===<Iip_`Xs}H>:
																																													
+
+	
+



	-@=GufOQZjo]E<>?>=>>?>>=>>>>>>?=>PsjZT`�h>?.
+
+																																														
+
+

	:?>f{XT_jgUB;=>>>=>??>>>>>>????>=@YqeZYs�N=<
+
+

+																																																				
+
+

+	
'?=KkMYkdM@===>>>>>???>>>>?????>>=Eek[Y]zk>?,


+
+																																																					
+
		5@?e�ZTk^F>>>>>>>>>>>?>>=>>??>??>?>>PlaZSfM=9


+																																																				
+
+
+
+		
==L~pNdgD=>?>>?>>>>???>>>>>??>>>>??>@bj\UUyf=>#

+																																															
+



+	
+
+
+(@>c~\NoX=>??>>????????>>>>>??>>>????=Nm\XQgzG>3
+																																														







	
+
2?EvlN\mG>???>>?????????>>>>??>>>>>??>?\fZT[�Z=<

+																																														
+

		
+		
8>R{VKiY=????>>>>>?????>>>>>>??>>>>???>DggUQsm?@'
	
+																																										
+





+


'>=^zPXdE>????>>>>>>????>>>>>>????>>????=Ql\JZvH?2	
+																																											

	
+
+
+
+
+
7A=^yNfV>?????>>>>>>????>>>>>>?????>????>@ZeNOrU>:
+	
+
+																																								

					
+
+
+

)@?Khu_jH>????????>>>????>>>>>>?????>?????>Dc_Roa>>

	
+
+																																								
+
+				
+
+	
+
+
6B?]x{k[?>??>>????>>>????>>=<>>>?>>????>>??=LfbnjA@$
+
+
+																																							
+



	
+
+		
+			
+

=AAe}yfG=???????>>>>>???>>>>>>>>?>>???>>>???@Xn�lBA(	
+
+																																					
+




	
+						
+
+

"@AEo�iS@???????>>>>>>???>>>>>>???>>>????>???>Nu�lBA-

+																																							
+







		
+					
+
+	
*BAK~p[P??@????>>>>>>???>>>>>>>???>>>>??>>???>Ei�yG at 5

+
+																																					
+





+
+		
+							
+
1B at OxUQL????????>>?????>>>>==>>>????>>??>?????BZo�Q?=
	
+
+																																		
+


			
+
+									
7B at UtR[M>???????>>??????>>>>>>>>????>>??>?????AZ]}e at A#
	
+
+																																			




		
+
+								
+	
;B?]nQfM=??>>????>>>?????>>>>>>?????>>??>?????@`WdnBB,
+
+
+																																		
+





+											
+
+	!>B at cpThJ>????>???>>>?????>>>>>>?????>>???>????>^cfsCA2

+
+
+																																			
+





												
+
+
+%@AAip\aC?@????????>>?????>>>>>>?????>>???>?????[devE at 7

+
+
+																																					
+

+												
+
+
(AABpqdeE?@@@@????>>>??????>>>>>?????>>????????@`]gwF@:

+
+
+																																						
+													
+
+
*BACrlhgG>???????>>>???????>>>>>??????>>??????>Ad`ixF?=


+
+																																					
+
+													
+
+	
,BAEynnkH>???????>?????????>>>>>???????>>??@???Ci\k{H@>



+																											
+																												
+
+
+
+0BAI}mljI>@??????>>????????>>>>>?????????>?@@@?FmWl}I@>
	
+
+																																																								
+
2B at L}dkjG?@??????>>??>????>>=>=>>???????????@@?IoZdzK@?
+
+
+																										
+																												
+
+
2B at P}[jdB?@@@??>>?????>????>>>>>>???>??@????@@>OnV\vM@@

+
+																																																								
+
+
4B?T�^k\???@@???>??@??>?????>?>>????>????????@>UlRd~N?@
	
+																											
+																											
+
+
6B?YxWlR?@????@????@??>?????>>>?????>????????@>SjVl�O?@
	
+																									
+
+																											
+
+
9A?^xVkN>@@???@@??????>?????>>>?????>?>??????@?Mj]g�P?@
																											
+				
+																							
+
+
;A?bxTgP>@@???@@@??@????????>?>>?????>>??????@?Kkag}R?@ 
																										
+
+																												
+
+
<@?dwWeR>@@??????@???>>>??????=>>>?????????@@@>Ol]h{R?A!																									
+
+
+		
+
+																							
+
+
+
=@?guWiV?@@@???????????>??????>>>>????????@@@@>VkVd{Q>A!																							
+
+
+
+																														
+
<A>hxWl^A@@@@?>>??@?????????????????@???>??@@@@ZdPe{N>@ 																									
+
+																												
+
+
:A>f|XedF?@@@@???@@@@@??????>???@??@@???????@?B\[Pg{J>@	
+																							
+
+																											
+	6A=a�[^jP>@@@@???@@@????????>????@@@@???@@@@@?Gd^Sq{F>@
	
+																								
+																											
+	0A<X�a[k`A?@@@????????????????????@@@??@@@@@@?Oi^ZtA??
	
+																								
+																													
*A<M�jP^gL?@@@???????>??????>?????@@@@@@@@@@?BZdZ_�g>?>
																									
+																												
+
$A=B}ySSf[@@@@@@????????????????@????@@@@@@??Md`Xi�W<@;
																									
+																													

?><j�^P[hH?@@@@@@@@???????????????????????>H_fVZ}�G<A6
																				
+				
+																												
=>;Q�mURg\A?@@@@???????@@???????>>????@@?>DYcZPa�l=>A.
+
+																							
+
+																											
+
9?<@u�ZU\hN??@@?????@@?@@?????????@??@@@>BTeYNUs�T;?@!	
+																		
+
+	
+
+
+			
+
+																							
+

0@=<S�lTP``G>@@?@???@@@@@????>??@?@@@@?>ARgfQJ\�mB=@9
+
+
+																		
+
+
+
+
+		
+
+			
+
+																			

#?>>?m�gQVf^G??@@???@??@???????@@??@@?=>PdcVPSqwK<>='


+
+															
+					
+
+
+	
+		
+			
+																		
+
9?>=I�^OVh`H??@@@@???@@?>?@?@@@@?>>=>LgiWNTm�V<><1
	
+															
+
+		
+		
+
+			
+					
+																			
+@>?=V~qSN[qbG>?@@@@???@?>@@@?@@@@>>@NgqbQUh�d@>>8#	
																		
+		
+
+
+	
+	
+	
+																							
;@>??S}{]XeqlTC??@@??????@AA??@@?>DTjrfVQ\�sD=?:<
																				
+
+
+	
+
+
+
+		
+
+																								'A?>>>U~{`ZarseQC???????@@AA@??@AN_nk\VP[�wI=>?2D

																			
+
+
+	
+
+			
+
+
+
+																						
5A???>S~y_Z`itr`MC>=>>>?@A@@BP_gqodZPS_�wK=>@7'4																						
+
+
+
+
+	
+	
+																								;A???>S|{cY\fnrkaWSSPOGDFKObx{qn\SRVi�sH<>@? 

																					
+
+
+
+
+			
+
+																							
+
 =B@???Ot�r`^cdnu|zutnia]c^hk_UTW\h{�fE=?A>%
+


																						
+
+
+
+
+																											

:BA??>D^|tkdc`ee\Zo��~u`QT\fp|�~lO>>@A;#

																								
+
+
+			
+
+																							

1 at B@@??Jd|��vnicUYl���wtvks��u`K?>@A at 3
+
																								
+
+
+																											
"8AAA@>?HYn�������������wkbRC>>?AA8$
+
+																							
+
+																													
+
%8 at B@?==@IZfmrtwl]gh_QGA>>?@BA9'
+

+																									
+
+																													
"3>AA@?>==>?ABA?@@>>@@AAB at 9)
+

+
+
+
+																				
+		
+	
+																													
+
)4;@ABBAA@@@@@@AB<450,!


	
+
+
+																								
+																															
+

$*144689;<<:0
.?
+
+


+																											
+		
+				
+																										
+


%


+
+																										
+
+
+
+																																	
+
+




+																											
+		
+
+																																
+
+
+		
+		






+																																	
+
+
+																																
+
+
+
+
+
+
+		
+
+
+
+
+
+
+					
+
+
+
+
+																													
+
+
+																															
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																												
+
+
+																															
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+	
+																													
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+																														
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																											
+																										
+			
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
+																													
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																								
+																										
+
+
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																					
+
+
+																						
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																			
+
+																				
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																
+	
+
+			
+													
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+									
+
+
+
+
+			
+							
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+						
+
+
+
+
+		
+										
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+
+
+
+						
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+		
+
+

+
+
+
+
+


+
+
+	
+
+
+


+
+
+

	 [...]
+					
+	
		
+

+
		

		
+		
+


+					

+					
+
+				
+
+	

			
+
+			

		
+
+	


+			
+
+			
+			

						
+												

+	

+		
+			

+			
+
+	
+

			
				
+			
+
+




	
+

+					
+

+		



+			
+



	
+

	
+


+	



				
+
+




+
+
+						
+
+
+
+
+
+
+
+
+
+
+
+





	


+	
+




					
+


	
+
+
+			
+




		


	


+	

!#$$!

	
		

+		
+	
+
+		
+
+

+
+	

	
+
+			
+
+
+
+			
#/6;>???@?>;72)
	
		
+
+						
+

+									
+

		
+
+
+		
0:>??>=<<;<<=>?@@?9+
		
+
+	
+
+

															
+
+
+
+
+
+							

+
+

3=@?=;:>DIMOOMHB=<<>?A=0

+
+

+														
+


+					
+
-. /=?=;<DTgv�������|n\J>;=??<45@)	
+
	
								
+

											9J=>=:<Je����palaenot��rYD;;=>AA

+		
	
											
+

+												
+%=><;Jh��}dYlQ1N^V[TU_ekv�{^C:<>9


											
+			

+												
+	
9>;>]��tj[JTh\H^b^\[^`[[[iy�xT=<>6

	
+

															

+											
+	
9?;Ai�w]\_^emlnuwwzwsxtm]X[]`y�fA;?/

+	
										


	
+
															
+
7?<Bn�mYWV`r~{wurdWYcbcfw{j^ZSSl�pD<=$

												
+

	
+
															

/@<?h�lXRYdph[RMIC>==>>??If�rbZTTj�tE=1																		
+
+



+

														

">><]|cQOTkpWC>=<;<>???@?>=?Ts|jZYW`~qC<&
																																												
8@<L~oQMNeuY@=>>>=>???>@???><BYuta[OZ�h@=#																																																			
	
+(@=?o}^QT[nbD<>??>=>???>>>??>=><Egtb^Ub�V=<
																																																
+
+	9@;VdX`jj^I<<>??>=>??>>>>??>>??<AgsaX[~{E>7																																														
+
+
+


'@=ExnQYkiVD=<>>?>>>>?>>>>>>>>>??>;GllVXf�b=?*																																																				

+
+
		6@=b~VRioUA<>>>>>>>>??>>>>>>?>??>>><NlbYXp~I=8	
+																																																					
+

	
+==J}gMZoV@=>?>>>>>>>??>>>>>>???>>>?>?`f\UY~d<>#
		
+																																																				
+



	.@>eQKkW>>??>>>>>>>>??>>=>>????>>>??=Pm]TShzG>2	
+
+																																																				
		9>G{lNVfB>???>>>>>>>>??>>>=>>?>>>>>??>CjaSST{^<;


+																																																		


			
+
+!?=Y}YM`Z=????>>>??????>>>>=>>?>>>>????>WiWPNlvB?)

																																																	


+	
/A>nqSTjJ=???>>>>?????>>>>>>>>?>>>>>???>A_eRK[�Q>6
																																														



				
+9 at D{cO`^>????>>>>>>???>>>>>>>>??>>>>????>Fi^GOwd>=


+																																											

	
+

+




'@>N�hNgJ>?????>>>>>>??>>>>>=>>>??>>>?????=PmQGitA@'

																																													

+			
+
+
+


8A?Uvp_]???????>>>>>>???>>>>>>>????>>?????>?]eKW|I?2

	
+																																								

+				
+	
+
+

$@@Co|umJ>??????????>>???>>>>>>>????>??>>???>Ca\QzS>9
																												
+												
+




+				
+
+	
+
+
0B at J��{`?>??>>>????>>>???>>>==>>???>???>>>???=Ik\v\<=	
																											
+									
+


	
+
+				
+
+	
+

8B?V�pgJ<>>>>????>>>>>???>>>==>>>??>???>>>?????cqe=?




+																																			
+



+
+
+	
+							
+
<B at cx_]C>??????>>>>>>>??>>>>>>>>???>>??>>>????=Sx}a?A%
+
+
+																																		
+




+
+
+
+	
+						
+		
"@B at lfQ[A???????>>>>>>??>>>>>>>>????>>>??>>?@??>Ht�gBB0
+
+
+																																	
+








+
+		
+
+							
+
++BABo[LU@????????>>>????>>>>>>>>?????>>??>?????>E_sxJA:

+
+																																	



+

+				
+
+							
+
+3BAEsW]Z>???>????>>>????>>>>>>>>>????>>??>?????>D]Z|Z@?

+

+																																





+	
+	
+									
+	
8B at JuRaW>??>>>>???>>>?????>>>>>>>>???>>??>??????DgRoa?A$
+

+																															
+




+
+
+
+											
+	;B at OyU`O>???>?????>>>????>>>>>>>>????>>?>>??????Bi[rd?B+

+
+
+																																
+







+														
<B at Vz\cE???????????>>????>>>>>>>>????>>??>>??????_]sh?B0

+
+
+																																		
+
+
+
+													
+	>B@[zjdA???@@????>>>>????>>>>>>>>????>>???>>????Bd[vk at A3
+
+
+																																		
+														
+
+	!?A at _um^@>????????>>>???????>>>>>?????>>>??????@?GiYulAA7
+
+
+																																	
+															
+
+
+&@A at f~t[?>????????>>????????>>>>>>??????>>?@???@>LoWupBA9

+
+
+																																																			
+
+
+
)BAAl~s]A?@????????>????????>>>>>>>?????????@?@@>Ps\trCA8
+	
+
+																																
+
+																				
+
*BAArwnbB?@?@?????>>??????>>>>>>>>??????????@???=UmYltDA8
+
+																											
+							
+																				
+
*BACvqjd@???@@??>>>>???>???>>>>>?>???>?????????@>^bSoxEA9

+
+																									
+																													
+
+,B at E{oj]?@???????>>????>?????>?>?????>???????????^aOr{EA9

+
+																								
+	
+																											
+
-B?H~cgW?@@????@??>????>????>??>?????>??>??????@?ZgVo|GA:

+
+																								
+
+																											
+
.B?K~]eV?@@@????@?????>?????>>?>?????>????????@@>UmYfyI@;
																										
+																											
+
+
0B?O|ZcV?@@@????@@????>?????>>>>>>???>???????@@@?UnWcxJ@<
																										
+																											
+
+
+1A?S�[dX?@@@????????@?>>?????>>=>>>???>????@@@@@?WlWe{J@<
																										
+	
+																									
+
+
2A>V�]hZ?@@@???????????????????>>>>????????@@@@@?UaSe{J@<
																							
+
+
+		
+
+																									
+
+2A>W�cm[>?@@@@??>???@??????????>?????@??>????@@@@TbWhyH@<
																									
+	
+																										
+

0A>V�ag\@>@@@@?????@?????????>??????@@???????@@?@YhThwF@<
	
+																							
+
+																										
+
*A=R�_a_E=?@@@@????@??????@??>?????@@@???@@?@@@?B]dTsvB@;

+																								
+
+
+																								
+
+
$A>K�f`eQ>>??@@???????>??????>>????@@@?@@@@@@@@>Gb]V{p?@:

+																								
+
+
+																									
+

?>C�pWbaG>@@@@@??????>????>>>?????@@??@@@@@@@?>OfXY�c<@7
+	
+																						
+		
+																										
=?=t}WXeX?@@@@@@???@????????????????????@?@@@>CYaRf�R;A4
+																								
+	
+																										
:?;_�^QbfG>@@@@@@@??@??????????@?????????????@QaXRv�E<A.																				
+		
+	
+
+																										
+4@<J�nQWlY???????????@??@????????>??>???@@@??IaXN]�j==@#	
+																	
+
+			
+
+	
+																									
+-@=>o�[PbiH>@????????@@@@??????????@??@@@@?>E[aPQl�Q<>=
	
+												
+
+			
+			
+
+	
+																										#?=<N�pPSgXA?@@@@@??????@????????@@?@@??@@>CXhUHU�t?=@3
	
+																		
+
+	
+
+
+
+
+
+			
+																			
<>==k�YV]fQ??@@@@?????????>>??@@@?????>>>BVl_QPj�S<??#
																	
+
+		
+
+
+
+
+	
+
+		
+
+
+	
+																	
+1@>=G�|XS]jQ@?@@@@@?????@?>?@?@@?????>>=@Uj_OOi�\>>@7																		
+
+
+		
+
+	
+	
+
+
+																						
!@?>=U�nXQelP==?@@@@@@??????@????@??@?=?PmgRO^�k?<?=#

+																			
+
+
+
+
+
+
+
+
+
+																							
+6A>?>b�rYWgjWB=?@@@@?@???>?@@??@@@@@>ASlkTP[�wF=><,																		
+
+
+
+
+
+	
+	
+
+			
+																					

 @???A^�t[WhxgNA?@@@@@@@??@A@?@@@???EXlkRLYzN<?<4	
																				
+
+
+
+
+	
+
+
+
+
+																						
+0A???>Z�pZ[ivt]G>?@@@@@@@AA@@?>>?CO_jcPJY{Q=>>;5																					
+
+
+
+
+	
+
+
+
+																						
:A>???Z�pYY_pwgRE@>==>??AA@@BJXaflbXNK[~|P=>@6 at -																				
+	
+
+
+
+	
+
+
+
+																						>A????V~dX[erpf[VRSUSIBEKQcw|zq]MJRj�sI=?@<#2

																					
+	
+
+
+	
+	
+																							

!=B@??>Mq�w^X_cgow{vlq|nnj`dc`W]X]m}\A=?A>!
																							
+
+
+	
+
+																								


7A@@?>B[{�yhb__b`XZd��wdZV[bo{�|cG=>AB< 	
+																								
+
+
+	
+																									

,>B@@?>F^w���qjfd]`y���~x{���oYG>>@B at 3
																									
+
+	
+																											

2?BA@>>CPcx������������xj[JA>>@BA8$
+
+																								
+
+
+																										
+
2>BA@>>>BLU\eoskcli_PD?>>?@BA9&
+

+																				
+	
+		
+
+				
+																									
-:@AAA@?>=>??=>>>=>@?>@A>6&
+

+
+
+																							
+
+
+	
+
+					
+																						
+
!-6;>@AAAAAAAAAAB=07*!
+


+
+
+
+																					
+		
+
+
+																											
+
+
+
!(,/0333553,
A$
+

+
+																							
+
+
+
+
+
+	
+
+	
+																								
+			
+



+
+

+		
+																											
+
+	
+
+
+
+																													
+	
+



		
+																													
+
+
+
+
+																														
+
+
+
+
+			
+











+
+
+
+																													
+
+
+
+																														
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+			
+
+
+
+
+
+																												
+
+
+
+																												
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+	
+																														
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																									
+	
+		
+																												
+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																										
+		
+																										
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																											
+		
+																										
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+	
+																								
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																							
+
+																				
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																		
+
+
+
+			
+															
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																	
+
+	
+		
+														
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+								
+
+
+	
+								
+					
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+				
+
+
+
+
+
+	
+						
+
+			
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+	
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+	
+			
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+		
+
+
+

+
+



+
+
+

+
+




+		
+
+	
+

+
+
+
+
+
+
+
+





+
+		


+




+

 [...]
+

				
	
+				

+	
		

+
+

				

+
+		
+



+					
+
+						
+				
+



+		
+		
+


+	
			
				

	
+
+	
+
+		
+

									
+	
+
+
+
+



+
+	
+
+						
+





+		
+
+
+
+
+
+
+



+		



+				
+

+						
+
+
+
+
+








+	
			
+						





+
+	
		
+	
+	

		
+
+

+
+
+
+
+		
+




+	
+

	
+

	
+
+	'/59:<<<;72,%

+
	
+
+	
+

+


+			
+
+
+


		



+
+	
+
+
+



+				'4<?@??>>=>>????=9-
	
+
	
				
+							
+
+										

		,;@@><;<=@BCCA?<;<=??>5$
+	
	
+
+			
												

										
+
+
+
+
+	(:@?<;=GWfrz��yl]MA;:>??8(



+
										
+								
09(5?><;D[u���kctrw�����{eM?;=?><8?$	
+


+										
+												
+.H?><:Ge��sXB; Eiejfebgu��xV>:<=?2
+
+
								
+
+	
+

+					
+	
+#=>;>^��{O+09h\cc\[_akp��tO<<>7



									

+	
								
+		
+
+ 9>;Cm�th\9*,=o[Kp{tqwqnrccP`p}�c@;>4


+													

+	
															
9?;Fu`RWcRWq}�~xkbgndbbtxg`c`]p�rE;?%


												

+

+	

+															
	3?;Dt�dTTWj{ucTNKE?>>@>?@Lo�m\Z[Yk�zI=:

+

+
														
+
+
+
+

+	
+

																	

+	)?<?gy`VT[ooYE>===<>????>?=A^|xaXU[a�{G?1

																							


	
+
+												
+
	=>;Z{ZQKSnjJ=>??>>>>????>??>>Jhxl\UU[{qB?+
+
																																									


+3@<I{nVR[igJ=????>>>>?>>?>????=>NhpbTOX�c?=!
	
+																																														
+
+	
+ >==ka]cl`H<<>>??>=>??>=>>??>>?><@YpaSTp�O>9																																														
+
	3@<Ri]iqYD<<==>??>>>??>>>>>?>>??><>Zn^X]}sA?1																																									
+
+	
+
+
+

+
+>>BrpW^m`C=>>>>>?>>=>?>>>>>>?>>??>>=Bbj^We�Z<>

+																																															
+
+
+
+
+	
/@=]�WKjmI=>?>>>>?>>>>?>>>>>??>>>>>??<JjbWVnyD>1
+																																																			
+
+
+
:>C}sKRoS>>>>>>>>>>>>??>>>>>????>>>>?>?dbVQ[[<<
+
																																																			
+

+
+	%?<V�^Q^U?>???>>>>>>>>??>>>>>????>>????>ZlVQQkvB?)
+
+																																															
+

+		4@?pvP\dE>????>>>>>>???>>===>>?>?>>????>Km[OKX�U=7

																																																	




+
+
>>J~bLe`?????>>>>>>???>>>===>>?>>?>??????ZfRIMwn?>
+
																																															
+

+		,A;[{QRoQ<>???>=>>>???>>>==>>>??>>>????>?>B^`LKc}H?-

																																												
+







+		9A<gyO[`A=????>>>>>???>>====>>>??>>>>?>>??=FdYLTyW=8

+																																									
+

			
+
+
+


+
$@@?j�YaO>??????>>>>>??>>>>>==>>>?>>>>??????=QhROsf=>
																																									

+				
+
+
+
+

+4B?Kmyf`A???????>>>>>>??>>>=>>>>????>>??>>??>?ZeNos>@#

+																																						
+
+
+




+							
+

=A?\xwuQ=????????>>?>>??>>>>>>>>???????>>????=B_]l{>@,
																													
+										


		
+					
+
+
+	
+

"AA at l�eA????>>??????>>??>>>>=>>>>??????>>>????=I^qvB?2
																										
+							
+
+

			
+
+						
+	
+
+
*BADvv_N=??>>>>?????>>>??>>>>>=>>>??????>>>????>@XmwH?8

																																	
+

		
+
+									
+
+
+4B at JvZVJ>????????>>>>>>??>>>>>>>>????>??>>>?????=TmtL?>


+
+																																	
+

+													
+
+
+
:B at PrOUG?????????>>>>>??>>>>>>>>>????>??>>>?????=N_v`AB*	
+																																
+




+						
+							
+
+
!?B?VoN[E?????????>>>????>>>>>>>>>>???>??>>??????>KYszFA5	
+
+																														
+






+														
+
+'AB?`jRjD>???>>>???>>?????>>>>>>>>>>??>>?>>???>??=Pb`{IA<
+
+																															



+


+					
+								
+
+
+-BA?hdVf@???>>>>>??>>>????>>>>>=>>>>??>??>>??????=RfSxM@>


+
+																													
+




	
+
+
+
+
+									
+
+
0BAAof`\????>>>>?????????>>>>>>>>>>>??>??>>??@???=OlXzP@@

+
+																												
+





	
+
+
+
+										
+	
4BADugeL?@@???>???????????>>>==>>>>???????>>??@??>Fj^~R?A%

+
+																															
+


+	
+
+																		
7BAFvgcB????@?????????????>>>==>>>>?????????????@>Mi]V?A)

+
+																															
+
																		
+
+	
9BAHxka?@??????????>??????>>>>>>>>?????????????@@=Uh[xX?B-

+
+																																																					
+=A at M{j]>@?????????>>????????>>>>>>>?????????????@=]gXv[?B0
+
+
+																																																		
+
+	
+>A at R}ea>?@@@???????>????????>>>=>>>????????@?????=blXx`?B1
+																																	
+																					
+
+
+
?A at V�chA?@?????>??>>??????>>>>>>>>>????????@????>?iiYvd at B1
+
+	
+																													
+
+																					
+
+

@A@\|`oD????????>>>>??????>>>>?>????????????????>Cld\zf at B0
+
+																																																						
+

?A at bzdjB@@????@??>>??????????>>>?????????????>???Dk_Xwj at B0
+
+
+																																																				
+

?@@h{db@@@@?????@?>??????????>?>?????>??>>?????@@Be`WwqAB0
+
+
+																							
+
+																										
+
+
?@@mp`a@@@@??>???????????????>?>>????>?????>>?@@@@`bZ|sAB1
+
+																								
+																											
+
+
?@Asi]^??@@@????@????????????>>>>>???>>???????@@@>_dU{uAA4
+
+																							
+
+	
+																									
+
+
?@Cwlh[>???@???????@?????????>>=>>>???>???@@?@@@@>^dUsuCA5
																							
+	
+	
+																								
+
+
+??EzilX>???@????????????????>>>>>??????>????@@@@@?XiVntCA5
+																								
+		
+																									
+
@?FzigS?????@???>???@????????>?>????????>???@@@@@>TlUisBA5
+																								
+	
+																									
+

??F~jfQ??????@@?>??@?????????>???????????????@@@?>ThToqAA5
+
+
+																						
+
+																										
=?CndU@??????@??????>???????>??????@@?????@@@@@??WbStn?A4
+
+																							
+
+
+																									
:??{q]_D>?????@??????>>??????>>>????@@?@@@@@@@???B\^R{e=A1
+
+																							
+																											
+8@<q{ZcR@>?@@@@@??????????>>?>>>?????????@@@?@?@>HaTV�X<A,

+																							
+		
+																									
+3@:`�XbbI>?@@??@@@?@????@?>???????????????????@@@TbMa�J<A'																								
+	
+																										-@;N�cZg[A>@????@???????@???????@????????????@@?KeWPuw?>@																						
+
+
+
+
+																									'@<@}sO\kR>????????>????@@???>??@?>?????@?@@@@?B\aKY�b;>=
																				
+
+
+
+
+																											
?=;`�YTafE>@@??????????????????????@?@@?@@@@?@ScROm�K;?5
+	
+																				
+
+	
+																									
+:><E�oUUnU??@@@@@@?>>????????????@@??????@@@?Kg[LV�l==@'
	
+																	
+
+	
+
+
+
+
+
+																								1?=<^�ZPblL>@@@@@@?????>???>???@???????>???>IegPOl�L=><	
+															
+	
+
+
+
+
+
+	
+
+
+	
+
+	
+																		#?>=A{xSReeG>?@??@@@??????????????????????>FcgUQc�g=>@/

																	
+
+
+
+
+
+
+	
+
+
+	
+	
+
+																		
+;?><P�oTUjdE=>>>?@@@@@??????????????????>C_lUQZ~sD=?>																		
+
+
+	
+
+
+
+
+
+	
+
+
+																				
-A>>=_�oW]odH==???@@@@@???>?????@???@@?>BZl[S[{xI<?A/

																			
+
+
+
+
+
+	
+		
+
+																					

<@>??f�oX[mnSA?@@@@@@@@@??@@??@@?@@@?>EZl`SYv�M<?@7																					
+
+
+
+
+
+
+
+																							

(A???@^�jUZos]G>?@@@@@@@@@@A??@@?@@>@MckbUWs�R=?=5	
																				
+
+
+
+
+	
+	
+																							
+4A???>]�nYbjtmUC??@@@@@@@BBA@?>>?AJ[ibYWZu�S=?=9																						
+
+
+	
+
+	
+																						
;A???>Z�ze^`ovhPB?>>>???AA@@CP\aion]POb~wN=??9@																									
+
+	
+
+
+																							
<A?@?>S~�mYWckne\WVXZTMEGOTixvjmj]U\s�gD=?A588
+
+																						
+
+	
+
+																								
+9B@??>Gh�|f^[ejsxwmisyqvy[^^[UZYgx�tQ>>?B:)

																					
+	
+
+
+	
+					
+																			

1AA@@??Op�sld`]^RQv���yc[\[m{��rUA>?@B9

																				
+		
+
+
+	
+																										
$:BA@@>@Oj���vpd`}����}~���xcN@>?@B@/

+																		
+			
+	
+
+
+			
+																					
+
);BB@@>?FRev�����������r]MB=>?@B at 5
	
+																				
+			
+
+																										
+
+)9ABA@??>@DJU_db\XPGC@>??@AB at 5"
+
																							
+
+	
+	
+																									
+		
!2<AABA@?>===>==>>?@@:;;7-

+
+
+																						
+	
+
+
+
+																										
+
+
 *28=@AABAAAABBA;)53

+

+
+																				
+		
+
+
+
+	
+		
+																								
+	
+
#&(*++++) 
'0
+
+
+
+	
+
+																						
+
+
+
+		
+			
+																						
+
+		


+











+		
+																									
+
+
+
+
+
+																													
+
+			
+


+

+																														
+
+
+
+																													
+		
+
+
+
+
+
+	
+







+
+
+
+
+
+
+
+
+																													
+
+
+																														
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																											
+
+	
+																													
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																											
+		
+																										
+		
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
+		
+																												
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
+		
+
+																									
+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+						
+																			
+	
+																									
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+																				
+	
+																			
+	
+
+
+	
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+																				
+																				
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+															
+
+
+	
+																	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+												
+	
+
+	
+														
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+
+	
+
+
+
+
+	
+						
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+						
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+

+

+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+






+
+
+




+
+

+
+

+		
+

+
+
+
+
+
+	
+
+
















+
+		
+
+
+	

+
+
+
+
+








+
+	



+
+
+
+


	 [...]
+											
+						
+


			
+
				



+				

	
+						


		
+	
+
								
+	
+
+
+
				

+	
+
+
+		

					

+	
+
+
+
+
+		





+						

	

	
+
+
+
+
+
+
+
+				
+
+

		



+					
+		
+	
+


+
+


+				
+			
+



+	
+
+	
+
+
+


+		
+




		


+		
+





+
+





+
+	

+				#*.02430+%
			
+
+
+
+
+		


+
+		





+


+
+		
+	
+6=?@@@@??@@?><7.

+	
			
+


+
+


+	
+




+
+






+	"3=@?==<<<<==<<<==>?>7(

+


+

		
					
+	
+
+
+								
+


4>@>;;>FQ\empokbUI@<;;>@<0
	
												

											
	


-=?=;>Lbx�~tou�����zgQ@:;??<1"

											

+											
+
+.B+5?=:AXv�iK4#
,WfFAZru���dG;;=>98B


													
											
#C@>;=V|�rH'
+
+`_4.RhRcut��iE:<>?,
	

	
+				
+
+	
+

										
+:>;Cl��m/


']xsrtyuhg<:x��Y=<>6


								
+		
+
			

											8>;Gw�nd_/
1Pvtqxusuxtiu5	Kt��lB;?0
+
+												
+



+
+	


+													
+5?;Fx{]UU^egicXSOHCABEBA>Ev�XI[iip�xH<< 


+														







													
+

-?<Bmz\MQ]l|gK?<<<<=>>>>>>=Gl�w_XYai�{G=/

+

+																		
+




+															
+	 >>=ctYZUaugL>=>??>>>?>?>>??=?SnsfXYZ`�xD=&	
														
+	
+																
+

8?;P}_RYglZB=??>>?>>>?>>>>>??>=BUlsbWWYg?>'

																																							
+
	
)?<Cus[ZghP><>????>>>>>>>>>>????=<BVncULZ�X><

																																							
+
	:?<b~b_kdI=<>>>>>?>>>?>>=>>>???>>>=<Nl`UVx|G?5

+																														
+
+
+
(@=NdZijH=>=>>>>>?>>>?>>=>>>????>>>>=Ri_W_h>>&																																				
+
+
+	
+
+
8??p}OZoU>>?>>>>>>?>>>?>>>>>>?????>>?>?_i[Wd~O=7																																											
+

+
+	
+	#?<M�fOgcC>???>>>>?>>>??>>>>>>???>>>>??=Nm\QRrn>>#
	
																																															

	3@<f�W\kL=>>>>?>>>>?>??>>>>>>>???>>>>>>=Fl\SQ[|O=3	

+																																															
			
>>C|mRj_?>>>>>?>>>>?????>>>=>>>??>>>>>>>?afTRQun==

+
+
																																																


	
+
-A<W~RRpL>?????>>>>>???>>>>>=>>>??>>??>>><LhXLOe�H>.
																																														
+



		:@=lpKciB>?????>>>>???>>>====>>?>?????>>>=>TfPNX\=:																																													



+				
+&@?CvYPmY=>?>>>?>>>>>??>>>===>>???>>???>>>>>@]aMMlo>?
																																										

+	
+


+

+
+	5A>N�^^lD<>>>>??>>>????>>>>>=>>>??>>>??>>>??=FaXLWvE?+
																																										

+				
+
+
+
+

+	>@?TvpjU=??>>>??>>>????>>>>>>==>???>>????>???=PgNPzP>5
																																				
+




						
+
+	


)A at AfztdC????????>>>>????>>>>>>>>????>????????>?\bU�Y:;																																		
+


+

						
+
+	
+
4B at F}�uV>?????????>>?????>>>>>>>>????????????>?=Db_}Y=?
+																																	




+		
+
+								
+
+
+:B?OrqG>@???????????>???>>>>>>>>>??????>>??>>?>=PcsY>A"																										
+					


													
+
+
+

>A?Wpa\>????????????>>??>>>>>>=>>>??????>>??????>D]ybCB+
																											
+				


			
+
+								
+
+
+	&AA?_dWW>??????????>>>>>?>>>>>>=>>>??????>>????????_}vNA8																																	

+				
+											
+
+.BA?e[QS??????????>>>>>??>>>>>>>>>>>?????>>?????@??Pm�[@@!
+																															
+



+
+															
+	
6B at AkWYZ>??????????>>????>>>>>>>>>>>?????>>???>???@V\`?B,
																														
+



+																
+	
;B at GqQbZ<?????>????>>?????>>>>>=>=>>?????>???>>>??@dVhd at B5																														
+




															
+
+	
>A?MuRiS=???>>>>>???>?????>>>>==>>=>??????????>>??>eZek at B:
+
+																											
+



+

		
+													
+	
#@A?TtZrI????>>>>>????????>>>>>>=>>>>??????????????>ebdpAA<
+
+																											







+															
+	'AA?Ztdd?@@@?>>>>??>??????>>>>=>>>>>>????????????@?=YhgrBA=
+
+
+																										
+





+
+																	
+	)AA?^vjU=@@???????????????>>>>==>=>>???????????@?@??bakvC@?
+
+																												
+
+	

																				
+	
+
+BA?dshJ?@@???????????????>>>>>>>>>>?????????@?????Ak[dxE@@

+	
+																													
+
+
+																					
.BA?kuaE?@@???????????????>>>>>>=>>>???????????????Cp\ayGA@

+																																																			
0BA at qnbH?@@@@???>??????????>??>>=>>>>??????????????Co]VxKAA


+																										
+
+																							
+
2BABwohO>???????>>??????????>>>>>>>>>?????????????>HrbY|M at A 

+																									
+	
+
+
+
+
+																							
3BAEydhT>???>??@??>>????????>>>>>????????????>????=Jpic�Q at A"


+																										
+
+
+
+
+																					
+	
4A at Iy_oQ>@?????????>?????????>>>>????????>>???>???>KpfZ�X?A"
	
+																																																				
+3A at MzapI?@@@?>????????????????>>>?????????>>>>???@?IncW�\?A"	
+
+																						
+
+																										
+
2A at R{^kF?@?@??>>???????????????>>?????>????>>??@@@?Die^~]?A$																								
+
+																											
+
2A?X{ajD????@@?>??????????????>>>?????>>?????????@>@bc\�a>B&		
+																						
+																										
+
+
3A>]wad@>>???@?>??????????????>>>>>????>>????@????>?ZaYze>B(																							
+	
+																											
+4A>av^V????????>??????????????>>>>??????>????@??@???UfXwd>A*																								
+		
+																									
+4A>ftaQ>@????????>>?????????????>????????????@@@@?@>SiXwb>A)	
+																						
+	
+																										2A=ftcQ>@@????@@??>??????????>>??????????????@@@??@>UeVza>A(																								
+
+																										-A<e|eU?@@?????@??>???>????>??>??????????@@@?????@@?X_V}]=A'																								
+																											
(A<^�c]A?@@????@@?>?>>?????>>>>>>?>??????@@@@????@@A_XR�T=A%

	
+																																																		
$A<T�]eH>@@??@?????????????>>??>>>??????????@???@@?HcPV�J=@

																							
+																												
 ?<H�ba\B?????????@@??@????????>????????>>??????@@?U`Lh{A>>

																							
+	
+																								
+
>=>}sZnR>???????????????????>??????>>>>???????@@?GeUOyj<?:

+																			
+	
+
+
+
+																									;=:f�V_iK=@@?????????????@??>???@??????@@@??@@@?@YbN]�R<@2
+																							
+																											7>;L�bNhbB?@@@@@?????>?????????????@??@???@@@@@?NfVRtxA=@&
																					
+
+
+	
+																									-?==r|Q\mR>@@@@@@@@??>?>>???>??????@???????@@@>FeaV[�_<>=	
+																				
+
+
+
+																								
 >=;N�cRdjI>@????@@@????>??????????@??>?????@?B_iUKi~E=?2
	
+																	
+
+
+
+
+	
+																								
+9>=<k�UUkcC?@?????@@@@??????????????????@@@?@ZlXR_�[<>? 
																			
+
+
+
+
+	
+
+
+	
+																					.@>=F�nQZm]A?@?>>???@@@?????????????????@@??SjYR\�w@>@7
																	
+
+
+
+
+
+
+
+
+
+																							

?>>=U�pW]lWB????????@@@?????@???@???@@@@?>MkeRXy�L=?@!
+
+																		
+
+
+	
+	
+																									3@>?=`�qU^qbE>@@@@?@@@@@@???@>?@@??@@@@?>KhhWWw}N<>A3																			
+
+
+
+
+	
+
+
+
+																						


>????c�mW_oeI>?@@@@@@@@@@??@??@?@@@@@?ASmg]]t�Q<?A;

+																			
+
+
+
+
+	
+
+																								

+A????]�mZ`uqZG??@@A@@@@@?@A@?@@@@@?@J^oj[aw�R=>?; 
+
																				
+
+
+
+	
+
+																							
5A???>Z�tdbcqp\F>?@@@@@@@AAA@??@ADJ\ljYWb|zO=?=6

+																					
+
+
+
+	
+																								8A???>T~�i]]dpmYH@?>?@>?BA@@JZ_eqtqdhdk�lE=?=;'

+																						
+
+	
+																									6B??@>Jq�s`W\frskea_\ZREIZVnysmkc[Xs�|\@>?@5E
																								
+	
+																								
+0A@???AUv�l^Xadiqoh_{�t|xba`\\_ju�~dH>?@B/28

																					
+		
+	
+																									
+'=A@??>A[z��wme][WUc|���xfggw��z^E=>?AA.%																						
+
+	
+
+			
+																					
+
2 at B@@@?DVl|���yog{�������ziSC=?@AB<%

+
+
+																		
+			
+
+	
+
+																							
+ 5 at BA@@?@DN\iu�����~|uk]MB>>?@AB>.	
+
+	
+																	
+	
+
+			
+																								
+
+
0<BBAAA?>>@DLSWSHCA>>?@@ABA<.

+
																						
+
+	
+
+
+			
+																			
+
+
+
$1;@BBA@??>===>??@A?760+"



																							
+
+
+
+																										
+	
+

%-5;>?@@A@@@@<4!&D	
+

+
+
+																						
+
+
+
+		
+																										
+	
+



+&


+
+
+
+																							
+	
+
+
+
+																									
+	
+
+











	
+																												
+
+
+																														
+
+		
+
+
+	



+
+																											
+	
+
+
+
+																													
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+
+	
+																														
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+	
+		
+
+																													
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+			
+																								
+	
+	
+																										
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+			
+																							
+	
+
+																										
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+																					
+
+																									
+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+																					
+																					
+	
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+																				
+																				
+	
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																		
+
+	
+																	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+						
+							
+																
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+						
+
+			
+
+
+							
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+
+		
+
+						
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+

+
+
+
+

+

+


+

+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+

+
+	
+

+




+













+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+




+
+



+











+	
+
+
+


+


	
+
+
+



+
+











+		
+
+

+		
+
+











+	
+

+

+
+



+ [...]
+
+		
+															



+									
+


+

	
+
+				

+			
+
+			


+
+
+			
+
+
+		
+
+				
				
+		
	
+

+		


+						

		
+
+
+
+
+	





+	
+						

+	

		
+




							
+
+
+
+					
+



	
+



					
+
					
+
+
+
+




+




+			
+	
+
+
+
+					



	

				
+!#%$"

	
+



+					
+	
*5;>>???@?><92+ 
+		
+
+
+
+	


+
+			






+


		
,8=???>==<<<<=>?@@>8+

+			
+
+		



	









				
+,;??=;8=AGMRUTQKD><;<=@=3"
			



+					
+	
+

+									
+
+		#9?=<;?L^oyzy|�����vcPB:;>@>5 		



								

													
		.>>;<Jc|�}cH4,)QmF at T|��jP>;<>=0
+
											
									
+	+D15?<:Jm�{]B+

1/
Fsq�~�zV=:=?<D=
+
									
+

+	

+			
+									
!@@><>a��e'

		
MH,ilh:8u�vL:<>>!

	

+
+
+										

	
+
	

+							
+
7><Dq�jcB	
6FWq��y|�}yt	!O|�`>;>1

	
							
+








											5><Dv}fFLT*)?MUYWSPNOVXOEOzE
	9o�nB<>'
														
+
+
+



						
+				
+
+0><ApuX[RWnwjVD><;;<=<<<<=;Nva9>BBfp�vD=8
+
																
+


+
+																
+			$?==dpWSUbtlTA=>>>>>>>>?>>>>=Ee�tedab�uB>)
	
+																			
+
+	
+														
+	
+:>;T{WT_liYB<=>>>>>>>>>>=>>?>><G^rq_\[^�l?;!
+
+
																																		
+
		
-@<EyoY`ufG;=>>>>>?>>>>====>???><=F]obUW]�Z>9
+
+
																																			

	

<9=kx[_oeD<<>>>?>>>>>>>>>=>>>??>>>=<LjaSKi~K>6


+
																														

+0>9Y~\WldB=>>>>>>??>>>?>>>>>>??>>>>>><Ll^U]zp??)


+																									
+
	<>DzpUghE=?>>>>>>>?>>>?>=>>>>???>>=>??<Sj]W[xV<:
+

																																	
+
+
+


,@<W�_\mN=??>>>>>>>?>>?>>>>>>>>??>>>>>?>AebTQ_rC>&


																																							

+

+		:?=pyWh_?>???>>>>>>>>>>?>>==>>>??>>>>???=XgSPRt^=7
+

																																											
+

+	'@=Hc_tO=?>>??>>>>>????>>==<==>??>>?>>>>=NkUNSgvC>#
																																																	
+

	
+
+8@<]zXngA>>>>>??>>>>????>>>==>>>???>?>>>==AbcPOY�U<4
																																										
+	



+	
+	!@>@mh[pT>??????>>>>>???>>>>>=>>>?????>>>>>=KiXJQsm<=
+
+																																									

			3A>JqX`kF>??????>>>>>???>>===>>>>??????>>>>>>SbMQbzD>*
																																												






+			
+	=@=ZnNk^>>>?>>>?>>>>>??>>====>>>???????>>>>???_\HQzR=6		
+																																					

+			


+


+	
+(A@?mraqI<=>>>>>?>>>>>??>>>>>>>>>??????>>>>>>?=HhQGod==
																																						

						
+
+
+
+
	6A at Fnvk`>>???>>>?>>>>???>>>>>>=>>>??????>>>>>??=XgHiu=?#																																		


+						
+
+
+
+

+>A?PvvrN=????????>>>????>>>>>>=>>>???????>>>>??>@dYl|C at -
																																	

+		
+
+						
+	
+
+
+
$@A>Z�{i@>?????????>?????>>>>>>>>>>?????????>>???=JhrmF at 4																																	
						
+							
+
+
+
+
+AA>a~qP=????????????????>>>>>>>>>>??>??????>>>???>]woU@:
+																									
+				

															
+
+
+3B at AfgcE=????????????????>>>>>==>>>>?>????????????=Ov~eA> 																										
+			


+																
+
+
+:B at CiV]E>???????????>>????>>>>=<>>>??????>>?????@?=Hd}sAB-
																													




+
+																		
>B at FlO^G>??>????????>>>???>>>>>=>>>>?????>??????@?>G^msBA:
																														


+																		
+	%AA?OgMiH>??>??????????????>>>>>==>>>>????????>>???>L`YrDA@ 
+																												

							
+									
+	+BA?\fOlE>?????????????????>>>==>>>>>>???????>>>>??>OgSqH at A)

+
+																										


					
+											
+
+1BA?ed\mA>>>>>???>?????????>>>==>>>>>?????????>>>??=NiQsM at B/

+
+																									
+




+			
+														
+6BA at kdha>??>>>>>>>>???????>>>>>>>>>>>?????????>>>??>JpXuQ?B3

+
+																								
+






+																		
+
9AAArgmN>????>>>>>>???????>>>>>>>>>>>???????????????Cl\vT?B5
+
+																										




																						:A at DwipF?@??????>>????????>>>>>>>>>>>??????????@??@?KqZxW at A5	
+																									
+

+
+
+																					
+	;A at G|kg@@@????????????????>>>>>>>>>>>??????????????>TqZy\@A6	
+																												
+																								
=A at J~pa?@@@@@?????????????>>>>>>>>>>>??????????????>Tr[xa at A7
+
+																																															
+		
>A at O�jd?@@@@@??????????????>>>>>=>>>>???????>??????>Kr[kf at B8
+
+																																																	
+
+
?A at T~bi@@???????????????????>>>>>>>>>???????>>?????>GldqnAA9
+
+																													
+																						
+
+?A?ZqdjA????>?????>?????????>>>>>>>??????>??>>?????>EenxuBA;
+
+																										
+
+
+																						
+
+
+@A?alld@@????????????????????>>>>>???????>>?>>>????=FfintEA;
+
+																									
+																									
+@@@hok\?@@@???>????????????>>>>>>????????>>>>>?????>HibewFA;
	
+																						
+																										
+
+@@AolmT>@@?????>>?????????>>>>>>>??????????>???@@??>Fk_a{G@<
																								
+
+																									
+
+@@BvlkM>@??????>>??????????>>>>>???????????????????>Bd_`|J@=
	
+																						
+																										
+
@?DwiiG????????>????????????>>>>>??????>>???????????@\d\~L?>
																								
+	
+																								
+
@?F{g^A@???????>???>?????????>>>>>?????????????????@?Uj^{L>>
																																																				
+
@?Hyb\@@@?????????>>???????????>>????????????@????@@?Sf]{L>>
																							
+	
+																									
+
>?G}g]?@@@????????>????????>?>>>??????????????@???@@@Zc`K>=

+																						
+
+																									
+=?Ena@@@@???>??@?>???????>>>>>>??????????@@??????@@Ab]_~G?=

+																						
+																										
+:?A}leC?@@?????@??????????>>>>>>>?>>???????@?????@@?GiUc|B?<
																							
+																											8@=ynfM?@@????@???@???@???>>>??>>>??????>?????>?@@@?QjVou>@9
+
+																							
+																									5@:nua`@?@@?????>???????@?????>>>??????>>>????>?@@@@]^Mzh;@4
+																						
+	
+																									
1@:[�_mP>?@?????????>>???????>?>?????>>>???????@@@?IeRZ�U;A,	
+																				
+
+
+																									
,@;H�]]hG>@??@?@??????>???@??>?>????????????@@@@@@@Z`Qt�D=@!																							
+	
+
+																							
$?<=vrOg_A???@@@@?????>>>???????????@??????@@@@@@?LhVW�h=><
																						
+	
+																								
+<=;W�XWjQ>@@@@?????@????>???>??????????>???@@?@?CchNZ�L=?2
+																					
+
+
+																									4><@|sRgjF?@@@??????????>??????????@??>????????@\fRO|m>>?#
																				
+
+
+
+		
+																							

'?=<U�`Yq_B?@@???>???@@??????????>???????@?@@?>Un[Oh�L=?9
																					
+
+	
+
+																							
=>>>q�T\jR>?@@??>????@@???????>>?????@??@@@@>Nl^T^�f=>@)
+
+																	
+
+
+
+
+
+
+
+	
+																						2?=>G�sVdkR??@@??????@@@??????>??@???@@@@@@>HgdY\�}C=@;
																		
+
+
+
+
+
+	
+
+																							

!?>?<T�lW\r\@>@@?@@??@@@@@??@?>??????@@@@@>EehV]w�M=>A&
+
																			
+
+
+
+	
+
+																								
4@>?=_�tY_ocF>@@@@@@@@@@???@@>????@@@A@?>Hfp\^w�P=>@4																			
+
+
+
+
+	
+																							


>@??>`�sY]npTA>@@A@@@@@@?>?@????@@A@@?AQls`\xQ=?A<

+																					
+
+	
+
+																								
)A???>Y�s]_jteNA?@@@@@@@@?@@??@@@@???I`pgY^zzN=?A>!																					
+
+
+
+	
+																							
1A???>Nzyf^bkndPB>?@@@@@@A@@@?@ACIUam�qTcmF=??;#
+																						
+
+	
+																						2A@??>Go�r[XYgun^NFCBA@@A at ADRafmuwm]afs�a@=@=5

+
+																							
+																									.@@???A\|�gV\]ivyvpj_bVKXkhtupmiecgt�qN>?@;<*


																					
+
+																									
+'>A???>Da��rfdfaafhcmx��ue`\ahu��nQ@>?A<2G	
																				
+	
+
+
+																							
+

8AA?@?>Jh���|pddaZVi����nkx��~eK?>?@B;!1,

																		
+
+		
+
+
+	
+
+																						
+
)<BA@@?@FRax����y�������vfTD>>?@BA3

																					
+
+
+
+	
+																							
+
+
);ABAAA@@CIQ\hw��qlhbWIA>>?@ABA9$	


+																					
+
+
+
+
+																								
+
"2=ABBBA?===@DD?>>==>@@>??<3#	


+
+																				
+
+
+
+	
+																						
+	
+
".9=@BAA@@??@@@AAA<0:)
+

+	
+
+																				
+
+
+																											
+
+
+

&/58;<;;;:82)A(	


+																									
+
+
+																									
+
+	
+



		
+



+
+
+																									
+
+
+																												
+			
+


+
+	
+
+
+																										
+
+																															
+	
+			
+







+
+																								
+	
+
+
+
+	
+																														
+
+
+
+
+		
+
+
+
+
+
+
+
+
+		
+
+	
+
+
+
+																									
+
+
+		
+
+																												
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																										
+	
+	
+																								
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+
+																										
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																												
+	
+																								
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+																											
+																								
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+																						
+																						
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																				
+																	
+				
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+							
+									
+											
+								
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+														
+						
+
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+			
+						
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+

+
+
+

+


+


+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	


+






+











+
+

+		
+
+
+
+
+
+
+
+
+
+
+
		

+
+
+

















+		
+
+
+
+
+
+
+
+
+	
+
+

+
+








+




+			
+
+

+	
+
+

+









		
+
+







+ [...]
+											
+					
+						

								
+	
+	


+				
+
+				

			
+					

+											
+

	
+
	
+						


+
+	



									
				
+
+
+
+
+
+
+
+


+												
+
+	


+
+			
+

							


+	
+


	
+
+		

+
+
+		
+



+
+
+	







+

+	
+

+		
	
		
+	
+%.368999961*#
+
+




			
+	

,7=?@??????>??@?=7,
	
+
+		

+	

		

+				

		
2=@?;;<<<>?@@?=<;=>=>=5"

+	

+	



	









+
+	
0>?><;>FUblt{}~|viXI?:9=??6"

	

+


+
		



								
+
+
+
+$:?=:>Mdw|viXPRg|Y\k��|eN?;<>>3
	



				
+													
+
+
+
.>>;?Xy�v]?'

/6
+
.n���aD:<?;'


+
+							

													
+
!C35?<9Nz��D

+	/
e_iSU~�a@:>>=F0
	
											
+





												
+:A><=b�eVD
	
+	
"6mh85Iu}RDO�|O;=?5
	
+
										
+
+




+												
+4>=@m�X
5+8JY`c`ht{qcr�`	#^�];<=%
+

												
+


+
+
+											0==?j~_2PYVTLFB@>=<<>@<:=a|A_�g==;
																															
'><<azUUC?VtbJ?==>=>>>>?==>>=PjdK!&Xn�k>?/																															
+
				
+
+	;=:P}`Pesp`G;=>>>>>>>>>>=>>>><?Tpzphi^d�e><	
	
+																															
	0@;EyjSgr]F;;=>>>>>>>>>>>=>>>>><<>MhsbZW\�Z>7
+																															
+
+
>>@pwVg{X><<>>>>>>>>>>>=>==>?>>>>><>Tl]ULf�K>1	
+																														

+3=<a�[Tug@=>=>>>>>>?>>>=====>>?>>>>>><Nl\RRws@?'

+
+
+	
+														
+																	
+					
	?8E~nSejE=?>>>>>>>>>>>>>>>==>>>>>>>??>=UlYU_�\=:


																														
+
+
+

+3@<]^dmI=??>>>>>???>?>>>>>>>>>?>>>>>??>@ddWT_uG?'
+
+
+																										
+
+
+
+	
+
+
>>?sqZvU=???>>>>>>>>??>>==>>>>>?>>>>>>??=Kk[XQpi?7

+																																			
+	
+
+
.@<K�camB>????>>>=>>>>>>>>>==>>>??>>>>>???@fcXS[}I="
																																								
+		
+

		<?<_x]qW=??????>>=>>??>>>>>====>>?>>>?>>>?=TiTSV{_<2
+																																									
+
+




+		

+
+*A>@nffkD>???????>>>>?>?>>>==>>>>???>?>>=>?>Bd[QUou?<

+																																								




	
+
+9@>IfdtV>????????>>>>???>>===>>>>?????>>=>>?=KcPO\K>-
																																								





	
+#@?=ZcilG>???????>>>=>?>?>>>==>>>>?????>>>>>>?=X]RPr[<;

+																																					


+	


+
+			
2A@?plm\?>>??>>>??>>=>??>>>===>>>>?>???>>>>>??>FjYJcj>@#

+
+																																



+			


+

+		<@?GwnmK=>>>>>>>>?>>>>?>>>>>=>=>>>>????>>>>>???<UdMXxD>/
+																																


						
+
+
+
+

+
%@@?VqkhA>?>>>>>>??>>>>>>>>>>>>=>=>>????>>>>>???>?a[T�M<9
+																														
+


+
+


+							
+
+
+
+

/A@>dxo_>???>>>????>>??>>>>>>>>=>=>>????>>>>>>???=Fde�^>>

																															


			
+											
+
7B@?j~rL=??>>>>>???????>?>>>>>>=>>>>>????>>>>>???>=Xowd@@&																													
+



																
+	
<A at Bmp`?>?>>>>>>>?????????>>>>==>>>>?>?????>>?????=Hy�gAA-

+																										



+																	
+
+	
?A?Gk][>>?>>>>>>>??????>??>>>===>>>>?>????????????>?g�{FA7
																										
+	


+																			
+
+(AA?LeV^>??>>>>>??????????>>>>>>=>>>>??????????????>>Vq�K@?!
+																										
+
+

		
+
+																
+
+
+1BA>U_X`>??>>>>>>??????>?>?>?>>>>>>>>?>????????????>@[c{N at B,
																											
+

+	
+																
+	
8B@?cZ__=??>>>>>???????>?>?>>>>=>>>>>>????????>?????@_PjS?B7																										
+
			
+	
+												
+	
<A at BnXi[=??>>>>>????????>???>>=<>>>>>??>?????>>??????eVdY?A=	
+																									

+
+			
+	
+														
?A at Er\qQ=>?>>>>????????>????>>>>>>>>>???????>>>>>??>>d[cc?A@

+
+																								
+



+																					"@A at IvalC>>>>>>>>?>>???????>>>>>>>>>>>???????>>>>>>>><[dbg?AA"

	
+																							


+																		
+
+
+$AA?NxajA???>>>>>>>>>???????>>>>>>>>>?????????>>?????=Zhfl@@A%

																									



																						
+'BA?Vt^e????>>>>>>>>????????>>>>>>>>>?????????????????k`epA at A&
																										

+																							
+
+)BA?]xnX>@???>???>???????>>>>>>>>>>>>>???????????????@labvC at A&
																										

																								
+
+
+,AA?cupP?@@????????????????>>>>=>>>>>>????????????????djaxF at A&
	
+																																																		
+
+.BA?itnQ?@@@@??????????????>>>>>>>>>>>>??????????????>Sp]yI at A'
																											
+																							
+
+0BA at prlP>??????????????????>>>>>>>>>>???????>>???>???>Emd}N at B)																													
+																							
+
1BABrloJ>?????>?????????????>>>>>>>>??????>?>>>???????@cjyV?B*																																																				
+
+
1BAEoeiC?????>>>????????????>>>>>>>>??????>>>>>>>????>Abgv[?B+	
+																																																	
+
2A at HxncA?@@@???>>?????????>?>>>=>>>>??????>>>>?>?????>Eg`w_?B,
	
+																																																	
+
2A at Lna??@@?????>>>???????>>>>==>>>>???????>>???@????>Ek`ub?B-
+
+
+																					
+																											
1A?P~jV>??????????>???????>>>>>>>>???????????????????>Ci^tf?B-	
+																					
+
+																											
1A?VzfO?????????>>?????????>>>>>>>??????????????>?????Ad_nh>A.																								
+																											
0A>ZwcJ?@????????>?????????>>>>>>>??????????????>??@@@?]hjk?A.																							
+		
+																									
.A=^u_H?@@????????>??????????>>>>>?????????????????@@@>Vdqn>A.																							
+																											
,A=^wdF??@@??>?????????????>>>>=>>????????????@???>@@?@Z]sn>A-
+																						
+																										
*A=]}fE???@??>>>??????????>>>>>=>>??>????????????>?@@?DfYti=A,																							
+																										
'A<X{bK?@@@???????????????>>>>>?>>>>>?????????????@@@>OiPxb<A)																																																		
$@<P]V>@@@???????????????>>??>?>>>>?????>>????>??@@@>]dS�X<A%																																																	
 @=F�`fE?@??????????????????????>>??????>????????@@@?BdWY�K<@																						
+																										
+
?>>|llW>?@?????????>>>>?????>>>>>?????????????@@@@@>QlSi}@=>
																						
+
+																							
+
+
<>:iyYnJ>@@??@?@@?????>?????>>>?????????????@@@@@@@Abd\�j<>:
																						
+																									
+
6>;Q�Wb_@?@????@@?@@@???????????????????????@???@@?LhZh�P<?0																			
+																													

,?<?�nYiO>@???@@?????????????>????????>>????????@?A\^Orx@=?"
																				
+
+
+
+																								

>=;_�WieB????@???????@????????>?>>>??????????????UeVX�V<>:

																				
+
+
+																										8==C�uXmX>?@?@@???????@???????>?>>??????????@@?>SjYTzx@>@,

+																			
+
+
+	
+
+																							-?==X�b^qT??@@@???????@???????>>>??@@?@??@@@@@>KlbWi�Q=>>
																			
+
+
+
+
+
+
+																						

=>>?q�aboU@???????@??@@@?????>>??@@??@@@@@@?>Egh[c�j=>@/

																		
+
+
+
+
+	
+																								3@>=F�xS]mZ@>@@?@@@@@@@@?????>>??????@@@@@@=A_l]a�|C>?<
																			
+
+
+
+	
+
+																						

@??=P�pYaq_D>@@@?@@@@@@???>?>>??????@@@@@>Cak]_{�L=?@'
+
																			
+
+
+
+	
+																								3A>?=W�z]^liL??@@?@@??@@??>??>>??@@@@@@@>Eco_`{|M>?A4																					
+
+	
+
+																						

=@>?=S�vZ[jp[E??@@@@?@@@???@???@@A@@?>?Mfn]a|qF=?@;

+																				
+
+
+	
+																						
%@???=Kx}b[bokXH?>?@@@@@@@?@@@@@@?>>BPesjXg�kD=?A>																						
+
+	
+																						

*A@??>Eo�mYU^bfeSE?>>??@@@@???ADHQ^qvi^_u�bA>?A<!																								
+																							
+@@???A`�~aTYblusfZQIDB@@BILaossuqi]Vs�wP>??=2
+
+															
+						
+	
+																							'>A???>Jj�{dZXYfmv{qjk\\t|wxnfdedksz]B>??;1	
																	
+		
+	
+
+
+				
+																	
+
 :B@????No�~uh_[\a^bdq���z^Z\gu��rVA=?@@6?#	

																					
+	
+	
+																					
+
/?B@?@??Mdw��wpifbs���qn}��ydM?>?@A@,:<
+

+																						
+			
+																				
+
3?BA@???BK]ny������~��}nXJA>>?@AB;!
0
+
																						
+
+
+
+																					
+	

.;ABA@@@??AFP`npbMIHC>>?@AABB=,
+


+
+																				
+
+
+	
+
+																						
+
"1;@ABA@?>====<==>??A?9961%
+	
+


+
+
+																				
+
+																									
+
+
+
+28=@AAAAAAAABA?6$=4
	
+


+
+
+																					
+
+
+
+																								
+
+	
+

%*.0220.+$
-&	



	
+																							
+
+
+	
+																									
+		
+

+
+








+
+






+
+		
+																						
+
+
+																										
+
+
+
+		
+
+


+


+
+
+
+																								
+	
+	
+	
+																										
+
+
+
+
+
+
+	
+










+
+
+
+																										
+
+		
+
+																										
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+
+																													
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+	
+																									
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
+	
+																								
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																															
+	
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																													
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																						
+																							
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+								
+		
+							
+																			
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+				
+
+															
+
+
+						
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+
+		
+	
+				
+
+
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
	
+
+
+




+
+

+



+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+




+

+











+		
+
+
+
+
+
+
+
+
+		
+
+
+














+			
+
+

		
+
+











+		
+







+	 [...]
+											
+

+		

+				
+					
+
+	


+			

					
+
+				

		
+								
+	
				
+		



+

+		
+				
+
+
+
+
+			



								




+		
+

+																					
+

+		
+

					

+

					
+
+
+





+
+


+
+
				
+




+
+






+

+	
+
+
+			
+
"%&%&'%!

	
+

		
+
(29=??@@@@@?><81%
+





+

+	
+#4<???>=<<<<<<<=>?@?<4$	
+
+



+	
+
!5>?><8<@FMSY\[YSI@<<;;??9%
+	
+


+
+


	




+



	/>?=;=IZjuz|}wv��|zlYH=:<??6 

+	


+

+
+
+
+
+
+	
+
+




+	
!9@=:AYvzkXC3)&!,['$B���x^F<<?>0
+
	
			
+
+
+
										
+

	
+	

.>?<?]��f3


+
+	%EBE���nI:=@8"

+
						
+






												
+
>74?>;Isxa_




/:

+2
>!8i�d?;>>:B 
+
+

													




													
	/A>><U�e":
%:H[ujaf~k
(
8xzI;>>'
	
+
														
+
												
+		*<><Y�i4?58?BLQOKDHYaRL`pyW
		a�S;=9	
													
+
+													%==<T�s=	YqXGA>=<<<<=<:;;;DcvG	p�W;?2																											
:=:I}hUTJP\VA<=>>>>>>>>?=>>>=;Gb[2
+\p�X<>%
																	
+					1?;BvqQ^tcN@:<>>>>>>>>>=>>>>>>><=FT`eggVb~P=:
+																																		
+	!>==m{[gpN=<===>>>>>>>>==>>>>>>=>>==C`w^SNg~G>1																														
+
+	5?<^�`VyV=>>>>>>>>>>>>>>>>==>>>>>>?>==WnZRX~s?>%
+
+
+																										
+
+
+"?8F}lWgjA>?>>>>>>>>>>>>>====>>>>>>>>>>=\kSVc�\=:
+
+
+																							
+		
+
+
	6?7]|_csM=>>>>>>>>>>??>>>=====>>>>>>>>>>@fdX_m�I?,
+																																	
+	
+
+
+
+!?>@qm^xX=??>>>>>>???>>>>======>?>=>>>>>?=Kn\]Urn?:
+

+																																
+	4@=K{`kn@????>?>>>>??>>>>>===>>>>>=>>>????>^i]V[M='


																																			
+
+
+
?><\u`sQ=?????>>>=>>>?>=>====>>>?>>>>>????=Jm`WPue<2																																					





+			
.@>@kgoa>>?>>???>>>>>??>=======>>>?>>>??>>?>=_iSSj{A;
+
+																																
+




		
+
+	<?>JpjnF=?>>>?????>>>?>>>====>>>>>????>>>>??=Gi\SZO=,

																																						
+



		
+'A?>YhnU=??>>>????>>>>?>>>>====>>>>???>>>>>>>?=QcQNrb=9
+
+																																		
+

+

	7@?ApujC>?>????????>>>>>>>>=====>>>??>>>>>>>>?>Bf]K`q?@&
+																															
+





+		




+			
?@?Hz�_>??>>?>>>>>?>>>?>>>>>>===>>>>???>>>>>???=RkSStH?6
+																														
+



						
+
+

	-A@>X}�V=??>>>>>>>??>>?>>>>>>====>>>>>??>>>>???>=>``PyV<>
																												








+
+						
+
+
+

+7A@?bsvO>??>>>>>>>?>>>?>?>>>>=>===>>>???>>>??>>>>=EfTne=A'

																											
+


		
+
+
+									
+			

+=A@@p}pH>??>>>>>>???>>>>>>>>>===>===>?>?>>>>>?>>>><Scno at A2
																												
+



+	
+
+															
+

@A?Dq}a???>>>>>>>>???>>??>>?>=>=====>>???>>>?????>>AdviD@:

																										

							
+													
+
%BA>KwxQ=?>>>>>>>>>??>??>>?>>>=>===>>>?>???>???>>>?>=Y}mH@>																											

						
+											
+	
+.B@>QlgO>??>>>>>>>>>??????>?>>=>>==>>>?????????>>>>>=Im}S?A)
+																											

																				
+
+
7B@>Z]fQ>???>>>>>>>???>>?>>>>>=>=>>=>?????????>>>>>>=L_u_?B5
																										

																						
+
=A@@fUgJ>???>>>>>>???>>>?>>>?>>>>>>=>>??>???????>??><Rdh`>A=

+																										

																					!@A?FmZlE>???>>>>>>???????>?>>>>>>>==>??>????????????<R`Z_?AA&
+																									
+
+																						(AA?LoahB????>>>>>>??????>>>>>>==>>>>>??>>???>>??????<QeTh@@A/
																									

																							
+.BA?Rrf[???>??>>>???????>??>>>==>>>>>?>>????>>>>??>>><KjWmC at A5
+
+																							

+																						
2BA?ZugX>???>>>>>>?>????????>?>>>=>??>??????>>>>>>>>>>BfZqF at A8
+
+																							

+																						
5AA>bpgV>???>>>>>>>>???????>?>>>==>?>???????>>>>>>>>?>HnZuI@@:

+
+																							

																					
+	
8AA?jcjQ>???>>>>>>>>??????>>>>>>==>>>>??>????>>>?????>Lr\vM@@;
+																									



+																						
+	
:AAAqlpJ?@????>>>>>???>???>>>>>>>>>>???????????????>?>Hn]xR?@;
+																									


+																								
+
<AACwjoE?@@???????????????>>>>>>>>>>>?????????????????Ci\tX?@;
+
+																								


+																							
+
+
=AAE|mkC?@??@?????????????>>>>>>>>>>>>??????????>>?????^fs^?A<
+
+																								

+																								
+
+
=@AIte???????????????????>>>>>>>>>>>???????>????????@>Pqqh at A=
+																																																				
+
>A at N�vS>????????>??????????>>>>>>>>>>??????>>>>??????@?Flpo@@>
+
+																																																	
+
+>A?TviF?@????>>>>>?????????>>>>>>=>>>??????>>>>>>>?>?@?FjpuA@>
+
+																																																
+
+>@>YrdC?@@????>>>>>>??????>>>>>>>>>>>??????>>??>??????>KjevC@?
+
+
+																																															
+
+
>@?_~jB???@??????>>???????>>>>>>>>>>>>????????????@@??>NibyD@?
+																							
+																									
+
+>@?dx]????????????????????>>>>>>>>>>>?????????????????>Kfa{F@?
																																																		
+=@?jtT?@??????????????????>>>>>>>>>?>??????????????????Gl^yH??
																																																			=@?opV?@@??????????????????>>>>>>>>>????????????>????@?Bg]{K??

+																								
+																									<@?rq\?@@@???>>???????????>>>>==>>??????????????>??@@@@AcbL?>
																																																		:@?svY>???@@??>>?????????>>>>>>>>>?????????????????@@@?Ce^K>=
																						
+																										9@=szU>@??@???>>?????????>>>>>>>>>>>>>???????????>?@@@>NiZ�H?=
																						
+																										7@<nwT>@@?@??>???????????>>>>>>>=>>>>>????????????@@??>[e]|D?<
																																																	5@;hw_A@@@@?????@?????????>?????>>>>>????>>???????@??>AfYe}>?9
+																																																
2A;\�nQ>@@??????@@?????????????>>>?????????>???@?@@@@>IlUpq;@6																						
+
+																								
.A<N�ef???@@????????????????>>>???????????????@@@@@@@?ZmS~_:@0																						
+
+																								
'@=A�ekT>@@@?????@?????????>>>>>???????????@?????@@@?Bh`^�K<@(																						
+																								
+


?=:ptdjC?@??????@???@??????>?>?>?>>?????????????@@@>MkVuz>=?

																					
+																									
+
:>;V�[pO>@?????@??????@??????>?>>>>>???>?????????@??[cS�\<>9
																				
+
+
+																							
+
1?<A�edeA?@?????@??>>?@????????>>>>>???>?@???????>=PgVi�C=?+
																					
+
+	
+																							

#?=<`�^f\A?@@???@????>?????????>>??>?????@??@@?@?=Nk]]�]<>=
																			
+
+
+	
+																								:>=B�vUiY?@@???@??????@@??????>>????@@@?@@?@@@@>IngWw|A=@1

																		
+	
+
+
+
+																							
.?><U�g^oV?@@??????@?@@@??????>>??????@@@@???@>Egm_k�S<>?

																		
+
+
+
+
+	
+																							
>?>>m�\YoX??@@@??@@@@??????>>>>>?????@@@@???>@^n^e�h=>@3

																			
+
+
+	
+																								3@>>B~~P_rYA?@@?@????????????>>>>???@@@@@@?=>Zm[`�wA>?=
																				
+
+
+	
+
+																						


???=J�v[`k^F>?@@@??????@??????>??@@@?@@@@=Abo_b}wE>?@(	
																					
+	
+
+																						0A>?=J||\[lnTA?@@@??????????????@@@@@@@?>Jmq\fmC>?A3
																					
+																								

:@??=Gv�aYisiO@>?@@@??@???????@@@@@?>?EVhi_j�mA=?A:
+
																					
+	
+																						
>@>?>Cj�bOSbnaVI@?@@@????>@@??>>>?DQ`lg[`y�a@=?A<
	
																					
+
+																					

#?@????\�vVG[gqtiTFA?>>?@@?>?FOY^gmuobbr�zO=>@B;
																
+
+
+
+			
+																								

$?A???>Mq�s]TW\hsrkh\PJBCS\_v}zuqgb]h�~bC>?@?3	
+																	
+	
+
+	
+																							
 <A@???@Rt�zf]XQ`gktusgq�|rb^W^dlx�uXD>?@>8%	
																		
+
+	
+
+																								
4AA@??>@Qn��|maZWTYZdx��jVdn|��rVA=?@@;:#
	

+
+																		
+
+
+																									
$9AA@?@>>GZm{��{utz�����{kYI?>??@A4;;

+
+
+																		
+
+
+
+
+																							

'8 at BA@??>?CMVcu����lee^NB>>???AB>)*B


+
+
+																				
+
+	
+																				
+	
+
.:ABA@@?>==>CJKIB=<=>@A@@BA=/%	
+
+																					
+
+																									
+
+

+7>AAA@@?>>>=>??@AA964%
	



+
+
+																					
+
+
+																							
+
+
+
+
'/7<?@@AAA@@=5'8<
		
+

+
+
+																					
+
+	
+																							
+
+
+


 !#"!

			
+






+
+																						
+
+																										
+		
+
+


+














+
+																									
+	
+
+
+																									
+	
+
+
+
+
+		





+																										
+		
+	
+																										
+
+
+
+
+
+	
+
+
+
+






+







+																									
+
+		
+	
+																									
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+
+																											
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
+	
+
+																								
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																																				
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																																	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																																														
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+																	
+														
+
+	
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+		
+																		
+
+
+			
+		
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+						
+		
+				
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+	
+
+
+		
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
	
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+

+
+			





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+		

+




+






+
+




+		
+

+
+
+
+
+
+
+
+	
+















+
+		
+
+
+


+	
+











	
+	
+






	 [...]
+		
+	
+
+				

+
+
+

+
					

	
+
+

+
+
+
+

+				

+


+	
+				

				
+
	



+
+		
+					
+
+
		
+								
+	
+


+
+		
+
					
+	
+
+
+				
+


+	

					
+		




+
+
+

+						
											
+	



+	
+
+						
+	

		

+		


+
+	
+
+









+	
+




+
+	
+

+

	

+				
(17:<<;;:9741+!
+
+


	
-7=????>>>>?>????>:2&





+	
+
+/<?>>;<<<=?ABA?=;<=>?>>:,


+
+	
+		

		%:?>=;;@LYgrwwz~}vhWI@<9<>?:)


+
+
	


	


	
+				0>><:ATktqlb\N=@lr[cy�{lVC;<>?6
+

+		
+
	
+

+

	
+	
+
		
"9@>;Db��Y4$
B
	
SHW��kK:<?>,	
+
	
+	

+


+
			

					
+		
+
+
+
*>?=<Y|�wD
+
+
+	
+%	
Bbg�nH;>?4
+	

+	

																	
+


3>3>><Bgp>+O%
+

3[&F2
%Y~\<<>:=:
+

													
+
		
+												
+
		$?>><G{v/
/2!1JU\bfmwslws:7	4�qA<?9		
+																
+																

+
+

:=<H|:
	6k\JCBBA>=<<CF?=I\o�1		-�{F;>.
																								
+	
+7=;Dw}Y
%E_VC>>>=====>><===<BXg9	C{wE;>'
+																														/?;?rx\cZXVM?:=>>>>>>>>=>==>>>=;DRH,
A^ryE=;
																														
+>=<h�\Wp[D=;<=>>>>>>>>>==>>>>>>>=<@FSghTWss@>4																																					6?;Z�d\rR<=>>>>>>?>>>>>>===>>>>>>>>>>CdmUR[�g=>%

+																																				
+	$>9D|qVob>>>>>>>>>>?>?>>>=>=>>>>>=>>??>?bjX[m�U<8
+
+																											
+
+
+
+
+8>4Y|cfnF=?>>>>>>>>>>>>>>=>=>>>>>=>?>>>>CicYax�G>+
					
+																									
+



+	&@>=moaxZ=>>>>>>>>>>>>>>>===>>>>>>>>>>>>>=Jl]^^}l>;

	
+	
+																											
	
+
+	9?=GxchnB>?>>>>>>>>>?>>>>====>>>?>>>?>>>>><Uj]VZK>+
+
+																															
+
			%@>=Xt`wO=?>???>>??>???>===<==>=>?>>>>?>>>>>BfcZVwe=7

+


+																																
		
+		6?>?iiod>>>>>>???>>>>?>>>=====>>>>?>>>???>>><Rn[UjzA<"	
+

+
+																															
+




		
>?>GoijB>?>>>>>?>>>>>>>>=>=>==>>>??>>>??>>>><AhbX^N=,
+																																		
+




+
+
+
				
+.@?=XmnK=??>>>>>???>>>>>>>>==>>>>>>?????>>?>>>=UlTPsa=8
+

+																													
+


+
+





+	
+
				;@??iq[=??>=>>>????>>>?>>>===>=>>>>???>>>>?>>?>@d^L`n@?&
+
																														





+
+	


+			#A?>JzuK=??>>>>>?????>?>>>>=>==<=>>>>>?>=>>>>>??=MkQSyJ?7
+
+
+																														




				
+



			
2A?>U}zE>??>>>>>>>>??????>>>>>=<===>>??>>>>>>>??>>\dNwY=@#
	
+																											
+

+
+										
+

	<@@?`yvB?@?>>>>>>>>???>??>>>>=>==>==>?>>>>>??>>>>=CdUfj>A/
+
+																										


+		
+												
+
+
+	@@?Blvn@?@??>>>=>>>??>>>>>>>>=>=>>>=>??>>>???>>>??=Pc_uB at 9
+																											

+															
+		
+

+(A@?Ex|`>????>>>>>>>>>>>>>?>>>===>>=>>???>>???>>>>?>@bl{H@?

+			
+																						
+

			
+
+															
+

.B@>KmqN=???>>>>>>>>?>?>>>>>?>>=>>>==>>??>????>>>>??<UwlL?A'

																									

+																		
+
+
+
3B@=SllE>?>>?>>>>>>>????>>??>>>>=>==>>?>??????>>>>??>EpqR?A1
+																								
+
																			
+

+
9A@=[diD???>>>>>>>>>???>>?>>>>>=>>>>>>?>?????>>>>>??>@]te?A:

																								

																					
+


@A?@g^g@????>>>>>>>>?????>?>>>>==>>=>??>?????>>>>>>?>C_bl at A@"
																								

																						
+(B@?Im\^>>?????>>>>>>?????>??>>>=>>>>>>??>?????>?>>>>=BhWgA at A,																									

																					
+
0A@>QiaR>>>????>>>>>?>?>>?>>>>>>=>>>>>??>???????>?>?>=BlTgC at A6	
+																																												
+
6A@>Yh`H??>>???>>>>??????>>>>>>=>>>>>>???>??????>>>>>=@iZgH?A<																										
																					
+	
+
:A@?amhE???>>??>>>???????>>>>>>==>>>>>>????>>>>>>>>>>?>Y[jO>@?

+
+
+																						
+
+																						
+	
=A@?llhE@???>>?>>?????>???>>>>>>>>>?>??>???>>>>>>>>>??>[cmT>@A!


																							

+																					
+		

?A at AsolC????>>>>>?>>??????>???>>>>>?>>>????>>>>>>>>>??>]djV?@A%


+
+																						

																						
+
+
 @@@EubkB??????>>>>>>????>???>>>>>>>???>?>???>>>>>>>>??>Yhl\?@A'
	
+																							


+																						
+
+
+
$AA at I{hlA?@?????>>>>?????????>>>>>>>???????????>???>>>?>Qkjc?@A(
																									

+																								
+
+
&BA?M}cg?@?????????????????>>>>>>>>??>????????????>>??>>Jjgk@@A)																									

+																						
+	
+
+'A@?R{p^>????????????????>??>>>>>>>?>>>??????????>>?????CjlrB at A)
+																																																		
+
+)A@?Z�uM>???????????????????>>>>>>>>>>??????????????????@lkwF at A)	
+																																																	
+
++A@>a�k@@??>?????????????>??>>>>>>>>>>??????>>?>??????@@?cq{I at B*
																																																		
+
+,A@?g|Y>@??>>>??>>??????????>>>>>>>>>>>?????>>>>>>>>???@?am}M?B+
																																																		
+
++B??ilO>@@????>>>>>>???????>>>>>>>>>>>>????????>>??????@@heyQ?B-
																							
+																									
+
)B??qtK>????????>>>>??????>>>>>>>>>>>>>????????????@@??@@fbyT?B.																																																	
+
+)B?BtiG???????????????????>>>>?>>>>>>>>?????????????????>_cxX?A.																																																	
+
'B at DwkE?@??????????????????>>>>>>>>=>>???????????>?????@>\ew\>A.																							
+																									
+
&B?E}qF?@@????>>???????????>>>>>>>>>>?????????>>>>????@@?Rgta>A-																																																		
+$A>F|mH>?@@@???>>?????????>>>>>>>>>>?????????????????@@@?Pjyb>A-																																															
+
+
+#A>E�tG>????@@??>>????????>>>>>>>>>>?????????????>??@@@@?Yetb=A+																						
+																									
+!A>D�tG?????????>>????????>>>>>>>=>>>>>??????????>??@@@@@e\wa=A(																						
+																									
+
@?A~nJ?@@??@?>>??????????>?>>>>>=>>>>>???????>>>>?@????DlYvZ<A%																																																
+??>xpW>@@@@??>??????????????>??>>>>>>>??????>???@@@???>GiZ|Q<@!
																																																=?<osiB@@@@@???>??????????????>>?>>????????????@@@?@??>RjZ�H=@

																																															:?;bylQ>@?@@??>???????????>?>>>>???????????????????????_eg}?>>
																					
+																									6?;Q�g`@@@?????>??????????>>>>>>?>>??????????????????>FfZxk;>9
+																					
+																									
.@<B�ekH?@?????????????????>>>>?>>>>>????????????????>VgZ�R;?1																					
+																									
"?=<qqfX=@????>??@@?>>?????>>>>?>>?>>>????@????????@?AbWg}@=?%
																		
+		
+																								
+<=;V�_mI?@@??????@?>>??????>?>?>>??>>????@?????????>PcW�`<>;
																					
+																									3>=A�qdaB?@@@????@????????>>>>??>?????@??@?@@@@??>=L`Wm�C=?-
+
+																			
+
+	
+																							
%?><\�^i^@?@@???????????@?>>>>??>?????@@@@???@@@?=Ii\\�\<>>
+																				
+
+
+
+																							;?>@||^pZ?@@@??????@@@?@???????>>?????@?@????@@>CdkW}y@>?3
+
																		
+
+
+
+	
+																						.@><O�o[nZ??@@?@???@@@??@???????>?>?????@????@?Bak]o�L=>?
																			
+
+
+	
+																							
>?>=d�`WpW??@@@??@??????@??????>>???@???????>Gjk]h�Y=>@1

																			
+
+
+	
+
+																						2@>>?s�QYo\B>@@@@@@??????@????????@@@????@@>Fjm]h�f>??<
+																					
+	
+																						


>??>Cw�UVofL??@@@@@@@??????@????@@@?@@@@?>Jmj]n�d@??@%	
																					
+	
+																							
,A??>Cv�ZTiq`I??@@@@@@????@????@@@@@@@?>APmh]q�\=??A0

																					
+	
+																						
6A??>Bk�aJXgnbLA>?@@@@@????@?@@@@@???DSdiebu�Y=??A5

+																	
+			
+																							:A???>W�zYMQitl\I????@@@??@????CGMVdqodan�rK=?@A7	
														
+
+
+		
+	
+																							
+

;A???=Iu�oUM]hswhUKHC@?@@@CHWgsxxuqa\p^A=?AB6																	
+
+	
+	
+
+
+			
+																		


:B??@?@Vw�u^UXdfknqnaWIQny}ulgddik~|aG>?@B@/	
+																	
+		
+
+	
+
+			
+																

3A@??@>ASq��rgXSSTX^io}���fUWgq|�z\C>?@@@7#
+
+
+																	
+
+
+
+	
+				
+
+																	

&<A@@@?>?Kb{��{pg^\g|���znr}�{iSC>?@@>:)


+
+
+																
+	
+
+
+
+			
+																		
+

,=BA@@?>>AL[hnw���������q\LB>>??@@8:1


+
+
+
+
+														
+
+
+	
+	
+		
+																		
+	
+
)8 at BA@@@?>>>@HUeigd]SG?>>?@@AB>-8F

+


+
+
+
+																		
+
+		
+
+
+
+																		
+
+

+7>AAA@@??=<<>=<<=>?@A<<<8,)?
	

+
+
+	
+																	
+
+	
+
+																					
+	
+
+
$/6<?AA@@@@@@@@AA=+4?
"

+
+
+																					
+
+
+																						
+
+
+
+

$-489:;;;81$
!,


+	


+
+																							
+
+
+
+
+																						
+
+		

	

			

	
+
+
+
+


+
+
+																					
+
+
+
+																												
+		
+
+



+





+

+
+																							
+		
+
+																												
+
+
+
+
+
+		










+																								
+		
+																										
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+











+
+
+																							
+																												
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+



+
+
+	
+																							
+	
+																										
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																											
+																										
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+	
+																		
+				
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																																		
+							
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																			
+							
+
+
+
+
+
+
+						
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+							
+														
+
+
+		

+			
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+
+
+															
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+						
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+

+
+
+
+
+
+
+
+
+
+
+			
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+
+			
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			




+			

+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+

+
+
+
+
+
+
+
+
+
+
+	
+




+	
+


+
+
+
+
+
+
+
+

+		
+

+
+
+
+
+
+

+		

+
+









+
+
+
+		
+
+



+		






+




+	
+
+	






		 [...]
								
+

			


+						

				
+		
+	
+
+
+
+	
+				
	
+		
+
		
+				
+		
+
+		
+
	
+

+
+
+
+	
+

				
			



+			
+

		
+	
+				
+
+

+		
+


+				
+		
		
+								
+




+
+	

			
		

						


+

+			
+
+


+
+
+	
+




	
+



+		








+	
	
+


+
+		
$+032220-*($


+
+

			
+ ,6<?????@?????>=:4)
+
+




+
+%6>?>===<;;<<;;<<=>???=4 	
+


	

4>?><;7=CKSWY]\UME?<<<;=?>3

	
+


+	
+	
+*<?=<;AP`lsyvi\d���yk]M?;<=>=/
+	
+

	

+



	5?><;He~�iL:/'
Ea7CbXctwbJ;:>?8		
	
	
	

+

+


+		

+

						!;?=;Df~kd7



+	0!	%
N�|oL:<?=(

+

	
+	
+						
+
+


+
+
				
+

$<?>;QvgH)7	
+		/.!QxhA;>>,
	

	
+
+	
+
+	
+					
+	
+	
+
+	
+
+!?2;>==_{J0=)46BmY67gB

`}O:=>:@(	

		

+									
+			
+														
+

=@<<>g�W	+XC;?HPQTSUQikYYdVCQ
+
_�\<>>+
+
	
+
+																										
+

+
3><>i�a 	
 PrZF@>=;;<;<<<<;=G[vZ
+}�c<=<#
+
	
+																											
+	
*><<d�tB%3NZR@:=>>>=>>=>>=>>>><?UQ(Av�c<=;

+
+
+																						

=>:^�d\mcSG=;<=>>>=>>>==>>>>>>>=<AG:)
Cfd�a<>5		
+
+																														
3?;R�jXjgD===>>>>>>=>>===>>>>>>>>>>>?Glu`Xe�W;?$

+
+																																		
+#?=@tqRae@>>>>>=>>?>>>>>==>=>>>>>>>>??>HlbTTi�M<7																																								8<6Sva^qF=?>>>>=>>>>?>>>>===>>>>>>>>???<HmdXZyzD>&
	
+				
+																											
+
+
+		
+&@<:ck`rW=???>>>>>>>>?>>>==>=>>>>>=>???>><Klf^e�e=9	
+		
+

+																								

+		9?=CsfilA>?>??>>>>=>?>>>>>===>>??>>>>>?>>><Pka_j{E>,
+
+																																		
+			
'@><Rx`rR=????>>>>>>??>>>>>===>>>?>>>?>>>>>>>[hUP{[<9
																																	
+			9??=clkd=>?>>??>>?>??>>>>>=====>>>>>>?>>>>>>>Fd^Wor?>)
+
+																																
+

+	
+
+
+
	!?>?DldtH=>>>>>>???>>>>>=====>>===>>>????>>>>>=Ui^bzJ=3
+

+
+
+																														




+




+
2@?>OkpT<?>>>>>>?>>?>>>>=>>>>>=>>>>>?>??>>>>>>=GhcZvY=<
+
+
+																															
+





+				

			=??>`n_=??>>>>>>??>?>>>>>>>>>>>>>>>??>??>>>>>?>>]jZeh?@(


+																														
+

+					
+

+
+			(A??DpnE>??>>>>>>?>??>>>>>>>>=>>>>>>>>???>>>>>?>=Hi^XnE?8

+	
+																								
+	
+




			



			
+	7@?>U{g????>>>>>>????>??>>>>>>====>>>???>>>>>???>=UiMrV=@$

+

+																							
+
+
+




+						




		????b�h????>>>>>>>>?>??>>>>>>>====>>>>>>>>>??>>>>>@a^qf=A4

+
+																							





										
+		
+

		'A@?Bfyg=???>>>>>=>>>>?>>>>>>>====>>>>?>>>>>?>>>>>?=KfnvB@=
+																								
+


+
+
+
+
+													
+

+	
2A@?Dr}^=?????>>>>>>??>>>>>>>>==>>>>>>???>??>>>>>????brsI?A%
																							

																
+



+
+9A@>J}O>?????>>>>>>???>>>>>>==>>>>>>>>?????>>>>>???=QxxT?B0
																									
																
+
+



+=A@>RohB>?????>>>>>>?>?>>>>>>>===>>>>>>?>???>>>>>>??=Dt{\?A9																									
+																	
+




+?A?>[h^??>>>>>>?>>>>>???>>>>>>>=>>>>>>>?>???>>>>>???>>dxbAA>
+																								

+																			
+



!A@?@eba>??>>>>>>>>>>??>??>>>>=>==>>>>>?>????>>>>>>???>UsnB at A*
																								
																				
+

-B@?GjbW=????>>>>>>>>?>?>>>?>>====>>>>>??????>>>>>>>??>X^sD?A3	
+																						
																						

6A@>SkeI>>>>????>>>>>>??>??>>>>>=>?>>>??>>???>?>>>>>>>=^[gF?A:
+																								
+																							

;A@>[j^?@?>>>????>>>?>?????>>>>==>>?>>?>????????>>>>>><^egK>A?


+
+																																															
+
?@@?dgY>@?>>>???>???>????>?>>>>==>>????>??????>>>>>>>>=OcbS>@A'

+
+																																														
+		
"@@?Amh[>@?>>>>??????>????>>>?>>>=>>?>>>????>>>>>>>>>>?>Ifc[>@A.
																								
																								
+
+
'A@?Dvh\>@???>>>???????????>??>>==>>>>>>>???>>>>>>?>????Hhc_>@A3
+
+																						


+																								
+
,B@?Iwf`>@???>>>>>>>??????>>???>>>>>??>>>???>>>>>>>?????Ecbd?@@6
+
+																						

+																						
+	
+/AA?Pxfa?@?????>>>>>???????????>>>>>??>>??????>?>>>>>???Acej@@@8
+
+																							

																							
+	
2AA>Vxia>@???????>>????????????>>>>??>??????????>>>>>>?@?bjnC@@9
+
+																							
+																										
3A@>]wo[>??????????????????????>>>>??>??????????>>>>>???>YhtF@@9
+	
+																																																	
5AA>cuxO>???>???????????????>>?>>>>?>???>???????>>??????>XluL@@:
+
+
+																																																
+
7AA>jwpC???>>???????????????>>?>>>>?>>??????????????@??@>VjwS at A:
+
+																																																	
+
8A@@px^>@???>>???????????>??>>>>>>>?>>??>?????????????@@?Ss~Y?A:
+
+																																															
+
+
9@@BtrJ?@??>>>>>????????????>>>>>>>>>>????????>>>>????@@?Ms~_?A;	
+																																														
+
+
9A at EufC?@@??>>>>>>>?????????>>>>>>>>>>????????????????@@>Snxc?A<
+																						
+																									
+
8A at FnA????????>>>>????????>>??>>>>>>>????????????????@@>Qmti?@=
+																						
+																								
+
+
8A?J�j@@??????????????????>>>?>>>>>>>>>?????????????????>Jjoo?@=
+																																																
+
7A?N�h@@@@????????????????>>>>>>>>>=>>?????????>>>>??>???Glrr@@=
+																																																	
6A>P�g???@@????>??????????>>>>>>>>>>>>????????>>??????@@@Bjor@@=
+																																																	
4A>R�b??????????>>???????>>>>>>>>>>>>?????????>?>?????@@@Aclt@@<
+																																														
+	
3A>Q�c???????@???>>??????>>>>>>>>>>>>>???????????>??@@@@@Dflx@@;
+																																															
1A=N~b@@????????>>>??????>>??>>>>>>>>>>>????????????@@@?>Lkmx?@:
+																					
+																									
-A=I�fC@@???@??>>???????????>>>>>>>>>>>>?????>>>>??@@???>Rkkq=@7
+																					
+																									
(A=D�qN?@@?@@??>??????????????>>>>>>>>>???????????@@????>Sgkj;@3
+																																														
"A>?zp[>@?@@????>>>?????????>>>>>>>>>>>????????@????????>[g|_:@-																																														
+
@><oskA@@@@??@?>>>????????>>>>>>>>>????????????????????Abe�O;@&
																					
+																								
+>>;bxgF?@???????>????????>>>>>>?>>>??????????????????@>Lee�B<@

																																															:><QkY>@??????????@?????>>>>>>?>>>>>>??????????????@@@aatq;=<

																				
+	
+																							0?=C�gnF?@???????????>????>>>>>>>>>>>>????@????????@@?HaY�U;>6
+																				
+
+																							
#@=<ntkZ>@@@?????????>????>>>>>>?????>??@@@@@@@???????\^i�@=?*
																
+				
+																								
+=><P�`jG?@@@@??>???>?????>>>>>??>?????@@@??@@@???>?>Qg]�]<><

																				
+	
+																							4?>>|scgC?@@@@???@???@?@?>>>?????>>????@????@@???>>JkYuA=?/

+																		
+
+
+																								
$?><U�dmfB?@@@??@????@@??????????>>>>??@?????@@@?=Dfdc�T<>>																			
+	
+
+
+																						
+;?>=t�[od@?@@@@@???@@???@???????>?>??@???????@@>Iml_�n>>?2


																		
+
+
+	
+
+																						-@==H�mQq]??@@@???@@@?????????????>?@@???????@>Noh[u}D=>>
																					
+
+	
+																						
>?><W�`WpW@?@@?@@@@@@@????????????@@@@??@?@?=LmcZs�M=>@0

																				
+	
+																						0@>>=c�iZl]C??@@@@@@@@???????????@@@@@@@@@@>Lnd[p�X=?@:
+																					
+	
+																					
<?>?>g�m\ohSC??@@@@@@@???>?????@@@@@@@@@??Rnd^u~T>???!	
																				
+	
+																							&@?>>>c�u^hrjXF?>?@@@@@??>?@???@@@@@@?>@K_n`_yxJ=??@*


																		
+		
+																						
0A???>Y��fXcoo`NB??@@@@@@?@@@@@?>>@AGVfoicm�mE=??A.
+
+									
+										
+																								5A???>Fm�t^Zcosl[H@?>?@A@@?>?AFQ\hptoien�~V>>@@A/
+
																		
+
+
+
+																							6A?>?>?Ux�qc]_dqtf_\PEB at ANXbpy|wpjdQj��fG>?@A at -
+
																				
+
+	
+		
+		
+																

0 at A??@>AXv�{pbVXbkjlh\Yj~��yh[]agr~eI>??AB=&
+

+																				
+	
+	
+
+	
+
+																	
&<B@?@@>@Qk�~ndj\Xclr~�pc\^k{��t]G??@@B at 2



+
+																
+	
+
+
+
+		
+
+																		

/?BA@@?>>ETiy~{~����xw~�|n]K@>??@@>3!
+


+
+
+
+																		
+	
+		
+
+	
+																
+0=BB@@????BFKVex��{s�~nTB>=>???@;8(



+
+
+
+																	
+
+		
+
+	
+
+		
+														
+
+

%5?BBA@@??>>?DOOE?AA=<>?@?@@9/>4



+
+
+
+
+																
+
+
+
+
+
+			
+																	
+
+
+
%1;@AAA@??>==>>>>?@A<58) !ED
+



+
+
+
+
+														
+
+		
+
+		
+
+																			
+
+
+
+
"*3:>AAAAAAAA@;,)>>8	



+
+
+
+
+																
+
+
+
+
+
+
+
+																					
+
+
+
+
+
 %(*,-+&

+
%$&

+	



+
+
+																					
+
+
+
+																							
+
+
+	
+
+








+
+	
. 
	
+
+
+
+
+																						
+
+		
+
+
+																									
+
+
+
+
+
+
+


+



+
+
+
+
+

+																							
+		
+
+
+
+
+																						
+	
+
+
+
+
+
+	
+
+











+
+																						
+		
+																										
+
+
+
+
+
+
+	
+
+
+
+
+
+












+																						
+
+			
+																								
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+



+
+
+
+																																																		
+		
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+				
+																																														
+		
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																											
+
+						
+					
+	
+
+
+
+
+
+
+		

+
+
+
+
+
+
+
+
+
+	
+
+
+	
+	
+			
+																					
+

+
+
+	
+					
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+					
+																	
+					
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+					
+	
+
+								

+
+
+	
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+






+
+
+
+		
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+


+


+
+
						
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+								
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+

+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+				
+
+
+
+

+
+
+
+		
+
+
+
+
+
+

+
+
	
+
+
+
+
+
+





+			
+		
+
+



		
+
+
+
+
+
+
+



+
		
+



+
+
+					 [...]
+	
+
+											
+
		
+
								
+	
+

												
+							
+
+	
+
+				
+					
	
+
+
+
+
+	
+	
+				
+	


+


+
+

		
						
+				
+



+			
+

+	
+			
+		
+
+		
+



+
+
+

			


													





					
+
+
+		

	
+

+		
+
+	














		
+






!$#"" 

+

+		
+	


		
+
+
+
+	

*4:=?????>==<960(





	
	
,8=>?>>==>=====>=>?>=6(
	



+

	
.;?>=;9;<>@CDDA>;;;<===??9(	

	%9?><;<AIV_ec[WfzvqdYPHB;:<>?7!
	



					/>>=;@Rj|zgQA4'
&Slr�zhee]I=9=?>/	

+
	
+


				
+	6?=;=RlriV5



	.=--
1`}fR=;>@8
			



	
	8?>;DhrO%

+	
+
+
+	'

!
+H?jsN;=?; 
+		
+	
+

+
		

+8>=;N{`'

+
+	3*"
Hzb=<?<!"
+

	
+	
+
+
+


+	


+		
+
+	737=<;V�m!	
+&&%4=CKGKcvPJg@

	,�tC;=<==	
+				
+
+
+
+
+		



	
+
+	



+			
+

	6C=;:X�q3(cmVNJHFDDE at T_KELVYd(	
+N�~H;>; 
+
+
+		
+																								
+

+
+#==:X�v9$=`aH>=======><:==<=G\f;*]|�N;=8
+
	
+																								
+
				9>:R�xY;=NTMA9;=>>>>>>>===>>>>=;BPG.
+<|�L:>4	
																						
+
+

/?<J�r\esWC><====>>>>>>====>>>>>>==@FSV)$\w}H;>&	
						
+																		
+	


>=>pxY`sN=>>>>>>>>>>>>>==>=>>>>>>>>>>?^_@\^zwC=8

	
+																																		
+5?;Lr^UqU<>?>>>>>>>>>>>>>=>==>>>>>>>>>=<Ws`T[�t@>!

	
+																									
+									
+#@97YhShe>>>?>>>>>>?>>>>>====>>>>>>>>?>>=;Pl`Mb�[=5
+
+					
																										
	
+
+
+	
+			8?<?he^nF>?>?>==>=>>>>>>=======>>>>>>?>>>=<Oo\XruA?'
				
+
																											
+				&@>=IsaqS<>???>>>>>>>??>>>>====>>?>>??>>>>>>=YmWX{R=9
																																					

	
+9?><[mbc>>?>???>>>>>>>>>>>>===>>>?>>??>>>>>>>@daLnd=>+
+																								
									
+


+#?>??hejF<>>>>?????>>>>>>>======>>>>>??>>>>>>?=HeXarC>8
																												
+

+
+		
5??>Hhfa=>>>>>>>??>>>>>>===>======>>?>>>>>>>?>>=Wl_uP=>$
+																													
+





+
+
+

+
+	>??=UfnF=>>>>>=>??>>>>>>=>>>==>=>>>>>>?>>>=>>>>=Gibm`=@0
																										
+






+			
+



+
+*@??@eqQ<???>?>>>>>>?>>>>>>>>>==>>>>?>>?>>=>>>>>>?`ibjB?;
+																							
+
+
+





+			


+		9@?>Mse>????>>>>>>>??>>>>>>>>====>>>?>>?>>=>>>>>><Kl^mM>A)
+																										





+				
+




		
@??>[�[=???>>>>>>????>?>>>>>>>===>>>>>>??>>>>>>>>>>__h_=A7
																								





+	
+							


+			+@???j�[=???>>>>>>>????>>>>>>>>===>>>?>>?>????>>>>?=Iffl@??!																									
+



											
+
+


	7@??Bp�Z=>????>>>>>??>?>>>>>>>===>>=>?>>?>>?>>>>>>??>^p{J?A,
																								



+	
+

+													



	
+=@@>HswQ=??????>>>>>>?>?>>>>>>==>>=>>>???>?>>>>>>???>M�xR?A6																								
																			



	
+@@@>O~qE>???????>>>>>>?>>>>>>>===>>>>>>>???>>>>>>????Buv\?@>
																									
																		
+



+	&A@@=Yrb???>>>???>>>>>?>>>>>>>====>>>>?>>????>>>>>??>?=f~dA at A&																										
																	
+




	,B@??agZ>??>>>>????????>>?>?>==>==>>>>>>>>???>>>>?????=U�sC?A0																									
+
																						
+



3A@?DhlV=???>>>>>>>????>>??>?>>=>>>??>>>?>?>?>>>>?????>KqxE?A9
																								

																							


:A?>OnlI>?>??>>>>>>>>???>?>>>>>==>>>>>?>>??>?>>>>>>???>N_kH?A>
+																							

+																								
+
>@@>Zk]???>>???>?>?>>>>>?>???>>===>>?>?>>?????>>>>>>>?=PheM>@A%

+
+																						
																										
"@@?>brU>@?>>>???????>>???>?>>>>===>>?>?>????????>>>???=Fg_T>@A,
	
+																						
																							
+		
)A@?AmmP>@?>>>??????????>?>>>>>>==>>>?>???????>>>>>>>???CbZ\>@A4	
+																						
+																							
+	
+
/A@?FrfN?@?>>>????????????>>??>>=>>>>????????>>>>>>>>>??Af_c??A:																																																		
+4A@?LvoT>@@?>>>>>>?????>??>???>>>=>>>?>?>????>>>>>>>?????\ei@?@=
+
+																																															
+	
8A@>TuhY>@?@?>>>>>>??????>??>>>>==>>???>>>???>>?????????>UjoB?@?

+																						
+																							
+
+
+
:A@>\rk[>?@@????>>>??????>????>>>==>>????>??????>>?????@>PetF@??


+																							
+																							
+
+	
;A@>cnoV>????????????????>>???>>>=>>>?>?????????>>>>>??@?MdqL??@


	
+																																															
+	
=@@>kmtM>??????????????????????>>>>??>??>???????>>>>>??@?KlrS?@@

	
+																																																	
>@@@qqsD??>>>??????????????????>>>>>????>???????>>?????@?Kqq[?@@ 
																																																		
+
?@@Buog?@???>>>>?????????>?????>>>>???????????????????@@?Flqa?@A!
																																																	
+
+
?@@FvkX>@@???>>>>??????????????>>>>????????????????????@?Cisi?@A"

+																																															
+
+@@?JykG?@@????>>>???????????>?>>>>>??????????????????????Afsn at AA"
																																															
+
+

@@?Nd@@@@@???>>>>????????????>>>>>??????????????????????@epqA at B"
																						
+																								
+
+

@@?R�c?@@?@????????????????>??>>>>>?>>???????????????????@fovB at B#
																																															
+

@@>W�`>@@@?????????????????>??>>>>>>>>?????????>>?????????\p{D at B#
	
+																																														
+
@@>Z�\>@?@@???????????????>>??>>>>>>>>????????>>>>???>??@>Xr}G?A#
																																															
+
+
??>]�X>@??????????????????>>?>>>>>>>>>????????>????>>??@@?RmyH?A"
																																															
+
+>@=`�S>???????????????????>>>>?>>>>>>>>???????????????@@@?OjyI?A"
																																														
+	=?=^~R>@??????@???????????>??>>>>>>>>>>>????????>???@???@?Sh}J>A"
																					
+																							
+	<@=ZY>@@????????>??????????>>>>>>>>>>>>>????????????????>\l�G>@ 
																																															9@=T�c@@@????@??>>>?????????>>>>>>>>>>>>??????????????????bl|D??
																																															5A=M�mE?@@@@@????>>>???????>>>>>>>>>>>>>?????????????????@^iy??<
																																														/A>FtM?@@@@??????>>??????>>>>>>>=>>>>>??????????>???????Agxs<?8

+																																													
*A>@wrT>@@???????????????>>>>>>>>>>>>>????????????>????@?Hh�f:@3

+																																											
+
$@><ot]?@????????>????????>>??>>>=>>??????????????????@@>[g�S;@.

+																				
+																								

?>;a{qJ?????????>>???????>????>>=>>>>>>?????????????@@?Jlj�C<@%
																																													
+;><N�p^>@???????>>???????>>??>>?>>>>>>>?????????????@@?\\vp<>=

																				
+
+																							1?=A|jiD?@@@@@???>??>????>>?>>>????????????@????????@?KjW�S;>7
+																				
+																								
%@><fug\>@@@@@@???????????>>>?>?>????????????????????Ab_j{?=?*

																						
+
+	
+																			
+>>=J�_nM>@@?@@@??@????@??????>???????????>??@?????@>Qi]�U<><
+
																				
+
+
+																					4?><r{bjH?@?@@@@@????@???@???>????>>>?@??>??@????>?Mk^|u>>?0

																		
+
+
+	
+																					
#@>=K�d^lE????@?????@@????????????????@??????@@??=Orae�K=>=


																		
+
+
+	
+																							;>><d�TkiA?@?@????@?@@?????>????????@@????????@>Qne_�_<>@1


																			
+
+	
+
+																				,@==@}�Zp_@?@???@@???@@????>?>??@??@@@@?@@@???=Tpb_�s?>>>
																				
+	
+																						
+=?>=J�|`n\A?@@@@????@@????>>?????@???@@@@@@?>Vq`[|F=?@+
+

																				
+																							,A>><R�y`p^E??@@@????@@@??>?????????@@@?@@?@\r`d�J=?@8	
																						
+				
+																	
9@>>=U�|ckdXI@??@@@@@@@@???@???@???@@@@>>Hep[c�rG>?@=


																		
+	
+			
+																			????<R��kdmqeVG??@@@@@@@??@?@@@@@??>>AM_lk^q�`@>?@?#
+

																				
+																								
*A???=Kr�xcegnqaLA????@@@@@@???>?BJS]mtlchzwN=??@?%

																			
+
+
+
+				
+
+																
0A@??>@Vz�ub[cmpj_RIC?@AB@?ACJR`nwveY^k~�aB>??A?$


+																				
+	
+			
+
+																	- at A???>CZx�qjccginzrbLFFPent|vbVWYUd|�lK>@@@B;
+

																			
+
+	
+	
+	
+																		
+%<B@?@@>BUr��vk_Wqyvf`ei~�m[VY[ix{gM??@@AA3	


+
+																	
+
+
+
+																					
+
2?A@??@>@J]s��~x~vrigx�xhds��}iSD>>?@BB;&
+
+
+
+
+															
+
+	
+	
+
+	
+
+																	
+4 at BA@???>@HU]bl~�������y^MC>>??@AA:+
+

+
+
+																		
+
+		
+
+		
+
+															
+	

.;ABA@@@?>>>?HbunYRX^QA==??@@@=4$

+
+
+
+	
+																	
+	
+	
+		
+
+
+																	
+
!0;ABAA@??>>=?=;;;<<>?@;9841+

+


+
+
+
+
+															
+
+	
+
+
+
+
+
+																			
+
+
+
*39=@AA@@@?@@??@A;'.:(7 




+
+
+
+
+																	
+
+
+
+
+
+																			
+
+
+
+
+

(07;=>@@>:2$)A?D#






+
+
+
+
+
+																	
+	
+
+	
+																			
+
+
+
+
+
+
+


'LJJ7	
+

+
+
+
+
+
+
+
+
+
+														
+	
+		
+
+
+
+																					
+
+
+
+	
+
+





+
/7!	
+
+
+
+
+		
+																			
+
+		
+
+
+
+																								
+
+
+
+
+
+
+
+
+
+		
+
+
+
+																							
+			
+																								
+
+
+
+
+
+
+
+
+		
+
+
+






+
+
+


+
+																						
+
+	
+
+																									
+
+
+
+
+
+
+		
+
+
+
+













+
+																						
+	
+
+		
+																			
+
+
+
+
+
+
+
+		
+
+
+
+


+
+
+
+
+

+
+
+
+
+																								
+
+																
+	
+
+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+			
+	
+
+																								
+														
+
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+																						
+	
+
+						
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+		
+																			
+				
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+	
+
+															
+
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+					
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+					
+





+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+

+







+


+				

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
			
+	
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+

+

		


	
+	
+
+
+
+

+
+

+
+	
+
+




+
+
+
+

+	
+
+
+



+	
+


+
+		
+



+

+


+
+
+



		
+
+
+


+
+

		
+
+
												
+	
+				
+																
+

+	

+						
+
+
+
+
+			
+			
							
+		

+
+				
+	


+			
+			

		
+
+
+
+
+
						
+
+
+	


+


+
+


+
	
+			
+	
	
+
+



+		



+	
+
+				
+				
+							
+
+
+
+
+
+	
+

+
+
+									
+
		

+	
+
+
+










			
+







		
+
+			
+




&/589987642/.+#

+
+	
+
+
+	
+
+			
".8=??>>???>>>????><6*		
+

+
+	

	
+%6=?>=;<<<=>>=;;;<<===??<1

+
+
+
+
	

4>?=;;;<FMQPNOX^ULEA@?><<>?=0
+		&;?=<<CRdi^TG7,&5o����lVNI<;<>?:&		



						,>><;EVa_bF&
+	,Z9ZU+"+WhLB;<>>0		
+

+
		
+				
	1>=;>YhH+
					 &%J5\Z?:=?6	
	
+
+
+
	
+
+	2><;Bdd4
+	

		 "czO;=@7
+		
+
+
+
+0=;:Fvf"
+
+	
81
f�^==?6#	

	
+

+
+

+	
+		
+	%12=99I|s2
&,:RTPMGJUp]QcG,

+%o�g><=<G+	
	






	
+






	

+
+	
-F?<9H}t9	/UcSGC@>===;HRE at ENYiA;O�k@;>6
			
+										


+
+		
+
+
+
+
+
+
+
+		
+5>;E||B'@OWL><====>>>>=;===<>F\a<

$?�nA:=.
	
+	
																		
+
+

			
'><?u�\68ORJA;;=>>>>>>>====>>>>><<CSa^)
Z�m=:>#
																				
+
+
+
+	

+;><d�oV]`E===>==>>>>>>>=====>>>>>>>=AX\4p�g<=8	
								
+											
+
+
+	


0?<Gshdog@=>>>>>>>>>>>>>=======?>>>>>=;JY-D]j�a<?%	

+													
+
+												
+	
+
	
?;9RpW`nB=>>>>>>>>>>>>>>=======>?>>>>>>;Dbn[[t�O=5
+
+
+
+																						
+				
+			
+5?8:_gTpP<>>>?>>>>>?>?>>=======>>?>>?>>>>=>VjSX{l=>#
+
+																						


+
+				"?>=Cm`k]>>>>>?>>>>>>>>>>=======>>>>>>>>>>>>=\dNbxI>7
																													
+
+
+
+
+	7?><Qqld@>>>>>?>=>>>>>>>>>>====>>?>>?>>>>>>>>BgZRuX<?'
																											
+				!?>?=aioJ=>>>>>>>>>>>>>>>======>>>>>>??>>>>>>><Il[jg>?8																						
+				
+

	
+
4??>CigY=>>>>>>????>>>?>=========>>>>??>>>>>?>?=Te\sF>?'
+																								
+


+
+
+
+	
>??=NjmK=>>>>>>>?>>>>>>>==>=======>>>>>>>>>>???>>`cqW<@5
																										
+









		
	,@??>]n`=>>>>>>>>>>>?>>>>>=>>======>>>>>>>>>>>>>?=Llme>?= 	
+																						
+
+	
+



+

+			
+
+

	
+
+9??>EioE=??>??>?>>>?>>>>>>>>=====>>>>>>>>>>>>>>>>>AifiF>@-
+																								






+
+				



+	
+
@>?>Tt[<????>>>??>>>>>>>>>>==><====>>>???>==>>>>>>=XpiT=@:

																							





									
+




+		.@>?>b�P=????>>>>>??>>>>>>>>=======>>>?>?>>>>>>>>>?>Gmkd>@@%																									




									



+		9???@k�O>??>??>>>>????>>>>>>>======>>>>?>>??>>>>>>???cypC?A0
+																								


	
+
+									




+
+
+
+????Ct�O=?>>???>>>>???>>>>>>>===>>=>>>>>>??>?>>>>???>Ls|O>A:																									
+
+															

+		
+
+
%A@?>JzsG>??????????>>?>??>>>====>>>>?>>???>??>>>>????@q�Y?@?$																								
+																		
+
			

.A@@>U~g@????>???????>?>?>>>>=====>>>>>>?>????>>??????=b�f@@A-
																																										
+



+	
+
5A@@>bY>??>>>>>????????>>>>>>====>>>>??>>???>>>????>?=V~gA?A7
																																											
+		


+	
:A@?AcnO>??>>>>>??????>>>????>>===>>?>?>>?>??>>???????>L|xD?@=
																								
+																						

+	
>@@?JhkI>???>>>>???????>>?>>>>>>>==>>>>>>>??>??????????GswF?@@#
+																																																		
@@@>Unb@??>??>>>????>??>>>>>???>>>>>>>?>>??????>>>>>???HjkL>@A,

+																																																
+
&A@@>_lT>??>>>??>?????>?>>>>?>?>>>>>>?>?>?>?????>>>>>??>CdiV>@A3
	
+																																																
+.A@@?hvO>@???>???????????>>>?>??>>>>>??>>?>?????????????@bc_>@A8	
+																																																
+4A@?DrtG?@??????????????>>>>???>>>>>>>?>?>?>???>>>>>?????baf@?@=
	
+																																														
+	
9A@?MrdF?@??>>>?????????>>>>???>>>>>>??>>??>?>>>>>>>>>>?>VbiB?@?
+
+																																													
+
+	
<A@>VolK?@??>>>>>????>???>>>???>>>>>>??>?????>>>>>>>>>???LmpD?@@!
																																															
+	

>A@>_rtP>??@???>>????????>>>??>>>>>>???>>????>>?????>????FltI?@A%
	
+																																														
+	?@@?gmtN>????????????????>>>??>>>>>>>??>??????????????@@?DdsP>@A(
+
+																																														
+
+	
@@@@olqH?????????????????>>>??>>>=>>>??>?????????????????EinX>@A*

+
+																																																
+
!A@@BvqmB??????????????>??>>??>>>>=>>>??>?>???????>>????@?Dlh_>@A-
	
+																																																
+#A@@Fyte?@?>>>?>>?????????>????>>>>>>>?>?>????????????????@hsg?@A/		
+																																														
+
+%A@?JwkY>@@?>>>>>??????????????>>>=>>???>>????????????????>_wl@@A1		
+																																														
+
'A@?PwfQ???????>>???????????????>>>>??????????????????????>TlqA at A2																																																
+
)B@>VxhI???@????????????????????>>>>???????????????????????PluD at A2
+																																													
+
+
+B@>\xdC@@@@@??????????????????>>>>>??????????????????????>KivF at A2	
+																																													
+

+B@>aya@@@?@@???????????????????>>>>??>???????????????????>KduJ?A3	
+																																												
+
*B@>ew[>@?@????????????????????>>>>>?>>????????????????????GdsM?A3	
+																																												
+
+
)B@>gvR>???????????????????????>>>>>?>>>????????>>>??>?>???CbuQ>A2																																															
+
(B?>jxK>????????????????????????>>>>?>>>????????>>>>>??????A_zT>A2																																															
+
%A?>l}G?@??>>>>?????????????????>>>>>>>>>???????????????@@@Ab}V=A1																																													
+
+
$A?=kzH?@????>>??????????????>>>>>>>>>>>>>?????????@?????@?Dd|V=A0																																													
+
+ A?=fuN?@@???????????????????>>>>>>>>>>>>??????????????????Gk}S=A.																																											
+		
+
??<_xV>?@@????@??>>????????>>>>>>>>>?>>>??????????????>???Hh{M=A(																																															>@=X�e?@@@@@?@????>>??????>>>>>>>>>>>>>>?????????????>????Hc{G=@!

																																													
+<@=O�kA?@@???????????????>>>>>>>>>>>>>>>???????>>>??????@>QrA>?


																																													7@=F~hB?@?????>???>>?????>>>??>>>>>>>>?????????>>>>????@@?_~w<>=

																				
+																								1@=?z{Q>????????>>>??????????>>>>>>>>>??????????>>???@@??Eh�f;?9


+																																											
+
(A><m}a?@????????>>???????????>>>>>>>>>>???????>>>???@@?>Yl�Q<?3
+																					
+																						

@>;[�qG?@?????????????????????>?>>>>>>>???????>?????@@?LafB=@(

+																			
+
+																						
+;>=I~m[>@@@@@@@???????@??????>>?>>>>>???????????????@@AhZvj;=>


																				
+																								3?>>tlkG?@@@@@@@????????????????>?????????>?????????@>Lj`�L<>7
+																					
+
+
+																				
&@><\�cc@@@@???@@????????????>>>>????????>>??@?????@?BeXus=>?*

																				
+
+
+																					
+=>=C�dlZ>????????????@????????>>????????????????????^ga�L=?<

																		
+
+
+
+																					2@><c�SnU>@?????????@@@????>>?>>??????@????????@?>>WmZ�h<>@.

+																
+	
+
+	
+																					
"@>>A�l[wK?@@?????@??@@????>>>>>??@?@@@@???????@?@ZrdxB>><

																			
+
+	
+
+																					:?><S�jgoD?@@???@@???@@??>??>>>??@@????@@@@?@@>A`qcl�Q<>@+


+																		
+
+	
+																					)A>><h�emdA?@@@@@@???@@??????>??@@??????@@@@@?Ban^h�a<>?;
																				
+																							
+;?>>@v�do_A?@@@@@??@@?????????@@????????@@@?Ddp^j�j>>?@&	
+
+																					
+							
+													&@>>=C{�emaG?>?@@@@@@@?@@?????@@?????@?@@?>Ljj^q�i?>?A3
+
						
+										
+
+	
+	
+					
+															
+5@?>=Dz�lki]TJB??A@@@@?@?????@??@@@@@@?@J\mec{�[?>?@9	
+																	
+
+
+	
+			
+																		=@??=Cu�yggoql\G??@@@@@@@@@?@?@@@?>@FShqi\i�qH=??A;	
									
+									
+
+
+																					
+#@@??>A_��qeafro`RHB?=?ABB@?>>>?BN`loqnhj{~]A>??A:																			
+	
+	
+			
+
+																

&?@???>F\y�ta_amwymeVE?A at AHMSW\ekncQP`|�kH>@?@B5	
+
+																	
+
+	
+		
+
+
+
+																
"<A@?@?>CWt�|mged^l|eQWZ_vyh`VW[erx}jM??@@AA.	
+
+																
+
+	
+
+	
+
+
+
+																	
3AA??@@?AQgy��umbil_`^rxj`Xan{��r\H>?@@@B;#


+
+											
+
+			
+
+
+
+	
+	
+
+
+		
+															
 7AA@@?@??BNdt|zt~}ox��ysz��nZH@>>@@AB>,
+
+
+																			
+		
+
+
+
+	
+
+
+															

"5?BA@@@@?>@DGKa���op�w^G>>???@BB=.



+
+
+
+														
+		
+	
+
+	
+
+
+																	
+
+

)7?BA@@@??>==GUPC at AD@==@?>AB?6)

+
+
+
+
+
+																
+	
+
+
+
+
+
+																	
+
+
+
)6=@AAA@??=<<<<==>@@923&$
	


+
+
+
+
+															
+		
+
+
+																					
+
+
+

'07=@AAAAAAA@;2&/E
+

+




+
+
+
+
+
+
+													
+	
+
+	
+
+	
+	
+																	
+
+
+
+
+

'-132/((@MJ;







+
+
+
+
+		
+														
+
+		
+
+
+
+
+																
+		
+
+
+
+
+
+





6QZO,




+
+
+
+
+
+
+
+
+			
+													
+		
+
+
+																								
+
+
+
+
+
+




%%

+

+
+
+
+
+
+
+																				
+			
+
+																								
+
+
+
+
+
+
+
+
+
+	


		
+	
+
+
+
+
+
+																					
+	
+
+
+
+
+
+																		
+		
+
+
+
+
+
+
+		
+










+
+
+
+
+																							
+
+
+		
+
																			
+
+
+
+
+
+
+
+		
+
+
+











+
+
+																							
+		
+																					
+
+
+
+
+
+
+
+		
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+																											
+																
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+
+	
+												
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																								
+				
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																	
+
+						
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+									
+
+
+
	
+

+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+			
+
+					





+	



+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+


+
+















+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	















				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



		
+


+
+

+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+



+

+


+
+
+
+
+

+
+		
+
+
+
+
+
+
+
+
+
+


+		




+

+
+
+



+
+	
+
+
+
+
+
+

+

+
+





	
+
+	

	


+



											
+
+										
+
+
+			
+	
+						
+
+			
+	
+
+


		
+
+
						
+							
+
						
+	

				
+


+

+				
	
+
+			

+
	

+
+
+	
+
		

+
+
+
+
+


+	
+
+	

+

+
+
+	





+
+
+
+			
+				
			
+		
+




+	
+



+		

+										
+



					
+
+
+
+

+
+



+		








	
+
+
+	



#)-.-,*'$ 




+				
+
+	
+




(18<>?@@@?>>>>==<93(


+		
+
+		!2<??>=<<====<<<===>>>?<3&
	
+		
+
+1=?><;:9>ADFFFHD?<;<=>=>>??8'

+
	
!8?><;>FOUTSNF?;S}|qg\TJF at 9:=??5

+	
+&<>=;?NUTQ?%

+	Q�w~kD05LYE=;=><(
+

			

		
+)<=<<N_G(
		#L,2&X9NH;<=>.
+		
						
	


'==;=Wg9			
(	 &_cD:>?0	
	
+
+
+	
	#=<:>^^&
+	!$prN;=?.		
	
+


+!=<9=eg)			
+!",*$P:
+ 			
6QzU;=>-
+	
	

+
+
			&&;<:=kr5		(2?UTJDBHNkaPZP;$-$FV;=<C@
	
+





+

+

+
+	
GC<8;j�B&AONE@=<<==<;BG@=BISg_;
	
L�X<==%
+
+





+
+							
+
+

+

+


+	
+
$=<;d�T!
<SVLA<=====>>===<==<<<<Ia`Li�W;;;
	
+							

+

+
+		


+
+		
+
+
+			5>;Z�Z0#8QMB<<==>>==>>>=<==>>>>>=<<FbU4z�U7=5
+
											
+						
+
+


+			

)?<CwpB7PO?==>>>>>>>>>>==<==>=>>>=>>=<IK#Wx�P<?$	
														
+
+

+
+
+

+==:NojVfT=>>>>>>>>>>>>>=======>>>=>>>=<@VB"Ddr|D>8	
										
+		
+			
+

+
+
+
1 at 79Tmdyb>>>>>>>>>>>>>>====<<===>>>>>>=>==Rh_S\�_;?$

+														
+

+	
+
?>;=_dinA>?>>?>=>>?>>>>>========>>>>>=>>>>=EbXQps@>7	
+																							
+
+

	
+
4@==EgcmH=>>>>?>=>>>>>>>>>======>>>>>>>=>>>>=Gi]crL=?%

																	
+	
+
+
+
+			
+
				
?>><TloN<?>>>>?>>>>>>>>>>======>>>>>>>=>>>>>><Rk]qZ=?7
			
+																




		




+
+
2?>?>bnc=?>>>>>>>>>>>>>>>======>>>>>>?>>>>>>>>=<_hdk?>?#
+	
+																			




+
			
+>>?>GlfH=?>>=>>>?>>>>>>>========>=>>?>?>>>>>?>>>C`YpK=>4
	
+																					
+
+


+	
+*@>?=Vta=??>>==>>?>>>>>?>>>>>=======>>>?>>>>????>=Hho[<<=	
+																					
+






+




+	
+9???@frK=?>>>>>>>>>>>?>?>>>>>=======>>>>>>>>>>>???=]mf?>@.
+
+																					







+	
+	
+
+


+
+		

?>?>Jlf?>???????>>?>>>>>>>>>========>>>?>>>>>>>>?>=JfhI>=:
																							




+									



+			
+
+/@>?>\tQ=?????????>?>>>>>>>>==<===>>>>>>?>>>=>>>>>?>AghX=?@'																								




+										
+



+		
+			:????fM>@?>???????>>>>>?>>===<====>>>>>?>>>>>>>>>??>gxi??@3
+																								



+											




+
+			
@???@h�N>??>>?????>>?>>>>>>>>===>>>>>>>>>??>?>>>>>??=V�|I?@;
																							
+

+												
+


+
+
+
+
+

)A???Dq|I>??>>>????>>?>>>>?>>>===>>>>>>>>?????>>>>????Av}R>@@$																									
+															

				
+

3@??>KvnC????????????>>>>>>>>>===>>>?>>>>?>>???>>?????=]�\>@A0
+																																								
+

				
+
:@@?=Xy`>????>???????>?>>>>>>>>===>>>>>>>>>????????>??>O�n@@@:
																																									





+	
+
+
>@@?>f{R>?>>>>>>???>???>>>>>>>>>==>>>>>>>??????????>>?>JwoB?@?!																																											
+	
+

+
+	
!@@??ChpI>??>>>>>>>????>>>>>>???>>>>>?>?>>>????????????>GvuE?@A*	
+																																											
+
+		
'A@?>LgcA?????>>>??????>>?>>>>>>>>>>?>>>>>>?>???????????Cu{H>@A1
																																														
+	
+-A@?>Vh^>??>???>>??????>>>>>>>?>?>>>??>>>??>????????????CjlP>@A7	
+																																													
+
+
3A@??`pT>??>>>???????????>>>>>????>>>?>>>>???????????????\b[>?@<
																																																
+	
8A@?AjoG?@??>>???????????>>>>>>??>>?>?>>>>????>??????????ecg??@?!	
+																																														
+	
<@@?HvmA@@???????????????>>>>>??>>>???>>>>?????>>>>???>?>[iiB?@@&
+
+
+																																													
+	
?@@>RvgA@@??????????????>?>>>???>>?>?>>>>?????>>>>>>>>>??JjjF?@A)
																																															
+
+"@@@>_odD?????????????>>?>>>>>>????>??>>>>?????>>>>>>>>??@BltJ>@A,
																																														
+
+	&A@@?gmnD>???????????>????>>=>????>????>>>?>>??>>>>>>>??@?@fxQ>@A1
	
+																																														
+
+)A@@@ohhB?????????????????>>>>????>>??>>>>>???????>?????@?@fxZ>@A3																																																	
+
++A@?Cvnd@???????????????>?>>>????>?>??>>>>>???????????????@gmc>@@6
+
+																																															
+
,B@?Hzt_?@??>???????????>?>>>???>>>>>??>>>????????????????>dmj?@@8
+
+																																															
+
.A@?NwtV>???>>>>??????????>>?>?>>>>>>???>>????????????????>WlmA@@:																																																	
+
0A@>TvjP>???>>>>??????????>>???>>>=>>????>????????????????>KkpC@@;
+
+
+																																															
2AA>\wdL??????????????????>???>>>>>>>???????????????????>?@DetG?@<	
+																																														
+
4A@>cuhJ????@?????????????>???>?>>>>>??????????????????????Bh~J?@<
+																																													
+
+5A@>iomH????@???????????????????>>>>??????????????????>????A`wO?@<
+
+																																														6A@>nqlB????????????????????????>>>>???????????????????>???A^sU>@<
+																					
+																							
+	6A@?qu\>???????????????????????>>>>>??????????????????>????@XtY>@<
+
+																																												
+	5A@?srM>??????>????????????????>>>>>??>>????????>>>>>>>???@?Sw\>@<
+
+																																												
+	3A??uqE??????>>>??????????>?????>>>>??>>????????>>>>>?????@>Oy^=@<
+																																													
+	1A??vsB@@???>>>????????????????>>>>>>?>>>????????????@@?@@@>V�a=@;
+																																										
+		/A??spC?@@???>??????????????>>>>>>>>>?>>>???????????????????[wa=@:
+																																													
*A?>qsG?@@@@???????????????>>>>?>>>>???>???????????>?>??????^q\<@8
+																				
+																					
+		
&A>=lzM?@?@@??????????????>>>>>>>>>>>??>>??????????>?>>????@]uW<A4
+																																													
!A><bzT>@@@????????????????>>>>>>>>>>>>>>???????????>>???@@B[yQ<A/
+																																												

@?<WwV>?@?????????????????>>>>>>>>>>>>>???????>>>>>????@@?Hn�H=A(

																																											
+
+>?=M�i???????????????????????>>>>>>>>>>??????>>>?>>????@@>T}�A=@!

+																																										
+
+:?=D�tE?????>????>>>????????>>>>?>>>>>>>?????>>?????@@??@?a}s<>?


+																																												3@>>wP>@?????????>>????????>>>>?>>>>>>>?????>>?????@@???Il`;>;

																					
+																						
*@=<f�e?@@@???@?????????????>??>?>>>>>>>??????>??????@??Aeg�L<?3

+																			
+
+
+
+																				

@><TnL?@@@@@??@@?????????????>?>>>>>???????????????@@>Okgy?=@(

																				
+																								;>>C{id?@@@@?????????????????>>???>?????????????????@@Bib�_<>>


																			
+	
+																						1@><kwpQ>@@???????????@??????>>?>?????????>????????@@>\gf�D=?6
+																			
+
+
+																					
"@>=N�glI???????????????@?????>>>>?????@???>????????>IlT�d<>?&

																			
+
+
+																						<?>=wr]kC?@@@??????@@?@@????>?>=>>????@???????????>Accq�B>?9

																		
+
+	
+		
+																		0@><P�Ud_>@@@@????@???@@????>>>>>?????@@????????@?Bajf�U<>@'


+																	
+
+
+	
+																				

?>><l�[rS>@@@??@@@??@????????>>??@?????@@@@@@@??Deof�l=>?8

																		
+
+	
+																						6?==C��hsI?@@@?@@???@@???????>??????????@@@@@@>Dgmb~~B=>@#


+																			
+	
+																					
#@>><P�vlhB?@@@@@??@@@??@??????@@?????@?@@@@@>Gglby�K=>@6
+
																			
+	
+						
+															7@>><[�nlgF>?@@@??@@@???@?????@???@@@@@@@@?@Qkhay�P<???

+																
+
+
+
+	
+
+																			@??>=_�sppUD????@@@@@??@??@?????@@@@@@@?@J`lag��P<??A+


																	
+
+
+				
+																		
+0A>>><_�{lokbZRE>?@@@?@@??A?????@@@??>APele_n�oG=??A1

+																		
+
+
+
+	
+
+	
+															
9@>?>=X��rfjdko^KB>>>>?@AA@??@@???DP^nxmbhz�Z?=?@A1

																			
+	
+
+		
+																	;A???=Ih�vbYdorof[OA?@A@?>?@@DNZjrmbYc}�iH>??@A-

	
+																	
+	
+		
+
+																	
+:A??@?>EXu�wh`dkujpgJGKMSbfhijka][ai{jL??@?A>&


+
+
+													
+
+
+	
+
+
+
+
+
+
+
+															
2AA@???>ATm}{ncVSZdbcenue___gt{�vdJ??@?@A8


+
+											
+				
+
+
+	
+
+
+
+
+	
+
+												
+	
!7A@??@???GUj~��wklskl�}mjdp~�wdNB>?@@@A>+


+
+
+													
+			
+	
+
+
+
+	
+
+	
+														

%9AA@??@@??EScmu~��������~dLA>>?@@AB?0



+
+	
+																
+	
+
+
+
+
+
+
+																	

 2=ABA@@@@>>?BF[rrYTefXE=>@@AABB=.


+
+
+
+																	
+
+
+
+
+
+
+
+																
+
+
+
#0;AAA@@??>=<<<::;<=>@A:7:81&




+
+
+
+
+															
+	
+
+
+
+
+																			
+
+
,5<@AA@@?>>>???><8(.6
	
+



+
+
+
+
+																
+	
+	
+
+
+	
+																
+
+
+
+
+


'18<>@@>:3-+.),5
+	






+
+
+
+
+
+																	
+		
+	
+
+
+																	
+
+
+
+
+
+
%;MQ8
	





+
+
+
+
+
+
+																	
+		
+
+
+
+																			
+
+
+
+
+
+
+



+

 =DD3

+
+



+
+
+
+
+
+
+
+																		
+		
+
+
+	
+																					
+
+
+
+
+
+
+


	
+	
+



+
+
+
+
+
+																					
+	
+																										
+
+
+
+
+
+
+
+	
+







+
+
+
+
+
+
+
+
+
+
+
+
+																				
+
+
+		
+
+																			
+
+
+
+
+
+
+
+
+
+









+
+
+
+
+
+
+	
+																			
+	
+
+
+																			
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+







+
+
+		
+																					
+
+
+	
+
+													
+					
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+																														
+													
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																			
+	
+
+		
+
+				
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																		
+
+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+													
+
+							
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+		
+
+
+		
+		





+
+

+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+		
+
+
+













+
+
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+














			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+



+	
+



+
+
+
+
+
+
+
+
+
+
+
+
+

+
+		
+
+
+
+
+
+
+
+
+
+
+
+


	
+


+


+


+
+

+
+


+		
+
+
+
+
+
+
+
+
+
+

+		



+






+
+	
+
+
+

+
+


		
+
+
+


+
+
+		


+
+
+
+



											
+		
+									
+
+				
+												
+	
+
+
+
+	
+
+	


+		
+
+

+		
+	
+	

	


+		
+	

	
+		



+
		
+

+	
+		



+
+
+
+
+	
+
+				


+				
+
+

+
+
+
+	
+
+		


+

+	
+
	
	
+	
+





+




+	
+	

		

+






+	
+




+
+		
+						
+
+
+
+
+
+	
+
									


+




+		
+
+	
+
+

+
+





		
+
+				



 "!


			
+

+	
+



)17:=>>==<:754430'
+				
+
+	
)7=?>>>>>>===>>>?>??><5+
		
+	
+
+*:??=;;8:=>>>=<<;;<<=>=>??=4%

+

4>?=;;?DIOPPRX]a_VLCCBA?=<:>?=4

		
 9>=<=JZ^\TD6)#&*@j���fDHPLF=;;=?;$

+
";><<F]Y@'	7rJN.
+.igTB;=><&
+



+								
+
+ ;==<PnH					8

)$;]T?;>>'
	


		
+
+
	
	9=<=Pd9&!		
+	%X^D;>>&

+		

+		

+	7=<;P\-	'
	=hG;><$


	
+
+	
+3>;;Ra.
	
"-1<.2e@)			DvG<=;&- 

			
+		
+	
+
+		/?;9Rw?!19AMKDB at FIdfWPTI@=


]zE<<=D#
+			
+


+
+
			
+
+;H><7O�^	

:OMD@><<===<<>?<<?DL[cR=	qzD;=4
+		
+
+

+	
+								
+
:=8M�f+
+
'J[SE==>>>===>===<==;;;;>NhG	7�tB9=,

													
+

+	
+

+	

+=;@uj5=OF>;=>=>>===>>====>======<=PM_�r>;=
	
									



+



+
+
+	
+
+9?8KrM67LG>===>>>>>==>>>=<==>>>>=>>==<AD07j�n>?4

								














,@<9OlV@[H=>>>>>>>>>>>>>==<===>>>>>>>=>=>JP#.Wg�Q<?"
+							







	

+


+	
	=<5<UimtR=>>>>>>>>>>>?>===<<<==>>>>>>>>>><E_ZQUug<?7

									
+				




+
+
+	
+

+0?;<>`euf=>???>>==>>>>>=========>>>>>==>>>>=A\^SflB=@"	
		
+												
+


+





+
+	
+>=<>EhljB>>>??>>>=>>>>>=>=======>>>?>=>>>>>>>>[d_mJ=@6

+
+	
+													
+



+				
+
/?=>=TrnE=>>?>??>>>>>>>>>>=====>>>>>>>>=>>>>>>>Aeej[=>? 

		
+															



	
+=>>>?fyR<??>>>>?>??>>>>>========>>>>>>>=>>>?>>><Mm_i@=?2
	
+
+														



+
+			(@>?>Jva?>??>>>>>??>>?>>>==========>>>>>>>>>?>>>>>\hkM<:<
	
+
+																					

+
+8?>?=`~K=???>>>>>>>>>>>>>>>>>=======>>>>?>>>?>>>>>?fq]=7<,
+
+																				


+	
+
+

+					
+

?>??Bwl>?????>>>?>>>>>>>>>>>===>====>>>>??>???>???=GomA<;8
																							
+




+
+
+

+



+
+
+
+
+
+
+				-@>?>P|S=?????????>?>>>>>>>>=====>=>>>>>>>??>>>???>?=\pK>>?$		
+																				


+									
+
+


+				
+			:?>?>]yI>???????>>>?>>?>>>>===<==>>>>>>>>>>>>>>>>>>?=Qo[=?@2
+																							
+
+												



+		
+
+
+		
?>???cyH??????>>>>>>>?>>>>>>====>>>>>>>??>?>>>>>>>??=P�n@?@;
																							

												
+
		
+	
+
+
+
+*@???Ak}K>?>>>>>>>>>=>>>>>>>>>===>>>>?>>>>>>??>>>>???>F~�K>?@$																								
+													

+				
+
+
5@???DszG>>>>>>>>>>>>>>>>>>>>>>===>>??>>?>>????>>?????>e�Y>@A1
+																																						
+
+					
+
;???>KrlB>???>??>>>>>>>>>>>>>>>===>??>>>>>?>??????????>R�a>?@:
																																							



			
+
+
+

????=Ws^>??????????>>>>?>>>>>>>>>>>>>?>>>>>>???????>??>I{m??@?"																								
+															


+

+			
+
$@????cqO>?>>>>>>???>>>?>>>>>>>?>>>>>>>>>>>>>>?????>>>??DqmA?@A+																								
+																			

+			
++@@??DelH>?>>>>>>>?>>>>???>>>>?????>?>>>>?>>>>????>>>>??DspC?@A4
																																																
1A@?>Nge@????>>>>?>??>>?>?>>>>??>>???>>>>>>>>??????>>???AqyG>@@:
	
+																																															
6A@?>Yj`>??>??????>?>>>?>?>>>>??>>>>?>=>>???>???????????@akR=@@>
																																																	
:A???blL>?>>>??????>>>????>>=>>?>>>??>=>>????????????????a]^>?@@$																																																
+
+
=@@?CogA???>>>????>>>>???>>>>>>??>>??>=>>????????????????fgf@?@A*
+																																															
+	!?@@?L{a>@@??>??????>??>??>>>=>>?>>>?>>=>>>???????>>??>>?>SkiE>@A0
																																														
+
+	&A@@>Yy\>@?@???????????>???>>=>>>>>>>>>=>>??????>>>>>>>>??DjnJ>@A3
																																																
+*A@??ejZ???????????????????>>>>>>???>>>=>>??????>>>>>>>??@?`tO>?A6																																																
/A@@@kme????????????>>?????>=>>>??>??>>=>>??????>>>>>>>?@@?^|X>@@9																																																	
2A@@Cri`>?>>???????>??????>>>>>??>>??>>=>>???????>>>>?????>_|b>@@;
+
+																																															
+
5A@?Ium[>?>>>>?????>??????>>>>>??>>>??>=>>?>??????????????>bnj?@@=

+
+																																														
+
7A@?PwoP????>>>???????????>>>>????>???>>>>?????????????>??>ZpqA@@?

+
+																																													
+
+
9A@>UzrJ????>>????????????>>>>?>??>???>>>>????????????>>??>MsvD@??
+																																															
+	;@@>]sjJ??????????????????>>>???>>>????>>>>??????????>>????DmzH?@@


+
+
+																																												
+	<@@>eqpK??????????????????>>??>>>>>>>???>>?????????>>>?>??@@j�L?@@

																																															
+=@@>lotK????@?????????????>>??>>>>>>>???>?????????>>>?>>??@>a�Q?@@


+																																												
+
+>@@@qjtJ>?????????????????>???>>>>>>>>??>?????????>>>>>??@@?X�Y>@@

+																																										
+	
+
+
>@@AulrC??????????????????????>?>>>>??????????????>>>>??@??>Xt_=?@

+																				
+																						
+
+	=@?Cxs[>??????>????????????????>>>>>????>????????>>?>>>??@?>Trc=?@

																																													
+
+=@?C|{I???>??>>>???????????????>>>>>????????????>>>>>>????@?Kue>?@


+
+																																											
+
+<@?C}uB@@????>>>>??????????????>>>>>??????????????>??????@@?Gwh>?@

																																													
+;@?Cp@@@??????????????????????>>>>>????????????????????@@@>M|k>?@
																																												
+
+8@?B{jB?@@?????????????????????>>>>>????????????????>??????>V}j=@?

																																											
+	5@>AyoD?@@?@@???????????????>>??>>>>>?????????????>>>>>>>??>Uzg<@>

																				
+																					
+		0A>?uvE????@???????????????>?>>?>>>>>??>??????????>>>??????>Xza<@;
+																																											
+	
,A>=myL?????????????????????>>>>>>>>>>?>???????>>???>>?@@@@@ayZ<@7
+
+																																										
+
+
'A?<b�Y>????>????????????????>>>>>>?>>>>>??????>>>>>>??@@@?En�P<@2
+																																										
+
"@?<V�a>????>>?????????????????>>>>?>>>>>?????>>>?>????@@?>Or�F=@+

+																			
+																						
+
+>?=K�h@@??????>????????????>>?>>?>?>>>>>????????????@@?@@?\rz?=@$


+																			
+																								:?=C}tE?@@?????????????????>>>>>?>>>>>>>????????????@????Bdvl;>?


																					
+																						3@==o{V>@@@@??@??@??????????>>>>?>>>>>>>?????????????@??>Qf{W;>;

+																																											
)@><_�gC?@@@@???????????????>?>>?>>=>>??????????????@@@>Fie}E=?2


+																																											

?>=KlU>@@?????????>????????>>>?>?>>???????>???????@@@?cfxo<>?&

																			
+	
+																						9?>>tmlE??????????>??????????>>?>?????????>?????????@>KhZ�P<><

																			
+
+
+
+																				.@><\{hd@?@@????????????????????>>>>???@??????>?????@?c]ny>>@1


																		
+
+	
+
+																				
@>=C`i[>@@@@?????@??@@@@???>>>>>>>??@@@????????@@@>Oke�Q<>?


																		
+
+	
+
+																					:?><c�YpJ?@@@@???@???@??@????>?????@?@??@@??????@@>Ild�m<>@4

													
+				
+
+	
+																					
+@>>BqdjB?@@@???@???@???@????????@?????@@@@@???@>Ilgv�D=>?


+													
+
+			
+	
+
+																				
+>>><R�mo^>@@@@??@???????????????????@@@@@?@@@@@>Jnfl�R<>@2

																			
+				
+																		1@==<f�gtN>@@@?@@??@????????????????@@@@@???@?>Ikge�b<>>>



+															
+		
+	
+					
+														

?>>=?v�omJ>@@@@@??@?????@?????????@@??@@@@@??Tk`d�l>>>A.


																
+
+
+
+	
+																					1@>?=D}�nqXC>??@@@@????????@?????@@@??@@@?@K_m]b�l?>??;
+
+												
+					
+	
+
+
+
+																		
=?>>=F�otp]LEB??@@???????@????@@@@@@?>AQgog\p�d>>>?> 
+
														
+	
+		
+
+			
+	
+															
&@??><Ex�ulrte\VI@>>????@@@??@@@@@?>?GXovk_c||U=>?@>#

+																		
+		
+		
+	
+														
/A???=Af��si^WjwlYMF@>@@AA?>>??>?AOfvvm^b{�gD=??A= 

+														
+		
+
+	
+
+
+
+	
+
+	
+													
1A??@?=Ke|�ve`gqwwriQ@@BCGOQPS\deohbbm}�lN???@A9



+															
+
+	
+
+	
+
+
+
+
+															+ at A@@@>>DUp�{qd[XWZ_V[^er{upikiddet~}gK????@A2
+

+
+																
+
+	
+	
+
+
+
+	
+														
7AA????>AL`t�yk`U[lnm�w`b]`hyxgUF??@@@A='
+
+
+
+																
+
+		
+
+
+
+
+
+
+															$:AA@??@@?AJ]r��������|nny�~jRC??@@@AB?1


+
+																		
+
+
+
+
+
+
+
+																	

&7 at A@@@@@?>?IZhnrxuov��zaI?>?@@@AB<0

+

+
+
+
+																	
+
+	
+
+
+
+																
+
+

-9?AA@@@?>===>@ABBGGA=>?@@AA at 9(



+
+
+
+
+													
+
+	
+
+
+
+
+
+	
+														
+
+
+


)5=@BAA@??>=<<<=>@@@<41+&







+
+
+
+
+																	
+	
+
+
+
+
+																	
+
+
+

",6=AAA@@@?=:620(.9








+
+
+
+
+																
+
+		
+
+
+
+
+																
+
+
+
+
+

 )/0/*&(-45 
	$-







+
+
+
+
+
+														
+		
+		
+
+
+
+																			
+
+
+
+
+




$ERT?



+
+



+
+
+
+
+
+
+
+																	
+			
+
+																						
+
+
+
+
+
+



5+








+
+
+
+
+
+
+		
+																
+	
+	
+
+
+																			
+	
+
+
+
+
+
+


+
+


+
+

+

+

+
+
+
+
+
+
+																				
+
+	
+		
+																		
+
+
+
+
+
+
+
+
+
+		







+
+
+
+
+
+
+
+
+
+
+
+
+																				
+
+
+
+	
+																
+
+
+	
+
+
+
+
+
+
+	
+
+
+






+
+
+
+
+
+
+
+
+
+
+																				
+	
+																					
+
+
+
+
+
+		
+
+
+
+
+
+
+



+
+
+
+
+	
+	
+																				
+
+
+
+
+		
+												
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																					
+
+	
+
+
+										
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																			
+		
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+												
+		
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+
+
+	
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+





+	
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+












+
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+









+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+
+
+
+
+
+
+
+




+		
+

+
+
+
+
+
+


+
+
+
+


+		
+
+
+
+
+
+
+




	
+

+


+
+



+


+		
+
+
+
+




	
+
+



+

+		




+	
+	

														
+
+
+
+					
+
+

+
+	
+	
+
+			
			
+
+		
+
+
			

+
+
		
+		
+

+		
+		
	
+				


+	
+
			
+	
+	

+				
+




		
			
+

+				
	
+
+		
+







		

+		
+
+	
+
+		




+		










		
+
+			
+				
+
+
+




+
+
+
+

+		
+						



+		
+			
+




+

+	
+










+
+
+


		

#*/367631-(%&&$ 

				
+

+

+6<>??>??>???????>=;4*!		
+
+	
+
+2=?><:<=<=<<========>=>?>9/ 		
++=?><<<<?BEGHHFFFD>::;<<==<>?=1

+
+2>=<<CUhjjfVMWm`JALbb\UNKF@::<>?;#
	7>=;BV\]T<0&+e~qA8FViaN>:=?<&
+				7>=<HbS(
+G7&)<cgfP=;><"
		

	
+				
+	5=<<KfE5
+
+		9^Z?;>;

+

+
+			
			2=<<H^9'
<[A;=9		
+	
+					
+>;;EX/
#!			Bf?<>7

				
+
+	
#=<9Bd=
		'5>B8IjT7+		di=<=4*1

			
+
+	
+				
+;>:?mX
	/=@DHGCAAFC[iPO]\S>*
+		'|a<<=C2
+			
+
+	
+
+					!F<><?pk,
&CSKA>======<<<:;<=AGMXbD			@�Z;<=%
							
+				
+		
+2?<<jt4
.KVL@==>>>>======<==<<<<<BXD	h�T8=9	
												
+
+
.>:JyM 
!AJB<;=>>>>>>==>=========>>=;GI%MvN9>-


+		
+									
+
+
+	
+
		
	"?>;Og at 6<JA>>==>>>>>>>=>>====>>===>>>=<>BC+
Baw}C;=


+								






	
	9?=<OhJCXB=>>>>>>>>>>>>>======>>=>>>>>>>>B[TRV`}Z;@2
									


+
+




	

	)@:;=TbgmH<>>>>>>>>>>>>>=====<=>>>>>>>>>>>=>_jXRkf<>?


+						



+

	
+
+
;=6<>^`r^<>>>?>>>>>>>>>=========>>>>>==>>>>==YiW\fA;?2		
+																
+





+	*@98>DeghC=>>>?>>>>>>>>========>>=>>>>>>>>>>>=<PhYjL;:>

	
+											




+	
+
+	
:=7==SriE=>>>>??>>>>>>>>>>=====>>>>>>>>>>>>>>>><Vic\<:>.

+
+														

+				%@==?>kwH=>>>>>?>>?>>>>>>>=======>>>>>>>>=>>>>>>>Ai`hB<;;

+
+
+																


+
+
6?>?=L�X<??>?>>????>>>>>>========>==>>>>>>>>>>>>><ReeN=<?'

+
+																				

						>>>?=fz@>????>>?>?>>>>>>>>=>>=======>>>>??>>?>>>>>>`s\=;:5
																				

														
+,@=?>C~]<??????????>>>>>>>>>>======>=>>>>?>>??>>>>>>AnsA><>!																						

+



+




+


+
+					
+
+	9?>?>Q}G>???>>>>>>>>>?>?>>>>======>>>>>?>>??>>?>>???<NvL>?@.
+																							
+
+
+						
+


+				
+		
+	
+?=??>\uB???>>>>>>>>>>?>>>>>>=====>>>>>>>>?>>?>??????>Eub=?@9
																																			
+

+	

+	
+

+)@>???^uE??>>>>>>>>=>>>>>>??>>>===>>>>>>>>>>>??>?????>C�wA???"																																				

			
+			


5?>??An|G>>>>>>>>>>==>>>>>>>?>>>==>>?>>>>>>?>>?>?????>>r�J>?@/
+																																				

							
+
<????DkvD>>>>>>>>>===>>?>>>>>>>>>>>??>?>>>>>>>>???????=X�X=@@:
																																					

					
+
+

????>Jjd@>?????>>>>>=>>>>>=>>>>>>>>?>>>>>>>>>>?>??????>Lb>?@?$																																						


			
+
+
%@???>TiW>>>?????>>>>>>>>>>=>>>>>>>??>>>>>>>>>>>???????>Gyi>?@A.																								
+														
+

+
+

+
+
+
+
+
,@????^kP>>>>>>>>>>>>>>>>>>=>>>>>>???>>=>>>>>>>>>??>>>?>Dui???@5
																							
+																				
+
+
+	
3@@@?D_gG>?>>>>>>?>>>=>??>>==>>>>??>>>==>??>>=>>>>>>>>>>CphB???;
																																										
+		
+
+	
7@@?>Nic?????>>>>??>>>>>>?>>==>>>?>>>==>>?>>=>>>>>>>>>??AghH>?@? 																																													
+			;@??>\pX>????????>?>>>>>>>>>>=>>>?>>>>=>?>>>>>>>>>>>>????YcS=?@@&																																													
+	
+	
>@??@hnF??>>?????>>>>>>>??>>====>>>>>>=>>??>>???????????@fa^>?@A,
+																																															
+
+!@@??Etg?@?>>>????>>>=>???>>>>>===>>=>=>>>???>>???????>>?>`gfB?@A2
																																															
+
+'A@@>Pz^>@???>?????>>>>>?>>>>>====>=>>=>>>???>????????>>?>KilG?@@8
																																													
+
+	
-A@?>^qW?@@????????>>>>>??>>>>===>>>===>>>??????????>>>>?@AiwL>@@;																																														
+
+
2A@@?hiW?????????>>>>>?????>>>===>>>===>>?????????>>>>>??@>`{S>@@<																																														
+	
5A@@Boh]>???????>>>>>>>????>>>=<=>>>===>>>?>??????>>>>>?@@>Z}^>@@>

+
+
+																																													
+
9A@?Hsm^>????????>>>>?>??>>>>=<=>>>>===>>>>???????>>>?????>Zug?@??

+
+																																															
+
;@@?RqrV>?>>??????>>>>???>>>>=<=>?>>>===>>????????????????=[nnA??@


+																																																=@@>ZspK???????????>??????>>>==>?>?>>>==>>?????????????>??>UssD??A 


+
+																																													
+
+
?=@>`umF@@????????????????>>==>>?????>==>????????????>>??@?LtvG??B#
	
+																																													
+
+
@<?>inpH??@@??????????????>>=>???????>>=>??????????>>>>????DsM?@A&

+																																														
+
+@?A?njwL??????????????????>==>???>????>>>>>????????>>???????j�R?@A'
																																															
+!@@@AsfyP>?????????????????>=>???>?>>???>>?????????>>???????>X�Z>@A(
																																													
+
+"@?@CvaxO>??@??????????????>=>??>>>>>>??>>>???????????>????@>P�b>@A)
+
+
+																																									
+
+
+"A@?FxiwE??????????????????>>??>>>>>>>???>>?????????>>>??@??>R�i=;A)
+																																											
+
+
+"A@?Iyv`>?????>????????????>>??>>>>>>>>??>?????????>>>??@@@?>Nsk>?A(
+
+																																										
+
+
+ A@>J{zL?@??>>>>???????????????>?>>>>??????????????>????@@@@?Ivn?@A(
+
+
+																																									
+
+
+
@?>J�uB@@?????>>>>?????????????>>>>>???????????????????@@@@?Gyp??A&

+
+
+																																										
+
+
@??I�n@@@???????>>??????????????>>>>????????????????????????K|q>?A$

+																																									
+
+
+>??H�p??@@@@???????????????????>>>>>???????????????>>>>????>O}p>?A!


+
+																																								
+
+
+=?>F�g@??????@?????????????????>>>>>??????????????>>>??????>Lvm=?A



+																			
+																					
+
+	9@>CzpI??????????????????????>>?>>>>?????????????>>???????@>Swf<??
																																										
+
+	6@??uxS>?????????????????????>>>>>>????>>???????>?>>>???@@@?b}_<?<

+																																												1@?=o�R>?????>>>?????????????>>>>>>>?>>>>??????>>>>>???@???Cn~W<@8
+
+																																										
,A?<a�R>@?????>>???????????????>>>>>??>>>?????????????@@??>Ml}M<@3


																			
+																					
+
+
$@?<U�Y>@@@@???????????????>>??>>>>>>??>>???????????@@@@??>Ul�D=@-


+
+																																								
+
+
+??=I�mB@@@@@???????????????>>>>>?>????>????????????????@@?Zqv=>@%


+																																											;?=@xxN>@@@@@@@???????????>>>>>>?>>?????????????????@???>Ohxb;>>


+																		
+																							3@><g}d?@@????????????????>>>>>>?>>>?????????>??????@???Big�L<>9


+																				
+																					
'@><RzoL>@??????>?????????>>>>>>?>??????????>??>????@@@>Xjmz>>?0

+																		
+	
+																					
+>>=Bvlf@???@??????????????>>>>??>??>?????????>??????@?BfY�]<>?!
+
																			
+	
+																					7?><hvk[>@@@@@@???????????>>??>>>>>>???@?????????@?@@>Rib�C=?9

																			
+	
+																					
*@>=L�]tN?@@@@@???????@??????>??>>>??????@???????@@@@Cke�c<>@(
+

+																		
+	
+
+
+																			
>>>=rzgk@@@??@@??@???@????>????????@??@?@@???????@@?`mu�A>?<	
																		
+
+	
+																					4?>=K�llV>@@?@@??@???@???????????????@@@@@???????@?Zsi�R<>@,

+
+													
+			
+
+	
+	
+																			
#@>><c�inE?@@@@??@???@???????????????@??@??????@@>Upe�h<>?<

													
+
+
+	
+	
+	
+							
+												
+;?>=@yg_?@@@@?@@???????????????????@????????@@>Rh_�y@=>@*

																	
+
+	
+			
+
+
+						
+
+						+A>><J�nqW>@@@@@@??@???????????????@???@????@?AZm_~�F>>?9

					
+											
+
+
+	
+	
+	
+																
<???<T�tq^D>?@@@?@@????????@?????@@???@@@@??Jdnd|�I=?>@#


																		
+	
+
+
+		
+																(@>?><\�trtaLA???@@@?@@????@???@@@@???@?>AN_led~I<>>A0

+															
+		
+
+
+			
+
+														
+6@>>=<Z�zgoxo]MD?>??@@@@?@@??@@@@@@@?>F[qvkbk�wG<>>A4
+
																	
+
+		
+	
+
+	
+														<@>>><R��k^ilprfVIA>>@@@A@??@@@???@J_sumUe��_@=??B2
+

+															
+
+
+	
+
+
+		
+
+
+														
>@???=Fl��vh`juzvlaPA??@@BECACHNZiqoebly�qL=??@A/
+
+
+															
+
+
+
+
+
+
+
+																
+

<A??@?>I`v�|g\\[\efYGOX[hnlllntsh\fsjN@???A?)

+
+
+														
+
+
+	
+
+
+
+
+
+
+
+													

2AA???>>ANfy�xoeYV[]q{{v^W``^Zerz|nYH??@?@B:!


+
+												
+		
+
+
+	
+
+
+
+
+
+
+	
+													
"9A@??????CRh{��vnn|��zdbdmv}|kVH@>?@@@A?.

+

+
+
+																
+
+
+
+
+
+
+
+
+														
+
+(:AA???@@??DSm����r}�����eL@>?@?@AA>2

+


+
+
+
+														
+	
+
+
+
+
+
+
+																	

"5>AA@@@@?>?GPQLFOfkkeTC=>?@@@AB;,

+



+
+
+
+													
+		
+
+
+
+
+
+																
+	
&4=AAA@?@?>=<<;:<===>?A@>>;3$


+



+
+
+
+
+															
+
+	
+
+
+
+																	
+
+
+
"/9?ABA@?>>????@@?>60.







+
+
+
+
+
+														
+	
+		
+
+
+	
+																	
+
+
+
%/7<>?=83./0*"
0<






+
+
+
+
+
+
+																
+		
+
+
+																		
+	
+
+
+
+


,KI/
+
+
+
+




+
+
+
+
+
+
+																	
+		
+
+	
+																			
+
+
+
+
+
+


+


A1




+
+

+
+
+
+
+
+
+
+		
+														
+
+
+
+
+	
+
+																			
+
+
+
+
+
+


	


		







+
+
+
+
+
+	
+																		
+
+
+
+
+
+																				
+
+
+
+
+
+
+
+

+	



+
+


+
+
+
+
+
+
+
+
+
+
+
+																					
+
+
+
+																		
+	
+
+
+
+	
+
+
+
+		
+
+





+
+
+
+
+
+
+
+
+
+
+
+																					
+
+	
+															
+
+	
+	
+	
+
+
+
+
+	
+
+
+







+
+
+
+
+
+
+
+
+																			
+
+
+
+																	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+

+
+
+
+	
+
+
+
+	
+																
+	
+
+
+
+						
+					
+
+
+
+
+
+
+
+
+		


+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+
+
+													
+
+	
+
+			
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+	
+	
+					
+		


+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+	
+
+		
+

+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+

+


+
+

+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			







+
+		
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+






+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+







+	
+		

+

+
+
+
+
+
+


+


+

+		
+
+
+



		
+
+	

+
+


+







+	
+
+



+
+		
+






+
+		




+	
+
+

								


+										



+		
+

+			
+	
	
+	
+
+				
+


+		

+		
+
+
+					
+

+


+		
				
+
+	
+
+			
	
					
+
+





+			
+			
+		
+		
+		
+
+








+
+

						




+
+		
+







				
+


+					
+
+
+			
	
+		




+	




+
+





+
+




+
+
+




+


+		


"&(&"

+
+			
+


+	

'/6;=>???>=<:9:974/%
		
+

!3<>>====>=>>>>>>>>>???<7."
			
3>?<<;8;<<;;<>@@><<<<===>>?>8)
	
+';>=;>JXag`]aedZMMTSHDB@?>>::;>?6


+
+-==;?NSSckbNDBQO. T�rkgd]SQL>:=?: 

+

+/>><D]O*

+	
+0I5.',6?VolN<;=:

				.=<<F]=		)&
+
	'Gg^>;>9		

+

+		

+=<<DjA
		
3	Pa@<>5
+
+
+			
+		
+#=;;?aH	
*
		
F[=<>0
+	
				
+
+				;=:<\L		
+	(		WV:<='
+

+
			
+
+
		
+		5>;9Y]
		
 )5<>@OR^a4
			'sP;<</:
	
					
+								0?=9Un1
		
+
8CDDEDA@@DCU]OJUP<76			
+J~I:<@A	
						
+	
+						
/<<>;R}B'BSJ?>===>>=<<;8;=>ADJVX/
	vyC;=4
+	
+		
+
+									
+	0>>=F}X
1KRJ?<==>>>=====<<===>==<>RR*
	
Z�q?<=#
	
+	
+
+
+										
+
	
+	:><Wq<)DIB<;=>>>>>>==>========>>>=<DM<

+
Qw�h<=9	
+						
+
+									
+
0@><Q`<6?G?=====>>>>>>>>>====>>==>>>>>==@GI7Wis}K:?)

													
+ ?=<<MbBLR>>>>>=>>>>>>>>>>=====>>>>>=>>>>>=Oth]lt[:=;

+						
+	6?;=<QagoB=>>>==>>>>>>>>>>=====>>>>>>=>>>>>;Mpbbha<9@)

										
+"@=<>>[[rV<>>>>>>=>>>>>>>=========>>>>>=>>>>>;Qrg]gA:=;
+
+															6?=>>C]WgC>>>>?>>>>>>>>>=======>===>>>>>>>>>>><GlcfK<;@'

	

																	
+?::?=QjeI=>>>>>>>>>>>>>======<==>>>>>>>>?>>>>>><HheZ<=?8


																			
+		
2?;<?>fqI<>>>>>??>>>>>>>>>======>>>>>>>>>>>>=>>>><]egA>>?


+																						
+				=>>?>I|Q<?>>>>>>>>??>>>>>=>=>=====>>>>>>>>>>>>>>>=NecN>>>0
																						
+											(@>>?=cl=>?>>>>??>?>>>>>>>>=>>=====>>>>>>>>>>>>>>>>@eo[=<8<
																						
+
+								
+
+	
7?>?>CxP<??????>>>>>>>>>>>>>>=====>=>>>>>>>?>?>>>>>=Ero@??@)
																							
+
+
+	
+
		
+
+									
+
+	>>>?>OrA>??>>>>>>>>>>??>>>>>==<==>>>>>>>>>>>>>>>>>??;LyL>?@7
																							
+
+


+
+





+									
+
	'@=??>Yi???>>===>==>>>?>>>>>>>===>>>>>>>>>>>>??>??>??>@xd=??>
																							
+				
+
+
+	
+

						
+

+
3?>??>[uD>?>>>>>=>>>>>>>>>??>>>>=>>>>>>>>>?>>????????>>sxB??@)
+																																	
+

+								
+
;?????ezG>>>>>>>>>>=>>>>>>>>>>>>>>?>>?>>>>>>>>>>?????><e�I>?@6
																																	
+
								
+

?>???AfuE=>>>>>>>>==>>>?>==>??>?>?>???>>>>>>>>>>?>????=Q�R>?@>																							
+												
+


+	
+			
+

%@>??>G_eA=>>?>>>>=>>=>>?>=<>>>?>>???>>=>>?>>>>>>>>>???>HzW>??@+																																					


+				
+
+
-@???>PaW>>>>?>>>>>>>>>>>?>==>>>>>???>==>?>>>=>>>>?????>Fxa>??@4
+																							
+													
+

+					
+	
+
3@????ZhO>?>>>>>?>>>>>>>??>>=>>>>?>>>><=?>>>>>>>>?>>>>?>Fth???@;
																																													
+	8@@??DdeE>??>>>>>>>>==>???>>===>>>>>>==>?>>>>>>>>>>>>>>>CniB??@?!																																											
+
+	<@??>Oha@???>??>>>>>>>>>??>>>===>>>===>>>??>>>>>>>>>>>??@_cH>??@*	
+																																												
+
?@??>\iX>???????>>>>>>>>?>>>>>=<<>====>>>??>=>>?>>>>>???A_^R>?@A.
+																																											

+	
+
+#@@??AfmI>?>????>>>>>>=>>>>>>>>><<=<=>=>>>??>>>>?????????@g`^>?@@3
																																												
+		
+
+)A@@?Fvi@@@>>????>>>=>>>???>>>>><;=<=>>>>???>>>>>??????>?>ZkfB??@8
																																															
+
/A@?>Sr^>@@???????>>>>>>?>>?>>>=<<<;==>>>?>?>>>>????>>>>??FopG?@?<																																														
+	
5A@?>`jX?@@????>>>>>>>>?>?>?>>>=;<<<<>>>>?>?>>?????>>>>>?@?fzM>@?>
	
+																																												
+
+
9@@@@jj[?@?????>>>>>>>>>>??>>>><;<=;<>>>>?>???????>>>>>??@>]}V>?@?

+
+																																											
+
+	<@@?Eqf^>@@????>>>>>>>>?>??>>>=<;<=;<>>>>>????????>>>>???@>Za>?@@"
+
+
+																																													
+>@@?Qth_>???????>>>>>>?????>>>=;<<=;;=>>>????>???????????@>Ysk?@@A%

+																																															
+
?@@?\op[>????????>>>>???????>=<;<==<<<=>>?????????????????>WlpC??A'
	
+																																													
+
+!@>@@gprP???????????>>???????>==<====<<=>>??????????????>??>SnqF??A*
	
+																																														
+$A:@BoopI?@???????>>?>??????>>>>=>>>>====>>?>?????????>>??@>NqvJ??A-	
+																																													
+
+&A?@BthpI??????????>>>??????>>>>>>?>>>===>>??????????>>?????Fs|Q??A/
+																																													
+
+
(A@@CwgyM>??????>??>>???????>==>>??>?>>==>??????????>>???????k�X>@A0
	
+																																											
+
+
+
*A@@FwbzS>??????????>>?????>>==>???>??>==>??????????????????>T�c>@A0																																												
+
+
+A@?Iw_{Q>?@????>?>????????>==>????????>==>????????????????@?J�m>?A1
+
+
+																																									
+
+
+A@>LvguE????????>>>>??????=<>??>>?>>???>=>????????????@???@?L~q?8A0
+
+																																										
+
+
*B@>Ozsa>??>???????>>??????<=??>>>>>>>??>=>????????????@???@?Lws@?A0
+
+																																										
+
+
(B?>RzwM>@?>>>>???????????>=???>>>>>>>>??>??????????????@@@@?Jvu@@B.

+
+																																										
+
+
%B?=S�qB?@????>>>>>???????>???>>>>>>>>>??????????????????????HuvA?A-

+
+																																										
+
+
+$B?=S�c?@@?@????>>>??????????????>>>?>???????????????????????Gwv@?B+

+																																									
+
+
+!A>>Q�^?@@@?????????????????????>>>>????????????????>>>>?????Gss??A(

+
+																																									
+
+

@?>MkG????>???????????????????>>>>?????????????????????????Ito>?A#

+																																									
+
+
+>?>HsQ>??????????????????????>>>>>>?????????????????????@@?Nzk=?A

	
+																																								
+
+
+<??DwoR>?????????????????????>>>>>>????????????????????@@@@>Z�e<??
																																									
+
+	9@?@tvL??????>???????????????>>>>>>>>?????????????????@????Afx]<?=


+																																										4@?=k|L>@@?????????????????>??>>>>>>>?????????????????@???>GfrT<?9


+
+																	
+																					
+
+
,A?<^�S>?@@@???????????????>>?>>>>>>>????????????????@@???>Jg�I=?3

+
+																																								
+	
$A><O�e???@@@@@@???????????>>>>>>>>>>>??????????????@??@@@@cs{?=@+

+
+																																								
+
+??=CzxK?@@@@@@@???????????>>>>>>?>???????????>?>>>?@???@?Jpvj;>@ 

+																																										9?>=l}d?@@@@??????????????>>>>>>?>>??????????>>>???@@???>cjS<>=


+																				
+																					/@><X{sI?@?@@?????>???????>>>>>>?>>???????????>?????@@@>Lpe~B=?6

																		
+	
+																		
+
+	
"@>=F|md??@@@@@????????????>>>>>?>>>>>???????????@??@@@>a^qg<>@*
+

+																		
+
+
+																				
+<>>=pquU>@@@@@@???????????>>>>?>>>>>>?????????????@@@?Fi^�K=>>
+
																		
+
+	
+
+																				2@><T�muD?@@@@@@??@???@????>>>???>????????????????@@@>]ewq=>@3

																		
+	
+
+																				
$@>>?}xsX>@@@?@@??@???@????>>>???????@@@??@???????@@>Qsi�J=>@ 	

+																	
+
+	
+			
+																	;?><T�nkD?@??@@?@@???@?????>>????????????@?????@?@?Itm�c<>?6
+
																	
+
+	
+							
+													.@>==r~kc?@@@@@@@@??????????>???>?????????????@@@?Dji}z@>>@"	

+													
+
+			
+	
+																				
?>=<H�ttS>A@@@@@@??????????????????@????????@@@?Chnx�J=>@5
+
										
+
+	
+	
+		
+	
+	
+
+
+						
+										7@>>;Z�ppJ>@@@@@@???@??????????????@???????@@@>Efpu�S=?>? 


						
+										
+
+	
+	
+	
+
+
+														
"@>?>=j�jhN@>?@@@??@@?@?????@????@@@??????@@??Omlp�[<>?@/

																		
+	
+
+
+																			5@>>>@s�iqn]J@??@@@@?@@????????@@@@@@@@@?>@J`rho�]<>>@:


															
+
+
+
+
+
+			
+
+
+													

>?>>=@q�g`t{o[I@?@@@@@@??@@??@@@@@@@@??I\msifz�[<>>?>

+

+									
+					
+
+
+	
+
+	
+
+
+
+
+													(A?>>=?j�o]Xnx{nTD@??@@@@A@??@@@@@@??Jdwxf\n�~O<??@>!

+

+											
+	
+		
+
+	
+	
+
+
+
+
+
+													
.A?>?>=]��lcb`q|vfVH@?@@A@??>>??AEPbqodegx�iC=??A= 




+														
+		
+
+
+
+
+
+
+			
+											/A@???>Hf��zh[^deisbGEHKQabYWXdnuslc`m}�oN>?@@A:




+
+															
+
+	
+
+
+
+	
+
+
+													'>A??@>=EWl}�ue[VZf_b{zziZ]^be`aan{}vcM?>??@A4
+


+												
+		
+
+
+		
+
+
+
+
+
+
+														
5A@??@?>?FVo�zlead���iYZ]`eluuaMB??@@@B=(
+



+
+																
+
+
+
+
+
+
+
+
+															
$9AA@??@??@K`z��}��z�}rux�|dNB?@@@@@B?/

+



+
+
+												
+
+
+	
+
+
+
+
+
+
+														
+	
$6 at A@?@@@?>BSiur[Wn����w]F??@@??AB=/
+



+
+
+
+														
+
+
+
+
+
+
+
+																	
+
.:@BA@???>>@>==?GMKE?=>?@@AA at 8'
+




+
+
+
+
+													
+
+
+	
+
+
+																		
+
+

 .8>ABA@@??>=<==>??@@A>95+






+
+
+
+
+	
+														
+		
+
+
+			
+														
+
+
+

%09?@AA@@@>=>??>8+/,






+
+
+
+
+
+
+															
+		
+
+		
+																	
+
+
+


"+01/'$,%

/9






+
+
+
+
+
+
+		
+													
+		
+
+
+
+																		
+
+
+
+
+






+
+
+
+


+

+
+
+
+
+
+	
+																	
+	
+
+
+																						
+
+
+
+


	





+
+




+	
+
+				
+
+
+
+																	
+
+
+	
+																							
+
+
+
+



	


+






+
+
+
+
+
+
+
+
+																						
+
+
+
+		
+																			
+
+
+
+
+
+
		








+
+
+
+
+
+
+
+
+
+																						
+
+
+																							
+
+
+
+
+		
+







+
+
+
+
+
+
+
+
+
+
+																			
+
+
+																	
+		
+
+
+
+
+
+
+		

+
+
+







+
+
+
+
+
+
+
+	
+															
+
+		
+
+													
+		
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+											
+
+		
+
+			
+
+					
+	
+
+
+
+
+
+
+
+
+		
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+										
+
+
+
+
+
+
+		
+		
+
+
+
+
+
+
+
+
+
+
+
+		

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
	
+

+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+



+
+

+
+
+
+
+

+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






+
+
+
+
+		
+

+
+
+
+
+
+
+

+
+
+
+
+
+
+	
+





+
+
+
+
+	
+
+










+
+
+





+
+
+		







+
+		


+
+		
+


			
+						
+



+							
+
+		

+



+	
+
		
+	
+	

+	
+
				
+	
+	
+		
+
+		
+
			
+					
	
+	
+	
+					
+


				
	
+			
+




+			
+		

+			


					
+











+		

+				
+
+









+		
	


+
+
+
+


+			
+
+



+


+		


+
+
+				
+
+





+		
+






+
+








+
+
+
+
+
+		
#).267631,((((%!


			

+
+
!/9<????>>??????????=8/$
+
 4??==9;;<<<==>==>===>>???<5(
		
.<><;BLSWUPJIJJJJG@><<<<==<;>@;)
	7><;DS[]fxurxyoW@>]fW]YXWTOKD;;>>3
+	$;><=UY9 #.*(+.#
+KUF6AG:.8S`G:<=5		
$;=<>_T
		

+			
+
+

+
)b{Z<<>4

+
		
 ;<<>gZ				 		/g]=<>2
+

	
+

	
9<;;ak			.		\Z<<>+
	

										
		
5=::Uo(		)
		YO;<<!
+	
			
+
+
+
+

	

+?<9Kp7		
+

+$			&iE;<8


								
+
+
+	
+	
+
 <=:BqH		
)5=<9AGBJ_C
			
Qm>;=6=0
+
															;><?o\		
+
7AFIIEA?@ACOPPJL at .,&		
+
rb;<=E*
+
+
				
+
+						
+			&0>>=ku,	<VJ?>=<==>===;:;=?CFLTJ,	
V�Y:=;
+
+
	
+
+							
+				!D=><R�K	0ELOC<==>>>>====<========BRS2
^��S;>-
+
															

(?><^k62GIB=:<===>>>==========>>>>==CLI6)5K^�|F<>

+						
+
+						
+	
+:><<S[97CF?=====>>>>>>>=>=====>>>>>>>>>=>E]aAHkzU:?3		
+
+
+			
+					
+
.@=<=LbEUM=>>>===>>>>>>>>>====>>>>>>>>>>>>=AhQ;dnY;<?

												=>===L^fk>>>>>==>=>>>>>>>>======>>>>>>>>>>><CePceZ=<@2														
+
/@=>>=UUjQ=>>>>>=>=>>>>>>>>=======>>>>>>>>>>><Dku]dA=>>


+															=>=>>@ZTkB>>>>>>=>>>>?>>=======>>=>>>>>>>>>>>><@cg`H=>?0

	

																		
+

+
+	

+
+
-?:=?=LlmM=>>>>>>>>>>>>>=========>>>>>>>>>>>>>>>=@cdV<?>=
+

																	
+
+
+
+



+	
+


+		;=7=?=d�P<>>>>>>?>>>>>>>>========>>>>>>>>>>>>>>>>=Oab?>>?)
																			
+
+
+
+
+								
+	$?=>?>FzW;>>>>>??????>>>>>>=========>>>>>>>>>>>>>>=LaeH>>>8
																			
+

+
+											
+		
3?=??=^h<>?>>>>?????>>>>>>>>>>======>>>>>>>>>>>?>?>EhcV=?9?!																			
+		

											
+		==<??AnL<??>????>>>>>>>>>>>>>=====>=>>>>>>?>>>>>>>>=Tug??9>3
+																							
+
+
+
+
+											
+
+		#@=>?>Io@>????>>>>>>>>>>>>>>>>====>>>>>>>>>>>>>>>>>>><YyI>??=
																						
+		
+		
+



											
+
+	
+0@=??>Qn?>?>>>>>>>>??>>>>>>>>>>===>>>>>>>>>>>?>>>>>>>=@x_>??@$
																					
+
+


+	
+



										
+
+9?>??>UuG>?>>>>>>>>>>>>>>>>?>>>>>>>>>>?>>>>>>>???????><ktA??@0
																							
+
+					
+
+


+								
+
>>???>YyM=>>>>>>>>>>>?>>>=>>>>??>>??>>>>>>?>>>>>>>????;]yF??@:																																		


+								

#@>????awH<>>>>>>>>>>>>>?>==>??>>????>>>>>>>>>>>>>>>>??<P|K????$																							
+											

+
+								
,@>???CchC<>>>>>>>>>>>>>>>><>>??>>???>=<>>>>>>>>=>>>>??=JzP>??@.
+																						
+											
+

+								
+
4@???>LaW>=>>>>>>>>>>>>>>?>==>>>?>??>><=>?>>>=>>>>>>???>GsX>@?@8
																																				
+
				
+				
+9?@???V`P>?>>>>>>>>>>>>>?>>====>>>?>>==>>??>>>=>>>>>>>>>Kn\????=																																							
+
+					
+
+=?@??DbaE>??>>>>>>>>==>?>>>>>>=<=======>>?>>>>>>>>>>>>>?Cb_A???@&																							
+																				
+
?@??>OdcB???>?>>>>>>>>>>>??>=>=<<=<=>=>>>??>>>>>>>>>>>??BY`G???@.
+																																												
+$@????Za_????>>>>>>>>>>>>>>>>>>>=<<<==>>>>?>>=>>>??>>???>EkaP>??@3
																																										
+
+			
*A@??AblQ?????>>>>>>>>>>>>>>>>=>=<<<=>>>>>??>>>>>????????Aic\>??@8
+																																															
+
1A@@?GqoE???????>>>=>>>?>>>?>>>><;<<=>>>>>>?>>=>>???>>>>?>VpeA??@<
																																															
+
7A@?>UvhA@????>??>>>>>>>>>>?>>>><<<<=>>>>?>?>>>>>??>>>>>??DoqF?@??
																																														
+	;@@??eoe@@????>>>>>>>>>?>>>?>>>=<<<;=>>>??>>>>>???>>>>>>?@>cwM>@?@"

+
+	
+																																									
+
+	>@@?Dsjb@@????>>>>>>>>>>>>??>>>=;<<;=>>>???>?>>>??>>>>???@>[yW>@@A%
+
+																																												
+
+ ?@@?Pwab@@?????>>>>>>>>>>???>>==;<=;<>>>>>????>??????????@>Yzb>?@A'

+
+																																												
+
+#A@@?]t_d?@@?????>>>>>>?>>????>=<<==;<=>>?>????????????????>[pj@?@A+
+
+																																													
+
+'A@@@gofe??@??????>>>>>??????>>>====;<=>>??>???????????????>XimD?@A.	
+
+																																													
*@;@Bonn\>?????>>?>>>>>???????>>>>>=;;==>?????>>?>??????>>?>QoqG??A1
+
+																																														
-A>@FtfqQ?@????>>?>>>>>??????>>?>>>=<<==>????>?>??????>>>?@?MtwL?@@4
+
+																																											
+
+
+
.A@@Gu^qK??????>>?>>>>???>???>>>>=>==<=>>>??>?????????>????>IrvV>@@6
+
+
+																																											
+
+
0A@?Hv\yI???????>>>>>>???????>>>==>>===>>>>?????????????????@n_>@@6
+
+																																											
+
+
2A@?Lye{K>??????>??>>>?????>>>>>>>?>>>>==>??????????????????>U~i>@@6
+
+																																										
+
+
3AA>RvcxG??????>>?>?>>?????>>=>>>?>??>>==>>???>??????????>???I|r?@A7
+
+																			
+																					
+
+
+
3A@=Uwin@??????>>>>>>>????>>==>???????>=<>>??????????????>?@?IzwA9?7
+
+
+																																									
+
+
2A@=Yws^>?????????>>>>>????=<>?????????>==>?????????????????>G|zB>@6
+
+
+																																								
+
+
+
0B?=\vrI??????>>?????>????><>???>>??>???>=>???????????????@??Ex|B?A4
+																																											
+
+
.B?=]~c@@@????>>>>>???????==???>>>>>>>>??>>?????????????@@@??Cp|C?A3
+
+																																									
+
+
+
*B?=]�`?@@??????>>>>??????>???>>>>?>>>>??????????????????????DhvC?A1

+
+																			
+																			
+
+
+
'A?=[�jC@@@@?????>>??????>?????>>>>>>>??????????????????>????FiqA>A.

+
+																																								
+
+
$A?>V|oK?@??????????????????????>>>>?????????????????????>???Gln?>A*

+
+																																								
+
+
 @?>O|nT>????>>?????????????????>>>>?????????????????????????Isp=>A%

+
+																																								
+	
+
???IylT>???????>???????????????>>>>>??????????????????@@@@@>Qzk<>@

+
+																																							
+
+
+=?>CwqN?@????????????????????>>?>>>>>?????????????????????@>`�d<>?

+																																							
+
+
+9@?>r|K?@@@????????????????????>>>>>>>??????????????@??????@fX<?<


+
+																	
+																					
+
+3@><d�Q>@@@@@??????????????>>>>>>>>>>>??????????????@@????>Rv�L=?7

+																																									
+
*A><S�`>????@@@@???????????>>>>>>>>>>>>????????>?>??@?@@@@?bo}A=@0

+
+																																						
+
+	
!A>=FzlG??????@?@???????????>>>>>?>>>>????????>>>>??@??@@?Bmtp<>@&

+																																								
+
+=?>>qt_?@@@@@?@@??????????????>??>>>>>???????>>????@@???>Qv�Y<>?


+																		
+	
+																			
+	5@>;`xJ?@@@@@???????????????>>??>>>>>???????>????@@@???Blr�F=?:


+
+																
+	
+																		
+		
*@>=L�ug?@@@@??@??????????????>>?>>>>>???????>???@@@@@@>Vksp=>@/


+
+																	
+
+
+																				
+
?>>?wx|M?@@???@@??@???????????????>>>???????>??????@@@Af_�T<>@	

+																	
+
+	
+
+
+																		9?><[�re?@@???@@@@??????>????????????????@??????????@>Sqq{?>?:
+
																		
+	
+
+																				
-@>=C�vvL?????@@@@????@??????????????????@@????????@?Hvj�U<>@*

+
+																	
+
+	
+																				

>>><^�th@?@@@@@@@????@??????????????@????@????@@?@@Akr}q=>?=	

+																			
+				
+																7?>=@}vgR?@@@@@@?@???@@???@?????>???@?????????@@@@?_su�G=>@-

+
+													
+
+
+
+	
+	
+					
+		
+											(@>=;R�oqG?A@@@??????@@???????>>????@????????@@@@>Wvo�U<>?<	

+											
+
+	
+
+	
+	
+
+
+
+								
+
+								<?>><j�unB@@@@@????@@@???????????@@@?????@?@@@@?Usl�c=?>@)


													
+	
+
+
+
+	
+										
+								,@>?=Az�ugD>>?@@??@@@@@??????????@@@@???@?@@@>Carh�m>>>@8	

											
+		
+
+
+
+	
+
+
+
+
+	
+
+													
+;?>>=H�{npbRD??@@@@@@@@???????@@??@@@@?@@@>ASpsj�q@>>?>


+
							
+	
+		
+	
+
+	
+
+
+
+
+	
+
+			
+											&@>>><J�ygq}wePC?@@@@@@@@?@@??@@??@@@@@??GZpxll�o@>>>@)

+
+															
+	
+	
+
+
+
+
+
+	
+												
+3A>>><J~~dciuzs_H??@@@@@?@@?????@@@@?@Mhzvfgu�d>=??A/	


+												
+
+
+
+
+	
+
+	
+
+
+
+		
+											
9A???=Fv�u^U_fwxdMB??@@AA@>>???>>?BNfxse]e��V=>?@A0	


+											
+			
+
+
+
+
+
+
+
+
+	
+													:A???>@\��wf^^dsunbKABBDIVRHIKQ[fqvp__my�hE=??@A,
+


+
+														
+
+
+	
+		
+
+
+														
+
5A@???=C[x�~rc_ZZgicblrtifejqnlhdckw�|hK>???A>&	


+
+
+										
+		
+
+
+		
+
+
+
+
+	
+													
++?A??@?>AK]s~ypd]Wcaw�sRRVZ[[^cuziUF??@@@A7


+


+
+
+															
+	
+
+
+
+
+
+															
+
3 at A@????>BNc|��vrt���nhemq|�|hTF@??@@@B<(
+
+


+
+	
+												
+	
+
+
+
+
+
+
+															
+
+ 5 at A@??@@>>DXp���yn������}_G@?@@?@AB=-

+



+
+
+													
+
+	
+
+
+
+																			

0=AA@?@@?=>FMNGHTdhg^PB=?@@?@BA8'






+
+
+
+														
+
+	
+
+
+																			
+
&5=AA@@@@?>==<;:;<==>??@@@<1 






+
+
+
+	
+														
+		
+
+																				
+

#.9?AAA???>??@@@AAA>7, 







+
+
+
+
+
+														
+		
+
+
+	
+																
+
+
+
+



&/6<>?@?<<<<93(23







+
+
+
+
+
+
+															
+		
+	
+	
+																
+
+
+
+






 "

')	
+




+
+
+
+
+
+																
+
+		
+																			
+
+
+
+
+





+



+
+
+
+




		

+
+
+
+
+
+
+
+																		
+
+	
+																					
+
+
+






		










+
+

+		
+
+	
+																		
+
+
+
+
+																				
+
+
+
+
+
+



	
+







+
+
+
+
+
+
+
+
+
+
+																					
+																					
+
+		
+
+
+
+
+
+







+
+
+
+
+
+
+
+
+
+
+
+																	
+		
+
+																				
+
+
+
+
+
+
+	
+









+
+
+
+
+
+
+
+
+
+
+														
+																					
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+														
+
+			
+										
+
+
+
+
+
+
+
+
+
+
+
+	

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+										
+
+	
+
+
+
+	
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+				
+		
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			




+
+	
+

+
+
+
+


+
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	

	
+
+
+



+
+

+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+		




+

+

+
+

+	
+



+
+
+





+
+	




+
+



		
+








+	


+	
+




	
+		
+
+
+			
+

+
+	
+



+					
+
+

+		
	
+



	

	

+		

+


+			
					
+	
+		
+				
+
+		
+
+		
+

+	
+		
+						

								



	
+	
							
+




		
+
					




+
+	
+

+
+





+		
+
+
+
+			
+
+		
+




+	
+




+	



+
+


+		
+







+						







+
+
+			
+






+
+					
+		
+
$-48:<=>>=<:889873.$
		
2<?>=>===>?>>>????????<5+


/=?=;<>CCBA??>>?==>=<<<<=>>=8(
		
+&:><;DYm|~vgc_VWRKPLEIJJKLKF=<?@9!
	
/==:@WcVFEHXWG</&
88$E]]XRPPVN;;=<&

2==;I^=


"

+
QmF;==(

5=<:O~@			,`|P<>='

+
+

+

+	
+
3=;;LrI	%1			
4qQ;==#
+		

					
		


+
->;:Gn:
+		"/			0hF;<:	
+	
	
+

+				
+

+
		

"=<:?oR		,		2b@:<3
+
+					
+
+	
+	
+

+
+9><9dk 				



)				
T^;;>(

											
+
.>=9Tx4
+			

.=B<;CFACVA
			%rN:<;9B
+
									
+
+(?>;M~M		/>HSRI@?@@ENJMQQ;!
			TzC:=B9	
	
+														
+6?=C|h*		/NK@><;<=>===<;<=AGJIG<'
)O�t?<>#	
+
												
+
+	9C=?<_{E
"3FNE==>===>>======>=<=>@HTP:&%/?J^�m>=5
+
								
+
8>==ed58DFHE<;==>>>>>======>>====>=<AJOUVB9:k�R;?'
												
+
+>=<=V[88EE?>=====>>>>>>=======>>>>=>>>===?RY;9[v\<?:
+
+									
+		
8?=>=JcEPF>>>>>>====>>>>====>=>>>>>=>>>=>>><VW7LnW<>@'
														

+&@==>=G]kb=>>>>>>>>==>>>>>======>>?>>>>>>=>>>?\SQi[==?9			
+							
+					
+9>=>><L_rN=?>>>>>>>>=>?>>>=>=====>>>>>>>>>>>>=<Wxib@>>@%

																			
+
+	
+
+&?==>?<Yhl@>>>>>>>>>>>>>>>>>>======>>?>>>>>>>>>=<VmbF>>?8
+				
+															
+




+
+
+

+	
+	
+7><>?>EgsQ=>>>?>>>?>>>>>>=======>>>>>>>>>>>>>>>>>=bmP=?=?"



											
+		
+

	
+
+

							
	
+	?;7>?=Z�_=>>>>?>>?>>>>>>==>>======>>>>>>>>>>>>>>>=Kj\=?=?2
																



										
+
+
0?7:?>Ayq@>>>>>??????>>>>>>>>>======>>>>>>>>?>????=MafC>??=
+															
+


														
+		;>8>?>StA<?>>>??????>>>>>>>>>>=======>>>>??>>>?>>>=NhcO=?>@*
																		
+


																
+		?;8???dU:????>????>>>?>>>>>>>====>==>>>>??>>>?>>>>>?bg]>?<>9
																				
+

	
+											
+
+		
+- at 6;??CkE<????????>>>???>>>>>=====>>>>>>>?>>>>>?>>>>>AdoE?>=?

																									








+										
+
+
+
+7?;>??IpE>???????>?>???>>>>>>>>===>>?>>>?>>>>>?>>>>>?<G{Y>?>@)
																							
+







+
+											

=>????JsR>???>??>>>>>>>>>>>?>>>>>>>>?>>>>>>>>>>>?????>=og???@6
+																						
+
+






+
+										

@>?@?>NzX>?>?>>>>>>>>>>>>=>>>>?>?>?>>>>>>>>>>>??>>????;`oA???>
+																						
+
						
+
+

										

(@>????WrQ=>>>>>>>>>>>>>?>==>>>?>?>??>>==>>>>>>>>>>>>??<VtC???A(
																						

+								

										
1@?@?>D`dH<=>>>>>>>>>>>>>>>==>>>??>>>><<>?>>>>>>>>>>>>?=T{I??@@2
																						
									
+


+		
+					
+
8??@?>MgV?==>>>>>>>>>>>>?>>>==>>>?>>==<=>>>>=>>>>>>>>>>=MvQ>??@;																							
+											

			
+					
+<?@???YgQ>>>>>>>>>>>>>>>>>>>====>>=====>>??>>>>==>>>>>>=LlT>@???"																																									
+				
+
+
?????DgcF???>>>>>>>>>>>>>>>>>>===<;=>==>>??>>>>>=>>>>??>Hc[???@@*																																												
+
+
+#@?@?>OcgH???>>>>>>>>>>>>>>>>>>==<<<=>>>>?>>>>>>>>>>>???>Nf`D???@1
																																													
+
*A@@??Y]iC???>>>>>>>>>>>>>>>>>>>=<<=>=>>>?>>>>>>>>??????>ImaO>??@6
																																													
+
+
0A@@?Ais`?????>>>>>=>>>>>>>?>>>>=<==>>>>>>>>>>>>>>>??????@ie[????;																																														
+
+
7@@@?LyzT?@????>>>>>>>>?>>>??>>>=<<=>>>>>>>?>>>>>>??>>>>?>Toe@???>
																																														
+
+
<@@@?^�M@????>?>>>>>>?>>>>???>=<<=<>>>>?>>>>>>>>??>>>>>??CpoE?@?@!
+																																													
+
+
?@@@Br�I?????>>>>>>>>>>>>>??>>=<<<<=>>>>>>>>>>>???>>>???@>csL?@@A'

+																																											
+
+
+"@@@?K}ksF?????>>>>>>>>>>>>???>>=<==<=>>??>?>>>>>>???>????@>ZyW>@@A+

+
+																																										
+
+
+'A@@?VdoD@??>??>>>>>>>>>>>???>>>=>=<=>>??>?>?>>>???????@?@>Zwc?@@A.
	
+																																											
+
+
,A@@?]|imB@??>???>>>>>>?>>????>>>>>><==>>>????>>>>?????????>`lk@?@A1
+
+																																													
+
0@=@@gwji@@@????>>>>>>>?>>????>>>>>>==>>>?????>>>>>>???????=]knC?@@4
+
+																																												
+	
4@=@Bmvv_?@??>>>>>>>>>>??????>>>>>>>=>>>>????>>>>>>>????>??>QutE?@A6
+
+
+																																											
+
+
6A@@GvhuS?@??>>>>>>>>>>???????>>>>>>>>>>>?????>>>>>?????>???JtxO>@@8
+
+
+																																											
+
+
6A@?KzeuI?????>>>>>>>>??????>>>>>>>>>>>>>??????>>>??????????Grt\>@@:
+
+																																										
+	
+
+
8A@?LwapB???>??>>>>>>>??????>>>>>>>>=>>>????????????????????Anvf>@@;

+
+																																											
+
+
9AA>Uvde???>??>>>>>>>>??????>>>>=>>==>>>>???????>>>???????>?>Uvm???;
+
+
+																																								
+
+
+:@@>_uo`>@??>>>>>>>>>>>?????>>>>>>>>==>>>>???????>>??????>???GvuA>><

+																																									
+
+
+9@@>bwxX>?????>>>>>>>>>?????>>>>?>??>>>==>???????????????>?@?Dx}C;><

+
+																																								
+
+
+9A@=exuK??????>>>>>>>>>????>=>>???????>==>????????????>>>????@u�C?@;

+																																										
+
+8A?=ez^A@????>>>>>>>>>????>==>?????????>=<>???????????????@???m�E?@:

+
+																																									
+
+
5A?<g}^?@@????>>>>>>>>???>=<>???>???>???><>???????????????@@??n�E>A8
+
+																																								
+
+
+
1A?<g~lA@@@?????>>>>?????>=>???>>>?>>????>>??????????????????Ar�E>A6

+
+																																							
+
+
+
.A?<exnD@@@@@@????????????>????>>>?>>>???????????????????????DtzC>A3

+
+
+																																						
+
+
+
+A?=`knM?@????????????????????>?>>?>>>???????????????????????GciB>A/

+																																								
+
+
+
'A>>YrkW>??????>>???????????????>>>>???????????????????????@?Ikk@>A*

+
+																																								
+
+
"A?>P{iX>?????>?>????????????????>>>??????????????????@??@@@>Mp=>A$

+																																								
+
+

??>G~tQ>@@?????????????????????>>>>>??????????????????????@>R�g;>@



+																																						
+
+
+=?>?w}M?@@@@?????????????????>>>>>>?>>?????????????????????Bj�\;>=

+
+																	
+																				
+
+
+7@><k�P>@@@@@??@???????????>>>>>?>>>>>>???????????????????>Qr�O<?:


+																																							
+
+
+/A>;[�\>@??????@????????????>>>>>?>>>>>>???????????????@??>[gxD=@3



+																																							
+
+
&A><L�mC???????????????????????>>>>>>>>>?????????????@@@@@?`op==@+	

+																																							
+
+
+?>=Ax}]?@@????????????????????>>>>>>>>>??????>?????@@??@?Dp�^<>? 	

+
+																	
+																				
+		:>><g}wI?@???????????????????>>?>>>>>>>??????>??@??@@???>[v�I=?<	

+
+																		
+																					0?=<Q{tb>@@?????@??@????>?????>>>>>>>>??????>????@??@@@?Korv>>@3



+																	
+
+	
+																			
"@>>A{yvD@@?????@@@@?????>?????>?????????????????????@@>er�Z<>@%	

+																				
+																					<>>;bz\>@@@???@@??????>>?????>>>???????@?????@?????@?Lxs�B>?=

+																	
+	
+
+	
+																	2@>=G�wvE@@???@@??????@?>??????>>????????????????????Bpo�^;>@1
	
																	
+
+	
+
+		
+	
+														
"@>><g�yZ>@@@@@???????@????????>>?????????@????@??@@>_lj|?>??

+
+																	
+	
+		
+																		:>==F�ypF?@@@???????@@??>?????>?????@????@???@@@@@>Uyo�O<>@4	
+													
+
+
+
+	
+	
+
+						
+												-@=>;_�sfB at A@???????@@????????????@?@????@???@@@@?Oxq�a<?>?

+
+
+										
+
+
+		
+
+
+	
+
+	
+			
+													
+
>?>=?w}piA@@@@@????@@@???????>??????@????@?@@@@>Jng{m>>>@1
+
												
+		
+
+	
+	
+
+
+							
+
+								1@>><G�pva@?@@@@@??@@@@??????>?@????@???@@@@@?>QlbzxC=>?<
+

													
+
+
+
+
+	
+
+
+
+							
+								
>?>><R�opgRD??@@@@@@@@@@???????????@@@??@@?>Fauc|~G=?>@%
	
+						
+
+		
+			
+
+
+
+
+
+
+	
+
+
+		
+											,@>?><X�ngsxgRD??@@@@@@@@??????????@@@@@?@Jbwsf~zG=??A1
+

											
+				
+
+	
+	
+
+
+
+
+
+												
9@>?><Y�lZhrys_J??@@@@@@?@@????@@@@@A?AQjysii�uD=>>A7
+
+

+											
+
+		
+
+	
+
+
+
+	
+
+
+	
+											
=@?>><U��g]`ftxeL@>?@@@@BA??@@@@??>AMhzrcWt�j@=??A9
+
+

+													
+	
+
+
+
+
+	
+
+
+
+
+												
+">@???=Jq�|fW_bpvj[KB@?@ADIFBAAELS_jml_cl�~U=>??A7
+


+												
+		
+
+
+	
+
+
+
+	
+
+													
+ <A??@>>Mp�oa[^fenkib[dmmhdfgnprpfciv�}aC=@?@A2	


+
+													
+	
+
+		
+
+
+
+
+
+														
6A@?@?>?Ohzxh_X\cy{y|yg]Z\`^WYfq|s\E>?@?A?*
+


+
+
+
+											
+		
+	
+
+
+
+
+
+													
+	
'<A@????>DTj{�}voy����xpeehn{�|n[I@>?@@AA6

	


+
+
+
+
+										
+
+
+
+
+
+
+
+
+
+														
+	
+
,=A@????>>EWq�������������z]IA????@AA9%

+


+
+
+													
+		
+
+
+
+
+																	
+
,<AA@????>>HXdcekpnryjTB>?@@?@B at 6%

+



+
+
+
+
+													
+
+	
+
+
+		
+														
+	

'8?AA@@@@?>==BCAD???==>???AA?2





+
+
+
+
+															
+		
+
+																		
+	
+



*6>ABA@???>====>?>?@A?;4)






+
+
+
+
+
+														
+		
+
+
+																	
+
+
+






&29>@A@@@AAAAAA?9..%
+





+
+
+
+
+
+	
+													
+	
+
+	
+																	
+
+
+







$.4798642,%

77





+
+
+
+
+
+
+	
+	
+													
+
+																		
+
+
+
+
+
+















+

+
+
+
+
+
+
+
+
+
+															
+
+
+
+																				
+
+
+








	
+









+	
+
+			
+
+
+
+																		
+
+	
+																			
+
+
+
+
+






+	
+







+
+
+
+
+
+
+
+																							
+
+
+
+
+															
+
+
+
+
+
+
+
+
+


	
+



+
+


+
+
+
+
+
+
+
+
+
+
+																	
+		
+																	
+			
+
+
+
+
+
+
+
+	
+







+
+
+
+
+
+
+
+
+
+
+
+															
+		
+												
+			
+
+
+
+
+
+
+
+
+
+
+		

+

+

+
+
+

+
+
+
+
+
+
+
+
+
+	
+													
+
+	
+												
+
+	
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+												
+
+	
+
+
+		
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+		

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+						
+	
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	







+
+
+
+
+
+

+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+


+	
+



+




+



+
+	
+

+
+
+
+
+
+
+
+


+		
+
+
+




+
+	
+







+
+	


+		




	

+
+	

	



+					

	
+



+		
+
	

+			




+
	
+

+	
+				



+	
+
			

	
+	
+


+			
+
+
+
		
+					



+		
+
+
+								
+




+		

+
		


+			
+
+
+


+
+


+

+
+
		





+
+		


		



			
+		
+
+
+
		





+		
+






+		
+


			
+






+
+
+					
+
+
+
+



+
+	




		
+						

"%(+-,($!!" 

+			
(3:=>>??????????>>=91'

				
-;??=:<<<========>>=>>??=7,

+	
+	
+&9>=<<ANYVSSPKJHHDABA?>>?=<=?>6"					
2>><=Nfz�hF6?D>OF=UWFKUkpkeZF<<?>.	
+!8==:F`cD13

	
+

!
&D at -4Nc_E9<>4
+$;<<;Xi5	
+
+		 	
0w^<<>7	
%<<;=ZvF
+				8&			8xh><=6		



	
+
+
+
"<<:=XK!	*=				mh<<=4	

+					
+




+
;=;:UJ:			
e[;;=,



+		
+				
+
+




+
4><9Pe$			0
			#mP9;= 
	
							
+



+%><:BwM	



	/
			
+ at sB:=7

				
+
+9><<oq(			
):D?=GOMHU1		
+	
%lg9;>7J#
									
+2?=;a~C			%:K\^OB?@BKNHHE>%		
+$=`�V9=?9	


+
+											

>==R�\$
#<DA?=<<=>=<;;;<>CHF=1#
9BLx�N;>)
+
+

													B>==>puC
+ 9GB======>>>=======<>ACDMOJEB<88Cu}D=;	
+									
+
/?<<@m^6
 6>FQSD===>>>>>>==>==>===>==>=@L^\J;:8P�^=@/

+									

*?>>>X[7<ED at AA>=>>>>>>>========>====>>>==;>FL>8Fo\<?>

															

=>=>>Ha?IC>>>>>>=>>>>>>=====>=>>>>==>>>>>>>=J]=@mT<=?1																
+
+	

2?=>?=BakY=???>>>=>=>>>>========>>>==>>>>>>>><QcYlW>>>>

+																	
+
+
+
+



+		
+
+
>==>?=CdrH=????>>>=>=>>>>>>>====>>>>>>>>>>>>>=;Kqtc??=@/																					

+

+	
+

+
+

+
+
+
+	

0?<=>?<Ooc=>>>???>>>>>>?>>>>>======>>>>>>>?>>>>>;HqpC?>=<
+																	



+

+			
+									
+==;>>??_wO=>>>??>>?>>>>>>>======>==>>>>>>>>>=>>>><^K>?=@)

+
+																			
+




											
+	
+	
+
+)@==>?>Lmi@>>>>>?>????>>>>=>=>=====>>>>>>>?>>>>>>>=KxW=???8
+													


		
+												
+
+
+7?<=?>?e~N=>>>>>?>???>>>>>>>>>>=====>>>>>>>?>>????=Qk`@??>?!

+														
+

+
+		
+													
+		
+>>=>?>GzW<?>>>??>>>>>?>>>>>>>>=======>>>>>>>>??>>>=VhbI>??@1
																			

				
+														
+	
+)@>>>?>Wl=>?>>>?>>>>>>?>>>>>>>====>=>>>>>>?>>?>>>>>=CggV>???<
+																				
+
+
+															
+
+
+5?;>???aW;???>>???>??>>?>>>>>=====>>>>>>>?>>>>>>>>>>=JheA??;?"
	
+																				


+		
+
+
+
+											
+

<=6>??AfY=??>>>>??>>?>?>>>?>>>>===>>>>>>?>>>>>>>?>??><S|N>?;?/
																						
+







+
+	
+										
+


?=>???Agg@??>>??>>>>>>?>>>>>>?>>==>>??>>>>>>>>>>?????=B{`????:
																							





+
+												

&@>@??>GpiA??>>??>>=>>>>>>==>?>>>>>>>>>>>>>>>>>>???????=lc????@


																							

+
+

+


+									
+
.@>@?>?Xk]>>>>>>>>>=>>>>>>==>>>???>>?>><=>>>>==>>>?????<df????A+
																						

			
+

										
+5@?@?>CdcO==>>>>>>>=>>>>>>>==>>>?>>?>>=<>??>>=>>>>>>>>?=akB??@@6																						

						

										
+:??@?>Ms`A===>>>>>>>>>>>>>>===>>?>>>>==>>?>>==>>>>>>>>>>ZmH??@@=
+																						
+								
+
+
+
+							
+
+>?@???buT?=>>>>>>>>>>>>>>>>>====>>====>>>>>>>>>==>>>>>>>NhM>???@#
																																											
+
!@?@??CquM>??>>>>>>>>>>>>>>>>>>>===<=>>>>>>?>>>>>>>>>>??>RbV????@,
																																												
+
+
'A?@?>LpuQ>??>>>>>>>>>>>>>>?>>>>=<<=>>>>>>>>>>>>>>>>>???>WjbB???@4
																																												
+
+
.A@@@>[joH???>>>>>>>>>>>>>>>>>>>>=<=>>>>>>>>>>>==>>>????>MkfL???@9																																													
+
+
5A@@?DutjA@???>>>>=>>>>>>>>>?>>>=<==>>>>?>>>>>>>>>>??>>>?BggX>???=
+																																													
+
+
;@@@?V�z`?@???>>>>>>>>>>>>>???>>=<==>>>>>>>>?>>>>>??>>>>?>Sgb??@??

+																																												
+
+
+
>@@@@i��Y????>>>>>>>>>?>>>>??>>>=<==>>>??>>>?>>>>??>>>>???EgjC?@@@$

+
+																																											
+
+"@@@@Cv��S?????>>>>>>>>>>>>>>??>=<====>>?>>>>>>>>>??>>????@?bpK??@A+

+																																											
+
+
(A@@@I{yzN???>?>>>>>>>>>>>>>???>>=>><=>>??>>>>>>>>>???????@>]wW>?@A/
+
+																																										
+
+
.A@@@O~vxI??>>>?>>>>>>>>>>>???>>>>>>=>>???>>>>>>>>>???????@>]qc>?@A2
+
+																																										
+
+
+
3?>A?W��tC???>>>>>>>>>>>>>????>>>>>>>>>????>>?>>>>>>>??????>dfk@?@@5
+
+																																												
+
+
6><A at c��g?@??>>>>>>>>>>?>>???>>>>>>>>>>>>????>>>>>>>>??????>csmB??@7

+																																													
+9@@@Cp�U?@???>>>>>>>>??>????>>>>>>>>>>>>???>>>??>>>>??????>TwuF??@:
	
+																																											
+
+:A@@HzzyJ???>?>>>>>>>?>?????>>>>>>>>>>>>>???>?>>>>>>?????>??JqwU>@@<

+
+
+																																										
+
+
+;@@@N~~pB@??>>>>>>>>>????????>>>>>>>>>>>>>?????>>>????????@?Frqb>@@=


+
+
+																																								
+	
+
+=@A?S}s\>@?>>>>>>>>>>>??????>>>>>>>>>?>>>??????>>>???????@??Booi???>


+
+
+																																									
+
+>@A?]rQ?@???>>>>>>>>>>????>>>>>>>>>>>>>>?????>>>>>>????????>Yup@=<>


+
+																																								
+
+	>@A?fstK?@??>>>>>>>>>>>????>>>>>>>>>=>>>>??????>>>>??????????MwvC>>>


+																				
+																			
+
+
+
+>@@?kvmB?????>>>>>>>>>>>????>>>>>>>>>=>>>??????>>????>>>>>???Du|D??>


+																																									
+
+
+>@@>mxY>@????>>>>>>>?>>????>>>>>?????>>>>>??????????>>>>>>?@@@p�E?@=


+
+
+																																							
+
+
+=@@=ltW>@????>>>>>>>>>????>=>>>???????>==>>????????>>?????@@@?j�G>@=

+
+																																									
+
+;A?=mp_>@@????>>>>>>>>????==>>?????????>==>????>>???>????@@@?>g�H>@;


+
+																																								
+
+
+8A?=lpg?@?@???????>>>????=<=>???????????=<=????>??????????????k�H>A9


+
+																																							
+
+
+4A?=lkkB@????????????????==>???>>>?>>???>==????????>?????????@p�F>A6


+
+																																					
+
+
+
+1A><joqF?????????????????>>???>>>>?>>>???>>???????????@??????CjoE>A2


+
+																																						
+
+
+
,A>=busM>?????????????????????>>>>>>>>>?????????????????@????GuqB>A-

+																																							
+
+
+
'B>=WynR>?????>>>???????????????>>>>>>????????????????@?@@@@?F}s=>@'


+																																						
+
+
+
!A>>K�xP>??@????????????????????>>>>>?????????????????????@@>W~i;>@ 

+
+
+																																			
+
+
+
+
>>>B}|M?@@@@@????????????????>>>>>>????????????????????????Ap�_;?>


+
+																	
+																			
+
+
+
+9?>=r�M?@@@@@@@@????????????>>>>>?>????>??????????????>???>Mq�Q<?;


+
+																																						
+
+
+2@=;c�V>@@@@????????????????>>?>>?>>>>>>??????????????????>VhxF=?6


+																																							
+
+
)@=<Q�k@@@@????>???????????????>?>>>>>>>???????????@@@@@@@>Zjm?=@/



+
+																
+
+																			
+
+
 @==E}X>@??????>?????????????>>?>>>>>??????????????@@??@@?f|`<>?$	

+
+	
+															
+																				
+	
+<>>>iwwH?@??????????????>???>>>>>>>?>???????????????@??@?Jr�M=>=	

+
+																		
+																					3?><Vsmh?@@??????@??????>>???>>?????????????>?@??????@@?Bkyy?>?7
+

+																
+
+
+																					
&@>=DzqJ??????@@@??????>>>???>>?????????????????????@@>[u|^<>@+

+
+																		
+
+																				
+=>><hy{`>@@@@@@@@??>?@?>>>>??>>?>???????????????????@?Evr�E>??	

+																	
+	
+	
+																		4@><L�srA@@@@@@@?????@??>>???>??>???@@????????@???@@@@hv�f<>@6	
																	
+
+	
+
+
+																	
%@>=<p�wP?@@@@@????>??@?>>???????????@????@???@@?@@@>]oh�C=>@$	
+
+																	
+	
+			
+																	<>><L�vj@@@@@@??????@@?>>????????????????????@@@@@>Ql�V<>?8	
+
+													
+
+
+	
+	
+	
+
+
+		
+												/@>><j�x`@@@@@@?????@@????>??????????@???@?@@@@@@?Jys�l=?>@%
+
+
																
+
+	
+
+					
+		
+								
+
??><C�}ya?@A@@@@@????@@??????>????>?@????@@@@@@?CnquxC>>@6	

+										
+
+
+
+	
+
+
+	
+
+			
+	
+
+	
+
+								2@>>;P�ox^?@@@@@@????@@@@?????>?????@@???@@@@@>Ejkr�J=??>

+

							
+
+			
+
+	
+
+
+	
+
+
+
+
+		
+	
+
+
+								

?>>><^�kvcG??@@@@?@@??@@???????????@@@??@@@??Pqfr�P=??A)
	

										
+		
+
+
+
+
+
+
+			
+	
+		
+										/@>>>=g�hiugTD?@@@@???@@??@????????@@@@@???Lhugs�Q=>?A4
+
+

+										
+			
+
+
+	
+
+
+
+
+
+
+
+
+											
;?>?=>i�fanws_G??@@@@@@@?@@???@@@@@@@@>ARjxmaw�M<?>@:
	

+											
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+											!???>=>e��qbeut`I@?@@@@@ABA?@@@@@@@@>AUptkUa�{I<>>@=

+

+											
+	
+
+
+
+
+
+
+
+
+
+
+
+
+												
+'@@??>>Zv�y\WgtudQHB?>?ABA@@?>??ADKXkxdRYp�iB=??A<
+


+
+								
+		
+	
+
+
+	
+
+
+
+
+
+
+
+												
'?@???=?Ry�o_Y^edgkbZPJN\hcWWYakruqd`ex�wR=???A:


+

+
+
+									
+
+	
+
+
+
+		
+
+
+
+
+
+
+													
!;A????>B^}�rf[SUhxxtmlxytnulma[cgr��uUA=??@A5
+
+

+
+
+
+										
+
+
+
+
+	
+
+
+
+
+
+															

0?A???@>EYn|�xjm}��~{uowxsnljtt_L@>?@@A>)
+
+

+
+
+
+												
+
+
+
+
+
+
+
+																
+
4 at A??@@>?ETn����~}ui��}���w`KA>??@@A at 2
+


+
+
+
+												
+	
+
+
+
+
+
+
+														
+
+

!5 at A@@@@?>?H\hpx���xr��x`NB??@??@B at 3

+


+
+
+
+
+												
+
+
+	
+
+
+
+
+															
+
+

#5 at AA@?@@?>@GSdimrXLIA>>?@@@@B>0






+
+
+
+
+
+													
+		
+
+
+																
+	
+


 0:@AA@???>=<;<;<<=>??@@A?9,





+
+
+
+
+
+														
+		
+
+																		
+
+





!-8>AA@?>????????@@<4*








+
+
+
+
+
+
+															
+
+
+																	
+
+
+




+


&08=?@AA@@?;5,!4+








+
+
+
+
+
+	
+												
+	
+
+
+																
+
+
+
+
+
+








"$$# 

.$	
+


+
+
+
+
+
+
+	
+
+														
+
+			
+																	
+
+
+
+






+








+




	
+		
+
+
+
+
+
+			
+
+																			
+																
+
+
+








		







+
+
+
+
+					
+		
+													
+		
+	
+																	
+
+
+
+
+
+
+
+





+		
+
+



+
+
+
+		
+
+
+
+
+																	
+	
+
+
+																
+
+		
+
+
+
+
+
+


+	
+


+
+

+
+
+
+
+
+
+
+
+
+
+
+															
+		
+
+															
+	
+
+
+
+
+
+
+
+
+
+
+		
+





+

+
+
+
+
+
+
+
+
+
+															
+
+
+
+												
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+												
+
+	
+	
+							
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+									
+
+
+
+		
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+


+
+
+
+
+
+

+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+








+

+		
+
+
+
+
+
+
+
+

+


+
+	
+






+
+		
+
+
+



+
+
+		

+

+	
+



	




+			



			
+		

+	
+



+	


+
+			
+




+			
+
						



+	
+

				





+		
+
+

					
+						


+					
+
		
								
+







	
+	
+
+
+			

+
+
+
+
+

+
+	
+




+	

+	
+
					
+
+	

			



+		

+
+
		
+



+				
+








+




+		
+								
+





+		
+

+						









+			
+
+

+		
+
!'*,/256640/00.+&

+
+	
+
$2;>????>>>??>?>????>:3*
			
#7>>><9<?BA?=<==<;<=<<;>??>9,
	
+	
+
2>>=<=ET^ZRa__bUQURQOORQIB<;>?=/			
+
+	
#:>=<=Mcr�U

!.B+$NlE1.T}{jbJ;;=>9 
+	
,<=<;F`^:$) -.&CvlL:<>=&
	
0=<<?]u?					."	
+
+ Mta>:<<(	
1><:F[R?	<#			
]o?:<<'
	
+



		
+	
0><:ES+
$2			jwB;;<"


+
+


							



+	


)><:BR(	
6			'tr?9<9

+


+

					
+
+
+



+
==;=b@		
1				E�f::>0




+					
+
6=<:\u,							


5
			
+
+&_�U9=>!
+
										

%>=:L�g 			

)7?AJWXZZ
		$T{�C;>:E2
+

+												
+:=<CxxG		

4COZQGBBFNMKE<*
	(?Po=<?4

+
																
+
)?=>k}W-/GIBBA<===<B<;<AFIC8#	M�a;>5


													#;=>=I}cB()@KOB====>>==A>=====AHKDFEA*

$3W�M=>
+
										
$@?>=GsY8305;AJTMB><=>=>>>==<=======<=>=BUh\D<<:?uc=@6
														
+
4>>>?_]6;DDGJLE>=>>>>>>>>=========>>>>>=<HQJK at 8?eZ<?@$												
+
+
+
+	
+
+&?==?>J_ at LB>>=<==>>>>>>>>>>=>==>>>>>>>>>>=;<=E^F<hP==?8

+													








+
+		
+;>=>>>?UfT>??>>>>>>>>>>>>>======>>>>>>>>>>>>>=HhcmO>==@%

+														




+
+


+
+

+
+
+	
+
)@<=>?=>UeC>??>>>>>>>>>>>>>>>====>>>>>>>>>>>>>>=Dg~a>?=>6	
															
+


+							
+
+

+
+9><>??;Gv]=>>??>?>>>>>>>>>>>>>=====>>>>>>>?>>>>>=?st@?>=> 	

+													

+											
+
+			
+#@==>??;[�J=>>????>>>>>>>>>>========>>>>>>>>>>>>>>;V~E>?>?0


+																	
+																	
+		
2?=>>>>Alm?>?>>???>?>>>>>>>=======>>>>>>>>>>?>>>??=JqL???><
																

+																	
+
+
+<>>>>?>PuW=>>>>?>>>?>>>>?>=========>>>>>>>?>>?????>SjU???>@&															
																			
+
+
+#@=>>???fl@>>>>?>>>>>>??>>>>===>=====>>>>>>>>>?>>>>=_f^C????5
+															

																		
+
+		
0@>>>??FrR=?>>>?>>>>>>>>>>>>>>>======>>>??>>>>>>>>>=JidN>??>>

+																	
																		
+
+
+
+:?>>??>OlG>?>>??>>>>>>>?>>>>>>====>>>>>>?>>>>>>>>>>?=SdY???=?*
																						
+

+																	
+

?=;???>XnH>?>>>>>>>??>>?>>>>>>====>>>>>>>>>>>>>>>>????]iF??:<5																							
+
+
+
+		
+															
+

$@9;@???\uN>?>>??>>>>>>>>>>>>>>>===>>?>>>>>?>>>?>>>>??<T}T>???=
																					

+





+															
+
-@=?@?>EjqN=>>>?>>=>==>>>>==>??>>==>>?>>>>?>>=>>?>>>??=ItS????@"
																					










+												
+
+
4@?@@?>XqbF=>>??>>=>>>>>>>>=>>>??>>>>>><=>>>>==>?>>>??>HmR????@/																						

	
	



+
+
+										
+8??@??AhoT>=>>>>>>>>>>>>>>>=>>?>??>?>>==???>>>=>>>>?>?>IfV@???@9
																					
			



+										
+
+<??@?>LqmG==>>>>=>>>>>>>>>>>==>>>>>>>==>>?>>>>=>>>>>>>=Ec_C??@@?
																						

					
+

										
+

@?@@?>ay`@===>=>>>>>>>>>>>>>>>>>>>>>==>>>>>>>>>=>>>>>>>?ThH?@??@&																																									
+
$A?@@?Csyc?>>>>>>>>>>>>>>>>>>>>===>===>>>>>?>>>>>>>>>>???atS>?@?@/																																		
+								
+
+
*A@@@?M|~]=??>>>>>==>>>>>>>>>>>>====>>>>>>>>>>>>>>=>>???>b{d@?@?@7
+																																	
+
+								
+
+
1A@@@?`~zL???>>>>>>>=>>>>>>>>>>>>====>>>?>>>>>>>=>>>????>WqnG?@?@<
																																													
+
+8@@@?H{wjA@?>>>>>>>>>>>>>>>>??>>>===>>>?>>>>?>>>=>>??>>>>GlsT>@@?>
																																													
+
+=@@@?Y�zZ???>>>>>>>>>>>>>>>>??>>===>>>??>>>>?>>>>>??>>>???Ym]>?@?@!
																																												
+
+
@@@@?d��P????>>>>>>>>>>>>>>>>??>====>>??>>>>>>>>>>??>>????KflC???A(
																																												
+
+
&A@@@Am�|K????>>>>>>>>>>>>>>>>??>=>>=>>??>>>>>>>>>>???????@E_rM??@A.
+
+																																											
+
-A@@@Dt�{I????>>>>>>>>>>>>>>???>>>>>>>???>>>>>>>>>>???????@BcsW??@A1
+																																											
+
+
2A@@@JzzvE???>>>>>>>>>>?>>>???>>>>>>>>>???>>>>?>>>>>>??????Bhlb?@@@4

+																																										
+
+	
7=<A?U~�n@????>>>>>>>>>>>>>???>>>>>>>>>????>>>>>>>>>>??>???AkmjA@?@7

+																																												
+
+:??@@b��Z?????>>>>>>>>>?>>???>>>>>>>>>?>???>>?>>>>>>>??????>drmE?@@:
+
+																																											
+
+<@@@Cr|sH??>???>>>>>>>??>>??>>?>>>>>>>>>???>??>?>>>>???????>WptK?@@<

+
+																																										
+
+
+>@@@Hz�k@??>>???>>>>>>?>?????>>>>>>>>>>?>??>>>>>>>>>????????MnsX>@@=


+
+
+																																								
+
+
+
+
?@@?N��Z>@??>>???>>>>>????????>>>>>>>>>>>???>?>>>>>???????@?Gstc>@@?


+
+
+																																										
+
+
?@@?U��P>@??>>>??>>>>>>??>???>>>>>>>>?>>>?????>>>>>>>>??????Ao}i??>?


+																				
+																						
+
+
@@@?`�tE?@???>>>??>>>>>?????>?>>>>>>>>>?>??????>>>>>>>??????@kppA>=@


+
+																																								
+
+
+@@@?j�a??@@???>>??>>>>>????>>>>>>>>>>>>>>??????>>>>>????????>\trD@@@


+
+																																							
+
+
+
@@@@nwO>@@?????>>>?>>>>????>>>>>>>>>>>>>>?????>>>>????>>>>???HvyE@@?


+
+
+																																						
+
+
+
+
@@@@qtO>@?????>>>>>>?>?????>>>>>???>>=>?>>????>>>>>>>>>??>?@@@n~G?@?


+
+																																								
+
+

?@@@twT>???????>>>>>>?????>>>=>??????>=>>>?????>>>>>>>?????@@>g�I?@>


+
+
+																																								
+
+>@@@vxS>@@?@?????>>>>????>=>=>????????>==>>???>>>>>>>????@@@@>b�J>@=


+
+
+																																							
+
+
+<A?@uuT>@??????????>?????===>??????????>=<>>???>>>>>>>??????@>e�J=@;


+
+
+																																				
+
+
+
+
+9A??tvW>????????????????>==>????????????><=????>>>>>>???@??@??k�H=@9

+
+																																					
+
+
+
+6A>=oqY>????????????????>>>?????>>?>?????>=>?????>????@@?????Ap|F>@5

+
+
+																																					
+
+
+
2A><ix^??????????????????>????>>?>>>>??????>????????????@@???Bu{B>A0

+																																						
+
+
+
+
,A>=^vdB?????>?>>????????????????>>>>>>??????????????????@@@?L�w>>@*



+
+	
+																																				
+
+
+
&A>=R|lE????????????????????????>>?>>??????????????????????@>^�l<>@"



+																																					
+
+
+

?>=G�yG???@?@?????????????????>>>>>????????????????>??????@Ao�`;??
+

+
+																		
+																		
+
+
+
+;>=@{�M?@@@@@@????????????????>>>>>>???????????????????????Kr�S;?<


+
+
+																
+																			
+
+
+
+4?=<k�]>@@@@??????????????????>>?>>>>?>????????????@??????>Qh}G<?8


+
+
+																																					
+
+
,@=<X�rC?@@??????????????????>>>?>>>>>>?????????????@@???@>Vss?=?1



+
+																
+																				
+
+
#@=>H}c>@@??????????????????>>>?>>>>>>??????????????@@@@@>_�d<=@'	


+																	
+																					
+
=>>?rqvQ>@@@?????@???????????>>?>>>?????????????????@??@?CmP<>?

+

+
+																		
+																		
+		5?>=\tfr@@@@@@?@@@?????>>????????>???????????????????@?@>Xvw@>?:


+																	
+																						
(@>>G|n�M?@@@@@@@@?????>>?>>???>?????????????????????@@>Jpv`<>@0


+																		
+	
+
+																			
+>>>=mwza>@@@@@@@@?>????>>?>??>>?????????????????????@?BlrG=>@ 	

+																	
+	
+																					5@><P�qrB@@@@@@@???????>>>>>?>??????????>??@??@??@@@??f|�j<>?:
+
																	
+
+	
+	
+																	
&@>=>uzwP?A@@@@@?????????>>>>?????????@????@@?@@@@@@>Uyp�G>>A*

+
															
+	
+	
+
+
+	
+
+															<?><R�sj@@@@@@@?@???@@?????????????>??????@@@@@@@@?Gxi]=??<	
+
+																
+
+	
+	
+
+
+			
+										0@>?=q�z^?@@@@@@@?????@????????????>?@????@@@@@@@?Cru}t>>>@+

+
															
+
+
+	
+
+
+				
+	
+
+	
+				

??><I�xx\>@A@@@?@?????@@????????????@????@@@?@@?Alyu�G=>?9	

+							
+		
+				
+
+
+	
+	
+
+	
+
+
+
+	
+
+
+						2@>>;\�gt[?@@@@@@?????@@?????????????@????@?@@?Bfup�S=>??!

+
							
+
+
+	
+
+
+
+
+
+	
+
+
+	
+
+
+
+
+	
+									

??>==k�draE>?@@@@?????@????????????@@@??@@@@>Joqj�\=??A-	
+
						
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+
+	
+									0@>>=@v�itt`J??@@@??@@@???@?????@??@@@@@@?>C[yqp�]=??A6
+	

+							
+
+	
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+										
+	
:?>?=Bx�gfrvdH?@@@@@@@@??@????@@@@@@A@??EYpqdq�Z=?>?<
	


+									
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+											!??>>=Bv��~dot]F??@@@@@@@A@@@@@@@@@A??F[qtd^x�U=?>?>!	
+

+											
+
+
+
+
+
+
+
+
+
+	
+	
+
+											
+)A@??>Bj{�xQauvbLB?>?@@ACB??@???>?BMbpjaNZ�}L<??@?$
+	

+
+									
+	
+
+
+
+
+	
+
+	
+
+
+
+
+												
)@@?@?=Ff}tdX^lniaZPGB at BFPPIILS]gptgWYjargC=??A>"

+

+
+										
+
+
+
+
+
+	
+
+
+
+
+
+
+													
+
#=A@????Fl�ydZ\V^nukc^dorvux|}rgcYcq��gL=??@A:
+
+

+
+
+										
+
+
+	
+
+
+
+
+
+
+
+										
+	
+
+	

4AA??@@@Ro|~{haq}�ybiroow}�wjkk{�w`I>?@?@A3

+


+
+
+												
+
+
+
+
+
+
+
+
+
+												
+	
+

$9A@?@@??ETi}����znlssz�����t]JA>?@@@B<&

+


+
+
+
+											
+
+
+
+
+
+
+
+
+
+											
+	
+
+

(;A@@@@???H]vu~�who}sr��xhQB>?@??AB=-

+


+
+
+
+
+													
+
+	
+
+
+
+
+														
+
+

,=A@@?@@@>@Mkz}~���u[QD>?@@@?@B<,
+



+
+
+
+
+
+													
+		
+
+
+																
+
+
+


.<AA@@???>=@DHKKHC>=??@@@AA;*






+
+
+
+
+
+	
+											
+		
+
+																
+
+
+
+




%4=AA@??>>=<<===>??@A=80#







+
+
+
+
+	
+														
+
+																	
+
+
+




+
+
#.8=@@@AAAAAA@>8/%,


+





+
+
+
+
+		
+
+										
+
+
+																	
+
+
+
+






+
$+035543-%
@)


+
+

+
+
+
+
+
+
+
+
+
+		
+										
+
+			
+															
+
+
+
+
+






+








+
+
+	
+
+
+
+
+
+
+	
+
+								
+						
+
+																		
+
+
+











+
+






		
+
+				
+
+
+
+
+											
+				
+
+	
+																			
+
+
+
+








+	
+




+	
+
+
+			
+															
+		
+	
+
+
+
+																			
+
+
+
+






+

+	
+


+
+
+
+
+		
+
+
+
+															
+		
+	
+																		
+
+
+
+
+
+
+


+
+
+
+
+



+
+
+
+
+
+
+
+
+
+																	
+
+															
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+			
+												
+
+
+											
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+													
+
+
+	
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+		
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+

+
+

+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		

+



+

+
+
+

+
+	
+
+
+
+
+
+
+
+

+


+		
+






+
+		
+
+
+
+


+
+
+	


+
+	
+
+
+
+






+	
+




+
+
+
	
+
+	
+
+
+



	

+			
+
+

+



+			

+					
+
+
+
+
+
+						


+					
+			





+	
+	

			
+
+
+						


+							
+
+
+
+

	



		
+

+		
+


+
+		
+
+



	
+

+
+	
+
+											







+				



		
+
+
+				
+
+
+

+




+
+




		
+

											
+
+
+

+
+
+					




+	
+
+
+	
+		
+


+							
+

(.1358:;;:877863/(
	
+	

*7=????>><=>>=>>=>>???;6-
	
+		
+
):>>=<9<@FHIEAAA?<=@@?<<>??>6)
+	
+		
+	


7>====AL\[RhVggMEPdaVSY]OA;:>>>9#
		
+
+
+	
)<><<=EVcj!

!
%c/
Fxq[E<<<>>.

	
2>><<CVX<"+$		#C

)9OgI<=>>4
+		
+
8><<@UsV
			53	
+
+	
+_t`X>;<<5		
+	
+

9><;K\I7
			4)				
WpE9;<5
+	
		



+

+
+

+	
9=<:LN#
1		)w}M9:=1

+
+

+

+			
+
+




5=;:MK7			MfuL8;>)
+


											
+	

,>;:Lj-3	
"@YvC9=;

+
+
	
+						
+
+
=<;Bx^
			
%4
		
+"7gm;<>. 

										
5=<<i�](


"7HS__mW%F�X9<<A=
+
											
+
#>=;Y|l`1
	-<LOQKFW`NVO;


 g�H:?8

+
+														
+6?>G}i`N7$
+';FCFLC==;JhA:>FKE1#
	4zs?><

										
&3>?=_xZQC=720./:HYYA=<====A\C====CLTVLG?*
*O�Z=?,
									7F>?=Vq]F?@A??AJQRTS?>=>====D>==>==<>CIPW[OF?:=;@yi=?;													
+
+
+
+	

;>>?Bg_A?UZWSWSHA@?>>>>>>==<==>>>>>=<<=@PmhVK?:>iZ=>?-
+												







+
+		

0?=>@=N_K^TCAA?<<=>==>>>>>======>>>>>>==<?JC?FVC=gN>>><
										




+		
+
+




+
+
+
>>>>?>?T]W<<===>>>>>=>>>>>>=====>>>>>>>>>=<=><F]\lI>>=?-
+
+														


+								
+
+
+
	
+3?=>??=>Z\B=?>>>>>>>>=>>>>>>=====>>>>>>=>>>>>>>=C_T=?==;

															
+
+											

+	
+>>>>??<Bw]=???>>>>>>>>>>>>>>>>====>>>>=>>>>>?>??==jd=?>>?'
																												
+
+
+	
-@=?>??<M�M=????>>>>>>>>?>>>>>>=====>>>=>>>>?>?>??<Qm@??>?6
																																		
+
+
+9?>>??><eu@>?????>>>>>>>?>>>=====>>>>>>>>>>>>>>???=RqB???>>

																																					
+	
+
?>>???>Cn^=????>>>>>>>>>>>>======>>>>>>>>>>>>>??>?>XeH???>@-
+																																	
+
+	
,@>>???=PrK=???>>>>=>>>>>>>>========>>>>>>>>>>>?>>>>deU?????:
																																								
+
+	
+6?>????>]qE>???>>=>>==>>>>>>>=>>===>>>>>>>>=>>?>>>>=Se]E???>@!
																	
																				
+
+

+=?>???>BfhC>???>>>>>>>>>>>>>>>>=====>>??>>>>>>>>>>>?@]]O>??>@0																					
+																				
+
+

 @???@?>HpjE>???>>>>>?>>>>>>>?>=====>>?>>>?>>?>?>>>>?>Kf^A??<<:
+																					
+																						
+

*@<>@@?=TujD>????>>>>>>>>>>>>?>====>>>>>>?>?>>>?>>>>>?BlmF??>:?


																						
+																					
+
+
2 at 8>@???bnaA>???>>>>>=>>>?>>>>>>===>>>>>>>?>>=>??>>>??AekF???=@)																						
+

+
+
+
+																	
+
+7>:@@?>NqjP????>>=>>>=>>>>>>>>>>>=>>>>>=>??>>>>>>>>>??CejI????@4
+																					








+														
+
;=<A@?@izgC>??>>==>>>>>>>>>=>>??>>>>>>==??>>>>>=>>>>>?BbgP?????<
																					








+													
+
>?@@?>PoqW>=>>>>=>>>>>>>>>>>=>??>>>>>==>?>>>>>>>>>>>>>>Ng_@??@?@
																						

+
+	
+


													
+
+
 @?@@??cwwK=>>===>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>>>>BdpE??@?@)																						

+				
+
														
+
+
(A?A@?Fv~{F>?>>===>>>>>>>>>>>>>==>>>>>>>>>>?>>>>>>>>>>?>Dl|Q>@@@@2
+																																										
+
+.A at A@?T��h=??>>>=>>>>>>>>>>>>>>>====>>>>>>>>>>>>>>>>>???An�a?@@?@9
																																											
+
+5A at A@?f�L>???>>>>>>>>>>>>>>>>>>=====>>>>>>>>>>>=>>>????>d�rC@@@?=
																																		
+									
+
:@@A at Fw�j????>>>>>>>>>>>>>>>>?>>====>>>>>>>>>>>>>>>??>??>R}�L?@@??
																																													
+
>@A@?O��T>???>>>>>>>>>>>>>>>>??>====>???>>>>>>>>>>>?>>???Dn|]@@@?A$																																												
+
+
!@@@@?W{xH????>>>>>>>>>>>>>>>??>>=>==>??>>>>>>>>>>>>??>??@AaosF?@?A,
+
+																																										
+
+
(A@@@?b|rC????>>>>>>>>>>>>>>>>??>=>>=>??>>>>>>>>>=>>??????@ZhyO??@A3
+
+
+																																								
+
+
+
/A@@@Bm{lA????>>==>>>>>>>>>>>>??>>>>>>?>>>>>>>>>>>>>>??????WgtZ?@@A5
																																											
+
+
5??@@Ix�h?????>>==>>>>>>>>>?>??>>>>>>>????>>>>?>>>>>>>?????Qvye@@?@7																																											
+
+
+
:==@?T|�]>?????>>>>>>>>>>>?????>>>>>>>>???>>>>>>>>=>>??>???H||nC@@@9																																													
+
+<@@@@e�L>?>???>>>>>>>?>>>????>>>>>>>>?>???>>>??>>>>>?>>??@AnsrJ?@@<	
+																																											
+
+>@A at Cs�lA???????>>>>>>>?>>?????>>>>>?>>>???>>??>>>>>?>>?????ZqwP?@@>
+
+																																											
+
+
?@@@Hw�S>????>???>>>=>>>>????>>>>>>>>>>>>??>>?>>>>>>??????@?JpxW?@@?

+
+																																									
+
+
+
+ @@A?P�yE?@???>>???>>>>>?>????>>>>>>>>>?>??????>>>>>>?>?>??@@Cr�a>@@@


+
+																																									
+
+
+
!A@@?X�pA?@???>>???>>>>>?>????>>>>>>>>>>>???????>>>>>>>>>???@Bu�o@?>@


+
+																																									
+
+
"A@@?`�`=??@??>>>????>>>?????>?>>>>>>>>??>??????>>>>>>>??????@svB?>A


+
+
+																																							
+
+
#A@@?p�V=?@@???>>>??>>>>?????>>>>>==>>>>>>?????>>>>>>????????>bzwE@@A


+
+																																								
+
+
#A@@Aw�O>??@@???>>????>?????>>>>>>>=>>>>>>?????>>>>>??>>>>???>NuwG?@@


+
+																																							
+
+
+
"A?@E}{G?@@?????>>>>????????>>>>>>?>>>>>>>>???>>>>>>>>>>????@?Cp}H?@@


+
+
+																																					
+	
+
+
!A@?G�wD?@@???????>>>>?????>>>>>>?????>>>>????>>>>>>>>??????@@?j�J?@@

+
+
+																																					
+
+
+
+

@@?E�xC???????????>>??????>==>>??????>>>>>>???>>>>>>>>????@@@?f�L>@?
+
+
+
+																																				
+
+
+
?@?DvC?????????????????>====?????????>>==>????>>>>>>>?????@@>d�K>@=

+
+																																						
+
+
+
+<@>BynF>????>>>>????????==<=>???????????===????>>>>??????@@@@>h�J=@;
+
+
+																																				
+
+
+
+9@>?rjM>?????>>>????????===>????????????>=<>????>???????@@@@@@izH>@8
+
+																																						
+
+
+5A><n{Y>?????>??>???????==>????>?>>>?????>>>????????>>???@@@?I||C>@3
+
+
+																																				
+
+
+
+0A=;g�e???????>>>???????>>????>?>>>>>??????????????>?????@@@>U�w?>A-



+
+																																					
+
+
+
)A>;[~pC????????????????????????>>>>???????????????????????@>]�m<>A%


+
+																
+																				
+
+
+
 @=<O�xH???@@??????????????????>>>>>>??????????????????????@Ah�b:>@


+
+
+																
+																		
+
+
+
+
=><D~P>?@@@??????????????????>>?>>>>??????????????????????Fu�U:?<

+
+																	
+																				
+
+
+5>=>q~_>@@?????>?????????????>>>?>>>>>????????????????????>J|�H<?8


+
+
+															
+																					
+
+-?>=_|sF?@???????????????????>>>?>>>>>??????????????@??????M{y@<?3



+
+																
+
+																		
+
+
+
$?>=M}xi?@@@??@@???????????>?>>>?>>>>>>?????????????@@@@@@>U�g<=?*


+
+																	
+																				
+	
=??AvgpV?@@@@@@?@??@??????????>>>>>>?????????????>???@?@@@d{Q<=? 
+

+
+																
+	
+																					6@>=ashuB@@@@?????@???????????>>>>>>>????????????????@?@>OonA=><


+
+																
+
+																				
*A>=J|m~P?@@@????@@????>>??>????>>>>?????????@???????@@?Gjya<>?4

+																		
+	
+																				
+
??>>qsxb>@@????@@@????>>>>>????>?>?????????????@@@??@@Amu�G=>@&
+
																	
+
+	
+
+		
+															5@>=U�qtB@@????@@@???@????>>????????????????@?@@@@@@@?b��l<>>=
+
															
+
+
+
+	
+
+
+
+
+														
&@>>?xtxP?@@?@@@@@???@????>>>???????>???????@@@@@@@@>Qyq�I>>@1

+
																
+
+	
+
+
+																	<?><W�ii@@@@@@@?@??????????>>?????>>????????@@@@?@?Dr^zc<>>?
	
+
+														
+		
+	
+	
+
+	
+	
+											0@>>?ytl\>@@@@@??@????@@??????????>??@@?????@?@@@?Bnndx@>>@2
+
													
+
+
+
+
+	
+
+
+		
+	
+	
+
+
+
+						

>?><P�eo[?@@@@??@?????@@@???????????@@?>?????@@@AjuezM<??=	

+						
+			
+
+	
+
+
+
+	
+
+
+
+			
+
+
+
+
+
+						2@>><h�\v_@@@@?@@@????@@?????>?????@?@?????@@@?Aht`[<>>@(
	
								
+
+	
+
+
+
+
+
+	
+
+
+
+	
+
+
+
+
+
+									

??>=@w�ezgD?@@@@@@???@@??????????@?@????@@@@?Ek{j�g>>?A4	

						
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+										-A>>=E��hvtTA?@A@@?@@@@?@?@??@???@@@@?@@@@??Qtrl�k???@:	

+						
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+
+
+
+										
+
8@>><I�dfteI?@@@@@@@?@@?@?@@??@@@@@@@@??Jfwgi�h?>??=




+							
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+										
+
+	
>?>><K��oolsZD>?@A@@@@@@A?@@@@@@@@@@??Hcwq]j�b>?>??$	
+

+
+								
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+								
+		
+%@???=It�k`sr_KA???@@@ABA@@@@@??>?CPbwtV\z�Z=??@@'		

+
+									
+
+
+
+
+
+
+	
+
+	
+
+
+
+													
'?@?@>?O}�gZapsl]PFA?@ABA at A@@ADJUbnoie]Xu{N=??@?'
+	

+
+
+
+									
+
+
+
+
+	
+
+
+
+
+
+
+											
+		

#<A???>FZy�jcavsmj\[][`abdcahv{ylZS_y�tZB>@?A=#
+
+

+
+		
+							
+	
+
+
+
+
+
+
+
+
+
+
+												
+
+
+

4@@?@?>Eb}���ujw~zkZ\_[gx~~qkeu�uYB=@?@B8

+


+
+
+
+										
+
+
+
+
+
+
+
+
+													
+
+
+
+

&;B@?@@?DUk|����vzYSX\nw�����v`JA>?@@A@/
	
+

+
+
+
+
+										
+
+
+
+
+
+
+													
+
+
+
+
+
/?A??@@>AIWj���r\UQe}v|��ygUF????@AA8!

+


+
+
+
+	
+									
+
+
+
+	
+
+
+													
+
+
+
+
+

 6AA??@@??ALp��|yw}���m[JA@@@??AA9$


+


+
+
+
+
+
+
+											
+		
+
+																
+
+
+


':AA@?@????FPW_cfe_OC??@??@AA9&






+
+
+
+
+		
+									
+
+		
+
+																
+
+
+
+




%5?BA@???>=;:::;;<>?@@@@<4#







+
+
+
+
+
+
+											
+		
+
+																
+
+
+
+




+

+5<@A@????????@@?;3/#

+




+
+
+
+
+
+
+
+
+											
+
+																		
+
+







#,38<=>>>=:4+!? 


+
+


+
+
+
+
+
+
+
+
+
+
+
+														
+														
+
+
+
+
+
+




+
+




*	
+



+
+
+
+
+
+
+
+
+
+	
+
+
+		
+	
+			
+	
+
+
+	
+																
+
+
+





+
+
+











	
+
+
+
+
+
+
+
+
+
+
+
+	
+			
+						
+		
+
+
+	
+																		
+
+
+









		




+
+
+
+
+
+				
+	
+										
+			
+	
+
+	
+		
+																	
+
+
+







		
+


+
+
+
+			
+
+
+
+
+														
+
+	
+
+																			
+
+
+
+
+






		
+


+

+
+
+
+
+
+
+
+
+																
+
+
+																
+
+
+
+
+
+
+
+
+



+
+	
+

+
+

+
+
+
+
+
+
+
+																
+
+
+													
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+							
+		
+
+		
+
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+			
+			
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+

+
+
+
+
+
+

+
+
+	
+
+
+
+
+
+
+
+

+

+		
+
+


+


+
+		
+
+
+



+
+
+	



+		
+
+
+

+




+	
+




+
				
+
+




		
+

+			
+				
+

+




			
+
			

+	
+


+
+
+
+		
+
+		
+

+					
+
+	
+

+
+					
+	

									
+




+											
+
+

		


+					
+
+					

+		
+
+
+


	
+

+								
+






			
+


+						
+
+



+
+




+
+	
+
+							
+








			
+


				





+					
*1468;<==<989::85.'

+	
+		
+
+
+8=???>>>;<<==>=<<=?@@>;4&

+		



(:>===;;=CINMHEDC at CGFB><>>?>:.
		
	
+		
+		

 6>>>>==@OX`gK[SA=IjeUMPSL=:<==><*	
+
+
+
+	
+
,<=<==>HZxw.
4

	O)

+
$[iP=<==>>5

		

+


7><<<=GUG;E7
+

GGrkP?<===;$	
+
$;=<;=H_n@			85
+			C|�kQ><<<<&
+
+	
	
'<<<;DSM at 57%					GJMupK;;<<"



	

+

+





&=<;;OR.	"-	
+

O{pW:;=:
		

+
+			
+
+
+




<<::ZX"

+		7

8I8]Z9;>6

		
+							
+
	
7>;<cq4
8
fW8<>)


						

+?=:Z�\:-*(

+
"57
	<�I9=9$
+
						

<>;J|ij[B73)


+-D\ecqR
vt=;=BF
+							

.@>?qrdr\A96/$+>N]URlnY__D

R�\;><
+											
	>?=[�cgjPB><6-+456 at HOND;>VXF:BUZA#

/uH=>#

										$6??@wl[bcJBAA>=<=<JK@=<<=<HYD<==I[YME:7+

+T�j=?7

+			
+

+	
+ED>>?lfW__JA@??AFEDMF=>>===?[C<==>BKSVX\SA98::<:E~p?>?"

+					
+
+





+		

#>>>?LpUV]ZVPR^fW<46?=>>====E>=>>==>AFS_b\ROH?::>r[>>>5
			
+
+			
+





	
+
6?>?A=Y^L_ffa^^TH=<>==>>=>=====>>>>>==AHPgoXHNI7 at eJ>>=?!															
+





'@>>?@>D[LeYPNID?==>>>>>>>>>>===>>>>>>==<=DG><>RWXgE>?=?5
+																									

		
:?>??@=?]\S?>AA?<<===>>>>>>>>===>>>>?>>===<=>?<=H`zE>?>=>

+																											
+
+		
+
$@>>???=@mhA<=<====>>=>>>>>>>=====>>>>>>>>>>>??>=<BoO=?>>?/
+																												
+	
+

5?>?>??=CwZ<>>>>>>=>>>>>>>>>>======>>>>=>>>>?>>>??;WX=?>>>;
																															
+

>>>????=MvI<>>>>>>>>>>>>?>>>>>=====>>>>>>>>>>>>???<]c=?>>>?$																																						
+
+	
&@>????>=]pA=?>>>>>>>>=>>>>>>>=====>>>>>>>>=>>>>?>?=bj@?>>??4
+																																					
+

+3@>???@>Anf?=?>>>=>=>>=>>>>>>======>>>>>>>>=>>>?>>>>bfL>?>??=
																																								
+

+
+;????@?=K|h@>??>>>>>>==>>>>>>=======>>>>>>>==>>>>>>=S_X@?>?>@'
																																								
+
+


?????@?=W}dA>?>>=>>>>>>>??>>>>>>====>>>?>>>>>>>>>>>>Ff`G????@5
+																																										
+
+

&@>??@@>>bygB>?>>>>>>>?>>>>?>>>>>====>>>>>>>?>???>>>??dlP?????=
																																											
+
+
.A??@A?=EixeA>??>>>>>>>>>>>>>>>=====>>>>?>>>>>>>?>>>?>ZwY????;@#

																					
+																					
+
+5@??@@?<Pmw[@???>>>>>=>>>>>>>>>====>>>>>>>>>>=>>?>>???YsaA???9?/
+																						
																					
+
+:?=@A@>GjsjL??>>>>>====>>>>>>>>>>==>>?>>>>>>==>>>?>?>>Xh^D??@;<8
																					


+	
+
+																	
+
=<<A@?Ai{sU@>>>>=====>>>>>>>>>>>>=>>>>>>>?>>=>=>>>>>>=F`dI??@?>>
																					


+


+
+														
+
+

@;=A@?SyldD=>>>==>>>=>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>=>Qq[??@@>@"
+																					






														
+
+
$A?@A@@l}v_>>>>=<=>>>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>QtoC??@?@,
+																					

+
+
+



														
+
+-A?AA?H}yyM=>?>===>>>>>>>>>=>>=>>>>>>>>>>>>>>>>>>>>>>??>R{yN?@@?@4
+																									
+
+														
+
+
+3A?A@?T�{g?>>?>==>>>>>>>>>>>>>=======>>>>>>>>>>>>>>>>??>Hz[>@@@@:
																																										
+
8A at A@@d�}O>>>?>>>>>>>>>>>>>>>>>=====>>>>>>>>>>>>=>>?????@p�kA@@@?>	
+																												
+												
+
=@@A at Cq|lA??>?>>=>>>>>>>>>>>>>>>====>>>>>>>>>>>>>>>??>???a�vK?@@?@																																												
+
+

@@@@@Hw}Y>????>>>=>>>>>>>>>>>>>>====>>>>>>>>>>>>>>>?????>S�~b?@@?A&

+																																											
+
+
#A@@@?QxxI?????>>>>>>>>>>>>>>>>?>=>>=>>>>>>>>>>>>>>>????@?KvwwC@@?A.

+																																											
+
+
*A@@A?ZvnA?????>>>>>>>>>>>>>>>>>>=>>=>>>>>>>>>>>>>>>>?????Dqs|L??@A4
																																										
+
+
+
1A@@@Af{c??????>==>>>>>>>>?>>>??>>>>>???>>>>>>>>>>>>>>????@mw�V?@@A7
																																										
+
+
+
7==@@Fv�W>?????>=>>>>>>>>>?>??>?>>>>>>?>>>>>>>?>>>>>>>>????ey}a?@@@9																																											
+
+
+
;??@?RvH??>>??>>>>>>>>>>>?>>?>>>>>>>>>?>>>>>>??>>>>>>>>??>S�~gB@@@;
+
+																																										
+
+
>@@@@c|e@??>>>??>>>>>?>>>>???>?>>>>>?>>??>>>>>>>>>>>>>>>??@C{�rH?@@=

+
+																																										
+
+
?@@@Cv�Y>???>>??>>>>>>>>>>>????>>>>>>>>>??>>>>>>>>>>>>>???@>Z�Q?@@?

+																																												
+
@@@@Ix�P>????>>???>>>>?>>????>??>>>>>>>>???>>?>>>>>>>>>>??@?E{�Y?@@@


																																											
+
+
#A@@@O|G?????>>>??>>>>>?>????>>>>>>>>>>?????>?>>>>>>?>>>????Ap�b?@?A

																																										
+
+
+
%A@@?Y�tA?????>?>>??>>>>>>?????>>>>>>>>?>>???>?>>>>>>>>>>>??@?k�r@?=A 
+

+
+																																								
+
+
&A?@?b�a>???????>>>??>>>>???>>>?>>>>>>>>>>??????>>>>>>>>?>???=a�{C@@A 
+

+
+																																						
+
+
+
'A?@@t�L>???????>>>???>>?????>>>>>>>>>>>>??????>>>>>>>>>?????=U�~G@@A!
+

+																																							
+
+
+
&A@@C�yB?????????>>>????????>>>>>>>=>>>>>>?????>>>>>>>>>>????>KtyI?@A!


+
+																																						
+
+
+
%A??I�l??????????>>>????????>>>>>>>>>>>>>>>???>>>>>>>>>>>?????Dr}I?@A 

+
+
+																																				
+
+
+
+
+
$A?>N�e????????????>>???????>>>>>>???>>>>>>???>>>>?>>>>>?????@ApK?@@


+
+
+																																					
+	
+
+
!A@>L�g>???>???????>?????>>>=>>>??????>>>>?>???>>??>>>>>>????@@m�M>@@


+
+
+																																						
+
+
+

@@>J�f????>>>>>?????????>====>???????>>==>>???>>>>>>>>?????@@?h�M>??

+
+
+																
+																					
+
+
>@=Gz^@????>>>??????????===<>?????????>>==>???>>>>>????????@@@g�K>?=
+
+
+																	
+																
+		
+
+
+<@=B|fB????????????????><==>???????????>==<>???>????>?>???@@?Jw{I=@:
+
+
+																																					
+
+
+7@=>yqJ?????????????????>?>?????>>>??????=<>?????>>>>>?>??@@>T�|C>@6
+
+																	
+																			
+
+
+
+2@=<pZ>???????????????>=>????>>>>>>?????>>>?????>?>???????@>Y{v?>@0

+
+
+
+																																	
+
+
+	*@<;f�j?@??????????????>>???????>>>>????????????????????????>^�o<=A)


+
+
+																	
+																	
+	
+
+
"?=<Y�xE???@??????????????????>>>>>>????????????????>>>>?????a~d:>@ 



+
+																
+																			
+
+
+
===K�{P>@@???????????????????>>>?>?????????????????????????@i}V:>>



+
+																
+																			
+
+
7>>Buwc>@@???????@???????????>>>?>>>>?????????????@????????Bm�I<?:


+
+
+																	
+																			
+
+.?>=fuuK>??@??????????????>>?>>>?>?>>>??????????????@??????Fxy?=?4


+
+																
+																				
+	$@>=RztoA@@???????????????>>??>>?>>>>>????????????????@@@@>P�g<=?,



+
+																
+																						
>?>CvaoY>??????????@??????>>>?>>>>>>???????????>>????@@@@@h�P<=?"
+

+
+
+															
+	
+																					7@>=docvB?@????????????????>>?>>>>>??????????????????@@@>RvpA=>=


+
+
+															
+
+																				+A>=N|c}Q>@???????@???>?>>>>>?>>>>>???????????@???????@?Fr�_<=?6


+
+																
+	
+
+																		
+
??>@rlvc>@???????@??@??>>>>>?>>>>>??????????????????@@Al{�H=>@*

															
+	
+
+	
+
+																		5@><Z~ntA?????@??@??@?????>>>>>>?????????>???@@@@@@@@?c�l=>>>	

+													
+
+	
+	
+	
+
+														
%@>>B|jpR>@??@@??@?????@??>>>??>????>????????@@@@@@@?Pwo�J=>@4
+
																	
+	
+
+
+
+																;?>=]x]m@@@@@??????>??@@??>???????>>??@?????@@@??@?Boe|f<>>@"
+

+				
+									
+
+
+
+	
+
+																
-@>>Awv[>@@?????@?????????>>????>>>??@??????@@@@?@cqmB>>@6
+
					
+	
+		
+
+
+	
+
+
+
+	
+
+	
+	
+	
+										
=?><X�o{Y?@@?@??@@@???@@??>???>?>???????????@@@?Bgvb~R=??? 
+

+					
+
+
+
+	
+
+
+
+
+
+
+
+	
+			
+
+			
+
+								0A>>=q�mzaA?@@@@@@@???@@?????>??>??@??????@@@A at AiqXta<>>A/
+
							
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+									
=?>=C�}gzkD?@@@@@???@@@@??????????@@???@@@@@?Bfze}k?>>@9
+

							
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																)A??<K�ygwoD at A@@@???@@?@?????@@???@@???@@@@?Knnd�tA>??=


+

+					
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+
+
+
+											

4A?><R��itlG?@@@@@@@@@@@?@??@@@@@@@@?@@@?C_yoc�tB=???#
	

+
+
+				
+	
+
+
+
+
+
+
+
+
+	
+
+		
+
+												
+
+
+

:@>?=T�|`plQA>?@@@@@@@?@@??@@@@@@@@@@?@Oos_h�nA>??A(	
+

+
+							
+
+
+
+
+
+
+
+
+
+
+	
+
+
+												
+
+
+
=@>?=Ht}mkvlVE??@@@@@@@BA@@@@@@@@??DQfvh\s�h?>?@@+	
+

+
+
+								
+
+
+
+
+
+
+	
+
+
+
+
+															
"=@??>B\�urotvcQFA????AA@?>>????DPbsxk^l��\???@A+	
+


+
+
+								
+
+
+
+
+
+		
+
+
+
+
+												
+
+	
 :A???=T|�zm{xysbSPVXUZ]]ZWLHTervuhaiy{`G>@@A@(	


+
+
+								
+		
+
+
+
+
+
+
+
+
+																
+
3A@?@>G^u���t�zxqqodZ\`bqyxzvrvx���kG=??@A<"
	
+

+
+
+
+
+										
+
+
+
+
+
+																
+
+
+)>A???>ASl{|�~}xxiTPPPYy�}�zw{|z`J??@?@A6
	


+
+
+
+
+											
+
+
+
+	
+
+														
+
+
+

5A@?@@?BPn{���q[QQOO]y~|����gE??@@@B=)
+	


+
+
+
+
+												
+
+	
+
+															
+
+
+
+

)=A@????@GWl��yuqkll���tYJ@@??@A at 0
+
+


+
+
+
+
+
+										
+	
+		
+															
+	
+
+
+



3 at A@?@@?>>DT`ipty{{oZI?=???@AA5
	



+
+
+
+
+
+
+
+									
+
+		
+																	
+
+
+




 2>AA@????=<;;<<==;<=?@@AA>2 

+
+



+
+
+
+
+
+
+
+
+									
+		
+																	
+
+
+
+



+

-9?AA@???>>>>>>>?@@=83(

+
+



+
+
+
+
+
+
+	
+
+									
+
+																		
+
+
+






(29=?@@@@@@@>7.$ 5







+
+
+
+
+
+
+
+
+
+			
+							
+																	
+
+
+
+
+
+



+
+
+

!$&'&%!

=






+
+
+
+
+
+
+
+	
+	
+	
+			
+				
+																					
+
+




+
+
+
+
+












	
+
+
+
+
+
+
+
+
+
+
+		
+					
+				
+		
+
+	
+		
+														
+
+
+
+
+
+








		





+	
+
+
+
+		
+
+
+
+											
+		
+	
+
+
+	
+																	
+	
+
+
+







	
+


+	
+
+		
+
+
+
+
+															
+
+	
+																					
+
+
+
+







+
+


+
+
+
+
+
+
+
+
+
+		
+												
+	
+
+																			
+
+
+
+
+
+
+
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+											
+	
+																	
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+			
+								
+
+	
+
+	
+								
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+		
+
+			
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+

+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+


+
+
+	
+

+
+		
+
+
+
+
+



+		




+

+	
+





+				

					
+







+		
+
					




+
+		
+			
+							
+	
+	


		
+

					
+




+							
+

+				
+
+

+	


+	

		
+	

+		
+
+
+


+
+

+
+		

+	
+
+
+
+					







+
+

	
+

											










+		
+					












+			
+


+		
+				





			
+

&.268;=>>=978::960(

+				
+	
+	
+

%5<>??>?><<;<>>=<<=?@@?<5(
	
+	
+

+
!5=>==<=<>BILHDCB at DIGA=>>>>>:.
		
+		
+
+
+

+

3>>===<<@K^dJMH at CMil^SSOC=<==>>;+
	

+
+
+

.<>====>GXdBCN
+	
+J5;]TC<====>7"
+		
#9>=====FRXdI!
E

6WQ?<====<,			
*<=<==>CS^>
	
+			
B2
+			3lnUC<==<=0
+	
	

				
.=<<;=FOTYO(
			@
				LliodJ<;<>.
+
+


	


.==;:FTNA980
		
+2,	
*8euh\>;=>(


			
+
+



)><;=]jN><:8.

+ <
-@(Df?:==


+		

+					


==:Dq�^KOJC;1%
	 A		

Xo=:>6

+										5?;CuyugXQIGB:/

(3=<			

+1�c:<>.(

				

$>==j{ljUJDDHE>2"

"5[njoK!
	

i�O;=AK 	
+				

6?<S�nnNBAADFDA=0%""0BY]ai_h`]A2

#

Q~r?=>(
+

+						
	%?>@uwo_A>>?ACCBA<:>CHSYAJMGR<OM?>0%&(-*&)/+''Dm�[<>.


+					
+	
%;?=O�bjW?=>>@@BDC@>DIE?<<@POF<=B6<G?<:9878::97:X}~C><

				




+	
HA>=PyZeZ?==>@BFMHC37?=>>==AZE<<?H>KRC>==>?@>=>:Gw{D>?.

							
+
+
+


+


	
+
,?>?AbmZ^D>=?CIWO+
:?>>====SC===A at CRXVNG@<>><<9As_?>?<												
+
+


	

:>?@@Ad^]OEHJNWbb:/>=======>>>====?FJ\e[YUXUO94HgI??>@+																		

		

/@>?@@=HbLZ`^]\``a[I?==>>=>>===>>>>>>>BKPPZ^VR`dST`A>>>>;
																					
+
+
+
+
=>>?@?==^Ybd]ell`NEB<>>?>=>>>==>>>>>>===<<>?==I]]dk>?>>=@'																												
+
+	
+

-@>??@>==^j_KDHOSH><==>>>>>>>====>>>>>>===>=>==@?D_sA>?>>?6
																												
+	
+
+
:?>??@>=>_mRB>===<==>>>>>>>>>=====>>>>>==>>>>===<;AiG=??>>>
																											
+
		
"@>>???>=@hiJ@?>====>===>>>>>>=====>>>>>=>==>>==>?=>kP=?>>>@,
																																		
+

+
/@??>@?>=IyfF?>===>=>>=>>>>>>>======>>>>>>>=>>>>??=?m^=???>?9
																																				
+
	
+9?????@>=UyaD===>>>===>>>>>>>>====>>>>>>>>>===>???>?cdC??>???


																																					
+


+>????@@=>^{_B==>>>>=>==>>>>>>>====>>>?>>>>>>>=>>??>=ZbN>?>?>@.

																																						
+
+

#@>??@A?=CezeC=>?>>>>>>>>>>>>>=======>?>>>>>>>>>>???=Rn\??????9
																																									
+
+

+A>??@A><MgsdC>>>>>>>?>>>>>>>>>=>====>>>>>>>>>?>>???=LtkB??????


																																											
+
+
3A??@A?=>Xlt]B>?>>>>=>>>>>?>>>>>=====>>>>>>>>>>>>???>MtmJ?????@)
																																												
+
+8@??A@?:IdjxZA>?>>>===>>>>?>>>>>====>>>>>>>>>>>>>>??>PrhR????>@4
																						
+																				
+
+
<??@A@>DhinjI??>>>>====>>?>>>>>====>>>>>>>>>>>>>>>??>IlcY@@?@>=<
																				

+	
+																		
+
+
?>?@@@Bm}}oG<>>>>==>===>>>>>>>>>===>>>>>>>>>>>>>>>>?>A[hlD??@><?

																					

	

																	
+
+
!A9>A@?S{lpM=>>==>>>>=>=>>>>>>>>===>>>>>>>?>>>>=>>>>?>>KowU??@?>@&
+																					


+
+
+

+															
+
+*B>@A@@m}ga?>>?=<=>>>>>>>>>>>>>>>>=>>>=>>>>>>>>>>>>>>=>BovdA?@@?@/
+																					

+


+														
+
+
1A?@A at F{|mL>>>>>=>>>>>>>>>>=>>>=>==>>>>>>>>>>>>>>>>=>>>=bylH?@@?@6
+																					
+		

														
+
+
8@?A@@O�oa@?>>>>>=>>>>>>>=>>>>>====>>=>>>>>>>>>>>>>>>>?=NywT?@@@@;
																																										
+
<@@A@?_�yQ>>>>>>>>>>>>>>>=>=>>>=====>>>>>>>>>>>>>>>>?>>>Dsi@??@??
																																											
+
?@@@@Am{mC??>?>>>>>>>>>>>>>>>>>==>==>>>>>>>>>>>>>>>>?>???k~sK?@@?@ 

+
+
+																												
+												
+
+
 A@@A at Dw}[>??>?>>>>>>>>>>>>>>>>>>====>>>>>>>>>>>>>>>>????>]�~[?@@?A(

+
+																													
+												
+
+
'B@@@?L}{K>????>>=>>>>>>>>>>>>>>>=>>=>>>>>>>>>>>>>>>>????>P�j@@@?@0

																																										
+
+
+
-A@@@?X~e@??>??>==>>>>>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>>>??>GuwE@@@@6
																																										
+
+
+3@@@@@gxQ>?????>==>>>>>>>>>>?>>>>>==>?>>>>>>>>>>>>>>>>>?>?Au�~M?@@@9	
+																																								
+
+
8<=@@EwmD??????>=>>>>>>>>>??>>?>>>>>>>?>>>>>>>>>>>>>>>>?>?>j�{Z?@@@;
	
+																																									
+
+
<@@@?P~d@@?>?>?>>>>>>>>>>>>?>>>?>>>>>>>?>>>>>>>>>>>>>>>>??=S�xfA@@@<

+
+																																										
+
+
>@@@@_vd@????>??>>>>>>>>>>>??>>>>>>>>>>?>>?>>>>>>>>>>>>?>??@q�sE@@@>

+
+																																									
+
+
+

?@@@Bq�g??@??>>??>>>>>>>>>>??>>>>>>>>>????>>>>>>>>>>>>>????>T�{M?@?@

+
+		
+																																								
+
+
"@?@@Gy�\>????>>>?>>>>>>>>>???>?>>>>>>>>???>>>>>>>>>>>>>>>???E�X?@@A 
+
	
+																																									
+
+
%A?@?P||F>?????>>??>>>>>?>>????>>>>>>>>>????>>?>>>>>>>>>>>???>g�b??>A#

	
+																																								
+
+
+
'A?@?[�g>?>?????>>??>>>>?>????>>>>>>>>>?>>??>>?>>>>>>>>>>>>??=VjA?>A$

																																								
+
+
+
+
)A?@?h�S>?>>>???>>???>>>?>???>>>>>>>>>>?>>?????>>>>>>>>>>>???>KywC@@A$


+
+																																							
+
+
+A?@@v~C?>?>>?????>???>>????>?>>>>>>>>>>>??????>>>>>>>>>?>>>?>Gu{H?@A%


+																																							
+
+
+
*A??D�e=????>>>???>>????????>>>>>>>>>>>>>>????>>>>>>>>>>>>????Cr~J?@B%


+
+																																					
+
+
+
+
)A?>K�R>??????>?????????????>>>>>>>>>>>>>>????>>>?>>>?>>>?????@o�K?@A%

+
+
+																																					
+	
+
+
'A?>S�L>?>>?????????????????>>>>>>>>>>>>>>>????>???>??>>>>????@m�M>@A#

+
+
+
+																																				
+
+
+
+

%A?=R�K>>??>>?>??????????>?>>>>>>???>>>>>>>???????>>>>>>>>?>??>g�N=?A 

+
+
+																																						
+
+
+

"@?=P�M>???>>>>>>???????>>==>=>???????>>=>>>????>>>>>>>>>>>>?@>_�M=?@


+
+																																							
+
+


@?<M�Q>???>?>>>>???????>==<<=?????????>===>>???>>>>>>>?>?????Do~L=??

+
+
+																																					
+
+
>?<I�Z>????????????????>>><>???????????>===>????>>>>>>>>????>M}~H=?=

+
+
+																
+																				
+
+
+:@<CiA???????????????>@EB>?????>>??????==<>?????>>>>>?>????>Pz}C>?9

+
+
+																																					
+
+
+4@<?vtQ>???@??????????>?B>????>>>?>>????>>=>?????????>??????>Ozy?=@4


+
+
+
+																																			
+
+
+,@<=o�e>?@?@??????????>==>?????>>>>>>???>>=>????????>???????>R�q<=@,


+
+
+																
+																		
+
+

%?=<a~uD?@@@??????????????????>>>>>>??????>>????????>???????>U�e;=A$



+
+																
+
+																		
+
+
+

===Q�|S>@????>???????????????>>>?>>????????????????????????>c�W;>?



+
+																
+																					
+
9>>Dywk??????>?????????????>?>>>?>>?????????????????@@?????An�I<><


+
+
+															
+	
+																			
+
+/@>>js}R>????????????????>>>?>>>?>>??????????????????@?????Fuv?=>6


+
+
+															
+
+																				
+

%@?>VysvC?@????????????>>>>>?>>>?>>???????????????????@@@@>Oxd<=?.



+
+	
+														
+		
+																		
+
>?>Ev_p^>??????????@??????>>>>>>>???????????????????@@@@@?cyO<=?#



+
+														
+
+	
+																					6@>>hg]vC??@???????????>>>>>>>>>>??????????????>??????@@>P~t@=>=


+
+																
+
+
+																			
*A>=Rxd~Q>@????????????>>>>>>>>>??????????????????????@?Fv�`;>?7

	
+																		
+																			
+>?>Atku^>@@?????????????>>>>>>>??????????????????????@Ap��I=>@+


							
+					
+			
+	
+
+			
+															3@>=^zbmA?@??????????????>>?>?>???????????????@????@@?f��m=>>>	

+						
+							
+		
+	
+		
+															
"@>>E|\rQ>@???????????????>??????????????????@@@@@@@?Nsg�K=>@5
+
					
+								
+
+
+
+	
+	
+																	
+9??=brim@?@??????????????>??????????????????@@@??@@>hqi<?>@$
+

+			
+		
+						
+
+
+
+
+	
+
+
+
+																	(A>>D�rw]>@??????@@??????>??????>???>???????@@@@?@>Vvz�D=?@8
+
					
+				
+
+		
+
+
+
+	
+
+
+		
+													
;?><^�p|X>?@@@@@@?????@?????>>?>?>>??????@?@@@@?@`ys�U=>?@"
+

+						
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+										*A?>?z�mz^@?@@@@??????@?????>????>??@???@@@@@@@?f{k�g=>>@2
+

+						
+
+
+
+
+
+	
+
+
+
+	
+
+
+				
+
+
+										
:@?=H�{gzeA@@A@@????@@@????????????@???@@@@@?Abug�tA>>?<


						
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+												
+#@??<Q�yo�`?A@@?@@??@@?@??@???@@?@?@@??@@@@?Jmp_~|C=>?@#

+

+							
+
+
+
+
+
+
+
+
+
+	
+	
+
+	
+													
+

/A??=Z��xxS?@@?@@@@@@@???@??@@@@@@@@?@@@??SwlX{|G=??A)
+

+
+
+							
+
+
+
+
+
+
+
+	
+
+
+														
+
+
+
+
6A??>Uu|jlP>?@?@@@@@@???@?@@@@@@@@@?@@?Ebwk]}xF=??A-	


+
+								
+
+
+
+
+
+
+
+
+
+
+
+
+		
+									
+
+
+
+:@>?>Irypf_N@>?@@@@A@@@A@??@@@@@@@>?DTqlf��vD>??A/
+


+
+									
+
+
+
+
+
+
+	
+	
+															
+
+

;@??>Dj�]\wjRD>>>??>?A@?>>???@?>AMaok`b��fC???A0
+



+
+									
+
+
+
+
+
+		
+
+																
+	

:A??>@h�ei}yk^SIJOTTPTXWSLEA>EWo{ql[lucH=??@A.
+

+
+
+
+										
+
+
+
+
+
+																				
5A????^���}�}upegjb]`elrqninuus}��tL=>??@?+
+


+
+
+
+
+											
+
+
+
+																	
+
+	-@@??>EUn�{tnja[URQRSSficplacw�lWB?@?@A;"	


+
+
+
+
+												
+
+
+															
+		
+
+
$<A???=D\v��yvhVRRPPPNbk`aeo}�_E>@@?A at 1

+



+
+
+
+	
+											
+
+	
+									
+					
+
+
+

2@@@?>=?I\q��{slkedbju��u^G>??@@A9"
+
+



+
+
+
+
+	
+										
+		
+																		
+
+


%:A@????=>DN\hpx|���~nZH>=???@B=+
	



+
+
+
+
+	
+											
+		
+																	
+
+
+




*;A@@??@?>=<<=?ABA><<>??@@A;,
+	



+
+
+
+
+
+	
+
+												
+																
+
+
+
+
+



(6?A@@????>>====>>@A@>;4%

+




+
+
+
+
+
+
+	
+
+									
+																	
+
+
+
+



+


*4;?@AAA@@@@A@>90+,







+
+
+
+
+
+
+
+
+											
+					
+								
+	
+	
+
+
+
+



+
+
+

#(+-/00/+%
(?






+
+
+
+
+
+
+	
+	
+		
+								
+
+
+										
+							
+
+
+



+
+

+







+



+
+
+
+
+
+
+
+
+
+	
+	
+		
+				
+		
+
+	
+																		
+
+



+








+	





+	
+
+
+
+
+
+
+
+
+
+
+	
+	
+		
+		
+
+		
+	
+
+
+																		
+
+
+
+
+
+


+
+
+



+
+


+	
+
+		
+
+	
+
+	
+											
+
+
+
+	
+	
+																			
+
+
+
+
+




+

+	


+
+
+
+	
+
+
+
+
+	
+													
+	
+
+														
+				
+	
+
+
+
+
+




+	

+
+
+
+
+
+
+
+
+
+
+		
+													
+
+																	
+	
+
+
+
+
+
+
+

+
+	
+
+
+
+
+
+
+
+
+
+
+		
+													
+															
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+		
+
+		
+
+								
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+
+	
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+



+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+


+
+
+	
+
+
+
+
+		
+
+
	
			
+


	
+


		
+




+
+	



+		
+







				

+		
+



+
+	
+
+
+		
				
+


+		
+
+				


							




					
+



+	


	
+					
+
+
+	

+					
+




+
		
+		
+
+	


+
+
+			
+
+			
+	

+
							
+						










+		
+
+	
+			
+







+	
+				
+	
+












+
+	
+
+
+



									
+



+		
	
+


&+157:=><6137763.%

			
	
+

+6<>>?>?>>=<>>>=>>?@?>91"

+		
+
+		
+
		
+
+:>>=<=<<<@CA@?>=?EB=>>>>?>4%

+			
+


+

+
+
*:?>==<;<>M]RMQLMQcqi^WF=<====>7%
	
+


+	

*;?>=>><;=GXpn)+`M&!;bXA=>=<==>5!	
+
+	
+		
!7?>>>=>=?HT]K=4
5L"	
+*@HH><<====<.
+		
+
,<>>>>==<DSLM9


+	)M)

+WS?<<<=<<>4
		

+
+
+	
+

+
+
1><===>AECYiUM2	DL			
+
EcURRMC<;<=5

+



	
3=<<<=ENTTLPUQS>
		
4P'		
+":OP_xu_T>:<>2
	

+					
+
+
+
0>=<;H\`YRJFGFCC=+
+
=>
			
+
. at K^\F,DdE:<?+
+		


									


&?=;Cd{kPGDCDHGA>:.

"7A			'<GE>7#Z|K9==


									

;>:Lx�fF>>>?ACC@@:,'EPK= 
+		'7<=>=5(FvyE;>5*

								

,?;H}hB;<=>>?@BBA90
%2S{t_H8'
+"2@@@BBA?Rhui<=?J)
+

								

:>>nzsL;<====>>BC@;78<EXgb\hgT>8)''1?EDDCCCGUklN<>3

+
						
+

+,?=Omh?<======>ACB?=@F\SUEDWHO%2@?<=ADGGDBBDMchwo>>8


					




+	
+??=gzhe>=======>@EI?7DJE<IPFO=F)
7?=ACEGFBAAFTgh�P=?%

					


+



+
+
+	
&I@??pq`i@========AI?"1?>==<FTI<?=
	+ at DDEFFDA@DNbb~S>@7																		
+


	

3???Xq`gI:<<<=<<>A< %>>>>===ZF==EA/*CEDEHDABFNXklB???!															
+


+

+<??@BVnm^<;;;<;=AB/"6>=>====C?=>>?@@,=DBJPIDGLUkM??>?5
+																				
+
+
+
+
3@??A?<IgbO<::<>CMWME><>>==>=<==>>==?@8;L[SXhjeSORb@?@>>?
																										
+
+

 ?>??@?><\cXSEEFJRV\`N?=>>==>====>==><?MWUWZ[Y_p[MU^=??>?@0																													
+
+		
4?>??@>=<VdXeQMQY[OBB?==>>=>>====>>>>>=@A at ACCIU``gj`=>????<
																												

+	
>>???@>=<Rnh_YRONHA=====>>=>>====>>>>>><<<<>@JUPJLdj>>??>?@'
+																																
+

+
+
*@>?>??>==Uxycg`XMB===>>>>>>>>=====>?>>==>=<=?IJ?<>QcB>???>@5
+																																						
+

6???>??>=?^ytdj[LC>==>>>>>>>>>====>=>?>==>===<=<<<<MbI=???>?>																																			
+

+
=??????==A_tqaUE==>>==>>>>>>>>=>==>>>?>=>>=====>>=;OpW>@@???@%
																																										
+


!@>???@?<=Fapk\H=>>>>>>>>>>>>>>===>>>>?>>>>>>>>=>>><JqfA?@???@4
																																					
+
+

*A>???A><=N^seP?=>>>>>=>>>>>>>>===>>>>?>>>>==>>>>>>=FosI>@????=

																																									
+
+

1@???@A=<AZReeJ=>>=>>>>=>>>=>>>=>===>>?>>>===>>>>??>FfsV=@@???@!

+																																									
+
7????A?=;O_P^]G>====>>>>>>>>>>>=====>>>>>>==>>>>?>?>Ihj\A?????A.


+																																										
+
;???AA?;Dg_\aNB>==<=>>>>>>>=>>>>=====>>>>=>>>>>>>>?>KoecK??@??@8

+																																									
+
+
>>?@A@>CircbI?>>>>==>=>>>?>>>>>=====>>>>>>>>>>>>>>?>InhdY>@@@>>>
+																				

+																				
+
+
 @??@@@Aj{yiF===>====>==>>?>>>>>=====>>>>>>>>>>>>>>>?A^qqjA??@><@$

+																				

+

																		
+
+'A;?A@?Q{joL=>>=<<==>===>>>>>>>>====>>>>>>>>>>>===>>>=AgynO??@@?@,
+																					
+
+
+

+																	
+
.A;@A@?d|c\>>?>=<=>=>>=>>>>>>>>>>===>>>>>>>>>==>==>===<Jlb[??@@?@3


+																				




																	
+
5A@@B at Bs}jI=?>>=====>>>>>>>>>>=>>==>>>>>>>>>=>>>>>==>>>>_\`D?@@?@9


+																				
+

+

																
+
+
;@@AA?Hzy^>>>?>>=>==>>>>>>=>>>>>===>>=>==>>>>>>>>>=>>>>=OcmT?@@@?=


+
+																																								
+
+
>?@@@?U�yO=?>>>>====>>>>>>>>>======>>=>>>>>>>>>>>>>>>>>>Dg}g@@@@??


+																																												
+
@@@@@?d�kB>>>>>>===>>>>>>>=>>>>==>==>>>>>>>>>>>>==>>>>???cxtF@@@?A#

+																																											
+
+
%A@@A at AjwT=??>>>>==>>>>>>>=>>>>>>=>==>>>>>>>>>>>>>>>>>>>>>W{�O?@@?A*

+																														
+												
+
+
*B@@@?GuqE>?>???>=>>>>>>>>>>>>>>=>>>=>>>>>>>>>>>>>>>>>>>>?I}�\?@@?@2



+
+																																								
+
+
+
0A@@@?T}Z>??>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?Ct�m@@@@@8

																																										
+
+
6>=A@?f|M>??>>?>>=>>>>>>>>>>>>>>>>=>>?>>>>>>>>>>>>>>>>>>>?@pxF@@@@;

	
+																																								
+
+
:>?@@DwuD??????>>==>>>>>>?>?>>>>>>=>>>?>>>>>>>>>>>>>>>>?>?=a�}S?@@@=

+
+																																								
+	
+
=@@@?O~k@??????>>=>>>>>>>?>>>>>>>>=>>>?>>>>>>>>>>>>>>>>?>?=J}|a?@@@>

+
+																																										
+
+

?@@@?^�c????????>>>>>>>>>>>>??>>>>>>>>??>>?>>>?>>>>>>>>????>f�nA@@?@


+																																												
+
 @@@@@n�a>????????>>>>>>>>>>??>>>>>>>>>>>?>>>>>>>>>>>>?>????>O�uG?@?A 

																																											
+
+
#@?@@F{�S>????????>>>>>>>>>????>>>>>>>>>>??>>>>>>>>>>????>???Bw�R?@?A%

	
+																																									
+
+
'@?@?P�lA??????????>>>>>>>>?????>>>>>>>>????>>?>>>>>>???>>??@=c�]??<A(

	
+																																								
+
+
+
)@?A?\�W>?>>>???????>>>>>????>>?>>>>>>>>>???>>?>>>>>?????>??@>Q�g@@?A*

	
+																																							
+
+
+
+A?@?g�H>??>>>???????>>??????>>>>>>>>>>>?????>>>>>>>>???>>>?@>H~sC@@A)


+
+																																						
+
+
+
-A?@AqxA???>>>?>?????????????>?>>>>>>>>?>?????>>>>>>>>??>>??@?CuxG?@B*


+
+																																						
+
+
+
-A??Db=??>?>>>>>???????????>>>>>>>>>>>>>>????>>>???>??>>>??@?@oI??B)


+
+																																							
+
+
-A?>K�J>??>>>>>>>>>?????????>>>>>>>>>>>>>>????>>>?????>>>????@>d�O>?A)


+
+																																							
+
+
+A?=U|B???>>>>???>?????????>>>>>>>?>>>>>>>>????>???>?>>>>?????=W�Q>?A'

+
+
+
+																																					
+
+
+

)A?=Vv@?>?>>>>>????????>???>>>=>>???>>>>>>>>?????>>>>>>?>?????=^�O=?A$


+
+
+																																					
+
+
+

%A?<Vt@?????>>>>???????>>>>>>>>??????>>>>>>>????>>>>>>?>?????@?k�M=?A!

+
+	
+
+																																				
+
+

!@?<U|C>??????>>>>??????>====>?????????>==>=>???>>>>>>????????Cu�K<?@


+
+
+																
+																				
+
+

??;Q�I>???????>????????>?><>???????????=<<==????>>>>>>?>?>??>Gy~G<??

+
+																	
+																				
+
+

<?<K�X>???????????????>BFA>?????>???????=>=>?????>?>>>>>>>???Gy|C<?<

+
+
+																																				
+	
+

7@<DyqH>??????????????>CF?????>>>?>>????>CA????????>>>>>>????H}z@=?7

+
+
+
+																																					
+
+/@=>t{c>???@??????????==>?????>>>>>>>???>?@?>???????>>???????L�s==@/


+
+																		
+																		
+
+
+
'@><fyqD??????????????>>??????>>>>>>>???>>=>????????????????>R�f;=@'



+
+
+															
+
+																			
+
+


?>=U|zX>?????>>??????????????>>>>>>>????>>>?????????????@?@>^�W;>?



+
+
+
+															
+																				
+
+

9>>Fzur@?????>????????????>>>>>>?>>>??????????????????@@@@@?o�I=>=


+		
+														
+	
+																				
+

0@>?lo|R=???????????????>>>>>>>>?>>?????????????????????@@?Equ@>?7


+
+
+
+												
+	
+
+																				
+

$@?>YtkrC??????????????>>>>>>>>>?>>?????????????????>???@@>P|d<>@/



+
+															
+
+																					
+

=?>Gv`s^>@????????????>>>>>>>>>?>?>??>?????????????????@??bxQ<>@%
+

+
+																
+	
+																		
+
+
+
5@??kh[vC??????????????>>>>>>>>?>??>>>?>????????>???????>R{rA=>>


+															
+
+
+
+	
+																			

(A?>Ttc|O?@???@??@??@?>>>?>>?>?>??>>>>??????????>?????@>Ix}`;>?8

													
+			
+
+	
+																				

>?>Crjr]>@@@????@??????>>???>??>?>>???????????????????Dt{I=>A,


+										
+			
+	
+
+	
+																					
1A>=_x`n@@@@??????@@@???>>??>??>?????????????????????@j{|m=>>?

+

+							
+							
+
+
+	
+
+	
+
+																

???F}kxO?@?????????????>?????>>?????>>???????@?@?@@?Msc�M<>@6

					
+			
+							
+	
+
+	
+																	
+6@>=f|hh@@??????@???????>????????>??>??????@@@@@@@@>alxl=>>@%


+										
+
+	
+
+
+
+
+	
+
+
+																		#@?>G�lrZ>@?@??@@?@?????>?????>>>>>?>?????@@@?@?@@>Mux�F=?@8
+

+										
+
+
+
+
+
+
+	
+
+
+	
+																
7@?<d�myS>@@@@@@???????>>???>>?>?>>??@???@@??@@@?Twq�Z<??@$
+

							
+
+
+		
+
+
+
+
+
+	
+		
+	
+													
+
+
$A?>A~�o|T>@@@@@?????@@?????????????@????@???@@>X}r�n>>>@5
+

+					
+		
+
+
+
+	
+
+
+
+	
+	
+
+					
+											
5A?=K�zn}U?@A@@???@?@@?????????@???@???@@??@??Xzf�|C>>?>

+


+						
+	
+
+	
+
+
+
+
+
+
+
+	
+															
+
+
>@?<W���M?A@???@@?@@????????@@@@@@@??@??@?Dgzix�H=>?@&

+

+
+								
+
+
+	
+
+
+
+		
+
+		
+												
+
+
*A??>`��zkB@@????@@@@??????????@?@@@??@@@>Enucx�L=??A+
+


+									
+	
+
+
+
+
+	
+
+															
+
+
+
+
4A???Q{ul`A>?@??@@@@@??@@???????@@@?@@@?Orpdy�L=??A/
+


+
+							
+		
+
+
+
+
+
+
+		
+
+											
+
+
+
+
+9A>?>T~gh^Q@?@??@@@@@?@A@????????????C\uxx��K>??A1



+
+
+							
+		
+
+	
+
+	
+
+
+														
+
+
+

;@??>RnpcoiL>>?????>?A@?>??@?@@@??K`olhs�eG>??A1
+



+
+
+								
+
+
+
+
+
+		
+																	
+
+


;A??=Gx~_]q_NEBBDJQQNMOME@>>>>?MhttkhtvS=>?@A1



+
+
+
+									
+
+	
+
+
+
+																		
+	

8A??=Er�jt|vnkijhjia^djmg`]^`guxt~�wVD>??@A/
+



+
+
+
+
+									
+
+
+
+
+																				
1A??>@Up�udba`TRTSRTV]deiha\bk�}fG>?@?A>(	



+
+
+
+	
+									
+	
+
+
+															
+		
+
)?A??==Lo�neZVQPQOOQTUUQSWXk�|U@?@?@A7

+



+
+
+
+
+
+	
+								
+
+	
+																	
+
+
+
 9A@??=>G[o}�{wpkhfbddiq}��oVA>@@@A>+

+



+
+
+
+
+
+
+										
+	
+													
+		
+
+
+
+


->A@??>=>CMXajs{����~vhTD==??@A at 2

+
+



+
+
+
+	
+
+										
+		
+											
+					
+
+
+




1?A@??@@>=<<=?BDDC?<<<>?@@A?5!

+



+
+
+
+
+
+
+
+
+											
+																
+
+
+
+





/;@A@@???>>>>===>>?@@@?9.


+





+
+
+
+	
+	
+
+								
+											
+						
+
+
+
+



+
%2:?@AAAA@@@@@A@>81*


+




+
+
+
+
+
+
+	
+	
+
+			
+				
+								
+						
+		
+
+
+
+


+
+
+

%).1457751+$
45







+
+
+
+
+
+
+
+	
+				
+													
+											
+
+
+
+
+
+


+
+






+




+
+
+
+
+
+
+
+
+
+
+			
+
+	
+
+	
+
+	
+
+
+
+		
+														
+
+
+


















		
+
+
+
+
+
+
+
+
+
+
+
+
+						
+
+		
+
+	
+
+
+	
+
+														
+	
+
+
+
+

+
+
+
+




+
+


+
+
+
+
+
+	
+	
+
+
+
+		
+
+						
+
+
+
+
+	
+
+
+																			
+
+
+
+
+

+
+

+

+
+

+
+
+
+
+	
+
+
+
+
+
+
+				
+			
+			
+
+	
+
+																				
+
+
+
+
+

+



+		
+
+
+
+
+
+
+
+
+
+
+
+
+									
+		
+
+	
+
+														
+
+		
+
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+						
+			
+			
+
+	
+										
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+	
+		
+
+
+					
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+

+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+

+

+
+


	
+

+	
+		
+
+






+	



+
+






			
+		


		



			
+
+
+
+				
+

+
+
				
+







	
+		
+		
+
+	
+



+
+		
+
					
+
+
+


+		
+	
+
+	
+
+					
+
+

+

	
+		
+				
+		
+		
+

+
+
+			
+

+
+	
+
+									







+
+
+
+	
+


+
+
+					


+
+
+
+			
+				
+
+










+
+
+







+	
+
+				






+		
+			
+


&+.39;8/&)/0/+&

+	

	

+	


'3:=>??>=<=?>>?>>??>92&

+		
+
+
+		


+			


-:???>=<;<=<<==;;=<<>>>?>9(

+		
+


+	
+


/<?>>===<<EMNNIFCL_`SE=====>>:-

+
		
+
!3=?>=>===;FYma:?OXh{iNFUUB<=>>=>?</
	
+
+		
+

3>?>>=>>==<IfJ7C( 7`{d7
'OOC>=>===>>;+
+			
+	
+
)<?>>>>>>=>AEaV	#(<mV3

/?TM=====>==>4

+
	
+	
+



	

1>>=>>>==>?FIUnC
!:UyK

+	$9T_G=A?===<<=8

+
+






+
4===>>>>===>CFYqA+DOng.
+
%?V_KHX[VJA;;<>7
	
+
									

	
1>=<<>?====<<?BNcF%,8A at EX=
$CTLDBGR[VZS?:<>1
+
+
+								

)><;<HF><====>??FRD*2DIKMK=
	
+
=KHCBA?DHUvrK9<>&

+						

<=:GdZ@=>>>>>?>=HRB-(9GJ6<>9!
#;FHC@@??AHi}}Q9=9) 
							
1?:K~xE=>>>>??>==GJ?:.59=H$BA9$'4>HHC??>>>@Llv|F;>I1

									
+
==Bv�Y<>>>>>??><=CF><<<I_dC%]XA><<?IFA?>=====Rnzh<=:
	
									


+	

3?<axrK<>>>>>?>=<=CKB>=ERZLEQUM3??>?GC?>=>===<Bfr�J<<



							





+	
5@=BxpsH<>>>>?>>===D@*F\ENI=RIF&-8DID@>=====<>_i~d<?/
															
+



	
+
.L?=J�mqN<>>>??>====C(
)BD<>LKO?E"

(LHA?>==>=<@bbvl>?<																
+


+

7?>H|sr]==>>>>>>>=>?#&??<=<?\J<AE

.HC?>==>==GeeyO>?@+

+																			
+

+		

 >??@TyrF<=>>>=>>=?<,9>=====MB==GC3
	3 at A@>=>>@Vbm[????;
																										
+
+	

7???@>G\wc@<>>>==<<ALK@=>====<===<>@?*#3 at HC@??@HZ[f??@??@(																											
+
+		

&@>?@@?<:ZtV=====<=?Jc\?>>==>========@JGJ^XNIIIKLHYX<>@???8																															
+
				
8????@>=<NpjO><==?@AKSC=>>==>=======><ASZcZURWUNLQ`Q<>@????!
																															
+


!?>????>==GlpeNBBBDDDF?=>>==>>====>>=>>=CJKXd`^WWefbQ<>????@1
+																															
+

+

/@>???>>=>DduolVPTMJG@<=>>==>>====>>>>>=<<=Jbbffeba_L<=??>??;
																																			
+
	
:?????>>=>Hcpuzlf`MB>===>>==>>=====>>>>>====DKUUMJYoY<=????>@!																																					
+

+

??????>==>L`owsjWH?==>>>>>==>=====>>>>>==>>==<;;>CYzrD=?????@.

+																																					
+


'@??????<>>QXgpkR?<==>>>>>>=>>>====>>>>>==>>=>>=<<?PsyS<?@????9
+																																			
+

/@????@><>CVR]oaC<<=>>>=>>>=>>>====>>>>>>>>=>>>>=<=Jld=>@?????																																							
+
+
6@???@@=<=MOFUhT@<<>>>>=>>>=>>>>===>>>>>>>==>>>?>==IftnG=@@???@'

																																										
+
:????A?<<DTIOSRLEDA=>>>==>>=>>=====>>>>>>==>>>>>>>>KfedX=?@???@2
																																								
+
+
>???@A>:@]VPJADEDIG==>>==>>==>>====>>>>>>=>>>>>>>>?Jhb]k@??@???;
																																											
+

????A@=Cdn[G=>>=<<<====>>>>=>>=====>>>>>==>>>>?>>>>BkoWtO>?@@?>?

+																				
+																				
+
+
+%A??@A?>fymP>>>>=<<=====>>>>=>>======>>>>>=>>>>>>>>>=Demw`>@@@>:A&

+																				

+
																		
+
+
,A>?AA>K�pYA=>>>=<=======>>>=>>======>>>>>>>>=>>>==>=<AoecI??A?=@0
																					
+
+

																		
+
3?:?A@=[�aH=>>>=========>>>>>>>======>>>>>>>>=>=>>==>><N[UV??A@?@7
																					


																	
+
+
9>=@B@>l}R>>>>>========>>>>>>>>>====>>>>>>>>>=>>>>>>>>>@aWcC@@???<

																					
+



																	
+

=>?@@?CyyF=>>?>>>===>>>>>>=>=>=====>>>>>>>>>>=>>>>=>>>>>UgxR?@@???


+																																										
+


@?@@@>N�g?>>>>?>====>>>>>>=>=>=======>>>>>>>>>>>>>>>>>>?Eo�_?@@@?@!

																																										
+

$A??@?>Y�X=>>>>?>====>>>>==>>=>===>>=>>>>>>>>>>>>>>>>>>??>`|jA@@@?A'

																																											
+

)A?@@??czN=>>>>?>>==>>>>>>=>>>>>>>>=>>>>>>>>>>>>>>>>>>>>?>Lw{E?@@?A-



+																										
+															
+
+
.A@@@?DspE>?>???>>=>=>>>=>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>?>Cr�N?@@?@4


+																																											
3A@@@>P}f?>>>>??>>==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>???h\?@@?@:

																																											
+
9<<@@>c�R>?>>>??>==>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>=>>>>>??>cmA@@@@=

+																																									
+
+
;??@?DspB??>>>>?>===>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>??>>=V~yJ??@?>

+																																										
+
+
>?@@>NuR>???????>>>>=>>>>>>>>?>>>>=>>>?>>>>>>>>>>>=>>?>?>>>Fw�Y?@@??


+																																												
+

??@@>_qD>>>?????>>>>=>>>>>>>??>>>>>>>>?>>>>>>>>>>>>>??>>>???g�h?@@?@ 

																																												
+
!@@@@@qi@>>>>>????>>>>>>>>>>?>?>>>>>>>>?>?>>>>>>>>>>>??>>>???O�xC?@?A$

																																											
+
+
%A?@@F�]>>>>?>>????>=>>>>>>>???>>>>>>>>>>?>>>>>>>>>>?>>>>>???Au�M?@?A(

	
+																																									
+
+
(A?@?P�P=>>??>?????>>>>>>>>???>>>>>>>>>>???>>>>>>>>>?>>>>>???=e�X??:A,

	
+																																								
+
+

+@?@?[�H>??>>>>??????>>?>??????>>>>>>>>>>???>>?>>=>>??>>>????=T�c?@?A-


+																			
+																				
+
+
+
,@?A?c}E>??>>>>>>?????????????>>>>>>>>>>????>?>>>>>???>>>????>I�qA@?A.



+
+																			
+																				
+

-@?@@owA????>>>>>>????????????>>>>>>>>>?>?????>>>>>????>>?????AxwD@?A.


	
+																		
+																				
+

.@?@Ch=????>>>>>>>????????>>?>>>>>>>>>>>???>?>>>>???>>>>????@>gG??A-



+																																							
+
+
+
.@?>J�O>????>>>>>>>????????>>>>>>>>>>>>>>?>?>??>>??>?>>>>????@>\�M>?A,

+
+
+																																							
+
+
-A?=UzA????>>>>>>>>??????>?>>>>>>>>>>>>>>>?????????>>>>>>???@@>]�P>?A*

+
+
+
+																																						
+
+
+A?<Zq????>>>>>>>>>?????>>>>>>>>>???>>>>>>?>????>>>>>>>>?????@>d�M=?A(

+
+
+																																						
+
+


)A?<[j>???>>??>>>>>????>>>>>>>>???????>>>>>>>???>>=>>?>???????>i�J=?A$



+
+																																						
+
+

%A?<[l>????????>>>?????>=>>>>??????????>>>=>>???>>>?>?????????@r�I=?A 

+
+																	
+
+																			
+
+

@?<Y|@???????????????????=>???????????>><===>???>>??>????????Cx�F<?@



+
+
+																	
+																			
+
+

>?<P�M>???>???????????@AC?>???>?>>??????===>???????>>>>>>>???Do{C<?>


+
+																																						
+
+

:@=F�hA??????????????>?BC????>>>>>>>?????AA????????>>>???????Evx?=?9


+
+
+																																				
+
+

3A=?wzY=?????????????>=>>?????>>?>>>?????BGA>??????>>??????@?H�r==@2


+
+
+															
+																				
+
+

)A==jxn@??????>>?????>=>??????>>>>>>??????C@>??????????????@?O�d;=@)



+
+																
+
+																			
+
+

@>=X|tO>????>>??????????>>>>??>>>>>??????>=>?????????????@@>Y�V;=@ 


+
+
+															
+
+																				
+
+

;>>Hyri?>??????????????>>>>>>>>>?>>?>?????>?????????>????@@?l�I<>>


+
+
+														
+
+	
+																		
+
+

1@>?ln{M=??????????????>>>>>>>>>?>>>>>???????????>>>>????@?Fzy@=?9


+
+
+															
+
+																		
+	
+

$@>=ZrjlA??????????@???>>>>>>>>>?>>>>>>>?????????>>?>????@>X�e<>@1



+
+														
+
+
+																				
+
+

=?>HwRk\>@????????????>>>>>>>>??>>>>>>>>????????>>>??????Cm�Q<>@'
+


+
+															
+	
+																		
+
+

4A??keUuD?????????@???>>>????>??>>>>>>>>????????>>?>????>]zuB=>?
+

+
+															
+
+
+
+																			
+

%A?>Tx^wR>???????@????>>>??????>>>>>>>>>??????????????@>Oz`<>?9

	
+											
+
+			
+	
+																				

<@>Cuck_>@@@@@??@?????>>???>??>>>>>>>>????????????????Exw|I=?A,


																
+
+	
+
+			
+															
+
-A?>_yko@@@?@@?????????????>??>>>>>>?>>????@??@@??????gwzm=???

+

+																
+
+	
+
+		
+																

>?>FruM?@@@@???@@?????>?????>>>>?>>>?????????@???@?Ixe�N<>@6

														
+		
+	
+
+
+
+																	
+
1A>=g�mg?@@@@@?@@@@??????????>>>>>>>??????@?@@@@@@@>]npn=>>@$


+											
+			
+	
+	
+
+																			


??>H�lvS>@@@@@@@???@??????>?>>>>>????@???@@@?@@@@?Fnw�H=>?8


+					
+				
+		
+	
+
+	
+
+	
+
+																
1A?<c�luN>@@@@@????@?@????>?????????@@?>?@@??@@@>Hoq�^<??@$



+						
+	
+
+	
+
+
+
+	
+	
+	
+																	
+


??>A}�p{O>@@@@???@@@@???????????@?@@??>?@@@?@@?Kvv�s?>>@5
+

+							
+		
+
+
+
+
+
+
+	
+			
+
+	
+												
+
/A?=M�zo{K?@@?????@@@??????????@@@@????@@@@@@>MyozE>>?>




+							
+
+
+
+
+
+
+
+
+
+
+	
+
+			
+			
+							
+
+
;@?=[���vB@@@@????@@@?????????????????@@@@@>Sxkq�L=??@'
+

+
+						
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+				
+							
+	

%@??>e}�Y>@?@@???@@@@????????????????@@@@?Vxht�P=??A+
+


+							
+
+
+	
+
+
+	
+	
+
+																
+
+
+

1A??@UhmS=??????@?@@???????>>???????@@@A]zwz�Q=??A/



+
+							
+
+
+
+
+
+
+
+
+
+
+	
+													
+
+
+

8A??>VvekYD>@@?????@??@@?????@@??@??>>D^vr��Q=??A0



+
+
+								
+		
+
+
+
+	
+
+
+		
+										
+
+
+
+

;@??>^ugkuS??@?????>?A@???@@@@@@@?@L_lc\iJ>?@A/




+
+
+								
+
+
+
+
+
+		
+			
+													
+
+


;A??>Rvqln^H@>>>@DJLKIE@>?????>>Hg�pit~]>>??A/




+
+
+
+
+							
+
+
+
+
+
+
+		
+														
+
+	

9A??=Lz~gzncZW]gmng^af^OHCCFMWcnt{�xnQ>??@A/
+



+
+
+
+
+
+								
+
+
+
+
+															
+		
+
+
4A@?=Cbt�n`_`d`\VTRUYbjnggjff`Ri�lN?>??A?(
+



+
+
+
+		
+								
+
+
+
+			
+													
+	
+
.@@>?=@Yy�tf^[XQSRMRTY^_\VUXax�fA>@?@A: 
+



+
+
+
+
+
+	
+								
+
+	
+																	
+
+
+
&=A??><@Qk{�vwokdbadehlw��{gK=??@A at 0

+



+
+
+
+
+
+
+										
+		
+																		
+
+


4 at A???>=@JU`iow~�����zp^L@<>??@A7!
+




+
+
+
+
+
+
+	
+
+										
+																	
+
+
+



#6 at A?????=<<=>ADFEDA><;=???@A9'

+



+
+
+
+
+
+
+
+
+									
+	
+
+																
+
+
+



+
"3>A@@@???>>>>===>>?@@A@=3#

+




+
+
+
+
+
+
+	
+
+		
+							
+																		
+
+




+

+7<@AAAA@@@@@AAA?:3.%

+





+
+
+
+
+
+	
+
+	
+							
+
+						
+										
+	
+
+



+
+
+
!',0489::73/* ;'







+
+
+
+
+
+
+
+		
+	
+	
+
+			
+			
+		
+														
+
+
+
+
+
+

+



,






+
+
+
+
+
+
+
+
+
+
+		
+
+
+					
+	
+
+
+																		
+
+
+


















+	
+

+
+
+
+
+
+
+
+
+
+
+
+	
+					
+	
+
+	
+
+																		
+
+
+
+
+


+
+
+
+




+
+


+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+			
+		
+	
+
+
+															
+		
+
+
+
+
+
+
+
+
+
+
+

+
+

+
+
+	
+
+
+
+
+
+
+
+
+
+		
+	
+				
+		
+	
+
+																
+			
+
+
+
+
+
+




+	

+
+
+
+
+
+
+
+
+
+
+	
+
+							
+		
+
+	
+
+														
+			
+
+
+
+
+
+
+
+

+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+										
+
+		
+
+												
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+		
+		
+
+
+						
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+

+
+		
+
+
+

+
+
+
+
+
+		
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+

+

+
+






+				
+








+	


	
+







+	







+
+
+
+	
+

+	
+


+
+




		
+
+
+
+
+
+
+

+					
+

+	
+
+	
+
+
+		
+	
+
+
+		
+
+	
+			
+				
+	
+
+		
+
+						
+
+
+			
+		

+
+									
+	
+		
+
+				

+					









+
+
+
+		
+
+		
+
+
+
+	
+

+		
+
+
+				

+		
+
+
+				
+
+
+
+




+	
+
+
+





		


+			

+
+
+














+			
+

		
+
+
	
+
+

 '161&
 #$"


	
+


	
+

+	
+



*38;=>>=>?>>>>>=:5,!
	
+	
+
	
+
+
+		
+



$3<?@>>==<<<=====<=>??>8)

	
	

+

+
+


(6>??>>><;<>><<<<@A=<=>>>>?8-
+

+

$1:>>>>>>=<=HYXSJDKZjhTF?<=>>>??=5%		
.:???>===>><CGLlqjjeox_XMNK>=>>>===?>7$						
+
+';?>>>>>>>==;B[B/Ekvtww_837HPLA==>>>=>>?=0
+
			
+


	
+
/>>>>>>=>>>===Ma=.:]u{yiF+'&8OZK><>>=<<===>6

	



	


+
+
2>=>>>>>======>Va at 7;WxxytG'-KaN?==<<===<<=>7

+
+

							


+	
0>==>>==>>>>=>?>N[;6Aevb`mN* #/LaG?==<<=@A?;;<=4
+

+

+						
)>=<=>>>???>>>??>GS;7R{k6.B<6*/2JSB?>====>COQ?:<=+
										


<=;=B>>??>>>>??==HK=;G\F+==:56GPA=>>>===<EltN9<;&

+							
+
2?;A[K>?>=<<<>?>==HG=><;>+K?<;=EOA<=??>>>=;N�Q9=F:
+									

+	
+==@psB>>=<;<<=?>==GL<<94]^#'ZQ@;<BKB==>???>><<a|{C<=#	
							





+

7>;a�f>>>=<<<<>?>==FNCE!$WLBQMJ5 BKA==???>>>><Iq~`;=&


										
+
+


		:><F~xd=>>=<<==??===>/';EFOL>NSH0
FQ@==>???>>==BluyB>7
												
+




4K><K�m>>>>>>>??>===<
;^I=NHNHO$,2?G@==>>???>=<Gll�I>?
																

	

:?>Gs~tD=>>>>?>>>===<
(KI<<B^K;SA
$9@==>>>>??><TmokC?@2
+																					
+

+


#>>?A_tvW=>>>>>>=>==?=/=C=<==^F<F\I"1A?=>>>>>>=@dsnI@??>

																										
+
+
:?>??HXnsG<>>>>>===<>IF@<<===B>=>FNJ:6A@>===>===PpiE>@@?@1																										

	
+

+@>>??>=FUaA<>>>>===<?]S<==========>ERIA?><<<<==FZnP;>@@??=
+																												
+

+		

<>>??@>=<Dm]>=>>===>>FQB============<HZTJE@>=<=CMVhI<>@???@*																														
+


'A>>???>=>AYfW>====>?CFA=>===>========<If_OKFB?FW^YgI<>?????8
+																												

+	
5A>???>=>>?SfqS@<<>AGIL@=>===>====>==>=<KTM[\OSgmpdiJ<=?@????

																													
+

+
=?????>=>>?P_tr[GBDFECC>=>==>>=======>>==@BQaemrysruO<=????>@+
+																																		
+


#@???>?>>>>@RYjrodQEB?=<<====>>====>==>>====?BJU]ksyxU<=????>?6
																																			
+


-@>?>??>=>>EUZcgkdPB>====>>==>======>>>>=>>>==<?HWgtv_?=?@????=
																																					
+
5@>?>?@?<>>QTLTZ]TG?==>==>>=>>=====>>==>=>>>=>=<>J_qzqK<>@????@$																																							
+
+
:@???@A=<>DWKKPQOKB=<=>==>>=>>=====>>=>>>>==>>==>E\ov}d==@@??>@.
																																							
+
+
=??>?A?=<?SSSNDCR_V@<=>==>>=>>=====>>=>>>==>>>>=?CVn`lwH<?@???@6
																																								
+
+

@????A>;@UXTI==?H^mM;=>==>>=>>====>>>=>>==>>>>>>>?CUVXu[:>@@???<

+																																								
+
+
+%A???@@=Be_S@==>=;:;<===>=>>=>>=====>>>>>==>>=>>>>==>MWfnB>?@???@


+																																									
+
+
,A???A?>f}_B=>>>==<;;<==>=>>==>=====>>=>>==>>==>>====<Ipz]=?@@?<A'

+																				


																			
+
2A??@A>F~zH<>>>>==========>>==>======>=>>==>===>===>>>>]ajF?@A?9?1

																					
+

																		
+
+
8@??AA<R�_>>>>>===========>>>>>======>>>>>>>=====>=>>>=G]dX>@@?=?9																					

																		
+
+
=>>?A?<a|L=>>>>>>=========>>>>>>====>>>>>>>>>====>=>>>>>cpjA?@???>
																					


																			
+


?;>@@?@vwB>>>>>>===>======>>>>=>===>>=>>>>>>>====>=>>>?=Qx{I>@@?>@

																																											
+

#@;?@@>H�c=>>>>>>==>>>>=====>=>>==>====>>>=>>>>====>=>>?>Dy~S>@A?>A$

																																										
+

)A>?@?=R~N=>>>>>>==>>>>>>===>>>===>>=>>>>=>>>>>>=>===>>??>`}_>@@@?A)

																																											
+
.A??@?>awC>>>>>?>=>>>>>>>>==>>>>>>>>>>>>>>=>>>>>=>=>=>>>?>Iyk??@@?A.
																							
+																			
+
2A?@@?Avg>>>>>??>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>>====>>??>CnuC??@?@6																																											
+
7@??@>M�T=>>>>??>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>=>==>?????fzN??@??;	
+																																									
+
;<<@?>atB>>>>>>?>=>>>>>>>>=>>>>>>==>>>>>>>>>>>>>==>>>>?>??>a|a?@@@@>
																																											
+
=??@?CsW=?>>>>>??>>=>>>>>>>>>>>>>==>>>>>>>>>>>>>==>>>??>>?>W{vE?@@??

+																																										
+
+

??@@>NoA>>>>??>>?>==>>>>>>>>>>>>>>=>>>?>>>>>>>>>>>>>?>>>>>>Jy}P?@@?@


																																											
+
+
@?@@>`\<>>>>?>>??>>>>>>>>>>>?>>>>>=>>>?>>>>>>>>>>=>>>>>>>??@e}_?@??A"

																																											
+
+

#@?@@AkI=>>>>>>>>?>>>>>>>>>>>?>>>>>>>>>>>>?>>>>>>>>>?>>>>???>L�tA@@?A&

																																											
+
+
&A?@?HoA>>>>>>>>>???>>?>>>>>???>>>>>>>?>??>>>>>>>>>>?>>>?????@j}H???A*

																																											
+
+
)A?@?Pq?>>>>>>>>>???>>??>?>>>??>>>>>>>>>>?>>>>>>>>>>?>>>?????=X~S>?<A.

	
+																																									
+

,@?@?Yu???>>>>>>>>????????>???>>>>>>>>>>???>>>>>>>>>>>>>?????>N~`>@?A0


+																																									
+

-@?@>a{A>??>>>>>>>?????????>??>>>>>>>>>>????>>>>>>>>??>>?????>H~l?@?A0



+																																								
+

-@?A?m}C>????>>>>>>????????????>>>=>>>?>?????>>>>>>???>>?????>F~rA@?A0


+
+																																							
+
+
.@?@B|s>?????>?>>>>?????>??>>>>>>>>>>>>>>??????>>>??>>>>??????CyxD??A/


+
+																	
+																					
+

-A>>G�\=?????>>>>>>????>>??>>>>>>>>>>>>???>?>?????>>>>>>???????n�H??A.



+
+																																					
+	
+

-A>=Q�F>??????>>>>?????>>??>>>>>>>>>>>>>>>>???????>>>>>>??????>c�M>?A,


+
+
+																																						
+

-A?<Yw??@???>?>>>>?????>>>>>>>>>>>?>>>>>>>>>?????>>>>>>?????@@>[�K>?A*


+
+																																						
+
+

,A?<_m>???>>>>>>>>?????>>>>=>>>>????>?>>>>>>>???>>>>????????@?=_�G=?A'



+
+																																					
+
+


(A?<^g=???????>??????>>>>>>>>>????????>>=>>>>>????>???????????=g�F=>A#

+
+
+																
+
+																		
+
+


"A><Yo>???????????????>>?==>>???????????>>>=>>???????>>>>?>>??>m�D=?@



+
+
+
+																
+																			
+
+


??<QC>????>??????????A@?>????>>>>??????>=>>???????>>?>??????@hxB=?>


+
+
+																
+																				
+
+

<@=G�]=????>????????>>?@?>???>>>>=?>????>>?>???????>>????????Csu?=?:


+
+																																						
+
+

5@=@|H=>?????>>?????>=>>?????>>?>?>>???>@EA>?????????@???@@?H�n<=@4


+	
+																
+																		
+
+


,A==m_=?????>>>?????>>?>>>?>?>>>?>>??????DA??????????????@@>S�b;=A+



+
+																
+
+																		
+
+
+

!A>=Z}sI>??????????????>>>>>>>>>>>>>>>????>>???????????????@?^�U;=@"

+
+
+														
+	
+																				
+
+

<?>Hzvd>??????????????>>>>>>>>>>>>>>>>????=>??????>>>?>>??@Ao�H<>>

+
+
+																																				
+
+

3@>?nnwI>???????>??????>??>>>>>>?>>>>>>????????????????>??>Mzw?>?:


+
+																
+
+																		
+
+

$@?=\qha>??????>>??@????>??>>>>>?>>>>>>>?????????>?????????ee<>?2



+
+
+															
+																				
+
+

=@>IvTrU>?????????@???>>???>>>??>>>>>>>>????????????????>LrQ<>@'



+
+																	
+																		
+
+

3A??mibwB?????????@???????>>>>?>>>>>>>>>?????????????????hqtA=>?



+
+																
+																			
+
+
+

$A?>Uz\wR>@?@????@@???????>>>>>>>>>>>>>>???????????????>T~x`<>@8


+															
+	
+	
+																		
+
+

;@?Cuft`>@?@@?@@???????>?>>>>>>>>>>>>>??????????@?????DvtzI=>A*


																
+
+	
+																			
+
+
,A?>`xlo@@?????@??@???????>>>>>?>>>>>>>??????????????>`ssk>??>
+

+																
+
+	
+																		
+
+

=?>G}hvK?@????@@@@???????>>??>>>>>>>>?????????????@?Exb�M=>@4


+																
+	
+
+
+																		
+
-A>=f�pa>@????@@@@???????????>>>>>>?????????????@@@>Zsvm=>>@"


+																	
+	
+
+
+																	
+

=?>G�luI>@???@@??????????????>>??????????@??@?@@@?Fq{�H=>@7


+									
+		
+		
+
+	
+
+	
+
+																

,A?=a�soF>??@@@??????@???????>?????@???>?@???@@@?Fms�_<??@#



+	
+									
+	
+
+
+
+	
+
+
+	
+
+														
+

<@?A~�qvJ?@@@??????@@??????????@@???????@?@??@>Isp�t?>>@5
+

+							
+
+
+	
+	
+
+
+
+	
+
+																		
+

)A?=O�wrvF?@@??????@@????????>@@????????@@??@?Lxpu�F>>?=




+							
+
+
+		
+
+
+
+
+
+	
+
+					
+								
+
+

8A?=^�x~h?@@?@@????????????????????????@@@@>Iuoq�O=??@%
+

+
+					
+
+	
+
+
+
+
+
+
+
+	
+	
+					
+	
+						
+
+
+

"@???l�zsM>@@@@@?????@?????????????????@@@?Irqr�R=??A)



+
+			
+	
+
+
+
+
+
+
+
+
+
+	
+
+		
+		
+										
+
+
+

.A?>Bg�bhL>???@?????@@????@?>?????????@@?Ow|��T=?@A+


+
+
+							
+
+
+
+
+
+
+
+
+	
+		
+											
+
+
+


6A?>@cmbjP>?@@????????@@?????@@@@@???>?Jluz�W=?@A+


+
+
+
+								
+
+
+
+
+
+	
+
+		
+	
+									
+
+
+
+


:@?>?^vgqaB>@@@??????A@???@?@@@@@@?AOb``sgF>??A+



+
+
+
+
+							
+
+	
+
+
+		
+
+		
+
+									
+		
+
+


;A???^wmsjM@???>>?CFFB??@@@@?@?>?NjpdhaA>?@A,




+
+
+
+								
+
+
+	
+
+
+
+	
+
+
+											
+
+
+
+


9A??=R|}yt]UMKOXgnb^cSC>>>>>?FWdqzry�]???@@+




+
+
+
+
+						
+		
+
+
+
+
+	
+													
+
+	
+
+

6A??>Fgyy^bfgjhc^XR[dcXOJLT`hcY_s_H???A>&
+



+
+
+
+
+
+
+									
+
+
+
+											
+
+
+		
+
+
+
2A??>=Df~~se[X\UVSQY_dhkka]XYt�rG=?@?A:
+



+
+
+
+
+
+										
+
+	
+										
+				
+
+	
+
+

+?@??>=F[s��}xrlg^^^\`ekq}��sT?>??@@2
+



+
+
+
+
+	
+
+	
+							
+		
+																
+
+
+
+


 7@@??>==DP]isy~������vfTE==>?@A:$

+



+
+
+
+
+
+
+	
+											
+															
+	
+
+
+



&9A@@???>===?AEHJJHEA=;<>>>@A;+
+



+
+
+
+
+
+
+	
+		
+						
+	
+						
+		
+				
+		
+
+
+


+
+
&5?A@????>>>>>===>>??@AA?8)
+




+
+
+
+
+
+	
+				
+					
+	
+
+																	
+
+



+
+
 -7=?AA@@@@@@@@@@@:42+ 
+
+



+
+
+
+
+
+
+	
+
+									
+
+																	
+
+
+
+


+
+
+
 '-269;<;852-#!;


+




+
+
+
+
+
+
+
+
+			
+	
+					
+		
+
+	
+
+								
+	
+		
+
+
+
+
+
+
+


7






+
+
+
+
+
+
+
+	
+
+	
+			
+
+	
+		
+																		
+
+
+
+
+
+





















+
+
+
+
+
+
+
+
+
+
+
+				
+	
+	
+
+	
+
+
+
+																
+
+
+
+
+

+
+
+






	
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+					
+	
+
+	
+
+														
+
+
+		
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+		
+			
+		
+
+	
+
+													
+						
+
+
+
+

+
+



+
+

+
+
+
+
+
+
+
+
+
+
+
+			
+								
+
+	
+															
+	
+	
+
+
+
+
+
+
+
+


+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+			
+			
+		
+					
+				
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+	
+	
+		
+
+					
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+		
+
+
+
+

+
+	
+
+
+
+
+	
+
+
+	
+


+			
+

		









+

				
+


				
+









+				
+
+	
+

		

+						
+
+

+		
+
+			
+
+		
+
+				
+		
+
+	


+				
+
	
+
+	
+		
+
+		
		

			

+		
+
+
+	
+							
+		

+				
+		
+
+							

		

+	






+
+								
+
+
+


+
+
+








+
+




+					
+

+



+
+

+					
+



+					
+
+
+
+
+		

	
+						
+		






+



				
+	
		
+			
+

%.*


	
+


		
+
+
+
+			
+
+	
+



!*3:>>?>==;:60) 
		
+

+

	
+
+
+
+
+	
+
+



 -7<??>=<;<===>???=7- 
		
	
+	
+
+
+


!/9>??>=<<<<;<<<<==>???<2"
		
+

 '-49=???>><==<@B==BA===>>>??=8/$
	
(5<?????=>>>==FOQi|yoaZYKA;<>=<=>??>:.
	#8?>>>>>>>=<===BSey���cZXRD;===>>>>>??<)	
+		
+





+
+->>>=>====>>>=:DNK_z}|}�w^NWcT><>>=>>>=>>>>2	
	


+


	
+
0>>>>==>>>>>=>>;M^QYxvvyzlNHRa\C>>>====>>>>=>5

+
+								


+	
/==>>>>>>>>>>>>>:Q]Qcqf\UVf[QIU]D>>>>>>===>>==>4
+
+	
									

(><=?>>>>>>>?>>>>;ROFi[N++<FeU;IX@??>>>>>>>=>=;<=.
								

;=<=???><;<;<>>>==MD<VZ?
8DJC9FT?>>??>>>??>@LA9<<"				

1?<;>?@><;;;;;<>>>>JA7;?HD!=S<>DMV@=>??>===>?=YrJ9=C>	
						
+		
+>=;JH??<;;;;;;<?>=>J?7::X\CTQB?9ET@=>?>=<==>>=E{}F;>-
+
						
+



+	
8>;OsJ>><;;;;;;=?>>=MLC0*MKJVD=)	CA=>?>==<==>>=d�l<=.


+													
+



>?<Au�N=><;;;;;<>>>==EGA:@BLJIA=-

;@=>>?>==>=>><Yu�L<;


+													
+

	
6I=<Em�W<>><;;<<>?>==>?8:SV9EP at DI>44O?<=>>?>>>>>><Zq�[<@'

+																		
+
+
+	
9>=Kop\=>>>===>>>===><8KdL;?S=BWBGON@==>>????>>>>dn{U>?7
																					
+
	

+%>>=Q�scC=>>>>>>>>====?@ZYB<>Q>?I/?IFA===>>>>>>><Is{fA???#																								
+
		
+<?>>Iuxq\>>>>=>>>====>DHOE>=>K?==-.NKB>==>>>>>>>>d{aC???@6																							
+
	


0@>??@AIblQ<>>>>>==>>=AXRA<===@==?A5OXE>===>>>>>=OtN<=@@>?? 
																			
+
+

=>>?@@<<<A_I=>>>>==>>=ESD<====<===??OfW?<==>>>?>FgoC<=@@??@1																									
+
	

,@>>???===<W]A>>=>>===?GE======<=====?R\K>=<==>>Hdna@==?@?>?<
+																														
+
+
+
+
9?>>?@>=>>=IYW?==>>==?MP@====>=======<>N[NB><=?KaqmY?==>@>>>?%
																										
+



??>?>?>=>>>EWdX><===?CWS>=============<AVSIJHHVhryw\?>=>???>?3																																
+


)@>?>??>>>>>G[fgRA>>@CAEB<===>>====>=====@@BJVepnswk]@==????=><
																																
+
+

3@??>???>=>>PTSY^YNCAE@><====>>=====>=>====>AHUcmpibfH==>??>?>@!
																																				
+

9@?>??@?<=>EWEJQXb^LGE?<<====>======>=>=>>==<=ANdoopkY==>@???>@,																																						
+
+
=??>??A><=>STPMJKLRPKD=<==>==>>====>>=>=>>==<<@EOampljG<=@@???@4
+																																				
+
+
+


???>?A?=;=KZ\PB==E\^L@<<==>==>=====>==>>>===<=?CDGN`ry]<<?@????:
																																						
+


%@????A><?V_\I<==<?RdS?<==>>==>>===>>>=>>>========>=>LjrE;>@@???>																																										
+
,@???@@=AggSB<>>==<<=?=<==>>==>>===>>>=>>>==>====<===<Ksa<>?A???@#

+																																									
+
+
3@??>A?=a�b?=>>>>==<;;<====>==>>====>===>===========>>>e{X=?@@??A+

+																				

																			
+
+
8@?>?B??q�Y=>>>>=======<======>=====>>=====>==<====>>>=LeqE>@@?=@4
																					

+																		
+
+
<??>@A=H~sD>>>>>============>>>=====>>====>>======>>>>>?YyV=@@?9=:																						

																			
+


????@?<X�Z=>>>>>===========>>>>=====>>>>>>>>=======>>>>=Q}d=?@@>>>
																						
+																			
+
+

"@>??@?>k{E=>>>>>=====>=====>>=>=====>=>>>>>=======>>>>>>Ctp@?@@?>@!

+																																								
+

(A=??@>Bxg=>>>>>>==>>>>>>>===========>=====>======>>>>?>>?izF>@@?>A(

																																										
+
.@;?@@=KQ<>?>>>>==>>>>>=>====>=====>>=====>>>>=>=>>>>?>>=]�O=@@?>A.

																																											
+
3@??@?=]}C>??>>>>=>>>>>>>>>>>=======>>>>===>>>>>>===>>??>=N|[=????@3
																							
+
+																		
+
7@@?@??ui=>??>??>==>>>>>>>==>========>>>>>==>>>>>>==>>??>>Fqi??@??@8																							
+																			
+
:><@@>K�M=>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>=>>????AjvG?@???<
	
+																																									
+
=<;@@>bm>>>>>>>?>>>>>>>>>>>>>>>>>>=>>>>>=>>=>>>>>>>>>>????>_}\>??@??
																																											
+
>????ArN=>>>>>>>?>>>>>>>>>=>>>>>>==>>>>>>=>>>>>>=>>>>>>>>?>U}rB?@??@


+																																										
+
+
+

??@@>Mk>?>>=>>>>?>>>>?>>>>>>>>>>>==>?>>>>>>>>>>>>>>>>>>>>?>Dt�L?@??@
+
+																																											
+
+
!@?@@>\X<?>>>>>>>>?>>>?>>>>=>>?>>>>=>>>>>>>>>>>>>>=>>?>>>>>??c�[>???A%
+
																																											
+
+
$@?@?@dH>?>>>>>>>??????>>>>>>??>>>>>>>>>>>>>>>>>>>>>?>>>????>M}k?@??A)
+
																																											
+
+
&A?@?Ed@?>>?>>=>>>??????>>>>???>?>>>>>??>?>>>>>>>>>>?>>>?????@kxD??>A-

																																											
+
+
)A?@?Kd=?>>??>>>>>?????>>>>>?>??>>>=>>>???>>>>>>>>>>?????????>Z~N??>A0

+																																										
+
+

+@?@?Rh=??>>>>>>>>????>>>?>?????>>>>>>?>?>??>>>>>>>>?>???????=Q[>@?@1

																																									
+
+

,A@@>\v?>??>>>>>>>???>>>??>>>??>?>>>>>?>??>?>>?>>>>?>>>>???>?=M}c>@?A2



+																																							
+
+

+@?@>g�E>????>>>>>?>??>>??>>>>>>>>==>>>>>?>>???>>>>?>>>>???>?>M�g?@?@1



+																			
+																				
+

*@?@?s�E>>?????>>>???>>>??>>>>>>>>>>>>>?>???????>??>>>???????>K�pA??@1


+																																								
+

*A??D�o>>>???????????>>>>?>>>>>>>=A?>>>>>?>????????>>>????>???B{}D??A0


+
+																	
+																				
+
+

)A>>K�R=??????>??>????>>>>>>>>>>>=?>>>>>>>>???????>>>>?????>??>f�H>>A/


+
+
+																																				
+
+
+

)A><S}D????????>??????>>>>>>>>>>>>@>>>>>>>>>??????>>>>????????>V�I>>A,


+																																							
+
+

)A><Zu??@????????????>>>>>>>>>>>>???>>>>>>>>>>????>???????????=V�F>>A)



+
+																																					
+
+


'A?<Yk>??????????????>>>>>>>>>?>>?????>>>=>>>>????????????????=[~E=?A%

+
+
+																	
+																	
+
+
+


#A?=Uj>??@???????????>>>==>>>??>????????>==>>>????????>?>??>??=c�C>?@ 

+
+
+																
+																			
+
+



??=Pv@??????????????>>>==>????>?>=>?>???>==>>?????????????????et@>??

+
+	
+															
+																		
+
+
+


<?=G�Q>??>>?>>>?????>===>????>>>>>>>>?>?>=??>????????????@?@?Btr>>?;


+																																						
+
+

6A>?�s>??>>>>>>?????>=<>??>>?>>>>>>>>?????@@????????????????>L�m<>@6


+																			
+																	
+
+
+

.A><m�V=??>??>>??????>>?>>>>>>>>>>>>>?????@AA????????>>>????>]�a<>A-



+
+																
+
+																	
+
+
+


#A>=X�vI>???>?????????>>>>>>>>>>??>>>>????>>>???????>>??>????i�T<=A$

+
+
+																
+																			
+
+
+
>>=H|zf>???????????????>>>>>>>>??>>>>>????==???????>>>?????Et}H<>?

+
+
+																	
+																	
+
+
+

5@>?prxG>????????>?@??>>?>>>>>>>?>>>>>>>??>>??????????????>U{v?=?:


+
+																
+
+																			
+

&@>=]pib>???????>>?@??????>>>>>>?>>>>>>>>??????????????@@?Aod<>@1



+
+																
+																				
+

=?>IwZwO>????>???@@???>???>>>>>?>>>?>>>>????????????@?@@>Uz}O<>@&



+																
+	
+																		
+
+

5@??ljgvB????????@??????>>>>>>??>>???>>?????????@??????@@jmp@=>>

+
+															
+
+
+
+																	
+
+

&A?>Uv`�T>??@???@@???????>>??>>??>???>>>????????????@@?>Nqs\<>@6


+
+																
+
+																	
+
+
+
<@?Cqgxc>@@@@??@@???????>>>?>>??>???>>????????>??@?@@?AmrwH=>A'



+																
+	
+																	
+
+
+

-A?=_vjoA@@@???@@????????>>>?>??????>>???????>>????@@>atph=>?=


+																	
+	
+																		
+
+
=@>F|bqK?@@?????????????>>>>>??????>???????>>???@@@>K�ctL=?@2


+
+															
+	
+																				

.A?=e~q\>@@?????????????>??>>????>>?????????>>????@>eo�j=>>@ 



+														
+
+
+	
+			
+															
+
=?>F�pmC?@??????????????????????????????????????@?Lvx�G>>@6


+
+
+				
+							
+
+
+	
+
+
+
+
+																
,A?=_�xc@???@@@????@?@???>????????????>??@??@??@>Irr�\=??@ 



+
+
+					
+			
+
+
+
+
+
+	
+
+	
+		
+													
+
<@?A}�tlE?@@@???????@???????????@???????@????@>Jtl�t??>A2
+

+	
+							
+		
+
+
+
+
+	
+	
+
+
+
+														
+
)A?=O�ywqB@@@?@??????????>????@????>>?>?@@????Hvos�G>?@<



+										
+
+
+
+
+
+
+
+
+
+								
+						
+
+
8@?=`�u~^?@@@@@@?????@???????????>??????@@@?Clnr�P=@@?"



+
+		
+				
+
+
+
+
+	
+
+
+	
+
+															
+
+
+

!@???q�yjI?@@@@@?????@?????@????????????@@?Elvt�T=@@@'



+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+	
+
+											
+	
+
+

,A?>Dq�aaG>@??@@?@??@???@?@???@@??@???@@?Ipx~�W=?A?&
+


+
+
+		
+
+		
+
+	
+
+
+
+
+
+						
+											
+
+

4A?>BtvcgI>@@@@??@????@@?????@@@@@@???>Hant~Y>?@@$



+
+
+
+
+		
+			
+
+
+
+
+
+
+	
+
+
+	
+		
+									
+
+
+

8A?>CdojoN>?@@@@@????@@???@@@@??@@?>F\cXenI>?@@'



+
+
+
+				
+	
+	
+	
+
+
+
+	
+
+
+
+	
+
+
+								
+	
+
+
+

:A?>>`|ut]E??@@??>?DB>?@@@?@@?@??F[kdg{_C>?@@(




+
+
+
+				
+		
+
+
+	
+
+
+
+
+	
+												
+
+
+
+
+

9A??>U~��sYOGDACRhe_S@>@@@@@?@K`m|py�b@>?@?'



+
+
+
+
+
+
+			
+
+			
+
+
+
+
+														
+	
+
+
+

7A??>Gb�~\^aeghmbWVbYKC???CM_kc\|ygM???A=#




+
+
+
+
+
+	
+			
+		
+
+
+
+
+													
+		
+
+	

3A??>=Jp}xlaa[TX[RS_ggdabda`cp�zL=>?@A9




+
+
+
+
+	
+
+					
+		
+	
+	
+
+											
+	
+
+	
+
+


,?@??>>Kcw��zrmgaX^]]chknv��z^B>??@@1
+



+
+
+
+
+
+	
+					
+		
+
+		
+																
+
+
+



"7@@??><?GVds{��������|m[J?=>?@A;&





+
+
+
+
+
+
+							
+
+	
+					
+
+											
+		
+



':A@@??>>=>@BFJNPONKE@<<=>?@A=.





+
+
+
+
+
+
+
+	
+							
+
+	
+
+
+																
+
+


+
'6?A@@????>>======>??@AA@<.

+




+
+
+
+
+
+												
+	
+
+						
+									
+
+
+



+
 -6;?AA@@@@@@@@@@@:76/%
	



+
+
+
+
+
+
+	
+
+						
+		
+
+			
+												
+
+
+
+
+


+
+

&-37:<=<:63.#+3

+




+
+
+
+
+
+
+
+	
+					
+							
+													
+		
+
+
+
+






*6





+
+
+
+
+
+
+
+
+
+		
+	
+
+
+		
+		
+		
+																	
+
+
+













+
+
+
+
+
+
+
+
+	
+			
+
+	
+	
+
+
+	
+
+
+																	
+
+
+
+


+
+








+
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+		
+	
+	
+
+	
+
+																
+		
+
+
+
+
+


+


+
+
+
+

+
+		
+
+
+
+
+
+
+
+
+
+		
+
+							
+
+	
+
+															
+			
+
+
+
+
+
+
+




+		


+
+
+
+
+
+
+
+
+
+	
+								
+		
+
+	
+
+																
+	
+
+
+
+
+
+
+
+
+

+		
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+					
+
+
+		
+											
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+		
+
+		
+
+
+							
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+	
+
+
+	
+


+					
+


								










		
+

				
+

+









+		




							
+	
+

+

		
+
+			
+
+


+
	


+	
+
+				
+		
+
+
+



		
+		
				

	
+		
+				
+
+
+
+
+


+		
+
+
+					


		
+
+	
+
+		
+




+
+
+
+


		

								



+
+
+
+





+			



					
		
+
+		
+



+
+





+
+		
+
+
+
+

	

+				




+			
+



+	
+
+
	
+		
+			
+









+		
+

+		
+
+
+
+
+
+					
+
+

%&"





+		
+


+
+
+


+
+						
+




*9>>>=<7, 



+			
+
+
+

		
+
+	
+




,9?><<;<=>?=7.#
+		
		
+
+	





+!-7>?==<:8:<=>>?>:3)



+			


&3<??>==;IYH;<=>>??><6.%

	

.7;<;;978<??>=;Ag|~d>;<=>????>>=:7/#

2=?>>>>>?????>=?Eokhn�lHA==>=>>>>>>??>6#		





	
+';?>====>>>>>===>Kd�zwrt|�gWC=;=>>====>>>>=.
+

+	






	
,=>>>==>>>>>>>>=;Hhz}ammlvwvqT=<>>=======>>>>2

+


+					
+

+	
+=>===>>>>>>>>>>==Z~h>'cWAf}}ud?<>==>>>>>==>>=>3	
+
+
							
$==>>=>><<<<=?>>><?crJ3aSEU�c,RF<>>>>??>?>>>>=<>-

			

9>==>?=;;;;;;=>>><DVMVALORZS`=AJ=>>>>=<<=???><;<=
+			

/?<==>?;;<<;<;;=?><EM8>EGVYTB=@?MH<?>><;;;;<>??G>:=@<

+			


	
+
+
<=;;=?=;<<;;;;;=?><@G7:?CNPG=<?@NI<>?><;;;;;<>>Xg?;A9

+						
+
+
+


4><=C>?=;<<;;;;;>?=<?:9@@AKN>?=1&B==>><;;;;;;>=M�g<=1


											


+

B@=;Q[??=;;;;;;;<>>==@48?@?KU@?<$!?==>?=;;;;;;>>Ev�O;;

+														
+

+
6I=<BjoI>>;;;;;;<>>===?G>>A;CO<=>;3@?===>><<;;<<>>Ev�^<?.

																	
+
+	
+
9><X�|X=>><;;<<>>====>FI68<>G;?>8?Q?====>>====>><N}yP>?9																							
+	


&>>=fwyf>>>>===>>===<==EM86==C<<

@I@====>>>??>>==b�iC???&																			
	
+
+=>>=f||zS=>>>>>>==<===>MRE<>>G== 
+(JA=====>>>>>><J}nM??>?8																							
+

3?>>>P]UqwL=>>=>===<===@_]E>=?H=?5

CC==<==>>>>>>>Y]G>??>>@$
																										
+		
+
?>>?@?<<ALV@>>>>=======F[LA>=>B=??8<ZL<=====>>>>=Vh><=??>>@5																										
	
+

1@>>?@>=><;MV=>>===>>==>HNC>>=>C==>?NaWA<====>>>=Km\<==??>>?>

+																										
+


<>>>??>=>==B]I=>====>==BHE@===>@====@HPK?<===>>=JkiL===>@>>>@+
																								
+


#@>>???>=?>>>SVD===>=>=@NJA>>==<=====<>EONA>=<<>KguhG====??>>?8
+																												
+


/@>?>??=>>=>>TVTC<=>>>>HZM@>==<<<<====<@JKCA@@FS_nhXH==>>??>>?>

																												
+
8???>????=>>DVIKVC<>?@AOXF>===<<<====<<=B@@CFUe[WXOVW===>??>>>@(																																		
+
+

=???>??@=<>>QMDQVS??CHJNH?<<==<<<==>==<<<>>BJWX[VTUR]C=<>??>?>@3																																					
+

???>??A><<=IXQLIKPBCOTVK@=<<========>===<<>CIJIGEHRRTS=<=@??>=?:
+																																				
+
+
%@??>?@@=;;EY[O?<<<>I^`XI>==<======>>=====<<@FBBB=;=OaaD;=?@?>>>>
																																							
+
-@????@>==Tf_E<=>==<DfbOF=====>=====>=====<;=?===<===Qn^<<>@???>? 
																																								
+
3@????@=@hrYE=>>=>>=<DNHD><=>========>>===<;==<<=<==>=SoV:>?@???@'
+																																							
+
+
9@???A@<P�r?=>>>>>==<;:>@><===>=========>=<===<<====>>=Z{R<?A???@/
+																				

+																			
+
+
=????B?<_�f>>>>>>>===<<<>><===>===>===<========<====>>>Bfm@>@???@6
																					

																		
+


????@A>@v~I=>>>>>>===<<=======>====================>>>>>[|I=@@?<>;																						

+																			
+

"@???@@<L�_<?>>>>>=====<==<<===>======>==========>=>>>>>>T�S=?A@:;?

	
+																																									
+

(A???@?<_�H=?>>>>>======>>===========>>>>=========>>>>>>>G{a=?@??>@$

+																																									
+
-A???@>?on?>??>>>=>>>>>===>>======================>>>>>>>@pn>?@@??@,

																																									
+
+
3@>??@>E|Y=>??>>>>>>>>>>=====================>=>>==>>>>>>=g}E>?@?>@2
																																											
+
7@<>@@=U�J=>???>>>>>>>>>>>>====>=====>>>>=>>=>=>>>=>>>>>><Y�Q=???>@7
																																											
+
:?=?@?>os?>>??>>>>>>>>>>>>>=>==>>====>>>=>>>>>>>>=>>>>>>>>J|b>?@???:																																										
+
+
<=:@@>I�Y=>>>>>??>>>>>>>>>>=>>>>>>>>>>>>>=>>>>>>>>==>>>>>>Ao{D?@???=
	
+																																								
+
+
>>?@@>^}C>>>>>>??>>>>>>>>>===>>>>>=>>>>==>>>>>>>>>=>>???>?=TY=@?@??
																																										
+
+

?????@p\=?>>>>>>?>>?>>>>>>>=>>>>>>=>?>>>=>>>>>>>==>>?>>?>?>EooA???>@

																																											
+
+
!@??@?HuG>?>>>>>>>?>??>>>>>>>>>>>>==>?>>>>>>>>>>>>=>?>>>>>>>>_xL???>@!
+
+
+																																										
+
+
$@?@?>Uh>??>>>>>>>????>>>>=>>>>>>>>>>?>>>>>>>>>>>>>>?>>>>>>>=UzX>??>A&
+
+																																									
+
+
+
+
&A?@@>`T=??>>>>>>>????>>>>>>>>?>>?>>>>>?>>>>>>?>>>>>?>>>>>>?=M~f????@+

+																																											
+
+
(A?@@AeE>?>??>>>>?????>>>>>>>>???>>=>?>??>>>>>>>>>>>??>?>>>?>BxvA???@.

+																																									
+	
+

*@?@@Ec??>>??>>>>>???>>>>>>>?????>>>>>???>>>?>>?>>>>????>>>??>a�I???A0

+																																										
+
+
+A?@?Jd>?????>?>>????>>>>>>>>?>??>>>>>?>??>>>>>??>>??????????>R�T>@?@3

+
+
+																																							
+
+
)A@@?Tq>>????>>>?>???>>>>>>>>>?>?>>>>>>>????>????>>???????>??>M]=@?@3


+																				
+																			
+
+

&A?@>^�H=??????>????>>>>>>>>>>>>?>>>>>>>>?>>?????????????>>??=Nc>@?@3



+																			
+																			
+
+

"@?@>i�U=>??????>????>>>>>>>>>>>>>>>>>>>>??????????>?????>???=R�i???@3


+
+																																						
+
+

"@?@Av�I>>???????????>>>>>>>>>>>>>?>>>>>>?>?????????????>>???>J�rA??A2



+
+																	
+																			
+
+

"@?>E�i>?>>>????????>>>>>>>>>>>>>>?>>>>>>>>>?????????????>>???@qyC?>A1


+
+																																					
+
+

"A?=J}O=??>??????????>>>>>>>>>>>>>A?=>>>>>>>?>?????>??????>???=]E>>A/



+																																						
+
+


!A?=N}E>@????????????>>>>>>>>>>>>?@?>>>>>>>>>>>????????>?????@=VD>>A+



+
+																																				
+
+



A?=QyA??????????????>>>>>>>>>>>>>?>?>>>>>>>>>????????????????=UxC>>A'



+
+																																			
+
+
+


A?=Ps@??????????????>>>>>>?>>>>?>>>?>>>>>=>>>????????????????>]xA>?@"

+
+
+																	
+																		
+
+



??=KwB??????????????>?>>>????>>?=>>?>>>>>>>>>>???????????????>jt?>??


+
+
+																
+																				
+


<?>D�N>??>>>>>???????>>>????>>>>>>>>>>>?>==?>??????????????@?Dtk=>?<


+																																					
+
+


8@>>~n>??????>???????>>>??>>>>>>>>>>?????>>??>???????>>?>???>S�h<?@7


+
+																
+																		
+
+
+

1A><j�T=?????????????>>?>>>>>>>>>>>>>>????>B@>??????>>>>>>??>e�];>A/



+
+
+															
+																		
+
+
+

'A>=V�zI>???????????????>>>>>>>>>>?>>>>????>=>?????????>????@q�P<>A%



+
+																
+																		
+
+
+


?>=F{lg>?????????????>??>>>>>>>???>>>>>???=<???????????????Er|E=>?
+
+
+																																		
+	
+
+

7?>>ojtK>@????????????>>>>>?>>>??>>>>>>>??>=??????????????>S~r>=?:


+
+
+															
+
+																			
+

)@>=Zukh>???????>>?????>>>>>?>>??>>>>>>>>?????????????????@j�`<>@0


+
+
+															
+																				
+

>?>FyazR>??????>??????>>>>>>?>??>?>???>????????????????@>N}}L=>@$



+
+
+														
+	
+																		
+
+
6@?>jneyE???????????>???>>>?>>??>>???>?????????>?????????h~q?>?>

+
+
+															
+
+																		
+
+

(A?>Suc\>???????@??>>???>>??>??>>?>??>????????>???????>Nty[<>@4


+
+														
+
+
+																			
+
+

=@>Creqj>@?????@@??==>??>>??>??>???????????????>????@?EkntE=>A$



+																
+	
+																		
+	

/A?=]vcmB@????@@@??>==???>??>??????????????????????@?@jhne=>?<


+
+				
+											
+																					
+

??>FjoM?@?@@??@???>>???>>>>>?????????????????????@>T}^xI=>A/


+
+
+													
+
+	
+	
+																		

/A?=e�l]>@@@???????????>>??>>?????????????????????@Aqp�f=>??




+
+	
+										
+
+
+
+	
+
+																		
+
>?>E�qlB?@@?????@????????>>?>??????????????????@@>Zuu�D>?@2


+
+											
+		
+
+	
+
+
+
+
+
+															

.A?=^�u_@?@???@@???@?????>??>?????????>??@?????@>Pwr�Y=??>




+
+
+						
+			
+
+	
+
+	
+
+
+
+	
+														
+
=@?A|�tfB?@@@@@@??@@???>????????@???>>??@????@>Nvj�r???A-
+

+		
+					
+	
+
+
+
+
+
+
+	
+	
+	
+					
+									
+
*A?=O�vvmA@@@@@@?????????????????????????@@@@?Evo|�F>?@9



+		
+				
+
+
+
+
+
+
+
+
+
+
+	
+
+					
+
+								
+
:@?>c�~�^?@@@@@@????????????????????????@@@?Adnu�N=?@=




+
+					
+
+
+
+
+
+
+
+
+
+
+	
+
+			
+	
+
+
+								
+
+

#@?>@u�zpJ?@@@?@??@??@????????????@@@???@@?Dhq~�S>@A?#



+
+		
+	
+	
+
+
+
+
+
+
+
+
+	
+			
+		
+
+		
+					
+
+
+
+

-A?>Fn�igF?@?@@@?@??@?????@???@@@@@@??@@?Egp|�T=?A>"



+
+
+		
+
+
+
+
+	
+
+
+
+
+
+
+
+		
+	
+
+										
+
+
+

5A?>C{�mgF?@@@@?@@????@??????@@?@@@@??>H_`szT>?@>



+
+
+
+
+	
+
+	
+	
+
+	
+
+
+
+	
+
+
+
+
+		
+									
+
+
+
9A?>I|{wlE>@@@@@@???@A?????@@????@?>CXk]ivI>?@?"



+
+
+
+				
+	
+
+
+	
+	
+
+		
+	
+
+	
+									
+	
+
+
+

<A?>D`|�sUC??@@@@?>CA?@@@@@@@@@??F\nijmbF>?@?#




+
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+		
+										
+
+
+
+

;A@?>R||pZNC??>C^hZC?@@@@@@@?CYo�}�\???A="




+
+
+
+								
+	
+	
+
+
+
+
+
+													
+
+
+


9B@?>Ec�}jjbYRVhgXZWHA?>??@GWg`]{�aM??@A< 




+
+
+	
+
+				
+		
+
+
+
+
+
+			
+											
+
+
+
+

4A@???Qu�znjlj[SXSV_b_[YZcgghl��U>>?@A8




+
+
+
+
+
+
+
+					
+		
+
+
+	
+	
+													
+
+
+
+


,?A??>?Mi}��zmdcYY\`fhiimr{�~cE=@?@@0





+
+
+
+
+
+
+
+					
+
+
+
+
+		
+																	
+
+



!7@@??>=AKYiv���������~tcO@<>?@A<%





+
+
+
+
+
+		
+						
+
+
+		
+												
+			
+
+
+



':A@@??>==?BEJNQTSSOHB=<=>>?A>/
+



+
+
+
+
+
+
+
+		
+					
+	
+		
+	
+															
+
+
+



'7?AA@????>>==<<===>??@@A>1

+




+
+
+
+
+
+
+
+
+		
+					
+
+	
+
+								
+							
+
+
+




!,5;?@A@@@@@@@@@@?::93)

	



+
+
+
+
+
+
+
+
+
+
+			
+				
+
+								
+							
+
+
+
+
+

+


&-39<=>=:63,!4)
+
+



+
+
+
+
+
+
+	
+
+
+
+			
+				
+
+																		
+
+
+
+







;,




+
+
+
+
+
+
+
+
+		
+	
+
+	
+
+	
+
+	
+				
+												
+	
+
+













+
+
+
+
+
+
+
+
+
+	
+
+	
+
+	
+	
+
+
+	
+			
+															
+
+
+
+


+









+




+	
+
+
+
+
+
+
+
+
+
+
+	
+
+				
+
+	
+
+
+
+	
+
+
+															
+	
+	
+
+
+








+
+

+
+
+		
+
+
+
+
+
+
+
+
+			
+				
+
+
+
+
+	
+
+															
+			
+
+
+
+
+
+





		
+
+

+
+
+
+
+
+
+
+
+
+	
+		
+
+				
+
+
+
+	
+														
+
+
+
+	
+
+
+
+
+
+
+
+


+	
+
+
+
+
+
+
+
+
+
+				
+			
+			
+
+
+		
+
+		
+
+							
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+		
+
+
+
+						
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+		
+
+			
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+

+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+

+
+		
+
+
+
+
+
+
+
+
+
+
+		
+
+

+
+
+	
+
+
+
+
+
+	
+
+
+
	



+
+



	
+		
+












		
	
+
+
+






+


+
+
	
+	



+	

+
+	
+
+						


+		
		
+

			
+
+				
+
+			

+

+		
+
+
						
+
+						

		


+












+	
+

+				
+			
+













+		
+		

						
+
+
+









+					
				
+

+
+
+
+
+
+
+			
+		
+
+
+						
+




		
+
+

+
+	
								
+
+					
+


+			
		
+
+
+
+
+
+			

+


#,-+ 
+
+
+
+		
+	
	


		
+





1=====4
+


+				

		

	







4>=;99;>:'




							
+
		






+
+
"7>=<998:=><0#






	
+




+		&8?><?[vb@;>?=6-"	
*01.(!&7??=?k}p}p?<>?>;4-+-/11,$
		
$5=?>???><836>?><^�j`h�_;<???>>?@????>:.
	
	



	
+
3>?>>===>>>????>;H|~rgm{{F;>>>??>>>===>>?;'
		
+
+
+




		
":?>>>>>>>>>>>>>>=C_aGekhr~_?<=>>>==>=====>>=-
+	

					
+

	
#<?>=>>=<=>>>>>>==?aCTdPa|�^@=>>>>>>>>>>==>>=/	



+
+				
+

;>>=>><<<<<<>?>><=Qt51MbJPw|jN;;>>>>>=<=>>>>=<=+	
+				

6>>==><;;;;;;<>>>=>\dF8?I`?AX[KT==>>?=;;;;<=?>><=<


				

	
+

'>===>=;;;;<;<;=??>AT??A>AN:<=<<QA>>?=;;;;;;<>?><<=<3
+
			




	
+

8>=>=><<<<;;;;;<??=@P@==;?F1:<=AS@>??<;;;;;;;<?@B;<BE
+

								
+


+

)><<=>?<<;<;;;;;<?><;$6@=<C;,7:9&8>=>?<;;;;;;;<>@`N:=5


									
+

+
"@>=<:<>?<;;;;;;;;=>=<<'5@?@ED8:9$	0<<=?=;;;;;;;<>=i|E<:


													
+
	7J==;V[@?<;;;;;;;<>===>C at 92;DH?>?3/@<<=>><;;;;;;=?>j�Q;>/

																							
+
+

;=;P��V=><;;;<;<>>==>>B13CJ=,))8B=<==>><;;;<<>>ClnN=>:

																												
+
+


&>=>nbok>>>==<==>>=====2//CI>
+!4>=====>>>==>>>=PrzU=>?'
																									

+
+
+<>=BwglsG=>>>>>>=======,2$5AH=%!1========>>>?>=@cs~Q>>?9
+																						
		

4?>>@rwg}qE>>>===>======-.0'8CJ?+)>=>======>=>>=YuePC?>?@%																											
+	

+"?>>?@JD=L\[?>>=====<====DC72=GW at 0'(8E<=========>=HcMA:???>?6																										
	
+
5?>>?A===<:HM=>=======>=?NF8;?O_G:8;WR<<=====<=>=@dQ:=<>?>?>>
																																
+
+

>>>??@>==>=?\K=>===>==>=@MD?ABR\IBBEVU@<=>>==<==>ReC=>=>?>?>@.																																
+


*@>>???>=>?>=OX@====>>>>=C@<=BDSVGBCCLMF?<=>>>><>XaX>>>==?>>??:
+																																	
+

5@>>>??=>?=>=JOL@=>>>?>=DXKDADJQPFBBCHRUJ>=>>==@WiXQ>==>=?>>?>? 
																																
+

<?>?>?>>?==??QIJQ@=>>>>@Q_SICDIMKC?@BGQ_WD??>?GQ\WPX@===>>?>?>@-
																																					
+
+


???>>??@><=>HUFLTX@===@L[`RJFDDHH@>>?BHRWICDEHTSLMOYM<=<>>?>?>?7
+																																					
+
+
'@??>>?@>=<=AXSQKJTNB=?K[URQMFBADC?>>=?CFMNQTPF?=>BQVWC<==??>>>>=
+																																		
+
/A??>?@@=<:BX^OA=<<?BAN_gXCBJFA at CA>>>=>@CHR^aR@;<==>R_P=<=?@?>>>?
																																								
+
5@????@>==SihJ<=>>>><C[YTQG>CD@?CD?>==>?BEM\WC====>=>SZM;=>@?>>=@&

																																									
+
+
:@????A><]}aJ=>>>>>>==UZQMMA@?>?BD?==>?>?BJO?<====>>=?TgM<>@@?>>@-

+																																						
+
>????@A=AvvA=>>>>>>>==>RRKLH?>=<====>>@>>@E?<<<===>>>><XvH=?@??>@3
+																				
+																	
+
+


@???>A?<O�g=>>>>>>>>==<?OKMN@>==<==>=?B?>?>====<==>>?>=Hxa=?@>?>?8
																					
																				
+

$@>???A?<fwF=>>>>>>>>>=;;CNOO>========>B@>==========>>>>Bkr@>@@???<
																						
																				
+
+*A???@A=C{W<?>>>>?>>>==;<<ELF====;;======<=>=======>>>>>@j{E=@A?<=?

																						
+																				
+
.A???@@<U~E>??>>>?>>>======>======<=========>===<=>=>>>>>i�L<?@?<<A$

+																				
+																				
+
3@?@?A?<iu?>>?>>>?>>>>>===<<=>=>=<<=====>==>>>====>>?>>>=T�\<>@@?>@,

+																																									
+

8@???@?Axg=>?>??>>>>>>>>======>>==<======>>>>=>>>==>?>>>>@xu?>@??>@3

+																																										
+
;?=?@@=P�R=>>>>?>>>>>>>>>=====>>======>====>>=>>>=>>>>>>><V�I=@??>?8
																																										
+
+
=?>?@?=irA>>>>>>>>>>>>>>>>>===>>=====>=>>>>>>>>>>>>=>>>>>>@pa=?@?>?;
																																										
+
+
????@?E|X=?>>>>>??>>>>>==>====>>=>==>>==>>>>>>>>>>>>>>>>>>=QwC?@?>?>


+
+																																								
+
+

@??@@>V�I>?>>>>>???>>>===>=>=>>>==>>>>>==>>>>>>>>==>>?>>>>>=m[=?????


																																										
+
+
!@??@?>hq@>?>>>>>???>>>==>>>==>>>>>>>>>>>==>>>?>>>>>>???>>>><Tr@???>@ 
																																										
+
+
+
%A>?@?Bx]=???>>>>??>?>>=>==>==>>>>=>>>>>>==>>>>>>>>>>?>>>>>>=CrL>??>@"

+																																											
+
+(A?@@?K�N>??>>>?>???>>>>===>>=>>>>>>>>>>>==>>>>?>>>>>?>>>>>>>>kY>??>A&

+
+																																										
+
+
*A?@@>YwB>??>>>>>??>>>>>===>>>>>>>>>>>>>?>>>>>??>>>>>>>>>>>>>>fd>??>@*

+
+																																										
+

+A?@@>f`>?>???>>???>>>>>===>>>>>>>>>>?>>?>>>>>>??>>>??>>>>>>?>fq@???@-

+
+																																									
+
+

+A?@@AkL>?>?????????>>>=>=>>>>?>?>>>>?>?>>>>>????>>???>>>>>??=cC???A0

+
+																																									
+
+

)A@@?ElC>>>>????????>>>=>>>>>??>>>>>>?>??>>>>?>????????>>????=[�J>@?@2

+
+																			
+																				
+
+

$A?@?KqA>??????????>>>>>>>>>>>?>>>>>>>>>?>>>>>>????>?????????>R�R=@?@3

																																								
+
+
+
&@?@?Q�G>???????????>>>>=>>>>>>>>?>>?>?>>>>>??>??????????????=T�Z=??@3

		
+																																				
+
+
+
$-??A>[�`=???????????>>>>>>>>>>>>>>>>>>>>>>>>???>???>?????????=\�`>??@2


+																		
+																		
+
+
+

.3>?@?k�a=???????????>>>>>>>>>>>>>>?>>>>>>>>???>????????>>????=V�i???@2


+
+																																					
+


15>??Aw}J>?>>????????>>>>>>>>>>>>>>>>>>>>>>>>?>>???????>>>>???>Hl@?>A1



+																																					
+
+

+

25>?>E�e=??>>>???????>>>>>>>>>>>>=>>?>>>>>>>>>>>???????>>>>>>???otA?>@1



+
+																																					
+


/1>@=H�T=??>??????????>>>>>>>>>>>=>?>=>>>>>>>>>>????????>>>>??@=b|A?>A-



+
+																																				
+
+

$)=@>H�O>?????????????>>>?>>>?>>?><==>>>>>>>>=>>???????????????=a{@?>A(



+
+
+															
+
+																
+
+
+

+
=?>G�L>?@????????????>>>????>>>>=>=>>>>>>>>>>>???????????@@??>ft???@#



+
+
+															
+																		
+
+

+
>?>E�O>??????????????>>????>?>>>>>>>>>>>>>>>>>????????????@@?Arn>>?@




+
+																
+																			
+
+

<?>A�^=??????????????>>???>>>>>>>>>>>?>??====>???????????????I�k<>@=



+																																				
+
+

9@><x}B??????????????>???>>>>>>>>>>>>????>====???????>??>???>X�a<?@8
+

+
+																		
+																	
+
+


3A>;d�[=???@?????????????>>>>>>>>>>>>>>???>>>>??????>>>?????>e�V;?A0


+
+
+															
+
+																	
+
+
+

)A>=R�zM>???????????????>>>>>>>>>=>>>>>>??>==>??????????????@p�K<>A%



+
+
+															
+																			
+
+



@?=Dypl???@????>????????>>>>>>>>>>>>>>>???>>???????????????Ev{B=?>
+
+
+	
+													
+	
+																	
+
+


:?==khoO>@??????>>???????>>?>>>>>>>>>>>>??>>?????????@?@?@>Q�n=>@8

+
+
+															
+		
+															
+
+
+

,@>=Utbm????????>????????>?>>>>??>>>>>>>???>???????????????h�Z<>@/


+
+
+													
+
+
+	
+																
+
+
+



?>>DudxZ>?????>????????>>?>>>>??>>>>>>>?????????>??????@>N{}H=>@#



+
+															
+	
+																
+
+
+
+

8@?>fth}J???????????????????>>??>>>>??????????>>>???????@m~l>>?<


+
+																
+
+																	
+	
+

*A??Pzeye>???????@???>???????>??>>>>??????????>>>?????@>Qv{V<>@2


+
+															
+
+
+																		
+
+

>@?Brjir@@?????@???>=>??????>?>>>>>>???????????>??????HkhvB=>@"



+
+															
+	
+
+																	
+
+

1A?>\~cnG@@???@?@???=>???>?>>>?>>>>????????@?????????Cn[w_=?@9



+
+		
+												
+	
+																	
+	
+


???E�qhT>@??@@?@???=>?>>>>>?>??>>>?????????????@??@>cwd|E>>A+


+
+
+
+													
+	
+
+																		
+

1A?=b�b_>A@@@????@?>>??>>>??????????????@?????@????J}n�`=??=



+
+
+									
+		
+	
+																					
+
???D�ofG?@@@????@?????????>???????????????@??@@@@@gm{}B>?A.


+
+
+	
+		
+						
+
+
+
+	
+
+	
+	
+															

0A?=\�rhC?@???@??@@???>????????????@?????@????@@?Xhj�T=?@<



+
+
+		
+				
+		
+
+
+
+
+	
+																			
+
=??A{�vkC?@??@@@@@@@???>>?????????@??????@@@@@>Px`�l>??A)
+

+
+
+
+			
+			
+
+		
+
+
+	
+
+
+
+																	
+A?>P�|pC@@@@@@@@@@???>>?????@?????@????@@@@?Drm}}C>?A6



+
+
+	
+
+
+
+
+
+
+	
+
+
+	
+
+
+		
+		
+				
+							
+
;@?=g���_@@@@@@@@?@@?????????@????@@@???@@@?Cgm{�J=?A;


+
+	
+
+	
+
+	
+
+
+
+
+
+
+
+
+		
+		
+	
+	
+
+		
+					
+
+

%A?>By�qsN?@@??@@@@@?????>??@????@@@@???@@?Flz�P>?A=
+


+
+		
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+			
+					
+			
+
+


0A>=HpyviH?@@@@@@@?????@>??????@@@@@???@?Dco|�T>?A< 



+
+
+		
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+		
+											
+
+


8A?>Cl�mlF?@@@@@@?????@??????@????@@@?>Fa]lU>?A;




+
+
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+		
+											
+
+
+

<@?>F{�{pE?@@@@@@???@@???@@@@??@?@?>CVmetpL>?A<





+
+
+	
+	
+
+
+	
+
+
+
+
+
+
+		
+	
+
+
+
+										
+
+
+

">@?>If~�rQD??@@@@?>B@?@?@@@@@@@@?G\pwurkF>?A<





+
+
+
+
+			
+
+
+	
+
+
+
+
+
+
+
+
+
+
+					
+						
+
+
+

$>@??>Su�iebN@?@??YhV@?@@@@@@??@Slq|�}S@??A;





+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+				
+							
+
+
+
+

!;A??>Dn�pkn`LFJ`kZZUD???>?BHP]c^m�aH??@B8




+
+
+
+
+
+			
+
+
+
+	
+	
+
+
+						
+								
+
+
+
+


6A@??@Wx�|qliheTWRZ`^WVY^gidem��Y>??@A3





+
+
+
+
+
+
+				
+
+
+	
+
+
+	
+
+
+												
+
+
+
+
+


,?A??>?Ol��wncdZ[[`djjhjn{��dF=?@@?+





+
+
+
+
+	
+
+
+				
+
+
+
+
+		
+											
+					
+
+



!8@@??==CLYiu����������yhRA<>??A:"





+
+
+
+
+
+									
+
+
+		
+	
+
+						
+							
+
+



(;A@???>>=?CGLPQUVUSKC><<>??A>.




+
+
+
+
+
+
+
+								
+
+
+		
+
+											
+				
+
+
+



)9 at A@@????>>==<<===>???@A>2

+



+
+
+
+
+
+
+
+				
+				
+
+	
+																
+
+
+
+




"-6<?AA@@@@??@@@A=:<;4)

+
+


+
+
+
+
+
+
+
+
+
+				
+			
+
+
+						
+
+
+								
+
+
+





 '.59<>>=:61'%7 

+




+
+
+
+
+
+
+
+	
+			
+
+			
+							
+										
+	
+
+










 B!




+
+
+
+
+
+
+
+
+	
+
+
+					
+
+		
+	
+		
+														
+
+
+













+
+
+
+
+
+
+
+
+
+			
+
+
+			
+
+				
+
+														
+
+
+
+



+














	
+
+
+
+
+
+
+
+
+
+
+	
+	
+	
+		
+
+		
+
+	
+
+																
+	
+
+
+
+
+
+







+
+

+
+		
+
+
+
+
+
+
+
+
+
+
+	
+								
+
+	
+															
+
+			
+
+
+
+
+
+





+	
+

+
+
+
+
+
+
+
+		
+	
+
+	
+						
+
+
+	
+								
+
+					
+
+
+
+	
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+		
+					
+
+		
+	
+		
+
+	
+	
+									
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+	
+
+		
+
+	
+							
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+


+
+
	













+

+	


+
+
+		



+
+
+

+			
+

+



+	
						

	

		


+						
	



+

			
+	

+					
+
+
+



+

+
+
+






+		

+
+	
+										
+
+
+









+		

+	
					
+




+
+					

			
+
+


+
+
+						
+
					
+				
+
+
+

+
+	

+					
+



+
+	


+			
+
+
+	
+
+
+
+						
+	
+

+
+	
+
				




'6:8.

+		

+	
+	
+	
+




,=<::=5
+
+
+	


		
+	
+
+
+




+ <<8559>.
+
+


+	
+					

+







+
+	6>:DWK:<< 


+




								
+	
+




+



+	*>=Hx��[;?2









+ !

+#9>Av}p{�G==,



!"
&5<>>=:4*
1><V�glp�]:>8/&")3:<>>=9/!

+


		#7??>>=>??@>7,2<=DnrUghjoA=?=:=???>>>>>?=2



+
+





	
->?>====>>>>>@?==AU91C_VWz]<>???>>>>>>>>>>?;&
	
+
+		

	
3?>><9;<<>>>>>>>>>_P*>WFLVaP<>>?>>>>>=>>>=>>=)
+
				

3?==>=<>@?<<>>>==>EvO6<>M=FFOqB<>>>>==<<<=>==>=<&	
+				
+
+?>===;;=><;;<>>>>?IUA=>?D8?=JpR=>??>;;;;;;;>====:

	
+	
+

+		

;>>==<;;;;<;;;<??>?>=?>>=A:>=>DQ????<;;;;;;;<>==<=5#

				
+
+
+


+	
+


*?=>>=;;;<;<;;;<??=>:7?=<=>;<>>AG=>@>;;;;;<;;;>>=<<AJ!
+	
												
+

	


+8=<>>=;;;;<;;;;<?><=9?@>=>;:9==3=<=?><;;;;;;<;=??<;=9

											
+
	
'4/=<;=>?<;;;;;;<;=?===5>@@=?>;7=6$==<>><;;;;;;;<>>JR;<6


															
+
+	
2L>=:EH=?<;;;;;;<<>==>>6;;4<>?>=@;9@=<=>=;;;;;;;<?=ShA;=*


																					
+


+;=<Hy~P>>;;;;;;<>===>?5(3??:+,3.8>=<<><;;;;;;=>Ae�^;=:
																					




&==>ngjm?>>==<<==>===>8&?A1

))7?==<=>=<<<<>>>P}�m==?&

+																						
+
+
+
+
=><Hz[[lG<>>?>>>>====>1	=A.&
)>>=====>>>?>>>^|�m>>?8
																									
	

7?>=JsmwfA>>>>=>====>>1
/	>B+&#=>===<===>>><Tz{rZ????$																									
+
+

&@>>>B_QEWgb@========>=>>25'
$=A&#*=>>======>>=Fk\K?@@>>?6
+																														

+

9?>>?@<<<<<JK====<===>>>@7)
3??6#,;=======<===>ZK;<<>@>>>?
																																			
+
+

"@>>>?@>>===<SN==<<=>==>>A%
#8CAC8.+7B=====>=<<>=S_=====?>?>@0																													
+

1@>????==>?==H_C====>>==>9
7FCF7%&<>===>====<K_K<>>==?>?>?;
																																				
+

:?>?>?>=>?>>>BTSB=>>>>>=?3"ENGHC638ME<=>>====KTUE==>>=?>>>>@"
																																
+
+


??>>>?>>@>=>>ENHSA=>>>>=?G'%*9R`ZUOJLPcY>=>>>=?RXKSI<==>>>?>?>@0
																																
+


'@>?>>?>@><=>@RKLS\E===><?WMIGHQQFNVZVWg]I@?>=>S]TQWU>===?>?>>>?:
+																																	
+
/@>>>>?@?=<=>RYTQLPOI@<=?>K]J;?S?7 at GOW\_QQHB>=BGBBGQ^L===>?>>>>>>

+																															
+
6@??>>?@>=:?VaSF><<<CD=?JJ=HTCJV>9?EKWRFP^ZOD<<<==<=X`D<==@?>>>>@$
																																		
+
;?>?>?@>=<NluP=<===><<@EENJ>JWYYC??FTQ?FT[gaE<====>=@[YC<>>@?>>>@,																																					
+
+

>?>?>?A><J~rP===>====;AIFKWFAM^bVPRWNAAQNMcV>==>==>>=B\dD=>A???=@2
+																																					
+
+
"@???>@A=<`xE<>>>>>>>===FIGPNABIRSRPF?>JPLQ\?======>>>=Dhh@=@?>?=?7
																																										
+
'A???>@@=Cvk==>>>>>>=>>=>KDLF=@BCA at A>>APMKVG<=>>===>>?>=b�N=?@>>>?;
																																								
+
,A??>>A?;WtE=>>>>>>>>>==<ELIG<=>><;<=>@SOOM<==>>>=>>>>><Mx^<>A??>>=
																																								
+
1A>?>?A>>nR<>>>>>>>>>>>===RLG;<==<<==>>HLH?<===>>>>>>>>=Fri=>@@?>>?

																																										
+
5@>??@A=KqA>?>>>>>?>>>==>=DPC<===<<==>==?=<=>==>>>>>>>>>Fy@=?@?<<A%

+																																									
+
+
8@?@?@@;_n=>>?>>>??>>>>>>==A?==>=<<===>=====>==>>>>>?>>>?r�K<>@?>>@,

+																																									
+

;?>??A?=rh=>>>??>???>>>>>======>=======>====>=>>>>>??>>>=L�d<>@??>@2

																																											
+
=>;??@=I~V=>>>>?????>>>>>>=>===>=<==>>=====>>=>>>==>?>>>><NvF=@??>@8
																																										
+
+
?>>>@?=coA>>>>>>????>>>>>=>>>==>====>>=====>>>>>>>>>?>>>>>;c_<???>?<
																																										
+
+

@???@?BtP=?>>>>???>>>>>>>>>>>=>==>==>>===>>>>>>>>>>>>>>>>>=EpC>??>>>
																																										
+
+
!@>??@>NyG>?>>>>????>>>>==>>>>=>>===>>>===>==>>>>>>>>?>>>>>><eY=????@


																																									
+
+
+&@>?@@>]{D>?>>>>????>>>==>>>>>=>>>=>>>>==>===>>>>>>>>??>>>>><Mn@????@

+																																									
+
+
++@>?@@?mqA>?????????>>>>>>==>>=>>>>>>>>====>>>>>>>>>>???>>>>>?mI>??>@"

+																																										
+
+
.@?@??Dza>?????????>>>>>>===>>=>>>>>>>>>>==>>>>>>?????>>>>>>><fV>??>@&

+
+																																									
+
+
/@?@@?N�R>?????????>>>>>=>=>>=>>>>>>>>>>>>=>>=>>??????>>>>>>><\a=??>@(

+
+																																									
+
+

*A?@@>]�H>?????????>>>>>>=>>>>>>>?>>>?>>?>=>>>>>??????>>>>>>><Rh>??>@+

+
+																																									
+
+

%A?@@>ks@???????????>>>>==>>=>?>>>>>>?>>>>>>>>>>??????>>>>>>?=Sq????A.

+
+																																									
+
+
#@?@@@q^=?>>>???????>>>=>>>>>>?>>>>>>?>?>>>>>>>>>????????????=W|B??>@0

+
+
+																																							
+
+%-??@@DtP>??>>>??????>>>>>>>>>>>?>>>>>?>>>>>>>>>>>>??????????>=V�H>??@1

	
+																																							
+

9:??@?I|P>???????????>>>>>>>>>>>>>>>>??>>>>>>>>>>>?????????>>?>U�O>?>@1


+																		
+
+																		
+
+
*?>>?@?Q�f>???????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?????????>>>=^�U>?>@1


+																		
+																				

2@???@>a�qA??>>???????>>>>>>>>>>>>>>?>>>>>>>>>>>>>>????????????=a�^>?>@0


+
+																																				
+
+

5A?>???m�`>??>>????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>????>>>>????=[�e??>A0



+
+																																					
+

6A?=??AyG>?????????>??>>>>>>>>>>?>>>>>>>>>>>>>>?>>???>>>>>>>??>M�h??>@0


+
+
+																																			
+
+

+1A?=??C�n>?????????????>>>>>>>?>>?>=>>>?>>>>>>>>>>????>>>??>>???C{j??>@.



+
+																																				
+

+'?>=??E�f=?????????????>>>>>???>>?====>>>>>>>=>>>>>???>>>???>???@ul>?>A*



+
+
+																
+																	
+
+

69<@?D�i>?@@??????????>>>>>??>?>>>==>>>>>>=>>=>>>????>>>???????Ayl=?>A%



+
+																
+																		
+
+

 ';@>A�p@?@@???????????>>>??>>>>>>>>>>>??>>>>>>>>????>?>?>?????C}j=??@



+
+																
+																	
+
+
+

+:@>?|yD??@@???>??????>>>??>>>>>>>>>>>>???>>>>>>????>>>>>>????J�f<??>



+
+																																		
+
+
+

9@>;n�P>?@@@?????????>>??>>>>>>>>>>?>>>???>>>>??????>>>??>??>]�\<?@9


+
+																
+																			
+
+

4A>;\�g????@?????????>>??>>>>>>>>>>>>>?>???>>???????>>>?????@j�Q<>A1


+
+
+															
+																		
+	


,B><L~tO>??@@????????????>>>>>>>>>>>>>>>???>?????????>??????DtG<?A%


+	
+															
+																				
+

 A>=@pnh>?????>>>?????????>?>>>>>>>>>>>>>???????????@????@@>N{t?=?>


+
+
+														
+
+	
+																	
+
+

<?><dndN>?????>????????????>>>>>>>>>>>>>???????????@????@@>^�g<>@7


+
+
+															
+		
+														
+
+
+

/@>=OsdnA???????????????????>>?>>>>>>>>>??????????????????Bj�S<>A.


+
+
+													
+	
+	
+															
+
+
+

 @>?Bphtb>???????????????????>>??>>>>>>>??????????????@?@?QexC=>@#


+
+															
+	
+																
+
+
+
+

9???avdzS>??????@????????????>??>??>>>>???????????????@?Bpxg<>?;



+															
+
+	
+																
+	
+

,A??M}ipp@@@@???@@???????????>??>??>>>????????????????@>Wz}P<>@/


+
+															
+
+	
+																	
+
+


>?@At}m{G@@@@@@@???????????>>?>>?>?>???>???????>????@>Mpnr@>>?


+
+
+			
+											
+																	
+
+
+

2A?>Y�mxT?@@@@@@??@??????????>>>??>>???>????????????>JwazX>?@7


+
+
+
+														
+																		
+
+
+
+


@??C~zha?@@@@@?@@???????????>?>>?>??????@??????????AqqryA>>A(


+
+
+											
+	
+
+	
+														
+
+
+
+
+
+

2A?=\�]cD@@@@????@????>>>??????>>????????@?@@@@@@@>Yrg�X=?@;



+
+			
+									
+	
+	
+
+									
+					
+
+	

@??B|sdV>@@@??@@@????>>>>>???>>>???????@@@@@@@@@?Erfv@??A*


+
+
+
+
+					
+					
+
+	
+
+	
+
+											
+
+			
2A?=Y�omK?@?@@@?@@???>>>?>???????????????@@@@@@@?dmu�N>?@9



+
+
+
+
+						
+	
+
+	
+
+	
+
+
+			
+
+
+											

>??@x�{uE?@@@?@@@@??>???>?????????@@@??@@@@@@@>Trb�d=??@$


+
+
+
+
+	
+			
+
+
+
+	
+
+
+	
+
+				
+
+													.B?=Q���nF?@?@@@@@@????????????@?@@@@@@@@@@@@?Jnd�vA??A2



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+		
+	
+						
<@?>b���eB@@@?@@@@?????>??????@?@?@@@@?@@@@?Htf}�G>?A8

+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+						
+
+
+
+
+				
+
+

'A?>@q�wy\>@@?@@@@@@?????>??????@@@@@???@@?Go{��M>?A;
+


+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+	
+				
+		
+						
+


3A?>Fqgx~N?@@@@@@@@?@???>??????@??@@@@?@?Dbj{�T>@A:

+


+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+		
+	
+					
+
+

9A?>AX�{uG?A@@@?@@?@?@??????@@????@@@?>G_fp~S>@B9



+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+								
+
+



=@??Fp�oG???@@?@???@@???@@@@@@@????EYmkreO>?A9



+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+
+								
+
+

#?@??DZ|�kRGA?@@@@?>C@?@@@@@@@@A@?G_y�yx`@>?A7




+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+									
+
+
+


%?@??>S��jkhN@???@ZhTA?@@@@@@???Kjd}�nI@?@B6




+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+									
+
+
+
+
+


#<A?@>Iu�pil[KGK^kZYUF????@DILXfbl�jD?@@B3



+
+
+
+
+		
+		
+
+
+
+
+
+
+
+
+
+		
+
+											
+
+
+
+



6A@?>A_~�}pkjhcWVRZb`VSX`jmfhp�Y?@@@@-




+
+
+
+
+
+					
+
+
+
+
+
+
+	
+	
+
+										
+
+
+
+
+
+


-?@??=ASo��ypc^Z\[aejkahq}�bD>??A>'





+
+
+
+
+		
+
+		
+	
+
+
+
+
+		
+
+
+										
+		
+
+
+
+


+
"9A@?>==CKYku}��������ziSA=??@A8 




+
+
+
+
+
+
+
+		
+			
+
+	
+
+		
+														
+	
+
+
+



*<A@????>=?CHMOQSVURME?<<>??A=-




+
+
+
+
+
+
+	
+
+				
+	
+
+
+		
+
+
+
+									
+
+		
+
+
+
+



,;@A@@?????>==<===>>???@A=1
+



+
+
+
+
+
+	
+		
+		
+	
+	
+
+	
+
+					
+	
+	
+			
+	
+
+
+
+




%08=@AAA@@@@@@@A?9:<;4)


+



+
+
+
+
+
+
+
+
+					
+		
+
+
+							
+							
+	
+
+
+
+




").59<==<94-!.0


+



+
+
+
+
+
+
+
+
+
+							
+	
+
+
+					
+	
+				
+
+	
+		
+
+
+








37
+
+



+
+
+
+
+
+
+
+
+	
+
+
+						
+
+	
+					
+													
+
+


















+
+
+
+
+
+
+
+	
+	
+		
+			
+
+
+	
+		
+															
+
+
+
+
+


+














+
+
+
+
+
+
+
+
+
+
+
+	
+				
+		
+			
+
+	
+
+
+														
+
+
+	
+
+
+
+






+


+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+										
+	
+
+														
+	
+		
+
+
+
+
+
+
+
+



	


+
+
+
+
+
+
+
+						
+
+				
+		
+
+	
+
+									
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+		
+	
+			
+			
+
+
+		
+
+	
+			
+
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+	
+
+		
+		
+
+
+
+	
+
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+			
+
+

+
+
+
+
+
+
+
+	
+
+

+
+
+	
+
+
+
+
+
+			
+









	













				
+
+



+	
+
+
+

+					
+
+			
+
+							

		

+
+
+



+	
+
+

	
+

				

+
+



		
+






+
+
+
+			
+
	
				
+



+
+				
+
+
+
+
+			
+
+			

						
+	
+



+
+			
+
+			
+	
+
+	

								
+

+						
					
+
+	
+		
+		
				
+		
+			

+


												
+





	
+

				
+	
+
"*)

+		

+		
+	

+


0<<;:%

			
			
			
+
+				



,=9659:

				



+		
	
+
+




+;:@PH;=+



+		
+
+					
+
+








+
++>Dr�~Y>8
+




+
+
							
+
+
+








+	8?c{{��G>

+







+
				
+
+	


+				!>GtVnotW>*
+	
+
+

				
+(.-)!
6<TnAd[[^<7
+	
(1785-
	



	
$2:=>>><92)
/=DiZ>VEOpB=.'5=???>??=4!
	
+


+
+


+
.<?>===>???>:03=Ca?(>L=M]X=<5:??>>>>>>>>?=-



		

+


3>?98;;<=>>>>?@@>ft<7?E>O"BQ=??>>=>>=<<=>>>>5
	
	
				
+


6>>=<<?AA==>>=>>?@mX=>?A>8'a?>>====<=>=<=>==?8

	
							

1=>==;<?A?<;<>?>>?>@=<=>>?,#WA>>>?=;;<>=;;=====6


+				

+
+		

%;>>=<:;;<;;;;=???A:=@=<==?;64<F>??>;;;;;;;;;>===>.
+
+					
+




+


2>>==;;;;;;;;;<??>?;;?>;<>=>A=9>=>@=;;;;;;;<;=>>=<@E$

+												
+

		



;>=>=<<;;;;;;;<>><?@=?><==:=@A9?<=?=;;;;;;;;;=>=<<>D

+															
+

+
./2=<=>>;;;;;;<<;=>=<?<@@>>>><:?>@E====;;;;;;;;;=?<9;<8

+														
+
		
'E;>:AF>?<;;;;;;<<>=<=9!)'/A>?>@B<:A>===<;;;;;;;;>>EO;<=&


+																	
+
	

+7=<Ct}N>>;;;;;;;===<=; !8A>><83"+?====;;;;;;;<?Bl�V;=:

+																	
+
+	


(>=<imkh>?>=<<<===<===;0"5=>>0+6-%0?==<==;;;;;=?=T~go?<>%

																								
+


+
=>=IyZTaE>>>>>>>=<<==?)
+
+
)>=..4<>==<=>>>>>>>>\ugxC=?6
																
+
+

9?>=P|lijc@>>====<<<==?*
: $><*.,9>===<=>=>=>=Ox}{tB>>>!																				
+
+

+?=>>Gp[M[iaC>>>><==<==?,!6>;=&.(7>==<====>>=HqlWNI@>>?4
+																							

+

;>>>?@?;;;=NR>>>=======?')))(8;:"
+'8>=<<==<=>=>]P>;;=@>>>>
																									
+


(@>>>?@=====;LP>=====<==>4

	-;<5
+(4=====>=<=>=VQ;====?>>>@1																																
+

6?>?>??===?==CbJ<>===>==?;);<6
&A===>====<LbB==>==?>?>?<
																																


=>>?>??==??=>>VWF====>>=?-
5;;;#

3@==>>===<GSS===?==?>>?>@%
																																			
+


#@>?>>?>>??=>??QFSF<=>>>=?24CJEBF<<<HC<>>>===MPHP>===>=>?=>?@2																																				
+

.@>>>>?>@?==>>JSGN^L>=>>>@O>.->E."09<BZE<>>==@V^ON\D===>?>?>>??;
+																																				
+
6?>>>>>@@====I\QPLIKLI>>>@N2	4	
+
@W?<===DPPGFK\U?===???>>?>?
																																		
+
<?>>>>?@==<<NeVH@=<<?LB=>?B,&)	
#@B=@=<=@=;<<<D]S=<==@?>>>>@(																																		


??>?>>@?=<Dg{S><===>=<=>BMD5$4'
$8>AFFD><<=====<EcR<==?@>>>>@0
+																																									
+
%@?>>>>A?<?m�\<=====>==<=CNID8.>3,=@DOGEG=<=====>><Gd^>>>A?>>>?6
+																																						
+
+@>>?>?A><P|N==>>==>>==<=AMMIH9:M4&4DCLQKCIC<==>>>>>>>=a�W=>@?=>=?:
																																									
+

0@>>?>?A=>im>=>>>=>>>>===@E6$=HFTOJJIIA=EDL@<===>>>>>>=\�r@=?@=>=>=																																									
+
4@>??>A@<LxH=>>>>>>>>>===>EE3;MPPLMMKB8>FHL<==>>>>>>>?=Hr|G=?A>?>=?

+																																								
+
7@>?>>A?;bV<>>>>>>?>>=====FQOCDEB@??><<IJQB<===>>>>>>>>?^wR=?@???>@"																																										
+
:?>?>?A>BiB>>>>>>>?>>>====BMLA=====>=<>FJC==>>=>>>>>>>>=[�a<>@??==A'

+																																									
+

;?>??@@;Qg=?>?>>>>?>>>=>>=>CD=<====>=:=>>===>>>>>>?>>>>=J�xA=@@?=<A,

+																																									
+

<????A?;ha<>>>>>>??>>>>>>>=>?BBID>=>>====>>>>>>>>>>?>=>><V�V<?@??>?2
+																																										
+
+
>><??@>C|V=>>>>????>>>>>>>=>>@@HHD@>>====>>>>>>>>>>?>=>>>;RqA>@??>?7
																																										
+
+

?=<???=\|D>>>>>????>>>>>>>>=========>======>>>>>?>>?>>>>>>;bY<???>?<
																																										
+
+
!@>?????qV=??>>>???>?>>>>==>======>==>>==>>=>>>>>>>>??>>>>><HnA>@?>>>
																																										
+
+$@>????GuD>?????????>>>>===>>>>=>>>==>>=>>>>=>>>>>>>???>>>>>=nT=@?@??

																																										
+
+)A>??@>RwB??????????>>>>=>>>>>==>>=>>>>=>>>>===>>????>??>>?><Wj>????@
+																																									
+
+
/@>??@>bwA??????????>>>>>>>>>==>>>>>>>===>==>==>>??????>>>?>=BjC???>@!

+																																										
+
+
5@>?@@@rm??????????>>=>>>=>>>==>>>>>?>>==>=>>==>>>?????>>>>?><aL>??>@%

+
+																																									
+
+
4@>@@?Fw^>?????????>>>>>>>>>===>>>>>>>?=>>=>==>>>>?????>>???><WU=?><A(
+
+																																									
+

2@?@@?O�[>?????????>>>>>>>>>>>>>>>>??>>>>====>>>>>?????????>><P\=??>A*
+																																										
+
6@?@@>Z�X>?????????>>>>>>>>>>>>>??>????>>>=>=>>>>>???????????=Mc>??>A+

+
+																																									
+
+09??@@>f}J>>???>?????>>>>>>>>>>?>>?>>????>>>>=>>>>????????????=Qn???>@-


+																																								
+
%?=>@@@@pf@???>>>?????>>>>>>>>=>?>>?>?>>?>>>>>>>>>>>??????>>>??=X|B??>@.


+																																							
+
3A?>?@?E}g@???>????>??>>>>>>>>>>>>>?>>>?>>>>>>>>>>>>??????>>>>>=Z�F??>@-


+																			
+																			
+
=A???@?M�yE????????>??>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??????>>>>?=[�M??>A,


+
+																																						

 @@???@>Y��T=???????>>??>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????=`�V>?>@+

+
+
+																																					
+

"A??>?@?d�~P>??>????>>??>>>>>>>>>??>>>>>?>>>>>>>>>>>?????>?>????>k�Z>?>A*


+
+																																				
+
+

?>@>?@?q�c?????????>>??>>>>>>?>>>?>>>>>?>>>>>>>>>>>???>>>>>>>??=d�[>?>A+

+
+																																					
+

>?@>??A}�L>????????>>??>>>>>>??>>>>>>>>>>>>>>>>>>>>????>>>>>>>?>Q�\>?>A+


+	
+																																			
+

8B@=??C��E?@????????>>?>>>>>>?>>>>>>==>>>?>>>>>>>>????>>>>>>>??>G|Z>?>A)



+
+																	
+																	
+

+,A?=??Bw�F>@??????>?>>??>>>>>?>>>>>>>>>>>??>>>>>>>????>>>>>>???>D|^=?>A&



+
+																
+																		
+
+

:><@??u�K>@@????>>>>>??>>>>>>>>>>>>>>>>>>?>??>>>?????>>>>>>???>G�_=??@ 



+
+																																			
+
+

#,8A><r�T=?@???>>>>????>>>?>>>>>>>>>>>>>>?>?>>>>??????>>>>>>??>N{^:>?>


	
+																																			
+
+

+6A>:c�\=?@???>???????>>?>?>>>>>>>>>>>>>>??>>>?????????>?????>bU<>@:



+																
+	
+																	
+
+

5A>;S�kA??@??????????>>>??>>>>>>>>>>>>>>??>>>???????????????Bt�K=?A1


+
+																
+
+																	
+
+

.B>=FzmO>??@@?????????>>???>?>>>>>>>>>>>>??>>???????????????HuyB=?A&



+
+																																			
+
+


$A>>>ngZ>??@???>>>??????????>>>>>>>>>>>>>??>?????????????@?>Vwn=>??



+
+															
+																			
+
+

=?>;_n]K>?@??>????????>???>>>>>>>>>>>>>>??>???????????@???Aj|_<>@8


+
+
+															
+
+
+
+														
+
+
+

3@>=LvgiA??????????????>????>>>>>>>??>>>??????????????????KhzM<>A-


+
+
+															
+	
+															
+
+
+

#@>?Apkmc??????????????>?????>?>>>>??>>????????????????@??QWn@=>@!


+
+															
+	
+																
+
+
+

;??>b}ax\>@@???@????@?>>>>??????>>??>>????????????????@>Iim_<>?:


+
+				
+									
+
+
+
+
+															
+
+
+


.A??L�x|~D?@@@@@@???????>>??>???>>??>>?????????>??@?????eq{I=>A-


+			
+												
+
+	
+														
+
+
+
+
+


??@@u�r|U>@@@@@????????????>>????>?????????????????@@>]mnm>>??


+
+
+																
+																
+
+
+


2A?>U�otj?@@@@@?@@????????>?>?>>??????????@@???????@>Wza{P>?@5


+
+
+		
+
+
+
+									
+		
+															
+
+
+

@??AwyhtG@@?@@@@@????????????>>>????>>????@@@?@????H{nq??>@%



+
+
+								
+					
+	
+																
+
+
+
+

2A?>V�bbX?@@@@?@@?????????????>?????=>??@@?@@@@@@@?hnr�Q=?@9



+
+
+
+										
+
+
+
+	
+
+													
+
+
+
+
+


@??@ux`dD@@@???@@?@??>??>????>>????>?@@@@@@@???@?Lwk�p???A'


+
+
+
+
+					
+				
+
+
+	
+
+	
+
+		
+									
+
+	
+

3A?>R�ut]?@@@@@@@?@???>>>>?????>?????@?@@@????@@Bnk{�I>?@8



+
+
+
+
+				
+	
+			
+
+
+	
+
+
+		
+
+
+					
+
+
+			
+


?@?>p��}N?@@@@@@?????>??>???????????@@@@@????@?`pn�^=???!

+
+
+
+
+
+
+					
+
+
+
+
+
+	
+				
+
+		
+
+										/B?>L�x�mJ?@@@@@@???????????????@?@@@@@@@@?@@?]ue�p???B.



+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+		
+			
+
+						
=@??Spv}nD@@@@@@?????????????@@?@@@@@@@@@@@?X~|�{D>@A6


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+				
+	
+					
+

(A??>Toksg?@@@@@????????@?????@@@@??@@@@@@?Pz���K>?A:
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+			
+
+
+
+					
+

3A>?@R^v�P>@@@@@?@?@@?@??????@@?????@@@@>Gpss�Q>?A9
+


+
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+				
+
+						
+
+
+

:@??@Y��wG?A@@@??@?@?@?????@@@@????@@??LjvylO>@B7



+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+
+
+
+								
+
+

>@??Gr��pI???@@?@?@?@??@@@@@@@@@?@??Ibtwq\G>@B4



+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+											
+
+

#?@??C]�{hYLC?@@@@>BGA?@@??@@@@@@?C`xvzlP>?@A1




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+									
+
+
+

%?@?@>]�}ikoT@?>>FhmVC?@?@@@???>Hehs�hB@?@A/




+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+											
+
+
+


"=A??>S��qgl`TUZccSUZLA>??@CHMZjdljC@@@A.



+
+
+
+
+	
+			
+
+
+
+
+
+
+
+
+
+	
+	
+
+									
+
+
+
+
+



7A@?=Ca��}rmlf`ZQRWff]SV`mlikq�}V@@@A@*




+
+
+
+
+
+					
+
+
+
+
+
+
+		
+
+										
+
+
+
+
+
+


. at A??<CYt���xnf[Y[[dgifant�~^B>??A=$





+
+
+
+
+
+	
+					
+	
+
+
+		
+
+	
+		
+						
+	
+	
+
+
+


+
#9A@?>=>DL\mz����������ygRA<??@A6





+
+
+
+
+
+
+			
+			
+
+
+
+
+		
+
+
+									
+	
+	
+
+
+
+



+<A??>??>>@EILQSSTSPKD?<<>?@A=+




+
+
+
+
+
+	
+								
+
+
+		
+	
+
+													
+
+
+
+



,;@@@@@????>=====>?????AA=/





+
+
+
+
+
+
+
+							
+
+		
+	
+
+			
+						
+
+		
+	
+
+
+




&19>@AAAA@@@@@@A<7;<:4)




+
+
+
+	
+
+
+
+
+						
+
+
+
+
+
+						
+
+				
+		
+
+
+
+
+





#)-28;<;961(#7$

+



+
+
+
+
+
+	
+
+	
+	
+						
+
+
+
+					
+
+					
+	
+	
+	
+
+
+






@!





+
+
+
+
+
+
+
+
+	
+	
+							
+
+	
+			
+	
+					
+					
+
+
+
+
+
















+
+
+
+
+
+
+
+		
+	
+
+
+
+			
+
+
+				
+	
+												
+	
+
+
+
+

+
+














+

+
+
+
+
+
+
+
+
+
+								
+
+	
+
+
+
+	
+															
+	
+	
+
+
+
+
+
+







		
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+											
+	
+
+													
+		
+
+
+	
+
+
+
+
+
+
+





+
+
+
+
+
+
+
+
+						
+	
+						
+
+	
+
+						
+
+
+					
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+					
+		
+			
+
+		
+
+	
+		
+
+						
+
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+			
+
+
+		
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+	
+



	
+


+
+	
+







+										

			
+				
+
								
+		
+	
+



+					





+
+
+
+










+
+

+		
+
+
+
+


+	
+											

+
+			
+

+
+					


+
+
						
+
+	
+

+
+			
+		
+	

							
+						
+				

			
+

+			
+	
+
+			
+


+		
+		
+



				


+																	



+
+	
+

	
+		
+		
3870
+		

+
+
+	





9:77:4
		
+
+			

+			
			


2;EWQB<$

			
+		
+



			

+





+<Ir�}hD2


		
					

	





+
+*AarxQ:




									
			






+		7IcFkmdZ=
	






+
+
+					

+





				#=Pc5ZSH`?%	
+
+







			
+
+
+


			5<Z`;SAIb?0
+	

$%"

	
+
+



+					


&/1/)
+.<GiE>J:SoH9	
)4:<=<:2$
	



+

	


#4;===<:5/'"&6?IqL
=B=U5UC;"#0:>>>>>>>>=4

+



		

	(9<<<<=>???>?@@?hb@/=ACG	9Z>???>>>==<<=>>><'
	
+		

	*9>>=>@?=>>>>???>TA=>>?;+]=?>>>==<>?><=>>>>*
	
+
+						

+.:>>=<?A>;;=>>>>>=<<<==>7
N>>>>>=;;?BA=;=====)

+		
+

+
+		


2<>==;;;;;;;;>??>@>?><<<=?('>A>>?>;;;;<<;;;===>=$

+					
+
+


	



+0>>=><<<;;;;;;=@?>A>>A>:<==>>@,/>>?=;;;;:;;<;====>9/ 	

+											
+


+
+
+$;>>>><<;;;;;;;=?><@>>B><=<;>B@::==>=;;;;;;;;;<>==<?M-
+
												

		
38
6=<<>><;;;;<;<<=>=<C>;:>>>=:<?@@A====;;;;;<;;;=?><;=>	

													
+
+

+


7<>;@F??=;;;;;;<<>>=>31@?>=?90/;>===;;<<<;;;;>??@9<?%




+															
+	


+4><?q|K>><;;;;;<>===>6	5<>>?@+
+	*@====;;;;;;;=?AhwH;>7


																		
+


+
+'?=;crnd=>>==<==>=<===A9/6==>=>?7"3?===<=<;;;;=?=W{jm>=> 
																				
+

	 >>=Fy]YbD>>>>>>>=<<==>7*25=>===?3;===<=>>>>>>>?ii\yG<?3
														
+
+
+
	;?>=R~ihokC=>==>=<<<==>("7>9>>;<#8>==<<==>>=>=Hpgo~J==>
																	



0?>>=Iv`ORg\B>>>==<<<==?

*80>>0)7	7>==<<<==>>=Jpn]ZZB>>>3
+																			
+
+

+
>>>>?@@;;;<JV@>>==<<====! 6?>1
,5>===<=<=>=DeUA<;<@?>>>

																						
+


.@>>>?@=====<IV?>===<===< 
&@?.
+*$9>=====<=>?YM;<==>?>>>?1																									
+


:>>?>??===>>=@^Q==>=====@;)	.??.
+1E=========T]==>===?>>>><
																																	


?>>?>??=>?@>>=MUQ>>=>>>=C?	
=>=;#*1;C=>>>===<KXJ<=>?==?>>?>?%																																		
+


*@>??>?>=?@?>?=NNWR>=>>>=B5*@=EF?A at CCLC=>>>===OQPH=>=>?=>?>>??4
+																														

4@>?>>?>@@>=>>AWJK_\B==>=BL>/+6D1&169?WH=>>==AW\LSP====?>>?>>?><
																																	
+

;?>>>?>?@===>@XYOKEJLSC>=FH
	
0
+	
+
KH===@PSRIJT\C====?>>>>?>?"																																				



?>>>>?>@>==<E_YE?<<<<KG>?I5
+
+*		FC=>>FH<;;=GXUA<==>@?>>>>@,																																		

&@>>?>>?@===VtZ=====>=;<>?J&
+4
				

2FA=><;====<AV`E;==@?>>>>@4
+																																		
+

-A>>?>>A@=<Xf==>==>>>=<==J+
+
+2	
+1KC==<==>=>>=?VlM<=?@>>>>?9
+																																							

2@>>?>?A><Dw]@>>>>=>>>====C?# (
':IKA=<=>>>>>>>=E}xE=>@>>>>?<
																																							
+

6@>>>>?A>;_s?=>>>>>>>>=====*0-?*)6 0D?<===>>>>>>>C{�W=>@?>>>??

																																										

9?>>>>@A=CwQ=>>>=>>>>>=====)CL,0NLB;<D:+9B=<===>>>>>?>=`�g=>@?>?>=@"

																																						
+
+
+
;?>??>@@;Vb<>>>>>>?>>>===<==NWRNGDGLMKGMLC=====>>>>>>>>F{pB=?@>?>=A&

+																																								
+
+
<>>?>>A?<fL=?>>>>>?>>>>===>@BDA?<<<==?HME?=====>>>>>>>>=g}M=?A??><A*

+																																							
+
+
=>>?>?A=Ej@>>>>>>???>>>=>=>>=<=====>=<@E?===>>>>>>??>>>=M�e=>A??<:@-
+																																									
+

>>>??@@:Y`=>??>>>???>>>>>=>>?EGE?>=?A>=>>==>>>>>>>??>>>><\�J<@@??=?2
+																																										
+
+

?>>??@>>tT=>>>?>>??>>>>>>>>>CLBIHEHKH?=>>>>=>>>>>>??>>>>><bi=>@??>?5
																																										
+
+
 @=<???=Q�G=>>>>>??>>>>>>>>=>AE>>??AA?====>>=>>>>?>??>>>>>=>iN=@@?>?:
																																										
+

#@=>???>ia=?>>?>>???>>>>>===>>===========>>>>>>>>>??>>>>>?><Qk>?@?>?>
	
+																																								
+
+
%@>????BiD>????>????>>>>>===>>=>=>==>=====>>=>>>>>??????>?>=CyK>@?@??

																																									
+
+
+*@>>?@?Hi?????>>>??>>>=>>=>>=>>=>>=>>>====>>>==>>>??????>?>>=k_=????? 
+																																									
+
+
+2@>??@>Wm>??>>>>>??>>>>>>>>>>>>>>>=>>>====>=>=>>>>???????>>>=Oi>??>>@!
+																																										
+

9@>??@>il=??>>>>???>>=>>>>>>>>=>>>>>>>===>>===>>=>???????>>>>AfC>?>>A$

+																																										
+
+
<@????@sc>??>>?>???>>=>>>>>>>>>>>>>>>>>==>=>==>==>??????????>=^J=@::A'

+																																										
+
+
+@??@??Fxd???>>>????>>>>>>?>>>>>>>>?>>>>>==>=>>>=>>???????????<WQ=??>A(
+
+																																									
+
;@?@@@?OvnC???>>????>>>>>>?>>>>>???>??>>>>=>>=>>>>>???????>>??=UZ=??>A(

+
+																																									
+
'@@?@@@>ZyjB>??>>??>>>>>>>>?>>>>?>>?>??>>>=>>>=>>>=>>???>>>>>??=Wf=??>A(

																																								
+
+
3A@?@A@?hxQ>?>>>??>???>>>>>>>>>??>>>>?>>>>>>>>>>>>>>>????>>>>??<Xq???>A'


+																																							
=A@?@A?ByxI?@?>>??>>??>>>>>??>>>?>>?>?>>>>>>>>>>>>>>??????>>>??=Ww@??>A%


+																																							
"@>@??@?J��P>??????>>>?>>>>>?>?>>?>>>>>>>>>>>>>>>>>>>???????>>??=T�E??>@#


+
+																																						
+#9;@?@@>U��a=???????>>>?>>>>???>>?>>>>>>>?>>>>>>>>>>????????????=Z�K>?>@!


+
+																																					
+
+
 .7A??@>`��l=???????>>>?>>>>>>>?>?>>>>>>??>?>>>>>>>>?????>?>>???=f�O???@ 

+
+																																					
+
+
)1A??@>k��R>???????>>??>>>>>??>>>>>>>>>>>>>>>>>>>>?????>>>>>>>?=n�R>?>A 
+
+
+																																						
++A>?@?v�q@????????>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>?????>>>>>>??=c�U>?>A"
+


+
+																																				
+
31?>>@A{�g=????????>>>?>>>>>>>>>>>=>>>>>>??>>>>>>>??????>>>>>>?>R�T>?>A$



+
+
+																
+																
+
+
+
4?@>>?Aq�d>???????>>>>???>>>>>>>>>>>=>>>>>?>>>>>>>??????>>>>>??>N�X>??A#



+
+																
+																		
+
+
)A@=??=a�j???????>>>>>???>>>>>>>>>>>>>>>>>?>>>>>>??????>>>>>>??=U�V;=?@



+
+																																			
+
+
9?;@?;]�nA?@???>>>>????>>>>?>>>>>>>>>>>>>>>>>>>>???????>>>>???=\�O<>@>



+																																				
+
+

'4A>;W|cD>@??>>>??????>>>>?>>>>>>?>>>>>>??>>>>???????????????@\|M=?@:



+																		
+																
+
+

+3A><N}jK>????????????>>>>>??>>>>>>>>>>>>?>>>???????????????>Gv}E=?A2


+																		
+																	
+
+

0A>=DwjT=?@????????????>>>???>>>>>>>>>>>?>>>??????????????@>Ou>>?A'



+
+																
+																		
+
+

'B>>>kaU@?@@??????????>>>>?>>>>>>>>>>>>>??>>???????????@@??>[~f<>?@




+
+															
+	
+																
+
+



?>>;]qiM=@@@??????????>>????>>>>>>>>>>???>>???????>?>?????Am�U<>@9


+
+															
+
+		
+														
+
+

7@>=LzffA?@??>?????????>???>>>>>>>>>>>????>????????>>???@>Lr|E=>A.


+
+
+															
+		
+															
+
+
+
(A??Azkhd@??????@??????>>>>>>?>>>>????????>??????????????@\pl==>@ 



+
+
+																
+																
+
+
+

>??=i�cv_>@@???@??????>?>>>>>>>?>>??????>??????>??????@>ViuU<>?:



+															
+
+																	
+
+
+

1A?>N�{x�K?@@@??????????>>>?>???>>>????????????>??????>KthxC>>@,


+
+		
+												
+
+	
+														
+		
+
+


@???u�x|h?@@@?????>????>>??>???>>>?????????????????@?Funud>>?>


+
+															
+	
+																
+
+
+

3A?>S�zo~J?@@@?@???????????????>?>????????????????@@@n{qI>?@4

+
+
+				
+										
+	
+																
+
+
+

@@?@s�iwf@@@@@@@@????????>???????????????@?????@?@?U�s�k>>>@#



+
+
+					
+								
+	
+																
+
+
+
+
2A?>N�vixI@@@@@@@@@???????????>?????????@@@@??@@@@Brl}�K=>@8



+
+
+
+										
+
+	
+	
+														
+
+
+
+
+


@???i�s{Y?@A@@?@@??@?????????>>>???>???@@@@@@@@@?Unm�i=??@$


+
+
+
+
+
+										
+
+	
+
+
+
+
+
+									
+	
+
+
+
+

3A??I���rC@@@??@@@@@??????>>???????>?@@@@???@@@?Ksf��E>?A5



+
+
+
+
+											
+
+	
+
+
+			
+												
+


?@@>`�}t\@@@?@@@@@@???>>>????????????@@?????@?Iqnt�X=?@?



+
+
+
+
+
+				
+
+
+
+
+
+	
+	
+
+					
+										
+
+
+0A??DmeiwT?@@@@@@@@????>??????????@@@??????@?Kvym�j>??B*



+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+
+			
+		
=???Ecpr~J at A@@@@@??????????????@?@@???@@@@?Gsu��xB??A3



+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+		
+
+						
+

)A???Ngu�lAA@@@@???????@????@@?@@@????@@@@@h�qs}J>@A8
+

+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+	
+
+				
+
+
+
+					
+

4A??>_{�sR?@A@@@??????@??@??@@@@?????@@@?Z~uslL>@A7
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+												
+
+
+

;@??Bq�wkJ?A@@@??????@?@@?@@?@@@@?@@@?B\sy\F>@B4
+



+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+
+
+
+
+		
+								
+
+
+

 ?@??F{�jL@??@@?@@?>?>?@@@??@@@@@@@?Lm{vw_B?@A0



+
+
+
+	
+	
+
+
+
+
+
+	
+
+
+
+	
+
+	
+	
+
+											
+
+

$?@??Eo�{mZQH@@@@?ATYH?@@@??@@@@@?AVjq�uR?@@A,





+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+
+
+		
+					
+
+
+

%?A@?@c��jkp^HBBG]mf]K>?@@@@????I`f`}hC?@@A,




+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+	
+			
+									
+
+
+
+


"=A??>R|�weiicigcYOW_UE???@BGQcker|gB@?@A+



+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+				
+									
+
+
+
+
+



7A??=AZ|�tic_]\TPXcjaYXcmnlms�{T?@@A?(





+
+
+	
+
+		
+		
+		
+
+
+
+		
+
+											
+
+
+
+
+
+


.?A?>=AUp���yoj`\]\ba]]kqw��yYA>??A;"




+
+
+
+
+	
+
+					
+
+
+	
+
+		
+
+
+
+									
+
+
+
+
+
+
+



#9A?>>=>DN^m{����������vfP?<??@A4





+
+
+
+
+
+								
+
+
+	
+		
+
+
+								
+
+
+
+		
+
+
+



+;@@???>>>ADFHMNORPMHB><<>?@A=)




+
+
+
+
+
+									
+
+	
+		
+		
+									
+	
+	
+
+
+
+



,<@@@@@@@??>>====>????@AA<.




+
+
+
+
+
+	
+										
+
+	
+
+							
+	
+	
+		
+		
+
+




&2:>@AAAA@@@@@A at 99<<:3'





+
+
+
+
+
+
+
+	
+			
+				
+
+
+								
+		
+					
+
+
+

+




#(,/59:973-"-2

+




+
+
+
+
+
+			
+
+
+							
+
+
+
+					
+
+	
+			
+			
+
+
+
+






.7






+
+
+
+
+
+
+
+
+		
+	
+						
+
+	
+				
+													
+
+
+



















+
+
+
+
+	
+
+
+
+
+	
+
+
+			
+
+
+	
+				
+												
+	
+
+
+
+
+
+














+
+

+
+
+
+
+
+
+
+							
+	
+	
+
+
+
+
+
+	
+														
+		
+
+
+
+
+
+
+
+








+
+
+
+
+
+
+
+
+
+
+		
+										
+		
+		
+												
+			
+
+		
+
+
+
+
+
+





+
+
+
+
+
+
+
+
+
+	
+				
+								
+		
+		
+											
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+	
+				
+				
+	
+	
+		
+
+		
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+					
+
+		
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+	
+

+
+
+		
+
+	




+							
+	
+


+
+






+
					
+
+
+
+







+
+



							
+
+


+	
+
+
+
+	
+









+
+

		
+		
+
+				


						
+
				
+


+			
+
+
+
+			
+
+	

+
							


+	
+



+
+				



					




+	
+
+	
+	
+	
+
+
+	
																


+
+
+
+		
+

			
	
+
&/.%
+
+

+	
+	

		
+	
	
+


0:999-
			

	
		




+<G`[H<!
+	


+
+		


+
+		
+
	



:Hi�~pK0
+	
+				
+				


+



'AbUeppZ:

							
+	




	4L_4XcJ[@


		

				
		

	
+





+	
;VV-XU6_B+

+




+
+

								

+
+




+			
-=XV3TB=fB2
		
+






+						
+


+


+
+		
:>hR9J8ImE6				
+




+		
+


		

+
+
+
+	


!8<Tk3>B7OcS;,
	
#,0/(





+

	

	
#.477654446;?@TgS)>==X5cJ>0
+6<>?@@=0
	

		
+

+

!+6=??>????????>DiC:8><ENPl?@<:<=>==<==>@9&
+
+
+		
+

/7<>>>===>>>>>??>>J=>@>=<
	Ce<?@?>>>==>><>>?=-	
+	
						


5==>>><<=<;<>>>>>=<=<=?=>6$H<>>>>><;?BA=<>=>=.

+		

+			
+
+


	


4>==>><;;;;;;<???>>=?<<==>>%?@=>??<;;;=<;;<>==;,
	
+							
+



+

+
*?==>>>;;;;;;;<?@?>@=DC>;<<==;:4:>??>;;<::;;;;====9 
+														
+

	<===>?><;;:;<;<??>=B at 42;;<<=@EA;:=>?=<;;;;;;;;====<2<7
													


+
+
1B7>;<<>?>;;;;;<<<?>==B/->>=<=>@@?==>=<<;;;<;;;=?=<<9?%		

+																	
+

+

+6>=:>D??><;;;;;<>>==?0	
6?>>>?7)*;?===<<<;;;;;<>>><:<:"


+															
+		
	<=<=n{H>>=<;<;<>><==?4
86=??@'%?====<<;;;;;=?Bjl?<=-


+
																	

	
2?>;_skb=>>>>>>>>=<<<>B96778=>??6*)6>======;;;<=?=Xzod<=:


+															

+
+%?>=Dy`ZcF=>>=>>==<<<<??9?2/B>>A<%$"0?===<<>>>>>>??dd[uD=?-


															
+
+

	=>><S~msqjB======<<<<=>+$6;?@???@'
(?===<<<=>==?=Ngbm|K=>>


+														
+


+4?>>=N}cJEUVA=>>====<==>1046;A??'$3''#:>===<<=>>>=Pri`foE>>?3
															
+

+
	 ?>>>>AA;<<<DWD=>======>@)!)*/@?.)#);>====<<>><LmVC<<?@?>>>


																			



2?>>>?@=====<H_C<=====<?2
"*??@&
#.G?=====<=>A`J;====@>>>?1
+																					


<>>?>??===>>>>[\@<====<@?44#;=>='
&/G?<=====<@]P;=>===?>?>><																													
+


$?=>?>?>=>>@>>>FTVC<=>>>BGA;,/>?==><.+4 :>=>>>>=>Q]B==??==?>>>>@'																															
+


0?=?>>?>=?@@>?>GSKYE<>>>@JA;;?@<FF?@BFA2<>>=>>=?PLR?>>>@>=??>?>?5
+																											
+

9?>?>>?>?@>>>?=PQIThK<=>=FIA:5:K62>=BFMG=>>==@TQHSA===>@>>?>>?>=
																										
+

>>>>>??>@===>=I]RJEMVVA==HE0
37

(2.FM<==EX\YKJSN<===>@>?>>?>@&																																	
+

$@?>?>?>@?==<>T`G><<<<GB=>J*6
+	

&I>>?UNECENX_G<===?@>>>?>?0
+																																					

,A>>??>?A>=<HfgB<=====<<<?B '
+	
+
+


>A>><:<<=?GYdR<===A?>>>>?7
+																																				

3@=>??>@@=<IouH=>>=>=======",
+
+
+		
<?>=<====<=CUp\>==@?>>>>?;
																																		

8?<>??>A?==knJ=>>>>>>=====A1
8
+		,A=><====>=>==a�Z=>?@>>?>?>

																																					
+

;?>>>>>A>;QyE<>>>>>>>====><B5
+/+	*1==<==>>=>=>>=R�sB=>A>>>>?@

																																									
+

<?>>?>>A>=m_=>?>>>>>>=>===<)I,6S0
+:>#=<===>>>=>>>>@nyK=>@?=?>>@#

																																								
+
+

=>>>?>?A<Il?>>>>>>>>>>>====!5[TQLIFB>ETJ9<<===>>>>>>>><Rz\=>@?>?>>A'

+																																					
+
+

>=>>?>@@:\`<??>>>>>>>>>===>00AG?==>?BDEA>=====>>>>>>>>>>lrA=@@??>>@+

+																																							
+
+

>=>?>?A?<nO=>?>>>>>>>>>===><;;:=>>>>=<=>>>===>>>>>>>>>>=N�T<?A??=9A.
+																																								
+


?>=???@<Lj?>>??>>>?>>>>>==>===@?<<=>A@<=>>=>>>>>>>>>>>>>=gy@=@??>>@0
																																										
+


?>>????<eU=>>??>>>?>>>>>==>>>ADCCB at DIF>>>>=>>>>>>>>?>>>>=@sZ;?@?>>@4
+																																										
+

!@==???>FvE>??>>>>>?>=>>>>>>>>??>ABCBAB@>>>>>>>>>>>?>>>>=>=JqD>@??>@8
																																										
+

#@==???=Va=?>??>>>>?>=>>>>=>>>?=========>=>=>>>>>>??>?>>>>><c\=@@?>?=
																																										
+
+
$@>????>[H=??>>>>>??>>>>>>==>>===>>=>===>=>==>>>>>?????>>?><MrA?@????

																																									
+
+
+*@>>>??A_A??>>>>>???>>>>>===>>=>>=>>>===>=>>=>>>>>>????>>>>>@oK>@??>?
	
+																																								
+
+
4@>>>@>Ig>??>>>>>??>>>=>>>>=>>>>>>=>>>==>=>>>>>>>>>???>>>>>>=\X=??>>@!
+																																										
+
+
<?>>??=Xr=??>>>>???>>>>>>>>>>>>>>>>>>>==>>=>>>>>=>>???>>>>>>=Lc=?@<=A#

+																																										
+
+
&@?????>ju???>>?????>>=>>>>>>>?>>>>>>>>>>>=>>>>>>>>???????>??>DhA>?;<A&

+
+																																									
+

7@?????AvvL>?>????>?>>=>>>?>>>?>>>>?>>>>>>>>>>>>>>>>?????>>>?>?iI=??>A&

+
+																																									
+
"??@@@@?I|}X>??????>>>>>>>>??>>??>>???>>?>>>>>>>>>>>?????>>>>>>=hR=>?>A#

+																																										
+
-A at A@A@>V��V>?????>>>>>>>>>??>>?>>?????>?>>>>>>>>>>>?????>>>>>><fZ=>>>@!

																																								
+
+
6A>A at A@>gthD??????>>>??>>>>??>>??>??>?>>?>>>>>>>>>>>>????>>>>>><^b=?>>@



+																																						
+
:7=@@A at AwxU=@?????>>>??>>>>>?>>?>>??>>>>??>>>>>>>>>>?????>>>???=Xg>??>?


+
+																																					
+
+/A??@?H��Y>@?????>>>??>>>>>>>>?>>>>>>>>??>?>>>>>>>????????????=Tq@??>>


+
+																																					
+
6A?@@?P��k?@@????>>>>??>>>>>>>?>>>>>>>>?>>>>>>>>>>????????????=Y~C???<
+
+
+																																					
+
+:A?@@>\��~D???@???>>>???>>>>>>>>>>>=>>>?>?>>>>>>>>?????????>??=f�F??@;
+
+
+
+																																				
+
8B?@@?j��{F?????@?>>>??>>>>>>>?>>>>>>>>?>?>>>>>>>>????????>>??>n�I??@;




+
+																																			
+
+
+

,B??A at w��eC???????>>??>>>>>>>>>>>>>>>>>>>?>>>>>>>??????????>??>m�N??@;




+																																			
+
+
+
@@>@@|��YB>??????>>??>>>>>>>>>>>>>>>>>>>?>>>>>>>?????????????>e�Q???=




+
+																																	
+
+
+
$&<@>@?cv{X@>??????>>>????>>>>>>>>>>>>>?>>>>>>>>>?????????????@>]�R=???




+
+																																	
+
+
+
->?>>@=P�|Z@>????>>???????>>>?>>>>>>>>>?>>>>>>>>>???????????>?@=`�N;>@?



+
+																																		
+
+
+
$@@=??<Q�\@>????>??????>>>>>?>>?>>>>>>?>>>>>>>>??????????>???@>n�F>?@=



+																																				
+
+

2<8@?=Sj]@>@???????????>>>>?>?>>>>?>>>>>?>>>>>??????????>????Bp�C>?@9


																		
+																
+
+

2B?<M}dfA>@???????????>?>>??>>>>>>>>>>>?>>>>???????????????>Qtv?>?A1


																		
+																
+
+



1A>=DvcfF>@@???????????>>>>?>?>>>>>>>>>??>>>??????????@????>_�k<>?A'



+																	
+																	
+
+
+


*B>>=mpjN>@@?????>?????>>>>?>>>>>>>>>>>??>>????????>????????f�Z;>?@




+
+																	
+
+															
+
+

A>>;a�o\>@@@@??????????>?>>?>>>>>>>>>???>>>??>>???>?>??@@?Bo�K=>@;



+
+																
+																
+
+
+

;@?<R�hcL>@@???????????>>>>>>>>>>>?>>????>>??????????>?@@>O~w@=>A/


+
+
+															
+	
+														
+	
+
+

-A??C�k]jF?@???????????>>>>>>>>>>>>>?????>>????????????@?Ai�c<>>@ 



+
+
+														
+	
+															
+
+
+
+


@??<l�]peA@@@@@@??????????>??>>>>>?????>>??????????????AehzM=>?:



+
+
+														
+	
+																
+
+

3A?>M�potU?@@@????>???????>>?>>?>>??????>?????????????@f�ss?>>@*


+
+																
+	
+																
+
+
+

@??>rx|uD@@@????>>?????>>>????>>??????????@?????????_v�[=??>



+
+
+	
+											
+
+	
+																	
+
+

3A?>O}|y�[@@@?@@???????????>???>>??????????@??????@>O}n�~D>>@4


+
+
+			
+										
+
+																		
+
+
+


????`�{zH@@@@@@@????@????>???????????@@??@??????@@oyv�c=>>@"



+
+
+
+		
+
+
+								
+	
+																
+
+
+

0A??Cq��|Y?@@@@@@@???@???????>????????@@@?@?????@?Rwm��F>>@6


+
+
+
+	
+												
+	
+	
+													
+	
+
+


????S��yiE@@@@@@??@?@???????>>>?????@@@@@@@@@@@@Dogt�a=??@!



+
+
+
+
+											
+
+	
+
+
+															
+
+
+
+0A??Ap�ouV?A@@@@?@@?????????????????@@@@?@@@@@@Ab|o�~B>?A3



+
+
+
+
+					
+
+				
+
+	
+		
+			
+										
+
+


>?@?LqchsG@@?@@@@@??@??????????????@@????@@@@A]~nz�S=?@>





+
+	
+					
+
+
+				
+	
+
+
+				
+
+			
+		
+		
+
+
+/A@@@Mj}�dA@@@@@@@@????>???????????@@????@@@?a{y�d>??A'


	
+
+
+
+
+
+	
+		
+
+
+
+	
+
+
+
+		
+
+
+				
+	
+			
+
+	=??@?m�~{R?@@@@@@@@????@????????@?@?????@@>S�}|�v@??B1



+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+						
+	
+	
+	
+				
+
+

(A???P��zlC@@@@@@@?@@??@???@@??@@@@?????@?Gt~fzwG>@A6
+

+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+						
+	
+
+					
+
+


4A???i��kZ at AA@@@??@@??@??@@@@?@@@@@@?@@?Clx�q^H>?A7
+


+		
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+	
+
+		
+	
+					
+
+
+
+
+

<@??Bu�zpO?A@@@@?????@??@@@??@@@@@@@@?Ehr{�m@>@B5
+


+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+
+										
+
+
+

!?@??Dy�|jN@??@@?@?>BC>??????@@@@A@@?Jikx�oE?@A0




+
+
+	
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+	
+	
+							
+			
+
+
+


%@A@?Ct��m^TLA??>?RigQ?@@@?@@?@@@?ARgi��a@?@A*




+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+						
+		
+				
+	
+
+


%?A@?@b��tjqfUPQXh_Y[R???@@@@@?ANfhf�}Q??@A(




+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+						
+
+	
+
+
+


"<A@>=Nv��nffjl`XTOSaaNB??@AERgjgu�iC>@A@'




+
+
+
+	
+
+		
+		
+	
+
+
+
+
+
+
+
+										
+	
+
+
+
+
+


5A?>>?Qt��yi_\]\SMXbd`_\cjjlow�tP>?@A>%




+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+	
+			
+												
+
+
+


.@@>>=?Mf~��~wrhcba_Zbkqw}��pR?>??A:




+
+
+
+
+
+
+					
+
+	
+
+	
+		
+
+
+
+												
+
+
+
+



#9@???>>AIVfu{��~�����}p]H==>?@@1




+
+
+
+
+		
+						
+
+
+
+
+		
+
+				
+										
+
+
+



*:@@??@?>>?ACFFFHJIHE@=<=??@A:%





+
+
+
+
+
+									
+
+
+
+		
+														
+	
+
+
+




(9 at A@@@@@??>>>>>>>?@??@A@;+





+
+
+
+		
+									
+	
+
+	
+					
+									
+
+
+
+
+




&2:>@AABAAAA at AA<7;=<80%
+



+
+
+
+
+
+		
+
+								
+
+
+
+
+		
+											
+
+
+
+
+
+
+
+




"&),157740'!:$






+
+
+
+
+
+
+			
+
+			
+			
+
+
+
+
+	
+										
+			
+
+
+
+
+




:"





+
+
+
+
+
+
+
+
+				
+
+		
+		
+
+	
+
+
+																
+
+
+
+





















+
+
+
+	
+	
+		
+				
+			
+
+		
+						
+											
+
+
+
+
+
+
+
+









+



+
+
+
+
+
+
+

+
+
+									
+			
+
+
+
+	
+																	
+
+			
+
+
+







	
+
+
+
+
+
+
+
+
+
+
+
+	
+										
+		
+														
+			
+		
+	
+
+
+
+
+
+




+
+
+
+
+
+
+
+
+	
+										
+				
+
+	
+
+									
+	
+
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+	
+				
+	
+	
+		
+
+
+	
+	
+	
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+	
+				
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+	
+
+
+
+
+		
+
+		


+	

		
+
+		
+

								
+
+		
+






+						
+

+
+











+
+
+

+
+
+

+
+








+	
+			
+
+
+				

		
+
+
+					
+			

					
+
+			
+




	
+


+	

+
+

			
+					
+

	
		
+


+
+		
										
+



					
+
+						
+
+
+

+	
+
+	
+		

#"

+
+
+	
+		
+

	
+
+	
+		
+&5773$
+	
+	

	

		
+
%;FVWJ; 				
		


+

			

	

+	
7Gi{zsM1
	
	
+	
	





+		


+

(B`N^jd\<


+				
+
+


5M[.R`>VB#

		
+
+	

	
+


+	!<WK+TT/YH/


		
+
+
+
+		

	




+3>\F-SF.bL8	


+
+

		
+
+
+				
+		

	




+			"<?`E3Q;6aK<
	
+





		
+
+
+				
+
+	
+

+





+7=HqG7I5;jS;*
		
+






+

+
+

			
+		
+



$),,,*'%#"(7><dxA;C3Cbb<; 
	
	




		
+			


	
)8=>????@A@?@@?Fb^TF;=5SOsQ==3(""%*-01-$
			

+		

+



+
!9@?>>==>>>>>>>>@_r>;>89:MAt�I>@?==>>?>>=8/ 

+
				
+



(>?>===;=>>=>=>==<BQ>><96:90en@>>??>?>===>?=5#	
						
+
+


'>>===>>==<=>>>>>><=>>>=>:=2
5E4>>>??=<<?>=>?>4!
+

+
						




+	

+
<====>>=<;;;=>???>>=>==8<>=8,+B>=>>?>;;;<;;;>?>3


+

+						
+
+

	
	
2><=>>?><;:;;<>??>==>A>=2;=<=@:9G=>??<;;;;;<;=?>>3



+										
+



"-$=<==>?@=;;;:;<>?>=<?;++809<=?F?:A==>><;;;;;;;<?>>=,
1	

+											
+

	
%D==;<;>?><;;;;<=?>===;%9:<<>??AA===><<;;;;;;<??==:
5



+																
+
+

+8>=:=C=>>=<;;<=>?>==>.:<;>=>=3-<?==>><;;;;;;=@??;<4




+													
+
+	

,?=<=n|I=>==>>>??><=<>5
&1<<<???9
>==<>><;;;;<>?Dnd;>0

	
+

+																	
+
+

	<>>;^rlc===>???>>=<=<;19A6;?<=??<7**===<<>>=<<=>?=ZvtW;?2



												

+
.?==Dx_^fK==>=>>>===<<:*2<,0?==@9'1(6A<=<<<=?>>>>??gc^o?>?(


													

+

	!>>><Wspg]?====>===<<>-
);;??>=?7.0==<<<====>>>UggdwG=>=

																
+


+9?>>=V�bA=CHA=>>>===<<E5
.>A>@?>24;@(
+=====<=>>><Txe`ryE=>?3

															

+

+%@>>>>BC;<==@SJ<>=====AI?;>=0,8=?:&#@B,(A====<=>><OeL>;?G@?>>>


																							


5?>>>??======FeK<==<>?GS9
$%*>=?A8$50?GL?====<>>HbD<====@>>>?3																											


>>>>>??===>>>=YmM=<>@BFLA78#)>@=>@>$*
>GA=====<D`H<>===>@?>>>=
																																


(?=>?>?>=>>@?>>EVVN=?AC<-4>@@B?<>=?A9.'$C@>>>><CWW>=>?>==??>?>@(																										
+

4?=>?>?>=?A@>>>@QFVQ==>>6*?CA<69HE>=?D:4C=>>>=ETJK=>>?@>=??>?>@7
																										
+

;>>>>>?=>A?>>?=EWHH\V=<?@?A>=:@O."<@<=ENPA=>=<BUHGM=>>>?@>>?>??>>

																																	
+

?=>>>>?>@>==?>>ZaPMRf_@=>NK>((M7	:=<8KS<=<DTYQJIR?=>>=?@>?>>>>@)
																													


(@=>>>>>?@==<=C]YF>=>DWJ=?D&
#=
	
+
+#>4B>==\d[VUPXP>=>>=@?>>>>>@3
+																																		

0@=>>>>>A?=<@QkV><<<=<;=;F6		2
+
+	'	7B=>D at EJPSX][A<>=>A=>?>>>:
+																																						

7?=>>?>?@>=@bub==>>=====<B.
+
7	
+
+
+	
+
+	
+;B<<<===AIS^rjF=>>A>=>>>==
																																							
+

;?=>??>@@=;Wv`D=>>>========
7

+
+				?=====>==?@DX�sD==@?;?>>>?

																																				
+

=><>>>>@?=BrY>=>>>========B;,+		
+
+	
+?>====>>====<GrZ==?@;>>>>@"

																																										
+

>><>>>>@?<[qB=?>>>>=>>>====E;2? 	63=====>>>=>>>?^yg?>?A>=>>>@&

+																																									
+


>=<>?>>A>?pQ<??>>>=>>>>>=>=8HPPOD7-%75(>===>>>>>>>>=IklI=?A>>>>>@*

+																																						
+


?>=>?>?A<KuB>?>>>>>>>>>===>23SYIBBCCCHC+5>===>>>>>>=>>=Qv^=>A???>=@,

+																																								
+
?>>>>>@@:cp>>?>>>>>>>>>>=>>:7BIE@?>>?>;7======>=>>>>>>><Z}E=@@??<8 at .
+																																									
+
+
?>>??>@>AqM=>>>>>>>>>>>>>>>==?FIC@?@>;<=>>==>>>>>>>>=>>>=me<>A??>>@0
+																																							
+


 @>>???@<T\<?>>>>>>?>>>>>==>>=BHDDECDE?>>>>=>>>>>>>>>>>>>=FwJ=@@??>@2
																																										
+

!@><?>??=`G=?>>>>>>?>>>>>>>>><AA>>??>?BB=>>>>>>=>>??>>?>>><]h=?@?>>@7
																																									
+

"@=<??@>C\>>?>>>>>??>>>>>>=>=>>=<=====A@>>>>>>>>>>??>??>>>>CqI>@??>?<
	
+																																								
+

$@?>??@=JO<>?>>>>>?>>>>>>>=>AC>>>==>>==>>>===>>=>>?????>>?>>i^=@@??>?
																																									
+
+
+
+@>?>??<RH<?>>>>>>??>>>>>>=AG>=>>>>>>>==>>=>=>>>=>>??>?>=>>=Ul>@@????



+
+																																								
+

+4@?>??>@hF=?>>>????>>>>>>>>A?=>>>>>>>>==>=>>>>>>>>>?>>>>>>>>AkF>@?=>@


+																																										
+
+
<??>??=N�L<>??>????>>=>>>>>?>>>>>>>>>>>>>=>>>>>>>>>?>>>>>>??=dT<??>>@"

+
+																																								
+
+
+
*@?????=`�Y>>?????>?>>>>>>>>??>>>>>>>>>>??=>>>>>>>>???>>??>?>=ac<???>@$

+
+																																									
+

8?@?????vuOH>????>>??>>>=>>>>??>>>?>?>>>??>>>>>>=>>???>>?>>>?>]p?>??>A$

+
+																																									
+
!?A@@?@?F�`UK>????>>>?>>=<>>>>?>>>????>>??>>>>>>>=>>>?????>>>>>PuD>>??@!

+
+																																									
+
*B=9@@@>U�laB>????>=>>>>==>>>>?>>>???>?>??>>?>>>>>>>??????>>>>>CsK>>???


+																																								
+
.?-8AAA>e�{^>?????==>>>>>>>>>>?>>>?????>?@>>??>>>>>>??????>>>?>?jR>?>?;


+
+																																					
+
+!!,@@AA at y�yH?????>==>>>>>>>>>>?>>>>?>??>?@>>??>=>>>???????>>>??=b[=??@6



+
+																																					
+
+

>A at A@F��lA@@??>>=<>>>>?>>>>>>>>>>>>>>>??>??>>=>>>??????>>>???<_f=???4
+
+																																					
+


4B?@@?O��yD?@@?>==>>>??>>>>>>>>>>>>>>?>>>>??>>>>>>??????????@?=du?@?@4
+
+																																					
+


=@=@A?\���V>@@@>=>>>>???>>>>>>>>>>>>>>>>>>>?>>>>>?>>??????????>q}A??@3$%

+
+
+																																			
+


>@?@A?n���k@@@@????>>>??>>>>>?>>>>>>>>>>>>>>>>>>>?>???????????B|�D??@5,-


+	
+																																		
+
+


9A??AA{���oH?@@???>>???>>>>>>>?>>>>>>>=>>>>>>>>>>????????????>D��H??@6.,


+
+
+																																
+
+
+

)B??@@z���pP?@@@??>>??>>>>>>>>>>>>>>>>>>>>>>>>>>?>????????????B|�L>?@8* 


+
+																
+															
+
+
+
+
>@>@>[o�zlS?@@???????????>>>>>>>>>=>>>?>>>>>>>>?>>??????????@?o�L;>@9!



+
+																
+															
+
+
+
+
!(;@>@=P���lU@@@?????????>>>>>>>?>>>>>>>>>>>>>>>>?>>?????????@@?o�H=?A8




+																																	
+
+
+
+
,@?>>?=V��gQ@@@???@?????>>>>>>?>>>>>>>>>>>>>>>>??>>?????????@?C~xA>?@9



+
+
+																																
+
+
+
+
=@=??=T�w�hN@@@@??@??????>>>??>>>>>?>>?>>>>>>???>>>??????????>L�w>>?A6


	
+																															
+	
+
+

%06A>=K�v�jI@@@@?????????>>>?>>>>>>>>>>>??>>>??>>????????????>Xup<>?B0



																		
+													
+		
+
+

1A?>C�}lF?@@@????????>??>>?>>>>?>>>>>??>>>???>??>>???@????@j�^;>?B&


+																																			
+
+



-B??=v��nH?@@@????????>??>??>>>>?>>>>>??>>>???>?>??>???????Dr�M<>?@




+																		
+															
+
+
+


#A??<h�{sP>@@@???????>??>>?>?>>>>>>>>????>>???>>???>????@@>Lx{B=>@;



+																
+
+														
+
+
+
+
+

=@?=Q�ynd@@@@??????????>>>>>>>>>>>>>>????>>??>>??????>?@?=\�m=>>A0


+
+														
+			
+													
+
+
+
+
+

1A???t}kvS>@@@?@@?????????>?>>>>>>?>???>>>?????????????@=KoX<>>A 



+
+
+														
+	
+															
+	
+

A??<\�fqpG@@@@@@????@??????>>>>>??>????>????????????@?>Psp|F=>?9


+
+
+															
+
+
+
+														
+
+
+

5A??E�vkma@@@@??????????????>>>>???>>???>???????????@>R~|�n>?>@)

+
+
+								
+								
+																
+
+
+
 @?@=^�}mtM@@@@???>??????????>>??????????????@@?@??@?Hzn{�R>??=



+															
+
+	
+
+															
+
+
+

3A??Ar�xx`AA@??@@??????????????>>??????????@??@???@?hsf�z@>>A3


+
+
+		
+											
+
+	
+																	
+
+

?@?>M��|tN@@?@@@@??????????????>>>???????@@???????O~jy�X=>?@!



+
+
+		
+
+										
+	
+
+															
+
+
+

-A??@h�~dgD@@@@@@@???????>???>??????????@@@????@?Bmpv�|A>?A5



+
+
+			
+										
+	
+
+
+											
+			
+
+
=??@Cqp[tZ?AA@@@@@@?@@??>???>>??????@@@@@@@@@@@>Xwa|�V=??@!



+
+
+	
+											
+
+	
+
+																
+
+

-A>??Phr~wE at A@@@@?@??@?????????????@@?@@@@@@@@?Pr|s�u?>?A2



+
+
+														
+	
+	
+
+				
+									
+
+

=??@@]���\@A@@@@@????????????????@@@@@@@@@@@@Hv~���L=?@=




+
+
+												
+
+	
+
+							
+								
+
+
-A?@?I��uoF@@@@@@???????@????????@@@@@@@@@@@An|~��Z=??A&


+	
+
+
+
+	
+		
+
+
+
+			
+
+
+	
+		
+
+
+
+									
+
+<@???b�tjV?@@@@@@?@????@???@????@@@@@??@@A?T�j�f>??A0



+		
+
+
+
+
+
+	
+
+
+
+
+		
+	
+					
+				
+	
+		
+
+
+
+

&A???D}�nfF?@@A@@@@?@?@@???@????@@@@@??@@?Gmx�{bB>?A6
+

+
+		
+
+
+
+
+
+		
+
+
+
+
+
+	
+
+
+	
+						
+			
+
+
+
+
+

3A???Q��ocBAA@@@@@?@?@@???@???@@@@@@@@A at Cit��e@>?A9
+


+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+		
+	
+								
+
+

;@?@?a��rR?AA@@@@@?>?????@???@@@@@@A@?Edq��tC??B7
+


+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+									
+
+


 >@?@?j��hP@??@@@@>EUM@?@??@@@@@@@@@?Mgm��sD?@A1




+
+
+
+		
+
+
+
+
+	
+
+
+	
+
+	
+
+	
+
+
+
+
+									
+
+
+


$?A???i��vdZRC??ANhjjZA?@@?@@?@@@?H^mn��dA?@A(




+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+										
+	
+
+


#>A@?>]���pqk\`fe\WX\\C>?@A@@@?DZnks��S>?A@%





+
+
+
+	
+		
+	
+
+
+
+
+
+
+
+
+		
+										
+		
+
+
+


:A??<Iq��~ogd_SVWUOegTE@@@ADSmih}�cC>@A?#





+
+
+
+
+				
+
+
+
+	
+
+	
+
+
+								
+				
+	
+
+
+


4A?>=>Kj���vg``^VNWTYdc^ejgpu}�iJ>??A<!




+
+
+
+
+	
+	
+		
+
+	
+
+
+
+
+	
+																
+
+
+


-@@>>>>DWs���zsnhechqsw��|eJ=>??A6




+
+
+
+
+
+							
+
+	
+	
+		
+
+
+				
+
+									
+
+



#8@??>?>?DMZgqw|}{|}}~{qaNA<=??@?-




+
+
+
+
+
+
+	
+					
+
+
+
+
+
+	
+
+			
+
+					
+				
+
+
+



'7?@?@@@@>>?@ABBBBBB@>==>>?@@8!




+
+
+
+
+
+			
+						
+
+
+
+		
+
+
+		
+								
+			
+
+




"5?A@@@@@???>>>>?@@@?@@A?8(

+



+
+
+
+
+	
+	
+									
+
+	
+	
+
+
+												
+
+
+
+




"/7<?@ABBBAAAA?77;;93, 

+



+
+
+
+
+
+
+													
+
+
+															
+
+
+
+
+
+




!%*.2541, /6







+
+
+
+
+
+
+							
+			
+
+
+
+
+
+											
+	
+	
+
+
+
+
+
+


+

(3






+
+
+
+
+	
+
+						
+				
+
+	
+																				
+
+
+







+









+
+
+
+							
+
+				
+	
+	
+	
+						
+												
+
+
+
+
+
+
+








	
+

+
+
+
+
+
+
+

+
+
+													
+
+
+
+
+	
+	
+											
+	
+	
+
+
+				
+
+






	

+
+
+
+
+
+	
+
+
+
+															
+	
+
+											
+	
+
+							
+
+
+
+




+	
+
+
+
+
+
+
+	
+
+																
+									
+	
+	
+
+					
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+										
+	
+	
+		
+	
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+				
+	
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+	
+
+
+
+
+		
+
+		
+



			
+


+
+

								
+
+
+		
+


		

	
+




+


+





+
+



+
+


+			
+


	
+		
+
+
+
+


+



						
+		
									
+



+

+	
+		
+


+			

+
+		
+


+	
+
+
+	
+
						

+


						


		
+




					
	
+
+		
+	


,32'
		
+

+		
+		
		
!8AGF?4
					
	



+		






7LY]a[E/
+
+	
+
+





				
+
+
		
'BaMU\\]<
				
+
+


					
	

6O],T^:YD'
					
	


+!=XF+[[1TJ3


+
		
+		



	3@^;/YO-WV;
+
	
+	
+
+			
+		



	
&=CY81TB*OS>*





+

	
+
+			






	
#;<Pj94P;,PY=7
+





+							

+




+	%;><_l96H80Wf==)
		





+	
+


						


+
$.4554330-1;>;Dxj95B73VrA=:%


	




+		

	
-;?@???????@@>?LlcM93A73Lu[;>>95788752,"
+


+			
	

+

+
#:?>>>>>>>=>=>?Ha�xA=94>1.9[�fD>????????><4#


+
+							

	

)=>>>======>>>=FMF[e>=;:9.6<SmNE>>>>>>>>>>>>;+

+


						

&>>=>>>>>>>>>>>=?>:=?9=<>9;:<BA0>>>>>>===>>>><0



+

							

+
+
+			

+
;>==>>>??>>??>>?=><;<;<4<9=78=@7:>>??=<;;;<>>=><4

+
+							
+
+			6><==>?@?>===???>=<<>>=9/<:<;=@=A==>??<;;;;;=?>>>=0		
														

	
%@2><<=>???><<<=?@?=<<:4:;9'7<9=CA5=<<>>><;;;;;<??>==<
!
+
													
+
	
<>=;<;>?>>=<=>?@?>=;>,
'8/6<9=@:>A=<=>><;;;;;<>@>=<=-> 


																			
+
+	

+<==9?G=>>>==??@?>>=;B)	$;=;;<6==;8??=<=?=<;;;;<???>:<:


+
+															
+	
+
+
+7?><>o�S<>==>@??>>=<;E:/9?>><><=>4
+?==<>?><<<<>>>Ep\9>1

+																
+
+

	$?=>:`ofi?>==>>>>>==<>G+5==?=>@>;6,/<==<=>??>>>>>=_swM;?.


																				
		
+8?=<FxadnQ=>====>====GF
.>A@<=C?;76;A><=<=>>>>>>>Bd^gi<=?&


												
+

+

)@>=<]}ulYQ========>?EI(
+(?C>==ACC5
)E>=<<=====>=YhkbsC=><
																						
+


+<?>><a�a=;<>?<>>>=?ADLS9+59>@===>??>2CE==<<=>==<LbY_u{D==?3

																			
+

+

*@>>>>FL;<=>=RQ<==>AE>4:@???==<===<;A?:0NK@==<=>>=NQ?;:BM@>>=> 

																		
+

8?>>>?>;===>=DiQ=<@F?0#3E<999>===>==8,17PIB?==<>=P]?===<=@>>>?3
+																											



?>>>>??===>>>=NrW>KH2-04A294:A?>=@??50FEAA>=<<NcC=>===>??>>=>

																											


+@=>>???=>>@?>>E[VUNQ7=2
"5==>;B?>@=<%#NPAB@<=LZQ<>>?===??>>=?+																														
+

5?=>???>=>AA?>?>MALWLIQ1
3?<9+0HB;<=6<%,HPBB?>PQKF=>>@?==??>?>>8
																																	
+

<>>>>>?=>A@?>??>NFBKZFC=3-4>;7<@
=>9<8
#8A===PQCNF>>>>@?>>?>?>=?
																														

"?=>>>>?=@?==>?=ITINLTdD>CI at A6=R"#=985:G@<;>PSDDMF=>>>=??>?>>=>@+																																


,@=>>>?>?A>==>=KbUNMNShZ<AE-"<<
		
+
6+
G?<?_`OLJOQ?=>>==@?>>>==?5
+																																		

3?=>>>?>@@==<AWfPDA@<>GPEL;
+
+
+	

	(E<O[MPWVPTYJ<>==?@=>??=>;
																																				

9?>>>>>?A?=<SeuU>=<<<<;<CN		8
+	
+
+
+
+
+
+
+(L<B<<=BSYYntM=>=?A==?>==>
																																					
+

>>>>??>?A><DpqcA<=<=====<D' 0
+	
+
+
+	
+	@D;<=>>=?K\etvS<>=A?>?>==?
																																						
+


>>>>?>>?@=<drWF=>>====>>=?: 4
+	
+
+
+
+
+	.G<===>>>><??cvlC==@?>?>=>@$

																																										
+

?>>>??>?@<KxV;=>>>==>>>>==A=&18
			
+	
?=>===>>>>>=?aslR==@@>?>==@(


+																																							
+ ?>>>?>>@?<fpB>>>>>=>>=>>=>>JTI6
<;>=====>>>>>>Sth_?=?A>>?>=@+

+																																								
+
 ?==>?>?A>@y[<>>>>>>>>=>>>>>>Q`9!'./+#*@39>======>>>>>?XpsJ<>A>>>>>@-

+																																							

 ?>>>>>?@<O�M<>>>>>>>=>>>=>><=RG=BDEINR9&<>===>==>>>>>>>Ouk==A@??<:@/

+																																									
+


!@>>>>>@?<hk>>>>>=>>>=>>>>>>=9KRTSPNONH;7>>===>==>?>>>>>;EsO<@A??<;@0
+
+																																									
+

!@>=>??A>CdB=>>>>>>>>=>>>>>>=AMFJIGFEIE??>>>>>>==>??>>>>>;Pj>?A??>>@1
																																										
+

!@><???@<KO;>>>>>>>>>>>>>>>>?GLE@=<>>BA>>>>>>>>=>>>???>>>>>jP=@@??>@5
																																										
+

"@>=?>??<QC<>>>>>>?>>>>>>>>>JH@?=<<<<>A?=>=>>>>>>>???>>?>><Yi=?@?>>?:

+
+																																							
+


#@>=?>@>>W?=>>>>>>?>>>>>>>>=LH=>>>==>>??>>=>>>>>>>??>>>?>?=O}D>@@???=

+
+
+																																						
+
+
+
*@?>??@<Nb=>>>>>>>>>>>>>==>?A==>>>>>>>>=??=>>>>=>>>?>>>>>>>ArS<@@??>>


+
+																																								
+
+
+4@?>????sh?>>>???>>?>>>=<=>>=>>>>>>>>>>>>?>>>>>=>>>?>>>>>>?=Tc=?@?=>?



+
+																																									
+

<??>??=N{VH=>???>?>?>>>===>>>>>>>>>>>>>>>?>>>>>=>>>??>>>>??>JnB>@?>>@
+
+																																								
+
+

)???>??=bs_T????>>>?>>>>===>?>>>>>>>>>>?>?>>>>>>>>>???>>??>?>NL=??>>@#
+
+																																									
+
7 at A@>???ndAR@???>=>>>>=<A@=??>?>>>>>?>>?>?>>>>>>>>>???>>??>>>J�[<??>>@%
+
+
+																																								
+

>@=@>??Gi>4N@>>?>?@==<<AI@>?>>?>>????>>>>?>>>>>>>>>>??>>????>@xl=>???@"

+
+
+																																								
+
#B9/@?@>O�CAMC>>>=DF>==?DA?>>>>?>>?????>>??>>>>>>>>?>>?>>?????=`x@?????#

+																																								
+
5
)A at A>`�adJC@>>>GJB@??>>>>>>>>>??????>???>>>>>>>>>>>??>?????=Q~F???@>&

+
+																																					
+
+
9A at A@xSRFA?@ABPPD>>>>>>>>>>>>??>???>>@?>>>>>>>???>>???????>IO>??@6%

+																																						
+


4A@@@G��uI???@IOZSB>>>>>>>>>>>>>>>?>??>??=>>>>>>>>?>???>>????D{[>???340
+																																					
+
+


2B@@@?T�z}Z>>?@L\WD???>>>>>?>>>>>>>>>>>>>>>>>>>>?>>>>???>>>???D~i>@??:<;

																																					
+
+



?@<>A>g���qB>??GPD>?????>>>?>>>>>>>>>>>>>>>>>>>>?>>>>??>>>???>L�p?@??<>@(
																																						
+


!@?:>A at z����R?????>>>>????>>>>>>>>>>>>>>>>>>=>>>>?>>>>??>>????>[�vA@??<?A-

+
+																																				
+



@??@@B�����oG?>>>?>>????>>>>>>>>>>>>>>>>>>>>>>>>>>>>???>>>???>]��D?@><?@,

+																																		
+
+
+

8A>?@Az����|O?????>?????>>>>>?>>?>>>>>>>>>>>>>>>?>>>???>>>????J��G<?><?<#


+
+															
+
+															
+
+
+
+

#A?>@>evo{�~U@??????????>>?>>?>>>>>>>>>>>>>>>>>??>>>????>???@?C{~H=??<?0


+
+
+															
+																
+
+
+
<@<@=Qw~�T??????????????>>>>>>>>>>>>>>>>>>>>??>>>???>???@@?E{vE??@87'


+
+																																
+
+
+
+
.7=@=?=O��}�uM@@@??????????>>>>>>>?>>>>>>>>>>>????>>>?????????=O�k???A1 



+																																
+
+
+
+
,A@>?>=N��zyfI@@@@@??>?????>>>>>>>>???>>>>>>>????>>>>?????????=[�k<>?A.




+																		
+													
+
+	
+
+

5<:@>>E��~qH@@@??@??????>>>>>>?>?>>>>>>>>>>???>>>??????????>C[ua;>?B+



																	
+														
+		
+
+

1A??@|�}}mD at A@??@@??????>>??>>>>??>>>>?>>>???>>???>???@?@@>Ni|O<>?A#



+																																				
+



.A?@=p|{|nC@@@@?@?????>>?>??>>>???>>>>?>>>>???>>??>>??@???>Wk{D<>?@



+																		
+															
+
+
+


%A?@=\|�~qG at A@???@????>?>>???>>>>>>>>>??>>>????>>>??????@?AZrs==>@;


																	
+
+	
+													
+
+
+
+

?@?>Bq�|uY at A@@@@@?>????>>?>>>>>>>>>>>???>??????????????@=Id|b<>>A1


+
+													
+		
+	
+														
+
+
+
+

5B??<Y�}ufD at A@@@@?????????>>>>>>>>?>>?>>??????>????????>Bgk�O<>?A!



+																
+																
+
+	
+
+
"A??>E��ulQ at A@@@????????>??>>>>>>>???>>???????>??????@?Jnr|~A>>@:


+
+
+															
+
+																	
+
+

6A?@?p�wtlDAA@????????????>>>>>>??>>>????>>????????@?Fpoo�d>?>A*


+
+
+															
+	
+															
+
+
+
+
 @@@?L{�x}Z at A@????????????>?>>>??>>??????>>??@@@@@@@?`k[��I>??>



+																
+	
+																	
+
+

3A?@=\��yjDA@@@@@???????????>??>???????????@???@@@>Kw`m�m=>?A1


+
+													
+	
+
+	
+															
+
+
+
+
>@??Cu�opaA@@@@?@?????????@?????>????????@@????@?Alwm{�L=??@



+
+															
+	
+	
+													
+	
+
+

+B???R|de~U at A@@?@@???????>??????????@???@@@??@@@?Xysy�n=>?A4

+
+
+
+													
+
+	
+
+
+														
+
+
+
<@?@@Prx�tD at A@?@@@@??@?>>?@?>?????@????@@???@@?Mr^i��K=??@


+
+
+	
+												
+	
+
+
+															
+
+

*A??@Av��}V?A@@?@@?@@???????>?????????@@@??@@@Bnst}�`=>?A1


+
+
+													
+
+	
+
+				
+										
+
+
+
<@?@?Z��unBAA@@@??@??????@??????@@???@@@@@@@?S�rq�q@>?@=




+
+
+
+				
+						
+
+	
+				
+												
+
+
*A?@?Cx�rqK at AA@@@???????@???????@@@@@@@@@@AABr�w{G>??A&



+
+	
+	
+
+				
+	
+	
+		
+
+							
+								
+
+
+;@???O��iU at AA@@@@?????@@????>>??@@@@@@@@AA?VvysK>??A0



+
+
+			
+
+	
+	
+					
+				
+												
+	
+

$@??@?d�u]H?@@A@@@@??@A@????>???@@?@@@@@A at Hov��Q>@?A6



+
+	
+
+
+
+
+
+
+
+
+
+
+		
+
+	
+
+
+												
+
+
+
+
+

0A???Cz�oiI at A@@@@@??@A@@@@????@@@@@A@@A at Dhy��d???A8

+

+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+	
+
+
+
+											
+
+

8A?@?M��zb at AA@@@@@>@FA?@??@@@@@@@@@@@@Idv��j@?@A7




+
+
+
+
+
+
+
+	
+
+			
+
+
+
+	
+
+
+
+			
+				
+
+
+	
+
+
+
+


<@?@>W��qZD?>@@@?B]h`G?@@@@@@@A@@@?DZmo��hA?@A1




+
+
+
+		
+
+		
+
+
+
+		
+
+		
+
+									
+			
+
+
+
+


=A??=^��ic\IAALgi[gbB?@@@@@@A@@@Mjnw��Z??A@(





+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+								
+			
+
+
+



;A??<Y���zrpdfj_WV^__F>@@@@@@?HXhn��yL>@A>#




+
+
+
+
+	
+	
+	
+	
+
+			
+
+
+									
+
+	
+
+		
+
+
+


8A?>;Ho���zlcTTXWTRWcYGA at ABH\kdt��ZA>@A= 




+
+
+
+
+
+	
+	
+	
+			
+
+	
+
+	
+						
+		
+			
+
+
+
+


4A?><=If����th``XQNObjbbjmnw|�}\C=??A9





+
+
+
+
+	
+	
+		
+
+
+
+
+	
+
+	
+						
+							
+
+
+
+
+


-?@>>==ALay����~ysnqtw|���pWB=>>?A3




+
+
+
+	
+						
+
+
+
+
+
+
+		
+
+
+				
+
+						
+		
+
+



!6??>????AHR[bksxwuqppj]OD==>??@>+





+
+
+
+
+
+							
+
+
+
+	
+		
+			
+
+								
+		
+
+
+



$4>A??@A@?>>>>??>>>>>==>???A?5 
+



+
+
+
+
+		
+								
+	
+
+		
+
+
+
+
+
+											
+
+
+





0>@AA@@@@???>>>@@@@@A@@<2#




+
+
+
+
+
+
+				
+								
+	
+
+
+
+													
+
+
+
+






+28<=?ABBBAAA;47984.%





+
+
+
+
+
+	
+									
+	
+
+		
+
+												
+	
+
+
+
+
+





$(,/.*$!?%






+
+
+
+
+
+
+	
+							
+		
+
+
+
+
+																
+	
+
+
+


+

5





+
+
+
+
+
+
+
+		
+							
+		
+	
+																		
+		
+
+
+





	
+
+





+


+
+
+								
+					
+		
+		
+																				
+
+
+
+
+
+








		



+
+
+
+
+
+
+
+
+									
+				
+
+	
+	
+		
+															
+					
+
+
+





+	
+
+

+
+
+
+
+
+
+
+
+	
+													
+	
+
+											
+
+						
+			
+
+
+

+

+
+	
+
+
+
+
+
+
+
+
+	
+	
+
+														
+							
+
+	
+
+						
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+				
+			
+
+
+		
+	
+	
+
+		
+
+					
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+		
+
+
+
+	
+
+
+
+
+
+
+	
+
+	
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+

+			
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+	
+
+
+
+
+		
+
+
+	
+		
+			
+





		
+		
+






+
+
+		
+	
	


		
+





					


+



	
+


			




		
+


+
	
+
+
+	
		
	
+


						
+
+
+
+
+
+	


		
+


+		
+
					




	
+

+
+
		

+
					
		
+


"(&
		
+	

+		
+
+				
+	



19==6)		


+
+			

+

+

3 at AECA?+
+						

+




+		
+
+
+



'EZ?>>ER:


+			

+				

+
	6U['GG5\C(
+					

				
	

$=\E)VT,VK4
	
+		
+					


5B]65[Q1OU<


	
	
+
+			

+



(=EY18[K0G^?0

+	
+		
+					
	


	
+!<=TW0:UC.=U><
	



+				
+			
+

+


	&<==fW.;M>/DjA=4




				
	
+	

0>><ElG(<E=1 at lH;>,
+
+


	




+
+

+

&,156755:?>=;\l>+<A>17gW<>=/


	







+		


!3=?@???????=;>Uy\?6;@>+)Qh@;>?=;;<=<;81%




				
+


+

1>?>>==>>==>>H`{�a6=:<?9*02hvQ?=????>>>>??8%			
+

+	


+

:?>===>>>=<<?Wuqhi4(=:;<4;=4RejX>>>>>=====>?>.	
+


+								
+

	

+
<?=>>>???>=>=>M[F::".>=>9;B=8@!1F?>>>>>>>>==>>?0


	

+			


+				
+
:===>>>???>>>===@><6(9===7?@2-<69;=>>??>=>?>>===>*		

+									
+	(
9=<==>??????>>??>=;<:8=<<=8=<4(>?=<=???>=<=>@?====<

+
+											

+


E<=<<==>??>>>>???>=><<>>=<69>7:=6?;<<=>?>=<<<=?@>==<?.	
+														
+
		
5>=<;:;>>>==>???>=<AT at 3;?=89>><?B@?=<<=??>=<<<>??><<<;8(	
+																				
+
	

*?=<:BZI=>===>??>=<<C\;->?==<?=;>??CC===>??>===>??>=9;>/"	

+															
+
+
+
===<@p|l?===>>>>===?EH?=?>==<A>=>?=@N?===>???>>>>>GqV8<<


+


+													
+

+


1@=>:bl[nH<>>==>>>??CM at 4.:@>=<AA=?>>=DE<<==>>>>>>>=fquH;?3


+															
+	
	>>=<Gxbip_=>===>?C@?IYF8,-=:><@D:4,-9>FA<<=>>==>>>Ef]kc;=?$


+												
+
+	

1?>><_xwgLK>====>B@;>UU?' 5;;><?C?6*&-COG@><=====>=Xmtfq@=>:

+																
+



>>>>=n�e=;<==<=>??10;9<C;98@@=<=>@>;=59B:@A==>>>=<>GHYy~C==?2
+																			
+	

/@>>>>`a=<===EI=>?8.4

:E?:=><<=<=?>:7B-&2 at A<=>=>NC<;:DP@>>>?!
																		


:?>>>?F<<==>=?ND=ADA .D??><8:>>>?<+&3
&7C@<<>YU>===<<?>>>?4
+																					


!?>>>>?@<===>>=AG?@]7
+
+;@=A@?;>>@B at 5!'5
*:G<Abd@>====>?>>>=>


																									
+


-@>>>>??<=>>?>>?VYHP0
+"' 3<@?@=HA>A@?54J+#7OGVaJ<>?>==>??>>=?-
																										
+

6?>>>?>><>@A?>?>LKOSG.;37=:=6847===58#'33,9IMUFOB=>>@>=>??>?>>9
																																
+

=>>>?>?>=A@?>>?=EECS[LS7(4<:;9.
<?<4)	OMHJVF at O@>>>?@?>>>>?>=?

																																			

"@=>>?>?>?@=>>?>>HEDCTW>>=@2:+>K	4;74 (8CAGXIABL=>>>>>A>>>>?>=?,																																		


,@>>>??>>A>==>>?JMPQRR]K<CH>:8LA
+	
6PB;HaMEGESC<>>==?@>>>?==>6
+																																				

4?>>>??>?A===<F\UVb]RNZh[:
A6	
+
+
+
+		%E>b^QQTLORH?=>=>A?>>?>>><
																																		
:?>>>?>?@@==ATox^SUO@<=DV/	&8
	
+
+
+
+
+
+
LY^C at AGRR\oZ==>=@@>>>>>>>
																																					

>>>>????@?=<drtjNHI@===<?9
		2
	
+
+
+
+
+
+	
+#V\D;<==?Y{|r^A=>?@>>>>==@!

																																			
+


>>>>??>?@>;RxneH=>>=>>>==D"	2
+
+
+
+
+
+	
2KIC;<>>>=?UYhsY<=>A?>??>>@%

																																						
+

!?>>>??>?A>BnjI@====>>==>=?C$$?
+
+
+
+
+	F@=<<==>>>=:KiggC=>A?>??==@)

																																										

"?>>>????@<Tw]?=>>>>>>=>>=<ITHH
+				
:F=>=====>>>=Irg`P<>@?>?>==@,

+																																								
+
!?>>>???@?=dtQ>>>>>>>>=>>==BN]K
	


+
+0I=>>=====>>>>=Nmec?=?@>>?==@-
+																																							
+

!?>>>???A>BvmJ=>>>>?>>=>>>>>>EB

*1200@<4>>======>>>>><Iq|T;>A???>=@/
+
+																																								
+

!@>>>>?@A=Q�\B<>>>>>>=>>>>>==;JC>?ADINT33>>==>===>>>>>>=Dhu?=A@??<<@0

+
+																																									
+

!?>;>??@A<aiF>=>>>>>>=>>>>><>CKMLJLLLFPG<=>>>=>>>>>>>?>><>gV<@A??::@0

+
+																																									
+

!?>>??@A?@eN==>>>>>>>>>>>>><HUMIFCB at AHOPA=>>=>>>>>?>>?>>><Hh@?A??<=@3
+
+																																							
+	
+

"@>=??@A=LcC=>>>>??>>>>>>>>AWYLB====>@BPL=>>>>>>>>??>>>??>?nN=@@?>>?8

+																																								
+


#@>>??@?<h^>>>>>>>>>>>>>>>>E`O<>>>=>>>>BG>>>>>>=>>??>>>>>>>pb;?@?>>?;

+
+																																							
+

+(@>>??@=U�]>>>>>>>>>?>>>EC?NT?>>>>>>>>>>??>=>>>=>>??>>>>>><]q>?@????<

+
+																																							
+
+

+3@?>>@?Bnvi?>>?>>>????>KZTJNB>>>>>>>>?>>>B?====>>>>?>>>>>>>EqI>@?><?=

+
+																																								
+
+

<??>??>OJ
]D>??>=????>AVW_SB>>>>>?>>>>?>>@@===>>>>>??>>>>>?@r]<??>=>>


+
+																																								
+
+

'@@@>??=[1SF>??@?=?>>=KRW^F>>???>??>>>?>>??=>>>>>>>??>>>?>?=lt>?@?>>@#
+
+																																									
+
4A at B???>X<A\Q@>?EIA=<<IZmgD>????>??>>>>?>???==>>>>>>??>>>???=W�F>??>>@*
+
+
+																																							
+
+
=A at A???D>9ObLBAG[TEFP\qzH>>>???>????>>?????><<>>>>>>??>>???>I�T=??>?@0
+
+
+																																							
+
+<;<A??>JpPX^lYPFLlshTHcnK>>>>????????>>>>>??>><=>>>>>??>>>??>Czf=?????<


+																																						
+
+
+
 :A@@>Z�vXdRT]JOpzf8AQA>?>>>>????????>>?>>>>>>=>?>>>>??>?????mw@??@??@(
+																																				
+	
+
+

	
?A@@?s�_HRHPTON\iNJE?????>>>??>??>??>>>>>>>>>>>>>>>>>??????>c�E>@??@@8
+																																			
+		
+


7A@??I��bJSOMVSLNZXF???????>>>>>?>???>>>>>>>>>>>>>?>>>??????>b�P>@?>?@?#
																																					
+
+

5B@@?>_�R^_PJP[R`[D??>>>???>>>>>>?>?>>>>>>>>>>>>>>?>?????????c�Z=??>?@A/
																																					
+
+

%A@==@?s���tgWKJ[eZB?@?>>>????>>>>>>>>>>>>>>>>>>>>>>>>>??>>????]xg=@??>@A7
																																						
+

-A?/7AA}����pXUMXV@@???>>>>???>>?>>>>>>>>>?>>>>>?>>>>>>??>>>??>o�t?@??>?@:
+																																					
+

+A?:=@A~����rCJOI?@@??>>??>??>>>>>>>>>>>>>?>>>>??>>>>>>??>>???>r�}A>?>>?@:

+																																			
+
+

?@>?@?v����nBII?????????>>??>>>?>>>>>>>>>>>>>>>?>>>>????>>???=^��C;?=>?A7

+
+															
+																
+
+
+
+
1A>=?=f���s at SG@??>??????>>>?>>>>?>>>>>>>>>>>>???>>>>?????????=V��E>?=>@B.


+	
+																															
+
+
+
+

>@<?=Npo�T'MD>??????????>>??>>>>>>>>>>>>>>>?????>>???>>>??@@=Y�xB>?>=@> 


+
+
+																															
+
+
+
+
*)<?<>>Eox�e;QC????>????????>>>>>>??>>>>>>>>>?????>>>???????@?B^zg=??>9=0

																			
+														
+
+
+

7@?>>?=DfpmC_@@@???????????>>>>>>???>>>>>>>>????>?>>????????@R`sU<??@,$


+
+															
+
+													
+
+
+
+

&>?<@?>?hu|pt]?@@??????????>>?>>>>???>>>>>>>?????>>?????????>C_^vN=??A!



																	
+																	
+
+

"'3@??>co~}}T?@??@@???????>>??>>>????>>>>>>>????>???>??????>Flm}G=>?A



																	
+																			




/A?@=Uo��zQ?@@@@@@?????>>>??>>>???>>>>?>>?????>>?????????>Qyxy@=>@?



+																
+	
+																	
+


'B??>F~���\?@@@??????>???>?>>>>>??>>>?>?>>????>?>>????@@?A`s}l<=>@:


+
+
+																
+																		



@???=s��qB@@?@????>>>????>>>>>>>>>>>>>??????????????@@>Ntr�[<>?A0


+	
+														
+		
+															
+	
+

7A??>S��scI@@?@????>??????>>>>>>>>>>>>>>>????????????@?Ghz|�H=??A!



+
+															
+	
+																
+
+

#A???=n�qZN@@@?????>??????>>>>>>>>>??>>??>>>??????????Djwv�v>??@:



+
+															
+																	
+
+
+

7A??=UyekmE@@@@??>???????>>?>??>>????????>>??????@@@>]ye{�V=??A*


+
+
+														
+
+
+															
+
+
+

 A@@?@_rxz\?AA@???????????>?>?>>????????????????@@@>Mzdd�|A?>@>



+
+
+														
+
+															
+	
+
+

2B??>Cw~orJ?A@???????????>?>>>?????????????@??@@@?Cn{`q�X>??A0


+
+																
+															
+		
+
+
+
=@??>XqzpE@@@@????????????????????????>?@@??@@@B]ws|�wA????



+
+													
+
+
+	
+																		
+
*B???Bn�l{iA at A@?@???????????@???????????@@@??@@?Trry��R=??A3


+
+
+													
+
+	
+
+															
+
+
+
;@?@?O�u�W at A@?@@?@@?????@@????????????@@?@?@@?i|n��h?>???




	
+
+										
+
+	
+	
+		
+														
+
+

&A??@Av�zurC@@@@@@@@?????@@??????@@????@@???@@Esyt�|E>>?A/



+												
+	
+
+
+	
+
+															
+
+
+
8@?A?Q��nvM?@@@???@?????@@??????@@???@@???@@>Zwpq�R>??@<



+	
+		
+								
+
+
+
+	
+															
+
+
+
+
$A?@@@j�{mT?AA@@???????@A@??????@@??@@@@@@@@Hs��wS????@$



+
+
+
+		
+					
+					
+																	
+
+
+
8@?@@F�lUB at AA@@@@???@A@????>??@@@?@@@@@AA?ar��e>@??A-


+
+
+
+	
+	
+
+
+	
+
+			
+	
+							
+							
+
+
+
+
+

!@??@?S��_UA at AA@@@??@AB@???>>??@@@??@A at AA?Pqz�}F@@?A4



+
+
+
+
+
+
+
+
+
+						
+
+	
+
+
+										
+
+
+	
+
+
+

-A??@?e�vs[?AA@@@@???@??????@@@???@@@@@?Moz��N?@?A7



+
+
+
+
+
+			
+				
+	
+	
+
+
+		
+
+							
+			
+
+


6A???Av�sJ?@@@@@@>O\VA??@@@@@@@@A@@@CTm|��S?@?A6




+
+
+
+
+
+
+		
+
+	
+			
+
+	
+
+
+
+						
+				
+
+
+
+


:A??>I��yjQC??@??Si`eO>@@@@@@@@AAA at Idlr��R>@@A0



+
+
+
+
+	
+
+
+			
+	
+
+
+	
+		
+
+
+					
+				
+
+	
+
+
+


9A??=R���ukfUHL]i[SW^C?@@A@@AAA@@Hem��L>?A@(




+
+
+
+		
+
+
+				
+	
+
+
+	
+
+						
+				
+			
+
+
+


6A??<P����sphf_WURSW^I??@@@@?@GUfv��nD>@A="



+
+
+
+	
+			
+				
+			
+
+
+
+
+			
+				
+
+			
+
+
+
+


6A??<Cf����sg[Y[VOQNc`MFDDENaen��wP>?@B:




+
+
+
+
+
+		
+	
+	
+		
+
+		
+
+													
+
+
+
+
+
+


5A?>=<F^v����vld][WXfiijopy~~~nP?=>?A6




+
+
+
+	
+
+			
+	
+
+		
+
+
+	
+							
+
+			
+
+
+
+
+
+



->@>>==?ETm������z{z�����w_H>=>??@0





+
+
+
+
+				
+	
+
+	
+	
+
+
+	
+
+			
+						
+					
+




4?@??????CLU[`hmmmfb`XPF?=>>>?@=(




+
+		
+
+						
+
+	
+
+
+		
+
+									
+		
+		
+
+
+



"1<@??@@@??>>=>=====>>>????@=0
+



+
+
+
+
+						
+			
+	
+
+
+		
+	
+
+
+
+						
+					
+
+




+;@AAA at A@@@???@@@A@@A@>7,





+
+
+
+
+
+
+		
+							
+		
+	
+
+
+
+
+													
+
+
+




&-159;>@AAA@=33763.'






+
+
+
+
+		
+									
+
+
+
+
+
+																
+
+
+
+
+
+




#$#!/;





+
+
+
+
+
+	
+										
+
+	
+																			
+
+
+
+


&/



+
+
+
+
+
+
+
+			
+									
+
+	
+
+
+	
+															
+
+
+
+
+






+	
+




+
+

+
+
+	
+				
+											
+	

				
+														
+	
+
+
+
+
+








+	
+


+
+
+
+
+
+
+
+
+
+												
+		
+
+
+
+
+
+
+								
+													
+
+




+
	
+


+
+
+
+
+
+
+
+
+
+
+													
+	
+
+									
+			
+					
+
+	
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+	
+
+											
+
+	
+
+						
+
+
+
+							
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+													
+	
+	
+
+
+
+				
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+		
+
+	
+
+
+	
+
+
+		
+
+
+
+
+
+	
+
+
+
+
+			
+
+
+
+
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+			
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+	
+
+




+		
+


	
+





+			
+


				
+
+




+




+
+


+	
+



	
+

+
		
		
+	
+
			


	


+


	
+
+		

+
			






	
+


			




+

									



+
+

+

				
+	
		

+

					
	

	
(597+
	
+
+
+	
+		

+	
	

+
+
+

						
	


.<===;6 

+
+
+
+
+
+
+
	

	
+
		

+							

+

+
+


%=?;>>>B6
	
+

+			
+

		
+





							
		


+4FD';;9X@'
+		
+
+			
+
		

+								
+
	
+	
+#>N9"?<)ZJ2
							
+	
+



+							
+

+			
5CW34RJ,MU;

+				
	
+
+				

				


&=L^2=\L4Gb?/
+	
	
		


	;>VQ0?\G6=\@=


	
+
	
+
+	
+


+8>?hL/@YB6:bC>4
+


				
	
	
+



+	 9?;Fc6-BS?78dK;>*




		


$4>>=:SW(,CN>:2UQ:=>+
+


	
+

+
+	


+%-3689<??>=;GnK89BF>;(Jd==>?6$
+





	





 2<@@????>=<=BPwj:==A@>7 4mT:<>>?===<81(

		
		
+

+

2>??>>>>>?@CN\eux1(=9>>;194L~]C<=>>>?>??>;0

		


+		



 :>>>>>>>=>GTbhA.UR.>;<=4<@;=n��X@>===>>>>>>9'
	

			
+

+


	


+<>==>>>>=;>BJNB8 at E.9>?>:9DB;;6Ht`A=>>>>>>>>>><+	
+


+

+				


		
+#;>===>>>==<;=AC>LH:',==>=8=E?378;E?>>>?>>>>>>>=><(		
+
+									
+
+


=6<==<=>>>>==<;>ABACD<)5<=><9BC<#5@?<<>?>??????>>===; 
+
												

6@<<<<;<=======>@BAGO?2:<=><>G?<$4<<?<=???????@?>==<>0
+													
+
+


+	
7=<<:?G@<<===>>?ABEOT?==<==<AD><8<?@@<<=????>>???><<<<*)																	
+
	2?<<:JttM;<<=>>?BBCCFC>@===><@?<<@A>BC=;<>???>>>??==9;>5/&

+																

	
%?==:DrhpU;<=>>>@CCCEB:9=>=<=<?=<=><=GJ@<<>>>>>>>>=TwS9<>*
	
+																
+
+

9?==:fnVb^====?@CC817A:5<??==<?=?>?><>MH@=<>>=>>>>ApktE;=;

	
+																			
	

&@==;IzchglF<=>DBA/
 7>6<>>7<<A>>;45:?NRIC>=>===>=Oh]m^;=?.


																				
+
	
8?>=;dxweDGE<=AG at 29B8<?<(9<@B=,<K:5??A?>==>==Zjxjo?=><

+																		


"?>>=A{�i=<<===CD8
	
 BA at A?8=;>D;
.HA
1;=B>>>==<==Q}�C==?2
																			
+	
3?>>=J�o><=====GF.		-H??CA=<=>=25 at I.

3G?<=?G><<:GU@>=>?#

+																		


<?>>=SyE;=====<@G0
+	
+>7;>=:>>=>><;A$
 >A;?XJ==<=;<?>>>?6
+																													


#@?>>=Z]<=>=>>==;?C:
			 <37<;4B>@@=;;A%		5IAXP======>?>>>>?


																										
+

/@>>>?ZH;=>>@>>>@AEP

 ==:=>>;LA?A at AAE7
7MX\?=>?>===??>>=?.																												
+

7?>>>AR?;=@A@=><GWKG8
,2-<B?>>?9=?>@@A8:
GVPR>>>?@>==?>?>>>:
																																
+

=>>>>CF=<@A@?>>=FVRSIFIF-@>=?.'@@=:9(@@CIXLEL==>>AA?=>>>?>=>

																																				


"@>>>?D@=>A>=>?><FTMTOCDG01341FD
+
7A.10UNKUO?FE<>>>>?A>>>>?>=@+
																																	

,@>>>@B>=@?==>?=@P[LIUJ@?EKM=:M?	$3KKB>@QNFEGJ<>>>>=@@>>>>>>?6
+																																		

4@>>>@@>>A>=>=>KHUZQQWZcT, /D;
+
+	
+#7OH\\LRRIZG=>=>=>A>>>?>>?;
																																						

:?>>>??>>@===@WhV^RZSLO[D-9$
+
+
+
+
+
+
+	
CZ_ZVQQS\hdD;>>>A?>>?>>>>

																																						

=?>>>??>?@=<Mkr{qseQ?=<>E	
3
+
+
+
+

+
+	
>`^RK?=Hn�{iK=>>@?>>?>>>@!

																																						
+


?>>>??????<FrjjpfhV>>==<>A3
	


+

+
+
+6CR`XMC==<SrcitH==@@>??>>>@%

																																							
+
"@?>>??>>@?=bid]F>><=>>=>=ME'0E
+


+
+
+
:SNC>DB>=>>=@Z\i`==?@>??>>>@)

																																										
#?>>>????@=FnaS<;=>>>>>>>=AXNJU
+


+
+	
+
GL@==<<=>>>><`iXhE=>A???>>>@+

+																																								
+
"?>>>??>?@<SlaX<=??>>>>>>>>MPSD
		
+	
+;QF=>===>>>>>>C_ebW=>@???>>>@-
+																																								
+

"@>>>??>?@>ccf[?>?>>?>>>>>=BHK;
"$&%#
-D>>>====>>>>>>=<NnoC=@@>??==@/
+
+																																								
+

"@>>>???@?DpgkW??>>>?>>>>>=<=<C<;<::<GO,7=>====>>>>>>?><W�]<?A???=>@0
+
+																																							
+
+

 ?>;=@???<WwpfD>?>>??>>>>==?>BMG<?DGLKKA;<=====>>>>>>?>>;]wD>A@??==@/
+
+																																									
+

 ?><=@@@=@rthG<>>?>?>>>>>>=FKTMMEJNJGHNWD;=>=>>>>>>?>?>>>=dT=@A?@8;@1
+
+																																									


!?>>>@@@>[zmL<==>??>>>>>>=@LJXUF==>>?ESbV@=>>>>>>???>>???<[g=?@??==@5
+
+
+																																							
+
+
 ?>>?@@?U}m[====>>>???>>@BHJUUA>>>>>>>@Q\B<>=>>>>???>>>>?=]zB>@@?>>?8

+																																							
+
+

$@>>@AABt�tP<>==??????>DSWPUiH;>>>>>>>>@NC=>>=>>>>??>>>>>?V�P<@???@?8

+
+
+																																							
+

1@???A at JP+rS<>=>B@>??>?VQSUcR<>>>>?>?????B?FI?>>>>>??>>>>>Epi<@@?=;?9

+
+																																								
+
+

<@???@?O5=R?>>GH@>=<<MTLVm\>>??????????>=AMIC>>>????>>>>==U~E?@@>=?=

+
+																																							
+
+
+

$@AA?>?>Y6<\JDLWYE?@EQ^LXvd?>??????>>????=AXE?==>????>>>>>=F�\=@@?>>@$
+
+																																							
+
+
+
0B<>@??>baY^OEUOXgPNSd�xo|^???????>>>>????>?LT@<=>>????>>??>?pv?@@?>>?0
+
+																																							
+
+
+8 at 9<@??B`KTRIS`KKihq����|Q=>?????????>?????>?PQ><=>>>??>>???>b�G?@?=??;
+
+																																								
+
+.=BA@??Im>\EAO_MS����{�jG=??????????????>>>>>?LI?>>==>??>>??>Z�W>??>???+

+																																						
+
+
+
7CBA?=Y�uTI65N at F���JKO@>????????????????>>??>?GB>=<<=>?????>M�h>???@@@8
+
+																																			
+
+
+
+
<CCA??t�uaV<EKCRZxsXF>@?>>??>>????????>>>>>>>>>><<<====????>J|zA>@@AA@? 
+																																						
+

/AAA@>K��jb[JNMOQJNXE????>????>????????>>>>??>>>>>==>===>?@?>Iy�I=@@@A?A,
																		
+																	
+
+
+
+
!>A@??=]��rrvhYQNF`TA?????>>?>?>????????>>>>>?>>>>>>===>>????>LnqS<@??@=@6
																																					
+
+

2A?@??>k��tIPeYJMcS@???????>??>>>>?>>>?>>>>>?>>>>>>>>>>>??????Q='Z=@?>@=::
																																						
+

8@?29@>p��vkX]aFXS???@????>>>?>>>>?>>>>>>>>>?>>>>>>>>>>>?????>KHKn>@@>?=1;
+																			
+																
+
+

7A?/3A>o��dsP"ENU@@?????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>?????=Gx�~?=?>@;+;
																																					
+

-A?<=@>j��}Y3
(UF@@??????????>>>>>>??>>?>>>>>>>>>>>>>???????><D{�A<?=@5/;
																																				
+
+
9@>>?=^���M&.JN@@@@??????????>>>>>>>>>?>>>?>>>?>>>>>>>?????>=Ew��A>>=@6:8

+																
+
+															
+
+
+
+
	!@?<?=K��|*!MOA@@@?????>?????>>>>>>>>>>>>>>>>>??>>>?>??>????=N}�r?>?<??B-


+
+																																
+
+
+
+
!=?=>>Ae|z"FZ@@@?????>??????>>>?>?????>>>>>>>>>??>>??????@@>Eh|~S=>?=>@>



+
+
+															
+															
+
+

=<?>>?>?]y�it[@@???????>???>?>>>?>???>>>>>>>>>?????>>?????@?B`yp�L=>?=:=+


+	
+
+														
+															
+
+

2??<???=YnzhtQ@@????????>???>?>>??????>>>>>>>>????>????@????Oqxj�K>>?=#



+
+
+												
+	
+														
+	
+
+


-.5@??=Vu�wpI@@@??????????>?>>>?????>>>>>>>??????>???????@@Xp~�C>>??




+
+														
+
+																	
+	


0A?@>L��tkMA@@@??????????>>>>?>>??>>>>>>>?????????????@@@Wt��t=>??=


+																
+	
+																	
+


*B????}�||\@A@???????????>?>>>>>>>>>>>>>>?????????????@@C`|��f;>?@8

+
+		
+											
+	
+
+																		



A???<f���oA@@@???????????>>>?>>>>>>>>>>>????????????@@@Ns|��R<>?B-


+
+
+				
+									
+
+	
+																	
+

9A?>=M��diI@@@@??@???????>?>>?>>>>>>>?>>>>???@??????@@Cduz~A>?@A



+
+
+								
+			
+
+
+	
+																	
+


%B???=pz^fSAA@@@@@@????>??>?????>>>>??>??>>?@???????@@Rvx|zY=@?A9



+
+
+
+												
+
+																		
+
+
+
8A??<NrjnhFAA at A@@@????????>?????>>???????????????@??Jl{||zC>??B)


+
+
+															
+																	
+
+


!A@?>=_�|uZ at A@@@@@????????>>>>>>>>??????????@???@@?Jjzw��\=>?@>

+
+
+			
+											
+	
+															
+
+
+
+

2B??=I��sxS at A@@@????????>?>>?>>???????@????@??@@@Hhmy{�xB?>?B1

+		
+												
+	
+															
+
+	
+
+
+
>@??<]�tu{N at A@@??????????>???@???????????@@@@@@?\wr}�R>????



+
+													
+
+
+	
+																
+
+
+

)B???C��NcsJ?@@?@??????????@@@??????????@@@@@A at Au}x�i@@>?A1



+															
+
+	
+															
+
+
+
+
9A?@>Z�g[trI@@@@??????????@@??????@@???@@@@@@@Dw�prF@@?@>




+	
+					
+			
+	
+	
+	
+													
+			
+
+

"@?@@Av��jwfA@@@@@@?????@@@???????@????@@?@@@?Lg�wR?@??A,

+
+
+										
+
+
+
+
+
+
+																
+
+
+
3A?A?M��tloD at A@@@?@???@@@@??????@@??@@@???@?Bcl��[A@@?@9



+
+
+								
+
+
+
+
+
+
+	
+
+									
+					
+
+
+

????>b��j`F?AA@?????@AB@@?@???@@???@@@@@@@?Zx|�uA@@???!



+
+
+				
+		
+	
+
+
+
+
+
+
+
+														
+
+
+
+
+
2A??@Bt�w[R@@AA@@@?@ABA@?@????@@??@@@@AAA at Gmx��N@@??A*


+
+
+
+
+		
+	
+					
+
+
+
+	
+					
+	
+				
+
+
+
+
+
+
+
>????G��qoU?AA@@@@@@A?>?????@@@@@@?@@AA at Aap��[?@??B0



+
+
+
+
+
+
+	
+							
+
+	
+	
+			
+						
+
+
+
+
+
+
+

(A???>P��rtI?AA at A@??JRK??@@@@@@@@@@@AA at B\s~�g@@@?A4



+
+
+
+
+
+								
+	
+
+
+
+
+		
+
+
+				
+
+
+		
+
+
+


1A???=^��sbD?@@A@>LegeG?@@@@@@@@@@@A at Ico�qB@@@B4




+
+
+
+
+
+										
+
+	
+			
+				
+
+
+		
+	
+
+
+


5B????j��rgOEA??Hd_T]U>@@@@@A at AAA@?Jgk��uD?@AA.


+
+
+
+
+
+
+
+
+	
+
+
+		
+
+
+
+	
+
+	
+					
+				
+	
+
+
+
+

4A??>Am��qnfY]f]TRU^I>@@@AAAAA at AObq��rB?@A?&



+
+
+
+		
+
+
+			
+
+
+		
+
+	
+
+
+				
+
+				
+	
+
+
+
+
+

0A??>@`���ukgaWSRPOT_PA????@?BLgr���_??@B; 



+
+
+
+
+
+		
+
+
+			
+			
+
+
+					
+			
+
+
+		
+
+
+
+
+

3A???=Kp����re_\ZWTNggYRQLJXdr���iG<?@B7


+
+
+
+	
+
+	
+
+
+
+			
+
+		
+
+	
+	
+					
+			
+
+
+
+
+


4A??>=?Lf}����{okg`^gkopx}���}aG==>@A2



+
+
+
+
+	
+
+		
+
+
+				
+
+
+	
+	
+					
+
+
+	
+
+	
+
+
+
+



->@?>?>=ANbx�������������|fPB==>>@?,




+
+
+
+
+	
+
+			
+
+					
+			
+									
+		
+
+	
+
+





1?A????>>@FOW\]aec]YVQI@=>>>>?@9#


+
+
+
+
+
+
+		
+			
+
+				
+		
+	
+
+									
+
+	
+	
+
+





-:A@??@@@?>>=====>>?>????@@9)






+
+
+
+
+	
+			
+
+	
+
+
+		
+		
+	
+
+
+
+	
+				
+		
+	
+
+
+
+


'8 at AAAAA@A@@@AAAA@@AA?;2$


+
+

+
+	
+									
+
+
+
+
+	
+
+
+
+						
+
+	
+					
+
+
+



 &*,147:<=;81+252.(!







+
+
+	
+								
+	
+
+
+
+
+						
+
+								
+	
+
+
+




@&






+
+
+
+	
+	
+								
+
+
+
+
+
+						
+			
+								
+
+
+
+

2 



+
+
+
+
+
+
+
+
+
+		
+				
+			
+
+	
+
+
+
+
+	
+														
+
+
+
+





+






+
+
+
+
+
+
+
+														
+	
+
+	
+


+	
+
+												
+	
+	
+		
+
+
+






+		



+
+
+
+
+
+
+
+
+
+
+													
+
+
+
+

+		
+								
+		
+				
+		
+	
+
+
+



+
	
+

+
+
+
+
+	
+
+
+
+	
+													
+		
+
+
+										
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
		
+
+
+
+
+
+	
+
+
+
+	
+														
+
+		
+		
+
+			
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+							
+		
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+
+	
+	

+	
+

	



+
+

+	
+
		


+	

	
+
+




				
+
+


		
	


+

	



	

+		
+		

		
+

+
	


	
+	
	
+


+
+


			


+



+	
	
+
+
+


	



+
+

	


		

+	
+$+'

+
+	
		

	







	
+		
+

"5<==9)	
+


	
+
	
+

+





+

	8>>>>=<+
+
+		

+
+




+

		
+	

+


+
0=;2><9>:

+
+		
	



+		








+	
;<0
<6)C?.
+	
+
+
+
+
+					



+	
+	
		
0=<*)>:%?C9
			
+					
+
+
+	
				

<DG19D?08K=(
	
+	
		
+

+
+


6>YP2 at XF8>[@8

	
+					

+	
	



+0>AeE1BZC8>eE>-


+
+			

	



+	
*?<Hg70CY at 96eM<=




		



+		
2>=<MN!1DW?;0LP<=8	



	

+
*6>?>>>XA#7CR==->Q=;>:)
+	


		
+			
+
	

$.579<?@?>><<Wc>=>BJ=?(3]C===?:*
	
+		



+


+
+
-;?@@@?=<<<>DRl�O9<8BC=;%&]e=;==>??>=<6+
							
+
		!9?>>>>>=>FMVb]RXb'5;->>:298BrS@;<>>>>???:)
	

+
+			


'=>==>>>?J^e^P+#9;>=?<4<C>9nwyy[B>=>>=>>??1

+				
+








(>==<=>>?J^bPJ4
+ J-'=?@>98CE=9GKG]hRA===>>>>>?6
	
+
+

					
+

+	
+
	#'/===<<=>@CGNVKA(;=.;<>A at 8>HA:68=E<BC?==>>>>>>=?9
+	
										
+	
+


	9E===<;;>@@>=DTI. E=-=<@><:FKD65>INB@@><=>>>?>>>=>7

														
+



)=<=<;CMIA<;<@PN6(
F;-<<D><AJEB3.E><B@?>==>>>??>==<>3																	
+
+

+	
<<<<:TrnQ><==>HO8.,'751<=A>=@@@@4.D9;DA?>>>>==>?><;;<>'
%																			
+
	
9><=:RskqQ=>?@AGD1&"&9<7<<=>>><==89B>CGC?>>>>==>>=HF9<>;<5
+																	
+


.?=<:Fu]WmP<>AEB>1"(>=7<<<>==85;9=@=AECCA>==>>>=Es{R9=>7
+
+
+																
+
+
=>=<<jlVWfR=>GK;,
+!?/0===>==64;<>?==>:DGB>>>>>;Pr^tD<=>&



+																			
+		
0?==:M{djljaA?OI-<"4>8,<=><><==><;304BI@>=>><as`o\;=>8

+
+																						

+
<>==;h}|cCAJBAD.
	87>-<>?>?;8<>=+!;B==>=A[eukn?==?"
+
+																				


+@=><F~�e=<<<>C8			
3.;:&+?>?B<*%8?+

+%=><===;:R��D=>?5

																					

+
8?=><W�k>====>A?
+				%6<>>A>>=@?58 at A
+
	&8@==>=<<:QfB>>=?$

+																											


>>>>=f�I;======B%			
+<>?A?=><<>@@@>			6E?A>==<<;<?>>=?7

+																										


&@>==@ph><>=====><

+
+		8;:==<A=<<<=?A
			
+
+9D<====<==>@>=>>?


																														

1@>==DvP;=>>@><=<>D;	%6/38<:C==>;<=?&
			>B?<<=?====?>>>=@.
																															
+

8?>=<Pq@<>@A@><<>DBF0
&@:3:=:<RG=>?=<A/

	#GSE==>@@>==???>>>:
																												
+

=>>=>bR;=@A@@===?ROCC?=?6+A=<=CHOB;;>:4501589FQYE===>A@>=?>?>>=>


																																	
+

"@>>=Id?=>A?>>====CTMBFGM@<@CI6
%3:@%
JPIKLTST?=>=>>@@=>>>?>=?)
																																					

,@>?=VS<=@A>>====@DV\O>@AEDENUVD+7)(6:FFB at NOISB;>>>=>A>>>>>>>?4
+																																					

4@???ZH==@@=>==?EO[ULWJNZH at DMQC9 
+
+:MSOIESTPUX=<>=>=@?>>?>>>?:
																																								

:???@WD==@?=>;@V]a]QTV[JL%40%	
+

+	
+!M^WSSZRXa\I<=>=?@>>?>>>>>
																																							

>????QB=>@?=>Nftdi]_UR[EMQ

0

+



		
+
;RN\aXOduuxW?=>>A?>??>>>@

																																									
+


@??>?NC=>@??_uo~|k\I@@GCCc<
7
+
+





)=OO_cYGBR|~msb>>>A?>??>>>@#
																																									

!@??>>JD=>@=Qp_hjWD=<===>=UV=CK
+



+
+/HJLVOBgZF<<=L\gUkJ=>@?>??>>>@'

+																																							
+

#@??>?EF=??>hb_\I<=>>>><;<TgUSO
+



+7SVUUA>MA<==<;DmPXe>>@@>??>>>@*

+																																								
+

#@>?>?BG=?>IoUaJA=>??>>===DXIK7
	
+
+	
8QZWF==;=>>>>>?YhYkJ=?A???>>>@+
+
+																																							
+

#@>>>@AF>?=abJgG==>>?>>>>>;FMN4

"!!"EIJF=>==>>>>>>><EYja>?A????>>@-
+
+																																								
+

"@=>>@AHA=IqRQmJ=>?>???>>=<A?@D<<<:::GK,:<<>>>>>>>>>?><AfxG>@@>??>>@.
+
+																																								
+
+

!?>=>@?KKGngSfeD>>?????>>=>F>@MC87:@FOI7;=<>=>>>>>>??>=;K}]=?A???>>@-
+																																									
+
+
?>=:?@L`k~ctrUA???????>>=BJDHDMIKNQMFERJA<>=>>?>>>??>><=`m@?A???:=@.
+
+																																								
+
+
 ?>>>@ALy�olzZPE=>????>>>?IEFIGIEBDDFKUYPI==>>>>>?????>?<T{G>@@??<=@1
+	
+																																							
+
+

?>?AA at K��]m_JQI@?????>@BHHAIPN@>>>>=>I_UMA>==>>>??????>@ZwV<@@??>>?4

+																																							
+
+

 ???@BAN�{h`NFLQHC@??>CNJIEJdN=>?>>??>;NjWKGKE=>>>?????>AW`p??A?????3

+																																								
+
+

*@??@BAPG,sjPGNT9IJA?CY`RHD\[>>???????>@beTSXSB=>>?????>>Yb�P=A@?;=@4

+
+
+																																							
+
+

9@@@@AAP2g�jXaZOSRU_ixfUEQ]A=?????????>HehSUYO=????????@NNlm?@@?<=?;

+
+																																								
+
+
 ?ABA?@@UQH{zkjM[ZPX���|cZg_B>>??????????>IoiRT[B=>???????FMRpM?@?>>??#

+
+																																								
+
+
+B=:@@@@[�{rP9H.5Hf|����zmQ>>??????>??????>PxnV`K>?>>>???>?EQne>@@>>>?3
+
+																																							
+
+
+1A+6A at Ac�{SFG@"h���dhueG=>??????>??>>???>=Ly~iXC?A?>??>>>=O�|A?@?>>>>
+
+
+																																					
+
+
+
+83-BAFw�sJHR=D������xI>?>??????????????>>=Cl^DAGKA>>>?>=Bm�L>@?>@@?0
+
+
+																																				
+
+
+
+

@@.2A?V��cQXV E����}[D>?????????????????>>>>?[dRMUXRD?>?>>?]}\=?????A:
+																																						
+
+
+
4DB9<A at p�fIW[Q,4VR��jC=?????????@?@????????????>IX\]VSRH@??>?IJi@@?@<2?@
																		
+																				
+!@ABAA at G��hdO5'GZ[ggT????????????????????>>>???@??ANQOKII@??>>IS�G?@A@/-@'

+																																		
+		
+
+2B?@AA>P��vd_5DhYYY@=?????>>????????????>>?>???????@FLKFD?>@?AM_�R=@?A?&,*
+
+																																			
+
+
<@>???=W�}NSGU\W^W@???????>>??>?>???????>>>?>?????>?>@BCA>??>FF';Y=@??A5&
+
+																																			
+
+

?>=>??=\��QMBLOTV@???????>?>>???>??>>?>>?>>>????>>>>>>>>>=>=<KL

g>??<@=

																																						
+


???25A>_��a;7>FUB?????>??>>?>??>??>>?>?>?>>>>?>>>>>>>>>=<=>=@Uvbh?=@=@>
																																				
+
+
9@?76A=`��o9,2FH????>?>?>>>?>>>>?>>???>>>>>>?>>>?>>>??>>>=>?IXu���A>?>A6

+																	
+																
+
+
+
$?@>>?=Y��/
 ,ND????>????????????>>?>>>?>>>??>>>??>>?????>>BJTs��{>=>>B&
+

+
+	
+
+												
+																	
+
+
+

-A><?=L��Q,'AL????????>???????>?>>>>>>>>>>>??>>???????????CIVz�}`===>A+6-

+
+
+
+																																
+
+

?><>>@x�h0IC?????????????>??>>???????>>>>>??>>??>????????COm~�yE>===?>A#


+
+
+																																
+
+


;7?>>??<e�oXNB@@???????????>>>?>??????>?>>>??>>>???>????@@?Bb|s{�G>>><>@7


+
+										
+					
+															
+
+

9@?=???<^�~hMAA@???????????>?>?>??????>>>>>??>>??????????@?Ju|v�zD>?@945


+
+
+
+
+
+									
+
+
+
+																
+


317@??=R�wmYAB@?????????????>>??>???>>>>>>>????????????@@?V}{y�y>>?@8
+

+
+
+
+													
+																			

2A??>E�x^dCBA??????????>?>?>>??>??>>>>>>>??>??????????@@Z~z}xf;???9



+	
+
+													
+																			



,B??><s�qmO@@@????????>>>>?>??>>>>>>>>?>????????>????@@Chyxu~W<>?A4
+
+
+												
+
+	
+
+
+	
+																


A??>:Y��}c@@@@????????>>>>>>???>>>>?>>>>???????????@@@OrquqxF=>?B+



+
+
+			
+								
+
+
+
+																			
+

:@>><C��viH@@@?@??????>>>????????>>>>??>???????????@AB]omwzZ>??@A


+
+
+										
+	
+
+
+	
+																	
+


'B>>>;g�g~`@A@@@@???>?>?????????>>>>>??????????????@@Nfm|�q@?@?A9

+
+	
+											
+
+
+
+
+																
+
+
+


9A>>=Iyh�{MAA@@@???>>?>>>>>????>>?>>???????@?????@@Mgsz�Z=???B(

+																	
+	
+	
+													
+
+
+


"A?>><\��hDBA@@?@??>>>>>>>??>>>>>>?????????@???@@Hqqx}}qB>??@=

+																
+
+	
+
+													
+
+
+
+
+
4A??=D��kqaCBA@@@??????>?????>>>>??????>??@@??@@?d�l||rL>???B/
+															
+
+
+	
+													
+
+
+
+
+


>@??<^�VTz[BBAA@@@????????????????????????@@@@@E{�~}^@?>?@?




+																
+	
+													
+
+
+
+
+
+
)A?@=B}~JcnWAAA@@@@?????????@@????????????@@@@?S����sE????A0


														
+
+
+	
+										
+
+		
+	
+
+
+
7A??=S�vecsZ@@@@@@@@???????@@?????@??????@@@A?\ls��T>@??@=


+
+													
+
+
+	
+			
+
+			
+
+							
+
+


@@???s��m`vR?@@@@@@@?????A@??????@???@@@@@A at C`dw�q?@@??A*


+

+
+								
+
+		
+
+
+	
+
+
+
+		
+	
+							
+
+
+
+
.A?@?I���fqkC@@@@?@@@AA at A@@?????@@??@@@@@@@@Uft��N?@??A8



+
+
+					
+	
+	
+
+	
+
+
+	
+
+
+		
+	
+								
+
+
+
+
<@@A=V��v`aK?@@@?@ABBBA?@?@????@??@@@@@@@?Mpq��_?@@???




+
+
+
+
+					
+
+
+
+	
+
+
+
+
+	
+
+	
+			
+			
+
+
+
+
+
+
+*A???>d��b`ZB?@@@?@AAA???@???@@@??@@@AAA at Bgt��nA@@??@'

+
+
+
+
+
+
+
+					
+
+		
+
+	
+
+
+
+
+	
+				
+
+
+
+
+
+
+
+

;@??>Aq�zhrR?@@@@??CJHH@?@@@@@@@@@@@AA@@Uov�zE@@??A-


+
+
+
+
+
+	
+			
+	
+
+
+	
+	
+
+
+
+
+								
+
+
+
+
+
+
+
+

#@???>Cw�sqjF?@@@?AUeecG?@@@@@@@@A@@A@@Tjs��L>@??A0



+
+
+
+
+
+
+
+	
+					
+
+
+
+
+
+
+
+
+						
+
+
+		
+
+
+


,A???>F~�vpbG?>??F`\\aP?@@@@@@@@@@AAB\st��X>@@@A0


+
+
+
+
+
+
+
+
+
+				
+	
+
+
+	
+
+	
+				
+
+
+
+
+		
+
+
+
+


/B???=I��ugZSNR\^UTW^D?@@@A@@AA@?A\o{��`>@@A at +


+
+
+
+	
+	
+	
+						
+	
+							
+
+	
+
+		
+
+
+
+
+
+
+

.A@?@=Hx��wmmgfbUPTS]\E>@AAAAA?BR`n���]>@@B=#



+
+
+
+		
+
+
+
+	
+
+
+			
+
+
+
+			
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+

+A???>Bg��|ji^\XSTUU[bNDA@?@AJayy��tK=?@B7



+
+
+
+
+		
+
+
+
+	
+
+				
+
+
+	
+
+					
+			
+
+
+	
+
+


-A???>=Q|����ske]]UN^hhcc[Zkq��xS?=??A3


+
+
+
+	
+
+		
+
+			
+
+
+		
+
+
+
+	
+
+				
+
+	
+		
+
+
+


1A?>??=@Tu�����~xpkhlqtw�����uU@=>>@@-



+
+
+
+
+	
+
+		
+
+
+
+		
+
+
+
+	
+
+
+			
+	
+
+
+					
+
+
+


*=A?>??=?GTd{�����������~nZH?=>>?A<%



+
+
+
+	
+		
+			
+
+
+	
+		
+		
+			
+
+
+
+							
+
+
+
+





/=A@?@@?>>AGOUXY]YTSNG@==>?>?@>0




+
+
+
+
+							
+	
+		
+	
+	
+		
+
+
+
+			
+		
+
+
+	
+
+




+:@A??@@@@?>>==>>>?????>?@>3 




+
+
+
+	
+								
+
+
+	
+
+		
+
+
+
+
+									
+
+
+
+
+
+
+




$6>@AAAAAAAAA@@@A at AA@>8-








+
+
+
+
+									
+
+
+
+	
+
+
+	
+
+
+							
+
+	
+	
+
+
+
+




!$&)-1341( '12.)#







+
+
+
+		
+	
+		
+	
+			
+
+
+
+		
+			
+
+									
+
+
+
+





'@




+
+
+
+
+
+				
+				
+
+	
+
+
+
+																			
+
+
+
+

 0




+
+
+
+	
+
+
+
+									
+
+
+
+
+	
+	
+
+
+
+
+														
+
+
+
+








+

+







+
+
+
+	
+	
+			
+					
+	
+
+
+
+	
+	
+

+
+											
+		
+
+
+	
+	
+
+
+
+





+		


+
+
+
+
+
+
+
+
+	
+
+	
+									
+
+	
+
+	


+									
+
+						
+	
+
+
+
+
+
+
+
+

+
+
	
+

+
+	
+
+
+
+
+			
+													
+		

			
+
+
+
+		
+
+
+		
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+			
+
+	
+		
+
+
+
+			
+											
+

+	
+
+
+
+
+	
+					
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+				
+
+	
+	
+
+
+
+
+	
+
+								
+		
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+
+		
+				
+	
+	


+		
+
	
+
+
+
+
+	


+


+
+

+



+	


+	
+
+

+		

	
	
+
+	
+


+	
+	


+
+
+

	
			



		
+	

+	




+	
+
+	

			

+	


+
+
+	


+
		





+

+

&387-

		
	

+	


		


	
+	
		
-<====5

+
+

+
+		

+



+


	
	

+
'<=>??>=2

+

		




+
+
	
+	

+
+

+
+7=8+=71<<#


+


+


+	



	
			)=</!>4#;=3
+	
+	





+					
+
+
+				
	
8;<,1?;(7<<

			
+	
+
+			
+
+
+

+
	

,<<=0:>=36==0
+		

+
				

	

$<=G>2?D=8;N?<


				
+

	

	<=E]92DP?8:`H>5

	
+					
+

+		6>;OU/0HT?82WR<?*
+	

+	
+

+
		(:>=<PB
1HT>;.BO===#

+

		



 *6>@>==BS9#7EO==-;N@<=>5$

+

+				


",39=?@?>>=<>\S<=>CH=?*1RI==>??:.#


+


		

	
+


		

2<>>??>==<=AHWq~F<<:BA=:%%PkB<=>>>??>;81#
+

+
		
+

-=?>=<=<<BIMRRG:>X4<;,>>:196>~y_J?<<<=>>??>3 	


+			




3?>>>=<?Mdp]G)
+
1.>=;=<4<C>:Y;LbgYH?=>>>>>?;)
+

+							




+	
+


+4?====?Nat�i@:
	
+5=6=?@=89GI?9P(6T_UC=>>>>=>=-
+
+						
+
+
+


+*A<>==<;CYdbiv[2(		,C><<@@=8?JE;6;<
.FMC=<>>>==>=+


+											
+
+	
+


+
$B===<;Ldg`bb`Y 
+	
9?;<<D@==DDF;6>?

)2?E?;<=>>=<==<$
	
+
+																			
+



+
-===<=\vkba]PFN%
		5D;<@H>=@=;C=5E#

.7BE?<<===<<<<=8
																		
+

+
+

+
(?==<;^sdedXLEB>!
+	):9<AG?=>8<C<0?+
%.8HH@>=<<=A>9;<>/ 	
+																	
+

+		
=>==9UrZWe`H<:5'
+
+/97<><>><;?C90F?<2)2GE>>>=;?ZnS9;==>?	

+																
+
+4?=<:Fq_OL[W?4)
	
2<;<;<>=<69<53A>=4
$:GA?>><@hpsS9=>;




+																			
+
+
#>==<>kiTJIZYA/
+			
/::<15>=</.79>>9<'
%@ED>==?ch\tB<=?*


+
														
+	
6><=;RzfiibmkT/
+	
+
+
+	65:<0&@=>74<<>>7%
	
+(@G@<;Hnu_qZ;=>=

+

+																		
+
+
+
 >====n{xZA at I`X
	
+
+
+
+	31;<5(D??;4<>;=4			/EC<<IR[von>==@-


																						

2?<=<I|}V;==;BG
+
+
+
+
	1.<<8:C@><4=?==$			
+	AF<=<::Z�~F=>?;

																						
	
;>==;[}b<=>=<:A

+
+
+
+
+
+
+.6;;?>C>?:=><;	
+
+	
2H>>=<<;d�J>>>@&	
																						


 ?><<?mvI<>==<;=4
	
+
+
+
+	409?@<FA??>>>5					
/D===<;;=SE>>>?7

																							


*@==;Esc?=>><<;<@(
+
+
+
+		0@=?><F@<>??@2
		
+
+	I?===<<=<>@>>>>?

																										

4@=<:RxL<=??>=;<>A4


2@:<=<K@:;=>B2

+				)E;<=======?>>>>@,
																										
+

:?><:cj>=>@B@<;<=>HG).;.5<:>WB;<=:;;	
+

	9>;;=>@>===??>>>?8
+																															


>>><BvM<>@BA@<<==>>EA=;:<=>2;<;FbJ=:>;9D>-.1/0:AF=<=>@@?==??>>>>>

																																				

%@>>;Xo>>>BA>===>>===CFDDK@=C><CR_ZO>>;-(DL@@FGEMF====>>@?=??>>>=?&

																																						

.@>?<l^=>?B?=<==>>=AIEBBCB?CNKOXUNMG>FD41BIEDBFYPA==<===?A=>?>>>=?1

+																																						

6@>>?vW=>@B?>==<>>ET^[XUVTRHQeTH9'"/CDFPNOKL^bXOC<<====@>>??>>>?8
																																							
+

;???ByS=>@A>>>=@HQc]SIPSWNH?=P&			1LUWSQSaRXXH<;>==@>>??>>>>=
																																					
+

>???BxR>?@A><<H_cfaSYYWZXZF 8
	



+
+	
/ONKOddYkfi^?<==@@>??>>>>?


																																						
+
+
+

????AvY=?A@<B^xy^OT\acb^_^W8,5
+





+'?RUU]sfn|{xuoG<=?@>??>>>>@!

																																										

#@??>@qg?>A?@ivy|eOLHFK[[RUSUW?





+DKFNMUX\^j]^hnjXhi>=>A>???>>>@$

																																										

%@????dwH>A<]lR^uXD>=>BNWZba\W:





+VXHR_VTbTIEIPNYaKiU<>A????>>>@'

+																																								
+
&@???@V}S==FtXUcmUA===?@BH]cVU1
+
+
+
+!SPW]VD?E@=>?@=MlVXh?>@@?@?>>>@)

+																																							
+
+

%@>??@K|dFEmrP[fbTB>>=>>=<FQQV<!

$2PJTL>====>===>@Ub\kK>@A???>>>@*
+																																								
+
$A???ACsydsxXO]eLB==>>?>><@HFMF;;:89:JL5>>;=>>>>>>>?>AO^p`??A???>>>@*

+																																								
+
+

"@??@BA`���n`Wc_?<<>????>=CC=CLB966<GPF-;D==>>>>>>>??>FWlrE?A@??>=>@)

+
+																																								
+
+

 @???@BOvqabjuW<==??>=>>>GE?DGNMKLNMFEFFJ>=>>>>>>>???APcR>AA?@=9>@)

+
+
+																																							
+
+
"@>?>=CHfk\RSScgE?>>>?>??CGDEGBHKIKJKHFKCFE=>=>>>>?????>Kyd=AA???=>@-
+
+
+																																							
+

!?>@@@AF`g_YYS^o]LDAB at DFEDBBCHMC?>?>>DPPDDKA@@=>>>?????=NU_C at A@@?>>@0
+
+																																						
+
+

?>@@AAEf|sjpqxuTTYQFAHKIIFISOC>???@?<=RRIJDAIB>>>?????>O/=\>A@???>?-
+
+																																								
+
+


!@??@ABEh��tzz|r\PUikuuf_LFbd?>@??????<FhMNC?MR?>>?????=UG7vI>@?>;>@+


+
+																																								
+
+

.A@@ABCEYr�����uD.g����l]FO`E>??@??????>VdVLNIZJ=?@????=TX at AT?@@>:>@6

+
+																																								
+
+
;AABABCE^w����UP.>zv|���waSB=>?????>????>\{UPXloI@?>?@?>P[=DH at A?>??>

+
+																																								
+
+
%@A at BBBCFk{~}d`DM(r�[u|qoYB=>?>?>?>>>?????>[yhh��nHDA>>=CRHH6DW>@?>>>?1
+
+
+																																						
+
+
+
&A>/8BBCGx�zkPD34QgrW<6:=<>@@@??????>>>>???=M|����QLRD??GKCQL<a???>>@?=

+	
+																																						
+
+
+
)%"CCC]��nUC<.r�g��gi]A>?>????????????????>It��kav[HGIEAEGCyD>@>?@@@-
	
+																																					
+
+

%

+ CBJ~�og[X2)������vP>??>??>?????????????@?A\m]y��gWXQCABHMsT=?>@79B5
+
+																																				
+
+
3=,-D@]��k_]I1w���yN?>?????????@????@???????@>Eh��uPX[YE?BI.-b@@?B-
>8
+
+																																					
+
)BB<,<BAp��n[A Vp�zbC=????????>???????@??????????CjnD>?VVB at ARK>vF??B6'

+
+																																	
+
+		
9@?A at BAD{�qZM+.ZfiSD=>?????????>?@???????>??????????SbR;LK>?BN:SnS=>@A.

+
+
+																																		
+
+
"@>=?@@@G�a:N>NhWYC=?>>??????????>@??????>?>??>???????OcRLD??GN =tf=??@A*
+

+
+
+																																		
+
+
*A=<????N�c9=MOVTC>??>>???>?????????>>??>????>>????????IXMF at BQf#<nx=??=A=


+
+																																			
+
++B>>;=?>W��]/B at JG>???>>???>???????>?>>>?>???>>??????????FNGCHXyjy�~A@<8@?


+																																			
+
+"???22A>Z��uJ=CL????>>>????????????>??????>>>>??????@????FJILg�����@??>@<


+																	
+																	
+
3@@<<@=U��B2CSD>???>>>???????????????>>?>>>>?>???@?????@@GLC]����u=>>>B-
+
+	
+																																	
+
+

8A=<?=J�EOMF?????>>>?????>????????>>??>>>?????@????????@KAN���T<==?@
+
+
+
+
+																															
+
+
%A>=?=@�}g`E@??>??>?>>??>?>????????????>>>>??????????????JCO}��oA>==>>*7
+	
+
+
+																
+													
+
+

66@>>??;p~WJ at A??>??>??>??>??????????@??>>>>???????????????GUWxu�|A>>>=??;

+
+			
+											
+	
+															
+
+


<@?=@??;b�rN at B@??>????>??>???>???????>??>>>>?????????????@Ba]vsrm>>??:=>*

+
+														
+
+
+															
+
+

#5/9@??=N�zdGA@?>???>>???>>>??>????>?>??>>>>>????????>???A at bozsm[<>?@4!"

																	
+																	
+
+
5A?>>>ub`@A??????>????>>>??????>>?>>>?>?????????????@@AlrmtsO<??@3


+
+
+																	
+															
+	

/A>?>9e�efJ@???????>???>>????????>>>?>>>>?????????@?@A at Kls{ykC>??A1


+
+
+															
+
+
+																
+
"B?>=;I�vxb>@???????>?>????????????>?>>???????????@AAAA`tv��]>???B(

	
+															
+		
+	
+														

:@>>=;p�|gK@@????>??>>>???????????>?>?>>?????????@@AAIjju��H?@?@A




+	
+																
+	
+														
+
+

'A?>>:P�dtoE@@??????>>>?>>????????>?>>???????????@@@Dbl_{�h=???A:

+
+												
+			
+
+
+														
+
+
+

9A>>=>ofr�_A@@??????>?>>>???????>?>>>????????@??@AB^l{wp�I>???B(


+															
+
+		
+														
+
+
+
+

+
"A?>><Kl|�vUA@?????????>>>??????>?>?????????@@?@@?Xsm��s`=???@=
+																
+
+	
+													
+
+
+
+
+
+
+
4A>?>=l��xxPA@???????????@????>>???????????@@@@@Dvnz��a@>>??A.
+		
+														
+	
+													
+
+
+
+
+

=@>?=Q�zWlgKAA@?????????????@>>>???????????@@@?Y����K>???@?



			
+												
+	
+													
+
+
+
+
+
+

)A?@?>j�hkbdIAA@@@??????????@?>???????????@@@?Epki}�p??>??B0

+
+				
+									
+
+
+	
+									
+				
+
+
+
+
+
6A?@>E��{\_bEAA@@@???????>?@@@??????????@@@A?Vufq��N>???@=


+
+															
+	
+		
+
+
+
+			
+			
+
+
+
+
+
+


?@@@>\��kZe`CAAAA@@????>??A@@???@@???@@@A@@Gbdp��i?????A*

+
+
+					
+						
+
+	
+	
+	
+	
+			
+
+
+	
+		
+
+
+
+

,B?@??o��k\paC at AABBA@@?????????@@@??@@@@AAAZjh��~E????A7
+
+
+
+				
+
+
+
+						
+	
+						
+
+
+	
+
+	
+
+
+
+
+
+
9A?@>D|�|d^mXD@@ABBBBA??@>????@@??@@@A at A?Jolx��O????@>




+
+
+
+
+				
+
+
+			
+
+	
+
+
+											
+
+
+
+
+
+
+"A??@=K��s_^_OEA@@AABBKJG???@@@@?@@?@AA at Beup��V>????A&


+
+
+
+
+							
+
+	
+
+
+
+	
+
+
+
+
+	
+				
+
+
+
+
+
+
+
+
3A???=T��kao_JC at AFR^`ffV?@A@@@@@@@@@AA?Sso��\?@?>@A*

+
+
+
+
+
+
+						
+
+	
+	
+	
+
+
+							
+
+
+	
+
+
+
+
+
+

>@>??>Z��pijVGCDMbd^]`[@@@@@@A@@A at AA?Oih}�p@???@A+


+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+	
+				
+
+
+
+	
+	
+	
+
+


%@??@?=\��umjYQQX]YRWZ\G??@@@@A@@??AVpqz��F>??@@)



+
+
+
+
+
+
+
+
+				
+
+
+
+
+
+	
+
+
+			
+
+
+
+
+	
+			
+
+
+
+
+)A@???>[���qjjecYRUVV]^JA?@@@@?@DL[tx���L>??A=$


+
+
+
+
+
+	
+
+
+					
+
+
+
+	
+
+				
+
+
+
+
+
+
+		
+
+
+
+
+

)@@?@?>U���nea^[UT[UW\dREB@@@BLcrs���tI?@@B8




+
+
+
+
+		
+		
+
+					
+
+
+
+				
+
+	
+	
+		
+
+
+	
+
+
+

'@@?@@>Kw��wribaa^[SI`d]ZTMLVan|���X?>?@B2



+
+
+
+			
+	
+		
+
+			
+
+
+
+		
+
+
+
+	
+				
+
+		
+
+


'A????=A\������vjiaXY\hkgfp�����aE=>?A at -

+
+
+
+	
+			
+
+
+
+		
+
+			
+
+		
+
+	
+					
+				
+
+


+A@>??>=C^z�������zy�������bF>>>>A<$


+
+
+
+
+	
+				
+
+
+
+		
+		
+	
+	
+
+
+					
+
+					
+
+



%;A@????=@HVaw���������zo`NA=>?>?@5




+
+
+	
+								
+
+
+
+	
+
+	
+
+	
+	
+	
+
+
+
+					
+
+
+




-<A@??@@?>?@EKOPQOLHB@>==>???A:&


+
+
+
+
+		
+	
+					
+
+	
+
+
+		
+		
+
+	
+								
+
+
+
+


+

(7 at A???@@A?>>>?????>>?>>@A<,




+
+
+
+
+
+				
+						
+
+	
+		
+
+
+	
+
+
+		
+				
+	
+
+	
+
+




!2<?@@ABBAAA=59?@@AA?<4(





+
+
+
+	
+				
+			
+		
+
+
+	
+
+	
+	
+										
+		
+
+
+
+




!#$)-0.&$.1.' 







+
+
+
+			
+
+			
+			
+
+		
+
+		
+		
+											
+
+
+
+
+




>0

+
+
+
+
+
+	
+				
+								
+
+
+
+
+	
+
+					
+
+										
+
+
+

($




+
+		
+		
+												
+
+	
+
+
+		
+



+						
+				
+
+
+
+
+









+


+






+

+
+
+
+											
+	
+	
+	
+	
+
+	
+
+

+
+										
+	
+
+	
+		
+
+
+





+
		


+


+
+
+
+	
+
+															
+
+
+	
+
+
+

+								
+		
+					
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+
+	
+
+		
+					
+									
+	
+


+		
+
+
+
+			
+			
+
+		
+
+
+
+
+
+
+
+
+
+
+
+			
+		
+	
+
+	
+						
+
+								
+


+
+
+
+
+
+
+							
+
+		
+
+
+
+
+
+
+
+	
+
+				
+				
+
+
+
+						
+							


+
+
+
+
+
+
+
+
+					
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+		
+
+
+	
+
+	
+			
+
+		
+	
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+				
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+						
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+
+					
+


		
	



	





+

+	
		




+


+	
+
+			





	


+





+
		


		

+				








+	








+		
+
	
+
'-)


















+	

	

!6<==9)
+










	

	
+	

+	
8=====<&

+









+	
+
+

+
	

		
0===>>=<8







+		




+

		
!;<:/=53<<)
+


	


	



+		

+	
2=<6->6+<<6
+
+
+
+
	




		

	

 <;=47><0:<<#
+
+	
+




+	

	
+		
+
+
+

+
+	
+
6=;<2:>=5:;<5
+		

	
+
+	
					
	

+
.><<;6<>=6:><>%

+				
+
	

+



+"=<DM:8>?=57OF=9	

+							




+	
 ;=;PJ31AA=54KQ<>2


		
+				

+	

	
+
!1>=<>O?,GE=71AN>=>/
+	

	

	


!*5<@?>=<EP23HK<;.>MB;=?;/ 



+

%/7=?@@?>=>=?\H49=FH=>&4ML<==?@?:1(

				
+



	




	
"4=?>>>>>>==@GThq=9>>C@=9
%LjB<=>>>>>?>;3%
		
		
+	
+	

1>?=======@GKGE:2R6;=7?>:.4.@}u^LB>=<<=>>?=5"		
					
+		
+



7>>===;AIKRQ: 
+5:==6><3:@7<Q0;KUXTI?;=>>=>=-

									



+		
+		)*9>===;D_qvvn.	
+;=<=;>96DE7>P	 CnmP?=>===>3	
+
+
								
+

+

	HB====<WzoevpG


+>C;;>>=7<HG87B0	
+?mdMA>====>2			
+	
+													
+
+
+


+:===<=bx^ShgJ7

+
+
+
4><;;B@<;BFF97=1
+	
2_ZNGB=<<==>-


+														
+
+
+
+
+
+
6=<<<<cuPN`]MB)		
+
+
+2H=;>B><>1;B;<B
	
?YOHFKLA;;<<=#

																	
+


+
+0?==<;_vTJT3
"$	
+
+#J=;BD?=<0:B<9B)

HICCBLckV<;;>6

+
+																			
+
+

+
+
#>=<<:ZwYFO>


		
+
+	:;=B??==;?E<3B?8
+7BCB?Fbrt`;;==<C	
+


+															
+


8>==:OuaK>G)
+					6;=>=@=><AD<2><>%

9AB?B[]UpU9=>>&



+
+													
+
+

*?==<BreSFNX/		
+
+
+		9;;5;F=?<A at 97<<=#	$:D at DX_^asA<=>0
+

+								
+	
;><=;\udfadk[$
+	
+
+
+
+			(=;;6:G=?=<<9<=:*
+
+	,FDKgom^uX:>>?!
	
+

+									
+
(@=<<BoolN>>CgG
+
+

+

+
+
+
+.<;;:<A<?>7:8;< 
+	
+
+
+	
"KFMQL^vto=>>?5



+													

7?=<;OxqJ;=>;JG	
+
+
+

+
+
+
-8<<;=>>>?299:;	
+
+
+
+
RB?;;<b�}H=>>?

+														
	
>>=<;_|_<>>>=<>	
+
+
+
+

+49<<;==J>@/48:4		
+
+
+	H@=<<<?r�V=?>@+


+																	


%?==<?mnL<>>==;?*	
+
+
+
+
+
+,;:;=?:SE?9,3;/
				
+
+
;><<<<;G}\=?>?9

															


0?==;Ho\?=>?=<<=A
	
+
+
+
+
+
.=<@@<PC=@:9='					
+
+	&>;<=<<<;\Y>?>??
																								
+

7?=<9XoG=>>@?=<=>< 
			#D?@=;K?<>?>?"				
+D<;<=<==;EO>>>>@)
																											
+

=>><;kh>>>ABA><==?F<"6I>><>H><=>?B*
+
+

+	5?;;<>@>=<>G?>>>?5
+																																			


 ?>><F|U=>@CBA==>>>AM@::;;=F8;=<@L>;8><AG1,25,.=A<<;<=@@?==B@>=>>=
																																					

*@>?;Z~E=>BB?>==>>?=?EDBA at PR:<<<F_E91==E^N?;=CGB===<<=>?A>=??>>>>@!

																																			
2@>?<js>>>B@====>??><>ABB?@@@==BUqZRD?BEIFCBCDCB>==<<===@?=>>>>>>@-
																																		
8???>mf=>>B?====>?>>FRZXTOG>ERSX_ad\X`I=?FHKNV`O?==<<<==??=>>?>>>?4
+	
+																													
+

=????j\=>?B>>>>=<=BNXXU[TJRMFWOD2"211DEBQTSTORXWRLC<;<==>@>>??>>>>:
	
+																																		

???>@m]=?@B?>>>AGOX[^[LVODIWQR$

+


2AJKONJQTS`m\TB9<=>A>>>?>>>>=


+																																							
+
"@??>?oj?@@A>=CP__[Z_gaKFNNX]^:
	
+

+	);GHJFLPWf`sxuzlR;<=@?>??>>>>?


																																								
&@??>>m�M?A?A`l{y_]chqm\NYUZ[a.




+
UWMDCDPSdx{��sbcwV;=@?>??>>>>@"

																																									
)@???>i�lE?AkkQg�raY_inkfgLJ[W1




+XN=@MSb^dssuvlYOXpC<?@>>@>>>>@#

																																									
+
*@????_w_OewRLSlzdPOWc`dj_MXS@	
+
+	!WXIIc]T`XY[acWaVKhY;?@>?@?>>>@%

																																							
+
+
*@>>??P�xwsueORZezlMFMI?EVZKTVK*
!4TVSXPE=ACFJNI?^jQVi>?A??@?>>>A&																																									
+

(A??@ABl��zbXMQdok]KEG??BDHILYK=;;:;<KQECI><>>=>?===JkdQjO>A@@@??>>A&

+
+																																					
+
+

%@>?@BBH_ga]cgbmg[QJF@@DB>A@?JKFHICGOMF*4H?=>>?>==>?=Qs`ac>AA@?@;<>A$

+
+																																			
+
+
+

%@?@@BCA at AAADMbtaMHC?LOE@@@>>GGGHIHHHEG;=KD=?>>>>>>?>>bxnn@@A at A@=<>@#

+
+																																						
+

'A?@@?CA><=?A>@TlYLILWKEB at ACDGAGJILMKDDGEFJ??@>>?????>@X`uO>B@@@?>>@&

+																																							
+


%@?@A>A@><<=>?>Hg\geTICFABECCAGKFABBFNLFA at 2&4IA=>?????=DC8j at AA@@?>>@(

+
+																																				
+
+

"@??@A@??NVSOJHSnv[L<19HHMIIFKH>>>??>@INHF+,N????>>>=HJM^>A@@??>@%

+
+																																					
+
+

"@??@@A=G~���ub]wO FNR`ddTK[]D>??????><I\MB:GG????B?=GWK�G?AA<;?@!

+
+
+																																								
+
+
$A?@@AA=Ca�����e>I�����gLK\J>?@@@??????TMQQ_vecB?>AC@?IN,^][?AA?=?@-

+
+
+																																						
+
+
+
.A at AABB@@BJ\b\GD

pak����eWF>?????>????>?Upfp���mIEEACBSP?6!VEAA????;
	
+
+																																						
+
+
+
;AABAAB at BCBCEMG:F�Yu���kP?>@??????>?>>??@Uly����QIULOQ^ZD73SM?A?>???+
	
+																																								
+
+
<BCABAA?W]\egnf*"DdeQ\gN>?@@@@@????>>>????=?L^j{��`bMFa]GDM,(S?A??@@?:
+
+																																							
+
+
+
#419BBA at b�{iJZtd_`R�}{O<??????????????@@@@?>@\ky���yKLjUCIA<=pB@??@=?@$

+																																								
+

+

-CB at V��lM54j��{w���J=>?>??>>??????????????Hm�����H;^TMUG8=�S??>@;9B)
+
+																																				
+
+

	0CAF}��eN+
L����|YB>????????@@??@?@???@??@@@Kv��]=6BPQ\I9Hjn???@:!0


+																																						
+

54
:C at U��w[?%W{��c@<>??????????????@@???@??@@?>Fty<=H>F>IGBF>jG>>A;


+																																			
+	
+
+
6AA;5 at B?b�uf^O2R\[_K>>>?>?@?@@@>?????@????@?????????KXLA<MPSK4*4T=>@@%	
+
+
+																																						
&A>=@AA at AtveM^maWK?<=???>??????@??@??????????>??????>=CWL;FI``=$+Rg:>@A?"

+
+
+																																					
3@=;>>??H�|m4KPCK>??>???>??????@@????>?????>?>??????>>>DU at 7IVYS=W�x<?@?A<


+
+
+																																			
+6@==>??>Q��k?:&D@???>>>??????????????>?????>>??>?????>??G^G7A at 6Z��z?@87?A




+																																				
+/A>>36?=U��R>HLA?????>>>???>?????@?????????>>??>?????????QY4)O{���t>?7:??

																		
+																	

<??8:>;R�a&0 at G??>???>>>????>?????????>??>>>??>>??????@@@A_D9t��`<><>@5

+
+																																			
+
#>@<<>;K�TEC@?????>?>>>????????????????>>?>>>?????????@?MW#X{�wG==<>@

+																																			
+
+

3@<=>=B�}`TAA?????>??>>???>???>???@???>>>>>>????????????@]/
E{�]==><?:

+																																		
+
+

5:?=>>><wqVGAA????????>>>???>>?????>???>>>>>>>???????????>R9E}�f<>?=>=69
+																																	
+
+


<?>=???;c{VPAB?????>>??>>???>>?????>>???>>>>>>>???????>>??HA	=�tV=??><?@3

+
+															
+																	
+

"1*;@>?=L�wpNA@???????>>???>>>?????>>??>>>>>>>???????>???@AK6l�sF=??@422

																	
+																		
+

9@?>?=z�_gE@????????>?>>?>>?????>??>>>?>>>>???????????@A`^h�z?>??A-
+
+																		
+															
+	



2A???<X�\a\@??@????>>?>>?????????>?>?>>>???????????????MeXx�m<?>?A,
+

																	
+
+																
+
+



$A??>>@z�ytJ@?@@@??>>??>>?>?????????>??>??????????@?@@Bgn{��S>@>?B%


																																			
+	
+

;@?>><V�laA@@@?????>?>?>??>?>??????>?>>?????????@?@@Vnu���B????@



+
+																	
+																	
+


(B?>>>@uetxQ?@@???????>?>>>>??????>???>????????@@@@?Opom{�W<>>?A9
+
+
+														
+
+
+																
+	
+
+
:@>>>;Nt~ssN?@@@??????>>>??????>????????????@@?@@@Hhnzxks?>>??B(


+	
+
+														
+
+															
+
+
+
+	"A?>?>?v�xgqN@@@??@???????????>>?>?????????@@@@@ABjurt�wL=>>?@<

+																
+	
+																
+
+
+	
2A>??=X��oqnM@@@@@@???????????>>>??????????@@@A at U�z���d?>>??A-


+
+
+													
+
+																		
+
+
+
=@??>Ay�~idiH@@@@@??????>????>>????????@?@@@@@Fmvx���F??>>@?

+
+
+												
+		
+	
+															
+
+
+



(A?@?=Q��r[f`D@@@@@?@???>>???>???????@??@@@@@A]k`t��e=???>A/

+
+				
+										
+
+																
+
+
+
+
+
5A?@?>j�waYdXBA@@@@?@???>>>?>????@?????@@@A at Ssco���F>???@=

+
+
+
+				
+			
+
+				
+	
+			
+
+								
+	
+
+
+
+


>@@A>D}�kaZdSBAA@@?????>>=>?@@??????@@@@A at Hnjf���Y=????A*

+
+
+
+				
+
+
+					
+	
+	
+													
+
+
+
+
+

)B@@@=M��n_]gXEABB@@@???DKJ?@???@@?@@@AAA at _ucu��m????>A8

+
+
+
+					
+
+
+
+
+
+
+	
+
+	
+
+
+					
+			
+
+
+
+
+
+
+
+
+4B@??=U��r_^mbJABAA@@K^gfQ>???@@@@@@AAA?Lpfh��uD????@>


+
+
+
+
+
+
+				
+
+
+		
+
+
+
+
+
+	
+			
+				
+
+
+
+
+
+
+
+
=@?@?>]��r]`ggTLNNOT^rniK>?@@@@@@@@AA at Cfqdw�wD>??>@@$


+
+
+
+
+
+
+			
+	
+
+
+		
+
+	
+
+			
+					
+
+
+
+
+
+
+
+
)A?@@?@d��p]fe_]affcdedfN???@AA@?@@AA?Rsgp��K>??>@@'

+
+
+
+
+	
+					
+
+
+
+
+	
+	
+
+								
+
+
+
+
+
+
+
+
+
+
7A??@>Bd��rdfcWZf\STUW`SD?>@A@@??>?@Nhns��Y>???@>$

+
+
+	
+
+
+
+
+			
+
+
+
+	
+
+
+
+	
+				
+		
+
+
+
+		
+
+
+
+


=@?@??B`��}kh^Z[QRSUW\]TJB@??@CGIKYpq|��e????A< 

+
+
+
+	
+
+						
+
+
+
+
+
+	
+							
+
+
+
+
+	
+
+
+
+
+
+

!>@??@?BZ���la]ZWTSYVU\g`TKHFKTamorz���a@??@B7


+
+
+					
+						
+
+
+
+		
+						
+
+
+
+
+
+
+
+
+
+
+
+
+
!=A?@@@ARv��qdca_`aWPKZki`^Z\bior��~P>@@@B2



+
+		
+		
+		
+	
+			
+
+
+
+							
+
+	
+		
+
+
+
+
+
+
+

=A??@@@Km����yyne`[SZbeeadchr{���gD=??A at +
+
+
+
+										
+
+			
+
+
+		
+	
+
+	
+
+	
+	
+
+		
+
+
+

=A??@@?B[�������|smkjhjjt����mK>>??A<$

+
+
+
+
+
+				
+			
+
+
+			
+
+		
+
+	
+
+				
+	
+		
+
+


<A??@@?>EZs����������������jL>>>>?A5

+
+
+
+
+	
+
+				
+			
+	
+	
+	
+	
+		
+			
+
+						
+
+



5AA@??A?=?FPbw������}sgYMC=>?>>@?+


+
+
+
+
+
+								
+
+	
+	
+
+
+
+	
+			
+
+							
+
+
+





$7 at A@????>>>?CFFGEC@?>==>??>@A6


+
+
+
+
+
+
+									
+		
+
+		
+
+
+
+		
+
+							
+
+
+
+


+


 2>@????>??>>?AA@?>>>>?@A at 8&




+
+
+
+
+					
+				
+		
+	
+		
+
+		
+
+							
+
+
+	
+
+
+
+



,9>?@?@AAA<-'4?@@@@>:0"




+
+
+
+	
+
+											
+
+
+	
+
+
+
+
+			
+										
+

+





!!"'++&!),*%





+


+
+
+				
+								
+			
+
+
+								
+						
+
+
+
+
+
+






)M




+

+
+
+
+	
+				
+								
+	
+		
+
+	
+					
+
+
+
+
+
+					
+
+
+


&








+
+													
+				
+
+	
+
+
+				
+




+							
+
+
+
+
+
+










+
+








+
+
+
+
+
+														
+		
+	
+
+	
+		
+


+					
+
+
+	
+
+	
+
+
+
+
+
+
+




+
+
+	

+
+

+
+
+
+		
+	
+
+													
+	
+	
+			
+

+
+					
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+																		
+			
+


+
+
+
+
+
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+								
+
+
+																			
+



+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+
+	
+
+										
+
+
+
+								
+				
+
+




+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+									
+
+
+
+
+
+						
+		
+	



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+					
+						
+
+	
+
+	
+		
+
+
+		
+
+
+
+
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+									
+			
+
+
+
+
+
+
+
+
+
+		
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+	
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+		
+
+
+
+
+
+
+				
+
+			
+
+
+		


+


+
+


	


+
+


+	
+



	

+

+	
+





		
+

	

+
+
+	





		
		

+	
+
+& 

		

+
+

		
+
+


/:<:1

	




	
+



+
			


2=<<<=7 



+





+



	

+
		
+

+,=====<=3





	
+

	
+




+	


+	

9<<====<;"
+


	

		

+
+
	
+
+	
++=;=9=79<=/
+

+
	


+
+

		
	8<<<9>97<<:





+

+	
+
+



)=;<;;><7;;=(

+

+

+	

		

+	
+		
+	
	

	:=;<;<><7;;=8


	


+
+	
+
+
+

+	
+	




	2=<;<<=><7;:;>+




		
				
+
	
+


	'><@D===>=9;D@<;



+			

+


+	'<=<KF:6=><9;HM<>6
+


+			
+			
+
+
+

)7>=<>L="(><=77BP><>4

+

		

+
+
!*3;?@?>=<EK%.A@=6$8NA;<>=4(



+	

+7=?@@?>>>>=?X@!+=HF=6!.KJ;<<=?A?90&
	


		
+

			
+
#6>??>>?>===>DMcj6/>>D@>/!*Ie?<>>>????><6)
		


			
2>>==>>>>=<@GKM?6W9:?>@>;$'.H~pUF@>=>>>===>8'	
+
+
+	

	


8?=====<=<>EC0
	7>==;@=0.20G_HAHLKID?<;<<==>1	


+				
+



+	
:>;>=====FPJHN>	+><<9A:-84.MT
#AimfR?;<==>4		
	
										
+



+
+9A====;GcnptfJ 
+	
'D=;;8 at 65<6/@G
+	
+4u~qeH;<=<>5

+		

														
+


+

8<<==<T{}zxlS4
	
+		,AE=;;9?6=@91;=#
+
+
+VsgcgQ=<<<?3
	

+														
+
+
+

		:><<<<\zglP-*!	
+
+	
6A@;<;;<:?@<4=>
+
+
+
GXqibn`?;<<>)

		
+																	
+
+
	
5><<;=bvTQ:	
+
+
+
+
+0YB;=>C<><@?5DE#	
+	9 at Xjc]lh?;<=;

+																					
+

+	
*?==;;auVHI				
+	
+
+	
F=<?CK<?<AA8=E<8	

*9YfWNlb;<==;D
																	
+
	
+
<>==:Zu]JM0			
+
+		
+
+	
2<<?CJ=@?BB:;@<>2
		%CaRN`{P:=>@.
	
+															
+

/?==;JwbSUp?
+		
+			
+5<<@AC<AEEA<<=<>7				
>cRNZjm?<=>4
	

+														
		
=>=<;gmcg``_-
+
+
+
+
+
+
+		<<;?B>;?FD at 9;;:6

+
+			Gsjc_WsT;>=@*	
+
+
+												
+	

.@==;FmcdF;:@P'	
+
+
+
+
+
+	!><;=@=;=CA?:>2		
+
+
+
+ZgMJ`tuq==>?:
+
+
+																
+
:>==;TmjH;==;GF

+
+
+
+
+
+
+	$=<;<>=><B@>7<7	
+
+
+
+
+4ZB===f�}K<>>@%
	
+														
+
+
!?===;`s\<===<>D	
+
+
+
+

+
.=;;<=<F<A=<4<0	
+
+
+
+
+		>D;=>=At~[<>>@2
+
+																			


+?===?iiL<===<<A(
+
+
+
+
+
+';<;=><H=?<2-;)
				
+		
;=<<>=;P}f=>>?;

																				

4?>=<Gs]?==?=<<>=
+
+
+
+
+
+
1=;>?<E=>>1*<

+			
+
+?;;<=>==ip>>>>@!

																				


:?>=:YnG<>>@?><<?5		
+
+	'><@==B==?8/<					<=;;<>>=;SnA>>>@)

+																								



?>>>>mc>=>@AA?<<=?>,4D??;>A>=?>9? 
	


+
+5?;;;>@?=<ChE=>>@3
																														


&@>>=GxY==?BBA>===>AL at 7:;;:DB>=;?A>==?>GD2,..-/=A<<<<=AA?=<ZN=>>?;

																																					

0@>?=M|O<=@B?>>=>>?>@EEC@@MK<><<?E>67><KZ?<9:@LF==<<==>AA=<FO>>>>?


																																				

7@>?>Nf?==@A=====>?>>?CDACGF?:;=EU>56<?GQHBBDE@=>=<<=<<?B>=?J@>>>@'
																																						
<?>??EI==>@@=>>>>>>?>?JWZSD?H<<@[vXKIKG==GIIMOE==>=<<<<>A>==GB>>>@0

+
+																																				

????>AC>=>A?>>>>>>??@FLPZMMIIHP^b_icaZD?MPRVPXTH?==<==<=@?=>DB>?>?6
+
+																																						
"@??>=BC>>>A?>?>=>>?ACGKS\QEOY^WP6%>JLJDKRHJSS\UZSGB>:<<=?@=>@@>?>?;
		
+																																				
+
'A>?>=DH>>?A==?>=?CDCBIVUSZVQd^?(%ERROJEAPa_]_ckjgQ=;<?@=>>?>?>>=


+
+																																							

+@>>><F`L>??GX[XVLIIIJRcUZMOQ\G 
+
5WZZI=;L_]XZm��|xgA;=@>>>?>?>>?


	
+
+																																				

.@>>=<QwrgXd�sev}pZRTSYc\iGFSSK		
+
+
XXRDJI_[\ao{yoUPmb;=A?>??>>>>? 

																																										
0@>>==Vy_x��rZ[avl_[SMcuq\QYQS"		
+&^ZPDUYb_jtwwchXMOoH<@?=>@>>>>@"

																																					
+
1@>>>>JrZ`jf\VZ[`}ubfR at OqpTJLIU:
+
2ZUTUXSFE^lmnf\aMFc_<@?=?@>>>?@$

																																									
+

/@???AAVgggdd`_WWu{feaH]iWC?BOMLJ;39;IPPK\\I@?EP`TCIjYGOoF?@=@@?>>?@#

+
+																																									
+

-@>@@ACBHMQRUcpiap}tfbd`RLC>EPGGKQOPNFH:4FC??>=>?<=@WoYGg\<?>@@?9=?@"

+
+																																				
+
+


.A>@@ABAL\`ZUMQdhgxrSXYWPA>>BIDFEDEDDCG6&@G@?=>==>>=@[o^mt?>?AA=;>?@ 

+
+																																							
+
+
+

/A?@@@B at D\jgf\LDZ_vy]HKP?<>CCJ at DHHIJGCCD?@G<?D==>?>>=A\c;|aA at AA??>>@

+
+																																								
+


-A?@A=?BACHMOLF>Pq|tOE>?=@GJGB?JOIHLQKFEDD+CF<=>>=@ER],TuX@@A@?>=?!

+																																						
+

+A??@ABAAB@?>>?>Pyo<&BE>FLGGCEOH?=>>AMRPFE
+
+UF=>?GLLRk\SoyA@@@??>=

+
+																																								
+

.@??@@A@>Nll_MDJX`/.HQ^^RLUULB>????>>?OYZ2
3KMB>@ILQYrM;u�L?AA<:?:

+
+																																				
+
+
0BAAABA??Bc��vkXF
`s���mUNbO>?@@@????>@UO\Vc|�^GCI>MYf7!N~^>BA?>??"

+		
+																																						
+
+
+

#@BBBBA>:0,/%
j�}���tW_P@?@@@???>>>=B^il�����_KUZ\d^B6HOq at AA???@5
	
+
+																																						
+
+
+
&@BCBBB?7'
+
Gxm����p]F?@@@@??>?>>=>=Dc����mumYKSH^@FBEt|EA@>?@@?!

																																									
+
+
+
,BBBAAAA@:47BYY)Pv����X???@@???>>>>????@?>HSMY^b��H,L;5>;LxZ at A?@@?@2

+
+																																							
+
+
+

8ABAAA?I^lvtum[?a|���f=?@???????????@@@A@?=<<=F|}k})
ME544-WuB@?@;7?;

+
+																																						
+
+

	(?BAA at p�yYPgkx�����wA>????????@@@@@@@@@@?>=Et�����H*FF8=24rQ??@??=8

																																							
+

>BA@`��bG19\����}\A>????@?@?@@??@@@@@@@@???Mn���fU",AOPBE>-b@?@AB4

+																																					
+
	@BAE~�uTO4G[x�|Q?<>>?@@@@@@??????@@@@@@???@?>X~�]PA%/8BCE1&eI>AAB1



+
+																																				
+
+
*;:')AB at U�dXS`LcbicE=???>?@@@@@???????@@??@????@@@>GX_YD;GLMF,6%MW;@AB8


+
+																																						
&???@?AA?m�iYNbcaK?=>????>???@@@@@?????@????>>??@???=<>MN2AHVRFA=hb9>@AA*


+
+
+																																					
7@<<>?@?D�r^YMDCE>??>????>??@??@????????????>????@?>>?>=HM,:4-?Wo�g;???A>


+	
+
+																																	
<?<<>>>>M�lGB./C??????????>?????@??????????>>??>???>>>??>N@,/3 at m�d;?=<?A&


+	
+																																
+8@=>5<?=Q�k4
LH???????????>?>?????????????>>>??>?????????@O$Fk]n�\=?/8?A$



+																																			
)@?=3;>;Q�B HA???>?????????>>????????????>>??>>????>????>K6&4l��M>>4=?<


																																				
+
1?>;==:O�R
8CA?????????>>??>>???????????>>??>>?>>??>>>??>DJ!
M�vA>=9>@(
+
+																																			
+	

%>?<>>=H�wZTAA??????????>>??>>????@???>>>>>>>>?>>??>>>>???R-
]{L<>>;@;

+																																		
+
+


;>>=??>>l\R at B???>?????>>>??>>?????>???>?>>>>>>???>?>?>>?>E,(�pE<>?<?9&-

+
+																																	
+
+

8><>??@<i|NYGA?@?????>?>?>??>>>????>>???>>>>>>>????>>>?>>>B=
+)�xA>??>=>?8
+
+
+																																
+


'$=???=M�qveH?@??????????>?>>>?????>??>>>>>>>????>?>>????@K6V��@>?@@6;;$


+	
+														
+																	
+
+


=?>?>=o�dnaA????@??????>?>>??????>>?>>>>>>?????>>>?????@]dn�o<>>?B)

	
+																																		



6@??>=J�eXuM>@@@@????>?>>?>>>????????>>?>>??>??>>???@?>Qrd��W<?>?B(	


+		
+													
+
+																	
+



&A?>=>>h�qza@@@@@?????>>>>>>>???>???>?>>>>?????>???@@@Lqz���E>>>?B!


																	
+																	
+
+
+

;@>=>?G��irJ?@@@??@?????>>>>???>???>?>???????????@@@Clwz��m<>>>??



+												
+					
+															
+
+
+


'B>=>?=bhpu`A@@@@?@????????????>>?>??????????????@@?Z~�lr�M<=>?A6
+
+
+														
+
+																		
+
+
+

9@=>>>Cx�ckaA?@@@@@@@?????>>???>>>?????????????@@?Qz�wke<=>??A%

	
+
+
+													
+
+
+															
+
+
+
+	

!@>>>><e�vXodC?@@@??@@?@???>>??>>??????????@???@?Kwzkx�{B=>>?@;

+	
+
+
+												
+	
+															
+	
+
+	
+1A>>>=D��^TkgC@@@@??@?????>>?@>>?????????@??@@@Dioiq��\=>>>?B*

+
		
+
+
+										
+
+																	
+
+
+
+
+<@??>;[�taYmbC@@@?@?@?????>??>>??@??????@@@@@@`o[t��x@>?>>@>
+
+													
+	
+
+	
+															
+	
+
+


$A?@?>?y�reWldF at A@@@??????>>???????????@AAAA?Qm[d���Q=???>A-

+
+
+											
+
+	
+
+							
+
+			
+			
+
+
+
+
+
2A?@@=M��l`^n\D@@@@@??@??>=>>??????@@@@AAA at Ik`[v��j>>??>?=
+
+	
+							
+
+	
+
+
+
+		
+
+
+		
+
+				
+			
+
+
+
+
+
+

=A?A@=Y�}i]^iZF@?@@????>=LZB>?@@@@@@@@@@?CfkYl��}D=>???A*

+
+
+
+							
+	
+
+		
+
+
+
+		
+					
+	
+		
+
+
+
+
+
+
$A@@A@=]��p^[d^LC????AFNastN@@@@@@@?@@@?@]saf{��Q=>???A7


+
+
+
+
+						
+
+	
+
+
+	
+			
+					
+				
+
+
+
+
+
+
+
+.B@@@??d��y\]eeZSMLR`ovqflUI@???????@??Ouk^r��V>???>@=

+
+
+
+
+
+
+						
+	
+
+
+
+
+
+						
+				
+
+
+
+
+
+
+
+
7A@@@>@a��w`]fljghhhe_\\eUME@>?>>????Ffr`l��a=????@?!


+
+
+
+
+
+
+
+						
+	
+
+
+	
+
+
+		
+			
+	
+
+
+
+
+
+
+
+
+?@?@@>AY�wa^bb][ZWY]\Zb^VKA??@EFB at D[rgk��pA?@?>A="

+
+
+
+
+
+
+
+
+				
+
+
+	
+
+	
+
+		
+					
+
+
+
+
+
+	
+
+
+
/A??@@?ARu��l`[]ZW[VW\WX^^TGBBJX\UQ]ikv��vD?@??A;

+
+
+
+	
+
+
+
+
+
+				
+
+
+
+
+
+	
+		
+		
+
+
+
+
+
+
+	
+
+
+
+

8A?@@@@@Lj��va]]Z\TYUOO^hcWQQ_kmoklr|��sE?@??B8
+
+	
+
+		
+
+
+
+			
+
+
+
+
+
+	
+			
+		
+
+
+
+
+
+
+	
+
+
+
+
+

:A?@@@@@G`��yjg`b__WNQY_hehfhkdhkw���gA?@?@B1
+
+
+		
+				
+
+
+			
+	
+
+		
+	
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
8A@@@@A at CXz���vywb^ZWUZ``gieeeq����Y??@@AA+

+
+
+
+		
+
+				
+
+
+			
+
+
+
+				
+	
+
+
+
+
+
+
+
+
+
+	
+

5B@@@@@@AY������{rj_Z^bedlx~����hI>@@@B>%

+
+
+
+
+		
+
+				
+
+
+			
+
+
+	
+		
+
+
+
+
+
+
+	
+
+
+	
+
+

+2B@@@@@ABPj�����������������sN>>??@B7


+
+
+
+
+
+
+		
+					
+
+
+		
+
+
+
+
+
+
+
+
+
+			
+
+			
+
+

.AA?@@AA?AK\p������������wcL@>???@A/


+
+
+
+	
+
+
+		
+				
+		
+	
+	
+
+	
+
+
+	
+		
+						
+
+


%;A@?@@@@>>@HVjy}{vsi[MD?=?????A<%


+
+
+
+
+
+	
+
+			
+			
+
+
+
+
+		
+
+
+
+
+
+	
+							
+
+
+
+



,=AA??@???>==>@?>?>>==>????A?0




+
+
+
+
+	
+						
+
+			
+
+
+		
+
+
+	
+								
+
+
+
+
+
+




*9 at A???>>>=?@@@@>==>>?@A>4!


+
+
+
+
+
+
+	
+							
+		
+	
+		
+
+	
+
+						
+
+
+
+
+
+
+
+
+
+


#3;>@@@@?=1
$5=?@@?=7,




+
+
+
+
+				
+							
+		
+	
+
+
+
+								
+
+
+		
+
+
+
+
+



 "#$#
%0,
#&$!






+
+
+
+
+
+									
+		
+		
+
+	
+
+			
+		
+				
+
+
+
+
+
+
+




4JK







+
+
+
+
+
+
+
+										
+	
+
+
+
+
+
+	
+
+						
+
+



+
+
+
+
+
+
+
+
  








+
+
+	
+										
+	
+				
+	
+
+							
+
+



+
+	
+
+
+
+
+
+
+
+
+
+







+





+



+

+
+
+
+															
+	
+
+	
+	
+
+	
+		
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+




+
		
+
+
+

+
+
+
+
+
+
+																	
+
+	
+				
+
+


+
+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+
+
+
+																			
+	
+
+		
+



+
+	
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+							
+
+
+																			
+
+
+



+		
+		
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+			
+						
+
+
+									
+			
+		
+





+
+		
+
+
+
+
+
+
+
+
+
+
+				
+
+	
+		
+
+						
+
+
+
+					
+
+
+	
+	
+




+
+





+
+
+
+							
+
+
+		
+
+
+					
+
+
+
+
+		
+		
+
+		



+		
+
+
+
+				
+
+
+
+
+
+			
+
+
+		
+
+
+
+					
+
+
+
+
+	
+
+
+								
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+		
+	
+
+
+
+
+				
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+	
+
+
+
+
+		
+



+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+	
+
+
+
+

+
+
+	
+
+	
+

			
+			


+		




+
+




	
+		
+

+		

+

+

+
		


+







+
			

+
+	
+*7:9.

+	




+
+
			


+


+1<=<==4

+

+


+


	

+		
+	
+

+=<<<<<=1


+	

+
+	


+


	
	
+
	
9<<===<;;!
+
+
+	
		


+


	


+
	
+)=;<===<9<-


	
+


		



5<;=<=;<;;6




+



+

		
+	
	
	
<;<<<><<<:<






	

+

+
+

+
/=;<<<>;9<;=-





	



+					

		


+
+
<=<;<<=<;<;=:	



+
			


+	


	
+			
	
+

+
+4><<=<==<<<;<=.
	
	
+


			

	




	
++><=>=;=><<<><==	
+
+
+



+



+*==<CA72>><<=DC<>8	
+



+			
+


!,8>=<=I;
(>>=3-?M<<>7

+	
+

			
+
+	
+		
#-6;>@@?>=<FI2%===/(6M><=?>7,!


+
$3=@@??>>>??=>TA3"4>>9/:;LF<<=>?@@=6,!
+
					
+
		
+


+&9???>>>==<>=?E_f>60<?>71<;L_><=>>>>???>8,

+

		

3?>==>>>>;<=BNTKMb@:9<>=21;;P}dNA>>>>>>>==>;)	
		
+

+		


	
+
!)&7?=>=>>>>==>FE1

CB<:=>;.5:=OB7DOLF@===<<<==>3	

	
+							


+	6K>>===>>>=;;<F7	'A<<=@9-8:?V1&>QOEKI=9===>8
+
	
												
+
+

+

,><====<=>CMZP?		CG:<>E7/78B[H	
+XovsoU<<==>8

																	
+

+	
#;<<==<@R]ac`O.	
+	 @ZH:;=C4266FF?

+
+	
2[vqfvh?:<=>6

+


+																		
+


+

<=<<<<Pkw�S"
	
+
+	
8?D>;:AB4:94>A?!
+
+
+	:M_`Ljk?;==?.


	
+															
+
+
8><<;=_u]]O				
+		?JD<;:IC:?;56CB(	
+
+
+
TXKmk><<=<

	

+																
+

+-?==;;]oTKM
+
+
+
+
+			
+4XD;;<H>=@=85FL=6	
+		+[MOt]:<==<D

+


+																				
+


+

=>==:WtYJT*
+
+	
+
+
+
+
+
+	=@;<<?<<AA=8GD<@3	
+
+	=RJ`xD;==?1
+

+																					
3?>=;HubS\r"
+
+
+
+
+
+
+
+
+	
4=;<<<<<BC>:E=<>3	
+
+		
6UFXpb><==7

+
+																							

+
+
 >>==;cj]d\YK!
+
+
+
+
+
+
+
+
+	><;<<==;@C?:?783
+
+
+
+
+
+Xnc[^uU;==@/


+
+																							
+	
2?==;ClbcE;:>D	

+
+
+
+
+
+	
?<;<=>>;?@>:=
	
+
+
+
+
+
2[FG^rss@=>>= 
																					
+
+
=>==;MlhK;=<;A=
+
+
+

+
+
+<<;<=>>:??=;;
	
+
+
+
+
+	R><<<b~}O<=>@-

+																													
+

%?===;Xo]====<>F	
+
+
+
+

+	;;<==>@:>?<;=

	
+
+
+
+
+
+	7J<<=<>j|\;==?7

																											

0?>>==dmK<====<A)
+
+
+
+

+	9<<===@;=>=<<
+
+
+
+
+
+
+	
==<<==;Ovg===>=


+																										
+

7?>>=Erd?==>=<<?:	
+
+
+
+
+
+8=<==<?<=><7;	
+
+
+
+
+
+B<<<=>=AjnA=>>?%

																											


<?>>;UxL<==@?>==@2					
5<<===?==?;4:		
+
+	:><<=>>=<XqE=>>@-


																											

!?>>>=dg=<=@BB?<==A:'
;8;>=?A><>=4?


+	
+	<?<==@@?=<DmJ<==?3

																																		

*@>>>@fT<=>BBB><=>>@H at 7:<;=D>>=<@@?;=?;A>41+)*0BB===<?AA><<_Z;==?9

																																		

4@>?>A]K<<>B@?>=>>?>>DDA@@TO<>=<@A?<>?<FL9879 at KD=====>?B?==Ji?==>=

	
+																																	

;?>??@E>==>A>=>=>>?>>>CCDHIXD=<:BH>4;>CLRF?>FHA>>======A@==?iH=>>?!

+																																							

???>??>>==?A>>>>>>>??>=AO]MWJ89:HY at 4:>LA?OPLH?=>>>=====?A>==bR<>>@+

+																																									
"@????>?>==@@>>>>????????CUW_V;<DWdQFCNVHNLM[]L@>>>>====>A>=<]U=?>@3
+
+	
+																																						
)@>??>>?>>>@@>??>?@??????NYDRiEC\fagUMQPPPKMUY]RC=====>=>@>==UR=??@8
	
+
+																																					
+/@>>>>>>>>>A@???????@??AOZUQTfUUbVE]^\[TKQJFXkdaUHFEB=<==@?>=SM=?>?<

+																																									
+
3@>>>>>>==>ABBB?>>????>Ic`\\XY]WP;4BNYYVOVPMXl`_`bgjncH;=??=?\I=???>
		
+
+																																						
6?>>==>NV\cb]XTQHB@??>?\ro][X[bT;.%32IYPFOZZ^gaad|�~tjqJ;>?=D`D>????


+
+
+
+																																						
7?>>=<Bhim}{nechfUKB?>Bocg_\[XWU.'(LXDAD\`kMbfo�mZUM\kA>?<NWA>>???



+
+																																								
8?>>>>BaffopjfjorqhXH=F^[VZ`QMUZ:
$PQPJF]Y\>Xi}}c_QNPk]<??UM@?>??@!


+
+																																						
+
8?>>??AL]be]V\jtsxcfda`QHIJ at MWSS<09GJNGDEahYFTf~zceYKGZyL=EWEA??>?@"


+
+
+																																								
+
6@>??@BNWZ_VLIZomw�svsTDBUG>CSQIORPOMBJE>?K``RLM[]P\nYEMlpIRW at A?>>?@!

+
+																																						
+

8@>??@AK\^]W^\PPbp�~ZC=BORF?HPFDJGEFC at J?1:FS`VC<?ABMiu\`k|lgU at A==?>?


+
+																																						
+
+

:@??@AAAPip`]biYTt�^>BHHDJFFI at BFFFHD?GD4*@RM\HDCDGK_t~og|�}P@@<?>>?


+
+																																								
+

9@??A?=ABOafa`bOEtxiQMF@?DKKGE>HSONSN?DLF:7>0F`RIKS[hfolf~��K?B@?>>?


+
+																																							
+
+

8@??@AABB@@BCFEA>MiXIN>=FHCLHCNYMCBEOYMNJI5048W]OO\kpknspv��K?A@@??8

+
+																																							
+
+

;@?@AABBBACHGB at BRhO<MBCPMFINJTOC=>???GLRSQ?)54:PTRceiqy�IN��M?BA?>@/


+
+
+																																							
+
+

=BBBAAAA@>Mmqnpi_J2[lsrbRLV]WG>??????>=BZUa^[`twc4Hiv}jcD:�R?BA@?@7


+
+																																						
+
+
+
+
,:9785.($


%0#L���qpZUe[D>?@@???>>??Prkz�����J=kqt^RKs�]?BA@@@@'


+
+																																				
+
+
+
%48::3"

+		(m���u}fSG?????????>>>?>Oy����U]z5+[Ahf}YDpnABA at AA@9

+	
+
+																																					
+
+


6ABBBC>,.FB/-n����YB?>????>>????????>Ce��~Zn|P(J<@LgG);�LA at ABAA@%	
+
+																																						
+
+


2CCAABA?ATsqb�sWf����`:=>???????@??@@@@@@?>Kg`\pDX^C HJSJ.<xdA at B<,5A-
+	
+																																						
+
+

	<CBAA>X��chZYa{����yD=>>??????@@@@@@@@@@@><T���P��p7XVQ3<]wG at A,/5
																																								



+
.CBB at M��aISZ\x���zX@>??@@@@@@@@??@@@@@@@@@??f��~��q-Z_ZE3EcZ?@))?<

+
+
+																																	

+	*CBBAu�~C^ZJSh�rS@>???@@@@@@@@@???@@@@@@@@@@>Jm���d(4GK=77SoB at 67BB"


+
+																																					
+

*$*BA?Q}ehGRIQ[jT@>?@@?@@@@@@@@????@@@?@@@@??@?>?N`p\J.68N24AsH;@@AA0

+
+																																						
#<@?8:A@?qY7A]CQRC=?????????@@@@@?????@@?@@???@???>=<?HURFDIX>+
jO:@@@A<
+
+																																						
9@==?@@?E�^:YJKjK????????????????@???????@@?>?????>>>>>=@SC41<3HX�Q=??>?A&

+																																			
+?><<>>>>O�B<F9JH????@?@@@??????@??????????????????>>>>??>@N(04-
9�N<?@>=A.



+
+																												
=?==8>>;Zn)=,KD????????@??>???????@?????@????>????>>>????>E9">L0O�K=?6<>A,



+																																	
2@><.=>:`t,
GA?????@?@@?>>>??????????????>??>??>>>>>>????@@
4g��F?<)=?? 


																																				
+
:@=:>>:]�m(9BA?????@????>>>????????????????>>??>>>>>?>???>L!
M�v??<3?A1

+																																					
9?>>?><P�uocAB@?????????>>>>???@@??>???>??>>?>>>?>>>?????>E1

n�V<?>:@=	
+																																		
+
+

 >?>??>>@�mT_G@?@@?@@?????>>>????????>????>>>?>>?>>>>>?????A:&��C<>><@9

+
+																
+																


0<7?>?@;l�U]fL?@@@@@@?????>???>???>>>???>>??>>???>??>??????C
.|><>?=>>=7
+
+
+																																
+


 ????=M�wh~mB@@@@?@?????>>>????@?>???>??>?>????>>?>??????F-P�u<>?@?:>?-
+
+
+													
+
+																	
+	


+???>>>f�xiqN>@@@@@@???>?>?>>>???>???????>>?????>>??????DeOl�X:>>?A*%'

	
+
+
+										
+
+
+	
+																	



9@>>>>D��dte>AA@@@@@@????>>>>???>?????>>>>?????????@@??cwZy�C<=>>A#
+


+															
+
+	
+														
+
+	


)A>>=??\��}pH@@@@@A@@????>>>>?@?>?????>>>>???????@?@@?V}{�v<>=>?A


+				
+											
+
+	
+														
+
+	
+
;@=>>?By�hy_>@@@@@@@@???????>??>???????>??????>?@@@?Fqw{��Y;>>>@>


						
+
+							
+
+		
+															
+
+
+

'A>==>=VunplM?@@@@@@@@??????>?????????>?????????@@@A`|�h{�B=>>?A3
+								
+
+
+						
+
+																
+
+
+
+
+7@=>>?>j�jZnG?@@@@@@?@??@?>>>???>?>????????????@@?Ymq�wuW<=>>?A#

+											
+					
+
+
+														
+
+
+
+	
@?>>><S�|P`lI>@@@?@????????>?@?>>????????????@@?SmTXy�d===>>@9



+											
+
+
+
+
+	
+																
+
+
+
+	.A>>>=>u�_O\mJ?@@@???????????@?>????@?????@?@??LpX^v�~F=>>??A(

+
+
+												
+
+
+
+			
+												
+
+
+
+
+
+
:A>??;K�~\SZoQ?@@@@?????@??>???????@???@@@@??Fpb^|��V>?>>>@<
+																
+
+	
+
+													
+	
+
+
+
+
 @???>;c�~n[bu]B@@@@?????@@>=>@?????@@??@@@@Fgk]r��m???>>>A+

+
+
+							
+				
+		
+								
+		
+				
+
+
+
+
+
.B?@@>@h��p_ctcF@@@@@@@@@?BWC?@????@@@@A@@Cck\kx��G=>??>@;
+
+
+
+								
+		
+	
+
+	
+
+					
+	
+
+
+
+	
+
+
+
+
+
+
+
;A?AA??_��ubdmfUGA????>>Dg�`A???@@@AAA@@F\eYcp��U;>??>?A'

+
+
+
+
+						
+	
+
+	
+
+	
+	
+	
+		
+					
+	
+
+
+
+
+
+
+
!@@@A@?@\��wcXanh]TQOQV^snfufOC@@@?@@AENdpZ`l}�a=>???>A4

+
+
+
+
+									
+
+
+
+
+	
+
+			
+		
+
+
+	
+	
+
+
+
+
+
+
+
*A@@@@>A^��bW[fnoqutpk^V[nseUMHHIKJJQduh_k}�p>=???>A;

+
+
+	
+
+
+									
+
+
+
+
+		
+		
+	
+		
+	
+
+
+
+
+
+
+
3B@@A;=BQv��g]]]`a]XWUWW\jlkbYUZd^VSXhi^o���F=????A=



+
+
+
+	
+
+					
+	
+
+
+
+
+	
+
+
+	
+
+
+				
+
+
+
+
+
+
+
+

=A@@@?AAIi��oc_Z[XTURYW\dhmaX[dlg`^efcp���M=@@??A;

+
+
+
+
+
+		
+
+							
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
(B@?AAAAADZ{�~k`][RW]`XTU_c`Zajnhiginz���O=@@??B7
+
+
+
+
+
+
+
+			
+	
+				
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

3B?@A@@AAAMk��wmdSS`_WPV\\aaceb`dds���{L>@@?@B3

+
+
+
+
+
+		
+
+	
+	
+		
+
+
+
+	
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

6B@@@@@AA at G`~��~wwe^[X[^[\`__ceo���mF>A@@@A,

+
+
+
+
+
+
+
+			
+	
+
+
+
+	
+
+		
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+
+4B@@@@@ABADXx����zlgdbaacgjoz����uXA?@@@A>&

+
+
+	
+		
+
+	
+	
+
+	
+
+
+
+
+
+
+
+
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+

/AA?@@@AA at EWn�����|ytwwz������^D>?@@@B:

+
+
+
+
+	
+
+	
+	
+
+	
+		
+
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+

'?A@@@AA@@BNby�������������~dJ?????@B5



+
+
+
+	
+
+
+
+			
+	
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+	
+
+
+
+

!;B@@@AA@@@AFTk�������}k]OD??????A@,



+
+
+
+
+
+	
+
+
+
+		
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+


0?A@?@A@@A@>?G[hig_PD>=??@??>@A9!


+

+
+
+	
+
+		
+	
+
+	
+
+	
+
+
+		
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+



0>A@@????@><;;;;<=>>???>?@A=,


+
+
+
+
+
+	
+	
+		
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+	
+
+		
+
+
+
+
+
+
+





0=A@?>>>?>??=>>==>???@@</


+
+
+
+
+
+
+							
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+




(5<>???=7&'5=??>=92&



+
+
+
+
+
+
+								
+
+	
+
+
+	
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+





! 
=?. "




+
+
+
+
+
+
+
+
+							
+
+
+	
+
+
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+


+



@L7







+
+	
+
+	
+
+	
+				
+			
+
+
+
+
+
+
+
+	
+				
+
+
+
+
+	
+
+


+
+
+
+
+







+
+
+
+			
+									
+
+	
+
+
+	
+
+	
+	
+
+
+
+	
+	
+
+



+
+
+
+
+
+
+






	



+
+
+
+
+
+
+
+
+						
+										
+
+	
+
+
+
+
+	
+
+		
+
+



+
+
+
+
+		
+	
+
+





+



+	
+
+
+
+
+
+		
+			
+																
+	
+		
+
+	
+	
+



+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+													
+	
+						
+	
+
+
+
+
+
+
+





+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																			
+
+	
+				
+
+
+
+
+
+




+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+
+
+			
+																
+
+		
+
+
+




+
+
+
+
+
+



+
+
+
+
+	
+
+
+
+
+
+		
+
+
+				
+												
+
+		
+












+
+
+
+
+
+
+	
+	
+
+		
+
+
+
+				
+		
+		
+			
+
+	


+																		
+
+
+
+		
+
+
+
+
+	
+	
+	
+		
+
+
+
+
+															
+			
+
+
+
+
+		
+
+
+
+
+
+
+
+
+	
+
+
+
+
+												
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+
+
+


+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+		
+




+


+
+

+		
+

+
+
+	
+
+
+
+


+	
	
+

			


		
+


+	
+	
+
+
+

+





					

+



	
+

	



+				
+

	#.0.$


	
+





		


+
+0<=<==2


+


+
+	
+	
+		

+

+
++==;:;<=0

	


+
+

	
+	



9<<<<<:;;"
	



+

	

+
+
+		*=;====<:=/
+
		
	
+	
+

+	

	6===<===;<8

	
+
+
+
+		
+	

	
+<<=<<===;:<



		

+	
+
+	
+
	

+	'><=;;>=<<9=%
+


+
+

+			
	
+
+	5=<=;;>;;<9<1
	

	

					
			

	
+	!=;<<:<><;;:;;
+



	




		
+			
+


	
+	6=;<<:==<<<<;=-
	
+

	

+
		

+


+

+
+	
+*=<<<=<=><:<<<=<
	
+


+



	
	

+)==<==35>>=47=<=>8
+



	

	

	


"+8>=<<B=
+>>=*)>A<=>7 
+		

+	

+			
!-6<>??@>==<DG>* <>82:@J===?>90&

+			

+
+			

+,:?@>??>>>>>==VC=2%;=49==SB=>>>?@@?;1%	
	
+

		

+
+		


,<?>>><====>>>?ThA=.0><4==:YW<>=>>>>>?@?:.





+		
+

+5?>>=>>>=;<==DOUkkA<+3?92>><ZwXF>>>>>>>>>=>;*
+

				





+">57>==>>>>>===>II.
#WE<08?64>=@bD at UTG?>>>>>====>5





							
+

	&I?====>>>>=<<>J4AJ=;<?58>>H].JOD>=<=<<==<>9
	

+

											
+

+)=<===>>>><>IOK6	RN<=<?6;>ANg,2HCLPMJ@;<<<>:
			
+															
+

+
$======<;>DJMH1
		
BGD=<=>69>BEF:
+

AfxwnhP:<<<>8
		


																			
+
+

	
 <><==<?I_nW0
	
+	:>;A><BE67<A?;? 
+
+
+
+!3Xuow_<<<=?0

+
																			
+

9>=<<;Idhoj							B;<A=;AE678?A<A-		
+
+
+
+D_Vvb;;<==#
+	
																			
+
/?==<;KlfPZ$
+
+
+					G?AA<;=?587<A;H?!	
+
+
+
+
+IRTxX9<=<?N
+																						
+
 >>==;GnbLT2	
+
+
+
+
+
+
+		&FI?<;>>8;89@<F@:!
+
+
+
+	
+
+WK`xH:==?5
	

+																							
+
6?==<>fjSWq%	
+
+			
+
+
+EG<<;??;<88=D@;8
+
+
+
+
+
+
+\TSmm@<<<8


+																							
		$?>==;Ll[d]TG!	
+
+
+	
+
+
+	5HA;;:=?;;76>G1&

	
+
+
+
+
+
+0lm_bt[;==?3



+																						
+	
5?>=<<`eeK;:=C	
+
+
+
+
+
+	/C>;;:9>;;75@<			
+
+
+
+
+
	#ICC_totB<=>>#

+																														
+

>>==<AjhU;=<<?>	
+
+
+
+
+
+==;;;;><<65?5	
+
+
+
+
+
+	E=;<<\syQ;==?1

+																													
+
(?>==<KlfB===<<F!
+
+
+
+
+		:<<<<<><<77?<
+
+
+
+
+
+
+	7G<<<<=bv];==>:
																															
+
2?=>=<[pV<===<<A-	
+
+
+
+
+	:<<<;;?<<:9==	
+
+
+
+
+
+	==;<==<Kme===>>!

+																																
+

:?>>>@nmB<=>><<?;
+
+
+
+
+	9;<<;<@<<=998	
+
+
+
+
+
+ D;<<=>=DdgA<=>@)
+																												
+

>?>>=HrL;<=@?>=<@4	;:<<:<A<;=;56	
+
+
+
+<?<==?>=>ZkF<==?/

																											

#@>>>=HO<<=?AB?===B:!$@*7=;>@>:<=8>
+
+
+
+
+	>@==>AA?=<DoO;==?4

																																		

-@>>>>A?==>ABB?====AC at 89;:DC1<=<?@?<=>:@;0-++*/CB=>==ABA>==da;==>8

																																				
6?>>>???>=>A@?>==>>=<HHA at CQB=>==@??<=?<@K<=;;CJB>>>=>@AB?>=QwA<=><

																																						
<?>>>???>=>A?>>>>>>=>>DDDJMW@?><@A>;???DJLDAHH?>?>>>=>?B@>>EyO<=>? 
	
+																																							
!??>>????>>>A?>>>>>>>>>>=>PejC?>:CK>;?>LTHY\J?>????>>>>>B@>>AuZ;>>@)
	
+
+																																				(A>>>?>@?>>?A>>>>>>?>>>>>=C^bG91;NYC==?YWLPWWF?????>>>>>AA>?Au^;?>@0
+
+																															/@?>>?>?>>>?@>>>>????>>>>@VT_N61EikM;:I]DHKQYQC???>>>>>>@A>>Av^<??@6
		
+																																		
+5@>?>??@>>>?@>>>?????>>>BYYQTN=?Wzq[C>O`LOSS^WE?>>>>>>???A?>Cz\<?>@:

+																																							
9?>>>>@@>>?@@?????@@??>?ZgiSOKCG_wvgRHUUQLSP_P at BB@>@CD>=?A?>O�V<?>?<
																																										
<?>>>>?>?AB@??>>>?@@??=TnbWULQMR`ieaQQWPIO]ZhKAJOSWdrsjC=A>@e�M=???>

	
+																																								
=?>>>>>BRVMEB@@A?>?@??AdMCONMOJTb[TYSQVGDKgla@@N`u~sf^rmA>>PvxD>???>


+																																									
=?>>>>?GZWLFBADMKB@@?>MQ>?IOLFFWgSQX[UMOPU[Z]DCXv�uYMNXpkEIe�g@?????



+
+																																							
+
=>>>>?ASX_Q??@CR^SJHGTQ>>@DGABJ^l\_[UWODHMY^reYa{�eSPSU_wpgu�Q??>?>@ 


+
+
+																																							
+
=?>>>>FZPXdMCA at F`laffT>>?A at A@H[c_WWVQKRECOS[ddal|xg`TVS_i{|�yBA@>??@ 

+
+																																							
+

>?>???BTPOZ[XVTJT}zW?=>CKE at EZXUMDBEF>KDCNYV\e\Snlfkihlmnv��]?A@?>??




+																																					
+

!?>>>?@@CQSVWXVWaRy�rN=@BMVUANLDGGEDFEBJBGAHVISZnsjfrs[POT]mmK@>>?>??


+
+																																							
+

>?>??@;?BMY__WVWH[oUBEEKQSPDPEDELMJJA>FJM?1DKFSuyphnQA at CFN[ZDA???>>>


+
+
+																																							
+
>???@A at AA@BFMQNE?@]cQG at LTNNON@BLTPNROIFLGH71MNCZw~wfKCCHMV`XA?BA@??7
+
+
+																																				
+

&???@ABBBAAFIE@>=B_q[J at FYPLNRDKXTC??@GUXOJFM>DJ4-Pw�lVVbpv{[A at AA@?A-

+
+
+																																								
+
+

+AAAA=;>@>=Pw�yf]p�TWSGMUNKKHMZI=<=>>>?DN[cWY]]P/'Zim������ZAABA@@A-



+
+
+																																						
+
+

#=<0"
#:OdaJ>2I:$?YWRSYF=???>?????V}ux����U=c����~qZB at BAA@A6


+
+																																							
+
+



+
+

	!*)#BS,#
MdWPNF>?@????????A`�����o�D
+0 at N^kreVPFABAAA@?'

+
+
+																																						
+
+


):@A<(

3Rqe=NdV<XTWG<=>>@???????>>??@Q����~o` !Bi`hrS*@UABABA at A9
+
+																																							
+


	<CBABA4-U|re�wke_][�\:==>>???????????@@@>En����\H0NeU^pvR\\DAAA?>A:
+	
+																																		
+
+

	<CBA@>QymVQRpno}^c��S<>>?>???????@@?@@@@?>>o���fwr�`5GYlSSi^@AA*
%


+
+																																			
+


	9BAA?K��G@@aqxvxdrcG>?????@??????????@@@??>G}������0'?OXE7czGA@*
+
+
+																																				

	
7CAACy��H[XEbmokeI=>>??@@@@@??@???@?@@@@@@@>AXx���t&.BI2
<�X at B
4B/
+	
+																																						

4C@>Z�xr1c_;EoVH@?@@??@@@@@@@?@?@??@@@@@@@??><?KfvcF,6/<=05>W<>5*>B?

																																								
6<7+9B at B{tBObjC<IM=>?@@@?@@@@@@@@??????@@@@@@??????<<AHWPKUC)3#RA>@>@?A+
+
+																																			8@>???@>O�^@XMPQEB>@@???@?@@@@?@?????>????@??????>??>===>PL8D

TvC?@@>=A4
+
+																													
#@=;;=>=<Yc*;/2EE@??@?????????@?????????????????>?>>>>>>>>?R77

 f�C>>>><@8


+																												
 >=<:9==;^C
>%>D@?????????????????@??>>??@????>????>?>>>>?=EI7%!4z�D??==>@6


+
+																															
5?>6,?=9b`-(FA?????@??@@??????@????????@????>????>>??>??>?O<.Cz��B?:(=?A+



+
+																																	
$>?<:?>:b�HPD@?????@?@@????????????????????>>??>>>>>?????>F*!j�t<?:.?A8

+																																					*??=?>?<P�oWnI??@??????@????????@@????????>>>>>>>>>>???????B9

Y�_:><9@?
	
+																																					
 =?=?>??@��_dfP@??????????>?????@@???>???>>>?>>??>>?????????D#|�J;>>=@:

+																																			
+

&./?>??<h�fSnwK?@@@@@?@??>?????????>>???>>?>>????>?????????@6��?<>>=?>50

+	
+									
+				
+																	




#A???=F��es�U>@@@@@@@?????>????@???????????????>????????BO9�l:>??><>@4
+
+											
+	
+
+
+																	
+
+




@>>>?=Y�~v�e@@@@@@@@@????>>??????????????>????????????>Tn<`�J:>???./0

		
+											
+
+
+	
+															
+	
+


;?>>??@n�~~yH at A@@@@@@@????>>?@???????????>???????@@@@?DtlXwy<=>>?A!



+															
+
+
+															
+
+
+
+

+A>>=??K���z^@A@@@?@@?@??????????????>???>???????@@@@?`���\;>=>>A
+


+				
+	
+		
+						
+
+	
+															
+
+
+

<@==>??]�tnyH?@@@@@@@@???@@?????????>??>????????@@@?Lx{���C==>>@<

+							
+
+								
+	
+																
+
+
+
&A>==>>FwzzleA@@@??@@?@@??????????????>???????@@@@@Emr�o�\<>=>?B1

+									
+				
+
+
+
+
+
+							
+								
+
+

5@>>>>=V��[jV?@@@@???@???????@??????????????@@@@A?big�dA=>>??A



+								
+		
+		
+
+
+
+														
+	
+	
+
+

??>??=B{�\^mW?@@@@?????@?????@??>?????@???@@@@@?YhKf��H==>>>@8
+
+										
+		
+
+
+
+	
+
+
+
+	
+								
+		
+
+
+
	+B????=Y�xT[pW?@@@@@????@@@???>??@????@??@@@@A?SlYe��X=>==>?A%

+
+											
+
+
+
+
+
+		
+															
+
+
+
+
8A??@?@j�qc^saB?A@@@@???@@@?>>?@?????@@@@@@@?Qo_p��i>>?>>>@;
+
+
+
+											
+
+
+
+	
+		
+												
+
+
+
+
+

?@?@@?Fo��pbnjK?@A@@@?@@@??OB?@@???@@@A@@@AXp`gu�}D<>>>>>A(

+
+
+	
+												
+
+					
+										
+
+
+
+
+

+B@@@@?C_��sbhr^G??@@@@@?=O�Z=@@@?@@@@@@BNdsbbo{�V9>>>?>@9

+
+
+
+														
+	
+
+	
+								
+	
+	
+
+
+
+
+
9A?@A@??T~�{d`nuePD@???BVsiwXC????@@ADM`pn^`q{�k<=>>?>?@$

+
+
+
+
+
+									
+	
+
+
+	
+												
+
+
+
+
+
+
+

 @@@A@@@@Qz��m\bpxri_ahmp\RcvscWPMLOW`jpiZ^r��xB;>????A0

+
+
+
+
+
+
+								
+
+	
+	
+
+			
+								
+
+
+
+
+
+
+
+B@@@@?@AOr��m^\afjigh`VUS[amuvqmifklmk[^s��J<>????A8

+
+
+
+
+
+	
+										
+
+
+					
+					
+
+
+
+
+
+
+
+
4B?@@??ABGe��xe^^^]WYZYYW^a\^ijik__hg`dy��|N=?????A9


+
+
+
+
+
+	
+	
+							
+
+	
+
+
+							
+
+
+
+
+
+
+
+
+

=@@@BA at BAD\|��ugbZOUY[]]\XX^efd`\Y\_i���vN>@@??@B6

+
+
+
+
+
+
+	
+
+	
+				
+	
+	
+
+			
+
+			
+	
+
+
+
+
+
+
+
+
'AA at AAAABA@I_}��wdMU[^^_RYZY^^^^adjw���nM?@@?>@B2
+
+
+
+
+
+
+	
+	
+		
+		
+
+
+
+
+	
+						
+
+
+
+
+
+
+
+
+
+

2B?@ABA at BB@AOk}��vqpc^[Y^^[\^cgq{���zaH?@@@?@A-

+
+
+
+
+
+
+
+	
+	
+
+
+	
+		
+
+	
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+

6B?@AA@@ABB at FXn����rmha_^^bkv���{bOC?@@@@A?'

+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+	
+		
+		
+		
+
+
+
+
+
+
+
+
+
+
+
+
+

5B@@@A at AABB@BNcv��yt{rhfeq�����wWE@@@@@@A; 

+
+
+	
+	
+
+
+
+
+
+
+			
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+


/AA?@@AAABBAAK_z��|v�~}}�����kPA@@A@?@B7


+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


$=A@?@A@@@AABGXq���������r^MB?@@@@?@B2



+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

7AA??@@@@AA at AEUy����lRGA>?@@@???A?)



+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+



(:AA??@@@AAA@>BQ[YK@>??@@????@B7

+
+

+
+
+	
+		
+
+	
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+

&7A@???????><;:9:<=>???>?@A<)


+
+
+

+
+
+					
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+



%6?@@????@@>:<==>?>?@@?9+


+
+
+
+
+
+	
+		
+		
+	
+
+
+
+
+
+		
+
+
+
+	
+
+
+
+	
+
+
+
+
+
+
+
+
+
+



,5:<<<90%%)2:<=<71) 



+
+
+
+
+
+
+
+		
+				
+		
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+





'MJ'



+
+
+	
+
+
+
+	
+							
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



+

;A#




+
+
+
+		
+	
+									
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+










+
+
+
+
+
+
+										
+					
+
+
+	
+
+
+	
+
+
+
+
+
+	
+
+
+	
+



+










+	


+
+	
+
+
+																	
+		
+	
+
+
+
+
+
+
+
+
+
+
+		
+



+
+
+

+
+
+
+










+	
+
+
+
+
+																							
+
+	
+
+
+
+
+
+
+
+
+	
+
+





+
+	
+
+
+
+



+
+
+
+
+
+
+	
+	
+
+
+
+												
+								
+	
+
+
+
+
+
+
+
+
+
+
+




+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+		
+	
+
+
+
+
+												
+			
+		
+	
+
+
+
+
+
+
+
+



+
+
+
+
+
+
+



+
+
+
+
+	
+
+	
+
+
+
+
+
+
+
+
+															
+	
+
+
+
+
+
+
+



+
+
+
+
+
+




+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+											
+
+		
+
+
+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+							
+
+		

													
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+																
+

+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																	
+
+
+		
+

+
+
+
+
+
+
+
+
+
+
+														
+
+
+
+	
+

+
+
+

+
+
+				
+

+
+

+

+
+		
+


+
+
+		





+
+		

+		
+
	

+				

+	







	
	
+
	








+
			
+	


+


	



+
+

+

+

			


	'7;<;6&


+			


		


(<=<;;=<*

	
	

		

+	
+8==<;=<<;"



+	

		

(=<====<<=/
	


	

+

+
4=<44<<8;=7
+	

+


	

;=7$1=<68=<

	
+
	

+			
+
+
	
+	(==/"8>=::==&

	

+			

+
+
+
+
		
3>=-+;>=<=<=,	


+	



+

	:==/4=>=;<<=4

	
+		

	
+	)>=<89=><:;;<<
+


+
+	

	
+	


+			8=<==<<><:<<;=+	
+
+
+		
+
+

	

	

+

+		&><<=<<=><:<<<=9		
	
+



+
	

+
#;=;<=6:=>>--<<<>3	
+

+
+
+	
+
+	


!&2>=<;;=,1=>;%-=;==>6
	
+

	
+			
+
+6;>????>==<?@=8(;=47>>@<==??93+!
		
		

					
+$5>@?>>>>>>>=><TM=<%7<5==BS>==>>??@@=7*
+			
+			
	
		
+
1>?>>>====>>>><KhH><*6:6>=DhL<>=<=>>>??@<1

		


+		

+
+
6?>>=>>>=;=>=>FVr_D>8.<66>>CelL?=>>==>>>>>?<+	
+	

				



	
	CC:>====>>>====BSPHQZH?62>59>@Ijkc^K>>>=>>>>>==>5

		

								
+


+A?=====>>>===<DS3)MMB:9>5;?HLW.-POA>>=>>>>===>: 

+


										
+


'=<===>>??>=@GLH%	;DEB==>8<@F?EAPGB?=<==<=<<>: 


+
																
+

	
+!==<====<<?CIJ;'	(C'8A==?:=@9&=*	
%6LZWNB>;;=<=>8


+		
																		
+
+
+

<>=<====IXT?)
		=<$:C<=?<=?;):;
+		
+
2ZkcUD;===>1



+		
+																
+
+	9?=<=<<AY|n*
						&H6)CC<@C==@B05A)						JunrT;<<=>*
+	

			
+																	


/?>===<Jeih'	
+
+
+
+		#H"1A><BC:<@E5!?7
+				
+
+
	G[]tU9;=<ES


																												
!>>>>=;Mm^c6	
+
+
+	
+
+
+	@-:C?<?@:<>C9><
			
+
+
+
+TN[rN:=<?=		

+		
+																							
+	
7?>>>;Fj^Om3	
+
+
+
+
+
+
+		/BA@=<>>;;<@7#@'
	
+		
+
+
+	MUPbrE;<<8




+																								
&?>>>=<_edj^O'
+	
+
+
+
+
+
+	1GF><;=?;;8=;83
		
+
+	
+
+
+	
buX]pb;=<?6

																								
+	
+6?>>=;Jif^@9<E+
+
+
+
+
+
+
+	*JH=<<=?;;8<DA
	
+
+
+	
+
+
+	"BBIgumuE<=>?%
	
+																													
+

>>>>=;\hc><<<=H	
+
+
+
+
+	KG<<;<=;<7=F<
+
+
+
+
+
+
+	C=;;=_lqR;=>?3
+
+																													

+*@>>==@gmO<==<<G0
+
+
+
+
+		A@<<;<=:<7;D=

+
+
+
+
+
+
+
?B<<<<>cnX;==><
+
+																																			
+

4@>>>=Krb======@<
	
+
+
+		:<<<<=><<:;D>	
+
+
+
+
+
+A=<<==<Nm]<==>?$
																																
+

:?>>>>UkE<==?==>B
+
+
+	
+
39=<;;@;<=;?6
	
+
+
+
+
+
+)C<<=>==Edc>===@+

+																																		
+

>>>>>?IC<<<?@>==B9	87=<9<A<;=;:2
		
+
+
+
+>?==>?==?]jC<==@1

																																
%@>>>>???==CKBA===B<
,?-6<<>A<;<=9;					:@==?AA>==IsP;>=?5

																																					
+/@>>>>?@>>=MKB@==>=AC?98::H=1<>>?B<:<=9A6)')*),:A>>=>BB@>>?j`;=>?8

																																				
8?>>>??@?>>B@??>>>>=<HPFBEE;<>>>?@=6997<MA==>EH?>>==>ABB>>>bp?=>?<
																																

=>>>>??@?>>??>>>>>=<>=BFELYC=>>>?A=6;<<>CIFGKJ?=?>=>>>AB>>=\}G>>>? 

																																			
%@>>>>>??>>>@@>?>>>=>>>==<BiW=?::EL<5=??T^^MA>>?>?>>>>=?B?>=R�M>?>@(

																																						-@>>>?>??>>>@?>>>>??>>>>>=Bfc?<%.RU5&;>J[PSA>>?@???>>>>?B?>=JvL=?>@/

+																																		4@>>>?>??>>>?>>>>????>>>>CFZc>:4<YU<79<WL at NQB=????>>>?>>A@>=GkJ=?>@5
+																																							
+9?>>=>>??>>>>>>>?????>>=IYGZV?>?B^V?>;?ZUYPUQ>>????>>???A?>>JkH=?>?8
																																										
=>>>>>?????>>>>>?????>>@bWJRN>==H_ZF>=BPPVTJZ@??@???>>==@?>=\pE=?>?;
																																										
??>>>>????>>?>???@@??>>JU@@LG?=>IROE>=CNT[dZcD>?>=>@ITZK??>OzuD=?>>=

																																										"@?>>>?@>==>????@@@@@?>>A>=AED@??@BDCA at HRWMM`oD@>?CJWhpw_MZrssB=??>>

																																										#@?>>>??FLE???@@@???@???=???@BA@@BCJNGAEPXNA?`Q?IRYembbao~wzovf?>>?>?



+																																									
+$?>>>>?@Y[hR=@AA?=>>>>BB??@@@AAABTHU`ROBCIJG>[{bivwqhYV_bhwpj�N??>>?@ 

+
+																																								
%@>>>>?EWLXeE>?????>>>????@@@@@ENnefme`PABDB?Bgxvd[Zehgioug at A@???@ 


+
+																																								
+

(?>???@BQSM\aNJEBAGN`P>???@@@BYfk[KKTWNVDBOG>=I_k�|]eom_WSW_XD at AA???@



+
+
+
+																																
+
)?=????@BNQPU\^ZSDKgkI=??ADD at RaRUJDEGICOCIWTE>=Yy~wdjUFGFA<<>@AA@@??A 



+
+
+																																
+
&@??>?@==AKTUWSQODBbO>@ADIMBJ^HGEJLHHHDMEOXOKC>Jm}|jMBJPKA<<>@A<@@??@#


+
+
+																															
+
&@?>?@@@@A at BGPQLD@=RsG at ENQLEXJEFEKSNMD;ENMSL<HQ>^y�pEAEE@<<>>?>@A@??:
+
+
+																																									
+
+@?@AABBA@@JSD?<=<I�zC?OdJFSM?EOWVNINROJOMGO80L?GwqYB>>AEMPG>??@@@?@4

+
+
+																																								
+
+
5BAA<.0;@@>Q��v\Sf�{lI?D_OPGCAWZG@==?BL\`WTOPBGR)/_k[]bp��}P<>@A@@?@/


+
+
+																																						
+
+

3B?0
+
+
$'&>p����{[G ,^ZJ=BV`A==>????BT[dihmxto0&9R`mzxUA=>?A@@@A.


+
+
+																																						
+
+

'

	


+


+.[���hnI0D[_\WZ_E=??????@?@FRu~~���p

&.<A@@AAA@@4

+
+																																								
+



+
 7@?*9b���qjs\"`QIJSZXF>?@@???????>>\�����{U%-
(<HJ@@AAAA@>!

+
+																																								
+



+	
<BAAA6<o{���cW[i^7\:<>???@???>?>>???@??Oq~�uwW$0^�gX][UhB>@@AAB@$

+
+
+																																						
+



+
-BBA@>Pf^QW_�fZTZj��[<>=>??????????????>=;G����g`u�JQ\B>nS?@@@>7)


+
+																																			


	
6BAA?V~E7EHObj^Y]cD?????@@??@????>?????>;V������qY41O9EJlG at AA)
+


+																																				

		:DA at J��rADGFEcknugK>=?????@@???????@@@@@@?>=Fc����j?''EJ>2mdAAB&!
+
+
+																																					
	9C@?i�|�Tr_CGWleNB>?>?????@@@?@?@??@@@@@@@??>=DTljN?ED2=K:_yG;C,
'>=#
																																					

15+":A?H��sherRFWZKB??????@@??@@@@?????????@@?????><<DPXGUK

8TqQ>A<0=?A3

+																																		
+7@??=>?<[�eH>
NQFC???@?????@??????@?>>????@@@????????>==CMEK5P`>?@@?=@;
+																															
$@=<<>==;`>
8'%OD?>?@????????????????>?????@?@??>>???????>AL,/
Pr?>>>=;>>

																														!>=<68==<W%3F@?????>??????????????>????????????????????>G4)
%u~@>>?==?=


+																															6?=,.?=;Y&.5A@??????>>???????@????????@???>??>>???????>>?TE
m|?>;-<>@7


+
+																														
1@>9<?>:[zYLLKA@?@???@????????@?????????@???>????>????????>IG"6s;?9,>@=


																																		
3@>>???=H��imeLA?@???????????????@?????????>???>???????????AI]�d:>=9?@&


																																			

 ;:9@?@?<{�lffhS?@@??????????????@?????????>>??>??>??@@?????Q(-x�Q<>?>@<
+

+																																			
+
0@>??<Y�~lXlf>@@@?@???????????@@???????>???>>?????@@@???B[>_��?>????=-(
																	
+
+																
+

	+@>>?>?n�ybknB?@@@@?????????????????????????>????@@@@@?>QhKe�c:????>>@9

+			
+
+									
+	
+																
+
+
+


"@>>>@?H}���|M?@@@@@?@?????>?????????????????????@@@@@@?e^Rq�D<??>?246!

		
+						
+	
+
+		
+
+																
+
+
+



<>=>???N���c@@@?@?@?@???????@???????????>>>????@@@@A>Rx`b�b<=>>=@!


+				
+				
+
+	
+
+
+
+
+
+													
+				
+
-A>==>@@X��y{K?@@??@@@????????????????>>?>>>???@@@@@@Fw����D==>>>?
+



+					
+					
+
+
+
+
+
+																				

=?==>>?Dk}|e?@@????@??????????????????>?????@@@AAA?d����Y====>@:

													
+
+	
+
+	
+																		
+
&A>>>?>?Pj�izP>@@???????????????????@???????@@@@AA?PppurA>=<=>A.


+								
+			
+
+
+
+
+
+																	
+	

4A>??>>@\�hflF?@@??????????@??@???????????@@@@@A at Bj^v��M=>==>>@



+
+							
+
+
+			
+
+
+
+
+
+	
+
+												
+	
+
+
=@????=K}yYchD?@@@??@???@@@???>?@?????@??@@@AA@@aaN{�j?>===>A5
+
+
+									
+
+
+
+
+
+
+	
+
+
+
+		
+										
+
+
+

+)A???@@>]�dUehF>@@@@?@???@@???>?@@??????@@@AA@>[i\p�wB====>?A"

+
+
+											
+
+
+
+
+	
+
+		
+													
+
+
+
7A??@@@Bn��ompM>@@@@@@??@@@?QD@@??????@@@AA?@[j_p��I;>>>>>A9
+
+
+	
+							
+
+
+
+
+
+
+	
+	
+
+			
+						
+	
+
+
+
+


?@?@@A at Fb��qmt]E?@@@@@@@@>I~W>@@@?@?@@@A at AMfkaj|�f:=>>?>>A&

+
+
+
+	
+						
+
+
+
+	
+
+	
+												
+		
+
+
+
+

*B@@@AA@?Nt�~proZG?????=>Ek}rF>?@@@@?@?APjsh`r~�y@;>>??>A7

+
+
+
+
+		
+							
+
+	
+	
+
+
+									
+		
+
+
+
+
+
+
9A?@AAAA>Hj��tjqtfTJEHNXleTemTEA??@CJYkuk_dz��{H:?????@? 

+
+
+
+
+
+						
+
+		
+
+
+
+	
+												
+
+
+
+
+
+
+

!A@?AAABA>Gb}�|f`lpqlnpn`PRQ^nqokjlptrk`\i���uL<>???>?A+

+
+
+
+
+			
+				
+
+		
+
+	
+
+												
+
+
+
+
+
+
+
/B?@AAABBACSv��rdcg\NYXVWUV[]agijjha_]_i���jJ?@??@??B3


+
+
+
+
+
+	
+									
+
+
+						
+					
+
+
+
+
+
+
+
9A?@AAA at BAARo���rk]GLSZZWX_^ZZ[]\`^cfs��{_G?@@@@?@B4


+
+
+
+
+	
+		
+
+			
+			
+	
+
+			
+			
+	
+		
+
+
+
+
+
+

>@?@BA at AAABI[s���xaZVYYY\_\[^``cgmu���oRD@@@@??@B0

+
+
+
+
+
+
+
+
+
+	
+
+			
+
+
+	
+			
+				
+			
+
+
+
+
+
+
+

)B@@AAA at AAA@AHZo{~|wg]ZWimaeilu����ydMB@@AA??@A,

+
+
+
+
+
+
+
+	
+	
+	
+
+		
+
+
+
+	
+			
+
+				
+
+
+
+
+
+
+
+

4A?AA@@@ABBA at AHSds~��wj]behw}����v`PFA@@@@@?A?&

+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+
+	
+		
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
9A?@@A@@ABBBA?AGQ\o���i__k����yePEBA@@A at A@A<!

+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+		
+		
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+

9A@@@AA at AABBB@@CK`}��ugq~��oaOCAA@@@@@@B8

+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+

4A@?@AA@@ABBCBAGYs�������|kWKCA@@@@@?@A4


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+


(>A?@@@@@@AABABFT}����v^PFA@@@@@@??AA.


+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+


6AA???@@@@AAAAAR~��gE???@@@@@??@A=&



+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+



'9AA????@@@@??=BJG>>>??????>?@A3



+
+
+
+
+			
+	
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

%5?A?>?>?>>=<=><<=>>>>>>?A at 8$





+
+
+
+				
+		
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+


1<@A@??>??:5;??????@?;1#



+
+
+
+
+
+
+
+
+			
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



$.56763(&3-+58873+ 


+
+
+
+
+
+
+
+
+
+			
+		
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






/VK





+
+
+
+
+
+	
+		
+			
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+









10



+
+
+
+
+		
+	
+		
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+














+
+
+
+
+
+			
+	
+								
+		
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+








+






+			
+								
+								
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+

















+
+


+
+
+
+																					
+
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+












+





+
+	
+
+
+
+
+
+
+
+																			
+	
+
+
+
+
+
+
+
+
+		
+
+









			
+



+
+
+	
+
+
+
+
+
+
+
+
+										
+					
+		
+
+
+
+
+
+	
+	
+


+
+
+
+


+		
+
+


+
+
+
+	
+
+
+
+
+
+
+
+
+
+	
+												
+		
+
+
+		
+	


+





+		
+	
+
+

+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+									
+
+		
+
+
+
+



+
+

+
+
+								
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+
+
+		
+									
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+																			
+
+
	
+
+

+

+
+
+
+
+
+

+
+
+
+																	
+


+
+
+

+
+
+
+
+
+
+



+														
+

+	
+



+



+
+
+									
+

+		





+				
+

		


+	

+
+
	

	
	
+			
+



+

+
+
+


		
+



+
+

		


		



+",/+

		
		
+


		


+


+
4=>===1


				
+

			


+	4>==;<=>4


				



	
+
+	%<=>==;===,


	



+	
	
3==17>6+;=8


+

+
+
+
+
+
+
+;=5"=3,=<!

+	
+	


+		
/=<!)>9 =='

	
+
	

				



+
+8=8
1?; !<=/



	

+
+		
+		
+	
+


!<>87>=+)<=4
+
+
+
	

+
+	



,==;<>=82<=9
+

+
+		

+
+	5><=),=>=;:<<=!	
+

	
+			


+<=<<18=>=;<=<>-
+

+
+




+
	
+	
	
	)>==<+2=><;<<==7

+
+
+		
+	



+:=<<:"5=>>-&<=<='


				



!):><<<;&6=>9!-=<<==/
	

+		

&3;>??????>=<=?=72<>23==<=>>?>94.&

		
+					):???>>>>>>===<GH<=3:<6=<FL=>==>???@?;1#
+			
+
+	
+
	
+
+
+
+
+4?>>>>>>>>>>=><EL9?>27<8>>?UD=>>===>>>>?>6!
	
+


+
+		!+"7?===>>>=<=>><=IeE=C at 15:8BD9E^C======>>>>>?=-		

			



	
+

:K>>====>>=;<===M_heCEH>4:7:AMHIbaUA<>><=>>>==>>4			

+								
+


+
+5>=====>?>===<>PJ.?PBMI<:=8;BPGD-6XH=>>===>====>8
		
+												
+

	
"<======>?>=>CIL4
.M:EG<=>9<CG;6.SLA>==>?<==<<>: 	

+																
+

	
+
<><==>====?FNI;"	
+;@(:A==@;=;3)5 	"4CIJD==<<==<=>7


		
+															
+

+	:?====><>LSN=$

+	C5
5?=BJ>>5+43
			
+&>PND<;<=<=>0
+	

+		
+																		
+
+
7?>====;Irh<

	
+
+	*H/8B<FL=>5)-?		
+	
!SweMA<<<==0

+


+	
+																					

+	/?>>==<;Hpl	
+		
+	0H
=B<BC<>7'&B/					
+
+
+RkmkI;<==GG
+


+
+
+
+																			
+


">?=>=<;Ujs<	
+
+				
+*J@C<??<=;'B6					
+
+
+NPfnH:==A:		
+


+
+
+																					
+

+7?>>>=;TkPjD		
+
+
+			
+F/%@@<>><=@/A&					
+	
+	FPUglA;==9

	


+
+
+																								
+'?>=>><Jl^knY4	
+
+		
+	
3<5?><=><=@<
 =					
+
+	csY[p\;==?7
+

																								
+		7?>>>>>`ehS?<F8
+
+
+
+			(@>?=<<=<=?A7:-
+					
+
+
+
)BFXnjcoB==>?'
+


+																												
+
+
>>>>>=HejI:;<<I'
+
+
+			
FE@=<<=<=>@>?
				
+
+
+
++B=::AdfnL<>>?6

																																	
+
,@>>>>=Sq\<=<=<CA
	
+
+				
PE><<<=;=>@D?			
+
+
+	F><;<;BhmO<=>?<
																																		
+

+5@>>>>?YZ?=<===>H	
+		
+	%J@>==<?;=>?MG			
+	
+
+'C<<<<=<XoR<>>>?#
+
+																																
+
;?>>>>?I?<=<?===F)				
+	,@===<<?9=>=H?
		
+
+
+
+
+4A<<>>=<Mm^<=>=@*


+																																
+
 >?>>>>??=><=B?>=BC
+@==>==@8=>=>9
	
+
+
+		A>==??==Agn?=>>@1

																																	
+
(@>>>>???>=CaHA>>=CA$;A>>>>?@7=>>==				7A==AB@==<O{K=>=?6

																																				
1@>>>>???><TeB@>>>=@D@:8:?H=>??>?B;=>>=A;)&'((,9@=>=@BB?==AuZ=>>?9

																																				
9?>>?????>=MJ??>>>>=>CNOGQA8=??>?A:==:<;GUG??DH@>>>>?AB@==>ja>?>?=

																																						
>>>>>?>??>>BA=>>>>>>>=>B at ST5<?@>@C:6:69=L`WKHF?>>>=>>>A@===a`??>??

																																							
(@>>>=>>??>>>?>>>>>>>>>==<Ee?;=04HM3
09;Fi\@>>>???>>>>>@@==<MY????@'

																																				1@>>>=>??>>>>?>>>??>>>>>=ANiP/$(HG&2?B_d^@>>?????>>>>?A==<>C???>@/

																																							
+8@>>>>>??>>>>>>>>>???>>=CNAYO748:AA:7::MaV_P>?????>>>>>?@===>>>>?>@5
+																																								

<?>>>?>??>?>>>>>?????>>?UJ>MF=?>>@?>><<LPOW[C>??????>>>?@=>>>>=>?>?8

																																									
+!?>>>>?>>?>?>>>???????>>EZ?<?A>>>>>>>>>=JFC]\N>?????????>?=>=A@<=>=>:

																																									
&?>>>>>?>>>>>>>???@???>>@B=>>?>>>===>=>>FD at Ke`@??????>?ADC>?M\F;=>>><
+																																										
)@?>>>>?>==>???@@?????>>=>?>??>>>=>>>>??DD>=VzH?@@???GOXm}voktS<=>>>>


+
+																																								+@>>>>??@FIE???@@???@?>>????@????>>>>@@?AC?>?aR?A@>?Mcfk}�xbStT==>>>@ 

+
+																																								
+,@>>>>??Rcnj???@??????>>??@@??@AA>=>@??@@A@@?GkSKJDJfqntv|n__oE>>>>?@#


+																																									
.?>>>>?@SVQjM=??????>=>??@A@??>?BQTWRMI@@A@??>[{he__prlljmnqnQ??>?>>@"


+																																										
/?>>>?@@H_SVdPE???><DB>?@@@??>GXfrlenriQ?A@?>>@]o�}kl_RQTPQOC?@@@?>?@


+
+
+
+																																					
.@????@A at K^XT_aTE?=MXA>>>??@@KgiqfPKVe^\CAC@==<Mwx�tTL_baikVA at AA@???@$


+
+
+																																			
,@???@@?=?FX\[WXH>>^gC???@AAIX^VSMGHFKKVNBHEB?>>Yw�aF`nklnfJ@@@?A??>A'


+
+
+
+																																
+
'@?>@@???@@@DJIE@@>MyG at ABB@K[OLHEHNLLGBEQINLMIHMgdfICXebZMEBA@<=A@>?>


+
+
+																																								
+
+@@ABAB@@@?FIA>=>=Bmd?>FU at F_JEHFOZ[XWQF?ITMVM:GUrkH=>?A@==@AA@@@@???:

+
+
+																																								
+
+
4CB at 4*6>AB?DfydRQ^x�lEFOMGWPBDLXYUJFJO[aMNKNV;<PUi|bONQRZ_H@@?@@????8


+
+
+																																					
+
+
/A<%
&05;<;^�����zc7BQ]YPDAGeN?=====@S_ONRXVXZOBZ]iriXXX;;>?@AA@@@8


+
+
+																																					
+
+
"	
'<=2&$#D�����zkPKLF^XIGGbS<?????@?@Ued``\pl]:

+-:>@AAAB,




+
+																																					
+


			8BA>0+Cp���ynsiONU=Lcaen_>?????????@KSScrteXI
+
+	"4=@AABB@)


+
+
+																																						



+
+
+#AA@@B[v[~�jJSvcJSE?Qcl]A???>>>>>>>>==>EWuFBM3GdlJ+%.=D@@AABBB3

+
+																																	
+



+	:BA?C[VCIVcqcMSp\P_W=@EEA?@??????>?>>>==;V�AHKnhn�rXf]K?U>?@@AA>"
+

+
+
+																																	


+		'ABA>gU5D41*Uba\TZjX?><>?@@???????????>>=@kzls��tiSH>NFNgK?AAA<
+	
+																																				

		
5CC at P�dP[X>-L^FGPQH@>>>>?@??????????@???><@Tqtcju[LV5B:RYrD@@C0

+

+
+																																	

:CA at o���{V/++6kTFC?<>>?????????????@@@@???>>=CNVPG3+RC/7AM�]>=C3
+%)
																																				
+
/1%!<A?J�{hKV2!9GXgP??>>>???????@?>>>>?@??????>???=?AIT>=P%(*KwBAB;!1 at A1
																																							
+8A?>=?@=X�}P7?LEA>>>>>>??????????>>>>?????@@??????>>=BPC97##@nP@@@?@>?>

+																																		
#@=<=>=>=^Y0F2)FG?????>>???>????????>>????@??????????>>>>=JC21)=de???@>:=@"
																																>>=77==<T *BQ@@???@?>???>????????>>>??????????????>>>>>>R74Io=>>>==>@#

+																																7?='2?=;Q%8<L?@??????????????????????????????????>???>>>ARG
+1q==<1<>?=

																														9@=8>?>;Mihc
ZVB>??>???>?????????@@???????????>?????????>?=KC
fx<?:)=??,

																																			
4@==?@@>?���j_bSA????????@????@@?@??????@????>>>????????>?>A3
\�m;?>:>@0

																																			


4-8?>@?;e�}iWXcH?@???????????@@?@@?????@@?????>>??@??????>GET�P<>?>?>

+																																			
+
6?>?>>F�~a_tM>@@@@?@??@??????@@?????@????>?>>?????????<YL xt<>???>>,!

+															
+
+																	
+


1@=>?>>Q��u�Z>AA@@?@????@??????>???????????>>?@@???@???gX=]�R<???@=>@:

+															
+
+																	
+



%A>>>???Uz���kE@@@????????????@??>??????????>??@@????@=Om_q�w@=>>>?249'
	
+										
+
+
+
+
+																
+
+
+
+


=?=>?>?>Qu~{pQ?@@??@@????????@??>????????>>>?@@@??@@@Bpg_x�L===>=@#

+
+						
+			
+
+
+
+
+																	
+
+
+

-A>=>>???K_}ph@@@??@@@??????????>?@??????>??@@@??@@@@a����c=?==>>@




+
+
+
+								
+
+	
+
+
+																				

<?>>>>??@O��{J>@@???????????@??>????@??????@@@?@@A?N|����F>>==>@:

+			
+				
+			
+
+
+
+
+	
+																		
+
&A?>????=Dy�oa?@@??????????@@?>??>??@?????@@@@@@A at Bmh��a=><<=>B-


				
+
+	
+
+						
+
+																			
+
+
3A>?@@?><c�hfU>@@@@?@@???@@@?>>>?@@@?????@@??@@A>ViL�wB====>?@



+
+						
+	
+
+
+		
+
+
+
+	
+																
+
+
+
+
<@??@@A<H{rUcS>?@@@@@@??@@@@>D@?@@@??>???@@@AA>NkQ`��P<===>>A4
+
+
+								
+
+
+
+
+	
+
+	
+																	
+
+
+
+&A???@A@>Yzois[A?@@@@@@???@@>_K?@@@?>???@@@AA?Mm]Y��Q<=>>>>?A 

+
+
+									
+
+	
+
+
+
+	
+																		
+

5A??@AA?BYz�{yhI??@@@@@@@?>J�_=@@@???@@@AA@?Oofg}�p=<??>>>A7

+
+
+
+
+									
+
+
+
+
+	
+				
+												
+
+
+
>@?@@BA@@Lk��w_G?>?@?>>>Bi�tE>@@?@@@A@@ANbpiu��wH=????>?A#
+
+
+
+
+
+
+					
+
+
+
+
+
+
+
+	
+	
+
+													
+
+
+
+
)B??@AAA?>DWr��{pdQGBABFPfjWjfF>=>????ANeqlk���sK=@????>@5

+	
+
+
+
+		
+						
+
+
+
+	
+
+
+														
+
+
+
+
9A?@AAAA??@Mj��nosohfimmePKNgm]PJGGMYlsibp��{aI>?@????@>


+
+
+
+
+	
+
+								
+	
+
+	
+															
+	
+
+
+
!A@?@AABAAA?Gb��ncdhdYRMJJLMPZgnqstwrgadx��lRC??????>@A'


+
+
+
+
+		
+
+				
+
+		
+
+	
+																
+
+
+
+
0B?@AAAAAAA?C[�~nhVKTQKMPNORTWZ^db]do���dKA at A@?????B.

+
+
+
+	
+				
+	
+		
+
+	
+
+
+													
+	
+
+
+
+
+
;A?@AAAAAAA at ARp���yjngZRMNPRYY_cdnv���}ZFA at A@@?@?@A.

+
+
+
+
+
+				
+		
+
+
+
+
+
+	
+												
+
+
+
+
+
+
+

!@@?@AAA@@A at AAFRblu|�}mdWSakmrz�����nTBAAAA@@??@A+

+
+
+
+
+
+	
+				
+		
+
+
+
+	
+
+					
+				
+
+
+
+
+
+
+
+
+
+A??@AAAAA@@A@?ADKXft{�ob�������{p^MD at AA@A@@??A?&

+
+
+
+
+
+
+
+
+				
+
+	
+
+
+
+
+				
+				
+	
+
+	
+
+
+
+
+

5A?@@@@AAAAAAA@@@BEPbqtz���wh\TLB?ABA@?AA@?A< 

+
+
+
+
+
+
+
+
+	
+	
+	
+
+
+	
+
+	
+		
+					
+	
+
+
+		
+
+
+
+

:A??@@@@@AAAAAA@@?@L_}�{l^QHB?ACCA@@@?@?A7

+
+
+
+
+
+
+
+	
+
+
+
+		
+
+	
+
+			
+
+						
+
+	
+
+
+
+
+
+
+
+


<A??@@@@@AABBBAAA?F]w���y\LE@@BCB@@@@@?@A3

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+				
+
+		
+
+	
+
+
+
+

8B@??@@@@@@AABBBADU����dNEB at AA@?@@@??AA.


+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+						
+
+			
+	
+
+
+
+
+


-?A???@@@@@@@AABAP���lHA@??????@???A?)



+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+			
+		
+
+
+
+
+
+

7A@??????@@@@@@@[rfG@@?????????@A:"



+
+
+
+				
+
+	
+
+
+	
+
+
+
+
+	
+
+	
+
+	
+
+	
+
+
+
+
+
+
+
+
+
+


'9A@?>>>?????>=;==>?????>>>>?A?/




+
+
+
+
+				
+	
+
+
+
+
+
+
+
+			
+
+	
+
+		
+	
+
+
+
+
+
+
+
+
+


$4>A?>>>>>>=>??@>>?>>>>?@@=0



+
+
+
+
+
+
+
+
+				
+
+	
+
+
+
+
+
+		
+		
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+


.9?@@@@@A>318 at AA@@A@=6(


+
+
+
+
+
+
+
+
+				
+
+	
+
+
+
+
+		
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+


 (-00.'
-A*!,110,$

+


+
+
+
+
+	
+	
+				
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+



+
5X5




+
+
+
+
+
+
+	
+	
+
+				
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+
+
+			
+
+
+
+
+
+
+








'


+
+
+
+
+			
+					
+			
+
+
+
+
+
+
+
+
+
+
+
+
+			
+
+
+	
+
+
+
+
+
+
+
+
+








+
+
+






+
+
+
+	
+								
+							
+
+
+	
+
+
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+














		





+
+
+
+
+
+
+												
+		
+		
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+










+
+

+



	
+

+
+
+
+
+
+
+	
+	
+				
+						
+			
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





+
+			
+
+



		
+
+
+
+
+
+
+
+			
+
+											
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+





+
+				
+



		
+
+
+
+
+
+
+
+
+
+
+	
+					
+					
+
+	
+
+
+
+
+
+
+
+
+
+
+






+
+				
+



+	
+
+
+
+
+
+
+
+
+		
+
+
+					
+		
+
+
+		
+
+
+
+
+
+
+
+


+

+


+						



+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+		
+
+
+
+
+											
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+	
+
+												
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																				
+
+	
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+																	
+
+	
+
+
+

+
+
+
+
+
+
+


+														
+
+	
+








+
+										
+	
+
+




+						
+		
+
	


+

+
+
			
+	
+
+


+	




+			



+
+
+
+


+
			
+
	


+462&
+



+	

+
	

		
+
+	
%:>>=>>6


+


	
+
		
+



9>?>==>>7
+	



+

			



-=>43=.4>>1					
+
+


+		

+
9>8/>/6><!

		

+
+
+	
+	
/==#
+)?1

<=*
	
+
+	
+
+
+
;=5%>77=4
+				

+	
+		
+	

+/==/+?97=:	
+
+		
+
+		
+
+
	
	9<=13>;!
:<<"

		

+
+
+


+

+"<<=39>=6/;<=+
+


	
+				
+	

	
		'=<<1!=>=:7=<=0





+	
	
+	
+			

	


+,=<<*-=>>5,=<=5

+
+
+	


+		
	

+
+
	
1=<<00=>=7+<<=8
+
		
+

	
+		
	

	:=<<7
8=>>-
<==<	
+
+				
	



 4>=<<8$:=><!'==<>6 
	

+	

+7<????>>?>=<<=<-7=>8+9=<<=>>;850+#
	
+			
+

-<??>>>>>>>====@><:7==:<<>?<>==>???@@>6)
						
	



+
	6?>=>>=>>>>>=><BG<==7;=;=<;B?=>>>>=>>>>>?:&	
+
+	


	#;.9>===>>>===>>=;A\C<B?49<:?>8?U?=>>=;=>>>=>>>/		

+			



	)K@>==<=>>=<==>=CWfZ>>G>2:;9 at G>?_[K>=>=<=>>===>>5			

									
+


+

)======>>><===<HRD`P=HF=4<::@L@>2 ?QA>>===>>==<=>8


+
+	

											
+

		
<=<<===>?>>=?FOH
+AK=IH=<@8;CG=5
5OA===>>=;====?8


+

+															
+
+
	:?=========@JPD*E@;FE=AM7<BD50	
 >HHE?=>====<=>6
+
+

+																			

	8?======;@HMK7
	%F96CA<AO8=<@(%.			
+
*)8IJA;<=====>.

																					
		4?>====<>WcX?

			$C2/>@<AK;>58$.<	

+5[eL<<=<<==2
	
+

+																							
+	
+,?>>>==;=cq0
	
+			1E
!;?<CG<>31-A&					
+	
aqXF<<<==HA	



+
+																							
+
!>?>>>=;A`xR
							6F6@<@A<=4-
D4						
+
+	#[emO<<==A.			



+
+
+															
+		
6?>>>><Ad^e[
+						(G*<@<=><=<#A-							
+OKjpK;===9

		



+
+																		
&?>=>>>>Y_ZrfD
+
+				
D7+??<=><=A+
A					
+	!hZVhjC===@7



+																									
+		7?>>>><E`hfP;DC	
+
+
+		96+??<<>==?;058							1DSkpdnV<=>>@'
+

+
+																								
+
+
+>>>>>>=OoV<:<<F6			
+			
+13+>>=<?=>?>:?+					
+		9A<9;Kkkd>=>>@5

	
+																											
+

++@>>>>>?V`><<==?K	
+				1<1?>=<@=>??8>
				
+
+)E<<<=:NtmA=>>?<	
																															
+

5?>>>>??B?=<<>=<I)	
+
+		
<R<?>=<?;>>@<B				
+
+
+9A<=<==@jrG=>>>>#
+
+																																
+

;>>>>>?>>>>;>?=<C9
	
+
+	EQ>>=>>>7>>?GK		
+	
+	?><=>=><XqS<>>>@*


																																
+
!?>>>=>???>=;A@>=@I)
+	FE=>>>>>7>=>HP
+
+			
D===@>=<Dse=>>=@0

																																	
+
)@>>><???>=>YKB?>>CG3

0I>=>>>>@<?>>>G
		;@=>AB?==;SnA>>>?5

																																	
+2@>>>=?>?>=IsHA>>>>?FF??FPB=>>?>?A=?>>=AF<,%((,9?>>=ABA>==?\F>>=>:

																																						
:?>>>>?>??=NgB?>>>>==AIVWkE=???=>@=>>??=Np^E?EIA>>==@BA>===KE>>>>=

																																		
 >?>>>?>??>=OR=>>>>>>>>===]N9???>AC9=?>>=__NIEC?>>>>>>?B?==>EB>>>?? 
																																							
+@>>>>?>??>>DD=>>>>?>>>>=B[_2;@91AA*-898BnY<>>>>>?>>>>?A?==>@>>>>>@'

																																					4@>>>=>>??>>=<>?>?>>?>>>APJS=54*#<<%
/:5R[cD>??>>?>>>>>A?=>>>>>>>>@/																																				
+;?>>=<>>?>>>==>>>??>?>>>RL=OB989:=<:8:<BTCSU>>>?>>>>>>>A?=>>>>>>>>@5
+																																						
 >?>>=<>>?>>>=>>>>????>>DP?>@?=<;===<<==AC=IbA?>>???>???@?=>>>>>>>>?9

																																								
&@?>>>=>>>>>>=>??????>>>KF>>>>===>>=>>>>??=IhH>>??????>???=>=>>>>>>?;
+
																																										
,?>>>>?>>>>>>>???????>=?C>>>>>>>>===>>>>>>>@h[=?>????>????>=>==>==>>=
+

+																																								0?>>>>>>>><<>????????>=A@>?>??>=====>>>>>>>=FYA>?????>>>CQYTRM===>>>?

+
+
+																																									3>>>>>>>=<GZL???@@???>=@?????>====>>>>>=>>??=>>?@????@@ETnxod_@>>>>>@#

+
+																																									
+4>>>>?>??Vu�X>?@@@@@?>>>?@@?>>??>>>>?@?>>????>DC>>>>AGFP]oumlZ@>>>??@'

+
+																																										
5>>>>?>>DmY`gA>@??????>>@@@>>???@>=>>>=>>?@@??FR>==>FFBDKSSXZD?>>>>>@'

+
+																																										
6?>>>>??@\gQcbE?@??>=>>?@@>?>>>CFKSTOKJ@>?@@@??MSSICD at FOY^ecN?@??>>>@&

+
+																																							
+

4@????@@@B`eWcgG??>?D@>>>?>>>@Tibff\kxvO>@@???=GyucECYjcZYnkN?@@??>>@+
	
+																																								
+
0@?>???A>>AQ\a]H=>>MeG=>>?@@DKlzlcLJXorjODA@=>>=SycAO^Z`cdu[D?@@@??>@.
	
+
+																																								
++@>>@@??@@@>>@@>?>>EfE>?@BADVabcSJEFFJQY]N at BEB?LSQF?K[]aidUDA@;?A?=?@"

+

+																																								
+
+
/AAAAAB@@?>?>=>==;@TN>?>AAC[ZPKFCIPRMGIJJVGAKE at VuJ<??EIHB>@AA@@??>>??

+
																																									
+
,BB=6<@?@A?B[OBGPYw|^FA?>>M\IEFP_d\_fb`QDLYLRD<HW@?AFNTM@@@AAA@????


+

+
+																																								
+
+
2.
9AAAA@?izu����kWFBALHTNAA[_RG@?CFOcK?HW\QQTZs�po{|udK69;>?@AAA@@



+
+
+																																						
+
+



+*@AA@@@@q�����uB;@??_QLUQ^Z@=>??>>=NaQPO_Jbh^Oka\F*

!&.7=@5

+
+
+																																							
+
+

	
+
+%@ABA at Ei����}okK=><<QYHSoh@>???????>LisjW>_ebA at I;!	
+
+

')$%*'
+

+
+
+																																								


+	
+
AAA?HliJv�twXMmP<==GkbolB>????>?>??>CTXCDxP>>HSv�a8 3=AA>;;/	

+
+
+																																				


+	
+
+-CB?JaU71W~jiNYhE<>@BjvtP=?????>?>>>>>==:X�nMU]dk�eXylZJA@@@ABC5

+
+																																						
+

			=CAAk+8R`I&OcWC;=@D?SZF?@???????????@?><W��cBE[qdD9QVQuh??@@BA#		
+																			
+																			
+
	
/CB?S�\FpY2	BD<>>?@@@DA>?@@???????@@@???>?PlN7B=QWHK=6,HmW>??B=

+
+																																		

:B@@o�{`iH#JG???@>=>?>????????????@@@@?>=<APSM=41-=0)'$:vG=?B<
+
+																																						
35('>A at F��bXV
+RSPE@@>=<=>>>@????>>>?????????>?>>EKKQ:#;:)5__?AB>
7:)
																																							

9A??=?@?M�m^H?,/IC@@??>===?????????>>>>??????????>?>==BLW;2)

=zG at A@:>@A?

+																																				"?>=>>>>>S�hjVOTI@@@??>?>>??????????>>>???????@??????>>>>GH(4?J|[>?@@?<=A(
																																			
<?>88>>=PXN^&VeA at A???????????@?????>>>???????????????>>>=AK6$$-@k=>>>=<=A+
																		
+																9@=,8@>;JXTe&QgE@???@????????@??????>????????>??@?>>??>>>=EKPDCx>>>7<>?@%
																	
+																		
<?=9?@@=Ay�{V]aXH???@????????@???????????????>>?@?>>???>>?<QD&,;zx=?=);?@6

																	
+																		3@:=??A?:g��vUW[W@?@?@@?@????@??@???>????????>??????????>>=H P�a=?>;>?9


																																			
(!;?>?>=I��oYW`b@?????????????@????>????????????????????>@\$
D�B=??>>@$

+																																			
+

:?=?>>>`�ugfmlB?@?????@??@??????>>????????????????????>Fs*sZ;>???>?1

+																
+																
+	
5@=>>>?@_���N?@@@??????@???@??>>????????????????????>WyKT�B=??>?=>@9

+
+	
+											
+
+
+																
+
+
+


)A>>>?>>?Oo���c?@?@??@???@????@??>?@????????????????@?Fony{�]=>>>=?108(

+
+									
+
+		
+
+																	
+
+
+


>?>>??>>?FU}ogC????@@@???@???@??>????????????@????@@Ae~du�m@>=>>=A&

	
+														
+															
+
+
+
+

-A>>????>>DnqnR>@??@@@???@@@????>????@??@???@????@@?R����G=>=>>?A



+
+
+
+				
+								
+																
+	
+
+

;@>>?@@?>>[�u^>?@??@?????@@?>??>?>?@@???????????@@Akw���X=>==>?@;


+			
+						
+
+
+
+	
+																				
+
&A???@@@>>KpcP>?@??@?????@@??>>>>?@@??????????@@?Zs`��zE===>>?B-

+
+
+					
+									
+	
+
+																	
+
3A??@@A@>?hy`hN>?@@@@@????@@?=NG>@@@?????????@@?PoV`�nT==>=>>?@

+
+														
+
+
+
+																			

<@??@AA@>IrsfnS??@@@@@??@???@r\=@@@????@@@@@@?Lo_U�zP@=>>>>>A3
+
+
+												
+	
+
+	
+																			
+
$A???@AA@?Lo���`D>?@@@@????=R�n??@@???@@@@@@>Hpie}�^>>??>>??@


+
+													
+		
+																				
+

3A??@AA@@@Jg{��sUD????>>>?HnvvL=?@@@@A@@@?BTrqs��jF?????>>A5

+
+
+
+												
+
+
+	
+																	
+
+
+
=@??@AA@@?ANax��n\PIFEFJViiQchI>=??@@@?@Pl{|���dF?@????>>@ 
+
+
+
+
+
+												
+
+																		
+
+	
+
)A??@AA@???>ASr�vrnhhlopdNGMimXHA??@BRgvu~��jRB@@@???>>A3

+
+
+															
+	
+
+
+														
+
+
+
+
8A?@@AA@??@>?Or�vjijjhdSJHIIL]kojcadinlu��qUD at AA@????>@=

+
+
+
+
+						
+			
+
+
+
+
+	
+																		
+
+
!@@?@AAAA??@?>Ll|kib\bUMHIEDHO^ghghfgx��gK@?A@??>??>@@$


+
+
+	
+	
+					
+
+	
+
+
+
+	
+
+												
+			
+
+
+
0B??@AAA@>@@?>G_x||rs|uhWLHLV]]_`ejy���`F?@A@??>??>@A*
+
+
+
+										
+
+	
+
+
+
+	
+										
+		
+
+
+
+
+
;@?@@@@@@@@@A at BNZ_bglrvoZXjqxz������x\C?AA@@@????@A*
+
+
+
+
+											
+
+
+
+	
+													
+		
+
+
+

#@??@@@@@@@@@A@@??@DLZiswu~~��~xncYNIB?@A@@A@???A>%
	
+
+
+		
+	
+					
+	
+
+
+	
+													
+	
+
+
+
+
+

-A???@@@A@@@@@A@?>==AGRl}q_]YSLGB?>>@AA@??@???A< 

+
+
+
+
+
+	
+		
+						
+
+
+
+																
+
+
+

5A??@@@@@@@@@@@@@?><<>RmhPEA>==>?@ABA@??????A7

+
+
+
+
+
+
+	
+		
+				
+		
+	
+										
+				
+
+
+
+

:A??@@@?@@@@A@@????=;FSZVB<=>??ABBA@?@@?>?A1

+
+
+	
+
+
+
+
+	
+	
+				
+
+
+												
+			
+	
+
+
+



;A???@@@@@@@AA@@@AAAezmQC>@@AAAA@??@????A-


+
+
+
+
+
+	
+
+
+
+		
+
+			
+
+															
+
+
+
+
+
+



9A????@?????@AAABCF���SBAAAAA@??????>@@*


+
+
+
+		
+		
+
+
+		
+
+	
+	
+
+
+							
+						
+	
+
+
+

1?@?>???????@AABABj�kEAA@@???>>??>?A=$


+
+
+
+
+		
+
+	
+
+
+		
+
+		
+
+
+			
+	
+
+							
+
+
+
+
+

!8A@?>>????@@@@@>AGB?@@@@????>>>@A7




+
+
+
+				
+			
+
+		
+
+	
+
+				
+	
+				
+
+
+
+
+
+
+


'9 at A?>>??????>>>>?>??????>>>@A<)


+

+
+
+
+	
+							
+
+
+	
+
+
+		
+
+			
+				
+
+	
+
+
+
+
+
+
+


$3=A@@?>?>?@@>?A@???>??@A@:*



+
+
+
+
+
+
+										
+
+
+
+			
+
+
+
+
+		
+		
+	
+
+
+
+
+
+
+
+
(5<?@@@@>51.3>BAA@@?<2$




+
+
+
+
+
+
+	
+										
+
+
+		
+
+	
+
+		
+	
+			
+
+
+
+
+
+
+


$&'"?C!$)*(&

+


+
+
+
+
+	
+
+								
+	
+	
+
+	
+
+
+			
+		
+	
+
+
+
+
+
+
+
+
+






9M$




+
+
+
+
+	
+		
+	
+					
+
+
+
+
+
+		
+
+		
+
+
+
+
+
+
+
+
+

+
+







+
+
+












+
+
+
+
+
+
+
+
+
+	
+						
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+
+
+
+

+
+						
+
+
+
+			
+
+
+	
+








+
+
+
+
+
+
+
+	
+
+	
+
+		
+			
+		
+
+	
+
+
+
+
+
+
+
+
+
+
+
+

+						
+					
+

		






+
+
+
+
+
+
+		
+		
+
+
+
+		
+				
+	
+
+
+
+
+
+
+
+
+
+
+
+
+				
+							
+

+
+



+
+
+
+
+
+	
+
+
+			
+
+	
+
+			
+
+		
+	
+
+
+
+
+
+	
+
+					
+
+
+									
+
+

		

+
+
+
+
+
+
+
+	
+
+
+				
+
+
+
+	
+
+
+
+
+	
+
+			
+
+
+				
+
+								
+

		

+
+
+
+
+
+
+
+	
+
+
+					
+
+
+
+	
+
+
+		
+	
+
+
+

+											
+
+

		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+		
+
+
+
+

+														
+

+		
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+



+																	
+
+		

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																								
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+																									
+	
+
+


+
+

+

+
+


+																								
+




+




+																					
+






+																	
+


+							
+	
+		


					
+
		

+	







		
+


".674'
		


	
	

			(<??>??6


	
	
+	
+
+

:>>>=<??8
+

	

+			
+
/>;#'<$+>>1
	
+

+
+


+		
+%<>)
+=)1><#

+	


+
+

+		
8>66?49=2
+		

	
+
+
+			1=>+.>71<;

+					
+
+		
+
+
"<=;''>75;=,

+			
+	
		

.=<80?:*.:;=7
+

+		
+	
			


	5=<5
7>=77<;<;

+

		

	
+		
+
	8<<3 :>=8/3;;<


	



+

	
+	
+
+
	


	:<=2
+=>=5!.<;<


	
+
+	
+


+



+	:<<:5=>>13<;<
+		



+	
	

	
	
<<<<5!;<>>.;;<=
+
+
+	
+
+	



3>=<<:2=<>=+$=<=>-



+		

+			


-7=>??>=<=>=<<=9.<<=<)1=<;=>:6541.(
				

+
+0=?>>>>>>>>>>=<=>8,6<><8;=<<==>????@@?:.

					




8?>=====>>>>===>G><;6<?<<<>C<==>>>>>>>=>?<*


					


+
+



C<;>==<==>>=>>>=<>UG<==9=>;==;PM<=>>><<>>===>>1


+
			



	
C@>=====>==>>>=>H\]?>B=7@>:>A<FgUD==>=;<>>>==>>5
+		
+
+							
+


+
%<==<=<=>=<=>=<CUQbK<FE<6G?9 at J@A=0KN>>>=<=>>==<=?7			

											
+

=>=<<===>>==>CKR-AE=KE<4R;9DK>9 7L?===========>6
+


+														
+

	
9>=======>==DPK5	%E>=HB;3U6<EG8,
+*HHE@==>>=====>3		


+																		

		
+5?=<====<;>CMK/
+1G:=GB;3H5>EG4.*	
+*=BHJC=;<=====>+	

+																				
			
+0?>>====;?OZX=
+		!B:?GA94D7>FE:97
		
++H[P>=>=<=>>4

																					
+	(?>>>>==;LlW/

					'? ;B?84B:>CB5(>				
+
0oe?;===>>J<

+	
+																	
+
<?=>>>=<Jwp&						2B$9>?96?==<@5
? 				
+
+		>paH:===>?'		
+
+
+
+
+																
+	
4?>=>>><Ge{r.							.F99=?<<>=>;93
C*							
+
TVkL:=>=>:






+																		
#>>=>>==?YgugV'							(G<;=?=<>==?60#F%
+							,dFZkG;>>>@6		

+
+
+																							
+	
+4?>>>>==I^]Q;@K"
+				B:8?B==?=>A9::C	
+					
7Lgooof==>>??&
+	
+

+
+																													
+
+

=>>>>=>@QM>;<<@F	
+
+			<64?A==@=>@=<>;
	
+		
+
+
C@;=GdsnH<>>>?4

																															
+
	,?====>?BI@>;<=<L'
+
+			;96@@==?==?<:>)		
+			?A=<<;=erW;>>>><

																														
+

5?>>>=>@@>>=<==<D:
+	
+
+
+	B?:D@>>?>>@=8>
				
+F===<=<Mue>>>>>?"	
																													
+

<>>>==@??>><=?==@D	
+
+
+
MKAC>>>?=>?A9A					
C===>===fsD=>>>@*

																																


"?>>>=>?>?>>;?@>>>K56`PA?>>>?=>>ACO					+A==>@==;GhK=>>=@0

																																

+@>>>=??>>>=IJB?>>AF>).NVMA>>>>A<>>>F_9	A?=?AA>==<BE>>>=?5

																																		
4?>>>>?>>>=@jNB?>>>=FJCEWdOJ?>>>=@=>>>COTT3&&*4@>>>>ALJ===>>>>>>?9
+
																																					
;?>>>??>?>=DyP?>>>>==AFJXnU>>?>>?@>>>>>GaeZOHKK@=>==@EM>==?>>>>>>=
																																			
#??>>>?>>?>=KnC>>>>>>>>=<OiU=??>?@>7>>?>BgN>CC@>=>>>>>>A>==???>>>>? 
																																					
.@?>=>?>>?>=M`=>>?>?>>>>BOLM<>@>3:9)9?>9F_S>?>>>>?>>>>?@>>>???>>>>@)

																																					
+8?>>=>?>?>>>CI>>>?>>>>>@PH=I9;:2'66466//OHLD>>>>>>>>>>>@>>>>???>>>@0
+																																				

=?>><=>>?>>>=>>>>????>>FR??F9068:<:<<;9>J?@P@>>>>>?>>>?@>>>>?>?>>>?6
+																																	
%@>>>=<>>>>>><=>>>?>????ND>@?<;;<<;;;<<=??>>RD>>>??>>?>>?>>>>?>>>>>?9
+
+																																								,@>>>=;>>>>>==>>>?????>@K??>>>>;=<;<=>>>>?>=RK>>>??>>>>>>>>>>??>=>>?<	
																																								2@>>>><>>>>><A???????>=?C>>>?>>>>====>>>>??=UV=>>????>>>>>>>>??>>>>?>
	
																																								
+6?>>>>?>>>=;MI>??????>=>?>>>?>>=====>=>>>?>>EO?>?????>>>>>>@=>>>=>>?@!

+
+																																								
8?>>>>>>>=@gzG?@@@???>=>>????>====>>>>==>???>=>>????@??>>@HWQ@>>>>>>@&

+
+																																									
:>>>>?>>>Dm�~E?@@@??>>>>????>>>>===>>?>>>????>=???>?@??==@GUaC>>>>>>@+
	
+																																										
;>>>>>?>=YuUuY>@????>>????==>>>??>=>??>>>>@??>=>????>@@>>LX\cJ>>>>>>@,
	
+																																								
+
+
<?>>>>???InVWoH????>>>???>8>>>>>>>>>===>>>??@?>?>=>???@ESj\SUJ???>?>@-
	
+																																							
+
+
+

;??????@@?RmdqX>?>>=??>>>?>>>?@A<DYREFLB>?@????@]P>>@HZvmf^PRB@????>@1

+																																									
+5?>????@@>?FTUE=>?><B@==>???@AFHKeh_acgXEA@?>>>=YgA>KYbkcbeVI?A@@?>>@3

+
+																																								
+
2@>?@??@@@@>=<>>>>>=@?=?A@@?DOYislUQcfieWIAA@>>HJB??LNRW_`VG@>=@@?>>@*
+

+
+																																							
+
2AAA at AA?@?>>>?>=;;=>????AA at ANY\WLIGDBAKTVWFAA@>Qe;=?@HOOG at AA@??@????@$

+

+
+																																								
+ =?<=AB@??>@D<<@OVaXE?@@@ABTTOF at HU\\]UJJKV\FB at 9Cz_=<><>BSWA?@BBAA@?>@&

+

+																																										
+


'=ABA at A??MCYt��xK>>@@@>F[D at MggVJIWci_EDS]Q?@V�uSQhz}|U===;75;@A@@)



+
+
+																																								

%@@ABAB@>Op�wny^9=???L?<Q^`hUB>>>>?D^aEPTaBAgj�����uX*$8@=




+
+
+																																							
+

	:@@@B@@]����kb]KA?==JL=;\`D=??????>?`wdKaFHuZZ����I
	


+




+
+
+																																								

+	
+-BA@@GgR>a�^ZUG]b?>=@aXRE>>????????>@c|o]BNg^Yku���W5

1:;3#

+

+
+																																						

		
+0CA at KS]-G�cbORe\???>g|zI=>??>????>???VfVDOhc6BLc�~qwyT8?AABC at 1	

+
+																																					
+
+
	=C at Ck06cbJUldUH>=>>=NvkA??????>?????>=ABOcq717DN7/BSdrM=@AAA<	

+
+																																						
+
	-CB?O�fEMR
NC>>>==>DINF>???>????>??@??>=A\o
>89 at J=231OlK>?@A>	

+																																							
=B@@e�aX\S0C>??>=BPcOA>????>????????????=@\X<24(6@*38/*RyD=?A?	
+
+
+																																						
'<;58?@@BwUKU8CO@>?@??GQRF?>?????>?????@?????>=>HRRE@(2'%2P\@?@?'. 
	
+																																					
;@?????@D|pSSYKDI?@@?>?GIHA=>?????>>?>???@????>>>?>>BIP9'<8'
eL?@@36AA=

+																																						>?=>=>>?D}sWZUaV??@@?=>??>==????@??>>>?????????????>>==C at 4G"
$Q�_>?@@@>>A+
																																					:@>9;>>=B}yad]aRA at A?>>>=>>>>?????@?>>>>???????>????>??>>@JJ

P�k<?>?===@0
																		
+																	 <@>4<?>=?z�fjb^]NLD>>?????????@???????>??????>>????????>>>C#+&4�j<>?:;=>@-
																																				 =?==??@?;e�yr\VZ_YD>??????????@??????????????>???????>?>>>=U>0Jt�]<>?*7>?;

																																			
+/>6=??@?<H��xeXUd]@?@@?????????@??????????????????????@??<IYj�G=??<=?>$
																																		
+


>?>?>>=i�vpfap_??@@?@@@??????????>?????????????????@??<UX

	de:>???>@7

																
+																	
+


=?>?>>>Dkt|zt�gA?@@?@@@?????????>>???????@???????????>>]o+)|G=@?>?>@:

+																
+																
+
+

8@>??>?=BTiz��sE?@????@??@??????>>>@??????>>???????@@>MnblL{g<>??>?=>@6
	
+
+														
+																
+	
+


+A>>????>?DVizrL=????@@??????????>>??>????????????@@?Aotj��|E>>>?=@1%0"

+
+																																
+
+
+


>?>>???>>@CNqq[???>??@???????????>>>?@???????????@@>U�����K>?>>>=A(
+

					
+									
+																
+
+
+
+

.A>>????>?@HgumG=??????????????>>>=>@@@??????????@@Bn���}M>>>>?>?A


+							
+								
+															
+
+
+	
+

<?>>??@?>?AXun[A>@??@????@@???=BG=@@@@?????????@@>Woq�tX=>>=>>?@;

+																	
+																	
+
+
&@>??@@@??>JsunZA>@@@@@??????>?`b@@@@@??????@??@?HpavyND>>>>>>?B-
+
+
+													
+	
+																				
+
4A>?@@@@?@A\vov]B>?@@@@?????>N�uA?@@?@????@@@@?Flaa�`>???>>>>@?

+
+
+																																				
+
=@??@@@@@@B[y��fG>>?@@??>>=Cg{L=???@@@@@@@@>Bid^�xF=@?@>>?>A2
+
+														
+
+
+	
+	
+																	
+
%@??@@@@@A>D^p~�qUE@?>>>>@DXtaqcB>?@@A@@@@?>Fetm��T>@???>>>?@


+																	
+	
+																			
+
3A>?@@@@?=?@FQh��ucYSPQQYbn^KYpYD>>?@??>?F]|���wV@@@@@??>>A3

+
+																		
+																			
+
>@??@@@?<??>>E^��~tsrruxk]HHJ`pbQFA@?BK]t���uaI?@A@@???=??

+	
+																
+																			
+	
+
*A???@@?>=?@?>C[{|romkkdSKHHFJ[nqi`]]fr}��w[G@?@A@@@??>>A0

+
+
+
+														
+	
+																
+
+	
+
9A>?@@A@>>@@?>AWpysniilg]PKHLMXhqtuwvr��pP@?@AA@@@???>@<
+
+
+
+
+						
+					
+
+
+	
+
+													
+
+	
+	
+
"@??@AAA@>?@@?>@ManqkimqtgRQbijmpdbn{��fK?>AAA@????>>?@"


+
+
+										
+
+			
+	
+
+
+																	
+
1A??@@AA@?@@@A??DLMNPOS_rjlvww}||���v\D=?AAA@?????>@@'
	
+
+		
+									
+
+		
+
+		
+															
+
+
;@>?@AAAAA@?@A@?>=<=>@D]srjdcecc`WRHA=>@@@@@?????@?&
+
+	
+													
+
+
+	
+
+																	
+
+
$@???@A@@AA@??@@@?><;<=CW`NEFD@><<==???@@??@??>?A<!
+	
+	
+													
+
+	
+																		
+
+
+
/A???@@@@@A@@??????====AH><;:;=>>?@?@@@@??@?>?A8

+																		
+
+
+																
+
+
+

6A>>???@?@@A@??????>>==<=<<<>?????@A@@????>?A3
+
+
+																	
+	
+											
+		
+
+
+
+
+

:@>????@@@@A@@???@@??DI@=>@???@@@@@@????>?@.

+
+
+
+	
+		
+										
+												
+			
+
+
+
+
+
+


;A?>??@?????@@@AAAAAd�gBBBAAA@@????????@@*


+
+
+		
+
+
+
+					
+										
+				
+			
+
+
+
+
+
+
+


8A?>??????@?@@AAAAA^{^ABBA@@@???????>@?'



+
+						
+
+
+			
+
+		
+
+
+					
+	
+			
+		
+	
+
+
+


0?@>>>???@@@@@@@@?CIA?@@@@????>>>>?A; 



+
+
+
+							
+							
+
+			
+	
+
+		
+		
+
+
+
+
+
+
+

!6@@?>?????@@@????>????@@????>>>@@4




+
+
+
+
+								
+			
+	
+	
+			
+
+	
+			
+
+
+
+		
+
+
+

%7 at A@??????>?>??????????>>??@A:&





+
+
+
+	
+									
+		
+
+		
+									
+				
+
+
+
+
+

 /9?AA@@??AAA<>BA@????@@A?8'



+
+
+
+	
+						
+	
+					
+		
+
+	
+
+				
+		
+		
+
+
+
+
+
+


 -49<=><5.6-.9>???>;6- 



+
+
+
+
+
+	
+						
+	
+
+			
+		
+
+
+
+							
+	
+
+
+
+
+
+





+
+

!OJ









+
+
+
+
+
+
+
+								
+	
+	
+
+	
+
+							
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+	
+
+
+
+
+



4B






+
+
+
+
+
+
+
+
+
+							
+
+
+	
+
+					
+
+
+
+
+
+
+
+
+
+	
+
+
+								
+
+
+
+
+
+
+




+

+
+
+





+
+
+
+	
+
+
+
+
+
+
+						
+
+
+
+
+
+
+	
+
+
+
+			
+								
+
+	






+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+		
+		
+
+
+	
+
+
+
+
+																
+
+



+
+	
+
+
+
+
+
+	
+
+		
+
+
+
+
+				
+	
+
+	
+																	
+
+


+
+
+			
+	
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																	
+


+
+
+
+	
+	
+			
+
+
+	
+
+
+
+
+
+
+
+														


+
+
+
+
+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+										
+


+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+																
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																										
+
+

+
+

+

+
+
+
+
+
+
+
+
+
+

+																																
+	
+






+
+
+
+



+																														
+









																												
+






+																								
+
+
+
+
+
+																																	
	

				

+

			



+


			

	(24/

	

				
+

	

5??=?>/
+




+
+		

+
3>>>=>??0

+				
+
+
)=;&*=/0==)

+

	
"9>&
+$< 1>:


	

+
#8<-4>/
:>4

+		
+	

	
"8=0

:>8!3==(

+	



+
+		
+
+
+

)>8%
6?6%+5;=8

+				
+	
+

	
6>4!4?9+5:;<= 
+
	
+
+	
	
+
+
+
+	

+

+
<=47><9:<<<>'	

+



+




+	
+

	

+"==9!;?=2.4;<>+		





+
+



+


+#=<; $>?>6(#8<>*		
+
+
+

+
+
	
	


+	"=<<33??>1(;<=%	
	

	
+
		
	
	#><<=7-<=>>/
;<;="

		
+


+		
+	4><<<<:=<>>0#=<<>,
	
+
+	
+
						
+
 -7<>??><:=?=<==82=<=>2.>=<==2.130.*"
		
/=?>>>>>>??>>=<=>5,<=>>78=<==>????@@@?<2!		
+
+


+

9?>===>>>>>>>==<C?93<B>>9;?><=>>>==>>==>?<+

+		


+	
+
+?F<>=<<===>>>>>>=<KM:=<@MH?<<?SA<>>>>==>=<==>>2



			


	
9A=>=<===>>>>>==@QaD=>=@VM;<=;TfM@=>>=<==>===>>5




+						
+

	
#<==;======>>==>Q_jR;A@<:XE6>?<ILDUK=>>=<<=>==<=>7

	


+										
+

+
<>========<==?ETC&FG;CD<4Q:9BB=>DJ>=>=<=>=====>5		
+

+													
+


7?=========<>IOC'
>?=FD<1C4=DC9::QJA===>======>.
+

+
+														

	2?>=====<<<=CQG"
A=>EA<2<6>FE8=!	
+$EQMD><======>=%		



+																	
		+?>>>===<;=HUV:		?4>D@<3;7>IF88*		'@IPOA;>====>?2
+

+																	
+
$>>>>>>><;GXT@%			
@.>C@;4=9>EC:/1
			 $KqU<====>>K4

																		
+	
;?>>>>>>=Qn\)					'D:?C@<;><>BC=06				
+
+	
X{N;<=>>>>"
+
+
+																					
+
+
1?=<>>>>=Di_!					)G=?C@=>>=>AB?4@								5]gV;<=>>>8

+
+
+	
+																						
+

 >>==>===?K]X\K					D==CB>=>=>@@?:K!							
?ZGjW;=>>>@3
+		

+
+																									
	2@>>>===>>>@<;K>
	
+	
+
+A==BA>>?=>@?==G							
)?ZqacpI<>>>?>"
+


+																											
+
+

<?>=>=>@>=>?=<<O&
+	
+
+=;=BA>=>=>@?==<	
+				
+3F>;G\vtZ<>>>>?2

+																														
+
)?>==<=@A>@?=<=<E>
+	
+	
+?:=DA>>>=>@@=>1
	
+			
I==<;:L{iB=>>>?;
																															
+

5?>>>=>A@??><=>=>F	
+
+	B:>C@>>>>>@@=>+					
++E===<<;\qI=>>>>?"	
																																
+

;>>>>>??>>>=<>>==H(
+	7J=@B>>=>>>>@==%			
+		0@==>====UM>>>>>?)


																														
+

#?>>>>??=>>><=@>==KG$	
++JWACA>>>A=>>A>B-				<>==@><==AE?>>>>@/

																																
+
+@>>>>?>>>>>?DC@>>?EG;&#:OFGB>>>?B>>>@FLP

++E=>@CB<==>???>><?5
+
																																			
+
4@>>>>?>>>==ZRB?>>>=EJJM`jUD>>>=>>:>=>IPYg<'&.?E>==?DeO<=>???>>=?9
+
																																			
<?>>>>?>>>>>se@?>>>>=?DLom\>>?>;=?8>>==VmQLRQMF=>==>@S]=>>??>>>>?<
																																	
%@?>==?>>>>>Au[=>>>?>>><E[XW=>??9;<8<?>=ESH<>>>=>>>>>>CJ>>>???>>>>? 
																																				0@>>==?>>>>>GuH>>???>>>AMB<F=???.5908?>=EAGB>>>>>>>>>>@?=>>???>>>>@)

+																																	
+:@>>=>?>>>>>GlC>?????>?PJ=@K78:689:56::;RGAK>>>>>>>>>>?>>>>??>>>>>@1
+																																	
!??>>>??>>?>>E]@>?????>BRB=@B8489<<;9;;;=D@>JA>>>>>??>>?>>>>??>?>>>?7

																																					
)@>>>>??>>>>>EO>>?????>GN>?@>;<<<;;::<<<<?>>CD>>>>?>>>>>>>>>>?>?>>>?:
+
																																									1@>>>>>>>>>>=KH>??????>AA>?>==>=<:;;;==>>>>>AH>>>???>>>>>>>>>?>>>>>?=	
																																						
+7?>>>?=>>>>>>\D??????>>=>?>>>>>>=<<<==>>?>>>AO?>?>???>>>>>>>>?>>>>>??	
+
+																																								
:?>>>>>=>>=;Yi???????>=>>>>>>>>==>====>>??>?@UA>??????>>>>>>>>>>>>>>@%

+																																									

<?>>>>?>>>=^�a>??????>>>?????>====>>>>==>???>@>>?????@?>??===>>==>>>@+
+
+																																								

=>>>>>??>>cx}_>????>>>>>????>>>>>>=>>?>>>????>>>?????@@??>EMQB>>>>>>@/	
+																																										
>?>>>>?>>D{Yen?????>>???>>=>>???>>=>>?>>>=?@?>>>?????@A@>Kj^bQ>>>>>>@2	
+																																							
+
+
+
 ????>>>>??fiYqE>??>>>>?>?=;?>???>?>>>>?>>>>???>?>????@?>Af\JUP>>>>>>@5
+

+
+																																						
+
+
=??????@A?EgreA=?>==>?>>>?>>>??>>?B@==>>>>?????>B????>Inlt`NRC?>>??>?8

+																																								
+
+
:????>??@?=?D@>>??==>>=>?>>>??>=>GUOB>=?@?>??>>>PJ=?COenaddUF?@@?????8


+
+																																						
+
+
9>?@????@@@>==>=>==>>>>??????>?IU][Yb]QE@?@@?>>CGA>>FXYW[\RF?;?@@???@0
+

+																																								
+
+
3 at B@A@???@?=>?>=<<>?@???@@?>>@Pjnm`^idaQHA at AA?=FN;=??CJPJA@@@>?@@?>>@)
	

+																																									
+
+
4>>?A@>??>>>>=@NFA@@@@@AABLQPRKIYmhRDHTQMCAA at 4=jU;<>=<<DQ@?@@AAAA?>@(

+

+
+																																									

+.>?@@???>>=;DiuPE<>?@@@AQTDADTbbYZhmaNDP[E?>=H�lPGK]ljJ??A>7++;AAA*


+																																										

%>?A??@@@?>I`w`ND<=?@AFDRXLPgjUD??ESaj]UVCLD<G`|������[131)
	
+7AA'



+
+																																									

2 at B@?@@ANi��lELQMD??>NSHPehUB>?@??>>DhuJ at TW<FOJ������6
 	++

+
+
+																																								&,!
=BA??IiWavoCESPXgE>=DeN;A@>????????>FyqWO^>Dgoup����r=-<?8


+
	

+
+
+																																						
+/4&<CA at Jrr4-agE[MHWy\=>=ajE=>?????????>=U�sh^LdN)(@m��y��d?@?@C<'		

+
+																																					
+47&"AC@@hx:BUamY_]WY`cO=<Tc]A>??>>>>?>?>>=SmoN_a*
;UcH8:Ke`H>?BA>%
+		
+
+																		
+																		
+
36&5BA?Hvf9:ZVLLbZOILXe^RNAK@??>?>>>>>???>=AE@[T&'78?@)?vN>@AA9	

+
+																																						
7;44?@@?U}TWUXRFQOEEDIWgx�VAB?>>>>>??>>??@??>><Co=/8/ 04
('&]G?@B?

+																																						0@@????@?cuUNRYETRFCCDIZjmzlI@>?????>????@?@???>=McN?("(>5#/-5Qd@?BA
	 

+																																						;A???>>??ix]V[XSYMECFJWntroaH>?@@??>>????@@@????>=@JSZN
91
. 
 mM>AA/->A:

+																																						9@>>>>??>a{_`aVXWLLJOSagda_M@>??@?>>??>?@@@????>>?>>=>B=#
O-,e�Y=?@?@?>B-
																																					7@?;=@?>=^�hh\TZTV`WPIHGHHJC=>@?@@???>>?@??????>??>??>>@AKS

	6�Y<>>?>==@3																	
+																		%>@><>?@?=R�yb\RVWgaPC>=>>>?>=>?@@@??>>?????????????????>>@L
}P=??;8=>A2
																																			
+=?>>??@@=BPbVXXpmM>>??????>>?@@????????????>?????????>>=U`31Sp�E=>@-0>?>$
																																				*8/=????>;c|Kjhah{lG>?@@?@??????@??@???????>>????@@???@?>Cb\!#�i;=>?=<??2

																																		
+

??>???=FdId{t��eD>??@@@????>>?@????????????@???@?@???=JeK&�M;?@??>??%


																																		
+

>?>??>>=CDPgr|�dC>???@??????????>??@??>>?@????@@?????=Wch;/mu>>@@????@1

+																
+																		

9@>??>?>?@AHT_|fC>???@???????>>??????>>??@???@@@??@@>Gte[v��K=>??>?96>1

+
+														
+
+																		
+


-A>?????>??@AMqoG=???@????????>>??>==>?@@@@@@@@@@@@@>a�}mz�O>?>>>=A2

+																																
+
+
+
+

??>>????>?A at Gg}[@>???????????>=<=>><?@@@@@@@??@@@@?Gw����R>?>??>>A+
+

					
+										
+																	
+
+
+
/A>>???????@B\wjL>>?@@???>???>==GXO>?@@@@@??????@@=Zu��mM=?>>>>>?A 

+																
+																			
+

<@>>??@?>??>OqueI>>@@@@?>>>>>BPg}]??@@@@@?????@@>Hst�dA=??>>>>>@<

+
+																																				
+
%@>??@@@??@?CartgL@>?@@@>=>>@Mmt}d@?@@@@@@??@@@?Bes|yL<=?>?>>>>A.
+
+
+													
+
+
+																		
+	
+
4A>??@@@?@A>Gdz�sRC?>>>>?@CK^tdnpI>?@@A@@@@@@?Bamq�Z>=?@?>>>>??

+
+
+														
+
+																	
+	
+
+
=?>?@@@??A@>K`nzu]MDA at BHLR`mfO_y^C>@@@@@@@?>C_ii�mC=@@@?>>>>A2
+
+
+															
+	
+																	
+	
+
&A???@@@?@A?>@EUp|wjb^`egpzqTM_twYE???>>>?CSq��kI>@A@@?>>>?@

+
+
+																
+	
+																
+		
+
5@>??@@??@??>=?Lk�����}��|cOP_ewscPEDCGL[s��q[D??@@@??>>>A2

+	
+																	
+																			
+

>@??@@???>???>>HaryzzvzwjdWPU[entqighny���bLB>???@@@?>?>??
+	
+														
+	
+	
+																	
+
+
+
+B???@@@?>?????>EXjspnjnnodVZbdaht{����tWB=>@@@@@@@???>B.
	
+
+
+												
+	
+	
+
+																
+
+
+
9A??@@A@??@@@??>AKW[[YZalocbornootx|wfM@=?@@@@@AA???>@:	
+
+								
+
+					
+
+	
+	
+
+																
+
"@???@AA@??@@@@@>>@A at BBENdsqhhd_cnpmcTE==>@A@@@@@?>??@?
+	
+										
+
+
+
+
+	
+	
+
+
+																		
+1A??@@AA@@@@?@@@?>>>====Ha]HFDHL[^VL?<=>?@?@@?@@???@@%

		
+											
+		
+
+
+
+																			
+
<@>??@AA@@@????????>>>>=FE=<<;;>>=>>??????@????>?@>$
	
+													
+		
+
+	
+																	
+
+

$@???@@AAA@@?????@??????>====<==??????@@??????>?A;

+	
+																
+	
+																	
+
+
+

.A????@@@A@@??????@@???>>>>>>>?@?>??@??@?@@?>>A7

+
+																
+
+
+
+																
+
+
+
+
5A?>>???@@@@@@????@????>?????????????@?@@?>?A1
+
+
+																
+
+	
+														
+
+
+
+
+

9A>>???@@@@@@@@??@??@@BA@@@@?@@A@??????>>?@,

+
+
+		
+
+																												
+
+
+
+
+
+
+

:A?>??????@@@@@@@@@@CNEAAA@@@?@??????>>@?'


+
+					
+
+																					
+			
+			
+
+
+


6A?>>??@???@@@@@@@@@C at AA@@@????????>>@=$


+
+
+								
+				
+			
+
+													
+
+
+
+
+
+


-?@>>>???@@@@@@@AA@?@@@@@@??????>>?A9

+

+
+
+
+					
+							
+	
+
+					
+
+				
+
+
+
+	
+
+
+
5@@??>????????@@@@????????>>>>>@@2





+
+
+								
+						
+
+	
+			
+
+						
+	
+	
+
+
+
+

#5?AA@?????????@@??????>>>??A at 8%






+
+	
+									
+					
+			
+	
+												
+
+
+



)3<@AAAAABBA??BBAA@@AAAA=3#
	



+
+
+
+												
+			
+	
+
+
+
+
+													
+
+
+

+
$,157750)-,)169:984.&
+



+
+
+
+
+
+	
+											
+	
+		
+
+
+
+
+					
+
+
+
+
+
+
+

+



+		
+


;7

+
+
+
+
+
+
+
+
+
+								
+	
+
+	
+
+
+
+
+
+	
+
+
+
+
+								

+
+
+
'&



+
+



+
+
+	
+
+
+
+
+
+
+										
+
+



+	
+
+																		
+
+		
+
+				



+
+
+
+		
+
+
+
+
+
+	
+			
+		
+
+


+
+																		
+




+
+
+
+
+	
+	
+
+	
+
+
+
+	
+	
+
+
+
+																		
+



+
+
+
+
+
+
+
+	
+	
+	
+
+
+	
+
+
+
+															




+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+													
+


+

+
+
+
+
+	
+
+
+
+	
+
+
+
+	
+	
+															
+


+
+
+
+
+
+
+
+
+	
+
+	
+
+
+
+
+
+
+																
+




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																						
+
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+																																				
+
+
+						
+
+
+
+																																			
+
+
+					
+
+																																				
+
+																																																																																																	
+


+
+
					


		
+

+
+
	
+
+
	
+
+

		
+#'

+

+		
+
	
$9>>=4		

			
+
+
$;?>=>>9
	



		
+
3>69==<?5
+


+	
+
+
&.2>.3;*


	
+

+
!%$6>)06(


+		
	
+	


+	 +(!;=4 #*4;'	


+			
+
+
+	
+

"8)/>>;1653=9

+



+		
+
+
+	
	
		
4<$#6=?;46:8<>&



+		
+

	
+
+	
+
+
	

+=; %4<?<88:<<>.
+



	

		




	
+'>=*"/<>>748;<=2

+


+
+	
+
+
+
+
+
	
			)==8
-=>=82,8<=2
	


+	
+
+		
	
	

+	

+			'=<=1##3=>>7
!9<>-
	


+	
	


+
	

'><<=>:<=>>3+;=<>)		
+	
+	



+	
+	

	
+5>=<<===<>>1+=<=>.
+			
+

					
+

)39<===::>?=<<==<<==>84==<><.'-10.,&
					
+-<??>>>>>>??>==<=><>MC><===<=>?@@@@?@?<3!				
+

+
( 6?>======>=>>>=<>A;7AYNA<>><=>>>=>>>===>?<,
			
+	
		


9K>>=======>>>>>=<@O?:7AaV at 9;JJ<=>>>>====<===>1
+			
		

+
6@==<<====>>>>>=<GcR9<=?\O86:Eh[E==>>====>====>4

+

+					
+


		
!;==<<======>>=<H[sg<;===TC2<99ODNXF=>==<=>===<=?6

	

+										


+
+
;><<<=====<>>=@OQCLL9=>=;H59?<<4
+
-RG==>=<>>==<<=>2	
+														
+

+	7?========<<=?IP>
3A;?B=7<4=?>=6
KWG>===>=====>>(
+	


+														

+
1?>=====><<<<CM8
+1=<@D>798>A>59	5RSF>========>9

+
+		

+															
+
		(>>>=>====;;ANQ1		;5;?D>;:9?C?47		

+<OOH?;<=====><.

+

+															
+
+
!=>=>>>>===>KZL*
		@9=@D>=<9>D?76$			"40CXZC<<==>>?K-


+																			
+9?>=>>>>==AQZ?					
B<>AD>?A<>D@;81
+					
	
)mpB;==>>>;


+
+																		
	/?>>>>====?JZ[3				
C<>AC>?B=>D?=<6
								Nxf@;>>>>?5

+

+																					
+
	

<>=<>>>>??@ADXG		
+	@;=@E?=?>>B?==D								Z]`c@<>>>>@/
+		

+
+																									

/?>><>=>?>>A?;>R'			
+
+	A=>?A>==>>CA==?					
+;KcnSfV<=>>>?=
	

+
+																										
		;>>><<=?==>@=<<EC		
+
+A<=?A><==>A@=>6
	
+			HD<<Nfpa@=>>>>@/


+																											
+
+'?>>><<@?=>?><<==J
+
+
+B:=@@>=>>>@A=>.		
+				4G<=;:>erG<>>>>?9
+
+																													
+
4?>>>>?B@??>=<==<E,	
+	/C;>@?>=>>>?A=?0						
=?==<<<@UG>===>>>!
+

																												
+

;?>>>>?A?>>>==>>=DB	+EH<>?>>=>=>>?>?1		
+
+@====<===?>>>>>>?(


																																

"?=>>>>@>>>>==?>>>BR8 
:LH=>>>>>A=>>?>?@
	
+
+
+#E===@<==>???>>>>@/

																																			

,@>>>>?>=>>>=?A???>ISB35BL?=>>>>>@>>>>>7M*@A=>@C@<=>?@?>>=<?4
+
																																
6?>>=>?>>>=<MPB@>>?=ELR[hnH<>>>>?=4>>>=:QjF%(3ID===?IcC=>>>?>>>>?8

																																

=?>==>?>>>><hsB?>>>>=>GhrmT<>>?79:,=>>=Eh^UPPIA=>==>BiO<>>?>?>>>?<

																															
(@>>>=??>>>>=lwA>?>>>>=@MBCL<>>@+2=8;>?:IUH=<===>>>>>?^M=>>?>?>>>>>


+																																		
+3@>>>>?>>>>>?o^=>???>>?KD<@I;>>:%.:84<?8LCAH>>>>?>>>>>TF>>>?>?>>>>@(


																																					
+
<?>>>>?>?>>>AqR=????>>KP>=CJ6697::9;::;;PG=JA>>>>>>>>>C?>>>?>>?>>>@1

																																			
%@?>>>>?>>>?>CmI=????>ARE>>@@:7;<<=<9;;<>B@>CC>>>>>>>>><>>>?>>>>>>>?7

																																						.@>>>>>??>>?>FfB>>??>?FJ?>??=;<<;;;:;<;<>???@D>>>>>>>>>==>>>?>>>>>>?;
+
																																					
+5@>>>>>>?>>>>OZ=?>>?????>??>=<=;;::;:<>>>=>??E?>>>>>>>>==>>>?>>>>>>?>
+
																																					
;?>>>?>>>>>>>fO=?>>??>>>>?>>>>><<;;<==>>>>>?>IB>>>????>>>>>>>>>>>>>?@ 
+
+																																						

=?>>>>>>>>><Y�G>?????>>>?>>>?>=>>=====>>?>>?>E@>>>?>???>>>>>=>>>>>>>@'
																																										!??>>>>>=>>=W�zB?????>>>>>>>??>>=>>>>>===????>@=>>?????@?>>=<<?>===>>@.
	
+																																							#@>>>>>?>==Yvjp?>??>>??>>>>>>>>>>>==>>>>=>????>>>??????@?=AMTP?>>>>>>@2	
+																																								
+%@?>>?>?>=;jh]n?>??>>??>>>>>>>???>>==>>>>>>>?>??>>????@@>=`vbdG>>>>>>?6
+	
+																																							
+&@?>???>>=;Q{me>>>?>>?>>>>=>>????>?>>>>>>??>>>???>????@?AImWO]G?>>>>>?9	

+
+																																							
+
$??>?????@??WkK==>?>>>>>=??>>??????@?>>??>>>?>>?>>??@??DuvlV^T@?>>>>??<	
	
+																																						
+
!?>?>????@@>=;=>=>>>>===>?>>>??>???@??>??@?>>?>??>>????[lZgeVA@@?>????<
+

+
+																																							
+
>=?>>?????@?=?>==<>>>>>>>?>>?>==<=??>>=>?????>>>>=>>>D]_``PA<;@@?????4

+																																									
+6?@????????>>?>=<=????????>>?@ERUKFJX_N?>>??@><<><=>>=@FG@?@?>??@@?>@*
	
+																																						
+
+;A at A@>>?@?>>?>@IB?@?@?@@AGMNOTZgmquse\RNKBAB at 36QQ=;=>>=<@??>?@A at A@?@#
+
+
+																																						
+
9A at AA?>?@>>>?>UdD<=>@@@APTIDABF\e_krXHCFQWD???@l�qVD=>I[B=@??=6*7AAA$
+

																																								
1;@?AB????==??E\L@==>>?EQUKCBCOkdG?APjocTSZB;>?@k����bMf`>?@<7/
1 at A"



+
+																																									

8><<?@B??@>DKJIIC?@@EG?>FTPV^almSA?@?>BM^j[>=GRI at Ld���|�c;977;<5$(

+
+																																									$?A?:<@A??>JlhfOA>AEFJdYBFWRcZhfM??????>><KY at TSW_^ef`q�����`><?@@A%	
+


+
+																																							
+(@@?8:@A?@Cf^NX^A at XTLMbrXFNklEAA????????>>=QakLT^WJ,
Erz�z}�jC>?@A3
	
+	

+
+																																					
+
*@A?8<A@??VoWQOcFALSNMQ_nRKwwF=????????>??>Ar{_eYEB f~`1%BaUI>@A@,			

+
+																																					
+
)@A@<?A??Ai\RSX_OMXWTQQWZnu�WD?????>??>>????SoqpkJ*!2+N1 %'sR>ABA'
+		

+
+																																						
'@@@?@???GsSOY^UX_f[WUWXHIfr at B@???????>>??@??CK\ch"-8*&

</G{G>AC:
+
+																																						/A@??>>?>P|^dfUSV_jb^[ZVOFVfCG@???????>??@@@==@FDK\U) ",*6/(�e>@C@
																																							4@@>>>??>R}joZNMUdm^aYRRQ`sdRM?????>>?>?@@@?>=?B@<>NUTJ$$;
*W\zyC?AA-(:>6
+																																			/@@>>??>>H~ydHSOYeydYVU\OPWQTH>?@?????>?@@@?>>?>>===>CIF+%*+.3R�E??@>?>>A-
																																				
8@?=>@??>Bx�QCTQWq}]R]cf^QVVXG?@@@>>??>??@????>==>>??>>CHK?4
U~C>?>?>==@5																																				&?>>>?@@@?<ezBK^]e�pRW`\UTRT\VD=????>>???@?????>>???????>=Nm6[p>>??:6=>A4																																			
+:?=>???@?<N`>Sijw�rZTLHC at BCGFB>??????????????>???????>>>AQcjJFh�`<=>@1&=??'																																			
+
!/*>???@?>AL at Lefr�kZNB@>====>@?>@??????????????????????>I`\eOAe�M;>??>:>@:

																																		
+


@>>???>>@A at MU`{dbL?>>>>>>==>>?????@????>???????@@@@?>Pk_h6=w}>=@@???>?:

																																	
+
+

??>????>?@?@CIhkmM?>??>?>><=>>?@????>>>??????@@@@???Bak]gjz�W<?@@??<;?:

+																																	
+
+
+

:?>??>?>??@@@@XuqP?>>???>>=>>>>>?>===<=??@@@@@@@??@>K{xeh�]>>>?>=?7!/$

+
+
+														
+																			
+

.A>>???????AA at JnsYC>>???>>=???@@@?CHD=>@@?@@@@@@@@@>\�����Z;?>>?>=@4



+																																			
+

??>>????????@C_|hO@>???>>>ACBELRZeqZ@>@@@@@@@@@@@?Dr��~pV>??>??>>B,


																
+																			
+
/A>>???@???>??PqrcL@>>>=>@CFIO_kmp~dB>@@@@@@@@@@??X�|sQB>>?>>?>>>@ 


+																																				
+

<?>?@?@?>>>=<EcpugNC?>=?EJOWaoljoviE?@@@@@@A@@@>Hm�tYB>??>>?>>>@;


+
+													
+	
+	
+																		
+
%A>>???@>??>==McuwfUJECFOY\gtwc]jytL>?@@@@@@@?>I]l|bE>??@>?>>>>A-
+
+
+											
+			
+																			
+
+
5A>>@??????@>?KVdlgaYTUahcjzzg^clu_H??@@@??>?JinjpL>??@@??>>>??
+
+
+
+															
+																	
+
+
+
+
>?>??@@???@?=<=DT^imnpuwfhrlmeb\mtbK@??>?AGXt�wxW???@@@?>>>>A0

+
+
+	
+													
+
+																		
+
+
)A???@@??????==<?GWes|}xdZ_aprdSauweTQSRUdv�~sdRA???@@??==>??
+
+
+																
+			
+															
+
+
+
7@>?@@???????>>==BL[dgaXKPVkzfRVl|~ww}~��kQFA>@@?@@@??>>>A/
		
+																	
+
+															
+
+
+
+

?????@@?>???>>?>=@JPLPJHINcwfUYhry}����z_E<<=>?>?@@@?>>>?=																			
+	
+																	
+	

-A>>??@?????????>>?BBDBCDL_qb^]cdgjmnkaO?<=>????@@@??>>>A*
	
+																
+	
+																
+
+
+
+
9@>??@@@?????????>>>>=>>AMg`SLMLLJKJGA<;==>??>@@A@?>>>@7
		
+									
+						
+	
+																			
+
"@????@@@???????@?@@@??>=>ML>=>>=>?=<==>>>?>??@@@?>>>@=																							
+																		
+0A?>??@A@?????@@@@@@?????>===>===>>>????????@@@@>>>@?!
																		
+
+
+																			
+
;@>???@A@???????@???????>>>>>>>>??>?????@@@?@@?>>@=!																	
+
+
+																		
+
+
+

"@?>???@A@@@????@?????????????????>???@@@@@@@?>>A:


+																		
+	
+																	
+
+
+
+
,A?>???@@@@@????????????????@@??????@@?@@@@?>>A5
+																			
+
+														
+
+	
+
+
+
3A>>>?@@?@@?@@????????@?????@????@@@@??@?>>?@/
+	
+																	
+											
+			
+		
+
+
+

6A?>>??@@?@@@@@@????@@@AA@@@@@@@@@@????>>??*


+					
+												
+											
+						
+
+
+
+

7A>>?>?@@@@@@@@@@@@@@@AAA@@@@@@????@?>>?>&


+
+																																
+		
+
+
+
+


4A?>>>?????@@@@@@@@A at AAAA@@@???????>>@<"


+
+
+										
+				
+
+
+						
+						
+
+
+
+
+
+


,?@??>>????@@@@@@@AAA@@@@@@?????>>?A9


+

+
+												
+			
+
+
+				
+
+					
+
+	
+
+
+
+
+

5 at A??>>>>???????@?????????>?>>?@@2




+
+
+														
+	
+					
+	
+									
+
+
+
+

"4>AA@?????????@@@?????????@A at 5!





+
+
+										
+					
+	
+	
+	
+
+
+
+										
+
+




'19?AAABBBBBBBBBBBAAAAA>9/!




+
+
+
+
+
+														
+		
+	
+	
+
+
+										
+
+
+


+

&+-/0/,*'%&*.000.+%





+
+
+
+
+	
+													
+	
+	
+
+
+


+
+
+
+
+
+
+
+
+
+
+

+
+

+	
+











+
+
+
+			
+												
+
+
+
+


+						
+			
+
+
+
+								









+
+
+	
+
+
+	
+		
+						
+
+
+

+			
+																			






+
+
+	
+
+
+
+
+
+	
+	
+				
+
+
+
+
+													
+
+
+		
+
+
+
+	
+	
+
+
+
+
+
+	
+	
+	
+
+																			
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+																					
+		
+
+
+
+	
+
+
+
+
+
+		
+
+
+
+															
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+														
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																	
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+																															
+	
+
+
+

+
+
+
+


+																																																																																																																																																				 [...]
+


		
+		







+
+

		



+

+
+
+



+



+
+
+	

%14/

+	




+
+

+
+
+*<=>>9#


	
+

+
0=<<=?5
+	

+
	
			
%;<:( 

+

+

	


+

+	
;=.


			
	

'==1"*	
+
+	
+

+
+	
	
+
+	

+ 
7=<<-/5153




		
+
			
+
+	
+	
		$/
0>===;889;;#
+


	

+
+
+	
+
+
+
+57
 8>=>=><96<>,





+
+		
+
	
	
+

+<=&
&:>>?><946==3
+	

+	
+
+
+



+
+	"==;.+;==?>;.%8==5


				
+	

	



	
+
+	!=<=<;>==>>>/';<>1

+




+	
+
	
	

+	
+	==<==>===>=====>,


+	


			
+

+
+
	


+


3==<====AB>><===>/

+








+	
+
+	
+	


+".59;=;:<??==<<===TS>?>===>=/&+00/+$
					

	(9???>>>>>>?><=<=>=CiaB?>==<=>?@@@????<2 					
+
0%2?>========>>>==<@?=JidK>><=>>>>=>>>===>?<+
+				
	
+
+
+
+	1M@>>======>>>>>><;IL=;FcZF<EO><>>>>>>==>>==>>0
+		

		



+1?=>>======>>>>>=AZbF<<A\O>;AbiPA=>>>>========>4


	


+				
+

	
+;=<<========>>=@OpxP;<<>M=238JHDVR@>===<=====<=?5
+

										

		
+:?==<<=====>>==DVXOR><===D3057;DTA<==<<>===<=>?/



+											


+5?>=======<<>=BQR,!5C:=>=;<4<<68


+'MK>==>>======>= 
	
+													
+
	
+/?>=====>==;;=EK0	,B;=>>;96>=82&		'NSE>=========?5
+			

														
+
	
&>>=>>==>=<=;=JO-

8@<>?>=;8>=;2-
+			&JOE=<<<====>>8*	
+
+
																		
+
+	
<>==>>==>>><EZU*	
+A>==?>>@:>==85		
>NSI@;<===>>AK'


+

+
+																					
+6?>=>>>==>=<DZU'

+
+C==>?==D=>>=9;					
;UfN<=>>=>>7


+																				
++?>=>>=>===;:H\E		
+A==>>==B>=>=8;"						
2gzL;>>>>>?1
	

+																			
+
+
;>>=>==>>?><:>QH		
+	A=>=>==?=>>=;>/							;twcC<>>>>>@+	
+

+																								
	+?>><==>?@@B><;AN 		
+
+	
D9:>>=>A=>>>;<4
							)EQ`kgU===>>>?<
	

+
+																			
	
+9?>>=>>?>=>A>==<N-		
+	
E:;===>D=>>>=?-		
+			-L>:=E]_B<==>>>@,

																					

+
$?>>>>>?===??===;E<
	
+)F<>>>=>D=>>>=@/					F?<<<<AYJ>>====?8	
+
+																														

	2?>>>>@@>>?>>====?J
+	:I=>>>==A>>>>=B<
+			
+D<==<<=AB??====>=

																												


;>=>=>@A??>====>=?P/
3NK=>>>=<B=>>>=CD
	
+
+	.B====<=>>???>>>>?'
+
																													

"?>>>>>A?>>>==>>>>=NI&&?KA=>>?<=C=>>>>=M	
+
+?@==>?<=>>>?>>>>>?-
+
																														
-@>>==??>>>><=A???>BUG77IT?=???<>H>>>>?6G-	-H=>>AB<=>>>??>>=<?2	
																																	
7?>><>?>>>>=BLB@?>?=AOW`mkH<???7?I4>??;7RbC'%7J?=>>AMU=>>>>?>>>>?6

																																
>?>>>>?>>>><Z|G?>>>><?bxklT:>>>3?D1;?=3>iumSJD>=>=>?Pn@=>>>??>>>?;

+																															
+*@>>>>>>>>>>=^�K>?>?>=BUH?QU:>?:&8<4=@7'T_SN?==>>>>>>NpB>>>>>?>>>>>



																																
6@>>>>?>>?>?=^yA>????=KI==GK;::.(7::99.-TG=I?>>>>?>>>FiC>>>?>??>>>@(


																																			

=?>>>>?>??>>=ek=?????BOA>>BD:799;97<;95<GA=CD>>????>>E_A>>>?>?>>=>@1

																																			(@>>>>>?>????>g`<??>??NJ>>?@?=:;;<;;;;;=>C@>@D>>?>??>>BG>?>>?>>>>>>?8

																															2@>>>>>???????lQ=????AK@>>@>==<;;;:889:<=>?@?C?>>>?>>?><>>>??>>=>>>?<

																																				
+9?>>>>>>?>>>>JoB>>????@?>??>>=<:;;98:<===>>??CC>>>>>??><>>>??>>>>>>??



+																																							

>?>>>?>>>>>>>me<>>?????>>?>=>>=;;;;;=>>>=>>??CD>??>???>==>>>?>>?>>>>@$

+
+																																							
!??>>>??>>>><Z�V<??>?>????>>=>>===<====>>>?>>??>>>?>????==>>>=>>>=>>>@+
+
+																																								'@?>>?>>>>>=Vy}K<??>>>???>>>>>>=====>===>??>>>?>=>??????=><<<=>>>=>>>@1
+
+																																							
++A?>>>??>>>Ly^sB<>?>>??>>>>>=>>>>>===>>>=>?>>??>=>??????=LbVID>>>>>>>@5	
+																																						-@???>>>>><P{^i>=>>>??>>>>>>=>>>?>==>>>>>>>>>>?>>>>???@@?]�zr\??>>>>>?9	
+																																									
+.@>>??>>>><@uX<9<?>>>>>>>>>=>>?>>>>>>>>>?>>>????>>??@@?YvfOiU??>>>>>?;	

+																																								
+,@?>??????><HX?:;=>>==>>>>>?>>??>>>??>>??>?>??>??>>????BujT]iF??>>>>>>=	

+
+																																							
++@>??>??>???<;>>=<=>==>=>>>>>??>>>?@??>????>>?>??>>>?>>Jr^hlK?@@?>>>??=

+
+																																							
+(@>?>>??>>>??>@?=<==>>>>>>>>??>>>>?@???????>??>=>>=>?><C\bYG>:@@??????6

+
+																																								
=???>?>>>??>>?>=<>???>?>???>>?@CB>>>?A@?>>>??>:;=<<====<>>????>???>>@)


+
+																																							
1A@??>>>>??>>?>>ZS?@??????ADFGN[^NFHYi[LJHEB@@63BF=:;=>>>>>??>?A?@A@@!
+

+
+																																							
2CAAA?>>>??>??>DnT===?@@ENMHFDET^MEKadJEGIPQHA@@Jmm\B;>=C?>>>?@@;8?B@

+

+
+
+																																								-AAAAA@>?>?>>@@>?C@>>>>?IUMBCDDLbL@?@Jk]KGEPXQD??FYm�yQ<>D?@A?@A?0"60


+
+																																									%@@@@@A?????AE@>>?@A@?DDK^PBJMJPeP@@@@?Jhqqh_\Z\YPEDOt��eLD?BA at ABA;	

+
+																																								
+0@?@@A@??>>B[cU??@?@?>KZ`\DFbiitaA????>>CQYLIdIHdfVHGSv���eJ@@@BA@<	
+		

+
+
+																																						
1?>?@@@???@TYLaI>?ACFEQcf[_\oxfUC????????><9KnJ<EOSD>QSh�oeeN??A at A9
+

+	

+
+																																					
+
0?>?@@?>??GbLI^M=?@AHSXJMi|fsiA>?@????????>=htWJ?A?
+_t]*&9[hO?@B@	
+
+

+																																						
+
0?>@@@>>??W^HR`D=>DJLOHDCbpi{Z=?@@@????????@wwf^IA@!YN
0(G|Q>BB;		
+
+
+
+																																					
'@@??>>?>?e^WcL=AI]SIGHIMVVpZQ@??@?????????@fYImgYG<0M
(2\w@?BB1


+																																						
#?A==>??>>myrQ<CIWp`OKNGM]ia?RE????????>?@@>QZLjlad[3	E
+
D�T??B>
+

+
+																																					
 >A>>????>c[;?JPb}nVTPBAUtL<^L????>?>?????=DVVdg_PTZ?*-1&
'?h�a??@@--<>6
+																																					'>@=<@??@=WpG<GPVo�j\XSG=FRADiK?@??????????>AFO`e[JAAGP*-=^PK`v�e>@?@>?>>A.
																																				!<>?>>@??@=IbB?KS[zybeRPQE@@A^kH?@@???????@@>>?HLHDAA?>@BU_\s7<�a>?>>>=<=@5																																			
+">>>>?????=?K@@PRZttgcXY`ZPJVlcK?@@??????@@>==>?>??>>>?DGQ[ai7
?�T=???83<>@3																																			
+
5?;>?>???>=>@@JIOjtfhjge[VYahcSA??>>????>>>?>>>?@??>=>JU\_Vdmdm�H=>>@6 :??)																																		
+
+


#$????@?>>>@?@?Ccp_ok`]USSSWa`J@?>>???>>>>???@@?????>F^jb\_klwv@=??@?5;?>#

																																		
+
+


+
A?????>??@@?=>RjftiXPJGEFM]gZHA@@???>===?@???????@>Devmhjou�[;>@@??;9>?%

																																	
+	



@?>????>???@@?C[ltdQJEAAAH]jgYKA???AHG@=>>????>???=Eo�wqos�rA>>??>?9(97

+																
+																
+	
+

;?>??>@????@@??NgkfRHCAAAI]ljd_RDAHZj\G>=>?>?????>=J}��}�rB=>>>>=?9

+																																				
+

/A>>???@???@???C\ljUJDCDGPbpkchnhboxxdK@=>???@@??>?Y�uotpaA<?>??>=A4



+																																			
+


??>>?>?????<>?>Rop]PHFIQZellhivjiislOA>??@@@@@?>Hs�dPLD>=>>>??>>B+

+																	
+																
+	
+
0A>>???@???==?=H`jd]VRT]cksvuxsjSW\ruUB>??@@@@@>B_�pOC@??>>>??>>?@

+
+
+																
+																			
+

<?>???@???>>?>@LUZbdbbiox�wvvp^`new}ZB>>>????>BXu{\D@?????>?>>>@:

+
+
+																
+																		
+

'A>>?@?????@@?>?BFNZdlvz�o][_`bp\Rco[HB>=>>>?E_{xmM?@???@??>>>>A+
+
+
+															
+																				
+
6A>?@??@>??@?>=<<?ESapusVGFIMYbE?G\e\PGDCEHRh�q[A?@??@@?>>=>?>
+
+
+
+															
+																				


>?>?@?@?????>>>=<=@IV_^K@?@CN[E=?OfkdffejmxvndVF>@@?@@??=>>>A0

+
+																
+
+																			
+
*A???@?????????>>=<=AEHB>>>@HWD=>CQ\k��~}qTDA>>@@??@@??=>=?>	
+																	
+																			
+
+

9A>???????????>>?>==>>>>>>>DRB>>@CLesmmf^I=<=>>?????@?>>>>A.
	
+																		
+																	
+	
+
 @?>??@@???????????>>?>>>>=?J@>=?BGQSRSJ@;<>>=??>??@@?>>=?<	
+
+
+															
+	
+																	
+
+
+
.A>>??@@??????>????>????>=>C=<<<>??>>>=<====>?>??A@?>>>>@&
+	
+																																				
+	
+
9@>???@?@??????????????>>>><<=====>=>???>>>>>>?@@??>>>A2
																			
+	
+																
+	
+
+
"@?>???@@??????????@@@????>=>>????@@??????>>??@@@?>>>@:																			
+																	
+
+
+
+
+
/B?>???@@?@????????????????????????@@@@?@>??@@??>>>@=

+																			
+
+														
+		
+
+
+
;@>>>??A@@???????????????????????????????@A@@?>>>@;

																			
+	
+																
+	
+
+
"@?>>??@@@@@@??????????????????????????@@@@@@>>?A8																
+		
+	
+
+																	
+
+
+
,A?>>>?@@@@@????>???????@??????????@@@@?>???>?A3
+
+																		
+
+																	
+
+
+

2A?>>??@@?@????????????@@?????????@@@????>>?@-
+																			
+																		
+
+
+


6A>>>??@???@?????????@@@A@@@@@@@@@@@???>>??*
+
+																		
+		
+															
+
+
+
+

6A?>?>???@@?@??@@@@@AAAAA@@@@@@@@????>>@?&

+
+
+																	
+
+	
+		
+										
+
+
+
+
+

3A??>?>????@?@@@@A at AAAAA@@@@@@?????>?@>$


+
+
+															
+
+
+																
+
+
+


*>A?>>>>????@@@@A@@@@@@@@???????>>?A;
+
+

+
+
+																
+					
+											
+
+
+

4 at A?>>>>>>?????????????>???>???A?0





+
+
+															
+																	
+
+
+
+

 2>AA@??????????@????????@@AA>2







+
+
+
+														
+	
+			
+		
+								
+
+
+
+


&18=@AAABBBAABAAAA@@@?=92)





+
+
+
+	
+
+														
+						
+							
+
+
+
+
+

	

#')*++*)'%$#$%$#"
		




+
+
+
+
+	
+		
+										
+				




+	
+
+
+
+
+
+
+
+
+
+
	







+		

		
+





+
+
+
+	
+
+									
+	
+
+		
																
+
+
+


+
+
+
+
+
+	
+
+			
+	
+		
+		
+																		
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+	
+
+
+
+	
															
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
													
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+												
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+
+
+
+
+
+
+
+
+
+																	
+
+
+
+
+
+
+
+
+
+
+
+
+																					
+
+
+
+
+
+
+
+
+
+																																		
+

+																																																																																																																																																												 [...]
+
				


+		

					


+
+






	
+	

+
+
+
		

+	




+

+
+
+

			


+
+	
+ -1/







		
			
1:;:-	
+




	


+		
+

+;<9"
+
	
+



+

+
+		
+

%;<1
	
+	



		



+		
+	-;;4


+




		
+
+	
+		9;:<+$.-24

	






		
+
+
+

+


5>;:=;06399&


	
+	

+

+

".>=;;<=;508=)
+





+	
+
	


	
+)1%*<=<;<<=<21;>.


					

+

+

+

+	2=>>>=<<=<=94:=>/




+
+	
+


	

+
+	3=====<;<<=<;=<>,








+
	


	

	5=<<;<=EA====<=?'



+


		
+	

+	

+			


*6==<====ZQ==<==>?*









	
	
+

+							
+
+%.59;<=?@?>======eS<=====>=2(*--.*"
						
+
+	
+
	2<??>>>>>>>><==<==Jo_@==>=;=?@@@@????;0

			
		
	4*-=?>======>>>=<===@IgfeZB;=><;=>>>>>===>?<)
		

		
			#KB?>==<=<=>>>>>><;>TXT\e]b`XA;==<>>>=======>>1
		
+

+	
+

	#?=>=======>>>>>=?MbhNBJ`SJOlnVH?=>>>>=======>>4
+
+	

+			
+		
:>=========>>>><FmxlO>;<E;<@R[GPZJ>>>==<<======?3		
+
+								
+
	
+
9?===;======>>=>RdYWW>;:8 at 5/2@,0PN>==<:<====<=>?*
+	
+											
	
+5?=========<=>=EWT at 9IB;<;9D3-.3/

+
5NB<=======<==>;


														

.?>====>===<;==IM6

6H;;=<=J666/4				)RL><<=======>?/
+	

														
+
	'>>=>>=>>><<=:<KL	9C:<=;@M9;:/5			
+!EQE<<==<====>?2%		

+																	

+
;>==>>>>>>>><?UU*

GC:==:?M:=<48!				,VUB<;=====>>AH!
+	

+
																	
+	
3?==>>>>>===<=R_2	
+
JA:<<:>M<>=65+								*Z\MA<=>>>>>>3

+

+																	
&?>=>>=>==<:::@WN
+	
+	GA:;<:AL=>>924						
+QbaL=>>>>>>>.


+																			
	
9?>>=>>=>==<;9<NK				C@;==:DP=>>=:?					
$Kls[@=>>>>>??'


+																					
+
+'?>>>>>>?@AA===:FN!
+			F80>=7FR<>>>;D"			
+	"GHHNQF>==>>>=?:
+	

+
+																		

+6?>>>>>?>>@B===;?O$
+
+	"O<7>=6HT=>>>;D$
+			KB:;@?>?><=>>>>?'

																				
	">>>>>>?===??===<;P.
		7W><==;LV<>>>;H/				/F;<<>@?>@?==>>>?5
+
+																							

+
+0?>>>=?>>>>?>====;P>	
M\>===;LX=>>>;NN
		
+	
8@====>?>?@>==>=><	
+																									


:?=>=>@?>>?>>====<OM
2WO=>>=7MX==>>;K[	
+
+A======>>>?>>>=>>?#
																										

"?>>>>?B@=?>>>>====DV2!>R@=>>=7NU=>>=9 at T	
+-F<==?>=>>>??>?>>>?)
																									
.@>>==?A?=>>==@>??>=NM:8MaI===<7OU>=>:2<N3
	F@>>>A?=>>>>@>>>=<@.
	
+																									
9?>>>>??>>>=>EB????>>PZ`qn^B==<<ZZ21873Ga]>/0ID=>>@BMG=>=>>?>>>=?3
+
+																											
 >>>>>>?>>>>=K|O>>>>><Dsu[acC<=:8US/07/9Zgpw^G@=>>=>?a^<>>>>?>>>>?8
+
+																																
+-@>>>>??>>>>=Q�`=>>>>>\bD=KV>:945==53,#7YKSeL<=>>>>>@pf<>>>>??>>>?=
+

																																		
8?>=>>>>>>>?=P�Q<????FY@?@DC<96.6==:8-*9G><DD>>>>?>?>ae=>>>>>?<>>>@$

																																			
!>>>=>>>>????=VF=???@ME>?ABA=;;;;<<:;=:>B@?>G>>>>???=\`>>>?>>?<>>>@0																															,@>>>>>>>?@?>=_{?>??>BG>??@?>==;<<=<9:;>?B@?=HD>>>???=[[=>>?>>?<>>>@8																																				6?>>>>>>>?@>>>pk<>???@???@@====;:89:6:<=>>@A>DK>>>???=ON>>>?>>><>>>?=

																																						
<?>>>>>>>??>>M�R<>>??????@?====<:77:9;=>>=?@?AK@>??>>>BE>>>?>>>;>>>>?

+																																						
!??>>>>>>>>?>?u{A>>>>?@?>@?>==>><:::;<=>>>>>???E@>???>>?C=>>>>>=;>>>>@'

+																																								
'@>>>>?>>>>><[�b=>>>>?@?>??>=>>><;<;<==>>>>>????>>?>???>GA=>>>><=>>>>@/

																																								
-@>>???>>>=<VspR;>?>>>???>>>=>>=<==<>>==>?>>>?>?>>?>>??>I`A<>>>=>>>?>@4
																																						
+1@?>>>?>>>=Aw`lC;>>>>??>>>>>=========>>=>>>>>>>>>>?>???>H��Q=>>>>>>>>@9

+																																								
+4@???>>>?>?@xnc===>?>>?>>?>>==>>>>==>>>>>>>>>>>>>>????@>U�wv[??>>>>>>?;
+

+																																								
+4@>>?????>><b�R<;=>>>>?>><=>>>=>>=>>>>>>?>>>>>>>>?>???@>oxP\i@>>?>>>>?=	

+																																								
+4@?>>>>??>=>@F99;=====>>=;>>>>>>>>>?>?>??>>???=>>>>????AoUOoV>??>>>>>>>

+
+																																								
4@??>>>?>>>?85=>===<<>>>>??>>?>=>>?@??????>>??>=>>>>>>>@knoaA@@@>>>>>>>


+																																								
+4?>?>>>?>>>?>>@?=====>>>>>>>>>=>>>@A???????>>>><>>==>>><DRJ?;>@?>>>?>?8
																																										
4?>??>?>>>>>==?>=@B>??>?>???>==>=>=====<=>>>?>>;:>====>====??????@@?=?)

																																											
.????>>>>>??>>?>=cc=@??????>AHHLOBGVN at KTMIB?@?@:5?>=<<<>??>>??>?@A at A@@#
	
+																																									
=????>>>>??>>???`X<=>?@@@AHONJT\DGQL at _aMMMOKGA@@?BC\J:>=>>>>>?@A@<<?6

+
+																																									$???>>>>>>>?>????@?>>??@DKRPHGMXI??@??O]EFFINVH?@??GoxF==>>>??@BA at 6


+
+																																								
+
:?>>>>>?>??>?>?@?@@@??@FXYPOKIRVAABCABA^]QZ]VV[EC??BXzzN==?@AA at A@@:	

+
+
+																																							
/?>==???>>?@NYG??@@???>AUbQQONLX\A@@@@@?HlsvycG\\I=>>?LooPA?AA@?AA1			


+
+																																							
0?>=>?>>??@HXW]>>?@??>>JXVUXXdjgN??>?>??@ETc{hLKXVNJHF?HlshOMB?@@BA!			

+
+
+																																				
+
/?>>>?>>>?ARWX[=>???>@KRPPaX^v`D???????@??=Kzn`TOKKE=N[L^$2/XyQ?@CB$		

+
+
+																																				
+0??>><=?>?Gc^eL<>>=AFKNMN]aXfn@>@??????????GrQ^]SGE<<5=YN+,$PyH<AA8		
+
+
+
+																																				
+'?@>>>??>>NojU>>>=BPONJCJbecrk>?@@????????>K}`MbTJLI:
	"c&
+
0�i<@AA+

+
+																																				
+
=@?>????=IgT?>?>=MTPME?AJYhpsC??@????????>NwsUcPRVPC

+R6	
X�D@?A<

+
+																																					;@?<@??@>?H@>?@>ANSNI@?A at HZgvO>@@????????>KjiRTU_`\\6,V?.6+�I@?@@56?@5
+																																					5>?>>@@?@?=>????>EONKC??@AIboqZ?@@????@????Jk^Ki[dcZWXRXoxwcm�I>??@?@??B,
																																			
+!>>>=?????>>>@????CHKF>>?@@@Osdc@@@???????@@MdUQjf`__UIY?BZWbrn�F>?>>>>==A3																																			
+
;??>?????>>>@??>>@FHB=>@@@??_^oG?@@@???@@?AKTUW\SKMU[ZcUZPMPtk}vA>>??9.:?@0																																			
+
(84>?????>????>>>?FECABFGDCAY\lY?@???@@A@?DHHIHB??@CM`iW[YYD_ozg>>>?@:
7??+																																				



@>>????>??????>FCFEHRWUSOc[arL????@@?BHIEA>?>>>??BTpqighINr�Q<>???@03??-
																																	
+
+

+
A>>????>????>?>AAFIOY_b]^od]pnM@@@?@K\[PF?==>>>>>@Os��}pIQ�p>>?@@??7(=?-
																																	
+	

+

@>>>>??>?>?????>?IHQ]adekzjX_nsUBAE[pxoXG?<=====>@Nr�}{jINtH<??@?>@:&-

+																																		
+	

;?=>>>??>???@@?=?IJR]aelu}iWXar{hbozmnwgTE===>>??BWz}]\YLJG<??>?>=@9

+																																				
+
/A>>??>?>>>????>?DFKX^dr~�k]Y\hv�rmg[_rkYJ?=>?@?@If|cEACDA=>??>?>>A2

																																					
+

??>??>?????>??>>@@DRZbq|oeeholpebffjypWIA>?@@@EYupK?@??>>>?>>>>>A)

+																
+
+																		
+
1A>>???@????>??>>=>EQ]jutpj`]`Xalidfr�z[JB@?@@DVjx^A?A@??>>???>>??


+
+
+																																				

>?>?@??????>??>=<<=DKUdgdVHEFIUjWHM^wu_PIFCDFSn}oO>@@?????>?>>>@8

+
+																																				
+

)A>>??????????>>===<?DNRQA>>>?DPB>?DWib][URRYksq\D=@??????>>=>>A(


+
+
+															
+																				
+
7@>?@?@????@???>>>>==@CA=??>>?@?@?>DT\ioje^b`UME>??>??@??>>=>?=
+
+																																					
+
+

??>?@?@???@????????>===>????>>???>>BLdigaRNB=<=>????@???>>==A/
	
+																	
+																			
+
,A??@@??????????????>>>?????>>????==?MLIF@<;<=>>>>?????>=>>?>	
+																																						
+

:@???????????????????????>?>=>?>>=<<?=<;:;=>>>>>?>??@?>>=>A,
	
+																		
+																	
+
+
+

!A?>??@@@??@?????????????>>>=>>>>==<=<<<=>>>>???>?>???>>=@;
																			
+																		
+
+
+
+
.A?>??@@???????????>???>>>>>>=>>>>>>>>???>>>??>??@???>>?@$																					
+																	
+
+
+

9A>>????@??????>>>?????????>>>?>?????????>???>?@@??>>>A.
																			
+	
+																
+
+	
+
!@?>>???@@?????????@???????>>?????@???????????@@??>>>A6																			
+	
+																	
+
+	
.B>>???@@?@??>???>????????>???????>????????@@@??>>>A9
+																		
+
+																
+		
+
+
:@?>>??@@??????>?????????????????????????@A@??>>>A9
																			
+															
+			
+
+
+
!@@>>???@@??@??>???????????????????>???@@?@@?>>>A6																					
+
+																
+
+
+
+
+A?>>???@????@???????????????????????@??=???>?A2
+
+
+																		
+																
+
+
+
+
2A?>>???????????????????@???????????@????>>?@.

+																	
+
+																	
+
+
+
+

6A?>>??@???@?@????@??@@@@@@@???@@@@@???>>?@+
+
+
+																	
+												
+			
+
+
+
+
+
+

5A?>>>???@@@@@@@@@@@@AAAA@@@@@@@????>>>@@)

+
+
+																		
+														
+	
+
+
+
+

1A@?>>>>???@?@@@A at A@AA at A@A@@?@????>>>@?'



+
+
+																
+
+													
+		
+
+
+


&=A?>>>>?>???@@@@@@@@??????>??>>>>?A; 





+	
+															
+
+					
+
+			
+			
+
+
+
+
+

1?A??>>>??>>????>????????>?>>?@A>/




			
+														
+	
+													
+	
+
+
+
+


/<AA@???????????@@@@@@@@AAA@;/




+	
+								
+						
+									
+						
+
+
+
+
+


%/7<?@AAAAAAAA@@??>=<951+#
		
+



+
+
+
+																
+								
+
+			
+
+
+
+
+
+


+
 $&(((&%$#"! 


		
+
+





+
+
+							
+		
+
+		
+	
+		
+




+
+
+
+
+
+
+
+
+
+

+	










+				
		
+




+
+
+
+						
+
+	
+	
+
+
+	
+										
+
+
+
+
+	
+
+		
+
+
+
+
+
+											
+
+
+
+	
+
+
+		
+
+
+
+
+
+					
+
+
+
+
+
+
+
+
+	
+
+
+
+
+										
+
+
+
+
+
+
+
+
+
+
+
+
+								
+
+
+
+
+
+
+
+
+
+
+
+								
+
+
+
+
+
+
+
+
+					
+
+
+
+
+
+
+
+
+
+								
+
+
+

+																																																																																																																												 [...]
	
+				

			
			







+		
+
+
+		
	
	
+
+	

	
+
+		
	
+
	
+	



+





+

	

+
+		

+

+		


+	

+

						
+

	
(,%	
	

+
		
+

	
	
+
+

+

,0$		
+
+	
+
+


+
+



	
+
			
/5(





+

+			

*9;4

)-)





				
+


	 4=<<>5%27;1
	

+
+		
+	


	4>=;;=>60-79&
+

+	
+
+
+



+
		
,===:;<=>7*/7)		


+
+			
+

+

+
+
+
+
+!0<=<<:;;;>><=:$
	

				
+

+	
	




+
	1==<<<;;<<=>>>9



	
				
+


	
	


+
+1=><;<<=<<<===>6







+					
+

		



$09??=;;===JA<<<;=>:

+

+



+
	
	
	
+

+
+	
	
+
(17;>@@?>>=====>WB;;=<<=?>6,&(*+("


+			
+				
+


(7>??>>=>>>=<=>=<;AeH9;=>>;>?@@??????:-
			
	
	4/'9?>>===>=>>>====<;C[f`F;;>><>>>>==>===>?:'
		
+		

+
GD>>=======>>>===<;C_pf_^n`D:<=>==>>=======>>/
								


+	
+
+	 >==========>>>>=>HVmuf^c[]pqZKD>=>>>===<====>?3
				
					
+
	
9>==========>>><Dnxjg`VILSX^fdU[YC=>>=<<<=====>?0
+		

								
+

8?==<:=======>=<Fnrei]LDFTLMV[ 
+5WI=>=;:<====<=>>'	

											

	6?>==========>>=Om_G\dMDCLcK at FT
	IN>==;<======>?9	


+													

+
0?>>=>=>====<==?T\J==ZSC at CShJ8=L$	
+
+;UC<<<======>>?+	

+															
+
+'?>=>>>===<<<;;>PE%&5FYH>=BUiH59E-	
+
+
+
+2UI;;<=>=====>=)#

+													
+
	
+	
;?>>>>>>=====<=TR

6X]C<:?SgG65>6
	
+
+
+	&UT>;=>==>==>>?F
		
+

+																	
+
	
1@>>>>>>>====<;Lb8.RXA64>SgF<68A
+
+
+
+	
+,j[?=====>>>>>0


+														
+
	
!>>>>>>>==<;:;=<UW'
	
LU?35>OaF>=9D!
+
+
+
+
+VgNA<<==>>>>>?*
+
+
															
	
4?>=>>>======;:=PL
		AR>9<BL]F?==H?	
+
+
+
+	HYKB>==>>>=>>??"


+																	
+
+
!>>>>>>>>?@?===;;JM 
+NU@;=DTaI@>=DU
	
+
+
+
+	)JC<<????==>>==?7


+																					

3?>>>>>?@@B@===<:FQ)	5aRC<?I_eKB?=AY/

+
+
+	
<F:;;AA>?>===>>>?$

+
+
+																				
	
+
=>>>=>?>=>@>==>=:EW3
-NeME at BMimNB?>Cd9
+
+
+E====?@==@?==>>>?1	

																			

+
,@>>>>?>>>>?>=>>=;F]6!
5[UCCCFNfoNC@@E\\	
+
+
+$C<>===>??@A?>>>>?9

+																												

8>=>=?>>>>??>==>=<D`=)&=XBA at AFVlpUGBAAKc0
+
+
9B=>==>=>>???>>>>>>

+																													

!?>>==@??>>?>?>>===?YD52E]BFDBH_ro_GCABDW= I?=>=>>=>>>??>>>>>?%

+																							
/@>>=>@A@>>>>>??>>>=KX@>Tqg`RJK^kj^IIEHO`L-
CG=>?>@>=>>?>@>>>=<@*

+																													
:?>>>>@@?>>>=?A??@>>=W^^ortfOFFRYXP at AM\ejeHBSP=>?@@BI?>>>>??>>>>@.


																																
"?>>>>>@>?>>>BpV>==>>=ClqdjcF>>?AED?;9@`h_lxgI<=>>>?ClK=>>>?@>=>>?6	

																													.@=>>>>?>>>>=H�x>=>>>?^lJ>QS?>>>>>>>:18T`PTr[;==>>>>O�P=>>>>?><>>?<	

																																			
+9?=>>>?>>>>?>H�m<>???LZF>>EA=?>>>=>><5:CH=>HO==>?>?>I}O=>>>>??=>>?@!

																																				
"?>>=>>>>>???=N�];=?@AF?@AAF@=>>>>>>=<==@F>?=GA=>????CpL>>>>>>?>>>>@.
																																				.@>>>>>>>>?@?=[�Q;>>?@??@AB@=>>==>>>=;<=>A?A>DN>>?>??AoL>>??>>?>>>>?7
																																						8?>=>>>>>>@@>?n{D=>>?@@@@A@===>=<=>><;=>==?B?@RB>>>?>?iN>>?>>>?>>>>?=																																							

>>>>>>>>>>??=R|a<=>???@?@@?===>=;<==<<====?A@>GC>>>>>=[R=>?>>>>>>>>?@ 																																							
%@>>>>?>>>>>>@ptI=>>??@@?@??>=>>=;<<;:<====>???@A??>>>=KZ>?>>>>>=>>>>@)

+																																								
+@>>>>>>>=>=<`ya=>?>??@????>>=>><;;9;<<=>>=>??@?????>>>BjH=>>>><=>>>>@1

																																							1@>>>>>>>>=<RujQ;>?>?????>?>>>>><=<:====>>=>????????>??>qtA=?>>;>>>>>@6
																																							
+5@>>=>>>>>=;kjgA>??>>??>?>?>>==>==>==>=====>>>>?????????k�tD=?==>>>>>?;

																																									
+8?>>?>>??>>:k�c<>>?>>>>>>?>>>=>>>>>=>>=>=>=>?>>>???>???>ltokB>??>>>>>?=	
																																									
+9?>>?>>??>=;R�S<>>=>>>>>>8:?>=?>>>>>>>=>>>>>??>>???>>???rdPrN=??>>>>>?>
	

+																																								
+:?>>>?>>>=<==B@?======>>><>?>=?>>>>??>>>>>=>??>>>>>>>???o`arD>??>>>>>??
+
+																																								
;??>>>?>>>>?77A?>==<==>=>?>?>>>>>??@??>>>>>>???=>>>>?>=<VvpO>???>>>>???

+																																								

=???>>>>>>>?>>@?>>=>==>>>>>>====>??????=<<=>???<=>>==>=>=A?;=???>>>>>?8

+																																									
%?>>>??>>>>>>>>?>>AE>>>>???>>>BFDACMVQJJLNKC?>??<9>>><==>>>>>??>?????>?-
																																											
%?>>??>>>>>>>>>??<Ud=????@@?FYfaQBLgvtREYde_NA@@=9@>>=<<=??==?>>>?A at A@@$
																																										
+

;?>??>>>>>?>>>??>IK=>????@IZ_[Z\GVWVZJHg`_^WKC@@A@?=GE;=>>>>?>>>@A?>:&


+
+																																								
0@>>?>>>>???>>??>?@@??@??BX_TRUXA?QdG>A[UOVWVOB at AA@AGX?=>>>>>>>?@?@:	

+
+
+																																							
3@>>>=>>>>??>>??>@A@?????Pd[VPRR@?ShI@?SUIMU\]G>???@@PK>=>>>>???@A at 9	

+
+																																								
>>??>>?>>>@DE??>>??????AGbaSRQWTBBBC at BAMbW\\`fVBA????>AEFEA==@??BA?+
+

+
+
+																																						
&@>>>=??>>@@T[C>>>????>@EQd[YTS^LA@@@@@AC[jzm\e`KGA??>>>AQVqaC?@?BA9



+
+
+																																				
+
(@?>>;??>?AB\]D=>????>=BBQd]Z^^L@@@????@@?HqsdmaQPKGFFH?J6O]eI??AB6
+



+
+
+
+																																			

'@@>>=??>?@H[Q>==>??>>=@DYhabhD>@???????@?<Z{utXSQIJIL[NL80d><@B=
	



+
+																																				
+#?@>>>????>FKA??>>>?@>=>EZecm\>?@???????@@=YzkbNRNDIOEBMNA	/J?@AA4


+
+																																				
+">@?=?@???>>>?@@?>=>>>>>AMYScY??@@?@???@@?>bya^SUL at HTB*OR5R�[@@@A?.&+#
+																																					
+3>?>>?@@??>>?@?@>>====>??AGGdd@?@@@@????@@AlpnrjXBDOTQ=AOIJKH\hd?@?@@>?AA6
+																																				
+
=>><??@???????@@>>==>>>>??=JsqK?@@@@???@@?Gi\qwmGANVWaa@:Q at Ypl~c???>???>>B)
																																			

<>>=??????????@@>>>>>??>>?@E`r[@@@@@?@@@A?Ta`_GBIQXa_ci]JUABhl�\?>??>>=<>@/																																			
+
1?<>???????????>>>>>>??????@HcdE?@@@@@@@@BcenQJ]fcemicqgWVM<^s�N?>>??;):??-																																	
+
+
"&>???????????=??>>>??>???>CY`M@@@@@A at A?Lqei\fi_[^bngphd]Z>UtzD>?>?@=6??-																																			



+
A???>??>????=??>?>>>==??=Gb\RE@@@@@A at In{cngb[SNQXhmqxsdU?b�g;>????@/+?>4
																																		
+
+


A>>?>??>????=>?>?>>===?@?KdcYMEA@@@BMmtjne[QLKMShnwlUE>esE<??@??@77>/
																																	
+	
+


??>????>>>???????>===?BDEPbgcVSKEDJXkuihppcVMJIKRnumdRE@@DD=>??@?>@:"
+																																	
+
+	
+
:@=>@???>>??@@?>>==<=@CFJT_bljd_cfggnh^bltkXOKJLXtv]GA??@><>?>>?==@7
																																						
-A>>????????????>>=<=?AEIS\`hlg^dob^fhcgr{o^TNNRdxkK>@@@?>>>?>>?==A0

+																																				
+
??>????????>>>??>>=<>>@DJUUQNMFLfXMOYbq�~peYRNXow\A?@A@?>>>????>>A%

+
+																																			
+
1A>>????????>>?>>>>====>AFD??>=@VI at BGSbpvshZTQ]ldL=?@@???>????>>?=
+
+
+																																				
+
>?>>@??????>??>>>>>>==<<=>>?>>>DA??>DOUbjbWPPYVPB=?@?>????>??>>@4
+
+
+
+														
+																				
+
*A>>????????????????>>=<<????>??@@@>>ABQ\TNIGF??==>>>?>???>?>=>A%

+
+																																					
+
7A>>@?@?????????????>>>>???????@??>>==CIE@=<;;<>>>=>???>???==?<
+																																						
+
+

??>?@??????????????>?>?????????????>===<;;;<=>>>>>>??????>>>A-

+																																					
+
+
,A??@@???????????????????>?????????>>==<=<=>>>>>>>?????>>>>?=																			
+																		
+
+
+

9@>?@???????????????>?>?>>>????>>?>>??==>?>>>??>>???@?>>=>A*
+																				
+																		
+
+

!@?????@????????????>>>?>?>>>>>>>?>>??>>?>>>>??>>?????>>>@9																																								
+

.A?>???@?????????>?>>?>>??>>>>>?????????>>>????>?@??>>>?? 																					
+																	
+
+
+

8A?>????????????>?????????>>>????????>>>>>?????????>=>A)
																					
+																
+
+	
+

?@>???????????????????????>????@@@????>??????@@??>>>A1																			
+	
+																	
+	
+
+B?>>????????????>??????????????????>?>?????@???>>>A4
+																			
+
+																		
+
+
7A?>>???????????????>??????????????>>>???@@???>>?A6
+																			
+																			
+
+


>@>>>???@??@??????????????????????>????@????>>?A4									
+									
+	
+																	
+
+
+
+
&A?>>>??????@@???????????????????@???????@@>>?A1
+	
+																	
+
+																
+
+
+
+

.A?>>>???>?????????????@@????@????????????>?A/
+																			
+													
+				
+
+
+
+
2A?>>>????????@??????@@@@@@@@@?@@@@?@??>>?A/
+
+
+																	
+		
+									
+		
+		
+
+
+
+

2A??>>>??@@@@@@@@@@AAAA@@@@@@@@@????>>>?A-


+	
+																		
+														
+
+
+
+
+
+

-@@?>>>>??@@@@@@AAA at AA@@@A@@@????>>>>@?(



+
+																	
+																	
+
+
+


$;A@?>>>>?>????@???????????>>>>>>>?A;!



																		
+
+										
+		
+
+
+
+
+
+

.=A@??>>>?>>????>???????>?>>>?@A>.


+																	
+	
+					
+					
+
+
+
+
+
+
+
+

,;@AA@?????????@@@@@@@@AAA@?9-





	
+									
+							
+			
+					
+		
+		
+
+
+
+

+
",5:>@AAAAA@@@@@?>=;962,' 
+
+
+


+
+
+
+
+
+						
+
+				
+										
+
+		
+
+
+
+
+

	
+
"%''&$#""! 




+			


+
+
+



+
+	
+					
+	
+
+
+			
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+	











+
+
+						
+
+	
+		
+
+
+
+	
+	
+
+
									
+
+
+
+		
+
+
+
+
+				
+		
+
+
+
+
+
+
+
+	
+
+
+								
+
+
+
+
+
+
+
+
+										
+	
+
+
+
+
+
+
+
+								
+
+
+
+

+
+
+
+
+						
+
+
+

+
+
+
+								
+
+
+
+

											
+																																																																																																																						 [...]
+
+	
+	

		
+		







			
+	
		


	
+		
	
+
+

+	
		

	


+
+
+

+		
	
+

+





+




	
+			
+







	


+		

		
+	




	
+

	
+
+


		
	


	









+
				

+


+
+	

$

	





+
+
+


+	
#5<<=<1
'* 

					
+
+
+		


	
9==<==>5'!*&
	

+	

+


		/=<=<<===2$	
	

+	
+

	



+
+
+*==<<<<<<>;0+!

+
			



+
+	
+
	
+

(4=>=<<;;=;<>:-


+

			
+		
	
+
+
	


	+;??>==<;:;<<;==7




		
+	



+	



(5=???=<==<;:;<<<<=?9'

+
+



+
+

+	
+		


+	
"/8>??>>=<====<=C<<<==>>?@<2&#%$"

		
+				

	
+
+	
/:??>>===>==>>=<<?`D:<=>>>>>??@???>=7(
							

13%3>?>===>>>=>>>>==;<Vla@:<>>>>>>>>>>===>>7$

+	
+
+
+	
+
+AF>>===<===>>>>==;;=Jei^cfF:<=>>><=>>==<<=>>=,
		
+			




+	<====<======>>><@MQ^mgmfbhmXHFA=>>>=>><;====>?1			

					

+
8>=======>===>><Et{g_c\_W_iZbldgV?>>=><<<=====>>/	
+			
+
								


+
8?>=<;<=>=====><>nnVT[\UZaSja[5 M]C=>>;:<======>=$	
+
+

+												


+6?>>===>=>====><CkqZU[`]YZgQ^b`

+2ZH<==;<======>?6		

+												
+


0?>==>>=>===>>=<Hko]R[cd_ZYgYS_c
+
	QM==<<=======>?(	

+															
+

+	
%?>>>>>>>===>===C^QFUa[`geb\ca\a_	

+
+LO=<===>===<=?<#%
+
															
+
		
+

:?=>>>>>====>==>[N+7B^cgbdhbea__i)


+
+	MS<<========>=AD

		

+
+														
+

-?>>>>>>====>>><Lb3';Rkk[cg`bb`]kO
+

+
+
+
+*eO;=====>>=>>>,
+	


+																		
+
+
+
<?>>>>>=<<;;=>==YW$3Poh^akf`c\Zgd&
+
+

+
+WU=;===>>>>>>>>'		
																							
	
/@>>>>>==>>>=;<==VN!.Flg_akceh]V^hA



+
+PK<;<==>>>>>>>?>
+

+
+																						

+
+

=?>>>>>>>>>>>=;><VO&1SofZbjhhi^QXde!
+
+
+
+	&O?::;=??>=>>>=>@4
+

+																	

/@>>>>>?@AB?>>>===]T8'1HLRedaijgf[OTbj9

+
+	
6I<;<=?BA@>>>>>>>> 
+


+																				


<?=>>>??>@A>>>=>==cV@:GS>Gg`XbidfTQZ_VI	>B;==>?A=>??>>>>=?-	

																							
+
+

+
)@>>>>?>>>>?>>>>==>hVCBSV=?JP\khegXVYOA[?#J>===>>??>>A?=>>>?6

+																									

7?>=>?>>>>??>>>>==>b[ECZV<>?BLacfkXKEA=^T3-P>>===>>??@@@>=>>><	

+																													
+
?>>>>?>>>>???>>>===W\HH`_=ACBDMWZUHFEB<WH?89I>>>=>>>>>>?>?>>>>>

+

																												
.@>>>?@??>>>>>??>===IZNParZRMDACIHDDNYZPiYC at HR?>>?>@>>>>>?@>>>==@$
+

																																			
:?>>>?@A?>>>>=@???>=AOKQhw_IEA??=<=@FYdcqjXXfD<>?A at BA>>>?>@>><>>@)

+
																														"?>>>>>@@?>>>?dY===>=>EYekmL?@@?>===>?CQ`^me\K;=>>??Kc?>>?>@?=:>>@2
	
+
																															/@>>>>>@>?>>>C��E<==>>CeXT]J@@??>>>>>@@Mh]Xs^><=>>?=g�A>>>>?@>=>>?;
+
+
																														:?>>>>>?>??>>E��G<>>>@FI=AQC?@??>>>>>@@DSG at VgC=>>??=g{A>>>>>@>?>>>?
+

																																	
$?>>>>>?>>?>?=K}w@<>?@@???AJ@>??>>>>>>?>@K?>?NJ=?>>?=[uA>>>?>??>>>>@+


																																							
0@>>>>>>>>???=[zk<=>??@@AAB@==>>>>>>>>?>=@??@?OA>>=>=Tp@?>>?>>>>>>>?6

																																						9?>>>>>>>>?@?DiqW;>>??@AAAA=====>>>>>>>==>?@A>B?>>=><Nl@??>>?>>>>>=?=																																									
+ >?>>>>>>>>>?=ZhkD=>??@@@@@?>>==>>>>>>>>==>?@A?>>>>>==GoE?>???>>>>>>>?"																																									
+(@>>>>>>>>>>=CpjS=????@?@??>>>>==>>>=<====>?@@?>?>>>>=>fX>??>?>>>>>>>@+

+																																								
.@>>>>>>>>>>=etd?>???@??@?>>>>>=====<:===>>>?????>?>>><VxC>??>>>>>>=>@3


																																								4@>>>>>>>>>=LvhS<???@????>>>>>>=>==<<===>>>>>??@??>>?>=O�j>??>>>>>>=>@8

																																								
+8?>>>>>>>>>:]sdB>?????>?>>>>>===>>>===>===>>??>??@>>??=G��b??>>>>>>>>?;
																																									
+:?>>???>>>>9Z�g=>>>>>>>?>>>=>>=>>>>=>>>>=>>>>?>?>?>>>?>Ap_qZ===>>>>>>?=	
+																																								
+<?>>>>>>>>><F}Y;==>>>>>>>>>>>>>>>?>=>>>>>>>>???>>>>>>???o[_o==?>>>>>>>?


+																																								
+
>?>>>>>>>=<==@@>>=====>>>>?>>>?>>?>???>>>>>>??>>>>>=>>>>fq{`;>????>>>>@"

+																																								
???>>>>>>>>>8:A?>>>====>>>>=>>>>>>=?>>>>>>>>???>>====>>>FjaA>?????>>>>?!

+																																								
,@>??>>>>>=>>>>???>==>>>>??>>===>>BKWSHB@>===>??=>==><=>??=:<?>>>>>>>>?:

+																																									
7?>??>>>>>=>>???>>DI>>?????>>CMV^ht���}qg\UOE??@=9>>>=<>?@>>>>>=>>>>???4																																										
+
8>>>?>>==>>>>>?>>=PZ=?????AIUaegkk~zq�igcde_OCA?:@>>===>?>>>>==>>>?@??%


+																																									

5?><??>>>>>>>>???>@@>?@?>@PV^a^bNIa_[PLAMadjhYPF@@@?@J?=>>>=>>>>>>@@A?'
+


+
+																																								
'?><<?>>>>>>>>???=>@@?@??JU_iba\L>Ny�e>?MgmgfcTLB@@@AH?=>>>>>?>>>?AAA>



+
+
+																																							

=?<9>>>>>>>>>??>=@@@@??BJ^oihh[I at Ei|^@@KaiidecXC????@?=>>=>>?>>>@B@@=)


+
+
+																																							

=?=9>>>>>??????>?@??@?CIEdnecd^EAAVeGBBEZ\eddmcG@??>?@>>>>==????@A??9/"
+
+
+																																						

>><8>???>@A@?>>>??>?>BIFEdlcZTQDCACEBBBCUS^cfoeG?>>>?@>;BSlV@?@?@A?<64+
+
+
+																																				
+
 ?><:>??>?A?>>>>>???>ALQLWlk`XNFA@@??@@@ADRkmhnbC>>>>>@>?S%VfXA???A at 8243 
+
+
+																																				
+*??=;>??>?@@>>?>????>@EMXgjdaO@?@?????@@@?>YkfhV?@>>>ALA@\; 
BN=??@@:147&
+
+																																					
+6??=<???????>???A??>?>=>Janj]B@?@?>????@@@>H\Y\L>?>=?GVN=LJ @a at A@@@>979*

+
+																																				

<>?<=?@@??>????@@>?>??>>AMjxUA@?@???>?@@@?>IQHIC??==>FXZB at N8$qt@@@?@@?>>8

+																																					

>>>;>??????????@?>?>??>>?@IQB???????>????@>P\LHFA>=>=BY`L@?Zy�sB@??>@@@?@7																																						

=>>=??>???????@@?>???>>>>??=@A????????????B\pj_K?==??BYbTE=Bl{i@???>>>>=>?#
																																				
+
4@>>??>??????>??????>>>>>?@??A????@?>??@@@OebZE??>=@FH[iVK>=`|a>@???>=<=?>(																																			
+

.,>??>>???????>?????>>>>>>>>>>@????????@AUjQ<=ADA@@HIVdVLA<Y�Z<@??@@7'=?>'																																		
+



@>??>?????>?>??>????>>?>>>==?@>??????@C]aE>FOIEC at FJR]OE@=_{M;@?>?@>!6?>.
																																				
+

 A>?????>??>?>????>?>>>>??=>==??>?>>?@@GYSVOYULHFCEHOVF>=>]a?;@@???@.)>>6
																																				


@>>?????????>??????>>>>??>>=<=????@@@AKWae]]UOLIFKGGE?=>@HA<=????>@6.9,
																																			
+
>?>?????????>=?????>>>==>=@D?<<=?@@>BMZba^`^WRNJGPG@>>>?@?=>>>>?>>?8

																																					
+
8@>>??????????????>>>===<<?FGA=<=>=>K\^WOU``XRLHGNC=?@@?>>>>?>>?<=@4

																																		
+		
+A>>???????>@@???>>>>>==<<=?CB===>==BHLMKS^_VOJGFG?>@@@?>>>??=>?=>A,

+																																				
+
>?>?????????>>>>>>>>>>>===<<==>======@AFOYWPJECDA=>?@@?>>>??>?>=>@!
																																			
+	
+
/A>>???????????>>>>>>>>===>>>>?>=>??>>=?DNJFDB@>>>??@?>>>>????>=?:

+
+																																					
+
=?>>??????????????>>>>>>>>??????>????>==A@??>=<=>>????>>???@>=>@/
+
+
+																																				
+
+)A>>?@???????????>?>>>>????????????????=<==>>==>>??>??>>???@>=>@!

+																																						
+
6A>>@?@????????>>??>>?????????????????>=>>>>>>?>??>????>???>=@:																																							
+
+

??>?@???????>>>>>???>?????>>>??>???????>?>>??????????????>>>A+
+																			
+																		
+
+
++A>>@@????????>>?>????????>>>??>?>>?????>>????>??>??????>>>@;																			
+																			
+
+

9A>??@???????>>?>????????>>>>>>=>?>????>??>???????????>>>>A(
+																				
+																		
+

!@?>????????>>?>>???????>>>>>>>>>?????????>????????@??>>>A6																																								
+

.A?>??@???????>?????>???>?>>>>???????????>???????@@?>>>@<
																					
+																			
+

8A>>???????????????@???????>>????????>???>??????@?>>>??#
																			
+	
+																		
+


>@>?????????????????>???????????@?@?????????@@???>>?@*																			
+																				
+
+
'A?>>>?????????????????????????????????????@@@??>>?A.																					
+																	
+
+
+
3B?>>>?????????????????????????????>?????@@?@?>>?A0
	
+																	
+																		
+
+
+

:A>>>??????@@?????????????????????????????@?>>?A0
																
+	
+		
+																
+
+
+
+

?@>>>???????@??????????@????????@?????>?@?>>?A/
+	
+																
+
+
+																
+
+
+
+

&@?>>>??????????@??????@@???@@@???????@@?>>?A0
+	
+
+																
+																	
+
+
+
+
+
*@@>>>>??????@@??????@@@@@@@@??@@@@@???>>?A1
+			
+															
+		
+														
+
+
+
+
+

*@@>>>>>?@@@@@@@@@AAAAA@@@@@@@@@@@??>>>?A.


+
+																			
+														
+
+
+
+
+
+

&>A?>>>>>??@@@@@@@@@@@@@@@@@@??>>>>>?@?'


+
+			
+														
+												
+
+	
+
+
+
+
+


7A@?>?>?>>>????????????????>>>>>>?A:"


+
+							
+								
+
+						
+				
+	
+
+
+
+
+
+

(:AA???>?>>>>>>????????????>??@A=-




+																
+
+				
+				
+
+
+
+
+	
+
+
+
+

'6?AA@@??????????@@@@@@AAA@>8,

+
+




+
+								
+
+
+				
+		
+									
+
+
+
+
+	
+
+
+
+

	

(18=?@AAAA@@@@@?>=<:73-&
+	
+
+



+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+	
+			
+
+
+
+
+
+
+
+	
+
+

	
 %'('%#"!! 


+		
+




+
+		
+				
+
+
+
+
+
+
+
+		
+
+			
+
+
+
+
+	
+
+


+
+
+
+
		












+
+						
+
+
+
+
+
+
+	
+
+
+
+
+							
+
+
+	
+
+
+
+
+
+
+							
+
+
+
+
+
+
+
+								
+
+
+
+
+
+											
+
+
+
+
+											
+
+
+
+
+						
+
+
+
+										
+																																																																																																						 [...]
+
+			
+	
+		
+




+				


+
+	
			




+


+	
+	
+
+	
		

+
+


+
+


+

+	
+
+
	
+
		







	
+
+

		
	

+


+
	
+
	
+
+
+

+



		
	
+
+


+	


	



+	
		


+	


+
		


+	

		










	
+


+
+


+



+
+
+
+
+



+



	
+
+
(9;:;<5!

+

+
+	
+
+		
+			
+
+	
(======>9 
+
+		
	
+


	

+';===<====3 	

+	
+		

+
+



/===<=====>;)
	
		



+
1=?>>=<<<====>9#
	

		



+
+
+	#3=?>>>>=<<;;===>>;*


+
				
+
+

+
		
+

(9??>>=====<<;<<==>>>?9(




	
+			
+

+

+			


"4=?>>=>;:==<==<<;<==>=>>??:,


+		
+				
+

+

	
+(8??>>==>>>>>===<A]D;==>=>>>>?@?==<8/ 

				
+


,5#+;@?>==>=>>=>>===<?Wia@<==>>>>>>>>==>>?=0


			
				<I>>>==<===>>>=><:;=Hgn]ab@<===>>==>==<===>?:&
+	
+	
+
+		
+



	

:==========>>===KZUXb`tg^ncLBEB<>>>>>=<<====>=,
		
+

+				
+

	
6>===<====>=>>=<N{xbTOKX_\bY[jttU<>>>=<<======>>-	
+
+			
								


+	5?====:=======>=@n_NDCFCKiNZQKW=@iY>=>=::=====<=><"



											
+

	2?>>====>>===>>=?fkMDEIKHNhR_RP:
P]@<><<<====<=>?5

														

+
,?>=>=>>==>===>=?f{VGHUec]]a[\_\"	
=[A<<<<=======>?'	
+

+															

+	
">>>=>>>>>====>>=VplcMRc_]^]OP^e`$		
+<[A<=======<<>?;$'	

+
+															
+
	
+
7?>>>>>>>>=<<=>=BhYLV[a]JQRPHMTW]@

+
+@V=<<=====>>=>>EC
	
+
+
+																
+
+
+
(?>>>>>>>==>>?>><TeFAIbdJBMPRCHNUUX#		
+	WJ;======>>=>>>(
				

+																					
+
+
+
9?>>>==<<;;=>>>=?gS88CgcHEISVCCENTc:

+
+	IN:<====>>>>>=><"
		
	

+																		


(?>>>><<====;=>>=ElK45>WVIEEOREDCFK]Y	
+
+	FI;;;;<<>>>>>>>?<
+
+

																				
	

:?>>>>===>===<=>=JrdD;LOJHACKODCABHQc0
+
+MA;;;<<==>>>>>>=?1
+	

																		
+


)@>>>>>>?@@>>>=>><Stk\U_?=FFABGCA?@FEH9		
<R<<===>A@?>>>>>=><

+

+																			
+
	
:?=>>>??@AA>>>=>><_k[^jX<@KD=>@??>AEB;Q1#VO<<===?B???>>>>=>?+

+
																				
+	
	

&@=>>>?>>>??>>==>>=cug`nQ>?@?>CD at C>AC>;XgI.+YO====>>?>=>@>=>>>?3
+
																									

+
6?=>>?>>>>?>>>>>>==YiqeiP>??>>?>@B>?>>=TdO7*YH=====>>?>>@@>=>>?9
+
																														
+


??>>?>>>>>?>>>>>=<=MVYWfU=??>>=;==>>>>=RZB>AWA>====>>>>????=>>><	
+
																															

/@>>>?>>>>>>>>>?><=<ECHOeU?>>>>>==>>>>>@XaSN^N=>>>>?>>>=>??>><==?

+
+
																															
:?>>>@>??>>>><>>>===BE at SdNA>??>?>>>>>>=Ff^PPV@>>???@=>>>>?@>=;>>@$
+
+
																															"?>>>>?@A?>>>>[Z==>=>?FOZYJ?????>>>>>?>=GbhHCF==>?@>PO=>>>>@>>>>>@.
	
+
																												
+0@>>>>>@?>>>>?~�Q:=>>>?KY`UB>>??>>>>>??BXbhhP>===>>A{l<>>>>@?>?>>?9	
+
																													
+:?>>>>>@>???>Bz�`;>>>@A@?M^A?>>?>>>>???D\UF_aA>>=>>F�g=>>>>??>>>>>?
	
+
																														
$?>>>>>>?>>??=Jv}P;>?@@??>DM>>>>??>>????@PB=AUP??>>=A{g=>>>>>?>>>>>@)

+
																																					1@>>>>>>?>??>>cpyD=>?@@??@A>=>>>?>>>>??>=@@???JC?>>>>ta=?>>?>?>>>>>?5

																																					
+:?>>>>>>>>>?>Lrdm>>???AA at A?=====>>>>>>?==>@?@@>?>>>=<l`=?>?@>?>>>>>><
																																								
 >>>>>>?>>>?>=efsQ=>???AA@@>>===>>>>>>>>==>??A@?>>>>=<cq??>??>?>>>>>>@"
																																									
(@>>>>>?>>>>=EsdW=>>?A?@@>>>>>>>>>>>>>>>=>>?@A@??>>>>=P�N>???>>>>>>>>@,

+																																								
/@>>>>>>>>>>=dr`A???@@?@?>>>>>=>>>>>>====>>>??????>>>>A}t????>>>>>>>>@4

																																								5@>>>>>>>>>=EvdT=?>@@???>>>>>>>>>=====>>>>>>>?>@@?>>?><j�`>??>=>>>>>>?9

																																								
+9?>>>>>>>>>;OucF>>??????>>>>>>>=>>===>>>>>>>>>>@@??>>>;U|X>>=>>>>>>>?<
+																																									
+;??>>>>>>>>;L�rA>>?>>>>?>>==>>>>>?>==>?>>>><=??>???>>>:Es\vI==>>>>>>>?>

+
+																																								
+>?>>>>>>>>><?qc=>>>>>>>>>>==>?>>>?>=>>>>???;;>?>?>>>>=<@oUzU9;>>?>>>>>? 
+																																								
"@?>>>>>>>=<=>???>>>>===>>>>=>??>>>??>>>???>>>>>>>>>>>=>=b�E7>???>>>>>@%
+																																								
"???>>>>>>>>>;<A?>>>>>>>>>>>>>>>>=<>D@==>??>>>???>==>==>?A[N9<??>?>>>>>?"
+																																								
5???>>>>>>>>==>??>>=>>>>??>?>>>>@FRevoaQE@?>=>??>>==>=<>??66=?>>>>>>>>?=
+																																									$?>???>>>>=>>>>>>>>JQ>?????>>?DMU^qy}}xkb`XTOIB>?>:?>>=<=?@>=>>>=>??>???9
+
+																																								
(?>=>?>>>>>>=>??>>=LQ=?????EMTZTOe�~k`i�o]PNSUTKA?=@>@C>=>?=>>>>>>>>???@-


+
+																																								&?>==?>>>>>>>>???>>=>??@?>IUROPTdkhfxu]Yb^`[_VMRRA@@=PoE<>>==>>>>>>>?@A9

	
+																																								
<>>=>?>>>>>>>>???<=????>FULOVafVBBo��H??PgjlXJTI=@@CMA=>>==>>>>>>?@@B;
+

+
+																																								
9?==<?>>?>>>>>???<?@@?>=PTQXhm]D>A`}�uE@>KlpofYXI>?????>??==>?>>>>?@AAA6
+
+
+																																							
0?><:?>>?>??????>?@???=CPQ[gm\LA@@R{�dAA at F[glol[G>?@??????<<>???>?@@@AAA/
+
+
+																																						
&?>;7??>>>@A@>?>>>?>BGJJGVjodGEAABD]fKBBAEMVkqu^F?AE?>>>==PUB?????@@@AAB8
+
+																																						.?>;8???>?A?>>?>??>>HVWICXjkeF@@@AAAABBAACJPcrxaE?CA>>>><H\diI?>???@AAAA;
+
+																																					
+#<>>97?????????>>@??>?EPE>YecgMB????>>??@@@@G[sfB@>=>>=><JeTTb@>???@@AAA;


+
+																																				

.?=>9:????>?@????@?>?>>@@<Mmis\D@@??????????De~a@><=>>=>>?`U>mF@?@???@A@<

+																																					
*?=>9=??>??>?????@>?>>>>??>VwkI@@@???????@@@?TniP>>>>?>>@@?CZi|I>???>??@@?"
+																																					

>>>=>?>=??>???@@???>>>>>??=A;<?????????????>?AB??>>????A@@?Cb[@>?>?>>>>?A2
+																																				
+

4@>>??>>???????????>>>>>>?>:4=????????????>@LB=>>>>??>>B@??>GL=>@???>>>>@9
																																			
+

1/>??>??????>??????>>>>>??<=??????>>>???@>HPB??>=>>>>>@?@?>EN=>@????8;>@:
																																				

??????????>???????>>>>??@?>>@?>>>>>??@@>JF??>>>>>>>>>=??>GM=>@@?@@50??<
																																				


+@>??????>???????>??>>>??>??>>@A>>>>>??>>F@?>==>>>>====?>>GF<>@@@@?>(9>>/
																																			
+
+


 @>?@????>??????????>?>>>>>?>?DJGBAACDB>=@>>=<<=>>>===>???@>>>@?@??A+%>?3
																																	
+	
+


@>>?????>?????????>>>>>>>>>>>>BEEEDDB>>>B>======>>>>>>????>>>?>??>@3#/#
+																																			
+
=?>??????????>??????>>>>>>>>>>>>>>>?>>>A@=<<====>>>??=????>>??>?=>@4

																																					
6@>>??????>>?>>?????>>>>>>>==>>>>>>?=<=>>=<<====>>>???@?>>>>?>??<=A0

+																																					
+
(A>>???????>?@@???>>>>>>>>>>>>>??>??>=====<<=>>>=>>?????>>>??>??=>A(
+
+																																				
+
=?>?????????????>>>?>>>>>>>>????>????>>>====>>>>>?????>>>>?????=>>

+																																			
+	
+
+-A>??????????????????>>>>>>????>???@????>>>?>>>>>?>?>>>?>>??@?>>?7

+																																				
+	
+
=@>>?@?????>????????>>>>>>??>?>????@??>>????>>>>>>>>>>?????@?=>A,
+
+
+																																				
+
+(A>>?@???????????????>>?>>??>?>????@?@@????>>>?????>>>>????@>=>?

+
+
+																
+																			
+
+
6@>??@???????????????>????>>???????>????>?>>>?????>????????>>@8
	
+
+																		
+																
+
+
+
+
??>?@@?????????>?>??>?????>>>????>>>??>?>>>>>????>???????>>>A'
+																		
+																			
+
+
-A>??@???????????>???????>>>>>?>>>>>???>>>??>????>??????>>>@9
																			
+																		
+	
+
+
;@>>?????????>???????????>>>>>>>>>>???>???>????????????>>?@$																					
+																		
+

"@???????????????????????>>>>>?>>?>>??????????????????>>>A1
																			
+																			
+
+

.B?>????????????????????>?>>>????>>????????????>?@??>>>@7																					
+																	
+	
+

8A????????????????????????>>?????????>?>??????????>>>@<

+																			
+														
+						


>@?>>?@?????????????????????????@???????????????>>>@?#																			
+																				
+
&A?>>>?@???????????????????????????>???????@????>>?@(																					
+																	
+	
+
/B?>>>??@?????????????????????????>??????@@@??>>@@+
																			
+																		
+
+
+

7A?>>??????@??????????????????????????????@?>>?A+
	
+														
+	
+																				
+
+
+

;A>>>>?@???????@???????@????????@???@?????>>?A-	
+																
+	
+
+																
+
+
+
+

>@>>>>????????????????@@@???@@???@@???@?>??A1
+	
+
+															
+
+															
+
+
+
+
+
+
+
!>A?>>>???????@????@@@@@@@?????@@@?@??>>>?A2
+
+
+
+
+														
+
+		
+	
+										
+	
+
+
+
+
+

!=A>>>>>??@@@@@@@@A at A@A@@@@@@@@@@??>>>>?A.

+
+
+	
+			
+		
+					
+	
+	
+					
+							
+
+
+
+
+
+
+


9A?>>>?>>??@@@@@@@@@@?@@@@@@@??>>>>?@?(


+
+
+
+						
+								
+
+
+	
+							
+	
+
+	
+
+
+
+
+
+

0 at A?>?>>>>>??>????????????>>>>>>?@A:"


+
+			
+		
+
+								
+
+										
+		
+
+
+
+
+
+
+
 5?A@??>?>>>>?????????>>??>???@A=,





+
+
+					
+								
+	
+
+								
+	
+
+
+	
+
+
+
+

0<@AA@??????????@@@?@@@AAA?8+





+	
+			
+
+
+
+
+
+



+
+
+		
+								
+
+
+
+
+
+
+
+
+
+
+



",5;>@AABAAAAA@@?>=;95/(

+




+
+
+	
+


+	
+
+
+




		
+		
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+


$()*)'&$#" 



+		




+
+					
+
+		
+
+
+
+
+
+
+
+
+
+
+
+	
+
+


+
+
+	















+									
+	
+
+
+
+
+								
+
+
+
+										
+
+											
+																																						 [...]
+
+
+			
+
+		
	
+

+
	
+		
+	
+
		



+
+

+	
+		

	
+
+
+	
+
+	

+
	
+

+
+	
+	
		
			
	
+
	

+
+


+	
+	


	


	


	
			
+

+

+	
+	

	
+
+		
+

		



+		
+	

	
	



+
+	

+
+	

+

	

+	








+
+
+


+
+	



	2;;58;9)
	
+	
		

+			
+

+				

+
+


+
+	8>==>===>)	
	
+
+	
+
	
+
		

';>===<====<&	
+
			





	!4>>======>==>;"


			






%5=>==>=<=======>:%
		

+
	
+
+
+


)8??>======<<<=====>=/

					
	
+
	
	

(:?>>==<>=<==<;<<<==>=>?9'





+				

+
+
								



-<?>==><8;>====<;;<<==>==>??7$
	
+		
+
				
+
			
':?>>=<====>====;D[E;====>=>>>??954/%


				
+
+
#2
"7?>>==>>>==>><===H\acF====>>>><=>>>???9(
+	
	
+
3M>>>=<====>>>>><<<@Vih]\eB<=<<==><>======>?5 

+	
+		
	





+6?====<====>===@htcb_ScbYi\MGJJ==>>>=====<=>?;&								

			
+
+


.>==========>>=<V��`NNR\adgWWb|�X;=>=====<====>='
				

+					
+


+	
+.?>===<<>====>><Jv^YGCHHOqYRO at K\czS;>>=;9====<<=><!
	
+		

										

+
+*?>====>>>====>=CltUGS\]]\h]c\SR>.HqU<===<=======>?4	
+
+
											
+
+$>>===>>>>>>>==>>i{LDSfSORRKFW]kZ#7iS<==<<=====>=>>%
+				

+													
			

<?>>>>>>>>=>>=>=Jx�dGfN==??=:@AW_#

&^O<=========<=?9+'	
+
+															


3?>=>>>>>><<=>>><[]^Z[^====;;8<<=S;
+
+/[B<=====>>>==>=IB
+	
																		
+
+

"?>>>>>>>>>>>>>>=Dj^OSiN;><<;;;:<;FP*		
=M;====>>>>>=>>@)


+																		
	

6?>>>>>=<=>?>>>?=XfQL\oB=;599;;;;=C`4
+
++N<======>>>>==>9
		

+														
+
+	

+!?>=>>=<==<<>>>>>AlxUKc\<>;:68;;:;>=aA

+
++M<<<<==<=>>==>>?8	
		

+																
+
+	

5?>>>>===>>==>>>>K��pOgJ<?><49:;:;>;MI	DI<===>=<<=>==>==?+
+

																				
+
+

#?>>>>=>>??>>=>??>V���jeD??>95;::8:>>?I
+
DiD<=<=>>>?>=>=>><>9


+
+																					
	
7?=>>>?@AB@>>>=?@?buj}w`@?>:7:;:9:<>=>`\LQisC<>==>>BA@?>>>==>>)

+																				


#?=>>>?>>?@>>>>>@?Ag�rk\???;<<;:9;=>>?]ajaZnE=>==>>@>>>?>=>>>?.
	
																											
	
5?>>>?>>>>?>>>>>?=@Zt��j\@?>==<9:9;=>?>UV_b_lC>===>>>>>=>?>>>=?3	
																														
+


>>>>??>>>>?>>>>?><>LUVUfS>@=;=95;:;;=?>Q\cgc^@>===>>>???@@?>>=?8		
																										

-@>>>?>>>>>>>>>??=<=DEEObI>?=;=;8<;=<>?>SYTWWN?>>=?>>>>>?>??>;;>=
+
+
																														
9?>>??>>>>>>>==>=<<=AHDY`B>?>;===;<==>?=RTBHJC=>>>@?=>=>>>?>>>>>?
+	
																													
+!?>>>??>??>>>=Q^>===>>CMPL=>>>:;=>==>>??=KPDDF>=>??>MC>>>>?@>>>>>@+
	
+
																																		
+.@>>>???A?>??=q�`<=>>?@BFCA>>?>>>?>>>??>CIRPE>=====H�X<>>>?@>>>>>?7	
+
																															
9?>>>>?@?>?>?>t�w>>??A@??GP>>>>>>>????>BQDAEA>>>>=<[�V<>>>>@>>>>>>>
+
+
																																		
#?>>>>>>?>??>>Frub;?@AA??@NG=>>>>?>???>?@SC>?B@???>;X�T<>>>>??>>>>>@&

+
																																				/@>>>>>>??>@>>dhyN=>???@?AE==>>>>?>>???>=@B???@@?>>;O�T=?>?>>?>>>>=@3
+
																																					
+9?>>>>>>?>>?>OxezB>????@??>==>>>>>>>>>>===@??@@@?>><I�Y=>?@?>?>>>>>?<

																																								
>>>>>>?>>>>>>iioZ>>??@@@A>>>==>=>>>=>>>=>>???@@??>>=B�k>??@?>?>>>>>>@"

+																																								'@>>>>>>?>>>=Gr[M>>?@?@@@?>>>===>=>>>>>===>??@A?@?>>>=k�K>?@?>>>>>>>>@-

+																																								/@>>>>>>?>>><cjX@??@@>@?>>>=>>=>=>>>>==>>>>>>?A@@@>>?<Q�k@???>>=>>>>>?5

																																							
+5@>>>>>>>>>=@u]R??@A??@?>>=>>?>=>=>>===>>>>>>>??@@?>?>@t�^=??>>>>>>>>?9

																																								
9??>>>>>>>><F{fL>?@?????>>=>>>>=>>===>>>>>>>>>>?@@?>>><\vzO=>>>>>>>>>?=	
																																									

<??>>>>>>>=<D�zF>????>>>>>==>>>=>>>==>>>>>>8;>>>?????>=Iner?=>>>>>>>>>?
	
+																																								
"?>>>>>>>>>==<ee>>>?>>>>>>>>>>?>==>>==>??>??9:>>>>>>>>?>Akb|@==>>>>>>>>@"
+
+																																								
&@??>>>>>>=<<=>?>>>>>==>>>>>>>??>=>>>=>>????>>?>>>>>?>=>=d�h;=??>>>>>>>@&

+																																							
+#???>>>>>>>>==<@?>>>>>=>>>>>>>??><<AHF@<>??>>>??>==>>=<>?BPB<>@?>>>>>>>@$
+																																							
+ 9???>>>>>>=====??>>>?>>>>>>?>>>>AN`ksqk[F?>>>>??>>>>=>=>?@87=>>>>>>>>>>?

+																																								
/?>>?>>>>>>>==>?>>>LR>>????>>>@GSbomhhb[[]UOJID?>>:?>==>=?@>=>>==>>>>?>><
+																																									4?>=??>>>=>>=>?>??>FI=???>@HNQYXSb|th`[ulTFKRVVSF>=@=IQ>=>?>>>>>>>>>>???;

+
+																																								5?>==?>>>>>>>>??>?><>>?@>BUVORMCX�ut}s\{yUGLMLS]K>?=ToA=>>>>>>>>=>>???@3

+
+																																								0?=>=?>>=>>=>>>>>?<=@???DXPHLQRXqZO|}|�WBZj_\YNL]aD?>@C?>>>>>?>>>>>>???@(
+

+
+
+																																						
+)?=>=>?>>>>>>>>>?><?@?@EN[JJO\giiHEy���Q?J[hneYMYH at AA???>??>>>>>>>>????@= 


+
+
+																																							 >>=>>???>>???>??>>@?DKKDGMMTdh]QEBr��|FBDEVpj^ZL==DLH@????>=>>>>>>?????A9
+
+																																							 >>>>>>?>>>@A@>>?>>?IRMH?=JXTh]M@@BRsw^CDA>EbrdcI;?JPL@>>?>AB???>>??>????>
+																																						
+.?==>=>?>>?@?>>>>??ANVSMB;K\Oi]PDABADFCCBBAG]ndfK;BJA??>>=>T\I??>>??>????>


																																						
6?=>==>?????>>>?>?@?@?BJN=NeN]aZC??@??????@D`hdlH<BB???>>==SfjI>=>??>?@?>=

+																																					
4>=>=>>>>?>>?????@@?????FFFp]]pR?@??>>??????VwzhA>?????>??>EfvU=?>??>>???<

+																																					(??>=>>>=???????@???>????B at PuybC?@???>>???@@@WdI>>???????@??MdL<?>>?=>>?A;
+																																					

2=:=>>?>?????????@?>?>??@@?HJ@????????>????=;<==???????>@@???=>?@>?>=>>A=

+																																					

*+>>????????>??????>>??>@@:9=???>>?>>>>>??>=>;>>>>????>?A??>=>?A???=;>@>$

																																			
+

???????????>?????>>?>??KKC=>?>>>>>=>>??>==>>>>>>??????@@??=>>A@@?>9=??,
																																			
+


+@>????????????????>>>?>ATZK@@A><====>?>>>>???>?>??????????=??@@???<9>>; 
																																			
+
+


!@>?@???????????????>>??=>L[WV\ZNDBBFLOOKC@@?>>?>>>???????>>>?@????>-;>>0
																																					
+

@>?@????>??????????>????>=BQ\_\age`^^b]J@???>>>>?>???????>?>???>?>A) ;<,
+																																		
+		
+?>>?????>?????????>>?>>>?>=>ES[[bgfa_YI??>>?>>>??>???>?????>???>>>A/	!
+																																			
+
:@>?????>???????????>>>>?>>>=@JSUQPSKA=>>?>>>??>>?????????>>???><>A0

+																																					
0A>>?????????>>????>??>>>>>>>>==>>===>>????>>?>>>????????>>>???>=>A+
																																						

"A>>???@????>?@@@@?>>?>>>>>>>>>?>>>>>>>????????>>>?????>?>>>???==>@"
																																							
+:?>????????>?@@??>>>>>>>>>>>>??>?>??>>>????@??>>>>>>?>>?>?>???>=?<

+																																			
+		

)A>>????????>??????>>?>>>>>>>?>??>??>>?>??@@???>>>>>>>>??>????>>@5
+																																					
+	
+
<@>>?@??????>??????>>>>>>>>>>???>???>>>??@@?>?>????>?>???????>>A(

+																			
+																
+
+
+
+
(A>=?@??????????????>?>>>???>???????>???@@?>?????>?????????@>>?>	
+																																				
+
+
+
7@=>??????????????????>>???>>????>>>??????????>??????????@?>>@3
	
+																		
+																
+
+
+
+
@?>>?????????????>???>>???>>>>>>>>>???>????>?>?????????@?>>>@"																			
+																		
+	
+
/A>>??????????>?????>>??>?>>>>>>>>>??????>?>>?>??????????>>@5
																			
+																		
+	
+
+;@>>>???????????????>????>>>>>>>>>???>?????>????????@?>>>??		
+																																					
+
+
#@?>>???????????>?>?????>>>>>>>>>>>??>????????????????>>?A+
																		
+
+	
+																
+	
+
+
.A?>>???????????????????>?>>>????>>????>???????>????>>>A3																			
+	
+																			
+
7A?>??????????????????????>???????????????????????>>>@8
+																			
+	
+																	
+	
+

=@>>>??????????>???????????>????????????????????>>>@<

	
+																	
+																			
+
+	

%A@>>>????????>?????????????????>??????????????>>>@?"																					
+																			
+
-B?>>>??????????>??????????????>?????????????>>>@?&
+	
+																	
+									
+									
+
+
+
4B?>>>????????????????????????>?>??????@????>>?@)
	
+
+												
+			
+	
+
+																
+
+
+
+
8A?>>>?????????????????@?????????????@???>>>?A,	
+
+										
+			
+
+		
+																	
+
+
+

;A?>>>????????????@??@@@?@?@?????????@?>>>?B2
+	
+			
+											
+
+
+	
+													
+
+	
+
+
+
+

;A>?>>>?????@@@???@@@@@@@?????@@@??@?>>>?A4
+
+
+
+				
+								
+	
+
+		
+
+												
+
+
+
+
+
+

9B?>>>>???@@@@@@@A@@@@@@@@@@@@@@???>>>?A1


+
+
+
+						
+							
+
+
+
+									
+			
+			
+
+
+

4A@>>>>>>????@@@@@@@@?@@@@@????>>>>?@@+



+
+
+
+							
+						
+
+
+
+
+							
+	
+
+			
+
+
+
+

)=A@?>>>>>>>????????>>??>>>>>>>>>@A:"


+
+
+
+
+	
+
+
+	
+								
+
+										
+			
+
+
+
+
+



/>A@???>>>>>??>?>????>>>?>>??@A<,


+
+
+	
+
+
+							
+		
+
+	
+					
+
+				
+
+
+
+
+
+
+
+


)8?AA@@?????????@@?@@@@AAA?8*




+	
+			
+



+

+

+
+
+
		
+			
+
+						
+
+
+
+
+
+
+
+




(17<@AABBBBAAA@@?=<960'


	





+
+
+
+		
+
+			
+	
+
+	
+	
+		
+
+
+
+
+
+
+
+
+
+

+

"'*+++*'%#!

+			






+			
+
+
+
+	
+

+		
+
+
+
+
+
+
+


+	
+












+
+
+								
+
+
+
+
						
+
+
+
+						
+
+					
+																														 [...]
+

+
+					
+			
+
+
+				
+
+	
+	
+



+
+		
+

+	
					
+
	
+		
+		
+	
+

+
+	
+

+


+	
+	
+	

+		

+
+						

+
+	
+


		

+

	



+

+

	
+	
	
			
	
+







+





	
+
		'9=9-1;;0
+	

+
		


+	
+


+
+2>=<=>>==>5


+		
		

+
	
+
+
%9>=<<=<===<>6
		
		






%6>===<=======<=4!
	
						
	

+


'8>>=============<>:+

+
+
			


	
-;?>>>======<<<<=====>=0


+			
+


+
+
+&9?>>>=;<=<====;<=<=====>>8%


	
				


				
+



		8??=<>>;;===>=<;:;======>>>?>3			


+			
+
					

+

*>?====>=>>>===<<KYI<======>>=>@;-&!

		
	
/5@>==>>>>=>><:<<Gce\lZ>>>===>>:=>>???=4!


+			
)O=<?=====>=>>>>EGEYp~i^jP==;;=>>=>=====>?=/


			
	
+



+,@>>==<======>=I��p~hW^a\[]\U^]?=====>=====>?6 


+							


+			
+
#<>=====>>=>>>><^��hTWXgheWMT[��[;==>========>?:"

+			

					
+

+	
#=>===<=>===>??>abkXR__ixg`XHE`_oQ;>>==9=>==<<=?9

+	
+			

+									

	
+!<?>>>>>>>>===>>Mz�oRf\W`_QJUWeWL_lvO<===;=====<=>?2
+			

+											

	
;?>=>>>>>>>>==>BssONgT<==<:==;RrWJOhtF<==<<====>==>>"		

+													


+
+
7?>>>>>>>>>>>>>>N��m[d<>5( '8=<`_EZ\[eA=======>>=<=?7,$
		
+
+															

+	

.@>=>>>>>=<=>>>>>UVijlP=:),$*-5<=KgIA0/^P<==>>>=>>>>=>>J?	
																					
	


=>>>>>>>>>>>>>>?DYMGUd@>9452=<:<>AdL3
/M=======>>>>=>>@#
+

+																
+


1?>>>>>>=>??>>>?>XaMIcY>?7265;<98>>dT0E?=>>>>==>>>>>=>5
+
+																
+
+
+	

+=>=>>=<<<<>@?>>?Dq�gOoQ??9;;<<<:3==Xd'
DA>>>>====>>>==>@1
+
+

+																		
+
+
+

.@>>>====>==????>R���XhJ?@>>====72>>O^(
3[?>>=>==>==>>==>>>"
+

																			
+	

+=>>>>>=>>>>>>??@@^���yiF????>==<87>>G]7)a�qA=>>>>>>>===>===?1


+																											
+
+
2?=>>>>?@B?>>>>@?Cm�r�|gC?>>??>==<;>=BbgnrF=>==>>@A@?>>>=<>:


+																		
+



>=>>>>?@A@?>>>?@?Ah��scbB??>??>>=<<>>A\_tJ?PJ>?>>>>A@???>===>>$	
																						
+
	
1@>>>?>>=>?>>>>?@=>T���j^@>>>??>>=;<:>?UO[i_UG>?=>>>?>>>>>>>>>?+

																											
+
=>>>??>>>>>>>???><=FY`ef[?==>?>=><<:9>@SSw�v_G=>>>>>>?>=>?>><=?3	
																								
)@>>>?>>>?>>>>>@@<<=AINOVX@===?==<;<;=>@SQW`VOA>=>?>>>>>??@@>;=?:
+	
																																	

7?>>?>>>>?>>>==>><<>@EHIPI>>=;==<8:;<>?ARIKND@>=>?@>>>=>?>>>?>>=>
	
																															
>>>>?>>>>>?>>IdB<=>>??AEH>>>=::<<;=<=>?@OJLHB>=>>>@H?>>>>?>>>>>=@)
	
+																														
+,@>>??>>??>??=b�oB<>???>?<<>>>====>>>>??=AEC@>>=>><O�I>>>>??>>>>>?6
+
+
																																
+8?>>?>>?@?>??=ns�I>?@@@@>B>=>>>>>??>>>?>@;>@@??>===r�I=>?>??>>>>>>=

+
																																							
 >>>>>>>??>??>Brkm=?@B??@FO?=>>>>???>>>?>LH??@A???>=w�G=>>>?@>>>>>>@$

+
																																				
+,@>>>>>>?>?@?=_muX<??@???EF=>>=>>?>>???>=BKA>?@A@?><o�K=>??>?>>>>>=@2

																																							
6?>>>>?>???@>LzlH>?>?@?>?==>>>>>>>>>?>>==?@????@?><g�V=???>>?>>>>>?;

																																							

=?>>>>??>>>>>jg_a??@?????>==>>>>>>==>>>==>>???@??@?<V}j@?A@>>?>>>>>>@"

+																																								
%@>>>>>>?>>>=IrVIF>??@@@A?>>>>>=>=>=>>>==>>>?>@@???>>FxvR=@?>>>>>>>>>@.


+																																							
+.@>>>>>>??>>;`jSB@@A?@???>>=>>>>>==>>>===>>>>>@@?@?>>=^zmA??>>>>>>=>>@5

																																							
+4?>>>>>>>?>==o`V>@B@?@?>>>==>?>>>==>>==>>>>>>>?@@@@>>>Co}Y<>>>>>>>>>>?:
+
																																								
9??>>>>>>>>=@{nO>A@???>>>>==>?>>>>=>=>>>>>>>>>>??@??>?=WpyH=>>>>>>>>>?>	
+																																								

=??>>>>>>>><@�tB????>>>>>>==>>>>>>===>>>>>>>=>>>?@?@??>Gbne;=>>>>>>>>>?	
+																																							
$??>>>>>>>>==<_\=>??>>>>>>>=>>?>>>>===>?>>?>>>>>>>>????>Cism:=>>>>>>>>>@%

+																																								
'@?>>>>>>==<<<=?>>>>>===>>>>=>??>>=>===>?>?>>>??>>>>??>>>k�Q:>>>>>>>>>>@(

+																																							
+
"???>>>>>>>====@?>>>>>=>>??>>>>?><<AGD><>??>>>>?>===>>=>>BH>=?@>>>>>>>>@(
+																																							
!7>??>>>>>=====;=?????>>>>???>??>AOdu�{oZE>>>?>>>>?>>>>>>?@?>==>>>>>>>>>@"
+																																								
3@>>?>>>>>====>???>HO>>????>>=>AQiv|zyxpdaSIFD@>?>8?>>?>>???>>===>>>>>?>?"
+																																									9>>=?>>>>=>==>?>???BD>???>@CIKPVV_�}qjg~pMJPTYTLG>;@=Pe?=>>>>>===>>>>??>@-
+																																								
+:>>=>>>>>>>=>?>>>?=<?????GPTUUQILokuot{cwlIILLU[a^J@=IW???>>?>>=>>>>???>@-
+																																								
9>>=>?>>>>==>>>>>?<>A?AJZ^TMIOPLhgKsxotTEufTUTMSZidPC>=>?>???>>====>????;
+
+																																							
6?=>=??>>>=>>>>>?>=@?GRV\QKHLYW\vlH{~vySEtt\UZSRODMSRKA>>>??>>>>=>>>??>?:

+
+
+																																						
3?=>=>?>>>>?@?>?>>>@JUPGJDMOPUS]jXG~wv�LBYd_ZWT^B;AEKWN?>???>>>>=>>????>?0

+																																						

3?=>>>??>>>@A@>>>>>FWTMIB<CXNVY^YCA[qpfDB at I]^[VdB4GRQSL?>>?>>?>>>>>?>>?>>=

																																						

6?=>=>>?>>>@?>>>???GUKR_P<JaRWZ_WBAAEGCCBBH`\XSdPH\I@>???>>@D@?>>>>?>>??>=

																																						
5?>>==>>????>>>???AA@?AK^YfcQHUeF??@@@@@?A at ZjQQoUTM????@??>@JB>?<>>?>>??><
																																					
+*>=9==>?>?????>??@@@?@?>CXpoKQoT>?@@>??????GvotfHC?????@@@??FH>??>??>=>@?;
																																					
+
-1.=>>>???????@@?@@?????B\bboG?@@@??????@AWocC???????@???@AA>>@>>?>=>@@5

+																																					

">>=>??????????@@????@?LlitqD?@@??????@@@@B><>??????@?@@@@??>@?>??<=?@1
+
+																																				
+
+


@=>????????>???@??????CfiliG?@?@@??????>=<=?>?????????A??????@???=<>@7

																																				
+

+!@>????????????????????>RfjhTB>????>>??>?ABGC?????????????????@>@>?>>?>,
																																			
+
+


"@>????????????????????>?QghdcSD>==<=@GNRVTG?????>???>????????@=>?>=<===$
+																																			
+	
+

@>?@??????????????????>==J```hie\TW_cd\^aF>?????>???>>?????????=>?>.:>>+
+																																			
+	
+
+>?????????????????>>???>><AUUEFScd_VML[\D>?>>????????=?????????>>>A'0/
+																																					
+
;?>?????>?????????>>???>>><=LYUJIJGHS`XA=>>>>>>??????>??????????>>A*

+																	
+																			
4@>?????>????????>>>>?>>>>>>=BPXUTV[RF==>>>>>>>??????????>>????@>>A*
+																
+																				
+)A>>?????????????>>>>?>>>>>>>>=?JJHD==>>>??>>?>>???>>?????>?????>>@%
+																																						
+??>????????>??????>???>>>>>>>>>>>=>>>>?>?????>>>??>>??>??>????>=??

+																																							
+
5@>>???????>?@????>>>>>>>>>>>>?>?>>>>??>??????>>>?>>?????>????==?:
+																																				
+		
+
#A>>?@??????????>??>>>>?>>>>>>>>????>??>>>?@??>>????>?????????>>@2
+																																					
+	
+
9@>>?@?????????????>>?>>>>?>>>>??@?>>>>??????>>??????????????=>@$

+																			
+																	
+	
+
%A>>?@?????????????>>>?>>>??>>>>????>>>??@????>>>???????????>=?;																			
+																		
+
+
+
6A=>??????????????>?>>>>>??>>>>?>>?>??????????>>>????????@?>=A-
																																					
+
+	
+@?>>????????????>>??>>>>??>>>>>>>>???????????>>??????????>>?>
																				
+																	
+
+
+
/A>>>?????????>?????>>??>?>>>>>>>>???????>???>>??>????@?>>>A/
																					
+																
+
+
+
+<@>>>????????>??>??>?????>>>>>>>>>??????>???????????@?>>>@<																					
+																	
+
+
+
#@?>>>??????????>????>?????>>>>?>?>>????>??>??????????>>?@&
+																			
+																		
+
+	
+
.A?>>>?????????????????????>>?????>????>>>?????>??>?>>>A.																					
+																				
7A?>>????????????????>?????>>?????????????????????>>>A4
+																			
+																			
+	
+
=@>>>>?????????>???????????>????????????????????>>>A:
	
+																
+
+
+																		
+	
+
#@@>>>?????????>???????????????????????????????>>?@=	
+																		
+
+																	
+		
+*A?>>>?????????????????????????>?>?>?????????>>>@?#
+		
+												
+																							
+
+
+
+1B??>>>?????????????>???????????>??????????>>>?@'
	
+	
+															
+	
+																		
+
+
+
5B?>>>>???????@????????@????@???????@@?@?>>>?A-	
+
+															
+		
+																
+
+
+
+
+
8A?>>>??????????????@@@@@@?@????????@??>>>?A4
+	
+
+		
+			
+						
+
+
+
+	
+														
+
+
+
+
+
+

9A?>>>>?????@@@???@@@???@@???@@??@@?>>>>?A6


+	
+
+				
+							
+	
+
+		
+			
+											
+
+
+
+


6B?>>>>????@@@AAAA@@@@@@@@@@@@@???>>>>?A3


+
+
+
+		
+										
+
+
+
+
+			
+						
+		
+
+		
+
+
+


/@@>>>>>>????@@?@@??@@@@@@@@?>>>>>>?@@,


+
+
+
+
+	
+	
+
+							
+
+
+
+	
+			
+
+				
+
+
+		
+
+
+
+


$;A@?>>>?>>>>?????>?????>>>>>>>>?@A:"
	
+
+
+	
+		
+
+						
+	
+
+
+
+		
+										
+
+
+
+
+



+<AA???>>>>>??>?>>>>>?>>?>???AA;+


+	
+
+	
+
+
+			
+			
+
+
+
+
+	
+						
+	
+		
+
+
+	
+
+
+
+


'6?AA@@?????????@??@@@@AAA=5(
+
+


+
+
+
+				
+
+


+
+
+
+
+
+
+		
+				
+		
+		
+	
+
+
+
+
+
+
+



+
'06;>AABBBBBAA@@?=<95.%









+
+
+
+
+
+			
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+


+
%*,--,*(%" 


	
+






+			
+
+
+
+	
+

+
+			
+
+
+
+
+
+
+
+		












+
+								
+	
+
+	
+
			
+

+
+
+
+			
+
+				
+																																				 [...]
+

+
+					
+				
+	
+
+





+	
+		
+



+


+		
	
+

			
		

+	

+
				
+	
+

+

	
	
				
+

+

		

	
+	

		
+


	







+
+
+




		
+
	
1<=7%*9;4
	
		
+
+
+

+
+	
+
	
':><<=>>=<=;'	
		
+
+	
+
+
	
	
+	
+$7>=<<<==<=<<==)




+

	
	
	$4=>==<=<==<=<====0
	

			


+
	
+

	
	
(6=>======<==<<<====>7'
	

+			
	


+
+
(:??=>>:;===<<<;<=<====>=/


+
						
	

+	


6?>=>>=;;=<===<<<<==<<=>=>?8#
+

+
+
+		

+
+
+			




)=?><===>==>==<;;::<=====>>>>>>-	
+


+
+
+
	

+				


	
+0?>=>==>>>>=<=<=OXZXC==>==>>>>=>?4


+
	
+				



,6@>==>>>>=>><;>Jh�k^�|F<=<<>>>:=>>??;6*

+
				 K=:?=====>=>>=@Z_b���vh��aJCB?=>==>>==>>>?:)


+
				


	
??>==========8U��m�{YbVdTaue{uC<>==>=>====>?2


				
+		
+		

+		


+4>==;<>>>=>>=;?f��nSbZeacMglY��`<==>>=======>?6

	
+	

+					
+
	
+5@>===>>>>=>?>Exxfzveahhfbam^VzepW<>>>=:======>?4	
+			

+									

+5@>>>>>>>>===>>Z���egI at HD>ABJajLm�vO=>==:===>=<=>?.


+

										

+
4?>==>>>>>>>>=>KtqejnE=70 ,:>?ceWP`oB=======>==<=>;
	

												
+

+			
1?>>>>>>>>>>>>>>]��miR=;"

#2>JjRw�vU====<<=>>>===?2(	
+
																		
+

+	

(?>>>>>>>=<>>>>>BZe��g??82512710=AbczhW^?=>===>>>>>===>K;	

+																	
+
	

;?>>>>>>>=>>>>?>GOHLlX=?<>=<><=8;=WbIBBPC=>>>>>>>>>>==>;		
+
+															
+
+
+


+@>>>==<=>?@?>??>ZoWOhH???@?>>==7;=Q`J5
=J=>>?>>>>>=>>==>-
+		
																							
+
+	
+
+
+;?=>><<<<=????>?@l�xY[A@@?????>?<=>ObB7R>?>>?>==>>>>==>?'


+																		
+
+		

+'?>>>==>>>=>???>>K���hV?@????????=??IbI
/c`??>>?>>=>=>>==>?9		
																			
+
		
+
+:>=>>==>>=>>???@?Jq~��[????>????????BZTT��rG>>>?>=====>>===?%


+																									
+
+
+	

*?=>>==>?@>>>??@@?dgvw_A?>?????@?>>??Th�z�rM>??>=>?@?>=>==<?2

																									
+

+
<>=>>>?AA@>>>??@?@|��qU^D?>>????@@??>=Sj�WEKK>@>>>>@B@@>=>=<>;
																							
+
	

+@>>>?>>>??>>????=;i���gRB?>?>?@@@??==>RPWhjYF=@>>>>>>>>?>>><>?!

																												
+
:?>>?>>>>>>>>?@@><;F\]gSSA>?????????==GWV���jC=??>>>?>>>=>>><=@,

																								


$@>>>?>>>??>>>?@@=;=<;?CKSA>?????????>>BRb�~N=>>@?>>>?>>>??>==?5
+	
																																
+

3?>>?>>>??>>>==>>;;>?@??DC>??????>?>>>>?JTQNZD<==@@>>>>>??@@>>>>=
	
																															
+=>>>?>>>>??>>CjP;;=>??>=>==>???>>>>>>>??AA@<::<==>AC=>>>>>?>?>>>@$
		
																																	
+)@>=??>>>????=T��T;>????>===<>>>==>=>>??>=<=>>>=>=;Zt@?>?>?>>>>>>?2
+	
																																	
+5?>>??>>??>??=grY=??@???>====>><>>>>>?>===????>>;G�A>??>@?>>>>>?<

+
																																						
=?>>>>>?@???>@toyB>@@?@@A@=>=====>>>>>>=@D?A@@???<S�xA>??>@?>>>>>>? 


																																					
+
(@>>>>>>??>?@<]owf=?@@?@@@?>>==>=>>>>?>>=?EA?>@A@@=K�zF>??>??>>>>>>@0


																																					
+
+4@>>>>>>?????JuczK=??????>>>>>>>>>>>>?>>==>@???@@?>D|zS=??>>?>>>>>>?;

+																																						
+
;?>>>>>?>?>?>jhOV?>????>?>>>>>>>>>>=>>>===>??????@>?pzkA at A?>>>>>>>>>@!
+
+																																							
+
"?>>>>>>?>>>>GrSLE???????>>>>>>===>=>>====>>>>?@@???=Q{vV>@>>>>>>>>>>@-


																																							
+
+@>>>>>>??>>;YjVD at A????@?>>>>>>>=====>===>>>>>?@?@@>>=Xtm@?>>>>>>>>>>@4

																																							
+
2@>>>>>>>?>=:gkY?BA?@?>?>>==>?>>>===>==>>>>>>>>?@?@@>?@`{S=>=>>>>>>>>?:
+																																								
9??>>>>>>>>==yuEAA??????>>==>??>>>>>==>>>>>===>?@@?@??>JkvC=>>>>>>>>>>>
+
+																																								

=??>>>>>>>=<>�h>@@???>>>>>=>>>>>=>====>>>>>>==>>??@?@?>Fc{W;>>>>>>>>>>@"
+
+																																								
$??>>>>>>>>==;[U=???>>=>>>>==>>>>>>>==>>?>?>==>>>>???@?>IqX:>>>>>>>>>>@'
																																							
+
'@?>>>>>>>=<<<=@?>>>>>==>>>>=>??>>=>>>>>>>??>>??>>>>???=Bu|C;>>>>>>>>>>@+
+																																							
+ ??>>>>>>>>===??@>>>>>>>>??>>>>>>=<=?>==>>>>>>>??>==>>>==CB=<>?>>>>>>>>@,
+																																							
,=??>>>>><=>=>>;???@?>>>>??>>?>=>ARgogSE?=>=>?>?>?>=>=>=?@?><=>>>?>>>>?@(
+																																								
1?=??>>>>>===>>>??>BJ>>??????>=AOar�����lcTKE@??@>:?>AF>>???>=<=>>>>>>??@5
+																																									:>>>?>>>>>===>>>>>>?@>@?>?@?AEOY[}�z~{t��mVURSE?A@<><Nf?>>>?>====>>>>??>?<
+																																								
<>>=?>>>>===>?>>>><<????@@@GUTRIGlXwplz]fnOLKMSBBKSODAC=??>??>====>>>@?>?<
+																																								
;>>=??>>>>=>>>>>??<>?BMTKFHSIKQNZmIrl_pMJsRTXPUTIP]XVOA;>>>??>>====>??>>?6

+																																							
:>>=>?>>>>>>>>>>>>>?CTXOQMUPJUXQYtN~viuSMrNPTTPVDAMDLYQ?>>>>>>>==>=>??>??#
																																								7>>=>??>>>>?@>>>>>>ARTNII at KSMVQLObIxpo{MEbVRSSLY;:JJQWYD>>?>>>>>==>>?>=>@$
	
+																																					
3?>;=>>>>>?@A?>>>>?ESEH\F5AWKWUPYP at RddVB?N\WWUL_;:\eRHOC?>??>>=>>=>>?<<>@1

+																																					
-?<6==>>?????>>???@CH??V[<J]HOTX_FAACCBAACX_OOTijliL???A@??>?@>=>>>>?<>??6


+																																					


!60,==>>>>??>>>>??@@???@Q`gfQHTcI@@@@@@@@@BdjWZmucD>??@A@????@?=<>>>?<>@?9
																																					
+

!
#>=?=>???>>???@@@????>HfqhgkJ???@???????HzpclbB????@@@???>>??>>>>?<>@>;
																																					
+


#@>>=????????@??@?????>NepuZ?@??@????@?@BuygnN?@???@@@@???????=???=>@?6
+																																					
+

	%@>>>??????????????????@etq^@?????????@?Drxn^C?????@@?@@@@???@=>??>>?@3

+																																					
+


+%@=>??????????????????>=NrvpF>???@?????>RoifP????????????????@?>?>?>>?;!
+																																					
+

#@>>???????????????????>?[y�jF=>???????Lnmm^C??????????????????>?>>>>==8
+																																					
+

 @=>????????????????????>Bbuys]H@>==?GZmda`D>????????????????????>>>;>==!
+																																				
+
+

?>>?@????????????>>???>>>AYbZajke^agj`MQVC>??????????????????????>?*3<5

+																																						
+
;?>?????????????>>>??>>>?==KYSMOV]]SHJRQA>>?>????????>?????????@?>A$



+																																						
6@>?????????????>>>>??>?@?>=BR[TKKJKRUI>>>>>>???>???>???????????>>A%

+																																					
+
-A>???????????>??>>>?@????>>==CSWOU]N@=>>>>>>>??>>>>????>>>?????>>A$

																																						
+
!A>>??????????>???>>?@?>>>>>>>=>KPPH=>?????>>>??>>?>?>??>??>????>??!


																																							
+;?>????????>???>??>??>>>>>>?>>=>>==>???>???????>??>>??>???>???>>?=

+																																							
+
.A>>?????????@??>????>>>>>>?>>>>>>>>>??>?>????>???????>???????==@7
+
+																																							
+
??>????????????????>>>>>>>>>>>>??>>>??>?>?@??>?????>>????????<>A-
																																									

3A>>?@?????????????>>>>>>>>?>>>???>>??>???@@>??????>????@>??><>? 																																							
+	
+
@?>>???????????????>>?>>>>?>>>>@???>>???@???>?????>????????>>@8																			
+																		
+
+	
+2A>>??????????????????>>?>??>>>?>>?>????????>??>????>?????>>>A)
+																																						
+
+
+
>?>>???????????>??????>>??>>>>>>>>?@????????>?>????>?????>>@;																			
+
+																
+
+	
+
+B>>>??????????>>??>>??????>>>>>>?????????>?>????>??????>>>A*
+																			
+																			
+	
+
9A>>>>????????>????>>????>>?>>>>>>????????>???????????>>>@8																					
+														
+			
+
+
!@?>>>??????????>???>>??????>>??>?>>???????>?????????>>>??!
+																			
+																		
+
+	
+
-B?>>????????????????????>>>>????????????>?????>????>>?@*
	
+																
+
+	
+																				
+7A>>>??????????????????????????????????????????@??>>?A1	
+
+																	
+	
+																		
+	
<@>>>??????????????????????????>????????????????>>>A7
	
+																			
+																				
+
"@@>>>?????????????????????????>??????????????>>>?@;
	
+	
+																																					
+
+*A?>>>>??????????>????????????>??????????????>>>@>!
+																			
+								
+										
+
+	
+0B?>>>?????????????????????????????????????>>>?@'
	
+															
+						
+			
+										
+
+	
+
4B?>>>???????????@?????@????@??@?????????>>>?A/
+	
+
+														
+
+
+
+
+									
+		
+		
+
+
+
+
+
6A?>>>>??????????????@?@?@@@???????????>>>?A5
+
+
+
+
+											
+	
+
+
+	
+								
+					
+
+
+
+
+
+

6B?>>>>??????@@@??@@@@@@@@@??@??????>>>>?A7

+
+
+
+
+
+
+	
+										
+		
+				
+	
+							
+
+
+
+
+
+

3A@>>>>>????@@AAAAA@@@@@@@@@A@@??>>>>>?A4


+
+
+
+
+	
+			
+						
+
+
+
+
+			
+												
+
+
+
+
+

, at A?>>>>>????@@?@@?@????@@???>>>>>>?@@-

+
+
+	
+											
+	
+
+
+
+
+											
+		
+
+
+
+


!9A@?>>>>>>>>?????>>?>>?>>>?>>>>?@A9"

+
+
+
+		
+
+
+
+					
+
+
+
+
+
+											
+
+
+
+	
+
+
+
+



(:AA??>>>>>??>???>?>>?>?>???@AA:*
+
+	
+
+
+
+		
+			
+
+
+
+
+
+
+
+	
+						
+		
+	
+	
+	
+
+
+
+



+%5>AA@@???????@????@@@AAA@<4&
+



+	
+
+
+				
+
+
+


+
+
+
+
+	
+				
+			
+			
+
+
+
+
+
+
+


	&07;>AABBBBBBAA@?=;83,#	



+
+
+
+
+
+
+
+
+				
+	
+
+				
+
+
+
+
+
+
+
+
+
+
+
+


+$*,--,+)&#!


+			





+
+					
+
+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+
+	
+










+
+										
+
+
+
+

+				
	
+
+
+
							
+
+
+					
+																																						 [...]
+																																					
+																																																																																									 [...]
+
+					
+
+	
+
+
+
+
+
+

+			
+					





	
		

+

		

+

+

+		
	

	


	
		


+
		

		
+

+
	
	


+
+
+
+
	
	


+
+
+
+
+


+	
+				
		
&6<=3
!5:5"
+
+
+		
+
+

			

+		
 2==<<==>=<==,	
		
		

	

+
+

0<>=<<<==<<<<==0
	
	
+	

	


+
+
+
.;>===<<<=<<<<<<=>8#
+	
			
		
	
	
+	0=?======<<<<;<<<<==>>1!
+
		
+	



+	



2=?>>=<9====<<;:;=<<=>>=>;.
+
+							
+

+
+		
+-<?>>>>>=>====<::;===<==>=>>>5

	

+
+
		
+

	4?>===>>>>==<<<BCA><=======>>>?<"




+		
+


+	
	6?=><=>>>>>=;=@T|jbtZ?<<<=>>>=>>?>$


						
+

(6?==>>>>>>>9:AYt��ys��ZHA;;>>><;>>>>6+

+
	
+
+	
G=8?====>>>>>9:eo}���xi�}lx]\O===>>>==>??>4#	
	
+

+
+
	6A>>==>==>>=:2_��b�|[`?NZ��a��K;>>===>===>?=.	

	

+
+
	
+

	
+


&<==;<>>>>>><7Dk��l]ngWLci�vk��`>=>>>>>=====>?1
+
+
+			

					

	
+
%>?>=<=>>>>>?=M|io�eOKCHMSjl}�`nb>>>>=<======>>.

+		
+

+								


&>?>>>>>>>=>>?@i���|\?=7-%2>AImj���P>>==:<=>>==>>=&	
+	
+	

												
+
		
+(>?>=>>>>>>>>>>Pstx�jA?:1% 9>Osl^jkC>====>=>=;<>?6
+	
+
														
+
		
+
&>?>>>>>>>>>>>?>h��ggF??<>9-%-<?^Wy��J>>>>==>>>>===>/(	
																	
+



=>>>>>>===>>???@[��^?@?@????:2:>Pb�{cJ>?>>=<>>>>>===?M5


+																
+
+
+
+

6?>>>>>>=<>>>???>HZjrJ?@???????>=>N\TRRJ@?>>>>>>>>>>=>?;
+
+															
+
	
+

+
+#?>>>>=<=>??????=]vZWL???>?>???????M\OQL[E?>>?>>>>>>>>>>=#
		
																
+
+	
	
+6?=>=<<<<>????>>@|�|TC?@?>>???????@IXECFUL??>>?>>>>>>>>=?=





																				
+
+

+
	
?>=>==>>>=????>:H���nH?@????>?????@D\YKcz^B?????>>=>>>>=>?2
																
+

+	
3?=>>=>=>>>??@?@==[w��L??????>??????@WZh��jG??>>>>===>>>>>><		
+
															

+	

+?>>>==>??>>???@?GuybzmF@???>??????>??M`���yE=???>=>>>=>>>>=?'


+																						
+
+
+
+6?=>>=>@@@>>???@=^�z�{LB@???>>>>?????>Ln�pYR@>@??>>@BA?>>>>=?4	
																											



+#@>=>>>?@?>>>???@;U��w�h=@?>>>>????????KVfb^R=>@??>>?@???>>>=?<
+

+																											


+
6@>>>>>>>?>>>???>:B����N???>>>>>?>?>>?BLYz���K=@@?>>>>>>>?>>=<@#

																															



?>>>>>>>>?>>>?@?<:<FPPG>???>>?????????@Di��|�\<?@@>>>>>>>>?>>=@/
+
+																																				

/@>>>>>>>??>>>??<9:>=<<=?????>???????????Hj{��R;=@@>>>?>???@>>>?9


+																																		
+

;?>>?>>?@@???@nlC:<???>=>>>??????????????>?MkpC;<>BA>>????@@?>>>?


+																																					
+#@>>??>>?>???>K��uA=???>==>>>??????????>???>=>?<<;<me=?>??>>>?>>>@-

+

+																													
+1@>>??>>>????=`}yi>??@>>>>=>>>??>>>>>?>>?>>=>>===;[�q=???>?>>>?>>?9

																																				
;?>>?>>>????>@rn�K=??@@>>>>>==>>==>>>>>?>>>>@@?>>=s�q>??@?@?>>>>>>?

	
																																				
"?>>>?>>?@?>?=\rsk>?@?@A?>>>=====<=>>?>>>>=>@?>@??<b{wA>???@>>>>>>>@.



+																																				
+	
/@>>>>>>??>??IwVhJ>@???@>>>>>>>>>>>>>?>>>==>?>?@@?=T{rR=??????>>>>>?:

+																																							
+9?>>>>>>>?>>=fhLN??>??>?>>>>>>>>>>>>>>>>===>???>??>G�ypD@?>?>>>>>>>>?


																																								
+
>>>>>>>??>>>CmYOB??>?>>>>>>>>>>>>>>>>=>>>>>>????????RjyR>?>>>>>>=>>>@*


																																							
+
&@>>>>>>??>><PlbB@??????>>>>>>>>>>=>>==>>>>>>>>@@???>>Dkj?>>>>>>>>>>>?3

																																							
+
/@>>>>>>>??>:_vRAB?????>??>>>>>>>>>=>>>>>>>>>>>@???@?@>UzO=>>>>>>>>=>?:

+																																							
+
8?>>>>>>>>?=;tl?C??@@?>>?>>>>>?>>>>>>>>>>>>>=>>????@@??Kpo?=>>>==>>>>?>
+																																								
=?>>>>>>>>=<<|a?@?????>?>>>>>>>>=>>>=>>>>>>>=>>?@?@@@@>PhJ<>>>>>>>>>>@"
+																																							
+
"??>>>>>>>===;\T>?>>>?>=>>>>>>>>>==>>==???>>>>>>?>>???@>Pv�H;>>>>>>>>>>@*

																																							
+
&@?>>>>>>>=<<<<@?>>>>>==>>>>>>>>>>>>??>???>?>>???>>>???>G|n<;>>>>>>>>>>@0
																																							
+

#@?>>>>>>>==<=?@??>>>>=>>??>>>?>>>>>>>?>??>?>>>??===>>>>>B>=<>>>>>>>>>>@.
+																																							

=?>>>>>==>===?=<???>?>>>?>>?>>>>>?CDA?=>>>>>>>?>>>>==>>??>><=>>>>>>>??@1
																																								

-:@?>>>>====>>>?>>?B>>?>>?>?>>ADCBHX]NICEFEC@>??><?>GK=>>>>=<<==>>>>>???>
																																									/=;??>>>>===>>>>>>=>>??>????@FS^gcK`~}\MMb_WTOA?@?>?=KY?>>>?>=====>>>?????$
																																								
5?<>?>>>>>==>>>?>>==????@??AQUWVb_Ulm|PCih[PRN>@?CPOB=;?>>>?==<==>>>??>>?'

																																								
6?<=??>>>===>>>>>>>??CMF???MNOUX^XatURtdCb]ZYQ[E>>HVYXD<>>>>>=====>>?@>>>?$

+																																							
3?9:??>>>=>>>>>>>>>@BYaN?=CWKSVS^\[_YuZFbRQTORN>?HSUYP@>?><<=>====>??>>?:
+																																							
*=46??>>=>>?@>>>>>?@EJONA>HVLTXSZUFosoiDDcUUUNSS:=LXIHPA>>?>><<=<==>??=>@3																																							

4(1?>>>>???A?>??>?@A=?H?3GYQUZXZI?EPOD@?S_VXRJY6@[O??C@??>?>><>==>>?==?@1
																																						

#,?=>>?????>>>?>?????@A6G]MT[c^DABBAABAB]eUMJhW]O@??@@@?>?>?>>>=>>?>=?@1

+
+																																				


*@=>>>???>>?>>???????@CGfNUglO@@@@@@@@?Fgn`knaK????@@?????@?>>>>>?==??6																																						



+*@=>=>???>>>??????????@CXooaJ@??@???????CXyv]K?????@?@???>???>>>>?>=??;
+																																				
+
+



+@=>=>??>>?>??????>????@FUQ>>???????????=Eae[B????>????@?>???@>>>?>=?>=

+																																				
+
+
+

)@=>???????????>??>??>?>BHE=??????@?????=UlkP>?????????@???>?A?>>>>=>>>%
+																																					
+
+

&@>>???????????????????>>EG@>?????????>=ImxcA?????????????????@??>>>>=>4
+																																					
+
+

!@>>??????????????>>>??>>@GGB?>>????>>>NpzmH>????????>???????????>>>>>>9
+																																				
+
+
+

?>>??????????>??>>>???>>>AN[UJC?>>=>D[sngL>@????????>???????????>>>3<>2																																						
+
+
==>?????????????>>>>??>>>>BWie_ZVRX`hkgdI>???????>??>????????????>@"
*
																																							
+
8?>????????????>>>????>>??>?O^\Y^he_]a^G=>>>?????>????????>??>??>>A!

+																																						
+
0@>>?????????????>>>?>>>???>=FTVSTSVYN?=>>>>????>>>>???>??>??>??>>@!

+																																					
+
&A>????????????>??>>????????>=?FNPPNB<=>>>>>>???>>??????>??>>???>>? 
																																							
+
>>>?????>????>???>>@@????>>?>>>?CC?>>>>?>>>>???>>???>??>>??????>?=


+																																								6@>?????????????????@?>?>>>?>>>>??>>>?>>>>>>??>>???>>?>?>>????>>?;
+
+																																					
+	
'A>>?????????@???????>>?>>>>>>>>>?>>??>>>>>?@?>??>???>????????>>@5
+																																									
=?>????????????????>?>>>?>>?>>>>?>>???>>>?@@?????>??>>???????>>A*
																																									
+
.A>>?@??????>>??????>>>>>>>>?>>>?@????>>?@@?>?????>?>???????>=?>
																					
+																	
+	
+
>@>>@??????????????>?>>>>>>?>>>?@??>????@@?>???????????????=>A4
																			
+																					
+
+A>>>?????????????>??>?>>>>?>>>>>????????????>????????????>>?@%																					
+																	
+
+
+
:@>>?????????????>???????>>>>>>>>???????????>?????????>??>>@9
																			
+
+																	
+
+	
+
%A?>>?????????????????????>>>>>>????????????>>???>?????>>>?A&																				
+																			
+
+
+
4A>>>>???????????>???????>?>>>>>>>??>???????>?????????>>>A5
																			
+	
+																		
+
+
+
>@>>>>???????????????????>>>>????>????????????????>>>>>@=
																				
+																			
+
+	
)A?>>>??????@????????????>?>>??????????????????>??>>>>?@&
	
+																	
+	
+																	
+		
+4A>>?>?@?????????????????????????????????????????>>>?A.	
+																		
+	
+																		
+	
;A?>>>?????????????????????????????????????????>>>>A6
+	
+																	
+
+																		
+
+	
!@@>>>>?????????>?????????????????>????????????>>>A;
	
+	
+																
+																		
+	
+
+)A?>>>????????????????????????>?????????????>>>>@?"
+
+
+													
+			
+																			
+
+	
+
/B?>>>??@?????????????????????????????????>>>>?A*
	
+
+																																				
+
+
+
+
+3B?>?>??????????@@@???????????@@????????>>>>?A1
+
+
+
+			
+												
+
+
+																
+
+
+
+
6A??>>>???????????????????@@????????>?>>>>?A6

+
+
+
+
+													
+
+	
+												
+			
+
+
+
+
+
5B?>>>>???????@?@??@@@@@@@?@?@??????>>?>?A6

+
+
+
+
+
+
+										
+	
+				
+												
+	
+
+
+
+

2B@>>>>>??>>@@AAAAA@@@@@@@@@@@???>>>>>@A3

+
+
+
+	
+	
+			
+						
+
+	
+
+								
+			
+
+	
+
+
+
+
+

+ at A?>>>>?>????@?????@????????>>>>>>?@?+

+
+
+
+
+	
+		
+			
+				
+
+
+				
+			
+				
+		
+
+
+
+


 8B@?>>>>>>?>>>>???>?>>>>>>>>>>>?@A7 

+
+
+
+
+
+	
+	
+
+				
+			
+
+											
+
+		
+
+
+
+
+



':AA??>>>>>>?>?>???>>>>?>?>?@A at 9'


+
+
+
+
+
+
+	
+				
+
+
+
+
+
+
+	
+	
+		
+		
+	
+
+
+	
+
+
+
+
+
+



	%5?AA@@????????????@@@AAA@;1%
	

+
+
+
+	
+
+
+	
+
+
+
+

+
+
+
+
+	
+					
+						
+
+
+
+
+
+
+


+

'18=?ABBBBBBBAA@?=;72*!






+
+
+
+
+
+
+
+
+
+			
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+


+	
 %)+,,+*(&#!


+		
+



+
+
+					
+
+
+
+		
+
+			
+
+
+
+
+
+
+
+
		
+









+										
+	
+
+	
+
+
+		
+	
+
+
+
				
+
+
+				
+																											 [...]
+
+				
+
+			
+
+			
	
+					
+



+	
						
+



+	

	

	
+

+		


+	
+
	

+	

+
+
+
+		

		

	

+
+
+
" 




+	
+
+	

	
+


+

+	

*8<=1
395$
	
+
+		
+	
+	
	
+

+'8>=<<====<==/
+
			
+
+				
+	

"7>>=<<;==<<<<<>7!


+



+
+
+	
2>>===<<<<<<<<<<<>=/
	

+	
+
	
	

			
&3>?=>>===<<<;::<<<=>>?9+

+

+		

+

+

+
+

+
+	
*7>>>>=;<>===<;;;:<<<=>>==>6"
	
+			
+		
	

			

+
"5>>=>>>><=>=<<989;<<<==>==>>><-
+			


		
+!9?>=>==>??>=<;?TQIG>;<=<=>>>>>>?4

	
+	
	


+


	
:>===>>>>>>95;Jv��w�xK=;;=>>>>==>@2


			
+			


#8?==>>>>>>>2. at w�����hoP;5=>>><=>>?4!
+


+			C;6?>===>>>>>:=dp��}|eUyt��lr\;==>>>===??9,
	

		
		
+,B>=>>>>>>>>;9d��n�}fO:Ho��g��P9>>===>>==>?;(

	
+
	
+
+	

	

	

5>><=>>>>>>=9=h��yoeUE at Jc�s���]@<>=>>>>====>=*
+
								
				
+

+
+
+3@>>:<>>>>?@;Ili~�iLD>729BIPy�_kj>>?>======>=>=%			
+

+								

	
1?>>><>>>=>>@<e���rG>>>7"
6=<Y����N>?>=;;=>>>==?8

+
+	
+

+									
+

	
6@>=>>>>>?>>>?Fa|��V@@??@8%.8?FxykrjD>>>>>>>>=;=>?,
	
+
+	

+												
+




8@>>>>>>>?????<k��n\B@@?>?@;===>Z]}��L>?>>>>>>=<==><+%

+																	
+

+	

6?>>>>>>=>>???@8S���J@@?>>>?@?@??Nk�waI??>>>==>>>>===AL,
+

																	
+
+
+


,@>>>>>><<>>???=>@IgY@??>>>>>????>L]PNLE@?>>>==>>>>=>>?A		

+															
+
	


+<>>>>==>=>????=A|�T6;?>>>>>>>>>>??JXNUVQB?>>?>=>>>>>>>>;
		

+													
+
+



.@===<<<<>>??>>;S���K9??>=>>>>>>>?@DKBYZKD??>??>>>>>>>>>?6

+

	
																	
+	
+
+
+	<>=>==>>==???>>:S�~y~B=??>>>>>????@ANRVcvU????>?>?>>?>>>>?%
	

+														
+

+	
	)?=>>===>>>?????;Go���N>>>????>?????@JS]��f>??>>>>>==>>>>>?4				
																	
		
+	;?=>===>>>>>??@>T����fB?>>???????>>??C`����A=>>>?>>>>=>>>=>=

+
+																				
+
+	
+
,@>>==>>@?>>???@<�����Z?@?>>>>>>??>>??Bq��sX=>@??>>?A@>=>>>>@*	

																									
+


+=>=>>>@@?>>>?>?@:}ϲ���?@?>>>>>>?????@B\zZ=?<>A?@??@AA@?>>>>?7


+																																	
+
	

/@>>>>>?@?>>=>>?>6j����i>@?>>>>>>>>>>?@?I_o��n>@@@?>??>>??>>=>>


+																																		
	
=?>?>>?>?@?>>>?@=9>k{�tB@@?>>>=>>>=>>?@=K�y{��F?A@?>>>>>>>?>>>@'

+

+																																
+


(@>>>?>>>???>?DH;89<:89:@A@@@????>?>>>>?>G�����?>A??>>>>>>>?>>>?4


+																																			
+


7?>>>>>>?@????o�bC:>??=<>?@@???????????>?>o��ۃ6<>D@??????>??>>?=


+																															
+


?>>>>>???@???D�v�[=???>==>?????@@@?????=>ACXelE77HT=??????@?>>>@'
	

+																																	
+,@>>??>>?>???=X�huD>@@>>>=>>??@@@????????@@>;:9;;Fx�_=?>>>>>>>?>>?4


+																																				
8?>>?>>>>>>???tz�V=??A?>>>=>>?????????????>=>@?><N�yg=???>?>>>>>>>=


+																																				

>>>>?>>>??>?>]phj????A?>>>===>>>=>>????>>>=?A???>Assr??@??@>>>>>>>@+
	

+																																							)@>>>>>>>???>HyT]H?@??@?>>>>>=>>=;<=>>??>==>??>???=gvoN>@???>?>>>>>?8
+

																																									4?>>>>>>>???=`jbN?@?@??>>>>>>=>>>==>>>>>>>=>?>?>?@>NnoC????>?>>>>>>>

+

																																								
+<?>>>>>>>?>>@meNA@???>?>>>>>>>>>>>?>>>>>>>?????>>>?AWJuT>?>?>?>>>>>>@'


																																								
 ?>>>>>>>?>><Jwa?@???>>?>>>>>>>>=>>>>>==>>>??>>???>??D>ck?>>>>>>>>>>>?2
+
																																							
+
+@?>>>>>>??>:[zFB@???@?>?>>>>>>>>>=>>>>>>>>>>>>?@??A??>UuM=>>>>>>>>>>?9
+
+																																							
+
5@?>>>>>>>?>:jb at B??@??>??>=>>>>>>>>>>>>>>?>>>>>??>?@A@@Zpf<>>>?>>>>>>?>

+																																								
<?>>>>>>>>>=;zb@@??@?>>??>=>?>>>>>>>>==>>>>>==>????A at A?Yn|A=>>>>>>>>>>@#

																																								
 ?>>>>>>>>>==:aV>???>>>>>>>=>?>>>==>>==>??>?>>>?????@@@?N{�?<>>>>>>>>>>@,

																																							
+
&@?>>>>>>>=<<;=@?>>>>>>>?>>>>?>>>>>>>>>?>????>??>>>>????G~d:<>>>>>>>>>>?3
+																																							


%@?>>>>>>=<<<=>@@?>>>>>>>?>>>???>>???>?>???>?>>??>>>=>>>?C<<=>>>>>>>>>>@.
																																							



@??>>>>==>=<=?@<=?>>>>>>?>>>>?>>??@?>?>>??>>>??>>>>==>??>==<=>>>=>>>??@6
																																								

;@>>>>>>===>>??>>?>>?????>?>>>?>=>DA<=>>>?>>>??>>?>ML>>>?<<<<==>>>>>???@(																																								
+
5@>>>>>====>>>>?>=>?@??>?>BMPHD at GcxvZB@?AHOJ@?@?=?>KL=>?>>>====>>>>??>>?/																																								
+

&0@?>>>>===>>>>>>>=?@@@??@AXedRKWvp^dxlRFLZa]R?@@AFJA=<>>>>>==<=>>>>??>>?3																																								
+

'*>?>>>====?>>>>>>?@AC@@??Q]]^YZicXV_}cY^cbY]H???P[M?=>><>>=====>>>?>=>?3
+																																							


"#<??>>==>>?>>>>>?@@GOC??D]V^]Y\^}nUWgyZZ^_f\RP???HID@>>>>=>>=====>>@>>>@-
+																																							


;??>>>>>?A?>??>?@@AA@??M[XhbVNC\woqvUAIV\ccRT>??@>>>>?>?>>?>=<=>>>?>>>?"
+																																						

9?>>>?@??A@>>@???????>;OYZe^QF??ISSH??@LV]]TZ7>?>?????>>>>>>>=>>>>?>>>;
+																																				
+




7?>>>>?????>>>>??????>:K_][WMCAA?@@@AB at DS]`a[?????????>??>>>>>=>>>?>>?8
																																					
+
+




4?=>>>???>>>?>???????>?A^d_UG@?????????@M`psL>????????>??>@@>>>>>>>>>?<
																																						
+




0?=>?????>>>>??????>>>?=CSRHA????>>???>?AGSN=>??????>@>??>???>==>>?=>>?.																																						
+
+



-?=>>???>?>>>>>>>>>>?>?><<=??????>??????>;<<<>>??>??>????>>??@>>>?>=>>?3
+																																				
+	
+
+

(@=>>???>???>??>?>>>>>?>>==?>???>>??????>;<<=>>??>>?>>>?>??>?@?>>>?==>?3
+																																						
+
+
#@=>????????????>>>>>??>>==>???>>>>???>>==?<>??>??>?>>>>???>????>>>>>>?3																																						
+
+
+

?>>?????>?????>>>>>>??>>>==??????>>>>>?DG@=>>??>>>>>>????>??????>=>8=?+																																			
+			
+
>>>????????????>>>>??>>>>><=>>>??>==>BMRG>?????>>?>>>?>???>??>??>>?)&-																																							
+

;>>??????????>??>>>>?>>>>?>=>??????@CJNF??>?????>>>>>?????>??>>?>>A$


+																																							
+
4@>>????????????>>>>>>>>>>>>>???@B at AEHC>>>>>????>>>>>???????????>>@"
+																																						
+
,A>>??????????????>>>>>>>>???>>>?@??A@>>>>>>?????>>?>>?>????????>>?!
+																																						
+

 @>>?????>?????>??>>>>>>>>?????>=>>=>???>>>>????>>??>?>?>>??????>?>

+																																								

;?>???????????>?>?>>>>>>???????>??>??>>?>>>>??>>>??>??>>?>?????>?<
+																																									
1A>?????????????>>???>>?>>>????????????>>>>>>?>?>>??>>>>?>?????>@9																																									
+"A>>?????????????>????>>>>>>???>>?>???>>>>>??????>??>>??>?????>>A3
																				
+																				
+
:@>>@??????????????>>?>>>>>???>>?>>>>>>>>????????>?>>????>???>>A(
+																																										
(A>>?@??????>>??????>>>>>?????>>?@??>>>?????????????????????>>?=
																					
+																		
+	

:@>>????????????????>>>>>????>??@@????????>>???>??????????>=>A1
																			
+																					
+
&A?>>????????????????>??>>???>>>@@?????????>???>??????????==?@!																				
+																			
+
+
+5A>>>???????????????>??????>>>>>??????????>?????????????>=>A6
																				
+
+																	
+
+
+

??>>?????????????>???????>??>>>>???????????>??????????>>>?@#																				
+																		
+
+
+	
+/A>>>>??????????????????????>?>>>?>????????>?????????>>>>A1
																					
+																		
+	
+
;@>>>>??????????????>????>>>>??????????????????>??>>>>>@;	
+																		
+																				
+	
+%A?>>>??????@????????????>>?>??????????????@?????>>>>>??#
	
+																	
+	
+																			
+	
0B?>>???????@?????????????????????????????????????>>?A,	
+
+																	
+	
+																			
+
8A>>>>>?????????????????????@??????????????????>>>>A5
+
+
+																	
+	
+																		
+
+
+

>@?>>>>??????????>??????@????????>???????????>>>>@;
	
+
+
+																
+				
+													
+	
+
+
%@@?>>??????????????????@????????>??????????>>>>@?#
+	
+
+	
+										
+			
+																			
+
+
+
+
,B?>>>?????????@????????@????????????????>>>>>?A+
+
+
+
+	
+																																	
+	
+
+
+
1B?>>>???@@??????@@@????????????????????>>>>?A3
+
+
+
+
+											
+			
+
+										
+						
+
+
+
+

3B?>>>>??????????????@?????@?????????>>>>>?A7

+
+
+
+
+
+	
+										
+
+	
+																
+
+
+
+

3B?>>>>>???>>?????@@@?@@@??@?@??????>>>>?A6



+
+
+	
+
+											
+
+																			
+
+
+
+

1A@>>>>>???>?AAAAAA@@@@@@@@@?>???>>>>>@A1



+
+
+
+
+		
+								
+	
+
+
+
+															
+
+
+
+
+

)?A?>>>>>?????@@???????????>>>>>>>>?A=)
+
+
+
+
+
+	
+					
+	
+			
+
+	
+												
+	
+
+
+
+


8B@?>>>>>>>>???????>?>>>?>>>>>>?AA4

+

+
+
+
+
+
+	
+
+				
+
+	
+	
+
+											
+
+
+	
+
+
+
+
+



':AA???>>>>>?>?>??>?>>>?????@A at 6$		

+
+
+
+		
+
+	
+		
+
+
+
+
+
+
+	
+
+								
+
+
+
+	
+
+
+
+
+
+



%5?AA@?????????????@@@AAA?:/"

		

+
+
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+		
+			
+	
+						
+
+
+
+
+
+
+

	
+
(3:>@ABBBBBBBA@@><:60) 

	
+




+
+
+
+
+
+
+
+					
+
+
+
+
+		
+
+	
+
+
+
+
+
+
+
+
+


+	

"&)++,+)'%" 


	
+


+
+
+					
+
+		
+	
+

+		
+
+
+
+
+
+
+
+
	
+












+			
								
+
+
+	
+
+
+
+			
+
+
+
			
+
+
+			
+																																						 [...]
+
+
+					
+
+		
+	
+		
+






			
+
+

+	
+
+			



+		

	

					
+

	

+	
	
+

	


+		

	
+
		
+

		

				
+	
!++




+
+				
+


		
+
		
+	

0:<<8/.586)
+	
					
+
+	
+
+-;=<;;;=;9:==4

+
		
	
	
+
+
+
$:?=<;;;<:8:<<<=;)


	
+
+

+
+
+	
+

1>?=<;<;;;88;=<<==>6$
+

	

+	
+
		



'2<?=>><;<;;968;<<<<=>?;,


+
+		
+
+	

+		
	
 .7=>>>>=>;;<<;67<<;;9<?>==>9+	
+					
+		
	

		
+		%8=<==>?=9<;<:51469:<<<>>==>>?>8+
	
			
+
+
+
		"9><<;69<==<;70Qw_UdJ9:=<=??>>==>=+	

+
+		

+	
+	


+ 9=<=<:;:;>>69GP������QJ=9=??=>=<=?;

+
+		
+							
		7><<=;=>=??52P����p���~�_=:=>>>><>??6
+
+			<94><<<<:<>>?:Rth��wpLJmx��y�o==>???>>=>=2%	

		
			
'@==<==<;<=><:|��ovaN@=Cc��z��K<?@?>>>==>??8#	
+
	
+
	
+		



+
+	

*=;<===<<<==:7f��XE@=@@?EKP���S>=?>>>>=>>=>?<$
+
								
+

+				

		

#??=;<<=<<==<UiQfiD<?>@94>>=]�s|e:>?>>>>>=<==?8

+			

+							
+

+		



=@?>;:=<<;;>:l�~tI<>?AA=6<@AH����D?@?><;=====>?.

+	
+	

+									
+
+



&=@@@@?>>>=<:<BN[oiB?@@??ABBAAAk}tlB>=>==>====>>> 
	
+
+
+
+	

													
+

		
+
+>?>>?@A@??@>:@{�X96<ABA at ABA@@A at Nj���J>>>>>>>><<>>@6




+

																
+

					
*??>>>>?@AA at AB<<hol_;DCBBA@@@??@?Eq�z`E@@???????>>>>>@G#		
+

+																		
+
+
	
 >?>>>??=?@ABBEAMR1P_HHFCA@@?????@DVUQGC@????>>??>>>>>BE
			

+																					
+



8@?@@???>@ACDEFa���SWQIEDCBBBBBAABCFHIFE@???@?=>?>>>>>?;
	
+		

																									

+	

+%A@@@??@ACDEGHJI����kUOKHGFEDCBBBBB@>BC=>??@@@??>>>>>>>@,		
+	
+	

+																										
+
		
+

+7A?@?@@AABDFIKNM�����yNKHFDCBBAAABAAACEKhU>?@?????>>>>>>?=
	

	
+
																													
+

	
+
+
	@?????@@AABCEGIH`����hGCAAAAAAAA@@@??BJ|��B>>>>?>>>>=>>>>@,			

+																														
+
		
+

+4A???????@@AAACEU���yVGJFB@????>??@@A at N��u�O>>>>?>>====>>>?8
	
																																	

+
+

+!???>>>?@@@@@@AC?i����J7BEDCB@???>==>?=f����J?A@@@??@?>=>>>>>		
																																		
+


7@>>>>@@@?>?@@BC4B����s4:?AAAA@>???>>??K�lX?>A?@??@BBA?>?>>@-

+
																																		
+


%@>>?@@BA????@AB;(@����O:9;>@@?@@?>=>?AA>L|���E@@A?>>?>?@?>>>?9

+
																																
+
	
8@??????@@??@@?=3*8RUYV;=<;;>??>?@@?>>??F�����[<@@>>>?>>>>>>>>>





+																																				


 @?>??>???@?@?IaG1/<=?76;===<<>@@??@@@??=K�����E=?>>==>?>>>?>>>@-



																																					
+

2@>>>>?????@?>l�{[>=?@:9:<<=<<<>?????@AAA?�پ�i5;AG??>>?>>>>>>>?:


																																				
+
+

=?>>>>??@@@??A~aetF?@?;;:<<===<=>???>?@@?@N{a[E7<j�I??>>?>???>=>?
+
+

																																					
+
&@>>?????@A??=M~]rO>@@?<::<<<=====>??@@@@??;8;<=Al��R>@@?>>???>>>?.

+

+																																	
3?>>???????@?=ekw\>>?@?=;8<<<=>>>>>>?@@?>>===A at A?in{]=??????>>>==>;


+																																							
<?>>?>>?>>>@>VfUc??>>@>=>;<=====>==>>??====>?A@@>Qygk=?@?>?????>>>@&

+

																																	
+	
!?>>>>>>>???>Fm]^C??>?A==?<=><>==:<;<=>>>===>A??@?AqqxI>@???>>>>>>>?5
+

																																			
+
.@?>>>>>>???<WheG>????@==?<=><<=<79:;;<==>>>??>>?@?Ppcf@?>?>??>>>>>?=
+

																																
+8?>>>?>>>?>>;ggC>??@>>?==?=<>=<=<;:<=<<<==?>??>????ASEsO>??>??>>>>>>@%

+
																																				
=?>>>>>>>?>;B}V<?@??>>?>=?><=>========<<<=>>>>>?>???CDgh?????@>>>>>>@0
+
+
+																																
+
&@?>>>>>>??=8Po>?>???>??>=?><>>======<======>>>>???@@?E_rJ>??>@>>>=>>?9
+
+	
+																																					
+
2@?>>>>>>>?=9`^>@?????>@><?><=>===>=><=>====>==>????AABcs\<>>??>??>=>>=
+
																																							
;??>>>>>>>=;:ua>??@?>>>?><??==>===>==<<========>>>>?@A at Qup<>>>>>>>>>>>?$

																																								

??>>>>>>>=;;9fS=??>>>>>?><>?==>==>======>==>=<=>>>??A at AG}z;<>>>>>>>>>?@/
+																																							
+
$@?>>>>>>>;;;9<?>?>>>>>>?>=>?>=>>==>===>==>>>>=>>=>>????E�_9=>>>>>>>>>>@4
																																							


%@?>>>>>><;;:;=?@?>>>>>>>?=??>>>>=>>>>>>>=>?>==>>===>>>>@E=<=>>>>>>>>>?@+
																																							

"@?>>>>==<=<;<>>?;>>>>>???=>??==>>>??>>>>>=?>==>=>=>=>>??>;<<=>==>>>>>??5

																																							
>?>>>>><<=<<=>??=>>>?????=>??>?>ADKH?=<=>>>>>=?>===NG=>>=7<<====>>>>??>@1
																																									
:@>>>><<=<<=>>?>>>>?@????>>@@ET]amoqiXUPIB??>>?><>>FC==>>===<===>>>>?>>?6
+																																							
+



3A?>>=<=<<=>>>?>>>?@??@??>HLJUgle[UWdknhYJGRR@?????>=<==>>><<<=>>>>??=>>9
+																																							
+
+


++A?>>=<=<=>>>>>>>?@@?@??>LZPNauk[WXWWYgrcOMYkW????@?===>>>==<<==>>>??=>>:
+																																							
+


	%@?>===<<=?>>??>>@A??@??E`XLOe{t`XXYY_quePMY_bB?>>>@><>>>>=><<=>>>>??>>>8
+																																							
+


	@?>=====?A?>>@?>@@?@??>QdUJL]lmsg\^irqlYHIX^dD??>???>>>>>=>==<=>>>??>=?3
+																																						
+



+>>=>=>>>>@?>>?>??@??@?>XdQFDIFI\ebccYLLG>APbo;=??>>?>=>>>>=====>>>??>=?.
+																																					
+


+
;==>===>>?>>>>>?????@?=RiPB=<=??@@ABA>>=<?Lif>>??>>??>>?>>=>====>>?>>=?.
+																																					
+

+
7>====>??>>>>>>????????B[QA==>>=>??>>>>>>>J^G>>>?>>>??>>>=>?>==>=>>>>>?5																																						
+
+


2>==>>??>>>>>>>>???>???>=C@??>>>??>>>>>>?>??=?>>>?>>>>>>>>>>?><==>>=>=>9
+																																						
+
+


,?<==>??>>>>>>>>>>>>?>??>>??>>>>>??>>>>>??=<>??>>>>>>>>>>>=>>@>==>>>>>>7
+																																							
+
+

%?<==>?>>>>>>>>>>>>>?>?>>???>>>>>??>>>??>>>=>??>>>>?>>>>=>>>>>>>==>>=??/
+																																							
+
+
>=>>>?>?????>??>>>>???>>???>>>>>>>>>>>>?====??>>>>>>>>>>?>>?>>>>>=>8:;!																																									
===??>>???????>>>>>>??>=????>>>>>>>=>>>>====>??>>>>>>>>>>>>>>>>>>=?.#'																																						

<>=??????????>?>>>?>??>>??>??>>>>>==>>=<=>>>>>??>>>>?>>>?>>>>>>>>=@+

																	
+																					
+
8>>?????????????>?????>>>?????>>>>==>===>>>>>>>?>>>>>?>>>>>>>>>>>=@'

+																																							
+
1@>>?????????????>??>>>>????>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=?#
																																							

(A>>???????????????>>>>>>>?@?>>>>>>?>>>>>>>?>>>>>>>>>>?>>>>>>>>?>=>!

																																							
+

@>>????>??????>>>?>>?>>?>?@?>>>>>>>>>>>>>>??>>>?>>>>>>?>>>>>?>>>><

+																			
+																				
+
9?>???????>????>???>>>>????@??>>>>???>>>>>>?>>>>>>>>>>>?>>>>?>>=?;																																								
.A>???????>????????>>>>???????>>>????>>>=>>>>>>>>>?>>>>>>>>>>>>=?6
																																								@>>????>?>???@???????>????>>??>>>>??>>>>>???>>>>??>>>>>??>>>>>=@-
+																			
+																		
+
7@>>@?????????????????@?>??>>?>>>>?>>>>?????>>>>>?>>>>>>?>>?>>>?"																																							

$A>>?????????>>?????>>?????>>?>>>>?????????>??>>>?>>>>>>>??>>=@9
																			
+																		
+
7@>>????????>???>??>>>>???>?>>>>??@??????>>??>>>>?>>>>>>??>=>A,
+																		
+																		
+
!@?>>??????????????>>????>>>>>>>@???????>??>>>>>>???>>>??>==?=
																		
+	
+																	
+	
+
1A>>>?????????????>>??????>>>>>????????????>?>>?>??>>>?>>=>A0
																																					
+
=@>>>????????????>?????>>>?>>>>>????????????>??>>??>?>>==?>
																																							
+
+
+
*B>>>????????????>>?????>>>>>?>>>???>?????>???>??>?>>>>=>A-
																																							
+
+	

:A>>>???????@???????????>>>>>??????>?????????>>>>?>>>>>@7																																					
+
+	
+
#@?>>>??????@????????????>>>>???????>??>??????>>?>>>>>?=
																																							
+	
+
/B?>>??????????>????????>???>???????????????????>>>>?A*																																								
+
+7A??>?????????>????????>??>????????>??????????>>>>>A4
+	
+																																						
+
+
=A?>>>???????>>??????????????????>???????????>>>>@<
																																								
+
+	
"@@??>??????????????????@????>?>???????????>>>>>??$
+																													
+											
+
+
(A@>>??????????????????@??????????????????>>>>?A,																																									
+
+
+
-B?>?>???@????????@?????@??????@??????>>>>>>?A2
+																															
+							
+
+
+

0B??>>>>?????????????????????????????>>>>>?A6

+																								
+													
+
+
+
+

0B@>?>>>??>???@???@@@?@@@????????>?>>>>>@B5



+
+																				
+															
+
+
+
+


-A@?>>>>>????AAA at A@@@@@@@A@@???>>>>>>>@A/




+
+
+																	
+																
+
+
+
+
+


&>A?>>>>>????@@@@??@??????>>?>>>>>>?A<%


+
+
+
+																
+																
+
+
+
+




6A@?>>>>>>>>??>?>??>>>>>>>>>>>?@A?0

+

+
+
+																
+												
+		
+
+
+
+
+


+
&:AA?>?>>?>???>?>>??>?>>????@A>2


+
+
+
+
+									
+
+
+
+
+					
+								
+
+
+
+
+
+
+
+



+%5?AA@?????????????@@@AAA?8,


		

+
+
+
+	
+
+		
+
+
+
+
+
+
+
+		
+							
+			
+
+
+
+
+
+
+
+

	

*5;?AABBABBAAA@?><95/'


+
+




+
+
+
+
+
+
+				
+
+			
+	
+		
+
+	
+
+
+
+
+
+


+
+$(*+++*)'$"

			

+	
+
+			
+		
+
+
+
+
				
+
+
+
+


+

+	










+
+								
+
+
+
+
+
+
+
+
+
				
+

+	
+
+																			 [...]
+
+
+					
+	
+
+
				
+


+	

	
+


+		
	



+
	
+		
+		
+

+



+
+
+
	

	



+
+	


+	
+
+%/1,%!"#







+
+
+
+
+
+
+
+

+		

+		
+
$39::::54690

+	
+
					
+	


+
+
1;;:9897338==8$
+	
	

	

+
+

+
+	
+
#9=:9:988325<<;<;,
	


			
+			
*;=;879783029<;:;<>5 	
+

+		
	
+
+
+		
+")7<;==66776/.7<:::;>>?;)

		
+			
+
+

+		
		
*3:>>;;<;4886+,2;;888<?>>>@<4)
	
+
+	
+
+					

+

+
	
+		

$5=====<;88882EN/>C588=<<=>@@?><5$
+	
			
	

+

+
#9>>=<<<:7:754��j��g7>=<<<>?>>>==7		
	

	

			8==><8<<9;;.NaX��v���]�]6=A>;<><=?@*

+	
+
+							

	7><=>9;=;<<56w�ec{Nj�y��uXP=?>=><@@@9

+
+	264@>=<<9==<;:n�_wuHC9?NU��o��B<>ACA?==>8& 
				
		
*B?@??=<;=<;8F��c7I=8<@>CQTx��F?DC@===<<>?<3!
+
	

+
+



		
+

><>@@>9>><96C|�l-789A?@D?<m�cHB?>====>?@???6	
			
			
+		


		

							

+8A@=>B=;@?<8fz]VA48<?@C@?=>Mnn�m<??@A@@?=<<=>/
		
+		

+		
+			
+
				
+	

+/@?@A=AB@?A=6��p_648?CCAAAEDH���s?DC@><;==<<===!

+
	
+	


+
+
+
+
+			
+
+
+
+
1@???ADDEDAD=?[[U`?9 at BBACGE@>?XsrwgC=<=<:==<<>>@6
	
+

+	
+

+			


+													

+	

;DBAA@?AEIKEFV�x9#3 at FEEGEA?ACC@^���E===>@?@@>?@@B*

+
+


+	

+														
+


9?>?ACDDDFJQPEg�I0</FKIHFBBCB@><:^�tTBCBBBAAA@@@@@@;6?			


+														

+
+
7?>>==>>AEHMV`]yubRSOJFDCAA at BDEFFG@?CBAAA@@??@@???>GF

+
+			


+									
+										
+

	


-A@@@@@@>ACGLUm���Ork\SOMLKKJJHGFDB=9;=@@@@AA??A@@@?@@8	
			
+

+
+										
+
+
+
+
+
+
+
+
+
+


+

+				
+


>A at AAABCEHKOT[l�����{nc\WRNLIHGGFFDA=:;=@@AAAA at A@@?????#
+
+
			

	
+											
+
+
+
+
+
+
+
+
+









2FCDDDEEGIKMQUX`������dVPNMLKJIGEEDDDA<;WRABBCCCBAA@@@??A9



+		
+																				
+
+
+
+
+
+
+
+
+

	
+



?EDEFGHIKKMORW`j�����]LC>;::;=>?@AAB>Fv��S?BBAA@@??>????@$
+
+
+
+	


+
+
+
+										
+							
+				
+
+
+
+

+	



(B@@@@@@@ABDDFLSVa7k{kfULGC@?=;::9898E����qDEDCBA@???>?>>@1


+																
+	
+
+
+	
+	
+
+
+
+
+
+
+
+
+

	


=A@@@@ABAABDGKOI :X at 4GUSLHGC@???>>>A at m����y7999:;;=====>>>:	
									
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


	


.B????@ACBBDFIGE,ezk<8DLKHGIGDA at ABAA@Y��šTAC@><;;<<;;;<<=>"


																
+
+
+							
+
+
+
+
+
+
+
+
+


>?>??ACAABCDECC46K:;<;BFFCADFDB?>?BFFi�çf=BCCBA@@@?><;;;=.

	
																				
+
+
+
+								
+


0A?@AAABBBBBCBE:#$=9(9><<?CDB?@BDDCA?>@|�ɘ�A:>???@AAAAA@>=>9
	
+			
+
+															
+

+
>@@@@?@ACBAB at K}iA!"1@>17<=<<=ACA??@ACDCB@�ܯNS><=====>>???@@@@A$

	
+																			
+

+A????@A@?@A?>g|[[H-7@>57;<<==<@AA?>?@ABD at f�Z754:PL@@?>?>==>>>>A5
	


+																		
+
9?>?@@@??@A@?>xW8fM3:@>78;<<<=<=?@@@???@A at CN@?=Ib�zBAA@@?>>=>>=>=
+






+																
+
+
+
+
 ???@???@BC??<EtOdP56<@969;<=<==<=?@@A?>>==<<BB at e�l�E<?@A@@@??>==?)


+

+
+
+
+
+
+
+
+
+																		
+
+		
-A?????@A@@?=:RSdT478=?;79<==<;>>=>??@?>=<==>BC at JyVvU<==>?@A@@?>>?9
+	
+
								
+
+
+
+
+																					
+	
+
9@?????@?=>?;JaOR4888>??<:===<<=>==>>?>>=<>==AA@?ckae=??>==>?@@???@"
+
+
+

+										
+		
+
+																		
+
+
+
+
>?>>??@?>>><@aeU67:9:??><;=>>===>>=<=>>=>?==?@>??FukqD?@>?>>==>>>?@1


																																				
'@????@?==>=<NiO96:;:<??=<;<>>>=<;<;9:<<=>>>=?@?>??O`Y]????>?>>=<=>?;


+
+																														
+
+	
+2@????>>=>==9`e869<<:<??>=:<=>>=9758;;;<===<=?>@?>??NZwF>?????>>>===?!

+
+
+
+														
+															
+
+		
;@???>====>;:vN79<=<:<?>>=:==>>=;;;;=<;<=<<==>??????>Pn^>???@?>>>>>>?-


+
+	
+																												
+
+			
+
#@???>====>=6Fg99:<<<;=?>>>;<=>>>==<<;<=<<<<<>>=?@??@>IhqD>??@?>>>>>>?7

+																																						
+
+
/A@?>=====?;6TX9:<=<<<>?>>>;<=>=>>==<<<><<<<<=>>>???@A?\P<>>??>>>>>??=

+																																								
:@?>>====><99k]9;>==;<>?>=><<=>=>>==<<==><;<==<>>>>?@A at G}`:>>>>>?>>>>?@%
																																						
+
??>=>>==>=896jP9<===<=>?==>=<>=>=>==<<=<==<<==<==>>>@A at A|n8<>>>>>?>>>?@0

																	
+																		
+!@?==>>=>>:994<=;<<<<<=>?==>==>>>=>>===>><>=<==<===>>>??D�]8===>>==>>??@2

+
+																																		

$@>=>==>>;8:67:<==<=<<=>?>>?>=>>>>>?>>>>>=<>======<==>>>?I=:=>>====>>>?A'

																																					
+
+

"?>>>==><:;97:<<=<<><==??>>>=<==>>>>?>>>>>;<?<<=======>>><;:;=>===>>>>?>,
																																					
+
+

??>>>>=;;;8:;<<====<=>??>>ADHJGBCHRQB==>AA>?><=====IA=>>9:;<<===>===>?>?3

+																																						
+
+


<?>>>=<;;89;;<<====>??@??EMT_gibbeegdRSY[XRJC===;=>?>=====<<<====>>=>>>?:

+
+
+																																				
+
+
+

8?>?><;;:9;<<<=====>??@@CKPW`eZUUPKMT][\ed]TOC>=>?>>=<=<===<;<==>=>>?=>><			
+																																		
+		
+
+
3@??=;;;9;;<<=>==>????@AHNSalhYTXUSQVVPS_jaTZU@>>?>>;<=====<;;<=>==>?>==<
+																																							
+


.@?=<;<::<==<=>>>????@?AKRTdsk\SRUUVXUUVfseSWeH>>???<=>===<=<<<<>>=>?>>=;
+																						
+
+														
+


'@>=<<<;<<?=<=>>>?>>@@??MUP`mon_ROSQPVeimp^MPfM>>>>?><=>==<<=<<<==>>?>==;
+																	
+	
+															
+


 ?<==;;<<<>>====>>>????=LPLYixkcbYY[Xap{tePDIaB<?>=>?=<>?==<<<<<===?>>==:
+																	
+																
+


;<=<;;<<======>>>??>?><FFCQccCBHJDGLKFWfXD>AN=<??>=>?==>=<==<<<===>>>=>:																																	
+


8=<;;<====<===>>>??>????A>CJD?@>>???>>?EC=<>??>=??>=>>====>>=<;<==>=>>>9																																				
+

2>;;<<========>>>>>>???>??<;=>?>????>>><<<>>>??>=?>===>><==>>?<=====<>?6																																
+
+

(>:;<=====>===>=>>>>???>??<<>>>>???>>>>>>>?>>>?>=>?>==>====>>>>====>:;=+																															
+
+	

!=:;<=>>=====>==>>>>?>?>??>=>>>?>>??>=>>>>??>??>>=>>====>=<=>======>6.0															
+																		
<<==>>>=>>>>>=>>>>>>??>>??==>>>>>>>>>>>>=>>>>>?>==>>===>>==>=====<?1
															
+	
+																
+
;<=>>>=>>>>>>>>>>>>>?>>>??>>>>>>>>>=>>>>==>>>>>>===?>===?>==>====<>/


													
+
+																	
9=<>>>>>>>>>>>>>>>?>>>=>??>>?>>>>>>>=>>>>>>>>>>?>>=>?>===>>==>====?+
+														
+																
5>=>>>>>>>>?>>>>?>?>>>=>?>>>>??>?>=>??>>?>>>>>>>>>==>?>==>>>==>===?%
																														
+/?=>>>??>>>?>>>>???>>>>>?>?>>>>>>>>>?>>>?>>>>>>>>>===??>==>>>==>>=>#

																															
$@=>>>??>?>>>>>>???>>>>>?>??>>>>=>>>>>>>?>>>>>>>>>>>=>??===>>>=>>==
																							
+
>>>>??>>>>>>>>>?>?>>>>>?>?????>>>>>>>>>??>>>>>>>>?>==>?>>==>>>==>:																						
+
7?=>?>>?>>>>>>>>??>>>>>?>>>?@@>>>>??>>>??>>>>>>>>>>>==??>>==>>><>6
																						
+,A=>?>??>>>>>>?>???>>>>?>>>>?@?>>?>?>>>?>?>>>>>>>>?>===?>>>>>?>=?/
+																				

?>>????>>>>>?@?????>>>??>>>>?@?>>>??>??>?>>>>?>>>?>>>=>?>>=>>>=?%							
+											
5@=>??>?>>>?>??????>>?@?>>>>???=>>?????>??>>>>>>>>>>>>=??>>>==><
																			
+
!@>=>???>>>>>>>??>?>>>??>>?>??>=????????>?>>?>>>>>>>>>>>???>==@4
																			
+
+4A>>>???>?>?>>???>?>???>>>>??>>??????>???>>??>>>>>>>>>>>??===@&				
+												
+

??>>>?>?????????>?>?????>>?>>?????????>>????>>>>>>>>>>>?>>=?9				
+												
/A>>>?>?>??>????>>>???>>>>>>>???>????>????>?>>??>??>>>>=>>>@*
+				
+													

=?>>>>?>??????>??>????>>>>>>>??>>??>??>??>>?>???>?>>>>==>@:																				
+A>>>>????????>??>>???>>>>?>>??>>???>?????>>?>>?>>>>>>=<>A(
																		

:@>>>>??????????????>>>?>>>>?>?>?????????>??>>?>>>>>>==@4																		

#A?>>>>?????????????>?>?>>?>???>????????>???>>?>?>>>>=?<

																				
0A>>>>?????????????>?>>>>??????>????????????>??>>>>>>@(																				
+
8A>>>???????????????>>>???????????>??>????????>>>>>A4
	
+																										
+

=@>>>>??????????????>>???????>???>???????????>>>>@;
	
+																											

#@@>>>????????????>?>>???????>>??>??????????>>>>?@$																															
+	

)A??>??????????????????@??>??>???????????>>>>>?A,																																
+
+

-B?>?>??????????????????@?@@?@@@??????>>>>>>?A2
+
+																															
+
+

0B??>>>>????????????????@@@?@????????>>>>>?B6

+																																
+	
+
+

/A@>>>>???>????????@??@@@@?@??????>>>>>>@A5


+
+
+																																			
+
+
+

,A@?>>?>????@@AAAA@@@@@@@@@?@@??>>>>>?A at -




+
+
+																																	
+
+
+


%=B?>>>>>?????@@???@????>>>??>>>>>?@B:!



+
+																																		
+
+
+



5AA?>>>??>>>>?>>>?>?>>>>>>>>>>?@B=,


+
+
+																																
+
+
+


+
%9AA?>??>>>>>>>>?>?>>?>>????AA<-

	

+
+	
+									
+
+
+															
+				
+
+
+


+
+%5?AA@?????????????@@@AAA=5(
	



+
+
+	
+
+		
+			
+
+																	
+
+
+
+
+
+



+6=@@AAAAAAAAAA@><84-%

+	





+
+
+
+
+
+																
+
+
+
+
+
+



+!&)++,+*)'%"
				
+
+		
+				
+
+
+					
+
+
+
+
+
+

+		









+
+
+			
+					
+
+
+
+
+
+
	
+
+
+
+
+																					 [...]
+										
+		
					
+		
+

+
+
+	
+
+


			

		

	



+
+	

+
+
	
+
+
		
+
+	
+

+
+	
+

$)0.*&!






+




+		
+
+

+
+	

		
+
++477954775. 
+
		
+

+
+


+
/98;8753369;?:*
+		
	


+
+

+	"5;:89881245;<<==3
	

					
+	#9;:79786/047<<9<=>3
		

+
+
+
+	
+
+	
+

)8;<958671017::;8=>==7%


+
+
			

+
+
+
+

+	")1:=;9::465-+02188::====B at 60(

+	
+
+		
+
+



+

	
	!.8<>@>;:96814m�Xhg at 03;9<>AB???:2$						
+

	
	
+
	
"9?>=>>>=;933
b������AY at 6=@????>=?7!
+
+
+

+
+
+
+
+
+


+
9???>>?=;<84m�v��e���~�~7;?>@??A>>=,


+	
+
+	
+				
+

	

7B>???@A><:4R��lW\>RxZ����h>?@A?==<=<




+	
+
+
+	
%*- at A@???@C?<?����c7;899;iki��M=CC@;<==@5

+
		

	
+		
+	'@;=@BAAA at C@:`��q8>;8;:9>@7{��L?AA@<9=@AB;-#	
	
+	
	
+	
				
+	

+17<ADCBBBE>7r��s3=:7:9;B>;d�c^L at A?=<AA>===8&
+
+
+	
+		


+				


+
+

						%537;DCCDCG at r��g;::::7=?;;>R����BDDA====<;;<:"	
+

+
+
+		

+
+
+		

+					22238>AGGHIF����G:88;?=:;>=X���i at FA<;=<<;<=?B5	
	
+


+						
+		

242004<EGHKMR����M8;=?==><98<JM]qsH>:;=;>>>?A@@(
	


+	
+		
													
+
+


';:641//6CJLNj���CB8;@BA@>;88<>:Y���M><@B????=>>@:
	
+
		
+

+							
+
+
+			
+
+

	

+=;;:86200<MQP����[1>EEBA>=>@?:56i|qSGD?A@==??>??>@.,9	
+
+
+
+
+
+
+
+
+
+




+

+
+
+


+	

(<:876543205HV^kfgt]9DHEDCCCA<888:?6(6EA=@>>??????@?>KH#

+
+				
+


+
+
+
+
+
+
+
+
+	












	
+				
+


+
<<;:9740/+)'2My�zC>ONHFFEB?>?@@>:8+*B@=>>@@@@BBA@??@9 
+

+			
+		


+
+
+
+
+
+
+
+
+
+
+			
+
+
+
+
+









9DA@><:852.) 
)`����nd]XRKFDDDDB@>;82<>=>ADCDBBAAAAAA< 



+	
+
+	













	
+
+		
+

%FGHIJJJIIF at 7(
+E����wRLJLPRSQNKHECA>:OO>BFEDCBCCCCCCCE4















(867789:;<>>>:+5�ѸйaZVRNMMNPRUXZ[\ZeO��aOPQPONMKJIIGFFB



+	
+
+					..--,+*))))+0<i���j3=6+%%')+,-,+)&$&)A����x<<9532111112224
(64333344457<FYtn��z2<>>70.,+)'%%$$%)/y�����-($$%&(*+-.0013)						
+
+


+
$EEFGHIKLMORV[agK\�F:JVZYXY[ZZYWVUUUT}��ǷhEIF@:42211123343
+
















;EDDDDEEFFGILNOB ;�c!&4;ADCBCEFGHIIJLPOatK<3>FNRRQNKGB?<;:; 














+
+
+
+


+'BAAACFFDEGHJNfa@
+A^J/%-58;?@>>?@@AADGE;:YL6+657:=BGJLNMKIFF6

	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




:BBBBBBDDEDEFR��\1(LTK<-+/689<>>>=>?BCA=8BsZ9'%37789:;=>@BDFGHF"



+		
+
+
+
+
+
+
+
+
+
+
+
+
+







#A@???@ABBBDD at fz::PAOLHB3..0698:<==?@@><:>><?=4.JhF89:<<<<=>>>?C.






+
+
+				
+
+
+
+
+
+
+
+
+
+

+

+
+
+
+
+
+

4@>?@ABBABCCA>{V.YR?NHED<21/26999:=?>=<;:?;6@@Rjp�f678:<====>==>8











+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+		
+
+
+			
+

>@@AAA@@BBB@;FqJ_N3 at K<=DA6322359:;::;<;:=>::@?RwLQt:76789;<<===>?$

+
+












+
+
+
+
+
+
+
+
+													
+
+	
+
'B@@@@@@ABC?<;XM[N,9BH@>BD<652346:::9999:=<9<B@<XgEtG8988899:;<<<>5
+
+
				
+











+
																
+			
+
4B@????@AA@><Io]G,3;BFCAAC at 88446668::987;<;9=A@<>cdj\8999999::;;;<<
	
+	
						
+








+																		
+
+

<@?>?@@@@><=AfkI119=BEB@?BB<985565788989<<98=A><=AlW^=::999:::;:;;=)
+
+	
								
+
+



																	
+
+	
 @???@@@?><<>OsF236<@CDA?>AB?;:746776688<<;78<A?<=<HWbR::999::::9:;<5	
				
+
+														
+
+
+
+
+
+
.A??????=<=?>ei754:=?BCA?==BA=99544256578;:78<>>=<>:Lpi<;::999::9:;;<	
															
+	
+
+
+
+
+
+9@?????=<=??<sN668<=?AC@?><A@>:96422757848879;>==;=<7RjI9:9:;98:9:::=)


+													
+
+
+
+
+	
+

@@????<<=>@;Cj<87:=?@ABA@??@@?=9975676899877:;=<=;<=9Cic:;9:;:99::::;3

															
+
+			
+
+
-A????=<<>A?8N_888;>>?ABA@>>@@@?;998757:988679;<<<;<=<8Q|@:;;:9999:;::9									
+			
+				
+		
7@@??====?>>8e]7:<<>>@AA@>>>?@@?=9::768:998779:;<<;;<=<?zO7;;999:98:;;<!

+															
+			
+
=@?>==>=??<:7lP8:;=?>@AA?>>>?@@><;;:7799997788:;:;;;<=<=v^5:;999::99:;<*

+																				
+
@@>=>>=??=<75B>9:;>>>@@@?>>>??@>=>;9:::98:8889:::::;;<;C�U58:;9999::9:<+

	
+																
+
+
+

!@?==>>??>;978:::<<>>>@@@??????????=:<<;9:8999:::::99:<;<L869:;:999::::<#

	
+																		


?>>>=>?>=<88:;;;<=?>?@@A@?>=>>>@@>=;;<;::8899:;:::::9:<;86589:;9999::;9

+																			
+


=>>=>?>><:8:;;;<<>>>?@@@@@HNMGC at AETV@;;;;<<;:9;::::=;:;:895988:;:99::;8-#										
+									
+


<?=?>?>=:8:<;;<=<>>?@@@ACQX^[XZZXWW[[IEFIMRPI<;;;;:::::99:86:89:;::::;::2							
+										
+
+
+
+
:>???>=;9:<;;;<<=??@@@@ANXXWUVPQMKQOL\^\WTTXVH=;;<<;::::9997898::::::;:<7					
+										
+
+			
+
6@??>><;9;<;<;>==???@@@CVZc^WVQNRUYXTONQMPVWST?<;<<;8::;:9887:89;;::;;:;8															
+
+			
+

1@??>=<:;==<;<>>>@@@A@@B[Y_bXSTSWXVVYWTTQS]ZVZ@<<<<;:::::99869:8:;::;::;8
+	
+											
+			
+
+

*@?>>=<<=<==<=<=?@??A@@@RaY]YVTNPONNPPMTUX]V^Z>;<=<;;::<;99977::9:;;;9:;7	
+																
+


!@>?=;;==<==<=<=??>@A@@=Ef_\XgraTNSUOUjl\Z]UbH7;<<<<;;:;;:99878:9:;;<78;5

+
+									
+					

>>><;;=<<=<<==>???@@??>>Sffm|OFJMFHMNQl}i_\N:;<<<<=;<;:;:9::87899:;;88;2

+									
+						


:><<;====<<=<=???@@@??@@AZjxa??@@@@@>>CmraM<<=<;<<<;;;:;:9:::98:99:;849*
																	
+
+
2>;;<===<<==<=??????>?@@?DU\F@@@@?@@?>?CNF<<==<;;<<<;;;::::;:;9::99;5(0


+
+				
+									
+
+
+

&>:;===<<====>?>>????@@?><@G??@@?@@@?=?=::<===<<<<;<;:;:;::::99:;:8:3

															
+
+
+
+
+

=:<====<====>?>>??>?@???=;?>?@??@@?>=>=:9<===<<<<;;;;::;:::;:99;;9:1

	
	
+		
+
+												
+
+
+

;<<<=======>>>>>>???????>><=??>???>>>>=;:<<==<<<<<;;;;;;;;:;:999;:;.		
			
+
+											
+
+	
+
+
:=======>>>??>>>>??????>>?=>>>>>??>>>=====<==<<<<;<;;;;;<;;:;:99;:<*
+
+
+
+										
+
+				
7><====>?=>??>>>?@????>>?>>?>>>>>?>>>>>>>=<=====<<<<;;;;;;;;:;:9:;<&

+
+												
+					
+2?<=>=>>>=>??>>>@@????=??>?@???A?????>=>?><=====<<<;<;;<;;;;;;::::<#
												
+
+				
+
+?===>??>=???>>?@????>>??>?@???CBA?>??>>?>=======<<;;<<<;<;;;;:;::;												
+
+					
!?==>>??=>??>>>?@???>>???>?@??@AC@?>???>?>>==>====<<;<<<;<<;;;;;::8
+												
+				
+
<>=>>>>=>??>???????>??>???@@@A@@??????>?>>>=>>===<<;;<<;<<;;<<;:;3
																
5?=>>>>>>?>>??????????>??>?@@@@>?@@?????>>>==>>=<==<;<<<<<<<<<;:<-																	
+
*@=>?>>>?>>????@??>??>???>>@@@@>>@??????>>>>==>====<<;<<<<<;<<;:=$					
+										


>>=??>???????@@???@?>??>>?@@?@?>????@??>??>==>>===<<<<<<<<<<<;;;
				
+											
3@=>?>>?????????????>?????@????>??????>>??>==>>==<<<<<<=<<<<;;<6
			
+			
+									
+
@>>=>>??>?>??>????????????????>????>??>??>>>=>>===<=<<<===<;;>,	
+			
+									
2A==>???>>???>???>????????????>????????>>??>==>=====<<<<==;;<=
+			
+								
+

>>=>????>?????????????>????>>?????>???>???>>=>>======<<==;;>4
			
+													
-@>>??>?????????????????>?>>>??>>???@?????>>=>>>=======<<<<>#
+
+													
+
<@>>?>??????@????????????>?>??>>??????????>>>>>>=====<;;=>5
	
+													
+B?>>>?????@??????????>?????>>>>>?????????>>>=>>==<<=<<;=>"	
+																

;@?>>???????@???????>>??>>>??????????????>??=>>===<=<<<>0															

%A?>>>>?@@???@??????>>???>???>?????????>????=>>>===<=<>:
+															
3B?>>>?@??@?@??????>?>??????>?????????>????>=>>>==<<=>'	
+																	
:A>>>?????@???????>??>?????????????????????>>>==<==@2																		

 ?@>>???@?@???????>??????????>??????????????>=====?9
																		

'A@??>??@@?????@????????@?????????@????????>==>=>>"
															
+
+
+

-B@??????????@?????????????????@?@???????>>==>>@+															
+
+
+
+

1B@>??????@????????@@??>??@@@?@???????>>>>>=>A1
+																		
+
+
+	

3B??????????????????????@@@@?@?@?????>>>>>>@4
															
+				
+
+
+	
+

1B@???>??????????@@@??@@@@@@@??@??>>>>>>@A4

+																		
+		
+
+


.B@??>>??????@@AAAA@?@@@@@@?@???>>>>>?A?+

																	
+			
+
+
+


'>A?>???>?????@?@???????>???>>??>>?@A7


									
+						
+	
+	
+
+
+
+


6A@???>?>>>>?>??>>>?>>>>???>>??@A;)	
+
+													
+		
+	
+
+
+
+


+
':BA???>>>>>>??>?>?>>>?????@AA:*


+

+						
+								
+		
+
+
+
+
+

	
+'8 at BA?????????????@@@AAB@<3%



+																		
+	
+
+
+
+
+
+


+.8=@AAABBBABAAA@><83,"
	

+	
+
+
+														
+
+	
+
+
+
+
+
+




"'*,,,,+*)'$ 

+			
+	
+			
+
+					
+
+
+
+
+
+

+			
+










+		
		
+			
+
+				
+
+				
+
+
+									
+																																																							 [...]
+	
+



	
+
+		
+
+				
+
				


	
+	
+		

+		
+	
+
+

	
+


	


							
+
+
+
	
+				
+
+
+


+
				
+	

+
+			



+


+


		
	,+&




+


+				
+
+
+		
	
+ '/5:9860)#

		
+
+		

+			
+	%.479:7877;=:3)	
+	

+		
		

	
+(47998;7776;>=97-

+



+				
+
1:;997987587:>=97<3
		
	

+
+	
5>>;6754/47899==:7;@3

+
+
+
+	
+



	
+
!*8A?>;77.)B6/$,5:=:6:@B9(#"
+					

+
+		
+

	
&058>AA@?98#3�����J%,<:4:B@??;8.			
+
+

	
	

2;=?@?@B@?7.'���������P739@??@?@=3 
+	

			
+
+	
5>>>?@@ABA<A����ZJt�����D05@@@A@?<>0


	
+				


+4?<=>@@@ACA4q��cJBAALC]���t5AAA@>>=?= 
	
+	
+	
+!%*>>>=<>ACCDE���K<>A at A@?FU���H?BA@==>@A4

+
+
+	
-F;;>>?>?@BECq��r6 at B?@@ABC?���J:AAA>=ACCB4


	

+58;?@??ABCE at w��J<D@???BCBAX��YCAABAEC>;<8'	
			
			
+

		
	"968;?@@ABFHn�h;5DBA@>@@@CCs����FGIF?@><;;<=+

+					
+	


+		
+
	
+
477578;?ACHO����ID at ABB?=@CCw��ldUOHA<>=;<==>>#
+
+
+

							
+

	0:77649?=@DLNxk��OCCBBBAA at CFPp����bHBC=::==<>@7


+					

+


+
+

+
+
3;986726>>ADTw[@?ODDDA@@@>=@GLW����oJFIC;;?>===>(
+		
+
											
+
+



		

+
9>;:98555;@AGYtUeYGGEBA>:=@AA@?N���}QHGF?===>==<>:
(,		


+											
+


+		
+
+		
+
	9>=<<;::768<;Gg|GbZFEC@>@B?>>;;@FSK!+?@D>:<<>=<<==<<LA			

										
+	
+
+



3=;;;;;:::99=8J\qJ\SGCAABA??<;>>@DD.*:6?9;;;<;<<<<==A7


+		
+

+
+
+
+											



)CA@?<<:99998=;K7CakMCDCCB@?@BB?><>A9(9=57<><;:;<<=>>>5	
+
+			


+
+
+
+
+
+
+
+
+
+
+
+													5==>?AAAAA>;9?P�mYhZIC>==?BDDDCDDB>CB+X=/7<:9:;=>>???@?#
	




+	
+


+
+
+
+
+
+
+					
		
7420/.--.../-){���o<;<>@AAACFILLMNLPVBsʐ4358<>@@@@@??>@2	
	-7655420-*%!
)����5
+
+
"%())(),/124H��Ɩ%
%(+-./00123343
+65444433343.$"$h��͡J)**+-/247::::;>>`�˄^63<=<;999999999;%


+

+
+:@???@ABA>834?P+,��֣IFGHHGEDB@>==>?CHd�˨�N>ACCCAAAA@>?>=?4
+	

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+@>>?@?=956<DPWK/8��zG4:==>@@ABCCDCBA?:P��ȄLF@?ACDEEFFCCBAA?
+


+										
+
+
+
+
+
+											
+
+
	<??>=;88<BEEK~�nPQRNF<67:;;<>>>>>>>=??;7Vs�\FD at 86569;?ABBBCCD+
+
+	


+
+
+
+
+																


+
1A<:9;?ABCAADU�hORrgOH>646:::;=>>>=<;:702+2FGFSTFB>;:8899::;>6


+
+








+
+
+
+
+
+															
+
+


+9::;>ABB@?AD at j�8:qxUIG at 74459;::;<=<::953 at 3,49\p��PBBBAAA@??=;::
	
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+
+
	'>>@A@@?>?ACA@{\8noOKDDD:65558::99::;:86;?835HthR�e>???>>?@@AAAB5

+				
+
+
+
+												
+
+
+
+	
+
;A@@??>>?AB@=MgJod?HH?AE>8655579:9899999?;=74Enf7^r?@???=<=>>??@@

+


+												
+
+	

 A?>>>>>@BB@?>__^Q;@HGA?CB:7655578::8789;@8?95;DfaVzC>>???=<<<<<=@1

	







+								
+
+		
+

,@>>>>>@BCB@>FoaH9=BFEB?AA=8766667789:97=>9@:6:@@froT=>==>>>>=<;;<:


		
+
+
+
+
+




+
+							
+
+
+			
+

+

6?>>>?@@A??@@goE9<>BDEA>?@@:876786669::;>::@:89???dPd?>===>>>>>===>#
+
+
	
+
+
+					
+
+
+



+
+
+
+	
+
+				
+
+
+
+
+	
+

=>>>@@@@>>>?OJ7<=@CCD?>>@@>89877768899>?9:?:88<B<GdwL>==<<=>=====>2
+
															
+
+
+

				
+
+
+
+
+		
'@>>??@?>>>@>ei9;=?@BBD@>>?>?;9977768878;;:;>989;@?;Hg]<===<<<=<<==>=

+
														
+		
+
+
+
+
+					
+
4@?@?@?=>>@?=qN:<=?@ABC@=>>==<8876557778769;?;87:??<:UjC=<<>=<<<<<==?'



+													
+
+
+
+					
+
+=@@??>>>>??=AqB<<>@@AAB?=>>?>=:88776879;<89;><988=?=;AnW<><=<<<=<<<<>3

											
+
+
+									
+
(A??>?>>>>??9Oj<<<>@A at AB@=>=?>>>97:9868;;:89:=;999<?>=9Vo;=>><<;<<=<<=;
									
+
+
+
+											
+
3@??>>>>>?>>8da<>=?@@@AB@=>>>>?>;8::879:;98::=:89:;>>==GxB;?=;<<<;<<=<= 


									
+
+
+															
:@?>>>>???>9;kV:=>?@?@@A@=>>=?>>=99:88::;99::=;889:=?=<CzO7=<<;<<<<;<<>'


+								
+																
+
>@?>>>>???;99IB;<>???@@@?=>?>?>>><99:;;::8::;<;8899<?=<L�Q4:;<<;;<<<<<>)

																								
+
+
+


??>>>>???<:::<;==?@??@@@?>??>>?>>>;9<=<<:8:;;<;88999==<AR959<<<<;;<<<=>'

																					
+		
+


>?>>>??>>;;;<=<=>????@?A@>=>?=??>><9;==;:9::<=;98999;==<:857:;<<;;;<<=>

																							
+

>?>>????<<<;<<==>???@@@A@@DDB????BUZ@==<::::;<<98999;=;<;:8899<<<;;<<=;

																									
+


=?>????=;<<<<<=>>???@@@BFPVURNJGKSQUXB=;<CCAC?<::::9:=<:;;9899:;==<<<=9$
+																												
+
+

:>????>;<<<=<<>>>??@@@@CVWTSUVTLKMPPMMUKNVQOUTA::::;:<=<;;:88:::;<<<<=6-$
																									
+
+
7@@>?><<<<>=<=?@?@@?@@@AZZVIIPKNQPORQP[\YSNON\F;::;;:;<<;;:989::;<;<==41*																										
+

2@???==<==?=<=>>?AA@@@A at MTTLNUTTTVSRWUPRPLMNQL<::;;;::<=;;:989::;<<;<<24*																									
+

*@??>=>>==>>=>>>@A@@A@@?GYQLLWWRSQNOQMIRNLOP[C9::;;;;;<><;;:889::;==<:*4'																								


 @>?=<=======>>>@@?@A@@=A[MLOatgXQPTPWhfTMPL_A8;:;<;;<;<<;;:988:;;;<=8$."
																				

>>><<=>>>===>>?@??@@@@@BZTMUqOHNKDHNNQakOQV`C==::<<<<;<<;;;;:98;:;;=9%
																			
+


8><==>>>=<=>>>@@??@@@@@@R_Rag>>?@?@@=<Cs_`eT>==;;;<<;<<=;:<;<;::;;;<:
																				
+
/?;==>>>==>>=>@??@?@?@A at Eagt^?@?@@@?>??awp^C>>=;;;;<;;;<<;<<;::;;;;;9

																			
+
+
+

$?<=>>>==>>>>>@?@????@BA>Sq{P?@?@@@?>??KnfJ=?>=;<;;;<;;<<;;;;:9:;;::6
+
+																			
+
+
+


>=>>>>===>>>?@??????AA@>?XuP>@?@@@>>?>F^L>=>>=;;;;;;;;;<<;<<;:::;;;0



+																			
+
+
+
;>=>>>=>>>>>??????@@@@@?>>ZY>@>?@?>>>>KN<==>==<;;;;;;;;<<;<<;::;;;<*


+
+															
+
+		
+
9>=>>>=>>>>?@?>???@@@?@>>=?SK@==??=<>FH>=<=>>=<<;<<;;;;<<<;<;;::;;=%



+																
+
+			
5?=>>=>>?>>?@?>>??@????>?>>?LUND??DQUG>>?=<?==<<;;<<;;;==<<;<;;:;;="
		
+																					
/@=>>=>?>>>@@?>??@@@??>>>>???G_`QTc_G>>?>><>===<<<<<<;;<=<<<<<;;:;< 
																					

'@=>>>??>>?@?>>???@????>>??@@?E]WXJ?>?>??>==>==<=<<<<<<<<=<<<<<;:;9																			


?==>???>>?@?>?????@???>???@@@@RZQ@??>>>?>>=>>=<==<<<=<<<==<<<<;:;5																		

;?=>>??>???>????@?@???>>>???@@BVK?@??>>?>>><>===<<<<==<<==<<<=<:</
																			
3@=>???????????????????>???@?@@KD????>??>??<=>==<<<<=<<<<==<<=<;=(																				

'@=>???????????@@?????>>?????@@@@??>>???>>?==>=<===<=<=<<==<<=<<=									
+								

=>>???????????@@?>????>???????==?@>>???>>?>===<==<<<<<<=====<;=:																			0@>>???????????????????????????>??>>>??>??>><====<<===<=====<<>3
			
+															
+

??>>??@@??????????????@@?????>>????>?>>?>>?=<===<==========<<?'						
+												
0A>>>?@@??????????????@?????>>=>???>?>>>???><=========<=>=<<=;
+
+																	
+
=?>>?@????????????????>>>?>>?>=???>??>??>?>=<==========>=<<?0
				
+																
*A>>?@?????????????????????>?>>>>????>??>?>=<=>===>====<=<== 
+
+
+																

;@>??????????????????????>???>=>>>>???????><=========<<==?1
	
+
+																
+
*B???>?@???????>?????????>>??>>?????>??>>>>>==>======<<=>>	
+																	
+	
:A??>???????????????????>>>?>>>>??>?????>>>=<=>=====<<=@.																		
+	
+&B@>>>???@@??????????>>?>????>>>??>????>??>>===>=====<?:	
+																
+		
5B?>>>??????????????>>>?????>>>??>????>?>>>>==>=====>?%
	
+																				

=A?>>>?@???????????>>>???@?>>??????????>>?>========@1
+																					

$@@>>>?????????????>>>???@?>>>???>??????>>>>======@9					
+															
+
+

,B?>???????????????>>???@??>>?????@???>>>>>=<===?>"
+																			
+
+
+

1B??????@??????????????@??>??????@???>?>>>=<<=>@*																				
+
+
+

4B@?>????@?????????@@??????@@@??@????>>>>===>A0
+														
+			
+
+
+
+
+
+
6B???>??????@???>?@????@@?@@???@????>==>>=>@3				
+															
+
+
+
+
+
+

6B@???????>??????@@@@@@@@@@???@@?>>>>>=>?@0

																				
+
+
+
+
+
+
+

2B@??????????@@AAAA@@@@@?@?????>>>>=>?A=(
+

																
+		
+
+
+
+
+	
+


, at A???????????@@@??????>>???>>?>>>>@@4



																
+
+
+
+
+	
+
+


 9B@???>?>>>>???>>??>?>>>???>???AA8%	
+			
+											
+
+
+
+
+	
+
+
+


+
*<BA?>?>>>>>??>>????>>>????@B at 7'
+
+

+
+												
+						
+
+
+
+		
+
+
+
+

			
*:AAA?>??????????@??@ABB@:0!
+

+
+																					
+	
+
+	
+
+
+
+
+


+
"0:>@AABBBBBBBBA@>;72+ 

+
+
+
+									
+						
+
+	
+
+
+
+
+
+


+
+
#(+,--,,+*($!

		
+	
+	
+	
+
				
+
+
+
+
+
+
+

+				


+







+
+

+	

+
+	
+
+
+
							
+
+
+
+
+					
+
+
+								
+																																																											 [...]
+
+	
+
+
+	
+		
+
+
+	

		
+
+
+		



+	
+

			
+		
+
+

+

	

+		

	
+
+
+	


	
+


		
	




+		
+


		

+
+		
+
+
+


+	$*14-)#!
+		
+

+	


+!).566:73541)


		
		
+
+
+$,476524503961, 


+	
+	
+
+
+
+		#*/522241/70053014&
							
				
#/67521/),-,11661/;="
+		
+
+
+
+
+
				

	
+!+488:94(-a=#!$.92.9E;&
	
+
+
+

		

					

 !%0;;9:8/7�����L$
-/+7E@<93/%		
+
+	
+			

+

+

	%02448;=<95%��Ni�����?((4E@@B?=8+
	
		
+				
+
+	.:=>=<===@=?y��Q9<;Mc[��>#0E@@B??<<,

+
	
+	
+	2><;<>>=<>?5^�a@=:=<;<<X��b-FAAB??<?<

+	
			
+
+		
%-A?=<<<=?><?\iI7=><:==??>t��9ECBC?>=?@3		

+	


.I=>@@?==<<>;[�{B>>>@<<>>@?Cx�4 at BCB@@@@??.			

	

=;;<?AB@><<;NgD6?@<>A===>C=Oqw\CDCCAA?=<>0
			

+				

	
		

+&>>=<:;>BB?=ASM:;=@A=>@=@AAt�z��DKJE?>=<<?B7

+

	
		


+	
+
+							

+	6?>?97<;:=B at Ts^PB?>BEAAA at BDj�lG_[WKA=<=>@CBB4		

+						
+
+	
+
+						

)>==>:>@><:9@[OGS?A@?BGDDDFJWlm���oLEC?@>ABA@@%	
	
													
+
+
+
+


+>>==;6>A at A@B��u`D>=??=?ECCFJPf����VMHDBAEBA??9



+														
+					1C@?>=:9>?>>?b����TAC?>>>@EC@@@S��at^LHDCCFFB@>=?* 
			

												
+	
+
-BBBCBA@?>?><@�ϣ��I:>BB@?=>BBAEOWA<?>>AFFB?==<<:=H/	
											


+#==<=?@BDFGHGBA�Ƕ��>=:8<@AA?AGGGLO3$545<CFA=<<;::;=A%	

+										
+


+;@>>>===>?AFKKBG���h;>=;98;AEDDIIJO?+4/+>HB<:988899::&
+	
																					
+			
+)?==>>>==?>?@FL~��qQC@>;:;<:9<ADHKITQ
+3",FB97646789:<=4
+																								
+
+
+

	
+


+9=;;:::9:<=?BK���ş8;AEFFD@><98;?DISk6(+$@E300135789;;<>#
+																													

+



)A??????>>=<<9<�����D;<>@ADGIGEB><;@Gr�kCML,%',169:;<===?5	
+																														


	;@??@@@@ABB@=98|����I<<<;=>>?BFHJIFEDO��z
%068:;<<<==>=


+																															
	

+
.@>>>????><;:=ESq���vECA@@?=<;:878:=@;g����*479;<=>>>>>>@(

+

+																			
+
+	

===>??=;9:=?Qqrps�|\@?@AA@@@@@A@?>;7+�����}I<;<==>???>??>@4		
+
+															



+6@?>=<:;=@A at A|�r_[^`O>@A@@??>>>==<93*  L��ëwiQC>;:;;=?>=>>><


	

+
+
+																		


+

%@><;<??A@@?<O�LLUlcF>>>??>>??>=;70)'+1 at B,Pn��pLE@==<<><<<<>(


+
+																																		
+



6<;<>@A?>==<:hy=LyzR>?>==>>?>?=;950-059EJ5'Cg���QEDB@??@A?>=>8
+
+																									
+
+
+
+
+
+ >=>>?>=>====?u\V~mD==??>>====<:75457:<DI;?!1uYEQ�^BBA@>==>?@@?A)
+
+
+																		
	

3@?>==>==>>><OkQv^@??=>>===<;:9877:::=CG?8F*+TsL at nlABAA@==<<<=>@;

		


+
+																	


=?>==>====>><dkbF=@?===>=<;:9899;;<:=CFA<9D.-7O_^kwCAABA?>><<;;<?(
	
+
	
+
+
+
+
+															
+


$?======>?@?=BtkF=@>>===<<;;99:;<=;;=CEA=<;G206D<YhdO?@@A?>>>><;;<5

+
+		
+			
+
+
+
+
+
+
+																
+
+
+
0>===>>??@@?<_oH<??>==<<;;;;;;<==<<=ADC=>;=H524A at 7Qdn>?????>=====<<				
+
+
+							
+
+
+
+
+
+
+	
+											

:>>=>>>?>>=>K|O<>?>===<<:;<<<==<<=>@CC>>><=G743;E7?_{H>>>????==<==?.
							
+										
+
+
+												

 ?>>>>>>====;dg;>?>>=<=<;<<;=>=<<=>@BC?<?=<>G9659E<9=gY==<=??>=====>;
+
+														
+													
/?>>>>====>=<pO;>?=>=<=<<<<<=<;<=>?@AA;>>;<>G;776CA9<VhA><<>>>=<===<>"

+
																								
+:?>>===>=>=;CtC=?>>====<====;9<<<=>?A<=?>;<>F<785 at D:<CjL>><=<=?><<==>0
+

																						
+!??>==>==>==9Rp>>>??====>>=<=<<?<<??@>;??=<<>F<796<E=<=[^=>?=<<=>=<<=>9

																						
+
,@>==>>===<<:fc>=>>>==>>>><=<=?>>=>@?;=??<=<?E=8:8:C@<>Rm:?@=;<<<>><<==



																							
+4?>>>>>>>=<;>hY=>>>==>>>=====?>?@=??;;>>>;><?D=8:98 at B==K{B;>==<<;<>>=<=#


		
+																			
9?>>=>====<<;MF==>>=>>?>===>>>?@???=;=>>><=<AC>9::8=B><R�K2<<==<<;<>>=>%

																				

<?>=>====<;<;<=>=>?>>>>>>=??>?@??A?<=>??>=>=AC>9::8;A><GY:18>=<=<<<<=??'

																			

=?>>>====<=;;=>>>?>=>=>>>??>?@@?@?>==?>?=>==BC?::;9:@><><:35;==<<<<<<>@%

																			

<?=>>====>=;=>>>>>>>>?>>??>????A at AX_G???=?=>AB@;:;:9>@;>==858<====<<<=> 
																 [...]
+
9?>>>>=<==<>>>>@>>>?>>?Lf\RORVXWSLLNPYN??DBGLWJ<<<<:<@?=>><:78:<=====>9
																		
+
4?>>>>===>??>>>@>?@>?@@K`NJQMSYTQPOPSYbZXVRTU[YA<<=<;?A==><<989<=>===?3
																			
+

.@>=>>?>>>?@>>>=>@@?@@?>?GNOJPRPRSRSRTSWVSWMDALG<<=<;=B?=>=;;99:<===>?'																				

%?>>>>?>>>>?>>>>?@@?????=J[VJOQQQOQSQMLRPMWVE3AD<==<<=@?=>><;:99;<==>?

																

+
?=>>>>>>>??=>>>??????@?FXZTRgqdYTTTTYfmcRSV[SJ@<===<=?@==>=<;:9:<<=>>


														
+

;>>>>>>>?>==>>>?????@@?O[WV\cILQNOPQTPRmURP\[C><<==<=>@==>?==<::;<==>
+
																				

4?=>>>??>=>>=>???>?@@?>I[SP]Y=>>?>??=<@fSRQ]M??=<=>=<>@?<=@>>=<;:<=<<
+
																				
+

+@=>>?>>>>>=>???>?@@??@CTSJ[^>@?????>>@fVS]VC@?===>=<=??==??=<<<;<<<9

																			
+

!@=>?>>>>>>>>??>?@@?>@A at J[R^^>@??@@?>?>]lc`HAA?==<==<>>?==>?>=<<<;;<3

+																	
+

>>>>>>>>>>>??>?@@??@BB@?MZeb>???@@?=@>^thN?B@@>==<=<>=?>=>?>=<<<;;=,
																					
+

;?=>>>>>>>??>?@@?>@A@@@>>MkvC>?????>?EtrO??A??>====<==??==??=<=<=;=%

																				
+
+
7?=>?>>???????@@>?A@@@?>?>OwjD=>?><=ElqL>??A??=====<<=>?==>?>==<=<= 



+
+																						
+
2@>?>>????>??@??>?@@@?>>>>>Gox_QGGP`veC>@??A??=======>=??>>??=====<


+
+																								
+A=>????>>??@@>>?@?@??>>>>?=?[j^abekR<=@@>?@??>=>===<>=??>>>?>====;
																										

"@=>????>?????>?@?@@?>?>>???>>RYLO[F==>@@>?@??>>===>=>>??>>>??>=<=8																							

=>>???>??@@?>>@?>@??>?>>?????>WUYJ??=?@@>?@??>>===>=>>>?>>>??>><>3																					

9@>@????@???>?@????>?>>>???>@?AYV?@?>?@@>?@??>>===>==>>??>>>??>=?-
																					
+0A>>???@@??>????@?>>?>>???????>VM>?>>?@@>?@???=======>>>?>>>?@>=?%																						
+#A>>??@@??>?@??@?>>????>??>???@PN@?=>?@?>?@?>?=======>>>??>>??>>>
																				
+
;?>>@@@?>?@?????>>?>??>?>>>???ED?@>>???>?@???=======>>>??>>?>>?:																		
+
+
,A>?@@???@@????>???>????>?>??>=>??=?@??>?@??>===>===>>>??>>?>>A1
																					
+
+
+
=@????>@?????>>??>>????>@???>>??>>??@?>@@??>==>==>==>>>?>>>>?A$		
+																	
+
+
+
+
-B??>??@?????>>?>>>????>?@?>=>??>>??@>>@@??>==>=>>>>>>>??>=>@;																				
+				
+
;A>>?@?@???>>??>?>???>?>?@?=>>>=>???>>@@??>>>>=>>>>>>>??>=>A,
				
+																	
+	
+
'A?>?@?@???>?????>??>??????>?>>==>??>>@@???>=>=>>>>>??>>>=?=
			
+																
+	
+
+
9A???????>?????>???>???>>>>??>=>>????@@???>=>>>>>=>>>=>>>A.																							
+
+
+
+
&B@????????????????>????>=>??>=>?????@@??>>>>>>>>=>>>>=>@<

														
+						
+
+
+
+
:A???>???????????>???>?>=>??=>????>?@@??>>>>>>>>>>>>>>?A,	
+															
+						
+
+	
+	
+&A@?>>?????????????>?>?=>???>>??????@@????>>>>>>>=>>>>@:

+					
+							
+						
+
+	
+
+	
+
6B?>>>????????????????=>???>>???????@???>>>>>>>>==>>?@%
+	
+										
+						
+
+					
+
+

>@?>>>???????????????=>?@?>>???????@????>>>>>>>=>>?A1
+
+
+		
+								
+						
+
+					
+
+
+
)A?>>>>?????????????>>??@?>>????>??@@????>>>>>>=>>A:


+
+											
+							
+					
+
+
+
+
+

1B?>>>?????????????>>????>???????@@@???>>?>==>=>?@#
+	
+										
+						
+
+
+				
+
+
+
+
+
+
+

6A?>?>????????????>??@??>???@@??@@@???>>>>==>>?A,

+
+											
+			
+		
+
+
+					
+		
+
+
+
+
+
8B??>????????????>??@???@@@@@??@@@????>==>>=?A1

+																
+		
+
+
+	
+			
+
+
+
+
+
+
+
+
+
+
9B?>?>?????@???>>????>?@@?@@?@@@@@??>><==>?A1

	
+
+													
+		
+	
+					
+
+
+	
+
+
+
+
+
+
+

9B?>>>>??>??????@@@@??@@@@@??@@@??>>>>>>@@/
+


	
+			
+													
+	
+	
+			
+
+
+	
+
+
+
+	
+
+
+
+
7B@>>>????????@@A@@?@@@@@@?@@?>>>>>>>?A<&
+


+
+					
+		
+
+						
+
+
+
+
+				
+
+
+
+
+
+
+			
+
+
+

1AA?>??????????@??>??????>?????>>>?A at 2




+						
+			
+					
+
+
+				
+
+
+	
+
+
+				
+
+
+
+


%;B@???>?>>>?>?>>>?????>>??????@AA7#
+
+	


+						
+
+			
+			
+				
+
+
+	
+
+
+
+			
+	
+
+
+


+

-=BA???>>>>>?>>>???>?>>??@@AB?5$


+
+
+	
+	
+	
+
+		
+	
+
+		
+		
+
+
+	
+
+
+
+			
+	
+
+
+
+
+

	
+
,;AAA?>?????>?@??@@@@ABB at 9,
+
+

+
+	
+
+
+
+
+

+
+
+
+
+			
+
+	
+
+
+
+	
+			
+	
+
+
+
+
+

	
#0:>@ABBABAABBAA@>;71)
	
	
+
+
+
+
+
+
+				
+
+
+
+
+
+
+
+			
+	
+
+
+
+
+
+


+	

$),---,,,+(%!

												
+
+
+
+
+
+
+
				
+
+




+
		
+


+





+


+
+
+				
+
+
+
+
+
							
+
+
+

+							
+

+							
+
+																																																		 [...]
+		
+		
+
						
+
+
+
+

+				

+
+
+
+	
+


+			
	
+

				
	



			
+		
+
+
+
+		

+


		
+
	
+	
+

		
+

+		

	
+

+
	

	
	


+


+			
		
+					
+	
+
	
+
 "(-,*( 
		
+
+		
+


+	
(16889;<:92*(

							


+	
'28<=<956;8;;:9/
+		
+		
+				
+59<;<<;67>;;:8;=2

			

		
 -7>?=<;:6349;;=:;<>3 
+
+
+	
+	
			

!3;==?>;3.>"
(.9<<;<@4$		

		

+
			


+"0<=<<=>3CzUDo`0
 ,6;;>>5+%!
+			
		
		
+

()$*9==>==3'f^=G^ukOb'&=?=;<;5/+"

		
+			
+'39:8;>==?><IYH===;:ACh\2=@>;<=<;97&
+	
+
+
			
	.<<;<?B@>>>;:WO at A==@?<A at O|Y?@=>=;<;<6

+		
	
+
	


'?=<<;;<@A?>H[><@@A>>@>?BI��DB??=;<;:<0
+
+	
+
		

*J>>??==<;:=A at r�N?@?BB=>?<A>KU?A>=<;;::;=)

+

	

&B<;<>@?>=<;:?swF at A@AC@>?=?E<<TD<=;;;::;=?(		
	
+		
	


,===<;<?A@?<K��j???ABBC@>?>JPEnQ==:;:9:<>??&
		


+
	


+
2?=====<<>B>y���KB@@BCDC@?>AM>^R<<9;88:=?@@=
	
+
+									

+">>=>=>>?>=;H����D>DB at BDDDA@>@?IRN;7967:>@?>>3
+	
+
										

+	


+
<?>><<>>??>Y��˦S;:;@BACEEDB?@MSPZ;7749=>?<<<=%


										
+								



<?=>>::???@B�����P?A<9<ABDGGFCBIJGC9844>@?><<=>8		
					
+

<A??>>>>>>>?K�����Q;=??;9=BEIIIHF<EB:7/8CB><<<;;<:?7					

+7A@@@AAA@@@?=D�����@>=;;==9;@FLNOPDA>91,AFA=<<;:::9B9	
					
+
+

+
*?==>>>?@ABCCC=P���`<>>=<:9;::>ENT[XD78(1JD=;:98889:;1
+

+		
+	
+
+
+	;>====<==>>>>=E_`]UAA@>==;97777;CP`se2,HN=764467999;<#
	
+		

+
+
.@>>>>><=>>>=<Bl��e;>ACDDCB@>;7312;Pp��=a3)*.0246888:<6
+												
	

+	<?>>>>>=>???>Hz���p<;;;<<=>@AAA>92*)o�곚

(-1467789:<$
																			
+

+

+
0@>>>????@@?>Ej�ly�W>?????>=<;::;;;98�����!)/356789:::<1																	
	

	>>>>>>>>???@Vsz���e><<<;;;;;;:::9::;;�����[?<>>?>>>======;


+	
		
	7>=========<\�yo���X<<<<<<<<<<<<<;95,
Wl���~NGCAAA@@@?>?>>@#


+
+				

+

+
+*?====>>>>>>A~nT[p�^>===<=====<<:73-(#+u����saKC??@@@A??>>@2

+

+																

+	
<>>>>>>>???=S�LGQrxX@>========<;9643373#Fgok���oEA>==>@A@???>




+																		

+
+
+
0@>=>??>>>>><krH[�jB:=>>>>=<<<<:87888<=218Klkhhq�GCA@><<>?>>>A/

	

+																						

+
	=>==>??>>>>>BsOe_=;;>>=====<:99:;;;<@9467>n�_J]�R>A@@?=<====>=


+
+

+
+																											
+

+

++?===>>>>>>>;Rva_F=>===<<==<;::;<=<<=A=7969<Fb�dG�g>?????>==<==>2

+	
	
+
+
+																											

+
8>>==>>>>>>=<jlS=<>======<;;;<===<<=A at 9:;6:<DEStgpsBA@@?>>>>=<==>


																																
+


?>===>>>>>?=Fyd?=======<;;<<=>>===>@A;9=98;<CEGH[[qP at ABA>>>>>=<<>0
																																	

*?===>>???@>;_wG=>>====<<<<=>>==<=>@B=:<=89<=BCEFDZylB@@A@>=======:

+
+																																				
6?>>=>>>>??>F{W>>>>=<<<<<==>>>==>>?B?<:><9:<=AACEDA\{GB??@@>>=<<==?(

+	
																															
>?>>==>=>>=<ak=?>>=<<=====>>===>>?A@=;=?:9;=>AABCE?FzWAA?>@@>=<<==>7
+	
+																														
+
*@>=>>===>==>pP=@>==<==>>>=====>>>@@><<?=::<=>@BBCDC@`kA@@?>?@?=<===>

		
+																											
+6?>==>===>=<EsC??====>>>>>=;;==<;;?=<;=?<;:=>>@A at BDC@ItJA@@?>>??>===?+
	

																												
+=>>>>==>>==:Vt????>=>>>>>=<====;=?=;;<?>;;:=>>@A at ACDBAmY@@A?>==??>==>5


																																

$?>>>>>>>>=<;db==>>>>>>>>====>>>>?>=<<=?=;<;>>=@@@ABCB at bj?CA>>>==>?>=>;


																															
.@>>>>>>>==<@c[>?>>>>?>=====>>>>>><<;;?><;<;?>=?@@@ABA at T{DAA?>>>>=>?>>=



																														
+4@>>>>>===<<;MG=>>?>>>>==>=>>>???=<<;=?==<<<?==?@@?@AB?T�K:?>>>=>>=>??? 

																									
7?>>>>====<<<=>>>>>>>>>>>=??>?@@>=<;<??>==<=@>=?@@??@A?I];8=@@>=>>>=>@@#

																							

9?>>=======<<>?>??>=>>>>>??>?@@?>=CD>?>>=><>@>>??@??>@A@>:8;?A@>>>>>=>@#
																								
+
9?>>>>==?>=<>>>>>>>>???>>>>?@@@><E]bM>>>=?<>?>>@@@???AA@@>9:;>@?>>>>>>? 																												
+
8?>>=>>>>=<=>>>?>>>????AID???@>>HXVUQE>>=?<??>>@@@@??@A@??;:;=?@?>>>>?>

																																	
+
5?>>>?>====>>>>@?>@?>?@U]QDACDHY]TQSSZI<=><@?FJAA@@@?@A@??=;;;=?@>>?>@<

+																														
+

/?=??>>>>=?@>>>>>?@??@I]NLSTTV_\WVTVW^^MCA at BEPRL@@@A??B@?>?==;<>@@>>?@5
	
+																													
+

(@??>>@>>>?@>=>>?@@@@@HJ??DUSLPVWTTTUZ[[XSF@=DRVD@@A??A@?>>=<<;<?@?>>A+	
+																												

 ?>?>>>>>>>?>>>?@A@@?>BF=8I^`WRQQOTRORQV^]TD6CUYF@@@@??@??>><<<;=????@%


			
+																									
+
>>>>>>>>>>?>>>>????>?@IXSajccd[SPTRPT^hhfj`PY_K@@@@@??@@???>=<;<>?@@?

																										
+

9?>>>>>>>>>>>=>???>???E`]cnfGDSXSXXXZQBRkeb`^H>@@@@@??@@?>@@?>===>@?>
																														
+

0@>>>>>>>>>>=>>??=?@?>EVWYXhG?>??@A@><>TbUXVWA?@?@@@??@@?>@@>>==<>??;
																																			
+

&@>>>>>>>>>>>???=?@???CPQOMbN>???>>>>>?YVPOUM@??@?@@?>?@?>???>>====?6

																																					
+


?>>>>>>??>>>??>>??????GTPHWZ>@?????>>?[PJMRB?????@@???@@????>>>==<?0
+																																			
+
<>>?>>??>>>??>?@???@@@>FSKLbA??????=>BbQPTC?>@@???@??>???>???>>>==?)
																																						
+
+
8?>?>>>>>>??>>?@?>@@???=APRdL=>???>>=ObYVB>???@@???@?>???????>>>>=>#
																																					
+
+
3@=>?>>???>>>?????@???>?>AYebG?>>>==JgfWA>?????@@?????>???>??>>>>>>


																																					
+
.@>?>????>>>???????>??>??>BWjbVQJLQYokM????>>??@@?????>?@?>???>>>><


+																																						

'A>>????>>>???>>?>?????>??>?OaRNRSQ`eD=????>>??@??????>?@@?????>>?:

+
+
+
+																																						


?>>???>>>????>??>?????>>???=DVPBDUR?;???>??>>?@??????>?@@?>???>>@7
+
+		
+																																				
+
<?>???>>????????>?>>?>>>????=?WLPS>><???>??>??@???????>@@@>????=@2				
+											
+																						
+
6@>??>????????????>>??>??????>LSSD?>=????>>>??????????>?@@???@?>@+
				
+																																		
+

+A>??>?@??????>??>>???>???>??>CVP?@==???>?>>?>??@???????@@??????@#
+																																								
+


@?>>?????????>??>???????>>??>CVWC?=>???>>?????????????>?@????>?=
+																																							
7A>>@???>???>>??>??>???>>>>???NP@?=??????>????????????>?@@???>A7							
+																																
+

'A>??????????>>>?>???@?>>>>>?>=>>?>??????????????>????>?????>?A,
								
+																														
+
+

:A???????????>>?>>??@?>>>>>>=<>>>>?>>>>??>>>?????????????@>>??
+								
+									
+																	
+	
+

(B?>>????>??>>?>>>????>>>@?===?>==>?>>>?>??>????????????@?>>A6	
+								
+																												

9A>>??????>>?>?>>??>>>>>??>>>==<=>?>>>?>>?>??????????>????>A'
										
+																										
+

#A????>???>????>??>?>?>>>??>>>=<=>>>>??>>??????????>??????@;
+											
+
+																								
+
+
7A?>?>???>?????????>????>>=?>=<>>>????>??>????????>??>>??B+
+											
+																							
+
+
+
+

#A?>>>??????>???>>>>?>??>>=?>==>>?????>??>??????????>>>?A<

+
+												
+				
+															
+
+
+
+	
+
7A>>>??????>?????>>>>>>>>>?>==????>??>????????????>>>>?B+
+
+
+										
+		
+
+																
+
+	
+
+	
+

"A?>>>>?????>??????>??>>>?>>=>???????>????????????>>>>A;

+
+
+									
+			
+	
+																		
+	
+

3B?>>>???????????>?>?>>>??>>>???????>???>????????>?>?A&

+
+
+
+
+										
+		
+							
+					
+					
+
+
+

=@>>>>??????????>>??>>>???=>???????>???????????>>??A3
+
+
+	
+
+
+													
+													
+						
+
+	

(A?>>>>????????????>>>??@?=>?????????????????>>>??A<

	
+
+
+	
+
+													
+
+
+								
+
+						
+
+			
+
1B@>>>??@???????????>????>??????????????@??>>>??@A%
+

+
+		
+
+						
+					
+									
+						
+
+
+	
+		

7B?>?>???????????????@??>????@@????????@??>>>>@B.

+
+			
+
+
+			
+		
+					
+						
+
+	
+			
+
+			
+	
+
+
9B??>>>??@?????????@@?>?@@@@@???????????>=>>@B2


+
+				
+
+				
+	
+
+									
+	
+			
+
+					
+
+	
+:B??>>??????????>????>>??@@@????@?????>>>>@B1
	
+
+
+
+
+		
+
+
+			
+	
+
+			
+		
+
+						
+
+	
+					
+
+
9B??>>>>??>?????@@@@??@@@?@???????>>????AA.
+


+
+
+
+
+
+
+		
+
+				
+
+	
+		
+	
+						
+
+								
+
+
+
8B@?>>>>???????@@@@??@@@@@???>>>>>???@B;$



+
+
+
+
+	
+		
+
+		
+	
+
+	
+
+
+	
+					
+
+								
+
+
+

2A@?>>>>>>?>??@???>??????>??>>>>>?@B at 1





+	
+
+
+
+	
+	
+
+
+
+
+		
+
+
+
+
+					
+									
+
+
+
+


'<B@??>?>>>>>?>>>=>??>>>>>>>???@BA6"	


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+					
+					
+			
+
+
+
+
+


+
.=B@@??>>>>?>>>>?>?>>>>???@AB>2"
		



+
+
+
+
+
+
+
+
+
+
+
+

+	
+		
+
+										
+
+
+	
+
+

	

+:ABA???????>???@@@@ABBA>6(				


+
+
+

+
+
+
+
+
+
+
+
+				
+
+				
+					
+
+
+
+
+
+
+

	
+
!-7=@AAAAAABBBA@?=:5.$

+	
+
+	

+
+
+
+
+				
+
+			
+					
+	
+
+
+
+
+
+


	

!&)*+++**)&#

+											
+
+	
+	
+	
+
+			
+
+
+
+
+
+
+

+	








+




+												
+
+
+	
+
+
+								
+	
+
+
								
+
+
										
+
+																																															 [...]
+													
+
+		
+
+
+
+			
				



+				
+				
+	
+			


+
+
+

	
+
+
+				
+	

+

+
	
+
+	



		
+	


		

	







+
	
			
+	
+
	




+
													


+	
+$-145341*"
						

		
+
 2<=<<<<===94'
	
+			
+
+*:>==;;;<====></			
+
				
+	
0=>==<;;;<=====>=5%

+
+				
+		
 2==>==::;<=>>>=>>=>8/


+			
+	

	!7>>===<975248:=>=>===<0

+	
+	
+						

$3>>>>=<7;95:+/029<>>===:+

+		

+
+
+
+
+
+	
+ (7>==>>=:CUn]][WIGB8;==<;:7,&"



+

+	

%.118??>=>?9u�b@@?DA?B>@G>>=<<96762"
		
			

+	';==????>??:;��H?@@@???>CSC;==>><=>>5


	
+		

+	
	
<>=>>>>??@Ar�}G=@A@@@@??=DD@=>>>>>>==0
+
+	
+	

	$D<?>>>>>>>??T���K@@@A??????@dlC=>>>>===>'	
+		
+
	
+
%F>=>???????<H���Y?@?@@@??@@QtuB>>=>>====<
+

	
+		

/==>=>?@@???Z���ZA at A@?????@@GezF>==>===<=>7
+
+									
+			
+

.?=>>>>>??@?~���@???A@????>?C��G<=>>=<<==?0		

+				
+	


+;>=>>>>?>?>=\���B?@??@@@???=V���O<=>==;<==>>"
+	

											
+5@>><<>???@Syw~R>@@????@@@@>G��v?=>==<<<<=>?5

+		

														
0@>>>;:>???B����p????>>>??@@?@>BOD=>>===;;;<=>?,
+				
+
																	
+		


+@>>>>>>>>??H��z��B@?>>?>=>?@@@?>>>>>>===;;====>?:2(		
+																	
+

#??>????>???>H����b>??@>>===>?A@??A@==>==>=:=>>>>==J4


+													
+		


+:?>>?????????=X��{D>>=>>>>>==>?@@ACD=>><=>?=>>=====>
																
+	
+

+
.@>>>>>???@??<<:<KB=>=====>>>==<=?ADI@><<=??>=======>5

+														
+		

+	=>>>>>=>>>?>=AIHD<>???>>??>>>>=;;;>?M[@8=<=<<;;<<==<=?(
+
																			
	
+
+
+
1?==>>><=>?>?XszwY=>>>>>>>>>>>>==;96U���I0468:::<<<===>8	
																			
+
+	

+	>>>>>>?=>?>Ad����Y<==>>>>>>>==<;;:99�����269;<<<<<<====>!

+

+																				

+
	7?>>>>>????Dw�}|}tY>=============<<<<�����U<=>>>>>>>>>>>?-


																						
		


+?>>>>>>???>e�]\x��b>>>=====>>>>>===??R��r�oS@>?>>>>>>>>>?9


																												
	

	
>>>>>>>>>>>CdB^��nG>>=====>>>>>==>@A=7k�����yH>>>>>>>>>>>?!
+

	
+
																										

+
+
	6?>>>>>>>>?=XMFc�a@=>>>==>>>>>>>>>@@?;7V���nh�m>?>>>>>>>>=?3




																								


+
+	&@>>=>>>>>??>qcNpU<<>>>>>>>>>>>>??@@><;:Dt�sPHg�C???>>>?>>>>?


	

+																														



+8?>==?>>>??>E|ZfbF<>=>>>>>>>>>>??@??>=<<<;Cl�fFO�N>??>>>>@>>>?5


+

+																																				


	"?>==>>>>>??<ZyhK;=?>>>>>>>>>>???????>===<=>AR|sS|_=???>>>>>>>>?*


+
+																																					
+


2?>==>>>>??>>ojE<>??>>>>>=>>>>????>>?======>A at FkmVj@??>>>>>>>=>>;

																																							
+

<>>=>>>>>?><KrT=>>>>>>>>>>>>>>>?>?>>>=====>>@A@>S`tI?@@?>>>>>===?(

	
+																																						
+

#@>>=>>>??>=;axJ=>>>>>>>>>>???>>?>>?>===>==>>?@A at Bfm^>@A@??>>>===>7

+
+
+																																							
+1@>>=>>>>?@?Exe@?>>>>>>>>>>>?>>??>>>>===>>>>>?@@@@G[lB?????>>>====? 



+																																							
;>>>==>>>?@>\|G?>>>>>>?>>>>>>>>??>>>>=>>>>>=>???@@>T{N??>>>>>>==>=?1
+
+																																								

"?>>>>>>>>>>@w]?@>>>>>?>>>>>>>?>>>>>>>=>>>=>=>??@@@@Dtc=>??>>>>>>>>><
		
																																								
/?>>>>>>>>><JzF@>>?>>??>>>><<>=======>==>>=>>>>?@@BA>VxA>??>>>>>>>=>?&
	
+
																																								
+
9?>>>>>>>>>;ZrA@??>>>??>>>>>======<<9<=>>>>>>>>???@A at F~O=??>>>=>>>>>?1


																																									
+
>?>>>>>>>>=>cb???>>>>>>>>>>>>>===><<<=>>>>>>>>?????AA at uh=@?>>>>>>>>>?8


																																									

$@?>>>>>>>==@d`?>>>>>>>>>>>>>>>=<<;:8<=>>>>>>>>>>??@?@?`yD?>>>>>>>>>>?<
																																									

,@?>>?>>>==<:HD>>>?>>>>>>>>>>>>>=<<<<=>>>>>>>>>>>??>?@?XzJ==<<>>>>>>>?=

																																									
1@?>>>>>>>=<<>??>>>>?>>>>>??>>>>><<<<>>?>?>>>>>>???>???HZ><>==>>=>>>>?>


																																									
3@?>>>>>=>=;=>??>?>>=??????????>>CJKD>????>???>>>>>=????=:;>?>>>>>>>>??

																																										
+
4@?>>>>>?><<>>>??>>??@@=>??????>=P[[V>???????>???????????=;=>>>>>>>>>??



+																																									
+
2@?>>>>>>=<=>>>@@>????@GE????@?@NWNNUP@???????>??@@?>???>>;<>>>>>>>>>@=																																										
+

.@??>>>===>?>>>?@>@@??I[SC???>D_aQMNQ`O>@????@C@@?@???A?>>=<==>>>>>>>@8																																										
+

(@=??>?>>=>@>>>>?@@@?AUTOLEBDLZd^SQRSbcH?????CKH@??@??@??>==>>>>>>>>?A0
																																										
+

 @??>?@>>=>@>>>>@A@??CXTF?@DRXV_aYTT]cf_OB>??GMMB?@@?>???>====>>>?>>?@*
																																										
+

>>?>>>>>>??>>??AA@??@K]N8;AP]VW]XRVZ\[[ZE>;9LSPC???@????>>=====>>>??@$

+																																									
+
;>>>>>>>>??>>>>??????>OaIGHALZVTPNQSUY\EBNILULD@????????>>>??>>?>>???




																																								
+

4@>>>>>>??>>>>>>>>???>HjhhkI=EV\VSTVVPB<Zkcd[B??>???????>>???>>??>??<


																																								
+
+

+@>>>>>>?>>>>>>>??????O_`]fc@??ACFFC@>>HfW_`_F>?????????>>??>>>>????9


																																									
+

!@>>>>>>??>>>>>>>?????OTROPeG>?>>>>>>?>V^OTXZJ>????????>>>??>>>>?>?@3

+																			
+																					
+

>>>>?>???>>>?>?>???>>CPSOM\S=?????????]TNQUOC???????????>>?>???>>>@-
																																										
+
;?>?>????>>>>?>?>????>ANUMM`@???????>CdNLTK@??????@????>>>?>>>>>>?A(

																																										
+
+
6@>?>>??>>>>>??????????>GUI\S=>????>>T[PZJ>>????>?@???>>>>?>>>>>??@$

+
+																																								
+
0@=>??>>>>>>>???????????>IWOaPA?>>>@O]VXH>?????????@??>>>>>?>??>??? 


																	
+																						
)A>>???>>>>>???????????>??P_UVVPKLTVT]WB>????????????>>>?>>?>?>>??=


+																		
+																						
!@>?????>>??????????>??>???J]VFHPNNP`W@???????????????????>?????>?9

+
+																		
+																						
+
>?>????>>????>???>????>???>BWYMJGO`O>???????????????>????>>?>??>@4
+
+
+
+																																							
+
9?>??????????>????????>?????DXWMO[F>??????????????????????>????>A.
+
+
+																		
+																				
+
0A>??????>>??>?????>??>>?????O]MRS>???????????????????>???????>>A'
	
+																		
+																						

$A>>?????>???>>????>????????>C^SVM>???????????????????????????>??


+																			
+																						

=?>??????????>??????????????>IZZL>?????????????????????????@?>@;
+
+																		
+																						

3B>>????????>?????????>>??????PQC???????????????????????????>>A2																				
+																						"A?>>???????>>>>???????>?>>>?>==>???>>???>??????????????????>>A&
																				
+																						

9@>>??>??????>>???>???>>??>=====>>>=>>??>??>???>??????????>>?=
+																					
+																					

&A?>>?>??>>??>??>?>???>>??>=>>>==>===>>?>>?>???>?????????>>>A2	
+															
+		
+																						

9A>>?>??????????>??>>??>>>??>>>>>>>>>?>>????????????????>>?A$
																		
+
+
+
+																				
+

%A?>>?>????????>>>>>>???>>??>>>=>>>?>??>??>????????>??>>>>@:																				
+
+																					

8A>>?>????????>?>>?>????>>>?>>>>>>???>???>>??????>>??>>>?B*	
+																	
+
+	
+																		
+	
+

&A?>>>?????????>>?>>????>>>?>>>>>>?>?>???????????>??>>>>@=
+
+																		
+	
+																			
+	
+
+8A?>>?????????>???>???>>>?>>>?????>???????????????>>>>?B-	
+
+																	
+																				
+	
+

#A@?>>??????????????>??>??>>>>?>??>??>????>???????>>>>@=

+
+														
+	
+
+																				
+		

3B?>>>????????????????>>>>??>?>????????????????>>>?>?B)
+
+
+
+														
+
+
+
+	
+																				
+
=A?>>???????????>?>?>>?????>?>?????????????????>>??B7	
+
+																		
+																							


%A@>>>????????????????????>?????????????????>>>>>?A>

	

+
+														
+
+
+
+																						
+
/B@>>>??????????????????@?????@@???????????>>>?>@A'

+
+
+															
+
+																							

5B?>>??????????????????????@??????????????>>>??B.

+
+												
+
+
+	
+																						
+
+

7B??>>??????????????@?????@@@?@?????>??>>>>?@B1


+
+
+
+									
+	
+
+
+
+
+
+																			
+
+

8B@?>>>??@@??????????????@@?????????>?>>>?@B0
+


+
+
+
+
+				
+		
+
+	
+
+
+
+																				
+
+
+


6B@?>?>>????????@@@@@@@@??????????>>>>>?A@,
+


+
+
+
+
+
+
+				
+		
+
+
+
+
+																				
+
+
+
+

3B@?>>>>???????@@@@@???????????>?>???@B9"



+
+
+
+
+
+
+			
+	
+
+
+
+
+
+
+																		
+
+
+
+


- at A???>>>>?????>>?????????>>>=>>>?AB>,
+
+	


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																		
+
+
+
+



"9BA??????????????>?>?>???>?>?@AB?0

	



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+																
+
+
+
+



+
'9ABA@????????????>>>????@ABA;,		


+
+
+
+
+
+
+
+
+
+
+
+

+		
+														
+
+
+
+
+
+

		
#2=ABAA@@@@@@@@@@@@AABB?:0"
			


+

+
+
+
+
+
+
+
+
+
+
+		
+												
+
+
+
+
+
+
+


+	
#-5:=?@@AAAA@??=95/'


+	
+

+
+
+
+													
+
+
+
+
+
+
+
+






 "$%%%$" 



								
+						
+
+			
+
+
+
+
+
+
+
+
+			










+
+
+	
+
+				
+
+		
+
+
+			
+
+
+
+
			
+
+

+			
+
							
+																																																			 [...]
+	
+


+
+	
+
+
+	
+								
+	
+
+					

+	
+

+

	

					
+	
+
+

+	
+	

+
	

+	
	
+

+

	
		
+
+	
		

+	
+
+	


$**'((#

													

+	
0:==<<;;:6*


+	

+
+			
+	
$:?=<:9;;;;<>5 	
+				
+.=>><<;9:;;:;<=:%

+
+	
+			
+
5?>==<;;:9::9:;==;(
+
+

+		
+			4?>>>=;;:;:;<<::=<=<-
	
				
+	
	
+0>>>>>=:878;;9;;::=>>;/


+									
+
	.>=>>>=8>E_vCRiA88:>===;+	
	
+
+
+
+
+		%6>>>>?==P���������I5:===>9'	
	

+	
+
	
$(1<>=>>>>@���i[WkXUtp��H<=>>=4-)%		
+	
		

+1:=???>>>?9T��a<>=>=><>}�{8>>>?<999+	
	

				
	
7?>>>>>???Cj��G??@@@A@?L��T=??????><)

+
+


	

42?>>>>>=>@>f���O@??@?A@@@=m��V>@??>>=>=#
+
+			

+

!I@>>????>>?<M���N>>?@?@??AE���h=@???>==?8	
+		

+				


+<=>>>??????J\\d\A@@????@?@Bu��`????>>==>?.
+			
+
+
+	

+		


-?>=>=>????>g�}G;>>@@?>??>?@A���X=??>>==>>= 
				



+					
+5?>>?>>>>>?;O��[>??>?>>>>>?>S���h<??>>>>>>?4
+
+		
							
+	


)@>>=;????>KVDOaE>?@?>===>>?>G���G????>>>>>>>"	
+
+

												

+>?>>=9????Ax��kB?>=>?>===>>>>=IY@;@?>>>>=<==>7	
+	
+	

														
+					
+:@>>>??????G~���S?@?>>>>>>=>>>><78<??>>>>>=>>>><'
	
+
+		

																		

+3@>>>>?????=^���rB?????>>>>>>>>==<:;=?>>>>=>>>>>?@H*		

+																			
+	


+
(@>>>????@??Ab���Z??>>>?>????>>=<=<;;<>?>>>;>>>>>>??

																			
+
	
+
+	=?>>>>???@??Ij_cmL??>>>>>?????>=<==;<<=?>>>>>>>>>>>="

																				
+

+
+
+2@>>>>???@@>Lnp_\gD????>??>?>>?>>===99;<>>????>>>>>>?9	
+
																							

	

+	!?>>>>?>>?@>P~n_fY?@???????>?>>>>>>>FG<:>????>==>>>>>@&

																								


	8?>>>>?==@>R��y�urH>?????????>>>>=>=Env`E;????==>>>>>>?5
+	
																							
+


+
++@>>>>>??>?J�zw���m?????>?>>>>>>>==>=F����V@=??>>>>>>>>>=


+
																															

+
	
>>>>?????@>k}N^jz~L??>>>>>>>>>==>==>?Dx����xK>?>>>>>>>>>@*




+																															
		
	8?>>>?>???>HXB^�zK=??>>>>>>>>>>===>??Hm��xp��J>>>>>>>>>>?8


	
																																			

+
+
+
+
,@>>>>>>???=cwKT~rI<?>?>>>>>>>>?>>==>??Af���PK�i=>?>>>>>>>>?"
+

+
	
																																			


+
+	=>>>>>>>??>@|^PqY@=>>>??>>>?>>?>?>>>>?@@Ad��O?e|A>>>>>>>>>>?8

+
+		
																																		


+
+
0?>>=>>>>??<MygdG<>>>>>??>>>>>>?>>>>>???@>=WlJT�L>>>>>>>>=>>?-

	
+	
																																					
+

	=>>=>>>>>?>;cgV?=??>>>>?>>>>>>>?>>>>>????>=;Inx\k[=?>>>>>?>=>>>

+

																																				
+


+*@>>=>?>>>?=Dp[B=???>>>>>>>>>>>>?>>>?>????>>>==O`[n@?>>>>>>?=>=?5

+
																																					
+

7?>==>>>>>>;XqU>>??>>>>>>>>>>>>>?>>>?>??>>>>>>><J`sH??>>>>>>===>>

+
	
																																						
+


?>>==>>>>>=<irR>??>>>>>>>>>>>>>>>>>>?>??>>>>>>??>[pZ=A@>>>>>=<==?/

	
+
																																							
+

+@=>==>>>>><GujC>??>>?>>>>>>>>>>>>>>??>?>>>?>>>??>G`lA@@???>>====><

+
+																																								
+
7?>>=>>>>?@>]V=??>>??>>>>?>>>>???>>?>>>>>>>>>>>???TtN=??>>>>=====?+

																																									

>>>>=>>>>>?DvcB>??>>?>>>>>>?>>>>>>>>>>>>>>>>>>>>>??Fya<>>>>>>>>>==>9
+	
																																								
(@>>=>>>>>><SwI?>?>>>??>>>>><=>>>==>?>>>=>>>>>>>???A>ft>>?>>>>=>>==>> 
	
																																										
3?>>>>>====<cjC???>>>?>>>>>>99<=<;=>98<=>==>>>>>>>?A?R�H=@?>>>>>>==>?+
		
																																									
+
:??>>>>>>>=AdaB@?>>>>>>>?>>>>>=<==829;=>>>>>>>>>>>?@AD]<@>>>>>>>>>>?2
+
																																									
+

>?>>>>>>>===`]?>?>?>>>>>?>>>>>=<;<5.<==>>>??>>>>>>>??AflB>=>>>>>>>>>?7


																																								

"??>>>>>>==<:A@>??>>>>>>>>>>>>>>==<<<==>>>>>>>>>>>>>>??]qF=<<=>>>>>>>?:


																																									

'@?>>>>>>==;<>?>?>>>?>>>>>?>?>>>==<<=>>>>>>>>>>>>>>>>?>IS;<=<=>>=>>>??<
																																									

*A?>>>>>==<;=?>??>?>=?????????>>>HLLG?>????????>>><>????<9<=>>>>>>>>>?<
																																										

*@?>>>>=>=<<>?>@@>???@?>???????=DYVUZI=?????????>?>>>>?>><;=>>>>>>>>>?;

																				
+																						

)@?>>>>>>=<=>>>?@??@?@AD@?@??@?FZSMLQXF?@?@@???????>>??>>=;<=>>>>>>>>@8
																																											

%@?>>>==>==?>>>>>?@?@@PXC?@?@?@WjYSRZgS@@?????@?????>@@>>=<<=>>>>>>>?A2
																																											

?>?>>?>>==@>>?>?@@@?C[UG>???@JYgc]ZcfQC@@?@???@???@>??>>=<<===>>>>>?A-

																																											

>>?>>?>>=?@>>>@A@@??BRRF??>?GTbje`_jhYG@@@@?????????>>>?>=<===>>>>??@(


+																																											

<?>>>>>>=??>>?@A@@??@BGD=;??IW`hcddjj]KA??9>??>@@???????>>=>>==>>???@"

																						
+																				
+

7?>>>>>>>??>>>????????@A>=<=DWYYX\^][^L>==<==>?@???????>>>>??>>>????>

		
+																																									
+

/@>>>>>>???>>>??>??????DJUXD>GXZWY\XWRA>MUNKD?@????>??>>>>?=>>>?????<
	

																																									
+

&@>>>>>>???>>>?>>?????FQ]blZ??BFHKLHD?>IfbbdYA?????????>>>?>>>>>?>??7

+																																									
+


?>>>>>>?>>>>??>??????PX]]X`B?>>==>>>?>Q[Z``^J?????????>>>?>>>>>>>?@3
	
+																																								
+

=>>?>>???>>>??????>>>HW\UR_J>?>>>?>???ZXSXXVG??????????>>??>>>>>??@.																																										
+

9?>?>>??>>>????>??????DR[NS\??>>????>C^MRYOE@??????????>>>?>>>>>>?A*

+																																									
+
+
3@>?>>>?>>>????????????=KWJVT>>?????>UTP[I>>??????@?>??>>>?>>>>>>?A$
+

																																								
+

,A>????>>>>????????????>>NRI\WD?=>>CUXRZG>??@????????>>>>>>?>>>>???



																																								

$@==????>>>???????????>=?@URIPVQOOQSQTZE>?????????????>>>>>?>>>>>?<

+
+																																									


?>>???>?>?????????????>??AUYLJMQNKGT\E>?????????????>>??>>?>>>?>@8
+
+																																										
+
<?>????>???>???????????@??@P^ONKIIWZA>?????@???????>>>???>>?>>?>@1
+
+																																										
4@>????>?????>??????????????ZbLPT\V@??????????????>>>?>??>>???>>A+
+
+
+																																								

*A>??????????>??????????????CbQS\aC>@?????????????>????>?>????>>@#
+																			
+																						
+

@>>?????????>?????????>????>GZM^W>@??????????????>????>??????>?>


+																																										

9@>???????????????????>>????>SWdL>??????????????>?????>?????>>@9
+
+																		
+																						

.A>>??????????????????>>?>??>CQOC>?>?????????>??????>?>?????>>A0	
+																		
+																					
+@?>>??>???????>?????>>>?>>>>===>>>>>??????????????????????>>>A%
+																			
+																						
+7A>>?????????>>???????>@@>>======>>>>>>????????>??????????>>?<
+
+
+																			
+																					
&A?>??>??????>????>???>>?>>=>====>>>>>>?>>??>??>?????????>>>A2																				
+																						
+
;@>??>??????>??????>>?>>>>??>>?>>>>>?>?????????????????>>>?A$
																		
+
+
+
+																				
+
+A?>>?>????????????>?????>??>>>=>>???????>?????????>??>>>>@;	
+																		
+
+																				
+

>@>>>???????????>>>>>???>>>>>>?>>????????????>???>>?>>>>>B,
	
+																		
+																						
+
/B?>>>??????????>>>?????>>>?>>?>>??>???????????????>>>>>@>

+														
+			
+		
+																		
+
+	


>@>>>?????????????>???>>>?>>>?????>??????????????>>>>>?B/	
+																
+	
+																						
+
+B?>>>???????>????????????>>>??>??>??????????????>>>>>@>

	
+																	
+	
+																		
+		

8A??>>???????????????>?>>>????>????????????????>>>>>?B*
	
+															
+
+
+
+	
+																				
+
 @@?>>????????????????????????????????????????>>>>>?A8
	
+																	
+
+	
+																					
+
,B@??>>?????????????????????????????????????>>>>>?A>

+
+
+
+														
+
+
+
+																					
+

3B@>>>????????????????>?@????????????@????>>>>>>@A(


+
+												
+
+
+
+
+																						
+

7B??>>??????????????@???@?@????????@?????>>??>@B.


+
+
+											
+			
+																					
+
+
+

9B??>>>>????????????@?@@???????????>>??>>>??@B1


+
+
+	
+							
+	
+
+
+		
+																	
+		
+
+

9B@?>>>??@@??????????????????@???>??>?>>>?AA/	


+
+
+											
+
+
+
+
+	
+																	
+
+
+
+

6B@?>?>>???????@@@@@@@?@??????????>>>>>@B?(




+
+
+						
+			
+
+
+
+
+																					
+
+
+
0AA??>>???????@@?@@???@??>????>??>???AA6




+
+
+
+
+							
+
+
+
+
+
+
+
+																	
+
+
+
+
%<BA??>?>?????????????>?????>>????AB<'
	

+
+
+
+
+
+		
+
+		
+
+
+
+
+
+
+	
+															
+
+
+
+



.>BA???>??>?????????>>??????@@BB<+





+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+																
+
+
+
+



+.<BBA@?????????????????@ABB at 7'
+
+


+
+
+
+
+
+
+
+
+	
+
+																			
+
+
+
+
+
+

	
%3;@BBAAA at AA@AAAAABBB@<4)


		


+

+
+
+
+


+
+

+		
+													
+
+
+
+
+
+

	
+
'.48;<>>>>=<:84/)!
+		
+
+	
+
+			
+		
+			
+			
+
+
+
+
+
+
+
+
+









+

+								
+
+
+				
+
+				
+
+
+
+
+	
+
+		
+









+
+										
+		
+
+
+

+				
+
+
+
+

+				
+
+

+						
+

+						
+																																																																										 [...]
+					

+
+		
+	
+

+
+		
+

+
+
+
+
+
+
+
+
+				
+	
+		
+		
+	
+
+
		
+	
+

+		
+			
+


+
+	

	
	
+
+			
+	

+
+	
+


+
+

+				

		
	")/200.) 

									
+
"4<==<<<<<:0

	
+

	


+		
+
+*=>=<<<<;<;<=9"

+										
1>>><<;<;;;;<<==)
+		
		
+
+		
+2?===<<<;;;;;;<==>*
	

+
	
+
+		/?>>==<;;;;;<;:;===>(
+
						
+			
+
				,>=>>><;;99:::;;;<<>><!	
		
+				-?==>>=:;=HZ at LU:7:<=>=>8 

+
			
		4??>>?>:@w�������{G6<>==?7#

+
	
+
+
+
+
+	
#0<>==>?=C}������������D==>>>5%

	

			
+
+	
"3<??>>>=>:i���oNPEJK`m��v8>>>>>93)

			
+					

+
	
)>?>>>>>>>AJ\��lA>>????O��{;>?>>???>6

	
		


+&"<>=>>>>?@>U�y\iM>?@@@@?Ec���R>??>>>=>8

+
	

	
E>>>>>>>>??=V��l;=>?@???@@C���m<???>>==?0

+	
+


+9=>>>???>??BNalS???>>?????Bs��J>>>>>>><>>!
	
+			
+
+
+	

+
+		
*>>>>>????@?f�oD=>>@?>>>???@=U��J=>>>>>>=?4
+						

		
+	


,?>>?>>?>??Fo��L??>>?>>>>>??A|��M>??>>>>>>>#
+	

+										<?>><>????Rd^xxF>??>>?>>>>>>@x�a=?>??>===>?4				
+
+									
+	

+4?>>>8=@@?D��~l]@>>??>>>>>>>>>BE9;?>>>>>>>==>&

+				
+

+												
+		


)@>>>>>>@?>Ru~��O=??>>?>>>>>>>><9;<>?>>>>>>>=>;#
+
+
+				

+															
+							


+
<?>>>>??@??p�wwmI<?????>>?>>>>>=<<<=>>>>>>>>>>?:=="	
																		
+
+	


+8@>>>???@@>N����mE??>>?>>????>>===<<<>>=>><>>>>>>CB


+																			

	
+
+
+
.@>>>????@>Cpodub>@???>>>>??>>>>>=<<;<>=>><>>>>>>?3	

																				


+
+	 ??>>>?????Ak}TMWyJ>???>?>>>>>>>>>>=;:8;>>?>>>>>>>>>?&

+																								
	
+
	7@>>>??????j�bQZ|d>@@???>>>>>>>>>>>>@C at 9<>?>>>==>>>>?8
	
																								
+



+
*@>>>>?=>?>a�ZQTm}F??????>>>>>>>>=>>BQ\m]A<???<<>>>>>>? 




+																													
+
+
+

=>>>>>?=>>O�fVjv�X>@????>>>>>>>==>>=Ij||�~T<??==>>>>>>?0





+																														
	
	6?>>>>>??>?tsKay�f???>>>>>>>>=>>===>=O������Z>?>>>>>>>>><


		
																														
	
+
+
-@>>>>>??@=U�SJg}W>??>>>>>>>>>>>=>>>>>Et�syop�K=>>>>>>>>>@&	




+																																	

+	
+	 >>>>>>>???=qrJeqK=???>>>>?>>>>>>==>>???KwzaHI�f=??>>>>>>>?9
+



+																																		
+

+	8?>>>>????=E}]fcA=??>>>>>>>>>>>>>>=>>???=M��S at e{A>>>>>>>>>>@/

	
	

+																																		
+
	
+	&@>>=>>>>>>;Yp\V>>??>>>>>>>>>>>>>>>>>?????=Jow^U}L>?>>>>>>=>>?'

+	

																																				
+

+	8?>>=>>>>>==p\U=???>>>>?>>>>>>>>>>>>>?????>=@SkPh]=?>>>>>>==>?;
	

+																																				

	 ?>>=>>>>>><MtXH=???>>>>>>>>>>>>>>>>>???>>>??><?Wco@?>>>>>?>===?*

+
+
+																																					
+


/@>==>>>>>=<inaA???>>>>>>>>>>>>>>>>>>>?>>>>>?>?=C[sK>?>>>>>>===>:
+


+																																						

;>>==>>>>=<CvgU>??>>>>>>>>>>>>>>>>>>>??>>>>>>>??=PlZ=??>>>>>====?$
+
	
																																							
+

$@====>>>>=;RqdC?>?>>>??>>?>>>>>>>>??>>>>>>>>?>??>HekAA@>>>>>====?6
		
+																																							
+
1?=>==>=>=?=epZ=?>?>>>>>>>?>>>>>?>>>>>>>>>?>>>>>??A_wP>@???>>=====?#

+	
+																																							
+
;>>>=>>==>@GmhH>??>>>>>>>>>>>>>>>?>>>>>>=>>>>>>>>?>Lza<>???>>=>===?3
+
+
+																																							

>>>=>>===>@]gN>??>>>>>>>>>>>>>>>>>??>>>>=>>>>>>>>?@@or=>>>>>>>>>==><
+	
+																																									

*?>>>>>=<=>Ec_F?>>>>>>>>>>>>::;<:<?=;<==>==>>>>>>>>@@\�E>?>>>>>>>>=>?"
	
																																										
3?>>>>>=>><EefD???>>>>>>>>>>>=<;;7('4;=>>>>>>??>>>?@@M{V=?>>>>>>>>>>@*

+
																																										
9?>>>>>==><;TS?????>>>?>>>>>>>=<=7# 8>>>>>>>?>>>>>>@@EfeA>>=>>>>>>>>@/


+
+																																								
+<?>>>>>===<;<>>???>>>>??>>>>>>=;;;:69>>>>>>>>>>?>????@bjE<<;=>>>>>>>?4

+																																								
+

??>>>>>===<<>??>>?>?>>??>?>>>>>><<===>>>>>>>>>>>>>>>??IK:<=<>>=>>>>>?7

+																																								
+
??>>>>>===;=?>?@?>>=?????@??>?>?FHFD?>????????>?=<>?>?><:<=>>>>>>>>?@7

																																											

???>>>=>=<<>>>?A?>@??@?????????NUWUTQA?????????>?>>>>?>=<<=>>>>>>>>?@5

+																																										


?>>>>>>>==>>>>>??????@???????>H_XVTV_J>???????????>>A?>=<;==>>>>>>>?@2
																																											

>?>>>>>>==?>>>>>?@?@@DD?????@@DS_a]_VFC????????????>@?>>=;==>>>>>>>?A-

																																											
+
=>>>>@?>==@>>>?@@@??@FD>????@HADLONNDFPA??@???@???@>>>>>><<=>=>>>>>?@*


																																											
+
;>>>>>>>=>?>>?@A@@??@??>????BLEEILLICHTF??????????@?>>>?>=<=>==>>>??@%


																																											

7?>>>>>>>??>>>@A@?>?@>>>?<??ALNLLTRMMKOH@>9>>??@???>???>>>=?>>>>>?>??

+
+																																											
1?>>>>>>???>>>>????????>>>=?AOXURVSSXUGA>?>>???@???>>>?>>?>>>>>>?>??>


																																										
+

)@>>>>>>???>>>????>>???GT\PA>FXYRORTUN@@Ud^UH@?@???>?>>>>?>=>>>>????:

+
																			
+
+																				
+

"@>>>>>>???>>>??>>????DchbaT>?EJFDEFF@>Nfgfe]D????????>>>>?>>>>>>>??6
																				
+																					
+

>>>?>>>??>>>???>?>?>?F\XX_^???>?????>>Se_^`cH??????>>??>>?>>>>>>>?@4
																				
+																					
+

;?>?>>???>>????>???>?CQ^d^_D>???>????>Yffe]ZC??????????>>?>>?>>>??A/


+																																									
+
+
6@>?>>??>>>???????????ALbaaY?>???????A`_`TIB???????????>>>?>>>>>>?A*
+
+
+																																									
+
.A>?>?>?>>>????>???????=BZX]R>>?????>U^\N?>>?????????>?>>>>>>>>>>>@#


																																								
+

&A>????>>>?????????????>>FYWYSE?>>?DT]]R?>????????@????>>>?>>>?>??>



+																	
+
+																					


@>>????>>???>?????????>?>J\YWXTMLRUW]SA>??????????????>>>>?>??>>?;

+																			
+																						
+
=>=????>>?????????????>???QcZSTWWSOXUB>??????????????>>?>>?>>>?>?7
+
+
+																																									
+
8@>????>>?>???>??????????>BY_XXUSMU^C???????????????>???>>??>>?>A1
+
+																																										
.A>????>??????>?????????????T\VZ]QaM?@????????????>?>?>??>??>??>A+	
+
+																																								

#A>?????????????????????????BUUbs_TA@?????????????>>??>>?>????>>@$
+
+
+																	
+																						
+
=?>?????????????????????????DPS``G???????????????>????>?????>>??



+																			
+																						

4A>??????????>??????????>??@>MTSV@??????????????????????????>>@:
+
+																																									


'A?>????????????????????>>???GOD@>?>>?????????????????>?????>>A2
+																			
+																					
+>@>>?????????>??????????>>>>>==>>>>>>>>???????>???????????>>>A&

+
+																		
+																						
3A>>>????????>>?????????>>>=>>>>=>>>>>>???????>???????????>>?=

+
+
+																																									
#A?>>?????????>????????>>>>=>>==>>>>>>>?>???>????????????>>>A3																		
+
+
+																						
+;@>>????????????>>>????>>>>>>>>>>>>>?>???>????>????????>>>?A%
																		
+	
+
+																			
+
+
.B??>???????????>?>?????>>??>>>>>>?????????????????>??>>>>@;																				
+
+																			
+
+


@?>>>??????????>????>???>???>>>?>????>>??????????>??>>>>?B-
																				
+	
+																		
+
+
+
4A>>>?????????????>???>?>>>?>>>>>?????>>???????????>>>>>@>

+
+
+																	
+	
+																		
+
+	

 @@>>>????????????????>>>>>?>>>????>???>??????????>>>>>?B0

+																		
+
+																			
+		
+
0B?>>????????>?????>?>>??>>????????>??????????????>>>>@>	
+
+
+																	
+	
+																					

<A??>>??????????????>????>>????>???????????????>>>>>?B+
	
+																	
+
+
+																				
+&A@?>>??????????????????????????????????@?????>>>>>?B8
		
+											
+		
+	
+
+	
+																					
+
2B@?>>???????????????????@?????@???????????>>>?>>?A?



+
+
+													
+
+	
+
+																				
+

8B??>???????????????????@??????????????????>>?>?@B(


+
+										
+
+
+			
+																						
+
;B??>????????????????@@@@@@?????????????????>?@B.



+
+
+											
+																								
+
+
+


<B?>>???@???????????@@@@???????????>??>>????@B/
+

+
+
+									
+	
+
+	
+	
+
+																
+	
+
+
+

<B@??>??@@?????????????????@?@???>???>>>>?AA-
+



+
+
+
+
+								
+
+
+	
+
+	
+																	
+
+
+
+

9BA??>>????????@@@@@@@???>?????????>>??@B=%




+
+
+	
+
+		
+				
+
+
+
+
+																			
+
+
+
+


2BA???>>??????@??@?@??????????>???>??AB5

+
	



+
+
+
+
+
+		
+			
+	
+
+
+
+																			
+
+
+

&<BA?????????????????????????????@AB;'


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+																	
+
+
+
+


,>BA????????????????????????@@BB;*

+
+



+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+																
+
+
+
+



,;ABA??????????????????@ABB?6&





+
+
+
+
+
+
+
+
+	
+
+
+
+
+	
+												
+	
+
+
+
+
+
+

	

%2<@BBBAAAAAAAAAABBBB@<4)


+	

+
+
+	
+
+
+
+
+

+				
+					
+							
+
+
+
+
+
+

		
 '.48:;=>===<;84/(!


+	
+
+	
+
+				
+	
+	
+						
+
+
+
+
+
+
+
+
+

	









									
+
+
+
+		
+
+
+
+			
+
+
+
+
+	
+
+	
+













+									
+
+
+	
+
+
+
+							
+
+
+
+
+
+									
+
+
+
+									
+

+										
+																																																																																													 [...]
+			
+
					
+		

+
+


+





+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+		
+	
		
		



+	
	
					
+				

+

+	
	

+			
+

+	

+	

%*00.-(
	


+
+	
+										
	
+
.:=>=<==<:/
			

+		
+
 8>=<<;;;<<<=8 	
	
+				
+	
+%;>=<<;;;;<;;<=<&

+
+			
+						
+
'=>==<;<;;;;<;<==<%


	
+
+	
+			


&>>===<<<;<;;<<<===< 

+							
+	
+
+
+
+
+					
)=>>>=<;<;;<;;;<<===>9
				
+	
+0?>>>>=;:9:>9>=8:;<===?5	
	
+	
+
6??>>>>87Wj[�t�tZS:8===>?4	
	
		
+
+<?=>>>=Ce[���������e\===>>?2
	

+

+

+	
+	
+
*9??>>=>><n����l�Xvs����g:=>>>?5%		
	
+
					

+
		6?>>>>>>>>;f��pS>@>?@Uq��n8>>>>>??:)
+
+
+

4?>>>>>???Hfcx�S;?>???<U�uafE>????>=>,

+
+			
+
>;>>>>>>>??>b��mM?>@>=???AIk��U=???>>==>%
+			
	
0=>>>>??>??Ee��^=>>>???>??Ax�qA?>>>>>>=>8
+			

+		
+
+
#=>>>>>???@@h�okB=??>>??>>>@N]o]?>>>>>>>=>&
+
			
+		
+

	
+
+	

+"?>>>>>??@?M���j@>>??>>?>>??Eu�}>?>?>>>>>?5	
+	


+				
+	
+
4?>>>>????Jjc~�c??????>>>>?>Bx�X=?>??>>>>>>!				

								
+				
+#?>>?9:@@?E��pj}K<????>>>>>>?@QP>;?>>?>>>>>?6
+			

											
+
+

+8?>>>==?@?Xx���n8>????>??>>>>>AA:;?>>>>>>>>>?-
+			
+
+													
+
		

+
+@>>>>????FwiVe}Y9?@???>>?>>?>><<99=?=>>>>>>>>="!)			
																	
+	

+



#>?>>??????b���`zI>@???>>>?>??>><=<8;?>>>>>>>>>?:BG
	
+
																				
		

+	;?>>>????>S�jx||e>@???>>>>?>>>>>=AD:9>?>>=;>>>>>>@)

+																					
+

+
+	5?>>>>???=K�mEEfzE????>>>>>>>>>>>=GTM=;?>>>=>>>>>>>3

+
																							
+
	

+
)@>>>????>AwvICV�S>@????>>>>>>>>>>=OhniI<>>?>>>>>>>>?"


+																									


+
	=?>>>????>i|MBIj>???>??>>>>>>>>>>=Wygx�_>>??>>>>>>>?4	
																													
		
	5?>>>?>=?>Z�PAIxwE????>?>>>>>>>>>>>=S�][k�g<;>=<>>>>>>>




+
+																													
+
+
+
+
*?>>>>>>==H�iCMwiD>?>>>>>>>>>>>>>>>>?Ey�yll�c;===>>>>>>@-





+																															
		
+	!>>>>>>???<d�OQs]>>??>>>>>>>>>>>>>>>>?>T���jb�K=>>>>>>>>?;
+



																																	
+
+
+	:?>>>>???>@zfSmU=>?>>>>>>>>>>>>>>>>>>?@=`�iXK{g=?>>>>>>>>@/



		
																																		
+
		
.?=>>>????<OxNjO=>??>>>>>>>>>>>>>>>>>>?@??ay`Gb|B??>>>>>>>>?'


+

+
+																																		
+
	
+=>>>>>>?>>;hgQQ<????>>>>>>>>>>>>>>>>>???@>>MofGxO>>>>>>>=>>>>


+	
																																			
+

+	
/@>>=>>>>><C{X_A>>??>?>>>>>>>>>>>>>>>>>???>>=@T[m`=??>>>>>==>?5

																																					

	<>>>=>>>>>;Xr_R=???>>>>>>>>>>>>>>>?>>>?>>>>>?><S]rA?>>>>>>====>

+	

+																																				

	&@>>==>>>==?rbfB>??>>>>>>>>>>>>>>>?>>>>?>>>>???>A^wO=?>>>>>==>=?0

+

+																																							

6?>>==>>>=<Rt\U>?>?>>>>>>>>>>>>>>>?>>>>>>>>>>>>?=Tn^<?>>>>>>===>=
+


+																																							

>>====>>==<dkeC?>>>>>>>>>>>>>>>>>>?>>>>>>>>>>>>?>Iel@@?>>>>>====@/
	
+																																								

)?=========?ih\>?>>>>>>>>>>>>>>>>>?>>>>>?>>>>>>>>?AfvN?@??>>>===>>=
		
+																																								
5?>>=======M`nN>?>>>>>>>>>>>>>>>?>>>>>>>>>>>>>>>??>Yxa=@??>>=====>?+

+
+
+																																							
+
<>>=====<=D`]aA?>>>>?>>>>>>?>>>>>>??>>>>>>>>>>>?>??Fus?>??>>>>>>=>?7
+

+																																								

!?>>>>>>=<<MdkK>>>>>>>>>>>>==<;<<>?>>?>>>>>>>>>>>>??@f�F>>>>>>>>>>=>=

+
+																																									

)@>>>>>=>=<DfgB>???>>>>>>>>>==64:6+29==>>>>>>>>>>>???TwV>>>>>>>>>>=>?!



+																																									
0?>>>>===><;BD??>>?>>>?>>>>>>>;9;0#$4>>>>>>>?>>>?>???MdbB====>>>>>>>@(

	

+																																									5?>>>=>=>=<<=??>??>>>>>?>>>>=>>;964.7>>>>>>>>>>>??>>?CegA<<;=>>>>>>>@-



																																										9?>>>>>===<<?????????>>?>>>>>>>>=<=:<>>>>>>>>>>>>>????EC9<=>>>>>>>>>@/


+																																									;?>>>>>==<<=???A@>?=???@??????>?AA@@?>>???????>?<>>>??><;<=>>>>>>>>?@/



+																																									
+;??>>>>>===>>?>???@?????>??????LTZWTOA>>???????>??>@@?>=;<==>>>>>>>?@-

																																											
+:??>>>>>==>?>>?>?????????????>BRWZYWSC>???????????>?A>?><;==>>>>>>>?@,

																																											
+9?>>?@?>==??>>???@?@?@???????GHACEEDAJJ>??@??????@?>>>>>=;<=>>>>>>>?A)


																																											
+
8?>>>?>>=>??>>@@@@@?@?>?????AZRA@@@@CW`B???@??????@?>>?>><<=>==>>>>?@$
	

																																											
+
6?>>>>>>>??>>?AA@@??@?????@?L[UEB at ACJ_]UB??????@??????>>>==>>>>>>>??@ 

+

																																											

1@>>>>>>>??>>??@@???@?????@@PYWGCBCFOaVUC?>?>??????>???>>>>?>>>>>????
+

																																										


+@>>>>>>???>>>>>???@@???>>>?KXZJDDHHYf\K=>==>??@????>>>>>?>>>>>>????<
	
																																									
+

$@>>>>>>???>>>>???????@HY_L>@NWMIJLL\hO>FPWQB??@@????>>>>?>=>>>>????8


+																			
+
+																					


?>>>>>>???>>>?>?>?>>>Dco�nH>?HHGFGHLI=Ci�pZ@?@@???>?>>>??=>>>>>>>@6
																				
+																						

=>>?>>>???>>??>?>?>=>EhknhS??>??@@?>=>Idoob`D??????>>?>>>?>>>>?>>>@3

																																											
+
8?>>>>???>>?????>?????Qad`S??????????>M[KPWT@???????>>?>>>>>>>>>?>A.

+																																										
+
2@>?>????>>??>?>?????>>FQS[H>>????????UVB>??>????>?????>>>>>>>>>>>A(
+
+
+
+																																								
+

)A>?>?>>>>?????>???>?>>==BW`I=>?????=MdN>>>>??>??>?????>>>>>>>?>>>@#



																																									

!@>????>>>?????????>???>>>H^bPA>>>>AOfX@>>>???>>????????>>>>>>?>>>?




+
+																	
+
+																					

>>>???>>>?????????????>>>>I[_XMCBMZfXA??>>?????????????>>>>>>??>?<
+
+
+																		
+																						
+
:>=??????>>??>?>???????>>>?IPPTSQPS]D??>>?????????????>>>>>>>??>@9
+
+																																										
+
3@>@???>>?>?>?>>???????>>>?DGGFTYR[Y@????@??????????>??>>>?>>??>@4
+
+
+																																									

(A>????>>?????>>????????>??@@GLLcWbT@@????????????>?????>>>?>??>A-
+
+
+																																								


@?????>??????>>????>????>??@@PU_V^H?@????????????>>????>?????>>A$
	
+
+																	
+																						
+
:@>????????>?>?????????@?????N\R^N??????????????????>?>?????>>??


+																																										
+

/A>>??>????????????????@?????JSJ\A?????????????>??>???>?????>>@9
+
+																		
+																					



!A?>??????????>????????@@?>??BG@@??>?>>>>????????????>??????>>A/
+																			
+																					
+

;@>?????????????????????@?>>>>>>>>>>>>>??????>??????>?????>>>@"
																				
+																						
+/A?>??????????>??????>>=?@>>>>>>>>>>>>>>???>?>>??????????>>>@:
+																			
+																						
+

!A?>>?????????>????????>?@?>>>>>>>>>>>>????>>>>??>??????>>>>A/																				
+																						
+
;@>>?????????>?>?>???????@?>>>>>>>???????>>??>?????????>>>?@!
+																				
+
+																			
+	
.B>>>?????????>??>>?>?????@?>>>>>?????????>??>>????>??>>>>@9																				
+
+																					

@?>???????????????>????>>??>>>>>>???????????????????>>>>?B+

+
+																		
+	
+																				
+5A>?>?????????????>>?>??>>??>>>?????????????????????>>>>@>
+
+
+																
+
+	
+																			
+	

 @@>>>??????????????>>>?>>>??=>????????????????????>>>>?B/
+
+
+																	
+
+																			
+
+	
+
2B?>>>???????????>???>???>?>>?????????????>???????>???@>
+	
+																		
+																							

=A?>>>??????????????????????????>>?????????????>>>???B+
+																	
+
+
+	
+																				
+
)B@>>>?@??????????????>?????????????????@?????>>>>??A9
														
+					
+	
+																					
+
4B??>>?????????????????>?????????????????????>>>>?A?



+										
+
+					
+																			
+	
+

:B?>????????????????????????@???????????????>???AA'



+
+										
+
+
+			
+																					
+
+

>A??>??????????????@@@@@@@@?@?????????????>?>?@A,


+
+
+										
+
+
+
+			
+																		
+	
+

$@A?>???????????????@@???@??????????????>?>??AA-	

+
+
+
+			
+				
+		
+
+		
+
+
+
+												
+			
+
+
+

(AA????????????????@??>?????@??@@@??????>>?AA+



+
+
+
+
+		
+	
+				
+	
+
+
+	
+																
+	
+
+
+

(@A@?>??????>??@@@@??@?@?????????>>>>??>@B>%


+


+
+
+
+
+
+		
+
+		
+
+
+
+
+
+																			
+
+
+
+


%>B@?>>?>???????????@?@???????>>>>>>??AB7

			

+
+
+
+
+
+			
+
+	
+
+
+
+
+
+	
+																
+
+
+
+


8BA@?>>?>????????????????>???????@AB=)




+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+						
+										
+
+
+




+<BA@?????????????????????????@BB>.


+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+											
+			
+
+
+
+
+



+
-<ABA@???????????>??????@@ABA:+

		



+
+
+
+
+
+	
+
+
+
+
+
+	
+			
+						
+			
+
+
+
+
+




(6>ABAA@@@@@@@@@AAAABBB@:0"
		

+			
+
+
+
+

+
+			
+		
+											
+
+
+
+
+



%07;>@@AAAAA@@?>;81( 

+		


+
+
+				
+
+
+	
+	
+
+	
+	
+
+
+
+
+
+
+
+


+


 "$$$%$"!


+
								
+	
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+

+
+
+


















+										
+
+
+
+
+
+
+
+						
+
+
+
+
+

+								
+
+
+
+
+												
+
+
+															
																																																																						 [...]
+		
+



+			
+

+
+

		


+


+

+
+
+
+
+
+
+
+
+
+
+
+
		
+

+	

	


		
+

	
+

				
		
+
+



+

			
+
+	

			

+
#&%&"
+


+
+
+
+					

+

&.145686/"
+	
	
+		
+		
"5<==<;<<<=9+
+	
	
+		
+			

,<>=<<;;:;;<<=2
	
	
+							
+

4>>=<<;;;:;;;<<>4	
										
+			
+

9?===<;;;;;;<;<==>4
	
+
								
+		
+								

$<?>>==;<;;<;:<<<===?5

+

	
+
+		
.>>>>>=<;;;:;:9:<<====?4


		
+	
7?>>>>>;:@B<PLZC@@::=<=>?2
+

+
+%;?>>>>>>?;ktT���fzp?C<===>@1

	
	
+
+		
+	
+

 4?>>=>>>=S�e��o�h�u�q�W;==>>?3


	
+				
	
		
	
'=?>>>>>>>=v���oQUAQNp��m<>>>>>?>1	
	

+
+		
&>>=>>=>??C[|��fD==?=>Cl��UC>>>>>>>?7
	

+		
	
75;>=>>>>??>b���yF=@=>?@=S{z�v@>?>>>>=?7	
		

+
+0A>=>>>=>??Al��wF=????????_��{B???>>>>=?+		
	

+
		

9=>=>>>>???X{^|a<?>=?????>QzswT?>>>>>>>?8	
		

		
+
	

	
;>=>>>??@?I��q}W=???>?????Io}�z@>>>>>>>>>#
+		


+		

	

%?>>>??>?@Gij�z�L??@?>>????Af��h>???>>>>>?4			

						
+
+	

7?>?>=???G{|XOyj??????>>?>?;V|jU:@???>>>>>?%

+	

										
			
+"?>>?;9??@d���g{H>>??>??????>ElgO:??>?>>>>>?:

+		

													

					


+6?>>?<:?>RvS]d}^=????>?>?????=UiO9>@>?>>>>>>?.

+
+
+			
+															



+	
+


+/@>>>?=;>As�yS[yC>????>?>?????>Fh_?<@>>>>?>>>>>'.=

																		

			


+
)?>>>???==_r}i}V>??>>>>>>?>>??>Bop\>>?>>==>>>>>>C.

																					

	

+
+#>>>>>???=M�_ at Hzm???>>>?>>>>>>>>>AritcB>>?<;>>>>>>>


+
+
+																							

+
+
	<>>>>???>CynFDl~E???>?>>?>>>?>>>?>hnbztK=?>>>>>>>>?4
+	
																										
		
+	2?>>>???>?psJCgO>??>>?>>>>>?>>>??=V}ZXszD;>?>>>>>>??!

+
+																										
+

+
+
+&?>>>????>h�MD^rJ>??>>>>>>>>>>>>>>??EzcCJ{r<<>?>>>>>>@4



+																													
		
+	
=>>>>>=>>S�bHZgD=??>>>>>>>>>>>>>>>>?>XSDOg<<>=>>>>>>>
+

																															
	
+	9?>>>>>==<qzNXbA=??>>>>>>>>>>>>>>>>>??>k�eKV�P==>?>>>>>?0



+
																																
		
+	2?>>>>?>?=E|[]fB>???>>>>>>>>>>>>>>>>>??>Cp�YJwo>??>>>>>>>?&
+


+																																
+
+
+	#?=>>>>??>;]sD\H>???>>>>>>>>>>>>>>>>>>>??=AesLWE??>>>>>>>>> 



																																		
+
	
+8?=>>>??>=>v`QY>????>>>>>>>>>>>>>>>>>>>??>=>VaO{P=?>>>>>=>>?:



																																				

+	#@>===>>>><M|TdF?>??>>>>>>>>>>>>>>>>>>>>>?>=><K^ec<?>>>>>==>>@*

+	
																																			

	5?=>==>>>=;ffaV=???>>>>>>>>>>>>>>>>>>>>>?>>>>?=UVrC>?>>>>==>>>:
+
																																						

	
>>>>==>>==DvTdB>???>>>>>>>>>>>>>>>>>>>>>>>>?>>>F]uU<?>>>>>====?#
+
+

+																																							


.?=====>>=<_i[V>??>?>>>>>>>>>>>>>>>>>>>>>>>>>>>?>Ype<>>>>>>====?7
+

+

+																																							

;>>====>==BqYjD???>>>>>>>>?>>>>>>>>>>>>>>>>>>>>?>Lxw?>>>>>>===>>?&


+
																																								

 ?>>======<Lg_`>???>>>?>>>>>>>>>>>>>>>>>>>>>>>>>??BpO>>>>>>===>=?9
+
+
+																																								
.@>>>=====;][kL>??>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>?>f}d??>>>>====>>?!
+
+
+
+																																								
7?>>>>===<?qrj@??>>>>>>>>>>???>>>>?>>>>>=>>>>>>>>?>TxsB??>>>=>>==>?/



																																								
+
<>>>>>===<ApL>?>>>>>>>>>><<=<???>>??>>>>>>>>>>>>>?BdvL=?>>>>>>==>>8


+																																									
+

>>>>>=====;NP???>??>>>>>>>;<=*,9628<>=>>>>>>>>>>>>?>Uh[=>>>>>>>>=>><



+																																									

%?>>>>>>>><;;>??>>>>>>>>>>>>>>4 
'3=>>>>>>?>>>>>>?>T`bB==<>>>>>>>>? 

+

+																																									
+@?>>=>>>><<>@????>>>>>>>>>>>>>6)",28>>>>>>>>>>>>>>??Ef^<<<<=>>>>>>>?%


+
+																																									
/@?>>>>>>=<<???@A?>??>>>>>>>>>>=>;77<>>>>>>=>>>>=>>>??@=9<=>>>>>>>>>@'


+

+																																									
2@?>>>>=>=<>????A?>=??????>??>??>>???>>>>?????>>;>?@???=;<=>=>>>>>>?@'



+																																										
2@?>>>>>==>>>????????????>>????CGHGGC???>??????>???A?>?><;==>>>>>>>?@'


																																												2@>>?>>>==>?>>>>?????????????>?BEEFGD?>?>??>????????>>?>=;<=>>>>>>>?@&

																																												
2?>>?@?>==??>>?@@?@????@@@?@>FRIHGHLNRF>?????????@@>>>>>><<===>>>>>?@#

																																												

1@>>>?>>=>?>>?AA@@@?A@??@???@Zc[SPQW]`V@?ABD@???@?@?>>>>><=>>=>>>>>?? 

																																											
+

.@>>?>>>>?>>??@A@@??@??????AQV]`WSTY\[X[RKFA???@@??????>>=>>>>>>>>??>



																																											
+
*@>>>>>>?>?????@????@???@??DWO^c[Y[]`\R[I??>>???????>??>>>>>>>>>>>??<



																																										
+

%@>>>>>>?>?>?>>>???@@??@==>B`\ffabiefb_eH>==>??@????>>>>>?==>>>>?>>@8
+
																																										

@>>>>>>????>>>????@@?@@IK;;SjjmmlnkmpfM?AU]G??@@????>>>>?>=>>>>>>>@4


+																				
+																					

>>>>>>>????>>?>????>>?Mjze@:DV^_\]ZWP?:PwtiT>?@A???>?>>>??=>>>>>>>@3

																				
+																						

;?>>>>????>>>???>??>>>Zcez]>>=?@@AA?>>AsoYV\A??@>>>>??>>>?>>?>>>>>@/
																																											
+
6@>>>?????>?????>>>??>KafaWB????>>????FfZXTR???>>>>>>??>>??>>>>>>>A*
																																											
+

.@>?>?>?>>>???>>>>>?>>?JODEE?>????????NTCBGA>>????>?>>?>>>?>>>>>>>A&

+
+
																																										

%A>????>>>???????>??>>>===>EE????????ENA;=>>>>>???>??>?>>>>>>>?>>>@!
+


																			
+																					


@>????>>>?????????>???>>>>@EC?????>BG@<=>>??>>>?>>??>>?>>>>>>?>>>?





+
+																		
+																			
+	
+
=?????>>??>????????>>?>>>>=?CB@???@B?>?>>>??>>?????????>>>>>>>?>?<
+
+	
+																	
+																						
+
8?>????>?>>????>??>>>??>>??>=>@?>>?@>?>>>???>??>>?????>>>>>>>??>@8
+
+
+																																							
+		

0A=@???>????>??>??>??>?>>??>>>===ADB>>>>>???????????>?>>>>>?>>>=@2
+
+																																										

%A=????>>??>??>?????????>??@?>><EQRC@??>>?????????>?>>?>>>>?>?>>A(
	
+																				
+																					

??>???>??????>>????>???>>????ABLVQB@??????>????????????>?>???>??

																																											
+
9@??????????>>>????????@?????DJI^H?????????>?????>????>?>???>>@9

+																																										
+
+

.B?????????>???????????@@????BFEXB???????>?>???>??>???>?>???>>A/
+																																									
+


 A?>??????????>???????>?@?????@??>>??>>??????>?>???>????>???>>@#

+
+																																									

<@>>??????>??????????>>?@?>????>>?>>>>>>????>>????>???????>>?<


+
+																		
+																					
+
+
2A>>??????????>>??>???>=@@?>>?>>>>>>>>>?>???>>>>?????????>>>A3
+																					
+																			
+
+

%A??>?????????>>???????>????>>>>>>>>>>????>?????>>????>?>>>>A(
																				
+																					
+

=@?>?????????????>???????@?>>>>>>>??>???>?>?????????>??>>>??

	
+																		
+
+																			
+
+
2B?>>?????????>???>????>>??>>>>>>?????????>???????????>>>>A7
+																		
+
+	
+																					

 A?>>????@??????????????>>>>>=>>????>????????????????>>>>?B)


+
+																		
+	
+																			
+
+
6A?>????????????????????>>>>>>>?????????????????????>>>>@>
+

+
+																			
+																					

 @@>>>??????????????>????>>??>???>??????????????????>>>?B/

+
+
+																		
+																				
+	
+0B?>????????????????????????????>?>???????????????>>>?@>

+
	
+
+																
+	
+																					

;A??>???????????@?????????????????????????????>>>>???B*


+		
+																
+	
+																				
+
$A@??>??????????????????>?????????????????????>>>>??B8


+
+	
+													
+
+	
+																			
+	
+1B??>>????????????????????????????????????????????A>




+
+																
+
+																		
+		

;B?>?????????????????????????????????????????>??A@$
+

+
+
+
+											
+		
+																			
+		
+

"@A??????????????????@@@@??????????????????>?>?AA)


+
+
+	
+
+	
+		
+	
+
+
+					
+																		
+
+
+

*B@?????@???????????@??@?@@?????@?@?????>?>??AA+


+
+
+
+		
+
+						
+
+
+		
+
+																		
+
+
+

0B@??>>???????@@???????>????@?????????>??>?A@)


+
+
+
+
+
+		
+
+
+				
+
+
+
+
+																			
+
+
+


3B@??>???@?>>???@@???@@??????>?????>??>?@B>#


+

+
+
+
+
+			
+
+	
+
+	
+
+
+
+															
+		
+
+
+
+
+


1BA??>???????>>?????@?????>?????>??>??AB7


	

+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+						
+									
+
+
+
+


+AA@???>??????????????????>??>?????AB>+



+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+
+



!;BA@??????????????????????????@AB at 2

	
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+														
+	
+
+
+
+



+
,=BBA?????????>?>??????????@BB?1

+
+


+
+
+	
+
+
+
+
+
+
+
+
+	
+					
+						
+	
+
+
+
+
+


	
+
*9 at BBA@@@????@?@?@@@@AABB at 9+

	
+
					
+
+


+
+		
+		
+			
+			
+
+		
+
+
+
+
+

	

+5<@BBBBBBCBBBBBAA>:4+ 


		

+
+
+
+				
+
+	
+
+
+
+
+			
+
+
+
+
+
+
+

		

$),/11110.-)%!



		
								
+
+
+
+
+
+
+	
+

+	
+
+
+
+
+
+
+
+					





+
+									
+
+
+
+
+
+
+
+						
+
+
+
+
+
+
+												
+
+
+
+
+													
+
+
+															
+
+																																																																																																													 [...]
+
+

+			
+			
+
+




+
+							





+				
+




+
+		


	
	

			
+	
+			
			

				


+
+
+
+
+							


+
	

	
+	
+		
+%))**+13.!
+					

'7<<<<;<<<=:/

	
+						
+			
 5>>==<<;;;;<<=8"
+	
						




+
+
+
+	
+	
+
.=?>==<;;;:;<<<=>;%	
					
+	
+	


7?>=>=<<<;;:;<<====>*
+
	
+				
+
(=?>>===<<<;;;;<<<===>?/

					


2?>=>>>><::;:::9:;<==>>>?/

			

9@==>>?>::HGC]UiFLH89==<=>?-

+	
+
+
+
+		
+	

'<?==>>>>@JI~zo���m�sQT?=<<=>?/
	
+	

+
+
	
+
+

+0?>>=>>>>=j�y��v_w����Q<>=>>>?6
	
+

+
+	
+		
+
	4?>>>=>>>>J����\CC>CGm���]>>>>>>>?;#

				

	
+
+	)*.?=>>==??>N{���[;=?@>>E}��~\>?>>>>>?;"		
	



.G>=>>>=>??>g���e>?@?@?@>Y���yA??>>>>>?7	
	
+

	2=>>>>>=??>Svdz|D>?>@@???Bt~qvI?>>>>>>>?&
+
			

+		


		
4>>>>>=>?>L��Qno>????????>imm�e>>>>>>?>?5
+	
+

	


		
8?>>>>=??Jrv�]�\>@??>>??>=V|��d????>>>>>>!

+		


+				

	

%?>>??>>?IxkJJowC???>?>??=>Axm`]?@??>>>>>?6
			
								

	

+5?>>>>>>Bn�|XZ}J>??????>???=_qTc?@?>>??>>>?'				

											


+	
+

	!>?>?=<==Zx]d^Y=???>>>??@??>EyjnE?@>>>?>>>?9
						
+
														
	
+

+	9?>>?=9<C{sKDqn?????>???>????=dvsb?@>>>>?>>>?/
(


+																	

				

+	7?>>>??99_yeXfI???>>????>>???=Qya]??>>??>>>>=0B;	
+																				
	
+
+	7@>>>???<M�\@Z�X>??>>>>>>>>?>>?>E|`c~_?>?=>?>>>??<

+																					
+

+
+	
1?>>>>??;F{lES�k???>>>>>>>?>?>>>?=f}S]�\=?:>?>>>>>>!

+
+																								
+
	
+
+"?>>>???<?unHPsZA???>>?>>>>?>>>>>?>I�`C`�J;<???>>>>?6

																											

+
+
+	:?>>>??==m|NQhN<???>>>>>>>>>>>>>>>?>bzEDnuA=>??>>>>>?"



+																												
	
+	5?>>??>?>\�`IaI<???>>>>>>>>>>>>>>>>??AseBGum==?>>?>>>?5

+
+
																														
+
+			0@>>>>===?xk[bN<???>>>>>>>>>>>>>>>>>>@=IyXBQ�X>>=>?>>>>?#
+


+
																															
			
+&?>>>>>==;L|LT`>????>>>>>>>>>>>>>>>>>>??<NtXMtu?>??>>>>>>=

+



																																	

+		;>>>>>>>>;il=\N>???>>>>>>>>>>>>>>>>>>>??><InTY�F>??>>>>>>?;


																																		
+
			
+-@=>>=>>><DVN`@>???>>>>>>>>>>>>>>>>>>>>?>>=EbPsQ<??>>>>>>>@2



																																			

+	<>====>>>;XzJjK>????>>>>>>>>>>>>>>>>>>>>??>>=MNZe<>?>>>>=>>>>

+
+
																																					


+	*@==>=>>>=<p`T[>>???>>>>>>>>>>>>>>>>>>>>>>?>>>@ZRxF=>>>>>==>=?.

	

																																					


+:>=>===>==GzReC>???>>>>>>>>>>>>>>>>>>>>>>>??>>>M_sa<>>>>>==>=><
+
+

																																							


+%?>>>=====<_jfV>???>>>>>>>>>>>>>>>>>>>>>?>>>?>>??^js=>>>>>==>>=@/

+


+
+																																							

5?>>=>====Er]lB???>>>>????>>>>>>>>>>>>>>>>>>??>>>Qy~B=>>>>>==>>>>

+


+
+																																							
+
<>>>=====<QokZ>???>>>?>>>>>>>>>>>>>>>>>>>=>>>>>>?Bq�T<>>>>>==>>=?0



+																																								

%@>>======;[qqG>??>>>>>>>>??>?>?>>>>>>>>>>>>>>>>>>>jxd?=>>>>====>><
+

+																																								
/@>>>>====;[_???>>>?>>>>=>???>>>>>>>>>>>=>>>>>>>>=\idI>>>>>>>==>>?$
+

+
																																									
6?>>====>=:I_C???>>>?>>>>><<>=??>>>>>>>=>>>>>>>>>>>OfZU=>>>>>>==>>?0

	
+
																																									
+
;>>>>>=>>=;:????>?>?>>>>>>;;=41.0<=>>>=>=>>>>>>>>>?A`O_@>==>>>>>>>?7

+
+
+																																									
>?>>>>>>><<<?@@???>>>>>>>>>>>5	
!;9<>>>>>>>>>??>>?>Vhe@=<<=>>>>=>><
+


+																																									
 ???>>>>>=<<>???A???>>>>>>>>>>=#+:7=>>=>>>>>>>?>>?>AZP:<<<=>>>>>>>>
+


+																																									
+
$@>>>>>>>=<=>???A??>>>>>>>>>=>><:85:=>>>==>>>>>>=>??>>=<;<>>>=>>>>>??

+
	

+																																									
%@?>>>>>===>?>????>>????@?>>>>???>>>>>>>>>?????>;?@A???><<<==>>>>>>??
+



+																																										

'@?>?>>>===?>>>??@?????????>???@?@A@@???>>?????>??>@>?>><;<=>>>>>>>>? 


																																												
)@>???>>==>@>>??@>?????????????DKPQQLA???????????@?>>>>>=<<===>>>>>??


																																												
*@>?@@>>=>??>>@A@?@????@@???>AQVRQRTVTB>???>?????@@?>>>>>==>=<=>>>>?>

+

																																												

)@>>>>>>>>??>?A@@@@@A??AC@??>NWWVTSUUTO??@ALH????@@@?>>>>==>>>>>>>>?=
+


																																												
&@>??>>>>>?>??@A@???@???ACCBKSQWWWUTQMSPOOMQE?@@@???>>>>>>>>>>>>>>??;



+																																												
"A>>>>>>>>????????>?@???>?=BOJUZYWVUVQNVF??@DFD@????>>?>>>=>>>>>>>?@5



																																											

@>>>>>>>>??>?>????@????>>?RcV\\[Z[XWWTgbECMTIB?????>>>>>?==>>>>>?>@.


+

																																											

?>>>>>>????>>>>???A??@ASXNaxpbce`\^`enrqlb_V????????>>>>?>=>>>>>?>A+




+
+																																									
+
<?>>?>>???>>>>>???@???FjnmXNUYWWVTUUTLMjpWVR?@?@????>>>>??>>>>>>>>A*



																																											
+
8?>?>?>?>?>>???>?????>NfSbjB<>@ACEC@>=DmYQSYC??A@???>?>>>?>>??>>>>A%


																																											
+
3@>>????>>>????>>>????C[QUhO=????>???>RgYSOUB???????>??>>??>>?>>?>@ 


																																											
+

+A>?????>?????>???????>JXXaeF>??????>@ebWOPF?????????>??>>?>>??>>>?



+
+

+																																									

$A>????>>>>???>????????>AEMcdC>?@?@?>XlTD>>>??????>???>?>>>>>>??>?>
+



																			
+																					


@?????>>??????????????>==?I]_E?@@?@ZkO?<=>???????>??????>>>>>>?>?<

+
+																		
+
+																					

=??????????????????????>>>>@NQCAAFOTC=>>>>?>???????????>>>>>>>?>@8


+	
+																	
+
+																					
+
8????????????>????>????>>>?>=?@@AA@=>>>?>??????????????>>>>>>??>A1
	
+																																									
+1A>???????>????????????>>>???>>===>>>>>>>???????>??????>>>??>?>>A(
+
+																																										

&A=????>????>>???????????>?????>>AA???>???>????>??????>>>>????>??

	
+
+																			
+																					


@=>???>>??????>??>??????>>????>AJC??>>>>?>?>??????????>>?????>@9
+
																					
+																					
+
;@>???>???????>??>????@?>>????>BPD>?>>>>?>?????????????>????>>A/
+
																				
+																					
+


1A>??????????>>?????>??????????@IB>?>>>??>??>?>???????>>????>>A$


+
+																																									

+$B?>>???????????????????>???????>??>>>>??>?????>>??????????>>??
+	
+																		
+																						

?@>?????????????>>?????>>>???????>>>=???>??>??????>???????>>@9


+																			
+																					
+
+
7A>>???????>??>>???????>>>??>?>>??>>?????>??>>>>?????????>>?A2
+
+																		
+	
+																			
+	
,B>>?????????>>??>??????>>??>>>>?>>>?????????>?>?????>>??>>?A(
																				
+																					
+

@@??????????>???????????>>?>>=>>>>???>??>???????????>??>>>??



+
+																			
+																			
+
+
7B?>>???????????????????>>>>>>>>>??>??????????????????>>>?A8
+
+																
+
+
+
+																			
+
+

$B?>>????????????????????>>>>>>>?????????????????????>>>>?B*


+
+												
+				
+
+	
+																		
+
+
+7A???????@??????????????>>>>>>>?????????????????????>>>>@>		
+
+																	
+	
+																		
+		


?@>??????????????????????>?>????>??>>?????????????>>>>?B-


+		
+																	
+	
+																				

/B?>????????????@???????????????????????????????????>?A<
	
+	
+																
+	
+																				
+

=A??>??????????????>???????????????????????????>?>>>@A%

	
	
+
+													
+
+
+	
+																			
+

+B?>>??????????????????>???????????????????????>>?>@B2

+		
+											
+		
+																					
+	

:A??????????????????????@??????????????????????>??B:

+
+															
+
+
+
+																	
+
+	
+
#@@????@@????????????????????????????????????????B>

+


+
+										
+				
+
+	
+		
+													
+
+
+
+

/B@????@?????????????@@@??????@???????????????@A@"



+
+
+	
+		
+						
+
+
+	
+	
+										
+		
+		
+
+
+
+
+

6B@>???@@????????????@????@?????????????????@B?$




+
+
+					
+			
+
+
+			
+
+
+								
+							
+	
+

+:B??>????????@@@?????>>??@@????@??????>???@B>"



+
+
+
+
+
+	
+
+
+
+
+	
+
+
+
+
+	
+														
+
+	
+
+
+
+	


:B@?>??????>>>??@@@???@????????????>>>??@B;


+		
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+		
+											
+			
+
+
+
+
+


8B@??>>>>????>>??????@???>???????>?>??AB5


	


+
+
+
+
+		
+
+
+
+
+
+
+
+
+	
+
+																
+
+
+
+


3BA??>>>>???????????????????>>>>???@B>)


+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+						
+	
+	
+
+
+
+



)>B@???>???????????????>>???>???@BA3

+	
+


+
+
+
+
+
+
+
+
+
+	
+
+
+
+													
+		
+
+
+
+


+
2 at BA@????????????>???>?????@ABA7"
+



+			
+
+
+
+
+
+
+
+	
+		
+		
+	
+	
+	
+
+	
+
+
+
+
+


	
2>BBA@?@??????????@@@@AABB>3"

	
+
+
+
+		
+
+

+
+
+		
+	
+	
+		
+		
+
+			
+
+
+
+
+

	
(4<@BBBBBBBBBBBBBBBA?:2'
+	
+		
+

+
+
+				
+
+
+
+	
+		
+			
+
+
+
+
+
+
+

		
 '-25789887530-)#


+


+
							
+
+
+	
+
+
+
+
+
			
+
+
+
+
+
+
+				
+





+														
+
+
+
+
+
+
+
+											
+
+
+
+
+
+									
+
+
+
+
+																	
+
+
+																				
+
+																																																																																																																									 [...]
+
+		
					
+
+	
+
+	
+
+

	
+		



+	
+									
+
+
+

		
	

+	
				
+


	

	

+
+		
	
+				
+		



	
+

			


+
+
+
+
+										
+
+	
	

	
+			









	
+			
 $&+--02. 	

		
+

+		
+		
/8;=====<<=;2!
	
+							
+						
2=?>>=<;;;;<<=>;+

+			
+
+		

,=?>>==<<<;:<<<==>>5

+
				
+

+6?>==>>==<<::<<<====?;#

	
+	


$;?=>>=>=<=<;;:;<<<>=>=?=$

+
+	

+->>>>>>>=<;;>>>A<;;:=>>==?<!



+			
+	

+2?>>>>>><:<SOTun{TeW=;=>=;<?<"

+	

+

+
+

5?>>>>>>=IZT�~{�}�t�|th@===;>><%

+		
+
+
+	
+
+



7?>>>>>>==x�{�nZVGY`����R=>==>>>=&
		
+



		
!7?=>>>?>>@\���pB<>?=>b���iE>>>>>>?<%

	
+
	
+

+
+'K=>=>>>>??=^����G>@@@@?Dz���Y>??>>>>?;
	
		


'>>=>>>>??>Ruoj�T=?@??@@>T�x|f@?>>>>>>?4
		

		

+				
)<=>>>>>?=M�tAa|A????>@@?CzSh�R>>>?>?>>>!	
+			




			
+

(?>>>>>?>Kw|xOb>??>>>??@?lj|�^>?>?>>>>?5

+
+

			
			
7?>>>>>>GxmNPvvC???>>>???>O\bb@@?>?>>>>?$
+
+	
+
+						
+

+	

	!>>>>>>=@nyYNgzH>??>??>????>iiRmF??>??>>>?7

+			
									
+
+		

	3@>>>?=<X�^N`�N=???>>??>???>Iz_p_@?>???>>>?#

+

			

												
+


+
+		

	
(?>>>>?>BzfCJ}[>???>>???>>???=in]{R>>????>>?7			
+

+																

+
+
+	
+
+	+??>>>>=8_xLCqq@??>?>>?>??>???=Q|ZnyJ==???>>>?-4:
+
+																		

+			
+
+	
+@>>>??>;N}YIm�H??>>>>>>>>>?????BxoSrsB;<??>>>?>7@'	
+																					

+	
+		!>>>>???:GiFeyQ>??>>>>>>>>>>>???=Y�^W}d==???>>>>?:
	

+																						
+
	
+
+8?>>???=CzwN^]A>???>>>>>>>>>>>>>??A{sN^�N=??>>>>>>?'
	
																									
+

+
+	
.@>>>??;?p{NXW<>???>>>>>>>>>>>>>>??>N�VFcyE;???>>>>?9
	
+
+																											
+
	
+	
)>>>???>;`�fWX=>???>>>>>>>>>>>>>>>>??=[wLGlu@???>>>>>@'
+


+																													
		
+		$?=>>?>>>C\TmK=???>>>>>>>?>>>>>>>>>>?>>_hJL�`>>>>>>>>><

+
	
+
+
																															
+
			<>>>>>==:X�DId@????>>>>>>>>>>>>>>>>>>??>=Y`Gnu?==>>>>>>?;
+



+
+																															
			
2@>>>>=<=;ql:ZY=?@??>>>>>>>>>>>>>>>>>>??>>>_`^~E>??>>>>>>@6

																																			
+
+		?>>>>>==<D�RKjD>???>>>>>>>>>>>>>>>>>>>>?>>>E_BqU<?>>>>>>>>@$
+

																																			
+

+		
4?=>>=>>=<T�ImP=???>>>>>>>>>>>>>>>>>>>>>??>>>UJ]k<>?>>>=>>>?7

+
																																				

	
?>>>>==>><gwh[>>???>>>>>>>>>>>>>>>>>>>>>>?>>>D_Q~J=>>?>==>>=?
+
	
+
																																				

	
2@=>>====>Aw~jA?????>>>>>>>>>>>>>>>>>>>>>>??>>=W\ph<>>>>>=>>=?6

+	
																																						

	>>>>>=====N�yI>???>>>>?>>>>>>>>>>>>>>>>>>>???>>Cgd}C=>>>>==>==@&
+
+

+																																							


,?=>==>===>h�X>???>>>>??>>>>>>>>>>>>>>>>>>>????>>ZkxM<>>>>===>>?:
+	

+																																							
+
8>>>======@moD>???>>>?>>>>>>>>>>>>>>>>>>>=>>>??>>Eok[<>>>>>==>>=@%
+
+
		
+																																							


>>>=====<<?]T>???>>>>>>>>>>>>?>>>>>>>>>>>>>>>>>>?>k^fB=>>>====>>?5

	
+
+																																							

&?>>==>=>=<<KD???>>>>>>>>=>????>>?>>>>>>>>>?>>>>??=Xa]O<=>>>>==>>>=
+

+
																																									
/@>>>===>>;:>@??>>>>>>>>><;==>??>>>>?>>>=>>>>>>>??=MhR[<=>>>>>==>>@%
+

+	
																																										
6?>>>==>>=;<?@???>>?>>>>>>;7;;2,6>>>>>>>>>>>>>>?>>?Cj^b>>>=>>>>=>>?/


	
																																										
:?>>>>>>><==???@A??>>>>>>>>>=4
,:=<=>=??>>>>??>?>>MiW<>=<=>>>>>>?5



																																										
<?>>>>>=<<==>?>@A??>>>>>>>>=><.
037<>>=>?>>>>>>>??>>B?;==>>>>>>>>?9



+																																									
+
=>>>>>>===>>>>????>?>>>>>>>==><7538=>>>=>>>>>>=<?B@>?>=;<>>>>>=>>>?;
+
+

+																																									
+
>?>>>>>=>>>>>>??@<9@???@??>>>>?>=<=>>>>>>?????>:>@?>?>=<;==>>>>>>>?=	



+																																										
+

?>>?>>=>>>?>>?>@@?>????????????>AB@?@??>?????????>>??>==<<==>>>>>>?=	



+																																											
+ ?????>>>>>@>>???>??????>?????>CNQRQNA???????>????@?>>>>====<<>>>>>?<	


																																												
!@>?@?>>>>??>?AA@??????A@?????LTSPPPSQ?@????>?>??@@@?=>>>===>>>>>>>?;
+



+																																											

!@>>>>>>>??>>?A@@@?@@?@MJ@??>GYRSPNPNUJ????CMA>??@?@>>>>>=>=>>>>>??@7
+



+																																											@??>>>>>>>?>?@A@??@@??GRNFAFSNMRSQSOLSHBBDU^FB@@@??>>>>>>>>=>>>>??A-




+																																												


@>>>>>>>>>???????>?@?ADIA==NVNQRTSSPLS\C>AXZUPD?????>>?>>=>>>>>>???!




																																												

?>>>>??>>>??>>?>>>???BTcTGTaWRUQQURPPTb^CFddRGA?????>>>>?>=>>>>>???




																																										
+
=>>?????>??>>???>?@??>Lopw|gaTUVSURQSgssqjfT????????>>>>?>=>>>>>???




+																				
+																					
+
:?>?????>?>>>?????A???NbWdtsgZSUOQTTQUjoa`aYA?????>??>>>??>>?>>>??=




+
+																		
+																						
+
5@?????>??>>?????@???>W]SXsW=?@ADID@><LmYXXYH??A????>?>>>?>>>>>>>?<



+																																									
+
+
0@>????>>>?????>?????>HXPN_W=???>>>??>VXNNNUF>?@@???>??>>?>>>?>>>?;


	
+
+																																							
+	
)A????>>>>????????????=KSNQbM>??????>D]NLNPL????????>???>??>>??>??:




+

+																																									
#A?????>>??????>>??????>GUWT^F=????>?VVTQJB>????>>??????>>>>>>?>>@7

+



																			
+																					


@??????>??>??>>??>????>>AKT[fN?>>>E\fRC?==??????>???????>>>>>>?>@3

+
+																			
+																					

=??????>????>>?????????>>>@K`qbRM_qfL???>>??????>???????>>>>>>??A-


+
+																		
+																						
+8@??????????>>????>>????>??>@O\`fbR@>???>???????????????>>??>>??A%



+																			
+																					
+
+1A???????????>????>?????????>>>BF@=>????????????????????>???>>??>

+
+																				
+																			
+	

'A?????>??????????>??????>>?>?><<=>???????>????>???????>>?????>@8
	
+
+																			
+																					


@>>???>???????>?????????>>?>>>>>>???>>??>?????????????>>?????>A0


+
+																																								
+

<?>?????????????????????>>>>??>?????>>>>??????????????>>??>?>>A(


																				
+																					
+


3A>???>??????>???????????>>??@?????>?>>>>??????????????>????>>A!



+																																								
+
+
+'B>?????????>?????????????>??@??????>>>???>????????????>????>??

																				
+																					
+

@?>??????????>??>>>???>>>>??@???>?>>=>???>???????>????>???>>@<																				
+																				
+
+
+
9A>???????>??>>?>?>?????>>??>???>?>>>????????>?>??????????>?A6

																					
+																		
+
+
+

,B?>?????????>>>????????>>>>>?>??>>>?????????>????>??>??>??>A,
+
+																	
+
+
+																			
+
+


@@>?????????????????????>>?>?>>?>????>?????????????????>>??A


+
+																		
+
+
+																	
+	
+3B?>?????????????>???????>>>>>>>>???????????????????????>?A9


+																		
+	
+																			
+	

@@>?????????????????????>>>>>>>??????????????????????>?>?B'

	
+
+																		
+	
+																	
+
+	
+4B?>????????????????>????>>>>>>????>??>?????????????>?>?A;
+	
+
+																
+	
+																			
+
+
!A@??????????????????????>>?????????????????????????>>>@B&

	
+																	
+	
+																		
+
+

8B?>????????????????>?????????????????????????????>>?@B5
	
+															
+	
+
+	
+																		
+	

+%B@>????????????????>???????>?????????????????@??>>??B=



																	
+
+	
+																				

9B?>???????????????????>?@?????????????????????>???AA%


+
+															
+
+																					
+	

#A@??????????????????????@?????????????????????>??AB-

+
+
+															
+
+
+	
+																
+	

4B@?>?@@????????????????????????????????????????AC3



+
+																
+	
+
+																
+
+
+

+=B?????@?????????????@@?@??@?????????@?????>?@AC7


+
+
+
+	
+									
+
+	
+
+	
+																
+
+
+
+
+

+#@A?????????????????@@@@??@???????????>>????@AC7



+
+
+
+
+
+				
+	
+			
+
+	
+
+				
+			
+							
+
+
+	


(AA??????????????????????????@???????>>????AC6

		

+
+
+
+
+
+
+	
+	
+
+
+
+		
+
+
+	
+							
+				
+	
+
+	
+
+	

)AA?????????>>>??@@???????@??????????>??@AC3

	


+
+
+
+
+
+
+	
+	
+
+
+
+
+	
+		
+	
+			
+						
+		
+
+
+
+
+

'?A@?????????>>???>???@????????>???>??@BA.

+	



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+								
+				
+
+
+
+

!;B@??>>>?>??????????@@??@????>>????AB<$

+	



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+						
+		
+		
+
+
+
+
+


2 at B@???>>??????????????????>>>??@BA2
		



+
+
+
+
+
+
+
+
+
+
+	
+
+
+												
+
+	
+
+
+
+


+"9BA@?????????????>????>>???@ABB8#

	


+				
+		
+
+
+
+	
+		
+								
+
+
+
+
+
+
+
+

+	
(:BBA@???????????????@@@ABB at 6$

			
+
+

+		

+
+
+		
+
+
+		
+				
+				
+
+
+
+
+

+	
$3=ABBBAAAAAAABBBBBBBA=7,



	
+		
+
+
+					
+
+		
+			
+			
+
+
+
+
+
+
+

+	
!*169;=>>>=<:862.(!



+	

+			
+	
+
+	
+
+
+
+
			
+
+
+
+
+

+	





+
+								
+
+
+
+
+
+
+
												
+
+
+
+
+
+												
+
+
+

+																
+
+
+													
+
+																																																																																																															 [...]
+																																																										



+
+
			
+		
					
+
	

					
+


+			

+
+

		
+
+
+
+
+
+
+
+
+	

	
	
+
+		

+		

				

+
+	
+

+		
+			

+
				
	


+






+								

+

+

+
+
+		
+

+

			
+		

		
+
	

			


	
+

+	
+
+
+
").587662'	
+					


,7<=?>===<=>>9+	
+							
/<??>>=<<<;<<===>7#

				
+					$:?==>===<<:;<<====>=,

			
+
,>?==>=====<:;<<<====>?1

					
2?>>>>>=====:;9<<;====<=?2



+		
+			
+

7?>>>>>><<<;=DDF;=;:<>>==>?2

	
+
+	
+			
8?>>>>>><9=_^g�|VpTC@====<=?1

				
+	


9?>>>?>>;Nba��srftx�y�n?===<>>?/
	
+
	
+
+
!;?>>>>>><H����T@?>@N}���M=>=;>>>>)
					
+
+
+
+

+!H8;>=>>>?><S�u��T>??@?=P���{C>><>>>>=&

		
	
+
D>>=>>>>?=PwrZwa=?@??@?>hr|�X>?>=>>>>;

			

+			
	


;=>=>??>=Jx^Fa�D??>>>?@>N{Lk~G>>;>>>>?3

+								
+	

		
+

8>>>>?><FumRO�d>??>>????@tj}�[>?<=>>>>>"
+		

			




+%?>>>>?>AttMS|pB???>?>???>PchnB?;=?>>>?5
+		

+				
+


	
+

+6?>>>??>g�WMxnA>?>???>????>etYtU>=>?>>>>?"
				
+
+							
+


+		
+

+
>>>>>?>S�ZHitB>>>>>>??>>??>E{^ewF>>??>>>?2
+

		

+										
+

	
+	
+
+
+	9?>>>?>AxmEVK>?>>>>?>>>>>>?=duOwg>>>?>>>?<
+
			
+		
+														




	
+
+
+
+;?>>>>>9`{LJx^>?>>>>>>>>>>?>?>K�RQ�W<:>>>>>?3	
*	

+																
+
			
+
+	
=?>>>>>8N|SPvh???>>>>>?>>>>?>???ruHbI<=>>=>>?5!A<
+
																			
+

+
+	
+		8>>>>??<I}[KmY???>>>>>>>>>>>??>?>N�\Nym=;>?>>>>?><		
+																						


+
+	
+*@>>>?>=CwhEZH<>?>>>>>>>>>>>>>????>d}OV�U<>=??>>>><
+	

+																								

+
+		 =>>>??=?quNQK<???>>>>>>>>>>>>>>>??>Al`BXzJ::<?>>>=?.


																											
	
+
+	
<>>>>>=;^Rie?>?>?>>>>>>>>>>>>>>>???>DjVD^yE?<=>>>>>>

+
+
+																											
+
	
+;?>>??><B�_?hZ=??>>>>>>=>>>>>>>>>>>??>=FbMK~c>?>?>>>>?;


+
																															

+			4?>>>>>><T�J<kI>@?>>>>>>>>>>>>>>>>>>??>>=K`Oip====>>>>>?7

+

+																														
+
				%?>>>>>=<:e�>]d>?@?>>>>>>=>>>>>>>>>>>>??>??`[SxD===>>>>>>@+
																																			
		:?=>>>==<=px^oD>???>>>>>>>>>>>>>>>>>>>???>>MX?rX<?>>>>>>>><
+	
+																																		
+
+			'@==>>=<<<Bs�rF=>??>>>>>>>>>>>>>>>>>=>>>??>>AbG]r=>>>?>>>>=?(
+
+

																																			
+

+	:?=>>>>==<FrsI=>???>>>>>>>>>>>>>>>>>>>>>>?>>>OeL~K<>>>>=>>>>:
+
+
+

	
+																																			

		(@=>>==>==<LcI=????>>>>>>>>>>>>>>>>>>>>>>>>?>>?bYng<>>>>==>>>@-

	
+																																					

	9>>>>====<=QJ=?>>?>>>>>>>>>>>>>>>>>>>>>>>>??>?>Hn_{F=>>>>=>>>>>
+
+
	
+																																						

	"?=>>=====<@K???>?>=>>??>>>>>>>>>>>>>>>>>>>?>???>bboX<>>>>==>>>@1

	

+																																							
+

1?>>========?????>==>>>???>>>>>>>>>>>>>>>>>>>???>Jl\c<>>>>>==>>>=	
+
		
+																																							
+
:>>>====<==:=???>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>???gWmB=>>>>===>>@*

+
	
+
+																																							


>>>>>==>>=<<>????>>>>>===???>?>>>>>>>>>>>>?>>>???=TckN<>>>>=>=>>?7
+

+

+																																								

&@>>>>==>>==>>????>>>>>==;7=>=>=>>>>?>>>>>>>>>>???>DknP<>>>>>>==>>=
+



+																																									

.@>>>==>>==>>>>?A@?>>>>>=<469=;:>>>>>>>=>>>>>>???=>>XhG<>>=>>>>=>>@#
+


																																										
3@>>>=>>==>>>>>?B@?>>>>>>>>;8:5,,89=====??>>>>?>??>>?C<<???>>>>>>>@*



+
																																										
6?>>>>>>=>>>>>?>???>>>>>>>>>>=:3-429<=>>??>>>>>>@A>>><;<>??>>>>>=>@1




																																										
8?>>>>>=>>>>>>>>?>>?>>>>>>>=>><6247<=>>>>=>>>>=;@A>>??=;=>>>>>>>=>?5

+
+																																										
:?>>>>=>>>>>>>>?@88@??????>>??>=;:<=>>>>>>??>?>:=>>>>>=<;=>>>>>>=>?6
+


+
+																																										
<??>>>>>>>?>>>>???????>????????>BCA>???>?>?????>>??>>>>=<==<=>>>>>?5	



+																																											
+
=?@@?>??>>?>>???=??????>???@@>AQTUSQA>?????????>?@@>>>>======>>>>>@3
+


+																																											
+>?@@?>????>>?A@@???????>?????BUUOQOXS????????>>?@?@?>>>>===>>=>?>>A-

+



+																																											
??>>>????>>>?@@@?????ERA>@@@@UVPNOOQ\H?????C@>????@>>>>>>>=>>>>>??> 
+



																																												
???>?????>?>?@@@??@@?FWUD@@@OTJSQOTRSS@?@?AURGA??>?>>>?>>==>>>>>?@6




																																												

>?>????>>???>???>?@?FTgsN<<F[ORVVSVUS\L>??NYWXF?????>>??>==>>?>>?@4





																																											
+
>>>????>>??>>??>>>??BOn�iCE_`WVSTSSUUcgG=?[WHCA?????>>>??>>>>>?>?@4





+																																										
+
<>>?????>??>>??>?>??>=Z��{yufZUSMTTTYoshY\^B?????????>>>?>>>>>???@4





+																																											
8??????????>>????@@>?Cfnlnuzd^WUGNMVXOPktvjR@???????>>>>??>>?>>>?@4





+
+	
+																																							
+
3@?????>??>>???>?@@?>D^Z[apb>?@@DHB>==EghhhaJ>????>>??>>??>>>>>??@5


																				
+																					
+
+

-A???????>???????@???>RWQUbX>@???>?>>>QYRTUXL>?@A??????>>??>>>>>?@6




+
+
+																																							
+	
&A?????>>>??>?????????ATNJL\K>??????>EZKJMRUB??@@?>?????>>?>>>>>?@4






+																																									
 A?????>>??????>>?????>@MQPKSH>????>ATRONPJB????????>???>>>>>??>>A1





																			
+																				
+
@?????>>??????>>????>?>?GKVSWMB>>>FV\PB@?=>?????>???????>>>>>??>A+


+																				
+																					
+=??????>?????>>>?>>>??>>>>@O]Y[RNU\_P????>???>??>>??????>>>>>???@"


+																			
+																						
+7@?????>??????>?>?>>>??>???>GYb]_^ZH>????????>??????????>>?>>>??=



+																			
+																					
+	0A???????????>??????????>???>?M_cYB>????????????????????>???>>?@9
																																									
+	
'B?????????????>????????>>????>CIA>?????????????????????>?????>@6
+																					
+																			
+	

@???????????????????>??>>??>?>===?>??>??>?????????????>>?????>A2


+																			
+																						
<@?????????>>???????????>>>>????????>>>>>?????????????>>?????>A/




+																			
+																					
+
4A?????????>>?>???????>?>>>?????????>?>>>??????????????>????>>A*



+																																								
+
+
(B>??????>??>>>??????>>>?>>??????????>>>?>??????????????????>>A$

+																			
+
+																			
+
+

@?>????????>>>??>????>>>>>??@??????>>>???>??????????????@?>>??

																			
+
+																			
+
+
+
6A>????????>??>???>???>>>?>>????>??>>?????????????????>???>>@:

																					
+																			
+
+
%B????????????>>????????>??>???????>?????????>????????????>?B.


+																		
+																				
+
+

;A???????????>?????????>>>??????>>?????????>??????????????@@


+
+																
+	
+	
+																				
+
,B???????????????>?????>?>>>>>>>>?????????????????????????B4
	
+
+																	
+
+	
+																		
+
+	

A@>????????????????????>?>>>>>>>????????????????????????A@


	
+																	
+
+	
+																	
+		

:A???????@???????????@???>>>>>>>???????????????????????@C/
																			
+	
+																	
+		


,B?????????????????????????????>?@???????>????????????AC9
+
			
+															
+																			
+
+
+

+>A?>????????????@???????????????????????????????????AB> 


+		
+														
+	
+																				


/B?????????????>????????????>>????>??????????????>?AB@'
+	
+

+														
+		
+	
+																	
+	
+

?@?????????????????????>????>???????????????@@?>?AB at .



+
+			
+											
+
+	
+																				
+

-B?????????????????????>??>?????????????????@?>>@A at 2


+
+
+
+																
+
+	
+												
+					

;B?>??@@??????????????????????????????????????@B at 6





+
+											
+
+		
+
+	
+		
+																
+

!@A????????@???????????@@????@????????@??????@BA8


+
+
+
+												
+
+	
+	
+												
+							
+

+B@????>???@@??????@@@@@??????????@???>>??>@BA: 


+	
+
+
+
+
+				
+
+
+				
+	
+
+
+
+
+															
+	

0B@?>???????????@@@????????@@?@?????>?>??@AB; 

+	
+

+
+
+
+
+
+	
+
+	
+					
+
+	
+
+															
+
+
+
+

2B@?????????>>????@????????????@?????>?@AB: 
+	
+


+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+		
+														
+
+
+
+
+
+

0B@???????>>??>??????@@???>??@????>??@BB7

		



+
+
+
+
+
+	
+
+
+
+
+
+			
+
+													
+		
+
+
+
+*@A@?>>????????????>?@@????>????>>?@BB1
	



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+		
+										
+
+
+
+
+


 :BA??>>????@??@?????????????>>?@AC>(

	


+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+									
+		
+
+
+
+
+
	
+-?BA@??????????????????>????@ACA2
+	


+			
+
+
+
+
+
+
+	
+	
+
+												
+
+
+
+

	
2 at BA@?????????????????@@ABC at 3

		
		


+
+
+
+
+		
+
+
+	
+
+										
+
+
+
+
	
-:@BBBBAAAAAAAAAABBBBB?9-

	
+			
+
+
+				
+	
+
+
+			
+			
+
+
+
+
+
+


+
+
&/6:<=?@@@@?><:72,%

+									
+
+		
+	
+
+
+
+			
+
+
+
+
+
+
+	






+													
+		
+
+
+
+
+									
+
+
+
+
+
+
+								
+
+
+
+
+																	
+
+
+																		
+
+																																																																																																														 [...]
+
+
+
					
				

+
+
+						
+
+
+		


+

+
+	

	
+	
+	
+
+
+			
+

+
+	


+
			

+
+	
+
+

+

			
+	
+
+
			
+	
+

				
+


+			
	




		
+

+	
+	


	

+
+		
+


+	
+	

+



+		
+



+
+	
+				
+
+
+
+
+
	
+
!!

	
+			

")06:==<<92%

+
							)6<=>>===<<=>?>6"


+
+	
+	
+		
+&9??>>===<<<<<===>=,	


+
+	
+		
/>?==>====<;<<<====>>3

	
+		

7?>>>>===>=<;;<<<>>===?7


		
+		
!;?=>>>>===<;999;<;=>====?9 

		
+
+		
+

#=?>>>>>=;<@CNXTPAE<8<>>===>;!


	
+			
+
+

%=?>>>>>=;?Ks}z{yvZK@=>>>>=?8




+
	
+	
)>?>>>>><?]yz�vVMMYu��c==>==>=?4

+	
+

+
+
+:3/>>=>>>>=Kqts�mD=>>=Cj��}[=>><>>>?/
	

		
+
+
+
+
+	
EC>>>>>>>=M{kTptC>????>F{n}K>?==>>>>)

+		


	
0==>>>>>=DrdJ]�N>?>>???>]zPoo@>>=>>>>< 
+
+					
+
+
+		
+	
+

->=>>>>>@hfKV�e?????????Cxjs�U=>>>>>>?3	
+	

+	



+;>=>>?>?hsK\�b@??>??????>MkitD>=>>>>>>#		
+	


+		
+



	

	%?>>>??=^�XV}X>>?>>???????>\}Rta>;<?>>>?4
+			
+
+						

			

	6?>>>?>K�`Fq`=?>>>?>???>???Avb[~J=:=?>>><
	
+			

+								
+

		
			
+
+	2?>>>>>?sqJeuB>>>>>>>?>?>>??=_|Our@<;>>>>?(
+
	
+				

												
+
					
+		7@>>>>>=]vI\yL>?>>>>>>?>>>>>?>I�MM�a==?>>=>:

+
	
															
+
		
+		6@>>>>><OvMTmN=?>>>>>>>?>>>>>??>koD_�K=??>==?=).=
+

+																	
+

+	
	
+
+	
+*?>>>??=IwTEXC=??>>>>>>>>>>>>>>?>G}bFvq><>?>>>>?9B-
+
+																				
+

+		
+		
+
+<>>>=>>Cu[ESB=>?>>>>>>>>>>>>>>>??=OuUT�Y:>>>?>>>?:
	
																							
+

+
+6?>>>>>=muO^X=>?>>>>>>>>>>>>>>?>??>=PiO^|L=::??>>=?%
+	
+
																									
+
+
+	6?=>>=>=S�LNpJ>??>>>>>>>>>>>>>>>>??>>=VbK`yE>;;?>>>?<


+																										

+
+	2@>>>><><px;Sj???>>>>>>>>>>>>>>>>>>??>?AaOP{e=?:;?>>>?9

+
																													
+
	
+
+&?>>>>>>=?pGxP=??>=>>>>>>>>>>>>>>>>>?>?=SfPdq=>>:=?>>=@0
+
+																													
+
+	
+	<>>>>>==;C|zx^=>??>>>>>=>>=>>>>>>>>>>?>>?EeMOzD<===>>>>>>



+																																
+
		
/@=>>>>>=;Cr|X>>???>>>>>>>>>>>>>>>>>>>??>>>]U at vX;>>=>>>>>?1

+
+																																
		>>>>>====<@WK<>???>>>>>>>>>>>>>>>>>>>>>??>>HlC_q=>>>>>>>=>=	
																																			
+

+	
2?=>>>=<==<<?<>>>?>>>>>>>>>>>>>>>>>>>>>>??>?>\eK~H<>>>>>>>>?3		
+																																		
+

+	
==>>=>>=<=<:=?>>>>>>>>>>>>>>>?>>>>>>>>>>>??>>@k]s`;>>>>=>>>>@$
+	

+																																					

	
1?>>>>>>=<=<<???>>>>>>>>>>>>>>>>>>>>>>>>>>????>Iq`tA=>>>>=>>>?9			
+																																						

	=>>>======><>>?>>>=>=>?>>>>>>>>>>>>>>>>>>>>>???=bcsS<=>>>>=>>>?%
+	
+
	
+																																						
+
	'@>>>=====>>>>>???>>>>>??>>>>>>>>>>>>>>>>>>>>???>Jmib<=>>>>==>=?7
+
+

+
+																																						
+

3?>>=====>=>>>>??>>>>>==>??>>>>>>>>>>>>>>>>>>>????evj<>=>>>===>>?
	
+
		
																																							

;>>>===>===>>>>>?>>?>>>>=>?>>>>>?>>>>>>>?>>>=>>??>N}h>>>>>>===>>@,

+

+
+
+																																								


?>>>===>==>>>=<?A???>>=>=<>>===>?>>?>=>>>>?>>>???=<US<=>>=>===>>?6
+


+
+																																									

$?>>>==>>=>>>>>>@B?>>>>>>=937==>==>>>>===>>>>>>>>><<>=:=>>>>>>==>><
+



+																																									

*@>>>=>==>>>>>>>???>>>>>>>=42;:>9<>===<<>>>>>>>?A???>;;>>??=>>>=>>?
	

	
																																										

.@>>>>>>>>>>>>>>>???>>>>>>>>>;:94078;==>>>>>>>>?A?>>>>;<??>=>>>>=>?#	

	
																																										
2@>>>>>>>>>>>>>>?=>?>>>>>>>>>=<6305<==>>>>>>>>>>>>>>>>=;==>>=>>>>>@'	

+	
+																																										
6?>>>>>>>>>>>>>?@67@???@?>>???>=87<==>>>>>>????;;?>>>>=<<===>>>>>>@(
+
+
+
+
+
+																																										
8???>>>>>>??>>>>??????>??????@?@EFD@??>????????>???>>>>=<==<=>>>>>@$
+
+

+
																																													
:?@@?>??>>?>>???>?????????@??>JYXWX[L>>???????????@>>>>>==>>>>>>>??
	
+

+

+																																												;?@@?????>>>?@@@?????>>???@?@E\TLLLT\C?@@@??????????>=>>>==>>>>>>@3
+


+

+																																											
+<?>??????>>>?@@@?????GH>??@@@VYPMMLM]K?@@???????????>==>>>=>>>>>??"	
+


+
																																												
=????????>????@?????DZXI??@?H^VRPNPP]M@@@??@FD@??>>>>>>>>>=>>>>>?@



+
																																												
+
=???????>???>??>?@??R_hcD=>AZ_]VTSTY`ZB@@?>CIJA???>?>>??>>>=>?>??A#


+
+

+																																										
+<?>????>???>>??>????FJLRL=<Opca\WUW]chN>>>>???@???>?>>???>?>>>???A'


+


+																																										
+9?>????????>>??>??>>>>GZdSSbqc[YUXX[^fI>>=>@@?????>?>>>?>>>>>>???A-	




+
+																																										5@????????>>>?>?>??>>Gdo}vkWJZ]XPPSX\J=@HJJUF????????>>>>?>>>>>??@2




+		
+																
+																							
0A?????>??>??>>>?@??>MgbirqJ=>ACFFB@>>>Jfle\I??????>?>>>>??>?>>??@4




+																																											

*A???????>>??????@???C[VUZgL>?>>>>><<=FXV^fbN>??@??????>>??>?>>??@3





+
+
																																									

$A?????>>>???????????>JZPNPYF>??>>??=@UNPQTXF??@A???>???>>?>>?>>?A0



+



																																									

A?????>>?????????????>ITVTTXG=>???>?U[TQSRG?????????????>>>>?>>?A)






+																																								
+
???????>??????>>>??>?>=@EENWZOA>>>BUcSA??>>?>???????????>>>>??>>A!



+																				
+																				
+
+<@?????>?????>>>>?????>>>>>GV]\MGPW^L>???>???>??>>??????>>>>>????


+																																									
+
+7A?????>??>????>??????>????>DT^VXW]J>????????>??>>??????>>?>>???=


																			
+																							0A?@???????????>??????>?????>>TXO]J=????????????????????>???????=

																																											
(B???????????????????????>????A[ZZB?????????????????????>???????=

+																																								
+	
A??????????>?>??????????>?????GHC?????>??????????????????????>@<


+																			
+
+																			
+	
>@??????????>????????>??>???>>===?????>>??????????>??>>??????>@:



+																																										
5A>?????????>???????>?>???????????????>>??????????????>????@>>A6



+																		
+																					
+
+'B??????????>???????>?>>??>>??????>?>?>>??????????????????@??>B-


+																				
+																		
+	
+>@?????????>>???>????>>>?>??@?>??>??>>?????????????????????>?A 

																																											
3B???????????>>?>?????>>>?>>???>?>??>?????????????????????>?A:
																					
+																	
+
+	
+
'B??????????>?>>???????????>>??????>????????????????????????B(


																		
+
+
+																			
+	

@@????????????>????>???>?>?>?????????????????????????????@B;



+																		
+																					

:A??????@????????????????>?>>>>>>???????>???????????????@AB$

	
+
+																	
+
+
+																	
+	


1B??????????????????????>>>>>>>>>>??????>>?????????????@AB2
+																		
+
+	
+																			
+
+#A@>?@?????????????????????>>>>?>>????????????????????@AA7
																			
+	
+																				

+:A???@????????>??@???????????????@?????????????????>?A at 6
		
+																	
+																			
+	


)B@>????????????????????????????????????????????@???A at 5

+

+
+															
+	
+																
+
+	
+
+;A?>??????????????????????????????????????????@@??@B8!
+

+

+
+
+															
+	
+																			

+&B@?>????????????????????@???????????????????@@?>@B<$



+
+	
+													
+
+	
+
+																			

6B?>????????????????????@?>????????????????@??>?B@*	


+
+		
+													
+
+																			
+
+
>A?????????????????????>????????@??????@??????BB1


+	
+
+		
+	
+						
+			
+	
+		
+	
+														


'B@?>>????????????@?????????????????@@???????AC6


+

+
+
+		
+
+
+
+					
+
+			
+
+
+
+
+																

1B@?>?????@@@?????@@@@A@@???????@?@@???????AC8
+

+
+
+
+
+
+	
+
+
+
+					
+		
+
+																
+
+	

5B@?>???????????@@@?????>??@@?@@????????@AC8 
		
+
+
+
+
+
+	
+
+
+
+
+			
+
+
+	
+
+																
+
+	
5B@?????????>>?>?????@?>??????????????@BC7

+	



+
+
+
+
+
+
+
+
+
+
+			
+
+		
+
+										
+				
+
+
+
+3B@????????>???>???@?@???????@???>>?@BB4		


+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+	
+
+										
+
+
+
+
+
+-AA@?>>?????????>>?>??????>>????>?@B at 0
			



+
+
+
+
+
+
+
+
+
+
+	
+
+		
+													
+
+
+
+


$=BA???>?>?@@@@@????????>?>>????AB?*

		


+
+
+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+


+1 at B@???>???????????????>>??@ABB8 


	


+
+
+
+
+
+
+
+
+
	
+	
+
+				
+				
+		
+
+
+
+


5ABA@?????????????????@@ABC<)


+	
	
+


+
+
+

+
+
+
+											
+
+
+
+
+
+
	0<ABBBBAAA@@AAAAABBBCB?7(

+			
+
+
+				
+		
+								
+
+
+
+
+
+




*28;>?@AAAA@?=;83-$

+									
+		
+
+	
+
+
+
			
+
+
+
+
+
+			
+






+										
+
+
+
+
+
+	
+
+							
+
+	
+
+
+
									
+
+
+
+
+
+															
+
+
+																
+
+																																																		
+
+																													
+																																																																																																																																																																																								 [...]
+

+	
+

							
+
+
+
+
+
+
+		
+




	


		
+	
+
+			
	
+	
+
+				
+	

		
	
+
+				

+
		

	
	

+


				
+		




+	
+				
+		
+
+			
+
		




	
+
+	

	





	
					


&/122-%
+
+
	
+
+	
$3=?>>>>>><8/




+	
					!3<>?>==<=<<==>>;(



+					
+0=?>>=<==<==<<===>>0
+



+	
+		
#:?>>=>=====<<<<==>==?5
	

		
+
+
+
*>>>>>>==>=<;:;==<>>>=>?9#

	
+
+	
+

,?>>>>>>==<=?==;;<;=>>>==?<&


+	
+
+
0?>>>>>>;:?Sflrrh[N=9<>>>>=><%



+	
+
+


+2@>>>>?=<HZj~�yrt�yjXA=>>>>=?: 
+
+
	
+

+
+()6?>>>>>=Ejymm�aE@@Hhs|oE=>>>>>?8
		
		


+			
+
+	>I=>==>>>=GwoVd�Z>>>?>@e�fvoA>>>>>>?7
		
	

			
+
+
+	
,>>=>>>>>@mkMY�`>??????BvtRy_=?>>>>>?1		
+		
+
+			
!==>>>??=YiSd�d????????>I|lczJ>>>>>>>>$
+		

		


3?=>>>??_rQm}S>>????????>K~njoB>>>>>>?7
			

		
+
		
+
=>=>>?>W�SaqD=?>?????????=S}Vza>>>>>=>>"
+		


+				





+
	
,?>>>?>F}aHqH=??>>?>??>>????og\�L=>>>>>?-	
+		
+

+							
+


+
+
	-?>>>>?>imJs`>???>>?>???>>??=YvKrvA>>>>>?7

	
+		

+										
+

	
+
+	1@>>>>?=UxMgf???>>>?>??>?>>??>H|NQ�`=>>?>>>-

+		

+														

		
+
+
+
+@>>>>?=MsQT^@>??>>>?>>>>?>>>??>jrDe�G=>??>>?8
,																	

				
+
+<>>>>?=JxZNX@>>???>>>>>>>>>>>>?>CpaExm==??>>>?>-<B


																			

		
+
+	
0?>=>>>Cy_SkP=>????>>>>>>>>>>>>??=Dg[W�W:<>>>>>>?<
+
																						

+			
+	,>=>>>><f~MQmD>???>>>>>>>>>>>>>>??>>CaKTxK<=??>>>==
	


+																								
	
+
+
->=>>>>=C�h=h\=???>>>=>>=>>>>>>?>??>>=VWKcwB????>==?:


+
																									
+


+%>=>>==><K�igsA>??>>>>>>>>>>>>>>>>>?>>>IkQG{b=?>=>>=>?4
	

+																												

+
+	<>>>><==:K��uG=>>>>>>>>>>>>>>>>>>>>??>??fP=ct>>><:>>>=?$

+
																													
	
+
+3@>>>><><;DgaB=???>>>>>>>>=>>>>>>>>=>??>>QfAP}D=>>=>>>>?7

	
																													
+
+			!?=>>>><<<<>B<=>>??>>>>>>>>>>>>==>>>>>??>>@lNC�R;<==>>>>=?#



																																
+
		7>=>>>>=;==;;=>>>?>>>>>>>>>>>>>=>>>>>>>?>?>PsFvg<=>==>>>>?8
+	
																																			

+	'?=>>>===:===>>>>>>>>>>>>>>>>>>>>>>=>>>>????>_vqz@=>>=>>>>>@+
		
																																		
+

+:>=>>>==<8>=>>?>>>>>>>>>>>>>>>>>>>>>>>>>>?????g��M<>>=>>=>>?=		
+																																			
+

+&@>>>>>?><:>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>????Ap�^<=??>>==>>@/
	

+																																						

+7?>>>>====:>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>???=M�tC=>?>>>=>>>=	


+																																						

>>>>====>>:>>>>??>>>>>??>>>>>>>>>>>>>>>>>>>>?>>?@l}J==>>>>==>>@,
+
+
+	
+																																						
+
	(@>>===>==><<?>>?>=>?>>>>>>>>>>>>>>>>>>>>>>>=>>>>>RoE<>=>>>==>>>9		


+																																						
+

3?>>==>>=>>>;=?>????>>>>==>>???>>>>>>>>>>>>>>>>>>>BK<<><<>>===>>>
	

+
																																								

:>>>==>>>>>>=<>>A@>?>>=>>>>>===>>?>>>>>===>>?>>>>><98<>;9=>===>>@(		
+
+	
																																									

=>>>==>=>>>>>>>>@?>>>>>>=:06=====>>>==>;=>>>>>A???=>;<=<<=>>>=>>?0
	
+

+
+																																									


?>>>>>>>>>>>>>>>>>>>?>>>><02=<=>=>===<;=>>>>>>@A>?>>=<>>?>=>>>>>?6	


+																																									

%@>>>>>>>>>>>>>>>??>>>>>>>>?><:;3(,:<===>=>>>>>??>>>>>==?>>=>>>>>>:


+																																									
*@>>>>>>>>>>>>>>@<<>?>>>>>>=>==71.1;====>>==>>><<>>>>>=<=====>>>>>;
	
	
+																																								
/@>>>>>?>>>>>>>?A68??????>>>>>><87<===>>>>>????76@>>>>====<==>>?>@:
	
+
+																																											
3@??>>?>?>??>>>>:>???????????@?AFGE@??>??>????>>???>>>>===>>>>>>>@3	
+	

+																																											
5@@@???>>>?>>??>7>??>????@@?>@R[WVWYQ@??????>???????=>>>>=>>>>>>?;!
+	
+	

+
+																																											7@@@?????>>>?@A@?????????@@@?H]QJKJQ]H??@@??????????>>>>?=>>>>?>@5
+	
	

+
+																																										
+9@???????>>>?@@@?????A???@?@AQaRNMOVcND?@@??????>???>>>>>>>>>>>>?9

+	
+	

+																																											
+;?>????>?>????@???@?FQE???@@FVdYTRVb`MU?@@???A????>>>?>>>>>>>>>??>

+
+

+																																												
;?????>????????>??>?NRI>>>>ALbh`ZY_ggSVB@??>>?@?@?>?>>??>>>>>????A


		

+
+																																									
+9@?????????>???>?@>?CA>=>><AYkkd_[bkqeRA??>>??@???>?>>?>>>>>>????A*

	


+																																									
+7@?????????>?????????@@DE?>=Qjhd^_`gnhJ??AGG@?@@?????>>>>>>?>>???@2
+


+

+
+	
+																																								4A????????>????>???>?BMVXI=<>Td]X[X]`P@>FXhiK?????>??>>????>?>>??@5


+
+

+	
+																																						
+	
/A????????>?????????>L^\klN=>=CGLMGEC??ASZ[cR?????>??>????>??>>>?@4


	
+
+
+
+																																								
*A??????>>>????>?A??>J]Wbf_C>>=====<;=@U[c`YK???????????>?????>>?A1
+

	

+
+

+																																								

#A????>>>>?????>@@>??@Q\TQPRA>?>>>>>=<QVUZ^^F???@???????>>>???>>>A*	





																																								
+

A?????>>>???????>>>?>?P\ZSXV@>????><Nh\TWUJ????A??>?????>>>>???>A#	


+


+																																									
???????>>>????>>?>???>=@BCJ]]F>>?>=RiRC>?>=??????>??>???>>>????>A
	


+
+																			
+																				
+
+<@?????>???>?>>>?????>>>??>@RcWDACXaF>??????????>>??????>>>?>???A!
+

+
																		
+																					
+
+8A???????????>?>???>????????>Fb\U\^C????????????>>?>?????>?????>A%



																																									
+
+4A????????????>>???>?????????=JUHXC>????????????>???????>>?????>A%



+																																								
+
+
-B??@?????????>?>???????>????>EYM[N?????????????????????>?????>?A#



+																																								
+	
"B????????????>????????????>??FYUQL???????????????????????????>?A


+

+																																								
+	
>@??????????>???????????????>?LGDA???????>?????????????????>?>??
	

+																																										

4B???>??????>>??>????>???????>@?>??????>????????>?????>??????>A9


+																				
+																			
+

'B???>??????>??>>?>>???????>??>>??>??>>>???????????????????>>?B-
+
																																							
+	
+
A@????????????????>???>???>>?>>??>??>>??????????????????@???@@



																					
+																	
+	
+
?@???????????>>?>>????>>???>>>?>?>>?>>>??????>???????????>?@C2


+																				
+																	
+
+	

<A????>???????>>>??????>???>>??>>???>???????????????????>?@B>
+
+																		
+
+																	
+		

7B?????????????>>?????>>>??>>?>??????????????????????????@A?'
	

+															
+		
+	
+																			
+
.B?????????????????????>???>?>>????????????????????????>@A<,
	
+																
+
+
+																			
+
+!A@??@?????????????????????>>>=>>>>?????????????????????A?.	
+																
+
+																			
+	

+;A????????????????????????>>>>>?>>?????????????????@?>@B6
+
+
+														
+	
+																			


+-B@>???????????????????????>??????@??????????@????????A?+
	
+
+
+														
+
+	
+																		
+
	>A???@????????????????>>????>???????????????????@???@A9
		

+
+
+														
+	
+																	
+	


+*B@>??????????????????????@?>??????????????????@??>?A?/




+
+
+
+														
+	
+
+																	
+
	8B??>?@@????????????@???@@?????????????@?????@@???AA:"



+
+
+
+
+												
+	
+
+																		


@A?????@???????????????????????????????????@????@B?-




+
+
+
+
+
+
+								
+		
+
+					
+													

+
+)B@??????????????????????????????@?@???????????@BA4
	
+
+
+
+
+
+
+
+
+			
+					
+	
+
+
+	
+			
+											

+2C@?>?????????????@???????????@????????>?????@AA8
	
+
+
+
+
+
+
+
+
+			
+
+					
+
+
+																	
+

7C@??????@@??????@@@@@A@??@@?????@@@???????@BB9"
		

+
+
+
+
+
+
+
+
+
+
+		
+			
+
+																	
+	
+
8B@?>??????????@@@???@@???@@@@@?@???@???@ABA8!
	
+

+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+	
+
+																	
+
+

8B@????@???>>>>>??>??@????????@@??????@BC?2




+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+										
+
+
+		
+
+
+
+4BA????????>>>>>>?@@???????@?@??????ACB9&

+	




+
+
+
+
+
+
+
+
+
+	
+	
+
+
+		
+											
+
+
+
+
+.AA@?????????????????@????>>?????@BC<)

+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+														
+
+
+


#<B@??????????@@???@???>??????@AB@/



+
+

+
+
+
+
+
+
+
+
+
+
+
+
+		
+													
+
+
+
+


+1 at BA??????????????????????@ABB9"


	
+

+
+
+
+
+
+
+
+
+
+	
+												
+	
+
+
+
+
+


5ABA@????????????????@@ABC=,


	
+
+		
+


+
+
		
+	
+												
+
+
+
+
+
	0<ABBBAAAA@@@AAAABBCC at 9,


+						
+
+				
+											
+
+	
+
+
+


+
*28<>@AAAAAA@>;71(

+
+					
+					
+
+	

+		
+
+
+
+
+
+			






											
+
+		
+
+
+
+
+						
+
+
+
+
+
+
+						
+
+
+
+
+
+															
+
+
+
+													
+
+																
+																																																																																																																																	 [...]
+
+			
+					

				
+





+			
+
+
+	






+	
+



	
	
+			
	
			
+
	


		
		
				
+		
				
+

							
+
+



		

+			
+	
+
+
+
	

	
		


	
+	
+

	
%3897/	
	


+				


4?>>==>?7*



							
+
-<>==<=<<=>?=5#



+	
+	
+		
,<?>=<====<<=>>>=-


	
+
+			+<??>==<<====<====>?3
+

		
+
+6?>>>>===<<<==<<==>=>?7
+
+
	
+
+

9?>>>>>==<;;:::<<<>>>>>?;%
+

+
+


 <?>>>>>=;<DU\`ZQF=:<>>>>>?=&	
		
+



$=?>>>?=;@Naou{{}tdM=;>>>>>>=&

+		


)>>>>>>=?]vo_z�kact�qnqS=>>>>>>>(
	

		
+	6K;>>=>>>>Alv[WzyN>==B^�pg}Z=>?>>>>>'

			


			
+					
+
+	
&B>>=>>>>>fnO]�sF=>???>X�c\{M=>>>>=><!
+
+			
+

+				

8>>>>>?=GiXq�a@>??????>S}fdj@>>>>>=>7
+	
		
+
	&?=>>??>]jgufG=>????????=K|lj]??>>>==?(
			

+

	
+

+
5?=>>?>S|\qP<>??>?????>??=M|\|W=?>>==?5					

				
+



+
+$>>>>?>CwVW]<??>>??????>???=i_]}H>?>>>>;	
+		


+					
+



+

+
'>>>>??=bgDjG>??>>??????>>>?>XhFvp???>>>>#

						
											

	

+
)?>>>>?<TqG^S=??>>>?>>???>>>??I}YU�S=?>>>>;#
				

+
+												

			
+
+	
>?>>>>=QtKP`?>>?>>>?>>>>>>>>>?>cvNkw@>?>>>??3
	
															

		
+
+	
2@>>>>=K|RKjM>>??>>>>>>>>>>>>>?>?`eQ}`<>?>>>>?:%-?

+	

+																	
+
		
+		">=>?>>@zh@^j?>???>>>>>>>>>>>>?>>>?`QVzT<???>>>>?A5
+
+																				

		
+	
+#===>>?<U�TFxN=????>>>>>>>>>>>>??>>=M`HTyI=??>>>>>=	
																							

			
+	!=>>>>=>;c�o�a=>??>>>>>>>>>>>>>????>>CjVDfs?>>>>>>>?6

+																								

+
+;==>>>==;X��_>>>>>>>>>>>>>>>>>>????>>=ae at H�W<>>>>>>>@*
	
																											
	
+3>>>>>>>=;EWH<>?>?>>>>>>>>>>>>>>>>>??>>IvD?un<>>=;>>>>;
+	

+																												
+
	
+	%?=>>>>>==<<;:=>>??>>>>>>>>>=>>>>>=>??>>=bk>p>==<<>>>=?+

+

+

+																														
		
+:=>>>>=====<====>>>>>>>>>>>>>>>>>>>>>??>>Cyfo�C<=?>>>>>><
	
+																																	
+
	
+-?>>>>=<<<<>=>>>>>>=>>>>>>>>>>>>>>>>>>>?>?=L��I;=>>>>>>>?2

+																															
+
		>>=>>>==<<=>>>>>>>=>>>>>>>>>>>?>>>>>>>>??>>=K{�R<==>=>=>>>?!
+
+
+
+
+																																



2?=>>>==>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>?>>><FiX>===<>==>>?7
+		

+																																			
+

+>>>>>>?>>>>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><ER?==>>>>==>>?"	
+
+
+																																				
+

+	-@>>>=>=>>>>>>>>?>=>>=>>>>>>>>>>>>>>>>>>>>>>>>>>=IC<=?@>>==>>?6

																																							

+9?>>>==>>>=>>>>>>=>>>>?>>>>>>>>>>>>>>>>>>=>>>>>?=BD;==>=>==>>>>

	
+																																						
+
?>>>====>>=<=>>??>>>>>>?>?>>>>>>>>>>>>>>===>>>>?>><:===>=>==>>?+
+
+	
+
+																																						
+
	'@>>==>>>>>>=>>>?B>?>>>===>>>>>?>>>>>>>>>>>>>>>>??>9:=>::=>==>>?6
+
+
+
+																																							
+

0@>>==>=>>>=>>>>?@>>>>=>=>>=====>>>>>>==<=>>>@@>?>>====89>>>>>>><	
+	
																																									

6?>>>>==>>>>>>>>>>>>>>==>=<=====>=>>===;<=>>>@A>>?>>==<<==>>>>>>>
	
+
+	
																																									
+
;>>>>>>>>>>>>>>>>>>>>>>>==:<===>=>>===;<>>>>>=>>>>>>>?>>>>>>>>>>?"			
+
+
+																																									
+
>>>>>>>>>>>?>>>>??==>>>>>>>>=;=2".:;<=<=>>>>=:>?>>=>>??>>===>>>>?$		


+																																									
+"@>>>>>>>>>>>>>?@:;<>>>>>>=>>><9/%&7===>>>>>>>=99?>>>>>>==<==>?>>?#		


+																																									
(@>>>>>?>>>?>>>?B8:??????>>>>>><67:==>>>>>>????73?>>>>>>>====>>>?:

+
	
+
+																																										
+
,A??>>?>>>>?>>>=,:?>?>>????????AFHE@>?>??>???????>>>>>>>>>>>=>>>>)
+

+
+	
+																																										
0A@@????>??>??@95@??>?>????>@UZUVUWUB>????>>??????>>>>>>>>>>>?>?
	
+


+
+	
+																																									
3A at A??>?>>>>?@@@=?>??????@??@HbZSSR[gMA???@?????????>>>??>>>>>?>A'
+
+	


+																																												6@?@???>?>>>?@@@@?>????>>@??LQX`^^_^RSS>?@@?????>??>>>>>>>>>>>>>@6
			
+
																																												7@>>??>???????@?????A@>?>?@@^UMZ[WZTCUbA@????@@???>>=>?>>>>>>?>???
+

+

+																																												
7@????>???>?>???????@?>?>?=BcPPZVRTMBReG@?????@???>?>>????>?>?>?>A'

		

+
+
+																																									7@??????>>?>????@??@???BB=9B[V^^ZWUPKZcF>?????@@??>>?>??>>>>>>>??@0
+
+
	
+
+
+																																										6@???????>?>??>>?>???@Gd]G>?Ulph`\YZ]g_@>@EB???A??????>>??>?>?>??@4

+
	


+	
+																																						
+
+3A????????>>>?>?>??>?A\pn^G=Ebng_VZ`a\L=I_aYE??@???>?>>??????????@5

+
+	

+
+
+																																						
+	
/A?????>>>>?>??????>?C[^]^R@=BKMNHHJIB>CfjbeT??>>??>>?>????>?>?>>@2

+
+


+
+
+																																								
)A?????>>>>???>>?@???FWU[f^A><<=>@?=<<>M[XYcN>????>>>?>>>????????A+	



+
+

+																																								

#A?????>>>????>?@@???BT^_\\P??>?>>?>=<E[[^ZSB???????????>>>???>??A&	






+																																					
+	


A?????>>>????>?@>???>AT_\XfU??????>=DVUUYSD>???@??>>????>>>>????A(	

	


+																			
+																					
@?????>>>?>??????>>>?>=?@AK`XC>??>=DQI?>>>=????@?>??????>>?????>A-
+
+


+																			
+																				
+
+>@????>>?????>>>?>>?>>>>??>@KVK?=>GIA????????????>??>????>?????>A1



+

+																	
+																					
+
+<@??????????>>>>>>>?>?>?????>ASYOWM?@@???????????>??>????>?????>A2





+																		
+																						
+9@????????>>?>??>>?????>???????RZV??@???????????>???????>>?????>A/




+																																							
+
+
2B???????????>?>>>??????>?????ALZSH@????????????????????>>????>>B*


+																																							
+	
%B??@????????????>????????????HVSJQA??????????????????????????>?A!

+

																																								
+	?@?????????????>>????????????CSTSK????????????????????????????@>

+


+																																							
+	:A?????????????>???????>??????HIGA?????>??????????????>???????B3
+
+
+																			
+																		
+
+7A????????????????????????????==>??????>?????????????????????AB!



+
+																																					
+	6B?@???????????>???????>???>??>>>?????>>???>????????????????@B4


+
+																	
+																			
+	
4B?????>?????>?>?>>????>>??>>?>>??????>?????????????????@??A at 8
	

+																			
+																			


1B?????????????>>??????>>???>>???>>??>???????>???????????>@A9!



+																	
+																				
+

+*B?????????????>>???????>???>????>??>?????????????????????A@*	


+
+																
+
+
+
+																		
	
@@????????????????????????>??>>????????????>?????????????A<!

+																	
+	
+																			
	:B?>???????????????????????>>>>>>>???????????????????@?>@A:

	
+
+														
+
+	
+
+																	
+

++C?>?@??????????????????????>>>>>>>???????????????????>?AA6
+	
+	
+													
+
+	
+																			
	=A>>??????????????????????????????????????????????@@???AB.
		

+
+	
+												
+
+																				
+

+C@>??@?????@????????????????????????????????????@????@B?!

+	


+
+														
+	
+																			
	9B?>??@???????????????????@????????????????????@?????AC3






+
+
+														
+	
+
+																	
+
	@A??>?@@???????????@?????@?????????????@????@@?????@C> 



+
+
+
+												
+
+	
+	
+																	


+CA????@@????????????????????????????@@?????@?????@BC,

	
+
+
+
+
+						
+						
+
+																			
+2C@?????@???????????????????????????????@??@????@AC5

		

+
+
+
+
+
+
+	
+		
+
+				
+		
+
+																
+	6C@??????@????????????????????@???????@>>??????AC:
	

+
+
+
+
+
+
+
+
+	
+		
+
+	
+
+	
+
+
+			
+
+												
+	7CA??????@@??????@@@@@A@@?@@?????@@@??????>??@C<

+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+			
+
+
+											
+	

+7C@??????????@?@@@???@@@@@@?@@@@??@?@?????@AC;


		



+
+
+
+
+
+
+
+	
+
+		
+
+
+	
+	
+	
+												
+
+
+

6C@??????>??>>>????????@????@?@@@???????ABC7

	




+
+	
+
+
+
+
+
+
+
+
+
+		
+
+															
+
+
+
+2BA????????>>>>>>?@@@@?@???@?@@??????ABC at -
+

+	




+
+
+
+
+
+
+
+
+
+
+	
+
+
+											
+		
+
+
+
+
,AB@????????????@???@@??@????????@ABB at 5 
+			


+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+												
+
+
+
+


";CA?????????@@@??????????????@BCA;1!

+	

+
+
+
+
+
+
+
+
+		
+
+																
+
+
+
+


+/?BA@????????????????????@ABC>2$

	
+
+
+
+
+
+
+
+
+	
+	
+									
+				
+
+
+
+
+



3 at BBA@??????????????@AABB<-



+	
+
+	
+
+

+

		
+															
+
+
+
+
	

-:ACBBBAA@@@AAAABBCC at 9*

+
+							
+
+			
+												
+
+
+
+
+

	
+
(07;>@AAAAA@?<82)


+					
+
+	
+		
+
+
+
+
+		
+
+
+
+
+
+			





											
+
+
+		
+
+
+
+				
+
+
+
+
+
+
+				
+
+
+
+
+
+				
+
+
+
+										
+
+
+															
+																																																																																																																										 [...]
+																																																																																														 [...]
+									
+	
+
+		
+			
+



+			


	
+			
+		
+			
+




+		
	
+
+			
+				
		
	
						
+				
+				
+		
+
+
				
			





+
+
		
	



		
+

2:<<;4#
	



+
	
	

&<>===<>?3
+	


+
+					
+		
+,>=====<<=>=/

+
+

				
+



5?=======<<=>?<+
+

+
+	



2>?==<======<==>>?4
	
	
+
+

+>@>>===<=<<==<<=>>>?: 

+	
		
+
+

2?>>>>===<;::;<<<=>>>>?<%
+
			
+

7@>>>>==<;?KV]RF>;<=>>>>>=)

		

+
+		


:?>>>?>;=K]ihceffdP=:=>>>>>?/
+
+
+		
+
+		<?>>>>><Qnt_g{~~�vjjV@<>>>>>?2
+
+
+	


+
+&A8<>==>>>>aydTh�t]WYj�wamqG<>>>>>?4	
+		

+
+		
+		
"G?>=>>>>>etR_}~X@<==>Kr{XfoB>>>>>=?1
+		

+
+
+								
+
+		

+
1>=>>>>@O`gws[B=?????>?\~dkX<>>>>>=?)

+
			
	:>=>??>cbWbM><>????????=KvodJ??>>>=>:	
+		

	

(?=>>?=PwON=<>???@???????=HufzN>??>>>?$

+		

+		


+
+
+
	
<>=>>>AsYNA=>>???@??@??>??<^bgxB>?>>>?+


+		


+				

			

+!=?>>>>=aeM_=>?>>????????>??>SnO�a=??>>?6


+				

									

				
	
=?>>>><XmC]Z=??>>>?????>?>>?>FyXZ~G>?>>>?7
	
+

		

+										
+
		
+
+	5@>>>>=U{FBoL>>?>>>>>>>??>>>??>VoQqh=??>>>?>.	
+	

+													

	
+
+	 ?>>>?>H�Z8`g?>?>>>>>>>>>>>>>>>?=bZOyU=??>>>>?6!)	
																
+
	
+		9>>>??=k�IVzF=>>>>>>>>>>>>>>>?>>=IkJSxN=>>>>>>?>:G#


+																	
+

				:?>>>>>?}��Q<>>>>>>>>>>>>>>>>?>>>?haK^yC=>?>>>>>?'
+
+																				
+
+
				9@>>>>>=>i��P<>>>>>>>>>>>>>>>>>?>>>=UnBAxe<>>>>>>>?,	
																							
+
			2@>>>>>==;EL?;>>???>?>>>>>>>>>>>???>>AuW9a�D>>>>>>>>=
	
+
+																									

+
+
+%?>>>>>>==<::<=>>??>>?>>>>>>>>>>????>>=R�Qa�O<>=<=>>>?1


+																											
			;>>>>>===<====>>>>>>>>>>>>>>>>>>>>>?>>>=d�|�T;>::>>>>=>	
	
																											
+

+	
1?=>>>>==;;<===>>>>=>?>>>>>>>>>>>>>>>?>>>>g��Q;<;>>>>>>?7
+

+																													
			 ?>>>>>========>>>>=>>>>>>>>>>>>>>>>>>?>>>==VdJ;;;>>>=>>>@)

+	
+																																	
+
	8?=>>>>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>==;A@<<;>>>>=>=?;
	

+
+																																
+
		%@>>>>=<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>><;;<;>>>>=>>>@+

+	
		
+																																	

+	8?>>>><<>>>=>>>>>=>>>>=>>>>>>>>>>>>>>>>>>=>>>>><;<;=>=>==>>?;		
																																						
+
	?>>>>>==>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>=>>>>>>=<;;=>>===>>>@'		

																																					
+

+	.@>>>===>>>=>>>>?>>>>>>>>>>>>>>>>>>>>>>=>>>>>>>>>=;<==<<===>>?5




+																																					

+8?>>>==>>>>=>>>>A@>>>>>??>>>>>>>>>>>>>>==>>>>>>>>>=====<===>>>=

+
																																						
+
=>>>>==>?>>?>>>>A?>?>==>>>>>>>>>>>>?>>=>>>>?@??>>=======>>>>=>?#
+		
+																																							
+
 ?>>>>==>>>>>>>>>>>>>>>==>>=====>>>>>=====?>>A?>>>>>=====>>>>>=@*			

+																																								
+
	*@>>>==>>>>>>>>>>>>>>>>>==>>====>=>>===<==>>>>>>>>>>=<<===>>>>>?/
	
+
+	

+																																								
+

4?>>>>>>>>>>>>>>>>?>>>>>==;=====>>>===;<=>>>;<>>>=>>??>>>==>?>>@2
		
		
																																									
+
;?>>>>>>>>>>>>>>?>>>>>>>>===;;=5(078<>==>>>><;??>=>>???>===>>>>@/
		
+

+
+																																									
+
?>>>>>>>>>>>>>?@69?>>>>>>=>>=<92%&5=>>>>>>>>>>95>>>>>>>=<=>>>>?<&
+			

+
+																																									
+
!@>?>>??>>>??>>?A:;???????>>>?>;79<>>>>>>>>>>>?91?>>>>>>>>>>>>>?0
+	


+
+																																									
+
'A??>??>>>>?>>?>,6?>?>?????>???AEFC@?@?>>>?>????@>>>>>>>>>>>>>>@2
+
+	
	

+
+																																										
+A@@?>?>>>?>?@A92@?>>>>???>>?P`^`\[PA>????>>>?????>>>>?>>>>>?>?=
+	
	
+
+																																											
/A at A?????>>>?@A@<>?>???????>CIS_ZXWZUEB>???>>???>???>>>?>>>??>?>A*
+		
			
+																																									1A?@?>??>>>>?@@@@?>??????@?>QZBGIIGD at QZ???@@????>??>>>>>>>>>?>?>?;		
+
+
+																																											3@>???>????>???@??>@@?????@A_aC at BBA?C_]H??????@???>>>>>>>>>?>???>A 
+
+
+
+																																												6@??????>>>?>?????????????<EedH at A@AAMi_U>????????????>?>?>????>?>A+	

	
+
+
+
+																																								
+
7@??????>>?>?????>??>??A@=9B``OB@?@DWk_O=>???????????>???>>???>?>@0
+
+
+		
+
+
+																																								
+6@??????>????>>??>@?>?BZYH>?`f\IBBDIcomK==@????@?????>>???>?>?>??@1
+
+
+
+


+
+																																						
+
+
3A??????>?>?>?>?>>????NggbK;WicVEAGNamU<?TaVA@?@@??>??>???>>??>??A.		
+
+
+
+
+																																						
+
+
/A?????>>>>>??>??????@ZejdeF?IOMC at ACFE<FttZ^L????>>>>??????>?????A)	
+
+
+

+
+
+
+																																						
+
*A????>>>>>>?>>??????@Y]\\aO=<<?@A@><;=VvmdfL>?>??>????>?????????A)	
+

+

+
+
+																																						
+	
%A?????>>>?>?>??@?????Q[[daF=>>?????<<>DOX\VA>?>>?>??>?>>>>?>????A0

+

+



+																																						
+	

!A?????>>>?????>@?>>?>BN]`UJ?>??????=<=>CFA<>???>????????>>?>????@5

+



+																			
+																				
+

@?????>>>????????>>??>==>>@A??????><=??>>>>>????@???????>>?>???>@8




+
+																																							
+

@?????>??????>???>>>?>>>?????@@?>>>?@@??>???>???@???>????>?????>@8


+

																	
+																					
+

??????>??????>>>?>>>>?>>????@?@CBA?@@????>??????>????????>?????>A4





																		
+																					
+
<@????????>?>>?>>>??>???????@??BPF>?????????????>???????>>?????>A/





+																																							
+
+5A???????????>?>>?>???????????@>OJ@???????????????????????????>?B&



																																							
+
+
+B???????????>>???????????????ABIQI??????>??????????????????@?>@@

	

+																																								

&B???>????????????????????????AEKRL@??????>????????????>???????B6

	

+
+																																							

+'B????????????????????>>???????CIKC????????????????????>??????AA!

+


+																																							

(B@??????????>?????????>???????>>>>?????>??????????????>??@??A>.	

+																		
+																			

&B??????>>?????????????>???????>>>?????>>???????????????????@@0



+
+																	
+																				
+
#A?????????????>???>???????????>>??????>>???????????????????A>#
+

+
+																		
+																			
+
@@??????????????>??????>????>????????>>??????>?????????????A>!
	

+
+																
+
+																			

+<A?????????????>???????>>????????>??>??????????????????@???B>"
+
+


+															
+
+
+
+	
+																
+
3B??????????????????????????????????>??????????????????@??@B>

	
+
+
+														
+
+	
+	
+																	

+#B@>?@??????????????????????>>>>>?>>?????????>????????????@C:

	
+
+															
+	
+			
+														

8B?>?@?????????????????????>>??>?>???????????????????@???@C0


+
+
+
+													
+	
+																			

+$B@>??@????????????????????????????????????????@???@@@>>?AA 


+


+	
+													
+	
+																		
+
+4C@>?@@????????????????????@@?????????????????????@???>@C5


+

+
+									
+				
+	
+
+																		

+=B@>?@@???????????????????@@???????????????????@??????AA

	



+
+
+
+
+											
+
+	
+																		

+$BB@>?@@??????????????????@@????????????@?????@??????@C0

+	
+
+
+
+										
+
+	
+	
+																			

,CB???@@??????????????????????????????????????@??>?@B;

+


+
+
+
+
+
+
+									
+
+
+	
+																	
0CB@???@@???????????????>?@??????????????????????@B@ 

+	

+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+	
+		
+															
+	2CB@???@?@????????????????????????????@?>?@?????AB(


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+
+		
+												
+	

+1CB@????@@@??????@@@?@A@@@@@???????@??????????AB-

	

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+		
+
+												
+	

+/BB@???????@???@@@??@@@@@@@???@@?@?????????@AB-
+

+



+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+		
+												
+
+	

+AB@??????????????@????@???@@@?@@????????@BA)
+

	





+
+
+
+
+
+
+
+
+
+
+		
+															
+
+
+
+
'?C@?????????????@@@@@@@@?@@@@????????@AC=#
+
+	


+
+
+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+
+

 ;CA@?>?????????@@@@?@????????>????@ACB4


+
+	


+
+
+
+
+
+
+
+
+
+
+
+
+																
+
+
+
+

+
+2AB@???>??????@??@???????>??@@AABCA7#
+	
+



+
+
+
+
+
+
+
+
+
+
+														
+	
+
+
+
+
+	$:BB@???>??????????????@@AACCBA<1 
		





+
+
+
+
+
+	
+	
+	
+										
+	
+
+
+
+
+

+
+);BBA@????????????@@ABCC?92* 


+			
+

+		


+

+	
+					
+						
+
+
+
+
+
+


+&6>BCBBBAAAAAABBCCB>5(

+
+							
+
+
+	
+		
+										
+
+
+
+

	#-5:<>@AAA@>;60'


+							
+					
+		
+
+	
+
+
+
+
+
+
+					
+


+
+
+											
+
+
+
+
+
+	
+
+									
+
+	
+
+
+
+			
+
+
+
+
+
+								
+
+
+
+													
+
+
+													
+																																																																																																																									 [...]
+																																																																																															 [...]
+						
+
+			
+			
+
+


+
+
+

+			
+				
+
			
+
+		




	
+					

+		
+
+	
+
+	
+
+
+					

							
+	
+				
+
+
+

+




+	
	

""

+

+
+	
+
(7<>==:-
+

+
	
		

4>===<==>6	
	


		
+			
+



9>=<===<<=><&

+	
		
				
+	
+
#;?=======<==>?3

		
+		

3>>==<======<==>@;"

+		
+
+
+
'=?>>=<===<<==<<=>>?>,


	

+
+
0?>>>>===<;::;<===>>>>?0

+
	
+
+	

4@>>>>==<;=FSYL@;<<=>>>>?5
	
	
			

7?>>>>>;<I[fhfddc[G:;>>>>>@8


		

		
+
+
+7?>>>>>;Kjsa\e`]]ijocG;>>>>>?<#
+		

			+-7?==>>==]jP]u������knr[==>>>=>>'
	
+	


				
+
+KB>=>=>=>d{abs�s\YWRTh|s^qb>>>>>=>>#
+
+		

	
+
+
+
					
+
+
+	

->=>>>>?fgbjdVE>=?>>==B\xhsP<>>>>=>:
+						
+
+
+
+			

+
/>=>>?=_sXRA<=>?@@?@?>><Gj_RM>>>>==?-
	
+	
+

+		
<>=>?=M{ZM<>>>??@??@?>??=B^\zH>?>>>?7
+				
+


	9?==>>Asc^F=>>????????>>>?<TZnm>?>>>>;
		

		
+

	
+	
+
+9?>>>>=dkHlI=?>>???????>>>?=QcL�R=?>>>>*		
+			


+						
+
+
+		
+
+6@>>>>=YvCJrF>?????>>>??>>>?>EkGbu@??>=>?5


+

	
+

+								
+


+
+
+	$?>>>?>N�O<qe=???>>>>>>>>>>>?>=[dIv`=?>>>>?>*
+	

+											
+

+	
+	7?>>???t}Di|D>>>>>>>>>>>>>>>>?>HvUTzT=?>>>>>?1


														
+
		
+	1>=>>>>G����J<>>>>>>>>>>>>>>>>>?>ghCW|F=>?>>>>?<.:"		
																	

	
+	2@>>>>>;D}�J<>>>>>>>>>>>>>>>>>>>=NxF=tl=>???>>>>?A!

+																			


	
/@>>>>>=<<JL=<>??>>>>>>>>>>>>>>>>>>>kk9Y�L=??>>>>>?$	
																					
+
					$?>>>>>>==;::<=>>???>>>>>>>>>>>>>>>>=E�n`�]<>>>>>=>?5


+																								
+
		;?>>>>>===<====>>?>>>>>>>>>>>>>???>>>=M���[;>>>===>>?$


+
																										

+	
0@>>>>===<9<=>>>=>>=>>>>>>>>>>>>>>??>>><IqtM:=>=>>>>>>:
+
+

																											
	
+	#?>>>>>==><<==>>>>>==>>>>>>>>>>=>>>>?>>>=;>I@;=>>=>>>>=@-





+																												
+
	
+;?>>>>==>>>>>=>>>>===>>>>>>>>>>>>>>>>?>>==<;9:==>>>>>>=>>

		
+																															
			
+-@>>>>>=>=>>>>>>>?>=>>>>>>>>>>>>>>>>>>>>=====<:<<=>>>=>>=@1


+
+																															
+
	=>>>>;7>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>>>===<=>>==>>>>
+
+	


+																																
+
			,@>=>>;:>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>==>>>>>>>>>=>>>==>>>@/

+	
+

+																																			

	9?>>>>=<>>=>>>>>??>>>>>>>==>>>>>>>>>>>==>>>>>>>>>>>=>>==>>>?;	


+																																				
+

+
?>>>>=>=>><>>>>?A?>>>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>======>>>?!
+
	
+
+																																				
+

+(@>>>>=>>>>>>>>>?A>>>>???>>>>>>>>>>>>>>>>>>@?>>>>>>>>===>>>=>@-
+
+


+
+																																					


+/@>>>==>>??>>?>>>>>>>>>>>=>>>>>>>>>>>>>>>>>@@>>>>>>>>==>>>>>=?4
+

+																																							
+
9?>>>==>>?>>>>>>>>?>>>>===>=<==>>>>=====>?>>>>>>>>>>===>>>>>>?7
+
+
																																								
+
	
?>>>>>>>>>>>>>>>>>>>>>>>>>>==============>>>>>>>>>>===>=>>>>>?8	
+
+
+
+																																								
+

++@>>>>>>>>>>>>>>>>>>>>>>>=<<==<==<<==><;=>>>=>>>>=>???>>>>>>>>@6	
+
+

+																																								
+
6?>>>>>>>>>>>>>>?>>>>?>>>==<====<:8:<>===>>>=>??==>???><=>>>>?=*		

+	

+																																									
<?>>>>>>>>>>>>?A57??>>>>>>=>>><;;:<=>>>>>>>>>?92>>>>>>>=>=>>>?8		
+
	

+																																								
+
?>>>>>>>>>??>>?@;<>>>>>>>>>>>><9;<=>>>>>>>>>>?:0>>>>>>>>>>>>>?=	
+		


+
+																																									
+
@????>>>>>>??>>8<?>????????????@A@>?@?>>>>?????@>?>>>>?>>>>>??A/	
+	
+

+																																											
$A@@???>>>?>?@@>3;?>>>>>>???>>AHMMKFB@??>>>>?>??????>>>?>>>??????

+		


+																																											
(A at A??>?>>>?@@@@???>>???????AMBCDCDCAA?>??>>??>>>???>>>>>>>>?>?>@2

+		
+

+																																										,A@@?>>>>>>>?@@@?>>>???????>LbIBCCEKNYQ???DE@??????>>>>>>>>>>>???=	
+
+
+																																											2A????>??>?>>??@???@???>??>F^^]MKINVdh[UGEKG@?@@???>>>>>????>>??>A!
+
+
+			
+																																								6@>?????>>>?>?????>???????:Kb^jXPNR[hbS_JC?>??@??????>>>????>>>?>A'	
+
+	

+																																										
+7@??????>>???????>??????>>8Hb]ncWX[cj`ZX=>????????????>>??????>?>A)
+
	



+
+																																					
+
6@??????>????>?@??@????JP?<EmfpkfmorqfrpI at BFA??@???>???>??????>??A'
+
	



+																																						
+

4@??????>>>?>???>?@???B`e`C9Runf_bffioe[egc[C@?@??????????>??????A&	
	


+
+																																							
+
1A????>?>>>>???>>????>M^VdlG;IMKGILIID:I�pZ^H???@????>?>????????>B*	
+	

+
+
+																																						
+
+

-A??>>>>>>>>>?>>>?????Pa_eie=;=????><;;eyaZbI?????>??>?>????????>A2

+	

+
+
																																							
+
(A??>>>>>>>????>??>??>Ebfa\^H<>?>???=<Pl_cidA???>>>??>?>>>>?>????@8
+	



																																								
%B>????>>??????>@?>>?>?ENLA at JB>?????=K^G=AG@>?????????>>?>>?????>?:
	


+																																							
+	

$B?????>>?????????>>???=>>?>@C?????>ANC=>>=>????>@@????>?>>?????>@9	



+
+
+																																							

"A????>>?>???>?????????>???????>>>>>@????????????A@???????>?????>@6
+



+

+																																						
+


A?????>?????>??????????>????@???==???????>??>????????????>?????>A1



+

																																								
>@?????????>>>>>>>?????????????>=>??????????>?????>?????>???????B(






+																																						
+
:@?????????>?>??>????????????????>?????????????????????????????@@




+																																								
8A???>???????>???????????>>????>?@@?????????????>??????????????B5

	
+

+
+																																					
+:A???????????>?????????>????>?@>>BB?????>????????????????????@@;




+
+
+																																						
<A???????????>????????>>?????????@A????>>????????????????????A<$

+	
+
+																																						=@???????????>????????>>??????????????>?>????????????????????B6


	


+																																						
<A??????>??????????????>>>??????????>??>>?????????????????@??A8




+
+																
+																				
8A??????>??????????????????????>>>??>>???????????????????????A=


+
+
+
+
+																	
+																		
+
2B??????????????>>??????????>?????????>>??????>??????????@???B=

	
+
+
+															
+																				

+&B@>??????????????>???????????????>??>>??????????????????@???B9
	



+
+															
+	
+																	
+
+=B??@????????????????????????????>?>>???????????????????@?>@C/
	
+
+
+
+													
+	
+
+																		

,CA??????????????????????????>>>???????????????????????@@??AB 

	
+
+
+														
+	
+																		

;C@????????????????????????>=>???????????????????????@???@B:


+
+
+
+
+
+								
+		
+	
+																		
+
"@B@?@?????????????????????????????????????>????????@@@??AC%
+
	
+

+														
+
+	
+																		

,AB@?@?????????????????????@@?????????????>??????@@????@C8

+	


+	
+
+									
+	
+	
+																			
3AB??@@???????????????????@@????????????????????@@???@AB 



+
+
+
+
+
+								
+
+
+	
+																		

	5AB??@@??????????????????@@?????????????????????@???AC0


+
+
+
+	
+	
+					
+		
+	
+
+				
+													

+
6AB??@@???????????????????????????????????@??@@?>?@C;
		


+
+
+
+	
+
+
+	
+						
+
+																		
+

+
6AB@?@@@??????????????>??@???????????????????>>?@B@

+	
+


+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+																		

+
6BA???@@???????@????????????????????????????>?@BB'
		
+

+
+
+
+
+
+
+
+
+
+
+
+
+		
+	
+
+																		

+
6BA@???@@@?????@@@@?@@@???@????????@???@????@BB,	
+		

+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+			
+												
+
+
+
+5BB@?????@@??????@@@@@@@@@??????@?????????@BB-	
+	



+


+
+
+
+
+
+
+
+
+
+
+	
+
+														
+
+
+
+		3BB@?????@??????@@???@@@??@@@@?@????????@BA*
+
+

+	




+
+
+
+
+
+
+
+
+
+
+		
+				
+									
+
+
+
+
+

/ACA??????????@??@@?@@@@?@@???????????@C?%



+			

+
+
+
+
+
+
+
+
+
+
+
+
+
+														
+
+
+
+
+
+
	(>CA@????????????@@?????????>??????@AC9




+	




+
+
+
+
+
+
+
+
+
+
+
+	
+													
+
+
+
+
+

+

6BCA@?????????????????????>???@@BC>+


	






+
+
+
+
+
+
+
+
+
+													
+
+
+
+
+
+

	
+(<CBA@????????????????@?@@AABCC=.

	
+









+
+
+	
+	
+												
+
+
+
+
+
+

		
-=CCA@@???????@@@ABBCCCCCB>5&



+





+
+
+		



+	
+											
+
+
+
+
+
+
+


*8?CCCBBBBBBCCCB@<831-)!
+															
+
+											
+
+
+
+
+


+%.379;;;:73.' 


+			
+	
+				
+	
+
+
+
+
+
+
+
+
+
+							







+					
+		
+
+
+
+
+
						
+
+
+
+
+
+
+								
+
+
+
+
+
+									
+
+
+
+											
+
+
+									
+																																																																																																												 [...]
+											
+			










				


							
	
		
+	
+

+	
+					
+
+				


+
+			
+
+			
+				
+



+
+
+		
+		

 ""

+
+
+

+		

+	
-9<==>;-


	
			
+
';>===<==>7


	

+						
.>==<===<<<>=(


					
	

+
0?===<<===<<=>?1

+

+	
+



7?==========<==>?8
	
	
+
+	
)=?===<===<<===<=>>?=#

+		

+	
0@>=>>===<;::<====>>>>>'

+
		
+		
+
2@>>>>>=<;=CORG=;<<=>>=>?-
	
	
+		

3?>>>>><;G[hoppmfUB:<>>>=>@0	
		

+
+	2@>>>>>;GixkabLNMq{r\B;>>>>>@3
+
	
+	
+	
/?>>>>==\~kXZeqqshptkwtP;>>>>=?6
+
+		
+

					DB>===>=>d}g\l}�����xw~u`y[<>>>==?6
+		
+
+

+
+					
+	
+
2@==>>>=f~dg_UKEJQQMACK^ojyW<>>>==?/
	
+	
+								
+


+

=>>>>=ZxdeD<=>>>>>?>>=<GdVrQ=?>>=>=


+
+	
					
+	
	4?=>>=L|YaI<>????>??????<K^^wC>>>>=?%
			
+

	
	
+
+3@>=>>Av_PfA=?????>>?????>@fOqa=?>>>?+


+		
		

			
+0@>>>>=cu<Wn???????>?????>>>cVT~I>?>>><&
	
		

					


+	
+
+&@>>??=P�MAy\>?????>>>>?????=ThJjp??>>>?@6

+				

								

	
+	:?>>??A{xO}v@??????>>>>>>???>FtUJz^=>>>>>@=%
+	

		
											

		
+
+*?>>>?=N����E=??>>>>>>>>>>>???>jmBT�M=>>?>>?>)

+													


+		
'>=>>>>;P��zE<>>>>>?>>>>>>>>>??=K�N;qz?>???>>>?8



																

+			
+&??>>>>=;@UQ><>>?????>>>>>>>>>??>=c{AT�T=??>>>>>>6F&


+																	


	
+		 >?>>>>==<;::<=>>>>>??>>>>>>??>??>>?u�l�k=?>>>>==>@8

+																				

	
+	:?>>>>>===<=====>>>>>>>>>>>>?>>>?>>=Bs��b<>>>>>==>?-
	
+
																							
		
0@>>>>===<9<>>===>>>>>>>>>>>>>>>>>>>><>UaJ:=>>>>>==><


+																								
+
		"?>>>>====<;=>>>=>>==>>>>>>>=>>>>>??>>=<:<;;<>>=>>>>>?0

	
																										

		:?>>>====>>==>>>>>===>>>>>>>>>>>>>>?>>===<:;==>==>>>>>>

+

	
+
																												
			
0@>>>==>>>>>>>>>>?===>>>>>>>>>>>>>>=>>====>=;<===>>>>>=?4		
+	

+																													
+
			
?>=>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>==>>===>>>==<=>>==>=>?
	
																															
			
4?>>>>=>>>>>>>>>>>>>>>>>>>>=>>>>>>=>>==>>>>>>>>>==>>==>==?2
	

																																	

		
>>>>>>=>>=>>>>>>?>>>>>>>>>>>>>>>>>=>=>=>>>>>>>>>>=>>>=>>=><	
	
+
+
+																																		
+

+	+@>>>>=<>>=>>>>>@A?>>>>>>>==>>>>>>>>==>>>>>>>>==>>>>>==>>==?&			
+
+
+
+																																			

	5?>>>=><=>>>>>>>@@>>>>>>>>>>>>>>>=>>==>>?@@>>>>>>=>>>==>>=>@1
		

+																																			
+
	:?=>>=>><=>>>>>>>>>?>>>>>>>>>>>>>>>>>>>?>?A>>>>>>>>>==>>>>=?7

		
																																				
+

+>>>>>=>??????>>>>>>?>>>======>>>>>>>>>>?>>>>>>>>>>>>=>>>>>=?:		

+
+																																						
+
	*@>>>>=>>?????>>>>>>>=====>=<===========>>>>>>>>>>>>>===>>>>?;	
+


+																																						
+
	:?>>>>>>>>>>>>>>>=>>?>====<=====>==<=>==>>>>>>>>>>==>>>=>>>>@8		
	
+

+																																							
+
	"@>>>>>>>>>>>>>>?>>>>?>=<><39=<==6<==><<=>>=>>>>>=>>??>=>>>>>>-	
+
+	
+
+																																								
+

1@>>>>>>>>>>>>>??>>>>>>>>>=<;==>=9===>>=>>>>>>>?>=>???==>>>>><
		
+
	

+																																								
+
8?>>>>>>>>>?>>?@65?>>>>>>>>>>>>>>>>==>>>>>>>>?92>>>>>>>>>>>>>@&			
+
+

+																																								
+
<?>>>>>>>>>?>>?@==>>>>>>>>>>>>=<;====>>>>>>>>>:1>>>>>>>>>>>???=
+			

+

+																																									
+>??>>?>>>?>??>?>??>?????>?????>>>?>>??>>>>?????@=>>>>>?>>>>>??A6			


																																											
+
@@@??>>>>>>?@@????>>>???????>@ABDDBA@??>>>>?>??????>>>?>>>>>>>?A#		
+

+																																											
#AAA??>?>>>>@@@@??>>>????>??>FFJQRTTOD>????>>??>>???>>>>>>>>?>>>@5
		
+

+	
+																																							
+A@@?>>???>>?@@@?>>>>?@?A@?=B^c`^[\aedL>>>@E@?>?>>?>>>>>>>?>>>>>?=			
+		
+																																							
1@???>???>???????>?@???>AAFV`]dfd_``\[bUPNUWE??@??@>>?>>????>>>>>?			
+
+																																									6@??????>>>????????@??????;O^Q]ba__ZVRTUNNNC???@????>>?>?>>>?>>>>@
		
+	
																																										
+7@?????>>>?>?>>??>>???@?>>4N^R]efc^XVSUX><@BCDA??????>>???>>?>>?>A
	
+	
+


																																						
+
7@????>?>>>??>??>??>>??HOFJmyecnmjfb^[ai]LPWSFA????>??>>????????>A 	
+	



+																																						
+
6@????>>>>??>?>?>?@>>?@^elieexmgeaaa`jrwnfZZF?>????????>????????>A'
+
+	

+
+																																							
+
4A??>>>?>?>>>?>>>????>GbU^yd<BKKORRJGC?az\SXK???@????>?>>???????>A/
+	

+

+
+																																							
+
1A??>>>?>>???>>>>?????EdUWbk?;<>?@?=<<;ZoZRZQ>??@????>??>???????>@5
		


+
+
+
+																																					
+
+
.A??>>??>?>???????>???=Znnjv[:>?????=;Q{k`[dK>???????>??>>>?????>@8		
+




+																																						
+
,B>?>???>?>??????>????>ATZT`�_>?????<T�kVVWK??????>????>?>>??????@8		
+	

+
+																																						
+	
*B>????>>???????@>?????>=>>=LnaF????VtV@>>==???????????>??>?????>@5
	
+
+

	
+
																																				
+	

'B?????>?????????>??????????>ASYQFFW_H>??????????@????????>?????>A0
+	
+


+
+

+																																						

!B??????????????????????>?????>AHTTI@?@??????????@????????>?????>B(	
+
+


+

+	
+																																					
@?????????????>>???????>>????@><@C=>????????>??????????????????@@	
+
+



	
+
+																																		
+
+
?@??????????>>>?>???????>>??????>>?>>>??????????????????>?????@B4
+
+
+



+
+
+																																			
+"A@???????????>????????????>?>>??????>>>?????????????????>????@A6

+
+	


+
+																																				

*A????????????>???>???????>>>>?@??????>>>>>>????????????>?????@?#


+
	

+
+	
+																																			

.B???????????????????????>???>???????????>?>??????????????????@@%






+
+																																					
,B??????????????????????????????????????>>???????????????????>@C.
	


+
+																																				
&B???????????????????????>>>???????????????????????????????@??@C/


+
+															
+
+																				


A@?????????????????????>>>????>>?>????????>???????????????@?>?C*


	


+
+
+														
+	
+																		
+
;B????????????>>>>??????????>??>>?????????????>>????????????>@B 
+
+
+

+
+
+
+													
+																				

+CA?????????????>>??????????>?????>???????????????????????@??A=
		
+


+
+
+													
+
+
+																	

:C@?????????????????????????????????????????????????????@@>?C0

+

+
+										
+
+
+
+	
+																		

+#@B@????????????????????????????????????????????????????@??AA"
	
+
+
+
+				
+					
+	
+	
+																		
.BB????????????????@@?????>>>>???????????????????@???@@??@B7


+	


+
+
+								
+		
+	
+																		
+7BA?@??????????????????????????????@??????????@??@?@@@?@A?+#!
+



+
+
+
+							
+
+
+
+	
+	
+															

%<B@?@@??????????????>??????????????????????@@@???@@??@AA4'( 
	

+
+
+
+
+
+		
+
+		
+
+
+	
+
+															
+		.>B@@@????????????????????@@???????????????@?@@?@@@??AB;+*'

+


+
+
+
+
+
+	
+			
+
+	
+	
+															
+	
	$3?B@@@???????????????????@@???????????????????@@@??AB?0*+$
+
+
+
+
+
+
+
+
+		
+	
+
+
+	
+														
+				)3 at B@?@@??????????????????????????????@????@@??@??ABA4)+(

+
+
+
+
+
+
+
+
+
+		
+
+	
+
+		
+											
+		
+


+4 at B@?@@@??????????????>?????????????????????@??@BB7')("


+
+
+
+
+
+
+
+
+		
+
+
+																	
+	



)2 at C@??@@@?????@@??????????????@???????@@?????@BB9'%&!	

+
+
+
+
+
+
+
+
+
+
+		
+	
+	
+														
+	

+

&/?CA???@@@?????@@???@@???@@@??????@@???????@BC9$ "

+


+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+															
+
+
+
+ );CB??@@@@@@@@@?@@@AA@@@@????@??????@????@BC9
+
+





+
+
+
+
+
+
+
+
+
+	
+															
+	
+
	"5BBA????@@????@@@??@@@@??@?@??@??@????@BC8


	




+
+
+
+
+
+
+
+
+
+
+																		
+
+
+
	
+,=BB@????????@???A@@@@@?@@?@@???????@BC5



+




+
+
+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+



$8ABA@??????????@?????????>???????@BA/		
+	





+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+


/>BBA@????????@??????>>???????@AC=&	

+	



+







+	
+
+
+														
+
+
+
+


	!5 at BBA@??????????????????@@ABC?0
	
+		
+



+
+
+


+		
+
+	
+													
+
+
+
+
+


$6 at CBBA@@@@@@@AABBAABBBBCB<.
	
+





+
+
+
+
+
+


+	
+		
+								
+
+
+
+
+
+



#1<ACCCCCCCCBA@@@@@?=8/#
	


+	
+
+
+								
+												
+
+
+
+



+ '-0110-)%!





+				
+									
+
+
+
+
+
+
+
+										
+








+
+					
+	
+	
+		
+

+				
+
+
+
+		
+
+			
+
+
+
+
+
+
+								
+
+
+
+								
+
+
+										
+
+																																																																																																											 [...]
+		
+			
+
+
+
+				
+		












+
+



+	
+			
+						

+						
+	
+		
+	
+
				
					
+									
+		
+

+



	
	

-7;;:93%



	
.<>=====>>7 


	

				
5>==<==<<<<>=)

	
+
		
+
+		
7>====<==<<<==?0
	

+					
+
+
 :>===<=====<<===?7


+

+
+
*>>====<<<<=<====>=?;
+	
	

+
+
+1?>=>>>==<;::;<===>==>=#


+	
		
+
+1?>==>>=<;=FQSG<;<==>>=>>'
	
+				
+
+
0@==>>><;G]owoutiR>:<>>=>>?*
	
		
			
+
(?==>>>;GiyppjMOOl~pT><>>>>>?+
			
+		

#=>=>>><XsYNUTSYIO]r�qG;>>>>>?*

+		

			
-4=>==>>=``U`n����wlvth|R;>>>==?(
	
+

	


+	
+				<E===>><_�\jnbWR]mtfUZcmek~O<>>>=>=	
+
							
+

7>>>>=T}YjgF=>>=>>>=<=Faej{F>?>>=?0
	
+										
+		
+
+
(>>>>=K�VPpH=?@???????><Ih\tm>?>>=?6				

						

'@?>>>@yl:eh?>@@????????>@`_LzS=?>>>:
	
+				


+		
+	!???>?<Z�DN�U>?@??????????=WiA\|D>>>>?<&
+
+
		

+			
+

+	
+	9?>???A~wX�n??????????????>GuQArk>>>>>?@4

+			


+					
+			
+
+*@>>>?=S���u@>???????>?>>???>iu<J�U=>>?>>@:

		

+		
											
+		
+<?>>>><]��j?=???>>?>>>>>>???>H�]9n�C>???>>?:
			

+											
+
					:?>>>>=;IZM<=>?????????>>>???><Z�WY�_>???>>>?9$


+														

				:@>>>>=<<;9:<=>>?>?????????????>=f���u?>>>>>>>?;!*

+																	


+	5?>>>=====;;===>>>>??????>??????>>=_��h>=>>>>><=><L$
+

+																		

			
.@>>>>====::====>>>>>>>>??>??>>?>>>=;ERG:<>>>>>>>>?@

+																						

+			 ?>>>>====<;=>>====>>>>>>>>>>>>>>>>>==:9:;<=>>>>>>=>9
	
+
+																						
+
			9?>>>====>===>>=>===>>>>>>>>>>>>>>>====<;<<=>>>>>>=>>
+	
+
																									
+

+
0@>>>>>>>>>==>>>>>>==>>>>>>>>>>>>>>>=====<==<=>>>>>>=?4
	

+																											

		!?>>>>>>>>>>>>>>>>>==>>>>>>>>>>>>>>======>======>>==>==>
+



	
																													
		
+7?>>>>>>>>>>>>>>>>==>>>>>>>>>>>>>>>==>>>=>>=>===>>>=>>=?2
+
+



+																													
+
	
+	#@>>>>>>>>>>>>>>>>>>>>>>==>=>>>=>>>====>>>>>=>=>=>>>=>>>><
	

																																	
		
4?>>>>>>>>>>>>>>A@>>>=>>>=>=>>>=>>=====>>>>>>>==>>>>=>>=>?'


+	

+
+																																	

	<?>>>>>>>>>>>>>?A?>>>>>>>==>>>>>=>=====?A?>>>>==>>=>>>>=>@1
+
+
+		
+

+																																	
+

+
>>>>>>==>>>>>>>>>>>?>>>>>>>>>==>>>==>>>>A?>>>>>==>>>>>>>=?6				
																																			

	#?>>>>>><<>>>>>==>>?>>>>>>>>>>>>>>>>>>??=>>>>>>>>>>>>=>>>=?9		
+
+																																			
+

+
2@>>>>>>?>>>>>===>>>>>===>===>>>>==>>>>?>>=>>>>>>>>>>>>>>>?<	



+																																					

+
?>>>>>>>>>????====>?>>==>>=======<=====>>>>>>>>>>>>=>>>>>>?9	
	
+
+																																					
+
	
5?>>>>>>>>>>>>><=>>>?>===;9?>===>===>=<=>=<>>>>=>==>>>>>>>>?0	
+

+
+																																						
+

?>>?>>>>>>>>>>==?>>>>>=;:-
*0;<;09===;:=>>;=>>>>==>>?>>>>>>>%
+		
	

+																																							
+

+*@>>>>>>>>>>>>>===>=>>>>=<<74;>>=89;;<====>>>>>?>>>??>>>>>>>@2

+		
		

+																																							
+

2@>>>>>>>>>??>>?73@>>>>>>>>??>>>>>?>>=>>>>>>>?91?>>>>>>>>>>?>@*
+			
+	
+
+
+
+																																					
+
+
8?>>>>>>>>>>?=>>=>>>>>>>>>>>>==<9;>>>>>>>>>>??;2>>>>>>>>>>>?>?@"
+
+
+	

+
+
+																																						
+
+;??>>>>>>>>??>?47?>>???>>>????>===<>??>>>>??????=?>>>>>>>>>>?>@;			
+	

+																																										
+?@@??>>>>>>?@@@=>?>>>???????>@CKOMGA@???>>>??????@?>>>>>>>?>?>?@&			
+	

+																																										
!AAA??>?>?>>?@@@@?>>>???>>???>LXY[YZTE>???>>??>?>???>>>>>>>>?>>>@3
				
+		
+																																						

)AAA??>>??>>??@@?>>>>??@EA???QaXTSTUV]D>??>>>??>>??>>>>>>???>>>>?9																																												
0A?????>>>>??>?@>>??>??BRUVXX_NOTRQQNVVGHFGVI>?????>>>>>>???>>>>?<				
+	
+																																					
+
+4A?????>>>?>??????@?????AC at H]\TTVTTSQRZUJK[_H>?@????>>?>>>>>>>>??>	
+

+			
+																																				
+
+7@?????>>>>>?>>>>>>>???@??4Mb[UUSRRRQQ\Y><N[NLI????>?>>>>??>>?????


+

																																					
+

8@??????>>>?>>?>>>>>>>?Sa]_gd]UZXXXURRX^TDZ`VPI?>??>??>>>>??????>A
+	


																																						
+
8@?????>???>>??????>>?@Xekjqyn`^aZT[\boqmigeG??????????>>>??????>A(	
+
+

		
+																																				
+
7@????>????>>>>>?@???>F_YYf{SCHGLPNEFFEg{pfZTA?????????>>>?>????>@0
+		
+	

+
+
+
+																																					

5A??>?>???>?>??>??????C_SW]lD<<>>??=<<=SnbXQZD??@???>>?>>>?>??>?>@4
	
+
+
+

+
+
+
+
+																																			
+

3A????????>???>?>????@>U_X[eX=>????@=<J_UWSX^C??@????>??>>>?????>@6
		
+	



+																																					
+
+
0B??????>?????>?????????RdbgtY?>????=Hgi`_\WJ??????>?????>>?>???>@5
			


+
+																																					
+
+
.A????????????>??>>????>=@?CXrfG>>>?Oh`L at AA?>?????>?????????????>A1
+
+
+


+
+
+
															
+																				
+
*A???????>>?????@>??????????>Iiu_ML`nTA??????????????????????>???B(
+	


+


																																			
+
+
'A???????>???????>??????>?????@UdghfP?@@?????>??????????????????@@	
+
+





+
+													
+																				
+
+
*B???????????>???>?????@?>????@>FSYD>????????>???@????????>>???@A1
		
+




+
+
+
+																																	
+3A???????????>???????????>??????=>@=>????????>??????>????>>>???A4

			



+
+
+	
+																																

;A?????????>?>>????>?>????>??>?>>>>?>>>>?>>??????????????>?????B-



+		
+

	
+
+
+												
+																				
>@?????????????????????>???>?>????????>>???>?>>??????????>?????B6

	
+

+	
+
+													
+																				=@>????????????????????????>>>?????@???>>>?>????????????>??????A=

+	


+
+
+
+
+													
+																		
:B?>??????????>?????????>??>????????????>>??>???????????>????>?A=



+
+


+
+
+
+
+
+										
+
+																		
+
0C@>?????????????????????>>????????????????>>??????????????????A;


	



+
+
+		
+										
+																				
 AA??????????>????????????>????????????????>??????????>????????B3
+	



+
+
+
+	
+									
+	
+																		
4B@??????>????>>>>?????????????>?????????????????????>?????@?@B*!!	
+


+
+
+
+
+	
+							
+
+
+																
+	
	 ?B@???????????>>>??????????>??????????????????????????????@?A=,.*	
+


+
+
+
+
+		
+						
+
+
+																	

3BA???????????>>??>??????????????????????????????????????@?@A867/

+

+
+
+
+
+
+		
+		
+
+
+
+	
+
+																
+
(?B@@??????????>?>???????????????????????????????????????@?A?;>;/

+

+
+
+
+
+	
+
+
+
+
+	
+
+
+	
+
+																%:BA?@??????????>>??@@?????????????????????????????????@@?A@>@@<.

	


+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+																	
 7AA@@@?????????>>?>>????>???>??????????????????@?????@@??A?@AA<-


+
+
+
+
+
+
+		
+
+
+
+
+
+	
+
+															

3 at BA@@???????????????????????????????????????@@@?????@??A@@ABA:,	
+


+
+
+
+
+
+
+	
+
+
+
+	
+	
+
+														
'?BA@?@?????????????????????@???????????????@@??????@??A@?ABB at 7'
+

+
+
+
+
+
+
+
+	
+
+
+
+	
+
+
+											
+		

6CBA@?@@???????????????????@@???????????????????@?@@?AA?@BBB>4!



+
+
+
+
+
+
+
+
+
+
+
+	
+
+												
+			
+!>CBA@??@??????????????????????????????@?????@?@@@??AA>?ABB@;/	

+
+
+
+
+
+
+
+
+
+
+
+
+
+				
+
+						
+
+		
+
,ACBA@>?@@@??????????????>??????????????????@@@???AA>=ABBA>7'

+
+
+
+
+
+
+
+
+
+
+
+	
+		
+
+												

1BCBA@?>?@@???????????????????????????@?@@@@@@??AA?:?BBA>9.
+	
+
+
+
+
+
+
+
+
+
+
+
+	
+												
+				
+1ACBAA?>?@A@??????@????@@??@@@@??????@@?@@????AB?9;BBA>90

+

+
+
+
+
+
+
+
+
+
+
+
+
+	
+												
+	
+.?BA at AA???@@A@@@?@@@@@@@A@@?????@@@@????????AB at 97>@><6- 



+
+
+
+
+
+
+
+
+	
+																
+	'9@?>ABA???@@@@@?@@A@?@@@@?@?@?@?@???@???@AB?627;960&

+
+
+
+
+
+	
+
+
+																			
+	

/::9>BBA????@@?@@???@@@@?@?@@@@@??????@BC=0*-/-)!	


+
+
+
+
+
+
+	
+
+
+																	
+
		"0426>BBA??????@@@@@@???????????????@BC7%


	









+
+
+
+
+															
+	



+
")+-4=BCA@??????????????>>??????@AC at .

	


+	
+




+
+
+

+
+
+		
+											
+
+

		
 "'0;BCBA@@@???????????????@@BC9#
+

+
+							
+
+		
+	
+											
+
+
+
+


+	

(5=ACCCBBBBAAAAA@@@AABCB;)
				




+
+
+
+	
+
+
+
+
		
+											
+
+
+
+
+



+	

)17;>?@AABBCCCCCB@;1"
				
+


+
+
+
+						
+
+												
+
+
+
+
+


+



!%(++)& 
							
+		
+						
+
+
+
+
+
+
+
													
+
+
+
+
+
+
+										
+
+		
+	
+	

+																
+
+	
+	
+
+
									
+
+
+
+
+
+
+												
+
+
+	
+																
+
+
+
+																				
+																																																																																																																																											
+

+																																																																																																																																																													
+
+																																																													 [...]
+							 [...]
+
+
+




			

+
+
+

+
+
+
+
+
+
+
+			
+		

					
+			
+
+		

+		

	

+	

			


							


	
+	
)38961+!	

	
/<>>===>>>6 


+	
					
7>=====<<<==<'


	
+
	



8><======<<<==>/
	
+

+		
+
+	
";>=====<<=<<<===?6
+		

					
+	
+,>><===<<<<<<<<====?9
		
+

+			
+
	
+/?>==>>==<:99;<======?;
+	
	
+	
+/?>>>>>=<;@NZZL>;===>==><#


		
+	
+
*?==>>><;IcyzzwxpS=;===>=>="
		
				
			
+	
===>>><Im{tm[[[NbtmN<<>>>>>=!
	
			
+				8?=>>><WiTMRPT[MPNi�fA<>?>>>;
	
+		


			
+3?===>;Z�`PXcs���lLViuuH<>>>=>8
+

+		

+
+		


+=G?===>;V~NO}qnkx{tzupaUm{F=?>>=?.

+				
+								
+

8?>>><S�S at kmG>>>@@?BK]ss^qq>>>>>>9
+
+									
	:>>?>I�e<gyH>?@@????>>T}YCx[=>>>><


+		
							
+
+		
+	;@>??>tD`�W>??@@???@@??fk:R~I>>>>?3

+		
+

+	
+	6@>>?>L�om�i>?????????@?>MP:ls?>>>>@<&	
+
+			
		
+

					
+*@>>>?=Y���i?>?????????????j}BH�Z=>?>??@0		

	

				


+		
+=>>>>=;Y��X=>????????>????>E�tDjD???>>>@1				


+

+							
+
	
+2@>>>=<;GQB;=>?????????????><O�yh�^>??>>>>@/
+	
+	

+									
+
+	
+
+	3@>>>=<=;:9;==>??????????????>;U���t@>?>>>>>?,


+													

+	
+		
.@>>>=====;<===>>>>????????????><P}�i?=>>>>==>>*	
+																
				
+&?>>>>=>==<<>====>>>????>??>???>>=;=JE:<>>>>>=<==*8 	

+																	

	
+	
=?>>=>======>=>=>>>>>>>>??>>?>?>==<;8:;<=>>>>>>=>@O#
+	
																				
+
			7?>>>>>======>=>>>>>>>>>>>>>>>>>>====;;<=<=>>>>>>>=D!

+																						

	
-@>>>>>>>>>==>>>>>>>>>>>>>>>>>>>>>=====<<===>>>>>>=>:
	

+																							
			!?>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>>==========<=>>>>>=><


	
																										
+
	9?>>>>>>>>>>>>>>>>>>==>>>>>>>>>>>====>=>>>===>>>>=>>=?/



+
+
+																											

	
+	'@>>>>>>>>>>>>>>?>===>>=========>====>>>>>===>==>>>>>>>:
+
+
+
	

+																											
+

+			9?>>>>>>>>>>>>>?A>==>>>>=======>>====>?>>>>==>>=>>>=>>>>#
+
+	

+
+
																														


+	>>>>>>>>>>>>>>>@A>=>>>>>=>>>=>>=>=>>=>A@>>>>=>>>>>>>>=>?+


	
	

+																															
+
				'@>>>>>>>>>>>>>>>?>>?=>>>===>>=>===>?<>@@>>>>>=>>>>>>>=>?2
+

+
+
+

+
+
																																	
+

+
+*@=>>>>>>>>>>>>=>>>?>>>>>>=>>>=>>>>>?==>>>>>>>=>>>>>>>>=?5
+	
+
+

+																																	
+

5?=>>>>>>>>>>>==>>>>>>>>>>>>>>>>>>>>>>==>>>>>>>>>>>>>>>=?:
+			

+																																		

	&?>>>>>>?>>>==<=>>>>>=========>====>==>>==>>>>>>>>>>>>>>>?:
+
+	
+
																																				
+

+=?>>>>>>>>>???==>>>?>===?>=>>=======>>==<<>>>>>>?>>>>>>>>?3			
+

+																																				
+	
+
+
+0@>>>>>>>>>>>>>=<>>>??><<23=69=<<>>>>:<>><;>>>>>>==>>>>>>>>*
					

+																																				
+
+
+
=>>>>>?>>>>>>>>==>=>957-$
1=8$199:-7;>==>>>>>>=>>>>>>>>?9
+			


+																																					
+
+
!@>>>>>>>>>>>>>===?>>:98:9857<?>=742.8<<:=>=>>>?=>??>>>>>>>>@7	
+	

+
+																																						
+

+*@>>>>>>>>>??>=?:4?>>??>>>???>>>>>?@?>>=>>>>>?91>>?>>>>>>>??>@6	
+	
+		

+
+																																					
+
+

1@>>>>>>>>>>?=>98>>>?>>>>>>>>==<:9<>>>>>>>>>??;4>>?>>>>>>>>?>>@)
+
+
+


+
+
+																																						
+6@??>>>>>>>>>=>
 >>>???>>>???>=<==<=>?>>>>>????>=??>>>>>>>>>?>?;	
+


+
+																																								
+<A@???>>>>>?@@@5;?>>>???>>?>?@@HKKG?@@????>???>????>>>>>>>?>>??@!		

																																									
+

@AA??>?>?>>?@@@@?>>>??>>>???>DVXUU[SF>?@??>??>>>??>>>>>>>??>>>>@+
+		
+
+																																									
'BAA??>?>>>>??@@?>>>>??AC???>EUSSROTY]B?@@?>>??>>>?>>>>>>>??>>>>@1

+

																																								
/A@@???>>>>>???@>?>>??@OYQJGFULLROOSQ[P?@@?BC>???>?>>>>>>>?>>>>>@5
	
+
+	
+	
+																																				
+
+4A????>>>>?>?>??>?@????FSI at CW]RTVSTVWY`M?@F[WD??@?>?>>>>>>>??>>?@9

+

+	
+																																					
+
+7@????>>>>????>>>>>>?BHUdQ3CfbYZUSTUZ[b]?=FaWWM?>>>??>?>>>>?>>>>?>
	
+




+
+																																			
9@???>>?>>>?>??>??>>?AE_ytdisfYUUTUTWYhuP=JZLIH@>?????>>>>>?????>A 		
+		


+	
+
+
+																																	
+
9@?????>>>?????>>????>AY{yz~o_X^SPWYclxuZZXA>?????????>>>?>????>A)
+				

+
+
+
+
+																																		
+
8@??>>>???>>>??>??????M\dvzZBFGIGIDFGBPtxi_[E????????>>>>>>????>A0
+	
+


+
+
+
+
+																																		
+
6A??>?>???>????>??>??>N]SgpqC<<>>??=;<>Gs{o_bV?>????????>>>>>???>A3
			


+
+
+
+
+
+																																	
+

5A???>????????>???????C\USZ]R=>?????=<F]Z^_Z^T@?????????>>>>>???>A3
+			




+
+																																			
+

3A???????>????????????>DX[]YZP??????=CY[Zdc_\G??@???>????>>?>>?@>A/				
+



+	
+																																		
+

1A?????????????????????>>BBJZbTC>?>?GYbRDGLF@>???????????>>?>>???B'
+			


+
+


+		
+																													
+	
1B???????>???>???>??????>>?>@Qc_OFFT]ZG???>>?>>???????????>?>>??A@
+			
+


+



+												
+
+																			
+

8A????>?????????????????>>????G]`XW_YD?@@????>??????????????????@-
			
+
+



+	
+																																
+


>@???????????????????????>?????AYWYVC>?????@???????????????????A6

+	
+




+
+
+																																
+	

$A@??????????>????????????>????@?BTYC>????????>???????????>?????A6


+		



+
+
+
+
+												
+																			

'B?????>????>>>>>??>??>???>>?????=>@=>????????>>??????????>>????@?)


+		


+
+
+
+											
+
+																			

$C???????????>>>>???>???>>??>??>?>?>???>>????>>>??????????>?>?@?@B2



+	
+

+
+
+
+
+										
+																			
+A@>????????????>>?????>>???>>>>???????>?>>?>>>???????????>??????B3


+



+
+
+
+
+
+										
+																
+	8B>???????????>>????>?>?>???????????????>>>?????????????????????C/
!
+
+




+
+
+
+
+
+
+							
+
+																		

(A@??????????>>>????????>??????????????????>?????>?????????????@A11/

+



+
+
+
+
+	
+
+					
+
+																
+
+	

+
<B@??????????>?>???>????????????>?????????>??????????>>?????@?A?;=7#




+
+
+
+
+
+
+
+
+
+		
+
+	
+														
+
+	

+
6B@??????>>>>?>>>>?????????????????????????????>?????>??????@@A at AA<(
+



+
+
+
+
+
+	
+
+		
+	
+															
+
+	


6A@@??????>>????>>>??????????????????????????>??????????????@AAABB>,	
+


+
+
+
+
+
+
+	
+
+	
+
+
+	
+												
+	
+	

8AA@????????????>>>>???????????????????????????????????????@@AAA at B>1

+




+
+
+
+
+
+
+
+
+
+
+
+	
+																
+
8BA@@????????????>>????????????????????????????????????????@AAA@@B?5 
	



+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+														
1CB@@@@??????????>>>????????????????????@????????????????@?@AA@?@B at 5 





+
+
+
+
+
+
+
+
+
+
+	
+
+																"AB@?@@??????????>>>>>?>????????????????????????????????@@?AA@??@B?2

	

+
+
+
+
+
+
+
+
+
+
+	
+
+		
+											
9CA??@@?????????>??>??>>?>?????????????????????@??????@??AA@???@B=+
+	


+
+
+
+
+
+
+
+
+
+	
+
+
+
+				
+							
	$BA@??@@???????????>?????>???@@?????????????????????????@A@????AB9#	





+
+	
+
+
+
+
+
+
+	
+
+
+			
+									6CA??>@@@???????????????????@@????????????@????????@@??A@?????AA3


+


+
+
+
+
+
+
+
+
+	
+
+												
+	
	?B@?>??@@??????????>???????????????????@?????????@???AA@????@B?-
+



+	
+
+
+
+
+
+
+
+	
+
+									
+	
+	)BB@????@@????????????????>??????????????????@@@??>?AA@@???@AB;$

+
+
+
+
+
+
+
+
+	
+
+
+
+
+						
+			

4CA@?????@@@??????????????????????@???????@@@@??>@AAA@????@B at 0


+
+
+
+
+
+
+
+
+	
+
+
+										
+		
	9CA@@?????@@@???????????@@???@@???????@@@@@??>?@AAAA???@@AA6
		


+
+
+
+
+
+	
+
+
+
+													
+

+:CBA@@@????@@@@@@@@@@@@@@@@@????????@@?????>?AAAAA@?@@AAA8!

+


+
+
+
+
+
+
+
+	
+												
+	
+

!9BBAAA@@??>?@@????@@@@?@@@@???????@??@????@AA at ABAAAABB?5


+
+
+
+
+
+
+
+
+	
+												
+
+	
+

5 at CBBBA@@?????????@??@@@@@?@@@?@@??@???@ABA at ABCBBBA?:-

+
+
+
+


+
+
+
+												
+
+		

,;BCCCBBAA@??>????@@???@@???@????????@BB@=?AAA@=:4, 







+
+
+
+												
+
+		

+
+ 2>BCCCBAAAA@??????????????????????ACB9369840*#


+	
+
+	
+
+	
+
+
+											
+
+
+
+

			!4=@BBA?@BBBAA@????????????????@BC=,!%(#

+	

			
+		
+
+	
+												
+
+
+
+


+	 ,49<<99;>ACCBBBAA@@@@@@@@@ABC at 1



+

+		
+
+
+
		
+									
+
+	
+
+
+
+


	
"(*))*.39<?ABCCCCCCCCCCA</

				

+
+
+
+					
+
+
+												
+
+
+
+


+	

!&*/3789974/'

																
+									
+
+
+
+
+
+
+
+									
+






+														
+
+			
+
+	
+
																	
+
+	
+	
+	
+
															
+
+	
+
+
+
+
+																						
+
+
+	
+
+	
+
+
+
+																									
+
+	
+
+
+
+
+
+
+		
+
+																												
+
+
+
+
+
+

+
+
+
+
+																															
+

+
+
+

+
+
+
+
+																																						
+
+
+
+

+
+
+
+
+																																											
+


+


+
+
+
+																																											
+
+
+





+
+
+
+
+					
+																								
+
+
+
+
+
+	


+
+																								
+
+
+




+

+																												
+
+









+																									
+
+










+																		
+
+








+															
+
+




+										
+			


+			


+				
+
+		
+














+
+
+		
+									
+			

+
+

+
+
+	
+
	
+			
			
+
					
+

+	
+
+
!+22.(!
		
	+8=>=>>>=:.


+

							
6?===<=<<<=>8"
	
				
+7><<====<===<>=,
+	
+	
+
!;><<<<==<===<===?3	

				
+	
+)=><===<<<<<=======?7



+	
+
+	

+-?>======;:99;<======>9

+
+		
+
+
+	
)?===>>=;;DV`aR@;===>==?;

+		
		
+ =>=>>>;>Tq}uxzutW>;<=>>=?:

+
+

+	
				
+7>=>>><Sz~tkLcmR]vqL:<>>>=?7
			

			

,?>>>><Z�iSRW\imN_Sa}cB<?>>=?2
	
+		


			
+
+
=>>>=<^�fii\d���ldNJ]tyF=>>==?(
+	
+

	

	
+	
(-5?>>><]�VHm��������mQWRtt?>>>=?:
+	
+

							
3E?>>>=Q�d?V�rPFDDEL_w~n\X}c=>>>>>!

+										
	8?>??A~}Sl�oC>????>=B]�yMS�Q=>>>?,
+	
+
+				
+	
+
+	
.?>??>V�}��m@>?????@???_�Y;i�D>>>??3
			
+

+
+

+
+
+
+	
+
+
+	%?>=>?>c���`>???????????As�PH�e=?>??@<$
	
+			
+

	
+
+
+;?>>>>=ZwkK=>???????????>E��Wr�F???>>?>&
		


+
+		
		
+

		
+
+
1@>>>==;BD<;=>????????????=I����Z>??>>>>>$
	
+


						
+

+		
+	
&?>>>===;:<<==>>>???????????=G���h?>>>>>>>=!
+

+


+							
+
			
+
+	
+%?>>>======>===>>>>>?>??????>>9 at i{_>=>>>>==><




+										
+
				
>?=>>=>====>>=>>>>>>?>?>?>>>>>>;:CB:<===>==<>9
	
+													
+
+	
+
+	9?>>>>===<=>>>>>>>>>>>>>>?>>>>===;::;<<>>>>>==>3
+																
	
+	
2@>>>=>=>===>>>>>>>>>>>>>>>>?>>=====<<=<=>>>>>>==5B


+																	
+
		
+'?>>>>>=====>>>>>>>>>>>>>>>>>>?>===>===<=<==>>>>>=CM!		
+																				
+
		
=>>>>>>>>>>=>>>>>>>>>>>>>>>>>?>>==>>=========>>>>=>C



+																					

		7?>>>>>>>>>>==>?>>>>>>>==<===>>>>>>>>>>>>===>>>>>==>.

+
																								

+
+
+)@>>>>>>>>>>>>=>?>>>=>=>=@OD=>>>>==>>>=>>>===>>>>>>=?4


+

+																									
+
		;?>>>>>>>>>>>>>@@>>>>>>@CJUKEDA>===>??>>>==>>=>>>>>=?:

+



+
+	
																											

			%@>>>>>>>>>>>>>>A@==CD?>>CE@@DB>>BC>=@A?>>==>>>>=>>>>?=#
		



+																												
+

+			
0@>>>>>>>>>>>>>>?>=@E@>>>========?FA=?@>>>>>=>>=>>>>>>=(
	
+	
+
+		

+																														
+

+
1@>>>>>>>>>>>>>>>>>?>=>>>======>=>?@=>>>>>>>=>>>>>>>>>?,

	
+


+

+																															
+
		5?=>>>>>>>>>>>=>>>>>>>>>>====>>>>>>><=>=>>>>==>>>>>>>>?5
+

+

+	
																																	
+

+	'?>>>>>?>>>>>====>>==>>=>?>==>>===>>><<>==>>>>=>>>>>>>>?8
+
+	
+		
+
+																																	
+

"?>>>>>>??>>>><=>=>>>==>>>>?>=======>====>=>=>>>>>>>>>>>?3	
		

+																																			

	<?>>>>>>>>>>>>>>>>>>>==><=>;9:====>>><=>==>>>>>?>>>?>>>>?-
				
+
+																																				
+

++@>>?>?>>>>>>>>>==>>>??<,
.#99:=>=63;>??=>>>>>>==>>>>>>>;
+			
+																																				
+
+
+
+
9?>>>>?>>>>>>>>>>>>>712)

0=8//,"
*;=@C>>>>>>>>>>>>>>?>?<				

+																																					
+

>>>>>?>>>>>>>>>>>?>?;4.9<99>@@??=6-$/:<;>F@=>>?=??>>>>>>??>?>
		
+	

+																																						

 @>?>>>>>>>>>>=@>8?>????>>??>===>>?@@?>>>>EE>?8/>>?>>>>>>>?>>?:		
+


+																																					
+
+
	&@>?>>>>>>>>>=>51>>>>>>=>>>>>=<;99;=>>>>>>AB>?<7>??>>>>>>>>>>>@)
+	
+



+																																						
+

/A???>?>>>>?>=>=>???>>>>???>=<<<<=>>>>>>>>???>=??>>>>>>>>>>>?9
+	

+
+
+																																								
9A@?>>>>>>>?@A at 3:?>>>??>>>???@@HNOK??@???>>?>>>????>>>>>>??>>??>
+
+

+
+			
+																																				
+
?@@?>>>>>>>??@@A?>>>???>????>CWXTSY[J>????>??>>>>?>>>>>>>?>>>??@ 			
+				
+																																				$BBA???>>>>>??@@?>>>>??>>>?@?BWTNMKLT]F>???????>>>?>>>>>>>??>>>>A'	


+			
+
+																																			
+-AA@???>>>>>>???>>>>?>DVMB?@@VVPRROQPYS?@???>??????>>>>>>>>>?>>>A.	
+
+	
+
	
+
+																																		
+
+4A????>>?>>>>>??>?????E\bG=?LgXYVTTTV\_F???ADEA???>?>>>>>>>??>>?@8			


+	
+
+
+
+																																		
+
7A????>>>>??>>>>>>>>?JT\lU2;_ocbWUUV\_bT?<>GJOH?>>>>??>>>>>>??>>??			





+
+
+																																	

8A???>>>>>??>>>>>>>>@FEGQWNNqu`[WVVWYYia@:>@A at A@?>?>??>>>>>>???>>A"	
+
+


+	
+
+																																	
+
8A????>>>>?>>??>>???>>BQdaXW^b`YZXWXU_aNB?>>@???????>??>>>>>????>A*		
+	

+
+
+
+
+
+																																
+
8@????>>>?>?????>?>>>?Odtwp]D>FKJMNIJKA=ACGGGA???????>??>>>>>???>A/
+		
+


+
+
+
+
+																																	
+

8@????>>>>>>??>>??>>??TZe{�g>=<=>>>=;;=>QbaZ\P@>?????????>>>>>???A0			
+		


+
+
+
+	
+																																
+

8A?????>?>>>???>??>??>N^V^ldL<=??>>?=<>RemohgcE>?????????>>>>>???B.	
+	
+		




+
+	
+																															
+
+

8A???????????????>>????Qb`c[VH=?????>=WgclonlZ@??@????>??>>?>>>??B&	
+		






+
+
+
+																																
+
:@?????>>?>??????>????>>DHFMU\N??????Yz]JNZYL@>???????????>??>?>@>

+		




		

+
+																																

?@?????>>?>>?????>??????>>>>BTdRD?@EUlQ>??==>>>>?????????????????*

+	



+	


+																																	
(B????>????????????>?????>?????L_VUVS`M=?@@?@?>>>???????????>???A9


+	




+


+
+
+																														
+	
0B?????>?>????>???>>>??>?>?????>GZQKVN>?????@????????????????>??@=.


+



+
+


+
+
+
+																												
+
+
2B?????>??????>?>?????????>?????=N[YR>????????????@????????>?????A>"

	


+	


+
+
+
+
+
+									
+																
+
+
+

.C????????>??>>>>>?>??????>>????>ETWI>>??????>>>??????????>>?>???@B&
+

+
+


+
+
+
+	
+		
+				
+
+																	
+	
!A@?????>>???>>>?>>??????>?????>???@@>>>?>????>??>????????>>?????@A*&%



+



+
+
+
+									
+																			
:B??????????>>>>????????>????>??>?>>???>?>?>>>???????????>??????@@5:3		
+



+
+
+
+
+
+																										
3B@???????>???>>????>????>????@?????????>???????????????????????A@?A;"
+	
+



+
+
+
+
+
+			
+
+
+
+
+															
+	

6A@??????????>>??????????>?>???????@??>?>???>??????????????????@AAAA?*	
+



+
+
+
+
+
+
+
+			
+
+	
+														
+	
!<A@??????????>>>?????????????????>??????????>?????????????????@@AA at A@1	



+
+
+
+
+
+
+				
+	
+													
+
+	

!@B@@???????>>?>??>>??????????????>???????????????????>>???????@@A??@A8 






+
+
+
+
+
+
+
+
+
+
+
+
+													
+		


?B@???????>>>?>>?>>>?>????????????????????????>???????>??????@@@??>@B=)		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+														

=B@?@?????????>??>>>???>??????????????????????>??????>???????@@??>>?A?.
+		
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+														
7B@?@@???????????>????@????????????????????????????????????@?????>>?A at 1
+			
+
+
+
+
+
+
+
+
+
+
+	
+
+													

+,B@??@????????????>??????????????????????@???????>???????????????>>?A at 3		




+
+
+
+
+
+
+
+	
+
+
+
+				
+
+					
	
?A??@@???????????>?>>??>??????????????????????>????????????????>>>?A at 2	
+




+
+
+
+
+
+
+
+	
+
+					
+						

3B???@@?????????>>>>??????????????????????????????????????????>?>>@A>/		
+



+
+
+
+
+
+
+	
+
+			
+								
+
"@A????@@?????????????????????@???????????????????????????????>>>>@A;(
+

	
+
+
+
+
+	
+
+												

3B@????@@????????????????????@??????????????????????@@@????>>>>>?A at 6



+	
+
+
+
+	
+
+
+											

 =B?>>>@@@?????????????????????????????????????????@@@????>>>>>>@B>-	
		
+
+
+
+
+
+
+											
,AA?>???@@@?????????????????????????????????????@@??????>>>>>>>AB9



+
+
+
+
+
+	
+
+
+				
+					

+6B@?>????@@@???????????????@???????????????@@@@@@>>??>>>>>>>??B?-


+
+
+
+
+
+
+
+
+
+	
+
+
+							
	
<B@???????@@?@??????@?@?@A@???@@??????@@@@@@????????>>>>>>??A at 2		

+
+
+
+
+
+
+
+
+	
+
+
+							
+
"@B@???>????@@@@@@?@??@@@@@@@?????????@@@???>?>?@@?>>>>>??@AA2
+
+

+
+
+
+	
+
+	
+
+
+		
+							
+
,BBA???????????@????@@@@?@@??????>>??@?@??>>?@@@???>>>??@BA0
+
+

+	
+
+
+
+
+	
+
+												
+
. at CA@??????????????@???@@@@@?@@@?@?@@??>??@AAA@?????@@AC<*	





+
+	
+							
+					
+

+?CBA@?????????>?????@???????@?????????@AAAAA@@@AAAABA7
	


+
+	
+
+
+										
+
+	
+

"7ACBA@@@@@@???>>???????????????????@BBAABBBBCCBA@>8*	

+		
+	
+
+									
+	
+	
+


+'7 at DBAAAAAA@@@??????????????????@ACB==@CCB?;5/,'!


+		
+
+
+											
+	
+
+	
+



+
+
/>CCBBBBBBBAAAA@@@@@??????@@ACC9))2883'



+


+
+
+
+

	
+										
+
+
+	
+



+&5=ACDCDDDDDDCCCBBBBBBBBCCA9%
		

		






+
+
+
+
+											
+
+
+
+
+
+

	

&-1333468:=>????>=;83*

+
+		


			

+	
+
+							
+
+
+
+

+
+
+
+		






											
+
+					
+
+
+

+																							
+		
+
+
+
+
+
+


+
+
+																							
+
+	
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+																				
+
+
+
+
+
+

+
+
+
+
+
+




+
+
+
+																												
+
+
+
+
+

+
+
+
+
+
+
+
+
+



+
+
+
+																																		
+
+
+

+	
+
+
+
+
+
+
+
+
+
+




+																															
+

+
+
+
+
+
+
+
+
+
+
+





+																																			

+
+
+
+
+
+
+
+
+







+																																		
+	
+
+
+
+
+









+																																
+
+
+
+

+
+
+	
+
+
+











+

+
+
+
+				
+
+
+
+
+
+								
+
+









	
+











+
+
+
+
+
+				
+
+
+

+
+			
+
+
+













+	
+
+		
+
+
+


+
+
+
+
+
+		
+
+


+
+		
+















	
+
+
+






+
+
+
+
+
+


+			
+








+





+	
+
+




+
+
+
+
+
+
+				
+




+
+





+		
+
+
+
+
+					
+







+						
+


	

+	
+
+
						 [...]
+		
+


+







+

+

+																		
+
+	
+
+		
+
	
+	
+			
+
+	
+				


+						
+	
%$

+

+
	
 .8<>=<:71"	
							
/=>>======>=/
	
					0>=<====<<<<=>9%
			
+	

7><<<<=========>=+


			
+	
$<><<=<<<<=========>3

+
	
+	
+	
	
&>><====<;:99;=======>6
+	
	
+
+	
+<=<===;:?KY`_PA;<<====?6


	
			
+8=<=>=;Ji�z{�~{`B:<>>==?4
	

	

+		
+
+?<=>=>c��i]P]q^`z}V<<>>==?+

+
		

			
+
<>>>=>i�nTNNMZoSORc�uG=>==>=!		
+
+	

	
+		
+
0@>>=?o�^LRPao{aRRHU|�E=>>=?7
			
+

	
+	
;?>>=e�dGOu�������bDFQ}n>>>>>?%	
+		
+

			

+
2;7>=>>I��]r��hOIFJZv�|R?T�\=>>>@-
		
+
	
+
+	
+		
+
+%>>>>>>_����xI=>??>=>Q��`Dn�K=?>?<$
+	
+					
+
+	
+
+	
;>>>>?d���Z?>???????=E|�gV�u@??>@@2
+
+	

+	

	
+		

	7?=>>>=QbUC<>????????@>Dy�x��N>???>@8

+				
+

+					
+	
+
	
,@>=>>=;=<;==>>???????@?>Bn���^>??>>>?9
+	
					
+

		
	 >>>>>>><======>>?????????>?c��]=>>>>>>?7
+

+		

				
+
		

+	;?>>>=>>>>>>===>>>>>>?>>>>>=<QdP<==>>>>=?5		

+
+

+					
+
		

+8@>>>>>>>>>>>>=>>>>>>>>>>>>=><;==9<====>=<>2	

+								
+

+	
+
+2@>>>>>>>>>>>>>>>>>>>>>>>>>>=====;;<==>>>==;?+
+
											
+

+
+	
)@>>>>>===>>>>>>>>>>>>>>>>>>>>=>>>=<==<>>>>====!
	
+														
+
	
+	
>>>>>>>===>>>>>>?>>>>>=>>>>>>>>>=>>======>>>==>3


																	
+
+			9?>>>>>>>==>>>>>???>>>====>>>>>>>>>>=====>>>>>=>;=?
+
																		
+
				3@>>>>>>>>>>>>>????>>>===<<=>>>>>>?>>=======>>>>=>K>	

+																			


+	'@>>>>>>>>>>>>?@?????>>CMVNFA>=>>>??>>=>>===>>>>>==="	

																							

		;?>>>>>>>>>>>>?A@>>=>HSUX_^XXTC==>?@>=>>>>>>>>>>>=>4

	

+																							
+

+	
+
+(@>>>>>>>>>>>>>?A@>>?ANYZYXXZ]ZK>=>?A?>>>==>>>>>>>>?8
+

	
+	
+
																									
+
		4@>>>>>>>>>>>>>>?>>@IEDLMHAAGNOHMC=?A?>>>>==>>>>>>>?8

+
+
+


+	
	

+																											

			6@>>?>>>>>>>>>>=>==@A?==<<==<<=@IF>=>>>>>>>=>>>>>>>>;
+			


+

																													
+
	
+	4?>>>>>>>>>>>>>>>=>>>==>========>BB>=>>>>>>=>>>>>>>>?*

+
+
+
+		
+	

+																														
+
			$>>>>>>>>>>>>=<=>=>?>===>>>=====>=>AA>>=>>>>=>>>>>>>>@4
+	


+
+		
																															
+
		
+&?>>>>>>?>>>>><=>>>@?===807<<<======?FB>>>=>>>=>>>>>>>?3
+
+
+

+	

+																																
+

+!?>>>>>>>>>>>>>>>=>@A><=?:"1<:====>>>EI>>>>>>>>>>>>>>>?/	
+
+					

+																																	
+

9?>>??>>>>>>>>>>>=>EA>>;17-
7;<<=<<=;@OC=>>>>?>=>>>>>>?<

+
+		

																																			
+

	"@>>>??>>>>?>>>>=<>?G???7
&'
':;<=<0%9<>LJ=>>>>>>>>>>>>>>?>'
				

+																																		
+
+
+
+
+
+0@>>>???>>>>>>>>?>=DB'(14)0-4>?>>=:) ;=:BP?=>>>>>>>>>>???>>@+
			


+																																			
+
+

8?>?>?>>>>>?>>>=;??FB2,7==?@@????>=73;;8=KB=>>>>??>>>>>???>>@#		
+


+																																				
+

<>??>>>>>>>>?>@<4??DB??>>>>=;<<==>>??>>>>EE>?8->??>>>>>>>>>>?:		


+																																				
+
+

@>??>>>>>>>?>>2,>>>>>>=>=>>==<<;;<<=>>>>>AB>>=9>??>>>>>>>>>?>@$	
+
+



+																																					
+
+
+,A???>?>>>>?>=? =?>??>>>>??>>=<<;<<=>>?>>>>?>?>=??>>>>>>>>>>?@2

+
+


+
+
+																																					
+	9@????>>>>>?@@A:;?>>???>>>???@BIOPNB?@?>??>>>>>?????>>>>>>>>>?@9	
+
+
+
+			
+
+																																			

@@@????>>>>??@@@?>>>????????>JXTPQUYM????>>??>>>>?>>>>>>>>?>>??>			
+
+																																			%AA@????>>>>??@@?>>>>?>>?????CYPKJJJPZK>???????>>>>>>>>>>>>>?>??A		
+
+	
+
+
+																															
+
+	/AB@????>>>?>???>>>>>>EG????@U_SOONPSXU@??????????>>>>>>>>>>??>>A-		
+		

+	
+				
+																															
+
+
+5A????>>?>>>>>>>?????CVZL?>?Ige\YXXW[b_E@@??>@A??????>>>>>>>>?>>@9					


+
+

+	
+																													
+
+
+
7A????>>>??>==>>>>>>?RSLG at 0:Rnhb^\\\`ebLA=>>?>@??>>>???>>>>>>??>?@		
+		





+																																
+

8A????>>>??>>>>>>>>>?DABID==Md`_ZWYZ\^_OA9>????@?>>>???>>>>>>>??>A#	
+
+	
+


+
+		
+																												
+	


:@????>>>??>>>>>>?>>>>AXliR?AT]\XVXWW_aI??BJE??@????????>>>>>>>?>A*		
	
+

+
+
+
+	
+																														
+<@????>>>>?>??>>>??>>?J]_fjT?@HRQRSNPSI?@HQUPB??????????>>>?>>>??A-	
		


+
+
+
+	
+																													
+
+

=@????>>=>????>>>>?>>@WbaZc]B===???===>?G\a`[M@??????>???>>?>>>??B*
+	
+	



+

+
+
+																													
+
+

>@???>>>>>?>????@?????UadjoaE;=>>>>>=<>DSbbZX[G>>????????>>>>>>??B"


+
+
+



		
+
+																													
+
+


@@???>?>>>?????>??>??>C`knn^[D=?>???><G\demih]D>>???????>>>?>>>?@:


+	

+
+


+		
+
+									
+																			
+
'B?>??>?>>>?????>>?>???>@MSQRYcJ=>??>=MhZLMW]TC>>?@????????>?>>???*


+	


		
+
+	
+							
+																			
+
+0B???>??=>???????>>?????>===>CViR@>=?QiP?>?>=>>>?>??????????????@=.

+	


+


+
+								
+																		
+
+
+6B???>??>>???????>????????????>KeVKKVeL>??@@@?>>>?????????????????>,

+


	
+


+
+
+							
+
+																		
+
+
+8B??>>>>>>????>>???????>?>??????IXRQWR>????????>?>???????????????@C6
+

+
+		



+
+
+
+
+																								
+
+
+
0C@????>?>????>>???>>??>?>??????=PUNUB????????>>???????????>>>????A8$*

		
+



+
+
+
+
+
+
+	
+	
+	
+																
+
+
+
!A@????>>>??>?>?>?>>??>??>??????@TTSUA????????>>>??????????>?>>???A;8;-

+		



+
+
+
+
+
+
+
+		
+
+																
+
+
+
+

=B?????>?>??>>>??>??????>?????>@NOOQE>???>??>>>?>>???????>>??>???@?AA8

		




+
+
+
+
+
+
+
+
+
+
+
+															
+
+
+
+
*>A?????>>>>?>>>>????????>???????EA at A?>??>>?>>>>?>????????>??????@AA at A>'	





+
+
+
+
+
+
+
+	
+
+															
+
+
+
6AA@?????>???>>>>????????????????>>>>????????>>???????????????>??@A@?@@3
	




+
+
+
+
+
+
+
+
+
+
+													
+
+	
<B@???????????>>>?????????>??????>>??????????>???????????????????@@??@A:!	
+


+		
+
+
+
+
+
+
+	
+												
+
+
+
>A@???????????>??>????>?????????>?>????>?????>???????????????????@?>>?A<(






+
+
+
+
+
+
+
+	
+											
+		
+

?A?????????????>>>>>?>>??????????????>??????????????????>???????????>?@?3

		
+

+
+
+
+
+
+
+
+
+
+									
+			
+
>A??@???????>>>?>>>>>>>>>??????????????????????????????>????????@??>>>@A:$
+	


+
+
+
+
+
+
+	
+		
+								
+	

;A??@?????????>???>>?>>?>>?????????????@??????>????????????????@@@??>>?A=)
		
+

+
+
+
+
+
+	
+
+
+
+						
+
+		

6B??@?????????>??>?>>???????????>?????????????>??????????????????@??>>?A=,
	
+
+

+
+
+
+
+
+	
+
+	
+					
+
+		

0B@??@??????????????>?>>?>?????????????????????????????????????????>>>?A=,


+	
+




+
+
+
+	
+
+
+
+				
+
+			

*?A??@?????????????>>?>??>>????????????????????????????????????@???>>>?A=,

	



+
+
+
+	
+
+		
+
+
+
+	
+		
+
 :B@???@???????????>>??????????????????????????????????????????@???>>>?B=-
		



+
+
+	
+
+	
+
+
+
+
+				
+
1BA?>??@??????????????>????????@?????????????????????????????@??>>>>>@B;+	
+
+
+
+
+	
+
+
+
+
+		
+				
#=B?>???@@?????????????????????????????????????????????????>???>>>>>?AA7%
+	


+
+
+	
+
+
+
+
+	
+
+				

0AA?>>???@???????????????????????????????????????????@@??????>>>>>?@B>/


+
+
+
+
+
+
+
+
+						
+

!9B@?>>?@@@@??????????@???????????????@????????????@@@@??????>>>>>?AA6"

+
+
+
+	
+
+				
+
+			

(=B@>?????@@@@@????????@????@???????@??????????@@@@???>???>>>>>>>@B=+	
+

+
+	
+
+
+
+
+	
+
+
+		
+	
+

+,?B??????????@@@@@???@@@@@ABA@@@@@@@@@@@@?@@@@@@???>>?>?>>>>>>>?A at 2


+	
+
+
+	
+
+
+		
+
+		
+
- at A?????????@??@@@@@@@??@@@@@@@@?@??????????????>?>?>>>>>>>>>@B at 4

	
		
+
+	
+
+
+		
+
+
+			

1BA????????@???????>?@@@??A@??????>??????>??>???>?>?>>>>>>?@B?3

	

+
+

+		
+			
+
+
+
+
+		
+
7CA@???>??????????????>?@@@@@?@???@@@????>>>????>>>>>>>??AB<-

+



+
+
+					
+	
+			
+
6BB@???>?????????????????????????????>>>??????>??>???@AB at 6$
+


+		
+
+											
+

0?CA@@??>?????>>??????????????????????@@@@????@@@@AABB9(

+

+		
+
+							
+
+		
+
	 4ACBA@??????>>???????????????????@AAABA@@@ABBBBBB@;)
	
+		
+	
+									
+		

	
+
1;@CCA@@@????????????????????@ACC?@CCCCC@<81-+(#
+




+
+

+					
+			
+	
+
+
+
+



$3 at CCBBAAAABABAAABBAAABBBBCB7$
+7:94)








							
+
+		
+
+
+
+
+

	
+(5;?@BBBAAAAAAAA@@?>=:6-

+


	






+
+	
+							
+
+
+
+
+
+
+
+
+
+	
+



		












+		
+




+

+
+			
+
+	
+					
+
+
+
+
+




+
+
+
+
+


+						
+
+
+


+



													
+
+		
+
+
+
+
+
+	












+	
+
+



+								
+
+
+
+
+
+										
+
+	
+
+	
+
+
+
+
+
+

+
+
+
+
+
+













+	
+
+																				
+
+	
+
+
+
+
+
+


+
+
+	
+
+
+
+
+









+		
+
+																														
+	
+
+
+
+
+

+
+
+
+	
+
+
+
+
+
+
+
+





+
+
+
+
+
+										
+
+
+																						
+
+


+
+
+		
+
+
+
+
+
+
+
+
+




+
+
+
+
+											
+
+
+																					


+
+
+
+	
+
+
+
+
+
+
+
+
+
+




+
+
+
+
+									
+
+
+
+
+																			


+
+
+	
+
+
+
+
+
+
+
+
+
+
+



+
+
+
+
+
+					
+
+
+
+
+
+
+
+																
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+




+
+



+				
+




+
+										
+
+
+
+
+
+
+

+
+
+	
+
+
+
+
+
+
+
+
+
+
+










+










+
+
+
+
+












+
+
+

+




+






































+	
































+


+





	
+

























+

+


+
+
+


		
+





















+






+		
+






+
+




+





+
+
+		
+





+	
	
+	
+
+	
+
+					
+		
+













+					
												
+												
+
+
+
+			
+					
+
+	
+	
+			

	
+		
&0541-( 	
+
+		
+			

/:>>>=>>>=5 
	
+					"9>==<<=<<<=><-
+
+		

+-=><<=<===<<<==?8!

+
+	
+
6>=====<=========>=+

+
	
+
+

+	9><===<<;;;;<=======>/
	

+
+
+		6>====;<CLSWTI?:;=====>,
		

+						
*>===<;Sy������{dE9<>===>'
	

	
+

+	
;=<><@p�x`WRYc\d~�b><>==>;

		
	


	
+

+?<<=Bw�hPFMPW^SJPh�{F<>==?1
	
	
+

+

		
+
+;>;;?o�pVTgwxyqfWOEX�{B=>=>="	
+	

	

			
+.>=><O��v~��������wWH]�j=>>>?.
	
+


+	
+			
"'===>=_����mTIDBFUn��hUy�U=?>?7

+	

+		
+		
+		
6A8>===>]|�rN?=>???>>Kw��p�|B??>?:#

					
+
+
+
+
<?>>>>=IJC>=>???@@@@>Ah����O>?>>??,
	
+	
+					
+
+

+	"==>>?==<;<==>>????@????T~��X>>>>>>?/

+		

	
+					
+
+	

;>>>>>>>>>====>>>>???>>><DcqR=>>>>>>?/
		
+
			
+

			
+
	6@>>>>>>>>>>====>>>>>>>>>=<=GB;=>>>=>=?+

+		
+			
+
	
+
	
/@>>>>>>>>>>>=====>>>>>>====<;::=>>>>==<=&
+
+
		

				
+
		
	
+'?>>>>>>>>>>>>>>>>==>>>>======>=<<===>=>=>="				

+						
+
		

+
=>>>>>>>>>>>>>>>>>>==>>======>>>=<===>>====:

+
+									
+


	
+
+8?=>>>==>>>>>>>>>>>>===>=>>>=>=>>===>=>>>===?0	
+											
+

+
+0@>>>>>=<=>>>?>>>?>>>>===>>>>>>>>>====>>>>>==>=

	
+
+														
+
+	
+	
+(?>>>>>>>==>>>?>>???>==<==>>>>>>>>>=====>>>>>==?*	
+																
+
+			>?>>>>>>>==>>>?????>==@?<<<=>>>??>>>=<<==>>>>>=>8E(	

+																	
+	
+8@>>>?>>>>>>>>?A@??>@JVac]YQE<>>?@?>>====>>>>>>>=CB


+																				
+
+	
+
+'@>>>??>>>>>>>>?@?>=?S[VPPVXYYM==>@?>=>>>=>>>>>>>=4
		

+																					
+

+			5@>>>>>>>>>>>>>>??=CHWTD?=>@IWUHA>@>>=>>==>>>>>>>>-
+
	

+																							
+
	
+	9?=>>>>>>>>>><=>>>CXWKE?>=>>@LO\UA>>>>>>===>>>>>>?3	


+

+
+

+	

+																									

		5?>>>?>>>>>>=<>>>EPSD>>>>>>>>>CTYM@>>>>>>==>>>>>>><
	
+
+
+



	

+																												

+			
;?>>>>>>>>>>==>>EPQB=>>>>>===>>ARVK?>>>>>>>==>>>>>@-
	
+


						

+																												
+
	
+		
&=?>>>>>>>>>>=<>=?KRE>>>>>>>>>=>>=CVSE>>=>=>>=>>>>>>?2
+
+	
+

+			

																														

	
+)@?>>>>>>>>>>>>>>=EQG=;8,"&4=76;>>>=ETM?>=>==>>>>>>>>?1
+
+		

+			

+																														
+
		
>?>>>>>>>>>>==>>=>LL><1-*

976275649HOC=>>>>=>>>>>>>><
	
+
	
+
+
+

+																																
+

+
3?>>>??>>>>>>>>==>?PD>>=:=851;<;95')2;?JD=>>>>>=>>>>>>>?>)

				


+																																	
+

=>>??>>>>>>>>>>===CL57?>>??>???>>>95=?>CD>=>>==>>>>>>?>>>@3	
+
+


																																	
+
+
+
+	#@>>>?>>>>>>>>>???=F>.>?@@@??@?>>>=>=99?===>>=>>>>>>>>>>>@0
			


+																																			


+,@>?>>>>>>>>>>><6>>D>0-2=?>=<;<=>??>==;77<>====>?>>>>>>>>>>>?!		


+																																		
+
+

+7????>>>>?>>>>@:.>>@@@??=>=<;<<<<==>>=>>>??=?8(=?>>>>>>>>>?>@6		
+


+
+		
+																														
+
+
+
+????>?>>>>??=>.'>>>>>>>==>>==<<=;<<===>>>?>>>>;>?>>>>>>>>>>>?>	



+
+
+
+																																	
+
+	
+,A>??>>>>>>>=<>%
<>>??>>>>?>>>=<<<<<=>>>?>>?>>>>=??>>>>>>>>>>>A&			


+			
+
+																																		
+	9@????>>>>>???@?>?>>???>>?>>?@BIMOMB?@??>?>>?>>?????>>>>>>>>>>@1

+	
+
+
+																																		
?@???>?>>>>@@@@?>>>>?>???>???MTSPRUZM@>?>>?>?>>>>?>>>>>>>>>>>??:	
+			
+	
+
+																																	
&B@@?????>>>?@@?>>>>>????????E[VTWWVYbJ=???????>>>>==>>>>>>>>>>?@
	

+	
+	
+
+		
+																																	/BCA???>>>>>>???>>>>>>@??>??MMZ\[ZYZZZKB@??@??????>>>>>>>>>>>?>>A.

+
+	
+
+
+

+
+																																
+	
+5A@???>>>>>>>>>>????>HPB>?>A]PV^[VTTVQGOC?????@???>??>>>>>>>>>>>?;
+
+

+
+
+



+

	
+																												
+
+
8A????>>>?>>==>>>?>>>KK@=?1<YRU[XTRPQNGWH<????@??>>>???>>>>>>>>>>@		
+
		




		
+																											
+
+
;@????>>??>>=>>>>>>>???CNH>>QTVXTPOMNNL\I7>????@??>>>?>>>>>>>>>>>A#		
	
+


+
+		
+																												
+>@???>>>>>>>>>>>>>>>?>D^ecV at CU^\TQPRRUX[E>AID??@??>?????>>>>>>>>>A'
+
	
+


+
+
+
+	
+
+
+																											
+?????>>>>?>>??>>>?>>>>Jdix{\?CS^TMJLNSNB=HTRQC??????>?>?>>>>>>>?>B%
	

+



+
+
+		
+
+	
+																									
+
+
@???>>>>>?>???>>>???>?NZ]o{tN=?AA@@????=OjiZSRB??>???????>>?>>>>?@



+
+	





+	
+
+
+																										
+
+
#B????>>>>?????????????TeY[fkZ>=???>?===IgrneWWD>>????????>??>>>?@5


+
+
+		



		
+
+
+																										
+
+-B???>>>>>>>???>?@?>???Bcri_WWE>?????>>EVVW]_YRA>>>>?????????>>???.

+	
+	
	
+

+		
+
+
+
+
+
+		
+																				
+
+5A??>>>>>>>?>???>?>>>??>@PRIIPMB?>??>>AGB??BIHA?>>?????????>?>>???9(
	
+		
+
+
+
+
+
+			
+																		
+
+
9A??>??>>???????>>?>??>>>===>@DDB>>>=?@?>???>??>>>?????????>>>???@B9

+	
+		
+


+
+
+
+
+	
+	
+
+	
+															
+
+
8B??>?>>>>?????>>>>>?>>?????????HJ@>GD????????>>?>???????????>????@?"$	
+
+		



+
+
+
+		
+
+
+
+																	
+
+
+

.B??>>>?>>??>??>?>>>>??>?>?????@APROZG?????>?>>>?>??????????>>???>??4:3


			



+
+
+
+
+
+
+
+
+																	
+
+
+

#AA???>>????>>>>????>??>?>???????GZ[SA@???????>>???>????????>>>>?>?@?A?-
	
+	



+
+
+
+
+
+
+
+	
+	
+															
+
+
+

+AA????>>?>?>>>>>??>????>>??????AOUWRC????????>>?>@?????????>>>>>??AA at A8!		
+




+
+
+
+
+
+
+
+
+
+															
+
+



<A@?????>>>>?>?>>?>?>?>????????>COSUSP@???>???>>??>????????>??>>??@A?>@>0
+





+
+
+
+
+
+
+
+
+															
+
+
+


*B@??????>>?>?>>>>???>>???>????>>BMOSOF????>???>>???>???????>????>?@@?>?A:&		


+
+
+
+
+
+
+
+	
+												
+
+
+
	3B????????>>??>>>>>?????>??>??????DDDC??>???>>>>>????>????????????????>?@>0



+
+
+
+
+
+
+
+												
+
+
+

+:A?????????>???>>>>???>???????????>>>>??????????????????>?????????????>>@@6#
+

+
+
+
+
+
+													
+
+
+

=A?????????????>>?>>??>>>?????????>>>>?????????????>??????????????????>>?@;,


+
+
+
+	
+	
+	
+						
+
+	


>A??????????????>>>?>>>>??????>???>>?>???????>???????>????>???????????>>?@?7-&


+

+
+
+
+
+
+
+								
+	
+">A???????????>>>>?>>>>?>>>>???>>????>??????????????????>?>?????????????>>@@<6/( 		



+
+
+
+
+		
+								
+%>A???????????>>>>??>>??>>>>?????>??????????????????????????????????????>>@@>;5.&
+	
+


+
+
+	
+
+
+		
+	
+
+			
'?A??@???????????????>??>??>?????>??????????????????????????????????????>>?@?<6/&
+	
+


+
+
+	
+
+
+
+	
+
+
+			

$>A???@?????????????>???>>???????????????????@???????@??????????????????>>?A?<7/%
	




+
+	
+
+
+			
+
+
+		


9B@???@??????????????>>>???>????????????????????????????????????@?????>>>?A?=;2%
	

+
+	
+		
+
+
+
+			

3AA?????????????????????>???????????????????????????????????????@?????>>>@A@=9. 


+	
+
+
+
+
+
+
+			
+
)>B?>???@????????????????????????@????????????????????????????@??????>>>?@A@;3&
+	

+	
+	
+
+
+
+			
+

8B@?>??????????????????????????????????????????>???????????@???>????>>>?AB>5'



+	
+
+
+
+
+
+			
+

,?B?>>>???@???????>??????????????????????????????????????@@@?>>??????>?@BA8(




+
+
+
+
+
+			


7BA?>>???@@@@?????????????????????????????????????????@@?@??>>?>??>>>?AB<+
+


+	
+
+
+
+
+			
+

&=B@?>>??@@@@@??????????@@????@@?????@@???????????@@@?@???????>??>>>?AB?1
	

+	
+
+
+	
+
+			
+
,?B@?>??????????@@@@????@@@AABAA@@@@@@@?@????@@@@@@??????>???>>>>>>@BA5
	
	
+
+
+
+
+					

+/>B@?>?>??????????@???@@?@@?@@@??????????@????????????>>>>>>>>>>?@BA8"				
+
+		
+
+			

+=B@?>>???????????>??>?@????@????>??>??>>>??????>????>>>?>>>>>?@BA8$
+

		
+	
+
+
+
+		
+

&=B@?>>>???????????????>>???@@@?????????>?????????>>>>>>?>>>?AB at 5"	



+				
+			
+

&>B@??>??>?????????????>??????????????>?>?>>>????>>>>>>?>?@BB=1

+
	
+				
+	
+		


&=BA@??????>?????????????????????????>>>??>>>>>>>>?????@BB>4%
+


+
+		
+	
+				


"6?BBA@@??>>>>?>???????>>????>>>>>?>????????>????@@AABA:1"

+

+
+					
+
+		
+

+$/:ACBBB@?????????????????>>????@@AAAA@@@@AABBBBAA at 6(

+

				
+				
+
+
+
+		


+
".567 at CBA@@@@@@@@@@@@@@@AA@@ACB=;?BBBBB@=:73-($




+
+	
+		
+		
+
+
+
+
+
+
+
+
+



+


.;ABCBCCCCCCBBCCBBAA@?;1&%+25773,% 	



+
+

+	
+
+
+	
+
+	
+
+
+
+
+
+
+


 %%%%#"! 

! 














+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+





















	
+
+
+
+
+	
+
+
+
+		
+
+
+
+
+









+
+
+









+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+





			
+
+
+
+
+

+
+
+
+
+
+
+





+
+
+
	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+























+								
+
+			
+


+
+



+
+
+
+
+
+

+
+
+		
+
+
+
+
+
+
+
+
+
+
+






















+
+										
+
+
+
+
+


		
+
+


+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+





















+
+									
+
+
+

+
+

+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+









+











+
+													
+

+

		

+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
















+
+




+											
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+













+







+					
+
+
+
+
+
+
+
+
	
+		

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


























+
+

+
+

+
+
+
+
+
+
+
+
+
+
+
+
+













+
+
+
+
+
+


+
+


+
+
+


+	
+



+
+
+
+
+
+
+
+













+

+
+

+

+






+
+
+		
+


+
+
+
+













+
+
+












+	
+
+















+
+









+
+	
+


















+		









	

+	
+		

+
+	
+
+		
+
+














												
+					
+						
+	
+	
+
+	
+	


			

		
+	
+

+
+		
		
"/7::986/!
+
+					
+%5=>>=====>=0

+	
+	


2=>=<=<<<<<<=?:)
	
		)<>=<==<===<<<==>>6 
	
			
	->>===<<<<<=<<<<===>;#	
			
+
&>>===<:>ADEC>;:;=>==>;
	
				
+8>===;Ebx����|p[B9=>==>6

+

+
+	
		
(>>>>?W��}upru~��\>=>==>+
			
	
+


+		
+3>=>>V���ztfaia_h}�m@>>>>9
	
+		

+		
%<===Gs����������re|�f>>>>>)
+
+	
+


		
 ;====Q���vc[gotx���v��T>?>?2
	
+
+
+				

:?====OooQ@?>>>@BJb����xD>>><*

+	

	
+				
+'.->=>>>=?CA<=?>??????Mz���O>>=>?8

				
+
+		

+
6C=?>>>>==<==>>>>>>???=CYosO=>===?<#

+						
	
+	;?>>?>>>?>>>==>>>>>>>>=;BNE;>>===?<"

+		
			
+		


+
*>>>>>?>>>>>>=====>>=====;;;;>>>===>; 

+

+	
	

			
+
+
+
+
+

	


+$?>>>>>>>>>>=>======>=======<<=>>>==>=:

+


+
+
+		
+
	
+
	<?>>>>>>>>>>>>>=>==============>>>>>>=>7	
			
			
+

+	
	6?>>>>=>>=>>=>>>>>=========>=====>=>=>>>?3	
+

	
						
+

	

+
-@>>>>>>>>=>>>=>>>>========>>>=====>>>==>>?*
	
+							
+

+
+	

+	">>>>>==>>>>>>>>>>>>>>===>=>>>>>====>>>>===>:		
+										
+

+

		
<?>>>>===>>>>>>>>>>>>>>=>>>>>>>======>>>>==>?*

+
+												
+

+
+8@>>>=>>=<>>>???>???>>>>>>>?>>??=======>>>>==?7		
+													
+
+
		
+	
/@>=>>>===<==>????@?@A@????>?????>===<<=>>>>>>>= 

	
+																

+
+
+	!?>==>?>>>====>>>??>BMWfihaTG=>???>===<<==>>>>>><?8

+																	
+

+	
3@>=>>?>>>>==>>=>>=AQSLHFGLTXP>=>>===<===>>>>>>><<"
	
+
																				
+

+:@>>>>>>>>>==>>>>BLQRF=<<<<>OWQJ@>>>==>>==>>>>>?1
+



+																					
+
+				6?>>>>>>>>>;:>>>CWZP@>>>==>>>FX^O?>>==>=====>>>>8

+				

+
																								
+
		6>>>>>>>>>>;:>=@PUF>>>>>===>>?BMSG>=>==>>====>>>>"	







+
+

																										

	
!8?>>>>>>>>>=====ENG=>>==>>==>>>>@IJ@==>=>>>===>>>?-
	



		
+	

+																										
+

+		
*??>?>>>>>>>>=>>=>FF?>>>>>>>=>>>=>>BFC>==>====>>>>>?/

+
+
+
				
+
+																													

			&?>>>>>>>>>>>>>>==BD?>=:7;77=9.5>>>>>AB>==>===>>>=>>?:	
+		
+
+	
+	
+

+																												
+

	;?>>???>>>>>>>>>=>B@>>:46=71<;1'0944<>??========>>>>>?<(	
+
+
+



+																														
+
		(@>>>>?>>>>>>====>?>9>>==>>?????;5656=>>==========>>>>>?@6	
+	
+	


+																															
+

+	
5?>??>>>>>>>>>>==>>,.>>>>????@??>>>>></,6==>>=>>>>>>>>>>@8
+						

																																
+
+
+	<>>?>>>>>>>>>>>@?>=

%:??><9;<=??=>=<0&<=>>>>>>=>>>>>>>@/
	
+	


+																															
+
+
+
+	"@>?>?>>>>>>>>>:3>=>0,*#2><;::;;;<?>==9,!+===8>?>>>>>>=>>>>>
+	


+																																	
+
+
+	
5@???>>>>>>>>>@6%>>>@@@?>==<<;;<<;;===>>=;=>>:$<?>>>=>>>>>>>@,
+			
+


+
+
+	
+
+																													
+

	?>???>>>>>??=>( ;?>>?@>>>>===;;=<<<===>>???>>><>?>=>>>>>>>>>?9	
+
+
+


+
+
+	
+
+																														
+
+
+		,@>?>?>>>>>>=<>#9?>??>>>>>>>==<<<<==>>>???>???><??>=>>>>>>>>>?			
+
+
+	

+
+
+																																
+
	9?????>>>>>????>>?>>>???>?>>?@@GJLIA?@???????>>?????>>>>>>>>>>A(
+

+	
+	
+			
+																																
+

?@?????>>>?@@@@@?>>>>>>????>>JY_`bc]F>>??>?>>>>>>>>>>>>>>>>>>?@9
+
+			
+

+																																
+	

&B@@??>?>>>>??@?>>>>>??????>BIMTQOMMRNA@??>????>>>>>>>>>>>>>>>??A"	
+
+
+
+
+						
+																												
+	
+
/BBA???>>>>>>??>>>>>>????>?>QZCDEDCBAAFP@??@????>?>>>>>>>>>>>>>>@3

+
+
+
+
+
+


+


		
+																														
6AA???>>>>>>>>>??????BA???>A_]F at AA@@@?P]F?????@@????>>?>>>>>>>>>?=			

	



+


	
+																											
+	
;@????>>>>>>?>>??>?>?@@???2<b]JCAA@@AF\]O;>?@??@?>?>????>>>>>>>>>@
	

	





+	
+
+																											
+
>@???>>>?>>>>>>>>?>??>?AHC=>]eSICBBBDP^]N7>???????>>>??>>>>>>>>>>A 
+	

+	


+
+
+	
+																											
+

@????>>>>>>>>>>>>?>??>@MY]J;Gk_ROMNQU`c^D>>CC???@?>?>???>>>>>>>>>A


+

+	


+
+
+
+	
+
+				
+																					
+
A???>>>>??>>?>>>>?>?>>IZSjxT<KTQJFGHLUVD;=K\R@??@?????>??>>>>>>>?<
+

+
	



+

		
+
+																								
+
+
&B??>?>>>?>>???>>>?>??>H`fpuyN<??@@@?>?=<Ggo[PO?>@?>??????>>?>>>??/


	
	
+



			
+
+																								
+
+/B??>>>>>??>???>?>>????BSdlnok?<>>>>?=<;Koq`TOUB>??>???????>?>>?@?1
	
		


		
+
+
+																								
+
6A?>>>>>?>?????????>????DNUZZp]=>??>?>;Oylecc`S@>>>??????????>>??@?3
+
		
+	
			
+
+
+
+
+
+	
+			
+														
+
9A?>>>>>?>>?>??>>?>>???>>AA>=BZT?=???=NtbKHOXL@?>>>?????>????>>?>?A?
	
+
+	
+
+
+
+
+	
+
+		
+
+													
+
+
+
5B??>?>>?>??????>>>>????@?>??>>NTG?>?KUG==>>>??>>>?????????>>>>?>>?@/41
+

+	
+



+
+
+	
+
+
+	
+
+	
+										
+
+
+
+

*B@>>?>>>>???>?>>?>>????@??????>ENKDEF?>>>????>??>???>??????>>?????@=@?3
	
+		
+




+
+
+
+
+
+		
+
+
+
+
+										
+
+
+

(B@?>>>>>????>?>?>>???????????@@>=AAA>??>>?>??>>?>>??>?>??>?>>?>>>?@A at A>+
+
+




+
+
+
+
+
+
+				
+
+
+									
+
+
+

6B@???>>>>??>>?>???>?>???>?????@?>CDA?@????>>?>>>??>????????>>>>>>?@@>?@:(
	




+
+
+
+
+
+
+	
+				
+								
+
+
+
+

.A@????>???>>>??>>??>??>?>>>>?>>??AKE@@?>>?>>??>>>???????>???>>>>>>???>>@@7'

+




+
+

+
+

+														
+
+
+


<A???????>>>>>??>>>>>>?>???>>?>>>AINEKM@>>>>?????????????????>>?>?>??>>>>@>5*




+
+	
+
+
+													
+
+
+


+A@???????>??>>?>>>>>??>???>>>?>>>BJPPPK??>?>?>>?>????>??????>>>????>?>>>>?@=5*

+
+


+
+
+
+	
+							
+		
+
+
+


+5B??????????>>?>>?>>???>?>?>>>?????GNLHA?>>??>>?>>>??????>???>>??????>>>>>>@@<4&
+


+	
+
+									
+
+
+
+



;A??????????>?>>>>>>>??>?>>?>???????@?>???>??>>??>>??????>>?????????????>>>@@>9-$

	
+	
+
+						
+		
+
+

&>A??????????????>>>>>??>?>??>?>?????>???????????????>?????????????????>?>>>?@@>94,

+	
+				
+	
+			
+

-?@???????????????>???>>?>>?????>???>?????????>??>?>?>??????>????????????>>>??@@?=9.

+
+	
+
+		
+			
+

2A@????????????>?>>>?>???>>>??>?>>???????????????????????>?>??????????????>>>??@@?>6&


+	
+
+
+
+
+
+			
+

4B@???????????>>?>????>?>>>>>??>??>>??????????????????????>????????????????>>???@@?:,
	

	
+
+		
+
+		
+


6B@??@????????????????>>?>??>????>>??????????????????????>???????????????>>>>???@@?9,
	


	
+
+
+
+
+		
+

4A@?????????????>???>???>>>>>?????>?????????????????????>??????????????????>>>??@@?8(
	



+
+
+
+
+
+
+	
+

0AA?????????????????????>>>?>???????????????????????????????????????????>??>>>??@A>4"	
	
+
+
+
+
+	
+

*?B?????????????????????>>>?????>??????????????????????????????????????>??>>>>?@AA;+
	

+
+
+
+
+		
+

!:B@???@???????????????????>????????????????????????????????????????>>>>??>>>>@AA?5!	
		
+
+
+
+			

1AA?>??????????????>>>????>>>????????????????????????>????????????>>>???>>>>?AA at 8'	
+

+
+
+
+			

&<B@?>>??@?????????>>?????>>>???????????????????????????????????>>>>>???>>>?@B at 7&	
+
+
+			

2AA?>>=>????????????????????>????@???????@???????????????????>>>>>>>??>>>?@B?4!	
+
	
+
+
+			

$:B@?>>>????????????????????????A@?????@@???????????????@????>>>>>>???>>?@BA6!	


+	
+			
+

+=B@?>>>??????????????????@@@AAAAA@@@@@@@?????????@??????????>>>>??>>>>?BB7"
+

+
+
+			
+


/?B@?>>>?>>>???????????????@??@@@????????????????????????>???>>???>>??AB9$	
		
+
+
+
+		
+

0?BA?>>>>>?>>>>>>?>>>>>>?????@@?????>??>>>>>>??>??????>>>???>>??>>??BB;'	
	
+
+
+
+
+	


.<BA?>>>>?????????>>?>???>>>??@@??@????>?>>>>?????>?>>>?>>>>>>>>?@BB;(
+

+
+
+
+
+		

(9AA???>>>???????????>??>>>???????????????????????>>>>?>>>>>>?@ACA8$
+	
+	
+
+			
+
4AA@??>??>>????????>??????>??????>>??>>>???>>>>>>>?>>>>>>?@ABB=/
+

+
+	
+
+		
+


2 at BA@@?>>>?>>>>>>?>>>>>>?>>>??>>>>>>>>>>>??>>>>>>>>>>>?@ABA=3#	

+	
+	
+	
+
+		

*;ABBA@@@@??>>>>>>>>???>>?>??>>>>>?????>?>>?????@@@AABB?9. 

+
		
+
+
+
+
+
+		
+


)38>ABBBBA@???????????????????@@@AAAA@@@@@AABBBBB@<3,"




+		
+
+
+
+
+
+
+
+
+
+


&&#'2;ABBBBAAAABBBABBBBBBBA?>?BCCCCCBA@>;83.)"
	




+
+		
+
+
+
+
+
+
+
+
+
+


!,38:===<;;;:;<;9874..367;<;85-&# 




+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+












  



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






+


+
+
+
+		
+	
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+


















+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+


+
+
+





+















+
+
+










+	
+
+
+
+
+
+		
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+











+
+








+
+
+
+
+
+
+	
+
+



+
+
+
+
+

+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+





+
+
+
+








+
+					
+
+
+

	
+
+
+
+		
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+



+
+
+






+							
+
+
+
+
+	
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+


+
+
+
+








+
+
+	
+
+
+
+
+

+
+
+				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+
+






+
+
+



+



+
+
+

+

+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+



+

+
+










+

+
+



+
+
+
+
+
+
+



+	
+
+












+








+




+		
+















+
+		









		
 [...]
+	
+		
+															
+			
+














+
+		
+			
+				
				
+
+
+				
+
+		
	
+	
+
+


+	
+
+		
+						
+				
 


										$/69::;:5)

	
+		
+6<>>>===>>=6%

			*:??>===<<<<==>=5#
	
+2>?>>=====<<<====>=-
					/>>=>>==<<<;;:<====>>*
+	
+				
!<>==>>@EMSUURLA<<===>: 
		
+	
+	
+		/>====FZlv~����x^D=>>=>1
+	
		
+		


			4>==;D`v���������oF>>>>;
	
+	
+


+	!:>=<=Nab]cu�������hB>>>>)


+		

	
+

+	.<>==<?GFA>>EOKEH^��U>>>>2
		
+	

+				1@>==><====??><=>>>Np~cA===>8#
+	
+

			!=>===>>>>>>>>>=>>>=<DQO@<==>>?1	
+		

	
+	
+243?>=>>>???>>>>>=>>===<;<;<>===>@5
+
	
+		
+		
	
8B=>>>>>>??>>>>>>=========<<=>====?3
+
+							

	
+	
=>==>>>>?>>>>>=>=======>>====>>===?0
+	
+
+		
+
						
		

+0>==>>>>>>>>>===>=======>>>===>>==>=>+	


		
+
+

					
+
+

		
+
+
*@>===>>>>>>>>>==>=======>>>==>>=====>>'
				
+
					
+=>>>>=>>>>>>>>>==>=====>=>>>====>====>><


+
	
+				





+	7?>>>==>>=>>>>>===>>====>>>>>====>>>>==>?3	
+					
+
	
+
+.?>>>===>>>>>>>>=>>>>==>>>>>?>===<=>>====>="	
+
+							
+
				
+?>>>>=<===>>>>>>>>??>>>>>>>>?>>===<=>>>==>?.
+
+										

				
+">>=>>>>==<=>>>?>>>>>>>>>>??>>>>>===<==>>>=>>7


+												

			9?=>>>===<<==>>>>>>>@ACCA?>>?>>>=====<=>>>>?==+
+
+
+												
+


+	
,@==>>>>==<=>====>>@NX[X^_UG>>>==========>>=?;:.

+																
+

+	
+8@==>>>>>=<=>====>?JSHA?@DOSE>>>=>==<<===>>=>>;CA
+
																		
+
		
+		8?>>>>>>>=<==>=>AFFB>======@BDB?>>>=<=>==>>>>?@C/


+																			
+
+		1>>>>>>>>>=>>>=?GHA=>>====>==BDA>>>=<=>>=>>>>>=/


+	
+
																						
+		,=>>>>>>>>>=>>==??=>>>>=====>>==>>>=>===>>=>>>=>/








+
+

+																							
+
	
'>@?>>>=>>>=>=>=====>>>========>>===>==>==>>>>>>>>*



+
+	
+

+

																									
+
	
+)?>>>>>>>>>=>>======>>>=====>>===>>===>==>>>>==>=>?7




+
+
+	
+	
+
																										

		
>>>>>>>>>>>>>>>=>>==>=>>>>==>>>======>>>=>====>=>>>?8"				
+	

+																										
+

	
3?>>>???>>>>>>==>>>>>>>?>>>?>>>>=>>>>=>@?======>>>>>>??6
+
+
+	


+																												
+

+>>>?>>>>>>>>>==;;>/!9?>>>>??@@??>>>>>?9/9>=>>=>>>>>>>=>?;
+
+
+		

																														
+
+
+%@>>>>>>>>>>>>>>==: ;???>=96<;=?>==>1$;===>>>>>>>>>>>?7			


+																																		
5?>?>>>>>>>>>>>???82><;9839618>>>86>=>?>>>>>>>>>>>@'
+			


+																														
+			 @>?>>>>>>>>>=>8,>>: ('
!8;;;;<<<7-:==2
8=<7>>>>>>>>=>>>?8		
+
+			
+

+
+
+																												
+	
+
+		
5@?>>>>>>>>>>>@0=>==@@@==<=;:;<<<:<=<<=7.0=>;$:?>>>>>>>>>>>@ 	
+
+		
+		
+


+		
+																												
+
+

+?>?>>>>>>>??=?&
6?>>AD>>>>>=<;<<<<===>>>?@@>>?=>?>=>>>>>>>>>@0

+
+		
+	

+	
+																													
+
+

,A>?>>>>>>>><<>(5@>?@B>>>>>>=>>====>=>????>???=<??>=>>>>>>>>?;
+
+	
+			
+
+
+																														
+
+
	9@???>>>>>>?>>>@>?>>>>>>>>>>??>@CBA??@???AA??>>?????>>>>>>>>>>A(
+
+
+
+	
+		
+
+																													
+

	@?????>>>>?@@@@?>>>>>>>????>?@EIMMJC@?>?????>>>>>?>>>>>>>>>>>??=	
+
+
+
+		
+																													
+
+

+&A@@??>?>>>>?@A?>>>>>?>?????AQFAA@@AA at CC>??>???>>>>>>>>>>>>>>>>>A)	
+	
+
		
+	
+																													
+
+
1BBA??>>>>>>>?@>>?>>?????>>>I\THEDCCEETW@>?BC@??>?>>>>>>>>>>>>>>?7

	
+	


+


+		
+																										
+
+
+
8AAA???>>>>>>>>>????@?????>BVT^WPLKKPY_SPFCCA??@?????>>>>>>>>>>>>=		
	
+	
+


+



+
+
+																									
+
+
+
=@???>>>>>>>?>???>>>?????@5=aZb_WTSTW_\O_KA>???@?>?>????>>>>>>>>?>	
+

+
+		





+		
+																									
+
+
+
@???>>>>>>>>>>>>>>>>>??@A?=>hofc^\]^_a[YY7>???????>>>???>>>>>>==?=

+


+
+	

+		
+				
+																			
+
+
+
 A???>>?>>>>>>>>>>>??>?>BYPDDRvrhfeffdbboY>>?GA??????????>>>>?>>>@5
+
	



+	


+
+
+		
+				
+																		
+
+
+
+
)B>>?>>>>?>>>?>>>>>??>?@NUhxiAG`_YXXYY``KFIGUY@???????????>>>?>???,
	
+	



+




		
+
+
+		
+																		
+
+
+
+
1A??>>>>>?>????>>>>??>>CYVYdzI;=>?AA@>?=:Osj]SG>>@?????????>???>?@5 
+	



+	



+		
+
+
+																						
+
+
7A??>>>>>??????>>>>>>?>AgfZVic<<?>???=<;EnjWQNO?>????????????>>??@A9




+

+		
+
+
+
+
+		
+	
+														
+
+
+
7A?>>>>>?>?????>>>>>>??>^lgjkrV<?????>:HegZTOSO?>>>???????????>?>?@@$&(

+


+		
+
+
+
+
+	
+	
+
+
+											
+
+
+
+
1A?>>>>>>??????>>?>>????EQOPNXsT==??><RwncY\aTC>?>>??????????>>?>>?@7==0
	
						
+
+
+
+
+				
+									
+
+
+
+


(B@?>>>>??????????>>?????>>>?>HgaJ@=Dcy^F?>AC@???>>??>>????>?>>??>>@@AA>-

		

+	
+
+
+
+
+
+		
+							
+
+
+
+
+
0B@???>>????????>>>>????@@??@@>Aapf]kqN>>??????>?>?@??>?????>>>>>>>@@??A<- 
	




+
+
+
+	
+			
+				
+
+
+
+
+
+
+

=A???>?????????>>>>?????????????AQ\\SG>?????>??>??>?????????>>>>>>>??>>?@<4*


+



+
+
+
+
+	
+
+			
+						
+
+
+
+


4A@??????>??????>?>>?????>????????=BB>>@????>>?>>>?>????????>>>>>>>???>>>?@>9-!
	




+
+
+
+	
+
+
+
+		
+
+		
+		
+
+
+
+

-A@???????>?????>>??>>>?????>>?>?@?>==????>>>>?>>>>??????>>?>?>>>>??>>?>>>>?@?;2'

	
+





+
+

+	
+
+
+
+
+
+			
+
+	
+
+



<A??????????>??>?>>>>>>>>??????>>??????A?>>>>??>?>>???>??>>>??>>>?????>>>>>>?@@<4) 





+				
+
+
+
+			
+
+
+
+

/A@?????????>>????>>>?>????????>>??@@A?BD??>???>>>>????>>??????>>??>>??>>>>>>>?@@=2'

+



+
+
+
+	
+
+	
+
+
+	
+
+
$;A??????????>>??>>>>>?>>????>?>?>??@?A@@@??>????>??>?>??>????>?>>??????>>>>>>>>?@@9."
+
	
+
+		
+		
+
+		
+

2?@??????????>>?>?>>>>???????????????????@???>???>???>??????>??>??????>??>>>>>>>>@@?9-"	
+
+
+	
+
+
+		
+


!:A@????????????>>?>>>>???>?>?????????????????????????>??????>??>??????????>>>>>>>??@@:.!

+
+	
+
+
+
+	
+


$<B????????>???????>>??>>>??>???>?????????????????>>???????????????????????>>??>>>>??@@:+

+	
+
+
+	
+
+
)?A??????????????>??>??>?>>>>>???????????>???????????????>??????????????????????>>>>>?@?4#
	
+
+
+
+
+
+
+- at A??????????????>>???>?>?>>>>?????>>>?????????????????????>>?????????????????>?>>>>>?@@8)

+
+
+
+
+	
/@A???????????????>???>?>?????>???>>???????????????????>???>>??????????????>??>>>>>>>?@?7'
+

+	
+
+
+		
0?A?>???????????????????>>>>>>???????>????????????????>???>???????????????????>>>>>>>?A?4"	
+

+
+
+
+
+
/?B?>?????????????????????>>>???????????????????????????????????????????????????>>>>?@A<.
+
+	
+
+	
+
,=B@>??????????????>>?????>>>>?????????????????>?????????????????????????????>>?>>>>?A at 6$	

+
+
+	

':BA?>?????????????>?>>????>??>????????????????????????????????????????????????>>>>?@A<-

+
	
+		
+
 5AB?>>???????????????>>????>>>>????????????????????????>??????????????????????>>>?@B>1

	
+
+		


,=B@>>??????????????>???????>>>>????????????????>?????????????????????>???????>??@A=/
	
+		
+

!6AB?>>?>>?????????????????????>???@?????????????????????????@@?????>>>??????>??AA<.

+	
+	
+

)<BA?>>>????>>??????????????@????@A@?????@@???????????????@???>>>??>>>???>?>>?AB<.

+
+
+
+
+


0?B@?>>>???>>???????????????@@AA@@@A@@@@@?????????????@???????????>>?????>??AA9+

+

+		
+

4 at B@?>>???>??>?????????????>>>??@???>?????@?@@??@??@??????????>>????>??>??AB:&
+	
+
+	
+

 5 at B@?>>>>>>????>>>>>>>>>>?>????@@?????>>>>>>>????????????????>>???>>>>>?AB=+


+
+
+	
+

+ 4 at BA??>>>>>?>>>??>?>>??>???????@@???@???>>>>>>????>????????>>>>>?>>??@AC>/


+
+
+	
+


0>BA@?>>>>>>?>????>>?>????>>>???????@????????????????>>?????>>>?>>?@BB=-



+
+
+
+
+


)9AB@?>>>>?>?>???????>??>????????????????????????????>?>>>>>>>??@AC at 6&


+
+
+	
+


0>B@????>??>?>>>>>>???>>?????>?>>>?>??>?????>??>??>?>>>>>>??@ABB;,
+	
+
+
+
+
+

%:BBA@????>>>>>>>???????>>>?>>>>>?>>>????>>>>>>>>>>>????@ABBA<0

+
	
+
+
+
+
+
+

.<ABBBAAAA@@??>>>>>>???>?>?>>>??>??????>?>??????@@@ABBBA>6+
	

	
+
+
+
+
+
+



&19>@@=>ACBA@@@???@@????@@@@@@@@AA@@@@@@AAABBBBBA?;51)
	

		
+
+
+
+
+	
+


! 
#-8>ACCCCBCBBBBBBBBBBBBBBBBBBBCCAA@>:73/("


+
+


	
+
+
+
+
+
+
+
+



 '-1468:;<<<<;9888:<>?@@?;4,&$!






+
+
+
+
+
+
+
+
+
+




!"#!


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+


+


+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+









+
	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





























+

	
+
+
+
+
+
+	
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+


+
+


+
+
+


+




















+
+
+	
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+


















+
+


+
+
+
+
	

+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+














+
+
+
+

+

+
+
+
+	
+
		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+









+
+
+
+
+



+
+



+
+
+
+
+			
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+








+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+



+		
+
+
+
+
+
+
+
+
+
+
+
+
+


+









+


+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+

+
+
+
+
+
+
+
+
+
+
+








+
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+

+	
+


+
+

+
+
+
+






+

+
+
+
+
+

+
+
+
+
+
+
+

+
+

+	
+



+
+










+

+
+

+
+





+
+
+














+



+
+	









	
 [...]
+
+
+			
+		 [...]
+
+
+
+
+	
+
+
+		
+					




+








+
+



+
+

+		
+					

+	
+	
+

+

+	
+
+			
+
+
+		
+
+	

+	
		
+		
+																		
+


	
+				

'/589970&				

,5:=>?????><5*
	
+		+:>?>>>>>>>>>>>>9+
+						,<>=====>========>=-
+	
+
+
!9>=====<<<<<<=====>:"
	
+
+			+=>===;<=?BCDC?<=>==>0
+
+		

+	1>==<;;=?DHMRSPE==>=>8

	

+


+
%<===<:;<<>ACEDHLD===>;"
+
+					
+
+
+

+
+/>>===<=====<<=<<@F?<===5

+
+		
+	7?>=====>=>>===>>=<=<;<==>?3
+	
+

		
+	-?====>=>>=>>====?>==;;<====?<$
+
+	
+			
+	 <>==>>>=>>>>>==>>>>=>========?=$
+				
+
		
+	
700?===>>=>>=>>>==>>>>>>=========>< 		
+	

+	
+	
9?=>==>>=>>>=>>>==>>>>>>==>=======>:
+	
+
		
+					

	
+
+	"=>==>>>>>>>>>>====>>>>>>=>========>6


+
			

	
+
+			
			
+	2>===>>>>>>>>>=====>>>>>>>==========?2			
+

		
+
			
'?>=====>>=>>>>=====>>>>>>>===========>)


			
+


+
+	:>======>>=>>=>==>>==>>>>>>===========?9

				
+
+
		4?=======>>>>>====>>>=>>>>>>>==========>='

+				
+

		
+1?===>==<<=>>>>>=======>>>>>>===========>=,
+
+								

		,?>==>===<<==========>===>==============>>:*		
+
+									
+
+
+	
+
+<>==>>==============>>?>>===============><1 

												
+

+	/?===>>===========>A@>=>?@?>==>>>=========>4


+													
+

+
+
+5?===>>====>===>>==?>=>>>>?>>>>>>>=========<&	

+															
+
				.>>==>>>====>==>>===>>>=>>====>>>======>>==>:4I,	

+																	
+
+	

4>>==>>>==>>======>>>=>==>>>>==>>==>====>>>?@D?
+
+

+																			
	
		
+
6?@>>>=>>===>>=>==>>>>===>=>>>>>=>>===>=>>>>>>>;	


	
+
+
+
+		

+																					
+
+
+'??>>>>>=>>>>>>=====>?>=======>>>>>==>===>>>>>====	


+	
+
+
+
+


+																						
+
+">>>>>>>>==>>>====>>>>>===>>>>===>>>>=====>>>>====?5
+
	
+
+
+
		

+																								

+9?>>>>>>>>>>>>====>>>===>>>>>>>=====>>>>=====>>=>=>?>1
+

			
+
+
+

+																								
+

+		#?>>>>>>>>>>>>====?>>>>=>>????>>>>>==>??=>====>>=>>>=>@;

+	


																											

+	
2?>?>>>>>>>>>>=<:</#7?>>>?><=>?>>>==>=/&+<==<=>>>>>>>==?<
+



		

																															>>?>>>>>>>>>>====;
6>>=-$).,7=>>=8!
+	7=<;>>>>>>>>>==?1
				
+



+																														
3@?>>>>>>>>>>=>;>?4

)<;/--792.5<>= 	
->=>>>>>>>>>>>=>>
+
+
+
+
+	

	


+																												
+		
?>?>>>>>>>>>>>;4>>2!# ';<<<<<<93:=:

+	/><5=>>>>>>>>>>>@0


+		
+


+


+
+																											
+			
4@>>>>>>>>>>>>?&<>;9???;9==<<;<;;;:;;980$%<><*;>>>>>>>>=>>><
+

+	
+	
+
+

+		
+																											
+		?>?>>>>>>>>>=?##>>>?@>>>>>>==<>;<==>>>???>>>?>>?>>=>=>>>>>>@'

+
+			

+																														
+
+
+	*A>??>>>>>>=<<='/@>>@B>>>>>>>>>>=====>>>?E@>??=;>?>=>>>>>>>>?<
+
+
+					
+																												
+
+

+9@>>>>>>>>?>>=>?<>?>>???>>>>??>>>>>??@@??BMA>>>?>???>>>>>>>>>>@2
	
+	
+
+
+	
+
+																											
+
+
	@?>>>>>>>>??@@@??>>>>>>?>??>???ABCBA??????@>>>>>>>>=>>>>>>>>>>>?	
+

+	
+																									
+
+
+
	(A??>>>>>>>>?@A?>>>>>>>>?@?>>JROQQRSQFC@>??>>>>>>>>>>>>>>>>>>>>>@+	

+																												
+
+

3AAA>>>>>>>>>>?=>?>>??>??BD at FU[_\XVW^aaO?>>EKB>>>>?>>>>>>>>>>>>>?4
	

+

	
+

+			
+																									
+
+
+
;@AA>>>>>>>>>>>>??>?@?????DSZPT[XWWWX^ZWTNPWJA?@?????>>?>>>>>>>>?7
	

	
+	







+																										
+
+
+
@???>>>>>>>>?>>??>>????@?@7CaRZ[XWXWTTRNYTKA>???@????????>>>>>>>@4
	
+
+
	
+		



+	
+
+																								
+
+
!A??>>>>>>>>>>>>>>>>>>??@?>;Ivd^YWWWUTUURY9;????????>????>>>>>>>>@+
+
+

+
	
+	


+			
+				
+																			
+
+
+
)A>>>>?>>>>?>>>>>>>??>?>BSFOp��pa^[YVUW^nsP?>DLF@>??>>????>>??>??@'
		

+
+
+	



+
+
+	
+
+
+		
+																			
+
+
+
1A>>>>>>>>?>>>>>>>?@???>E`cs�lUgb[]^_\`klxqYSND@????>?????>???>??@9#		
+	
+
	



+
+
+
+		
+																		
+
+
+

4A>>>>>>>???>?>>>?>????D`jhdxU:<>?@CB at A?DsobcRB>>?????????>>?>????B:
		

+
+		
+
+																					
+
+
+
+

1B>>>>>>>??????>>>>?>>>Pj_[[j[;<?????=<<Drie_VO?>??????????>>>>????@)15%		
+	
+
+
+
+
+
+																		
+
+
+
+

+&@?>>>>>???????>>>>>>>=MiZVYYaK<?????>;B]c[WPMR@>>??>>>?>???>?>??>>@;@A;&

+	
+
+
+
+
+															
+
+
+
+
'@?>>>>>>??????>>>>>>?>DWdhc^`jJ=>???=Fcicb]WWO?>>>>>>>?>>????>>?>>?@@?A:+!
+
+
+
+			
+				
+		
+
+
+
+
+
8A??>>>>>????>>???>>>>>?BEDA?AXnSB>>ARicPDBIMG@>>>>>>>???>>??>>>>>>??>>>@=6.#
							
+			
+				
+	
+
+
+
+

%@@????>??>???>??>>>>>>>?????@?>Me^WT]c[D>?>>>?>>?>>?>>>?>???>>>>>>>>>>>>>@@<6'
		




+
+		
+
+			
+
+
+
+
+
+

":A???>>>>??????>>>>>>>>???@??@??>Ie``cWA??????>>>>>??>?>?>>?>?>>>>>>>>>>==>?@?90( 

+



+	
+		
+
+
+
+
+
+
+
+
+


7A?????>?????????>>>>>>>>?>?@??@???KbeS@?@???>>>>>>>>>????>?>>?>>>>>>>>>>>>=>?@@=92*"


	
+
+	
+	
+
+			
+

&A@????????>?????>>>>>>>>>???????@??=HO???@>>>>?>>>>>>?>>?>>>?>?>>>>>>>>>>>>>>=>@@@=7-"
	
+
+
+		
+
+
+			
+

#9A???????????>??>>>?>>>>>>?>>???>???>>>>>????>>?>>>>??>>??>>>?>?>>????>>>>>>>>==>?@@>6*
	
+		
+
+
+			
+
+		
+


 8@??????????>>>>>>?>>?>>>???????>>????>??????>>??>>?>???>>??>>>>>>>?>>>>>>>>>>>>==>?AA<1!


+		
+
+
+
+
+
+



3A@?>????????>>>>>>?>>>>>>????????>>?A???????>>??>?????>>>>>??>>>>>???>?>?>>>>>>>>>>?@A?7)


+			
+
+		
#=A?>>????????>>?>>?>>>>>?>>>>??>>????@????@??>>??>>???????>>??>>>>>??>??>>>>>>>>>>>>>?@A>4(
	
+
+
+
+
+	
+


0@@>>??????>???>>?>>>>>>>??>??>??>?????????????>???>??????????>??>>???????>>?>>>>>>>>>>?@A<0"


+	
+
+
+
+

6A@>??>????>>????>??>>>>>>>>?>?>>>>????>>??????????>??????????>>>>???????>?>??>>?>>>>>>>?A at 6'



+
+
+
+	

&:A?>??>??????>??>>>?>>>>>>>>>>??>>????????>??????>>>???>?>??>?>>????????>?>>>>??>>>>>>>>>@A;+

	
+
+	
+


,=A?>??>?????????????>>>>>>>>>>>>??>>?>>?????????????????????>>>?????????>??>???>>>>>>>>>>@A>/



+
+	
+
"1>A?>??>??????????>?>??>>>>>>??>>???>??>?????????????????????>>?????????????????????>>>>>>@A>0

	
+	
+
&4?A?>>?>>????????>>>????>>>>>>>>??????>>???????????????????>>>?????????????>?>??????>>>>=>@A<-

+	
+
'5?A?>>??>>??????>>>>>>???>>>>>>>???????????????????????????>?????????????????????????>>>>?A at 7%	
+
+

%5?A?>>??>>?????>??>>>?>>??>>>>>???????????????????????>???>>?>??????????????????????>>>>>@A=/

+
+

!1>B@>>>??>????>>???>??>>???>>>>????????????????>>????????>>????????????????????????>>>>>?A at 5#	
+


*:AA?>>?????>>??>>>?>>>>>??>>>>>>>??????????????>??????>>>>???????????????????????>>>>>?AA9'		
+
+ 3 at B@>>>?????>??>>??>>>>?>?????>>>>????????????????????????????????????????>?????>>>>>?A at 6$	
+


(;BA?>>>>?>??????????>???????????>?>?@??????????????????????????????????????????>>>>?A at 6"
+
+	
+

0?B@?>>>>>>???????????????????@????@B@?????@@???????????????????????????>??????>>>@B at 7$
+
+

 5AB@?>>>>>>>>=>????????????????@@@@@@@@@@@@@?????????????????????????>??????>??>@BA9'
+
+
+

+%:BA?>>>>>>>=<>??????????????>>>>??????>>??????@???????????????????>????????>>?@B?7(
+
	
+

+);BA@?>>>???>=??????????>>>?>>>?????????>>>>?>???????????????>>?>>?????>??>>?@B at 6'
+
	
+

+(:AB@?>>>>>>>?>>>>>?>?>>>?>???>>>???>???????>>>>>>>?????????>>?>????>?>?>>?@B at 5%


+
+
+

+$8AB@?>>>>>>>>?>>>???>??>>?>?>>>>>?>????>>?>??>>???>>???????>>>?>>>>?>>??AB at 5"
+


+
+

+2>BA@?>>>>>>>?>>?>?????>>>>????>?>>?>>>?????????????>?>>>>?>>>>>>>>??@BC>0

+

+
+


&6 at BA?>>>>>>>??>>>????>??>>>??>?>>>>>?????????????>>>>?>>>>>>>>>??@BB at 5%

+	
+
+


):AA@??>>>>>>>>>>>>>>>>>?>??>>>?>>??>>?>???>?>>>>>?>>>>>>>>???@ACA8)
	
	
+
+
+


-<BBA@@??????>>>>>>>>>?>?>?>?>>>>>>??>???>>>>>>>>>>>>>??@@ABB@:+
	
	
+	
+

.:?ABBABABAA@@????>?????????????>>????>?>???????@@@ABBBBA=4)
	
+
+
+
+



(48:;>>?ABCBBAAA@@@@@@@@@@@@@@@@@??@@@AAAABBBBBA@>;81(

	
+
+
+
+
+





 &.6;?@AABBCCCCCCBBCCBBBBBBBCBA@?=;9730(# 
+		


+
+
+
+
+
+
+

 #(*,/245689:;=>?@><7.%!

+		
+
+
+
+
+
+
+
+
+






	
+
+
+
+
+
+
+
+
+
+
+
+
+
+








+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
























+
+
+
+		
+	
+
+
+		
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
		
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



+


+
+
+
+
+

		
+
+	

+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+




+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+
+
+







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+



+
+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+
+
+






+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






+
+
+

+
+
+
+
+
+


+
+
+	


+
+


+
+
+
+								
+		

+
+						
+					
+
+
+		
+
+
+	
+
+
+
+				
+
+						
+
+			
+
+
+
+
+
+	
+		
+
	
+
+	
+						
+
+
+
+



+													
								

		
+	
+								
+		
+

+		
+	
"&*.00+$
	
+				
(28;;<===;961*
				

2;>>>>>>>>>>>>=6&			.<>==============6
	
	
 7>======<<<<<====;(	
+	

	+<><===<<<;;;;<====0
+

+	
+	.<========<<;<<;<=<>7
			
+	


+	
+
8?==============<<<===:-

+
	

	
:>=========<=======<====?<)	
+
+	
+


+			4>=<========<==============?0			


+	*>=<======================<==>.

+
+	

+
9><<=======================<==>+

+
	
+				
6/.>=<==========<=============<<===&
+
+
+

+	
+				
7?<=============<<===========<<<=<=: 		


+

+	
+						<=============<<<===========<==<<<>6

				
		
+											
,=<<===========<<===============<<<=>,

			
+		
+ <><=====<<======<============<===<<=>8
						
+
+

+	
+8>===<=<;<=====<<<===<===<=====<==<<=>9$
		
+
+		6>=<=<<=;;<<===<<<<===<===<<<=<=<=====;4!
				
+		/?=<====<==<====<===>=====<<=<=<==<=<=<1$
			
+	
+
 ;=<<==============>=>>==>===========<<=4 	
+					+>=<=================>>==>>===========<==1

+		
+	
+	+=>================>=>=>=>>============<=='

+	
+		
+
+			%9===============?B?>===>>>??============?5+
		
+
+		)4<>=<=======<<===?DA======>>?EB>=========>>6)AI
+	
+		
+
+	
+								 :@?>=>========<===>A?=<======>>@EA===<======>:<C

		
+

+		
+=>======>==>==<====?>============>A>============? 
+


			
+	
+
				9>=================================>>==========<<>;)	
+		

+		
+	)?=>>>>======>=====<================================?9
+
+
+			
+	

		
+
+8>=>>==>======<<<>>>=====>@@?>>=======36==<<=======<<><
+	
+

+

		
+		%?>>>===========<=0 1>====844:<<=>=<>=%
9<<:=====>====>4			


+

	

+		<>>>==========;:><3==;&,5:::<=5
+4=<<===========>$	
+
+
+
+



		
+
+
1?>>==>========;<>0
+
"9;0/47::;94;8		%>=>===========>:	

+
+



+	
+
+
?>>>>>========>>>>(
 !
9<;<;;::;9<0
+	)>;4============?#						
		

+				
+1?>>>>=====>==>(==84>??<8<<<;;<;:99;862,&+<=<4>>==========>8			
+		
						>>>>>>======<>3>==A@>>>>>===<;:;<==>????>=>?>=>>==========?0
						
+*@>>>>=====<;;=5'4?>>HF=>>>=>==========>>>LH=>?=;>?>==========?"
+				
+		9?>>>>====>>><=?>>>>>??>>>>>?>==<==>????>?LG>>>?>>>>==========>7

+
+						
+	@>>=====>=???@?>====>=>>>>>>?>?FMQOD>?>>>>>>>>>>>>=============>
+
+						
	*A>>>>======>??>====>>==?C?>=AOY\XXZ[OB>>>?>>>>>>>=====>========?#		
+
+					
	
6@@@>>=>======>==>>>>>>>BSRCCWYVUOMMTb^D>?>AJA>>>>>=>=>>>>======@'
+
+
+
+	
+

+	
+					
+
+	=??@>=>>=====>>>>>>>>>>??DOVXXRPOOPOQS[YKGKVSC=??>>??>>>=>>=====?&
+
+
+
+			
+


+
+
+

+								
+
+@>??=>>====>>>>>>=>??>>?>>8A\TRQOSRRRNQUPHKMC?>>??>??>>>>>>>>===>
		
+		
+	
+





+							

$A>=====>==>>========>>AC>=8Oh[VTPQRPNOPUV99@??B@>>>>>>?>>>>>>>>>>$
	
+	
+	
+

									
+

*A========>>>==>>>>==>>?JXP[sqt`TRPVUQOWchSBKINRF>>>>>>>??>>>>>>>?<#	
+	
+
+	



+
+						
+

+A=======>>>>>=>>>>>>>>>B_trl{mcXWNW`\Zm|pli_C at B@>>>>>>>>>>>>>>>?>A8!"
+	
+
+

+							
+
$@======>>>>>>>>>>>>>>?S`h{�g<<=>>AABDEY}os_FB>=>>>>>>>>>==>>>>>=>=.:<0


							
+
<?==>>>=>>>>>>=>>>>==Esrtx~zT;<>>>>=<;=Bu�}n^WA=>>>>>>>>>>==>>>>==>=@??4#
							


$>?>>>=>>>>>>>>=>=>>==DehmgfZUE<>>>>>=;?Oell_VUB==>>>=>>>>>>>>>>>>=>?>=>?93(
											

+;@?>=>=>>>>>>>>>>=>=>>>PZekke]ZB=>>>>=?VgXabSSR@===>>>>>>=>>>======>>=<=>??;5(

						
+0@?>>>>=>>>>>>>>>==>====@JSSICGY]F>>>>BVeUIHRUNC=======>>>>>>>>========<<<=>??:/&!

	
									
+
(>??>>>>=>>>>>>>>=>>==>=>>>==>?>@T]LECGUaI>>>=>=======>>>>>>>>>==========<<<<=??=:62-&


+								
+


;@>>>>>>=>>>>>>>>=>>==>>>>>?????>=Q[UY[\I>???>>>>>>=>>>>>>>>>=>====>>=======<<=>??>=;6,



						
,@>>>>>>=>>>>>>>>===>==>>>>>>?????>?W^Y_F=???>>>>>>>>>>>>>>>>>>>>=============<<==>??@>4'


			
+
 1=?>>>>>>>>>>>>>>>>=>==>>>>?>>>>>???>A`dL=>?>>>>>>==>>>>>>>>>=>>=>==>>>========<<<<=>>@@9.#



		
1??>>>>>>>>>>>>>>>=>>>>=>=>>>>>>>>>>>>>TUA>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>========>====>?@>6+


				
)=?>==>>>>>>>>>=>==>>==>>=>>>>>>>>>>>>>>BA=>>>>>>>>>>>>>>>>>>>>>==>==>>>>>=======>>=====>?@;1%



					
+%9@==>>>>>>>>>>====>>>==>>=>>>>>>>>>>>>?====??>>>>>>>>>>>>>>>=>>>>=>==>>>>>===============>@?9. 
+
			
+
!)6?>==>>>>>>>>>>===>>>>>>=>>>>>>>>>>>=>>?>>>>?>>>>>>>>>>>>>>>=>>>>====>>>>>>>>>======>>>====>?>7,

	
 +3=?==>>>>>>>>>>>>==>>>=>===>>>>>>>>>>>>>>>>>>??>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>==========>?@;/"
+	
	
&09??==>>>=>>>>>>>>>>>>>>>===>>==>>>>>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>====>=>>>=====>===>@=1"		

+


,6=@>===>>=>>>>>>>>>>>>>>>>=>=>>=>>>=>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=======>>==>@>2#	
+	


#0:?@>==>>>>>>>>>>>>>>>>>=>>=>=>==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=========>@?3#
	

+
%3<??>==>>>>>>>>>>>=>=>>=>>===>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=======>@?3"



$4=@?>==>>>>>>>>>>======>>>=>>==>>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>=>>>>>>>=======>@>3!

+



#3=@?====>>>==>>>>>>==>==>>>>=====>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>>>======?@;-

	




+ 1=@?>==>>>==>>>>>>>>>==>==>>===>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=====>@?5$	
+	


,:@@>===>>>>=>==>==>==>>=>=>>>>>===>>>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>=====>@@:*



	

	#4>@?===>>>>>>>==>=========>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>====?@;+




+

+
*9@@>==>>>>>>=>>>>>>>>>>>>>>>>>>>>==>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>=>>>====>?@7&

+

	
0=A?>===>>>>>>>>>>>>>>>>>>>>=>>>?>>>>>>A?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>>>===>@@7#

		
	#5?@?>===>>==>>>==>>>>>>>>>>>>>>>>>>>??@??>>>>????>>>>>>>>>>>>>>>>>>>>>>>>=====>>>=====>@@8$

+	
+

+'7@@>======>====>>>>>>>>>>>>>>>>>>????>?????????>>?>>>>>>>>>>>>>>>>>>>>>>=>>>>>>>====>@A:(

+


(:A@>====>>=====>>>>>>>>>>>=>>===>>>>>>>>>>>>>>>>?>>>>>>>>>>>>>>>>>>>=>>>>>>>======?@A;*
+
		

+
+<A@>====>==>=<:===>>>>>>>>==>>=>>>>>?>>>>==>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>======>@A<.	
						

+
+;A@>>=====>>=;=;<=====>>>==>>>>>>==>>=>>>>?>>>=====>>>>>>>>>>>>>=>>>>>>=>====>>@A<.
	

					

+
++;A@?>======>>>=====>==>>>====>=====>>>>>>>=>>>====>>>>>>>>>>>>==>>===>=====>?A@:+
	
		

+
(7 at A@>============>>>>>>>>====>>=>===>>===>=>>>==>>>>==>=>>>=>====>>======>@A>4$
+
+
+		


+!0<AA?>================>=>>>>===>=======>>>>>>>>>>>>>>==>=========>===>>?AA:*
	

		



#1<AA?>=======================>=======>>>>>>>=>=>==================>?AA<0	
	
+


!/;AA?>>>================>==>=====>=>>>=>>==>===============>=>>?AA=3#	

		



,9 at A@????>>>>>>>>======>====>>=====>>===============>>>>>?@@AA=4#

+
	
+

$2:>AAAAAAAA@@@??>>>?>>?>>>>>>>>>>=====>>>>>>>>???@@@AAAA>8- 
+
+
+	
+

).-/3788;>@AABBAAAA@@@@@???@??????@A at AAAAAAAAA?>=:92*!

+
	



 #',-1569;=>?@AAAABBBBBA?;9975433/,("


	

			


"$'),--,("

+
+		
+





								
+








+









	


																																																																																																																																																																																																																			 [...]
+																															
+


																																



+																														
+		
+

+																		
+
+		
+			
+	
							
 [...]
+				
		 [...]
+
+
+
+
+	
+
+					
+			
+
+		
+														
+



+

				

+
			
+
+
+
+
+
+
+
+
+		
+



+										
+
+
	
+
+	
+
+	
+
+	
+
+
+			
+	
+
	
+							
+	
+					




+				
+	

 

	
+		
+
&047887641.+"

+	

0:>>>>>>>?>=;4%	
+
*;>=========>><1

	
+
+
$8>============>9$
	


+		1=>=<=============3

+	

	
#:?==<==============>>6%	



+
	
+!;>=<====<=<<<==<======>?2	
	




+	7><<<====<=<<<===========>5	
+				->=<<=======<=<<========<<=>3
	
+		":><<====<====<<<===<====<<<=>0
+
+			7><<========<<<<==========<<<==+		
	
+						
0')>=<<=======<<<<<==========<<<<=;$
+	
+

+	
+		
+				
4=9=<======<<<<<<=<<=<=====<<<<<<=>6
+	

+	
+
+					5=======<;<<<=<<=<<<<===<=<<=<<<<=<*
			
+							
+!:<<<===<;;<<=<<<<==<<<=<=<<<<=<<<==0
+
				
	
+
8><<<==<;<===<<<<<<<=<=<==<<<<<<<=<9,			
+	
+5>=:;<==<=<=====<<<<<=========<<<<=5(
						,>==;==============>===========<=<<=7 
+		
+	
+
+7>=;<============>=?>=============<<=1
+			
+
+	
+	
":>=<==============>>>===>==========<==-
+
+		
+
+				
4============>>=BID>>>>>BB<=========<>=(
		
		
+		
#-8==============CQK?===>>DSJ============.

+	
+		
+/=??>========<====CMD<======>HYM?=========<-.<	
			
+	
+8?===========<<===AHA<========<EUM?========>=2,B*


+				
+7?=========>==<===AEA===========<?MM>=====>>==>?; 
+
+


+	
+	
+	
+			
+
+*?=====>>>====<===AIA=============<AQD=====>>==<<>>0	
+
+
+			:>>>>====>==>====>G@<====>=========<BG====>>=======?8
+
+
+						-?=>>=====>>>>====@A====>?@@?>>>=====85?===;========<?3


+
+
+			
+"?>>>>=======>===>9$-<=<=:-+/;<:<>=<=;3><<;==========?*	
+

+		

+		
+
+<?>===========<9== 3>=<24:9808=;	8==<===========>

+
+		
+
		
+
+
+
+
+0@>>==>==========>4
6<:697:::9/8:"
+	
+==>===========>1
+				

				
+
	>>>=>=========??=>&	

9=<;;;:;;<=1

*=;3===========>>#		
+

							2?>>>>=======>>0->=5/=??=8<=<;;;;<<<;93*#)3;=:1=>=========>>=

+			
				>>>>>======<<=>
?==KF=>>>>===<::====>???BA=>>?=>>==========>9							-@=>>======<;;<?25?>>LE=>>>=>===========>=MR>>>>=>>>==========@%						;>==>====>>>>==???>>>?>>>>>=>>>=<<==>??>>=FK>>>?>>>>==========?4

+
+
+				
+			
@>>=======>??@?>=====>>>>>>>@>=AIMJA>@?>>>>=>>>=>>=============;
+
+			
+							-@>>========>?>=<===>>==>?>>>>DPUXUV[G>>>>>?=>>>>======>=========				
+						
+		
8???>>========>>===>>>==HPHA?M_[MONJPXQ@>?>>B?>>>>>====>>=======<			
+
+
		
+			
+

=>>??=========>>>>>>>>>>GQTTZ_XSNHIGGFPOCCELVE>>>>>>?>=>==>>>==>;				


+
+
+
+
						

	
@>>?>======>>=>===>?>>>>@D>C_\UQORQSUPIO\SO[V@>?>?>>??>>=>>>>>>>>$
	
+
+




+							
+


!A>=====>==>>=========>GHFE6DkcWSSTQTSTV_d>6MXFFA>>>>>>?>>>>>>>>>?=


		


							
+

 A=====<=>>>>=>>>>>>>>?EL^YNk}n^TTQTSTT\goC<U]W[L=>=>>>>>>>>>>>>>>A2++


+
	


+
+								

<>=====>>>>>>>>>>>>>>>BJJWbv}k_XVQ\`[]hxxYJIA?BB=>==>>>>>>>>>>>>=?;3??8#	
+
+									
+



+6?===>>>>>>>>>>=>>>>>@N^[T\cT>>?@@DFGKHNbUFAB?>=>>>>>>>>>==>==>>==>>?>@:/)

+						
+


	&=?===>=>>>>>>>==>>>=<JbSU\piC;;=====;;>>MXUUPN@==>>>>>>>>>====>>==>>=<=??=7,
								
+


&>?>>===>>>>>>>>===>==;Qt`^jumW>=>>>>>=;<BXpoeb_G==>>>>>>>==>===>======<<=>??=5%
+								

+:?>>====>>>>>>>>===>===Eflrssl_O=>>>>>=;E]]glebWB==>>>=>>>>>>>=========<<<<<=>?;40-)$
	
+								
+

0@>>>====>>>>>>>>========KaldXPQ`S?>>>>=Kk`SX\cXH>=======>>>>=>==========<<<<;<>??>=<94,




					




=?>>=>>>=>>>>>>>======>=>?@@>===HjYD>=@QmV?>>>@>==>===>==>>>=>>=============<<<==>>???>:-
			
+

 4@>>>>>====>>>>>>=>>>====>>??????=Ga[QNViX=>???>>>>>=>=>>>>>>========>========<<<<<==>???6%				
'9?>>>>>>>==>>=>==>======>=>>>??????=J[UV\T>>???>>=>>>>>?>==>>>>==>==============<<<==<=>?@=4*!

		
(<?>>>>>>>>>>>==>==>>======>>>>>?>??>>=KTP\@>>??>>>===>>>>>>>>===>=>>===>=================>?@<5+ 

	
 
*:?>=>==>>>=>>=>=>>>===>==>==>>>>>>?>>>=H[WW=>>>>>>>>>=>>>>>>>=>==========>================>?@?;3(

	
+
+	
#+09?>=>==>>>>>>>==>>======>=>>>>>>>>>>>>>>SZUY@>>>>>>=>>>>>>>>>>>==>=====>====================>?@>80$
		
+

+
$08;?>==>===>>>>>>=======>==>>=>=>>>>>>>>>>@HFFH?>>>>>>>>>>>>>>>=>>=>>=====>>>===================>??<5*

				

$0:>?>=====>>>>>>=>==>==>>=>>===>>>>>>>>>>>??>>>>?>>>>>>>>>>>>>>>>=>>>>======>>==>=================>??;3(		
+
!/9??>=====>>==>>>>>>=====>=>===>>==>>>>>>>>>>=>>=??>>>>>>>=>>>>>>>>>>>===>>>==>=====>==>===========>??<5+
	

,7=?>=========>>=>>>>>>===>=====>>==>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>>>=>>=>>>>>>===>>>>>>============??<4)

"1:??>====>=====>>>=>======>==>==>===>>>>>>>>>>==>>>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>============?@;2%


&3<??>====>>=>=>>>>>==>>>>=>>>====>==>=>>=>>>>>=>>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>===>============?@:/!
			#3=??====>>>===>===>>====>==>>>=====>>>>=>>=>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>===>==>>=========?@9-

+
+	!2<@>=====>>========>=>==>==>>==>===>==>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>==>>>>>>>>>=========?@7(


+	

0<@?====>>>======>>>>================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>==>>>>>>>>>>>==>>>>>>>>>>===>>====>??6&
+
+
+	
++:@?====>>>>>==>>===>========>>>=>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>=>>=>>>>>>>>>>>>>=>>>>>>>=>>>=>>====?@<1"
+

+

%5>@>====>>>===>===============>>======>>?>>>>>>>>>>>>>>>>=>>>>>>>>>>>=>>>=>>>>>>>>>>>>==>>=>>===<=?@?5%
	

+

+

/<@?>====>>>==>===>==========>=>>>==>>=>>>>=>==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>=====>>======>@>4#	
+
+

+&6?@>====>>>>>=====>>======>=>>>>=>>===>>>>??>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>==>>=>>======<=?@<.

+	
+
+
,:@@>====>>>>=>====>======>>>>>>>>>>>>=>>>A?>>>>>>>>>>?>>>>>>>>>>>>>>>>>>>>>>>===>>>>=>>>=====?@;+
+		
+
0<@?>====>>>=>>=====>>>=>>>>>>>>>>>>>??@@????>>>>????>>>>>>>>>>>>>>>>>>>>>>=>==>>>=>>>>=====?@;+
+
+

	


+"3>@?=====>=>>>>==>>===>>>>>>>>>>>>>????>>>??????????>>>>>>>>>>>>>>>>>>>=>>>>==>>>>>>======?A=.

+

+		

+%5?A?=====>>>>=====>=>>>>>>>>>>===>>==>===>==>>>>>>>>>>>>>>>>>>>>>>>>>>========>==>>=====?@=-

+
+		
+

$5?@?========>=====>==>>>>>>>>==>>==>>>>>>==>==>>>>>>>>>>>>>>>>>>>>>>>=>>>===>>========?A>1
+
+
			


+$5?A>========>===8<=<>>==>>>>==>>>>>>>=>>>===>>>=====>>>=>>>>>>=>>>===>>=>>>>==>=====?A at 4


+
+				


+$5?@?>==========:=>====>=>=======>=>>==>>>=>>>==>=====>>>>>>>>>==>======>>>========?A?4

	

+				

	#5>A@>========>>===========>>=====>=====>====>>>>==>>>>===>>>>>>>======>>======>?@A=1

	
					
+
+ 1=@@?>>===================================>>>>=>>>>==>===============>======>@A?7(
+
+
+					

+
*7>@@?>>======================>>===========>>>>===>=>>==>===========>====>?A at 9,


		



*5=@A@>>=================================>=>===================>=====>@AA<0	
+		
+

&1:>@@?>>=====================>=================================>>@AA=4$	
	
+




%/:?A@@???>>>>>>>>>>>==>>>>>========================>==>>>>??@A@<1$

+
		


".8>@@@AAAAAAA@@@@@?????????>>>>>>>>>>>>???>??>???@@@@AAA@=6, 
+
+
		



&+,,.13457<<:;<>?@@AAAAAAA@@A@@AAAAAAAAAAAAA@@?==<<82*

+
+		





"&(-1479:;::852+)**+,-/-*&%




	

		




						



+
					
+
+	




+

+											
+
+
+
+














+


+
+									
+
+
+																																															
+																																																																																																																																																																								 [...]
+
+																												
+		


																																						
+								



+																																											
+			
+									
+

+																																												
+	
											
+
+
+					
+			
+	
+				 [...]
+
+		
+	
	

+

				
+


+
					

			
+							

+

+	
+


			
+	


+
+

+		
+
+
+
+
+
+
+
+				


+
+
+
+

						
+
+
+
+		
+			
+					
+	
						
+			
	
+



+
			
#+02332.("	
+
+
+,8=>>>?>>=8/		

+
/;=>======>>;.	

			.;>>=<=<<======<3!
			

			
!8?>===========<==>?9(		
		
!9>=<<===<===========>>4	
 [...]
+9><<<===<<=<=<<======<<<<==0
		
6>=<<===<<<<<<==<<====<<<<<=<)
+




+
+		
	

3>=<<===<;<<<<<=<<=<=<<<<<<<=>9!
+
+
			
+
+					

+)+&;=<<<==<<<<<<<<<=<<<<<<<<<<<<==0
						


+*C;><<<===<<<<<<<<=<=<<<<<<<<<<<>=5

+

+							
+	
+			>?<;====<<===<<<<<==<<<<<<<<<<==:2!

		
+	
+	
+;<;;==========<<<<<<<<===<<<<<=9-#
		
+		/>;;<==========<============<<<<;(
	
+
+		
"9=;;;<===========>===========<<<=5
+	
+		,==<<<<===========>>============<<=0						
+
+	+;>=============>A?>==>>=========<==,
+						
++9===========>=AJMB=>>CNF==========>7
	
+	
+		

19;=>============@JJB====?NSF==========7
+

+	
+		
+
+
+	,>?>=>==>====<====@GD=<=====>FTI>========>7#	 '
			
+	
+	
.?>=<=============@GD>=========JPG>========>?:.E9

			
+		%?>==========<<===@FD>=========<=AFG>===>>>>===>=&
+
+				
+:>=====>>====<<==CGC>============<AKI====>>>=<<<=>-
	
+			
+				
+.?>>>=====>>>===<COD====>>>=>=======GOF<=>>========?.

+		
+
+		
+		(?>>>======>>>====HJ>===>=<>?>=======<KP?==;=========?+
		

+			
+	"?>>>>=======>=<>=>?8===<6%.<;:;;==>7-LB<<<==========?%
+
+
+		
+
+<?>=>>>========;<>5
3>=8.(
/;:::)4>75?<============>:
+	

+		
+		1@>>===>========<=;! 7===<;:9;<8::	
9==>===========?2
+

+			
+
+	
?>>>>=====>===??==6
""

:==;;::<==<-
4=:4===========>?0
		

						
+
+
5?>>>>=======>>22>=:<A??=7<:=<;;;<==;92%(38=91>==========>=?%
+
				
+
+
?>>>>====>=<<>:>=>UJ=>>>>====9;=<==>??=EJ>>?53>>==========>:	
+			
+
+0?=>=======;;;<=&.?>?GA==>>>==============JTA>?51>>>==========? 
+			
+	<>>>=====>>===>>>>>>>>>>>>>>>>>=<<==>>?>>=AG?>>???>>==========?-							!@>>=======>????=====>=>>>>>>@>=>FJF?>@?>>>>=>>==>=====>===<===>2

+							/@>>>>======>?>======>>>=>?>>>?IQVTUWD>>>>>?>>>>>>=====>=======?3
							

+
+
8?>?>=========>>===>>>=>C@?>=CYYOOKKQ[O????>>>>>=>>========>>==>5

	
+
+					
	
+		=>>>>>========>====>>>>ANNMGI]aUQPNMLQ]J=?@AFA>?>>>>>>====>>>>>>=#
+



+
+
+

+				
+

+	>>=>??=====>>>>==>>>>>>?OVFK`aVWTSSRUUW\LECKUD>?>>>>>??>=>>>>>>>?<			




					
+
+	
+	=>=====>==>>>>===>>>>>ENYH2 at dk`]YWTRUYajX=6D^PB?>>>>>>?>>>>>>>>>>A*
10!


+							
+
+

	
5?======>>>==>>>>>>>>?DILA=Fjp_[XSQQWZalW96 at PUOB=>>>=>>>>>>===>>=?87@@<-

+


+										
+
+	
.@>===>>>>>>>>>>>>>>>>ATNA=CP\]YYVVXXY_cI<=>>????===>=>>==>>>==>==>?>=?>95(
	


+											
+

(<?>===>>>>>>>>>>>>>>=>P`baVF>?DGIJNMOUL@<;@KKB>>>>>=>>>>>==>>=====>>=<=>??=6(	
									
+

	,>?>=====>>>>>>==>>>>==@R]hhgcI<;<==>=<=>>@P]\VL?===>>>>>=>>>=>>>======<<<<=>?=0$
+	
+						
+



&>>>>====>>>>>>>=>>>>===FYZ_X[eU<<>>>>>=;=@NebWUTE===>>>=>=>>>====<<=<==<<<<<<=>>;6530-( 
+


+					
+




:?>>>====>>>>>>>=>==>===Ca_\]gjaG<>>>>>=<?PWab]a\E===>>>=>>==>>===<===<=<<<<<;;<=>>?>>=<6(	
				
+



(@>>>>====>>=>>>>=======>>M\[X\]]eI=>>>>=AWe[V[b^K========>>==>>>============<<<<<====>>??7!			
+



+;?>=>>>>=>==>>>>>======>=>@@@?=>?RfK@>>>DSMA?@AB?<=>======>>>>==>==============<<<<<<<==>@=5.'	
+



1>?>>>>=>==>=>>>>==>=>=====>???>>?>=OaRCAHSJ>>>>?>>>>>===>>=>>>=>===<<=============<<<<==<=>@?<6.%	


&6>>>=>>>>>====>>>==>==>===>>>>>?>??>>>P]SPWM>>>??>>=>>>>>>>>==>>======<=>====================???=91(

+
+

',-9?>======>>>====>>==>=======>>>>>>?>>?><Q[ZYC>>??>>>=>=>>>>>>==>>=============================>>??=93,	



#.7;<?>======>>================>=>>>>>>>?>>>=J]\V=>>>>>>>===>>=>>=>>>>=>>============================???<94	
#2:>?>>======>>==>>>>=============>>>>=>>>>>=A[]ZfE=>>>>>>>>>>>>>=>>>==>==============================>??>;7
&2<??>=<======>>>======>=========>>>>>>>>>=>>=K[WYbK=>>=>>>>>>>>>>>=>>=======<=>=======================>>??<8	
!2<?>>========>>>>==============>==>>=>>>>>>>>>JOCIWD>==>>>>>>>>>>>>===>>=================>==>============>?=:
+
-:??==========>=>>>===>====>======>>=>>>>>>>>>?EE=BKA>>>>>>>=>>>>>>>>>>>>>>>==>>>=====>==>>=>=============>?>;	

5>?>=<========>===>>>>============>>=>=>>>>>>>>>>>?@>>>>>>>>>>>>>>>>>>>>>=>==>>=>>====>>>>===============>?@>:	



$:??><==============>=>=>>=============>>>>>>>>>==>>>>>>>>>>>>>>>>>>>>>=>>>>>=>>>>>>>>>>>>>=====>=========>?@=8
+


'<?>====================>>===>>>====>===>>>>>>>=>==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>=>>===>>==============>?@<6

+

+)<?>======>=============>====>====>==>>==>=>>>>>>=>>>>>>>>>>>>>>>>>>>>=>=>>>>=>=>>>>>>>==>====>>==========>??90

	

':@?====>=>>>========================>>>>>>>>>=>>=>>>>>>>>>>>>>>>>>>>>==>>>>>=>>>>>>>=>>>>>>>>>>========<=>@>6*	
+
+	
+!8??>===>>=>=====>==>=>=======>>=>=>====>>>>>>>>>>>>>>>>>>>>==>>>>>>>==>=>>===>>>>=>>>>==>>=>>>=====>>=<<=>@<2'
+


	3>?>====>>>=>>===>>===========>>>==>>=>>>?>?>=>>>>>>>>>>>=>>=>>>>>>===>>>>>>>>>>>>>>>>>>>=>>>=====>>==<<>?@:.!	

	,<@>=====>>>====================>>>>===>=>??>>>>>>>>?>>>>>=>==>>>>>=>>>>====>>>>>>=>>>>===>>=>=>==>=====?@=3$	
+


"8??======>>>========>==========>>>>>=====>>>>>>>==>>>>==>>>>>>>>>>>>=>>>>>>>>>>>>>>=>===>==========<<=?@;. 
+	
+
	0=@>=====>>>>>>============>>>>>>>>>>>====>>=>?>>>>>>>=>>>>>>>>>>>>==>>>>>>>>>>>>>=>>>==>>==========>@?5%
		


+%7??>=====>>>>>>>=====>======>>>>>>=>>>>>===>@@>>>>>>>>>?>>>>>>>>>>>>>>>>==>>>>>=>>=>>>>===>>>=====?A>3 		

+

	,:@?>=====>>>=>=>>=>>>=>>==>>>>>>>>>>=>???????????>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>==>>>=>=>>>>>====>@?3	

+	

0<@?======>=>=>=======>>=>>>>>>>>>>>>>???>>>>>???>?>>??>>>>>>>>>>>>=>>>>>>>>>>>>==>>=>>>>=>====>@?4 	
	
	 2=@?>======>>>=>=====>==>>>>>>>>>>=========>=====>>>>>>>>>>>>>>>>>>>>>>>>=>>>==>>>>>>>>======>@>3"	
	

	"3>@?>====>>>>=======>>>===>>>>>>>>>===>==>>>>==>=====>>>>>>>>>>>>>>>>>===>>>=>>==>>>=======>@@4



+
+
	!1=@?>======>>======<=>>>>>>>=====>>>=>=>>=>>====>>=>==>>>>>>>>>>>>>>=>>===>>==>>>>=>=====>@@6"
+	

	
/=A?>============98==>>===>==========>>==>>==>>>>=>>>=>>>>>======>===>==>=>=>==========>@@6 	

+		
	
.<A@>=======>>><:<=>=====>===============>>>>===>>>>==>====>>==>==========>=========>?@?5
	
+				
+	
,;@@?>=====================>===================>===>>=========>>======>=>========>>@A=0

	

+					
+


+(8 at A@?>====================================>=>>>>=>>>>=>==============>========>@A?6&	
+
+						
+	 1;@A@?>>===================================================================>?A@:,

		

+
#1:>AA@?>>============================================================>>>?AA<0

+
		
+
+

)29>@A@?>>>=======================================================>?@AA=2"	
+	
+


#+4;?AA@?????????>>>>>>>>?>>>>>>>>====================>>>>>>>?@AA@:1$
+

+		


#,6=@@A@@AAAAAAAAAAAAAAAA@@@@@?????@??@?????????@@@@@@@@AA?;5,

+

			


"*-,-/2321363,*+,-/136:<=??@@@?>=>==>?@@AA@@??>=>>=<94(



					
+



 


"$'&$"  

 #
+
					
+



			

										















+													
+





+


+																					
+
+
+
+











	


+												
+


																																																																																																																																																																																																								 [...]
+
+
+
+
+																																													
+							



+																																															
+		
+							
+


																																																
		
+		
+
+											
+					
+		
+		 [...]
+
+				

+					
+
+	
		
+
+
+


+	
+			
+


+
+
+
+		
+	
+


+	
+
+				
+		

+					
+
+
+
+
+
+	
+
+
+


+
+
+		
+

	
+	
+

+
+
+	
+		
+
			
+						
+				
+


+
+
+
+	
#),,*&

			
+.8<====<8,
	
+
+
+"3<>>======>>:0!
+
		
+

	
	
+	.<>==<<<<<<<==>>=6$		
+
				1===<<<<<<<<<<<<==><-	
+		.<=<<<<<<<===<<<<<<<></
	
+	
#9=<<<<=<======<<<<<<=><,					3==<<<<====<====<<<<<<=>:(		

+,<=<<<====<<<==<=<<<<<<<==7"
	
	
				+9>=<<<==<=<<<==<==<<<<<<<=<0	


	
+			
+

%:>=<<====<=<<<=<<=<<<<<<<<==5"
	
+				31>==<=======<<<<<<<=<<<<<<<=<4#			
+				
						


		M98=<<<====<==<<<<=<<===<<<;<<4'		
+		
6A<<;<=======<<======<==<<<<<<2
+				
+.<<<<<====================<<<=9"
		
+				2>=<<<=====================<<=<0		
+		
+5>=<;==<=====================<=<,				
+/;==<========>=@D@=?B>=========>9$	
+				
+	
'.2:=============@GE>=?PL?=========:*	
+
+	
+		2>??>>============BEA====@GHA========><,
+		
				
+
+
;?=<==>>=========>DF@<=====>KOC=======>=>=5"
+
+		
+
+	:>===========<===?EF@========@LNB====>=====>?5FB
+
+		
+
+4?===========<===?EE@=========<?HGA===>>>=====>B/		
+
+	
+	
+	)?>>=============@DE?=====>>====<=CFB====>====<<==$		
+		
			
+	
+)?>>>======>=====DHD?====>>?>====<<>FGD<===>======>>)
	
+
+
+		
+	*@>>>>>>=====><<=AIH@====<6;=<9;=====@HOD=<;=========@*			
+
+			
+"?>>>>>========<==CKE===<5-);::99<=>,
BKH=<========>=>>
		

+				<?>>=>>========<;=BE$0=>;55#1;;:;6:>0%JD==<==========?:
+
+
			
+
+3@>>============<;=:17=>==;:;;===99A<<<==========>?;	
+
+
				
+	 ?>>>=====>>===??>==>60#;==<;:9;=<=0

(<<<8===========>?7

+				
+
+
7?>>======>=>>>43>==QI>?<6<:==<::<=<=:/"-8;=;&9>===<=======@&	
			
+
+	 @=>>=====><;<=;>=>TJ<=>>=====<<<<==>?><IYA=<">>>=========>7

+
+	
+
+		2?=>=======;;;<=+2?>>?>==================<GWC>>#
=?>==========>
+		
+	<>=>=====>====>?>>>>>>>>=>=>>>>=<<<===>>>=>B>>>>=?>>>====<====?
+		
+
+!@=========>????=====>>>>>>>>@><@GIHA>@??>>>=>>=>>=============?#
+		
+
+	-@=========>>>>====>>>>>>>?>>?CPVUSWXJ?>>?>>>>>>>>=>===========?1
+		
+
+
+		
5?>?>==>======>>====>>>>=>??>BYWNJHILWT@>???>>>>>>>>>=====>====>=$
+
+



+						
+


+	
8?=>?A>=====>=======>>>CF??><L^TPONMLMZI=??>>???>>>>>>=====>>=>=?9

+	


+
+


+					
+

+
+		
5?=>?@=====>>>>=>>>=>>>ESD??FO`\WUVUTUWN?>>=@A?>>>>>>>?====>>>>>=?!%42%

+





+							

	
+
+*?==>>=>==>>=>>>>>>>>>?FM>1?SXcb][[XX]^WN;9=CA>?>>>>>>>>>>>=>>>>=?6;@?>2&





+								
+
	
+
+
	
+&@>=====>>=>>>>>>>>>>>?@?>:=OY\_][YXZ_ZZQ73=??=>>>>>>>>>==>>==>===>?==>?=90#	
+


+										
	
+


):?>====>>>>>>>=>=>=>?>>MRF>=AS\\[YYWX[[TC>>??>>>>>>==>>>=<==========<<<=>??<1

+
+	
+



+									


+

+/??>====>>=>>=>>>>>>>>>>AVX_VB=BMPQQRRT^VB==GNK@>>?>>>>>>>>>======<<==<<=<;<=>?7%







+						
+

+
+



,>>======>>=>>>>==>>=====MTThwpH;<=>?@?@B?<@VbVPK>=>>>=>>>>>>>====<<<=<<<<<<<<<=?=:89642,



					

+	
+

&>>=======>>=>>>===>>===>>V[[kuu_;<>=>>><;<BYkibWP@====>>=>>==>===<<==<<=<<<<<<;<<=>>>???>8"			

		

+
$:?>>>====>>>>>>>==>=======Ndgja]bF<>===>=<>Z]ed`ZSA<===>=======>=<<<<==<<=====<<<;<<=<==>??9*" 
	
+

+
+


+

5?>>=>====>=>=>>>>=======>>AU_UEFNO@=>>>>=?EQMJMKKF====>>>======>=<<============<<<<<<<<<<=>?=:6/& 	

	
(9?>===>=========>>========>>?DE>>>?ADA?>>>?A@>?>>>>=====>=>>>>=>>===<=<=============<<<<<<<<=>???<71	

+ $(3=?>===>=======>>>===========>>?>>>>>>?CBA@@==>>?>??>>>>===>==>>>>====<<<<=============<<=======>>??>;
 .69;>?>=============>=>>=========>>>?>>>???@BBA@<??>??>>>>>>====>=>>>>=====<==========================>>??	
+%4=>??>===============>============>>>>>>>>>>>CGCC??>>>>>>>=>>=>>====>>===================================>?	
+
-8>?>===========>==>>==============>>>>>>>>>>>=ENGA>>>>>>>>>>>>>>==>===>======<============================>>	
1<?>============>=>=>====>==>========>>>>>>>>>=?LLEJA=>>>>>>>>>=>>>=>=>>===>===<============================>>
+.<?>=============>=>>>=>============>=>>>=>>>>>=KWBAWN=>=>>>>>>>>>>>=>>>===>==================>>==============>
+
"8?>=================================>=>=>==>==>>RQ>AYM===>>>>=>=>>>>>=>>>>>=====>=========>==>================>


+=?===================>============>====>>>>>>>>?KG=BYG>>=>>>>=>>>>>=>=>>>>============>>==>>===================
+

0?>=================>=>>=============>===>>=>>>>>??>@F?>>>>=>>>>>>>>=>>>>>>>>>>=======>>=>=====================>
+

3?>=<=========================>=======>>=>>>>>>>>>>>>=>>>>>>>>>>>>>>>>>>>>>=>>>==================>===>=========>
+
6@============================>========>=>>>>>>>>>>>>>>>>>>>>>=>>>>>>>>>>>>>>>==>===>>>>==>>>=====>>=========<=>


7@>============>=========>====>======>>>=>>=>>===>=>>>>>>>>>>>>>>>>>>>>=>=>>>>>=>=>=====>==>===>>====>========>?
+

+

7@>===========================>===>>==>>>>>=>>>====>>>>>>>>>>>>>>>>>>>==>>====>>====>====>>>==>>>=============>?
+
+ 5?>===>========================>>========>>>>>>>>>=>>>>>>>>>>>>>>>=>>>=====>>>>>=>>>>===>=>>================<=?@
+
+

/>?=====>>>=====================>>=======>>?>?>=>>>>=>>>>>>===>>=>=>>===>>=====>>=>>>>>>>>>>=>=>=======>==<<<>@@
+

+
(<@>=====>>>===>==================>=>>>====>?>=>=>>>>>???>>>>>>>=>>>>>>=>>>===>>>>>>>>>=>==>>===>=====>>==<==?@>	


+6@>=====>>>>>>>=>>=============>===>>>====>====>>>===>>>>=>>>=>>>>>>>>>>>>>>>>>>>>>>>=>>>=======>===>=====>??<4		
+

.>?>====>>>>=>>>>>=>=========>==>>>>>>>>====>>=>?>>>>>>>==>>>>>>>>>>>>>>>>>>>>>>>>>=>========>==========>?@=5)	


#:@?=====>>>>===>>>=>>==>=========>>>>>>>>=====???>>>>>=>>>>>>>>>>>>=>>>>>>>>>>=>=>>======>>>>>==>>>====?@;0!





/>@>====>>>=>>>>>>=>>>>>>=>==>>>>>>>>==>???>???>?????>>>>>>>>>>>>>>>>>>>>>>>>>========>>>>>>=>>>==>==>@@:,

+
+

+
 7@?>=====>====>>>>===>>>>>>>>>>>>>>>>>>>??>>>=>>>??>>>>?>>>>>>>>>>>>>>>>>>>=>=>>====>>=>===>>>=====>@@9)
	




	);@?>=====>=>==========>======>>>>>>=>>=====>=====>=>>>>?>>>>>>>>>>>>>>>>>>>>>=>==>>>>=>===>>>====>@A9'
+
+	
+
	-;@?=======>>==>=========>>>===>>>=>>>>==>==>>=>>=>>>====>>>>>>>>>>>>>>>>====>>>>>>>=>>>=>======>@@7#	


+
+,;@?>=====>==>>===============>=========>==>==>>>>==>>===>>>>>>>>>>>>>>>>>>=>>>==>>>>=>=======>@@:$		
+(8@@>========>======<===>>>>=<============>==>>=====>>>>=>>>=>>=>>>>>=>>>>========>>>==>====>@@8'	

+	
+$7@@>========>====;9=====>==<============>====>====>>>>=================>====>>===========>@@6!	
+	
+

!4>A?>==========>;:========>=>>====>=============>>===>====================>>====>======?A at 5

	


+	
+
	
/=A@>==========================>>============>>===>>>>==============================>@A<.
+
+
+					

	):@@?>=========================================>===============>========>>======>>@A?4#

					
+
 2=@@?>>=============================================================>========>?A at 7'
+

+			
+

+
+#2;@AA@?>>>====<<========================================================>>?A@:,


+			
+
+
+3:>@AA@?>>>================>>>>=>>>===============================>>>@AA</



				


+!(/6<?@A@???????>?>>???@@@@@@@???????>>??>>>>>>====>>>>=>>>>>>>?@AA?80!
				
+



"+5:=@A at A@@@@@@@@?><;<<<=??@@@AAAAAAAAA@@@@@??@@@@@@@@@@@AA?;3'		

+				



!*-..021.*(%
"#%&'''&$',279;=>?>>=====>?><;7/#	

+		
+





"#!

	

						
+









+
+									


+
+												
+
+




										
+
+


+	
+





+																									
+
+










+
+

+																																																																																																																																																																																																																												 [...]
+																																																
+



+																																																
+									


+																			
+				
+																							
+
+		
+
+	
+								


+		
+
+		
+

+		
+	 [...]
+
+
+			
+
+
+
+
+
+
+					
+		
+

+	
+								

	

		
+	
+
+			

		
+
+		
+			
+	
+
+		
+
+
+

+
+
+
+	
+
+
+
+
+
+
+			
+

+
+		
+
+	
+	
+
	
+
+
+
+							
+						
+
+			
+		


+				
!'**'!			
	
+	!/7;=>>=<91&
		


+



+

0:>=======>>=7)
				
+!4===<<<<<<<<==><3!	
+

3<=<<<<<<<<<<<<=>=5"
+
	


+

+
+.;=<<<<<<<=<<<<<<==<3
		
+	
+


+&8==<<<<<<<=<<<<<<<==:/

+
					

+
4==<<<<<<<<<<<<<<<<<==8)
+
+
+
+
	

+	.;=<<<=<<=<<<<<<<<<<<<=:1
								

+
+
':==<<<=<<<<=<<<<<<<<<<=;4"	
+
+			

+		
+
+	(7=<<<<<===<<<<==<<<<<<<=8.
	

+
+	
+			
+
+


3#!;==<<<=====<<<<=====<<<<=8&
	
					
+0D6>=>>================<<===;-	
+
		
+
+		+69=====================<==9,						+4<=<====================<<=8$			
+		1;==<=======================>8#
			
+
+
+!6>><<==========CIBGE=========;-			
+		
+.:>===============ADA at CJ@=====>>=>=3 
	
+			
+)=?======>========>AB><=<>CA>====>===>>:.

+
+	
+	
+-?>=<=====>=======BFC======?KJ?=>==>===<=?=*	
+		
+		
+'?>===<<=====<====BGE>=======CMH?=>===>===<=?8 at C
+
+		
+=>>=========<====BEC=====>===<AJF?==>========>C>
+
+
+			
+
+
%=>>>=============AE@=<===><<=<<<?HF>=>=======<<=;"
+	

+
+
+		
+	
.@?>>==>===>=====@DEA=;<<<<=87<=<<<?DB>==<<=======>?*
+	
+	

+		
+
+	
-@>>>>========;:=AKFB===<=:9;;79====;?EGA=<<========>?#
+
+	
+
+			
+
+%?>>=>>=>===>==<<=GIH?====;59:::8;==:&DHK=<=========>>=$
+
+

+			
+
+	=>>>============<=EQ=.<====::;;:;==>*	
6LG=<<==========>?(		
+	

+			
+

5?>>==>>========<9<JT-4====;::;===9
OE<<<<==========>>

+	

+
+			
+
+#@>>>=====>>===?>=>=MM5-$=====;:<=<>1

PD<==>===========>8
+								
+
+	8>=>>========>>87>=>RP>><8<<=>===>=<=8, !<[D=:!7>===========?"
+					
+
+	!?=>=======<;;==

>==KF<==>=<=========>?>=L\E=; ?>>=========?/	
		
+
+
+2?========<;;;<>32>==============>=>=====<CRB=># >?>>========>6

+		
+
+<>=======>=<===>>>>>>>>>===>>>=<<<<===>==>==>>>==>=>>==========
+		
+
		
?>>=======?@???=======>>>>>>?=@FIHIB>@>>>>>>>>=>>=============>-
+				
+
		'@==========>>>===>==>>>>>?>>?HWZVUX[MA>>???>>>>>================
+
+
+
+					
+
	,@=>@>=========>>==>>>>>>>?>=C^XSTUTT[U@>????>>>>>>=======>=====@2


+





+					
+

+)@=>?@>=====>>===>=>>>??>>?>BHYYXUUWUWZD=>?>>>>>>>=>>=====>=>>>=>;+62&	



+
+
+

+			
+

+
>=>??>>>=>>>>==>>>>>>?@?>?@VLPVUPOPQSNGD>>>>??>>==>>>>====>>==>=>6=??>6.#
+



+			
+
+

+
+
>>>>>>>==>=>>>>>>>=>>>>?<6E_OIPNLKJJLHRU><=>>>>>>=>>>>=<=========>><<=??=7+
+	


+					
+


+		*9?>=====>>==>>====>>==>=>=6B^TFJHFEEEGEYY92>>>=>>>>=>=>><=>=========<<<<=>?>7$

+



+
+					
+




+0??>====>>==>=>====>==>>=FG?>>P\LJGEDDEGJdO=>=>>>>>=>>>>>==========<<=<<<<<<<=?<*



+




					
+
+



	/?>=====>>>=>===>====>>>=?V]YF<@LJJHECEHNOR>=BMN?>=>>>>>>=>=>=====<<<<<<<<<<<;;<>>:997664"


				
+
+



	
+1>>=======>==>>>>===>>>>==FMPjsU=<>>?@A?@BB><K`XPG=>>?>>===>>>>===<<<===<<<<<<<;;<=>>>>???<(		
+
+




+	
+
4?>========>>=>>>==>====>==NNKWiuP:<>>?>><<=>YqdVKM>===>=>>=>>===<=<<<=<<=<<<<<<<;<<<<<<<==?>4+(% 
	





+
+

(4?>>=====<=>==>=>>==========TULSbcnF;>>>=>=;>[jj`WQJ=====>=>=>=====<<<<<<<======<<<;<<<<<<<<<>?>=:62
+

+





'-39>?============>===>=========JY]`VO]eB<=>=>;?elU\^VH>=====>========>=<<<<<========<<=<=<=<<<<<<=>>??>	

%19;=>>===============>>====>=====@PPC>>@ZeI====AdkI@@@@>>======>=========<<<===============<<<<<==<<=<=>?
+

'09>?>>============================>>>==>>>>SfZNLS`YB=>>>?>>=>===>>==>>======<<=============<<<<<====<======


%/7=?>===============================>>>>>>>>?>I\^`ZN>>>>>>>>>=====>>====>>====<<<============================
+6<?>=======================>=========>>=>?>>>??>DLJB>?>>>>>=>======>>>===>====================================
*8>?>=<============>=====>>===>=======>=>>>>>>>=>?=@@<>?>>>>>=>>>==>==>>>=>>======<=============================$4??>===============>>>====>============>>>>>>>>=>>><<=>>>>>>>>>>>>>>>>>==>>>=>=======================<==========
+<?=<==== [...]
%:@=<===============>==>>=============>==>>>===>>>?B>>>FB>>>>>>>>>>>>>>>>>>>>>===========>========================-=?=============================>===============>??>>>>@?>>>>>=>>>>>>>>>==>>>===>>>>>>>===>=====>=================
#5>>=============================>======>====>==>==>>>>>>>>=>>>>>==>=>>=>>==>==>>>>========>=>====>=>>==>==========
/9>>=============================>===========>>>>>=>>>>>>>>>>>>>===>>>>>>>=>>>>>>========>===>=====================

6;>>===========================>========>=>==>>>==>>>==>>>>>>>>>>>>>>>>=>===>>>>=>>================================
"5<?>=============================>========>=>>>>>>>>>==>>>>>>>===>>>=>>=>===========>==>==>======>==============<<<
"3<??=================================>====>>>>>>>>>>==>>>>>>>>>>>>>>>>=>>=========>>>>=>>===>=>==================<<
#3;??====>====>=====================>===>====>>???>>=====>>>>>>>>=====>>====>=========>>>>==========================
+$2:>?>===>>>=====>==================>>>=======>>?>>==>>>>>>?>>>>>>>=>=>>>=>=>>>>>===>>=>>>>>===>>===>>===========<==	

.7<??=====>>>=====>>===============>==>>>=======>===>>>>=>?>>==>==>>>>>>>>=>>>>>>>>>>=>>=======================<=>?

+
+'16>?============>=>>>>===============>>>>>>=======>@?>>>>>>>>>>>>>>>>>>>>>>>>>>>=>>>>>==================>>==<<=?@?
	

'0;@>====>>====>>>>>>>>>>==========>=>==>>>>>===>>????>>=>>>>>>>>>>>>>>>>>>>>>>>>================>=====>>>===>@@=8


+'5>@=====>>=====>>=>=>>>>>>>>====>>>>>>>>>>???????>>?????>>>>>>>>>>>>>>>>>>>>>>======>======>>>=====>>>>===>@@;1&	

,9@?====================>>=>>>>>>>>>>>>>>>>>>>======>???>>>>>>>>>>>>>>>>>>>>>>===========>>======>>=>====?@?7+


+
+.<@>======================>===>=>>>>>>>>=======>=======>>>>>>>>>>>>>>>=>>=>>==========>========>=>=====?A=0!
		

+
+ 1?A>====>=================>==>>====>>>===>====>>=>=========>>>>>>>>>>>>>>========>>=>>===>=>===>====>?@:*	

+

3?@?=======>>=>==>==========>===>>>>=========>>=>>>>=======>>>>>>>>>>==>=>>=>=>>=>====>>>==>==>=<==?A:%	
+	


+2>@?======>>>================>>=<<=============>>==>========>==>>>>>>=>>>=>>>=>==>=>>>>>>>======>@A:&

+
	

-;A?>======>>=>======>========<<===============>=>>==>>>>=========>>=>=>>>>===>>>>>>>>========>@A9"	
	
+%8@@>==============<<=>=>===><=>===============>========================>==>>>>>==>=========>@@5


+



4?A?=====>=======;:==========>>>==========================>==============>==============>?A>0	

		

+
+-=A?>============<=================>>=================================================?@A:(	

+			
+
%9@@?>==================================================================>==========?@A>1

	
				
+


/<@A??>==========<=============================================================>@A>2"
+
								
+

 1;@A@???>>====<===<==<===<=======>==================<=====================>>@A?5$	
				
+

+	(3:=?@@@@?>>=============>>>>>???????>>>>>>>>>=>======================>?@A at 9)
+
						

	
 '.49=@A@@??????>>?>???@@@AA at AAAAAAAAAA@@@????>>>>>>>>>>>>>>=>>>??@AA=6+
	
				
+




#.7<<=?AAA at A@@@><94.)%"!#&&()*+./137;?@AA@@@@@@@@@@@@@@@@@A@=7-


				
+




!',-,.,+(!
(1469:<;9;<<=>???=;6/%


+
						
+





!#"!

		
+

							
+
+





+
+
+
+
+









+

									




+
+							
+								
+

+
+
+														
+
+



+
+
+	
+																						
+					
+
+
+
+
+
+







	
+
+															
+
+																																																																																																																																																																																																																																														 [...]
+																																																		
+										

+
+																
+			
+																																		
+									
+		
+							 [...]
+
+		
+
				
+				
+	
+

+		
+

+			


+
+
	
+
	

+		
+

	
+
+			
+
+	
+
+
+
+
+
+	
+
				

+
+			
+
		
+
+	
+		
+

+
+
+
+		
+			
+			
+	
+
+
+
	
+
+
+
+

+	
		
"%&$
		


	


+
&068::973,"
+		
	
+
.8<=>=>>>=;6,
		

+	

0:====<=====<9/				

	
+	
+.9===<<<<<<<==<8.
		
+
+
+			
+	)7<=<<<<<<<<<<==<6+
	
+			
+	
+	"3;==<<<<<<<;<<<==;4%
			
+
	
/:==<<<<<<<<;<<<<=<7,		
+		
+	


+,:==<<<<<<<<<<<<;<<=7,

+
					
+
+	
+	

)8<<<<<<<<<<<<<<<<<<=9+
						



	

+&4<>>=================;0

+
	
+
+:(,,359<=>>=============<5+
	


+	
+
+		3;#&9:=================<=<1
	
+
+		
+%(6>>>====================2

+				'6?>>=========>=========>==;0		
+	
+%7@?>><=======>==>FHF?====>>>>=6(
		
+
+):??=<============>CHIED>>==>>>>>>?<3!			
+			4?=<=====>>=======?B@=<=@B><=>>=>>===>?5

	
+		
+		5?===========>===?DE?=====@GF>=>>>======?=+
	
+
+		
+4?====<<==>====>=@DF@==>>===FOE>>>=========>6;=	
+		
+	
 9?>>>=======<====@ED><==>===<<AGA>=>=========>AK	
+
+
+				/??>>>============?DB=<<==3':=<<<@FB=============>&	
+


+			3@>>>>=>======;===?CB=:<==<%5=<=<<@D@===:<>======>>%	
+
+	
+
+		
+	
0@>>>>>=>======9<>DEC>=<==<:539;=====ADA==<=======>>>>+	
+	
+

+	
+
+'?>>=>>========<==CLJ@;====;;<<9:==>0
3DIG============>@2
+		


+		
+	>>>==>=>=========<ELM*0>===<;;99<===
>MK=<<=====>====>@-	
+
+

			
+
+
6?>>>==>=========:<GYH 
8>===<;9;===93RF<<<===========>?

+		

+		
+
+	$?>=>>====>>===>>=>=IZA3,0==>>=;<=>=>4
9`E<=?>===========?5
	
+
+
+				
+
+
+8>============>87>==NQ?==;;:<=====>=<:0'.N_E=<,;>============	
+	
+			
+
+
+?=========<;;=====BB<====;<=========>>=LWE=>
(@>>=========?(	
+			
+
+		/?=======><;;;<>20>=>>=========>===>=====<@I?=>-,???>=========9
+			
+
+		9>=======>=<<==>>>>>>?>>>==>=>>=<===========>>>>?>============?(
+				
+
+	>>=======>????>>====>>>>>>>>>>@FGEE@>?>?>>>>>>>>>==============:		
+
+	
?>=====>>==>====>===>>>>>?>??CS]_^`[H@??>??>>>>><<===<=========?&		

+


+				
+
+
+?=>?>>>=======>===>>>>>>??>>@LSOLKMTWF>>>?>>>>>>=========>=====?3
051&
	



+						
+

+;=>?>>=====>=====>>>>?>>>>>EFCDCBAABFE?>>?>>>>>>>=>=============<7???>93)
	






+			
+
		:>>>?>>==>>>======>>???>>??TS@@@?????AMC>??>>?>>====>>>==========>=<<=>?>:1 
	
+





				
+


+(7?>>=>>==>>==>=>>>=>>>>>>=;HRVIBA@@@AAKXR?>>?>>>>>==>>>>>=========<<<<<<<=>?;*	



			
+
+


+/??>======>====>===>>===>>?:5IVYTJGECDEIUXX>2?>?==>?>==>>>>=======<<<<<<<<<<<=?>.
+	
+
				
+


	
2?>=======>==>======>=>==@C>>?@[_`ZUTRPOU^aS==>=>==>>>>===>========;<<<=<<<<<<<<=>:787566,


+
				
+



+
+%8?>========>=>=>>>===>>>=<I[RC@;CZ][YYY\_chZ><=BPF<=>>>====>======<<<<<<<<<<<<<<;;=>>>>>??=4*$	
+
+



+
+ .<?===========>>==>=>>>>>>>=DISdpM;>@?ADDDGOO?;EOUTH<==>>=>===<=<<==<<<<==<<<<<<<<;<<<<<<=<=>>:5.*&"	







 (08>?======<==============>====JPKUfxF;<==>>=;<<<V|mQML====>======>==<=<=<=<<==<==<<<<<<<<=<<<<<=>>>=;9	
+
+

 (18<>?>======<<=======>==========AVQMNTja<<>===><;<LrcRMOL<=============<<=<<<<<<==<====<<<<<<<<<<<<<<==>>
+!+49=??>==========<=================BUMOYdbbS===>=><<Slgb[XTC<===============<<<<<<===<===<===<<<<<<=<=<<<<<<
 +4;>?>>============<==================HQSSQS[m]A<<<<Cdvha[SJC>================<<<<<======<=====<=<<<<<<<<==<<< )39=?>>=============<======>===========>>?====ASqiRFESrz^G@><>>======>===========<<===========<==<<<<===========$/8=??>===============<==================>>>>=>?>>Leg^`jnP>>>>>>>======>===========<<<============<===============&1:>?>=== [...]
+*=@?>================================>>===>=====>>>>>=>=====>>>>>>=>>>>>>>>===>>>========>============================	+<@?>=================================>>>>======>?>>>===>>>>>??>>>>=>>>===>=>>>==>==>==>=>===========================<
+%8??>===============>====================>>========>>>>?>>>>>>??>==>=>>>>>>=>====>=>>=>>>===========================<<	

2=??>===============>>>=>===========>====>>>>=>======>?>>>>>>=>=>>>>>>>>>>>>>>>>>>============================>===<<=
+	*9???=====>=======>==>>>=>==>==>>>===>>>>>==>?>>=>>>??>>??>=>>>>?>>>>>>>>>>=>>>>>>>=======================>>>>===<==?


2>?@?======================>===>>>>====>>>>=>>??@???>>>>?@@???>>>>>>>>>>>>>>>>=>==>=============>========>>====<=>?@
%7;??>=<====================>=======>>>>>>>>?>>>=====>>==>??>>>>>>>>>>>>>>>>>=>>>>>>==========>>========>>======?@?<

+(1<@@>==>==>========================>>>>>>>=========>=======>>>>>>>>>>>>>>>>>===>>=====>==============>>>====>@@<4)
+ 1=@?>======>================>=>>=>=====>=====>====>===========>>>>>>>>>>>=>>>>>=========>>>=>>>==>>>==>===?@?9- 

	!3<@?>==>==>=>>================>>=====>===========>==>=>=====<==>>>>>>>>>>>>>=====>>==>===>=====>=>======?A<0"
+

+
+ 0;@@>======>>=================>===>===============>===>====<=====>>>>>>>>==>>>>>>>==>>>>>===>>=======>?A;*
	
+	


	
,9@@?=============>================<=========<========>==>>========>=>>>>=>=>>>====>>===>>>>=======>@A7#	
+	
+	
$3<A?======>>==========>============================>===>>>==========>>====>=====>>=>>>==========>@?2



	
&8@@>=====>=========<;========<=================>======>======================>>>===========<=?A>.
+


	
/=A?==============<9======><<========================>===>=>====================<=========>@A:&

+	

+	$8A@>===<=========<=========================================<========================<=>?A?5
	

+		
+

+
3?A?>=======================<===============<=========>=============================?@@9*	

+					


	*9 at A@>>=======<<<======<============>===========================================>?@A:,

+							


++8?AA@??>>===<=<<<<<=<<<<========>>>>>>>>>>>>>====<=================<=======>?AA=0



+					
+

	
#.7<@@A@@@?>>====<=======>>>>??@@@@AAAAAA@@???>>================<======>>@AA>2	
											

		

%.49;=@AA@@@???????>??@A@?=9532-++,-048=?@@@??>>>>>>>>>>>>>>==>>>?@AA?;/ 
					
+




&058<=>?@@@@@@?=92+"!+5<?@AAAAAAAA@@@??@?@@AA@=8/#

+					
+


+
!')(&$# 
")-12256789;=>??>=:6,#
	
+				
+
+










  
	

							
+
+
+


+
+
+
+				
+
+









+												




+																
+






+														
+
+







+
+
+								
+	
+																			
+
+
+
+
+





	
+																			
+
+


+										
+																																																																																																																																																																																																																																						
+
+
+											
+																																																
+


+													
+		
+
+																																				 [...]
+
+		
+	
+
+


+					 [...]
+

+			

	

					
		
+

+
+
+
+	
+	
+
					
+
+
+
+
+
+
			
+


+	

					
+
		
+		
+	
+
+			
+			
+	
+
+								
+
+		
+
+	
+		
+


+
+
+
+	
+											 [...]
+	
+
+			
+

+	
+
+					
+
+	
+
	
+
+
"&*+)% 

					
		
+",157752/)!
		

+		".59;<<;973+ 
		
+		
+
	
-7:<====<<93+
		
+		

	

	
)5;========<93*
+
+		

+		



+
(4;===<<<=<==<90"
		

+	
+
			
+	
	
(6<>>=<<<<<<<==<5'

+

					
+			

%3<>>>===========8-
	

		
+

+	
+
'059:;;;;:;;;;;;81'

+
+
+ ,59:;<<<<<<==<;5$		



+		)M8"

-:?>>===========<=;*
	
+			?(98<>================><-			+A<;@?=>=>=>==========>>>>>9,
			 5?>==>==>>>==>===@EB>===>>>>>>>9*	
+	2>>==<===>=>>=====AFIHB==>=>>>===>?:(	
+	8?===========>=>=>AA>=>A@>==>>=>====>?6	
+	
+	
+:>======<===>=>=>AE@=====AB?==>>=======?<%
+			
+		0>>>>==<=======>=>BFB===;===HM@==>========>>0.2!
+
+			+>@>>>>=====>======CD?<<=:*<=<=EF>==>=>======>??L7
	
+
+	
+	3@>>>>>>==>========BD><<=>,9=<<=BC>====<========?+

+

+
+		
+
+4@>>>>=>======;:===AD?<===>!6===<>CC>==<;=>=====>>=/	
	
+
+		
+	
1@>>>====>=====<<>>ADA=====<4.;=====>CB>==========>>>@7
+
+
+
+		
+
+	)?>>=>>====>======>FGA7<==>=:;<:====56?DD?=============@6
+
+	

+		
+	
>>=>>>>>==========@JL6
:==>=;;9:===:)@JF=<===========>?.	
+		

+			
+6?>>=====>=========BMT3
;>=>@=;;=?>=7EOF<;============>>
+
	

			"?>=>>====>====?==><FSM83.;=>>><=>@?>7
TSC==>>===========?0		

+
+
+				
6>==>==>>>=<===:9==<FOA==9:;==>=====<<:69UQB=;/<>============
	
+
+			
+
+	>=========<;<=><>==><==>=;==========>>=IR@=;+@>>=========?3
					
+
+*?========<;;;<>0(>>>>>============>>=====>A==?33???>========<?!
		
+
+
4?=======><<<<=>>>>>>@??>>>>=>>==>=>========>>=>>============<>3			
+
+	9>====>>=>????>=====>>>>>>>>?>>>???>>>>?>>>>>>>=================

			
+
+	9?=========>===>>=>=>>>>>>>>@?@BCCDB?@>>>>>>>>=><<>==<<======>=?+12.%
		


	
+
+
+	
4?=??>>============>>>>>>>>>?@@@@@@A@??>>>>?>>>>==>>>===========:9???>;5/"	
+


		
+

+	5?>??>>====>=====>>>>>>>>>=BMEBBBBBBBBB>>??>>??>>>==>>>==========><<<=>>?<5$
+


				
+

	
#4>>>>??>>=>>======>>>>>>>>>@MZVMKJHHHJSS@>???>?>>>====>>>========<<<<<<<<<>?=-	
+

				
+


	,>@>====>=>>>>>>>>>==>>>>>>=@SMN\XTROPQWZOSI>>??>>>>>>>>>>>========<<<<<<<<<<<>?1

+



		
+



	"4?>========>>=>=>>>>>>==>>>?97UMLYYYWVVVYVKYI2>>>?==>?>=>>><=====>=<<<<<<<<<<<<<=>85551342,%  			
+


		
.<?>===========>>========AIG?>><OjVTWXYXXXWU\a@<>>>@>>>>====>=======<<<<<<<<<<<<<;;<>>>>>>>>>:85/'!	
+
+


+		
 -8?><===========>>>=>==>===?KXMBAMTbm^ZZ[VX[\gnXA==ESH?============<<<==<<<<<<<<<<<<;;<<<<<<<<>??=:62	




+

%-4:>?>=<=<<=<<<================<KRQVsmBFHEIOKMMVWFZeQKSL===>=====<;<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<==>>==	
+
+

(/48<>??>======<<<<<===========>>===>Ma\^cq@::<===<;;;=i{sYUF<========<;=>=<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

&18<>?>>=<<<======<<<==<=============<HXW\hiuO9<>===><;9EumgYNN=<<=>=<=======<<<<<<<<<<<<<====<<<<<<<<<<<<<<<<<
$.7<??>==<<=========<<<================<MUMP\[^_A<>>>>>=:B]cZWPQO=====>=========<<<<<<<<<<<<<=<===<<<<<<<<<<<<<<<
$-5<>>>==<========<<<==<<============<===<CQTY`_beYB<=>>=<J_^ad^SMD<<=<===>=======<<<<<<<<==========<<<==========<<)3:>?>==================<==================>@CCFFFVf^PC=<BUig\SNGB?==================<<<<<================<========= ,6<??>========= [...]

"3=??>=>==>>>==========>>=======>>==>>>>>>===================>=====>>>>>>>>>>>>>==========>>====>=>======>>>==<=>?@@=

1:@?>====>>>==============>=======>>>>==========>>==>=========<<===>>>>>>>>>>=>>=>>>>>==>>==>>========>>=====>@@>6+

*:@?>====>>>===================>>==>==>===============>==>>=====>==>>>>>>>>>>===>====>===>>>>>=>>==>>=>====?A?6*

	)9?@?==<=>>>>>>>============>>>===================>=>=====>=<<======>>=>>>>>>>=>====>>===>=>>>===>>=====>@A;.
	

+#4>@?>=======>====>===================<==============================>>>>>>===>===>===>======>=>======>@>3"
+	



+8>@?=<==>=================================================<<<<=======>==>>>====>>===>=====<=======?A=*
+
	
+		
*6?@>================<<<<====>=<=======================>>==<<<=================>>==============>@A7#

+

++:@@><==========<==<:=======<<=====<==============>=========>>==============================?A at 1
+	

	
+	2?A>==============<======<<<====================<<======================================>@A;(


+
+	
		*<A?>==<<=================<<===================<<===========================>========>@A>1



+				
+


 5>A@>>=======<========<=<<<<===========>>=================================<<=====>@A?5$

							
+

+%4=@A@??>>========<<<<<<<<===<==>>>???@@@@@@?>>>====<<=<=================<<===>?A?7&		
								
+
		
*3:>@AA@@@?>>===========>>>??@@@>=<85888;>?@??>>>======================>??@A?8&	
							
+


+	
 (06:<>@@A@@@@???????@@@@?:4* "/8=@@@??????>??>>>>==>>>>>>?@AA@<3$
+

+			
+






$*157:<>@@@?>=;:5,!



+4:>@@AAAAAA at AA@@@@@@@AA?<6-$

+						
+




$)&!


"$&),.12338<==>=<94+

		
+
						
+
+








+
											
+
+




+
+
+
+
+
+
+
+








	

								
+





+
+																	
+
+








+																			
+
+


					
+
+																										
+
+
+
+








		
+
+																	


+						
+																																																																																																																																																																																																			
+													
+
+																																									


+									
+		
+
+																																				 [...]
+



+
+

	 [...]
+
+
+			

	
+
		
+			

+			
+
+

+
+
+

+					
+
						
+
+
+
+
+	
+
+		
+
+	
+		
+	
+
+			
+		

		
+		
+
+				
+	
+
+					
+		
+			
+
+
+
+
+
+
+
+	
+	
+
+		
+				
	
+		
	
+				
	

+			
+			

+
+

					
			
+
+
+	
+

+
+	


+		
	

+
		


		

+	
 "# 

+	
+
+
+	
	
+	
(,,-,)#

+		
+
+
+
	
+		
!+146653-'

			

+
+

+	'/59::::95/'		
+				

+	
#,268888752-&

+	
+	
+		
		


+#(,/1220+"
		
+		
$.6;=====>><5 

+


+
.8


*7>?>>>>======>>0
		3Q11+.9=>>===>>=>>>=>>>?<.
		6?<?????>>>>==>=<===>>>>>??9*		(;?=<===>>>>>>>>=?JB=>>>>>>==>?<+			5?======>>>>>>>>>?K\T@ [...]
+
+	
"9>=>>>===>>>>>>=>?B@=AC?>>>>>>>>===>?3			#5?>=>>===>===>>>=?B@==;<>A@===>>=>=====?:!
	
+		
$:??>>>>===>===>>==@FB==;.<=>EF>===========?>-"!#
		0??>>>>>>>>>>===>==@EB<<=68=<>EB=>====<===>>>?>DG			
+
+	5?>>>>>>>>====<====@EB===>(5<<=?DA=====;=>>=>>>=?7
+
		
+	5?>>>>>>=>=>===;===?DB>===>#6>===@D@============>>?7
+

+		
2@=>>>>==>=======>=>BC>=====839=====AE@============>>?:

		
+					*?>>>>>>===>=======?AA=;===>;:<;====>@BC?==<==========>?8
	
+		
=>>>>>>============FG at 06====<:9;===;(/<>B?==============?/
+
+
+
+
+			
5?>>==>==>=======>=>INB*7=>??><<>>>>:2DE?<:============>>

	
+		
+ ?==>>>>=======>>=>=ANP at 41<>=>>==>?>>;&7SJ><:>>===========>6
+		
+		
+
3>=>>=>==>=<=>>;8=>=?LD<<:;<===>=====<;9ARJ>=;1<>===========?)
				
+===>======<;<<>
;>>==<==><<===>=======>=LK<>4*?>>==========;				
+
+	#?=>======<;;;<?*#>>?>>============>======>>==</4?>>>========<?(
+	

+	,?========<<<=>>>>>>??@?>>=>==>>>==>========>>=>>==============7
+
			
+
+
+	.@====>>=>????>=====>>?>>>>??>>>>>>>>>>>>>>>>>===============>=>##,-)#
			

	*@==>??>==>====>====>>>>>>>?@>>@AA@??@?>?>>>>>====>==<=====>==>>;<???>;5."				
+

	
/?=>@?>>=======>>===>>>>?>>>>AHLLMLIB????>>>>>>>>>>>>======>======<<<=>>?=6$		
+

	
+
/=>>>???>==>>===>>>>>?=>>>>>>KWVSPPPUVLA>???????>>>===>>==>======<<<<<<<<<>?=/			
+


	
+(<@>===>?>>>>>======>>?>?>?DB?JXVSRSRRSX[M>>CB>>>>>>===>=>>=========<<<<<<<<<<>?3
			



+
+&5>?========>>>=>>>>>>>>>>?>>DTSROQPPPPQPQQRJOL?>>>>>>=>=>>>=========;<=<<<<<<<<<=?700/,13420,/0-'			



+
#4>?>=========>>>>>>>>>>>>????@8?XMLNOQPQQNMNMTM4>>?>===>?>=>><<====>=<<=<<<<<<<<<<;<>>>===>>>>===;8		
+

		



(4=@=<==<==========>>=>====>LN@=?>Ac]OLLNOMNLKPR`G9?>>CF?=========<=<==<<<<<<<<<<<;;<;;;<;;<<<<<===>>>	
+


+	
+
"&)+.49>?>=<<<=<==<==>===========<>KSQC?F_sucTSVVRRPN\ls\B=?NVK@=========<==<<<<<<<<<<<<<;;<;;<<<<;;;;;;<<<==
+

!-59;==>?>>=<<<<<<<<<<<<=============<<=MY\acsi_TKNXXUPVgnreVMOM@===========<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<
(3;>?>>>==<<<<<<<=<<<<<<<===============@J_ipq{K9;<=?@>>@?Qv`qdH==========<;<=<;<<;<<<<<<<<<<=<<<<<<;;<<<;<<<<<<<

'19=>>==<<<<<<=<<<<<=<<<<<==============<=Tdinz�r?:<=====;::B{��p[P?<<<==<<=<<<<=<<;<<<<<<<<<<<<===<<<<<<<<<<<<<<<<&08=?>=<=<=========<<<=<<<<==========<=<<=<@VY]gvseQ;<=====<9<Ss|qb[WB<===>=====<===<<<<<<<<<<=<<=<<<<<<<<<<<<<<=<<<<"-6<>?>======<==== [...]
+
7@?================================>>>>>=>>========>==========>=====>>?>>>?>>>>>>=====>>===============>>===>>>======>
#8?@>========================>=====>>==>>>=============>==============>>>>>>>>>==>>>===========>>>=>>>====>>=>=====>?A!6?@>======>>=====>==>=======>==>======>================>=========>>=>>>=>>>>>>>>>==========>>>>===>>>=>>====<<=>?@?<

2<@?======>>>>====>====>======>>>=================>>>=======>==<=====>>>>>>>==>>====>>>>>>====>=====>>=======?A at 9+ 	);A?>== [...]
+

+-:?@?====================>=<<=============================>>==<<========================>=========<=>@@8&	

+
+"19>@?==================<==<===========================<<================================<========>A>.

	


+,9@@>==<============<:==============================<<=====================<==<==============>@@8#
+
	


+
/<@?========================<<===========================================================>?A>/		


+
+
	#5?@?==<==========>=====<==========================================>=====>=============?A at 7$


+
+		


+*;AA?>=====<=<====<=========<===<<==>>>>>???>>>====<<==<<<===========>>===========>?A at 8*
+	
+						
+


,9?AA@?>>==========<<==<<<==<==>>???@@@?@@@@???>=======<<====================>>?AA;,	

+									
+

+
$/6<?@AA@@??>>>>>========>>???@?=82--./15:>@@???>>>>>===================>>@@A@:.

+
+								
+

	
#+048;>?AAAAA@?????@@@@@@<5-$
(19>@A@@@@?????>>>>>>>=>>=>??AAA@<4'


										
+





")0568:<?@?>=:63-$
+
+

!)/5:<=>?@AAAA at AA@@@@@AAA=70(!

									
+


 $%"
 $(,,,/579:;:83.'

	
+


+									
+











+
+
+

+							
+
+
+





+
+
+
+
+
+
+
+








+											
+







+
+
+																	
+	
+
+




+





+																		
+






+
+	
+
+	
+	
+																									
+
+
+
+
+








	
+
+																							
+			
+
+
+
+
+
+
+
+																												
+																																				
+
+	
+
+																																																																				
+	
+																																																					


+							
+		
+
+
+																																									 [...]
+				

+
	


+
+
	
	
	
+		
+
+	
+							
+
+
+										
+
+	
+

+	
+
+		
+
	

		
+


+		
+
+
+	
+
+
+						
+	
+
+											

+
+		
+		

	
+					
+		
+	
+
+	
+					
+		
+		
+
+
+							
+				
+	

		

+				
+
	

		
+




	



	
	


+		

+



			


+		
+
+
+
+

		
+	




						



+


			

+
+		

+	

		
+		
+
	

		



+		
+
	
+49=>>><5%
	
+
 
+
+
'19>???>>>>>??;-

MG44;>?@@?>>>>>>>>>>>>@?7(	
+!<?>>>=>>>>>>>>>=>>=>>>>>?@<,+<><<===>>>>>>>>=A?=>>>>>>==>?<(
+

6?>===>>>>>>>>>>>KXR?>>>>>>>>==>?6
				
+%4>>>>>==>>>>>>>==?BFBFC>>=>>>>>====?=(		/<?>>>>==>>==>>>>>>AC?=<<@B>==>>=>>====>?3		
+
(<?>>>>>>>>>>>==>==>DD?<<7<=ADA===>======>>?</!	
+	2@>>>>>>>>>>>===>==>CD>;<9);::AF?=>====<=>>>>>??9H-
+	
+
+	6?>>>>>>>>>>>><;===>CE?=;=/
:88=BD>======>>>>>>>>>@

+
	

6?>>>=>==>=>>======>BD?===>$8=<=>CC>===<<>>======>>9


+
	

2?=>>>>>=>==>====>>=@D@====>/#9>===?DC>==:<========>>?<
+	
+
+
	(?==>>>>==>>>===>====AA=====<<<<=>===BD@============>=>?;
		
+
+	
+=>=>>>>>=======>>>=>CA>;=====:9<====9<@================>?4
+	
+		
+	
3?=>>=>>>>==>==<>?>=EML;8=AB@?=;>??@<&,GB=<<<=============?(
		
+
>=>>>>>>>>>=>=>==>>=JPK88==?@>>>>@AA>/*TPA=8;?>==========>><
			
+
+	/?=>>=>>>>=<<>=<:>>>=FI>=<<===========<9LRG<;;4=============?2
		
+
	:>==>===>=;;;<>#;>>==<=====>==>>=======@QE<</
*@>>=========<=			
+
+	>>>======;;;;<?+"=>?>==========>>==>====<====9'3?>>=======<==?*				

+	 ?>====>><;<===>>>>>????>=====>>==>>>=======>==?>============>>9 #%"
	
+

+	?===>??>=>??>===<==>???>=>>>>>>==>>>>>>>>>>>>=<=============>>>:=>>>=93+ 			
+

+	&@>>=>?>>>>>===>====>>>==>>??>>@DDB??@???>>>>>>===>==============>====>>><5$			
+

+(;?=>?>>?>===>>>>>>=>>A>>?????@JUVVUNA@???>?>>>>>>>>>>>====>=====<<<<<<<<==?>/	
		
+

	
+"8?>===>???==>>==>>>>>??EEA???>CSUNKLLTSE????>???>>>>>==>=========>=<<==<<<<<<>?3



+
&()	
+


	
+&6>?=======>=>>>=====>>>>>@GPL@>AVRJJIJHKQTE>>DLE>>>>>>=====<========<<==<<<<<<<<<>5))'%/115438;;;			
+

	
&6>?>=====<===>>===>>>=>>>>>>>DNNHSSLNPOKMLKQTBBQM@>>>>=====>>=<>=<====<<=<<<<<<;;;;<====<=>>>>>>>>>	
+


		
+
+7>@=<===========>=>>>>=>>>>?>?>?=DTRLNQSPOQOLLPTI8=>>>=>==>?>=>=<<<<<===<;<<<<<<<;;;;;;<<;;;;<<<<<<==



	
!'+.01237;>?>=<<<<<<<<<=<============?HE?>?=Fa[TPPPQQPNNPRZH5>=?BD?=========<<<<<<<<<<<<<<<<<;<;;;;;;;;;;;;;;<;<

#08<=>>>>>>>=<<<<<<<<<<<=<<=======<<==<@JKMLGEcmj^QOOLMMMNX^\[ABILOMB<=<<=<<<<;<=<<<<<<<<<<<<<<<<<<<<<<<<;;;;;<<<<
)4<??>===<<<<<<<<<<<<<<<<<<<=======<<<<==<<DKO\s{xgYPHT\MNVgpgp_SMC>>>=<======<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<;;<;<<
'29>?>=<<<<<<<<<<<<<<<<<<<<<<==============>CLKHLgsP@?>>EHCBGH_|v_HA?=============<<;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<!(08=>>==<<<<<=<<===<==<<<<<<<<=<<<===<<======@OTW\VWK><<>>===;;=@Y_VYYOA========<<<<=<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<07<?>=<<<<<<<<<=<< [...]
+(8@?>=<=>==>>>==================>======<================>=>>=======>==<======>==>=>>>>=>==========>=========?@@9+



2?A?========>==========================================>====<=========<=>>>>=============>===>========<=>@A</
	
*:@@?========================<<=======>=======>===========<=>========<========>=======================?A>2!		



0<@@?===================<===<<==========>==>=============================================<<=======>@@7$	
	!2:@@?=============<<=<<<==========================<=======>=>===>>=========<====<<==<==========?A=,	
			

	!/;@@>===============<<========================<==<========================<=<<<============?@@7!



		


+!1=@?>=====<================================>>====<<<===============>=====>=============>@@;,	
+


+
+	

	#3>A@>>======<<====<====<<<====<====>>>>??>>>>>>>==========<============>=======<==>>@A;+



+					
+

+$3=@A@@?>>========<<<<<<<<<=====>>??@@@@@@@@@??>>>==========<======<==<========>?@A>2



								



+39>@AAAA@??>>>==>>>>===>>>>??@@?<96679;<>@@@@???>>>>>============<=====>??@A@<1!
+
									


+
+
&-259<>@@AAAAA@@???@@@@?=:5/)$"(/3:>?@AA@@@@??????>>>>>>>>>?@@A@>:2%

+
+							
+




+

 %*/677:=>???><93,%


$)/259<>?@@@AAAAAA at AA@@=3*"
	

								



!$%$

 #$(,134540+& 	
+
+

								
+
+












+	
+
+



+													
+
+
+






+	
+	
+
+
+
+
+
+






+




											
+
+






+
+																		
+	
+
+
+





	



+
+
+
+																			

+
+
+
+
+
+
+
+	
+
+																									
+	
+
+
+
+
+
+







+		
+
+																													
+
+
+
+
+
+
+
+																															
+			
+
+																																	
+
+
+
+
+
+
+		
+																																																															
+
+				
+
+
+	

+
+																																																	 [...]
+






+
+	
	


+


	
+



+	



+					 [...]
+	
+
+
+
+
+							
	

+
+	

+		
+
+			
+
+
+
+	
+


+
+	
+	
+
+	
+
+				
+
+	
+		
+			
+

		
+		
+			
+
+				
+		
+			
+	
+		
+
+		
+	
+
+
+		
+	
		
+
+			

			
+


		








+

	
+
+
	



+
+
+			

		

	

+		

						
+				

+
+
						
+

		



					
+

+		
	
					

	
		

+		


+
+!',0343/&
+		
*39=>@@@@????@>:0!
+		)Q:2:???>>=>>>>>>>>>>>??:)
+
*E>>>===>>>==>>>>>>>=>=>>?;(-=<<===>>>>>>===<<==>>>>===>?7

+		.:>>===>>>>>>>>>=CMF=>>>>>>>===>>*

1;?@>>>>>>>>>>>===>BLRSD==>>>>>>===>>1
+	4??=>>>>==>>===>>>>?CB>=?CB====>>>>===>?<0"		+>?>>>>>>>>>>>>>>=>=AEA=====BC>====>>==>=>>??:*	


+
4@>>>>=>>>>>>>==>>==BGA<==<===DD==>====<=>=>>>>@::C	

	6?>>==>>>>>>>>><<>>=AEA=<>:.==<>DA=======>>=>>>>=>B8			

+6?>>>==>>==>>>====>=AEB===>6"==<<?DA>==;<==>=======><%
	
+
		
	2?=>==>>=>==>======>?DC>===>2
<====AEB>=<;==========>>?&
		
+
+
+
+(@==>>>=========>>==>CC?=====8/=====>CD@================= 		
+
		<>>===>>>======>??>=AFC==>=>><8=>====AC>================>9		

+	
+	
+/?>>>=>>>>======>??=?IPH<=BDC@=5=AA?=;@F@=><<=============?0
		
+
+		=>=>>>>>>>==>===>?><DN\C:>BCB>>>?CEE>:DYH==;=>=============?!		
+
+	)@=====>>><<<>==;>?>=APH<<=>>>>>=?@A@><?^PA<<=7=====>>======>5
			

+	
6?=======<;;;<>(9?>>==<=====>=>>?@====<IO>;<1
+@>>=========<=		

+	;>=====>=;;;;=?/$=>>?>=====>>==>>=======<<=:<6 2?>>=========<>/

			
+

+=>====>=;;<<<==>>>>????>===========>======>=>=?>>===========>==9:<<<;7/&				

+
?>=>>>?==>??>===<=>>???>>>>>>>>=>>>>>>>>>=>>><=======<=========>=====>>><1

	
+

+

6?>>>>>>??>>>>>>====>=>>=>>???>>??>>???@?>>>>>>====>=========<==<<<<<<<<<=?=,
+
		
+

		
0>?=>=>?>?>===>>>>>==>>D?>?????>ALSSSG?A@????>>>>>>>>>>>=========><<<<<<<<<<<>?2			
+
".46		
+

		$4=?>=====>?>==>>==>>>>>>@SK@??@??ITPOMOVJ?????>BB>>?>>>>>==>===>====<<<<<==<;;<;<>2 " 
#'-676;=>>	
+

	
+%6>?>====<====>>>=====>>>>>>HQMG???LUOIGJIMRN???AGNF>>=>>=>==>=========<<;<<;;<;::;:;=;;;;<===>===<=


	

)7>?=<===<<==<==>>===>>===>>>>?KKJJHSWMLJJGKKKSO at AOOJ@>>=========<<=<<<<<<<;;<<<<;;:;;:;;<;;;;;;<;;;;<

+"*/13444458;>?=<<<<<<<<=<<<============>>>>GB<EW_VQRSQPSQLRSUJ;DG========>===<;==<<<<<;<<<;<<<<::;;:;;;;;:;;;<;;<<

+
"09=??>>>>>>>==<<<<<<<<<<<<<<<<<<<======<=?AGO@<EfhZTVPPQQTSVZ^J2?LDA?======<<<=<<<<<;<<<<<<<<<<<<:;<;<<<;;;;;<<;;<;
(5<??>=<<<<<<<<=<=<<<<<<<<===<<=====<<<<<==?GRTA<KirhXRPLMPUYbooX9AUNJB=<<<<<<<=<;;<<<;;<<;<;;<<<<<<<;;;;<<<<<<<;;<<<!)19>>==<;;;;;<<<<<<<<<<<<<;<<<<<<==========>>==AA=;H[gaXWSTWTVYdrmY>?C?>=>=<======<<<<<<<<<<<<<<<<<<<<<<<;<<<<;;;<<<<<<49=>>==<<<<<<<<<<<<<<<<<<;<;<<<<<==========>>>>HTWQA=CCBFGFLOMLOJJOE>EGA>>>?>======<<;<<<<;<<<<<<;<<<<<<<<;<<<<<;;<<<<<<>>>==<<<<<=<<< [...]
+
(9@@?============<<<<===<<<<<<<============>>=========================================>===<======<==?A;.


+

+-;A@?===<<=========<<<<;:=======<========>=================================<<<<=<==<<<<======<==>@?2

			
+
+
1<@@>=<===============;============<==============<<<<==================<=<<=<<<============>@A;'

		
 0<A@?==<<<=======================<=======>>>>=======<<<==========================<=<====>@A<.
+


+
+		

 0;@@?>===<<====<<============<<=<===>>>>>>>>>>>>=====<<<<==============>====<<======>@A>0


+
	
+

+

,9?AA@?>>>======<<<<<==<<<<=====>????@@@@@@@????>>>>=====<=<<=============<====>?@A?4!	
+				
+		

+#.6<?@AAAA@?>>>>>>========>>>??@@??>>=<=>?@A@@@@??>??>>>========<<<=====>??@AA?;0 
+				
	
'-279=@AAAAA@@@@?????@@A?;73.)%#!

 %+,.368<>?@@@A@@@@@??>>>>>>??@@A@>:4-
	
							
+


		
+
 ',037;;<>??@?>=;83-#






$)-169;=>?@@AAAAA@><;4%
		

										




!$%#!






"'))**%!
	

+


+							
+











+
+
+
+
+		
+
+




+														
+



+



+			
+	
+	
+
+
+

+











+
+																
+






+
+																		
+	
+
+
+
+
+









+
+
+
+
+
+
+																				



+
+		
+
+		
+				
+																			
+
+
+
+
+
+
+
+
+
+
+




+
+
+		
+	
+																														
+
+
+
+
+
+
+
+	
+																														
+
+
+
+
+																																													
+
+
+
+
+
+
+
+																																																									 [...]
+





+
+
		



	


			
+	
+



+		 [...]
+	
+
+
+
+							
+			
+
+			
+			
+

+				
+
+		
+
+
+												
+			
+

+								
+	
+
+							
+																					
+
+		
+			
+	
+	

+
		
+		
	

+





+	
	


+

+			
		
+	



+
+	

					
+

	
+
+	
+							

				

+					




+	
		
		

+	



+	
+		
+
+	
+
+


		
	
+


+

#'+,-,*%



	

+,6<>?@@??@???<5)

		=:*/9>?>>=>>>>>>===>>?<0

CB??>==>>>==>>>>>>====>?=0
+	!9>======>>>>======>==>====?9%
+%2:>?>==>>>>>===>=>B?==>>>>>>==>;,	
 3<??>>>>>=>>==>=>==AFQMA=>>==>>>==>=9+
	
5??>>>=>>=>>=>====>>CE at CCEA===>=>>>==>??>:.
++>?>>>>>=>>>>>>>====>CD>===?D@======><==>>>>?=0


	
+		3@>>>>=>>>>>>>======AHF?===>=AFA=========>>=>>>?>.?
	
	5?>>==>>==>>>>>=<===BJH@=>:4>=>CHB==========>==>>>@H!
+		4?>>>===>==>=>>=>>>=AIIA==>7)>===CFB==<:=====>======>,

+
+					0?>>>=>>===>======>>?FHB===>3$>===>DGB==<============>>)
	
+		%?>=>>>>==>===>>>>>>>EGF>===?,
<>===BEE?================>"	
+		:>===>>>=======>??>>@IGA===?@1$9?===@FE>=====<==========>;		
+			*?>>>>>===>=====>??>=EKL>=?BC@;+:A?==>FH@==<==============?4			
+		;>=>>>>=========>??=?JVP<?FHC>=;>BFD>=IOE<=>===============?!						
+		$?>===>>>=<<<>===>??>>OUB<>CEC@>>AFHE?<KZK>=>=:=============>3
		
+		
+0?=>=====<;;<=>,9??>=??===>@BB@?DEA?=<@TJ==>4.?>>=========<= 


		
+
+	
6?======<;;;;<?1%<>>>>=======>?@@?>==<=<==<;=4.?>>===========9/-1230)!		
+
+		;>=====<;;<<<=>>?>>????>>===>===>>=>======<===<>==>============>>>>>>>=:3%		
+
+
+	
+'?>>>>>>==>??>===<=>>????>>>>>>=>>>=>>>>>=>?>=====<==<=========<<<<<;<<<>?>6 
			
+	
+		
+

3>>>>>==>???>>>>>><==>>>>>>>????====>???@?>>>>>=====>=============<<<<<<<<<=?<&

*35
+
+	
+
)4<?>====>>>>==>>>>>>==>>@>>?????>>FMOLA>A@?@?>>>>>>>>>>>>>==========<<<<<<<<<<<>=(!+138=>=
+
+		
,:?>=====<==>>==>==>>?>>>>?MF>???@>EPQQPTTD?????>@A>>>>>>>>============<;;<<<<::;;:<;555369;=====<;		


-;?============>>====>==>=>>=LQFB???JWPJGILPTJ???@AJI>================<<<<:;;;;;;9:;:;<=<<=<<<<<;;<;;
+
$)--..---.05;?>=<<<<<<<<<<<===========>>>=BSPOJGSXMIIJLMMNWO??KKMC====<=<<<<==<<<<<<;<<;;;;<<;;:;;;:;;;;:;;;;;;;;<
".8<>?>>>>>=>>>=<<<<<;;<<<=<<<===<===<<======?TKEO\eUNPOONNONRYXOEJN><===========<<;<<<<<;;;<;<<<<;:;;;;;;;;;:;;;<;<<
'5>?>===<<<<<<<<<<<<<<<<<<;<<<;<<<<<==<=<=====IU>;@TZSSVPOOPTWVW^L0 at TE>====<===<<<<<=<<;;<;<<<;;;<<<;;;;;;;;;<<<;<<;<<(0:??==<<<<<<<<<<<<<=<<<<<<<<<=<<<====<<======<>KH==<FZcZUQPRTV\dbXF9>MG?<==========<;<<<;;<<<<;<<=<<<<<<<<<<<<<<<<<<<==<??><<<<;;<<<<<<<<<<<<<<<<<<<<<<<===========>===>>=>==LZYYWVWVW[bZF<<=>>===========<<<<<<<<<<<<<<<<<<<<<<<;;;;;<;<<<<<<<?>=<=<<<<<<<<< [...]
(:@?==<=====>===========>=>>>====>================>=====================<==>>===>==>>>=>>>==>=================<=>?@=5
	"4>@>=======>>>>>=======>>>==>===>==========>>========>=>>>==================>>==>===>===>========>>>=========>@=4'

+
(9@?============>=======>>>>>>===<====>==========>===>=====<<==>===============>>===========>======<======>@?5&



3>@>======<==================<<<===>===========>>=====<<========>=====<================>============<=>??8+



	



)8@@>=========<=====<===<<<==============================<===>=================<======<=====<==<====?@8+

			


 .;@@>=========<<===<<==<;<=======<=================>=<=<=====================<=<<<==============>@=/ 

	

#1<@?>=================<=======<====<==============<==<<===========<========<<============<<=>@?6'

		
+

$0<@@?>=========================<<==<<=====>>==>===<======<====================<=========>@@9,






+


#.9?@?>========================<<====>>>>>>>>>>==>>====<===<==<=================<====>?@:-






+			


*5<@@@@?>==============<<<<====>>>>????@@@???????>>>>>=====<==<=<=============>??@?:/ 




+					
+


"*05:=?@@@@???>>>==>>===>=>>>>???>=;:9899<==>>?@@@@@???>>>>=============>?@@@>91(




+								
+



#(,06<>?@@A at A@@??@@@@@@@?<4-)%" 


!"#$%).259;<>?@@@@@@??????@@@@@<60)#



+						
+


"%(+.3888:;<<;:852.)"


!&)-1569;<<=<;9631- 




									
+
+
  

 !! 












+
+										
















	






+																		
+





+
+
+
+
+	
+	
+
+
+
+
+
+







	





+
+
+
+															
+
+






+
+																	
+
+	
+
+
+
+










+


	
+
+
+
+
+
+																									
+
+
+




+
+


+
+
+
+					
+																				
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+			
+																							
+						
+									
+	
+
+	
+
+
+
+																															
+
+
+	
+																	
						
+	
+										
+		
+
		

					
+
+								 [...]
+	

				

+		
+		
+
+
+	
+
+
+
	

+		
+
+

+		
+

	
+
+			
+


			
+
+
+
+
+
+
	
+	
+
+		
+		
+		
+		
+		
+	
+
		

		
	



		
+	

+		
+


						


+	
+		
+	

	
			
+


+	

					
+
+		
+
+
	

+					


			
+
+
+
+
+			
+			
+		

+
			
+
+	

+	
+	
+		
	

		
			

	
+

+		

 !

+
+
	
!,5;=>>>>><91#	
+
	6"0:??>>>>>=====>>:-
+	5F;7>>==>>==>>=>======>;,$6>==>===>>>=>>>>>======<<>4


*6=?>>>===>>======<<<=>====>==>;/ 	"5>??>>>===>>===>===AGLHA>>>>=>>>=>?><8-
 [...]
+
6??>>>>>>>>>>==>===>IJFKJKD=>>>>=>====>>?>6#*>?>>>>>>>>>>>====>=?JMA<9<ELA=>>>===<=====>??6(	1?>>>=>>=>>>>>>==<==@OOE>9$:>KOE=>==>>======>>>?@,&+
+	3?>>>==>==>>>>>>=<==@KNE<>3
9>?MQF===<>========>>>=GC
		1?===>==>==>>>>>=>>>@LME<=?.:><>LND<=:=============?6					*?==>==>=>==========>KOH===?%7>=<BMLB================>+
			
>>=>>>===>=====>>>>=CNM@==>=
-?===KJG=====<===========>'
+
+	6?==>>>>=======>?>>==FKF===?9$?===EJF==<<===============

+
	%?=>>>==========>??>=>GHA<@C@;/%2??>=AKH>=<;==<==<==<=====>5
						

+	7?=>>=>========<>??><DEO@>GKE>:;>CHE=?JH@<=>==<===========<>#		
+
+>==>==>>=<<<>>==>??>=HWQ==EIED>>DEHE=>RKE<>?>=>===========<=8	



+

+%@>======<;;;<=6%;???>@G?<=?DDECCFEE?=<MYC<>?9
0?>>>=========>6'&,..*"

+
+	1?======<;;;;;>8.<>>>>=<==>>>?@BB@?=====@=<=>4*@>>===========>>=>>>>>;6+
					
	
+<>==>=<;;;;<<=>>?>=???>>>==>>=>>=>=>>>===<;>><8<>=>===========<<<;<<;<<>?=3

							
+
+		):==>>>>=<=>>>>>==<=>???@@@>>>>>=>>==>=>>>=<>?==>================<=<;;;;;<<=?;#
	
!,4:
+
+%18?>==>==?>>>>>?>>>>==>>??????>??>===>>>>???>>>>=======<=<<==========<<<;<<<<<<><%%147:<==	
*9??>=======>>>==>>>>>>>>>>>>>?????=>CHGD?>@????>>>>>=>>>>>============<<<;;;<<;;;;<;323378;====<;;	
+




+:?>==============>==>>>>>>>>@?>?>??>DNSSSWRC???@?>>>>>>>========<<<<<<==<;:;;::::::::<==<<<<<;;<<;;;
!%(,.010/.-,-/3:>>=;<<<<<=<<===========>=====DE>=>>?KRLJHGHNSI?>>>>DD>========<<=<<<<<<;;;;;;;;;;:;;;;;;;::::;;;;;;<<!+4:=>>?>>>>=======;;<<<;;;<<;<<================?IIE@>LRMNNNNKJKUI>>?GL@<<===<<<<<<<<;;<<<<;<;;;;;;;;;;;;;;;;;;;;:;;<<==3;???>=<<<;<<<<<<<;<<<<<<<;<;;<;<<<<<===<<<=====>HHFCBUSSTTTSSRQPWHFKTG<<=<<<<<<=====<;;<<<<<<<<<<<;;;;;;;<;;<<;;;;;<<==?@?><<<<<<<<;;<;;;<<<;;<<;;<; [...]
	
+
		0>B@>==<========<<=<<<<=<<<<====<<========<=======<==<==<<==============<<<<=======<===>====<=<===?A>2	
+				

#7 at A@>=<<=============<;<=====<<==========>===<======<===<===============<===================<=?AA9%
+				
+	(7?A@>==<<===========<====<=<<===<<<==============<<<<<=<<<<======>====================<<==?@A:+
+	

		
	&5?AA@>===<<<<===========<=<==<<<=====>>===>=>>==>========<=<====<====>=========<<<<<=>?AA;-




+
+				

	"1<AAA@?>======<<<<==<=<<<<========>>>>?????????????>>>>======<<<<======<=<<=<===>?@A@;.





+	
+	
+
(3:>@ABAA@?>>============>=>>>>>?@@@@?===>>????@@A@@@@??>>>>>============>?@AAA?:2'




+		
+
+				

+	%,37<?ABBAA@@?????@?????@@A@?:2+&!


  ! #(069;=?@@AAA@@?@@??@@@AABA<5/&

		



+
+						



+
+

&,16:<>@ABAAAA@@@?=:62*!



#(.37:<===>><::851'

+
+


+
+											
+


#).0.)))'%#











+														
+































+																					
+





+
+
+
+
+
+
+
+
+
+
+
+
+
+

+







+	




+
+
+
+	
+																											
+





+
+							
+					
+		
+
+	
+
+
+
+
+


+













+
+
+
+
+
+
+
+						
+																											
+

+
+



+
+

+

+
+
+	
+																		
+		
+
+
+
+
+
+
+
+

+
+





+
+
+
+				
+				
+
+
+		
+
+
+										

+

+
+
+		
+													
+															 [...]
+					
+			

+			
+

+	
+	
+
+
+
	
+
+	
		



	
+
+	


					


+						
+
+
+	
+
+				
+
+	
+
+
+	
+			
+	
	
+					
+	
+




				


+	
+	

+
+


+				
+	
	
+	

			


+


	
+



		

+

+	
		

+				
+
	
+				

+			
+
+
+
+
+	
+
+		
	
+
+

		
	
		
+
+		
		
			
											
+
	
+

+

+	


+	
+
+





		




+		

+		
+


&-13431+#	
+
+


			
/

!/9=>???>>>>=;3%			
+,H;)19=>?>==>>======>=6#
+
(7?>>?>>==>>>>>=>>======><2"
+!0:>?>=>==>>===========>===>==>?<80#
'8??>>>>>==>=>======>ACB?=>>==>>===>??<4%		
8?>>>>>>>>>>>==>====CBCHIE@=>====>;<===>??;,		+>?>>>>>=>>>>>======>HK@:,9BKC===>==<<==<==>>?9, [...]
+6>==HOA<==<<=<====<=<===?-
+							4?==>========<=>>?>>=?MG<>A>"
+3??<CPA<=;<===<<<====<====
							!>>>>===========????><CLB<CGA+&"":FE=ANC======<==========<>6								
	
3>=>===========<>??>=?EGA>FCD?7<>DCE?@JG<=>?><<<==========<>,

+							
+;>===>>==<<<=>==>>?>=CLN?=DGDD@?DEEE=AJI?=>?>>>=<============, $'& 
			!?======<<;;;;==;>???>>HC==>ACCDCCED?=>OQ?=>?;!1?>=>==========>;<=>>=:5- 
												4?=====<;;;;;;=><>?>>?><=>====?AA?>====@A==>?5)@>>>==========<<<;<<<=>>=8+													

+
1====>>=;;;;<<<>>>==>?>?>>>>>>=>>>>>>>>===<>?><4;>==============<<;;;;::<=>?7							
 +3:
*1:?<=>====<>>???>>===>>??@@@>=>>=<=====>>>>=;>?==>==========>======<<<;;;;<<<<?8 )07:==<!2<??>===>==>>>>>??>>>>==>>??????>>?>=<<=>>>>??>>>>====<<<===<<======<<<<;;;;;;:;;:<9101257;>==<<;;











+
+
+

"4>?>========>>>===>>>=>>==>>>>>>?>??=>BFEB>>????>=============<<<<<<<<<<;;::::;;:::::;<<<===<<<<<<<< %(())**-.-+)'&')-6=>=;<=<====>>>=====>=>>=>>>>===>?>>>>IRVWUTPD??>>>=========<===<<<<<;;<<;;;;;:::::::;;;;;:;;;;<<<<===7;<====>>>>===<====<<<<<<<<<<<<===<=================>=>MZUSUURSUI========<==<<<<<<<<<;;<<<<<<;;;;;;:;;;;;;;::::;;;<=====??>===<<<;;;;;<<;;;;<;;;;;;<<;<<=<<<<<<<<<<===<<=<=<=<FZWSTVVUTUXF===>><<<===========<;;<<<<<<;<<;;;;;;;;;;;;;;:;<<==>>>?==<<<;;<<;<<<<<;<<<<;<<;;;<;:; [...]
+&;@?>===============>>>=============================<========================>==========>>>=======<===?@>6&	
+		
	0?A>====================<<<============<============<====<<=======================>>===>========<=>@?5#
+
			
+


#8@@?===========<<==<=<<<===<====<<==============<<<<=<;<<<<<===>======<====================<==>?@:)		
					
+	*:@@?====<===========<=====<=<====<<=============<=<<<<<=<<<<===>==>>========>=======<==<==>?@;,

				
+
+*8?A?>=<==================<==<<=<<=====>>==>>>>>>>>>>>>====<===<===========<<==<<==<==>>@@;.





+
					

	&4=AA@??>=>========<==<<<<<=<=<<<==>>>>???@@@@@@@?????>>>>>=====<<<<=<=<<<==<===>??@@?:.


+


+

+
+				


+4;>@@A@@?>>>===========>====>>>?@@?=:7423456799;>?@@@@@???>>>>=======>>>>?@A@>;5-#




+												
+
+
+&/5:>AAA@@@?>??????????@@@@?;4-&

#*/369<??@A at AA@A at AAAAA@@>9-#

	


+
+
+										





(059;>@AAAA@@??>=;851*!



$),/3322331-,*(#




+
+
+
+											
+


 *.000-(%#














+
+	





+
+
+																	



















	






+
+
+
+
+
+																		
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+












+
+
+
+
+
+




+
+

+
+																										
+




+
+			
+
+							
+					
+
+
+
+
+
+

+
+





+
+





+
	
+
+
+
+
	
+



+
+
+
+
+													
+

+	
+															
+							 [...]
+
+
+	
+
+
+
+	

+
+	

			
+	

+	
+
		


	




+
+
+


+					
+
+			
+		
+				
+
+
+
+		
+						
+				
			
+




	
+

				
+	



		
+
+				
+
+

+

+
+




		
+	

		

+
	


	

	
+
		
+

	
			
+
+
+		
+
					
+
	


+		

+
+
+
+
+
+
+		
+
+

	


	
		


+
+
+
+				
+
	

+
+	
+
	
										
+
		
	


	



	
+

+


+		
	

+

	
+
+
+

	!.
",38;<<;:6/$
	
+	
+
+			
+:H1-39=?@???>>>>>?>;1!

!,;===>?>>>>>>>>>>>>>>>>??;5/$
%3<??>>>=====>======>>>>>=>>==>??=6*

++;??>>>>>================>>>==>=====??>9,
	
":?>>>=>>>>>>>==>>====<>??===>>====;<====>?=0
+,>>>>====>=>>>=======>=>3#3><===============>?;0!
+		2?>>==>==>>>=====<;==@>=87<=><;;<==<======>=>?<
	2?>>===>>==>>>=>====@E@=>*	
+->=EE=;;===========>>>:G5
+						
.?========>=========>FD===
		'>=@LD<<==========<<===A"					%?>======>=======>>>=>B>>>:	!>>=FH==<=====<<<<<<<<=>5				;>===>=========>???>=>?=BC6	
=C?AH>=<<======<<<<<<==?.
+					
1?>=========<<=>>??>==?>=GH6
		
BIA>E====>=========<<<===#								=>==========<=>?>?>==>G?@DB=
#.EDB>F>==>?>============<=;									,?=============<>??>>=EL at BD@B=;9<C at AC?LB<>??>=============<=6
 

				
+
+9>====>==<;<=>===>??>AKJA>CEFC@?CEDD at CKH=>??>>>=======>=====>;69;=<94+!
																	$?=======<;;;;<=<=???>>GE>==?BABABDA><BIJ>>>?<%4>>>>=============<<==>?=9/
											
+
	
 :>=====<;;;;;;=>==>?>>>=======?AA?>====A@=>>?5
*@?>>==========<<<;;;<<<;>@>/				
+49
+(/=>===>>=;;<<<<=>>>>=????>>=>>>>>??>>=======>?>;1;>>>=====>>=====<<;<<;:;;<<=>2
$.6:===	
+(7=>>===>>==>=>????>>>==>??@@?@?>>><<<<<==>===<>??==>================<<<;:9:;;;;;;=71012468;<==<<<



+
+
+


+				
+
+:?>>=========>>>>??>>>>==>>???@@??>>><9;9>>>>>==>>>=<==;<====<<<<<<<<<<;;:9::;;:::;;<=<<===<<<<<<<<..,*(&%$&))% 


 &/:?><:<<<<<=========>>>>>>=======>>=>>=>@BB?=>>>>>======<=<<<<=<<<<<;;<<;<;;:;;;;;::::;;;::;;;;<<<<<<<=======<===<;;:;;<==<;::<<<<;;<====<=>=====>============CMV\]UM@>>>===<<<=<<<<<<==<<<;;;<<<<<<;;:::;;;;;;;::;;;<<<<<===<==<<<<<<;;;;;<<<<;;;<;;;;<;<;;<<<<<<<=<====<=======>>==DSRNOPRYVC=======<========<<<=<;;<<<<<;;;;;;:;;;;;;;;;;;<<====>>><<;;;;;;;::::;;;;;;;::;;;;;;;;<< [...]
+
#7@?=<<<=====>>========>>====>====>>=========>===>>===>>>>=================>===>>>>=====>>>=>>==========<<====<==?@@>+=@>=====<==>>=====>==========>>>====>=======>>>==>>======================>=>====>==============>============?@?:0%

+
2?@======<==>=========>=>>====>>>===========<============================================================?@@8*
+


$:@?=<==<==============================================<<=======>>>================================<==>@?9+
	
		
	0>A>====================<=<==<======<==<============<<==<<====>==>================================>??8&

+			
+

!7@@>==<=========<<<<<<<==<=======<<<<<<<=========<==<<<<<==<<<==>>======<<=================<<=>??:+
+
					
+
(:@@>==<============<=====<=<==<==<==<==============<<<<<<===<=====>>======================>?@;,

						
+*:@@?>>=<<=<<=<============<<<<<<<<<==>===>????>??>>>>>=======<<<<=========<===<<<====>?@@=2




					
	(7>@@@??>===<===========<<<<<=<<===>>>>??@@?????@@@@@?>>>>>>>===<=<=<==<=======>?@@@@=8-

+



+
+
+
+
								

	*5;>@@A@?>>====<<======<=>>>>>>???><72,%!#&(+048=>@@@@@@????>>>>>>?????@@A@<83-$
	



+
+													

+	
+&-38=@AA@@????>>???@?@@@@@>:3*!





$'),06;=>?@@@@@A@>>>>=:7/"


+


+
+
+
+												
+




&-38;?@@@@@@?>=;83-(#








 !$%#!!





+	
+																	




",1320.(!








+
+
+
+
+
+
+
+


		







+
+
+																					
+





+
+



+






+












+
+																	
+							
+





+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+



+












+
+
+
+







+																		
+	
+
+											
+						
+				 [...]
+			
+

+	
		
+
+	
+	
+		

+	
+
+


	

+
+

+
+

+					



+
+	
+			
			
+
+				
+		
+			
+



+

+	
+						
	





+							


+			
+		
		




+		

		


+
+
+	

+					
+


		
+			

			
+
				
+

	


+			
+
+

+


+
+		
+
+
+


+
+

	


+
+
+
+
+

+	

	
+
+
+
+							
+






	
+	


	
+
+




		
+
+
+	
+
+	
+						
+	5
+
%+0331-&

	


+
+
&H9.37:=?@@@???@??;5.&

%0<;==>?>>==>>>>>>>>>>>???>;5)
+
*7=??>>>===>>>======>>>>>>>>===>?>9/ 
+	/=?>>>>>>>==>===========>>>>>=>====>>??;0

	
$;?>>>>>>>>>>>==>>>====>?>===>>====<=====>?>2
	-?>===>==>>>>======<=>=>1$2>===============>>?=0*
+1?>=======>>=>>===<====?0
1><<<;<============>?A&	
+1?>====>>>=====>>===>===<	
===>=<;<==========>>>:8D		
++?=>===>>=====>=====>==@@4	:@@?><<===========<===A0
+					!>>=====>>======>>>>===>ED*		
+	4FD>>========<<<<<<<<<>7					9>=============>??>>===?GG$	
+
+	
4IF==>==========<<<<<<=>4							,?=>========<==>??>>>===ADF'			;EE=<===>>=========<<<<<>,
+	;>==>======<<>=>?>>>====C at A8
"C at D><=<=??>============<<=&
+		
+			'?=====>>=====>==>>>>=AJAFCBC>944ABAF??==>??>=========>>===>=4169972)

																				9>=======<;<=>>==>????JID?CDGFBBDDCCCDJB=>>?>>==<============>>==>>??=8/!										
+

+	-?=====>=<<<;;<><=?>>>?EG@<=?BBBCACA>=FJE<>??<)6>>>>=>==>===>==<<<<<====?>6!
	
+		

)26

"2?>>>>>>=<;;<<;=>==>>>??===>==>?AA?>===?B?=>?@6
+@??>====>=======<<;;;<<<==>=*!#-5:<==							

,8=>?===>>>>=<<<<<=>>>>>>????>=>>>>>??>>>=>>==>?>>;/:>=>========<<<<<<;;;;;;;;;;<<4-/33569;==<<<;

+							
1=?>=====>>=>>>>????>>===>>?????>=>>=:9<<=====<=??>=<>=<===<<<<<<<<<<;;;;::::::;:;;;<=<<<<<<<<;<==<42.(#

!!
$2<><<<<=<=<==<====>>>>===<===>>????====;7;:===<<<=>>=<;<<:<=<<<<;;;;;;<<<;;:::;<<<;;;;;;;;;;:;;;<<<;;>==<<;;:;<;:86667:==;:::::::;<==<<<<<==============>>===>=>>>=====>><<=<<<<=<<<<<<=<<;<<<<<<<;;;;;;<;;;;<;;;;;;;<<<<<<<=;;;<;<<<;;;;<<<<<<;;;:::::999;;<<<<<==============>>>>>>>>@AB@?>>>>>===========<====<<<<<<<<;;;;;::;;;;;;;;<<<<<==<<====:9:::::;::::::;:; [...]
+
!7@?=<======>============>===>>==>>======>==>====>===>===================>====>==========================<=====<=>?@@	*;@?=<=======================>=================================>>==============================>=============>@A>7.

+.>@=<=<=====================================<==============<<<<=============================>==>=========>@@;1#
+

6@?=<=================================<<================<<==<==>==========>============>>============>@?:-
				

+,>@>==<============<=============<<====<=====<<====<<<<;<<=============================>>=====<<==>??9*
	
				

+
3?@>=<===========<<<<<=<<<<=============<=========<=<<<<<<<<<<========<==================<<=<==??;-

					
+

#8@@>=<===<<======<<;<==========<<=<<<==>======>>>>>======<<<<====================<==<====>>?@=0


							
+

+(9@@?>====<<==<============<<<=<<<<=====>>????????????>>=====<==<=======<<=======<==>>??@?;1	



+
							
+		(6>@A@?>>======<<==<<<<<<<<<<=======>????=;867:<<>?@@@???>?>====<=========>>>>>?@@@?=80$
+




+
+
+
+
						

+	
)4:=?@@@@?>===<=========>>>>>??@?=70(!%*09>???@A@@@@@??@@@@@@@@@@A@<4+$
	
+


+
+
+
+												

	
+
"(07<?@A@???>>>?>??@@??>=:5.%






!"%/4689:;=<:974223/*' 




+
+
+																	



'07<?@@@@???<851*"



+












+
+
+																				



"*01/+'%













+






+
+
+																			
+						
+











+
+
+
+
+

+
+











+
+

+
+
+																		
+												
							
		
+

	 [...]
+	
			
+
		
+
+	
				
+
+		
+

+		
+

+
+


+	

+
+		




	
+
+	



+		
+		
+		

						
+			



+		
+		
			
+
+
	

+		
+
+	

+



	
+				
+
+


+
+


+										







			
+	
+	
					

	
+				
+

		

	
+
+		




			


+


				
+



+
+
+		
+



	
+
+	
+					
+
+
+
+
+
+


+	
	
+
			
+



+

			

+


				
+

3"	
 %((% 
+	
+	

	#E<+069<>>?@@@@?>=;82*
	
)4=<>>>??>>>>=>>>>>>>>>>??>;4)


.:>??>>>>===>====>===>>>>>=====>?>;3&
2>?>>>>>>>=<=>======<===>=>===>=<==>>??<2 [...]
+0?>====>>===>=>====<===>/	0=<<;<<<===========>>A3


+	
.?>>==>>>>>>=>======>=?A8	:@?==<;<==========>>>=.B#					'?>>>==>>>>============EH+		
+	
1GE===<<=<============@9				
=>>=============>>>===?GF

+
+		)JF>=========<<<<<<=<<=;
							6?=============>??>>>==@DD
+
+
+(HD?==========<===<<<<<>9			%?>============>???>>==>CCE
			
+2DC@==<>?>===========<<<>3
+
			9>===========>>>???>==<AHAD2


+ACDB===>??>=====>========>5*/443.$
															
+			'?============>==>??>=?HGMBAB;20/=BAGB===>???==============>>>>>>???<6-!
+											
+
+
	
+								:>===>>==<;<<=>>>>???>DJFBDCADC at DBBCECG>=>>?>>==<<====>>=>>===<<<===>>?>8)
	
+






&/4	
+
	
+											
+
7>>==>>>=<<<<;<><<?????AE@=>@ABBCBBB?=DI@>???=,7>>>>=>>>>>======<<<<<=<<;=>8%

 $,59<==															
+6:=>=>==>>><;;<;;=>==?????>==>>=>?CB?>>==>?>>>?@6,?>>========<<<<<<;;::::;;;;<;3.16767:;===<<<
+								#5=?>>>==>>>?>==<<<==>>>?>>>???>==>>>>?>========>>>=:,9=<<<=<<;<<<;;;;;;;:::::::;;;;<<<<<<<<<<<<<<<73,#

&5>><<<<<=====>==>>>>>========>>>>=====<;<====<<<=>==;<=<<<<<<<;;<;;;;;;;;;:::::;;;;;;:;;;;:;;<<<<<<;==<;976579852.-./39<<;;;;;;<<<<<<<<<<=======<<===>>>>==<<<<;<<=<<<<<===<;;;<;<<<=<<;;;;;;;<<;;:;:;;<<;;;<;;;;;<<<<<<<=<=;;;;;<<<<<;<<<<<<<;::;;;;;;<<<<;;<<<<==<============>>=>>==<<=<========<<<<<<=<<<<<<<<<<<<<<;;::::;<<;;<<=<<<<<<<====<<<:;;;:;;;::::::;::::;:::::;;;;<;;;;;====<<=======<<=>=>>>>>=>>==?>>>>=<======<<=<<====<<<<<;<;;;;;;;;;;;<<===<==========<::;;;;;::::::9::;:;::;;;:;;; [...]
+
5@@>======>>==<====<======>===============================================>=====>>=====================<=====<<<=>@@	(:@?==<====>==========>===========>>=====>===<=======<==>===>==>=<<===>===>>==================>==>>>=<====<<=>?@?;5	+<@>==========>====>=<<=====>>=====>>===========<=====<=<<==<=<================>===========>>=>=>>=======>@@=5)

+
	1?@><<<=>========<<=====>=====>=<<<=>===<=<==<======<<<<<<<=================<<=======>==>=============?@<1!
		


"9@?====<<==================<<<=====<<<====<========<;<<<<=<<===========<===<==<==<===>======<<=<==?@:,
	
				

.>@>==============<<<<<<<<<<==<=<<<===<<=====<==<======<<<<<============<====<<===<======<==<=>??:,
	
+						
	

4?@>>=<==<<======<;<<========<<==<<======>>>>>>>>>>>>>====<<<<=================<=<<<<====>>??;-
							
"7?@?>>=========<<=======<<<==<<<<=====>>??@@@@@?@@????>>=====<<==<==<==<===<======>>?@@?=5(
	




						
+

 0;?AA??>===<<<======<<<=<<<====>>>?@?>;62,(%,379;>?@@@@@??>>>>>=>>=>=>>>?>>?@@A@?<85.$
+
+



+
+
+
+										
+
	
"-6;=?@@@??>=====<======>????@?>92)!!$'-26:<=@@A@@AA at AAA@@@@?>=;81(







+
+	
+														
+



$,28<?@A@?>>>>????@@?>:5/&





!')))(+/.)&&#






+																					



!)18<>???>==92-'




+
+
+


+		
+
+






+
+
+																		
+				
+

	
+
)010+& 






+






	
+






+
+
+				
+																								
+		
+								
+
			 [...]
+							
		
+
+
+
+		

		

+	
+
+
+

	
	


+	
+


+	

	
	
	

+
+

+	
+			
	
+	
+
+
+

			
+		
+	



+	
+		
+
+
+
+			
		

		
+	
+
+
	





		
	
+


+				

					
			
											
+				
			
	
+
+	
+			

+
	


	



+

			
+
+

+	
					
+




+
+
+		
+		
	
+
+	
+				
+	
+


+
	
+	

+
+
	
+
		
+
+	
+	
+
+	
+

						
	.)	
+






+
+



	$B?,.26:<>??????=<:60'

	"-7==?>>?>=>>>=>>>>=>>>>???>;5,!

1;??>>>>====>=======>====>>====>??<6*		3>?>>>>>>>>=========<<<========<<===>??>6$ [...]
+
+?>>=>>>>>>>>>=====<=<==;7;==<<<====<=======>??2"

+
+	
-?>==>>>===>>>>====<<=??34@@<;<<<=>=========>>?:
			
+)?>===>=>>>>=>>=======@H;>IA<=<;<==========>>>>.76
			!>>>>>==>>============>EI(			
+-JE===========<<<<====>A#	
							;>================>===ADE			 HE?<=========<<<<<<<<=>&						
2?>=============>>>>===BD?	
+		
ED@===>==========<=<<<=;
	



+		"?=============>>?>>>>=?DDA	
+
+	&ECA===>?>=====>>====<==>:(%+,+( 																8>===========>>>???>===DIAD'	
+

+8DCC===>??>>>>>=>>>>======>=>??>>:3)
										
+
					
+			)?=====>>>===>>==>???>>CEKA@@-(+,8CBFA=>>????======>>>=>======<<==>>>?>9,


+



!*0
		

		
+			
+
+
+
+					
"=>==>>=>=<;<<=>>>??????FADDBAD@?CCACC?@>?????>==<====>>>>>======<<<=<<==>;4#")#)(%'+58;<<



		
+		
+
+
+
+
+						&06<=>==>>>><<<<<<>=<???????>=>?@AABB@@?=>?=?>??=.8=>>>======<<<<<<<;;;:::;::;<:406:9:9:;<=<<;;
														
+%4<>>>==>=>>>>=;;;;<<>>=>>>???>=====?EB?>===<<=>>>?4
->==<<<<;<<<;;;;;;::9::::::::;<<<<<<<<<<<;;;;61(



+
+

(8>>===<<===>>===<<<<===>>====>>>======>><<=<<<=====<8)9<;;;<;;;;;;::;;;:::::::;;;:;::;;;;;;;<<<<<<<<<<962//2430+$!$%)08<<:::;;;;;<<<<<<<====<<<<<<=======<<<=<<<<<<<;<?>==<;;=<;;<<<<;;;;;;;;;;;;:::::;;;;;;;;;;;;<<<<<<<<<::;;<<<<<<<<<;;;;;;:::::::::;<<;;;;<<<<<<<<<<<<==>>>===<<<<<<<=<<<=?====<;<<<<<<<=<<;;;;;;;;;:9:::;;;;;<<<<<<<<=====<<<<;;;;:;;:::::::::::::;;:;;;;;;;;;;<<<<<<<<<======;;=<>>>=======<<=====;<<;<<<<<<<<<==<<<<<<<<;;;::::<<;<<<<=<=======<<<<<<<;;;;;:::::::::::::;;;;;;<; [...]
+1?@>================>>>============>>=================>==================>==>>==============>==<======<<<====<<<=>?@
#8?@>=<=====================<==>=======<=============<===<<======<<<====================>=>================<==?@@>:	(8@?=<<=======================>=>===========================<==>==<==<=<<=============================<==>?A?9.$
+
	)<@>=====<=<===<<==============<<<==>=======<<=====<<<<<<<<<<==>>======<=<<=<<=<<======>=========<===>@@=3&			
+1@@====<=======<=====<<===<<<==========<<=======<<<<<<<<<<<<===>>======<<<<====<<===========<<<==>??:-

+
				
+

"9@?=====<=====<<<<<<<<<<<<=========<<<===<===>>==>>===<;<<<<<=========>======>>====<<<=<<<<<=>?@8(

+					
+
	,<@?>===<<<<=====<===<====<=<===<<<<=====>>>???????>>>====<<==<<<==<====>=<==<====<<=<=>>>?@>6&									

+-;@@?>===<<<<==========<<<<<<<<<====>>>?@@><::<?@@@??????>>======<<<==<=======>>>??@@?>;5+

+






										

+
+&4<@A@?>>==<=<<<<<<<<<<<<<==>>>>???>;6/'
"+39=??@@@@A@@?@????????@?@@@@@A@?=7/)$








+
+
+
+						

+
"-5;>@@@@?>>==========>>????>:4+!
 #&),-/26:;<===>>=;<;8432-)%





+
+

+												

+

%,16;>@@?>>>>>>???=<71(















																		
+			
+



+

(29=?@?@?><71&








+		
+










		
+
+								
+
+
+	
+											
+
										

		 [...]
+
					

+			

+

+
+		
+

	
+			

+
+

		

	
+
+		
+



	
+

		



+
+
+	
+
+
+	
+
+		
+


+				
+	
+
+
+
+
+					


	
+
+
+	
+		

+
+			


		

+			
+										


+

	
+

	
+							
+					


+
+	

		



	
+	
+


+
+	

					
+		




+		
				
+
+






	
+
+
+
+
+			
+


+


								
+
+





+	

		




				

			


	*-
+	


	
+

+
+%>@-.369;=>>>>>>=;85/'

	
%0:==>>=>>>>>==>>>>>>>>>???=;6.$	 3<??>>>>>=======<========>>===<>??>9/ 		
+3??>>=>>=>>========<<<<========<<===>>??:*		
+
#<?>=>>>>>>>>>>=====<<<<<=<<<<====<======>>?:'
+	
)>>=>>>=>>=>>>>====<<==>>=>@><<==============>?6

		
+	
+(?>==>>>>>===>=====<;=@C>-#,>F@;<==<===========>>>=

+		
+	#>>==>>>=>===>=======<@HA!

"BF>===<<=======<====>?1(C								
+<>>>=================>EG+				
.FB=<========<<<<<<<<<=A0
															8?===============>>===AE?
+
+
+AE>=========<<=<<<<<<<>.

+
+
+			
+	
.?==============>>>?><>CD8	
+
+
+	>D?==>>>===========<<<==.!#$"
										
+	>==============>??>>>=@DC9
+
+
+
+?D@>>>>??>==>>>>=>>=====><<===;7.#
												
+

						
+
+
+		7>==========>>>>?????>=CEA?		
+
*BDA>>>>??>>>>>=>>=>>=====>===>>?>>;6-


#)														
+
+
+

+		
+.>====>>>====>>>>?????>>BFBB9  ((1ADC?>>???@?=>>===>>>>>>>======<<==<=>?;4-# #),0.)++158;<
+		

+					
+
	
+
+
+
+
+
+	
+		
*4>>>=>=>>=<<<<=>>>>?????=>ABABB??ACBC@==>????>=<=<=========<<<<<;:;:;;;;::;<:679;:<<;;<<<;;;


+	
+	
+	

	
+
+
+
+			
+$08<===>>>>=>><;<<;;=><>>????====?@ABAB@>=<<<=>==><19<===<;;;;<<<<<<;;:::::::;;::;;<<;;;;;;;;:;;;6/#




					
*8===<<<<=======;;;;;;==<=====>=;<<<<>@A@=<<<<<====?/
0=<<<<;;;<;;;;;;;::::;::;;;:;:;;:;:;;;;;;;;<<==;70+(),.-*%

&09<;:;:;;;;<<<<<<<;;;;<<<<=<<<====<<<<<<<<<<<<<<=====<4%9<;;<<<<;;;;::;;:;:::::::;;;;;;;;<<<<<<<;;;;;:;;;<<<<<<<<;8678::::99999::;;<<;;<<<<===<<<;;;<<=====<<<==<<<<<;;=?=<<<;;=<;<<<<<;<;;;;;;;;;;::::;;;;<;;;<<;;;<<<<<<<<<;;;;;;;;:::::;;;:::9:::::;;;;;;;;;;;<<<<<<<<;<<======>=<===<<==<<<=>=<==<;<<=<<===<<<<;<;;;<;;:;:::::;;<<<=====>>>=<<<<;=<<;;<;::999999::::::::;; [...]
+
3>@>=<<==========<==========================<====<<<<===============<<<==================>==>====<<<===<=====>?@?>
!6>@=<<========<=<<============<<===========<=<<====<====<<<<=========<<<<<<=============>=========<<<<==>?@@;3)"
+

"5@?===<===<<=====<==============<======<<===>======<<<==<=====>=<====<=<<<<<=<<=<============<<<<=<=>@@=4)

			
+

+%:@>===<<==========<<<<<<<<<=<<======<<===<===========<<<==<<<=====<=================<<==<=<<<<==>@>7-

+
+					

+.>@>=====<=====<<<<<<<<<<<<=====<<====<====>>>>>>>>>>=<;<<<=<<===================<==<<<<<==>?@@=4#



						
+

+

3?@?=<===<<<<<<===========<<<<=<<<=====>>>?@@?????>>>>>>=======<<==<=<<=<<<<==<=====>????@>7,

+
								



2=@@?>=<<<==<<<===<<<<<=<<=<<=====>????;5,$!$-8>@@@?@????>>==>>======>>>>>>>>??@@@?<84-$






									
+
	
&2:?@@?>>=>==<<<<<<<<<<==>>=>>?@>:4*!%08<=>@?@?@@@@@@AA@@A at AA@@?><:850'






+
+

+										
+	
+

+

*28=?????>==>>==>>>>>>?>>;5,"
 $&%#%'))**.110,+(' 



+								
+									
+				

+	
)38=????????>??>?>:5+



+	

+						

+						



+	
+								
+
+											
+				
+
+			
+	
+
+ [...]
			

+
+



+		
+
	
	
				
+
+	
+


+	
+			





	
+

	

+
+	
+			
	
+
+
+		
+

		
+		
+
	


+	
+
+	
+
+	

	

+	



+
+			



+
		
+

+				
+
+
+

+					
+




+
+



+
		
+					
	
+

+	

						


+	
+




				
		
+
+
+				





+
		
+
+	
+
+
+
+








+

		


+
+
+	
+

	


											









+			

		



	
	

		
+

+)/
	



+
+
+	


&=A-.258:;=>====;962-%
	
+	(2;=>?==?>>>>>=>>>>>>>>????><71(

"5=??>>>>======>========>>=>====>??><5(
		3??>>=>=>>===========<<=======<=<===>>>?=/
+		
+ :?>=====>>=>>>=====<=<<<=<<<<<<=<<=======>?=-				
+	
+#=>>>>=>>==>>>=====<<==@DFEB=<<==============>?8 
		
+	"=>>==>=>>==>>======;<>BE@:?EC=;====<===========>=;#					
+
<>==>===>>>=========<=AC1.BA<<<=========<<====>?8!D#												:>=====>==>=========>=@C0
.B>============<<<<<<<=<0
															4?==============>>>>>=>B=
+
+
+=@=>>>==========<<<<<<=5# 

													
+	
,?==============??>??>=AD3
+
+
+
+	8B>=>?>>>>>>=>>=>=>====>=;;:970'								
+							
+
+	>>===========>>?????>=>CE1

+
+
+
+
+9D?>>????>==>=>>>>>>>>===>>>>>??<71(


																							
+
+
+	9>========>>>>>>?@????>?CE:	
+
+		>F@>??????>>>>>>>>>>>>>>==========>><51+')#*25441.,-038:
+												
+		
+	
+
+
+

+		
+$6>==>>>>>====>>>=???????>AEC/" "6CC>=??????==>>=========<<<<<;;:;;;;;;;<;;98;;;<=<;<<<<;;
+			
+	
+
+
+	
+
+

+
+		
 *4:=====>==>>=<;;<=>>>>????>=>ACB=;>>@BC><<==>>>=;;<;;;;;;;<<;;;;;::::::::::99:;:;;;;;;;;;;;;;;5,




+




+
+
+
+
+		
+*7==<<<========<;;;::;=<<>>>==<<<<>@B?=@A?=;;;<====;4:;<<<;;;;;;;;;;;;;:9;:::::;;;;;;;::;;::;;;;;;==:2)$""$'%"
%1:<<;::;;;;;;;<;<:99:::<=<<<<<<=<;;;;<@??@>;;;;;====>*4==<<<<;;;;;;;;;;;::;;;;;;;;;;;;;<<<<<<;;;;;;;:;<<;::;<;:94/0247::99999::::;;;;;;<;;;;;<<<==<<=====<<<<<<=<<<<<<======.!9<<;;;<<<;;;;;;;;;;:::::;;;;;<<<<<<<<<<<<<<<;<;;:;;;::::::;;;;;:999999:::;;;;;;<<<<<=<<<<;<<<<==<==<<<=====<<<<<>=<=<<<==<=<<=<<<;;;;;;<;;;;::;;;;:<=====<<<========<=<<;;;;:::99::;:::::::;;;;;<;:;; [...]

4??><<<=<=<=====================<=====>============>============>>==<<<==>>>==>>>=>==========>>>===<<<<===<==<<<<<=<=
$8?>==<<==<<==========>=<===<<==========>=======================>======<====>=<============>========<<<==<<<<==<==>?*;@?=<<===========<===========>=====>========<==<<====<======<<======<======>=======>=====>>==========<=<==<=>?@@>	.=@?=<==<================>=<<==>>===========<==<<<<======<<<=====<<<<==<<<<<==<<===<===========<===<=<<=>?@@<6,%
+

+
/<@?==<<=====<================<<<<<========<<=====<<<<<<<<======>==<<<==<<<=<===<======<=======<<==>?@@=6+

	
+
+	
	
/>?====<======<<<<<<<<<<<<<<<===<===<<========>>>>======<<<<=========<=>=========>===<=<<<=====>?@=3)

		
					
+	

6@?>=<<=<<===<<<<<<<<=<<<==<===<<<<=======>??@@?>>>>=<<===<<==<======<==<=====<<<<<====>>>?@@=7*

+
							
+
+#7?@?==<=<<<==<<==<======<==<=<<<<==>>>?@?<7237=@@???>>>=====<<======<<=<=========>?@A@@=92'
+

									
+

!1<@@?>>===<==<<<<<<<<<==<<<===>>>??=8.%
(4<@A@@??????????>??>????@@@AAAA@?>:5,$





											
+


".8=?@?>===<====<<==<<==>>>??>;4)
"/7;<<====>=====>?><;:731.,,("





+
+
+
+
+
+
+
+
+						
+		
+
+
+
+
+!-7<???????=>>>>=>>>?>??>9-



 "! "#$"

!% 
			


+
+		
+									
+														
+	
+
+		

	 [...]
+ [...]
+
+							
+
			
+
+
+		

				

		
+

+
+	
			






		
+		

+		

	
+
+			
+
		
+
+
+		
+
		
+
+							
+
+					
		
		
+				

	
	
+
+	



		
	
			
+


				
+
+



	
+				
+



+

+
+				

+	
+
+


+
+
+

	
+		
+					

				
	
	
+		



	
+












			

+
	



+
			
+										




+	
+
+


+


				



		
+
+

			
+
+

	

+	'1
	



+
+





+
	

!(>A/.2468:;;<;;:9640+$



*4<>>>==>>>>>>=>=>>>>>>????><94-$	
 5=?>>===>==<===<<======>=>>====>???>9/
	0>?>>===>====<=====<<<<========<======>?>4
	
+		8?>>====>>==>>>======<<<=<<<<===<<=======>>>0				
+	
;?==>=>>=>===>=====<<<=@CB><<<=<============>?:#			
+	;?==>>>=>=>>>======<<<>BEBDD@;<===============>>>=3 										
+	9?===>>=>=============>A<-%6@=<===============<==>>,=0																								6>=========>>=====>>>>=?5
	.?==>========<=<=<<<<<<;4&

+											
+												1?==============>>>>>>>?<	
+
+9?>>>>===>=======<<==<==;:63.( 
							

+											
+	
+?========<<====??>>>>=>B3

+
+
+
+
+
1@=>??>>>>>>>>>==>>======>>>>>=81("


!
																							


+	">>==========>>>???>??>>?C+
+
+



+
0C?>???@?>>>>>>>>>>>>>>=======>>>>=;73/,(((+267761-,,-15																			
+
+
+
+
+
+
+
+
$;>===>>>>>>>?>>>???????>?D1

+

+
+
+5C>>????@?>>>>>>>>>>>>>=<==<<;;<<;<<<<<=;::;<===<<<<<<<<
									
+
+
+

+

+
+
+

	
"/8======>>>>>>=>>>=>??@?????C?!


!?A==??>>>><<==<=<<<<<<<<;;;;;;::;:::::9;;;;;;;;;;:;;;;:;3(

+		
+

+

+
+
+


+		
+)5;==<<====>>==<;;;;<>>?>>?>>><<?B=1.4.+<A=;<<<<==<::<;;;;;::;;;;;;;::::::::;:::;;;;;:::;::::::;<=<8.%

!



%1:=<;;;;;<<<;;<<:9:::::<5-;<<=<;;;;>B@=<>BA=;;;<<<==;8;;<<<;;;::;;;;;;;;;:;::;;;:;;:;:;;;;;;;;;;;;<:;;<:9889:9861*(*.27:::9999::::;;;;;;:99:::;=3&9<=<=<;<<<>?=<?@=;<<<====>'8=<<<<<<<;<<;;;;;;:::;;;;;<<<<;<<<<;<;<<<<<<<;;;;;;;;;;;;;;;;;;::9998999:9::;::;;;<;;;;;<<==<<<<<<;;<<<<==<<<<<;<=====):<<<<<<<<;;;<;;;;;;::;;;9;<<==<<<<<<<<=<<<;;;<<;;;;::::::::::::::;;:::::;;;;;;;;;;;<<<<<;;<<<<<<<<<<<<======<<<<====<<=<<<<<<<<<<;<<;;<<<<<<;;<:;ELD==>=<;;<<<<;<;;<;<==<;:;;::::::::::::;;;;;;;<<; [...]
	

2>@><<<<============<=============>=====<=>==<<<<==<<<===<<=====>>==<<<======<===<=>======>===<===========<=<<====>
+
 5??==<=<<<<<=============<=====================<<<==<=====<<======<<<<<<<<====================<<=====<<<<<=>??@@@
"6@@==<<=<===<======<==========<=======<<==<<====<<==<==<==============<=====<<===========>=====<<=<<<=>>?@@>8/(	

&6??=<=<============<<===<<=<=========<<<==<<<=>>=>>==<<<<<<<<=====>=<<===<=<================<==<==>@@?<3) 
			
+

+5@@==<<===<<=<<<=<<<<<<<<=====<==<=<<=<<===>>>??>>==<<<<<===<<==<====<<===========<<<==<====>?@@=7+ 

+


	
+				

+"7@@>==<<==<<<<=============<==<<<<===>>>>?@?<=????>>>====<=====<====<<<<<=<===<<=<===?@@@@?:2'

+
					
+
+	

#6>@?>==<<===<<<<<<=<==<<=<<<<===>>>>??;4+"$1;?A@???>>>>>>=>>==<======>?>???@@AA@?=82,%


							
+
+
+


+7=???>>=<=<<<<=<<<<<<<<===>>>>>=90%#3;>@@@????@@???@?????@??>=<;9843.'!








+			
+
+			

	 3=@??>?>=>>==<<======>==?>?>6(

-8<=>?>>???>>>;:>=951(




+	
+	
+	
+				
+																
+	
+	
+		
+
+
+
+
 [...]
+
+
+
+	

+	
+	

	


	

	
		
	
	
+	







+
+	

	
+
+		
+
+		
+


+		


+

+
+		
+
+
	
+
+
+			
			
+
+	

	
+
	
+
			
+
+
+	

	





+			
+



+	

+
														

+
+					



+	
+
+	
+		

		
+
+
+
		
+
+	


+

+
+	
+	

+			



+
	
+	
+
	
			







+
+
+



+
+		
+

	
		
	
+
+	






+				
+
+
+
+
+
+
+
+		
+
+
+			


+
+		




+
+
+


	
			
+
+


+		

	)1
+





+
+		
		
+



	
 #+?A0/235799::998641.)#

+
*5<>>>==>>>>>===>>>>>>??@??>=;71*
	

2=?>>======<===<============>==>>???;2"	
++=?>>===>====<=====<<<<=======<<======>??8#				
+4?>>=========>=======<<;<==<==<<<=<<======?>3
									
+	7?>==>===============<;=??<<<<<<=========<===><(
+
+
										7?===>===============<<=@AA?<<<<=======>=======>><=
#6
																								5?=====>==>>>======<==<==6-1;>=<==============<<=<=>9>@

+	
+
+		
+
+																										3?========>========>>>==9"

7><=>==<<==========<<<<=><5,%

+																					
+	0?==============>>>>>>==>"		
+
+;==>>>===============<===>>=<94*!
"




																								

	
+?==============>???>?>>@5	
+
+

+
/?=>???>>>>=>>>>>>>>>>=>=====>>>=;940141+++.26:>;5/*)''*			
+																				
+
+


)>===>>==>===>>>???????>>A,
+
+




+(A>>?????>=>>>>>>>>>>>=====<<==<<<=>>===<=>====<===<<<<<
+	
+								
+



+
+	
+
+
+	
)6====>>==>>>?>>>>?>?????>>A*	




	(@>>??>???>>=======<==<=<<<<;;:;<;;;;;;<;<<<<;;;;;::;;;;0%

+		
+
+	
+
+	
+


+
+
+
&06;======>==>>==<=>>=>?>???>>>@6				2?<>>>>>==<;<=<<<<<;<<<;;;;;;;::;::::;;<;;;;:::::::;;;;;=<5,"



+
+
%0:>=<;;<<==<==<=<;:::;==?>=>>>>=<=>4!*><;<==<<<<;:;;:;;::::;;;:;;:::::;;:;;;;;;;;;;::;;;;;;;<<;;;;:87789864/(!"',28;;:9:::::;;;;;;;:999999;8*8==<<<<;;=?<;957>=;;<<<<<<;:;;<<<;;;;;<<<;;:;;;;;:::;<<<<;;<<<;;<;;;<<<<;;;;;;;;;<;;;;<;;;;::999999999:;::;;;;;:9:::;>42=<<<<<<<<====>?=;<<<=====$
;<<=<<<<<<<<<<<;;:;;;;9;A>====<<<;;;;;<<<;<;<;<;;;;;;;;;;;;;;::::::::::::::;;:;;;;;;;;;;<<<<<<;<<<<<<<<<<<<<<<<<=>>===!
;<<<<<<<<;;<<<<=<<;;;::DY^J<<=<<<;;;<<<<<<<<<<<<<;;;;;;;:;:;;;:;;;;;::;;;; [...]
		(9@>=<<;<======<<<==========================<=<<<<<==========<=====<<==<<=<<<====================<<<<=<<===>>?@@@	&:??><=<<==<==<==<<=<==========<<======<<<<=<<<<======<==============<<<<===<======<<>==>===<<<<<<<<<>>?@A@=:4,
+
+

	&7@@=<<<<====<<<<<=====<<<<===<<====<=<<<=====>>=>====<<====<<===<=>====<<====>===>===<===<<<<==>>?@?;5-'
	
+	
+

+"5??>===<<<=<====<<<<<===<<=<============>>>?@@@?>>>===<<<==<<===<======<==<<<<====<<===>>??@@?;4* 



						
+

!6?@>>===<=<<<=<========<<==<=<<<<==>>>??>:2,08=@??>=>=====<<===<<<<=======>===>????@@@?<82*


						
+
+	



/;?>>==<<<<<<==<<<<<<<=<<<<<====>>><7."
*8>????>?>>>>>>>>>>>>>>>???????>==;751'





					
+				
+


+,:??>=>>>==<;;=<;<<=<<==>>>=>?><2"
-;?@@@?>@@????@?@AA?@?@>882*%! 









+
+
+														 [...]
+


				
	
+

+
+		 [...]
+
+
+

+	

		
+

	
+
	
+
+			
+	
+
		

				




+	
+

+

	
		
+







		
			
+

+	

+
+
+
+				
+	
+

						
		
+
	

+

+	
+





							
	
+
+	


+						
+
+				

+		
	
+
+
+
+
		


		
+	
+


		




+	
+
+

	


		
+
+
				
+	

		

+	
+


	
		
+
+





		



+

+						

+


+
+
+						
+

+			
+
+

+
+		
+			




+		






	
+

+
+

					
+


			

	


+	.1
+







+
+		

+



	

"$&.BA102357889876542/+'$
	
(5=>>>=<>>>=>==>>>>>>???@??>>=95.$
		
+.;>>==>>===<==================>=>>??=5'
		
+	
%;?>================<<<=<<===<;<===<===??;(											.>>==================<<<<<==<<<<<<===<<<==>>6

															1?===>>===========<=>><;;<=<<<<<========<====><- $

																								2?====================<;<=<<<<<<=<=========>====>=@3+I
			
+
+
+																
+							
+2?==========>======<>>=;==<>?<<<====<============<=<=?B4

						
+
					
+												
+
+2?==================>>=<>8%
0?=<====<<<=======<<<<=<<===<84,"

																													
+
+0?=======>=======>>>>>>>?7			
)@<=?>>====>>==>>>>>>==<====>>>=;850-..12.--/346752/(% 

+
+
+
+
+
+										
+				
+		
+
+
+


/>==============>???>??>?>
	
+


+6?>??>>>==>>>>>>>>>>>>>>=========>>>>>?>>>>>>>>>>>>=<;:;

+
+
+
+
+	
+				
+
+
+
+
+
+	
+	
+	
+

&6>===>>==>>>>>>>?????????@7
+




+)@=??>>>?>=============<<<<<;;<<<;;<<<<=<<=<;;;;;;;<;;<<.#
+
+
+
+
+
+		
+
+
+


+
+
+
+
")19=====>>===>>>>>==>?>>>>>>>@2

+
+
+
+
+#?<>>>>>=><<===<<<<<<<<<<;<<;;;;;;;;<<<<;;;;;;;::;:;::;;=;4*"





+
+

%/9===;;<======>><;;;==<=>=>>>>>=?3
					(><=>>===><;<<;;<<<;;;;;;;;<;;:;;;;<<<<;;;;;;:;::::;;;;;:<<;977787652.'
!&,39<<;::::;;;<;;<==;:99::<<>>=>>>>>=>=



+6=<>>>===<;:<;;<;;<;<<<;::::;;;:9:<===<<<<<;<;;;;;<;;;;;::;;;;;;<;<;<<;99::;:989999999:::;;;;;999999:;05=>====<<=:1/) 
0?;;<====<<<;;<=<;;<<<<<<<;;::;;::AH@====<<<<<;:;;;;;;;;;<<<;;;;::::::;;<;;:::::::99:9:;::::;;;:99::;=;
)=<<<<<<<<=>=>=<><9:<<<<<<$'<<<<<<;;;;<<<<<<;:::8?SkiK;<<<<<;;::;;;;;;;<;<<=<<;<;:;;;::;;;;;;;:;;::;;;;;;;;;;;;;;;;;;<<;<<<<<<=<<;<<<=<<=<;<===<<: =;;;;;;;;;;;<<<<<<;;8Cez}z]B:;<<<;:;;;;;;;;<;<<<<<;;<;<;;<;;;;;;;;;;;;;::;;<<<;;;;<====<<;;<<<<;<=<<;;;;<<<;<;<<<;;;;; [...]
+,;@?=<<==<=<<<<=<<<<=========<=>===<<====<<=<=<<<<<<=========>======<=<<<<<<===<==<====<========<<<<<==<<=>??@@@	
+)8??=<<<<<===<=<============<=====<===<<===<<<===>>====<<===================================<<<=<==>>?@@?><92,	
+

	!5??>===<<<=<==<<<<<=<<<==<<<<=<=>=<==<=<<===>????>>>==<<<<<<=======<===<<========<<<<<<=<<=>>?@@@=93)"


+
+
+	
+

 4?@>=<<<<<<<<<=<====<<<<<=====<<<<<===>>>??><=??>>>===<<<======<<<<<<<===<<<<====>>>>??@@@>;5,$




+				
+
+
+

/;?>==<<;<<<<<<<<<==<<=<<<<<<=====>>>>;6-!
'3<???>>>>>==============>>??>>>?@???>=;62)#




			
+
+
+			
+


+
+0<??>>=<====<:<=<<<<<=<<<===>>?>>?;1

4????>?????>>?>?>????????@@@<8441*







+			
+														
+

			



	
+
+
+
+		 [...]
+


+
			

+
+
			


	
	
+				
+

		

+
		







+
+

+
+
	







							
			
+
+	
+		
+
+							
								
+			
+
+
+
+	
+		


+
+

+	
+
+
+
+						

+

+					
+

	
+	
+
+	

+

	




	
+
	
+		

+	
	


					
+	
+



+


+



+
+		
+	

+

+



+



+
+
+








		
+

						


	
+

	


					
+
+
+
+
+		
+
+				
+	
+


	
+
+


			


+			
		



					




+
	
3,

+










+		
+


	



	
+$+'/E at 0/1245666554210-*'$ 
+		$4>>>>==>>>====>>>>>?????@?>>=;71'
			'9>>=<=>====<=<<================>>??=7)
+					
+
6?>>==============<<<<<<<==<;;=<<<=<==>?;*											
%<>=========<========<<<<===<<<<<=<<<<<<==>?9'
			
															+>>=============<====>=;:;<<<<====<<=========>>9,)!2		
+
+	
+
+																->=======>========<<===<<<<<<<<<<<=========>======?<5L7

+			
+				

								
+						
+
+/>=================<=>=<<>@@>;;<=<<=<===<======<<=<<<=>=2*#


#


+
+
+
+																				
+
1?>=================>>>==?8//9?==>>==========>>=======<<<>>>;73/+(*,02/.-.063442.*$

+
+
+
+
+
+											
+									
+
+

2?==>===>>=====>=>>?>>>???)

4A=>>>?>>==>>>=>>>>=>>==>==<===>>>>>>>>>>>?>>>>?>???=<:65

		
+
+
+
+							
+


+		
+			
+
+
%7>====>>=====>>>>??>?????A.

+

	=??>>>>>================<<<<;<=<;<<===<<=<<;<;<;;;<<<<<=)







+			
+
+
+
+
+
+	
+
#.8=>==>>>>>>>>>>>=>?>>>?>>>??
+
+
+
+	,A=>>>>==<<<<<<<<<<<<<<<;;<<;:;<<;<<<<<<<<;:;;;;;;:::;;;<:3,% 


		
+
#.7:<=<<<<<<===<<=====<=>===>=>=>;				#@<=>=====<;<<<<;<<<<<<<<;;;;;;<;<==<<<;<<<<<;;;;:::;;;;::;;:88888752.(!&,39<<<;:::;;;;<;;<<;::9;<;<========>8					$@=>=>>=>><<<<;;<<<;;;;;;;;;<<::;<=>>==<=<=<<<;;;;;<;;;;::::;;;;;;;;;;:7579:;;:9999:99::;;;<<<;:9:99;<<>=>==>==><				
+.?=>>>>==<;;<<<<<;<<<<<<<<<;;9:?JPC<<<<<<<<<<;;;;<;;;<;;:;;;::::;::;;;;<;:::::;::9999::;;;;<<;99999:;<53=====>>=>)
	<======<==<;;<=<<;;;;<<;;;;::8;MarpP<<==<<<<<;:::::;;:;;<;;;;;:::::;;:;;;;;;;;:::::::;;;;<;;;;;:9::;<=*$<<<<<<<<;;9:7/)3=:;<<==<:'2=;<;;<;;;;;;;;;;;::;Vustz`B:<<;<<<;:::;;;<<<<;<<<<;;;;;;<;;<<<<<<<;;;;;;;;;;;<;;;;;;<;;;;<<;<<;;<<<<;;<<<<===<;<<;;;<5&=:;;;;;;;;;<<<<<;;;9M~|]^vsV@;<<<;;:;<<<=<<<<<<;;<;<<;<<=====<<;;;;:;;:::;;<<<<<<;<====<=<<<<<<;<<<<;;<<<<<<<;:;;;;;<;6:==;;<<<<<;;;;;;<;::9;e�_GPksP<==<;;<=<<<<<<<=<<<<<<<<<=<=>=<<;:9:::::;;;<=======>======<<<;<<<<<<<<;<<<<:;;;;:;<8:<;<== [...]
+
+!3>@>=<<<====<====<<<<<==<================>=<<<<<<==<;<<=<<<=========<<==<<=========<=====>=====<==<<==<<<<<===>>?

/;??=<<<==<<;<<<=<<=====<==<<==========<<==<<=<<<===============<<==<<=<<<<==========<====<<<<<<<<=======??@@@@

+
&3>@><<<<<<=<<<=====<====>==<===<<==<==<<<==<=>?>>>====<<<==<====<================<<<<<<<=<<=====>>@@@?;863-&
+
+




1>@>==<;;====<<<<================<<<<<<<=>>>?@@?>>=====<=<======<<<===<<=<<=<<<<==<=====>??@A@>:4-$


					
+

0<>>><=<<<<<<<===<<==<<<<;<<==<<====>=>>><5-1:>>>>>>=<<====<=====<<<<=====>>>??>??????>;51)"

		
+	
+	
+

2=??>>=<<<<<<<==<;<<;;<=;;<<<>==>>>>?;0"
,;?>>>?>===>==<===>?>>>>???????>?>>:3-.(%


+															
+	


+

	

+			 [...]
+	
+					
+			
+
+
+
+



+



			

+
+	
+
	

	
+	

		


+	

+				
+		
+







+		
+			
+		
					
+	
+
		
+	
+
							
	
+							
+



+
+						
				
+			
+
+
					

	
+
+
+
+	
+	

	
+			
+
+	



+		

	



+	

	
	


	
		
			
+	
+
+

	
	


+


+
+














		
+

+	



	







+
	
			
				
+
+
+



+								



		
+
+
+	
+
+	

+

+
+
		





+			
+
	
+	4$
+
+







+
+
+
+		
+



+
+
+
+



+$,&1E>/0123334433210.,*(&"


+				2=>>>==>>==>>>==>>>>????????><83-(					 5>>=========<=<<==<<==<<<<<=====>??>:-
								1>>===========<<<==<<=<<<<<;<<<=<<<<==>?=2 
+												
+9?==================<<;<<===<<===<==<<<===>>5%
+
	
+																
%<>===>=================;:<<<=================>>:43 AA			
+
+				
+			

				
+
+							
+)>>=====>=====>====<==>===<<<<<==<============<=<<==<BA)








+					
+		
+
+													
+
+->>======>==========>>====>>=<<<=====>========<===<<<<<=<;82,*'%&*-6851//0100.,)$
+			
+
+
+
+	
+
+							
+											
+

1>=======>====>>>>>>>?>>>??<<>>=>>>>======>=>==>=====<<===>>>>>>>>>>?>>>?>??>>?>>><:71,
+
+		
+
+
+	
+
+
+
+				
+


+
+
+
+				
+
+
&8>=====>=>>==>>>>>>?>???>@9!'=?>>>>>>==================<<<<<====>==<<<<<<;;;<;;<<<==== 








+	
+
+
+

+
+
+
+
+

+8=====>>=>====>>>>>>????>>?9		
+ >>>=>>>>=;<<<<<<<<<<=<<;;;;:;<<<<<<<<<<;<;;;;;;::;;:;;;<:72,(%$###!
+	
+

#,48;=<<<<<=======>====>===>>>>=?#					.?=>>====<;<<<;;;;;;;;;;;;;<<<<<==<<<<<<<<;<<;;;;:::;:::9;;;::::999751-%

#'-27;<<;::::;;;;<;;<<;;<;;<=====<====				!@========<;<<;;;;<;;;<<<;;;::;<====<=<<<=<=<<;;;;;:;;;<9999:::::::;;;:9669:;;;;::9999:::;;;;;;;::9;<:;=========<				@=>>>=====<<<;<<<<<<<<<<<;;:=HRM@<==<<<<<<<;<;;;;;;<;<;;;::::;::::::;;;;;;::;::::::::;;;;;;;;;99999;<;===<===>==				&?>>=>>===<<<<<<<;;;;<<;;;::8D\qymO<;=<;<<<<;;:::;;;;;<<;;;;:9:::;;;;;;<;;;:;;;::::9::;;;; [...]
+	
3>>?>>===><;;<<<;;;;:::::;::8DjulnzgF<==<<<;;;;::;;<<<<<;;;;;;;;;::;;;;<<<<<<<<;;;::::;;<<;;;;;;:::;<>7#8===>>>==5%(#
;<>===<;9.8<;;;;;;;;;;<<;;;::=e�gS^twW?;<<<<<;;:;<<<<<;;<;;;;;<<<;;<<<<<<<<;::::;;;;;;<<<;<<<;;<<==<<===<<<<<<<:;<<=<:78<:;;;;:</
/=;;;;<<<<<<;;<<;;;9F{}RHOh{pL<<<<;;;:;<<<===>;;<<<<<<<========<;;;::9::;;;====<<<====>========<<<<==;;<======<:;:::::7.9==;;<<<<<<<<<<=<<;:9I|{YFFZy~T:::;;<;<==>>>>=;;;;<=<=<<=====<<AGMOKA:<<;;<<<=======<<<<;;;;:<<<<;;<<;;;;<<=;;;9;;7;<<=>====<<=<<<<<<;;;;;;<<:Ix�jTSj�yE69::;;<<===>>=<<<<<==;;;<<<:=IYflmm[?9;;;<<<;;;;;<<<=======94<<==<=======6');=======<=====<<==<<<<<<;;;;;;;;<<9Ae�~uy|jK89;<<;<==>>>==;;;;<<==<;<;ASgttpmv|V99:;<<<<==<=========>=>==>>>==>>>=>>=0*(:>=====<<<<9:===<<<<<<<<< [...]
+!.9??>=<==<<===<<===<<=<<=====>============<<<>>==<<<=<<<<========<=<<<==========<====>===============<=>==<<===<<<<
+
%5>@>===<<====<<====<<<======<=>>==<==<======<<==<===<==<==<<==>==<<<;<<<<<=======<<=====<<=====<<<<=<===<<==>>>>
	-:>?>=========<<<=<=======>=<<<===<====<<;<<<=>>==>>==<<<<===<<==<<<=<=<=<====>>=======<<;<<<<<==<<=>=?@@@@?@>



-;@?=<<=<<<<=====<<====<<===<<====<<<<<<====>>???>>=<<<=<<===========<=====<=<=<===<<<<==>>>>>?@@@?;63-'%"
		
+



*:?>==<<<<<<<<<=<=======<<===<=<<<<==>====>><=>>>>>=<<<<===<<<=>==<<==<<=<<<=>>>>??>???>??=;61*#




	
+	
+


5>>?>==<;<<<=<<<<<==;<<<<<==<<==>>><>?>?<0"6?@?>>?>=<<<=>>=<;=>==<<=>>>?>??@?????<<:6.'


+
	
+
								
+		
+		
+
+
+

+

+
+			 [...]
+
+									

	
+
+			
+			
+
+	
+
+		
+		
		

		
			
+
+
+		
			
+
+
+


+	

+
+		
+								
+		
									
+
+

						
+






+							
+
+					
+
+

+				
+

			
	
+
+	
+
+

+	



					

+
+
+
+
	

+				
+	
+	

+


+	
+
+	


	


+


+		
+
+			

	


	
+



+	
	











+
+
+
+
+
		

	


+	
+



+	

	

+
				
+
+	
+




+	
+
+			

		
+			
+

+
+	
		

		

+
	
+


	3
	




+
+
+
+					





+				


!*%5F9.012223332111/-+*)'&!
+	
/=>>>==>>>==>>==>>>>????>???>=:60&				
0<?>=========<<<<<<=<<<<<<<<<<==>>??=5%
								*<>>==========<<<<<<<<<<<;;<<=<<<<<<===>>:.


		
														5?>>>>=========>>==<<<<<<==<===<=<===<<==<=>=6*
*9		
+
+
+							
+
		
+
+											
!;>===>==>======<<=====<<;;<<======<=========<<==<;4AG,



+







	
+							
+
+																		
+

'=>==>>>>>===========>>>>=<;<=======>=====>==<=======>=82.($"##'*-1204387/.,*&#

	
+
+
+		
+
+
+									
+
+									
+

+.>>===>>>>====>>>>>>>>>>>>>>==>==========>>>====>=<<<=====>>====>>>>>>>???>?>>>=<;72+$
+			
+	
+
+
+
+
+
+
+
+
+
+
+



+
+
+
+
+
+		
+
+
$7?>=>>>==>>>>>?>>>>>>???>>??@?>>>>>=========<====<<<<<<====<====>===<<<<=<<<==<<===>>?>





+


+
+
+
+
+

+

*7>>====>>>>====>>>>=>=>>>>>=,
#7@>>=====<<==<<<<<<<<<<<<;;<;<<<<<<=<<<<<;;;;;;;;::::;;;;<740,*)('('%$!


+

$,15;=<;<<<<<<<=<<<===<==========#	+========<;<;;;;;;;;<<<<;;;;:;<<==<<<<<<<<<<<;;;;:;;;::;;;;;;;;;:::98752+$
$'+0479;;;:99:::;<<;;<<<<<<<<<=<<===<>0
		
4?=>=====<;<<<;;;<;;;;<;;;::;=======<<<=<<<<<<;;;::;;;;;9999::;:::::::;:878:::::::99999:::::;;;<;;;;;;;<<<<<<<==?"				$?=>=======<<<;;;<<<;<<<;;9:CRTG=<===<=<<<<<;;;;;;;;;;;<9::99899::::::;;<<;;;;:;;;:::::;;;;;;;;:999:;::<=====<==?
				
?=>>=====<<<;:;;;;<;;:;;98=RgutcH;<<<<<<<;;;;;;:;;;<<<<;;:::::::::::;;;;;;;;;;<<;;:::;;;<<;;;;::::9:<;<>==<===<>
				 >=======<<<<<<<;;;;;;;;;97;Yrgdow`E;<<<<;<<<;;;:;;;<<<=;;;;;;;;;::;;;<<<<<<<<<;;;;;;;;<<<<<;<<;;;;:;=<36>>==>==?			+?=>>=====;;< [...]
+7===<===:5:;;;;;;<<<<<;<<<;9:[�nKKSf}nF;<;;;<<<;<==<==<=;;;;;;<<<<=<;;<<<;;<?CDB;9;<;<===<<<<<;<==<<<<<==<<<<<=<<923/*%'<;;<<;<>(9>=<<;<<;;;;;<<<;;:;X�sVLJZ|zJ:;<;<<<<===>>>>=<;<<=<;<<;;;<=<;:=ER_d_R<9;;;<<=<<<<<<<<===<<;;<<<<;;;;;;<==>==<<:::8;;<1(:<<;;;<<<<;;;;:;<<<=;Lv�xc]q�l>79:;<<<<<<<<==<;:;;<<<<<<<;;:9>QepuuwqO89::;<<;;;;<<<<<<<<<<:;<<;<<<<<;;;<<==<<<:::9<<;<=<<=======<<<<;<<;:;<;9A]z�}waD9::;;;;<<=>====<;;;:;;;;;;<;<Omwqhej~n at 9:;;;;;;;;<<<====>>>>18=>=========>8.0;===>==<==== [...]
+
+
%3<??==<==>=<<==<===<<=>====<<=<<==<<<====<<<<<<<=<<===<<======<<=<<<====<===<<=====<===========<==<<<<<===>>>?>
	
(5;??========<<<==>=======<<<<<<=>====<<;<=<===>?>>===<<<<=====<==<<========<=====<<==<<===<<===>>???@?@?=<;:


"5>>===<===<<=<<<<===<===========<<<<====>>>>>???>=====<<=<==<<==<<=<=<====<<<======>>>>?????>><:70'# 	
+
+



&<?>?>=<=;<;;<=;;<=<<<===<<<=<<<=>>==>>>???;<>>>?>><<=<<==;=<<=>=<==<=<=<>>>>??@?>???@>;;92-%

+
+


			 [...]
+


+		 [...]
+	
+
+			
+
+	
+	
	
+			

+
+	
+
+	

									

+
+
	
+

		
+
+			
+						


+		
+	
																						
+
+
+				

+		
+
+
+	
+
+
+
+									


+			
+

+	


		
	


		
+
+
+			
+
+		

	


+
+




+
+	


+

+
+		
+	
+
+
+
+
+

		
+
+	
+

+	



+
			
		

+			
+	
+


+	

	


+


+	






							
+

			

	

				
+

			

	

+			
+			
+


+		
		
+
+

			
+			

	
+



		
+

	
	
!4	



+
+
+
+							


+
+


		
!&&9E4.011223222111/,+++*($ 
						
-==>=<>>>>>>==>>>>>>>>>>>>>?>><:4+
				
+
+					
+*:?==>====<<<==<<<<<<<<<<<<<<<<<==>?>:0!
			
+																%9>>>>=========<<<<=<<<<;;<<<<<<<<<<<===>>9.!

++		
+																		
+
+		2?>>=>>>========>==<<<<=<=======<<<====<<===>>91'&4J0
+





+									
+
+												
+

+
9?>==>>=>>============<<<<=====>==============<=>>=>@7+%!!""&*,./123354/+(% 

	
+
+
+
+
+
+	
+			
+
+
+
+			
+
										
+
+
+)>>=>=>>=>>==>=>=====>>>>=<;=====================<<<======<;<<=>>>>>>>?>???>>>=:73.%
	
+								
+
+
+
+

+
+
+



+
+

+
+
+
+
+	
+
"6?>=>>>>>>>>>>>?>>>=>??>>>>==>>==================<<<<<==<<<==>>====<===<========>????<





+

+




*7>>===>>>>>>>>>>>>>=>>>>>===>>=>=====<===<<<<<;<<<<<<<;<<<<<<<<<<<<<;<<;<<<;;;;;;:;:;<<<10-+*))++*)(%#
!(-15:=<;;;;<<<<<<<<<=<;<<;<<<<<<=912;=<<<<<<<;;;;;::;;:;;;;;;;;;:;<<;<<<<<;;<<<;;;;;;;;::::::;;;;::;;:::998752-'%(*-03579:::9889::;;:;;;;;;;:;;;<<;<<<<>5
4><==<<<<;:;;;;:;;;;;;;<;;::;<<===<<<<<=<<<;<;<<<;;;;;;<;99::::99999:::::::9:;;;::9999878999:;;;;;;;<;;;<<<<<<===>;<=>======<;<<<;;;<<<<<;;;9>HRNA<<===<<<<<;;;;;;;;;;;;;<<:::9:::::::9999::;;;;;;;;;;;:989::::;;; [...]
+
,7?@?====<======<<<======>=<<<=========<;;;<=<<=>>===<<<<<<>=<==<<<<<=<<<<<<====<<==<<====<<<<<===<=<===>?????

!+0;>>>==<<<<<<====<=======>=======<<<<<<=====>??>>====<<;<=<======<=<===<=>=<<<<<<<=<====>>>>>>??@@?>:9520/





1??>==>=<<<<;;;<=<=<===<<=<<<<<=<<=>>>==???>>?>==>==<<==<;;<<<<<<<====<>><==?>>>>????@>??>>><:72.'

		 [...]
+
+		



				

+
+
		
+	 [...]
+			
+	
+
+
		
+

+
+	
	
+

			

+						
+		
+	
+		
+
+


+
+
+	
+
+	
+		
+		
+			
+
+		
+			
+	
+			
+		
										
+
+




+								

	
+			
+								
		

+
+
+				
+
+
+	

+
+
+

+					


+	

+


	
+
		


	

+
+	
+
+

+
+
+		
		
+

+			
	


+


	
+

+

	


+


	
+	
+

+	

+					

	


			
+
+


+	
+
+

		
+

+
+
+	







					
+	
+





	



+	
+
+
+






+		

	

		
									

	
+										




+


	
+


+

+

	



*1	
+
+
+
+
+			
+
+			


+




+				$(?D1.0122232222210.....,)% 
									
+
+		+>>>==>>>==>>>>>>>>>>>>>>>>>??><81'
+										
+
+	&8>============<<<<<;=<<<<<<=<<<==>??=9/#

+
+	
														
+

	
!7?>=>====>====<<<<<<<=<;<<<<<<<<========>>:4*
%G/







						
+								
+									
+

	0>?==>>==>>>====>==<<<======>>=============<=>>=87<D7$ $)+-/111220.-)%!

	
+					
+	
+
+
+
+		
+
+
+

+	
+
		
+	
+
+
+
+
+
+	
+
+":?>>>>>>>>>>==>>>>====<<<=====>>==============<==>=>=<<;;;<<=>>>>????>>>>?=<:73/( 
+


+
+	
+
+
+
+
+
+
+
+
+








+

+
+
+

+
+
+
 3>?=>==>>>>>>>>>>>>>>>>>=<;;====<=======<=====<=<<<<<=<=<===>>>=<==<===<====>>????@>;




)6=?=>>>>>>>>=>>>>>====>>=>>=;;====<<<<==<==<<=====<<<<<<=<<<<===<<<<<<<<<<<<<<<<<<<<<==-,+*))+,--.,+(&"

 "$(,/04:=<;;;;<<<<<<<<<<==<<<<<<<<;<==<<<<<<;;;;;;;<;<;;;;;;;;;;:;;<<;<<;;<<<;<;;<;<;;;;;;::::::::::::::::::998640./13566799::89988999:::::::::::::;:;;;;:<>=<><<<<<;;;;;:;;::;::::;;;;;::::<<<<<<<<<;<<<<<<;;;;;:::::;;999999::999999:9::::;:::::9987898899:;::::::;;:::;;;;;;;;;;0"%*<=;<=<<<8:;;;;;:;;;;;;<<;;?GJA<<<=<<<<<<<;;;;;;;;;;;;;;;;::999:999:::::::;;;;;;;:::::9::9:: [...]
+
	$@==>===;<<;;<<;::;;;;;:9<QgqlZG<;<<;;;;;;;;;;;;<<;;;:;;<::::::::::::;;:;;;;;;;<<<<<<;;:::;;;;;;:9::;<;;<==<<<<<<>0
+
6><=<=====<;<98;:::::::89Xma]lpeL=<=<=<;;;;;;;;<;;::;;<<;::;;<;;;:;;;;;;<<<<<====<<<<;::;;<<<<<;9:::;<;;===<<=<<>$(@<=====<=<;;99;;<<;;;;:9KxkLLUgwkM<<<<;;<<<<<<<<;:;<<=<;;:;:;;;;;;<<<;;<<<<<;<>ACB>;;:;<<<<<<<;;;;:;<=<=>======?
$A<<<<<<<<;;<==<;;;;;;;;;;]�lKHLVp{^>;<<=<<<<;<<7:;<<<=<<;<<;;;;;<;:;<<;<<<;:AO]ee]I:9:;;<<<<<<::;;:;=<<48>>>=<=<#A<<==<<<;:;;;<<;;<<;;<<;:<YyaTNWb}c=;;;;;<<==;/:<<====<<<<<<;;;;;;;;;;;:;DXlwxuxmJ9:;<<;;;;;::==<<<==: -=====>7		
+	'?<=<==>>=<<=<<;;;;;;;;:;;<:Fd{}wwgu}P8:;<===<<;8=====<<;;<;:;;;;::;;;;;:D^sunlbo�\;9;;;<;;;<<<<<===<<==<=>=<<=>7	
+		
+/?=;;>>>'2?==>=<<<<;;;;<<<;<<<F]s�{lQ<;<<===<<<<<<=====<<=<<;:;<;;;<<;:QrteXTXd�g>:;:;;;;<<<<===<;<<;:;<<<<<<<=:'$'#"$:>=<;>=:
/=<<==<99:=====<==>>>=>CMXYL@;<<==>>>=<====>>==<;<==<;;::::99;]}iXRNQk�i?;;;<;;<<<<<<<<<<9<==<<=<<;;<<;<<<===<<=<<<<<==<==<=;9;;<====>=<<<===>>>>>>=;<<<=<<=====>=>>>>@<<<<====<<:::;X�r^VNQp�c?<=<<<<<<=<<<<<<<<<:44=======<=<;<<<::<<<<<<===<===>87=>>>==<======>>>>>>??>>>>>>=<<=<==<>>>?>BQ<<<;;:::;<<;:Ilyqf`czY=<<=<<<<<<<==<====<==21?>=====>=>>><,
*;>>=====<;;<3 [...]
+

&19=@@?==>=<<=====<<=<<<==<<==<=====<=<<<;<====<<<<<<<<<<<<<<====<=<<<<<<<<==<<<=<<<<<===<<<<=<==<=<<<<<==<===<<<<<<

+
+

(4<???><<====<<=======>=<<====<====<<==<<=<<<<=<<====<<<<<<==>====<<<<<<<<<<<====<<<<<<=<<<<;<<<<<<<<<<;<===<===


!/9;>>>==<<<======<<===<<==>======<<=<<<<<<<<<==>>>=<<<<<<<<====<<<==<<<==<<<<==<<<<;<<<<========>=>>>>?>??>=
	
)9>>>>====<<<<=<<=<=>==<<<===<==<<;<<>==>?>==>?@?=;;<=>><;<;<===<<<=<<;<<<<<<<====>>???>>>>>?>??@??=;5,'$			 [...]
+				
+			
+
+

+	
					
+		
+
+	
	 [...]
+
+
+	
+
+
+


				

+	
+
+		
			

			
+
+			
+	
+
+		


+				
+


+	


+		
+
+
			
+
+
				
+
+	

											
+
+					
+





	
+
+	
+
+
+

	
				
+	
+
+		
					

	
+				

		

+
	
			
+
		

+

+

+


+

	


		
+		

+

+


+	




+

+	

+
+


+


	
+
	
+
+
+

			




	
+

+	
+			
		


+		



+	

		

	






+
+
+	
+
+


+







+
+
+


+

+



+					
+
+	


	


+	
+				
+	
+				

+
+
	
+
+



				

+


+
+2,
+	
+
+
+
+
+
+
+

+
+


+
+			
+		
+







							 #)@?./1223333344332010110-*& 							
+				
+		*>=>==>>?>>=>>=>>>>>>>>>>>>>>??>;6/%
			
																						
+
+
	#6=>>========<==<<<<<<<<<<==<<<<<==>>?=8/%

+5!	
+
+

+
+
+








		
+			
+	
+												
+		
+

	
!7??>>>========<<=<<<<<<<=====<<=========>?>=7/'&2J9 #&(*)*))('%
					
+
+
+			

+	
+
+
+
+		
+
+
+
+
+
+
+
+
+

2>>>>>?>>>>>===>>=>>=======>===>>====>>=====<==>?>>><9789:<=>??????@??>?=:73-("
				
+
+
+
+

+
+
+
+
+
+
+







+





+

+
+
*<@>>>>>>>>>>>>>>=>==<=========>========<<<<<<<<<<<<=<<<=>=======<=<=<==>>>>>?@??=93













#1<?==>=>>>>>>>>=========<;;;;==<<<<==<<=<<<<<<=<<<<<<<<<===<==<<<<=<<<<<=<<<<<<====>>?###$$$%')+++*'# 

!""#&)+.18<=<;;;<<<<<<<<=<<<<<<<<=<<<;::;<;<<<;<<;<<<<<=<<<<<<<;;<===<=<<<<=<<<<<;<;;;<<;;;;;;;:;:::::::;:;:9::9864124689::::;;9;;999::::;;::;::9:;;;;;;;<;;;;::<<;;:::;;;;;<;;;;;;;;;:;;;;;=<<<<<<<<;<<;;;;<;;;;;::9;;:::999::::99:999:::;;;;;::::99::8998899::::::::::9;::::;;;:;;;;<=<<<<<<<;;:;;;::;;;::;;;;;;=><<<==<<<<<<;;<<;:;;;;;;:;<;;:9:99899:::::::9:::::;;;<;;;;::::99999 [...]
+)=<====<9;;;;<;:::::;:;7;drekndN>:;<;;;;;::;<<<<<<;;:;<<<;::::;;;;:;:;;;;<;;<<====><==<;9::;;<<<<31;;<<<;=====<<<>6
9=========<;<99;;;;;;;99]zZOTcpmXA<==<<<<<;<;;;;;;::<<;<;;;;:;:;<<;<;<<<;;<<=====?AA?<;;==<<;<<:679:;;;:;<<<<<;;?'	0A<<<===<<;;;9:<<<<<<;;:BrzTDCNbvqN;;;;<<<<<=<=<=<:;<<<=<<<<;;;;::::;<<<=<===<<AO`icO;9:;;<<<;<9:;;::<<<<=>>>==<?			"?====<<<;;;<=<;;;::;;;<:Er�eONVRiyQ:;<<=====<;<=<:<<==>;<=;;<;;;:99:::;;;::BRanuuu|_:8:;;;;<<:89:;;;=<<94<=====9
+			
>=<===>=<<<<;<;<;<;;;<<;;@\x|w{i]vyE9;<;<<<<==>=<=<====<<<<<<<<<;;;;;;;:9AZotti\Yu{L:;;;;;;;;<;:<=<=>>>,"<>=<<>1
				
+><===>>><<<<>=<;;;;;;;<;;;:@Ri{��pK9<;<==<<<<<<<===>=<====<<;<<;;;;;<<9Mqte\WVZx|N:;;<<<;;;;;;<<=<;<<<:;=<<<<?*					&B=<=>>;-;==<==<;<=<=<=====>=>?GS\ZK?<==>>?>===>>=>==><=<<<<<<<<;;;;:;;:Ryo`RKNi�tI;<<<<<;;<<<<<====<;;=>>===>>@2/@>====37=<<==;<<===>>>==>??@?>>>>=<<===>===>====>>>???>>==<<<<<<<;:99Iz|eaT[u�g@:<<;;;<<<========>>=<===>>==<=<4157521:>=<<===<>=<=92:>>>>=====>===>=;>??>>>==<==<====<===>>>B;<<;<<;;<<;;;:;Tuywv�wT=<=<<<;<<<=<=====>>9/8?>===<<==<;<=>==>=<<=<=====<= [...]
+
+

&08>@?>>===<==>====<<=======<<<<=======<<<=<<=<<<;<===<==<<<>===<<<<<;;<<==<=<<=<<<<<<===<<<<;<<=<;<<<<;<=<<<<===>
+	
+
&19==>>>>>>=<<=>======<<=========<=<<<<<<<<<<<======<<<<=<=<>>>===<<=<;;;==<<=<===<;<<==<<<=<<<=<=<<<===>>===>

	
+
+/8@?=><<>===>=<;:><<==>==<==<=<;==;;;<><<=>=>?@?>==<;<=>=;<===?><<===<;;=<<==<<=<<=<=??>>>?>?==>=>>?>>@@><
\ No newline at end of file
diff --git a/data/pdb.pdb b/data/pdb.pdb
new file mode 100644
index 0000000..4cf3e1f
--- /dev/null
+++ b/data/pdb.pdb
@@ -0,0 +1,3025 @@
+HEADER    LYASE                                   23-MAR-06   2DH6              
+TITLE     CRYSTAL STRUCTURE OF E. COLI APO-TRPB                                 
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: TRYPTOPHAN SYNTHASE BETA SUBUNIT;                          
+COMPND   3 CHAIN: A;                                                            
+COMPND   4 SYNONYM: TRYPTOPHAN SYNTHASE BETA-CHAIN;                             
+COMPND   5 EC: 4.2.1.20;                                                        
+COMPND   6 ENGINEERED: YES                                                      
+SOURCE    MOL_ID: 1;                                                            
+SOURCE   2 ORGANISM_SCIENTIFIC: ESCHERICHIA COLI;                               
+SOURCE   3 ORGANISM_COMMON: BACTERIA;                                           
+SOURCE   4 EXPRESSION_SYSTEM: ESCHERICHIA COLI;                                 
+SOURCE   5 EXPRESSION_SYSTEM_COMMON: BACTERIA;                                  
+SOURCE   6 EXPRESSION_SYSTEM_STRAIN: CB149;                                     
+SOURCE   7 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID;                              
+SOURCE   8 EXPRESSION_SYSTEM_PLASMID: PSTECOTB                                  
+KEYWDS    TRYPTOPHAN SYNTHASE, BETA-CHAIN, PLP                                  
+EXPDTA    X-RAY DIFFRACTION                                                     
+AUTHOR    K.NISHIO,Y.MORIMOTO,K.OGASAHARA,N.YASUOKA,K.YUTANI,                   
+AUTHOR   2 T.TSUKIHARA                                                          
+REVDAT   1   24-APR-07 2DH6    0                                                
+JRNL        AUTH   K.NISHIO,Y.MORIMOTO,K.OGASAHARA,N.YASUOKA,K.YUTANI,          
+JRNL        AUTH 2 T.TSUKIHARA                                                  
+JRNL        TITL   CRYSTAL STRUCTURE OF TRYPTOPHAN SYNTHASE                     
+JRNL        TITL 2 BETA-SUBUNIT FROM ESCHERICHIA COLI                           
+JRNL        REF    TO BE PUBLISHED                                              
+JRNL        REFN                                                                
+REMARK   1                                                                      
+REMARK   2                                                                      
+REMARK   2 RESOLUTION. 3.00 ANGSTROMS.                                          
+REMARK   3                                                                      
+REMARK   3 REFINEMENT.                                                          
+REMARK   3   PROGRAM     : CNS 1.1                                              
+REMARK   3   AUTHORS     : BRUNGER,ADAMS,CLORE,DELANO,GROS,GROSSE-              
+REMARK   3               : KUNSTLEVE,JIANG,KUSZEWSKI,NILGES, PANNU,             
+REMARK   3               : READ,RICE,SIMONSON,WARREN                            
+REMARK   3                                                                      
+REMARK   3  REFINEMENT TARGET : NULL                                            
+REMARK   3                                                                      
+REMARK   3  DATA USED IN REFINEMENT.                                            
+REMARK   3   RESOLUTION RANGE HIGH (ANGSTROMS) : 3.00                           
+REMARK   3   RESOLUTION RANGE LOW  (ANGSTROMS) : 42.82                          
+REMARK   3   DATA CUTOFF            (SIGMA(F)) : 0.000                          
+REMARK   3   DATA CUTOFF HIGH         (ABS(F)) : 1425358.900                    
+REMARK   3   DATA CUTOFF LOW          (ABS(F)) : 0.0000                         
+REMARK   3   COMPLETENESS (WORKING+TEST)   (%) : 99.6                           
+REMARK   3   NUMBER OF REFLECTIONS             : 13244                          
+REMARK   3                                                                      
+REMARK   3  FIT TO DATA USED IN REFINEMENT.                                     
+REMARK   3   CROSS-VALIDATION METHOD          : THROUGHOUT                      
+REMARK   3   FREE R VALUE TEST SET SELECTION  : RANDOM                          
+REMARK   3   R VALUE            (WORKING SET) : 0.206                           
+REMARK   3   FREE R VALUE                     : 0.254                           
+REMARK   3   FREE R VALUE TEST SET SIZE   (%) : 5.000                           
+REMARK   3   FREE R VALUE TEST SET COUNT      : 659                             
+REMARK   3   ESTIMATED ERROR OF FREE R VALUE  : 0.010                           
+REMARK   3                                                                      
+REMARK   3  FIT IN THE HIGHEST RESOLUTION BIN.                                  
+REMARK   3   TOTAL NUMBER OF BINS USED           : 6                            
+REMARK   3   BIN RESOLUTION RANGE HIGH       (A) : 3.00                         
+REMARK   3   BIN RESOLUTION RANGE LOW        (A) : 3.19                         
+REMARK   3   BIN COMPLETENESS (WORKING+TEST) (%) : 100.00                       
+REMARK   3   REFLECTIONS IN BIN    (WORKING SET) : 2072                         
+REMARK   3   BIN R VALUE           (WORKING SET) : 0.3140                       
+REMARK   3   BIN FREE R VALUE                    : 0.3610                       
+REMARK   3   BIN FREE R VALUE TEST SET SIZE  (%) : 4.00                         
+REMARK   3   BIN FREE R VALUE TEST SET COUNT     : 87                           
+REMARK   3   ESTIMATED ERROR OF BIN FREE R VALUE : 0.039                        
+REMARK   3                                                                      
+REMARK   3  NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.                    
+REMARK   3   PROTEIN ATOMS            : 2514                                    
+REMARK   3   NUCLEIC ACID ATOMS       : 0                                       
+REMARK   3   HETEROGEN ATOMS          : 15                                      
+REMARK   3   SOLVENT ATOMS            : 23                                      
+REMARK   3                                                                      
+REMARK   3  B VALUES.                                                           
+REMARK   3   FROM WILSON PLOT           (A**2) : 85.41                          
+REMARK   3   MEAN B VALUE      (OVERALL, A**2) : 62.30                          
+REMARK   3   OVERALL ANISOTROPIC B VALUE.                                       
+REMARK   3    B11 (A**2) : -0.80000                                             
+REMARK   3    B22 (A**2) : -0.80000                                             
+REMARK   3    B33 (A**2) : 1.61000                                              
+REMARK   3    B12 (A**2) : 0.00000                                              
+REMARK   3    B13 (A**2) : 0.00000                                              
+REMARK   3    B23 (A**2) : 0.00000                                              
+REMARK   3                                                                      
+REMARK   3  ESTIMATED COORDINATE ERROR.                                         
+REMARK   3   ESD FROM LUZZATI PLOT        (A) : 0.32                            
+REMARK   3   ESD FROM SIGMAA              (A) : 0.44                            
+REMARK   3   LOW RESOLUTION CUTOFF        (A) : 5.00                            
+REMARK   3                                                                      
+REMARK   3  CROSS-VALIDATED ESTIMATED COORDINATE ERROR.                         
+REMARK   3   ESD FROM C-V LUZZATI PLOT    (A) : 0.41                            
+REMARK   3   ESD FROM C-V SIGMAA          (A) : 0.55                            
+REMARK   3                                                                      
+REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES.                                   
+REMARK   3   BOND LENGTHS                 (A) : 0.012                           
+REMARK   3   BOND ANGLES            (DEGREES) : 1.70                            
+REMARK   3   DIHEDRAL ANGLES        (DEGREES) : 22.80                           
+REMARK   3   IMPROPER ANGLES        (DEGREES) : 0.98                            
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL MODEL : RESTRAINED                                
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL FACTOR RESTRAINTS.    RMS    SIGMA                
+REMARK   3   MAIN-CHAIN BOND              (A**2) : 1.800 ; 1.500                
+REMARK   3   MAIN-CHAIN ANGLE             (A**2) : 3.030 ; 2.000                
+REMARK   3   SIDE-CHAIN BOND              (A**2) : 3.050 ; 2.000                
+REMARK   3   SIDE-CHAIN ANGLE             (A**2) : 4.620 ; 2.500                
+REMARK   3                                                                      
+REMARK   3  BULK SOLVENT MODELING.                                              
+REMARK   3   METHOD USED : FLAT MODEL                                           
+REMARK   3   KSOL        : 0.38                                                 
+REMARK   3   BSOL        : 52.95                                                
+REMARK   3                                                                      
+REMARK   3  NCS MODEL : NULL                                                    
+REMARK   3                                                                      
+REMARK   3  NCS RESTRAINTS.                         RMS   SIGMA/WEIGHT          
+REMARK   3   GROUP  1  POSITIONAL            (A) : NULL  ; NULL                 
+REMARK   3   GROUP  1  B-FACTOR           (A**2) : NULL  ; NULL                 
+REMARK   3                                                                      
+REMARK   3  PARAMETER FILE  1  : PROTEIN_REP.PARAM                              
+REMARK   3  PARAMETER FILE  2  : DNA-RNA_REP.PARAM                              
+REMARK   3  PARAMETER FILE  3  : WATER_REP.PARAM                                
+REMARK   3  PARAMETER FILE  4  : ION.PARAM                                      
+REMARK   3  PARAMETER FILE  5  : LIGAND.PARAM                                   
+REMARK   3  PARAMETER FILE  6  : NULL                                           
+REMARK   3  TOPOLOGY FILE  1   : PROTEIN.TOP                                    
+REMARK   3  TOPOLOGY FILE  2   : DNA-RNA.TOP                                    
+REMARK   3  TOPOLOGY FILE  3   : WATER.TOP                                      
+REMARK   3  TOPOLOGY FILE  4   : ION.TOP                                        
+REMARK   3  TOPOLOGY FILE  5   : LIGAND.TOP                                     
+REMARK   3  TOPOLOGY FILE  6   : NULL                                           
+REMARK   3                                                                      
+REMARK   3  OTHER REFINEMENT REMARKS: NULL                                      
+REMARK   4                                                                      
+REMARK   4 2DH6 COMPLIES WITH FORMAT V. 2.3, 09-JULY-1998                       
+REMARK 100                                                                      
+REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY PDBJ ON 24-MAR-2006.                
+REMARK 100 THE RCSB ID CODE IS RCSB025414.                                      
+REMARK 200                                                                      
+REMARK 200 EXPERIMENTAL DETAILS                                                 
+REMARK 200  EXPERIMENT TYPE                : X-RAY DIFFRACTION                  
+REMARK 200  DATE OF DATA COLLECTION        : 26-OCT-2003                        
+REMARK 200  TEMPERATURE           (KELVIN) : 100.0                              
+REMARK 200  PH                             : 6.50                               
+REMARK 200  NUMBER OF CRYSTALS USED        : 2                                  
+REMARK 200                                                                      
+REMARK 200  SYNCHROTRON              (Y/N) : Y                                  
+REMARK 200  RADIATION SOURCE               : SPRING-8                           
+REMARK 200  BEAMLINE                       : BL44XU                             
+REMARK 200  X-RAY GENERATOR MODEL          : NULL                               
+REMARK 200  MONOCHROMATIC OR LAUE    (M/L) : M                                  
+REMARK 200  WAVELENGTH OR RANGE        (A) : 0.9                                
+REMARK 200  MONOCHROMATOR                  : MIRROR                             
+REMARK 200  OPTICS                         : NULL                               
+REMARK 200                                                                      
+REMARK 200  DETECTOR TYPE                  : IMAGE PLATE                        
+REMARK 200  DETECTOR MANUFACTURER          : DIP 6040                           
+REMARK 200  INTENSITY-INTEGRATION SOFTWARE : MOSFLM                             
+REMARK 200  DATA SCALING SOFTWARE          : SCALA                              
+REMARK 200                                                                      
+REMARK 200  NUMBER OF UNIQUE REFLECTIONS   : 13266                              
+REMARK 200  RESOLUTION RANGE HIGH      (A) : 3.000                              
+REMARK 200  RESOLUTION RANGE LOW       (A) : 46.410                             
+REMARK 200  REJECTION CRITERIA  (SIGMA(I)) : 6.800                              
+REMARK 200                                                                      
+REMARK 200 OVERALL.                                                             
+REMARK 200  COMPLETENESS FOR RANGE     (%) : 99.9                               
+REMARK 200  DATA REDUNDANCY                : 5.200                              
+REMARK 200  R MERGE                    (I) : 0.07400                            
+REMARK 200  R SYM                      (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR THE DATA SET  : NULL                               
+REMARK 200                                                                      
+REMARK 200 IN THE HIGHEST RESOLUTION SHELL.                                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 3.00                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE LOW  (A) : 3.16                     
+REMARK 200  COMPLETENESS FOR SHELL     (%) : 100.0                              
+REMARK 200  DATA REDUNDANCY IN SHELL       : 5.30                               
+REMARK 200  R MERGE FOR SHELL          (I) : 0.38900                            
+REMARK 200  R SYM FOR SHELL            (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR SHELL         : NULL                               
+REMARK 200                                                                      
+REMARK 200 DIFFRACTION PROTOCOL: SINGLE WAVELENGTH                              
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MOLECULAR REPLACEMENT        
+REMARK 200 SOFTWARE USED: CNS                                                   
+REMARK 200 STARTING MODEL: CHAIN B OF 1BKS                                      
+REMARK 200                                                                      
+REMARK 200 REMARK: NULL                                                         
+REMARK 280                                                                      
+REMARK 280 CRYSTAL                                                              
+REMARK 280 SOLVENT CONTENT, VS   (%): 66.29                                     
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 3.65                     
+REMARK 280                                                                      
+REMARK 280 CRYSTALLIZATION CONDITIONS: LITHIUM SULFATE, PH 6.5, VAPOR           
+REMARK 280  DIFFUSION, HANGING DROP, TEMPERATURE 288K                           
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY                                            
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 43 2 2                         
+REMARK 290                                                                      
+REMARK 290      SYMOP   SYMMETRY                                                
+REMARK 290     NNNMMM   OPERATOR                                                
+REMARK 290       1555   X,Y,Z                                                   
+REMARK 290       2555   -X,-Y,1/2+Z                                             
+REMARK 290       3555   -Y,X,3/4+Z                                              
+REMARK 290       4555   Y,-X,1/4+Z                                              
+REMARK 290       5555   -X,Y,-Z                                                 
+REMARK 290       6555   X,-Y,1/2-Z                                              
+REMARK 290       7555   Y,X,1/4-Z                                               
+REMARK 290       8555   -Y,-X,3/4-Z                                             
+REMARK 290                                                                      
+REMARK 290     WHERE NNN -> OPERATOR NUMBER                                     
+REMARK 290           MMM -> TRANSLATION VECTOR                                  
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS                            
+REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM             
+REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY                
+REMARK 290 RELATED MOLECULES.                                                   
+REMARK 290   SMTRY1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 290   SMTRY1   2 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   2  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   2  0.000000  0.000000  1.000000       51.10650            
+REMARK 290   SMTRY1   3  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   3  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   3  0.000000  0.000000  1.000000       76.65975            
+REMARK 290   SMTRY1   4  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   4 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   4  0.000000  0.000000  1.000000       25.55325            
+REMARK 290   SMTRY1   5 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   5  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   5  0.000000  0.000000 -1.000000        0.00000            
+REMARK 290   SMTRY1   6  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   6  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   6  0.000000  0.000000 -1.000000       51.10650            
+REMARK 290   SMTRY1   7  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   7  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   7  0.000000  0.000000 -1.000000       25.55325            
+REMARK 290   SMTRY1   8  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   8 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   8  0.000000  0.000000 -1.000000       76.65975            
+REMARK 290                                                                      
+REMARK 290 REMARK: NULL                                                         
+REMARK 300                                                                      
+REMARK 300 BIOMOLECULE: 1                                                       
+REMARK 300 THIS ENTRY CONTAINS THE CRYSTALLOGRAPHIC ASYMMETRIC UNIT             
+REMARK 300 WHICH CONSISTS OF 1 CHAIN(S). SEE REMARK 350 FOR                     
+REMARK 300 INFORMATION ON GENERATING THE BIOLOGICAL MOLECULE(S).                
+REMARK 350                                                                      
+REMARK 350 GENERATING THE BIOMOLECULE                                           
+REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN           
+REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE                
+REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS          
+REMARK 350 GIVEN BELOW.  BOTH NON-CRYSTALLOGRAPHIC AND                          
+REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN.                               
+REMARK 350                                                                      
+REMARK 350 BIOMOLECULE: 1                                                       
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: A                                     
+REMARK 350   BIOMT1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 350   BIOMT2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 350   BIOMT3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 350   BIOMT1   2 -1.000000  0.000000  0.000000      110.88600            
+REMARK 350   BIOMT2   2  0.000000  1.000000  0.000000        0.00000            
+REMARK 350   BIOMT3   2  0.000000  0.000000 -1.000000        0.00000            
+REMARK 465                                                                      
+REMARK 465 MISSING RESIDUES                                                     
+REMARK 465 THE FOLLOWING RESIDUES WERE NOT LOCATED IN THE                       
+REMARK 465 EXPERIMENT. (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 465 IDENTIFIER; SSSEQ=SEQUENCE NUMBER; I=INSERTION CODE.)                
+REMARK 465                                                                      
+REMARK 465   M RES C SSSEQI                                                     
+REMARK 465     MET A     1                                                      
+REMARK 465     THR A     2                                                      
+REMARK 465     THR A     3                                                      
+REMARK 465     LEU A     4                                                      
+REMARK 465     LEU A     5                                                      
+REMARK 465     ASN A     6                                                      
+REMARK 465     PRO A     7                                                      
+REMARK 465     TYR A     8                                                      
+REMARK 465     PHE A     9                                                      
+REMARK 465     GLY A    10                                                      
+REMARK 465     GLU A    11                                                      
+REMARK 465     PHE A    12                                                      
+REMARK 465     GLY A    13                                                      
+REMARK 465     GLY A    14                                                      
+REMARK 465     MET A    15                                                      
+REMARK 465     TYR A    16                                                      
+REMARK 465     GLY A   259                                                      
+REMARK 465     HIS A   260                                                      
+REMARK 465     GLY A   261                                                      
+REMARK 465     ILE A   262                                                      
+REMARK 465     GLU A   263                                                      
+REMARK 465     THR A   264                                                      
+REMARK 465     GLY A   265                                                      
+REMARK 465     GLU A   266                                                      
+REMARK 465     HIS A   267                                                      
+REMARK 465     GLY A   268                                                      
+REMARK 465     ALA A   269                                                      
+REMARK 465     PRO A   270                                                      
+REMARK 465     LEU A   271                                                      
+REMARK 465     LYS A   272                                                      
+REMARK 465     HIS A   273                                                      
+REMARK 465     GLY A   274                                                      
+REMARK 465     ARG A   275                                                      
+REMARK 465     VAL A   276                                                      
+REMARK 465     GLY A   277                                                      
+REMARK 465     ILE A   278                                                      
+REMARK 465     TYR A   279                                                      
+REMARK 465     PHE A   280                                                      
+REMARK 465     GLY A   281                                                      
+REMARK 465     MET A   282                                                      
+REMARK 465     LYS A   283                                                      
+REMARK 465     ALA A   284                                                      
+REMARK 465     PRO A   285                                                      
+REMARK 465     MET A   286                                                      
+REMARK 465     MET A   287                                                      
+REMARK 465     GLN A   288                                                      
+REMARK 465     THR A   289                                                      
+REMARK 465     GLU A   290                                                      
+REMARK 465     ASP A   291                                                      
+REMARK 465     GLY A   292                                                      
+REMARK 465     GLN A   293                                                      
+REMARK 465     ILE A   294                                                      
+REMARK 465     GLU A   295                                                      
+REMARK 465     GLU A   296                                                      
+REMARK 465     SER A   297                                                      
+REMARK 465     TYR A   298                                                      
+REMARK 465     SER A   299                                                      
+REMARK 465     ILE A   300                                                      
+REMARK 465     SER A   301                                                      
+REMARK 465     ALA A   302                                                      
+REMARK 465     GLY A   303                                                      
+REMARK 465     LEU A   304                                                      
+REMARK 465     ASP A   305                                                      
+REMARK 465     PHE A   306                                                      
+REMARK 465     PRO A   307                                                      
+REMARK 465     SER A   308                                                      
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND LENGTHS                                      
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,2(A3,1X,A1,I4,A1,1X,A4,3X),F6.3)                  
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES: ENGH AND HUBER, 1991                                
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   RES CSSEQI ATM2   DEVIATION                     
+REMARK 500    MET A  22   SD    MET A  22   CE     0.078                        
+REMARK 500    MET A 362   SD    MET A 362   CE     0.073                        
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND ANGLES                                       
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1)              
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES: ENGH AND HUBER, 1991                                
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   ATM2   ATM3                                     
+REMARK 500    PRO A  56   C   -  N   -  CA  ANGL. DEV. = 10.2 DEGREES           
+REMARK 500    LEU A  59   N   -  CA  -  C   ANGL. DEV. =-10.1 DEGREES           
+REMARK 500    THR A  72   N   -  CA  -  C   ANGL. DEV. =-10.8 DEGREES           
+REMARK 500    GLY A 378   N   -  CA  -  C   ANGL. DEV. = 16.7 DEGREES           
+REMARK 900                                                                      
+REMARK 900 RELATED ENTRIES                                                      
+REMARK 900 RELATED ID: 2DH5   RELATED DB: PDB                                   
+REMARK 900 HOLO-TRPB                                                            
+REMARK 999                                                                      
+REMARK 999 SEQUENCE                                                             
+REMARK 999 X (143) OF SEQUENCE DATABASE REFERENCE STANDS                        
+REMARK 999 FOR ANY RESIDUE, AND THE AUTHOR USED SER.                            
+DBREF  2DH6 A    1   397  GB     924784   AAA73808         1    397             
+SEQADV 2DH6 SER A  143  GB   924784      X   143 SEE REMARK 999                 
+SEQRES   1 A  397  MET THR THR LEU LEU ASN PRO TYR PHE GLY GLU PHE GLY          
+SEQRES   2 A  397  GLY MET TYR VAL PRO GLN ILE LEU MET PRO ALA LEU ARG          
+SEQRES   3 A  397  GLN LEU GLU GLU ALA PHE VAL SER ALA GLN LYS ASP PRO          
+SEQRES   4 A  397  GLU PHE GLN ALA GLN PHE ASN ASP LEU LEU LYS ASN TYR          
+SEQRES   5 A  397  ALA GLY ARG PRO THR ALA LEU THR LYS CYS GLN ASN ILE          
+SEQRES   6 A  397  THR ALA GLY THR ASN THR THR LEU TYR LEU LYS ARG GLU          
+SEQRES   7 A  397  ASP LEU LEU HIS GLY GLY ALA HIS LYS THR ASN GLN VAL          
+SEQRES   8 A  397  LEU GLY GLN ALA LEU LEU ALA LYS ARG MET GLY LYS THR          
+SEQRES   9 A  397  GLU ILE ILE ALA GLU THR GLY ALA GLY GLN HIS GLY VAL          
+SEQRES  10 A  397  ALA SER ALA LEU ALA SER ALA LEU LEU GLY LEU LYS CYS          
+SEQRES  11 A  397  ARG ILE TYR MET GLY ALA LYS ASP VAL GLU ARG GLN SER          
+SEQRES  12 A  397  PRO ASN VAL PHE ARG MET ARG LEU MET GLY ALA GLU VAL          
+SEQRES  13 A  397  ILE PRO VAL HIS SER GLY SER ALA THR LEU LYS ASP ALA          
+SEQRES  14 A  397  CYS ASN GLU ALA LEU ARG ASP TRP SER GLY SER TYR GLU          
+SEQRES  15 A  397  THR ALA HIS TYR MET LEU GLY THR ALA ALA GLY PRO HIS          
+SEQRES  16 A  397  PRO TYR PRO THR ILE VAL ARG GLU PHE GLN ARG MET ILE          
+SEQRES  17 A  397  GLY GLU GLU THR LYS ALA GLN ILE LEU GLU ARG GLU GLY          
+SEQRES  18 A  397  ARG LEU PRO ASP ALA VAL ILE ALA CYS VAL GLY GLY GLY          
+SEQRES  19 A  397  SER ASN ALA ILE GLY MET PHE ALA ASP PHE ILE ASN GLU          
+SEQRES  20 A  397  THR ASN VAL GLY LEU ILE GLY VAL GLU PRO GLY GLY HIS          
+SEQRES  21 A  397  GLY ILE GLU THR GLY GLU HIS GLY ALA PRO LEU LYS HIS          
+SEQRES  22 A  397  GLY ARG VAL GLY ILE TYR PHE GLY MET LYS ALA PRO MET          
+SEQRES  23 A  397  MET GLN THR GLU ASP GLY GLN ILE GLU GLU SER TYR SER          
+SEQRES  24 A  397  ILE SER ALA GLY LEU ASP PHE PRO SER VAL GLY PRO GLN          
+SEQRES  25 A  397  HIS ALA TYR LEU ASN SER THR GLY ARG ALA ASP TYR VAL          
+SEQRES  26 A  397  SER ILE THR ASP ASP GLU ALA LEU GLU ALA PHE LYS THR          
+SEQRES  27 A  397  LEU CYS LEU HIS GLU GLY ILE ILE PRO ALA LEU GLU SER          
+SEQRES  28 A  397  SER HIS ALA LEU ALA HIS ALA LEU LYS MET MET ARG GLU          
+SEQRES  29 A  397  ASN PRO ASP LYS GLU GLN LEU LEU VAL VAL ASN LEU SER          
+SEQRES  30 A  397  GLY ARG GLY ASP LYS ASP ILE PHE THR VAL HIS ASP ILE          
+SEQRES  31 A  397  LEU LYS ALA ARG GLY GLU ILE                                  
+HET    SO4    801       5                                                       
+HET    SO4    802       5                                                       
+HET    SO4    803       5                                                       
+HETNAM     SO4 SULFATE ION                                                      
+FORMUL   2  SO4    3(O4 S1 2-)                                                  
+FORMUL   5  HOH   *23(H2 O1)                                                    
+HELIX    1   1 LEU A   21  LYS A   37  1                                  17    
+HELIX    2   2 ASP A   38  GLY A   54  1                                  17    
+HELIX    3   3 GLU A   78  LEU A   81  5                                   4    
+HELIX    4   4 GLY A   84  MET A  101  1                                  18    
+HELIX    5   5 GLY A  113  LEU A  126  1                                  14    
+HELIX    6   6 ALA A  136  ARG A  141  1                                   6    
+HELIX    7   7 GLN A  142  MET A  152  1                                  11    
+HELIX    8   8 THR A  165  SER A  178  1                                  14    
+HELIX    9   9 PRO A  196  PHE A  204  1                                   9    
+HELIX   10  10 ARG A  206  GLY A  221  1                                  16    
+HELIX   11  11 ASN A  236  ALA A  242  1                                   7    
+HELIX   12  12 ASP A  243  ILE A  245  5                                   3    
+HELIX   13  13 GLY A  310  THR A  319  1                                  10    
+HELIX   14  14 THR A  328  GLY A  344  1                                  17    
+HELIX   15  15 ALA A  348  ASN A  365  1                                  18    
+HELIX   16  16 ILE A  384  ARG A  394  1                                  11    
+SHEET    1   A 6 LEU A  59  CYS A  62  0                                        
+SHEET    2   A 6 THR A  72  LYS A  76 -1  O  LEU A  73   N  CYS A  62           
+SHEET    3   A 6 LEU A 371  ASN A 375  1  O  VAL A 374   N  TYR A  74           
+SHEET    4   A 6 ALA A 226  CYS A 230  1  N  ILE A 228   O  VAL A 373           
+SHEET    5   A 6 GLY A 251  PRO A 257  1  O  GLY A 251   N  VAL A 227           
+SHEET    6   A 6 ALA A 322  ILE A 327  1  O  VAL A 325   N  GLU A 256           
+SHEET    1   B 4 GLU A 155  VAL A 159  0                                        
+SHEET    2   B 4 LYS A 129  GLY A 135  1  N  ILE A 132   O  GLU A 155           
+SHEET    3   B 4 GLU A 105  THR A 110  1  N  ILE A 106   O  LYS A 129           
+SHEET    4   B 4 ALA A 184  TYR A 186  1  O  HIS A 185   N  ILE A 107           
+CISPEP   1 ARG A   55    PRO A   56          0        -0.01                     
+CISPEP   2 HIS A  195    PRO A  196          0         0.29                     
+CRYST1  110.886  110.886  102.213  90.00  90.00  90.00 P 43 2 2      8          
+ORIGX1      1.000000  0.000000  0.000000        0.00000                         
+ORIGX2      0.000000  1.000000  0.000000        0.00000                         
+ORIGX3      0.000000  0.000000  1.000000        0.00000                         
+SCALE1      0.009018  0.000000  0.000000        0.00000                         
+SCALE2      0.000000  0.009018  0.000000        0.00000                         
+SCALE3      0.000000  0.000000  0.009783        0.00000                         
+ATOM      1  N   VAL A  17      89.425  14.301 -18.452  1.00 86.84           N  
+ATOM      2  CA  VAL A  17      88.322  14.292 -19.468  1.00 86.19           C  
+ATOM      3  C   VAL A  17      88.787  13.881 -20.861  1.00 86.01           C  
+ATOM      4  O   VAL A  17      89.717  14.463 -21.413  1.00 87.98           O  
+ATOM      5  CB  VAL A  17      87.686  15.677 -19.604  1.00 84.80           C  
+ATOM      6  CG1 VAL A  17      86.685  15.677 -20.758  1.00 84.01           C  
+ATOM      7  CG2 VAL A  17      87.037  16.068 -18.302  1.00 83.68           C  
+ATOM      8  N   PRO A  18      88.147  12.872 -21.450  1.00 84.69           N  
+ATOM      9  CA  PRO A  18      88.576  12.475 -22.792  1.00 85.53           C  
+ATOM     10  C   PRO A  18      88.482  13.682 -23.731  1.00 86.56           C  
+ATOM     11  O   PRO A  18      87.465  14.378 -23.761  1.00 86.30           O  
+ATOM     12  CB  PRO A  18      87.591  11.369 -23.154  1.00 86.13           C  
+ATOM     13  CG  PRO A  18      86.366  11.713 -22.343  1.00 86.89           C  
+ATOM     14  CD  PRO A  18      86.951  12.132 -21.023  1.00 84.68           C  
+ATOM     15  N   GLN A  19      89.550  13.928 -24.486  1.00 87.56           N  
+ATOM     16  CA  GLN A  19      89.625  15.060 -25.415  1.00 88.01           C  
+ATOM     17  C   GLN A  19      88.397  15.232 -26.331  1.00 85.50           C  
+ATOM     18  O   GLN A  19      88.166  16.315 -26.862  1.00 84.73           O  
+ATOM     19  CB  GLN A  19      90.923  14.966 -26.260  1.00 91.56           C  
+ATOM     20  CG  GLN A  19      91.018  13.765 -27.258  1.00 97.54           C  
+ATOM     21  CD  GLN A  19      91.405  12.397 -26.624  1.00100.69           C  
+ATOM     22  OE1 GLN A  19      91.289  11.342 -27.271  1.00 98.31           O  
+ATOM     23  NE2 GLN A  19      91.876  12.423 -25.371  1.00100.62           N  
+ATOM     24  N   ILE A  20      87.607  14.175 -26.496  1.00 84.16           N  
+ATOM     25  CA  ILE A  20      86.420  14.207 -27.357  1.00 82.94           C  
+ATOM     26  C   ILE A  20      85.223  14.960 -26.756  1.00 83.21           C  
+ATOM     27  O   ILE A  20      84.353  15.465 -27.484  1.00 82.26           O  
+ATOM     28  CB  ILE A  20      85.962  12.767 -27.703  1.00 82.26           C  
+ATOM     29  CG1 ILE A  20      84.755  12.816 -28.639  1.00 80.80           C  
+ATOM     30  CG2 ILE A  20      85.604  12.013 -26.426  1.00 79.92           C  
+ATOM     31  CD1 ILE A  20      84.334  11.474 -29.155  1.00 79.46           C  
+ATOM     32  N   LEU A  21      85.183  15.012 -25.424  1.00 82.95           N  
+ATOM     33  CA  LEU A  21      84.113  15.691 -24.687  1.00 81.20           C  
+ATOM     34  C   LEU A  21      84.422  17.159 -24.375  1.00 80.11           C  
+ATOM     35  O   LEU A  21      83.551  17.872 -23.884  1.00 81.43           O  
+ATOM     36  CB  LEU A  21      83.827  14.959 -23.366  1.00 79.37           C  
+ATOM     37  CG  LEU A  21      83.147  13.590 -23.412  1.00 76.91           C  
+ATOM     38  CD1 LEU A  21      83.118  13.000 -22.027  1.00 74.74           C  
+ATOM     39  CD2 LEU A  21      81.740  13.725 -23.945  1.00 75.83           C  
+ATOM     40  N   MET A  22      85.653  17.597 -24.645  1.00 77.50           N  
+ATOM     41  CA  MET A  22      86.065  18.971 -24.392  1.00 73.89           C  
+ATOM     42  C   MET A  22      85.121  19.998 -24.989  1.00 71.55           C  
+ATOM     43  O   MET A  22      84.723  20.944 -24.318  1.00 71.82           O  
+ATOM     44  CB  MET A  22      87.451  19.235 -24.955  1.00 77.66           C  
+ATOM     45  CG  MET A  22      88.578  18.524 -24.258  1.00 82.67           C  
+ATOM     46  SD  MET A  22      88.543  18.753 -22.484  1.00 89.63           S  
+ATOM     47  CE  MET A  22      87.967  20.522 -22.306  1.00 86.21           C  
+ATOM     48  N   PRO A  23      84.769  19.844 -26.273  1.00 68.13           N  
+ATOM     49  CA  PRO A  23      83.863  20.783 -26.937  1.00 67.51           C  
+ATOM     50  C   PRO A  23      82.519  20.916 -26.213  1.00 68.08           C  
+ATOM     51  O   PRO A  23      82.074  22.030 -25.923  1.00 70.32           O  
+ATOM     52  CB  PRO A  23      83.706  20.178 -28.324  1.00 65.05           C  
+ATOM     53  CG  PRO A  23      84.981  19.530 -28.535  1.00 64.84           C  
+ATOM     54  CD  PRO A  23      85.239  18.838 -27.232  1.00 66.04           C  
+ATOM     55  N   ALA A  24      81.881  19.774 -25.942  1.00 66.26           N  
+ATOM     56  CA  ALA A  24      80.593  19.721 -25.249  1.00 61.92           C  
+ATOM     57  C   ALA A  24      80.640  20.388 -23.872  1.00 59.13           C  
+ATOM     58  O   ALA A  24      79.761  21.185 -23.526  1.00 57.67           O  
+ATOM     59  CB  ALA A  24      80.144  18.267 -25.103  1.00 61.30           C  
+ATOM     60  N   LEU A  25      81.663  20.054 -23.095  1.00 54.63           N  
+ATOM     61  CA  LEU A  25      81.813  20.617 -21.774  1.00 55.99           C  
+ATOM     62  C   LEU A  25      82.079  22.120 -21.812  1.00 59.57           C  
+ATOM     63  O   LEU A  25      81.603  22.846 -20.942  1.00 62.38           O  
+ATOM     64  CB  LEU A  25      82.930  19.909 -21.025  1.00 51.33           C  
+ATOM     65  CG  LEU A  25      82.688  18.421 -20.821  1.00 50.95           C  
+ATOM     66  CD1 LEU A  25      83.934  17.739 -20.369  1.00 49.96           C  
+ATOM     67  CD2 LEU A  25      81.621  18.229 -19.801  1.00 53.70           C  
+ATOM     68  N   ARG A  26      82.833  22.597 -22.805  1.00 61.72           N  
+ATOM     69  CA  ARG A  26      83.129  24.030 -22.910  1.00 61.75           C  
+ATOM     70  C   ARG A  26      81.881  24.834 -23.259  1.00 63.57           C  
+ATOM     71  O   ARG A  26      81.614  25.872 -22.644  1.00 64.64           O  
+ATOM     72  CB  ARG A  26      84.214  24.294 -23.951  1.00 60.19           C  
+ATOM     73  CG  ARG A  26      85.489  24.848 -23.356  1.00 60.94           C  
+ATOM     74  CD  ARG A  26      86.049  23.883 -22.334  1.00 62.79           C  
+ATOM     75  NE  ARG A  26      87.373  24.255 -21.816  1.00 67.77           N  
+ATOM     76  CZ  ARG A  26      87.608  25.147 -20.849  1.00 68.52           C  
+ATOM     77  NH1 ARG A  26      86.611  25.800 -20.264  1.00 70.21           N  
+ATOM     78  NH2 ARG A  26      88.850  25.368 -20.433  1.00 68.42           N  
+ATOM     79  N   GLN A  27      81.118  24.364 -24.242  1.00 63.03           N  
+ATOM     80  CA  GLN A  27      79.897  25.048 -24.628  1.00 64.19           C  
+ATOM     81  C   GLN A  27      78.885  25.004 -23.484  1.00 65.40           C  
+ATOM     82  O   GLN A  27      78.002  25.869 -23.376  1.00 63.90           O  
+ATOM     83  CB  GLN A  27      79.321  24.406 -25.876  1.00 66.09           C  
+ATOM     84  CG  GLN A  27      79.972  24.926 -27.129  1.00 75.35           C  
+ATOM     85  CD  GLN A  27      80.182  23.845 -28.173  1.00 81.55           C  
+ATOM     86  OE1 GLN A  27      79.214  23.294 -28.722  1.00 86.72           O  
+ATOM     87  NE2 GLN A  27      81.453  23.526 -28.453  1.00 81.62           N  
+ATOM     88  N   LEU A  28      79.017  23.995 -22.623  1.00 64.49           N  
+ATOM     89  CA  LEU A  28      78.115  23.874 -21.487  1.00 61.54           C  
+ATOM     90  C   LEU A  28      78.508  24.949 -20.486  1.00 59.62           C  
+ATOM     91  O   LEU A  28      77.669  25.750 -20.074  1.00 60.71           O  
+ATOM     92  CB  LEU A  28      78.215  22.490 -20.824  1.00 59.14           C  
+ATOM     93  CG  LEU A  28      77.211  22.314 -19.677  1.00 56.51           C  
+ATOM     94  CD1 LEU A  28      75.811  22.276 -20.251  1.00 53.34           C  
+ATOM     95  CD2 LEU A  28      77.505  21.071 -18.890  1.00 54.29           C  
+ATOM     96  N   GLU A  29      79.783  24.965 -20.105  1.00 56.82           N  
+ATOM     97  CA  GLU A  29      80.279  25.949 -19.155  1.00 55.54           C  
+ATOM     98  C   GLU A  29      79.978  27.335 -19.670  1.00 54.80           C  
+ATOM     99  O   GLU A  29      79.617  28.224 -18.913  1.00 51.20           O  
+ATOM    100  CB  GLU A  29      81.775  25.792 -18.954  1.00 55.93           C  
+ATOM    101  CG  GLU A  29      82.431  26.996 -18.329  1.00 59.09           C  
+ATOM    102  CD  GLU A  29      83.904  26.760 -18.018  1.00 63.86           C  
+ATOM    103  OE1 GLU A  29      84.218  26.270 -16.909  1.00 67.14           O  
+ATOM    104  OE2 GLU A  29      84.753  27.049 -18.883  1.00 62.41           O  
+ATOM    105  N   GLU A  30      80.115  27.520 -20.972  1.00 56.15           N  
+ATOM    106  CA  GLU A  30      79.835  28.825 -21.538  1.00 59.26           C  
+ATOM    107  C   GLU A  30      78.376  29.162 -21.321  1.00 57.84           C  
+ATOM    108  O   GLU A  30      78.040  30.263 -20.909  1.00 59.56           O  
+ATOM    109  CB  GLU A  30      80.140  28.864 -23.036  1.00 62.45           C  
+ATOM    110  CG  GLU A  30      81.080  30.009 -23.449  1.00 69.44           C  
+ATOM    111  CD  GLU A  30      80.680  31.398 -22.904  1.00 72.57           C  
+ATOM    112  OE1 GLU A  30      79.595  31.928 -23.276  1.00 71.44           O  
+ATOM    113  OE2 GLU A  30      81.473  31.955 -22.105  1.00 71.25           O  
+ATOM    114  N   ALA A  31      77.502  28.215 -21.604  1.00 57.10           N  
+ATOM    115  CA  ALA A  31      76.088  28.470 -21.425  1.00 58.25           C  
+ATOM    116  C   ALA A  31      75.707  28.690 -19.951  1.00 58.23           C  
+ATOM    117  O   ALA A  31      74.886  29.558 -19.650  1.00 57.09           O  
+ATOM    118  CB  ALA A  31      75.283  27.326 -22.020  1.00 58.31           C  
+ATOM    119  N   PHE A  32      76.301  27.908 -19.047  1.00 57.46           N  
+ATOM    120  CA  PHE A  32      76.011  28.013 -17.618  1.00 58.61           C  
+ATOM    121  C   PHE A  32      76.327  29.397 -17.109  1.00 59.70           C  
+ATOM    122  O   PHE A  32      75.507  30.053 -16.460  1.00 61.36           O  
+ATOM    123  CB  PHE A  32      76.838  27.020 -16.809  1.00 58.37           C  
+ATOM    124  CG  PHE A  32      76.533  27.053 -15.340  1.00 60.38           C  
+ATOM    125  CD1 PHE A  32      75.237  26.826 -14.880  1.00 60.40           C  
+ATOM    126  CD2 PHE A  32      77.522  27.316 -14.415  1.00 59.98           C  
+ATOM    127  CE1 PHE A  32      74.939  26.862 -13.522  1.00 57.57           C  
+ATOM    128  CE2 PHE A  32      77.227  27.350 -13.049  1.00 59.81           C  
+ATOM    129  CZ  PHE A  32      75.932  27.122 -12.610  1.00 58.03           C  
+ATOM    130  N   VAL A  33      77.550  29.821 -17.392  1.00 59.99           N  
+ATOM    131  CA  VAL A  33      78.028  31.142 -17.010  1.00 57.76           C  
+ATOM    132  C   VAL A  33      77.047  32.229 -17.513  1.00 56.04           C  
+ATOM    133  O   VAL A  33      76.742  33.171 -16.793  1.00 54.86           O  
+ATOM    134  CB  VAL A  33      79.469  31.351 -17.567  1.00 55.65           C  
+ATOM    135  CG1 VAL A  33      79.503  32.497 -18.585  1.00 58.67           C  
+ATOM    136  CG2 VAL A  33      80.439  31.575 -16.411  1.00 55.74           C  
+ATOM    137  N   SER A  34      76.542  32.077 -18.732  1.00 52.93           N  
+ATOM    138  CA  SER A  34      75.606  33.040 -19.277  1.00 54.56           C  
+ATOM    139  C   SER A  34      74.281  33.045 -18.560  1.00 58.05           C  
+ATOM    140  O   SER A  34      73.728  34.100 -18.268  1.00 60.11           O  
+ATOM    141  CB  SER A  34      75.290  32.747 -20.737  1.00 54.84           C  
+ATOM    142  OG  SER A  34      74.068  33.383 -21.125  1.00 48.36           O  
+ATOM    143  N   ALA A  35      73.749  31.850 -18.334  1.00 60.74           N  
+ATOM    144  CA  ALA A  35      72.455  31.687 -17.699  1.00 59.46           C  
+ATOM    145  C   ALA A  35      72.512  32.158 -16.276  1.00 60.20           C  
+ATOM    146  O   ALA A  35      71.507  32.572 -15.713  1.00 60.18           O  
+ATOM    147  CB  ALA A  35      72.043  30.240 -17.752  1.00 59.87           C  
+ATOM    148  N   GLN A  36      73.695  32.106 -15.688  1.00 60.79           N  
+ATOM    149  CA  GLN A  36      73.822  32.537 -14.318  1.00 64.28           C  
+ATOM    150  C   GLN A  36      73.782  34.082 -14.258  1.00 64.43           C  
+ATOM    151  O   GLN A  36      73.530  34.688 -13.217  1.00 66.59           O  
+ATOM    152  CB  GLN A  36      75.118  31.964 -13.731  1.00 65.14           C  
+ATOM    153  CG  GLN A  36      74.943  31.217 -12.402  1.00 69.04           C  
+ATOM    154  CD  GLN A  36      76.288  31.003 -11.661  1.00 76.66           C  
+ATOM    155  OE1 GLN A  36      77.177  31.886 -11.651  1.00 75.66           O  
+ATOM    156  NE2 GLN A  36      76.432  29.836 -11.026  1.00 77.92           N  
+ATOM    157  N   LYS A  37      74.010  34.720 -15.396  1.00 64.43           N  
+ATOM    158  CA  LYS A  37      74.015  36.173 -15.463  1.00 61.96           C  
+ATOM    159  C   LYS A  37      72.684  36.637 -15.985  1.00 64.26           C  
+ATOM    160  O   LYS A  37      72.492  37.812 -16.236  1.00 67.65           O  
+ATOM    161  CB  LYS A  37      75.134  36.671 -16.398  1.00 56.55           C  
+ATOM    162  CG  LYS A  37      76.511  36.704 -15.756  1.00 54.61           C  
+ATOM    163  CD  LYS A  37      77.602  37.183 -16.701  1.00 54.92           C  
+ATOM    164  CE  LYS A  37      77.850  36.174 -17.825  1.00 59.16           C  
+ATOM    165  NZ  LYS A  37      79.027  36.460 -18.715  1.00 57.69           N  
+ATOM    166  N   ASP A  38      71.747  35.728 -16.169  1.00 65.81           N  
+ATOM    167  CA  ASP A  38      70.470  36.160 -16.684  1.00 67.40           C  
+ATOM    168  C   ASP A  38      69.402  36.036 -15.617  1.00 71.32           C  
+ATOM    169  O   ASP A  38      69.009  34.938 -15.251  1.00 73.15           O  
+ATOM    170  CB  ASP A  38      70.098  35.348 -17.912  1.00 66.40           C  
+ATOM    171  CG  ASP A  38      68.862  35.873 -18.583  1.00 68.87           C  
+ATOM    172  OD1 ASP A  38      68.526  35.423 -19.705  1.00 70.33           O  
+ATOM    173  OD2 ASP A  38      68.218  36.749 -17.973  1.00 69.69           O  
+ATOM    174  N   PRO A  39      68.914  37.172 -15.091  1.00 74.92           N  
+ATOM    175  CA  PRO A  39      67.879  37.132 -14.051  1.00 74.49           C  
+ATOM    176  C   PRO A  39      66.607  36.503 -14.606  1.00 72.70           C  
+ATOM    177  O   PRO A  39      65.766  36.022 -13.859  1.00 74.82           O  
+ATOM    178  CB  PRO A  39      67.691  38.602 -13.699  1.00 74.53           C  
+ATOM    179  CG  PRO A  39      69.012  39.217 -14.063  1.00 74.86           C  
+ATOM    180  CD  PRO A  39      69.283  38.566 -15.387  1.00 75.12           C  
+ATOM    181  N   GLU A  40      66.481  36.519 -15.924  1.00 69.35           N  
+ATOM    182  CA  GLU A  40      65.344  35.931 -16.592  1.00 68.12           C  
+ATOM    183  C   GLU A  40      65.425  34.406 -16.443  1.00 66.85           C  
+ATOM    184  O   GLU A  40      64.411  33.719 -16.383  1.00 67.22           O  
+ATOM    185  CB  GLU A  40      65.385  36.305 -18.061  1.00 71.30           C  
+ATOM    186  CG  GLU A  40      64.049  36.679 -18.606  1.00 80.03           C  
+ATOM    187  CD  GLU A  40      63.046  35.563 -18.449  1.00 86.12           C  
+ATOM    188  OE1 GLU A  40      63.302  34.457 -18.994  1.00 89.18           O  
+ATOM    189  OE2 GLU A  40      62.008  35.793 -17.781  1.00 87.92           O  
+ATOM    190  N   PHE A  41      66.645  33.881 -16.388  1.00 63.20           N  
+ATOM    191  CA  PHE A  41      66.862  32.447 -16.240  1.00 58.90           C  
+ATOM    192  C   PHE A  41      66.509  32.103 -14.822  1.00 58.75           C  
+ATOM    193  O   PHE A  41      65.574  31.354 -14.556  1.00 58.59           O  
+ATOM    194  CB  PHE A  41      68.329  32.091 -16.484  1.00 53.71           C  
+ATOM    195  CG  PHE A  41      68.631  30.631 -16.334  1.00 53.39           C  
+ATOM    196  CD1 PHE A  41      68.350  29.733 -17.367  1.00 52.49           C  
+ATOM    197  CD2 PHE A  41      69.208  30.139 -15.165  1.00 53.71           C  
+ATOM    198  CE1 PHE A  41      68.642  28.371 -17.235  1.00 49.51           C  
+ATOM    199  CE2 PHE A  41      69.505  28.772 -15.026  1.00 49.93           C  
+ATOM    200  CZ  PHE A  41      69.221  27.897 -16.062  1.00 47.79           C  
+ATOM    201  N   GLN A  42      67.276  32.675 -13.908  1.00 60.78           N  
+ATOM    202  CA  GLN A  42      67.068  32.449 -12.494  1.00 62.14           C  
+ATOM    203  C   GLN A  42      65.587  32.618 -12.162  1.00 60.05           C  
+ATOM    204  O   GLN A  42      65.072  32.012 -11.225  1.00 60.08           O  
+ATOM    205  CB  GLN A  42      67.920  33.429 -11.688  1.00 64.68           C  
+ATOM    206  CG  GLN A  42      69.441  33.286 -11.909  1.00 72.60           C  
+ATOM    207  CD  GLN A  42      70.052  32.070 -11.192  1.00 78.31           C  
+ATOM    208  OE1 GLN A  42      69.787  31.833  -9.996  1.00 80.00           O  
+ATOM    209  NE2 GLN A  42      70.881  31.302 -11.915  1.00 78.13           N  
+ATOM    210  N   ALA A  43      64.891  33.419 -12.952  1.00 55.72           N  
+ATOM    211  CA  ALA A  43      63.486  33.640 -12.692  1.00 55.05           C  
+ATOM    212  C   ALA A  43      62.680  32.406 -13.030  1.00 56.19           C  
+ATOM    213  O   ALA A  43      61.842  31.964 -12.252  1.00 55.99           O  
+ATOM    214  CB  ALA A  43      62.986  34.811 -13.506  1.00 54.28           C  
+ATOM    215  N   GLN A  44      62.937  31.856 -14.207  1.00 57.28           N  
+ATOM    216  CA  GLN A  44      62.217  30.694 -14.677  1.00 54.22           C  
+ATOM    217  C   GLN A  44      62.609  29.500 -13.871  1.00 52.99           C  
+ATOM    218  O   GLN A  44      61.796  28.607 -13.651  1.00 52.95           O  
+ATOM    219  CB  GLN A  44      62.540  30.427 -16.136  1.00 56.45           C  
+ATOM    220  CG  GLN A  44      62.528  31.649 -16.993  1.00 60.47           C  
+ATOM    221  CD  GLN A  44      62.236  31.318 -18.432  1.00 64.83           C  
+ATOM    222  OE1 GLN A  44      62.767  30.342 -18.974  1.00 66.29           O  
+ATOM    223  NE2 GLN A  44      61.387  32.133 -19.071  1.00 66.95           N  
+ATOM    224  N   PHE A  45      63.862  29.470 -13.439  1.00 51.22           N  
+ATOM    225  CA  PHE A  45      64.325  28.338 -12.656  1.00 52.59           C  
+ATOM    226  C   PHE A  45      63.571  28.280 -11.336  1.00 52.81           C  
+ATOM    227  O   PHE A  45      63.297  27.212 -10.792  1.00 53.70           O  
+ATOM    228  CB  PHE A  45      65.829  28.433 -12.385  1.00 51.64           C  
+ATOM    229  CG  PHE A  45      66.361  27.284 -11.566  1.00 51.60           C  
+ATOM    230  CD1 PHE A  45      67.402  27.471 -10.669  1.00 49.53           C  
+ATOM    231  CD2 PHE A  45      65.797  26.013 -11.676  1.00 52.46           C  
+ATOM    232  CE1 PHE A  45      67.865  26.422  -9.900  1.00 47.80           C  
+ATOM    233  CE2 PHE A  45      66.255  24.964 -10.912  1.00 49.89           C  
+ATOM    234  CZ  PHE A  45      67.295  25.177 -10.022  1.00 52.00           C  
+ATOM    235  N   ASN A  46      63.227  29.447 -10.825  1.00 54.86           N  
+ATOM    236  CA  ASN A  46      62.513  29.532  -9.578  1.00 56.66           C  
+ATOM    237  C   ASN A  46      61.053  29.178  -9.708  1.00 55.06           C  
+ATOM    238  O   ASN A  46      60.454  28.623  -8.800  1.00 55.54           O  
+ATOM    239  CB  ASN A  46      62.663  30.929  -9.006  1.00 62.52           C  
+ATOM    240  CG  ASN A  46      63.241  30.898  -7.626  1.00 71.44           C  
+ATOM    241  OD1 ASN A  46      62.491  30.877  -6.626  1.00 76.86           O  
+ATOM    242  ND2 ASN A  46      64.585  30.842  -7.541  1.00 71.19           N  
+ATOM    243  N   ASP A  47      60.459  29.505 -10.835  1.00 54.83           N  
+ATOM    244  CA  ASP A  47      59.075  29.170 -10.994  1.00 57.73           C  
+ATOM    245  C   ASP A  47      58.996  27.644 -11.009  1.00 56.23           C  
+ATOM    246  O   ASP A  47      58.166  27.056 -10.313  1.00 58.00           O  
+ATOM    247  CB  ASP A  47      58.526  29.758 -12.291  1.00 65.99           C  
+ATOM    248  CG  ASP A  47      56.993  29.794 -12.319  1.00 74.84           C  
+ATOM    249  OD1 ASP A  47      56.411  29.603 -13.424  1.00 78.60           O  
+ATOM    250  OD2 ASP A  47      56.371  30.020 -11.238  1.00 79.34           O  
+ATOM    251  N   LEU A  48      59.866  26.999 -11.787  1.00 52.41           N  
+ATOM    252  CA  LEU A  48      59.865  25.542 -11.855  1.00 48.73           C  
+ATOM    253  C   LEU A  48      60.078  24.965 -10.463  1.00 49.92           C  
+ATOM    254  O   LEU A  48      59.352  24.049 -10.033  1.00 51.72           O  
+ATOM    255  CB  LEU A  48      60.956  25.022 -12.793  1.00 42.85           C  
+ATOM    256  CG  LEU A  48      60.819  25.242 -14.304  1.00 40.60           C  
+ATOM    257  CD1 LEU A  48      62.079  24.694 -14.979  1.00 35.46           C  
+ATOM    258  CD2 LEU A  48      59.556  24.592 -14.851  1.00 30.14           C  
+ATOM    259  N   LEU A  49      61.063  25.503  -9.751  1.00 47.17           N  
+ATOM    260  CA  LEU A  49      61.356  25.034  -8.412  1.00 46.09           C  
+ATOM    261  C   LEU A  49      60.099  25.058  -7.497  1.00 49.46           C  
+ATOM    262  O   LEU A  49      59.876  24.145  -6.676  1.00 49.38           O  
+ATOM    263  CB  LEU A  49      62.488  25.877  -7.852  1.00 41.16           C  
+ATOM    264  CG  LEU A  49      63.845  25.214  -7.609  1.00 40.32           C  
+ATOM    265  CD1 LEU A  49      63.954  23.918  -8.276  1.00 39.81           C  
+ATOM    266  CD2 LEU A  49      64.925  26.103  -8.113  1.00 40.63           C  
+ATOM    267  N   LYS A  50      59.263  26.084  -7.659  1.00 50.12           N  
+ATOM    268  CA  LYS A  50      58.045  26.217  -6.869  1.00 50.61           C  
+ATOM    269  C   LYS A  50      57.019  25.227  -7.352  1.00 51.78           C  
+ATOM    270  O   LYS A  50      56.493  24.398  -6.622  1.00 52.91           O  
+ATOM    271  CB  LYS A  50      57.429  27.592  -7.044  1.00 51.18           C  
+ATOM    272  CG  LYS A  50      58.277  28.771  -6.638  1.00 56.28           C  
+ATOM    273  CD  LYS A  50      57.378  29.837  -6.001  1.00 61.70           C  
+ATOM    274  CE  LYS A  50      58.136  31.130  -5.721  1.00 66.69           C  
+ATOM    275  NZ  LYS A  50      57.302  32.109  -4.941  1.00 69.23           N  
+ATOM    276  N   ASN A  51      56.733  25.320  -8.627  1.00 53.73           N  
+ATOM    277  CA  ASN A  51      55.731  24.467  -9.192  1.00 55.14           C  
+ATOM    278  C   ASN A  51      56.030  22.985  -9.257  1.00 56.93           C  
+ATOM    279  O   ASN A  51      55.110  22.191  -9.122  1.00 59.40           O  
+ATOM    280  CB  ASN A  51      55.358  25.025 -10.553  1.00 53.30           C  
+ATOM    281  CG  ASN A  51      54.702  26.389 -10.436  1.00 55.91           C  
+ATOM    282  OD1 ASN A  51      53.546  26.482 -10.012  1.00 60.67           O  
+ATOM    283  ND2 ASN A  51      55.437  27.455 -10.766  1.00 50.43           N  
+ATOM    284  N   TYR A  52      57.288  22.578  -9.410  1.00 56.77           N  
+ATOM    285  CA  TYR A  52      57.537  21.137  -9.527  1.00 57.18           C  
+ATOM    286  C   TYR A  52      58.369  20.414  -8.491  1.00 58.44           C  
+ATOM    287  O   TYR A  52      58.371  19.180  -8.470  1.00 57.91           O  
+ATOM    288  CB  TYR A  52      58.113  20.811 -10.913  1.00 55.86           C  
+ATOM    289  CG  TYR A  52      57.151  21.129 -12.034  1.00 54.20           C  
+ATOM    290  CD1 TYR A  52      57.144  22.387 -12.634  1.00 52.12           C  
+ATOM    291  CD2 TYR A  52      56.184  20.213 -12.416  1.00 52.68           C  
+ATOM    292  CE1 TYR A  52      56.203  22.726 -13.569  1.00 52.04           C  
+ATOM    293  CE2 TYR A  52      55.235  20.541 -13.347  1.00 56.99           C  
+ATOM    294  CZ  TYR A  52      55.243  21.808 -13.922  1.00 56.74           C  
+ATOM    295  OH  TYR A  52      54.263  22.153 -14.826  1.00 57.42           O  
+ATOM    296  N   ALA A  53      59.077  21.166  -7.646  1.00 60.68           N  
+ATOM    297  CA  ALA A  53      59.941  20.583  -6.611  1.00 58.15           C  
+ATOM    298  C   ALA A  53      59.484  20.982  -5.222  1.00 57.37           C  
+ATOM    299  O   ALA A  53      60.234  20.855  -4.248  1.00 57.84           O  
+ATOM    300  CB  ALA A  53      61.368  21.031  -6.823  1.00 58.20           C  
+ATOM    301  N   GLY A  54      58.253  21.477  -5.154  1.00 56.65           N  
+ATOM    302  CA  GLY A  54      57.672  21.901  -3.901  1.00 53.81           C  
+ATOM    303  C   GLY A  54      58.538  22.826  -3.074  1.00 53.88           C  
+ATOM    304  O   GLY A  54      58.676  22.591  -1.886  1.00 57.20           O  
+ATOM    305  N   ARG A  55      59.115  23.874  -3.663  1.00 51.79           N  
+ATOM    306  CA  ARG A  55      59.950  24.799  -2.887  1.00 48.49           C  
+ATOM    307  C   ARG A  55      59.273  26.147  -2.628  1.00 45.84           C  
+ATOM    308  O   ARG A  55      58.423  26.586  -3.397  1.00 47.76           O  
+ATOM    309  CB  ARG A  55      61.281  25.026  -3.601  1.00 49.81           C  
+ATOM    310  CG  ARG A  55      62.088  23.746  -3.821  1.00 49.92           C  
+ATOM    311  CD  ARG A  55      63.555  24.012  -3.590  1.00 51.11           C  
+ATOM    312  NE  ARG A  55      63.888  24.232  -2.175  1.00 48.43           N  
+ATOM    313  CZ  ARG A  55      64.047  23.255  -1.287  1.00 49.80           C  
+ATOM    314  NH1 ARG A  55      64.347  23.529  -0.027  1.00 46.79           N  
+ATOM    315  NH2 ARG A  55      63.907  21.989  -1.667  1.00 53.87           N  
+ATOM    316  N   PRO A  56      59.626  26.821  -1.530  1.00 41.98           N  
+ATOM    317  CA  PRO A  56      60.575  26.539  -0.453  1.00 41.58           C  
+ATOM    318  C   PRO A  56      59.994  25.623   0.587  1.00 41.40           C  
+ATOM    319  O   PRO A  56      58.804  25.654   0.826  1.00 44.02           O  
+ATOM    320  CB  PRO A  56      60.799  27.898   0.145  1.00 38.15           C  
+ATOM    321  CG  PRO A  56      59.456  28.430   0.116  1.00 36.89           C  
+ATOM    322  CD  PRO A  56      58.977  28.110  -1.277  1.00 38.39           C  
+ATOM    323  N   THR A  57      60.837  24.827   1.219  1.00 40.86           N  
+ATOM    324  CA  THR A  57      60.381  23.937   2.260  1.00 41.23           C  
+ATOM    325  C   THR A  57      60.254  24.823   3.476  1.00 44.58           C  
+ATOM    326  O   THR A  57      60.818  25.915   3.521  1.00 46.43           O  
+ATOM    327  CB  THR A  57      61.409  22.885   2.540  1.00 41.75           C  
+ATOM    328  OG1 THR A  57      62.662  23.529   2.793  1.00 43.67           O  
+ATOM    329  CG2 THR A  57      61.570  21.972   1.344  1.00 40.14           C  
+ATOM    330  N   ALA A  58      59.522  24.363   4.475  1.00 46.33           N  
+ATOM    331  CA  ALA A  58      59.340  25.156   5.674  1.00 48.22           C  
+ATOM    332  C   ALA A  58      60.575  25.108   6.561  1.00 51.26           C  
+ATOM    333  O   ALA A  58      61.384  24.176   6.463  1.00 53.21           O  
+ATOM    334  CB  ALA A  58      58.138  24.637   6.446  1.00 46.31           C  
+ATOM    335  N   LEU A  59      60.734  26.129   7.406  1.00 52.51           N  
+ATOM    336  CA  LEU A  59      61.831  26.168   8.381  1.00 52.87           C  
+ATOM    337  C   LEU A  59      61.055  26.237   9.695  1.00 54.29           C  
+ATOM    338  O   LEU A  59      60.448  27.274   9.990  1.00 58.04           O  
+ATOM    339  CB  LEU A  59      62.701  27.417   8.234  1.00 48.74           C  
+ATOM    340  CG  LEU A  59      63.776  27.422   9.332  1.00 52.14           C  
+ATOM    341  CD1 LEU A  59      64.878  26.415   9.012  1.00 51.02           C  
+ATOM    342  CD2 LEU A  59      64.368  28.801   9.475  1.00 52.81           C  
+ATOM    343  N   THR A  60      61.041  25.155  10.477  1.00 51.62           N  
+ATOM    344  CA  THR A  60      60.255  25.196  11.696  1.00 50.31           C  
+ATOM    345  C   THR A  60      61.000  25.164  13.025  1.00 51.56           C  
+ATOM    346  O   THR A  60      61.870  24.332  13.281  1.00 50.55           O  
+ATOM    347  CB  THR A  60      59.108  24.125  11.652  1.00 49.96           C  
+ATOM    348  OG1 THR A  60      59.470  22.951  12.367  1.00 48.78           O  
+ATOM    349  CG2 THR A  60      58.823  23.730  10.233  1.00 50.81           C  
+ATOM    350  N   LYS A  61      60.630  26.127  13.862  1.00 52.93           N  
+ATOM    351  CA  LYS A  61      61.199  26.321  15.177  1.00 53.91           C  
+ATOM    352  C   LYS A  61      60.681  25.302  16.165  1.00 56.21           C  
+ATOM    353  O   LYS A  61      59.487  25.156  16.337  1.00 57.80           O  
+ATOM    354  CB  LYS A  61      60.837  27.713  15.685  1.00 52.42           C  
+ATOM    355  CG  LYS A  61      61.569  28.080  16.942  1.00 56.56           C  
+ATOM    356  CD  LYS A  61      60.743  28.907  17.879  1.00 59.72           C  
+ATOM    357  CE  LYS A  61      60.810  30.387  17.581  1.00 64.87           C  
+ATOM    358  NZ  LYS A  61      59.925  31.117  18.558  1.00 68.15           N  
+ATOM    359  N   CYS A  62      61.570  24.595  16.829  1.00 59.80           N  
+ATOM    360  CA  CYS A  62      61.124  23.631  17.816  1.00 64.38           C  
+ATOM    361  C   CYS A  62      61.143  24.311  19.175  1.00 66.34           C  
+ATOM    362  O   CYS A  62      62.181  24.792  19.612  1.00 70.06           O  
+ATOM    363  CB  CYS A  62      62.050  22.421  17.803  1.00 64.63           C  
+ATOM    364  SG  CYS A  62      61.980  21.554  16.213  1.00 71.99           S  
+ATOM    365  N   GLN A  63      60.005  24.395  19.850  1.00 68.99           N  
+ATOM    366  CA  GLN A  63      60.036  25.045  21.151  1.00 70.54           C  
+ATOM    367  C   GLN A  63      60.001  24.072  22.310  1.00 70.17           C  
+ATOM    368  O   GLN A  63      60.646  24.323  23.322  1.00 72.99           O  
+ATOM    369  CB  GLN A  63      58.919  26.081  21.293  1.00 71.47           C  
+ATOM    370  CG  GLN A  63      58.947  27.112  20.180  1.00 76.30           C  
+ATOM    371  CD  GLN A  63      58.289  28.439  20.543  1.00 78.80           C  
+ATOM    372  OE1 GLN A  63      58.852  29.243  21.299  1.00 79.77           O  
+ATOM    373  NE2 GLN A  63      57.093  28.678  19.999  1.00 78.40           N  
+ATOM    374  N   ASN A  64      59.283  22.962  22.183  1.00 67.53           N  
+ATOM    375  CA  ASN A  64      59.253  22.021  23.290  1.00 65.73           C  
+ATOM    376  C   ASN A  64      60.636  21.509  23.642  1.00 66.22           C  
+ATOM    377  O   ASN A  64      61.011  21.521  24.807  1.00 67.19           O  
+ATOM    378  CB  ASN A  64      58.335  20.848  22.991  1.00 63.50           C  
+ATOM    379  CG  ASN A  64      56.933  21.296  22.677  1.00 66.19           C  
+ATOM    380  OD1 ASN A  64      56.438  22.267  23.251  1.00 66.35           O  
+ATOM    381  ND2 ASN A  64      56.273  20.592  21.766  1.00 67.25           N  
+ATOM    382  N   ILE A  65      61.398  21.085  22.637  1.00 66.68           N  
+ATOM    383  CA  ILE A  65      62.744  20.538  22.840  1.00 64.93           C  
+ATOM    384  C   ILE A  65      63.768  21.469  23.504  1.00 66.77           C  
+ATOM    385  O   ILE A  65      64.553  21.037  24.346  1.00 67.65           O  
+ATOM    386  CB  ILE A  65      63.314  20.020  21.500  1.00 62.12           C  
+ATOM    387  CG1 ILE A  65      62.717  18.655  21.204  1.00 63.20           C  
+ATOM    388  CG2 ILE A  65      64.812  19.926  21.545  1.00 60.79           C  
+ATOM    389  CD1 ILE A  65      63.453  17.895  20.131  1.00 65.90           C  
+ATOM    390  N   THR A  66      63.764  22.740  23.131  1.00 66.95           N  
+ATOM    391  CA  THR A  66      64.710  23.680  23.701  1.00 68.25           C  
+ATOM    392  C   THR A  66      64.223  24.216  25.043  1.00 69.93           C  
+ATOM    393  O   THR A  66      64.991  24.823  25.788  1.00 70.80           O  
+ATOM    394  CB  THR A  66      64.931  24.880  22.764  1.00 69.50           C  
+ATOM    395  OG1 THR A  66      63.761  25.710  22.760  1.00 71.80           O  
+ATOM    396  CG2 THR A  66      65.214  24.407  21.352  1.00 68.48           C  
+ATOM    397  N   ALA A  67      62.942  24.007  25.338  1.00 71.35           N  
+ATOM    398  CA  ALA A  67      62.348  24.478  26.589  1.00 70.37           C  
+ATOM    399  C   ALA A  67      63.320  24.195  27.706  1.00 70.50           C  
+ATOM    400  O   ALA A  67      63.885  23.105  27.779  1.00 69.55           O  
+ATOM    401  CB  ALA A  67      61.031  23.772  26.858  1.00 70.86           C  
+ATOM    402  N   GLY A  68      63.520  25.191  28.561  1.00 70.77           N  
+ATOM    403  CA  GLY A  68      64.448  25.048  29.662  1.00 69.52           C  
+ATOM    404  C   GLY A  68      65.878  25.470  29.335  1.00 69.47           C  
+ATOM    405  O   GLY A  68      66.738  25.391  30.207  1.00 72.58           O  
+ATOM    406  N   THR A  69      66.163  25.909  28.109  1.00 67.34           N  
+ATOM    407  CA  THR A  69      67.532  26.305  27.775  1.00 65.93           C  
+ATOM    408  C   THR A  69      67.545  27.524  26.883  1.00 66.51           C  
+ATOM    409  O   THR A  69      66.500  27.981  26.430  1.00 65.68           O  
+ATOM    410  CB  THR A  69      68.286  25.214  27.008  1.00 66.44           C  
+ATOM    411  OG1 THR A  69      67.977  25.330  25.614  1.00 66.65           O  
+ATOM    412  CG2 THR A  69      67.899  23.824  27.492  1.00 62.61           C  
+ATOM    413  N   ASN A  70      68.734  28.041  26.605  1.00 67.31           N  
+ATOM    414  CA  ASN A  70      68.825  29.218  25.755  1.00 70.86           C  
+ATOM    415  C   ASN A  70      69.053  28.953  24.267  1.00 71.08           C  
+ATOM    416  O   ASN A  70      69.286  29.894  23.493  1.00 71.62           O  
+ATOM    417  CB  ASN A  70      69.895  30.163  26.284  1.00 76.50           C  
+ATOM    418  CG  ASN A  70      69.489  30.810  27.600  1.00 80.96           C  
+ATOM    419  OD1 ASN A  70      68.409  31.413  27.704  1.00 82.85           O  
+ATOM    420  ND2 ASN A  70      70.347  30.688  28.615  1.00 83.12           N  
+ATOM    421  N   THR A  71      68.983  27.681  23.866  1.00 68.41           N  
+ATOM    422  CA  THR A  71      69.133  27.317  22.461  1.00 64.45           C  
+ATOM    423  C   THR A  71      67.803  27.576  21.752  1.00 62.62           C  
+ATOM    424  O   THR A  71      66.732  27.395  22.327  1.00 61.84           O  
+ATOM    425  CB  THR A  71      69.425  25.814  22.273  1.00 65.10           C  
+ATOM    426  OG1 THR A  71      70.670  25.473  22.879  1.00 68.32           O  
+ATOM    427  CG2 THR A  71      69.491  25.467  20.797  1.00 65.08           C  
+ATOM    428  N   THR A  72      67.872  28.025  20.508  1.00 60.70           N  
+ATOM    429  CA  THR A  72      66.677  28.219  19.699  1.00 57.78           C  
+ATOM    430  C   THR A  72      66.968  27.269  18.550  1.00 58.05           C  
+ATOM    431  O   THR A  72      67.902  27.506  17.777  1.00 59.97           O  
+ATOM    432  CB  THR A  72      66.548  29.652  19.170  1.00 54.43           C  
+ATOM    433  OG1 THR A  72      66.270  30.525  20.260  1.00 52.12           O  
+ATOM    434  CG2 THR A  72      65.411  29.757  18.170  1.00 53.31           C  
+ATOM    435  N   LEU A  73      66.212  26.177  18.458  1.00 56.11           N  
+ATOM    436  CA  LEU A  73      66.458  25.209  17.401  1.00 53.97           C  
+ATOM    437  C   LEU A  73      65.451  25.300  16.271  1.00 56.30           C  
+ATOM    438  O   LEU A  73      64.244  25.384  16.501  1.00 56.87           O  
+ATOM    439  CB  LEU A  73      66.459  23.789  17.960  1.00 47.50           C  
+ATOM    440  CG  LEU A  73      66.673  22.705  16.912  1.00 44.34           C  
+ATOM    441  CD1 LEU A  73      68.031  22.856  16.299  1.00 40.13           C  
+ATOM    442  CD2 LEU A  73      66.536  21.355  17.536  1.00 39.64           C  
+ATOM    443  N   TYR A  74      65.973  25.285  15.046  1.00 57.86           N  
+ATOM    444  CA  TYR A  74      65.175  25.334  13.823  1.00 57.11           C  
+ATOM    445  C   TYR A  74      65.508  24.152  12.916  1.00 56.77           C  
+ATOM    446  O   TYR A  74      66.690  23.876  12.658  1.00 58.37           O  
+ATOM    447  CB  TYR A  74      65.484  26.590  13.018  1.00 57.35           C  
+ATOM    448  CG  TYR A  74      64.785  27.826  13.458  1.00 57.28           C  
+ATOM    449  CD1 TYR A  74      65.443  28.783  14.228  1.00 58.71           C  
+ATOM    450  CD2 TYR A  74      63.472  28.065  13.077  1.00 56.00           C  
+ATOM    451  CE1 TYR A  74      64.808  29.959  14.606  1.00 60.10           C  
+ATOM    452  CE2 TYR A  74      62.825  29.228  13.447  1.00 58.60           C  
+ATOM    453  CZ  TYR A  74      63.496  30.174  14.211  1.00 60.91           C  
+ATOM    454  OH  TYR A  74      62.854  31.334  14.568  1.00 65.12           O  
+ATOM    455  N   LEU A  75      64.481  23.475  12.408  1.00 54.15           N  
+ATOM    456  CA  LEU A  75      64.703  22.366  11.480  1.00 51.56           C  
+ATOM    457  C   LEU A  75      64.278  22.840  10.082  1.00 48.56           C  
+ATOM    458  O   LEU A  75      63.236  23.461   9.918  1.00 47.43           O  
+ATOM    459  CB  LEU A  75      63.879  21.134  11.901  1.00 53.37           C  
+ATOM    460  CG  LEU A  75      63.782  20.803  13.410  1.00 54.98           C  
+ATOM    461  CD1 LEU A  75      62.801  19.655  13.645  1.00 51.48           C  
+ATOM    462  CD2 LEU A  75      65.152  20.468  13.964  1.00 52.73           C  
+ATOM    463  N   LYS A  76      65.115  22.592   9.086  1.00 47.80           N  
+ATOM    464  CA  LYS A  76      64.805  22.957   7.705  1.00 46.27           C  
+ATOM    465  C   LYS A  76      64.072  21.718   7.190  1.00 47.19           C  
+ATOM    466  O   LYS A  76      64.700  20.691   6.935  1.00 46.71           O  
+ATOM    467  CB  LYS A  76      66.103  23.180   6.929  1.00 45.37           C  
+ATOM    468  CG  LYS A  76      65.939  23.486   5.453  1.00 44.90           C  
+ATOM    469  CD  LYS A  76      65.056  24.692   5.219  1.00 42.70           C  
+ATOM    470  CE  LYS A  76      64.980  25.007   3.730  1.00 44.26           C  
+ATOM    471  NZ  LYS A  76      63.971  26.035   3.361  1.00 42.47           N  
+ATOM    472  N   ARG A  77      62.750  21.818   7.054  1.00 46.06           N  
+ATOM    473  CA  ARG A  77      61.914  20.700   6.640  1.00 44.01           C  
+ATOM    474  C   ARG A  77      62.043  20.168   5.203  1.00 46.25           C  
+ATOM    475  O   ARG A  77      61.120  20.289   4.404  1.00 46.31           O  
+ATOM    476  CB  ARG A  77      60.441  21.036   6.907  1.00 42.58           C  
+ATOM    477  CG  ARG A  77      60.124  21.656   8.255  1.00 41.41           C  
+ATOM    478  CD  ARG A  77      60.423  20.732   9.409  1.00 45.58           C  
+ATOM    479  NE  ARG A  77      59.854  19.391   9.246  1.00 51.06           N  
+ATOM    480  CZ  ARG A  77      58.600  19.046   9.538  1.00 52.13           C  
+ATOM    481  NH1 ARG A  77      57.761  19.951  10.015  1.00 53.36           N  
+ATOM    482  NH2 ARG A  77      58.187  17.789   9.365  1.00 50.72           N  
+ATOM    483  N   GLU A  78      63.174  19.564   4.863  1.00 48.14           N  
+ATOM    484  CA  GLU A  78      63.303  18.988   3.530  1.00 49.90           C  
+ATOM    485  C   GLU A  78      62.579  17.647   3.568  1.00 50.80           C  
+ATOM    486  O   GLU A  78      62.345  17.033   2.536  1.00 52.19           O  
+ATOM    487  CB  GLU A  78      64.767  18.752   3.147  1.00 48.61           C  
+ATOM    488  CG  GLU A  78      65.604  20.009   2.993  1.00 52.93           C  
+ATOM    489  CD  GLU A  78      65.060  20.985   1.957  1.00 54.42           C  
+ATOM    490  OE1 GLU A  78      64.997  20.621   0.764  1.00 55.95           O  
+ATOM    491  OE2 GLU A  78      64.701  22.121   2.335  1.00 53.41           O  
+ATOM    492  N   ASP A  79      62.227  17.212   4.777  1.00 52.10           N  
+ATOM    493  CA  ASP A  79      61.533  15.943   5.009  1.00 52.35           C  
+ATOM    494  C   ASP A  79      60.110  15.907   4.480  1.00 52.22           C  
+ATOM    495  O   ASP A  79      59.545  14.831   4.305  1.00 52.48           O  
+ATOM    496  CB  ASP A  79      61.509  15.600   6.519  1.00 54.67           C  
+ATOM    497  CG  ASP A  79      60.637  16.569   7.364  1.00 56.08           C  
+ATOM    498  OD1 ASP A  79      60.853  17.799   7.298  1.00 55.96           O  
+ATOM    499  OD2 ASP A  79      59.744  16.094   8.114  1.00 55.95           O  
+ATOM    500  N   LEU A  80      59.526  17.073   4.224  1.00 50.37           N  
+ATOM    501  CA  LEU A  80      58.162  17.103   3.741  1.00 49.08           C  
+ATOM    502  C   LEU A  80      58.044  17.057   2.224  1.00 50.61           C  
+ATOM    503  O   LEU A  80      56.946  16.948   1.690  1.00 54.55           O  
+ATOM    504  CB  LEU A  80      57.442  18.326   4.293  1.00 47.53           C  
+ATOM    505  CG  LEU A  80      57.352  18.369   5.823  1.00 48.84           C  
+ATOM    506  CD1 LEU A  80      56.356  19.449   6.227  1.00 48.73           C  
+ATOM    507  CD2 LEU A  80      56.917  17.020   6.386  1.00 44.55           C  
+ATOM    508  N   LEU A  81      59.170  17.156   1.528  1.00 50.49           N  
+ATOM    509  CA  LEU A  81      59.182  17.078   0.072  1.00 49.57           C  
+ATOM    510  C   LEU A  81      58.851  15.648  -0.293  1.00 51.66           C  
+ATOM    511  O   LEU A  81      58.834  14.779   0.564  1.00 51.85           O  
+ATOM    512  CB  LEU A  81      60.570  17.379  -0.455  1.00 45.68           C  
+ATOM    513  CG  LEU A  81      60.947  18.767  -0.932  1.00 44.38           C  
+ATOM    514  CD1 LEU A  81      59.972  19.818  -0.462  1.00 38.08           C  
+ATOM    515  CD2 LEU A  81      62.347  19.019  -0.431  1.00 43.11           C  
+ATOM    516  N   HIS A  82      58.582  15.390  -1.560  1.00 54.70           N  
+ATOM    517  CA  HIS A  82      58.310  14.028  -1.949  1.00 58.29           C  
+ATOM    518  C   HIS A  82      59.630  13.478  -2.387  1.00 57.89           C  
+ATOM    519  O   HIS A  82      60.506  14.239  -2.762  1.00 60.52           O  
+ATOM    520  CB  HIS A  82      57.294  13.988  -3.066  1.00 67.18           C  
+ATOM    521  CG  HIS A  82      55.929  13.611  -2.592  1.00 79.31           C  
+ATOM    522  ND1 HIS A  82      55.692  12.455  -1.867  1.00 84.56           N  
+ATOM    523  CD2 HIS A  82      54.729  14.229  -2.725  1.00 82.57           C  
+ATOM    524  CE1 HIS A  82      54.402  12.379  -1.579  1.00 87.32           C  
+ATOM    525  NE2 HIS A  82      53.796  13.442  -2.088  1.00 87.44           N  
+ATOM    526  N   GLY A  83      59.799  12.165  -2.332  1.00 59.92           N  
+ATOM    527  CA  GLY A  83      61.086  11.573  -2.701  1.00 58.38           C  
+ATOM    528  C   GLY A  83      61.562  12.042  -4.051  1.00 57.79           C  
+ATOM    529  O   GLY A  83      60.745  12.367  -4.915  1.00 58.15           O  
+ATOM    530  N   GLY A  84      62.873  12.101  -4.242  1.00 57.45           N  
+ATOM    531  CA  GLY A  84      63.397  12.538  -5.533  1.00 55.55           C  
+ATOM    532  C   GLY A  84      63.351  14.032  -5.822  1.00 53.82           C  
+ATOM    533  O   GLY A  84      63.904  14.486  -6.831  1.00 51.60           O  
+ATOM    534  N   ALA A  85      62.679  14.789  -4.954  1.00 52.11           N  
+ATOM    535  CA  ALA A  85      62.578  16.243  -5.093  1.00 50.22           C  
+ATOM    536  C   ALA A  85      63.956  16.851  -5.301  1.00 49.66           C  
+ATOM    537  O   ALA A  85      64.175  17.630  -6.225  1.00 48.85           O  
+ATOM    538  CB  ALA A  85      61.967  16.839  -3.854  1.00 50.25           C  
+ATOM    539  N   HIS A  86      64.888  16.490  -4.430  1.00 48.98           N  
+ATOM    540  CA  HIS A  86      66.224  17.017  -4.544  1.00 51.20           C  
+ATOM    541  C   HIS A  86      66.904  16.655  -5.867  1.00 53.49           C  
+ATOM    542  O   HIS A  86      67.837  17.341  -6.284  1.00 57.78           O  
+ATOM    543  CB  HIS A  86      67.063  16.603  -3.329  1.00 52.13           C  
+ATOM    544  CG  HIS A  86      66.720  17.359  -2.076  1.00 54.44           C  
+ATOM    545  ND1 HIS A  86      67.364  17.150  -0.874  1.00 57.27           N  
+ATOM    546  CD2 HIS A  86      65.816  18.344  -1.845  1.00 55.27           C  
+ATOM    547  CE1 HIS A  86      66.873  17.972   0.040  1.00 55.44           C  
+ATOM    548  NE2 HIS A  86      65.932  18.706  -0.523  1.00 53.99           N  
+ATOM    549  N   LYS A  87      66.442  15.610  -6.551  1.00 53.66           N  
+ATOM    550  CA  LYS A  87      67.040  15.262  -7.845  1.00 54.96           C  
+ATOM    551  C   LYS A  87      66.380  16.143  -8.872  1.00 55.25           C  
+ATOM    552  O   LYS A  87      67.024  16.629  -9.810  1.00 56.92           O  
+ATOM    553  CB  LYS A  87      66.799  13.796  -8.206  1.00 55.30           C  
+ATOM    554  CG  LYS A  87      67.523  12.884  -7.269  1.00 59.08           C  
+ATOM    555  CD  LYS A  87      67.325  11.415  -7.514  1.00 58.89           C  
+ATOM    556  CE  LYS A  87      68.175  10.697  -6.482  1.00 58.16           C  
+ATOM    557  NZ  LYS A  87      68.208   9.247  -6.704  1.00 62.56           N  
+ATOM    558  N   THR A  88      65.080  16.335  -8.680  1.00 52.74           N  
+ATOM    559  CA  THR A  88      64.282  17.159  -9.561  1.00 51.57           C  
+ATOM    560  C   THR A  88      64.900  18.547  -9.578  1.00 51.75           C  
+ATOM    561  O   THR A  88      64.871  19.245 -10.592  1.00 51.12           O  
+ATOM    562  CB  THR A  88      62.833  17.195  -9.059  1.00 49.93           C  
+ATOM    563  OG1 THR A  88      62.376  15.847  -8.912  1.00 48.08           O  
+ATOM    564  CG2 THR A  88      61.930  17.930 -10.038  1.00 46.01           C  
+ATOM    565  N   ASN A  89      65.474  18.927  -8.442  1.00 52.26           N  
+ATOM    566  CA  ASN A  89      66.145  20.208  -8.306  1.00 53.91           C  
+ATOM    567  C   ASN A  89      67.205  20.461  -9.379  1.00 54.46           C  
+ATOM    568  O   ASN A  89      67.115  21.434 -10.120  1.00 53.15           O  
+ATOM    569  CB  ASN A  89      66.787  20.301  -6.933  1.00 54.76           C  
+ATOM    570  CG  ASN A  89      65.822  20.769  -5.892  1.00 56.05           C  
+ATOM    571  OD1 ASN A  89      66.088  20.678  -4.700  1.00 56.92           O  
+ATOM    572  ND2 ASN A  89      64.686  21.287  -6.335  1.00 55.55           N  
+ATOM    573  N   GLN A  90      68.215  19.604  -9.484  1.00 55.49           N  
+ATOM    574  CA  GLN A  90      69.208  19.876 -10.509  1.00 57.17           C  
+ATOM    575  C   GLN A  90      68.747  19.563 -11.932  1.00 55.04           C  
+ATOM    576  O   GLN A  90      69.282  20.149 -12.877  1.00 55.43           O  
+ATOM    577  CB  GLN A  90      70.532  19.174 -10.207  1.00 58.11           C  
+ATOM    578  CG  GLN A  90      70.601  17.784 -10.676  1.00 67.31           C  
+ATOM    579  CD  GLN A  90      71.429  16.947  -9.739  1.00 76.61           C  
+ATOM    580  OE1 GLN A  90      71.417  15.701  -9.801  1.00 81.27           O  
+ATOM    581  NE2 GLN A  90      72.157  17.622  -8.841  1.00 78.98           N  
+ATOM    582  N   VAL A  91      67.772  18.675 -12.122  1.00 50.98           N  
+ATOM    583  CA  VAL A  91      67.375  18.441 -13.501  1.00 52.23           C  
+ATOM    584  C   VAL A  91      66.526  19.597 -14.004  1.00 50.84           C  
+ATOM    585  O   VAL A  91      66.594  19.952 -15.174  1.00 50.42           O  
+ATOM    586  CB  VAL A  91      66.607  17.110 -13.740  1.00 52.64           C  
+ATOM    587  CG1 VAL A  91      67.478  15.933 -13.410  1.00 50.48           C  
+ATOM    588  CG2 VAL A  91      65.335  17.099 -12.956  1.00 58.02           C  
+ATOM    589  N   LEU A  92      65.715  20.189 -13.138  1.00 50.75           N  
+ATOM    590  CA  LEU A  92      64.914  21.327 -13.580  1.00 49.99           C  
+ATOM    591  C   LEU A  92      65.923  22.388 -14.038  1.00 49.31           C  
+ATOM    592  O   LEU A  92      65.776  22.986 -15.111  1.00 46.55           O  
+ATOM    593  CB  LEU A  92      64.042  21.845 -12.432  1.00 47.83           C  
+ATOM    594  CG  LEU A  92      62.869  20.933 -12.069  1.00 47.49           C  
+ATOM    595  CD1 LEU A  92      62.118  21.466 -10.855  1.00 46.32           C  
+ATOM    596  CD2 LEU A  92      61.935  20.838 -13.264  1.00 45.96           C  
+ATOM    597  N   GLY A  93      66.958  22.585 -13.222  1.00 48.25           N  
+ATOM    598  CA  GLY A  93      68.009  23.525 -13.554  1.00 49.35           C  
+ATOM    599  C   GLY A  93      68.690  23.166 -14.876  1.00 52.32           C  
+ATOM    600  O   GLY A  93      68.872  24.041 -15.734  1.00 53.92           O  
+ATOM    601  N   GLN A  94      69.073  21.895 -15.064  1.00 51.49           N  
+ATOM    602  CA  GLN A  94      69.730  21.485 -16.309  1.00 48.05           C  
+ATOM    603  C   GLN A  94      68.790  21.400 -17.498  1.00 48.25           C  
+ATOM    604  O   GLN A  94      69.158  21.778 -18.601  1.00 51.29           O  
+ATOM    605  CB  GLN A  94      70.430  20.162 -16.131  1.00 44.84           C  
+ATOM    606  CG  GLN A  94      71.498  20.215 -15.111  1.00 46.83           C  
+ATOM    607  CD  GLN A  94      72.170  18.876 -14.947  1.00 50.62           C  
+ATOM    608  OE1 GLN A  94      72.651  18.297 -15.913  1.00 49.07           O  
+ATOM    609  NE2 GLN A  94      72.213  18.375 -13.718  1.00 54.74           N  
+ATOM    610  N   ALA A  95      67.580  20.901 -17.302  1.00 47.98           N  
+ATOM    611  CA  ALA A  95      66.641  20.834 -18.416  1.00 46.97           C  
+ATOM    612  C   ALA A  95      66.522  22.254 -18.947  1.00 46.68           C  
+ATOM    613  O   ALA A  95      66.614  22.476 -20.147  1.00 45.66           O  
+ATOM    614  CB  ALA A  95      65.268  20.325 -17.945  1.00 45.72           C  
+ATOM    615  N   LEU A  96      66.327  23.214 -18.041  1.00 46.93           N  
+ATOM    616  CA  LEU A  96      66.202  24.613 -18.429  1.00 47.28           C  
+ATOM    617  C   LEU A  96      67.450  25.082 -19.163  1.00 50.24           C  
+ATOM    618  O   LEU A  96      67.370  25.763 -20.181  1.00 51.81           O  
+ATOM    619  CB  LEU A  96      66.013  25.495 -17.213  1.00 46.45           C  
+ATOM    620  CG  LEU A  96      64.711  26.272 -17.148  1.00 46.53           C  
+ATOM    621  CD1 LEU A  96      64.867  27.441 -16.227  1.00 46.61           C  
+ATOM    622  CD2 LEU A  96      64.364  26.755 -18.504  1.00 47.60           C  
+ATOM    623  N   LEU A  97      68.615  24.721 -18.639  1.00 49.95           N  
+ATOM    624  CA  LEU A  97      69.865  25.111 -19.263  1.00 48.78           C  
+ATOM    625  C   LEU A  97      69.981  24.555 -20.685  1.00 49.98           C  
+ATOM    626  O   LEU A  97      70.475  25.232 -21.587  1.00 51.81           O  
+ATOM    627  CB  LEU A  97      71.026  24.621 -18.412  1.00 46.77           C  
+ATOM    628  CG  LEU A  97      72.361  25.128 -18.910  1.00 43.76           C  
+ATOM    629  CD1 LEU A  97      72.262  26.622 -19.005  1.00 44.44           C  
+ATOM    630  CD2 LEU A  97      73.477  24.698 -17.981  1.00 44.70           C  
+ATOM    631  N   ALA A  98      69.536  23.316 -20.880  1.00 49.14           N  
+ATOM    632  CA  ALA A  98      69.572  22.685 -22.196  1.00 49.86           C  
+ATOM    633  C   ALA A  98      68.663  23.438 -23.180  1.00 50.39           C  
+ATOM    634  O   ALA A  98      69.052  23.725 -24.309  1.00 50.36           O  
+ATOM    635  CB  ALA A  98      69.136  21.223 -22.090  1.00 49.24           C  
+ATOM    636  N   LYS A  99      67.448  23.742 -22.745  1.00 49.37           N  
+ATOM    637  CA  LYS A  99      66.511  24.482 -23.562  1.00 51.40           C  
+ATOM    638  C   LYS A  99      67.185  25.786 -23.972  1.00 53.98           C  
+ATOM    639  O   LYS A  99      67.073  26.242 -25.116  1.00 54.67           O  
+ATOM    640  CB  LYS A  99      65.279  24.797 -22.741  1.00 52.88           C  
+ATOM    641  CG  LYS A  99      64.020  24.178 -23.264  1.00 57.85           C  
+ATOM    642  CD  LYS A  99      63.241  25.151 -24.124  1.00 59.52           C  
+ATOM    643  CE  LYS A  99      61.967  24.489 -24.655  1.00 64.28           C  
+ATOM    644  NZ  LYS A  99      62.261  23.316 -25.565  1.00 64.54           N  
+ATOM    645  N   ARG A 100      67.888  26.390 -23.020  1.00 54.14           N  
+ATOM    646  CA  ARG A 100      68.577  27.633 -23.276  1.00 52.62           C  
+ATOM    647  C   ARG A 100      69.516  27.370 -24.415  1.00 53.32           C  
+ATOM    648  O   ARG A 100      69.476  28.085 -25.410  1.00 56.71           O  
+ATOM    649  CB  ARG A 100      69.387  28.077 -22.057  1.00 55.46           C  
+ATOM    650  CG  ARG A 100      69.873  29.533 -22.090  1.00 55.34           C  
+ATOM    651  CD  ARG A 100      69.228  30.310 -20.964  1.00 59.82           C  
+ATOM    652  NE  ARG A 100      69.686  31.690 -20.834  1.00 63.22           N  
+ATOM    653  CZ  ARG A 100      70.965  32.053 -20.792  1.00 66.13           C  
+ATOM    654  NH1 ARG A 100      71.279  33.340 -20.647  1.00 62.49           N  
+ATOM    655  NH2 ARG A 100      71.926  31.128 -20.927  1.00 68.02           N  
+ATOM    656  N   MET A 101      70.351  26.336 -24.279  1.00 52.04           N  
+ATOM    657  CA  MET A 101      71.337  25.999 -25.311  1.00 50.74           C  
+ATOM    658  C   MET A 101      70.705  25.588 -26.617  1.00 49.24           C  
+ATOM    659  O   MET A 101      71.409  25.262 -27.570  1.00 48.34           O  
+ATOM    660  CB  MET A 101      72.237  24.867 -24.859  1.00 51.65           C  
+ATOM    661  CG  MET A 101      73.051  25.178 -23.663  1.00 55.72           C  
+ATOM    662  SD  MET A 101      74.512  24.158 -23.738  1.00 59.08           S  
+ATOM    663  CE  MET A 101      73.891  22.676 -22.853  1.00 59.48           C  
+ATOM    664  N   GLY A 102      69.378  25.585 -26.650  1.00 47.55           N  
+ATOM    665  CA  GLY A 102      68.676  25.204 -27.853  1.00 47.25           C  
+ATOM    666  C   GLY A 102      68.713  23.715 -28.140  1.00 48.77           C  
+ATOM    667  O   GLY A 102      68.469  23.308 -29.287  1.00 48.08           O  
+ATOM    668  N   LYS A 103      69.022  22.907 -27.116  1.00 48.26           N  
+ATOM    669  CA  LYS A 103      69.071  21.452 -27.257  1.00 47.03           C  
+ATOM    670  C   LYS A 103      67.646  20.945 -27.475  1.00 49.28           C  
+ATOM    671  O   LYS A 103      66.666  21.656 -27.185  1.00 50.12           O  
+ATOM    672  CB  LYS A 103      69.655  20.793 -26.015  1.00 44.12           C  
+ATOM    673  CG  LYS A 103      71.045  21.216 -25.671  1.00 42.94           C  
+ATOM    674  CD  LYS A 103      72.010  20.957 -26.792  1.00 46.12           C  
+ATOM    675  CE  LYS A 103      73.449  21.346 -26.409  1.00 48.25           C  
+ATOM    676  NZ  LYS A 103      74.271  21.792 -27.606  1.00 47.96           N  
+ATOM    677  N   THR A 104      67.531  19.713 -27.970  1.00 49.57           N  
+ATOM    678  CA  THR A 104      66.224  19.125 -28.270  1.00 49.73           C  
+ATOM    679  C   THR A 104      66.010  17.758 -27.633  1.00 50.95           C  
+ATOM    680  O   THR A 104      64.882  17.293 -27.538  1.00 50.91           O  
+ATOM    681  CB  THR A 104      66.022  19.004 -29.812  1.00 47.33           C  
+ATOM    682  OG1 THR A 104      67.251  18.598 -30.435  1.00 48.51           O  
+ATOM    683  CG2 THR A 104      65.614  20.320 -30.401  1.00 46.67           C  
+ATOM    684  N   GLU A 105      67.093  17.105 -27.220  1.00 52.04           N  
+ATOM    685  CA  GLU A 105      66.979  15.801 -26.590  1.00 52.25           C  
+ATOM    686  C   GLU A 105      67.843  15.828 -25.348  1.00 52.04           C  
+ATOM    687  O   GLU A 105      68.750  16.650 -25.225  1.00 48.87           O  
+ATOM    688  CB  GLU A 105      67.504  14.671 -27.473  1.00 54.07           C  
+ATOM    689  CG  GLU A 105      67.179  14.713 -28.948  1.00 63.18           C  
+ATOM    690  CD  GLU A 105      68.443  14.457 -29.771  1.00 69.72           C  
+ATOM    691  OE1 GLU A 105      69.295  15.375 -29.758  1.00 75.48           O  
+ATOM    692  OE2 GLU A 105      68.614  13.364 -30.399  1.00 69.21           O  
+ATOM    693  N   ILE A 106      67.567  14.886 -24.451  1.00 52.41           N  
+ATOM    694  CA  ILE A 106      68.285  14.742 -23.198  1.00 51.35           C  
+ATOM    695  C   ILE A 106      68.695  13.275 -22.976  1.00 51.31           C  
+ATOM    696  O   ILE A 106      67.952  12.354 -23.311  1.00 52.69           O  
+ATOM    697  CB  ILE A 106      67.405  15.278 -22.051  1.00 49.76           C  
+ATOM    698  CG1 ILE A 106      67.675  16.762 -21.888  1.00 46.67           C  
+ATOM    699  CG2 ILE A 106      67.672  14.539 -20.772  1.00 50.66           C  
+ATOM    700  CD1 ILE A 106      66.800  17.384 -20.910  1.00 48.88           C  
+ATOM    701  N   ILE A 107      69.891  13.083 -22.432  1.00 49.88           N  
+ATOM    702  CA  ILE A 107      70.446  11.761 -22.171  1.00 50.43           C  
+ATOM    703  C   ILE A 107      70.733  11.678 -20.675  1.00 51.80           C  
+ATOM    704  O   ILE A 107      71.373  12.560 -20.118  1.00 50.67           O  
+ATOM    705  CB  ILE A 107      71.785  11.561 -22.958  1.00 51.48           C  
+ATOM    706  CG1 ILE A 107      71.500  11.440 -24.447  1.00 51.52           C  
+ATOM    707  CG2 ILE A 107      72.544  10.322 -22.484  1.00 48.76           C  
+ATOM    708  CD1 ILE A 107      72.730  11.706 -25.263  1.00 53.31           C  
+ATOM    709  N   ALA A 108      70.266  10.609 -20.040  1.00 52.48           N  
+ATOM    710  CA  ALA A 108      70.456  10.401 -18.615  1.00 52.94           C  
+ATOM    711  C   ALA A 108      70.592   8.913 -18.345  1.00 54.94           C  
+ATOM    712  O   ALA A 108      70.168   8.098 -19.155  1.00 57.54           O  
+ATOM    713  CB  ALA A 108      69.252  10.936 -17.855  1.00 49.30           C  
+ATOM    714  N   GLU A 109      71.200   8.566 -17.217  1.00 55.55           N  
+ATOM    715  CA  GLU A 109      71.313   7.178 -16.811  1.00 56.32           C  
+ATOM    716  C   GLU A 109      70.609   7.124 -15.458  1.00 57.80           C  
+ATOM    717  O   GLU A 109      70.429   8.159 -14.808  1.00 57.39           O  
+ATOM    718  CB  GLU A 109      72.759   6.748 -16.628  1.00 59.55           C  
+ATOM    719  CG  GLU A 109      73.398   7.276 -15.373  1.00 66.28           C  
+ATOM    720  CD  GLU A 109      74.063   8.595 -15.627  1.00 71.94           C  
+ATOM    721  OE1 GLU A 109      75.047   8.572 -16.394  1.00 71.28           O  
+ATOM    722  OE2 GLU A 109      73.604   9.641 -15.086  1.00 75.92           O  
+ATOM    723  N   THR A 110      70.225   5.925 -15.018  1.00 58.14           N  
+ATOM    724  CA  THR A 110      69.530   5.782 -13.740  1.00 55.24           C  
+ATOM    725  C   THR A 110      69.778   4.413 -13.093  1.00 55.15           C  
+ATOM    726  O   THR A 110      70.079   3.442 -13.776  1.00 58.80           O  
+ATOM    727  CB  THR A 110      68.036   6.010 -13.953  1.00 51.82           C  
+ATOM    728  OG1 THR A 110      67.361   6.132 -12.696  1.00 48.23           O  
+ATOM    729  CG2 THR A 110      67.473   4.873 -14.763  1.00 52.12           C  
+ATOM    730  N   GLY A 111      69.694   4.355 -11.768  1.00 55.41           N  
+ATOM    731  CA  GLY A 111      69.892   3.112 -11.042  1.00 54.73           C  
+ATOM    732  C   GLY A 111      68.552   2.685 -10.469  1.00 55.25           C  
+ATOM    733  O   GLY A 111      67.887   1.809 -10.999  1.00 56.63           O  
+ATOM    734  N   ALA A 112      68.145   3.317  -9.381  1.00 56.47           N  
+ATOM    735  CA  ALA A 112      66.866   3.018  -8.766  1.00 57.06           C  
+ATOM    736  C   ALA A 112      65.791   3.522  -9.708  1.00 58.71           C  
+ATOM    737  O   ALA A 112      64.703   2.981  -9.777  1.00 58.44           O  
+ATOM    738  CB  ALA A 112      66.755   3.743  -7.444  1.00 59.48           C  
+ATOM    739  N   GLY A 113      66.106   4.579 -10.437  1.00 60.34           N  
+ATOM    740  CA  GLY A 113      65.134   5.134 -11.344  1.00 60.31           C  
+ATOM    741  C   GLY A 113      64.682   6.511 -10.904  1.00 62.93           C  
+ATOM    742  O   GLY A 113      63.969   7.169 -11.656  1.00 64.06           O  
+ATOM    743  N   GLN A 114      65.064   6.967  -9.707  1.00 63.02           N  
+ATOM    744  CA  GLN A 114      64.637   8.304  -9.294  1.00 62.88           C  
+ATOM    745  C   GLN A 114      65.142   9.342 -10.294  1.00 60.76           C  
+ATOM    746  O   GLN A 114      64.342  10.061 -10.897  1.00 59.55           O  
+ATOM    747  CB  GLN A 114      65.133   8.659  -7.894  1.00 67.90           C  
+ATOM    748  CG  GLN A 114      64.336   8.036  -6.749  1.00 74.36           C  
+ATOM    749  CD  GLN A 114      64.755   8.585  -5.369  1.00 79.89           C  
+ATOM    750  OE1 GLN A 114      65.941   8.569  -5.003  1.00 80.85           O  
+ATOM    751  NE2 GLN A 114      63.773   9.072  -4.598  1.00 81.89           N  
+ATOM    752  N   HIS A 115      66.459   9.417 -10.484  1.00 57.94           N  
+ATOM    753  CA  HIS A 115      67.020  10.377 -11.438  1.00 54.19           C  
+ATOM    754  C   HIS A 115      66.333  10.259 -12.811  1.00 53.03           C  
+ATOM    755  O   HIS A 115      65.923  11.272 -13.408  1.00 50.67           O  
+ATOM    756  CB  HIS A 115      68.518  10.167 -11.596  1.00 51.49           C  
+ATOM    757  CG  HIS A 115      69.168  11.172 -12.492  1.00 54.08           C  
+ATOM    758  ND1 HIS A 115      69.189  12.520 -12.208  1.00 55.53           N  
+ATOM    759  CD2 HIS A 115      69.791  11.032 -13.689  1.00 57.28           C  
+ATOM    760  CE1 HIS A 115      69.789  13.166 -13.193  1.00 56.75           C  
+ATOM    761  NE2 HIS A 115      70.164  12.287 -14.105  1.00 55.82           N  
+ATOM    762  N   GLY A 116      66.206   9.032 -13.312  1.00 50.22           N  
+ATOM    763  CA  GLY A 116      65.533   8.849 -14.588  1.00 48.97           C  
+ATOM    764  C   GLY A 116      64.137   9.476 -14.620  1.00 47.08           C  
+ATOM    765  O   GLY A 116      63.782  10.187 -15.564  1.00 48.46           O  
+ATOM    766  N   VAL A 117      63.340   9.213 -13.588  1.00 43.86           N  
+ATOM    767  CA  VAL A 117      61.997   9.752 -13.512  1.00 41.03           C  
+ATOM    768  C   VAL A 117      62.061  11.257 -13.440  1.00 43.13           C  
+ATOM    769  O   VAL A 117      61.152  11.928 -13.898  1.00 43.82           O  
+ATOM    770  CB  VAL A 117      61.239   9.254 -12.267  1.00 39.62           C  
+ATOM    771  CG1 VAL A 117      59.868   9.911 -12.208  1.00 35.53           C  
+ATOM    772  CG2 VAL A 117      61.106   7.726 -12.289  1.00 34.51           C  
+ATOM    773  N   ALA A 118      63.127  11.796 -12.849  1.00 45.06           N  
+ATOM    774  CA  ALA A 118      63.279  13.256 -12.748  1.00 45.08           C  
+ATOM    775  C   ALA A 118      63.581  13.849 -14.149  1.00 46.88           C  
+ATOM    776  O   ALA A 118      62.997  14.873 -14.547  1.00 48.69           O  
+ATOM    777  CB  ALA A 118      64.387  13.615 -11.742  1.00 34.15           C  
+ATOM    778  N   SER A 119      64.461  13.191 -14.903  1.00 45.31           N  
+ATOM    779  CA  SER A 119      64.804  13.655 -16.237  1.00 45.50           C  
+ATOM    780  C   SER A 119      63.608  13.580 -17.193  1.00 47.92           C  
+ATOM    781  O   SER A 119      63.393  14.469 -18.025  1.00 47.58           O  
+ATOM    782  CB  SER A 119      65.935  12.816 -16.757  1.00 43.78           C  
+ATOM    783  OG  SER A 119      66.829  12.605 -15.697  1.00 46.90           O  
+ATOM    784  N   ALA A 120      62.829  12.513 -17.082  1.00 48.74           N  
+ATOM    785  CA  ALA A 120      61.649  12.356 -17.925  1.00 49.95           C  
+ATOM    786  C   ALA A 120      60.666  13.509 -17.687  1.00 50.28           C  
+ATOM    787  O   ALA A 120      60.184  14.144 -18.625  1.00 50.67           O  
+ATOM    788  CB  ALA A 120      60.971  11.028 -17.610  1.00 49.86           C  
+ATOM    789  N   LEU A 121      60.380  13.752 -16.412  1.00 50.85           N  
+ATOM    790  CA  LEU A 121      59.469  14.788 -15.966  1.00 49.71           C  
+ATOM    791  C   LEU A 121      59.929  16.126 -16.497  1.00 49.65           C  
+ATOM    792  O   LEU A 121      59.201  16.792 -17.243  1.00 49.62           O  
+ATOM    793  CB  LEU A 121      59.461  14.803 -14.448  1.00 53.68           C  
+ATOM    794  CG  LEU A 121      58.723  15.866 -13.639  1.00 56.53           C  
+ATOM    795  CD1 LEU A 121      58.785  15.460 -12.180  1.00 58.69           C  
+ATOM    796  CD2 LEU A 121      59.348  17.231 -13.806  1.00 56.57           C  
+ATOM    797  N   ALA A 122      61.142  16.523 -16.109  1.00 47.58           N  
+ATOM    798  CA  ALA A 122      61.696  17.795 -16.556  1.00 43.91           C  
+ATOM    799  C   ALA A 122      61.599  17.825 -18.063  1.00 44.93           C  
+ATOM    800  O   ALA A 122      61.213  18.839 -18.646  1.00 45.06           O  
+ATOM    801  CB  ALA A 122      63.133  17.931 -16.122  1.00 40.34           C  
+ATOM    802  N   SER A 123      61.922  16.693 -18.691  1.00 46.02           N  
+ATOM    803  CA  SER A 123      61.874  16.587 -20.147  1.00 46.55           C  
+ATOM    804  C   SER A 123      60.496  16.778 -20.750  1.00 47.03           C  
+ATOM    805  O   SER A 123      60.339  17.551 -21.685  1.00 47.72           O  
+ATOM    806  CB  SER A 123      62.449  15.252 -20.614  1.00 46.69           C  
+ATOM    807  OG  SER A 123      63.864  15.269 -20.536  1.00 47.64           O  
+ATOM    808  N   ALA A 124      59.484  16.101 -20.225  1.00 47.27           N  
+ATOM    809  CA  ALA A 124      58.159  16.258 -20.813  1.00 49.39           C  
+ATOM    810  C   ALA A 124      57.760  17.715 -20.752  1.00 52.13           C  
+ATOM    811  O   ALA A 124      57.291  18.298 -21.735  1.00 51.65           O  
+ATOM    812  CB  ALA A 124      57.160  15.419 -20.078  1.00 48.98           C  
+ATOM    813  N   LEU A 125      57.963  18.280 -19.567  1.00 54.98           N  
+ATOM    814  CA  LEU A 125      57.661  19.665 -19.247  1.00 54.95           C  
+ATOM    815  C   LEU A 125      58.218  20.644 -20.285  1.00 54.72           C  
+ATOM    816  O   LEU A 125      57.468  21.348 -20.950  1.00 54.08           O  
+ATOM    817  CB  LEU A 125      58.254  19.958 -17.879  1.00 56.33           C  
+ATOM    818  CG  LEU A 125      57.616  21.025 -17.026  1.00 56.16           C  
+ATOM    819  CD1 LEU A 125      56.115  20.796 -17.018  1.00 58.23           C  
+ATOM    820  CD2 LEU A 125      58.204  20.945 -15.620  1.00 55.97           C  
+ATOM    821  N   LEU A 126      59.534  20.695 -20.424  1.00 53.63           N  
+ATOM    822  CA  LEU A 126      60.125  21.606 -21.386  1.00 55.31           C  
+ATOM    823  C   LEU A 126      60.086  21.039 -22.807  1.00 56.74           C  
+ATOM    824  O   LEU A 126      60.758  21.552 -23.696  1.00 58.28           O  
+ATOM    825  CB  LEU A 126      61.575  21.895 -21.017  1.00 55.44           C  
+ATOM    826  CG  LEU A 126      61.822  22.196 -19.554  1.00 54.85           C  
+ATOM    827  CD1 LEU A 126      63.282  22.437 -19.335  1.00 59.21           C  
+ATOM    828  CD2 LEU A 126      61.056  23.402 -19.166  1.00 55.97           C  
+ATOM    829  N   GLY A 127      59.329  19.969 -23.017  1.00 54.99           N  
+ATOM    830  CA  GLY A 127      59.245  19.394 -24.345  1.00 53.74           C  
+ATOM    831  C   GLY A 127      60.550  18.918 -24.966  1.00 54.55           C  
+ATOM    832  O   GLY A 127      60.834  19.206 -26.123  1.00 57.21           O  
+ATOM    833  N   LEU A 128      61.356  18.182 -24.220  1.00 53.71           N  
+ATOM    834  CA  LEU A 128      62.602  17.666 -24.763  1.00 51.78           C  
+ATOM    835  C   LEU A 128      62.484  16.146 -24.934  1.00 52.26           C  
+ATOM    836  O   LEU A 128      61.805  15.479 -24.144  1.00 53.26           O  
+ATOM    837  CB  LEU A 128      63.749  18.010 -23.821  1.00 49.02           C  
+ATOM    838  CG  LEU A 128      64.014  19.504 -23.645  1.00 47.07           C  
+ATOM    839  CD1 LEU A 128      65.041  19.714 -22.549  1.00 45.27           C  
+ATOM    840  CD2 LEU A 128      64.518  20.088 -24.950  1.00 45.15           C  
+ATOM    841  N   LYS A 129      63.113  15.605 -25.980  1.00 52.27           N  
+ATOM    842  CA  LYS A 129      63.083  14.164 -26.225  1.00 52.22           C  
+ATOM    843  C   LYS A 129      64.086  13.556 -25.276  1.00 51.64           C  
+ATOM    844  O   LYS A 129      65.282  13.863 -25.318  1.00 54.34           O  
+ATOM    845  CB  LYS A 129      63.452  13.834 -27.666  1.00 53.99           C  
+ATOM    846  CG  LYS A 129      62.293  14.001 -28.600  1.00 62.36           C  
+ATOM    847  CD  LYS A 129      62.620  13.502 -30.015  1.00 72.50           C  
+ATOM    848  CE  LYS A 129      61.403  13.657 -30.987  1.00 76.91           C  
+ATOM    849  NZ  LYS A 129      60.114  12.997 -30.524  1.00 77.53           N  
+ATOM    850  N   CYS A 130      63.600  12.664 -24.433  1.00 48.23           N  
+ATOM    851  CA  CYS A 130      64.436  12.067 -23.413  1.00 46.24           C  
+ATOM    852  C   CYS A 130      64.762  10.574 -23.566  1.00 45.28           C  
+ATOM    853  O   CYS A 130      63.884   9.753 -23.813  1.00 45.88           O  
+ATOM    854  CB  CYS A 130      63.722  12.334 -22.078  1.00 46.83           C  
+ATOM    855  SG  CYS A 130      64.522  11.816 -20.582  1.00 51.09           S  
+ATOM    856  N   ARG A 131      66.031  10.215 -23.465  1.00 44.19           N  
+ATOM    857  CA  ARG A 131      66.364   8.801 -23.488  1.00 44.25           C  
+ATOM    858  C   ARG A 131      67.241   8.489 -22.268  1.00 46.99           C  
+ATOM    859  O   ARG A 131      68.248   9.163 -21.997  1.00 45.14           O  
+ATOM    860  CB  ARG A 131      67.023   8.372 -24.798  1.00 43.41           C  
+ATOM    861  CG  ARG A 131      68.155   9.177 -25.313  1.00 40.81           C  
+ATOM    862  CD  ARG A 131      68.643   8.505 -26.570  1.00 41.97           C  
+ATOM    863  NE  ARG A 131      69.818   9.158 -27.135  1.00 45.75           N  
+ATOM    864  CZ  ARG A 131      69.782  10.308 -27.788  1.00 44.38           C  
+ATOM    865  NH1 ARG A 131      68.630  10.932 -27.956  1.00 45.69           N  
+ATOM    866  NH2 ARG A 131      70.891  10.819 -28.281  1.00 46.34           N  
+ATOM    867  N   ILE A 132      66.826   7.467 -21.524  1.00 47.75           N  
+ATOM    868  CA  ILE A 132      67.492   7.079 -20.291  1.00 48.43           C  
+ATOM    869  C   ILE A 132      68.149   5.687 -20.232  1.00 50.06           C  
+ATOM    870  O   ILE A 132      67.457   4.665 -20.253  1.00 50.48           O  
+ATOM    871  CB  ILE A 132      66.478   7.181 -19.162  1.00 48.12           C  
+ATOM    872  CG1 ILE A 132      65.794   8.552 -19.249  1.00 49.89           C  
+ATOM    873  CG2 ILE A 132      67.154   6.914 -17.830  1.00 49.31           C  
+ATOM    874  CD1 ILE A 132      64.613   8.756 -18.328  1.00 48.98           C  
+ATOM    875  N   TYR A 133      69.479   5.643 -20.159  1.00 49.90           N  
+ATOM    876  CA  TYR A 133      70.168   4.367 -20.049  1.00 49.57           C  
+ATOM    877  C   TYR A 133      69.979   3.860 -18.640  1.00 49.99           C  
+ATOM    878  O   TYR A 133      70.015   4.620 -17.686  1.00 49.74           O  
+ATOM    879  CB  TYR A 133      71.651   4.507 -20.363  1.00 48.70           C  
+ATOM    880  CG  TYR A 133      71.861   4.793 -21.817  1.00 52.69           C  
+ATOM    881  CD1 TYR A 133      71.739   3.785 -22.771  1.00 51.30           C  
+ATOM    882  CD2 TYR A 133      72.029   6.099 -22.262  1.00 52.68           C  
+ATOM    883  CE1 TYR A 133      71.758   4.080 -24.113  1.00 51.01           C  
+ATOM    884  CE2 TYR A 133      72.059   6.398 -23.606  1.00 51.12           C  
+ATOM    885  CZ  TYR A 133      71.915   5.393 -24.523  1.00 50.42           C  
+ATOM    886  OH  TYR A 133      71.890   5.724 -25.857  1.00 51.57           O  
+ATOM    887  N   MET A 134      69.759   2.559 -18.528  1.00 51.96           N  
+ATOM    888  CA  MET A 134      69.531   1.905 -17.254  1.00 51.46           C  
+ATOM    889  C   MET A 134      70.027   0.452 -17.345  1.00 53.83           C  
+ATOM    890  O   MET A 134      69.715  -0.253 -18.307  1.00 54.17           O  
+ATOM    891  CB  MET A 134      68.031   1.945 -16.934  1.00 46.43           C  
+ATOM    892  CG  MET A 134      67.686   1.383 -15.597  1.00 45.93           C  
+ATOM    893  SD  MET A 134      65.963   1.628 -15.158  1.00 52.98           S  
+ATOM    894  CE  MET A 134      66.058   1.586 -13.363  1.00 43.17           C  
+ATOM    895  N   GLY A 135      70.827   0.015 -16.370  1.00 55.82           N  
+ATOM    896  CA  GLY A 135      71.294  -1.366 -16.384  1.00 55.18           C  
+ATOM    897  C   GLY A 135      70.140  -2.376 -16.403  1.00 56.04           C  
+ATOM    898  O   GLY A 135      69.116  -2.247 -15.697  1.00 53.35           O  
+ATOM    899  N   ALA A 136      70.312  -3.404 -17.224  1.00 57.19           N  
+ATOM    900  CA  ALA A 136      69.309  -4.443 -17.381  1.00 57.18           C  
+ATOM    901  C   ALA A 136      68.795  -4.980 -16.049  1.00 58.66           C  
+ATOM    902  O   ALA A 136      67.587  -5.175 -15.879  1.00 55.54           O  
+ATOM    903  CB  ALA A 136      69.879  -5.549 -18.206  1.00 58.15           C  
+ATOM    904  N   LYS A 137      69.712  -5.219 -15.111  1.00 61.50           N  
+ATOM    905  CA  LYS A 137      69.344  -5.719 -13.776  1.00 64.87           C  
+ATOM    906  C   LYS A 137      68.414  -4.750 -13.052  1.00 65.84           C  
+ATOM    907  O   LYS A 137      67.438  -5.164 -12.403  1.00 67.63           O  
+ATOM    908  CB  LYS A 137      70.584  -5.935 -12.904  1.00 64.65           C  
+ATOM    909  CG  LYS A 137      71.465  -7.074 -13.361  1.00 67.98           C  
+ATOM    910  CD  LYS A 137      72.721  -7.152 -12.519  1.00 69.14           C  
+ATOM    911  CE  LYS A 137      73.659  -8.230 -13.028  1.00 69.83           C  
+ATOM    912  NZ  LYS A 137      74.975  -8.139 -12.340  1.00 72.91           N  
+ATOM    913  N   ASP A 138      68.723  -3.460 -13.163  1.00 64.83           N  
+ATOM    914  CA  ASP A 138      67.919  -2.443 -12.523  1.00 61.79           C  
+ATOM    915  C   ASP A 138      66.580  -2.342 -13.204  1.00 59.39           C  
+ATOM    916  O   ASP A 138      65.570  -2.158 -12.538  1.00 58.65           O  
+ATOM    917  CB  ASP A 138      68.631  -1.093 -12.554  1.00 65.28           C  
+ATOM    918  CG  ASP A 138      69.930  -1.104 -11.765  1.00 68.17           C  
+ATOM    919  OD1 ASP A 138      69.911  -1.556 -10.604  1.00 69.43           O  
+ATOM    920  OD2 ASP A 138      70.970  -0.656 -12.299  1.00 73.00           O  
+ATOM    921  N   VAL A 139      66.558  -2.478 -14.526  1.00 55.75           N  
+ATOM    922  CA  VAL A 139      65.293  -2.391 -15.246  1.00 54.56           C  
+ATOM    923  C   VAL A 139      64.321  -3.435 -14.730  1.00 56.51           C  
+ATOM    924  O   VAL A 139      63.112  -3.194 -14.649  1.00 54.19           O  
+ATOM    925  CB  VAL A 139      65.499  -2.612 -16.733  1.00 52.98           C  
+ATOM    926  CG1 VAL A 139      64.206  -2.346 -17.489  1.00 48.93           C  
+ATOM    927  CG2 VAL A 139      66.612  -1.711 -17.218  1.00 54.28           C  
+ATOM    928  N   GLU A 140      64.876  -4.599 -14.383  1.00 61.04           N  
+ATOM    929  CA  GLU A 140      64.129  -5.744 -13.858  1.00 62.21           C  
+ATOM    930  C   GLU A 140      63.643  -5.459 -12.467  1.00 62.37           C  
+ATOM    931  O   GLU A 140      62.448  -5.551 -12.191  1.00 62.67           O  
+ATOM    932  CB  GLU A 140      65.023  -6.959 -13.787  1.00 67.19           C  
+ATOM    933  CG  GLU A 140      64.837  -7.956 -14.895  1.00 77.76           C  
+ATOM    934  CD  GLU A 140      66.072  -8.836 -15.046  1.00 83.93           C  
+ATOM    935  OE1 GLU A 140      66.635  -9.258 -13.992  1.00 83.57           O  
+ATOM    936  OE2 GLU A 140      66.476  -9.095 -16.215  1.00 87.80           O  
+ATOM    937  N   ARG A 141      64.577  -5.119 -11.583  1.00 60.69           N  
+ATOM    938  CA  ARG A 141      64.200  -4.829 -10.219  1.00 61.61           C  
+ATOM    939  C   ARG A 141      63.626  -3.422 -10.095  1.00 61.77           C  
+ATOM    940  O   ARG A 141      63.727  -2.827  -9.040  1.00 65.58           O  
+ATOM    941  CB  ARG A 141      65.403  -5.025  -9.261  1.00 62.05           C  
+ATOM    942  CG  ARG A 141      66.546  -4.001  -9.347  1.00 71.25           C  
+ATOM    943  CD  ARG A 141      67.712  -4.228  -8.310  1.00 74.98           C  
+ATOM    944  NE  ARG A 141      68.930  -4.861  -8.877  1.00 80.88           N  
+ATOM    945  CZ  ARG A 141      70.143  -4.285  -8.976  1.00 82.05           C  
+ATOM    946  NH1 ARG A 141      70.331  -3.043  -8.548  1.00 85.40           N  
+ATOM    947  NH2 ARG A 141      71.186  -4.948  -9.492  1.00 77.91           N  
+ATOM    948  N   GLN A 142      62.987  -2.892 -11.137  1.00 59.77           N  
+ATOM    949  CA  GLN A 142      62.489  -1.518 -11.052  1.00 58.95           C  
+ATOM    950  C   GLN A 142      61.318  -1.148 -11.927  1.00 60.25           C  
+ATOM    951  O   GLN A 142      61.188  -0.005 -12.370  1.00 60.28           O  
+ATOM    952  CB  GLN A 142      63.617  -0.532 -11.354  1.00 58.24           C  
+ATOM    953  CG  GLN A 142      64.630  -0.383 -10.248  1.00 55.66           C  
+ATOM    954  CD  GLN A 142      63.986   0.056  -8.954  1.00 54.55           C  
+ATOM    955  OE1 GLN A 142      64.630   0.062  -7.909  1.00 52.04           O  
+ATOM    956  NE2 GLN A 142      62.702   0.429  -9.019  1.00 53.06           N  
+ATOM    957  N   SER A 143      60.452  -2.111 -12.167  1.00 62.06           N  
+ATOM    958  CA  SER A 143      59.278  -1.890 -12.999  1.00 61.40           C  
+ATOM    959  C   SER A 143      58.574  -0.550 -12.818  1.00 57.88           C  
+ATOM    960  O   SER A 143      58.358   0.157 -13.788  1.00 58.02           O  
+ATOM    961  CB  SER A 143      58.295  -3.025 -12.758  1.00 64.08           C  
+ATOM    962  OG  SER A 143      58.864  -3.917 -11.799  1.00 71.74           O  
+ATOM    963  N   PRO A 144      58.212  -0.182 -11.576  1.00 57.13           N  
+ATOM    964  CA  PRO A 144      57.517   1.076 -11.270  1.00 56.48           C  
+ATOM    965  C   PRO A 144      58.086   2.336 -11.899  1.00 56.14           C  
+ATOM    966  O   PRO A 144      57.398   3.009 -12.684  1.00 55.03           O  
+ATOM    967  CB  PRO A 144      57.557   1.119  -9.755  1.00 56.42           C  
+ATOM    968  CG  PRO A 144      57.419  -0.298  -9.407  1.00 56.09           C  
+ATOM    969  CD  PRO A 144      58.423  -0.941 -10.335  1.00 56.94           C  
+ATOM    970  N   ASN A 145      59.327   2.659 -11.541  1.00 54.85           N  
+ATOM    971  CA  ASN A 145      59.985   3.831 -12.090  1.00 53.47           C  
+ATOM    972  C   ASN A 145      60.160   3.709 -13.604  1.00 52.95           C  
+ATOM    973  O   ASN A 145      60.055   4.701 -14.332  1.00 54.54           O  
+ATOM    974  CB  ASN A 145      61.331   4.047 -11.410  1.00 55.16           C  
+ATOM    975  CG  ASN A 145      61.198   4.765 -10.084  1.00 55.97           C  
+ATOM    976  OD1 ASN A 145      60.166   5.389  -9.803  1.00 58.87           O  
+ATOM    977  ND2 ASN A 145      62.245   4.702  -9.268  1.00 53.66           N  
+ATOM    978  N   VAL A 146      60.429   2.501 -14.087  1.00 50.20           N  
+ATOM    979  CA  VAL A 146      60.550   2.310 -15.523  1.00 48.70           C  
+ATOM    980  C   VAL A 146      59.198   2.613 -16.195  1.00 49.97           C  
+ATOM    981  O   VAL A 146      59.153   3.250 -17.234  1.00 50.04           O  
+ATOM    982  CB  VAL A 146      60.996   0.870 -15.858  1.00 46.21           C  
+ATOM    983  CG1 VAL A 146      60.894   0.619 -17.373  1.00 40.91           C  
+ATOM    984  CG2 VAL A 146      62.437   0.660 -15.370  1.00 44.79           C  
+ATOM    985  N   PHE A 147      58.101   2.160 -15.585  1.00 52.49           N  
+ATOM    986  CA  PHE A 147      56.761   2.394 -16.108  1.00 52.40           C  
+ATOM    987  C   PHE A 147      56.484   3.889 -16.084  1.00 55.14           C  
+ATOM    988  O   PHE A 147      55.825   4.437 -16.983  1.00 55.78           O  
+ATOM    989  CB  PHE A 147      55.719   1.659 -15.256  1.00 50.27           C  
+ATOM    990  CG  PHE A 147      54.278   1.922 -15.678  1.00 50.78           C  
+ATOM    991  CD1 PHE A 147      53.906   1.881 -17.014  1.00 47.73           C  
+ATOM    992  CD2 PHE A 147      53.295   2.203 -14.727  1.00 48.14           C  
+ATOM    993  CE1 PHE A 147      52.600   2.114 -17.389  1.00 47.07           C  
+ATOM    994  CE2 PHE A 147      51.984   2.434 -15.101  1.00 45.47           C  
+ATOM    995  CZ  PHE A 147      51.638   2.391 -16.433  1.00 48.18           C  
+ATOM    996  N   ARG A 148      56.989   4.549 -15.045  1.00 55.98           N  
+ATOM    997  CA  ARG A 148      56.806   5.995 -14.901  1.00 56.32           C  
+ATOM    998  C   ARG A 148      57.543   6.767 -15.993  1.00 52.88           C  
+ATOM    999  O   ARG A 148      56.976   7.651 -16.640  1.00 51.49           O  
+ATOM   1000  CB  ARG A 148      57.313   6.477 -13.536  1.00 58.88           C  
+ATOM   1001  CG  ARG A 148      56.343   6.285 -12.398  1.00 60.17           C  
+ATOM   1002  CD  ARG A 148      56.851   6.942 -11.111  1.00 62.22           C  
+ATOM   1003  NE  ARG A 148      56.000   6.555  -9.993  1.00 62.87           N  
+ATOM   1004  CZ  ARG A 148      56.227   5.504  -9.213  1.00 65.31           C  
+ATOM   1005  NH1 ARG A 148      57.303   4.739  -9.414  1.00 62.13           N  
+ATOM   1006  NH2 ARG A 148      55.345   5.186  -8.267  1.00 64.75           N  
+ATOM   1007  N   MET A 149      58.814   6.444 -16.177  1.00 48.46           N  
+ATOM   1008  CA  MET A 149      59.586   7.134 -17.180  1.00 48.49           C  
+ATOM   1009  C   MET A 149      58.887   6.989 -18.517  1.00 49.87           C  
+ATOM   1010  O   MET A 149      58.688   7.970 -19.240  1.00 50.95           O  
+ATOM   1011  CB  MET A 149      60.999   6.563 -17.250  1.00 45.87           C  
+ATOM   1012  CG  MET A 149      61.741   6.652 -15.952  1.00 44.71           C  
+ATOM   1013  SD  MET A 149      63.428   6.145 -16.154  1.00 52.04           S  
+ATOM   1014  CE  MET A 149      63.490   4.657 -15.155  1.00 48.36           C  
+ATOM   1015  N   ARG A 150      58.490   5.763 -18.840  1.00 50.93           N  
+ATOM   1016  CA  ARG A 150      57.822   5.510 -20.102  1.00 49.46           C  
+ATOM   1017  C   ARG A 150      56.524   6.279 -20.176  1.00 48.16           C  
+ATOM   1018  O   ARG A 150      56.265   6.951 -21.154  1.00 46.64           O  
+ATOM   1019  CB  ARG A 150      57.610   4.010 -20.290  1.00 49.35           C  
+ATOM   1020  CG  ARG A 150      58.892   3.348 -20.759  1.00 53.64           C  
+ATOM   1021  CD  ARG A 150      58.809   1.840 -20.864  1.00 58.72           C  
+ATOM   1022  NE  ARG A 150      60.151   1.277 -21.033  1.00 65.73           N  
+ATOM   1023  CZ  ARG A 150      60.442  -0.017 -20.908  1.00 69.20           C  
+ATOM   1024  NH1 ARG A 150      59.465  -0.879 -20.616  1.00 69.44           N  
+ATOM   1025  NH2 ARG A 150      61.705  -0.446 -21.048  1.00 65.89           N  
+ATOM   1026  N   LEU A 151      55.728   6.205 -19.119  1.00 48.10           N  
+ATOM   1027  CA  LEU A 151      54.457   6.913 -19.055  1.00 48.83           C  
+ATOM   1028  C   LEU A 151      54.652   8.394 -19.395  1.00 51.31           C  
+ATOM   1029  O   LEU A 151      53.835   9.030 -20.084  1.00 50.80           O  
+ATOM   1030  CB  LEU A 151      53.913   6.767 -17.649  1.00 46.72           C  
+ATOM   1031  CG  LEU A 151      52.485   6.282 -17.457  1.00 49.67           C  
+ATOM   1032  CD1 LEU A 151      51.996   5.358 -18.563  1.00 46.19           C  
+ATOM   1033  CD2 LEU A 151      52.486   5.574 -16.125  1.00 50.76           C  
+ATOM   1034  N   MET A 152      55.764   8.926 -18.898  1.00 54.15           N  
+ATOM   1035  CA  MET A 152      56.145  10.316 -19.086  1.00 54.61           C  
+ATOM   1036  C   MET A 152      56.643  10.557 -20.511  1.00 54.06           C  
+ATOM   1037  O   MET A 152      56.962  11.674 -20.904  1.00 56.84           O  
+ATOM   1038  CB  MET A 152      57.226  10.676 -18.071  1.00 55.93           C  
+ATOM   1039  CG  MET A 152      56.932  11.928 -17.280  1.00 57.91           C  
+ATOM   1040  SD  MET A 152      56.792  11.579 -15.529  1.00 59.04           S  
+ATOM   1041  CE  MET A 152      58.450  11.088 -15.131  1.00 55.03           C  
+ATOM   1042  N   GLY A 153      56.742   9.500 -21.290  1.00 52.05           N  
+ATOM   1043  CA  GLY A 153      57.162   9.691 -22.657  1.00 48.08           C  
+ATOM   1044  C   GLY A 153      58.624   9.509 -22.919  1.00 47.34           C  
+ATOM   1045  O   GLY A 153      59.048   9.693 -24.042  1.00 47.45           O  
+ATOM   1046  N   ALA A 154      59.408   9.159 -21.909  1.00 48.51           N  
+ATOM   1047  CA  ALA A 154      60.835   8.981 -22.139  1.00 47.72           C  
+ATOM   1048  C   ALA A 154      61.006   7.602 -22.697  1.00 49.69           C  
+ATOM   1049  O   ALA A 154      60.067   6.813 -22.715  1.00 53.13           O  
+ATOM   1050  CB  ALA A 154      61.627   9.123 -20.857  1.00 43.66           C  
+ATOM   1051  N   GLU A 155      62.215   7.326 -23.150  1.00 51.61           N  
+ATOM   1052  CA  GLU A 155      62.576   6.059 -23.738  1.00 52.95           C  
+ATOM   1053  C   GLU A 155      63.634   5.435 -22.840  1.00 53.85           C  
+ATOM   1054  O   GLU A 155      64.684   6.039 -22.619  1.00 56.14           O  
+ATOM   1055  CB  GLU A 155      63.127   6.324 -25.130  1.00 53.61           C  
+ATOM   1056  CG  GLU A 155      63.742   5.138 -25.776  1.00 63.31           C  
+ATOM   1057  CD  GLU A 155      64.307   5.464 -27.137  1.00 68.73           C  
+ATOM   1058  OE1 GLU A 155      65.089   6.446 -27.244  1.00 70.54           O  
+ATOM   1059  OE2 GLU A 155      63.969   4.734 -28.103  1.00 74.48           O  
+ATOM   1060  N   VAL A 156      63.367   4.237 -22.322  1.00 53.99           N  
+ATOM   1061  CA  VAL A 156      64.311   3.563 -21.426  1.00 53.44           C  
+ATOM   1062  C   VAL A 156      65.137   2.519 -22.153  1.00 53.00           C  
+ATOM   1063  O   VAL A 156      64.629   1.496 -22.543  1.00 56.37           O  
+ATOM   1064  CB  VAL A 156      63.598   2.829 -20.254  1.00 53.25           C  
+ATOM   1065  CG1 VAL A 156      64.641   2.365 -19.250  1.00 54.90           C  
+ATOM   1066  CG2 VAL A 156      62.568   3.728 -19.574  1.00 50.42           C  
+ATOM   1067  N   ILE A 157      66.424   2.764 -22.300  1.00 52.26           N  
+ATOM   1068  CA  ILE A 157      67.314   1.837 -22.989  1.00 49.13           C  
+ATOM   1069  C   ILE A 157      68.007   0.934 -21.971  1.00 49.48           C  
+ATOM   1070  O   ILE A 157      68.807   1.398 -21.166  1.00 47.65           O  
+ATOM   1071  CB  ILE A 157      68.379   2.633 -23.766  1.00 47.79           C  
+ATOM   1072  CG1 ILE A 157      67.688   3.502 -24.809  1.00 43.99           C  
+ATOM   1073  CG2 ILE A 157      69.414   1.718 -24.348  1.00 41.35           C  
+ATOM   1074  CD1 ILE A 157      68.607   4.461 -25.427  1.00 46.06           C  
+ATOM   1075  N   PRO A 158      67.693  -0.371 -21.977  1.00 50.07           N  
+ATOM   1076  CA  PRO A 158      68.361  -1.239 -21.004  1.00 48.36           C  
+ATOM   1077  C   PRO A 158      69.780  -1.503 -21.464  1.00 48.52           C  
+ATOM   1078  O   PRO A 158      70.079  -1.457 -22.653  1.00 51.27           O  
+ATOM   1079  CB  PRO A 158      67.496  -2.494 -21.005  1.00 46.68           C  
+ATOM   1080  CG  PRO A 158      67.037  -2.569 -22.418  1.00 48.18           C  
+ATOM   1081  CD  PRO A 158      66.685  -1.120 -22.748  1.00 49.12           C  
+ATOM   1082  N   VAL A 159      70.664  -1.766 -20.522  1.00 48.63           N  
+ATOM   1083  CA  VAL A 159      72.038  -2.031 -20.866  1.00 47.27           C  
+ATOM   1084  C   VAL A 159      72.456  -3.369 -20.301  1.00 51.16           C  
+ATOM   1085  O   VAL A 159      72.329  -3.602 -19.107  1.00 51.72           O  
+ATOM   1086  CB  VAL A 159      72.940  -0.987 -20.289  1.00 44.16           C  
+ATOM   1087  CG1 VAL A 159      74.360  -1.264 -20.723  1.00 44.75           C  
+ATOM   1088  CG2 VAL A 159      72.472   0.380 -20.694  1.00 39.97           C  
+ATOM   1089  N   HIS A 160      72.950  -4.254 -21.161  1.00 55.36           N  
+ATOM   1090  CA  HIS A 160      73.394  -5.566 -20.708  1.00 56.28           C  
+ATOM   1091  C   HIS A 160      74.901  -5.737 -20.756  1.00 57.26           C  
+ATOM   1092  O   HIS A 160      75.406  -6.725 -20.241  1.00 59.94           O  
+ATOM   1093  CB  HIS A 160      72.782  -6.687 -21.539  1.00 53.93           C  
+ATOM   1094  CG  HIS A 160      71.297  -6.682 -21.557  1.00 54.34           C  
+ATOM   1095  ND1 HIS A 160      70.574  -5.782 -22.304  1.00 56.63           N  
+ATOM   1096  CD2 HIS A 160      70.391  -7.486 -20.950  1.00 55.41           C  
+ATOM   1097  CE1 HIS A 160      69.284  -6.035 -22.163  1.00 57.79           C  
+ATOM   1098  NE2 HIS A 160      69.145  -7.063 -21.346  1.00 54.27           N  
+ATOM   1099  N   SER A 161      75.625  -4.814 -21.378  1.00 57.02           N  
+ATOM   1100  CA  SER A 161      77.070  -4.972 -21.442  1.00 59.63           C  
+ATOM   1101  C   SER A 161      77.620  -4.868 -20.031  1.00 61.07           C  
+ATOM   1102  O   SER A 161      76.895  -4.474 -19.118  1.00 63.84           O  
+ATOM   1103  CB  SER A 161      77.700  -3.911 -22.356  1.00 62.63           C  
+ATOM   1104  OG  SER A 161      77.388  -2.584 -21.954  1.00 69.49           O  
+ATOM   1105  N   GLY A 162      78.885  -5.241 -19.843  1.00 61.74           N  
+ATOM   1106  CA  GLY A 162      79.489  -5.184 -18.525  1.00 61.11           C  
+ATOM   1107  C   GLY A 162      78.619  -5.796 -17.434  1.00 62.45           C  
+ATOM   1108  O   GLY A 162      77.911  -6.777 -17.655  1.00 61.38           O  
+ATOM   1109  N   SER A 163      78.678  -5.208 -16.246  1.00 63.68           N  
+ATOM   1110  CA  SER A 163      77.906  -5.676 -15.102  1.00 64.46           C  
+ATOM   1111  C   SER A 163      76.384  -5.568 -15.262  1.00 63.98           C  
+ATOM   1112  O   SER A 163      75.629  -6.099 -14.437  1.00 60.36           O  
+ATOM   1113  CB  SER A 163      78.321  -4.885 -13.865  1.00 66.40           C  
+ATOM   1114  OG  SER A 163      77.469  -5.199 -12.777  1.00 71.79           O  
+ATOM   1115  N   ALA A 164      75.943  -4.872 -16.310  1.00 63.90           N  
+ATOM   1116  CA  ALA A 164      74.521  -4.664 -16.570  1.00 64.03           C  
+ATOM   1117  C   ALA A 164      73.930  -3.889 -15.419  1.00 65.23           C  
+ATOM   1118  O   ALA A 164      72.853  -4.221 -14.906  1.00 64.22           O  
+ATOM   1119  CB  ALA A 164      73.797  -5.972 -16.710  1.00 65.28           C  
+ATOM   1120  N   THR A 165      74.649  -2.851 -15.017  1.00 65.10           N  
+ATOM   1121  CA  THR A 165      74.208  -2.009 -13.925  1.00 66.70           C  
+ATOM   1122  C   THR A 165      74.591  -0.552 -14.149  1.00 65.70           C  
+ATOM   1123  O   THR A 165      75.086  -0.180 -15.211  1.00 64.21           O  
+ATOM   1124  CB  THR A 165      74.791  -2.477 -12.579  1.00 67.09           C  
+ATOM   1125  OG1 THR A 165      76.224  -2.536 -12.662  1.00 70.16           O  
+ATOM   1126  CG2 THR A 165      74.248  -3.832 -12.232  1.00 68.17           C  
+ATOM   1127  N   LEU A 166      74.371   0.257 -13.120  1.00 64.26           N  
+ATOM   1128  CA  LEU A 166      74.641   1.669 -13.191  1.00 61.67           C  
+ATOM   1129  C   LEU A 166      75.930   2.084 -13.892  1.00 62.08           C  
+ATOM   1130  O   LEU A 166      75.873   2.849 -14.858  1.00 61.93           O  
+ATOM   1131  CB  LEU A 166      74.589   2.279 -11.796  1.00 57.00           C  
+ATOM   1132  CG  LEU A 166      74.342   3.777 -11.907  1.00 53.33           C  
+ATOM   1133  CD1 LEU A 166      72.989   4.080 -12.525  1.00 50.04           C  
+ATOM   1134  CD2 LEU A 166      74.416   4.345 -10.555  1.00 52.62           C  
+ATOM   1135  N   LYS A 167      77.085   1.606 -13.432  1.00 61.72           N  
+ATOM   1136  CA  LYS A 167      78.328   2.022 -14.078  1.00 62.35           C  
+ATOM   1137  C   LYS A 167      78.236   1.743 -15.575  1.00 61.56           C  
+ATOM   1138  O   LYS A 167      78.745   2.493 -16.397  1.00 61.70           O  
+ATOM   1139  CB  LYS A 167      79.551   1.338 -13.448  1.00 62.67           C  
+ATOM   1140  CG  LYS A 167      79.408  -0.159 -13.167  1.00 71.96           C  
+ATOM   1141  CD  LYS A 167      79.086  -0.499 -11.685  1.00 75.18           C  
+ATOM   1142  CE  LYS A 167      77.610  -0.260 -11.316  1.00 76.94           C  
+ATOM   1143  NZ  LYS A 167      77.307  -0.560  -9.876  1.00 76.71           N  
+ATOM   1144  N   ASP A 168      77.543   0.678 -15.934  1.00 60.58           N  
+ATOM   1145  CA  ASP A 168      77.378   0.349 -17.336  1.00 60.65           C  
+ATOM   1146  C   ASP A 168      76.447   1.342 -18.034  1.00 60.19           C  
+ATOM   1147  O   ASP A 168      76.809   1.934 -19.055  1.00 60.17           O  
+ATOM   1148  CB  ASP A 168      76.824  -1.065 -17.460  1.00 62.54           C  
+ATOM   1149  CG  ASP A 168      77.767  -2.092 -16.901  1.00 65.21           C  
+ATOM   1150  OD1 ASP A 168      78.821  -2.302 -17.541  1.00 65.37           O  
+ATOM   1151  OD2 ASP A 168      77.468  -2.668 -15.826  1.00 64.98           O  
+ATOM   1152  N   ALA A 169      75.249   1.518 -17.484  1.00 58.37           N  
+ATOM   1153  CA  ALA A 169      74.277   2.429 -18.058  1.00 57.03           C  
+ATOM   1154  C   ALA A 169      74.898   3.802 -18.130  1.00 57.54           C  
+ATOM   1155  O   ALA A 169      74.631   4.572 -19.046  1.00 57.83           O  
+ATOM   1156  CB  ALA A 169      73.033   2.469 -17.212  1.00 57.84           C  
+ATOM   1157  N   CYS A 170      75.753   4.099 -17.167  1.00 57.96           N  
+ATOM   1158  CA  CYS A 170      76.414   5.386 -17.122  1.00 60.24           C  
+ATOM   1159  C   CYS A 170      77.466   5.534 -18.221  1.00 59.41           C  
+ATOM   1160  O   CYS A 170      77.523   6.538 -18.925  1.00 58.38           O  
+ATOM   1161  CB  CYS A 170      77.057   5.566 -15.760  1.00 62.38           C  
+ATOM   1162  SG  CYS A 170      77.555   7.257 -15.476  1.00 75.35           S  
+ATOM   1163  N   ASN A 171      78.306   4.521 -18.355  1.00 60.62           N  
+ATOM   1164  CA  ASN A 171      79.347   4.516 -19.368  1.00 60.69           C  
+ATOM   1165  C   ASN A 171      78.720   4.602 -20.747  1.00 59.38           C  
+ATOM   1166  O   ASN A 171      79.270   5.218 -21.656  1.00 56.76           O  
+ATOM   1167  CB  ASN A 171      80.162   3.229 -19.253  1.00 64.95           C  
+ATOM   1168  CG  ASN A 171      80.826   2.844 -20.561  1.00 71.53           C  
+ATOM   1169  OD1 ASN A 171      81.916   3.327 -20.886  1.00 74.24           O  
+ATOM   1170  ND2 ASN A 171      80.159   1.973 -21.336  1.00 75.04           N  
+ATOM   1171  N   GLU A 172      77.560   3.973 -20.890  1.00 59.52           N  
+ATOM   1172  CA  GLU A 172      76.843   3.948 -22.150  1.00 61.28           C  
+ATOM   1173  C   GLU A 172      76.227   5.297 -22.511  1.00 60.89           C  
+ATOM   1174  O   GLU A 172      76.291   5.719 -23.662  1.00 60.27           O  
+ATOM   1175  CB  GLU A 172      75.772   2.869 -22.088  1.00 65.87           C  
+ATOM   1176  CG  GLU A 172      75.667   2.021 -23.352  1.00 74.78           C  
+ATOM   1177  CD  GLU A 172      77.033   1.608 -23.933  1.00 80.93           C  
+ATOM   1178  OE1 GLU A 172      77.863   0.987 -23.204  1.00 80.79           O  
+ATOM   1179  OE2 GLU A 172      77.260   1.912 -25.140  1.00 83.75           O  
+ATOM   1180  N   ALA A 173      75.629   5.974 -21.531  1.00 60.87           N  
+ATOM   1181  CA  ALA A 173      75.028   7.292 -21.764  1.00 59.87           C  
+ATOM   1182  C   ALA A 173      76.116   8.240 -22.218  1.00 59.86           C  
+ATOM   1183  O   ALA A 173      75.956   8.969 -23.193  1.00 59.94           O  
+ATOM   1184  CB  ALA A 173      74.395   7.828 -20.494  1.00 57.99           C  
+ATOM   1185  N   LEU A 174      77.224   8.226 -21.489  1.00 60.26           N  
+ATOM   1186  CA  LEU A 174      78.351   9.072 -21.816  1.00 61.22           C  
+ATOM   1187  C   LEU A 174      78.804   8.852 -23.265  1.00 61.55           C  
+ATOM   1188  O   LEU A 174      79.012   9.824 -24.002  1.00 63.41           O  
+ATOM   1189  CB  LEU A 174      79.502   8.807 -20.843  1.00 62.63           C  
+ATOM   1190  CG  LEU A 174      80.266  10.064 -20.397  1.00 65.64           C  
+ATOM   1191  CD1 LEU A 174      79.268  11.101 -19.826  1.00 64.42           C  
+ATOM   1192  CD2 LEU A 174      81.321   9.690 -19.366  1.00 61.54           C  
+ATOM   1193  N   ARG A 175      78.951   7.595 -23.687  1.00 60.06           N  
+ATOM   1194  CA  ARG A 175      79.360   7.318 -25.066  1.00 57.52           C  
+ATOM   1195  C   ARG A 175      78.363   7.927 -26.013  1.00 55.42           C  
+ATOM   1196  O   ARG A 175      78.739   8.500 -27.021  1.00 53.14           O  
+ATOM   1197  CB  ARG A 175      79.438   5.825 -25.329  1.00 60.47           C  
+ATOM   1198  CG  ARG A 175      80.605   5.169 -24.643  1.00 66.12           C  
+ATOM   1199  CD  ARG A 175      80.510   3.680 -24.763  1.00 70.43           C  
+ATOM   1200  NE  ARG A 175      80.502   3.269 -26.159  1.00 77.95           N  
+ATOM   1201  CZ  ARG A 175      80.135   2.056 -26.563  1.00 82.79           C  
+ATOM   1202  NH1 ARG A 175      79.745   1.154 -25.664  1.00 83.98           N  
+ATOM   1203  NH2 ARG A 175      80.167   1.738 -27.856  1.00 85.11           N  
+ATOM   1204  N   ASP A 176      77.083   7.794 -25.674  1.00 54.91           N  
+ATOM   1205  CA  ASP A 176      76.014   8.353 -26.486  1.00 52.10           C  
+ATOM   1206  C   ASP A 176      76.210   9.863 -26.576  1.00 53.09           C  
+ATOM   1207  O   ASP A 176      76.283  10.425 -27.666  1.00 54.43           O  
+ATOM   1208  CB  ASP A 176      74.648   8.055 -25.862  1.00 48.22           C  
+ATOM   1209  CG  ASP A 176      73.488   8.589 -26.701  1.00 49.58           C  
+ATOM   1210  OD1 ASP A 176      73.736   9.339 -27.664  1.00 49.06           O  
+ATOM   1211  OD2 ASP A 176      72.319   8.272 -26.405  1.00 46.50           O  
+ATOM   1212  N   TRP A 177      76.321  10.526 -25.435  1.00 53.49           N  
+ATOM   1213  CA  TRP A 177      76.466  11.968 -25.463  1.00 54.69           C  
+ATOM   1214  C   TRP A 177      77.605  12.401 -26.317  1.00 54.72           C  
+ATOM   1215  O   TRP A 177      77.441  13.262 -27.181  1.00 55.63           O  
+ATOM   1216  CB  TRP A 177      76.681  12.532 -24.075  1.00 55.47           C  
+ATOM   1217  CG  TRP A 177      76.718  14.027 -24.028  1.00 55.71           C  
+ATOM   1218  CD1 TRP A 177      75.841  14.895 -24.626  1.00 57.49           C  
+ATOM   1219  CD2 TRP A 177      77.597  14.830 -23.234  1.00 56.81           C  
+ATOM   1220  NE1 TRP A 177      76.116  16.196 -24.239  1.00 58.60           N  
+ATOM   1221  CE2 TRP A 177      77.190  16.179 -23.386  1.00 58.32           C  
+ATOM   1222  CE3 TRP A 177      78.692  14.541 -22.402  1.00 57.78           C  
+ATOM   1223  CZ2 TRP A 177      77.838  17.229 -22.737  1.00 58.42           C  
+ATOM   1224  CZ3 TRP A 177      79.336  15.587 -21.757  1.00 56.32           C  
+ATOM   1225  CH2 TRP A 177      78.906  16.915 -21.929  1.00 58.90           C  
+ATOM   1226  N   SER A 178      78.758  11.790 -26.073  1.00 54.71           N  
+ATOM   1227  CA  SER A 178      79.982  12.135 -26.785  1.00 54.54           C  
+ATOM   1228  C   SER A 178      79.862  12.011 -28.268  1.00 51.91           C  
+ATOM   1229  O   SER A 178      80.847  12.081 -28.961  1.00 54.49           O  
+ATOM   1230  CB  SER A 178      81.140  11.259 -26.333  1.00 56.33           C  
+ATOM   1231  OG  SER A 178      80.961   9.949 -26.813  1.00 58.84           O  
+ATOM   1232  N   GLY A 179      78.658  11.804 -28.758  1.00 51.04           N  
+ATOM   1233  CA  GLY A 179      78.484  11.694 -30.180  1.00 49.81           C  
+ATOM   1234  C   GLY A 179      77.251  12.470 -30.531  1.00 52.83           C  
+ATOM   1235  O   GLY A 179      76.872  12.536 -31.694  1.00 54.04           O  
+ATOM   1236  N   SER A 180      76.608  13.063 -29.528  1.00 55.08           N  
+ATOM   1237  CA  SER A 180      75.398  13.825 -29.803  1.00 58.05           C  
+ATOM   1238  C   SER A 180      75.197  15.103 -29.015  1.00 58.95           C  
+ATOM   1239  O   SER A 180      74.094  15.670 -29.025  1.00 58.59           O  
+ATOM   1240  CB  SER A 180      74.158  12.929 -29.659  1.00 58.33           C  
+ATOM   1241  OG  SER A 180      74.237  12.095 -28.521  1.00 56.39           O  
+ATOM   1242  N   TYR A 181      76.253  15.578 -28.361  1.00 60.70           N  
+ATOM   1243  CA  TYR A 181      76.151  16.814 -27.581  1.00 63.26           C  
+ATOM   1244  C   TYR A 181      75.662  18.014 -28.385  1.00 62.26           C  
+ATOM   1245  O   TYR A 181      75.203  18.993 -27.820  1.00 62.73           O  
+ATOM   1246  CB  TYR A 181      77.482  17.168 -26.935  1.00 63.33           C  
+ATOM   1247  CG  TYR A 181      78.638  17.366 -27.895  1.00 67.59           C  
+ATOM   1248  CD1 TYR A 181      79.604  16.379 -28.041  1.00 70.23           C  
+ATOM   1249  CD2 TYR A 181      78.846  18.589 -28.542  1.00 67.60           C  
+ATOM   1250  CE1 TYR A 181      80.756  16.601 -28.783  1.00 72.87           C  
+ATOM   1251  CE2 TYR A 181      79.998  18.825 -29.285  1.00 68.93           C  
+ATOM   1252  CZ  TYR A 181      80.954  17.824 -29.394  1.00 72.14           C  
+ATOM   1253  OH  TYR A 181      82.142  18.028 -30.060  1.00 73.66           O  
+ATOM   1254  N   GLU A 182      75.768  17.940 -29.700  1.00 61.76           N  
+ATOM   1255  CA  GLU A 182      75.311  19.022 -30.544  1.00 62.62           C  
+ATOM   1256  C   GLU A 182      73.807  19.270 -30.346  1.00 61.35           C  
+ATOM   1257  O   GLU A 182      73.347  20.398 -30.446  1.00 60.73           O  
+ATOM   1258  CB  GLU A 182      75.619  18.670 -31.998  1.00 67.94           C  
+ATOM   1259  CG  GLU A 182      75.461  19.786 -33.029  1.00 75.28           C  
+ATOM   1260  CD  GLU A 182      76.204  19.466 -34.342  1.00 83.01           C  
+ATOM   1261  OE1 GLU A 182      77.469  19.423 -34.334  1.00 83.34           O  
+ATOM   1262  OE2 GLU A 182      75.526  19.243 -35.380  1.00 86.01           O  
+ATOM   1263  N   THR A 183      73.035  18.231 -30.045  1.00 61.08           N  
+ATOM   1264  CA  THR A 183      71.588  18.412 -29.861  1.00 59.74           C  
+ATOM   1265  C   THR A 183      71.044  17.850 -28.567  1.00 58.29           C  
+ATOM   1266  O   THR A 183      69.857  18.018 -28.239  1.00 57.54           O  
+ATOM   1267  CB  THR A 183      70.774  17.745 -30.976  1.00 59.12           C  
+ATOM   1268  OG1 THR A 183      71.554  16.702 -31.581  1.00 54.00           O  
+ATOM   1269  CG2 THR A 183      70.312  18.780 -31.983  1.00 58.66           C  
+ATOM   1270  N   ALA A 184      71.902  17.178 -27.825  1.00 54.30           N  
+ATOM   1271  CA  ALA A 184      71.424  16.591 -26.608  1.00 52.71           C  
+ATOM   1272  C   ALA A 184      72.282  16.933 -25.433  1.00 50.97           C  
+ATOM   1273  O   ALA A 184      73.507  16.898 -25.506  1.00 49.86           O  
+ATOM   1274  CB  ALA A 184      71.334  15.090 -26.771  1.00 54.07           C  
+ATOM   1275  N   HIS A 185      71.619  17.291 -24.343  1.00 51.73           N  
+ATOM   1276  CA  HIS A 185      72.318  17.607 -23.119  1.00 52.01           C  
+ATOM   1277  C   HIS A 185      72.327  16.331 -22.272  1.00 51.68           C  
+ATOM   1278  O   HIS A 185      71.369  15.557 -22.231  1.00 50.21           O  
+ATOM   1279  CB  HIS A 185      71.642  18.766 -22.365  1.00 50.96           C  
+ATOM   1280  CG  HIS A 185      72.140  18.935 -20.959  1.00 54.00           C  
+ATOM   1281  ND1 HIS A 185      73.420  19.357 -20.667  1.00 56.01           N  
+ATOM   1282  CD2 HIS A 185      71.558  18.653 -19.767  1.00 54.60           C  
+ATOM   1283  CE1 HIS A 185      73.608  19.324 -19.358  1.00 55.09           C  
+ATOM   1284  NE2 HIS A 185      72.493  18.900 -18.789  1.00 56.57           N  
+ATOM   1285  N   TYR A 186      73.453  16.096 -21.633  1.00 52.99           N  
+ATOM   1286  CA  TYR A 186      73.592  14.948 -20.784  1.00 54.07           C  
+ATOM   1287  C   TYR A 186      73.207  15.413 -19.364  1.00 55.69           C  
+ATOM   1288  O   TYR A 186      73.826  16.317 -18.799  1.00 56.48           O  
+ATOM   1289  CB  TYR A 186      75.036  14.468 -20.862  1.00 52.55           C  
+ATOM   1290  CG  TYR A 186      75.349  13.368 -19.914  1.00 53.59           C  
+ATOM   1291  CD1 TYR A 186      76.524  13.384 -19.191  1.00 58.52           C  
+ATOM   1292  CD2 TYR A 186      74.455  12.333 -19.697  1.00 53.70           C  
+ATOM   1293  CE1 TYR A 186      76.807  12.405 -18.265  1.00 60.85           C  
+ATOM   1294  CE2 TYR A 186      74.729  11.340 -18.767  1.00 57.66           C  
+ATOM   1295  CZ  TYR A 186      75.911  11.387 -18.052  1.00 59.56           C  
+ATOM   1296  OH  TYR A 186      76.211  10.436 -17.109  1.00 61.72           O  
+ATOM   1297  N   MET A 187      72.160  14.808 -18.813  1.00 56.35           N  
+ATOM   1298  CA  MET A 187      71.662  15.131 -17.484  1.00 57.79           C  
+ATOM   1299  C   MET A 187      72.436  14.375 -16.423  1.00 60.37           C  
+ATOM   1300  O   MET A 187      72.267  13.166 -16.264  1.00 62.82           O  
+ATOM   1301  CB  MET A 187      70.202  14.730 -17.368  1.00 59.25           C  
+ATOM   1302  CG  MET A 187      69.488  15.329 -16.199  1.00 60.96           C  
+ATOM   1303  SD  MET A 187      69.010  16.991 -16.640  1.00 67.40           S  
+ATOM   1304  CE  MET A 187      67.412  16.687 -17.423  1.00 57.53           C  
+ATOM   1305  N   LEU A 188      73.275  15.078 -15.682  1.00 63.26           N  
+ATOM   1306  CA  LEU A 188      74.041  14.426 -14.643  1.00 66.37           C  
+ATOM   1307  C   LEU A 188      73.250  14.308 -13.326  1.00 68.79           C  
+ATOM   1308  O   LEU A 188      72.594  15.258 -12.887  1.00 66.05           O  
+ATOM   1309  CB  LEU A 188      75.341  15.180 -14.400  1.00 67.54           C  
+ATOM   1310  CG  LEU A 188      76.344  14.211 -13.795  1.00 69.13           C  
+ATOM   1311  CD1 LEU A 188      76.805  13.271 -14.912  1.00 69.44           C  
+ATOM   1312  CD2 LEU A 188      77.499  14.949 -13.162  1.00 69.39           C  
+ATOM   1313  N   GLY A 189      73.321  13.126 -12.710  1.00 72.63           N  
+ATOM   1314  CA  GLY A 189      72.622  12.879 -11.461  1.00 78.04           C  
+ATOM   1315  C   GLY A 189      73.494  13.228 -10.267  1.00 82.37           C  
+ATOM   1316  O   GLY A 189      73.085  13.958  -9.357  1.00 84.42           O  
+ATOM   1317  N   THR A 190      74.711  12.703 -10.270  1.00 83.56           N  
+ATOM   1318  CA  THR A 190      75.648  12.953  -9.191  1.00 84.77           C  
+ATOM   1319  C   THR A 190      76.227  14.360  -9.377  1.00 87.44           C  
+ATOM   1320  O   THR A 190      75.978  15.015 -10.407  1.00 87.44           O  
+ATOM   1321  CB  THR A 190      76.796  11.914  -9.232  1.00 84.30           C  
+ATOM   1322  OG1 THR A 190      77.643  12.076  -8.086  1.00 86.30           O  
+ATOM   1323  CG2 THR A 190      77.628  12.084 -10.511  1.00 81.25           C  
+ATOM   1324  N   ALA A 191      76.983  14.818  -8.370  1.00 88.36           N  
+ATOM   1325  CA  ALA A 191      77.657  16.129  -8.386  1.00 86.76           C  
+ATOM   1326  C   ALA A 191      79.109  15.869  -8.787  1.00 84.87           C  
+ATOM   1327  O   ALA A 191      79.906  16.799  -8.945  1.00 85.30           O  
+ATOM   1328  CB  ALA A 191      77.607  16.784  -6.989  1.00 85.03           C  
+ATOM   1329  N   ALA A 192      79.420  14.584  -8.959  1.00 82.17           N  
+ATOM   1330  CA  ALA A 192      80.756  14.122  -9.307  1.00 79.59           C  
+ATOM   1331  C   ALA A 192      80.923  13.820 -10.789  1.00 78.12           C  
+ATOM   1332  O   ALA A 192      80.730  12.685 -11.233  1.00 79.23           O  
+ATOM   1333  CB  ALA A 192      81.090  12.880  -8.485  1.00 78.80           C  
+ATOM   1334  N   GLY A 193      81.293  14.834 -11.557  1.00 75.20           N  
+ATOM   1335  CA  GLY A 193      81.482  14.620 -12.976  1.00 73.03           C  
+ATOM   1336  C   GLY A 193      82.513  15.588 -13.491  1.00 72.34           C  
+ATOM   1337  O   GLY A 193      83.088  16.334 -12.698  1.00 73.64           O  
+ATOM   1338  N   PRO A 194      82.770  15.616 -14.806  1.00 70.69           N  
+ATOM   1339  CA  PRO A 194      83.766  16.549 -15.330  1.00 69.29           C  
+ATOM   1340  C   PRO A 194      83.246  17.981 -15.193  1.00 68.93           C  
+ATOM   1341  O   PRO A 194      82.037  18.194 -15.035  1.00 69.27           O  
+ATOM   1342  CB  PRO A 194      83.868  16.137 -16.786  1.00 69.13           C  
+ATOM   1343  CG  PRO A 194      82.429  15.842 -17.113  1.00 70.38           C  
+ATOM   1344  CD  PRO A 194      81.997  15.010 -15.906  1.00 70.70           C  
+ATOM   1345  N   HIS A 195      84.160  18.950 -15.256  1.00 66.98           N  
+ATOM   1346  CA  HIS A 195      83.816  20.376 -15.188  1.00 62.37           C  
+ATOM   1347  C   HIS A 195      83.042  20.661 -16.466  1.00 60.95           C  
+ATOM   1348  O   HIS A 195      83.359  20.118 -17.519  1.00 62.44           O  
+ATOM   1349  CB  HIS A 195      85.092  21.217 -15.163  1.00 61.15           C  
+ATOM   1350  CG  HIS A 195      84.867  22.674 -14.911  1.00 62.14           C  
+ATOM   1351  ND1 HIS A 195      84.512  23.170 -13.674  1.00 62.84           N  
+ATOM   1352  CD2 HIS A 195      84.943  23.744 -15.739  1.00 59.87           C  
+ATOM   1353  CE1 HIS A 195      84.378  24.483 -13.753  1.00 62.54           C  
+ATOM   1354  NE2 HIS A 195      84.633  24.856 -14.995  1.00 61.18           N  
+ATOM   1355  N   PRO A 196      82.049  21.546 -16.409  1.00 59.36           N  
+ATOM   1356  CA  PRO A 196      81.597  22.304 -15.249  1.00 59.97           C  
+ATOM   1357  C   PRO A 196      80.479  21.666 -14.420  1.00 62.54           C  
+ATOM   1358  O   PRO A 196      79.829  22.342 -13.629  1.00 65.01           O  
+ATOM   1359  CB  PRO A 196      81.159  23.603 -15.888  1.00 57.52           C  
+ATOM   1360  CG  PRO A 196      80.508  23.120 -17.121  1.00 55.99           C  
+ATOM   1361  CD  PRO A 196      81.477  22.106 -17.645  1.00 57.13           C  
+ATOM   1362  N   TYR A 197      80.261  20.367 -14.564  1.00 64.32           N  
+ATOM   1363  CA  TYR A 197      79.169  19.719 -13.831  1.00 63.59           C  
+ATOM   1364  C   TYR A 197      79.074  19.954 -12.319  1.00 64.13           C  
+ATOM   1365  O   TYR A 197      78.076  20.495 -11.832  1.00 65.40           O  
+ATOM   1366  CB  TYR A 197      79.133  18.215 -14.161  1.00 59.66           C  
+ATOM   1367  CG  TYR A 197      78.413  17.941 -15.477  1.00 58.40           C  
+ATOM   1368  CD1 TYR A 197      77.043  18.142 -15.590  1.00 54.21           C  
+ATOM   1369  CD2 TYR A 197      79.107  17.552 -16.619  1.00 58.44           C  
+ATOM   1370  CE1 TYR A 197      76.381  17.973 -16.783  1.00 52.90           C  
+ATOM   1371  CE2 TYR A 197      78.443  17.380 -17.830  1.00 56.94           C  
+ATOM   1372  CZ  TYR A 197      77.077  17.595 -17.897  1.00 55.86           C  
+ATOM   1373  OH  TYR A 197      76.395  17.425 -19.085  1.00 59.61           O  
+ATOM   1374  N   PRO A 198      80.109  19.588 -11.557  1.00 63.85           N  
+ATOM   1375  CA  PRO A 198      79.971  19.822 -10.122  1.00 62.00           C  
+ATOM   1376  C   PRO A 198      79.521  21.234  -9.772  1.00 60.79           C  
+ATOM   1377  O   PRO A 198      78.863  21.431  -8.760  1.00 63.14           O  
+ATOM   1378  CB  PRO A 198      81.355  19.480  -9.584  1.00 61.53           C  
+ATOM   1379  CG  PRO A 198      82.233  19.864 -10.693  1.00 64.29           C  
+ATOM   1380  CD  PRO A 198      81.509  19.303 -11.898  1.00 64.35           C  
+ATOM   1381  N   THR A 199      79.857  22.223 -10.590  1.00 58.44           N  
+ATOM   1382  CA  THR A 199      79.422  23.585 -10.278  1.00 57.34           C  
+ATOM   1383  C   THR A 199      77.933  23.717 -10.508  1.00 57.53           C  
+ATOM   1384  O   THR A 199      77.179  24.091  -9.616  1.00 57.81           O  
+ATOM   1385  CB  THR A 199      80.095  24.618 -11.160  1.00 56.32           C  
+ATOM   1386  OG1 THR A 199      81.491  24.628 -10.877  1.00 60.82           O  
+ATOM   1387  CG2 THR A 199      79.509  26.003 -10.907  1.00 54.86           C  
+ATOM   1388  N   ILE A 200      77.528  23.429 -11.735  1.00 56.81           N  
+ATOM   1389  CA  ILE A 200      76.139  23.496 -12.120  1.00 56.09           C  
+ATOM   1390  C   ILE A 200      75.294  22.747 -11.096  1.00 55.69           C  
+ATOM   1391  O   ILE A 200      74.279  23.246 -10.592  1.00 52.74           O  
+ATOM   1392  CB  ILE A 200      75.970  22.871 -13.488  1.00 57.26           C  
+ATOM   1393  CG1 ILE A 200      76.795  23.669 -14.501  1.00 59.23           C  
+ATOM   1394  CG2 ILE A 200      74.505  22.831 -13.857  1.00 56.22           C  
+ATOM   1395  CD1 ILE A 200      76.855  23.046 -15.878  1.00 61.50           C  
+ATOM   1396  N   VAL A 201      75.731  21.543 -10.771  1.00 55.13           N  
+ATOM   1397  CA  VAL A 201      75.001  20.758  -9.807  1.00 56.75           C  
+ATOM   1398  C   VAL A 201      74.963  21.426  -8.441  1.00 57.25           C  
+ATOM   1399  O   VAL A 201      73.894  21.569  -7.868  1.00 60.48           O  
+ATOM   1400  CB  VAL A 201      75.588  19.350  -9.691  1.00 57.85           C  
+ATOM   1401  CG1 VAL A 201      75.088  18.677  -8.411  1.00 56.40           C  
+ATOM   1402  CG2 VAL A 201      75.183  18.534 -10.935  1.00 58.45           C  
+ATOM   1403  N   ARG A 202      76.111  21.843  -7.915  1.00 57.23           N  
+ATOM   1404  CA  ARG A 202      76.124  22.491  -6.611  1.00 55.81           C  
+ATOM   1405  C   ARG A 202      75.229  23.701  -6.674  1.00 54.52           C  
+ATOM   1406  O   ARG A 202      74.582  24.056  -5.702  1.00 52.80           O  
+ATOM   1407  CB  ARG A 202      77.536  22.935  -6.219  1.00 58.67           C  
+ATOM   1408  CG  ARG A 202      78.498  21.790  -5.847  1.00 66.85           C  
+ATOM   1409  CD  ARG A 202      79.755  22.308  -5.134  1.00 72.33           C  
+ATOM   1410  NE  ARG A 202      80.670  23.012  -6.032  1.00 77.77           N  
+ATOM   1411  CZ  ARG A 202      81.717  22.439  -6.626  1.00 80.96           C  
+ATOM   1412  NH1 ARG A 202      81.981  21.147  -6.400  1.00 80.96           N  
+ATOM   1413  NH2 ARG A 202      82.483  23.146  -7.465  1.00 80.34           N  
+ATOM   1414  N   GLU A 203      75.166  24.310  -7.848  1.00 53.93           N  
+ATOM   1415  CA  GLU A 203      74.387  25.511  -8.017  1.00 53.82           C  
+ATOM   1416  C   GLU A 203      72.906  25.273  -8.009  1.00 54.22           C  
+ATOM   1417  O   GLU A 203      72.161  26.061  -7.430  1.00 55.27           O  
+ATOM   1418  CB  GLU A 203      74.789  26.228  -9.305  1.00 56.38           C  
+ATOM   1419  CG  GLU A 203      74.353  27.696  -9.367  1.00 60.72           C  
+ATOM   1420  CD  GLU A 203      75.135  28.629  -8.408  1.00 66.53           C  
+ATOM   1421  OE1 GLU A 203      74.785  29.831  -8.387  1.00 67.91           O  
+ATOM   1422  OE2 GLU A 203      76.082  28.191  -7.680  1.00 66.18           O  
+ATOM   1423  N   PHE A 204      72.461  24.201  -8.659  1.00 54.42           N  
+ATOM   1424  CA  PHE A 204      71.022  23.905  -8.700  1.00 52.76           C  
+ATOM   1425  C   PHE A 204      70.569  23.134  -7.447  1.00 52.71           C  
+ATOM   1426  O   PHE A 204      69.543  22.481  -7.443  1.00 53.64           O  
+ATOM   1427  CB  PHE A 204      70.677  23.134  -9.987  1.00 47.68           C  
+ATOM   1428  CG  PHE A 204      70.899  23.930 -11.257  1.00 46.50           C  
+ATOM   1429  CD1 PHE A 204      71.296  23.302 -12.433  1.00 44.87           C  
+ATOM   1430  CD2 PHE A 204      70.720  25.309 -11.282  1.00 44.35           C  
+ATOM   1431  CE1 PHE A 204      71.511  24.038 -13.601  1.00 40.99           C  
+ATOM   1432  CE2 PHE A 204      70.936  26.036 -12.447  1.00 38.75           C  
+ATOM   1433  CZ  PHE A 204      71.330  25.395 -13.597  1.00 39.58           C  
+ATOM   1434  N   GLN A 205      71.341  23.243  -6.375  1.00 53.18           N  
+ATOM   1435  CA  GLN A 205      71.020  22.584  -5.125  1.00 53.11           C  
+ATOM   1436  C   GLN A 205      71.171  23.536  -3.954  1.00 51.67           C  
+ATOM   1437  O   GLN A 205      70.814  23.190  -2.838  1.00 50.53           O  
+ATOM   1438  CB  GLN A 205      71.971  21.431  -4.879  1.00 58.08           C  
+ATOM   1439  CG  GLN A 205      71.912  20.339  -5.889  1.00 68.69           C  
+ATOM   1440  CD  GLN A 205      70.778  19.353  -5.631  1.00 75.76           C  
+ATOM   1441  OE1 GLN A 205      70.751  18.268  -6.236  1.00 79.54           O  
+ATOM   1442  NE2 GLN A 205      69.833  19.717  -4.736  1.00 75.03           N  
+ATOM   1443  N   ARG A 206      71.694  24.732  -4.207  1.00 51.73           N  
+ATOM   1444  CA  ARG A 206      71.974  25.690  -3.137  1.00 51.92           C  
+ATOM   1445  C   ARG A 206      70.805  26.415  -2.480  1.00 51.59           C  
+ATOM   1446  O   ARG A 206      71.006  27.094  -1.460  1.00 53.65           O  
+ATOM   1447  CB  ARG A 206      72.988  26.725  -3.621  1.00 49.16           C  
+ATOM   1448  CG  ARG A 206      72.377  27.662  -4.594  1.00 52.39           C  
+ATOM   1449  CD  ARG A 206      73.349  28.647  -5.157  1.00 51.47           C  
+ATOM   1450  NE  ARG A 206      73.973  29.440  -4.117  1.00 52.89           N  
+ATOM   1451  CZ  ARG A 206      75.216  29.240  -3.719  1.00 54.65           C  
+ATOM   1452  NH1 ARG A 206      75.929  28.275  -4.293  1.00 55.02           N  
+ATOM   1453  NH2 ARG A 206      75.743  29.996  -2.765  1.00 51.91           N  
+ATOM   1454  N   MET A 207      69.600  26.267  -3.036  1.00 50.20           N  
+ATOM   1455  CA  MET A 207      68.412  26.922  -2.481  1.00 47.63           C  
+ATOM   1456  C   MET A 207      68.103  26.504  -1.056  1.00 45.77           C  
+ATOM   1457  O   MET A 207      67.522  27.272  -0.302  1.00 45.64           O  
+ATOM   1458  CB  MET A 207      67.176  26.687  -3.361  1.00 49.67           C  
+ATOM   1459  CG  MET A 207      66.803  25.226  -3.613  1.00 55.32           C  
+ATOM   1460  SD  MET A 207      67.832  24.365  -4.871  1.00 64.94           S  
+ATOM   1461  CE  MET A 207      67.889  25.548  -6.282  1.00 56.83           C  
+ATOM   1462  N   ILE A 208      68.489  25.295  -0.671  1.00 45.68           N  
+ATOM   1463  CA  ILE A 208      68.230  24.851   0.698  1.00 46.01           C  
+ATOM   1464  C   ILE A 208      68.841  25.858   1.667  1.00 48.01           C  
+ATOM   1465  O   ILE A 208      68.148  26.383   2.553  1.00 46.46           O  
+ATOM   1466  CB  ILE A 208      68.833  23.461   0.986  1.00 44.72           C  
+ATOM   1467  CG1 ILE A 208      68.230  22.424   0.028  1.00 44.66           C  
+ATOM   1468  CG2 ILE A 208      68.578  23.087   2.445  1.00 42.57           C  
+ATOM   1469  CD1 ILE A 208      68.847  21.028   0.113  1.00 44.11           C  
+ATOM   1470  N   GLY A 209      70.138  26.127   1.476  1.00 49.75           N  
+ATOM   1471  CA  GLY A 209      70.851  27.084   2.305  1.00 48.83           C  
+ATOM   1472  C   GLY A 209      70.343  28.501   2.074  1.00 48.78           C  
+ATOM   1473  O   GLY A 209      70.218  29.290   3.016  1.00 49.29           O  
+ATOM   1474  N   GLU A 210      70.046  28.840   0.823  1.00 47.13           N  
+ATOM   1475  CA  GLU A 210      69.544  30.170   0.526  1.00 46.64           C  
+ATOM   1476  C   GLU A 210      68.216  30.419   1.247  1.00 47.30           C  
+ATOM   1477  O   GLU A 210      68.027  31.470   1.881  1.00 47.46           O  
+ATOM   1478  CB  GLU A 210      69.385  30.334  -0.970  1.00 45.06           C  
+ATOM   1479  CG  GLU A 210      70.680  30.179  -1.695  1.00 48.34           C  
+ATOM   1480  CD  GLU A 210      70.508  30.325  -3.178  1.00 52.70           C  
+ATOM   1481  OE1 GLU A 210      69.411  29.975  -3.667  1.00 57.34           O  
+ATOM   1482  OE2 GLU A 210      71.459  30.768  -3.865  1.00 55.75           O  
+ATOM   1483  N   GLU A 211      67.301  29.458   1.172  1.00 45.21           N  
+ATOM   1484  CA  GLU A 211      66.030  29.614   1.861  1.00 46.10           C  
+ATOM   1485  C   GLU A 211      66.278  29.717   3.353  1.00 48.21           C  
+ATOM   1486  O   GLU A 211      65.757  30.612   4.018  1.00 48.09           O  
+ATOM   1487  CB  GLU A 211      65.126  28.432   1.577  1.00 45.18           C  
+ATOM   1488  CG  GLU A 211      64.746  28.384   0.146  1.00 45.12           C  
+ATOM   1489  CD  GLU A 211      64.010  27.144  -0.247  1.00 46.14           C  
+ATOM   1490  OE1 GLU A 211      63.824  26.973  -1.483  1.00 47.61           O  
+ATOM   1491  OE2 GLU A 211      63.624  26.363   0.658  1.00 44.13           O  
+ATOM   1492  N   THR A 212      67.085  28.798   3.879  1.00 49.04           N  
+ATOM   1493  CA  THR A 212      67.396  28.798   5.303  1.00 48.89           C  
+ATOM   1494  C   THR A 212      67.938  30.140   5.726  1.00 48.62           C  
+ATOM   1495  O   THR A 212      67.511  30.698   6.749  1.00 49.08           O  
+ATOM   1496  CB  THR A 212      68.456  27.752   5.666  1.00 49.00           C  
+ATOM   1497  OG1 THR A 212      67.960  26.448   5.348  1.00 55.12           O  
+ATOM   1498  CG2 THR A 212      68.795  27.816   7.149  1.00 47.11           C  
+ATOM   1499  N   LYS A 213      68.877  30.664   4.941  1.00 45.22           N  
+ATOM   1500  CA  LYS A 213      69.483  31.927   5.308  1.00 44.73           C  
+ATOM   1501  C   LYS A 213      68.457  33.038   5.385  1.00 45.02           C  
+ATOM   1502  O   LYS A 213      68.357  33.733   6.401  1.00 44.20           O  
+ATOM   1503  CB  LYS A 213      70.606  32.299   4.341  1.00 42.94           C  
+ATOM   1504  CG  LYS A 213      71.138  33.700   4.566  1.00 39.01           C  
+ATOM   1505  CD  LYS A 213      72.633  33.730   4.454  1.00 40.05           C  
+ATOM   1506  CE  LYS A 213      73.097  33.616   3.034  1.00 41.69           C  
+ATOM   1507  NZ  LYS A 213      74.601  33.653   2.961  1.00 45.07           N  
+ATOM   1508  N   ALA A 214      67.678  33.183   4.319  1.00 44.48           N  
+ATOM   1509  CA  ALA A 214      66.658  34.219   4.263  1.00 43.17           C  
+ATOM   1510  C   ALA A 214      65.583  34.012   5.335  1.00 43.19           C  
+ATOM   1511  O   ALA A 214      65.130  34.966   5.982  1.00 41.58           O  
+ATOM   1512  CB  ALA A 214      66.034  34.235   2.891  1.00 39.27           C  
+ATOM   1513  N   GLN A 215      65.190  32.757   5.527  1.00 43.72           N  
+ATOM   1514  CA  GLN A 215      64.167  32.426   6.495  1.00 43.83           C  
+ATOM   1515  C   GLN A 215      64.615  32.743   7.913  1.00 45.92           C  
+ATOM   1516  O   GLN A 215      63.864  33.307   8.709  1.00 43.19           O  
+ATOM   1517  CB  GLN A 215      63.797  30.949   6.362  1.00 41.83           C  
+ATOM   1518  CG  GLN A 215      63.012  30.662   5.117  1.00 45.70           C  
+ATOM   1519  CD  GLN A 215      62.559  29.223   5.007  1.00 49.79           C  
+ATOM   1520  OE1 GLN A 215      63.371  28.311   4.867  1.00 53.91           O  
+ATOM   1521  NE2 GLN A 215      61.256  29.011   5.057  1.00 49.95           N  
+ATOM   1522  N   ILE A 216      65.857  32.388   8.215  1.00 48.72           N  
+ATOM   1523  CA  ILE A 216      66.405  32.604   9.538  1.00 51.29           C  
+ATOM   1524  C   ILE A 216      66.571  34.111   9.836  1.00 54.52           C  
+ATOM   1525  O   ILE A 216      66.352  34.573  10.969  1.00 52.88           O  
+ATOM   1526  CB  ILE A 216      67.740  31.799   9.675  1.00 50.03           C  
+ATOM   1527  CG1 ILE A 216      67.641  30.837  10.852  1.00 49.54           C  
+ATOM   1528  CG2 ILE A 216      68.911  32.714   9.864  1.00 54.62           C  
+ATOM   1529  CD1 ILE A 216      67.127  31.493  12.086  1.00 48.15           C  
+ATOM   1530  N   LEU A 217      66.947  34.882   8.819  1.00 56.02           N  
+ATOM   1531  CA  LEU A 217      67.099  36.313   9.008  1.00 56.74           C  
+ATOM   1532  C   LEU A 217      65.733  36.913   9.288  1.00 58.84           C  
+ATOM   1533  O   LEU A 217      65.578  37.676  10.236  1.00 59.64           O  
+ATOM   1534  CB  LEU A 217      67.710  36.956   7.771  1.00 55.39           C  
+ATOM   1535  CG  LEU A 217      69.217  36.726   7.689  1.00 59.03           C  
+ATOM   1536  CD1 LEU A 217      69.747  37.438   6.481  1.00 53.66           C  
+ATOM   1537  CD2 LEU A 217      69.913  37.220   8.976  1.00 56.80           C  
+ATOM   1538  N   GLU A 218      64.742  36.559   8.471  1.00 60.04           N  
+ATOM   1539  CA  GLU A 218      63.384  37.062   8.647  1.00 61.13           C  
+ATOM   1540  C   GLU A 218      62.789  36.796  10.038  1.00 60.39           C  
+ATOM   1541  O   GLU A 218      62.107  37.641  10.599  1.00 60.70           O  
+ATOM   1542  CB  GLU A 218      62.469  36.457   7.587  1.00 65.14           C  
+ATOM   1543  CG  GLU A 218      60.986  36.779   7.767  1.00 75.18           C  
+ATOM   1544  CD  GLU A 218      60.672  38.288   7.696  1.00 82.91           C  
+ATOM   1545  OE1 GLU A 218      59.484  38.670   7.915  1.00 86.33           O  
+ATOM   1546  OE2 GLU A 218      61.607  39.092   7.421  1.00 86.53           O  
+ATOM   1547  N   ARG A 219      63.054  35.635  10.609  1.00 58.46           N  
+ATOM   1548  CA  ARG A 219      62.486  35.329  11.903  1.00 59.26           C  
+ATOM   1549  C   ARG A 219      63.366  35.699  13.082  1.00 61.54           C  
+ATOM   1550  O   ARG A 219      62.853  36.020  14.138  1.00 62.98           O  
+ATOM   1551  CB  ARG A 219      62.171  33.837  12.004  1.00 59.81           C  
+ATOM   1552  CG  ARG A 219      61.302  33.265  10.912  1.00 61.32           C  
+ATOM   1553  CD  ARG A 219      61.563  31.788  10.883  1.00 68.41           C  
+ATOM   1554  NE  ARG A 219      60.614  30.970  10.120  1.00 74.39           N  
+ATOM   1555  CZ  ARG A 219      60.409  31.039   8.804  1.00 76.22           C  
+ATOM   1556  NH1 ARG A 219      61.076  31.919   8.056  1.00 77.19           N  
+ATOM   1557  NH2 ARG A 219      59.575  30.174   8.224  1.00 76.64           N  
+ATOM   1558  N   GLU A 220      64.685  35.643  12.917  1.00 63.70           N  
+ATOM   1559  CA  GLU A 220      65.604  35.932  14.025  1.00 63.85           C  
+ATOM   1560  C   GLU A 220      66.440  37.186  13.836  1.00 64.09           C  
+ATOM   1561  O   GLU A 220      67.203  37.568  14.715  1.00 64.40           O  
+ATOM   1562  CB  GLU A 220      66.541  34.745  14.247  1.00 64.72           C  
+ATOM   1563  CG  GLU A 220      65.843  33.473  14.683  1.00 66.85           C  
+ATOM   1564  CD  GLU A 220      65.163  33.624  16.018  1.00 69.01           C  
+ATOM   1565  OE1 GLU A 220      65.690  34.380  16.860  1.00 70.94           O  
+ATOM   1566  OE2 GLU A 220      64.114  32.979  16.241  1.00 72.12           O  
+ATOM   1567  N   GLY A 221      66.308  37.815  12.679  1.00 64.32           N  
+ATOM   1568  CA  GLY A 221      67.045  39.030  12.420  1.00 63.89           C  
+ATOM   1569  C   GLY A 221      68.551  38.883  12.399  1.00 65.72           C  
+ATOM   1570  O   GLY A 221      69.259  39.891  12.362  1.00 68.61           O  
+ATOM   1571  N   ARG A 222      69.052  37.651  12.421  1.00 65.10           N  
+ATOM   1572  CA  ARG A 222      70.501  37.406  12.386  1.00 63.46           C  
+ATOM   1573  C   ARG A 222      70.739  36.015  11.831  1.00 62.43           C  
+ATOM   1574  O   ARG A 222      69.796  35.229  11.745  1.00 66.20           O  
+ATOM   1575  CB  ARG A 222      71.101  37.503  13.793  1.00 61.35           C  
+ATOM   1576  CG  ARG A 222      70.247  36.868  14.848  1.00 62.26           C  
+ATOM   1577  CD  ARG A 222      70.979  36.702  16.143  1.00 62.90           C  
+ATOM   1578  NE  ARG A 222      72.094  35.766  16.024  1.00 66.20           N  
+ATOM   1579  CZ  ARG A 222      72.390  34.846  16.943  1.00 68.27           C  
+ATOM   1580  NH1 ARG A 222      71.648  34.742  18.040  1.00 70.57           N  
+ATOM   1581  NH2 ARG A 222      73.421  34.029  16.774  1.00 67.07           N  
+ATOM   1582  N   LEU A 223      71.976  35.709  11.448  1.00 57.79           N  
+ATOM   1583  CA  LEU A 223      72.284  34.385  10.923  1.00 55.77           C  
+ATOM   1584  C   LEU A 223      72.395  33.409  12.075  1.00 56.33           C  
+ATOM   1585  O   LEU A 223      72.440  33.814  13.232  1.00 58.91           O  
+ATOM   1586  CB  LEU A 223      73.594  34.403  10.149  1.00 53.92           C  
+ATOM   1587  CG  LEU A 223      73.629  35.313   8.928  1.00 53.39           C  
+ATOM   1588  CD1 LEU A 223      74.860  34.946   8.133  1.00 50.51           C  
+ATOM   1589  CD2 LEU A 223      72.358  35.158   8.077  1.00 50.38           C  
+ATOM   1590  N   PRO A 224      72.449  32.104  11.783  1.00 56.49           N  
+ATOM   1591  CA  PRO A 224      72.554  31.129  12.871  1.00 56.34           C  
+ATOM   1592  C   PRO A 224      73.982  31.041  13.379  1.00 57.98           C  
+ATOM   1593  O   PRO A 224      74.934  31.355  12.660  1.00 57.15           O  
+ATOM   1594  CB  PRO A 224      72.147  29.813  12.218  1.00 54.19           C  
+ATOM   1595  CG  PRO A 224      71.883  30.147  10.761  1.00 54.42           C  
+ATOM   1596  CD  PRO A 224      72.566  31.435  10.485  1.00 55.46           C  
+ATOM   1597  N   ASP A 225      74.129  30.594  14.617  1.00 59.46           N  
+ATOM   1598  CA  ASP A 225      75.442  30.427  15.201  1.00 57.72           C  
+ATOM   1599  C   ASP A 225      76.080  29.245  14.495  1.00 57.10           C  
+ATOM   1600  O   ASP A 225      77.217  29.331  14.056  1.00 59.16           O  
+ATOM   1601  CB  ASP A 225      75.299  30.211  16.698  1.00 59.82           C  
+ATOM   1602  CG  ASP A 225      74.689  31.428  17.384  1.00 65.15           C  
+ATOM   1603  OD1 ASP A 225      75.209  32.538  17.144  1.00 67.26           O  
+ATOM   1604  OD2 ASP A 225      73.697  31.298  18.142  1.00 65.60           O  
+ATOM   1605  N   ALA A 226      75.335  28.156  14.344  1.00 56.87           N  
+ATOM   1606  CA  ALA A 226      75.846  26.983  13.639  1.00 56.16           C  
+ATOM   1607  C   ALA A 226      74.742  26.324  12.815  1.00 56.44           C  
+ATOM   1608  O   ALA A 226      73.556  26.462  13.126  1.00 59.31           O  
+ATOM   1609  CB  ALA A 226      76.408  25.984  14.625  1.00 55.36           C  
+ATOM   1610  N   VAL A 227      75.135  25.622  11.757  1.00 54.21           N  
+ATOM   1611  CA  VAL A 227      74.193  24.902  10.909  1.00 52.64           C  
+ATOM   1612  C   VAL A 227      74.690  23.461  10.923  1.00 53.84           C  
+ATOM   1613  O   VAL A 227      75.758  23.183  10.401  1.00 55.40           O  
+ATOM   1614  CB  VAL A 227      74.212  25.412   9.447  1.00 51.05           C  
+ATOM   1615  CG1 VAL A 227      73.483  24.425   8.569  1.00 49.85           C  
+ATOM   1616  CG2 VAL A 227      73.565  26.790   9.339  1.00 46.48           C  
+ATOM   1617  N   ILE A 228      73.931  22.557  11.538  1.00 54.35           N  
+ATOM   1618  CA  ILE A 228      74.300  21.146  11.630  1.00 53.81           C  
+ATOM   1619  C   ILE A 228      73.641  20.388  10.485  1.00 56.05           C  
+ATOM   1620  O   ILE A 228      72.471  20.580  10.184  1.00 57.96           O  
+ATOM   1621  CB  ILE A 228      73.778  20.501  12.924  1.00 54.98           C  
+ATOM   1622  CG1 ILE A 228      73.660  21.539  14.034  1.00 55.29           C  
+ATOM   1623  CG2 ILE A 228      74.673  19.364  13.337  1.00 54.21           C  
+ATOM   1624  CD1 ILE A 228      74.903  22.270  14.286  1.00 59.53           C  
+ATOM   1625  N   ALA A 229      74.379  19.505   9.851  1.00 56.54           N  
+ATOM   1626  CA  ALA A 229      73.817  18.753   8.759  1.00 58.70           C  
+ATOM   1627  C   ALA A 229      74.625  17.484   8.667  1.00 61.50           C  
+ATOM   1628  O   ALA A 229      75.849  17.528   8.657  1.00 64.94           O  
+ATOM   1629  CB  ALA A 229      73.923  19.540   7.477  1.00 55.82           C  
+ATOM   1630  N   CYS A 230      73.942  16.350   8.627  1.00 62.74           N  
+ATOM   1631  CA  CYS A 230      74.600  15.067   8.540  1.00 63.30           C  
+ATOM   1632  C   CYS A 230      75.242  14.913   7.160  1.00 63.88           C  
+ATOM   1633  O   CYS A 230      74.563  14.904   6.138  1.00 63.09           O  
+ATOM   1634  CB  CYS A 230      73.567  13.974   8.788  1.00 64.41           C  
+ATOM   1635  SG  CYS A 230      74.168  12.302   8.544  1.00 73.59           S  
+ATOM   1636  N   VAL A 231      76.562  14.804   7.125  1.00 66.81           N  
+ATOM   1637  CA  VAL A 231      77.256  14.652   5.851  1.00 70.40           C  
+ATOM   1638  C   VAL A 231      77.522  13.183   5.555  1.00 73.58           C  
+ATOM   1639  O   VAL A 231      77.907  12.421   6.431  1.00 75.22           O  
+ATOM   1640  CB  VAL A 231      78.599  15.420   5.833  1.00 68.50           C  
+ATOM   1641  CG1 VAL A 231      79.437  15.041   7.033  1.00 68.64           C  
+ATOM   1642  CG2 VAL A 231      79.350  15.105   4.559  1.00 67.95           C  
+ATOM   1643  N   GLY A 232      77.306  12.784   4.315  1.00 76.79           N  
+ATOM   1644  CA  GLY A 232      77.538  11.405   3.964  1.00 80.63           C  
+ATOM   1645  C   GLY A 232      76.770  11.061   2.711  1.00 85.29           C  
+ATOM   1646  O   GLY A 232      75.944  10.146   2.734  1.00 89.01           O  
+ATOM   1647  N   GLY A 233      77.023  11.806   1.630  1.00 86.54           N  
+ATOM   1648  CA  GLY A 233      76.371  11.560   0.348  1.00 85.99           C  
+ATOM   1649  C   GLY A 233      74.854  11.471   0.336  1.00 85.84           C  
+ATOM   1650  O   GLY A 233      74.244  10.841   1.205  1.00 86.32           O  
+ATOM   1651  N   GLY A 234      74.236  12.091  -0.665  1.00 85.24           N  
+ATOM   1652  CA  GLY A 234      72.790  12.067  -0.749  1.00 84.91           C  
+ATOM   1653  C   GLY A 234      72.187  12.719   0.484  1.00 85.88           C  
+ATOM   1654  O   GLY A 234      70.972  12.682   0.705  1.00 87.81           O  
+ATOM   1655  N   SER A 235      73.047  13.302   1.312  1.00 84.80           N  
+ATOM   1656  CA  SER A 235      72.591  13.979   2.517  1.00 82.03           C  
+ATOM   1657  C   SER A 235      72.255  15.377   2.032  1.00 79.72           C  
+ATOM   1658  O   SER A 235      71.448  16.085   2.623  1.00 78.76           O  
+ATOM   1659  CB  SER A 235      73.722  14.060   3.551  1.00 82.56           C  
+ATOM   1660  OG  SER A 235      74.390  12.818   3.699  1.00 84.00           O  
+ATOM   1661  N   ASN A 236      72.893  15.749   0.926  1.00 78.02           N  
+ATOM   1662  CA  ASN A 236      72.728  17.064   0.330  1.00 76.52           C  
+ATOM   1663  C   ASN A 236      73.112  18.122   1.375  1.00 73.04           C  
+ATOM   1664  O   ASN A 236      72.394  19.098   1.605  1.00 72.14           O  
+ATOM   1665  CB  ASN A 236      71.284  17.261  -0.156  1.00 79.65           C  
+ATOM   1666  CG  ASN A 236      71.194  18.220  -1.349  1.00 83.97           C  
+ATOM   1667  OD1 ASN A 236      70.104  18.450  -1.901  1.00 85.62           O  
+ATOM   1668  ND2 ASN A 236      72.347  18.781  -1.754  1.00 82.85           N  
+ATOM   1669  N   ALA A 237      74.255  17.902   2.015  1.00 67.79           N  
+ATOM   1670  CA  ALA A 237      74.747  18.821   3.014  1.00 62.92           C  
+ATOM   1671  C   ALA A 237      75.274  20.023   2.258  1.00 62.23           C  
+ATOM   1672  O   ALA A 237      75.058  21.166   2.651  1.00 62.78           O  
+ATOM   1673  CB  ALA A 237      75.848  18.171   3.801  1.00 62.25           C  
+ATOM   1674  N   ILE A 238      75.965  19.761   1.156  1.00 59.96           N  
+ATOM   1675  CA  ILE A 238      76.507  20.835   0.348  1.00 57.44           C  
+ATOM   1676  C   ILE A 238      75.411  21.800  -0.018  1.00 58.38           C  
+ATOM   1677  O   ILE A 238      75.673  22.985  -0.176  1.00 60.11           O  
+ATOM   1678  CB  ILE A 238      77.097  20.320  -0.952  1.00 56.91           C  
+ATOM   1679  CG1 ILE A 238      78.110  19.227  -0.648  1.00 60.48           C  
+ATOM   1680  CG2 ILE A 238      77.735  21.455  -1.721  1.00 53.25           C  
+ATOM   1681  CD1 ILE A 238      79.088  19.602   0.453  1.00 66.38           C  
+ATOM   1682  N   GLY A 239      74.188  21.281  -0.168  1.00 58.52           N  
+ATOM   1683  CA  GLY A 239      73.043  22.109  -0.527  1.00 56.61           C  
+ATOM   1684  C   GLY A 239      72.702  23.072   0.592  1.00 56.45           C  
+ATOM   1685  O   GLY A 239      72.367  24.248   0.383  1.00 57.99           O  
+ATOM   1686  N   MET A 240      72.797  22.571   1.809  1.00 54.40           N  
+ATOM   1687  CA  MET A 240      72.515  23.402   2.946  1.00 53.93           C  
+ATOM   1688  C   MET A 240      73.709  24.327   3.261  1.00 54.72           C  
+ATOM   1689  O   MET A 240      73.499  25.492   3.618  1.00 57.21           O  
+ATOM   1690  CB  MET A 240      72.156  22.521   4.150  1.00 51.71           C  
+ATOM   1691  CG  MET A 240      72.041  23.270   5.465  1.00 50.79           C  
+ATOM   1692  SD  MET A 240      70.878  24.637   5.427  1.00 51.24           S  
+ATOM   1693  CE  MET A 240      69.504  23.931   6.271  1.00 47.93           C  
+ATOM   1694  N   PHE A 241      74.945  23.838   3.098  1.00 51.81           N  
+ATOM   1695  CA  PHE A 241      76.135  24.638   3.422  1.00 50.09           C  
+ATOM   1696  C   PHE A 241      76.584  25.652   2.392  1.00 51.67           C  
+ATOM   1697  O   PHE A 241      77.180  26.680   2.735  1.00 49.95           O  
+ATOM   1698  CB  PHE A 241      77.335  23.744   3.698  1.00 47.45           C  
+ATOM   1699  CG  PHE A 241      77.205  22.915   4.919  1.00 45.65           C  
+ATOM   1700  CD1 PHE A 241      76.610  23.422   6.054  1.00 45.09           C  
+ATOM   1701  CD2 PHE A 241      77.692  21.620   4.939  1.00 45.67           C  
+ATOM   1702  CE1 PHE A 241      76.496  22.649   7.198  1.00 46.46           C  
+ATOM   1703  CE2 PHE A 241      77.586  20.836   6.079  1.00 46.41           C  
+ATOM   1704  CZ  PHE A 241      76.983  21.354   7.213  1.00 46.84           C  
+ATOM   1705  N   ALA A 242      76.321  25.352   1.126  1.00 52.31           N  
+ATOM   1706  CA  ALA A 242      76.739  26.223   0.043  1.00 51.22           C  
+ATOM   1707  C   ALA A 242      76.645  27.697   0.394  1.00 51.57           C  
+ATOM   1708  O   ALA A 242      77.663  28.359   0.504  1.00 53.36           O  
+ATOM   1709  CB  ALA A 242      75.934  25.929  -1.194  1.00 51.93           C  
+ATOM   1710  N   ASP A 243      75.436  28.204   0.606  1.00 50.25           N  
+ATOM   1711  CA  ASP A 243      75.263  29.625   0.887  1.00 51.00           C  
+ATOM   1712  C   ASP A 243      75.842  30.164   2.176  1.00 52.29           C  
+ATOM   1713  O   ASP A 243      75.704  31.363   2.439  1.00 52.50           O  
+ATOM   1714  CB  ASP A 243      73.788  30.004   0.835  1.00 53.86           C  
+ATOM   1715  CG  ASP A 243      73.541  31.323   0.125  1.00 54.52           C  
+ATOM   1716  OD1 ASP A 243      74.004  31.458  -1.031  1.00 53.47           O  
+ATOM   1717  OD2 ASP A 243      72.865  32.205   0.706  1.00 55.23           O  
+ATOM   1718  N   PHE A 244      76.475  29.314   2.984  1.00 52.17           N  
+ATOM   1719  CA  PHE A 244      77.080  29.786   4.242  1.00 53.62           C  
+ATOM   1720  C   PHE A 244      78.629  29.735   4.211  1.00 55.12           C  
+ATOM   1721  O   PHE A 244      79.298  30.272   5.101  1.00 55.32           O  
+ATOM   1722  CB  PHE A 244      76.563  28.958   5.429  1.00 52.17           C  
+ATOM   1723  CG  PHE A 244      75.107  29.176   5.744  1.00 51.63           C  
+ATOM   1724  CD1 PHE A 244      74.689  30.308   6.447  1.00 51.79           C  
+ATOM   1725  CD2 PHE A 244      74.150  28.254   5.344  1.00 50.48           C  
+ATOM   1726  CE1 PHE A 244      73.331  30.521   6.749  1.00 50.24           C  
+ATOM   1727  CE2 PHE A 244      72.797  28.459   5.642  1.00 52.13           C  
+ATOM   1728  CZ  PHE A 244      72.389  29.601   6.348  1.00 49.57           C  
+ATOM   1729  N   ILE A 245      79.194  29.090   3.191  1.00 54.65           N  
+ATOM   1730  CA  ILE A 245      80.643  28.991   3.075  1.00 55.20           C  
+ATOM   1731  C   ILE A 245      81.295  30.368   3.292  1.00 56.73           C  
+ATOM   1732  O   ILE A 245      82.350  30.467   3.900  1.00 58.60           O  
+ATOM   1733  CB  ILE A 245      81.085  28.441   1.671  1.00 56.62           C  
+ATOM   1734  CG1 ILE A 245      80.578  27.016   1.439  1.00 56.34           C  
+ATOM   1735  CG2 ILE A 245      82.585  28.408   1.588  1.00 56.52           C  
+ATOM   1736  CD1 ILE A 245      81.127  26.013   2.429  1.00 56.33           C  
+ATOM   1737  N   ASN A 246      80.691  31.442   2.794  1.00 57.93           N  
+ATOM   1738  CA  ASN A 246      81.306  32.748   3.004  1.00 56.18           C  
+ATOM   1739  C   ASN A 246      80.669  33.595   4.086  1.00 57.30           C  
+ATOM   1740  O   ASN A 246      80.819  34.812   4.095  1.00 56.67           O  
+ATOM   1741  CB  ASN A 246      81.378  33.528   1.702  1.00 53.49           C  
+ATOM   1742  CG  ASN A 246      82.375  32.938   0.752  1.00 53.67           C  
+ATOM   1743  OD1 ASN A 246      83.202  32.108   1.147  1.00 52.34           O  
+ATOM   1744  ND2 ASN A 246      82.319  33.357  -0.507  1.00 54.78           N  
+ATOM   1745  N   GLU A 247      79.962  32.935   4.997  1.00 59.13           N  
+ATOM   1746  CA  GLU A 247      79.313  33.590   6.120  1.00 60.70           C  
+ATOM   1747  C   GLU A 247      80.158  33.128   7.284  1.00 62.69           C  
+ATOM   1748  O   GLU A 247      79.656  32.562   8.245  1.00 66.03           O  
+ATOM   1749  CB  GLU A 247      77.880  33.087   6.259  1.00 58.00           C  
+ATOM   1750  CG  GLU A 247      76.932  33.671   5.238  1.00 60.69           C  
+ATOM   1751  CD  GLU A 247      76.755  35.175   5.421  1.00 63.03           C  
+ATOM   1752  OE1 GLU A 247      76.014  35.817   4.631  1.00 62.46           O  
+ATOM   1753  OE2 GLU A 247      77.363  35.715   6.372  1.00 64.52           O  
+ATOM   1754  N   THR A 248      81.458  33.370   7.169  1.00 64.29           N  
+ATOM   1755  CA  THR A 248      82.436  32.934   8.162  1.00 65.20           C  
+ATOM   1756  C   THR A 248      82.064  32.947   9.627  1.00 63.78           C  
+ATOM   1757  O   THR A 248      82.544  32.120  10.375  1.00 63.82           O  
+ATOM   1758  CB  THR A 248      83.775  33.672   7.988  1.00 66.12           C  
+ATOM   1759  OG1 THR A 248      83.529  35.042   7.644  1.00 69.60           O  
+ATOM   1760  CG2 THR A 248      84.603  33.005   6.889  1.00 65.07           C  
+ATOM   1761  N   ASN A 249      81.211  33.862  10.051  1.00 65.39           N  
+ATOM   1762  CA  ASN A 249      80.817  33.901  11.460  1.00 66.91           C  
+ATOM   1763  C   ASN A 249      79.731  32.845  11.776  1.00 65.17           C  
+ATOM   1764  O   ASN A 249      79.117  32.855  12.846  1.00 65.49           O  
+ATOM   1765  CB  ASN A 249      80.316  35.307  11.813  1.00 70.86           C  
+ATOM   1766  CG  ASN A 249      79.251  35.820  10.823  1.00 78.02           C  
+ATOM   1767  OD1 ASN A 249      78.488  36.744  11.144  1.00 80.64           O  
+ATOM   1768  ND2 ASN A 249      79.208  35.231   9.608  1.00 77.80           N  
+ATOM   1769  N   VAL A 250      79.499  31.935  10.837  1.00 63.34           N  
+ATOM   1770  CA  VAL A 250      78.497  30.889  11.003  1.00 59.46           C  
+ATOM   1771  C   VAL A 250      79.183  29.551  10.894  1.00 58.33           C  
+ATOM   1772  O   VAL A 250      79.827  29.252   9.883  1.00 55.90           O  
+ATOM   1773  CB  VAL A 250      77.411  30.938   9.913  1.00 58.90           C  
+ATOM   1774  CG1 VAL A 250      76.458  29.778  10.120  1.00 59.30           C  
+ATOM   1775  CG2 VAL A 250      76.659  32.272   9.953  1.00 54.81           C  
+ATOM   1776  N   GLY A 251      79.017  28.745  11.934  1.00 57.26           N  
+ATOM   1777  CA  GLY A 251      79.651  27.446  11.988  1.00 56.98           C  
+ATOM   1778  C   GLY A 251      78.990  26.369  11.177  1.00 59.02           C  
+ATOM   1779  O   GLY A 251      77.768  26.261  11.154  1.00 60.93           O  
+ATOM   1780  N   LEU A 252      79.806  25.558  10.517  1.00 59.10           N  
+ATOM   1781  CA  LEU A 252      79.285  24.476   9.706  1.00 60.66           C  
+ATOM   1782  C   LEU A 252      79.655  23.113  10.298  1.00 62.82           C  
+ATOM   1783  O   LEU A 252      80.736  22.599  10.050  1.00 66.07           O  
+ATOM   1784  CB  LEU A 252      79.820  24.601   8.281  1.00 57.34           C  
+ATOM   1785  CG  LEU A 252      79.230  25.730   7.441  1.00 55.56           C  
+ATOM   1786  CD1 LEU A 252      79.157  27.009   8.196  1.00 55.89           C  
+ATOM   1787  CD2 LEU A 252      80.087  25.913   6.248  1.00 57.63           C  
+ATOM   1788  N   ILE A 253      78.751  22.531  11.082  1.00 63.63           N  
+ATOM   1789  CA  ILE A 253      78.990  21.230  11.701  1.00 61.40           C  
+ATOM   1790  C   ILE A 253      78.506  20.143  10.757  1.00 61.85           C  
+ATOM   1791  O   ILE A 253      77.341  20.120  10.393  1.00 61.56           O  
+ATOM   1792  CB  ILE A 253      78.197  21.049  13.014  1.00 61.36           C  
+ATOM   1793  CG1 ILE A 253      78.301  22.293  13.912  1.00 57.61           C  
+ATOM   1794  CG2 ILE A 253      78.689  19.800  13.719  1.00 59.17           C  
+ATOM   1795  CD1 ILE A 253      79.614  22.460  14.556  1.00 59.01           C  
+ATOM   1796  N   GLY A 254      79.406  19.256  10.354  1.00 64.24           N  
+ATOM   1797  CA  GLY A 254      79.040  18.152   9.484  1.00 64.40           C  
+ATOM   1798  C   GLY A 254      79.041  16.929  10.382  1.00 66.78           C  
+ATOM   1799  O   GLY A 254      80.064  16.604  10.996  1.00 65.58           O  
+ATOM   1800  N   VAL A 255      77.898  16.253  10.480  1.00 68.16           N  
+ATOM   1801  CA  VAL A 255      77.786  15.086  11.345  1.00 67.54           C  
+ATOM   1802  C   VAL A 255      77.987  13.759  10.640  1.00 69.53           C  
+ATOM   1803  O   VAL A 255      77.311  13.443   9.667  1.00 66.20           O  
+ATOM   1804  CB  VAL A 255      76.440  15.071  12.061  1.00 64.96           C  
+ATOM   1805  CG1 VAL A 255      76.386  13.929  13.041  1.00 64.12           C  
+ATOM   1806  CG2 VAL A 255      76.246  16.376  12.794  1.00 64.82           C  
+ATOM   1807  N   GLU A 256      78.943  12.992  11.157  1.00 75.08           N  
+ATOM   1808  CA  GLU A 256      79.275  11.681  10.623  1.00 80.27           C  
+ATOM   1809  C   GLU A 256      78.822  10.557  11.538  1.00 83.22           C  
+ATOM   1810  O   GLU A 256      79.184  10.506  12.723  1.00 82.48           O  
+ATOM   1811  CB  GLU A 256      80.780  11.566  10.379  1.00 80.85           C  
+ATOM   1812  CG  GLU A 256      81.229  12.418   9.217  1.00 86.00           C  
+ATOM   1813  CD  GLU A 256      82.650  12.153   8.794  1.00 86.94           C  
+ATOM   1814  OE1 GLU A 256      83.559  12.282   9.647  1.00 88.13           O  
+ATOM   1815  OE2 GLU A 256      82.850  11.825   7.601  1.00 87.78           O  
+ATOM   1816  N   PRO A 257      78.009   9.638  10.992  1.00 86.28           N  
+ATOM   1817  CA  PRO A 257      77.470   8.478  11.719  1.00 88.00           C  
+ATOM   1818  C   PRO A 257      78.559   7.569  12.323  1.00 88.10           C  
+ATOM   1819  O   PRO A 257      79.702   7.571  11.859  1.00 89.54           O  
+ATOM   1820  CB  PRO A 257      76.634   7.771  10.646  1.00 88.24           C  
+ATOM   1821  CG  PRO A 257      76.120   8.949   9.806  1.00 87.22           C  
+ATOM   1822  CD  PRO A 257      77.393   9.762   9.655  1.00 85.91           C  
+ATOM   1823  N   GLY A 258      78.200   6.803  13.355  1.00 87.45           N  
+ATOM   1824  CA  GLY A 258      79.153   5.898  13.988  1.00 86.29           C  
+ATOM   1825  C   GLY A 258      79.618   6.342  15.367  1.00 86.20           C  
+ATOM   1826  O   GLY A 258      80.677   5.932  15.853  1.00 83.23           O  
+ATOM   1827  N   VAL A 309      88.042  10.267  -1.156  1.00102.35           N  
+ATOM   1828  CA  VAL A 309      86.843   9.858  -0.439  1.00102.29           C  
+ATOM   1829  C   VAL A 309      85.572  10.362  -1.137  1.00102.16           C  
+ATOM   1830  O   VAL A 309      85.629  10.861  -2.267  1.00100.68           O  
+ATOM   1831  CB  VAL A 309      86.886  10.364   1.030  1.00101.91           C  
+ATOM   1832  CG1 VAL A 309      88.082   9.742   1.756  1.00 99.31           C  
+ATOM   1833  CG2 VAL A 309      86.975  11.888   1.060  1.00100.01           C  
+ATOM   1834  N   GLY A 310      84.430  10.212  -0.466  1.00102.84           N  
+ATOM   1835  CA  GLY A 310      83.160  10.645  -1.032  1.00104.17           C  
+ATOM   1836  C   GLY A 310      83.231  12.102  -1.433  1.00105.29           C  
+ATOM   1837  O   GLY A 310      83.782  12.908  -0.680  1.00106.71           O  
+ATOM   1838  N   PRO A 311      82.695  12.484  -2.608  1.00105.08           N  
+ATOM   1839  CA  PRO A 311      82.762  13.896  -3.005  1.00103.98           C  
+ATOM   1840  C   PRO A 311      82.218  14.851  -1.921  1.00102.37           C  
+ATOM   1841  O   PRO A 311      82.850  15.864  -1.598  1.00102.68           O  
+ATOM   1842  CB  PRO A 311      81.953  13.930  -4.315  1.00103.96           C  
+ATOM   1843  CG  PRO A 311      80.996  12.799  -4.177  1.00103.17           C  
+ATOM   1844  CD  PRO A 311      81.859  11.716  -3.549  1.00104.90           C  
+ATOM   1845  N   GLN A 312      81.056  14.513  -1.363  1.00 98.54           N  
+ATOM   1846  CA  GLN A 312      80.433  15.313  -0.319  1.00 94.24           C  
+ATOM   1847  C   GLN A 312      81.522  15.886   0.595  1.00 91.39           C  
+ATOM   1848  O   GLN A 312      81.621  17.095   0.789  1.00 89.63           O  
+ATOM   1849  CB  GLN A 312      79.485  14.420   0.483  1.00 96.05           C  
+ATOM   1850  CG  GLN A 312      78.623  15.139   1.505  1.00 98.39           C  
+ATOM   1851  CD  GLN A 312      77.292  15.605   0.934  1.00101.66           C  
+ATOM   1852  OE1 GLN A 312      77.240  16.517   0.103  1.00101.59           O  
+ATOM   1853  NE2 GLN A 312      76.205  14.970   1.376  1.00102.01           N  
+ATOM   1854  N   HIS A 313      82.348  14.997   1.137  1.00 89.36           N  
+ATOM   1855  CA  HIS A 313      83.436  15.378   2.035  1.00 86.97           C  
+ATOM   1856  C   HIS A 313      84.503  16.113   1.249  1.00 84.64           C  
+ATOM   1857  O   HIS A 313      84.996  17.159   1.672  1.00 84.90           O  
+ATOM   1858  CB  HIS A 313      84.054  14.138   2.691  1.00 88.42           C  
+ATOM   1859  CG  HIS A 313      83.131  13.424   3.629  1.00 89.39           C  
+ATOM   1860  ND1 HIS A 313      82.091  12.630   3.193  1.00 90.86           N  
+ATOM   1861  CD2 HIS A 313      83.068  13.416   4.982  1.00 89.78           C  
+ATOM   1862  CE1 HIS A 313      81.426  12.166   4.237  1.00 91.92           C  
+ATOM   1863  NE2 HIS A 313      81.999  12.628   5.335  1.00 90.79           N  
+ATOM   1864  N   ALA A 314      84.868  15.536   0.111  1.00 80.49           N  
+ATOM   1865  CA  ALA A 314      85.848  16.121  -0.774  1.00 74.96           C  
+ATOM   1866  C   ALA A 314      85.614  17.630  -0.829  1.00 73.97           C  
+ATOM   1867  O   ALA A 314      86.474  18.417  -0.415  1.00 74.47           O  
+ATOM   1868  CB  ALA A 314      85.697  15.517  -2.151  1.00 75.67           C  
+ATOM   1869  N   TYR A 315      84.443  18.034  -1.325  1.00 70.75           N  
+ATOM   1870  CA  TYR A 315      84.118  19.454  -1.421  1.00 66.85           C  
+ATOM   1871  C   TYR A 315      84.174  20.140  -0.067  1.00 65.75           C  
+ATOM   1872  O   TYR A 315      84.858  21.143   0.081  1.00 65.27           O  
+ATOM   1873  CB  TYR A 315      82.741  19.665  -2.059  1.00 65.07           C  
+ATOM   1874  CG  TYR A 315      82.258  21.104  -2.012  1.00 63.83           C  
+ATOM   1875  CD1 TYR A 315      81.495  21.570  -0.934  1.00 64.20           C  
+ATOM   1876  CD2 TYR A 315      82.624  22.016  -3.003  1.00 63.84           C  
+ATOM   1877  CE1 TYR A 315      81.113  22.899  -0.832  1.00 62.95           C  
+ATOM   1878  CE2 TYR A 315      82.253  23.359  -2.917  1.00 66.05           C  
+ATOM   1879  CZ  TYR A 315      81.498  23.798  -1.822  1.00 67.87           C  
+ATOM   1880  OH  TYR A 315      81.167  25.141  -1.694  1.00 70.08           O  
+ATOM   1881  N   LEU A 316      83.464  19.605   0.919  1.00 64.90           N  
+ATOM   1882  CA  LEU A 316      83.455  20.192   2.263  1.00 66.59           C  
+ATOM   1883  C   LEU A 316      84.839  20.388   2.917  1.00 67.33           C  
+ATOM   1884  O   LEU A 316      85.064  21.331   3.702  1.00 65.92           O  
+ATOM   1885  CB  LEU A 316      82.588  19.342   3.180  1.00 66.90           C  
+ATOM   1886  CG  LEU A 316      81.128  19.750   3.266  1.00 66.33           C  
+ATOM   1887  CD1 LEU A 316      80.318  18.613   3.849  1.00 67.78           C  
+ATOM   1888  CD2 LEU A 316      81.017  20.986   4.122  1.00 65.00           C  
+ATOM   1889  N   ASN A 317      85.767  19.492   2.613  1.00 67.96           N  
+ATOM   1890  CA  ASN A 317      87.094  19.611   3.186  1.00 67.83           C  
+ATOM   1891  C   ASN A 317      87.785  20.804   2.561  1.00 67.76           C  
+ATOM   1892  O   ASN A 317      88.316  21.651   3.270  1.00 67.53           O  
+ATOM   1893  CB  ASN A 317      87.893  18.337   2.934  1.00 68.49           C  
+ATOM   1894  CG  ASN A 317      87.237  17.115   3.543  1.00 68.33           C  
+ATOM   1895  OD1 ASN A 317      86.897  17.104   4.726  1.00 67.29           O  
+ATOM   1896  ND2 ASN A 317      87.058  16.075   2.736  1.00 70.30           N  
+ATOM   1897  N   SER A 318      87.745  20.874   1.230  1.00 67.54           N  
+ATOM   1898  CA  SER A 318      88.369  21.962   0.480  1.00 65.51           C  
+ATOM   1899  C   SER A 318      87.890  23.354   0.843  1.00 64.51           C  
+ATOM   1900  O   SER A 318      88.661  24.292   0.774  1.00 66.15           O  
+ATOM   1901  CB  SER A 318      88.178  21.755  -1.019  1.00 65.02           C  
+ATOM   1902  OG  SER A 318      86.808  21.769  -1.367  1.00 66.34           O  
+ATOM   1903  N   THR A 319      86.624  23.506   1.216  1.00 65.61           N  
+ATOM   1904  CA  THR A 319      86.122  24.833   1.576  1.00 66.58           C  
+ATOM   1905  C   THR A 319      86.832  25.268   2.841  1.00 67.03           C  
+ATOM   1906  O   THR A 319      86.882  26.451   3.183  1.00 68.39           O  
+ATOM   1907  CB  THR A 319      84.616  24.843   1.889  1.00 65.60           C  
+ATOM   1908  OG1 THR A 319      84.408  24.389   3.234  1.00 65.17           O  
+ATOM   1909  CG2 THR A 319      83.863  23.969   0.910  1.00 63.32           C  
+ATOM   1910  N   GLY A 320      87.373  24.285   3.540  1.00 66.37           N  
+ATOM   1911  CA  GLY A 320      88.068  24.573   4.767  1.00 65.95           C  
+ATOM   1912  C   GLY A 320      87.146  25.041   5.876  1.00 66.38           C  
+ATOM   1913  O   GLY A 320      87.625  25.531   6.898  1.00 67.55           O  
+ATOM   1914  N   ARG A 321      85.832  24.917   5.728  1.00 66.26           N  
+ATOM   1915  CA  ARG A 321      85.034  25.386   6.844  1.00 66.45           C  
+ATOM   1916  C   ARG A 321      84.006  24.498   7.480  1.00 67.64           C  
+ATOM   1917  O   ARG A 321      83.073  24.992   8.107  1.00 69.11           O  
+ATOM   1918  CB  ARG A 321      84.406  26.739   6.552  1.00 62.94           C  
+ATOM   1919  CG  ARG A 321      84.099  27.047   5.152  1.00 59.72           C  
+ATOM   1920  CD  ARG A 321      83.812  28.536   5.112  1.00 62.37           C  
+ATOM   1921  NE  ARG A 321      82.594  28.922   5.846  1.00 61.77           N  
+ATOM   1922  CZ  ARG A 321      82.539  29.209   7.139  1.00 57.44           C  
+ATOM   1923  NH1 ARG A 321      81.390  29.541   7.717  1.00 54.55           N  
+ATOM   1924  NH2 ARG A 321      83.641  29.175   7.849  1.00 60.85           N  
+ATOM   1925  N   ALA A 322      84.188  23.191   7.370  1.00 67.68           N  
+ATOM   1926  CA  ALA A 322      83.251  22.284   7.999  1.00 68.44           C  
+ATOM   1927  C   ALA A 322      83.905  21.553   9.175  1.00 69.24           C  
+ATOM   1928  O   ALA A 322      84.937  20.926   9.010  1.00 70.97           O  
+ATOM   1929  CB  ALA A 322      82.745  21.292   6.980  1.00 68.84           C  
+ATOM   1930  N   ASP A 323      83.321  21.652  10.363  1.00 69.76           N  
+ATOM   1931  CA  ASP A 323      83.841  20.940  11.524  1.00 71.31           C  
+ATOM   1932  C   ASP A 323      83.145  19.599  11.543  1.00 70.90           C  
+ATOM   1933  O   ASP A 323      81.931  19.541  11.707  1.00 73.45           O  
+ATOM   1934  CB  ASP A 323      83.466  21.627  12.833  1.00 74.63           C  
+ATOM   1935  CG  ASP A 323      83.928  23.041  12.894  1.00 79.67           C  
+ATOM   1936  OD1 ASP A 323      85.150  23.246  12.754  1.00 83.28           O  
+ATOM   1937  OD2 ASP A 323      83.076  23.945  13.080  1.00 82.80           O  
+ATOM   1938  N   TYR A 324      83.873  18.510  11.386  1.00 68.81           N  
+ATOM   1939  CA  TYR A 324      83.189  17.234  11.447  1.00 67.45           C  
+ATOM   1940  C   TYR A 324      83.063  16.770  12.904  1.00 66.32           C  
+ATOM   1941  O   TYR A 324      83.869  17.147  13.757  1.00 65.08           O  
+ATOM   1942  CB  TYR A 324      83.932  16.195  10.614  1.00 64.84           C  
+ATOM   1943  CG  TYR A 324      83.958  16.514   9.138  1.00 64.57           C  
+ATOM   1944  CD1 TYR A 324      83.318  15.687   8.214  1.00 62.69           C  
+ATOM   1945  CD2 TYR A 324      84.664  17.620   8.658  1.00 64.26           C  
+ATOM   1946  CE1 TYR A 324      83.389  15.948   6.855  1.00 63.87           C  
+ATOM   1947  CE2 TYR A 324      84.743  17.892   7.297  1.00 62.99           C  
+ATOM   1948  CZ  TYR A 324      84.107  17.050   6.405  1.00 66.20           C  
+ATOM   1949  OH  TYR A 324      84.215  17.290   5.056  1.00 70.01           O  
+ATOM   1950  N   VAL A 325      82.012  16.002  13.186  1.00 65.12           N  
+ATOM   1951  CA  VAL A 325      81.781  15.433  14.511  1.00 64.03           C  
+ATOM   1952  C   VAL A 325      81.091  14.090  14.315  1.00 66.05           C  
+ATOM   1953  O   VAL A 325      80.478  13.835  13.271  1.00 64.44           O  
+ATOM   1954  CB  VAL A 325      80.890  16.307  15.402  1.00 62.24           C  
+ATOM   1955  CG1 VAL A 325      81.432  17.709  15.444  1.00 60.51           C  
+ATOM   1956  CG2 VAL A 325      79.438  16.255  14.919  1.00 63.59           C  
+ATOM   1957  N   SER A 326      81.199  13.225  15.320  1.00 67.83           N  
+ATOM   1958  CA  SER A 326      80.600  11.907  15.229  1.00 68.59           C  
+ATOM   1959  C   SER A 326      79.487  11.717  16.220  1.00 68.05           C  
+ATOM   1960  O   SER A 326      79.502  12.277  17.320  1.00 68.57           O  
+ATOM   1961  CB  SER A 326      81.648  10.821  15.454  1.00 70.03           C  
+ATOM   1962  OG  SER A 326      81.123   9.552  15.106  1.00 73.13           O  
+ATOM   1963  N   ILE A 327      78.515  10.918  15.812  1.00 67.55           N  
+ATOM   1964  CA  ILE A 327      77.388  10.624  16.655  1.00 70.03           C  
+ATOM   1965  C   ILE A 327      77.240   9.114  16.636  1.00 71.95           C  
+ATOM   1966  O   ILE A 327      77.576   8.459  15.650  1.00 71.54           O  
+ATOM   1967  CB  ILE A 327      76.115  11.355  16.157  1.00 69.76           C  
+ATOM   1968  CG1 ILE A 327      75.705  12.419  17.170  1.00 69.06           C  
+ATOM   1969  CG2 ILE A 327      74.967  10.402  16.026  1.00 71.55           C  
+ATOM   1970  CD1 ILE A 327      76.737  13.480  17.394  1.00 72.83           C  
+ATOM   1971  N   THR A 328      76.745   8.580  17.748  1.00 74.81           N  
+ATOM   1972  CA  THR A 328      76.574   7.145  17.959  1.00 75.31           C  
+ATOM   1973  C   THR A 328      75.129   6.679  17.932  1.00 77.46           C  
+ATOM   1974  O   THR A 328      74.246   7.329  18.497  1.00 76.88           O  
+ATOM   1975  CB  THR A 328      77.092   6.768  19.327  1.00 74.40           C  
+ATOM   1976  OG1 THR A 328      76.180   7.266  20.319  1.00 71.83           O  
+ATOM   1977  CG2 THR A 328      78.454   7.389  19.559  1.00 73.97           C  
+ATOM   1978  N   ASP A 329      74.910   5.520  17.324  1.00 78.88           N  
+ATOM   1979  CA  ASP A 329      73.583   4.933  17.230  1.00 81.11           C  
+ATOM   1980  C   ASP A 329      72.663   5.189  18.410  1.00 80.55           C  
+ATOM   1981  O   ASP A 329      71.469   5.409  18.223  1.00 81.67           O  
+ATOM   1982  CB  ASP A 329      73.699   3.438  17.020  1.00 84.87           C  
+ATOM   1983  CG  ASP A 329      74.340   3.112  15.718  1.00 90.46           C  
+ATOM   1984  OD1 ASP A 329      75.537   3.439  15.563  1.00 96.24           O  
+ATOM   1985  OD2 ASP A 329      73.649   2.552  14.838  1.00 95.70           O  
+ATOM   1986  N   ASP A 330      73.184   5.149  19.627  1.00 78.84           N  
+ATOM   1987  CA  ASP A 330      72.297   5.404  20.748  1.00 79.51           C  
+ATOM   1988  C   ASP A 330      71.874   6.857  20.748  1.00 77.35           C  
+ATOM   1989  O   ASP A 330      70.681   7.157  20.852  1.00 78.88           O  
+ATOM   1990  CB  ASP A 330      72.951   5.021  22.079  1.00 82.59           C  
+ATOM   1991  CG  ASP A 330      72.948   3.503  22.315  1.00 84.87           C  
+ATOM   1992  OD1 ASP A 330      73.495   3.080  23.356  1.00 85.37           O  
+ATOM   1993  OD2 ASP A 330      72.398   2.740  21.469  1.00 84.25           O  
+ATOM   1994  N   GLU A 331      72.844   7.757  20.597  1.00 74.16           N  
+ATOM   1995  CA  GLU A 331      72.566   9.197  20.551  1.00 68.48           C  
+ATOM   1996  C   GLU A 331      71.542   9.487  19.460  1.00 65.22           C  
+ATOM   1997  O   GLU A 331      70.639  10.292  19.646  1.00 63.64           O  
+ATOM   1998  CB  GLU A 331      73.852   9.958  20.274  1.00 65.96           C  
+ATOM   1999  CG  GLU A 331      74.908   9.686  21.298  1.00 61.30           C  
+ATOM   2000  CD  GLU A 331      76.171  10.448  21.033  1.00 63.55           C  
+ATOM   2001  OE1 GLU A 331      76.823  10.176  19.994  1.00 61.44           O  
+ATOM   2002  OE2 GLU A 331      76.503  11.325  21.867  1.00 61.05           O  
+ATOM   2003  N   ALA A 332      71.693   8.816  18.325  1.00 61.50           N  
+ATOM   2004  CA  ALA A 332      70.766   8.981  17.231  1.00 61.37           C  
+ATOM   2005  C   ALA A 332      69.371   8.610  17.722  1.00 63.02           C  
+ATOM   2006  O   ALA A 332      68.459   9.447  17.684  1.00 65.16           O  
+ATOM   2007  CB  ALA A 332      71.163   8.104  16.068  1.00 56.65           C  
+ATOM   2008  N   LEU A 333      69.209   7.368  18.193  1.00 63.15           N  
+ATOM   2009  CA  LEU A 333      67.921   6.876  18.692  1.00 60.56           C  
+ATOM   2010  C   LEU A 333      67.366   7.747  19.796  1.00 58.60           C  
+ATOM   2011  O   LEU A 333      66.162   7.934  19.891  1.00 58.41           O  
+ATOM   2012  CB  LEU A 333      68.056   5.452  19.189  1.00 61.86           C  
+ATOM   2013  CG  LEU A 333      68.122   4.409  18.074  1.00 67.47           C  
+ATOM   2014  CD1 LEU A 333      68.575   3.063  18.637  1.00 70.77           C  
+ATOM   2015  CD2 LEU A 333      66.762   4.267  17.432  1.00 69.07           C  
+ATOM   2016  N   GLU A 334      68.249   8.274  20.630  1.00 56.19           N  
+ATOM   2017  CA  GLU A 334      67.851   9.163  21.714  1.00 57.83           C  
+ATOM   2018  C   GLU A 334      67.111  10.314  21.027  1.00 59.67           C  
+ATOM   2019  O   GLU A 334      65.930  10.580  21.288  1.00 58.28           O  
+ATOM   2020  CB  GLU A 334      69.112   9.704  22.397  1.00 60.54           C  
+ATOM   2021  CG  GLU A 334      68.966  10.384  23.761  1.00 61.97           C  
+ATOM   2022  CD  GLU A 334      68.034  11.572  23.764  1.00 65.49           C  
+ATOM   2023  OE1 GLU A 334      66.806  11.356  23.882  1.00 66.73           O  
+ATOM   2024  OE2 GLU A 334      68.527  12.718  23.648  1.00 64.64           O  
+ATOM   2025  N   ALA A 335      67.841  10.988  20.138  1.00 60.09           N  
+ATOM   2026  CA  ALA A 335      67.333  12.116  19.371  1.00 58.77           C  
+ATOM   2027  C   ALA A 335      66.056  11.727  18.629  1.00 58.27           C  
+ATOM   2028  O   ALA A 335      65.014  12.376  18.784  1.00 58.79           O  
+ATOM   2029  CB  ALA A 335      68.395  12.576  18.379  1.00 57.71           C  
+ATOM   2030  N   PHE A 336      66.149  10.678  17.816  1.00 54.55           N  
+ATOM   2031  CA  PHE A 336      65.009  10.210  17.061  1.00 53.53           C  
+ATOM   2032  C   PHE A 336      63.799  10.160  17.980  1.00 55.62           C  
+ATOM   2033  O   PHE A 336      62.745  10.723  17.690  1.00 56.95           O  
+ATOM   2034  CB  PHE A 336      65.283   8.813  16.523  1.00 52.07           C  
+ATOM   2035  CG  PHE A 336      64.101   8.177  15.852  1.00 50.00           C  
+ATOM   2036  CD1 PHE A 336      63.907   8.311  14.480  1.00 49.65           C  
+ATOM   2037  CD2 PHE A 336      63.178   7.446  16.594  1.00 48.84           C  
+ATOM   2038  CE1 PHE A 336      62.807   7.724  13.849  1.00 50.11           C  
+ATOM   2039  CE2 PHE A 336      62.074   6.856  15.978  1.00 50.56           C  
+ATOM   2040  CZ  PHE A 336      61.888   6.995  14.598  1.00 50.51           C  
+ATOM   2041  N   LYS A 337      63.951   9.481  19.105  1.00 54.95           N  
+ATOM   2042  CA  LYS A 337      62.843   9.358  20.018  1.00 55.90           C  
+ATOM   2043  C   LYS A 337      62.391  10.670  20.603  1.00 56.26           C  
+ATOM   2044  O   LYS A 337      61.198  10.890  20.784  1.00 58.11           O  
+ATOM   2045  CB  LYS A 337      63.193   8.391  21.133  1.00 57.71           C  
+ATOM   2046  CG  LYS A 337      63.098   6.944  20.717  1.00 60.50           C  
+ATOM   2047  CD  LYS A 337      63.545   6.055  21.852  1.00 65.23           C  
+ATOM   2048  CE  LYS A 337      63.215   4.598  21.595  1.00 66.53           C  
+ATOM   2049  NZ  LYS A 337      63.655   3.815  22.787  1.00 71.30           N  
+ATOM   2050  N   THR A 338      63.342  11.541  20.901  1.00 56.82           N  
+ATOM   2051  CA  THR A 338      63.041  12.846  21.487  1.00 57.56           C  
+ATOM   2052  C   THR A 338      62.183  13.741  20.581  1.00 58.58           C  
+ATOM   2053  O   THR A 338      61.194  14.339  21.034  1.00 58.55           O  
+ATOM   2054  CB  THR A 338      64.347  13.601  21.801  1.00 58.82           C  
+ATOM   2055  OG1 THR A 338      65.227  12.727  22.516  1.00 58.64           O  
+ATOM   2056  CG2 THR A 338      64.062  14.880  22.624  1.00 55.48           C  
+ATOM   2057  N   LEU A 339      62.584  13.839  19.311  1.00 56.40           N  
+ATOM   2058  CA  LEU A 339      61.887  14.664  18.342  1.00 56.24           C  
+ATOM   2059  C   LEU A 339      60.453  14.185  18.093  1.00 58.40           C  
+ATOM   2060  O   LEU A 339      59.542  14.991  17.897  1.00 60.54           O  
+ATOM   2061  CB  LEU A 339      62.668  14.688  17.035  1.00 54.10           C  
+ATOM   2062  CG  LEU A 339      62.193  15.645  15.947  1.00 52.36           C  
+ATOM   2063  CD1 LEU A 339      62.275  17.071  16.438  1.00 49.87           C  
+ATOM   2064  CD2 LEU A 339      63.068  15.461  14.733  1.00 53.51           C  
+ATOM   2065  N   CYS A 340      60.247  12.874  18.092  1.00 58.03           N  
+ATOM   2066  CA  CYS A 340      58.913  12.335  17.884  1.00 56.55           C  
+ATOM   2067  C   CYS A 340      58.022  12.792  19.034  1.00 57.40           C  
+ATOM   2068  O   CYS A 340      56.932  13.328  18.828  1.00 58.12           O  
+ATOM   2069  CB  CYS A 340      58.957  10.808  17.881  1.00 54.79           C  
+ATOM   2070  SG  CYS A 340      59.718  10.048  16.455  1.00 58.57           S  
+ATOM   2071  N   LEU A 341      58.523  12.575  20.245  1.00 56.75           N  
+ATOM   2072  CA  LEU A 341      57.827  12.874  21.480  1.00 55.18           C  
+ATOM   2073  C   LEU A 341      57.527  14.325  21.778  1.00 54.07           C  
+ATOM   2074  O   LEU A 341      56.453  14.644  22.276  1.00 55.79           O  
+ATOM   2075  CB  LEU A 341      58.609  12.292  22.658  1.00 56.85           C  
+ATOM   2076  CG  LEU A 341      57.828  11.476  23.694  1.00 55.95           C  
+ATOM   2077  CD1 LEU A 341      58.414  11.745  25.062  1.00 52.74           C  
+ATOM   2078  CD2 LEU A 341      56.346  11.860  23.671  1.00 57.85           C  
+ATOM   2079  N   HIS A 342      58.465  15.206  21.484  1.00 54.14           N  
+ATOM   2080  CA  HIS A 342      58.269  16.615  21.775  1.00 55.42           C  
+ATOM   2081  C   HIS A 342      57.851  17.487  20.598  1.00 56.04           C  
+ATOM   2082  O   HIS A 342      57.103  18.450  20.751  1.00 56.17           O  
+ATOM   2083  CB  HIS A 342      59.546  17.151  22.396  1.00 58.70           C  
+ATOM   2084  CG  HIS A 342      59.909  16.451  23.667  1.00 65.72           C  
+ATOM   2085  ND1 HIS A 342      59.257  16.692  24.860  1.00 65.85           N  
+ATOM   2086  CD2 HIS A 342      60.788  15.450  23.915  1.00 65.35           C  
+ATOM   2087  CE1 HIS A 342      59.718  15.868  25.783  1.00 64.28           C  
+ATOM   2088  NE2 HIS A 342      60.646  15.104  25.236  1.00 64.25           N  
+ATOM   2089  N   GLU A 343      58.315  17.147  19.410  1.00 55.59           N  
+ATOM   2090  CA  GLU A 343      57.982  17.944  18.261  1.00 53.54           C  
+ATOM   2091  C   GLU A 343      56.944  17.314  17.372  1.00 52.87           C  
+ATOM   2092  O   GLU A 343      56.377  17.976  16.514  1.00 56.05           O  
+ATOM   2093  CB  GLU A 343      59.251  18.229  17.483  1.00 54.31           C  
+ATOM   2094  CG  GLU A 343      60.211  19.077  18.268  1.00 56.22           C  
+ATOM   2095  CD  GLU A 343      59.510  20.262  18.903  1.00 59.44           C  
+ATOM   2096  OE1 GLU A 343      58.447  20.664  18.366  1.00 61.55           O  
+ATOM   2097  OE2 GLU A 343      60.022  20.796  19.918  1.00 59.71           O  
+ATOM   2098  N   GLY A 344      56.680  16.038  17.580  1.00 49.29           N  
+ATOM   2099  CA  GLY A 344      55.705  15.381  16.749  1.00 47.93           C  
+ATOM   2100  C   GLY A 344      56.245  15.179  15.355  1.00 46.49           C  
+ATOM   2101  O   GLY A 344      55.481  15.152  14.393  1.00 48.31           O  
+ATOM   2102  N   ILE A 345      57.561  15.039  15.242  1.00 45.34           N  
+ATOM   2103  CA  ILE A 345      58.196  14.818  13.953  1.00 47.30           C  
+ATOM   2104  C   ILE A 345      59.045  13.549  13.988  1.00 49.50           C  
+ATOM   2105  O   ILE A 345      59.967  13.443  14.799  1.00 49.40           O  
+ATOM   2106  CB  ILE A 345      59.128  15.996  13.553  1.00 47.11           C  
+ATOM   2107  CG1 ILE A 345      58.376  17.317  13.611  1.00 47.04           C  
+ATOM   2108  CG2 ILE A 345      59.636  15.809  12.131  1.00 47.54           C  
+ATOM   2109  CD1 ILE A 345      59.181  18.480  13.103  1.00 46.48           C  
+ATOM   2110  N   ILE A 346      58.736  12.604  13.100  1.00 50.70           N  
+ATOM   2111  CA  ILE A 346      59.472  11.337  12.985  1.00 53.10           C  
+ATOM   2112  C   ILE A 346      60.687  11.606  12.083  1.00 53.04           C  
+ATOM   2113  O   ILE A 346      60.555  11.603  10.858  1.00 56.31           O  
+ATOM   2114  CB  ILE A 346      58.611  10.223  12.269  1.00 55.67           C  
+ATOM   2115  CG1 ILE A 346      57.176  10.200  12.796  1.00 54.89           C  
+ATOM   2116  CG2 ILE A 346      59.239   8.861  12.472  1.00 54.11           C  
+ATOM   2117  CD1 ILE A 346      57.105   9.968  14.262  1.00 59.04           C  
+ATOM   2118  N   PRO A 347      61.879  11.830  12.654  1.00 51.38           N  
+ATOM   2119  CA  PRO A 347      63.019  12.088  11.778  1.00 50.67           C  
+ATOM   2120  C   PRO A 347      63.558  10.811  11.172  1.00 50.96           C  
+ATOM   2121  O   PRO A 347      63.259   9.727  11.650  1.00 52.34           O  
+ATOM   2122  CB  PRO A 347      64.028  12.715  12.723  1.00 49.14           C  
+ATOM   2123  CG  PRO A 347      63.839  11.910  13.922  1.00 50.83           C  
+ATOM   2124  CD  PRO A 347      62.312  11.843  14.057  1.00 51.65           C  
+ATOM   2125  N   ALA A 348      64.337  10.956  10.103  1.00 53.00           N  
+ATOM   2126  CA  ALA A 348      64.999   9.841   9.430  1.00 53.58           C  
+ATOM   2127  C   ALA A 348      66.275   9.616  10.260  1.00 58.08           C  
+ATOM   2128  O   ALA A 348      66.650  10.477  11.068  1.00 58.63           O  
+ATOM   2129  CB  ALA A 348      65.364  10.226   8.022  1.00 48.87           C  
+ATOM   2130  N   LEU A 349      66.951   8.484  10.089  1.00 60.50           N  
+ATOM   2131  CA  LEU A 349      68.142   8.264  10.889  1.00 61.93           C  
+ATOM   2132  C   LEU A 349      69.230   9.268  10.555  1.00 64.17           C  
+ATOM   2133  O   LEU A 349      69.924   9.733  11.452  1.00 66.19           O  
+ATOM   2134  CB  LEU A 349      68.640   6.844  10.712  1.00 64.68           C  
+ATOM   2135  CG  LEU A 349      67.694   5.804  11.311  1.00 66.45           C  
+ATOM   2136  CD1 LEU A 349      68.128   4.439  10.845  1.00 67.37           C  
+ATOM   2137  CD2 LEU A 349      67.698   5.885  12.832  1.00 66.12           C  
+ATOM   2138  N   GLU A 350      69.379   9.620   9.276  1.00 65.05           N  
+ATOM   2139  CA  GLU A 350      70.374  10.621   8.875  1.00 63.92           C  
+ATOM   2140  C   GLU A 350      70.117  11.953   9.645  1.00 63.05           C  
+ATOM   2141  O   GLU A 350      71.035  12.508  10.233  1.00 64.47           O  
+ATOM   2142  CB  GLU A 350      70.291  10.834   7.369  1.00 66.88           C  
+ATOM   2143  CG  GLU A 350      71.507  11.464   6.717  1.00 77.19           C  
+ATOM   2144  CD  GLU A 350      71.312  11.681   5.191  1.00 85.71           C  
+ATOM   2145  OE1 GLU A 350      70.588  12.641   4.807  1.00 87.95           O  
+ATOM   2146  OE2 GLU A 350      71.873  10.887   4.376  1.00 87.38           O  
+ATOM   2147  N   SER A 351      68.881  12.458   9.669  1.00 60.73           N  
+ATOM   2148  CA  SER A 351      68.588  13.697  10.407  1.00 58.59           C  
+ATOM   2149  C   SER A 351      68.845  13.493  11.888  1.00 57.78           C  
+ATOM   2150  O   SER A 351      69.325  14.386  12.582  1.00 56.87           O  
+ATOM   2151  CB  SER A 351      67.107  14.123  10.286  1.00 59.68           C  
+ATOM   2152  OG  SER A 351      66.656  14.320   8.953  1.00 61.53           O  
+ATOM   2153  N   SER A 352      68.477  12.315  12.375  1.00 58.27           N  
+ATOM   2154  CA  SER A 352      68.614  11.990  13.788  1.00 59.86           C  
+ATOM   2155  C   SER A 352      70.001  12.222  14.350  1.00 59.90           C  
+ATOM   2156  O   SER A 352      70.142  12.681  15.480  1.00 60.83           O  
+ATOM   2157  CB  SER A 352      68.180  10.550  14.035  1.00 60.42           C  
+ATOM   2158  OG  SER A 352      66.819  10.400  13.682  1.00 63.22           O  
+ATOM   2159  N   HIS A 353      71.027  11.894  13.578  1.00 59.11           N  
+ATOM   2160  CA  HIS A 353      72.381  12.123  14.037  1.00 60.55           C  
+ATOM   2161  C   HIS A 353      72.620  13.647  14.099  1.00 61.98           C  
+ATOM   2162  O   HIS A 353      73.180  14.174  15.063  1.00 61.82           O  
+ATOM   2163  CB  HIS A 353      73.380  11.475  13.076  1.00 62.23           C  
+ATOM   2164  CG  HIS A 353      73.320   9.978  13.056  1.00 64.82           C  
+ATOM   2165  ND1 HIS A 353      72.299   9.281  12.449  1.00 66.83           N  
+ATOM   2166  CD2 HIS A 353      74.159   9.044  13.562  1.00 63.15           C  
+ATOM   2167  CE1 HIS A 353      72.513   7.984  12.580  1.00 63.45           C  
+ATOM   2168  NE2 HIS A 353      73.636   7.815  13.252  1.00 62.73           N  
+ATOM   2169  N   ALA A 354      72.194  14.364  13.066  1.00 61.52           N  
+ATOM   2170  CA  ALA A 354      72.395  15.798  13.067  1.00 60.74           C  
+ATOM   2171  C   ALA A 354      71.647  16.379  14.245  1.00 60.80           C  
+ATOM   2172  O   ALA A 354      72.159  17.265  14.926  1.00 63.13           O  
+ATOM   2173  CB  ALA A 354      71.897  16.412  11.770  1.00 60.93           C  
+ATOM   2174  N   LEU A 355      70.439  15.877  14.492  1.00 59.22           N  
+ATOM   2175  CA  LEU A 355      69.645  16.376  15.601  1.00 57.42           C  
+ATOM   2176  C   LEU A 355      70.281  16.016  16.946  1.00 57.00           C  
+ATOM   2177  O   LEU A 355      70.153  16.744  17.932  1.00 56.76           O  
+ATOM   2178  CB  LEU A 355      68.226  15.817  15.542  1.00 55.41           C  
+ATOM   2179  CG  LEU A 355      67.415  16.306  16.760  1.00 56.24           C  
+ATOM   2180  CD1 LEU A 355      67.523  17.840  16.854  1.00 50.61           C  
+ATOM   2181  CD2 LEU A 355      65.953  15.839  16.668  1.00 52.65           C  
+ATOM   2182  N   ALA A 356      70.961  14.879  16.975  1.00 55.24           N  
+ATOM   2183  CA  ALA A 356      71.614  14.430  18.177  1.00 54.34           C  
+ATOM   2184  C   ALA A 356      72.708  15.417  18.566  1.00 58.03           C  
+ATOM   2185  O   ALA A 356      72.851  15.768  19.752  1.00 60.05           O  
+ATOM   2186  CB  ALA A 356      72.203  13.058  17.956  1.00 51.29           C  
+ATOM   2187  N   HIS A 357      73.481  15.883  17.582  1.00 58.73           N  
+ATOM   2188  CA  HIS A 357      74.553  16.806  17.896  1.00 58.00           C  
+ATOM   2189  C   HIS A 357      74.038  18.141  18.387  1.00 58.37           C  
+ATOM   2190  O   HIS A 357      74.630  18.750  19.278  1.00 57.48           O  
+ATOM   2191  CB  HIS A 357      75.450  17.043  16.708  1.00 59.51           C  
+ATOM   2192  CG  HIS A 357      76.653  17.865  17.048  1.00 64.94           C  
+ATOM   2193  ND1 HIS A 357      77.817  17.312  17.538  1.00 64.94           N  
+ATOM   2194  CD2 HIS A 357      76.845  19.206  17.045  1.00 65.63           C  
+ATOM   2195  CE1 HIS A 357      78.673  18.277  17.819  1.00 65.86           C  
+ATOM   2196  NE2 HIS A 357      78.108  19.437  17.531  1.00 65.89           N  
+ATOM   2197  N   ALA A 358      72.942  18.605  17.798  1.00 59.53           N  
+ATOM   2198  CA  ALA A 358      72.360  19.882  18.208  1.00 62.15           C  
+ATOM   2199  C   ALA A 358      71.926  19.704  19.640  1.00 62.35           C  
+ATOM   2200  O   ALA A 358      72.137  20.574  20.483  1.00 62.57           O  
+ATOM   2201  CB  ALA A 358      71.154  20.233  17.347  1.00 62.48           C  
+ATOM   2202  N   LEU A 359      71.320  18.549  19.898  1.00 62.12           N  
+ATOM   2203  CA  LEU A 359      70.840  18.199  21.225  1.00 61.09           C  
+ATOM   2204  C   LEU A 359      71.993  18.191  22.219  1.00 59.26           C  
+ATOM   2205  O   LEU A 359      71.850  18.640  23.351  1.00 57.03           O  
+ATOM   2206  CB  LEU A 359      70.159  16.834  21.173  1.00 60.49           C  
+ATOM   2207  CG  LEU A 359      68.642  16.775  21.348  1.00 58.96           C  
+ATOM   2208  CD1 LEU A 359      67.969  18.046  20.832  1.00 57.43           C  
+ATOM   2209  CD2 LEU A 359      68.144  15.533  20.630  1.00 59.17           C  
+ATOM   2210  N   LYS A 360      73.142  17.688  21.790  1.00 58.41           N  
+ATOM   2211  CA  LYS A 360      74.300  17.675  22.667  1.00 58.83           C  
+ATOM   2212  C   LYS A 360      74.777  19.119  22.917  1.00 60.42           C  
+ATOM   2213  O   LYS A 360      75.038  19.495  24.054  1.00 60.76           O  
+ATOM   2214  CB  LYS A 360      75.404  16.845  22.042  1.00 55.74           C  
+ATOM   2215  CG  LYS A 360      76.553  16.567  22.959  1.00 54.90           C  
+ATOM   2216  CD  LYS A 360      77.518  15.594  22.289  1.00 56.67           C  
+ATOM   2217  CE  LYS A 360      76.832  14.258  21.939  1.00 55.66           C  
+ATOM   2218  NZ  LYS A 360      77.720  13.334  21.176  1.00 54.59           N  
+ATOM   2219  N   MET A 361      74.866  19.934  21.863  1.00 61.12           N  
+ATOM   2220  CA  MET A 361      75.297  21.325  22.016  1.00 61.31           C  
+ATOM   2221  C   MET A 361      74.416  22.069  23.026  1.00 63.50           C  
+ATOM   2222  O   MET A 361      74.909  22.790  23.892  1.00 64.36           O  
+ATOM   2223  CB  MET A 361      75.261  22.050  20.666  1.00 59.64           C  
+ATOM   2224  CG  MET A 361      76.297  21.556  19.672  1.00 57.47           C  
+ATOM   2225  SD  MET A 361      76.282  22.375  18.061  1.00 57.21           S  
+ATOM   2226  CE  MET A 361      76.170  24.072  18.480  1.00 51.54           C  
+ATOM   2227  N   MET A 362      73.106  21.892  22.908  1.00 65.54           N  
+ATOM   2228  CA  MET A 362      72.159  22.533  23.814  1.00 66.13           C  
+ATOM   2229  C   MET A 362      72.344  21.991  25.251  1.00 66.31           C  
+ATOM   2230  O   MET A 362      72.582  22.737  26.200  1.00 64.63           O  
+ATOM   2231  CB  MET A 362      70.729  22.263  23.327  1.00 64.22           C  
+ATOM   2232  CG  MET A 362      69.636  22.721  24.283  1.00 63.49           C  
+ATOM   2233  SD  MET A 362      68.011  22.023  23.900  1.00 64.43           S  
+ATOM   2234  CE  MET A 362      68.467  20.231  23.663  1.00 57.50           C  
+ATOM   2235  N   ARG A 363      72.241  20.679  25.392  1.00 66.49           N  
+ATOM   2236  CA  ARG A 363      72.374  20.044  26.683  1.00 65.59           C  
+ATOM   2237  C   ARG A 363      73.671  20.364  27.401  1.00 68.49           C  
+ATOM   2238  O   ARG A 363      73.658  20.580  28.618  1.00 68.99           O  
+ATOM   2239  CB  ARG A 363      72.199  18.546  26.515  1.00 62.46           C  
+ATOM   2240  CG  ARG A 363      70.749  18.176  26.247  1.00 60.41           C  
+ATOM   2241  CD  ARG A 363      70.636  16.781  25.690  1.00 57.80           C  
+ATOM   2242  NE  ARG A 363      69.252  16.375  25.459  1.00 56.60           N  
+ATOM   2243  CZ  ARG A 363      68.948  15.243  24.843  1.00 55.83           C  
+ATOM   2244  NH1 ARG A 363      69.936  14.467  24.433  1.00 54.57           N  
+ATOM   2245  NH2 ARG A 363      67.692  14.886  24.631  1.00 52.88           N  
+ATOM   2246  N   GLU A 364      74.784  20.409  26.667  1.00 70.94           N  
+ATOM   2247  CA  GLU A 364      76.077  20.728  27.280  1.00 71.36           C  
+ATOM   2248  C   GLU A 364      76.010  22.085  27.966  1.00 72.35           C  
+ATOM   2249  O   GLU A 364      76.173  22.156  29.171  1.00 73.94           O  
+ATOM   2250  CB  GLU A 364      77.198  20.712  26.253  1.00 71.24           C  
+ATOM   2251  CG  GLU A 364      78.252  19.688  26.578  1.00 72.38           C  
+ATOM   2252  CD  GLU A 364      78.708  18.909  25.357  1.00 76.40           C  
+ATOM   2253  OE1 GLU A 364      79.166  19.546  24.363  1.00 76.70           O  
+ATOM   2254  OE2 GLU A 364      78.604  17.656  25.401  1.00 75.38           O  
+ATOM   2255  N   ASN A 365      75.782  23.170  27.237  1.00 73.26           N  
+ATOM   2256  CA  ASN A 365      75.661  24.426  27.952  1.00 75.22           C  
+ATOM   2257  C   ASN A 365      74.267  25.035  27.822  1.00 75.12           C  
+ATOM   2258  O   ASN A 365      73.988  25.834  26.917  1.00 75.48           O  
+ATOM   2259  CB  ASN A 365      76.719  25.437  27.531  1.00 79.46           C  
+ATOM   2260  CG  ASN A 365      76.994  26.463  28.641  1.00 85.51           C  
+ATOM   2261  OD1 ASN A 365      76.135  27.296  28.990  1.00 86.30           O  
+ATOM   2262  ND2 ASN A 365      78.188  26.383  29.223  1.00 89.33           N  
+ATOM   2263  N   PRO A 366      73.367  24.656  28.744  1.00 73.45           N  
+ATOM   2264  CA  PRO A 366      71.978  25.107  28.816  1.00 72.42           C  
+ATOM   2265  C   PRO A 366      71.822  26.607  28.772  1.00 72.69           C  
+ATOM   2266  O   PRO A 366      70.741  27.122  28.455  1.00 74.01           O  
+ATOM   2267  CB  PRO A 366      71.507  24.527  30.137  1.00 70.87           C  
+ATOM   2268  CG  PRO A 366      72.235  23.232  30.173  1.00 72.57           C  
+ATOM   2269  CD  PRO A 366      73.626  23.630  29.767  1.00 71.44           C  
+ATOM   2270  N   ASP A 367      72.898  27.316  29.076  1.00 71.79           N  
+ATOM   2271  CA  ASP A 367      72.810  28.752  29.088  1.00 72.55           C  
+ATOM   2272  C   ASP A 367      73.362  29.472  27.908  1.00 70.93           C  
+ATOM   2273  O   ASP A 367      72.954  30.592  27.637  1.00 70.35           O  
+ATOM   2274  CB  ASP A 367      73.452  29.304  30.340  1.00 79.86           C  
+ATOM   2275  CG  ASP A 367      72.555  29.173  31.536  1.00 86.06           C  
+ATOM   2276  OD1 ASP A 367      71.365  29.574  31.420  1.00 88.65           O  
+ATOM   2277  OD2 ASP A 367      73.034  28.670  32.584  1.00 91.30           O  
+ATOM   2278  N   LYS A 368      74.300  28.864  27.206  1.00 69.82           N  
+ATOM   2279  CA  LYS A 368      74.855  29.545  26.052  1.00 69.49           C  
+ATOM   2280  C   LYS A 368      73.654  29.881  25.208  1.00 71.05           C  
+ATOM   2281  O   LYS A 368      72.875  28.995  24.856  1.00 73.73           O  
+ATOM   2282  CB  LYS A 368      75.795  28.626  25.278  1.00 67.73           C  
+ATOM   2283  CG  LYS A 368      76.589  29.316  24.199  1.00 64.97           C  
+ATOM   2284  CD  LYS A 368      77.610  28.353  23.654  1.00 66.28           C  
+ATOM   2285  CE  LYS A 368      78.627  29.020  22.737  1.00 68.89           C  
+ATOM   2286  NZ  LYS A 368      79.660  28.021  22.277  1.00 69.89           N  
+ATOM   2287  N   GLU A 369      73.465  31.159  24.927  1.00 70.20           N  
+ATOM   2288  CA  GLU A 369      72.346  31.565  24.103  1.00 69.31           C  
+ATOM   2289  C   GLU A 369      72.795  31.287  22.669  1.00 68.85           C  
+ATOM   2290  O   GLU A 369      73.532  32.065  22.090  1.00 71.14           O  
+ATOM   2291  CB  GLU A 369      72.075  33.042  24.332  1.00 71.57           C  
+ATOM   2292  CG  GLU A 369      71.365  33.739  23.196  1.00 83.60           C  
+ATOM   2293  CD  GLU A 369      71.005  35.193  23.528  1.00 91.80           C  
+ATOM   2294  OE1 GLU A 369      70.518  35.920  22.615  1.00 93.56           O  
+ATOM   2295  OE2 GLU A 369      71.208  35.607  24.707  1.00 96.29           O  
+ATOM   2296  N   GLN A 370      72.371  30.161  22.103  1.00 67.85           N  
+ATOM   2297  CA  GLN A 370      72.760  29.790  20.743  1.00 64.61           C  
+ATOM   2298  C   GLN A 370      71.586  29.506  19.794  1.00 64.00           C  
+ATOM   2299  O   GLN A 370      70.559  28.965  20.202  1.00 64.99           O  
+ATOM   2300  CB  GLN A 370      73.691  28.583  20.803  1.00 63.27           C  
+ATOM   2301  CG  GLN A 370      73.135  27.414  21.569  1.00 61.33           C  
+ATOM   2302  CD  GLN A 370      74.199  26.369  21.862  1.00 64.92           C  
+ATOM   2303  OE1 GLN A 370      75.280  26.394  21.266  1.00 62.72           O  
+ATOM   2304  NE2 GLN A 370      73.896  25.431  22.774  1.00 65.52           N  
+ATOM   2305  N   LEU A 371      71.765  29.882  18.527  1.00 61.62           N  
+ATOM   2306  CA  LEU A 371      70.773  29.722  17.459  1.00 58.03           C  
+ATOM   2307  C   LEU A 371      71.264  28.670  16.476  1.00 57.54           C  
+ATOM   2308  O   LEU A 371      72.187  28.907  15.695  1.00 57.20           O  
+ATOM   2309  CB  LEU A 371      70.608  31.047  16.739  1.00 58.07           C  
+ATOM   2310  CG  LEU A 371      69.699  31.093  15.528  1.00 57.81           C  
+ATOM   2311  CD1 LEU A 371      68.366  30.467  15.895  1.00 56.34           C  
+ATOM   2312  CD2 LEU A 371      69.533  32.551  15.075  1.00 56.47           C  
+ATOM   2313  N   LEU A 372      70.621  27.515  16.489  1.00 55.94           N  
+ATOM   2314  CA  LEU A 372      71.051  26.409  15.644  1.00 53.83           C  
+ATOM   2315  C   LEU A 372      70.067  26.025  14.569  1.00 51.61           C  
+ATOM   2316  O   LEU A 372      68.869  26.171  14.748  1.00 54.88           O  
+ATOM   2317  CB  LEU A 372      71.282  25.181  16.526  1.00 54.39           C  
+ATOM   2318  CG  LEU A 372      72.143  25.374  17.776  1.00 53.85           C  
+ATOM   2319  CD1 LEU A 372      72.100  24.123  18.626  1.00 54.34           C  
+ATOM   2320  CD2 LEU A 372      73.561  25.689  17.364  1.00 54.82           C  
+ATOM   2321  N   VAL A 373      70.559  25.525  13.449  1.00 47.53           N  
+ATOM   2322  CA  VAL A 373      69.650  25.059  12.422  1.00 46.19           C  
+ATOM   2323  C   VAL A 373      70.086  23.641  12.056  1.00 47.63           C  
+ATOM   2324  O   VAL A 373      71.267  23.382  11.849  1.00 46.82           O  
+ATOM   2325  CB  VAL A 373      69.671  25.957  11.177  1.00 44.31           C  
+ATOM   2326  CG1 VAL A 373      68.939  25.284  10.056  1.00 43.67           C  
+ATOM   2327  CG2 VAL A 373      69.006  27.283  11.476  1.00 42.42           C  
+ATOM   2328  N   VAL A 374      69.138  22.714  12.018  1.00 47.67           N  
+ATOM   2329  CA  VAL A 374      69.453  21.338  11.662  1.00 48.38           C  
+ATOM   2330  C   VAL A 374      68.794  21.004  10.343  1.00 47.96           C  
+ATOM   2331  O   VAL A 374      67.596  21.221  10.169  1.00 48.04           O  
+ATOM   2332  CB  VAL A 374      68.955  20.324  12.734  1.00 49.64           C  
+ATOM   2333  CG1 VAL A 374      69.073  18.861  12.226  1.00 44.97           C  
+ATOM   2334  CG2 VAL A 374      69.766  20.497  13.983  1.00 51.45           C  
+ATOM   2335  N   ASN A 375      69.591  20.481   9.418  1.00 47.01           N  
+ATOM   2336  CA  ASN A 375      69.084  20.099   8.120  1.00 49.22           C  
+ATOM   2337  C   ASN A 375      68.393  18.750   8.245  1.00 50.82           C  
+ATOM   2338  O   ASN A 375      69.018  17.776   8.658  1.00 53.28           O  
+ATOM   2339  CB  ASN A 375      70.223  19.981   7.117  1.00 47.68           C  
+ATOM   2340  CG  ASN A 375      69.715  19.938   5.702  1.00 49.33           C  
+ATOM   2341  OD1 ASN A 375      69.159  20.907   5.223  1.00 53.40           O  
+ATOM   2342  ND2 ASN A 375      69.882  18.814   5.030  1.00 52.31           N  
+ATOM   2343  N   LEU A 376      67.116  18.670   7.893  1.00 50.82           N  
+ATOM   2344  CA  LEU A 376      66.415  17.398   7.995  1.00 52.07           C  
+ATOM   2345  C   LEU A 376      66.511  16.596   6.700  1.00 56.59           C  
+ATOM   2346  O   LEU A 376      66.035  17.046   5.672  1.00 58.32           O  
+ATOM   2347  CB  LEU A 376      64.965  17.655   8.355  1.00 48.80           C  
+ATOM   2348  CG  LEU A 376      64.511  17.106   9.709  1.00 49.39           C  
+ATOM   2349  CD1 LEU A 376      65.647  17.042  10.696  1.00 48.10           C  
+ATOM   2350  CD2 LEU A 376      63.386  17.976  10.232  1.00 48.51           C  
+ATOM   2351  N   SER A 377      67.137  15.419   6.753  1.00 62.47           N  
+ATOM   2352  CA  SER A 377      67.300  14.557   5.576  1.00 69.80           C  
+ATOM   2353  C   SER A 377      65.955  14.115   4.948  1.00 75.80           C  
+ATOM   2354  O   SER A 377      65.377  14.882   4.178  1.00 79.43           O  
+ATOM   2355  CB  SER A 377      68.148  13.325   5.918  1.00 70.12           C  
+ATOM   2356  OG  SER A 377      67.433  12.383   6.707  1.00 72.27           O  
+ATOM   2357  N   GLY A 378      65.426  12.920   5.229  1.00 78.55           N  
+ATOM   2358  CA  GLY A 378      64.170  12.638   4.561  1.00 83.95           C  
+ATOM   2359  C   GLY A 378      63.246  11.444   4.719  1.00 89.08           C  
+ATOM   2360  O   GLY A 378      62.082  11.624   5.108  1.00 89.15           O  
+ATOM   2361  N   ARG A 379      63.712  10.239   4.385  1.00 94.01           N  
+ATOM   2362  CA  ARG A 379      62.842   9.051   4.473  1.00 97.64           C  
+ATOM   2363  C   ARG A 379      62.382   8.660   5.893  1.00 98.26           C  
+ATOM   2364  O   ARG A 379      62.442   7.483   6.281  1.00 97.03           O  
+ATOM   2365  CB  ARG A 379      63.506   7.859   3.751  1.00 98.03           C  
+ATOM   2366  CG  ARG A 379      65.005   7.772   3.871  1.00 98.17           C  
+ATOM   2367  CD  ARG A 379      65.539   6.738   2.892  1.00 99.93           C  
+ATOM   2368  NE  ARG A 379      66.472   5.797   3.523  1.00103.91           N  
+ATOM   2369  CZ  ARG A 379      67.703   6.099   3.948  1.00104.42           C  
+ATOM   2370  NH1 ARG A 379      68.184   7.332   3.811  1.00102.62           N  
+ATOM   2371  NH2 ARG A 379      68.452   5.164   4.527  1.00104.51           N  
+ATOM   2372  N   GLY A 380      61.889   9.671   6.624  1.00 99.37           N  
+ATOM   2373  CA  GLY A 380      61.414   9.533   7.998  1.00 99.61           C  
+ATOM   2374  C   GLY A 380      60.500   8.359   8.272  1.00100.44           C  
+ATOM   2375  O   GLY A 380      60.649   7.670   9.285  1.00 99.86           O  
+ATOM   2376  N   ASP A 381      59.549   8.134   7.371  1.00101.00           N  
+ATOM   2377  CA  ASP A 381      58.622   7.023   7.512  1.00101.37           C  
+ATOM   2378  C   ASP A 381      58.919   5.890   6.524  1.00 99.89           C  
+ATOM   2379  O   ASP A 381      58.040   5.102   6.164  1.00 99.39           O  
+ATOM   2380  CB  ASP A 381      57.178   7.516   7.377  1.00102.85           C  
+ATOM   2381  CG  ASP A 381      56.738   8.341   8.580  1.00104.87           C  
+ATOM   2382  OD1 ASP A 381      57.000   7.901   9.724  1.00105.99           O  
+ATOM   2383  OD2 ASP A 381      56.132   9.422   8.391  1.00105.43           O  
+ATOM   2384  N   LYS A 382      60.176   5.815   6.102  1.00 97.20           N  
+ATOM   2385  CA  LYS A 382      60.616   4.765   5.199  1.00 95.55           C  
+ATOM   2386  C   LYS A 382      61.586   3.890   6.014  1.00 95.18           C  
+ATOM   2387  O   LYS A 382      61.481   2.655   6.031  1.00 94.87           O  
+ATOM   2388  CB  LYS A 382      61.294   5.390   3.981  1.00 95.57           C  
+ATOM   2389  CG  LYS A 382      60.491   6.557   3.395  1.00 93.08           C  
+ATOM   2390  CD  LYS A 382      60.924   6.893   1.975  1.00 91.26           C  
+ATOM   2391  CE  LYS A 382      60.553   5.776   1.009  1.00 89.86           C  
+ATOM   2392  NZ  LYS A 382      59.084   5.497   0.995  1.00 87.53           N  
+ATOM   2393  N   ASP A 383      62.517   4.528   6.717  1.00 93.00           N  
+ATOM   2394  CA  ASP A 383      63.433   3.769   7.554  1.00 89.31           C  
+ATOM   2395  C   ASP A 383      62.933   3.836   9.015  1.00 86.97           C  
+ATOM   2396  O   ASP A 383      63.710   3.880   9.969  1.00 85.65           O  
+ATOM   2397  CB  ASP A 383      64.878   4.283   7.386  1.00 89.71           C  
+ATOM   2398  CG  ASP A 383      65.086   5.664   7.946  1.00 88.34           C  
+ATOM   2399  OD1 ASP A 383      66.169   6.238   7.703  1.00 86.64           O  
+ATOM   2400  OD2 ASP A 383      64.176   6.168   8.635  1.00 90.01           O  
+ATOM   2401  N   ILE A 384      61.604   3.851   9.145  1.00 84.30           N  
+ATOM   2402  CA  ILE A 384      60.870   3.852  10.417  1.00 79.77           C  
+ATOM   2403  C   ILE A 384      60.876   2.383  10.838  1.00 79.99           C  
+ATOM   2404  O   ILE A 384      60.732   2.042  12.012  1.00 80.46           O  
+ATOM   2405  CB  ILE A 384      59.389   4.278  10.198  1.00 76.95           C  
+ATOM   2406  CG1 ILE A 384      58.596   4.233  11.497  1.00 72.75           C  
+ATOM   2407  CG2 ILE A 384      58.716   3.329   9.235  1.00 78.19           C  
+ATOM   2408  CD1 ILE A 384      58.627   5.507  12.244  1.00 70.37           C  
+ATOM   2409  N   PHE A 385      61.041   1.526   9.831  1.00 80.37           N  
+ATOM   2410  CA  PHE A 385      61.075   0.076   9.982  1.00 78.22           C  
+ATOM   2411  C   PHE A 385      62.377  -0.424  10.608  1.00 76.05           C  
+ATOM   2412  O   PHE A 385      62.348  -1.213  11.549  1.00 74.70           O  
+ATOM   2413  CB  PHE A 385      60.851  -0.574   8.619  1.00 78.57           C  
+ATOM   2414  CG  PHE A 385      59.485  -0.301   8.032  1.00 82.09           C  
+ATOM   2415  CD1 PHE A 385      59.265  -0.403   6.658  1.00 84.79           C  
+ATOM   2416  CD2 PHE A 385      58.408   0.015   8.849  1.00 82.35           C  
+ATOM   2417  CE1 PHE A 385      57.989  -0.198   6.109  1.00 83.74           C  
+ATOM   2418  CE2 PHE A 385      57.129   0.221   8.307  1.00 83.10           C  
+ATOM   2419  CZ  PHE A 385      56.922   0.113   6.936  1.00 81.89           C  
+ATOM   2420  N   THR A 386      63.521   0.028  10.109  1.00 74.37           N  
+ATOM   2421  CA  THR A 386      64.766  -0.427  10.709  1.00 74.19           C  
+ATOM   2422  C   THR A 386      64.897   0.059  12.149  1.00 74.66           C  
+ATOM   2423  O   THR A 386      65.682  -0.474  12.925  1.00 75.68           O  
+ATOM   2424  CB  THR A 386      65.996  -0.001   9.894  1.00 71.90           C  
+ATOM   2425  OG1 THR A 386      65.930   1.393   9.604  1.00 66.68           O  
+ATOM   2426  CG2 THR A 386      66.056  -0.803   8.600  1.00 73.44           C  
+ATOM   2427  N   VAL A 387      64.120   1.067  12.510  1.00 75.15           N  
+ATOM   2428  CA  VAL A 387      64.156   1.561  13.866  1.00 75.26           C  
+ATOM   2429  C   VAL A 387      63.261   0.647  14.686  1.00 77.29           C  
+ATOM   2430  O   VAL A 387      63.562   0.325  15.832  1.00 77.22           O  
+ATOM   2431  CB  VAL A 387      63.662   2.998  13.935  1.00 74.73           C  
+ATOM   2432  CG1 VAL A 387      63.530   3.437  15.388  1.00 73.32           C  
+ATOM   2433  CG2 VAL A 387      64.644   3.893  13.201  1.00 73.69           C  
+ATOM   2434  N   HIS A 388      62.154   0.217  14.095  1.00 79.70           N  
+ATOM   2435  CA  HIS A 388      61.255  -0.693  14.791  1.00 81.27           C  
+ATOM   2436  C   HIS A 388      62.088  -1.913  15.154  1.00 80.71           C  
+ATOM   2437  O   HIS A 388      61.964  -2.458  16.246  1.00 80.26           O  
+ATOM   2438  CB  HIS A 388      60.100  -1.097  13.876  1.00 84.39           C  
+ATOM   2439  CG  HIS A 388      59.046  -1.916  14.555  1.00 88.33           C  
+ATOM   2440  ND1 HIS A 388      57.750  -1.998  14.085  1.00 90.24           N  
+ATOM   2441  CD2 HIS A 388      59.092  -2.688  15.667  1.00 89.20           C  
+ATOM   2442  CE1 HIS A 388      57.044  -2.782  14.880  1.00 91.29           C  
+ATOM   2443  NE2 HIS A 388      57.835  -3.214  15.848  1.00 91.37           N  
+ATOM   2444  N   ASP A 389      62.948  -2.322  14.221  1.00 80.92           N  
+ATOM   2445  CA  ASP A 389      63.838  -3.465  14.403  1.00 78.68           C  
+ATOM   2446  C   ASP A 389      64.872  -3.149  15.469  1.00 78.03           C  
+ATOM   2447  O   ASP A 389      64.890  -3.785  16.508  1.00 77.40           O  
+ATOM   2448  CB  ASP A 389      64.518  -3.803  13.087  1.00 77.68           C  
+ATOM   2449  CG  ASP A 389      63.520  -4.085  11.987  1.00 79.17           C  
+ATOM   2450  OD1 ASP A 389      62.403  -4.550  12.310  1.00 79.13           O  
+ATOM   2451  OD2 ASP A 389      63.850  -3.857  10.803  1.00 79.79           O  
+ATOM   2452  N   ILE A 390      65.732  -2.169  15.214  1.00 78.47           N  
+ATOM   2453  CA  ILE A 390      66.729  -1.760  16.201  1.00 80.70           C  
+ATOM   2454  C   ILE A 390      66.133  -1.868  17.614  1.00 82.21           C  
+ATOM   2455  O   ILE A 390      66.775  -2.392  18.522  1.00 84.61           O  
+ATOM   2456  CB  ILE A 390      67.165  -0.281  15.997  1.00 81.53           C  
+ATOM   2457  CG1 ILE A 390      67.818  -0.088  14.628  1.00 80.20           C  
+ATOM   2458  CG2 ILE A 390      68.115   0.138  17.112  1.00 81.04           C  
+ATOM   2459  CD1 ILE A 390      69.267  -0.497  14.560  1.00 82.28           C  
+ATOM   2460  N   LEU A 391      64.908  -1.368  17.791  1.00 83.11           N  
+ATOM   2461  CA  LEU A 391      64.223  -1.404  19.089  1.00 83.92           C  
+ATOM   2462  C   LEU A 391      63.682  -2.786  19.480  1.00 83.95           C  
+ATOM   2463  O   LEU A 391      63.881  -3.223  20.606  1.00 82.85           O  
+ATOM   2464  CB  LEU A 391      63.082  -0.377  19.130  1.00 82.02           C  
+ATOM   2465  CG  LEU A 391      63.459   1.105  19.108  1.00 79.56           C  
+ATOM   2466  CD1 LEU A 391      62.210   1.953  19.019  1.00 78.17           C  
+ATOM   2467  CD2 LEU A 391      64.232   1.446  20.352  1.00 80.00           C  
+ATOM   2468  N   LYS A 392      62.989  -3.475  18.577  1.00 85.78           N  
+ATOM   2469  CA  LYS A 392      62.494  -4.803  18.928  1.00 89.19           C  
+ATOM   2470  C   LYS A 392      63.715  -5.672  19.240  1.00 91.13           C  
+ATOM   2471  O   LYS A 392      63.704  -6.475  20.178  1.00 91.51           O  
+ATOM   2472  CB  LYS A 392      61.657  -5.411  17.791  1.00 89.47           C  
+ATOM   2473  CG  LYS A 392      61.143  -6.826  18.089  1.00 89.98           C  
+ATOM   2474  CD  LYS A 392      59.886  -7.202  17.276  1.00 91.20           C  
+ATOM   2475  CE  LYS A 392      58.592  -6.640  17.907  1.00 91.19           C  
+ATOM   2476  NZ  LYS A 392      57.362  -7.096  17.188  1.00 86.27           N  
+ATOM   2477  N   ALA A 393      64.772  -5.483  18.453  1.00 92.28           N  
+ATOM   2478  CA  ALA A 393      66.028  -6.192  18.650  1.00 92.10           C  
+ATOM   2479  C   ALA A 393      66.496  -5.874  20.065  1.00 92.84           C  
+ATOM   2480  O   ALA A 393      66.285  -6.664  20.979  1.00 93.93           O  
+ATOM   2481  CB  ALA A 393      67.074  -5.716  17.644  1.00 90.79           C  
+ATOM   2482  N   ARG A 394      67.113  -4.707  20.236  1.00 92.16           N  
+ATOM   2483  CA  ARG A 394      67.619  -4.268  21.532  1.00 92.07           C  
+ATOM   2484  C   ARG A 394      66.660  -4.449  22.713  1.00 92.96           C  
+ATOM   2485  O   ARG A 394      66.934  -3.971  23.813  1.00 93.36           O  
+ATOM   2486  CB  ARG A 394      68.060  -2.809  21.430  1.00 91.41           C  
+ATOM   2487  CG  ARG A 394      69.268  -2.652  20.535  1.00 93.49           C  
+ATOM   2488  CD  ARG A 394      69.403  -1.270  19.908  1.00 94.71           C  
+ATOM   2489  NE  ARG A 394      69.924  -0.234  20.801  1.00 95.19           N  
+ATOM   2490  CZ  ARG A 394      69.214   0.372  21.747  1.00 95.47           C  
+ATOM   2491  NH1 ARG A 394      67.941   0.043  21.942  1.00 94.25           N  
+ATOM   2492  NH2 ARG A 394      69.771   1.333  22.472  1.00 93.95           N  
+ATOM   2493  N   GLY A 395      65.537  -5.127  22.480  1.00 93.48           N  
+ATOM   2494  CA  GLY A 395      64.571  -5.386  23.536  1.00 94.79           C  
+ATOM   2495  C   GLY A 395      63.766  -4.217  24.082  1.00 96.78           C  
+ATOM   2496  O   GLY A 395      62.786  -4.441  24.796  1.00 95.92           O  
+ATOM   2497  N   GLU A 396      64.174  -2.984  23.765  1.00 98.11           N  
+ATOM   2498  CA  GLU A 396      63.469  -1.786  24.230  1.00 99.11           C  
+ATOM   2499  C   GLU A 396      62.023  -1.784  23.749  1.00 99.15           C  
+ATOM   2500  O   GLU A 396      61.187  -1.070  24.301  1.00 98.52           O  
+ATOM   2501  CB  GLU A 396      64.138  -0.499  23.721  1.00 99.80           C  
+ATOM   2502  CG  GLU A 396      65.607  -0.317  24.082  1.00102.19           C  
+ATOM   2503  CD  GLU A 396      66.064   1.142  23.965  1.00103.97           C  
+ATOM   2504  OE1 GLU A 396      67.278   1.418  24.106  1.00103.57           O  
+ATOM   2505  OE2 GLU A 396      65.204   2.021  23.743  1.00105.40           O  
+ATOM   2506  N   ILE A 397      61.741  -2.572  22.712  1.00 99.58           N  
+ATOM   2507  CA  ILE A 397      60.397  -2.650  22.149  1.00100.03           C  
+ATOM   2508  C   ILE A 397      59.417  -3.050  23.232  1.00101.45           C  
+ATOM   2509  O   ILE A 397      58.751  -2.140  23.767  1.00103.73           O  
+ATOM   2510  CB  ILE A 397      60.324  -3.682  20.998  1.00100.17           C  
+ATOM   2511  CG1 ILE A 397      58.930  -3.659  20.351  1.00 98.26           C  
+ATOM   2512  CG2 ILE A 397      60.701  -5.085  21.520  1.00 98.24           C  
+ATOM   2513  CD1 ILE A 397      57.906  -4.572  21.001  1.00 96.68           C  
+ATOM   2514  OXT ILE A 397      59.338  -4.255  23.550  1.00101.23           O  
+TER    2515      ILE A 397                                                      
+HETATM 2516  S   SO4   801      69.043   7.012  -9.193  1.00 66.31           S  
+HETATM 2517  O1  SO4   801      69.648   5.706  -8.897  1.00 68.30           O  
+HETATM 2518  O2  SO4   801      68.821   7.147 -10.634  1.00 69.35           O  
+HETATM 2519  O3  SO4   801      67.736   7.108  -8.505  1.00 63.38           O  
+HETATM 2520  O4  SO4   801      70.013   8.049  -8.788  1.00 67.40           O  
+HETATM 2521  S   SO4   802      65.764  12.613  -3.024  1.00122.71           S  
+HETATM 2522  O1  SO4   802      64.653  13.293  -2.314  1.00122.21           O  
+HETATM 2523  O2  SO4   802      65.491  11.162  -3.117  1.00121.98           O  
+HETATM 2524  O3  SO4   802      65.883  13.183  -4.375  1.00122.41           O  
+HETATM 2525  O4  SO4   802      67.045  12.824  -2.321  1.00119.97           O  
+HETATM 2526  S   SO4   803      58.623  31.383   4.559  1.00107.36           S  
+HETATM 2527  O1  SO4   803      57.430  32.257   4.562  1.00107.44           O  
+HETATM 2528  O2  SO4   803      58.210  30.015   4.932  1.00108.48           O  
+HETATM 2529  O3  SO4   803      59.264  31.351   3.223  1.00106.54           O  
+HETATM 2530  O4  SO4   803      59.588  31.916   5.543  1.00107.97           O  
+HETATM 2531  O   HOH  1001      66.831  -5.950 -21.554  1.00 43.58           O  
+HETATM 2532  O   HOH  1002      65.180  -6.209 -19.516  1.00 41.65           O  
+HETATM 2533  O   HOH  1003      62.688  29.282  -4.030  1.00 34.17           O  
+HETATM 2534  O   HOH  1004      67.580  31.198  -8.353  1.00 44.19           O  
+HETATM 2535  O   HOH  1005      75.239  16.003  -1.158  1.00 39.55           O  
+HETATM 2536  O   HOH  1006      72.167  30.197 -10.130  1.00 61.12           O  
+HETATM 2537  O   HOH  1007      56.615  -0.232 -19.458  1.00 45.44           O  
+HETATM 2538  O   HOH  1008      54.711  11.001  10.088  1.00 50.45           O  
+HETATM 2539  O   HOH  1009      74.094  25.909 -27.795  1.00 51.85           O  
+HETATM 2540  O   HOH  1010      57.981  28.061  12.982  1.00 43.12           O  
+HETATM 2541  O   HOH  1011      56.654  12.901  10.569  1.00 59.80           O  
+HETATM 2542  O   HOH  1012      56.249  17.358 -10.214  1.00 42.97           O  
+HETATM 2543  O   HOH  1013      58.199  13.864   8.194  1.00 58.34           O  
+HETATM 2544  O   HOH  1014      84.797  21.480  -8.429  1.00 47.41           O  
+HETATM 2545  O   HOH  1015      73.057   8.384 -11.162  1.00 37.43           O  
+HETATM 2546  O   HOH  1016      61.749  32.271   1.216  1.00 32.23           O  
+HETATM 2547  O   HOH  1017      56.885  27.950   3.803  1.00 38.41           O  
+HETATM 2548  O   HOH  1018      57.120  18.339  25.504  1.00 42.95           O  
+HETATM 2549  O   HOH  1019      73.887  30.162 -24.485  1.00 31.25           O  
+HETATM 2550  O   HOH  1020      63.805  17.814  26.471  1.00 49.84           O  
+HETATM 2551  O   HOH  1021      80.312  11.302   0.318  1.00 46.36           O  
+HETATM 2552  O   HOH  1022      57.406  10.099  -0.875  1.00 58.56           O  
+HETATM 2553  O   HOH  1023      57.120  -1.779 -16.724  1.00 58.40           O  
+CONECT 2516 2517 2518 2519 2520                                                 
+CONECT 2517 2516                                                                
+CONECT 2518 2516                                                                
+CONECT 2519 2516                                                                
+CONECT 2520 2516                                                                
+CONECT 2521 2522 2523 2524 2525                                                 
+CONECT 2522 2521                                                                
+CONECT 2523 2521                                                                
+CONECT 2524 2521                                                                
+CONECT 2525 2521                                                                
+CONECT 2526 2527 2528 2529 2530                                                 
+CONECT 2527 2526                                                                
+CONECT 2528 2526                                                                
+CONECT 2529 2526                                                                
+CONECT 2530 2526                                                                
+MASTER      353    0    3   16   10    0    0    6 2552    1   15   31          
+END                                                                             
diff --git a/data/spx.vtk b/data/spx.vtk
new file mode 100755
index 0000000..7db9582
--- /dev/null
+++ b/data/spx.vtk
@@ -0,0 +1,31678 @@
+# vtk DataFile Version 3.0
+off file: spx.off
+ASCII
+DATASET UNSTRUCTURED_GRID
+
+POINTS 2896 float
+    -0.94204497     -1.67744994     -3.26706004
+    -1.17192996     -0.98662001     -3.29263997
+    -0.56799501     -1.91210997     -3.72985005
+    -0.71677500     -1.39048004     -3.72985005
+    -0.75750500     -2.22721004     -3.34067988
+    -1.04914999     -2.10929990     -2.93918991
+    -1.21691000     -1.39859998     -2.99743009
+    -1.18373001     -1.73210001     -2.88635993
+    -0.46590501     -1.60518003     -3.40386009
+    -0.61162502     -1.94638002     -3.04132009
+    -0.74990499     -1.41808999     -2.92834997
+    -0.79696500     -1.69246995     -2.75662994
+    -0.88002503     -1.13120997     -3.14802003
+    -0.58237499     -3.42521000      4.64419985
+    -0.62429500     -3.28096008      4.69750023
+    -0.63833499     -3.47328997      4.69750023
+    -0.24937500     -2.53591990      4.69750023
+     1.58766997     -3.47328997      4.69750023
+     1.95340002     -3.42521000      4.64499998
+     2.00967002     -3.47328997      4.69750023
+     1.99563003     -3.28096008      4.69750023
+     1.87321997     -2.88789010      4.69750023
+     1.95097005     -3.08341002      4.69750023
+     1.71431005     -3.08726001      4.69750023
+     1.56773996     -3.28476000      4.69750023
+     1.50366998     -3.09322000      4.69750023
+     1.79867005     -3.47328997      4.69750023
+    -0.34295499     -3.08722997      4.69750023
+    -0.57962501     -3.08341002      4.69750023
+    -0.13234501     -3.09322000      4.69750023
+    -0.02224500     -2.91429996      4.69750023
+    -0.24960500     -2.89361000      4.69750023
+    -0.50188500     -2.88789010      4.69750023
+    -0.39093500     -2.70264006      4.69750023
+    -0.56866503     -3.04994011      4.55205011
+    -0.61893499     -3.24839997      4.41897011
+    -0.63953501     -3.47328997      4.48428011
+    -0.35612500     -3.17053008      4.41346979
+    -0.37826499     -3.24519992      4.57536983
+    -0.39782500     -3.28048992      4.69750023
+    -0.19641501     -3.28476000      4.69750023
+    -0.42733499     -3.47328997      4.69750023
+    -0.21633500     -3.47328997      4.69750023
+    -0.56109500     -3.02782011      4.32473993
+    -0.32397500     -2.61698008      4.50756979
+     1.47949004     -2.67730999      4.69750023
+     1.62108004     -2.89376998      4.69750023
+     1.76225996     -2.70264006      4.69750023
+     1.39357996     -2.91429996      4.69750023
+     1.24294996     -2.76403999      4.69750023
+     1.26203001     -2.53559995      4.69750023
+    -0.91055501     -0.87571001     -3.72985005
+    -1.41366005     -1.08921003     -2.88826990
+    -1.12358999     -0.42214000     -3.72985005
+    -1.00838006     -0.91720998     -2.95188999
+    -0.78255498     -0.82139999     -3.38198996
+    -1.41866004     -0.37615001     -3.36236000
+    -1.51889002     -0.66257000     -3.01943994
+    -0.82434499     -0.56428999     -3.31646991
+    -1.15930998     -0.59078997     -2.79222989
+    -0.10727500     -2.67635989      4.69750023
+     0.12837499     -2.76403999      4.69750023
+    -0.18695500     -2.47755003      4.53462982
+    -0.08245500     -2.39488006      4.69750023
+     0.11532500     -2.52911997      4.69750023
+     0.10258500     -2.28459001      4.69750023
+     0.29752499     -2.20745993      4.69750023
+    -0.14816500     -3.18606997      4.50249004
+     1.76917005     -3.28048992      4.69750023
+     1.57587004     -3.47328997      4.48113012
+     2.00967002     -3.47328997      4.48750019
+     1.96291006     -3.12514997      4.50820017
+     1.57597005     -2.80328989      4.50941992
+     1.85492003     -2.85223007      4.52318001
+     1.68481004     -3.03274012      4.48421001
+     1.51942003     -3.18614006      4.50252008
+     1.42008996     -2.98427010      4.51154995
+     0.09801500     -2.80925989      4.54903984
+     0.30712500     -2.65457010      4.69750023
+     0.49799499     -2.59102988      4.69750023
+     0.87333500     -2.59102988      4.69750023
+     0.68566501     -2.57129002      4.69750023
+     0.87708497     -2.16319990      4.69750023
+     0.68566501     -2.14929008      4.69750023
+     1.07380998     -2.20745993      4.69750023
+     1.78260005     -3.47328997      4.38196993
+    -0.16910499     -2.75886989      4.51167011
+    -0.29661500     -3.00763988      4.52154016
+    -0.04875500     -2.98427010      4.51154995
+    -0.46670499     -2.82151008      4.47609997
+    -0.37840500     -2.68550992      4.32942009
+    -0.47500500     -2.83652997      4.22398996
+    -0.46337500     -2.43688011     -3.72985005
+    -0.50804502     -2.18588996     -4.21365976
+    -0.63345498     -1.66283000     -4.21356010
+    -0.23178500     -1.85169995     -4.02031994
+    -0.24583501     -2.00585008     -3.54896998
+    -0.61711502     -3.23786998      4.18583012
+    -0.64074498     -3.47328997      4.26948023
+    -0.64196497     -3.47328997      4.05150986
+    -0.35297501     -3.09137011      4.23995018
+    -0.39665499     -3.33791995      4.31701994
+    -0.41348499     -3.47328997      4.38883018
+    -0.15110500     -3.27838993      4.33690023
+    -0.20452499     -3.47328997      4.48113012
+     1.26874006     -2.28459001      4.69750023
+     1.45378995     -2.39488006      4.69750023
+     1.62071002     -2.53591990      4.69750023
+     1.54234004     -3.47328997      4.25427008
+    -0.55968499     -3.02405000      4.09158993
+    -0.61653501     -3.23452997      3.95881009
+    -0.22839500     -2.51558995      4.31037998
+    -0.36370501     -2.66610003      4.12911987
+     1.41937006     -2.57171988      4.54100990
+     1.39698005     -2.78000998      4.52009010
+    -0.62920499     -0.75634998     -3.84968996
+    -0.79096502     -1.17809999     -4.21299982
+    -0.34332499     -1.28847003     -3.78246999
+    -0.49939501     -1.03374004     -3.49236012
+     1.67969000     -2.59878993      4.47650003
+     1.27330995     -2.80925989      4.54903984
+     1.26959002     -2.62907004      4.56833982
+     1.21273005     -2.39524007      4.55389977
+     1.06421995     -2.65457010      4.69750023
+     0.93801498     -2.17377996      4.55835009
+     1.06294000     -2.43822002      4.69750023
+    -0.00561500     -2.49122000      4.33620024
+     0.04125500     -2.59487009      4.48123980
+    -0.01798500     -2.35212994      4.46027994
+     0.21826500     -2.23466992      4.51207018
+     0.27762499     -2.44300008      4.44271994
+     0.41020501     -2.17833996      4.55379009
+     0.34360501     -2.40025997      4.69750023
+     0.83556497     -2.35605001      4.69750023
+     0.59045500     -2.37185001      4.69750023
+     0.49424499     -2.16319990      4.69750023
+    -0.07386500     -3.08443999      4.31872988
+     1.52241004     -3.27841997      4.33690977
+    -0.65302497     -2.64762998     -3.39477992
+    -0.91199499     -2.58870006     -3.01189995
+    -0.60037500     -2.36174989     -2.91762996
+    -0.22005500     -2.31261992     -3.28090000
+     1.77550006     -3.24534988      4.35042000
+     1.98204005     -3.20500994      4.33673000
+     2.00967002     -3.47328997      4.25474024
+     1.90330005     -2.95316005      4.30786991
+     1.76979005     -2.71339011      4.27827978
+     1.59343004     -2.86228991      4.30651999
+     1.44518995     -3.08445001      4.31873989
+    -0.00479500     -2.65104008      4.22290993
+     0.05892500     -2.89121008      4.32921982
+     1.31241000     -2.89121008      4.32921982
+     0.24590500     -2.72838998      4.38908005
+     0.48772499     -2.61548996      4.48071003
+     0.88371497     -2.61538005      4.48066998
+     0.68566501     -2.58456993      4.48303986
+     1.46981001     -3.23434997      4.14844990
+     0.68384498     -2.14926004      4.48810005
+     1.11737001     -2.22182989      4.50358009
+    -1.21030998     -2.47285008     -2.58606005
+    -1.33074999     -1.96609998     -2.57083011
+    -0.74502498     -2.30117011     -2.70637989
+    -0.95398498     -2.23247004     -2.30394006
+    -0.80630499     -1.95355999     -2.54719996
+    -0.53763503     -1.99665999     -2.71655989
+     0.90430498     -2.16754007      4.40553999
+     1.08779001      2.36590004      3.97250009
+     1.12272000      1.32456005      3.97250009
+     0.89775503      1.68781996      3.97250009
+     1.35030997      1.98240995      3.97250009
+     1.58811998      1.59841001      3.97250009
+     2.95866990     -3.00458002      3.97250009
+     1.72291994     -3.32473993      4.07762003
+     1.75940001     -3.47328997      4.11668015
+     2.00967002     -3.47328997      3.98207998
+     2.42967010     -3.47328997      3.97250009
+    -0.19741499     -2.84037995      4.20558023
+    -0.47367501     -2.83413005      3.99308991
+    -0.64321500     -3.47328997      3.82883000
+    -0.28668499     -3.03749990      4.07390022
+    -0.31802499     -3.21045995      3.91431999
+    -0.39776501     -3.47328997      4.14630985
+    -0.41254500     -3.47328997      3.91114998
+    -0.09848500     -3.23433995      4.14844990
+    -0.17099500     -3.47328997      4.25427008
+     1.99029005     -3.24850988      3.92445993
+     1.40965998     -2.36517000      4.44614983
+     1.59094000     -2.50725007      4.21731997
+     1.70034003     -2.62291002      4.07019997
+     1.47820997     -3.47328997      4.00262022
+    -1.24302006     -1.01677001     -2.55370998
+    -1.40093994     -1.51338005     -2.67143011
+    -0.92453498     -1.29672003     -2.47076011
+    -1.07616997     -1.54609001     -2.69411993
+    -0.64450502     -3.47328997      3.59994006
+    -0.55865502     -3.02126002      3.86324000
+    -0.61589497     -3.23082995      3.73200011
+     0.16778500     -2.25497007      4.28957987
+     0.40676501     -2.17913008      4.37381983
+    -0.04091500     -2.36683011      4.18035984
+    -0.47460499     -2.83579993      3.76414990
+    -0.36130500     -2.66293001      3.88657999
+    -0.21611500     -2.50395012      4.03135014
+     1.35690999     -2.64121008      4.34379005
+     1.12544000     -2.72836995      4.38907003
+     1.10952997     -2.49299002      4.37444019
+     0.82910502     -2.40661001      4.36973000
+     0.37097499     -2.49122000      4.31734991
+     0.21484500     -2.44011998      4.23731995
+     0.56146502     -2.39633989      4.40186024
+    -0.07108500     -2.74306989      3.99829006
+     0.02177500     -3.00974011      4.11052990
+    -0.97954500     -1.75690997     -2.42193007
+     1.44168997     -2.75913000      4.09284019
+     1.53441000     -3.17069006      4.15207005
+     1.85555005     -3.19587994      3.90772009
+     1.95200002     -3.08731008      4.12632990
+     1.89892995     -2.94355011      3.86002994
+     1.83352995     -2.81333995      4.07540989
+     1.34956002     -3.00974011      4.11052990
+     0.06921500     -2.62368989      4.02165985
+    -0.16276500     -1.82717001     -3.12771010
+    -0.01886500     -1.50107002     -3.47479010
+     0.00682500     -1.49779999     -3.05293012
+    -0.26308501     -1.27119005     -3.30799007
+    -0.47882500     -1.03131998     -3.13968992
+    -0.24492501     -1.27479005     -2.90576005
+     0.19965500     -2.82035995      4.12714005
+     1.17167997     -2.82034993      4.12713003
+     0.42995501     -2.68541002      4.18752003
+     0.94140500     -2.68537998      4.18750000
+     0.68566501     -2.61703992      4.25568008
+     1.37888002     -3.18918991      3.90301991
+     0.68187499     -2.14924002      4.26111984
+     1.05239999     -2.20116997      4.21721983
+     0.64939499      2.05059004      3.97250009
+     0.80035502      2.74605989      3.97250009
+     0.49037501      3.11753011      3.97250009
+     0.16306500      3.47328997      3.97250009
+     0.58552498      3.00730991      3.52462006
+     0.16306500      3.47328997      3.37249994
+    -0.16288500      2.81102991      3.68652010
+    -0.10005500      2.39762998      3.70498991
+     0.08424500      2.76164007      3.97250009
+    -0.22538500      3.09818006      3.97250009
+     0.37748501      2.41022992      3.97250009
+     0.48405501      1.68272996      3.72660995
+     0.66609502      2.15151000      3.69519997
+     0.89489502      2.62496996      3.55912995
+     0.86012501      1.90164006      3.62769008
+     1.17261004      2.24580002      3.56754994
+     1.65658998      0.89873999      3.97250009
+     1.49931002      1.19933999      3.97250009
+     1.32605004      0.96095997      3.97250009
+     1.80306005      1.21405995      3.97250009
+     1.80331004      0.59574997      3.97250009
+    -0.30489501     -2.15801001     -2.80375004
+    -0.44791499     -1.66612005     -2.66458988
+     2.17458010      0.43432999      3.97250009
+     1.51015997      0.59505999      3.97250009
+     1.67751002      0.22334000      3.97250009
+     0.77733499      1.42497003      3.61399007
+     0.74431503      1.32776999      3.74382997
+     1.03129995      0.54712999      3.65239000
+     0.97380501      1.02110004      3.77376008
+     0.93010497      1.65904999      3.46244001
+     1.20502996      1.49005997      3.71606994
+     1.11129999      1.24881995      3.46338010
+     1.42489004      1.86585999      3.56732988
+     1.65067995      1.49028003      3.55801010
+     1.91733003      0.59625000      3.70253992
+    -0.48715499     -1.04466999     -2.74745989
+    -0.67286497     -1.48775005     -2.58132005
+    -0.71845502     -1.06707001     -2.82670999
+     1.99767995      0.82726997      3.97250009
+     2.60775995     -3.14615011      3.79147005
+     2.19282007     -3.18004990      3.80784011
+     2.13249993     -2.83006001      3.77782011
+     2.37691998     -2.47573996      3.97250009
+     2.41651011     -2.97442007      3.97250009
+     2.92554998     -2.53508997      3.97250009
+     2.96967006     -3.47328997      3.97250009
+     2.96248007     -3.09841990      3.62609005
+     2.93840003     -2.68425989      3.59265995
+     2.00637007      0.12721001      3.97250009
+     2.33072996      0.04389000      3.97250009
+     1.84263003     -0.19271000      3.97250009
+     2.87102008     -2.07211995      3.97250009
+     2.62946010     -2.23698997      3.65268993
+     2.89175010     -2.22847009      3.57902002
+     2.22431993     -1.51293004      3.97250009
+     2.31209993     -1.98657000      3.97250009
+     2.79660010     -1.62091005      3.97250009
+     1.98850000     -0.61805999      3.97250009
+     2.11589003     -1.05708003      3.97250009
+     2.70413995     -1.18420005      3.97250009
+    -0.59583497     -0.74215001     -3.00265002
+     2.47069001     -0.35389000      3.97250009
+     2.59520006     -0.76235002      3.97250009
+     2.82451010     -1.77636003      3.57467008
+     1.55261004     -3.24097991      3.78552008
+     1.73395002     -3.47328997      3.82438993
+    -0.91054499     -0.87573999     -4.20970011
+     2.00967002     -3.47328997      3.67460990
+     2.66745996     -3.19055009      3.34833002
+     2.50834990     -3.47328997      3.57840991
+    -0.20597500     -2.87120008      3.84707999
+    -0.39761499     -3.25900006      3.58987999
+    -0.44341499     -3.47328997      3.67862010
+    -1.63127995     -1.18155003     -2.52425003
+    -1.64726996     -0.81720001     -2.73592997
+    -1.55940998     -0.76459002     -2.47421002
+    -0.30562499     -3.07747006      3.73847008
+    -0.19159500     -3.29444003      3.68677998
+    -0.24201500     -3.47328997      3.75900006
+    -0.00755500     -3.18917990      3.90301991
+    -0.10687500     -3.47328997      4.00262022
+    -0.48021501     -3.47328997      3.48125005
+    -0.64583498     -3.47328997      3.36347008
+    -0.64721501     -3.47328997      3.11822009
+     2.26326990     -3.08083010      3.28465009
+     2.16383004     -2.47129989      3.66964006
+     2.07985997     -2.85507989      3.39599991
+     1.96993005     -3.15051007      3.65022993
+     1.56301999     -2.48180008      3.96978998
+    -1.36671996      0.00848000     -3.72985005
+    -0.60354501     -0.20822001     -4.15788984
+    -1.22266996     -0.23778000     -4.21298981
+    -0.63776499     -0.30667999     -3.64886999
+    -1.10574996     -0.03853000     -4.01532984
+    -1.01735997      0.06073000     -3.55282998
+     1.36170995     -2.33518004      4.06386995
+     1.98380995     -2.36907005      3.70405006
+     1.71227002     -2.63733006      3.81063008
+     1.72211003     -0.93980998      3.72556996
+     1.38053000     -3.47328997      3.71104002
+    -0.37520501     -3.20079994      3.53658009
+    -0.61384499     -3.22029996      3.50142002
+    -0.55640501     -3.01519990      3.63989997
+    -0.47909501     -2.84394002      3.56422997
+    -0.54437500     -2.98373008      3.41457009
+     0.30625501     -2.57131004      4.06581020
+     0.13766500     -2.26836991      4.07271004
+     0.37156501     -2.18720007      4.13837004
+    -0.37226501     -2.67740011      3.63819003
+    -0.02750500     -2.35823011      3.91810012
+    -0.26407501     -2.84794998      3.57508993
+    -0.21649501     -2.50430012      3.76388001
+     1.13267004     -2.54115009      4.12919998
+     0.82714498     -2.44566989      4.08663988
+     1.84499002     -2.83290005      3.57435012
+     1.64701998     -3.13635993      3.39721990
+     0.69207501     -2.41578007      4.11823988
+     0.54229498     -2.44368005      4.09130001
+     0.12681501     -2.59674001      3.80677009
+    -0.84316498     -0.84706998     -2.59212995
+    -0.59665501     -0.48999000     -2.95911002
+    -0.67938501     -0.64875001     -2.60560989
+     0.16202500     -2.94897008      3.87469006
+     1.33774996     -2.75263000      3.69702005
+     1.25246000     -2.62250996      3.82696009
+     1.55122995     -2.92290998      3.86384010
+     1.20931005     -2.94897008      3.87468004
+     0.39864501     -2.77772999      3.91294003
+     0.97270501     -2.77770996      3.91293001
+     0.68566501     -2.67697001      4.00223017
+     1.24177003     -3.13953996      3.62063003
+     0.67957503     -2.14919996      3.99591994
+     1.05953002     -2.20323992      3.84644008
+     0.20740500      2.04370999      3.71773005
+     0.34099501      1.30393004      3.49311996
+     0.05534500      1.67642999      3.47557998
+    -0.23140500      2.03815007      3.47055006
+    -0.37940499     -0.65034997     -3.46520996
+     0.25156501      2.89093995      3.66336989
+     0.31038499      2.99886990      3.20300007
+     0.42551500      3.19075990      3.11886001
+     0.70244497      2.86707997      3.15215993
+     0.16306500      3.47328997      2.77250004
+    -0.11907500      2.47861004      3.46629000
+    -1.68798995     -0.27474999     -3.08076000
+    -1.68450999      0.05308000     -3.35417008
+    -1.36353004      0.36296001     -3.37867999
+    -0.84483498     -0.27078000     -2.93273997
+    -1.36178005     -0.15975000     -2.97054005
+    -0.72694498     -0.19496000     -3.36272001
+    -0.20284501      3.11994004      3.22394991
+    -0.49103501      2.34785008      3.47247005
+    -0.55863500      2.77636003      3.64390993
+     0.44368500      2.43455005      3.43050003
+     0.99098498      2.49802995      3.16538000
+     0.80036497      2.74604988      2.77250004
+     0.48164499      1.68620002      3.22096992
+     0.77436501      2.12488008      3.30597997
+     1.25928998      2.11953998      3.16837001
+     2.37580991     -0.07879000      3.59180999
+     1.65613997      0.83078998      3.73110008
+     1.32149005      0.78482997      3.58718991
+     1.45714998      1.05166996      3.36161995
+     1.84704995      1.13013995      3.52026010
+     2.17459989      0.43430001      3.57249999
+     1.56751001      0.48754999      3.65493011
+     1.84088004      0.29265001      3.53407001
+     1.39619005      0.10391000      3.75572991
+     1.57208002     -0.46579999      3.72646999
+     0.20189500      1.09160995      3.18526006
+     0.62483501      1.13643003      3.31223011
+     0.63815498      0.94075000      3.53864002
+     0.20409501      0.89506000      3.25691009
+     0.77288502      0.22615001      3.38790989
+     0.52346498      0.54207999      3.33048010
+     0.89131498      0.18794000      3.23436999
+    -1.80725002     -0.45361000     -2.78289008
+     1.09053004     -0.02584000      3.52021003
+     1.23228002      0.46658000      3.27026010
+     0.95271498      0.89946002      3.21832991
+     1.00998998      1.66609001      2.97359991
+     1.25054002      1.28863001      2.96243000
+     1.50213003      1.74144006      3.16488004
+    -0.40779501     -0.26311001     -3.31643009
+     1.35033000      1.98238003      2.77250004
+     1.71499002      1.37612998      3.15037990
+     2.01545000      0.78957999      3.35402989
+     1.85590005     -1.38621998      3.73714995
+     1.94324994     -1.83536005      3.73270011
+     1.63880002     -1.67550004      3.54244995
+     2.62855005     -2.82692003      3.34312010
+     2.52701998     -2.66090012      3.38018990
+     2.96967006     -3.47328997      3.37249994
+    -1.08411002     -0.22499000     -2.61593008
+    -1.38040996     -0.30441999     -2.36612010
+    -0.89593500     -0.53508002     -2.40070009
+    -1.19807005     -0.66020000     -2.29573011
+    -1.13871002     -0.29756999     -2.19325995
+    -0.77782500     -0.29293999     -2.63371992
+     2.95080996     -2.86184001      3.22029996
+     2.91002989     -2.38350010      3.18554997
+     2.30122995      0.12130000      3.26038003
+     1.98225999     -0.05101000      3.60358000
+     1.62811995     -0.20197000      3.40840006
+     1.80229998     -0.67337000      3.42863989
+     2.54969001     -1.75296998      3.51833010
+     2.27402997     -2.16388011      3.41992998
+     2.84920001     -1.92600000      3.17635012
+     2.24972010     -1.17358994      3.64538002
+     2.34642005     -1.61743999      3.47172999
+     2.73848009     -1.33582997      3.57382011
+     2.17003012     -0.71925998      3.67025995
+     2.26938009     -0.38929999      3.34191990
+     2.63513994     -0.90869999      3.57519007
+     2.51523995     -0.49362001      3.58039999
+     2.76915002     -1.48115003      3.17399001
+     1.99837995     -3.15095997      3.19809008
+     2.15809011     -3.47328997      3.36306000
+     1.50221002     -3.47328997      3.22588992
+     1.76617002     -3.47328997      3.45930004
+     2.57969999     -2.86032009      3.01324010
+     2.51330996     -3.47328997      3.11531997
+     2.96967006     -3.47328997      2.77250004
+     2.24758005     -3.04012990      2.83478999
+     0.05558500     -2.91377997      3.59081006
+    -0.09871500     -3.17477989      3.53035998
+    -0.23801500     -3.47328997      3.49146008
+     0.12957500     -3.13954997      3.62063003
+    -0.40197501     -2.95951009     -3.72985005
+    -0.42239499     -2.74253011     -4.21366978
+    -0.14865500     -2.43257999     -3.91207004
+    -0.17631499     -2.81912994     -3.37910008
+    -0.00918500     -3.47328997      3.71104002
+    -0.29305500     -3.26179004      3.27637005
+    -0.42928499     -3.47328997      3.27273989
+    -0.61003500     -3.20174003      3.25876999
+    -0.40261501     -3.47328997      3.01197004
+    -0.60615498     -3.18339992      2.99624991
+    -0.64864498     -3.47328997      2.86326003
+    -0.16180500     -3.47328997      3.17002010
+     2.27874994     -2.67247009      3.17003012
+     2.04238009     -2.53868008      3.30075002
+     1.82892001     -2.86058998      3.16633010
+     1.63233995     -2.08481002      3.48549008
+     1.40392995     -2.36150002      3.68754005
+     1.62703001     -2.54220009      3.43863010
+     1.84710002     -1.15165997      3.34351993
+     1.48025000     -1.29920995      3.49299002
+     1.30772996     -0.81551999      3.46989989
+    -0.46139500     -2.44950008     -4.69750023
+    -0.56494498     -1.92479002     -4.69750023
+    -0.17501500     -1.96437001     -4.34955978
+    -0.00747500     -2.46557999     -4.27456999
+    -0.17705500     -2.80149007     -4.47853994
+     1.79814005     -2.89377999      2.82171011
+     1.66712999     -3.16269994      2.99082994
+     1.27147996     -3.47328997      3.36757994
+     1.21566999     -3.47328997      2.97250009
+    -0.15172499     -3.04003000      3.31896996
+    -0.42939499     -3.06054997      3.34375000
+    -0.41415501     -2.73639989      3.36448002
+    -0.52654499     -2.94119000      3.15877008
+     0.26758501     -2.21710992      3.83715010
+    -0.06619500     -2.88657999      3.31978011
+    -0.23754500     -2.52428007      3.48602009
+    -0.02038500     -2.35366988      3.62323999
+    -0.26727501     -2.55421996      3.23529005
+     0.14996500     -2.64949012      3.46518993
+     0.85822499     -2.50588012      3.79263997
+     1.12138999     -2.55182004      3.57536006
+     1.47141004     -2.77589989      3.31388998
+     1.32740998     -3.11220002      3.15960002
+     0.50227499     -2.50418997      3.78842998
+     0.37543499     -2.90267992      3.62410998
+    -0.71420503     -1.39829004     -4.69750023
+    -0.34792501     -1.42480004     -4.37923002
+     0.02595500     -1.50425005     -4.03410006
+     0.99587500     -2.90269995      3.62410998
+     0.68566501     -2.77850008      3.71257997
+     1.03901994     -3.02525997      3.30408001
+     0.67673498     -2.14915991      3.66849995
+     1.27453005     -1.77374995      3.27525997
+     1.03773999     -2.19721007      3.44757009
+     0.15846500      2.09698009      3.22175002
+    -0.09033500      1.29372001      3.23456001
+     0.26784500      1.31666005      2.95690989
+    -0.23076500      0.87428999      2.98709011
+    -0.28968501      0.43623000      2.77706003
+    -0.26983500      2.12562990      3.05812001
+    -0.07773500      1.69525003      3.00359011
+    -0.38929501      1.68911004      3.22896004
+     0.21681499     -2.03618002     -3.96605992
+     0.05248500     -1.83308995     -3.57152009
+    -0.53472501      1.31508005      2.98644996
+    -0.68052500      2.06762004      3.24013996
+    -0.89189500      2.45454001      3.31532001
+    -0.15857500      2.47342992      2.96286011
+     0.32137501      2.56434011      2.95978999
+     0.40333501      3.20681000      2.43269992
+     0.67076498      2.89547992      2.41114998
+     0.49037501      3.11753011      2.77250004
+     0.15329500      3.46385002      2.25137997
+    -0.20400500      3.11880994      2.60647011
+    -0.55517501      2.77970004      2.97577000
+     0.31124499     -2.17887998     -3.15676999
+     0.21150500     -2.50782990     -3.57393003
+     0.61158502      2.26529002      2.75013995
+     0.53497499      2.52787995      2.36419010
+     0.92238498      2.58114004      2.46270990
+     1.08781004      2.36587000      2.77250004
+     0.48807499      1.73763001      2.68401003
+     0.97124499      2.01022005      2.56872010
+     0.56435502      1.56168997      2.34069991
+     1.15980005      2.24482012      2.29907990
+     1.08739996      1.25597000      2.62238002
+     0.72043502      1.23207998      2.73474002
+     1.06988001      1.57387996      2.53681993
+    -0.23051500     -0.58718997     -3.96859002
+    -0.56164497     -0.72770000     -4.34278011
+    -0.18780500     -1.04809999     -4.10467005
+    -0.32808501     -0.92157000     -3.76266003
+     1.41031003      1.87386000      2.36977005
+     2.02649999     -0.09607000      3.31234002
+     2.42948008     -0.23139000      3.19256997
+     1.63962996      0.70490998      3.22750998
+     1.43089998      1.06620002      2.94882989
+     1.87823999      1.06912005      3.11394000
+     2.17459989      0.43428001      3.17249990
+     1.35750997      0.37968999      2.96261001
+     1.45931005      0.13066000      3.27297997
+     1.82934999      0.28770000      3.01978993
+     1.16059995     -0.33598000      3.48404002
+     1.41178000     -0.71542001      3.19795990
+     0.62693501      0.53526002      2.99858999
+     0.36473501      0.84969002      2.89930010
+     0.03115500      0.40761000      2.97783995
+     0.45380500      0.22942001      3.18520999
+     0.82738501     -0.64831001      3.18510008
+     0.75793499     -0.16703001      3.26394010
+     0.70407498      0.97940999      2.61879992
+     0.97748500      1.37252998      2.28536010
+    -0.91053498     -0.87576997     -4.69750023
+     0.92203498      0.43654999      2.93223000
+     0.78298497      0.75208998      2.66598010
+     1.09296000      1.03228998      2.71958995
+     1.11430001     -0.01580000      3.02147007
+     1.19667006      0.73861998      2.75951004
+     1.40117002      1.13064003      2.50696993
+     1.58816004      1.59836996      2.77250004
+     0.12034500     -1.00790000     -3.76865005
+     1.80307996      1.21399999      2.77250004
+     1.99772000      0.82721001      2.77250004
+     2.17461991      0.43426001      2.77250004
+     1.88518000     -1.43199003      3.24984002
+     2.02881002     -1.86005998      3.28261995
+     1.69442999     -1.83877003      3.05418992
+     2.16861010     -2.30425000      3.06110001
+     2.53858995     -2.39563990      2.96443009
+     2.95866990     -3.00458002      2.77250004
+     2.95955992     -3.47328997      2.32304001
+    -0.75564498     -3.03123999     -3.17873001
+    -0.59142500     -2.76911998     -2.80965996
+    -0.28188500     -2.63296008     -2.91377997
+     2.87102008     -2.07213998      2.77250004
+     2.92554998     -2.53511000      2.77250004
+     2.40781999     -1.92951000      2.99724007
+     2.79660010     -1.62093997      2.77250004
+     2.29700994     -0.29754001      2.86062002
+     2.33074999      0.04382000      2.77250004
+     1.47943997     -0.25582999      3.08653998
+     1.93281996     -0.46092001      3.16627002
+     2.23175001     -0.89783001      3.27138996
+     1.84843004     -0.90157002      2.95480990
+     2.37454009     -1.67934000      3.09476995
+     2.14029002     -1.85413003      2.87099004
+     2.58800006     -1.58390999      2.67454004
+     2.44916010     -1.11386001      3.22223997
+    -1.09063005     -3.05329990     -2.66177011
+    -0.86932498     -2.63931990     -2.36954999
+    -0.91738498     -3.05677009     -2.72378993
+     2.25267005     -0.61908001      2.93156004
+     2.67139006     -1.04979002      3.17427993
+     2.55747008     -0.63235998      3.17789006
+     2.47070003     -0.35394001      2.77250004
+     2.70413995     -1.18423998      2.77250004
+     2.54501009     -2.87934995      2.53623009
+     2.04256010     -2.72204995      2.53940010
+     2.14482999     -2.29003000      2.67448997
+     1.87665999     -3.14206004      2.63726997
+     1.56725001     -3.47328997      2.74973989
+     1.99296999     -3.47328997      2.98766994
+     2.48118997     -3.47328997      2.61782002
+     2.60198998     -3.02651000      2.18825006
+     2.22241998     -3.12726998      2.33928990
+    -0.42478499     -2.48106003     -2.49847007
+     2.48909998     -3.47328997      2.12579989
+    -0.38908499     -2.70026994      3.05433011
+     0.33231500     -3.02525997      3.30408001
+     0.09984500     -3.47328997      3.36757994
+    -0.51311499     -2.91149998      2.86435008
+    -0.60383499     -3.17365003      2.71420002
+     0.13016500     -2.03679991     -2.86635995
+     0.17886500     -2.42921996     -2.91415000
+     0.38248500     -2.53858995     -3.23237991
+    -0.65014499     -3.47328997      2.59808993
+     0.02000500     -3.12370992      3.00410008
+    -0.25972500     -3.25062990      2.99125004
+    -0.15641500     -3.47328997      2.90375996
+    -0.37232500     -3.47328997      2.74364996
+     0.15566500     -3.47328997      2.97250009
+     1.77362001     -2.31574988      3.16352010
+     1.52365994     -2.73026991      3.00088000
+     1.45852995     -1.97698998      2.83839989
+     1.73605001     -2.08929992      3.04001999
+     1.97398996     -2.59914994      2.91311002
+     1.31431997     -2.31593990      3.23796010
+     1.41650999     -1.25156999      2.95940995
+     1.31533003     -1.69918001      2.80019999
+     1.06861997     -1.20763004      3.22768998
+     1.84895003     -3.12175989      2.32278991
+    -1.51777995     -2.25768995     -2.18499994
+    -1.41727996     -2.87354994     -2.18499994
+    -1.06368005     -2.61097002     -2.20229006
+     2.18487000     -2.73266006      2.22698998
+     1.86142004     -2.70758009      2.45420003
+     1.65935004     -3.13891006      2.58404994
+     1.21566999     -3.47328997      2.56250000
+     0.67277497     -1.07413995      2.98525000
+     1.49377000     -2.78301001      2.62491012
+     1.06043005     -3.09852004      2.97250009
+    -0.25327501     -2.88405991      3.07219005
+     0.14646500     -2.91204000      3.01205993
+     0.14808500     -2.63756990      3.14176989
+    -0.18185499     -2.47319007      2.98066998
+     0.25363499     -2.22195005      3.44338012
+    -0.06246500     -2.38101006      3.29115009
+    -1.66455996     -1.71989000     -2.18499994
+    -1.07459998     -1.90131998     -2.09604001
+    -1.24932003     -1.60597003     -2.23291993
+     0.47577500     -2.58212996      3.24590993
+     0.83161497     -2.54505992      3.42056990
+     1.06765997     -2.71581006      3.07559991
+     0.68566501     -2.88737011      3.36856008
+     0.68566501     -2.94329000      2.97250009
+     0.82894498     -1.63951004      2.98688006
+     0.67320502     -2.14911008      3.26189995
+     0.93652499     -2.19882989      2.98530006
+    -1.22513998      2.13271999      2.98673010
+    -0.86609501      1.73552001      2.98680997
+    -1.48979998      1.87714005      2.70390010
+     0.58328497      1.06080997      2.19259000
+    -0.44068500      2.37687993      2.66912007
+     0.00066500      2.16762996      2.74334002
+    -0.58475500     -2.31269002     -2.19411993
+    -0.34599501     -2.07296991     -2.45394993
+     0.58765501      1.53050995      1.96361005
+     0.07257500      1.91829002      2.40634990
+     0.15940499      1.58977997      2.19747996
+     0.25478500      0.94844002      2.37791991
+    -0.31067500      1.23918998      2.79545999
+     0.12044500      1.21904004      2.45075989
+    -0.15977500      0.79781002      2.68359995
+    -0.66286498      0.82637000      2.68795991
+    -0.06757500      0.43713999      2.38407993
+    -0.57367498      0.35339001      2.53290009
+     0.25168499      2.23626995      2.25739002
+     0.61054498      2.49661994      1.95099998
+    -0.95564502     -2.16975999     -1.89732003
+    -1.24023998     -2.21060991     -1.90634000
+    -0.81086498     -2.54510999     -1.89944005
+    -0.69799501     -1.96269000     -2.25293994
+     0.85949498      2.63107991      2.07525992
+     0.49997500      3.05797005      1.97565997
+    -0.27997500      1.69761002      2.55093002
+    -0.71546501      1.59684002      2.51191998
+    -0.89872497      1.26112998      2.74053001
+    -0.90913498      2.43789005      2.69278002
+     0.12399500      3.43555999      1.73160005
+     0.36990499      2.60215998      2.09257007
+     0.13263500      2.70228004      2.43847990
+    -0.21784499      3.10544991      2.04302001
+    -0.56454498      2.77064991      2.37217999
+     0.42924500      3.04272008      1.39563000
+     0.07531500      3.38855004      1.21526003
+     0.54596502      2.23657990      1.92245996
+     0.69746500      2.22424006      2.25129008
+     0.43040499      1.86676002      2.08368993
+     0.88554502      1.88857996      2.04069996
+     1.07377005      2.29636002      1.75629997
+     0.61761498      1.51512003      1.88919997
+     1.33906996      1.93306994      1.92234004
+    -0.56910503     -1.57006001     -2.26157999
+     0.97594500      1.08572996      2.30501008
+     1.06903005      1.54744995      1.79876006
+     1.41240001      1.34940004      2.03037000
+     1.31937003      1.16515994      2.03516006
+     1.57149005      1.58237004      2.10387993
+     1.77254999     -0.14820001      2.86282992
+     1.22473001      0.27533001      2.66600990
+     1.62336004      0.70046997      2.76966000
+    -1.08238006     -0.94856000     -2.22905993
+    -1.47924995     -1.11699998     -2.13667011
+    -1.42697001     -1.36387002     -2.31251001
+    -1.03427994     -1.04194999     -2.29749990
+     1.84212995      0.29304001      2.58014011
+     1.48459005      0.14133000      2.78665996
+     1.29462004     -0.39809000      2.72510004
+     1.32423997     -0.69174999      2.83282995
+     1.44055998     -0.88490999      2.71735001
+     0.90933502     -1.07255006      2.63339996
+     0.42169499      0.25325000      2.59295988
+     0.82923502     -0.68634999      2.61999011
+     0.75794500     -0.16706000      2.76521993
+     0.62768501      0.70653999      2.16138005
+     0.75476497      1.14601004      1.75681996
+     0.44833499      0.72200000      1.67051995
+     0.70517498      0.30687001      2.46138000
+     1.07565999      0.65534002      2.28378010
+     1.13545001     -0.00688000      2.51981997
+     0.38240501      0.28016999      1.97697997
+     1.59693003      0.72030002      2.33471990
+     1.78471994      1.22040999      2.26064992
+     1.98556006      0.83047998      2.33745003
+     2.16829991      0.43142000      2.38965988
+     2.93741012     -3.19999003      2.01823997
+     2.92855000     -3.47328997      1.86653996
+     1.83744001     -1.35817003      2.74298000
+    -0.51140499     -1.07615995     -2.32376003
+    -0.97123498     -1.29162002     -2.13634992
+    -0.85199499     -1.05312002     -2.28441000
+     1.77529001     -1.76069999      2.61061001
+     1.88022006     -2.05731010      2.67331004
+     2.49730992     -2.40317011      2.48824000
+     1.87039995     -2.12469006      2.30513000
+     2.36051989     -1.93035996      2.45825005
+     2.93564010     -2.85355997      2.23053002
+     2.81839991     -1.79954004      2.32609010
+     2.88741994     -2.28827000      2.28986001
+     2.24662995      0.20791000      2.15161991
+     1.98934996     -0.09382000      2.44171000
+     2.36729002     -0.08450000      2.32679009
+     2.23410010     -1.85488999      2.46069002
+     2.55644011     -1.64309001      2.27473998
+     2.73006010     -1.33513999      2.37052989
+     1.94992006     -1.06614995      2.45275998
+     2.17512012     -0.38352001      2.54586005
+     1.78922999     -0.56092000      2.57789993
+     2.23938990     -1.00427997      2.73073006
+    -0.94411498     -1.65809000     -1.94994998
+     2.25833011     -1.42118001      2.52589989
+     2.53546000     -0.58613002      2.37463999
+     2.64427996     -0.96324003      2.45661998
+     2.59520006     -0.76239997      2.77250004
+     1.31831002     -1.13987994      2.40959001
+     2.52104998     -3.47328997      1.72346997
+     0.29459500     -1.71545005     -3.17624998
+     0.27182499     -1.71712005     -2.78706002
+    -0.16634500     -1.80113995     -2.74976993
+     2.56789994     -2.71837997      1.82231998
+     2.21185994     -2.68576002      1.92630994
+     2.09697008     -2.26938009      2.16295004
+     1.51443994     -3.47328997      2.36726999
+     1.96252000     -3.47328997      2.38263011
+     1.93850005     -3.07774997      1.93276000
+     2.09478998     -2.53469992      1.70808005
+     2.36950994     -3.07238007      1.81695998
+     2.08173990     -3.47328997      1.84133005
+    -0.35299501     -2.65235996      2.72265005
+     0.31089500     -3.09852004      2.97250009
+    -0.28714499     -3.20170999      2.60701990
+    -0.14610501     -2.91663003      2.71369004
+     0.16351500     -3.18723011      2.73405004
+    -0.50657499     -2.89780998      2.54011989
+    -0.60567498     -3.18137002      2.42325997
+    -0.65168500     -3.47328997      2.32274008
+    -0.37509501     -3.47328997      2.46409988
+     0.44387501     -1.56218004     -3.58983994
+     0.11745500     -1.11394000     -3.21829009
+    -0.00100500     -3.47328997      2.62068009
+     0.15566500     -3.47328997      2.56250000
+    -0.24824500     -2.91988993      2.40249991
+     1.12656999     -1.89410996      2.60785007
+     1.52216005     -2.03018999      2.30279994
+     1.39604998     -1.61801004      2.33571005
+     1.42032003     -2.36361003      2.68974996
+     0.47363499     -1.33273005      2.78583002
+     0.92275500     -1.56429994      2.53851008
+     1.54782999     -3.12280011      2.12056994
+     1.21566999     -3.47328997      2.15249991
+     0.00138500     -1.50724995     -2.66581011
+     0.33858499     -1.37726998     -2.71626997
+     0.68566501     -2.94329000      2.56250000
+     1.40816998     -2.82900000      2.10642004
+     1.05043006     -2.60411000      2.34919000
+     1.46591997     -2.40063000      2.13100004
+     1.80896997     -2.63899994      1.90248001
+     1.06043005     -3.09852004      2.39166999
+     0.63480502     -1.16145003      2.42820001
+     0.88299501     -2.04956007      2.44000006
+     0.97753501     -2.60108995      2.70582008
+     0.67150497     -2.75606990      2.52713990
+     0.13848500     -2.60918999      2.79957008
+    -0.19738500     -1.08100998     -3.04259992
+     0.42808500     -1.78497005      2.65748000
+     0.32639500     -2.81641006      2.69014001
+    -0.08896500     -2.39964008      2.60216999
+     0.18376499     -2.24844003      2.97855997
+     0.67781502     -2.56589007      2.88740993
+     0.66913497     -2.14906001      2.79343009
+    -0.12047500     -0.54044998     -3.01224995
+     0.21573500     -1.48374999      2.54082990
+     1.00858998     -1.46899998      2.07234001
+     0.64660501     -1.14533997      1.87618005
+    -0.65329498     -3.47328997      2.03792000
+    -0.83890498      0.17847000      2.22277999
+    -0.77108502      2.15327001      2.35446000
+    -1.29735994      2.06297994      2.38793993
+    -0.24876501     -1.29657996     -2.52080011
+    -0.14173500     -0.99686998     -2.53295994
+     0.12469500     -0.94396001     -2.79956007
+    -1.28525996      1.44373000      2.58354998
+    -1.74504995      1.63065004      2.38415003
+     0.11137500      0.70946997      1.78157997
+     0.22678500      1.14438999      1.90425003
+     0.35076499      1.13795996      1.76274002
+    -0.25080499      2.24933004      2.28550005
+     0.16461501      1.48924994      1.94221997
+    -0.03448500      1.84706998      2.12140989
+    -1.12460995      0.99883997      2.44250011
+    -0.68842500      1.40209997      2.04360008
+    -0.28366500      1.45431995      1.99081004
+    -0.19038500      0.85851002      1.96899998
+    -0.52238500      1.04787004      2.30862999
+    -0.96023500      0.56480002      2.32793999
+     0.07981500      0.76775002      1.62364995
+     0.17660500      0.38244000      1.55754006
+    -0.33743501      0.74949002      1.65049005
+    -0.01530500     -2.35542989     -2.58227992
+     0.05424500     -2.71335006     -2.67908001
+    -0.10447500      0.43998000      1.80658996
+    -0.56995499      0.35504001      2.02215004
+     0.25498500      1.79173994      1.69511998
+     0.66293502      2.18979001      1.46458006
+     0.21805499      2.65911007      1.66428006
+     0.04397500      2.23624992      1.88275003
+     0.76907498      2.66996002      1.57734001
+     0.24430500      1.01467001      1.37019002
+     0.99452502      2.29660010      1.25285995
+    -0.51901501      1.78641999      2.16915011
+    -1.08562005      1.61239004      2.21918988
+    -0.69770497      2.10194993      1.88160002
+    -0.19264500     -1.74363995     -2.39450002
+    -0.92078501      2.42663002      2.11859012
+     0.11205500      2.70419002      1.17196000
+    -0.14682500      2.31136990      1.46712995
+    -0.23543499      3.08845997      1.50010002
+    -0.58046502      2.75527000      1.79628003
+    -0.22128500      3.10212994      1.04420996
+     0.00756500      3.32312012      0.70445001
+    -0.44101501     -0.67641002     -2.61244011
+     0.03901500     -0.70608997     -2.63577008
+     0.68636501      2.64743996      1.04393995
+     0.34441501      3.00629997      0.86830002
+     0.80393499      1.86468995      1.54291999
+     1.25810003      1.96094000      1.44234002
+     1.17861998      1.96675003      1.03527999
+     0.95929497      1.49451005      1.29402006
+     0.49697500      1.39236999      1.31791997
+     0.53005499      0.78066999      1.60863996
+     0.80545503      1.16068995      1.70732999
+     1.50442004      1.60223997      1.59100997
+     1.02409995      0.82260001      1.97412002
+     0.93469501      0.74662000      1.56177998
+     1.26205003      1.18500996      1.64201999
+     1.00320005      0.79789001      1.54266000
+     1.37943995      0.47931001      1.96322000
+     1.52671003      0.72817999      1.91009998
+     1.86889994      0.30430001      2.20631003
+     1.73756003      1.22315001      1.73945999
+     0.69167501      1.02324998      1.13301003
+     0.37114501      0.60387999      1.25836003
+    -1.12699997     -0.41556001     -4.69750023
+    -0.96507502     -0.16824000     -4.45846987
+    -0.82658499     -0.47448000     -4.47432995
+     1.57283998     -0.20031001      2.31402993
+     1.52704000      0.15926000      2.30592990
+     1.03805006     -0.97522998      1.85737002
+     1.25960004     -0.75164002      2.12961006
+     1.23932004     -0.63791001      2.46121001
+     0.82647502     -0.70436001      2.09033990
+     0.75795501     -0.16709000      2.26650000
+     0.87024498      0.53521001      1.81788003
+     0.76448500      0.43730000      1.45793998
+     0.48579499      0.20307000      1.46115994
+     1.17092001      0.00809000      1.97330999
+     0.75796503     -0.16711999      1.76777995
+     1.95255995      0.82766998      1.87321997
+    -1.83407998     -1.26760995     -2.18499994
+    -1.99041998     -0.93061000     -2.18499994
+    -1.88656998     -0.71320999     -2.48147011
+     2.14670992      0.42210999      1.98642004
+     0.75508499      1.79909003      1.00051999
+     0.94009501      2.19622993      0.69235998
+     2.89602995     -3.00581002      1.65559006
+     2.87562990     -3.47328997      1.40428996
+     2.23028994     -3.47328997      1.37941003
+     0.75797498     -0.16715001      1.26907003
+     1.77172995     -1.22504997      2.21832991
+     1.87146997     -1.69922996      2.14187002
+     1.48285997     -1.51563001      1.85070002
+     1.85260999     -2.20555997      1.91059005
+     2.61652994     -0.95630997      1.99665999
+     2.48931003     -2.33764005      1.92041004
+    -1.78138006     -0.49098000     -2.08938003
+    -1.49995995     -0.77731001     -2.04935002
+    -1.72633004     -0.42331001     -2.45702004
+    -1.29149997     -0.53258997     -2.15922999
+     2.36930990     -1.86626005      1.96545994
+     2.87280989     -2.49030995      1.79233003
+     2.73443007     -1.49978006      1.90490997
+     2.81699991     -1.99577999      1.85310996
+     2.28480005      0.05871000      1.90541005
+     2.45135999     -0.40989000      1.92896998
+     1.95792997     -0.29392001      1.82904994
+     1.99571002     -0.29914001      2.12054992
+     1.67062998     -0.72144002      2.27034998
+     1.66847003     -1.16841996      1.81362998
+     2.13713002     -0.77372998      1.81466997
+     2.28725004     -1.26242995      1.74333000
+     2.24819994     -1.34547997      2.05425000
+     2.12571001     -0.82624000      2.09821010
+     1.08927000     -1.34334004      1.58267999
+     1.36826003     -0.93145001      1.60806000
+     0.82708502     -0.70038003      1.58405995
+     2.40665007     -3.17999005      1.34595001
+     2.03366995     -2.43900990      1.31128001
+     2.43807006     -2.59446001      1.49404001
+     2.03678012     -2.18305993      1.52283001
+    -1.63760996      0.41486999     -3.72985005
+    -1.50027001      0.21673000     -4.21356010
+    -1.32640004      0.54408002     -3.84260011
+    -1.05037999      0.23734000     -3.78009009
+     2.82996988     -2.61640000      1.34475005
+     1.47051001     -2.02509999      1.91073000
+     1.75138998     -2.59692001      1.51338005
+     1.61107004     -3.47328997      1.98898005
+     1.78208005     -3.00443006      1.54711998
+     1.98407996     -2.77079010      1.25522995
+     1.67640996     -3.47328997      1.44778001
+     1.48565996     -3.47328997      0.92250001
+    -0.32980499     -2.62384009      2.29437995
+     0.11514500     -2.64104009      2.37273002
+     0.32581499     -2.77621007      2.28779006
+    -0.32139501     -3.17655993      2.32692003
+     0.31089500     -3.09852004      2.39166999
+    -0.42437500     -3.47328997      2.21569991
+     0.02562500     -3.07464004      2.41441989
+    -0.52463502     -2.93686008      2.22194004
+    -0.61098498     -3.20635009      2.14250994
+    -0.93462503      0.21252000     -4.24548006
+    -0.56109500      0.30730999     -3.84977007
+    -0.22954500     -0.07562000     -3.72370005
+    -0.15104499     -3.47328997      2.28373003
+     0.15566500     -3.47328997      2.15249991
+    -0.29073501     -3.47328997      1.97003996
+    -0.08953500     -2.77353001      2.12231994
+     1.17110002     -2.04573011      2.04503012
+     1.19158006     -1.89786994      1.75293005
+     0.82229501     -2.18184996      1.95252001
+     0.76901501     -2.43914008      2.38302994
+     0.51392502     -1.62734997      2.25008988
+     0.82321501     -1.88212001      1.90781999
+     0.79337502     -2.65049005      2.05615997
+     1.55949998     -2.95428991      1.64093006
+    -1.37293005      0.01855000     -4.69750023
+     1.21566999     -3.47328997      1.74249995
+     0.68603498     -2.85050988      2.13862991
+     1.06043005     -3.09852004      1.94749999
+     0.68566501     -2.94329000      2.15249991
+     1.21566999     -3.47328997      1.33249998
+     0.08214500     -0.45453000     -3.57610989
+    -0.64196497      0.15046000     -3.36826992
+     1.21566999     -3.47328997      0.92250001
+     1.52059996     -2.45318007      1.62854004
+     1.08125997     -2.65281010      1.90284002
+     1.60137999     -2.76813006      1.26154006
+     1.61514997     -1.94614995      1.54231000
+     1.75041997     -2.44014001      1.23907006
+    -0.09671500     -1.55590999      2.22879004
+     0.21769500     -1.48293996      2.09968996
+     1.06640005     -1.64335001      1.46524000
+     0.10006500     -1.89493001      2.34042001
+     0.00714500     -2.33632994      2.15941000
+     0.30602500     -2.20433998      2.47742009
+     0.16312499     -1.85674000      2.00608993
+     0.60673499     -1.61354005      1.72443998
+     0.75310498     -1.27318001      1.36017001
+     0.64867502     -1.14242995      1.39681995
+    -0.97060502      0.57129002     -3.46146011
+    -1.04531002      0.41481999     -2.95138001
+    -0.63743502     -0.05190000     -2.90688992
+    -0.97234499     -0.01690000     -2.94039011
+     0.21965501     -1.48213005      1.65854001
+    -0.55536503     -3.01240993      1.98186004
+    -0.44302499     -2.78110003      1.94957995
+    -0.61255503     -3.21399999      1.86739004
+    -0.65493500     -3.47328997      1.74505997
+     2.79991007     -3.47328997      0.93774998
+     1.89480996     -3.47328997      0.92725003
+     0.19372500      0.37604001      1.18511999
+    -1.17591000      0.31613001      1.98513997
+    -1.02415001     -0.05025000      1.91384995
+    -1.22147000      2.13627005      1.88862002
+    -1.57020998      1.79947996      1.94069004
+     0.19693500      0.37483999      0.77530003
+    -1.36341000      0.73079002      2.07933998
+    -1.55620003      1.18065000      2.21945000
+    -1.98728001      1.39673996      2.02781010
+    -0.06236500      1.03965998      1.46433997
+    -0.05625500      1.02473998      1.39611006
+    -0.00574500      1.35417998      1.51663995
+    -0.09293500      1.11426997      1.80549002
+    -0.68821502     -0.78126001     -2.20315003
+    -0.39459500      1.76154006      1.69382000
+    -0.80726498      1.44333994      1.77321994
+    -0.54764497      1.39855003      1.66101003
+    -1.02214003      1.07060003      1.97567999
+    -0.53166503      1.08678997      1.86319995
+    -1.33861005      1.54057002      1.55979002
+    -1.36107004      1.19299996      1.81974995
+     0.04928500      0.73755997      1.17303002
+    -0.54580498      0.97188002      1.49048996
+    -0.41407499     -0.36733001     -2.62473011
+    -0.24602500     -0.17917000     -2.93955994
+    -0.76528502      0.72992003      1.71331000
+    -1.16442001      0.75154001      1.69169998
+    -0.52130502      0.66937000      1.35885000
+    -0.96961498      0.36447999      1.55870998
+    -0.14807500      0.44163999      1.35716999
+    -0.56644499      0.35659000      1.54012001
+     0.24469499      1.03771996      0.97360998
+     0.41555500      1.77451003      0.70447999
+    -0.02824500      1.84184003      1.29674995
+     0.39026499      1.84512997      1.23806000
+     0.27765501      2.27277994      1.20829999
+    -0.11345500      1.28076005      1.13922000
+     0.13683499      1.54335999      1.10667002
+    -0.52583498     -0.48964000     -2.30262995
+     0.35583499      2.22568011      0.72676998
+    -0.23172501      2.41982007      1.00987995
+     0.05914500      2.78580999      0.62658000
+    -0.88956499      1.91452003      1.63444996
+    -0.43207499      1.66864002      1.27348006
+    -0.23263501      1.78515005      1.22464001
+    -0.62879503      2.08731008      1.38019001
+    -0.95189500      2.39658999      1.57351005
+    -0.59243500      2.74372005      1.17009997
+    -0.36140499      2.96682000      0.63115001
+    -0.07880500      3.23972011      0.20117000
+     0.11582500      2.32206988      0.49123001
+    -2.03535008      0.04905000     -2.90424991
+    -0.11968500      2.77287006      0.17399000
+     0.23260500      2.96724010      0.37081000
+     0.56768501      2.62309003      0.51349998
+    -1.53383005      0.43992999      1.70319998
+    -1.99510002      0.47422001     -3.34485006
+    -1.51677001      0.17966001     -2.93261003
+    -1.79998004      0.47429001     -3.24165010
+     0.13232499      1.93703997      0.39793000
+     0.50776500      2.06592989      0.40902999
+     0.10493500      2.94144011     -0.04482000
+     0.50519502      0.18614000      1.00920999
+     0.89584500      1.42741001      0.88032001
+     0.68937498      0.91820002      0.71662998
+     0.46234500      1.37732005      0.68624997
+     1.19663000      1.32154000      0.88810003
+     1.40646994      1.63499999      1.12191999
+     1.25662005      1.71993995      0.68554002
+     0.87408501      0.65423000      1.12839997
+     1.12980998      1.08598995      1.19333994
+     1.42040002      1.04431999      1.12650001
+    -1.44304001      0.66624999     -2.92955995
+    -1.44669998      0.90289003     -3.51711988
+     1.03638995      0.92224997      0.83692998
+     1.65596998      1.23991001      1.24504995
+     1.20454001      0.44501001      1.36720002
+     1.45270002      0.77863002      1.47294998
+     1.66031003      0.21568000      1.76943004
+     1.89332998      0.82419997      1.39444005
+     0.41135499      0.62243998      0.82819998
+     0.75798500     -0.16718000      0.79082000
+     1.53768003     -0.22755000      1.81263995
+     1.22301996     -0.44086000      1.74818003
+     1.18675005      0.01469000      1.21050000
+     1.82342005     -0.15829000      1.45562005
+     2.33156991     -0.20000000      1.49256003
+    -0.95602500      0.07041000     -2.64848995
+    -1.30732000      0.00070000     -2.76594996
+     2.10628009      0.40481001      1.55157006
+     0.83266503      1.66732001      0.51078999
+     0.73865497      2.24152994      0.13011999
+     0.52148497      0.39370000      0.38446000
+     0.50508499      0.18624000      0.57258999
+     0.71787500      1.18657994      0.38339001
+     0.92782497      1.42246997      0.17497000
+     1.06608999      1.81731999      0.23153999
+     2.33208990     -3.47328997      0.93232000
+     2.78701997     -2.95492005      0.94212002
+     1.48565996     -3.47328997      0.69749999
+     2.02909994     -3.08182001      0.93549001
+     0.82990497     -0.68147999      1.10478997
+     1.97570002     -1.93649006      1.30142999
+    -2.09994006     -0.32459000     -2.50086999
+    -1.70529997     -0.00972000     -2.46241999
+     1.56051004     -1.38432002      1.34345996
+     1.97121000     -1.57983994      1.62796998
+     2.62293005     -1.21386003      1.46543002
+     2.49273992     -0.70701998      1.48531997
+     1.94483995     -2.64304996      0.94382000
+     1.86366999     -2.16337991      0.95747000
+     2.54029989     -2.32623005      1.42166996
+     2.43075991     -1.67190003      1.46906996
+     2.79081011     -2.19806004      1.38753998
+     2.72101998     -1.71414006      1.42528999
+     2.22298002     -1.81753004      0.97272003
+     1.77502000     -1.70276999      0.97784001
+     0.37562501     -0.33002001     -3.16651011
+     0.08751500      0.03713000     -3.31084991
+    -0.52917498      0.29697001     -3.27261996
+     2.23956990     -1.07911003      1.37918997
+     2.09150004     -0.58736998      1.43368006
+     1.67624998     -0.62676001      1.74321997
+     1.83343005     -1.09308004      1.64677000
+     1.08394003     -1.27257001      0.99322999
+     1.39112997     -1.61804998      0.97579998
+     1.41348004     -0.72808999      1.07447004
+     2.35957003     -0.50695002      1.03118002
+     2.35753012     -2.81690001      0.94344997
+     2.30372000     -2.30444002      0.95564997
+     2.74835992     -2.44388008      0.95128000
+     0.63417500     -1.16252005      0.94051999
+     1.15079999     -2.84964991      1.50790000
+     1.31915998     -2.30694008      1.48175001
+     1.38400996     -2.57469010      1.23729002
+    -1.26663995      0.20787001     -2.54469991
+    -1.07992995     -0.02933000     -2.34012008
+    -0.89168501     -0.26848999     -2.17322993
+    -0.75082499     -0.18939000     -2.49935007
+     1.43199003     -3.12561011      1.30509996
+     1.61624002     -3.00259995      0.93061000
+     1.38347006     -3.08206010      0.92250001
+    -0.27680501     -2.92003989      1.84510005
+    -0.32272500     -3.23158002      1.82862997
+    -0.41996500     -3.47328997      1.67982996
+    -0.22415499     -2.51141000      1.86492002
+     0.37484500     -2.66321993      1.93223000
+     0.31089500     -3.09852004      1.94749999
+    -0.18419500     -3.15772009      2.07736993
+     0.15566500     -3.47328997      1.74249995
+     0.06741500     -2.80027008      1.73091996
+     1.13370001     -2.00289989      1.31520998
+     0.90044498     -2.26734996      1.66268003
+     0.50152498     -2.14903998      1.80105996
+     0.61848497     -1.87276006      1.33472002
+     0.89119500     -2.90722990      1.54264998
+     0.69133502     -2.89317012      1.71350002
+     0.49390501     -2.65268993      1.57628000
+    -1.23431003     -0.05159000     -1.94213998
+    -1.61874998     -0.08563000     -2.01818991
+    -2.01958990     -0.14972000     -2.10352993
+    -1.38416004     -0.40953001     -1.99524999
+    -1.38003004      0.05533000     -2.23280001
+     1.06043005     -3.09852004      1.50332999
+     0.68566501     -2.94329000      1.74249995
+     1.06043005     -3.09852004      0.92250001
+     1.03067994     -2.35867000      1.39136004
+     1.07330000     -2.71544003      1.45618999
+     1.49883997     -2.48921990      0.94013000
+     1.43666005     -2.02326989      0.95459998
+     1.35632002     -2.73551989      0.63764000
+    -0.23614500     -1.99907994      1.95960999
+    -0.39245501     -1.53100002      1.91673005
+    -1.13112998     -0.31209001      1.62779999
+     1.03656995     -1.83879995      0.94432002
+     1.05479002     -2.32753992      0.93178999
+     0.65889502     -1.62618005      0.90376002
+    -0.35217500     -1.86640000      1.61010003
+    -0.24430500     -1.55455005      1.41041994
+     0.07848500     -2.32613993      1.69728005
+     0.10922500     -1.93796003      1.44798005
+     0.38099501     -1.83748996      0.86157000
+     0.22161500     -1.48131001      1.21739995
+     0.22357500     -1.48049998      0.77625000
+    -0.10078500     -2.55675006      1.56377995
+    -0.46934500     -2.30571008      1.59052002
+    -0.53681499     -2.96511006      1.72791004
+    -0.39825499     -2.71241999      1.60652995
+    -0.20111500     -3.47328997      1.47309995
+    -0.70915502     -0.49790999     -2.02749991
+    -0.95331502     -0.59473997     -2.11306000
+    -0.44195500     -3.13357997      1.57082999
+    -0.60960501     -3.19960999      1.56915998
+    -0.54123503     -3.47328997      1.40750003
+    -0.65661502     -3.47328997      1.44635999
+     2.18289995     -3.47328997      0.58069998
+     2.68733001     -3.47328997      0.41305000
+     1.83369005     -3.47328997      0.44672999
+     1.48565996     -3.47328997      0.22385000
+    -0.15155500      0.44163999      0.94941998
+    -0.94696498      0.06155000      1.37879002
+    -1.31843996      0.04445000      1.65102994
+     0.54402500      0.71394998      0.23721001
+     0.41974500      1.59070003      0.29168001
+    -1.12052000     -0.69866002     -1.94484997
+     0.29846501      1.17159998      0.17912000
+     0.18349500      0.37987000      0.37211999
+    -0.15642500      0.44163999      0.56243002
+    -1.36706996      1.99565995      1.42237997
+    -1.80316997      1.57451999      1.53318000
+     0.02648500      0.72192001      0.76413000
+    -1.05001998     -0.35299000     -1.92761004
+    -0.21279500      1.11398995      0.79595000
+    -1.63724995      1.29437995      1.43239999
+    -2.11225009      0.84289002      1.41670001
+    -1.81035995      0.89782000      1.78294003
+    -2.21276999      1.17896998      1.63609004
+    -1.88458002      0.52998000      1.38068998
+    -1.50282001      0.86420000      1.40904999
+    -1.34704995      0.43570000      1.25855994
+    -1.44836998      1.23869002      1.20177996
+    -0.34836501      1.23949003      1.27111995
+    -0.38209501     -3.47328997     -3.72985005
+    -0.63290501     -3.47328997     -3.34364009
+    -0.38209501     -3.47328997     -4.21367979
+    -0.14129500     -3.47328997     -3.33713007
+    -0.00862500     -2.99237990     -3.81827998
+    -0.76696497      1.57720995      1.28580999
+    -0.76131499      1.11289001      1.47140002
+    -1.22114003      1.55978000      1.18860996
+    -1.17358994      1.15495002      1.42750001
+    -0.98124498      0.38806000      1.19393003
+    -0.59360498      0.91090000      1.01008999
+    -0.31010500      0.61324000      0.95091999
+    -0.94296497      0.74989998      1.27971995
+    -0.56325501      0.35800001      1.10306001
+    -0.48357499      0.93202001      0.64187002
+    -0.56041503      0.35925999      0.71226001
+    -0.01577500      0.69055998      0.39625001
+     0.18864501      0.98237002      0.53007001
+    -0.03827500      1.34328997      0.56502002
+    -0.00817500      1.27719998      0.25055999
+    -0.34756500      1.51729000      0.58020002
+    -0.51913500      1.49536002      0.90542001
+    -0.03676500      1.80778003      0.78792000
+    -0.12890500      1.65944004      0.34825000
+    -0.40138501     -2.96719003     -4.69750023
+    -0.46671501      2.15675998      0.86260003
+    -0.25277501      2.04705000      0.44947001
+    -0.31924501      2.47350001      0.55084997
+    -1.02921999      2.32190990      1.04504001
+    -0.93074501      2.03271008      1.00560999
+    -1.34186995      2.01999998      0.93329000
+     0.11599500     -2.99310994     -4.20588017
+     0.35638499     -2.56550002     -3.90649009
+    -0.76752502      2.57464004      0.60017002
+    -0.18318500      3.13893008     -0.29266000
+    -0.51614499      2.81738997      0.06656000
+    -0.35285500      2.44075990     -0.00928000
+     0.11677500      2.39920998      0.24066000
+    -0.18775500      2.00554991      0.02143000
+     0.39270499      2.63158011      0.01079000
+    -0.92781502      0.08531000      0.89744997
+    -1.11231005     -0.24624000      1.19043005
+    -1.63673997      0.12970001      1.32941997
+    -1.39672005     -0.24838001      1.33727002
+     0.30142501      2.09739995     -0.00787000
+     0.12908500     -3.47328997     -2.90054989
+     0.09899500     -3.07239008     -2.79184008
+     0.21030501     -2.75213003     -2.96806002
+     0.33694500     -3.00709009     -3.22285008
+    -0.25740501     -3.07093000     -3.01239991
+     0.55611497      1.79027998      0.13486999
+     0.32338500      1.60950994     -0.08254000
+     0.16971500      1.91902995      0.20508000
+     0.12260500      2.70393991     -0.49487001
+     0.58026499      1.32193005     -0.03440000
+     0.43183500      1.37005997     -0.28380001
+     0.66795498      1.87399006     -0.23386000
+     0.52569503      2.26933002     -0.37819001
+     0.80543500      0.49583000      0.73029000
+     1.05853999      0.73139000      0.47867000
+     1.17884004      0.95577002      0.35947999
+     1.15389001      1.24451005      0.60276997
+     1.53179002      1.28419006      0.75891000
+     1.35696006      1.37994003      0.30303001
+     1.34358001      0.50546002      0.96395999
+     1.52583003      0.87764001      0.79926002
+     1.79974997      0.82858002      0.89579999
+     1.61552000      0.19653000      1.15193999
+     2.04431009      0.37836999      1.09337997
+     0.85331500      0.29473001      0.35591999
+     1.34351003      0.08110000      0.76317000
+     1.08639002     -0.02796000      0.49136001
+     1.04842997     -0.87628001      0.82341999
+     1.13757002     -0.39884001      0.72307003
+     0.83560503     -0.61556000      0.12216000
+     0.83212501     -0.65890002      0.62052000
+     0.75799501     -0.16720000      0.37447000
+    -0.17047501     -3.14028001     -4.49567986
+     1.78715003      0.00553000      0.70178998
+     1.79183996     -0.32238001      1.09398997
+     2.21075010     -0.05647000      1.06067002
+     0.71360499      1.53960001     -0.08874000
+     0.86732501      1.86214006     -0.25374001
+     0.57010502     -2.17430997     -3.59469008
+     0.25071499      0.55971998      0.07893000
+     0.79784501      0.19410001     -0.02764000
+     0.49366501      0.19620000      0.11237000
+     0.35956499      0.29488999     -0.28250000
+     1.02717996      0.49678001      0.08472000
+     0.70741498      0.49983001     -0.06185000
+     0.85354501      0.98268998     -0.11673000
+     0.88626498     -2.32769990     -3.22844005
+     0.57705498     -1.91777003     -2.88855004
+     0.59308499     -2.55956006     -2.89917994
+     1.16895998      1.45843005     -0.13415000
+     2.01286006     -3.04873991      0.37564000
+     2.45942998     -2.99927998      0.49044999
+     2.67683005     -2.82420993      0.46024001
+     1.36924005     -3.05814004      0.51738000
+     1.72502005     -2.88235998      0.48971000
+     2.07937002     -2.75481009      0.49325001
+     1.65096998     -2.54237008      0.50123000
+     0.80693501     -1.74820995      0.44532999
+     0.94253498     -1.59314001      0.66601002
+     0.99195498     -1.37946999      0.82066000
+     0.89320499     -0.90446001      0.62750000
+     0.51909500     -1.28941000      0.51159000
+     0.73287499     -1.00270998      0.38457000
+     1.27921999     -1.63874996      0.66267002
+     0.68737501     -2.68985009     -3.53780007
+     0.47855499     -3.05012012     -3.81794000
+     1.62346995     -1.25285006      1.00897002
+     2.11228991     -1.34168994      0.99720001
+     2.59817004     -1.45091999      0.98307002
+     2.48920012     -0.97214001      1.00522006
+     1.75399995     -2.11162996      0.71280003
+     1.68341005     -1.60800004      0.64495999
+     2.16640997     -2.28624010      0.61116999
+     2.21451998     -1.97319996      0.82119000
+     2.11044002     -1.72292995      0.63669002
+     2.57032990     -1.59481001      0.69954997
+     0.49820501     -0.90960002     -3.28910995
+     2.68499994     -1.94200003      0.96500999
+     1.71311998     -1.37861001      0.72653002
+     1.73954999     -0.16201000      0.55584002
+     1.94802999     -0.48816001      0.75367999
+    -0.88371497     -3.47328997     -2.95742011
+    -0.37968501     -3.47328997     -2.92394996
+    -0.54796499     -3.19603992     -2.74317002
+     1.96496999     -0.85400999      1.03518999
+     1.67605996     -0.96019000      0.59356999
+     1.40252995     -0.50108999      0.70222998
+     1.29443002     -1.13427997      0.64924997
+     2.37766004     -0.80269003      0.68546999
+     2.24769998     -0.45693001      0.57716000
+     2.61773992     -2.30532002      0.41745001
+     0.91675502     -0.75357002     -0.04823000
+     0.75557500     -0.95372999      0.00880000
+     0.62503499     -1.35521996      0.52300000
+     1.16093004     -1.91139996      0.43741000
+     1.07690001     -2.77548003      0.92250001
+    -0.11772500     -3.08821011      1.53770995
+     0.31089500     -3.09852004      1.50332999
+     0.15566500     -3.47328997      1.33249998
+    -0.49259499     -2.77643991     -2.20437002
+    -0.30784500     -2.95598006     -2.50805998
+    -0.71925497     -3.04251003     -2.53889990
+     0.15566500     -3.47328997      0.92250001
+     0.19711500     -2.76294994      1.38364995
+     0.59656501     -2.40938997      1.31227005
+     0.59411502     -2.16525006      0.90658998
+     0.31089500     -3.09852004      0.92250001
+     0.68566501     -2.94329000      1.33249998
+     0.68566501     -2.94329000      0.92250001
+     0.68566501     -2.67329001      0.92250001
+     1.21085000     -2.34668994      0.51605999
+     1.08639002     -2.78096008      0.28402001
+    -1.42337000     -0.51275003      1.09095001
+    -0.55827498     -1.85400999      1.60099995
+    -0.65739501     -1.42692006      1.63095999
+    -1.16215003     -0.57190001      1.03754997
+    -1.30833006     -0.76740003      1.07170999
+    -0.12153500     -2.65578008     -2.32460999
+    -1.16100001     -0.60833001      1.39782000
+     0.76674497     -2.15669990      0.50336999
+     0.36901501     -1.81101000      0.46658999
+     0.22544500     -1.47973001      0.35334000
+    -0.56951499     -1.47113001      1.22248006
+    -0.41862500     -1.94165003      1.17323995
+    -0.28775501     -1.55016005      0.81641001
+    -1.38532996     -3.47328997     -2.18499994
+    -1.13452005     -3.47328997     -2.57120991
+    -0.94911498     -3.13478994     -2.25395012
+    -0.07496500     -2.40342999      1.24889004
+     0.04742500     -2.07801008      0.85968000
+    -0.45737499     -2.45188999      1.23412001
+    -0.73926502     -2.15736008      1.23581004
+    -0.26402500     -2.79866004      1.23746002
+    -0.64555502     -2.59675002      1.26379001
+    -0.52471501     -2.93666005      1.39295995
+    -0.41163501     -3.13312006      0.91161001
+    -0.35572499     -3.47328997      1.20316005
+    -0.61001498     -3.18777990      1.23529005
+    -0.11433500     -3.47328997      0.92250001
+    -0.65831500     -3.47328997      1.14456999
+    -0.92597502     -2.93085003     -2.03702998
+     2.16654992     -3.47328997      0.18415000
+     2.59401011     -3.10137010      0.08418000
+     2.54749990     -3.47328997     -0.10238000
+     1.63393998     -3.13395000      0.22064000
+     1.78656995     -3.47328997      0.06695000
+     1.38039994     -3.07694006      0.05219000
+     1.48565996     -3.47328997     -0.21985000
+     1.18274999     -2.84670997     -0.13745999
+    -2.41786003      0.98091000      1.21108997
+    -1.97499001      0.24514000      0.97602999
+    -0.63845497     -3.47328997     -2.51818991
+    -0.42536500      0.66898000      0.56405997
+    -1.42726004      0.17411999      1.01275003
+    -1.01549995     -0.03662000      0.59184003
+     0.13270500      0.39708000      0.00407000
+    -0.83968502      0.17737000      0.50255001
+    -0.55784500      0.36039999      0.35932001
+    -0.05704500     -2.31329012     -2.23936009
+    -0.25597501     -2.10731006     -2.03081989
+    -0.23761500     -2.44393992     -2.08836007
+     0.44528499      0.88594002     -0.21456000
+     0.22455500      1.22008002     -0.16443001
+     0.11560500      0.89507997      0.18103001
+     0.13564500      0.85746002      0.07204000
+    -0.04208500      1.65769994     -0.12754001
+    -0.00796500      1.53374004      0.06260000
+    -0.01838500      1.14715004      0.02761000
+    -0.09417500      0.66073000      0.13480000
+    -0.17479500      0.44165000      0.20502000
+    -0.05245500      0.63392001     -0.03103000
+     0.14557500      0.55015999     -0.24724001
+     0.05443500      0.41815001     -0.28250000
+     0.11106500      1.38050997     -0.33518001
+    -1.53220999      1.54436004      0.93435001
+    -1.65191996      1.72059000      1.04200995
+     0.39235500     -2.24671006     -2.61977005
+     0.51514500     -1.93684006     -2.51947999
+     0.09824500     -2.01389003     -2.49825001
+    -2.02991009      1.35555005      1.12990999
+    -0.87603498      0.37516999      0.49944001
+    -0.31897500      0.88340998      0.43169999
+    -0.82936502      1.61127996      0.65661001
+    -0.59635502      1.26479995      0.56163001
+    -2.22273993      0.63568997      1.06277001
+    -1.04506004      0.39405000      0.85539001
+    -1.81210005      1.07015002      1.04936004
+    -1.66796005      0.49765000      0.85946000
+    -1.53312004      1.21343005      0.70371997
+    -1.11231995      0.69874001      0.59530002
+    -1.35353994      0.91333002      0.92799002
+    -0.87699503      1.09696996      0.62160999
+    -1.09229004      1.51253998      0.76323998
+    -1.01339996      1.13494003      1.02543998
+     0.23690499     -2.55417991     -2.38072991
+     0.46300501     -2.79470992     -2.57698989
+    -0.77361500      0.73550999      0.87186998
+    -0.68481499      0.71399999      0.48903999
+    -0.29726499      0.98732001      0.20555000
+    -0.45667499      1.35906005      0.29776001
+    -0.42798501      1.64759004     -0.17066000
+    -0.60794502      1.74562001      0.40206000
+    -0.70881498      2.14475012      0.50642997
+    -1.15462005      2.20081997      0.57072997
+    -1.15093005      1.82703996      0.46522000
+    -1.50664997      1.86087000      0.58605999
+    -2.23091006      1.16147006      0.70994002
+    -0.62411499      2.09295988     -0.19991000
+     1.01413000     -2.91719007     -3.14136004
+    -0.95145500      2.39701009      0.11721000
+    -0.24103500      1.38410997     -0.40345001
+    -0.48455501      2.84788990     -0.43279999
+    -0.30484501      3.02144003     -0.77524000
+    -0.78619498      2.55660009     -0.35845000
+    -0.18711500      2.50739002     -0.70704001
+    -0.70173502      2.13435006     -0.38095999
+    -1.51385999     -2.27556992     -1.90245998
+    -1.57618999     -2.01779008     -1.79271996
+    -1.46364999     -2.53613997     -1.79249001
+    -1.35071003     -1.98830998     -1.81869996
+    -1.34292996     -1.77476001     -1.92413998
+    -0.36114499      2.36195993     -0.42365000
+    -0.37145501      1.84595001     -0.44016999
+     0.05447500      2.08304000     -0.43467000
+    -0.44294500      2.88807988     -1.24488997
+    -0.07262500      2.60507989     -1.05408001
+    -1.11276996     -0.24772000      0.80312002
+    -1.11276996     -0.24772000      0.45398000
+    -1.69853997     -0.22364999      0.91803002
+    -0.20421501      1.61954999     -0.60868001
+     0.36046499      1.74839997     -0.26631999
+     0.11498500      1.62785995     -0.68923998
+     0.27591500      1.12860000     -0.51415002
+     0.39266500      1.86199999     -0.72947001
+     0.30307499      2.25828004     -0.88375998
+     0.28372499      0.58929998     -0.56111002
+     0.21211500      0.36915001     -0.53329998
+     0.42216501      1.35221004     -0.51226002
+     0.73520499      1.19207001     -0.39840001
+     0.57105500      1.51416004     -0.56843001
+     0.65725499      1.86985004     -0.74180001
+     1.40895998      1.10169995     -0.02874000
+    -1.40610003     -2.99127007     -1.78753996
+    -1.11187005     -2.75374007     -1.60502005
+     1.17929006      0.32200000      0.44137999
+     0.93010497      0.21292000      0.00285000
+     0.83513498      0.05171000     -0.17839999
+     0.75800502     -0.16722000      0.02694000
+     1.48626006      0.73150998      0.43074000
+     1.33569002      0.71168000      0.05744000
+     1.43560004      0.48030999      0.53074002
+     1.64795995      0.85642999      0.33553001
+     1.46264005      0.13153000      0.35018000
+     1.95170999      0.33895999      0.58418000
+    -1.05777001     -2.46967006     -1.76630998
+     0.81375498     -0.77490002     -0.28250000
+     0.83221501     -0.45493001     -0.28250000
+     1.10984004     -0.01807000      0.17818999
+     1.03146994     -0.38277999      0.08448000
+     1.38206995     -0.22735000      0.35479999
+     1.18991995     -0.67553002      0.27768001
+     2.06152010     -0.07555000      0.36579999
+    -1.83410001     -1.26759005     -1.82562995
+    -1.69128001     -1.64028001     -1.67619002
+    -1.37405002     -1.40146995     -1.99726999
+     0.34540501      0.30322999     -0.78193998
+     0.43020499      0.86755002     -0.70616001
+     0.98143500      1.47182000     -0.59750003
+     0.55057502      0.34259000     -0.69441998
+     0.59950501      0.28911999     -0.42396000
+     0.83534497      0.29146001     -0.28082001
+     0.63639498      0.59998000     -0.47165999
+     0.58540499      0.10571000     -0.78618002
+     0.49071500      0.19878000     -0.53571999
+     0.60256499      0.08595000     -0.28250000
+     1.06022000      0.65568000     -0.36927000
+     0.84928501      0.90099001     -0.63006997
+     1.27661002      1.07925999     -0.43171000
+    -1.06932998     -1.94394004     -1.82177997
+    -1.23980999     -1.69886994     -1.89833999
+     2.05206990     -2.18927002      0.26631001
+     2.25134993     -2.89437008      0.06664000
+     2.54429007     -2.68347001     -0.00160000
+     1.61017001     -2.25883007      0.16811000
+     1.44403994     -2.76390004      0.04763000
+     1.81208003     -2.63286996      0.01390000
+     1.12793005     -2.56745005     -0.15907000
+     1.35987997     -2.38756990      0.10023000
+     0.74654502     -1.74423003      0.13514000
+     0.99204499     -1.77627003      0.07528000
+     1.11294997     -1.50673997      0.29629999
+    -1.07624996     -1.47341001     -1.96660995
+    -1.17145002     -1.19379997     -2.10384011
+     0.94271499     -1.15319002      0.19594000
+     0.56347501     -1.24542999      0.10044000
+     1.54447997     -1.80133998      0.23210000
+     1.54970002     -1.50826001      0.27954000
+     2.03170991     -1.13352001      0.52600002
+     2.46246004     -1.23986995      0.55949003
+     1.93813002     -1.91366994      0.13111000
+     1.99503005     -1.45726001      0.33724999
+     2.50677991     -1.75233996      0.30649000
+     1.25278997     -0.93804997     -0.14080000
+     1.88095999     -1.08297002      0.24335000
+     1.93850005     -0.65346998      0.36381000
+    -0.35692501     -2.29323006     -1.78945994
+    -0.65504497     -2.19638991     -1.86017001
+    -0.67304498     -2.45022988     -1.72634995
+    -0.40256500     -1.94128001     -2.08311009
+    -0.41815501     -2.65894008     -1.87818003
+     1.59985006     -0.78281999      0.09187000
+     2.28970003     -0.84608001      0.27592999
+     2.11950994     -0.46766001      0.08096000
+     2.45525002     -2.20460010     -0.12748000
+     0.69047499     -1.08007002     -0.28250000
+     0.68781501     -1.61977994      0.13134000
+     0.74412501     -1.85991001     -0.23423000
+     0.48150501     -1.32310998     -0.28250000
+     0.22699501     -1.47908998      0.00565000
+     0.93383503     -2.17671990      0.11961000
+     0.92476499     -2.71009994     -0.03410000
+     0.92949498     -2.71139002     -0.28224999
+     0.33040500     -2.32499003      0.55741000
+     0.46353501     -2.45240998      0.33026001
+     0.66718501     -2.67387009      0.51661998
+    -0.01214500     -3.08206010      0.92250001
+     0.29443499     -2.77548003      0.92250001
+     0.57449502     -2.42098999     -0.06704000
+     0.65044498     -2.67440009      0.14902000
+    -1.16214001     -0.56094003      0.64744997
+    -1.54305995     -0.70968997      0.72276998
+    -0.91853499     -1.21211004      0.44304001
+    -0.83780497     -1.70019996      1.25857997
+    -1.08299994     -0.94862998      0.42569000
+    -0.06797500     -2.15118003     -2.20783997
+    -0.76572502     -1.35557997      0.85657001
+    -0.89238501     -1.24155998      1.39804006
+    -1.31742001     -1.04809999      0.84656000
+    -1.08301997     -0.94859999      0.89671999
+    -1.08302999     -0.94858003      1.28980005
+     0.09471500     -1.83615005      0.29991001
+     0.16094500     -1.70260000     -0.00876000
+     0.19299500     -2.21990991      0.43007001
+     0.43789500     -2.11297011      0.07953000
+    -0.17897500     -1.55772996      0.20915000
+    -0.58636498     -1.46369004      0.39039001
+    -0.77449501     -1.93731999     -1.80276000
+    -0.74964499     -1.70007002      0.83757001
+    -0.36614501     -1.94321001      0.51010001
+    -0.20122500     -2.24784994      0.54058999
+    -0.04247500     -2.55571008      0.54141003
+    -0.53874499     -2.07844996      0.84794998
+    -1.00826001     -1.99809003      0.83455998
+    -0.11433500     -3.47328997      0.69749999
+    -0.85601503     -2.53252006     -1.50381005
+    -0.72269499     -2.89765000     -1.69133997
+    -0.25106499     -2.98061991      0.56737000
+    -0.33462501     -2.65872002      0.88643998
+    -0.89964497     -2.48566008      0.85307002
+    -0.43460500     -3.47328997      0.55941999
+    -0.82204503     -2.97826004      0.88779998
+    -0.77504498     -3.47328997      0.93879998
+     1.48565996     -3.47328997     -0.61890000
+     2.09413004     -2.81603003     -0.35817999
+     1.96131003     -3.47328997     -0.30012000
+     2.46918988     -3.06177998     -0.32376000
+     2.38148999     -3.47328997     -0.60649002
+    -0.47328499     -1.97915006     -1.76653004
+    -0.63883501     -1.72966003     -1.84729004
+     1.87574995     -3.47328997     -0.80431998
+     1.71968997     -3.05367994     -0.62996000
+     1.58142996     -2.94112992     -0.21219000
+     1.39502001     -3.10353994     -0.35637000
+     1.39829004     -3.10997009     -0.72617000
+     1.20799005     -2.86769009     -0.48929000
+     0.57440501     -2.22171998     -0.31211999
+     1.19570005     -2.61203003     -0.51589000
+     0.76769501     -2.49879003     -0.43525001
+     0.99376500     -2.73499990     -0.58403999
+     2.38575006     -2.61793995     -0.48367000
+    -0.23789500     -1.34707999     -2.17308998
+    -0.33650500     -1.67447996     -1.80703998
+    -0.22977500     -1.60958004     -2.10541010
+    -0.66578501     -1.39927006     -1.91017997
+    -2.59904003      0.80594999      0.75586998
+    -2.41405010      0.98460001      0.28277999
+    -2.33534002      0.41782001      0.62661999
+    -2.06294990     -0.01269000      0.53136998
+    -1.62426996     -0.01700000      0.42662999
+    -1.25827003     -0.01221000      0.36603001
+    -0.99029499      0.00270000      0.30210999
+    -1.66788995      0.27445000      0.16603000
+    -1.81841004      0.37338999      0.49912000
+    -0.59204501      0.68356001      0.13417999
+    -1.05483997      0.19145000      0.27812999
+    -1.31950998      0.34446001      0.36100999
+    -0.21082500      0.44047999     -0.10092000
+    -0.89735502      0.41767001      0.20920999
+    -0.80878502      0.20462000      0.15230000
+    -0.55545503      0.36144999      0.03203000
+     0.00433500      0.83564001     -0.36564001
+    -0.08517500      1.19620001     -0.29907000
+    -0.20848501      0.91838998     -0.05965000
+    -0.30945501      1.25455999     -0.11621000
+    -0.99658501     -0.91211998     -1.94377005
+    -1.24398005     -1.01712000     -1.94496000
+    -0.83283502     -1.04893005     -2.01968002
+    -1.09057999     -0.18598001      0.11162000
+    -0.41444501      0.63037002     -0.18071000
+    -0.26549500      0.43663001     -0.28250000
+    -0.28567499      0.61057001     -0.43024999
+    -0.10664500      0.44009000     -0.53571999
+     0.03522500      0.57590997     -0.61127001
+    -0.24189501      0.65267003     -0.66443998
+     0.07046500      0.41431001     -0.78195000
+    -0.08165500      1.13318002     -0.59959000
+     0.02880500      0.82830000     -0.76178998
+    -1.40339994      1.47624004      0.49823999
+    -1.86304998      1.51670003      0.64696002
+    -1.05343997      0.72039002      0.29762000
+    -0.74818498      1.04832995      0.23494001
+    -0.94965500      1.43651998      0.34516001
+    -2.03836012      0.77025998      0.59867001
+    -1.52996004      0.73746002      0.45041999
+    -1.71654999      1.12548995      0.55004001
+    -1.48590004     -1.11978996     -1.69408000
+    -1.76382995     -0.98324001     -1.75462997
+    -1.23353004      1.09074998      0.39605999
+    -0.79396498      1.37208998     -0.05077000
+    -0.89742500      1.06419003     -0.18285000
+    -0.59178501      0.98685002     -0.12966000
+    -0.60202497      1.29364002     -0.42765999
+    -0.83661503      1.70509005     -0.36418000
+    -1.03594005      1.76216996      0.03656000
+    -1.33132994      2.03017998      0.14225000
+    -1.69752002      1.67656004      0.18071000
+    -2.06175995      1.32482004      0.23273000
+    -1.15325999      2.20213008     -0.31832999
+    -0.40356499      1.19212997     -0.76010001
+    -0.84795499      1.98784995     -0.65144998
+    -0.63248497      2.70503998     -0.80431002
+    -0.97954500      2.36988997     -0.77930999
+    -0.34888500      1.37853003     -1.00685000
+    -0.49895501     -0.99308997     -2.02749991
+    -0.28922501     -0.61193001     -2.28816009
+    -0.63479501     -1.02135003     -2.00540996
+    -0.43985501     -1.19511998     -2.02431989
+    -0.25186500     -0.88269001     -2.15295005
+    -0.58664501      1.61265004     -0.77348000
+    -0.24420500      2.02177000     -0.91944999
+    -0.02438500      1.78772998     -1.24014997
+    -0.79699498      2.54618001     -1.23534000
+    -0.59652501      2.73976994     -1.70009995
+    -0.26398501      2.50893998     -1.51959002
+     0.08197500      2.20436001     -1.37214005
+    -1.44782996     -0.34726000      0.37441000
+    -1.16194999     -0.52938998      0.26758999
+    -1.83861005     -0.44775999      0.42787999
+    -1.15375996     -0.42738000     -0.07164000
+    -0.08152500      1.42396998     -1.07806003
+     0.31261501      1.46847999     -1.07246995
+     0.14242500      0.68763000     -0.95718998
+     0.17856500      1.13777006     -0.92467999
+     0.43178499      1.84908998     -1.22599006
+     0.38619500      0.52836001     -0.77314001
+     0.21213500      0.36915001     -1.02750003
+     0.36783499      0.28941000     -1.19218004
+     0.60428500      1.14883995     -0.88761997
+     0.76694500      1.46350002     -1.07831001
+     1.20639002     -2.60785007     -0.76678002
+     0.99128503      0.29335999     -0.40924999
+     0.75800502     -0.16723999     -0.28250000
+    -0.57616502     -1.17962003     -1.83078003
+    -0.89239502     -1.27163994     -1.84368002
+    -1.14816999     -1.25302994     -1.66685998
+    -1.00962996     -1.10203004     -1.83863997
+     1.20886004      0.35532999     -0.20422000
+     1.62743998     -0.07098000      0.10908000
+     1.55479002      0.70705998     -0.19716001
+     1.44932997      0.12582000      0.00336000
+     1.14462996     -0.00336000     -0.17721000
+     1.83501005      0.28935000      0.08086000
+     0.75801498     -0.16726001     -0.54868001
+     1.07458997     -0.84627998     -0.51230001
+     0.83569503     -0.61382002     -0.53570998
+     0.76475501     -0.93260998     -0.53329003
+     1.05387998     -0.40641001     -0.46364000
+     0.75802499     -0.16727000     -0.79650998
+     1.45005000     -0.24465001     -0.18724000
+     1.53155005     -0.43147001     -0.09428000
+     1.92602003     -0.11703000     -0.14612000
+     0.44936499      0.23296000     -1.02750003
+     0.54678500      0.14680000     -1.22703004
+     0.63483500      0.04555000     -1.02750003
+     0.74882501      0.46564999     -1.04024994
+     0.57743502      0.77609003     -0.95384997
+     0.93629497      0.58837003     -0.82524002
+     1.08797002      1.05462003     -0.91399997
+     0.77446502      0.13559000     -0.92922997
+     0.83417499      0.07694000     -1.23006999
+     1.21599996      0.34567001     -0.58916998
+     0.79949498      0.17568000     -0.65919000
+    -1.02848995     -1.49893999     -1.72174001
+    -0.95560497     -1.58649004     -1.69779003
+     1.39979994      0.64238000     -0.69058001
+     2.07497001     -2.35816002     -0.17948000
+     1.78094995     -2.60448003     -0.40382999
+     1.43139005     -2.03455997     -0.14924000
+     1.46814001     -2.43021989     -0.30212000
+     1.08367002     -2.19631004     -0.24733000
+     1.12413001     -1.75667000     -0.20173000
+     1.38787997     -1.45103002     -0.16176000
+     0.94801497     -1.18271995     -0.56023997
+     1.00837004     -1.42656004     -0.24268000
+     1.57892001     -2.47461009     -0.66912001
+     1.19348001     -2.28537011     -0.60659999
+     0.75428498     -1.88170004     -3.29893994
+     0.79810500     -1.44773996     -3.11022997
+     1.83419001     -1.78890002     -0.44490999
+     1.83966005     -1.38779998     -0.10216000
+     2.32458997     -1.27672005      0.00501000
+     2.31990004     -1.72650003     -0.31215999
+     1.63671994     -1.36667001     -0.53570002
+     1.29672003     -1.16400003     -0.48491001
+     1.67220998     -1.08308995     -0.43373001
+     1.54847002     -0.77811998     -0.49601001
+     1.98959005     -0.47784999     -0.33675000
+     2.14313006     -0.84570998     -0.21798000
+     2.27445006     -2.15956998     -0.64630997
+     0.23590501     -1.72774005     -2.41950011
+     0.30571499     -1.56739998     -2.45905995
+     0.63174498     -1.79269004     -0.54961002
+     0.95449501     -1.74088001     -0.50019002
+     0.80257499     -2.03797007     -0.56088001
+     0.77775502     -1.43203998     -0.62937999
+     0.66555500     -1.47396004     -0.47984999
+     0.59435499     -1.21123004     -0.53570998
+     0.69882500     -1.06590998     -0.78193998
+     0.46290499     -1.84240997     -0.53026003
+     0.49825501     -1.75356996     -0.24307001
+     0.50447500     -1.51293004     -0.51762998
+     0.22827500     -1.47855997     -0.28250000
+     0.41495499     -2.11023998     -0.33891001
+     0.22827500     -1.47855997     -0.54868001
+     0.41324499     -2.08608007     -0.60887003
+     0.60248500     -2.31929994     -0.63331997
+    -0.48337501     -1.66237998      0.09115000
+    -0.40381500     -1.97017002      0.10831000
+    -0.01260500     -1.52962995     -2.30895996
+     0.03847500     -1.27550006     -2.26603007
+    -0.03394500     -1.81922996     -0.16143000
+    -0.23180500     -1.75646996     -0.04354000
+     0.15977500     -1.93166006     -0.30713999
+    -0.46247500     -1.51163006     -0.03306000
+    -0.05943500     -1.55272996     -0.28250000
+    -0.37941501     -1.53421998     -0.28250000
+     0.51525497     -2.48340988     -0.39594001
+     0.63525498     -2.67488003     -0.18459000
+    -0.06254500     -2.85523009      0.30182999
+     0.15309501     -2.54185009      0.20315000
+     0.35889500     -2.74319005     -0.00530000
+     0.29276499     -2.77665997      0.34862000
+     1.11292005     -1.45208001     -2.66770005
+     0.67252499     -0.59950000     -2.91991997
+     0.87423497     -0.99011999     -2.82638001
+     0.24885499     -0.98203999     -2.41522002
+     0.70407498     -1.01990998     -2.30101991
+     0.38909501     -1.24721003     -2.20038009
+     0.46401501     -0.64670998     -2.55516005
+     0.61835498     -1.72046995     -2.31561995
+     0.00993500     -3.04544997      0.51389998
+    -0.11433500     -3.47328997      0.19697000
+     0.34464499     -2.51708007     -0.12763000
+    -0.53710502     -1.48520994     -0.53329998
+    -0.68456501     -1.41091001     -0.28250000
+    -0.78893501     -1.62326002      0.00479000
+    -0.79445499     -1.33279002      0.04626000
+    -0.92756498     -1.20191002     -0.28250000
+    -1.08299005     -0.94865000      0.03844000
+    -1.69114006     -0.82947999      0.30434000
+    -1.30243003     -1.04179001      0.02687000
+    -0.95562500     -1.53120005     -0.18739000
+    -1.06610000     -1.59947002      0.37373000
+    -1.03877997     -1.52716005      0.08598000
+    -1.15785003     -1.24774003      0.19101000
+    -1.51326001     -1.13126004      0.39166999
+    -1.14775002     -1.51808000      0.83234000
+    -1.20732999     -1.90592003      0.47746000
+     0.15060499     -2.17207003     -0.11526000
+    -0.13492499     -2.11239004      0.04040000
+    -0.54791498     -2.14791012      0.01402000
+    -0.72528499     -1.90508997      0.20236000
+    -1.01813996     -1.83405995      0.02984000
+    -0.44367501     -2.41452003      0.25117999
+    -1.11609995     -2.31541991      0.46900001
+    -0.44570500     -2.85847998      0.08452000
+    -0.22048500     -3.20766997      0.20352000
+    -0.50854498     -3.47328997      0.08007000
+    -0.58415502     -2.99905992      0.39969999
+    -0.88779497     -2.69134998      0.46188000
+    -0.64487499     -3.34796000      0.19284999
+    -1.03338003     -2.82326007      0.48159999
+    -0.98103499     -3.47328997      0.52069998
+     1.39836001     -3.11010003     -1.06781006
+     1.48565996     -3.47328997     -0.97557002
+     1.79954004     -3.14905000     -0.95802999
+     1.95157003     -2.66852999     -0.70367002
+     2.29969001     -3.03414011     -0.79835999
+     0.22427499     -0.39414999     -2.68657994
+    -0.10907500     -0.53555000     -2.57630992
+     0.26309499     -0.60347998     -2.97456002
+     2.19052005     -3.47328997     -1.09736001
+     1.74988997     -3.47328997     -1.22746003
+     1.48565996     -3.47328997     -1.30176997
+     1.52114999     -2.81070995     -0.83595997
+     1.19213998     -2.85412002     -0.85038000
+     0.33278501     -2.34931993     -0.60316002
+     0.85571498     -2.52057004     -0.80164999
+     0.89696503     -2.70169997     -0.83693999
+     1.24084997     -2.89763999     -1.15621996
+     1.37299001     -3.06421995     -1.39795995
+     1.51084006     -2.76826000     -1.22318995
+     2.20108008     -2.57964993     -0.96623999
+    -0.81569499     -1.31478000     -0.53571999
+    -2.75311995      0.65717000      0.27438000
+    -1.90070999     -0.66465998      0.00734000
+    -2.06010008      0.58712000      0.09432000
+    -2.57199001      0.83208001     -0.09265000
+    -2.26769996      1.12592995     -0.18374000
+    -2.87737012      0.53719002     -0.22857000
+     0.05245500     -1.06431997     -2.02749991
+     0.14303499     -0.75550002     -2.27762008
+    -2.03034997      0.30070001      0.11684000
+    -2.39500999      0.17852999      0.15607999
+    -2.12744999     -0.24105000      0.07731000
+    -1.46045005     -0.12426000      0.02994000
+    -1.80575001     -0.08223000      0.07075000
+    -0.95866501      0.04667000      0.00020000
+    -1.43242002      0.21274000     -0.04297000
+    -1.73877001      0.14095999     -0.10387000
+    -1.57597005      0.33302999      0.05278000
+    -1.80824006      0.27987999     -0.28744000
+    -0.90152502      0.67518002     -0.03541000
+    -1.10859001      0.37606999      0.02017000
+    -0.55316502      0.36245999     -0.28250000
+    -0.80636501      0.20705000     -0.28250000
+    -1.72564006      0.63098001     -0.20757000
+    -0.71687502      1.39637995     -0.68053001
+     0.24844500     -2.28192997     -2.11688995
+    -0.55403501      0.99835998     -0.73746002
+    -0.40006500      0.89309001     -0.48796001
+    -0.26114500      0.88543999     -0.82291001
+    -1.01531994     -0.03593000     -0.28250000
+    -1.36810005     -0.17504001     -0.11015000
+    -1.13862002     -0.34105000     -0.28250000
+    -0.97654498      0.87800997     -0.25942001
+    -1.24284995      0.70894003     -0.18694000
+    -0.02593500     -3.01507998     -2.49359012
+     0.28809500     -2.99965000     -2.44669008
+    -0.70522499      0.68629998     -0.36936000
+    -0.55316502      0.36245999     -0.54868001
+    -1.08960998     -0.18339001     -0.53329003
+    -0.69730502      0.74351001     -0.60360998
+    -0.48489499      0.59621000     -0.67495000
+    -0.13970500      0.83736998     -1.05936003
+    -0.15871499      0.64793003     -0.92370999
+    -0.01729500      0.63727999     -1.18195999
+    -0.23937500      0.43891999     -0.78618997
+    -0.05311500      0.43595999     -1.02750003
+    -0.22306500      1.08945000     -1.04196000
+     0.03170500     -1.91183996     -2.09731007
+     0.17733499      0.38216999     -1.29750001
+    -1.53699005      1.30739999      0.17483000
+    -1.31721997      1.50964999     -0.21985000
+    -1.19537997      1.11714005     -0.09070000
+    -1.81245995      0.82564002     -0.37020999
+    -1.65734005      1.04682004     -0.01932000
+    -1.12309003      1.13669002     -0.43107000
+    -1.31789005      0.98715001     -0.44736999
+    -0.89651501      1.36064005     -0.57091999
+    -0.82868499      1.03190994     -0.49772000
+    -1.03397000      1.61837995     -0.72281998
+    -1.52488995      1.84326005     -0.28338999
+     0.08105500     -0.45480001     -2.28211999
+    -1.89786994      1.48307002     -0.24088000
+    -1.34659004      2.01542997     -0.74874997
+    -2.11296010      1.27537000     -0.67645001
+    -0.14714500      1.31657004     -1.27647996
+    -1.14314997      1.92911005     -0.92255002
+    -0.51198500      1.16366994     -0.91516000
+    -0.91310501      1.40540004     -0.89324999
+    -0.68371499      2.04951000     -1.02196002
+    -1.16211998      2.19358993     -1.21109998
+    -0.53549498      1.38575995     -1.24610996
+    -2.17541003     -0.59306997     -2.18499994
+    -2.04182005     -0.83138001     -1.78504002
+    -1.69352996     -0.71419001     -1.71376002
+    -0.80365503      1.63820004     -1.13975000
+    -0.38398501      1.68184996     -1.18223000
+    -0.03046500      1.63524997     -1.50465000
+    -0.50719500      2.09860992     -1.50998998
+    -0.96857500      2.38049006     -1.67256999
+    -0.44703501      2.43035007     -1.89674997
+    -0.76455498      2.57750010     -2.13952994
+    -0.15818501      2.15177011     -1.82402003
+     0.18894500      1.81099999     -1.69444001
+    -1.49023998     -0.83216000     -0.12794000
+    -1.58477998     -0.46096000     -0.14083000
+    -1.15711999     -0.66097999     -0.28250000
+    -1.08297002     -0.94866002     -0.28250000
+    -1.98423004     -0.06944000     -0.35233000
+     0.34131500      1.30612004     -1.22551000
+     0.24691500      0.71531999     -1.18984997
+    -0.03828500      0.92672998     -1.32623005
+    -1.88585997     -0.43942001     -1.74468005
+    -1.46914005     -0.41233000     -1.67050004
+    -1.70152998     -0.08126000     -1.79778004
+    -1.33212996     -0.56928998     -1.81742001
+     0.52669501      1.44367003     -1.55291998
+     0.32546499      0.48225999     -1.40250003
+     0.47789499      0.47565001     -1.17927003
+     0.10851500      0.59353000     -1.45755994
+     0.42677501      0.24965000     -1.38133001
+     0.85031497      1.04724002     -1.40515006
+     0.27695501     -2.09171009     -0.63594002
+     0.45798501     -1.95028996     -0.74500000
+     1.21222997     -2.47591996     -0.88646001
+     1.32480001     -2.35669994     -0.97219002
+     0.88197500     -2.47683001     -1.11414003
+     1.01774001     -2.74549007     -1.09327996
+     0.75803500     -0.16728000     -1.02750003
+     1.33537996     -0.29475001     -0.63073999
+     1.09809995     -0.02314000     -0.57397997
+     1.04285002     -0.04660000     -0.89493001
+     1.69455004      0.22967000     -0.41523999
+     0.83451498     -0.48107001     -0.78618002
+     0.80991501     -0.79093999     -0.78193998
+     0.82557499     -0.40373999     -1.02750003
+     0.96617502     -1.06378996     -0.91961998
+    -1.17571998     -0.98812997     -1.72124004
+    -1.35467994     -0.75665998     -1.65910006
+     0.76474500     -0.93263000     -1.02750003
+     0.83682501     -0.52485001     -1.24758005
+     0.83155501     -0.66736001     -1.02750003
+     1.21176004     -0.75889999     -0.77565002
+     1.05788004     -0.37290001     -0.90754002
+     1.79410994     -0.21321000     -0.61860001
+     0.60362500      0.31371000     -1.48885000
+     0.69015503      0.26504001     -1.21284997
+     0.59090501      0.09924000     -1.41615999
+     0.52185500      0.17116000     -1.57749999
+     0.70607501      0.57977003     -1.35474002
+     0.75804502     -0.16730000     -1.31738997
+     0.91307497      0.12704000     -1.31582999
+    -1.93292999      0.79469001     -3.72985005
+    -1.80674005      0.63924998     -4.21365976
+    -1.79355001      1.05597997     -3.97314000
+     1.06234002      0.22310001     -1.03003001
+     1.18229997      0.57582003     -1.24650002
+     1.06947005     -0.03538000     -1.17391002
+     1.53061998      0.16006000     -0.90276998
+     0.53069502     -1.93264997     -0.97259003
+     0.64126498     -2.10507011     -0.86758000
+     0.90277499     -2.21639991     -0.88795000
+     0.67489499     -2.31769991     -0.99542999
+     0.77309501     -1.86282003     -0.88252002
+     1.80656004     -2.04216003     -0.61523998
+     1.75468004     -2.50228000     -1.02629995
+     1.40998995     -1.92575002     -0.64254999
+     1.03773999     -1.86994004     -0.79718000
+    -1.64442003      0.42429000     -4.69750023
+    -1.27976000      0.58285999     -4.33198977
+     1.17990994     -1.51013994     -0.66587001
+     1.45620000     -2.17536998     -1.03623998
+     1.09919000     -2.02223992     -1.07683003
+     1.77408004     -1.41665995     -0.86827999
+     2.13168001     -1.71627998     -0.82835001
+     2.14418006     -1.26681995     -0.53718001
+     1.14944994     -1.37790000     -1.04742002
+     1.55170000     -0.47975001     -0.79521000
+     1.49479997     -1.16753995     -0.87883002
+     1.92172003     -0.75488001     -0.75827998
+    -0.90012503      0.69331998     -3.93990993
+    -1.26952004      1.10412002     -3.99916005
+     2.08156991     -2.12824011     -1.12118006
+     0.79991502     -1.42776000     -0.87724000
+    -1.42779005     -0.47828999     -0.46847999
+    -1.16058004     -0.50213999     -0.53570998
+    -1.08297002     -0.94867998     -0.54868001
+     0.58322501     -1.42742002     -1.01402998
+     0.48850501     -1.64133000     -0.72807002
+     0.50127500     -1.30592000     -0.78618002
+     0.62854499     -1.16987002     -1.02750003
+     0.22827500     -1.47855997     -0.79650998
+    -0.08554500     -1.55500996     -0.78618002
+     0.17049500     -1.82268000     -0.52885997
+     0.02594500     -2.15809989     -0.47565001
+    -0.54899502      0.76861000     -3.55185008
+    -0.22366500      0.40423000     -3.44287992
+    -0.21831501     -1.55618000     -0.53571999
+    -0.10645500     -1.66767001     -0.81231999
+     0.39758500     -2.17815995     -0.82701999
+    -0.55314499     -1.71309996     -0.34446001
+    -0.63078499     -1.91071999     -0.10507000
+    -0.22469500     -1.88619006     -0.28626001
+    -0.45333499     -2.06977010     -0.52261001
+     0.33910501     -2.75225997     -0.33408999
+    -0.08679500     -2.70918989     -0.12561999
+     0.04822500     -2.99029994     -0.00627000
+    -0.11433500     -3.47328997     -0.28128999
+    -0.00792500     -2.43758011     -0.50733000
+     0.10722500     -2.26267004     -0.78815001
+    -0.88010502      1.13583004     -3.62488008
+    -0.63929498      0.64410001     -3.10426998
+    -1.00781000      1.08911002     -3.12158990
+    -0.70776498     -1.68183994     -0.62465000
+    -0.56495500     -1.76866996     -0.65354002
+    -0.39542499     -1.53038001     -0.78193998
+    -0.67038500     -1.41928005     -0.78195000
+    -0.87900501     -1.61681998     -0.48245999
+    -0.89821500     -1.90530002     -0.33368999
+    -1.21945000     -1.34751999     -0.34692001
+    -1.39391994     -1.08064997     -0.38286999
+    -1.65845001     -1.19291997     -0.02922000
+    -1.38132000     -1.76835001     -0.30421999
+    -1.43455994     -1.59794998      0.15801001
+    -1.31710005     -2.09746003      0.08867000
+    -1.64323997     -0.97676003     -0.40329999
+    -1.76087999     -1.23642004     -0.40358999
+     0.00265500     -3.05723000     -0.48475999
+    -0.11433500     -3.47328997     -0.72368002
+    -0.87733501      0.39161000     -2.49236012
+    -0.68299502      0.54627001     -2.74557996
+    -1.11523998      0.78230000     -2.67494988
+    -0.39191499     -2.36129999     -0.29240000
+    -0.46733499     -2.80567002     -0.30969000
+    -1.16389000     -2.09471989     -0.34646001
+    -0.89858502     -2.24791002     -0.05334000
+    -0.51312500     -3.47328997     -0.41189000
+    -0.80741501     -2.70271993     -0.11804000
+    -1.22615004     -2.58120990      0.07694000
+    -0.69439501     -3.11224008     -0.21588001
+    -0.89384502     -3.47328997     -0.10351000
+    -1.16610003     -3.10805011      0.08612000
+    -1.15068996     -3.47328997      0.09757000
+    -1.40305996     -2.31923008     -0.33026999
+    -0.81833500     -1.57639003     -0.84797001
+    -1.05852997     -1.50825000     -0.72806001
+    -0.92347503     -1.82892001     -0.78092998
+     1.67541003     -3.05501008     -1.34308004
+     1.46222997     -3.28178000     -1.50811005
+     2.10187006     -3.01297998     -1.27526999
+     1.66441000     -3.31329012     -1.51229000
+     1.97600996     -3.47328997     -1.57325006
+    -0.17102499     -0.12983000     -2.61417007
+    -0.30220500      0.27759001     -2.86560988
+    -0.45685500      0.04917000     -2.53114009
+    -0.70378500      0.28116000     -2.42324996
+     1.48565996     -3.47328997     -1.61249995
+     1.50057006     -3.00215006     -1.61682999
+     1.43356001     -3.18650007     -1.72060001
+     1.19507003     -2.59160995     -1.20500004
+     1.12878001     -2.80738997     -1.37219000
+     0.11799500     -2.57767010     -0.68159002
+     0.19426499     -2.84200001     -0.67286998
+     0.75869501     -2.67662001     -1.03772998
+     0.54232502     -1.68511999     -1.02819002
+     0.14436500     -1.95948005     -0.79312003
+     0.12339500     -1.85411000     -0.88972002
+     1.24767995     -2.90411997     -1.66023004
+     1.53930998     -2.72914004     -1.59926999
+     1.47860003     -2.39311004     -1.41183996
+     1.99317002     -2.54098010     -1.43475997
+    -0.91037500     -1.22171998     -0.78618997
+    -1.93921995     -0.84204000     -0.37954000
+    -2.68203998      0.30884999     -0.26416999
+    -2.15809011     -0.44075999     -0.35007000
+    -0.66872501     -0.77294999     -2.02749991
+    -0.82608497     -0.83973002     -1.85655999
+    -0.41558501     -0.66549999     -2.02749991
+    -2.19368005      0.53656000     -0.39302000
+    -2.54771996      0.85553002     -0.60811001
+    -2.96967006      0.44806001     -0.74750000
+    -2.33059001      0.41014001     -0.53653002
+    -2.12768006     -0.05282000     -0.43468001
+    -2.24914002      0.22157000     -0.34613001
+    -2.40609002     -0.05680000     -0.31140000
+    -2.04418993      0.80893999     -0.68339002
+    -1.85941994      0.56862998     -0.61394000
+    -1.70485997     -0.40689999     -0.41194001
+    -1.57896996     -0.01362000     -0.40691999
+    -1.67622995      0.27077001     -0.57400000
+    -1.94692004      0.22961000     -0.58116001
+    -1.17044997      0.51927000     -0.52869999
+    -1.18076003      0.15411000     -0.29427001
+    -1.37076998      0.32367000     -0.39304999
+    -0.84795499      0.39642999     -0.47911000
+    -0.91920501      0.09519000     -0.53570998
+    -1.46775997      0.64721000     -0.59618002
+    -0.26565501     -0.26651001     -2.32730007
+    -0.56284499     -0.09841000     -2.24499011
+    -1.46996999      0.29170001     -0.72565001
+    -0.75728500      0.99941999     -0.92047000
+    -0.49374500      0.77476001     -0.94718999
+    -0.22917500      0.74180001     -1.43371999
+    -1.23898005      0.04725000     -0.51767999
+    -1.36680996     -0.25617999     -0.47902000
+    -1.13478994     -0.32506001     -0.78193998
+    -0.77755499      0.48660001     -0.71096998
+    -0.99532503      0.70975000     -0.64647001
+    -0.55316502      0.36245999     -0.79650998
+    -0.82614499      0.18986000     -0.78618002
+    -1.02367997     -0.05012000     -0.78193998
+     0.02585500      0.13811000     -2.81203008
+    -0.88187498      0.76819998     -0.93393999
+    -0.59183502      0.56124997     -0.96147001
+    -0.39118499      0.63366002     -1.20758998
+    -0.14582500      0.44163999     -1.29885006
+    -0.31671500      0.42998001     -1.02750003
+    -0.55316502      0.36245999     -1.02750003
+    -0.47306499      1.02778995     -1.35281003
+     0.05266500      0.41854000     -1.57749999
+    -0.59749502     -0.22154000     -2.02749991
+    -0.39855501     -0.37610000     -2.02749991
+     0.31925499      0.31829000     -1.57749999
+    -1.78583002      1.34627998     -0.90899998
+    -1.59159994      0.89866000     -0.74742001
+    -1.51267004      1.31603003     -0.54189003
+    -1.29831004      1.57334995     -0.98562002
+    -1.18127000      1.15419996     -0.84222001
+    -1.72330999      1.65164006     -0.71594000
+    -1.53699005      1.83157003     -1.18497002
+    -1.50082004      0.93423998     -1.12642002
+    -1.87472999      0.97197998     -1.09420002
+    -1.92156005      1.46020997     -1.16213000
+    -2.31988001      1.07554996     -1.14821005
+    -2.32530999     -0.00964000     -2.48920989
+    -2.29650998      0.53315002     -3.04229999
+    -2.44733000      0.35372001     -2.68675995
+    -2.29329991      0.43803000     -2.42717004
+    -1.95345998      0.71600997     -2.48676991
+    -1.62089002      0.46237001     -2.46386003
+    -1.83752000      0.47310001     -2.83344007
+    -0.20926499      1.65533996     -1.82521999
+    -0.24644500      1.16050005     -1.63985002
+     0.14166500      1.18761003     -1.59702003
+     0.00888500      0.82530999     -1.66933000
+     0.26879501      1.40848005     -2.01136994
+     0.58957499      1.03975999     -1.87102997
+    -1.20594001      1.51863003     -1.18632996
+    -0.95663500      1.49721003     -1.49962997
+    -0.86963499      1.26436996     -1.27926004
+    -0.46973500      1.79753995     -1.90463996
+    -0.93059498      1.91217995     -1.63090003
+    -1.34441996      2.01753998     -1.64604998
+    -1.14707994      2.20811009     -2.10349989
+    -0.86529499      1.61635995     -1.90184999
+    -0.64171499      1.50288999     -1.63471997
+    -0.25592500      0.43757999     -1.57749999
+    -0.50842500      1.15158999     -1.87988997
+    -0.24305500      0.89951003     -1.88801003
+    -0.13367499      0.48954999     -1.74381995
+    -0.94592500      2.40235996     -2.56199002
+    -0.48721501      2.15023994     -2.28309989
+    -0.07988500      1.76705003     -2.14928007
+    -0.59449500      1.64804995     -2.17852998
+    -0.48319501      1.56048000     -2.14299011
+    -1.47894001     -0.74791998     -0.44722000
+    -1.15941000     -0.63489997     -0.78618002
+    -1.08297002     -0.94870001     -0.79650998
+    -1.87949002     -0.62273997     -0.60925001
+    -2.42841005      0.97074002     -3.34364009
+    -1.81719995      0.98566997     -2.97402000
+    -1.87818003     -0.21770000     -0.58462000
+     0.44965500      0.87333000     -1.61834002
+     0.20111500      0.47141001     -1.69288003
+     0.53812498      0.47768000     -1.67569005
+     0.88082498      0.66038001     -1.73547006
+     0.39922500      0.12904000     -1.68991995
+    -0.03083500      0.27827001     -1.73062003
+     0.29867500     -2.01659989     -1.02348006
+     0.45058501     -2.14732003     -1.16904998
+     0.50483501     -2.16055989     -1.17886996
+     0.57659501     -2.37992001     -1.25286996
+     0.81552500     -2.17712998     -1.26259995
+     0.74351501     -2.32440996     -1.31422997
+     0.98750502     -2.50318003     -1.41907001
+    -1.34340000      1.29833996     -3.18677998
+    -1.52805996      0.96003997     -2.46951008
+    -1.36368001      1.16078997     -2.80274010
+     1.04040003     -2.26834011     -1.23134005
+     0.74684501     -2.67591000     -1.30702996
+    -0.15370500      0.31560001     -1.90480006
+     0.66420501      0.00466000     -1.57749999
+     0.83209503     -0.45657000     -1.42786002
+     0.66967499     -1.25832999     -1.21946001
+     1.07386994     -0.32984000     -1.23125994
+     1.32093000     -0.23658000     -0.97671002
+     0.95159501     -0.97915000     -1.24651003
+     1.04981005     -0.71686000     -0.92693001
+     1.28913999     -1.00343001     -1.10230005
+     0.72869498     -1.01110995     -1.29575002
+     0.81439501     -0.77074999     -1.26585996
+     0.83471501     -0.63301998     -1.41927004
+     1.07912004     -0.60718000     -1.34223998
+     0.87443501     -0.34358999     -1.51329994
+     0.81657499     -0.35427999     -1.57749999
+     0.75805497     -0.16731000     -1.57749999
+    -1.22353005      1.56964004     -3.61851001
+    -1.80695999      1.26084006     -3.48631001
+     1.34118998     -0.58901000     -1.06401002
+     1.63205004     -0.33443999     -1.11430001
+     0.75980502      0.25424999     -1.64184999
+     1.09281003      0.32554999     -1.65199006
+     0.98361498     -0.07183000     -1.52050996
+     1.34361994      0.08068000     -1.38036001
+     1.14502001     -2.32782006     -1.51300001
+     0.59302503     -1.90088999     -1.23938000
+     0.90437502     -1.96932006     -1.34730995
+     1.02206004     -1.67666996     -0.99497002
+     1.66349006     -1.90180004     -1.11622000
+     1.28860998     -1.69263005     -1.09081995
+    -1.07516003      0.21574000     -2.19653010
+    -0.83377498      0.06022000     -2.13597012
+     1.22640002     -2.06385994     -1.37684000
+     1.10836005     -1.51407003     -1.32817996
+     1.53086996     -1.40318000     -1.29962003
+     1.95843005     -1.73255002     -1.24858999
+     1.94313002     -1.29938996     -1.06765997
+     1.41278005     -1.19106996     -1.43496001
+     1.08867002     -1.19349003     -1.42297995
+     1.69733000     -0.86988002     -1.35627997
+     1.86600995     -2.05508995     -1.56789994
+     0.66902500     -1.50393999     -1.29479003
+    -1.59192002     -0.43981001     -0.79250997
+    -2.39861012     -0.24635001     -2.18499994
+    -1.35718000     -0.44782001     -0.93568999
+    -1.22528994     -1.26861000     -0.64095002
+    -1.57090998     -1.15579998     -0.65570998
+    -1.29878998     -1.04030001     -0.78726000
+     0.21160500     -1.71211004     -1.09792995
+    -1.85756004      0.28117999     -2.03149009
+    -2.28578997      0.23647000     -2.11219001
+     0.56209499     -1.24687004     -1.29856002
+     0.44112501     -1.35536003     -1.02750003
+     0.22827500     -1.47855997     -1.02750003
+    -0.00819500     -1.54607999     -1.02750003
+    -0.27181500     -1.55204999     -1.02750003
+    -0.26179501     -1.75621998     -0.87397999
+    -0.02722500     -1.94213998     -0.95314997
+    -0.26430500     -2.05342007     -0.71759999
+    -0.04705500     -1.69064999     -1.11017001
+     0.15481500     -2.05451012     -1.00142002
+    -0.13366500     -2.17398000     -0.94235998
+    -0.58017498     -2.27135992     -0.62728000
+     0.64922500     -0.21394999     -2.74095988
+     0.37607500      0.13953000     -2.89214993
+     0.31305501     -0.04014000     -2.63073993
+    -0.74415499     -2.06813002     -0.45928001
+    -1.07697999     -2.13735008     -0.73421001
+    -0.66617501     -2.01958990     -0.81326002
+    -0.01916500     -3.09531999     -0.89187002
+    -0.11433500     -3.47328997     -1.12776005
+    -0.61947501     -2.83482003     -0.41172999
+    -0.12440500     -2.74167991     -0.48383999
+    -0.31850499     -3.11053991     -0.43829000
+    -0.47209501     -2.54608011     -0.69279999
+    -0.39383501     -2.10472012     -1.06399000
+    -0.16847500     -2.42582011     -0.93080997
+    -0.77927500     -1.65688002     -0.93274999
+    -0.49370500     -1.79558003     -0.98901999
+     0.07971500      0.49631000     -3.03132010
+    -0.69277501     -1.40547001     -1.19218004
+    -0.53708500     -1.48520994     -1.02750003
+    -0.77431500     -1.34899998     -1.02750003
+    -0.95577502     -1.41351998     -1.11882997
+    -1.15575004     -1.36634004     -0.95964003
+    -1.26385999     -1.84854996     -0.67031997
+    -1.45659995     -1.50267994     -0.70824999
+    -1.65191996     -1.46871996     -0.34694999
+    -1.31362998      0.54455000     -2.27060008
+    -1.51288998     -1.86461997     -0.31999999
+    -1.56694996     -2.05292010     -0.74750000
+    -1.71902001     -0.86558998     -0.80125999
+    -1.99046004     -0.93054003     -0.74750000
+    -1.83413005     -1.26751995     -0.74751002
+    -0.26932499     -2.74416995     -0.86874002
+    -0.28993499     -3.12537003     -0.96537000
+    -0.52306497     -3.47328997     -0.86184001
+    -0.72845501     -2.57428002     -0.47316000
+    -1.04539001     -2.46870995     -0.40531999
+    -0.80032498     -0.31682000     -1.89531004
+    -0.91792500     -0.05954000     -1.89163995
+    -1.25727999     -2.28661990     -0.74739999
+    -0.88301498     -3.00425005     -0.57950997
+    -0.92466497     -3.47328997     -0.58108997
+    -1.32337999     -2.82453990     -0.33254999
+    -1.28498995     -3.47328997     -0.32642999
+    -1.47081995     -2.49454999     -0.74750000
+    -1.32647002     -1.68128002     -0.93405002
+    -0.90053499     -1.86933994     -1.08615005
+    -1.01575005     -1.60291004     -1.02481997
+    -1.17787004     -1.90691996     -0.99469000
+    -1.32108998     -2.01128006     -0.97140002
+     1.87913001     -2.99155998     -1.74255002
+     1.34758997     -3.47328997     -1.89900005
+     1.73954999     -3.47328997     -2.03260994
+    -1.01436996     -0.03438000     -1.57749999
+    -1.12744999     -0.29578999     -1.57749999
+    -0.91520500     -0.14950000     -1.72084999
+    -0.99949503      0.29130000     -1.87283003
+    -1.43548000      0.30673999     -1.94753003
+    -1.22046006      0.20411000     -1.50246000
+    -1.35856998     -0.05527000     -1.62318003
+    -1.25768995     -0.36765999     -1.79270995
+     1.32765996     -2.99582005     -1.94035006
+     0.97422600     -2.72727990     -1.61942995
+     0.73456502     -2.67517996     -1.58615994
+     1.13665998     -2.54295993     -1.72941995
+     0.01997500     -2.72788000     -0.99834001
+     0.20230500     -2.83581996     -1.06142998
+     0.44476500     -2.71041989     -1.26510000
+     0.41588500     -1.66520000     -1.26348996
+     0.14775500     -1.83536005     -1.22756004
+     0.12376500     -1.93772995     -1.26464999
+     0.19687501     -2.01846004     -1.32942998
+    -1.38532996     -3.47328997     -0.74750000
+    -0.11433500     -3.47328997     -1.49931002
+     1.10083997     -2.78973007     -1.91172004
+     1.33413005     -2.26077008     -1.80833006
+     1.27856004     -2.64914989     -2.10482001
+     1.75795996     -2.49484992     -1.89697003
+    -0.95978498     -1.16156006     -1.02750003
+    -1.08296001     -0.94871002     -1.02750003
+    -2.17544007     -0.59302002     -0.74750000
+    -2.96967006      0.44806001     -1.22667003
+    -2.66563010      0.10656000     -0.74750000
+    -2.71457005      0.69440001     -1.17972004
+    -2.39862990     -0.24631999     -0.74750000
+    -2.22709990      0.43515000     -0.88308001
+    -2.21575999      0.14686000     -0.81555003
+    -1.68290997      0.59323001     -0.98984998
+    -1.56506002      0.02033000     -0.74004000
+    -1.84921002      0.02172000     -0.94106001
+    -1.78521001      0.22905000     -0.88274002
+    -1.10845995      0.31782001     -0.75809002
+    -1.49688995     -0.26242000     -1.05914998
+    -1.26353002      0.08442000     -0.91075999
+    -1.48310995      0.00330000     -1.07012999
+    -1.60736001      0.59720999     -1.20020998
+    -1.30041003      0.67174000     -0.93229997
+    -1.40919995      0.31722999     -1.02038002
+    -0.80911499      0.86649001     -1.27822995
+    -1.06279004      0.60285002     -1.24225998
+    -0.57812500      0.65842998     -1.49310994
+    -0.59801501      1.04241002     -1.70940995
+    -0.35901499      0.76942003     -1.72409999
+    -2.28656006     -0.41365001     -1.80982006
+    -1.98939002      0.11910000     -1.48794997
+    -2.27099991      0.01161000     -1.70857000
+    -2.05667996     -0.27239001     -1.50352001
+    -1.29317999     -0.16627000     -0.92326999
+    -1.15644002     -0.44865000     -1.02750003
+    -1.08960998     -0.18340001     -1.02750003
+    -0.76941502      0.29663000     -0.98637003
+    -0.96668500      0.44784999     -0.99997997
+    -0.76599503      0.23928000     -1.02750003
+    -0.95341498      0.05381000     -1.02750003
+    -0.77196503      0.55522001     -1.25162995
+    -0.55317497      0.36245999     -1.28543997
+    -0.55318499      0.36245999     -1.57749999
+    -0.91362500      0.90083998     -1.41473997
+    -0.00072500      1.34976995     -2.45404005
+     0.17647500      0.22661000     -1.72248995
+     0.73383498      0.02660000     -1.85289001
+     0.88780499      0.29548001     -2.03314996
+    -2.11038995      0.65740001     -1.36353004
+    -2.62644005      0.51549000     -1.45005000
+    -1.28605998      1.11502004     -1.33581996
+    -1.31201994      0.75832999     -1.47713995
+    -1.59616995      1.33349001     -1.25553000
+    -1.72494996      1.65006995     -1.62670004
+    -1.52757001      1.84066999     -2.07809997
+    -1.33183002      2.02969003     -2.52308011
+    -1.13946998      2.21545005     -2.96650004
+    -1.81897998      0.91447997     -1.40181005
+    -0.84288502     -0.58184999     -1.89651000
+    -1.71012998      1.66436994     -2.50149989
+    -1.90728998      1.47397006     -2.06798005
+    -2.11181998      1.27646005     -1.62098002
+    -2.17548990      0.82858998     -1.73810005
+    -2.51085997      0.89112002     -1.64201999
+    -2.96967006      0.44806001     -1.70582998
+    -2.96967006      0.44806001     -2.18499994
+    -0.96312499     -0.89788997     -1.70767999
+    -1.16235006     -0.54373002     -1.57749999
+    -1.14146996     -0.76178002     -1.57749999
+    -0.98325503     -0.42269000     -1.74539006
+    -0.99504501     -0.67117000     -1.73706996
+     0.62415498      0.63985002     -2.17613006
+    -0.04591500      1.11473000     -2.02887011
+     0.12024500      0.79455000     -1.95105004
+     0.32572499      0.99776000     -2.31597996
+    -0.19194500      0.16347000     -1.85519004
+    -1.19103003      1.56133997     -1.69123995
+    -0.98828501      1.10994005     -1.75697994
+    -1.01964998      1.74690998     -2.22987008
+     0.13795500      0.57328999     -2.20563006
+    -0.86919498      1.30348003     -2.11189008
+    -0.71025503      0.90386999     -1.99542999
+    -0.43019500      0.42938000     -1.79092002
+    -0.46304500      0.15008999     -1.80820000
+    -0.54171503      0.89156997     -2.12498999
+    -0.33432499      0.36614001     -2.13667011
+    -0.29085499      0.57352000     -2.06293988
+    -0.74316502      1.97891998     -2.77180004
+    -0.35656500      1.68745995     -2.59607005
+    -0.40200499      1.09828997     -2.43672991
+    -0.74256498      1.44667006     -2.54075003
+    -0.27625501      1.26706004     -2.87598991
+    -2.11124992      1.11583996     -4.50002003
+    -2.24798989      1.14497006     -4.69750023
+    -1.45132995     -0.77885002     -0.95337999
+    -1.15048003     -0.71224999     -1.02750003
+    -1.34159005     -0.43680999     -1.14751995
+    -1.16173005     -0.59118003     -1.24758005
+    -1.93147004     -0.38830999     -0.98965001
+     0.46227500      0.28382999     -1.90863001
+     0.25126499      0.06353000     -1.83078003
+     0.04602500     -3.47328997     -3.81347990
+     0.44215500     -0.05983000     -1.79393005
+     0.04996500      0.10910000     -1.87712002
+     0.37504500     -2.27501011     -1.43114996
+     0.43316501     -2.71429992     -1.62334001
+     0.34148499     -1.97969997     -1.38177001
+    -0.38209501     -3.47328997     -4.69750023
+    -0.04191500     -3.47328997     -4.38025999
+     0.71831501     -2.40580010     -1.88768995
+     0.52883500     -2.44748998     -1.60276997
+     0.57284498     -2.14683008     -1.53132999
+     0.83905500     -2.34140992     -1.64657998
+    -0.04313500      0.22115999     -2.14965010
+     0.41821501     -1.60994005     -1.52505004
+     0.43850499     -1.86817002     -1.46817005
+     0.46103501      0.04084000     -1.99047995
+     0.61556500     -0.22796001     -2.01014996
+     0.37184501     -3.47328997     -3.31137991
+     0.18654500     -3.23651004     -3.54150009
+     0.83860499     -0.13337000     -1.82720006
+     0.50118500     -0.27636001     -1.85655999
+     0.63822502     -0.21818000     -1.70767999
+     0.67014498     -0.44490999     -1.73706996
+     0.83745497     -0.57234001     -1.57749999
+     0.73888499     -1.17929006     -1.46521997
+     0.68948501     -1.08169997     -1.57749999
+     0.80255502     -0.82028002     -1.57749999
+     0.65836501     -0.69340003     -1.74539006
+     0.59030497     -0.96660000     -1.72084999
+     0.28896499     -3.47328997     -4.04128981
+     1.24504995     -0.35098001     -1.44895005
+     1.05859995     -0.80484998     -1.56506002
+     0.96097499     -0.44994000     -1.72326005
+     1.41954005     -0.42793000     -1.62304997
+     1.13391995     -0.00830000     -1.84671998
+     0.51798499     -0.53425002     -1.89651000
+     0.68331498     -1.68305004     -1.46982002
+     1.03901994     -1.13513994     -1.77537000
+     1.14782000     -1.99052000     -1.77638996
+    -0.11070500     -3.47328997     -2.48693991
+     0.36134499     -3.47328997     -2.50658989
+     0.67302501     -3.47328997     -2.83736992
+     0.38530499     -3.20936990     -2.77675009
+     0.75695503     -1.85516000     -1.72166002
+     1.06759000     -1.72266996     -1.50386000
+     0.87271500     -1.39347994     -1.62742996
+     1.45182002     -1.81177998     -1.54033995
+     1.26689005     -1.41451001     -1.66144001
+     1.72185004     -1.47406006     -1.63180995
+     1.44837999     -0.94989997     -1.88978004
+     1.15763998     -2.25856996     -2.02610993
+     1.60955000     -1.97643995     -2.03437996
+     0.48881501     -1.31690001     -1.57749999
+     0.33674499     -1.44287002     -1.81963003
+    -0.87172502     -1.26285005     -1.22703004
+    -0.91582501     -1.21530998     -1.41615999
+    -1.60751998     -0.51950997     -1.11023998
+    -2.06439996     -0.78917998     -1.09503996
+    -1.71823001     -0.87647003     -1.14357996
+     0.35936499     -3.18583012     -2.18549991
+     0.57459497     -2.93079996     -2.75079989
+     0.11114500     -3.28687000     -2.33787990
+    -1.56685996     -1.15409994     -0.95731997
+    -1.31095004     -1.04549003     -1.14222002
+     0.25214499     -1.70302999     -1.53224003
+     0.22828500     -1.47854996     -1.28543997
+     0.22829500     -1.47854996     -1.57749999
+     0.14059500     -1.72770000     -1.82446003
+     0.00453500     -1.62030995     -1.71803999
+    -0.75169498     -1.36572003     -1.38133001
+    -0.50225502     -1.49825001     -1.29750001
+    -0.06551500     -1.84932005     -1.44284999
+    -0.36908501     -1.69456005     -1.27653003
+     0.00387500     -1.67701995     -1.40507996
+    -0.17908500     -1.55772996     -1.29885006
+    -0.15303500     -1.93210995     -1.18320000
+    -0.52427500     -3.47328997     -1.29119003
+    -1.16434002     -2.25502992     -1.00885999
+    -1.23971999     -2.20772004     -1.15600002
+    -1.51383996     -2.27565002     -1.15245998
+    -0.85003501     -2.34822989     -0.83996999
+    -0.96085501     -2.15695000     -1.14848006
+    -0.67801499     -2.11734009     -1.12448001
+     0.91553497     -3.47328997     -3.29900002
+     0.74941498     -3.11899996     -3.50007010
+    -0.51050502     -1.88645005     -1.24589002
+    -0.22421500     -3.16201997     -1.31958997
+    -0.03055500     -3.11736989     -1.28190005
+    -0.54859501     -2.67429996     -0.81326997
+    -0.49385500     -2.38081002     -1.11930001
+    -0.25692499     -2.62037992     -1.21934998
+    -0.95648497     -1.60221004     -1.26299000
+    -0.65167499     -1.65392005     -1.28852999
+    -0.81999499     -1.87630999     -1.26692998
+    -1.16132998     -1.43931997     -1.19597995
+    -1.24457002     -1.18327999     -1.19290996
+    -1.43475997     -1.44194996     -1.08912003
+    -1.60009003     -1.93136001     -1.03400004
+    -1.68842995     -1.64844000     -0.74750000
+    -1.83412004     -1.26754999     -1.10687995
+     1.19523001     -2.41241002     -2.81401992
+     1.02332997     -1.90767002     -2.94464993
+     0.82378501     -2.15218997     -2.61407995
+    -0.53186500     -2.93227005     -0.96952999
+    -0.42425501     -2.83282995     -1.17947996
+    -0.67877501     -3.14959002     -1.13701999
+    -0.94765502     -3.47328997     -1.03539002
+    -0.87268502     -2.96791005     -1.06327999
+    -1.04419994     -2.68052006     -0.93567997
+    -1.44649994     -2.64699006     -1.04781997
+    -1.40740001     -2.97461009     -0.74750000
+    -1.29911995     -1.70630002     -1.20782995
+    -1.13987005     -1.91105998     -1.27327001
+    -1.46370995     -2.53599000     -1.26227999
+    -1.57622004     -2.01769996     -1.26238000
+     0.88374501     -3.47328997     -2.18549991
+     1.20951998     -3.47328997     -2.18549991
+     1.63036001     -2.96948004     -2.20082998
+     1.48277998     -3.47328997     -2.47409010
+     1.20951998     -3.16656995     -2.18549991
+     1.20951998     -2.86866999     -2.18549991
+     0.60156500     -2.46364999     -2.38677001
+     0.79735500     -2.57540011     -2.56216002
+     0.72162497     -2.67441010     -1.88018000
+     0.35860500     -1.92487001     -1.77438998
+     0.94428498     -2.38105989     -1.99328995
+     0.15242501     -2.87701988     -1.51072001
+     0.23125499     -2.53297997     -1.50404000
+     0.16615500     -1.79412997     -1.55517995
+    -0.08089500     -1.91962004     -1.46238005
+     0.11608500     -2.15856004     -1.58783996
+    -0.94326502     -3.47328997     -1.50407004
+    -1.38532996     -3.47328997     -1.22667003
+     0.27999499     -2.78367996     -1.87530994
+     0.60873502     -3.47328997     -3.68075991
+     0.02359500     -3.02463007     -1.86758995
+    -0.05117500     -3.16235995     -1.60139000
+    -0.50304502     -3.47328997     -1.71872997
+    -0.11433500     -3.47328997     -1.84815001
+     1.06374002     -2.82922006     -2.39720011
+     0.89668500     -2.92596006     -2.18549991
+     0.96631497     -2.72413993     -2.18549991
+     1.02726996     -2.43670988     -2.33508992
+     1.49134004     -2.45360994     -2.35929990
+    -0.43706501     -3.06929994     -1.90014994
+    -0.17682500     -2.88224006     -2.09644008
+    -0.35126501     -3.14966011     -2.24450994
+     0.74155498     -3.19252992     -2.18549991
+     0.69982499     -3.47328997     -2.44373989
+     0.55497497     -3.47328997     -2.18549991
+     0.22187500     -3.47328997     -2.18549991
+    -0.11433500     -3.47328997     -2.18549991
+    -1.08296001     -0.94872999     -1.31738997
+    -2.29100990     -0.40674999     -1.10282004
+    -2.68670988      0.13206001     -1.46308994
+    -2.56175995     -0.02409000     -1.12419999
+    -1.81024003      0.51525998     -1.49312997
+    -2.31563997      0.38240999     -1.32519996
+    -2.14092994     -0.08792000     -1.18306994
+    -2.08593988      0.11853000     -1.21162999
+    -1.92235005      0.51665002     -1.46959996
+    -1.74345005     -0.18187000     -1.25643003
+    -1.69245994      0.22864000     -1.25077999
+    -0.05069500     -3.16059995     -2.18549991
+    -2.41872001     -0.21777000     -1.45767999
+    -1.13084996      0.20705000     -1.11091995
+    -1.33652997     -0.00411000     -1.23095000
+    -1.51839006      0.03957000     -1.40699005
+    -1.43289006      0.34586999     -1.35732996
+    -1.14111996      0.44898000     -1.29737997
+    -1.58747005      0.59200001     -1.55536997
+    -0.96284503      0.58112001     -1.55023003
+     0.14345500     -2.88506007     -2.18549991
+     0.12264500     -2.51003003     -2.04908991
+    -1.30315006      0.44650999     -1.60478997
+    -0.75457501      0.66930002     -1.79144001
+    -0.67889500      0.33432999     -1.82290995
+    -1.13927996     -0.34529001     -1.26585996
+    -1.15962005     -0.48302999     -1.41927004
+    -1.24046004     -0.17512000     -1.42437005
+    -1.05358005     -0.10495000     -1.29575002
+    -0.88697499      0.13079000     -1.29856002
+    -0.81370503      0.20081000     -1.57749999
+    -1.22812998      0.70827001     -1.86306000
+     0.05226500      0.92965001     -2.74542999
+    -1.38532996     -3.47328997     -1.70582998
+    -0.91400498     -3.47328997     -2.04658008
+     0.31943500      0.24473999     -2.15321994
+     0.64272499      0.22841001     -2.46340990
+     0.90222502     -0.10661000     -2.30064011
+    -1.88474000      0.55267000     -1.67981005
+    -2.25042009      0.41180000     -1.73877001
+    -2.48205996      0.24992999     -1.91031003
+    -2.56090999     -0.02519000     -1.80106997
+    -0.74711502      0.13149001     -1.85127997
+    -0.40810499     -3.47328997     -2.12305999
+    -0.93346500     -3.23520994     -1.77556002
+    -1.87274003      1.50734997     -3.62546992
+    -1.55833995      1.81095004     -3.71858001
+    -1.46557999      1.34193003     -2.28852010
+    -1.51622999      1.17537999     -1.85211003
+    -1.30034995      1.53682005     -2.71368003
+    -1.70895004      1.66551006     -3.30692005
+    -1.52084005      1.84717000     -2.92693996
+    -0.97581500      1.80748999     -3.18176007
+    -1.34402001      2.01793003     -3.35224009
+    -1.89066005      1.49003994     -2.91138005
+    -2.06715012      1.31959999     -3.30694008
+    -1.78708994      1.32312000     -2.39035010
+    -1.89925003      1.02716005     -2.00139999
+    -1.67462003      0.69683999     -1.95758998
+    -2.08275008      1.30454004     -2.50163007
+    -2.28699994      1.10729003     -2.07929993
+    -2.11108994      0.68230999     -2.04999995
+    -2.66230011      0.74488002     -2.11811996
+    -0.08459500     -2.27977991     -1.93928003
+    -2.44736004      0.95244002     -2.52533007
+    -2.78924990      0.62229002     -2.57120991
+    -2.25417995      1.13899004     -2.92438006
+    -2.60882998      0.79650998     -2.95742011
+    -2.66562009      0.10655000     -2.18499994
+    -0.67621499     -0.05872000     -1.86084998
+     0.36006501      0.57853001     -2.60903001
+    -0.10231500     -0.01135000     -2.02749991
+    -0.17234500     -2.05735993     -1.70271003
+    -0.37735501     -0.05177000     -2.02749991
+    -0.54540497      0.16392000     -2.16462994
+    -0.10760500      0.76270002     -2.37589002
+    -0.30284500      0.09154000     -2.21121001
+    -1.23538995      0.99708998     -2.10784006
+    -1.12407005      1.20396996     -2.48802996
+    -0.18495500      0.26561999     -2.45880008
+    -1.04226005      0.57672000     -2.15303993
+    -0.83804500      0.85632002     -2.38562989
+    -0.69323498      0.40011999     -2.09429002
+    -0.06030500     -2.41088009     -1.67437994
+    -0.07761500     -2.75363994     -1.74277997
+    -0.50071502      0.56497997     -2.42158008
+    -1.00566006      1.35599005     -2.89534998
+    -0.61676502      1.56887996     -3.01009011
+    -0.35231501      0.71590000     -2.75830007
+    -0.84348500      1.45727003     -3.34371996
+    -0.70935500      1.11032999     -2.75082994
+    -0.55799502      1.18015003     -3.26495004
+    -0.23560500      0.84781998     -3.15702009
+    -1.78123999      1.59571004     -4.06507015
+    -1.63988996      0.98939002     -4.37084007
+     0.49383500     -2.34659004     -2.34816003
+    -2.01151991      1.37333000     -4.39141989
+    -1.93745995      0.80008000     -4.69750023
+    -2.24798989      1.14497006     -4.21367979
+    -2.24798989      1.14497006     -3.72985005
+    -1.35091996     -0.73620999     -1.27900004
+    -1.15699005     -0.65947002     -1.42786002
+    -1.08296001     -0.94875002     -1.57749999
+     0.73461503     -2.16616011     -2.25168991
+     0.44763499     -1.94018996     -2.15614009
+    -1.61847997      0.28801000     -1.61330998
+    -1.37283003     -0.32611999     -1.36267996
+    -1.42548001     -0.60677999     -1.42026997
+    -1.66253996     -0.30406001     -1.45176995
+    -1.87812996     -0.56980002     -1.31322002
+    -2.17160010     -0.59970999     -1.44512999
+    -0.12932500     -0.26181999     -2.02749991
+     0.17405500     -0.12302000     -2.02749991
+     0.09069500     -0.45061001     -2.02749991
+     0.34382501     -0.34316000     -2.02749991
+     0.37709501     -2.48125005     -1.85994005
+     0.66305500     -2.45731997     -2.13175988
+     0.27424499     -2.06081009     -1.82792997
+     0.64951497     -2.15006995     -1.89222002
+     0.42092499     -2.71836996     -2.18549991
+     0.04477500      0.02574000     -2.36724997
+     0.62969500     -1.82587004     -2.01609993
+     0.44203499     -1.69326997     -1.86802995
+     0.46935499     -0.29010999     -2.34132004
+     0.42681500     -1.27415001     -1.89301002
+     0.35131499     -1.05737996     -1.86084998
+     0.45693499     -1.00741005     -1.97490001
+     0.66713500     -0.49865001     -2.08851004
+     0.91649503     -0.82925999     -1.92181003
+     0.70818502     -2.67360997     -2.18549991
+     0.54503500     -2.93022990     -2.18549991
+     0.52452499     -3.16238999     -2.50297999
+     0.81036502     -3.07099009     -2.54087996
+     0.69062501     -1.08858001     -1.77638996
+     0.47541499     -0.79929000     -1.89531004
+     1.17837000     -0.50397003     -2.10545993
+     0.45623499     -0.79483998     -2.22779012
+     0.38425499     -0.61818999     -2.02749991
+     0.27258500     -0.89455998     -2.02749991
+     0.91865498     -0.56410003     -2.55139995
+     0.67601502     -1.46349001     -1.99483001
+     1.06113005     -1.25217998     -2.01063991
+     1.00038004     -1.95571005     -2.10590005
+     1.10083997     -1.68156004     -1.83730996
+     1.41235006     -1.45974004     -2.19367003
+     1.17057002     -0.98372000     -2.37947011
+     1.32113004     -1.94060004     -2.50967002
+     0.13814500     -1.26618004     -1.80821002
+     0.27799499     -1.49512994     -2.02479005
+     0.19198500     -1.73559999     -2.07971001
+    -0.97700500     -1.56110001     -1.46588004
+    -1.14022005     -1.32813001     -1.45046997
+     1.20749998     -3.47328997     -2.89652991
+     1.35140002     -2.94687009     -2.65563011
+     1.02607000     -3.47328997     -2.50377989
+    -0.98911500     -1.12073004     -1.57749999
+    -0.84675503     -1.28722000     -1.57749999
+     0.07365500     -0.74000001     -2.02749991
+    -0.16244499     -0.55805999     -2.02749991
+    -1.62995994     -0.88786000     -1.39181995
+    -1.97134995     -0.96899003     -1.42044997
+    -1.55228996     -1.14794004     -1.30437005
+    -1.28181005     -1.03313994     -1.45946002
+    -0.76705498     -1.05624998     -1.79393005
+    -0.72412503     -1.24512005     -1.68991995
+    -0.08257500     -1.74170005     -1.69081998
+    -0.29405501     -1.39435995     -1.73062003
+    -0.06895500     -1.55366004     -1.57749999
+    -0.01829500     -1.56359994     -1.99498999
+    -0.19642501     -1.42139006     -1.86573005
+    -1.60575998     -1.91121995     -1.52739000
+    -0.19557500     -0.85429001     -2.02749991
+    -0.13295500     -1.27955997     -1.85519004
+    -0.37486500     -1.22519004     -1.87712002
+    -0.22258499     -1.10475004     -2.02749991
+    -1.44646001     -2.64488006     -1.52751005
+    -1.15854001     -2.57500005     -1.52981997
+    -0.50137502     -1.34270000     -1.72248995
+    -0.64415503     -1.43437004     -1.57749999
+    -0.37755501     -1.53462994     -1.57749999
+    -0.38187501     -1.84094000     -1.52040005
+    -0.65418500     -3.05922008     -1.49101996
+    -0.80691499     -2.67389989     -1.18795002
+    -1.17203999     -2.40646005     -1.22051001
+    -1.30843997     -1.83718002     -1.53293002
+    -0.80770499     -2.37649012     -1.20546997
+    -0.69374502     -1.79717004     -1.52564001
+    -0.35123500     -2.90495992     -1.54422998
+    -0.55256498     -2.54433990     -1.38654995
+    -0.27797499     -2.54600000     -1.59972000
+    -1.13872004     -1.70142996     -1.57843006
+    -1.00399995     -1.79691994     -1.52795005
+    -1.40882003     -2.96062994     -1.32931995
+    -1.10034001     -3.16340995     -1.40968001
+    -1.50089002     -1.71884000     -1.43583000
+    -1.36309004     -1.50334001     -1.70911002
+    -1.40726995     -1.45941997     -1.42290998
+    -1.68203998     -1.66754997     -1.26010001
+    -1.91709006     -1.08171999     -1.62434006
+    -1.83411002     -1.26757002     -1.46624994
+    -1.24371004     -2.68006992     -1.28871000
+    -0.94956499     -2.81829000     -1.35394001
+    -0.78730500     -2.82940006     -1.37027001
+
+CELLS 12936 64680
+4 68 69 26 17
+4 68 24 69 17
+4 70 19 20 18
+4 36 15 41 13
+4 39 104 40 42
+4 39 41 104 42
+4 1449 1238 1239 1451
+4 108 142 137 69
+4 331 203 187 186
+4 331 205 203 186
+4 331 234 205 186
+4 335 301 232 189
+4 1190 1187 1040 1232
+4 1190 1001 1040 1187
+4 1029 987 841 1028
+4 333 361 350 217
+4 480 505 651 481
+4 651 518 505 480
+4 518 505 676 651
+4 651 505 506 481
+4 651 505 677 506
+4 677 676 505 651
+4 359 481 505 480
+4 359 506 505 481
+4 505 677 513 676
+4 513 506 359 366
+4 506 513 505 677
+4 359 505 506 513
+4 507 506 513 366
+4 507 506 677 513
+4 481 359 333 480
+4 351 366 506 507
+4 351 359 350 506
+4 350 361 351 300
+4 351 359 361 350
+4 359 351 366 506
+4 366 351 361 300
+4 359 351 361 366
+4 350 359 481 506
+4 359 350 333 361
+4 333 359 481 350
+4 681 676 682 518
+4 681 843 844 682
+4 842 843 681 675
+4 681 843 842 844
+4 843 681 676 682
+4 676 843 675 681
+4 677 676 682 843
+4 682 676 651 518
+4 651 677 676 682
+4 351 300 323 350
+4 323 455 300 351
+4 323 300 301 215
+4 455 300 301 323
+4 217 323 215 361
+4 350 323 217 361
+4 300 323 350 361
+4 215 323 300 361
+4 837 675 843 842
+4 837 668 675 842
+4 455 300 335 301
+4 665 507 492 493
+4 679 677 515 665
+4 678 843 675 676
+4 837 675 840 843
+4 837 675 667 840
+4 837 675 668 667
+4 840 675 679 843
+4 840 675 667 679
+4 679 675 678 843
+4 679 675 633 678
+4 633 667 675 679
+4 667 675 668 633
+4 678 677 515 679
+4 513 677 678 676
+4 515 513 677 678
+4 677 678 843 679
+4 843 677 676 678
+4 507 515 677 665
+4 515 507 513 366
+4 513 677 507 515
+4 515 507 492 665
+4 515 507 366 492
+4 454 492 507 493
+4 351 335 455 300
+4 455 351 492 335
+4 455 351 454 492
+4 366 351 335 492
+4 366 351 300 335
+4 351 492 507 454
+4 507 351 366 492
+4 842 843 1029 844
+4 841 837 1029 842
+4 1029 987 837 841
+4 987 837 840 1029
+4 843 1029 837 842
+4 840 837 843 1029
+4 360 359 480 333
+4 360 361 359 333
+4 670 508 516 498
+4 681 675 670 842
+4 516 675 508 670
+4 516 681 675 670
+4 518 676 516 681
+4 518 504 368 516
+4 518 676 504 516
+4 505 360 359 480
+4 360 505 513 504
+4 359 360 505 513
+4 518 368 504 505
+4 480 368 518 505
+4 360 368 480 505
+4 504 368 360 505
+4 676 504 505 518
+4 505 504 676 513
+4 675 516 676 681
+4 678 508 676 675
+4 513 514 504 676
+4 678 514 513 676
+4 508 514 678 676
+4 504 514 508 676
+4 508 676 516 504
+4 508 676 675 516
+4 670 668 671 842
+4 670 675 668 842
+4 503 675 633 668
+4 514 508 509 363
+4 678 509 508 675
+4 509 678 508 514
+4 354 509 508 363
+4 508 503 509 354
+4 503 675 508 509
+4 633 675 509 678
+4 509 503 675 633
+4 508 503 670 675
+4 501 498 354 503
+4 670 498 501 503
+4 508 498 670 503
+4 354 498 508 503
+4 671 503 670 501
+4 670 503 668 675
+4 670 668 503 671
+4 364 504 513 514
+4 360 513 364 504
+4 362 360 513 364
+4 232 300 361 215
+4 361 232 366 300
+4 366 361 362 232
+4 362 513 360 361
+4 366 513 362 361
+4 359 513 366 361
+4 360 513 359 361
+4 232 300 335 366
+4 301 300 232 215
+4 232 300 301 335
+4 509 354 358 363
+4 840 806 987 992
+4 501 503 500 671
+4 460 503 509 633
+4 347 346 354 306
+4 500 347 346 503
+4 501 347 500 503
+4 354 347 501 503
+4 346 347 354 503
+4 306 460 354 358
+4 354 346 460 306
+4 346 460 503 354
+4 509 354 460 358
+4 460 503 354 509
+4 499 503 460 633
+4 499 503 346 460
+4 500 499 496 502
+4 500 499 346 496
+4 499 346 503 500
+4 671 499 500 502
+4 500 503 499 671
+4 499 502 666 496
+4 502 499 668 671
+4 666 668 499 667
+4 668 666 499 502
+4 668 499 503 671
+4 499 668 633 667
+4 499 668 503 633
+4 344 346 200 339
+4 347 344 346 306
+4 201 344 347 306
+4 200 344 201 306
+4 346 344 200 306
+4 344 346 500 347
+4 496 346 344 339
+4 496 346 500 344
+4 669 837 806 841
+4 669 842 837 841
+4 666 668 669 502
+4 667 666 668 837
+4 806 666 667 837
+4 669 666 806 837
+4 668 666 669 837
+4 669 668 671 502
+4 669 668 842 671
+4 669 668 837 842
+4 987 806 837 841
+4 837 840 806 987
+4 806 837 667 840
+4 1001 841 987 1028
+4 496 666 632 502
+4 632 497 666 496
+4 808 803 806 816
+4 635 666 632 497
+4 803 806 635 808
+4 635 803 666 806
+4 632 803 666 635
+4 632 666 669 502
+4 841 806 803 816
+4 669 806 803 841
+4 669 666 803 806
+4 803 666 669 632
+4 1001 987 841 816
+4 992 987 1001 816
+4 806 987 992 816
+4 841 987 806 816
+4 986 1001 1190 1028
+4 986 1001 1040 1190
+4 993 816 986 808
+4 986 1001 993 1040
+4 986 1001 816 993
+4 841 1001 986 1028
+4 986 816 803 808
+4 816 986 841 1001
+4 986 816 841 803
+4 475 642 643 472
+4 475 470 642 472
+4 645 642 814 643
+4 645 475 642 643
+4 804 667 633 679
+4 633 460 463 509
+4 642 494 641 666
+4 642 495 494 666
+4 634 475 494 641
+4 645 475 634 641
+4 642 475 645 641
+4 494 475 642 641
+4 462 494 634 475
+4 462 494 461 634
+4 495 336 470 469
+4 494 336 495 469
+4 462 336 494 469
+4 470 336 462 469
+4 462 469 475 470
+4 462 469 494 475
+4 495 642 494 469
+4 470 642 495 469
+4 475 642 470 469
+4 494 642 475 469
+4 336 494 461 462
+4 470 336 317 462
+4 337 336 470 495
+4 470 317 336 337
+4 495 336 338 337
+4 496 494 495 666
+4 336 494 346 461
+4 495 346 336 494
+4 338 495 346 336
+4 495 346 339 338
+4 496 495 346 339
+4 346 494 495 496
+4 634 641 804 645
+4 633 641 667 804
+4 633 634 641 804
+4 499 494 346 496
+4 499 666 494 496
+4 499 461 460 346
+4 499 494 461 346
+4 633 641 499 667
+4 463 461 633 634
+4 633 461 460 499
+4 463 461 460 633
+4 641 633 499 494
+4 634 633 641 494
+4 461 633 634 494
+4 499 633 461 494
+4 499 641 666 667
+4 499 641 494 666
+4 468 461 463 634
+4 468 462 461 634
+4 463 460 358 509
+4 315 460 306 358
+4 315 463 460 358
+4 346 312 306 200
+4 315 460 312 306
+4 460 463 315 312
+4 461 463 460 312
+4 313 463 461 312
+4 315 463 313 312
+4 346 312 460 306
+4 346 312 461 460
+4 463 313 468 315
+4 463 313 461 468
+4 462 461 313 468
+4 312 346 338 200
+4 336 312 346 338
+4 336 312 461 346
+4 461 336 313 312
+4 312 336 307 338
+4 313 336 307 312
+4 313 336 462 307
+4 313 336 461 462
+4 307 336 337 338
+4 307 336 317 337
+4 307 336 462 317
+4 338 346 339 200
+4 194 307 308 317
+4 194 337 307 317
+4 178 307 182 308
+4 178 194 307 308
+4 195 307 196 338
+4 110 196 180 182
+4 178 196 110 182
+4 307 196 178 182
+4 180 196 307 182
+4 196 180 195 110
+4 195 307 180 196
+4 195 312 338 200
+4 195 312 307 338
+4 312 307 180 195
+4 306 312 195 200
+4 306 312 180 195
+4 194 307 196 178
+4 196 337 307 194
+4 196 307 337 338
+4 308 307 462 317
+4 315 312 180 306
+4 314 307 462 308
+4 314 182 307 308
+4 314 313 468 462
+4 314 307 313 462
+4 314 180 307 182
+4 314 316 180 182
+4 313 180 315 312
+4 468 315 313 314
+4 316 315 468 314
+4 180 315 316 314
+4 313 315 180 314
+4 313 180 307 314
+4 307 313 312 180
+4 840 667 804 679
+4 806 641 667 666
+4 806 642 641 666
+4 804 641 807 645
+4 807 806 840 992
+4 840 804 667 806
+4 807 804 840 806
+4 641 804 807 806
+4 667 804 641 806
+4 814 806 807 992
+4 645 814 642 641
+4 807 814 645 641
+4 806 814 807 641
+4 642 814 806 641
+4 318 317 337 194
+4 644 642 472 643
+4 644 814 642 643
+4 635 642 806 666
+4 636 806 808 635
+4 636 642 806 635
+4 1193 991 1000 998
+4 1193 989 991 998
+4 994 1193 1039 993
+4 1193 1000 994 1039
+4 1188 1000 1193 1039
+4 1041 1000 1188 1039
+4 994 1000 1041 1039
+4 991 994 1193 1000
+4 993 994 1193 989
+4 809 994 993 989
+4 991 994 809 989
+4 1193 994 991 989
+4 810 991 994 809
+4 994 1000 849 1041
+4 994 849 991 810
+4 994 1000 991 849
+4 992 989 1193 998
+4 1193 1039 1187 1188
+4 1193 1001 993 989
+4 992 1001 1193 989
+4 816 1001 992 989
+4 993 1001 816 989
+4 1040 1039 1187 1001
+4 993 1039 1040 1001
+4 1193 1039 993 1001
+4 1187 1039 1193 1001
+4 809 811 640 810
+4 809 991 811 810
+4 808 989 809 993
+4 808 816 989 993
+4 811 989 998 991
+4 811 809 989 991
+4 636 811 644 640
+4 636 809 811 640
+4 992 814 805 989
+4 998 814 992 989
+4 811 814 998 989
+4 805 814 811 989
+4 806 805 992 814
+4 816 805 992 806
+4 816 805 989 992
+4 644 805 814 811
+4 814 642 805 644
+4 642 805 806 814
+4 811 805 636 644
+4 808 805 989 816
+4 808 809 989 805
+4 636 809 808 805
+4 811 809 636 805
+4 989 809 811 805
+4 636 805 642 644
+4 806 805 808 816
+4 636 805 806 642
+4 805 806 808 636
+4 636 644 474 640
+4 472 471 319 470
+4 472 642 471 470
+4 497 642 635 666
+4 474 472 473 319
+4 474 473 472 644
+4 636 473 474 644
+4 642 473 636 644
+4 472 473 642 644
+4 473 472 471 319
+4 473 472 642 471
+4 635 642 473 636
+4 497 642 473 635
+4 473 642 497 471
+4 495 471 642 470
+4 495 337 471 470
+4 340 495 337 471
+4 339 495 340 496
+4 340 495 338 337
+4 340 495 339 338
+4 497 495 340 471
+4 496 495 497 666
+4 497 495 496 340
+4 642 495 497 471
+4 642 495 666 497
+4 471 470 318 319
+4 318 337 470 471
+4 337 470 317 318
+4 1042 1000 1041 849
+4 1189 1041 1042 1000
+4 1189 1188 1041 1000
+4 1236 1041 1237 1189
+4 1236 1188 1041 1189
+4 1039 1187 1231 1040
+4 1039 1231 1187 1188
+4 1041 1231 1039 1188
+4 1236 1231 1041 1188
+4 1187 1231 1236 1188
+4 1231 1187 1232 1040
+4 1231 1187 1236 1232
+4 1231 1236 1446 1232
+4 1231 1236 1237 1446
+4 1237 1236 1231 1041
+4 1237 1236 1449 1446
+4 1237 1236 1238 1449
+4 1236 1237 1238 1189
+4 1237 1238 1239 1449
+4 1239 1237 1189 1238
+4 1042 1189 1237 1041
+4 1239 1189 1237 1042
+4 110 182 99 178
+4 345 354 347 501
+4 345 498 354 501
+4 172 232 215 301
+4 172 189 232 301
+4 211 306 358 315
+4 367 504 508 516
+4 367 368 504 516
+4 148 214 147 142
+4 234 349 233 367
+4 234 349 206 233
+4 230 348 204 228
+4 206 205 230 349
+4 234 205 206 349
+4 348 205 234 349
+4 230 205 348 349
+4 205 230 154 206
+4 204 230 205 348
+4 154 205 204 230
+4 331 348 205 234
+4 203 348 205 331
+4 204 348 203 228
+4 205 348 203 204
+4 213 348 203 331
+4 213 203 348 228
+4 151 203 228 204
+4 147 213 151 203
+4 151 219 213 147
+4 148 219 151 147
+4 214 219 148 147
+4 213 219 214 147
+4 228 213 151 219
+4 151 203 213 228
+4 368 349 234 367
+4 368 504 349 367
+4 368 348 331 234
+4 368 349 348 234
+4 364 348 349 230
+4 504 348 364 360
+4 504 348 349 364
+4 228 348 364 230
+4 228 348 360 364
+4 368 348 504 360
+4 504 349 348 368
+4 360 348 331 368
+4 360 348 213 331
+4 348 360 213 228
+4 228 360 362 364
+4 362 361 219 232
+4 362 219 361 360
+4 228 219 362 360
+4 213 219 228 360
+4 361 219 213 360
+4 219 361 214 232
+4 214 213 361 219
+4 480 360 331 368
+4 187 213 147 203
+4 187 331 213 203
+4 324 360 331 480
+4 324 333 360 480
+4 324 213 187 331
+4 324 360 213 331
+4 213 333 361 360
+4 213 324 333 360
+4 218 147 145 146
+4 218 145 147 214
+4 216 145 218 214
+4 142 145 216 214
+4 147 145 142 214
+4 213 147 218 146
+4 213 147 214 218
+4 218 361 217 216
+4 361 218 333 213
+4 217 361 218 333
+4 361 218 214 216
+4 214 361 213 218
+4 187 213 146 147
+4 188 213 333 218
+4 324 213 188 187
+4 188 333 213 324
+4 146 213 188 218
+4 188 187 213 146
+4 216 214 172 142
+4 215 361 216 217
+4 216 214 215 172
+4 216 215 214 361
+4 232 214 215 361
+4 215 172 214 232
+4 231 209 153 155
+4 365 508 504 514
+4 365 363 508 514
+4 231 209 229 153
+4 508 352 365 504
+4 508 367 352 504
+4 229 353 365 363
+4 365 231 352 353
+4 229 231 365 353
+4 209 231 229 353
+4 352 231 209 353
+4 508 365 353 363
+4 508 352 353 365
+4 353 352 233 209
+4 367 352 353 508
+4 353 352 367 233
+4 365 504 364 514
+4 206 352 209 233
+4 206 349 352 233
+4 365 349 230 364
+4 231 206 155 154
+4 209 206 231 352
+4 231 206 209 155
+4 230 206 231 154
+4 349 231 206 352
+4 230 206 349 231
+4 365 349 231 230
+4 365 349 352 231
+4 367 352 349 233
+4 349 504 352 367
+4 349 365 504 364
+4 504 349 352 365
+4 367 508 498 516
+4 111 127 128 62
+4 363 220 354 358
+4 363 227 220 358
+4 227 208 220 149
+4 227 152 208 149
+4 498 353 508 367
+4 498 343 353 367
+4 342 341 354 498
+4 342 341 220 354
+4 208 341 220 342
+4 498 342 341 353
+4 343 342 498 353
+4 208 342 343 353
+4 341 342 208 353
+4 363 341 354 220
+4 354 498 341 363
+4 508 498 354 363
+4 353 498 508 363
+4 341 498 353 363
+4 342 354 345 498
+4 342 354 220 345
+4 229 227 208 341
+4 363 227 229 341
+4 220 227 363 341
+4 208 227 220 341
+4 229 341 353 363
+4 353 208 341 229
+4 233 353 343 367
+4 152 208 229 227
+4 198 209 343 233
+4 343 198 208 207
+4 209 198 343 207
+4 130 198 209 207
+4 208 198 130 207
+4 353 343 209 233
+4 209 353 229 207
+4 343 353 209 207
+4 208 353 343 207
+4 229 353 208 207
+4 229 153 209 207
+4 152 153 229 207
+4 130 153 152 207
+4 209 153 130 207
+4 208 207 152 229
+4 208 207 130 152
+4 342 220 199 345
+4 127 208 130 152
+4 127 149 208 152
+4 199 208 149 220
+4 199 342 208 220
+4 197 208 128 199
+4 128 129 130 208
+4 197 129 128 208
+4 198 129 197 208
+4 130 129 198 208
+4 197 208 343 198
+4 342 208 197 199
+4 342 208 343 197
+4 127 208 128 130
+4 149 126 127 208
+4 199 126 149 208
+4 128 126 199 208
+4 127 126 128 208
+4 210 220 227 358
+4 210 220 149 227
+4 149 202 220 210
+4 149 202 199 220
+4 199 149 111 202
+4 199 111 149 126
+4 128 111 199 126
+4 127 111 128 126
+4 149 111 127 126
+4 202 220 345 199
+4 347 220 354 345
+4 347 202 220 345
+4 306 354 347 210
+4 358 354 306 210
+4 220 354 358 210
+4 347 354 220 210
+4 347 210 201 306
+4 210 347 202 220
+4 201 210 347 202
+4 211 210 227 358
+4 211 306 210 358
+4 149 150 86 176
+4 152 77 127 149
+4 150 77 152 149
+4 86 77 150 149
+4 127 77 86 149
+4 227 149 150 152
+4 211 150 149 176
+4 211 149 150 227
+4 136 176 150 211
+4 88 176 150 136
+4 150 86 88 77
+4 88 176 86 150
+4 111 86 62 44
+4 111 86 127 62
+4 86 127 149 111
+4 90 86 111 44
+4 111 176 86 90
+4 176 86 149 111
+4 112 176 111 90
+4 149 211 210 227
+4 210 176 202 201
+4 176 210 149 211
+4 210 176 149 202
+4 176 210 306 201
+4 306 210 176 211
+4 202 176 112 201
+4 111 176 202 149
+4 111 176 112 202
+4 156 214 232 219
+4 156 148 214 219
+4 108 137 142 172
+4 156 137 108 172
+4 214 137 156 172
+4 142 137 214 172
+4 148 214 137 156
+4 137 142 214 148
+4 189 172 156 108
+4 156 232 172 189
+4 156 214 172 232
+4 89 86 90 44
+4 184 101 102 104
+4 184 103 101 104
+4 177 176 201 112
+4 177 91 176 112
+4 181 101 98 102
+4 181 184 101 102
+4 97 181 101 98
+4 97 99 181 98
+4 181 110 182 99
+4 181 97 110 99
+4 109 180 110 195
+4 109 179 180 195
+4 183 100 103 136
+4 183 179 100 136
+4 180 181 110 182
+4 110 97 181 180
+4 109 97 110 180
+4 100 97 109 180
+4 181 97 100 180
+4 179 180 100 109
+4 181 180 316 182
+4 181 180 183 316
+4 180 183 100 181
+4 180 179 100 183
+4 184 181 183 316
+4 100 181 101 97
+4 184 183 181 101
+4 103 183 184 101
+4 100 183 103 101
+4 181 183 100 101
+4 177 179 109 195
+4 100 179 176 136
+4 177 109 179 176
+4 91 109 177 176
+4 100 109 91 176
+4 179 109 100 176
+4 183 180 315 316
+4 211 179 183 136
+4 211 176 179 136
+4 176 179 306 211
+4 177 306 200 201
+4 177 306 195 200
+4 177 306 179 195
+4 306 177 176 201
+4 176 306 179 177
+4 180 179 306 195
+4 183 315 180 179
+4 211 315 183 179
+4 306 315 211 179
+4 180 315 306 179
+4 43 100 97 109
+4 43 91 100 109
+4 90 176 91 112
+4 176 89 86 90
+4 176 91 89 90
+4 103 100 67 136
+4 43 101 35 97
+4 43 100 101 97
+4 67 37 38 87
+4 67 104 38 37
+4 103 104 67 37
+4 101 104 103 37
+4 38 104 101 37
+4 100 37 67 87
+4 103 37 100 101
+4 100 37 103 67
+4 43 37 101 100
+4 35 34 38 101
+4 43 34 35 101
+4 37 34 43 101
+4 38 34 37 101
+4 34 37 87 38
+4 87 37 43 100
+4 87 37 34 43
+4 102 38 41 104
+4 102 101 38 104
+4 35 101 98 97
+4 14 38 35 34
+4 38 102 35 101
+4 35 36 102 38
+4 14 36 35 38
+4 41 36 14 38
+4 102 36 41 38
+4 98 102 35 36
+4 35 101 102 98
+4 43 87 89 34
+4 88 176 87 86
+4 136 88 176 100
+4 67 88 136 100
+4 87 88 67 100
+4 176 88 87 100
+4 87 176 89 86
+4 89 91 176 87
+4 43 91 89 87
+4 100 91 43 87
+4 176 91 100 87
+4 40 38 67 104
+4 40 39 38 104
+4 27 38 40 39
+4 27 28 38 39
+4 27 67 29 40
+4 27 38 67 40
+4 133 154 125 80
+4 133 81 154 80
+4 133 157 83 82
+4 157 209 198 233
+4 157 206 209 233
+4 155 133 81 154
+4 155 206 133 154
+4 133 209 157 206
+4 133 155 209 206
+4 134 157 135 83
+4 134 133 157 83
+4 132 153 134 79
+4 132 78 153 79
+4 132 129 65 66
+4 78 130 132 153
+4 78 152 130 153
+4 78 127 130 152
+4 78 77 127 152
+4 61 127 64 78
+4 61 77 127 78
+4 60 127 63 64
+4 60 61 127 64
+4 60 62 16 63
+4 60 127 62 63
+4 77 60 30 61
+4 77 127 60 61
+4 86 60 77 127
+4 86 62 60 127
+4 86 30 88 77
+4 86 60 30 77
+4 29 87 88 67
+4 29 27 87 67
+4 31 87 29 27
+4 31 32 87 27
+4 31 89 87 32
+4 31 33 89 32
+4 30 86 31 60
+4 30 31 86 88
+4 29 31 30 88
+4 87 31 29 88
+4 86 31 87 88
+4 31 86 33 60
+4 86 31 89 87
+4 31 86 89 33
+4 44 86 33 89
+4 33 60 86 44
+4 16 60 33 44
+4 62 60 16 44
+4 86 60 62 44
+4 32 87 34 89
+4 87 27 38 67
+4 32 28 34 87
+4 27 28 32 87
+4 38 28 27 87
+4 34 28 38 87
+4 64 130 132 78
+4 64 127 130 78
+4 128 127 63 62
+4 130 64 128 127
+4 130 65 128 64
+4 128 130 129 65
+4 64 128 63 65
+4 64 128 127 63
+4 65 130 132 64
+4 132 129 130 65
+4 209 132 130 153
+4 209 134 132 153
+4 135 131 132 66
+4 157 209 131 198
+4 134 135 157 209
+4 132 135 134 209
+4 131 135 132 209
+4 157 135 131 209
+4 129 132 131 66
+4 129 131 132 130
+4 198 131 129 130
+4 209 131 198 130
+4 132 131 209 130
+4 134 153 81 79
+4 209 134 133 157
+4 153 155 209 134
+4 81 155 153 134
+4 133 155 81 134
+4 209 155 133 134
+4 165 206 157 233
+4 165 234 206 233
+4 206 125 133 154
+4 206 205 125 154
+4 205 158 125 122
+4 234 165 206 205
+4 158 165 234 205
+4 125 165 158 205
+4 206 165 125 205
+4 186 205 158 234
+4 158 122 205 186
+4 158 125 124 165
+4 105 122 158 186
+4 158 125 84 124
+4 125 158 105 122
+4 125 158 84 105
+4 157 133 124 82
+4 157 124 133 206
+4 165 124 157 206
+4 125 124 165 206
+4 133 124 125 206
+4 84 124 133 82
+4 125 124 133 84
+4 125 154 123 80
+4 123 205 204 154
+4 123 125 205 154
+4 75 68 24 69
+4 75 142 68 69
+4 68 74 71 142
+4 68 75 74 142
+4 23 75 68 24
+4 23 25 75 24
+4 22 74 73 71
+4 22 68 74 71
+4 23 74 22 68
+4 23 75 74 68
+4 74 25 76 75
+4 74 23 25 75
+4 21 74 73 22
+4 21 23 74 22
+4 74 46 25 23
+4 74 21 46 23
+4 76 46 48 25
+4 76 74 46 25
+4 107 113 45 106
+4 46 73 47 21
+4 113 72 45 114
+4 45 72 47 46
+4 47 107 119 72
+4 45 107 47 72
+4 113 107 45 72
+4 119 107 113 72
+4 73 47 72 46
+4 119 72 73 47
+4 73 46 74 21
+4 72 46 74 73
+4 72 46 76 74
+4 48 46 76 114
+4 45 46 48 114
+4 72 46 45 114
+4 76 46 72 114
+4 107 113 186 119
+4 186 106 113 107
+4 137 142 75 69
+4 119 203 113 186
+4 119 187 203 186
+4 145 74 142 71
+4 145 73 74 71
+4 119 147 203 187
+4 119 146 147 187
+4 147 74 142 145
+4 148 74 142 147
+4 142 148 75 74
+4 75 142 137 148
+4 148 74 76 75
+4 148 74 147 76
+4 72 147 74 76
+4 73 147 119 146
+4 72 147 73 74
+4 73 147 72 119
+4 145 147 73 146
+4 145 147 74 73
+4 151 147 76 148
+4 119 147 72 113
+4 203 147 119 113
+4 114 147 203 113
+4 72 147 114 113
+4 151 114 147 203
+4 147 76 114 151
+4 114 147 72 76
+4 120 114 48 76
+4 120 151 114 76
+4 49 114 45 48
+4 49 120 114 48
+4 120 203 114 151
+4 120 204 203 151
+4 49 113 50 45
+4 49 114 113 45
+4 203 122 113 186
+4 203 205 122 186
+4 204 121 123 120
+4 125 121 205 122
+4 205 123 121 125
+4 204 121 205 123
+4 203 121 204 120
+4 205 121 203 122
+4 203 121 205 204
+4 123 121 49 120
+4 50 121 125 122
+4 123 121 50 49
+4 50 125 121 123
+4 113 121 49 50
+4 49 120 121 113
+4 114 120 49 113
+4 203 120 114 113
+4 121 120 203 113
+4 122 121 113 50
+4 113 121 122 203
+4 50 113 106 45
+4 105 122 50 125
+4 106 105 186 113
+4 50 105 106 113
+4 122 105 50 113
+4 186 105 122 113
+4 41 38 39 104
+4 28 38 14 34
+4 39 38 14 28
+4 39 38 41 14
+4 20 71 68 22
+4 173 172 301 189
+4 173 108 172 189
+4 303 301 323 455
+4 85 172 144 173
+4 85 108 172 173
+4 85 142 172 108
+4 85 69 142 108
+4 142 144 85 172
+4 142 216 144 172
+4 85 68 142 69
+4 85 26 68 69
+4 71 68 70 20
+4 70 142 68 71
+4 142 68 85 70
+4 26 70 68 20
+4 68 85 70 26
+4 143 142 70 71
+4 144 142 70 143
+4 144 142 85 70
+4 143 142 216 144
+4 145 142 143 71
+4 216 142 143 145
+4 174 172 301 173
+4 174 144 172 173
+4 185 172 174 144
+4 185 216 172 144
+4 185 301 303 174
+4 301 185 323 215
+4 185 301 323 303
+4 301 185 172 174
+4 172 301 215 185
+4 185 215 217 323
+4 185 215 216 217
+4 185 215 172 216
+4 815 807 814 645
+4 815 804 807 645
+4 1129 969 931 942
+4 1129 1146 969 942
+4 1134 1347 1334 1335
+4 1650 1898 1651 1649
+4 1410 1637 1418 1414
+4 1410 1450 1637 1414
+4 1015 1186 985 1018
+4 1015 1210 1186 1018
+4 1142 1143 940 1043
+4 1647 1898 1651 1650
+4 1647 1898 1648 1651
+4 1419 1407 1210 1420
+4 1419 1421 1407 1420
+4 804 807 990 815
+4 779 965 947 955
+4 402 437 563 400
+4 741 920 754 921
+4 581 605 754 741
+4 581 742 748 754
+4 748 573 742 581
+4 574 573 748 581
+4 567 573 574 581
+4 742 573 567 581
+4 742 581 605 754
+4 605 742 567 581
+4 568 567 605 743
+4 573 567 568 743
+4 742 567 573 743
+4 605 567 742 743
+4 573 742 747 748
+4 747 743 742 573
+4 743 742 924 747
+4 747 742 754 748
+4 747 742 924 754
+4 920 754 742 733
+4 741 754 920 733
+4 605 754 741 733
+4 742 754 605 733
+4 782 742 733 920
+4 733 605 742 782
+4 924 742 920 754
+4 920 782 742 924
+4 743 742 782 924
+4 743 742 605 782
+4 782 605 606 733
+4 608 606 782 743
+4 568 606 608 743
+4 605 606 568 743
+4 782 606 605 743
+4 581 567 413 574
+4 565 567 403 413
+4 565 581 567 413
+4 565 439 402 403
+4 565 567 439 403
+4 565 558 566 402
+4 565 439 558 402
+4 605 565 741 581
+4 605 567 565 581
+4 733 565 558 566
+4 606 558 733 605
+4 439 558 606 605
+4 565 558 439 605
+4 733 558 565 605
+4 565 733 741 566
+4 565 733 605 741
+4 439 605 567 565
+4 439 605 568 567
+4 568 605 439 606
+4 744 743 608 782
+4 744 924 743 782
+4 568 744 743 608
+4 568 652 744 608
+4 654 744 568 652
+4 654 745 744 652
+4 654 743 573 568
+4 747 663 745 743
+4 573 663 747 743
+4 654 663 573 743
+4 745 663 654 743
+4 654 743 744 745
+4 568 743 744 654
+4 745 743 924 747
+4 745 743 744 924
+4 740 920 741 921
+4 740 913 920 921
+4 566 437 563 402
+4 566 558 437 402
+4 606 782 616 608
+4 740 733 566 741
+4 740 920 733 741
+4 913 776 960 957
+4 604 558 559 437
+4 604 566 558 437
+4 733 604 740 566
+4 733 558 604 566
+4 604 781 776 619
+4 920 781 733 782
+4 920 960 781 782
+4 920 913 740 775
+4 960 913 920 775
+4 776 913 960 775
+4 740 913 776 775
+4 960 775 781 776
+4 781 775 960 920
+4 740 604 733 775
+4 776 604 740 775
+4 781 604 776 775
+4 733 604 781 775
+4 733 775 920 740
+4 733 775 781 920
+4 781 606 733 782
+4 781 616 606 782
+4 606 603 559 616
+4 606 559 603 733
+4 558 559 606 733
+4 604 559 558 733
+4 603 559 604 733
+4 733 603 781 604
+4 781 603 606 616
+4 781 603 733 606
+4 559 619 616 603
+4 604 619 559 603
+4 781 619 604 603
+4 616 619 781 603
+4 563 566 604 437
+4 566 604 588 563
+4 588 740 604 566
+4 740 604 759 588
+4 759 740 776 604
+4 759 913 776 740
+4 936 913 957 774
+4 759 913 936 774
+4 776 913 759 774
+4 957 913 776 774
+4 958 960 776 957
+4 789 744 924 745
+4 789 652 744 745
+4 608 744 762 652
+4 608 780 762 744
+4 608 782 780 744
+4 781 966 783 782
+4 781 960 966 782
+4 786 966 781 960
+4 786 788 781 966
+4 787 788 786 966
+4 783 788 787 966
+4 781 788 783 966
+4 786 966 947 787
+4 966 786 958 960
+4 947 966 786 958
+4 780 783 966 782
+4 966 787 965 947
+4 965 966 780 785
+4 787 966 965 785
+4 783 966 787 785
+4 780 966 783 785
+4 779 965 787 947
+4 787 785 965 779
+4 619 781 786 788
+4 776 781 786 619
+4 786 960 776 958
+4 786 960 781 776
+4 788 781 616 619
+4 762 780 783 785
+4 783 781 616 788
+4 783 608 780 762
+4 616 783 782 781
+4 783 608 782 780
+4 783 616 782 608
+4 762 744 789 652
+4 966 780 943 965
+4 961 780 789 943
+4 961 789 780 782
+4 924 789 961 782
+4 744 789 924 782
+4 780 789 744 782
+4 966 780 961 943
+4 961 782 780 966
+4 960 782 961 966
+4 961 782 920 924
+4 960 782 920 961
+4 943 780 785 965
+4 943 780 762 785
+4 780 789 762 744
+4 780 762 789 943
+4 618 616 559 619
+4 618 788 616 619
+4 294 444 295 290
+4 294 423 444 290
+4 298 444 449 295
+4 298 294 444 295
+4 483 568 652 654
+4 483 484 568 654
+4 482 568 608 652
+4 482 483 568 652
+4 449 447 444 298
+4 449 450 447 298
+4 447 618 448 450
+4 447 449 618 450
+4 608 440 606 568
+4 608 482 440 568
+4 607 448 447 618
+4 607 616 448 618
+4 606 607 608 616
+4 482 607 440 447
+4 608 440 607 606
+4 440 607 482 608
+4 448 607 606 616
+4 440 607 448 447
+4 448 607 440 606
+4 607 447 449 618
+4 444 447 607 482
+4 607 447 444 449
+4 444 447 294 298
+4 483 482 334 423
+4 484 483 568 440
+4 334 483 484 440
+4 482 483 334 440
+4 568 483 482 440
+4 447 482 334 440
+4 294 334 447 444
+4 423 334 294 444
+4 482 334 423 444
+4 447 334 482 444
+4 293 447 298 294
+4 293 334 447 294
+4 297 447 450 298
+4 297 293 447 298
+4 404 447 293 334
+4 297 438 286 285
+4 286 293 404 438
+4 297 293 286 438
+4 447 293 297 438
+4 404 293 447 438
+4 395 438 297 285
+4 297 395 450 447
+4 438 395 297 447
+4 448 395 438 447
+4 450 395 448 447
+4 568 440 404 484
+4 438 440 606 448
+4 568 439 404 440
+4 606 439 568 440
+4 438 439 606 440
+4 404 439 438 440
+4 404 440 334 484
+4 440 438 447 448
+4 404 440 447 334
+4 440 447 438 404
+4 400 438 395 285
+4 606 438 558 439
+4 395 437 438 400
+4 559 448 606 616
+4 437 395 438 558
+4 559 395 437 558
+4 448 395 559 558
+4 438 395 448 558
+4 558 448 606 559
+4 558 448 438 606
+4 559 448 450 395
+4 618 448 559 616
+4 559 448 618 450
+4 573 568 484 654
+4 484 567 568 573
+4 567 568 404 484
+4 404 567 439 568
+4 404 403 439 567
+4 286 439 438 404
+4 286 403 439 404
+4 402 286 260 403
+4 402 439 286 403
+4 286 402 438 439
+4 402 284 258 260
+4 284 285 438 402
+4 258 285 284 402
+4 400 285 258 402
+4 438 285 400 402
+4 284 402 286 260
+4 286 438 284 285
+4 284 402 438 286
+4 402 438 437 400
+4 402 438 558 437
+4 558 439 438 402
+4 589 482 652 483
+4 589 423 482 483
+4 589 608 762 652
+4 589 482 608 652
+4 607 612 616 618
+4 607 449 612 618
+4 783 607 612 616
+4 783 608 607 616
+4 449 612 444 607
+4 449 444 446 295
+4 446 612 444 449
+4 612 444 445 446
+4 446 444 290 295
+4 446 444 445 290
+4 445 444 423 290
+4 445 444 482 423
+4 444 482 612 445
+4 482 612 607 444
+4 445 482 589 423
+4 589 612 482 445
+4 589 609 612 445
+4 762 609 783 608
+4 589 609 762 608
+4 612 609 589 608
+4 783 609 612 608
+4 608 612 482 589
+4 612 608 607 783
+4 607 612 482 608
+4 617 612 446 449
+4 617 618 612 449
+4 451 609 620 611
+4 451 612 446 617
+4 451 612 445 446
+4 612 445 609 451
+4 620 451 612 609
+4 451 612 617 620
+4 783 620 609 611
+4 783 612 609 620
+4 788 612 616 783
+4 788 612 618 616
+4 617 612 618 788
+4 620 612 788 783
+4 617 612 788 620
+4 787 783 620 788
+4 609 783 785 762
+4 785 611 783 609
+4 779 787 785 611
+4 620 787 779 611
+4 783 787 620 611
+4 785 787 783 611
+4 424 445 423 290
+4 778 965 779 955
+4 778 953 965 955
+4 778 785 611 779
+4 778 965 785 779
+4 965 777 944 953
+4 965 778 777 953
+4 609 589 590 445
+4 822 652 789 745
+4 653 789 819 822
+4 653 652 789 822
+4 766 762 653 591
+4 766 610 762 591
+4 766 785 762 610
+4 766 777 785 610
+4 943 785 944 965
+4 819 943 766 944
+4 819 766 943 789
+4 653 766 819 789
+4 762 766 653 789
+4 943 766 762 789
+4 766 943 785 944
+4 762 943 785 766
+4 777 785 944 766
+4 944 965 785 777
+4 762 653 652 789
+4 609 610 762 785
+4 652 762 591 653
+4 762 591 589 652
+4 609 590 589 762
+4 610 590 609 762
+4 591 590 610 762
+4 589 590 591 762
+4 611 785 610 609
+4 778 777 785 965
+4 777 785 611 778
+4 777 785 610 611
+4 424 589 423 445
+4 424 590 589 445
+4 745 654 680 822
+4 652 654 745 822
+4 653 654 652 822
+4 680 654 653 822
+4 680 745 663 654
+4 821 745 680 822
+4 680 745 821 663
+4 654 653 517 680
+4 652 517 589 483
+4 517 652 591 653
+4 591 589 652 517
+4 517 652 654 483
+4 654 653 652 517
+4 424 425 589 590
+4 479 425 424 590
+4 591 425 479 590
+4 589 425 591 590
+4 517 591 425 479
+4 425 589 591 517
+4 425 589 423 424
+4 483 589 425 517
+4 425 589 483 423
+4 926 747 754 748
+4 1123 957 1134 936
+4 1123 913 957 936
+4 969 967 848 1032
+4 953 964 955 1157
+4 953 1151 964 1157
+4 925 1128 969 931
+4 833 822 745 821
+4 833 1006 822 821
+4 958 959 960 957
+4 833 847 822 1006
+4 833 848 847 1006
+4 1151 965 943 944
+4 1151 953 965 944
+4 1168 962 968 1150
+4 1168 1151 962 1150
+4 960 963 959 958
+4 960 966 963 958
+4 961 962 966 943
+4 1167 961 1127 1128
+4 960 1167 966 961
+4 960 1167 963 966
+4 1167 963 959 960
+4 1127 1167 960 961
+4 1127 1167 959 960
+4 968 961 1167 1128
+4 966 1167 962 961
+4 966 1167 1168 962
+4 963 1167 1168 966
+4 962 1167 968 961
+4 1167 962 968 1168
+4 947 963 966 958
+4 1151 965 962 943
+4 1168 965 1151 964
+4 1168 965 962 1151
+4 966 962 965 943
+4 965 1168 966 964
+4 965 1168 962 966
+4 966 964 947 965
+4 964 966 963 1168
+4 966 964 963 947
+4 955 964 965 947
+4 953 965 964 1151
+4 965 953 964 955
+4 847 789 822 819
+4 833 789 745 822
+4 833 847 789 822
+4 925 922 833 848
+4 925 922 789 833
+4 922 789 923 925
+4 847 848 833 789
+4 967 848 847 789
+4 922 848 967 789
+4 833 848 922 789
+4 789 922 968 967
+4 968 923 922 789
+4 969 922 925 848
+4 969 1128 925 922
+4 968 1128 969 922
+4 923 1128 968 922
+4 925 1128 923 922
+4 967 922 969 848
+4 967 922 968 969
+4 961 923 968 789
+4 1128 923 968 961
+4 925 789 745 833
+4 924 925 789 745
+4 789 924 961 923
+4 925 924 789 923
+4 1128 924 925 923
+4 961 924 1128 923
+4 968 962 967 1150
+4 789 962 819 847
+4 789 962 943 819
+4 943 962 789 961
+4 968 789 962 961
+4 962 967 789 968
+4 967 962 789 847
+4 1150 962 945 1151
+4 945 962 847 819
+4 967 962 945 1150
+4 945 962 967 847
+4 945 944 1151 962
+4 819 944 945 962
+4 943 944 819 962
+4 1151 944 943 962
+4 926 1128 925 931
+4 926 930 1128 931
+4 833 745 663 821
+4 833 745 747 663
+4 925 745 747 833
+4 747 925 924 745
+4 930 920 921 754
+4 921 1127 920 930
+4 1127 920 960 921
+4 920 1127 960 961
+4 920 930 924 754
+4 920 924 930 1127
+4 961 924 920 1127
+4 1128 924 961 1127
+4 930 924 1128 1127
+4 926 924 930 754
+4 926 924 1128 930
+4 924 1128 925 926
+4 924 926 747 754
+4 747 924 925 926
+4 913 960 920 921
+4 1123 1127 921 930
+4 957 1123 960 913
+4 960 959 1123 957
+4 960 959 1127 1123
+4 921 960 1123 913
+4 1123 1127 960 921
+4 1152 964 1157 955
+4 1152 947 964 955
+4 1153 964 1152 947
+4 1153 963 964 947
+4 1153 958 963 947
+4 1396 1167 1346 1171
+4 1396 1168 1167 1171
+4 1381 1166 1153 1172
+4 1381 1396 1166 1172
+4 1168 1166 1396 1167
+4 1168 963 1166 1167
+4 1166 1165 1168 1396
+4 1166 1381 1165 1396
+4 964 1165 1153 1152
+4 964 963 1153 1165
+4 1168 963 964 1165
+4 1166 963 1168 1165
+4 1153 963 1166 1165
+4 1153 1165 1381 1152
+4 1153 1165 1166 1381
+4 1346 1166 1396 1172
+4 1346 1166 1167 1396
+4 1396 1165 1379 1381
+4 1151 1165 1168 964
+4 1379 1168 1378 1150
+4 1379 1168 1396 1378
+4 1379 1396 1168 1165
+4 1151 1168 1379 1150
+4 1151 1168 1165 1379
+4 1171 1168 1378 1396
+4 1378 1150 1168 1171
+4 1381 1380 1152 1165
+4 1379 1380 1381 1165
+4 1157 1380 1379 1165
+4 1152 1380 1157 1165
+4 1151 1165 1157 1379
+4 1157 1165 964 1152
+4 1151 1165 964 1157
+4 1171 1150 1169 1378
+4 1169 968 967 1150
+4 1169 1171 968 1150
+4 1032 1146 969 967
+4 1169 1146 1032 967
+4 968 1146 1169 967
+4 969 1146 968 967
+4 1146 968 1171 969
+4 1169 968 1171 1146
+4 1171 969 1128 1146
+4 1128 1171 968 969
+4 968 1171 1168 1150
+4 968 1171 1167 1168
+4 1167 968 1128 1171
+4 958 1166 1153 963
+4 958 959 1166 963
+4 958 1166 1131 1153
+4 1131 1130 1134 1347
+4 1134 1130 957 1123
+4 1131 1130 957 1134
+4 1134 1130 1334 1347
+4 1134 1130 1123 1334
+4 957 1130 959 1123
+4 1131 957 1130 1166
+4 958 957 1131 1166
+4 959 957 958 1166
+4 1130 957 959 1166
+4 1346 1130 1347 1334
+4 1131 1166 1172 1153
+4 1346 1347 1130 1166
+4 1172 1347 1346 1166
+4 1131 1347 1172 1166
+4 1130 1347 1131 1166
+4 1167 1166 959 963
+4 959 1130 1127 1123
+4 1127 1167 1346 1130
+4 959 1167 1127 1130
+4 1166 1167 959 1130
+4 1346 1167 1166 1130
+4 1127 1130 1334 1123
+4 1127 1130 1346 1334
+4 1171 1128 1129 1146
+4 1129 1127 1346 1334
+4 1129 1346 1127 1128
+4 1171 1346 1129 1128
+4 1167 1346 1171 1128
+4 1127 1346 1167 1128
+4 1123 1127 1129 1334
+4 930 1127 1129 1123
+4 930 1127 1128 1129
+4 1129 1128 969 1146
+4 931 1128 1129 930
+4 1129 969 1128 931
+4 839 822 1006 821
+4 839 680 822 821
+4 1379 1157 1160 1380
+4 973 1151 953 1157
+4 973 1147 1151 1157
+4 844 822 839 680
+4 844 817 822 680
+4 946 1151 944 953
+4 946 973 1151 953
+4 1202 1201 1409 1419
+4 1191 1201 1192 1409
+4 1191 1202 1201 1409
+4 822 1002 847 819
+4 1198 1005 1029 1191
+4 1198 1029 1005 1007
+4 1006 1029 1198 1007
+4 834 1029 1006 1007
+4 1005 1029 834 1007
+4 839 834 1029 1006
+4 1029 834 844 1005
+4 1029 834 839 844
+4 1005 1198 1008 1191
+4 1002 1007 1005 834
+4 1008 1005 1002 1004
+4 1198 1005 1008 1004
+4 1007 1005 1198 1004
+4 1002 1005 1007 1004
+4 839 834 822 844
+4 1006 834 822 839
+4 1006 822 834 1007
+4 847 822 1006 1007
+4 1002 822 847 1007
+4 834 822 1002 1007
+4 1002 1008 1197 1020
+4 1007 1197 1002 1004
+4 1198 1197 1007 1004
+4 1008 1197 1198 1004
+4 1002 1197 1008 1004
+4 1197 1008 1201 1020
+4 1202 1191 1201 1197
+4 1198 1191 1202 1197
+4 1008 1191 1198 1197
+4 1201 1191 1008 1197
+4 1020 1002 829 830
+4 829 1002 1008 1005
+4 829 1008 1002 1020
+4 829 1002 820 830
+4 820 1005 1002 829
+4 820 1002 818 830
+4 1002 820 834 1005
+4 1002 820 817 834
+4 817 1002 818 820
+4 820 834 844 817
+4 820 834 1005 844
+4 822 834 817 844
+4 817 1002 819 818
+4 1002 817 822 834
+4 817 1002 822 819
+4 1012 1008 829 1020
+4 1012 1201 1008 1020
+4 835 1005 844 820
+4 835 829 1005 820
+4 1012 1191 1008 1201
+4 1012 1192 1191 1201
+4 988 1012 990 1192
+4 988 1191 1012 1192
+4 988 836 840 990
+4 988 1012 836 990
+4 1029 836 843 840
+4 1029 988 836 840
+4 1012 1005 988 836
+4 1012 1005 1191 988
+4 1008 1012 1005 1191
+4 829 1005 1012 836
+4 829 1005 1008 1012
+4 1029 1005 988 1191
+4 988 836 1005 1029
+4 836 1005 835 829
+4 844 1029 1005 835
+4 843 1029 844 835
+4 836 1029 843 835
+4 1005 1029 836 835
+4 1201 1202 1212 1419
+4 1212 1201 1197 1202
+4 1020 1197 1212 1201
+4 1003 1002 847 1007
+4 1003 1197 1002 1007
+4 945 1002 819 847
+4 945 1003 1002 847
+4 945 818 944 819
+4 945 1002 818 819
+4 1020 1178 1019 1212
+4 1020 1197 1178 1212
+4 830 979 1002 818
+4 830 946 979 818
+4 1019 979 830 946
+4 1019 1022 979 946
+4 1178 979 1019 1022
+4 1178 1003 979 1022
+4 1002 1019 979 830
+4 979 1002 1178 1019
+4 1178 1002 1003 1197
+4 1003 979 1002 1178
+4 1019 1002 1020 830
+4 1020 1178 1002 1019
+4 1178 1002 1197 1020
+4 946 944 1022 979
+4 818 944 946 979
+4 945 944 818 979
+4 1022 944 945 979
+4 944 1022 1151 946
+4 1151 1022 944 945
+4 945 979 1003 1022
+4 1002 979 945 818
+4 1003 1002 979 945
+4 1019 1178 1179 1212
+4 1019 1178 1023 1179
+4 1023 1019 1022 1178
+4 946 1022 973 1019
+4 973 1151 1022 946
+4 1151 1022 1147 973
+4 973 1022 1023 1019
+4 1023 1147 1022 973
+4 769 944 777 953
+4 769 946 944 953
+4 653 817 680 822
+4 653 819 817 822
+4 649 591 479 590
+4 517 649 591 479
+4 517 651 649 479
+4 682 817 820 844
+4 682 680 817 844
+4 682 649 517 651
+4 682 820 649 651
+4 682 653 817 680
+4 682 517 653 680
+4 649 682 648 820
+4 653 517 682 648
+4 591 517 653 648
+4 649 517 591 648
+4 682 517 649 648
+4 648 682 817 820
+4 817 648 653 682
+4 677 820 682 651
+4 677 682 820 835
+4 843 682 677 835
+4 844 682 843 835
+4 820 682 844 835
+4 610 591 649 590
+4 766 818 819 944
+4 766 767 818 944
+4 653 818 817 819
+4 653 766 818 819
+4 649 648 767 820
+4 766 648 591 653
+4 591 767 648 766
+4 649 648 591 767
+4 818 648 817 820
+4 653 648 818 766
+4 648 818 817 653
+4 767 648 818 820
+4 818 766 648 767
+4 610 591 767 649
+4 777 767 766 944
+4 766 767 610 591
+4 767 766 610 777
+4 769 944 767 777
+4 769 818 820 767
+4 769 818 830 820
+4 769 818 946 830
+4 818 769 944 767
+4 944 818 946 769
+4 1160 1147 973 1157
+4 973 1147 1155 1023
+4 973 1155 1147 1160
+4 1379 1147 1160 1157
+4 1379 1151 1147 1157
+4 1161 1147 1155 1160
+4 1161 1379 1147 1160
+4 1198 1007 1031 1006
+4 1220 1179 1407 1213
+4 1219 1199 1026 1221
+4 1219 1417 1199 1221
+4 1421 1212 1416 1419
+4 1421 1407 1212 1419
+4 1219 1199 1196 1026
+4 1407 1421 1212 1211
+4 1220 1421 1407 1211
+4 1416 1421 1220 1211
+4 1212 1421 1416 1211
+4 1212 1407 1211 1178
+4 1179 1407 1212 1178
+4 1220 1407 1179 1178
+4 1211 1407 1220 1178
+4 1196 1220 1211 1416
+4 1178 1211 1196 1220
+4 1220 1416 1417 1421
+4 1219 1220 1196 1199
+4 1417 1220 1219 1199
+4 1416 1220 1417 1199
+4 1196 1220 1416 1199
+4 1416 1212 1202 1419
+4 1007 1196 1199 1026
+4 1007 1003 1196 1026
+4 1416 1197 1199 1198
+4 1416 1197 1196 1199
+4 1197 1196 1211 1416
+4 1007 1199 1197 1198
+4 1007 1196 1197 1199
+4 1202 1197 1416 1198
+4 1416 1212 1197 1202
+4 1212 1197 1211 1416
+4 1197 1211 1178 1212
+4 1003 1196 1197 1007
+4 1178 1197 1196 1211
+4 1197 1196 1003 1178
+4 1032 1026 1199 1221
+4 1199 1007 1031 1198
+4 1031 1026 1199 1032
+4 1199 1007 1026 1031
+4 1221 1026 1169 1032
+4 1219 1026 1169 1221
+4 1219 1026 1170 1169
+4 1214 1022 1161 1170
+4 1022 1214 1023 1178
+4 1161 1155 1147 1022
+4 1214 1155 1161 1022
+4 1023 1155 1214 1022
+4 1147 1155 1023 1022
+4 1214 1023 1213 1155
+4 1220 1214 1178 1179
+4 1213 1214 1220 1179
+4 1023 1214 1213 1179
+4 1178 1214 1023 1179
+4 1214 1196 1219 1220
+4 1214 1178 1196 1220
+4 1178 1196 1022 1214
+4 1003 1196 1022 1178
+4 1003 1196 1026 1022
+4 1022 1196 1170 1214
+4 1022 1196 1026 1170
+4 1170 1196 1219 1214
+4 1170 1196 1026 1219
+4 1031 847 848 1006
+4 1031 1007 847 1006
+4 1031 967 1032 848
+4 1031 847 967 848
+4 1378 1150 1161 1379
+4 1169 1026 967 1032
+4 1169 1026 1150 967
+4 1170 1150 1026 1022
+4 1169 1150 1026 1170
+4 1150 1026 1003 967
+4 1022 1026 1003 1150
+4 1031 967 1026 1032
+4 1026 1003 967 1031
+4 1170 1150 1378 1169
+4 1161 1150 1170 1022
+4 1378 1150 1170 1161
+4 1007 1003 1026 1031
+4 945 1022 1150 1151
+4 945 1003 1150 1022
+4 945 1003 967 1150
+4 967 847 1003 945
+4 847 1003 1031 967
+4 847 1003 1007 1031
+4 1147 1161 1022 1151
+4 1379 1161 1147 1151
+4 1150 1161 1379 1151
+4 1022 1161 1150 1151
+4 292 446 290 295
+4 770 777 611 778
+4 770 953 777 778
+4 1021 1179 1023 1213
+4 1020 1177 1201 1212
+4 679 835 836 843
+4 679 677 835 843
+4 665 661 662 832
+4 665 664 661 832
+4 650 664 647 820
+4 490 647 478 650
+4 490 664 647 650
+4 454 491 507 351
+4 507 665 661 625
+4 493 665 507 625
+4 662 665 493 625
+4 661 665 662 625
+4 454 507 625 493
+4 625 491 507 454
+4 625 491 661 507
+4 478 507 491 351
+4 490 491 647 664
+4 661 491 490 664
+4 507 491 661 664
+4 647 491 507 664
+4 647 491 478 507
+4 490 647 491 478
+4 664 507 665 661
+4 647 664 507 665
+4 665 647 677 507
+4 665 835 679 677
+4 836 832 1012 829
+4 836 832 1014 1012
+4 832 836 1014 827
+4 835 832 836 829
+4 835 836 832 827
+4 827 835 665 832
+4 827 835 679 665
+4 827 835 836 679
+4 832 835 664 829
+4 664 677 665 647
+4 665 664 835 677
+4 664 835 832 665
+4 820 664 835 829
+4 820 664 677 835
+4 820 664 647 677
+4 679 836 840 843
+4 836 1014 990 1012
+4 990 836 827 1014
+4 840 804 990 836
+4 679 804 840 836
+4 827 804 679 836
+4 990 804 827 836
+4 807 990 840 804
+4 797 661 662 625
+4 1013 1009 1011 1208
+4 1013 823 824 1011
+4 1013 1009 823 1011
+4 832 823 824 1013
+4 832 828 823 1013
+4 660 664 650 820
+4 660 664 490 650
+4 660 664 661 490
+4 824 797 823 832
+4 662 797 824 832
+4 661 797 662 832
+4 823 797 661 832
+4 661 823 832 664
+4 660 823 661 664
+4 828 823 660 664
+4 832 823 828 664
+4 1009 823 828 1013
+4 823 828 831 1009
+4 831 660 828 823
+4 660 828 830 831
+4 830 664 660 820
+4 828 830 664 660
+4 1020 828 1009 831
+4 1020 830 828 831
+4 829 664 830 820
+4 1013 1020 832 828
+4 1013 1014 832 1020
+4 1209 1014 1013 1020
+4 1012 1014 1209 1020
+4 832 1014 1012 1020
+4 1009 1020 1013 828
+4 1208 1013 1009 1177
+4 1209 1013 1208 1177
+4 1020 1013 1209 1177
+4 1009 1013 1020 1177
+4 1201 1020 1209 1177
+4 1201 1020 1012 1209
+4 1020 832 829 1012
+4 829 832 1020 830
+4 664 832 829 830
+4 828 832 664 830
+4 1020 832 828 830
+4 660 767 820 650
+4 660 623 767 650
+4 980 1179 1019 1023
+4 980 1021 1179 1023
+4 1020 831 1019 830
+4 1009 1019 1020 831
+4 1009 980 1019 831
+4 1179 1177 1019 1212
+4 1021 980 1179 1177
+4 1009 980 1021 1177
+4 1019 980 1009 1177
+4 1179 980 1019 1177
+4 1177 1019 1020 1009
+4 1212 1177 1019 1020
+4 980 1019 973 1023
+4 1019 831 946 830
+4 1019 831 973 946
+4 831 1019 973 980
+4 796 830 946 831
+4 796 660 830 831
+4 953 796 769 946
+4 660 769 623 796
+4 767 623 769 777
+4 660 769 767 623
+4 770 796 623 777
+4 953 796 770 777
+4 769 796 953 777
+4 623 796 769 777
+4 820 660 769 767
+4 830 660 769 820
+4 769 796 830 946
+4 830 796 769 660
+4 796 946 973 831
+4 796 946 953 973
+4 1185 1179 1021 1213
+4 1185 1407 1179 1213
+4 1014 1012 1192 990
+4 1208 1184 1407 1177
+4 1407 1186 1184 1208
+4 1210 1186 1407 1208
+4 1015 1186 1210 1208
+4 1184 1186 1015 1208
+4 1208 1184 1011 1015
+4 1208 1184 1009 1011
+4 1184 1009 1177 1208
+4 1021 1177 1184 1009
+4 1185 1184 1407 1186
+4 1185 1184 1179 1407
+4 1185 1179 1184 1021
+4 1179 1184 1177 1407
+4 1177 1184 1179 1021
+4 1179 1177 1212 1407
+4 1419 1407 1208 1210
+4 1209 1208 1419 1200
+4 1212 1201 1419 1200
+4 1201 1212 1177 1200
+4 1201 1177 1209 1200
+4 1177 1208 1209 1200
+4 1419 1201 1209 1200
+4 1208 1177 1212 1200
+4 1208 1212 1419 1200
+4 1407 1208 1212 1419
+4 1212 1177 1208 1407
+4 1419 1201 1409 1209
+4 1209 1012 1192 1014
+4 1192 1201 1209 1409
+4 1192 1209 1201 1012
+4 507 478 506 351
+4 506 647 478 507
+4 506 677 647 507
+4 590 442 445 424
+4 590 479 442 424
+4 451 445 441 446
+4 651 647 506 677
+4 651 820 647 677
+4 610 623 767 777
+4 481 646 651 479
+4 481 477 646 479
+4 478 646 481 477
+4 481 478 647 646
+4 478 647 506 481
+4 650 646 478 477
+4 478 647 646 650
+4 651 481 647 646
+4 506 647 651 481
+4 477 646 592 650
+4 592 477 442 590
+4 646 477 592 590
+4 479 477 646 590
+4 442 477 479 590
+4 649 650 820 767
+4 649 592 650 767
+4 592 649 646 590
+4 650 646 820 647
+4 646 650 649 592
+4 820 649 646 650
+4 479 646 649 590
+4 820 646 651 647
+4 651 646 649 479
+4 649 820 646 651
+4 592 767 623 650
+4 649 592 610 590
+4 592 767 610 623
+4 767 610 649 592
+4 601 609 451 611
+4 601 610 609 611
+4 590 442 609 445
+4 601 442 609 610
+4 592 442 601 610
+4 590 442 592 610
+4 609 442 590 610
+4 601 441 451 609
+4 442 441 601 609
+4 445 441 442 609
+4 451 441 445 609
+4 601 610 623 592
+4 611 601 610 777
+4 770 601 611 777
+4 623 601 770 777
+4 610 601 623 777
+4 506 478 350 351
+4 481 478 350 506
+4 350 481 477 478
+4 332 477 481 479
+4 477 332 350 321
+4 481 477 332 350
+4 477 332 442 479
+4 442 477 321 332
+4 424 442 332 479
+4 291 442 332 424
+4 332 321 442 291
+4 290 291 445 446
+4 292 291 290 446
+4 441 291 292 446
+4 445 291 441 446
+4 291 445 424 290
+4 291 445 442 424
+4 445 442 441 291
+4 332 321 277 350
+4 278 321 332 291
+4 332 277 321 278
+4 981 823 1011 824
+4 981 797 823 824
+4 602 611 451 620
+4 602 779 611 620
+4 1159 1157 955 1152
+4 1159 1380 1157 1152
+4 1389 1157 1159 1380
+4 1389 1160 1157 1380
+4 790 939 761 940
+4 457 594 428 458
+4 457 627 594 458
+4 443 611 451 602
+4 443 599 611 602
+4 798 823 799 981
+4 798 797 823 981
+4 303 323 453 455
+4 287 441 291 292
+4 287 299 441 292
+4 279 283 280 171
+4 321 322 277 350
+4 321 477 322 350
+4 441 443 442 601
+4 289 288 280 287
+4 436 288 289 443
+4 283 288 289 436
+4 289 288 283 280
+4 299 289 287 441
+4 443 289 299 441
+4 288 289 443 441
+4 287 289 288 441
+4 283 288 427 280
+4 436 288 427 283
+4 442 288 443 441
+4 436 288 442 427
+4 442 288 436 443
+4 291 288 442 441
+4 291 287 288 441
+4 442 321 427 288
+4 291 321 442 288
+4 278 321 291 288
+4 427 321 278 288
+4 287 288 278 291
+4 278 288 280 427
+4 278 288 287 280
+4 477 427 442 321
+4 442 593 592 601
+4 442 592 593 427
+4 477 592 442 427
+4 476 592 477 427
+4 593 592 476 427
+4 593 442 443 601
+4 436 442 593 427
+4 593 442 436 443
+4 278 277 321 427
+4 279 277 278 427
+4 322 277 279 427
+4 321 277 322 427
+4 280 427 279 278
+4 279 283 427 280
+4 322 427 477 321
+4 322 427 476 477
+4 277 322 323 350
+4 276 322 277 279
+4 277 322 276 323
+4 428 282 305 281
+4 435 457 456 594
+4 435 428 457 594
+4 320 426 456 476
+4 435 304 457 428
+4 320 456 426 304
+4 457 456 320 304
+4 435 456 457 304
+4 426 456 435 304
+4 282 304 435 428
+4 282 304 426 435
+4 305 304 282 428
+4 305 304 426 282
+4 320 304 426 305
+4 457 304 305 428
+4 305 320 304 457
+4 435 456 600 594
+4 436 456 593 600
+4 436 435 456 600
+4 283 426 435 282
+4 456 426 593 476
+4 435 436 426 283
+4 436 426 456 435
+4 426 456 593 436
+4 283 426 279 427
+4 305 275 175 281
+4 175 275 276 279
+4 305 275 276 175
+4 175 275 171 281
+4 171 279 275 175
+4 282 275 281 171
+4 282 275 305 281
+4 426 275 279 276
+4 282 283 426 275
+4 171 283 282 275
+4 279 283 171 275
+4 426 283 279 275
+4 305 275 426 276
+4 282 275 426 305
+4 320 426 276 305
+4 322 276 320 427
+4 279 276 322 427
+4 426 276 279 427
+4 320 276 426 427
+4 320 427 476 322
+4 320 427 426 476
+4 427 426 436 283
+4 593 426 427 476
+4 427 426 593 436
+4 305 276 303 175
+4 453 320 305 457
+4 323 276 320 322
+4 276 323 320 305
+4 303 323 276 305
+4 453 323 303 305
+4 320 323 453 305
+4 436 593 599 600
+4 446 441 299 292
+4 451 441 299 446
+4 451 441 443 299
+4 599 443 593 436
+4 601 443 451 441
+4 599 443 601 593
+4 443 601 611 599
+4 443 611 601 451
+4 601 599 770 611
+4 627 456 457 594
+4 627 621 456 594
+4 476 621 622 593
+4 476 456 621 593
+4 626 624 798 625
+4 626 491 624 625
+4 627 624 629 798
+4 627 626 624 798
+4 622 459 624 629
+4 622 621 459 629
+4 490 459 624 622
+4 490 476 459 622
+4 476 452 322 478
+4 452 476 320 459
+4 320 452 322 476
+4 490 452 476 478
+4 476 459 452 490
+4 491 452 490 478
+4 490 624 452 491
+4 624 452 459 490
+4 476 459 456 320
+4 621 459 476 622
+4 476 456 459 621
+4 452 624 626 491
+4 624 459 627 629
+4 626 459 457 627
+4 457 453 320 459
+4 626 453 457 459
+4 452 453 626 459
+4 320 453 452 459
+4 624 459 626 627
+4 624 459 452 626
+4 627 459 621 629
+4 456 459 457 320
+4 456 459 627 457
+4 621 456 459 627
+4 454 491 626 625
+4 491 455 351 454
+4 491 626 455 454
+4 455 452 453 626
+4 455 491 452 626
+4 452 351 478 491
+4 452 455 351 491
+4 351 452 323 455
+4 351 323 452 478
+4 350 323 351 478
+4 322 323 350 478
+4 452 323 322 478
+4 323 452 453 455
+4 323 452 320 453
+4 452 320 322 323
+4 478 322 477 350
+4 477 478 476 322
+4 477 476 650 592
+4 650 476 490 622
+4 650 476 478 490
+4 478 477 476 650
+4 623 650 622 593
+4 592 650 623 593
+4 476 650 592 593
+4 622 650 476 593
+4 600 456 621 594
+4 623 593 601 592
+4 621 622 659 629
+4 600 593 621 456
+4 770 593 599 601
+4 770 623 593 601
+4 622 768 796 623
+4 659 622 768 796
+4 659 622 621 768
+4 593 768 622 623
+4 621 622 593 768
+4 770 768 623 796
+4 623 593 768 770
+4 768 593 599 770
+4 600 593 768 621
+4 768 599 593 600
+4 661 624 490 491
+4 661 625 624 491
+4 660 659 831 796
+4 660 622 659 796
+4 660 799 823 831
+4 660 659 799 831
+4 660 655 661 823
+4 660 799 655 823
+4 624 655 622 629
+4 660 661 655 622
+4 490 661 660 622
+4 624 661 490 622
+4 655 661 624 622
+4 799 659 660 655
+4 629 659 799 655
+4 622 659 629 655
+4 660 659 622 655
+4 660 622 650 490
+4 623 622 660 796
+4 660 650 622 623
+4 823 798 661 797
+4 661 655 798 823
+4 661 655 624 798
+4 625 661 798 797
+4 625 661 624 798
+4 798 655 799 823
+4 798 655 629 799
+4 629 624 655 798
+4 595 594 627 458
+4 798 799 802 981
+4 795 659 796 831
+4 795 799 659 831
+4 600 621 771 594
+4 771 794 954 939
+4 599 768 773 600
+4 773 948 956 954
+4 770 948 768 796
+4 770 953 948 796
+4 773 948 772 956
+4 599 773 768 770
+4 772 773 599 770
+4 948 773 772 770
+4 768 773 948 770
+4 772 953 955 956
+4 772 953 778 955
+4 953 778 770 772
+4 953 772 948 956
+4 948 953 770 772
+4 772 778 779 955
+4 611 772 770 778
+4 611 772 599 770
+4 602 611 772 599
+4 779 611 772 602
+4 779 611 778 772
+4 771 768 621 600
+4 771 773 768 600
+4 771 768 794 621
+4 773 771 768 948
+4 954 771 773 948
+4 794 771 954 948
+4 768 771 794 948
+4 659 794 768 621
+4 794 795 659 768
+4 948 795 794 768
+4 796 795 948 768
+4 659 795 796 768
+4 595 621 627 594
+4 595 771 621 594
+4 631 801 761 790
+4 631 802 801 790
+4 631 760 595 761
+4 631 801 760 761
+4 631 628 595 760
+4 628 631 627 629
+4 631 628 627 595
+4 628 631 801 760
+4 801 628 629 631
+4 631 629 798 627
+4 798 802 799 629
+4 631 802 798 629
+4 801 802 631 629
+4 799 802 801 629
+4 621 628 627 629
+4 621 628 595 627
+4 628 595 771 621
+4 771 628 760 595
+4 801 628 794 795
+4 771 760 628 794
+4 939 760 771 794
+4 801 760 939 794
+4 628 760 801 794
+4 621 628 794 771
+4 659 628 794 621
+4 794 628 659 795
+4 629 628 659 621
+4 795 801 628 659
+4 799 801 795 659
+4 629 801 799 659
+4 628 801 629 659
+4 939 801 761 760
+4 939 801 790 761
+4 956 1157 953 955
+4 956 1159 1157 955
+4 795 800 831 796
+4 795 948 800 796
+4 941 970 790 940
+4 941 1142 970 940
+4 941 801 802 790
+4 941 970 801 790
+4 1145 970 1142 1173
+4 1145 983 970 1173
+4 983 982 980 1021
+4 801 982 983 970
+4 800 982 980 983
+4 800 982 831 980
+4 831 800 799 982
+4 795 800 799 831
+4 801 982 800 983
+4 799 800 801 982
+4 795 800 801 799
+4 801 982 802 799
+4 941 982 801 970
+4 801 982 941 802
+4 941 982 984 802
+4 982 1145 970 941
+4 1145 982 983 1185
+4 983 970 982 1145
+4 984 1044 1185 982
+4 941 1044 984 982
+4 1145 1044 941 982
+4 1185 1044 1145 982
+4 941 1145 1142 1044
+4 941 1145 970 1142
+4 983 982 1021 1185
+4 981 982 799 802
+4 981 984 982 802
+4 1184 982 984 1185
+4 1184 1021 982 1185
+4 980 982 1009 1021
+4 831 982 1009 980
+4 1009 823 981 982
+4 831 823 1009 982
+4 799 823 831 982
+4 981 823 799 982
+4 1009 982 1184 1021
+4 1011 981 1009 823
+4 984 981 982 1184
+4 1011 981 984 1184
+4 1009 981 1011 1184
+4 982 981 1009 1184
+4 1143 970 1173 1142
+4 1143 940 970 1142
+4 972 970 801 983
+4 972 1173 970 983
+4 939 972 954 978
+4 939 972 794 954
+4 939 972 801 794
+4 972 801 970 939
+4 1143 978 1173 970
+4 939 978 1143 970
+4 972 978 939 970
+4 1173 978 972 970
+4 794 972 948 954
+4 972 801 800 983
+4 948 795 800 972
+4 794 795 948 972
+4 801 795 794 972
+4 800 795 801 972
+4 940 970 939 1143
+4 939 970 790 801
+4 939 790 970 940
+4 1175 978 1173 1143
+4 972 1156 948 954
+4 983 971 980 800
+4 983 972 971 800
+4 971 1173 1174 972
+4 971 983 1173 972
+4 1154 971 1173 1174
+4 1154 1155 971 1174
+4 1154 1023 971 1155
+4 1154 1213 1023 1155
+4 1154 1021 1023 1213
+4 1154 1185 1021 1213
+4 983 1154 971 1173
+4 971 1154 983 980
+4 1023 1154 971 980
+4 1021 1154 1023 980
+4 983 1154 1021 980
+4 1154 983 1145 1173
+4 1154 983 1185 1145
+4 1185 1021 983 1154
+4 1174 971 973 1155
+4 972 948 1156 971
+4 800 948 972 971
+4 973 948 800 971
+4 1156 948 973 971
+4 1174 971 1156 973
+4 1156 972 971 1174
+4 973 971 1023 1155
+4 973 971 980 1023
+4 973 971 800 980
+4 978 1156 1158 1175
+4 978 1156 954 1158
+4 1156 954 972 978
+4 1175 1173 978 1156
+4 1174 1173 1175 1156
+4 972 1173 1174 1156
+4 978 1173 972 1156
+4 1389 1156 1174 1175
+4 1389 1158 1156 1175
+4 1174 973 1160 1155
+4 956 1156 1158 954
+4 956 948 1156 954
+4 1389 1156 1160 1174
+4 1389 1156 1157 1160
+4 1159 1158 956 1157
+4 1389 1158 1159 1157
+4 1156 1158 1389 1157
+4 956 1158 1156 1157
+4 973 1160 1156 1174
+4 1157 1156 973 1160
+4 948 956 1156 973
+4 953 956 948 973
+4 1157 956 953 973
+4 1156 956 1157 973
+4 973 800 831 980
+4 973 800 796 831
+4 796 948 973 953
+4 796 948 800 973
+4 985 1185 984 1044
+4 984 1184 1015 1011
+4 984 985 1015 1184
+4 1185 985 984 1184
+4 1186 985 1185 1184
+4 1015 985 1186 1184
+4 1419 1638 1421 1420
+4 1419 1418 1638 1420
+4 1176 1032 1221 1169
+4 1176 1146 1032 1169
+4 1638 1416 1419 1421
+4 1638 1417 1416 1421
+4 1644 1647 1659 1898
+4 1644 1648 1647 1898
+4 1434 1644 1426 1648
+4 1434 1647 1644 1648
+4 1434 1659 1644 1647
+4 1434 1436 1659 1647
+4 1192 1193 1194 999
+4 1192 990 1193 999
+4 1192 1001 1193 990
+4 1192 988 1001 990
+4 1434 1435 1644 1659
+4 1434 1436 1435 1659
+4 1425 1434 1435 1644
+4 1425 1426 1434 1644
+4 1416 1415 1638 1419
+4 1416 1202 1415 1419
+4 1025 1006 848 833
+4 1416 1441 1417 1638
+4 1416 1440 1441 1638
+4 1416 1415 1440 1638
+4 1038 1031 1227 1033
+4 1038 848 1031 1033
+4 1038 1199 1225 1227
+4 1038 1031 1199 1227
+4 1198 1038 1031 1199
+4 1198 1031 1038 1030
+4 1006 1031 1198 1030
+4 1025 1031 1006 1030
+4 1038 1031 1025 1030
+4 1038 1198 1225 1199
+4 1030 1225 1198 1224
+4 1030 1198 1225 1038
+4 1416 1225 1198 1199
+4 1416 1225 1224 1198
+4 848 1031 1025 1038
+4 848 1031 1006 1025
+4 1032 1033 1031 848
+4 1227 1032 1176 1033
+4 1032 1227 1221 1199
+4 1176 1221 1032 1227
+4 1031 1032 1227 1033
+4 1031 1032 1199 1227
+4 1227 1221 1228 1176
+4 1440 1416 1225 1224
+4 1416 1225 1441 1440
+4 1226 1199 1417 1221
+4 1226 1417 1199 1225
+4 1441 1417 1226 1225
+4 1416 1417 1441 1225
+4 1199 1417 1416 1225
+4 1226 1227 1221 1228
+4 1226 1227 1199 1221
+4 1199 1226 1225 1227
+4 1441 1227 1226 1228
+4 1225 1226 1441 1227
+4 1146 1032 1033 1176
+4 1033 1032 969 848
+4 1033 969 1032 1146
+4 1416 1224 1202 1198
+4 1416 1224 1415 1202
+4 1224 1415 1440 1416
+4 1227 1441 1436 1228
+4 1440 1224 1229 1415
+4 1440 1224 1230 1229
+4 1227 1435 1223 1436
+4 1227 1441 1435 1436
+4 1435 1225 1440 1441
+4 1435 1227 1225 1441
+4 1230 1225 1224 1440
+4 1230 1435 1225 1440
+4 1223 1225 1435 1227
+4 1223 1038 1225 1227
+4 1225 1222 1223 1435
+4 1225 1230 1222 1435
+4 1217 1030 1038 1025
+4 1038 1223 1225 1030
+4 1217 1223 1038 1030
+4 1222 1223 1217 1030
+4 1225 1223 1222 1030
+4 1024 1030 1217 1025
+4 1217 1216 1030 1024
+4 1216 1030 1222 1217
+4 1216 1224 1230 1222
+4 1030 1224 1216 1222
+4 1225 1224 1030 1222
+4 1230 1224 1225 1222
+4 1223 1435 1434 1436
+4 1223 1425 1426 1434
+4 1223 1425 1217 1426
+4 1223 1425 1222 1217
+4 1425 1223 1435 1434
+4 1435 1425 1222 1223
+4 1216 1222 1425 1217
+4 1425 1230 1222 1216
+4 1425 1435 1222 1230
+4 1409 1415 1202 1419
+4 1190 1224 1229 1230
+4 1190 1216 1224 1230
+4 1029 1006 1027 839
+4 1029 1030 1027 1006
+4 1029 1198 1030 1006
+4 1029 1224 1030 1198
+4 1029 1191 1224 1198
+4 1190 1028 1191 1224
+4 1028 1191 1001 1190
+4 1001 987 1191 1028
+4 1001 988 1191 987
+4 1191 1028 1029 1224
+4 1029 1191 987 1028
+4 987 988 1191 1029
+4 1216 1224 1028 1190
+4 1029 1027 1030 1224
+4 1028 1027 1029 1224
+4 1216 1027 1028 1224
+4 1030 1027 1216 1224
+4 1024 1030 1027 1216
+4 1027 1006 846 839
+4 1024 846 1027 1030
+4 1025 846 1024 1030
+4 1006 846 1025 1030
+4 1027 846 1006 1030
+4 833 1006 846 1025
+4 846 821 1006 833
+4 821 1006 839 846
+4 1202 1224 1191 1198
+4 1191 1001 1192 988
+4 1224 1195 1202 1191
+4 1195 1224 1415 1229
+4 1224 1195 1415 1202
+4 1190 1195 1224 1191
+4 1195 1224 1229 1190
+4 1202 1195 1409 1191
+4 1202 1195 1415 1409
+4 1001 1191 1195 1190
+4 1192 1191 1195 1001
+4 1191 1195 1409 1192
+4 1663 1435 1441 1436
+4 1663 1659 1435 1436
+4 1418 1415 1409 1419
+4 1418 1638 1415 1419
+4 1669 1440 1638 1441
+4 1409 1637 1418 1410
+4 1409 1408 1637 1410
+4 1442 1440 1444 1669
+4 1232 1229 1408 1444
+4 1187 1190 1195 1408
+4 1232 1190 1187 1408
+4 1229 1190 1232 1408
+4 1195 1190 1229 1408
+4 1232 1229 1230 1190
+4 1230 1442 1440 1229
+4 1232 1442 1230 1229
+4 1444 1442 1232 1229
+4 1440 1442 1444 1229
+4 1638 1444 1440 1669
+4 1638 1637 1444 1669
+4 1415 1444 1229 1440
+4 1415 1638 1444 1440
+4 1409 1637 1415 1418
+4 1415 1408 1637 1409
+4 1444 1415 1408 1637
+4 1638 1415 1637 1418
+4 1637 1444 1415 1638
+4 1195 1408 1415 1409
+4 1229 1415 1408 1444
+4 1195 1229 1415 1408
+4 1001 1195 1187 1190
+4 1194 1408 1409 1410
+4 1193 1195 1001 1192
+4 1187 1195 1193 1408
+4 1187 1195 1001 1193
+4 1194 1193 1192 1409
+4 1408 1193 1194 1409
+4 1195 1193 1408 1409
+4 1192 1193 1195 1409
+4 1443 1435 1442 1663
+4 1230 1442 1435 1440
+4 1442 1435 1443 1230
+4 1663 1441 1435 1442
+4 1669 1441 1663 1442
+4 1440 1441 1669 1442
+4 1435 1441 1440 1442
+4 1443 1435 1425 1230
+4 1443 1435 1644 1425
+4 1659 1435 1443 1663
+4 1435 1644 1659 1443
+4 840 988 987 1029
+4 815 992 998 814
+4 815 992 999 998
+4 815 992 990 999
+4 992 815 807 814
+4 807 992 990 815
+4 1193 999 992 998
+4 1193 990 992 999
+4 1001 990 992 1193
+4 992 990 840 807
+4 840 987 988 990
+4 992 987 840 990
+4 1001 987 992 990
+4 988 987 1001 990
+4 999 1193 1000 998
+4 1644 1659 1664 1898
+4 1194 1193 1000 999
+4 1443 1659 1664 1644
+4 1664 1443 1663 1659
+4 1443 1663 1670 1664
+4 1670 1442 1669 1663
+4 1670 1443 1442 1663
+4 1445 1669 1672 1670
+4 1445 1442 1669 1670
+4 1189 1408 1194 1233
+4 1189 1238 1408 1233
+4 1236 1408 1238 1449
+4 1236 1408 1189 1238
+4 1188 1408 1236 1187
+4 1236 1408 1188 1189
+4 1236 1408 1232 1187
+4 1232 1446 1444 1408
+4 1236 1446 1232 1408
+4 1449 1446 1236 1408
+4 1444 1446 1449 1408
+4 1193 1408 1188 1187
+4 1189 1194 1408 1188
+4 1000 1194 1189 1188
+4 1193 1194 1000 1188
+4 1408 1194 1193 1188
+4 1410 1408 1233 1194
+4 1448 1408 1238 1233
+4 1448 1410 1408 1233
+4 1448 1637 1408 1410
+4 1448 1450 1637 1410
+4 1449 1448 1408 1238
+4 1637 1447 1448 1408
+4 1444 1447 1637 1408
+4 1449 1447 1444 1408
+4 1448 1447 1449 1408
+4 1448 1449 1451 1238
+4 1449 1448 1673 1447
+4 1673 1448 1449 1451
+4 1448 1447 1450 1673
+4 1448 1447 1637 1450
+4 1672 1447 1449 1673
+4 1669 1444 1447 1637
+4 1445 1672 1669 1444
+4 1446 1672 1445 1444
+4 1447 1672 1446 1444
+4 1669 1672 1447 1444
+4 1446 1447 1449 1672
+4 1449 1444 1447 1446
+4 1445 1444 1232 1446
+4 1444 1445 1442 1669
+4 1445 1444 1442 1232
+4 1445 1442 1230 1232
+4 1443 1442 1445 1670
+4 1445 1442 1443 1230
+4 1347 1565 1334 1335
+4 1185 1144 1044 985
+4 1185 1186 1144 985
+4 1142 1241 1143 1043
+4 2155 2154 1914 2156
+4 2155 2409 2154 2156
+4 2163 2164 2416 2165
+4 2163 1924 2164 2165
+4 2163 1923 1924 2165
+4 2885 2886 2673 2726
+4 2885 1554 2886 2726
+4 2869 1555 1530 1566
+4 2869 1666 1555 1566
+4 2672 2886 2726 2673
+4 2672 2647 2886 2673
+4 2374 2399 2400 2142
+4 2374 2373 2399 2142
+4 2432 2431 2373 2176
+4 2868 1555 1554 1530
+4 2868 2869 1555 1530
+4 2885 1555 2886 1554
+4 2885 2868 1555 1554
+4 2737 2886 1554 2726
+4 2737 2672 2886 2726
+4 1892 1896 1890 1645
+4 1892 1897 1896 1645
+4 2135 1896 1892 1897
+4 2135 2137 1896 1897
+4 2149 2402 2151 2152
+4 2149 2157 2402 2152
+4 2149 2138 2157 2152
+4 2611 2613 2872 2615
+4 2611 2359 2613 2615
+4 1554 2737 1555 2886
+4 1452 1555 1554 2737
+4 657 1555 1530 1554
+4 657 1452 1555 1554
+4 190 191 309 52
+4 2134 2391 2135 2140
+4 2134 2350 2391 2140
+4 1566 705 1619 1666
+4 1619 703 705 1566
+4 703 705 1618 1619
+4 689 703 162 705
+4 689 1618 703 705
+4 1886 2114 1885 1867
+4 2370 2132 2149 2115
+4 2370 2114 2132 2115
+4 1885 2131 2114 1886
+4 1885 1935 2131 1886
+4 2370 2148 2402 2149
+4 2370 2132 2148 2149
+4 2370 2371 2621 2402
+4 2370 2148 2371 2402
+4 1757 1718 2856 2190
+4 1757 1058 1718 2190
+4 763 765 1058 355
+4 763 192 765 355
+4 212 674 192 191
+4 1757 765 1718 1058
+4 1757 763 765 1058
+4 2872 1693 2870 2859
+4 1590 2883 1591 2877
+4 1590 2884 2883 2877
+4 1603 784 1591 674
+4 1603 764 784 674
+4 1785 784 1603 764
+4 1785 1695 784 764
+4 1658 1815 784 1590
+4 1658 2884 1815 1590
+4 1680 1815 784 1658
+4 1695 1815 1785 784
+4 2871 2857 1695 1815
+4 2849 2857 2871 1815
+4 1785 2857 2849 1815
+4 1695 2857 1785 1815
+4 1680 1695 1815 2871
+4 784 1815 1680 1695
+4 2870 1695 2871 2857
+4 2871 2870 2872 1680
+4 1695 2870 2871 1680
+4 1693 2870 1695 1680
+4 2872 2870 1693 1680
+4 2871 1815 2843 2849
+4 2879 1680 2871 2872
+4 2843 1815 2879 2884
+4 2871 1815 2879 2843
+4 2871 1815 1680 2879
+4 2879 1815 1658 2884
+4 1658 1680 1815 2879
+4 2879 1680 1679 1658
+4 2873 2879 2872 1693
+4 1679 2879 2873 1693
+4 1680 2879 1679 1693
+4 2872 2879 1680 1693
+4 1814 1815 1785 2849
+4 1814 2843 1815 2849
+4 784 1815 1591 1590
+4 1591 1814 1815 784
+4 1603 1814 1591 784
+4 1785 1814 1603 784
+4 1815 1814 1785 784
+4 1590 1815 2883 2884
+4 1591 1815 2883 1590
+4 1814 1815 2883 1591
+4 2883 1815 2843 2884
+4 2843 1815 2883 1814
+4 706 673 784 212
+4 706 162 673 212
+4 703 706 1658 1618
+4 1658 1590 784 706
+4 703 1590 1658 706
+4 673 1590 703 706
+4 784 1590 673 706
+4 1680 706 1658 784
+4 1618 1679 1620 706
+4 1658 1679 1618 706
+4 1680 1679 1658 706
+4 1620 1679 1680 706
+4 689 706 1618 1620
+4 703 706 162 673
+4 689 706 703 1618
+4 162 689 706 703
+4 673 784 1591 1590
+4 674 784 673 212
+4 1591 674 784 673
+4 1693 1680 1620 1679
+4 212 784 764 674
+4 727 1680 1620 1693
+4 1680 727 706 784
+4 727 1680 706 1620
+4 1695 1680 727 1693
+4 1695 1680 784 727
+4 727 784 212 706
+4 764 784 727 1695
+4 727 784 764 212
+4 2653 2883 2884 2877
+4 2871 2843 2610 2849
+4 2843 2884 2653 2883
+4 2610 2843 2633 2632
+4 2871 2633 2843 2879
+4 2610 2633 2871 2611
+4 2610 2633 2843 2871
+4 2872 2633 2871 2879
+4 2611 2633 2871 2872
+4 2879 2873 2872 2633
+4 2626 2873 2879 2633
+4 2613 2873 2626 2633
+4 2872 2873 2613 2633
+4 2613 2633 2611 2872
+4 2879 2633 2634 2626
+4 2634 2884 2632 2633
+4 2879 2884 2634 2633
+4 2843 2884 2879 2633
+4 2632 2884 2843 2633
+4 2884 2632 2653 2634
+4 2653 2843 2632 2884
+4 1693 727 1694 1620
+4 192 212 764 674
+4 727 764 192 212
+4 763 764 765 192
+4 763 727 764 192
+4 1784 1785 1695 2857
+4 1784 2856 1785 2857
+4 1785 1784 1718 2856
+4 1758 1784 1718 764
+4 1695 1784 1758 764
+4 1785 1784 1695 764
+4 1718 1784 1785 764
+4 1757 1718 1784 2856
+4 1757 1718 1758 1784
+4 1757 1758 1718 765
+4 763 1758 1757 765
+4 764 1758 763 765
+4 1718 1758 764 765
+4 1758 1692 1695 764
+4 763 1692 1758 764
+4 727 1692 763 764
+4 1695 1692 727 764
+4 1784 1695 2870 2857
+4 2862 1695 1758 1692
+4 2870 2866 2862 1695
+4 1784 2866 2870 1695
+4 1758 2866 1784 1695
+4 2862 2866 1758 1695
+4 2859 2862 2870 2866
+4 2870 2862 1693 1695
+4 1693 2859 2862 2870
+4 2862 1694 1693 1695
+4 1692 1694 2862 1695
+4 727 1694 1692 1695
+4 1693 1694 727 1695
+4 2051 2848 2506 2795
+4 1716 2856 1718 2190
+4 1716 2506 2856 2190
+4 1717 1576 1737 737
+4 1717 1604 1576 737
+4 1717 1786 2051 1737
+4 1717 1576 1786 1737
+4 1717 764 1786 1576
+4 1717 1604 764 1576
+4 2051 1787 1786 1717
+4 2051 1716 1787 1717
+4 1716 2051 1787 2856
+4 2506 2051 1716 2856
+4 2848 2051 2506 2856
+4 1787 2051 2848 2856
+4 2848 1787 1786 2051
+4 1785 1787 2848 2856
+4 1786 1785 1787 2848
+4 764 1787 1716 1717
+4 764 1718 1716 1787
+4 1785 1718 764 1787
+4 2856 1718 1785 1787
+4 1716 1718 2856 1787
+4 1786 1787 764 1717
+4 1786 1787 1785 764
+4 1604 764 1716 1717
+4 1604 1716 764 1718
+4 1576 1604 738 737
+4 1576 1604 674 738
+4 674 764 1604 1576
+4 2849 1785 1786 2848
+4 2888 1786 1576 1737
+4 1785 1786 1814 2849
+4 1591 2888 1814 1603
+4 1576 2888 1591 1603
+4 1786 2888 1576 1603
+4 1814 2888 1786 1603
+4 764 1603 1786 1576
+4 1603 1786 1785 764
+4 1603 1786 1814 1785
+4 674 1603 1576 1591
+4 674 1603 764 1576
+4 2857 1785 2848 2856
+4 2848 1785 2857 2849
+4 1716 1718 1058 2190
+4 190 738 309 191
+4 190 738 737 309
+4 737 739 1604 738
+4 1058 736 739 1718
+4 1716 736 1058 1718
+4 1604 736 1716 1718
+4 739 736 1604 1718
+4 1717 1604 736 1716
+4 736 737 1604 1717
+4 737 1604 739 736
+4 736 739 355 1058
+4 736 739 190 355
+4 739 737 190 738
+4 736 739 737 190
+4 765 739 1718 1058
+4 765 355 739 1058
+4 192 739 765 355
+4 192 190 739 355
+4 191 192 738 674
+4 738 192 190 739
+4 191 738 192 190
+4 764 674 1604 739
+4 192 674 764 739
+4 738 674 192 739
+4 1604 674 738 739
+4 764 739 765 192
+4 764 739 1718 765
+4 739 1718 1604 764
+4 2855 2848 2051 2795
+4 2855 2693 2848 2795
+4 2855 1786 1737 2051
+4 2855 2848 1786 2051
+4 2888 2883 2877 1591
+4 2888 1814 2883 1591
+4 2652 2843 2635 2632
+4 2652 2653 2843 2632
+4 2652 2883 2843 2653
+4 2652 2877 2883 2653
+4 2889 2635 2637 2652
+4 2637 2636 2889 2854
+4 2889 2635 2636 2637
+4 2635 2636 2844 2889
+4 2855 2889 2636 2854
+4 2636 2844 2889 2855
+4 1737 2889 2855 2854
+4 1737 2855 2889 2888
+4 1786 2855 1737 2888
+4 2844 2855 1786 2888
+4 2889 2855 2844 2888
+4 2888 2844 1814 1786
+4 2883 2844 2843 1814
+4 2883 2888 2844 1814
+4 2889 2883 2652 2877
+4 2889 2652 2883 2844
+4 2635 2652 2889 2844
+4 2843 2652 2635 2844
+4 2883 2652 2843 2844
+4 2888 2883 2889 2877
+4 2888 2883 2844 2889
+4 2849 2844 1786 1814
+4 2849 2843 2844 1814
+4 2848 2844 2855 1786
+4 2848 2849 2844 1786
+4 2693 2844 2636 2855
+4 2693 2848 2844 2855
+4 2849 2844 2596 2848
+4 2595 2843 2610 2632
+4 2849 2596 2844 2843
+4 2610 2596 2849 2843
+4 2595 2596 2610 2843
+4 2844 2596 2595 2843
+4 2635 2843 2595 2632
+4 2635 2843 2844 2595
+4 2596 2844 2693 2848
+4 2636 2844 2595 2635
+4 2693 2844 2595 2636
+4 2596 2844 2595 2693
+4 2595 2636 2444 2693
+4 2128 2127 2370 2114
+4 2128 1885 2127 2114
+4 2129 2127 2128 1885
+4 2129 2130 2127 1885
+4 2634 2412 2632 2653
+4 2634 2622 2412 2653
+4 2623 2372 2622 2621
+4 2623 2412 2634 2622
+4 2623 2372 2412 2622
+4 2385 2613 2611 2359
+4 2385 2382 2613 2359
+4 2382 2412 2623 2372
+4 2382 2381 2412 2372
+4 2626 2412 2634 2623
+4 2626 2382 2412 2623
+4 2611 2385 2633 2613
+4 2386 2633 2385 2381
+4 2386 2632 2633 2381
+4 2384 2633 2385 2386
+4 2384 2633 2611 2385
+4 2610 2633 2611 2384
+4 2386 2384 2633 2632
+4 2595 2384 2386 2632
+4 2610 2384 2595 2632
+4 2633 2384 2610 2632
+4 2382 2633 2381 2385
+4 2382 2633 2412 2381
+4 2633 2412 2626 2382
+4 2626 2412 2633 2634
+4 2613 2633 2382 2385
+4 2382 2633 2613 2626
+4 2412 2633 2632 2381
+4 2633 2412 2632 2634
+4 2385 2381 2130 2386
+4 2129 2382 2385 2359
+4 2129 2381 2127 2130
+4 2128 2381 2129 2382
+4 2128 2381 2127 2129
+4 2385 2381 2129 2130
+4 2129 2382 2381 2385
+4 2372 2381 2128 2382
+4 2372 2381 2127 2128
+4 2158 2381 2386 2130
+4 2158 2127 2381 2130
+4 2414 2412 2622 2653
+4 2160 2372 2127 2370
+4 2413 2412 2160 2414
+4 2381 2160 2412 2372
+4 2160 2381 2413 2158
+4 2413 2412 2381 2160
+4 2127 2160 2381 2372
+4 2127 2381 2160 2158
+4 2622 2372 2371 2621
+4 2622 2371 2372 2412
+4 2414 2371 2622 2412
+4 2160 2371 2414 2412
+4 2372 2371 2160 2412
+4 2370 2371 2372 2621
+4 2372 2160 2371 2370
+4 2413 2381 2386 2158
+4 2381 2413 2632 2412
+4 2632 2386 2413 2381
+4 2595 2632 2386 2387
+4 2635 2632 2595 2387
+4 2413 2632 2635 2387
+4 2386 2632 2413 2387
+4 2652 2413 2632 2635
+4 2652 2653 2632 2413
+4 2414 2653 2652 2413
+4 2412 2653 2414 2413
+4 2632 2653 2412 2413
+4 2128 2127 2372 2370
+4 1935 2127 2130 1885
+4 1935 2131 2127 1885
+4 2386 2387 2444 2595
+4 2411 2160 2389 2414
+4 2411 2413 2160 2414
+4 2185 2158 2386 2130
+4 2413 2158 2388 2159
+4 2386 2388 2413 2158
+4 2413 2387 2388 2386
+4 2158 2388 2185 2386
+4 2159 2158 2388 2185
+4 2444 2388 2386 2185
+4 2386 2387 2388 2444
+4 2185 1935 2159 2158
+4 2130 1935 2185 2158
+4 2127 1935 2130 2158
+4 2159 1935 2127 2158
+4 2131 2127 2159 1935
+4 2159 2413 2411 2388
+4 2160 2159 2413 2411
+4 2160 2159 2158 2413
+4 2158 2160 2127 2159
+4 2159 2160 2389 2411
+4 2159 2160 2131 2389
+4 2160 2131 2127 2159
+4 2652 2413 2411 2414
+4 2636 2635 2388 2637
+4 2388 2444 2387 2635
+4 2636 2444 2388 2635
+4 2595 2444 2636 2635
+4 2387 2444 2595 2635
+4 2635 2388 2413 2387
+4 2652 2411 2413 2635
+4 2637 2411 2652 2635
+4 2388 2411 2637 2635
+4 2413 2411 2388 2635
+4 2114 2127 2131 1885
+4 2389 2160 2371 2414
+4 2132 2370 2160 2131
+4 2114 2370 2132 2131
+4 2127 2370 2114 2131
+4 2160 2370 2127 2131
+4 2160 2132 2371 2370
+4 2160 2132 2389 2371
+4 2131 2160 2132 2389
+4 2148 2371 2132 2370
+4 2148 2132 2371 2389
+4 1865 2114 1886 1867
+4 1889 2131 1935 1886
+4 2604 2636 2854 2855
+4 2159 2136 2389 2131
+4 2159 2133 2136 2131
+4 2411 2159 2390 2389
+4 2603 2349 2351 2350
+4 2351 2603 2388 2349
+4 2603 2388 2604 2351
+4 2388 2603 2604 2636
+4 2637 2603 2388 2636
+4 2854 2603 2637 2636
+4 2604 2603 2854 2636
+4 2390 2349 2603 2350
+4 2390 2388 2411 2637
+4 2388 2390 2159 2349
+4 2411 2159 2388 2390
+4 2603 2388 2390 2637
+4 2390 2349 2388 2603
+4 2134 2349 2350 2351
+4 2390 2159 2136 2389
+4 2390 2133 2391 2136
+4 2390 2391 2133 2349
+4 2350 2391 2390 2349
+4 2134 2391 2350 2349
+4 2133 2391 2134 2349
+4 2133 2390 2159 2136
+4 2159 2133 2349 2390
+4 2693 2636 2604 2855
+4 1935 2133 2159 2131
+4 1935 1889 2133 2131
+4 2185 2349 2351 2388
+4 2185 2159 2349 2388
+4 2100 2349 2134 2351
+4 2100 2185 2349 2351
+4 2100 2133 1935 1889
+4 2133 2100 2349 2134
+4 1935 2185 2159 2133
+4 2100 2185 1935 2133
+4 2349 2185 2100 2133
+4 2159 2185 2349 2133
+4 2021 2133 2100 1889
+4 2134 2133 2100 2021
+4 2351 2185 2281 2100
+4 2351 2444 2445 2281
+4 2351 2445 2444 2388
+4 2604 2445 2351 2388
+4 2636 2445 2604 2388
+4 2444 2445 2636 2388
+4 2444 2351 2185 2281
+4 2185 2388 2351 2444
+4 2445 2636 2693 2444
+4 2604 2636 2693 2445
+4 1889 2133 1890 2021
+4 1889 1896 1888 1890
+4 1889 2133 1896 1890
+4 1893 2133 1889 2131
+4 1893 2136 2133 2131
+4 1896 2133 1895 2137
+4 1895 1888 1893 2133
+4 1896 1888 1895 2133
+4 1889 1888 1896 2133
+4 1893 1888 1889 2133
+4 1895 2133 2136 2137
+4 2136 1893 2133 1895
+4 1889 1893 1886 1888
+4 1886 2131 1893 1889
+4 2391 2133 2137 2136
+4 1896 2133 1892 1890
+4 1892 2133 2135 2134
+4 2135 2133 1896 2137
+4 1892 2133 1896 2135
+4 2135 2133 2391 2134
+4 2137 2133 2391 2135
+4 1892 2133 2021 1890
+4 1892 2133 2134 2021
+4 1904 2132 2115 2149
+4 1887 1893 1895 1888
+4 1887 1893 1904 1895
+4 2132 1893 2114 2131
+4 2115 1887 2114 2132
+4 1904 1887 2115 2132
+4 1893 1887 1904 2132
+4 2114 1887 1893 2132
+4 1886 1887 1865 1888
+4 1886 1893 1887 1888
+4 1887 2114 1865 2115
+4 2114 1893 1886 2131
+4 1886 2114 1887 1893
+4 1865 2114 1887 1886
+4 1904 2148 2132 2149
+4 1904 2138 2148 2149
+4 2136 1904 1893 1895
+4 1904 2136 2132 2148
+4 1893 2132 2136 2131
+4 1893 2136 2132 1904
+4 2389 2132 2136 2148
+4 2136 2131 2132 2389
+4 1904 2136 2137 1895
+4 2136 1904 2138 2148
+4 2137 2136 1904 2138
+4 1555 705 1566 1666
+4 2854 2889 2892 1737
+4 2621 2371 2405 2402
+4 2371 2618 2622 2621
+4 2371 2405 2618 2621
+4 2414 2415 2371 2389
+4 2414 2411 2415 2389
+4 2652 2415 2638 2655
+4 2652 2415 2411 2638
+4 2652 2415 2414 2411
+4 2653 2619 2414 2652
+4 2655 2619 2653 2652
+4 2415 2619 2655 2652
+4 2414 2619 2415 2652
+4 2619 2414 2622 2653
+4 2622 2618 2371 2414
+4 2619 2618 2622 2414
+4 2415 2618 2619 2414
+4 2371 2618 2415 2414
+4 2394 2415 2638 2411
+4 2394 2389 2415 2411
+4 2620 2415 2638 2394
+4 2655 2415 2620 2619
+4 2638 2655 2415 2620
+4 2405 2415 2620 2394
+4 2620 2618 2415 2405
+4 2618 2415 2619 2620
+4 2389 2415 2405 2394
+4 2405 2415 2371 2618
+4 2389 2415 2371 2405
+4 2639 2411 2394 2638
+4 2157 2389 2405 2394
+4 2157 2393 2389 2394
+4 2389 2393 2148 2136
+4 2157 2148 2389 2393
+4 2389 2157 2405 2371
+4 2148 2157 2389 2371
+4 2402 2157 2148 2371
+4 2405 2157 2402 2371
+4 2390 2393 2389 2136
+4 2393 2639 2390 2389
+4 2394 2639 2393 2389
+4 2411 2639 2394 2389
+4 2390 2639 2411 2389
+4 2157 2148 2149 2402
+4 2148 2393 2138 2136
+4 2138 2148 2157 2393
+4 2138 2148 2149 2157
+4 2393 2136 2137 2138
+4 2393 2136 2391 2137
+4 2391 2393 2390 2136
+4 2391 2639 2390 2393
+4 2391 2397 2390 2639
+4 2391 2397 2350 2390
+4 2350 2391 2140 2397
+4 2397 2390 2603 2350
+4 2877 2652 2655 2653
+4 2854 2890 2640 2892
+4 2854 2889 2890 2892
+4 2637 2890 2854 2889
+4 2640 2637 2603 2397
+4 2640 2637 2854 2603
+4 2637 2854 2890 2640
+4 2639 2637 2640 2397
+4 2639 2637 2890 2640
+4 2397 2637 2390 2639
+4 2390 2603 2637 2397
+4 2637 2639 2411 2390
+4 2652 2890 2637 2889
+4 2890 2638 2652 2637
+4 2639 2638 2890 2637
+4 2411 2638 2639 2637
+4 2652 2638 2411 2637
+4 2890 2889 1575 2892
+4 2655 2652 2890 2638
+4 2863 2655 2877 2887
+4 2890 2655 2863 2887
+4 2652 2655 2890 2887
+4 2877 2655 2652 2887
+4 2652 2887 2889 2877
+4 2889 2887 2652 2890
+4 2890 1575 2889 2887
+4 2863 1575 2890 2887
+4 2877 1575 2863 2887
+4 2889 1575 2877 2887
+4 1737 1575 2889 2892
+4 1737 1574 1575 2892
+4 160 674 212 191
+4 160 672 674 191
+4 160 162 656 159
+4 704 1532 1531 1590
+4 1529 656 1532 1531
+4 1528 656 1529 1531
+4 704 656 1528 1531
+4 1532 656 704 1531
+4 673 704 1532 656
+4 704 673 1590 703
+4 1590 1532 673 704
+4 704 673 162 656
+4 673 704 162 703
+4 656 1532 672 1529
+4 673 160 674 212
+4 160 656 673 674
+4 672 656 160 674
+4 1532 656 672 674
+4 673 656 1532 674
+4 162 673 160 656
+4 162 673 212 160
+4 656 658 657 159
+4 656 162 658 159
+4 656 658 1530 657
+4 704 658 656 162
+4 656 704 1530 658
+4 1528 704 1530 656
+4 704 658 1566 1530
+4 703 658 704 162
+4 1566 658 704 703
+4 703 658 705 1566
+4 162 658 705 703
+4 1555 658 705 1452
+4 1566 658 1555 1530
+4 1555 705 658 1566
+4 657 658 1555 1452
+4 1530 658 1555 657
+4 1575 1532 1529 672
+4 1531 1532 2877 1590
+4 1529 2863 1531 1532
+4 1575 2863 1529 1532
+4 2877 2863 1575 1532
+4 1531 2863 2877 1532
+4 1574 1576 737 1737
+4 1574 1575 1576 1737
+4 672 1576 1574 1575
+4 309 738 672 191
+4 309 933 672 738
+4 737 933 309 738
+4 1576 933 737 738
+4 672 933 1576 738
+4 933 1576 1574 672
+4 737 1576 1574 933
+4 1532 1576 672 1575
+4 674 672 738 191
+4 674 672 1576 738
+4 674 1532 1576 672
+4 1591 1532 1576 674
+4 2889 1575 2888 2877
+4 2888 1737 1575 2889
+4 1576 1575 2888 1737
+4 2877 1575 2888 1591
+4 1532 1575 2877 1591
+4 1576 1575 1532 1591
+4 2888 1575 1576 1591
+4 1591 1532 1590 2877
+4 1591 1532 673 1590
+4 1591 1532 674 673
+4 5 162 160 159
+4 5 161 162 159
+4 55 3 1 51
+4 55 115 3 51
+4 3 118 117 115
+4 3 55 118 115
+4 271 273 355 296
+4 271 225 273 296
+4 271 10 273 225
+4 271 226 10 225
+4 226 272 271 10
+4 226 257 272 10
+4 853 257 226 825
+4 763 727 853 1692
+4 271 272 853 763
+4 226 853 272 257
+4 853 272 271 226
+4 727 853 272 763
+4 257 272 727 853
+4 887 853 825 257
+4 1860 887 853 825
+4 1860 887 1692 853
+4 1692 1694 887 1860
+4 727 853 887 257
+4 1692 887 727 853
+4 1694 887 727 1692
+4 192 272 763 727
+4 10 272 271 273
+4 192 272 10 273
+4 763 272 192 273
+4 271 272 763 273
+4 355 273 763 192
+4 271 273 763 355
+4 190 273 54 355
+4 190 192 273 355
+4 54 6 190 52
+4 54 190 6 10
+4 273 190 54 10
+4 192 190 273 10
+4 6 190 192 10
+4 1 6 54 52
+4 54 12 6 1
+4 54 12 10 6
+4 12 10 273 54
+4 55 12 54 1
+4 54 273 296 355
+4 225 273 12 10
+4 54 296 273 12
+4 55 296 54 12
+4 225 296 55 12
+4 273 296 225 12
+4 191 190 6 52
+4 191 192 6 190
+4 887 727 1620 1694
+4 7 212 191 160
+4 7 163 212 160
+4 212 272 192 727
+4 212 193 10 7
+4 192 212 10 272
+4 192 10 212 193
+4 10 193 6 7
+4 10 193 192 6
+4 7 191 212 193
+4 6 191 7 193
+4 192 191 6 193
+4 212 191 192 193
+4 163 11 212 272
+4 257 11 163 272
+4 10 11 257 272
+4 212 11 10 272
+4 727 272 163 212
+4 272 163 257 727
+4 7 212 11 10
+4 163 212 11 7
+4 212 163 162 160
+4 706 163 212 727
+4 162 706 163 212
+4 706 163 689 162
+4 706 690 727 1620
+4 727 163 690 706
+4 257 727 163 690
+4 887 727 690 1620
+4 887 727 257 690
+4 690 706 689 1620
+4 690 706 163 689
+4 3 118 8 117
+4 7 10 0 6
+4 689 163 161 162
+4 161 163 690 164
+4 689 163 690 161
+4 161 163 5 162
+4 161 163 164 5
+4 11 164 163 5
+4 163 164 257 690
+4 163 164 11 257
+4 9 164 5 161
+4 11 164 9 257
+4 9 164 11 5
+4 690 161 630 689
+4 256 690 161 630
+4 9 256 257 164
+4 161 256 9 164
+4 690 256 161 164
+4 257 256 690 164
+4 5 163 160 162
+4 163 5 7 11
+4 7 163 160 5
+4 221 257 9 256
+4 0 10 9 8
+4 7 0 10 11
+4 5 0 7 11
+4 9 0 5 11
+4 10 0 9 11
+4 9 10 221 8
+4 10 9 257 11
+4 9 10 257 221
+4 0 12 1 6
+4 0 10 12 6
+4 3 12 55 1
+4 3 0 12 1
+4 118 55 3 8
+4 225 55 118 8
+4 12 55 225 8
+4 3 55 12 8
+4 0 12 8 3
+4 8 10 12 0
+4 10 12 225 8
+4 221 224 223 222
+4 221 8 224 222
+4 226 221 257 10
+4 223 226 221 793
+4 825 226 223 793
+4 257 226 825 793
+4 221 226 257 793
+4 221 226 8 10
+4 8 223 226 221
+4 224 8 223 226
+4 223 8 224 221
+4 225 8 226 10
+4 225 224 226 8
+4 117 224 8 222
+4 8 118 224 117
+4 118 224 225 8
+4 256 257 793 221
+4 793 690 257 256
+4 793 257 887 825
+4 793 887 257 690
+4 115 116 302 554
+4 115 116 51 302
+4 115 116 3 51
+4 116 115 555 554
+4 117 115 116 3
+4 555 116 117 115
+4 161 689 614 630
+4 705 658 614 1452
+4 162 614 161 689
+4 159 614 162 658
+4 614 162 161 159
+4 614 162 705 689
+4 705 658 162 614
+4 657 658 614 159
+4 614 1452 658 657
+4 2116 2114 2115 1865
+4 2116 1867 2114 1865
+4 221 223 791 222
+4 2111 2114 2116 1867
+4 2111 1885 2114 1867
+4 2303 2295 2433 2177
+4 2303 2040 2295 2177
+4 2765 1620 1471 1679
+4 2303 2297 2295 2040
+4 2303 2298 2297 2040
+4 2671 2756 2776 2765
+4 2671 2810 2756 2765
+4 2796 1960 2811 2797
+4 2796 2788 1960 2797
+4 2664 2808 2545 2550
+4 2664 2808 2674 2545
+4 2812 2808 2714 2674
+4 2812 2808 1960 2714
+4 2808 1960 2809 2812
+4 2664 2808 2812 2674
+4 2812 2809 2808 2664
+4 2812 1960 1506 2714
+4 2788 1960 2812 2809
+4 1506 2788 1960 2812
+4 2552 2550 2811 2549
+4 2664 2550 2552 2549
+4 2808 2550 2664 2549
+4 2811 2550 2808 2549
+4 2809 2549 2808 2664
+4 2808 2549 2809 2811
+4 2552 2666 2664 2549
+4 2811 2666 2552 2549
+4 2809 2666 2811 2549
+4 2664 2666 2809 2549
+4 2811 2809 2796 2666
+4 1960 2809 2811 2808
+4 2796 1960 2809 2811
+4 1960 2809 2788 2796
+4 2811 1960 2810 2797
+4 2551 2550 2811 2552
+4 2776 2808 2714 2756
+4 2776 2808 2674 2714
+4 2545 2808 2668 2550
+4 2668 2808 2674 2776
+4 2674 2545 2808 2668
+4 2671 2808 2776 2756
+4 2671 2808 2668 2776
+4 2544 2808 2668 2671
+4 2544 2808 2550 2668
+4 2551 2808 2671 2810
+4 2551 2808 2544 2671
+4 2551 2808 2550 2544
+4 2811 2808 2551 2810
+4 2551 2550 2808 2811
+4 2756 2808 2810 2671
+4 1960 2810 2808 2811
+4 2756 2808 1960 2810
+4 1960 2714 2808 2756
+4 2797 2788 1489 2796
+4 2788 1490 1489 1488
+4 1982 1646 887 1841
+4 1982 2797 1646 1841
+4 1982 1471 2765 1620
+4 1471 1982 2756 1646
+4 2756 1982 1471 2765
+4 1620 887 1982 1471
+4 690 887 1620 1471
+4 1646 887 690 1471
+4 1982 887 1646 1471
+4 1982 2756 2810 2765
+4 2810 2797 1960 2756
+4 1982 2797 2810 2756
+4 1646 2797 1982 2756
+4 1960 2797 1646 2756
+4 1490 1646 887 690
+4 1490 1646 1841 887
+4 1489 1490 2797 1841
+4 2797 1490 2788 1960
+4 2797 2788 1490 1489
+4 2797 1490 1646 1841
+4 1646 1960 1490 2797
+4 2756 1646 1470 1471
+4 2756 1470 1646 1960
+4 2714 1470 2756 1960
+4 1506 1470 2714 1960
+4 1646 1470 1506 1960
+4 873 1646 1470 1506
+4 1470 690 1646 873
+4 1470 1471 1646 690
+4 873 1646 1490 690
+4 1488 1506 2788 1490
+4 873 1506 1488 1490
+4 1960 1506 873 1490
+4 2788 1506 1960 1490
+4 1646 873 1960 1506
+4 1646 1490 1960 873
+4 873 793 637 256
+4 873 690 793 256
+4 793 1490 887 690
+4 792 1490 793 637
+4 825 1841 887 793
+4 792 1841 825 793
+4 1490 1841 792 793
+4 887 1841 1490 793
+4 1489 1490 792 637
+4 1841 1490 792 1489
+4 1488 637 1490 1489
+4 1490 793 873 690
+4 873 1490 637 793
+4 637 1490 873 1488
+4 1359 1489 637 1488
+4 637 793 221 256
+4 792 637 1359 1489
+4 223 793 792 825
+4 637 791 792 1359
+4 637 221 793 792
+4 791 221 637 792
+4 223 221 791 792
+4 793 221 223 792
+4 1488 1489 2643 1359
+4 2643 2788 2796 1489
+4 2643 1488 2788 1489
+4 2662 2796 2683 2643
+4 2662 2788 2796 2643
+4 2809 2662 2812 2788
+4 2809 2796 2662 2788
+4 2822 2809 2662 2812
+4 2822 2664 2809 2812
+4 2440 2666 2682 2664
+4 2682 2442 2666 2440
+4 2442 2666 2683 2682
+4 2664 2822 2809 2666
+4 2682 2822 2664 2666
+4 2683 2822 2682 2666
+4 2809 2822 2683 2666
+4 2683 2809 2662 2822
+4 2683 2809 2796 2662
+4 2809 2796 2666 2683
+4 2662 2788 1506 2812
+4 1488 2788 2662 2643
+4 1488 2788 1506 2662
+4 2440 2666 2430 2442
+4 2544 2550 2433 2668
+4 2551 2550 2295 2544
+4 2297 2550 2303 2295
+4 2303 2297 2552 2550
+4 2297 2552 2298 2303
+4 2551 2550 2297 2295
+4 2297 2550 2551 2552
+4 2433 2550 2295 2303
+4 2544 2550 2295 2433
+4 2433 2550 2545 2668
+4 2429 2550 2433 2303
+4 2545 2550 2429 2664
+4 2429 2550 2545 2433
+4 2550 2429 2552 2303
+4 2552 2550 2664 2429
+4 2429 2552 2428 2664
+4 2428 2303 2552 2429
+4 2428 2298 2552 2303
+4 2430 2552 2428 2298
+4 2428 2664 2552 2430
+4 2440 2664 2428 2430
+4 2666 2664 2440 2430
+4 2552 2664 2666 2430
+4 2295 2040 2076 2177
+4 2076 2295 2297 2040
+4 1841 887 1860 825
+4 2665 2810 2797 2811
+4 2665 2551 2810 2811
+4 2293 2546 2544 2437
+4 2294 2544 2546 2551
+4 2544 2294 2546 2293
+4 2544 2546 2671 2437
+4 2671 2551 2546 2544
+4 2295 2294 2544 2293
+4 2295 2294 2551 2544
+4 2076 2294 2295 2293
+4 2297 2295 2294 2551
+4 2295 2297 2294 2076
+4 2671 2546 2669 2437
+4 2665 2546 2669 2810
+4 2551 2546 2665 2810
+4 2671 2546 2551 2810
+4 2669 2546 2671 2810
+4 2546 2437 2436 2669
+4 2293 2292 2364 2113
+4 2437 2293 2546 2436
+4 2364 2293 2437 2436
+4 2292 2293 2364 2436
+4 2546 2293 2292 2436
+4 2293 2294 2113 2076
+4 2292 2293 2294 2113
+4 2292 2294 2293 2546
+4 2437 2436 2616 2364
+4 2765 2669 2671 2810
+4 2765 2858 2669 2810
+4 2670 2669 2671 2765
+4 2670 2669 2437 2671
+4 2670 2669 2436 2437
+4 2669 2436 2612 2670
+4 2765 2670 2669 2858
+4 2873 2670 2765 2858
+4 2612 2670 2873 2858
+4 2669 2670 2612 2858
+4 2670 2436 2616 2437
+4 2616 2612 2670 2873
+4 2616 2612 2436 2670
+4 2842 1982 1841 2797
+4 2842 2810 1982 2797
+4 1982 2858 2765 2810
+4 1982 2842 2858 2810
+4 1860 1982 887 1841
+4 1860 2842 1982 1841
+4 1694 1982 1620 887
+4 1693 2765 1679 1620
+4 2873 2765 1693 2858
+4 2765 1693 1679 2873
+4 1982 2765 2858 1694
+4 1620 2765 1982 1694
+4 1693 2765 1620 1694
+4 2858 2765 1693 1694
+4 2861 1694 2858 1693
+4 1860 1982 1694 887
+4 1860 2861 1694 1982
+4 2842 2861 1860 1982
+4 2858 2861 2842 1982
+4 1694 2861 2858 1982
+4 2665 2810 2842 2797
+4 2842 2858 2608 2861
+4 2842 2608 2858 2810
+4 2665 2608 2842 2810
+4 2669 2608 2665 2810
+4 2858 2608 2669 2810
+4 2435 2436 2669 2546
+4 2435 2292 2436 2546
+4 2861 1694 1692 1860
+4 2861 1694 2862 1692
+4 2862 2861 1693 1694
+4 2123 2036 2108 1928
+4 2123 2113 2036 1928
+4 2872 2858 2873 1693
+4 2872 2860 2858 1693
+4 2365 2361 2362 2123
+4 2365 2364 2361 2123
+4 2436 2435 2364 2292
+4 2616 2435 2364 2436
+4 2379 2382 2626 2623
+4 2613 2616 2382 2626
+4 2360 2363 2616 2382
+4 2359 2363 2360 2382
+4 2613 2363 2359 2382
+4 2616 2363 2613 2382
+4 2379 2382 2616 2626
+4 2616 2360 2382 2379
+4 2361 2616 2360 2363
+4 2379 2616 2360 2362
+4 2365 2616 2379 2362
+4 2361 2616 2365 2362
+4 2360 2616 2361 2362
+4 2382 2379 2372 2623
+4 2129 2360 2382 2359
+4 2128 2360 2382 2129
+4 2372 2382 2128 2362
+4 2379 2382 2372 2362
+4 2360 2382 2379 2362
+4 2128 2382 2360 2362
+4 2364 2361 2616 2365
+4 2616 2435 2361 2364
+4 2435 2361 2363 2616
+4 2615 2613 2363 2359
+4 2616 2613 2873 2626
+4 2612 2435 2616 2436
+4 2363 2612 2614 2435
+4 2363 2616 2612 2435
+4 2612 2873 2615 2614
+4 2858 2873 2612 2614
+4 2860 2873 2858 2614
+4 2615 2873 2860 2614
+4 2872 2873 2860 2615
+4 2858 2860 2872 2873
+4 2613 2615 2873 2872
+4 2613 2615 2612 2873
+4 2613 2614 2612 2615
+4 2616 2613 2612 2873
+4 2612 2363 2613 2616
+4 2363 2613 2614 2612
+4 2614 2613 2363 2615
+4 2108 2179 2107 2036
+4 2108 2123 2179 2036
+4 2362 2179 2108 2123
+4 2362 2361 2179 2123
+4 2107 2362 2179 2108
+4 2107 2116 2362 2108
+4 2111 2362 2107 2116
+4 2111 2128 2362 2116
+4 2112 2362 2179 2107
+4 2112 2362 2361 2179
+4 2360 2362 2361 2112
+4 2111 2362 2112 2107
+4 2112 2360 2362 2111
+4 2111 2360 2129 2112
+4 2360 2111 2128 2362
+4 2111 2360 2128 2129
+4 2111 2128 1885 2129
+4 2114 2128 2111 2116
+4 2111 2128 2114 1885
+4 2113 2179 2123 2036
+4 2123 2179 2364 2361
+4 2113 2179 2364 2123
+4 2359 2360 2112 2129
+4 2363 2360 2112 2359
+4 2361 2112 2363 2360
+4 2435 2361 2180 2363
+4 2292 2179 2364 2113
+4 2292 2435 2364 2179
+4 2180 2435 2292 2179
+4 2361 2435 2180 2179
+4 2364 2435 2361 2179
+4 2036 2179 2292 2113
+4 2036 2292 2179 2180
+4 2107 2179 2180 2036
+4 2180 2361 2112 2363
+4 2112 2180 2179 2361
+4 2112 2179 2180 2107
+4 2669 2435 2612 2436
+4 2614 2612 2669 2435
+4 2669 2614 2858 2612
+4 2614 2858 2609 2669
+4 2609 2858 2614 2860
+4 2859 1693 2860 2872
+4 2860 2862 1693 2859
+4 2609 2858 2608 2669
+4 2609 2858 2861 2608
+4 2609 2862 2861 2858
+4 2860 2862 2609 2858
+4 1693 2862 2860 2858
+4 2861 2862 1693 2858
+4 2123 2122 2175 1928
+4 2123 2108 2122 1928
+4 2122 2362 2146 2108
+4 2122 2123 2362 2108
+4 2146 2378 2376 2147
+4 2146 2401 2378 2147
+4 2380 2378 2379 2630
+4 2122 2378 2376 2146
+4 2122 2362 2378 2146
+4 2380 2122 2175 2123
+4 2380 2122 2376 2175
+4 2122 2376 2378 2380
+4 2122 2380 2362 2123
+4 2362 2122 2378 2380
+4 2365 2362 2380 2123
+4 2379 2380 2362 2378
+4 2379 2362 2380 2365
+4 2378 2366 2621 2401
+4 2630 2379 2621 2378
+4 2621 2379 2623 2372
+4 2623 2621 2630 2379
+4 2362 2379 2378 2366
+4 2372 2379 2362 2366
+4 2621 2379 2372 2366
+4 2378 2379 2621 2366
+4 2366 2378 2146 2401
+4 2366 2378 2362 2146
+4 2146 2362 2116 2108
+4 2151 2401 2146 2147
+4 2149 2401 2146 2151
+4 2149 2402 2401 2151
+4 2115 2370 2146 2149
+4 2128 2372 2362 2117
+4 2370 2372 2128 2117
+4 2366 2372 2370 2117
+4 2362 2372 2366 2117
+4 2128 2117 2116 2370
+4 2128 2117 2362 2116
+4 2362 2146 2116 2117
+4 2366 2146 2362 2117
+4 2370 2146 2366 2117
+4 2116 2146 2370 2117
+4 2115 2370 2116 2146
+4 2116 2114 2370 2115
+4 2114 2370 2128 2116
+4 2370 2366 2621 2372
+4 2366 2370 2401 2146
+4 2401 2370 2621 2402
+4 2401 2370 2366 2621
+4 2401 2370 2149 2146
+4 2402 2401 2370 2149
+4 630 690 873 256
+4 2667 2668 2432 2433
+4 1452 1621 2685 1411
+4 1452 705 1621 1411
+4 2678 2880 2677 2685
+4 2678 2874 2880 2685
+4 2617 2399 2646 2400
+4 2617 2374 2399 2400
+4 2399 2617 2627 2374
+4 2874 2617 2627 2645
+4 2646 2617 2874 2645
+4 2399 2617 2646 2645
+4 2627 2617 2399 2645
+4 2439 2627 2617 2374
+4 2617 2627 2678 2874
+4 2617 2678 2627 2439
+4 2677 2627 2678 2439
+4 2678 2880 2627 2677
+4 2880 2874 2627 2645
+4 2880 2627 2874 2678
+4 2737 2874 2678 2685
+4 2617 2646 2647 2400
+4 2678 2874 2672 2617
+4 2672 2874 2737 2886
+4 2672 2737 2874 2678
+4 2647 2672 2886 2646
+4 2617 2672 2647 2646
+4 2874 2672 2617 2646
+4 2886 2672 2874 2646
+4 2895 2874 2645 2646
+4 2895 2886 2874 2646
+4 2895 2880 2881 2645
+4 2895 2874 2880 2645
+4 1621 1667 2685 2880
+4 1621 1667 1452 2685
+4 1666 1667 705 1619
+4 705 1667 1555 1452
+4 1555 1667 705 1666
+4 705 1667 1621 1619
+4 1621 1667 705 1452
+4 1666 1667 2895 1555
+4 2881 1667 1666 1619
+4 2881 1667 2895 1666
+4 1667 2895 2880 2881
+4 1621 1667 2881 1619
+4 1621 1667 2880 2881
+4 2737 1667 2685 1452
+4 2737 1555 1667 1452
+4 2874 1667 2685 2737
+4 2880 1667 2874 2895
+4 2874 1667 2880 2685
+4 1555 2886 2737 1667
+4 2895 2886 1555 1667
+4 2874 2886 2895 1667
+4 2737 2886 2874 1667
+4 2628 2627 2677 2439
+4 2628 2374 2627 2439
+4 2628 2399 2627 2374
+4 2628 2373 2399 2374
+4 2882 1621 2881 1619
+4 2685 1621 2686 1411
+4 2631 2880 2645 2881
+4 2631 2882 2880 2881
+4 2627 2628 2645 2399
+4 2631 2628 2880 2667
+4 2645 2628 2880 2631
+4 2880 2645 2627 2628
+4 2677 2880 2628 2667
+4 2628 2627 2880 2677
+4 2667 2628 2431 2631
+4 2432 2431 2628 2373
+4 2628 2667 2431 2432
+4 2431 2628 2645 2631
+4 2399 2628 2431 2373
+4 2399 2645 2431 2628
+4 2667 2631 2882 2880
+4 2668 2667 2631 2882
+4 2668 2667 2431 2631
+4 2431 2667 2668 2432
+4 2882 2667 2777 2668
+4 2880 2882 1621 2881
+4 2777 2880 2667 2882
+4 2777 1621 2880 2882
+4 2677 2880 2676 2685
+4 2676 2880 2667 2777
+4 2667 2880 2676 2677
+4 2685 2686 1621 2880
+4 2676 2686 2685 2880
+4 2777 2686 2676 2880
+4 1621 2686 2777 2880
+4 2545 2668 2667 2433
+4 2674 2668 2667 2545
+4 1411 705 614 1452
+4 1411 689 630 614
+4 1411 705 689 614
+4 1429 1470 2714 1506
+4 1429 873 1470 1506
+4 630 1470 1429 873
+4 630 690 1470 873
+4 1470 1472 630 1429
+4 689 1471 690 1620
+4 690 630 1470 1471
+4 689 630 690 1471
+4 1472 630 689 1471
+4 1470 630 1472 1471
+4 689 1471 1617 1472
+4 1679 1618 1620 1471
+4 1617 1618 1679 1471
+4 689 1618 1617 1471
+4 1620 1618 689 1471
+4 2765 1471 1617 1679
+4 2714 1472 1470 1429
+4 2756 1472 1471 1470
+4 2765 1617 1471 2756
+4 2776 1617 2765 2756
+4 1472 1617 2776 2756
+4 1471 1617 1472 2756
+4 2756 1472 2714 2776
+4 1470 1472 2714 2756
+4 1411 1472 1429 630
+4 1411 689 1472 630
+4 1621 689 1472 1411
+4 1621 705 689 1411
+4 1617 1621 689 1472
+4 1618 1619 705 689
+4 1617 1619 1618 689
+4 1621 1619 1617 689
+4 705 1619 1621 689
+4 1617 1621 2882 1619
+4 2776 1621 1617 1472
+4 2882 1621 1617 2776
+4 1411 1472 2686 1429
+4 2686 1621 1472 1411
+4 1621 1472 2777 2686
+4 2686 1472 2714 1429
+4 2714 2777 1472 2686
+4 2777 1472 2776 2714
+4 2777 1472 1621 2776
+4 2777 1621 2882 2776
+4 2776 2777 2668 2882
+4 2674 2777 2776 2714
+4 2776 2777 2674 2668
+4 2667 2674 2777 2668
+4 2674 2777 2676 2667
+4 2713 2714 2674 2812
+4 2674 2676 2777 2714
+4 2713 2676 2674 2714
+4 2686 2676 2713 2714
+4 2777 2676 2686 2714
+4 1506 2714 2713 2812
+4 1429 2714 2713 1506
+4 1429 2714 2686 2713
+4 2410 2405 2620 2394
+4 2410 2157 2405 2394
+4 2407 2153 2409 2154
+4 2407 2150 2153 2154
+4 2895 2894 1666 1555
+4 2895 2886 2894 1555
+4 2647 2648 2646 2886
+4 2646 2406 2648 2647
+4 2646 2400 2406 2647
+4 2399 2377 2400 2142
+4 2399 2406 2646 2400
+4 2399 2377 2406 2400
+4 2377 2398 2629 2376
+4 2648 2406 2646 2644
+4 2629 2406 2648 2644
+4 2399 2406 2629 2644
+4 2646 2406 2399 2644
+4 2398 2629 2644 2399
+4 2629 2399 2377 2406
+4 2377 2629 2398 2399
+4 2373 2377 2399 2142
+4 2373 2141 2377 2142
+4 2398 2373 2377 2399
+4 2176 2141 2376 2398
+4 2373 2141 2176 2398
+4 2377 2141 2373 2398
+4 2376 2141 2377 2398
+4 2373 2398 2431 2399
+4 2431 2398 2176 2376
+4 2431 2398 2373 2176
+4 2645 2398 2399 2431
+4 2629 2644 2645 2398
+4 2646 2895 2648 2644
+4 2645 2895 2646 2644
+4 2875 2895 2645 2644
+4 2648 2895 2875 2644
+4 2629 2644 2875 2645
+4 2648 2644 2875 2629
+4 2895 2648 2886 2646
+4 2895 2648 2894 2886
+4 2648 2894 2875 2895
+4 2399 2644 2645 2646
+4 2399 2644 2398 2645
+4 2175 2376 2431 2176
+4 2431 2380 2376 2175
+4 1666 2895 2875 2894
+4 2631 2645 2630 2881
+4 2631 2630 2645 2398
+4 2380 2630 2631 2398
+4 2629 2630 2380 2398
+4 2645 2630 2629 2398
+4 2631 2398 2431 2380
+4 2631 2398 2645 2431
+4 2630 2881 2645 2629
+4 2878 2881 2630 2629
+4 2875 2881 2878 2629
+4 2645 2881 2875 2629
+4 2398 2380 2376 2431
+4 2376 2398 2629 2380
+4 1666 2875 2881 2878
+4 2881 2875 2895 2645
+4 1666 2875 2895 2881
+4 2400 2377 2150 2142
+4 2407 2406 2400 2647
+4 2407 2400 2406 2153
+4 2150 2400 2407 2153
+4 2377 2400 2150 2153
+4 2406 2400 2377 2153
+4 2409 2407 2406 2153
+4 2885 2894 2886 1555
+4 2885 2893 2894 1555
+4 2651 2648 2885 2649
+4 2651 2406 2648 2649
+4 2438 2651 2647 2673
+4 2409 2651 2406 2407
+4 2438 2651 2409 2407
+4 2647 2651 2438 2407
+4 2406 2651 2647 2407
+4 2648 2651 2647 2406
+4 2673 2651 2647 2886
+4 2885 2651 2673 2886
+4 2648 2651 2885 2886
+4 2647 2651 2648 2886
+4 2885 2649 2650 2651
+4 2885 2649 2893 2650
+4 2648 2885 2894 2886
+4 2894 2649 2885 2648
+4 2649 2893 2894 2885
+4 2885 2893 2654 2650
+4 2868 2893 2885 1555
+4 2654 2893 2885 2868
+4 2876 2893 2649 2650
+4 2876 2654 2893 2650
+4 2649 2648 2629 2406
+4 2876 2875 1666 2878
+4 2876 1666 2894 2893
+4 2869 1666 2876 2893
+4 1555 1666 2869 2893
+4 2894 1666 1555 2893
+4 2894 2876 2875 1666
+4 2875 2894 2893 2876
+4 2649 2875 2876 2878
+4 2649 2875 2893 2876
+4 2875 2893 2894 2649
+4 2629 2875 2649 2878
+4 2649 2648 2875 2629
+4 2648 2875 2894 2649
+4 2654 2893 2869 2876
+4 2869 2893 2868 1555
+4 2869 2893 2654 2868
+4 2620 2876 2650 2654
+4 2378 2629 2630 2380
+4 2378 2376 2629 2380
+4 2408 2402 2157 2152
+4 2410 2402 2405 2157
+4 2410 2408 2402 2157
+4 2876 2618 2622 2619
+4 2621 2649 2402 2405
+4 2621 2649 2401 2402
+4 2621 2629 2630 2378
+4 2629 2621 2878 2649
+4 2629 2621 2630 2878
+4 2401 2629 2621 2378
+4 2401 2629 2649 2621
+4 2623 2621 2878 2630
+4 2618 2649 2621 2405
+4 2622 2621 2878 2623
+4 2878 2622 2876 2649
+4 2621 2622 2878 2649
+4 2618 2622 2621 2649
+4 2876 2622 2618 2649
+4 2620 2618 2650 2876
+4 2405 2650 2620 2618
+4 2410 2405 2650 2620
+4 2650 2618 2649 2876
+4 2649 2650 2405 2618
+4 2405 2650 2649 2410
+4 2876 2618 2619 2620
+4 2410 2649 2651 2650
+4 2402 2649 2410 2405
+4 2649 2410 2408 2402
+4 2410 2649 2408 2651
+4 2408 2151 2402 2152
+4 2408 2155 2151 2152
+4 2406 2375 2151 2153
+4 2401 2406 2402 2649
+4 2151 2406 2401 2375
+4 2402 2406 2401 2151
+4 2406 2401 2629 2649
+4 2629 2406 2375 2401
+4 2377 2375 2406 2153
+4 2629 2375 2406 2377
+4 2147 2377 2375 2378
+4 2376 2377 2147 2378
+4 2629 2377 2376 2378
+4 2375 2377 2629 2378
+4 2401 2375 2378 2147
+4 2401 2375 2629 2378
+4 2153 2375 2147 2377
+4 2147 2151 2375 2153
+4 2151 2375 2401 2147
+4 2151 2406 2408 2402
+4 2409 2155 2153 2406
+4 2408 2155 2409 2406
+4 2151 2155 2408 2406
+4 2153 2155 2151 2406
+4 2651 2406 2408 2409
+4 2408 2406 2649 2402
+4 2408 2649 2406 2651
+4 2155 2153 2154 2409
+4 553 555 115 554
+4 1867 2116 1866 1865
+4 2106 2112 2111 2129
+4 2106 2359 2112 2129
+4 1866 2111 2116 1867
+4 1866 2111 2107 2116
+4 2111 2107 1855 1866
+4 2106 2107 1855 2111
+4 2106 2112 2107 2111
+4 1058 1755 2191 2189
+4 2832 2820 2828 2730
+4 2832 2816 2820 2730
+4 2832 2367 2816 2730
+4 2588 2837 2590 2589
+4 2588 2592 2837 2589
+4 2588 2587 2592 2589
+4 2643 2835 2796 2683
+4 2643 2839 2835 2683
+4 296 271 895 355
+4 1016 585 373 553
+4 1016 813 845 373
+4 1016 585 813 373
+4 1359 826 1829 791
+4 1880 855 1877 896
+4 1877 1880 826 855
+4 1878 826 1879 1877
+4 2835 1881 2839 2643
+4 1874 2835 1881 2839
+4 1874 2837 2835 2839
+4 2835 1874 2833 2836
+4 2837 1874 2835 2836
+4 2834 1874 2837 2836
+4 2833 1874 2834 2836
+4 2838 2834 1874 2837
+4 1878 1874 2834 2833
+4 1874 1878 2834 2838
+4 1881 1874 2833 2835
+4 1878 1874 2833 1879
+4 826 1874 1878 1879
+4 1881 1874 826 1879
+4 2833 1874 1881 1879
+4 2642 1359 1874 1829
+4 2642 1874 1359 2643
+4 2839 1874 2642 2643
+4 1881 1874 2839 2643
+4 1359 1874 1881 2643
+4 826 1874 1359 1829
+4 826 1881 1359 1874
+4 1874 826 1876 1829
+4 2832 1878 1876 2838
+4 1876 1880 1878 2832
+4 1880 1878 826 1876
+4 1880 826 1878 1877
+4 1876 1878 1874 2838
+4 1876 1878 826 1874
+4 1829 813 812 791
+4 1829 826 813 791
+4 845 1388 813 1016
+4 845 1162 1388 1016
+4 1388 826 813 1829
+4 1388 1876 826 1829
+4 1920 1875 1162 2367
+4 1920 1880 1875 2367
+4 845 1388 855 813
+4 855 1875 1922 896
+4 1880 1875 855 896
+4 1920 1875 1880 896
+4 1922 1875 1920 896
+4 896 1922 845 1920
+4 896 1922 855 845
+4 1162 1922 1920 845
+4 1920 1875 1922 1162
+4 1875 1388 855 1922
+4 1162 1388 1875 1922
+4 845 1388 1162 1922
+4 855 1388 845 1922
+4 1875 1880 2832 2367
+4 1875 1880 1876 2832
+4 855 1388 826 813
+4 1388 1875 855 826
+4 1876 1875 1388 826
+4 1880 1875 1876 826
+4 855 1875 1880 826
+4 585 813 1388 1016
+4 1388 813 812 1829
+4 1388 813 585 812
+4 2837 2834 2590 2838
+4 2588 2834 2837 2836
+4 2837 2834 2588 2590
+4 222 813 791 812
+4 222 585 813 812
+4 1359 1881 1489 2643
+4 896 271 854 895
+4 854 855 271 896
+4 854 1877 855 896
+4 1861 826 1877 1879
+4 1861 1842 826 1879
+4 825 826 1861 1842
+4 1877 854 855 826
+4 1861 854 1877 826
+4 825 854 1861 826
+4 855 854 825 826
+4 853 854 1861 825
+4 855 825 226 826
+4 854 825 226 855
+4 853 854 825 226
+4 825 826 223 226
+4 792 826 825 1842
+4 223 826 825 792
+4 1881 826 1842 1879
+4 1359 1489 1881 826
+4 792 1489 1359 826
+4 1842 1489 792 826
+4 1881 1489 1842 826
+4 791 826 792 1359
+4 224 813 223 222
+4 224 813 226 223
+4 226 838 813 224
+4 838 813 855 226
+4 226 813 826 223
+4 855 813 826 226
+4 223 813 791 222
+4 791 223 826 813
+4 223 826 792 791
+4 225 838 226 224
+4 271 838 226 225
+4 226 854 271 853
+4 855 226 271 838
+4 271 855 854 226
+4 585 224 117 222
+4 585 813 224 222
+4 373 225 296 55
+4 296 845 225 373
+4 895 896 271 838
+4 845 896 895 838
+4 855 896 845 838
+4 271 896 855 838
+4 895 845 838 271
+4 296 845 895 271
+4 225 845 296 271
+4 838 845 225 271
+4 225 373 118 55
+4 845 838 813 855
+4 813 373 224 838
+4 845 373 813 838
+4 225 373 845 838
+4 224 373 225 838
+4 118 225 224 373
+4 115 118 373 55
+4 373 224 585 813
+4 115 556 555 553
+4 115 556 117 555
+4 117 118 556 115
+4 373 556 115 553
+4 373 556 118 115
+4 585 556 118 373
+4 117 556 585 555
+4 117 556 118 585
+4 553 556 585 373
+4 555 556 585 553
+4 224 585 118 373
+4 117 118 224 585
+4 2796 1881 2835 2643
+4 2796 1489 1881 2643
+4 1841 1842 1489 792
+4 1841 825 1842 792
+4 2835 2833 2584 2836
+4 2841 1881 1842 1879
+4 2841 2833 1881 1879
+4 2811 2815 2797 2665
+4 2811 2584 2815 2665
+4 2835 2814 2811 2584
+4 2811 2797 2814 2835
+4 2796 2797 2811 2835
+4 1881 2797 2796 2835
+4 2814 2797 1881 2835
+4 2833 2814 2835 2584
+4 2833 2814 1881 2835
+4 1881 2814 2815 2797
+4 2815 2814 2833 2584
+4 2815 2814 1881 2833
+4 2815 2814 2811 2797
+4 2815 2814 2584 2811
+4 2815 1881 2841 2833
+4 2842 2815 2665 2797
+4 2842 2815 2608 2665
+4 2608 2841 2815 2842
+4 1881 2815 2842 2797
+4 1881 2815 2841 2842
+4 1489 1881 2797 2796
+4 2842 1881 1842 2841
+4 2842 1841 1842 1881
+4 2797 1841 2842 1881
+4 1489 1841 2797 1881
+4 1842 1841 1489 1881
+4 2842 2841 2861 2608
+4 2841 1842 1861 1879
+4 1861 2842 1842 2841
+4 1861 2861 2842 2841
+4 2861 1861 1860 1692
+4 2842 1861 1860 2861
+4 1860 2842 1842 1861
+4 1860 1842 2842 1841
+4 825 1842 1860 1841
+4 1860 1861 853 1692
+4 1861 1860 825 1842
+4 853 1861 1860 825
+4 895 763 1058 355
+4 895 271 763 355
+4 1921 896 895 845
+4 1921 1920 896 845
+4 763 854 853 271
+4 763 895 854 271
+4 1692 854 1861 853
+4 1692 763 854 853
+4 2828 1878 2820 2832
+4 2828 2838 1878 2832
+4 2865 1861 2861 1692
+4 2865 1942 1861 1692
+4 2586 2836 2834 2588
+4 2586 2585 2836 2588
+4 2586 2584 2836 2585
+4 2586 2577 2584 2585
+4 2586 2833 2834 2836
+4 2586 2584 2833 2836
+4 2833 2826 2586 2834
+4 2833 1878 2826 2834
+4 2607 2608 2605 2860
+4 2607 2840 2608 2860
+4 2593 2817 2840 2818
+4 2593 2826 2817 2818
+4 2593 2833 2817 2826
+4 2593 2586 2833 2826
+4 2577 2833 2593 2586
+4 2577 2584 2833 2586
+4 2815 2577 2584 2833
+4 2815 2593 2577 2833
+4 2554 2815 2605 2607
+4 2554 2815 2555 2605
+4 2554 2815 2577 2555
+4 2593 2815 2554 2607
+4 2554 2577 2815 2593
+4 2605 2815 2608 2607
+4 2605 2815 2665 2608
+4 2605 2815 2555 2665
+4 2555 2815 2584 2665
+4 2584 2577 2815 2555
+4 2840 2607 2608 2594
+4 2593 2607 2840 2594
+4 2815 2607 2593 2594
+4 2608 2607 2815 2594
+4 2608 2594 2841 2840
+4 2815 2594 2841 2608
+4 2841 2833 2817 2594
+4 2815 2833 2841 2594
+4 2593 2833 2815 2594
+4 2817 2833 2593 2594
+4 2840 2594 2817 2593
+4 2841 2594 2817 2840
+4 1879 2817 2841 2833
+4 2818 1879 1942 2831
+4 2818 1879 2840 1942
+4 2840 2817 1879 2818
+4 2817 1879 2841 2840
+4 2840 1879 1861 1942
+4 2841 1879 1861 2840
+4 1942 1879 1877 2831
+4 1861 1879 1877 1942
+4 1879 2831 1878 1877
+4 2818 2819 1879 2831
+4 2818 1879 2826 2817
+4 2818 2826 1879 2819
+4 2827 2819 2818 2831
+4 2818 2826 2819 2827
+4 2827 1878 2826 2819
+4 2831 1878 2827 2819
+4 1879 1878 2831 2819
+4 2826 1878 1879 2819
+4 1879 2826 2833 1878
+4 2833 1879 2817 2826
+4 2840 1861 2865 1942
+4 2840 2861 2860 2865
+4 2861 2840 2608 2841
+4 2840 2861 2608 2860
+4 2861 2840 1861 2865
+4 1861 2861 2841 2840
+4 1878 2821 2838 2828
+4 1878 2821 2834 2838
+4 2826 2834 2821 2578
+4 2821 1878 2834 2826
+4 2838 2821 2590 2828
+4 2590 2834 2821 2838
+4 2834 2821 2578 2590
+4 2821 1878 2820 2828
+4 2827 1878 2821 2826
+4 2821 2820 1878 2827
+4 2588 2834 2578 2590
+4 2586 2834 2578 2588
+4 2826 2834 2578 2586
+4 2851 2850 1995 2806
+4 1995 896 1921 1920
+4 1756 2850 1995 2851
+4 1756 1759 2850 2851
+4 1756 763 1759 1058
+4 1756 895 763 1058
+4 1692 1759 854 763
+4 854 1943 1877 896
+4 1877 1942 1943 854
+4 1861 1942 1877 854
+4 1759 1942 1861 854
+4 1943 1942 1759 854
+4 1861 1759 1692 1942
+4 1861 1759 854 1692
+4 1942 1943 2831 1877
+4 2850 1943 1942 1759
+4 2850 1943 2831 1942
+4 854 1756 895 763
+4 854 1759 1756 763
+4 896 1756 1943 1995
+4 1943 854 1756 896
+4 1759 1943 854 1756
+4 1943 1756 2850 1995
+4 2850 1943 1759 1756
+4 1756 896 1921 1995
+4 896 1756 895 854
+4 895 896 1921 1756
+4 2864 1759 2851 2850
+4 2864 1942 1759 2850
+4 1755 1759 763 1058
+4 1755 1759 1692 763
+4 2865 1692 2867 1942
+4 2867 1692 2866 1755
+4 2866 2865 1692 2867
+4 1942 2864 1759 1692
+4 2867 2864 1942 1692
+4 1755 2864 2867 1692
+4 1759 2864 1755 1692
+4 2191 1759 1058 1756
+4 1755 1759 2191 2864
+4 1058 1755 1759 2191
+4 2851 1759 2191 1756
+4 2851 1759 2864 2191
+4 2816 1880 1920 2367
+4 1995 1880 896 1920
+4 1995 2816 1880 1920
+4 1880 1943 1995 896
+4 1880 1877 1943 896
+4 2850 1943 2830 2831
+4 2807 2830 1995 2816
+4 2850 1995 2830 1943
+4 1995 2806 2830 2807
+4 1995 2850 2830 2806
+4 1880 1995 2830 2816
+4 1880 1943 2830 1995
+4 2830 1877 1943 1880
+4 1877 2830 1943 2831
+4 2820 2816 2830 2807
+4 2832 1880 2816 2367
+4 1880 2820 1878 2832
+4 2827 2820 1878 2829
+4 2830 2820 2827 2829
+4 1880 2820 2830 2829
+4 1878 2820 1880 2829
+4 2827 2829 2831 2830
+4 2827 2829 1878 2831
+4 1878 1877 2831 2829
+4 1880 1877 1878 2829
+4 2830 1877 1880 2829
+4 2831 1877 2830 2829
+4 1880 2820 2816 2830
+4 2832 1880 2820 2816
+4 2551 2584 2811 2665
+4 2551 2555 2584 2665
+4 2584 2579 2835 2836
+4 2584 2585 2579 2836
+4 2330 2579 2584 2585
+4 2330 2336 2579 2585
+4 2666 2591 2442 2683
+4 2328 2552 2430 2298
+4 2441 2552 2430 2328
+4 2430 2441 2666 2552
+4 2441 2666 2591 2430
+4 2552 2441 2579 2328
+4 2666 2441 2579 2552
+4 2579 2666 2591 2441
+4 2442 2591 2430 2441
+4 2430 2666 2591 2442
+4 2328 2579 2336 2441
+4 2328 2330 2302 2336
+4 2328 2302 2330 2552
+4 2298 2302 2328 2552
+4 2296 2302 2298 2552
+4 2330 2302 2296 2552
+4 2330 2328 2579 2336
+4 2579 2330 2552 2328
+4 2552 2330 2551 2296
+4 2811 2835 2666 2796
+4 2552 2584 2811 2551
+4 2552 2811 2584 2579
+4 2666 2811 2552 2579
+4 2835 2811 2666 2579
+4 2584 2811 2835 2579
+4 2584 2552 2330 2551
+4 2330 2584 2579 2552
+4 2666 2835 2683 2796
+4 2835 2666 2591 2579
+4 2666 2835 2591 2683
+4 2551 2330 2329 2296
+4 2330 2584 2577 2585
+4 2551 2329 2330 2584
+4 2555 2329 2551 2584
+4 2577 2329 2555 2584
+4 2330 2329 2577 2584
+4 2837 2836 2592 2588
+4 2839 2591 2835 2683
+4 2591 2592 2579 2441
+4 2591 2835 2592 2839
+4 2579 2592 2835 2836
+4 2579 2591 2835 2592
+4 2592 2835 2837 2839
+4 2837 2836 2835 2592
+4 2684 2591 2441 2592
+4 2442 2591 2684 2683
+4 2442 2591 2441 2684
+4 2839 2591 2684 2592
+4 2839 2591 2683 2684
+4 2587 2579 2441 2336
+4 2592 2836 2587 2588
+4 2592 2579 2587 2836
+4 2441 2579 2587 2592
+4 2585 2579 2587 2336
+4 2587 2836 2585 2588
+4 2585 2579 2836 2587
+4 2607 2605 2606 2860
+4 2557 2820 2807 2816
+4 2557 2730 2820 2816
+4 2338 2341 2312 2343
+4 2338 2589 2341 2343
+4 2338 2588 2341 2589
+4 2338 2587 2588 2589
+4 2048 2311 2055 2047
+4 2090 2337 2338 2333
+4 2090 2331 2337 2333
+4 2097 2337 2090 2331
+4 2097 2345 2337 2331
+4 2345 2097 2101 2178
+4 2090 2310 2050 2312
+4 2090 2342 2310 2312
+4 2565 2337 2345 2586
+4 2565 2342 2337 2586
+4 2050 2097 2104 2310
+4 2090 2097 2050 2310
+4 2307 2097 2090 2310
+4 2104 2097 2307 2310
+4 2090 2307 2337 2097
+4 2342 2307 2090 2310
+4 2337 2342 2307 2090
+4 2101 2097 2307 2104
+4 2345 2307 2097 2337
+4 2101 2345 2307 2097
+4 2307 2310 2313 2104
+4 2565 2337 2307 2345
+4 2565 2342 2307 2337
+4 2310 2307 2565 2342
+4 2307 2310 2565 2313
+4 2588 2337 2342 2586
+4 2312 2090 2342 2341
+4 2338 2090 2312 2341
+4 2337 2090 2338 2341
+4 2342 2090 2337 2341
+4 2341 2337 2588 2338
+4 2341 2337 2342 2588
+4 2587 2337 2333 2338
+4 2587 2588 2337 2338
+4 2086 2296 2302 2075
+4 2302 2086 2330 2296
+4 2086 2330 2336 2302
+4 2333 2585 2337 2587
+4 2333 2336 2585 2587
+4 2331 2585 2337 2333
+4 2345 2331 2330 2577
+4 2337 2331 2345 2577
+4 2585 2331 2337 2577
+4 2330 2331 2585 2577
+4 2336 2333 2585 2330
+4 2086 2333 2336 2330
+4 2331 2333 2086 2330
+4 2585 2333 2331 2330
+4 2588 2337 2585 2587
+4 2586 2337 2585 2588
+4 2586 2337 2577 2585
+4 2577 2345 2337 2586
+4 2077 2296 2086 2075
+4 2345 2331 2178 2329
+4 2330 2331 2345 2329
+4 2077 2331 2330 2329
+4 2178 2331 2077 2329
+4 2086 2330 2077 2331
+4 2077 2330 2296 2329
+4 2077 2296 2330 2086
+4 2097 2178 2331 2077
+4 2331 2345 2178 2097
+4 2330 2345 2577 2329
+4 2097 2104 1849 2050
+4 2102 2178 2097 2077
+4 2102 2101 2097 2178
+4 2103 2097 2104 1849
+4 2097 2103 2101 2102
+4 2103 2097 2101 2104
+4 2050 2310 2311 2312
+4 2314 2310 2053 2313
+4 2311 2053 2310 2050
+4 2311 2053 2314 2310
+4 2314 2311 2055 2053
+4 2048 2311 2053 2055
+4 2048 2311 2050 2053
+4 1849 2050 2053 2048
+4 2104 2050 2053 1849
+4 2053 2104 2310 2050
+4 2053 2313 2310 2104
+4 2590 2341 2588 2589
+4 2590 2343 2341 2589
+4 2342 2572 2312 2341
+4 2310 2572 2312 2342
+4 2055 2311 2049 2047
+4 2308 2311 2316 2322
+4 2054 2055 2316 2308
+4 2049 2055 2054 2308
+4 2311 2055 2049 2308
+4 2316 2055 2311 2308
+4 2055 2316 2314 2054
+4 2314 2311 2316 2055
+4 2054 2308 2064 2049
+4 2054 2064 2308 2316
+4 2306 2064 2054 2316
+4 2317 2064 2306 2316
+4 2308 2064 2317 2316
+4 2315 2316 2054 2314
+4 2306 2316 2564 2317
+4 2306 2316 2315 2564
+4 2315 2054 2316 2306
+4 2315 2316 2572 2564
+4 2314 2316 2572 2315
+4 2312 2316 2311 2322
+4 2312 2311 2316 2572
+4 2310 2311 2312 2572
+4 2314 2311 2310 2572
+4 2316 2311 2314 2572
+4 2042 2308 2049 2064
+4 2042 2071 2308 2064
+4 2308 2045 2309 2071
+4 2308 2042 2045 2071
+4 2311 2308 2057 2322
+4 1799 2057 2049 2042
+4 2047 2057 2049 1799
+4 2047 2057 2311 2049
+4 2049 2057 2308 2042
+4 2311 2057 2308 2049
+4 2042 2057 2045 1799
+4 2057 2308 2309 2322
+4 2057 2308 2045 2309
+4 2045 2308 2057 2042
+4 2326 2308 2071 2064
+4 2326 2317 2308 2064
+4 2071 2309 2072 2045
+4 2327 2309 2323 2072
+4 2327 2071 2309 2072
+4 2326 2571 2573 2575
+4 2326 2327 2571 2575
+4 2309 2571 2327 2323
+4 2309 2322 2571 2323
+4 2572 2322 2316 2312
+4 2317 2571 2573 2326
+4 2317 2308 2571 2326
+4 2316 2571 2308 2322
+4 2571 2316 2317 2573
+4 2308 2571 2316 2317
+4 2571 2316 2572 2322
+4 2572 2316 2571 2573
+4 2564 2316 2573 2317
+4 2573 2572 2316 2564
+4 2308 2571 2309 2322
+4 2071 2327 2309 2308
+4 2326 2327 2071 2308
+4 2571 2327 2326 2308
+4 2309 2327 2571 2308
+4 2574 2571 2323 2327
+4 2574 2575 2571 2327
+4 2574 2322 2343 2323
+4 2574 2571 2322 2323
+4 2312 2572 2343 2341
+4 2322 2572 2343 2312
+4 2322 2572 2574 2343
+4 2322 2572 2571 2574
+4 2590 2572 2343 2574
+4 2590 2572 2341 2343
+4 2574 2572 2828 2590
+4 2574 2828 2572 2571
+4 2575 2828 2574 2571
+4 2573 2828 2575 2571
+4 2572 2828 2573 2571
+4 2578 2565 2826 2586
+4 2578 2342 2565 2586
+4 2565 2572 2310 2342
+4 2565 2578 2572 2342
+4 2564 2572 2567 2573
+4 2315 2572 2567 2564
+4 2567 2314 2572 2315
+4 2567 2313 2565 2572
+4 2314 2313 2567 2572
+4 2310 2313 2314 2572
+4 2565 2313 2310 2572
+4 2567 2572 2821 2573
+4 2826 2567 2565 2578
+4 2821 2567 2826 2578
+4 2572 2567 2821 2578
+4 2565 2567 2572 2578
+4 2588 2342 2578 2586
+4 2821 2572 2828 2573
+4 2821 2572 2590 2828
+4 2590 2578 2572 2821
+4 2578 2590 2572 2342
+4 2588 2590 2578 2342
+4 2341 2590 2588 2342
+4 2572 2590 2341 2342
+4 2356 2101 2104 2103
+4 2104 2356 2307 2101
+4 2104 2355 2307 2356
+4 2355 2307 2313 2104
+4 2313 2355 2565 2307
+4 2576 2820 2827 2830
+4 2827 2826 2569 2818
+4 2564 2563 2573 2821
+4 2568 2563 2564 2821
+4 2820 2563 2568 2821
+4 2573 2563 2820 2821
+4 2564 2821 2567 2568
+4 2567 2573 2821 2564
+4 2576 2820 2563 2568
+4 2827 2569 2826 2821
+4 2568 2569 2827 2821
+4 2567 2569 2568 2821
+4 2826 2569 2567 2821
+4 2820 2568 2827 2821
+4 2576 2820 2568 2827
+4 2561 2820 2563 2576
+4 2562 2573 2318 2563
+4 2318 2319 2573 2562
+4 2318 2317 2573 2319
+4 2318 2573 2564 2563
+4 2564 2317 2573 2318
+4 2562 2563 2820 2573
+4 2563 2820 2561 2562
+4 2569 2826 2593 2818
+4 2569 2566 2593 2826
+4 2567 2566 2569 2826
+4 2565 2566 2567 2826
+4 2593 2566 2565 2826
+4 2313 2565 2566 2567
+4 2566 2565 2355 2593
+4 2313 2565 2355 2566
+4 2561 2820 2557 2562
+4 2807 2820 2576 2830
+4 2561 2820 2807 2557
+4 2561 2820 2576 2807
+4 2828 2573 2820 2821
+4 2730 2573 2820 2828
+4 2730 2575 2573 2828
+4 2560 2573 2730 2575
+4 2730 2560 2557 2820
+4 2573 2560 2730 2820
+4 2562 2560 2573 2820
+4 2557 2560 2562 2820
+4 2326 2573 2560 2575
+4 2560 2573 2319 2562
+4 2560 2573 2326 2319
+4 2326 2573 2317 2319
+4 2318 2317 2306 2564
+4 2064 2317 2319 2326
+4 2318 2317 2064 2306
+4 2064 2317 2318 2319
+4 2102 2101 2356 2103
+4 2356 2178 2101 2102
+4 2593 2565 2586 2826
+4 2593 2345 2577 2586
+4 2593 2565 2345 2586
+4 2345 2355 2307 2565
+4 2345 2593 2355 2565
+4 2605 2606 2554 2607
+4 2434 2554 2605 2606
+4 2434 2554 2555 2605
+4 2554 2555 2577 2434
+4 2593 2554 2606 2607
+4 2593 2554 2434 2606
+4 2554 2434 2577 2593
+4 2345 2434 2593 2577
+4 2356 2355 2345 2434
+4 2606 2355 2356 2434
+4 2593 2355 2606 2434
+4 2345 2355 2593 2434
+4 2178 2345 2434 2356
+4 2434 2577 2329 2555
+4 2434 2329 2345 2178
+4 2329 2345 2577 2434
+4 2307 2345 2356 2355
+4 2101 2356 2345 2178
+4 2307 2345 2101 2356
+4 2359 2112 2358 2106
+4 2865 2862 2859 2866
+4 2865 2862 2860 2859
+4 2860 2861 2862 2865
+4 2606 2614 2615 2860
+4 2435 2352 2180 2292
+4 2615 2363 2606 2358
+4 2606 2614 2363 2615
+4 2614 2363 2435 2606
+4 2180 2363 2358 2352
+4 2435 2363 2180 2352
+4 2606 2363 2435 2352
+4 2358 2363 2606 2352
+4 2358 2363 2359 2615
+4 2363 2358 2112 2180
+4 2358 2363 2112 2359
+4 2614 2606 2669 2860
+4 2435 2606 2669 2614
+4 2669 2434 2435 2546
+4 2606 2435 2434 2352
+4 2434 2669 2435 2606
+4 2435 2434 2292 2546
+4 2292 2352 2434 2435
+4 2605 2669 2606 2860
+4 2555 2434 2669 2546
+4 2434 2669 2605 2555
+4 2605 2669 2434 2606
+4 2329 2294 2076 2292
+4 2294 2297 2551 2329
+4 2076 2297 2294 2329
+4 2296 2297 2076 2329
+4 2551 2297 2296 2329
+4 2551 2329 2546 2294
+4 2546 2555 2329 2551
+4 2555 2329 2434 2546
+4 2546 2329 2292 2294
+4 2292 2434 2329 2546
+4 2665 2555 2546 2551
+4 2665 2555 2669 2546
+4 2665 2605 2669 2555
+4 2605 2669 2608 2665
+4 2860 2669 2608 2605
+4 2609 2669 2860 2614
+4 2609 2860 2669 2608
+4 2860 2861 2609 2862
+4 2860 2609 2861 2608
+4 2294 2292 2113 2076
+4 1692 2865 2862 2861
+4 2866 2862 1692 2865
+4 2862 1692 1758 2866
+4 2102 2105 2180 2107
+4 2357 2105 2180 2178
+4 2356 2105 2357 2178
+4 2102 2105 2356 2178
+4 2180 2105 2102 2178
+4 2105 2180 2358 2357
+4 2105 2358 2180 2107
+4 2106 2358 2105 2107
+4 2112 2358 2106 2107
+4 2180 2358 2112 2107
+4 2103 2102 2105 2356
+4 1855 2102 2105 2103
+4 2105 2107 1855 2106
+4 2105 2107 2102 1855
+4 2180 2357 2352 2358
+4 2434 2178 2357 2352
+4 2292 2178 2434 2352
+4 2180 2178 2292 2352
+4 2357 2178 2180 2352
+4 2606 2352 2357 2358
+4 2606 2352 2434 2357
+4 2356 2434 2357 2606
+4 2356 2434 2178 2357
+4 2329 2292 2178 2434
+4 2077 2073 2074 2037
+4 2074 2075 2076 2329
+4 2077 2075 2074 2329
+4 2296 2075 2077 2329
+4 2076 2075 2296 2329
+4 2329 2077 2073 2074
+4 2113 2292 2074 2076
+4 2074 2037 2292 2113
+4 2074 2073 2292 2037
+4 2329 2074 2292 2076
+4 2329 2073 2292 2074
+4 2180 2037 2178 2102
+4 2178 2292 2037 2180
+4 2178 2292 2073 2037
+4 2077 2178 2037 2102
+4 2077 2178 2073 2037
+4 2178 2073 2329 2077
+4 2329 2073 2178 2292
+4 2037 2180 2107 2102
+4 2037 2180 2036 2107
+4 2036 2037 2292 2180
+4 2036 2292 2037 2113
+4 2297 2296 2552 2551
+4 2297 2296 2298 2552
+4 2075 2076 2296 2302
+4 2040 2076 2075 2302
+4 2297 2076 2040 2302
+4 2296 2076 2297 2302
+4 2302 2297 2298 2040
+4 2298 2296 2297 2302
+4 1784 1758 1755 2866
+4 763 1755 1757 1758
+4 1757 1058 1755 763
+4 2190 1755 1058 2189
+4 2190 1058 1755 1757
+4 1755 1757 2856 2190
+4 1755 1757 1784 2856
+4 1757 1784 1758 1755
+4 1758 1755 1692 763
+4 1692 1758 2866 1755
+4 2076 2040 1929 2177
+4 2121 2377 2141 2142
+4 2121 2150 2377 2142
+4 1929 2076 2075 2040
+4 2076 2075 1857 1929
+4 1890 1896 1643 1645
+4 1888 1896 1643 1890
+4 1888 1895 1643 1896
+4 1888 1895 1657 1643
+4 2036 1856 1928 2113
+4 2036 2037 1856 2113
+4 1432 1433 1228 1405
+4 1432 1627 1433 1405
+4 1887 1903 1657 1895
+4 1887 1904 1903 1895
+4 2115 1903 1887 1904
+4 2115 2149 1903 1904
+4 1858 1903 1657 1887
+4 1858 2115 1903 1887
+4 2118 2122 1928 2175
+4 1905 2119 1871 1870
+4 1905 1907 2119 1870
+4 2116 1901 1862 1863
+4 2108 1900 2146 2122
+4 2116 1900 2146 2108
+4 2116 1900 1901 2146
+4 2146 1900 2119 2122
+4 2119 1901 1900 2146
+4 1864 1900 2116 2108
+4 2116 1862 1900 1864
+4 1862 1900 1901 2116
+4 2146 1901 1905 2119
+4 1863 2116 1901 1859
+4 2115 2116 1863 1859
+4 1902 2116 2115 1859
+4 1901 2116 1902 1859
+4 2146 1902 2116 2115
+4 2116 1901 1902 2146
+4 1902 1901 1905 2146
+4 1859 1902 1901 1905
+4 1901 2119 1871 1905
+4 1901 2119 1900 1871
+4 1903 1902 1859 1905
+4 1858 1859 2115 1863
+4 1903 2115 1859 1902
+4 1858 1859 1903 2115
+4 2146 1905 1907 2119
+4 2151 2146 1905 1907
+4 2146 1905 2149 2151
+4 2146 2149 1905 1902
+4 2115 2149 2146 1902
+4 1903 2149 2115 1902
+4 1905 2149 1903 1902
+4 1871 2119 2120 1870
+4 1900 2119 1884 1871
+4 1928 1884 1900 2122
+4 2118 1884 1928 2122
+4 2119 1884 2118 2122
+4 1900 1884 2119 2122
+4 2120 2119 1884 2118
+4 1884 1871 2119 2120
+4 1884 1900 1854 1928
+4 1928 1900 2108 2122
+4 2108 1854 1900 1928
+4 2036 1854 2108 1928
+4 2108 1864 1854 2036
+4 1864 1854 1900 2108
+4 1854 2036 1856 1928
+4 2120 1907 1908 1870
+4 2120 2119 1907 1870
+4 2121 2377 2120 2141
+4 2153 2120 2377 2147
+4 2120 2153 2377 2121
+4 2141 2377 2120 2119
+4 2376 2377 2141 2119
+4 2147 2377 2376 2119
+4 2120 2377 2147 2119
+4 2147 2120 1907 2153
+4 1907 2147 2119 2120
+4 1908 2153 2120 2121
+4 1908 2153 1907 2120
+4 2146 2119 2147 2376
+4 2147 1907 2151 2153
+4 2147 1907 2146 2151
+4 2146 2119 1907 2147
+4 2118 2119 2141 2120
+4 2376 2119 2122 2146
+4 2118 2376 2176 2141
+4 2376 2118 2175 2122
+4 2118 2376 2175 2176
+4 2376 2118 2119 2141
+4 2119 2376 2122 2118
+4 2377 2153 2150 2121
+4 1662 1905 1871 1870
+4 1863 1859 1656 1858
+4 1863 1901 1656 1859
+4 1653 1432 1627 1433
+4 1653 1652 1432 1433
+4 1655 1653 1432 1627
+4 1655 1851 1653 1627
+4 1871 1900 1655 1884
+4 1654 1655 1901 1652
+4 1432 1655 1654 1652
+4 1653 1655 1432 1652
+4 1901 1655 1653 1652
+4 1653 1901 1900 1655
+4 1655 1901 1871 1654
+4 1871 1900 1901 1655
+4 1655 1900 1854 1884
+4 1854 1851 1864 1900
+4 1655 1851 1854 1900
+4 1653 1851 1655 1900
+4 1864 1851 1653 1900
+4 1656 1652 1653 1433
+4 1653 1900 1862 1864
+4 1862 1653 1901 1900
+4 1656 1901 1653 1652
+4 1653 1863 1901 1656
+4 1863 1901 1862 1653
+4 1662 1901 1654 1871
+4 1662 1905 1901 1871
+4 1660 1652 1656 1436
+4 1660 1441 1652 1436
+4 1661 1901 1662 1905
+4 1901 1661 1654 1652
+4 1661 1901 1654 1662
+4 1660 1901 1661 1905
+4 1660 1901 1652 1661
+4 1441 1661 1654 1662
+4 1441 1661 1652 1654
+4 1661 1652 1660 1441
+4 1901 1660 1859 1905
+4 1901 1660 1656 1859
+4 1901 1660 1652 1656
+4 1433 1652 1436 1656
+4 1441 1652 1432 1654
+4 1228 1436 1433 1432
+4 1441 1436 1228 1432
+4 1652 1436 1441 1432
+4 1433 1436 1652 1432
+4 1657 1660 1656 1436
+4 1903 1859 1660 1905
+4 1903 1660 1859 1858
+4 1657 1660 1903 1858
+4 1656 1660 1657 1858
+4 1859 1660 1656 1858
+4 1433 1405 1373 1228
+4 1887 1657 1888 1895
+4 1865 1887 1657 1888
+4 1630 1653 1433 1656
+4 1630 1866 1653 1656
+4 1848 1852 1855 2103
+4 1855 1629 1852 1848
+4 1851 1853 2107 1864
+4 1629 1855 1852 1851
+4 1853 1855 1629 1851
+4 2107 1855 1853 1851
+4 1852 1855 2107 1851
+4 1630 1851 1853 1629
+4 1653 1853 1851 1864
+4 1630 1851 1653 1853
+4 1866 1653 1853 1630
+4 1853 2107 1866 1855
+4 1866 1853 1864 2107
+4 1866 1653 1864 1853
+4 1627 1630 1629 1851
+4 1606 1627 1630 1629
+4 1606 1627 1433 1630
+4 1405 1433 1606 1627
+4 1606 1405 1373 1433
+4 1627 1630 1653 1433
+4 1653 1627 1851 1630
+4 1855 1852 2102 2103
+4 2102 2107 1852 1855
+4 1852 2107 1850 1851
+4 2102 2107 1850 1852
+4 2107 1850 2037 2102
+4 2037 2036 1850 2107
+4 2036 1850 1856 2037
+4 1864 1850 2036 2107
+4 1854 1850 2036 1864
+4 1854 1850 1856 2036
+4 1851 1850 1864 2107
+4 1850 1864 1854 1851
+4 2107 1864 2108 2036
+4 2107 1864 2116 2108
+4 1864 2116 1866 2107
+4 2115 1858 1865 1887
+4 1653 1866 1863 1656
+4 1863 1866 1862 2116
+4 1653 1862 1863 1866
+4 1865 1863 1866 1656
+4 1865 1863 2116 1866
+4 1862 1866 1864 2116
+4 1864 1862 1653 1866
+4 1863 1865 1858 1656
+4 1865 1863 2115 2116
+4 2115 1858 1863 1865
+4 1657 1858 1865 1656
+4 1865 1887 1858 1657
+4 1868 1884 1928 2118
+4 1847 1852 1848 2103
+4 1847 2102 1852 2103
+4 1605 1606 1627 1405
+4 2037 1850 1843 2102
+4 1857 1856 2037 2113
+4 1845 1856 2037 1857
+4 1845 1687 1856 1857
+4 1628 1854 1687 1655
+4 1628 1851 1854 1655
+4 1843 1856 1850 2037
+4 1843 1845 1856 2037
+4 1628 1687 1854 1843
+4 1845 1687 1628 1843
+4 1856 1687 1845 1843
+4 1854 1687 1856 1843
+4 1851 1854 1843 1628
+4 1854 1843 1850 1851
+4 1850 1854 1856 1843
+4 1928 1856 1857 2113
+4 1687 1854 1884 1655
+4 1857 1687 1928 1868
+4 1928 1856 1687 1857
+4 1856 1687 1854 1928
+4 1884 1687 1928 1854
+4 1884 1928 1687 1868
+4 1847 1851 1843 1628
+4 1843 1847 2102 1850
+4 1851 1847 1843 1850
+4 1852 1847 1851 1850
+4 2102 1847 1852 1850
+4 1627 1851 1628 1655
+4 1628 1825 1851 1627
+4 1825 1851 1847 1628
+4 1629 1847 1851 1852
+4 1825 1629 1626 1847
+4 1629 1606 1627 1825
+4 1626 1606 1629 1825
+4 1605 1606 1626 1825
+4 1627 1606 1605 1825
+4 1851 1825 1629 1627
+4 1851 1825 1847 1629
+4 1629 1847 1848 1626
+4 1848 1852 1847 1629
+4 1373 1405 1176 1228
+4 1342 1372 1146 1176
+4 1343 1572 1340 1342
+4 1343 1341 1572 1342
+4 1343 1571 1338 1340
+4 1571 1343 1569 1570
+4 1569 1571 1338 1343
+4 1571 1343 1572 1340
+4 1572 1571 1570 1343
+4 1564 1571 1338 1569
+4 1337 1338 1571 1340
+4 1337 1571 1338 1564
+4 1343 1570 1559 1569
+4 1570 1343 1341 1572
+4 1559 1341 1570 1343
+4 1126 1340 1342 1343
+4 1126 1340 1146 1342
+4 1146 1126 1129 1340
+4 1129 1126 1146 942
+4 1126 1340 1337 1129
+4 1338 1340 1126 1343
+4 1337 1338 1340 1126
+4 1340 1342 1372 1146
+4 1372 1340 1572 1342
+4 1341 1570 1568 1559
+4 1404 1605 1606 1626
+4 1404 1403 1605 1626
+4 1606 1405 1374 1373
+4 1605 1374 1606 1405
+4 1403 1374 1605 1572
+4 1605 1404 1374 1403
+4 1404 1605 1374 1606
+4 1374 1405 1176 1373
+4 1605 1374 1372 1572
+4 1374 1405 1372 1176
+4 1405 1372 1605 1374
+4 1374 1372 1342 1176
+4 1342 1374 1572 1372
+4 1374 1572 1341 1342
+4 1341 1374 1403 1572
+4 1404 1403 1341 1374
+4 1567 1403 1404 1626
+4 1567 1403 1341 1404
+4 1570 1341 1403 1572
+4 1403 1568 1341 1570
+4 1568 1403 1341 1567
+4 2058 1800 1801 1802
+4 1849 1846 1848 2103
+4 1849 2097 1846 2103
+4 2092 2312 2343 2338
+4 2092 2090 2312 2338
+4 2048 2056 2311 2047
+4 2092 2056 1835 1837
+4 2092 2050 2090 2084
+4 2312 2092 2050 2090
+4 2050 2312 2056 2092
+4 1835 2084 1824 2056
+4 2092 2084 1835 2056
+4 2050 2084 2092 2056
+4 1824 2084 2050 2056
+4 2311 2056 2050 2312
+4 2048 2050 2056 1824
+4 2050 2056 2311 2048
+4 1849 1824 2050 2048
+4 2050 2084 2097 2090
+4 2097 1849 1846 2084
+4 2050 1849 2097 2084
+4 1824 1849 2050 2084
+4 1846 1849 1824 2084
+4 1796 2056 2048 2047
+4 1796 1798 2056 2047
+4 1848 1849 1824 1846
+4 1849 1824 1797 1848
+4 1797 2048 1824 1849
+4 1824 2056 1795 1835
+4 2048 1797 1824 2056
+4 1796 1797 2048 2056
+4 1795 1797 1796 2056
+4 1824 1797 1795 2056
+4 1798 2056 1795 1796
+4 1795 2056 1837 1835
+4 1795 2056 1798 1837
+4 2043 2056 2091 1837
+4 2043 1798 2056 1837
+4 2322 2056 2311 2312
+4 2322 2056 2057 2311
+4 2057 2309 2043 2056
+4 2322 2309 2057 2056
+4 2091 2309 2322 2056
+4 2043 2309 2091 2056
+4 1798 2056 2057 2043
+4 2057 2047 2056 1798
+4 2311 2056 2057 2047
+4 2092 2091 2056 1837
+4 2092 2093 2091 1837
+4 2322 2091 2323 2309
+4 2322 2091 2343 2323
+4 2343 2092 2091 2322
+4 2312 2092 2343 2322
+4 2056 2092 2312 2322
+4 2091 2092 2056 2322
+4 2343 2091 2093 2323
+4 2343 2091 2092 2093
+4 2058 2091 2043 2309
+4 2043 2058 1837 2091
+4 1801 1837 1798 1800
+4 2058 1837 1801 1800
+4 2043 1837 2058 1800
+4 1798 1837 2043 1800
+4 2058 2091 2093 1837
+4 2323 2091 2058 2309
+4 2323 2091 2093 2058
+4 2102 1846 2097 2103
+4 2333 2090 2092 2338
+4 2333 2090 2084 2092
+4 2081 2331 2333 2086
+4 2081 2077 2331 2086
+4 2097 2084 2331 2090
+4 2084 1846 2081 1844
+4 2084 2097 2081 1846
+4 2081 2331 2097 2084
+4 2077 2081 1846 1844
+4 2077 2081 2097 1846
+4 2077 2331 2097 2081
+4 2084 2331 2333 2081
+4 2333 2090 2331 2084
+4 2075 2077 2081 2086
+4 2081 2077 1845 1844
+4 2075 2077 1845 2081
+4 2102 1846 2077 2097
+4 1844 2077 2102 1846
+4 2102 1845 2077 1844
+4 2037 1845 2077 2102
+4 2075 1845 2077 2074
+4 1857 1845 2075 2074
+4 2037 1845 1857 2074
+4 2077 1845 2037 2074
+4 2074 1857 2076 2075
+4 2113 1857 2074 2037
+4 2113 2074 1857 2076
+4 1801 1800 1789 1802
+4 1801 1800 1571 1789
+4 1843 2102 1845 2037
+4 1825 1846 2084 1844
+4 1825 1824 1835 2084
+4 1825 1846 1824 2084
+4 1796 1795 1567 1797
+4 1614 1798 1801 1837
+4 1614 1795 1798 1837
+4 1570 1614 1798 1801
+4 1570 1614 1568 1798
+4 1570 1614 1403 1568
+4 1614 1570 1572 1801
+4 1572 1403 1570 1614
+4 1568 1796 1798 1614
+4 1567 1796 1568 1614
+4 1795 1796 1567 1614
+4 1798 1796 1795 1614
+4 1568 1614 1403 1567
+4 1835 1795 1614 1837
+4 1614 1403 1605 1572
+4 1795 1614 1824 1835
+4 1567 1797 1795 1614
+4 1626 1797 1567 1614
+4 1824 1797 1626 1614
+4 1795 1797 1824 1614
+4 1825 1614 1824 1626
+4 1835 1824 1825 1614
+4 1605 1626 1614 1825
+4 1614 1403 1626 1605
+4 1614 1403 1567 1626
+4 1626 1824 1848 1797
+4 1846 1824 1626 1825
+4 1848 1846 1824 1626
+4 1571 1570 1801 1572
+4 1801 1800 1570 1571
+4 1800 1570 1798 1801
+4 1628 1843 1844 1845
+4 1847 1844 1628 1843
+4 1844 1847 1825 1846
+4 1825 1847 1844 1628
+4 1844 1843 2102 1845
+4 2102 1847 1844 1846
+4 2102 1847 1843 1844
+4 1847 1846 1626 1825
+4 2103 1846 1847 2102
+4 1847 1846 1848 1626
+4 1847 1846 2103 1848
+4 2058 2309 2072 2323
+4 2072 2309 2044 2045
+4 1783 1570 1792 1559
+4 1783 1568 1570 1559
+4 1794 1798 1783 1568
+4 1783 1798 2044 1792
+4 2044 1794 1798 1783
+4 1570 1783 1798 1568
+4 1792 1798 1570 1783
+4 1798 1792 2043 2044
+4 1800 1792 1798 1570
+4 2043 1798 1800 1792
+4 1792 1570 1569 1559
+4 1791 1800 1569 1792
+4 1791 1569 1800 1789
+4 1564 1569 1791 1789
+4 1571 1569 1564 1789
+4 1800 1569 1571 1789
+4 1570 1569 1800 1792
+4 1571 1800 1570 1569
+4 1791 1789 1793 1564
+4 2046 2043 1792 2044
+4 1802 1800 2046 2058
+4 1793 2046 1802 1789
+4 1791 2046 1793 1789
+4 1800 2046 1791 1789
+4 1802 2046 1800 1789
+4 1792 1800 2046 1791
+4 2043 2046 1800 2058
+4 1792 1800 2043 2046
+4 2044 2046 2043 2309
+4 2072 2046 2044 2309
+4 2058 2046 2072 2309
+4 2043 2046 2058 2309
+4 1796 1798 1794 1568
+4 2047 1798 1794 1796
+4 2044 2057 1799 2045
+4 1794 2044 1798 2047
+4 1799 2044 1794 2047
+4 2057 2044 1799 2047
+4 1798 2044 2057 2047
+4 2057 2044 2309 2045
+4 2057 2044 2043 2309
+4 2043 2057 1798 2044
+4 2155 1912 1914 2154
+4 2155 2153 1912 2154
+4 1668 1907 1870 1908
+4 1668 1910 1907 1908
+4 1905 1906 1903 2149
+4 1905 1911 1906 2149
+4 1903 1659 1660 1657
+4 1903 1663 1664 1906
+4 1659 1903 1663 1664
+4 1659 1903 1660 1663
+4 1905 1663 1903 1906
+4 1660 1903 1905 1663
+4 1663 1906 1670 1664
+4 1663 1670 1906 1905
+4 1669 1670 1663 1905
+4 1911 1670 1669 1905
+4 1906 1670 1911 1905
+4 1660 1659 1436 1657
+4 1436 1660 1663 1659
+4 1441 1660 1663 1436
+4 1661 1669 1905 1662
+4 1905 1663 1661 1660
+4 1669 1661 1905 1663
+4 1669 1661 1441 1662
+4 1661 1663 1441 1660
+4 1669 1661 1663 1441
+4 2151 1911 1905 2149
+4 1662 1905 1668 1669
+4 1870 1905 1668 1662
+4 1668 1907 1905 1870
+4 1669 1905 1668 1910
+4 1911 1905 1669 1910
+4 1907 1905 1911 1910
+4 1668 1905 1907 1910
+4 2151 1911 1907 1905
+4 1907 1910 1911 2151
+4 1659 1657 1647 1436
+4 2138 1903 1906 2149
+4 2138 1904 1903 2149
+4 1659 1899 1903 1664
+4 1659 1898 1899 1664
+4 1643 1894 1647 1898
+4 1903 1894 1895 1904
+4 1657 1894 1895 1903
+4 1643 1894 1657 1647
+4 1643 1894 1895 1657
+4 1894 1903 1899 1904
+4 1894 1659 1898 1899
+4 1659 1894 1647 1657
+4 1659 1894 1898 1647
+4 1659 1894 1903 1899
+4 1657 1894 1903 1659
+4 1906 1903 1899 1664
+4 2138 1903 1899 1906
+4 1899 1904 1903 2138
+4 2137 1904 1899 2138
+4 1899 1894 2137 1898
+4 2137 1904 1894 1899
+4 1904 1894 1895 2137
+4 2137 1896 1898 1894
+4 1895 1896 2137 1894
+4 1643 1896 1895 1894
+4 1898 1896 1643 1894
+4 1898 1643 1650 1647
+4 1897 1896 1898 2137
+4 1649 1898 1897 1645
+4 1650 1898 1649 1645
+4 1643 1898 1650 1645
+4 1897 1898 1643 1645
+4 1643 1897 1896 1898
+4 1896 1643 1645 1897
+4 1906 2149 2152 2138
+4 2152 1911 2149 1906
+4 2152 1911 2151 2149
+4 1911 2151 2155 2152
+4 2151 2155 1910 1911
+4 2153 1910 1907 2151
+4 2153 1910 1908 1907
+4 2153 1910 1912 1908
+4 2155 1910 2153 2151
+4 2153 1912 1910 2155
+4 1671 1910 1668 1908
+4 1671 1912 1910 1908
+4 1672 1671 1447 1673
+4 1669 1672 1910 1668
+4 1447 1672 1669 1668
+4 1671 1672 1447 1668
+4 1910 1672 1671 1668
+4 1672 1669 1910 1913
+4 1670 1669 1672 1913
+4 1911 1669 1670 1913
+4 1910 1669 1911 1913
+4 1914 1671 1672 1673
+4 2155 1913 1910 1911
+4 1914 1910 1913 1672
+4 1914 1910 2155 1913
+4 2155 1912 1910 1914
+4 1910 1914 1671 1672
+4 1671 1910 1912 1914
+4 1913 1911 1906 1670
+4 1913 1911 2152 1906
+4 1911 2152 2155 1913
+4 1908 1912 1909 1671
+4 2154 2153 1909 2150
+4 1909 1912 2153 2154
+4 1912 2153 1908 1909
+4 2121 2153 1909 1908
+4 2150 2153 1909 2121
+4 1914 1912 1909 2154
+4 1671 1912 1909 1914
+4 1447 1671 1450 1673
+4 2443 2441 2592 2684
+4 2443 2442 2441 2684
+4 1142 1363 1173 1143
+4 1142 1241 1363 1143
+4 1363 1453 1593 1454
+4 1363 1241 1453 1454
+4 1240 1363 1142 1241
+4 1240 1453 1363 1241
+4 1883 1908 2121 1909
+4 1883 1908 2120 2121
+4 1908 2120 1882 1883
+4 2120 1882 1870 1908
+4 2120 1873 1870 1882
+4 2120 1873 1871 1870
+4 1457 1458 1459 1243
+4 1459 1683 1458 1457
+4 1820 1596 1683 1597
+4 1820 1599 1596 1597
+4 1683 1458 1684 1459
+4 1820 1598 1596 1599
+4 1820 1821 1598 1599
+4 1821 1688 1827 1820
+4 1821 1598 1688 1820
+4 1690 1688 1689 1633
+4 1929 1689 1688 1827
+4 1929 1688 1689 1690
+4 1688 1689 1821 1827
+4 1598 1688 1689 1821
+4 1689 1688 1598 1633
+4 1845 1689 1827 1821
+4 1689 1857 1845 1827
+4 1929 1857 1689 1827
+4 2075 1857 1929 1827
+4 1845 1857 2075 1827
+4 1633 1688 1686 1690
+4 1688 1460 1598 1633
+4 1688 1686 1460 1633
+4 1683 1688 1460 1596
+4 1820 1688 1683 1596
+4 1598 1688 1820 1596
+4 1460 1688 1598 1596
+4 1686 1683 1688 1460
+4 1460 1683 1684 1686
+4 1460 1683 1458 1684
+4 1460 1683 1596 1458
+4 1460 1596 1423 1458
+4 1821 1689 1687 1845
+4 1632 1689 1633 1869
+4 1689 1632 1598 1821
+4 1632 1689 1598 1633
+4 1632 1689 1687 1821
+4 1687 1689 1632 1869
+4 1689 1687 1868 1869
+4 1689 1687 1857 1868
+4 1857 1845 1687 1689
+4 1632 1598 1460 1633
+4 1599 1598 1632 1821
+4 1460 1423 1596 1598
+4 1632 1423 1460 1598
+4 1599 1423 1632 1598
+4 1596 1423 1599 1598
+4 1628 1821 1687 1845
+4 1687 1631 1821 1628
+4 1687 1655 1631 1628
+4 1631 1632 1821 1599
+4 1631 1632 1687 1821
+4 1655 1640 1631 1431
+4 1640 1869 1639 1631
+4 1632 1869 1640 1631
+4 1687 1869 1632 1631
+4 1639 1869 1687 1631
+4 1639 1631 1655 1640
+4 1687 1639 1631 1655
+4 1640 1631 1423 1632
+4 1636 1640 1431 1422
+4 1423 1640 1636 1422
+4 1631 1640 1423 1422
+4 1431 1640 1631 1422
+4 1423 1631 1599 1632
+4 1422 1631 1599 1423
+4 1640 1871 1872 1873
+4 1872 1640 1884 1871
+4 1869 1884 1640 1639
+4 1872 1884 1640 1869
+4 1884 1640 1655 1871
+4 1655 1884 1639 1640
+4 1687 1639 1884 1869
+4 1884 1639 1687 1655
+4 1640 1635 1873 1636
+4 1640 1635 1871 1873
+4 1635 1871 1655 1640
+4 1635 1640 1431 1636
+4 1431 1635 1655 1640
+4 1872 1871 2120 1873
+4 1884 1869 1868 1687
+4 2120 1872 1884 1871
+4 2118 1884 1869 1868
+4 1872 1884 2118 2120
+4 2118 1884 1872 1869
+4 1144 1185 1365 1186
+4 1145 1363 1367 1173
+4 1145 1142 1363 1173
+4 1365 1596 1458 1423
+4 1145 1240 1363 1142
+4 1145 1044 1240 1142
+4 1453 1456 1593 1457
+4 1453 1242 1456 1457
+4 1242 1362 1145 1240
+4 1366 1362 1242 1456
+4 1242 1362 1366 1145
+4 1453 1362 1242 1240
+4 1453 1362 1456 1242
+4 1240 1362 1363 1453
+4 1363 1145 1362 1240
+4 1145 1362 1367 1363
+4 1366 1362 1367 1145
+4 1593 1362 1456 1453
+4 1593 1362 1366 1456
+4 1362 1366 1367 1593
+4 1363 1362 1593 1453
+4 1363 1362 1367 1593
+4 1597 1593 1366 1456
+4 1593 1366 1367 1597
+4 1596 1456 1597 1366
+4 1683 1456 1458 1457
+4 1683 1456 1596 1458
+4 1596 1456 1683 1597
+4 1593 1456 1683 1457
+4 1683 1456 1593 1597
+4 1243 1456 1242 1457
+4 1243 1458 1456 1457
+4 1242 1145 1044 1240
+4 1144 1365 1242 1243
+4 1145 1185 1366 1242
+4 1044 1185 1145 1242
+4 1144 1185 1044 1242
+4 1366 1185 1144 1242
+4 1365 1144 1366 1185
+4 1365 1242 1366 1144
+4 1458 1456 1365 1243
+4 1365 1596 1456 1458
+4 1596 1456 1366 1365
+4 1242 1365 1456 1243
+4 1366 1365 1456 1242
+4 1145 1367 1154 1173
+4 1154 1366 1367 1145
+4 1154 1185 1366 1145
+4 1185 1368 1213 1154
+4 1185 1366 1368 1154
+4 1368 1423 1422 1599
+4 1368 1596 1423 1599
+4 1365 1423 1215 1366
+4 1596 1423 1365 1366
+4 1368 1423 1596 1366
+4 1215 1423 1368 1366
+4 1185 1215 1366 1365
+4 1366 1368 1215 1185
+4 1215 1368 1213 1185
+4 1422 1215 1368 1213
+4 1422 1368 1215 1423
+4 1368 1366 1367 1154
+4 1597 1596 1368 1599
+4 1368 1366 1597 1367
+4 1368 1366 1596 1597
+4 1407 1422 1423 1636
+4 1185 1215 1407 1213
+4 1407 1215 1365 1423
+4 1407 1365 1185 1186
+4 1407 1185 1365 1215
+4 1422 1407 1215 1213
+4 1422 1423 1215 1407
+4 1407 1422 1220 1213
+4 1421 1407 1636 1431
+4 1220 1407 1421 1431
+4 1422 1407 1220 1431
+4 1636 1407 1422 1431
+4 1421 1431 1417 1220
+4 1671 1908 1883 1909
+4 1665 1908 1882 1883
+4 1665 1671 1908 1883
+4 1638 1634 1662 1441
+4 1638 1417 1634 1441
+4 1635 1634 1873 1636
+4 1873 1634 1871 1662
+4 1635 1634 1871 1873
+4 1873 1634 1638 1636
+4 1873 1634 1662 1638
+4 1636 1634 1431 1635
+4 1417 1638 1634 1431
+4 1421 1638 1417 1431
+4 1636 1638 1421 1431
+4 1634 1638 1636 1431
+4 1432 1634 1431 1417
+4 1432 1441 1634 1417
+4 1654 1432 1634 1635
+4 1655 1432 1654 1635
+4 1431 1432 1655 1635
+4 1634 1432 1431 1635
+4 1654 1635 1871 1655
+4 1654 1635 1634 1871
+4 1441 1634 1654 1432
+4 1654 1634 1662 1871
+4 1654 1662 1634 1441
+4 1638 1662 1669 1441
+4 1662 1873 1870 1871
+4 1669 1637 1668 1662
+4 1638 1637 1669 1662
+4 1882 1637 1638 1662
+4 1668 1637 1882 1662
+4 1873 1662 1882 1638
+4 1882 1870 1662 1873
+4 1870 1662 1668 1882
+4 1637 1668 1447 1669
+4 1668 1882 1908 1870
+4 1665 1668 1637 1882
+4 1450 1637 1665 1671
+4 1447 1637 1450 1671
+4 1668 1637 1447 1671
+4 1665 1637 1668 1671
+4 1908 1665 1668 1671
+4 1882 1668 1908 1665
+4 1454 1453 1455 1241
+4 1455 1593 1453 1454
+4 1455 1677 1593 1454
+4 1676 1593 1457 1453
+4 1676 1455 1593 1453
+4 1676 1683 1459 1457
+4 1676 1593 1683 1457
+4 1677 1676 1678 1455
+4 1677 1593 1676 1455
+4 2163 1917 1924 1923
+4 2163 1919 1917 1923
+4 2163 1918 1917 1919
+4 2163 1934 1918 1919
+4 2041 2040 2303 2177
+4 1932 1933 1931 1915
+4 2298 2041 2173 2040
+4 2298 2303 2041 2040
+4 2174 2298 2428 2303
+4 2174 2041 2298 2303
+4 2174 2173 2298 2041
+4 2174 1931 2173 2041
+4 2428 2430 2174 2181
+4 2298 2174 2430 2173
+4 2428 2430 2298 2174
+4 2182 2174 2430 2181
+4 2173 2430 2182 2174
+4 2174 2182 1932 2181
+4 1932 1931 1933 2182
+4 2174 1931 1932 2182
+4 2173 1931 2174 2182
+4 1933 1931 2173 2182
+4 2298 2173 2302 2040
+4 2183 2173 2182 1933
+4 2183 2173 2430 2182
+4 2430 2298 2173 2183
+4 2328 2298 2430 2183
+4 2302 2298 2328 2183
+4 2173 2298 2302 2183
+4 1932 2182 2171 2181
+4 1930 2040 2041 2177
+4 1930 1929 2040 2177
+4 1931 1926 1927 1915
+4 1931 1933 1926 1915
+4 2173 1926 1931 1933
+4 1929 2038 2040 2075
+4 2041 1781 1930 1927
+4 2040 2038 2041 2173
+4 2041 2040 1930 1781
+4 2038 2040 2041 1781
+4 1929 2040 2038 1781
+4 1930 2040 1929 1781
+4 1927 2173 1926 1931
+4 1926 1927 2038 2173
+4 1781 2038 1926 1927
+4 2041 2173 1927 1931
+4 2041 2038 1927 2173
+4 1927 1781 2038 2041
+4 1827 2038 1929 2075
+4 1781 2038 1826 1926
+4 1827 2038 1781 1929
+4 1781 2038 1827 1826
+4 2302 2038 2075 2040
+4 2302 2173 2038 2040
+4 2039 2173 2038 2302
+4 2039 2183 2173 2302
+4 2039 1826 2038 1933
+4 2079 1826 2039 1933
+4 1926 1826 2079 1933
+4 2038 1826 1926 1933
+4 2038 1933 2173 2039
+4 2173 1933 2038 1926
+4 2039 1933 2183 2079
+4 2183 2173 1933 2039
+4 2039 2038 2075 2302
+4 1827 2038 2039 1826
+4 2039 2038 1827 2075
+4 2079 1926 1918 1826
+4 2184 1933 2079 2183
+4 2184 2182 1933 2183
+4 1917 1933 2161 1915
+4 1917 1926 1933 1915
+4 1918 2163 2079 1934
+4 1918 2079 2163 1917
+4 1926 2079 1918 1917
+4 1933 2079 1926 1917
+4 2163 2079 1933 1917
+4 2184 2079 2163 1934
+4 2163 1933 2079 2184
+4 1933 2163 2161 2184
+4 2161 1933 1917 2163
+4 2184 2161 2416 2163
+4 2161 1933 1932 1915
+4 2161 2182 2416 2171
+4 2182 2161 2184 1933
+4 2182 2161 2416 2184
+4 1932 2161 2182 1933
+4 2161 2182 2171 1932
+4 2443 2182 2416 2184
+4 2443 2183 2182 2184
+4 2181 2430 2440 2428
+4 2430 2183 2441 2328
+4 2427 2182 2181 2171
+4 2181 2440 2430 2182
+4 2427 2440 2181 2182
+4 2442 2440 2427 2182
+4 2430 2440 2442 2182
+4 2427 2182 2443 2442
+4 2416 2182 2427 2171
+4 2416 2182 2443 2427
+4 2441 2443 2183 2430
+4 2442 2443 2441 2430
+4 2182 2443 2442 2430
+4 2183 2443 2182 2430
+4 2181 2171 2172 2427
+4 2172 1932 2171 2181
+4 1932 2171 2162 2172
+4 2161 2162 1932 2171
+4 1924 1916 1917 2161
+4 1925 1916 1924 2161
+4 1915 1916 1925 2161
+4 1917 1916 1915 2161
+4 1925 2161 1932 1915
+4 1932 2162 2161 1925
+4 2164 2161 2162 1925
+4 2164 1924 2161 1925
+4 2172 2171 2416 2427
+4 2163 2161 1924 1917
+4 2164 2163 2161 1924
+4 2416 2161 2164 2163
+4 2172 2416 2171 2162
+4 2164 2416 2172 2162
+4 2161 2416 2164 2162
+4 2171 2416 2161 2162
+4 1681 1917 1923 1924
+4 1681 1916 1917 1924
+4 1919 1681 1917 1923
+4 1919 1678 1681 1923
+4 1459 1682 1683 1676
+4 1684 1682 1683 1459
+4 1827 1688 1826 1820
+4 1930 1781 1690 1927
+4 1690 1781 1929 1688
+4 1930 1781 1929 1690
+4 1690 1781 1686 1927
+4 1686 1688 1781 1690
+4 1926 1686 1781 1927
+4 1926 1688 1781 1686
+4 1827 1781 1688 1929
+4 1688 1826 1781 1827
+4 1781 1688 1926 1826
+4 1683 1826 1688 1820
+4 1683 1926 1686 1688
+4 1683 1926 1684 1686
+4 1683 1926 1682 1684
+4 1926 1683 1826 1688
+4 1682 1926 1683 1826
+4 1685 1917 1674 1916
+4 1685 1915 1917 1916
+4 1674 1682 1684 1459
+4 1684 1926 1685 1686
+4 1684 1685 1926 1682
+4 1674 1685 1684 1682
+4 1917 1685 1674 1682
+4 1926 1685 1917 1682
+4 1685 1926 1927 1686
+4 1685 1926 1915 1927
+4 1926 1915 1917 1685
+4 1674 1917 1681 1916
+4 1676 1682 1674 1459
+4 1681 1682 1674 1676
+4 1681 1682 1917 1674
+4 1593 1676 1675 1677
+4 1826 1683 1818 1820
+4 1826 1818 1683 1682
+4 1918 1818 1826 1682
+4 1675 1818 1918 1682
+4 1683 1818 1675 1682
+4 1818 1683 1597 1820
+4 1818 1683 1675 1597
+4 1675 1683 1593 1597
+4 1675 1683 1676 1593
+4 1683 1682 1675 1676
+4 1919 1682 1675 1918
+4 1677 1676 1919 1678
+4 1919 1675 1676 1677
+4 1675 1676 1682 1919
+4 1681 1919 1676 1678
+4 1681 1682 1676 1919
+4 1919 1682 1917 1681
+4 1926 1682 1918 1826
+4 1918 1917 1682 1926
+4 1918 1682 1917 1919
+4 1364 1363 1454 1241
+4 1364 1143 1363 1241
+4 2336 2183 2302 2328
+4 2336 2441 2183 2328
+4 1422 1382 1214 1213
+4 1422 1368 1382 1213
+4 1613 1612 1386 1610
+4 1613 1832 1612 1610
+4 2084 2087 2333 2092
+4 2084 1834 2087 2092
+4 2089 1830 2087 2088
+4 2089 1833 1830 2088
+4 1612 1611 1613 1386
+4 1613 1833 1611 1612
+4 1832 1833 1613 1612
+4 1831 1833 1832 1612
+4 1611 1833 1831 1612
+4 2089 1831 1833 1832
+4 1833 1831 1830 1611
+4 1833 1830 1831 2089
+4 2089 1830 1834 2087
+4 1834 1830 1831 1823
+4 1834 1831 1830 2089
+4 1834 2084 2087 1830
+4 1823 2084 1834 1830
+4 2080 2084 1823 1830
+4 2087 2084 2080 1830
+4 1823 2080 1822 2084
+4 1819 1611 1607 1595
+4 1822 1819 1823 1607
+4 1823 2080 1819 1822
+4 2080 1819 1830 1823
+4 1607 1831 1611 1819
+4 1823 1831 1607 1819
+4 1830 1831 1823 1819
+4 1611 1831 1830 1819
+4 1612 1611 1607 1831
+4 1386 1611 1607 1612
+4 1607 1611 1382 1595
+4 1607 1611 1386 1382
+4 1840 1830 1833 2088
+4 1840 2078 1830 2088
+4 1833 1611 1625 1613
+4 1817 2078 1830 1840
+4 1817 1818 2078 1840
+4 1820 1817 1597 1818
+4 1595 1817 1820 1819
+4 1820 1817 1595 1597
+4 2078 1817 1820 1818
+4 2078 1817 1819 1820
+4 1830 1817 1819 2078
+4 1819 1817 1611 1595
+4 1611 1819 1830 1817
+4 1833 1625 1611 1830
+4 1840 1625 1833 1830
+4 1817 1625 1840 1830
+4 1611 1625 1817 1830
+4 1592 1611 1382 1386
+4 1592 1595 1597 1368
+4 1595 1592 1817 1611
+4 1592 1595 1817 1597
+4 1382 1595 1592 1368
+4 1592 1611 1595 1382
+4 1592 1611 1625 1817
+4 1613 1611 1592 1386
+4 1592 1611 1613 1625
+4 2087 1830 2078 2088
+4 2078 1819 2080 1820
+4 2080 1830 2078 2087
+4 2078 1819 1830 2080
+4 1844 2080 2081 2084
+4 1844 1822 2080 2084
+4 1599 1595 1368 1597
+4 1599 1820 1595 1597
+4 1844 1821 1822 1628
+4 1844 1845 1821 1628
+4 1827 2080 1821 1820
+4 1845 1844 1821 1827
+4 2081 1844 1845 1827
+4 2080 1844 2081 1827
+4 1821 1844 2080 1827
+4 2080 1821 1822 1844
+4 1819 1821 2080 1820
+4 1819 1822 2080 1821
+4 1631 1822 1821 1628
+4 1599 1819 1821 1631
+4 1599 1819 1820 1821
+4 1819 1820 1595 1599
+4 1607 1819 1599 1631
+4 1607 1819 1595 1599
+4 1819 1631 1822 1821
+4 1822 1819 1607 1631
+4 1422 1607 1599 1631
+4 1422 1599 1607 1382
+4 1368 1599 1422 1382
+4 1595 1599 1368 1382
+4 1607 1599 1595 1382
+4 2333 2080 2087 2084
+4 2333 2081 2080 2084
+4 2075 1827 2081 1845
+4 1826 2078 2080 1820
+4 1826 1818 2078 1820
+4 2078 1918 1840 1818
+4 2078 1826 1918 1818
+4 2332 2080 2087 2333
+4 2332 2085 2080 2333
+4 2332 2078 2088 2087
+4 2332 2080 2078 2087
+4 2096 2078 1840 2088
+4 2096 2332 2078 2088
+4 1918 2078 2079 1826
+4 2096 1840 2078 2079
+4 1934 1840 2096 2079
+4 1918 1840 1934 2079
+4 2078 1840 1918 2079
+4 2332 2078 2079 2096
+4 1826 2078 2079 2085
+4 2080 2078 1826 2085
+4 2332 2078 2080 2085
+4 2079 2078 2332 2085
+4 2096 2079 2184 1934
+4 2336 2085 2332 2333
+4 2096 2079 2183 2184
+4 2079 2183 2332 2096
+4 2332 2183 2085 2336
+4 2183 2332 2085 2079
+4 1826 2080 1827 1820
+4 2086 2085 2302 2336
+4 2086 2333 2085 2336
+4 2086 2039 2075 2302
+4 2086 2085 2039 2302
+4 2086 2080 2085 2333
+4 2086 2081 2080 2333
+4 2080 2086 1827 2081
+4 1827 2085 2086 2080
+4 2039 1827 2085 2086
+4 2075 1827 2086 2081
+4 2086 2039 1827 2075
+4 2085 1827 1826 2080
+4 1827 2085 1826 2039
+4 2302 2085 2183 2336
+4 2039 2085 2183 2302
+4 2079 2085 2039 1826
+4 2039 2183 2085 2079
+4 1608 1607 1823 1831
+4 1608 1612 1607 1831
+4 1631 1607 1406 1422
+4 1406 1608 1602 1375
+4 1602 1822 1601 1825
+4 1602 1823 1822 1825
+4 1602 1607 1823 1608
+4 1602 1607 1822 1823
+4 1607 1822 1601 1602
+4 1602 1607 1406 1601
+4 1602 1607 1608 1406
+4 1631 1601 1607 1822
+4 1601 1607 1406 1631
+4 1601 1822 1628 1825
+4 1601 1822 1631 1628
+4 1844 1822 1825 1628
+4 2084 1822 1825 1844
+4 1825 1823 1822 2084
+4 1406 1382 1214 1422
+4 1406 1607 1382 1422
+4 1382 1383 1161 1386
+4 1375 1382 1214 1406
+4 1170 1214 1375 1383
+4 1161 1214 1170 1383
+4 1382 1214 1161 1383
+4 1375 1214 1382 1383
+4 1608 1406 1607 1383
+4 1375 1406 1608 1383
+4 1382 1406 1375 1383
+4 1607 1406 1382 1383
+4 1386 1383 1607 1382
+4 1383 1607 1612 1386
+4 1383 1607 1608 1612
+4 1835 1834 2084 2092
+4 1835 1836 1834 2092
+4 1835 1823 1825 2084
+4 1835 1834 1823 2084
+4 1823 1836 1831 1834
+4 1823 1835 1836 1834
+4 1399 1622 1572 1398
+4 1605 1823 1602 1825
+4 1605 1614 1823 1825
+4 1622 1605 1608 1399
+4 1622 1605 1823 1608
+4 1823 1605 1622 1614
+4 1602 1608 1605 1399
+4 1602 1608 1823 1605
+4 1605 1622 1572 1399
+4 1572 1622 1605 1614
+4 1835 1823 1614 1825
+4 1831 1622 1823 1608
+4 1614 1836 1823 1835
+4 1823 1836 1622 1831
+4 1836 1823 1622 1614
+4 1622 1397 1616 1398
+4 1622 1399 1397 1398
+4 1615 1397 1609 1616
+4 1615 1622 1397 1616
+4 1615 1390 1612 1609
+4 1615 1397 1390 1609
+4 1390 1397 1615 1608
+4 1399 1397 1390 1608
+4 1622 1397 1399 1608
+4 1615 1397 1622 1608
+4 1831 1608 1615 1622
+4 1612 1615 1608 1390
+4 1608 1615 1612 1831
+4 1386 1612 1390 1609
+4 1383 1390 1612 1608
+4 1390 1383 1612 1386
+4 1161 1383 1390 1386
+4 1399 1608 1375 1602
+4 1170 1383 1390 1161
+4 1170 1399 1390 1383
+4 1375 1399 1170 1383
+4 1608 1399 1375 1383
+4 1390 1399 1608 1383
+4 2087 1834 1836 2092
+4 1836 2089 1834 2087
+4 1609 1612 1610 1386
+4 1836 2089 1831 1834
+4 1832 1609 1612 1610
+4 1832 1623 1609 1610
+4 1839 1831 1622 1836
+4 1616 1615 1839 1623
+4 1622 1615 1839 1616
+4 1622 1615 1831 1839
+4 1839 1615 1832 1623
+4 1832 1831 1615 1839
+4 1839 1831 2089 1832
+4 2089 1836 1831 1839
+4 1623 1615 1609 1616
+4 1612 1615 1832 1831
+4 1832 1609 1615 1612
+4 1609 1615 1623 1832
+4 1378 1390 1161 1170
+4 1378 1399 1390 1170
+4 1379 1390 1386 1161
+4 1379 1378 1390 1161
+4 1379 1609 1610 1386
+4 1379 1390 1609 1386
+4 1381 1609 1610 1379
+4 1381 1396 1609 1379
+4 1172 1392 1396 1346
+4 1396 1400 1172 1381
+4 1396 1609 1400 1381
+4 1616 1400 1609 1623
+4 1616 1400 1396 1609
+4 1616 1400 1392 1396
+4 1400 1616 1401 1623
+4 1401 1392 1616 1400
+4 1392 1400 1172 1396
+4 1401 1392 1400 1172
+4 1400 1609 1610 1381
+4 1623 1609 1610 1400
+4 1378 1609 1396 1379
+4 1378 1390 1609 1379
+4 1171 1397 1399 1398
+4 1378 1397 1171 1396
+4 1397 1378 1399 1390
+4 1378 1397 1399 1171
+4 1609 1397 1378 1396
+4 1609 1397 1390 1378
+4 1616 1396 1397 1609
+4 1171 1396 1397 1398
+4 1346 1396 1171 1398
+4 1392 1396 1346 1398
+4 1397 1396 1392 1398
+4 1392 1397 1616 1396
+4 1616 1397 1392 1398
+4 1838 1801 1802 2058
+4 1838 1837 1801 2058
+4 1837 1836 1835 2092
+4 1837 1836 1614 1835
+4 1801 1622 1572 1614
+4 1573 1789 1793 1802
+4 1573 1616 1789 1802
+4 1564 1573 1789 1793
+4 1564 1565 1573 1793
+4 1564 1391 1573 1565
+4 1564 1337 1391 1565
+4 1571 1564 1391 1616
+4 1789 1564 1571 1616
+4 1573 1564 1789 1616
+4 1391 1564 1573 1616
+4 1337 1391 1571 1564
+4 1571 1398 1391 1337
+4 1398 1391 1616 1571
+4 1789 1616 1801 1802
+4 1571 1616 1801 1789
+4 1801 1571 1572 1622
+4 1616 1571 1801 1622
+4 1398 1571 1616 1622
+4 1572 1571 1398 1622
+4 1616 1573 1392 1401
+4 1398 1391 1392 1616
+4 1346 1337 1345 1392
+4 1398 1337 1346 1392
+4 1391 1337 1398 1392
+4 1345 1337 1391 1392
+4 1573 1392 1391 1616
+4 1573 1392 1345 1391
+4 1573 1345 1392 1346
+4 1391 1345 1565 1337
+4 1391 1345 1573 1565
+4 1573 1345 1347 1565
+4 1172 1347 1401 1392
+4 1346 1347 1172 1392
+4 1573 1347 1346 1392
+4 1401 1347 1573 1392
+4 1346 1573 1345 1347
+4 1347 1334 1565 1345
+4 1346 1334 1347 1345
+4 1337 1334 1346 1345
+4 1565 1334 1337 1345
+4 1624 1801 1616 1802
+4 1624 1838 1801 1802
+4 1624 1616 1839 1623
+4 1838 1622 1837 1839
+4 1837 1801 1622 1838
+4 1801 1622 1614 1837
+4 1836 1837 1622 1839
+4 1836 1614 1622 1837
+4 1838 1624 1801 1622
+4 1839 1624 1838 1622
+4 1616 1624 1839 1622
+4 1801 1624 1616 1622
+4 1624 1616 1573 1802
+4 1401 1616 1624 1623
+4 1624 1616 1401 1573
+4 2093 1837 1838 2058
+4 2093 1837 1839 1838
+4 2093 1836 2087 2089
+4 2092 1836 2093 1837
+4 2092 1836 2087 2093
+4 1839 1836 2093 2089
+4 2093 1837 1836 1839
+4 1346 1337 1129 1334
+4 1220 1422 1214 1213
+4 1372 1339 1340 1146
+4 1372 1176 1339 1146
+4 1340 1398 1571 1337
+4 1340 1398 1572 1571
+4 1431 1406 1220 1422
+4 1431 1631 1406 1422
+4 1219 1431 1406 1220
+4 1219 1417 1431 1220
+4 1221 1431 1219 1417
+4 1221 1432 1431 1417
+4 1371 1370 1375 1219
+4 1371 1221 1370 1219
+4 1371 1405 1370 1221
+4 1371 1176 1405 1221
+4 1405 1371 1372 1176
+4 1372 1605 1371 1405
+4 1372 1399 1371 1605
+4 1339 1372 1371 1176
+4 1339 1399 1371 1372
+4 1605 1399 1371 1370
+4 1602 1399 1605 1370
+4 1375 1399 1602 1370
+4 1371 1399 1375 1370
+4 1370 1605 1405 1371
+4 1405 1370 1602 1605
+4 1369 1370 1602 1405
+4 1219 1369 1406 1431
+4 1375 1406 1219 1370
+4 1602 1406 1375 1370
+4 1369 1406 1602 1370
+4 1219 1406 1369 1370
+4 1369 1221 1432 1431
+4 1221 1369 1405 1370
+4 1432 1369 1405 1221
+4 1221 1369 1219 1431
+4 1221 1369 1370 1219
+4 1221 1405 1228 1176
+4 1228 1221 1432 1405
+4 1441 1226 1417 1432
+4 1228 1226 1441 1432
+4 1221 1226 1228 1432
+4 1417 1226 1221 1432
+4 1431 1600 1655 1432
+4 1431 1369 1600 1432
+4 1631 1600 1628 1655
+4 1631 1431 1600 1655
+4 1406 1431 1369 1601
+4 1631 1431 1406 1601
+4 1600 1431 1631 1601
+4 1369 1431 1600 1601
+4 1602 1369 1601 1406
+4 1601 1600 1369 1602
+4 1601 1600 1628 1631
+4 1825 1600 1601 1602
+4 1601 1600 1825 1628
+4 1627 1602 1605 1405
+4 1602 1627 1825 1600
+4 1627 1602 1825 1605
+4 1432 1405 1369 1600
+4 1627 1405 1432 1600
+4 1602 1405 1627 1600
+4 1369 1405 1602 1600
+4 1655 1600 1627 1432
+4 1628 1600 1627 1655
+4 1627 1825 1600 1628
+4 1572 1399 1372 1605
+4 1340 1572 1398 1339
+4 1372 1572 1340 1339
+4 1399 1572 1372 1339
+4 1398 1572 1399 1339
+4 1214 1220 1406 1422
+4 1219 1406 1214 1220
+4 1214 1219 1375 1406
+4 1219 1375 1170 1214
+4 1169 1339 1176 1146
+4 1169 1171 1339 1146
+4 1375 1169 1371 1219
+4 1371 1399 1169 1375
+4 1339 1371 1399 1169
+4 1221 1371 1169 1219
+4 1176 1371 1169 1221
+4 1169 1339 1371 1176
+4 1169 1375 1170 1219
+4 1170 1169 1399 1375
+4 1399 1169 1171 1339
+4 1378 1399 1169 1171
+4 1170 1399 1169 1378
+4 1171 1340 1339 1146
+4 1171 1129 1340 1146
+4 1171 1339 1398 1399
+4 1398 1171 1340 1339
+4 1129 1171 1340 1337
+4 1346 1171 1129 1337
+4 1398 1171 1346 1337
+4 1340 1171 1398 1337
+4 1380 1610 1379 1381
+4 1154 1382 1368 1213
+4 1154 1155 1382 1213
+4 1613 1386 1387 1610
+4 1367 1382 1592 1368
+4 1367 1154 1382 1368
+4 1174 1402 1385 1389
+4 1174 1175 1402 1389
+4 1174 1367 1173 1154
+4 1175 1402 1173 1174
+4 1364 1173 1175 1402
+4 1173 1364 1143 1363
+4 1143 1364 1173 1175
+4 1367 1173 1402 1174
+4 1367 1173 1364 1402
+4 1363 1364 1367 1173
+4 1174 1155 1385 1384
+4 1154 1155 1174 1384
+4 1382 1155 1154 1384
+4 1385 1155 1382 1384
+4 1367 1384 1154 1174
+4 1367 1384 1382 1154
+4 1402 1174 1384 1367
+4 1385 1384 1402 1174
+4 1386 1613 1385 1384
+4 1592 1613 1386 1384
+4 1402 1613 1592 1384
+4 1385 1613 1402 1384
+4 1386 1384 1382 1592
+4 1386 1384 1385 1382
+4 1592 1384 1367 1402
+4 1592 1384 1382 1367
+4 1389 1385 1613 1402
+4 1387 1613 1385 1386
+4 1613 1387 1385 1389
+4 1160 1385 1389 1174
+4 1160 1155 1385 1174
+4 1214 1382 1155 1213
+4 1387 1379 1380 1610
+4 1387 1386 1379 1610
+4 1161 1382 1155 1214
+4 1160 1387 1379 1380
+4 1160 1387 1386 1379
+4 1387 1386 1385 1160
+4 1389 1387 1160 1380
+4 1160 1385 1387 1389
+4 1160 1386 1161 1379
+4 1160 1161 1386 1385
+4 1155 1161 1160 1385
+4 1382 1161 1155 1385
+4 1386 1161 1382 1385
+4 1625 1592 1402 1613
+4 1367 1592 1597 1368
+4 1597 1817 1675 1818
+4 1597 1817 1593 1675
+4 1592 1594 1817 1625
+4 1597 1593 1817 1592
+4 1367 1593 1597 1592
+4 1594 1593 1367 1592
+4 1817 1593 1594 1592
+4 1594 1592 1402 1625
+4 1402 1367 1592 1594
+4 1594 1367 1364 1402
+4 1594 1364 1367 1593
+4 1454 1364 1594 1593
+4 1363 1364 1454 1593
+4 1367 1364 1363 1593
+4 1594 1593 1677 1454
+4 1675 1594 1817 1593
+4 1675 1677 1594 1593
+4 1918 1817 1840 1818
+4 1918 1675 1817 1818
+4 1594 1675 1691 1677
+4 1691 1817 1625 1840
+4 1691 1817 1594 1625
+4 1594 1675 1817 1691
+4 1817 1691 1918 1840
+4 1918 1817 1675 1691
+4 1934 1918 1691 1840
+4 1691 1675 1919 1677
+4 1919 1691 1918 1675
+4 1691 1919 1918 1934
+4 2344 2441 2592 2443
+4 2344 2183 2441 2443
+4 2340 2092 2087 2093
+4 2340 2343 2092 2093
+4 2340 2338 2092 2343
+4 2340 2589 2338 2343
+4 2087 2338 2333 2092
+4 2087 2340 2338 2092
+4 2587 2332 2333 2336
+4 2339 2338 2340 2589
+4 2087 2338 2332 2333
+4 2087 2338 2339 2332
+4 2339 2338 2087 2340
+4 2338 2339 2587 2589
+4 2587 2332 2338 2333
+4 2587 2338 2332 2339
+4 2344 2587 2332 2339
+4 2332 2344 2183 2336
+4 2587 2344 2332 2336
+4 2441 2344 2587 2336
+4 2183 2344 2441 2336
+4 2589 2587 2344 2339
+4 2592 2587 2344 2589
+4 2344 2441 2587 2592
+4 2184 2183 2344 2443
+4 2096 2183 2344 2184
+4 2340 2087 2089 2093
+4 2344 2096 2332 2183
+4 2096 2332 2339 2344
+4 2339 2088 2332 2096
+4 2340 2087 2088 2089
+4 2339 2087 2088 2340
+4 2339 2087 2332 2088
+4 577 116 554 302
+4 2679 2677 2678 2439
+4 2658 2427 2416 2443
+4 2658 2442 2427 2443
+4 2658 2684 2442 2443
+4 2641 2683 2684 2839
+4 2641 2643 2683 2839
+4 2641 2642 2643 2839
+4 512 222 812 585
+4 512 117 222 585
+4 512 555 117 585
+4 2727 2737 2726 2672
+4 2727 2678 2737 2672
+4 554 510 116 577
+4 511 116 555 554
+4 511 510 116 554
+4 511 117 512 555
+4 511 116 117 555
+4 2691 2704 2580 2692
+4 1394 1395 1393 1463
+4 1394 2580 1395 1463
+4 1394 596 1268 1393
+4 1394 1395 596 1393
+4 2847 2660 2656 2657
+4 2847 2659 2660 2657
+4 2846 2847 2845 2659
+4 2846 2660 2847 2659
+4 2846 2683 2661 2684
+4 2846 2641 2683 2684
+4 1377 2541 2570 2675
+4 1377 2558 2541 2675
+4 3 117 94 116
+4 527 96 528 95
+4 527 466 96 95
+4 1350 541 1299 1376
+4 1350 639 541 1376
+4 637 141 638 256
+4 637 221 141 256
+4 527 541 466 1299
+4 527 1350 541 1299
+4 96 541 141 466
+4 96 527 541 466
+4 528 541 96 527
+4 541 540 141 639
+4 528 540 221 96
+4 541 540 528 96
+4 141 540 541 96
+4 221 540 141 96
+4 637 540 141 221
+4 638 141 540 639
+4 540 141 638 637
+4 221 540 791 637
+4 791 528 540 221
+4 540 541 1350 639
+4 1350 528 812 527
+4 1350 528 791 812
+4 528 791 540 1350
+4 541 528 1350 527
+4 541 528 540 1350
+4 598 638 141 256
+4 598 874 638 256
+4 467 541 466 141
+4 467 639 541 141
+4 1271 541 1299 466
+4 1271 467 541 466
+4 1376 541 1315 639
+4 1315 541 1377 1271
+4 1377 541 1315 1376
+4 1315 541 467 639
+4 1271 541 467 1315
+4 1299 541 1377 1376
+4 1377 1271 541 1299
+4 467 638 639 141
+4 467 598 638 141
+4 1313 467 1314 1315
+4 1314 874 638 467
+4 1313 874 1314 467
+4 598 874 1313 467
+4 638 874 598 467
+4 639 467 1314 638
+4 1315 467 1314 639
+4 873 638 256 637
+4 874 256 873 638
+4 630 1429 1412 598
+4 873 1429 630 598
+4 874 1429 873 598
+4 1412 1429 874 598
+4 256 598 873 630
+4 256 598 874 873
+4 874 1412 1969 1429
+4 1412 874 1313 598
+4 1969 874 1313 1412
+4 2704 1969 1412 1429
+4 2580 1969 1412 2704
+4 1270 1315 1312 2558
+4 1270 1312 1315 467
+4 1316 1312 1270 467
+4 1313 1312 1316 467
+4 1315 1312 1313 467
+4 1270 1315 1271 467
+4 2558 1270 1315 2559
+4 2541 1270 2558 2559
+4 1271 1270 2541 2559
+4 1315 1270 1271 2559
+4 2558 1377 2541 2559
+4 1315 1377 2558 2559
+4 1271 1377 1315 2559
+4 2541 1377 1271 2559
+4 1394 1316 1312 1270
+4 1312 1313 1316 1394
+4 1316 1313 1412 1394
+4 1316 1313 598 1412
+4 598 1316 467 1313
+4 1394 1313 2580 1312
+4 2580 1412 1313 1394
+4 1412 1313 1969 2580
+4 512 528 95 527
+4 512 812 528 527
+4 95 222 528 512
+4 528 222 96 221
+4 96 528 95 222
+4 812 528 222 512
+4 791 528 222 812
+4 222 528 791 221
+4 222 95 117 512
+4 8 96 222 221
+4 222 95 8 117
+4 222 95 96 8
+4 1395 1394 1412 2580
+4 1267 1271 1270 2541
+4 140 141 4 9
+4 140 256 141 9
+4 140 598 141 256
+4 140 630 598 256
+4 597 598 140 630
+4 597 1412 598 630
+4 464 1268 1270 467
+4 596 1268 464 467
+4 1316 1268 596 467
+4 1270 1268 1316 467
+4 1268 1316 1394 1270
+4 1394 596 1316 1268
+4 1270 464 1267 1268
+4 1271 464 1270 467
+4 1270 464 1271 1267
+4 1316 596 598 467
+4 1412 597 598 1316
+4 1395 597 1412 1316
+4 596 597 1395 1316
+4 598 597 596 1316
+4 1395 1316 1394 596
+4 1395 1316 1412 1394
+4 466 467 464 1271
+4 92 467 464 466
+4 92 141 467 466
+4 138 140 141 4
+4 138 139 140 4
+4 596 138 598 467
+4 139 138 140 597
+4 596 138 139 597
+4 598 138 596 597
+4 140 138 598 597
+4 141 138 598 140
+4 467 598 141 138
+4 138 141 92 4
+4 464 467 138 596
+4 92 138 467 141
+4 92 467 138 464
+4 9 141 221 256
+4 9 96 8 221
+4 9 141 96 221
+4 0 8 2 3
+4 141 92 96 466
+4 2 4 96 8
+4 0 4 2 8
+4 9 4 0 8
+4 96 4 9 8
+4 4 96 92 2
+4 141 96 4 9
+4 4 96 141 92
+4 8 2 95 96
+4 2 3 8 95
+4 94 3 2 95
+4 117 3 94 95
+4 8 3 117 95
+4 2 95 93 94
+4 93 92 466 95
+4 2 92 93 95
+4 96 92 2 95
+4 466 92 96 95
+4 1271 465 464 466
+4 1271 489 465 466
+4 2548 1269 1344 2547
+4 1267 1271 1269 464
+4 2548 1269 1271 1344
+4 2541 1271 1269 1267
+4 1269 1271 2541 2548
+4 1344 1269 1291 2547
+4 1269 1271 465 464
+4 1344 1291 1269 1271
+4 489 1291 1344 1271
+4 465 1291 489 1271
+4 1269 1291 465 1271
+4 2570 1271 2548 2541
+4 489 1271 1298 466
+4 1298 1271 2548 2570
+4 1344 1271 1298 489
+4 1298 1271 1344 2548
+4 1377 1271 2570 2541
+4 1299 1298 1271 466
+4 1377 1271 1298 2570
+4 1377 1271 1299 1298
+4 489 465 485 1291
+4 489 465 93 485
+4 465 466 92 464
+4 465 466 93 92
+4 465 93 466 489
+4 485 93 487 486
+4 487 95 527 512
+4 488 93 487 485
+4 527 466 488 1299
+4 488 487 93 466
+4 527 487 488 466
+4 95 487 527 466
+4 93 487 95 466
+4 489 93 488 485
+4 488 466 1298 1299
+4 466 488 489 93
+4 1298 489 466 488
+4 94 487 95 93
+4 94 486 487 93
+4 511 94 117 116
+4 511 512 117 94
+4 487 512 511 94
+4 95 512 487 94
+4 117 512 95 94
+4 511 94 486 487
+4 94 511 510 116
+4 511 94 510 486
+4 1520 2847 2582 2845
+4 1520 2846 2847 2845
+4 2846 2663 2683 2641
+4 2847 2688 2689 2656
+4 2847 2660 2688 2656
+4 1507 2824 2823 1970
+4 2847 2688 2825 2689
+4 2660 2825 2681 2661
+4 2688 2825 2660 2847
+4 2688 2825 2681 2660
+4 2846 2825 2660 2661
+4 2846 2825 2847 2660
+4 2661 2682 2683 2680
+4 2681 2682 2661 2680
+4 2663 2682 2681 2680
+4 2683 2682 2663 2680
+4 2683 2680 2846 2661
+4 2683 2680 2663 2846
+4 2846 2825 2661 2680
+4 2663 2825 2846 2680
+4 2681 2825 2663 2680
+4 2661 2825 2681 2680
+4 2822 2663 2682 2681
+4 2682 2683 2663 2822
+4 2825 2688 2824 2689
+4 2681 2825 2823 2822
+4 2688 2825 2823 2681
+4 2823 2824 2825 2688
+4 2823 2825 1507 2822
+4 1507 2824 2825 2823
+4 2822 2825 2663 2681
+4 1507 2825 2663 2822
+4 2689 2688 2690 2656
+4 2688 2690 2824 2689
+4 2823 2824 2600 1970
+4 2600 2824 2688 2690
+4 2600 2824 2823 2688
+4 2581 2824 2690 2689
+4 2600 2824 2581 1970
+4 2581 2824 2600 2690
+4 2582 2583 1315 1312
+4 2582 2581 2583 1312
+4 2582 2824 2583 2581
+4 2582 2689 2824 2581
+4 2846 2825 1520 2847
+4 1520 2601 1360 1315
+4 1360 2663 1520 2641
+4 1520 2601 2663 1360
+4 2601 2663 2825 1520
+4 1520 2663 2846 2641
+4 2846 2825 2663 1520
+4 2601 2582 2583 1315
+4 2824 2582 2601 2825
+4 2583 2601 2824 2582
+4 2582 2601 1520 1315
+4 2582 2601 2825 1520
+4 2582 2825 2847 1520
+4 2582 2825 2689 2847
+4 2582 2825 2824 2689
+4 1315 2583 1313 1312
+4 2601 1313 1315 2583
+4 1313 1314 1507 2601
+4 1315 1314 1313 2601
+4 1360 1314 1315 2601
+4 1507 1314 1360 2601
+4 1313 2583 2581 1312
+4 1970 1507 2824 2583
+4 1313 1507 1970 2583
+4 2601 1507 1313 2583
+4 2824 1507 2601 2583
+4 1970 2583 2581 1313
+4 1970 2583 2824 2581
+4 2663 2601 1507 1360
+4 1507 2825 2601 2663
+4 2825 2601 2824 1507
+4 2581 2600 2691 2690
+4 2580 1313 2581 1312
+4 1969 2600 2602 1313
+4 1970 2600 1969 1313
+4 2581 2600 1970 1313
+4 2602 2600 2581 1313
+4 1313 2602 2580 2581
+4 1313 2602 1969 2580
+4 2691 2602 2581 2580
+4 2581 2600 2602 2691
+4 2600 2704 1969 2602
+4 2691 2704 2600 2602
+4 2580 2704 2691 2602
+4 1969 2704 2580 2602
+4 2643 2663 1360 2641
+4 2643 2683 2663 2641
+4 2662 1360 1488 2643
+4 1488 1507 1360 2662
+4 1488 1506 1507 2662
+4 874 1507 1313 1314
+4 1313 874 1969 1970
+4 1507 874 1313 1970
+4 1506 874 1507 1970
+4 1969 874 1506 1970
+4 874 1507 638 1506
+4 1314 1507 638 874
+4 1314 1507 1360 638
+4 1488 638 1507 1506
+4 638 1507 1360 1488
+4 1506 638 873 1488
+4 873 1506 874 638
+4 874 1506 1429 1969
+4 873 874 1506 1429
+4 2683 2663 2662 2643
+4 2822 2662 2663 1507
+4 2662 2663 2683 2822
+4 1360 2662 2663 2643
+4 1507 2663 1360 2662
+4 2713 1970 2823 2600
+4 2823 2812 1507 1970
+4 2713 2812 2823 1970
+4 1506 2812 2713 1970
+4 1507 2812 1506 1970
+4 2812 1507 2822 2823
+4 2662 1507 2812 1506
+4 2812 1507 2662 2822
+4 1429 1969 2713 2704
+4 1506 1969 2713 1429
+4 1506 1969 1970 2713
+4 2713 1969 2600 2704
+4 2600 1970 1969 2713
+4 637 638 1488 873
+4 1358 2643 1360 2641
+4 1358 2642 2643 2641
+4 791 540 1359 637
+4 1828 791 812 1350
+4 1828 791 1829 812
+4 1829 1359 1828 2642
+4 1829 1359 791 1828
+4 1828 1359 1358 2642
+4 1358 1350 540 1359
+4 1828 1350 1358 1359
+4 791 1350 1828 1359
+4 540 1350 791 1359
+4 2643 1358 1359 2642
+4 1488 1360 1359 2643
+4 1488 1359 1360 638
+4 637 1359 1488 638
+4 540 1359 637 638
+4 1360 1359 540 638
+4 1358 1359 1360 2643
+4 540 1359 1360 1358
+4 1358 639 540 1350
+4 1358 1376 639 1350
+4 1358 1360 1520 2641
+4 1315 1360 639 1314
+4 1358 1520 1360 639
+4 1376 1520 1358 639
+4 1315 1520 1376 639
+4 1360 1520 1315 639
+4 1360 639 540 1358
+4 639 1360 638 1314
+4 639 1360 540 638
+4 1520 2582 2624 2845
+4 2582 1315 2558 1312
+4 2624 1315 2558 2582
+4 2624 1520 1315 2582
+4 1377 2625 1315 2558
+4 2675 2625 1377 2558
+4 2624 2625 2675 2558
+4 1315 2625 2624 2558
+4 1520 1315 2625 2624
+4 2625 1376 1315 1520
+4 1377 1315 2625 1376
+4 2418 2660 2659 2657
+4 2418 2417 2660 2657
+4 2846 2661 2658 2684
+4 2427 2658 2660 2661
+4 2418 2164 2170 2165
+4 2418 2416 2164 2165
+4 2170 2164 2172 2162
+4 2418 2427 2416 2658
+4 2172 2418 2417 2427
+4 2418 2172 2170 2164
+4 2418 2172 2417 2170
+4 2416 2418 2172 2427
+4 2164 2172 2416 2418
+4 2660 2418 2427 2417
+4 2660 2658 2427 2418
+4 2170 2164 1924 2165
+4 2170 2164 1925 1924
+4 2164 1925 2162 2170
+4 2660 2658 2846 2661
+4 2658 2660 2659 2418
+4 2658 2660 2846 2659
+4 2442 2661 2684 2658
+4 2442 2661 2683 2684
+4 2683 2442 2682 2661
+4 2440 2442 2661 2682
+4 2427 2661 2442 2658
+4 2440 2442 2427 2661
+4 5 9 4 0
+4 5 140 139 4
+4 5 9 140 4
+4 630 140 161 256
+4 597 161 630 140
+4 630 597 614 161
+4 2727 2685 2737 2678
+4 2727 2736 2685 2678
+4 1411 597 614 630
+4 1411 1412 597 630
+4 1452 2687 1411 2685
+4 1452 1411 2687 1439
+4 614 1411 1452 1439
+4 1413 1411 614 1439
+4 2687 1411 1413 1439
+4 1413 1411 597 614
+4 1413 1411 1412 597
+4 1412 1413 2687 1411
+4 1439 2687 1463 1413
+4 1463 2736 2687 1439
+4 2727 2736 1463 1439
+4 2685 2736 2727 1439
+4 2687 2736 2685 1439
+4 1439 2685 1452 2727
+4 1452 1439 2687 2685
+4 2737 2727 1452 2685
+4 1439 1452 2737 2727
+4 2580 2687 1463 2736
+4 1395 1413 1412 597
+4 1463 2580 1395 1413
+4 2687 2580 1463 1413
+4 1412 2580 2687 1413
+4 1395 2580 1412 1413
+4 1429 1412 1411 630
+4 2713 2704 2686 1429
+4 2704 2686 2676 2713
+4 2676 2704 2685 2686
+4 2679 2685 2676 2704
+4 2685 2679 2677 2678
+4 2677 2685 2676 2679
+4 2679 2685 2736 2678
+4 2736 2679 2704 2685
+4 2736 2704 2679 2692
+4 2687 2704 2685 2736
+4 1411 2686 2687 1412
+4 1429 2686 1411 1412
+4 2704 2686 1429 1412
+4 2687 2686 2704 1412
+4 2685 2687 2686 2704
+4 2686 2687 2685 1411
+4 2580 2687 2704 1412
+4 2580 2736 2704 2687
+4 2580 2704 2736 2692
+4 1463 1439 1438 2727
+4 139 161 597 140
+4 1463 615 1393 1438
+4 1463 1439 615 1438
+4 1395 615 596 1393
+4 1395 1463 615 1393
+4 597 615 139 596
+4 597 1395 615 596
+4 614 597 139 161
+4 597 615 614 139
+4 1395 615 1413 597
+4 1413 1463 615 1395
+4 1439 615 1413 1463
+4 1413 615 614 597
+4 1439 1413 615 614
+4 140 161 5 139
+4 9 140 161 5
+4 9 140 256 161
+4 159 161 139 5
+4 159 614 139 161
+4 657 1439 614 1452
+4 657 614 613 159
+4 1439 613 614 615
+4 613 1439 614 657
+4 613 614 139 159
+4 613 614 615 139
+4 1437 1439 613 657
+4 1438 613 1439 615
+4 613 1438 1439 1437
+4 1437 1439 2727 1438
+4 1554 1439 1437 657
+4 2727 2726 2737 1439
+4 1437 2726 2727 1439
+4 1554 2726 1437 1439
+4 2737 2726 1554 1439
+4 1452 1439 1554 657
+4 1452 1439 2737 1554
+4 1393 615 613 1438
+4 596 615 613 1393
+4 613 615 596 139
+4 737 934 309 933
+4 737 1574 934 933
+4 2791 2533 2789 2532
+4 2064 2305 2326 2319
+4 2504 2755 2761 2505
+4 1334 1124 1134 1335
+4 1334 1331 1124 1335
+4 1047 1073 1075 1245
+4 269 398 421 399
+4 166 248 245 236
+4 697 695 868 698
+4 697 522 695 698
+4 391 533 377 536
+4 420 547 545 549
+4 420 557 547 549
+4 420 552 547 557
+4 420 584 552 557
+4 420 416 552 584
+4 420 418 416 584
+4 547 416 546 552
+4 547 420 416 552
+4 519 392 371 525
+4 369 392 246 371
+4 369 519 392 371
+4 265 393 416 392
+4 265 249 393 392
+4 169 266 268 170
+4 249 268 266 265
+4 268 249 266 169
+4 268 266 269 170
+4 268 266 418 269
+4 268 266 265 418
+4 250 249 268 169
+4 268 265 394 418
+4 394 249 268 250
+4 394 249 265 268
+4 416 394 265 418
+4 393 249 394 250
+4 265 393 394 416
+4 265 393 249 394
+4 168 266 169 170
+4 246 249 265 392
+4 168 266 249 169
+4 265 168 249 246
+4 266 249 265 168
+4 166 247 245 248
+4 166 250 247 248
+4 235 249 169 168
+4 235 169 249 247
+4 166 169 235 247
+4 250 169 166 247
+4 249 169 250 247
+4 246 249 235 168
+4 246 249 247 235
+4 235 247 245 166
+4 235 247 369 245
+4 247 369 246 235
+4 389 247 248 245
+4 389 369 247 245
+4 247 393 369 389
+4 369 392 393 247
+4 246 392 369 247
+4 249 392 246 247
+4 393 392 249 247
+4 369 393 519 389
+4 519 392 393 369
+4 393 247 248 389
+4 250 247 393 249
+4 248 247 393 250
+4 394 416 420 418
+4 390 393 394 250
+4 390 248 393 250
+4 390 389 393 248
+4 390 377 389 248
+4 390 533 389 377
+4 390 391 533 377
+4 519 546 392 525
+4 519 688 546 525
+4 394 547 545 420
+4 394 416 547 420
+4 390 393 545 394
+4 533 542 519 688
+4 542 390 393 545
+4 519 389 393 542
+4 533 389 519 542
+4 390 389 533 542
+4 393 389 390 542
+4 390 542 391 545
+4 390 542 533 391
+4 546 519 542 688
+4 542 416 546 547
+4 546 542 519 392
+4 416 542 546 392
+4 393 542 416 392
+4 519 542 393 392
+4 545 547 394 393
+4 542 547 545 393
+4 416 547 542 393
+4 394 547 416 393
+4 261 265 246 168
+4 261 266 265 168
+4 546 416 551 552
+4 406 521 551 570
+4 406 405 521 570
+4 392 261 265 246
+4 546 521 392 525
+4 392 416 406 521
+4 546 416 392 521
+4 551 416 546 521
+4 406 416 551 521
+4 265 406 392 416
+4 261 392 265 406
+4 371 521 520 525
+4 371 392 521 525
+4 520 521 370 405
+4 371 370 521 392
+4 371 521 370 520
+4 370 521 406 405
+4 406 392 521 370
+4 246 392 370 371
+4 370 261 392 246
+4 261 392 406 370
+4 695 521 696 525
+4 695 520 521 525
+4 695 521 522 697
+4 520 521 522 695
+4 520 521 405 522
+4 522 521 570 697
+4 570 405 521 522
+4 696 521 697 570
+4 696 521 695 697
+4 551 521 696 570
+4 696 521 546 525
+4 696 546 521 551
+4 415 406 551 570
+4 418 417 416 584
+4 418 421 417 584
+4 417 267 415 398
+4 267 417 406 416
+4 415 406 267 417
+4 418 417 267 416
+4 418 417 398 267
+4 417 418 398 421
+4 269 418 398 267
+4 269 398 418 421
+4 552 416 417 584
+4 417 406 551 415
+4 551 416 417 552
+4 551 416 406 417
+4 267 418 266 269
+4 267 265 261 266
+4 265 267 406 416
+4 261 265 267 406
+4 265 267 418 266
+4 265 267 416 418
+4 535 533 391 536
+4 535 715 533 536
+4 723 547 552 557
+4 723 549 547 557
+4 696 695 868 697
+4 391 542 544 545
+4 701 542 721 543
+4 701 715 542 543
+4 701 688 542 715
+4 701 861 688 715
+4 701 546 722 721
+4 863 692 701 861
+4 701 722 546 692
+4 863 722 701 692
+4 693 722 863 692
+4 546 722 693 692
+4 546 701 542 721
+4 688 701 692 861
+4 546 701 688 542
+4 688 546 692 701
+4 544 542 543 721
+4 715 542 533 688
+4 544 535 543 542
+4 391 535 544 542
+4 533 535 391 542
+4 543 535 533 542
+4 715 533 543 535
+4 715 533 542 543
+4 709 692 861 688
+4 866 709 863 884
+4 863 709 693 692
+4 866 709 693 863
+4 863 709 861 884
+4 861 692 709 863
+4 868 709 866 884
+4 696 709 866 868
+4 696 709 693 866
+4 709 696 695 868
+4 709 696 525 695
+4 696 693 709 525
+4 546 693 696 525
+4 692 693 546 525
+4 709 693 692 525
+4 688 692 525 709
+4 688 692 546 525
+4 547 721 546 542
+4 693 546 548 722
+4 548 546 551 552
+4 548 546 696 551
+4 548 546 693 696
+4 723 722 548 547
+4 721 722 723 547
+4 546 722 721 547
+4 548 722 546 547
+4 548 547 552 723
+4 548 547 546 552
+4 549 547 721 723
+4 544 545 542 721
+4 549 545 544 721
+4 547 545 549 721
+4 542 545 547 721
+4 529 695 520 522
+4 529 698 695 522
+4 245 248 374 236
+4 374 389 377 248
+4 374 245 389 248
+4 379 389 374 245
+4 379 369 389 245
+4 709 687 688 861
+4 709 851 687 861
+4 684 687 709 851
+4 684 712 687 851
+4 688 524 532 687
+4 688 709 524 687
+4 371 519 372 369
+4 526 519 524 372
+4 526 371 519 372
+4 519 526 525 371
+4 519 525 526 524
+4 688 525 519 524
+4 709 525 688 524
+4 526 525 709 524
+4 520 525 526 371
+4 526 529 709 525
+4 520 529 526 525
+4 695 529 520 525
+4 709 529 695 525
+4 533 379 519 389
+4 533 519 379 532
+4 688 519 533 532
+4 524 519 688 532
+4 379 519 524 532
+4 519 379 369 389
+4 379 519 372 524
+4 372 519 379 369
+4 684 709 526 529
+4 684 524 526 709
+4 684 687 524 709
+4 539 687 530 712
+4 379 539 532 524
+4 530 539 379 524
+4 687 539 530 524
+4 532 539 687 524
+4 530 687 684 712
+4 530 687 524 684
+4 530 524 526 684
+4 530 524 372 526
+4 530 524 379 372
+4 851 709 884 861
+4 529 710 711 684
+4 529 709 710 684
+4 710 709 868 884
+4 711 710 529 695
+4 868 710 711 695
+4 709 710 868 695
+4 529 710 709 695
+4 711 695 698 868
+4 698 695 711 529
+4 710 709 851 684
+4 851 709 710 884
+4 538 533 715 536
+4 715 532 688 533
+4 715 538 532 533
+4 715 687 861 688
+4 715 532 687 688
+4 717 687 539 712
+4 539 538 532 687
+4 717 538 539 687
+4 715 538 717 687
+4 532 538 715 687
+4 851 687 717 712
+4 861 687 717 851
+4 861 687 715 717
+4 374 533 389 379
+4 377 374 533 389
+4 374 533 375 377
+4 386 533 374 379
+4 374 375 533 386
+4 375 533 536 377
+4 375 533 386 536
+4 386 533 538 536
+4 386 538 533 379
+4 539 538 386 379
+4 532 538 539 379
+4 533 538 532 379
+4 522 697 523 698
+4 408 405 522 520
+4 408 370 405 520
+4 262 261 370 246
+4 262 168 261 246
+4 522 697 571 523
+4 571 522 570 697
+4 251 396 274 255
+4 254 396 399 274
+4 254 251 396 274
+4 252 269 266 170
+4 252 254 269 170
+4 251 396 252 254
+4 253 396 252 251
+4 253 396 398 252
+4 253 398 396 397
+4 269 254 252 398
+4 399 254 269 398
+4 396 254 399 398
+4 252 254 396 398
+4 266 267 253 264
+4 253 252 398 267
+4 266 252 253 267
+4 269 252 266 267
+4 398 252 269 267
+4 397 253 267 264
+4 397 398 267 253
+4 170 266 167 168
+4 167 266 252 253
+4 167 252 266 170
+4 167 266 262 168
+4 264 266 167 253
+4 262 264 266 167
+4 261 262 266 168
+4 267 266 262 264
+4 261 267 266 262
+4 259 396 251 255
+4 253 397 263 264
+4 253 397 259 263
+4 259 253 396 397
+4 251 396 259 253
+4 415 267 397 398
+4 415 264 263 397
+4 415 267 264 397
+4 407 415 264 263
+4 407 410 415 263
+4 407 267 262 264
+4 407 415 267 264
+4 407 570 415 410
+4 407 408 570 410
+4 267 407 406 415
+4 370 407 406 261
+4 262 407 370 261
+4 267 407 262 261
+4 406 407 267 261
+4 406 407 570 415
+4 370 408 405 406
+4 407 408 370 406
+4 570 408 407 406
+4 405 408 570 406
+4 571 570 408 410
+4 522 408 570 405
+4 522 570 408 571
+4 378 536 386 538
+4 376 386 240 378
+4 376 536 386 378
+4 239 374 236 237
+4 239 374 248 236
+4 239 374 377 248
+4 240 374 239 237
+4 239 376 374 240
+4 376 374 377 239
+4 374 376 386 240
+4 375 376 374 377
+4 386 374 375 376
+4 376 375 536 377
+4 376 375 386 536
+4 683 712 530 684
+4 243 374 237 236
+4 243 245 374 236
+4 242 379 245 369
+4 242 372 379 369
+4 387 379 242 372
+4 387 530 379 372
+4 531 712 530 683
+4 374 242 379 245
+4 374 243 242 245
+4 531 539 530 712
+4 388 379 242 387
+4 244 374 386 240
+4 374 241 243 244
+4 374 241 242 243
+4 374 241 379 242
+4 243 241 388 244
+4 388 242 241 243
+4 242 241 379 388
+4 244 386 374 241
+4 388 386 244 241
+4 379 386 388 241
+4 374 386 379 241
+4 243 238 237 374
+4 244 238 243 374
+4 240 238 244 374
+4 237 238 240 374
+4 388 379 539 386
+4 531 387 530 539
+4 388 387 531 539
+4 379 387 388 539
+4 530 387 379 539
+4 864 868 711 698
+4 864 869 868 698
+4 884 868 865 866
+4 857 885 856 1052
+4 856 710 684 711
+4 851 710 885 884
+4 856 852 885 857
+4 856 685 852 857
+4 852 684 851 712
+4 710 856 684 851
+4 885 856 710 851
+4 852 856 885 851
+4 684 856 852 851
+4 685 852 684 856
+4 683 684 852 712
+4 684 852 685 683
+4 864 885 1062 1052
+4 864 856 885 1052
+4 710 711 885 865
+4 868 711 710 865
+4 864 711 868 865
+4 885 711 864 865
+4 1062 864 865 885
+4 868 865 1062 864
+4 865 710 884 885
+4 865 710 868 884
+4 856 885 711 864
+4 711 710 885 856
+4 864 1062 1051 1052
+4 864 1062 869 1051
+4 869 868 1062 864
+4 726 723 557 549
+4 862 693 722 863
+4 862 866 693 863
+4 869 876 700 850
+4 571 697 699 523
+4 402 255 260 258
+4 581 572 748 574
+4 741 564 581 565
+4 741 566 564 565
+4 741 735 564 566
+4 741 740 735 566
+4 1129 1121 1123 1334
+4 755 927 929 751
+4 755 749 927 751
+4 749 752 753 579
+4 927 752 753 749
+4 927 755 752 749
+4 1129 927 930 1121
+4 1129 929 927 1121
+4 930 927 752 753
+4 755 927 931 929
+4 930 926 752 927
+4 931 926 930 927
+4 755 926 931 927
+4 752 926 755 927
+4 1129 927 931 930
+4 1129 929 931 927
+4 931 929 1129 942
+4 930 1121 1123 1129
+4 756 921 911 913
+4 911 753 921 756
+4 911 930 753 927
+4 753 911 921 930
+4 1123 911 921 913
+4 1121 930 911 927
+4 1123 911 930 921
+4 1123 911 1121 930
+4 921 756 740 913
+4 578 753 752 579
+4 578 582 753 579
+4 564 734 741 581
+4 564 578 734 581
+4 582 734 564 578
+4 582 753 734 578
+4 756 734 582 753
+4 756 921 734 753
+4 564 734 735 741
+4 735 734 582 756
+4 564 734 582 735
+4 741 921 734 735
+4 740 921 741 735
+4 756 921 740 735
+4 734 921 756 735
+4 754 581 734 752
+4 748 581 754 752
+4 578 581 748 752
+4 734 581 578 752
+4 734 752 753 754
+4 752 734 753 578
+4 754 752 926 748
+4 754 752 930 926
+4 930 753 752 754
+4 754 753 921 930
+4 741 734 754 581
+4 921 754 734 753
+4 921 741 734 754
+4 572 748 578 581
+4 746 578 569 572
+4 749 752 746 755
+4 746 579 752 749
+4 746 578 579 569
+4 579 752 578 746
+4 748 578 746 572
+4 746 752 926 755
+4 752 746 748 578
+4 926 752 746 748
+4 1122 1123 1121 1334
+4 912 911 1123 913
+4 912 756 911 913
+4 1122 911 1121 1123
+4 1122 912 911 1123
+4 583 582 756 735
+4 750 927 749 751
+4 750 908 927 751
+4 912 753 911 756
+4 912 731 753 756
+4 909 907 908 1122
+4 909 907 750 908
+4 907 750 731 909
+4 912 907 909 1122
+4 912 907 731 909
+4 911 907 1122 908
+4 911 907 912 1122
+4 731 907 728 750
+4 731 907 753 728
+4 907 753 912 731
+4 911 907 753 912
+4 750 907 927 908
+4 750 749 927 907
+4 728 749 750 907
+4 753 749 728 907
+4 927 749 753 907
+4 927 907 911 908
+4 911 907 927 753
+4 728 753 579 749
+4 753 583 582 756
+4 728 580 579 753
+4 583 580 728 753
+4 582 580 583 753
+4 579 580 582 753
+4 731 753 583 728
+4 731 753 756 583
+4 908 911 1121 1122
+4 929 927 908 751
+4 1121 908 927 911
+4 1121 927 908 929
+4 561 582 580 583
+4 561 735 582 583
+4 561 582 415 580
+4 735 582 560 561
+4 402 401 403 260
+4 565 560 402 566
+4 403 565 414 401
+4 402 565 403 401
+4 560 565 402 401
+4 414 565 560 401
+4 566 564 560 735
+4 565 560 564 414
+4 560 565 564 566
+4 582 560 564 735
+4 414 564 582 560
+4 255 401 402 260
+4 396 401 402 255
+4 396 401 560 402
+4 414 401 263 403
+4 397 414 401 263
+4 397 415 414 263
+4 398 414 397 415
+4 398 397 414 560
+4 396 397 398 560
+4 401 397 396 560
+4 414 397 401 560
+4 398 561 560 414
+4 415 561 398 414
+4 582 561 415 414
+4 560 561 582 414
+4 259 401 260 403
+4 396 401 259 397
+4 259 255 401 396
+4 259 401 255 260
+4 263 401 259 403
+4 263 401 397 259
+4 413 414 263 403
+4 413 565 414 403
+4 415 582 579 580
+4 415 578 569 579
+4 415 582 578 579
+4 578 414 564 582
+4 578 415 414 582
+4 410 414 415 263
+4 410 409 414 263
+4 410 572 578 414
+4 409 572 410 414
+4 411 572 409 414
+4 578 572 411 414
+4 569 578 410 572
+4 415 410 578 414
+4 569 578 415 410
+4 409 411 574 572
+4 413 414 409 263
+4 413 411 409 414
+4 409 411 413 574
+4 413 411 581 574
+4 564 414 581 565
+4 578 414 581 564
+4 578 414 411 581
+4 581 414 413 565
+4 581 414 411 413
+4 581 411 572 574
+4 581 411 578 572
+4 871 751 755 929
+4 699 749 694 746
+4 699 755 749 746
+4 875 858 699 755
+4 699 858 867 694
+4 699 867 858 875
+4 699 858 749 755
+4 694 858 749 699
+4 858 694 859 867
+4 858 694 749 859
+4 755 858 871 875
+4 858 749 751 859
+4 751 858 755 749
+4 755 858 751 871
+4 694 699 697 867
+4 572 571 410 569
+4 746 571 572 569
+4 570 571 746 569
+4 410 571 570 569
+4 571 699 697 570
+4 746 699 571 570
+4 694 699 746 570
+4 697 699 694 570
+4 746 694 579 749
+4 579 570 746 569
+4 579 570 694 746
+4 570 569 415 410
+4 750 749 859 751
+4 415 570 579 569
+4 575 579 728 580
+4 728 749 686 750
+4 686 575 694 749
+4 728 575 686 749
+4 579 575 728 749
+4 694 575 579 749
+4 686 749 859 750
+4 686 749 694 859
+4 415 579 575 580
+4 575 579 570 694
+4 570 579 575 415
+4 1123 1124 1134 1334
+4 1123 1122 1124 1334
+4 1123 932 936 1134
+4 1123 1124 932 1134
+4 932 1122 914 1124
+4 932 1123 1122 1124
+4 914 912 731 909
+4 914 1122 912 909
+4 932 912 914 1122
+4 932 1123 912 1122
+4 932 913 912 1123
+4 932 936 913 1123
+4 757 912 731 914
+4 757 932 912 914
+4 913 758 759 936
+4 913 932 758 936
+4 587 735 586 758
+4 587 588 735 758
+4 562 735 561 586
+4 562 587 735 586
+4 562 560 398 561
+4 562 735 560 561
+4 399 560 396 398
+4 399 562 560 398
+4 402 422 400 563
+4 422 560 399 562
+4 422 396 274 399
+4 400 258 274 270
+4 402 258 400 270
+4 255 258 402 270
+4 274 258 255 270
+4 255 270 396 274
+4 396 270 255 402
+4 400 422 402 270
+4 274 422 400 270
+4 396 422 274 270
+4 402 422 396 270
+4 560 422 396 402
+4 396 422 560 399
+4 563 560 566 402
+4 563 422 560 402
+4 587 560 563 422
+4 588 563 587 735
+4 566 563 588 735
+4 560 563 566 735
+4 587 563 560 735
+4 562 560 587 422
+4 562 560 735 587
+4 587 758 759 588
+4 588 735 740 566
+4 740 758 759 913
+4 758 740 588 735
+4 759 758 740 588
+4 756 758 740 913
+4 756 758 735 740
+4 583 735 586 561
+4 756 757 912 731
+4 758 932 913 756
+4 757 932 758 756
+4 912 932 757 756
+4 913 932 912 756
+4 757 756 583 731
+4 757 586 583 756
+4 758 586 757 756
+4 735 586 758 756
+4 583 586 735 756
+4 876 867 699 875
+4 699 700 697 867
+4 876 700 699 867
+4 868 700 876 867
+4 697 700 868 867
+4 523 697 699 700
+4 868 700 869 876
+4 698 868 700 869
+4 697 700 698 868
+4 698 697 523 700
+4 421 398 562 399
+4 421 561 586 562
+4 421 398 561 562
+4 561 417 415 398
+4 561 421 417 398
+4 584 561 586 421
+4 584 417 561 421
+4 909 730 914 906
+4 909 729 730 906
+4 551 694 575 570
+4 551 696 694 570
+4 548 686 691 576
+4 548 551 686 576
+4 548 693 691 686
+4 696 693 548 686
+4 859 693 696 686
+4 691 693 859 686
+4 694 686 859 696
+4 551 686 696 548
+4 696 694 686 551
+4 575 551 686 694
+4 686 551 728 576
+4 728 686 575 551
+4 551 575 415 570
+4 415 551 580 575
+4 580 417 415 561
+4 417 580 551 550
+4 415 580 551 417
+4 583 417 580 561
+4 583 550 580 417
+4 580 551 728 575
+4 580 728 551 550
+4 583 728 580 550
+4 576 728 583 550
+4 551 728 576 550
+4 750 686 691 859
+4 731 576 728 583
+4 731 730 576 583
+4 750 576 729 691
+4 729 750 909 730
+4 576 750 729 730
+4 731 750 576 730
+4 909 750 731 730
+4 576 750 686 691
+4 728 576 750 686
+4 728 576 731 750
+4 731 730 914 909
+4 757 730 731 583
+4 731 730 757 914
+4 732 730 906 914
+4 732 757 730 914
+4 732 729 726 906
+4 732 730 729 906
+4 722 691 548 693
+4 548 723 691 722
+4 732 583 730 757
+4 732 584 583 757
+4 732 552 584 557
+4 552 576 551 548
+4 583 552 550 417
+4 576 552 583 730
+4 576 550 583 552
+4 552 583 584 417
+4 583 552 732 730
+4 552 583 732 584
+4 551 550 552 417
+4 551 550 576 552
+4 552 723 732 730
+4 723 732 557 552
+4 557 723 726 732
+4 723 732 729 726
+4 723 729 732 730
+4 730 723 576 552
+4 576 730 729 723
+4 723 576 691 729
+4 548 576 723 552
+4 548 576 691 723
+4 586 583 584 757
+4 584 583 561 417
+4 586 583 561 584
+4 697 694 696 570
+4 696 859 866 693
+4 866 867 696 868
+4 859 696 867 694
+4 696 859 867 866
+4 696 867 697 868
+4 696 867 694 697
+4 1046 876 869 850
+4 1046 1047 876 850
+4 876 1073 1075 1047
+4 876 1046 1073 1047
+4 866 859 862 693
+4 875 872 1074 1075
+4 875 870 871 1074
+4 875 872 870 1074
+4 870 867 1057 872
+4 870 875 867 872
+4 870 858 867 875
+4 870 871 858 875
+4 859 1057 867 866
+4 870 1057 867 858
+4 860 1057 870 858
+4 859 1057 860 858
+4 867 1057 859 858
+4 751 858 860 870
+4 751 858 859 860
+4 1057 859 862 866
+4 860 859 862 1057
+4 870 751 904 860
+4 751 870 871 858
+4 904 871 751 870
+4 928 751 871 929
+4 928 871 751 904
+4 1046 1070 876 1073
+4 1046 1071 1070 1073
+4 1046 1070 869 876
+4 1046 869 1070 1071
+4 1051 869 1046 1071
+4 1062 869 1051 1071
+4 1070 869 1062 1071
+4 869 1070 868 876
+4 1062 1070 868 869
+4 1075 876 1070 1073
+4 867 1070 876 868
+4 875 876 867 872
+4 1075 876 875 872
+4 1070 876 1075 872
+4 867 876 1070 872
+4 1063 868 865 1062
+4 1063 868 866 865
+4 866 1063 867 868
+4 1063 867 1057 866
+4 1063 867 872 1057
+4 1070 868 1063 1062
+4 1070 867 1063 868
+4 1070 867 872 1063
+4 904 908 751 928
+4 751 904 750 908
+4 750 860 859 691
+4 750 860 751 859
+4 751 750 904 860
+4 750 860 691 725
+4 691 862 859 693
+4 862 691 860 725
+4 862 860 691 859
+4 722 691 862 725
+4 862 693 691 722
+4 860 750 905 725
+4 905 904 750 860
+4 904 908 910 905
+4 928 908 910 904
+4 928 910 908 1121
+4 908 904 750 905
+4 725 691 723 722
+4 909 908 905 910
+4 905 750 909 729
+4 905 909 750 908
+4 910 908 1122 909
+4 910 1122 908 1121
+4 725 691 729 723
+4 729 750 725 905
+4 729 725 750 691
+4 1121 929 928 1129
+4 929 928 908 1121
+4 929 908 928 751
+4 1049 885 852 857
+4 1049 1052 885 857
+4 1065 1062 1052 1051
+4 1065 1071 1062 1051
+4 1075 1073 1280 1245
+4 885 1065 1062 1052
+4 885 1049 1065 1052
+4 1469 1705 1481 1711
+4 1279 1075 1070 1073
+4 1279 1280 1075 1073
+4 1504 1494 1733 1516
+4 1504 1296 1494 1516
+4 1509 1464 1282 1469
+4 1509 1705 1464 1469
+4 1509 1493 1464 1705
+4 1509 1732 1493 1705
+4 1057 1061 1063 866
+4 1057 1056 1061 866
+4 1066 1277 1266 1257
+4 1066 1278 1277 1257
+4 1066 1067 1057 1266
+4 1066 1277 1067 1266
+4 1074 1072 1280 1075
+4 1074 872 1072 1075
+4 1074 1278 1280 1072
+4 1066 1278 1074 1072
+4 1277 1278 1066 1072
+4 1280 1278 1277 1072
+4 872 1072 1066 1074
+4 1067 1072 1066 872
+4 1067 1072 1277 1066
+4 1075 1072 1279 1070
+4 1279 1072 1280 1277
+4 1279 1280 1072 1075
+4 1279 1072 1067 1070
+4 1067 1277 1072 1279
+4 1070 1072 872 1075
+4 872 1067 1072 1070
+4 872 1066 870 1074
+4 1063 1067 872 1070
+4 872 1057 1067 1063
+4 872 1057 1066 1067
+4 872 1066 1057 870
+4 1273 1067 1063 1070
+4 1273 1279 1067 1070
+4 1288 1266 1277 1257
+4 1266 1505 1272 1288
+4 1266 1277 1505 1288
+4 1273 1266 1505 1272
+4 1505 1273 1279 1277
+4 1266 1273 1505 1277
+4 1067 1273 1266 1277
+4 1279 1273 1067 1277
+4 1061 1266 1273 1272
+4 1273 1063 1067 1266
+4 1061 1063 1273 1266
+4 1057 1063 1061 1266
+4 1067 1063 1057 1266
+4 1088 1266 1061 1272
+4 1088 1288 1266 1272
+4 1056 1266 1057 1061
+4 1056 1088 1266 1061
+4 882 1081 1066 1055
+4 1056 1081 882 1055
+4 1266 1081 1056 1055
+4 1066 1081 1266 1055
+4 870 1055 882 1066
+4 882 1056 1055 870
+4 870 1057 1056 1054
+4 1266 1057 1066 1054
+4 1066 1057 870 1054
+4 1056 1057 1266 1054
+4 1066 1055 1266 1054
+4 1266 1055 1056 1054
+4 1066 870 1055 1054
+4 1055 870 1056 1054
+4 1076 1081 1066 882
+4 1066 1081 1257 1266
+4 1066 1257 1081 1076
+4 1088 1266 1081 1056
+4 1081 1266 1288 1257
+4 1081 1266 1088 1288
+4 1059 1061 1056 866
+4 1059 1061 1088 1056
+4 1059 1272 1088 1061
+4 1088 1272 1296 1288
+4 1272 1088 1090 1059
+4 1272 1088 1296 1090
+4 1508 1277 1505 1279
+4 1508 1280 1277 1279
+4 1508 1278 1277 1280
+4 1508 1282 1278 1280
+4 1508 1464 1278 1282
+4 1508 1509 1464 1282
+4 1464 1277 1508 1278
+4 1464 1257 1277 1278
+4 1503 1277 1288 1505
+4 1503 1508 1277 1505
+4 1509 1495 1493 1732
+4 1509 1503 1495 1732
+4 1495 1277 1257 1288
+4 1495 1503 1277 1288
+4 1508 1503 1277 1281
+4 1509 1503 1508 1281
+4 1495 1503 1509 1281
+4 1277 1503 1495 1281
+4 1508 1281 1464 1509
+4 1464 1277 1281 1508
+4 1509 1281 1493 1495
+4 1464 1281 1493 1509
+4 1495 1257 1277 1281
+4 1493 1257 1495 1281
+4 1464 1257 1493 1281
+4 1277 1257 1464 1281
+4 1503 1288 1504 1505
+4 1733 1495 1503 1732
+4 1504 1503 1733 1494
+4 1288 1503 1504 1494
+4 1495 1503 1288 1494
+4 1733 1503 1495 1494
+4 1504 1288 1272 1505
+4 1504 1288 1296 1272
+4 1288 1296 1494 1504
+4 1255 1257 1066 1076
+4 1481 1464 1705 1469
+4 1481 1252 1464 1469
+4 1481 1493 1283 1480
+4 1252 1283 1481 1464
+4 1255 1283 1252 1464
+4 1493 1283 1255 1464
+4 1481 1283 1493 1464
+4 1705 1493 1481 1480
+4 1705 1493 1464 1481
+4 1282 1464 1252 1469
+4 1252 1464 1244 1255
+4 1252 1244 1464 1282
+4 1255 1464 1257 1493
+4 1464 1244 1278 1282
+4 1066 1244 1278 1257
+4 1255 1244 1066 1257
+4 1464 1244 1255 1257
+4 1278 1244 1464 1257
+4 1280 1278 1244 1282
+4 1244 1278 1074 1066
+4 1244 1074 1278 1280
+4 1510 1493 1732 1705
+4 1510 1480 1493 1705
+4 1510 1283 1493 1480
+4 1510 1475 1283 1480
+4 1089 1088 1056 1059
+4 1089 1090 1088 1059
+4 1732 1495 1511 1733
+4 1511 1493 1495 1732
+4 1511 1510 1493 1732
+4 1257 1285 1081 1076
+4 1081 1089 1088 1056
+4 1257 1081 1285 1287
+4 1288 1081 1257 1287
+4 1289 1081 1288 1287
+4 1285 1081 1289 1287
+4 1089 1081 1288 1289
+4 1088 1081 1288 1089
+4 1257 1287 1495 1288
+4 1257 1287 1285 1495
+4 1287 1285 1290 1289
+4 1511 1285 1287 1495
+4 1290 1285 1287 1511
+4 1289 1082 1081 1285
+4 1110 1082 1289 1285
+4 1076 1082 1110 1285
+4 1081 1082 1076 1285
+4 1248 1290 1285 1110
+4 1104 1290 1248 1110
+4 1289 1290 1104 1110
+4 1285 1290 1289 1110
+4 1076 1082 903 1110
+4 903 882 1056 1082
+4 1076 882 903 1082
+4 1081 882 1076 1082
+4 1056 882 1081 1082
+4 1089 1081 1082 1056
+4 1289 1081 1082 1089
+4 1284 1510 1285 1475
+4 1284 1283 1510 1475
+4 1284 1285 1076 1110
+4 1284 1257 1255 1076
+4 1284 1285 1257 1076
+4 1495 1285 1493 1511
+4 1493 1284 1257 1255
+4 1257 1285 1493 1495
+4 1257 1493 1285 1284
+4 1493 1285 1510 1511
+4 1284 1493 1283 1255
+4 1284 1493 1510 1283
+4 1493 1285 1284 1510
+4 1290 1285 1286 1248
+4 1286 1285 1510 1475
+4 1286 1285 1511 1510
+4 1286 1285 1290 1511
+4 1250 1286 1284 1110
+4 1248 1286 1250 1110
+4 1285 1286 1248 1110
+4 1284 1286 1285 1110
+4 1286 1284 1475 1250
+4 1286 1284 1285 1475
+4 1293 1289 1290 1104
+4 1292 1288 1289 1089
+4 1513 1289 1290 1293
+4 1513 1289 1287 1290
+4 1289 1287 1288 1513
+4 1289 1513 1292 1293
+4 1292 1289 1288 1513
+4 1292 1288 1296 1513
+4 1090 1089 1088 1296
+4 1292 1089 1090 1296
+4 1288 1089 1292 1296
+4 1088 1089 1288 1296
+4 1513 1287 1511 1290
+4 1287 1513 1495 1288
+4 1511 1495 1287 1513
+4 1513 1495 1733 1511
+4 1733 1494 1513 1516
+4 1513 1495 1494 1733
+4 1495 1494 1288 1513
+4 1513 1494 1296 1516
+4 1296 1288 1494 1513
+4 1279 1070 1071 1073
+4 1297 1296 1504 1516
+4 851 886 1048 888
+4 885 886 1048 851
+4 885 884 886 851
+4 1087 885 886 1048
+4 865 1060 1063 1062
+4 865 885 1060 1062
+4 884 1087 885 886
+4 884 1059 1087 886
+4 1059 1060 1087 1272
+4 1059 1061 1060 1272
+4 866 1059 865 884
+4 865 866 1063 1060
+4 1059 866 865 1060
+4 1061 866 1059 1060
+4 1063 866 1061 1060
+4 884 885 1087 1059
+4 865 885 884 1059
+4 1060 885 865 1059
+4 1087 885 1060 1059
+4 1048 1087 1064 1253
+4 885 1087 1064 1048
+4 885 1087 1060 1064
+4 1064 1087 1272 1253
+4 1272 1060 1087 1064
+4 1064 1060 1273 1272
+4 885 1065 1064 1060
+4 1062 1065 885 1060
+4 1273 1065 1062 1060
+4 1064 1065 1273 1060
+4 1063 1060 1273 1062
+4 1273 1060 1061 1272
+4 1061 1060 1273 1063
+4 1048 886 1091 888
+4 1091 1087 886 1048
+4 1091 1253 1087 1048
+4 1090 1087 886 1091
+4 1090 1087 1059 886
+4 1090 1087 1272 1059
+4 1091 1296 1090 1087
+4 1253 1296 1091 1087
+4 1272 1296 1253 1087
+4 1090 1296 1272 1087
+4 1062 1273 1071 1065
+4 1070 1273 1062 1063
+4 1062 1273 1070 1071
+4 1273 1071 1279 1070
+4 1064 1272 1274 1253
+4 1275 1273 1279 1505
+4 1065 1273 1275 1064
+4 1275 1273 1071 1279
+4 1275 1273 1065 1071
+4 1275 1274 1064 1273
+4 1505 1274 1275 1273
+4 1272 1274 1505 1273
+4 1064 1274 1272 1273
+4 1504 1272 1274 1505
+4 1274 1297 1253 1272
+4 1504 1297 1274 1272
+4 1296 1297 1504 1272
+4 1253 1297 1296 1272
+4 1295 1296 1090 1091
+4 1295 1296 1292 1090
+4 1300 1296 1292 1295
+4 1300 1515 1296 1295
+4 1516 1296 1514 1515
+4 1514 1513 1296 1516
+4 1514 1292 1513 1293
+4 1513 1296 1292 1514
+4 1514 1296 1300 1515
+4 1294 1292 1514 1293
+4 1300 1514 1292 1296
+4 1514 1292 1294 1300
+4 1253 1296 1295 1091
+4 1515 1296 1297 1516
+4 1295 1296 1297 1515
+4 1295 1296 1253 1297
+4 863 1059 866 884
+4 1079 1078 1080 1289
+4 1079 1082 1078 1289
+4 722 899 723 725
+4 722 877 899 725
+4 718 881 879 889
+4 881 879 708 718
+4 708 702 714 879
+4 708 881 702 879
+4 707 702 708 881
+4 707 724 702 881
+4 535 543 707 544
+4 707 535 708 702
+4 543 535 707 702
+4 714 535 543 702
+4 708 535 714 702
+4 544 721 707 549
+4 543 707 721 702
+4 544 721 543 707
+4 707 721 724 549
+4 707 721 702 724
+4 721 714 701 543
+4 721 702 714 543
+4 724 702 720 721
+4 1080 879 881 889
+4 878 879 881 1080
+4 881 878 724 702
+4 879 878 881 702
+4 720 878 879 702
+4 724 878 720 702
+4 879 1080 890 889
+4 878 879 880 720
+4 879 1080 880 890
+4 879 1080 878 880
+4 714 720 701 880
+4 714 720 721 701
+4 720 702 714 721
+4 879 720 714 880
+4 714 702 720 879
+4 723 724 721 549
+4 722 880 877 863
+4 722 701 880 863
+4 721 720 722 701
+4 899 720 724 878
+4 723 721 724 899
+4 722 721 723 899
+4 720 721 722 899
+4 724 721 720 899
+4 880 722 720 701
+4 722 877 880 720
+4 899 877 722 720
+4 878 877 899 720
+4 880 877 878 720
+4 1059 877 880 863
+4 878 877 1079 899
+4 1078 877 1080 890
+4 1080 877 1079 878
+4 1079 1078 877 1080
+4 1080 877 880 890
+4 1080 877 878 880
+4 1059 877 890 880
+4 890 1078 877 1059
+4 862 877 863 722
+4 862 725 877 722
+4 1079 877 903 899
+4 903 1056 877 1079
+4 1082 1056 903 1079
+4 1078 1056 1082 1079
+4 877 1056 1078 1079
+4 903 877 725 899
+4 862 877 903 1056
+4 903 877 862 725
+4 1059 877 1056 1078
+4 866 862 1056 1059
+4 863 862 866 1059
+4 877 862 863 1059
+4 1056 862 877 1059
+4 890 1080 1085 889
+4 1085 1078 1289 1080
+4 1085 890 1078 1080
+4 1089 1085 1292 1090
+4 1089 1085 1289 1292
+4 1289 1078 1085 1089
+4 1089 1059 1078 1085
+4 1090 1059 1089 1085
+4 890 1059 1090 1085
+4 1078 1059 890 1085
+4 1056 1078 1089 1059
+4 1082 1078 1089 1056
+4 1082 1078 1289 1089
+4 1105 1077 1104 1248
+4 1105 1135 1077 1248
+4 938 1077 1105 1135
+4 938 937 1077 1135
+4 1294 1289 1085 1292
+4 897 889 1084 1080
+4 1099 898 1086 1084
+4 897 898 1099 1084
+4 889 898 897 1084
+4 1086 898 889 1084
+4 897 889 718 898
+4 897 889 881 718
+4 881 1080 889 897
+4 1086 1084 1085 1294
+4 1085 889 1084 1086
+4 889 1084 1080 1085
+4 1289 1085 1084 1294
+4 1085 1084 1080 1289
+4 1289 1294 1293 1292
+4 1294 1084 1095 1086
+4 1293 1095 1294 1289
+4 1104 1095 1293 1289
+4 1084 1095 1104 1289
+4 1294 1095 1084 1289
+4 1095 1084 1099 1086
+4 1105 1084 1095 1104
+4 1095 1084 1105 1099
+4 938 1084 897 1099
+4 938 1105 1084 1099
+4 883 1084 897 938
+4 883 937 1084 938
+4 1080 1084 1079 1289
+4 878 883 1080 897
+4 899 937 1079 878
+4 883 937 899 878
+4 1080 937 883 878
+4 1079 937 1080 878
+4 1080 883 1084 897
+4 1084 1080 937 883
+4 1084 1080 1079 937
+4 724 878 883 899
+4 881 897 878 1080
+4 883 878 881 897
+4 724 878 881 883
+4 1289 1084 1077 1104
+4 1077 1084 1079 937
+4 1077 1079 1084 1289
+4 1077 1084 1105 1104
+4 938 1084 1077 937
+4 1105 1084 1077 938
+4 937 1079 903 899
+4 1110 1077 1135 1248
+4 1110 1077 937 1135
+4 937 903 1079 1077
+4 1110 903 937 1077
+4 1082 903 1110 1077
+4 1079 903 1082 1077
+4 1082 1077 1289 1079
+4 1110 1077 1289 1082
+4 1110 1077 1104 1289
+4 1104 1077 1110 1248
+4 713 879 718 708
+4 713 716 879 708
+4 891 879 713 716
+4 891 892 879 716
+4 1092 1090 892 1091
+4 1092 1295 1090 1091
+4 718 891 879 713
+4 718 719 891 713
+4 1092 1292 1090 1295
+4 1092 1300 1292 1295
+4 1092 1294 1292 1300
+4 1092 1093 1294 1300
+4 890 1092 1085 1090
+4 890 892 1092 1090
+4 891 890 879 892
+4 891 1092 890 892
+4 719 889 898 718
+4 719 891 889 718
+4 893 889 719 891
+4 893 1092 889 891
+4 894 1086 893 1093
+4 719 898 889 893
+4 894 898 719 893
+4 1086 898 894 893
+4 889 898 1086 893
+4 1092 893 889 1085
+4 1093 893 1092 1085
+4 1086 893 1093 1085
+4 889 893 1086 1085
+4 889 891 879 718
+4 890 1092 889 1085
+4 889 891 890 879
+4 890 889 1092 891
+4 1093 1085 1294 1086
+4 1085 1092 1292 1090
+4 1085 1092 1294 1292
+4 1294 1092 1085 1093
+4 714 716 715 708
+4 714 879 716 708
+4 886 892 1090 1091
+4 892 886 880 861
+4 1059 886 880 890
+4 1090 886 1059 890
+4 892 886 1090 890
+4 880 886 892 890
+4 863 861 880 1059
+4 884 861 863 1059
+4 886 861 884 1059
+4 880 861 886 1059
+4 892 886 888 1091
+4 851 886 861 884
+4 888 717 851 886
+4 892 717 888 886
+4 861 717 892 886
+4 851 717 861 886
+4 861 880 701 863
+4 880 892 879 890
+4 879 892 880 714
+4 716 892 879 714
+4 715 892 716 714
+4 880 892 715 714
+4 892 715 861 880
+4 717 892 715 861
+4 892 715 716 717
+4 715 880 701 861
+4 715 880 714 701
+4 714 715 535 708
+4 543 714 715 535
+4 701 714 715 543
+4 708 716 537 713
+4 716 715 538 717
+4 537 715 538 716
+4 537 708 715 716
+4 536 534 715 538
+4 378 534 536 538
+4 537 534 378 538
+4 715 534 537 538
+4 534 715 535 536
+4 708 715 534 537
+4 535 715 534 708
+4 862 1056 1057 866
+4 860 903 862 725
+4 860 1056 1057 862
+4 870 1056 860 882
+4 1057 1056 860 870
+4 1056 860 903 862
+4 903 1056 882 860
+4 724 723 726 549
+4 1119 1109 1328 1326
+4 1119 1325 1109 1326
+4 905 903 882 860
+4 905 725 903 860
+4 937 1108 903 1110
+4 937 1135 1108 1110
+4 1113 937 938 1135
+4 1113 1108 937 1135
+4 901 937 883 938
+4 901 1113 937 938
+4 905 899 903 725
+4 905 729 899 725
+4 1111 1113 1108 902
+4 1112 1113 1111 902
+4 937 1113 1112 902
+4 1108 1113 937 902
+4 1111 902 1115 1112
+4 1111 902 1108 1115
+4 1108 902 903 1115
+4 1108 902 937 903
+4 1112 937 901 1113
+4 937 902 899 903
+4 1112 937 899 901
+4 1112 899 937 902
+4 909 902 1112 1115
+4 909 906 1112 902
+4 729 906 909 902
+4 899 906 729 902
+4 1112 906 899 902
+4 909 902 905 729
+4 905 902 1115 903
+4 905 1115 902 909
+4 905 902 899 729
+4 903 902 899 905
+4 900 899 901 1112
+4 900 906 899 1112
+4 723 899 729 725
+4 883 901 899 937
+4 900 899 883 901
+4 900 899 724 883
+4 726 900 729 723
+4 724 900 726 723
+4 899 900 724 723
+4 729 900 899 723
+4 900 729 906 726
+4 906 899 729 900
+4 1119 1108 1115 1111
+4 1076 1108 1109 1110
+4 1076 903 1108 1110
+4 1076 915 903 882
+4 1108 915 1115 903
+4 915 1108 1119 1109
+4 915 1108 1115 1119
+4 1076 915 1108 903
+4 915 1108 1109 1076
+4 915 903 905 1115
+4 915 903 882 905
+4 1113 1108 1328 1111
+4 1328 1108 1135 1110
+4 1135 1108 1328 1113
+4 1328 1108 1119 1111
+4 1109 1108 1328 1110
+4 1119 1109 1108 1328
+4 910 1115 905 909
+4 905 882 904 860
+4 1109 1125 1114 915
+4 1076 1125 1109 915
+4 916 1125 1076 915
+4 1114 1125 916 915
+4 916 915 904 1114
+4 882 915 916 1076
+4 916 915 882 904
+4 915 904 905 882
+4 905 904 915 1115
+4 910 904 905 1115
+4 1114 904 910 1115
+4 915 904 1114 1115
+4 1119 915 1114 1115
+4 1325 1114 1109 1125
+4 1119 1109 1114 915
+4 1325 1109 1114 1119
+4 928 1114 904 910
+4 1107 1125 1114 1325
+4 1107 916 1114 1125
+4 928 916 1107 929
+4 916 928 1114 904
+4 928 916 1114 1107
+4 928 916 871 904
+4 871 916 928 929
+4 904 882 870 860
+4 870 916 882 904
+4 870 871 916 904
+4 1074 916 870 871
+4 1074 1045 916 871
+4 1045 1066 1244 1074
+4 1045 916 1066 1074
+4 1125 1066 1045 916
+4 1244 1050 1255 1066
+4 1045 1050 1244 1066
+4 1125 1050 1045 1066
+4 1255 1050 1125 1066
+4 1076 1125 1066 1255
+4 1066 916 1125 1076
+4 1066 916 870 1074
+4 1066 916 882 870
+4 882 916 1066 1076
+4 1045 1125 1107 1050
+4 929 916 1045 871
+4 1107 1045 916 1125
+4 1107 929 916 1045
+4 1138 1125 1050 1107
+4 1138 1325 1125 1107
+4 1050 1255 1252 1244
+4 1247 1325 1336 1326
+4 1247 1109 1325 1326
+4 1284 1125 1109 1076
+4 1284 1255 1125 1076
+4 1125 1247 1284 1109
+4 1125 1325 1247 1109
+4 1481 1351 1251 1467
+4 1481 1480 1351 1467
+4 1252 1283 1251 1481
+4 1125 1251 1284 1247
+4 1255 1251 1252 1283
+4 1050 1251 1255 1125
+4 1050 1255 1251 1252
+4 1255 1251 1284 1125
+4 1284 1255 1283 1251
+4 1475 1251 1351 1247
+4 1351 1251 1475 1480
+4 1481 1251 1351 1480
+4 1283 1251 1481 1480
+4 1475 1251 1283 1480
+4 1284 1251 1475 1247
+4 1284 1283 1475 1251
+4 1138 1125 1251 1050
+4 1251 1351 1353 1467
+4 1353 1251 1247 1351
+4 1138 1336 1137 1125
+4 1325 1336 1138 1125
+4 1247 1336 1325 1125
+4 1137 1336 1247 1125
+4 1251 1137 1125 1138
+4 1247 1137 1125 1251
+4 1251 1353 1247 1137
+4 1138 1353 1251 1137
+4 1336 1353 1138 1137
+4 1247 1353 1336 1137
+4 1139 1109 1247 1326
+4 1139 1328 1109 1326
+4 1247 1284 1250 1475
+4 1284 1109 1110 1076
+4 1250 1110 1139 1248
+4 1247 1250 1284 1109
+4 1139 1250 1247 1109
+4 1110 1250 1139 1109
+4 1284 1250 1110 1109
+4 1139 1110 1135 1248
+4 1139 1110 1328 1135
+4 1110 1328 1109 1139
+4 1329 1111 1112 1113
+4 1329 1328 1111 1113
+4 1138 1336 1343 1353
+4 1338 1138 1336 1343
+4 1338 1126 1138 1343
+4 1556 1325 1326 1336
+4 1328 1116 1332 1329
+4 1332 1119 1331 1116
+4 1326 1331 1556 1562
+4 1326 1331 1325 1556
+4 1331 1325 1119 1326
+4 1332 1331 1326 1562
+4 1326 1119 1331 1332
+4 1332 1119 1328 1326
+4 1332 1119 1116 1328
+4 1111 1116 1328 1329
+4 1111 1116 1119 1328
+4 1111 1116 1115 1119
+4 1112 1116 1111 1329
+4 1115 1116 1111 1112
+4 909 1116 1115 1112
+4 1119 1331 1114 1325
+4 1114 1115 1122 1331
+4 1119 1115 1114 1331
+4 1116 1115 1119 1331
+4 1122 1115 1116 1331
+4 1115 1122 910 1114
+4 1122 1115 909 1116
+4 909 1115 1122 910
+4 1337 1325 1331 1556
+4 1107 1325 1129 1126
+4 1121 1114 1129 928
+4 1331 1129 1114 1325
+4 1121 1114 1331 1129
+4 1107 1129 1114 928
+4 1107 1325 1114 1129
+4 1129 1325 1337 1126
+4 1337 1331 1325 1129
+4 1126 1325 1138 1107
+4 1337 1325 1338 1126
+4 1338 1556 1325 1337
+4 1556 1325 1336 1338
+4 1338 1325 1138 1126
+4 1336 1325 1138 1338
+4 942 1107 1129 1126
+4 1129 1107 929 928
+4 1129 929 1107 942
+4 910 1114 1121 928
+4 1121 1122 1114 910
+4 1121 1331 1114 1122
+4 1337 1556 1564 1338
+4 1112 909 1120 906
+4 1112 1116 1120 909
+4 1329 1116 1120 1112
+4 1120 1332 1116 1329
+4 1332 1116 1124 1120
+4 1124 1332 1331 1116
+4 1332 1331 1335 1124
+4 1565 1562 1331 1332
+4 1337 1564 1556 1331
+4 1565 1564 1337 1331
+4 1562 1564 1565 1331
+4 1556 1564 1562 1331
+4 1120 909 914 906
+4 1337 1331 1334 1565
+4 1129 1331 1334 1337
+4 1129 1331 1121 1334
+4 1334 1331 1335 1565
+4 1334 1331 1122 1124
+4 1331 1122 1121 1334
+4 1116 1124 1122 1331
+4 1124 1120 1116 1122
+4 914 1120 1124 1122
+4 909 1120 914 1122
+4 1116 1120 909 1122
+4 712 851 888 717
+4 1048 1064 1049 1253
+4 1064 885 1049 1065
+4 1049 1048 885 1064
+4 852 851 888 712
+4 1048 885 852 1049
+4 852 851 1048 888
+4 1048 885 851 852
+4 1098 1086 1099 898
+4 1098 894 1086 898
+4 1094 1086 1098 894
+4 1094 1093 1086 894
+4 1351 1480 1482 1467
+4 1745 1519 1744 1749
+4 1305 1514 1293 1303
+4 1305 1519 1514 1303
+4 1519 1513 1512 1305
+4 1745 1744 1519 1513
+4 1740 1744 1745 1513
+4 1512 1744 1740 1513
+4 1519 1744 1512 1513
+4 1519 1513 1514 1745
+4 1514 1513 1519 1305
+4 1293 1513 1514 1305
+4 1511 1513 1512 1740
+4 1513 1512 1290 1511
+4 1290 1305 1513 1293
+4 1512 1513 1290 1305
+4 1513 1745 1516 1514
+4 1733 1740 1513 1511
+4 1733 1513 1745 1516
+4 1745 1740 1513 1733
+4 1515 1514 1521 1300
+4 1521 1746 1745 1514
+4 1515 1746 1521 1514
+4 1516 1746 1515 1514
+4 1745 1746 1516 1514
+4 1749 1745 1521 1746
+4 1519 1521 1745 1514
+4 1521 1519 1745 1749
+4 1525 1519 1521 1749
+4 1300 1303 1521 1302
+4 1521 1514 1303 1300
+4 1514 1303 1519 1521
+4 1521 1303 1525 1302
+4 1521 1303 1519 1525
+4 1104 1305 1319 1290
+4 1104 1293 1305 1290
+4 1086 1097 1294 1093
+4 1095 1294 1097 1303
+4 1095 1294 1086 1097
+4 1302 1294 1097 1093
+4 1303 1294 1097 1302
+4 1300 1294 1302 1093
+4 1300 1294 1303 1302
+4 1294 1303 1514 1300
+4 1294 1303 1293 1514
+4 1293 1294 1095 1303
+4 1094 1097 1093 1302
+4 1094 1097 1086 1093
+4 1097 1086 1098 1094
+4 1304 1095 1097 1303
+4 1099 1095 1304 1105
+4 1304 1098 1097 1095
+4 1099 1098 1304 1095
+4 1086 1098 1099 1095
+4 1097 1098 1086 1095
+4 1104 1304 1293 1095
+4 1104 1304 1305 1293
+4 1319 1104 1304 1305
+4 1105 1104 1304 1319
+4 1304 1095 1104 1105
+4 1304 1293 1303 1305
+4 1304 1293 1095 1303
+4 1740 1512 1743 1744
+4 1319 1104 1248 1105
+4 1248 1319 1290 1104
+4 1478 1290 1248 1319
+4 1248 1478 1286 1290
+4 1478 1286 1250 1248
+4 1286 1250 1479 1478
+4 1475 1479 1510 1286
+4 1475 1250 1479 1286
+4 1475 1714 1480 1510
+4 1475 1479 1714 1510
+4 1714 1475 1476 1479
+4 1482 1476 1714 1480
+4 1351 1476 1482 1480
+4 1475 1476 1351 1480
+4 1714 1476 1475 1480
+4 1476 1475 1250 1479
+4 1476 1475 1247 1250
+4 1247 1351 1475 1476
+4 1305 1290 1478 1319
+4 1478 1512 1290 1305
+4 1511 1478 1512 1290
+4 1511 1286 1478 1290
+4 1715 1510 1714 1479
+4 1715 1510 1742 1714
+4 1715 1510 1511 1742
+4 1478 1479 1286 1511
+4 1715 1479 1478 1511
+4 1510 1479 1715 1511
+4 1286 1479 1510 1511
+4 1512 1511 1715 1478
+4 1740 1743 1512 1511
+4 1742 1743 1740 1511
+4 1715 1743 1742 1511
+4 1512 1743 1715 1511
+4 1481 1482 1480 1467
+4 1481 1708 1482 1467
+4 1732 1511 1740 1733
+4 1732 1511 1742 1740
+4 1510 1742 1732 1511
+4 1510 1742 1705 1732
+4 1714 1480 1720 1482
+4 1720 1705 1480 1714
+4 1742 1705 1720 1714
+4 1510 1705 1742 1714
+4 1480 1705 1510 1714
+4 1705 1481 1708 1720
+4 1480 1481 1705 1720
+4 1482 1481 1480 1720
+4 1708 1481 1482 1720
+4 1708 1705 1711 1481
+4 1708 1705 1720 1711
+4 1141 1135 1113 938
+4 1141 1105 1135 938
+4 1478 1477 1512 1305
+4 1478 1319 1477 1305
+4 1569 1336 1343 1338
+4 1559 1336 1353 1343
+4 1559 1569 1336 1343
+4 1479 1713 1714 1715
+4 1586 1356 1582 1354
+4 1586 1353 1356 1354
+4 1557 1352 1336 1356
+4 1557 1582 1352 1356
+4 1792 1557 1559 1569
+4 1559 1558 1557 1792
+4 1558 1557 1352 1559
+4 1336 1559 1557 1569
+4 1336 1352 1557 1559
+4 1582 1557 1558 1792
+4 1558 1352 1557 1582
+4 1586 1352 1356 1353
+4 1582 1352 1586 1558
+4 1582 1352 1356 1586
+4 1559 1352 1586 1353
+4 1586 1558 1352 1559
+4 1353 1352 1336 1559
+4 1336 1356 1352 1353
+4 1353 1356 1247 1336
+4 1351 1356 1473 1247
+4 1351 1353 1356 1247
+4 1583 1356 1354 1582
+4 1354 1351 1353 1356
+4 1467 1351 1354 1483
+4 1467 1351 1353 1354
+4 1483 1351 1354 1583
+4 1473 1351 1483 1583
+4 1356 1351 1473 1583
+4 1354 1351 1356 1583
+4 1482 1483 1351 1467
+4 1476 1473 1250 1247
+4 1476 1351 1473 1247
+4 1476 1474 1479 1250
+4 1476 1473 1474 1250
+4 1714 1712 1476 1482
+4 1476 1479 1474 1712
+4 1714 1479 1476 1712
+4 1713 1479 1714 1712
+4 1474 1479 1713 1712
+4 1712 1476 1473 1474
+4 1476 1482 1712 1473
+4 1351 1482 1476 1473
+4 1483 1482 1351 1473
+4 1712 1482 1483 1473
+4 1583 1483 1547 1354
+4 1578 1712 1544 1728
+4 1544 1712 1473 1474
+4 1544 1473 1712 1578
+4 1544 1712 1727 1728
+4 1544 1712 1713 1727
+4 1712 1713 1474 1544
+4 1547 1712 1578 1728
+4 1583 1547 1483 1473
+4 1578 1547 1583 1473
+4 1712 1547 1578 1473
+4 1483 1547 1712 1473
+4 1724 1712 1547 1728
+4 1724 1725 1712 1728
+4 1722 1724 1723 1725
+4 1722 1712 1724 1725
+4 1484 1483 1482 1467
+4 1484 1354 1483 1467
+4 1483 1548 1547 1354
+4 1483 1484 1548 1354
+4 1483 1724 1712 1547
+4 1483 1548 1724 1547
+4 1483 1722 1482 1712
+4 1483 1724 1722 1712
+4 1484 1722 1723 1721
+4 1723 1484 1548 1724
+4 1722 1484 1723 1724
+4 1483 1484 1722 1724
+4 1548 1484 1483 1724
+4 1722 1484 1482 1721
+4 1482 1722 1483 1484
+4 1484 1482 1708 1467
+4 1720 1482 1721 1722
+4 1721 1708 1482 1720
+4 1708 1482 1484 1721
+4 1714 1722 1712 1482
+4 1714 1720 1722 1482
+4 1725 1727 1712 1728
+4 1725 1963 1727 1728
+4 1713 1962 1714 1715
+4 1712 1962 1722 1714
+4 1725 1962 1712 1727
+4 1962 1712 1722 1725
+4 1713 1962 1712 1714
+4 1727 1712 1713 1962
+4 1963 1727 1962 1725
+4 1750 1727 1962 1963
+4 1743 1962 1713 1715
+4 1743 1962 1727 1713
+4 1962 1727 1750 1743
+4 1962 1714 1720 1722
+4 1962 1714 1742 1720
+4 1742 1715 1962 1743
+4 1742 1715 1714 1962
+4 1727 1743 1522 1750
+4 1479 1474 1478 1250
+4 1485 1713 1727 1544
+4 1485 1474 1713 1544
+4 1522 1713 1743 1727
+4 1522 1485 1713 1727
+4 1715 1522 1713 1743
+4 1715 1512 1522 1743
+4 1522 1477 1715 1713
+4 1485 1477 1522 1713
+4 1478 1477 1485 1713
+4 1715 1477 1478 1713
+4 1715 1477 1512 1478
+4 1512 1522 1477 1715
+4 1478 1713 1479 1715
+4 1478 1713 1474 1479
+4 1713 1474 1485 1478
+4 1569 1556 1336 1338
+4 1569 1564 1556 1338
+4 1587 1357 1589 1588
+4 1587 1583 1357 1588
+4 1587 1356 1357 1583
+4 1587 1582 1356 1583
+4 1329 1332 1563 1333
+4 1553 1357 1361 1589
+4 1553 1561 1357 1589
+4 1330 1135 1328 1113
+4 1330 1141 1135 1113
+4 1553 1327 1357 1561
+4 1361 1327 1357 1553
+4 1361 1330 1327 1553
+4 1330 1140 1141 1361
+4 1330 1140 1135 1141
+4 1135 1140 1328 1139
+4 1140 1135 1328 1330
+4 1327 1140 1330 1361
+4 1327 1140 1328 1330
+4 1328 1140 1327 1139
+4 1140 1327 1357 1361
+4 1357 1327 1140 1139
+4 1330 1328 1329 1113
+4 1332 1327 1563 1560
+4 1329 1563 1332 1328
+4 1330 1563 1329 1328
+4 1327 1563 1330 1328
+4 1332 1563 1327 1328
+4 1553 1327 1563 1330
+4 1563 1327 1561 1560
+4 1553 1327 1561 1563
+4 1326 1327 1357 1139
+4 1561 1560 1326 1562
+4 1326 1327 1561 1357
+4 1327 1561 1560 1326
+4 1328 1327 1326 1139
+4 1326 1332 1327 1328
+4 1326 1560 1332 1562
+4 1326 1560 1327 1332
+4 1790 1561 1553 1589
+4 1790 1561 1563 1553
+4 1561 1563 1793 1790
+4 1332 1560 1565 1562
+4 1563 1565 1332 1560
+4 1333 1332 1563 1565
+4 1565 1793 1562 1560
+4 1563 1793 1565 1560
+4 1561 1793 1563 1560
+4 1562 1793 1561 1560
+4 1793 1562 1564 1565
+4 1587 1561 1790 1589
+4 1587 1357 1561 1589
+4 1326 1357 1247 1139
+4 1792 1557 1788 1582
+4 1791 1557 1788 1792
+4 1791 1569 1557 1792
+4 1557 1791 1556 1569
+4 1557 1791 1561 1556
+4 1788 1561 1557 1791
+4 1791 1556 1569 1564
+4 1793 1564 1562 1561
+4 1791 1564 1793 1561
+4 1556 1564 1791 1561
+4 1562 1564 1556 1561
+4 1790 1561 1791 1793
+4 1790 1561 1788 1791
+4 1587 1561 1788 1790
+4 1587 1557 1788 1561
+4 1788 1557 1587 1582
+4 1557 1556 1336 1569
+4 1556 1561 1326 1562
+4 1357 1355 1356 1587
+4 1357 1561 1355 1587
+4 1336 1355 1326 1556
+4 1336 1326 1355 1356
+4 1247 1326 1336 1356
+4 1357 1326 1247 1356
+4 1355 1326 1357 1356
+4 1326 1355 1561 1556
+4 1357 1355 1561 1326
+4 1557 1355 1336 1556
+4 1557 1355 1356 1336
+4 1356 1557 1587 1355
+4 1356 1587 1557 1582
+4 1561 1355 1557 1556
+4 1557 1355 1561 1587
+4 1250 1357 1321 1139
+4 1250 1247 1357 1139
+4 1578 1473 1550 1544
+4 1578 1588 1550 1473
+4 1583 1588 1578 1473
+4 1357 1588 1583 1473
+4 1550 1588 1357 1473
+4 1321 1473 1550 1357
+4 1544 1322 1474 1473
+4 1550 1322 1544 1473
+4 1321 1322 1550 1473
+4 1474 1322 1321 1473
+4 1473 1357 1356 1583
+4 1473 1357 1247 1356
+4 1250 1321 1473 1474
+4 1473 1357 1250 1247
+4 1473 1357 1321 1250
+4 1250 1321 1248 1139
+4 1322 1474 1485 1544
+4 1248 1474 1321 1250
+4 1248 1478 1474 1250
+4 1474 1318 1485 1478
+4 1322 1474 1318 1485
+4 1322 1474 1321 1318
+4 1248 1318 1474 1478
+4 1318 1474 1321 1248
+4 1478 1318 1319 1248
+4 1478 1318 1477 1319
+4 1318 1477 1485 1478
+4 1248 1317 1318 1319
+4 1248 1105 1317 1319
+4 1589 1357 1550 1588
+4 1348 1321 1318 1322
+4 1348 1550 1321 1322
+4 1550 1361 1357 1589
+4 1317 1135 1141 1105
+4 1317 1248 1135 1105
+4 1348 1248 1317 1318
+4 1348 1321 1248 1318
+4 1348 1357 1321 1550
+4 1348 1361 1357 1550
+4 1140 1348 1141 1361
+4 1140 1357 1348 1361
+4 1248 1140 1135 1139
+4 1248 1135 1140 1348
+4 1317 1135 1248 1348
+4 1141 1135 1317 1348
+4 1140 1135 1141 1348
+4 1140 1139 1248 1348
+4 1357 1139 1140 1348
+4 1321 1139 1357 1348
+4 1248 1139 1321 1348
+4 1136 1105 1141 938
+4 1136 1099 1105 938
+4 1743 1534 1760 1744
+4 1743 1512 1534 1744
+4 1546 1762 1761 1766
+4 1546 1775 1762 1766
+4 1317 1311 1319 1105
+4 1535 1477 1542 1311
+4 1727 1541 1771 1754
+4 1727 1541 1543 1771
+4 1522 1485 1727 1541
+4 1477 1485 1522 1541
+4 1543 1485 1477 1541
+4 1727 1485 1543 1541
+4 1541 1727 1750 1754
+4 1522 1541 1727 1750
+4 1771 1541 1761 1754
+4 1761 1543 1541 1771
+4 1541 1543 1535 1477
+4 1761 1541 1543 1535
+4 1774 1727 1543 1771
+4 1543 1477 1542 1535
+4 1542 1543 1485 1477
+4 1543 1485 1549 1542
+4 1727 1544 1774 1543
+4 1485 1544 1727 1543
+4 1549 1544 1485 1543
+4 1774 1544 1549 1543
+4 1318 1542 1485 1477
+4 1485 1549 1322 1544
+4 1318 1322 1485 1542
+4 1348 1322 1318 1542
+4 1549 1322 1348 1542
+4 1485 1322 1549 1542
+4 1550 1549 1322 1348
+4 1322 1549 1550 1544
+4 1578 1549 1544 1550
+4 1578 1774 1544 1549
+4 1774 1544 1728 1578
+4 1728 1774 1727 1544
+4 1981 1727 1750 1963
+4 1771 1727 1981 1774
+4 1754 1727 1981 1771
+4 1981 1727 1754 1750
+4 1728 1727 1981 1963
+4 1728 1727 1774 1981
+4 1318 1542 1317 1348
+4 1318 1319 1317 1542
+4 1477 1319 1318 1542
+4 1311 1319 1477 1542
+4 1317 1319 1311 1542
+4 1477 1311 1305 1319
+4 1305 1477 1535 1311
+4 1477 1534 1512 1305
+4 1477 1535 1534 1305
+4 1534 1541 1761 1535
+4 1534 1477 1541 1535
+4 1743 1541 1522 1750
+4 1522 1512 1477 1541
+4 1743 1512 1522 1541
+4 1534 1512 1743 1541
+4 1477 1512 1534 1541
+4 1760 1541 1750 1754
+4 1743 1541 1760 1534
+4 1750 1541 1760 1743
+4 1761 1541 1760 1754
+4 1761 1541 1534 1760
+4 1317 1136 1311 1105
+4 1317 1141 1136 1105
+4 1317 1323 1136 1141
+4 1317 1348 1323 1141
+4 1779 1550 1578 1588
+4 1311 1323 1324 1136
+4 1311 1317 1323 1136
+4 1779 1549 1774 1578
+4 1779 1550 1549 1578
+4 1323 1542 1348 1317
+4 1323 1311 1542 1317
+4 1324 1542 1323 1311
+4 1324 1535 1542 1311
+4 1535 1545 1546 1324
+4 1535 1542 1545 1324
+4 1761 1545 1762 1546
+4 1761 1535 1545 1546
+4 1772 1549 1774 1779
+4 1772 1551 1549 1779
+4 1542 1545 1543 1535
+4 1551 1772 1549 1542
+4 1545 1772 1551 1542
+4 1543 1772 1545 1542
+4 1549 1772 1543 1542
+4 1545 1543 1762 1772
+4 1543 1545 1761 1535
+4 1545 1543 1761 1762
+4 1771 1543 1762 1761
+4 1774 1772 1543 1549
+4 1772 1543 1771 1774
+4 1771 1543 1772 1762
+4 1545 1542 1323 1324
+4 1550 1549 1551 1779
+4 1549 1551 1348 1550
+4 1542 1551 1348 1549
+4 1323 1551 1542 1545
+4 1542 1551 1323 1348
+4 1349 1323 1141 1136
+4 1349 1324 1323 1136
+4 1349 1348 1361 1141
+4 1349 1323 1348 1141
+4 1775 1545 1546 1762
+4 1775 1772 1545 1762
+4 1552 1545 1324 1546
+4 1552 1775 1545 1546
+4 1552 1772 1545 1775
+4 1552 1780 1772 1775
+4 1552 1323 1349 1324
+4 1552 1545 1323 1324
+4 1579 1779 1551 1780
+4 1579 1809 1779 1780
+4 1348 1349 1551 1323
+4 1579 1550 1589 1361
+4 1550 1579 1779 1551
+4 1809 1579 1779 1588
+4 1589 1579 1809 1588
+4 1550 1579 1589 1588
+4 1779 1579 1550 1588
+4 1361 1579 1550 1348
+4 1349 1579 1361 1348
+4 1551 1579 1349 1348
+4 1550 1579 1551 1348
+4 1780 1551 1772 1779
+4 1552 1551 1772 1780
+4 1545 1552 1551 1772
+4 1545 1323 1551 1552
+4 1579 1551 1552 1780
+4 1552 1349 1551 1579
+4 1552 1323 1551 1349
+4 2012 1761 1762 1766
+4 2003 1761 2010 2012
+4 2010 1761 1760 1754
+4 2010 1761 2003 1760
+4 2010 1761 1762 2012
+4 1771 1761 2010 1754
+4 1771 1761 1762 2010
+4 1304 1311 1105 1319
+4 1304 1305 1311 1319
+4 1304 1136 1099 1105
+4 1304 1311 1136 1105
+4 1306 1304 1136 1099
+4 1306 1098 1304 1099
+4 1306 1311 1324 1136
+4 1306 1304 1311 1136
+4 1524 1523 1320 1301
+4 1320 1535 1546 1324
+4 1535 1526 1320 1546
+4 1535 1761 1526 1546
+4 1752 1533 1526 1523
+4 1752 1525 1533 1523
+4 1753 1527 1752 1525
+4 1753 1749 1527 1525
+4 1527 1751 1744 1749
+4 1527 1753 1751 1749
+4 1760 1744 1534 1761
+4 1751 1744 1760 1761
+4 1527 1744 1751 1761
+4 1534 1744 1527 1761
+4 2003 1761 1751 1760
+4 2003 1752 1753 1751
+4 1761 1752 2003 1751
+4 1527 1752 1761 1751
+4 1753 1752 1527 1751
+4 1527 1761 1533 1534
+4 1533 1752 1761 1527
+4 1761 1533 1526 1752
+4 1535 1533 1761 1534
+4 1761 1526 1533 1535
+4 1533 1527 1525 1752
+4 1320 1526 1533 1523
+4 1535 1526 1533 1320
+4 1763 2003 1752 1753
+4 1524 1526 1320 1523
+4 1524 1752 1526 1523
+4 1537 1526 1546 1320
+4 1537 1524 1526 1320
+4 1537 1761 1766 1546
+4 1537 1526 1761 1546
+4 1765 1761 2012 1766
+4 1765 1537 1761 1766
+4 1537 1752 1536 1765
+4 1752 1537 1524 1526
+4 1537 1752 1524 1536
+4 1761 1752 1537 1765
+4 1761 1752 1526 1537
+4 2012 1763 2003 1761
+4 1765 1763 2012 1761
+4 1752 1763 1765 1761
+4 2003 1763 1752 1761
+4 1752 1765 1763 1536
+4 1306 1535 1320 1324
+4 1306 1311 1535 1324
+4 1519 1527 1744 1749
+4 1519 1525 1527 1749
+4 1094 1097 1106 1098
+4 1106 1303 1301 1320
+4 1106 1301 1303 1097
+4 1094 1301 1106 1097
+4 1302 1301 1094 1097
+4 1303 1301 1302 1097
+4 1098 1304 1106 1306
+4 1097 1106 1304 1303
+4 1106 1097 1304 1098
+4 1304 1106 1320 1303
+4 1106 1304 1320 1306
+4 1302 1303 1523 1301
+4 1525 1303 1523 1302
+4 1523 1533 1303 1525
+4 1523 1303 1320 1301
+4 1523 1303 1533 1320
+4 1305 1533 1535 1534
+4 1533 1320 1303 1305
+4 1535 1320 1533 1305
+4 1304 1320 1535 1305
+4 1303 1320 1304 1305
+4 1311 1304 1535 1305
+4 1535 1304 1306 1320
+4 1311 1535 1304 1306
+4 1305 1533 1519 1303
+4 1534 1519 1533 1527
+4 1519 1534 1533 1305
+4 1519 1533 1525 1303
+4 1519 1533 1527 1525
+4 1512 1534 1519 1305
+4 1519 1744 1534 1512
+4 1519 1527 1534 1744
+4 2046 1790 1791 1793
+4 1777 1978 1983 1980
+4 1777 1773 1978 1980
+4 2286 2025 2257 2258
+4 2286 2033 2025 2258
+4 2062 2324 2061 2305
+4 2286 2063 2288 2289
+4 2286 2035 2063 2289
+4 1774 2023 1999 1771
+4 1774 2023 2025 1999
+4 2024 2023 2286 2025
+4 2024 1774 2023 2025
+4 2035 2023 1807 1779
+4 1807 2063 2024 2023
+4 2035 2063 1807 2023
+4 2286 2063 2035 2023
+4 2024 2063 2286 2023
+4 1807 2023 1774 1779
+4 1807 2023 2024 1774
+4 2030 2023 2286 2035
+4 1999 2023 2011 1771
+4 2011 2023 2257 2030
+4 2257 1999 2023 2011
+4 1999 2023 2025 2257
+4 2257 2023 2286 2030
+4 2257 2023 2025 2286
+4 1780 2023 2030 2035
+4 1780 1779 2023 2035
+4 1775 2023 2011 2030
+4 1775 1780 2023 2030
+4 1771 2023 1772 1774
+4 1775 2011 2023 1772
+4 1762 2011 1775 1772
+4 1771 2011 1762 1772
+4 2023 2011 1771 1772
+4 1780 2023 1772 1775
+4 1772 2023 1779 1774
+4 1772 1779 2023 1780
+4 2024 2063 1807 2032
+4 1766 1762 2011 1775
+4 2012 1762 2011 1766
+4 2011 2010 1762 2012
+4 2011 1771 2010 1999
+4 2010 1762 1771 2011
+4 2033 2024 2286 2025
+4 2288 2286 2031 2032
+4 2063 2286 2288 2032
+4 2024 2286 2063 2032
+4 2031 2286 2024 2032
+4 2286 2031 2033 2288
+4 2033 2024 2031 2286
+4 2024 2031 1983 2033
+4 2024 2031 2032 1983
+4 2288 2063 2324 2289
+4 2061 2060 2324 2059
+4 2034 2060 2061 2059
+4 2063 2060 2034 2059
+4 2324 2060 2063 2059
+4 2061 2059 2062 2034
+4 2061 2059 2324 2062
+4 2062 2288 2034 2059
+4 2324 2288 2062 2059
+4 2063 2288 2324 2059
+4 2034 2288 2063 2059
+4 2063 2034 2032 2288
+4 2032 2063 2060 2034
+4 2236 2288 2034 2062
+4 2034 2236 1983 2032
+4 2288 2236 2034 2032
+4 2031 2236 2288 2032
+4 1983 2236 2031 2032
+4 2236 2031 2033 1983
+4 2033 2288 2031 2236
+4 2035 1779 1809 1780
+4 2289 2063 2070 2035
+4 2063 2325 2324 2289
+4 2063 2070 2325 2289
+4 2070 1806 2069 1808
+4 2060 2070 2063 1806
+4 2060 2069 2070 1806
+4 1811 2065 2060 2069
+4 1811 2071 2065 2069
+4 2061 2065 2324 2060
+4 2061 1811 2065 2060
+4 2305 2065 2064 2326
+4 2061 2065 2064 2305
+4 2061 2065 1811 2064
+4 2064 2065 2071 2326
+4 2071 1811 2065 2064
+4 2324 2065 2305 2326
+4 2324 2065 2061 2305
+4 2326 2065 2325 2324
+4 2326 2065 2327 2325
+4 2327 2065 2071 2069
+4 2326 2065 2071 2327
+4 2327 2065 2070 2325
+4 2070 2069 2065 2327
+4 2060 2065 2070 2069
+4 2063 2070 2060 2324
+4 2325 2070 2063 2324
+4 2065 2070 2325 2324
+4 2060 2070 2065 2324
+4 2032 2063 1806 2060
+4 1806 1807 2063 2032
+4 1807 2070 2063 2035
+4 1807 2070 1806 2063
+4 1806 1807 1808 2070
+4 2070 1807 1809 2035
+4 2070 1807 1808 1809
+4 1779 1809 1807 2035
+4 1809 1807 1588 1779
+4 1588 1808 1807 1809
+4 1978 2024 1983 2033
+4 1978 2025 2024 2033
+4 1754 1771 1999 2010
+4 1981 1771 1999 1754
+4 1999 1981 1774 1771
+4 1981 1774 2025 1999
+4 1976 1774 2025 1981
+4 1777 2024 1983 1978
+4 1777 1773 2024 1978
+4 1583 1807 1578 1588
+4 1583 1808 1807 1588
+4 1983 1777 2032 2024
+4 2071 1810 2042 2045
+4 2071 2069 1810 2045
+4 1803 2060 1805 1804
+4 1810 2060 1803 1806
+4 1805 1810 2060 1803
+4 2032 1803 2060 1806
+4 2034 1803 2060 2032
+4 2060 2034 1804 1803
+4 1804 2060 2061 2034
+4 1804 2064 2061 2060
+4 1805 2064 1804 2060
+4 1811 2064 1805 2060
+4 2061 2064 1811 2060
+4 2060 1810 2069 1806
+4 2071 2042 1810 1811
+4 2064 2042 2071 1811
+4 1805 2042 2064 1811
+4 1810 2042 1805 1811
+4 2060 1811 1810 1805
+4 2069 1810 1811 2071
+4 1811 2060 1810 2069
+4 2034 1778 1803 2032
+4 1983 1778 2034 2032
+4 1777 1778 1983 2032
+4 1803 1778 1777 2032
+4 1804 2034 1778 1803
+4 1584 1810 1805 1803
+4 2042 1810 1799 2045
+4 1799 1810 1805 1584
+4 1799 1805 1810 2042
+4 1813 1806 1808 2069
+4 1813 1810 1806 2069
+4 1583 1806 1807 1808
+4 1583 1813 1806 1808
+4 1584 1580 1803 1577
+4 1803 1584 1810 1806
+4 1580 1584 1803 1806
+4 1813 1584 1580 1806
+4 1810 1584 1813 1806
+4 1580 1803 1776 1806
+4 1776 1580 1577 1803
+4 2032 1776 1803 1806
+4 1777 1776 1803 2032
+4 1577 1776 1803 1777
+4 1807 1776 2032 1806
+4 1773 1777 2024 1807
+4 1776 1777 1773 1807
+4 2032 1777 1776 1807
+4 2024 1777 2032 1807
+4 1580 1806 1583 1813
+4 1578 1807 1776 1773
+4 1776 1583 1807 1578
+4 1776 1583 1806 1807
+4 1776 1580 1806 1583
+4 1813 1810 1799 1584
+4 2045 1810 1813 2069
+4 1813 1810 2045 1799
+4 1578 1807 1779 1588
+4 1578 1807 1774 1779
+4 1807 1774 1773 1578
+4 1774 1773 2024 1807
+4 2025 1978 2024 1774
+4 1976 1978 2025 1774
+4 1773 1978 1976 1774
+4 2024 1978 1773 1774
+4 2290 2324 2062 2305
+4 2288 2062 2290 2324
+4 2287 2033 2286 2258
+4 2290 2288 2236 2062
+4 2288 2236 2287 2290
+4 2287 2033 2288 2286
+4 2287 2288 2033 2236
+4 1584 1813 1794 1799
+4 1585 1813 1586 1794
+4 1585 1584 1813 1794
+4 1547 1776 1773 1578
+4 1547 1583 1776 1578
+4 1726 1773 1777 1980
+4 1726 1724 1773 1980
+4 1726 1776 1577 1777
+4 1726 1773 1776 1777
+4 1547 1726 1548 1724
+4 1585 1580 1577 1548
+4 1585 1580 1584 1577
+4 1584 1813 1580 1585
+4 1583 1585 1580 1813
+4 1580 1547 1585 1583
+4 1547 1580 1585 1548
+4 1776 1547 1580 1583
+4 1577 1548 1580 1776
+4 1726 1548 1577 1776
+4 1547 1548 1726 1776
+4 1580 1548 1547 1776
+4 1773 1726 1547 1724
+4 1773 1776 1547 1726
+4 1585 1581 1354 1586
+4 1354 1547 1585 1548
+4 1583 1585 1354 1547
+4 1583 1354 1585 1581
+4 1581 1585 1813 1586
+4 1813 1581 1583 1585
+4 1726 1724 1723 1548
+4 1723 1979 1725 1724
+4 1726 1979 1723 1724
+4 1980 1979 1726 1724
+4 1725 1979 1980 1724
+4 1963 1728 1976 1981
+4 1977 1728 1976 1963
+4 1977 1725 1728 1963
+4 1978 1773 1977 1980
+4 1977 1976 1773 1978
+4 1976 1773 1728 1977
+4 1725 1977 1728 1724
+4 1980 1977 1725 1724
+4 1773 1977 1980 1724
+4 1728 1977 1773 1724
+4 1774 1976 1728 1981
+4 1773 1728 1774 1976
+4 1728 1578 1773 1774
+4 1728 1773 1547 1724
+4 1728 1547 1773 1578
+4 1977 1725 1979 1980
+4 1816 1588 1587 1589
+4 1816 1809 1588 1589
+4 1587 1808 1583 1588
+4 1587 1816 1808 1588
+4 1782 1808 1813 1583
+4 1782 1587 1808 1583
+4 1808 1812 1816 1587
+4 1808 1782 1812 1587
+4 1812 1813 2044 1782
+4 1812 1808 1813 1782
+4 1813 1812 2069 1808
+4 2045 2072 2069 1813
+4 2044 2072 2045 1813
+4 1812 2072 2044 1813
+4 2069 2072 1812 1813
+4 1812 2069 1816 2072
+4 1812 2069 1808 1816
+4 1816 2069 2070 2072
+4 1808 1816 1809 1588
+4 2070 1816 1808 2069
+4 2070 1808 1816 1809
+4 2072 2069 2071 2045
+4 2327 2069 2072 2070
+4 2327 2069 2071 2072
+4 1816 1587 1790 1589
+4 2046 1812 1816 2072
+4 1788 2046 1790 1791
+4 1587 1812 1788 1782
+4 1816 1790 1587 1812
+4 2046 1790 1816 1812
+4 1788 1790 2046 1812
+4 1587 1790 1788 1812
+4 2044 1812 2046 2072
+4 2046 1788 1792 1791
+4 2046 1792 1788 1812
+4 2044 1792 2046 1812
+4 1782 1792 2044 1812
+4 1788 1792 1782 1812
+4 1799 1813 2044 2045
+4 1794 1813 2044 1799
+4 1586 1794 1813 1582
+4 1783 1794 1586 1582
+4 1782 1794 1783 1582
+4 1813 1794 1782 1582
+4 2044 1782 1794 1783
+4 2044 1782 1813 1794
+4 1582 1783 1558 1586
+4 1783 1782 1792 2044
+4 1792 1783 1582 1782
+4 1792 1558 1582 1783
+4 1559 1558 1783 1586
+4 1559 1558 1792 1783
+4 1583 1582 1813 1782
+4 1354 1582 1586 1581
+4 1583 1582 1354 1581
+4 1813 1582 1583 1581
+4 1586 1582 1813 1581
+4 1582 1782 1788 1792
+4 1587 1782 1582 1583
+4 1587 1782 1788 1582
+4 1333 1332 1120 1329
+4 1333 1332 1124 1120
+4 1124 1332 1333 1335
+4 1333 1332 1565 1335
+4 1565 1332 1331 1335
+4 1052 1049 1053 857
+4 1956 1720 1711 1708
+4 1956 1721 1720 1708
+4 2485 2287 2236 2290
+4 1517 1516 1746 1515
+4 1517 1297 1516 1515
+4 2504 2733 2734 2761
+4 2504 2755 2733 2761
+4 1997 2000 2243 2004
+4 1997 1753 2000 2004
+4 1997 1751 2000 1753
+4 1997 1749 1751 1753
+4 1892 1891 2135 1897
+4 1892 1645 1891 1897
+4 1892 1768 1891 1645
+4 1892 1890 1768 1645
+4 1697 1734 1748 1518
+4 1697 1696 1734 1518
+4 1698 1697 1936 1696
+4 1698 1734 1697 1696
+4 1699 1944 1945 1698
+4 1699 1704 1944 1698
+4 2198 2197 2448 2187
+4 2198 1945 2197 2187
+4 2224 2217 1973 2209
+4 2224 2457 2217 2209
+4 2705 2472 2803 2469
+4 2705 2471 2472 2469
+4 2455 2285 2454 2204
+4 2597 2538 2702 2802
+4 2348 2346 2597 2534
+4 2346 2455 2538 2285
+4 2346 2454 2455 2285
+4 2473 2346 2458 2348
+4 2458 2455 2460 2702
+4 2460 2458 2473 2454
+4 2455 2458 2460 2454
+4 2346 2458 2455 2454
+4 2473 2458 2346 2454
+4 2458 2346 2597 2348
+4 2458 2597 2346 2455
+4 2702 2597 2458 2455
+4 2538 2597 2702 2455
+4 2346 2597 2538 2455
+4 2597 2598 2538 2802
+4 2597 2599 2598 2802
+4 2282 2538 2446 2285
+4 2282 2346 2538 2285
+4 2395 2538 2282 2346
+4 2598 2396 2395 2538
+4 2446 2396 2598 2538
+4 2282 2396 2446 2538
+4 2395 2396 2282 2538
+4 2599 2597 2538 2395
+4 2534 2597 2599 2395
+4 2346 2597 2534 2395
+4 2538 2597 2346 2395
+4 2599 2538 2598 2395
+4 2599 2538 2597 2598
+4 2452 2285 2455 2204
+4 2694 2699 2705 2696
+4 2694 2472 2803 2705
+4 2694 2699 2472 2705
+4 2699 2538 2702 2455
+4 2802 2694 2472 2803
+4 2472 2802 2702 2699
+4 2694 2802 2472 2699
+4 2538 2802 2694 2699
+4 2702 2802 2538 2699
+4 2694 2802 2598 2803
+4 2598 2538 2802 2694
+4 2450 2699 2694 2696
+4 2450 2452 2699 2696
+4 2694 2538 2446 2598
+4 2538 2450 2699 2694
+4 2452 2450 2699 2455
+4 2285 2450 2452 2455
+4 2538 2450 2285 2455
+4 2699 2450 2538 2455
+4 2450 2538 2446 2694
+4 2446 2285 2538 2450
+4 2598 2802 2853 2803
+4 2853 2598 2599 2802
+4 2599 2395 2603 2534
+4 2598 2599 2640 2853
+4 2397 2395 2640 2396
+4 2640 2395 2603 2599
+4 2603 2395 2640 2397
+4 2640 2395 2598 2396
+4 2598 2599 2395 2640
+4 2446 2282 2186 2396
+4 2446 2282 2188 2186
+4 2448 2452 2450 2696
+4 2188 2446 2285 2282
+4 2198 2452 2450 2448
+4 2198 2197 2452 2448
+4 2285 2188 2450 2446
+4 2452 2196 2198 2450
+4 2197 2452 2196 2198
+4 2204 2196 2197 2452
+4 2285 2196 2452 2450
+4 2285 2196 2204 2452
+4 2188 2196 2450 2198
+4 2188 2196 2285 2450
+4 2022 2196 2188 2198
+4 2022 2197 2196 2198
+4 2201 2282 2279 2186
+4 2201 2188 2282 2186
+4 2279 2201 2346 2282
+4 2217 2473 2219 2218
+4 2454 2473 2217 2218
+4 2346 2473 2454 2218
+4 2219 2473 2346 2218
+4 2218 2454 2202 2217
+4 2454 2218 2201 2346
+4 2218 2454 2201 2202
+4 2346 2218 2099 2219
+4 2201 2098 2279 2346
+4 2218 2098 2201 2346
+4 2099 2098 2218 2346
+4 2279 2098 2099 2346
+4 1973 2218 2219 2099
+4 2219 2217 2224 2473
+4 1973 2217 2219 2218
+4 1973 2217 2224 2219
+4 2188 2022 2285 2196
+4 2201 2285 2022 2202
+4 2285 2201 2188 2282
+4 2022 2285 2201 2188
+4 2454 2285 2201 2202
+4 2285 2201 2346 2454
+4 2346 2285 2282 2201
+4 2202 2285 2204 2454
+4 2202 2204 2022 1953
+4 2022 2285 2204 2202
+4 2022 2285 2196 2204
+4 2197 2022 2204 1953
+4 2197 2022 2196 2204
+4 2348 2346 2219 2473
+4 2350 2139 2397 2140
+4 2350 2134 2139 2140
+4 2350 2395 2603 2397
+4 2350 2139 2395 2397
+4 2351 2395 2534 2603
+4 2351 2350 2395 2603
+4 2280 2279 2351 2100
+4 2280 2099 2279 2100
+4 2534 2279 2346 2395
+4 2346 2534 2280 2279
+4 2348 2346 2534 2280
+4 2534 2279 2351 2280
+4 2534 2279 2395 2351
+4 2346 2280 2099 2279
+4 2219 2346 2280 2099
+4 2280 2348 2346 2219
+4 2351 2279 2134 2100
+4 2134 2350 2139 2279
+4 2351 2350 2134 2279
+4 2395 2350 2351 2279
+4 2139 2350 2395 2279
+4 2282 2279 2395 2346
+4 2186 2396 2395 2139
+4 2140 2396 2186 2139
+4 2397 2396 2140 2139
+4 2395 2396 2397 2139
+4 2282 2395 2186 2396
+4 2282 2395 2139 2186
+4 2279 2282 2139 2186
+4 2139 2395 2282 2279
+4 2702 2699 2470 2472
+4 2456 2454 2463 2213
+4 2703 2455 2702 2460
+4 2700 2455 2703 2456
+4 2703 2702 2455 2700
+4 2470 2702 2703 2700
+4 2699 2702 2470 2700
+4 2455 2702 2699 2700
+4 2460 2703 2455 2454
+4 2463 2703 2460 2454
+4 2456 2703 2463 2454
+4 2455 2703 2456 2454
+4 2459 2454 2463 2460
+4 2459 2463 2454 2217
+4 2457 2463 2459 2217
+4 2213 2463 2457 2217
+4 2454 2463 2213 2217
+4 2473 2454 2459 2460
+4 2473 2454 2217 2459
+4 2224 2217 2459 2473
+4 2459 2457 2217 2224
+4 2472 2699 2471 2705
+4 2470 2699 2471 2472
+4 2471 2700 2699 2470
+4 2696 2699 2471 2700
+4 2471 2705 2699 2696
+4 2700 2699 2452 2696
+4 2207 2217 2213 2457
+4 2202 2213 2207 2217
+4 2202 2454 2213 2217
+4 2452 2700 2455 2699
+4 2452 2456 2455 2700
+4 2456 2455 2204 2452
+4 2204 2456 2454 2455
+4 2456 2203 2204 2454
+4 2213 2203 2456 2454
+4 2202 2203 2213 2454
+4 2204 2203 2202 2454
+4 2203 2202 1953 2204
+4 2203 2202 2207 1953
+4 2202 2207 2213 2203
+4 2705 2471 2695 2696
+4 2734 2471 2705 2469
+4 2734 2471 2695 2705
+4 1767 2019 1768 1891
+4 1767 1769 2019 1891
+4 1719 1767 1768 1539
+4 1719 1701 1767 1539
+4 1768 1947 2019 1767
+4 1770 1947 2019 1768
+4 2019 1965 1947 1770
+4 1719 1947 1768 1767
+4 1719 1947 1770 1768
+4 1719 1947 1965 1770
+4 1947 1719 1701 1767
+4 1719 1947 1950 1965
+4 1950 1701 1947 1719
+4 1947 1965 2202 1950
+4 1947 1965 2019 2202
+4 1702 1701 1719 1539
+4 1949 1950 1706 1955
+4 1949 1702 1706 1950
+4 1719 1702 1949 1950
+4 1701 1702 1719 1950
+4 1706 1702 1701 1950
+4 1707 1950 1706 1701
+4 1706 1955 1950 1707
+4 1964 1965 1966 1770
+4 1964 1719 1965 1770
+4 1949 1965 1964 1719
+4 1949 1950 1965 1719
+4 1964 2206 1957 2209
+4 2206 1965 1950 2202
+4 1965 2206 1949 1964
+4 1950 1949 2206 1955
+4 1950 1965 2206 1949
+4 1949 2206 1957 1964
+4 1949 2206 1955 1957
+4 2217 1965 2206 2202
+4 1964 2217 1965 2206
+4 1966 1964 2217 1965
+4 1964 2217 1973 1966
+4 1964 2217 2209 1973
+4 2209 2206 2217 1964
+4 1966 1965 2019 1770
+4 2218 1965 2217 2202
+4 2217 2218 1966 1965
+4 1973 2217 2218 1966
+4 2218 1965 2019 1966
+4 2019 1965 2218 2202
+4 1699 1948 1700 1769
+4 1700 1950 1707 1701
+4 1700 1703 1704 1707
+4 1700 1950 1703 1707
+4 1703 1948 1944 1951
+4 1704 1699 1944 1703
+4 1700 1699 1704 1703
+4 1948 1699 1700 1703
+4 1944 1699 1948 1703
+4 1950 1703 1948 1700
+4 1950 1948 1703 1951
+4 1767 1948 2019 1769
+4 1767 1700 1948 1769
+4 1948 1947 1767 2019
+4 1948 2202 1947 2019
+4 1767 1701 1947 1948
+4 1700 1701 1767 1948
+4 1950 1701 1700 1948
+4 1947 1701 1950 1948
+4 1950 1948 2202 1947
+4 1950 1948 1951 2202
+4 1768 2018 1892 1891
+4 1768 2019 2018 1891
+4 2099 2218 1966 1973
+4 1966 2019 2020 1770
+4 2279 2020 2019 2018
+4 2019 1966 2098 2218
+4 2098 2020 2019 2279
+4 2019 2098 1966 2020
+4 2098 1966 2099 2218
+4 2099 2020 2098 2279
+4 1966 2098 2099 2020
+4 1890 1770 2020 2018
+4 1768 1770 1890 2018
+4 2019 1770 1768 2018
+4 2020 1770 2019 2018
+4 1892 2018 1768 1890
+4 2100 2279 2020 2099
+4 2100 2021 2020 2279
+4 2134 2021 2100 2279
+4 2018 2021 2134 2279
+4 2020 2021 2018 2279
+4 2021 2018 1890 2020
+4 1892 2018 2021 2134
+4 1892 2018 1890 2021
+4 2135 2018 1891 1892
+4 2135 2134 2018 1892
+4 2202 2019 2201 2218
+4 1946 2022 2188 2198
+4 1948 2201 2202 2019
+4 2202 1948 2022 2201
+4 2202 1948 1951 2022
+4 2201 2188 2019 1948
+4 2022 2188 2201 1948
+4 1946 2188 2022 1948
+4 2019 2188 1946 1948
+4 1944 1948 2022 1951
+4 1946 1944 2198 1945
+4 2022 1944 1946 1948
+4 2198 2022 1944 1946
+4 1699 1944 1946 1945
+4 1946 1948 1944 1699
+4 2186 2019 2201 2188
+4 2279 2019 2201 2186
+4 2201 2019 2098 2218
+4 2098 2279 2019 2201
+4 1769 1948 1946 1699
+4 2019 1946 1769 1948
+4 2135 2018 1937 1891
+4 2135 2018 2186 1937
+4 2134 2135 2018 2139
+4 2140 2135 2134 2139
+4 2186 2135 2140 2139
+4 2018 2135 2186 2139
+4 2279 2018 2139 2134
+4 2019 1937 2018 1891
+4 2186 2018 2019 1937
+4 2018 2279 2186 2019
+4 2139 2018 2279 2186
+4 2188 2019 1937 2186
+4 1937 2019 1769 1891
+4 1937 1946 2019 2188
+4 1937 1769 2019 1946
+4 2197 2198 1944 1945
+4 1952 1703 1707 1704
+4 1952 1944 1703 1704
+4 2197 2022 1944 2198
+4 1952 1950 1955 1707
+4 1952 1703 1950 1707
+4 1953 2022 1944 2197
+4 1953 1951 1944 2022
+4 1953 2202 1951 2022
+4 2207 1950 1955 1952
+4 1955 2207 2206 1950
+4 2208 2206 2209 1957
+4 2209 2457 2217 2206
+4 2208 2457 2209 2206
+4 2207 2457 2208 2206
+4 2217 2457 2207 2206
+4 1955 2206 2208 1957
+4 1955 2206 2207 2208
+4 2207 2206 2202 2217
+4 2202 2207 1950 2206
+4 1952 1951 1944 1953
+4 1952 1951 1703 1944
+4 1951 1703 1950 1952
+4 1952 2207 1950 1951
+4 1953 2207 1952 1951
+4 2202 2207 1953 1951
+4 1950 2207 2202 1951
+4 2242 2492 2246 2243
+4 2242 2240 2492 2243
+4 2247 2451 2193 2449
+4 1748 1938 1988 1734
+4 1748 1697 1938 1734
+4 1940 1938 1748 1697
+4 1940 1939 1938 1697
+4 1940 1988 1996 1748
+4 1940 1938 1988 1748
+4 1998 2245 2247 2246
+4 2193 2245 2451 2247
+4 2193 1998 2245 2247
+4 2245 2238 2453 2244
+4 2238 2199 1987 1998
+4 2238 2245 2199 1998
+4 2192 2199 2200 2451
+4 2200 2199 1987 2238
+4 2200 1987 2199 2192
+4 2245 2453 2238 2199
+4 2451 2453 2245 2199
+4 2200 2453 2451 2199
+4 2238 2453 2200 2199
+4 1987 2199 2193 1998
+4 2193 2199 2192 2451
+4 2192 1987 2199 2193
+4 2193 2199 2245 1998
+4 2451 2199 2245 2193
+4 2239 1998 2238 1987
+4 2245 2238 2492 2237
+4 1998 2238 2245 2237
+4 2239 2238 1998 2237
+4 2492 2238 2239 2237
+4 2245 2237 2246 1998
+4 2245 2237 2492 2246
+4 1998 2242 2239 2237
+4 2246 2242 1998 2237
+4 2492 2242 2246 2237
+4 2239 2242 2492 2237
+4 2492 2238 2245 2244
+4 2240 2492 2239 2242
+4 2492 2239 2241 2240
+4 2241 2492 2238 2239
+4 2241 2238 2492 2244
+4 1996 2239 1998 2242
+4 1987 1940 1938 1988
+4 1939 1940 1938 2192
+4 2193 1940 1939 2192
+4 1987 1940 2193 2192
+4 1938 1940 1987 2192
+4 1998 1987 1940 2193
+4 1940 1998 1996 1988
+4 1987 1998 1940 1988
+4 2239 1998 1987 1988
+4 1996 1998 2239 1988
+4 2462 2238 2241 2244
+4 2462 2453 2238 2244
+4 1988 1938 1735 1734
+4 2238 2210 2200 2453
+4 2238 2462 2210 2453
+4 2241 2210 2238 2462
+4 2241 2221 2210 2462
+4 1988 1958 1968 1735
+4 2210 1987 2238 2200
+4 2210 1958 1987 2200
+4 1968 1987 2210 1958
+4 1968 1988 1987 1958
+4 2241 2239 2238 2210
+4 1990 2239 2241 2210
+4 1987 2239 1990 2210
+4 2238 2239 1987 2210
+4 1990 1987 1988 2239
+4 1990 1987 1968 1988
+4 1968 2210 1987 1990
+4 2221 2210 1990 2241
+4 1990 1968 2210 2221
+4 1958 1988 1938 1735
+4 1938 1958 1987 1988
+4 1958 1987 2192 1938
+4 1958 1987 2200 2192
+4 1735 1938 1704 1734
+4 1953 1958 2192 1938
+4 1953 1952 1958 1938
+4 2457 2213 2462 2463
+4 2457 2210 2221 2462
+4 2457 2213 2210 2462
+4 2207 1958 2203 1953
+4 2203 2207 2210 1958
+4 2207 2210 2213 2203
+4 2207 2210 2457 2213
+4 2208 2457 2207 2205
+4 2221 2457 2208 2205
+4 2210 2457 2221 2205
+4 2207 2457 2210 2205
+4 1952 1958 2207 1953
+4 1968 2207 2208 1955
+4 2221 1968 2210 2205
+4 2208 1968 2221 2205
+4 2207 1968 2208 2205
+4 2210 1968 2207 2205
+4 2207 1968 1952 1955
+4 2207 1968 1958 1952
+4 1958 2207 2210 1968
+4 2456 2453 2213 2463
+4 2213 2203 2453 2456
+4 2213 2210 2453 2203
+4 2462 2213 2453 2463
+4 2453 2210 2213 2462
+4 2200 2203 2453 2210
+4 2203 2204 2200 2453
+4 2456 2204 2203 2453
+4 2451 2204 2456 2453
+4 2200 2204 2451 2453
+4 2192 2200 2204 2451
+4 1958 2203 2200 2210
+4 1953 2204 2192 1958
+4 2203 2204 1953 1958
+4 2200 2204 2203 1958
+4 2192 2204 2200 1958
+4 1952 1735 1938 1704
+4 1735 1952 1958 1968
+4 1958 1938 1952 1735
+4 1735 1952 1707 1704
+4 1955 1952 1735 1968
+4 1735 1952 1955 1707
+4 2246 2492 2493 2243
+4 2246 2492 2501 2493
+4 2247 2502 2503 2501
+4 2247 2497 2502 2501
+4 2703 2453 2456 2463
+4 2703 2461 2453 2463
+4 2701 2488 2497 2502
+4 2701 2732 2488 2502
+4 2701 2698 2488 2732
+4 2701 2470 2698 2732
+4 2701 2700 2698 2470
+4 2701 2703 2700 2470
+4 2245 2488 2461 2453
+4 2461 2497 2488 2245
+4 2701 2488 2461 2497
+4 2461 2488 2703 2453
+4 2701 2488 2703 2461
+4 2701 2488 2700 2703
+4 2488 2700 2698 2701
+4 2453 2488 2451 2245
+4 2703 2456 2453 2488
+4 2700 2456 2703 2488
+4 2451 2456 2700 2488
+4 2453 2456 2451 2488
+4 2698 2488 2451 2700
+4 2503 2488 2732 2502
+4 2698 2488 2449 2451
+4 2732 2503 2489 2698
+4 2488 2503 2732 2698
+4 2449 2503 2488 2698
+4 2489 2503 2449 2698
+4 2502 2488 2247 2503
+4 2247 2497 2488 2502
+4 2497 2488 2245 2247
+4 2247 2488 2449 2503
+4 2247 2488 2451 2449
+4 2488 2451 2245 2247
+4 2462 2453 2461 2463
+4 2461 2244 2453 2462
+4 2245 2461 2244 2453
+4 2244 2245 2497 2461
+4 2245 2497 2492 2244
+4 2246 2501 2492 2245
+4 2247 2501 2246 2245
+4 2497 2501 2247 2245
+4 2492 2501 2497 2245
+4 1944 1938 1704 1952
+4 1944 1953 1938 1952
+4 2197 2195 2448 2187
+4 2471 2698 2470 2732
+4 2452 2451 2204 2456
+4 2204 2452 2197 2195
+4 2451 2452 2204 2195
+4 2448 2452 2451 2195
+4 2197 2452 2448 2195
+4 2452 2451 2696 2448
+4 2452 2451 2700 2696
+4 2700 2456 2451 2452
+4 2698 2696 2700 2451
+4 2700 2698 2471 2696
+4 2471 2698 2700 2470
+4 2448 2449 2447 2194
+4 2696 2449 2447 2448
+4 2696 2449 2489 2447
+4 2449 2489 2698 2696
+4 2451 2449 2696 2448
+4 2451 2449 2698 2696
+4 2187 2194 2193 2195
+4 2448 2194 2187 2195
+4 2451 2194 2448 2195
+4 2193 2194 2451 2195
+4 2451 2194 2449 2448
+4 2449 2451 2193 2194
+4 2696 2489 2695 2447
+4 2695 2696 2471 2732
+4 2489 2696 2695 2732
+4 2698 2696 2489 2732
+4 2471 2696 2698 2732
+4 2193 2187 2192 1939
+4 2195 2192 2187 2197
+4 2193 2195 2192 2187
+4 1945 2192 2187 1939
+4 2197 2192 2187 1945
+4 2192 1945 1938 1939
+4 1953 1944 1938 2192
+4 2197 1944 1953 2192
+4 1945 1944 2197 2192
+4 1938 1944 1945 2192
+4 2451 2195 2192 2193
+4 2204 2192 2197 1953
+4 2204 2192 2195 2197
+4 2192 2195 2451 2204
+4 1941 2193 2187 2194
+4 2187 1939 1936 1945
+4 1941 1939 2187 2193
+4 2187 1939 1941 1936
+4 1936 1945 1939 1697
+4 1698 1945 1936 1697
+4 1938 1945 1698 1697
+4 1939 1945 1938 1697
+4 1944 1938 1945 1698
+4 1734 1938 1698 1697
+4 1704 1938 1698 1734
+4 1704 1938 1944 1698
+4 2503 2502 2753 2501
+4 2503 2502 2755 2753
+4 2755 2503 2732 2502
+4 2503 2733 2504 2755
+4 2503 2732 2733 2755
+4 2695 2489 2504 2447
+4 2504 2733 2695 2734
+4 2695 2504 2489 2732
+4 2733 2504 2695 2732
+4 2503 2504 2733 2732
+4 2489 2504 2503 2732
+4 2471 2695 2733 2734
+4 2471 2732 2733 2695
+4 2504 2489 2449 2447
+4 2503 2489 2449 2504
+4 1710 1706 1949 1702
+4 1997 2240 2242 2243
+4 1997 2000 2240 2243
+4 1748 1736 1730 1518
+4 1748 1734 1736 1518
+4 1736 1988 1735 1734
+4 1736 1748 1988 1734
+4 1991 1989 2241 1992
+4 1994 1993 2239 2242
+4 1986 1744 1985 1745
+4 2239 1989 1993 1985
+4 1986 1989 2239 1985
+4 1744 1989 1986 1985
+4 1993 1989 1744 1985
+4 1985 1744 1994 1745
+4 1994 1985 1993 1744
+4 1985 1993 2239 1994
+4 2239 1993 2240 2242
+4 1993 1989 1991 1744
+4 2241 2239 1993 2240
+4 2241 1989 1993 2239
+4 2241 1989 1991 1993
+4 1749 1994 1744 1745
+4 1993 1997 1751 2000
+4 1997 1994 1993 1751
+4 1749 1994 1997 1751
+4 1744 1994 1749 1751
+4 1993 1994 1744 1751
+4 2242 1993 1997 1994
+4 2240 1997 1993 2000
+4 1997 2240 1993 2242
+4 1743 1741 1992 1742
+4 1743 1740 1741 1742
+4 1992 1991 1989 1741
+4 1743 1991 1992 1741
+4 1740 1991 1743 1741
+4 1989 1991 1740 1741
+4 1740 1991 1744 1743
+4 1744 1989 1991 1740
+4 1986 1740 1989 1744
+4 1986 1741 1989 1740
+4 1732 1741 1740 1742
+4 1740 1986 1745 1744
+4 1732 1986 1740 1741
+4 1733 1986 1740 1732
+4 1740 1745 1986 1733
+4 1994 2239 1996 2242
+4 1746 1745 1994 1749
+4 1739 1986 1733 1732
+4 1730 1984 1736 1748
+4 1730 1747 1984 1748
+4 1984 1745 1985 1747
+4 1733 1984 1986 1739
+4 1986 1984 1745 1985
+4 1745 1984 1986 1733
+4 1729 1984 1733 1739
+4 1733 1745 1984 1729
+4 1516 1745 1733 1729
+4 1747 1745 1516 1729
+4 1984 1745 1747 1729
+4 1746 1747 1745 1516
+4 1745 1747 1994 1985
+4 1746 1745 1747 1994
+4 1517 1516 1747 1746
+4 1517 1729 1747 1516
+4 1736 1984 1729 1739
+4 1730 1984 1729 1736
+4 1729 1730 1747 1984
+4 1517 1729 1730 1747
+4 1996 1984 1747 1748
+4 1996 1988 1984 1748
+4 1985 1996 1994 2239
+4 1747 1996 1985 1984
+4 1994 1985 1747 1996
+4 1996 2239 1985 1984
+4 1988 2239 1996 1984
+4 1986 2239 1988 1984
+4 1985 2239 1986 1984
+4 1736 1984 1988 1748
+4 1988 1739 1984 1736
+4 1988 1986 1984 1739
+4 1739 1988 1735 1736
+4 1707 1955 1709 1706
+4 1968 1986 1967 1990
+4 1968 1988 1986 1990
+4 1732 1954 1742 1705
+4 1732 1731 1954 1705
+4 1986 1968 1739 1988
+4 1954 1986 1967 1968
+4 1741 1732 1986 1967
+4 1742 1732 1741 1967
+4 1954 1732 1742 1967
+4 1986 1732 1954 1967
+4 1739 1731 1968 1986
+4 1732 1731 1739 1986
+4 1954 1731 1732 1986
+4 1968 1731 1954 1986
+4 1709 1954 1731 1705
+4 1735 1739 1968 1988
+4 1731 1968 1735 1739
+4 1954 1731 1955 1709
+4 1955 1731 1968 1735
+4 1968 1955 1954 1731
+4 1707 1955 1731 1709
+4 1707 1955 1735 1731
+4 1741 1967 1992 1742
+4 1990 1986 2239 1988
+4 1992 1990 1989 2241
+4 1992 1990 1967 1741
+4 1989 1990 1992 1741
+4 1986 1990 1989 1741
+4 1967 1990 1986 1741
+4 2239 1989 1990 2241
+4 1990 1986 1989 2239
+4 2221 1990 1992 2241
+4 2221 1967 1992 1990
+4 2221 1968 1967 1990
+4 1971 1967 1742 1992
+4 1971 2221 1967 1992
+4 1742 1971 1954 1967
+4 1957 1954 1711 1956
+4 1711 1954 1709 1705
+4 1949 1955 1710 1957
+4 1710 1706 1955 1949
+4 1706 1955 1709 1710
+4 1710 1957 1955 1709
+4 1711 1957 1710 1709
+4 1954 1957 1711 1709
+4 1955 1957 1954 1709
+4 1720 1954 1711 1705
+4 1956 1954 1720 1971
+4 1711 1954 1720 1956
+4 1742 1954 1720 1705
+4 1742 1954 1971 1720
+4 2208 1954 1955 1957
+4 1968 1967 2208 2221
+4 2208 1954 1968 1955
+4 1968 1967 1954 2208
+4 1956 1954 2208 1957
+4 2208 1967 1971 2221
+4 1971 2208 1954 1967
+4 1971 1954 2208 1956
+4 1469 1709 1705 1711
+4 1469 1710 1709 1711
+4 1496 1734 1698 1696
+4 1698 1499 1704 1734
+4 1698 1496 1499 1734
+4 1310 1308 1218 1430
+4 1310 1424 1308 1430
+4 1282 1497 1307 1280
+4 1469 1492 1468 1282
+4 1466 1701 1702 1539
+4 1702 1468 1706 1701
+4 1466 1468 1702 1701
+4 1707 1468 1466 1701
+4 1706 1468 1707 1701
+4 1538 1701 1466 1539
+4 1538 1466 1701 1707
+4 1468 1706 1710 1702
+4 1468 1710 1706 1492
+4 1469 1710 1468 1492
+4 1709 1710 1469 1492
+4 1706 1710 1709 1492
+4 1707 1706 1492 1468
+4 1707 1492 1706 1709
+4 1497 1468 1707 1492
+4 1538 1466 1707 1465
+4 1307 1466 1538 1465
+4 1497 1466 1307 1465
+4 1707 1466 1497 1465
+4 1468 1497 1466 1307
+4 1466 1707 1497 1468
+4 1282 1497 1468 1307
+4 1468 1492 1497 1282
+4 1699 1700 1540 1769
+4 1704 1465 1700 1707
+4 1462 1699 1704 1465
+4 1540 1699 1462 1465
+4 1700 1699 1540 1465
+4 1704 1699 1700 1465
+4 1465 1700 1538 1540
+4 1538 1707 1700 1465
+4 1707 1700 1701 1538
+4 1767 1540 1700 1769
+4 1767 1538 1700 1540
+4 1767 1538 1701 1700
+4 1701 1538 1767 1539
+4 1698 1704 1462 1699
+4 1704 1462 1499 1698
+4 1499 1465 1497 1264
+4 1499 1465 1707 1497
+4 1465 1499 1704 1462
+4 1499 1465 1704 1707
+4 1496 1499 1462 1698
+4 1262 1465 1499 1264
+4 1262 1462 1499 1465
+4 1462 1499 1496 1262
+4 1309 1264 1465 1262
+4 1309 1100 1264 1262
+4 1100 1246 1264 1073
+4 1264 1246 1309 1465
+4 1246 1264 1309 1100
+4 1264 1246 1245 1073
+4 1245 1264 1465 1246
+4 1465 1245 1310 1308
+4 1465 1246 1310 1245
+4 1310 1465 1309 1246
+4 1218 1245 1310 1246
+4 1310 1308 1245 1218
+4 1246 1245 1047 1218
+4 1046 1073 1246 1100
+4 1246 1047 1073 1046
+4 1246 1245 1073 1047
+4 1245 1465 1307 1308
+4 1264 1245 1276 1073
+4 1497 1307 1276 1264
+4 1465 1307 1497 1264
+4 1245 1307 1465 1264
+4 1276 1307 1245 1264
+4 1280 1276 1245 1073
+4 1280 1307 1276 1497
+4 1307 1276 1245 1280
+4 1309 1465 1462 1262
+4 1309 1465 1540 1462
+4 1465 1540 1310 1309
+4 1538 1465 1308 1307
+4 1540 1424 1538 1465
+4 1310 1424 1540 1465
+4 1308 1424 1310 1465
+4 1538 1424 1308 1465
+4 1641 1767 1538 1539
+4 1641 1768 1767 1539
+4 1540 1641 1767 1538
+4 1540 1424 1641 1538
+4 1642 1767 1891 1769
+4 1641 1642 1645 1649
+4 1645 1891 1642 1641
+4 1768 1891 1645 1641
+4 1767 1891 1768 1641
+4 1642 1891 1767 1641
+4 1645 1642 1897 1649
+4 1645 1642 1891 1897
+4 1642 1641 1428 1649
+4 1540 1767 1642 1769
+4 1642 1641 1424 1428
+4 1540 1641 1642 1767
+4 1642 1424 1641 1540
+4 1649 1641 1650 1645
+4 1428 1427 1430 1651
+4 1641 1427 1424 1428
+4 1538 1424 1427 1308
+4 1538 1641 1427 1424
+4 1424 1427 1430 1428
+4 1424 1427 1308 1430
+4 1649 1650 1641 1428
+4 1651 1650 1649 1428
+4 1427 1650 1651 1428
+4 1641 1650 1427 1428
+4 1496 1518 1734 1696
+4 1496 1461 1518 1696
+4 1100 1071 1051 1046
+4 1100 1073 1071 1046
+4 1735 1499 1734 1704
+4 1735 1707 1499 1704
+4 1508 1497 1282 1280
+4 1497 1735 1707 1499
+4 1497 1502 1735 1499
+4 1509 1492 1709 1469
+4 1509 1282 1492 1469
+4 1731 1492 1707 1709
+4 1731 1509 1492 1709
+4 1508 1492 1509 1282
+4 1508 1497 1492 1282
+4 1497 1501 1735 1502
+4 1731 1707 1492 1501
+4 1735 1707 1731 1501
+4 1497 1707 1735 1501
+4 1492 1707 1497 1501
+4 1739 1501 1735 1731
+4 1735 1502 1501 1739
+4 1739 1501 1508 1502
+4 1739 1508 1501 1731
+4 1509 1508 1739 1731
+4 1492 1508 1509 1731
+4 1501 1508 1492 1731
+4 1497 1501 1508 1492
+4 1497 1501 1502 1508
+4 1509 1709 1705 1469
+4 1731 1509 1732 1739
+4 1705 1509 1731 1709
+4 1509 1731 1732 1705
+4 1509 1739 1503 1732
+4 1739 1508 1505 1502
+4 1508 1739 1503 1509
+4 1505 1739 1503 1508
+4 1071 1264 1279 1073
+4 1071 1100 1264 1073
+4 1279 1502 1275 1505
+4 1263 1264 1071 1100
+4 1071 1279 1264 1263
+4 1275 1279 1071 1263
+4 1502 1279 1275 1263
+4 1264 1279 1502 1263
+4 1264 1263 1262 1100
+4 1263 1264 1499 1502
+4 1264 1263 1499 1262
+4 1508 1502 1279 1505
+4 1264 1502 1497 1499
+4 1276 1279 1264 1073
+4 1497 1276 1508 1502
+4 1264 1276 1497 1502
+4 1279 1276 1264 1502
+4 1508 1276 1279 1502
+4 1279 1276 1280 1073
+4 1276 1508 1280 1497
+4 1279 1276 1508 1280
+4 1504 1739 1503 1505
+4 1503 1733 1739 1504
+4 1732 1739 1503 1733
+4 1499 1498 1496 1262
+4 1499 1263 1498 1262
+4 1734 1498 1518 1496
+4 1734 1499 1498 1496
+4 1504 1729 1516 1733
+4 1504 1739 1729 1733
+4 1504 1517 1297 1516
+4 1504 1729 1517 1516
+4 1504 1486 1274 1297
+4 1504 1517 1486 1297
+4 1486 1729 1730 1517
+4 1486 1504 1729 1517
+4 1486 1500 1498 1730
+4 1486 1729 1500 1730
+4 1505 1265 1502 1275
+4 1505 1274 1265 1275
+4 1265 1504 1486 1274
+4 1265 1505 1504 1274
+4 1504 1500 1486 1729
+4 1504 1500 1265 1486
+4 1500 1505 1265 1502
+4 1265 1500 1504 1505
+4 1739 1500 1504 1729
+4 1505 1500 1739 1502
+4 1739 1504 1500 1505
+4 1263 1502 1265 1275
+4 1498 1502 1265 1263
+4 1265 1500 1498 1486
+4 1498 1502 1500 1265
+4 1736 1500 1739 1729
+4 1736 1730 1500 1729
+4 1735 1500 1502 1739
+4 1735 1736 1500 1739
+4 1502 1498 1499 1263
+4 1502 1499 1498 1500
+4 1735 1499 1502 1500
+4 1736 1499 1735 1500
+4 1498 1499 1736 1500
+4 1736 1499 1734 1735
+4 1734 1498 1499 1736
+4 1736 1498 1518 1734
+4 1498 1736 1730 1500
+4 1736 1498 1730 1518
+4 1487 1274 1486 1297
+4 1487 1253 1274 1297
+4 1260 1071 1065 1051
+4 1260 1100 1071 1051
+4 1275 1065 1258 1263
+4 1071 1065 1275 1263
+4 1260 1065 1071 1263
+4 1258 1065 1260 1263
+4 1498 1263 1258 1260
+4 1265 1258 1263 1275
+4 1265 1258 1498 1263
+4 1263 1260 1100 1071
+4 1262 1260 1263 1498
+4 1100 1263 1262 1260
+4 1261 1498 1461 1491
+4 1259 1498 1461 1261
+4 1259 1498 1496 1461
+4 1496 1498 1259 1262
+4 1260 1498 1259 1261
+4 1262 1498 1259 1260
+4 1261 1498 1258 1260
+4 1491 1498 1258 1261
+4 1274 1258 1265 1275
+4 1491 1258 1486 1487
+4 1486 1498 1258 1491
+4 1498 1258 1265 1486
+4 1486 1258 1274 1487
+4 1486 1258 1265 1274
+4 1260 1065 1052 1051
+4 1254 1258 1261 1491
+4 1254 1487 1258 1491
+4 1254 1274 1258 1487
+4 1254 1253 1274 1487
+4 1254 1064 1274 1253
+4 1254 1049 1064 1253
+4 1053 1258 1260 1261
+4 1053 1254 1258 1261
+4 1064 1254 1065 1049
+4 1065 1064 1275 1258
+4 1254 1064 1065 1258
+4 1274 1064 1254 1258
+4 1275 1064 1274 1258
+4 1053 1065 1052 1260
+4 1049 1065 1053 1254
+4 1052 1049 1065 1053
+4 1065 1053 1258 1260
+4 1258 1065 1254 1053
+4 1518 1498 1461 1496
+4 1487 1486 1517 1297
+4 1518 1498 1491 1461
+4 1491 1730 1498 1518
+4 1487 1486 1730 1517
+4 1486 1730 1491 1487
+4 1491 1486 1498 1730
+4 2854 2853 2892 2640
+4 2854 2599 2853 2640
+4 2854 2603 2599 2640
+4 2281 2280 2351 2100
+4 1737 950 1717 737
+4 2033 2216 1978 2025
+4 2033 2258 2216 2025
+4 2506 2508 2051 2795
+4 1978 2230 1980 1977
+4 1978 2228 2230 1977
+4 2422 2712 2716 2724
+4 2422 2715 2712 2724
+4 2712 2424 2710 2715
+4 2712 2422 2424 2715
+4 2468 2216 2273 2258
+4 2468 2270 2522 2273
+4 2468 2216 2270 2273
+4 2422 2723 2712 2424
+4 2422 2419 2723 2424
+4 2716 2723 2482 2712
+4 2716 2422 2723 2712
+4 2723 2735 2523 2762
+4 2523 2522 2482 2270
+4 2482 2717 2522 2523
+4 2717 2522 2716 2482
+4 2468 2482 2522 2270
+4 2716 2522 2468 2482
+4 2523 2717 2723 2482
+4 2723 2735 2717 2523
+4 2735 2717 2422 2723
+4 2723 2717 2716 2482
+4 2716 2422 2717 2723
+4 2723 2421 2419 2735
+4 2762 2421 2723 2735
+4 2404 2421 2762 2735
+4 2419 2421 2404 2735
+4 2419 2735 2422 2723
+4 2404 2735 2422 2419
+4 2722 2424 2723 2419
+4 2270 2466 2468 2482
+4 2216 2270 2466 2468
+4 2228 2466 2216 2270
+4 2482 2270 2466 2480
+4 2481 2270 2482 2480
+4 2228 2270 2481 2480
+4 2466 2270 2228 2480
+4 2466 2482 2716 2468
+4 2466 2482 2712 2716
+4 2712 2466 2480 2482
+4 2723 2480 2722 2481
+4 2723 2722 2480 2712
+4 2424 2722 2723 2712
+4 2710 2722 2424 2712
+4 2480 2722 2710 2712
+4 2482 2480 2723 2481
+4 2723 2712 2480 2482
+4 2229 2228 2270 2481
+4 2229 2230 2228 2481
+4 2270 2522 2515 2523
+4 2515 2270 2273 2522
+4 2273 2033 2287 2258
+4 2273 2216 2033 2258
+4 2270 2273 2291 2515
+4 2216 2229 1978 2228
+4 2216 2270 2229 2228
+4 2033 2229 1983 1978
+4 2033 2216 2229 1978
+4 2033 2233 2273 2287
+4 2270 2233 2273 2216
+4 2229 2233 2270 2216
+4 2033 2233 2229 2216
+4 2273 2233 2033 2216
+4 1983 2033 2233 2229
+4 2233 2236 2033 1983
+4 2233 2287 2033 2236
+4 2229 1978 1980 1983
+4 1978 2229 2230 2228
+4 1980 1978 2229 2230
+4 2485 2287 2233 2236
+4 2233 2273 2291 2270
+4 2233 2291 2287 2485
+4 2291 2287 2273 2233
+4 2403 2404 2421 2762
+4 2423 2715 2422 2724
+4 2506 1249 2190 1716
+4 2506 2051 1249 1716
+4 1249 2508 2052 2051
+4 1249 2506 2508 2051
+4 2423 2028 2798 2353
+4 2423 1204 2028 2353
+4 2052 1249 2507 2508
+4 2425 1204 2027 2028
+4 1203 2027 2425 1204
+4 1203 1206 2027 1204
+4 1256 2029 1206 1249
+4 1256 2509 2029 1249
+4 1203 2421 1256 2404
+4 1256 1203 2420 2421
+4 1206 1203 2027 2426
+4 1256 1203 1206 2426
+4 2420 1203 1256 2426
+4 2027 1203 2420 2426
+4 2421 1203 2419 2404
+4 2425 1203 2420 2027
+4 2420 1203 2419 2421
+4 2420 1203 2425 2419
+4 2509 1256 2420 2421
+4 2420 2426 2029 2027
+4 2029 1256 2420 2509
+4 2029 2420 1256 2426
+4 1206 2426 2029 1256
+4 2027 2426 2029 1206
+4 2509 2029 2507 2420
+4 2507 1249 2029 2509
+4 1249 2029 2052 2507
+4 2507 2029 2027 2420
+4 2052 2029 2027 2507
+4 2422 2419 1203 2404
+4 2424 1203 2422 2419
+4 2424 2425 1203 2419
+4 2798 2423 2425 2028
+4 2422 2423 2424 2715
+4 2423 2424 1203 2422
+4 2423 2424 2425 1203
+4 2798 2424 2423 2715
+4 2798 2424 2425 2423
+4 2423 2425 1204 1203
+4 2423 2425 2028 1204
+4 1256 2421 2403 2404
+4 2403 1256 2509 2421
+4 2498 1256 2509 2403
+4 1249 2509 2498 1256
+4 2507 1249 2510 2508
+4 2510 1249 2509 2498
+4 2509 1249 2510 2507
+4 2510 1249 2506 2508
+4 2190 1249 2510 2498
+4 2506 1249 2510 2190
+4 1717 1249 2051 1716
+4 1205 2028 1204 2353
+4 1206 2029 950 1249
+4 2008 2027 949 2026
+4 950 949 2008 2029
+4 1206 949 950 2029
+4 2027 949 1206 2029
+4 2008 949 2027 2029
+4 1204 2027 949 1206
+4 2028 949 2027 2026
+4 949 2028 2027 1204
+4 1205 2028 949 1204
+4 949 2026 2028 1205
+4 2052 2029 2008 2027
+4 1249 950 2052 2029
+4 1717 2051 1249 950
+4 1737 2051 1717 950
+4 2052 2051 1737 950
+4 1249 2051 2052 950
+4 950 2052 2008 1737
+4 2008 2029 2052 950
+4 2230 1977 1979 1980
+4 2702 2801 2597 2802
+4 2702 2472 2801 2802
+4 2710 2424 2709 2715
+4 2459 2707 2475 2473
+4 2459 2707 2479 2475
+4 2481 2476 2480 2722
+4 2227 2481 2476 2480
+4 2227 2228 2481 2480
+4 2227 2230 2481 2228
+4 2227 1977 2230 2228
+4 1979 2227 1977 2230
+4 1977 1979 1975 2227
+4 1725 1975 1977 1979
+4 2222 2227 1979 2230
+4 1979 1975 2227 2222
+4 2222 2231 2476 2227
+4 2230 2231 2222 2227
+4 2481 2231 2230 2227
+4 2476 2231 2481 2227
+4 2222 2227 2220 1975
+4 2227 2476 2477 2480
+4 2220 2476 2227 2222
+4 2476 2227 2477 2220
+4 2457 2476 2477 2220
+4 2477 2722 2710 2480
+4 2477 2476 2722 2480
+4 2477 2706 2463 2710
+4 2459 2706 2457 2479
+4 2463 2706 2457 2459
+4 2457 2477 2706 2463
+4 2457 2706 2476 2479
+4 2476 2477 2706 2457
+4 2722 2476 2706 2479
+4 2706 2477 2722 2710
+4 2706 2477 2476 2722
+4 2231 2476 2478 2222
+4 2478 2481 2476 2231
+4 2478 2476 2722 2479
+4 2478 2722 2476 2481
+4 2223 2476 2222 2478
+4 2223 2476 2220 2222
+4 2476 2220 2457 2223
+4 2223 2476 2479 2457
+4 2223 2476 2478 2479
+4 2710 2709 2424 2706
+4 2463 2709 2710 2706
+4 2707 2709 2463 2706
+4 2424 2709 2707 2706
+4 2424 2706 2722 2710
+4 2424 2706 2707 2722
+4 2707 2706 2479 2722
+4 2459 2706 2707 2463
+4 2707 2706 2459 2479
+4 2425 2424 2707 2720
+4 2419 2424 2425 2720
+4 2721 2424 2419 2720
+4 2707 2424 2721 2720
+4 2419 2720 2420 2721
+4 2420 2425 2720 2419
+4 2718 2720 2721 2420
+4 2721 2707 2720 2718
+4 2721 2424 2722 2419
+4 2721 2424 2707 2722
+4 2721 2707 2479 2722
+4 2475 2707 2721 2718
+4 2721 2479 2707 2475
+4 2718 2707 2799 2536
+4 2718 2799 2707 2720
+4 2420 2799 2718 2720
+4 2425 2799 2420 2720
+4 2707 2799 2425 2720
+4 2473 2707 2718 2536
+4 2718 2707 2473 2475
+4 2702 2536 2458 2597
+4 2460 2707 2463 2459
+4 2460 2463 2707 2708
+4 2703 2463 2460 2708
+4 2709 2463 2703 2708
+4 2707 2463 2709 2708
+4 2460 2708 2702 2703
+4 2702 2707 2708 2460
+4 2473 2707 2460 2459
+4 2702 2458 2536 2707
+4 2460 2458 2702 2707
+4 2473 2458 2460 2707
+4 2536 2458 2473 2707
+4 2708 2707 2424 2709
+4 2708 2707 2425 2424
+4 2707 2702 2799 2536
+4 2425 2799 2707 2708
+4 2801 2799 2425 2708
+4 2702 2799 2801 2708
+4 2707 2799 2702 2708
+4 2799 2702 2597 2536
+4 2799 2702 2801 2597
+4 2709 2424 2798 2715
+4 2470 2801 2702 2472
+4 2470 2028 2801 2472
+4 2798 2801 2470 2028
+4 2798 2425 2801 2028
+4 2801 2798 2708 2425
+4 2703 2470 2798 2708
+4 2702 2470 2703 2708
+4 2801 2470 2702 2708
+4 2798 2470 2801 2708
+4 2798 2708 2709 2703
+4 2798 2708 2424 2709
+4 2708 2424 2425 2798
+4 1205 2028 2470 2472
+4 2470 2028 2353 2798
+4 2470 2353 2028 1205
+4 2472 2028 2026 1205
+4 2855 2052 2051 1737
+4 2855 2852 2052 1737
+4 2719 2799 2537 2718
+4 2507 2719 2799 2800
+4 2794 2719 2507 2800
+4 2537 2719 2794 2800
+4 2799 2719 2537 2800
+4 2719 2799 2420 2507
+4 2719 2799 2718 2420
+4 2537 2799 2536 2718
+4 2537 2536 2799 2800
+4 2793 2536 2537 2800
+4 2597 2536 2793 2800
+4 2799 2536 2597 2800
+4 2800 2794 2052 2507
+4 2793 2800 2852 2597
+4 2794 2793 2052 2855
+4 2800 2793 2794 2537
+4 2052 2800 2793 2794
+4 2793 2794 2693 2855
+4 2537 2793 2794 2693
+4 2852 2052 2793 2855
+4 2793 2800 2052 2852
+4 2508 2052 2794 2507
+4 2795 2508 2855 2693
+4 2051 2855 2508 2052
+4 2855 2051 2508 2795
+4 2794 2855 2508 2693
+4 2794 2855 2052 2508
+4 2008 2052 2852 1737
+4 2800 2008 2052 2852
+4 2027 2799 2507 2420
+4 2027 2799 2800 2507
+4 2799 2800 2801 2027
+4 2425 2799 2027 2420
+4 2027 2801 2799 2425
+4 2027 2800 2052 2507
+4 2027 2800 2008 2052
+4 2027 2800 2801 2008
+4 2597 2800 2801 2799
+4 2802 2852 2008 2801
+4 2597 2852 2802 2801
+4 2800 2852 2597 2801
+4 2008 2852 2800 2801
+4 2028 2801 2027 2425
+4 2026 2801 2802 2008
+4 2801 2026 2472 2028
+4 2026 2801 2472 2802
+4 2027 2801 2026 2008
+4 2027 2801 2028 2026
+4 2240 2261 2492 2243
+4 2240 2000 2261 2243
+4 2003 2000 1751 1753
+4 2470 2731 2798 2353
+4 2470 2732 2731 2353
+4 2227 2215 1975 1977
+4 2227 2228 2215 1977
+4 2221 2214 2241 1992
+4 2221 1974 2214 1992
+4 2241 2261 2492 2240
+4 2466 2232 2228 2216
+4 2490 2241 2263 2261
+4 2490 2492 2241 2261
+4 2490 2465 2462 2491
+4 2480 2226 2477 2227
+4 2263 2464 2241 2490
+4 2214 2464 2241 2263
+4 2214 2464 2226 2241
+4 2241 2464 2462 2490
+4 2462 2226 2464 2241
+4 2465 2462 2464 2490
+4 2477 2226 2480 2465
+4 2462 2226 2477 2465
+4 2464 2226 2462 2465
+4 2480 2226 2464 2465
+4 2232 2464 2214 2263
+4 2215 2464 2226 2214
+4 2228 2227 2215 2464
+4 2480 2227 2228 2464
+4 2226 2227 2480 2464
+4 2215 2227 2226 2464
+4 2215 2464 2232 2228
+4 2215 2464 2214 2232
+4 2466 2464 2480 2228
+4 2466 2232 2464 2228
+4 2712 2464 2465 2480
+4 2712 2466 2464 2480
+4 2490 2464 2483 2263
+4 2483 2491 2712 2464
+4 2490 2491 2483 2464
+4 2465 2491 2490 2464
+4 2712 2491 2465 2464
+4 2466 2464 2483 2712
+4 2483 2464 2232 2263
+4 2232 2464 2483 2466
+4 2710 2465 2477 2480
+4 2710 2712 2465 2480
+4 2710 2462 2709 2463
+4 2710 2462 2491 2709
+4 2491 2710 2465 2462
+4 2477 2462 2710 2463
+4 2477 2465 2710 2462
+4 2710 2491 2715 2709
+4 2491 2710 2712 2465
+4 2710 2491 2712 2715
+4 2462 2477 2457 2463
+4 2221 2477 2220 2457
+4 2221 2462 2477 2457
+4 2220 2226 2227 2477
+4 2220 2221 2226 2477
+4 2215 2226 1974 2214
+4 2220 1975 2227 2226
+4 1974 1975 2220 2226
+4 2215 1975 1974 2226
+4 2227 1975 2215 2226
+4 2221 2226 1974 2220
+4 1974 2214 2226 2221
+4 2226 2221 2462 2477
+4 2221 2226 2241 2214
+4 2462 2226 2241 2221
+4 2701 2697 2703 2470
+4 2244 2490 2497 2492
+4 2461 2697 2703 2701
+4 2697 2461 2709 2491
+4 2703 2709 2697 2461
+4 2497 2697 2461 2701
+4 2461 2491 2697 2497
+4 2461 2709 2463 2703
+4 2709 2461 2462 2491
+4 2463 2462 2709 2461
+4 2462 2244 2490 2491
+4 2461 2244 2462 2491
+4 2497 2244 2461 2491
+4 2490 2244 2497 2491
+4 2241 2490 2244 2492
+4 2241 2490 2462 2244
+4 2701 2697 2502 2497
+4 2732 2697 2701 2470
+4 2502 2732 2697 2701
+4 2470 2697 2731 2732
+4 2703 2697 2798 2470
+4 2709 2697 2798 2703
+4 2715 2709 2491 2711
+4 2798 2709 2715 2711
+4 2697 2709 2798 2711
+4 2491 2709 2697 2711
+4 2798 2697 2731 2470
+4 2711 2697 2731 2798
+4 2731 2697 2502 2732
+4 2731 2697 2497 2502
+4 2497 2697 2711 2491
+4 2731 2697 2711 2497
+4 2000 1760 2009 2003
+4 2232 1981 2228 2216
+4 2232 1981 2215 2228
+4 2001 2005 1760 1754
+4 2263 2002 2009 2261
+4 2263 2009 2002 2001
+4 2005 2009 2263 2001
+4 1760 2009 2005 2001
+4 2002 2009 1760 2001
+4 2002 2009 2000 1760
+4 2000 2002 2261 2009
+4 2261 2240 2002 2000
+4 2232 2001 2005 2263
+4 2005 1981 2001 2232
+4 2001 2005 1754 1981
+4 2215 2232 2001 1981
+4 2241 2002 2261 2240
+4 2241 2002 2263 2261
+4 2232 2001 2214 2215
+4 2214 2002 2263 2241
+4 2263 2001 2214 2232
+4 2214 2002 2001 2263
+4 2010 2009 1760 2003
+4 2025 1981 2232 2216
+4 2005 1760 2010 2009
+4 1981 2232 1999 2025
+4 2010 2005 1754 1760
+4 1999 2005 1754 2010
+4 1999 1981 2005 2232
+4 1754 2005 1999 1981
+4 1963 1981 2215 2001
+4 1976 2228 1978 1977
+4 1978 1976 2025 2216
+4 2228 1976 1978 2216
+4 1981 1976 2228 2216
+4 2025 1976 1981 2216
+4 1963 1976 1977 2215
+4 1981 1976 1963 2215
+4 2228 1976 1981 2215
+4 1977 1976 2228 2215
+4 1760 2000 1751 2003
+4 1991 1959 1993 1744
+4 1991 1743 1959 1744
+4 1993 2002 2240 2000
+4 1993 2002 2241 2240
+4 2002 1991 1959 1993
+4 2002 2241 1991 1993
+4 1991 2214 1992 2241
+4 1991 2002 2214 2241
+4 1992 1959 2214 1991
+4 1992 1743 1959 1991
+4 1992 1961 1962 1974
+4 1992 2214 1961 1974
+4 1750 1743 1959 1961
+4 1962 1743 1750 1961
+4 1992 1743 1962 1961
+4 1959 1743 1992 1961
+4 1959 1961 2001 1750
+4 2214 1961 1959 1992
+4 2001 1961 1959 2214
+4 1962 1961 2215 1974
+4 1962 1963 2215 1961
+4 1750 1963 1962 1961
+4 2001 1963 1750 1961
+4 2215 1963 2001 1961
+4 2215 1961 2214 1974
+4 2214 2001 1961 2215
+4 2002 2214 1959 1991
+4 2001 1959 2002 2214
+4 1962 2215 1975 1974
+4 1725 1963 1977 1975
+4 1962 1963 1725 1975
+4 2215 1963 1962 1975
+4 1977 1963 2215 1975
+4 1760 1959 1750 1743
+4 1760 1744 1959 1743
+4 1750 2001 1981 1963
+4 1750 2001 1754 1981
+4 1750 2001 1760 1754
+4 2001 1760 1959 1750
+4 1760 1959 2002 2001
+4 1760 1993 1744 1751
+4 1993 1760 1959 2002
+4 1760 1993 1959 1744
+4 1993 1760 2000 1751
+4 2000 1993 2002 1760
+4 2004 2003 1763 1753
+4 2004 2000 2003 1753
+4 2754 2731 2502 2732
+4 2754 2353 2731 2732
+4 2004 2012 2013 1763
+4 2004 2003 2012 1763
+4 2715 2711 2423 2798
+4 2715 2711 2724 2423
+4 2011 1999 2256 2257
+4 2265 2004 2012 2013
+4 2012 2265 2003 2004
+4 2012 2009 2010 2003
+4 2012 2265 2009 2003
+4 2012 2010 2269 2011
+4 2009 2269 2262 2265
+4 2005 2269 2009 2010
+4 2009 2263 2269 2005
+4 2262 2009 2263 2269
+4 2269 2009 2012 2265
+4 2012 2010 2009 2269
+4 2005 2256 1999 2232
+4 2011 2256 1999 2010
+4 2269 2256 2011 2010
+4 2005 2256 2269 2010
+4 1999 2256 2005 2010
+4 2467 2269 2263 2232
+4 2256 2269 2467 2232
+4 2005 2269 2256 2232
+4 2263 2269 2005 2232
+4 2269 2263 2517 2467
+4 2516 2262 2269 2265
+4 2517 2269 2262 2263
+4 2269 2262 2516 2517
+4 2004 2265 2266 2013
+4 2009 2004 2000 2003
+4 2009 2265 2004 2003
+4 2261 2262 2009 2263
+4 2243 2261 2004 2000
+4 2243 2261 2266 2004
+4 2243 2266 2261 2492
+4 2493 2266 2243 2492
+4 2516 2266 2493 2492
+4 2261 2266 2516 2492
+4 2009 2004 2261 2000
+4 2265 2261 2009 2004
+4 2262 2261 2265 2516
+4 2262 2261 2009 2265
+4 2266 2261 2265 2004
+4 2516 2261 2265 2266
+4 2741 2492 2516 2493
+4 2261 2516 2490 2492
+4 2261 2490 2516 2262
+4 2263 2490 2261 2262
+4 2517 2490 2263 2262
+4 2516 2490 2517 2262
+4 2516 2490 2741 2517
+4 2516 2490 2492 2741
+4 2490 2741 2497 2492
+4 2483 2467 2263 2232
+4 2483 2466 2467 2232
+4 2716 2483 2712 2466
+4 2716 2467 2483 2466
+4 2483 2724 2491 2490
+4 2491 2712 2724 2483
+4 2491 2724 2715 2711
+4 2715 2491 2712 2724
+4 2497 2741 2490 2491
+4 2711 2741 2497 2491
+4 2724 2741 2711 2491
+4 2490 2741 2724 2491
+4 2724 2490 2517 2741
+4 2716 2483 2724 2712
+4 2517 2483 2716 2467
+4 2483 2517 2724 2490
+4 2716 2483 2517 2724
+4 2263 2483 2517 2467
+4 2263 2483 2490 2517
+4 2468 2466 2467 2716
+4 2257 2256 2025 1999
+4 2025 2256 2258 2216
+4 2258 2025 2257 2256
+4 2025 2256 2232 1999
+4 2232 2025 2216 2256
+4 2256 2216 2468 2258
+4 2256 2468 2216 2232
+4 2467 2468 2256 2232
+4 2466 2468 2467 2232
+4 2216 2468 2466 2232
+4 2754 2502 2750 2753
+4 2741 2711 2751 2724
+4 2731 2751 2497 2711
+4 2754 2750 2502 2731
+4 2751 2750 2754 2731
+4 2497 2750 2751 2731
+4 2502 2750 2497 2731
+4 2751 2497 2741 2750
+4 2751 2497 2711 2741
+4 2751 2711 2423 2724
+4 2353 2731 2751 2754
+4 2751 2423 2711 2731
+4 2353 2423 2751 2731
+4 2798 2423 2353 2731
+4 2711 2423 2798 2731
+4 2500 2501 2750 2741
+4 2753 2750 2501 2502
+4 2753 2750 2500 2501
+4 2750 2501 2497 2741
+4 2497 2750 2502 2501
+4 2493 2741 2501 2500
+4 2501 2492 2741 2493
+4 2492 2741 2497 2501
+4 2755 2502 2754 2753
+4 2755 2732 2754 2502
+4 2469 1205 2006 2347
+4 2852 1738 2008 1737
+4 2853 2008 2802 2852
+4 2803 2026 2469 2472
+4 2026 2803 2007 2008
+4 2007 2026 2469 2803
+4 2802 2026 2803 2472
+4 2802 2026 2008 2803
+4 2803 2008 2853 2007
+4 2853 2802 2008 2803
+4 1738 2853 2008 2007
+4 1738 2852 2008 2853
+4 2892 1737 2891 2853
+4 2852 1737 2892 2853
+4 1738 1737 2852 2853
+4 2891 1737 1738 2853
+4 1737 2891 1574 2892
+4 1737 2891 1738 1574
+4 2007 1738 2891 1574
+4 2891 2853 1738 2007
+4 1205 2469 2026 2472
+4 2007 949 934 2006
+4 934 2008 950 949
+4 934 2007 2008 949
+4 1574 1738 934 2007
+4 934 1738 737 950
+4 934 737 1738 1574
+4 2008 934 1738 2007
+4 950 1738 2008 934
+4 1737 1738 737 1574
+4 1737 1738 950 737
+4 1738 950 2008 1737
+4 2026 2007 949 2008
+4 2006 2007 949 1205
+4 2469 2007 2006 1205
+4 2026 2007 2469 1205
+4 949 2007 2026 1205
+4 2347 2471 2734 2469
+4 2347 1205 2471 2469
+4 2354 2471 2347 1205
+4 2761 2347 2354 2733
+4 2734 2347 2761 2733
+4 2471 2347 2734 2733
+4 2354 2347 2471 2733
+4 2353 2471 2354 1205
+4 2354 2732 2471 2353
+4 2732 2471 2733 2354
+4 2354 2733 2755 2761
+4 2754 2732 2354 2353
+4 2354 2755 2732 2754
+4 2354 2733 2732 2755
+4 2471 1205 2472 2469
+4 2471 1205 2470 2472
+4 2470 2353 2471 2732
+4 2470 2471 2353 1205
+4 1962 1992 1742 1743
+4 1962 1971 1720 1742
+4 1962 1992 1971 1742
+4 2348 2536 2597 2458
+4 2348 2473 2536 2458
+4 1971 1974 2221 1992
+4 1971 1962 1974 1992
+4 2224 2473 2475 2219
+4 2459 2475 2224 2473
+4 2224 2459 2479 2475
+4 2224 2457 2479 2459
+4 2224 2457 2223 2479
+4 2209 2457 2223 2224
+4 2208 2220 2223 2457
+4 2208 2221 2220 2457
+4 2208 1974 2220 2221
+4 2208 1971 1974 2221
+4 1972 2220 2222 2223
+4 1972 2208 2220 2223
+4 1723 1722 1972 1721
+4 1979 1722 1972 1723
+4 1979 1725 1722 1723
+4 1975 1972 2220 2222
+4 1974 1722 1975 1962
+4 1975 1972 1974 2220
+4 1974 1975 1722 1972
+4 1972 1975 1979 2222
+4 1725 1975 1722 1962
+4 1979 1722 1975 1972
+4 1722 1975 1725 1979
+4 1956 1722 1720 1721
+4 1956 1972 1722 1721
+4 1974 1972 2208 2220
+4 1956 1722 1971 1720
+4 1972 1971 1722 1974
+4 1971 1972 1722 1956
+4 1962 1971 1722 1720
+4 1962 1971 1974 1722
+4 2208 1972 1971 1956
+4 2208 1974 1971 1972
+4 1972 2208 1957 1956
+4 1972 2208 2209 1957
+4 2223 2208 2209 1972
+4 2223 2208 2457 2209
+4 2474 2536 2718 2537
+4 2536 2474 2473 2348
+4 2718 2474 2473 2536
+4 2475 2473 2718 2474
+4 2474 2473 2219 2475
+4 2219 2348 2473 2474
+4 2474 2348 2280 2219
+4 2474 2348 2535 2280
+4 2535 2536 2474 2537
+4 2474 2348 2536 2535
+4 2604 2793 2693 2855
+4 2604 2854 2793 2855
+4 2604 2599 2793 2854
+4 2604 2603 2599 2854
+4 2599 2604 2534 2603
+4 2597 2793 2534 2599
+4 2348 2535 2534 2597
+4 2536 2535 2348 2597
+4 2793 2535 2536 2597
+4 2534 2535 2793 2597
+4 2793 2534 2604 2535
+4 2793 2534 2599 2604
+4 2351 2534 2604 2603
+4 2280 2535 2534 2348
+4 2351 2534 2535 2604
+4 2280 2351 2534 2535
+4 2535 2351 2281 2280
+4 2793 2535 2537 2536
+4 2445 2535 2351 2281
+4 2445 2535 2604 2351
+4 2693 2793 2535 2537
+4 2535 2693 2604 2793
+4 2604 2693 2535 2445
+4 2853 2852 2854 2892
+4 2853 2852 2599 2854
+4 2802 2852 2599 2853
+4 2599 2597 2852 2802
+4 2599 2852 2793 2854
+4 2852 2599 2793 2597
+4 2854 2852 1737 2892
+4 2854 2852 2855 1737
+4 2854 2852 2793 2855
+4 2761 2755 2758 2505
+4 2575 2325 2326 2327
+4 1764 1763 1765 1536
+4 2260 2286 2289 2035
+4 2260 2030 2286 2035
+4 2017 2011 2030 1775
+4 2017 1766 2011 1775
+4 1764 2012 1765 1763
+4 1764 2013 2012 1763
+4 2560 2487 2486 2575
+4 2560 2730 2487 2575
+4 919 302 917 577
+4 975 976 2083 2067
+4 975 974 976 2067
+4 995 976 2094 2083
+4 995 975 976 2083
+4 996 1034 2109 2094
+4 2403 1256 1234 2498
+4 2805 2728 2543 2540
+4 2805 2553 2543 2728
+4 2805 2813 2553 2728
+4 2403 1182 2234 1234
+4 2403 1256 1182 1234
+4 2304 2515 2553 2543
+4 2525 2769 2772 2553
+4 2143 1132 2334 1180
+4 2143 1035 1132 1180
+4 1132 2144 1036 1035
+4 1132 2143 2144 1035
+4 2167 2144 2168 2772
+4 2778 2144 2167 2772
+4 2169 2144 2778 2772
+4 2168 2144 2169 2772
+4 2144 2168 1036 2167
+4 1036 2169 2168 2144
+4 2778 2772 2767 2169
+4 2772 2767 2525 2778
+4 2525 2769 2767 2772
+4 2767 2772 2168 2169
+4 2168 2767 2769 2772
+4 1132 2169 1036 2144
+4 2168 2767 2212 2769
+4 2335 2169 1183 1132
+4 1183 2168 2169 2335
+4 2212 2168 1183 2335
+4 2767 2168 2212 2335
+4 2169 2168 2767 2335
+4 1183 2169 1036 1132
+4 1036 2168 2169 1183
+4 2775 2767 2778 2525
+4 2778 2169 2143 2144
+4 2775 2169 2335 2334
+4 2169 2775 2767 2778
+4 2335 2767 2169 2775
+4 2143 2169 2775 2334
+4 2775 2169 2143 2778
+4 2143 2169 1132 2144
+4 1132 2169 2334 2335
+4 1132 2169 2143 2334
+4 1183 2335 1182 2212
+4 1132 1181 2335 2334
+4 1183 2335 1181 1182
+4 1183 2335 1132 1181
+4 2335 1181 1203 2334
+4 1182 2335 1181 1203
+4 1207 1181 2334 1203
+4 2334 1180 1181 1207
+4 1180 1181 1132 2334
+4 2234 2404 1182 2403
+4 2234 2762 2404 2403
+4 2234 2335 2212 1182
+4 2234 2404 2335 1182
+4 2762 2335 2234 2404
+4 2762 2735 2335 2404
+4 2234 2766 2212 2335
+4 2762 2766 2234 2335
+4 2767 2766 2762 2335
+4 2212 2766 2767 2335
+4 2762 2767 2523 2766
+4 2762 2767 2735 2523
+4 2767 2735 2335 2762
+4 2766 2767 2769 2212
+4 2766 2515 2769 2767
+4 2523 2515 2766 2767
+4 2525 2515 2523 2767
+4 2769 2515 2525 2767
+4 1256 1182 2404 2403
+4 1203 1182 2404 1256
+4 1203 1182 2335 2404
+4 2515 2525 2553 2769
+4 2553 2304 2525 2515
+4 2775 2335 2422 2334
+4 2523 2775 2717 2522
+4 2735 2775 2523 2767
+4 2717 2735 2775 2523
+4 2775 2523 2525 2522
+4 2525 2775 2767 2523
+4 2735 2775 2422 2717
+4 2735 2775 2335 2422
+4 2775 2335 2767 2735
+4 2404 2335 2422 2735
+4 2422 2335 1203 2334
+4 1203 2335 2422 2404
+4 2522 2525 2515 2523
+4 2522 2525 2304 2515
+4 2804 2813 2764 2805
+4 2235 2211 2766 2804
+4 2766 2211 2212 2769
+4 2235 2212 2766 2211
+4 2235 2212 2234 2766
+4 2804 2764 2813 2211
+4 2766 2764 2804 2211
+4 2769 2764 2766 2211
+4 2813 2764 2769 2211
+4 1083 2212 2235 2211
+4 1182 2212 1083 1183
+4 2235 2234 2212 1083
+4 1234 2234 2235 1083
+4 1182 2234 1234 1083
+4 2212 2234 1182 1083
+4 1068 2212 1083 2211
+4 1083 1183 2212 1068
+4 1069 2167 2166 2225
+4 1068 2168 2211 2166
+4 1183 2168 1068 1036
+4 1068 2168 2212 2211
+4 2168 2212 1183 1068
+4 1069 2166 2167 1036
+4 1068 2166 1069 1036
+4 2168 2166 1068 1036
+4 2167 2166 2168 1036
+4 2168 2211 2769 2212
+4 2211 2166 2168 2769
+4 2813 2166 2211 2769
+4 2772 2166 2813 2769
+4 2168 2166 2772 2769
+4 2225 2772 2166 2813
+4 2167 2166 2772 2168
+4 2166 2167 2772 2225
+4 2515 2769 2764 2766
+4 2813 2769 2553 2772
+4 2805 2553 2764 2543
+4 2764 2553 2813 2769
+4 2805 2553 2813 2764
+4 2764 2553 2515 2543
+4 2515 2769 2553 2764
+4 2515 2304 2291 2543
+4 2515 2304 2273 2291
+4 2304 2273 2522 2515
+4 2781 2167 2778 2144
+4 2526 2525 2522 2775
+4 2526 2778 2525 2775
+4 2526 2304 2273 2522
+4 2526 2525 2304 2522
+4 2763 2519 2728 2511
+4 2763 2514 2519 2511
+4 2763 2768 2519 2514
+4 2763 2725 2768 2514
+4 2768 2383 2781 2725
+4 2768 2763 2383 2725
+4 2768 2772 2763 2519
+4 2768 2772 2383 2763
+4 2778 2768 2772 2167
+4 2781 2768 2778 2167
+4 2383 2768 2781 2167
+4 2772 2768 2383 2167
+4 2519 2768 2772 2553
+4 2526 2768 2519 2553
+4 2525 2768 2526 2553
+4 2772 2768 2525 2553
+4 2778 2768 2525 2772
+4 2778 2525 2768 2526
+4 2225 2772 2383 2167
+4 2225 2772 2763 2383
+4 2763 2813 2772 2225
+4 2813 2763 2772 2553
+4 2728 2763 2813 2553
+4 2519 2763 2728 2553
+4 2772 2763 2519 2553
+4 2539 2519 2513 2511
+4 2539 2728 2519 2511
+4 2273 2519 2526 2513
+4 2273 2485 2519 2513
+4 2526 2304 2553 2519
+4 2273 2304 2526 2519
+4 2485 2304 2273 2519
+4 2553 2304 2485 2519
+4 2291 2304 2273 2485
+4 2553 2485 2728 2519
+4 2553 2485 2543 2728
+4 2304 2485 2543 2553
+4 2291 2304 2485 2543
+4 2539 2519 2485 2513
+4 2539 2519 2728 2485
+4 2485 2728 2540 2543
+4 2540 2539 2728 2485
+4 2304 2553 2525 2526
+4 2513 2519 2514 2511
+4 2768 2519 2513 2526
+4 2513 2519 2768 2514
+4 2785 2781 2383 2725
+4 1163 2167 1069 2225
+4 1163 2383 2167 2225
+4 2110 1164 996 997
+4 2110 1163 1164 997
+4 2109 1164 1034 996
+4 2109 2110 1164 996
+4 2110 2167 1164 1163
+4 2110 2383 2167 1163
+4 2167 2785 2781 2383
+4 2167 2110 2785 2383
+4 2781 2167 2125 2785
+4 2144 2167 2125 2781
+4 2144 2167 1164 2125
+4 2110 2125 2167 2785
+4 1164 2125 2167 2110
+4 2109 2125 2110 2785
+4 2110 1164 2125 2109
+4 2125 1164 1034 2109
+4 2125 1164 1035 1034
+4 2144 1164 1035 2125
+4 1036 1164 1035 2144
+4 1036 2167 1164 2144
+4 1163 1069 2167 1164
+4 419 1069 1163 1164
+4 1036 1069 419 1164
+4 2167 1069 1036 1164
+4 1017 1164 1036 419
+4 997 1164 419 1163
+4 419 1017 1164 997
+4 996 1164 1017 997
+4 1017 1164 1035 1036
+4 1034 1164 1017 996
+4 1035 1164 1017 1034
+4 412 1149 1096 1148
+4 412 951 1149 1148
+4 1180 429 1132 1181
+4 383 56 58 59
+4 383 384 56 59
+4 383 429 384 59
+4 996 329 977 995
+4 996 326 329 995
+4 328 1017 419 997
+4 1035 330 382 1034
+4 1035 1017 330 1034
+4 383 1036 385 330
+4 1037 1036 383 330
+4 1017 1036 1037 330
+4 385 1036 1017 330
+4 1035 1037 1017 1036
+4 1017 330 1037 1035
+4 419 385 1036 1017
+4 1036 383 385 419
+4 1037 330 384 1035
+4 384 330 1037 383
+4 1017 385 328 419
+4 1017 385 330 328
+4 383 330 56 384
+4 58 56 385 328
+4 53 56 58 328
+4 330 56 53 328
+4 385 56 330 328
+4 56 385 383 58
+4 383 330 385 56
+4 58 385 419 328
+4 419 383 385 58
+4 325 330 56 53
+4 381 384 382 1102
+4 325 56 330 382
+4 381 56 325 382
+4 384 56 381 382
+4 330 56 384 382
+4 382 384 1035 1102
+4 1035 330 384 382
+4 996 328 326 997
+4 996 1017 328 997
+4 977 330 1034 382
+4 977 325 330 382
+4 329 330 977 325
+4 329 53 330 325
+4 996 328 329 326
+4 328 996 330 1017
+4 329 330 996 977
+4 329 330 328 996
+4 1034 330 996 1017
+4 1034 330 977 996
+4 53 329 328 326
+4 328 330 329 53
+4 1035 1133 1180 1102
+4 1132 1133 1035 1037
+4 1035 1133 1132 1180
+4 1133 1035 384 1102
+4 384 1133 1037 1035
+4 429 1132 1133 1180
+4 429 383 384 1133
+4 1132 383 429 1133
+4 1037 383 1132 1133
+4 384 383 1037 1133
+4 1036 1037 1132 1035
+4 1132 383 1037 1036
+4 325 382 974 381
+4 329 975 325 977
+4 995 975 329 977
+4 976 975 995 977
+4 325 975 976 977
+4 974 976 325 975
+4 325 976 382 977
+4 325 382 976 974
+4 976 977 1034 382
+4 995 2094 976 977
+4 996 2094 995 977
+4 1034 2094 996 977
+4 976 2094 1034 977
+4 429 1180 430 1181
+4 430 1133 1149 1180
+4 430 429 1133 1180
+4 59 412 384 57
+4 59 311 412 57
+4 430 412 59 311
+4 384 412 59 429
+4 1133 412 384 429
+4 430 412 1133 429
+4 59 412 430 429
+4 951 412 430 311
+4 1149 430 412 1133
+4 951 1149 430 412
+4 57 384 380 412
+4 57 384 56 380
+4 57 384 59 56
+4 381 384 380 56
+4 1149 1133 1102 1180
+4 380 384 1096 412
+4 381 384 1096 380
+4 381 1096 384 1102
+4 1096 412 384 1102
+4 1149 412 1096 1102
+4 1133 412 1149 1102
+4 384 412 1133 1102
+4 56 58 1 53
+4 935 951 412 1148
+4 935 311 412 951
+4 59 57 52 311
+4 57 59 1 56
+4 1 52 59 57
+4 54 59 1 52
+4 58 1 59 56
+4 54 59 58 1
+4 309 311 310 935
+4 310 311 52 57
+4 52 311 310 309
+4 310 311 412 935
+4 310 311 57 412
+4 935 311 934 309
+4 935 949 2006 934
+4 935 311 949 934
+4 1207 430 1180 1181
+4 949 951 430 311
+4 949 935 951 311
+4 1207 430 1149 1180
+4 1204 430 1149 1207
+4 1149 951 1205 1148
+4 1204 1205 1149 430
+4 949 1205 1204 430
+4 951 1205 949 430
+4 1149 1205 951 430
+4 1148 935 951 1205
+4 2006 935 1148 1205
+4 949 935 2006 1205
+4 951 935 949 1205
+4 190 59 355 54
+4 190 52 59 54
+4 190 311 59 52
+4 190 309 311 52
+4 311 737 934 309
+4 311 190 737 309
+4 311 950 949 934
+4 311 737 950 934
+4 1256 1235 1234 2498
+4 1256 1249 1235 2498
+4 1182 1235 431 1234
+4 1182 1256 1235 1234
+4 1206 952 1256 1249
+4 1206 950 952 1249
+4 1203 433 1181 1182
+4 1203 1256 433 1182
+4 1206 433 1203 1256
+4 1206 952 433 1256
+4 433 1206 430 952
+4 1203 430 433 1206
+4 1181 430 1203 1207
+4 1181 430 433 1203
+4 1204 430 1203 1206
+4 1204 430 1207 1203
+4 1206 430 949 1204
+4 1206 949 430 952
+4 950 949 1206 952
+4 311 949 950 952
+4 430 949 311 952
+4 1249 433 952 1256
+4 950 952 432 311
+4 432 952 1249 433
+4 432 952 950 1249
+4 430 432 952 311
+4 433 432 952 430
+4 1182 433 1235 1256
+4 431 433 1235 1182
+4 432 433 1235 431
+4 1235 433 1249 1256
+4 1235 433 432 1249
+4 59 432 430 311
+4 430 433 429 1181
+4 429 59 431 433
+4 430 59 429 433
+4 432 59 430 433
+4 431 59 432 433
+4 429 433 1182 1181
+4 429 433 431 1182
+4 1058 1249 736 1716
+4 1058 2190 1249 1716
+4 355 432 431 59
+4 431 1235 1058 1234
+4 432 736 431 1235
+4 1249 736 432 1235
+4 1058 736 1249 1235
+4 431 736 1058 1235
+4 355 431 736 1058
+4 736 432 431 355
+4 2189 2190 2498 1235
+4 1058 2190 2189 1235
+4 1249 2190 1058 1235
+4 2498 2190 1249 1235
+4 2189 1235 1234 1058
+4 2498 1235 1234 2189
+4 736 1249 1717 1716
+4 1717 950 736 737
+4 736 1249 950 1717
+4 1249 950 432 736
+4 311 736 950 737
+4 311 432 950 736
+4 736 311 190 737
+4 190 355 59 311
+4 736 355 190 311
+4 432 355 736 311
+4 59 355 432 311
+4 356 59 383 58
+4 356 54 59 58
+4 1182 431 1083 1234
+4 1083 434 1068 357
+4 1083 431 434 357
+4 1083 1183 434 431
+4 1182 1183 1083 431
+4 429 1183 1182 431
+4 434 1183 429 431
+4 1181 429 1183 1182
+4 1132 1183 429 434
+4 1132 429 1183 1181
+4 1183 434 1068 1083
+4 1036 434 1183 1132
+4 1183 434 1036 1068
+4 356 434 357 1068
+4 356 1036 434 1068
+4 59 434 431 357
+4 429 434 59 383
+4 59 431 434 429
+4 356 434 59 357
+4 383 434 59 356
+4 1036 434 383 356
+4 1132 434 383 1036
+4 383 429 434 1132
+4 1083 431 1058 1234
+4 54 59 357 356
+4 357 431 1058 1083
+4 357 431 355 1058
+4 357 355 59 54
+4 357 431 59 355
+4 1069 1036 356 1068
+4 356 383 419 58
+4 356 419 1036 1069
+4 419 1036 383 356
+4 975 2083 2082 2067
+4 1010 975 2083 2082
+4 1010 975 995 2083
+4 327 326 329 53
+4 327 302 326 53
+4 917 327 918 1010
+4 917 302 919 918
+4 327 302 917 918
+4 326 302 327 918
+4 919 302 326 918
+4 995 918 329 975
+4 1010 918 995 975
+4 327 918 1010 975
+4 329 918 327 975
+4 918 329 326 995
+4 326 327 329 918
+4 327 329 325 53
+4 327 329 975 325
+4 302 919 554 577
+4 2191 1234 1058 2189
+4 2191 1083 1058 1234
+4 2191 2235 1083 1234
+4 1163 2225 2368 2383
+4 1756 1083 1058 2191
+4 895 1068 1756 1921
+4 895 845 1068 1921
+4 51 58 53 1
+4 51 55 58 1
+4 373 58 115 55
+4 373 296 58 55
+4 553 328 997 326
+4 1016 328 419 997
+4 1016 553 328 997
+4 373 328 553 115
+4 328 373 1016 419
+4 553 328 373 1016
+4 328 373 58 115
+4 58 328 419 373
+4 373 419 845 1016
+4 373 419 296 845
+4 373 419 58 296
+4 115 53 302 51
+4 115 326 554 302
+4 326 115 553 328
+4 554 326 115 553
+4 326 115 53 302
+4 326 115 328 53
+4 58 115 53 328
+4 58 115 51 53
+4 55 58 115 51
+4 54 58 55 1
+4 54 58 296 55
+4 895 357 296 355
+4 845 356 419 296
+4 356 845 1069 1068
+4 1069 356 419 845
+4 296 845 356 357
+4 895 845 296 357
+4 1068 845 895 357
+4 356 845 1068 357
+4 356 296 58 419
+4 356 296 54 58
+4 296 54 357 356
+4 296 357 54 355
+4 1058 357 895 355
+4 1058 895 357 1083
+4 1756 895 1058 1083
+4 1068 895 1756 1083
+4 357 895 1068 1083
+4 1756 2235 1083 2191
+4 1756 2851 2235 2191
+4 1016 419 1163 997
+4 2806 2804 1995 2851
+4 2813 1995 2804 2211
+4 1995 2805 2806 2807
+4 1995 2805 2804 2806
+4 2804 1995 2813 2805
+4 2816 2805 1995 2807
+4 2813 1995 2816 2805
+4 1920 2813 1995 2816
+4 1995 1921 2211 2813
+4 1920 1921 1995 2813
+4 2166 1921 1920 2813
+4 2211 1921 2166 2813
+4 2211 1921 1068 2166
+4 1756 2211 1995 1921
+4 1995 2851 2804 2211
+4 1756 2851 1995 2211
+4 2235 2851 1756 2211
+4 2804 2851 2235 2211
+4 1068 2211 1756 1921
+4 1083 1756 2211 2235
+4 1068 2211 1083 1756
+4 2367 2369 1920 2816
+4 1162 1920 2225 1069
+4 1920 1162 2225 2369
+4 2367 1162 1920 2369
+4 2368 1162 2367 2369
+4 2225 1162 2368 2369
+4 2813 1920 2369 2816
+4 2225 1920 2166 1069
+4 2225 1920 2813 2166
+4 2813 2225 2369 1920
+4 845 1069 1920 1162
+4 1920 1921 2166 1069
+4 845 1921 1920 1069
+4 1068 1921 845 1069
+4 2166 1921 1068 1069
+4 1163 2225 1162 2368
+4 1069 1162 1163 2225
+4 1016 1162 1163 419
+4 845 1162 1016 419
+4 1069 1162 845 419
+4 1163 1162 1069 419
+4 2557 2805 2816 2807
+4 2557 2561 2805 2807
+4 2368 2225 2763 2383
+4 2816 2729 2557 2730
+4 2816 2367 2729 2730
+4 2729 2369 2368 2367
+4 2729 2816 2369 2367
+4 2816 2556 2805 2557
+4 2813 2728 2816 2369
+4 2805 2816 2728 2556
+4 2813 2816 2728 2805
+4 2556 2816 2729 2557
+4 2816 2728 2729 2369
+4 2729 2556 2728 2816
+4 2763 2369 2368 2729
+4 2763 2369 2225 2368
+4 2369 2225 2813 2763
+4 2728 2369 2763 2729
+4 2728 2369 2813 2763
+4 2729 2728 2511 2763
+4 2487 2556 2486 2539
+4 2730 2729 2557 2486
+4 2487 2729 2730 2486
+4 2556 2729 2487 2486
+4 2557 2729 2556 2486
+4 2560 2486 2730 2557
+4 2560 2486 2487 2730
+4 2487 2729 2556 2539
+4 2511 2729 2487 2539
+4 2728 2729 2511 2539
+4 2556 2729 2728 2539
+4 2557 2486 2562 2560
+4 2542 2556 2539 2486
+4 2540 2805 2728 2539
+4 2542 2805 2540 2539
+4 2556 2805 2542 2539
+4 2728 2805 2556 2539
+4 2562 2542 2557 2561
+4 2557 2542 2486 2556
+4 2557 2486 2542 2562
+4 2805 2557 2542 2561
+4 2542 2556 2557 2805
+4 326 302 919 554
+4 2511 2513 2260 2514
+4 2511 2286 2289 2260
+4 2511 2513 2286 2260
+4 2575 2324 2326 2325
+4 2575 2487 2324 2325
+4 2290 2539 2540 2485
+4 2290 2539 2542 2540
+4 2324 2486 2539 2487
+4 2324 2575 2486 2487
+4 2326 2486 2324 2575
+4 2326 2560 2486 2575
+4 2326 2486 2305 2324
+4 2319 2305 2326 2560
+4 2562 2305 2319 2560
+4 2486 2305 2562 2560
+4 2326 2305 2486 2560
+4 2542 2486 2305 2562
+4 2542 2305 2486 2539
+4 2290 2305 2542 2539
+4 2324 2305 2290 2539
+4 2486 2305 2324 2539
+4 2289 2324 2487 2325
+4 2289 2539 2511 2487
+4 2289 2324 2539 2487
+4 2286 2539 2513 2511
+4 2286 2289 2539 2511
+4 2539 2287 2513 2485
+4 2539 2287 2286 2513
+4 2287 2539 2286 2288
+4 2290 2539 2287 2288
+4 2287 2539 2290 2485
+4 2513 2287 2273 2485
+4 2258 2513 2287 2273
+4 2258 2513 2286 2287
+4 2291 2273 2287 2485
+4 2288 2539 2324 2290
+4 2288 2539 2289 2324
+4 2288 2539 2286 2289
+4 2787 2067 2790 2082
+4 2787 2083 2067 2082
+4 1148 1205 2347 2006
+4 2512 2272 2513 2258
+4 2512 2256 2272 2258
+4 382 1117 1103 1102
+4 382 1035 1117 1102
+4 2095 2067 2068 2787
+4 2095 2083 2067 2787
+4 2783 2144 2774 2145
+4 2783 2125 2144 2145
+4 2531 2529 2725 2484
+4 2778 2529 2774 2524
+4 2144 2783 2781 2125
+4 2781 2778 2529 2783
+4 2144 2778 2781 2783
+4 2774 2778 2144 2783
+4 2529 2778 2774 2783
+4 2781 2783 2785 2125
+4 2785 2531 2783 2781
+4 2725 2531 2785 2781
+4 2529 2531 2725 2781
+4 2783 2531 2529 2781
+4 2514 2529 2512 2484
+4 2514 2725 2529 2484
+4 2781 2529 2768 2725
+4 2778 2529 2768 2781
+4 2512 2768 2524 2529
+4 2512 2526 2524 2768
+4 2524 2512 2272 2526
+4 2768 2524 2778 2526
+4 2778 2529 2524 2768
+4 2768 2529 2514 2725
+4 2514 2768 2512 2529
+4 2768 2512 2513 2514
+4 2512 2513 2526 2768
+4 2526 2512 2272 2513
+4 2126 2125 2783 2145
+4 2785 2109 2125 2783
+4 2784 2109 2785 2783
+4 2126 2109 2784 2783
+4 2125 2109 2126 2783
+4 2531 2783 2784 2785
+4 2780 2783 2784 2531
+4 2780 2783 2126 2784
+4 2784 2126 2124 2109
+4 2784 2126 2782 2124
+4 2782 2780 2126 2784
+4 2144 2774 2143 2778
+4 2143 2144 2145 2774
+4 2144 2145 1035 2143
+4 1035 2125 2145 2144
+4 382 1118 1103 1117
+4 1103 1118 974 2066
+4 974 1118 382 976
+4 382 1103 1118 974
+4 2067 974 976 2068
+4 2066 974 2067 2068
+4 1118 974 2066 2068
+4 976 974 1118 2068
+4 382 1118 1034 976
+4 1035 1117 1034 382
+4 1034 1035 2125 2126
+4 1117 1035 1034 2126
+4 2145 1035 1117 2126
+4 2125 1035 2145 2126
+4 1118 1034 1117 382
+4 2126 1117 1118 1034
+4 2109 2126 1034 2125
+4 2095 976 1118 2068
+4 2124 1034 2094 2109
+4 2094 2095 976 1034
+4 2124 2095 2094 1034
+4 1118 2095 2124 1034
+4 976 2095 1118 1034
+4 2126 1034 2124 2109
+4 2126 1034 1118 2124
+4 2095 976 2083 2094
+4 2095 976 2067 2083
+4 976 2067 2068 2095
+4 2095 2068 2786 2787
+4 2095 2321 2320 2786
+4 2095 2068 2321 2786
+4 2771 2774 2530 2520
+4 2771 2783 2530 2774
+4 2771 2145 2783 2774
+4 2779 2783 2780 2530
+4 2779 2771 2783 2530
+4 2779 2145 2783 2771
+4 2779 2301 2145 2771
+4 2124 2299 2126 2782
+4 2124 2320 2299 2782
+4 2321 1118 2299 2284
+4 2095 2320 2321 1118
+4 2124 2320 2095 1118
+4 2299 2320 2124 1118
+4 2321 2320 2299 1118
+4 1118 2299 2126 2124
+4 2299 1118 1117 2284
+4 1117 2126 1118 2299
+4 2068 2321 1118 2095
+4 2321 1118 2066 2068
+4 1103 1118 2284 1117
+4 2066 2284 1118 2321
+4 2284 1118 1103 2066
+4 2299 1117 2301 2284
+4 2779 2126 2299 2782
+4 2779 2299 2126 2145
+4 2301 2299 2779 2145
+4 1117 2299 2301 2145
+4 2126 2299 1117 2145
+4 2780 2126 2779 2782
+4 2783 2779 2126 2145
+4 2779 2783 2126 2780
+4 2531 2530 2528 2780
+4 2531 2783 2530 2780
+4 2774 2530 2529 2783
+4 2271 2278 2524 2520
+4 2512 2278 2524 2272
+4 2256 2278 2512 2272
+4 2271 2278 2256 2272
+4 2524 2278 2271 2272
+4 2269 2271 2278 2256
+4 2520 2271 2278 2269
+4 2529 2278 2524 2512
+4 2530 2520 2774 2529
+4 2278 2520 2530 2529
+4 2524 2520 2278 2529
+4 2774 2520 2524 2529
+4 2278 2529 2484 2512
+4 2529 2530 2531 2783
+4 2528 2484 2278 2530
+4 2531 2484 2528 2530
+4 2529 2484 2531 2530
+4 2278 2484 2529 2530
+4 2273 2272 2258 2513
+4 2273 2526 2272 2513
+4 2353 1149 1204 1205
+4 2300 2145 1117 2301
+4 2300 2771 2145 2301
+4 2520 2774 2770 2771
+4 2775 2773 2143 2334
+4 2775 2422 2773 2334
+4 2775 2774 2778 2143
+4 2775 2773 2774 2143
+4 2468 2526 2272 2273
+4 2468 2522 2526 2273
+4 2517 2271 2520 2269
+4 2517 2467 2271 2269
+4 2716 2775 2522 2717
+4 2524 2521 2271 2520
+4 2524 2774 2521 2520
+4 2716 2526 2468 2522
+4 2716 2775 2526 2522
+4 2271 2272 2467 2521
+4 2524 2272 2271 2521
+4 2468 2272 2524 2521
+4 2467 2272 2468 2521
+4 2468 2521 2716 2467
+4 2716 2524 2521 2468
+4 2468 2524 2526 2716
+4 2272 2524 2526 2468
+4 2778 2524 2775 2526
+4 2775 2774 2524 2778
+4 2774 2524 2521 2775
+4 2775 2524 2716 2526
+4 2775 2524 2521 2716
+4 2422 2775 2716 2717
+4 2716 2773 2775 2422
+4 2716 2724 2773 2422
+4 2521 2773 2774 2775
+4 2521 2716 2773 2775
+4 2770 2521 2773 2774
+4 2770 2520 2521 2774
+4 2716 2521 2517 2467
+4 2724 2716 2773 2770
+4 2517 2716 2724 2770
+4 2521 2716 2517 2770
+4 2773 2716 2521 2770
+4 2520 2521 2517 2770
+4 2517 2271 2521 2520
+4 2271 2521 2467 2517
+4 2468 2272 2258 2273
+4 2256 2271 2467 2269
+4 2468 2272 2256 2258
+4 2256 2272 2467 2271
+4 2467 2272 2256 2468
+4 2770 2145 2300 2771
+4 2770 2774 2145 2771
+4 2751 2392 2253 2300
+4 2751 2770 2392 2300
+4 2392 2724 2773 2770
+4 2392 2751 2724 2770
+4 1207 2353 2253 1149
+4 1207 1204 2353 1149
+4 2353 2392 1207 2253
+4 2353 2751 2392 2253
+4 2423 1207 1203 1204
+4 2423 2353 1207 1204
+4 2423 2334 2422 1203
+4 2423 1207 2334 1203
+4 2724 2392 2423 2751
+4 2724 2423 2392 2773
+4 2422 2423 2724 2773
+4 2334 2423 2422 2773
+4 2392 2423 2334 2773
+4 2423 2392 2353 2751
+4 2392 2423 1207 2334
+4 2353 1207 2392 2423
+4 2253 2145 1117 2300
+4 2253 2392 2145 2300
+4 1035 2145 1180 2143
+4 1180 2253 1102 1149
+4 1035 1180 2145 1117
+4 1102 1180 1035 1117
+4 2253 1180 1102 1117
+4 2145 1180 2253 1117
+4 1207 2253 1180 1149
+4 1180 2392 2334 2143
+4 2392 1180 1207 2253
+4 1180 2392 1207 2334
+4 2392 1180 2145 2143
+4 2145 2392 2253 1180
+4 2145 2392 2770 2300
+4 2773 2392 2143 2334
+4 2143 2145 2392 2773
+4 2774 2145 2143 2773
+4 2770 2145 2774 2773
+4 2392 2145 2770 2773
+4 2300 1117 2284 2301
+4 2354 1149 2353 1205
+4 2252 1117 2284 2300
+4 2252 2253 1117 2300
+4 1096 2253 2251 1149
+4 1096 1102 2253 1149
+4 1117 2254 2252 2284
+4 1117 2254 2253 2252
+4 2253 2254 1117 1102
+4 1103 2254 1117 2284
+4 1117 2254 1103 1102
+4 2249 2254 2284 2252
+4 2284 1103 2254 2249
+4 1096 2254 1103 2249
+4 1096 2254 1102 1103
+4 2254 1102 2253 1096
+4 2252 2254 1096 2249
+4 2252 2254 2253 1096
+4 2252 1096 2251 2249
+4 2251 2252 2253 1096
+4 2751 2253 2252 2300
+4 2754 2251 2353 2354
+4 2754 2353 2251 2252
+4 2751 2353 2754 2252
+4 2253 2353 2751 2252
+4 2251 2353 2253 2252
+4 1149 2353 2251 2354
+4 2253 2251 1149 2353
+4 2250 2251 1096 2249
+4 2248 2251 1096 2250
+4 1205 2248 1149 1148
+4 1149 2354 2248 1205
+4 1149 2354 2251 2248
+4 1096 1149 2248 1148
+4 2248 2251 1149 1096
+4 2248 1205 2347 1148
+4 2761 2251 2248 2250
+4 2347 2248 2354 1205
+4 2761 2354 2248 2251
+4 2248 2347 2354 2761
+4 2284 2066 2283 2321
+4 1096 1103 1101 2249
+4 381 1103 974 1101
+4 382 1103 381 1102
+4 381 1103 382 974
+4 1096 1103 381 1101
+4 381 1102 1103 1096
+4 2066 1103 1101 974
+4 2066 1101 1103 2284
+4 2283 1101 2066 2284
+4 2249 1101 2283 2284
+4 1103 1101 2249 2284
+4 2484 2278 2276 2528
+4 2259 2512 2484 2514
+4 2017 2011 2259 2030
+4 2484 2276 2278 2512
+4 2259 2276 2484 2512
+4 2255 2276 2259 2512
+4 2278 2276 2255 2512
+4 2512 2255 2256 2259
+4 2512 2255 2278 2256
+4 2259 2255 2017 2276
+4 2011 2255 2259 2256
+4 2017 2011 2255 2259
+4 2256 2255 2269 2011
+4 2269 2278 2255 2256
+4 2259 2513 2512 2514
+4 2259 2260 2513 2514
+4 2257 2259 2256 2011
+4 2257 2030 2259 2011
+4 2258 2513 2257 2286
+4 2258 2257 2513 2512
+4 2256 2257 2258 2512
+4 2259 2257 2256 2512
+4 2513 2257 2259 2512
+4 2260 2259 2513 2286
+4 2030 2259 2260 2286
+4 2257 2259 2030 2286
+4 2513 2259 2257 2286
+4 2066 2321 2792 2283
+4 2067 2068 2791 2066
+4 2790 2789 2791 2067
+4 2787 2789 2790 2067
+4 2068 2789 2787 2067
+4 2791 2789 2068 2067
+4 2789 2068 2786 2791
+4 2787 2068 2786 2789
+4 2792 2791 2786 2321
+4 2066 2791 2792 2321
+4 2068 2791 2066 2321
+4 2786 2791 2068 2321
+4 2741 2770 2517 2724
+4 2741 2751 2770 2724
+4 2745 2744 2496 2746
+4 2780 2779 2745 2782
+4 2269 2255 2012 2011
+4 2527 2277 2528 2275
+4 2527 2518 2277 2275
+4 2520 2740 2771 2770
+4 2771 2518 2742 2740
+4 2771 2520 2518 2740
+4 2528 2530 2527 2780
+4 2527 2530 2518 2742
+4 2527 2530 2277 2518
+4 2527 2277 2530 2528
+4 2745 2527 2742 2779
+4 2780 2527 2745 2779
+4 2530 2527 2780 2779
+4 2742 2527 2530 2779
+4 2771 2742 2530 2779
+4 2771 2518 2530 2742
+4 2530 2518 2520 2277
+4 2771 2518 2520 2530
+4 2516 2520 2269 2517
+4 2520 2277 2518 2268
+4 2269 2277 2520 2268
+4 2264 2277 2269 2268
+4 2518 2277 2264 2268
+4 2265 2268 2264 2269
+4 2264 2518 2268 2265
+4 2265 2516 2518 2268
+4 2269 2516 2265 2268
+4 2520 2516 2269 2268
+4 2518 2516 2520 2268
+4 2518 2264 2275 2265
+4 2518 2264 2277 2275
+4 2516 2520 2740 2518
+4 2517 2516 2520 2770
+4 2741 2516 2517 2770
+4 2740 2516 2741 2770
+4 2520 2516 2740 2770
+4 2276 2277 2264 2275
+4 2276 2528 2277 2275
+4 2269 2277 2278 2520
+4 2276 2255 2264 2277
+4 2278 2255 2276 2277
+4 2269 2255 2278 2277
+4 2264 2255 2269 2277
+4 2528 2277 2278 2276
+4 2278 2530 2277 2528
+4 2520 2277 2278 2530
+4 2016 2264 2275 2276
+4 2016 2255 2264 2276
+4 2016 2275 2264 2012
+4 2014 2275 2016 2012
+4 2265 2275 2014 2012
+4 2264 2275 2265 2012
+4 2255 2264 2012 2016
+4 2012 2264 2269 2265
+4 2012 2264 2255 2269
+4 2016 2012 1765 2014
+4 2017 2255 2016 2276
+4 2016 2012 1766 1765
+4 2016 2017 1766 2012
+4 2255 2017 2016 2012
+4 2011 2017 2255 2012
+4 1766 2017 2011 2012
+4 1764 2012 2014 1765
+4 2015 2013 2014 1764
+4 2267 2265 2013 2266
+4 2267 2518 2265 2266
+4 2274 2267 2275 2015
+4 2527 2495 2274 2496
+4 2274 2275 2267 2495
+4 2527 2275 2274 2495
+4 2518 2275 2527 2495
+4 2267 2275 2518 2495
+4 2527 2495 2742 2518
+4 2496 2527 2495 2744
+4 2745 2527 2496 2744
+4 2742 2527 2745 2744
+4 2495 2527 2742 2744
+4 2265 2267 2275 2518
+4 2014 2275 2265 2013
+4 2015 2275 2014 2013
+4 2267 2275 2015 2013
+4 2265 2275 2267 2013
+4 2494 2518 2495 2267
+4 2494 2266 2518 2267
+4 2495 2742 2499 2744
+4 2516 2518 2266 2265
+4 2494 2516 2518 2266
+4 2494 2493 2516 2266
+4 2518 2494 2740 2516
+4 2495 2499 2742 2518
+4 2494 2499 2495 2518
+4 2740 2499 2494 2518
+4 2742 2499 2740 2518
+4 2494 2740 2500 2499
+4 2500 2494 2493 2741
+4 2740 2494 2500 2741
+4 2516 2494 2740 2741
+4 2493 2494 2516 2741
+4 2012 2014 2013 1764
+4 2265 2013 2012 2014
+4 2739 2321 2738 2786
+4 2739 2320 2321 2786
+4 2499 2742 2747 2744
+4 2301 2742 2771 2779
+4 2284 2747 2300 2301
+4 2300 2750 2252 2751
+4 2252 2284 2752 2749
+4 2300 2284 2252 2749
+4 2747 2284 2300 2749
+4 2752 2284 2747 2749
+4 2749 2252 2750 2752
+4 2749 2252 2300 2750
+4 2753 2750 2252 2752
+4 2754 2252 2750 2751
+4 2750 2252 2754 2753
+4 2752 2750 2500 2753
+4 2499 2749 2752 2747
+4 2500 2752 2749 2750
+4 2752 2749 2499 2500
+4 2741 2300 2770 2751
+4 2741 2750 2300 2751
+4 2740 2749 2500 2499
+4 2300 2740 2770 2771
+4 2300 2740 2741 2770
+4 2500 2750 2749 2740
+4 2741 2750 2500 2740
+4 2300 2750 2741 2740
+4 2749 2750 2300 2740
+4 2742 2749 2740 2499
+4 2300 2301 2749 2740
+4 2771 2301 2300 2740
+4 2742 2301 2771 2740
+4 2749 2301 2742 2740
+4 2747 2749 2742 2499
+4 2301 2749 2747 2300
+4 2301 2749 2742 2747
+4 2299 2743 2746 2320
+4 2743 2299 2744 2747
+4 2744 2299 2743 2746
+4 2321 2743 2299 2320
+4 2299 2743 2321 2747
+4 2739 2743 2320 2746
+4 2739 2743 2321 2320
+4 2743 2321 2738 2739
+4 2748 2321 2743 2747
+4 2748 2321 2738 2743
+4 2742 2299 2747 2744
+4 2301 2299 2747 2742
+4 2299 2747 2284 2301
+4 2284 2321 2747 2299
+4 2284 2321 2748 2747
+4 2779 2742 2299 2301
+4 2745 2299 2744 2746
+4 2745 2299 2742 2744
+4 2299 2742 2779 2745
+4 2320 2299 2745 2746
+4 2782 2299 2745 2320
+4 2782 2299 2779 2745
+4 2738 2321 2792 2786
+4 2759 2284 2748 2747
+4 2759 2752 2284 2747
+4 2792 2748 2321 2738
+4 2748 2321 2283 2792
+4 2283 2748 2284 2321
+4 2283 2759 2284 2748
+4 2249 2759 2284 2283
+4 2249 2760 2759 2283
+4 2252 2759 2752 2284
+4 2252 2249 2759 2284
+4 2760 2251 2758 2250
+4 2760 2249 2251 2250
+4 2757 2251 2758 2760
+4 2753 2252 2757 2752
+4 2757 2251 2755 2758
+4 2251 2757 2755 2754
+4 2252 2757 2251 2754
+4 2753 2757 2252 2754
+4 2755 2757 2753 2754
+4 2757 2252 2759 2752
+4 2759 2760 2249 2252
+4 2757 2760 2759 2252
+4 2251 2760 2757 2252
+4 2249 2760 2251 2252
+4 2758 2251 2761 2250
+4 2354 2251 2755 2754
+4 2761 2755 2251 2758
+4 2755 2251 2354 2761
+4 19 26 20 18
+4 20 26 70 18
+4 26 19 70 18
+4 15 14 41 13
+4 41 14 36 13
+4 14 15 36 13
+4 2533 2790 2789 2532
+4 2789 2790 2791 2532
+4 2790 2533 2791 2532
+
+CELL_TYPES 12936
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+
+POINT_DATA 2896
+SCALARS scalars float 1
+LOOKUP_TABLE default
+     0.04449900 
+     0.03773600 
+     0.03428300 
+     0.03535300 
+     0.03914400 
+     0.05739500 
+     0.05146600 
+     0.06111100 
+     0.03682500 
+     0.04359100 
+     0.04725600 
+     0.05393400 
+     0.04071900 
+     1.51580000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.81889200 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     1.48099995 
+     0.00000000 
+     0.00000000 
+     1.78100002 
+     1.80100000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     2.02200007 
+     0.00000000 
+     0.00000000 
+     1.62655997 
+     1.76113999 
+     0.00000000 
+     1.87800002 
+     2.11669993 
+     1.74000001 
+     0.00000000 
+     2.25399995 
+     0.00000000 
+     1.58304000 
+     1.48785996 
+     1.66299999 
+     1.76900005 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     1.72099996 
+     0.03088900 
+     0.05305300 
+     0.02585700 
+     0.04063100 
+     0.03196000 
+     0.02755600 
+     0.04147900 
+     0.02986500 
+     0.03887300 
+     1.92600000 
+     0.00000000 
+     1.50663996 
+     0.00000000 
+     1.94700003 
+     0.00000000 
+     0.00000000 
+     1.78393996 
+     1.94500005 
+     0.00000000 
+     0.00000000 
+     0.68094897 
+     1.63053000 
+     0.74008602 
+     1.58560002 
+     1.57660997 
+     1.60810006 
+     1.67402995 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     1.71729004 
+     1.88229001 
+     1.97552001 
+     1.74144006 
+     1.59044003 
+     1.53938997 
+     1.49712002 
+     0.02763400 
+     0.02677200 
+     0.03099000 
+     0.03050100 
+     0.03273800 
+     1.60100996 
+     0.00000000 
+     0.00000000 
+     1.70790005 
+     1.81543005 
+     1.96291995 
+     1.82193995 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     1.45208001 
+     1.42522001 
+     1.51301003 
+     1.43150997 
+     1.59712005 
+     1.69893003 
+     0.02794600 
+     0.03062500 
+     0.03144600 
+     0.03316100 
+     1.00460994 
+     1.49324000 
+     1.79384005 
+     1.51455998 
+     0.00000000 
+     1.38170004 
+     1.95799994 
+     1.61992002 
+     1.86063004 
+     1.51547003 
+     1.49033999 
+     1.80620003 
+     1.46299005 
+     2.01900005 
+     1.91199994 
+     1.93499994 
+     0.00000000 
+     1.80171001 
+     1.62267005 
+     0.03004900 
+     0.04462500 
+     0.04184200 
+     0.03303200 
+     1.61599004 
+     0.72272700 
+     0.00000000 
+     0.59931803 
+     0.81131601 
+     1.48959994 
+     1.75490999 
+     1.61541998 
+     1.69322002 
+     1.73820996 
+     1.67077994 
+     1.66067004 
+     1.66031003 
+     1.70772004 
+     1.75556004 
+     1.44333005 
+     1.22317004 
+     0.07303300 
+     0.09514400 
+     0.05606300 
+     0.09010000 
+     0.06530000 
+     0.05260300 
+     1.38002002 
+     0.05654100 
+     0.09715800 
+     0.07941800 
+     0.07388400 
+     0.09316000 
+     0.09027100 
+     1.56168997 
+     1.54902005 
+     0.00000000 
+     0.00000000 
+     1.61756003 
+     1.34902000 
+     0.00000000 
+     1.58369994 
+     1.50890005 
+     1.73005998 
+     1.50790000 
+     1.73684001 
+     0.00000000 
+     1.51075006 
+     1.01802003 
+     1.21289003 
+     0.77704197 
+     0.00000000 
+     0.05914500 
+     0.07481100 
+     0.06035600 
+     0.06161600 
+     0.00000000 
+     1.29101002 
+     1.36301005 
+     1.44823003 
+     1.44210994 
+     1.40364003 
+     1.20401001 
+     1.28469002 
+     1.35399997 
+     1.57237005 
+     1.67455995 
+     1.60231996 
+     1.72400999 
+     1.67200994 
+     1.58424997 
+     1.75551999 
+     1.47059000 
+     1.64227998 
+     0.07874700 
+     1.50352001 
+     1.69737005 
+     1.42490005 
+     0.19437601 
+     1.38583004 
+     0.20657600 
+     1.68506002 
+     1.49294996 
+     0.03912900 
+     0.03476600 
+     0.03930800 
+     0.03513800 
+     0.03548500 
+     0.04083200 
+     1.57565999 
+     1.68489003 
+     1.62153006 
+     1.62893999 
+     1.68078995 
+     1.33337998 
+     1.29793000 
+     1.17045999 
+     0.05858000 
+     0.03579700 
+     0.01651600 
+     0.00000000 
+     0.02589500 
+     0.00000000 
+     0.01901600 
+     0.02979500 
+     0.01646500 
+     0.00000000 
+     0.04032000 
+     0.07408500 
+     0.05743000 
+     0.04426100 
+     0.07101100 
+     0.06373400 
+     0.11865500 
+     0.10906100 
+     0.11528500 
+     0.10979800 
+     0.12703100 
+     0.04339700 
+     0.05206000 
+     0.13603500 
+     0.13261101 
+     0.14726700 
+     0.09086700 
+     0.09144600 
+     0.13625599 
+     0.11150400 
+     0.08283100 
+     0.09234300 
+     0.10368300 
+     0.08084900 
+     0.09795000 
+     0.13514601 
+     0.04063100 
+     0.05425000 
+     0.04414200 
+     0.12970901 
+     0.15612200 
+     0.46849099 
+     0.42927000 
+     0.20295900 
+     0.19125000 
+     0.14753900 
+     0.00000000 
+     0.08352000 
+     0.14411099 
+     0.15016800 
+     0.15554100 
+     0.16313501 
+     0.17998400 
+     0.19160099 
+     0.17015401 
+     0.19825900 
+     0.21379800 
+     0.18566599 
+     0.17173301 
+     0.18408500 
+     0.17835499 
+     0.03340600 
+     0.16440800 
+     0.16769999 
+     0.18254399 
+     1.43579996 
+     1.69120002 
+     0.02601700 
+     0.00000000 
+     0.17743000 
+     0.27891800 
+     1.38287997 
+     1.29403996 
+     1.44105005 
+     0.07760700 
+     0.05604700 
+     0.06528800 
+     1.36054003 
+     1.36047995 
+     1.22644997 
+     1.57217002 
+     0.00000000 
+     1.33578002 
+     0.00000000 
+     0.00000000 
+     0.40861699 
+     0.33276400 
+     0.57107502 
+     0.88797498 
+     0.90834200 
+     0.01965600 
+     0.02175900 
+     0.02091400 
+     0.02294700 
+     0.01831000 
+     0.01980300 
+     0.69918901 
+     0.41664401 
+     1.29580998 
+     0.19315600 
+     0.00000000 
+     1.23650002 
+     1.20931005 
+     1.14618003 
+     1.09906995 
+     1.04807997 
+     1.54150999 
+     1.32745004 
+     1.31124997 
+     1.13899004 
+     1.28225005 
+     1.18435001 
+     1.17343998 
+     1.61300004 
+     1.57631004 
+     0.99082798 
+     0.89281797 
+     1.55148995 
+     1.51595998 
+     1.30783999 
+     0.04546100 
+     0.03016500 
+     0.03698000 
+     1.39320004 
+     1.54730999 
+     1.38608003 
+     1.57718003 
+     1.36149001 
+     1.44984996 
+     1.53333998 
+     1.57632005 
+     0.94863498 
+     1.22148001 
+     0.64657599 
+     0.05108800 
+     0.08964200 
+     0.06470700 
+     0.04560600 
+     0.02889900 
+     0.02387700 
+     0.03105000 
+     0.02898900 
+     0.04033400 
+     0.00000000 
+     0.03156900 
+     0.03192000 
+     0.02324100 
+     0.01658000 
+     0.02729400 
+     0.02893700 
+     0.02319400 
+     0.02348000 
+     0.02810600 
+     0.00000000 
+     0.04595300 
+     0.05462400 
+     0.05025600 
+     0.07401600 
+     0.06419300 
+     0.07170600 
+     0.15017501 
+     0.12546501 
+     0.12686899 
+     0.11518100 
+     0.11321600 
+     0.13888100 
+     0.14123300 
+     0.14653800 
+     0.15622599 
+     0.17384300 
+     0.10144100 
+     0.10336800 
+     0.11395600 
+     0.11031700 
+     0.16029400 
+     0.14500000 
+     0.16833299 
+     0.04302700 
+     0.17497499 
+     0.14436200 
+     0.12273700 
+     0.08728100 
+     0.10740100 
+     0.08955000 
+     0.02428600 
+     0.08126300 
+     0.10475700 
+     0.12731200 
+     0.21755700 
+     0.25521100 
+     0.28748900 
+     0.21305899 
+     0.22868200 
+     0.00000000 
+     0.03334800 
+     0.05245700 
+     0.03757400 
+     0.05356600 
+     0.04000300 
+     0.02969000 
+     0.15250100 
+     0.16825099 
+     0.14693899 
+     0.15696600 
+     0.16950600 
+     0.18452799 
+     0.19650100 
+     0.24926500 
+     0.17634900 
+     0.19149600 
+     0.20876600 
+     0.18082500 
+     0.17760000 
+     0.16418700 
+     0.17190801 
+     0.16383100 
+     0.17871401 
+     0.54599398 
+     0.56316900 
+     0.62861699 
+     0.89820200 
+     0.21791700 
+     0.22253700 
+     0.00000000 
+     0.30873400 
+     1.21136999 
+     1.36593997 
+     1.18142998 
+     1.29804003 
+     0.01934300 
+     0.01849400 
+     0.02368800 
+     0.02280700 
+     0.00000000 
+     1.13545001 
+     1.23265004 
+     1.06303000 
+     1.14151001 
+     0.95766902 
+     0.00000000 
+     1.00501001 
+     0.31169099 
+     0.46407899 
+     0.60117400 
+     0.47632399 
+     1.37690997 
+     1.08551002 
+     0.20933700 
+     0.22608800 
+     0.19619800 
+     0.02272600 
+     0.03048400 
+     0.02680600 
+     0.02142300 
+     0.01733600 
+     0.42933601 
+     0.53555202 
+     0.00000000 
+     0.00000000 
+     1.09840000 
+     1.09291005 
+     0.97239000 
+     0.92524600 
+     1.20155001 
+     1.06733000 
+     1.05825996 
+     1.06996000 
+     1.02293003 
+     1.17958999 
+     1.40309000 
+     1.36172998 
+     0.96962202 
+     0.67801797 
+     1.35716999 
+     1.24431002 
+     0.03502800 
+     0.02884600 
+     0.02996000 
+     1.18868995 
+     1.34061003 
+     0.81156898 
+     0.80587900 
+     0.40239900 
+     1.19386995 
+     0.05277600 
+     0.08021300 
+     0.09060300 
+     0.09984700 
+     0.10892400 
+     0.04777700 
+     0.06813500 
+     0.05717000 
+     0.02781600 
+     0.03248600 
+     0.06958900 
+     0.04169400 
+     0.00000000 
+     0.04076900 
+     0.04238100 
+     0.04946400 
+     0.05559100 
+     0.03775900 
+     0.00000000 
+     0.03994700 
+     0.03132900 
+     0.03432600 
+     0.02654600 
+     0.06152900 
+     0.06521400 
+     0.06260600 
+     0.06755900 
+     0.07739700 
+     0.07959000 
+     0.09178900 
+     0.07922300 
+     0.10984700 
+     0.10672000 
+     0.09651800 
+     0.02597600 
+     0.02580100 
+     0.02898700 
+     0.03006200 
+     0.09056500 
+     0.15931100 
+     0.15407400 
+     0.13192099 
+     0.11587000 
+     0.11933700 
+     0.14230500 
+     0.14957500 
+     0.15883400 
+     0.14899801 
+     0.18400900 
+     0.20058100 
+     0.15087201 
+     0.12144200 
+     0.14517200 
+     0.17897201 
+     0.23168901 
+     0.20386700 
+     0.11998700 
+     0.10700100 
+     0.03155200 
+     0.15718500 
+     0.13353200 
+     0.11881400 
+     0.18313199 
+     0.13583700 
+     0.11682200 
+     0.09908900 
+     0.03098600 
+     0.11310500 
+     0.12778300 
+     0.13702200 
+     0.22973201 
+     0.27016300 
+     0.32758200 
+     0.29372901 
+     0.21869899 
+     0.17900001 
+     0.00000000 
+     0.02452400 
+     0.03866300 
+     0.03412400 
+     0.18191800 
+     0.18445900 
+     0.21240699 
+     0.18069801 
+     0.15685600 
+     0.14534700 
+     0.17984501 
+     0.17087799 
+     0.18106000 
+     0.19091600 
+     0.20715000 
+     0.24172600 
+     0.18480000 
+     0.18104900 
+     0.04430300 
+     0.06757500 
+     0.03673800 
+     0.16973101 
+     0.17116700 
+     0.16407900 
+     0.15372001 
+     0.17125700 
+     0.22815999 
+     0.29771799 
+     0.26417500 
+     0.35998601 
+     0.43518901 
+     0.42665499 
+     0.26912799 
+     0.22672300 
+     0.26570699 
+     0.05233200 
+     0.24127200 
+     0.89855802 
+     1.06603003 
+     0.00000000 
+     0.85711199 
+     0.82843000 
+     0.03994100 
+     0.03560500 
+     0.03038200 
+     0.00000000 
+     0.93744999 
+     1.03487003 
+     0.92380297 
+     1.00873995 
+     0.00000000 
+     0.53041703 
+     0.64352000 
+     0.43840599 
+     0.41414601 
+     0.38175401 
+     0.97300798 
+     0.24244700 
+     0.34503600 
+     0.24046101 
+     0.31340101 
+     0.15013300 
+     0.07644400 
+     0.08895900 
+     0.25360301 
+     0.31942800 
+     0.39257899 
+     0.00000000 
+     0.24263699 
+     0.45123401 
+     0.63935298 
+     0.98200297 
+     0.96400398 
+     0.93423301 
+     0.76298702 
+     0.88765299 
+     0.89337701 
+     0.12312100 
+     0.12417800 
+     0.10781200 
+     1.04335999 
+     1.30341995 
+     0.88199300 
+     1.10457003 
+     0.90233803 
+     0.38109201 
+     1.09644997 
+     0.89392000 
+     0.00000000 
+     0.05217400 
+     0.00000000 
+     0.11684600 
+     0.04477700 
+     0.05548900 
+     0.07583900 
+     0.05662400 
+     0.10193100 
+     0.06985000 
+     0.08571600 
+     0.11404800 
+     0.08032100 
+     0.09613300 
+     0.10777300 
+     0.08421100 
+     0.13961899 
+     0.10389500 
+     0.06886500 
+     0.07536400 
+     0.15332100 
+     0.18228300 
+     0.11126700 
+     0.08398200 
+     0.06807600 
+     0.06622900 
+     0.06534100 
+     0.06068300 
+     0.06393000 
+     0.04296100 
+     0.00000000 
+     0.06494200 
+     0.05209400 
+     0.06111100 
+     0.05339000 
+     0.08981200 
+     0.00000000 
+     0.08259400 
+     0.07522100 
+     0.08552900 
+     0.09176900 
+     0.08689900 
+     0.10476400 
+     0.09657000 
+     0.06410700 
+     0.12139200 
+     0.11005100 
+     0.11439200 
+     0.12067300 
+     0.10485300 
+     0.16543300 
+     0.16304100 
+     0.13391100 
+     0.06469600 
+     0.10946900 
+     0.09593500 
+     0.06298300 
+     0.14841101 
+     0.15926699 
+     0.19842499 
+     0.20692900 
+     0.20640600 
+     0.24510600 
+     0.18208501 
+     0.25226301 
+     0.23292901 
+     0.14266600 
+     0.12179400 
+     0.13769799 
+     0.17836200 
+     0.14238900 
+     0.18578400 
+     0.18991999 
+     0.13507301 
+     0.11788800 
+     0.12890300 
+     0.13815100 
+     0.22861300 
+     0.00000000 
+     0.21892700 
+     0.04874900 
+     0.07717200 
+     0.05410200 
+     0.26333401 
+     0.29330000 
+     0.21671100 
+     0.25960201 
+     0.20804900 
+     0.19655800 
+     0.17841101 
+     0.18742700 
+     0.14204100 
+     0.15528101 
+     0.14879701 
+     0.21363300 
+     0.18365499 
+     0.16810100 
+     0.18795700 
+     0.16130100 
+     0.17572600 
+     0.17951800 
+     0.11415500 
+     0.18912700 
+     0.15415600 
+     0.16242900 
+     0.16204099 
+     0.22169200 
+     0.23843201 
+     0.03791800 
+     0.04269600 
+     0.04445100 
+     0.21587899 
+     0.23397700 
+     0.23611601 
+     0.37448901 
+     0.30956399 
+     0.27192801 
+     0.23499900 
+     0.23570199 
+     0.26156101 
+     0.71541899 
+     0.91889101 
+     0.87095302 
+     0.85791099 
+     0.82698399 
+     0.74298298 
+     0.72812903 
+     0.00000000 
+     0.94351602 
+     0.03319200 
+     0.03479500 
+     0.62045503 
+     0.00000000 
+     0.75756001 
+     0.42214701 
+     0.29956400 
+     0.25891200 
+     0.47292200 
+     0.21601801 
+     0.31239799 
+     0.32298699 
+     0.00000000 
+     0.04429800 
+     0.04343300 
+     0.66894603 
+     0.32238799 
+     0.44474599 
+     0.30944800 
+     0.26334500 
+     0.43660900 
+     0.24162699 
+     0.47647801 
+     0.68454301 
+     0.66826200 
+     0.94529903 
+     0.03611500 
+     0.37577000 
+     0.83268201 
+     0.82626897 
+     1.03245997 
+     0.96547902 
+     0.80778003 
+     0.03118700 
+     0.12926300 
+     0.23795301 
+     0.23330800 
+     0.00000000 
+     0.07163600 
+     0.05354900 
+     0.05133200 
+     0.04751300 
+     0.04169500 
+     0.03824900 
+     0.05914900 
+     0.00000000 
+     0.12833700 
+     0.10982600 
+     0.11472400 
+     0.06028900 
+     0.09421400 
+     0.07748100 
+     0.06883300 
+     0.07509700 
+     0.08363400 
+     0.10555600 
+     0.08406100 
+     0.07740200 
+     0.12348500 
+     0.17103700 
+     0.10280700 
+     0.04381500 
+     0.03354100 
+     0.14036199 
+     0.09000000 
+     0.09445600 
+     0.09947600 
+     0.07916300 
+     0.07726000 
+     0.08410200 
+     0.11941200 
+     0.10827300 
+     0.06868200 
+     0.06337000 
+     0.06896400 
+     0.05180700 
+     0.05914000 
+     0.10167600 
+     0.09072200 
+     0.08149600 
+     0.06928000 
+     0.11123800 
+     0.00000000 
+     0.03596700 
+     0.03709500 
+     0.10920300 
+     0.11216900 
+     0.10438000 
+     0.10594900 
+     0.12437900 
+     0.12767801 
+     0.12245000 
+     0.13973300 
+     0.12220500 
+     0.11358700 
+     0.13461500 
+     0.14487199 
+     0.12663800 
+     0.14414001 
+     0.15315200 
+     0.13768999 
+     0.14763100 
+     0.12290100 
+     0.14030300 
+     0.15293100 
+     0.02311700 
+     0.01946100 
+     0.02324700 
+     0.17083301 
+     0.15877201 
+     0.20636500 
+     0.19938700 
+     0.21111700 
+     0.25090799 
+     0.23357099 
+     0.15350600 
+     0.16376700 
+     0.20245200 
+     0.18097299 
+     0.21805000 
+     0.13163200 
+     0.09751800 
+     0.08101600 
+     0.06837600 
+     0.13995600 
+     0.13258900 
+     0.13969900 
+     0.21368100 
+     0.00000000 
+     0.24448200 
+     0.21273500 
+     0.19721100 
+     0.21683300 
+     0.20816000 
+     0.23987700 
+     0.15559401 
+     0.20960200 
+     0.09493200 
+     0.10456000 
+     0.05761100 
+     0.06566000 
+     0.19406600 
+     0.19456200 
+     0.16780600 
+     0.18029700 
+     0.14274000 
+     0.14667100 
+     0.15397400 
+     0.15884399 
+     0.18191600 
+     0.18410701 
+     0.15766400 
+     0.16776900 
+     0.17762400 
+     0.16407301 
+     0.18447500 
+     0.17095201 
+     0.21240900 
+     0.23860300 
+     0.22760101 
+     0.22054200 
+     0.21603701 
+     0.01462400 
+     0.01395900 
+     0.01064600 
+     0.01525700 
+     0.20555200 
+     0.25701699 
+     0.24541000 
+     0.32414499 
+     0.24752200 
+     0.24087401 
+     0.30684200 
+     0.00000000 
+     0.71368498 
+     0.74492198 
+     0.66572201 
+     0.78116602 
+     0.67387003 
+     0.85261399 
+     0.71849102 
+     0.65173399 
+     0.68281800 
+     0.01484500 
+     0.01631400 
+     0.02100500 
+     0.71656197 
+     0.00000000 
+     0.75861299 
+     0.68286902 
+     0.29702500 
+     0.23525999 
+     0.33122301 
+     0.48239100 
+     0.28303701 
+     0.26808000 
+     0.40564099 
+     0.29156700 
+     0.01584200 
+     0.00000000 
+     0.48312700 
+     0.32120201 
+     0.48057699 
+     0.00000000 
+     0.02754200 
+     0.01828100 
+     0.00000000 
+     0.25784200 
+     0.32306701 
+     0.24753501 
+     0.21347700 
+     0.23763400 
+     0.14831699 
+     0.19505100 
+     0.18713100 
+     0.41479999 
+     0.66197401 
+     0.61906898 
+     0.28575000 
+     0.21557100 
+     0.18023901 
+     0.19260700 
+     0.01164400 
+     0.01682200 
+     0.02122700 
+     0.02331300 
+     0.17456600 
+     0.54121000 
+     0.69104201 
+     0.57990003 
+     0.00000000 
+     0.00000000 
+     0.27599001 
+     0.16919599 
+     0.06068100 
+     0.04837300 
+     0.06672200 
+     0.06377000 
+     0.16367900 
+     0.06743100 
+     0.06314400 
+     0.00000000 
+     0.10794900 
+     0.10908200 
+     0.10313000 
+     0.10096700 
+     0.04808400 
+     0.08567100 
+     0.07726900 
+     0.08892100 
+     0.07478300 
+     0.08695600 
+     0.07877800 
+     0.07042000 
+     0.12018600 
+     0.08901000 
+     0.02819800 
+     0.02436100 
+     0.08162800 
+     0.07396400 
+     0.09427100 
+     0.06324300 
+     0.13040601 
+     0.08301600 
+     0.13147900 
+     0.15009899 
+     0.10319400 
+     0.11749300 
+     0.10588200 
+     0.11776700 
+     0.11992300 
+     0.03328400 
+     0.13785900 
+     0.11348500 
+     0.13609900 
+     0.07854900 
+     0.09523000 
+     0.10748900 
+     0.09260700 
+     0.08211400 
+     0.10325300 
+     0.14456300 
+     0.00000000 
+     0.15474901 
+     0.03034600 
+     0.18580900 
+     0.14234801 
+     0.13404299 
+     0.06897700 
+     0.01723000 
+     0.02702400 
+     0.01802200 
+     0.18301800 
+     0.17888699 
+     0.19047099 
+     0.19592801 
+     0.15074299 
+     0.16078199 
+     0.15833800 
+     0.15246600 
+     0.12989099 
+     0.14910100 
+     0.15259901 
+     0.13940200 
+     0.14436300 
+     0.01705300 
+     0.00924800 
+     0.15821899 
+     0.13126500 
+     0.15153700 
+     0.14074101 
+     0.15080200 
+     0.13381900 
+     0.15144500 
+     0.19835800 
+     0.16395600 
+     0.18507600 
+     0.16617200 
+     0.14965899 
+     0.14057501 
+     0.02354300 
+     0.03250300 
+     0.13682801 
+     0.18092699 
+     0.19180700 
+     0.19814000 
+     0.19732501 
+     0.22439800 
+     0.27047101 
+     0.21562800 
+     0.27047601 
+     0.24951801 
+     0.00000000 
+     0.25952601 
+     0.18898199 
+     0.20315300 
+     0.04976500 
+     0.04273100 
+     0.16885300 
+     0.18779600 
+     0.15872300 
+     0.14682500 
+     0.25094801 
+     0.22464301 
+     0.20547900 
+     0.18129700 
+     0.19168100 
+     0.17432500 
+     0.20431000 
+     0.19472900 
+     0.02888400 
+     0.02179100 
+     0.01674000 
+     0.16111600 
+     0.14760999 
+     0.16328201 
+     0.16697399 
+     0.13845301 
+     0.17357600 
+     0.14582500 
+     0.13332100 
+     0.23766500 
+     0.22910900 
+     0.21645100 
+     0.12946400 
+     0.26031399 
+     0.24345000 
+     0.25435400 
+     0.02888400 
+     0.03266900 
+     0.03001800 
+     0.02523300 
+     0.33911800 
+     0.31321600 
+     0.34718600 
+     0.65148002 
+     0.71718502 
+     0.68298203 
+     0.58402997 
+     0.44349000 
+     0.51707703 
+     0.71997702 
+     0.00000000 
+     0.48827600 
+     0.21146400 
+     0.28400800 
+     0.30145699 
+     0.19354101 
+     0.26642701 
+     0.31879100 
+     0.36021799 
+     0.06509600 
+     0.07506900 
+     0.08082200 
+     0.07577500 
+     0.05032200 
+     0.13243400 
+     0.33194101 
+     0.03110700 
+     0.24362500 
+     0.24655700 
+     0.24679400 
+     0.20406500 
+     0.29139701 
+     0.30841199 
+     0.20239700 
+     0.03780000 
+     0.16613300 
+     0.23049000 
+     0.10879100 
+     0.25228301 
+     0.21114001 
+     0.37889901 
+     0.23501600 
+     0.12469400 
+     0.14912499 
+     0.06522700 
+     0.41541299 
+     0.30085099 
+     0.58697701 
+     0.50263101 
+     0.48912701 
+     0.03661500 
+     0.04118600 
+     0.61836702 
+     0.60945302 
+     0.53743702 
+     0.00000000 
+     0.27412501 
+     0.00000000 
+     0.30714700 
+     0.00000000 
+     0.12571500 
+     0.02752700 
+     0.04958000 
+     0.24232000 
+     0.22497000 
+     0.05797900 
+     0.24032199 
+     0.18432800 
+     0.12782100 
+     0.08560700 
+     0.07623400 
+     0.12737399 
+     0.04284900 
+     0.12309100 
+     0.08246700 
+     0.09855200 
+     0.07163000 
+     0.00000000 
+     0.08792600 
+     0.08101100 
+     0.07524800 
+     0.09566900 
+     0.10293700 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.01537900 
+     0.01526700 
+     0.09324700 
+     0.08525100 
+     0.09380400 
+     0.08034400 
+     0.06270400 
+     0.09519800 
+     0.10011600 
+     0.08066400 
+     0.07052900 
+     0.11728000 
+     0.06004800 
+     0.16471900 
+     0.16298600 
+     0.15497801 
+     0.23083000 
+     0.14495599 
+     0.11390000 
+     0.13756099 
+     0.19020900 
+     0.00998500 
+     0.11892500 
+     0.16808000 
+     0.14680000 
+     0.10913800 
+     0.10711000 
+     0.11003000 
+     0.01450000 
+     0.02166300 
+     0.14516100 
+     0.00000000 
+     0.17966001 
+     0.19386999 
+     0.17588700 
+     0.22242001 
+     0.18788400 
+     0.01506900 
+     0.08650500 
+     0.07869900 
+     0.07399000 
+     0.21797401 
+     0.02158500 
+     0.02494400 
+     0.02906000 
+     0.02414500 
+     0.02361100 
+     0.23480199 
+     0.29031000 
+     0.19745100 
+     0.20081200 
+     0.27808401 
+     0.25955600 
+     0.31320199 
+     0.25177601 
+     0.15876199 
+     0.20274700 
+     0.23660800 
+     0.18275900 
+     0.14952999 
+     0.24952200 
+     0.15285601 
+     0.15943199 
+     0.14626200 
+     0.14907201 
+     0.14121300 
+     0.21945700 
+     0.15090200 
+     0.19184300 
+     0.12443500 
+     0.14805600 
+     0.30695000 
+     0.12845300 
+     0.21990100 
+     0.00746600 
+     0.13657200 
+     0.14390400 
+     0.13772300 
+     0.31922901 
+     0.30956900 
+     0.03108800 
+     0.31577200 
+     0.37474501 
+     0.32176101 
+     0.00000000 
+     0.23339100 
+     0.31902900 
+     0.23312999 
+     0.03695100 
+     0.04272500 
+     0.03800700 
+     0.38200900 
+     0.28312600 
+     0.25549099 
+     0.24400900 
+     0.31445500 
+     0.29147401 
+     0.26777101 
+     0.28463799 
+     0.13608401 
+     0.11561400 
+     0.10584800 
+     0.12531701 
+     0.04844000 
+     0.13850300 
+     0.16587999 
+     0.02644200 
+     0.01798700 
+     0.15980400 
+     0.17314400 
+     0.17762700 
+     0.15679900 
+     0.24319300 
+     0.20711400 
+     0.24361800 
+     0.22203600 
+     0.22810400 
+     0.20134500 
+     0.03439100 
+     0.19904400 
+     0.17645800 
+     0.15980899 
+     0.15606600 
+     0.00000000 
+     0.02251200 
+     0.02972500 
+     0.15117700 
+     0.16340700 
+     0.14712401 
+     0.12826300 
+     0.16193500 
+     0.16580001 
+     0.24536100 
+     0.57590598 
+     0.45339301 
+     0.06831600 
+     0.22189300 
+     0.30243599 
+     0.56864399 
+     0.30698201 
+     0.00000000 
+     0.06817100 
+     0.04001800 
+     0.04572900 
+     0.00000000 
+     0.35731900 
+     0.27279800 
+     0.18082801 
+     0.10512300 
+     0.13049300 
+     0.06301400 
+     0.27290201 
+     0.28811100 
+     0.34611601 
+     0.15771000 
+     0.22701000 
+     0.20656700 
+     0.23749401 
+     0.28705901 
+     0.04769600 
+     0.19669300 
+     0.20209301 
+     0.10236900 
+     0.11358400 
+     0.22026500 
+     0.22043900 
+     0.16301000 
+     0.00000000 
+     0.00000000 
+     0.05566400 
+     0.28179801 
+     0.17933799 
+     0.29696000 
+     0.23615199 
+     0.36476699 
+     0.31929699 
+     0.49929300 
+     0.45538700 
+     0.65229702 
+     0.56545401 
+     0.00000000 
+     0.00000000 
+     0.08071200 
+     0.29577199 
+     0.26878199 
+     0.00000000 
+     0.32358101 
+     0.30686599 
+     0.31228900 
+     0.00000000 
+     0.41672701 
+     0.00000000 
+     0.13085701 
+     0.04015800 
+     0.09662700 
+     0.09382900 
+     0.04016600 
+     0.35047701 
+     0.04683400 
+     0.09153800 
+     0.05738200 
+     0.07476400 
+     0.07668000 
+     0.19682100 
+     0.22326800 
+     0.24368200 
+     0.27375501 
+     0.29770499 
+     0.26430699 
+     0.24906000 
+     0.24153300 
+     0.17203200 
+     0.35408199 
+     0.42577800 
+     0.00000000 
+     0.22876699 
+     0.10847800 
+     0.10410800 
+     0.04283000 
+     0.04684400 
+     0.04671700 
+     0.09697100 
+     0.08387600 
+     0.15206701 
+     0.13302700 
+     0.14295600 
+     0.12171600 
+     0.07760900 
+     0.09955000 
+     0.11711600 
+     0.12511800 
+     0.12352100 
+     0.10131400 
+     0.13107800 
+     0.12672400 
+     0.10165700 
+     0.03879500 
+     0.03314400 
+     0.09431000 
+     0.12347000 
+     0.21858600 
+     0.21148500 
+     0.27772701 
+     0.18346100 
+     0.16128901 
+     0.14847501 
+     0.15936700 
+     0.14504400 
+     0.14825800 
+     0.23245400 
+     0.03891800 
+     0.19329700 
+     0.20603500 
+     0.21563500 
+     0.00000000 
+     0.21064800 
+     0.21500000 
+     0.25093201 
+     0.16803800 
+     0.27195600 
+     0.15858901 
+     0.25174400 
+     0.20688500 
+     0.22998700 
+     0.29968899 
+     0.27342701 
+     0.00000000 
+     0.19690099 
+     0.10437200 
+     0.13503300 
+     0.14863899 
+     0.30110100 
+     0.33912000 
+     0.33624801 
+     0.18229000 
+     0.35663599 
+     0.26971900 
+     0.65671700 
+     1.37044001 
+     0.31959301 
+     0.31608900 
+     0.40423700 
+     0.41512099 
+     0.39705700 
+     0.08333500 
+     0.10220500 
+     0.20506100 
+     0.31219599 
+     0.47027001 
+     0.40459400 
+     0.20964999 
+     0.28482601 
+     0.19627000 
+     0.22188599 
+     0.20910400 
+     0.15750000 
+     0.15426600 
+     0.00000000 
+     0.00000000 
+     0.25870499 
+     0.33075500 
+     0.19786000 
+     0.20643400 
+     0.19878900 
+     0.22920001 
+     0.30660200 
+     0.14332899 
+     0.86358899 
+     0.51349002 
+     0.54978001 
+     1.06277001 
+     0.59337097 
+     0.32531700 
+     0.23942500 
+     0.85487902 
+     1.35859001 
+     0.00000000 
+     0.22406000 
+     0.39837399 
+     0.58926600 
+     0.18039800 
+     0.18183200 
+     0.29942399 
+     0.28652900 
+     0.27122501 
+     0.33778101 
+     0.36334601 
+     0.33267000 
+     0.42744699 
+     0.36695701 
+     0.19193199 
+     0.17091800 
+     0.17913499 
+     0.11523900 
+     0.09307100 
+     0.23929900 
+     0.29932499 
+     0.28256601 
+     0.24046400 
+     0.21474500 
+     0.20655701 
+     0.34058800 
+     0.28413200 
+     0.26343000 
+     0.24252801 
+     0.25921899 
+     0.21609800 
+     0.12331800 
+     0.13240200 
+     0.15546200 
+     0.07234000 
+     0.10511600 
+     0.20043200 
+     0.27899399 
+     0.37562799 
+     0.31691399 
+     0.00000000 
+     0.22622600 
+     0.09834000 
+     0.00000000 
+     0.38587099 
+     0.25625801 
+     0.39004800 
+     0.44811201 
+     0.20951000 
+     0.23642100 
+     0.26830101 
+     0.44369799 
+     0.33121201 
+     0.22923900 
+     0.27739701 
+     0.22585700 
+     0.23128501 
+     0.19107001 
+     0.20752500 
+     0.27709901 
+     0.05351900 
+     0.19040200 
+     0.31386101 
+     0.26557800 
+     0.30425599 
+     0.41278699 
+     0.15569800 
+     0.34784099 
+     0.17565601 
+     0.16536200 
+     0.22605000 
+     0.15342800 
+     0.09609900 
+     0.16360299 
+     0.17320199 
+     0.22286400 
+     0.31657699 
+     0.20445600 
+     0.17715500 
+     0.00000000 
+     0.13156000 
+     0.11363500 
+     0.40532801 
+     0.29778400 
+     0.27072501 
+     0.42810300 
+     0.42658201 
+     0.00000000 
+     0.00000000 
+     0.31701601 
+     0.30184999 
+     0.28100801 
+     0.00000000 
+     0.09350200 
+     0.08479500 
+     0.29749200 
+     0.32127899 
+     0.34957501 
+     0.35338199 
+     0.33130699 
+     0.42878899 
+     0.20619300 
+     0.46633101 
+     0.45998201 
+     0.48347101 
+     0.31250399 
+     0.05532000 
+     0.05778000 
+     0.05725600 
+     0.07536900 
+     0.00000000 
+     0.19890200 
+     0.18594500 
+     0.20397100 
+     0.20781900 
+     0.15093000 
+     0.12319500 
+     0.26244700 
+     0.17683700 
+     0.23055500 
+     0.14902100 
+     0.17517500 
+     0.38230699 
+     0.19203800 
+     0.18712500 
+     0.26397499 
+     0.19653700 
+     0.15483600 
+     0.27176899 
+     0.23158200 
+     0.05510600 
+     0.09705000 
+     0.06072700 
+     0.24024799 
+     0.38664299 
+     0.00000000 
+     0.47813699 
+     1.35854995 
+     1.00663996 
+     0.91559702 
+     0.86345202 
+     0.24896300 
+     0.76928598 
+     0.15250300 
+     0.14080100 
+     0.17847900 
+     0.21179900 
+     0.16891600 
+     0.15189300 
+     0.17484701 
+     0.14367300 
+     0.16012099 
+     0.21047200 
+     0.16313601 
+     0.26126000 
+     0.22231200 
+     0.22683001 
+     0.18265700 
+     0.29471600 
+     0.21827900 
+     0.19809200 
+     0.19536300 
+     0.19000900 
+     0.23874401 
+     0.37746701 
+     0.26173100 
+     0.20618699 
+     0.21575700 
+     0.40011901 
+     0.05727200 
+     0.03622300 
+     0.06074500 
+     0.06025900 
+     0.04627900 
+     0.30859101 
+     0.26221001 
+     0.23950200 
+     0.16324100 
+     0.00000000 
+     0.14457200 
+     0.18442500 
+     0.21693601 
+     0.23678499 
+     0.25672901 
+     0.41979700 
+     0.37460199 
+     0.37762499 
+     0.86214799 
+     0.55892199 
+     0.27952000 
+     1.05245996 
+     0.00000000 
+     0.13129801 
+     0.48394400 
+     0.37873501 
+     0.45560101 
+     0.14327200 
+     0.00000000 
+     0.07312400 
+     0.07129000 
+     0.06381700 
+     0.06798000 
+     0.13601400 
+     0.21628401 
+     0.53596997 
+     0.19503300 
+     0.24820600 
+     0.31772199 
+     1.29732001 
+     0.60720098 
+     1.35860002 
+     1.37044001 
+     0.48353201 
+     0.83559000 
+     0.15891699 
+     0.18165199 
+     0.54826599 
+     0.00000000 
+     0.12833799 
+     0.00000000 
+     0.74289000 
+     0.73814201 
+     0.56754303 
+     0.46093300 
+     0.87746698 
+     0.12552400 
+     0.37395000 
+     0.92330098 
+     0.08602400 
+     0.08342000 
+     0.55672300 
+     0.34868699 
+     0.37713501 
+     0.34298801 
+     0.42100799 
+     0.30722499 
+     0.12727800 
+     0.16344000 
+     0.66746497 
+     0.21356100 
+     0.41410401 
+     0.46096000 
+     0.03675000 
+     0.04017000 
+     0.45760301 
+     0.35098600 
+     0.36499700 
+     0.41559201 
+     0.38812301 
+     0.20419700 
+     0.36254901 
+     0.31725299 
+     0.60399902 
+     0.56255603 
+     0.38334799 
+     0.04791400 
+     0.04742800 
+     0.36839399 
+     0.20408501 
+     0.36484501 
+     0.77354002 
+     0.55404902 
+     1.35859001 
+     0.86358899 
+     0.37537599 
+     0.28054100 
+     0.79320800 
+     0.00000000 
+     0.10398800 
+     1.29732001 
+     0.42726001 
+     0.61563802 
+     0.26809099 
+     0.24618000 
+     0.04853500 
+     0.04926800 
+     0.36897600 
+     0.36651099 
+     0.22478899 
+     0.44049901 
+     0.00000000 
+     0.00000000 
+     0.39417899 
+     0.25690800 
+     0.41674301 
+     0.33978200 
+     0.41774800 
+     0.38116899 
+     0.05130300 
+     0.03826900 
+     0.04388900 
+     0.04574500 
+     0.05475100 
+     0.05211000 
+     0.04413000 
+     0.05002900 
+     0.44148201 
+     0.00000000 
+     0.32861301 
+     1.37044001 
+     0.00000000 
+     0.29723299 
+     0.35577199 
+     0.00000000 
+     0.38821200 
+     0.24582300 
+     0.29643300 
+     0.32772201 
+     0.13512599 
+     0.22821900 
+     0.22965500 
+     0.24702200 
+     0.18289700 
+     0.22953500 
+     0.15669499 
+     0.21710700 
+     0.24125400 
+     0.24573000 
+     0.23183300 
+     0.32497400 
+     0.34248599 
+     0.42701799 
+     0.44674501 
+     0.39181599 
+     0.39698499 
+     0.37484899 
+     0.39742199 
+     0.37990901 
+     0.00000000 
+     0.29554901 
+     0.00000000 
+     0.28262401 
+     0.34099701 
+     0.28044900 
+     0.03226300 
+     0.03215900 
+     0.03463500 
+     0.00000000 
+     0.22771101 
+     0.00000000 
+     0.36094701 
+     0.41182101 
+     0.57807499 
+     0.49608901 
+     0.43331701 
+     0.34001100 
+     0.25982800 
+     0.29437900 
+     0.30715999 
+     1.35857999 
+     0.00000000 
+     0.34219700 
+     0.26895699 
+     0.27549100 
+     0.26057100 
+     0.00000000 
+     0.05842700 
+     0.04444900 
+     0.30374801 
+     0.27769801 
+     0.38176799 
+     0.28451100 
+     0.32093799 
+     0.31966799 
+     0.28400600 
+     0.28189600 
+     0.27389500 
+     0.24663500 
+     0.26790699 
+     0.27817300 
+     0.00000000 
+     0.00000000 
+     0.28332999 
+     0.28549400 
+     0.04765500 
+     0.45168200 
+     0.16859899 
+     0.74141902 
+     0.00000000 
+     0.34293801 
+     0.00000000 
+     0.17306300 
+     0.21035500 
+     0.03015000 
+     0.02346800 
+     0.24711700 
+     1.29732001 
+     1.37044001 
+     0.44804499 
+     0.94336301 
+     0.61121899 
+     0.83563900 
+     0.22982100 
+     0.85479200 
+     0.00000000 
+     0.58898300 
+     0.05318000 
+     0.19550100 
+     0.22542700 
+     0.28662601 
+     0.26130101 
+     0.29548800 
+     0.28077599 
+     0.21465200 
+     0.19010299 
+     0.26144600 
+     0.09567400 
+     0.29114300 
+     0.27110401 
+     0.03648900 
+     0.28095901 
+     0.24038300 
+     0.28654799 
+     0.30983499 
+     0.23810899 
+     0.49993601 
+     0.30809399 
+     0.21485400 
+     0.15799899 
+     0.30688301 
+     0.05993100 
+     0.21145999 
+     0.16546001 
+     0.24591100 
+     0.26588601 
+     0.16186599 
+     0.13431300 
+     0.09865500 
+     0.09449800 
+     0.00000000 
+     0.09592900 
+     0.11941200 
+     0.25224599 
+     0.25089100 
+     0.00000000 
+     0.00000000 
+     0.28582200 
+     0.34259999 
+     0.32794100 
+     0.24267600 
+     0.15934500 
+     0.06321900 
+     0.09230700 
+     0.08167600 
+     0.20945700 
+     0.08253200 
+     0.16434699 
+     0.09133600 
+     0.15844101 
+     0.25354099 
+     0.48586500 
+     0.64671600 
+     0.44657201 
+     0.42606500 
+     0.37147599 
+     0.35247099 
+     0.00000000 
+     0.40555400 
+     0.50337100 
+     0.86579502 
+     0.64878201 
+     0.85485297 
+     0.86351198 
+     0.00000000 
+     0.94543499 
+     0.06530900 
+     0.07110900 
+     0.00000000 
+     0.19228700 
+     0.00000000 
+     0.87313598 
+     0.92455798 
+     0.64979500 
+     0.07071600 
+     0.16991800 
+     0.10689100 
+     0.06629500 
+     0.23091100 
+     0.15601100 
+     0.18975000 
+     0.01218600 
+     0.00711100 
+     0.00556500 
+     0.56842399 
+     0.15010500 
+     0.35805500 
+     0.34389400 
+     0.72086197 
+     0.65972900 
+     0.56223297 
+     0.58088499 
+     0.74445403 
+     0.44978300 
+     0.33756700 
+     0.42936999 
+     0.56691200 
+     0.01034700 
+     0.00995900 
+     0.48802400 
+     0.41750601 
+     0.50313503 
+     0.50301200 
+     0.49693000 
+     0.58353502 
+     0.64367402 
+     0.49766901 
+     0.58440602 
+     0.58090198 
+     0.01048500 
+     0.00552500 
+     0.35223401 
+     0.96376699 
+     0.37989900 
+     1.35860002 
+     1.29730999 
+     0.57272100 
+     0.96559602 
+     0.85487902 
+     0.00000000 
+     0.83559000 
+     0.85484999 
+     0.55692399 
+     0.23957799 
+     0.00925200 
+     0.01534300 
+     1.35860002 
+     1.03658998 
+     0.55304003 
+     0.35132301 
+     0.24558400 
+     0.25244799 
+     0.26727399 
+     0.46460599 
+     0.43112701 
+     0.44259399 
+     0.00000000 
+     0.40769899 
+     0.65832299 
+     0.00541500 
+     0.01061200 
+     0.00775700 
+     0.80739802 
+     0.78198802 
+     0.86351198 
+     0.86346000 
+     0.43287301 
+     0.13120700 
+     0.14594699 
+     0.10586400 
+     0.28702399 
+     0.42060900 
+     0.21209501 
+     0.44277000 
+     0.21743700 
+     0.43741700 
+     0.39167601 
+     0.00000000 
+     0.02036400 
+     0.01321300 
+     0.01627100 
+     0.22447200 
+     0.41035300 
+     0.38106599 
+     0.34532800 
+     0.35906300 
+     0.41974899 
+     0.45514899 
+     0.39566001 
+     0.39206800 
+     0.43189201 
+     0.00000000 
+     0.56072700 
+     1.02363002 
+     0.82292700 
+     0.70116597 
+     0.25629401 
+     0.26128700 
+     0.25034600 
+     0.25070900 
+     0.00000000 
+     0.02363600 
+     0.01670300 
+     0.01790200 
+     0.01789400 
+     0.00000000 
+     0.20230100 
+     0.24269900 
+     0.33701000 
+     0.27795801 
+     0.42940700 
+     0.44465500 
+     0.25266799 
+     0.73066401 
+     0.71375197 
+     0.82558399 
+     0.22517000 
+     0.22059500 
+     0.25760901 
+     0.25677601 
+     0.85482001 
+     0.43383801 
+     0.30522999 
+     0.42504600 
+     0.04715900 
+     0.04476900 
+     0.04071200 
+     0.31647801 
+     0.27126300 
+     0.00000000 
+     0.31805000 
+     0.33074701 
+     0.33598101 
+     0.37850699 
+     0.30118400 
+     0.25613099 
+     0.08575000 
+     0.07052500 
+     0.14521700 
+     0.25713101 
+     0.21615499 
+     0.33505699 
+     0.11802600 
+     0.54514003 
+     1.35857999 
+     0.17963700 
+     0.02499100 
+     0.01992600 
+     0.45941600 
+     0.57118100 
+     0.86232603 
+     0.05916200 
+     0.56795901 
+     0.40043101 
+     0.86353099 
+     0.97143197 
+     0.35147199 
+     0.83559000 
+     0.85487902 
+     0.86352003 
+     0.02288500 
+     0.71014798 
+     0.86247897 
+     0.18352699 
+     0.20308501 
+     0.00000000 
+     0.00000000 
+     0.28897199 
+     0.13675000 
+     0.01861900 
+     0.03258900 
+     0.11860800 
+     0.25363001 
+     0.28679800 
+     0.30045399 
+     0.23881900 
+     0.32888699 
+     0.27431500 
+     0.16274400 
+     0.31299099 
+     0.22596499 
+     0.15571600 
+     0.14203200 
+     0.03894700 
+     0.02189800 
+     0.02753300 
+     0.02990900 
+     0.02686300 
+     0.03319700 
+     0.02183100 
+     0.07083700 
+     0.09906900 
+     0.12298800 
+     0.04656100 
+     0.06171900 
+     0.18694000 
+     0.20776300 
+     0.14565501 
+     0.28369501 
+     0.07182800 
+     0.09301000 
+     0.08871200 
+     0.05313500 
+     0.05270400 
+     0.11177000 
+     0.14724600 
+     0.03665900 
+     0.02637000 
+     0.08229300 
+     0.00000000 
+     0.05179800 
+     0.04703900 
+     0.03892600 
+     0.02565500 
+     0.20693401 
+     0.85484803 
+     0.83559000 
+     0.31136301 
+     0.00000000 
+     0.01576000 
+     0.24479300 
+     0.14643200 
+     0.09276900 
+     0.10444100 
+     0.27587801 
+     0.04016500 
+     0.05690200 
+     0.55397499 
+     0.60204899 
+     0.58329999 
+     0.32374200 
+     0.41304001 
+     0.34018299 
+     0.25045601 
+     0.00764400 
+     0.02496000 
+     0.01451000 
+     0.38392201 
+     0.14750700 
+     0.02748500 
+     0.03127800 
+     0.12844101 
+     0.12053200 
+     0.17121100 
+     0.54372603 
+     0.07047000 
+     0.90312999 
+     0.54454499 
+     0.22202700 
+     0.20060700 
+     0.17351100 
+     0.09072300 
+     0.10151800 
+     0.08822400 
+     0.04484600 
+     0.00225600 
+     0.00713400 
+     0.54215401 
+     0.20690900 
+     0.15009999 
+     0.29738200 
+     0.14626700 
+     0.21157600 
+     0.22466201 
+     0.47434601 
+     0.33768201 
+     0.69169497 
+     0.39616600 
+     0.50872302 
+     0.03733200 
+     0.02490900 
+     0.29324299 
+     0.26811400 
+     0.32558700 
+     0.35172701 
+     0.44324800 
+     0.22865500 
+     0.12608700 
+     0.28752401 
+     0.22602800 
+     0.13434000 
+     0.74971598 
+     0.04839100 
+     0.86199802 
+     0.67523301 
+     0.31811199 
+     1.03643000 
+     0.35258600 
+     0.06340200 
+     0.04611400 
+     0.22404601 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.94793499 
+     0.57704502 
+     0.66098398 
+     0.24703600 
+     0.26927400 
+     0.58358699 
+     0.43151799 
+     0.03690000 
+     0.02531600 
+     0.03038600 
+     0.19843200 
+     0.49943599 
+     0.68847400 
+     0.27838099 
+     0.00000000 
+     0.41580701 
+     0.41773999 
+     0.39285499 
+     0.45291299 
+     0.50643998 
+     0.56429303 
+     0.92080098 
+     0.76427698 
+     0.01593200 
+     0.17605500 
+     0.00000000 
+     0.00000000 
+     0.22769301 
+     0.78410000 
+     0.42252901 
+     0.33907399 
+     0.48285401 
+     0.03449500 
+     0.56086302 
+     0.46223801 
+     0.41396499 
+     0.27307701 
+     0.24085701 
+     0.24643300 
+     0.24333200 
+     0.24786900 
+     0.38001901 
+     0.42423201 
+     0.01710900 
+     0.04130600 
+     0.45999199 
+     0.35818699 
+     0.31155601 
+     0.42873400 
+     0.00000000 
+     0.43524799 
+     0.48016599 
+     0.53754503 
+     0.65022999 
+     0.52484500 
+     0.44515300 
+     0.19253200 
+     0.00000000 
+     0.00000000 
+     0.12729301 
+     0.12273700 
+     0.05655100 
+     0.06135600 
+     0.06252900 
+     0.03541000 
+     0.03892200 
+     0.06926200 
+     0.17719200 
+     0.18233700 
+     0.08308300 
+     0.16316301 
+     0.28058600 
+     0.32253501 
+     0.08147900 
+     0.15423401 
+     0.33904800 
+     0.42161801 
+     0.42193601 
+     0.00000000 
+     0.00000000 
+     0.15872800 
+     0.14431700 
+     0.12664600 
+     0.17436001 
+     0.00000000 
+     0.00000000 
+     0.37125301 
+     0.00000000 
+     0.25798899 
+     0.14074001 
+     0.35466501 
+     0.26687399 
+     0.29600400 
+     0.39016500 
+     0.51901501 
+     0.43489301 
+     0.39853299 
+     0.94166702 
+     0.64283001 
+     0.97798198 
+     0.63852602 
+     0.37224001 
+     0.57275897 
+     0.72209102 
+     0.36496601 
+     0.39768901 
+     0.04793000 
+     0.06699100 
+     0.03208700 
+     0.13934800 
+     0.18686700 
+     0.10810800 
+     0.20485000 
+     0.95930803 
+     0.00000000 
+     0.00000000 
+     0.39788601 
+     0.75676000 
+     0.00000000 
+     0.00000000 
+     0.19290601 
+     0.20524700 
+     0.12931700 
+     0.25163901 
+     0.01705600 
+     0.03867100 
+     0.07816100 
+     0.08751700 
+     0.14030500 
+     0.07494200 
+     0.22708400 
+     0.18862499 
+     0.16239201 
+     0.06391000 
+     0.03849800 
+     0.02480700 
+     0.00000000 
+     0.15270001 
+     0.02646500 
+     0.02172400 
+     0.03183900 
+     0.05042700 
+     0.04228400 
+     0.03260600 
+     0.00000000 
+     0.00000000 
+     0.02359500 
+     0.10058600 
+     0.08691200 
+     0.02864100 
+     0.00917900 
+     0.06024100 
+     0.03067200 
+     0.05967300 
+     0.03509500 
+     0.02523300 
+     0.07210100 
+     0.06880500 
+     0.03421300 
+     0.03312000 
+     0.02586000 
+     0.02233800 
+     0.07015800 
+     0.03637600 
+     0.00835300 
+     0.01375100 
+     0.02868900 
+     0.01842900 
+     0.01947400 
+     0.00738200 
+     0.01287800 
+     0.00183400 
+     0.00252600 
+     0.00000000 
+     0.80778402 
+     0.00000000 
+     0.21652800 
+     0.15691800 
+     0.39739299 
+     0.06915500 
+     0.03169300 
+     0.01301000 
+     0.04176500 
+     0.02033200 
+     0.22263400 
+     0.05923200 
+     0.33346400 
+     0.00000000 
+     0.00000000 
+     0.07418600 
+     0.10077300 
+     0.22465700 
+     0.15846001 
+     0.02102200 
+     0.08252700 
+     0.19381700 
+     0.05728700 
+     0.06254600 
+     0.02038400 
+     0.01735800 
+     0.09572100 
+     0.05604500 
+     0.05983500 
+     0.08775200 
+     0.11962700 
+     0.15028200 
+     0.16558500 
+     0.13314199 
+     0.09239700 
+     0.10144100 
+     0.00000000 
+     0.23278500 
+     0.12315800 
+     0.11254500 
+     0.29565901 
+     0.21734001 
+     0.07665200 
+     0.10097300 
+     0.08784300 
+     0.11070000 
+     0.03234900 
+     0.01898400 
+     0.03417600 
+     0.02560000 
+     0.07272700 
+     0.16985901 
+     0.07774500 
+     0.19921200 
+     0.11342800 
+     0.22242901 
+     0.14402901 
+     0.10190100 
+     0.11538700 
+     0.13521400 
+     0.06782400 
+     0.13049300 
+     0.12824801 
+     0.52609903 
+     0.21864600 
+     0.39940101 
+     0.00736800 
+     0.03408600 
+     0.02093300 
+     0.53029799 
+     0.31977600 
+     0.08462600 
+     0.20525400 
+     0.11561300 
+     0.04434700 
+     0.05554400 
+     0.12023000 
+     0.17366500 
+     0.24912100 
+     0.12639900 
+     0.07944300 
+     0.11550300 
+     0.16493499 
+     0.16532600 
+     0.48642600 
+     0.46384501 
+     0.42526799 
+     0.53765500 
+     0.56749398 
+     0.57421702 
+     0.00000000 
+     0.02368600 
+     0.15153800 
+     0.16805200 
+     0.19014300 
+     0.38547400 
+     0.47775099 
+     0.19853400 
+     0.18014000 
+     0.09773400 
+     0.17319800 
+     0.31488100 
+     0.24619000 
+     0.43609101 
+     0.25756401 
+     0.31163201 
+     0.13478500 
+     0.05433900 
+     0.04559500 
+     0.05202000 
+     0.23732600 
+     0.18778600 
+     0.18025900 
+     0.20131700 
+     0.20148100 
+     0.33227801 
+     0.30632699 
+     0.28277400 
+     0.30890399 
+     0.21129800 
+     0.27075499 
+     0.11595000 
+     0.00000000 
+     0.00000000 
+     0.15142900 
+     0.00000000 
+     0.11985300 
+     0.11797400 
+     0.04413400 
+     0.05177000 
+     0.06764700 
+     0.06504000 
+     0.09332700 
+     0.15702400 
+     0.13018499 
+     0.09792300 
+     0.21833999 
+     0.09491900 
+     0.12304300 
+     0.00000000 
+     0.06632900 
+     0.00000000 
+     0.09903300 
+     0.13729300 
+     0.10894500 
+     0.00000000 
+     0.07778800 
+     0.06265800 
+     0.08391700 
+     0.07291400 
+     0.10127500 
+     0.09171300 
+     0.07172100 
+     0.05872000 
+     0.04832500 
+     0.03979600 
+     0.00000000 
+     0.00000000 
+     0.00000000 
+     0.15060700 
+     0.27325499 
+     0.08348500 
+     0.20811599 
+     0.18646100 
+     0.15241900 
+     0.27395999 
+     0.26457199 
+     0.17314801 
+     0.39397100 
+     0.39349601 
+     0.05094500 
+     0.16504100 
+     0.38932800 
+     0.26197100 
+     0.21029299 
+     0.29726699 
+     0.28741401 
+     0.16453500 
+     0.05906100 
+     0.03225100 
+     0.05798500 
+     0.08192100 
+     0.02856700 
+     0.06865800 
+     0.20006800 
+     0.16473800 
+     0.08622400 
+     0.20992400 
+     0.16740599 
+     0.14016201 
+     0.05533500 
+     0.01221700 
+     0.00000000 
+     0.06879300 
+     0.03949600 
+     0.04901700 
+     0.06971600 
+     0.10704600 
+     0.06191000 
+     0.04360100 
+     0.06916400 
+     0.05212500 
+     0.06624100 
+     0.09102000 
+     0.00466000 
+     0.00000000 
+     0.02621200 
+     0.05196000 
+     0.01484800 
+     0.00594400 
+     0.01107400 
+     0.00749700 
+     0.00000000 
+     0.01368800 
+     0.01202600 
+     0.02142100 
+     0.03475200 
+     0.04987900 
+     0.02236400 
+     0.02202000 
+     0.03528600 
+     0.01742100 
+     0.07877200 
+     0.02324500 
+     0.00000000 
+     0.01835700 
+     0.00000000 
+     0.02361400 
+     0.02196100 
+     0.02538600 
+     0.01989700 
+     0.06365400 
+     0.00928100 
+     0.01344500 
+     0.01591500 
+     0.01497400 
+     0.02848100 
+     0.01760700 
+     0.01594300 
+     0.03250600 
+     0.01460000 
+     0.02631700 
+     0.12343600 
+     0.10839900 
+     0.01054100 
+     0.00848600 
+     0.00589800 
+     0.00819000 
+     0.00322700 
+     0.00576800 
+     0.00350600 
+     0.00876300 
+     0.00000000 
+     0.00482800 
+     0.04673200 
+     0.00000000 
+     0.00372000 
+     0.00000000 
+     0.00000000 
+     0.07834300 
+     0.15366501 
+     0.07131000 
+     0.05778300 
+     0.04590500 
+     0.13110501 
+     0.05877900 
+     0.06047800 
+     0.19481100 
+     0.31347901 
+     0.26293299 
+     0.02905200 
+     0.03903800 
+     0.04055800 
+     0.05727500 
+     0.05532100 
+     0.04946200 
+     0.05960300 
+     0.06615900 
+     0.01060600 
+     0.02595200 
+     0.04970800 
+     0.04246200 
+     0.04179300 
+     0.07244600 
+     0.07363200 
+     0.06737800 
+     0.06782100 
+     0.08875000 
+     0.04252600 
+     0.02711000 
+     0.02913600 
+     0.04908800 
+     0.09370200 
+     0.07858700 
+     0.08674600 
+     0.05410800 
+     0.05518300 
+     0.06380900 
+     0.04977200 
+     0.05326800 
+     0.07059100 
+     0.06846400 
+     0.07390500 
+     0.08034700 
+     0.06858200 
+     0.06723800 
+     0.06406000 
+     0.04872700 
+     0.04752400 
+     0.11136500 
+     0.06177500 
+     0.00000000 
+     0.07641100 
+     0.06729700 
+     0.06709100 
+     0.06156000 
+     0.04726500 
+     0.03489200 
+     0.24052300 
+     0.31338701 
+     0.31842399 
+     0.04019500 
+     0.05682100 
+     0.05898900 
+     0.03931500 
+     0.06926000 
+     0.07415400 
+     0.05000700 
+     0.05937200 
+     0.29083601 
+     0.04740000 
+     0.05641400 
+     0.07082600 
+     0.05988300 
+     0.09249900 
+     0.10283500 
+     0.06389800 
+     0.04739600 
+     0.04043800 
+     0.19317600 
+     0.12293700 
+     0.14390700 
+     0.32123399 
+     0.24130499 
+     0.41346899 
+     0.13833700 
+     0.13406800 
+     0.13076100 
+     0.16554600 
+     0.19841200 
+     0.18723901 
+     0.11626900 
+     0.12135300 
+     0.26881501 
+     0.18777999 
+     0.23978101 
+     0.21885601 
+     0.29000100 
+     0.33058801 
+     0.09880700 
+     0.12342000 
+     0.13781700 
diff --git a/data/torus.vtk b/data/torus.vtk
new file mode 100755
index 0000000..20970ca
--- /dev/null
+++ b/data/torus.vtk
@@ -0,0 +1,22046 @@
+# vtk DataFile Version 3.0
+off file: torus.off
+ASCII
+DATASET UNSTRUCTURED_GRID
+
+POINTS 1800 float
+     3.59999990      0.00000000      0.00000000
+     3.57815003      0.00000000      0.20791000
+     3.51355004      0.00000000      0.40674001
+     3.40901995      0.00000000      0.58779001
+     3.26912999      0.00000000      0.74313998
+     3.09999990      0.00000000      0.86602998
+     2.90901995      0.00000000      0.95106000
+     2.70453000      0.00000000      0.99452001
+     2.49547005      0.00000000      0.99452001
+     2.29098010      0.00000000      0.95106000
+     2.09999990      0.00000000      0.86602998
+     1.93087006      0.00000000      0.74313998
+     1.79097998      0.00000000      0.58779001
+     1.68645000      0.00000000      0.40674001
+     1.62185001      0.00000000      0.20791000
+     1.60000002      0.00000000     -0.00000000
+     1.62185001      0.00000000     -0.20791000
+     1.68645000      0.00000000     -0.40674001
+     1.79097998      0.00000000     -0.58779001
+     1.93087006      0.00000000     -0.74313998
+     2.09999990      0.00000000     -0.86602998
+     2.29098010      0.00000000     -0.95106000
+     2.49547005      0.00000000     -0.99452001
+     2.70453000      0.00000000     -0.99452001
+     2.90901995      0.00000000     -0.95106000
+     3.09999990      0.00000000     -0.86602998
+     3.26912999      0.00000000     -0.74313998
+     3.40901995      0.00000000     -0.58778000
+     3.51355004      0.00000000     -0.40674001
+     3.57815003      0.00000000     -0.20791000
+     3.52133012      0.74848002      0.00000000
+     3.49995995      0.74394000      0.20791000
+     3.43676996      0.73051000      0.40674001
+     3.33452010      0.70876998      0.58779001
+     3.19769001      0.67969000      0.74313998
+     3.03225994      0.64453000      0.86602998
+     2.84544992      0.60482001      0.95106000
+     2.64543009      0.56230003      0.99452001
+     2.44093990      0.51884001      0.99452001
+     2.24092007      0.47632000      0.95106000
+     2.05411005      0.43661001      0.86602998
+     1.88867998      0.40145001      0.74313998
+     1.75185001      0.37237000      0.58779001
+     1.64960003      0.35062999      0.40674001
+     1.58641005      0.33719999      0.20791000
+     1.56503999      0.33265999     -0.00000000
+     1.58641005      0.33719999     -0.20791000
+     1.64960003      0.35062999     -0.40674001
+     1.75185001      0.37237000     -0.58779001
+     1.88867998      0.40145001     -0.74313998
+     2.05411005      0.43661001     -0.86602998
+     2.24092007      0.47632000     -0.95106000
+     2.44093990      0.51884001     -0.99452001
+     2.64543009      0.56230003     -0.99452001
+     2.84544992      0.60482001     -0.95106000
+     3.03225994      0.64453000     -0.86602998
+     3.19769001      0.67969000     -0.74313998
+     3.33452010      0.70876998     -0.58778000
+     3.43676996      0.73051000     -0.40674001
+     3.49995995      0.74394000     -0.20791000
+     3.28875995      1.46424997      0.00000000
+     3.26880002      1.45536005      0.20791000
+     3.20977998      1.42909002      0.40674001
+     3.11429000      1.38656998      0.58779001
+     2.98650002      1.32967997      0.74313998
+     2.83199000      1.26087999      0.86602998
+     2.65752006      1.18320000      0.95106000
+     2.47071004      1.10002995      0.99452001
+     2.27973008      1.01499999      0.99452001
+     2.09292006      0.93182999      0.95106000
+     1.91845000      0.85415000      0.86602998
+     1.76393998      0.78535998      0.74313998
+     1.63613999      0.72846001      0.58779001
+     1.54065001      0.68594003      0.40674001
+     1.48163998      0.65967000      0.20791000
+     1.46167004      0.65078002     -0.00000000
+     1.48163998      0.65967000     -0.20791000
+     1.54065001      0.68594003     -0.40674001
+     1.63613999      0.72846001     -0.58779001
+     1.76393998      0.78535998     -0.74313998
+     1.91845000      0.85415000     -0.86602998
+     2.09292006      0.93182999     -0.95106000
+     2.27973008      1.01499999     -0.99452001
+     2.47071004      1.10002995     -0.99452001
+     2.65752006      1.18320000     -0.95106000
+     2.83199000      1.26087999     -0.86602998
+     2.98650002      1.32967997     -0.74313998
+     3.11429000      1.38656998     -0.58778000
+     3.20977998      1.42909002     -0.40674001
+     3.26880002      1.45536005     -0.20791000
+     2.91246009      2.11602998      0.00000000
+     2.89477992      2.10317993      0.20791000
+     2.84252000      2.06521010      0.40674001
+     2.75795007      2.00377011      0.58779001
+     2.64477992      1.92155004      0.74313998
+     2.50795007      1.82212996      0.86602998
+     2.35344005      1.70987999      0.95106000
+     2.18800998      1.58967996      0.99452001
+     2.01887989      1.46679997      0.99452001
+     1.85344005      1.34660995      0.95106000
+     1.69894004      1.23434997      0.86602998
+     1.56210995      1.13494003      0.74313998
+     1.44894004      1.05271006      0.58779001
+     1.36436999      0.99127001      0.40674001
+     1.31210995      0.95330000      0.20791000
+     1.29443002      0.94046003     -0.00000000
+     1.31210995      0.95330000     -0.20791000
+     1.36436999      0.99127001     -0.40674001
+     1.44894004      1.05271006     -0.58779001
+     1.56210995      1.13494003     -0.74313998
+     1.69894004      1.23434997     -0.86602998
+     1.85344005      1.34660995     -0.95106000
+     2.01887989      1.46679997     -0.99452001
+     2.18800998      1.58967996     -0.99452001
+     2.35344005      1.70987999     -0.95106000
+     2.50795007      1.82212996     -0.86602998
+     2.64477992      1.92155004     -0.74313998
+     2.75795007      2.00377011     -0.58778000
+     2.84252000      2.06521010     -0.40674001
+     2.89477992      2.10317993     -0.20791000
+     2.40886998      2.67531991      0.00000000
+     2.39424992      2.65908003      0.20791000
+     2.35102010      2.61106992      0.40674001
+     2.28108001      2.53339005      0.58779001
+     2.18747997      2.42944002      0.74313998
+     2.07430005      2.30375004      0.86602998
+     1.94650996      2.16181993      0.95106000
+     1.80967999      2.00986004      0.99452001
+     1.66980004      1.85450006      0.99452001
+     1.53296995      1.70253003      0.95106000
+     1.40516996      1.56060004      0.86602998
+     1.29200006      1.43491995      0.74313998
+     1.19840002      1.33096004      0.58779001
+     1.12846005      1.25328004      0.40674001
+     1.08522999      1.20527005      0.20791000
+     1.07061005      1.18903005     -0.00000000
+     1.08522999      1.20527005     -0.20791000
+     1.12846005      1.25328004     -0.40674001
+     1.19840002      1.33096004     -0.58779001
+     1.29200006      1.43491995     -0.74313998
+     1.40516996      1.56060004     -0.86602998
+     1.53296995      1.70253003     -0.95106000
+     1.66980004      1.85450006     -0.99452001
+     1.80967999      2.00986004     -0.99452001
+     1.94650996      2.16181993     -0.95106000
+     2.07430005      2.30375004     -0.86602998
+     2.18747997      2.42944002     -0.74313998
+     2.28108001      2.53339005     -0.58778000
+     2.35102010      2.61106992     -0.40674001
+     2.39424992      2.65908003     -0.20791000
+     1.79999995      3.11769009      0.00000000
+     1.78907001      3.09876990      0.20791000
+     1.75677001      3.04281998      0.40674001
+     1.70450997      2.95230007      0.58779001
+     1.63457000      2.83115005      0.74313998
+     1.54999995      2.68467999      0.86602998
+     1.45450997      2.51927996      0.95106000
+     1.35225999      2.34219003      0.99452001
+     1.24774003      2.16113997      0.99452001
+     1.14549005      1.98405004      0.95106000
+     1.04999995      1.81865001      0.86602998
+     0.96543002      1.67218006      0.74313998
+     0.89548999      1.55104005      0.58779001
+     0.84323001      1.46051002      0.40674001
+     0.81093001      1.40456998      0.20791000
+     0.80000001      1.38564003     -0.00000000
+     0.81093001      1.40456998     -0.20791000
+     0.84323001      1.46051002     -0.40674001
+     0.89548999      1.55104005     -0.58779001
+     0.96543002      1.67218006     -0.74313998
+     1.04999995      1.81865001     -0.86602998
+     1.14549005      1.98405004     -0.95106000
+     1.24774003      2.16113997     -0.99452001
+     1.35225999      2.34219003     -0.99452001
+     1.45450997      2.51927996     -0.95106000
+     1.54999995      2.68467999     -0.86602998
+     1.63457000      2.83115005     -0.74313998
+     1.70450997      2.95230007     -0.58778000
+     1.75677001      3.04281998     -0.40674001
+     1.78907001      3.09876990     -0.20791000
+     1.11246002      3.42379999      0.00000000
+     1.10571003      3.40301991      0.20791000
+     1.08574998      3.34157991      0.40674001
+     1.05343997      3.24217010      0.58779001
+     1.01022005      3.10912991      0.74313998
+     0.95795000      2.94828010      0.86602998
+     0.89894003      2.76663995      0.95106000
+     0.83574998      2.57216001      0.99452001
+     0.77113998      2.37333012      0.99452001
+     0.70795000      2.17884994      0.95106000
+     0.64894003      1.99722004      0.86602998
+     0.59666997      1.83636999      0.74313998
+     0.55343997      1.70333004      0.58779001
+     0.52113998      1.60390997      0.40674001
+     0.50117999      1.54246998      0.20791000
+     0.49443001      1.52169001     -0.00000000
+     0.50117999      1.54246998     -0.20791000
+     0.52113998      1.60390997     -0.40674001
+     0.55343997      1.70333004     -0.58779001
+     0.59666997      1.83636999     -0.74313998
+     0.64894003      1.99722004     -0.86602998
+     0.70795000      2.17884994     -0.95106000
+     0.77113998      2.37333012     -0.99452001
+     0.83574998      2.57216001     -0.99452001
+     0.89894003      2.76663995     -0.95106000
+     0.95795000      2.94828010     -0.86602998
+     1.01022005      3.10912991     -0.74313998
+     1.05343997      3.24217010     -0.58778000
+     1.08574998      3.34157991     -0.40674001
+     1.10571003      3.40301991     -0.20791000
+     0.37630001      3.58028007      0.00000000
+     0.37402001      3.55854988      0.20791000
+     0.36726999      3.49429989      0.40674001
+     0.35633999      3.39034009      0.58779001
+     0.34172001      3.25121999      0.74313998
+     0.32404000      3.08301997      0.86602998
+     0.30407000      2.89308000      0.95106000
+     0.28270000      2.68970990      0.99452001
+     0.26085001      2.48180008      0.99452001
+     0.23947001      2.27842999      0.95106000
+     0.21951000      2.08850002      0.86602998
+     0.20183000      1.92028999      0.74313998
+     0.18720999      1.78117001      0.58779001
+     0.17628001      1.67721999      0.40674001
+     0.16953000      1.61296999      0.20791000
+     0.16725001      1.59123003     -0.00000000
+     0.16953000      1.61296999     -0.20791000
+     0.17628001      1.67721999     -0.40674001
+     0.18720999      1.78117001     -0.58779001
+     0.20183000      1.92028999     -0.74313998
+     0.21951000      2.08850002     -0.86602998
+     0.23947001      2.27842999     -0.95106000
+     0.26085001      2.48180008     -0.99452001
+     0.28270000      2.68970990     -0.99452001
+     0.30407000      2.89308000     -0.95106000
+     0.32404000      3.08301997     -0.86602998
+     0.34172001      3.25121999     -0.74313998
+     0.35633999      3.39034009     -0.58778000
+     0.36726999      3.49429989     -0.40674001
+     0.37402001      3.55854988     -0.20791000
+    -0.37630001      3.58028007      0.00000000
+    -0.37402001      3.55854988      0.20791000
+    -0.36726999      3.49429989      0.40674001
+    -0.35633999      3.39034009      0.58779001
+    -0.34172001      3.25121999      0.74313998
+    -0.32404000      3.08301997      0.86602998
+    -0.30408001      2.89308000      0.95106000
+    -0.28270000      2.68970990      0.99452001
+    -0.26085001      2.48180008      0.99452001
+    -0.23947001      2.27842999      0.95106000
+    -0.21951000      2.08850002      0.86602998
+    -0.20183000      1.92028999      0.74313998
+    -0.18720999      1.78117001      0.58779001
+    -0.17628001      1.67721999      0.40674001
+    -0.16953000      1.61296999      0.20791000
+    -0.16725001      1.59123003     -0.00000000
+    -0.16953000      1.61296999     -0.20791000
+    -0.17628001      1.67721999     -0.40674001
+    -0.18720999      1.78117001     -0.58779001
+    -0.20183000      1.92028999     -0.74313998
+    -0.21951000      2.08850002     -0.86602998
+    -0.23947001      2.27842999     -0.95106000
+    -0.26085001      2.48180008     -0.99452001
+    -0.28270000      2.68970990     -0.99452001
+    -0.30408001      2.89308000     -0.95106000
+    -0.32404000      3.08301997     -0.86602998
+    -0.34172001      3.25121999     -0.74313998
+    -0.35633999      3.39034009     -0.58778000
+    -0.36726999      3.49429989     -0.40674001
+    -0.37402001      3.55854988     -0.20791000
+    -1.11246002      3.42379999      0.00000000
+    -1.10571003      3.40301991      0.20791000
+    -1.08574998      3.34157991      0.40674001
+    -1.05343997      3.24217010      0.58779001
+    -1.01022005      3.10912991      0.74313998
+    -0.95795000      2.94828010      0.86602998
+    -0.89894003      2.76663995      0.95106000
+    -0.83574998      2.57216001      0.99452001
+    -0.77113998      2.37333012      0.99452001
+    -0.70795000      2.17884994      0.95106000
+    -0.64894003      1.99722004      0.86602998
+    -0.59666997      1.83636999      0.74313998
+    -0.55343997      1.70333004      0.58779001
+    -0.52113998      1.60390997      0.40674001
+    -0.50117999      1.54246998      0.20791000
+    -0.49443001      1.52169001     -0.00000000
+    -0.50117999      1.54246998     -0.20791000
+    -0.52113998      1.60390997     -0.40674001
+    -0.55343997      1.70333004     -0.58779001
+    -0.59666997      1.83636999     -0.74313998
+    -0.64894003      1.99722004     -0.86602998
+    -0.70795000      2.17884994     -0.95106000
+    -0.77113998      2.37333012     -0.99452001
+    -0.83574998      2.57216001     -0.99452001
+    -0.89894003      2.76663995     -0.95106000
+    -0.95795000      2.94828010     -0.86602998
+    -1.01022005      3.10912991     -0.74313998
+    -1.05343997      3.24217010     -0.58778000
+    -1.08574998      3.34157991     -0.40674001
+    -1.10571003      3.40301991     -0.20791000
+    -1.79999995      3.11769009      0.00000000
+    -1.78907001      3.09876990      0.20791000
+    -1.75677001      3.04281998      0.40674001
+    -1.70450997      2.95230007      0.58779001
+    -1.63457000      2.83115005      0.74313998
+    -1.54999995      2.68467999      0.86602998
+    -1.45450997      2.51927996      0.95106000
+    -1.35225999      2.34219003      0.99452001
+    -1.24774003      2.16113997      0.99452001
+    -1.14549005      1.98405004      0.95106000
+    -1.04999995      1.81865001      0.86602998
+    -0.96543002      1.67218006      0.74313998
+    -0.89548999      1.55104005      0.58779001
+    -0.84323001      1.46051002      0.40674001
+    -0.81093001      1.40456998      0.20791000
+    -0.80000001      1.38564003     -0.00000000
+    -0.81093001      1.40456998     -0.20791000
+    -0.84323001      1.46051002     -0.40674001
+    -0.89548999      1.55104005     -0.58779001
+    -0.96543002      1.67218006     -0.74313998
+    -1.04999995      1.81865001     -0.86602998
+    -1.14549005      1.98405004     -0.95106000
+    -1.24774003      2.16113997     -0.99452001
+    -1.35225999      2.34219003     -0.99452001
+    -1.45450997      2.51927996     -0.95106000
+    -1.54999995      2.68467999     -0.86602998
+    -1.63457000      2.83115005     -0.74313998
+    -1.70450997      2.95230007     -0.58778000
+    -1.75677001      3.04281998     -0.40674001
+    -1.78907001      3.09876990     -0.20791000
+    -2.40886998      2.67531991      0.00000000
+    -2.39424992      2.65908003      0.20791000
+    -2.35102010      2.61106992      0.40674001
+    -2.28108001      2.53339005      0.58779001
+    -2.18747997      2.42944002      0.74313998
+    -2.07431006      2.30375004      0.86602998
+    -1.94650996      2.16181993      0.95106000
+    -1.80967999      2.00986004      0.99452001
+    -1.66980004      1.85450006      0.99452001
+    -1.53296995      1.70253003      0.95106000
+    -1.40516996      1.56060004      0.86602998
+    -1.29200006      1.43491995      0.74313998
+    -1.19840002      1.33096004      0.58779001
+    -1.12846005      1.25328004      0.40674001
+    -1.08522999      1.20527005      0.20791000
+    -1.07061005      1.18903005     -0.00000000
+    -1.08522999      1.20527005     -0.20791000
+    -1.12846005      1.25328004     -0.40674001
+    -1.19840002      1.33096004     -0.58779001
+    -1.29200006      1.43491995     -0.74313998
+    -1.40516996      1.56060004     -0.86602998
+    -1.53296995      1.70253003     -0.95106000
+    -1.66980004      1.85450006     -0.99452001
+    -1.80967999      2.00986004     -0.99452001
+    -1.94650996      2.16181993     -0.95106000
+    -2.07430005      2.30375004     -0.86602998
+    -2.18747997      2.42944002     -0.74313998
+    -2.28108001      2.53339005     -0.58778000
+    -2.35102010      2.61106992     -0.40674001
+    -2.39424992      2.65908003     -0.20791000
+    -2.91246009      2.11602998      0.00000000
+    -2.89477992      2.10317993      0.20791000
+    -2.84252000      2.06521010      0.40674001
+    -2.75795007      2.00377011      0.58779001
+    -2.64477992      1.92155004      0.74313998
+    -2.50795007      1.82212996      0.86602998
+    -2.35344005      1.70987999      0.95106000
+    -2.18800998      1.58967996      0.99452001
+    -2.01887989      1.46679997      0.99452001
+    -1.85344005      1.34660995      0.95106000
+    -1.69894004      1.23434997      0.86602998
+    -1.56210995      1.13494003      0.74313998
+    -1.44894004      1.05271006      0.58779001
+    -1.36436999      0.99127001      0.40674001
+    -1.31210995      0.95330000      0.20791000
+    -1.29443002      0.94046003     -0.00000000
+    -1.31210995      0.95330000     -0.20791000
+    -1.36436999      0.99127001     -0.40674001
+    -1.44894004      1.05271006     -0.58779001
+    -1.56210995      1.13494003     -0.74313998
+    -1.69894004      1.23434997     -0.86602998
+    -1.85344005      1.34660995     -0.95106000
+    -2.01887989      1.46679997     -0.99452001
+    -2.18800998      1.58967996     -0.99452001
+    -2.35344005      1.70987999     -0.95106000
+    -2.50795007      1.82212996     -0.86602998
+    -2.64477992      1.92155004     -0.74313998
+    -2.75795007      2.00377011     -0.58778000
+    -2.84252000      2.06521010     -0.40674001
+    -2.89477992      2.10317993     -0.20791000
+    -3.28875995      1.46424997      0.00000000
+    -3.26880002      1.45536005      0.20791000
+    -3.20977998      1.42909002      0.40674001
+    -3.11429000      1.38656998      0.58779001
+    -2.98650002      1.32966995      0.74313998
+    -2.83199000      1.26087999      0.86602998
+    -2.65752006      1.18320000      0.95106000
+    -2.47071004      1.10002995      0.99452001
+    -2.27973008      1.01499999      0.99452001
+    -2.09292006      0.93182999      0.95106000
+    -1.91845000      0.85415000      0.86602998
+    -1.76393998      0.78535998      0.74313998
+    -1.63613999      0.72846001      0.58779001
+    -1.54065001      0.68594003      0.40674001
+    -1.48163998      0.65967000      0.20791000
+    -1.46167004      0.65078002     -0.00000000
+    -1.48163998      0.65967000     -0.20791000
+    -1.54065001      0.68594003     -0.40674001
+    -1.63613999      0.72846001     -0.58779001
+    -1.76393998      0.78535998     -0.74313998
+    -1.91845000      0.85415000     -0.86602998
+    -2.09292006      0.93182999     -0.95106000
+    -2.27973008      1.01499999     -0.99452001
+    -2.47071004      1.10002995     -0.99452001
+    -2.65752006      1.18320000     -0.95106000
+    -2.83199000      1.26087999     -0.86602998
+    -2.98650002      1.32966995     -0.74313998
+    -3.11429000      1.38656998     -0.58778000
+    -3.20977998      1.42909002     -0.40674001
+    -3.26880002      1.45536005     -0.20791000
+    -3.52133012      0.74848002      0.00000000
+    -3.49995995      0.74394000      0.20791000
+    -3.43676996      0.73051000      0.40674001
+    -3.33452010      0.70876998      0.58779001
+    -3.19769001      0.67969000      0.74313998
+    -3.03225994      0.64453000      0.86602998
+    -2.84544992      0.60482001      0.95106000
+    -2.64543009      0.56230003      0.99452001
+    -2.44093990      0.51884001      0.99452001
+    -2.24092007      0.47632000      0.95106000
+    -2.05411005      0.43661001      0.86602998
+    -1.88867998      0.40145001      0.74313998
+    -1.75185001      0.37237000      0.58779001
+    -1.64960003      0.35062999      0.40674001
+    -1.58641005      0.33719999      0.20791000
+    -1.56503999      0.33265999     -0.00000000
+    -1.58641005      0.33719999     -0.20791000
+    -1.64960003      0.35062999     -0.40674001
+    -1.75185001      0.37237000     -0.58779001
+    -1.88867998      0.40145001     -0.74313998
+    -2.05411005      0.43661001     -0.86602998
+    -2.24092007      0.47632000     -0.95106000
+    -2.44093990      0.51884001     -0.99452001
+    -2.64543009      0.56230003     -0.99452001
+    -2.84544992      0.60482001     -0.95106000
+    -3.03225994      0.64453000     -0.86602998
+    -3.19769001      0.67969000     -0.74313998
+    -3.33452010      0.70876998     -0.58778000
+    -3.43676996      0.73051000     -0.40674001
+    -3.49995995      0.74394000     -0.20791000
+    -3.59999990     -0.00000000      0.00000000
+    -3.57815003     -0.00000000      0.20791000
+    -3.51355004     -0.00000000      0.40674001
+    -3.40901995     -0.00000000      0.58779001
+    -3.26912999     -0.00000000      0.74313998
+    -3.09999990     -0.00000000      0.86602998
+    -2.90901995     -0.00000000      0.95106000
+    -2.70453000     -0.00000000      0.99452001
+    -2.49547005     -0.00000000      0.99452001
+    -2.29098010     -0.00000000      0.95106000
+    -2.09999990     -0.00000000      0.86602998
+    -1.93087006     -0.00000000      0.74313998
+    -1.79097998     -0.00000000      0.58779001
+    -1.68645000     -0.00000000      0.40674001
+    -1.62185001     -0.00000000      0.20791000
+    -1.60000002     -0.00000000     -0.00000000
+    -1.62185001     -0.00000000     -0.20791000
+    -1.68645000     -0.00000000     -0.40674001
+    -1.79097998     -0.00000000     -0.58779001
+    -1.93087006     -0.00000000     -0.74313998
+    -2.09999990     -0.00000000     -0.86602998
+    -2.29098010     -0.00000000     -0.95106000
+    -2.49547005     -0.00000000     -0.99452001
+    -2.70453000     -0.00000000     -0.99452001
+    -2.90901995     -0.00000000     -0.95106000
+    -3.09999990     -0.00000000     -0.86602998
+    -3.26912999     -0.00000000     -0.74313998
+    -3.40901995     -0.00000000     -0.58778000
+    -3.51355004     -0.00000000     -0.40674001
+    -3.57815003     -0.00000000     -0.20791000
+    -3.52133012     -0.74848002      0.00000000
+    -3.49995995     -0.74394000      0.20791000
+    -3.43676996     -0.73051000      0.40674001
+    -3.33452010     -0.70876998      0.58779001
+    -3.19769001     -0.67969000      0.74313998
+    -3.03225994     -0.64453000      0.86602998
+    -2.84544992     -0.60482001      0.95106000
+    -2.64543009     -0.56230003      0.99452001
+    -2.44093990     -0.51884001      0.99452001
+    -2.24092007     -0.47632000      0.95106000
+    -2.05411005     -0.43661001      0.86602998
+    -1.88867998     -0.40145001      0.74313998
+    -1.75185001     -0.37237000      0.58779001
+    -1.64960003     -0.35062999      0.40674001
+    -1.58641005     -0.33719999      0.20791000
+    -1.56503999     -0.33265999     -0.00000000
+    -1.58641005     -0.33719999     -0.20791000
+    -1.64960003     -0.35062999     -0.40674001
+    -1.75185001     -0.37237000     -0.58779001
+    -1.88867998     -0.40145001     -0.74313998
+    -2.05411005     -0.43661001     -0.86602998
+    -2.24092007     -0.47632000     -0.95106000
+    -2.44093990     -0.51884001     -0.99452001
+    -2.64543009     -0.56230003     -0.99452001
+    -2.84544992     -0.60482001     -0.95106000
+    -3.03225994     -0.64453000     -0.86602998
+    -3.19769001     -0.67969000     -0.74313998
+    -3.33452010     -0.70876998     -0.58778000
+    -3.43676996     -0.73051000     -0.40674001
+    -3.49995995     -0.74394000     -0.20791000
+    -3.28875995     -1.46424997      0.00000000
+    -3.26880002     -1.45536005      0.20791000
+    -3.20977998     -1.42909002      0.40674001
+    -3.11429000     -1.38656998      0.58779001
+    -2.98650002     -1.32967997      0.74313998
+    -2.83199000     -1.26087999      0.86602998
+    -2.65752006     -1.18320000      0.95106000
+    -2.47071004     -1.10002995      0.99452001
+    -2.27973008     -1.01499999      0.99452001
+    -2.09292006     -0.93182999      0.95106000
+    -1.91845000     -0.85415000      0.86602998
+    -1.76393998     -0.78535998      0.74313998
+    -1.63613999     -0.72846001      0.58779001
+    -1.54065001     -0.68594003      0.40674001
+    -1.48163998     -0.65967000      0.20791000
+    -1.46167004     -0.65078002     -0.00000000
+    -1.48163998     -0.65967000     -0.20791000
+    -1.54065001     -0.68594003     -0.40674001
+    -1.63613999     -0.72846001     -0.58779001
+    -1.76393998     -0.78535998     -0.74313998
+    -1.91845000     -0.85415000     -0.86602998
+    -2.09292006     -0.93182999     -0.95106000
+    -2.27973008     -1.01499999     -0.99452001
+    -2.47071004     -1.10002995     -0.99452001
+    -2.65752006     -1.18320000     -0.95106000
+    -2.83199000     -1.26087999     -0.86602998
+    -2.98650002     -1.32967997     -0.74313998
+    -3.11429000     -1.38656998     -0.58778000
+    -3.20977998     -1.42909002     -0.40674001
+    -3.26880002     -1.45536005     -0.20791000
+    -2.91246009     -2.11602998      0.00000000
+    -2.89477992     -2.10317993      0.20791000
+    -2.84252000     -2.06521010      0.40674001
+    -2.75795007     -2.00377011      0.58779001
+    -2.64477992     -1.92155004      0.74313998
+    -2.50795007     -1.82212996      0.86602998
+    -2.35344005     -1.70987999      0.95106000
+    -2.18800998     -1.58967996      0.99452001
+    -2.01887989     -1.46679997      0.99452001
+    -1.85344005     -1.34660995      0.95106000
+    -1.69894004     -1.23434997      0.86602998
+    -1.56210995     -1.13494003      0.74313998
+    -1.44894004     -1.05271006      0.58779001
+    -1.36436999     -0.99127001      0.40674001
+    -1.31210995     -0.95330000      0.20791000
+    -1.29443002     -0.94046003     -0.00000000
+    -1.31210995     -0.95330000     -0.20791000
+    -1.36436999     -0.99127001     -0.40674001
+    -1.44894004     -1.05271006     -0.58779001
+    -1.56210995     -1.13494003     -0.74313998
+    -1.69894004     -1.23434997     -0.86602998
+    -1.85344005     -1.34660995     -0.95106000
+    -2.01887989     -1.46679997     -0.99452001
+    -2.18800998     -1.58967996     -0.99452001
+    -2.35344005     -1.70987999     -0.95106000
+    -2.50795007     -1.82212996     -0.86602998
+    -2.64477992     -1.92155004     -0.74313998
+    -2.75795007     -2.00377011     -0.58778000
+    -2.84252000     -2.06521010     -0.40674001
+    -2.89477992     -2.10317993     -0.20791000
+    -2.40886998     -2.67531991      0.00000000
+    -2.39424992     -2.65908003      0.20791000
+    -2.35102010     -2.61106992      0.40674001
+    -2.28108001     -2.53339005      0.58779001
+    -2.18746996     -2.42944002      0.74313998
+    -2.07430005     -2.30375004      0.86602998
+    -1.94650996     -2.16181993      0.95106000
+    -1.80967999     -2.00986004      0.99452001
+    -1.66980004     -1.85450006      0.99452001
+    -1.53296995     -1.70253003      0.95106000
+    -1.40516996     -1.56060004      0.86602998
+    -1.29200006     -1.43491995      0.74313998
+    -1.19840002     -1.33096004      0.58779001
+    -1.12846005     -1.25328004      0.40674001
+    -1.08522999     -1.20527005      0.20791000
+    -1.07061005     -1.18903005     -0.00000000
+    -1.08522999     -1.20527005     -0.20791000
+    -1.12846005     -1.25328004     -0.40674001
+    -1.19840002     -1.33096004     -0.58779001
+    -1.29200006     -1.43491995     -0.74313998
+    -1.40516996     -1.56060004     -0.86602998
+    -1.53296995     -1.70253003     -0.95106000
+    -1.66980004     -1.85450006     -0.99452001
+    -1.80967999     -2.00986004     -0.99452001
+    -1.94650996     -2.16181993     -0.95106000
+    -2.07430005     -2.30375004     -0.86602998
+    -2.18747997     -2.42944002     -0.74313998
+    -2.28108001     -2.53339005     -0.58778000
+    -2.35102010     -2.61106992     -0.40674001
+    -2.39424992     -2.65908003     -0.20791000
+    -1.79999995     -3.11769009      0.00000000
+    -1.78907001     -3.09876990      0.20791000
+    -1.75677001     -3.04281998      0.40674001
+    -1.70450997     -2.95230007      0.58779001
+    -1.63455999     -2.83115005      0.74313998
+    -1.54999995     -2.68467999      0.86602998
+    -1.45450997     -2.51927996      0.95106000
+    -1.35225999     -2.34219003      0.99452001
+    -1.24774003     -2.16113997      0.99452001
+    -1.14549005     -1.98405004      0.95106000
+    -1.04999995     -1.81865001      0.86602998
+    -0.96543002     -1.67218006      0.74313998
+    -0.89548999     -1.55104005      0.58779001
+    -0.84323001     -1.46051002      0.40674001
+    -0.81093001     -1.40456998      0.20791000
+    -0.80000001     -1.38564003     -0.00000000
+    -0.81093001     -1.40456998     -0.20791000
+    -0.84323001     -1.46051002     -0.40674001
+    -0.89548999     -1.55104005     -0.58779001
+    -0.96543002     -1.67218006     -0.74313998
+    -1.04999995     -1.81865001     -0.86602998
+    -1.14549005     -1.98405004     -0.95106000
+    -1.24774003     -2.16113997     -0.99452001
+    -1.35225999     -2.34219003     -0.99452001
+    -1.45450997     -2.51927996     -0.95106000
+    -1.54999995     -2.68467999     -0.86602998
+    -1.63455999     -2.83115005     -0.74313998
+    -1.70450997     -2.95230007     -0.58778000
+    -1.75677001     -3.04281998     -0.40674001
+    -1.78907001     -3.09876990     -0.20791000
+    -1.11246002     -3.42379999      0.00000000
+    -1.10571003     -3.40301991      0.20791000
+    -1.08574998     -3.34157991      0.40674001
+    -1.05343997     -3.24217010      0.58779001
+    -1.01022005     -3.10912991      0.74313998
+    -0.95795000     -2.94828010      0.86602998
+    -0.89894003     -2.76663995      0.95106000
+    -0.83574998     -2.57216001      0.99452001
+    -0.77113998     -2.37333012      0.99452001
+    -0.70795000     -2.17884994      0.95106000
+    -0.64894003     -1.99722004      0.86602998
+    -0.59666997     -1.83636999      0.74313998
+    -0.55343997     -1.70333004      0.58779001
+    -0.52113998     -1.60390997      0.40674001
+    -0.50117999     -1.54246998      0.20791000
+    -0.49443001     -1.52169001     -0.00000000
+    -0.50117999     -1.54246998     -0.20791000
+    -0.52113998     -1.60390997     -0.40674001
+    -0.55343997     -1.70333004     -0.58779001
+    -0.59666997     -1.83636999     -0.74313998
+    -0.64894003     -1.99722004     -0.86602998
+    -0.70795000     -2.17884994     -0.95106000
+    -0.77113998     -2.37333012     -0.99452001
+    -0.83574998     -2.57216001     -0.99452001
+    -0.89894003     -2.76663995     -0.95106000
+    -0.95795000     -2.94827008     -0.86602998
+    -1.01022005     -3.10912991     -0.74313998
+    -1.05343997     -3.24217010     -0.58778000
+    -1.08574998     -3.34157991     -0.40674001
+    -1.10571003     -3.40301991     -0.20791000
+    -0.37630001     -3.58028007      0.00000000
+    -0.37402001     -3.55854988      0.20791000
+    -0.36726999     -3.49429989      0.40674001
+    -0.35633999     -3.39034009      0.58779001
+    -0.34172001     -3.25121999      0.74313998
+    -0.32404000     -3.08301997      0.86602998
+    -0.30407000     -2.89308000      0.95106000
+    -0.28270000     -2.68970990      0.99452001
+    -0.26085001     -2.48180008      0.99452001
+    -0.23947001     -2.27842999      0.95106000
+    -0.21951000     -2.08850002      0.86602998
+    -0.20183000     -1.92028999      0.74313998
+    -0.18720999     -1.78117001      0.58779001
+    -0.17628001     -1.67721999      0.40674001
+    -0.16953000     -1.61296999      0.20791000
+    -0.16725001     -1.59123003     -0.00000000
+    -0.16953000     -1.61296999     -0.20791000
+    -0.17628001     -1.67721999     -0.40674001
+    -0.18720999     -1.78117001     -0.58779001
+    -0.20183000     -1.92028999     -0.74313998
+    -0.21951000     -2.08850002     -0.86602998
+    -0.23947001     -2.27842999     -0.95106000
+    -0.26085001     -2.48180008     -0.99452001
+    -0.28270000     -2.68970990     -0.99452001
+    -0.30407000     -2.89308000     -0.95106000
+    -0.32404000     -3.08301997     -0.86602998
+    -0.34172001     -3.25121999     -0.74313998
+    -0.35633999     -3.39034009     -0.58778000
+    -0.36726999     -3.49429989     -0.40674001
+    -0.37402001     -3.55854988     -0.20791000
+     0.37630001     -3.58028007      0.00000000
+     0.37402001     -3.55854988      0.20791000
+     0.36726999     -3.49429989      0.40674001
+     0.35633999     -3.39034009      0.58779001
+     0.34172001     -3.25121999      0.74313998
+     0.32404000     -3.08301997      0.86602998
+     0.30408001     -2.89308000      0.95106000
+     0.28270000     -2.68970990      0.99452001
+     0.26085001     -2.48180008      0.99452001
+     0.23947001     -2.27842999      0.95106000
+     0.21951000     -2.08850002      0.86602998
+     0.20183000     -1.92028999      0.74313998
+     0.18720999     -1.78117001      0.58779001
+     0.17628001     -1.67721999      0.40674001
+     0.16953000     -1.61296999      0.20791000
+     0.16725001     -1.59123003     -0.00000000
+     0.16953000     -1.61296999     -0.20791000
+     0.17628001     -1.67721999     -0.40674001
+     0.18720999     -1.78117001     -0.58779001
+     0.20183000     -1.92028999     -0.74313998
+     0.21951000     -2.08850002     -0.86602998
+     0.23947001     -2.27842999     -0.95106000
+     0.26085001     -2.48180008     -0.99452001
+     0.28270000     -2.68970990     -0.99452001
+     0.30408001     -2.89308000     -0.95106000
+     0.32404000     -3.08301997     -0.86602998
+     0.34172001     -3.25121999     -0.74313998
+     0.35633999     -3.39034009     -0.58778000
+     0.36726999     -3.49429989     -0.40674001
+     0.37402001     -3.55854988     -0.20791000
+     1.11246002     -3.42379999      0.00000000
+     1.10571003     -3.40301991      0.20791000
+     1.08574998     -3.34157991      0.40674001
+     1.05343997     -3.24217010      0.58779001
+     1.01022005     -3.10912991      0.74313998
+     0.95795000     -2.94827008      0.86602998
+     0.89894003     -2.76663995      0.95106000
+     0.83574998     -2.57216001      0.99452001
+     0.77113998     -2.37333012      0.99452001
+     0.70795000     -2.17884994      0.95106000
+     0.64894003     -1.99722004      0.86602998
+     0.59666997     -1.83636999      0.74313998
+     0.55343997     -1.70333004      0.58779001
+     0.52113998     -1.60390997      0.40674001
+     0.50117999     -1.54246998      0.20791000
+     0.49443001     -1.52169001     -0.00000000
+     0.50117999     -1.54246998     -0.20791000
+     0.52113998     -1.60390997     -0.40674001
+     0.55343997     -1.70333004     -0.58779001
+     0.59666997     -1.83636999     -0.74313998
+     0.64894003     -1.99722004     -0.86602998
+     0.70795000     -2.17884994     -0.95106000
+     0.77113998     -2.37333012     -0.99452001
+     0.83574998     -2.57216001     -0.99452001
+     0.89894003     -2.76663995     -0.95106000
+     0.95795000     -2.94827008     -0.86602998
+     1.01022005     -3.10912991     -0.74313998
+     1.05343997     -3.24217010     -0.58778000
+     1.08574998     -3.34157991     -0.40674001
+     1.10571003     -3.40301991     -0.20791000
+     1.79999995     -3.11769009      0.00000000
+     1.78907001     -3.09876990      0.20791000
+     1.75677001     -3.04281998      0.40674001
+     1.70450997     -2.95230007      0.58779001
+     1.63455999     -2.83115005      0.74313998
+     1.54999995     -2.68467999      0.86602998
+     1.45450997     -2.51927996      0.95106000
+     1.35225999     -2.34219003      0.99452001
+     1.24774003     -2.16113997      0.99452001
+     1.14549005     -1.98405004      0.95106000
+     1.04999995     -1.81865001      0.86602998
+     0.96543002     -1.67218006      0.74313998
+     0.89548999     -1.55104005      0.58779001
+     0.84323001     -1.46051002      0.40674001
+     0.81093001     -1.40456998      0.20791000
+     0.80000001     -1.38564003     -0.00000000
+     0.81093001     -1.40456998     -0.20791000
+     0.84323001     -1.46051002     -0.40674001
+     0.89548999     -1.55104005     -0.58779001
+     0.96543002     -1.67218006     -0.74313998
+     1.04999995     -1.81865001     -0.86602998
+     1.14549005     -1.98405004     -0.95106000
+     1.24774003     -2.16113997     -0.99452001
+     1.35225999     -2.34219003     -0.99452001
+     1.45450997     -2.51927996     -0.95106000
+     1.54999995     -2.68467999     -0.86602998
+     1.63455999     -2.83115005     -0.74313998
+     1.70450997     -2.95230007     -0.58778000
+     1.75677001     -3.04281998     -0.40674001
+     1.78907001     -3.09876990     -0.20791000
+     2.40886998     -2.67531991      0.00000000
+     2.39424992     -2.65908003      0.20791000
+     2.35102010     -2.61106992      0.40674001
+     2.28108001     -2.53339005      0.58779001
+     2.18747997     -2.42944002      0.74313998
+     2.07431006     -2.30375004      0.86602998
+     1.94650996     -2.16181993      0.95106000
+     1.80967999     -2.00986004      0.99452001
+     1.66980004     -1.85450006      0.99452001
+     1.53296995     -1.70253003      0.95106000
+     1.40516996     -1.56060004      0.86602998
+     1.29200006     -1.43491995      0.74313998
+     1.19840002     -1.33096004      0.58779001
+     1.12846005     -1.25328004      0.40674001
+     1.08522999     -1.20527005      0.20791000
+     1.07061005     -1.18903005     -0.00000000
+     1.08522999     -1.20527005     -0.20791000
+     1.12846005     -1.25328004     -0.40674001
+     1.19840002     -1.33096004     -0.58779001
+     1.29200006     -1.43491995     -0.74313998
+     1.40516996     -1.56060004     -0.86602998
+     1.53296995     -1.70253003     -0.95106000
+     1.66980004     -1.85450006     -0.99452001
+     1.80967999     -2.00986004     -0.99452001
+     1.94650996     -2.16181993     -0.95106000
+     2.07431006     -2.30375004     -0.86602998
+     2.18747997     -2.42944002     -0.74313998
+     2.28108001     -2.53339005     -0.58778000
+     2.35102010     -2.61106992     -0.40674001
+     2.39424992     -2.65908003     -0.20791000
+     2.91246009     -2.11602998      0.00000000
+     2.89477992     -2.10317993      0.20791000
+     2.84252000     -2.06521010      0.40674001
+     2.75795007     -2.00377011      0.58779001
+     2.64477992     -1.92155004      0.74313998
+     2.50795007     -1.82212996      0.86602998
+     2.35344005     -1.70987999      0.95106000
+     2.18800998     -1.58967996      0.99452001
+     2.01887989     -1.46679997      0.99452001
+     1.85344005     -1.34660995      0.95106000
+     1.69894004     -1.23434997      0.86602998
+     1.56210995     -1.13494003      0.74313998
+     1.44894004     -1.05271006      0.58779001
+     1.36436999     -0.99127001      0.40674001
+     1.31210995     -0.95330000      0.20791000
+     1.29443002     -0.94046003     -0.00000000
+     1.31210995     -0.95330000     -0.20791000
+     1.36436999     -0.99127001     -0.40674001
+     1.44894004     -1.05271006     -0.58779001
+     1.56210995     -1.13494003     -0.74313998
+     1.69894004     -1.23434997     -0.86602998
+     1.85344005     -1.34660995     -0.95106000
+     2.01887989     -1.46679997     -0.99452001
+     2.18800998     -1.58967996     -0.99452001
+     2.35344005     -1.70987999     -0.95106000
+     2.50795007     -1.82212996     -0.86602998
+     2.64477992     -1.92155004     -0.74313998
+     2.75795007     -2.00377011     -0.58778000
+     2.84252000     -2.06521010     -0.40674001
+     2.89477992     -2.10317993     -0.20791000
+     3.28875995     -1.46424997      0.00000000
+     3.26880002     -1.45536005      0.20791000
+     3.20977998     -1.42909002      0.40674001
+     3.11429000     -1.38656998      0.58779001
+     2.98650002     -1.32966995      0.74313998
+     2.83199000     -1.26087999      0.86602998
+     2.65752006     -1.18320000      0.95106000
+     2.47071004     -1.10002995      0.99452001
+     2.27973008     -1.01499999      0.99452001
+     2.09292006     -0.93182999      0.95106000
+     1.91845000     -0.85415000      0.86602998
+     1.76393998     -0.78535002      0.74313998
+     1.63613999     -0.72846001      0.58779001
+     1.54065001     -0.68594003      0.40674001
+     1.48163998     -0.65967000      0.20791000
+     1.46167004     -0.65078002     -0.00000000
+     1.48163998     -0.65967000     -0.20791000
+     1.54065001     -0.68594003     -0.40674001
+     1.63613999     -0.72846001     -0.58779001
+     1.76393998     -0.78535998     -0.74313998
+     1.91845000     -0.85415000     -0.86602998
+     2.09292006     -0.93182999     -0.95106000
+     2.27973008     -1.01499999     -0.99452001
+     2.47071004     -1.10002995     -0.99452001
+     2.65752006     -1.18320000     -0.95106000
+     2.83199000     -1.26087999     -0.86602998
+     2.98650002     -1.32966995     -0.74313998
+     3.11429000     -1.38656998     -0.58778000
+     3.20977998     -1.42909002     -0.40674001
+     3.26880002     -1.45536005     -0.20791000
+     3.52133012     -0.74848002      0.00000000
+     3.49995995     -0.74394000      0.20791000
+     3.43676996     -0.73051000      0.40674001
+     3.33452010     -0.70876998      0.58779001
+     3.19769001     -0.67969000      0.74313998
+     3.03225994     -0.64453000      0.86602998
+     2.84544992     -0.60482001      0.95106000
+     2.64543009     -0.56230003      0.99452001
+     2.44093990     -0.51884001      0.99452001
+     2.24092007     -0.47632000      0.95106000
+     2.05411005     -0.43661001      0.86602998
+     1.88867998     -0.40145001      0.74313998
+     1.75185001     -0.37237000      0.58779001
+     1.64960003     -0.35062999      0.40674001
+     1.58641005     -0.33719999      0.20791000
+     1.56503999     -0.33265999     -0.00000000
+     1.58641005     -0.33719999     -0.20791000
+     1.64960003     -0.35062999     -0.40674001
+     1.75185001     -0.37237000     -0.58779001
+     1.88867998     -0.40145001     -0.74313998
+     2.05411005     -0.43661001     -0.86602998
+     2.24092007     -0.47632000     -0.95106000
+     2.44093990     -0.51884001     -0.99452001
+     2.64543009     -0.56230003     -0.99452001
+     2.84544992     -0.60482001     -0.95106000
+     3.03225994     -0.64453000     -0.86602998
+     3.19769001     -0.67969000     -0.74313998
+     3.33452010     -0.70876998     -0.58778000
+     3.43676996     -0.73051000     -0.40674001
+     3.49995995     -0.74394000     -0.20791000
+     1.50159001     -2.35998011      0.00000000
+     0.61746001     -2.92605996      0.08300000
+     2.28624010     -1.41790998      0.04018000
+    -1.48520005      2.50332999      0.22578000
+    -0.48361999      2.74303007      0.20584001
+    -2.72946000      0.39026001      0.27230999
+    -1.76915002      2.01219010      0.24414000
+     2.52950001     -0.78288001      0.45559001
+    -1.68601000     -1.92973006      0.35668001
+     1.57799995      1.94705999      0.28863001
+     2.52596998      0.25962001      0.10517000
+     1.51681995      1.76990998      0.29881001
+     1.34890997      2.03061008      0.11783000
+     1.74825001      1.85678995      0.02213000
+     2.49320006     -0.01685000      0.02269000
+    -2.17324996     -0.17698000     -0.00000000
+    -1.86556005     -1.59617996     -0.03077000
+    -1.53244996     -1.79545999     -0.10662000
+    -2.20471001      0.08894000     -0.28589001
+    -0.61821002      2.25886011     -0.28661999
+    -2.37361002     -0.40267000     -0.33338001
+    -1.99407995      1.44440997     -0.42394999
+    -0.53645003      2.52522993     -0.17526001
+     0.93950999     -2.47575998     -0.45699999
+     2.48706007      1.16566002     -0.45142999
+    -2.58662009     -0.42627999     -0.03726000
+     1.00221002      2.63791990     -0.24643999
+     2.11462998     -1.74416995     -0.10254000
+     2.39991999      1.02374005     -0.00407000
+    -2.53849006      0.69099998     -0.00656000
+     0.22700000      3.07696009      0.00000000
+     2.46448994     -1.73882997      0.08846000
+    -0.29753000      2.83096004      0.10977000
+    -2.05859995      2.05326009      0.22342999
+    -2.81464005     -0.22215000      0.24811000
+    -2.55853009     -0.51488000      0.01701000
+    -2.53601003      1.04788005      0.44310999
+     2.39232993     -1.11091006      0.35850000
+    -0.54764998      2.50217009      0.36724001
+    -1.62268996     -1.96097004      0.16835999
+    -0.97373003     -2.36596990      0.07187000
+    -2.14421010      0.84732002      0.32701001
+     1.17732000     -2.16723990      0.09708000
+     0.28881001      2.17282009      0.18167999
+    -1.33499002      1.82872999      0.07138000
+     2.21996999     -0.62281001     -0.00000000
+    -1.19913995     -1.82061994     -0.08926000
+    -2.02278996      0.80735999     -0.18791001
+    -1.82360995      1.35249996     -0.23944999
+    -0.92186999     -2.10194993     -0.33849001
+    -2.53064990      0.27954000     -0.09345000
+     2.33874011     -0.75580001     -0.43755001
+     1.53138995      2.04390001     -0.43812001
+    -1.65793002     -2.03203011     -0.21479000
+    -1.93156004     -1.80465996     -0.13365000
+     0.60038000     -2.60867000     -0.13313000
+    -2.52884007      0.87410003     -0.08401000
+     1.03722000      2.50553989     -0.08118000
+    -2.61661005     -0.96894002     -0.08470000
+     1.47279000      2.66340995     -0.09427000
+     2.12282991      1.60791004      0.00000000
+    -2.97071004      0.08506000      0.07906000
+     3.01320004     -0.28957000      0.19014999
+    -1.10294998     -2.52459002      0.11262000
+    -0.00392000     -2.72334003      0.13699000
+    -0.72810000      2.55640006      0.10057000
+    -2.27473998     -1.33543003      0.11623000
+     1.51850998      2.15743995      0.36407000
+     1.80375004      1.81454003      0.39456001
+     1.27696002      2.13167000      0.35429999
+     2.10813999      1.06631994      0.41141000
+     2.29459000      0.78608000      0.19380000
+     1.11928999      2.23867011      0.07055000
+     0.67016000     -2.16394997      0.14900000
+    -1.17814004     -1.77075005      0.10057000
+    -1.42097998     -1.70581996     -0.00000000
+     2.10933995      1.40426004     -0.01402000
+    -2.54362011     -0.32475001     -0.01591000
+     2.27827001      1.07044005     -0.06015000
+    -2.25777006      0.55826998     -0.30456999
+    -2.15974998     -1.07185996     -0.32718000
+     2.43968010      0.82568997     -0.07504000
+     2.58931994     -0.00010000     -0.10160000
+     2.00792003     -1.66204000     -0.06239000
+     2.60809994     -0.03607000     -0.02571000
+     1.79866004     -1.90241003     -0.03132000
+     2.90783000      0.07605000     -0.34299001
+    -2.22115993     -1.48699999     -0.05301000
+     1.44256997      2.37515998     -0.07966000
+     2.56385994     -1.55947995     -0.08521000
+    -1.82076001      2.22656989      0.00000000
+    -2.47721004     -1.35033000      0.04705000
+    -1.01411998     -2.44341993      0.02026000
+    -2.85205007     -0.55908000      0.22256000
+    -0.98093998      2.76300001      0.36868000
+    -2.49605989     -1.31099999      0.38001999
+    -0.03712000     -2.69691992      0.29905999
+     2.57399011      0.58250999      0.37185001
+     1.27450001     -2.21054006      0.46015000
+     1.72860003     -1.76655996      0.39517999
+     2.39391994     -0.31107000      0.32207999
+     1.86503994     -1.29566002      0.36548001
+    -1.19664001     -2.07908010      0.14613999
+     1.14288998      1.90423000      0.16880000
+     1.96349001     -1.64629996      0.00800000
+    -1.45903003     -2.00043011     -0.00000000
+    -1.70903003     -1.80805004     -0.02382000
+    -0.74962002     -2.33803010     -0.06444000
+    -1.19054997      2.20558000     -0.06801000
+     2.13357997      1.07298994     -0.23523000
+     0.40156999      2.40390992     -0.28195000
+    -2.44438004     -0.16437000     -0.46195999
+    -0.48251000      2.52577996     -0.27156001
+    -0.50006002     -2.55749011     -0.05633000
+    -2.64845991      0.47968000     -0.28176999
+     2.54838991     -0.92983001     -0.19525000
+    -1.48889005      2.46949005     -0.31498000
+    -2.38419008      1.04040003     -0.00095000
+    -1.61422002      2.37708998     -0.12171000
+     1.35587001     -2.35150003     -0.02431000
+    -1.28243005     -2.53561997      0.00000000
+    -2.73146009      0.31136000      0.03170000
+    -0.63318998     -2.60760999      0.03713000
+    -1.88672996     -1.81287003      0.01201000
+    -2.42910004      1.45757997      0.25861001
+    -1.26915002     -2.45022988      0.27610999
+    -1.50621998      2.15417004      0.08779000
+    -2.03799009     -1.66676998      0.31186000
+    -0.31197000     -2.56393003      0.16328999
+    -0.15423000     -2.56412005      0.09616000
+     2.13507009     -1.15784001      0.29651001
+    -1.43736005     -2.06247997      0.09559000
+    -2.51146007     -0.51912999      0.02576000
+    -0.14494000      2.19444990      0.17843001
+    -0.99778003     -2.35120010      0.00974000
+     1.85160995      1.55694997     -0.00000000
+    -2.04685998     -1.07045996     -0.06167000
+    -1.23552001     -2.13657999     -0.05873000
+     0.40030000     -2.45087004     -0.08475000
+    -1.21696997      2.22550988     -0.07051000
+     2.58657002     -0.25494999     -0.00155000
+     1.19111001     -2.25334001     -0.15763000
+     0.97575003      2.38532996     -0.21705000
+     2.55909991     -0.68048000     -0.45695001
+     0.25266999     -2.69619989     -0.33243001
+     2.00661993      1.91164994     -0.29695001
+    -2.13067007      1.90640998     -0.28770000
+     2.78249002     -1.04041004     -0.26929000
+     1.74144006     -2.05415010     -0.04140000
+     0.77688003     -2.76080990     -0.05697000
+    -0.89367002      2.91872001      0.00000000
+     2.55251002     -1.62791002      0.09086000
+    -2.86299992      0.03339000      0.11718000
+     1.41266000      2.31362009      0.08050000
+     1.82286000     -2.07869005      0.18296000
+    -2.73924994      0.63652003      0.36759999
+    -2.64412999      0.06684000      0.13840000
+     1.11593997      2.38787007      0.34022000
+    -0.36451000     -2.56697989      0.06915000
+    -2.01253009     -1.52312005      0.23416001
+     1.27208996     -2.05744004      0.31360999
+     1.10107994      2.27309990      0.08248000
+    -2.55083990      0.02363000      0.03564000
+     1.57302999      1.85917997      0.07330000
+    -0.97114003      1.91171002      0.09688000
+     1.92086005     -1.24483001     -0.00000000
+     1.14150000     -1.88054001     -0.08505000
+    -2.44624996      0.06035000     -0.06812000
+    -1.83775997      1.43799996     -0.19362999
+    -1.94779003     -1.58845997     -0.09620000
+     1.50138998      2.10044003     -0.03141000
+     1.94764996      1.56737006     -0.30777001
+    -1.69229996      1.95396996     -0.14335001
+    -1.27468002      2.27155995     -0.04532000
+    -2.46322989      1.21002996     -0.44437999
+    -2.30714989     -1.33661997     -0.11495000
+    -1.54865003     -2.39831996     -0.28306001
+    -2.65530992      0.21020000     -0.04622000
+     2.14094996     -1.93496001     -0.12724000
+    -2.68493009     -0.30008999     -0.02161000
+    -2.63111997     -0.99536002      0.00000000
+     1.34455001     -2.44794011      0.04100000
+     0.09796000      2.74716997      0.06630000
+    -0.36963999     -2.83434010      0.18770000
+     2.70087004     -0.25797001      0.12568000
+     2.10698009     -1.58071995      0.05892000
+    -2.20283008      1.38270998      0.00257000
+     0.54815000     -2.58295012      0.38507000
+    -0.70299000      2.49692988      0.05702000
+     1.65199995     -1.86117995      0.34286001
+     2.36998010      0.75629002      0.19447000
+     2.35461998     -0.20070000      0.26304001
+     0.58596998      2.33593011      0.13926999
+     1.69322002     -1.91618001      0.01910000
+     1.95586002      1.41276002      0.03980000
+    -0.72579998      2.15235996     -0.00000000
+     0.92000002     -2.36279988     -0.01369000
+     2.44189000      0.81908000     -0.01086000
+    -2.20398998      0.59974003     -0.22949000
+    -0.87279999     -2.29133010     -0.16444001
+     1.79720998      1.66890001     -0.25532001
+    -2.21696997     -1.19413996     -0.25198001
+    -2.13435006     -1.45139003     -0.17997000
+    -0.88525999      2.49398994     -0.44193000
+    -2.59787011      0.38499001     -0.08075000
+    -2.10756993     -1.73749995     -0.22766000
+    -2.05362010     -1.90253997     -0.22153001
+     0.30094001      2.92020011     -0.24387001
+     2.39276004      1.12759995     -0.02010000
+     2.38072991     -1.23711002     -0.01764000
+    -2.69490004      0.31066999      0.00000000
+     1.27204001     -2.42935991      0.03023000
+    -1.87194002      2.34581995      0.17861000
+    -1.63528001      2.43076992      0.23950000
+    -1.41147006     -2.19796991      0.01350000
+    -0.13110000      2.79149008      0.33700001
+    -1.91810000     -1.94148004      0.39759001
+    -0.93318999      2.43913007      0.10990000
+     0.82387000      2.43225002      0.30454001
+     1.92569005      1.58763003      0.32078999
+     0.48723000     -2.37057996      0.31154001
+     0.75677001      2.34677005      0.14906999
+    -0.97205001      2.22104001      0.12755001
+     0.28873000      2.40653992      0.07845000
+    -2.47076011     -0.51727003      0.01608000
+    -2.43723011     -0.88433999     -0.00000000
+    -1.76128995      1.64950001     -0.03973000
+    -0.77208000      2.12739992     -0.14997000
+    -0.15327001      2.33218002     -0.19092999
+    -2.16960001     -0.74002999     -0.34169000
+    -0.93853003     -2.20621991     -0.35065001
+    -0.82129002     -2.41601992     -0.14834000
+    -1.58186996     -2.06301999     -0.00299000
+    -2.58761001     -0.54367000     -0.41964000
+    -1.98564005     -1.82851005     -0.30562001
+    -2.68193007     -0.31341001     -0.17351000
+    -1.84007001      2.16393995     -0.26710999
+     0.92067999     -2.72272992     -0.19920000
+     1.49860001      2.14302993     -0.00669000
+     2.70438004      1.14136004     -0.07128000
+     1.11143994      2.68881989      0.00000000
+    -0.88407999     -2.73853993      0.05903000
+     2.60254002      0.01840000      0.00116000
+    -0.92038000      2.54446006      0.07687000
+    -1.61715996     -2.39144993      0.31863999
+     1.12559998      2.43804002      0.14781000
+    -1.35785997     -2.37506008      0.41799000
+    -1.49357998     -2.14815998      0.15576001
+     1.94314003     -1.71280003      0.09262000
+     1.38952994      2.10493994      0.23941000
+     1.15719998     -2.13800001      0.29256999
+     2.09006000     -1.43640006      0.07101000
+    -1.82445002      1.42400002      0.20750999
+     1.59704006     -1.72388995      0.11132000
+    -0.14861000     -2.13878989      0.09694000
+     0.22621000      2.12470007     -0.00000000
+    -2.03249002     -0.68083000     -0.09703000
+    -2.34614992      0.08248000     -0.11237000
+     2.11205006     -0.84961998     -0.23501000
+     0.94164997     -2.20875001     -0.22090000
+    -1.29454005     -1.96270001     -0.43098000
+     2.34553003     -1.00013006     -0.15433000
+     1.80879998     -1.82456994     -0.29295999
+    -1.71091998     -2.01014996     -0.37757999
+     0.43305999     -2.68815994     -0.37799999
+    -0.22075000      2.74221992     -0.26170000
+    -2.61055994      0.48841000     -0.06204000
+     0.83173001     -2.83025002     -0.25424001
+     2.02739000     -2.07843995     -0.13512000
+    -2.47189999      1.51514995     -0.06362000
+    -2.39761996     -1.67157996      0.00000000
+    -2.59451008     -0.64112997      0.01542000
+    -2.29928994     -1.24570000      0.00670000
+    -0.85290998     -2.67701006      0.15228000
+     1.37521994     -2.40718007      0.19137999
+     2.06852007      1.77002001      0.21209000
+    -2.60197997     -0.16943000      0.02306000
+     1.03076005     -2.40882993      0.19128001
+    -1.67129004     -1.96072996      0.22482000
+     1.56722999      1.99398994      0.19643000
+     0.04658000      2.49786997      0.17614000
+     2.34574008      0.25832000      0.26664001
+    -2.03183007     -1.01479006      0.23892000
+    -2.07982993     -1.18947005      0.09085000
+    -2.09194994      0.29958999      0.10345000
+     2.39038992      0.92431003     -0.00000000
+    -1.46252000     -1.78532004     -0.06209000
+     0.42817000      2.46266007     -0.04470000
+    -1.52162004     -1.62532997     -0.27140999
+    -0.18513000     -2.43812990     -0.17197999
+    -2.21166992      0.89886999     -0.36831000
+     2.34565997     -0.71899998     -0.45122999
+     2.06234002     -1.51654994     -0.38141000
+    -1.31739998      2.27400994     -0.26690000
+     0.51526999      2.62367010     -0.22709000
+     2.58263993     -0.84236997     -0.20186000
+     2.18473005     -1.94280005     -0.35940999
+     1.12595999      2.54754996     -0.13461000
+     0.55686998     -2.89705992     -0.15587001
+     2.25250006     -1.53532004     -0.02678000
+     0.22465999     -3.07354999      0.00000000
+    -1.37570000      2.43506002      0.04183000
+    -2.64768004     -1.06342006      0.11276000
+    -1.92651999     -1.85912001      0.05614000
+    -2.69443989      0.37551999      0.13381000
+    -1.60662997     -2.32867002      0.39686999
+     0.65855998      2.61196995      0.28843001
+     1.72852004     -1.94989002      0.05459000
+    -1.81443000      1.84765995      0.09896000
+    -1.51842999     -1.99663997      0.28184000
+    -1.09132004     -2.19454002      0.25821999
+     2.24924994      0.87195998      0.20840000
+    -2.30463004     -0.97362000      0.07131000
+     2.42571998      0.28959000      0.06993000
+     2.14475989      0.12241000      0.09602000
+    -1.77995002     -1.31774998     -0.00000000
+     1.62732005     -1.39523005     -0.09702000
+     1.11335003      2.12090993     -0.09111000
+    -2.27153993      0.17561001     -0.23371001
+    -1.46224999     -1.74532998     -0.35881999
+     1.41584003      2.09284997     -0.12682000
+     1.87802994     -1.71526003     -0.17406000
+     2.06644011     -1.51267004     -0.37176999
+    -2.58412004      0.39589000     -0.13575000
+     2.47308993     -0.86167002     -0.05817000
+     1.83124995     -2.05936003     -0.26984999
+    -0.56908000     -2.85312009     -0.34353000
+     1.09253001      2.48459005     -0.08296000
+     1.33904004      2.33616996     -0.04128000
+    -1.88594997     -1.91280997     -0.01832000
+     1.89870000      1.93894994      0.00000000
+     2.46317005     -0.85329002      0.00144000
+     1.41088998      2.24886990      0.02440000
+    -2.78048992      0.67960000      0.19059999
+     2.26883006     -1.33754003      0.03748000
+    -1.97191000     -1.72151995      0.03055000
+    -2.10202003      1.65717995      0.23607001
+    -2.41044998      1.01471996      0.14579000
+     0.09510000      2.55053997      0.45370001
+    -2.35158992     -1.03812003      0.09069000
+     2.43299007      0.53929001      0.18698999
+     0.91762000     -2.16121006      0.27994001
+    -1.36117005      1.72365999      0.29330000
+     2.30182004      0.52464998      0.10647000
+     0.69053000      2.16907001      0.06880000
+    -0.75591999     -2.31594992     -0.00000000
+     1.75361001     -1.46293998     -0.06723000
+    -1.40108001      2.16295004     -0.01020000
+     0.23830000     -2.26253009     -0.23609000
+    -0.75116003     -2.24976993     -0.25338000
+     2.07843995     -1.42807996     -0.13551000
+     0.03978000     -2.55365992     -0.14168000
+     0.94396001     -2.41197991     -0.09401000
+    -2.18782997     -1.40995002     -0.02657000
+     2.10892010      1.56185997     -0.07479000
+     0.09682000      2.63226008     -0.05896000
+    -2.21938992     -1.39128995     -0.02157000
+     2.29268003     -1.90753996     -0.27788001
+     2.83729005      1.04211998     -0.18816000
+    -2.67429996      0.52670997     -0.02671000
+    -2.29313993     -1.39557004      0.00000000
+    -2.44220996     -1.43573999      0.04952000
+     1.21013999     -2.77022004      0.18832999
+    -2.79624009     -0.47035000      0.17112000
+    -0.34535000     -2.65297008      0.08369000
+    -0.24529999      2.74746990      0.27434999
+    -2.52805996     -0.61829001      0.00792000
+     2.37950993     -1.09211004      0.17282000
+     0.70665997      2.47373009      0.25988001
+    -2.07430005      1.48752999      0.14607000
+    -1.03969002     -2.20599008      0.27935001
+    -2.35260010      0.87483001      0.09996000
+    -0.71473998     -2.35946012      0.09783000
+     0.49810001      2.19746995      0.15440001
+    -0.11543000      2.26273990      0.07106000
+     2.16619992      0.22095001     -0.00000000
+     1.38364995     -1.84499002     -0.06245000
+    -0.99634999      2.06732011     -0.13584000
+    -2.22498012     -0.37867999     -0.24922000
+    -0.00332000      2.51427007     -0.09521000
+     2.21433997      1.09750998     -0.22273000
+     1.92867005     -1.59935999     -0.29074001
+    -2.50862002     -0.49544001     -0.40842000
+     2.55125999     -0.67290998     -0.36636001
+    -1.47827995      2.20612001     -0.17116000
+     2.50739002      0.70997000     -0.01033000
+     2.76161003      0.08811000     -0.18105000
+    -0.76841003      2.78234005     -0.20815000
+     1.20806003     -2.56115007     -0.10319000
+    -2.58335996      0.53548002     -0.00814000
+     1.02980006      2.64867997      0.00000000
+     2.32329988     -1.21370995      0.00451000
+     2.33928990      1.37179005      0.04980000
+    -0.68458003     -2.76373005      0.17964000
+     2.43836999      1.60958004      0.35729000
+     1.77740002     -1.95410001      0.07192000
+    -2.68603992      0.40904999      0.36011001
+     0.44716001     -2.56163001      0.00347000
+    -2.25534010     -1.21440005      0.36621001
+    -0.09683000     -2.45554996      0.43871000
+     1.97555006      1.36821997      0.34106001
+     2.42209005     -0.84741002      0.03771000
+    -0.38997999      2.47263002      0.07033000
+     0.93730003     -2.37857008      0.01933000
+    -0.05063000     -2.46390009      0.02882000
+     0.98773998      1.88841999     -0.00000000
+     0.17408000     -2.54677010     -0.01005000
+     2.19831991     -0.26216999     -0.17190000
+    -1.26195002      1.94663000     -0.20351000
+    -2.36361003      0.66237003     -0.16141000
+    -1.42858005     -2.07473993     -0.14029001
+    -2.08249998     -1.52288997     -0.06181000
+     2.25113010      1.26097000     -0.18796000
+     1.71780002      1.99741995     -0.32813001
+     2.05850005      1.80241001     -0.41879001
+    -2.30465007     -1.31358004     -0.09131000
+    -1.36333001     -2.41925001     -0.19652000
+    -1.13828003      2.75570989     -0.27721000
+     0.30313000     -2.63841009     -0.02483000
+     2.76980996      0.67907000     -0.05353000
+    -2.18200994      1.60002995      0.00000000
+    -2.56066990      0.78513002      0.01665000
+    -1.00134003      2.61281991      0.08821000
+     2.86118007      0.09774000      0.19097000
+     1.93274999      1.96265996      0.17165001
+     2.41308999      1.41046000      0.33785999
+     0.60571003     -2.63712001      0.32558000
+     2.23553991     -1.41425002      0.43122000
+     2.39872003      0.99665999      0.02346000
+    -2.53550005     -0.43553999      0.08423000
+     2.31288004     -1.12647998      0.04743000
+    -1.83023000      1.55332005      0.22153001
+    -1.49449003     -1.77021003      0.20581999
+    -2.34062004     -0.59178001      0.08269000
+     1.01857996     -2.08162999      0.06005000
+     2.19283009     -1.17783999     -0.00000000
+     0.58995003     -2.34387994     -0.03890000
+    -1.88347006      1.72712004     -0.01983000
+     0.87024999     -2.28309011     -0.11383000
+    -0.03913000     -2.28712010     -0.34711999
+     1.39718997     -1.94168997     -0.36003000
+    -0.55448002     -2.43964005     -0.30206001
+    -2.55416012     -0.25988999     -0.31062001
+    -2.62995005     -0.03968000     -0.28782001
+    -1.22827005     -2.29675007     -0.01402000
+     0.10270000     -2.74800992     -0.25968000
+     1.70078003      2.02979994     -0.05348000
+     0.97175997      2.74768996     -0.22848000
+     1.63922000     -2.43563008     -0.14954001
+     1.17850995      2.67825007     -0.06931000
+    -1.02270997      2.44772005      0.00000000
+     2.02513003     -1.70920002      0.01063000
+    -2.70151997      0.34512001      0.05497000
+     0.84389001      2.58197999      0.08456000
+    -1.59922004     -2.43934989      0.35188001
+     0.47863001      2.68439007      0.21950001
+     0.48824000     -2.70090008      0.44525999
+     1.64014006      2.03720999      0.14648999
+    -2.38006997     -0.95981002      0.32049000
+     1.79488003     -1.83102000      0.11073000
+    -1.12265003     -2.16938996      0.27252001
+     1.15411997     -2.02178001      0.30208999
+     0.37761000     -2.56080008      0.00836000
+    -1.95388997     -1.24699998      0.12560000
+     0.19186001     -2.21293998      0.08051000
+    -0.54763001      2.50239992     -0.00000000
+     1.83383000     -1.72189999     -0.01796000
+     1.05105996      2.19720006     -0.07317000
+    -2.29179001      0.85707998     -0.11130000
+    -1.54058003     -2.05245996     -0.03741000
+    -1.09117997      2.11808991     -0.37648001
+    -2.01553988     -1.61684000     -0.04954000
+     0.87937999     -2.40509009     -0.37281001
+    -2.10704994      1.55577004     -0.18239000
+    -2.07985997      1.62930000     -0.12943000
+    -2.12068009     -1.53353000     -0.02955000
+     2.23602009     -1.59154999     -0.16058999
+     2.10946989     -1.95043004     -0.19833000
+    -2.72982001      0.68900001     -0.09592000
+    -0.71390998      2.61402011     -0.02333000
+     0.07129000      2.88748002      0.00000000
+    -0.84107000      2.52528000      0.01311000
+    -0.00986000     -2.81929994      0.09765000
+    -2.66731000      0.23750000      0.05657000
+     1.67119002     -2.04967999      0.04956000
+    -0.70901000      2.54939008      0.07992000
+     2.73873997      0.04867000      0.42833999
+    -0.63700998      2.56433010      0.40209001
+    -1.50072002     -2.07901001      0.34187999
+     1.17123997      2.31350994      0.02127000
+     2.32957006     -0.60255998      0.33561000
+     1.75355995      1.50654995      0.32001999
+     0.58319002      2.11905003      0.29218999
+    -2.23608994     -0.51629001      0.13583000
+    -2.14439988      0.46754000      0.08613000
+     1.74977005     -1.40500998     -0.00000000
+    -2.07450008      1.40473998     -0.02011000
+     1.32815003     -2.15257001     -0.03146000
+    -1.13954997     -2.19028997     -0.09518000
+    -1.38879001      1.98407996     -0.19787000
+    -2.35238004      0.64766997     -0.27728999
+    -0.51919001     -2.47504997     -0.21878000
+    -2.51332998     -0.66452998     -0.00291000
+    -0.30570000      2.59205008     -0.09529000
+    -0.92962003     -2.50146008     -0.21118000
+     0.23653001      2.75312996     -0.28279001
+     0.52324998      2.66600990     -0.12980001
+    -2.76121998     -0.24967000     -0.12532000
+    -1.45413995      2.18308997     -0.01026000
+     2.48497009      1.67330003     -0.08414000
+     2.24175000     -2.13146996      0.00000000
+    -2.71462989     -0.36480999      0.02955000
+     1.17474997      2.50202990      0.07306000
+    -2.73160005      1.10160995      0.25092000
+    -1.16835999     -2.61379004      0.29212999
+    -1.99075997      1.72643006      0.06077000
+    -2.34233999      1.16480005      0.04916000
+    -2.14037991     -1.56342995      0.48120001
+     1.97616005      1.61884999      0.43215999
+     1.33555996      2.08489990      0.38166001
+    -0.96709001      2.30654001      0.17134000
+    -2.32863998      0.66558999      0.19780000
+    -0.06923000     -2.20652008      0.28509000
+     2.47409010     -0.65592998      0.01800000
+     2.55270004      0.33076999      0.00552000
+     1.72262001     -1.28690004     -0.00000000
+     2.32082009      0.59148997     -0.04357000
+     1.00996006      2.28644991     -0.04471000
+     0.41664001     -2.31082010     -0.18302999
+     2.18846989      1.09159005     -0.17148000
+    -2.08958006      1.34498000     -0.19915999
+    -1.98220003     -1.47520995     -0.39732000
+    -2.38714004     -1.00335002     -0.10056000
+     0.86495000     -2.48915005     -0.33443999
+     2.47730994      1.19096994     -0.45772001
+    -2.66336989      0.41902000     -0.16650000
+    -1.83082998      2.26374006     -0.34588000
+     2.28936005     -1.31823003     -0.03034000
+     2.43690991     -1.74962997     -0.17806999
+     1.09136999      2.84874010     -0.09579000
+     2.38367009     -1.14595997      0.00000000
+     1.32483995     -2.77343011      0.10067000
+    -2.59818006     -0.14379001      0.00096000
+     1.02762997      2.51427007      0.08440000
+    -1.87012994     -1.93025994      0.09731000
+    -0.02166000     -2.60903001      0.01580000
+    -0.46744999     -2.61266994      0.16667999
+     1.81417000     -1.88320994      0.14179000
+    -2.42518997     -0.83437997      0.33577999
+     2.41570997     -0.65745002      0.29675999
+    -1.61462998     -1.89787996      0.18743999
+     2.26346993      0.12198000      0.37009999
+    -1.45845997      1.68121004      0.27197000
+     2.01218009      1.44816995      0.05382000
+     0.77447999     -2.33242989      0.03026000
+     0.87440997      2.05700994     -0.00000000
+    -1.90076995      1.76900995     -0.00072000
+    -0.70279002     -2.07806993     -0.18089999
+     2.23543000      0.16436000     -0.26049000
+     1.06051004      2.13752007     -0.23751000
+     1.41348004      1.90067995     -0.40070000
+    -1.10975003     -2.20169997     -0.41373000
+    -0.41635001      2.53744006     -0.27236000
+     1.48298001      2.18811011     -0.41204000
+     0.44227001      2.57980990     -0.05369000
+    -2.69168997      0.82472003     -0.37272999
+    -2.64112997     -0.78145999     -0.17139000
+     1.84582996     -2.32407999     -0.26730001
+    -2.29882002      1.98422003     -0.19444001
+     1.23505998      2.39174008     -0.01951000
+     0.04947000      2.77963996      0.00000000
+     2.52423000     -1.44201005      0.06527000
+    -1.93393004      2.13562012      0.12517001
+    -2.73680997     -0.30024001      0.11133000
+    -2.83203006     -0.03266000      0.25791001
+     2.74486995      0.31173000      0.28149000
+    -1.97960997     -1.84660995      0.32986999
+    -2.62567997     -0.33368000      0.44521999
+     0.13828000      2.56097007      0.33581001
+    -0.41157001     -2.49451995      0.22082999
+     0.60806000     -2.48245001      0.07649000
+    -1.13211000      2.21579003      0.12411000
+    -1.63584006     -1.92525005      0.05349000
+     0.10525000      2.58663011      0.00500000
+     1.54886997      1.82772005      0.04342000
+     0.56538999      2.34001994     -0.00000000
+     0.44126001     -2.49791002     -0.01348000
+     2.52513003      0.20930000     -0.02948000
+    -0.07261000     -2.38427997     -0.15593000
+    -2.48939991     -0.37419000     -0.09177000
+     0.39100000      2.43335009     -0.23458000
+     1.97072995     -1.48829997     -0.40140000
+     0.23560999      2.56740999     -0.20744000
+    -0.17360000     -2.61917996     -0.23712000
+     2.23301005      1.46668005     -0.22037999
+     2.63017011     -1.01767004     -0.38137001
+    -1.71283996     -2.07307005     -0.09899000
+     0.59601003      2.64615989     -0.08170000
+    -2.66308999      0.89455998     -0.09320000
+    -0.93647999      2.73074007     -0.06097000
+     2.03230000     -2.00864005      0.00000000
+     2.87407994     -0.51429999      0.06796000
+    -1.87669003     -2.40416002      0.20031001
+     0.83080000     -2.62949991      0.11452000
+    -2.69499993     -0.26383999      0.11981000
+    -1.81993997     -2.10815001      0.32051000
+     1.76373994     -2.02110004      0.25378999
+    -2.24832010     -1.31612003      0.04954000
+     2.46106005     -0.78454000      0.16099000
+    -2.29959989     -1.19876003      0.02063000
+     0.57217002     -2.40339994      0.22418000
+     2.18292999     -1.12777996      0.15876999
+     0.54153001     -2.48552990      0.04081000
+    -0.69123000     -2.39605999      0.04730000
+    -2.12766004     -1.48764002      0.00082000
+     0.99422997     -2.14418006     -0.00000000
+    -2.19064999     -0.31499001     -0.08222000
+     1.76410997      1.80458999     -0.03401000
+     0.36058000     -2.19621992     -0.27200001
+    -2.34421992     -0.87585002     -0.10829000
+     0.03267000      2.55139995     -0.08382000
+     2.53190994      0.50951999     -0.05333000
+    -0.36539000     -2.54168010     -0.30625999
+     0.62672001      2.55983996     -0.33722001
+     2.52845001     -1.00752997     -0.37483999
+    -0.49478000     -2.73736000     -0.31472999
+    -0.97030997      2.64355993     -0.23989999
+     1.49364996      2.17253995     -0.02649000
+     0.64342999     -2.92258000     -0.17478000
+    -1.22900999      2.50096989     -0.03967000
+     1.79533005     -1.97748995      0.00000000
+     1.70560002     -2.20890999      0.04055000
+     2.77993011     -1.25064003      0.19960000
+    -2.70163012     -1.01681995      0.20826000
+     2.20015001     -1.45585001      0.04243000
+     2.63873005      0.00078000      0.06709000
+    -0.92479002      2.43519998      0.01505000
+    -0.27873999      2.58685994      0.01742000
+    -1.54544997     -2.05962992      0.23812000
+    -0.57503998     -2.44249010      0.27923000
+    -0.26769000      2.47689009      0.18825001
+    -0.94313002      2.21589994      0.21296000
+     2.10963011      1.16641998      0.13760000
+    -1.14319003     -1.88545001      0.17589000
+    -0.99246001      1.87084997      0.10249000
+     0.05541000      2.50190997     -0.00000000
+     1.77216005      1.83431995     -0.01051000
+    -2.21417999     -1.30941999     -0.01230000
+     2.20783997      1.26074004     -0.04182000
+     0.27127999     -2.25266004     -0.36769000
+    -0.09813000      2.40572000     -0.33304000
+     1.54674995      1.98036003     -0.26831999
+     0.80871999     -2.44837999     -0.20465000
+    -2.12925005     -1.53253996     -0.22293000
+     2.04499006     -1.68268001     -0.14860000
+     2.57393003      0.58416998     -0.06822000
+    -0.04727000     -2.71654010     -0.12988999
+    -0.35543999     -2.91317010     -0.24323000
+     1.14792001     -2.53186011     -0.08011000
+    -0.94436002     -2.49858999     -0.01511000
+    -2.23589993      2.10296988      0.00000000
+    -1.53102005      2.40178990      0.05277000
+     2.92728996      0.75331002      0.18818000
+    -2.41090989     -1.09908998      0.03605000
+     2.47169995      1.11802995      0.12527999
+     2.04188991      1.73740995      0.14034000
+     2.07274008      1.63448000      0.12206000
+     2.02223992     -1.70860004      0.45104000
+    -1.26537001     -2.24208999      0.24247999
+    -1.54525006      1.98263001      0.26565000
+     0.77517998     -2.37917995      0.16926000
+    -0.50942999     -2.36257005      0.20338000
+    -0.14507000     -2.41488004      0.13133000
+    -1.65792000      1.65845001      0.11352000
+     1.38639998     -2.16041994      0.00701000
+    -0.71604002     -2.38446999     -0.00000000
+     2.57643008      0.10408000     -0.00456000
+    -0.35058001     -2.55481005     -0.00946000
+     2.43385005     -0.47681999     -0.08710000
+     1.25834000      2.26112008     -0.01368000
+    -1.69044006     -1.88190997     -0.12184000
+    -1.59540999      1.90612996     -0.35179001
+    -2.51337004     -0.61268997     -0.12395000
+    -1.57620001     -2.08129001     -0.10257000
+    -0.21378000     -2.59154010     -0.00105000
+     0.25602999     -2.72223997     -0.23254000
+    -2.16121006      1.71817994     -0.17877001
+     2.28958988      1.34223998     -0.03925000
+     2.52716994     -1.22821999     -0.09342000
+    -1.06513000     -2.77886009     -0.07992000
+    -2.75800991     -0.46934000      0.00000000
+     2.85455990     -0.18890999      0.05543000
+    -2.71685004      1.09135997      0.14597000
+    -2.42512989     -1.32857001      0.12003000
+     2.83930993      0.25310001      0.27829000
+    -2.60000992      0.93172997      0.28044999
+     2.67525005      0.51598001      0.38335001
+    -1.99927998      1.70827997      0.28263000
+     2.44232011      0.88642001      0.01706000
+     0.38234001     -2.44790006      0.37676999
+     2.40050006      0.56063998      0.23365000
+    -1.17439997      2.15732002      0.15963000
+     2.41208005      0.31562001      0.12159000
+    -1.99827003     -0.83745003      0.19294000
+     1.72926998     -1.77112997      0.02650000
+    -0.48651001     -2.35020995     -0.00000000
+    -1.32245004     -1.82555997     -0.07350000
+     2.33686996     -1.04321003     -0.01819000
+    -2.13019991      1.08921003     -0.15075000
+    -2.45292997      0.03319000     -0.16309001
+    -0.17636000      2.35764003     -0.40836999
+     2.18590999      1.32251000     -0.13895001
+    -0.01246000     -2.57519007     -0.23573001
+     1.69159997     -2.02951002     -0.40011999
+    -2.69442010     -0.14182000     -0.30208001
+    -2.24404001     -1.56562996     -0.23593999
+     1.32384002      2.59133005     -0.34419000
+     2.64477992     -0.42743000     -0.05747000
+    -1.52513003      2.40235996     -0.10934000
+     1.66753995      2.12889004     -0.02216000
+     0.80097997     -2.92312002      0.00000000
+    -2.13544011     -1.83653998      0.04603000
+    -2.58771992     -1.19304001      0.11108000
+    -2.94058990     -0.60354000      0.29199001
+     2.43179011      0.94805998      0.01117000
+    -2.44246006      1.10371006      0.13902000
+     2.64213991     -0.45006999      0.24682000
+    -1.99761999     -1.72256994      0.35921001
+     2.57281995     -0.11144000      0.23562001
+    -2.48625994     -0.42616001      0.23847000
+     1.98881996      1.62616003      0.05368000
+     2.39946008      0.71947998      0.10550000
+     2.46339011      0.80491000      0.00613000
+    -2.40158010      0.31174999      0.07937000
+    -2.14155006     -0.82499999      0.06484000
+    -1.93043005     -1.46677005     -0.00000000
+    -2.48374009      0.22754000     -0.02250000
+     0.70102000     -2.47797990     -0.01103000
+     0.19641000     -2.46025991     -0.09584000
+     2.22122002      0.68703002     -0.30537000
+    -1.53425002      1.94840002     -0.20793000
+     1.58895004      1.99329996     -0.15660000
+     2.56045008     -0.01221000     -0.37599999
+     2.51325989      0.84613001     -0.49346000
+     0.33734000      2.66816998     -0.27519000
+    -2.68274999      0.10403000     -0.14681999
+    -0.81478000     -2.65867996     -0.20072000
+    -2.07963991     -2.02770996     -0.22127999
+    -2.45438004     -0.99072999     -0.02083000
+     1.65274000      2.08229995     -0.01243000
+    -0.44400001     -2.93998003      0.00000000
+    -2.65773010      0.49533001      0.02200000
+     2.64801002     -0.62532002      0.05380000
+    -0.28712001      2.87930012      0.21330000
+    -2.27789998     -1.45867002      0.11651000
+    -2.71071005     -0.83603001      0.40998000
+     0.73475999     -2.60505009      0.32835001
+    -0.43156001      2.60595012      0.39432999
+    -2.43908000      0.84976000      0.16300000
+     0.54966003     -2.43417001      0.32176000
+     2.10606003     -1.40230000      0.12089000
+     2.38454008      0.23598000      0.22634999
+     0.98868001     -2.12268996      0.18771000
+    -1.57123995      1.84872997      0.07737000
+    -0.13106000     -2.34920001      0.05253000
+    -2.36635995     -0.00028000     -0.00000000
+    -0.02636000      2.12509990     -0.10091000
+    -1.08112001     -2.25609994     -0.04374000
+     0.20532000      2.20833993     -0.27764001
+     2.16497993     -0.84403002     -0.30688000
+    -0.12849000      2.47455001     -0.21151000
+     0.36853001     -2.56562996     -0.02473000
+     1.12140000      2.34291005     -0.02428000
+     1.47985995     -2.17740989     -0.31108001
+    -1.92679000      1.88769996     -0.29975000
+    -0.86074001      2.52828002     -0.12260000
+     2.28076005     -1.45690000     -0.11813000
+     2.25714993     -1.81256998     -0.21422000
+     2.61590004     -0.73136002     -0.05174000
+     2.27406001      1.86537004     -0.07253000
+     0.17822000     -2.89920998      0.00000000
+     1.32622004      2.24300003      0.00122000
+    -2.61575007     -1.43905997      0.17162000
+     0.42535999      2.89875007      0.23961000
+     0.63773000     -2.57838988      0.06229000
+    -1.64970005     -2.02472997      0.02029000
+    -1.48212004     -2.21357989      0.19682001
+     2.14984989      1.53849995      0.41523999
+    -2.48100996      0.59201002      0.46935001
+    -2.39517999      0.60461998      0.39912999
+    -2.15206003     -1.08317006      0.33033001
+     1.75101995      1.69661999      0.17975000
+     2.26688004      1.26101995      0.00435000
+     0.60067999      2.51209998      0.00761000
+    -0.29455000      2.42470002      0.03347000
+    -0.24093001     -2.57423997     -0.00000000
+     1.96186996     -0.90311998     -0.09358000
+     2.28924990      0.59938002     -0.10400000
+    -0.09304000     -2.49003005     -0.07864000
+    -1.12219000      2.14611006     -0.19791999
+    -2.16535997      0.93355000     -0.41909999
+    -2.26997995     -1.23854995     -0.04342000
+    -1.88880002      1.73475003     -0.33732000
+     2.36614990     -1.18017006     -0.41993001
+    -1.91339004     -1.84755003     -0.18403000
+    -1.06989002     -2.42344999     -0.08506000
+     1.68852997      2.32044005     -0.29960999
+    -1.14415002     -2.43821001     -0.06779000
+     1.29993999     -2.71239996     -0.18156999
+    -0.29980001      2.62715006     -0.00939000
+     0.57076001      2.53823996      0.00000000
+     1.95454001      1.82113004      0.01519000
+     2.19563007     -1.52477002      0.03257000
+    -1.57091999     -2.39221001      0.19028001
+    -2.63221002      1.28535998      0.36570001
+     1.19734001      2.54847002      0.37365001
+     2.59506989     -0.80602998      0.36120999
+     2.50996995     -0.74236000      0.16599999
+    -2.36227012      0.97081000      0.43788999
+     1.12784004      2.33231997      0.02861000
+    -0.26326001      2.36988997      0.37332001
+    -0.10174000      2.45822001      0.15513000
+    -1.08869004     -1.93596005      0.27530000
+    -1.41884005     -1.90629995      0.09957000
+     1.03155994     -1.88850999      0.09525000
+    -2.25922990     -1.24137998     -0.00000000
+     1.97511995     -1.09423006     -0.07270000
+     0.81224000      2.07051992     -0.16734999
+     1.43294001     -1.74372005     -0.24923000
+    -2.46052003      0.46417001     -0.10671000
+     1.20396996     -2.11928010     -0.28163999
+     1.45577002      2.00630999     -0.37294999
+    -2.19074988      1.39006996     -0.05188000
+     1.94879997      1.78734004     -0.42164999
+     2.63395000     -0.25018999     -0.14097001
+     2.23144007     -1.45360005     -0.10935000
+     1.44252002      2.22905993     -0.06119000
+    -1.41333997     -2.57177997     -0.24307001
+     2.20627999      1.63378000     -0.06471000
+    -1.24248004      2.79129004     -0.09678000
+     0.29752001      3.03375006      0.00000000
+     2.64333010     -0.41218999      0.01600000
+    -2.20393991     -1.51736999      0.03374000
+     2.75469995     -0.40446001      0.13384999
+     2.73909998      0.23992001      0.16614000
+    -0.13028000     -2.80851007      0.36638001
+     2.23960996      1.57493997      0.42451000
+    -1.79287004     -1.91944003      0.25239000
+     2.56044006     -0.04743000      0.37222999
+    -1.50672996      1.92972004      0.46696001
+     2.43352008      0.70684999      0.11415000
+     0.24596000      2.51991010      0.07564000
+    -2.01126003      0.97267002      0.26583999
+     2.31448007      0.45107001      0.10774000
+     0.41435999      2.39456010      0.03610000
+    -2.29973006      0.57865000     -0.00000000
+     0.09138000      2.38493991     -0.04534000
+    -1.69799995     -1.42446995     -0.17080000
+    -1.89319003     -1.41272998     -0.17278001
+    -0.67234999      2.29756999     -0.22886001
+     2.52807999      0.56532001     -0.01643000
+    -2.50658989      0.60903001     -0.06303000
+     2.35268998     -1.09531999     -0.04599000
+    -1.68675995     -2.04188991     -0.46131000
+     1.49073994     -2.31544995     -0.47345001
+     2.37929010     -1.51654005     -0.38365999
+    -0.15361001      2.64379001     -0.05358000
+     2.43386006      1.53620005     -0.20206000
+     2.53140998      0.80037999     -0.02445000
+     0.55754000      2.67529011     -0.02822000
+    -2.87807989      0.59547001      0.00000000
+    -0.39447999     -2.92143011      0.07396000
+     2.07563996      1.81184006      0.06909000
+    -2.74090004     -0.91543001      0.21050000
+     2.59021997     -1.26645005      0.31457999
+    -1.40250003      2.47028995      0.41683000
+     2.03716993     -1.80641997      0.37768999
+     2.18383002      1.48802996      0.40537000
+     1.93982995     -1.67293000      0.36564001
+    -0.11089000     -2.48508000      0.34608001
+    -0.29132000     -2.41937995      0.28257999
+    -1.71299005     -1.48754001      0.36792001
+     0.67093003     -2.21613002      0.20672999
+    -0.97131002     -1.98932004      0.17195000
+     0.96538001     -1.93480003      0.09304000
+     1.82059002      1.64607000     -0.00000000
+    -1.95997000     -0.96901000     -0.08791000
+     2.28574991      0.03767000     -0.13977000
+     0.93860000      2.18267989     -0.16279000
+    -2.10584998      1.45954001     -0.04198000
+    -1.95940995      1.41354001     -0.31858000
+     2.27279997      1.16930997     -0.13556001
+    -2.54526997     -0.48503000     -0.08494000
+     2.11838007      1.54472005     -0.20721000
+     2.26897001     -1.51862001     -0.40096000
+     1.69825006      2.17473006     -0.27585000
+    -2.85268998      0.07589000     -0.28176001
+    -1.89517999     -1.94876003     -0.08598000
+    -2.66037011      0.65276003     -0.06201000
+     1.77157998      2.08966994     -0.02967000
+
+CELLS 9216 46080
+4 751 1441 720 721
+4 5 1386 36 35
+4 1562 34 33 63
+4 64 1562 34 63
+4 722 751 1441 721
+4 122 123 967 153
+4 6 5 1386 36
+4 1596 1562 34 35
+4 962 3 1386 4
+4 962 5 1386 4
+4 1564 64 1562 63
+4 1000 881 1091 11
+4 32 1562 33 63
+4 273 994 904 1050
+4 273 994 274 904
+4 42 1600 1181 41
+4 10 1000 1091 11
+4 10 881 880 11
+4 10 1000 881 11
+4 10 1000 881 880
+4 1748 1181 1661 1386
+4 1748 7 8 1386
+4 62 32 1562 63
+4 94 95 64 1294
+4 65 95 64 1294
+4 65 1564 64 1562
+4 65 1562 34 35
+4 65 64 1562 34
+4 1387 994 274 904
+4 156 125 126 967
+4 1095 1720 1302 1033
+4 1269 1024 1086 1416
+4 931 1776 813 1410
+4 931 811 1410 810
+4 783 782 813 1410
+4 783 1776 813 1410
+4 781 782 811 1410
+4 781 780 1410 810
+4 781 811 1410 810
+4 812 782 813 1410
+4 812 782 811 1410
+4 812 931 813 1410
+4 812 931 811 1410
+4 1140 1412 1443 1715
+4 152 122 967 153
+4 901 690 1620 720
+4 901 1620 720 721
+4 901 722 1620 721
+4 901 692 722 721
+4 901 723 722 1620
+4 901 723 692 722
+4 254 253 283 1033
+4 943 1274 1033 1155
+4 1752 1269 1086 1416
+4 1752 1269 1024 1416
+4 1752 401 402 941
+4 1752 371 401 370
+4 375 374 1752 404
+4 1421 1394 1689 941
+4 1421 1394 1755 941
+4 1477 458 1296 459
+4 340 371 1331 370
+4 1243 44 45 1275
+4 1243 44 43 1275
+4 1243 42 1600 1181
+4 997 65 1564 1562
+4 997 1596 36 35
+4 997 65 36 35
+4 997 1596 1562 35
+4 997 65 1562 35
+4 997 1181 1596 1661
+4 1451 10 41 11
+4 1451 42 41 11
+4 1451 42 1181 41
+4 1451 10 1091 11
+4 1451 38 8 1386
+4 1451 1748 8 1386
+4 1451 1748 1181 1386
+4 1451 1181 1596 1386
+4 1451 38 1596 1386
+4 1451 42 1181 43
+4 1451 1748 1181 1661
+4 1451 10 1000 1091
+4 1451 1748 1000 1091
+4 1451 1748 10 1000
+4 1451 997 1181 1596
+4 1451 997 38 1596
+4 1451 914 1661 1091
+4 37 38 1596 1386
+4 37 1596 1386 36
+4 37 7 8 1386
+4 37 38 8 1386
+4 37 6 1386 36
+4 37 7 6 1386
+4 37 997 1596 36
+4 37 997 38 1596
+4 37 997 38 67
+4 1628 914 1661 1091
+4 1628 1451 1661 1091
+4 1628 1451 1748 1091
+4 1628 1451 1748 1661
+4 1628 1748 1000 1091
+4 12 13 883 1091
+4 12 1451 1091 11
+4 12 1451 13 1091
+4 12 1451 42 11
+4 12 1451 42 43
+4 12 1451 13 43
+4 12 42 41 11
+4 489 1448 490 520
+4 489 1477 490 459
+4 489 1477 488 1448
+4 489 1477 458 459
+4 489 1477 488 458
+4 1325 62 1294 63
+4 1325 64 1294 63
+4 1325 1564 64 63
+4 1325 65 64 1294
+4 1325 65 1564 64
+4 1566 1292 1294 960
+4 1324 125 124 967
+4 1324 123 124 967
+4 244 273 274 904
+4 244 1387 274 904
+4 965 994 904 1050
+4 965 1387 994 904
+4 1657 244 1387 904
+4 1657 244 1387 245
+4 282 253 283 1033
+4 282 1095 283 1033
+4 282 1095 1720 1033
+4 1057 158 969 159
+4 968 125 126 967
+4 968 1324 125 967
+4 909 1324 1357 967
+4 909 968 1324 967
+4 160 1057 190 159
+4 160 1057 969 159
+4 160 1057 969 190
+4 155 156 125 967
+4 155 156 1715 967
+4 155 185 184 1715
+4 155 185 1715 186
+4 155 156 1715 186
+4 1419 158 969 159
+4 1419 160 969 159
+4 188 1057 158 159
+4 1694 1095 1302 1365
+4 1694 1095 1274 1033
+4 1694 1095 1302 1033
+4 1694 1720 1302 1033
+4 255 1095 285 1033
+4 255 254 285 1033
+4 1088 1095 1302 1365
+4 1320 1269 1024 1086
+4 878 879 1000 8
+4 878 1748 1000 8
+4 814 783 1776 813
+4 814 815 1776 785
+4 814 931 1776 813
+4 814 931 1776 1327
+4 1054 783 1776 1410
+4 1054 783 782 1410
+4 1054 783 782 1531
+4 1054 781 1531 1410
+4 1054 781 782 1410
+4 1054 781 782 1531
+4 752 1174 900 1531
+4 752 1174 900 1441
+4 752 722 751 1441
+4 579 550 580 549
+4 420 1592 1770 421
+4 1204 905 1651 1296
+4 1290 1140 1412 1443
+4 1290 1140 1443 1715
+4 691 1200 901 690
+4 691 1200 901 692
+4 691 901 692 721
+4 691 901 720 721
+4 691 901 690 720
+4 750 751 1441 720
+4 603 572 602 1502
+4 284 1095 283 1033
+4 284 254 283 1033
+4 284 1095 285 1033
+4 284 254 285 1033
+4 284 255 254 285
+4 128 909 968 967
+4 128 1419 158 967
+4 1271 1421 1658 941
+4 487 1477 488 458
+4 516 487 517 486
+4 1393 491 461 492
+4 1393 491 1448 490
+4 405 375 1752 404
+4 405 375 374 404
+4 1665 1477 461 915
+4 961 420 1770 421
+4 961 420 451 421
+4 961 905 423 453
+4 454 905 423 453
+4 454 961 905 453
+4 460 1477 490 459
+4 460 1665 1477 461
+4 460 491 461 490
+4 460 1477 491 490
+4 460 1477 491 461
+4 460 431 461 1689
+4 456 487 1477 486
+4 430 431 1689 941
+4 430 460 431 1689
+4 430 460 431 461
+4 403 1752 402 941
+4 403 1394 1752 941
+4 403 1394 1752 404
+4 14 44 13 43
+4 910 1628 1748 1661
+4 74 44 45 75
+4 74 1243 45 75
+4 74 1243 44 45
+4 74 1243 44 43
+4 68 997 38 67
+4 68 97 1777 67
+4 39 1451 38 8
+4 39 1451 997 1181
+4 39 1451 997 38
+4 1185 1328 1598 1624
+4 1084 1628 1748 1386
+4 1501 1652 1743 1741
+4 1501 871 870 962
+4 1626 1652 1743 1741
+4 1626 1084 1743 1741
+4 1626 1501 1652 1743
+4 1626 1628 1748 1000
+4 1626 1084 1628 1000
+4 1626 1084 1628 1748
+4 1626 1084 1748 1386
+4 1626 1084 962 1386
+4 1626 1084 1743 962
+4 1626 1501 1743 962
+4 1535 1628 1748 1386
+4 1535 910 1628 1748
+4 1535 1628 914 1661
+4 1535 910 914 1661
+4 1535 910 1628 1661
+4 1423 1626 1652 1741
+4 882 1000 881 1091
+4 882 1000 883 1091
+4 882 12 883 1091
+4 882 881 1091 11
+4 882 12 1091 11
+4 882 12 881 11
+4 821 792 822 1001
+4 821 791 792 1001
+4 519 488 518 1448
+4 519 489 488 1448
+4 519 489 1448 520
+4 1300 102 1391 103
+4 66 1325 65 1564
+4 66 997 1564 67
+4 66 997 65 1564
+4 66 997 65 36
+4 66 1325 65 1294
+4 66 96 1325 1294
+4 66 37 36 67
+4 66 37 997 67
+4 66 37 997 36
+4 66 65 95 1294
+4 66 96 95 1294
+4 66 65 36 35
+4 93 62 1294 63
+4 93 62 1294 92
+4 93 64 1294 63
+4 93 94 64 1294
+4 127 968 126 967
+4 127 128 968 967
+4 127 128 158 967
+4 127 156 126 967
+4 1453 1300 1566 1777
+4 1453 1566 1777 1292
+4 1484 135 1035 1391
+4 194 1244 195 1455
+4 819 849 1001 1327
+4 819 849 1001 820
+4 101 100 1391 130
+4 101 1300 100 1391
+4 101 1300 102 1391
+4 216 1115 215 245
+4 272 273 994 1050
+4 272 271 994 1050
+4 272 271 242 1050
+4 272 242 904 1050
+4 272 273 904 1050
+4 272 273 242 904
+4 1112 302 331 301
+4 1112 300 331 301
+4 1112 330 300 331
+4 906 1208 1472 990
+4 906 1112 1472 990
+4 1064 282 1095 283
+4 1064 284 1095 283
+4 1064 284 1095 285
+4 938 1095 1720 1302
+4 938 1657 1302 904
+4 938 1657 1387 904
+4 938 1088 1095 1302
+4 938 1302 904 1365
+4 938 1088 1302 1365
+4 938 282 1095 1720
+4 938 1385 904 1365
+4 938 1385 1088 1365
+4 938 1420 965 1387
+4 938 1420 1088 965
+4 938 965 1387 904
+4 938 1385 965 904
+4 938 1385 1088 965
+4 1653 244 1115 245
+4 1653 1657 1115 245
+4 1653 1657 244 245
+4 1653 1657 244 904
+4 1653 242 904 1050
+4 1653 932 904 1050
+4 1653 930 1115 242
+4 1653 932 240 1050
+4 1653 930 1115 1380
+4 1653 930 240 1380
+4 1653 932 240 1380
+4 1653 1115 1470 1380
+4 1653 932 1470 1380
+4 1653 932 1115 1470
+4 241 1653 930 242
+4 241 1653 930 240
+4 241 1653 242 1050
+4 241 1653 240 1050
+4 241 271 242 1050
+4 241 240 270 1050
+4 241 271 270 1050
+4 1149 1419 969 967
+4 1149 1419 912 969
+4 1149 972 912 1681
+4 1149 972 912 969
+4 1149 1419 909 967
+4 1053 972 1681 1389
+4 1053 1149 972 1681
+4 1053 1149 972 969
+4 1053 1149 969 967
+4 1053 969 1715 967
+4 1053 1057 969 1715
+4 1053 1149 1357 967
+4 1053 1715 967 153
+4 1053 152 967 153
+4 1145 1412 1443 1715
+4 1145 1057 1443 1715
+4 1145 1053 1412 1715
+4 1145 1053 1057 1715
+4 1175 93 1294 92
+4 1175 93 94 1294
+4 1175 968 1324 125
+4 1175 93 94 123
+4 1175 93 122 92
+4 1175 125 94 95
+4 1175 94 123 124
+4 1175 1324 123 124
+4 1175 1324 122 123
+4 1175 93 122 123
+4 1175 125 94 124
+4 1175 1324 125 124
+4 1691 1175 968 1324
+4 1691 1484 1035 1391
+4 1691 909 968 1324
+4 1179 909 1357 1063
+4 1179 1149 909 912
+4 1179 909 1357 967
+4 1179 1149 1357 967
+4 1179 1149 909 967
+4 132 101 102 1391
+4 1305 194 195 1455
+4 154 1715 967 153
+4 154 155 1715 967
+4 154 184 1715 153
+4 154 155 184 1715
+4 154 123 967 153
+4 154 123 124 967
+4 154 125 124 967
+4 154 155 125 967
+4 189 1057 190 159
+4 189 188 1057 159
+4 341 340 371 1331
+4 1597 366 367 337
+4 1597 1269 1415 1331
+4 1597 1208 1415 1331
+4 1597 906 1208 1331
+4 735 705 704 1364
+4 105 1094 1035 1391
+4 105 135 1035 1391
+4 1650 1200 1771 660
+4 1154 705 704 1364
+4 1567 814 1776 1327
+4 1567 814 815 1327
+4 1567 814 815 1776
+4 1567 819 1001 1327
+4 1567 788 817 787
+4 784 1054 1776 785
+4 784 1054 783 1776
+4 784 814 1776 785
+4 784 814 783 1776
+4 1506 784 1054 785
+4 1506 1054 1174 1531
+4 1506 1054 1776 785
+4 610 579 609 580
+4 757 756 787 998
+4 757 756 726 998
+4 754 1506 784 785
+4 754 784 1054 783
+4 754 1506 1054 1174
+4 754 1506 784 1054
+4 391 420 1592 390
+4 391 420 1592 421
+4 1233 1592 1770 421
+4 1233 1595 1321 1592
+4 1233 1204 905 1651
+4 1233 1204 1770 1651
+4 1233 1204 1770 905
+4 1233 1595 1321 1658
+4 1688 458 428 1296
+4 1688 429 458 428
+4 1688 458 1296 459
+4 1688 429 458 459
+4 1688 460 1296 459
+4 1688 430 429 459
+4 1688 430 429 1689
+4 1688 398 397 428
+4 1688 430 460 459
+4 1688 430 460 1689
+4 1206 185 184 1715
+4 1206 185 1715 186
+4 1206 216 185 186
+4 1206 216 215 185
+4 1206 216 217 186
+4 1206 218 188 217
+4 1206 189 218 188
+4 183 1206 184 1715
+4 183 1206 1140 1715
+4 183 184 1715 153
+4 61 30 1562 60
+4 61 31 30 1562
+4 61 62 32 1562
+4 61 31 32 1562
+4 1051 931 811 810
+4 1051 812 931 811
+4 1051 812 931 813
+4 1051 814 931 813
+4 1051 814 931 1327
+4 840 1051 811 810
+4 332 1112 302 331
+4 1621 542 572 541
+4 1621 572 1116 1502
+4 661 1650 1771 660
+4 661 1650 660 630
+4 661 1650 631 630
+4 661 1200 1771 660
+4 662 661 1200 1771
+4 662 661 1650 631
+4 662 661 1650 1771
+4 1326 1684 901 1297
+4 1326 1512 1684 1297
+4 91 62 1294 92
+4 91 61 62 1294
+4 574 544 575 1116
+4 1746 97 1777 67
+4 1746 1325 1777 67
+4 1746 96 1325 1294
+4 1746 66 96 97
+4 1746 66 96 1325
+4 1746 66 97 67
+4 1746 66 1325 67
+4 1746 1325 1292 1294
+4 1746 1325 1777 1292
+4 1746 96 95 1294
+4 1746 1175 125 95
+4 1746 1566 1292 1294
+4 1746 1566 1777 1292
+4 1746 94 95 1294
+4 1746 1175 94 1294
+4 1746 1175 94 95
+4 1746 1175 1566 1294
+4 1418 1746 96 97
+4 1418 127 128 97
+4 1418 127 128 968
+4 1418 1175 968 125
+4 1418 1746 1175 125
+4 1418 127 96 97
+4 1418 99 100 1391
+4 1418 1300 100 1391
+4 1418 1300 99 100
+4 1418 968 125 126
+4 1418 127 968 126
+4 1418 127 96 126
+4 1418 96 125 126
+4 1418 96 125 95
+4 1418 1746 125 95
+4 1418 1746 96 95
+4 307 278 1775 308
+4 1781 552 582 551
+4 1781 552 583 582
+4 1781 550 580 551
+4 1781 579 550 580
+4 1781 908 579 580
+4 1781 579 550 549
+4 1781 908 579 1116
+4 493 1393 492 915
+4 493 1393 494 915
+4 1184 431 461 1689
+4 1184 1394 431 1689
+4 1184 1665 461 915
+4 1184 460 461 1689
+4 1184 460 1665 461
+4 432 1184 431 461
+4 432 1184 1394 431
+4 432 403 402 941
+4 432 401 402 941
+4 432 431 401 941
+4 432 431 1689 941
+4 432 1394 1689 941
+4 432 1394 431 1689
+4 435 1184 434 1394
+4 435 434 1394 404
+4 435 405 1394 404
+4 435 405 434 404
+4 1633 1421 1394 1755
+4 1633 1184 1394 1689
+4 1633 1421 1394 1689
+4 1633 1204 1689 1296
+4 1633 1204 905 1296
+4 1633 1184 460 1665
+4 1633 1184 460 1689
+4 1633 1688 1689 1296
+4 1633 1688 460 1296
+4 1633 1688 460 1689
+4 1021 1204 1770 905
+4 1021 961 1770 905
+4 1021 961 1052 905
+4 450 961 420 451
+4 512 1773 513 482
+4 512 511 1773 482
+4 934 450 961 451
+4 305 1775 306 994
+4 305 1775 304 994
+4 305 304 994 274
+4 277 278 1387 994
+4 277 278 1775 994
+4 277 307 278 1775
+4 276 307 1775 306
+4 276 277 307 1775
+4 276 305 306 994
+4 276 1775 306 994
+4 276 277 1775 994
+4 276 277 1387 994
+4 1237 1595 1321 1658
+4 1237 1595 1321 1592
+4 1237 1271 1752 1416
+4 1237 1271 1752 941
+4 427 1688 397 428
+4 427 1688 428 1296
+4 427 1688 426 1296
+4 427 1688 936 426
+4 427 1688 936 397
+4 427 458 428 1296
+4 427 396 397 426
+4 427 396 936 426
+4 427 396 936 397
+4 427 456 426 1296
+4 553 552 583 582
+4 553 1781 552 583
+4 762 1361 791 792
+4 433 434 1394 404
+4 433 403 1394 404
+4 433 403 434 404
+4 433 1184 434 1394
+4 433 432 1184 1394
+4 433 403 1394 941
+4 433 432 1394 941
+4 433 432 403 941
+4 15 14 44 45
+4 1602 1181 1661 1275
+4 98 68 97 1777
+4 98 1418 128 97
+4 98 1418 99 128
+4 9 39 1451 8
+4 9 1451 1748 8
+4 9 1451 1748 10
+4 9 1748 1000 8
+4 9 1748 10 1000
+4 9 879 1000 8
+4 9 10 1000 880
+4 9 879 1000 880
+4 40 1451 10 41
+4 40 1451 1181 41
+4 40 39 1451 1181
+4 40 9 1451 10
+4 40 9 39 1451
+4 40 1600 1181 41
+4 40 10 41 11
+4 40 997 1600 1181
+4 40 39 997 1181
+4 971 1243 42 1600
+4 971 42 1600 41
+4 971 40 1600 41
+4 971 1243 42 43
+4 971 40 997 1600
+4 971 40 39 997
+4 1475 1748 1661 1386
+4 1475 1181 1661 1386
+4 1475 1181 1596 1386
+4 1475 1181 1596 1661
+4 1475 1602 1596 1661
+4 1475 1602 910 1661
+4 1591 1084 962 1386
+4 1591 1084 1743 1741
+4 1591 1084 1743 962
+4 1591 1501 1743 962
+4 1591 1535 1084 1628
+4 1717 1423 1626 1652
+4 1384 1506 1174 1531
+4 1384 1506 1054 1531
+4 823 853 1425 1001
+4 823 852 822 1001
+4 823 853 852 1001
+4 854 853 945 883
+4 854 823 853 1425
+4 1030 853 852 1001
+4 1030 849 1001 1327
+4 1030 1660 1001 1327
+4 973 702 703 1364
+4 973 702 1120 1364
+4 973 703 704 1364
+4 1480 1326 1512 1684
+4 1083 662 1771 663
+4 157 127 156 967
+4 157 127 158 967
+4 157 1419 158 967
+4 157 1419 969 967
+4 157 1419 158 969
+4 157 156 1715 186
+4 157 969 1715 967
+4 157 156 1715 967
+4 157 1057 969 1715
+4 157 1057 158 969
+4 157 188 1057 158
+4 1630 1453 1566 960
+4 1630 1566 1772 960
+4 1273 1244 195 1155
+4 1273 194 195 1155
+4 1273 194 943 1155
+4 1273 1485 1244 1155
+4 338 1597 367 337
+4 851 1030 852 1001
+4 851 852 822 1001
+4 851 821 822 1001
+4 818 1567 788 817
+4 818 1567 819 788
+4 818 1567 817 1327
+4 818 1567 819 1327
+4 818 817 1327 848
+4 818 849 1327 848
+4 818 819 849 1327
+4 1082 1115 1470 1380
+4 1540 1694 1302 1537
+4 1540 1694 1720 1302
+4 1540 1694 1274 1033
+4 1540 1694 1720 1033
+4 1540 1302 904 1537
+4 1540 1657 1302 904
+4 1540 938 1720 1302
+4 1540 938 1657 1302
+4 1540 938 1657 1720
+4 1238 216 1115 215
+4 1238 1206 218 217
+4 1238 1657 1115 1720
+4 1714 396 936 397
+4 1714 363 392 393
+4 1714 936 367 1024
+4 1714 936 397 367
+4 1714 396 397 367
+4 1714 363 362 1024
+4 1714 363 392 362
+4 1714 366 367 1024
+4 1714 396 366 367
+4 1452 944 1242 345
+4 1452 1663 944 1242
+4 1452 341 342 1242
+4 1452 341 371 1331
+4 1452 341 342 371
+4 1452 341 340 1331
+4 1452 341 1242 340
+4 1026 903 1561 1201
+4 1026 906 1112 990
+4 1749 341 1242 311
+4 1749 341 1242 340
+4 1749 1452 1242 340
+4 1749 1775 308 309
+4 1749 1452 340 1331
+4 1749 338 308 337
+4 1749 1597 906 1331
+4 1749 1597 906 337
+4 1749 338 1597 337
+4 1749 307 308 337
+4 1749 307 1775 308
+4 1749 307 306 337
+4 1749 307 1775 306
+4 344 944 1242 345
+4 344 1452 1242 345
+4 303 903 302 994
+4 303 903 1775 994
+4 303 1775 304 994
+4 303 272 302 994
+4 303 272 273 994
+4 303 273 994 274
+4 303 304 994 274
+4 303 332 1112 302
+4 1541 278 1387 994
+4 1541 1420 1387 994
+4 1541 278 1775 994
+4 1541 1420 1775 994
+4 1541 278 1775 308
+4 1541 938 1387 280
+4 1541 938 1420 1387
+4 1541 1775 308 309
+4 1541 278 308 309
+4 1541 938 282 1095
+4 1541 1064 282 1095
+4 1541 1420 1088 1095
+4 1541 938 1088 1095
+4 1541 938 1420 1088
+4 252 282 253 1033
+4 252 282 1720 1033
+4 252 251 1720 1033
+4 252 251 282 1720
+4 252 282 253 283
+4 243 1653 1115 242
+4 243 1653 244 1115
+4 243 930 1115 242
+4 243 930 213 1115
+4 243 1653 242 904
+4 243 1653 244 904
+4 243 273 242 904
+4 243 244 273 904
+4 1061 1053 1057 969
+4 1061 1053 972 969
+4 1061 1145 1053 1057
+4 1061 1053 972 1389
+4 1061 1145 1053 1389
+4 1232 1149 912 1681
+4 1232 1053 1149 1681
+4 1719 1145 1412 1389
+4 1719 1145 1412 1443
+4 1719 1061 1145 1389
+4 1719 1061 1145 1443
+4 1719 1061 972 1389
+4 913 1691 1484 1063
+4 913 1324 1357 1230
+4 913 909 1357 1063
+4 913 1691 909 1063
+4 913 909 1324 1357
+4 913 1691 909 1324
+4 1392 160 969 190
+4 1392 1057 969 190
+4 1392 1305 194 1455
+4 1392 194 1244 195
+4 1392 1273 1244 195
+4 1392 1273 194 195
+4 1392 194 1244 1455
+4 1392 1273 1478 943
+4 1392 1238 1478 943
+4 1392 1273 194 943
+4 911 1691 1484 1391
+4 911 1691 968 1391
+4 911 1691 909 968
+4 911 1691 909 1063
+4 911 1691 1484 1063
+4 911 968 1391 130
+4 911 1484 912 1063
+4 911 1419 160 130
+4 911 1179 912 1063
+4 911 1179 909 1063
+4 911 1179 909 912
+4 911 1149 909 912
+4 911 1149 1419 912
+4 911 1149 1419 909
+4 131 101 1391 130
+4 131 132 101 1391
+4 131 911 1391 130
+4 131 911 132 1391
+4 131 911 160 130
+4 1381 1385 1088 965
+4 422 961 1770 421
+4 422 1233 1770 421
+4 422 961 905 423
+4 422 961 1770 905
+4 422 1233 905 423
+4 422 1233 1770 905
+4 933 906 1112 1472
+4 933 906 1112 335
+4 933 906 1208 1472
+4 933 1597 906 1208
+4 933 1597 1208 1415
+4 933 332 363 362
+4 1236 1320 1269 1415
+4 1236 1597 1269 1415
+4 1236 933 1597 1415
+4 1236 1320 1269 1024
+4 1236 366 367 1024
+4 1236 1597 366 367
+4 361 1714 362 1024
+4 361 1714 392 362
+4 361 1714 391 392
+4 339 1749 308 309
+4 339 1749 338 308
+4 339 1749 340 1331
+4 339 1749 1597 1331
+4 339 1749 338 1597
+4 339 340 1331 370
+4 339 369 1331 370
+4 339 369 340 370
+4 339 1597 369 1331
+4 339 338 1597 369
+4 846 845 815 1327
+4 884 854 945 883
+4 884 14 13 883
+4 884 945 883 1091
+4 884 854 853 883
+4 884 15 14 885
+4 104 105 1094 1391
+4 104 1300 1391 103
+4 104 1300 1094 1391
+4 104 105 74 75
+4 1422 702 703 1364
+4 1422 673 1154 703
+4 1422 1154 703 704
+4 1422 703 704 1364
+4 1422 1154 704 1364
+4 1664 1422 1154 1364
+4 816 1567 817 1327
+4 816 1567 815 1327
+4 816 846 817 1327
+4 816 846 815 1327
+4 816 1567 817 787
+4 816 815 1776 785
+4 816 1567 815 1776
+4 789 1567 819 788
+4 1081 1174 900 1441
+4 1085 931 1776 1327
+4 1085 1712 931 1327
+4 1085 1567 1776 1327
+4 1085 1660 1712 1327
+4 1778 1085 1567 1776
+4 1778 1085 1148 1776
+4 1778 1085 1567 1327
+4 1778 1085 1660 1327
+4 1778 1567 1001 1327
+4 1778 1660 1001 1327
+4 1778 1567 819 1001
+4 633 604 1414 603
+4 1388 610 1722 609
+4 1388 610 579 609
+4 1388 1722 1209 580
+4 1388 610 1722 580
+4 1388 608 609 1146
+4 1388 608 579 609
+4 1388 610 579 580
+4 1388 908 1209 580
+4 1388 908 579 580
+4 1388 1147 1568 1031
+4 1388 908 1205 577
+4 578 1388 608 577
+4 578 1388 608 579
+4 578 908 1116 577
+4 578 908 579 1116
+4 578 1781 579 1116
+4 578 1388 908 577
+4 578 1388 908 579
+4 753 752 1174 1441
+4 753 754 1174 1441
+4 753 752 1174 1531
+4 753 1054 1174 1531
+4 753 754 1054 1174
+4 753 1054 783 1531
+4 753 754 1054 783
+4 753 783 782 1531
+4 753 752 782 1531
+4 753 724 754 723
+4 753 754 784 783
+4 755 754 784 785
+4 755 1506 998 785
+4 755 754 1506 785
+4 755 1506 1174 998
+4 755 754 1506 1174
+4 1718 1688 936 397
+4 1718 1688 398 397
+4 1718 1237 1752 941
+4 1718 1688 1595 1689
+4 1718 1688 936 1595
+4 1718 936 397 367
+4 1718 398 397 367
+4 1718 1421 1689 941
+4 1718 1421 1658 941
+4 1718 1421 1658 1689
+4 1718 1595 1658 1689
+4 1718 1271 1658 941
+4 1718 1237 1271 941
+4 1718 1237 1271 1658
+4 1718 1237 1595 1658
+4 1718 1237 936 1595
+4 1718 1752 1024 1416
+4 1718 1237 1752 1416
+4 1718 1752 1269 1024
+4 1718 369 1752 1269
+4 1718 936 367 1024
+4 1121 1061 1145 1443
+4 1121 1392 1244 1455
+4 1353 1290 1443 1715
+4 1353 1290 1140 1715
+4 1353 1206 1140 1715
+4 1353 183 1290 1140
+4 1353 183 1206 1140
+4 182 152 1140 1715
+4 182 183 1140 1715
+4 182 152 1715 153
+4 182 183 1715 153
+4 1532 1501 871 870
+4 333 933 332 363
+4 333 933 332 1112
+4 333 303 332 1112
+4 571 1621 572 1502
+4 571 1621 572 541
+4 571 572 602 1502
+4 571 601 602 1502
+4 571 1621 540 541
+4 571 1621 570 540
+4 1538 1388 908 1209
+4 1538 1388 1209 1031
+4 1538 1388 1147 1031
+4 1538 1723 1209 1031
+4 1538 1723 939 1031
+4 1538 1723 939 1209
+4 1655 516 487 486
+4 1655 487 1477 486
+4 1655 484 514 513
+4 1655 516 487 517
+4 1655 1477 488 1448
+4 1655 487 1477 488
+4 1655 487 517 488
+4 1655 488 518 1448
+4 1655 517 518 1448
+4 1655 517 488 518
+4 1356 1200 901 1680
+4 1356 724 901 723
+4 1659 1326 1512 1297
+4 1354 1414 603 602
+4 1354 603 602 1502
+4 1354 601 602 1502
+4 1354 601 1713 1502
+4 1354 604 1414 1146
+4 1354 604 1414 603
+4 1354 604 574 603
+4 1354 574 1205 1502
+4 1354 604 574 1205
+4 1627 1781 908 1116
+4 1627 578 1781 1116
+4 1627 578 1116 577
+4 1627 578 548 549
+4 1627 1781 579 549
+4 1627 578 579 549
+4 1627 578 1781 579
+4 1020 1354 1414 1713
+4 1020 1354 601 1713
+4 1020 601 1414 602
+4 1020 1354 1414 602
+4 1020 1354 601 602
+4 600 571 570 1502
+4 600 571 601 1502
+4 600 601 1713 1502
+4 600 1020 601 1713
+4 312 341 1242 311
+4 312 341 342 1242
+4 249 938 1657 1720
+4 249 1238 1720 250
+4 1687 1418 1746 1175
+4 1687 1746 1566 1777
+4 1687 1746 1175 1566
+4 1687 1746 97 1777
+4 1687 1418 1746 97
+4 1687 1300 1566 1777
+4 1687 98 97 1777
+4 1687 98 1418 97
+4 1687 1300 99 1777
+4 1687 1418 1300 99
+4 1687 98 99 1777
+4 1687 98 1418 99
+4 129 1418 99 128
+4 129 1418 128 968
+4 129 1418 99 1391
+4 129 911 968 130
+4 129 968 1391 130
+4 129 1418 968 1391
+4 129 100 1391 130
+4 129 99 100 130
+4 129 99 100 1391
+4 129 911 1419 130
+4 129 128 909 968
+4 129 911 909 968
+4 129 911 1419 909
+4 129 160 130 159
+4 129 1419 160 159
+4 129 1419 160 130
+4 129 1419 158 159
+4 129 128 1419 158
+4 129 1419 909 967
+4 129 128 909 967
+4 129 128 1419 967
+4 1119 1691 968 1391
+4 1119 1418 968 1391
+4 1119 1691 1175 968
+4 1119 1418 1175 968
+4 1119 1418 1300 1391
+4 1119 1630 1453 1566
+4 1119 1691 1035 1391
+4 1119 1630 1691 1035
+4 1119 1453 1300 1566
+4 1119 1687 1300 1566
+4 1119 1687 1418 1300
+4 1119 1687 1175 1566
+4 1119 1687 1418 1175
+4 1119 1630 1453 1035
+4 1119 1300 1094 1391
+4 1119 1453 1300 1094
+4 1119 1094 1035 1391
+4 1119 1453 1094 1035
+4 483 1655 484 513
+4 483 1773 513 482
+4 483 1655 1773 513
+4 364 1236 933 363
+4 364 333 933 363
+4 364 1236 363 1024
+4 364 1714 363 1024
+4 364 1714 363 393
+4 364 394 1714 393
+4 581 1781 582 551
+4 581 1781 580 551
+4 581 610 1722 611
+4 581 610 1722 580
+4 1171 1655 993 1773
+4 1171 1655 1773 1448
+4 1533 511 1773 510
+4 1533 1202 1773 510
+4 1533 1202 511 510
+4 1533 512 511 1773
+4 1533 512 1773 513
+4 1533 1655 1773 513
+4 1533 1655 514 513
+4 1533 1655 1773 1448
+4 1533 1125 1773 1448
+4 1533 1125 1202 1448
+4 1533 1125 1202 1773
+4 584 585 1215 975
+4 584 1781 1215 975
+4 584 1781 583 975
+4 584 974 583 975
+4 584 974 585 975
+4 1333 1634 1393 1448
+4 1603 493 1393 494
+4 1603 493 1393 492
+4 1603 492 522 521
+4 1603 1634 1393 1448
+4 1603 491 492 521
+4 1603 1393 491 492
+4 1603 1393 491 1448
+4 1603 491 520 521
+4 1603 1448 490 520
+4 1603 491 490 520
+4 1603 491 1448 490
+4 1629 1665 1477 915
+4 1629 1329 1393 915
+4 1629 1477 461 915
+4 1629 1393 461 915
+4 1629 1655 993 1477
+4 1629 1477 491 461
+4 1629 1393 491 461
+4 1629 1333 1393 1448
+4 1629 1655 1477 1448
+4 1629 1477 491 490
+4 1629 1393 491 490
+4 1629 1393 1448 490
+4 1629 1333 1266 1448
+4 1629 1171 1655 1448
+4 1629 1171 1655 993
+4 1629 489 1448 490
+4 1629 489 1477 490
+4 1629 489 1477 1448
+4 1629 1171 1266 1448
+4 1352 1204 1770 1651
+4 1352 1021 1204 1770
+4 1056 1633 1204 905
+4 1056 1633 905 1296
+4 1056 1633 460 1296
+4 1056 460 1665 1477
+4 1056 1633 460 1665
+4 1056 1477 1296 459
+4 1056 460 1296 459
+4 1056 460 1477 459
+4 480 511 1773 510
+4 452 934 961 451
+4 452 961 423 453
+4 452 422 961 423
+4 452 961 451 421
+4 452 422 961 421
+4 1263 934 993 1477
+4 1263 934 1473 1477
+4 1263 1629 993 1477
+4 1263 1629 1473 1477
+4 1263 1629 1473 1329
+4 1263 1411 1473 1590
+4 1263 1411 1473 1329
+4 1263 1629 1171 993
+4 1263 1629 1171 1329
+4 1263 1411 1329 1590
+4 1263 480 450 1590
+4 1263 934 450 961
+4 1263 1171 993 1590
+4 1474 934 961 1052
+4 1474 454 905 1296
+4 1474 961 1052 905
+4 1474 454 961 905
+4 1474 454 961 453
+4 1474 934 454 453
+4 1474 1056 905 1296
+4 1474 1056 1052 905
+4 1474 452 961 453
+4 1474 452 934 453
+4 1474 452 934 961
+4 1474 1056 1477 1296
+4 1474 1056 934 1477
+4 1474 1477 458 1296
+4 1504 934 1473 1477
+4 1504 1629 1473 1477
+4 1504 1056 934 1477
+4 1504 1629 1473 1329
+4 1504 1474 1056 934
+4 1504 934 1473 1052
+4 1504 1474 934 1052
+4 1504 1411 1473 1329
+4 1504 1474 1056 1052
+4 1625 1237 1595 1592
+4 1625 1237 936 1595
+4 1625 1714 936 1024
+4 1625 1714 1592 1024
+4 1625 1718 936 1024
+4 1625 1718 1237 936
+4 1625 1718 1024 1416
+4 1625 1718 1237 1416
+4 455 1474 454 1296
+4 455 1474 456 1296
+4 455 456 426 1296
+4 455 425 426 1296
+4 455 1474 934 454
+4 455 1474 456 1477
+4 455 1474 934 1477
+4 455 934 484 454
+4 455 456 1477 486
+4 1055 1688 936 1595
+4 1055 1688 936 426
+4 1055 425 936 426
+4 1055 1688 1595 1689
+4 1055 1688 426 1296
+4 1055 425 426 1296
+4 1055 1595 1658 1689
+4 1055 1233 1595 1658
+4 1055 1688 1689 1296
+4 1055 1421 1658 1689
+4 1055 1233 1421 1658
+4 1055 1689 1651 1296
+4 1055 1233 905 423
+4 1055 905 1651 1296
+4 1055 1233 905 1651
+4 424 1055 425 1296
+4 424 394 393 423
+4 424 394 425 936
+4 424 1055 425 936
+4 424 1055 905 1296
+4 424 1055 905 423
+4 424 454 905 1296
+4 424 454 905 423
+4 424 455 454 1296
+4 424 455 425 1296
+4 457 487 1477 458
+4 457 456 487 1477
+4 457 1474 1477 458
+4 457 1474 456 1477
+4 457 1474 458 1296
+4 457 1474 456 1296
+4 457 427 458 1296
+4 457 427 456 1296
+4 645 1154 674 675
+4 645 644 674 675
+4 645 644 1154 674
+4 643 673 1154 642
+4 643 673 1154 674
+4 643 644 1154 674
+4 729 728 759 998
+4 729 1659 730 1120
+4 1241 729 759 998
+4 1241 729 730 759
+4 1241 729 1659 730
+4 1241 729 728 998
+4 1241 729 1659 728
+4 732 973 702 703
+4 1599 729 730 1120
+4 1599 702 1120 1364
+4 1599 1422 702 1364
+4 1599 729 1659 1120
+4 555 584 585 1215
+4 761 762 1361 791
+4 761 1241 762 1361
+4 462 432 1184 461
+4 462 433 432 1184
+4 462 1184 461 915
+4 462 493 492 915
+4 462 1393 492 915
+4 462 1393 461 915
+4 462 1393 461 492
+4 462 432 431 461
+4 462 491 461 492
+4 1214 15 45 1275
+4 1214 15 14 45
+4 1214 44 45 1275
+4 1214 14 44 45
+4 1214 44 43 1275
+4 1214 14 44 43
+4 1214 14 13 43
+4 1214 1451 914 1091
+4 1214 1451 13 1091
+4 1214 1451 13 43
+4 1214 1451 914 1661
+4 1214 13 883 1091
+4 1214 14 13 883
+4 1214 884 883 1091
+4 1214 884 14 883
+4 1214 1451 1181 43
+4 1214 1181 1661 1275
+4 1214 1451 1181 1661
+4 73 74 44 43
+4 73 971 42 43
+4 73 72 971 42
+4 73 74 1243 43
+4 73 971 1243 43
+4 73 971 74 1243
+4 73 72 102 103
+4 73 104 74 103
+4 1240 1602 1424 910
+4 1240 1475 1424 910
+4 1240 1475 1602 1596
+4 1240 1475 1602 910
+4 1240 1750 997 1600
+4 1240 997 1596 1661
+4 1240 1602 1596 1661
+4 1240 997 1181 1661
+4 1240 997 1600 1181
+4 1240 1602 1181 1661
+4 1753 1602 1181 1275
+4 1753 1214 1181 1275
+4 1753 1243 1600 1181
+4 1753 1243 43 1275
+4 1753 1214 43 1275
+4 1753 1214 1181 43
+4 1753 1240 1600 1181
+4 1753 1240 1602 1181
+4 1753 1240 1243 1600
+4 1753 42 1181 43
+4 1753 1243 42 43
+4 1753 1243 42 1181
+4 1631 971 1185 1598
+4 1631 1750 1598 1632
+4 1631 1240 1243 1600
+4 1631 1240 1750 1600
+4 1631 1240 1750 1243
+4 1211 1185 1328 1598
+4 1211 971 1185 1598
+4 1211 1328 1598 1624
+4 1211 73 971 74
+4 1211 74 1243 75
+4 1211 971 74 1243
+4 1211 73 72 971
+4 1211 971 42 41
+4 1211 72 971 42
+4 1090 971 997 1600
+4 1090 1750 997 1600
+4 1090 1631 1750 1600
+4 1090 971 1243 1600
+4 1090 1631 1243 1600
+4 1090 1631 971 1243
+4 1090 1631 971 1598
+4 1090 1631 1750 1598
+4 1090 1211 971 997
+4 1090 997 1564 1562
+4 1090 1750 997 1562
+4 1090 1211 971 1598
+4 1090 1598 1564 1562
+4 1090 1750 1598 1562
+4 1090 1598 1624 1564
+4 1090 1211 1598 1624
+4 1090 1328 1624 1564
+4 1090 1211 1328 1564
+4 1090 1211 1328 1624
+4 1323 1591 0 962
+4 1323 1591 962 1386
+4 1323 962 3 1386
+4 1323 962 3 2
+4 1323 1535 1628 1386
+4 1323 1591 1535 1628
+4 1323 3 1386 4
+4 1323 1084 1628 1386
+4 1323 1591 1084 1386
+4 1323 1591 1084 1628
+4 874 1626 1501 962
+4 874 962 5 4
+4 1390 878 879 1000
+4 1390 879 1000 880
+4 1390 882 1000 881
+4 1390 1000 881 880
+4 1390 851 882 881
+4 1390 882 1000 883
+4 1390 851 882 852
+4 1390 1000 883 1091
+4 1390 945 883 1091
+4 1390 945 1000 1091
+4 1390 853 945 883
+4 1390 853 882 883
+4 1390 1030 1511 945
+4 1390 851 1030 852
+4 1390 853 882 852
+4 902 1051 1471 1327
+4 902 1712 931 1327
+4 902 1051 931 1327
+4 1500 1054 1776 1410
+4 1500 931 1776 1410
+4 1295 1384 1506 1054
+4 1295 1384 1530 1054
+4 1295 1500 1530 1054
+4 1574 1174 900 1531
+4 1574 1384 1174 1531
+4 793 792 822 1001
+4 793 823 822 1001
+4 793 823 792 822
+4 793 823 1425 1001
+4 793 1153 1425 1001
+4 793 1153 792 1001
+4 793 1153 1361 792
+4 855 884 854 885
+4 1784 973 1334 1515
+4 1784 765 735 764
+4 1784 1241 762 1361
+4 1784 732 1241 762
+4 1510 973 1120 1364
+4 1510 1599 1659 1120
+4 1510 1480 1326 1512
+4 1510 1659 1326 1512
+4 1510 1659 1512 1297
+4 1382 1445 964 1680
+4 1382 662 1200 1771
+4 133 911 132 1391
+4 133 104 1391 103
+4 133 102 1391 103
+4 133 132 102 103
+4 133 132 102 1391
+4 224 194 943 1155
+4 224 1392 194 943
+4 224 1392 223 943
+4 224 225 195 1155
+4 224 194 195 1155
+4 224 194 225 195
+4 224 943 1033 1155
+4 224 223 943 1033
+4 368 338 1597 367
+4 368 338 1597 369
+4 368 1236 1597 367
+4 368 1236 1597 369
+4 368 1236 367 1024
+4 368 1718 367 1024
+4 368 1236 1269 1024
+4 368 1718 1269 1024
+4 368 1718 369 1269
+4 368 1718 398 367
+4 672 643 673 642
+4 672 673 1154 642
+4 672 1422 673 1154
+4 1683 930 1380 1740
+4 1683 1082 1380 1740
+4 1683 930 1115 1380
+4 1683 1082 1115 1380
+4 1683 1082 1478 1115
+4 1683 214 213 1115
+4 1683 930 213 1115
+4 1683 1238 1478 1115
+4 1683 214 1115 215
+4 1683 1238 1115 215
+4 1683 183 214 213
+4 1683 214 215 185
+4 1683 1206 215 185
+4 1683 182 183 1206
+4 1683 183 214 184
+4 1683 183 1206 184
+4 1683 1206 216 215
+4 1683 1238 216 215
+4 1683 214 185 184
+4 1683 1206 185 184
+4 1683 181 1740 180
+4 1721 1238 1115 1720
+4 1721 1540 1720 1033
+4 1721 1540 1694 1537
+4 1721 1540 1694 1274
+4 1721 1540 1274 1033
+4 1265 1653 932 904
+4 1265 932 904 1537
+4 1265 1540 904 1537
+4 1265 1653 1657 904
+4 1265 1540 1657 904
+4 1265 1653 932 1115
+4 1265 1653 1657 1115
+4 1265 932 1115 1470
+4 1265 1721 1540 1537
+4 1265 1657 1115 1720
+4 1265 1540 1657 1720
+4 1265 1082 1115 1470
+4 1265 1721 1115 1720
+4 1265 1721 1540 1720
+4 1573 906 1208 1331
+4 1573 344 375 345
+4 1573 344 1452 345
+4 1573 1452 944 345
+4 1573 1452 1663 944
+4 1573 1749 906 1331
+4 1573 1749 1452 1331
+4 1573 1749 1452 906
+4 1573 344 375 374
+4 373 403 1752 402
+4 373 374 1752 404
+4 373 403 1752 404
+4 373 403 374 404
+4 1601 903 1775 1201
+4 1601 1026 903 1201
+4 1601 1026 903 1775
+4 1601 1541 1420 1775
+4 1601 1749 1775 309
+4 1601 1541 1775 309
+4 1113 1026 903 1775
+4 1113 1026 906 1112
+4 1113 906 1112 335
+4 1113 1026 903 1561
+4 1113 303 1775 304
+4 1113 303 903 1775
+4 1113 903 1561 300
+4 1113 1112 1561 990
+4 1113 1026 1561 990
+4 1113 1026 1112 990
+4 1113 305 1775 304
+4 1113 305 335 304
+4 1113 305 335 1775
+4 1113 333 303 304
+4 1113 333 303 1112
+4 1113 303 1112 302
+4 1113 303 903 302
+4 1113 1112 300 301
+4 1113 903 300 301
+4 1113 1112 302 301
+4 1113 903 302 301
+4 1569 1026 1663 944
+4 1569 1663 944 1242
+4 1569 1601 1026 944
+4 1569 1026 1663 906
+4 1569 1601 944 1242
+4 1569 1601 1749 1242
+4 1569 1452 1663 1242
+4 1569 1749 1452 1242
+4 1569 1601 1026 1775
+4 1569 1601 1749 1775
+4 1569 1749 1452 906
+4 1569 1113 1026 906
+4 1569 1113 1749 906
+4 1569 1113 1026 1775
+4 1569 1113 1749 1775
+4 1569 1573 1452 906
+4 1569 1573 1452 1663
+4 1569 1663 906 1208
+4 1569 1573 906 1208
+4 1569 1573 1663 1208
+4 279 1541 309 280
+4 279 1541 278 309
+4 279 1541 1387 280
+4 279 1541 278 1387
+4 279 938 1387 280
+4 279 938 278 1387
+4 279 938 1720 280
+4 279 249 938 1720
+4 279 1720 250 280
+4 279 249 1720 250
+4 281 1541 938 280
+4 281 1541 938 282
+4 281 938 1720 280
+4 281 938 282 1720
+4 281 1541 311 280
+4 281 251 282 1720
+4 281 1541 1064 311
+4 281 1541 1064 282
+4 281 1720 250 280
+4 281 251 1720 250
+4 281 312 282 311
+4 281 312 1064 311
+4 281 312 1064 282
+4 310 1541 309 280
+4 310 1541 311 280
+4 310 1601 1541 309
+4 310 1601 1541 311
+4 310 1601 1749 309
+4 310 1749 1242 311
+4 310 1601 1242 311
+4 310 1601 1749 1242
+4 310 339 340 309
+4 310 339 1749 309
+4 310 339 1749 340
+4 310 1749 341 311
+4 310 1749 341 340
+4 222 223 943 1033
+4 222 1392 223 943
+4 212 1683 930 1740
+4 212 1683 930 213
+4 212 1683 182 181
+4 212 1683 183 213
+4 212 1683 182 183
+4 164 165 1305 195
+4 164 1305 194 195
+4 164 165 194 195
+4 1785 1691 1484 1035
+4 1785 1630 1691 1035
+4 162 131 911 132
+4 1003 1305 1484 135
+4 1003 911 1484 912
+4 1003 911 1419 912
+4 1003 165 1305 135
+4 1003 164 165 135
+4 1003 164 165 1305
+4 1003 164 1305 163
+4 1003 164 133 163
+4 1003 133 132 163
+4 1003 133 911 132
+4 1003 1419 912 969
+4 1003 162 1392 163
+4 1003 162 132 163
+4 1003 162 911 132
+4 1003 972 912 969
+4 1003 1392 1305 1455
+4 1003 1061 972 1455
+4 1003 1061 972 969
+4 1003 1392 1057 1455
+4 1003 1392 1057 969
+4 1003 1061 1057 1455
+4 1003 1061 1057 969
+4 1322 965 994 1050
+4 1322 903 1775 994
+4 1322 903 1775 1201
+4 1322 1420 1775 994
+4 1322 1420 1775 1201
+4 1413 422 391 392
+4 1413 1714 391 1592
+4 1413 1714 391 392
+4 1413 422 392 393
+4 1413 391 1592 421
+4 1413 422 391 421
+4 1413 1714 392 393
+4 1413 422 393 423
+4 1413 1233 1592 421
+4 1413 422 1233 421
+4 1413 394 1714 393
+4 1413 422 1233 423
+4 1413 394 1714 936
+4 1413 424 393 423
+4 1413 424 1055 423
+4 1413 1055 1233 423
+4 1413 1625 1714 1592
+4 1413 1625 1714 936
+4 1413 424 394 393
+4 1413 1233 1595 1592
+4 1413 1055 1233 1595
+4 1413 1055 936 1595
+4 1413 1625 1595 1592
+4 1413 1625 936 1595
+4 1413 424 394 936
+4 1413 424 1055 936
+4 1560 1236 1320 1415
+4 1560 1236 933 1415
+4 1560 1236 1320 1024
+4 1560 360 330 331
+4 1560 361 360 331
+4 1560 1112 1472 990
+4 1560 361 362 1024
+4 1560 363 362 1024
+4 1560 1236 363 1024
+4 1560 933 363 362
+4 1560 1236 933 363
+4 1560 1112 330 331
+4 1560 933 1112 1472
+4 1560 361 332 331
+4 1560 933 332 362
+4 1560 361 332 362
+4 1560 332 1112 331
+4 1560 933 332 1112
+4 847 817 1327 848
+4 847 846 817 1327
+4 876 1626 1748 1386
+4 876 6 5 1386
+4 1002 1723 1209 1031
+4 1002 1388 1209 1031
+4 1002 1388 1568 1031
+4 1002 1388 1722 1209
+4 1264 1058 1028 1695
+4 1264 1029 1028 1695
+4 1264 1382 1083 1771
+4 1264 1382 1083 964
+4 1264 1029 1083 964
+4 1572 1664 1422 1154
+4 1572 1058 1028 1695
+4 1572 1029 1028 1695
+4 1572 1664 1422 1364
+4 786 816 1567 787
+4 786 1567 1776 787
+4 786 816 1776 785
+4 786 816 1567 1776
+4 786 1506 1776 785
+4 786 1506 998 785
+4 786 1506 787 998
+4 786 756 787 998
+4 786 755 998 785
+4 786 755 756 998
+4 1060 761 1361 791
+4 1060 789 759 998
+4 1060 1506 1174 998
+4 1060 1384 1506 1174
+4 1060 1574 1384 1174
+4 1065 1335 1660 1511
+4 1065 1030 1660 1001
+4 1065 1030 1660 1511
+4 1447 1778 1148 1776
+4 1447 1506 1054 1776
+4 1447 1500 1054 1776
+4 1447 1500 1148 1776
+4 1447 1295 1506 1054
+4 1447 1295 1500 1054
+4 1447 1295 1500 1530
+4 1779 1572 1029 1028
+4 1779 1599 1422 1364
+4 606 1205 576 575
+4 606 1205 576 577
+4 632 1414 603 602
+4 632 633 1414 603
+4 632 601 1414 631
+4 632 601 1414 602
+4 632 662 1650 631
+4 790 821 1001 820
+4 790 821 791 1001
+4 790 789 819 820
+4 1656 1356 725 726
+4 1656 1356 724 725
+4 1656 1177 726 998
+4 1656 1356 1326 901
+4 1656 1356 724 901
+4 1656 1241 728 998
+4 1656 1241 1177 998
+4 1656 1241 1659 728
+4 1656 724 901 723
+4 1656 1510 1659 1326
+4 1656 901 723 1620
+4 1656 1480 1326 1684
+4 1656 1510 1480 1326
+4 1332 1723 974 975
+4 1332 1781 583 975
+4 1332 974 583 975
+4 1332 1781 583 582
+4 1332 974 583 582
+4 1332 908 1209 580
+4 1332 1781 908 580
+4 1332 581 1781 580
+4 1332 581 1781 582
+4 1332 1722 1209 580
+4 1332 581 1722 580
+4 1332 974 1722 582
+4 1332 581 1722 582
+4 1092 1121 1485 1693
+4 1092 1273 1485 1244
+4 1092 1121 1485 1244
+4 1092 1392 1273 1244
+4 1092 1121 1392 1244
+4 1092 1392 1273 1478
+4 1092 1273 1478 943
+4 1268 1353 1206 1693
+4 1268 1353 1121 1693
+4 1268 1092 1121 1693
+4 1268 1092 1121 1392
+4 1268 1092 1392 1478
+4 1268 1238 1206 1478
+4 1268 1392 1238 1478
+4 1268 1206 189 188
+4 246 216 1115 245
+4 246 1238 216 1115
+4 246 1657 1115 245
+4 246 1657 1387 245
+4 246 276 277 1387
+4 841 1532 871 870
+4 841 1532 840 870
+4 841 1532 840 1051
+4 841 840 1051 811
+4 334 364 933 335
+4 334 364 333 933
+4 334 933 1112 335
+4 334 333 933 1112
+4 334 1113 1112 335
+4 334 1113 333 1112
+4 334 1113 335 304
+4 334 1113 333 304
+4 1505 1621 1116 1502
+4 1505 574 1205 1502
+4 1505 574 575 1116
+4 1505 574 1205 575
+4 1505 1388 908 1205
+4 1505 1538 1388 1205
+4 1505 1538 1388 908
+4 1505 576 575 1116
+4 1505 1205 576 575
+4 1505 576 1116 577
+4 1505 908 1116 577
+4 1505 1205 576 577
+4 1505 908 1205 577
+4 485 1655 516 486
+4 485 455 1477 486
+4 485 455 934 1477
+4 485 455 934 484
+4 693 901 723 692
+4 693 1356 901 723
+4 693 1200 901 692
+4 693 1356 1200 901
+4 1293 1650 631 630
+4 1293 632 1650 631
+4 1293 662 1650 1771
+4 1293 632 662 1650
+4 1293 632 633 662
+4 1293 1083 1771 663
+4 1293 662 1771 663
+4 1293 633 662 663
+4 1293 1083 664 663
+4 1293 633 664 663
+4 1293 665 635 664
+4 1293 665 1083 664
+4 1747 1627 1781 908
+4 1747 1332 1781 908
+4 1747 1505 908 1116
+4 546 576 1116 577
+4 546 547 1116 577
+4 546 576 575 1116
+4 1114 1147 1568 1031
+4 1114 1002 1568 1031
+4 1025 1270 1414 1146
+4 1025 1020 1414 1713
+4 1025 1354 1713 1146
+4 1025 1354 1414 1146
+4 1025 1354 1414 1713
+4 1025 1114 1020 1713
+4 1575 1513 1245 1605
+4 1141 1293 631 630
+4 1141 1293 1650 630
+4 1141 1293 632 631
+4 1141 1173 633 1414
+4 1141 632 633 1414
+4 1141 1293 1173 1022
+4 1141 1293 1173 633
+4 1141 1293 632 633
+4 573 574 544 1116
+4 573 603 572 1502
+4 573 1505 574 1116
+4 573 1505 574 1502
+4 573 1354 603 1502
+4 573 1354 574 1502
+4 573 1354 574 603
+4 573 572 1116 1502
+4 573 1505 1116 1502
+4 634 1293 635 664
+4 634 1293 633 664
+4 634 604 1414 635
+4 634 633 604 1414
+4 634 1293 1173 635
+4 634 1293 1173 633
+4 634 633 604 603
+4 634 1173 1414 635
+4 634 1173 633 1414
+4 1544 312 1242 311
+4 1544 312 1064 311
+4 1544 1601 1242 311
+4 1544 1541 1064 311
+4 1544 1601 1541 311
+4 1544 1601 1541 1064
+4 1544 1601 944 1242
+4 1544 1601 1064 944
+4 1544 344 944 1242
+4 1544 344 944 345
+4 1544 315 944 345
+4 1544 1064 284 283
+4 1544 1064 284 285
+4 1544 1064 282 283
+4 1544 312 282 283
+4 1544 312 1064 282
+4 1565 1119 1175 1566
+4 1565 1119 1630 1566
+4 1565 1175 1566 1772
+4 1565 1630 1566 1772
+4 1565 1119 1691 1175
+4 1565 1119 1630 1691
+4 1565 1175 1324 1772
+4 1565 1691 1175 1324
+4 1623 934 484 454
+4 1623 483 484 454
+4 1623 934 454 453
+4 1623 483 454 453
+4 1623 452 934 453
+4 1623 452 483 453
+4 1623 934 993 1477
+4 1623 483 1655 484
+4 1623 452 483 482
+4 1623 485 934 1477
+4 1623 485 934 484
+4 1623 485 1655 484
+4 1623 1655 993 1773
+4 1623 483 1655 1773
+4 1623 483 1773 482
+4 1623 1655 993 1477
+4 1623 452 934 451
+4 1623 1655 1477 486
+4 1623 485 1477 486
+4 1623 485 1655 486
+4 1623 934 450 451
+4 1623 480 450 451
+4 1623 1263 934 993
+4 1623 1263 934 450
+4 1623 1263 480 450
+4 1623 1263 993 1590
+4 1623 1263 480 1590
+4 365 933 335 366
+4 365 364 933 335
+4 365 933 1597 366
+4 365 1236 1597 366
+4 365 1236 933 1597
+4 365 364 1236 933
+4 365 1236 366 1024
+4 365 364 1236 1024
+4 365 1714 366 1024
+4 365 364 1714 1024
+4 365 1714 396 366
+4 365 364 394 1714
+4 1080 1125 1202 1773
+4 1080 1171 1125 1773
+4 1080 1202 1773 510
+4 1622 1202 511 510
+4 1170 1621 540 541
+4 1170 1621 542 541
+4 1682 512 542 541
+4 1682 1170 542 541
+4 1682 512 511 541
+4 1682 511 541 510
+4 1682 1533 512 511
+4 1682 1622 511 510
+4 1682 1533 512 513
+4 1682 540 541 510
+4 1682 1170 540 541
+4 1682 1533 1202 511
+4 1682 1622 1202 511
+4 1682 1622 1533 1202
+4 613 974 583 582
+4 1124 1629 1329 1393
+4 1124 1629 1333 1393
+4 524 1603 493 494
+4 524 495 525 494
+4 1182 553 552 522
+4 1182 552 522 521
+4 1182 1603 522 521
+4 1182 552 551 521
+4 1182 1781 552 551
+4 1383 1021 1052 905
+4 1383 1021 1204 905
+4 1383 1056 1052 905
+4 1383 1056 1204 905
+4 1383 1352 1021 1204
+4 1383 1352 1021 1110
+4 1383 1352 1633 1204
+4 1383 1056 1633 1204
+4 935 1263 1329 1590
+4 935 1263 1171 1590
+4 935 1263 1171 1329
+4 935 1411 1329 1590
+4 1176 1056 1629 1477
+4 1176 1504 1629 1477
+4 1176 1504 1056 1477
+4 1176 1056 1442 1052
+4 1176 1504 1056 1052
+4 1176 1629 1665 915
+4 336 305 1775 306
+4 336 305 335 1775
+4 336 1749 306 337
+4 336 1749 1775 306
+4 336 1749 906 337
+4 336 1113 335 1775
+4 336 1113 1749 1775
+4 336 933 906 335
+4 336 1113 906 335
+4 336 1113 1749 906
+4 336 1597 906 337
+4 336 933 1597 906
+4 336 1597 366 337
+4 336 933 335 366
+4 336 933 1597 366
+4 1783 613 974 1722
+4 1783 641 1722 642
+4 1783 1270 641 1722
+4 1662 1784 1241 1361
+4 1662 1784 973 1334
+4 1662 1784 1241 973
+4 1662 973 1334 1515
+4 1662 1177 1515 1303
+4 1662 1241 1177 1303
+4 1662 973 1454 1515
+4 1662 1241 973 1454
+4 1662 1454 1515 1303
+4 731 761 1241 730
+4 731 732 1241 762
+4 731 761 1241 762
+4 731 761 732 762
+4 733 732 702 703
+4 733 973 703 704
+4 733 732 973 703
+4 733 1784 762 763
+4 733 1784 732 762
+4 733 732 1241 973
+4 733 1784 1241 973
+4 733 1784 732 1241
+4 733 1784 764 763
+4 1362 1599 1120 1364
+4 1362 1510 1599 1120
+4 1362 1510 1512 1297
+4 1362 1599 1659 1297
+4 1362 1510 1659 1297
+4 1362 1510 1599 1659
+4 1087 1656 1356 1326
+4 1087 1656 1659 1326
+4 1087 1362 1356 1326
+4 1087 1362 1599 1356
+4 1087 1659 1326 1297
+4 1087 1599 1659 1297
+4 1087 1656 1659 728
+4 1087 1362 1326 1297
+4 1087 1362 1599 1297
+4 1087 729 1659 728
+4 1087 1599 729 728
+4 1087 1599 729 1659
+4 464 433 1184 434
+4 464 435 434 465
+4 464 435 1184 465
+4 464 435 1184 434
+4 464 1184 465 915
+4 464 495 465 915
+4 464 495 494 915
+4 464 495 494 465
+4 464 493 494 915
+4 1213 1602 1661 1275
+4 1213 1214 1661 1275
+4 1213 1214 914 1661
+4 1213 910 914 1661
+4 1213 1602 910 1661
+4 1213 1602 1424 910
+4 1213 1753 1602 1275
+4 1542 1211 1328 1564
+4 1542 1292 1564 1692
+4 1542 1325 1292 1564
+4 1542 1453 1300 1094
+4 1542 1211 74 75
+4 1542 1325 1777 1292
+4 1542 104 1300 1094
+4 1542 105 74 75
+4 1542 1453 1300 1777
+4 1542 104 105 1094
+4 1542 104 105 74
+4 1542 104 74 103
+4 1542 104 1300 103
+4 1542 73 74 103
+4 69 68 997 38
+4 69 39 997 38
+4 71 1211 42 41
+4 71 1211 72 42
+4 1594 31 30 1562
+4 1594 31 32 1562
+4 1594 1323 0 30
+4 1594 31 32 2
+4 1594 32 1562 33
+4 1594 32 2 33
+4 1594 1475 1596 1562
+4 1594 3 2 33
+4 1594 1323 3 2
+4 1594 1562 34 33
+4 1594 1596 1562 34
+4 1594 3 33 4
+4 1594 1323 3 4
+4 1594 34 33 4
+4 1594 1596 34 35
+4 1594 1323 1386 4
+4 1594 5 34 4
+4 1594 5 34 35
+4 1594 1475 1596 1386
+4 1594 5 1386 4
+4 1594 5 1386 35
+4 1594 1386 36 35
+4 1594 1596 36 35
+4 1594 1596 1386 36
+4 1744 1475 1424 910
+4 1744 1535 910 1748
+4 1744 1323 1535 1386
+4 1744 1594 1475 1386
+4 1744 1594 1323 1386
+4 1744 910 1748 1661
+4 1744 1475 1748 1661
+4 1744 1475 910 1661
+4 1744 1535 1748 1386
+4 1744 1475 1748 1386
+4 872 1501 871 962
+4 872 1532 1501 871
+4 872 871 962 2
+4 872 841 1532 871
+4 1330 1335 1291 1511
+4 1267 1330 1291 1440
+4 937 849 1327 848
+4 937 1030 849 1327
+4 937 847 1327 848
+4 937 1267 1030 1511
+4 937 847 846 1327
+4 1234 1335 1660 1511
+4 1234 1030 1660 1511
+4 1234 1335 1291 1511
+4 1234 1030 1660 1327
+4 1234 902 1660 1327
+4 1234 1267 1030 1511
+4 1234 1330 1291 1511
+4 1234 1267 1330 1511
+4 1234 1267 1330 1291
+4 1234 937 1030 1327
+4 1234 937 1267 1030
+4 1534 1660 1712 1327
+4 1534 902 1712 1327
+4 1534 902 1660 1327
+4 1534 1234 902 1660
+4 1207 1295 1384 1506
+4 1207 1447 1295 1506
+4 1207 1295 1384 1530
+4 1724 1662 1361 1334
+4 1724 1662 1784 1334
+4 1724 1662 1784 1361
+4 1724 795 765 764
+4 1724 1784 765 764
+4 1724 793 1153 1361
+4 1724 793 764 763
+4 1724 1784 764 763
+4 1724 793 792 763
+4 1724 793 1361 792
+4 1724 1784 762 763
+4 1724 1784 762 1361
+4 1724 762 792 763
+4 1724 762 1361 792
+4 1745 1356 1200 1680
+4 1745 1382 1200 1680
+4 1745 1382 662 1200
+4 1745 662 1200 692
+4 1745 693 1200 692
+4 1745 1083 662 663
+4 1745 1083 664 663
+4 1745 1382 1083 964
+4 1745 665 1083 664
+4 1745 1083 662 1771
+4 1745 1382 662 1771
+4 1745 1382 1083 1771
+4 220 1238 1720 250
+4 220 1392 191 190
+4 220 1392 1238 943
+4 220 1392 189 190
+4 399 368 1718 369
+4 399 368 1718 398
+4 399 369 1752 370
+4 399 1718 369 1752
+4 399 1688 429 428
+4 399 1688 398 428
+4 399 1718 1688 398
+4 399 1688 429 1689
+4 399 1718 1688 1689
+4 399 1718 1689 941
+4 758 788 787 998
+4 758 757 787 998
+4 758 789 759 998
+4 758 789 788 998
+4 758 728 759 998
+4 758 757 728 998
+4 219 220 1392 189
+4 219 1268 1392 189
+4 219 220 1392 1238
+4 219 1206 189 218
+4 219 1268 1206 189
+4 219 1268 1392 1238
+4 219 1238 1206 218
+4 219 1268 1238 1206
+4 850 849 1001 820
+4 850 821 1001 820
+4 850 851 821 1001
+4 850 1030 849 1001
+4 850 851 1030 1001
+4 850 1390 851 1030
+4 850 937 1030 849
+4 850 937 1390 1030
+4 850 1390 879 880
+4 850 1390 879 849
+4 850 851 881 880
+4 850 1390 881 880
+4 850 1390 851 881
+4 1123 1092 1478 943
+4 1123 1092 1273 943
+4 1355 1751 1123 1478
+4 1355 1238 1206 1478
+4 1355 1683 1238 1478
+4 1355 1683 1082 1478
+4 1355 1751 1082 1478
+4 1355 1206 1693 1710
+4 1355 1092 1693 1710
+4 1355 1123 1092 1478
+4 1355 1683 1206 216
+4 1355 1683 1238 216
+4 1355 1268 1206 1693
+4 1355 1268 1092 1693
+4 1355 1268 1206 1478
+4 1355 1268 1092 1478
+4 1355 1206 216 217
+4 1355 1238 216 217
+4 1355 1238 1206 217
+4 1180 1082 1478 1115
+4 1180 1238 1478 1115
+4 1180 1721 1238 1115
+4 1180 1265 1082 1115
+4 1180 1265 1721 1115
+4 1180 1265 1721 1082
+4 1180 1751 1082 1478
+4 1180 1751 1483 1082
+4 1180 1238 943 1033
+4 1180 1238 1478 943
+4 1180 1238 1720 1033
+4 1180 1721 1720 1033
+4 1180 1721 1238 1720
+4 1180 1751 1483 1545
+4 1180 943 1274 1033
+4 1180 1721 1274 1033
+4 1180 1123 1478 943
+4 1180 1751 1123 1478
+4 395 394 425 936
+4 395 396 936 426
+4 395 425 936 426
+4 395 425 396 426
+4 395 1714 396 936
+4 395 394 1714 936
+4 395 365 1714 396
+4 395 365 394 1714
+4 1152 1573 375 374
+4 1152 375 374 1752
+4 1152 369 1752 1269
+4 1152 373 374 1752
+4 1152 1573 1452 1331
+4 1152 373 1452 374
+4 1152 1597 1269 1331
+4 1152 1597 369 1331
+4 1152 369 1331 370
+4 1152 369 1752 370
+4 1152 1452 371 1331
+4 1152 344 1452 374
+4 1152 1573 344 374
+4 1152 1573 344 1452
+4 1152 1236 1597 1269
+4 1152 1236 1597 369
+4 1152 371 1331 370
+4 1152 1752 371 370
+4 1152 368 369 1269
+4 1152 368 1236 1269
+4 1152 368 1236 369
+4 1481 1420 1775 1201
+4 1481 1601 1775 1201
+4 1481 1601 1420 1775
+4 1481 1601 1541 1420
+4 211 930 210 1740
+4 211 212 930 1740
+4 211 212 1683 1740
+4 211 1683 181 1740
+4 211 212 1683 181
+4 211 210 1740 180
+4 211 181 1740 180
+4 161 911 1419 160
+4 161 131 911 160
+4 161 162 131 911
+4 161 1003 911 1419
+4 161 1003 162 911
+4 161 1419 160 969
+4 161 1003 1419 969
+4 161 1392 160 969
+4 161 1003 1392 969
+4 161 162 1392 191
+4 161 1003 162 1392
+4 161 1392 160 190
+4 161 1392 191 190
+4 192 162 1392 191
+4 192 161 162 191
+4 192 222 1392 223
+4 1117 1420 1088 965
+4 1117 1381 1088 965
+4 1117 1536 1381 1088
+4 1117 1420 1088 1095
+4 1117 1536 1088 1095
+4 1117 1536 1420 1095
+4 1117 1322 1420 994
+4 1117 1536 1350 1420
+4 1117 1322 1350 1420
+4 1117 1420 1387 994
+4 1117 1420 965 1387
+4 1143 1117 1381 965
+4 1143 1322 965 994
+4 1143 1117 1322 994
+4 1143 1117 1536 1381
+4 1143 965 1387 994
+4 1143 1117 1387 994
+4 1143 1117 965 1387
+4 1143 1117 1536 1350
+4 1143 1117 1322 1350
+4 877 876 1626 1748
+4 877 876 847 846
+4 877 878 1748 1000
+4 877 1626 1748 1000
+4 877 1748 7 8
+4 877 878 1748 8
+4 877 1748 7 1386
+4 877 876 1748 1386
+4 877 7 6 1386
+4 877 876 6 1386
+4 875 874 1626 962
+4 875 1626 962 1386
+4 875 876 1626 1386
+4 875 874 962 5
+4 875 962 5 1386
+4 875 876 5 1386
+4 875 876 846 845
+4 696 1356 725 726
+4 134 133 104 1391
+4 134 105 135 1391
+4 134 104 105 1391
+4 134 133 911 1391
+4 134 133 104 103
+4 134 1003 164 135
+4 134 1003 164 133
+4 134 1484 135 1391
+4 134 911 1484 1391
+4 134 1003 133 911
+4 134 164 165 135
+4 134 1003 1484 135
+4 134 1003 911 1484
+4 134 164 133 163
+4 1360 1388 1568 1146
+4 1360 1388 609 1146
+4 1360 1388 1722 609
+4 1360 1002 1388 1722
+4 1360 1002 1388 1568
+4 1360 608 609 1146
+4 1360 1270 608 1146
+4 1360 1270 608 609
+4 1360 610 1722 609
+4 1360 1270 610 609
+4 1360 1270 610 1722
+4 1360 1783 1002 1722
+4 1360 1783 1270 1722
+4 940 1783 1270 1245
+4 940 1270 1173 1414
+4 1479 1745 1083 1028
+4 1479 1572 1058 1605
+4 1479 1572 1058 1028
+4 1089 1153 1361 792
+4 1089 1060 1153 1361
+4 1089 1361 791 792
+4 1089 1060 1361 791
+4 1089 790 1060 791
+4 1089 1060 1384 1506
+4 1089 1060 1153 1384
+4 1089 790 1060 789
+4 1089 1207 1384 1506
+4 1089 1060 1506 998
+4 1089 1060 789 998
+4 1089 1207 1447 1506
+4 1089 1153 1384 1093
+4 1089 1207 1384 1093
+4 1089 1207 1153 1093
+4 1089 789 788 998
+4 1089 788 787 998
+4 1089 1506 787 998
+4 1089 786 1506 787
+4 1151 1778 1660 1001
+4 1151 1778 1085 1148
+4 1151 1778 1085 1660
+4 1151 1085 1660 1712
+4 1151 1534 1660 1712
+4 1151 1065 1335 1660
+4 1151 1234 1335 1660
+4 1151 1534 1234 1660
+4 1004 1151 1085 1148
+4 1359 1447 1778 1148
+4 1359 1604 1153 1148
+4 1359 1604 1153 1093
+4 1359 1089 1207 1153
+4 1359 1089 1207 1447
+4 1359 1207 1153 1093
+4 1359 1207 1447 1295
+4 1304 1572 1422 1364
+4 1304 1779 1422 1364
+4 1304 1779 1572 1422
+4 1304 1572 1664 1364
+4 1304 1779 1572 1029
+4 1304 1029 1445 964
+4 1304 1572 1664 1695
+4 1304 1572 1029 1695
+4 605 606 1205 575
+4 605 574 1205 575
+4 605 604 574 1205
+4 605 1354 604 1205
+4 605 604 1414 635
+4 605 1354 1205 1146
+4 605 606 1205 1146
+4 605 1354 604 1146
+4 605 634 604 635
+4 605 604 1414 1146
+4 605 606 1414 1146
+4 760 1060 761 791
+4 760 790 1060 791
+4 760 1060 761 1361
+4 760 1060 789 759
+4 760 790 789 759
+4 760 790 1060 789
+4 760 761 1241 1361
+4 760 1060 759 998
+4 760 1060 1361 998
+4 760 1241 759 998
+4 760 1241 1361 998
+4 760 1241 730 759
+4 760 761 1241 730
+4 1262 1656 725 726
+4 1262 1656 1177 726
+4 1262 1177 726 998
+4 1262 755 725 726
+4 1262 1656 724 725
+4 1262 756 726 998
+4 1262 755 756 998
+4 1262 755 756 726
+4 1262 755 754 725
+4 1262 724 754 725
+4 1262 1656 724 723
+4 1262 1656 723 1620
+4 1262 1177 1174 998
+4 1262 755 1174 998
+4 1262 754 1174 1441
+4 1262 755 754 1174
+4 1262 724 754 723
+4 1262 723 722 1620
+4 1262 1177 1111 1174
+4 1262 753 754 1441
+4 1262 753 754 723
+4 1262 722 1441 721
+4 1262 722 1620 721
+4 1262 753 723 722
+4 1262 1081 1174 1441
+4 1262 1081 1111 1441
+4 1262 1081 1111 1174
+4 1262 1441 720 721
+4 1262 1620 720 721
+4 1262 1620 1441 720
+4 1262 752 722 1441
+4 1262 753 752 1441
+4 1262 753 752 722
+4 1570 1656 1241 1177
+4 1570 1656 1241 1659
+4 1570 1656 1510 1659
+4 1570 1241 1177 1303
+4 1570 1241 973 1454
+4 1570 1510 1480 1454
+4 1570 1656 1510 1480
+4 1570 1662 1454 1303
+4 1570 1662 1241 1303
+4 1570 1662 1241 1454
+4 1570 1656 1480 1684
+4 824 793 823 1425
+4 824 854 823 1425
+4 824 854 823 853
+4 1450 1723 939 1209
+4 1450 1332 1723 1209
+4 1450 1332 908 1209
+4 1450 1747 1332 908
+4 1450 1747 1332 1781
+4 1543 1332 974 1722
+4 1543 1332 1723 974
+4 1543 1332 1722 1209
+4 1543 1332 1723 1209
+4 1543 1783 974 1722
+4 1543 1783 1002 1722
+4 1543 1002 1722 1209
+4 1543 1002 1723 1209
+4 1118 1353 1206 1715
+4 1118 1268 1353 1206
+4 1118 1206 1715 186
+4 1118 1057 1443 1715
+4 1118 1353 1443 1715
+4 1118 1268 1206 188
+4 1118 1353 1121 1443
+4 1118 1268 1353 1121
+4 1118 189 188 1057
+4 1118 1268 189 188
+4 1118 1145 1057 1443
+4 1118 1121 1145 1443
+4 1118 1268 1121 1392
+4 1118 1268 1392 189
+4 1118 1061 1145 1057
+4 1118 1121 1061 1145
+4 1118 1392 1057 1455
+4 1118 1121 1392 1455
+4 1118 189 1057 190
+4 1118 1392 1057 190
+4 1118 1392 189 190
+4 1118 1061 1057 1455
+4 1118 1121 1061 1455
+4 1685 1505 1713 1502
+4 1685 1505 1147 1713
+4 1685 1505 1538 1147
+4 1144 1505 1713 1502
+4 1144 1505 1205 1502
+4 1144 1354 1713 1502
+4 1144 1354 1205 1502
+4 1144 1354 1713 1146
+4 1144 1354 1205 1146
+4 545 544 575 1116
+4 545 546 575 1116
+4 515 1655 484 514
+4 515 485 1655 484
+4 515 485 1655 516
+4 695 696 1356 725
+4 695 696 1745 1356
+4 543 1682 512 513
+4 543 1682 512 542
+4 543 1682 514 513
+4 543 1682 544 514
+4 543 1682 1170 542
+4 543 573 544 1116
+4 543 1170 1621 542
+4 543 1621 542 572
+4 543 573 1621 572
+4 1444 1747 1505 1116
+4 1444 1505 1621 1502
+4 1444 1747 1203 1023
+4 1476 1627 908 1116
+4 1476 1747 908 1116
+4 1476 1747 1627 908
+4 1476 1444 1747 1116
+4 1476 1747 1203 1627
+4 1476 1444 1747 1203
+4 1476 1444 1203 1621
+4 1476 1505 1621 1116
+4 1476 1444 1505 1116
+4 1476 1444 1505 1621
+4 1476 543 573 1116
+4 1476 543 573 1621
+4 1476 543 544 1116
+4 1476 1621 572 1116
+4 1476 573 572 1116
+4 1476 573 1621 572
+4 1476 545 544 1116
+4 1686 1114 1147 1713
+4 1686 1114 1147 1568
+4 1686 1025 1114 1713
+4 1686 1025 1114 1568
+4 1686 1025 1713 1146
+4 1686 1025 1568 1146
+4 1686 1388 1568 1146
+4 1686 1388 1147 1568
+4 1686 1144 1713 1146
+4 1686 1144 1205 1146
+4 1686 1388 1205 1146
+4 1686 1538 1388 1205
+4 1686 1538 1388 1147
+4 1686 1505 1147 1713
+4 1686 1505 1538 1147
+4 1686 1144 1505 1713
+4 1686 1505 1538 1205
+4 1686 1144 1505 1205
+4 1034 940 1783 1245
+4 313 312 342 1242
+4 313 1544 312 1242
+4 313 1544 312 283
+4 1711 1785 1630 1691
+4 1711 1565 1630 1691
+4 1711 1565 1630 1772
+4 1711 913 1691 1324
+4 1711 1565 1691 1324
+4 1711 913 1324 1230
+4 1711 1630 1772 960
+4 1711 1324 1772 1230
+4 1711 1565 1324 1772
+4 481 1623 480 451
+4 481 1623 452 482
+4 481 1623 452 451
+4 481 1623 1773 482
+4 481 1623 480 1773
+4 481 511 1773 482
+4 481 480 511 1773
+4 1212 1333 1634 1448
+4 1212 1333 1125 1448
+4 1212 1333 1125 1634
+4 1235 1476 1621 1027
+4 1235 1476 1203 1621
+4 1235 1747 1627 1781
+4 1235 1476 1627 1027
+4 1235 1476 1203 1627
+4 1235 1747 1203 1023
+4 1235 1747 1203 1627
+4 1005 1002 1723 1031
+4 1005 1723 939 1031
+4 1417 543 1682 544
+4 1417 543 1682 1170
+4 1417 1476 543 544
+4 1417 1170 1621 1027
+4 1417 543 1170 1621
+4 1417 1476 1627 1027
+4 1417 1476 1621 1027
+4 1417 1476 543 1621
+4 1417 1476 545 544
+4 1417 545 546 1116
+4 1417 546 547 1116
+4 1417 547 548 518
+4 1417 1476 1627 1116
+4 1417 1476 545 1116
+4 1417 1627 548 549
+4 1417 1627 578 548
+4 1417 547 578 548
+4 1417 1627 1116 577
+4 1417 547 1116 577
+4 1417 547 517 518
+4 1417 1627 1781 549
+4 1417 1627 1781 1027
+4 1417 1627 578 577
+4 1417 547 578 577
+4 1417 1781 550 549
+4 614 584 974 583
+4 614 613 974 583
+4 614 613 584 583
+4 614 584 974 585
+4 614 615 974 585
+4 614 615 584 585
+4 614 1783 613 974
+4 614 615 1783 974
+4 614 613 643 644
+4 614 1783 643 644
+4 614 1783 613 643
+4 614 1783 645 644
+4 614 615 645 644
+4 614 615 1783 645
+4 612 974 1722 582
+4 612 613 974 582
+4 612 613 974 1722
+4 612 581 1722 611
+4 612 581 1722 582
+4 612 641 642 611
+4 612 641 1722 611
+4 612 641 1722 642
+4 612 1783 1722 642
+4 612 1783 613 1722
+4 612 1783 643 642
+4 612 1783 613 643
+4 1032 1124 1629 1329
+4 1032 1629 1171 1266
+4 1032 1629 1171 1329
+4 1032 1629 1333 1266
+4 1032 1124 1333 1266
+4 1032 1124 1629 1333
+4 1032 935 1171 1266
+4 1032 935 1171 1329
+4 523 524 1603 493
+4 523 1603 492 522
+4 523 1603 493 492
+4 523 524 1603 553
+4 523 1182 553 522
+4 523 1182 1603 522
+4 523 1182 1603 553
+4 523 524 493 494
+4 554 524 555 525
+4 554 523 524 553
+4 554 555 584 1215
+4 554 524 1603 553
+4 554 553 1781 1215
+4 554 584 1781 1215
+4 554 1182 1603 1215
+4 554 1182 1603 553
+4 554 553 1781 583
+4 554 584 1781 583
+4 554 584 553 583
+4 1363 553 1781 1215
+4 1363 554 553 1215
+4 1363 554 1182 1215
+4 1363 554 1182 553
+4 1363 553 1781 552
+4 1363 1182 1781 552
+4 1363 1182 553 552
+4 1690 1363 1182 1781
+4 1690 1417 1781 550
+4 1690 1603 1448 520
+4 1690 519 1448 520
+4 1690 1781 550 551
+4 1690 1182 1781 551
+4 1690 1417 550 549
+4 1690 1603 520 521
+4 1690 1182 1603 521
+4 1690 519 550 520
+4 1690 519 550 549
+4 1690 550 551 521
+4 1690 1182 551 521
+4 1690 550 520 521
+4 1062 1056 1633 1665
+4 1062 1176 1442 1665
+4 1062 1176 1056 1442
+4 1062 1176 1629 1665
+4 1062 1176 1056 1629
+4 1062 1629 1665 1477
+4 1062 1056 1665 1477
+4 1062 1056 1629 1477
+4 275 305 994 274
+4 275 276 305 994
+4 275 1387 994 274
+4 275 276 1387 994
+4 275 244 1387 274
+4 275 244 1387 245
+4 275 246 1387 245
+4 275 246 276 1387
+4 1150 1177 1174 998
+4 1150 1060 1174 998
+4 1150 1241 1177 998
+4 1150 1662 1241 1177
+4 1150 1060 1361 998
+4 1150 1241 1361 998
+4 1150 1662 1241 1361
+4 1782 731 732 1120
+4 1782 973 702 1120
+4 1782 732 702 1120
+4 1782 732 973 702
+4 1782 732 1241 973
+4 1782 731 732 1241
+4 1782 731 730 1120
+4 1782 731 1241 730
+4 1782 1510 973 1120
+4 1782 1510 1659 1120
+4 1782 1659 730 1120
+4 1782 1241 1659 730
+4 1782 1570 1241 973
+4 1782 1570 1241 1659
+4 1782 1570 1510 1659
+4 1782 1570 973 1454
+4 1782 1570 1510 1454
+4 734 733 973 704
+4 734 735 704 1364
+4 734 973 704 1364
+4 734 973 735 1364
+4 734 1784 973 735
+4 734 733 1784 973
+4 734 1784 735 764
+4 734 733 1784 764
+4 734 735 705 704
+4 734 765 735 764
+4 734 733 764 763
+4 727 1656 1356 726
+4 727 1087 1656 1356
+4 727 1087 1356 728
+4 727 1087 1656 728
+4 727 697 1356 728
+4 727 1656 726 998
+4 727 1656 728 998
+4 727 696 1356 726
+4 727 697 696 1356
+4 727 757 726 998
+4 727 757 728 998
+4 463 462 493 915
+4 463 464 493 915
+4 463 462 1184 915
+4 463 464 1184 915
+4 463 462 433 1184
+4 463 464 433 1184
+4 463 464 493 494
+4 463 464 433 434
+4 970 1542 1325 1564
+4 970 1542 1211 1564
+4 970 1542 1325 1777
+4 970 66 1564 67
+4 970 66 1325 67
+4 970 66 1325 1564
+4 970 997 1564 67
+4 970 1542 1300 1777
+4 970 68 997 67
+4 970 1090 997 1564
+4 970 1090 1211 1564
+4 970 1090 1211 997
+4 970 1325 1777 67
+4 970 68 1777 67
+4 970 69 68 997
+4 970 98 68 1777
+4 970 69 98 68
+4 970 1300 99 1777
+4 970 71 1211 72
+4 970 1211 971 997
+4 970 98 99 1777
+4 970 69 98 99
+4 970 1300 99 100
+4 970 69 99 100
+4 970 69 100 70
+4 970 71 100 70
+4 970 71 70 41
+4 970 71 1211 41
+4 970 71 72 102
+4 970 1211 73 72
+4 970 971 39 997
+4 970 69 39 997
+4 970 69 39 70
+4 970 101 1300 100
+4 970 71 101 100
+4 970 40 70 41
+4 970 73 72 102
+4 970 1542 1300 103
+4 970 1542 73 103
+4 970 101 1300 102
+4 970 71 101 102
+4 970 1211 73 74
+4 970 1542 73 74
+4 970 1542 1211 74
+4 970 40 39 70
+4 970 971 40 39
+4 970 971 40 41
+4 970 1211 971 41
+4 970 1300 102 103
+4 970 73 102 103
+4 1 1594 31 2
+4 1 1594 1323 2
+4 1 1594 1323 0
+4 1 1594 0 30
+4 1 1594 31 30
+4 1 1323 962 2
+4 1 1323 0 962
+4 1 871 962 2
+4 1 871 870 962
+4 1 0 870 962
+4 873 874 1501 962
+4 873 872 1501 962
+4 873 962 3 4
+4 873 874 962 4
+4 873 962 3 2
+4 873 872 962 2
+4 1774 1234 1267 1471
+4 1774 1234 937 1267
+4 1774 1051 1471 1327
+4 1774 1532 1051 1471
+4 1774 1234 937 1327
+4 1774 1051 814 1327
+4 1774 902 1471 1327
+4 1774 1234 902 1327
+4 1774 1234 902 1471
+4 1774 846 845 1327
+4 1774 937 846 1327
+4 1774 845 815 1327
+4 1774 844 845 815
+4 1774 814 815 1327
+4 1774 844 814 815
+4 1774 1051 814 813
+4 1449 1390 1423 945
+4 1449 1717 1423 1626
+4 1449 1390 1030 1511
+4 1449 937 1030 1511
+4 1449 937 1390 1030
+4 1449 1423 1626 1000
+4 1449 1390 1626 1000
+4 1449 1390 1423 1000
+4 701 1599 1422 702
+4 701 1599 702 1120
+4 701 732 702 1120
+4 701 731 732 1120
+4 694 693 1356 1200
+4 694 1745 1356 1200
+4 694 1745 693 1200
+4 694 695 1745 1356
+4 694 1356 724 723
+4 694 693 1356 723
+4 694 1356 724 725
+4 694 695 1356 725
+4 996 1745 1382 964
+4 996 1356 964 1680
+4 996 1382 964 1680
+4 996 1599 1356 964
+4 996 1745 1356 1680
+4 996 1745 1382 1680
+4 996 1304 1029 964
+4 996 1304 1779 1029
+4 996 1029 1083 964
+4 996 1745 1083 964
+4 996 1779 1029 1028
+4 996 1745 1779 1028
+4 996 696 1745 1356
+4 996 697 696 1356
+4 996 697 696 1745
+4 996 1264 1029 1083
+4 996 1264 1029 1028
+4 996 1264 1083 1028
+4 996 1745 1083 1028
+4 221 222 943 1033
+4 221 1238 943 1033
+4 221 220 1238 943
+4 221 222 1392 943
+4 221 220 1392 943
+4 221 1238 1720 1033
+4 221 220 1238 1720
+4 221 251 1720 1033
+4 221 220 1392 191
+4 221 192 1392 191
+4 221 192 222 1392
+4 247 277 278 1387
+4 247 246 1657 1387
+4 247 246 277 1387
+4 247 1238 1657 1115
+4 247 246 1657 1115
+4 247 246 1238 1115
+4 247 1238 216 217
+4 247 246 1238 216
+4 1299 1779 1599 1422
+4 1299 996 1779 1599
+4 1299 697 1599 1356
+4 1299 996 1599 1356
+4 1299 996 697 1356
+4 1299 996 1745 1779
+4 1299 996 697 1745
+4 1571 672 1154 642
+4 1571 672 1422 1154
+4 1571 1783 641 642
+4 1571 643 1154 642
+4 1571 1783 1270 641
+4 1571 1513 1605 1022
+4 1571 1783 643 642
+4 1571 643 644 1154
+4 667 1299 697 1745
+4 1754 1355 1092 1710
+4 1754 1355 1123 1092
+4 1754 1355 1751 1123
+4 1754 1092 1693 1710
+4 1754 1092 1485 1693
+4 1754 1092 1273 1485
+4 1754 1123 1092 1273
+4 1754 1273 1485 1155
+4 1754 1273 943 1155
+4 1754 1123 943 1155
+4 1754 1123 1273 943
+4 187 157 1715 186
+4 187 157 1057 1715
+4 187 157 188 1057
+4 187 1206 217 186
+4 187 1206 188 217
+4 187 1118 1715 186
+4 187 1118 1057 1715
+4 187 1118 188 1057
+4 187 1118 1206 186
+4 187 1118 1206 188
+4 372 1452 342 371
+4 372 1152 1452 371
+4 372 1152 373 1452
+4 372 1152 1752 371
+4 372 1152 373 1752
+4 372 373 1752 402
+4 372 1752 401 402
+4 372 1752 371 401
+4 1122 1536 1420 1095
+4 1122 1541 1420 1095
+4 1122 1481 1541 1420
+4 1122 1536 1350 1420
+4 1122 1481 1350 1420
+4 1122 1541 1064 1095
+4 1122 1601 1541 1064
+4 1122 1481 1601 1064
+4 1122 1481 1601 1541
+4 607 606 1205 577
+4 607 1388 1205 577
+4 607 1388 608 577
+4 607 606 1205 1146
+4 607 1388 1205 1146
+4 607 1388 608 1146
+4 1716 875 874 1626
+4 1716 874 1626 1501
+4 1716 1449 1717 1626
+4 1716 1626 1501 1652
+4 1716 1717 1626 1652
+4 1716 875 844 874
+4 1716 1532 1501 1652
+4 1716 873 874 1501
+4 1716 1774 1267 1532
+4 1716 875 844 845
+4 1716 872 1532 1501
+4 1716 873 872 1501
+4 1716 873 872 1532
+4 1716 1774 937 1267
+4 1716 1532 1717 1231
+4 1716 1267 1532 1231
+4 1716 1774 844 845
+4 1716 1774 844 1532
+4 314 315 344 345
+4 314 1544 344 345
+4 314 1544 315 345
+4 314 1544 344 1242
+4 314 313 1544 1242
+4 314 315 284 285
+4 314 1544 284 285
+4 314 1544 315 285
+4 314 1544 284 283
+4 314 313 284 283
+4 314 313 1544 283
+4 1210 1025 1568 1146
+4 1210 1360 1568 1146
+4 1210 1025 1270 1146
+4 1210 1360 1270 1146
+4 1210 1360 1002 1568
+4 1210 1360 1783 1002
+4 1210 1360 1783 1270
+4 999 1089 791 792
+4 999 1089 1153 792
+4 999 791 792 1001
+4 999 1153 792 1001
+4 999 790 791 1001
+4 999 1089 790 791
+4 999 1359 1089 1153
+4 999 790 1001 820
+4 999 1089 790 789
+4 999 1153 1778 1148
+4 999 1359 1778 1148
+4 999 1359 1153 1148
+4 999 1359 1447 1778
+4 999 1359 1089 1447
+4 999 819 1001 820
+4 999 1778 819 1001
+4 999 790 789 820
+4 999 1447 1778 1776
+4 999 789 819 820
+4 999 789 1567 819
+4 999 1778 1567 819
+4 999 789 1567 788
+4 999 1089 789 788
+4 999 1778 1567 1776
+4 999 1447 1506 1776
+4 999 1089 1447 1506
+4 999 1567 788 787
+4 999 1089 788 787
+4 999 1567 1776 787
+4 999 786 1506 1776
+4 999 1089 786 1506
+4 999 786 1776 787
+4 999 1089 786 787
+4 1395 1065 1425 1001
+4 1395 1065 1660 1001
+4 1395 1151 1660 1001
+4 1395 1151 1065 1660
+4 1395 1004 1151 1148
+4 1395 1153 1425 1001
+4 1395 1151 1778 1001
+4 1395 1151 1778 1148
+4 1395 1153 1778 1148
+4 1395 999 1778 1001
+4 1395 999 1153 1001
+4 1395 999 1153 1778
+4 1351 1004 1085 1148
+4 1351 1085 1148 1776
+4 1351 1500 1148 1776
+4 1351 1085 931 1776
+4 1351 1500 931 1776
+4 638 1270 608 609
+4 638 639 1270 609
+4 638 607 608 1146
+4 638 1270 608 1146
+4 640 1270 610 609
+4 640 639 1270 609
+4 640 1270 610 1722
+4 640 1270 641 1722
+4 640 610 1722 611
+4 640 641 1722 611
+4 640 1571 670 641
+4 1503 1570 1177 1303
+4 1503 1570 1656 1177
+4 1503 1570 1656 1684
+4 1503 1656 901 1620
+4 1503 1262 1656 1620
+4 1503 1262 1656 1177
+4 1503 1326 1684 901
+4 1503 1656 1326 901
+4 1503 1656 1326 1684
+4 794 824 793 1425
+4 794 1724 793 1153
+4 794 824 793 823
+4 794 1724 793 764
+4 794 1724 795 764
+4 794 795 765 764
+4 794 793 764 763
+4 825 855 854 1425
+4 825 824 854 1425
+4 825 824 855 854
+4 1482 1450 1332 1723
+4 1482 1444 1685 939
+4 1482 1450 1723 939
+4 1482 1005 1723 939
+4 1482 1444 1450 1747
+4 1178 1450 939 1209
+4 1178 1450 908 1209
+4 1178 1538 939 1209
+4 1178 1538 908 1209
+4 1178 1450 1747 908
+4 1178 1505 1538 908
+4 1178 1747 1505 908
+4 1178 1482 1450 939
+4 1178 1482 1450 1747
+4 1178 1685 1538 939
+4 1178 1685 1505 1538
+4 1178 1444 1747 1505
+4 1178 1482 1444 939
+4 1178 1482 1444 1747
+4 1178 1444 1685 939
+4 1178 1444 1685 1505
+4 343 313 342 1242
+4 343 1452 342 1242
+4 343 344 1452 1242
+4 343 314 344 1242
+4 343 314 313 1242
+4 343 314 313 344
+4 343 372 1452 342
+4 343 372 373 342
+4 343 372 373 1452
+4 343 344 1452 374
+4 343 373 1452 374
+4 343 373 344 374
+4 1358 1212 1125 1448
+4 1358 1212 1239 1125
+4 1358 1125 1202 1448
+4 1358 1239 1125 1202
+4 1358 1690 1212 1239
+4 1358 1533 1202 1448
+4 1358 1212 1634 1448
+4 1358 1622 1533 1202
+4 1358 1622 1239 1202
+4 1358 1603 1634 1448
+4 1358 1690 1603 1448
+4 1358 1212 1182 1634
+4 1358 1690 1212 1182
+4 1358 1182 1603 1634
+4 1358 1690 1182 1603
+4 1358 1533 1655 1448
+4 1358 1655 517 1448
+4 1358 1655 516 517
+4 1358 517 518 1448
+4 1358 519 518 1448
+4 1358 1690 519 1448
+4 1358 1690 519 518
+4 1563 1622 1239 1202
+4 1563 1622 1080 1202
+4 1593 991 1682 1261
+4 1593 1260 966 1261
+4 1593 1260 991 1261
+4 1593 991 1682 1622
+4 1593 1563 991 1622
+4 1593 1563 1622 1239
+4 1183 1690 1363 1182
+4 1183 1507 966 1514
+4 1183 1363 966 1514
+4 1183 1690 1212 1239
+4 1183 1690 1212 1182
+4 1059 1417 1781 1027
+4 1059 1363 1635 1514
+4 1059 1635 1781 1215
+4 1059 1363 1781 1215
+4 1059 1363 1635 1215
+4 1059 1627 1781 1027
+4 1059 1235 1627 1027
+4 1059 1235 1627 1781
+4 1059 1690 1417 1781
+4 1059 1690 1363 1781
+4 1059 1363 966 1514
+4 942 1662 1361 1334
+4 942 1150 1662 1361
+4 942 1662 1334 1515
+4 942 1724 1361 1334
+4 942 1150 1060 1361
+4 942 1662 1177 1515
+4 942 1150 1662 1177
+4 942 1060 1574 1174
+4 942 1150 1060 1174
+4 942 1177 1111 1174
+4 942 1150 1177 1174
+4 942 1177 1515 1303
+4 942 1177 1111 1303
+4 1508 937 1267 1511
+4 1508 1449 937 1511
+4 1508 1267 1301 1511
+4 1508 1449 1390 1511
+4 1508 1716 937 1267
+4 1508 1716 1449 1717
+4 1508 1301 1511 945
+4 1508 1390 1511 945
+4 1508 1449 1390 945
+4 1508 1267 1301 1231
+4 1508 1716 1717 1231
+4 1508 1716 1267 1231
+4 1508 1717 1423 1231
+4 1508 1301 1423 1231
+4 1508 1301 1423 945
+4 1508 1449 1423 945
+4 1508 1449 1717 1423
+4 671 1571 672 1422
+4 671 1571 670 641
+4 671 1571 641 642
+4 671 1571 672 642
+4 248 249 1238 1720
+4 248 247 1657 1387
+4 248 247 278 1387
+4 248 249 1657 1720
+4 248 279 938 278
+4 248 279 249 938
+4 248 1238 1657 1720
+4 248 247 1238 1657
+4 248 938 1657 1387
+4 248 249 938 1657
+4 248 938 278 1387
+4 700 1299 699 1599
+4 700 1299 670 1422
+4 700 701 1599 1422
+4 700 1299 1599 1422
+4 700 1599 729 730
+4 700 699 1599 729
+4 700 1599 730 1120
+4 700 701 1599 1120
+4 700 731 730 1120
+4 700 701 731 1120
+4 1446 1571 1605 1022
+4 1446 1571 1479 1605
+4 1446 1479 1058 1605
+4 1446 1264 1058 1028
+4 1446 1479 1058 1028
+4 1446 1264 1083 1028
+4 1446 1479 1083 1028
+4 1446 1264 1083 1771
+4 1446 1293 1083 1771
+4 1446 1264 1650 1022
+4 1446 1264 1650 1771
+4 1446 1293 1650 1022
+4 1446 1293 1650 1771
+4 1446 1479 1745 1083
+4 1272 1173 1513 1022
+4 1272 940 1270 1245
+4 1272 1513 1245 1605
+4 1272 1571 1513 1605
+4 1272 1783 1270 1245
+4 1272 1571 1783 1270
+4 1272 1575 1513 1245
+4 1272 940 1575 1245
+4 666 695 1745 665
+4 666 695 696 1745
+4 666 1745 665 1083
+4 666 697 696 1745
+4 666 667 697 1745
+4 666 1293 665 1083
+4 666 1293 665 635
+4 193 162 1392 163
+4 193 192 162 1392
+4 193 1392 1305 194
+4 193 192 1392 223
+4 193 164 194 163
+4 193 164 1305 163
+4 193 164 1305 194
+4 193 1003 1305 163
+4 193 1003 1392 163
+4 193 1003 1392 1305
+4 193 224 1392 194
+4 193 224 1392 223
+4 193 192 222 223
+4 907 875 876 1626
+4 907 1716 875 1626
+4 907 877 876 1626
+4 907 875 876 845
+4 907 1716 875 845
+4 907 877 876 846
+4 907 876 846 845
+4 907 1390 1626 1000
+4 907 877 1626 1000
+4 907 1449 1390 1626
+4 907 1716 1449 1626
+4 907 877 847 846
+4 907 1774 846 845
+4 907 1716 1774 845
+4 907 1390 878 1000
+4 907 877 878 1000
+4 907 1449 937 1390
+4 907 877 847 878
+4 907 937 847 846
+4 907 1774 937 846
+4 907 1716 1774 937
+4 907 1508 1449 937
+4 907 1508 1716 937
+4 907 1508 1716 1449
+4 907 878 849 848
+4 907 847 878 848
+4 907 937 847 848
+4 907 937 849 848
+4 907 878 879 849
+4 907 1390 879 849
+4 907 1390 878 879
+4 907 850 1390 849
+4 907 850 937 849
+4 907 850 937 1390
+4 963 1210 1025 1270
+4 963 1210 940 1270
+4 963 1025 1270 1414
+4 963 940 1270 1414
+4 963 1210 1025 1568
+4 963 1210 940 1568
+4 963 1025 1020 1414
+4 963 940 1173 1414
+4 963 1141 1173 1414
+4 637 638 607 1146
+4 637 1270 1414 1146
+4 637 638 1270 1146
+4 1539 640 639 670
+4 1539 640 1571 670
+4 1539 669 639 670
+4 1539 640 639 1270
+4 1539 638 639 1270
+4 1539 1571 1270 641
+4 1539 640 1270 641
+4 1539 640 1571 641
+4 1539 1272 1571 1270
+4 1539 637 638 1270
+4 1539 1299 1479 1745
+4 1539 667 1299 1745
+4 1539 637 638 667
+4 1539 940 1270 1173
+4 1539 1272 940 1173
+4 1539 1272 940 1270
+4 1539 1270 1173 1414
+4 1539 637 1270 1414
+4 1539 666 667 1745
+4 1539 1446 1571 1479
+4 1539 1293 1173 1022
+4 1539 1272 1173 1022
+4 1539 1446 1479 1745
+4 1539 1446 1293 1022
+4 1539 1446 1571 1022
+4 1539 1446 1745 1083
+4 1539 666 1745 1083
+4 1539 1446 1293 1083
+4 1539 666 1293 1083
+4 1539 1571 1513 1022
+4 1539 1272 1513 1022
+4 1539 1272 1571 1513
+4 668 1539 638 639
+4 668 1539 669 639
+4 668 1539 638 667
+4 668 1539 667 1299
+4 1509 1593 966 1239
+4 1509 1593 1563 1239
+4 1509 1183 1212 1239
+4 1509 1183 1507 1725
+4 1509 1183 1507 966
+4 1509 1183 1690 1239
+4 1172 1509 1507 1725
+4 1172 1593 1260 991
+4 1172 1593 1563 991
+4 1172 1509 1593 1563
+4 1172 1260 1507 966
+4 1172 1593 1260 966
+4 1172 1509 1507 966
+4 1172 1509 1593 966
+4 1654 1059 966 1514
+4 1654 1260 1507 966
+4 1654 1260 966 1261
+4 1654 1417 1170 1027
+4 1654 1059 1417 1027
+4 1654 1682 1170 1261
+4 1654 1417 1682 1170
+4 1654 1593 966 1261
+4 1654 1593 1682 1261
+4 995 1358 1622 1239
+4 995 1593 1622 1239
+4 995 1593 1682 1622
+4 995 1682 1622 1533
+4 995 1358 1622 1533
+4 995 1654 1417 1682
+4 995 1654 1593 1682
+4 995 1358 1533 1655
+4 995 1358 516 517
+4 995 1654 1593 966
+4 995 1533 514 513
+4 995 1682 514 513
+4 995 1682 1533 513
+4 995 1533 1655 514
+4 995 515 1655 514
+4 995 515 545 514
+4 995 515 1655 516
+4 995 1358 1655 516
+4 995 515 545 516
+4 995 547 516 517
+4 995 1417 547 517
+4 995 1682 544 514
+4 995 545 544 514
+4 995 545 546 516
+4 995 1417 545 546
+4 995 1417 1682 544
+4 995 1417 545 544
+4 995 546 547 516
+4 995 1417 546 547
+4 1298 1059 1690 1417
+4 1298 1654 1059 966
+4 1298 1654 1059 1417
+4 1298 995 1654 966
+4 1298 995 1654 1417
+4 1298 995 1593 966
+4 1298 1509 1183 966
+4 1298 1509 1183 1690
+4 1298 1183 1363 966
+4 1298 1059 1363 966
+4 1298 1183 1690 1363
+4 1298 1059 1690 1363
+4 1298 1593 966 1239
+4 1298 1690 519 518
+4 1298 1417 517 518
+4 1298 995 1417 517
+4 1298 1358 1690 518
+4 1298 1509 966 1239
+4 1298 1509 1690 1239
+4 1298 1358 1690 1239
+4 1298 995 1358 1239
+4 1298 995 1593 1239
+4 1298 519 548 518
+4 1298 1417 548 518
+4 1298 1690 519 549
+4 1298 1690 1417 549
+4 1298 1358 517 518
+4 1298 995 1358 517
+4 1298 519 548 549
+4 1298 1417 548 549
+4 1780 671 670 1422
+4 1780 671 1571 1422
+4 1780 671 1571 670
+4 1780 1299 670 1422
+4 1780 1539 1571 670
+4 1780 1299 1779 1422
+4 1780 1539 1299 1479
+4 1780 1539 1571 1479
+4 1780 669 1299 670
+4 1780 1539 669 670
+4 1780 1779 1572 1422
+4 1780 1299 1745 1779
+4 1780 1299 1479 1745
+4 1780 1572 1422 1154
+4 1780 1571 1422 1154
+4 1780 1479 1572 1605
+4 1780 1571 1479 1605
+4 1780 668 669 1299
+4 1780 668 1539 1299
+4 1780 668 1539 669
+4 1780 1779 1572 1028
+4 1780 1479 1572 1028
+4 1780 1745 1779 1028
+4 1780 1479 1745 1028
+4 1780 1572 1664 1154
+4 1780 1572 1664 1605
+4 1780 1664 1154 1605
+4 1780 1571 1154 1605
+4 400 1752 401 370
+4 400 399 1752 370
+4 400 1752 401 941
+4 400 431 401 941
+4 400 430 431 941
+4 400 430 1689 941
+4 400 399 1689 941
+4 400 1718 1752 941
+4 400 399 1718 941
+4 400 399 1718 1752
+4 400 430 429 1689
+4 400 399 429 1689
+4 636 666 1293 635
+4 636 1293 1173 635
+4 636 1539 666 1293
+4 636 605 1414 635
+4 636 605 606 1414
+4 636 1173 1414 635
+4 636 606 1414 1146
+4 636 637 1414 1146
+4 636 1539 1293 1173
+4 636 1539 666 667
+4 636 1539 637 667
+4 636 1539 1173 1414
+4 636 1539 637 1414
+4 636 607 606 1146
+4 636 637 607 1146
+4 698 1299 699 1599
+4 698 1299 697 1599
+4 698 697 1599 1356
+4 698 1087 1599 1356
+4 698 697 1356 728
+4 698 1087 1356 728
+4 698 1087 1599 728
+4 698 1599 729 728
+4 698 699 1599 729
+4 843 1716 844 1532
+4 843 1716 873 1532
+4 843 873 872 1532
+4 843 1774 844 1532
+4 843 873 844 874
+4 843 1716 844 874
+4 843 1716 873 874
+4 843 1774 1051 813
+4 843 1774 1532 1051
+4 843 1774 814 813
+4 843 1774 844 814
+4 1742 1654 1170 1261
+4 1742 1654 1260 1261
+4 1742 1170 1621 1027
+4 1742 1654 1170 1027
+4 1742 1654 1059 1027
+4 1742 1654 1059 1514
+4 1742 1235 1621 1027
+4 1742 1059 1235 1027
+4 842 872 841 1532
+4 842 843 872 1532
+4 842 841 1532 1051
+4 842 843 1532 1051
+4 842 1051 812 811
+4 842 841 1051 811
+4 842 1051 812 813
+4 842 843 1051 813
+4 1666 224 225 1155
+4 1666 255 254 1033
+4 1666 224 254 1033
+4 1666 224 1033 1155
+4 1666 1274 1033 1155
+4 1666 1095 1274 1033
+4 1666 255 1095 1033
+4 1529 1322 903 1201
+4 1529 1322 1420 1201
+4 1529 1322 1350 1420
+4 1529 1481 1420 1201
+4 1529 1481 1350 1420
+4 1559 940 1575 1245
+4 1559 1034 940 1245
+4 1559 1141 1173 1022
+4 1559 1034 940 992
+4 1559 1173 1513 1022
+4 1559 1575 1513 1022
+4 1559 963 1141 1173
+4 1559 963 940 992
+4 1559 963 940 1173
+4 1559 1272 1575 1513
+4 1559 1272 940 1575
+4 1559 1272 1173 1513
+4 1559 1272 940 1173
+4 1344 1114 1002 1568
+4 1344 1210 1002 1568
+4 1344 1025 1114 1568
+4 1344 1025 1114 1020
+4 1344 1210 940 1568
+4 1344 963 1025 1568
+4 1344 963 1025 1020
+4 1344 963 940 1568
+4 1344 1034 940 992
+4 1344 963 940 992
+4 1578 945 1000 1091
+4 1578 1626 1000 1741
+4 1578 1423 1626 1741
+4 1578 1423 1626 1000
+4 1578 1390 945 1000
+4 1578 1390 1423 1000
+4 1578 1390 1423 945
+4 1787 1213 1214 1275
+4 1787 1213 1214 914
+4 1787 1214 914 1091
+4 269 932 240 1050
+4 269 932 240 1380
+4 269 240 270 1050
+4 269 930 240 1380
+4 1756 1666 1274 1155
+4 1756 1751 1483 1545
+4 1756 1180 1751 1545
+4 1756 1180 1751 1123
+4 1756 943 1274 1155
+4 1756 1123 943 1155
+4 1756 1180 943 1274
+4 1756 1180 1123 943
+4 1756 1721 1274 1545
+4 1756 1180 1721 1545
+4 1756 1180 1721 1274
+4 1408 1026 1561 1201
+4 1336 1510 973 1364
+4 1336 1510 1480 1512
+4 1336 1782 973 1454
+4 1336 1782 1510 973
+4 1336 1510 1480 1454
+4 1336 1782 1510 1454
+4 1306 1362 1599 1364
+4 1306 1779 1599 1364
+4 1306 1304 1779 1364
+4 1306 1304 1445 964
+4 1306 996 1779 1599
+4 1306 996 1304 1779
+4 1306 996 1599 964
+4 1306 996 1304 964
+4 1306 1445 964 1680
+4 466 495 465 915
+4 466 1184 465 915
+4 466 435 1184 465
+4 239 210 1740 180
+4 239 930 210 1740
+4 1165 269 932 1380
+4 1739 1529 1322 903
+4 1739 270 300 301
+4 1739 1322 994 1050
+4 1739 1322 903 994
+4 1739 271 270 1050
+4 1739 271 270 301
+4 1739 903 300 301
+4 1739 271 994 1050
+4 1739 1529 903 1201
+4 1739 903 302 301
+4 1739 903 302 994
+4 1739 272 271 301
+4 1739 272 271 994
+4 1739 903 1561 300
+4 1739 903 1561 1201
+4 1739 272 302 301
+4 1739 272 302 994
+4 268 1165 269 932
+4 268 269 930 1380
+4 268 1165 269 1380
+4 1337 1208 1415 1331
+4 1337 1573 1208 1331
+4 1337 1269 1415 1331
+4 1588 1774 1532 1471
+4 1588 1774 1267 1440
+4 1588 1774 1267 1532
+4 1588 1267 1231 1440
+4 1588 1267 1532 1231
+4 1678 1532 1717 1231
+4 1678 1532 1501 1652
+4 1678 1717 1423 1652
+4 1678 1717 1423 1231
+4 1678 1716 1717 1652
+4 1678 1716 1532 1652
+4 1678 1716 1532 1717
+4 951 1578 1423 945
+4 898 1591 1501 962
+4 898 28 1591 962
+4 29 1591 0 962
+4 29 28 1591 962
+4 29 0 870 962
+4 1576 1744 1535 910
+4 1576 982 914 1142
+4 1576 1535 914 1142
+4 1576 1535 910 914
+4 1576 982 1787 914
+4 1307 1787 914 1091
+4 1307 1578 945 1091
+4 1307 1787 1214 1091
+4 1307 884 945 885
+4 1307 884 945 1091
+4 1307 1214 884 1091
+4 1307 884 14 885
+4 1307 1214 884 14
+4 1307 15 14 885
+4 1307 1214 15 14
+4 984 1591 1535 1084
+4 984 1535 914 1142
+4 984 982 914 1142
+4 1617 1501 1743 1741
+4 1617 1591 1743 1741
+4 1617 1591 1501 1743
+4 1617 1501 1652 1741
+4 1617 1678 1501 1652
+4 1617 1423 1652 1741
+4 1617 1578 1423 1741
+4 1617 1678 1423 1652
+4 1617 1678 1578 1423
+4 1066 1724 795 765
+4 1066 1784 1334 1515
+4 1066 1724 1784 1334
+4 1066 794 1724 795
+4 1066 942 1724 1334
+4 1066 942 1724 1361
+4 1159 1066 1784 1515
+4 1486 1336 1510 1364
+4 1486 1336 1510 1512
+4 1486 1510 1120 1364
+4 1486 1362 1120 1364
+4 1486 1362 1510 1120
+4 1486 1362 1510 1512
+4 1486 1362 1512 1297
+4 1637 1336 1480 1454
+4 1637 1570 1480 1454
+4 1637 1570 1480 1684
+4 1637 1480 1512 1684
+4 1637 1336 1480 1512
+4 1637 1503 1570 1684
+4 1637 1570 1454 1303
+4 1637 1503 1570 1303
+4 1730 1159 1066 1515
+4 1730 1159 1066 768
+4 1757 555 585 1215
+4 1757 585 1215 975
+4 946 615 1783 974
+4 946 1543 1783 974
+4 946 1543 1783 1002
+4 436 466 435 465
+4 436 466 435 1184
+4 436 435 1184 1394
+4 927 1351 1085 931
+4 1199 902 1712 931
+4 1199 902 1051 931
+4 1199 1534 902 1712
+4 1199 1085 1712 931
+4 1199 927 1085 931
+4 1199 902 1051 1471
+4 1100 1785 1484 1035
+4 1100 1071 1785 1035
+4 1521 1240 1602 1424
+4 1521 1753 1240 1602
+4 1521 1213 1602 1424
+4 1521 1213 1753 1602
+4 1727 1305 195 1455
+4 1727 1244 195 1455
+4 1727 1485 1244 1155
+4 1217 1003 972 912
+4 1217 1003 1305 912
+4 1217 1003 972 1455
+4 1217 1003 1305 1455
+4 1217 1727 1305 1455
+4 1217 1727 1459 1305
+4 1255 1483 1082 1470
+4 1255 1751 1483 1082
+4 1766 932 1470 1380
+4 1766 1165 1470 1380
+4 1766 1165 932 1380
+4 1766 1265 932 1537
+4 1766 1265 932 1470
+4 1766 1255 1165 1470
+4 1766 1265 1721 1537
+4 1766 1265 1082 1470
+4 1766 1265 1721 1082
+4 1766 1255 1483 1470
+4 1766 1721 1694 1537
+4 1766 1483 1082 1470
+4 1766 1180 1483 1545
+4 1766 1180 1721 1545
+4 1766 1180 1483 1082
+4 1766 1180 1721 1082
+4 299 1739 270 1050
+4 299 269 270 1050
+4 299 268 269 1050
+4 267 268 930 1380
+4 267 268 1165 1380
+4 1456 1337 1208 1415
+4 1456 933 1208 1415
+4 1456 933 1208 1472
+4 1456 1374 1337 1415
+4 1456 1560 933 1415
+4 1456 1560 933 1472
+4 1017 1237 1271 1416
+4 1017 1625 1237 1416
+4 1017 1625 1592 1416
+4 1376 1199 927 1085
+4 1376 1199 1085 1712
+4 1109 1588 1774 1440
+4 1109 1588 1774 1471
+4 1109 1774 1267 1440
+4 1109 1774 1267 1471
+4 1109 1267 1291 1440
+4 1109 1234 1267 1471
+4 1109 1234 1267 1291
+4 1109 1234 902 1471
+4 1015 1588 1532 1231
+4 1015 1678 1532 1231
+4 899 1501 870 962
+4 899 898 1501 962
+4 899 29 870 962
+4 899 898 28 962
+4 899 29 28 962
+4 1283 1678 1578 1423
+4 1283 951 1578 1423
+4 1283 1617 1678 1578
+4 1283 1617 1678 1501
+4 1047 1532 840 870
+4 1047 1015 1588 1532
+4 1047 1015 1588 1495
+4 1047 899 898 1501
+4 1047 1532 1501 870
+4 1047 899 1501 870
+4 1047 1015 1678 1532
+4 1047 1678 1532 1501
+4 1047 1283 1678 1501
+4 1734 982 1787 914
+4 1734 1307 1787 914
+4 1734 1283 1307 1578
+4 1734 1283 1617 1578
+4 1734 1591 1084 1741
+4 1734 1617 1591 1741
+4 1734 1617 1591 1501
+4 1246 1395 1604 1153
+4 1246 1395 1065 1425
+4 1246 1395 1004 1151
+4 1584 1264 1382 1771
+4 1584 1264 1029 1695
+4 1584 1382 1445 964
+4 1584 1029 1445 964
+4 1584 1264 1382 964
+4 1584 1264 1029 964
+4 856 826 825 855
+4 985 1359 1604 1093
+4 985 1207 1530 1093
+4 985 1207 1295 1530
+4 985 1359 1207 1093
+4 985 1359 1207 1295
+4 985 1447 1295 1530
+4 985 1359 1447 1295
+4 985 1447 1500 1530
+4 985 1351 1500 1148
+4 985 927 1351 1500
+4 985 927 1221 1351
+4 985 1447 1500 1148
+4 985 1359 1447 1148
+4 1162 985 1604 1093
+4 1162 985 1221 1604
+4 1348 750 781 780
+4 1348 750 781 751
+4 1348 752 781 751
+4 1348 752 900 1531
+4 1348 750 751 1441
+4 1348 1081 900 1441
+4 1348 781 782 1531
+4 1348 752 782 1531
+4 1348 752 781 782
+4 1348 752 751 1441
+4 1348 752 900 1441
+4 1249 1401 1341 1605
+4 659 1141 1650 630
+4 1728 1066 796 795
+4 1728 1162 1613 1093
+4 1728 1246 1604 1153
+4 1728 1162 1604 1093
+4 1728 1246 1221 1604
+4 1728 1162 1221 1604
+4 1338 1784 973 1515
+4 1338 1159 1784 1515
+4 1338 1159 1784 973
+4 1338 973 1454 1515
+4 1338 1336 973 1454
+4 1558 1177 1111 1303
+4 1558 1503 1177 1303
+4 1558 1262 1177 1111
+4 1558 1503 1262 1177
+4 1038 1486 1362 1364
+4 1038 1486 1336 1364
+4 955 1486 1336 1512
+4 955 1637 1336 1512
+4 955 1486 1512 1297
+4 955 1038 1486 1336
+4 955 1512 1684 1297
+4 955 1637 1512 1684
+4 955 1038 1486 1297
+4 955 1684 901 1297
+4 1019 942 1111 1174
+4 1019 942 1574 1174
+4 1019 1081 1111 1174
+4 1019 1081 1174 900
+4 1019 1574 1174 900
+4 1019 1348 1081 900
+4 916 1757 1215 975
+4 916 1757 1635 1215
+4 916 1781 1215 975
+4 916 1332 1781 975
+4 916 1635 1781 1215
+4 916 1235 1747 1781
+4 916 1235 1747 1023
+4 916 1059 1635 1781
+4 916 1059 1235 1781
+4 916 1059 1235 1635
+4 1606 1723 974 975
+4 1606 946 974 975
+4 1606 1543 1723 974
+4 1606 946 1543 974
+4 1606 1543 1002 1723
+4 1606 946 1543 1002
+4 1460 1217 1459 1305
+4 1760 1240 1750 1243
+4 1760 1753 1240 1243
+4 1760 1521 1753 1240
+4 1760 1240 1750 997
+4 1760 1240 997 1596
+4 1760 1240 1475 1596
+4 1760 1240 1475 1424
+4 1760 1521 1240 1424
+4 1760 1744 1475 1424
+4 986 29 28 1591
+4 986 898 28 1591
+4 986 1323 0 30
+4 986 29 0 30
+4 986 1323 1591 0
+4 986 29 1591 0
+4 986 898 1591 1501
+4 986 1734 1591 1501
+4 1788 1727 1244 1455
+4 1788 1121 1485 1244
+4 1788 1727 1485 1244
+4 1788 1217 1727 1455
+4 1788 1217 1727 1459
+4 1579 972 912 1681
+4 1579 1217 912 1681
+4 1579 1217 972 912
+4 1579 972 1681 1389
+4 1579 1053 1681 1389
+4 1367 1579 972 1389
+4 1367 1579 1217 972
+4 1367 1579 1217 1459
+4 1367 1788 1217 1459
+4 1367 1217 972 1455
+4 1367 1788 1217 1455
+4 1349 1197 1140 1412
+4 1349 1197 1290 1140
+4 57 986 28 27
+4 57 986 58 28
+4 209 239 1740 180
+4 1107 930 1380 1740
+4 1107 267 1165 266
+4 1107 267 268 930
+4 1107 267 930 1380
+4 1107 267 1165 1380
+4 1107 1082 1380 1740
+4 59 986 29 30
+4 59 986 58 28
+4 59 986 29 28
+4 59 1594 1323 30
+4 59 986 1323 30
+4 59 986 1594 1323
+4 1709 1766 932 1537
+4 1709 1766 1165 932
+4 1709 932 904 1537
+4 1709 1302 904 1537
+4 1709 1302 904 1365
+4 1279 1756 1274 1545
+4 1279 1766 1721 1545
+4 1279 1766 1721 1694
+4 1279 1721 1274 1545
+4 1279 1721 1694 1274
+4 1127 1064 1095 285
+4 1127 1122 1536 1095
+4 1499 1739 1322 1050
+4 1499 1322 965 1050
+4 1499 1143 1322 965
+4 1499 1529 1322 1350
+4 1499 1739 1529 1322
+4 329 1739 270 300
+4 329 299 1739 270
+4 1287 267 268 1165
+4 1287 268 1165 932
+4 1287 267 1165 266
+4 1287 269 932 1050
+4 1287 268 269 1050
+4 1287 268 269 932
+4 1287 932 904 1050
+4 346 1573 944 345
+4 948 1152 1573 375
+4 948 1573 375 345
+4 948 346 375 345
+4 948 346 1573 345
+4 948 1152 375 1752
+4 406 436 435 405
+4 1640 1408 1026 1663
+4 1247 1601 1026 944
+4 1247 1026 1663 944
+4 1247 1408 1026 1663
+4 1247 1601 1026 1201
+4 1247 1408 1026 1201
+4 1247 1640 1408 1663
+4 1136 1560 1472 990
+4 1618 1739 1561 1201
+4 1618 1408 1561 1201
+4 1618 1739 1529 1201
+4 1618 1739 1561 300
+4 1618 329 1739 300
+4 1676 1199 902 1471
+4 1676 1109 1588 1471
+4 1281 1728 1246 1221
+4 1281 1728 1162 1221
+4 1224 1588 1231 1440
+4 1224 1015 1588 1440
+4 1224 1015 1588 1231
+4 1224 1301 1423 945
+4 1224 1301 1423 1231
+4 1224 951 1423 945
+4 1224 1283 951 1423
+4 1224 1015 1678 1231
+4 1224 1678 1423 1231
+4 1524 1015 1588 1495
+4 1191 1283 951 1578
+4 1191 1283 1307 1578
+4 1191 951 1578 945
+4 1191 1307 1578 945
+4 869 1047 899 898
+4 869 1047 1532 840
+4 869 1047 840 870
+4 869 1047 899 870
+4 1195 1047 1015 1495
+4 1195 1047 1283 1495
+4 1195 1524 1015 1495
+4 1195 1524 1283 1495
+4 1195 1047 1015 1678
+4 1195 1047 1283 1678
+4 1195 1524 1015 951
+4 1195 1524 1283 951
+4 1195 1224 1015 1678
+4 1195 1224 1283 951
+4 1195 1283 1678 1423
+4 1195 1224 1678 1423
+4 1195 1224 1283 1423
+4 1040 1734 1084 1741
+4 1040 984 982 914
+4 1040 1734 982 914
+4 1040 1734 984 982
+4 1040 984 1591 1084
+4 1040 1734 1591 1084
+4 1040 1734 984 1591
+4 1040 1628 914 1091
+4 1040 1535 1628 914
+4 1040 984 1535 914
+4 1040 1535 1084 1628
+4 1040 984 1535 1084
+4 1040 1628 1000 1091
+4 1040 1084 1628 1000
+4 1040 1617 1578 1741
+4 1040 1734 1617 1741
+4 1040 1734 1617 1578
+4 1040 1734 1307 914
+4 1040 1734 1307 1578
+4 1040 1578 1000 1091
+4 1040 1578 1000 1741
+4 1040 1307 914 1091
+4 1040 1307 1578 1091
+4 1040 1626 1000 1741
+4 1040 1626 1084 1741
+4 1040 1626 1084 1000
+4 896 1283 1617 1501
+4 896 1734 1617 1501
+4 1366 1246 1221 1604
+4 1366 1246 1221 1004
+4 1366 985 1221 1604
+4 1366 1351 1004 1148
+4 1366 1246 1395 1604
+4 1366 1395 1004 1148
+4 1366 1246 1395 1004
+4 1366 1359 1604 1148
+4 1366 985 1359 1148
+4 1366 985 1359 1604
+4 1366 985 1351 1148
+4 1366 985 1221 1351
+4 1366 1604 1153 1148
+4 1366 1395 1153 1148
+4 1366 1395 1604 1153
+4 1188 587 1757 588
+4 1188 1606 946 975
+4 646 676 645 675
+4 689 1650 660 630
+4 689 659 1650 630
+4 857 856 827 826
+4 886 856 855 885
+4 886 1307 945 885
+4 1696 856 855 885
+4 1696 855 854 885
+4 1696 855 854 1425
+4 1696 886 945 885
+4 1696 886 856 885
+4 1696 825 855 1425
+4 1696 856 825 855
+4 1696 884 945 885
+4 1696 884 854 885
+4 1696 884 854 945
+4 1696 854 853 945
+4 1696 854 853 1425
+4 1696 857 856 827
+4 1696 826 825 1425
+4 1696 856 826 825
+4 1696 1030 1511 945
+4 1696 1301 1511 945
+4 1696 853 1425 1001
+4 1696 827 826 1425
+4 1696 856 827 826
+4 1696 1390 853 945
+4 1696 1390 1030 945
+4 1696 1030 853 1001
+4 1696 1030 853 852
+4 1696 1390 853 852
+4 1696 1390 1030 852
+4 779 1348 750 1441
+4 779 750 1441 720
+4 1518 1549 709 739
+4 1518 735 705 1364
+4 1518 973 735 1364
+4 1518 1338 1336 973
+4 1518 1338 1159 973
+4 1488 1664 1154 1364
+4 1488 1248 1154 1364
+4 1488 1304 1664 1364
+4 1577 1264 1058 1695
+4 1577 1572 1058 1605
+4 1577 1572 1664 1605
+4 1577 1572 1058 1695
+4 1577 1572 1664 1695
+4 1577 1584 1264 1695
+4 1646 1559 1141 1022
+4 1646 1293 1650 1022
+4 1646 1141 1293 1022
+4 1646 1141 1293 1650
+4 1007 1575 1245 1605
+4 1007 1401 1575 1605
+4 1007 1249 1401 1605
+4 1007 1559 1575 1245
+4 1007 1249 1401 1341
+4 1007 1559 1034 1245
+4 1457 1249 1341 1605
+4 1457 676 677 1154
+4 1457 645 644 1154
+4 1457 646 676 645
+4 1457 1007 1245 1605
+4 1457 1007 1249 1605
+4 1457 615 1783 645
+4 1457 1571 1154 1605
+4 1457 1571 644 1154
+4 1457 1783 645 644
+4 1457 645 1154 675
+4 1457 676 1154 675
+4 1457 676 645 675
+4 1457 1272 1245 1605
+4 1457 1272 1571 1605
+4 1457 1272 1783 1245
+4 1457 1272 1571 1783
+4 1457 1783 643 644
+4 1457 1571 643 644
+4 1457 1571 1783 643
+4 1589 659 1141 630
+4 1589 1141 631 630
+4 1589 963 1020 1414
+4 1589 963 1141 1414
+4 1589 600 601 630
+4 1589 600 1020 601
+4 1589 1646 1559 1141
+4 1589 601 631 630
+4 1589 601 1414 631
+4 1589 1020 601 1414
+4 1589 632 1414 631
+4 1589 1141 632 631
+4 1589 1141 632 1414
+4 1589 1559 963 1141
+4 1340 1730 1066 768
+4 1340 1728 1066 768
+4 1340 1764 1730 771
+4 1340 1728 1613 1093
+4 1340 802 1764 1613
+4 1216 1281 1728 1246
+4 1216 827 826 1425
+4 1216 1728 796 795
+4 1216 1246 1395 1425
+4 1216 1246 1065 1425
+4 1216 826 825 1425
+4 1216 826 796 825
+4 1216 796 825 795
+4 1216 1246 1395 1153
+4 1216 1728 1246 1153
+4 1216 825 794 795
+4 1216 1395 1153 1425
+4 1216 794 795 1153
+4 1216 794 824 1425
+4 1216 825 824 1425
+4 1216 825 794 824
+4 1216 793 1153 1425
+4 1216 794 793 1425
+4 1216 794 793 1153
+4 1276 1728 1066 795
+4 1276 794 795 1153
+4 1276 1066 794 795
+4 1276 1216 795 1153
+4 1276 1216 1728 1153
+4 1276 1216 1728 795
+4 1276 794 1724 1153
+4 1276 1066 794 1724
+4 1276 1340 1728 1066
+4 1276 1060 1153 1384
+4 1276 1060 1574 1384
+4 1276 1153 1384 1093
+4 1276 1604 1153 1093
+4 1276 1728 1604 1093
+4 1276 1728 1604 1153
+4 1276 1340 1728 1093
+4 1276 1340 1730 1066
+4 1276 1060 1153 1361
+4 1276 1724 1153 1361
+4 1276 1066 1724 1361
+4 1276 942 1060 1361
+4 1276 1066 942 1361
+4 1096 1454 1515 1303
+4 1096 1338 1454 1515
+4 1096 1637 1454 1303
+4 1552 1637 1336 1454
+4 1552 1338 1336 1454
+4 1552 1096 1637 1454
+4 1552 1096 1338 1454
+4 1552 955 1637 1336
+4 1638 1488 1248 1364
+4 1638 1306 1362 1364
+4 1638 1038 1362 1364
+4 1638 1306 1304 1364
+4 1638 1488 1304 1364
+4 749 1620 1441 720
+4 749 779 1441 720
+4 1708 749 1620 1441
+4 1708 749 779 1441
+4 1708 749 779 748
+4 1708 1764 1348 777
+4 1708 779 1348 1441
+4 1708 1348 1081 1441
+4 1041 1730 1159 1515
+4 1041 1019 942 1111
+4 1041 1730 1066 1515
+4 1041 942 1515 1303
+4 1041 942 1111 1303
+4 1041 1096 1515 1303
+4 1041 1558 1111 1303
+4 1041 1338 1159 1515
+4 1758 1757 1635 1215
+4 1758 916 1757 1635
+4 1758 1363 1635 1215
+4 1758 1183 1363 1635
+4 987 1742 1170 1261
+4 987 1742 1260 1261
+4 1519 1333 1125 1634
+4 1519 1212 1125 1634
+4 1075 1260 991 1261
+4 1075 987 1260 1261
+4 1069 1188 916 1757
+4 1069 1188 1431 1757
+4 1069 1758 916 1757
+4 1069 1758 1431 1757
+4 1069 1758 916 1635
+4 1647 1170 1621 540
+4 1647 1621 570 540
+4 1647 571 570 1502
+4 1647 571 1621 1502
+4 1647 571 1621 570
+4 1647 1444 1621 1502
+4 1037 1606 946 1002
+4 1037 1005 1002 1723
+4 1037 1606 1002 1723
+4 1037 1606 1005 1723
+4 1037 1114 1002 1031
+4 1037 1005 1002 1031
+4 1037 1005 1114 1031
+4 1037 1344 1114 1002
+4 1037 946 1783 1002
+4 1792 935 1171 1266
+4 1792 1582 1171 1266
+4 1792 1032 935 1266
+4 1792 935 1171 1590
+4 1792 1582 1171 1590
+4 1792 1032 1124 1266
+4 1792 1582 1124 1266
+4 1516 1124 1333 1393
+4 1516 1329 1393 915
+4 1516 1393 494 915
+4 1516 495 494 915
+4 1407 1504 1473 1052
+4 1407 1176 1442 1052
+4 1407 1176 1504 1052
+4 1407 1411 1473 1590
+4 1407 934 961 1052
+4 1407 934 1473 1052
+4 1407 1263 934 961
+4 1407 1263 1473 1590
+4 1407 1263 934 1473
+4 1407 1263 450 1590
+4 1407 1263 450 961
+4 1407 480 450 1590
+4 509 1407 480 1590
+4 509 1623 993 1590
+4 509 1623 480 1590
+4 509 1623 480 1773
+4 538 1682 1170 1261
+4 538 991 1682 1261
+4 538 991 1682 1622
+4 629 1589 600 630
+4 629 1589 659 630
+4 989 1199 1051 931
+4 989 1676 1376 1199
+4 989 1676 1588 1471
+4 989 1199 1051 1471
+4 989 1676 1199 1471
+4 989 840 1051 810
+4 989 1532 840 1051
+4 989 869 1532 840
+4 989 1532 1051 1471
+4 989 1588 1532 1471
+4 989 1047 1588 1532
+4 989 869 1047 1532
+4 1377 1225 1162 985
+4 1377 1162 985 1221
+4 976 1542 1453 1094
+4 976 1611 1071 1094
+4 976 1793 1071 1094
+4 976 1793 1611 1071
+4 976 1566 1292 960
+4 976 1453 1566 960
+4 976 1453 1566 1292
+4 976 1587 1292 1692
+4 976 1542 1292 1692
+4 976 1453 1777 1292
+4 976 1542 1777 1292
+4 976 1542 1453 1777
+4 113 1314 1071 112
+4 1738 1711 1772 960
+4 1738 1292 1294 960
+4 1738 1566 1294 960
+4 1738 1566 1772 960
+4 1738 1175 1566 1294
+4 1738 1175 1566 1772
+4 1738 976 1292 960
+4 1738 976 1587 1292
+4 978 1211 1185 1328
+4 978 1542 1211 1328
+4 978 1429 1542 1211
+4 1009 1542 1211 75
+4 1009 1429 1542 1211
+4 1009 1542 105 75
+4 1009 1542 105 1094
+4 1009 1611 1071 1094
+4 1220 1217 912 1681
+4 1220 1460 1217 1459
+4 1220 1217 1305 912
+4 1220 1460 1217 1305
+4 1220 1579 1217 1681
+4 1220 1579 1217 1459
+4 1220 1460 1305 1484
+4 1220 1003 1484 912
+4 1220 1003 1305 912
+4 1220 1003 1305 1484
+4 1517 1100 1711 1785
+4 1517 1100 1785 1484
+4 1517 913 1691 1484
+4 1517 1785 1691 1484
+4 1286 1576 1744 1424
+4 1286 1576 982 1142
+4 1286 986 1744 1323
+4 1286 984 982 1142
+4 1286 1744 1323 1535
+4 1286 1576 1744 1535
+4 1286 984 1535 1142
+4 1286 1576 1535 1142
+4 1286 984 1591 1535
+4 1286 1734 984 1591
+4 1286 1734 984 982
+4 1286 986 1734 1591
+4 1286 1323 1591 1535
+4 1286 986 1323 1591
+4 1523 1788 1727 1485
+4 1042 1367 1788 1459
+4 1042 1788 1727 1459
+4 1042 1523 1788 1727
+4 1042 1353 1121 1693
+4 1042 1121 1485 1693
+4 1042 1523 1485 1693
+4 1042 1523 1788 1485
+4 1439 151 150 180
+4 1439 151 181 180
+4 1439 182 151 181
+4 1439 209 1740 180
+4 1439 1683 181 180
+4 1439 151 152 1140
+4 1439 182 152 1140
+4 1439 182 151 152
+4 1439 1683 1740 180
+4 1439 1683 182 181
+4 1439 183 1290 1140
+4 1439 182 183 1140
+4 1439 1353 183 1290
+4 1439 1683 1353 1206
+4 1439 1683 182 1206
+4 1439 1353 183 1206
+4 1439 182 183 1206
+4 172 1042 202 1459
+4 238 1107 268 930
+4 238 239 930 1740
+4 238 1107 930 1740
+4 238 209 239 1740
+4 1464 1255 1751 1082
+4 1464 1754 1355 1710
+4 1464 1754 1355 1751
+4 1464 1355 1751 1082
+4 1464 1107 1082 1740
+4 1464 1683 1082 1740
+4 1464 1355 1683 1082
+4 1462 1287 1012 1165
+4 1520 1279 1756 1545
+4 1520 1756 1483 1545
+4 1520 1766 1483 1545
+4 1520 1279 1766 1545
+4 1520 1766 1255 1483
+4 1520 1766 1255 1165
+4 1492 1520 1279 1756
+4 1492 1464 1255 1751
+4 1492 1520 1756 1483
+4 1492 1520 1255 1483
+4 1492 1756 1751 1123
+4 1492 1756 1751 1483
+4 1492 1255 1751 1483
+4 1128 1694 1095 1274
+4 1128 1666 1095 1274
+4 1128 1279 1694 1274
+4 1128 1756 1666 1274
+4 1128 1279 1756 1274
+4 1008 1122 1481 1350
+4 1008 1247 1601 944
+4 1379 1381 1385 965
+4 1379 1381 1385 1088
+4 1379 1143 1381 965
+4 1379 1499 1143 965
+4 1379 1499 1143 1381
+4 1379 1385 1088 1365
+4 1379 1499 965 1050
+4 1379 1287 1499 1050
+4 1379 1385 904 1365
+4 1379 965 904 1050
+4 1379 1385 965 904
+4 1379 1287 904 1050
+4 1379 1709 904 1365
+4 1379 1709 932 904
+4 1379 1287 932 904
+4 1379 1287 1709 932
+4 1068 948 346 1573
+4 1068 948 346 347
+4 1068 948 1152 1573
+4 376 948 346 375
+4 376 948 346 347
+4 376 406 405 375
+4 947 405 375 1752
+4 947 948 375 1752
+4 947 406 405 375
+4 947 376 948 375
+4 947 376 406 375
+4 947 1394 1752 404
+4 947 405 1752 404
+4 947 405 1394 404
+4 947 435 405 1394
+4 947 406 435 405
+4 947 436 435 1394
+4 947 406 436 435
+4 947 1394 1755 941
+4 947 1394 1752 941
+4 947 406 437 436
+4 947 1271 1752 941
+4 947 1421 1755 941
+4 947 1271 1421 941
+4 947 1271 1421 1755
+4 1396 1752 1269 1086
+4 1396 1152 1752 1269
+4 1396 1068 948 1152
+4 1396 1152 1269 1331
+4 111 1434 1071 112
+4 111 1009 1434 1071
+4 1072 1456 1337 1208
+4 1072 906 1208 990
+4 1072 1663 906 1208
+4 1072 1640 1026 1663
+4 1072 1026 906 990
+4 1072 1026 1663 906
+4 1072 1408 1026 990
+4 1072 1640 1408 1026
+4 1072 1208 1472 990
+4 1072 1456 1208 1472
+4 1072 1136 1472 990
+4 1284 1072 1640 1408
+4 1284 1072 1136 1640
+4 1284 1072 1408 990
+4 1284 1072 1136 990
+4 359 1560 1112 990
+4 359 1560 1112 330
+4 359 1560 360 330
+4 359 1112 330 300
+4 359 329 1112 300
+4 449 961 420 1770
+4 449 420 1592 1770
+4 1437 1109 902 1471
+4 1437 1676 902 1471
+4 1437 1676 1109 1471
+4 1437 1109 1234 902
+4 1437 1109 1234 1291
+4 1437 1234 1335 1291
+4 1437 1676 1109 1588
+4 1554 1376 927 1677
+4 1554 1377 927 1677
+4 1554 1377 927 1221
+4 1554 1281 1162 1221
+4 1554 1377 1162 1221
+4 1554 927 1221 1351
+4 983 1246 1221 1004
+4 983 1281 1246 1221
+4 983 1554 1281 1221
+4 983 1351 1004 1085
+4 983 1554 1221 1351
+4 983 927 1351 1085
+4 983 1554 927 1351
+4 983 1366 1351 1004
+4 983 1366 1221 1004
+4 983 1366 1221 1351
+4 983 1376 927 1085
+4 983 1554 1376 927
+4 1158 1224 1301 945
+4 1158 1696 886 945
+4 1161 1524 1015 1588
+4 1161 1524 1015 951
+4 1161 1158 1224 1301
+4 1161 1195 1015 951
+4 1161 1195 1224 951
+4 1161 1195 1224 1015
+4 868 1047 898 867
+4 868 869 1047 898
+4 868 989 1047 867
+4 868 989 869 1047
+4 839 868 989 869
+4 839 989 840 810
+4 839 989 869 840
+4 839 989 1051 810
+4 897 896 1283 1501
+4 897 1047 898 1501
+4 897 1047 1283 1501
+4 897 986 898 1501
+4 897 986 1734 1501
+4 897 896 1734 1501
+4 897 896 986 1734
+4 897 1047 898 867
+4 897 896 1047 867
+4 897 986 28 27
+4 897 986 898 28
+4 767 1159 1066 768
+4 767 1728 1066 768
+4 767 1728 768 798
+4 766 1784 765 735
+4 766 767 1066 1784
+4 766 1724 1784 765
+4 766 1066 1724 765
+4 766 1066 1724 1784
+4 766 796 795 765
+4 766 1066 795 765
+4 766 1066 796 795
+4 586 1757 555 585
+4 586 1188 587 1757
+4 586 1757 585 975
+4 586 1188 1757 975
+4 586 1188 946 975
+4 586 1188 587 946
+4 586 974 585 975
+4 586 946 974 975
+4 1006 916 1757 975
+4 1006 1188 916 1757
+4 1006 916 1332 975
+4 1006 1482 1450 1332
+4 1006 1450 1332 1781
+4 1006 916 1332 1781
+4 1006 1482 1444 1450
+4 1006 916 1747 1023
+4 1006 1450 1747 1781
+4 1006 916 1747 1781
+4 1006 1444 1747 1023
+4 1006 1444 1450 1747
+4 1310 1037 1606 1005
+4 1310 1037 1005 1114
+4 1310 1606 1160 946
+4 1310 1037 1160 946
+4 1310 1037 1606 946
+4 1310 1037 1461 1160
+4 1786 554 1603 1215
+4 1786 554 555 1215
+4 1786 524 1603 525
+4 1786 524 555 525
+4 1786 1758 1757 1215
+4 1786 554 524 1603
+4 1786 554 524 555
+4 1786 1182 1603 1215
+4 1786 1363 1182 1215
+4 16 1307 15 885
+4 16 886 15 885
+4 16 886 1307 885
+4 16 1307 1214 15
+4 16 1307 1787 1214
+4 16 1214 15 1275
+4 16 1787 1214 1275
+4 16 15 45 1275
+4 1048 985 1530 1093
+4 1048 1225 985 1530
+4 1048 1162 985 1093
+4 1048 1225 1162 985
+4 1048 1207 1530 1093
+4 1048 1207 1384 1093
+4 1048 1207 1384 1530
+4 1048 1162 1613 1093
+4 1048 1225 1162 1613
+4 1048 1340 1613 1093
+4 1048 1384 1054 1531
+4 1048 1384 1530 1054
+4 1048 1276 1384 1093
+4 1048 1276 1340 1093
+4 1048 1574 1384 1531
+4 1048 1500 1054 1531
+4 1048 1500 1530 1054
+4 1168 1054 1531 1410
+4 1168 1500 1054 1410
+4 1168 1500 1054 1531
+4 1168 1048 1500 1531
+4 1168 1377 985 1500
+4 1168 1377 1225 985
+4 1168 1048 1500 1530
+4 1168 1048 1225 1530
+4 1168 985 1500 1530
+4 1168 1225 985 1530
+4 1428 1336 973 1364
+4 1428 1518 973 1364
+4 1428 1518 1336 973
+4 1428 1038 1336 1364
+4 1428 1518 1248 1364
+4 1428 1638 1248 1364
+4 1428 1638 1038 1364
+4 1428 1518 1248 1549
+4 1428 955 1038 1336
+4 1428 1552 955 1336
+4 1428 1518 1338 1336
+4 1428 1552 1338 1336
+4 1428 1518 1338 1159
+4 1428 1552 1338 1159
+4 1189 1664 1154 1605
+4 1189 1488 1664 1154
+4 1189 1577 1664 1605
+4 1189 1457 1341 1605
+4 1189 1577 1401 1605
+4 1189 1577 1664 1695
+4 1189 1401 1341 1605
+4 1339 1488 1248 1154
+4 1339 676 677 1154
+4 1339 1189 1488 1154
+4 1339 1457 677 1154
+4 1339 1638 1488 1248
+4 1339 1457 1154 1605
+4 1339 1189 1154 1605
+4 1339 1189 1457 1605
+4 1339 1189 1457 1341
+4 1013 1577 1264 1058
+4 1013 1446 1264 1022
+4 1013 1446 1264 1058
+4 1013 1577 1058 1605
+4 1013 1264 1650 1022
+4 1013 1446 1605 1022
+4 1013 1446 1058 1605
+4 1013 1577 1401 1605
+4 1013 1401 1575 1022
+4 1013 1401 1575 1605
+4 1013 1646 1401 1022
+4 1013 1513 1605 1022
+4 1013 1575 1513 1022
+4 1013 1575 1513 1605
+4 1099 1007 1034 1245
+4 1099 1457 1007 1245
+4 1099 1457 1007 1249
+4 1099 1457 1783 1245
+4 797 1216 1728 798
+4 797 1216 1728 796
+4 797 827 826 796
+4 797 1216 826 796
+4 797 1216 827 826
+4 797 767 1728 798
+4 797 1728 1066 796
+4 797 767 1728 1066
+4 797 766 1066 796
+4 797 766 767 796
+4 797 766 767 1066
+4 1222 1554 1376 1677
+4 1222 1794 1376 1677
+4 1397 942 1060 1574
+4 1397 1276 1060 1574
+4 1397 1276 942 1060
+4 1397 1276 1066 942
+4 1397 1276 1730 1066
+4 1397 1019 942 1574
+4 1397 1041 1019 942
+4 1397 1041 1730 1066
+4 1397 1041 942 1515
+4 1397 1041 1066 1515
+4 1397 1276 1340 1730
+4 1397 942 1334 1515
+4 1397 1066 1334 1515
+4 1397 1066 942 1334
+4 769 1340 1730 768
+4 769 1159 768 739
+4 769 1730 1159 768
+4 769 1340 1728 768
+4 1252 1552 1338 1159
+4 1252 1041 1338 1159
+4 1252 1552 1096 1338
+4 1252 1096 1338 1515
+4 1252 1041 1338 1515
+4 1252 1041 1096 1515
+4 1252 1041 1558 1303
+4 1252 1041 1096 1303
+4 1252 1558 1503 1303
+4 1252 1096 1637 1303
+4 1252 1552 1096 1637
+4 1252 1637 1503 1303
+4 1252 1552 1637 1503
+4 1049 1552 1637 1503
+4 1049 1552 955 1637
+4 1049 1637 1503 1684
+4 1049 955 1637 1684
+4 1049 1503 901 1620
+4 1049 1503 1684 901
+4 1049 955 1684 901
+4 1049 1503 1262 1620
+4 1049 1252 1552 1503
+4 1251 1638 1488 1304
+4 1251 1306 1304 1445
+4 1251 1638 1306 1304
+4 1251 1585 1638 1306
+4 1251 1339 1638 1488
+4 1251 1339 1638 1248
+4 1318 1585 1638 1306
+4 1318 1306 964 1680
+4 1318 1356 901 1680
+4 1318 1326 901 1297
+4 1318 1362 1326 1297
+4 1318 1356 964 1680
+4 1318 1306 1599 964
+4 1318 1306 1362 1599
+4 1318 1356 1326 901
+4 1318 1362 1356 1326
+4 1318 1599 1356 964
+4 1318 1362 1599 1356
+4 1528 749 748 1620
+4 1528 690 1620 720
+4 1528 749 1620 720
+4 1528 901 690 1620
+4 1528 1200 901 690
+4 1528 1049 901 1620
+4 1288 1041 1019 1764
+4 1288 1041 1558 1111
+4 1288 1041 1019 1111
+4 1288 1019 1764 1348
+4 1288 1708 1764 1348
+4 1288 1019 1081 1111
+4 1288 1708 1081 1441
+4 1288 1019 1348 1081
+4 1288 1708 1348 1081
+4 1288 1081 1111 1441
+4 1288 1708 1262 1441
+4 1288 1262 1111 1441
+4 1288 1558 1262 1111
+4 778 1708 1348 777
+4 778 1708 779 1348
+4 778 1708 748 777
+4 778 1708 779 748
+4 1496 1685 1713 1502
+4 1496 1076 1713 1502
+4 1496 1647 1076 1502
+4 1496 1685 1505 1502
+4 1496 1444 1505 1502
+4 1496 1444 1685 1505
+4 1737 600 1713 1502
+4 1737 1076 1713 1502
+4 1737 629 600 1502
+4 1737 629 1076 1502
+4 1737 600 1020 1713
+4 1737 1589 600 1020
+4 1737 629 1589 600
+4 1547 1183 1507 1725
+4 1547 1758 1183 1635
+4 1547 1172 1507 1725
+4 1547 1172 1260 1507
+4 1253 987 1742 1514
+4 1253 1742 1654 1514
+4 1253 1183 1507 1514
+4 1253 1547 1183 1507
+4 1253 1507 966 1514
+4 1253 1654 966 1514
+4 1253 1654 1507 966
+4 1253 1547 1758 1635
+4 1253 1547 1183 1635
+4 1253 1363 1635 1514
+4 1253 1183 1363 1514
+4 1253 1183 1363 1635
+4 1466 1582 1171 1590
+4 1466 1080 1171 1773
+4 1466 1171 993 1590
+4 1466 1171 993 1773
+4 1466 1792 1582 1590
+4 1466 509 993 1590
+4 1466 1623 993 1773
+4 1466 509 1623 1773
+4 1466 509 1623 993
+4 1402 1519 1582 1333
+4 1402 1124 1333 1266
+4 1402 1582 1124 1266
+4 1402 1582 1124 1333
+4 1402 1519 1333 1125
+4 1402 1333 1266 1448
+4 1402 1333 1125 1448
+4 1402 1466 1519 1125
+4 1402 1466 1519 1582
+4 1402 1171 1266 1448
+4 1402 1582 1171 1266
+4 1402 1466 1582 1171
+4 1402 1125 1773 1448
+4 1402 1171 1773 1448
+4 1402 1171 1125 1773
+4 1648 1080 1125 1202
+4 1648 1563 1080 1202
+4 1648 1239 1125 1202
+4 1648 1563 1239 1202
+4 1648 1212 1239 1125
+4 559 1188 1431 1757
+4 559 589 1188 588
+4 1102 1253 1075 987
+4 1102 1253 1547 1758
+4 1102 1253 1547 1075
+4 1102 1253 1758 1635
+4 1371 1059 1635 1514
+4 1371 1059 1235 1635
+4 1371 916 1235 1635
+4 1371 1069 916 1635
+4 1371 1069 916 1235
+4 977 1176 1665 915
+4 977 1176 1442 1665
+4 977 1516 1329 915
+4 977 1629 1329 915
+4 977 1176 1629 915
+4 977 1504 1411 1329
+4 977 1504 1629 1329
+4 977 1176 1504 1629
+4 1489 1792 1582 1124
+4 1489 977 1516 1329
+4 1489 1792 1342 1282
+4 1489 1124 1329 1393
+4 1489 1516 1329 1393
+4 1489 1516 1124 1393
+4 1489 977 1442 1665
+4 1489 977 1342 1442
+4 1489 1516 1665 915
+4 1489 977 1665 915
+4 1489 977 1516 915
+4 1278 1489 1516 1342
+4 1278 1489 1582 1124
+4 1278 1489 1516 1124
+4 1278 1582 1124 1333
+4 1278 1516 1124 1333
+4 1135 1792 1342 1282
+4 1135 1407 507 1590
+4 1135 1489 1792 1342
+4 1135 1489 977 1342
+4 1135 977 1342 1442
+4 1609 1343 1342 1442
+4 1609 1489 1442 1665
+4 1609 1489 1342 1442
+4 1609 1489 1516 1665
+4 1609 1489 1516 1342
+4 1609 1278 1516 1342
+4 1609 1516 1665 915
+4 1796 1407 961 1052
+4 1796 1021 961 1770
+4 569 1647 1170 540
+4 569 1682 1170 540
+4 569 1682 540 510
+4 1615 1075 536 535
+4 1615 565 536 535
+4 1615 1102 1075 987
+4 1615 987 1170 1261
+4 1615 1075 987 1261
+4 1615 1075 991 1261
+4 866 896 1047 1495
+4 866 896 1047 867
+4 866 897 896 867
+4 1636 1062 1633 1665
+4 1636 1383 1352 1633
+4 1636 1383 1056 1633
+4 1636 1062 1056 1633
+4 1636 1062 1383 1056
+4 1078 1500 931 1410
+4 1078 1168 1500 1410
+4 1078 1168 1377 1410
+4 1078 1168 1377 1500
+4 1078 1377 927 1677
+4 1078 1377 927 1221
+4 1078 1677 931 1410
+4 1078 927 1677 931
+4 1078 1351 1500 931
+4 1078 927 1351 931
+4 1078 927 1351 1500
+4 1078 985 927 1500
+4 1078 985 927 1221
+4 1078 1377 985 1500
+4 1078 1377 985 1221
+4 1254 976 1453 960
+4 1254 1630 1453 960
+4 1254 1738 976 960
+4 1254 976 1453 1094
+4 1254 976 1793 1094
+4 1254 1711 1630 960
+4 1254 1630 1453 1035
+4 1254 1738 1711 960
+4 1254 1453 1094 1035
+4 1254 1793 1071 1711
+4 1254 1738 976 1587
+4 1254 1071 1094 1035
+4 1254 1793 1071 1094
+4 1254 1100 1071 1711
+4 1254 1785 1630 1035
+4 1254 1071 1785 1035
+4 1254 1711 1785 1630
+4 1254 1100 1711 1785
+4 1254 1100 1071 1785
+4 1548 976 1587 1692
+4 1548 976 1587 1611
+4 1548 976 1542 1692
+4 1548 976 1542 1094
+4 1548 976 1611 1094
+4 1548 978 1542 1692
+4 1548 978 1429 1542
+4 1548 1009 1542 1094
+4 1548 1009 1429 1542
+4 1548 1009 1611 1094
+4 1548 1009 1429 1611
+4 1045 1738 1314 1793
+4 1045 1793 1071 1711
+4 1045 1314 1793 1071
+4 1045 1254 1793 1711
+4 1045 1254 1738 1711
+4 1045 1254 1738 1793
+4 1045 1517 1711 1230
+4 1045 1517 1100 1711
+4 1045 1100 1071 1711
+4 1045 1313 1517 1230
+4 1045 1313 1517 1100
+4 1767 1738 1587 1292
+4 114 1767 1314 115
+4 114 1767 1434 115
+4 1097 1631 1598 1632
+4 1097 1631 1185 1598
+4 1319 57 986 58
+4 1319 1286 986 1744
+4 1319 59 986 58
+4 1319 1760 1744 1475
+4 1319 1760 1744 1424
+4 1319 1286 1744 1424
+4 1319 59 986 1594
+4 1319 1594 1475 1562
+4 1319 1744 1594 1475
+4 1319 1475 1596 1562
+4 1319 1760 1475 1596
+4 1319 1750 997 1562
+4 1319 1744 1594 1323
+4 1319 986 1594 1323
+4 1319 986 1744 1323
+4 1319 1594 30 1562
+4 1319 59 30 1562
+4 1319 59 1594 30
+4 1319 997 1596 1562
+4 1319 1760 997 1596
+4 1108 1542 1564 1692
+4 1108 978 1542 1692
+4 1108 1542 1328 1564
+4 1108 978 1542 1328
+4 1108 1292 1564 1692
+4 1108 1587 1292 1692
+4 1697 1211 1243 75
+4 1697 1243 45 75
+4 1697 1211 971 1243
+4 1697 1243 45 1275
+4 1697 1211 971 1185
+4 1697 1009 1429 1211
+4 1697 1753 1243 1275
+4 1697 978 1211 1185
+4 1697 978 1429 1211
+4 1697 1213 1753 1275
+4 1799 1324 1357 1230
+4 1799 1045 1313 1230
+4 1799 1324 120 121
+4 1799 1324 121 122
+4 1799 913 1357 1230
+4 1799 1324 1357 967
+4 1799 122 123 967
+4 1799 1324 123 967
+4 1799 1324 122 123
+4 1616 172 1042 1459
+4 1546 1711 913 1230
+4 1546 1517 1711 1230
+4 1546 1517 1711 1785
+4 1546 1313 1517 1230
+4 1546 1711 913 1691
+4 1546 1711 1785 1691
+4 1546 1517 913 1691
+4 1546 1517 1785 1691
+4 179 1439 150 180
+4 179 1439 209 180
+4 1487 1576 982 1787
+4 1487 1286 1521 1424
+4 1487 1286 1576 1424
+4 1487 1286 1576 982
+4 1487 1213 1424 910
+4 1487 1787 1213 914
+4 1487 1576 1787 914
+4 1487 1787 1213 1275
+4 1487 1744 1424 910
+4 1487 1576 1744 910
+4 1487 1576 1744 1424
+4 1487 1213 910 914
+4 1487 1576 910 914
+4 1642 1286 986 1521
+4 1642 1487 1286 1521
+4 1642 1286 1734 982
+4 1642 1286 986 1734
+4 1642 1487 982 1787
+4 1642 1487 1286 982
+4 1642 1734 982 1787
+4 1642 1734 1307 1787
+4 1642 1734 1283 1307
+4 1347 1107 209 1740
+4 1347 1439 209 1740
+4 1347 1616 1439 1349
+4 1347 1439 1353 1290
+4 1347 1349 1290 1140
+4 1347 1439 1290 1140
+4 1347 1439 1349 1140
+4 1427 1719 1061 1443
+4 1427 1121 1061 1443
+4 1427 1353 1121 1443
+4 1427 1042 1353 1121
+4 1427 1042 1367 1788
+4 1427 1719 1061 972
+4 1427 1121 1061 1455
+4 1427 1367 1788 1455
+4 1427 1788 1121 1485
+4 1427 1042 1121 1485
+4 1427 1042 1788 1485
+4 1427 1061 972 1455
+4 1427 1367 972 1455
+4 1427 1121 1244 1455
+4 1427 1788 1244 1455
+4 1427 1788 1121 1244
+4 1672 1367 1579 1459
+4 1672 1042 1367 1459
+4 1672 1367 1579 1389
+4 1672 1427 1042 1367
+4 1672 1719 972 1389
+4 1672 1367 972 1389
+4 1672 1427 1719 972
+4 1672 1427 1367 972
+4 1672 1719 1412 1443
+4 1672 1427 1719 1443
+4 1406 1464 1107 1740
+4 1403 1709 1766 1165
+4 1403 1709 1766 1537
+4 1403 1709 1165 932
+4 1403 1287 1165 932
+4 1403 1287 1709 932
+4 1403 1128 1462 1694
+4 1403 1694 1302 1537
+4 1403 1709 1302 1537
+4 1403 1709 1302 1365
+4 1194 1406 1464 1710
+4 1194 1347 1523 1107
+4 1194 1406 1347 1107
+4 1670 1403 1462 1165
+4 1670 1403 1128 1462
+4 1670 1492 1520 1279
+4 1670 1128 1279 1756
+4 1670 1403 1766 1165
+4 1670 1520 1766 1165
+4 1670 1520 1279 1766
+4 1670 1279 1766 1694
+4 1670 1128 1279 1694
+4 1670 1403 1128 1694
+4 1670 1766 1694 1537
+4 1670 1403 1694 1537
+4 1670 1403 1766 1537
+4 1073 1529 1481 1350
+4 1073 1529 1481 1201
+4 1073 1481 1601 1201
+4 1073 1247 1601 1201
+4 1073 1618 1529 1201
+4 1073 1618 1193 1529
+4 1073 1284 1618 1193
+4 1073 1247 1408 1201
+4 1073 1284 1247 1408
+4 1073 1618 1408 1201
+4 1073 1284 1618 1408
+4 1526 1499 1739 1529
+4 1526 1193 1529 1350
+4 1526 1499 1529 1350
+4 1699 1526 1193 1350
+4 1699 1526 1103 1350
+4 1699 1526 1103 1193
+4 922 1379 1088 1365
+4 922 1379 1709 1365
+4 922 1403 1709 1365
+4 922 1403 1302 1365
+4 922 1462 1287 1012
+4 922 1379 1287 1709
+4 922 1403 1287 1709
+4 922 1103 1287 1012
+4 922 1694 1302 1365
+4 922 1403 1694 1302
+4 922 1403 1462 1694
+4 922 1462 1287 1165
+4 922 1403 1287 1165
+4 922 1403 1462 1165
+4 256 1666 255 1095
+4 256 255 1095 285
+4 1368 947 1271 1752
+4 1368 947 1271 1755
+4 1430 1396 1068 948
+4 377 376 948 347
+4 377 378 948 347
+4 377 947 376 948
+4 377 947 376 406
+4 377 376 346 347
+4 409 438 947 408
+4 22 1642 51 52
+4 22 1642 51 21
+4 1733 1314 1071 112
+4 1733 111 1071 112
+4 1733 111 142 112
+4 1733 1045 1100 1071
+4 1733 1045 1314 1071
+4 1733 113 142 112
+4 1733 113 1314 112
+4 1733 1045 1313 1100
+4 1733 1313 1460 1100
+4 136 1305 1484 135
+4 136 1460 1305 1484
+4 136 1484 135 1035
+4 136 1100 1484 1035
+4 136 105 135 1035
+4 196 1727 1305 195
+4 196 1244 195 1155
+4 196 1727 1244 1155
+4 196 1727 1244 195
+4 1581 1072 1136 1640
+4 1581 1284 1136 1640
+4 1586 1456 1374 1415
+4 1586 1560 1320 1415
+4 1586 1374 1320 1415
+4 1018 1284 1136 990
+4 1018 1284 1408 990
+4 1018 1284 1618 1408
+4 1018 1618 1408 1561
+4 1018 359 329 1112
+4 1018 1026 1561 990
+4 1018 1408 1026 990
+4 1018 1408 1026 1561
+4 1018 1112 1561 990
+4 1018 329 1112 300
+4 1018 1618 329 300
+4 1018 1618 1561 300
+4 1018 1113 1561 300
+4 1018 1113 1112 300
+4 1018 1113 1112 1561
+4 1046 1456 1560 1472
+4 1046 1136 1560 1472
+4 1046 1456 1560 1415
+4 1046 1586 1560 1415
+4 1046 1586 1456 1415
+4 1735 1437 1676 902
+4 1735 1199 1534 902
+4 1735 1676 1199 902
+4 1735 1534 1234 902
+4 1735 1437 1234 902
+4 1735 1437 1534 1234
+4 1735 1199 1534 1712
+4 1735 1676 1376 1199
+4 1735 1794 1676 1376
+4 1735 1222 1794 1376
+4 1765 1794 1376 1677
+4 1765 989 1676 1376
+4 1765 1794 1676 1376
+4 1765 989 1676 1588
+4 1765 866 836 867
+4 1765 989 1047 867
+4 1765 866 1047 867
+4 1765 866 1047 1495
+4 1765 1047 1588 1495
+4 1765 989 1047 1588
+4 1762 1330 1291 1440
+4 1762 1330 1335 1291
+4 1762 1109 1291 1440
+4 1762 1437 1335 1291
+4 1762 1109 1588 1440
+4 1762 1437 1109 1291
+4 1762 1015 1588 1440
+4 1762 1161 1015 1588
+4 1762 1224 1015 1440
+4 1762 1161 1224 1015
+4 1669 1161 1524 951
+4 1669 1161 1224 951
+4 1669 1161 1158 1224
+4 1669 1224 951 945
+4 1669 1158 1224 945
+4 1669 1191 951 945
+4 1669 1191 1307 945
+4 1669 1158 1307 945
+4 1257 1765 1794 1677
+4 1257 1078 1677 1410
+4 1257 1078 1377 1410
+4 1257 1078 1377 1677
+4 1043 1524 1283 1495
+4 1043 1524 1283 951
+4 1043 1191 1283 951
+4 1043 894 1642 893
+4 1043 1191 1283 1307
+4 1043 1642 1283 1307
+4 1043 1642 1191 1307
+4 1043 1047 1283 1495
+4 1043 896 1047 1495
+4 1043 1642 1734 1283
+4 1043 897 1047 1283
+4 1043 897 896 1283
+4 1043 897 896 1047
+4 1043 1734 1283 1617
+4 1043 896 1283 1617
+4 1043 896 1734 1617
+4 1043 1642 986 1734
+4 1043 894 1642 986
+4 865 1765 866 1495
+4 736 1784 973 735
+4 736 1518 973 735
+4 736 1159 1784 973
+4 736 1518 1159 973
+4 736 766 1784 735
+4 736 766 765 735
+4 556 586 1757 555
+4 556 586 587 1757
+4 556 1757 555 1215
+4 556 1786 555 1215
+4 616 946 615 974
+4 616 586 946 974
+4 616 586 587 946
+4 616 615 974 585
+4 616 586 974 585
+4 616 586 615 585
+4 616 946 615 1783
+4 616 1457 615 1783
+4 616 1457 946 1783
+4 616 646 615 645
+4 616 1457 615 645
+4 616 1457 646 645
+4 1186 1006 1332 975
+4 1186 1006 1482 1332
+4 1186 1332 1723 975
+4 1186 1482 1332 1723
+4 1186 1482 1005 1723
+4 1186 1606 1723 975
+4 1186 1606 1005 1723
+4 1186 1188 1606 975
+4 1186 1310 1606 1005
+4 954 1006 916 1023
+4 954 916 1235 1023
+4 954 1069 916 1235
+4 954 1371 1069 1235
+4 954 1235 1203 1621
+4 954 1235 1203 1023
+4 590 559 589 1188
+4 1156 1786 1603 525
+4 1156 524 495 525
+4 1156 524 1603 525
+4 1156 1786 1603 1634
+4 1156 524 495 494
+4 1156 524 1603 494
+4 1156 1603 1393 494
+4 1156 1603 1634 1393
+4 1156 1516 1393 494
+4 1156 1516 495 494
+4 1156 1786 1519 1634
+4 1156 1333 1634 1393
+4 1156 1516 1333 1393
+4 1156 1278 1516 1333
+4 1156 1519 1333 1634
+4 1036 1786 1758 1215
+4 1036 1758 1363 1215
+4 1036 1758 1183 1363
+4 1036 1786 1363 1215
+4 1036 1547 1758 1183
+4 1036 1183 1363 1182
+4 1036 1786 1363 1182
+4 1036 1547 1183 1725
+4 1036 1102 1547 1758
+4 1036 1509 1183 1725
+4 1036 1212 1182 1634
+4 1036 1183 1212 1182
+4 1036 1182 1603 1634
+4 1036 1786 1603 1634
+4 1036 1786 1182 1603
+4 1036 1509 1183 1212
+4 1036 1519 1212 1634
+4 1036 1786 1519 1634
+4 949 618 1160 946
+4 949 1457 946 1783
+4 949 1099 1457 1249
+4 679 1339 1457 1341
+4 719 1528 1200 690
+4 719 1528 690 720
+4 719 1528 749 720
+4 1556 1382 1445 1680
+4 1556 1306 1445 1680
+4 1556 1251 1306 1445
+4 1556 1584 1382 1445
+4 1556 1584 1382 1771
+4 622 623 1461 1160
+4 888 1669 1158 1307
+4 888 1669 1191 1307
+4 1673 1048 1276 1340
+4 1673 1397 1276 1574
+4 1673 1397 1276 1340
+4 1673 1048 1340 1613
+4 1673 1276 1574 1384
+4 1673 1048 1574 1384
+4 1673 1048 1276 1384
+4 1673 1340 1764 1613
+4 1673 1340 1764 1730
+4 1673 1397 1340 1730
+4 1673 1048 1225 1613
+4 1673 1019 1574 900
+4 1673 1397 1019 1574
+4 1673 1041 1764 1730
+4 1673 1397 1041 1730
+4 1673 1574 900 1531
+4 1673 1048 1574 1531
+4 1673 1348 900 1531
+4 1673 1048 1348 1531
+4 1673 1019 1348 900
+4 1673 1019 1764 1348
+4 1673 1041 1019 1764
+4 1673 1397 1041 1019
+4 801 1340 802 1613
+4 801 802 1162 1613
+4 801 1340 1728 1613
+4 801 800 1340 1728
+4 801 1728 1162 1613
+4 801 800 1728 1162
+4 799 800 1340 1728
+4 799 769 1340 1728
+4 799 1728 768 798
+4 799 769 1728 768
+4 799 1216 1728 798
+4 799 829 1216 798
+4 1467 778 1348 777
+4 1467 778 808 777
+4 1467 778 779 1348
+4 1467 1673 1764 1613
+4 1467 1673 1764 1348
+4 1467 1673 1225 1613
+4 1467 1673 1048 1348
+4 1467 1673 1048 1225
+4 1467 1048 1348 1531
+4 1467 1168 1531 1410
+4 1467 1168 1048 1531
+4 1467 1168 1048 1225
+4 1467 1168 808 1410
+4 1467 781 780 1410
+4 1467 781 1531 1410
+4 1467 1348 781 780
+4 1467 1348 781 1531
+4 805 1467 806 1764
+4 805 804 1764 1613
+4 805 1467 1764 1613
+4 805 1467 1225 1613
+4 1164 1428 955 1038
+4 1164 1428 1552 955
+4 1164 1433 1552 955
+4 1164 1433 1428 1552
+4 1164 742 743 713
+4 1164 714 743 713
+4 1522 1189 1577 1401
+4 1522 1013 1577 1401
+4 1522 1189 1401 1341
+4 1522 1339 1189 1341
+4 1522 681 1341 682
+4 1522 1339 681 682
+4 1525 1013 1650 1022
+4 1525 1013 1646 1022
+4 1525 1522 1013 1577
+4 1525 1013 1646 1401
+4 1525 1522 1013 1401
+4 1525 1646 1401 1341
+4 1525 1522 1401 1341
+4 652 622 623 1461
+4 1226 659 1141 1650
+4 1226 1589 659 1141
+4 1226 1646 1141 1650
+4 1226 1589 1646 1141
+4 1226 689 659 1650
+4 1226 1646 1650 1022
+4 1226 1525 1650 1022
+4 1226 1525 1646 1022
+4 1226 1525 1646 1341
+4 1131 1007 1559 1034
+4 1131 1099 1007 1034
+4 1131 1007 1559 1575
+4 1131 1099 1007 1249
+4 1131 1559 1575 1022
+4 1131 1646 1559 1022
+4 1131 1007 1401 1575
+4 1131 1007 1249 1341
+4 1131 1401 1575 1022
+4 1131 1646 1401 1022
+4 1131 1646 1401 1341
+4 1131 1007 1401 1341
+4 1705 1559 1034 992
+4 1705 1131 1559 1034
+4 1705 1131 1099 1034
+4 658 629 1589 659
+4 658 1226 1589 659
+4 828 829 1216 798
+4 828 797 827 798
+4 828 797 1216 798
+4 828 797 1216 827
+4 828 1216 827 1425
+4 828 1696 857 827
+4 1192 1222 1554 1677
+4 1192 1222 1554 1281
+4 1192 1222 1794 1677
+4 776 745 1708 746
+4 776 1708 1764 777
+4 776 1467 806 777
+4 776 1467 806 1764
+4 776 1764 1348 777
+4 776 1467 1348 777
+4 776 1467 1764 1348
+4 1698 1251 1488 1304
+4 1698 1488 1304 1664
+4 1698 1189 1488 1664
+4 1698 1304 1664 1695
+4 1698 1189 1664 1695
+4 1698 1189 1584 1695
+4 1698 1251 1304 1445
+4 1698 1304 1029 1695
+4 1698 1584 1029 1695
+4 1698 1304 1029 1445
+4 1698 1584 1029 1445
+4 1698 1556 1584 1445
+4 1698 1556 1251 1445
+4 1612 1339 1189 1488
+4 1612 1251 1339 1488
+4 1612 1698 1189 1488
+4 1612 1698 1251 1488
+4 1612 1698 1556 1251
+4 1612 1339 1248 1549
+4 1612 1251 1339 1248
+4 1612 1251 1638 1248
+4 1671 1585 1638 1038
+4 1671 1318 1585 1638
+4 1671 1638 1038 1362
+4 1671 1318 1585 955
+4 1671 1318 1362 1297
+4 1671 1638 1306 1362
+4 1671 1318 1306 1362
+4 1671 1318 1638 1306
+4 1671 1164 955 1038
+4 1671 1164 1585 1038
+4 1671 1164 1585 955
+4 1671 955 1038 1297
+4 1671 1318 955 1297
+4 1671 1486 1362 1297
+4 1671 1038 1486 1297
+4 1671 1038 1486 1362
+4 747 1708 748 777
+4 747 776 777 746
+4 747 776 1708 746
+4 747 776 1708 777
+4 1198 717 1585 1200
+4 1198 1585 1200 1680
+4 1198 719 1528 1200
+4 1198 1200 901 1680
+4 1198 1528 1200 901
+4 1198 1318 1585 1680
+4 1198 1164 1585 955
+4 1198 1164 1528 955
+4 1198 1318 901 1680
+4 1198 1318 1585 955
+4 1198 955 901 1297
+4 1198 1318 901 1297
+4 1198 1318 955 1297
+4 1198 1049 955 901
+4 1198 1528 1049 901
+4 1198 1528 1049 955
+4 1797 1647 1444 1502
+4 1797 1496 1444 1502
+4 1797 1496 1647 1502
+4 1797 1647 1444 1621
+4 1132 1114 1147 1713
+4 1132 1685 1147 1713
+4 1132 1496 1685 1713
+4 1132 1114 1147 1031
+4 1132 1538 939 1031
+4 1132 1538 1147 1031
+4 1132 1005 939 1031
+4 1132 1685 1538 939
+4 1132 1685 1538 1147
+4 1132 1482 1685 939
+4 1132 1482 1005 939
+4 1163 1496 1647 1076
+4 1163 1797 1496 1647
+4 1315 1547 1172 1260
+4 1315 1172 1260 991
+4 1315 1075 1260 991
+4 1315 1172 1563 991
+4 1256 1075 987 1260
+4 1256 1253 1075 987
+4 1256 987 1742 1260
+4 1256 1253 987 1742
+4 1256 1315 1075 1260
+4 1256 1742 1654 1260
+4 1256 1253 1742 1654
+4 1256 1315 1547 1260
+4 1256 1253 1547 1075
+4 1256 1315 1547 1075
+4 1256 1654 1260 1507
+4 1256 1253 1654 1507
+4 1256 1547 1260 1507
+4 1256 1253 1547 1507
+4 958 1080 1171 1125
+4 958 1466 1080 1171
+4 958 1402 1171 1125
+4 958 1402 1466 1125
+4 958 1402 1466 1171
+4 958 1648 1080 1125
+4 958 1466 1519 1125
+4 958 1648 1563 1080
+4 958 1466 536 535
+4 958 1563 1622 1080
+4 958 1563 991 1622
+4 958 1315 1075 991
+4 958 538 1622 1080
+4 958 538 991 1622
+4 958 509 1080 1773
+4 958 1466 1080 1773
+4 958 1466 509 1773
+4 1133 1792 1582 1282
+4 1133 1135 1792 1282
+4 1133 1466 1792 1582
+4 1133 1466 507 1590
+4 1133 1135 507 1590
+4 1133 1466 1792 1590
+4 1133 1135 1792 1590
+4 1133 1135 1342 1282
+4 508 1466 507 1590
+4 508 1466 509 1590
+4 508 1407 507 1590
+4 508 509 1407 1590
+4 508 478 1407 507
+4 508 478 509 1407
+4 508 958 1466 509
+4 508 958 1466 538
+4 980 1036 1786 1758
+4 980 1036 1786 1519
+4 1375 1742 1235 1621
+4 1375 1371 1235 1621
+4 1375 1742 1059 1235
+4 1375 1371 1059 1235
+4 1375 1742 1170 1621
+4 1375 987 1742 1170
+4 1375 987 1742 1514
+4 1375 1742 1059 1514
+4 1375 1371 1059 1514
+4 1375 1615 987 1170
+4 1375 1371 1635 1514
+4 920 1278 1489 1582
+4 920 1792 1582 1282
+4 920 1489 1792 1282
+4 920 1489 1792 1582
+4 920 1489 1342 1282
+4 920 1278 1489 1342
+4 925 1135 1489 1792
+4 925 1135 1489 977
+4 925 1489 977 1329
+4 925 1135 1792 1590
+4 925 1032 935 1329
+4 925 1792 1032 935
+4 925 935 1411 1329
+4 925 977 1411 1329
+4 925 1032 1124 1329
+4 925 1489 1124 1329
+4 925 1792 1032 1124
+4 925 1489 1792 1124
+4 925 935 1411 1590
+4 925 1792 935 1590
+4 1614 1343 1342 1442
+4 1614 1135 1342 1442
+4 1614 1343 1407 1442
+4 1614 1135 1407 1442
+4 1614 1133 1135 1342
+4 1079 1407 1176 1442
+4 1079 1135 1407 1442
+4 1079 977 1176 1442
+4 1079 1135 977 1442
+4 1079 1407 1176 1504
+4 1079 977 1504 1411
+4 1079 977 1176 1504
+4 1079 1407 1411 1590
+4 1079 1135 1407 1590
+4 1079 925 977 1411
+4 1079 925 1135 977
+4 1079 1504 1411 1473
+4 1079 1407 1411 1473
+4 1079 1407 1504 1473
+4 1079 925 1411 1590
+4 1079 925 1135 1590
+4 1645 1407 1442 1052
+4 1645 1796 1407 1052
+4 1645 1343 1407 1442
+4 1645 1056 1442 1052
+4 1645 1062 1056 1442
+4 1645 1614 1343 1407
+4 1645 1614 1796 1407
+4 1645 1614 1796 1343
+4 1645 1609 1062 1442
+4 1645 1609 1343 1442
+4 1645 1796 961 1052
+4 1645 1796 1021 961
+4 1645 1796 1021 1110
+4 479 478 509 1407
+4 479 1407 480 450
+4 479 509 1407 480
+4 479 1407 450 961
+4 479 478 449 961
+4 479 1796 1407 961
+4 479 478 1796 961
+4 479 478 1796 1407
+4 479 450 961 420
+4 479 449 961 420
+4 539 569 1682 510
+4 539 569 538 1682
+4 539 1682 1622 510
+4 539 538 1682 1622
+4 539 1622 1202 510
+4 539 1080 1773 510
+4 539 509 1080 1773
+4 539 1080 1202 510
+4 539 958 509 1080
+4 539 958 538 1080
+4 539 1622 1080 1202
+4 539 538 1622 1080
+4 539 480 1773 510
+4 539 509 480 1773
+4 539 508 958 509
+4 539 508 958 538
+4 1067 1636 1062 1665
+4 1067 1062 1442 1665
+4 1067 1609 1442 1665
+4 1067 1609 1062 1442
+4 1067 1645 1609 1062
+4 929 1761 1421 1755
+4 929 1233 1421 1658
+4 929 1233 1321 1658
+4 929 1271 1421 1755
+4 929 1271 1421 1658
+4 929 1271 1321 1658
+4 929 1368 1271 1321
+4 1289 1633 1204 1651
+4 1289 929 1761 1421
+4 1289 1633 1421 1755
+4 1289 1761 1421 1755
+4 1289 1633 1421 1689
+4 1289 1633 1204 1689
+4 1289 929 1233 1651
+4 1289 929 1233 1421
+4 1289 1055 1689 1651
+4 1289 1055 1421 1689
+4 1289 1689 1651 1296
+4 1289 1204 1651 1296
+4 1289 1204 1689 1296
+4 1289 1055 1233 1651
+4 1289 1055 1233 1421
+4 1104 1289 1633 1651
+4 1104 1636 1352 1633
+4 1104 1633 1204 1651
+4 1104 1352 1204 1651
+4 1104 1352 1633 1204
+4 1104 1352 1110 1651
+4 1104 1383 1352 1110
+4 1104 1636 1383 1110
+4 1104 1636 1383 1352
+4 838 839 868 989
+4 838 839 808 1410
+4 838 1257 808 1410
+4 838 1257 839 1410
+4 1494 976 1793 1611
+4 1494 1254 976 1793
+4 1494 976 1587 1611
+4 1494 1254 976 1587
+4 1494 1254 1738 1793
+4 1494 1254 1738 1587
+4 1494 1767 1738 1793
+4 1494 1767 1738 1587
+4 1494 1793 1611 1071
+4 1494 1767 1314 1793
+4 1494 1009 1434 1071
+4 1494 1314 1793 1071
+4 1494 114 1767 1314
+4 1494 114 1767 1434
+4 1494 113 1314 1071
+4 1494 114 113 1314
+4 1494 114 1434 113
+4 1494 113 1071 112
+4 1494 1434 1071 112
+4 1494 1434 113 112
+4 1551 1313 1460 1100
+4 1551 1460 1100 1484
+4 1551 1220 1460 1484
+4 1731 1220 1460 1459
+4 1731 1551 1220 1460
+4 1679 1738 1711 1772
+4 1679 1045 1738 1711
+4 1679 1711 1772 1230
+4 1679 1045 1711 1230
+4 1679 1324 1772 1230
+4 1679 91 121 90
+4 1679 149 120 90
+4 1679 1045 1738 1314
+4 1679 1799 1324 1230
+4 1679 1799 1324 120
+4 1679 1324 120 121
+4 1679 1799 149 120
+4 1679 1799 1045 1230
+4 1679 1799 1045 149
+4 1679 120 121 90
+4 1679 91 121 122
+4 1679 91 1294 92
+4 1679 1738 1175 1294
+4 1679 1738 1175 1772
+4 1679 1738 1314 1793
+4 1679 1767 1314 1793
+4 1679 1767 1738 1793
+4 1679 1324 121 122
+4 1679 91 122 92
+4 1679 1175 1294 92
+4 1679 1175 1324 122
+4 1679 1175 1324 1772
+4 1679 1175 122 92
+4 1258 61 1562 60
+4 1258 1319 59 1562
+4 1258 30 1562 60
+4 1258 59 30 1562
+4 1258 1319 59 58
+4 1258 1319 57 58
+4 144 1733 1045 1313
+4 1791 1548 1587 1692
+4 1791 1108 1587 1692
+4 1791 1548 978 1692
+4 1791 1108 978 1692
+4 1791 1548 978 1429
+4 1791 1548 1429 1611
+4 1139 1767 1587 1292
+4 1139 1108 1587 1292
+4 1139 1108 1767 1587
+4 1139 1108 1292 1564
+4 1139 1325 1292 1564
+4 1139 1258 61 60
+4 1139 1325 1564 63
+4 1139 1325 62 63
+4 1139 1325 62 1294
+4 1139 61 62 1294
+4 1139 61 62 1562
+4 1139 1258 61 1562
+4 1139 1564 1562 63
+4 1139 62 1562 63
+4 1139 1258 1319 1562
+4 928 1328 1624 1564
+4 928 1108 1328 1564
+4 928 1139 1624 1564
+4 928 1139 1108 1564
+4 928 1108 978 1328
+4 928 1185 1328 1624
+4 928 978 1185 1328
+4 928 1791 1108 978
+4 1426 1697 1753 1243
+4 1426 1760 1753 1243
+4 1426 1760 1521 1753
+4 1426 1521 1213 1753
+4 1426 1697 1213 1753
+4 1426 1697 1521 1213
+4 1426 1631 1750 1243
+4 1426 1760 1750 1243
+4 1426 1631 971 1243
+4 1426 1697 971 1243
+4 1426 1631 971 1185
+4 1426 1697 971 1185
+4 1426 1097 1631 1185
+4 1426 1697 1097 1185
+4 959 149 120 150
+4 959 120 121 150
+4 959 179 149 150
+4 959 151 121 150
+4 959 151 152 121
+4 959 1439 151 150
+4 959 152 121 122
+4 959 1616 1349 1197
+4 959 179 1439 150
+4 959 1616 1439 1349
+4 959 1439 151 1140
+4 959 1439 1349 1140
+4 959 1053 1412 1715
+4 959 152 122 967
+4 959 1053 122 967
+4 959 1053 152 967
+4 959 152 1715 153
+4 959 1053 1715 153
+4 959 1053 152 153
+4 959 151 152 1140
+4 959 152 1140 1715
+4 959 1140 1412 1715
+4 959 1349 1140 1412
+4 87 86 1767 1434
+4 87 1139 1767 1434
+4 87 1139 1258 1434
+4 87 1258 57 58
+4 85 86 1434 115
+4 85 1258 1643 86
+4 1736 1220 1579 1681
+4 207 1347 1616 1439
+4 207 1616 1439 177
+4 926 1349 1197 1290
+4 926 1347 1349 1290
+4 926 1347 1353 1290
+4 926 1616 1042 1197
+4 926 1616 1349 1197
+4 926 1347 1616 1349
+4 926 205 1347 1616
+4 1469 1672 1579 1459
+4 1469 1672 1042 1459
+4 1469 1672 1579 1389
+4 1469 1349 1197 1412
+4 1469 959 1349 1412
+4 1469 959 1349 1197
+4 1469 1579 1053 1389
+4 1469 1719 1412 1389
+4 1469 1672 1719 1389
+4 1469 1672 1719 1412
+4 1469 1145 1412 1389
+4 1469 1145 1053 1389
+4 1469 1145 1053 1412
+4 957 1672 1427 1443
+4 957 1353 1290 1443
+4 957 926 1197 1290
+4 957 926 1042 1197
+4 957 1427 1353 1443
+4 957 1427 1042 1353
+4 957 926 1353 1290
+4 957 926 1042 1353
+4 237 207 238 1107
+4 1497 1194 1693 1710
+4 1497 1194 1406 1710
+4 1497 1194 1523 1693
+4 1497 1406 1464 1710
+4 1497 1042 1353 1693
+4 1497 1042 1523 1693
+4 1497 1194 1347 1523
+4 1497 1194 1406 1347
+4 1497 926 1042 1353
+4 1497 926 1042 1523
+4 1497 926 1347 1353
+4 1497 926 1347 1523
+4 1668 1128 1756 1666
+4 1668 1756 1666 1155
+4 1668 1754 1123 1155
+4 1668 1756 1123 1155
+4 1668 1727 1485 1155
+4 265 1107 1165 266
+4 265 1462 1012 1165
+4 265 1287 1165 266
+4 265 1287 1012 1165
+4 1405 265 1107 1165
+4 1405 1255 1165 1470
+4 1405 1520 1255 1165
+4 1405 1492 1520 1255
+4 1405 1670 1520 1165
+4 1405 1670 1492 1520
+4 1405 1165 1470 1380
+4 1405 1107 1165 1380
+4 1405 1255 1082 1470
+4 1405 1464 1255 1082
+4 1405 1464 1107 1082
+4 1405 1082 1470 1380
+4 1405 1107 1082 1380
+4 1039 1073 1529 1350
+4 1039 1699 1008 1350
+4 1039 1008 1481 1350
+4 1039 1073 1481 1350
+4 1039 1073 1193 1529
+4 1039 1193 1529 1350
+4 1039 1699 1193 1350
+4 1039 1008 1481 1601
+4 1039 1073 1481 1601
+4 1039 1008 1247 1601
+4 1039 1073 1247 1601
+4 1039 1073 1284 1193
+4 1039 1073 1284 1247
+4 1759 922 1103 1012
+4 1759 1536 1088 1095
+4 1759 1127 1536 1095
+4 1759 1088 1095 1365
+4 1759 922 1088 1365
+4 1759 1694 1095 1365
+4 1675 1526 1103 1287
+4 1675 922 1103 1287
+4 1675 922 1379 1287
+4 1675 1759 922 1103
+4 1675 1379 1287 1499
+4 1675 1526 1287 1499
+4 1675 1379 1499 1381
+4 1675 922 1379 1088
+4 1675 1759 922 1088
+4 1675 1526 1103 1350
+4 1675 1759 1699 1103
+4 1675 1526 1499 1350
+4 1675 1379 1381 1088
+4 1675 1699 1536 1350
+4 1675 1699 1103 1350
+4 1675 1699 1127 1536
+4 1675 1759 1127 1536
+4 1675 1759 1699 1127
+4 1675 1536 1381 1088
+4 1675 1759 1536 1088
+4 1675 1499 1143 1381
+4 1675 1143 1536 1350
+4 1675 1143 1536 1381
+4 1675 1143 1322 1350
+4 1675 1499 1322 1350
+4 1675 1499 1143 1322
+4 919 256 1666 1095
+4 919 256 1127 1095
+4 919 1128 1666 1095
+4 919 256 257 1666
+4 919 1759 1127 1095
+4 919 1128 1694 1095
+4 919 1759 1694 1095
+4 919 257 1128 1666
+4 919 1128 1462 1694
+4 919 922 1462 1694
+4 919 922 1694 1365
+4 919 1759 1694 1365
+4 919 1759 922 1365
+4 919 1759 922 1012
+4 919 922 1462 1012
+4 919 1759 1103 1012
+4 919 291 261 1012
+4 286 1127 1095 285
+4 286 256 1095 285
+4 286 256 1127 1095
+4 286 919 256 1127
+4 286 1544 1064 285
+4 286 1127 1064 285
+4 286 256 255 285
+4 1608 1752 1086 1416
+4 1608 1396 1752 1086
+4 1608 1430 1396 948
+4 1608 1368 947 1752
+4 1608 947 948 1752
+4 1608 948 1152 1752
+4 1608 1396 1152 1752
+4 1608 1396 948 1152
+4 1608 1368 947 1190
+4 1608 1271 1752 1416
+4 1608 1017 1271 1416
+4 1608 1368 1271 1752
+4 1608 1368 1017 1271
+4 1608 1368 1190 1017
+4 1789 1430 1396 1068
+4 1789 1320 1269 1086
+4 1789 1396 1269 1086
+4 1789 1068 1374 1337
+4 1789 1320 1269 1415
+4 1789 1374 1320 1415
+4 1789 1374 1337 1415
+4 1789 1337 1269 1415
+4 1789 1396 1337 1269
+4 981 1697 1097 1185
+4 981 1426 1697 1097
+4 981 978 1429 1185
+4 981 1185 1598 1624
+4 981 1097 1185 1598
+4 981 928 1185 1624
+4 981 928 978 1185
+4 981 928 1139 1624
+4 981 1139 1258 1643
+4 1555 1643 1319 986
+4 1555 1286 986 1521
+4 1555 1319 1286 986
+4 1555 1642 986 1521
+4 1555 1643 1642 1521
+4 1555 1643 1642 986
+4 1555 1286 1521 1424
+4 1555 1319 1286 1424
+4 1555 1760 1521 1424
+4 1555 1319 1760 1424
+4 1555 1426 1760 1521
+4 1555 1426 1697 1521
+4 141 1733 1460 1100
+4 141 1733 111 142
+4 166 165 1305 135
+4 166 136 1305 135
+4 166 136 165 135
+4 166 165 1305 195
+4 166 196 1305 195
+4 166 196 165 195
+4 166 167 1727 1305
+4 166 196 1727 1305
+4 226 1666 225 1155
+4 226 225 195 1155
+4 226 196 195 1155
+4 226 196 225 195
+4 226 1668 1666 1155
+4 226 1668 227 1155
+4 226 1668 227 1666
+4 921 379 349 948
+4 1399 1581 1284 1193
+4 1399 1581 1284 1640
+4 1399 1640 1663 944
+4 1399 1247 1663 944
+4 1399 1247 1640 1663
+4 1399 1039 1284 1193
+4 1399 1039 1699 1193
+4 1399 1039 1008 1247
+4 1399 1247 1640 1408
+4 1399 1284 1640 1408
+4 1399 1284 1247 1408
+4 1399 1039 1284 1247
+4 1126 1581 1072 1640
+4 1126 1337 1573 1331
+4 1126 1581 1640 944
+4 1126 1072 1640 1663
+4 1126 1152 1573 1331
+4 1126 1068 1152 1573
+4 1126 1573 1663 1208
+4 1126 1337 1573 1208
+4 1126 1072 1663 1208
+4 1126 1072 1337 1208
+4 1126 1573 1663 944
+4 1126 1640 1663 944
+4 1126 1581 347 944
+4 1126 1581 1068 347
+4 1126 1396 1152 1331
+4 1126 1396 1068 1152
+4 1126 1337 1269 1331
+4 1126 1396 1269 1331
+4 1126 1396 1337 1269
+4 1126 1789 1068 1337
+4 1126 1789 1396 1337
+4 1126 1789 1396 1068
+4 1126 346 1573 944
+4 1126 346 347 944
+4 1126 1068 346 1573
+4 1126 1068 346 347
+4 19 888 18 1307
+4 297 1287 267 266
+4 297 1287 267 268
+4 1436 323 1581 353
+4 1436 1018 1136 990
+4 1436 1018 1284 1136
+4 1436 1581 1284 1136
+4 1436 358 359 1560
+4 1436 1018 359 329
+4 1436 1136 1560 990
+4 1436 359 1560 990
+4 1436 359 1112 990
+4 1436 1018 1112 990
+4 1436 1018 359 1112
+4 355 1436 1046 356
+4 1702 921 1046 384
+4 1702 1126 1072 1337
+4 1702 1126 1581 1072
+4 1702 1581 349 948
+4 1702 921 1046 1586
+4 1702 1126 1068 1337
+4 1702 1126 1581 1068
+4 1702 1068 1374 1337
+4 1702 1581 1068 948
+4 1702 921 1068 948
+4 419 420 1592 390
+4 419 449 420 1592
+4 1250 1222 1554 1281
+4 1250 983 1554 1281
+4 1250 1222 1554 1376
+4 1250 1735 1222 1376
+4 1250 983 1554 1376
+4 1250 983 1281 1246
+4 1250 1151 1065 1335
+4 1250 1246 1004 1151
+4 1250 983 1246 1004
+4 1250 1004 1151 1085
+4 1250 983 1004 1085
+4 1250 1151 1085 1712
+4 1250 1376 1085 1712
+4 1250 983 1376 1085
+4 1250 1376 1199 1712
+4 1250 1735 1199 1712
+4 1250 1735 1376 1199
+4 1250 1395 1151 1065
+4 1250 1246 1395 1065
+4 1250 1246 1395 1151
+4 1250 1735 1222 1794
+4 1250 1151 1534 1712
+4 1250 1735 1534 1712
+4 1250 1151 1234 1335
+4 1250 1437 1234 1335
+4 1250 1735 1437 1534
+4 1250 1151 1534 1234
+4 1250 1437 1534 1234
+4 1438 1765 1376 1677
+4 1438 1765 989 1376
+4 1438 1257 1765 1677
+4 1438 927 1677 931
+4 1438 1376 927 1677
+4 1438 989 1199 931
+4 1438 989 1376 1199
+4 1438 1199 927 931
+4 1438 1376 1199 927
+4 1438 1677 931 1410
+4 1438 1257 1677 1410
+4 1438 838 839 989
+4 1438 838 1257 839
+4 1438 1257 1765 836
+4 1438 1257 839 1410
+4 1438 989 1051 931
+4 1438 839 989 1051
+4 1438 931 1410 810
+4 1438 839 1410 810
+4 1438 1051 931 810
+4 1438 839 1051 810
+4 1703 1524 1588 1495
+4 1703 1765 1588 1495
+4 1703 865 1765 1495
+4 1703 1161 1524 1588
+4 1703 1437 1109 1588
+4 1703 1437 1676 1588
+4 1703 1765 1676 1588
+4 1703 1669 1161 1524
+4 1703 1765 1794 1676
+4 1703 1762 1109 1588
+4 1703 1762 1161 1588
+4 1703 1762 1437 1109
+4 1703 1669 1524 951
+4 1703 1762 1437 1335
+4 1703 1762 1161 1335
+4 1703 1735 1437 1676
+4 1703 1735 1794 1676
+4 1703 1250 1222 1794
+4 1703 1192 1222 1794
+4 1703 1250 1437 1335
+4 1703 1250 1735 1437
+4 1703 1250 1735 1794
+4 1703 1669 1161 1158
+4 1607 1762 1330 1335
+4 1607 1762 1161 1335
+4 1607 1330 1335 1511
+4 1607 1696 1335 1511
+4 1607 1161 1224 1301
+4 1607 1762 1161 1224
+4 1607 1696 1301 1511
+4 1607 1161 1158 1301
+4 1607 1267 1301 1511
+4 1607 1267 1330 1511
+4 1607 1267 1330 1440
+4 1607 1762 1330 1440
+4 1607 1224 1301 1231
+4 1607 1696 1301 945
+4 1607 1158 1301 945
+4 1607 1158 1696 945
+4 1607 1267 1231 1440
+4 1607 1267 1301 1231
+4 1607 1224 1231 1440
+4 1607 1762 1224 1440
+4 860 1669 1191 951
+4 23 22 1642 893
+4 835 1257 1765 836
+4 835 1765 866 836
+4 835 865 1765 866
+4 1196 1168 1377 1410
+4 1196 1257 1377 1410
+4 1196 1168 1377 1225
+4 1196 1467 1168 1225
+4 1196 1168 808 1410
+4 1196 1257 808 1410
+4 1196 805 806 836
+4 1196 805 1467 1225
+4 1196 805 1467 806
+4 1196 835 1257 836
+4 1196 835 805 836
+4 1196 1377 1225 1162
+4 1196 805 1225 1613
+4 1196 805 804 1613
+4 1196 1225 1162 1613
+4 1196 1192 1281 1162
+4 1196 1257 1377 1677
+4 1196 1554 1281 1162
+4 1196 1554 1377 1162
+4 1196 1257 1794 1677
+4 1196 1192 1794 1677
+4 1196 1257 1765 1794
+4 1196 835 1765 1794
+4 1196 835 1257 1765
+4 1196 1554 1377 1677
+4 1196 1192 1554 1677
+4 1196 1192 1554 1281
+4 892 1043 1642 893
+4 892 22 1642 893
+4 895 896 986 1734
+4 895 1043 986 1734
+4 895 1043 896 1734
+4 895 1043 894 986
+4 895 1043 896 1495
+4 895 1043 894 1495
+4 895 865 894 1495
+4 895 866 896 1495
+4 895 865 866 1495
+4 864 895 865 894
+4 864 1043 894 893
+4 864 1043 894 1495
+4 864 865 894 1495
+4 864 1703 1524 1495
+4 864 1703 865 1495
+4 864 1703 865 1765
+4 864 835 865 1765
+4 708 1518 1549 709
+4 708 1339 1549 709
+4 1639 78 79 1009
+4 1639 80 79 1009
+4 1639 1009 1211 75
+4 1639 1697 1211 75
+4 1639 1697 1009 1211
+4 1639 1697 1009 1429
+4 1639 1555 981 1697
+4 1639 1555 981 1643
+4 1639 981 1429 1185
+4 1639 981 1697 1185
+4 1639 1555 1697 1521
+4 1639 1555 1643 1521
+4 1639 1643 51 52
+4 1639 978 1429 1185
+4 1639 1697 978 1185
+4 1639 1697 978 1429
+4 77 1639 78 1009
+4 526 1156 1786 525
+4 526 1156 1786 527
+4 526 1786 555 525
+4 526 556 555 525
+4 526 556 1786 555
+4 526 1156 495 525
+4 617 616 586 587
+4 617 616 587 946
+4 617 949 618 946
+4 617 616 1457 946
+4 617 949 1457 946
+4 1704 1069 1188 916
+4 1704 954 1069 916
+4 1704 1069 1188 1431
+4 1704 1163 1797 1647
+4 591 622 592 1160
+4 1130 949 1099 1249
+4 1130 949 650 1249
+4 1130 949 1461 650
+4 557 556 586 587
+4 557 556 587 1757
+4 557 1786 1757 1215
+4 557 556 1757 1215
+4 557 556 1786 1215
+4 557 526 1786 527
+4 557 526 556 527
+4 557 526 556 1786
+4 680 679 1339 1341
+4 680 1522 681 1341
+4 680 1522 1339 1341
+4 680 1522 1339 681
+4 688 1226 689 1650
+4 688 1226 689 659
+4 688 658 1226 659
+4 718 747 1528 748
+4 718 747 1528 717
+4 718 1528 749 748
+4 718 719 1528 749
+4 718 1198 1528 717
+4 718 1198 719 1528
+4 718 1198 717 1200
+4 718 1198 719 1200
+4 716 1164 745 746
+4 716 747 1528 746
+4 716 747 1528 717
+4 716 1198 1528 717
+4 716 1198 1164 1528
+4 1345 1251 1585 1306
+4 1345 1556 1251 1306
+4 1345 1318 1585 1306
+4 1345 1612 1556 1251
+4 1345 1318 1306 1680
+4 1345 1556 1306 1680
+4 1345 1318 1585 1680
+4 1345 1585 1200 1680
+4 620 949 1461 1160
+4 620 949 1461 650
+4 620 590 589 1160
+4 620 591 590 1160
+4 887 888 18 1307
+4 887 16 886 1307
+4 887 888 1158 1307
+4 887 886 1307 945
+4 887 1158 1307 945
+4 887 1158 886 945
+4 887 888 1158 857
+4 887 1158 1696 857
+4 887 1158 1696 886
+4 887 886 857 856
+4 887 1696 857 856
+4 887 1696 886 856
+4 1491 799 829 1216
+4 1491 1216 1281 1728
+4 1491 799 1216 1728
+4 1491 799 829 800
+4 1491 1192 1222 1281
+4 1491 799 800 1728
+4 1491 1216 1281 1246
+4 1491 1281 1728 1162
+4 1491 800 1728 1162
+4 1491 1250 1281 1246
+4 1491 1250 1222 1281
+4 1491 1216 1246 1065
+4 1491 801 800 1162
+4 1491 828 829 1216
+4 1491 1669 829 1158
+4 1491 1250 1246 1065
+4 1491 801 802 1162
+4 1491 1192 1281 1162
+4 1491 1703 1192 1222
+4 1491 1196 1192 1162
+4 1491 1216 1065 1425
+4 1491 1703 1250 1222
+4 1491 860 1703 1669
+4 807 1467 808 777
+4 807 1467 806 777
+4 807 1196 1467 806
+4 807 1196 806 836
+4 807 1467 1168 808
+4 807 1196 1168 808
+4 807 1196 1467 1168
+4 807 1196 1257 808
+4 1372 1428 1518 1549
+4 1372 1164 1428 1549
+4 1372 1164 1433 1428
+4 1372 1433 1428 1552
+4 1372 1518 1159 739
+4 1372 1428 1518 1159
+4 1372 1428 1552 1159
+4 1372 1252 1552 1159
+4 1372 1433 1252 1552
+4 1372 1252 1041 1159
+4 1372 1041 1730 1159
+4 1372 1252 1041 1558
+4 1372 1433 1252 1558
+4 1137 1049 1552 955
+4 1137 1433 1552 955
+4 1137 1049 1252 1552
+4 1137 1433 1252 1552
+4 1137 1433 1252 1558
+4 1137 1252 1558 1503
+4 1137 1049 1252 1503
+4 1137 1049 1262 1620
+4 1137 1558 1503 1262
+4 1137 1049 1503 1262
+4 1137 1262 1620 1441
+4 1137 1708 1620 1441
+4 1137 1708 1262 1441
+4 1137 1288 1558 1262
+4 1137 1288 1708 1262
+4 1044 1585 1638 1038
+4 1044 1164 1585 1038
+4 1044 1428 1638 1038
+4 1044 1164 1428 1038
+4 1044 1164 1428 1549
+4 1044 1428 1248 1549
+4 1044 1428 1638 1248
+4 1044 1612 1248 1549
+4 1044 1612 1638 1248
+4 1044 1251 1585 1638
+4 1044 1612 1251 1638
+4 1044 1612 1339 1549
+4 1044 1345 1251 1585
+4 1044 1345 1612 1251
+4 1044 1345 716 717
+4 1044 1164 714 713
+4 1044 1345 714 713
+4 1044 1198 717 1585
+4 1044 1198 1164 1585
+4 1044 716 1198 717
+4 1044 716 1198 1164
+4 1044 717 1585 1200
+4 1044 1345 1585 1200
+4 1044 1345 717 1200
+4 744 1164 714 745
+4 744 1164 714 743
+4 653 1226 1525 1341
+4 653 1226 1646 1341
+4 653 1130 652 1341
+4 653 1130 652 1461
+4 653 652 623 1461
+4 651 1130 1461 650
+4 651 1130 652 1461
+4 651 1130 652 1341
+4 651 650 1249 1341
+4 651 1130 1249 1341
+4 651 1130 650 1249
+4 651 680 650 1341
+4 651 680 681 1341
+4 651 681 1341 682
+4 651 652 1341 682
+4 441 979 1400 1190
+4 712 1164 742 713
+4 712 1044 1164 1549
+4 712 1044 1164 713
+4 712 1044 1339 1549
+4 712 1612 1339 682
+4 712 1044 1612 682
+4 712 1044 1612 1339
+4 740 1518 1549 739
+4 740 1372 1518 739
+4 740 1372 1518 1549
+4 740 1372 1159 739
+4 740 769 1159 739
+4 1707 1344 1034 992
+4 1707 1705 1034 992
+4 1707 1344 963 992
+4 1707 1559 963 992
+4 1707 1705 1559 992
+4 1707 1344 963 1020
+4 1707 1589 1559 963
+4 1707 1705 1589 1559
+4 1707 1589 963 1020
+4 1707 1737 1589 1020
+4 1726 1696 827 1425
+4 1726 828 827 1425
+4 1726 828 1696 827
+4 1726 1491 1065 1425
+4 1726 828 1216 1425
+4 1726 1491 1216 1425
+4 1726 1491 828 1216
+4 1726 1491 828 829
+4 1726 1065 1425 1001
+4 1726 1696 1425 1001
+4 1726 1491 829 1158
+4 1726 1065 1030 1001
+4 1726 1696 1030 1001
+4 1726 1491 1250 1065
+4 1726 1065 1030 1511
+4 1726 1696 1030 1511
+4 1726 1065 1335 1511
+4 1726 1696 1335 1511
+4 1726 1250 1065 1335
+4 1726 1491 1703 1250
+4 1726 1703 1250 1335
+4 1726 1607 1696 1335
+4 1726 1607 1161 1335
+4 1726 1703 1161 1335
+4 1726 1703 1161 1158
+4 1726 1607 1158 1696
+4 1726 1607 1161 1158
+4 1726 1703 1669 1158
+4 1726 1491 1669 1158
+4 1726 1491 1703 1669
+4 775 776 745 1708
+4 775 776 1708 1764
+4 775 804 1764 774
+4 775 805 804 1764
+4 775 805 806 1764
+4 775 776 806 1764
+4 1493 1522 1339 1189
+4 1493 1612 1339 1189
+4 1493 1522 1339 682
+4 1493 1612 1339 682
+4 1493 1612 1698 1189
+4 1493 1612 1698 1556
+4 1493 1345 1612 1556
+4 1493 1698 1189 1584
+4 1493 1698 1556 1584
+4 1493 1189 1584 1695
+4 1493 1577 1584 1695
+4 1493 1189 1577 1695
+4 1493 1522 1189 1577
+4 1493 1525 1522 1577
+4 1229 1482 1444 1685
+4 1229 1006 1482 1444
+4 1229 1496 1444 1685
+4 1229 1797 1496 1444
+4 1229 1006 1444 1023
+4 1229 1444 1203 1023
+4 1229 954 1006 1023
+4 1229 954 1203 1023
+4 1229 1444 1203 1621
+4 1229 1797 1444 1621
+4 1229 1704 1797 954
+4 1229 954 1203 1621
+4 1229 1797 954 1621
+4 1369 1005 1114 1031
+4 1369 1132 1114 1031
+4 1369 1132 1005 1031
+4 1369 1310 1005 1114
+4 1369 1132 1482 1005
+4 1369 1132 1482 1685
+4 1763 1310 1076 1160
+4 1763 1076 1461 1160
+4 1763 623 1461 1160
+4 1763 623 1076 1461
+4 1763 622 623 1160
+4 1763 622 592 1160
+4 1763 591 592 1160
+4 1763 591 592 1431
+4 1763 1163 1647 1076
+4 506 1135 1407 507
+4 506 1133 1135 507
+4 506 1614 1407 507
+4 506 1614 1135 1407
+4 506 1614 1133 1135
+4 506 1133 1466 507
+4 506 1466 536 535
+4 503 1133 502 1282
+4 1101 1102 1758 1431
+4 1101 980 1758 1431
+4 1101 1615 1102 1431
+4 1101 1036 1102 1758
+4 1101 980 1036 1758
+4 1101 1615 1102 1075
+4 1101 1036 1102 1547
+4 1101 1615 1075 535
+4 1101 1102 1547 1075
+4 1101 1315 1547 1075
+4 1101 1075 536 535
+4 1101 958 536 535
+4 1101 958 1075 536
+4 528 557 1786 527
+4 528 1156 1786 527
+4 528 498 1156 527
+4 566 597 567 1647
+4 566 595 565 1647
+4 566 1615 565 536
+4 566 1615 567 536
+4 624 623 1076 1461
+4 624 1737 1076 1461
+4 624 1763 623 1076
+4 624 1763 595 594
+4 657 658 1737 1589
+4 657 1226 1589 1646
+4 657 658 1226 1589
+4 657 688 658 1226
+4 628 1737 629 1076
+4 628 1737 629 1589
+4 628 658 629 1589
+4 628 658 1737 1589
+4 1311 1371 1069 1635
+4 1311 1375 1371 1635
+4 1311 1069 1758 1635
+4 1311 1102 1758 1635
+4 1311 1102 1069 1758
+4 1311 1375 1635 1514
+4 1311 1253 1635 1514
+4 1311 1102 1253 1635
+4 1311 1375 987 1514
+4 1311 1253 987 1514
+4 1311 1102 1253 987
+4 1129 498 1156 1278
+4 1129 528 498 1156
+4 1129 528 1156 1786
+4 1129 528 980 1786
+4 1129 920 1278 1582
+4 1129 1156 1786 1519
+4 1129 980 1786 1519
+4 1129 1519 1582 1333
+4 1129 1156 1519 1333
+4 1129 1278 1582 1333
+4 1129 1156 1278 1333
+4 1129 920 1582 1282
+4 1129 1133 1582 1282
+4 1129 1133 502 1282
+4 1129 980 1466 1519
+4 1129 980 1133 1466
+4 1129 1466 1519 1582
+4 1129 1133 1466 1582
+4 476 506 1614 507
+4 1077 1383 1021 1110
+4 1077 1645 1021 1110
+4 1077 1383 1021 1052
+4 1077 1636 1062 1383
+4 1077 1021 961 1052
+4 1077 1645 961 1052
+4 1077 1645 1021 961
+4 1077 1383 1056 1052
+4 1077 1645 1056 1052
+4 1077 1062 1383 1056
+4 1077 1645 1062 1056
+4 1077 1067 1636 1062
+4 1077 1067 1645 1062
+4 447 476 446 1796
+4 598 597 567 1647
+4 598 1647 1076 1502
+4 598 597 1647 1076
+4 1134 595 565 1647
+4 1134 595 564 565
+4 1134 595 564 594
+4 1134 1763 595 1647
+4 1134 1763 595 594
+4 1134 1704 1163 1647
+4 1134 1763 1163 1431
+4 1134 1763 1163 1647
+4 1134 1704 1188 1431
+4 1134 1704 1163 1188
+4 1134 1704 1069 1431
+4 1134 1704 954 1069
+4 1134 1763 592 1431
+4 1134 592 1431 562
+4 1157 1067 1636 1609
+4 1157 1184 1665 915
+4 1157 1609 1665 915
+4 1157 1067 1609 1665
+4 1157 1633 1184 1665
+4 1157 1636 1633 1665
+4 1157 1067 1636 1665
+4 1098 979 1400 1190
+4 1098 1368 1400 1190
+4 1098 1368 947 1190
+4 1098 1368 947 1755
+4 1098 947 1394 1755
+4 1098 947 436 1394
+4 1098 947 437 436
+4 1098 436 1184 1394
+4 1098 437 436 1184
+4 1098 438 947 437
+4 1098 979 438 437
+4 1098 979 438 947
+4 439 409 438 947
+4 439 979 438 947
+4 439 979 409 947
+4 496 1156 1516 495
+4 496 1156 1278 1516
+4 496 526 1156 495
+4 496 466 495 915
+4 496 1516 495 915
+4 496 1516 466 915
+4 496 466 495 465
+4 496 526 495 525
+4 956 929 1368 1321
+4 956 1368 1400 1190
+4 956 1368 1271 1321
+4 956 1368 1017 1271
+4 956 1271 1321 1658
+4 956 1237 1321 1592
+4 956 1237 1321 1658
+4 956 1237 1271 1658
+4 956 1017 1237 1271
+4 956 1625 1237 1592
+4 956 1017 1625 1592
+4 956 1017 1625 1237
+4 1014 447 1796 1770
+4 1014 447 446 1796
+4 1014 1645 1796 1343
+4 1259 1233 1770 1651
+4 1259 1104 1110 1651
+4 1259 1352 1110 1651
+4 1259 1352 1021 1110
+4 1259 1352 1770 1651
+4 1259 1352 1021 1770
+4 1729 1014 1761 1400
+4 1729 1014 979 1400
+4 1729 1104 1289 1633
+4 1729 1289 1633 1755
+4 1729 1289 1761 1755
+4 1729 1633 1394 1755
+4 950 1067 1636 1609
+4 950 1067 1645 1609
+4 950 1077 1067 1636
+4 950 1077 1067 1645
+4 950 1157 1636 1609
+4 950 1104 1636 1633
+4 950 1729 1636 1633
+4 950 1729 1104 1633
+4 950 1645 1609 1343
+4 950 1014 1645 1343
+4 950 1104 1636 1110
+4 950 1077 1104 1110
+4 950 1636 1383 1110
+4 950 1077 1383 1110
+4 950 1077 1636 1383
+4 809 1467 780 1410
+4 809 1467 808 1410
+4 809 1467 1348 780
+4 809 1467 779 1348
+4 809 1467 778 808
+4 809 1467 778 779
+4 809 1348 750 780
+4 809 779 1348 750
+4 809 839 808 1410
+4 809 780 1410 810
+4 809 839 1410 810
+4 81 111 1434 112
+4 81 111 1009 1434
+4 81 1639 1643 1009
+4 81 1639 80 1009
+4 81 1643 51 52
+4 81 1639 1643 51
+4 81 1639 80 51
+4 143 114 113 1314
+4 143 144 114 1314
+4 143 1733 113 1314
+4 143 144 1733 1314
+4 143 1733 113 142
+4 143 144 1733 1313
+4 146 1045 1314 147
+4 1312 1494 1767 1434
+4 1312 1494 1767 1587
+4 1312 1139 1767 1434
+4 1312 1139 1108 1434
+4 1312 1139 1108 1767
+4 1312 1108 1767 1587
+4 1312 1791 1108 1587
+4 1312 1494 1009 1434
+4 1312 1494 1587 1611
+4 1312 1009 1611 1071
+4 1312 1494 1611 1071
+4 1312 1494 1009 1071
+4 1312 1009 1429 1611
+4 1312 1791 1429 1611
+4 1312 1548 1587 1611
+4 1312 1791 1548 1611
+4 1312 1791 1548 1587
+4 924 1139 1108 1434
+4 924 928 1139 1108
+4 924 928 1791 1108
+4 924 981 928 1139
+4 924 1312 1108 1434
+4 924 1312 1791 1108
+4 924 981 1139 1643
+4 924 1139 1258 1434
+4 924 1139 1258 1643
+4 924 85 1258 1643
+4 924 85 86 1434
+4 924 85 1258 86
+4 924 81 1009 1434
+4 924 81 1643 1009
+4 924 87 86 1434
+4 924 87 1258 1434
+4 924 87 1258 86
+4 178 959 179 1439
+4 178 1616 1439 177
+4 178 959 1616 177
+4 178 959 1616 1439
+4 1619 1799 121 122
+4 1619 959 121 122
+4 1619 959 1799 121
+4 1619 959 1053 122
+4 1619 1053 122 967
+4 1619 1799 122 967
+4 1619 1053 1357 967
+4 1619 1799 1357 967
+4 1619 1649 1799 1357
+4 1070 1179 1357 1063
+4 1070 1649 1357 1063
+4 1070 1179 912 1063
+4 1070 1484 912 1063
+4 1070 1220 1484 912
+4 1346 913 1357 1063
+4 1346 1649 1357 1063
+4 1346 1799 913 1357
+4 1346 1649 1799 1357
+4 1346 1799 913 1230
+4 1346 1546 913 1230
+4 1346 1546 1517 913
+4 1346 1799 1313 1230
+4 1346 1546 1313 1230
+4 1346 1619 1649 1799
+4 1346 1546 1313 1517
+4 89 1139 1258 60
+4 89 1258 30 60
+4 89 1258 59 30
+4 89 1258 59 58
+4 84 114 1434 113
+4 84 83 1434 113
+4 84 114 1434 115
+4 84 85 1434 115
+4 84 924 83 1434
+4 84 924 85 1434
+4 84 924 83 1643
+4 84 924 85 1643
+4 56 85 1643 86
+4 56 1258 1643 86
+4 56 87 1258 57
+4 56 87 1258 86
+4 56 1258 1319 57
+4 56 1258 1643 1319
+4 56 1319 57 986
+4 208 207 238 1107
+4 208 1107 209 1740
+4 208 238 209 1740
+4 208 238 1107 1740
+4 208 1347 1107 209
+4 208 207 1347 1107
+4 208 1347 1439 209
+4 208 207 1347 1439
+4 208 179 1439 209
+4 208 178 179 1439
+4 208 207 1439 177
+4 208 178 1439 177
+4 206 205 1347 1523
+4 206 1347 1523 1107
+4 206 207 1347 1107
+4 206 205 1347 1616
+4 206 207 1347 1616
+4 206 207 1616 177
+4 203 1042 1523 202
+4 203 926 1042 1523
+4 203 926 1616 1042
+4 1228 1232 1053 1681
+4 1228 1736 1232 1681
+4 1228 1579 1053 1681
+4 1228 1469 1579 1053
+4 1228 1736 1579 1681
+4 1228 1469 1579 1459
+4 1228 1220 1579 1459
+4 1228 1736 1220 1579
+4 1228 1616 1042 1459
+4 1228 1469 1042 1459
+4 1228 1616 1042 1197
+4 1228 1469 1042 1197
+4 1228 1469 1616 1197
+4 1227 1469 1042 1197
+4 1227 1469 1672 1042
+4 1227 957 1042 1197
+4 1227 1469 1197 1412
+4 1227 1469 1672 1412
+4 1227 1672 1427 1042
+4 1227 957 1427 1042
+4 1227 957 1672 1427
+4 1227 957 1197 1290
+4 1227 1672 1412 1443
+4 1227 957 1672 1443
+4 1227 1290 1140 1412
+4 1227 1197 1140 1412
+4 1227 1197 1290 1140
+4 1227 1290 1412 1443
+4 1227 957 1290 1443
+4 173 1616 172 1042
+4 173 203 1616 1042
+4 173 172 1042 202
+4 173 203 1042 202
+4 1769 1497 1693 1710
+4 1769 1497 1353 1693
+4 1769 1206 1693 1710
+4 1769 1353 1206 1693
+4 1769 1355 1206 1710
+4 1769 1683 1353 1206
+4 1769 1464 1355 1710
+4 1769 1497 1464 1710
+4 1769 1355 1683 1206
+4 1769 1439 1683 1353
+4 1769 1497 1406 1464
+4 1769 1347 1439 1353
+4 1769 1497 1347 1353
+4 1769 1439 1683 1740
+4 1769 1464 1355 1683
+4 1769 1347 1439 1740
+4 1769 1464 1683 1740
+4 1769 1406 1464 1740
+4 1769 1497 1406 1347
+4 1769 1347 1107 1740
+4 1769 1406 1107 1740
+4 1769 1406 1347 1107
+4 1610 257 1128 1666
+4 1610 919 257 1128
+4 1610 919 1128 1462
+4 1610 1670 1128 1462
+4 1610 919 261 1012
+4 1610 919 1462 1012
+4 1010 199 1668 1727
+4 1010 1523 1727 1485
+4 1010 1668 1727 1485
+4 1010 1668 1485 1155
+4 228 1668 227 1666
+4 292 919 1103 1012
+4 292 919 291 1012
+4 292 919 291 1103
+4 289 919 288 259
+4 289 919 288 1127
+4 316 1544 315 285
+4 316 286 315 285
+4 316 286 1544 285
+4 316 286 1544 1064
+4 316 286 1127 1064
+4 316 1544 315 944
+4 316 315 944 345
+4 316 346 944 345
+4 316 346 315 345
+4 319 320 1581 349
+4 322 323 1581 1193
+4 322 323 1581 353
+4 322 292 323 1103
+4 1732 1789 1396 1086
+4 1732 1789 1430 1396
+4 1732 1608 1396 1086
+4 1732 1608 1430 1396
+4 1732 1608 1086 1416
+4 1732 1789 1320 1086
+4 1768 1555 1643 1319
+4 1768 1555 981 1643
+4 1768 1258 1643 1319
+4 1768 981 1258 1643
+4 1768 1139 1258 1319
+4 1768 981 1139 1258
+4 1768 1139 1319 1562
+4 1768 1097 1598 1632
+4 1768 981 1097 1632
+4 1768 981 1097 1598
+4 1768 981 1598 1624
+4 1768 981 1139 1624
+4 1768 1750 1598 1562
+4 1768 1750 1598 1632
+4 1768 1598 1564 1562
+4 1768 1139 1564 1562
+4 1768 1598 1624 1564
+4 1768 1139 1624 1564
+4 1285 981 1426 1697
+4 1285 1555 1426 1697
+4 1285 1555 981 1697
+4 1285 1555 1426 1760
+4 1285 1768 1555 981
+4 1285 1426 1760 1750
+4 1285 1768 981 1632
+4 1285 981 1097 1632
+4 1285 981 1426 1097
+4 1285 1555 1319 1760
+4 1285 1768 1555 1319
+4 1285 1768 1750 1632
+4 1285 1631 1750 1632
+4 1285 1426 1631 1750
+4 1285 1097 1631 1632
+4 1285 1426 1097 1631
+4 1285 1760 1750 997
+4 1285 1319 1750 997
+4 1285 1319 1760 997
+4 1285 1319 1750 1562
+4 1285 1768 1750 1562
+4 1285 1768 1319 1562
+4 171 141 170 1460
+4 171 170 1460 1459
+4 171 172 202 1459
+4 169 170 1460 1459
+4 169 199 1727 1459
+4 383 1702 384 353
+4 383 1702 921 384
+4 1169 1017 1592 1416
+4 1169 419 418 1592
+4 1169 1320 1024 1086
+4 1169 1732 1320 1086
+4 1169 1625 1024 1416
+4 1169 1625 1592 1416
+4 1169 1625 1592 1024
+4 1169 1024 1086 1416
+4 1169 1732 1086 1416
+4 1169 1560 1320 1024
+4 1169 419 1592 390
+4 1169 361 360 390
+4 1169 1560 361 1024
+4 1169 1714 1592 1024
+4 1169 361 391 390
+4 1169 391 1592 390
+4 1169 1714 391 1592
+4 1169 361 1714 1024
+4 1169 361 1714 391
+4 1790 1702 921 1068
+4 1790 1430 1068 948
+4 1790 921 1068 948
+4 1790 1608 1430 948
+4 1373 1790 921 1430
+4 1373 1702 1586 1374
+4 1373 1702 921 1586
+4 1373 1732 1789 1430
+4 1373 1586 1374 1320
+4 1373 1169 1732 1430
+4 1373 1790 1702 921
+4 1373 1789 1374 1320
+4 1373 1732 1789 1320
+4 1373 1169 1586 1320
+4 1373 1169 1732 1320
+4 1373 1789 1068 1374
+4 1373 1789 1430 1068
+4 1373 1790 1430 1068
+4 1373 1702 1068 1374
+4 1373 1790 1702 1068
+4 201 232 1523 202
+4 201 1042 1523 1727
+4 201 1042 1523 202
+4 201 171 202 1459
+4 201 1042 1727 1459
+4 201 1042 202 1459
+4 139 169 170 1460
+4 295 265 1287 266
+4 298 297 1287 268
+4 298 299 268 1050
+4 298 1287 268 1050
+4 298 329 299 1739
+4 357 1436 1046 356
+4 357 327 1436 358
+4 1674 1436 1581 1136
+4 1674 1581 1072 1136
+4 1674 1702 1581 1072
+4 1674 1436 1046 1136
+4 1674 1436 1581 353
+4 1674 1702 1581 353
+4 1674 355 1436 1046
+4 1674 1072 1456 1472
+4 1674 1072 1136 1472
+4 1674 1046 1456 1472
+4 1674 1046 1136 1472
+4 1674 1072 1456 1337
+4 1674 1702 1072 1337
+4 1674 1046 1586 1456
+4 1674 1702 1046 1586
+4 1674 1456 1374 1337
+4 1674 1702 1374 1337
+4 1674 1586 1456 1374
+4 1674 1702 1586 1374
+4 858 888 1158 857
+4 858 888 1669 1158
+4 858 1158 1696 857
+4 858 828 1696 857
+4 858 1726 1158 1696
+4 858 1726 828 1696
+4 858 828 857 827
+4 889 888 1669 1191
+4 889 860 890 1191
+4 889 890 1191 1307
+4 889 888 1191 1307
+4 889 19 888 1307
+4 889 19 888 18
+4 26 57 986 27
+4 26 56 57 986
+4 26 897 986 27
+4 26 897 896 986
+4 24 894 1642 986
+4 24 23 1642 986
+4 24 894 1642 893
+4 24 23 1642 893
+4 832 1703 1192 1794
+4 832 1491 1703 1192
+4 834 1196 805 804
+4 834 1196 835 805
+4 834 1196 835 1794
+4 834 1196 1192 1794
+4 834 835 1765 1794
+4 834 864 835 1765
+4 891 860 890 1191
+4 891 892 1043 1191
+4 891 1043 1642 1191
+4 891 892 1043 1642
+4 891 890 1191 1307
+4 891 1642 1191 1307
+4 891 1642 890 1307
+4 891 1642 890 21
+4 891 22 1642 21
+4 891 892 22 1642
+4 861 891 860 1191
+4 861 891 892 1191
+4 861 860 1191 951
+4 861 1703 1669 951
+4 861 860 1669 951
+4 861 860 1703 1669
+4 861 1491 860 1703
+4 678 1339 1457 677
+4 678 679 1339 1457
+4 678 648 1457 677
+4 678 679 648 1457
+4 737 767 1159 768
+4 737 736 1518 1159
+4 737 767 1159 1066
+4 737 1159 1066 1784
+4 737 736 1159 1784
+4 737 767 1066 1784
+4 737 766 767 1784
+4 737 736 766 1784
+4 737 736 766 767
+4 137 167 1460 1305
+4 137 136 1460 1305
+4 137 166 167 1305
+4 137 166 136 1305
+4 137 166 136 167
+4 137 1460 1100 1484
+4 137 136 1100 1484
+4 137 136 1460 1484
+4 49 1639 80 79
+4 108 77 78 1009
+4 108 78 79 1009
+4 76 1009 105 75
+4 76 1639 1009 75
+4 76 77 1639 1009
+4 76 1697 45 75
+4 76 1639 1697 75
+4 647 648 1457 677
+4 647 616 1457 646
+4 647 617 616 646
+4 647 617 616 1457
+4 647 648 949 1457
+4 647 617 949 1457
+4 647 1457 676 677
+4 647 1457 646 676
+4 647 648 949 618
+4 647 617 949 618
+4 647 678 648 677
+4 706 1339 676 1154
+4 706 1339 1248 1154
+4 706 1154 705 1364
+4 706 1248 1154 1364
+4 706 1518 705 1364
+4 706 1518 1248 1364
+4 706 1518 735 705
+4 706 736 735 705
+4 706 736 1518 735
+4 706 737 736 1518
+4 560 591 590 1431
+4 560 559 1188 1431
+4 560 590 1188 1431
+4 560 590 559 1188
+4 560 980 559 1431
+4 596 566 597 1647
+4 596 566 595 1647
+4 596 626 597 1076
+4 596 595 626 1076
+4 596 1763 595 1647
+4 596 1763 595 1076
+4 596 597 1647 1076
+4 596 1763 1647 1076
+4 1404 1131 1099 1249
+4 1404 1130 1099 1249
+4 1404 1131 1249 1341
+4 1404 1130 1249 1341
+4 1404 1705 1131 1099
+4 1404 1130 1705 1099
+4 1404 1131 1646 1341
+4 1404 653 1646 1341
+4 1404 653 1130 1341
+4 1404 1131 1646 1559
+4 1404 1705 1131 1559
+4 1404 1130 1705 1461
+4 1404 653 1130 1461
+4 1404 1589 1646 1559
+4 1404 1705 1589 1559
+4 1404 655 1589 1646
+4 1404 1737 655 1589
+4 1404 1707 1737 1589
+4 1404 1707 1705 1589
+4 1398 1130 949 1099
+4 1398 1130 1705 1461
+4 1398 1130 949 1461
+4 1398 1037 1783 1002
+4 1398 1037 946 1783
+4 1398 949 946 1783
+4 1398 949 1457 1783
+4 1398 949 1099 1457
+4 1398 1037 1461 1160
+4 1398 949 1461 1160
+4 1398 1707 1705 1461
+4 1398 1037 1160 946
+4 1398 949 1160 946
+4 558 528 557 1786
+4 558 557 1786 1757
+4 558 528 980 1786
+4 558 1188 1757 588
+4 558 559 1188 588
+4 558 559 1188 1757
+4 558 587 1757 588
+4 558 557 587 588
+4 558 557 587 1757
+4 558 1786 1758 1757
+4 558 980 1786 1758
+4 558 1758 1431 1757
+4 558 559 1431 1757
+4 558 980 1758 1431
+4 558 980 559 1431
+4 685 686 1226 655
+4 715 1164 714 745
+4 715 716 1164 745
+4 715 1044 1164 714
+4 715 1044 716 1164
+4 715 1044 1345 714
+4 715 1044 1345 716
+4 687 657 686 1226
+4 687 657 688 1226
+4 687 1345 717 1200
+4 619 949 618 1160
+4 619 620 949 1160
+4 619 620 589 1160
+4 619 620 949 650
+4 621 591 622 1160
+4 621 620 591 1160
+4 621 622 1461 1160
+4 621 620 1461 1160
+4 621 652 622 1461
+4 621 651 652 1461
+4 621 620 1461 650
+4 621 651 1461 650
+4 621 620 591 590
+4 17 887 16 1307
+4 17 887 18 1307
+4 17 887 16 886
+4 837 1438 1257 836
+4 837 1438 838 1257
+4 837 1196 1257 836
+4 837 807 1196 836
+4 837 807 1196 1257
+4 837 838 1257 808
+4 837 807 1257 808
+4 837 1438 1765 836
+4 837 1765 836 867
+4 837 1438 1765 989
+4 837 1438 838 989
+4 837 1765 989 867
+4 837 868 989 867
+4 837 838 868 989
+4 923 1164 742 743
+4 923 1372 1164 742
+4 923 773 742 743
+4 923 1372 1164 1433
+4 923 744 773 743
+4 923 744 1164 743
+4 923 744 773 774
+4 923 773 1764 774
+4 923 1372 1730 771
+4 923 775 744 745
+4 923 775 744 774
+4 923 1041 1764 1730
+4 923 1372 1041 1730
+4 923 775 745 1708
+4 923 1288 1041 1764
+4 923 745 1708 746
+4 923 1137 1708 746
+4 923 1137 1288 1708
+4 923 775 1764 774
+4 923 775 1708 1764
+4 923 1288 1708 1764
+4 923 1288 1041 1558
+4 923 1372 1041 1558
+4 923 1137 1288 1558
+4 923 1137 1433 1558
+4 923 1372 1433 1558
+4 1167 1528 1049 955
+4 1167 1137 1049 955
+4 1167 1164 1528 955
+4 1167 1528 1049 1620
+4 1167 1137 1049 1620
+4 1167 1164 1433 955
+4 1167 1137 1433 955
+4 1167 1528 748 1620
+4 1167 923 1164 1433
+4 1167 923 1137 1433
+4 1167 1164 745 746
+4 1167 749 748 1620
+4 1167 747 1528 748
+4 1167 716 1528 746
+4 1167 716 1164 746
+4 1167 716 1164 1528
+4 1167 923 745 746
+4 1167 923 1137 746
+4 1167 747 1528 746
+4 1167 744 1164 745
+4 1167 923 744 745
+4 1167 923 744 1164
+4 1167 1708 749 1620
+4 1167 1137 1708 1620
+4 1167 1708 749 748
+4 1167 747 1708 748
+4 1167 747 1708 746
+4 1167 1137 1708 746
+4 563 1134 592 562
+4 563 1134 1431 562
+4 563 1134 564 1431
+4 563 564 1615 1431
+4 563 1101 1615 1431
+4 563 1101 564 1615
+4 710 1549 709 739
+4 710 740 1549 739
+4 710 1339 1549 709
+4 770 740 769 1159
+4 770 769 1730 1159
+4 770 740 1372 1159
+4 770 740 1372 771
+4 770 1372 1730 1159
+4 770 1372 1730 771
+4 770 1340 1730 771
+4 770 769 1340 1730
+4 770 801 1340 771
+4 770 801 800 771
+4 770 801 800 1340
+4 770 799 800 1340
+4 770 799 769 1340
+4 772 923 742 771
+4 772 923 773 742
+4 772 923 773 1764
+4 772 1764 1730 771
+4 772 923 1730 771
+4 772 923 1764 1730
+4 772 1340 1764 771
+4 772 1340 802 1764
+4 772 801 1340 771
+4 772 801 1340 802
+4 1580 1369 1482 1685
+4 1580 1229 1482 1685
+4 1580 1229 1006 1482
+4 1580 1229 1496 1685
+4 1580 1229 1797 1496
+4 1580 1704 1163 1188
+4 1580 1229 1704 1797
+4 1580 1006 1188 916
+4 1580 1704 1188 916
+4 1580 1229 954 1006
+4 1580 1229 1704 954
+4 1580 954 1006 916
+4 1580 1704 954 916
+4 593 1763 622 592
+4 593 1763 622 623
+4 593 1134 1763 592
+4 593 1134 1763 594
+4 593 624 1763 623
+4 593 624 1763 594
+4 593 563 1134 592
+4 593 1134 564 594
+4 593 563 1134 564
+4 1219 1763 1163 1160
+4 1219 1763 1163 1431
+4 1219 1186 1188 1606
+4 1219 1580 1163 1188
+4 1219 590 589 1160
+4 1219 590 589 1188
+4 1219 591 590 1160
+4 1219 1763 591 1160
+4 1219 1134 1188 1431
+4 1219 1134 1163 1431
+4 1219 1134 1163 1188
+4 1219 1763 591 1431
+4 1219 1606 1160 946
+4 1219 1188 1606 946
+4 1219 1310 1606 1160
+4 1219 589 1188 588
+4 1219 590 1188 1431
+4 1219 591 590 1431
+4 1219 618 589 588
+4 1219 618 1160 946
+4 1219 1188 587 588
+4 1219 1188 587 946
+4 1219 619 589 1160
+4 1219 619 618 1160
+4 1219 619 618 589
+4 1219 617 618 588
+4 1219 617 618 946
+4 1219 617 587 588
+4 1219 617 587 946
+4 1011 1614 1133 1342
+4 1011 1133 1342 1282
+4 1011 503 1133 1282
+4 1011 503 1133 504
+4 1011 1614 1343 1342
+4 1011 503 502 1282
+4 1011 503 472 502
+4 1011 920 1342 1282
+4 1011 1609 1343 1342
+4 1011 1014 472 1343
+4 1011 1609 1278 1342
+4 1011 920 1278 1342
+4 1701 1101 1315 1547
+4 1701 1547 1172 1725
+4 1701 1315 1547 1172
+4 1701 1036 1547 1725
+4 1701 1101 1036 1547
+4 1701 1172 1509 1725
+4 1701 1036 1509 1725
+4 1701 1172 1509 1563
+4 1701 1315 1172 1563
+4 1432 980 1036 1519
+4 1432 1101 980 1036
+4 1432 1701 1101 1036
+4 1432 1101 980 958
+4 1432 1036 1519 1212
+4 1432 958 1466 1519
+4 1432 980 1466 1519
+4 1432 980 958 1466
+4 1432 1036 1509 1212
+4 1432 1701 1036 1509
+4 1432 958 1519 1125
+4 1432 958 1648 1125
+4 1432 1701 1509 1563
+4 1432 1701 1315 1563
+4 1432 1701 1101 1315
+4 1432 1519 1212 1125
+4 1432 1648 1212 1125
+4 1432 958 1648 1563
+4 1432 958 1315 1075
+4 1432 1101 1315 1075
+4 1432 1101 958 1075
+4 1432 1509 1212 1239
+4 1432 1509 1563 1239
+4 1432 1648 1212 1239
+4 1432 1648 1563 1239
+4 1432 1315 1563 991
+4 1432 958 1563 991
+4 1432 958 1315 991
+4 532 531 980 562
+4 532 980 1431 562
+4 532 563 1431 562
+4 532 1129 531 980
+4 532 1129 1133 502
+4 532 1129 531 502
+4 625 626 1737 1076
+4 625 624 1737 1076
+4 625 595 626 1076
+4 625 626 1737 655
+4 625 1763 595 1076
+4 625 624 1763 1076
+4 625 624 1763 595
+4 656 626 1737 655
+4 656 657 626 1737
+4 656 686 1226 655
+4 656 657 686 1226
+4 656 1737 655 1589
+4 656 657 1737 1589
+4 656 1226 655 1646
+4 656 657 1226 1646
+4 656 655 1589 1646
+4 656 657 1589 1646
+4 499 1129 920 1278
+4 499 1129 498 1278
+4 499 1011 920 1278
+4 499 469 498 1278
+4 499 1011 469 1278
+4 500 499 1011 920
+4 500 1129 920 1282
+4 500 499 1129 920
+4 475 476 506 1614
+4 475 476 1614 1796
+4 475 476 446 1796
+4 448 447 1796 1770
+4 448 449 961 1770
+4 448 1796 961 1770
+4 448 447 478 1796
+4 448 478 449 961
+4 448 478 1796 961
+4 537 1615 567 536
+4 537 567 538 1170
+4 537 1615 567 1170
+4 537 958 538 991
+4 537 1615 1075 991
+4 537 1615 1075 536
+4 537 538 991 1261
+4 537 1615 991 1261
+4 537 538 1170 1261
+4 537 1615 1170 1261
+4 537 506 1466 507
+4 537 506 1466 536
+4 537 508 1466 507
+4 537 508 1466 538
+4 537 958 1466 536
+4 537 958 1466 538
+4 537 958 1075 991
+4 537 958 1075 536
+4 568 598 569 1647
+4 568 598 567 1647
+4 568 569 1647 1170
+4 568 567 1647 1170
+4 568 567 538 1170
+4 568 538 1682 1170
+4 568 569 1682 1170
+4 568 569 538 1682
+4 1105 564 1615 565
+4 1105 1134 564 565
+4 1105 566 1615 565
+4 1105 1134 566 565
+4 1105 564 1615 1431
+4 1105 1134 564 1431
+4 1105 1134 1069 1431
+4 1105 566 567 1647
+4 1105 566 1615 567
+4 1105 567 1647 1170
+4 1105 1615 567 1170
+4 1105 954 1371 1069
+4 1105 1134 954 1069
+4 1105 1375 1170 1621
+4 1105 1375 1615 1170
+4 1105 1375 1371 1621
+4 1105 1371 1235 1621
+4 1105 954 1235 1621
+4 1105 954 1371 1235
+4 1105 1311 1375 1371
+4 1700 439 410 409
+4 1700 439 979 409
+4 1700 439 410 440
+4 1700 380 410 409
+4 1700 979 409 947
+4 1700 439 979 440
+4 1700 441 410 440
+4 1700 1790 921 948
+4 1700 921 379 948
+4 1700 411 441 410
+4 1700 411 921 412
+4 1700 411 380 410
+4 1700 380 379 409
+4 1700 380 921 379
+4 1700 1098 947 1190
+4 1700 1098 979 1190
+4 1700 1098 979 947
+4 1700 441 979 1190
+4 1700 441 979 440
+4 1700 1608 947 948
+4 1700 1608 947 1190
+4 1700 947 948 408
+4 1700 409 947 408
+4 1700 1790 1608 948
+4 1700 379 378 948
+4 1700 379 409 378
+4 1700 378 948 408
+4 1700 409 378 408
+4 1700 1790 1608 1430
+4 1700 1790 921 1430
+4 467 1516 466 915
+4 467 437 436 466
+4 1798 956 929 1321
+4 1798 929 1233 1321
+4 1798 1378 1233 1321
+4 1798 956 929 1761
+4 1798 1289 929 1761
+4 1798 929 1233 1651
+4 1798 1259 1233 1651
+4 1798 1378 1233 1770
+4 1798 1259 1233 1770
+4 1798 1259 1378 1770
+4 1798 1289 929 1651
+4 1798 1259 1289 1651
+4 1498 956 1321 1592
+4 1498 1233 1321 1592
+4 1498 1378 1233 1321
+4 1498 1798 1378 1321
+4 1498 1798 956 1321
+4 1498 1798 956 1378
+4 1498 1233 1592 1770
+4 1498 1378 1233 1770
+4 1498 449 1592 1770
+4 1498 419 418 1592
+4 1498 956 1017 1592
+4 1498 448 449 1770
+4 1498 419 449 1592
+4 1498 448 419 418
+4 1498 448 419 449
+4 1166 1729 1289 1761
+4 1166 1729 1014 1761
+4 1166 1798 1289 1761
+4 1166 1798 1259 1289
+4 1166 1798 1014 1761
+4 1166 1729 1104 1289
+4 1166 1104 1289 1651
+4 1166 1259 1289 1651
+4 1166 1259 1104 1651
+4 1309 1098 979 1400
+4 1309 1729 979 1400
+4 1309 1729 1098 979
+4 1309 1729 1098 1755
+4 1309 1098 1368 1755
+4 1309 1098 1368 1400
+4 1309 1729 1761 1755
+4 1309 1729 1761 1400
+4 1309 929 1761 1755
+4 1309 956 1368 1400
+4 1309 1368 1271 1755
+4 1309 929 1271 1755
+4 1309 929 1368 1271
+4 1309 956 929 1761
+4 1309 956 929 1368
+4 82 81 1434 112
+4 82 1434 113 112
+4 82 83 1434 113
+4 82 924 83 1434
+4 82 924 81 1434
+4 82 924 83 1643
+4 82 924 81 1643
+4 82 83 1643 52
+4 82 81 1643 52
+4 117 1045 1314 147
+4 117 1679 1045 147
+4 117 1679 1045 1314
+4 117 87 86 1767
+4 119 1679 149 90
+4 145 114 1314 115
+4 145 144 114 1314
+4 145 146 1045 1314
+4 145 1733 1045 1314
+4 145 144 1733 1314
+4 145 144 1733 1045
+4 145 144 1045 1313
+4 1280 981 978 1429
+4 1280 1791 978 1429
+4 1280 924 981 1643
+4 1280 981 928 978
+4 1280 924 981 928
+4 1280 1312 1791 1429
+4 1280 924 1312 1791
+4 1280 928 1791 978
+4 1280 924 928 1791
+4 1280 1639 981 1429
+4 1280 1639 981 1643
+4 1280 924 1643 1009
+4 1280 1312 1009 1429
+4 1280 1639 1009 1429
+4 1280 1639 1643 1009
+4 1280 1312 1009 1434
+4 1280 924 1009 1434
+4 1280 924 1312 1434
+4 988 1619 959 1053
+4 988 1228 1469 1053
+4 988 1228 1232 1053
+4 988 1228 1736 1232
+4 988 959 1053 1412
+4 988 1469 1053 1412
+4 988 1469 959 1412
+4 988 1228 1469 1616
+4 988 959 1616 1197
+4 988 1469 1616 1197
+4 988 1469 959 1197
+4 1527 1736 1232 1681
+4 1527 988 1232 1053
+4 1527 988 1736 1232
+4 1527 988 1619 1053
+4 1527 988 1619 1736
+4 1641 913 1484 1063
+4 1641 1346 913 1063
+4 1641 1070 1484 1063
+4 1641 1517 913 1484
+4 1641 1346 1517 913
+4 1641 1070 1649 1063
+4 1641 1346 1649 1063
+4 1641 1551 1220 1484
+4 1641 1070 1220 1484
+4 1641 1517 1100 1484
+4 1641 1551 1100 1484
+4 1641 1346 1313 1517
+4 1641 1070 1619 1649
+4 1641 1346 1619 1649
+4 1641 1527 1070 1220
+4 1641 1313 1517 1100
+4 1641 1551 1313 1100
+4 1641 1527 1070 1619
+4 88 117 87 1767
+4 88 117 118 1767
+4 88 87 1139 1767
+4 88 87 1139 1258
+4 88 89 1139 1258
+4 88 87 1258 58
+4 88 89 1258 58
+4 204 203 926 1523
+4 204 205 1347 1523
+4 204 926 1347 1523
+4 204 926 205 1347
+4 204 234 205 1523
+4 204 926 205 1616
+4 204 203 926 1616
+4 204 173 203 1616
+4 1550 1668 1128 1666
+4 1550 1610 1128 1666
+4 1550 1610 1668 1666
+4 1550 1610 1670 1128
+4 1550 1670 1128 1756
+4 1550 1668 1128 1756
+4 1550 1670 1279 1756
+4 1550 1670 1492 1279
+4 1550 1405 1670 1492
+4 1550 1010 1668 1492
+4 1550 1492 1279 1756
+4 1550 1668 1492 1756
+4 1550 1405 1670 1165
+4 1550 1670 1462 1165
+4 1550 1610 1462 1165
+4 1550 1610 1670 1462
+4 260 1610 919 261
+4 260 1610 919 259
+4 260 289 919 259
+4 260 919 291 261
+4 1644 1550 1405 1492
+4 1644 1550 1405 232
+4 1644 1550 1010 1492
+4 1644 1550 1010 232
+4 1644 1010 232 1523
+4 1644 1010 1194 1523
+4 1644 1194 1406 1464
+4 1644 1194 1406 1107
+4 1644 1194 1523 1107
+4 1644 1492 1464 1255
+4 1644 1405 1464 1255
+4 1644 1405 1492 1255
+4 1644 1406 1464 1107
+4 1644 1405 1464 1107
+4 1490 1010 1523 1485
+4 1490 1010 1194 1523
+4 1490 1523 1485 1693
+4 1490 1194 1523 1693
+4 1490 1754 1485 1155
+4 1490 1010 1485 1155
+4 1490 1644 1492 1464
+4 1490 1644 1194 1464
+4 1490 1644 1010 1492
+4 1490 1644 1010 1194
+4 1490 1668 1754 1155
+4 1490 1010 1668 1155
+4 1490 1668 1754 1123
+4 1490 1668 1756 1123
+4 1490 1668 1492 1756
+4 1490 1010 1668 1492
+4 197 196 1727 1155
+4 197 1668 1727 1155
+4 197 1668 227 1155
+4 197 226 227 1155
+4 197 226 196 1155
+4 197 166 167 1727
+4 197 166 196 1727
+4 197 166 196 167
+4 293 292 1103 1012
+4 293 292 323 1103
+4 233 1550 1610 232
+4 233 1550 1405 232
+4 233 1644 1405 232
+4 233 1644 234 1405
+4 233 1644 232 1523
+4 233 1644 234 1523
+4 233 232 1523 202
+4 233 203 1523 202
+4 233 204 203 1523
+4 233 204 234 1523
+4 287 316 286 1127
+4 287 919 288 1127
+4 287 286 919 1127
+4 287 919 288 257
+4 287 919 256 257
+4 287 286 919 256
+4 1308 316 1544 944
+4 1308 1399 1699 1193
+4 1308 319 320 1581
+4 1308 319 1581 349
+4 1308 1399 1640 944
+4 1308 346 347 944
+4 1308 316 346 944
+4 1308 316 346 347
+4 1308 1544 1064 944
+4 1308 1008 1247 944
+4 1308 1399 1247 944
+4 1308 1399 1008 1247
+4 1308 1039 1699 1008
+4 1308 1399 1039 1008
+4 1308 1399 1039 1699
+4 1308 1581 347 944
+4 1308 1581 1640 944
+4 1308 1399 1581 1640
+4 1308 1601 1064 944
+4 1308 1008 1601 944
+4 1308 1008 1601 1064
+4 350 320 1581 349
+4 350 1702 1581 349
+4 350 921 379 349
+4 350 380 921 379
+4 350 921 349 948
+4 350 1702 349 948
+4 350 1702 921 948
+4 198 199 1668 1727
+4 198 197 1668 1727
+4 198 228 1668 227
+4 198 197 1668 227
+4 198 197 228 227
+4 1074 1700 921 1430
+4 1074 1373 921 1430
+4 1074 1373 1169 1430
+4 1074 1700 921 412
+4 1074 1373 921 1586
+4 1074 1373 1169 1586
+4 1074 383 414 384
+4 1074 383 921 384
+4 1074 1700 1608 1190
+4 1074 1700 1608 1430
+4 1074 1608 1190 1017
+4 1074 1608 1017 1416
+4 1074 1169 1017 1416
+4 1074 1498 956 1017
+4 1074 1169 1017 1592
+4 1074 1498 1017 1592
+4 1074 1732 1608 1416
+4 1074 1732 1608 1430
+4 1074 1169 1732 1416
+4 1074 1169 1732 1430
+4 1074 1169 417 418
+4 1074 1498 417 418
+4 1074 1368 1190 1017
+4 1074 956 1368 1017
+4 1074 956 1368 1190
+4 1074 1169 418 1592
+4 1074 1498 418 1592
+4 382 411 921 412
+4 382 383 1702 921
+4 382 1074 921 412
+4 382 1074 383 412
+4 382 1074 383 921
+4 354 355 1046 384
+4 354 1702 384 353
+4 354 1702 1046 384
+4 354 1674 355 1046
+4 354 1674 1702 353
+4 354 1674 1702 1046
+4 354 1674 1436 353
+4 354 1674 355 1436
+4 140 141 1460 1100
+4 140 139 1460 1100
+4 140 141 170 1460
+4 140 139 170 1460
+4 140 1733 1100 1071
+4 140 141 1733 1100
+4 140 171 141 170
+4 168 139 169 1460
+4 168 169 1460 1459
+4 168 1460 1459 1305
+4 168 167 1460 1305
+4 168 169 1727 1459
+4 168 1727 1459 1305
+4 168 167 1727 1305
+4 168 197 167 1727
+4 168 198 197 1727
+4 168 169 199 1727
+4 168 198 199 1727
+4 168 198 169 199
+4 296 297 1287 266
+4 296 295 1287 266
+4 55 56 85 1643
+4 55 84 85 1643
+4 55 54 84 1643
+4 55 54 1643 986
+4 55 1643 1319 986
+4 55 56 1319 986
+4 55 56 1643 1319
+4 1016 1018 1618 329
+4 1016 1618 329 1739
+4 1016 1618 1739 1529
+4 1016 1618 1193 1529
+4 1016 1284 1618 1193
+4 1016 1018 1284 1618
+4 1016 1436 1018 1284
+4 1016 1581 1284 1193
+4 1016 1436 1581 1284
+4 1016 323 1581 1193
+4 1016 1436 323 1581
+4 1016 323 1103 1193
+4 326 355 1436 356
+4 326 357 1436 356
+4 326 357 327 1436
+4 326 1016 327 1436
+4 389 1169 360 390
+4 389 1169 419 390
+4 389 1169 419 418
+4 389 388 1169 418
+4 389 359 1560 360
+4 387 1169 417 418
+4 387 388 1169 418
+4 387 1074 1169 417
+4 859 1491 1669 829
+4 859 1491 860 1669
+4 859 1669 829 1158
+4 859 858 1669 1158
+4 859 1726 829 1158
+4 859 858 1726 1158
+4 859 860 1669 1191
+4 859 889 1669 1191
+4 859 889 860 1191
+4 859 858 888 1669
+4 859 889 888 1669
+4 859 1726 828 829
+4 859 858 1726 828
+4 25 26 56 986
+4 25 55 56 986
+4 25 54 24 986
+4 25 55 54 986
+4 25 895 896 986
+4 25 26 896 986
+4 25 895 894 986
+4 25 24 894 986
+4 803 834 1196 804
+4 803 1491 802 1162
+4 803 1491 1196 1162
+4 803 802 1162 1613
+4 803 1196 1162 1613
+4 803 1196 804 1613
+4 803 802 1764 1613
+4 803 804 1764 1613
+4 803 772 802 1764
+4 803 772 773 1764
+4 803 804 1764 774
+4 803 773 1764 774
+4 863 864 1703 1765
+4 863 864 1703 1524
+4 863 1043 1524 951
+4 863 1043 1191 951
+4 863 1043 1524 1495
+4 863 864 1524 1495
+4 863 864 1043 1495
+4 863 892 1043 893
+4 863 864 1043 893
+4 863 864 894 893
+4 831 832 1491 1703
+4 831 861 1491 1703
+4 831 861 832 1703
+4 831 1491 801 802
+4 831 832 1491 802
+4 138 139 1460 1100
+4 138 137 1460 1100
+4 138 108 137 1100
+4 138 168 139 1460
+4 138 137 167 1460
+4 138 168 167 1460
+4 106 76 105 75
+4 106 76 1009 105
+4 106 136 105 1035
+4 106 1009 105 1094
+4 106 105 1094 1035
+4 106 136 1100 1035
+4 106 137 136 1100
+4 47 76 77 1639
+4 1458 1642 51 52
+4 1458 1639 51 52
+4 1458 1642 51 21
+4 1458 1643 1642 52
+4 1458 1639 1643 52
+4 1458 1643 1642 1521
+4 1458 1639 1643 1521
+4 1458 1642 1487 1787
+4 1458 1639 1697 1275
+4 1458 1639 1697 1521
+4 1458 1642 1307 1787
+4 1458 47 1639 1275
+4 1458 1487 1787 1275
+4 1458 1642 1487 1521
+4 1458 19 18 1307
+4 1458 1697 1213 1275
+4 1458 1487 1213 1275
+4 1458 1697 1521 1213
+4 1458 17 18 1307
+4 1458 47 17 18
+4 1458 1521 1213 1424
+4 1458 1487 1213 1424
+4 1458 1487 1521 1424
+4 1458 16 1307 1787
+4 1458 17 16 1307
+4 1458 16 1787 1275
+4 1458 47 17 16
+4 561 560 591 1431
+4 561 592 1431 562
+4 561 591 592 1431
+4 561 980 1431 562
+4 561 531 980 562
+4 561 560 980 1431
+4 561 560 531 980
+4 561 560 591 590
+4 530 560 531 980
+4 530 1129 531 980
+4 530 500 499 1129
+4 497 498 1156 527
+4 497 498 1156 1278
+4 497 496 1156 1278
+4 497 496 1278 1516
+4 497 467 1278 1516
+4 497 526 1156 527
+4 497 496 526 527
+4 497 496 526 1156
+4 497 496 1516 466
+4 497 467 1516 466
+4 497 467 496 466
+4 258 1610 257 1666
+4 258 228 1668 1666
+4 258 919 288 259
+4 258 919 288 257
+4 258 1610 1668 1666
+4 258 1610 1668 259
+4 258 1610 919 259
+4 258 1610 919 257
+4 258 287 288 257
+4 1316 1707 1705 1461
+4 1316 1404 1705 1461
+4 1316 1404 1707 1705
+4 1316 1404 1737 1461
+4 1316 1404 1707 1737
+4 1316 1737 1076 1461
+4 1316 1398 1707 1344
+4 1316 1398 1707 1461
+4 1316 1707 1344 1020
+4 1316 1707 1737 1020
+4 1316 1398 1037 1344
+4 1316 1344 1114 1020
+4 1316 1737 1020 1713
+4 1316 1737 1076 1713
+4 1316 1076 1461 1160
+4 1316 1310 1461 1160
+4 1316 1310 1076 1160
+4 1316 1310 1037 1461
+4 1316 1398 1037 1461
+4 1316 1114 1020 1713
+4 1316 1076 1114 1713
+4 1316 1310 1076 1114
+4 1316 1037 1344 1114
+4 1316 1310 1037 1114
+4 1667 1130 1705 1099
+4 1667 1398 1130 1099
+4 1667 1398 1130 1705
+4 1667 1705 1099 1034
+4 1667 1034 1783 1245
+4 1667 1099 1783 1245
+4 1667 1099 1034 1245
+4 1667 1099 1457 1783
+4 1667 1398 1457 1783
+4 1667 1398 1099 1457
+4 1667 1707 1344 1034
+4 1667 1707 1705 1034
+4 1667 1398 1707 1344
+4 1667 1398 1707 1705
+4 1667 1034 940 1783
+4 1667 1210 1783 1002
+4 1667 1398 1783 1002
+4 1667 1344 1034 940
+4 1667 1344 1210 940
+4 1667 1344 1210 1002
+4 1667 940 1783 1270
+4 1667 1210 1783 1270
+4 1667 1210 940 1270
+4 1667 1037 1344 1002
+4 1667 1398 1037 1002
+4 1667 1398 1037 1344
+4 649 679 648 1457
+4 649 648 949 1457
+4 649 679 1457 1341
+4 649 949 650 1249
+4 649 949 1457 1249
+4 649 619 949 650
+4 649 650 1249 1341
+4 649 1457 1249 1341
+4 649 680 650 1341
+4 649 680 679 1341
+4 649 648 949 618
+4 649 619 949 618
+4 649 619 648 618
+4 683 653 1226 1525
+4 683 653 1525 1341
+4 683 1522 1341 682
+4 683 1525 1522 1341
+4 683 652 1341 682
+4 683 653 652 1341
+4 683 1493 1522 682
+4 683 1493 1612 682
+4 683 1493 1345 1612
+4 683 1044 1345 713
+4 683 1044 1612 682
+4 683 1044 1345 1612
+4 1557 687 1345 686
+4 1557 687 686 1226
+4 1557 1226 1525 1650
+4 1557 1493 1345 1556
+4 1557 688 1226 1650
+4 1557 687 688 1226
+4 1557 687 688 1200
+4 1557 687 1345 1200
+4 1557 685 1226 1525
+4 1557 685 686 1226
+4 1557 685 1345 686
+4 1557 1345 1200 1680
+4 1557 1345 1556 1680
+4 1557 1493 1556 1584
+4 1557 688 689 1200
+4 1557 688 689 1650
+4 1557 1382 1200 1680
+4 1557 1556 1382 1680
+4 1557 1556 1584 1771
+4 1557 1013 1264 1650
+4 1557 1525 1013 1650
+4 1557 1493 1525 1577
+4 1557 1650 1200 1771
+4 1557 1382 1200 1771
+4 1557 1556 1382 1771
+4 1557 689 1200 660
+4 1557 1650 1200 660
+4 1557 689 1650 660
+4 1557 1264 1650 1771
+4 1557 1584 1264 1771
+4 1557 1577 1584 1264
+4 1557 1493 1577 1584
+4 1557 1013 1577 1264
+4 1557 1525 1013 1577
+4 229 1610 1668 259
+4 229 198 199 1668
+4 229 198 228 1668
+4 229 1010 199 1668
+4 534 563 1101 564
+4 534 1101 1615 535
+4 534 1101 564 1615
+4 534 1615 565 535
+4 534 564 1615 565
+4 534 1101 958 535
+4 534 1101 980 958
+4 534 958 1466 535
+4 534 980 958 1466
+4 534 1133 1466 535
+4 534 1133 504 535
+4 534 503 1133 504
+4 442 443 1014 472
+4 442 1700 411 412
+4 442 1700 411 441
+4 442 1700 412 1190
+4 442 1700 441 1190
+4 442 441 1400 1190
+4 442 441 979 1400
+4 442 1014 979 1400
+4 442 1014 441 979
+4 741 923 742 771
+4 741 740 1372 771
+4 741 923 1372 771
+4 741 923 1372 742
+4 741 710 740 1549
+4 741 740 1372 1549
+4 741 1372 1164 1549
+4 741 1372 1164 742
+4 741 712 1164 742
+4 917 1186 1006 1482
+4 917 1580 1006 1482
+4 917 1186 1482 1005
+4 917 1580 1006 1188
+4 917 1369 1482 1005
+4 917 1580 1369 1482
+4 917 1186 1188 975
+4 917 1186 1006 975
+4 917 1219 1186 1188
+4 917 1219 1580 1188
+4 917 1186 1310 1005
+4 917 1369 1310 1005
+4 917 1188 1757 975
+4 917 1006 1757 975
+4 917 1006 1188 1757
+4 917 1186 1310 1606
+4 917 1219 1310 1606
+4 917 1219 1186 1606
+4 1583 917 1369 1310
+4 1583 917 1580 1369
+4 1583 1580 1496 1685
+4 1583 1580 1369 1685
+4 1583 1310 1076 1114
+4 1583 1369 1310 1114
+4 1583 1132 1496 1685
+4 1583 1369 1132 1685
+4 1583 1369 1132 1114
+4 1583 1076 1114 1713
+4 1583 1496 1076 1713
+4 1583 1132 1114 1713
+4 1583 1132 1496 1713
+4 1218 1011 1609 1343
+4 1218 1011 1014 1343
+4 1218 1014 441 979
+4 1218 950 1157 1609
+4 1218 950 1609 1343
+4 1218 950 1014 1343
+4 1218 1729 1014 979
+4 1218 441 979 440
+4 1218 471 441 472
+4 1218 1011 471 472
+4 1218 1011 1014 472
+4 1218 950 1157 1636
+4 1218 950 1729 1636
+4 1218 442 441 472
+4 1218 442 1014 472
+4 1218 442 1014 441
+4 1218 1729 1098 979
+4 1218 1157 1636 1633
+4 1218 1729 1636 1633
+4 1218 1098 1184 1394
+4 1218 1098 1394 1755
+4 1218 1729 1394 1755
+4 1218 1729 1098 1755
+4 1218 1633 1184 1394
+4 1218 1729 1633 1394
+4 1218 1157 1633 1184
+4 1218 1098 437 1184
+4 627 657 626 1737
+4 627 656 657 626
+4 627 626 1737 1076
+4 627 628 1737 1076
+4 627 657 658 1737
+4 627 628 658 1737
+4 627 626 597 1076
+4 627 598 597 1076
+4 627 598 628 1076
+4 627 596 626 597
+4 501 500 1011 471
+4 501 1011 472 502
+4 501 1011 471 472
+4 501 1011 502 1282
+4 501 1129 502 1282
+4 501 500 1129 1282
+4 501 1011 920 1282
+4 501 500 920 1282
+4 501 500 1011 920
+4 501 1129 531 502
+4 501 530 1129 531
+4 501 530 500 1129
+4 470 499 1011 469
+4 470 500 499 469
+4 470 500 499 1011
+4 470 500 1011 471
+4 470 469 439 440
+4 474 475 1614 504
+4 474 1614 1133 504
+4 474 1011 1133 504
+4 474 1011 1614 1133
+4 474 1011 503 504
+4 474 1614 1796 1343
+4 474 475 1614 1796
+4 1553 1105 1069 1431
+4 1553 1069 1758 1431
+4 1553 1102 1758 1431
+4 1553 1102 1069 1758
+4 1553 1615 1102 1431
+4 1553 1105 1615 1431
+4 1553 1311 1102 1069
+4 1553 1311 1371 1069
+4 1553 1105 1371 1069
+4 1553 1105 1311 1371
+4 1553 1105 1375 1615
+4 1553 1105 1311 1375
+4 1553 1615 1102 987
+4 1553 1375 1615 987
+4 1553 1311 1102 987
+4 1553 1311 1375 987
+4 1106 1134 1704 954
+4 1106 1105 1134 954
+4 1106 1134 1704 1647
+4 1106 1704 1797 1647
+4 1106 1704 1797 954
+4 1106 1105 954 1621
+4 1106 1105 566 1647
+4 1106 1105 1134 566
+4 1106 1797 1647 1621
+4 1106 1797 954 1621
+4 1106 1647 1170 1621
+4 1106 1105 1170 1621
+4 1106 1105 1647 1170
+4 1106 566 565 1647
+4 1106 1134 565 1647
+4 1106 1134 566 565
+4 468 497 498 1278
+4 468 497 467 1278
+4 468 469 498 1278
+4 468 499 469 498
+4 468 469 439 438
+4 413 1074 383 412
+4 413 1074 383 414
+4 413 1074 1700 412
+4 1435 1166 1798 1014
+4 1435 1166 1798 1259
+4 1435 1798 1014 1378
+4 1435 1798 1259 1378
+4 1435 1166 1259 1104
+4 1435 1014 1378 1770
+4 1435 1259 1378 1770
+4 1435 1259 1104 1110
+4 1435 1077 1104 1110
+4 1435 1259 1021 1110
+4 1435 1259 1021 1770
+4 1435 1077 1645 1110
+4 1435 1796 1021 1110
+4 1435 1796 1021 1770
+4 1435 1014 1796 1770
+4 1435 1645 1796 1110
+4 1435 1014 1645 1796
+4 1435 950 1077 1645
+4 1409 117 118 1767
+4 1409 117 118 1679
+4 1409 119 118 1679
+4 1409 1679 1767 1314
+4 1409 119 1679 90
+4 1409 88 118 1767
+4 1409 88 119 118
+4 1409 119 90 60
+4 1409 88 119 89
+4 1409 1679 91 90
+4 1409 1679 91 1294
+4 1409 1679 1738 1294
+4 1409 1679 1767 1738
+4 1409 119 89 60
+4 1409 88 1139 1767
+4 1409 88 89 1139
+4 1409 91 90 60
+4 1409 1738 1292 1294
+4 1409 1767 1738 1292
+4 1409 89 1139 60
+4 1409 91 61 60
+4 1409 91 61 1294
+4 1409 1139 61 60
+4 1409 1139 61 1294
+4 1409 1139 1767 1292
+4 1409 1325 1292 1294
+4 1409 1139 1325 1294
+4 1409 1139 1325 1292
+4 116 1767 1314 115
+4 116 117 86 1767
+4 116 1409 1767 1314
+4 116 1409 117 1767
+4 116 145 1314 115
+4 116 145 146 1314
+4 116 146 1314 147
+4 116 117 1314 147
+4 116 1767 1434 115
+4 116 86 1434 115
+4 116 86 1767 1434
+4 116 117 1679 1314
+4 116 1409 1679 1314
+4 116 1409 117 1679
+4 175 204 205 1616
+4 175 206 205 1616
+4 1138 1527 1232 1681
+4 1138 1232 912 1681
+4 1138 1527 1070 1220
+4 1138 1220 912 1681
+4 1138 1070 1220 912
+4 1138 1736 1220 1681
+4 1138 1527 1736 1681
+4 1138 1527 1736 1220
+4 1138 1232 1149 912
+4 1138 1232 1053 1149
+4 1138 1527 1232 1053
+4 1138 1179 1149 912
+4 1138 1070 1179 912
+4 1138 1053 1149 1357
+4 1138 1179 1149 1357
+4 1138 1070 1179 1357
+4 1138 1619 1053 1357
+4 1138 1527 1619 1053
+4 1138 1070 1649 1357
+4 1138 1619 1649 1357
+4 1138 1070 1619 1649
+4 1138 1527 1070 1619
+4 148 1679 1045 147
+4 148 1679 1045 149
+4 148 117 1679 147
+4 148 117 118 1679
+4 148 119 1679 149
+4 148 119 118 1679
+4 148 1799 1045 149
+4 53 83 1643 52
+4 53 1643 1642 52
+4 53 84 83 1643
+4 53 54 84 1643
+4 53 54 84 83
+4 53 1643 1642 986
+4 53 54 1643 986
+4 53 22 1642 52
+4 53 23 22 1642
+4 53 23 1642 986
+4 53 24 23 986
+4 53 54 24 986
+4 236 206 1523 1107
+4 236 206 205 1523
+4 236 237 207 1107
+4 236 206 207 1107
+4 290 260 919 291
+4 290 260 289 919
+4 290 919 291 1103
+4 1187 1490 1485 1693
+4 1187 1754 1693 1710
+4 1187 1754 1485 1693
+4 1187 1194 1693 1710
+4 1187 1490 1194 1693
+4 1187 1464 1754 1710
+4 1187 1194 1464 1710
+4 1187 1490 1194 1464
+4 1187 1490 1754 1485
+4 1187 1490 1754 1123
+4 1187 1754 1751 1123
+4 1187 1464 1754 1751
+4 1187 1490 1492 1464
+4 1187 1492 1751 1123
+4 1187 1492 1464 1751
+4 1187 1492 1756 1123
+4 1187 1490 1756 1123
+4 1187 1490 1492 1756
+4 294 295 1103 1287
+4 294 293 323 1103
+4 294 1103 1287 1012
+4 317 287 316 1127
+4 317 1308 316 1544
+4 317 1308 316 347
+4 317 287 316 286
+4 317 316 346 347
+4 1277 1308 1544 1064
+4 1277 1308 1008 1064
+4 1277 1308 1699 1008
+4 1277 317 1308 1544
+4 1277 1122 1064 1095
+4 1277 1127 1064 1095
+4 1277 1127 1122 1095
+4 1277 1127 1122 1536
+4 1277 1699 1127 1536
+4 1277 1122 1481 1064
+4 1277 1008 1122 1481
+4 1277 1008 1122 1350
+4 1277 1699 1008 1350
+4 1277 1122 1536 1350
+4 1277 1699 1536 1350
+4 1277 316 1544 1064
+4 1277 317 316 1544
+4 1277 316 1127 1064
+4 1277 317 316 1127
+4 1277 1481 1601 1064
+4 1277 1008 1601 1064
+4 1277 1008 1481 1601
+4 1370 1308 320 1581
+4 1370 322 1581 1193
+4 1370 1399 1581 1193
+4 1370 1308 1399 1193
+4 1370 1308 1399 1581
+4 1370 1308 1699 1193
+4 1370 1699 1103 1193
+4 1370 1308 319 320
+4 1370 323 1103 1193
+4 1370 322 323 1193
+4 1370 322 323 1103
+4 1370 1277 1308 1699
+4 1370 290 291 1103
+4 1370 292 291 1103
+4 1370 322 292 1103
+4 1370 290 319 320
+4 1370 1759 1699 1127
+4 1370 1759 1699 1103
+4 1370 290 919 1103
+4 1370 1277 1699 1127
+4 1370 290 319 289
+4 1370 919 1759 1127
+4 1370 919 1759 1103
+4 1370 289 919 1127
+4 1370 290 289 919
+4 1370 289 288 1127
+4 351 350 320 1581
+4 351 350 1702 1581
+4 351 350 1702 921
+4 351 350 380 921
+4 263 233 234 1405
+4 263 1610 1462 1165
+4 263 1550 1610 1165
+4 263 233 1550 1610
+4 263 1550 1405 1165
+4 263 233 1550 1405
+4 263 293 292 1012
+4 263 293 1103 1012
+4 381 351 380 921
+4 381 351 350 380
+4 381 382 411 921
+4 381 382 1702 921
+4 381 351 1702 921
+4 381 1700 380 921
+4 381 1700 411 921
+4 381 1700 411 380
+4 416 417 447 446
+4 1465 1074 414 415
+4 1465 413 443 414
+4 1465 413 1074 414
+4 1465 442 1014 1400
+4 1465 442 443 1014
+4 1465 1014 447 446
+4 1465 416 1074 415
+4 1465 1074 1498 956
+4 1465 442 1400 1190
+4 1465 956 1400 1190
+4 1465 1074 956 1190
+4 1465 1014 1378 1770
+4 1465 1014 447 1770
+4 1465 417 447 446
+4 1465 1798 1014 1378
+4 1465 1498 956 1378
+4 1465 416 417 446
+4 1465 1074 1498 417
+4 1465 416 1074 417
+4 1465 413 442 443
+4 1465 1074 1700 1190
+4 1465 413 1074 1700
+4 1465 448 447 1770
+4 1465 448 417 447
+4 1465 1498 1378 1770
+4 1465 1498 448 1770
+4 1465 1798 956 1378
+4 1465 1014 1761 1400
+4 1465 1798 1014 1761
+4 1465 442 412 1190
+4 1465 413 442 412
+4 1465 1700 412 1190
+4 1465 413 1700 412
+4 1465 448 417 418
+4 1465 1498 417 418
+4 1465 1498 448 418
+4 1465 1309 956 1400
+4 1465 1309 1761 1400
+4 1465 1798 956 1761
+4 1465 1309 956 1761
+4 20 1458 49 19
+4 20 1458 1642 21
+4 20 1642 890 21
+4 20 1458 1642 1307
+4 20 1458 19 1307
+4 20 1642 890 1307
+4 20 889 890 1307
+4 20 889 19 1307
+4 20 889 19 890
+4 109 140 139 1100
+4 109 108 1100 1071
+4 109 138 139 1100
+4 109 138 108 1100
+4 109 108 1009 1071
+4 109 108 79 1009
+4 1317 296 295 1287
+4 1317 1526 1103 1287
+4 1317 295 1103 1287
+4 1317 296 297 1287
+4 1317 294 295 1103
+4 1317 298 297 1287
+4 1317 296 327 297
+4 1317 326 296 327
+4 1317 1526 1103 1193
+4 1317 1016 1103 1193
+4 1317 298 1287 1050
+4 1317 1499 1739 1050
+4 1317 1526 1499 1739
+4 1317 1287 1499 1050
+4 1317 1526 1287 1499
+4 1317 327 298 297
+4 1317 1526 1739 1529
+4 1317 1016 1739 1529
+4 1317 1016 327 1739
+4 1317 326 1016 327
+4 1317 1526 1193 1529
+4 1317 1016 1193 1529
+4 1317 299 1739 1050
+4 1317 298 299 1050
+4 1317 298 299 1739
+4 324 1016 1436 323
+4 324 1436 323 353
+4 324 354 1436 353
+4 324 354 355 1436
+4 324 1016 323 1103
+4 324 1317 1016 1103
+4 324 294 323 1103
+4 324 1317 294 1103
+4 1468 389 388 1169
+4 1468 389 1560 360
+4 1468 389 1169 360
+4 1468 389 388 358
+4 1468 1046 1586 1560
+4 1468 387 388 1169
+4 1468 1560 361 360
+4 1468 1169 361 360
+4 1468 1169 1560 361
+4 1468 358 359 1560
+4 1468 389 359 1560
+4 1468 389 358 359
+4 1468 1586 1560 1320
+4 1468 1169 1560 1320
+4 1468 1169 1586 1320
+4 1468 387 388 358
+4 1468 357 1436 1046
+4 1468 1436 358 1560
+4 1468 357 1436 358
+4 1468 387 357 358
+4 1468 1046 1136 1560
+4 1468 1436 1136 1560
+4 1468 1436 1046 1136
+4 1468 357 1046 356
+4 385 1074 921 384
+4 385 1074 921 1586
+4 385 921 1046 384
+4 385 921 1046 1586
+4 385 355 1046 384
+4 385 1074 414 384
+4 385 1074 414 415
+4 385 416 1074 415
+4 833 832 1491 802
+4 833 803 1491 802
+4 833 832 1491 1192
+4 833 1491 1196 1192
+4 833 803 1491 1196
+4 833 834 1196 1192
+4 833 803 834 1196
+4 833 832 1192 1794
+4 833 834 1192 1794
+4 833 832 1703 1794
+4 833 1703 1765 1794
+4 833 834 1765 1794
+4 833 863 1703 1765
+4 833 834 864 1765
+4 833 863 864 1765
+4 862 861 832 1703
+4 862 833 832 1703
+4 862 833 863 1703
+4 862 861 1703 951
+4 862 1703 1524 951
+4 862 863 1524 951
+4 862 863 1703 1524
+4 862 861 1191 951
+4 862 863 1191 951
+4 862 861 892 1191
+4 862 892 1043 1191
+4 862 863 1043 1191
+4 862 863 892 1043
+4 738 1159 768 739
+4 738 737 1159 768
+4 738 1518 1159 739
+4 738 737 1518 1159
+4 738 769 768 739
+4 738 1518 709 739
+4 738 708 1518 709
+4 48 1458 49 1639
+4 48 1458 47 1639
+4 48 1458 47 18
+4 48 1639 78 79
+4 48 49 1639 79
+4 48 77 1639 78
+4 48 47 77 1639
+4 48 49 19 18
+4 48 1458 19 18
+4 48 1458 49 19
+4 46 47 76 77
+4 46 47 76 1639
+4 46 76 1697 45
+4 46 76 1639 1697
+4 46 76 45 75
+4 46 1697 45 1275
+4 46 1639 1697 1275
+4 46 47 1639 1275
+4 46 16 45 1275
+4 46 47 17 16
+4 46 1458 16 1275
+4 46 1458 47 1275
+4 46 1458 47 16
+4 46 16 15 45
+4 529 560 980 559
+4 529 530 560 980
+4 529 558 980 559
+4 529 558 528 980
+4 529 1129 528 980
+4 529 530 1129 980
+4 529 530 499 1129
+4 529 1129 528 498
+4 529 499 1129 498
+4 407 377 947 406
+4 407 947 406 437
+4 407 947 948 408
+4 407 377 947 948
+4 407 377 376 406
+4 407 438 947 408
+4 407 438 947 437
+4 407 406 437 436
+4 407 378 948 408
+4 407 377 378 408
+4 407 377 378 948
+4 684 715 685 1345
+4 684 715 1345 714
+4 684 1345 714 713
+4 684 683 1345 713
+4 684 683 1493 1345
+4 684 685 1226 655
+4 684 1557 1493 1345
+4 684 1557 685 1345
+4 684 685 1226 1525
+4 684 683 1226 1525
+4 684 1557 1493 1525
+4 684 1557 685 1525
+4 684 1493 1525 1522
+4 684 683 1525 1522
+4 684 683 1493 1522
+4 230 229 1610 1668
+4 230 229 1010 1668
+4 230 229 1010 199
+4 533 534 563 1101
+4 533 534 1101 980
+4 533 1101 980 1431
+4 533 563 1101 1431
+4 533 532 980 1431
+4 533 532 563 1431
+4 533 1129 980 1133
+4 533 532 1129 1133
+4 533 532 1129 980
+4 533 980 1133 1466
+4 533 534 1133 1466
+4 533 534 980 1466
+4 533 534 503 1133
+4 533 503 1133 502
+4 533 532 1133 502
+4 533 534 503 504
+4 711 741 710 1549
+4 711 712 1339 1549
+4 711 710 1339 1549
+4 711 712 1164 1549
+4 711 741 1164 1549
+4 711 741 712 1164
+4 953 1583 1310 1076
+4 953 1763 1310 1076
+4 953 1763 1163 1076
+4 953 1163 1496 1076
+4 953 1583 1496 1076
+4 953 1763 1310 1160
+4 953 1763 1163 1160
+4 953 1583 1580 1496
+4 953 1583 917 1310
+4 953 1583 917 1580
+4 953 1219 1310 1160
+4 953 1219 1163 1160
+4 953 1163 1797 1496
+4 953 1580 1797 1496
+4 953 917 1219 1310
+4 953 1219 1580 1163
+4 953 917 1219 1580
+4 953 1704 1163 1797
+4 953 1580 1704 1797
+4 953 1580 1704 1163
+4 918 1218 1157 1609
+4 918 1218 1011 1609
+4 918 1011 1609 1278
+4 918 1609 1278 1516
+4 918 1609 1516 915
+4 918 1157 1609 915
+4 918 1157 1184 915
+4 918 1218 1157 1184
+4 918 1011 469 1278
+4 918 468 469 1278
+4 918 468 467 1278
+4 918 467 1516 915
+4 918 467 1278 1516
+4 918 467 466 915
+4 918 466 1184 915
+4 918 468 467 437
+4 918 470 1011 469
+4 918 468 469 438
+4 918 467 437 466
+4 918 436 466 1184
+4 918 468 438 437
+4 918 470 469 439
+4 918 1218 1011 471
+4 918 470 1011 471
+4 918 469 439 438
+4 918 437 436 466
+4 918 437 436 1184
+4 918 1218 437 1184
+4 918 979 438 437
+4 918 470 439 440
+4 918 470 471 440
+4 918 439 979 438
+4 918 1098 979 437
+4 918 1218 1098 437
+4 918 1218 1098 979
+4 918 439 979 440
+4 918 1218 979 440
+4 918 471 441 440
+4 918 1218 441 440
+4 918 1218 471 441
+4 477 447 478 1796
+4 477 447 476 1796
+4 477 478 1407 507
+4 477 478 1796 1407
+4 477 1614 1407 507
+4 477 476 1614 507
+4 477 1614 1796 1407
+4 477 476 1614 1796
+4 599 598 569 1647
+4 599 600 570 1502
+4 599 629 600 1502
+4 599 1647 570 1502
+4 599 598 1647 1502
+4 599 629 1076 1502
+4 599 598 1076 1502
+4 599 1647 570 540
+4 599 569 1647 540
+4 599 628 629 1076
+4 599 598 628 1076
+4 1223 1166 1729 1104
+4 1223 1435 1166 1104
+4 1223 950 1729 1104
+4 1223 1166 1729 1014
+4 1223 1435 1166 1014
+4 1223 950 1077 1104
+4 1223 1435 1077 1104
+4 1223 1435 950 1077
+4 1223 1218 1729 1014
+4 1223 1218 950 1014
+4 1223 1218 950 1729
+4 1223 950 1014 1645
+4 1223 1435 1014 1645
+4 1223 1435 950 1645
+4 952 143 144 1313
+4 952 1551 1313 1460
+4 952 1731 1551 1460
+4 952 173 143 172
+4 952 143 1733 142
+4 952 143 1733 1313
+4 952 143 172 142
+4 952 1733 1313 1460
+4 952 141 1733 1460
+4 952 141 1733 142
+4 952 141 172 142
+4 952 171 141 1460
+4 952 171 141 172
+4 1706 959 1616 177
+4 1706 148 177 147
+4 1706 988 959 1616
+4 1706 178 959 177
+4 1706 148 178 177
+4 1706 146 1045 147
+4 1706 148 1045 147
+4 1706 148 1799 1045
+4 1706 148 1799 149
+4 1706 148 178 149
+4 1706 1619 959 1799
+4 1706 988 1619 959
+4 1706 988 1619 1736
+4 1706 1799 149 120
+4 1706 959 149 120
+4 1706 959 179 149
+4 1706 178 179 149
+4 1706 178 959 179
+4 1706 1799 120 121
+4 1706 959 120 121
+4 1706 959 1799 121
+4 1706 1527 1619 1736
+4 235 1405 265 1107
+4 235 234 1405 265
+4 235 1644 1405 1107
+4 235 1644 234 1405
+4 235 236 1523 1107
+4 235 1644 1523 1107
+4 235 1644 234 1523
+4 235 234 205 1523
+4 235 236 205 1523
+4 321 1370 290 291
+4 321 1370 290 320
+4 321 1370 292 291
+4 321 1370 322 292
+4 321 1370 320 1581
+4 321 1370 322 1581
+4 321 351 320 1581
+4 321 351 322 1581
+4 321 351 350 320
+4 318 1277 317 1127
+4 318 1370 288 1127
+4 318 1370 1277 1127
+4 318 1277 317 1308
+4 318 1370 1277 1308
+4 318 287 288 1127
+4 318 317 287 1127
+4 318 319 289 288
+4 318 1370 289 288
+4 318 1370 319 289
+4 318 1370 1308 319
+4 318 1308 319 349
+4 352 383 1702 353
+4 352 382 383 1702
+4 352 1702 1581 353
+4 352 351 1702 1581
+4 352 381 382 1702
+4 352 381 351 1702
+4 352 322 1581 353
+4 352 351 322 1581
+4 264 1405 265 1165
+4 264 234 1405 265
+4 264 265 1462 1165
+4 264 263 1462 1165
+4 264 263 1405 1165
+4 264 263 234 1405
+4 264 265 1462 1012
+4 264 263 1462 1012
+4 264 265 1287 1012
+4 264 294 1287 1012
+4 264 294 1103 1012
+4 264 263 1103 1012
+4 264 295 265 1287
+4 264 294 295 1287
+4 264 294 293 1103
+4 264 263 293 1103
+4 262 263 292 1012
+4 262 291 261 1012
+4 262 292 291 1012
+4 262 1610 261 1012
+4 262 1610 1462 1012
+4 262 263 1462 1012
+4 262 263 1610 1462
+4 386 387 1074 417
+4 386 416 1074 417
+4 386 385 416 1074
+4 386 387 1074 1169
+4 386 1074 1169 1586
+4 386 385 1074 1586
+4 386 1468 1169 1586
+4 386 1468 387 1169
+4 386 1468 1046 1586
+4 386 385 1046 1586
+4 386 1468 1046 356
+4 386 1468 357 356
+4 386 1468 387 357
+4 386 355 1046 356
+4 386 385 355 1046
+4 444 1465 443 1014
+4 444 474 443 1014
+4 444 1465 443 414
+4 444 474 1014 1796
+4 444 474 475 1796
+4 444 413 443 414
+4 348 378 948 347
+4 348 318 1308 349
+4 348 1581 349 948
+4 348 379 378 948
+4 348 379 349 948
+4 348 1308 1581 347
+4 348 1308 1581 349
+4 348 317 1308 347
+4 348 318 317 1308
+4 348 1068 948 347
+4 348 1581 1068 347
+4 348 1581 1068 948
+4 348 377 378 347
+4 50 20 1458 49
+4 50 1458 1639 51
+4 50 1458 49 1639
+4 50 1458 51 21
+4 50 20 1458 21
+4 50 1639 80 51
+4 50 49 1639 80
+4 50 20 49 19
+4 110 1733 111 1071
+4 110 140 1733 1071
+4 110 111 1009 1071
+4 110 109 1009 1071
+4 110 140 1100 1071
+4 110 109 1100 1071
+4 110 109 140 1100
+4 110 141 1733 111
+4 110 140 141 111
+4 110 140 141 1733
+4 110 81 111 1009
+4 110 81 80 1009
+4 110 80 79 1009
+4 110 109 79 1009
+4 328 327 1436 358
+4 328 1436 359 329
+4 328 1436 358 359
+4 328 1016 327 1436
+4 328 1436 1018 329
+4 328 1016 1018 329
+4 328 1016 1436 1018
+4 328 1016 329 1739
+4 328 1016 327 1739
+4 328 298 329 1739
+4 328 1317 298 1739
+4 328 1317 327 1739
+4 328 1317 327 298
+4 505 475 1614 504
+4 505 475 506 1614
+4 505 1614 1133 504
+4 505 506 1614 1133
+4 505 1133 504 535
+4 505 534 504 535
+4 505 1133 1466 535
+4 505 506 1466 535
+4 505 506 1133 1466
+4 231 1550 1610 232
+4 231 1550 1610 1668
+4 231 230 1610 1668
+4 231 1550 1010 232
+4 231 1550 1010 1668
+4 231 230 1010 1668
+4 231 230 201 1010
+4 231 1010 232 1523
+4 231 201 232 1523
+4 231 201 1010 1523
+4 200 230 1010 199
+4 200 230 201 1010
+4 200 201 1010 1523
+4 200 1010 1523 1727
+4 200 1010 199 1727
+4 200 201 1523 1727
+4 200 199 1727 1459
+4 200 201 1727 1459
+4 200 169 170 1459
+4 200 169 199 1459
+4 200 171 170 1459
+4 200 201 171 1459
+4 654 684 1226 655
+4 654 1226 655 1646
+4 654 653 1226 1646
+4 654 683 653 1226
+4 654 684 683 1226
+4 654 1404 653 1461
+4 654 624 1737 1461
+4 654 653 623 1461
+4 654 624 623 1461
+4 654 1404 655 1646
+4 654 1404 653 1646
+4 654 1404 1737 1461
+4 654 1404 1737 655
+4 654 625 1737 655
+4 654 625 624 1737
+4 830 859 1491 829
+4 830 859 1491 860
+4 830 1491 829 800
+4 830 861 1491 860
+4 830 831 861 1491
+4 830 1491 801 800
+4 830 831 801 800
+4 830 831 1491 801
+4 473 1011 503 472
+4 473 474 1011 503
+4 473 1011 472 1343
+4 473 443 1014 472
+4 473 474 443 1014
+4 473 474 1796 1343
+4 473 1011 1614 1343
+4 473 474 1614 1343
+4 473 474 1011 1614
+4 473 474 1014 1796
+4 473 1014 1796 1343
+4 473 1014 472 1343
+4 174 204 173 1616
+4 174 175 204 1616
+4 174 1706 145 144
+4 174 1706 175 145
+4 1795 145 1045 1313
+4 1795 1799 1045 1313
+4 1795 1706 1799 1045
+4 1795 145 144 1313
+4 1795 1706 145 144
+4 1795 145 146 1045
+4 1795 1706 146 1045
+4 1795 1706 145 146
+4 1795 1706 1619 1799
+4 1795 952 144 1313
+4 1795 1706 952 144
+4 1795 1346 1799 1313
+4 1795 1346 1619 1799
+4 1795 952 1551 1313
+4 1795 1641 1346 1313
+4 1795 1641 1346 1619
+4 1795 1641 1551 1313
+4 1795 1641 1527 1619
+4 1795 1706 1527 1619
+4 1795 1641 1551 1220
+4 1795 1641 1527 1220
+4 1795 1527 1736 1220
+4 1795 1706 1527 1736
+4 176 1706 177 147
+4 176 1706 146 147
+4 176 1706 1616 177
+4 176 1706 175 1616
+4 176 1706 145 146
+4 176 1706 175 145
+4 176 206 1616 177
+4 176 175 206 1616
+4 445 1465 416 415
+4 445 1465 416 446
+4 445 1465 414 415
+4 445 444 1465 414
+4 445 1465 1014 446
+4 445 444 1465 1014
+4 445 1014 446 1796
+4 445 444 1014 1796
+4 445 475 446 1796
+4 445 444 475 1796
+4 107 138 108 137
+4 107 108 137 1100
+4 107 106 137 1100
+4 107 106 137 136
+4 107 106 1100 1035
+4 107 1100 1071 1035
+4 107 108 1100 1071
+4 107 106 1094 1035
+4 107 108 77 1009
+4 107 1071 1094 1035
+4 107 106 1009 1094
+4 107 76 77 1009
+4 107 106 76 1009
+4 107 106 76 77
+4 107 1009 1071 1094
+4 107 108 1009 1071
+4 107 108 77 78
+4 1463 1706 988 1616
+4 1463 174 173 1616
+4 1463 1706 175 1616
+4 1463 174 175 1616
+4 1463 174 1706 175
+4 1463 1706 952 144
+4 1463 174 1706 144
+4 1463 173 1616 172
+4 1463 952 173 172
+4 1463 952 173 143
+4 1463 174 173 143
+4 1463 952 143 144
+4 1463 174 143 144
+4 1463 1795 1706 952
+4 1463 1616 172 1459
+4 1463 1731 1220 1459
+4 1463 988 1228 1616
+4 1463 1706 988 1736
+4 1463 952 1731 1551
+4 1463 1795 952 1551
+4 1463 1228 1220 1459
+4 1463 1228 1616 1459
+4 1463 1228 1736 1220
+4 1463 988 1228 1736
+4 1463 171 172 1459
+4 1463 952 171 172
+4 1463 1731 1551 1220
+4 1463 1795 1551 1220
+4 1463 1795 1736 1220
+4 1463 1795 1706 1736
+4 1463 1731 1460 1459
+4 1463 171 1460 1459
+4 1463 952 1731 1460
+4 1463 952 171 1460
+4 325 1317 296 295
+4 325 1317 326 296
+4 325 1317 294 295
+4 325 324 1317 294
+4 325 1317 326 1016
+4 325 324 1317 1016
+4 325 326 1016 1436
+4 325 324 1016 1436
+4 325 326 355 1436
+4 325 324 355 1436
+4 707 706 1339 1248
+4 707 706 737 1518
+4 707 1339 1248 1549
+4 707 708 1339 1549
+4 707 706 1518 1248
+4 707 738 708 1518
+4 707 738 737 1518
+4 707 738 737 708
+4 707 1518 1248 1549
+4 707 708 1518 1549
+4 214 244 1115 245
+4 214 1115 215 245
+4 214 244 215 245
+4 1154 674 675 704
+4 1154 705 675 704
+4 661 1200 660 690
+4 661 691 660 690
+4 661 691 1200 690
+4 662 661 691 1200
+4 662 661 691 692
+4 662 691 1200 692
+4 673 1154 674 704
+4 673 1154 703 704
+4 673 674 703 704
+4 243 214 244 1115
+4 243 214 213 244
+4 243 214 213 1115
+4 224 255 225 254
+4 224 223 254 253
+4 224 254 253 1033
+4 224 223 253 1033
+4 672 673 702 703
+4 672 1422 702 703
+4 672 1422 673 703
+4 222 223 253 1033
+4 222 252 253 1033
+4 212 243 930 213
+4 212 243 930 242
+4 693 662 692 663
+4 1745 693 692 663
+4 1745 662 692 663
+4 219 249 1238 250
+4 219 220 1238 250
+4 211 930 240 210
+4 211 241 930 240
+4 211 212 930 242
+4 211 241 930 242
+4 694 1745 693 663
+4 694 1745 664 663
+4 694 1745 665 664
+4 694 695 1745 665
+4 221 222 252 1033
+4 221 222 252 251
+4 221 252 251 1033
+4 221 220 251 250
+4 221 251 1720 250
+4 221 220 1720 250
+4 671 672 1422 702
+4 671 701 1422 702
+4 248 219 249 1238
+4 248 219 1238 218
+4 248 1238 218 217
+4 248 247 1238 217
+4 700 669 1299 699
+4 700 669 1299 670
+4 700 669 670 699
+4 700 671 701 1422
+4 700 671 670 1422
+4 698 669 1299 699
+4 698 668 669 1299
+4 698 667 1299 697
+4 698 668 667 697
+4 698 668 667 1299
+4 1666 255 225 254
+4 1666 224 225 254
+4 239 930 240 210
+4 239 269 930 240
+4 239 269 240 210
+4 238 239 269 930
+4 238 268 239 269
+4 238 268 269 930
+4 719 1200 660 690
+4 719 689 1200 660
+4 237 238 267 268
+4 237 1107 267 268
+4 237 238 1107 268
+4 226 1666 255 225
+4 226 256 1666 255
+4 226 256 255 225
+4 226 256 257 1666
+4 226 227 257 1666
+4 226 227 256 257
+4 718 719 689 1200
+4 718 688 719 689
+4 718 688 689 1200
+4 678 708 679 709
+4 678 679 1339 709
+4 678 708 1339 709
+4 706 1154 705 675
+4 706 676 1154 675
+4 715 685 1345 686
+4 715 1345 716 686
+4 715 685 716 686
+4 687 1345 716 686
+4 687 1345 716 717
+4 687 716 686 717
+4 687 718 688 1200
+4 687 718 688 717
+4 687 718 717 1200
+4 710 679 1339 709
+4 710 680 679 1339
+4 710 680 679 709
+4 258 227 257 1666
+4 258 228 227 257
+4 258 228 227 1666
+4 683 712 1044 713
+4 683 712 1044 682
+4 229 258 1668 259
+4 229 258 228 1668
+4 236 237 1107 267
+4 236 1107 267 266
+4 230 229 260 259
+4 230 260 1610 259
+4 230 229 1610 259
+4 711 1339 681 682
+4 711 712 1339 682
+4 711 710 680 1339
+4 711 710 680 681
+4 711 680 1339 681
+4 235 236 1107 266
+4 235 236 265 266
+4 235 265 1107 266
+4 262 263 233 232
+4 262 233 1610 232
+4 262 263 233 1610
+4 231 262 1610 232
+4 231 262 1610 261
+4 231 262 232 261
+4 231 230 260 1610
+4 231 260 1610 261
+4 707 678 708 1339
+4 707 678 1339 677
+4 707 1339 676 677
+4 707 706 1339 676
+
+CELL_TYPES 9216
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+10 
+
+POINT_DATA 1800
+SCALARS scalars float 1
+LOOKUP_TABLE default
+    12.96000004 
+    12.59523010 
+    11.93826008 
+    11.03361034 
+     9.94406986 
+     8.74396992 
+     7.51132011 
+     6.31995010 
+     5.23286009 
+     4.29755020 
+     3.54397011 
+     2.98511004 
+     2.61982989 
+     2.43739009 
+     2.42248988 
+     2.55999994 
+     2.83832002 
+     3.25086999 
+     3.79540992 
+     4.47139978 
+     5.27602005 
+     6.19965982 
+     7.22189999 
+     8.30900002 
+     9.41343975 
+    10.47601986 
+    11.43035984 
+    12.20917988 
+    12.75174046 
+    13.01105022 
+    11.83955002 
+    11.48834038 
+    10.87098026 
+    10.02888966 
+     9.02011013 
+     7.91314983 
+     6.77970982 
+     5.68758011 
+     4.69446993 
+     3.84378004 
+     3.16270995 
+     2.66279006 
+     2.34252000 
+     2.19149995 
+     2.19508004 
+     2.33868003 
+     2.61090994 
+     3.00498009 
+     3.51809001 
+     4.14907980 
+     4.89476013 
+     5.74589014 
+     6.68350983 
+     7.67663002 
+     8.68183041 
+     9.64519978 
+    10.50640011 
+    11.20446014 
+    11.68445969 
+    11.90415955 
+     8.67193031 
+     8.35906029 
+     7.85368013 
+     7.18844986 
+     6.40799999 
+     5.56432009 
+     4.71138000 
+     3.89982009 
+     3.17241001 
+     2.56094003 
+     2.08484006 
+     1.75154996 
+     1.55852997 
+     1.49635994 
+     1.55217004 
+     1.71297002 
+     1.96800005 
+     2.30982995 
+     2.73410010 
+     3.23783994 
+     3.81689000 
+     4.46305990 
+     5.16144991 
+     5.88886023 
+     6.61349010 
+     7.29637003 
+     7.89428997 
+     8.36402035 
+     8.66716003 
+     8.77488041 
+     4.00485992 
+     3.74848008 
+     3.40808010 
+     3.00342011 
+     2.55939007 
+     2.10363007 
+     1.66395998 
+     1.26576996 
+     0.92984003 
+     0.67084998 
+     0.49674001 
+     0.40895000 
+     0.40342000 
+     0.47215000 
+     0.60492998 
+     0.79108000 
+     1.02075005 
+     1.28561997 
+     1.57898998 
+     1.89523995 
+     2.22879004 
+     2.57295990 
+     2.91889000 
+     3.25482011 
+     3.56608009 
+     3.83568001 
+     4.04568005 
+     4.17898989 
+     4.22154999 
+     4.16429996 
+    -1.35468996 
+    -1.54620004 
+    -1.69713998 
+    -1.80254996 
+    -1.86026001 
+    -1.87054002 
+    -1.83562005 
+    -1.75908995 
+    -1.64546001 
+    -1.49968004 
+    -1.32700002 
+    -1.13285005 
+    -0.92307001 
+    -0.70402998 
+    -0.48286000 
+    -0.26758999 
+    -0.06704000 
+     0.10944000 
+     0.25250000 
+     0.35343999 
+     0.40505001 
+     0.40243000 
+     0.34358001 
+     0.22995000 
+     0.06650000 
+    -0.13849001 
+    -0.37397000 
+    -0.62698001 
+    -0.88366997 
+    -1.13038003 
+    -6.48000002 
+    -6.60947990 
+    -6.57923985 
+    -6.39847994 
+    -6.08675003 
+    -5.67103004 
+    -5.18225002 
+    -4.65176010 
+    -4.10821009 
+    -3.57536006 
+    -3.07102990 
+    -2.60727000 
+    -2.19160008 
+    -1.82879996 
+    -1.52311003 
+    -1.27999997 
+    -1.10729003 
+    -1.01532996 
+    -1.01602995 
+    -1.12098002 
+    -1.33896995 
+    -1.67323995 
+    -2.11916995 
+    -2.66271996 
+    -3.28012991 
+    -3.93897009 
+    -4.60046005 
+    -5.22291994 
+    -5.76576996 
+    -6.19365978 
+   -10.48486042 
+   -10.56587029 
+   -10.39404964 
+    -9.98968983 
+    -9.38928032 
+    -8.64068031 
+    -7.79726982 
+    -6.91205978 
+    -6.03257990 
+    -5.19726992 
+    -4.43379021 
+    -3.75937009 
+    -3.18280005 
+    -2.70767999 
+    -2.33594990 
+    -2.07107997 
+    -1.92013001 
+    -1.89420998 
+    -2.00723004 
+    -2.27308011 
+    -2.70174003 
+    -3.29515004 
+    -4.04352999 
+    -4.92300987 
+    -5.89515018 
+    -6.90862989 
+    -7.90298986 
+    -8.81412029 
+    -9.58057976 
+   -10.15005016 
+   -12.67679024 
+   -12.73126984 
+   -12.48196983 
+   -11.95522976 
+   -11.19682026 
+   -10.26601982 
+    -9.22850990 
+    -8.14916039 
+    -7.08582020 
+    -6.08495998 
+    -5.17965984 
+    -4.38992977 
+    -3.72531009 
+    -3.18870997 
+    -2.78083992 
+    -2.50406003 
+    -2.36501002 
+    -2.37524009 
+    -2.54974008 
+    -2.90364003 
+    -3.44760990 
+    -4.18284988 
+    -5.09676981 
+    -6.16011000 
+    -7.32639980 
+    -8.53396988 
+    -9.71053028 
+   -10.77966022 
+   -11.66849995 
+   -12.31544971 
+   -12.67679024 
+   -12.73126984 
+   -12.48196983 
+   -11.95522976 
+   -11.19682026 
+   -10.26601982 
+    -9.22850990 
+    -8.14916039 
+    -7.08582020 
+    -6.08495998 
+    -5.17965984 
+    -4.38992977 
+    -3.72531009 
+    -3.18870997 
+    -2.78083992 
+    -2.50406003 
+    -2.36501002 
+    -2.37524009 
+    -2.54974008 
+    -2.90364003 
+    -3.44760990 
+    -4.18284988 
+    -5.09676981 
+    -6.16011000 
+    -7.32639980 
+    -8.53396988 
+    -9.71053028 
+   -10.77966022 
+   -11.66849995 
+   -12.31544971 
+   -10.48486042 
+   -10.56587029 
+   -10.39404964 
+    -9.98968983 
+    -9.38928032 
+    -8.64068031 
+    -7.79726982 
+    -6.91205978 
+    -6.03257990 
+    -5.19726992 
+    -4.43379021 
+    -3.75937009 
+    -3.18280005 
+    -2.70767999 
+    -2.33594990 
+    -2.07107997 
+    -1.92013001 
+    -1.89420998 
+    -2.00723004 
+    -2.27308011 
+    -2.70174003 
+    -3.29515004 
+    -4.04352999 
+    -4.92300987 
+    -5.89515018 
+    -6.90862989 
+    -7.90298986 
+    -8.81412029 
+    -9.58057976 
+   -10.15003967 
+    -6.48000002 
+    -6.60947990 
+    -6.57923985 
+    -6.39847994 
+    -6.08675003 
+    -5.67102003 
+    -5.18224001 
+    -4.65176010 
+    -4.10821009 
+    -3.57536006 
+    -3.07101989 
+    -2.60727000 
+    -2.19159007 
+    -1.82879996 
+    -1.52311003 
+    -1.27999997 
+    -1.10729003 
+    -1.01532996 
+    -1.01602006 
+    -1.12098002 
+    -1.33896995 
+    -1.67323995 
+    -2.11916995 
+    -2.66271996 
+    -3.28012991 
+    -3.93897009 
+    -4.60046005 
+    -5.22290993 
+    -5.76575994 
+    -6.19365978 
+    -1.35468996 
+    -1.54620004 
+    -1.69713998 
+    -1.80254996 
+    -1.86026001 
+    -1.87054002 
+    -1.83561003 
+    -1.75908995 
+    -1.64546001 
+    -1.49968004 
+    -1.32700002 
+    -1.13285005 
+    -0.92307001 
+    -0.70402998 
+    -0.48286000 
+    -0.26758999 
+    -0.06704000 
+     0.10944000 
+     0.25250000 
+     0.35343999 
+     0.40505999 
+     0.40243000 
+     0.34358001 
+     0.22995000 
+     0.06650000 
+    -0.13849001 
+    -0.37397000 
+    -0.62698001 
+    -0.88366997 
+    -1.13038003 
+     4.00485992 
+     3.74848008 
+     3.40808010 
+     3.00342989 
+     2.55939007 
+     2.10363007 
+     1.66395998 
+     1.26577997 
+     0.92984003 
+     0.67084998 
+     0.49674001 
+     0.40895000 
+     0.40342000 
+     0.47215000 
+     0.60492998 
+     0.79108000 
+     1.02075005 
+     1.28561997 
+     1.57898998 
+     1.89523995 
+     2.22879004 
+     2.57295990 
+     2.91889000 
+     3.25482011 
+     3.56608009 
+     3.83568001 
+     4.04568005 
+     4.17899990 
+     4.22154999 
+     4.16429996 
+     8.67193031 
+     8.35906029 
+     7.85368013 
+     7.18844986 
+     6.40799999 
+     5.56432009 
+     4.71138000 
+     3.89982009 
+     3.17241001 
+     2.56094003 
+     2.08484006 
+     1.75154996 
+     1.55852997 
+     1.49635994 
+     1.55217004 
+     1.71297002 
+     1.96800005 
+     2.30982995 
+     2.73410010 
+     3.23783994 
+     3.81689000 
+     4.46305990 
+     5.16144991 
+     5.88886023 
+     6.61349010 
+     7.29637003 
+     7.89428997 
+     8.36402035 
+     8.66716003 
+     8.77488995 
+    11.83955002 
+    11.48834038 
+    10.87098026 
+    10.02888966 
+     9.02011013 
+     7.91314983 
+     6.77970982 
+     5.68758011 
+     4.69446993 
+     3.84378004 
+     3.16270995 
+     2.66279006 
+     2.34252000 
+     2.19149995 
+     2.19508004 
+     2.33868003 
+     2.61090994 
+     3.00498009 
+     3.51809001 
+     4.14907980 
+     4.89476013 
+     5.74589014 
+     6.68351984 
+     7.67663002 
+     8.68183041 
+     9.64519978 
+    10.50640011 
+    11.20446014 
+    11.68445969 
+    11.90415955 
+    12.96000004 
+    12.59523010 
+    11.93826008 
+    11.03361034 
+     9.94406986 
+     8.74396992 
+     7.51132011 
+     6.31995010 
+     5.23286009 
+     4.29755020 
+     3.54397011 
+     2.98511004 
+     2.61982989 
+     2.43739009 
+     2.42248988 
+     2.55999994 
+     2.83832002 
+     3.25086999 
+     3.79540992 
+     4.47139978 
+     5.27602005 
+     6.19965982 
+     7.22189999 
+     8.30900002 
+     9.41343975 
+    10.47601986 
+    11.43035984 
+    12.20917988 
+    12.75174046 
+    13.01105022 
+    11.83955002 
+    11.48834038 
+    10.87098026 
+    10.02888966 
+     9.02011013 
+     7.91313982 
+     6.77970982 
+     5.68758011 
+     4.69446993 
+     3.84378004 
+     3.16270995 
+     2.66279006 
+     2.34252000 
+     2.19149995 
+     2.19508004 
+     2.33868003 
+     2.61090994 
+     3.00498009 
+     3.51809001 
+     4.14907980 
+     4.89476013 
+     5.74589014 
+     6.68350983 
+     7.67663002 
+     8.68181992 
+     9.64519978 
+    10.50640011 
+    11.20446014 
+    11.68445015 
+    11.90415955 
+     8.67193031 
+     8.35906029 
+     7.85368013 
+     7.18843985 
+     6.40799999 
+     5.56432009 
+     4.71138000 
+     3.89982009 
+     3.17241001 
+     2.56094003 
+     2.08484006 
+     1.75153995 
+     1.55852997 
+     1.49635994 
+     1.55217004 
+     1.71297002 
+     1.96800005 
+     2.30982995 
+     2.73410010 
+     3.23782992 
+     3.81689000 
+     4.46305990 
+     5.16144991 
+     5.88886023 
+     6.61349010 
+     7.29637003 
+     7.89428997 
+     8.36402035 
+     8.66714954 
+     8.77488041 
+     4.00485992 
+     3.74847007 
+     3.40808010 
+     3.00342011 
+     2.55938005 
+     2.10363007 
+     1.66395998 
+     1.26576996 
+     0.92984003 
+     0.67084998 
+     0.49674001 
+     0.40895000 
+     0.40342000 
+     0.47215000 
+     0.60492998 
+     0.79108000 
+     1.02075005 
+     1.28561997 
+     1.57898998 
+     1.89523995 
+     2.22879004 
+     2.57295990 
+     2.91889000 
+     3.25482011 
+     3.56607008 
+     3.83568001 
+     4.04567003 
+     4.17898989 
+     4.22154999 
+     4.16429996 
+    -1.35468996 
+    -1.54621005 
+    -1.69713998 
+    -1.80255997 
+    -1.86027002 
+    -1.87055004 
+    -1.83562005 
+    -1.75908995 
+    -1.64546001 
+    -1.49969006 
+    -1.32700002 
+    -1.13285005 
+    -0.92307001 
+    -0.70402998 
+    -0.48286000 
+    -0.26758999 
+    -0.06704000 
+     0.10944000 
+     0.25250000 
+     0.35343000 
+     0.40505001 
+     0.40243000 
+     0.34358001 
+     0.22995000 
+     0.06650000 
+    -0.13849001 
+    -0.37397000 
+    -0.62698001 
+    -0.88366997 
+    -1.13038003 
+    -6.48000002 
+    -6.60947990 
+    -6.57923985 
+    -6.39848995 
+    -6.08675003 
+    -5.67103004 
+    -5.18225002 
+    -4.65176010 
+    -4.10821009 
+    -3.57536006 
+    -3.07102990 
+    -2.60727000 
+    -2.19160008 
+    -1.82879996 
+    -1.52311003 
+    -1.27999997 
+    -1.10729003 
+    -1.01532996 
+    -1.01602995 
+    -1.12098002 
+    -1.33897996 
+    -1.67324996 
+    -2.11916995 
+    -2.66271996 
+    -3.28013992 
+    -3.93898010 
+    -4.60046005 
+    -5.22291994 
+    -5.76576996 
+    -6.19365978 
+   -10.48486042 
+   -10.56587029 
+   -10.39404964 
+    -9.98968983 
+    -9.38928032 
+    -8.64068031 
+    -7.79725981 
+    -6.91204977 
+    -6.03257990 
+    -5.19725990 
+    -4.43379021 
+    -3.75937009 
+    -3.18280005 
+    -2.70767999 
+    -2.33594990 
+    -2.07107997 
+    -1.92013001 
+    -1.89420998 
+    -2.00723004 
+    -2.27308011 
+    -2.70174003 
+    -3.29515004 
+    -4.04352999 
+    -4.92300987 
+    -5.89515018 
+    -6.90862989 
+    -7.90298986 
+    -8.81412029 
+    -9.58057976 
+   -10.15003967 
+   -12.67679024 
+   -12.73126984 
+   -12.48196983 
+   -11.95522976 
+   -11.19682026 
+   -10.26601982 
+    -9.22850990 
+    -8.14916039 
+    -7.08582020 
+    -6.08495998 
+    -5.17965984 
+    -4.38992977 
+    -3.72531009 
+    -3.18870997 
+    -2.78083992 
+    -2.50406003 
+    -2.36501002 
+    -2.37524009 
+    -2.54974008 
+    -2.90364003 
+    -3.44760990 
+    -4.18284988 
+    -5.09676981 
+    -6.16011000 
+    -7.32639980 
+    -8.53396988 
+    -9.71053028 
+   -10.77966022 
+   -11.66849995 
+   -12.31544971 
+   -12.67679024 
+   -12.73126984 
+   -12.48196983 
+   -11.95522022 
+   -11.19682026 
+   -10.26601982 
+    -9.22850990 
+    -8.14916039 
+    -7.08581018 
+    -6.08495998 
+    -5.17965984 
+    -4.38992977 
+    -3.72531009 
+    -3.18870997 
+    -2.78083992 
+    -2.50406003 
+    -2.36501002 
+    -2.37524009 
+    -2.54974008 
+    -2.90364003 
+    -3.44760990 
+    -4.18284988 
+    -5.09676981 
+    -6.16011000 
+    -7.32639980 
+    -8.53396988 
+    -9.71053028 
+   -10.77966022 
+   -11.66849995 
+   -12.31544971 
+   -10.48486042 
+   -10.56587029 
+   -10.39404964 
+    -9.98968983 
+    -9.38928032 
+    -8.64068031 
+    -7.79725981 
+    -6.91204977 
+    -6.03256989 
+    -5.19725990 
+    -4.43379021 
+    -3.75937009 
+    -3.18280005 
+    -2.70767999 
+    -2.33594990 
+    -2.07107997 
+    -1.92013001 
+    -1.89420998 
+    -2.00723004 
+    -2.27308011 
+    -2.70174003 
+    -3.29515004 
+    -4.04352999 
+    -4.92300987 
+    -5.89515018 
+    -6.90862989 
+    -7.90298986 
+    -8.81412029 
+    -9.58057976 
+   -10.15003967 
+    -6.48000002 
+    -6.60947990 
+    -6.57923985 
+    -6.39847994 
+    -6.08675003 
+    -5.67103004 
+    -5.18225002 
+    -4.65176010 
+    -4.10821009 
+    -3.57536006 
+    -3.07102990 
+    -2.60727000 
+    -2.19160008 
+    -1.82879996 
+    -1.52311003 
+    -1.27999997 
+    -1.10729003 
+    -1.01532996 
+    -1.01602995 
+    -1.12098002 
+    -1.33897996 
+    -1.67324996 
+    -2.11916995 
+    -2.66271996 
+    -3.28012991 
+    -3.93898010 
+    -4.60046005 
+    -5.22291994 
+    -5.76576996 
+    -6.19365978 
+    -1.35467994 
+    -1.54620004 
+    -1.69713998 
+    -1.80254996 
+    -1.86026001 
+    -1.87054002 
+    -1.83561003 
+    -1.75908995 
+    -1.64546001 
+    -1.49968004 
+    -1.32699001 
+    -1.13285005 
+    -0.92307001 
+    -0.70402998 
+    -0.48286000 
+    -0.26758999 
+    -0.06704000 
+     0.10945000 
+     0.25250000 
+     0.35343999 
+     0.40505999 
+     0.40243000 
+     0.34358999 
+     0.22995000 
+     0.06650000 
+    -0.13849001 
+    -0.37397000 
+    -0.62698001 
+    -0.88366002 
+    -1.13038003 
+     4.00486994 
+     3.74849010 
+     3.40809011 
+     3.00342989 
+     2.55939007 
+     2.10364008 
+     1.66396999 
+     1.26577997 
+     0.92984998 
+     0.67084998 
+     0.49674001 
+     0.40895000 
+     0.40343001 
+     0.47215000 
+     0.60492998 
+     0.79109001 
+     1.02075005 
+     1.28561997 
+     1.57900000 
+     1.89523995 
+     2.22879004 
+     2.57296991 
+     2.91889000 
+     3.25482988 
+     3.56608009 
+     3.83569002 
+     4.04568005 
+     4.17899990 
+     4.22156000 
+     4.16430998 
+     8.67193985 
+     8.35906982 
+     7.85368013 
+     7.18844986 
+     6.40799999 
+     5.56432009 
+     4.71138000 
+     3.89982009 
+     3.17241001 
+     2.56095004 
+     2.08484006 
+     1.75154996 
+     1.55852997 
+     1.49635994 
+     1.55217004 
+     1.71297002 
+     1.96800005 
+     2.30982995 
+     2.73410010 
+     3.23783994 
+     3.81689000 
+     4.46305990 
+     5.16144991 
+     5.88886023 
+     6.61350012 
+     7.29637003 
+     7.89428997 
+     8.36402035 
+     8.66716003 
+     8.77488995 
+    11.83955002 
+    11.48834038 
+    10.87098026 
+    10.02888966 
+     9.02011013 
+     7.91313982 
+     6.77970982 
+     5.68758011 
+     4.69446993 
+     3.84378004 
+     3.16270995 
+     2.66279006 
+     2.34252000 
+     2.19149995 
+     2.19508004 
+     2.33868003 
+     2.61090994 
+     3.00498009 
+     3.51809001 
+     4.14907980 
+     4.89476013 
+     5.74589014 
+     6.68350983 
+     7.67663002 
+     8.68181992 
+     9.64519978 
+    10.50640011 
+    11.20446014 
+    11.68445015 
+    11.90415955 
+    -3.31470990 
+    -8.26356983 
+     3.17624998 
+    -4.28663015 
+    -7.49618006 
+     7.02533007 
+    -1.16315997 
+     5.32989979 
+    -1.23791003 
+    -1.58959997 
+     6.20796013 
+    -1.13066006 
+    -2.42166996 
+    -0.41341999 
+     6.19306993 
+     4.69168997 
+     0.96331000 
+    -0.76865000 
+     5.13873005 
+    -4.43365002 
+     5.80526018 
+     2.31398010 
+    -5.91374016 
+    -4.78973007 
+     5.27817011 
+     6.54617023 
+    -5.70777988 
+     1.53206003 
+     4.71565008 
+     5.97303009 
+    -9.41613007 
+     2.96169996 
+    -8.03555965 
+    -0.20144001 
+     7.62476015 
+     6.26393986 
+     4.89018011 
+     4.13060999 
+    -6.32817984 
+    -1.38063002 
+    -4.72152996 
+     3.55267000 
+    -3.40791988 
+    -4.81941986 
+    -1.63346004 
+     4.54036999 
+    -1.78746998 
+     3.62774992 
+     1.73576999 
+    -3.22984004 
+     6.41950989 
+     5.33599997 
+    -1.39424002 
+    -1.16561997 
+     0.60777003 
+    -6.31156015 
+     5.71499014 
+    -5.12070990 
+     5.99249983 
+    -4.83033991 
+     1.92103004 
+     8.73882961 
+     8.80537987 
+    -5.26964998 
+    -7.55354977 
+    -6.10561991 
+     3.27484012 
+    -2.71275997 
+    -0.43362999 
+    -3.26769996 
+     2.89580989 
+     4.45341015 
+    -3.82939005 
+    -4.38255978 
+    -1.84811997 
+    -0.89063001 
+     2.49142003 
+     6.38044977 
+     4.10483980 
+     5.09042978 
+     3.84282994 
+     5.34532022 
+     6.80619001 
+     1.33176994 
+     6.82660007 
+    -0.35264999 
+     8.79269028 
+     2.77537990 
+    -3.48071003 
+     4.22658014 
+    -1.64243996 
+     4.26615000 
+    -4.96211004 
+     7.59906006 
+    -7.04060984 
+     4.13159990 
+    -7.57104015 
+     5.91427994 
+    -3.72229004 
+    -0.52787000 
+     5.31200981 
+     1.43414998 
+    -3.03676009 
+    -2.48868990 
+     1.13696003 
+    -1.87293005 
+    -0.32444000 
+    -4.84003019 
+    -3.37913990 
+     3.63612008 
+    -5.33555984 
+     6.40993977 
+    -5.87520981 
+    -6.23437023 
+     7.06603003 
+     5.82497978 
+    -3.56660008 
+     4.60289001 
+    -2.92312002 
+    -3.66686010 
+    -4.78474998 
+     7.33221006 
+    -6.43583012 
+     0.26126000 
+     3.51736999 
+    -4.66898012 
+    -2.45953989 
+     1.06339002 
+    -6.63968992 
+    -6.64708996 
+     2.92142010 
+    -2.28340006 
+     6.01215982 
+    -4.97305012 
+    -4.54230022 
+     1.00435996 
+     3.10541010 
+    -2.97972012 
+    -5.76177979 
+    -3.40135002 
+     6.62690020 
+    -3.50117993 
+    -4.52066994 
+     6.54289007 
+    -6.87321997 
+     0.66907001 
+     1.19305003 
+     6.92905998 
+    -1.14551997 
+    -6.96154022 
+    -7.72026014 
+     3.77432990 
+     8.07845974 
+    -3.43773007 
+    -1.18109000 
+     6.73075008 
+     6.84852982 
+    -4.79681015 
+    -6.52568007 
+     1.49619997 
+    -2.92843008 
+    -4.03708982 
+     6.47059011 
+    -1.05543005 
+    -2.80837011 
+     2.14012003 
+    -2.14836001 
+     6.04862022 
+     1.50314999 
+     1.36688995 
+    -2.12624002 
+     1.64444995 
+    -0.81075001 
+    -3.48984003 
+     5.04768991 
+     3.65135002 
+    -3.07058001 
+     7.05271006 
+     0.96684003 
+     7.14041996 
+     5.93204021 
+    -4.22559977 
+    -7.60364008 
+    -8.08452988 
+     7.10247993 
+     1.88178003 
+     2.93800998 
+    -6.75622988 
+    -5.79750013 
+    -1.07774997 
+     4.85035992 
+     5.24092007 
+    -5.25249004 
+    -0.82384998 
+     1.78971004 
+    -4.10586977 
+    -4.72273016 
+     5.30278015 
+     4.72737980 
+    -4.32398987 
+     0.70003998 
+     3.74097991 
+     2.62889004 
+    -4.99438000 
+     6.68144989 
+     1.65059996 
+     0.81919003 
+    -8.19312954 
+     4.47390985 
+     4.15507984 
+     7.16595984 
+    -4.31394005 
+    -2.17733002 
+    -3.47399998 
+    -2.85231996 
+    -8.11221027 
+    -0.48783001 
+    -5.18841982 
+    -5.54160976 
+     0.86691999 
+    -5.69379997 
+    -5.08371019 
+    -4.11569023 
+    -5.78653002 
+     5.82101011 
+     5.15802002 
+     0.42103001 
+    -3.77976990 
+    -5.22461987 
+     4.50122976 
+    -3.63594007 
+    -5.01431990 
+    -1.75077999 
+     6.81978989 
+     0.90495998 
+     7.26802015 
+    -1.02968001 
+    -6.36639977 
+    -2.34008002 
+     6.08225012 
+    -5.99446011 
+    -6.77705002 
+     6.77172995 
+    -5.70407009 
+    -3.42248988 
+    -4.82489014 
+    -4.21508980 
+    -2.53958011 
+     0.74949002 
+    -2.73938990 
+    -3.52450991 
+     2.23411989 
+     1.09334004 
+    -0.53255999 
+    -4.64927006 
+    -4.46320009 
+     3.76451993 
+     5.61000013 
+     3.97392988 
+    -3.77097011 
+    -1.74538004 
+     4.65557003 
+     0.23568000 
+    -0.73587000 
+    -6.66065979 
+    -7.20935011 
+     6.63852978 
+    -7.06432009 
+    -0.07446000 
+     3.87821007 
+     2.95438004 
+     6.30499983 
+     3.72827005 
+    -6.59118986 
+    -4.09465981 
+     0.93374997 
+     6.71854019 
+    -4.93128014 
+    -1.27607000 
+    -1.71622002 
+    -6.41334009 
+     5.16910982 
+     2.85963011 
+     2.81998992 
+     4.18304014 
+     4.85961008 
+    -0.98629999 
+    -5.83667994 
+    -0.05496000 
+    -5.73821020 
+     4.45184994 
+     5.43639994 
+     2.33472991 
+    -3.16867995 
+    -6.39103985 
+     6.16227007 
+     1.35797000 
+    -5.08758020 
+    -7.92697001 
+     2.74331999 
+    -9.39626026 
+    -4.07879019 
+     5.76660013 
+     0.19901000 
+     6.98516989 
+    -3.23830009 
+    -6.67714024 
+    -0.86887002 
+    -0.22065000 
+    -1.96278000 
+    -3.88326001 
+     4.09039021 
+     4.29208994 
+     5.73031998 
+     4.48896980 
+     1.43176997 
+     0.79852998 
+    -3.16761994 
+     5.36279011 
+    -0.54914999 
+    -2.24857998 
+     0.75891000 
+     2.35378003 
+     6.65669012 
+     5.43183994 
+    -0.61765999 
+    -7.47289991 
+    -4.89659977 
+    -3.62335992 
+    -0.08370000 
+    -0.15447000 
+     5.33765984 
+    -3.09120011 
+     7.07868004 
+     3.32110000 
+     0.89424998 
+     1.43616998 
+     4.63483000 
+    -6.94992018 
+     4.36158991 
+     5.44160986 
+    -4.10873985 
+    -1.41154003 
+     4.91665983 
+    -4.29682016 
+    -4.79219007 
+     1.00218999 
+    -2.70513010 
+    -4.82616997 
+    -4.24382019 
+     2.41600990 
+    -6.37791014 
+    -4.83259010 
+     2.82520008 
+     2.08294010 
+    -6.86046982 
+     3.01157999 
+     1.89557004 
+     7.15233994 
+     6.90117979 
+     3.31087995 
+     3.85350990 
+    -6.39799023 
+     7.42663002 
+    -7.00267982 
+    -7.76276016 
+     6.00089979 
+     4.29653978 
+    -5.87984991 
+     1.94388998 
+    -4.06478024 
+     4.66944981 
+    -5.15402985 
+    -4.73516989 
+    -5.17773008 
+     4.64359999 
+    -1.42706001 
+    -3.14526010 
+     5.05636978 
+    -6.22634983 
+     3.92149997 
+     1.45255005 
+     6.45613003 
+     6.42246008 
+    -2.51046991 
+     5.79328012 
+     7.79978991 
+    -6.94280005 
+    -4.99690008 
+     6.39514017 
+    -5.95499992 
+     3.92012000 
+     3.54066992 
+    -7.34918022 
+     2.99759007 
+    -0.73127002 
+     6.68736982 
+    -6.36546993 
+     3.24556994 
+    -6.45904016 
+     1.68973005 
+     5.11069012 
+    -6.03213978 
+    -4.79840994 
+    -6.09707022 
+    -2.59051991 
+    -6.44570017 
+     4.93580008 
+    -1.99335003 
+     5.30931997 
+    -2.12340999 
+     2.07942009 
+     3.66550994 
+    -0.71073002 
+     1.40751004 
+     3.67721009 
+    -3.79756999 
+    -6.02102995 
+    -6.84449005 
+     7.26425982 
+     2.20105004 
+     5.92396021 
+    -5.91237020 
+     7.98579979 
+    -0.28815001 
+     3.49572992 
+    -6.91310978 
+     2.56627989 
+     4.73708010 
+     6.15480995 
+     4.03301001 
+     0.71539998 
+    -1.10595000 
+     5.04558992 
+    -3.35573006 
+     3.42120004 
+    -5.10685015 
+     0.58434999 
+    -4.34135008 
+    -4.88226986 
+    -1.45799005 
+    -5.34232998 
+     6.76682997 
+     7.20288992 
+    -3.75237989 
+    -7.28132010 
+    -1.17398000 
+    -6.37703991 
+    -3.09570003 
+    -5.71481991 
+    -4.94540977 
+     1.16917002 
+     7.12412024 
+    -6.03904009 
+    -3.74481010 
+    -7.19637012 
+    -7.50174999 
+    -1.60664999 
+     4.42301989 
+    -0.24175000 
+    -3.71842003 
+    -3.05767012 
+    -6.42346001 
+     2.13707995 
+    -4.94082022 
+    -5.96211004 
+     0.41598001 
+    -3.64980006 
+     4.62901020 
+    -1.80177999 
+    -2.91916990 
+     1.49776995 
+    -4.63836002 
+     2.20163012 
+     1.80065000 
+     2.17509007 
+     2.62733006 
+     0.84403998 
+     7.07313013 
+    -6.30010986 
+    -8.33246040 
+    -5.68275976 
+    -8.04603004 
+     7.00156021 
+    -1.45788002 
+    -6.07662010 
+     7.07001019 
+    -6.57208014 
+    -2.41200995 
+    -4.00179005 
+     4.72820997 
+     0.48525000 
+    -4.44246006 
+     4.59770012 
+     4.29374981 
+     1.08763003 
+     2.35037994 
+    -2.83808994 
+    -3.40365005 
+    -1.80998003 
+     5.39146996 
+    -5.63752985 
+     5.87810993 
+    -6.52998018 
+    -5.18193007 
+    -7.24098015 
+    -6.70400000 
+     7.68733978 
+    -2.64110994 
+     3.45925999 
+     0.48229000 
+     7.20658016 
+    -4.95318985 
+     5.99714994 
+    -5.75894022 
+     0.92180997 
+     4.08061981 
+     1.65575004 
+     0.85235000 
+    -2.94473004 
+    -4.55622005 
+     4.78175020 
+    -5.14904022 
+     5.67286015 
+     6.40137005 
+     1.31129003 
+     5.07991982 
+    -4.16314983 
+    -4.98325014 
+     3.76931000 
+     2.75650001 
+     2.15019011 
+     4.79231024 
+    -5.11331987 
+     5.17639017 
+     7.08444023 
+    -1.42667997 
+     3.53379011 
+     3.05537009 
+    -6.82842016 
+     4.36868000 
+    -6.03740978 
+     6.72891998 
+    -5.34994984 
+    -0.32582000 
+    -6.82239008 
+    -6.77418995 
+    -0.39706001 
+     4.84958982 
+     5.10665989 
+    -1.18233001 
+     4.73833990 
+    -0.97131997 
+     1.89786005 
+    -4.87067986 
+    -3.46671009 
+     0.48425999 
+    -3.64355993 
+     5.23062992 
+    -3.20681000 
+    -1.21396005 
+    -3.20220995 
+    -5.99289989 
+    -2.17653990 
+    -6.40611982 
+     6.93773985 
+     6.53630018 
+    -1.72695994 
+     1.54188001 
+    -4.17552996 
+    -7.72395992 
+     4.22706985 
+    -0.94597000 
+     7.28864002 
+     7.76141977 
+     7.15566015 
+     0.17904000 
+     6.33760977 
+    -6.87527990 
+    -6.27407980 
+    -5.86930990 
+    -3.75216007 
+    -1.08411002 
+    -6.68459988 
+    -0.98496997 
+    -5.15605021 
+    -6.03137016 
+     6.36196995 
+    -5.52360010 
+     6.14886999 
+    -5.53374004 
+     2.07015991 
+    -6.32862997 
+    -6.59282017 
+     3.05553007 
+     6.26348019 
+    -1.26482999 
+    -6.56524992 
+     6.38501978 
+    -6.51900005 
+     0.09562000 
+     7.92787981 
+    -2.45834994 
+    -6.33855009 
+     7.07357979 
+    -1.45260000 
+    -1.22786999 
+     3.27324009 
+     5.28031015 
+     3.83051991 
+    -5.67314005 
+     3.33451009 
+    -5.92538977 
+    -5.31059980 
+     2.31304002 
+    -3.60903001 
+     4.78196001 
+    -0.11045000 
+    -4.42136002 
+     4.83654022 
+    -6.42475986 
+     6.20428991 
+    -6.02037001 
+    -5.82278013 
+     5.75275993 
+    -6.93356991 
+    -5.80701017 
+    -2.46244001 
+    -7.95269012 
+    -4.70472002 
+    -0.68726999 
+    -2.01078010 
+     5.96432018 
+     6.05661011 
+     2.67870998 
+     6.89582014 
+    -5.09003019 
+    -6.63155985 
+    -2.09178996 
+    -5.91433001 
+    -6.25158024 
+    -4.23366022 
+     2.95240998 
+    -2.42390990 
+    -2.61759996 
+    -6.25649977 
+    -0.21365000 
+     3.20028996 
+     3.32688999 
+    -4.63319016 
+    -5.44480991 
+    -1.26104999 
+    -5.13590002 
+     2.40796995 
+     1.49915004 
+     6.35209990 
+    -7.24746990 
+    -8.11701012 
+    -5.01250982 
+    -5.33603001 
+     0.57675999 
+    -3.47733998 
+     7.81335020 
+     4.56843996 
+     4.73402023 
+     1.01037002 
+     1.50267994 
+     0.71908998 
+    -3.66827011 
+    -1.80865002 
+    -5.22883987 
+    -5.52560997 
+    -5.94193983 
+    -0.11528000 
+    -2.75230002 
+    -5.17298985 
+     6.63174009 
+    -6.39470005 
+     5.78336000 
+    -3.51558995 
+    -0.56215000 
+    -0.73619998 
+     6.06558990 
+    -1.74476004 
+    -6.66932011 
+    -7.11252022 
+     1.89744997 
+     3.47984004 
+     4.97150993 
+    -6.50766993 
+     7.38633013 
+     8.05737019 
+     6.04425001 
+     3.99612999 
+     7.71933985 
+     5.61148977 
+     6.50740004 
+     0.79628003 
+     5.16214991 
+    -6.22280979 
+     5.21445990 
+    -3.43443990 
+     5.59691000 
+     3.09880996 
+    -0.17304000 
+    -5.28678989 
+    -1.51029003 
+     4.39087009 
+     3.50212002 
+     6.17884016 
+    -5.11900997 
+     3.16812992 
+    -6.39573002 
+    -0.85729003 
+     7.54187012 
+     2.82048011 
+    -4.61826992 
+     6.86962986 
+    -3.33598995 
+    -1.72931004 
+    -7.90307999 
+     1.14119995 
+     5.16189003 
+     7.99082994 
+     5.00361013 
+     4.60843992 
+     6.53149986 
+     0.66404998 
+     6.37136984 
+     5.76141024 
+     1.25729001 
+     5.13427019 
+     5.41428995 
+     5.59101009 
+     3.84075999 
+     1.57517004 
+     6.13966990 
+    -5.63794994 
+    -5.91847992 
+     4.76715994 
+    -1.23441005 
+    -1.29187000 
+     6.93175983 
+     6.09397984 
+    -6.73016024 
+     7.33314991 
+    -6.20403004 
+     0.43458000 
+     5.06327009 
+    -1.59200001 
+    -8.44633961 
+     6.79615021 
+     6.56712008 
+    -8.42123032 
+     2.94459009 
+     6.23900986 
+    -6.57476997 
+    -6.99907017 
+     5.06403017 
+    -5.94478989 
+     2.34815001 
+     5.40399981 
+    -3.71602011 
+    -1.02637994 
+    -5.55409002 
+     5.59966993 
+    -4.41443014 
+    -3.87741995 
+    -4.55696011 
+     4.28161001 
+    -5.89540005 
+    -6.42191982 
+    -4.20739985 
+    -2.24002004 
+     0.44885001 
+    -5.52872992 
+     3.19741011 
+     2.02356005 
+     6.35980988 
+     1.76427996 
+    -8.37362957 
+    -3.27342010 
+     4.59962988 
+    -8.46144009 
+    -6.30369997 
+    -1.39831996 
+    -2.90008998 
+     1.83963001 
+     5.33560991 
+     4.97218990 
+     3.12777996 
+     0.00779000 
+     3.54420996 
+    -5.95741987 
+    -5.82590008 
+    -6.56868982 
+     3.12686992 
+     4.98539019 
+    -6.11294985 
+    -3.14857006 
+     4.23638010 
+     3.66224003 
+     0.89551997 
+     4.62577009 
+     0.43166000 
+    -4.64339018 
+    -2.23372006 
+    -4.56796980 
+    -5.48571014 
+    -6.80262995 
+    -6.11687994 
+     0.48852000 
+     2.46329999 
+    -3.44515991 
+     4.91064978 
+    -5.43475008 
+     5.72348022 
+     5.58281994 
+     4.19995022 
+    -4.19631004 
+    -5.92038012 
+    -6.18761015 
+    -2.83799005 
+    -1.72045004 
+    -2.59761000 
+     3.56308007 
+     2.77646995 
+    -3.45995998 
+    -0.73800999 
+     5.94541979 
+    -2.76019001 
+    -1.53306997 
+     2.91895008 
+     1.02488005 
+     7.01603985 
+     2.97572994 
+    -2.82663989 
+    -4.37345982 
+     2.26314998 
+    -6.15079021 
+    -9.11515045 
+     6.80132008 
+     2.52121997 
+     7.29090977 
+     7.27898979 
+    -8.23715019 
+     2.11087990 
+    -0.72226000 
+     6.18136978 
+    -1.92052996 
+     5.30820990 
+    -6.36511993 
+     2.83324003 
+     5.04560995 
+    -5.59834003 
+     4.95392990 
+    -5.63425016 
+     1.02488995 
+     1.76112998 
+    -4.59791994 
+     6.08801985 
+     5.97512007 
+     4.38143015 
+    -0.86282003 
+    -2.66553998 
+     3.74476004 
+    -6.91241980 
+     3.76582003 
+     5.79186010 
+    -6.81809998 
+     7.92875004 
+    -8.45310020 
+     0.95643002 
+     6.46400023 
+     4.79074001 
+    -4.55217981 
+     0.50922000 
+     2.14950991 
+     0.59859002 
+    -6.50939989 
+    -6.05108976 
+     0.35365000 
+    -4.66778994 
+    -3.18593001 
+    -2.90454006 
+     0.60500002 
+     2.99039006 
+     5.36301994 
+    -3.72034001 
+     2.34632993 
+     2.15979004 
+     3.93388009 
+     6.32808018 
+     2.30858994 
+     3.24293995 
+    -1.56954002 
+     8.41382980 
+    -0.12000000 
+     6.71350002 
+    -1.19859004 
diff --git a/data/vslice_circ1.bp b/data/vslice_circ1.bp
new file mode 100644
index 0000000..261fff5
--- /dev/null
+++ b/data/vslice_circ1.bp
@@ -0,0 +1,102 @@
+vslice_circ1.bp          
+100
+1  333246.750000  297794.093750       1.000000
+2  333058.375000  297757.093750       1.000000
+3  332871.562500  297712.875000       1.000000
+4  332686.562500  297661.593750       1.000000
+5  332503.656250  297603.281250       1.000000
+6  332323.156250  297537.906250       1.000000
+7  332145.281250  297465.687500       1.000000
+8  331970.312500  297386.687500       1.000000
+9  331798.531250  297301.000000       1.000000
+10  331630.125000  297208.843750       1.000000
+11  331465.406250  297110.250000       1.000000
+12  331304.593750  297005.375000       1.000000
+13  331147.906250  296894.468750       1.000000
+14  330995.593750  296777.625000       1.000000
+15  330847.906250  296654.968750       1.000000
+16  330705.000000  296526.781250       1.000000
+17  330567.156250  296393.156250       1.000000
+18  330434.500000  296254.406250       1.000000
+19  330307.312500  296110.593750       1.000000
+20  330185.718750  295962.031250       1.000000
+21  330069.906250  295808.937500       1.000000
+22  329960.062500  295651.500000       1.000000
+23  329856.375000  295489.937500       1.000000
+24  329758.937500  295324.500000       1.000000
+25  329667.906250  295155.500000       1.000000
+26  329583.468750  294983.093750       1.000000
+27  329505.687500  294807.562500       1.000000
+28  329434.687500  294629.218750       1.000000
+29  329370.625000  294448.250000       1.000000
+30  329313.531250  294264.968750       1.000000
+31  329263.531250  294079.593750       1.000000
+32  329220.656250  293892.468750       1.000000
+33  329185.031250  293703.843750       1.000000
+34  329156.656250  293513.968750       1.000000
+35  329135.562500  293323.156250       1.000000
+36  329121.843750  293131.687500       1.000000
+37  329115.500000  292939.812500       1.000000
+38  329116.500000  292747.843750       1.000000
+39  329124.875000  292556.062500       1.000000
+40  329140.593750  292364.718750       1.000000
+41  329163.656250  292174.125000       1.000000
+42  329194.031250  291984.562500       1.000000
+43  329231.625000  291796.312500       1.000000
+44  329276.468750  291609.656250       1.000000
+45  329328.406250  291424.843750       1.000000
+46  329387.406250  291242.156250       1.000000
+47  329453.375000  291061.875000       1.000000
+48  329526.218750  290884.250000       1.000000
+49  329605.843750  290709.562500       1.000000
+50  329692.093750  290538.062500       1.000000
+51  329784.875000  290370.000000       1.000000
+52  329884.031250  290205.625000       1.000000
+53  329989.437500  290045.156250       1.000000
+54  330100.906250  289888.875000       1.000000
+55  330218.312500  289736.968750       1.000000
+56  330341.437500  289589.687500       1.000000
+57  330470.156250  289447.250000       1.000000
+58  330604.250000  289309.875000       1.000000
+59  330743.500000  289177.750000       1.000000
+60  330887.718750  289051.031250       1.000000
+61  331036.687500  288929.937500       1.000000
+62  331190.218750  288814.687500       1.000000
+63  331348.031250  288705.375000       1.000000
+64  331509.937500  288602.218750       1.000000
+65  331675.687500  288505.375000       1.000000
+66  331845.062500  288415.000000       1.000000
+67  332017.750000  288331.125000       1.000000
+68  332193.531250  288253.968750       1.000000
+69  332372.125000  288183.562500       1.000000
+70  332553.312500  288120.093750       1.000000
+71  332736.812500  288063.687500       1.000000
+72  332922.343750  288014.375000       1.000000
+73  333109.625000  287972.187500       1.000000
+74  333298.375000  287937.156250       1.000000
+75  333488.343750  287909.500000       1.000000
+76  333679.218750  287889.000000       1.000000
+77  333870.750000  287875.937500       1.000000
+78  334062.656250  287871.406250       1.000000
+79  334254.625000  287871.375000       1.000000
+80  334446.375000  287880.906250       1.000000
+81  334637.656250  287897.250000       1.000000
+82  334828.156250  287921.062500       1.000000
+83  335017.593750  287952.156250       1.000000
+84  335205.718750  287990.406250       1.000000
+85  335392.218750  288035.937500       1.000000
+86  335576.875000  288088.437500       1.000000
+87  335759.343750  288148.093750       1.000000
+88  335939.375000  288214.750000       1.000000
+89  336116.750000  288288.187500       1.000000
+90  336291.156250  288368.406250       1.000000
+91  336462.343750  288455.281250       1.000000
+92  336630.093750  288548.656250       1.000000
+93  336794.125000  288648.375000       1.000000
+94  336954.218750  288754.312500       1.000000
+95  337110.125000  288866.343750       1.000000
+96  337261.593750  288984.281250       1.000000
+97  337408.437500  289107.937500       1.000000
+98  337550.437500  289237.125000       1.000000
+99  337687.375000  289371.687500       1.000000
+100  337819.031250  289511.375000       1.000000
diff --git a/doc/coding_conventions.txt b/doc/coding_conventions.txt
new file mode 100644
index 0000000..5b4f3b6
--- /dev/null
+++ b/doc/coding_conventions.txt
@@ -0,0 +1,149 @@
+Coding Conventions for VisTrails
+--------------------------------------------------------------------------------
+
+Variable naming, spacing
+------------------------
+
+Long version:
+
+    http://www.python.org/dev/peps/pep-0008/
+
+
+Short version:
+
+    Use 4 spaces per indentation level.
+
+    Use spaces, not tabs. 
+
+       Hint: if you have a file that uses tabs and you're using emacs:
+
+       M-x mark-whole-buffer
+       M-x untabify
+
+    Limit lines to 79 characters. (Use Python's implied continuation
+    for parentheses, brackets and braces. Or use a backslash):
+
+       if this_is_true and this_other_thing_is_also_true and this_other_thing_makes_this_line_too_long:
+           raise This_is_bad_style
+
+       Fix it like this:
+
+       if (this_is_true and
+           this_other_thing_is_also_true and
+           this_other_thing_makes_this_line_too_long):
+           raise This_is_better_style
+
+       Or like this:
+
+       if this_is_true and \
+          this_other_thing_is_also_true and \
+          this_other_thing_makes_this_line_too_long:
+          raise This_is_not_as_good_but_better_than_long_lines
+
+    Blank lines
+
+        Separate top-level function and class definitions with two
+        blank lines.
+
+        Method definitions inside a class are separated by a single
+        blank line.
+
+        Extra blank lines may be used (sparingly) to separate groups
+        of related functions.  Blank lines may be omitted between a
+        bunch of related one-liners (e.g. a set of dummy
+        implementations). Use blank lines in functions, sparingly, to
+        indicate logical sections.
+
+    Whitespace
+
+        Learn by example:
+
+        Yes: spam(ham[1], {eggs: 2})
+        No:  spam( ham[ 1 ], { eggs: 2 } )
+
+        Yes: if x == 4: print x, y; x, y = y, x
+        No:  if x == 4 : print x , y ; x , y = y , x
+
+        Yes: spam(1)
+        No:  spam (1)
+
+        Yes: dict['key'] = list[index]
+        No:  dict ['key'] = list [index]
+
+        Yes:  def complex(real, imag=0.0): return magic(r=real, i=imag)
+        No:   def complex(real, imag = 0.0): return magic(r = real, i = imag)
+
+
+    Comments:
+
+        Read http://www.python.org/dev/peps/pep-0008/
+
+
+    Capitalization:
+
+        class names are CamelCase, while methods and members
+        are_separated_by_underscores. This is not always possible,
+        especially when subclassing from Qt. Everywhere else, this
+        convention should be used. Qt signals are lowerCamelCase, to
+        be consistent with Qt.
+
+	Class members that are Qt objects themselves are probably OK
+	being camelCase, but everything that's possibly public-access
+	(through an API, for example), should be
+	separated_by_underscores.
+
+
+
+Docstrings
+----------
+    We agreed using something a little more compact than the guidelines
+available at:
+    http://www.python.org/dev/peps/pep-0257/
+
+    Examples:
+    If it is an obvious function, we should use something like this:
+    def temporaryDirectory():
+        """ temporaryDirectory() -> str 
+         Returns the path to the system's temporary directory """
+         return "/tmp/"
+    
+
+    If the function has structured parameters requiring a detailed description,
+    use something like this:
+    
+    def complex(real=0.0, imag=0.0):
+        """complex(real=0.0, imag=0.0) -> complex
+        Form a complex number.
+
+        Keyword arguments:
+        real -- the real part
+        imag -- the imaginary part
+
+        """
+        if imag == 0.0 and real == 0.0: return complex_zero
+        ...
+        
+
+Importing modules
+-----------------
+
+    Please import the modules using the fully qualified names,
+    even if they are in the right directories. For example, if you
+    have a file inside vistrails/core that imports a module inside 
+    vistrails/core/data_structures, do NOT use this
+
+    import data_structures.graph     # WRONG, don't do it!
+
+    instead, say
+
+    import core.data_structures.graph   # RIGHT
+
+    This allows us to run the modules as standalone classes, which is
+    good for testing purposes.
+
+    Don't use the construct "from foo import *". This also imports the
+    tests from that module. The problem is that the test suite then
+    runs these tests twice. But worse than that is the problem that a
+    module that imports tests from other modules now reports these
+    tests as its own, even though it might have none. This gives us a
+    false sense of test converage which should be avoided.
diff --git a/doc/custom_constants.txt b/doc/custom_constants.txt
new file mode 100644
index 0000000..42365c9
--- /dev/null
+++ b/doc/custom_constants.txt
@@ -0,0 +1,118 @@
+When setting parameters on modules, some value types provide a custom
+widget. For example, VTK allows setting color properties by using
+color chooser widgets. These are defined on a per-constant basis, and
+they are set at module registration time, so you can define your own
+widgets for constants. This file describes how to do just that.
+
+--------------------------------------------------------------------------------
+Creating a new constant
+
+To create a widget for your own module, you first need to make sure
+your module subclasses from Constant, the base class for all constant
+values in VisTrails. If you don't know how to create user-defined
+modules, please check the documentation for that first.
+
+A user-defined constant is a module that should respect a few
+additional requirements. These are documented in the docstring for
+Constant, in core/modules/basic_modules.py, and reproduced here for
+completeness.
+
+    When implementing your own constant, You have to adhere to the
+    following interface:
+
+    Implement the following methods:
+    
+       translate_to_python(x): Given a string, translate_to_python
+       must return a python value that will be the value seen by the
+       execution modules.
+
+       For example, translate_to_python called on a float parameter
+       with value '3.15' will return float('3.15').
+       
+       translate_to_string(): Return a string representation of the
+       current constant, which will eventually be passed to
+       translate_to_python.
+
+       validate(v): return True if given python value is a plausible
+       value for the constant. It should be implemented such that
+       validate(translate_to_python(x)) == True for all valid x
+
+    A constant must also expose its default value, through the field
+    default_value.
+
+    There are fields you are not allowed to use in your constant classes.
+    These are: 'id', 'interpreter', 'logging' and 'change_parameter'
+
+--------------------------------------------------------------------------------
+GUI widgets
+
+Now that we have a constant class, we need to create a widget that
+allows the custom values to be set.
+
+This can be any PyQt widget, provided that you respect the following
+requirements:
+
+1) Your class should always inherit from
+core.modules.constant_configuration.ConstantMixin, a class mixin that
+provides you with some necessary infrastructure.
+
+2) Your constructor should expect an instance of
+core.vistrail.module_param.ModuleParam and the widget's Qt parent. The
+fields you are probably going to use from ModuleParam are 'type',
+'identifier', 'namespace' and 'strValue'. The first three are used to
+specify the actual type of the class, and 'strValue' is a string
+representation of the value itself, typically obtained by a call to
+translate_to_string() as described above. A typical declaration of the
+constructor then would be
+
+  class MyOwnConstant(SomeQtWidget, ConstantMixin):
+      def __init__(self, param, parent=None):
+          SomeQtWidget.__init__(self, parent)
+          ConstantMixin.__init__(self)
+
+3) You should implement a "contents()" method that returns a string
+representation of the value encoded by the GUI in its current state.
+
+4) Every time a change in the GUI state should be passed to VisTrails,
+you should call update_parent(). Every time this is called a new
+version is created, so make sure you have a reasonable granularity.
+
+--------------------------------------------------------------------------------
+
+Constants during execution
+
+To make writing your own modules more convenient, VisTrails provides a
+certain amount of transparent conversion for some constants. Consider
+this example. A VisTrails pipeline contains a Float module with value
+3.0 connected to port "port1" on a downstream module "Foo" whose
+compute method is as follows:
+
+class Foo(Module):
+    ...
+    def compute(self):
+        ...
+        x = self.getInputFromPort("port1")
+
+In this case, x will be a basic Python value of type 'float', _not_ a
+module of type Float. This automatic conversion happens for only a few
+classes: Boolean, Integer, Null, Float, and String. These get
+translated to the expected python types (Null becomes None).
+
+Note, however, that this translation does _not_ happen for any other
+constant, so if you need programmatic access to a constant in your
+code, you should distinguish between these cases.
+
+--------------------------------------------------------------------------------
+Gotchas, what to watch out for:
+
+If your custom widget is generating errors with tracebacks similar to:
+
+  File "/home/cscheid/vistrails/trunk/vistrails/core/modules/constant_configuration.py", line 43, in update_parent
+
+    if newContents != self._last_contents: 
+AttributeError:_last_contents
+
+It probably means you forgot to call the constructor to
+ConstantWidgetMixin.
+
+--------------------------------------------------------------------------------
diff --git a/doc/dist/build_from_source_mac.txt b/doc/dist/build_from_source_mac.txt
new file mode 100644
index 0000000..2d13f84
--- /dev/null
+++ b/doc/dist/build_from_source_mac.txt
@@ -0,0 +1,62 @@
+Building VisTrails from Source
+
+--- Instructions Mac OSX Lion ----
+
+Install the following required software:
+  XCode
+  Command Line Tools (separate download through apple developer web site)
+  
+  Python (python.org) 
+       make sure to update the PATH to use this python. There's a script that does that in /Applications/Python 2.7/Update Shell Profile.command
+
+  Git
+
+  CMake
+
+  Qt
+
+  Boost (if we want to include text analysis support in VTK (it is currently included in 2.0 but I couldn't get it to work in VTK 5.10 on a Mac)
+
+  VTK
+
+  sip
+
+  PyQt4
+
+  QScintilla and python bindings (read instructions in QScintilla documentation)
+
+  NumPy (Binary installation)
+
+  SciPy (Binary installation)
+
+  Matplotlib (Binary installation)
+
+  suds (patched version)
+
+  MySQLdb (you also need to install MySQL Server so we get the lib and headers)
+
+  libxml2 and libxslt (same versions as in Snow Leopard, instructions here: http://www.vistrails.org/index.php/Mac_Intel_Instructions)
+
+  Numeric 23.8.2 (source files is in ~/src (needed by NumScipy)
+    $ cd ~/src/Numeric-23.8.2
+    $ python setup.py
+
+  fftw3 lib (source files is in ~/src)
+
+  Stockwell (needed by NumSciPy got the files from Erik Anderson the folder is also in ~/src) 
+       cd ~/src/stockwell 
+       make
+        cp *.so /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/
+        pexpect (easy_install pexpect)
+  psycopg2 (need PostGreSQL)
+        http://www.enterprisedb.com/products-services-training/pgdownload#osx
+  ScientificPython
+  batchq (ALPS) download and install it from https://github.com/troelsfr/BatchQ
+  h5py (ALPS) need to install hdf5 (make sure to --enable-hl)
+  
+  download Thuban (http://wald.intevation.org/frs/?group_id=6&release_id=275#thuban-_1.2.2-title-content) and build only libraries/pyshapelib
+for shape files (not sure which package requires this)
+
+   easy_install numexpr
+   easy_install Cython
+   easy_install tables (this didn't work on Lion)
diff --git a/doc/dist/build_from_source_windows.txt b/doc/dist/build_from_source_windows.txt
new file mode 100644
index 0000000..a532653
--- /dev/null
+++ b/doc/dist/build_from_source_windows.txt
@@ -0,0 +1,123 @@
+
+== Windows Build ==
+
+Download and install python from www.python.org. Get both 32-bit and 64-bit versions. Install the 64-bit version in C:\Python27_64 and the 32-bit version in C:\Python27
+
+Download and install msysgit (the windows git user is winbuild and there's no passphrase when generating the ssh keys).
+
+Download and install PyQt4 binary installers (includes sip, Qt and QScintilla)
+
+Download and install active tcl/tk 8.5 both 32-bit and 64-bit versions (make sure to install them in different directories C:\Tcl and C:\Tcl_64
+
+download boost library from www.boost.org and uncompress it to a local folder,
+I had problems building vtk with recent versions of boost, the version I know it works for sure is 1.46.1.
+So extract the zip file to a folder, for example ~/src/boost_1_46_1 vtk will use the same boost for both 32-bit and 64-bit versions
+
+Download and install cmake
+Get vtk source
+uncompress it to (e.g, ~\src\vtk\vtk-5.10.1\
+and rename the VTK folder to src
+create build and build64 folders in ~\src\vtk\vtk-5.10.1
+
+vtk 32-bit:
+  run cmake-gui pointing the src folder to src and build folder to build and press configure
+  select Visual Studio 9 2008 
+  mark the following variables:
+   BUILD_SHARED_LIBS 
+   VTK_WRAP_PYTHON
+ on the top check Advanced
+   now mark
+    VTK_USE_BOOST
+    VTK_USE_TEXT_ANALYSIS  
+ and press configure
+  Set 
+     Boost_INCLUDE_DIR  to ~/src/boost_1_46_1 (or where you uncompressed boost)
+   make sure it is using the correct versions of tcl and python (they should point to 32-bit installed versions)
+ press configure again and finally press generate
+  now browse to the build directory and open VTK.sln in Visual Studio
+  On the top bar select Release and then build solution (F7)   
+If all goes well, you can install vtk python bindings:
+open a command prompt in the build/Wrapping/Python folder and run the following command:
+C:\Python27\python.exe setup.py BUILD_TYPE=Release install
+
+I've created two environment variables called PATH32 and PATH64 configured with
+the environment for each version of VisTrails:
+
+PATH32 = C:\Tcl\bin;C:\Python27\Lib\site-packages\PyQt4;C:\Python27;C:\Python27\Scripts;C:\Users\vistrails\src\vtk\vtk-5.10.1\build\bin\Release;C:\Users\vistrails\code\vistrails\dist\windows\Input
+
+PATH64 = C:\Tcl_64\bin;C:\Python27_64\Lib\site-packages\PyQt4;C:\Python27_64;C:\Python27_64\Scripts;C:\Users\vistrails\src\vtk\vtk-5.10.1\build64\bin\Release;C:\Users\vistrails\code\vistrails\dist\windows\Input
+
+Then, when I need to use the right environment, I just update the PATH
+variable with the right one:
+
+PATH = %PATH64%;%PATH%
+
+vtk 64-bit:
+
+  run cmake-gui again pointing the src folder to src and build folder to build64 and press configure
+  select Visual Studio 9 2008 Win64
+  mark the following variables:   
+     BUILD_SHARED_LIBS    
+     VTK_WRAP_PYTHON 
+on the top check Advanced   
+   now mark    
+     VTK_USE_BOOST    
+     VTK_USE_TEXT_ANALYSIS   
+and press configure   
+
+ Set 
+     Boost_INCLUDE_DIR  to ~/src/boost_1_46_1 (or where you uncompressed boost)
+     Boost_LIBRARY_DIRS to ~/src/boost_1_46_1/libs 
+
+    make sure it is using the correct versions of tcl and python (they should point to 64-bit installed versions) press configure again and finally press generate  now browse to the build64 directory and open VTK.sln in Visual Studio  On the top bar select Release and then build solution (F7)  
+If all goes well, switch to the 64 bit Path and you can install vtk python bindings:
+open a command prompt in the build64/Wrapping/Python folder and run the following command:
+C:\Python27_64\python.exe setup.py BUILD_TYPE=Release install 
+
+Now let's build each configuration at time, starting with the 32-bit version:
+
+== 32-bit version ==
+
+Download and install numpy from numpy.scipy.org (there is a win32 super pack for python 2.7 binary version on source forge)
+
+Download and install scipy from scipy.org (there is a win32 super pack for python 2.7 binary version on source forge)
+
+Download and install matplotlib from matplotlib.org  (there is a win32 for python 2.7 version on source forge)
+
+Download and install mysqldb python from source forge, there's a win32 binary installer for python 2.7.
+
+Download and unzip hdf5-1.8.4 from http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.4/bin/windows/hdf5-1.8.4-32bit-VS2008-IVF101.zip
+
+Download fftw (http://www.fftw.org/install/windows.html) from ftp://ftp.fftw.org/pub/fftw/fftw-3.3.3-dll32.zip and extract the zip file to the folder ~/src/fftw-3.3.3-dll32
+
+Download and install setuptools (easy_install)
+
+Download and install the patched version of suds
+
+Copy stockwell files from x86_bin folder to C:\Python27\Lib\site-packages
+st.pyd and sine.pyd
+
+== 64-bit version ==
+
+Go to http://www.lfd.uci.edu/~gohlke/pythonlibs/ and download and
+ install the 64-bit versions of (they are all binaries):
+ numpy (get the MKL version)
+ scipy
+ matplotlib
+ MySQL-python
+ psycopg
+
+Download and unzip hdf5-1.8.4 from http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.4/bin/windows/hdf5-1.8.4-64bit-VS2008-IVF101.zip 
+
+Download fftw (http://www.fftw.org/install/windows.html) from
+ftp://ftp.fftw.org/pub/fftw/fftw-3.3.3-dll64.zip and extract the zip
+file to the folder ~/src/fftw-3.3.3-dll64 Follow the instructions on
+the web page to generate the .lib files
+
+Download and install setuptools (easy_install)
+
+Download and install the patched version of suds
+
+Copy stockwell files from x64_bin folder to C:\Python27_64\Lib\site-packages
+st.pyd and sine.pyd
+#Under construction
diff --git a/doc/dist/instructions.txt b/doc/dist/instructions.txt
new file mode 100644
index 0000000..9095b06
--- /dev/null
+++ b/doc/dist/instructions.txt
@@ -0,0 +1,188 @@
+VisTrails Building Binary Releases
+----------------------------------
+
+1. Make sure you can run VisTrails from source on the system you will
+run these instructions. Instructions to build VisTrails from source
+are on build_from_source_mac.txt and build_from_source_windows.txt.
+
+2. Then make sure the system is prepared to package
+VisTrails. Instructions to install the required software are on
+setup_build_system_mac.txt and setup_build_system_windows.txt
+
+3. Now follow the instructions below:
+
+Binary build instructions
+-------------------------
+
+== Preparation ==
+
+These work for making  both Mac and Windows releases and need to be
+done only once before generating them. I think it is easier to do on a
+Mac, commit the changes and load them on the Windows machines.
+
+=== Change in Licensing or Update the look and feel in the Mac .dmg
+file ===
+If you ever need to change the VisTrails license or need to change the
+look and feel of the .dmg file we distribute, you can do that by
+opening dist/mac/vistrails.dmgCanvas. In the project settings you can
+update the license text (that one the is displayed when you open
+the .dmg). Else you can control the background image and other
+settings.
+Usually you don't need to touch this file. So go ahead to the next steps.
+
+
+
+Updating version numbers
+
+If there is a version upgrade from 2.0 to 2.1 you need to update the
+   following files (the variable name that needs to be updated are in parentheses:
+   scripts/release_notes.py (release_name)
+   scripts/create_release_wiki_table.py (VT_VERSION)
+   vistrails/core/system/__init__.py (function vistrails_version())
+   dist/mac/setup.py (VERSION)
+   dist/windows/vistrails.iss (AppVerName)
+   dist/windows/vistrailsx64.iss (AppVerName)
+   dist/windows/custom/*.iss (AppVerName)
+   dist/source/make-vistrails-src-release.py (VT_VERSION)
+   doc/usersguide/conf.py
+   
+The splash screen also needs to be updated: 
+   vistrails/gui/resources/images/vistrails_splash.png
+
+The Adobe Illustrator source file is in the master branch, in
+dist/common/splash folder. You need to install the font file in that
+folder too before opening the .ai file. After the changes, export the
+file to a .png file. Then open it in Photoshop and resize the image to
+546x340 pixels. Then replace the file in 
+  vistrails/gui/resources/images/vistrails_splash.png
+
+Commit and push your changes.
+
+Generating the release notes
+
+Make sure scripts/release_notes.py is configured right: look for the variables inside the #### configuration #### section in the file.
+
+In particular, make sure branch has the right branch and commit_start points to the hash tag used on the last release. Also you might need to change release_name as you see fit.
+
+Then run:
+$ cd path/to/scripts
+$ python release_notes.py
+
+This will checkout the branch, process all commits and match them with the trac tickets. It will ask for your login and password on trac to do that. At the end, it will print out a release notes section. Just copy from Release Name.... down to the last item in Bug fixes. All the log messages that were not identified with <bugfix> or <feature> will be print out at the end but they can be ignored. Sometimes just take a look and see if there is something important there that should go as bu [...]
+
+You should paste the text into the dist/mac/Input/README file, just below
+RELEASE NOTES
+-----------------------
+
+Also take a look if there aren't repeated items... They might happen when there are merges across the branches and the commit messages got repeated.
+
+Then do the same into dist/windows/Input/releaseNotes.txt
+
+Then commit and push your changes. Now you are ready to generate the binaries on each platform.
+
+== Mac Binary Instructions ==
+ALPS
+Make sure the latest version of ALPS will be included in the binary.
+Go to http://archive.comp-phys.org/software/vistrails/ and look for the latest version and update dist/mac/make_app (ALPS_VERSION). If there were any changes, commit and push them before following next instructions.
+
+Updating revision numbers
+
+Run git log to know what is the latest hash tag on the release branch and copy the first 12 characters from it. This will be the revision number. There's probably a way to automate this but I didn't have time to look into it.
+
+Update the following files with the "revision number"
+  vistrails/core/system/__init__.py (function vistrails_revision())
+  dist/mac/Input/README (Release Name...)
+  dist/source/make-vistrails-src-release.py (VT_HASH)
+  dist/windows/Input/releaseNotes.txt
+  scripts/create_release_wiki_table.py
+  scripts/release_notes.py
+add and commit the changes. This will be the version released.
+
+Update usersguide paths
+
+Make sure the generated users guide is saved to the correct path by
+editing the following file:
+scripts/build_usersguide.py
+By default it is configured for mac
+
+Now run the following:
+$ cd dist/mac/
+$ ./make_app vistrails-mac-10.6-intel-[VER]-[REV]
+where [VER] should be the vistrails version, and [REV] the revision hash.
+
+at the end you should have a file called vistrails-mac-10.6-intel-[VER]-[REV].dmg that can be tested and uploaded to SourceForge.
+You should have created the folder of the new release on source forge before running the command below
+
+$ scp vistrails-mac-10.6-intel-[VER]-[REV].dmg [SFUSER]@frs.sourceforge.net:/home/frs/project/vistrails/vistrails/v[VER]
+where [SFUSER] is your sourceforge user.
+
+== Windows 32-bit Binary Instructions ==
+Update your local copy so you get the newest changes you pushed from
+the Mac.
+VisTrails needs to be run on Windows before the release so it builds
+all the *.pyc files before hand. This can be done by running:
+$ python -m compileall .
+Also, as we are running both 32-bit and 64-bit versions on the same
+system, make sure the PATH variables are set accordingly to use the
+32-bit version of python, vtk, etc. (if you run vistrails 32-bit) or
+the 64-bit version of python, vtk, etc. (if you run vistrails 64-bit).
+
+ALPS
+Make sure the latest version of ALPS will be included in the binary.
+Go to http://archive.comp-phys.org/software/vistrails/
+Download and uncompress the alps package for windows 32 bit available on  http://archive.comp-phys.org/software/vistrails/  into dist/windows/Input/x86/alps_libs folder (it will create a bin and a vistrails folder inside it)
+
+Open dist\windows\vistrails.iss by double-clicking it
+This will launch InnoSetup
+Press the compile script button
+When it finishes a file called dist\windows\Output\vistrails-setup.exe will be created. Rename it according to the release name and create a zip file from it.
+Upload the file to sourceForge (I use WinFTP for this).
+
+Custom 32-bit builds
+For every vistrails-*.iss file in dist/windows/custom folder, run
+InnoSetup. Binaries will be generated in custom/Output folder. Rename it according to the release name and create a zip file from it.
+Upload the file to sourceForge (I use WinFTP for this). 
+
+== Windows 64-bit Binary Instructions ==
+
+ALPS
+Make sure the latest version of ALPS will be included in the binary.
+Go to http://archive.comp-phys.org/software/vistrails/
+Download and uncompress the alps package for windows 64 bit available on http://archive.comp-phys.org/software/vistrails/  into dist/windows/Input/x64/alps_libs folder (it will create a bin and a vistrails folder inside it)
+
+Open dist\windows\vistrails_x64.iss by double-clicking it
+This will launch InnoSetup
+Press the compile script button
+When it finishes a file called dist\windows\Output\vistrails-setup.exe will be created. Rename it according to the release name and create a zip file from it.
+Upload the file to sourceForge (I use WinFTP for this).
+
+Custom 64-bit builds
+For every vistrailsx64-*.iss file in dist/windows/custom folder, run
+InnoSetup. Binaries will be generated in custom/Output folder. Rename it according to the release name and create a zip file from it.
+Upload the file to sourceForge (I use WinFTP for this). 
+
+
+== Source Distribution Instructions ==
+cd path/to/dist/source
+make sure make-vistrails-src-release.py is updated with the right
+branch VT_BRANCH, VT_VERSION and VT_HASH.
+Also update the SF_USERNAME with the vistrails build username if you
+want to upload directly from the script. I usually don't because I
+don't want to commit the vistrails username to the repository so I
+skip the upload to source forge step and use the scp command line above to
+upload the file using my own user.
+
+All the files you need to upload to source forge using the vistrails
+username are in the vistrails server machine. In the cron directory,
+you can look how it is configured so the nightly builds are uploaded
+every night when there are changes.
+
+to generate the tarball:
+$ python make-vistrails-src-release.py
+It will checkout the hash code defined in the file and rename the
+tarball apropriately.
+
+== Update "Check For Updates" ==
+
+If this is a new stable version, log in to vistrails.org and update the version number in:
+/srv/wiki/vistrails/downloads/dist/release_version.txt
diff --git a/doc/dist/setup_build_system_mac.txt b/doc/dist/setup_build_system_mac.txt
new file mode 100644
index 0000000..b673f12
--- /dev/null
+++ b/doc/dist/setup_build_system_mac.txt
@@ -0,0 +1,55 @@
+# Required software for building binaries 
+Install Mercurial http://mercurial.selenic.com/
+
+Checkout and install altgraph 
+$ hg clone https://bitbucket.org/ronaldoussoren/altgraph
+$ cd altgraph
+$ python setup.py install
+$ cd ..
+
+Checkout and install macholib 
+$ hg clone https://bitbucket.org/ronaldoussoren/macholib
+$ cd macholib
+$ python setup.py install
+$ cd ..
+
+Checkout and install modulegraph
+$ hg clone https://bitbucket.org/ronaldoussoren/modulegraph
+$ cd modulegraph
+$ python setup.py install
+$ cd ..
+
+Checkout and install py2app 
+$ hg clone https://bitbucket.org/ronaldoussoren/py2app
+$ cd py2app
+$ python setup.py install
+$ cd ..
+
+Now we need to prepare Qt's plugin libs to be included in the binary because py2app doesn't seem to handle them correctly
+
+Just copy the iconengines and imageformats plugins and run 
+vistrails/dist/mac/Input/fix_qtplugin_libs.py on each folder:
+$ cd dist/mac/Input
+$ mkdir plugins
+$ cd plugins
+$ cp -r /Developer/Applications/Qt/plugins/iconengines .
+$ cp -r /Developer/Applications/Qt/plugins/imageformats .
+$ cd ../..
+$ python fix_qtplugin_libs.py Input/plugins/iconengines/
+$ python fix_qtplugin_libs.py Input/plugins/imageformats/
+
+Copy /usr/bin/git to dist/mac/Input
+
+Create a directory alps_libs in Input to store the alps_libs
+
+#GDAL Framework
+Install GDAL Framework Complete 1.8.1 http://www.kyngchaos.com/software/frameworks
+then copy site-packages to python.org directory:
+$ cp -r /Library/Frameworks/GDAL.framework/Versions/1.8/Python/2.7/site-packages/* /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/
+
+#Install DMG Canvas
+Right now the only way is by copying the App from the build
+machine. The developers are now charging for a License when it used to
+be free. DMG Canvas is an application that creates the customized .dmg
+file. It provides a command line tool and we are using it in the main
+make_app script.
diff --git a/doc/dist/setup_build_system_windows.txt b/doc/dist/setup_build_system_windows.txt
new file mode 100644
index 0000000..162dc8d
--- /dev/null
+++ b/doc/dist/setup_build_system_windows.txt
@@ -0,0 +1,61 @@
+
+== Preparing to generate the release ==
+Install InnoDB Setup
+Download and install the QuickStart Pack of Inno Setup from http://www.jrsoftware.org/isdl.php 
+
+Checkout VisTrails git repository
+In dist/windows/Input folder create a folder named x86
+Copy python27.dll 32 bit version into the x86 folder
+Inside the x86 folder create a folder called alps_libs
+
+In dist/windows/Input folder create a folder named x64
+Copy python27.dll 64 bit version into the x64 folder
+Inside the x64 folder create a folder called alps_libs
+
+
+== Custom Builds ==
+Inside dist/windows/custom there are scripts for custom builds.
+
+=== GDAL ===
+Download the GDAL files from:
+32-bit:
+http://www.gisinternals.com/sdk/Download.aspx?file=release-1500-gdal-1-9-2-mapserver-6-2-0\gdal-19-1500-core.msi
+http://www.gisinternals.com/sdk/Download.aspx?file=release-1500-gdal-1-9-2-mapserver-6-2-0\GDAL-1.9.2.win32-py2.7.msi
+Install the first file. 
+
+Install the second file to a custom Python27
+installation (I believe it can be any folder on your hard drive). I
+copied the installed python files to:
+C:\Users\vistrails\extra_packages\gdal\x86\site-packages
+I then went to the C:\Program Files (x86)\GDAL folder (created by the first
+installer) and copied all the dlls into the osgeo folder inside
+C:\Users\vistrails\extra_packages\gdal\x86\site-packages
+Compiled all .py files with python -m compileall . inside the
+site-packages folder
+
+The script dist/windows/custom/vistrails_gdal.iss will copy the files
+in the binary. Just execute Inno Setup as a normal release. It will
+create a file called vistrails-gdal-setup.exe into
+dist/windows/custom/Output
+
+64-bit:
+http://www.gisinternals.com/sdk/Download.aspx?file=release-1500-x64-gdal-1-9-2-mapserver-6-2-0\gdal-19-1500-x64-core.msi
+http://www.gisinternals.com/sdk/Download.aspx?file=release-1500-x64-gdal-1-9-2-mapserver-6-2-0\GDAL-1.9.2.win-amd64-py2.7.msi
+
+Install the first file. 
+
+Install the second file to a custom Python27_64
+installation (I believe it can be any folder on your hard drive). I
+copied the installed python files to:
+C:\Users\vistrails\extra_packages\gdal\x64\site-packages
+I then went to the C:\Program Files\GDAL folder (created by the first
+installer) and copied all the dlls into the osgeo folder inside
+C:\Users\vistrails\extra_packages\gdal\x64\site-packages
+Compiled all .py files with python -m compileall . inside the
+site-packages folder
+
+The script dist/windows/custom/vistrailsx64_gdal.iss will copy the files
+in the binary. Just execute Inno Setup as a normal release. It will
+create a file called vistrails-x64-gdal-setup.exe into
+dist/windows/custom/Output
+
diff --git a/doc/module_registry.txt b/doc/module_registry.txt
new file mode 100644
index 0000000..ef86613
--- /dev/null
+++ b/doc/module_registry.txt
@@ -0,0 +1,14 @@
+--------------------------------------------------------------------------------
+Signatures in calls to add_input_port and add_output_port
+
+A signature given by the user in a call like this
+add_input_port(module, name, signature) should be one of the
+following:
+
+type only: add_input_port(_, _, Float)
+type plus description: add_input_port(_, _, (Float, 'radius'))
+
+multiple parameters, where each parameter can be either of the above:
+add_input_port(_, _, [Float, (Integer, 'count')])
+
+--------------------------------------------------------------------------------
diff --git a/doc/package_system.txt b/doc/package_system.txt
new file mode 100644
index 0000000..e1dcbf6
--- /dev/null
+++ b/doc/package_system.txt
@@ -0,0 +1,99 @@
+FIXME this is old and does not reflect namespaces
+
+on port specs, a name is now of the form
+
+package_identifier:module_name
+
+this means that ":" is no longer allowed on module names.
+
+--------------------------------------------------------------------------------
+
+A package has three "names" associated with it:
+
+- A human-readable name, which is given by the package creator, and is
+  available as the 'name' attribute in the package. 
+- A unique identifier, which is given by the package creator, and is
+  available as the 'identifier' attribute in the package
+- A code-path, which is currently given by the package user, and is
+  used by the package manager to get to the package.
+
+These three names are necessary for different reasons. A code-path
+needs to be unique within a VisTrails install so that __import__ is
+well-defined. However, it is not currently under the control of the
+package creator. This is the main identifier for
+core/packagemanager.py, which deals mainly with the executable code
+aspects of VisTrails packages. A human-readable name is necessary for
+the Module Palette in the UI, so that users can quickly see a
+descriptive name for a package. These names might be duplicate across
+a VisTrails install, and they are only cosmetic. A unique identifier
+is necessary for the module registry to distinguish between
+possibly conflicting module names. These are unique across _all_
+VisTrails installs, so users should take extra caution to find unique
+names.
+
+--------------------------------------------------------------------------------
+(The following is not going to be done until 2.0)
+
+So I'm trying to design the packaging system to be reasonably future-proof.
+Here are a few use cases I see:
+
+
+Naming
+
+Use case: You write a package with a module having a certain name. I write a
+package with a module having the same name. VisTrails should handle both of
+them gracefully.
+
+Decision: We will assume a package prefix that is unique among all packages
+("... in the universe"), and educate them to create these correctly. For
+example, packages coming from our group should have an identifier
+"edu.utah.sci.vgc.package_name".
+
+
+Versioning
+
+Use case: I write a package and decide to change its interface. I release a
+new version of the package, which breaks compatibility with the old package.
+VisTrails should realize this and let the user know about obsolete packages,
+vistrail/package mismatches, etc.
+
+Decision: We will allow users to specify the version of a package. Packages
+will have a major.minor.release versioning scheme with specific assumed
+semantics. Major versions will be generally considered to break interfaces.
+Changes in minor versions will have to be fully type-compatible with the
+previous version. For example, version 1.1.0 can only change execution
+behavior, add new ports to modules, or add new modules. Everything else must
+be exactly like 1.0.0. Between 1.1.0 and 1.1.1 there can only be changes in
+execution behavior, documentation, etc: The types must be identical.
+
+Later on (post 1.0), packages can provide meta-information on how to
+automatically upgrade a module from one version to another, in the form of
+rewrite rules.
+
+
+Repositories
+
+When we have the online repository of packages (post 1.0), the repository will
+be able to check for the validity of the typing rules for major and minor
+versions. We should also design the repositories to be distributed. We should
+hold the central one, but we should assume people will eventually want to run
+their own package repositories.
+
+
+Can you guys think of anything?
+Thanks!
+-carlos
+
+--------------------------------------------------------------------------------
+
+Required changes for the new packaging system:
+
+--------------------------------------------------------------------------------
+
+If a package wants to be notified of a missing module, it should
+simply implement a function called "handle_missing_module" that takes
+the name and the namespace of a module that's missing. This function
+should then add the right module (or modules) to the registry. This
+allows configuring some packages (like webservices) to be much less
+annoying.
+
diff --git a/doc/parameter_exploration.txt b/doc/parameter_exploration.txt
new file mode 100644
index 0000000..8ea6504
--- /dev/null
+++ b/doc/parameter_exploration.txt
@@ -0,0 +1,57 @@
+This file describes the API for creating user-defined parameter
+exploration widgets.
+
+--------------------------------------------------------------------------------
+User-defined parameter exploration widgets allow users to define
+methods for performing parameter exploration on user-defined
+constants. If you want to know how to define your own constants,
+please see doc/user_defined_constants.txt.
+
+A user-defined parameter exploration widget is simply a QtGui.QWidget
+subclass that respects a certain small interface. The constant class
+is then made aware of the (possible many) widgets, and VisTrails takes
+care of instantiating them correctly. This is what each of your
+subclasses will have to implement:
+
+- a constructor that takes the parameter exploration information
+
+- a method 'get_values' that will return a list of strings
+  corresponding to the associated values of the exploration
+
+- a field 'exploration_name' that will store the string name to be
+  associated with the particular type of exploration (for example,
+  "HSV Interpolation" or "RGB Interpolation")
+
+- optionally, a method 'size_was_updated', which gets called when the
+  parameter exploration dimension is changed. You can use this to
+  automatically refresh your widget if necessary (the user function
+  editor does this, for example)
+
+--------------------------------------------------------------------------------
+The constructor
+
+The constructor should take two mandatory arguments. The first
+parameter is an instance of ParameterInfo, an object that identifies
+the parameter being changed. The fields you will probably care about
+are 'type', 'identifier', 'namespace' and 'value'. The first three
+will allow you to get to the constant's information in the registry,
+and 'value' is the string representation of the current parameter
+value in the pipeline (typically used as an initialization parameter
+for the widget). The second parameter is an integer corresponding to
+the 'size' of the exploration, the number of steps in that particular
+dimension. The constructor should also accept an optional 'parent'
+parameter, with default value None.
+
+--------------------------------------------------------------------------------
+The get_values method
+
+The 'get_values' method should take a parameter corresponding to the
+size of the exploration, and should return a list of string values
+with length size. These values should correspond to the steps of the
+exploration.
+
+--------------------------------------------------------------------------------
+The size_was_updated method
+
+The 'size_was_updated' method should take a parameter corresponding to
+the new size of the exploration.
diff --git a/doc/pep-0008.txt b/doc/pep-0008.txt
new file mode 100644
index 0000000..3e5ef28
--- /dev/null
+++ b/doc/pep-0008.txt
@@ -0,0 +1,1009 @@
+PEP: 8
+Title: Style Guide for Python Code
+Version: $Revision: cfd6d2cb1ca6 $
+Last-Modified: $Date: 2013/04/19 00:31:05 $
+Author: Guido van Rossum <guido at python.org>,
+        Barry Warsaw <barry at python.org>
+Status: Active
+Type: Process
+Content-Type: text/x-rst
+Created: 05-Jul-2001
+Post-History: 05-Jul-2001
+
+
+Introduction
+============
+
+This document gives coding conventions for the Python code comprising
+the standard library in the main Python distribution.  Please see the
+companion informational PEP describing style guidelines for the C code
+in the C implementation of Python [1]_.
+
+This document and PEP 257 (Docstring Conventions) were adapted from
+Guido's original Python Style Guide essay, with some additions from
+Barry's style guide [2]_.
+
+
+A Foolish Consistency is the Hobgoblin of Little Minds
+======================================================
+
+One of Guido's key insights is that code is read much more often than
+it is written.  The guidelines provided here are intended to improve
+the readability of code and make it consistent across the wide
+spectrum of Python code.  As PEP 20 says, "Readability counts".
+
+A style guide is about consistency.  Consistency with this style guide
+is important.  Consistency within a project is more important.
+Consistency within one module or function is most important.
+
+But most importantly: know when to be inconsistent -- sometimes the
+style guide just doesn't apply.  When in doubt, use your best
+judgment.  Look at other examples and decide what looks best.  And
+don't hesitate to ask!
+
+Two good reasons to break a particular rule:
+
+1. When applying the rule would make the code less readable, even for
+   someone who is used to reading code that follows the rules.
+
+2. To be consistent with surrounding code that also breaks it (maybe
+   for historic reasons) -- although this is also an opportunity to
+   clean up someone else's mess (in true XP style).
+
+
+Code lay-out
+============
+
+Indentation
+-----------
+
+Use 4 spaces per indentation level.
+
+For really old code that you don't want to mess up, you can continue
+to use 8-space tabs.
+
+Continuation lines should align wrapped elements either vertically
+using Python's implicit line joining inside parentheses, brackets and
+braces, or using a hanging indent.  When using a hanging indent the
+following considerations should be applied; there should be no
+arguments on the first line and further indentation should be used to
+clearly distinguish itself as a continuation line.
+
+Yes::
+
+    # Aligned with opening delimiter
+    foo = long_function_name(var_one, var_two,
+                             var_three, var_four)
+
+    # More indentation included to distinguish this from the rest.
+    def long_function_name(
+            var_one, var_two, var_three,
+            var_four):
+        print(var_one)
+
+No::
+
+    # Arguments on first line forbidden when not using vertical alignment
+    foo = long_function_name(var_one, var_two,
+        var_three, var_four)
+
+    # Further indentation required as indentation is not distinguishable
+    def long_function_name(
+        var_one, var_two, var_three,
+        var_four):
+        print(var_one)
+
+Optional::
+
+    # Extra indentation is not necessary.
+    foo = long_function_name(
+      var_one, var_two,
+      var_three, var_four)
+
+The closing brace/bracket/parenthesis on multi-line constructs may
+either line up under the last item of the list, as in::
+
+    my_list = [
+        1, 2, 3,
+        4, 5, 6,
+        ]
+    result = some_function_that_takes_arguments(
+        'a', 'b', 'c',
+        'd', 'e', 'f',
+        )
+
+or it may be lined up under the first character of the line that
+starts the multi-line construct, as in::
+
+    my_list = [
+        1, 2, 3,
+        4, 5, 6,
+    ]
+    result = some_function_that_takes_arguments(
+        'a', 'b', 'c',
+        'd', 'e', 'f',
+    )
+
+
+Tabs or Spaces?
+---------------
+
+Never mix tabs and spaces.
+
+The most popular way of indenting Python is with spaces only.  The
+second-most popular way is with tabs only.  Code indented with a
+mixture of tabs and spaces should be converted to using spaces
+exclusively.  When invoking the Python command line interpreter with
+the ``-t`` option, it issues warnings about code that illegally mixes
+tabs and spaces.  When using ``-tt`` these warnings become errors.
+These options are highly recommended!
+
+For new projects, spaces-only are strongly recommended over tabs.
+Most editors have features that make this easy to do.
+
+Maximum Line Length
+-------------------
+
+Limit all lines to a maximum of 79 characters.
+
+There are still many devices around that are limited to 80 character
+lines; plus, limiting windows to 80 characters makes it possible to
+have several windows side-by-side.  The default wrapping on such
+devices disrupts the visual structure of the code, making it more
+difficult to understand.  Therefore, please limit all lines to a
+maximum of 79 characters.  For flowing long blocks of text (docstrings
+or comments), limiting the length to 72 characters is recommended.
+
+The preferred way of wrapping long lines is by using Python's implied
+line continuation inside parentheses, brackets and braces.  Long lines
+can be broken over multiple lines by wrapping expressions in
+parentheses. These should be used in preference to using a backslash
+for line continuation.  Make sure to indent the continued line
+appropriately.  The preferred place to break around a binary operator
+is *after* the operator, not before it.  Some examples::
+
+    class Rectangle(Blob):
+
+        def __init__(self, width, height,
+                     color='black', emphasis=None, highlight=0):
+            if (width == 0 and height == 0 and
+                color == 'red' and emphasis == 'strong' or
+                highlight > 100):
+                raise ValueError("sorry, you lose")
+            if width == 0 and height == 0 and (color == 'red' or
+                                               emphasis is None):
+                raise ValueError("I don't think so -- values are %s, %s" %
+                                 (width, height))
+            Blob.__init__(self, width, height,
+                          color, emphasis, highlight)
+
+Blank Lines
+-----------
+
+Separate top-level function and class definitions with two blank
+lines.
+
+Method definitions inside a class are separated by a single blank
+line.
+
+Extra blank lines may be used (sparingly) to separate groups of
+related functions.  Blank lines may be omitted between a bunch of
+related one-liners (e.g. a set of dummy implementations).
+
+Use blank lines in functions, sparingly, to indicate logical sections.
+
+Python accepts the control-L (i.e. ^L) form feed character as
+whitespace; Many tools treat these characters as page separators, so
+you may use them to separate pages of related sections of your file.
+Note, some editors and web-based code viewers may not recognize
+control-L as a form feed and will show another glyph in its place.
+
+Encodings (PEP 263)
+-------------------
+
+Code in the core Python distribution should always use the ASCII or
+Latin-1 encoding (a.k.a. ISO-8859-1).  For Python 3.0 and beyond,
+UTF-8 is preferred over Latin-1, see PEP 3120.
+
+Files using ASCII should not have a coding cookie.  Latin-1 (or UTF-8)
+should only be used when a comment or docstring needs to mention an
+author name that requires Latin-1; otherwise, using ``\x``, ``\u`` or
+``\U`` escapes is the preferred way to include non-ASCII data in
+string literals.
+
+For Python 3.0 and beyond, the following policy is prescribed for the
+standard library (see PEP 3131): All identifiers in the Python
+standard library MUST use ASCII-only identifiers, and SHOULD use
+English words wherever feasible (in many cases, abbreviations and
+technical terms are used which aren't English). In addition, string
+literals and comments must also be in ASCII. The only exceptions are
+(a) test cases testing the non-ASCII features, and
+(b) names of authors. Authors whose names are not based on the
+latin alphabet MUST provide a latin transliteration of their
+names.
+
+Open source projects with a global audience are encouraged to adopt a
+similar policy.
+
+
+Imports
+-------
+
+- Imports should usually be on separate lines, e.g.::
+
+      Yes: import os
+           import sys
+
+      No:  import sys, os
+
+  It's okay to say this though::
+
+      from subprocess import Popen, PIPE
+
+- Imports are always put at the top of the file, just after any module
+  comments and docstrings, and before module globals and constants.
+
+  Imports should be grouped in the following order:
+
+  1. standard library imports
+  2. related third party imports
+  3. local application/library specific imports
+
+  You should put a blank line between each group of imports.
+
+  Put any relevant ``__all__`` specification after the imports.
+
+- Relative imports for intra-package imports are highly discouraged.
+  Always use the absolute package path for all imports.  Even now that
+  PEP 328 is fully implemented in Python 2.5, its style of explicit
+  relative imports is actively discouraged; absolute imports are more
+  portable and usually more readable.
+
+- When importing a class from a class-containing module, it's usually
+  okay to spell this::
+
+      from myclass import MyClass
+      from foo.bar.yourclass import YourClass
+
+  If this spelling causes local name clashes, then spell them ::
+
+      import myclass
+      import foo.bar.yourclass
+
+  and use "myclass.MyClass" and "foo.bar.yourclass.YourClass".
+
+
+Whitespace in Expressions and Statements
+========================================
+
+Pet Peeves
+----------
+
+Avoid extraneous whitespace in the following situations:
+
+- Immediately inside parentheses, brackets or braces. ::
+
+      Yes: spam(ham[1], {eggs: 2})
+      No:  spam( ham[ 1 ], { eggs: 2 } )
+
+- Immediately before a comma, semicolon, or colon::
+
+      Yes: if x == 4: print x, y; x, y = y, x
+      No:  if x == 4 : print x , y ; x , y = y , x
+
+- Immediately before the open parenthesis that starts the argument
+  list of a function call::
+
+      Yes: spam(1)
+      No:  spam (1)
+
+- Immediately before the open parenthesis that starts an indexing or
+  slicing::
+
+      Yes: dict['key'] = list[index]
+      No:  dict ['key'] = list [index]
+
+- More than one space around an assignment (or other) operator to
+  align it with another.
+
+  Yes::
+
+      x = 1
+      y = 2
+      long_variable = 3
+
+  No::
+
+      x             = 1
+      y             = 2
+      long_variable = 3
+
+
+Other Recommendations
+---------------------
+
+- Always surround these binary operators with a single space on either
+  side: assignment (``=``), augmented assignment (``+=``, ``-=``
+  etc.), comparisons (``==``, ``<``, ``>``, ``!=``, ``<>``, ``<=``,
+  ``>=``, ``in``, ``not in``, ``is``, ``is not``), Booleans (``and``,
+  ``or``, ``not``).
+
+- If operators with different priorities are used, consider adding
+  whitespace around the operators with the lowest priority(ies). Use
+  your own judgement; however, never use more than one space, and
+  always have the same amount of whitespace on both sides of a binary
+  operator.
+
+  Yes::
+
+      i = i + 1
+      submitted += 1
+      x = x*2 - 1
+      hypot2 = x*x + y*y
+      c = (a+b) * (a-b)
+
+  No::
+
+      i=i+1
+      submitted +=1
+      x = x * 2 - 1
+      hypot2 = x * x + y * y
+      c = (a + b) * (a - b)
+
+- Don't use spaces around the ``=`` sign when used to indicate a
+  keyword argument or a default parameter value.
+
+  Yes::
+
+      def complex(real, imag=0.0):
+          return magic(r=real, i=imag)
+
+  No::
+
+      def complex(real, imag = 0.0):
+          return magic(r = real, i = imag)
+
+- Compound statements (multiple statements on the same line) are
+  generally discouraged.
+
+  Yes::
+
+      if foo == 'blah':
+          do_blah_thing()
+      do_one()
+      do_two()
+      do_three()
+
+  Rather not::
+
+      if foo == 'blah': do_blah_thing()
+      do_one(); do_two(); do_three()
+
+- While sometimes it's okay to put an if/for/while with a small body
+  on the same line, never do this for multi-clause statements.  Also
+  avoid folding such long lines!
+
+  Rather not::
+
+      if foo == 'blah': do_blah_thing()
+      for x in lst: total += x
+      while t < 10: t = delay()
+
+  Definitely not::
+
+      if foo == 'blah': do_blah_thing()
+      else: do_non_blah_thing()
+
+      try: something()
+      finally: cleanup()
+
+      do_one(); do_two(); do_three(long, argument,
+                                   list, like, this)
+
+      if foo == 'blah': one(); two(); three()
+
+Comments
+========
+
+Comments that contradict the code are worse than no comments.  Always
+make a priority of keeping the comments up-to-date when the code
+changes!
+
+Comments should be complete sentences.  If a comment is a phrase or
+sentence, its first word should be capitalized, unless it is an
+identifier that begins with a lower case letter (never alter the case
+of identifiers!).
+
+If a comment is short, the period at the end can be omitted.  Block
+comments generally consist of one or more paragraphs built out of
+complete sentences, and each sentence should end in a period.
+
+You should use two spaces after a sentence-ending period.
+
+When writing English, Strunk and White apply.
+
+Python coders from non-English speaking countries: please write your
+comments in English, unless you are 120% sure that the code will never
+be read by people who don't speak your language.
+
+Block Comments
+--------------
+
+Block comments generally apply to some (or all) code that follows
+them, and are indented to the same level as that code.  Each line of a
+block comment starts with a ``#`` and a single space (unless it is
+indented text inside the comment).
+
+Paragraphs inside a block comment are separated by a line containing a
+single ``#``.
+
+Inline Comments
+---------------
+
+Use inline comments sparingly.
+
+An inline comment is a comment on the same line as a statement.
+Inline comments should be separated by at least two spaces from the
+statement.  They should start with a # and a single space.
+
+Inline comments are unnecessary and in fact distracting if they state
+the obvious.  Don't do this::
+
+    x = x + 1                 # Increment x
+
+But sometimes, this is useful::
+
+    x = x + 1                 # Compensate for border
+
+Documentation Strings
+---------------------
+
+Conventions for writing good documentation strings
+(a.k.a. "docstrings") are immortalized in PEP 257.
+
+- Write docstrings for all public modules, functions, classes, and
+  methods.  Docstrings are not necessary for non-public methods, but
+  you should have a comment that describes what the method does.  This
+  comment should appear after the ``def`` line.
+
+- PEP 257 describes good docstring conventions.  Note that most
+  importantly, the ``"""`` that ends a multiline docstring should be
+  on a line by itself, and preferably preceded by a blank line, e.g.::
+
+      """Return a foobang
+
+      Optional plotz says to frobnicate the bizbaz first.
+
+      """
+
+- For one liner docstrings, it's okay to keep the closing ``"""`` on
+  the same line.
+
+
+Version Bookkeeping
+===================
+
+If you have to have Subversion, CVS, or RCS crud in your source file,
+do it as follows. ::
+
+    __version__ = "$Revision: cfd6d2cb1ca6 $"
+    # $Source: C:\Users\Remi\Desktop\peps/pep-0008.txt,v $
+
+These lines should be included after the module's docstring, before
+any other code, separated by a blank line above and below.
+
+
+Naming Conventions
+==================
+
+The naming conventions of Python's library are a bit of a mess, so
+we'll never get this completely consistent -- nevertheless, here are
+the currently recommended naming standards.  New modules and packages
+(including third party frameworks) should be written to these
+standards, but where an existing library has a different style,
+internal consistency is preferred.
+
+Descriptive: Naming Styles
+--------------------------
+
+There are a lot of different naming styles.  It helps to be able to
+recognize what naming style is being used, independently from what
+they are used for.
+
+The following naming styles are commonly distinguished:
+
+- ``b`` (single lowercase letter)
+- ``B`` (single uppercase letter)
+- ``lowercase``
+- ``lower_case_with_underscores``
+- ``UPPERCASE``
+- ``UPPER_CASE_WITH_UNDERSCORES``
+- ``CapitalizedWords`` (or CapWords, or CamelCase -- so named because
+  of the bumpy look of its letters [3]_).  This is also sometimes known
+  as StudlyCaps.
+
+  Note: When using abbreviations in CapWords, capitalize all the
+  letters of the abbreviation.  Thus HTTPServerError is better than
+  HttpServerError.
+- ``mixedCase`` (differs from CapitalizedWords by initial lowercase
+  character!)
+- ``Capitalized_Words_With_Underscores`` (ugly!)
+
+There's also the style of using a short unique prefix to group related
+names together.  This is not used much in Python, but it is mentioned
+for completeness.  For example, the ``os.stat()`` function returns a
+tuple whose items traditionally have names like ``st_mode``,
+``st_size``, ``st_mtime`` and so on.  (This is done to emphasize the
+correspondence with the fields of the POSIX system call struct, which
+helps programmers familiar with that.)
+
+The X11 library uses a leading X for all its public functions.  In
+Python, this style is generally deemed unnecessary because attribute
+and method names are prefixed with an object, and function names are
+prefixed with a module name.
+
+In addition, the following special forms using leading or trailing
+underscores are recognized (these can generally be combined with any
+case convention):
+
+- ``_single_leading_underscore``: weak "internal use" indicator.
+  E.g. ``from M import *`` does not import objects whose name starts
+  with an underscore.
+
+- ``single_trailing_underscore_``: used by convention to avoid
+  conflicts with Python keyword, e.g. ::
+
+      Tkinter.Toplevel(master, class_='ClassName')
+
+- ``__double_leading_underscore``: when naming a class attribute,
+  invokes name mangling (inside class FooBar, ``__boo`` becomes
+  ``_FooBar__boo``; see below).
+
+- ``__double_leading_and_trailing_underscore__``: "magic" objects or
+  attributes that live in user-controlled namespaces.
+  E.g. ``__init__``, ``__import__`` or ``__file__``.  Never invent
+  such names; only use them as documented.
+
+Prescriptive: Naming Conventions
+--------------------------------
+
+Names to Avoid
+~~~~~~~~~~~~~~
+
+Never use the characters 'l' (lowercase letter el), 'O' (uppercase
+letter oh), or 'I' (uppercase letter eye) as single character variable
+names.
+
+In some fonts, these characters are indistinguishable from the
+numerals one and zero.  When tempted to use 'l', use 'L' instead.
+
+Package and Module Names
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Modules should have short, all-lowercase names.  Underscores can be
+used in the module name if it improves readability.  Python packages
+should also have short, all-lowercase names, although the use of
+underscores is discouraged.
+
+Since module names are mapped to file names, and some file systems are
+case insensitive and truncate long names, it is important that module
+names be chosen to be fairly short -- this won't be a problem on Unix,
+but it may be a problem when the code is transported to older Mac or
+Windows versions, or DOS.
+
+When an extension module written in C or C++ has an accompanying
+Python module that provides a higher level (e.g. more object oriented)
+interface, the C/C++ module has a leading underscore
+(e.g. ``_socket``).
+
+Class Names
+~~~~~~~~~~~
+
+Almost without exception, class names use the CapWords convention.
+Classes for internal use have a leading underscore in addition.
+
+Exception Names
+~~~~~~~~~~~~~~~
+
+Because exceptions should be classes, the class naming convention
+applies here.  However, you should use the suffix "Error" on your
+exception names (if the exception actually is an error).
+
+Global Variable Names
+~~~~~~~~~~~~~~~~~~~~~
+
+(Let's hope that these variables are meant for use inside one module
+only.)  The conventions are about the same as those for functions.
+
+Modules that are designed for use via ``from M import *`` should use
+the ``__all__`` mechanism to prevent exporting globals, or use the
+older convention of prefixing such globals with an underscore (which
+you might want to do to indicate these globals are "module
+non-public").
+
+Function Names
+~~~~~~~~~~~~~~
+
+Function names should be lowercase, with words separated by
+underscores as necessary to improve readability.
+
+mixedCase is allowed only in contexts where that's already the
+prevailing style (e.g. threading.py), to retain backwards
+compatibility.
+
+Function and method arguments
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Always use ``self`` for the first argument to instance methods.
+
+Always use ``cls`` for the first argument to class methods.
+
+If a function argument's name clashes with a reserved keyword, it is
+generally better to append a single trailing underscore rather than
+use an abbreviation or spelling corruption.  Thus ``class_`` is better
+than ``clss``.  (Perhaps better is to avoid such clashes by using a
+synonym.)
+
+Method Names and Instance Variables
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Use the function naming rules: lowercase with words separated by
+underscores as necessary to improve readability.
+
+Use one leading underscore only for non-public methods and instance
+variables.
+
+To avoid name clashes with subclasses, use two leading underscores to
+invoke Python's name mangling rules.
+
+Python mangles these names with the class name: if class Foo has an
+attribute named ``__a``, it cannot be accessed by ``Foo.__a``.  (An
+insistent user could still gain access by calling ``Foo._Foo__a``.)
+Generally, double leading underscores should be used only to avoid
+name conflicts with attributes in classes designed to be subclassed.
+
+Note: there is some controversy about the use of __names (see below).
+
+Constants
+~~~~~~~~~
+
+Constants are usually defined on a module level and written in all
+capital letters with underscores separating words.  Examples include
+``MAX_OVERFLOW`` and ``TOTAL``.
+
+Designing for inheritance
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Always decide whether a class's methods and instance variables
+(collectively: "attributes") should be public or non-public.  If in
+doubt, choose non-public; it's easier to make it public later than to
+make a public attribute non-public.
+
+Public attributes are those that you expect unrelated clients of your
+class to use, with your commitment to avoid backward incompatible
+changes.  Non-public attributes are those that are not intended to be
+used by third parties; you make no guarantees that non-public
+attributes won't change or even be removed.
+
+We don't use the term "private" here, since no attribute is really
+private in Python (without a generally unnecessary amount of work).
+
+Another category of attributes are those that are part of the
+"subclass API" (often called "protected" in other languages).  Some
+classes are designed to be inherited from, either to extend or modify
+aspects of the class's behavior.  When designing such a class, take
+care to make explicit decisions about which attributes are public,
+which are part of the subclass API, and which are truly only to be
+used by your base class.
+
+With this in mind, here are the Pythonic guidelines:
+
+- Public attributes should have no leading underscores.
+
+- If your public attribute name collides with a reserved keyword,
+  append a single trailing underscore to your attribute name.  This is
+  preferable to an abbreviation or corrupted spelling.  (However,
+  notwithstanding this rule, 'cls' is the preferred spelling for any
+  variable or argument which is known to be a class, especially the
+  first argument to a class method.)
+
+  Note 1: See the argument name recommendation above for class methods.
+
+- For simple public data attributes, it is best to expose just the
+  attribute name, without complicated accessor/mutator methods.  Keep
+  in mind that Python provides an easy path to future enhancement,
+  should you find that a simple data attribute needs to grow
+  functional behavior.  In that case, use properties to hide
+  functional implementation behind simple data attribute access
+  syntax.
+
+  Note 1: Properties only work on new-style classes.
+
+  Note 2: Try to keep the functional behavior side-effect free,
+  although side-effects such as caching are generally fine.
+
+  Note 3: Avoid using properties for computationally expensive
+  operations; the attribute notation makes the caller believe that
+  access is (relatively) cheap.
+
+- If your class is intended to be subclassed, and you have attributes
+  that you do not want subclasses to use, consider naming them with
+  double leading underscores and no trailing underscores.  This
+  invokes Python's name mangling algorithm, where the name of the
+  class is mangled into the attribute name.  This helps avoid
+  attribute name collisions should subclasses inadvertently contain
+  attributes with the same name.
+
+  Note 1: Note that only the simple class name is used in the mangled
+  name, so if a subclass chooses both the same class name and attribute
+  name, you can still get name collisions.
+
+  Note 2: Name mangling can make certain uses, such as debugging and
+  ``__getattr__()``, less convenient.  However the name mangling
+  algorithm is well documented and easy to perform manually.
+
+  Note 3: Not everyone likes name mangling.  Try to balance the
+  need to avoid accidental name clashes with potential use by
+  advanced callers.
+
+
+Programming Recommendations
+===========================
+
+- Code should be written in a way that does not disadvantage other
+  implementations of Python (PyPy, Jython, IronPython, Cython, Psyco,
+  and such).
+
+  For example, do not rely on CPython's efficient implementation of
+  in-place string concatenation for statements in the form ``a += b``
+  or ``a = a + b``.  Those statements run more slowly in Jython.  In
+  performance sensitive parts of the library, the ``''.join()`` form
+  should be used instead.  This will ensure that concatenation occurs
+  in linear time across various implementations.
+
+- Comparisons to singletons like None should always be done with
+  ``is`` or ``is not``, never the equality operators.
+
+  Also, beware of writing ``if x`` when you really mean ``if x is not
+  None`` -- e.g. when testing whether a variable or argument that
+  defaults to None was set to some other value.  The other value might
+  have a type (such as a container) that could be false in a boolean
+  context!
+
+- When implementing ordering operations with rich comparisons, it is
+  best to implement all six operations (``__eq__``, ``__ne__``,
+  ``__lt__``, ``__le__``, ``__gt__``, ``__ge__``) rather than relying
+  on other code to only exercise a particular comparison.
+
+  To minimize the effort involved, the ``functools.total_ordering()``
+  decorator provides a tool to generate missing comparison methods.
+
+  PEP 207 indicates that reflexivity rules *are* assumed by Python.
+  Thus, the interpreter may swap ``y > x`` with ``x < y``, ``y >= x``
+  with ``x <= y``, and may swap the arguments of ``x == y`` and ``x !=
+  y``.  The ``sort()`` and ``min()`` operations are guaranteed to use
+  the ``<`` operator and the ``max()`` function uses the ``>``
+  operator.  However, it is best to implement all six operations so
+  that confusion doesn't arise in other contexts.
+
+- Use class-based exceptions.
+
+  String exceptions in new code are forbidden, and this language
+  feature has been removed in Python 2.6.
+
+  Modules or packages should define their own domain-specific base
+  exception class, which should be subclassed from the built-in
+  Exception class.  Always include a class docstring.  E.g.::
+
+      class MessageError(Exception):
+          """Base class for errors in the email package."""
+
+  Class naming conventions apply here, although you should add the
+  suffix "Error" to your exception classes, if the exception is an
+  error.  Non-error exceptions need no special suffix.
+
+- When raising an exception, use ``raise ValueError('message')``
+  instead of the older form ``raise ValueError, 'message'``.
+
+  The paren-using form is preferred because when the exception
+  arguments are long or include string formatting, you don't need to
+  use line continuation characters thanks to the containing
+  parentheses.  The older form is not legal syntax in Python 3.
+
+- When catching exceptions, mention specific exceptions whenever
+  possible instead of using a bare ``except:`` clause.
+
+  For example, use::
+
+      try:
+          import platform_specific_module
+      except ImportError:
+          platform_specific_module = None
+
+  A bare ``except:`` clause will catch SystemExit and
+  KeyboardInterrupt exceptions, making it harder to interrupt a
+  program with Control-C, and can disguise other problems.  If you
+  want to catch all exceptions that signal program errors, use
+  ``except Exception:`` (bare except is equivalent to ``except
+  BaseException:``).
+
+  A good rule of thumb is to limit use of bare 'except' clauses to two
+  cases:
+
+  1. If the exception handler will be printing out or logging the
+     traceback; at least the user will be aware that an error has
+     occurred.
+
+  2. If the code needs to do some cleanup work, but then lets the
+     exception propagate upwards with ``raise``.  ``try...finally``
+     can be a better way to handle this case.
+
+- Additionally, for all try/except clauses, limit the ``try`` clause
+  to the absolute minimum amount of code necessary.  Again, this
+  avoids masking bugs.
+
+  Yes::
+
+      try:
+          value = collection[key]
+      except KeyError:
+          return key_not_found(key)
+      else:
+          return handle_value(value)
+
+  No::
+
+      try:
+          # Too broad!
+          return handle_value(collection[key])
+      except KeyError:
+          # Will also catch KeyError raised by handle_value()
+          return key_not_found(key)
+
+- Context managers should be invoked through separate functions or methods
+  whenever they do something other than acquire and release resources.
+  For example:
+
+  Yes::
+
+               with conn.begin_transaction():
+                   do_stuff_in_transaction(conn)
+
+  No::
+
+               with conn:
+                   do_stuff_in_transaction(conn)
+
+  The latter example doesn't provide any information to indicate that
+  the __enter__ and __exit__ methods are doing something other than
+  closing the connection after a transaction.  Being explicit is
+  important in this case.
+
+- Use string methods instead of the string module.
+
+  String methods are always much faster and share the same API with
+  unicode strings.  Override this rule if backward compatibility with
+  Pythons older than 2.0 is required.
+
+- Use ``''.startswith()`` and ``''.endswith()`` instead of string
+  slicing to check for prefixes or suffixes.
+
+  startswith() and endswith() are cleaner and less error prone.  For
+  example::
+
+      Yes: if foo.startswith('bar'):
+      No:  if foo[:3] == 'bar':
+
+  The exception is if your code must work with Python 1.5.2 (but let's
+  hope not!).
+
+- Object type comparisons should always use isinstance() instead of
+  comparing types directly. ::
+
+      Yes: if isinstance(obj, int):
+
+      No:  if type(obj) is type(1):
+
+  When checking if an object is a string, keep in mind that it might
+  be a unicode string too!  In Python 2.3, str and unicode have a
+  common base class, basestring, so you can do::
+
+      if isinstance(obj, basestring):
+
+- For sequences, (strings, lists, tuples), use the fact that empty
+  sequences are false. ::
+
+      Yes: if not seq:
+           if seq:
+
+      No: if len(seq)
+          if not len(seq)
+
+- Don't write string literals that rely on significant trailing
+  whitespace.  Such trailing whitespace is visually indistinguishable
+  and some editors (or more recently, reindent.py) will trim them.
+
+- Don't compare boolean values to True or False using ``==``. ::
+
+      Yes:   if greeting:
+      No:    if greeting == True:
+      Worse: if greeting is True:
+
+- The Python standard library will not use function annotations as
+  that would result in a premature commitment to a particular
+  annotation style.  Instead, the annotations are left for users to
+  discover and experiment with useful annotation styles.
+
+  Early core developer attempts to use function annotations revealed
+  inconsistent, ad-hoc annotation styles.  For example:
+
+  * ``[str]`` was ambiguous as to whether it represented a list of
+    strings or a value that could be either *str* or *None*.
+
+  * The notation ``open(file:(str,bytes))`` was used for a value that
+    could be either *bytes* or *str* rather than a 2-tuple containing
+    a *str* value followed by a *bytes* value.
+
+  * The annotation ``seek(whence:int)`` exhibited a mix of
+    over-specification and under-specification: *int* is too
+    restrictive (anything with ``__index__`` would be allowed) and it
+    is not restrictive enough (only the values 0, 1, and 2 are
+    allowed).  Likewise, the annotation ``write(b: bytes)`` was also
+    too restrictive (anything supporting the buffer protocol would be
+    allowed).
+
+  * Annotations such as ``read1(n: int=None)`` were self-contradictory
+    since *None* is not an *int*.  Annotations such as
+    ``source_path(self, fullname:str) -> object`` were confusing about
+    what the return type should be.
+
+  * In addition to the above, annotations were inconsistent in the use
+    of concrete types versus abstract types:  *int* versus *Integral*
+    and set/frozenset versus MutableSet/Set.
+
+  * Some annotations in the abstract base classes were incorrect
+    specifications.  For example, set-to-set operations require
+    *other* to be another instance of *Set* rather than just an
+    *Iterable*.
+
+  * A further issue was that annotations become part of the
+    specification but weren't being tested.
+
+  * In most cases, the docstrings already included the type
+    specifications and did so with greater clarity than the function
+    annotations.  In the remaining cases, the docstrings were improved
+    once the annotations were removed.
+
+  * The observed function annotations were too ad-hoc and inconsistent
+    to work with a coherent system of automatic type checking or
+    argument validation.  Leaving these annotations in the code would
+    have made it more difficult to make changes later so that
+    automated utilities could be supported.
+
+
+References
+==========
+
+.. [1] PEP 7, Style Guide for C Code, van Rossum
+
+.. [2] Barry's GNU Mailman style guide
+       http://barry.warsaw.us/software/STYLEGUIDE.txt
+
+.. [3] http://www.wikipedia.com/wiki/CamelCase
+
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+

+..
+   Local Variables:
+   mode: indented-text
+   indent-tabs-mode: nil
+   sentence-end-double-space: t
+   fill-column: 70
+   coding: utf-8
+   End:
diff --git a/doc/pep-0257.txt b/doc/pep-0257.txt
new file mode 100644
index 0000000..58a1ec0
--- /dev/null
+++ b/doc/pep-0257.txt
@@ -0,0 +1,328 @@
+PEP: 257
+Title: Docstring Conventions
+Version: $Revision: e2b5d1a8a663 $
+Last-Modified: $Date: 2009/01/18 09:50:42 $
+Author: David Goodger <goodger at python.org>,
+        Guido van Rossum <guido at python.org>
+Discussions-To: doc-sig at python.org
+Status: Active
+Type: Informational
+Content-Type: text/x-rst
+Created: 29-May-2001
+Post-History: 13-Jun-2001
+
+
+Abstract
+========
+
+This PEP documents the semantics and conventions associated with
+Python docstrings.
+
+
+Rationale
+=========
+
+The aim of this PEP is to standardize the high-level structure of
+docstrings: what they should contain, and how to say it (without
+touching on any markup syntax within docstrings).  The PEP contains
+conventions, not laws or syntax.
+
+    "A universal convention supplies all of maintainability, clarity,
+    consistency, and a foundation for good programming habits too.
+    What it doesn't do is insist that you follow it against your will.
+    That's Python!"
+
+    -- Tim Peters on comp.lang.python, 2001-06-16
+
+If you violate these conventions, the worst you'll get is some dirty
+looks.  But some software (such as the Docutils_ docstring processing
+system [1]_ [2]_) will be aware of the conventions, so following them
+will get you the best results.
+
+
+Specification
+=============
+
+What is a Docstring?
+--------------------
+
+A docstring is a string literal that occurs as the first statement in
+a module, function, class, or method definition.  Such a docstring
+becomes the ``__doc__`` special attribute of that object.
+
+All modules should normally have docstrings, and all functions and
+classes exported by a module should also have docstrings.  Public
+methods (including the ``__init__`` constructor) should also have
+docstrings.  A package may be documented in the module docstring of
+the ``__init__.py`` file in the package directory.
+
+String literals occurring elsewhere in Python code may also act as
+documentation.  They are not recognized by the Python bytecode
+compiler and are not accessible as runtime object attributes (i.e. not
+assigned to ``__doc__``), but two types of extra docstrings may be
+extracted by software tools:
+
+1. String literals occurring immediately after a simple assignment at
+   the top level of a module, class, or ``__init__`` method are called
+   "attribute docstrings".
+
+2. String literals occurring immediately after another docstring are
+   called "additional docstrings".
+
+Please see PEP 258, "Docutils Design Specification" [2]_, for a
+detailed description of attribute and additional docstrings.
+
+XXX Mention docstrings of 2.2 properties.
+
+For consistency, always use ``"""triple double quotes"""`` around
+docstrings.  Use ``r"""raw triple double quotes"""`` if you use any
+backslashes in your docstrings.  For Unicode docstrings, use
+``u"""Unicode triple-quoted strings"""``.
+
+There are two forms of docstrings: one-liners and multi-line
+docstrings.
+
+
+One-line Docstrings
+--------------------
+
+One-liners are for really obvious cases.  They should really fit on
+one line.  For example::
+
+    def kos_root():
+        """Return the pathname of the KOS root directory."""
+        global _kos_root
+        if _kos_root: return _kos_root
+        ...
+
+Notes:
+
+- Triple quotes are used even though the string fits on one line.
+  This makes it easy to later expand it.
+
+- The closing quotes are on the same line as the opening quotes.  This
+  looks better for one-liners.
+
+- There's no blank line either before or after the docstring.
+
+- The docstring is a phrase ending in a period.  It prescribes the
+  function or method's effect as a command ("Do this", "Return that"),
+  not as a description; e.g. don't write "Returns the pathname ...".
+
+- The one-line docstring should NOT be a "signature" reiterating the
+  function/method parameters (which can be obtained by introspection).
+  Don't do::
+
+      def function(a, b):
+          """function(a, b) -> list"""
+
+  This type of docstring is only appropriate for C functions (such as
+  built-ins), where introspection is not possible.  However, the
+  nature of the *return value* cannot be determined by introspection,
+  so it should be mentioned.  The preferred form for such a docstring
+  would be something like::
+
+      def function(a, b):
+          """Do X and return a list."""
+
+  (Of course "Do X" should be replaced by a useful description!)
+
+
+Multi-line Docstrings
+----------------------
+
+Multi-line docstrings consist of a summary line just like a one-line
+docstring, followed by a blank line, followed by a more elaborate
+description.  The summary line may be used by automatic indexing
+tools; it is important that it fits on one line and is separated from
+the rest of the docstring by a blank line.  The summary line may be on
+the same line as the opening quotes or on the next line.  The entire
+docstring is indented the same as the quotes at its first line (see
+example below).
+
+Insert a blank line before and after all docstrings (one-line or
+multi-line) that document a class -- generally speaking, the class's
+methods are separated from each other by a single blank line, and the
+docstring needs to be offset from the first method by a blank line;
+for symmetry, put a blank line between the class header and the
+docstring.  Docstrings documenting functions or methods generally
+don't have this requirement, unless the function or method's body is
+written as a number of blank-line separated sections -- in this case,
+treat the docstring as another section, and precede it with a blank
+line.
+
+The docstring of a script (a stand-alone program) should be usable as
+its "usage" message, printed when the script is invoked with incorrect
+or missing arguments (or perhaps with a "-h" option, for "help").
+Such a docstring should document the script's function and command
+line syntax, environment variables, and files.  Usage messages can be
+fairly elaborate (several screens full) and should be sufficient for a
+new user to use the command properly, as well as a complete quick
+reference to all options and arguments for the sophisticated user.
+
+The docstring for a module should generally list the classes,
+exceptions and functions (and any other objects) that are exported by
+the module, with a one-line summary of each.  (These summaries
+generally give less detail than the summary line in the object's
+docstring.)  The docstring for a package (i.e., the docstring of the
+package's ``__init__.py`` module) should also list the modules and
+subpackages exported by the package.
+
+The docstring for a function or method should summarize its behavior
+and document its arguments, return value(s), side effects, exceptions
+raised, and restrictions on when it can be called (all if applicable).
+Optional arguments should be indicated.  It should be documented
+whether keyword arguments are part of the interface.
+
+The docstring for a class should summarize its behavior and list the
+public methods and instance variables.  If the class is intended to be
+subclassed, and has an additional interface for subclasses, this
+interface should be listed separately (in the docstring).  The class
+constructor should be documented in the docstring for its ``__init__``
+method.  Individual methods should be documented by their own
+docstring.
+
+If a class subclasses another class and its behavior is mostly
+inherited from that class, its docstring should mention this and
+summarize the differences.  Use the verb "override" to indicate that a
+subclass method replaces a superclass method and does not call the
+superclass method; use the verb "extend" to indicate that a subclass
+method calls the superclass method (in addition to its own behavior).
+
+*Do not* use the Emacs convention of mentioning the arguments of
+functions or methods in upper case in running text.  Python is case
+sensitive and the argument names can be used for keyword arguments, so
+the docstring should document the correct argument names.  It is best
+to list each argument on a separate line.  For example::
+
+    def complex(real=0.0, imag=0.0):
+        """Form a complex number.
+
+        Keyword arguments:
+        real -- the real part (default 0.0)
+        imag -- the imaginary part (default 0.0)
+
+        """
+        if imag == 0.0 and real == 0.0: return complex_zero
+        ...
+
+The BDFL [3]_ recommends inserting a blank line between the last
+paragraph in a multi-line docstring and its closing quotes, placing
+the closing quotes on a line by themselves.  This way, Emacs'
+``fill-paragraph`` command can be used on it.
+
+
+Handling Docstring Indentation
+------------------------------
+
+Docstring processing tools will strip a uniform amount of indentation
+from the second and further lines of the docstring, equal to the
+minimum indentation of all non-blank lines after the first line.  Any
+indentation in the first line of the docstring (i.e., up to the first
+newline) is insignificant and removed.  Relative indentation of later
+lines in the docstring is retained.  Blank lines should be removed
+from the beginning and end of the docstring.
+
+Since code is much more precise than words, here is an implementation
+of the algorithm::
+
+    def trim(docstring):
+        if not docstring:
+            return ''
+        # Convert tabs to spaces (following the normal Python rules)
+        # and split into a list of lines:
+        lines = docstring.expandtabs().splitlines()
+        # Determine minimum indentation (first line doesn't count):
+        indent = sys.maxint
+        for line in lines[1:]:
+            stripped = line.lstrip()
+            if stripped:
+                indent = min(indent, len(line) - len(stripped))
+        # Remove indentation (first line is special):
+        trimmed = [lines[0].strip()]
+        if indent < sys.maxint:
+            for line in lines[1:]:
+                trimmed.append(line[indent:].rstrip())
+        # Strip off trailing and leading blank lines:
+        while trimmed and not trimmed[-1]:
+            trimmed.pop()
+        while trimmed and not trimmed[0]:
+            trimmed.pop(0)
+        # Return a single string:
+        return '\n'.join(trimmed)
+
+The docstring in this example contains two newline characters and is
+therefore 3 lines long.  The first and last lines are blank::
+
+    def foo():
+        """
+        This is the second line of the docstring.
+        """
+
+To illustrate::
+
+    >>> print repr(foo.__doc__)
+    '\n    This is the second line of the docstring.\n    '
+    >>> foo.__doc__.splitlines()
+    ['', '    This is the second line of the docstring.', '    ']
+    >>> trim(foo.__doc__)
+    'This is the second line of the docstring.'
+
+Once trimmed, these docstrings are equivalent::
+
+    def foo():
+        """A multi-line
+        docstring.
+        """
+
+    def bar():
+        """
+        A multi-line
+        docstring.
+        """
+
+
+References and Footnotes
+========================
+
+.. [1] PEP 256, Docstring Processing System Framework, Goodger
+   (http://www.python.org/dev/peps/pep-0256/)
+
+.. [2] PEP 258, Docutils Design Specification, Goodger
+   (http://www.python.org/dev/peps/pep-0258/)
+
+.. [3] Guido van Rossum, Python's creator and Benevolent Dictator For
+   Life.
+
+.. _Docutils: http://docutils.sourceforge.net/
+
+.. _Python Style Guide:
+   http://www.python.org/doc/essays/styleguide.html
+
+.. _Doc-SIG: http://www.python.org/sigs/doc-sig/
+
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+Acknowledgements
+================
+
+The "Specification" text comes mostly verbatim from the `Python Style
+Guide`_ essay by Guido van Rossum.
+
+This document borrows ideas from the archives of the Python Doc-SIG_.
+Thanks to all members past and present.
+
+
+

+..
+   Local Variables:
+   mode: indented-text
+   indent-tabs-mode: nil
+   fill-column: 70
+   sentence-end-double-space: t
+   End:
diff --git a/doc/signal_mess.txt b/doc/signal_mess.txt
new file mode 100644
index 0000000..543cbca
--- /dev/null
+++ b/doc/signal_mess.txt
@@ -0,0 +1,49 @@
+This is my attempt to tame the current signal mess on VisTrails.
+
+--------------------------------------------------------------------------------
+
+vistrailChanged is emitted by QViewManager.vistrailChanged
+		   	      QViewManager.closeVistrail
+		   	      VistrailController.invalidate_version_tree
+                              QVersionTab.vistrailChanged
+
+QVersionTab::vistrailChanged is caught by QViewManager.vistrailChanged
+
+VistrailController::vistrailChanged is caught by QVersionTab.vistrailChanged
+
+VistrailController::vistrailChanged is caught by QQueryTab.vistrailChanged
+
+QViewManager::vistrailChanged is caught by QBuilderWindow.vistrailChanged
+
+invalidate_version_tree 
+
+--------------------------------------------------------------------------------
+
+stateChanged is emitted by VistrailController.setChanged
+	     		   VistrailController.setFileName
+
+VistrailController::stateChanged is caught by QVistrailView.stateChanged
+
+--------------------------------------------------------------------------------
+
+versionSelectionChange is emitted by QViewManager.versionSelectionChange
+		       	  	     QViewManager.redo
+				     QViewManager.undo
+				     QViewManager.closeVistrail
+				     QViewManager.currentChanged
+				     QVersionTab.versionSelected
+
+QVersionTab::versionSelectionChange is caught by QVistrailView.versionSelectionChange
+
+QVersionTab::versionSelectionChange is caught by QViewManager.versionSelectionChange
+
+QViewManager::versionSelectionChange is caught by QBuilderWindow.versionSelectionChange
+
+--------------------------------------------------------------------------------
+
+versionWasChanged is emitted by VistrailController.changeSelectedVersion
+		     	     	VistrailController.resendVersionWasChanged
+				VistrailController.setVersion
+
+VistrailController::versionWasChanged is caught by QPipelineTab.versionChanged
+
diff --git a/doc/source_tree_overview.tex b/doc/source_tree_overview.tex
new file mode 100644
index 0000000..b41723a
--- /dev/null
+++ b/doc/source_tree_overview.tex
@@ -0,0 +1,102 @@
+% test
+
+\documentclass{article}
+
+\begin{document}
+
+\title{VisTrails Source Tree Overview}
+
+\author{VisTrails development team}
+
+\maketitle
+
+\abstract{This document is intended to provide an overview of the layout of the
+source tree of VisTrails, as presented by a Subversion checkout of
+trunk.}
+
+\section{Basic Directory layout}
+
+\begin{verbatim}
+./
+./dist/
+./examples/
+./examples/data/
+./extensions/
+./packages/
+./scripts/
+./vistrails/
+./vistrails/api/
+./vistrails/core/
+./vistrails/db/
+./vistrails/doc/
+./vistrails/gui/
+./vistrails/packages/
+./vistrails/tests/
+\end{verbatim}
+
+\section{Top-level directories}
+
+The main VisTrails application lives entirely in the vistrails
+subdirectory. All vistrail files with example functionality reside in
+the examples subdirectory, and any necessary data should go in
+examples/data. 
+
+The dist subdirectory includes code and documentation necessary to
+create VisTrails stand-alone distributions in several different
+operating systems (Linux, Windows, OS X, etc).
+
+Although originally developed as a stand-alone application, VisTrails
+has now been extended in many ways. These live, unsurprisingly, in the
+extensions directory. Currently, we have mediawiki and latex plugins,
+and a web interface for VisTrails. 
+
+Most VisTrails packages should be in the top-level packages
+subdirectory. The reason there exists two packages directories is so
+that we can conveniently select the set of packages that will be
+included in a standard VisTrails distribution. All these default
+packages should be in vistrails/packages. Notice that these packages
+will be included in distributions for different operating systems, so
+try to make sure necessary libraries are available, and that your code
+is portable.
+
+The scripts directory includes various scripts that help the
+administration of VisTrails source code, services and examples. 
+
+All documentation for VisTrails developers (including this file)
+reside on doc.
+
+\section{The vistrails directory}
+
+The VisTrails application source tree itself is loosely organized in
+different components that live in different directories. All the basic
+Python classes for modules, connections, workflows, etc live in
+vistrails/core. As a rule of thumb, the classes in the core component
+are agnostic to storage (handled by the db component) and have to user
+interface knowledge (handled by the gui component). This was
+originally intended in part to allow a separation of developers with
+Qt/PyQt4 licenses and developers without Qt/PyQt4 licenses.  The db
+component is fairly involved and uses a particular source layout
+intended to simplify the creation of new schemas and versions, as
+described in Section~\ref{sec:db}.
+
+As a general rule, all code that derives from PyQt4 classes should go
+in the vistrails/gui subdirectory. If that is not possible for some
+reason, such code should be clearly marked and documented.
+
+VisTrails can also be used as a library, and the api subdirectory
+includes several helper python functions and classes to access
+VisTrails functionality programmatically. If you intend to write code
+that will script VisTrails executions, or are using the VisTrails
+shell regularly and have a new function that will be handy in that
+scenario, the vistrails/api subdirectory is the correct place to put
+the code.
+
+The testing suite infrastructure lives in vistrails/tests. All the
+necessary files for the test cases, in particular, should be inside
+vistrails/tests/resources.
+
+\subsection{The vistrails/db directory}\label{sec:db}
+
+TBW.
+
+\end{document}
diff --git a/doc/usersguide/Makefile b/doc/usersguide/Makefile
new file mode 100644
index 0000000..5cd524d
--- /dev/null
+++ b/doc/usersguide/Makefile
@@ -0,0 +1,89 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html      to make standalone HTML files"
+	@echo "  dirhtml   to make HTML files named index.html in directories"
+	@echo "  pickle    to make pickle files"
+	@echo "  json      to make JSON files"
+	@echo "  htmlhelp  to make HTML files and a HTML help project"
+	@echo "  qthelp    to make HTML files and a qthelp project"
+	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  changes   to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck to check all external links for integrity"
+	@echo "  doctest   to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/VisTrails.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/VisTrails.qhc"
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
+	      "run these through (pdf)latex."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/doc/usersguide/_static/mystyle.css b/doc/usersguide/_static/mystyle.css
new file mode 100644
index 0000000..0fe6e1a
--- /dev/null
+++ b/doc/usersguide/_static/mystyle.css
@@ -0,0 +1,5 @@
+ at import url("default.css");
+
+.red {
+    color: #ff0000;
+}
\ No newline at end of file
diff --git a/doc/usersguide/analogies.rst b/doc/usersguide/analogies.rst
new file mode 100644
index 0000000..f323e6f
--- /dev/null
+++ b/doc/usersguide/analogies.rst
@@ -0,0 +1,142 @@
+.. _chap-analogies:
+
+***************************************
+Using Analogies to Update Workflows
+***************************************
+
+.. index:: analogy
+
+In Chapter :ref:`chap-version_tree`, we saw how the provenance data maintained by |vistrails| allows you to compare different versions of a workflow. In Chapter :ref:`chap-querying`, you learned how this same provenance information forms the basis of an elegant Query by Example mechanism, letting you find all versions of a workflow that match a given arrangement of modules. In this chapter, we will see yet another benefit of the |vistrails| provenance architecture. Through a process we c [...]
+
+Visualization by Analogy
+========================
+
+The main idea behind visualization by analogy is as follows. Given two versions of a workflow (called the "source" and "target" versions, respectively), |vistrails| can automatically find the differences between them and apply those differences to another (potentially unrelated) workflow. This powerful feature lets you create a new visualization without having to add or remove modules to/from the pipeline. |vistrails| takes care of these details for you behind the scenes.
+
+There are two distinct user interfaces for constructing visualizations by analogy. In the first, you set up the analogy in the ``Visual Diff`` window. In the second, you interact with the Spreadsheet. Both ways are logically equivalent, and which method you use will be largely a matter of personal preference.
+
+Before explaining either approach, however, let's first set up the vistrail that we'll be using as a running example in this chapter.
+
+.. topic:: Try it now!
+
+   Open the :vtl:`vtk\_http.vt` vistrail, located in the examples directory of the |vistrails| distribution. If the ``tetra mesh contour`` version is not selected, go to the ``History`` view and select it. This will be our "source" workflow. Execute this workflow, and take a look at the resultant visualization in the Spreadsheet.
+
+   We will now create our "target" workflow.  Switch to the ``Pipeline`` view and add a new module, ``vtkSmoothPolyDataFilter`` between the ``vtkContourFilter`` and ``vtkDataSetMapper`` modules. Your modified pipeline should resemble the one shown in Figure :ref:`Modified pipeline for use in our example <fig-analogy_setupa>`.
+
+   Next, let's adjust some of the parameters for the new module. Select the ``vtkSmoothPolyDataFilter`` module. In the ``Module Information`` panel, select ``SetNumberOfIterations`` and type 20 in the input box. Then, select ``SetRelaxationFactor`` enter 0.5. Now, execute this workflow, and compare the two results in the Spreadsheet.
+
+   Return to the ``History`` view, and give your new version a meaningful tag such as ``smoothed`` (Figure :ref:`Corresponding version tree <fig-analogy_setupb>`). Finally, select the ``Fran Cut`` version and execute it too. Your spreadsheet should now resemble the one shown in Figure :ref:`Analogy example... <fig-analogy_spreadsheet1>`.
+
+.. %\begin{figure}
+.. %\centering
+.. %\includegraphics[width=2in,clip=false]{analogy_setup.png}
+.. %\caption{Modified pipeline for use in our example.}
+.. %\label{fig-analogy_setup}
+.. %\end{figure}
+
+.. fig-analogy_setup
+
+.. _fig-analogy_setupa:
+
+.. figure:: figures/analogies/analogy_setup.png
+   :height: 2in
+   :align: center
+
+   Modified pipeline for use in our example.
+
+.. _fig-analogy_setupb:
+
+.. figure:: figures/analogies/analogy_setup2.png
+   :height: 2in
+   :align: center
+
+   Corresponding version tree.
+
+.. _fig-analogy_spreadsheet1:
+
+.. figure:: figures/analogies/analogy_spreadsheet1.png
+   :width: 5in
+   :align: center
+
+   Analogy example - \(top left\) Original tetrahedral mesh model. \(top right\) Smoothed tetrahedral mesh. \(bottom left\) "Fran Cut" model.
+
+Using the Visual Diff Window
+============================
+
+.. index:: 
+   pair: analogy; visual diff
+
+By creating an analogy, you're telling |vistrails| to analyze and store the differences between the "source" and "target" versions of a workflow.  Then when you apply that analogy to another (perhaps completely different) version of the workflow, |vistrails| attempts to make similar types of changes to this other workflow.
+
+One way to create an analogy is to run a ``Visual Diff`` between the "source" and "target" workflows. Recall from Chapter :ref:`chap-version_tree` that to perform a ``Visual Diff`` between two versions of a workflow, you need to drag the icon for one version atop the icon for the other. However, in the case of analogies, the sequence is important. In order for the analogy to work correctly, the icon for the *source* version of the workflow must be dragged atop the icon for the *target* v [...]
+
+In the toolbar of the ``Diff Properties`` window, there is a button whose tooltip is labeled ``Create Analogy`` (Figure :ref:`Click the Create Analogy button... <fig-analogy_diff>`).  Clicking the ``Create Analogy`` will open up a dialog that lets you give this analogy a descriptive name. 
+Once the analogy has a name, you can then apply it to any version of the workflow. This is done by returning to the ``History`` view, and selecting then right-clicking the version you want to apply the analogy to. A menu will appear, showing you a list of available analogies. Choose the one you want, and |vistrails| will attempt to apply the selected analogy to this version of the workflow.
+
+.. _fig-analogy_diff:
+
+.. figure:: figures/analogies/analogy_diff.png
+   :width: 4.5in
+   :align: center
+
+   Click the ``Create Analogy`` button in the ``Diff Properties`` window to create a named analogy.
+
+.. topic:: Try it now!
+
+   In the ``History`` view, drag the ``tetra mesh contour`` icon (the "source" version) atop the ``smoothed`` icon (the "target" version). A ``Visual Diff`` window will open. Click the ``Create Analogy`` button in the toolbar and then choose a name for this analogy, for example "SmoothFilter."  Close the  ``Visual Diff`` window. Select the ``Fran Cut`` icon in the ``History`` view so that it is highlighted, then right-click to access the ``Perform analogy`` menu. Choose the name of the a [...]
+
+.. _fig-analogy_menu:
+
+.. figure:: figures/analogies/analogy_menu.png
+   :width: 3in
+   :align: center
+
+   Access the ``Perform analogy`` menu by right-clicking on a selected icon in the version tree.
+
+.. _fig-analogy_spreadsheet2:
+
+.. figure:: figures/analogies/analogy_spreadsheet2.png
+   :width: 5in
+   :align: center
+
+   Result of applying a smoothing analogy to a different workflow.
+
+Using the Spreadsheet
+=====================
+
+You can also create and apply analogies directly in the Spreadsheet, without the use of the ``Visual Diff`` window. The Spreadsheet uses a simple "drag and drop" interface to manipulate analogies, and many users find it simpler to work with than the method described above. The drawback is that the Spreadsheet does not allow you to name your analogies like the ``Visual Diff`` window does.
+
+The Spreadsheet must be in Editing Mode in order to use analogies. Please refer to Chapter :ref:`chap-spreadsheet` for more information about the Spreadsheet's modes. Identify the two cells representing the "source" and "target" visualizations for which you wish to create an analogy. Drag the ``Create Analogy`` icon *from* the "source" *to* the "target." This creates an analogy that you can use to apply changes to other workflows. To apply an analogy to another version, drag the ``Apply  [...]
+
+The following example illustrates how to use analogies within the Spreadsheet. If you completed the previous "Try it now!" exercise, first clear the cell containing the smoothed version of the ``Fran Cut`` model, so that it won't interfere with the present example. The Spreadsheet should again resemble Figure :ref:`Analogy example... <fig-analogy_spreadsheet1>`.
+
+.. topic:: Try it now!
+
+   Switch to the Spreadsheet's Editing Mode by hitting 'Ctrl-Shift-E.' Create the analogy by dragging the ``Create Analogy`` icon from the top-left cell over to the top-right cell (Figure :ref:`Drag the Create Analogy icon from the source cell... <fig-analogies-dnd1>`). Next, apply this analogy to the ``Fran Cut`` model by dragging the ``Apply Analogy`` icon from the bottom-left cell over to the bottom-right cell (Figure :ref:`Drag the Apply Analogy icon from the cell you wish to modify. [...]
+
+.. _fig-analogy_dnd:
+
+.. _fig-analogies-dnd1:
+
+.. figure:: figures/analogies/analogy_dnd1.png
+   :height: 2.5in
+   :align: center
+
+   Drag the ``Create Analogy`` icon *from* the "source" cell *to* the "target" cell to create an analogy.
+
+.. _fig-analogies-dnd2:
+
+.. figure:: figures/analogies/analogy_dnd2.png
+   :height: 2.5in
+   :align: center
+
+   Drag the ``Apply Analogy`` icon *from* the cell you wish to modify *to* an empty cell.
+
+Regardless of whether you use the ``Visual Diff`` interface or the Spreadsheet interface to create your analogy, the end result is the same. To verify this, you can inspect the ``Pipeline`` view for the newly created version of the workflow. All the module(s) necessary to implement the analogy's behavior are automatically inserted by |vistrails| at the correct locations in the pipeline.
+
+Notes
+=====
+
+.. %While it is also possible to create analogies among three or more versions of a workflow, this is an advanced feature and is not covered in this user's guide.
+
+Creating visualizations by analogy is a relatively new feature of |vistrails|, and as such is not yet fully mature. Although it works well for the examples presented herein, our algorithm may fail to create intuitive visualizations on other pipelines. Furthermore, it is not yet possible to save an analogy, nor apply an analogy to a vistrail other than the one in which it was created. Please contact the |vistrails| development team with any bug reports and/or suggestions.
diff --git a/doc/usersguide/batch.rst b/doc/usersguide/batch.rst
new file mode 100644
index 0000000..526a954
--- /dev/null
+++ b/doc/usersguide/batch.rst
@@ -0,0 +1,381 @@
+.. _chap-cli:
+
+**********************
+Command-line Arguments
+**********************
+
+Starting |vistrails| via the Command Line
+=========================================
+
+.. index:: command line arguments
+
+|vistrails| supports a number of command-line arguments that let you modify certain attributes and behaviors of the program. When invoking |vistrails| from the command line, the arguments are placed after the "run.py" filename. For example,
+
+   ``python vistrails/run.py -n``
+
+suppresses the |vistrails| splash screen. Table :ref:`table-batch-cli` contains a complete list of the command line switches supported by \vistrails. Each command line switch has both a short form and a long form. The two forms are logically equivalent, and which one you use is a matter of personal preference. The short form consists of a single minus sign "-" followed by a single letter. The longer form uses two minus signs "--" followed by a descriptive word. For example, the above com [...]
+
+   ``python vistrails/run.py --nosplash``
+
+
+In addition to the explicit switches listed in Table :ref:`table-batch-cli`, the |vistrails| command line also lets you indicate the filename of the vistrail you wish to open. For example, assuming your "examples" directory is one level above your current working directory, this is how you would tell |vistrails| to load the "lung.vt" example at startup:
+
+   ``python vistrails/run.py ../examples/lung.vt``
+
+
+Moreover, if you want |vistrails| to start on a *specific version* of the pipeline within the vistrail, you can indicate that version's tag name on the command line. The filename and version tag should be separated by a colon. For example, to start |vistrails| with the ``colormap`` version of the "lung.vt" vistrail, use:
+
+   ``python vistrails/run.py ../examples/lung.vt:colormap``
+
+
+In the event that the version you want to open contains a space in its tag name, simply surround the entire "filename:tag" pair in double quotes. For example:
+
+   ``python vistrails/run.py "../examples/lung.vt:Axial View"``
+
+
+You can also open up multiple vistrails at once by listing more than one vistrail file on the command line. This causes the vistrails to be opened in separate tabs, just as if you had opened them via the GUI. For example:
+
+   ``python vistrails/run.py ../examples/lung.vt ../examples/head.vt``
+
+
+You can specify version tags in conjunction with multiple filenames. Here is an example of an elaborate command-line invocation that opens two vistrails and sets each one to a specific version:
+
+   ``python vistrails/run.py "../examples/lung.vt:Axial View" ../examples/head.vt:bone``
+
+
+
+.. topic:: Note:
+
+   As of this writing, the |vistrails| development team is refactoring the implementation of many of the command-line switches presented in Table :ref:`table-batch-cli`. As such, depending on your version of |vistrails|, the results you achieve may not match those described. For a list of known issues with the command line switches, please refer to the |vistrails| website.
+
+.. raw::latex
+   \begin{table}
+   \caption{Command line arguments supported by VisTrails.}
+   \label{table:batch:cli}
+   \begin{center}
+   \begin{tabular}{ | l | l | p{3in} | }
+   \hline 
+   \textbf{Short form} & \textbf{Long form} & \textbf{Description} \\
+   \hline 
+     -h & -$\,$-help & Print a help message and exit. \\
+   \hline
+     -S \emph{/path} & -$\,$-startup=\emph{/path} &
+                           Set user configuration directory (default is \texttt{$\sim$/.vistrails})
+   %% (Not fully working. see Ticket 213)
+   \\
+   \hline
+     -? & &                Print a help message and exit. \\
+   \hline
+     -v & -$\,$-version &      Print version information and exit. \\
+   \hline
+     -V \emph{num} &  -$\,$-verbose=\emph{num} &
+                           Set verboseness level (0--2, default=0, higher means
+                           more verbose). \\
+   \hline
+     -b & -$\,$-noninteractive & Run in non-interactive (batch) mode. \\
+   \hline
+     -n & -$\,$-nosplash &       Do not display splash screen on startup. \\
+    \hline
+     -q \emph{file} & -$\,$-quickstart=\emph{file} &
+                             Start VisTrails using the specified static registry. \\
+   \hline
+     -c \emph{num} & -$\,$-cache=\emph{num} &
+                           Enable/disable caching (0 to disable, nonzero to enable. Default is enabled). \\
+   \hline
+     -m \emph{num} & -$\,$-movies=\emph{num} &
+                           Set automatic movie creation on spreadsheet (0 or 1,
+                           default=1). Set this to zero to work around VTK bug
+                           with offscreen renderer and OpenGL texture3D mappers. \\
+   \hline
+     -s & -$\,$-multiheads &     Display the Builder and Spreadsheet on different
+                           screens (if available).
+   \\
+   \hline
+     -x & -$\,$-maximized &      Maximize Builder and Spreadsheet windows at startup. \\
+   \hline
+     -D & -$\,$-detachHistoryView &  Detach the history view from the builder window. \\
+   \hline
+     -l & -$\,$-nologger &       Disable logging. \\
+   \hline
+     -d & -$\,$-debugsignals &   Debug Qt Signals. \\
+   \hline
+     -a \emph{params} & -$\,$-parameters=\emph{params} &
+                           Set workflow parameters (non-interactive mode only). \\
+   \hline
+     -e \emph{dir} & -$\,$-dumpcells=\emph{dir} &
+                           Set directory to dump spreadsheet cells before exiting (non-interactive mode only). \\
+   \hline
+     -G & -$\,$-workflowgraph &
+                           Save workflow graph in specified directory without running 
+			   the workflow (non-interactive mode only).
+   \hline
+     -U & -$\,$-evolutiongraph &
+                           Save evolution graph in specified directory without running
+			   any workflowDump images in pdf format (non-interactive mode only).
+  \hline
+     -p & -$\,$-pdf &
+                           Dump images in pdf format (non-interactive mode only).
+   \hline
+     -g & -$\,$-noSingleInstance &
+                           Run VisTrails without the single instance restriction. \\
+   \hline
+     -t \emph{host} & -$\,$-host=\emph{host} & Set hostname or IP address of database server. \\
+   \hline
+     -r \emph{port} & -$\,$-port=\emph{port} & Set database port. \\
+   \hline
+     -f \emph{dbName} & -$\,$-db=\emph{dbName} & Set database name. \\
+   \hline
+     -u \emph{userName} & -$\,$-user=\emph{userName} & Set database username. \\
+   \hline
+   \end{tabular}
+   \end{center}
+   \end{table}
+
+.. tabularcolumns:: |l|l|p{7.5cm}|
+   
+.. _table-batch-cli:
+
+.. csv-table:: Command line arguments supported by |vistrails|.
+   :header: **Short form**, **Long form**, **Description**
+   :widths: 10, 15, 20
+
+   -h, :math:`--`\ help, Print a help message and exit.
+   -S */path*, -\ -startup=\ */path*, Set user configuration directory (default is :math:`\sim`\ ``/.vistrails``)
+   -?, , Print a help message and exit.
+   -v, --version, Print version information and exit.
+   -V *num*, --verbose=\ *num*, "Set verboseness level (0--2, default=0, higher means more verbose)."
+   -b, --noninteractive, Run in non-interactive (batch) mode.
+   -n, --nosplash, Do not display splash screen on startup.
+   -q *file*, --quickstart=\ *file*, Start VisTrails using the specified static registry. 
+   -c *num*, --cache=\ *num*, "Enable/disable caching (0 to disable, nonzero to enable. Default is enabled)."
+   -m *num*, --movies=\ *num*, "Set automatic movie creation on spreadsheet (0 or 1, default=1). Set this to zero to work around VTK bug with offscreen renderer and OpenGL texture3D mappers."
+   -s, --multiheads, Display the Builder and Spreadsheet on different screens (if available).
+   -x, --maximized, Maximize Builder and Spreadsheet windows at startup.
+   -P, --parameterExploration, execute Parameter Exploration.
+   -l, --nologger, Disable logging.
+   -d, --debugsignals, Debug Qt Signals.
+   -a *params*, --parameters=\ *params*, Set workflow parameters (non-interactive mode only).
+   -e *dir*, --dumpcells=\ *dir*, Set directory to dump spreadsheet cells before exiting (non-interactive mode only).
+   -G, --workflowgraph, Save workflow graph in specified directory without running the workflow (non-interactive mode only).
+   -U, --evolutiongraph, Save evolution graph in specified directory without running any workflow (non-interactive mode only).
+   -p, --pdf, Dump images in pdf format (non-interactive mode only).
+   -g, --noSingleInstance, Run VisTrails without the single instance restriction. 
+   -t *host*, --host=\ *host*, Set hostname or IP address of database server.
+   -r *port*, --port=\ *port*, Set database port.
+   -f *dbName*, --db=\ *dbName*, Set database name.
+   -u *userName*, --user=\ *userName*, Set database username.
+
+.. index:: configuration directory
+
+Specifying a User Configuration Directory
+=========================================
+
+In addition to the default .vistrails directory, VisTrails allows you to create and use additional configuration directories.  First, you will need to create a new directory.  This is done by running:
+ ``python vistrails/run.py -S /path_to_new_directory/new_directory_name``.  
+
+This will both create a new directory containing default configuration files and directories, and launch VisTrails, which will use the newly created files for configuration.  The user is then free to add desired configurations to the new directory.  Once a configuration directory exists, subsequent calls using the directory name (``python vistrails/run.py -S /path_to_directory/existing_directory``) will launch VisTrails using the 'existing_directory' for configuration and a new directory [...]
+
+**Note:** If you would like to copy configuration directories, you must change the references in copy_of_directory/startup.xml to point to the new directory instead of the original.
+
+.. _sec-cli-db:
+
+Passing Database Parameters on the Command Line
+===============================================
+
+As discussed in Chapter :ref:`chap-database`, |vistrails| can read and write vistrails stored in a relational database as well as in a filesystem. |vistrails| allows you to specify the name of the database server, the database name, the port number, and the username on the command line. This potentially saves you the trouble of filling out the same information on the database connection dialog. Note that, for security reasons, |vistrails| does not allow you to include a database password [...]
+
+The last four rows of Table :ref:`table-batch-cli` show the command-line switches that pertain to database connectivity. Be advised that these switches were designed primarily for use by VTL files (see Section :ref:`sec-cli-vtl`) and as such, are not necessarily user-friendly. In particular, these switches are ignored unless you also specify the vistrail ID and version name on the command line. For example, to open the ``contour`` version of the the "spx" vistrail (whose ID is 5) from th [...]
+
+   ``python vistrails/run.py -t vistrails.sci.utah.edu -f vistrails -u vistrails 5:contour``
+
+
+Once |vistrails| opens, you will be prompted to enter the password. Upon successful authentication, the vistrail is loaded from the database and opened to the pipeline corresponding to the specified version.
+
+.. _sec-cli-vtl:
+
+Using "Vistrail Link" Files
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As discussed in Chapter :ref:`chap-database`, one of the advantages of storing your vistrails on a database is that you can collaborate with others without having to pass around a .vt file or force all users to use a shared filesystem. A disadvantage is that you need to remember the parameters with which to connect to the database. Using a "Vistrail Link" (VTL) file reduces this inconvenience, and also eliminates the need to include the associated command-line switches to connect to the  [...]
+
+A VTL is a very small text (XML) file that contains the parameters required to load a vistrail from a database. VTL files are intended for use with a |vistrails|-enabled wiki. You can open a VTL either by saving the file and passing its filename to the command line, or by configuring your web browser to do this for you. Here is the syntax for using a VTL file on the command line:
+
+   ``python vistrails/run.py sample.vtl``
+
+
+Internally, |vistrails| parses the VTL file and loads the vistrail from the database exactly as if you had included its full parameter list on the command line.
+
+.. topic:: Note:
+
+   VTL is a relatively new feature of |vistrails|, and as such is neither fully developed nor completedly documented. Please contact the |vistrails| development team with any bug reports and/or suggestions.
+
+.. _sec-cli-batch:
+
+Running |vistrails| in Batch Mode
+=================================
+
+.. index::
+   single: batch mode
+   single: non-interactive mode
+
+Although |vistrails| is primarily intended to be run as an interactive, graphical client application, it also supports non-interactive use. |vistrails| can thus be invoked programmatically, \eg as part of a shell script. You can tell |vistrails| to start in non-interactive mode by using the "-b" or "--noninteractive" command line switch when launching \vistrails. [#]_
+
+Running |vistrails| in non-interactive mode has little effect, however, without an additional command line argument indicating which vistrail to load. Since we are running |vistrails| as part of a batch process, it only makes sense to execute vistrails whose output is something tangible, such as a file. A vistrail whose only output is an interactive rendering in a ``VTKCell``, for instance, would not be well-suited for running in batch mode.
+
+Consider the following example. The "offscreen.vt" vistrail (included in the "examples" directory) has a variety of output options, depending on which version you select in the ``History`` view (Figure :ref:`The different versions of the offscreen.vt vistrail... <fig-batch-version_tree>`). The version tagged ``only vtk`` displays its output as an interactive VTK rendering. The version tagged ``html`` creates a simple web page in the Spreadsheet. The ``offscreen`` version, however, output [...]
+
+   ``python vistrails/run.py -b ../examples/offscreen.vt:offscreen``
+
+.. _fig-batch-version_tree:
+
+.. figure:: figures/batch/offscreen_version_tree.png
+   :align: center
+   :width: 3in
+
+   The different versions of the "offscreen.vt" vistrail offer various forms of output.
+
+As you would expect, this command runs to completion without opening any windows. Instead, it silently loads the requested pipeline, executes it, and closes.
+Assuming it ran correctly, this pipeline should have created a file named "image.png" in the current directory.  When you view this file, it should resemble the picture in Figure :ref:`Running the offscreen version of offscreeen.vt in batch mode... <fig-batch-image_png>`.
+
+.. _fig-batch-image_png:
+
+.. figure:: figures/batch/offscreen_output.png
+   :align: center
+   :width: 2in
+
+   Running the ``offscreen`` version of "offscreen.vt" in batch mode produces an image named "image.png".
+
+Running a Specific Workflow in Batch Mode
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To run a specific workflow in batch mode, call |Vistrails| with the following options:
+
+   ``python vistrails/run.py -b path_to_vistrails_file:pipeline``
+
+where pipeline can be a version **tag name** or version **id**.
+
+.. topic:: Note
+
+   If you downloaded the MacOS X bundle, you can run |vistrails| from the command line via the following commands in the terminal.  Change the current directory to wherever VisTrails was installed (often /Applications), and then type:  ``Vistrails.app/Contents/MacOS/vistrails [<cmd_line_options>]``
+
+Running a Workflow with Specific Parameters
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+An alias is a name assigned to a parameter that allows you to reference that parameter in batch mode. An alias is created by clicking on the type of an existing parameter in VisTrails, then entering a name for it.
+
+.. _fig-batch-create_alias:
+
+.. figure:: figures/batch/create_alias.png
+   :align: center
+   :width: 50%
+
+   Example of creating an alias
+
+Users can change workflow parameters that have an alias through the command line.
+
+For example, offscreen pipeline in offscreen.vt always creates the file called image.png. If you want generate it with a different filename:
+
+``python vistrails/run.py -b ../examples/offscreen.vt:offscreen -a"filename=other.png"``
+
+filename in the example above is the alias name assigned to the parameter in the value method inside the String module. When running a pipeline from the command line, VisTrails will try to start the spreadsheet automatically if the pipeline requires it. For example, this other execution will also start the spreadsheet (attention to how $ characters are escaped when running on bash):
+
+``python vistrails/run.py -b ../examples/head.vt:aliases -a"isovalue=30\$&\$diffuse_color=0.8, 0.4, 0.2"``
+
+You can also execute more than one pipeline on the command line:
+
+``python vistrails/run.py -b ../examples/head.vt:aliases ../examples/spx.vt:spx \ -a"isovalue=30"``
+
+Use the -a parameter only once regardless the number of pipelines.
+
+.. %TODO should we cover aliases here?
+
+Accessing a Database in Batch Mode
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As discussed in Section :ref:`sec-cli-db`, you can specify most of the parameters of your database connection on the command line, but the password must be entered through the GUI. This poses a problem for running |vistrails| in non-interactive mode, since no database connection dialog will be opened. If your batch process needs to access vistrails stored on a database, the current workaround is to create a special account on the database (probably one with read-only access) that does *n [...]
+
+Using |vistrails| as a Server
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index:: server
+
+Using the VisTrails server mode, it is possible to execute workflows and control VisTrails through another application. For example, the CrowdLabs Web portal (http://www.crowdlabs.org) accesses a VisTrails sever to execute workflows, retrieve and display vistrail trees and workflows.
+
+The way you access the server is by doing XML-RPC calls. In the current VisTrails release, we include a set of PHP scripts that can talk to a VisTrails server instance. They are in "extensions/http" folder. The files are reasonably well documented. Also, it should be not difficult to create python scripts to access the server (just use xmlrpclib module).
+
+Note that the VisTrails server requires the provenance and workflows to be in a database. More detailed instructions on how to setup the server and the database are available in :ref:`chap-vistrails-server` and in :ref:`sec-database-setup`.
+
+If what you want is just to execute a series of workflows in batch mode, a simpler solution would be to use the VisTrails client in batch mode (see Section :ref:`sec-cli-batch`). 
+
+Executing Workflows in Parallel
+===============================
+
+The VisTrails server can only execute pipelines in parallel if there's more than one instance of VisTrails running. The command
+
+``self.rpcserver=ThreadedXMLRPCServer((self.temp_xml_rpc_options.server, self.temp_xml_rpc_options.port))``
+
+starts a multithreaded version of the XML-RPC server, so it will create a thread for each request received by the server. The problem is that Qt/PyQT doesn't allow these multiple threads to create GUI objects.  Only the main thread can. To overcome this limitation, the multithreaded version can instantiate other single threaded versions of VisTrails and put them in a queue, so workflow executions and other GUI-related requests, such as generating workflow graphs and history trees can be  [...]
+
+Note that this infrastructure works on Linux only. To make this work on Windows, you have to create a script similar to start_vistrails_xvfb.sh (located in the scripts folder) where you can send the number of other instances via command-line options to VisTrails. The command line options are:
+
+``python vistrails_server.py -T <ADDRESS> -R <PORT> -O<NUMBER_OF_OTHER_VISTRAILS_INSTANCES> [-M]&``
+
+If you want the main vistrails instance to be multithreaded, use the -M at the end.
+
+After creating this script, update function start_other_instances in vistrails/gui/application_server.py lines 1007-1023 and set the script variable to point to your script. You may also have to change the arguments sent to your script (line 1016: for example, you don't need to set a virtual display). You will need to change the path to the stop_vistrails_server.py script (on line 1026) according to your installation path.
+
+Executing Parameter Explorations from the Command Line
+======================================================
+
+Named parameter explorations can be executed from the command line in different ways using the -P flag. The parameter after the vistrail will then indicate the parameter exploration name in place of the workflow version. To open vistrails and execute a parameter exploration named "final" in terminator.vt run:
+
+``python vistrails/run.py -P terminator.vt:final``
+
+To only show the spreadsheet run:
+
+``python vistrails/run.py -P -i terminator.vt:final``
+
+To execute the spreadsheet in batch mode, and to output the spreadsheet as images to a directory, use the -b flag and specify a directory with the -e flag:
+
+``python vistrails/run.py -P -b -e ./final_images terminator.vt:final``
+
+This will create an image for each cell and also create a composite image for each sheet in the spreadsheet.
+
+
+Finding Methods Via the Command Line
+====================================
+
+We have tried to make some methods more accessible in the console via an api. You can import the api via import api in the console and see the available methods with dir(api). To open a vistrail:
+
+.. code-block:: python
+
+   import api
+   api.open_vistrail_from_file('/Applications/VisTrails/examples/terminator.vt')
+
+To execute a version of a workflow, you currently have to go through the controller:
+
+.. code-block:: python
+
+   api.select_version('Histogram')
+   api.get_current_controller().execute_current_workflow()
+
+Currently, only a subset of VisTrails functionality is directly available from the api. However, since VisTrails is written in python, you can dig down starting with the VistrailsApplication or controller object to expose most of our internal methods. If you have suggestions for calls to be added to the api, please let us know.
+
+One other feature that we're working on, but is still in progress is the ability to construct workflows via the console. For example:
+
+.. code-block:: python
+
+   vtk = load_package('org.vistrails.vistrails.vtk')
+   vtk.vtkDataSetReader() # adds a vtkDataSetReader module to the pipeline
+   # click on the new module
+   a = selected_modules()[0] # get the one currently selected module
+   a.SetFile('/vistrails/examples/data/head120.vtk') # sets the SetFile\  
+                    parameter for the data set reader
+   b = vtk.vtkContourFilter() # adds a vtkContourFilter module to the\
+                    pipeline and saves to var b
+   b.SetInputConnection0(a.GetOutputPort0()) # connects a's GetOutputPort0\
+                    port to b's SetInputConnection0
+
+.. rubric:: Footnotes
+.. [#] The parameter "-b" stands for "batch." In this chapter, we use the terms "batch mode" and "non-interactive mode" synonymously.
diff --git a/doc/usersguide/cfassistant.rst b/doc/usersguide/cfassistant.rst
new file mode 100644
index 0000000..0e7e58e
--- /dev/null
+++ b/doc/usersguide/cfassistant.rst
@@ -0,0 +1,145 @@
+.. _chap-controlflow-assistant:
+
+**************************
+The Control Flow Assistant
+**************************
+
+.. index:: control flow assistant
+
+Using the Control Flow Assistant (CFA)
+======================================
+
+In order to simplify the process of creating a control flow loop that uses the Map module, VisTrails has a Control Flow Assistant (CFA).
+To use the CFA, you must:
+
+1) Enable all ports (in the Module Information panel) that you wish to use as inputs or outputs.
+2) Select the modules in the workflow that will form the basis of your mapped input-output loop.
+3) Go to 'Edit->Control Flow Assistant' to launch the CFA using the selected modules.
+4) Select the input ports that you wish to loop over using List modules as input.
+5) Select the output port that you wish to use for the values in the output List.
+6) Click OK, and the CFA will generate the control flow structure as a Group module.
+7) Connect a List input to each of the inputs on the control flow Group.
+8) Connect the Group's output List (output port 'Result') to a suitable module/port, or create a PythonSource module to handle the List output.
+
+Note: All existing connections to input and output ports selected in steps 4 and 5 will be removed.
+
+
+List Input
+^^^^^^^^^^
+
+By default, the List inputs will be used sequentially, one from each List, which requires that all List inputs be the same length.  As another option, the Group created by the CFA has a boolean 'UseCartesianProduct' parameter.  If this parameter is set to 'true' then the cartesian product of all of the input Lists will be used as the input for the Map.  Use caution when using this parameter, as the number of inputs can grow very rapidly with just a few List inputs.
+
+
+List Output
+^^^^^^^^^^^
+
+There are several ways to handle the output List.  One option would be to send the output List to a StandardOutput module to display its contents.  Another option is to simply ignore the output List, in the case where you just want part of the workflow to execute multiple times using different inputs.  For example, if the mapped portion of the workflow contains a VTKCell, and you just want to generate a new VTKCell for each input, you should select the 'self' port of the VTKCell module w [...]
+
+
+Custom List
+^^^^^^^^^^^
+
+For advanced users, the default behavior, or cartesian product behavior may not be sufficient for your needs.  If this is the case, the 'UserDefinedInputList' parameter allows you to manually specify the input list.  If this parameter is defined, it will override any input lists already defined or connected.  The format for this user-provided input list must be a list of lists of tuples.  Each inner list represents a single loop execution, and contains tuples (or single values for functi [...]
+
+For example, if the loop has two input functions defined, in order, as SetXY(x, y) and SetZ(z), and we want two executions of the loop, the input list would be:
+[[(x1, y1), z1], [(x2, y2), z2]]
+
+
+Parameter Exploration
+^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: parameter exploration; control flow
+   pair: parameters; exploring
+
+One useful purpose for the CFA is to provide a version-based approach to parameter exploration.  To create a parameter exploration for a workflow, you could simply select all modules in the workflow, making sure the ports for the desired parameters are enabled, then launch the CFA and select the ports of the parameters you wish to explore.  By providing a list for each parameter, you can create a parameter exploration that directly uses the version tree.
+
+.. topic:: Try it Now!
+
+   Processing a List of values with PythonCalc:
+
+   1) Go to 'Edit->Preferences', select the 'Module Packages' tab, and enable the 'pythonCalc' package if it is not already enabled.
+   2) Click on File->New to start a new VisTrail.
+   3) Add the following modules from the module registry to the VisTrail:
+      a) One 'PythonCalc' module from the 'pythonCalc' package
+      b) One 'List' module from the 'Basic Modules' package
+      c) One 'StandardOutput' module from the 'Basic Modules' package
+   4) Set the List 'value' parameter to: [1.0, 2.0, 3.0, 4.0, 5.0]
+   5) Set the PythonCalc 'op' parameter to: '*'
+   6) Set the PythonCalc 'value2' parameter to: 2.0
+   7) With the PythonCalc module selected, go to 'Edit->Control Flow Assistant' (see Figure :ref:`Example 1.1 <fig-assistant>`):
+
+      a) Click on the input port 'value1' and ensure it is highlighted
+      b) Click on the output port 'value' and ensure it is highlighted
+      c) Click 'OK' to close the window and build the loop structure as a Group module (see Figure :ref:`Example 1.2 <fig-select>`)
+   8) Connect the 'List' module's output port 'value' to the 'Group' module's input port 'value1'.
+   9) Connect the 'Group' module's output port 'Result' to the 'StandardOutput' module's input port 'value' (see Figure :ref:`Example 1.3 <fig-pipeline>`)
+   10) Execute the current workflow.
+   11) In your Standard Output console, you should see a List containing the computation for each element in the input list: [2.0, 4.0, 6.0, 8.0, 10.0] :vtl:`(Open result) <cfassistant1.vt>`
+
+.. _fig-assistant:
+
+.. figure:: figures/cfassistant/assistant.png
+   :align: center
+   :width: 90%
+
+   Example 1.1 - Running the Control Flow Assistant
+
+.. _fig-select:
+
+.. figure:: figures/cfassistant/port_select.png
+   :align: center
+   :width: 70%
+
+   Example 1.2 - Selecting relevant ports.
+
+.. _fig-pipeline:
+
+.. figure:: figures/cfassistant/pipeline.png
+   :align: center
+   :width: 25%
+
+   Example 1.3 - The connected pipeline.
+
+.. topic:: Try it Now!
+
+   Performing a Parameter Exploration:
+
+   1) Go to 'File->Open', explore to the VisTrails examples folder, and open :vtl:`spx.vt`.
+   2) Open the History view and select the version tagged as 'decimate'.
+   3) Open the Pipeline view.
+   4) Select the 'vtkContourFilter' module and enable the 'SetValue' input port by clicking to the left of 'SetValue' in the Module Information panel (see Figure :ref:`Example 2.1 <fig-cfassistant-enable-port>`).
+   5) Click on 'Edit->Select All'.
+   6) With all modules selected, go to 'Edit->Control Flow Assistant':
+
+      a) Click on the 'vtkContourFilter' module's input port 'SetValue' and ensure it is highlighted
+      b) Click on the 'VTKCell' module's output port 'self' and ensure it is highlighted (see Figure :ref:`Example 2.2 <fig-cfassistant-enable-port>`)
+      c) Click 'OK' to close the window and build the loop structure as a Group module
+   7) Select the newly created 'Group' module, and set the 'SetValue' parameter to: [(0, 0.5), (0, 0.75), (0, 1.0)]
+   8) Execute the current workflow.
+   9) In your VisTrails Spreadsheet, you should see three visualizations, one for each set of input parameters to the 'SetValue' port of 'vtkContourFilter' (see Figure :ref:`Example 2.3 <fig-cfassistant-results>`). :vtl:`(Open result) <cfassistant2.vt>`
+
+.. _fig-cfassistant-enable-port:
+
+.. figure:: figures/cfassistant/enable_port.png
+   :align: center
+   :width: 30%
+
+   Example 2.1 - Enabling a port for use with the control flow assistant.
+
+.. _fig-cfassistant-select:
+
+.. figure:: figures/cfassistant/port_select2.png
+   :align: center
+   :width: 70%
+
+   Example 2.2 - Selecting relevant ports.
+
+.. _fig-cfassistant-results:
+
+.. figure:: figures/cfassistant/results.png
+   :align: center
+   :width: 90%
+
+   Example 2.3 - The spreadsheet results using the list: [(0, 0.5), (0, 0.75), (0, 1.0)] as input to the contour filter via the control flow assistant.
+
diff --git a/doc/usersguide/cltools.rst b/doc/usersguide/cltools.rst
new file mode 100644
index 0000000..9a44c96
--- /dev/null
+++ b/doc/usersguide/cltools.rst
@@ -0,0 +1,264 @@
+.. _chap-cltools:
+
+*************************************************
+Wrapping command line tools using package CLTools 
+*************************************************
+
+.. index:: wrapping command line tools using package CLTools
+
+Package CLTools
+===============
+
+The package CLTools provide a way to wrap command line tools so that
+they can be used as modules in VisTrails. It includes a wizard that
+simplifies the creation of wrappers. To use the package, enable
+CLTools in the package configuration window. The package will be empty
+until you add a wrapper for a command line tool. When you have added a
+wrapper you need to reload the wrappers by either pressing the reload
+button in the wizard, reloading the CLTools package, or selecting
+Packages->CLTools->Reload All Scripts on the menu.
+
+Using the CLTools Wizard
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can run the Wizard from within VisTrails. First, make sure the
+CLTools package is enabled. Then, on the menu, select
+Packages->CLTools->Open Wizard.
+
+Or, to launch the wizard from the command line run:
+``python vistrails/package/CLTools/wizard.py``
+
+The wizard allows you to create and edit wrappers for command line
+tools. Input/output ports can be created as arguments to the command
+or using pipes (stdin, stdout, or stderr).  :ref:`Figure 1.1
+<fig-cltools-wizard>` shows the main interface. Command line arguments
+can be added, removed and rearranged. Pipes can be added and
+configured. There is a preview line where you can see how your command
+will look when executed. You can also push the preview button to see
+which ports will be available for the vistrails module, as shown in
+the bottom right. This example shows some of the most common ways to
+specify arguments. In order: The standard output is used as a string
+output port, an integer attribute using the **-i** flag, a boolean
+flag **-A** that can be turned on or off, an input file using a
+prefix, an output file using the **-o** flag, and finally a simple
+string input. Note the way arguments correspond to ports in the bottom
+right.
+
+.. _fig-cltools-wizard:
+
+.. figure:: figures/CLTools/wizard.png
+   :align: center
+   :width: 100%
+
+   Figure 1.1 - CLTools Wizard main window
+
+Arguments can represent either  input ports, output ports, both, or constant
+strings.  Ports can  handle  different types  such  as boolean  flags,
+strings, integers, floats, or files. Lists of  strings and files are also possible. Each
+argument can have a flag before it such as ``-f`` or a prefix such as ``--file=``.
+
+A file ending can be specified for files that are used as outputs using **file suffix**. 
+
+You can view and import flags from man and help pages (See :ref:`Figure 1.2
+<fig-cltools-import>`).
+
+.. _fig-cltools-import:
+
+.. figure:: figures/CLTools/import.png
+   :align: center
+   :width: 100%
+
+   Figure 1.2 - Import Arguments Window
+
+Files should be saved as {modulename}.clt in the directory .vistrails/CLTools/
+
+Supported flags::
+
+   -c   Import a command with arguments automatically
+        For example, to create a wrapper for ls with two flags -l and -A run:
+        python wizard.py -c ls -l -A
+
+.. topic:: Try it Now!
+
+    Create a wrapper that takes a file as input and generate a file as output using ``-o``. The ports should always be visible. The command looks like::
+
+        filter infile -o outfile
+
+    Your wrapper should look like in figure :ref:`Figure 1.3 <fig-cltools-inputoutput>`. Note that the order of the arguments is always preserved:
+
+.. _fig-cltools-inputoutput:
+    
+.. figure:: figures/CLTools/inputoutputfile.png
+   :align: center
+   :width: 100%
+
+   Figure 1.3 - An infile outfile wrapper
+
+Port visibility
+^^^^^^^^^^^^^^^
+
+:ref:`Figure 1.4 <fig-cltools-visibility>` shows how the **visible**
+setting affects ports in VisTrails. Visible ports are meant to be
+connected to other modules, and are shown as square input or output
+ports on the module, while non-visible ports are meant to be optional,
+or added as parameters on the input port list to the right. Non-visible
+ports can be made visible on the module by clicking on the left side
+of the ports pane, so that a eye icon is displayed. The example below has 2 visible input ports and one visible output port. The input list to the right shows available inputs, bot visible and non-visible. The first input in the input list to the right is visible by default,
+which is shown by a greyed-out eye. The second port is non-visible by
+default but has been made visible as shown by the eye icon. The second
+input is non-visible but can be made visible on the module by clicking
+so that the eye icon becomes visible.
+
+.. _fig-cltools-visibility:
+
+.. figure:: figures/CLTools/visibility.png
+   :align: center
+   :width: 70%
+
+   Figure 1.4 - Port visibility in VisTrails
+
+Environment Variables
+^^^^^^^^^^^^^^^^^^^^^
+
+There are three ways to set environment variables in CLTools. If your
+environment variables is platform-dependent, you should set the
+**env** configuration variable for the CLTools package. In VisTrails, go to the
+Preferences->Module Packages dialog, select **CLTools**, make sure it
+is enabled, and select **Configure...**. Set the **env** variable to
+the preferred environment. Separate name and value using **=** and
+variables using **;**, like this::
+
+    PATH=/my/custom/path;DEBUG=;MYVAR=32
+
+If you want to specify the variables in your workflow, you can enable the **env** input port on your module by checking the **env** option in the top toolbar in the CLTools wizard. Then you can specify environment variables either as parameters to your module or by connecting the **env** input port to other modules. Multiple parameters can be specified as a single string or by adding multiple **env** parameters. These variables overrides variables specified using the other two methods.
+
+For modules that always need the same environment variables, they can be added to the module by editing the .clt file directly and adding an **env** entry in the options section as shown below. These variables overrides the ones specified in the CLTools configuration::
+
+    {
+        "command": "ls", 
+        "options": {
+            "env": "MYVAR=/my/custom/path;MYVAR2=64"
+        }
+    }
+
+Note that if you replace e.g. the **PATH** variable, you should
+include the existing path, which can be found by running e.g. ``echo
+$PATH`` on the command line.
+
+Setting working directory
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The **Directory** field to the right of the command field can be used
+to specify the working directory where the command will be
+executed. It does **not** specify the directory where the command is
+found. Use the PATH enviroment variable for that.
+
+InputOutput files
+^^^^^^^^^^^^^^^^^
+
+The **InputOutput** port should be used for commands that modifies a
+file in-place, so that it is used both as and input and an output. An
+example of using the InputOutput module is shown in :ref:`Figure 1.5
+<fig-cltools-inputoutputport>`. When executed, the input file will be
+copied to a temporary file before it is passed to the command and used
+as an output. This is because you should not (if you can avoid it)
+modify the inputs to your modules, because they may be used by other
+modules, or re-executed by the same module. It may be useful to set
+the file suffix attribute to make sure the copied file is of the same
+type as the original. There is currently no way of passing the original
+file to the command, since it is discouraged. But if this is
+necessary in a particular case, CLTools can be easily modified to do
+this.
+
+.. _fig-cltools-inputoutputport:
+
+.. figure:: figures/CLTools/inputoutputport.png
+   :align: center
+   :width: 100%
+
+   Figure 1.5 - Example of an InputOutput port
+
+Creating a standalone package
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When you have a working set of wrappers and want to distribute them,
+you should put them in a separate module package. This allows you to
+name and version your package, and makes sure there are no conflicts
+with modules using the same name as yours. One warning: workflows
+using the old modules will need to be recreated to use the modules in
+this new package instead, so it is better to start building workflows
+after a separate package has been created. Below are the steps to
+follow in order to set up a new package.
+
+1) Create a new directory in ``$HOME/.vistrails/userpackages/``
+2) Copy ``__init__.py`` and ``init.py`` from ``vistrails/packages/CLTools`` to this new directory
+3) Update **name**, **identifier**, and **version** in ``__init__.py`` to the desired values
+4) Move all desired tools (\*.clt files) to this new directory
+5) Enable and test your new package!
+
+File Format
+^^^^^^^^^^^
+
+The wrapper is stored as a `JSON <http://www.json.org/>`_ file and can be edited using a text editor if needed. It uses the following schema:
+
+ROOT is a dict with the following possible keys:
+
+* **command** (required) - value is the command to execute like "cat" or "/home/tommy/cat"
+* **stdin** - handle stdin - value is a 3-list ["port name", CLASS, OPTIONDICT]
+* **stdout** - handle stdout - value is a 3-list ["port name", CLASS, OPTIONDICT]
+* **stderr** - handle stdout - value is a 3-list ["port name", CLASS, OPTIONDICT]
+* **args** - list of ordered arguments that can either be constants, inputs, or outputs. See ARG.
+* **dir** - value is the working directory to execute the command from
+* **options** - a dict of module options - see OPTIONDICT
+
+OPTIONDICT is a dict with module specific options, recognized options are:
+
+* **std_using_files** - connect files to pipes so that they need not be stored in memory. This is useful for large files but may be unsafe since it does not use subprocess.communicate
+* **env** - A list of environment variables to set when executing the command, with entries separated by **;** and key/value pairs separated by **=**. This overrides all other environment variables set, except for the env_port, and should only be used when they are not expected to change. It can only be set by editing the .clt files directly with a text editor.
+* **env_port** - Set to add an input port **env** for specifying the environment variables to use, this overrides all other environment variables set
+
+ARG is a 4-list containing [TYPE, "name", KLASS, ARGOPTIONDICT]
+TYPE is one of:
+
+* **input** - create input port for this arg
+* **output** - create output port for this arg
+* **inputoutput** - create both input and output port for this arg. The type must be **File** and a copy of the original file will be processed and used as output.
+* **constant** - use "port name" directly as a constant string
+
+CLASS indicates the port type and can be one of the following. **String** is used by default.
+
+* **File** - A vistrails **File** type. The filename will be used as the argument
+* **String** - A vistrails **String** type. The string will be used as the argument
+* **Integer** - A vistrails **Integer** type. Its string value will be used as the argument
+* **Float** - A vistrails **Float** type. Its string value will be used as the argument
+* **Flag** - A vistrails **Bool** type. A boolean flag that when set to true will add the value of the argument  to the command.
+* **List** - A list of values of the type specified by the **type** option. All values in the list will be added as arguments.
+
+ARGOPTIONDICT is a dict containing argument options. recognized options are:
+
+* **type**: **CLASS** - used by List-types to specify subtype.
+* **flag**: **name** - Append name as a short-style flag before the specified argument. If type is **List** it is appended before each item
+* **prefix**: **name** - Append name as a long-style prefix to the final argument. If it is also a list it is appended to each item.
+* **required**: None - Makes the port always visible in VisTrails.
+* **suffix**: **name** - Specifies the file ending for created files
+
+
+.. topic:: Try it Now!
+
+    Wrap the command "cat" that takes 2 files as input named "first" and "second". Also take a list of files as input named "rest".
+    Catch stdout as file, name it "combined".
+    Catch stderr as string, name it "stderr".
+    Show "first" and "combined" by default.
+
+    Your wrapper should now look like this::
+        
+        {"command": "cat",
+         "args": [["input", "first", "File", {"required":""}],
+                  ["input", "second", "File", {}],
+                  ["input", "rest", "List", {"type":"File"}]],
+        "stdout": ["combined", "File", {"required":""}],
+        "stderr": ["stderr", "String", {}]
+        }
+
+    Save as ``{yourhomedirectory}/.vistrails/CLTools/cat.clt``
+    Reload CLTools package in VisTrails. Test the new module.
diff --git a/doc/usersguide/conf.py b/doc/usersguide/conf.py
new file mode 100644
index 0000000..935f009
--- /dev/null
+++ b/doc/usersguide/conf.py
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+#
+# VisTrails documentation build configuration file, created by
+# sphinx-quickstart on Mon Feb  7 21:06:44 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig', 'sphinx.ext.extlinks']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'VisTrails'
+copyright = u'2013, NYU Poly'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '2.1'
+# The full version, including alpha/beta/rc tags.
+release = '2.1.1'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+extlinks = {'vtl': ('http://www.vistrails.org/usersguide/v2.1/examples/%sl',
+                    '')}
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+html_style = "mystyle.css"
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'VisTrailsdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'VisTrails.tex', u'VisTrails Documentation',
+   u'NYU Poly', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+latex_use_parts = True
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
+
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {'http://docs.python.org/': None}
+
+rst_epilog = """
+.. |vistrails| replace:: VisTrails
+.. |eg| replace:: *e.g.,*\ 
+.. |etc| replace:: *etc.*\ 
+"""
diff --git a/doc/usersguide/controlflow.rst b/doc/usersguide/controlflow.rst
new file mode 100644
index 0000000..802e5a0
--- /dev/null
+++ b/doc/usersguide/controlflow.rst
@@ -0,0 +1,593 @@
+.. _chap-controlflow:
+
+*************************
+Control Flow in VisTrails
+*************************
+
+Scientific workflows usually follow a dataflow model, but, in some cases,
+control structures, including loops and conditionals, are necessary to
+accomplish certain tasks. |vistrails| provides the ``Control Flow``
+package to support these and other structures.  To create your own ``Control Flow`` modules, please refer to the Developer's Guide (:ref:`chap-controlflowdev`).  Or, if you would like to use the Control Flow Assistant, to simplify the process described in this chapter, please refer to :ref:`chap-controlflow-assistant`.
+
+This package also provides some related modules that operate on lists.
+
+The Map operator
+================
+
+In functional programming, ``map`` is a high-order function that applies 
+a given function to a list (each element of the list is processed using this 
+function) and returns a sequence of results. The ``Map`` module 
+provides this functionality for workflows in |vistrails|. Note that this
+module provides simple looping as it can be used to iterate through a list
+of inputs.
+
+The Map module has four input ports:
+
+* "FunctionPort": this port receives the module (via the "self" output port) that represents the function to be applied for each element of the input list; if the function uses more than one module, you must use a ``Group`` (see Chapter :ref:`chap-grouping`) or a ``SubWorkflow`` and connect that composite module to this port;
+* "InputPort": this port receives a list of the names of the input ports that represent the individual arguments of the function;
+* "OutputPort": this port receives the name of the output port that represents the individual result of the function;
+* "InputList": this port receives the input list for the loop; it must be a list of tuples if more than one function input port was chosen.
+
+
+The output port "Result" produces a list of results, one for each element in the input list.
+
+.. topic:: Try it Now!
+
+  To better show how to use the ``Map`` module, let's use a workflow as
+  an example. Inside the "examples" directory of the |vistrails|
+  distribution, open the "triangle_area.vt" vistrail. Now, select the
+  "Surface Area" version. This version basically calculates the area
+  of a given isosurface. We are going to modify this version, in order to
+  calculate the areas of the isosurface given by contour values in a list.
+  Then, we will create a 2D plot to show all the areas.
+
+  Begin by deleting the ``StandardOutput`` modules, and the connection between the ``vtkDataSetReader`` and the ``vtkContourFilter`` modules. Then, drag the following modules to the canvas:
+
+   * ``Map``
+   * ``CartesianProduct``
+   * ``List`` (under "Basic Modules")
+   * ``MplSource`` (under "matplotlib")
+   * ``MplFigure`` (under "matplotlib")
+   * ``MplFigureCell`` (under "matplotlib")
+   * ``InputPort`` (under "Basic Modules") - you will need two of them
+   * ``OutputPort`` (under "Basic Modules")
+   * ``PythonSource`` (under "Basic Modules")
+
+Notice that when you drag ``Map`` to the pipeline canvas it will be drawn in a different shape from the other modules. This is a visual cue to help distinguish control modules from other modules. All control modules have the same shape.
+
+.. topic:: Next Step!
+
+  Select the ``vtkContourFilter`` module and delete its method "SetValue" in the ``Module Information`` tab. Then, make this port visible by clicking on the first column left of its name in the "inputs" tab to toggle the eye icon..
+
+  Connect the modules as shown in Figure :ref:`fig-controlflow-calculate_area`.
+
+.. _fig-controlflow-calculate_area:
+
+.. figure:: figures/controlflow/CalculateArea.png
+   :align: center
+   :width: 1.8in
+
+   Connecting a subset of the modules to be grouped as a ``SubWorkflow``
+
+These modules represent the function we wish to map: each element of the input list will be processed using them. Because we have more than one module, we need to create a ``Group`` or a ``SubWorkflow`` to identify the entire function. The ``InputPort`` and the ``OutputPort`` modules are
+necessary to expose these ports in the ``Group``/``SubWorkflow``
+structure.
+
+.. topic:: Next Step!
+
+  In this example, we will use a ``SubWorkflow`` structure. Select all the modules shown in Figure :ref:`fig-controlflow-calculate_area`, go to the ``Workflow`` menu, and then click on ``Create SubWorkflow``. You can name it ``CalculateArea``. Enable the ``self`` output port in the 'outputs' panel: you will need it to connect to the "Map" module
+
+.. topic:: Note
+
+   When using ``Map``, the module (or subworkflow) used as function port in the map module MUST be a function, i.e., it can only define 1 output port.
+
+.. topic:: Next Step!
+
+  Now, select the ``MplSource`` module and open its configuration dialog. Inside it, add two input ports of type ``List``: "InputList" and "X_Values". Also, copy the code listed below, in order to create the necessary information for the 2D plot, into the source text area and save your changes.
+
+.. code-block:: python
+
+   subplot(212)
+
+   dashes = [1, 3]
+   xaxis = []
+
+   for i in xrange(len(InputList)):
+       xaxis.append(X_Values[i][1])
+
+   l, = plot(xaxis, InputList, marker="o", markerfacecolor="red",
+             markersize=7, label="IsoSurface Areas", linewidth=1.5)
+
+   l.set_dashes(dashes)
+
+.. topic:: Next Step!
+
+  Next, edit the ``PythonSource`` module by adding an output port "result" of type ``List``, copying the following code to the source text area, and saving these changes.  The code will create a range of contour values that we will use as our input list.
+
+.. code-block:: python
+
+   result = []
+
+   for i in xrange(4, 256, 4):
+       result.append(i)
+
+.. topic:: Next Step!
+
+  It may be helpful to identify this ``PythonSource`` module by labeling it as ``RangeList``. Connect all the modules as shown in Figure :ref:`fig-controlflow-map_workflow`.
+
+.. _fig-controlflow-map_workflow:
+
+.. figure:: figures/controlflow/Map_Workflow.png
+   :align: center
+   :width: 4in
+
+   All the modules connected in the canvas
+
+.. topic:: Next Step!
+
+  You will set some parameters now:
+
+  * ``HTTPFile``: set the parameter "url" to http://www.sci.utah.edu/~cscheid/stuff/head.120.vtk
+  * ``List``: set the parameter "value" to *[0]*
+  * ``Map``: set the parameter "InputPort" to *["SetValue"]* and the parameter "OutputPort" to *GetSurfaceArea*
+
+
+The workflow is now ready to be executed. When you execute the workflow, you will
+see the SubWorkflow ``CalculateArea`` executing several times (one time
+for each value of the input list). It's important to notice that, although only the
+module connected to ``Map`` (in this example, the SubWorkflow
+``Calculate Area``) will be in the loop, the modules above it will be also
+used in each loop iteration; the difference is that they are going to be executed
+only for the first iteration; in all other iterations, the results will be taken
+from the cache.
+
+When the workflow finishes its execution, the |vistrails| Spreadsheet will contain
+a 2D plot (Figure :ref:`fig-controlflow-map_spreadsheet`).
+
+.. _fig-controlflow-map_spreadsheet:
+
+.. figure:: figures/controlflow/Map_Spreadsheet.png
+   :align: center
+   :width: 100%
+
+   The result in the |vistrails| Spreadsheet
+
+This example can be found in the version "Surface Area with Map", inside
+the :vtl:`triangle_area.vt` vistrail.
+
+
+Filtering results
+=================
+
+When computing large lists of results, it can be useful to selectively reduce the list during execution to avoid unnecessary computation.
+
+The ``Filter`` module was developed to address this issue. It receives an
+input list and, based on a specified boolean condition, returns only elements of
+the list that satisfy the condition. Its ports are the same as those in the
+``Map`` module. The difference between these modules is related to the
+function module: in ``Filter``, the output of that module is not the value to
+keep, but a boolean indicating whether to keep (``True``) or discard
+(``False``) the value from the original list.
+
+.. topic:: Try it Now!
+
+  To better understand how ``Filter`` works, let's modify our earlier example to filter out areas less than 200,000. With the previous vistrail open (you can use the "Surface Area with Map" version), add the following modules to the canvas:
+
+  * ``Filter``
+  * ``PythonSource`` (under "Basic Modules")
+
+  Edit the configuration of ``PythonSource`` by adding an input port of type ``Float`` named "Area", and an output port of type ``Boolean`` named "Condition", and writing the following code inside the source text area:
+
+.. code-block:: python
+
+   if Area > 200000.00:
+       Condition = True
+   else:
+       Condition = False
+
+.. topic:: Next Step!
+
+  Press the ``OK`` button. You can label this ``PythonSource`` as ``FilterCondition``. Now, reorganize the modules in the canvas as shown in Figure :ref:`fig-controlflow-mapandfilter_workflow`.
+
+.. _fig-controlflow-mapandfilter_workflow:
+
+.. figure:: figures/controlflow/MapAndFilter_Workflow.png
+   :align: center
+   :width: 3.8in
+
+   The new organization of the modules in the canvas
+
+.. topic:: Next Step!
+
+  Select the ``Filter`` module and set the values of its parameters to the following:
+
+  * "InputPort": *["Area"]*
+  * "OutputPort": *Condition*
+
+When you execute this workflow, it will generate another plot that is similar to the one from the ``Map`` example, but only areas above 200,000 are considered (Figure :ref:`fig-controlflow-mapandfilter_spreadsheet`).
+
+.. _fig-controlflow-mapandfilter_spreadsheet:
+
+.. figure:: figures/controlflow/MapAndFilter_Spreadsheet.png
+   :align: center
+   :width: 100%
+
+   The result in the |vistrails| spreadsheet
+
+This example is already inside the :vtl:`triangle_area.vt` vistrail, in the
+"Surface Area with Map and Filter" version.
+
+Later in this chapter, you will see how to combine ``Map`` and ``Filter``
+in one single module, by creating your own control structure.
+
+
+Conditional module
+==================
+
+Conditional statements are a very important control flow structure frequently used
+in programming languages, and the ``if`` structure is probably the most
+common of these structures. In scientific workflows, for example, an ``if``
+structure can be used to select the part of the pipeline to be executed based on a
+boolean condition.
+
+For this reason, the ``Control Flow`` package also includes an ``If``
+module. Its input ports are:
+
+* "Condition": this port receives a boolean value that will specify the direction of computation;
+* "TruePort": this port receives the part of the workflow that will be executed if the condition value is ``True``; you don't need to group or make a SubWorkflow in this case: just connect the output port "self" of the last module in this port;
+* "FalsePort": this port receives the part of the workflow that will be executed if the condition value is ``False``; as with the
+* "TruePort" port, you don't need to group or make a SubWorkflow;
+* "TrueOutputPorts": this port receives a list that contains the names of the output ports of the module connected to "TruePort" that you want the result of; this port is optional; 
+* "FalseOutputPorts": this port receives a list that contains the names of the output ports of the module connected to "FalsePort" that you want the result of; this port is optional.
+
+
+The ``If`` module has an output port named "Result" that returns a
+list with the results of the specified output ports of "TrueOutputPorts" or
+"FalseOutputPorts", depending on the condition value. If only one output
+port is chosen, the result of this port will not be returned in a list. If
+"TrueOutputPorts" or "FalseOutputPorts" are not enabled,
+"Result" returns ``None``.
+
+Let's do a simple example to show how this module works.
+
+.. topic:: Try it Now!
+
+  Our example will contain 2 different text strings.
+  The string that is used by the workflow will depend on the condition of the ``If`` module.
+  The final text will be rendered in a spreadsheet cell.
+  You can change the final text by changing the condition on the ``If`` module.
+  Create a new workflow and add the following modules:
+  
+  * ``Boolean`` (under "Basic Modules")
+  * ``String`` (under "Basic Modules") - you will need two of them
+  * ``If`` (under "Control Flow")
+  * ``WriteFile`` (under "Basic Modules")
+  * ``RichTextCell`` (under "|vistrails| Spreadsheet")
+  
+  Name the ``Boolean`` module "Condition", the first ``String`` module
+  "True Branch", and the second ``String`` module "False Branch".
+  Connect the modules as shown in Figure :ref:`fig-controlflow-if_example`.
+  The ``Condition`` should be connected to the "Condition" port on the ``If``
+  module and will determine which of the branches that will be executed.
+  ``True Branch`` should be connected to the "TruePort" on the ``If`` module
+  and will be executed when the ``If`` module evaluates to ``True``.
+  ``False Branch`` should be connected to the "FalsePort" on the ``If``
+  module and will be executed when the ``If`` module evaluates to ``False``.
+  On the ``If`` module, set parameters "TrueOutputPorts" and "FalseOutputPorts"
+  to "['value']". This will tell the ``If`` module to output the "value" port on the
+  ``String`` modules.
+  Finally, set the "value" port on the ``Condition`` module to either ``True`` or
+  ``False``. Execute the workflow and see that the branch specified by the
+  ``If`` condition has been executed.
+  	
+.. _fig-controlflow-if_example:
+
+.. figure:: figures/controlflow/If_Example.png
+   :align: center
+   :width: 3.0in
+
+   Simple If example
+
+Lets do a more advanced example from the bioinformatics domain. This workflow
+will take a string as the input.  If this string is a structure identifier, a
+web service from the European Bioinformatics Institute - EBI (http://www.ebi.ac.uk/)
+is used to put the structure into PDB format (a standard representation for
+macromolecular structure) and the ``VTK`` package is used to show the protein in
+the |vistrails| Spreadsheet.  Otherwise, the input is assumed to be invalid and a
+message is generated in the Spreadsheet.
+
+.. topic:: Try it Now!
+
+  First, the EBI's web service must be enabled. For this, you need to add the following url to the ``wsdlList`` configuration:
+
+
+  ``http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl``
+
+
+  Don't forget to ensure that the ``SudsWebServices`` package is enabled in the  ``Preferences`` dialog. For more information about web services in |vistrails|, see Chapter :ref:`chap-webservices`.
+
+  Now, you're going to drag the following modules to the canvas:
+
+  * ``If``
+  * ``fetchData`` (under "Methods" for the current web service)
+  * ``WriteFile`` (under "Basic Modules")
+  * ``vtkPDBReader`` (under "VTK")
+  * ``vtkDataSetMapper`` (under "VTK")
+  * ``vtkActor`` (under "VTK")
+  * ``vtkRenderer`` (under "VTK")
+  * ``VTKCell`` (under "VTK")
+  * ``PythonSource`` (under "Basic Modules") - you will need two of them
+  * ``String`` (under "Basic Modules")
+  * ``RichTextCell`` (under "|vistrails| Spreadsheet")
+
+  Set some paremeters of ``fetchData``:
+
+  * "format": *pdb*
+  * "style": *raw*
+
+  Next, connect some modules as shown in Figure :ref:`fig-controlflow-if_group`.
+
+.. _fig-controlflow-if_group:
+
+.. figure:: figures/controlflow/If_Group.png
+   :align: center
+   :width: 1.5in
+
+   Some modules of the workflow connected
+
+The aim of this group of modules is to get the PDB format of the structure ID, through the web service,
+and then make the visualization with the ``VTK`` package. This is the part of the workflow
+that will be executed if the input is a structure identifier.
+
+.. topic:: Next Step!
+
+  Next, select one of the ``PythonSource`` modules and open its configuration dialog. One input port named "Structure", of type ``String``, and one output port named "Is_ID", of type ``Boolean``, must be added, as well as the code below:
+
+.. code-block:: python
+   :linenos:
+
+   if "\n" in Structure:
+       lineLen = Structure.index("\n")
+   else:
+       lineLen = -1
+   if lineLen < 1:
+       lineLen = len(Structure)
+
+   if ":" in Structure:
+       index = Structure.index(":")
+   else:
+       index = -1
+
+   if Structure[0] != "ID " and index > 0 and index < lineLen:
+       Is_ID = True
+   else:
+       Is_ID = False
+
+.. FIXME: there is no way a 1-character string could be equal to "ID "
+
+.. topic:: Next Step!
+
+  Name this module as ``Is_ID``. This module will be the condition for the ``If`` structure.
+
+  Now, select the last ``PythonSource`` module, and, inside its configuration, add one input port of type ``String``, named "Input", and one output port of type ``File``, named "html". Then, copy the code below:
+
+.. code-block:: python
+   :linenos:
+
+   output = self.interpreter.filePool.create_file()
+   f = open(str(output.name), 'w')
+   text = '<HTML><TITLE>Protein Visualization</TITLE><BODY BGCOLOR="#FFFFFF">'
+   f.write(text)
+   text = '<H2>Protein Visualization Workflow</H2>'
+   f.write(text)
+   text = '<H3>The following input is not an ID from a protein:</H3>'
+   text += '<H4>' + Input + '</H4>'
+   text += '<H3>The visualization cannot be done.</H3>'
+   f.write(text)
+
+   text = '</BODY></HTML>'
+   f.write(text)
+
+   self.setResult('html', f)
+
+   f.close()
+
+.. topic:: Next Step!
+
+  Name this ``PythonSource`` as ``Not_ID``. This module will print a message in the |vistrails| Spreadsheet when the input is not a structure identifier.
+
+  Finally, the ``String`` module can be named as ``Workflow_Input``, to make it clear that it takes the input of the workflow. Also, open the configuration dialog of ``RichTextCell`` to enable the output port "self", so it can be connected to the ``If`` module. Then, connect all the modules as shown in Figure :ref:`fig-controlflow-if_workflow`. 
+
+.. _fig-controlflow-if_workflow:
+
+.. figure:: figures/controlflow/If_Workflow.png
+   :align: center
+   :width: 3.0in
+
+   All the modules connected
+
+.. topic:: Next Step!
+
+  In order to better organize the disposal of the modules, group all the modules shown in Figure :ref:`fig-controlflow-if_group` by selecting them, going to the ``Edit`` menu and clicking on ``Group``. Name it as ``Generate_Visualization``. Your workflow must correspond to the one shown in Figure :ref:`fig-controlflow-if_workflow_group`.
+
+.. _fig-controlflow-if_workflow_group:
+
+.. figure:: figures/controlflow/If_Workflow_Group.png
+   :align: center
+   :width: 3.8in
+
+   The final workflow, using the ``Group`` structure
+
+Note that this implementation follows exactly the initial specification of the workflow. If the input
+is a structure identifier (``Is_ID`` returns ``True``), ``Generate_Visualization``
+will be executed; otherwise (``Is_ID`` returns ``False``), ``Not_ID``
+and ``RichTextCell`` will create an error message in the |vistrails| Spreadsheet.
+
+.. topic:: Next Step!
+
+  For the workflow execution, set the parameter "value" of the ``Workflow_Input`` module to *PDB:3BG0*. This entry is an ID from a protein; so, the condition will be ``True``, and the ``Generate_Visualization`` group will be executed, generating the visualization shown in Figure :ref:`fig-controlflow-if_spreadsheet_true`.
+
+.. _fig-controlflow-if_spreadsheet_true:
+
+.. figure:: figures/controlflow/If_Spreadsheet_True.png
+   :align: center
+   :width: 100%
+
+   The visualization of the protein in the |vistrails| Spreadsheet
+
+If you change the value from the input port "value" to *protein*, for example, the
+condition will be ``False``, and the message shown in
+Figure :ref:`fig-controlflow-if_spreadsheet_false` will be generated in the Spreadsheet.
+
+.. _fig-controlflow-if_spreadsheet_false:
+
+.. figure:: figures/controlflow/If_Spreadsheet_False.png
+   :align: center
+   :width: 3.8in
+
+   The message in the Spreadsheet, generated when the input is not a structure ID
+
+This example can be found inside the "examples" directory, in the
+:vtl:`protein_visualization.vt` vistrail. It was partially based on the workflow
+"Structure_or_ID", which can be found at http://www.myexperiment.org/workflows/225.
+
+
+While loop
+==========
+
+The while loop is a common construct of programming languages, allowing the
+repetition of an operation until some condition becomes true.
+
+It runs a single module (possibly a Group or Subworkflow) whose ``self`` output
+port is connected to the ``FunctionPort`` input of the ``While`` module (just
+like the ``Map`` module). It gets the value of the ports whose name are set on
+the ConditionPort, OutputPort and StateOutputPorts. As long as the port
+designated by ConditionPort does not return true, the module is run again, with
+on its StateInputPorts the values that were output on the StateOutputPorts in
+the previous run.
+
+.. topic:: Try it Now!
+
+  In this example, we are going to compute the GCD of two integers using
+  Euclid's algorithm. Keep in mind that |vistrails| is meant for data-oriented
+  workflows and that we are twisting it's execution model a little, but this
+  will demonstrate the functionality should you actually need it.
+
+  The modules we are going to need are:
+
+   * ``And``
+   * ``InputPort`` (under "Basic Modules")
+   * ``List`` (under "Basic Modules")
+   * ``PythonSource`` (under "Basic Modules")
+   * 3 ``OutputPort`` (under "Basic Modules")
+   * 2 ``Tuple`` and one ``Untuple`` (under "Basic Modules")
+   * 2 ``PythonCalc`` (under "PythonCalc")
+   * 2 ``If``
+
+  The structure is a little complicated and comports 4 parts (see Figure
+  :ref:`fig-controlflow-gcd`):
+
+   * \(I) compares a and b, and outputs the biggest one as 'result'
+   * \(II) makes the (a, b-a) Tuple (if a < b)
+   * \(III) is like (II) but makes (a-b, b) (if a >= b)
+   * \(IV) sets the 'continue' port, if both a and b are not null.
+
+  The ``Integer`` modules marked 'a' and 'b' are only here to make the workflow
+  clearer, they simply repeat the values from ``Untuple``.
+
+.. _fig-controlflow-gcd:
+
+.. figure:: figures/controlflow/gcd.png
+   :align: center
+   :width: 6in
+
+   The grouped pipeline for Euclid's algorithm
+
+.. topic:: Next Step!
+
+  The ``PythonCalc`` are substractions (operation '-').
+
+  The ``PythonSource`` has two Integer inputs ``a`` and ``b``, and a Boolean ``o``
+  output; the code should be ``o = a < b``
+
+  The ``Tuple`` and ``Untuple`` modules have two ``Integer`` ports each.
+
+  You will need to use the ``List`` module's configuration widget to add one
+  additional port, so you can connect ``a`` and ``b`` to the ``head`` and
+  ``item0`` ports.
+
+  The ``If`` modules each have ``['value']`` for both FalseOutputPorts and
+  TrueOutputPorts.
+
+.. topic:: Next Step!
+
+  Set names on the ``InputPort`` and ``OutputPort`` modules. For example, you
+  can use ``nbs`` for the ``InputPort`` and (from left to right) ``state``,
+  ``result`` and ``continue`` for the ``OutputPort``.
+
+  Once this is done, you can simply select everything and ``Workflow/Group``.
+  Then, add a ``While`` module, fill in the port names, and set the ``nbs``
+  port of the Group to 15 and 6 (or any couple of integers). Also add a
+  ``StandardOutput`` module to display the result.
+
+.. _fig-controlflow-gcd-grouped:
+
+.. figure:: figures/controlflow/gcd-grouped.png
+   :align: center
+   :width: 4.0in
+
+   The final pipeline
+
+
+For loop
+========
+
+The ``For`` module is very similar to ``Map``, except that it uses input values
+from a range. It can be used to make a module or group run several times with
+successive integer input, or just to repeatedly execute a task (optionally
+waiting between each iteration).
+
+
+Boolean operations
+==================
+
+The ``And`` and ``Or`` modules are simple boolean operations. They take a list
+of booleans and output a single boolean. They are useful when building
+workflows with structures that need booleans, such as the ``Filter``, ``While``
+and ``If`` modules.
+
+.. _fig-controlflow-andor:
+
+.. figure:: figures/controlflow/andor.png
+   :align: center
+   :width: 3.2in
+
+   Example usage of And and Or modules; outputs (True, False, True, False)
+
+
+Vector operations
+=================
+
+This packages also provides some general modules for lists, or vectors of
+numbers.
+
+The ``Sum`` module computes the sum of the elements in a list of numbers.
+Example: ``Sum([1, 2, 3]) = 6``
+
+The ``Cross`` module takes two 3-element lists and computes the cross product
+of these vectors. It returns a 3-element list as well.
+Example: ``Cross([1, 2, -1], [0, 2, 5]) = [12, -5, 2]``
+
+The ``Dot`` module performs the dot product of two lists, i.e. returns the sum
+of the pairwise products of the two lists' elements. It is the same thing as
+connecting an ElementwiseProduct to a Sum module.
+Example: ``Dot([2, 0, -1], [4, 2, 3]) = 5``
+
+If ``NumericalProduct`` is true (the default), the ``ElementwiseProduct``
+module outputs a list where each element is the product of the elements of both
+input lists.
+Example: ``ElementwiseProduct([1, 2, 3], [2, 0, -1]) = [2, 0, -3]``
+
+Else, the elements are concatenated instead of multiplied.
+Example: ``ElementwiseProduct([1, 2, 3], [2, 0, -1]) =
+[(1, 2), (2, 0), (3, -1)]``
diff --git a/doc/usersguide/controlflowdev.rst b/doc/usersguide/controlflowdev.rst
new file mode 100644
index 0000000..fdde096
--- /dev/null
+++ b/doc/usersguide/controlflowdev.rst
@@ -0,0 +1,197 @@
+.. _chap-controlflowdev:
+
+***********************************
+Creating a Control Flow Loop Module
+***********************************
+
+This chapter explains how to extend the ``Control Flow`` package by creating additional loop modules. For more information on ``Control Flow`` or the ``Control Flow Assistant``, please refer to :ref:`chap-controlflow` or :ref:`chap-controlflow-assistant` in the User's Guide.
+
+Building your own loop structure
+================================
+
+In functional programming, ``fold`` is a high-order function used to
+encapsulate a pattern of recursion for processing lists. A simple example of a
+``fold`` is summing the elements inside a list. If you ``fold`` the
+list [1, 2, 3, 4] with the sum operator, the result will be (((1+2)+3)+4) = 10. It's
+common to start with an initial value too. In the sum example, the initial value
+would be 0, and the result would be ((((0+1)+2)+3)+4) = 10.
+
+With this function, a programmer can do any type of recursion. In fact, the
+``map`` and ``filter`` functions, shown previously, can be implemented
+with ``fold``. The ``Control Flow`` package provides a ``Fold``
+module to enable this functionality, and the ``Map`` and the ``Filter``
+modules inherit from the ``Fold`` class.
+
+In fact, any control module that has this kind of recursion uses the ``Fold``
+class. To use this functionality for your own control modules, instead of defining
+the ``compute()`` method, you need to define two other methods:
+
+* ``setInitialValue()``: in this method, you will set the initial value of the fold operator through the ``self.initialValue`` attribute; 
+* ``operation()``: in this method, you must implement the function to be applied recursively to the elements of the input list (|eg| the sum function). More specifically, you need to define the relationship between the previous iteration's result (``self.partialResult`` attribute) and the current element of the list (``self.element`` attribute); this method must be defined after the ``setInitialValue()`` one.
+
+It's important to notice that all modules inheriting from ``Fold`` will have
+the same ports, as ``Map`` and ``Filter``, but you can add any other
+ports that will be necessary for your control structure. Also, you do not need to use
+the input ports "FunctionPort", "InputPort" and
+"OutputPort". You will only use them when you create an operator like
+``Map`` and ``Filter``, which need a function to be applied for each
+element of the input list.
+
+As an example, we will create a simple ``Sum`` module to better understand the
+idea. Create a new package, and the code inside it would be as follows:
+
+.. role:: red
+
+.. code-block:: python
+   :linenos:
+  
+   from controlflow import Fold, registerControl
+
+   version = "0.1"
+   name = "My Control Modules"
+   identifier = "org.vistrails.my_control_modules"
+
+   def package_dependencies():
+       return ["org.vistrails.vistrails.control_flow"]
+
+   class Sum(Fold):
+       def setInitialValue(self):
+           self.initialValue = 0
+
+       def operation(self):
+           self.partialResult += self.element
+
+   def initialize(*args,**keywords):
+       registerControl(Sum)
+
+.. highlight:: python
+   :linenothreshold: 1
+
+.. .. parsed-literal::
+
+   :red:`from controlflow import Fold, registerControl`
+
+   version = "0.1"
+   name = "My Control Modules"
+   identifier = "org.vistrails.my_control_modules"
+
+   :red:`def package_dependencies():`
+       :red:`return ["org.vistrails.vistrails.control_flow"]`
+
+   class Sum(:red:`Fold`):
+       :red:`def setInitialValue(self):`
+           :red:`self.initialValue = 0`
+
+       :red:`def operation(self):`
+           :red:`self.partialResult += self.element`
+
+   def initialize(\*args,**keywords):
+       :red:`registerControl(Sum)`
+
+We begin by importing the ``Fold`` class and the ``registerControl``
+function from the ``Control Flow`` package (Line 1).
+The ``registerControl`` function is used to register the control modules, so
+the shape of them can be set automatically.
+
+Also, define the variables ``version``, ``name`` and
+``identifier``, as it's done for all
+packages. The interpackage dependency (include reference of the package chapter) is
+used too, as ``My Control Modules`` requires a module and a function from
+``Control Flow`` (Lines 7 and 8); in
+this way, |vistrails| can initialize the packages in the correct order. Then, create
+the class ``Sum``, which inherits from ``Fold``. Inside it, set the
+initial value to 0 inside the ``setInitialValue()`` method
+(Lines 11 and 12), and define the sum operator
+inside ``operation()``, as shown clearly by the relation between
+``self.partialResult`` and ``self.element``
+(Lines 14 and 15).
+
+The last thing we must do is define the ``initialize()`` method, so the
+package can be loaded in |vistrails|. However, instead of calling the registry, if you
+do not need any other ports, you just have to call the ``registerControl()``
+function (Line 18).
+
+Save this package and enable it inside |vistrails|. Create a similar workflow as shown
+in Figure :ref:`fig-controlflow-sum_workflow`.
+
+.. _fig-controlflow-sum_workflow:
+
+.. figure:: figures/controlflow/Sum_Workflow.png
+   :align: center
+   :width: 100%
+
+   A workflow using the ``Sum`` module
+
+Upon executing this workflow, the sum ((((0+1)+2)+3)+4), should be printed on your
+terminal as follows:
+
+``10``
+
+Note that the input ports "FunctionPort", "InputPort" and
+"OutputPort" were not necessary for this module. Now, let's see another
+example that does use them. Open the workflow we used to calculate the area of
+isosurfaces (in "triangle_area.vt", "Surface Area with Map
+and Filter" version), and delete the ``Map``, the ``Filter``, and the
+``FilterCondition`` (``PythonSource``) modules.
+
+Now, create a single module that maps the list and filters the results, named as
+``AreaFilter``. Inside your package, add the following class:
+
+.. code-block:: python
+   :linenos:
+
+   class AreaFilter(Fold):
+       def setInitialValue(self):
+           self.initialValue = []
+
+       def operation(self):
+           area = self.elementResult
+
+           if area>200000:
+               self.partialResult.append(area)
+
+.. .. parsed-literal::
+
+   class AreaFilter(:red:`Fold`):
+       :red:`def setInitialValue(self):`
+       .. _ref-areafilter-config1:
+
+           :red:`self.initialValue = []`
+
+       :red:`def operation(self):`
+           :red:`area = self.elementResult`\label{ref:areafilter:config2}
+
+           :red:`if area>200000:`\label{ref:areafilter:config3}
+               :red:`self.partialResult.append(area)`\label{ref:areafilter:config4}
+
+The initial value is an empty list, so the result of each element can be appended to
+it (Line 3). In the ``operation()`` method, the
+``self.elementResult`` attribute is used (Line 6);
+it represents the result of the port chosen in "OutputPort"; so, it means
+that "FunctionPort", "InputPort" and "OutputPort" will have
+connections. In this workflow, ``self.elementResult`` is the area for each
+contour value inside the input list, and, if the area is above 200,000, it will be
+appended to the final result (Lines 8 and 9). We can easily see that this module does exactly
+the same as ``Map`` and ``Filter`` combined.
+
+Don't forget to register this module in the ``initialize()`` function. After
+doing this, save the package and load it again inside |vistrails|. Then, just connect
+``AreaFilter`` as in Figure :ref:`fig-controlflow-areafilter_workflow`.
+
+.. _fig-controlflow-areafilter_workflow:
+
+.. figure:: figures/controlflow/AreaFilter_Workflow.png
+   :align: center
+   :width: 3.8in
+
+   The same workflow, but now with ``AreaFilter``
+
+Now, you must set some values in the following parameters of ``AreaFilter``:
+
+* "InputPort": *["SetValue"]*
+* "OutputPort": *GetSurfaceArea*
+
+When you execute this workflow, the result in the |vistrails| Spreadsheet will be the
+same as shown previously (Figure :ref:`fig-controlflow-mapandfilter_spreadsheet`). It
+shows the flexibility of doing a recursion function by inheriting from
+``Fold``.
diff --git a/doc/usersguide/creating.rst b/doc/usersguide/creating.rst
new file mode 100644
index 0000000..ff9fa1f
--- /dev/null
+++ b/doc/usersguide/creating.rst
@@ -0,0 +1,331 @@
+.. _part2:
+
+.. _chap-creating:
+
+********************************
+Creating and Modifying Workflows
+********************************
+
+.. index:: builder
+
+Working with Modules
+====================
+
+.. index:: modules
+
+In VisTrails, modules are represented by a rectangle in the
+``Pipeline`` view of the Builder.  The name of the module is
+shown in bold letters in the middle of the rectangle.  The input and
+output ports for the module are denoted by small squares on the top
+and bottom of the module, respectively.  Modules are connected
+together to define the dataflow using curved black lines that go from
+output to input ports between modules.  Each module may also have
+adjustable parameters that can be viewed when a module is selected.
+Modules can be connected, disconnected, added, and deleted from a
+workflow.
+
+As a running example in this chapter, we will make some changes to the
+"vtk\_book\_3rd\_p189.vt" vistrail, included in the
+"examples" folder of the |vistrails| installation.
+
+.. topic:: Try it now!
+
+   Open the "vtk\_book\_3rd\_p189.vt" vistrail, either by selecting ``File`` :math:`\rightarrow` ``Open`` from the menu, or by clicking the ``Open`` button on the toolbar. After opening this vistrail, select the version labeled ``final``, then click on the ``Pipeline`` toolbar button to enter workflow editing mode.
+
+Adding and Deleting Modules
+===========================
+
+.. index:: 
+   pair: modules; adding
+
+A list of available modules is displayed
+hierarchically in the ``Modules`` container on the left side
+of the VisTrails Builder (Figure :ref:`The main VisTrails Pipeline... <fig-pipeline_screenshot>`). A core set of basic modules is always
+distributed with the VisTrails system.  Other packages, such as VTK,
+are also distributed, but are not necessary for VisTrails and thus can
+be disabled on startup (see Chapter :ref:`chap-packages`). Note, however, that the VTK module *is* required for most of the examples in this book. Depending on
+the number of packages imported on startup, the number of modules to
+select from can be difficult to navigate.  Thus, a simple search box
+is provided at the top of the container to narrow the displayed
+results.  To add a module to the workflow, simply drag the text from
+the ``Module`` container to the workflow canvas.
+
+.. _fig-pipeline_screenshot:
+
+.. figure:: /figures/creating/pipeline_screenshot_labeled.png
+   :width: 5 in
+   :align: center
+
+   The main |vistrails| Pipeline user interface. The major components are labeled.
+
+.. index::
+   pair: modules; selecting
+   pair: connections; selecting
+
+Modules and
+connections may be selected in multiple ways and are denoted by a
+yellow highlight.
+Besides directly left clicking on the object, a box selection is available by left clicking and dragging over the modules and connections in the canvas.  Multiple selection can be performed with the box selection as well as by right clicking on multiple objects with the 'Shift' key pressed.
+
+.. index::
+   pair: modules; deleting
+
+There are several ways to manipulate selected
+modules in the workflow canvas.  Moving them is performed by dragging
+a selected module using the left mouse button.  Deleting selected
+modules is performed by pressing the 'Delete' key.  The modules
+and connections can also be copied and pasted using the
+``Edit`` menu, or with 'Ctrl-C' and 'Ctrl-V', respectively.
+
+.. topic:: Try it now!
+
+   Let's replace the ``vtkQuadric`` module in our example with a ``vtkCylinder`` module instead. To do this, first type "vtkCylinder" into the search box of the ``Module`` container.  As the letters are typed, the list filters the available modules to match the query.  Select this module and drag the text onto an empty space in the canvas (see Figure :ref:`The vtkCylinder module is added to the canvas <fig-add_and_delete_modulea>`).  Then, select the ``vtkQuadric`` module in the canvas a [...]
+
+.. _fig-add_and_delete_modulea:
+
+.. figure:: /figures/creating/add_cylinder.png
+   :height: 1.25in
+   :align: center
+
+   The ``vtkCylinder`` module is added to the canvas.
+
+.. _fig-add_and_delete_moduleb:
+
+.. figure:: /figures/creating/cylinder_not_connected_but_quadric_deleted.png
+   :height: 1.25in
+   :align: center
+
+   The ``vtkQuadric`` module is deleted.
+
+Connecting Modules
+==================
+
+.. index::
+   pair: modules; connecting
+   pair: connections; adding
+   single: ports
+
+Modules are connected in VisTrails through the input and output ports
+at the top and bottom of the module, respectively.  By hovering the
+mouse over the box that defines a port, the name and data type are
+shown in a small tooltip.  To connect two ports from different
+modules, start by left clicking inside one port, then dragging the
+mouse to the other.  The connection line will automatically snap to
+the ports in a module that have a matching datatype.  Since multiple
+ports may match, hovering the mouse over the port to confirm the
+desired match may be necessary.  Once a suitable match is found,
+releasing the left mouse button will create the connection.  Note, a
+connection will only be made if the input and output port's data types
+match.  To disconnect a connection between modules, the line between
+the modules can be selected and deleted with the 'Delete' key.
+
+.. topic:: Try it now!
+
+   To connect the ``vtkCylinder`` module to the ``vtkSampleFunction`` module, place the cursor over the only output port on the ``vtkCylinder`` module, located on the bottom right. A tooltip should appear that reads "Output port self (vtkCylinder)."  Left click on the port and drag the mouse over the ``vtkSampleFunction`` module.  The connection should snap to the fourth input port from the left.  Hovering the mouse over this port shows a tooltip that reads "Input port SetImplicitFunctio [...]
+
+.. _fig-add_and_delete_modulec:
+
+.. figure:: /figures/creating/delete_quadric.png
+   :height: 1.25in
+   :align: center
+
+   The connection replaced.
+
+If the ports are not directly compatible, VisTrails may automatically insert a
+conversion module between the two ports.  If such a module is about to be used,
+VisTrails will display the connection you are drawing with a dotted line (see
+Figure :ref:`Automatic conversion <fig-automatic_conversion>`).
+
+.. _fig-automatic_conversion:
+
+.. figure:: /figures/creating/automatic_conversion.png
+   :height: 1.25in
+   :align: center
+
+   Insertion of a conversion module
+
+Changing Module Parameters
+==========================
+
+.. index::
+   pair: parameters; changing
+   pair: modules; parameters
+   single: methods
+
+The parameters for a module can be accessed in the
+``Module Information`` tab located on the right side of the
+Builder window.  When a module on the canvas is selected, the corresponding
+module information is displayed.  The ``Inputs``, ``Outputs``, and ``Annotations`` tabs can be selected to set parameters within the respective categories.  To set a parameter, simply click on its name to reveal its input box and enter the desired value.  Notice that a ``-`` and ``+`` button appears to the left of the input box.  The ``-`` button removes the corresponding input box and the ``+`` button adds one.  This allows you to experiment with different values, but only the values in [...]
+
+.. topic:: Try it now!
+
+   To perform a parameter change, select the ``vtkCylinder`` module in the canvas.  Select ``SetRadius``, enter 0.25 into the text box and press the 'Enter' key.  By executing the workflow, the modified visualization appears in the spreadsheet.  Figures :ref:`The module methods... and The results... <fig-parameter_changes>` show the interface and results of the parameter explorations.
+
+.. _fig-parameter_changes:
+
+.. figure:: figures/creating/change_parameter_interface1.png
+   :height: 2.5in
+   :align: center
+
+   The module methods interface is shown with a change of the ``SetRadius`` parameter to 1.0.
+
+.. figure:: figures/creating/cylinder1.png
+   :height: 1.5in
+   :align: center
+
+   The results of the changes are displayed on execution.
+
+.. figure:: figures/creating/change_parameter_interface2.png
+   :height: 2.5in
+   :align: center
+
+   The module methods interface is shown with a change of the ``SetRadius`` parameter to 0.25.
+
+.. figure:: figures/creating/cylinder2.png
+   :height: 1.5in
+   :align: center
+
+   The results of the changes are displayed on execution.
+
+Using Global Variables
+======================
+
+VisTrails supports the use of global variables, which allows the user to create a variable which can be used anywhere within the vistrail.  So, if you create a variable of type ``String``, you can assign that variable to any port of type ``String``.  This is done by opening the ``Vistrail Variables`` view, creating a variable, and then dragging it to the desired port.
+
+.. topic:: Try it now!
+
+   Open vtk_http.vt and go to the ``Pipeline`` view of the ``Fran Cut Smoothed`` version.  Select ``Views`` :math:`\rightarrow` ``Vistrail Variables``.  Select the ``String`` module from ``Basic Modules``, drag it over to the ``Vistrail Variables`` tab, and drop it (see Figure :ref:`Create a Variable... <fig-global-create>`).  Name it 'Filename1' and assign it the following value: 'http://www.sci.utah.edu/~cscheid/stuff/vtkdata-5.0.2.zip'.  Click on ``String``, which is just below ``File [...]
+
+To delete a global variable, simply click on the 'X' button that appears to the right of its name.  This will remove the variable, but if any ports are assigned to it, they need to be disconnected.  You can do this by right-clicking on the port and selecting ``Disconnect Vistrail Variables`` (see Figure :ref:`Disconnect a Variable... <fig-disconnect>`).
+
+.. _fig-global-create:
+
+.. figure:: /figures/creating/globalcreate.png
+   :width: 2.5in
+
+   Create a Variable - Drag the ``String`` module and drop it in the ``Vistrail Variables`` tab to create a global variable.
+
+.. _fig-global-assign:
+
+.. figure:: /figures/creating/globalassign.png
+   :width: 2.5in
+
+   Assign a Variable - Drag the type from just below the Global Variables name on the ``Vistrail Variables`` tab.  Drop it on a port to set the variable.
+
+.. _fig-disconnect:
+
+.. figure:: /figures/creating/disconnect.png
+   :width: 2.5in
+
+   Disconnect a Variable - To disconnect a global variable, right click on the assigned port and select ``Disconnect Vistrail Variables``.
+
+Configuring Module Labels
+=========================
+
+.. index::
+   pair: modules; labels
+
+To give the module a custom name, enter it in the ``Module Information`` tab's ``Name`` box.  The modules name will be displayed with the original module name(type) displayed in parenthesis below it.
+
+Configuring Module Ports
+========================
+
+.. index::
+   pair: modules; ports
+   pair: ports; adding
+   pair: ports; deleting
+
+For convenience, all the inputs and outputs of a module are not always
+shown in the canvas as ports.  The ports that are shown by default are
+defined with the method signatures of a package.  A full list of ports is available in the ``Module Configuraton`` window, which is accessed by clicking on the ``Configure`` button in the module information tab or pressing 'Ctrl-E' when a module is selected.  Alternatively, module ports can be enabled/disabled by clicking in the left margin next to the port name in the ``Inputs`` or ``Outputs`` tabs of the ``Module Information`` tab (see Figure :ref:`Enabling the GetRadius port from the  [...]
+
+.. %TODO module_configuration.png should be changed to reflect v2.0.  Caption: The module configuration window allows the hidden ports to be displayed.
+
+.. topic:: Try it now!
+
+   As an example of configuring a module port, select the ``vtkCylinder`` module in the canvas, select ``Outputs`` from the ``Module Information`` tab, and click in the left margin next to GetRadius (see Figure :ref:`Enabling the GetRadius port from the Module Information tab <fig-enabling_ports>`). A new circle port should appear on the module.  Next, add a new ``StandardOutput`` module from the basic modules and connect the output port for ``GetRadius`` to the input port of ``StandardO [...]
+
+.. _fig-enabling_ports:
+
+.. figure:: figures/creating/enabling_ports.png
+   :align: center
+   :width: 4in
+
+   Enabling the GetRadius port from the ``Module Information`` tab.
+
+
+.. _fig-module_configuration:
+
+.. figure:: figures/creating/standard_output_module.png
+   :height: 1.3 in
+   :align: center
+
+   The ``vtkCylinder`` module is configured to show an additional ``GetRadius`` port, which is then connected to a ``StandardOutput`` module.
+
+
+Basic Modules
+=============
+
+.. index::
+   pair: modules; basic
+
+In addition to the modules provided by external
+libraries, VisTrails provides a few basic modules for convenience and
+to facilitate the coupling of multiple packages in one workflow.
+These modules mostly consist of basic data types in Python and some
+manipulators for them.  In addition, file manipulation modules are
+provided to read files from disk and write files to disk.  
+
+.. _sec-pythonsource:
+
+PythonSource
+^^^^^^^^^^^^
+
+.. index:: PythonSource
+
+Because not every Python operation can be represented as a module, the
+``PythonSource`` module is provided to
+allow you to write Python statements to be executed as part of a
+workflow.  By pressing 'Ctrl-E' when a ``PythonSource``
+module is selected in the canvas, a configuration window is opened.
+This window allows you to specify custom input and output ports
+as well as directly enter Python source to be executed in the
+workflow.
+
+.. topic:: Note
+
+   Sometimes is it useful to view the source code that is contained in the ``PythonSource`` module when working with other modules.  Since the PythonSource configuration window will disappear when you select a new module, a ``Show read-only window`` button can be used to open a read-only window of the ``PythonSource's`` configuration, which will remain open until it is closed.
+
+.. topic:: Try it now!
+
+   To demonstrate a ``PythonSource`` module, we will output the center of the cylinder using Python instead of the ``StandardOutput`` module.  First, add a ``PythonSource`` module to the canvas and remove the ``StandardOutput`` module.  Select the ``PythonSource`` module and press 'Ctrl-E' to edit the configuration.  In the newly opened configuration window, create a new input port named "radius" of type ``Float``.  Next, in the source window enter::
+
+      print radius
+
+   then select ``OK`` to close the window.  Finally, connect the ``GetRadius`` output of the ``vtkCylinder`` module to the new input port of ``PythonSource``.  Upon execution, the radius of the cylinder is printed to the console as before.  Figure :ref:`A PythonSource module can be used to directly insert scripts into the workflow <fig-python_source>` shows the new workflow together with the ``PythonSource`` configuration window.
+
+.. _fig-python_source:
+
+.. figure:: figures/creating/python_source_module.png
+   :height: 1.5in
+   :align: center
+
+   A ``PythonSource`` module can be used to directly insert scripts into the workflow.
+
+.. figure:: figures/creating/python_source_configuration.png
+   :height: 2.5in
+   :align: center
+
+   The configuration window for ``PythonSource`` allows multiple input and output ports to be specified along with the Python code that is to be executed.
+
+**Accessing vtkObjects in PythonSource** When using a ``PythonSource`` module, users will often rely on their knowledge of VTK to interact with VTK modules.  It is important to realize that a VTK module is really a wrapping of a vtkObject.  The real vtkObject is called vtkInstance, meaning the vtkObject of a module called 'dataset' is called 'dataset.vtkInstance' (see figure :ref:`Accessing vtkObjects... <fig-pythonsource-vtkinstance>`).
+
+.. _fig-pythonsource-vtkinstance:
+
+.. figure:: figures/creating/python_source_instance.png
+   :align: center
+   :width: 4in
+
+   Accessing vtkObjects - The vtkObject of a VTK module, 'dataset', is accessed with 'dataset.vtkInstance'. 
+
+.. index:: builder
diff --git a/doc/usersguide/database.rst b/doc/usersguide/database.rst
new file mode 100644
index 0000000..88432ea
--- /dev/null
+++ b/doc/usersguide/database.rst
@@ -0,0 +1,176 @@
+.. _chap-database:
+
+************************
+Connecting to a Database
+************************
+
+.. index:: database
+
+.. \newcommand{\fixme}[1]{***#1}}}
+
+
+As an environment for collaborative scientific exploration, |vistrails|
+supports both stand-alone, file-based storage and relational storage
+of vistrails.  With a relational database supporting |vistrails|, multiple users
+can easily collaborate on projects without copying files back and
+forth.  At the same time, if you choose to work without being
+connected to a database, you can save your work locally to files.
+Finally, |vistrails| can import and export to both types of storage so
+you can import a vistrail from the database, save it locally as a
+file on your computer, make and save changes, and export those changes
+back to the database.  Remember that because the complete workflow
+evolution is always saved, other users will not overwrite your changes, and vice versa. This prevents users from "stepping on each other's feet."
+
+By default, |vistrails| works with local files stored in the
+".vt" format (essentially compressed XML).  You can save a vistrail as
+uncompressed XML by saving the file with a ".xml" extension.
+When saving a vistrail, the system displays a standard save dialog.
+These files have a version associated with them so when the schema for
+these files may change, |vistrails| will be able to import older versions.
+The current version of the XML schema can be found in the distribution
+at:
+
+``vistrails/db/versions/v1_0_2/schemas/xml/vistrail.xsd``
+
+where ``v1_0_2`` is the current version.
+
+Setup
+=====
+
+.. index::
+   pair: database; setup
+
+As described earlier, |vistrails| supports relational database storage as well as
+file-based storage.  Currently, |vistrails| has been tested with 
+MySQL, but in the future, we plan to support most standard relational database systems.
+
+.. _sec-database-setup:
+
+Setting up the database
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Before using |vistrails| with a relational database, you must have a
+database installed and have access to create, access, and
+modify that database.  If you are planning to deploy for
+institution-wide access, you should consult your system administrator
+to determine the correct configuration.  The database schema for 
+|vistrails| can be found in the distribution at:
+
+``vistrails/db/versions/v1_0_2/schemas/sql/vistrails.sql``
+
+where ``v1_0_2`` is the current version.  This schema contains a
+sequence of SQL commands that define the tables needed for storing
+vistrails.
+
+After you or someone else has created the database for the vistrails,
+you will need the following information:
+
+#. *hostname*: the name or IP address of the machine that stores the database (``localhost`` if it is your own machine)
+#. *port*: the port number that you connect to the database on
+#. *user*: the username that should be used to access and modify the vistrails database
+#. *password*: the password for the account corresponding to the given user
+#. *database name*: the name of the database where the vistrails are to be stored.
+
+.. _sec-database-config:
+
+Setting up |vistrails|
+^^^^^^^^^^^^^^^^^^^^^^
+
+If you are planning to use the database for most of your work,
+you can configure |vistrails| to open vistrails from the database by
+default.  To do so, select the ``Preferences`` option from the ``Edit`` menu. (On Mac OS X, the ``Preferences`` option is found under the ``VisTrails`` menu.) When the ``Preferences`` window opens, select the appropriate option from the "Read/Write to database by default" box in the ``General Configuration`` tab.
+
+.. _sec-database-open:
+
+Opening from a database
+=======================
+
+.. index::
+   pair: database; opening from
+
+To open a vistrail from a relational database, choose the ``Import`` option from the ``File`` menu.
+You should see a dialog like
+the one pictured in Figure :ref:`fig-database-open`.  
+(Alternatively, if
+you have set |vistrails| to use a relational database by default
+(see Section :ref:`sec-database-config`), then you should select ``File`` :math:`\rightarrow` ``Open`` from the menu or the ``Open`` button on the toolbar.)  
+
+If you have previously connected to databases using |vistrails|, you
+should see a list of these databases in the left column of the dialog.  If not,
+you will need to add one.  To do so, click the ``+`` icon in the
+lower-left corner.  This will bring up a dialog like that shown in
+Figure :ref:`fig-database-create`. To set up a connection, you will
+need the database connection information outlined in
+Section :ref:`sec-database-setup`.  After filling in that information,
+you can test the connection by clicking the ``Test`` button.
+If the test succeeds, click the ``Create`` button to add the
+database to the available sources for vistrails.
+
+The database you wish to use should now be listed in the left column.
+Clicking on that row will query the database for a list of vistrails
+available from the database and display them in the right column.  To
+open a vistrail, select the desired vistrail and click the
+``Open`` button or simply double-click the vistrail.  When
+the vistrail has loaded, you will be able to interact with it in
+exactly the same way as a vistrail loaded from a file.
+
+.. _fig-database-open:
+
+.. figure:: figures/database/open_dialog.png
+   :align: center
+   :width: 3in
+
+   Opening a vistrail from the database
+
+.. _fig-database-create:
+
+.. figure:: figures/database/create_dialog.png
+   :align: center
+   :width: 3in
+
+   Creating a new database connection
+
+Saving to a database
+====================
+
+.. index::
+   pair: database; saving to
+
+If you opened a vistrail from the database, the default save action
+will be to save that vistrail back to the database.  There will be no
+dialogs displayed---the database the vistrail was loaded from will be
+automatically updated.
+
+If you opened the vistrail from a file, you will need to select either
+``Save As`` or ``Export`` from the
+``File`` menu, depending on whether |vistrails| uses the
+database by default (see Section :ref:`sec-database-config`).  You will
+be shown a dialog similar to the one in
+Figure :ref:`fig-database-save`.  As discussed in
+Section :ref:`sec-database-open`, you can create a new connection to the
+database or use an existing one.  Note that the name of the vistrail
+must differ from those already stored on the database, and clicking the
+``Save`` button will persist the changes to the database.
+
+.. _fig-database-save:
+
+.. figure:: figures/database/save_dialog.png
+   :align: center
+   :width: 3in
+
+   Saving a vistrail to the database
+
+Known Issues
+============
+
+.. index::
+   pair: database; issues
+
+Currently, saving a vistrail to the database will *overwrite* the
+vistrail currently stored on the database.  However, we plan to add
+synchronization soon so that all explorations are captured.  Thus, be
+aware that if two users have the same vistrail loaded from the
+database at the same time, and both users save their changes, only the
+second user's changes will be captured.
+
+.. index:: database
diff --git a/doc/usersguide/developer.rst b/doc/usersguide/developer.rst
new file mode 100644
index 0000000..d2cbf9e
--- /dev/null
+++ b/doc/usersguide/developer.rst
@@ -0,0 +1,16 @@
+.. _part3:
+
+#################
+Developer's Guide
+#################
+
+.. toctree::
+   :maxdepth: 2
+
+   packages
+   batch
+   log
+   example_itk
+   controlflowdev
+   parallelization
+   cltools
diff --git a/doc/usersguide/example.rst b/doc/usersguide/example.rst
new file mode 100644
index 0000000..97d66c2
--- /dev/null
+++ b/doc/usersguide/example.rst
@@ -0,0 +1,58 @@
+************
+User's Guide
+************
+
+#################
+Preliminary Pages
+#################
+
+.. toctree::
+   :maxdepth: 1
+
+   preface
+
+############################
+An Introduction to VisTrails
+############################
+
+.. toctree::
+   :maxdepth: 2
+
+   intro2
+   getting_started
+
+#############################
+Learning VisTrails By Example
+#############################
+
+.. toctree::
+   :maxdepth: 2
+
+   creating
+   groups
+   version_tree
+   merging
+   querying
+   spreadsheet
+   tabledata
+   analogies
+   parameter_exploration
+   provenance
+   mashups
+   example_guide
+
+############################################
+Intermediate Concepts and VisTrails Packages
+############################################
+
+.. toctree::
+   :maxdepth: 2
+
+   controlflow
+   cfassistant
+   parallelflow
+   database
+   example_webservices
+   persistence
+   vistrails_server
+   latex
diff --git a/doc/usersguide/example_guide.rst b/doc/usersguide/example_guide.rst
new file mode 100644
index 0000000..1df12af
--- /dev/null
+++ b/doc/usersguide/example_guide.rst
@@ -0,0 +1,229 @@
+.. _chap-example_guide:
+
+********************************
+Module Descriptions and Examples
+********************************
+
+.. index:: VisTrails VTK modules
+
+VisTrails VTK modules
+=====================
+
+Although most VTK modules in VisTrails would be familiar to vtk users, or at least in the vtk documentation, there are a few modules that VisTrails introduces.  They are used as follows:
+
+* **PythonSource** - Although a PythonSource is in the Basic Modules list rather than VTK, it is mentioned here for convenience.  This module allows you write python statements to be executed as part of the workflow.  See Section :ref:`sec-pythonsource` for more information.
+
+* **VTKCell** - VTKCell is a VisTrails module that can display a vtkRenderWindow inside a cell.  Simply pass it a vtkRenderer and any additional optional inputs, and it will display the results in the spreadsheet.
+
+* **VTKRenderOffscreen** - Takes the output of a vtkRenderer and produces a PNG image of size width X height.  Default values of width and height are 512.  The output can then be written to a file using a FileSink.
+
+* **VTKViewCell** - This is similar to the VTKCell except that you pass it a vtkRenderView.
+
+* **vtkInspectors: vtkDataArrayInspector, vtkDataSetAttributesInspector, vtkDataSetInspector, vtkPolyDataInspector** - These inspectors were created to allow easy access to information that is not otherwise exposed by module ports, but would be accessible through vtk objects.  This information includes: normals, scalars, tensors, and vectors as well as statistical information such as bounds, center, length, max, min.  Looking at the output ports of these inspectors gives an idea of the i [...]
+
+.. index:: vtkInteractionHandler
+
+* **vtkInteractionHandler** - The vtkInteractionHandler is used when a callback function is needed.  To setup this handler:
+
+   * Connect the Observer input port to the output port of the object that needs the callback function.  
+   * Connect the SharedData input port to the modules that would be passed as parameters to the callback function.  Multiple modules can be connected (see terminator.vt - Images Slices SW).
+   * Connect the output port to the VTKCell.
+   * Select configure to write the callback function.
+
+      * Name the function after the event that initiates it, but replace 'Event' with 'Handler'.  If the function should be called when a ``StartInteractionEvent`` occurs, the function should be named ``startInteractionHandler``.
+      * The function should take the parameters observer, and shareddata.
+      * Add the contents of the function.
+
+   There are a number of examples that use the vtkInteractionHandler.  If there is any confusion, comparing the callback/interaction handler portions of the .py and .vt files in the vtk_examples/GUI directory is helpful.
+
+   **Accessing vtkObjects in vtkInteractionHandler** VtkObjects passed to the vtkInteractionHandler are VisTrails modules.  The vtkObject within that module is called a vtkInstance and is accessed by calling myModule.vtkInstance.  See Section :ref:`sec-pythonsource` for more information.
+
+* **vtkScaledTransferFunction** - Allows you to add a transfer function through the use of an interactive widget.  See head.vt - volume rendering or terminator.vt for example usage.
+
+.. _sec-module-example:
+
+Modules and Corresponding Examples
+==================================
+
+Here we provide a list of the .vt files in the examples directory that use the following modules:
+
+.. index:: 
+   pair: modules; list of examples
+
+* **AreaFilter**: 
+   triangle_area.vt
* **CellLocation**: 
+   offscreen.vt, terminator.vt, vtk.vt
* **ConcatenateString**: 
+   KEGG_SearchEntities_webservice.vt
* **Cross**: 
+   triangle_area.vt
* **fetchData**: 
+   structure_or_id_webservice.vt, protein_visualization.vt
* **FileSink**: 
+   offscreen.vt - offscreen
* **Filter**: 
+   triangle_area.vt
* **If**: 
+   structure_or_id_webservice.vt, protein_visualization.vt
* **ImageViewerCell**: 
+   r_stats.vt
* **List**: 
+   triangle_area.vt
* **Map**: 
+   triangle_area.vt
* **MplFigure**: 
+   plot.vt, terminator.vt - Histrogram, triangle_area.vt, vtk.vt - Three Cells
* **MplFigureCell**: 
+   plot.vt, terminator.vt - Histrogram, triangle_area.vt, vtk.vt - Three Cells
* **MplPlot**: 
+   plot.vt, terminator.vt - Histrogram, triangle_area.vt, vtk.vt - Three Cells
* **PythonCalc**: 
+   ProbeWithPointWidget.vt, officeTube.vt
* **PythonSource**: 
+   infovis.vt, noaa_webservices.vt, offscreen.vt, KEGG_SearchEntities_webservice.vt, chebi_webservice.vt, EMBOSS_webservices.vt, structure_or_id_webservice.vt, vtk_http.vt, protein_visualization.vt, terminator.vt, triangle_area.vt
* **RichTextCell**: 
+   noaa_webservices.vt, offscreen.vt, KEGG_SearchEntities_webservice.vt, chebi_webservice.vt, EMBOSS_webservices.vt, protein_visualization.vt
* **RPNGFigure**: 
+   r_stats.vt
* **RReadCSV**: 
+   r_stats.vt
* **Rsource**: 
+   r_stats.vt
* **SheetReference**: 
+   offscreen.vt, vtk.vt
* **StandardOutput**: 
+   r_stats.vt, triangle_area.vt
* **Tuple**: 
+   marching.vt, ProbingWithPlaneWidget.vt, TransformWithBoxWidget.vt, BandContourTerrain.vt, probeComb.vt, ImplicitPlaneWidget.vt, BuildUGrid.vt, ProbeWithPointWidget.vt, VolumeRenderWithBoxWidget.vt, PerlinTerrain.vt
* **Untuple**: 
+   probeComb.vt, BandContourTerrain.vt
* **vtk3DSImporter**: 
+   flamingo.vt
* **vtkAppendPolyData**: 
+   vtk.vt - Implicit Plane Clipper, xyPlot.vt, TransformWithBoxWidget.vt, probeComb.vt, ImplicitPlaneWidget.vt, warpComb.vt
* **vtkAssembly**: 
+   assembly.vt
* **vtkAxes**: 
+   textOrigin.vt
* **vtkBandedPolyDataContourFilter**: 
+   BandContourTerrain.vt
* **vtkBMPReader**: 
+   Tplane.vt, imageWarp.vt, GenerateTextureCoords.vt
* **vtkBoxWidget**: 
+   TransformWithBoxWidget.vt, VolumeRenderWithBoxWidget.vt, cone.vt - 6
* **vtkBYUReader**: 
+   cubeAxes.vt, ClipCow.vt
* **vtkCastToConcrete**: 
+   ExtractUGrid.vt
* **vtkCellArray**: 
+   constrainedDelaunay.vt, Arrays.vt, CreateStrip.vt
* **vtkClipPolyData**: 
+   terminator.vt, vtk.vt - Implicit Plane Clipper, ImplicitPlaneWidget.vt, ClipCow.vt
* **vtkColorTransferFunction**: 
+   lung.vt, SimpleRayCast.vt, mummy.xml - volume rendering, SimpleTextureMap2D.vt, VolumeRenderWithBoxWidget.vt
* **vtkCone**: 
+   iceCream.vt
* **vtkConeSource**: 
+   vtk_book_3rd_p193.vt, vtk.vt - Implicit Plane Clipper, TransformWithBoxWidget.vt, Cone.vt, ImplicitPlaneWidget.vt, ProbeWithPointWidget.vt, assembly.vt
* **vtkConnectivityFilter**: 
+   ExtractUGrid.vt, pointToCellData.vt
* **vtkContourFilter**: 
+   brain_vistrail.vt, spx.vt, vtk_http.vt, marching.vt, head.vt - alias, mummy.xml - Isosurface, terminator.vt, pointToCellData.vt, triangle_area.vt - CalculateArea, Medical1.vt, hello.vt, VisQuad.vt, probeComb.vt, vtk_book_3rd_p189.vt, Medical2.vt, iceCream.vt, Contours2D.vt, Medical3.vt, PerlinTerrain.vt, ColorIsosurface.vt, PseudoVolumeRendering.vt
* **vtkCubeAxesActor2D**: 
+   cubeAxes.vt
* **vtkCubeSource**: 
+   assembly.vt, marching.vt
* **vtkCutter**: 
+   ClipCow.vt, CutCombustor.vt, PseudoVolumeRendering.vt
* **vtkCylinderSource**: 
+   assembly.vt, cylinder.vt
* **vtkDataArrayInspector**: 
+   CutCombuster.vt, officeTube.vt
* **vtkDataSetAttributesInspector**: 
+   officeTube.vt, CutCombustor.vt
* **vtkDataSetInspector**: 
+   ProbingWithPlaneWidget.vt, StreamlinesWithLineWidget.vt, CutCombustor.vt, officeTube.vt, TextureThreshold.vt, BandContourTerrain.vt, probeComb.vt, ProbeWithPointWidget.vt, rainbow.vt, streamSurface.vt, warpComb.vt
* **vtkDataSetMapper**: 
+   offscreen.vt, spx.vt, structure_or_id_webservice.vt, vtk_http.vt, SubsampleGrid.vt, TextureThreshold.vt, imageWarp.vt, protein_visualization.vt, head.vt - alias, mummy.xml - Isosurface, terminator.vt - Histogram, pointToCellData.vt, ExtractUGrid.vt, ExtractGeometry.vt, vtk.vt, BuildUGrid.vt, GenerateTextureCoords.vt
* **vtkDataSetReader**: 
+   brain_vistrail.vt, vtk_http.vt, triangle_area.vt, ExtractUGrid.vt, vtk.vt
* **vtkDecimatePro**: 
+   smoothFran.vt
* **vtkDelaunay2D**: 
+   constrainedDelaunay.vt, faultLines.vt
* **vtkDelaunay3D**: 
+   GenerateTextureCoords.vt
* **vtkDEMReader**: 
+   BandContourTerrain.vt
* **vtkDoubleArray**: 
+   Arrays.vt
* **vtkExtractEdges**: 
+   constrainedDelaunay.vt, marching.vt
* **vtkExtractGeometry**: 
+   ExtractGeometry.vt
* **vtkExtractGrid**: 
+   SubsampleGrid.vt, PseudoVolumeRendering.vt - vtkPlane
* **vtkExtractUnstructuredGrid**: 
+   ExtractUGrid.vt
* **vtkExtractVOI**: 
+   Contours2D.vt
* **vtkFloatArray**: 
+   Arrays.vt, BuildUGrid.vt, marching.vt
* **vtkFollower**: 
+   textOrigin.vt
* **vtkGeometryFilter**: 
+   ExtractUGrid.vt, pointToCellData.vt
* **vtkGlyph3D**: 
+   vtk_book_3rd_p193.vt, marching.vt, vtk.vt - Implicit Plane Clipper, TransformWithBoxWidget.vt, ImplicitPlaneWidget.vt, ProbeWithPointWidget.vt, spikeF.vt
* **vtkGraphLayoutView**: 
+   infovis.vt
* **vtkHexahedron**: 
+   BuildUGrid.vt
* **vtkIcicleView**: 
+   infovis.vt
* **vtkIdList**: 
+   BuildUGrid.vt, marching.vt
* **vtkImageActor**: 
+   Medical3.vt
* **vtkImageDataGeometryFilter**: 
+   BandContourTerrain.vt, imageWarp.vt
* **vtkImageLuminance**: 
+   imageWarp.vt
* **vtkImageMapToColors**: 
+   brain_vistrail.vt, Medical3.vt
* **vtkImageReslice**: 
+   terminator.vt
* **vtkImageShiftScale**: 
+   lung.vt - raycasted
* **vtkImageShrink3D**: 
+   BandContourTerrain.vt
* **vtkImplicitBoolean**: 
+   iceCream.vt, ExtractGeometry.vt
* **vtkImplicitModeller**: 
+   hello.vt
* **vtkImplicitPlaneWidget**: 
+   terminator.vt, vtk.vt, ImplicitPlaneWidget.vt
* **vtkImplicitSum**: 
+   PerlinTerrain.vt
* **vtkIntArray**: 
+   Arrays.vt
* **vtkInteractionHandler**: 
+   ProbingWithPlaneWidget.vt, StreamlinesWithLineWidget.vt, terminator.vt, vtk.vt - Implicit Plane Clipper, TransformWithBoxWidget.vt, Cone.vt - 6 , ImplicitPlaneWidget.vt, ProbeWithPointWidget.vt, VolumeRenderWithBoxWidget.vt
* **vtkInteractorStyleImage**: 
+   terminator.vt
* **vtkInteractorStyleTrackballCamera**: 
+   Cone.vt - 5
* **vtkLight**: 
+   cubeAxes.vt, faultLines.vt
* **vtkLine**: 
+   BuildUGrid.vt
* **vtkLineSource**: 
+   streamSurface.vt, xyPlot.vt
* **vtkLineWidget**: 
+   StreamlinesWithLineWidget.vt
* **vtkLODActor**: 
+   TestText.vt, stl.vt, CADPart.vt, vtk.vt - Implicit Plane Clipper, TransformWithBoxWidget.vt, BandContourTerrain.vt, cubeAxes.vt, ImplicitPlaneWidget.vt, FilterCADPart.vt, ColorIsosurface.vt
* **vtkLookupTable**: 
+   brain_vistrail.vt, vtk_book_3rd_p193.vt, pointToCellData.vt, BandContourTerrain.vt, ExtractUGrid.vt, Medical3.vt, rainbow.vt, PseudoVolumeRendering.vt
* **vtkMaskPoints**: 
+   vtk_book_3rd_p193.vt, spikeF.vt
* **vtkMassProperties**: 
+   triangle_area.vt - CalculateArea
* **vtkMergeFilter**: 
+   imageWarp.vt
* **vtkOpenGLVolumeTextureMapper3D**: 
+   lung.vt - TextureWithShading
* **vtkOutlineFilter**: 
+   VisQuad.vt, probeComb.vt, ExtractGeometry.vt, vtk_book_3rd_p189.vt, cubeAxes.vt, VolumeRenderWithBoxWidget.vt, Contours2D.vt, Medical1.vt, Medical2.vt, Medical3.vt
* **vtkPDBReader**: 
+   protein_visualization.vt, structure_or_id_webservice.vt
* **vtkPerlinNoise**: 
+   PerlinTerrain.vt
* **vtkPiecewiseFunction**: 
+   lung.vt, SimpleRayCast.vt, mummy.xml - volume rendering, SimpleTextureMap2D.vt, VolumeRenderWithBoxWidget.vt
* **vtkPixel**: 
+   BuildUGrid.vt
* **vtkPlane**: 
+   lung.vt - TS and plane, CutCombustor.vt, terminator.vt, vtk.vt - Implicit Plane Clipper, ImplicitPlaneWidget.vt, iceCream.vt, PerlinTerrain.vt, ClipCow.vt
* **vtkPlanes**: 
+   VolumeRenderWithBoxWidget.vt
* **vtkPlaneSource**: 
+   Tplane.vt, terminator.vt, probeComb.vt
* **vtkPlaneWidget**: 
+   ProbingWithPlaneWidget.vt
* **vtkPLOT3DReader**: 
+   ProbingWithPlaneWidget.vt, StreamlinesWithLineWidget.vt, CutCombustor.vt, SubsampleGrid.vt, TextureThreshold.vt, xyPlot.vt, probeComb.vt, ProbeWithPointWidget.vt, rainbow.vt, ColorIsosurface.vt, streamSurface.vt, warpComb.vt, PseudoVolumeRendering.vt
* **vtkPointData**: 
+   marching.vt, Arrays.vt, BuildUGrid.vt
* **vtkPointDataToCellData**: 
+   pointToCellData.vt
* **vtkPoints**: 
+   CreateStrip.vt, marching.vt, constrainedDelaunay.vt, Arrays.vt, BuildUGrid.vt
* **vtkPointSource**: 
+   GenerateTextureCoords.vt, officeTube.vt
* **vtkPointWidget**: 
+   ProbeWithPointWidget.vt
* **vtkPolyData**: 
+   CreateStrip.vt, ProbingWithPlaneWidget.vt, constrainedDelaunay.vt, StreamlinesWithLineWidget.vt, Arrays.vt, ProbeWithPointWidget.vt, ClipCow.vt
* **vtkPolyDataInspector**: 
+   ClipCow.vt
* **vtkPolyDataNormals**: 
+   brain_vistrail.vt, pointToCellData.vt, Medical1.vt , faultLines.vt, ExtractUGrid.vt, smoothFran.vt, cubeAxes.vt, Medical2.vt, Medical3.vt, ClipCow.vt, ColorIsosurface.vt, warpComb.vt, PerlinTerrain.vt, spikeF.vt, PseudoVolumeRendering.vt, BandContourTerrain.vt
* **vtkPolyDataReader**: 
+   hello.vt, faultLines.vt, smoothFran.vt, spikeF.vt
* **vtkPolygon**: 
+   BuildUGrid.vt
* **vtkPolyLine**: 
+   BuildUGrid.vt
* **vtkPolyVertex**: 
+   BuildUGrid.vt
* **vtkProbeFilter**: 
+   brain_vistrail.vt, ProbingWithPlaneWidget.vt, xyPlot.vt, probeComb.vt, ProbeWithPointWidget.vt
* **vtkProperty2D**: 
+   xyPlot.vt
* **vtkPyramid**: 
+   BuildUGrid.vt
* **vtkQuad**: 
+   BuildUGrid.vt
* **vtkQuadraticDecimation**: 
+   spx.vt - Decimate
* **vtkQuadric**: 
+   VisQuad.vt, ExtractGeometry.vt, vtk_book_3rd_p189.vt, Contours2D.vt
* **vtkRandomGraphSource**: 
+   infovis.vt - hello_world
* **VTKRenderOffscreen**: 
+   offscreen.vt
* **vtkRibbonFilter**: 
+   StreamlinesWithLineWidget.vt
* **vtkRuledSurfaceFilter**: 
+   streamSurface.vt
* **vtkRungeKutta4**: 
+   StreamlinesWithLineWidget.vt, officeTube.vt, streamSurface.vt
* **vtkSampleFunction**: 
+   VisQuad.vt, ExtractGeometry.vt, vtk_book_3rd_p189.vt, iceCream.vt, Contours2D.vt, PerlinTerrain.vt
* **vtkScaledTransferFunction**: 
+   head.vt - volume rendering, terminator.vt
* **vtkShrinkFilter**: 
+   ExtractGeometry.vt
* **vtkShrinkPolyData**: 
+   marching.vt, filterCADPart.vt
* **vtkSmoothPolyDataFilter**: 
+   xyPlot.vt
* **vtkSphere**: 
+   iceCream.vt, ExtractGeometry.vt
* **vtkSphereSource**: 
+   TestText.vt, marching.vt, assembly.vt, vtk.vt - Implicit Plane Clipper, TransformWithBoxWidget.vt, ImplicitPlaneWidget.vt
* **vtkSTLReader**: 
+   stl.vt, CADPart.vt, FilterCADPart.vt
* **vtkStreamLine**: 
+   StreamlinesWithLineWidget.vt, officeTube.vt, streamSurface.vt
* **vtkStripper**: 
+   brain_vistrail.vt, Medical2.vt, Medical3.vt, ClipCow.vt
* **vtkStructuredGridGeometryFilter**: 
+   CutCombuster.vt, officeTube.vt, TextureThreshold.vt, rainbow.vt, warpComb.vt
* **vtkStructuredGridOutlineFilter**: 
+   StreamlinesWithLineWidget.vt, officeTube.vt, SubsampleGrid.vt, TextureThreshold.vt, xyPlot.vt, probeComb.vt, ProbeWithPointWidget.vt, rainbow.vt, ColorIsosurface.vt, streamSurface.vt, warpComb.vt, PseudoVolumeRendering.vt, ProbingWithPlaneWidget.vt, CutCombustor.vt
* **vtkStructuredGridReader**: 
+   officeTube.vt
* **vtkStructuredPointsReader**: 
+   lung.vt, vtk_book_3rd_p193.vt, SimpleRayCast.vt, TextureThreshold.vt, head.vt - volume rendering, mummy.xml - volume rendering, head.vt - alias, mummy.xml - Isosurface, terminator.vt, SimpleTextureMap2D.vt
* **vtkTetra**: 
+   BuildUGrid.vt
* **vtkTextActor**: 
+   TestText.vt
* **vtkTextProperty**: 
+   TestText.vt, xyPlot.vt, cubeAxes.vt
* **vtkTexture**: 
+   Tplane.vt, TextureThreshold.vt, terminator.vt, GenerateTextureCoords.vt
* **vtkTextureMapToCylinder**: 
+   GenerateTextureCoords.vt
* **vtkThreshold**: 
+   pointToCellData.vt
* **vtkThresholdPoints**: 
+   vtk_book_3rd_p193.vt, marching.vt
* **vtkThresholdTextureCoords**: 
+   TextureThreshold.vt
* **vtkTransform**: 
+   marching.vt, terminator.vt, xyPlot.vt, TransformWithBoxWidget.vt, Cone.vt - 6, probeComb.vt, ExtractGeometry.vt, spikeF.vt
* **vtkTransformPolyDataFilter**: 
+   marching.vt, xyPlot.vt, probeComb.vt, spikeF.vt
* **vtkTransformTextureCoords**: 
+   GenerateTextureCoords.vt
* **vtkTreeMapView**: 
+   infovis.vt
* **vtkTreeRingView**: 
+   infovis.vt
* **vtkTriangle**: 
+   BuildUGrid.vt
* **vtkTriangleFilter**: 
+   triangle_area.vt - CalculateArea, ClipCow.vt
* **vtkTriangleStrip**: 
+   BuildUGrid.vt
* **vtkTubeFilter**: 
+   marching.vt, constrainedDelaunay.vt, officeTube.vt, officeTubes.vt, xyPlot.vt, faultLines.vt, PseudoVolumeRendering.vt
* **vtkUnstructuredGrid**: 
+   BuildUGrid.vt, marching.vt
* **vtkUnstructuredGridReader**: 
+   offscreen.vt, spx.vt, pointToCellData.vt
* **vtkVectorText**: 
+   textOrigin.vt, marching.vt
* **vtkVertex**: 
+   BuildUGrid.vt
* **VTKViewCell**: 
+   infovis.vt
* **vtkViewTheme**: 
+   infovis.vt - cone_layout
* **vtkVolume**: 
+   lung.vt, SimpleRayCast.vt, head.vt - volume rendering, mummy.xml - volume rendering, terminator.vt, SimpleTextureMap2D.vt, VolumeRenderWithBoxWidget.vt
* **vtkVolume16Reader**: 
+   VolumeRenderWithBoxWidget.vt, Medical1.vt, Medical2.vt, Medical3.vt
* **vtkVolumeProperty**: 
+   lung.vt, SimpleRayCast.vt, head.vt - volume rendering, mummy.xml - volume rendering, terminator.vt, SimpleTextureMap2D.vt, VolumeRenderWithBoxWidget.vt
* **vtkVolumeRayCastCompositeFunction**: 
+   lung.vt - raycasted, SimpleRayCast.vt, mummy.xml - volume rendering, terminator.vt - SW, VolumeRenderWithBoxWidget.vt
* **vtkVolumeRayCastMapper**: 
+   lung.vt - raycasted, SimpleRayCast.vt, mummy.xml - volume rendering, terminator.vt - SW, VolumeRenderWithBoxWidget.vt
* **vtkVolumeTextureMapper2D**: 
+   SimpleTextureMap2D.vt
* **vtkVolumeTextureMapper3D**: 
+   head.vt - volume rendering, terminator.vt - HW
* **vtkVoxel**: 
+   BuildUGrid.vt
* **vtkWarpScalar**: 
+   imageWarp.vt, BandContourTerrain.vt, warpComb.vt
* **vtkWarpVector**: 
+   pointToCellData.vt, ExtractUGrid.vt
* **vtkWedge**: 
+   BuildUGrid.vt
* **vtkWindowLevelLookupTable**: 
+   terminator.vt
* **vtkXMLTreeReader**: 
+   infovis.vt
* **vtkXYPlotActor**: 
+   xyPlot.vt
diff --git a/doc/usersguide/example_itk.rst b/doc/usersguide/example_itk.rst
new file mode 100644
index 0000000..4d727bf
--- /dev/null
+++ b/doc/usersguide/example_itk.rst
@@ -0,0 +1,293 @@
+************
+Example: ITK
+************
+
+Introduction to ITK
+===================
+
+The *Insight Toolkit*, [#]_ or ITK, is an open-source software system initially
+designed to support the Visible Human Project [C1]_.
+ITK is under continual development, being updated to employ
+cutting-edge segmentation and registration algorithms for multiple
+dimensions.  For more information about ITK, please refer to [C2]_ and [C3]_.
+
+In order to facilitate the implementation of processing mechanisms
+specific to the medical imaging community, ITK provides a robust set
+of general purpose image processing tools.  These image processing
+tools are available to users through the standard ITK Filter interface.  Although ITK is implemented in
+C++, through the use of CMake [#]_ and CableSwig [#]_,
+the functionality of ITK is made available to languages such as TCL,
+Java, and Python. In addition, much of the functionality of ITK is also available in a |vistrails| package. The ITK package is not currently included in the binary distribution of |vistrails|, but it may be downloaded separately from the |vistrails| website.
+
+**Note:** The WrapITK library, upon which the |vistrails| ITK package depends, is well-tested on Linux and Mac OS X platforms. It is, however, known to have issues under Windows.
+
+Preparing ITK
+=============
+
+At the time of this writing, the latest stable release of ITK is 3.6.0.
+In order to incorporate the functionality of ITK into the |vistrails|
+system, it first must be built and installed.  In the following
+sections, we will describe in detail the process of downloading,
+building, and installing ITK and all the required components needed to
+use it.
+
+Downloading ITK
+^^^^^^^^^^^^^^^
+
+ITK can be downloaded in either source tarballs or via public CVS
+access to the ITK source repository.  The following instructions take
+advantage of the CVS source repository; however, source tarballs can
+be downloaded from: http://www.itk.org/
+
+These instructions can be found, in part, at the ITK
+website.  To use CVS, you
+must have a CVS client installed on your system.  To download the ITK
+library, issue the following commands:
+
+.. parsed-literal::
+   
+   cvs -d :pserver:anonymous at www.itk.org:/cvsroot/Insight login
+   *password: insight*
+
+   cvs -d :pserver:anonymous at www.itk.org:/cvsroot/Insight co Insight
+
+Change directory into the newly created ``Insight/Utilities``
+directory and issue the following command:
+
+.. parsed-literal::
+
+   cvs -d :pserver:anonymous at public.kitware.com:/cvsroot/CableSwig co CableSwig
+
+This checkout includes CableSwig in the ITK system,
+allowing it to be built automatically during compilation of ITK
+itself.  
+
+Building the ITK Libraries
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ITK requires CMake to be installed and available on your
+system.
+As of ITK version 3.2.0, CMake version 2.4.6 or greater must be used
+to prevent compilation errors.  In order to simplify updating ITK to
+later versions of the software, we perform an out-of-source build.  To
+do this, we first create a directory outside the **Insight**
+directory created for us during the CVS checkout process.
+
+.. parsed-literal::
+
+   mkdir itk
+   cd itk
+
+We now run CMake, or the GUI-based version ccmake, in this directory. If you're using Windows, you may wish to run the Windows-specific ``cmake-gui.exe`` instead.
+
+.. parsed-literal::
+
+   ccmake ../Insight
+
+Note:  The above command assumes that the **Insight** directory exists
+at the same level as the **itk** directory that we just created.
+
+The following advanced CMake variables must be set to the appropriate values:
+
+.. csv-table::
+   :header: CMake Variable, Value
+
+   BUILD\_SHARED\_LIBS, ON
+   INSTALL\_WRAP\_ITK\_COMPATIBILITY, ON
+   ITK\_CSWIG\_PYTHON, OFF
+   ITK\_USE\_REVIEW, ON
+   USE\_WRAP\_ITK, ON
+   WRAP\_ITK\_PYTHON, ON
+   WRAP\_ITK\_JAVA, OFF
+
+Note:  Some CMake variables are only available based on the state of
+others.  If a variable is missing from the list, set what is visible
+and re-configure, this will often allow you to see and set additional
+parameters.
+
+After generating the appropriate files and exiting ccmake, the
+standard build process can be completed.  To compile (on Linux or Mac OS X), run:
+
+.. parsed-literal::
+
+   make
+   sudo make install
+
+On Windows, the build process is governed by the type of project or Makefile generated by CMake.
+
+.. topic:: Note:
+
+   It is possible to use ITK without installing it.  To do this, the environment variables LD\_LIBRARY\_PATH and PYTHONPATH must be set to the appropriate build directories:
+
+   |   ``LD_LIBRARY_PATH=/Path_To_itk/bin``
+   |   ``PYTHONPATH=/Path_To_itk/Wrapping/WrapITK/Python``
+
+At this point, ITK is build and installed.  To validate this, open a
+Python shell and issue the following commands:
+
+.. parsed-literal::
+
+   >>> import itk
+   >>> itk.Image[itk.US,2]
+
+The above commands should both complete without error, and should produce the output:
+
+.. parsed-literal::
+
+   <class 'itkImage.itkImageUS2'>
+
+The WrapITK
+implementation used to wrap ITK for use in Python lazily instantiates
+required classes.  This means that even if the import succeeds, the
+instantiation of the above ``itk.Image`` class may fail.  This is
+particularly common if the environment variable LD\_LIBRARY\_PATH is incorrectly set.
+
+ITK and |vistrails|
+===================
+
+When built and installed with the appropriate Python bindings
+included, ITK can be used from |vistrails| through the ITK package.
+As mentioned previously, ITK is a third-party package and is not included in the general
+|vistrails| distribution.  However, like many third-party packages, it
+is available from the |vistrails| website. [#]_ 
+
+The |vistrails| ITK package is under continual development with the
+latest versions being announced on the |vistrails| website.  After
+downloading the package and extracting it into the ``.vistrails/userpackages`` directory, you can enable it through the ``Module Packages`` tab in the ``Preferences`` dialog. Please refer to Chapter :ref:`chap-packages` for instructions on how to do this.
+
+Upon starting |vistrails|, the ITK package modules will be made
+available to the Builder Window.  
+
+ITK Package Organization
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ITK |vistrails| package loosely mimics the ITK functionality
+hierarchy.  The package's top level consists of base classes,
+containers, and file readers as shown in Figure :ref:`fig-structure`.
+Also available at the top level is the ``PixelType`` module and the
+specific types used to create and execute ITK-based pipelines.  
+
+Currently, the ITK Image Filters are organized into functional groups.  The five filter types, as show in Figure :ref:`fig-structurec`, are:
+
+* Feature Extraction Filters
+* Image Intensity Filters
+* Segmentation Filters
+* Image Selection Filters
+* Image Smoothing Filters
+
+All filter types currently have at least one representative ITK filter
+wrapped and usable from within the |vistrails| environment.
+
+.. _fig-structure:
+
+.. figure:: figures/example_itk/package_structure.png
+   :align: center
+   :width: 30%
+
+   \(a\) The |vistrails| ITK Package Structure Overview
+
+.. figure:: figures/example_itk/pixeltypes.png
+   :align: center
+   :width: 30%
+
+   \(b\) The ITK Package Supported PixelTypes
+
+.. _fig-structurec:
+
+.. figure:: figures/example_itk/filtertypes.png
+   :align: center
+   :width: 30%
+
+   \(c\) The ITK Package Filter Structure
+
+Reading DICOM Volumes
+^^^^^^^^^^^^^^^^^^^^^
+
+DICOM is a standard format for exchanging medical images.
+ITK includes DICOM support through the GDCM libraries. [#]_ It is worthwhile to note that at this time these 
+libraries are currently not a complete implementation of the DICOM
+standard.  
+
+DICOM volumes can be integrated into |vistrails| through the use of
+either the ``GDCMReader`` or ``DICOMReader`` modules in the ITK package.
+For the rest of this example, we will use the ``GDCMReader`` module as
+its performace is slightly higher than the ``DICOMReader``
+implementation.
+
+Figure :ref:`VisTrails workflow utilizing ITK to extract a single slice... <fig-slicer>` shows the use of the ``GDCMReader`` module.  In
+order to properly read a DICOM volume, the ``GDCMReader`` must be supplied
+with the dimension of the volume to be read and the directory
+containing the series to read.  By default, WrapITK supports
+two- and three-dimensional volumes.  In order to include support for
+higher dimensions, the appropriate WrapITK variable must be set within
+CMake, *before* compiling ITK.
+
+Volume Processing With ITK and |vistrails|
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Typically, DICOM volumes are written with no 16-bit unsigned shorts.
+Unfortunately, most systems allow the display of only 8-bit values.
+Because of the higher precision inherent in DICOM data, it is often
+preferable to perform any computation, segmentation, or processing on
+the data prior to rescaling in order to utilize as much information as
+possible.  
+
+.. _fig-slicer:
+
+.. figure:: figures/example_itk/itk_slicingpipe.png
+   :align: center
+   :width: 100%
+
+   |vistrails| workflow utilizing ITK to extract a single slice from a DICOM volume.  The slice is chosen by first forming a Region to extract.  The result is viewed through the use of standard |vistrails| Spreadsheet modules.
+
+Volume Processing With ITK and |vistrails|
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ITK image filters are
+typically templated based on the dimensionality of the data being
+processed, as well as the data type being processed.  In |vistrails|,
+these parameters are handled through the use of ``PixelType`` modules.
+Although any ITK Filter wrapped in \vistrails
+can accept any of these ``PixelType``\ s, the underlying implementation may
+not be compatible with the input ``PixelType``.  Using ``PixelType``\ s
+incompatible with the underlying filter implementations is the most
+frequent cause of error when executing otherwise functional pipelines
+in |vistrails|. 
+
+.. %%:ref:`fig-pixeltypes`
+
+When processing volumes, it is often necessary to extract a single
+slice from the volume at different stages of the processing pipeline.
+This is possible in |vistrails| through the use of the
+``ExtractImageFilter``.  Given a volume, a Region, and Dimensionality
+information, the ``ExtractImageFilter`` can extract a single slice from
+the data volume that can be used in further processing, previewing the
+results, or writing to disk.  An example workflow that extracts a slice
+from a DICOM volume can be seen in Figure :ref:`VisTrails workflow utilizing ITK to extract a single slice... <fig-slicer>`.  
+
+Visualizing the results
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Although ITK's processing filters and the DICOM standard both support
+16-bit processing and storage, many image viewers are capable of
+displaying in only 8-bit resolution using the unsigned char ``PixelType``.
+Since the output of an ITK processing workflow is an image, it makes
+sense to view it as such.  This means that we are required to both
+remap the data values in the image to 8 bits as well as perform a
+casting operation to change the data type from unsigned shorts to
+unsigned chars.  These operations are performed through the use of the
+``RescaleIntensityImageFilter`` and the ``CastImageFilter``.  Figure :ref:`VisTrails workflow utilizing ITK to extract a single slice... <fig-slicer>` demonstrates the use of the
+``RescaleIntensityImageFilter`` and the ``CastImageFilter`` in conjunction
+with the ``ImageToFile`` and ``ImageViewerCell`` modules to view the resulting slice in the |vistrails| Spreadsheet.
+
+.. rubric:: Footnotes
+.. [#] The Insight Toolkit is sometimes referred to by the longer name *Insight Segmentation and Registration Toolkit*. 
+.. [#] CMake cross-platform make system.  http://www.cmake.org
+.. [#] CableSwig Interface generator.  http://www.itk.org/HTML/CableSwig.html
+.. [#] Please Note:  At the time of this writing, the |vistrails| ITK package is not a complete wrapping of all ITK functionality.  If you would like to contact the author regarding the wrapped functionality, please do so through the e-mail address on the |vistrails| website.
+.. [#] Grass roots DiCoM Project.  http://www.creatis.insa-lyon.fr/Public/Gdcm/
+
+.. rubric:: Citations
+.. [C1] R. A. Banvard, "The visible human project image data set from inception to completion and beyond," Proceedings of CODATA, 2002.
+.. [C2] L. Ibanez, W. Schroeder, L. Ng, and J. Cates, The ITK Software Guide, 2nd ed., Kitware, Inc. ISBN 1-930934-15-7, http://www.itk.org/ItkSoftwareGuide.pdf, 2005.
+.. [C3] T. S. Yoo, M. J. Ackerman, W. E. Lorensen, W. Schroeder, V. Chalana, S. Aylward, D. Metaxes, and R. Whitaker, "Engineering and algorithm design for an image processing API: A technical report on ITK - The Insight Toolkit," Proceedings of Medicine Meets Virtual Reality, pp. 586-592, 2002.
diff --git a/doc/usersguide/example_webservices.rst b/doc/usersguide/example_webservices.rst
new file mode 100644
index 0000000..5ff7a57
--- /dev/null
+++ b/doc/usersguide/example_webservices.rst
@@ -0,0 +1,185 @@
+.. _chap-webservices:
+
+************************
+Example: Web Services
+************************
+
+A *web  service* grants you programmatic  access to an  online data source
+via a straightforward  API.  In this chapter, you will learn  how to invoke web
+services from within |vistrails| workflows. We will build a simple workflow that
+invokes a web service and generates an HTML table with the results. Our current
+example is  intentionally simple; for  more in-depth examples, please  refer to
+the |vistrails| website.
+
+**Where we're going in this chapter:**  The European Bioinformatics Institute maintains ChEBI, [#]_ a database of  over 15,000 chemical
+compounds.   Each  entity   is  referenced  by  a  unique   ID  number,  called
+its *chebiID*. To see  an example of the kind of queries  we will build in
+this example, go to http://www.ebi.ac.uk/chebi/webServices.do and scroll
+down   until   you   find   the   web   form   labeled   "getCompleteEntity."
+(Figure :ref:`fig-webservices_webform1`).   If  you  type  15357 into  the  text
+field,  it  will  return a  long  string  of  data  in  XML format  about  this
+chemical.   We  learn,   among  other   things,  that   this   chemical's  name
+is *acetylenedicarboxylate(-2)*.
+
+To try another  query, scroll down to the  area labeled "getOntologyChildren"
+and type 15357 into the text  field. This returns an XML representation of this
+chemical's  ontology  children.    In  this  case,  the  result   is  a  single
+chemical,    *acetylenedicarboxylate(-1)*,   whose   chebiID    is   30782
+(Figure :ref:`fig-webservices_webform2`).
+
+.. _fig-webservices_webform:
+
+.. _fig-webservices_webform1:
+
+.. figure:: figures/example_webservices/webservices_webform.png
+   :width: 3.2in
+   :align: center
+
+   \(a\) Web browser interface for the ChEBI database 
+
+.. _fig-webservices_webform2:
+
+.. figure:: figures/example_webservices/webservices_webform_result.png
+   :width: 3.2in
+   :align: center
+
+   \(b\) Results from a "getOntologyChildren" query
+
+In  this example,  we will  build a  workflow that  accesses a  web  service to
+perform the second of these two  queries. Because we're using a web service, we
+don't  need  a  browser  ---   we  will  perform  this  query  programmatically
+within |vistrails|.
+
+Enabling the SUDSWebServices Package
+====================================
+
+In  order to  use  web services  in |vistrails|,  you  need to  ensure that  the ``SUDSWebServices`` package  is enabled in the ``Preferences``
+dialog. (Please  refer to  Chapter :ref:`chap-packages` for more  information on enabling packages.)
+
+Adding Web Service Packages
+===========================
+
+Within the  ``Module Packages`` tab  of the ``Preferences``
+dialog,  click the  ``Configure``  button to  open the  configuration
+dialog  for  this package(``SUDSWebServices``).   Select  the  ``wsdlList``  and click  on the ``Value`` field.  This is where you will enter  the URL(s) of the web service(s)  you wish  to access.  If there is  more than  one URL,  place a semicolon (;)  between each URL, but  *not* after the final  URL. In other words, the URLs must be semicolon-delimited, but not semicolon-terminated.
+
+For our example, we need the following URL:
+
+``http://www.ebi.ac.uk/webservices/chebi/2.0/webservice?wsdl``
+
+After   closing   the   dialog,    you   need   to reload the ``SUDSWebServices`` package in order to load  the changes. Then, close the ``Preferences`` dialog.  A new package will be created for each URL provided.
+
+Alternatively, you may add a web service package by clicking the secondary mouse button on the "SUDS Web Services" package in the module palette and entering the corresponding URL.  You may remove a web service by clicking the secondary mouse button on the corresponding package in the module palette and selecting ``Remove this Web Service``.
+
+.. %.. figure::
+.. %   :align: center
+.. %   :height=3in,clip=false]{modules_list.png}
+.. %}
+.. %   The available modules in the ``webServices`` module are shown in the ``Modules`` panel.}
+.. %.. _fig-webservices_preferences}
+.. %  
+
+Creating a new vistrail
+=======================
+
+After  configuring the  ``SUDSWebServices``  package properly,  there
+will  be a  ``SUDSWebServices`` entry  in  your ``Modules``
+panel.
+The  ``SUDSWebServices``  package will  generate  a  module for  each
+published method in a web service.
+
+.. %Figure TODO. 
+
+Start with  a new empty workflow  in the ``Pipeline``  view, and drag
+the following modules to the canvas.
+
+.. index::
+   pair: modules; adding
+
+* ``String`` (under "Basic Modules")
+* ``getOntologyChildren`` (under "Methods" for the current web service)
+* ``getOntologyChildrenResponse`` (under "Types" for the current web service)
+* ``OntologyDataItemList`` (under "Types" for the current web service)
+* ``PythonSource`` (under "Basic Modules")
+* ``RichTextCell`` (under "Spreadsheet")
+
+As discussed in  Chapter :ref:`chap-creating`, ``PythonSource`` has no
+input  and  output  ports  by  default;  we  need  to  create  some.  Open  the
+configuration dialog  for ``PythonSource``  by selecting this  module in
+the  pipeline  canvas   and  typing  'Ctrl-E'.  Add  a   new  input  port
+named  "ontologyDataItemList" of  type ``List``,  and  a new
+output port named "outfile"  of type ``File``. (Please refer
+to Chapter :ref:`chap-creating` for more information about configuring and using
+the ``PythonSource`` module.)
+
+We will now add  some Python code to this module. This  code generates a simple
+HTML table based on the information retrieved from the web service query.  Type
+or  paste  the  following   source  code  into  the  ``PythonSource``
+configuration dialog:
+
+.. code-block:: python
+
+   dataitemlist = self.getInputFromPort("ontologyDataItemList")
+   output1 = self.interpreter.filePool.create_file()
+   f1 = open(str(output1.name), "w")
+   text = "<HTML><TITLE>Chebi WebService</TITLE><BODY BGCOLOR=#FFFFFF>"
+   f1.write(text)
+   text = "<H2>getOntologyChildren Query</H2><BR>"
+   f1.write(text)
+   text = "<CENTER><table border = 1><tr><TH>ChebiId</TH> <TH>ChebiName</TH>"
+   text += "<TH>Comments</TH> <TH>Type</TH> <TH>Status</TH>"
+   text += "<TH>CyclicRelationship</TH></tr>"
+   f1.write(text)
+   for element in dataitemlist:
+       if not hasattr(element,'Comments') or str(element.Comments) == '[]':
+           comment = ""
+       else:
+           comment = str(element.Comments)
+       line = "<tr><td>" + str(element.chebiId) + "</td><td>" + str(element.chebiName)
+       line += "</td><td>" + comment + "</td><td>" + str(element.type) + "</td><td>"
+       line += str(element.status) + "</td><td>" + str(element.cyclicRelationship)
+       line += "</td></tr>"
+       f1.write(line)        
+   text = "</table></CENTER></BODY></HTML>"
+   f1.write(text)
+   self.setResult("outfile",output1)
+   f1.close()
+
+Close the dialog.  One of the ports we need to use is an optional port.  Select the ``OntologyDataItemList`` module and select the ``Outputs`` tab from the ``Module Information`` panel.  Click in the left column next to ``ListElement`` so the eye icon appears.  Now connect the modules together as shown in Figure :ref:`fig-chebi_pipeline_screenshot`.
+
+.. _fig-chebi_pipeline_screenshot:
+
+.. figure:: figures/example_webservices/only_modules.png
+   :align: center
+   :width: 2.5in
+
+   Our example pipeline
+
+Our workflow is now complete except for one crucial element: the starting point.  We need to pass a chebiID string to the workflow in order to look up information about a chemical.  We do this by assigning a chebiID string to the ``String`` module at the top of the pipeline.  Highlight the ``String`` module in the canvas, then in the ``Module Information`` panel on the right, make sure the ``Inputs`` tab is selected and click on ``value`` and type ``CHEBI:15357`` into the ``String`` inpu [...]
+
+Executing the workflow
+======================
+
+.. index::
+   pair: spreadsheet; RichTextCell
+
+The workflow  is now ready  to be visualized.  Click  the ``Execute``
+button  to   send  the  current   pipeline  with  the  current   parameters  to
+a ``RichTextCell`` within the |vistrails|
+Spreadsheet.           Your           result          should           resemble
+Figure :ref:`fig-webservices_spreadsheet`.       As      you       can      see,
+the "ontology children" query  returns the same information as before,
+but without  the use  of a  web browser. In  addition, we  used a  small Python
+program (via the ``PythonSource`` module)  to transform the raw XML into
+a readable HTML table.
+
+.. _fig-webservices_spreadsheet:
+
+.. figure:: figures/example_webservices/ws_spreadsheet.png
+   :align: center
+   :height: 2.5in
+
+   The HTML table generated by our workflow
+
+.. rubric:: Footnotes
+.. [#] ChEBI  is an acronym for Chemical Entities of Biological Interest.
diff --git a/doc/usersguide/figures/CLTools/import.png b/doc/usersguide/figures/CLTools/import.png
new file mode 100644
index 0000000..f95e54a
Binary files /dev/null and b/doc/usersguide/figures/CLTools/import.png differ
diff --git a/doc/usersguide/figures/CLTools/inputoutputfile.png b/doc/usersguide/figures/CLTools/inputoutputfile.png
new file mode 100644
index 0000000..797c5dc
Binary files /dev/null and b/doc/usersguide/figures/CLTools/inputoutputfile.png differ
diff --git a/doc/usersguide/figures/CLTools/inputoutputport.png b/doc/usersguide/figures/CLTools/inputoutputport.png
new file mode 100644
index 0000000..07e0751
Binary files /dev/null and b/doc/usersguide/figures/CLTools/inputoutputport.png differ
diff --git a/doc/usersguide/figures/CLTools/visibility.png b/doc/usersguide/figures/CLTools/visibility.png
new file mode 100644
index 0000000..dcaea52
Binary files /dev/null and b/doc/usersguide/figures/CLTools/visibility.png differ
diff --git a/doc/usersguide/figures/CLTools/wizard.png b/doc/usersguide/figures/CLTools/wizard.png
new file mode 100644
index 0000000..a87963d
Binary files /dev/null and b/doc/usersguide/figures/CLTools/wizard.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_diff.png b/doc/usersguide/figures/analogies/analogy_diff.png
new file mode 100644
index 0000000..6ddbefd
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_diff.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_dnd1.png b/doc/usersguide/figures/analogies/analogy_dnd1.png
new file mode 100644
index 0000000..afc075b
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_dnd1.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_dnd2.png b/doc/usersguide/figures/analogies/analogy_dnd2.png
new file mode 100644
index 0000000..43997f7
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_dnd2.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_menu.png b/doc/usersguide/figures/analogies/analogy_menu.png
new file mode 100644
index 0000000..671f295
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_menu.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_setup.png b/doc/usersguide/figures/analogies/analogy_setup.png
new file mode 100644
index 0000000..2480344
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_setup.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_setup2.png b/doc/usersguide/figures/analogies/analogy_setup2.png
new file mode 100644
index 0000000..11dbf91
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_setup2.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_spreadsheet1.png b/doc/usersguide/figures/analogies/analogy_spreadsheet1.png
new file mode 100644
index 0000000..c6cb078
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_spreadsheet1.png differ
diff --git a/doc/usersguide/figures/analogies/analogy_spreadsheet2.png b/doc/usersguide/figures/analogies/analogy_spreadsheet2.png
new file mode 100644
index 0000000..6e656df
Binary files /dev/null and b/doc/usersguide/figures/analogies/analogy_spreadsheet2.png differ
diff --git a/doc/usersguide/figures/batch/create_alias.png b/doc/usersguide/figures/batch/create_alias.png
new file mode 100644
index 0000000..a2125f2
Binary files /dev/null and b/doc/usersguide/figures/batch/create_alias.png differ
diff --git a/doc/usersguide/figures/batch/offscreen_output.png b/doc/usersguide/figures/batch/offscreen_output.png
new file mode 100644
index 0000000..44ba31e
Binary files /dev/null and b/doc/usersguide/figures/batch/offscreen_output.png differ
diff --git a/doc/usersguide/figures/batch/offscreen_version_tree.png b/doc/usersguide/figures/batch/offscreen_version_tree.png
new file mode 100644
index 0000000..6b7ec37
Binary files /dev/null and b/doc/usersguide/figures/batch/offscreen_version_tree.png differ
diff --git a/doc/usersguide/figures/cfassistant/assistant.png b/doc/usersguide/figures/cfassistant/assistant.png
new file mode 100644
index 0000000..e0ccbbc
Binary files /dev/null and b/doc/usersguide/figures/cfassistant/assistant.png differ
diff --git a/doc/usersguide/figures/cfassistant/enable_port.png b/doc/usersguide/figures/cfassistant/enable_port.png
new file mode 100644
index 0000000..c9985d7
Binary files /dev/null and b/doc/usersguide/figures/cfassistant/enable_port.png differ
diff --git a/doc/usersguide/figures/cfassistant/pipeline.png b/doc/usersguide/figures/cfassistant/pipeline.png
new file mode 100644
index 0000000..e3f7c15
Binary files /dev/null and b/doc/usersguide/figures/cfassistant/pipeline.png differ
diff --git a/doc/usersguide/figures/cfassistant/port_select.png b/doc/usersguide/figures/cfassistant/port_select.png
new file mode 100644
index 0000000..34f9130
Binary files /dev/null and b/doc/usersguide/figures/cfassistant/port_select.png differ
diff --git a/doc/usersguide/figures/cfassistant/port_select2.png b/doc/usersguide/figures/cfassistant/port_select2.png
new file mode 100644
index 0000000..050756f
Binary files /dev/null and b/doc/usersguide/figures/cfassistant/port_select2.png differ
diff --git a/doc/usersguide/figures/cfassistant/results.png b/doc/usersguide/figures/cfassistant/results.png
new file mode 100644
index 0000000..fa05e74
Binary files /dev/null and b/doc/usersguide/figures/cfassistant/results.png differ
diff --git a/doc/usersguide/figures/controlflow/AreaFilter_Workflow.png b/doc/usersguide/figures/controlflow/AreaFilter_Workflow.png
new file mode 100644
index 0000000..f59d75f
Binary files /dev/null and b/doc/usersguide/figures/controlflow/AreaFilter_Workflow.png differ
diff --git a/doc/usersguide/figures/controlflow/CalculateArea.png b/doc/usersguide/figures/controlflow/CalculateArea.png
new file mode 100644
index 0000000..9a42365
Binary files /dev/null and b/doc/usersguide/figures/controlflow/CalculateArea.png differ
diff --git a/doc/usersguide/figures/controlflow/If_Example.png b/doc/usersguide/figures/controlflow/If_Example.png
new file mode 100644
index 0000000..2d8b57b
Binary files /dev/null and b/doc/usersguide/figures/controlflow/If_Example.png differ
diff --git a/doc/usersguide/figures/controlflow/If_Group.png b/doc/usersguide/figures/controlflow/If_Group.png
new file mode 100644
index 0000000..250b865
Binary files /dev/null and b/doc/usersguide/figures/controlflow/If_Group.png differ
diff --git a/doc/usersguide/figures/controlflow/If_Spreadsheet_False.png b/doc/usersguide/figures/controlflow/If_Spreadsheet_False.png
new file mode 100644
index 0000000..26ed6a5
Binary files /dev/null and b/doc/usersguide/figures/controlflow/If_Spreadsheet_False.png differ
diff --git a/doc/usersguide/figures/controlflow/If_Spreadsheet_True.png b/doc/usersguide/figures/controlflow/If_Spreadsheet_True.png
new file mode 100644
index 0000000..f273832
Binary files /dev/null and b/doc/usersguide/figures/controlflow/If_Spreadsheet_True.png differ
diff --git a/doc/usersguide/figures/controlflow/If_Workflow.png b/doc/usersguide/figures/controlflow/If_Workflow.png
new file mode 100644
index 0000000..cf01262
Binary files /dev/null and b/doc/usersguide/figures/controlflow/If_Workflow.png differ
diff --git a/doc/usersguide/figures/controlflow/If_Workflow_Group.png b/doc/usersguide/figures/controlflow/If_Workflow_Group.png
new file mode 100644
index 0000000..69a3b8d
Binary files /dev/null and b/doc/usersguide/figures/controlflow/If_Workflow_Group.png differ
diff --git a/doc/usersguide/figures/controlflow/MapAndFilter_Spreadsheet.png b/doc/usersguide/figures/controlflow/MapAndFilter_Spreadsheet.png
new file mode 100644
index 0000000..0ad0a4f
Binary files /dev/null and b/doc/usersguide/figures/controlflow/MapAndFilter_Spreadsheet.png differ
diff --git a/doc/usersguide/figures/controlflow/MapAndFilter_Workflow.png b/doc/usersguide/figures/controlflow/MapAndFilter_Workflow.png
new file mode 100644
index 0000000..6d7e8f9
Binary files /dev/null and b/doc/usersguide/figures/controlflow/MapAndFilter_Workflow.png differ
diff --git a/doc/usersguide/figures/controlflow/Map_Spreadsheet.png b/doc/usersguide/figures/controlflow/Map_Spreadsheet.png
new file mode 100644
index 0000000..8b67358
Binary files /dev/null and b/doc/usersguide/figures/controlflow/Map_Spreadsheet.png differ
diff --git a/doc/usersguide/figures/controlflow/Map_Workflow.png b/doc/usersguide/figures/controlflow/Map_Workflow.png
new file mode 100644
index 0000000..c0af537
Binary files /dev/null and b/doc/usersguide/figures/controlflow/Map_Workflow.png differ
diff --git a/doc/usersguide/figures/controlflow/Sum_Workflow.png b/doc/usersguide/figures/controlflow/Sum_Workflow.png
new file mode 100644
index 0000000..c8017c6
Binary files /dev/null and b/doc/usersguide/figures/controlflow/Sum_Workflow.png differ
diff --git a/doc/usersguide/figures/controlflow/andor.png b/doc/usersguide/figures/controlflow/andor.png
new file mode 100644
index 0000000..70ff592
Binary files /dev/null and b/doc/usersguide/figures/controlflow/andor.png differ
diff --git a/doc/usersguide/figures/controlflow/gcd-grouped.png b/doc/usersguide/figures/controlflow/gcd-grouped.png
new file mode 100644
index 0000000..7c5ab09
Binary files /dev/null and b/doc/usersguide/figures/controlflow/gcd-grouped.png differ
diff --git a/doc/usersguide/figures/controlflow/gcd.png b/doc/usersguide/figures/controlflow/gcd.png
new file mode 100644
index 0000000..bad58ba
Binary files /dev/null and b/doc/usersguide/figures/controlflow/gcd.png differ
diff --git a/doc/usersguide/figures/creating/add_cylinder.png b/doc/usersguide/figures/creating/add_cylinder.png
new file mode 100644
index 0000000..eba2aac
Binary files /dev/null and b/doc/usersguide/figures/creating/add_cylinder.png differ
diff --git a/doc/usersguide/figures/creating/automatic_conversion.png b/doc/usersguide/figures/creating/automatic_conversion.png
new file mode 100644
index 0000000..e677e82
Binary files /dev/null and b/doc/usersguide/figures/creating/automatic_conversion.png differ
diff --git a/doc/usersguide/figures/creating/change_parameter_interface1.png b/doc/usersguide/figures/creating/change_parameter_interface1.png
new file mode 100644
index 0000000..bd9e8d5
Binary files /dev/null and b/doc/usersguide/figures/creating/change_parameter_interface1.png differ
diff --git a/doc/usersguide/figures/creating/change_parameter_interface2.png b/doc/usersguide/figures/creating/change_parameter_interface2.png
new file mode 100644
index 0000000..1ef9dba
Binary files /dev/null and b/doc/usersguide/figures/creating/change_parameter_interface2.png differ
diff --git a/doc/usersguide/figures/creating/cylinder1.png b/doc/usersguide/figures/creating/cylinder1.png
new file mode 100644
index 0000000..e576881
Binary files /dev/null and b/doc/usersguide/figures/creating/cylinder1.png differ
diff --git a/doc/usersguide/figures/creating/cylinder2.png b/doc/usersguide/figures/creating/cylinder2.png
new file mode 100644
index 0000000..5c798be
Binary files /dev/null and b/doc/usersguide/figures/creating/cylinder2.png differ
diff --git a/doc/usersguide/figures/creating/cylinder_not_connected_but_quadric_deleted.png b/doc/usersguide/figures/creating/cylinder_not_connected_but_quadric_deleted.png
new file mode 100644
index 0000000..b47003e
Binary files /dev/null and b/doc/usersguide/figures/creating/cylinder_not_connected_but_quadric_deleted.png differ
diff --git a/doc/usersguide/figures/creating/delete_quadric.png b/doc/usersguide/figures/creating/delete_quadric.png
new file mode 100644
index 0000000..cf83231
Binary files /dev/null and b/doc/usersguide/figures/creating/delete_quadric.png differ
diff --git a/doc/usersguide/figures/creating/disconnect.png b/doc/usersguide/figures/creating/disconnect.png
new file mode 100644
index 0000000..4ed3816
Binary files /dev/null and b/doc/usersguide/figures/creating/disconnect.png differ
diff --git a/doc/usersguide/figures/creating/enabling_ports.png b/doc/usersguide/figures/creating/enabling_ports.png
new file mode 100644
index 0000000..6251918
Binary files /dev/null and b/doc/usersguide/figures/creating/enabling_ports.png differ
diff --git a/doc/usersguide/figures/creating/globalassign.png b/doc/usersguide/figures/creating/globalassign.png
new file mode 100644
index 0000000..5a3153c
Binary files /dev/null and b/doc/usersguide/figures/creating/globalassign.png differ
diff --git a/doc/usersguide/figures/creating/globalcreate.png b/doc/usersguide/figures/creating/globalcreate.png
new file mode 100644
index 0000000..f4abc70
Binary files /dev/null and b/doc/usersguide/figures/creating/globalcreate.png differ
diff --git a/doc/usersguide/figures/creating/module_configuration.png b/doc/usersguide/figures/creating/module_configuration.png
new file mode 100644
index 0000000..66a7eff
Binary files /dev/null and b/doc/usersguide/figures/creating/module_configuration.png differ
diff --git a/doc/usersguide/figures/creating/pipeline_screenshot_labeled.png b/doc/usersguide/figures/creating/pipeline_screenshot_labeled.png
new file mode 100644
index 0000000..f17f7df
Binary files /dev/null and b/doc/usersguide/figures/creating/pipeline_screenshot_labeled.png differ
diff --git a/doc/usersguide/figures/creating/python_source_configuration.png b/doc/usersguide/figures/creating/python_source_configuration.png
new file mode 100644
index 0000000..182da4d
Binary files /dev/null and b/doc/usersguide/figures/creating/python_source_configuration.png differ
diff --git a/doc/usersguide/figures/creating/python_source_instance.png b/doc/usersguide/figures/creating/python_source_instance.png
new file mode 100644
index 0000000..1fcdf30
Binary files /dev/null and b/doc/usersguide/figures/creating/python_source_instance.png differ
diff --git a/doc/usersguide/figures/creating/python_source_module.png b/doc/usersguide/figures/creating/python_source_module.png
new file mode 100644
index 0000000..8ce8965
Binary files /dev/null and b/doc/usersguide/figures/creating/python_source_module.png differ
diff --git a/doc/usersguide/figures/creating/standard_output_module.png b/doc/usersguide/figures/creating/standard_output_module.png
new file mode 100644
index 0000000..9477688
Binary files /dev/null and b/doc/usersguide/figures/creating/standard_output_module.png differ
diff --git a/doc/usersguide/figures/database/create_dialog.png b/doc/usersguide/figures/database/create_dialog.png
new file mode 100644
index 0000000..2325a84
Binary files /dev/null and b/doc/usersguide/figures/database/create_dialog.png differ
diff --git a/doc/usersguide/figures/database/open_dialog.png b/doc/usersguide/figures/database/open_dialog.png
new file mode 100644
index 0000000..9badbf2
Binary files /dev/null and b/doc/usersguide/figures/database/open_dialog.png differ
diff --git a/doc/usersguide/figures/database/save_dialog.png b/doc/usersguide/figures/database/save_dialog.png
new file mode 100644
index 0000000..8dafd08
Binary files /dev/null and b/doc/usersguide/figures/database/save_dialog.png differ
diff --git a/doc/usersguide/figures/example_itk/filtertypes.png b/doc/usersguide/figures/example_itk/filtertypes.png
new file mode 100644
index 0000000..ce5c07a
Binary files /dev/null and b/doc/usersguide/figures/example_itk/filtertypes.png differ
diff --git a/doc/usersguide/figures/example_itk/itk_slicingpipe.png b/doc/usersguide/figures/example_itk/itk_slicingpipe.png
new file mode 100644
index 0000000..72eb87c
Binary files /dev/null and b/doc/usersguide/figures/example_itk/itk_slicingpipe.png differ
diff --git a/doc/usersguide/figures/example_itk/package_structure.png b/doc/usersguide/figures/example_itk/package_structure.png
new file mode 100644
index 0000000..d7f42a4
Binary files /dev/null and b/doc/usersguide/figures/example_itk/package_structure.png differ
diff --git a/doc/usersguide/figures/example_itk/pixeltypes.png b/doc/usersguide/figures/example_itk/pixeltypes.png
new file mode 100644
index 0000000..be9d41f
Binary files /dev/null and b/doc/usersguide/figures/example_itk/pixeltypes.png differ
diff --git a/doc/usersguide/figures/example_webservices/modules_list.png b/doc/usersguide/figures/example_webservices/modules_list.png
new file mode 100644
index 0000000..09e83aa
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/modules_list.png differ
diff --git a/doc/usersguide/figures/example_webservices/only_modules.png b/doc/usersguide/figures/example_webservices/only_modules.png
new file mode 100644
index 0000000..06be011
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/only_modules.png differ
diff --git a/doc/usersguide/figures/example_webservices/pythonsource.png b/doc/usersguide/figures/example_webservices/pythonsource.png
new file mode 100644
index 0000000..577227c
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/pythonsource.png differ
diff --git a/doc/usersguide/figures/example_webservices/version_tree_modules.png b/doc/usersguide/figures/example_webservices/version_tree_modules.png
new file mode 100644
index 0000000..d437db2
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/version_tree_modules.png differ
diff --git a/doc/usersguide/figures/example_webservices/webservices_webform.png b/doc/usersguide/figures/example_webservices/webservices_webform.png
new file mode 100644
index 0000000..8d6b83a
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/webservices_webform.png differ
diff --git a/doc/usersguide/figures/example_webservices/webservices_webform_result.png b/doc/usersguide/figures/example_webservices/webservices_webform_result.png
new file mode 100644
index 0000000..441f2e7
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/webservices_webform_result.png differ
diff --git a/doc/usersguide/figures/example_webservices/ws_preferences.png b/doc/usersguide/figures/example_webservices/ws_preferences.png
new file mode 100644
index 0000000..201ce1e
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/ws_preferences.png differ
diff --git a/doc/usersguide/figures/example_webservices/ws_spreadsheet.png b/doc/usersguide/figures/example_webservices/ws_spreadsheet.png
new file mode 100644
index 0000000..12bcb41
Binary files /dev/null and b/doc/usersguide/figures/example_webservices/ws_spreadsheet.png differ
diff --git a/doc/usersguide/figures/getting_started/builder.png b/doc/usersguide/figures/getting_started/builder.png
new file mode 100644
index 0000000..a411cca
Binary files /dev/null and b/doc/usersguide/figures/getting_started/builder.png differ
diff --git a/doc/usersguide/figures/getting_started/mac_post_uncompress_window.png b/doc/usersguide/figures/getting_started/mac_post_uncompress_window.png
new file mode 100644
index 0000000..737dc44
Binary files /dev/null and b/doc/usersguide/figures/getting_started/mac_post_uncompress_window.png differ
diff --git a/doc/usersguide/figures/getting_started/panel_buttons.png b/doc/usersguide/figures/getting_started/panel_buttons.png
new file mode 100644
index 0000000..c62eb9d
Binary files /dev/null and b/doc/usersguide/figures/getting_started/panel_buttons.png differ
diff --git a/doc/usersguide/figures/getting_started/spreadsheet.png b/doc/usersguide/figures/getting_started/spreadsheet.png
new file mode 100644
index 0000000..03d4780
Binary files /dev/null and b/doc/usersguide/figures/getting_started/spreadsheet.png differ
diff --git a/doc/usersguide/figures/getting_started/toolbar.png b/doc/usersguide/figures/getting_started/toolbar.png
new file mode 100644
index 0000000..1ef8518
Binary files /dev/null and b/doc/usersguide/figures/getting_started/toolbar.png differ
diff --git a/doc/usersguide/figures/getting_started/windows_installation_wizard.png b/doc/usersguide/figures/getting_started/windows_installation_wizard.png
new file mode 100644
index 0000000..4bc6f22
Binary files /dev/null and b/doc/usersguide/figures/getting_started/windows_installation_wizard.png differ
diff --git a/doc/usersguide/figures/grouping/grouping1.png b/doc/usersguide/figures/grouping/grouping1.png
new file mode 100644
index 0000000..9701896
Binary files /dev/null and b/doc/usersguide/figures/grouping/grouping1.png differ
diff --git a/doc/usersguide/figures/grouping/grouping2.png b/doc/usersguide/figures/grouping/grouping2.png
new file mode 100644
index 0000000..9c3735f
Binary files /dev/null and b/doc/usersguide/figures/grouping/grouping2.png differ
diff --git a/doc/usersguide/figures/grouping/grouping4.png b/doc/usersguide/figures/grouping/grouping4.png
new file mode 100644
index 0000000..05555f5
Binary files /dev/null and b/doc/usersguide/figures/grouping/grouping4.png differ
diff --git a/doc/usersguide/figures/grouping/subworkflow.png b/doc/usersguide/figures/grouping/subworkflow.png
new file mode 100644
index 0000000..f41a57c
Binary files /dev/null and b/doc/usersguide/figures/grouping/subworkflow.png differ
diff --git a/doc/usersguide/figures/grouping/subworkflow_upgrade.png b/doc/usersguide/figures/grouping/subworkflow_upgrade.png
new file mode 100644
index 0000000..025636f
Binary files /dev/null and b/doc/usersguide/figures/grouping/subworkflow_upgrade.png differ
diff --git a/doc/usersguide/figures/latex/embedding.png b/doc/usersguide/figures/latex/embedding.png
new file mode 100644
index 0000000..e01ae84
Binary files /dev/null and b/doc/usersguide/figures/latex/embedding.png differ
diff --git a/doc/usersguide/figures/mashups/aliasconfig.png b/doc/usersguide/figures/mashups/aliasconfig.png
new file mode 100644
index 0000000..104a6fd
Binary files /dev/null and b/doc/usersguide/figures/mashups/aliasconfig.png differ
diff --git a/doc/usersguide/figures/mashups/background.png b/doc/usersguide/figures/mashups/background.png
new file mode 100644
index 0000000..1e6106e
Binary files /dev/null and b/doc/usersguide/figures/mashups/background.png differ
diff --git a/doc/usersguide/figures/mashups/mashupcomp.png b/doc/usersguide/figures/mashups/mashupcomp.png
new file mode 100644
index 0000000..3ea2a74
Binary files /dev/null and b/doc/usersguide/figures/mashups/mashupcomp.png differ
diff --git a/doc/usersguide/figures/mashups/opacityalias.png b/doc/usersguide/figures/mashups/opacityalias.png
new file mode 100644
index 0000000..0205a5c
Binary files /dev/null and b/doc/usersguide/figures/mashups/opacityalias.png differ
diff --git a/doc/usersguide/figures/mashups/righttab.png b/doc/usersguide/figures/mashups/righttab.png
new file mode 100644
index 0000000..059d004
Binary files /dev/null and b/doc/usersguide/figures/mashups/righttab.png differ
diff --git a/doc/usersguide/figures/merging/postmerge.png b/doc/usersguide/figures/merging/postmerge.png
new file mode 100644
index 0000000..1007cb3
Binary files /dev/null and b/doc/usersguide/figures/merging/postmerge.png differ
diff --git a/doc/usersguide/figures/merging/premerge.png b/doc/usersguide/figures/merging/premerge.png
new file mode 100644
index 0000000..b72e4c1
Binary files /dev/null and b/doc/usersguide/figures/merging/premerge.png differ
diff --git a/doc/usersguide/figures/packages/CustomColorShape1.png b/doc/usersguide/figures/packages/CustomColorShape1.png
new file mode 100644
index 0000000..eacfa00
Binary files /dev/null and b/doc/usersguide/figures/packages/CustomColorShape1.png differ
diff --git a/doc/usersguide/figures/packages/CustomColorShape2.png b/doc/usersguide/figures/packages/CustomColorShape2.png
new file mode 100644
index 0000000..2cee93c
Binary files /dev/null and b/doc/usersguide/figures/packages/CustomColorShape2.png differ
diff --git a/doc/usersguide/figures/packages/CustomColorShape3.png b/doc/usersguide/figures/packages/CustomColorShape3.png
new file mode 100644
index 0000000..c30a590
Binary files /dev/null and b/doc/usersguide/figures/packages/CustomColorShape3.png differ
diff --git a/doc/usersguide/figures/packages/afront_configuration_window.png b/doc/usersguide/figures/packages/afront_configuration_window.png
new file mode 100644
index 0000000..c1c8dae
Binary files /dev/null and b/doc/usersguide/figures/packages/afront_configuration_window.png differ
diff --git a/doc/usersguide/figures/packages/after_enabled_package.png b/doc/usersguide/figures/packages/after_enabled_package.png
new file mode 100644
index 0000000..7ac6518
Binary files /dev/null and b/doc/usersguide/figures/packages/after_enabled_package.png differ
diff --git a/doc/usersguide/figures/packages/custom_documentation.png b/doc/usersguide/figures/packages/custom_documentation.png
new file mode 100644
index 0000000..f4e97f9
Binary files /dev/null and b/doc/usersguide/figures/packages/custom_documentation.png differ
diff --git a/doc/usersguide/figures/packages/enable_package.png b/doc/usersguide/figures/packages/enable_package.png
new file mode 100644
index 0000000..147a873
Binary files /dev/null and b/doc/usersguide/figures/packages/enable_package.png differ
diff --git a/doc/usersguide/figures/packages/package_menu.png b/doc/usersguide/figures/packages/package_menu.png
new file mode 100644
index 0000000..dc91fea
Binary files /dev/null and b/doc/usersguide/figures/packages/package_menu.png differ
diff --git a/doc/usersguide/figures/packages/pythoncalc_workflow.png b/doc/usersguide/figures/packages/pythoncalc_workflow.png
new file mode 100644
index 0000000..584389a
Binary files /dev/null and b/doc/usersguide/figures/packages/pythoncalc_workflow.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/annotated_pipeline.png b/doc/usersguide/figures/parameter_exploration/annotated_pipeline.png
new file mode 100644
index 0000000..fb49657
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/annotated_pipeline.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/direction_button_no.png b/doc/usersguide/figures/parameter_exploration/direction_button_no.png
new file mode 100644
index 0000000..f0da3be
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/direction_button_no.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/direction_button_time.png b/doc/usersguide/figures/parameter_exploration/direction_button_time.png
new file mode 100644
index 0000000..04ef3a3
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/direction_button_time.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/direction_button_x.png b/doc/usersguide/figures/parameter_exploration/direction_button_x.png
new file mode 100644
index 0000000..f351630
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/direction_button_x.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/direction_button_y.png b/doc/usersguide/figures/parameter_exploration/direction_button_y.png
new file mode 100644
index 0000000..ba9b630
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/direction_button_y.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/direction_button_z.png b/doc/usersguide/figures/parameter_exploration/direction_button_z.png
new file mode 100644
index 0000000..ab6d799
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/direction_button_z.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_1.png b/doc/usersguide/figures/parameter_exploration/fig6_1.png
new file mode 100644
index 0000000..0ac90ea
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_1.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_10.png b/doc/usersguide/figures/parameter_exploration/fig6_10.png
new file mode 100644
index 0000000..beb9760
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_10.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_11.png b/doc/usersguide/figures/parameter_exploration/fig6_11.png
new file mode 100644
index 0000000..292ed7c
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_11.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_12.png b/doc/usersguide/figures/parameter_exploration/fig6_12.png
new file mode 100644
index 0000000..cabfaca
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_12.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_2.png b/doc/usersguide/figures/parameter_exploration/fig6_2.png
new file mode 100644
index 0000000..c5eafaf
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_2.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_3.png b/doc/usersguide/figures/parameter_exploration/fig6_3.png
new file mode 100644
index 0000000..a445123
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_3.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_4.png b/doc/usersguide/figures/parameter_exploration/fig6_4.png
new file mode 100644
index 0000000..cff6d96
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_4.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_5.png b/doc/usersguide/figures/parameter_exploration/fig6_5.png
new file mode 100644
index 0000000..a2f24fb
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_5.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_6.png b/doc/usersguide/figures/parameter_exploration/fig6_6.png
new file mode 100644
index 0000000..508b1e5
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_6.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_7.png b/doc/usersguide/figures/parameter_exploration/fig6_7.png
new file mode 100644
index 0000000..704db26
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_7.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_8.png b/doc/usersguide/figures/parameter_exploration/fig6_8.png
new file mode 100644
index 0000000..c99b4fd
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_8.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/fig6_9.png b/doc/usersguide/figures/parameter_exploration/fig6_9.png
new file mode 100644
index 0000000..f2bd3dd
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/fig6_9.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/list_edit.png b/doc/usersguide/figures/parameter_exploration/list_edit.png
new file mode 100644
index 0000000..cd200fc
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/list_edit.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/popup_menu.png b/doc/usersguide/figures/parameter_exploration/popup_menu.png
new file mode 100644
index 0000000..6c17cf2
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/popup_menu.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/set_methods.png b/doc/usersguide/figures/parameter_exploration/set_methods.png
new file mode 100644
index 0000000..3e50250
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/set_methods.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/user_func_edit.png b/doc/usersguide/figures/parameter_exploration/user_func_edit.png
new file mode 100644
index 0000000..1a013f4
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/user_func_edit.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/virtual_cell.png b/doc/usersguide/figures/parameter_exploration/virtual_cell.png
new file mode 100644
index 0000000..c2576fb
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/virtual_cell.png differ
diff --git a/doc/usersguide/figures/parameter_exploration/vtkImageResample.png b/doc/usersguide/figures/parameter_exploration/vtkImageResample.png
new file mode 100644
index 0000000..8a5c1cb
Binary files /dev/null and b/doc/usersguide/figures/parameter_exploration/vtkImageResample.png differ
diff --git a/doc/usersguide/figures/persistence/base.png b/doc/usersguide/figures/persistence/base.png
new file mode 100644
index 0000000..3663fb8
Binary files /dev/null and b/doc/usersguide/figures/persistence/base.png differ
diff --git a/doc/usersguide/figures/persistence/input.png b/doc/usersguide/figures/persistence/input.png
new file mode 100644
index 0000000..a43116b
Binary files /dev/null and b/doc/usersguide/figures/persistence/input.png differ
diff --git a/doc/usersguide/figures/persistence/intermediate.png b/doc/usersguide/figures/persistence/intermediate.png
new file mode 100644
index 0000000..ca49fd8
Binary files /dev/null and b/doc/usersguide/figures/persistence/intermediate.png differ
diff --git a/doc/usersguide/figures/persistence/output.png b/doc/usersguide/figures/persistence/output.png
new file mode 100644
index 0000000..1dbf5b3
Binary files /dev/null and b/doc/usersguide/figures/persistence/output.png differ
diff --git a/doc/usersguide/figures/persistence/reference.png b/doc/usersguide/figures/persistence/reference.png
new file mode 100644
index 0000000..25cabcf
Binary files /dev/null and b/doc/usersguide/figures/persistence/reference.png differ
diff --git a/doc/usersguide/figures/persistence/versions.png b/doc/usersguide/figures/persistence/versions.png
new file mode 100644
index 0000000..6169beb
Binary files /dev/null and b/doc/usersguide/figures/persistence/versions.png differ
diff --git a/doc/usersguide/figures/provenance/browser.png b/doc/usersguide/figures/provenance/browser.png
new file mode 100644
index 0000000..e53e9da
Binary files /dev/null and b/doc/usersguide/figures/provenance/browser.png differ
diff --git a/doc/usersguide/figures/querying/query.png b/doc/usersguide/figures/querying/query.png
new file mode 100644
index 0000000..bd82f4d
Binary files /dev/null and b/doc/usersguide/figures/querying/query.png differ
diff --git a/doc/usersguide/figures/querying/query2.png b/doc/usersguide/figures/querying/query2.png
new file mode 100644
index 0000000..24b626f
Binary files /dev/null and b/doc/usersguide/figures/querying/query2.png differ
diff --git a/doc/usersguide/figures/querying/query3.png b/doc/usersguide/figures/querying/query3.png
new file mode 100644
index 0000000..666a73b
Binary files /dev/null and b/doc/usersguide/figures/querying/query3.png differ
diff --git a/doc/usersguide/figures/querying/query4.png b/doc/usersguide/figures/querying/query4.png
new file mode 100644
index 0000000..5de29ac
Binary files /dev/null and b/doc/usersguide/figures/querying/query4.png differ
diff --git a/doc/usersguide/figures/querying/query_vtkActor.png b/doc/usersguide/figures/querying/query_vtkActor.png
new file mode 100644
index 0000000..57da348
Binary files /dev/null and b/doc/usersguide/figures/querying/query_vtkActor.png differ
diff --git a/doc/usersguide/figures/querying/query_vtkActor90.png b/doc/usersguide/figures/querying/query_vtkActor90.png
new file mode 100644
index 0000000..12595e4
Binary files /dev/null and b/doc/usersguide/figures/querying/query_vtkActor90.png differ
diff --git a/doc/usersguide/figures/querying/search_or_refine.png b/doc/usersguide/figures/querying/search_or_refine.png
new file mode 100644
index 0000000..c568915
Binary files /dev/null and b/doc/usersguide/figures/querying/search_or_refine.png differ
diff --git a/doc/usersguide/figures/querying/textquery.png b/doc/usersguide/figures/querying/textquery.png
new file mode 100644
index 0000000..bb27038
Binary files /dev/null and b/doc/usersguide/figures/querying/textquery.png differ
diff --git a/doc/usersguide/figures/querying/workspace_results.png b/doc/usersguide/figures/querying/workspace_results.png
new file mode 100644
index 0000000..705dce8
Binary files /dev/null and b/doc/usersguide/figures/querying/workspace_results.png differ
diff --git a/doc/usersguide/figures/spreadsheet/cell_states.png b/doc/usersguide/figures/spreadsheet/cell_states.png
new file mode 100644
index 0000000..ece1cb5
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/cell_states.png differ
diff --git a/doc/usersguide/figures/spreadsheet/editing_mode.png b/doc/usersguide/figures/spreadsheet/editing_mode.png
new file mode 100644
index 0000000..9939cbb
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/editing_mode.png differ
diff --git a/doc/usersguide/figures/spreadsheet/spreadsheet.png b/doc/usersguide/figures/spreadsheet/spreadsheet.png
new file mode 100644
index 0000000..8b8c336
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/spreadsheet.png differ
diff --git a/doc/usersguide/figures/spreadsheet/spreadsheet_cell_control.png b/doc/usersguide/figures/spreadsheet/spreadsheet_cell_control.png
new file mode 100644
index 0000000..0f7cb36
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/spreadsheet_cell_control.png differ
diff --git a/doc/usersguide/figures/spreadsheet/spreadsheet_editing_mode.png b/doc/usersguide/figures/spreadsheet/spreadsheet_editing_mode.png
new file mode 100644
index 0000000..269cb91
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/spreadsheet_editing_mode.png differ
diff --git a/doc/usersguide/figures/spreadsheet/spreadsheet_editing_mode_move.png b/doc/usersguide/figures/spreadsheet/spreadsheet_editing_mode_move.png
new file mode 100644
index 0000000..1f7bcc8
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/spreadsheet_editing_mode_move.png differ
diff --git a/doc/usersguide/figures/spreadsheet/spreadsheet_sync.png b/doc/usersguide/figures/spreadsheet/spreadsheet_sync.png
new file mode 100644
index 0000000..8454d3f
Binary files /dev/null and b/doc/usersguide/figures/spreadsheet/spreadsheet_sync.png differ
diff --git a/doc/usersguide/figures/tabledata/pipeline.png b/doc/usersguide/figures/tabledata/pipeline.png
new file mode 100644
index 0000000..addc590
Binary files /dev/null and b/doc/usersguide/figures/tabledata/pipeline.png differ
diff --git a/doc/usersguide/figures/tabledata/results.png b/doc/usersguide/figures/tabledata/results.png
new file mode 100644
index 0000000..8829310
Binary files /dev/null and b/doc/usersguide/figures/tabledata/results.png differ
diff --git a/doc/usersguide/figures/version_tree/collapsed.png b/doc/usersguide/figures/version_tree/collapsed.png
new file mode 100644
index 0000000..8ddf73e
Binary files /dev/null and b/doc/usersguide/figures/version_tree/collapsed.png differ
diff --git a/doc/usersguide/figures/version_tree/collapsed_expanded.png b/doc/usersguide/figures/version_tree/collapsed_expanded.png
new file mode 100644
index 0000000..ea6c993
Binary files /dev/null and b/doc/usersguide/figures/version_tree/collapsed_expanded.png differ
diff --git a/doc/usersguide/figures/version_tree/creating_versions.png b/doc/usersguide/figures/version_tree/creating_versions.png
new file mode 100644
index 0000000..a3de7d8
Binary files /dev/null and b/doc/usersguide/figures/version_tree/creating_versions.png differ
diff --git a/doc/usersguide/figures/version_tree/creating_versions_A.png b/doc/usersguide/figures/version_tree/creating_versions_A.png
new file mode 100644
index 0000000..95fe199
Binary files /dev/null and b/doc/usersguide/figures/version_tree/creating_versions_A.png differ
diff --git a/doc/usersguide/figures/version_tree/creating_versions_B.png b/doc/usersguide/figures/version_tree/creating_versions_B.png
new file mode 100644
index 0000000..a869006
Binary files /dev/null and b/doc/usersguide/figures/version_tree/creating_versions_B.png differ
diff --git a/doc/usersguide/figures/version_tree/creating_versions_C.png b/doc/usersguide/figures/version_tree/creating_versions_C.png
new file mode 100644
index 0000000..fbe6d26
Binary files /dev/null and b/doc/usersguide/figures/version_tree/creating_versions_C.png differ
diff --git a/doc/usersguide/figures/version_tree/expanded.png b/doc/usersguide/figures/version_tree/expanded.png
new file mode 100644
index 0000000..f6c3cc6
Binary files /dev/null and b/doc/usersguide/figures/version_tree/expanded.png differ
diff --git a/doc/usersguide/figures/version_tree/history_view_screenshot_labeled.png b/doc/usersguide/figures/version_tree/history_view_screenshot_labeled.png
new file mode 100644
index 0000000..4b4c218
Binary files /dev/null and b/doc/usersguide/figures/version_tree/history_view_screenshot_labeled.png differ
diff --git a/doc/usersguide/figures/version_tree/raw_pipeline.png b/doc/usersguide/figures/version_tree/raw_pipeline.png
new file mode 100644
index 0000000..4bb351c
Binary files /dev/null and b/doc/usersguide/figures/version_tree/raw_pipeline.png differ
diff --git a/doc/usersguide/figures/version_tree/visual_diff.png b/doc/usersguide/figures/version_tree/visual_diff.png
new file mode 100644
index 0000000..47d427e
Binary files /dev/null and b/doc/usersguide/figures/version_tree/visual_diff.png differ
diff --git a/doc/usersguide/getting_started.rst b/doc/usersguide/getting_started.rst
new file mode 100644
index 0000000..35df38e
--- /dev/null
+++ b/doc/usersguide/getting_started.rst
@@ -0,0 +1,412 @@
+***************
+Getting Started
+***************
+
+The |vistrails| system is distributed both as source code and pre-built
+binaries, and instructions for obtaining either can be found at our
+website: http://www.vistrails.org.  Because the system is
+written in Python using a Qt interface, it can be run on most
+architectures that support these two components, even if a pre-built
+binary is not available for your system.
+Section :ref:`sec-start-installing` provides instructions to guide you
+through installation procedures, and Section :ref:`sec-start-quick`
+gives a quick orientation and serves as a springboard for
+exploring the different features of |vistrails|.
+
+.. _sec-start-installing:
+
+Installation 
+============ 
+
+There are two types of |vistrails| installations. The first is a
+binary installation that lets you use |vistrails| by running the
+precompiled executable. The second is a full source code installation
+that requires you to install and compile |vistrails| and all of its
+dependencies. Of the two types of installations, the binary version is
+much easier, and we encourage first-time users to use this option
+whenever possible.  Precompiled binaries are currently available for
+Microsoft Windows (XP and Vista) and Mac OS X (10.5.x or higher).  To
+obtain either a binary or source copy of |vistrails|, please see our
+website: http://www.vistrails.org.
+
+.. _sec-binary_installation_windows:
+
+Installing |vistrails| on Windows XP/Vista
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To install |vistrails| on Windows, download the installation bundle for
+Windows from the |vistrails| website: http://www.vistrails.org.
+Unzip the file using the decompression program of your choice, then
+double-click the executable to begin installation
+(Figure :ref:`Installation wizard for Microsoft Windows XP/Vista<fig-start-windows_installation>`). Follow the prompts in
+the installation wizard to complete the installation process.
+
+.. _fig-start-windows_installation:
+
+.. figure:: /figures/getting_started/windows_installation_wizard.png
+   :width: 4in
+   :align: center
+   
+   Installation wizard for Microsoft Windows XP/Vista.
+
+.. _sec-binary_installation_macosx:
+
+Installing |vistrails| on Mac OS X
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To install |vistrails| on Mac OS X, download the installation bundle
+for Mac from the |vistrails| website:
+http://www.vistrails.org. The precompiled binary currently only
+supports Mac OS X 10.5.x or higher. The disk image should be mounted automatically
+(Figure :ref:`Installing VisTrails on Mac OS X <fig-start-mac_installation>`). Once the disk image is mounted, drag the |vistrails| folder to the Applications
+folder to install the software.
+
+.. _fig-start-mac_installation:
+
+.. figure:: /figures/getting_started/mac_post_uncompress_window.png
+   :width: 5in
+   :align: center
+
+   Installing |vistrails| on Mac OS X.
+   
+.. _sec-binary_installation_ubuntu:
+
+Installing |vistrails| on Ubuntu Linux
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Although not a binary installation *per se*, installing
+|vistrails| on Ubuntu Linux is nonetheless quite straightforward.
+|vistrails| now interfaces with "apt" directly via a Python API. This
+allows dynamic installation of necessary packages. As a result, you do
+not need to manually install any of the dependent packages. Just
+download the |vistrails| source code and execute it with::
+
+   python vistrails/run.py
+
+and |vistrails| should detect all necessary software and, if necessary,
+ask for your permission to install it.
+
+.. _sec-src_installation:
+
+Installing |vistrails| from source
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Installing |vistrails| from source code is a non-trivial task.  Rather
+than listing full compilation instructions in this manual, we instead
+provide a list of software packages upon which |vistrails| is
+dependent, and refer you to the |vistrails| website for additional
+details.
+
+* Python 2.6 or higher
+* Qt 4.4 or higher
+* PyQt4
+* SciPy
+* VTK (needed to run the examples in this book)
+
+There may also be additional dependencies, depending on which optional
+features of |vistrails| you plan to use.
+
+Please refer to http://www.vistrails.org/index.php/Mac_Intel_Instructions for more details.
+
+.. _sec-start-quick:
+
+Quick Start
+===========
+
+On Windows and Mac OS X, you can launch |vistrails| by double-clicking
+on the |vistrails| application icon. In general, however, it is
+possible to start |vistrails| on any system by navigating to the
+directory where the file ``run.py`` is located (usually
+the root directory of your installation) and executing the command::
+
+   python run.py
+
+Depending on a number of factors, it can take a few seconds for the
+system to start up. As |vistrails| loads, you may see some messages
+that detail the packages being loaded and initialized. This is normal
+operation, but if the system fails to load, these messages will
+provide information that may help you understand why.
+
+Installing additional packages
+==============================
+
+|vistrails| releases come with a number of packages already installed. In
+addition to these, you can write your own packages or install packages from
+third-party developers. To do that, just drop the Python module (single file)
+or package (i.e. directory) in ``$HOME/.vistrails/userpackages/`` (|vistrails|
+should automatically create this folder on the first run).
+
+You can then enable and disable standard or user packages from the preferences
+dialog, under the module packages tab.
+
+The Vistrails Builder Window
+============================
+
+After everything has loaded, you will see the |vistrails| Builder window as
+shown in Figure :ref:`fig-start-builder`. If you have enabled the
+|vistrails| Spreadsheet (Packages :math:`\rightarrow` VisTrails Spreadsheet :math:`\rightarrow` Show Spreadsheet), you will also see a second window like that in
+Figure :ref:`fig-start-spreadsheet`.  Note that if the spreadsheet window is not visible, it will open upon execution of a workflow that uses it.
+
+.. _fig-start-builder:
+
+.. figure:: /figures/getting_started/builder.png
+   :width: 5in
+
+   |vistrails| Builder Window
+
+.. _fig-start-spreadsheet:
+
+.. figure:: /figures/getting_started/spreadsheet.png
+   :width: 5in
+
+   |vistrails| Spreadsheet Window
+
+The VisTrails Toolbar
+^^^^^^^^^^^^^^^^^^^^^
+
+.. _fig-start-toolbar:
+
+.. figure:: /figures/getting_started/toolbar.png  
+   :width: 100%
+   
+   |vistrails| Toolbar
+
+.. index:: toolbar
+
+The |vistrails| toolbar both allows you to execute the current workflow or function, and switch between various modes.  A brief description of each member of the toolbar follows:
+
+**Pipeline** This view shows the current workflow.  See Chapter :ref:`chap-creating` for information about creating a workflow.
+
+**History** This view shows different versions of the workflow(s) as it has  progressed over time.  See Chapter :ref:`chap-version_tree`.
+
+**Search** Use this mode to search for modules or subpipeline within the current version, the current vistrail, or all vistrails.  See Chapter :ref:`chap-querying`.
+
+**Explore** This option allows you to select one or more parameter(s) for which a set of values is created.  The workflow is then executed once for each value in the set and displayed in the spreadsheet for comparison purposes.  See Chapter :ref:`chap-paramexploration`.
+
+**Provenance** The ``Provenance`` mode shows the user a given vistrail's execution history.  When a particular execution is selected, its pipeline view with modules colored according to its associated execution result is shown.  See Chapter :ref:`chap-provenance_browser`.
+
+**Mashup** The ``Mashup`` mode allows you to create a small application that allows you to explore different values for a selected set of parameters.  See Chapter :ref:`chap-mashups`
+for more information.
+
+**Execute** ``Execute`` will either execute the current pipeline when the ``Pipeline``, ``History``, or ``Provenance`` views are selected, or perform the search or exploration when in ``Search`` or ``Exploration`` mode.  This button is disabled for ``Mashup`` mode, or when there is not a current workflow to execute.
+
+The ``New``, ``Open``, and ``Save`` buttons will create, open, and save a vistrail, as expected.
+
+Palettes and Associated Views
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index:: 
+   pair: palette; views
+
+**Palettes**
+
+As you can see, the builder window has a center widget with a palette on each side.  There are a number of views (listed in the 4th group of the views menu) that when made visible, will be opened in these palettes.  In this section, we will discuss how the views are arranged. 
+
+Notice that when VisTrails first launches the builder window, both palettes contain two views.  The left palette is split so both views are visible, whereas the right palette uses tabs to display one view at a time.        By default, additional views will be shown in the right, and lower left panels when they are made visible.  To make a view visible, either switch to a mode that requires it, or select it from the views menu.  For example, the ``Mashup`` mode will add the ``Mashup Pipel [...]
+
+**Buttons**
+
+Notice that there is a button with a pin icon in the upper right corner of each view (see Figure :ref:`fig-panel-buttons`).  If you don't want a view to disappear when you change modes, make sure it is pinned.  When the pin points up, it is unpinned and the view is likely to disappear when you change modes.
+
+The other two buttons, the one with the 'X' and the one with the rectangular outlines (see Figure :ref:`fig-panel-buttons`), will either close the view, or undock the view, depending on which one you push.  Alternatively, you may undock a view by clicking on the view's title bar and pulling it out of the palette.  The view can then either remain in its own window, or can be docked by placing it in either palette.
+
+.. _fig-panel-buttons:
+
+.. figure:: /figures/getting_started/panel_buttons.png
+   
+   Buttons - Close, Detach, and Pin
+
+**View Locations**
+
+.. index::
+   pair: view;location
+
+The following table gives the view that is visible in each palette for each of the main views/modes:
+
++-------------++---------------------+--------------------+
+|             || Lower Left Palette  | Right Palette      |
++=============++=====================+====================+
+| Pipeline    || Modules             | Module Information |
++-------------++---------------------+--------------------+
+| History     || Modules             | Properties         |
++-------------++---------------------+--------------------+
+| Explore     || Explore Properties  | Set Methods        |
++-------------++---------------------+--------------------+
+| Provenance  || Modules             | Log Details        |
++-------------++---------------------+--------------------+
+| Mashup      || Mashups Inspector   | Mashup Pipeline    |
++-------------++---------------------+--------------------+
+
+Notice that the ``Workspace``, ``Diff Properties``, and ``Vistrail Variables`` views are not in the table.  That is because, the ``Workspace`` view is always visible, the ``Diff Properties`` view opens in the right palette when a visual diff is performed in the ``History`` view, and the ``Vistrail Variables`` view is opened from the ``Views`` menu.  Note: with the ``Vistrail Variables`` view especially, if you don't want it to disappear, you should make sure it is pinned.
+
+The Center Widget
+^^^^^^^^^^^^^^^^^
+
+The center widget is somewhat larger than the side panels as it is intended to be the main workspace.  It displays the following views: ``Pipeline``, ``History``, ``Search``- query and results, ``Visual Diff`` results, ``Explore``, ``Provenance``, and ``Mashup``.  By default, one view is shown.  To open an additional view, type CTRL-t to create a new tab.  The new tab starts out in the ``Pipeline`` view, but you are free to change it to any of the other views.  Note that the tabs from on [...]
+
+If you would like to see views from more than one vistrail at a time, you may do this by right-clicking on the vistrail (listed in ``Current Vistrails`` of the ``Workspace`` view), and selecting the option to open in a new window.  The side palettes will stay with the original window, but can be moved to the current window by selecting ``Dock Palettes`` from the ``Views`` menu.
+
+If you would like to see multiple views from the same vistrail, double-click the title of the view to detach it.  It is not possible to reattach the view, so once you are finished with the detached view, you may close it.  If you would like the view to be reattached, you should close it and open it again in a new tab.
+
+.. _sec-start-file:
+
+Manipulating |vistrails| Files
+==============================
+
+.. index::
+   pair: open; vistrail 
+   pair: open; from a database
+   single: tab
+
+To open a |vistrails| file, or *vistrail*, you can either click the
+``Open`` button in the toolbar or select ``Open`` from the ``File``
+menu. This brings up a standard file dialog where you can select a
+vistrail to open.  Vistrails are identified by the ``.vt`` file
+extension. Alternatively, if the vistrail is listed under `My Vistrails` in the ``Workspace Panel``, double clicking its name will open it.  When a vistrail is opened, it is listed in the ``Workspace`` (upper left panel) under `Current Vistrails`.  Since only one open vistrail is displayed at a time, the ``Workspace`` allows you to select which one to display.  Vistrails can also be stored in a database, enabling a central repository for workflows. See Chapter :ref:`chap-database` for mo [...]
+
+.. index::
+   pair: close; vistrail
+   pair: save; vistrail
+
+To close a vistrail, you can either choose the
+``Close`` option from the ``File`` menu or type Ctrl-w.  If
+the vistrail has not been saved, you will be asked if you wish to save
+your work. To save a vistrail, there is both a
+button and a menu item in the ``File`` menu.  If you would
+like to save the vistrail with a different name or in a different
+location, you can use the ``Save As`` option.
+
+.. _sec-start-basics:
+
+|vistrails| Basics
+==================
+
+.. index::
+   single: workflow
+   pair: modules; definition
+   pair: connections; definition
+
+In general, a *workflow* is a way to structure a complex
+computational process that may involve a variety of different
+resources and services.  Instead of trying to keep track of multiple
+programs, scripts, and their dependencies, workflows abstract the
+details of computations and dependencies into a graph consisting of
+computational *modules* and *connections* between these
+modules.
+
+The ``Pipeline`` button on the |vistrails| toolbar accesses VisTrails'
+interface for building workflows. Similar to many existing workflow
+systems, it allows you to interactively create workflows using an
+extensible library of modules and a connection protocol that helps you
+determine how to connect modules.  To add a module to a workflow,
+simply drag the module's name from the list of available modules to
+the workflow canvas.  Each module has a set of input and output ports,
+and outputs from one module can be connected to inputs of another
+module, provided that the types match.  For more information on
+building workflows in |vistrails|, see Chapter :ref:`chap-creating`.
+
+.. index:: 
+   pair: vistrail; definition
+
+In addition to VisTrail's *Pipeline* interface for manipulating
+individual workflows, the *History* interface (accessed through
+the ``History`` button on the toolbar) contains a number of
+features that function on a collection of workflows.
+A *vistrail* is a collection of
+related workflows.  As you explore different computational approaches
+or visualization techniques, a workflow may evolve in a lot of
+directions.  |vistrails| captures all of these changes automatically
+and transparently.  Thus, you can revisit a previous version of a
+workflow and modify it without worrying about saving intermediate
+versions.  This history is displayed by the |vistrails| Version Tree,
+and different ways of interacting with this tree are discussed in
+Chapter :ref:`chap-version_tree`.
+
+With a collection of workflows, one of the necessary tasks is to
+search for specific workflows.  VisTrail's search functionality is
+accessed by clicking the ``Query`` button on the toolbar.
+The criteria for these searches may
+vary from finding workflows modified within a specific time frame to
+finding workflows that contain a specific module.  Because of the
+version history that |vistrails| captures, these tasks are natural to
+implement and query.  |vistrails| has two methods for querying
+workflows, a simple text-based query language and a query-by-example
+canvas that lets you build exactly the workflow structure you
+are looking for.  Both of these techniques are described in
+Chapter :ref:`chap-querying`.
+
+The ``Exploration`` button 
+allows you to explore workflows by running the same
+workflow with different parameters.  Parameter Exploration provides an
+intuitive interface for computing workflows with parameters that vary
+in multiple dimensions.  When coupled with the |vistrails| Spreadsheet,
+parameter exploration allows you to quickly compare results and
+discover optimal parameter settings.  See
+Chapter :ref:`chap-paramexploration` for specific information on using
+Parameter Exploration.
+
+.. _sec-start-interact:
+
+|vistrails| Interaction
+=======================
+
+Workflow Execution
+^^^^^^^^^^^^^^^^^^
+
+.. index:: execute
+
+The ``Execute`` button on the toolbar serves as the "play" button for
+each of the modes described above.  In both the Builder and Version
+Tree modes, it executes the current workflow.  In Query mode, it
+executes the query, and in Parameter Exploration mode, it executes the
+workflow for each of the possible parameter settings.  
+
+When a workflow is executed, the module color is determined as follows:
+
+   * lilac: module was not executed
+   * yellow: module is currently being executed
+   * green: module was successfully executed
+   * orange: module was cached
+   * red: module execution failed
+
+A popup is shown when executing workflows from the pipeline or history view. The popup shows overall progress, the type of module being executed, and a cancel button. Pressing cancel will show a dialog where you can choose to abort or continue the execution. Note that the cancel button may appear frozen while a module is being executed. This is due to limitations in python.
+
+.. topic:: Note
+
+   VisTrails caches by default, so after a workflow is executed, if none of its parameters change, it won't be executed again.
+
+   If a workflow reads a file using the basic module File, VisTrails does check whether the file was modified since the last run. It does so by keeping a signature that is based on the modification time of the file. And if the file was modified, the File module and all downstream modules (the ones which depend on File) will be executed.
+
+   If you do not want VisTrails to cache executions, you can turn off caching: go to Menu Edit :math:`\rightarrow` Preferences and in the General Configuration tab, change Cache execution results to Never.
+
+   If you would like your input and output data to be versioned, you can use the Persistence package.
+
+Additional Interactions
+^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index:: undo, redo
+
+From the ``Edit`` menu, ``Undo`` and ``Redo`` function in the standard way, but note that these
+actions are implicitly switching between different versions of a
+workflow.  Thus, you will notice that as you undo or redo a change to
+a workflow, the selected version in the version tree changes.
+
+.. index:: select, pan, zoom
+
+For all modes except Parameter Exploration, the center pane of
+|vistrails| is a canvas where you can manipulate the current workflow,
+version tree, or query.  The buttons on the right side of the toolbar
+allow you to change the default behavior of the primary mouse button
+(the left button for most multiple button mice) within this canvas.
+You can choose the behavior to select items in the scene, pan around
+the scene, or zoom in and out of the scene by selecting the given
+button.  In addition, if you are using a 3-button mouse, the right
+button will zoom, and the middle button will pan.  To use the zoom
+functionality, click and drag up to zoom out and drag down to zoom in.
+
+.. index:: center
+
+.. topic:: Note
+
+   Pressing Ctrl-R will recenter the window.
+
diff --git a/doc/usersguide/groups.rst b/doc/usersguide/groups.rst
new file mode 100644
index 0000000..f3cae09
--- /dev/null
+++ b/doc/usersguide/groups.rst
@@ -0,0 +1,108 @@
+.. _chap-grouping:
+
+********************************
+Groups and Subworkflows
+********************************
+
+.. _sec-grouping:
+
+Grouping Modules
+================
+
+.. index::
+   pair: modules; grouping
+   pair: modules; ungrouping
+   single: grouping
+
+As the number of modules in a pipeline increases, the pipeline can grow quite large and cumbersome. This also makes the pipeline more difficult to understand and maintain.  With any large system, it can be helpful to cluster related pieces together and represent them as a single unit. This idea, called *encapsulation*, is commonly used in computer programming as a way of controlling complexity. |vistrails| likewise supports the grouping of multiple modules together so that they can be tr [...]
+
+Multiple modules are grouped together by first selecting them, and then choosing the ``Group`` option from the ``Edit`` menu. Alternatively, you can use the keyboard shortcut 'Ctrl-G'.
+
+An example may clarify how this works.
+
+.. topic:: Try it now!
+
+   Open :vtl:`vtk_book_3rd_p189.vt`.  Select the ``vtkOutlineFilter``, ``vtkPolyDataMapper``, ``vtkProperty``, and ``vtkActor`` modules on the left side of the pipeline, as shown in Figure :ref:`Box selection of four modules <fig-groupinga>`. Type 'Ctrl-G' to group these modules. Notice how the pipeline changes, as shown in Figure :ref:`The modules represented as a single group module <fig-groupingb>`. Since the label "Group" isn't very descriptive, you can change this by selecting the ` [...]
+
+.. _fig-groupinga:
+
+.. figure:: figures/grouping/grouping1.png
+   :height: 2.6in
+   :align: center
+
+   Box selection of four modules.
+
+.. _fig-groupingb:
+
+.. figure:: figures/grouping/grouping2.png
+   :height: 2.6in
+   :align: center
+
+   The modules represented as a single group module.
+
+.. _fig-groupingc:
+
+.. figure:: figures/grouping/grouping4.png
+   :height: 2.6in
+   :align: center
+
+   Renaming the group.
+
+Just as any number of modules may be clustered into a group, any number of groups may be combined with other groups or modules to form still larger groups. This is done in the same way as described above.  
+
+Further, the contents of the groups or combinations of groups are revealed through the ``Show Pipeline`` option.  First select the ``group`` module in the pipeline and then select ``Show Pipeline`` from the ``Workflow`` menu.  The group's contents will be shown in a new tab.  If there is a group within a group, selecting the interior ``group`` module and then selecting ``Show Pipeline`` will show the interior group's pipeline in an additional tab. 
+ 
+In addition to viewing the group's contents, any group may be also un-grouped; that is, restored to its individual modules. This is done by selecting the group module in the pipeline, and then choosing the ``Edit`` :math:`\rightarrow` ``Ungroup`` menu option or by pressing 'Ctrl-Shift-G'.  A group's pipeline may not be used to ungroup interior groups, however.  The tabs opened by the ``Show Pipeline`` command are read only.
+
+.. Groups may only be ungrouped from the pipeline view, and not from the windows that are created when selecting ``Show Pipeline``.  Thus, an interior group may only be ungrouped after the group to which is belongs is ungrouped.
+
+.. Combinations of groups may be ungrouped in any order.
+
+.. _sec-grouping-subworkflows:
+
+Subworkflows and Group Modules
+===================================
+
+.. index::
+   pair: modules; subworkflows
+   pair: subworkflows; groups
+   pair: groups; subworkflows
+
+A subworkflow is similar to a group, but has some differences.  Here, we will explain the differences to make it easier to understand which one to use when:
+
+   * A subworklow is a VisTrail, and a history of changes to a subworkflow is kept, whereas a group is part of a vistrail.  So, if you copy and paste a group, the pasted group won't necessarily be linked to the group's history.
+   * When a subworkflow is created, it is listed in the ``My Subworkflows`` portion of the ``Modules`` panel.  It is saved and will be accessible from any vistrail.  A group, on the other hand can be named and copied and pasted within a file, or even across files. However, it will not be placed in the modules panel.
+   * Subworkflows can be edited and saved without needing to ungroup and regroup the modules.  To edit anything within a group, it first needs to be ungrouped, and then regrouped.
+
+  
+Subworkflows
+============
+
+.. index::
+   pair: modules; subworkflows
+   single: subworkflows
+
+To create a subworkflow, select the modules to include and select ``Create Subworkflow`` from the ``Workflow`` menu.  See Figure :ref:`Creating a subworkflow <fig-subworkflow>`.  You will be prompted to name the subworkflow.  The subworkflow will appear in the modules list under ``My Subworkflows.``  Groups can be converted to subworkflows by selecting the ``Convert to Subworkflow`` option.  
+
+To edit a subworkflow, select a module of the corresponding subworkflow and select ``Edit Subworkflow`` from the ``Workflow`` menu.  This will open the subworkflow's file.  If you make changes to the subworkflow and save them, the modules that correspond to the old subworkflow will be marked with a '!', meaning that it is not the latest version.  To upgrade to the latest version, either select the triangle in the module's upper right corner and choose ``Upgrade Module``, or delete the ol [...]
+
+.. _fig-subworkflow:
+
+.. figure:: figures/grouping/subworkflow.png
+   :height: 4in
+   :align: center
+
+   Creating a subworkflow.
+
+.. _fig-subworkflow_upgrade:
+
+.. figure:: figures/grouping/subworkflow_upgrade.png
+   :align: center
+   :width: 3in
+
+   Upgrading a subworkflow module that has been edited.
+
+Importing and Exporting Subworkflows
+++++++++++++++++++++++++++++++++++++
+
+Since subworkflows are saved locally, the ``Import Subworkflow`` and ``Export Subworkflow`` options can be used for sharing.  For example, to add a subworkflow from an open VisTrail to your local list of ``My Subworkflows`` modules, you would select the subworkflow and select ``Import Subworkflow`` from the ``Workflows`` menu.  Alternatively, you can save any number of subworkflows to a package by dragging the subworkflow modules to the canvas, selecting them, selecting ``Export Subworkf [...]
diff --git a/doc/usersguide/index.rst b/doc/usersguide/index.rst
new file mode 100644
index 0000000..7f71717
--- /dev/null
+++ b/doc/usersguide/index.rst
@@ -0,0 +1,20 @@
+.. VisTrails documentation master file, created by
+   sphinx-quickstart on Mon Feb  7 20:45:58 2011.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to VisTrails's documentation!
+=====================================
+
+.. toctree::
+   :maxdepth: 3
+
+   example
+   developer
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
+
diff --git a/doc/usersguide/intro.rst b/doc/usersguide/intro.rst
new file mode 100644
index 0000000..1076b3c
--- /dev/null
+++ b/doc/usersguide/intro.rst
@@ -0,0 +1,9 @@
+############################
+An Introduction to VisTrails
+############################
+
+.. toctree::
+   :maxdepth: 2
+
+   intro2
+   getting_started
diff --git a/doc/usersguide/intro2.rst b/doc/usersguide/intro2.rst
new file mode 100644
index 0000000..2b46796
--- /dev/null
+++ b/doc/usersguide/intro2.rst
@@ -0,0 +1,85 @@
+******************
+What Is VisTrails?
+******************
+
+VisTrails is a new system that provides data and process management
+support for exploratory computational tasks. It combines features of
+both workflow and visualization systems. Similar to workflow systems, it allows the combination of loosely-coupled resources, specialized
+libraries, and grid and Web services. Similar to some
+visualization systems, it provides a mechanism for parameter
+exploration and comparison of different results. But unlike these other systems,
+VisTrails was designed to manage *exploratory processes* in which
+computational tasks evolve over time as a user iteratively
+formulates and tests hypotheses. A key distinguishing
+feature of VisTrails is its comprehensive provenance infrastructure that
+maintains detailed history information about the steps followed in the
+course of an exploratory task. VisTrails leverages this information to
+provide novel operations and user interfaces that streamline this
+process.
+
+Important Features
+""""""""""""""""""
+One of our main uses for VisTrails has been exploratory visualization,
+but the system is much more general and provides many other features,
+such as:
+
+* *Flexible Provenance Architecture.* VisTrails transparently
+  tracks changes made to workflows, including all the steps followed in the
+  exploration. The system can optionally track run-time information
+  about the execution of workflows (|eg| who executed a module, on
+  which machine, elapsed time |etc|). |vistrails| also provides a
+  flexible annotation framework whereby you can specify
+  application-specific provenance information.
+
+* *Querying and Re-using History.*  The provenance
+  information is stored in a structured way. You have a choice of
+  using a relational database (such as MySQL or IBM DB2) or XML files in
+  the file system. The system provides flexible and intuitive query
+  interfaces through which you can explore and reuse provenance
+  information.  You can formulate simple keyword-based and selection
+  queries (|eg| find a visualization created by a given user) as well
+  as structured queries (|eg| find visualizations that apply
+  simplification before an isosurface computation for irregular grid
+  data sets).
+
+* *Support for collaborative exploration.*  The system can be
+  configured with a database backend that can be used as a shared
+  repository.  It also provides a synchronization facility that allows
+  multiple users to collaborate asynchronously and in a disconnected
+  fashion---you can check in and check out changes, akin to a
+  version control system (|eg| SVN: http://subversion.tigris.org).
+
+* *Extensibility.* |vistrails| provides a very simple plugin
+  functionality that can be used to dynamically add packages and
+  libraries. Neither changes to the user interface nor re-compilation
+  of the system are necessary.  Because |vistrails| is written in
+  Python, the integration of Python-wrapped libraries is
+  straightforward. For example, a single line in the VisTrails
+  start-up file is needed to import all of VTK's classes.
+* *Scalable Derivation of Data Products and Parameter Exploration.*  
+  |vistrails| supports a series of operations
+  for the simultaneous generation of multiple data products, including
+  an interface that allows you to specify sets of values for
+  different parameters in a workflow. The results of a parameter
+  exploration can be displayed side by side in the VisTrails
+  Spreadsheet for easy comparison.
+* *Task Creation by Analogy.*  Analogies are supported as
+  first-class operations to guide semi-automated changes to multiple
+  workflows, without requiring you to directly manipulate or edit
+  the workflow specifications.
+
+Obtaining the software
+""""""""""""""""""""""
+
+Visit http://www.vistrails.org to access the VisTrails community
+website. Here you will find information including instructions for
+obtaining the software, online documentation, video tutorials, and
+pointers to papers and presentations.
+
+VisTrails is available as open
+source; it is released under the GPL 2.0 license.  The pre-compiled
+versions for Windows and Mac OS X come with an installer and
+include a number of packages, including VTK, matplotlib, and Image
+Magick. Additional packages, including packages written by users, are
+also available (|eg| ITK, Matlab, Metro). Developers can easily add new
+packages using the VisTrails plugin infrastructure. 
diff --git a/doc/usersguide/latex.rst b/doc/usersguide/latex.rst
new file mode 100644
index 0000000..5667470
--- /dev/null
+++ b/doc/usersguide/latex.rst
@@ -0,0 +1,260 @@
+***********************************
+Embedding VisTrails Files Via Latex
+***********************************
+
+.. index:
+   pair: embed; latex
+
+The VisTrails Latex extension allows you to embed the result from a VisTrails file into a Latex document.  Images to be included in the Latex document will be generated through VisTrails and can be linked to the VisTrails file and version from which it was generated.  In other words, Latex calls VisTrails to generate an image for a resulting PDF document.  The resulting image can be set up so, when clicked, the generated VisTrails file will be opened in VisTrails.
+
+Latex Setup and Commands
+========================
+
+This section contains instructions for setting up Latex files to use VisTrails.  For a complete example of this setup, you may also refer to example.tex in VisTrails' extensions/latex directory.
+
+To use the Latex extension, copy vistrails.sty and includevistrail.py from the extensions/latex directory to the same directory as your .tex files.  Then, add the following line to the beginning of the latex file:
+
+``\usepackage{vistrails}``
+
+By default, VisTrails will be executed at www.vistrails.org and the images
+downloaded to your hard drive. This allows any user that downlods your paper to execute the workflows on the server. 
+
+Local Setup
+^^^^^^^^^^^
+
+If you want to run a local copy of VisTrails instead, add the following path to your python file or executable:
+
+``\renewcommand{\vistrailspath}{/path/to/vistrails/run.py}``
+
+Depending on how you are running VisTrails and on which OS you are running, the \vistrailspath should be configured appropriately. Please check head.tex in VisTrails' extensions/latex directory for detailed instructions on the configuration for the different platforms. 
+
+By default, images are set up to link to their corresponding vistrail. This means that on a local setup, clicking on an image will open the local .vt file or will try to connect to the database if you loaded the vistrail from a database. This may not work when other users click on the images on different machines. However, if you are using your own web server, additional setup is required (see :ref:`sec-latex-setup-using-a-web-server`).  Otherwise, to setup the images without links (not  [...]
+
+``\renewcommand{\vistrailsdownload}{}``
+
+Finally, if you are running VisTrails from source and don't have
+python on your path, use this to set the python interpreter:
+
+``\renewcommand{\vistrailspythonpath}{/path/to/python/executable}``
+
+**Note:** If you set the \vistrailspythonpath to an invalid path
+VisTrails will use cached files if they exist.
+
+.. _sec-latex-setup-using-a-web-server:
+
+Setup For Use With Files on MediaWiki or a Web Server
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index:
+   pair: latex embedding; mediawiki 
+   pair: latex embedding; web server
+
+Many VisTrails files and/or data are stored in a database that readers
+of a pdf document might not have access to.  If the files are also
+accessible through the web, the following instructions explain setup
+that will allow readers to download the VisTrail or workflow through
+MediaWiki or a web server.
+
+**MediaWiki**
+
+To setup your MediaWiki for use with VisTrails:
+
+* In your wiki/extensions folder, create a config.php file based on the config.php.sample file located in VisTrails' extensions/http folder.
+* Copy download.php, functions.php, and vistrailsExtension.php from the extensions/mediawiki folder to your wiki/extentions folder and update these files according to your needs.
+* Configure your .tex files with: 
+
+  ``\renewcommand{\vistrailsdownload}{http://yourwebserver.somethingelse/download.php}``
+
+**Web Server**
+
+To configure VisTrails to run on your web server:
+
+* Create a config.php file based on the config.php.sample file located in VisTrails' extensions/http folder.
+* Copy functions.php and downloads.php from the extensions/mediawiki folder and update them according to your needs.
+* Depending on the functionality you want to make available, copy any or all of the following files:
+   - run_vistrails.php - will execute workflows and return images and pdf files
+   - get_db_vistrail_list.php - will return a list of VisTrails available in the database
+   - get_vt_xml.php - will return a VisTrail in xml format
+   - get_wf_pdf.php - will return a workflow graph in pdf format
+   - get_wf_xml.php - will return a workflow in xml format
+* Configure your .tex files with:
+
+  ``\renewcommand{\vistrailspath}{http://yourwebserver.somethingelse/run_vistrails.php}``
+
+  ``\renewcommand{\vistrailsdownload}{http://yourwebserver.somethingelse/download.php}``
+
+Including VisTrails Results in Latex
+====================================
+
+There are two ways of including VisTrails' objects in a Latex file. Usually you start with a workflow in a vistrail (the vistrail can be loaded from a file or from a database):
+
+* In ``History`` view, select the version node representing the workflow.
+* In ``Pipeline`` view, ensure that the workflow is being displayed.
+
+Now you can select ``Publish`` :math:`\rightarrow` ``To Paper...`` to launch a dialog with embedding options (see Figure :ref:`fig-configure-embedding`).  
+
+.. _fig-configure-embedding:
+
+.. figure:: figures/latex/embedding.png
+   :align: center
+   :width: 5.5in
+
+   Embedding Options
+
+Then perform the following steps:
+
+* Select the type of object that you would like to display. The choices are: Workflow Results, Workflow Graph, and History Tree Graph.
+* Make sure that ``Latex`` is displayed in the ``In:`` combobox.
+* You should then choose from a number of "Embed" and "Download" options which will be explained in the tables below.
+* Press the "Copy to Clipboard" button
+* Paste clipboard contents into you Latex document 
+* Run pdflatex with the -shell-escape option: ``pdflatex -shell-escape example.tex``.
+
+**Note on using local VisTrails files:** Relative or absolute filenames can be used in the .tex file, but absolute filenames are used in the pdf.  Thus, if the absolute location of the file has changed, the pdf will need to be regenerated even if the relative location of the file has not changed.  Also, the VisTrails ``Embed`` function assumes the .vt file is in the same directory as the .tex file.  You will need to change this to an absolute filename if it is not.
+
+.. tabularcolumns:: |p{2.8cm}|p{3.0cm}|p{7.5cm}|
+   
+.. _table-options:
+
+.. only:: html
+
+   **Configuration Options**
+
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+ 
+   | Option                | Latex Flag            | Description                                                              |
+   +=======================+=======================+==========================================================================+
+   | | Workflow Results    | version=<...>         | Show the results of the specified version.                               |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | Workflow Graph        | | version=<...>       | Show the workflow instead of the results.                                |
+   |                       | | showworkflow        |                                                                          |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | | History Tree Graph  | showtree              | Show the version tree instead of the results.                            |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+
+   **Embed Options**
+
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+ 
+   | Option                | Latex Flag            | Description                                                              |
+   +=======================+=======================+==========================================================================+
+   | As PDF                | | pdf                 | | Include images as pdf files. If this is not checked, a png image is    |
+   |                       |                       |   used.                                                                  |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | Smart Tag             | tag=<...>             | | Allows you to include a version's tag.  If a tag is provided, version  |
+   |                       |                       |   can be omitted and buildalways is implicit.                            |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | Cache Images          | | buildalways         | | When caching desired, the buildalways flag should not be included.     |
+   |                       | | (do not include     |   If it is included, VisTrails will be called regardless of whether or   |
+   |                       |   for caching)        |   not it has been called for the same host, db, version, port and vt_id. |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | Include .vtl          | | getvtl              | | Causes the .vtl file to be downloaded when compiling the pdf file.     |
+   |                       |                       |   This is useful when you want to package the workflows together with    |
+   |                       |                       |   your paper for archiving.                                              |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+
+   **Download Options**
+
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+ 
+   | Option                | Latex Flag            | Description                                                              |
+   +=======================+=======================+==========================================================================+
+   | | Include Workflow    | embedworkflow         | When clicking on the image in the pdf, download the workflow only.       |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | | Execute Workflow    | execute               | Will cause the workflow to be executed when it is opened.                |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | | Include Full Tree   | includefulltree       | When clicking on the image, download the complete VisTrail.              |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+   | | Show Spreadsheet    | showspreadsheetonly   | When opening the workflow it will initially only show the spreadsheet.   |
+   |   Only                | execute               | The execute option is implicit.                                          |
+   |                       |                       |                                                                          |
+   +-----------------------+-----------------------+--------------------------------------------------------------------------+
+
+.. only:: latex
+
+   .. tabularcolumns:: |p{2.8cm}|p{3.0cm}|p{7.5cm}|
+   
+   .. csv-table:: Configuration Options
+      :header: **Option**, **Latex Flag**, **Description**
+
+      Workflow Results, version=<...>, "Show the results of the specified version."
+      , ,
+      Workflow Graph, version=<...>, "Show the workflow instead of the results."
+      ,showworkflow,
+      , ,
+      History Tree Graph, showtree, "Show the version tree instead of the results."
+
+   .. tabularcolumns:: |p{2.8cm}|p{3.0cm}|p{7.5cm}|
+
+   .. csv-table:: Embed Options
+      :header: **Option**, **Latex Flag**, **Description**
+
+      As PDF, pdf, "Download images as pdf files. If this is not checked, a png image is used."
+      , ,
+      Smart Tag, tag=<...>, "Allows you to include a version's tag.  If a tag is provided, version can be omitted and buildalways is implicit."
+      , ,
+      Cache Images, buildalways (do not include for caching), "When caching desired, the buildalways flag should not be included.  If it is included, VisTrails will be called regardless of whether or not it has been called for the same host, db, version, port and vt_id."
+      , ,
+      Include .vtl, getvtl, "Causes the .vtl file to be downloaded when compiling the pdf file. This is useful when you want to package the workflows together with your paper for archiving."
+
+   .. tabularcolumns:: |p{2.8cm}|p{3.0cm}|p{7.5cm}|
+
+   .. csv-table:: Download Options
+      :header: **Option**, **Latex Flag**, **Description**
+
+      Include Workflow, embedworkflow, "When clicking on the image in the pdf, download the workflow only."
+      , ,
+      Execute Workflow, execute, "Will cause the workflow to be executed when it is opened."
+      , ,
+      Include Full Tree, includefulltree, "When clicking on the image, download the complete VisTrail."
+      , ,
+      Show Spreadsheet Only, showspreadsheetonly, "When opening the workflow it will initially only show the spreadsheet. The execute option is implicit."
+
+Example
+^^^^^^^
+
+The following is an example command for including the execution results the workflow ``aliases`` from examples/head.vt in a pdf and caching the images. When clicking on the images, the user will start |vistrails| showing only the spreadsheet:
+
+| ``\vistrails[filename=head.vt,``
+| ``version=15,``
+| ``pdf,`` 
+| ``execute,``
+| ``showspreadsheetonly,`` 
+| ``]{width=0.45\linewidth} %Options you would give to the \includegraphics{} command``.
+
+See head.tex in the extensions/latex directory for a complete example of usage.
+
+Additional Notes
+^^^^^^^^^^^^^^^^
+
+After running at least once, VisTrails will cache the images and latex 
+instructions.  The latex code will be in the "cached" folder and the images in 
+vistrails_images.
+
+Vistrails will create in the current directory a directory called 
+vistrails_images/filename_version_options with the png/pdf files generated by the spreadsheet.
+
+Including crowdlabs.org workflow results in Latex
+=================================================
+
+It is also possible to embed results of workflows that are in www.crowdlabs.org. 
+
+To use the crowdLabs extension, copy crowdlabs.sty and includecrowdlabs.py from the extensions/latex directory to the same directory as your .tex files.  Then, add the following line to the beginning of the latex file:
+
+``\usepackage{crowdlabs}``
+
+
+The vistrail you would like to use must be already in crowdLabs. Visit the page of the workflow, for example, go to:
+
+http://www.crowdlabs.org/vistrails/workflows/details/1046/
+
+And click on the ``Embed this Workflow`` tab located below the image. Copy the snippet in the ``In LaTex`` box:
+
+| ``\vistrail[wfid=1046,``
+| ``buildalways=false]{width=4cm}``
+
+And paste it in the latex file.
+
+Currently crowdLabs supports only embedding workflow results in the png format. Do not use this extension together with the vistrails extension above.
+
+
+ 
+
+
diff --git a/doc/usersguide/log.rst b/doc/usersguide/log.rst
new file mode 100644
index 0000000..4e20212
--- /dev/null
+++ b/doc/usersguide/log.rst
@@ -0,0 +1,35 @@
+.. _chap-log:
+
+***************************
+Accessing the Execution Log
+***************************
+
+.. index:: log
+
+The code responsible for storing execution information is located in the "core/log" directories, and the code that generates much of that information is in "core/interpreter/cached.py". Modules can add execution-specific annotations to provenance via annotate() calls during execution, but much of the data (like timing and errors) is captured by the LogController and CachedInterpreter (the execution engine) objects. To analyze the log from a vistrail (.vt) file, you might have something l [...]
+
+   import core.log.log
+   import db.services.io
+ 
+::
+
+ def run(fname):
+  # open the .vt bundle specified by the filename "fname"
+  bundle = db.services.io.open_vistrail_bundle_from_zip_xml(fname)[0]
+  # get the log filename
+  log_fname = bundle.vistrail.db_log_filename
+  if log_fname is not None:
+      # open the log
+      log = db.services.io.open_log_from_xml(log_fname, True)
+      # convert the log from a db object
+      core.log.log.Log.convert(log)
+      for workflow_exec in log.workflow_execs:
+          print 'workflow version:', workflow_exec.parent_version
+          print 'time started:', workflow_exec.ts_start
+          print 'time ended:', workflow_exec.ts_end
+          print 'modules executed:', [i.module_id 
+                                      for i in workflow_exec.item_execs]
+ if __name__ == '__main__':
+    run("some_vistrail.vt")
+
+You should be able to see what information is available by looking at the "core/log" classes.
diff --git a/doc/usersguide/make.bat b/doc/usersguide/make.bat
new file mode 100644
index 0000000..fd22480
--- /dev/null
+++ b/doc/usersguide/make.bat
@@ -0,0 +1,113 @@
+ at ECHO OFF
+
+REM Command file for Sphinx documentation
+
+set SPHINXBUILD=sphinx-build
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html      to make standalone HTML files
+	echo.  dirhtml   to make HTML files named index.html in directories
+	echo.  pickle    to make pickle files
+	echo.  json      to make JSON files
+	echo.  htmlhelp  to make HTML files and a HTML help project
+	echo.  qthelp    to make HTML files and a qthelp project
+	echo.  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  changes   to make an overview over all changed/added/deprecated items
+	echo.  linkcheck to check all external links for integrity
+	echo.  doctest   to run all doctests embedded in the documentation if enabled
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\VisTrails.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\VisTrails.ghc
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+:end
diff --git a/doc/usersguide/mashups.rst b/doc/usersguide/mashups.rst
new file mode 100644
index 0000000..dc74619
--- /dev/null
+++ b/doc/usersguide/mashups.rst
@@ -0,0 +1,116 @@
+.. _chap-mashups:
+
+*******
+Mashups
+*******
+
+.. _sec-param-alias:
+
+Creating Parameter Aliases
+==========================
+
+.. index:: 
+   pair: mashups;aliases
+   pair: mashups;setting parameters
+
+If you would like to be able to explore different values for a specific parameter,  you will need to create an alias by double-clicking the parameter in the ``Parameter Aliases`` section.  After naming the alias, you can select the alias in the ``Mashup`` tab (center panel), and configure the alias by selecting the ``Display Widget`` type and setting Default values.  
+
+Notice that a pipeline can have multiple modules of the same type or name, making it difficult to differentiate between them.  These modules are each assigned a number, with the numbers in the ``Annotated Pipeline`` section corresponding to the numbers in the ``Parameter Aliases`` section, making it possible set an alias for the desired module without much confusion. See figure :ref:`Numbered Modules... <fig-righttab>`.
+
+.. _fig-righttab:
+
+.. figure:: figures/mashups/righttab.png
+   :width: 2.5in
+   :align: center
+
+   Numbered Modules - The HTTPFile modules 1 and 2 appear in the annotated pipeline and in the parameter aliases.  The annotated pipeline also, numbers the vtkDataSetReader modules (which appear below the respective HTTPFile modules in the pipeline).  Their parameters have not been exposed to the mashup, so they do not appear in the Parameter Aliases section.
+
+Finally, not all modules in the ``Annotated Pipeline`` will show up in the ``Parameter Aliases`` section.  Only modules whose parameters have been set in the pipeline will appear.
+
+
+Configuring Parameter Aliases
+=============================
+
+.. index::
+   pair: mashups; configuring aliases
+
+As mentioned in section :ref:`sec-param-alias`, aliases are configured in the center panel (the ``Mashup`` tab).  This is pretty simple, so here are the steps:
+
+#. Select the alias you wish to configure from the top box in the ``Aliases`` tab.  The name and position of the selected alias should be displayed below.  Both of these can be changed by editing the ``Name`` and/or ``Order`` values.  
+#. Next select the type of widget to display.  The choices are combobox, slider, and numeric stepper.  The combobox will allow you to enter specific values, whereas the numeric stepper and slider will allow you to scroll through a range of values.
+#. Set the Min Val, Max Val, and Step Size (for slider and numeric stepper only).
+#. Set the Default Value.  The default value should already be set based on the value it was given in the pipeline, but you are allowed to change it here if desired.
+#. Enter suggested values.  If you have a set of values to suggest to the user through the Mashups interface, you should add them to the values list.  You can do this by either clicking the ``...`` button and adding the appropriate values, or by entering the values in the ``Values List`` box in list format. 
+#. Finally, you may delete an alias with the ``Delete Alias`` button.
+
+After configuring the necessary aliases, press ``Preview`` to interact with your mashup and to ensure its proper functionality.
+
+Saving a Mashup
+===============
+
+.. index::
+   pair: mashups;saving
+
+Mashups are added the the VisTrail when you press the keep button.  However, this changes the VisTrail, but does not save it.  To fully save your mashup, you should both press the ``Keep`` button and save the VisTrail.
+
+Managing Multiple Mashups
+=========================
+
+.. index:: 
+   pair: mashups;naming
+
+The ``Mashups Inspector`` allows you to both rename a mashup, and easily switch between existing mashups.
+
+A Simple Example
+================
+.. topic:: Try it now!
+
+   * Open :vtl:`brain_vistrail.vt`
+   * Choose ``Save As`` and rename the file if you do not want to overwrite the original.
+   * Select the "counter 4" version
+   * Press execute to ensure any necessary upgrades are made
+   * Select ``Mashup`` from the toolbar.
+   * In the Mashup Pipeline tab, look under ``vtkProperty`` :math:`\rightarrow` ``SetOpacity`` and double-click on ``Float``.  
+   * Enter "Opacity" in the ``Set Parameter`` box that pops up, then click ``OK``. See figure :ref:`Creating the Opacity Alias <fig-opacityalias>`.
+   * Under ``vtkRenderer`` :math:`\rightarrow` ``SetBackgroundWidget``, double-click on ``Color`` and enter "Background" as the alias.  See figure :ref:`Creating the Background Alias <fig-background-create>`.
+   * In the center panel, select the ``Opacity`` alias.
+   * Change the display widget to ``numericstepper``.
+   * Set the ``Min Val``, ``Max Val``, and ``Step Size`` to 0, 1, and 0.1 respectively.
+   * Set the ``Values List`` to [0.3, 0.5].  See figure :ref:`Configuring the Opacity Alias <fig-opacity>`.
+   * Select the ``Background`` alias and make sure the display widget is a ``combobox``.
+   * Select ``Preview``.  See figure :ref:`The resulting mashup <fig-mashupcomp>`.
+   * Select ``Tag``, ``No``, and then enter "one" as the new tag name.
+   * Save the file. :vtl:`(Open result) <mashups1.vt>`
+
+.. _fig-opacityalias:
+
+.. figure:: figures/mashups/opacityalias.png
+   :align: center
+   :width: 50%
+
+   Creating the Opacity Alias.
+
+.. _fig-background-create:
+
+.. figure:: figures/mashups/background.png
+   :align: center
+   :width: 35%
+
+   Creating the Background Alias.
+
+.. _fig-opacity:
+
+.. figure:: figures/mashups/aliasconfig.png
+   :align: center
+   :width: 80%
+
+   Configuring the ``Opacity`` alias.
+
+.. _fig-mashupcomp:
+
+.. figure:: figures/mashups/mashupcomp.png
+   :align: center
+   :width: 80%
+
+   The resulting mashup.
+
diff --git a/doc/usersguide/merging.rst b/doc/usersguide/merging.rst
new file mode 100644
index 0000000..ca8211d
--- /dev/null
+++ b/doc/usersguide/merging.rst
@@ -0,0 +1,37 @@
+.. _chap-merging:
+
+*************************
+Merging Two Version Trees
+*************************
+
+.. index:: merging
+
+One of the benefits of having a version tree is that branching allows users to work on multiple workflows within the same file.  This is especially useful when workflows are similar or when one workflow provides output for another.  However, if a user creates two different workflows in two different files and decides he/she wants them to be part of the same file/history, VisTrails allows file merging.
+
+To merge two files:
+
+   * Open both files
+   * Select one of the files you would like to be merged.
+   * Place you mouse over the ``Merge With`` arrow from the Edit menu.  A list of open files should appear.
+   * Select the file that you would like to join with the current (previously selected) file.
+
+The history trees of both files should now be joined and placed in a new file. 
+
+Example
+=======
+
+.. _fig-premerge:
+
+.. figure:: figures/merging/premerge.png
+   :align: center
+   :width: 65%
+
+   Merging two vistrails.
+
+.. _fig-postmerge:
+
+.. figure:: figures/merging/postmerge.png
+   :align: center
+   :width: 65%
+
+   The resultant history tree.
diff --git a/doc/usersguide/packages.rst b/doc/usersguide/packages.rst
new file mode 100644
index 0000000..7b61b26
--- /dev/null
+++ b/doc/usersguide/packages.rst
@@ -0,0 +1,1177 @@
+.. _chap-packages:
+
+**************************
+Writing VisTrails Packages
+**************************
+
+Introduction
+============
+
+.. highlight:: python
+   :linenothreshold: 5
+
+.. index::
+   pair: modules; writing new
+   single: packages
+
+.. role:: red
+
+|vistrails| provides a
+plugin infrastructure to integrate user-defined functions and
+libraries. Specifically, users can incorporate their own visualization
+and simulation code into pipelines by defining custom modules (or wrappers). These
+modules are bundled in what we call *packages*. A \vistrails
+package is simply a collection of Python classes stored in one or more
+files, respecting some conventions that will be described shortly.
+Each of these classes will represent a new module. In this chapter, we
+will build progressively more complicated modules.
+Note that even though each section introduces a specific large
+feature of the |vistrails| package mechanism, new small features are
+highlighted and explained as we go along. Because of this, we
+recommend at least skimming through the entire chapter at least once.
+
+Who Should Read This Chapter?
+=============================
+
+This chapter is written for developers who wish to extend |vistrails| with customized modules, tailored for their specific needs. It is assumed that you have experience writing code in the Python programming language. Teaching the syntax of Python is beyond the scope of this manual; for experienced programmers who would like a compact introduction to Python, we recommend the book *Python in a Nutshell* by Alex Martelli (published by O'Reilly).
+
+However, if you do not yet know Python but are familiar with another object-oriented language such as Java or C#, you should be able to get the gist of these examples from looking at the code and by reading our line-by-line commentaries.
+
+.. _sec-packages-simple_example:
+
+A Simple Example
+================
+
+Here is a simplified example of a very simple user-defined module:
+
+.. code-block:: python
+   :linenos:
+
+   class Divide(Module):
+       def compute(self):
+           arg1 = self.getInputFromPort("arg1")
+           arg2 = self.getInputFromPort("arg2")
+           if arg2 == 0.0:
+               raise ModuleError(self, "Division by zero")
+           self.setResult("result", arg1 / arg2)
+
+       _input_ports = [('arg1', '(org.vistrails.vistrails.basic:Float)',\
+                        {"labels": str(["dividend"])}),\
+                       ('arg2', '(org.vistrails.vistrails.basic:Float)',\
+                        {"labels": str(["divisor"])})]
+       _output_ports = [('result', '(org.vistrails.vistrails.basic:Float)',\
+                        {"labels": str(["quotient"])})]
+
+   _modules = [Divide]
+   #old syntax
+   #registry.addModule(Divide)
+   #registry.addInputPort(Divide, "arg1", (basic.Float, 'dividend'))
+   #registry.addInputPort(Divide, "arg2", (basic.Float, 'divisor'))
+   #registry.addOutputPort(Divide, "result", (basic.Float, 'quotient'))
+
+New VisTrails modules must subclass from Module, the base class that defines basic functionality. The only required override is the compute() method, which performs the actual module computation. Input and output is specified through ports, which currently have to be explicitly registered with VisTrails. However, this is straightforward, and done through method calls to the module registry. An example of a (slightly) more complicated module follows:
+
+.. include:: pythoncalc.rst
+
+To try this out in VisTrails, save the file above in the ``.vistrails/userpackages`` subdirectory of your home directory, with the filename ``pythoncalc.py``. Then, click on the ``Edit`` menu (or the ``VisTrails`` menu on Mac OS X), select the ``Preferences`` option and select the ``Module Packages`` tab.  A dialog similar to what is shown
+in Figure :ref:`All available packages... <fig-packages-enablepackage>` should appear. Select the
+``pythonCalc`` package, then click on
+``Enable``. This should move the package to the
+``Enabled packages`` list. Close the dialog. The package and
+module should now be visible in the VisTrails builder.
+
+.. _fig-packages-enablepackage:
+
+.. figure:: figures/packages/enable_package.png
+   :align: center
+   :width: 100%
+
+   All available packages can be enabled and disabled with the VisTrails preferences dialog.
+
+Now create a workflow similar to what is shown in Figure
+:ref:`A simple workflow that uses PythonCalc... <fig-packages-pythoncalcworkflow>`. When executed, this workflow
+will print the following on your terminal:
+
+``7.0``
+
+.. _fig-packages-pythoncalcworkflow:
+
+.. figure:: figures/packages/pythoncalc_workflow.png
+   :align: center
+   :width: 100%
+
+   A simple workflow that uses ``PythonCalc``, a user-defined module.
+
+
+
+Let's now examine how this works. The first
+two lines simply import required components. The next three lines
+give |vistrails| meta-information about the
+package. ``Version`` is simply information about the package
+version. This might be tied to the underlying library or not. The only
+recommended guideline is that compatibility is not broken across minor
+releases, but this is not enforced in any way. ``Name`` is a
+human-readable name for the package. 
+
+.. %\paragraph*{Choosing a good identifier}
+
+The most important piece of metadata,
+however, is the package *identifier*, stored in the variable called
+``identifier``. This is a string that must be globally unique
+across all packages, not only in your system, but in any possible
+system. We recommend using an identifier similar to Java's package
+identifiers. These look essentially like regular DNS names, but the
+word order is reversed. This makes sorting on the strings a lot more
+meaningful. You should generally go for
+``institution.project.packagename`` for a package related to a
+certain project from some institution, and
+``institution.creatorname`` for a personally developed
+package. If you are wrapping third-party functionality, *do not*
+use their institution's DNS, use your own. The rationale for this is
+that the third party itself might decide to create their own |vistrails|
+package, and you do not want to introduce conflicts.
+
+Line 8 is where we actually start defining a new module.
+Every |vistrails| module corresponds
+to a Python class that ultimately derives from the ``Module`` class, which is defined in ``core.modules.vistrails_module``. Each module must implement a ``compute`` method that takes no extra parameters, such as on Line 11. This method
+represents the actual computation that happens in a module.
+This computation typically involves getting the necessary input and
+generating the output. We will now see how that works.
+
+Line 12 shows how to extract input from a
+port. Specifically, we're getting the values passed to input ports
+``value1`` and ``value2``. We then perform some
+operation with these values, and need to report the output on an
+output port, so that it is available for downstream modules. This is
+done on Line 15, where the result is set to port
+``value``.
+
+.. index:: 
+   pair: modules; ``ModuleError``
+
+Let us now look more carefully at the remainder of the class definition. Notice
+that developers are allowed to define extra helper methods, for example the ``op`` method on Line
+17. These helper methods can naturally use the ports
+API. The other important feature of the ``op`` method is
+*error checking*. ``PythonCalc`` requires a string that
+represents the operation to be performed with the two numbers. If the
+string is invalid, it signals an error by simply raising a Python
+exception, ``ModuleError``, that is provided in
+``core.modules.vistrails_module``. This exception expects two
+parameters: the module that generated the exception (typically
+``self``) and a string describing the error. In the Pipeline view, this error message is displayed in the tooltip that appears when the user "mouses over" the ``PythonCalc`` module icon.
+
+.. index::
+   pair: packages; ``initialize``
+   pair: Module registry; ``add_Module``
+   pair: Module registry; ``add_input_port``
+   pair: Module registry; ``add_output_port``
+
+That is all that it takes in terms of module behavior. The rest of the
+code is meant to interact with |vistrails|, and let the system know
+about the modules and ports being exposed. To do that, you must
+provide a function called ``initialize`` in the main body of the
+package file (the function starting on Line
+27). The first thing is usually to register the
+module itself, such as on Line 33. Then, we need
+to tell |vistrails| about the input and output ports we want to
+expose.  Input ports are set with the ``add_input_port`` method
+in the registry, and output ports with ``add_output_port``. These calls take three parameters. The
+first parameter is the module you're adding a new port to. The second
+one is simply the name of the port, and the third one is a description
+of the parameter. In most cases, this is just a pair, where the
+first element is a |vistrails| module representing the module type
+being passed, and the second element is a string describing it.
+Notice that the
+types being used are |vistrails| modules (Line 35),
+and not Python types.
+
+.. %Later, we will see how to pass more complicated data types.
+
+That is it --- you have successfully created a new package and
+module. From now on, we will look at more complicated examples, and
+more advanced features of the package mechanism.
+
+Module documentation
+====================
+
+The docstring you set on your Module subclass will be displayed to the user
+when he clicks on the 'Documentation' button in the 'Module Information' panel.
+Be sure to put a readable description and your usage information there.
+
+If you want to customize that documentation, you can provide a staticmethod or
+classmethod 'get_documentation' on your Module. The string it returns will be
+used as the documentation.
+
+.. code-block:: python
+   :linenos:
+
+   class TestMod(Module):
+       """This very simple module doesn't do anything sensible.
+       """
+
+       @classmethod
+       def get_documentation(cls, docstring, module=None):
+           return docstring.upper()
+
+The function receives two arguments: the string that was about to be used (the
+module's docstring or an empty string), and the module object from the
+pipeline if the documentation was requested for a specific instance of that
+module (else, None is passed).
+
+.. _fig-packages-custom_documentation:
+
+.. figure:: figures/packages/custom_documentation.png
+   :align: center
+
+Creating Reloadable Packages
+============================
+
+When creating or making changes to packages, it is often desirable to reload the package without having to restart |vistrails|.  To create a package that is reloadable, users should create a new directory for the package in ``userpackages`` directory.  This new directory should have the same name as the package and should contain an ``__init__.py`` file and an ``init.py`` file.  The identified, name, version, configuration, and package_dependencies fields/methods should be in ``__init__. [...]
+
+.. code-block:: python
+   :linenos:
+
+   identifier = 'org.vistrails.vistrails.matplotlib'
+   name = 'matplotlib'
+   version = '0.9.0'
+
+   def package_dependencies():
+       import core.packagemanager
+       manager = core.packagemanager.get_package_manager()
+       if manager.has_package('org.vistrails.vistrails.spreadsheet'):
+           return ['org.vistrails.vistrails.spreadsheet']
+       else:
+           return []
+
+   def package_requirements():
+       import core.requirements
+       if not core.requirements.python_module_exists('matplotlib'):
+           raise core.requirements.MissingRequirement('matplotlib')
+       if not core.requirements.python_module_exists('pylab'):
+           raise core.requirements.MissingRequirement('pylab')
+
+Imports (excluding core.configuration), other class definitions, and the initialize method should be in the ``init.py`` file.  Finally, to reload a package, select the ``reload`` button from the ``Preferences`` dialog's ``Module Packages`` tab.
+
+.. topic:: Note
+
+   To make the previous example :ref:`sec-packages-simple_example` reloadable, rather than having just one file ``pythoncalc.py``, one would have a ``pythoncalc`` directory with the "version", "name", and "identifier" lines in ``__init__.py`` and all other lines in ``init.py``.
+
+.. _sec-wrapping_cmdline_tools:
+
+Wrapping Command-line tools
+===========================
+
+.. index::
+   pair: packages; wrapping command-line tools
+
+Many existing programs are readily available through a command-line
+interface. Also, many existing workflows are first implemented
+through scripts, which work primarily with command-line
+tools. This section describes how to wrap command-line applications so
+they can be used with VisTrails. We will use as a running example the
+``afront`` package, which wraps ``afront``, a command-line program
+for generating 3D triangle meshes.  [#]_ We will wrap the basic
+functionality in three different modules: ``Afront``, ``AfrontIso``, and ``MeshQualityHistogram``.
+
+Each of these modules will be implemented by a Python
+class, and they will all invoke the ``afront`` binary.
+``Afront`` is the base execution module, and
+``AfrontIso`` requires extra parameters on top of the original
+ones. Because of this, we will implement ``AfrontIso`` as a
+subclass of ``Afront``. ``MeshQualityHistogram``,
+however, requires entirely different parameters, and so will not be
+a subclass of ``Afront``. A first attempt at writing this package might look something like this:
+
+.. code-block:: python
+   :linenos:
+
+   from core.modules.vistrails_module import Module
+   ... # other import statements
+
+   name = "Afront"
+   version = "0.1.0"
+   identifier = "edu.utah.vistrails.afront"
+
+   class Afront(Module):
+       def compute(self):
+           ... # invokes afront
+
+   class AfrontIso(Afront):
+       def compute(self):
+           ... # invokes afront with additional parameters
+
+   class MeshQualityHistogram(Module):
+       def compute(self):
+           ... # invokes afront with completely different parameters
+
+   def initialize():
+       ...
+
+Class Mixins
+^^^^^^^^^^^^
+
+While this approach is a good start, it does require significant duplication of effort. Each module must contain code to invoke the ``afront`` binary and pass it some parameters. Since this functionality is required by all three modules, we would like to put this code in a separate class called, say, ``AfrontRun``, and let each of our modules inherit from it. ``AfrontRun`` itself is not a module, and thus does not extend the ``Module`` class. So our three modules will inherit from *both* [...]
+
+.. %It should be clear that all three modules share some functionality (invoking ``afront``), but not all. We would like to avoid duplicate code, but there is not a single class where we can implement the base code. The solution is to create a *mixin class*, where we implement the necessary functionality, and then inherit from both classes. In the following snippets, we will highlight the changes in the code.
+
+.. raw:: latex
+
+   \definecolor{CodeEmph}{rgb}{0.8,0.1,0.1}
+   \newcommand{\important}[1]{\textsl{{\color{CodeEmph}#1}}}
+   \important{hi} hello
+
+.. code-block:: python
+   :linenos:
+
+   from core.modules.vistrails_module import Module, ModuleError
+   from core.system import list2cmdline
+   import os
+   
+   class AfrontRun(object):
+       _debug = False
+       def run(self, args):
+           cmd = ['afront', '-nogui'] + args
+           cmdline = list2cmdline(cmd)
+           if self._debug:
+               print cmdline
+           result = os.system(cmdline)
+           if result != 0:
+               raise ModuleError(self, "Execution failed")
+
+   class Afront(Module, AfrontRun):
+       ...
+
+   class MeshQualityHistogram(Module, AfrontRun):
+       ...
+
+.. .. parsed-literal::
+
+   from core.modules.vistrails_module import Module, ModuleError
+   :red:`from core.system import list2cmdline`
+   :red:`import os`
+   
+   :red:`class AfrontRun(object):`
+       :red:`_debug = False`
+       :red:`def run(self, args):`
+           :red:`cmd = ['afront', '-nogui'] + args`
+           :red:`cmdline = list2cmdline(cmd)`
+           :red:`if self._debug:`
+               :red:`print cmdline`
+           :red:`result = os.system(cmdline)`
+           :red:`if result != 0:`
+               :red:`raise ModuleError(self, "Execution failed")`
+
+   class Afront(Module, :red:`AfrontRun`):
+       ...
+
+   class MeshQualityHistogram(Module, :red:`AfrontRun`):
+       ...
+
+Now every module in the ``afront`` package has access to
+``run()``.  The other new feature in this snippet is
+``list2cmdline``, which turns a list of strings into a command
+line. It does this in a careful way (protecting arguments with spaces,
+for example). Notice that we use a call to a shell
+(``os.system()``) to invoke ``afront``. This is
+frequently the easiest way to get third-party functionality into |vistrails|.
+
+.. _sec-pkg_config:
+
+Package Configuration
+^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: packages; configuration
+
+There are two obvious shortcomings in the way ``run()`` is
+implemented. First, the code assumes ``afront`` is available
+in the system path, which might not be true in practice. Second, the
+debugging variable is inaccessible from the GUI, where it could be
+very useful. |vistrails| provides a way to configure a package
+through the |vistrails| ``Preferences`` dialog. It is very simple to provide your own configuration;
+just add a ``configuration`` attribute to your package, as follows:
+
+.. code-block:: python
+   :linenos:
+
+   from core.configuration import ConfigurationObject
+   from core.modules.vistrails_module import Module, ModuleError
+   from core.system import list2cmdline
+   import os
+
+   configuration = ConfigurationObject(path=(None, str),
+                                       debug=False)
+
+   class AfrontRun(object):
+
+       def run(self, args):
+           if configuration.check('path'): # there's a set directory
+               afront_cmd = configuration.path + '/afront'
+           else: # Assume afront is on path
+               afront_cmd = 'afront'
+           cmd = [afront_cmd, '-nogui'] + args
+           cmdline = list2cmdline(cmd)
+           if configuration.debug:
+               print cmdline
+           ...
+   ...
+
+.. .. parsed-literal::
+
+   :red:`from core.configuration import ConfigurationObject`
+   from core.modules.vistrails_module import Module, ModuleError
+   from core.system import list2cmdline
+   import os
+
+   .. _ref-packages=configconstructor1:
+   :red:`configuration = ConfigurationObject(path=(None, str),`
+   .. _ref-packages-configconstructor2:
+                                       :red:`debug=False)`
+
+   class AfrontRun(object):
+
+       def run(self, args):
+   .. _ref-packages-configurationcheck:
+           :red:`if configuration.check('path'): # there's a set directory`
+               :red:`afront_cmd = configuration.path + '/afront'`
+           :red:`else: # Assume afront is on path`
+               :red:`afront_cmd = 'afront'`
+           cmd = [:red:`afront_cmd`, '-nogui'] + args
+           cmdline = list2cmdline(cmd)
+   .. _ref-packages-configurationdebug:
+           :red:`if configuration.debug:` 
+               print cmdline
+           ...
+   ...
+
+.. index:: ``ConfigurationObject``
+
+Let us first look at how to specify configuration options. Named
+arguments passed to the ``ConfigurationObject`` constructor (Lines 6 and 7) become attributes in the object. If the attribute has a default value, simply pass it to the constructor. If the attribute should be unset by default, pass the constructor a pair whose first element is ``None`` and second element is the *type* of the expected
+parameter. Currently, the valid types are ``bool``,
+``int``, ``float`` and ``str``.
+
+To use the configuration object in your code, you can simply access
+the attributes (as on line 18). This is fine when there is a
+default value set for the attribute. In the case of ``path``,
+however, the absence of a value is encoded by a tuple
+``(None, str)``, so using it directly is inconvenient. That is
+where the ``check()`` method comes in (line 12). It returns ``False``
+if there is no set value, and returns the value otherwise.
+
+Perhaps the biggest advantage of using a configuration object is that the values can
+be changed through a GUI, and they are persistent across VisTrails
+sessions. To configure a package, open the ``Preferences``
+menu (|vistrails|:math:`\rightarrow`
+``Preferences`` on Mac OS X, or ``Edit`` :math:`\rightarrow`
+``Preferences`` on other platforms). Then, select the package you want to
+configure by clicking on it (a package must be enabled to be
+configurable). If the ``Configure`` button is disabled, it
+means the package does not have a configuration object. When you do
+click ``Configure``, a dialog like the one in Figure :ref:`Configuration window for a package... <fig-packages-afrontconfigurationwindow>` will appear.
+
+.. _fig-packages-afrontconfigurationwindow:
+
+.. figure:: figures/packages/afront_configuration_window.png
+   :align: center
+   :width: 40%
+
+   Configuration window for a package that provides a configuration object.
+
+To edit the value for a particular field, double-click on it, and change the
+value. The values set in this dialog are persistent across VisTrails
+sessions, being saved on a per-user basis.
+
+Temporary File Management
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: packages; temporary files
+   pair: packages; ``filePool``
+
+Command-line programs typically generate files as outputs. On
+complicated pipelines, many files get created and passed to other
+modules. To facilitate the use of files as communication
+objects, VisTrails provides basic infrastructure for temporary file
+management. This way, package developers do not have to worry about
+file ownership and lifetimes.
+
+To use this infrastructure, it must be possible to tell the program
+being called which filename to use as output. VisTrails can accommodate
+some filename requirements (in particular, specific
+filename extensions might be important in Windows environments, and
+these can be set), but it must be possible to direct the output to a
+certain filename.
+
+We will use ``Afront's compute()`` method to
+illustrate the feature.
+
+.. code-block:: python
+   :linenos:
+
+   ...
+   class Afront(Module, AfrontRun):
+           
+       def compute(self):
+           o = self.interpreter.filePool.create_file(suffix='.m')
+           args = []
+           if not self.hasInputFromPort("file"):
+               raise ModuleError(self, "Needs input file")
+           args.append(self.getInputFromPort("file").name)
+           if self.hasInputFromPort("rho"):
+               args.append("-rho")
+               args.append(str(self.getInputFromPort("rho")))
+           if self.hasInputFromPort("eta"):
+               args.append("-reduction")
+               args.append(str(self.getInputFromPort("eta")))
+           args.append("-outname")
+           args.append(o.name)
+           args.append("-tri")
+           self.run(args)
+           self.setResult("output", o)
+   ...
+
+Line 5 shows how to create a temporary file
+during the execution of a pipeline. There are a few new things
+happening, so let us look at them one at a time. Every module holds a
+reference to the current *interpreter*, the object responsible
+for orchestrating the execution of a pipeline. This object has a
+``filePool``, which is what we will use to create a pipeline,
+through the ``create_file`` method. This method takes
+optionally a named parameter ``suffix``, which forces the
+temporary file that will be created to have the right extension.
+
+The file pool returns an instance of ``basic_modules.File``,
+a module that is provided by the basic VisTrails packages. There are
+two important things you should know about ``File``. First, it
+has a ``name`` attribute that stores the name of the file it
+represents. In this case, it is the name of the
+recently-created temporary file. This allows you to safely use this
+file when calling a shell, as seen on Line 17.
+The other important feature is that it can be passed directly to an
+output port, so that this file can be used by subsequent modules. This
+is shown on Line 20.
+
+The above code also introduces the boolean function ``hasInputFromPort`` (see Lines 7, 10, and 13). This is a simple error-checking function that verifies that the port has incoming data before the program attempts to read from it. It is considered good practice to call this function before invoking ``getInputFromPort`` for any input port.
+
+**Accommodating badly-designed programs** Even though it is
+considered bad design for a command-line program not to allow the specification of an output
+filename, there do exist programs that lack this functionality. In this case, a possible
+workaround is to execute the command-line tool, and move the generated
+file to the name given by VisTrails.
+
+Interfacing with the |vistrails| Menu
+=====================================
+
+As we saw in Section :ref:`sec-pkg_config`, using the ``ConfigurationObject`` class is one way to "hook" your custom package into the |vistrails| GUI.  However, this is not the only way to integrate your package with the user interface. |vistrails| also supports a mechanism whereby your package can add new options underneath the ``Packages`` menu (Figure :ref:`Packages can integrate their own commands... <fig-packages-package_menu>`).
+
+.. _fig-packages-package_menu:
+
+.. figure:: figures/packages/package_menu.png
+   :align: center
+   :width: 5in
+
+   Packages can integrate their own commands into the main |vistrails| menu.
+
+This is done by adding a function named ``menu_items`` to your main package file. This function takes no parameters, and should return a tuple of pairs for each new menu item to be added. The first element of each pair is the label of the menu item as it should appear in the GUI. The second element of the pair is the name of the callback function to be invoked when the user selects that menu item. 
+
+As an example, we include below the implementation of ``menu_items`` from the |vistrails| Spreadsheet package:
+
+.. code-block:: python
+   :linenos:
+
+   def menu_items():
+       """menu_items() -> tuple of (str,function)
+       It returns a list of pairs containing text for the menu and a
+       callback function that will be executed when that menu item is selected.    
+       """
+
+       def show_spreadsheet():
+           spreadsheetWindow.show()
+       lst = []
+       lst.append(("Show Spreadsheet", show_spreadsheet))
+       return tuple(lst)
+
+.. .. parsed-literal::
+
+   def menu_items():
+       """menu_items() -> tuple of (str,function)
+       It returns a list of pairs containing text for the menu and a
+       callback function that will be executed when that menu item is selected.    
+       """
+
+       def show_spreadsheet():
+           spreadsheetWindow.show()
+       lst = []
+       :red:`lst.append(("Show Spreadsheet", show_spreadsheet))` 
+       return tuple(lst)
+
+Writing your own ``menu_items`` function is straightforward; simply use the provided example as a basis, and substitute labels and callback functions as appropriate for your specific module. Although the Spreadsheet package currently only implements one new menu option, you are free to add as many as you see fit; just append additional pairs to the list (see Line 10 of the example code) before the function returns.
+
+The ``Packages`` menu is organized hierarchically, as illustrated in Figure :ref:`Packages can integrate their own commands... <fig-packages-package_menu>`. Each package that contributes a ``menu_items`` function will receive an entry in the ``Packages`` menu. The actual menu items for each package will appear in a submenu.
+
+.. _sec-interpackage_dependencies:
+
+Interpackage Dependencies
+=========================
+
+.. index::
+   pair: packages; dependencies
+
+When creating more sophisticated VisTrails packages, you might want to
+create a new module that requires a module *from another package*. For example, using modules from different packages as
+input ports, or even subclassing modules from other packages, require
+management of interpackage dependencies. VisTrails needs to know about
+these so that packages can be initialized in the correct order. To specify these dependencies, you should add a function named
+``package_dependencies`` to your package. This function should return a list containing the identifier strings of the required packages.
+
+As an example of this function's usage, let's take a look at a (simplified) code segment from the VTK package, which is included in the standard |vistrails| distribution:
+
+.. code-block:: python
+   :linenos:
+
+   def package_dependencies():
+       return ['org.vistrails.vistrails.spreadsheet']
+
+
+As you can see, the ``package_dependencies`` function is quite straightforward; it simply returns a list of the identifiers for the packages required by the VTK package. In this case, the list contains just a single string, as the |vistrails| Spreadsheet is the only package dependency for the VTK package.
+
+The simple approach taken by the above code works well for the majority of cases, but in practice you may want to add some error-checking to your ``package_dependencies`` function. This allows |vistrails| to recover gracefully in the unlikely event that the Spreadsheet package is missing. Below is the complete ``package_dependencies`` function for the VTK package:
+
+.. code-block:: python
+   :linenos:
+
+   def package_dependencies():
+       import core.packagemanager
+       manager = core.packagemanager.get_package_manager()
+       if manager.has_package('org.vistrails.vistrails.spreadsheet'):
+           return ['org.vistrails.vistrails.spreadsheet']
+       else:
+           return []
+
+
+The above code segment also demonstrates the |vistrails| API function ``has_package`` which simply verifies that a given package exists in the system.
+
+Package Requirements
+====================
+
+In Section :ref:`sec-interpackage_dependencies`\ , we saw how packages can depend on other packages. However, some packages may also depend on the presence of external libraries (in the form of Python modules) or executable files in order to run correctly.
+
+Required Python Modules
+^^^^^^^^^^^^^^^^^^^^^^^
+
+To check for the presence of a required Python module, you should add a function named ``package_requirements`` to your package. This function need not return any value; however it may raise exceptions or output error messages as necessary.
+Here is an example of the syntax of the ``package_requirements`` function, taken from the |vistrails| VTK package:
+
+.. code-block:: python
+   :linenos:
+
+   def package_requirements():
+       import core.requirements
+       if not core.requirements.python_module_exists('vtk'):
+           raise core.requirements.MissingRequirement('vtk')
+       if not core.requirements.python_module_exists('PyQt4'):
+           print 'PyQt4 is not available. There will be no interaction',
+           print 'between VTK and the spreadsheet.'
+       import vtk
+
+
+A key element of ``package_requirements`` is the use of the function ``python_module_exists``  (see Lines 3 and 5), which checks whether a given module has been installed in your local Python system.
+
+
+Automatically Installing Python Modules
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A more advanced method is to attempt to install a python module
+automatically using a system package manager. This method currently
+works for apt- and rpm-based systems.  By using
+``core.bundles.py_import``, you can attempt to automatically install a
+system dependency, all you need to specify is the python module name
+and the name of the package that contains it.  The following example
+can be put in your ``init.py`` file, with the desired module and
+package names changed:
+
+.. code-block:: python
+   :linenos:
+
+    from core.bundles import py_import
+    from core import debug
+    try:
+        pkg_dict = {'linux-ubuntu': 'your-apt-package',
+                    'linux-fedora': 'your-deb-package'}
+        your-py-module = py_import('your-py-module', pkg_dict)
+    except Exception, e:
+        debug.critical("Exception: %s" % e)
+
+Note that, if you use this method, you should not specify it in the
+``package_requirements``, because that would block the install attempt.
+
+Required Executables
+^^^^^^^^^^^^^^^^^^^^
+
+As explained in Section :ref:`sec-wrapping_cmdline_tools`, a common motivation for writing new |vistrails| modules is to wrap existing command-line tools. To this end, the |vistrails| API provides a function called ``executable_file_exists`` which checks for the presence of specific executables on the path.
+
+Here is an example of its usage, taken from the ``initialize`` function of the ``ImageMagick`` package. This package is included in the standard |vistrails| distribution. The following code snippet checks to see if ``convert``, a command-line program associated with the *ImageMagick* suite of graphics utilities, is on the path.
+
+.. code-block:: python
+   :linenos:
+
+   import core.requirements
+
+   ...
+
+       if (not core.requirements.executable_file_exists('convert')):
+           raise core.requirements.MissingRequirement("ImageMagick suite")
+
+Note that this function is not strictly required in order to wrap third party executables into a module. Using a ``Configuration`` object (see Section :ref:`sec-pkg_config`) that lets the user specify the path to an executable may be a cleaner solution.
+
+For additional information or examples of any of the functions described above, please refer to the |vistrails| source code or contact the |vistrails| development team.
+
+Interaction with Caching
+========================
+
+.. index::
+   pair: modules; caching
+
+VisTrails provides a caching mechanism, in which portions of pipelines that are common across different executions are automatically shared. However, some modules should not be shared. Caching control is therefore up to the package developer. By default, caching is enabled. So a developer that doesn't want caching to apply must make small changes to the module.  For example, look at the StandardOutput module:
+
+.. code-block:: python
+
+   from core.modules.vistrails_module import Module, newModule, \
+       NotCacheable, ModuleError
+   (...)
+   class StandardOutput(NotCacheable, Module):
+       """StandardOutput is a VisTrails Module that simply prints the
+       value connected on its port to standard output. It is intended
+       mostly as a debugging device."""
+    
+       def compute(self):
+           v = self.getInputFromPort("value")
+           print v
+
+By subclassing from ``NotCacheable`` and ``Module`` (or one of its subclasses), we are telling VisTrails not to cache this module, or anything downstream from it.
+
+VisTrails also allows a more sophisticated decision on whether or not to use caching. To do that, a user simply overrides the method ``is_cacheable`` to return the appropriate value (the default implementation returns ``True``).  For example, in the `teem <http://teem.sourceforge.net/>` package, there's a module that generates a scalar field with random numbers. This is non-deterministic, so shouldn't be cached. However, this module only generates non-deterministic values in special occa [...]
+
+.. code-block:: python
+
+   class Unu1op(Unu):
+   (...)
+       def is_cacheable(self):
+           return not self.getInputFromPort('op') in ['rand', 'nrand']
+   (...)
+
+Notice that the module explicitly uses inputs to decide whether it should be cached. This allows reasonably fine-grained control over the process.
+
+Customizing Modules and Ports
+=============================
+
+.. index:: 
+   pair: Module registry; ``-output_ports``
+   pair: Module registry; ``_input_ports``
+   pair: Module registry; ``_modules``
+
+Here we will explore the options for registry initialization of modules and ports which was introduced in Section :ref:`sec-packages-simple_example`.  There is a new syntax for specifying modules in packages:
+
+.. code-block:: python
+   :linenos:
+
+   _modules = [MyModule1, (MyModule2, {'option_name' : 'value'})]
+
+Observe that ``_modules`` is assigned a list of modules to be registered, and module options can be provided as keyword arguments by specifying a tuple (class, kwargs).  Similarly, ports are defined by providing a list of tuples of the form (portName, portSignature, optional=False, sort_key=-1).  For example:
+
+.. code-block:: python
+   :linenos:
+
+   class MyModule(Module):
+       def compute(self):
+          pass
+
+       _input_ports = [('firstInput', String), ('secondInput', Integer, True)]
+       _output_ports = [('firstOutput', String), ('secondOutput', String)]
+
+.. index::
+   pair: port; shortcut
+
+Notice that "String" and "Integer" were used for the portSignature instead of ``org.vistrails.vistrails.basic:String`` and ``org.vistrails.vistrails.basic:Integer``.  That is because the current package, ``org.vistrails.vistrails.basic`` is used by default.
+
+.. topic:: Note
+
+   The old syntax (reg.add_module(...), reg.add_input_port(...), and reg.add_output_port(...)) is still supported.
+
+Configuring Modules
+^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: packages; modules
+   pair: modules; visibility
+   pair: modules; namespaces
+
+**Hierarchy and Visibility** There are a few options that assist in the organization and display of modules: ``namespace``,  ``abstract``, and ``hide_descriptor``.  The ``namespace`` option can be used to define a hierarchy in the module palette, which hierarchies can be nested through the use of the '|' character.  For example:
+
+.. code-block:: python
+   :linenos:
+
+   _modules = [MyModule1, (MyModule2, {'namespace': 'MyNamespace'})]
+    or
+   _modules = [MyModule1, (MyModule2, {'namespace': 'ParentNamespace|\
+               ChildNamespace'})]
+
+The other options, ``abstract`` and ``hide_descriptor`` can be used to prevent modules from appearing in the module palette.  ``Abstract`` is for use with modules that should never be instantiated in the workflow and will not add the item to the module palette.  On the other hand, ``hide-descriptor`` will add the item to the palette, but hides it.  This will prevent users from adding the module to a pipeline, but allow code to add it programmatically.  To use either of these options, ``a [...]
+
+.. code-block:: python
+   :linenos:
+
+   _modules = [AnotherModule, (InvisibleModule, {'abstract': True})]
+    or
+   _modules = [AnotherModule, (InvisibleModule, {'hide-descriptor': True})]
+
+.. index::
+   pair: modules; shape
+   pair: modules; color
+
+**Defining Module Shapes and Colors**  VisTrails allows users to define custom colors and shapes to modules. This must be done at module registration time, by using the ``moduleColor`` and ``moduleFringe`` options. For example:
+
+.. code-block:: python
+
+   _modules = [(Afront, {'moduleColor' : (1.0, 0.0, 0.0), 
+                         'moduleFringe' : [(0.0, 0.0),
+                                           (0.2, 0.0),
+                                           (0.2, 0.4),
+                                           (0.0, 0.4),
+                                           (0.0, 1.0)]})]
+  
+.. reg.addModule(Afront,
+                 moduleColor=(1.0,0.0,0.0),
+                 moduleFringe=[(0.0, 0.0),
+                               (0.2, 0.0),
+                               (0.2, 0.4),
+                               (0.0, 0.4),
+                               (0.0, 1.0)])
+
+gives:
+
+.. figure:: figures/packages/CustomColorShape1.png
+   :align: center
+   :width: 2in
+
+and
+
+.. code-block:: python
+
+   _modules = [(Afront, {'moduleColor': (0.4,0.6,0.8),
+                         'moduleFringe' : [(0.0, 0.0),
+                                           (0.2, 0.0),
+                                           (0.0, 0.2),
+                                           (0.2, 0.4),
+                                           (0.0, 0.6),
+                                           (0.2, 0.8),
+                                           (0.0, 1.0)]})]
+
+..   reg = core.modules.module_registry
+..   reg.addModule(Afront,
+                 moduleColor=(0.4,0.6,0.8),
+                 moduleFringe=[(0.0, 0.0),
+                               (0.2, 0.0),
+                               (0.0, 0.2),
+                               (0.2, 0.4),
+                               (0.0, 0.6),
+                               (0.2, 0.8),
+                               (0.0, 1.0)])
+
+gives:
+
+.. figure:: figures/packages/CustomColorShape2.png
+   :align: center
+   :width: 2in
+
+The moduleColor parameter must be a tuple of three floats between 0 and 1 that specify RGB colors for the module background, while moduleFringe is a list of pairs of floats that specify points as they go around a side of the module (the same one is used to go from the top-right corner to bottom-right corner, and from the bottom-left corner to the top-left one. If this is not enough, let the developers know!)
+
+Alternatively, you can use different fringes for the left and right borders:
+
+.. code-block:: python
+
+   _modules = [(Afront, {'moduleColor': (1.0,0.8,0.6),
+                         'moduleLeftFringe' : [(0.0, 0.0),
+                                               (-0.2, 0.0),
+                                               (0.0, 1.0)],
+                         'moduleRightFringe' : [(0.0, 0.0),
+                                                (0.2, 1.0),
+                                                (0.0, 1.0)]})]
+
+
+..   reg.addModule(Afront,
+                 moduleColor=(1.0,0.8,0.6),
+                 moduleLeftFringe=[(0.0, 0.0),
+                                   (-0.2, 0.0),
+                                   (0.0, 1.0)],
+                 moduleRightFringe=[(0.0, 0.0),
+                                    (0.2, 1.0),
+                                    (0.0, 1.0)])
+
+.. figure:: figures/packages/CustomColorShape3.png
+   :align: center
+   :width: 2in
+
+Configuring Ports
+^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: packages; ports
+   pair: ports; default values
+   pair: ports; labels
+
+**Default Values and Labels** In versions 1.4 and greater, package developers can add labels and default values for parameters. To add this functionality, you need to use the defaults and labels keyword arguments and pass the values as strings. For example,
+
+.. code-block:: python
+   :linenos:
+
+   class TestDefaults(Module):
+      _input_ports = [('f1', '(org.vistrails.vistrails.basic:Float,\
+                               org.vistrails.vistrails.basic:String)',
+                       {"defaults": str([1.23, "abc"]), 
+                        "labels": str(["temp", "name"])})]
+   _modules = [TestDefaults]
+
+or in the older syntax,
+
+.. code-block:: python
+   :linenos:
+
+   def initialize():
+     reg = core.modules.module_registry.get_module_registry()
+     reg.add_module(TestDefaults)
+     reg.add_input_port(TestDefaults, "f1", [Float, String], 
+                        defaults=str([1.23, "abc"]), 
+                        labels=str(["temp", "name"]))
+
+.. index::
+   pair: ports; optional
+
+**Making a Port Optional**  To add a port that is optional, set the optional flag to true:
+
+.. code-block:: python
+   :linenos:
+
+   _input_ports = [('MyPort', '(org.vistrails.vistrails.basic:String)',
+                       {"optional": True})]
+
+   reg.add_input_port(MyModule, "MyPort", 
+                      "(org.vistrails.vistrails.basic:String)", 
+                      optional=True)
+
+
+.. index::
+   pair: ports; multiple inputs
+
+**Multiple Inputs** For compatibility reasons, we do need to allow multiple connections to an input port. However, most package developers should never have to use this, and so we do our best to hide it. the default behavior for getting inputs from a port, then, is to always return a single input.
+
+If on your module you need multiple inputs connected to a single port, use the 'forceGetInputListFromPort' method. It will return a list of all the data items coming through the port. The spreadsheet package uses this feature, so look there for usage examples (vistrails/packages/spreadsheet/basic_widgets.py)
+
+.. index::
+   pair: ports; port types
+
+**Port Types** To define ports to be of types that are not imported into the package, pass and identifier string as the portSignature:
+
+.. code-block:: python
+   :linenos:
+
+   <module_string> := <package_identifier>:[<namespace>|]<module_name>,
+   <port_signature> := (<module_string>*)
+
+For example,
+
+.. code-block:: python
+
+   registry.add_input_port(MyModule, 'myInputPort', \
+                           '(org.vistrails.vistrails.basic:String)')
+
+or
+
+.. code-block:: python
+
+   _input_ports = [('myInputPort', '(org.vistrails.vistrails.basic:String)')]
+
+.. index::
+   pair: ports; input dependency
+
+**Varying Output According to the Input** There are a few ways to tackle this - each has it's own benefits and pitfalls. Firstly, module connections do respect class hierarchies as we're familiar with in object oriented languages. For instance, A module can output a Constant of which String, Float, Integer, etc are specifications. In this way, you can have a subclass of something like MyData be passed out of the module and the connections will be established regardless of the sub-type. T [...]
+
+A second method that is employed in several different packages is the idea of a container class. For instance, the NumSciPy package uses a relatively generic container "Numpy Array" to encapsulate the data. Of course, these encapsulating objects can store dictionaries that other modules can easily access and understand how to operate on. Although this method is slightly more work, the benefits of a stricter typing of ports is beneficial - particularly upon interfacing with other packages [...]
+
+.. index::
+   pair: ports; module connectivity
+
+**Determining Whether or Not a Module is Attached to an Output Port** The outputPorts dictionary of the base Module stores connection information. Thus, you should be able to check
+
+``("myPortName" in self.outputPorts)``
+
+on the parent module to check if there are any downstream connections from the port "myPortName". This might be used, for example, to only set results for output ports that will be used. **Note**, however, that the caching algorithm assumes that all outputs are set so adding a new connection to a previously unconnected output port will not work as desired if that module is cached. For this reason, I would currently recommend making such a module not cacheable. Another possibility is over [...]
+
+.. code-block:: python
+   :linenos:
+
+   class TestModule(Module):
+       _output_ports = [('a1', '(org.vistrails.vistrails.basic:String)'),
+                        ('a2', '(org.vistrails.vistrails.basic:String)')]
+       def __init__(self):
+           Module.__init__(self)
+           self._cached_output_ports = set()
+    
+       def update(self):
+           if len(set(self.outputPorts) - self._cached_output_ports) > 0:
+               self.upToDate = False
+           Module.update(self)
+    
+       def compute(self):
+           if "a1" in self.outputPorts:
+               self.setResult("a1", "test")
+           if "a2" in self.outputPorts:
+               self.setResult("a2", "test2")
+           self._cached_output_ports = set(self.outputPorts)
+
+Generating Modules Dynamically
+==============================
+
+.. index::
+  pair: modules; dynamic
+
+When wrapping existing libraries or trying to generate modules in a more procedural manner, it is useful to dynamically generate modules. In our work, we have created some shortcuts to make this easier. In addition, the list of modules can also be based on the package configuration. Here is some example code:
+
+**__init__.py**
+
+.. code-block:: python
+   :linenos:
+
+   from core.configuration import ConfigurationObject
+ 
+   identifier = "org.vistrails.dakoop.auto_example"
+   version = "0.0.1"
+   name = "AutoExample"
+ 
+   configuration = ConfigurationObject(use_b=True)
+
+**init.py**
+
+The expand_ports and build_modules methods are functions to help the construction of the modules easier. The key parts are the new_module call and setting the _modules variable.
+
+.. code-block:: python
+   :linenos:
+
+   from core.modules.vistrails_module import new_module, Module
+ 
+   identifier = "org.vistrails.dakoop.auto_example"
+ 
+   def expand_ports(port_list):
+       new_port_list = []
+       for port in port_list:
+           port_spec = port[1]
+           if type(port_spec) == str: # or unicode...
+               if port_spec.startswith('('):
+                   port_spec = port_spec[1:]
+               if port_spec.endswith(')'):
+                   port_spec = port_spec[:-1]
+               new_spec_list = []
+               for spec in port_spec.split(','):
+                   spec = spec.strip()
+                   parts = spec.split(':', 1)
+                   print 'parts:', parts
+                   namespace = None
+                   if len(parts) > 1:
+                       mod_parts = parts[1].rsplit('|', 1)
+                       if len(mod_parts) > 1:
+                           namespace, module_name = mod_parts
+                       else:
+                           module_name = parts[1]
+                       if len(parts[0].split('.')) == 1:
+                           id_str = 'org.vistrails.vistrails.' + parts[0]
+                       else:
+                           id_str = parts[0]
+                   else:
+                       mod_parts = spec.rsplit('|', 1)
+                       if len(mod_parts) > 1:
+                           namespace, module_name = mod_parts
+                       else:
+                           module_name = spec
+                       id_str = identifier
+                   if namespace:
+                       new_spec_list.append(id_str + ':' + module_name + \
+                                            ':' + namespace)
+                   else:
+                       new_spec_list.append(id_str + ':' + module_name)
+               port_spec = '(' + ','.join(new_spec_list) + ')'
+           new_port_list.append((port[0], port_spec) + port[2:])
+       print new_port_list
+       return new_port_list
+ 
+   def build_modules(module_descs):
+       new_classes = {}
+       for m_name, m_dict in module_descs:
+           m_doc = m_dict.get("_doc", None)
+           m_inputs = m_dict.get("_inputs", [])
+           m_outputs = m_dict.get("_outputs", [])
+           if "_inputs" in m_dict:
+               del m_dict["_inputs"]
+           if "_outputs" in m_dict:
+               del m_dict["_outputs"]
+           if "_doc" in m_dict:
+               del m_dict["_doc"]
+           klass_dict = {}
+           if "_compute" in m_dict:
+               klass_dict["compute"] = m_dict["_compute"]
+               del m_dict["_compute"]
+           m_class = new_module(Module, m_name, klass_dict, m_doc)
+           m_class._input_ports = expand_ports(m_inputs)
+           m_class._output_ports = expand_ports(m_outputs)
+           new_classes[m_name] = (m_class, m_dict)
+       return new_classes.values()
+ 
+   def initialize():
+       global _modules
+       def a_compute(self):
+           a = self.getInputFromPort("a")
+           i = 0
+           if self.hasInputFromPort("i"):
+               i = self.getInputFromPort("i")
+           if a == "abc":
+               i += 100
+           self.setResult("b", i)
+ 
+       module_descs = [("ModuleA", {"_inputs": [("a", "basic:String")],
+                                    "_outputs": [("b", "basic:Integer")],
+                                    "_doc": "ModuleA documentation",
+                                    "_compute": a_compute,
+                                    "namespace": "Test"}),
+                       ("ModuleB", {"_inputs": [("a", "Test|ModuleA")],
+                                    "_outputs": [("b", "Test|ModuleA")],
+                                    "_doc": "ModuleB documentation"})
+                     ]
+ 
+       if configuration.use_b:
+           _modules = build_modules(module_descs)
+       else:
+           _modules = build_modules(module_descs[:1])
+ 
+   _modules = []
+
+For System Administrators
+=========================
+Most users will want to put their custom packages in their
+
+ :math:`\sim`\ ``/.vistrails/userpackages``
+
+directory, as described in Section :ref:`sec-packages-simple_example`. This makes the package available to the current user only. However, if you are a power user or a system administrator, you may wish to make certain packages available to all users of a |vistrails| installation. To do this, copy the appropriate package files and/or directories to the
+
+ ``vistrails/packages``
+
+directory of the |vistrails| distribution.
+The packages will be made visible to users the next time they launch |vistrails|.
+
+.. %Advanced: Wrapping a big API
+.. ============================
+.. %In the future, there will be a walkthrough of the VTK package wrapping mechanism. 
+
+.. rubric:: Footnotes
+.. [#] This package is not included in binary distributions of |vistrails|, but is available in the source code distribution. The stand-alone ``Afront`` utility is available at http://afront.sourceforge.net.
+.. [#] Programmers who are more comfortable with single-inheritance languages like Java and C# may be unfamiliar with mixins. A mixin class is similar to an *interface* in Java or C#, except that a mixin provides an implementation as well. Python's support for multiple inheritance allows subclasses to "import" functionality as needed from a mixin class, without artificially cluttering the base class's interface.
diff --git a/doc/usersguide/parallelflow.rst b/doc/usersguide/parallelflow.rst
new file mode 100644
index 0000000..d9d33b0
--- /dev/null
+++ b/doc/usersguide/parallelflow.rst
@@ -0,0 +1,71 @@
+.. _chap-parallelflow:
+
+**************************
+Parallel Flow in VisTrails
+**************************
+
+When dealing with large datasets, the ability to leverage multiple cores or
+machines allows to speed up workflow execution time.  VisTrails provides
+support for parallelization of tasks using IPython_.
+
+.. _IPython: http://ipython.org/
+
+Setting up an IPython cluster
+=============================
+
+This package uses the standard IPython.parallel machinery to execute jobs. You
+will need to create and configure the IPython profile that you want |vistrails|
+to use.
+
+|vistrails| is capable of running the ``ipcontroller`` and ``ipengine``
+commands for you to start a controller or a set of engines locally, but for
+more complex setups, you can run ``ipcluster`` yourself from a terminal with
+the necessary options.
+
+Interacting with the cluster
+============================
+
+In the ``Packages/Parallel Flow`` menu, you will find the following options:
+
+Start new engine processes
+    Use ``ipengine`` to start multiple new workers on the machine, using the
+    current IPython profile. These processes will be shutdown on exit, unless
+    detached using Cleanup
+
+Show information on the cluster
+    Indicates whether we are connected to an IPython controller, the number of
+    engines in the cluster, and which processes were started locally. Lists
+    some basic information on each engine.
+
+Change profile
+    Selects a different IPython profile. Performs cleanup first if a cluster
+    was connected.
+
+Cleanup started processes
+    Disconnects from the cluster and "forgets" the processes that were started
+    from |vistrails|. It is either possible to terminate them, or to leave them
+    running in the background (for example, to be reuse by the next |vistrails|
+    session).
+
+Request cluster shutdown
+    Sends the shutdown signal to the controller, regardless of whether it was
+    started locally or not. If accepted, the controller will ask every
+    connected engine to terminate and exit.
+
+Note that when VisTrails is exited, it will shutdown the engines that it
+started. If it started the controller, it will also be shutdown, along with
+every engine that might have connected to it from other machines. To prevent
+that, use the 'cleanup' button and choose not to stop them; they will detach
+from VisTrails and won't be killed automatically. You will still be able to use
+the 'cluster shutdown' button explicitely.
+
+The ``Map`` module
+==================
+
+``Map`` allows you to execute a single module or a ``Group`` in parallel using
+input values taken from a list. It works in exactly the same way as the regular
+``Map`` module from the :ref:`Control Flow <chap-controlflow>` package.
+
+Contrary to the standard ``Map`` module, the elements of the list will be
+submitted to the IPython controller which will execute them in a load-balanced
+manner on the engines currently connected.
diff --git a/doc/usersguide/parallelization.rst b/doc/usersguide/parallelization.rst
new file mode 100644
index 0000000..0bd840c
--- /dev/null
+++ b/doc/usersguide/parallelization.rst
@@ -0,0 +1,56 @@
+.. _chap-parallelization:
+
+******************************************
+Using parallelization in VisTrails modules
+******************************************
+
+This chapters presents different techniques for using parallelization inside
+the code of your |vistrails| modules.
+
+Threading
+=========
+
+|vistrails| is single-threaded: the modules are executed one after the other,
+and while you are free to use threads in your module's ``compute()`` method,
+you should not interact with |vistrails| from other threads.
+
+Note that because of the restrictions of the CPython interpreter, you might not
+improve performance by using this type of parallelization: the interpreter has
+a lock, preventing two threads from executing Python code at the same time. If
+you are not already, consider using packages such as NumPy_ which provides
+efficient numerical functions implemented in C (and parallelizable).
+
+.. _NumPy: http://www.numpy.org/
+
+Multiprocessing
+===============
+
+Use of the ``multiprocessing`` package introduced with Python 2.6 is possible
+in |vistrails|. This is generally the preferred way of performing multiple
+computational tasks in parallel in Python, and will effectively leverage
+multiple cores; please refer to the `official documentation
+<http://docs.python.org/2/library/multiprocessing.html>`_ for more details.
+
+IPython
+=======
+
+You can access IPython clusters through the :ref:`Parallel Flow
+<chap-parallelflow>` package, via the provided API. Simply declare it in your
+package's dependencies, and import ``vistrails.packages.parallelflow.api``.
+This module provides the following:
+
+``get_client(ask=True) -> IPython.parallel.Client or None``
+    Low-level function giving you a Client connected to the cluster, or None.
+    If not connected to a cluster or if no engines are available, the ``ask``
+    parameter controllers whether to offer the user to take automatic action.
+
+``direct_view(ask=True) -> IPython.parallel.DirectView or None``
+    Gives you a view on the engines of the cluster, which you can use to submit
+    tasks. This is currently equivalent to calling ``get_client()[:]``.
+
+    You should probably use ``load_balanced_view()`` instead.
+
+``load_balanced_view(ask=True) -> IPython.parallel.LoadBalancedView or None``
+    Gives you a load-balanced view on the engines of the cluster, which you can *
+    use to submit tasks. It is the preferred way of submitting tasks. This is
+    currently equivalent to calling ``get_client().load_balanced_view()``.
diff --git a/doc/usersguide/parameter_exploration.rst b/doc/usersguide/parameter_exploration.rst
new file mode 100644
index 0000000..82b64f0
--- /dev/null
+++ b/doc/usersguide/parameter_exploration.rst
@@ -0,0 +1,315 @@
+.. _chap-paramexploration:
+
+***********************
+Parameter Exploration
+***********************
+
+.. index::
+   single: parameter exploration
+   pair: parameters; exploring
+
+.. index{parameters!exploring|see{parameter exploration}}
+
+.. %README: This chapter contains a lot of figures. Despite LaTeX's best
+.. %efforts to make the figures and the text "play nice" together, I had
+.. %to insert a few manual pagebreaks to make the layout more smooth.
+.. %Feel free to remove or move them when this chapter gets revised again.
+.. %(draperg 29may2008)
+
+While exploring workflows, one critical task is tweaking parameter
+values to improve simulations or visualizations.  |vistrails| contains
+an integrated parameter exploration interface that lets you
+thoroughly explore the parameter space and quickly identify the
+desired settings.  By binding parameters to a range of values, you
+can generate a collection of results without having to tediously edit
+the workflow.
+
+.. index:: 
+   pair: parameter exploration; spreadsheet
+   pair: spreadsheet; parameter exploration
+   single: animation
+
+|vistrails| Parameter Exploration is Spreadsheet-aware, so you can map the
+intermediate results from explorations into cells of the Spreadsheet.
+Because the Spreadsheet provides a multi-view interface that
+makes efficient use of screen space, you can quickly compare the
+results of different parameter settings.  The changes in parameters
+can be displayed across rows, columns, and sheets.  In addition, parameters can be explored across timesteps, and then displayed in the Spreadsheet as animations.  This could be used, for example, to show how pathological tissues and tumors are affected by radiation treatment in a series of scans.
+
+Creating a Parameter Exploration
+================================
+
+To access |vistrails| Parameter Exploration for the currently-active workflow, click
+on the ``Exploration`` button in the |vistrails| toolbar.
+
+The ``Parameter Exploration`` view starts out with a blank central canvas wherein
+exploration parameters can be set up.  On the right side of
+the window, there are a variety of panels that control aspects of the
+exploration.
+
+The ``Set Methods`` panel contains the list of parameters that can
+be explored, the ``Annotated Pipeline`` panel displays
+the workflow to be explored and helps resolve ambiguities for parameter
+settings, and the ``Spreadsheet Virtual Cell`` aids users in
+laying out exploration results in the spreadsheet.
+
+.. %(shown in Figure :ref:`fig-fig6_1})
+.. %(See Figure :ref:`fig-paramexp-panels` for a close-up view of each of these panels.)
+.. %.. figure::[h]
+.. %   :align: center
+.. %   :width=0.7\linewidth,clip=false]{fig6_1.png}}
+.. %   Parameter Exploration View}
+.. %.. _fig-fig6_1}
+.. %  
+
+.. index::
+   pair: parameter exploration; adding parameters
+
+To add parameters to
+an exploration, simply drag the corresponding method from the
+``Set Methods`` panel to the center canvas.  To reduce
+clutter, this panel only shows the methods for which parameters were
+assigned values in the ``Pipeline`` view.  See
+Chapter :ref:`chap-creating` for instructions on adding methods and
+parameters to a module.
+
+.. index::
+   pair: parameter exploration; setting values
+
+After dragging a method to the exploration canvas, you can, for each parameter, set the
+collection of values to be explored and the direction in which to
+explore (Figure :ref:`Setting values for parameter exploration <fig-paramexp-adding>`).
+By default, intermediate parameter values are set via linear interpolation. We will discuss other options later. 
+
+.. _fig-paramexp-adding:
+
+.. figure:: figures/parameter_exploration/fig6_6.png
+   :align: center
+   :width: 6in
+
+   Setting values for parameter exploration.
+
+.. index::
+   pair: parameter exploration; running
+   pair: parameter exploration; directions
+
+The five column headings in the upper-right corner of the
+main canvas control how the results of the parameter exploration will be displayed in the Spreadsheet. From left to right, the five controls determine:
+
+.. |dirx| image:: figures/parameter_exploration/direction_button_x.png
+   :width: 0.5in
+
+.. |diry| image:: figures/parameter_exploration/direction_button_y.png
+   :width: 0.5in
+
+.. |dirz| image:: figures/parameter_exploration/direction_button_z.png
+   :width: 0.5in
+
+.. |dirtime| image:: figures/parameter_exploration/direction_button_time.png
+   :width: 0.5in
+
+.. |dirno| image:: figures/parameter_exploration/direction_button_no.png
+   :width: 0.5in
+
++-------------+----------------------------------+
+|   |dirx|    | exploration in the 'x' direction |
++-------------+----------------------------------+
+|   |diry|    | exploration in the 'y' direction |
++-------------+----------------------------------+
+|   |dirz|    | exploration in the 'z' direction |
++-------------+----------------------------------+
+|  |dirtime|  | exploration in time              |
++-------------+----------------------------------+
+|   |dirno|   | none; do not vary this parameter |
++-------------+----------------------------------+ 
+
+The spinner beneath each
+of these icons lets you control the number of parameter values to be explored in that direction. For each parameter, you must select one of
+the radio buttons corresponding to a direction of exploration ('x', 'y', 'z', time, or none).   Note that choosing the final column disables
+exploration for that parameter.
+
+
+To run a parameter exploration,
+click the ``Execute`` button in the |vistrails| toolbar or
+select ``Execute`` from the ``Workflow`` menu.
+
+We now reinforce the above discussion with three examples, motivated by the problem of finding isosurfaces for medical imaging.  In the examples that follow, we'll look at determining the interfaces between different types of tissue captured by CT scans.  
+
+.. topic:: Try it now!
+
+   To begin, load the :vtl:`terminator.vt` vistrail, select the "Isosurface" node in the version tree, and switch to parameter exploration.  From the ``Pipeline Methods`` panel, click and drag the ``SetValue`` method of the ``vtkContourFilter`` module to the center canvas.
+
+   We'd like to compare different values for the isosurfaces so change the start and end values of the "Float" parameter to "30" and "75".  Since side-by-side visualization will look better on most monitors, select the radio button below the 'x' dimension control, and increase the value of the control to 2 (see Figure :ref:`Setting values for parameter exploration <fig-paramexp-adding>`). Execute the exploration and switch to the Spreadsheet to view the results.  They should match Figure [...]
+
+.. _fig-paramexp-terminator2:
+
+.. figure:: /figures/parameter_exploration/fig6_7.png
+   :align: center
+   :height: 2.2in
+
+   Parameter Exploration of two isovalues as displayed in the Spreadsheet.
+
+.. topic:: Next Step!
+
+   While these two isovalues show interesting features, we may wish to examine other intermediate isosurfaces.  To do so, switch back to the main |vistrails| window and increase the number of results to generate in the 'x' direction to four.  |vistrails| will calculate the intermediate values via linear interpolation, and your execution of this new exploration should match Figure :ref:`Parameter Exploration of four isovalues... <fig-paramexp-terminator4>`. :vtl:`(Open result) <pe2.vt>`
+
+.. _fig-paramexp-terminator4:
+
+.. figure:: /figures/parameter_exploration/fig6_8.png
+   :align: center
+   :height: 2.2in
+
+   Parameter Exploration of four isovalues as displayed in the Spreadsheet.
+
+In our next example, we demonstrate how multiple parameter values can be explored simultaneously. We will use both ``X`` and ``Y`` exploration directions to change the values of two parameters at the same time in the same spreadsheet.
+
+.. topic:: Try it now!
+
+   In the :vtl:`terminator.vt` example vistrail, make sure you're working with the "Isosurface" version of the workflow, then go to the ``Pipeline`` view. Add the module ``vtkImageResample`` to the pipeline, and insert it between ``vtkStructuredPointsReader`` and ``vtkContourFilter``, connecting the output of the reader to input of the resampler and the output of the resampler to the input of the contour filter as shown in Figure :ref:`Inserting a vtkImageResample module... <fig-paramexp [...]
+   After modifying the workflow, switch back to the ``Exploration`` view. Inside the ``Set Methods`` panel, select the ``SetValue`` method from the ``vtkContourFilter`` module, and drag it to the center canvas.  Also select the ``SetAxisMagnificationFactor`` method from the ``vtkImageResample`` module and drag it to the canvas. Set the values as in the previous example, and set the range of the "Float" parameter of "SetAxisMagnificationFactor" to start at 0.2 and end at 1.0.  Also, set t [...]
+
+.. _fig-paramexp-vtk_image_resample:
+
+.. figure:: figures/parameter_exploration/vtkImageResample.png
+   :align: center
+   :width: 2in
+
+   Inserting a ``vtkImageResample`` module into the "terminator.vt" example pipeline.
+
+.. _fig-fig6_9:
+
+.. figure:: figures/parameter_exploration/fig6_9.png
+   :align: center 
+   :width: 70%
+
+   Setting up parameter exploration.
+
+.. _fig-fig6_10:
+
+.. figure:: figures/parameter_exploration/fig6_10.png
+   :align: center
+   :width: 70%
+
+   Resulting spreadsheet.
+
+   Using parameter exploration with two parameters.
+
+Our third example shows how to create an animation by exploring parameter values in *time*, rather than in 'X' or 'Y'.
+
+.. index:: animation
+
+.. topic:: Try it now!
+
+   To create an animation, we'll use the same :vtl:`terminator <terminator.vt>` example (make sure that you have the "Isosurface" version selected).  Follow the same steps as in the first example, but this time, use the range from 30 to 80 and select "time" as the dimension to explore, setting the number of results to generate to 7.  See Figure :ref:`Setting up parameter exploration <fig-fig6_11>` to check your settings.  After executing, the Spreadsheet will show a *single* cell, but if [...]
+
+.. _fig-fig6_11:
+
+.. figure:: figures/parameter_exploration/fig6_11.png
+   :align: center
+   :width: 5.99in
+
+   Setting up parameter exploration.
+
+.. _fig-fig6_12:
+
+.. figure:: figures/parameter_exploration/fig6_12.png
+   :align: center
+   :width: 50%
+
+   One frame from the resulting animation.
+
+Alternatives to Linear Interpolation
+====================================
+
+In each of the examples above, we used linear interpolation to vary the parameter values in 'X' and 'Y' and time. However, linear interpolation is only one of three methods for exploring a range of parameter values. The other two are to iterate through a simple list of values, or use a user-defined function.  You can choose the desired method
+from the drop-down menu on the right side of the parameter input field (Figure :ref:`Choose from linear interpolation, list, or user-defined function <fig-paramexp-popup_menu>`).
+For linear interpolation, the starting and ending values must be
+specified; for a list, the entire comma-separated list must be
+specified, and for a user-defined function, a Python function must be
+specified.  For the list and user-defined functions, you can access an
+editor via the '...' button.  (See Figure :ref:`Editors for lists of values <fig-paramexp-edit_dialogs>` for examples of the list editor and Python editor widgets.)  As an alternative to the list editor,
+you can manually enter a list using Python notation; for example,
+``[30, 36, 45, 75]``.  As before, to set the direction in which to explore a
+given parameter, simply select the radio button in the column for the
+specified direction.
+
+.. _fig-paramexp-popup_menu:
+
+.. figure:: figures/parameter_exploration/popup_menu.png
+   :align: center
+   :width: 2in
+
+   Choose from linear interpolation, list, or user-defined function.
+
+.. _fig-paramexp-edit_dialogs:
+
+.. figure:: figures/parameter_exploration/list_edit.png
+   :align: center
+   :height: 2in
+
+   Editors for lists of values.
+
+.. figure:: figures/parameter_exploration/user_func_edit.png
+   :align: center
+   :height: 2in
+
+   Editors for user-defined functions.
+
+In both the ``Set Methods`` and ``Annotated Pipeline`` panels, you may see numbered red circles.  See Figure :ref:`The panels of the Parameter Exploration window... <fig-paramexp-virtual_cell>` for an example of what this looks like.
+These circles appear when there is more than one module of a given type in
+a workflow.  For each type satisfying this criteria, the instances are
+numbered and displayed so that you can identify which part of the
+pipeline a module in the ``Set Methods`` panel corresponds
+to.
+
+.. _fig-paramexp-panels:
+
+.. figure:: figures/parameter_exploration/set_methods.png
+   :align: center
+   :width: 2.0in
+
+.. figure:: figures/parameter_exploration/annotated_pipeline.png
+   :align: center
+   :width: 2.0in
+
+.. _fig-paramexp-virtual_cell:
+
+.. figure:: figures/parameter_exploration/virtual_cell.png
+   :align: center
+   :width: 2.0in
+
+   The panels of the Parameter Exploration window.  ``Set Methods`` (Top) will appear in the right panel and the others will be on the left.  The numbered red circles in the ``Annotated Pipeline`` (Middle) distinguish duplicate modules, and the cells in the ``Spreadsheet Virtual Cell`` (Bottom) determine the layout for spreadsheet results.
+
+"Virtual Cell" Layout
+=====================
+
+.. index::
+   pair: spreadsheet; parameter exploration
+   pair: spreadsheet; virtual cell
+
+As stated earlier, the Spreadsheet provides integrated support
+for parameter explorations.  Each of the directions of exploration
+corresponds to a visual dimension in the spreadsheet: the 'x'
+direction corresponds to columns; the 'y' direction to rows; the
+'z' direction to sheets; and time to animations.  However, when
+a workflow already outputs to more than one cell, you can layout the
+group of cells as it will be replicated during the exploration.  For
+example, given a workflow with two output cells and an exploration for
+three parameter values in the 'x' direction, the resulting
+spreadsheet could be :math:`1\times6` or :math:`2\times3`.  The
+``Spreadsheet Virtual Cell`` panel controls the layout of
+the pattern.  Drag and drop cells to position them.  See
+Figures :ref:`The panels of the Parameter Exploration window (Bottom) <fig-paramexp-virtual_cell>` and :ref:`Results of the Virtual Cell arrangement <fig-paramexp-vc_results>`
+for an example.
+
+.. _fig-paramexp-vc_results:
+
+.. figure:: figures/parameter_exploration/fig6_3.png
+   :align: center
+   :width: 70%
+
+   Results of the Virtual Cell arrangement.
+
+.. %TODO insert an example here!
+
+.. index:: parameter exploration
diff --git a/doc/usersguide/persistence.rst b/doc/usersguide/persistence.rst
new file mode 100644
index 0000000..f65570a
--- /dev/null
+++ b/doc/usersguide/persistence.rst
@@ -0,0 +1,165 @@
+.. _chap-persistence:
+
+*************************
+Persistence in VisTrails
+*************************
+
+.. index::persistence
+
+The ``Persistence`` package in Vistrails helps improve reproducibility by associating versions of data files with their provenance, and minimize the need to rerun lengthy executions by keeping intermediate persistent files. 
+Although, we will focus primarily on the use of persistent files, persistent directories are used in the same manner.  The difference is that a persistent directory deals with multiple files within a directory rather than a single file.
+
+Getting Started With Persistence
+================================
+
+A persistent file is simply a file that is kept in a repository and identified by an id and version string and annotated with a signature and content hash.  To begin, notice that there are three persistent file/directory types: input, intermediate, and output. It is helpful to understand the differences among these files as well as their distinguishing characteristics and configuration options.
+
+Input Files
+^^^^^^^^^^^
+
+.. index::
+   pair: persistent files; input
+
+To use a persistent input file, after dragging it onto the canvas, it is necessary to edit the configuration (Ctrl+E).  For an input file, one can either create a new reference to an existing local file, or use a file that exists in the database.  To create a new reference, select ``Create New Reference`` and either enter the path to the file, or select the folder icon on the right to browse local directories for a file.  Then, give the file a name and any appropriate tags to help identi [...]
+
+.. topic:: Note
+
+   A new version of a persistent file is created each time its contents change.  A persistent input file will always use the most recent version of a file if it is assigned to the root of the file tree.
+
+The ``PersitentInputFile`` module can also be used to read or write data directly from or to a local file.  To use this feature, you will need to set ``localPath`` to point to a local file.  This can be done in the Set Methods Panel, the Configuration Dialog, or by connecting a file to the localPath input port.  Then, the local file will be read when readLocal is set to true and written when writeLocal is set to true.  To do this using the Configuration Dialog, select ``Keep Local Versio [...]
+
+Output Files
+^^^^^^^^^^^^
+
+.. index::
+   pair: persistent files; output
+
+To use a persistent output file, after dragging it onto the canvas, it is necessary to edit the configuration (Ctrl+E).  Notice that the Configuration Dialog for the output file is the same as that of the input file except that an option to ``Always Create New Reference`` exists.  Selecting this new option will cause a new file to be created and added to the persistent store each time the workflow is executed.  The new file does not get a name or tag, so it can be difficult to identify t [...]
+
+If you prefer to have a new version of the file created each time the workflow is changed rather than executed, you should choose either of the other options (``Create New Reference``, or ``Use Existing Reference``).  The other two options and the option to read from or write to a local path are used in the same manner as with the input file.  However, when the input file is read from a local path, it is not also read from the persistent store.  In contrast, when an output file is writte [...]
+
+Intermediate Files
+^^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: persistent files; intermediate
+
+An intermediate file is the same as the output file except that its contents can be used in further calculations.  Thus, lengthy computations upstream of the intermediate file will only be recalculated when the upstream workflow changes, but will not need to be rerun when only the downstream workflow changes.  Intermediate files by default are set to always create a new reference.  Since these files do not need to be manually annotated or named, configuration is optional, but is the same [...]
+
+Using the Output of One Workflow as Input for Another
+=====================================================
+
+You need to configure the persistence modules using the module's configuration dialog. After adding a PersistentOutputFile to the workflow, click on the triangle in the upper-right corner of the PersistentOutputFile, and select "Edit Configuration" from the menu that appears. In this dialog, select "Create New Reference" and give the reference a name (and any space-delimited tags). Upon running that workflow, the data will be written to the persistent store. In the second workflow where  [...]
+
+Managing Files in the Store
+===========================
+
+You may manage the files in the store by selecting ``Packages -> Persistence -> Manage Store``.  You are then free to save files from the store to local files, or delete files from the store.  However, please be aware that files deleted from the store are not recoverable.  Also, for versioned files, a specific version of a file can not be deleted without deleting all versions of that file.  To delete all versions of the file, select the root version and press ``Delete``.
+
+Examples
+========
+
+.. topic:: Try it Now!
+
+   **Base Workflow**
+
+   1) Drag the following modules to the canvas and connect them in the order in which they are named:  ``HTTPFile``, ``vtkUnstructuredGridReader``, ``vtkDataSetMapper``, ``vtkActor``, ``vtkRenderer``, ``VTKRenderOffscreen``.  Refer to Figure :ref:`Example 1.1 <fig-pers-example-base>` to ensure connections are correct.
+
+   2) Select the ``HTTPFile`` module and set the url to: 
+      
+      http://www.vistrails.org/download/download.php?type=DATA&id=spx.vtk
+
+   3) (Optional) Select the ``vtkRenderer`` module and select ``SetBackgroungWidget`` from the ``Module Information's`` ``Inputs`` tab.  Select the background color of your choice.
+
+   **Persistent Output**
+
+   4) Switch to the ``History`` view and tag the current version as "Base Workflow".  Then, switch back to the pipeline view.
+
+   5) Enable the persistence package.
+
+   6) Drag the ``PersistentOutputFile`` module to the canvas and connect the output from ``VTKRenderOffscreen`` to its value port. See Figure :ref:`Example 1.2 <fig-pers-example-output>`.
+
+   7) With the ``PersistentOutputFile`` module selected, press Ctrl-E to edit the module configuration. 
+
+   8) Select ``Create New Reference``, name it "persistence1_1", and give it a "Persistent Output" tag.  Select ``Save``.
+
+   9) Execute the workflow.
+
+   **Persistent Input**
+
+   10) Switch to the History view again and tag the current version as "Persistent Output".  Then, select the root of the version tree and go back to the pipeline view.
+
+   11) Drag the ``PersistentInputFile`` and ``ImageViewerCell`` modules to the canvas and connect them. See Figure :ref:`Example 1.3 <fig-pers-example-input>`.
+
+   12) Edit the configuration of the ``PersitentInputFile``.  Select "Use Existing Reference" and select the file named "persistence1_1" with the "Persistent Output" tag.  Select ``Save``. See Figure :ref:`Example 1.4 <fig-pers-example-conf>`.
+
+   13) Execute the workflow.  An image should be displayed in the VisTrails spreadsheet.
+
+   **Persistent Intermediate**
+
+   14) Switch to the ``History`` view and tag the version with "Persistent Input", then select the "Base Workflow" version and switch to the pipeline view again.
+
+   15) Drag the ``PersistentIntermediateFile`` and ``ImageViewerCell`` modules to the canvas and connect them as shown in Figure :ref:`Example 1.5 <fig-pers-example-intermediate>`.
+
+   16) Execute the workflow.
+
+   17) In the History view, tag the version with "Persistent Intermediate".  See Figure :ref:`Example 1.6 <fig-pers-example-ver>`.
+
+   **Experimentation**
+
+   You can now change the background color in the "Persistent Output" version and execute the pipeline.  The changes should show up when you execute the pipeline of the "Persistent Input" version.  You can also change the background color in the "Persistent Intermediate" version, but this example merely demonstrates how to use the module.  Performance increase will not be seen here due to the lack of lengthy computations.
+
+.. _fig-pers-example-base:
+
+.. |fig1| image:: figures/persistence/base.png
+   :align: top
+
+.. _fig-pers-example-output:
+
+.. |fig2| image:: figures/persistence/output.png
+   :align: top
+
++-----------------------+------------------------------------+
+| |fig1|                |  |fig2|                            |
++-----------------------+------------------------------------+
+| Example 1.1 - Base    |  Example 1.2 - Persistent Output   |
+| Workflow - An example |  File                              |
+| pipeline without      |                                    |
+| persistence.          |                                    |
++-----------------------+------------------------------------+
+
+
+.. _fig-pers-example-input:
+
+.. figure:: figures/persistence/input.png
+   :align: center
+   :width: 30%
+
+   Example 1.3 - Persistent Input File
+
+
+.. _fig-pers-example-conf:
+
+.. figure:: figures/persistence/reference.png
+   :align: center
+   :width: 100%
+
+   Example 1.4 - Selecting an existing reference
+
+
+.. _fig-pers-example-intermediate:
+
+.. figure:: figures/persistence/intermediate.png
+   :align: center
+   :width: 40%
+
+   Example 1.5 - Persistent Intermediate File
+
+
+.. _fig-pers-example-ver:
+
+.. figure:: figures/persistence/versions.png
+   :align: center
+   :width: 70%
+
+   Example 1.6 - The History Tree
diff --git a/doc/usersguide/preface.rst b/doc/usersguide/preface.rst
new file mode 100644
index 0000000..507dca6
--- /dev/null
+++ b/doc/usersguide/preface.rst
@@ -0,0 +1,45 @@
+
+
+*******
+Preface
+*******
+
+Welcome to the *VisTrails User's Guide*. This book has been updated for version 2.1 of the VisTrails software.
+
+VisTrails is a new scientific workflow management system developed at the University of Utah that provides support for data exploration and visualization. For an engineer or scientist, generating and evaluating hypotheses is an interactive process. With each change, a different, albeit related, workflow is created. VisTrails was designed to manage these rapidly-evolving workflows. By automatically managing the data, metadata, and the data exploration process, VisTrails allows you to focu [...]
+
+VisTrails is an open-source software system.  You can contribute to
+VisTrails by sharing bug reports, bug fixes, and suggestions with the
+VisTrails community. The easiest way to get started is to sign up for
+the VisTrails Users mailing list. Instructions for doing this can be
+found on the VisTrails web site: www.vistrails.org.
+
+This book is divided into four parts. The first part, :doc:`Introduction
+to VisTrails </intro>`, provides instructions on how to download and install
+the VisTrails software, and introduces you to its user interface. The
+second and longest part, "Learning VisTrails by Example," consists
+of a number of tutorial chapters that guide you, step by step, through
+the features of VisTrails. We encourage you to try out these examples
+for yourself as you read this book. The third part provides information on additional features and packages.  The forth and final part is the
+"Developer's Guide" and is intended for programmers who wish to add
+new features, packages, and modules to VisTrails.
+
+We hope that you will find VisTrails to be a useful tool towards
+automating and streamlining your workflows, leading to faster
+discoveries and deeper insight.
+
+For your convenience, the html version of this manual is also available at http://www.vistrails.org/usersguide.
+
+*About the figures:* VisTrails works across multiple platforms, and
+the screenshots shown in this manual reflect this. Hence, some of the
+images in this book may vary slightly from what you see on your
+system, depending on the look and feel of your platform.
+
+Acknowledgements
+================
+VisTrails research and development has
+been funded the Department of Energy SciDAC (VACET and SDM centers),
+the National Science Foundation (grants IIS-0746500, CNS-0751152,
+IIS-0713637, OCE-0424602, IIS-0534628, CNS-0514485, IIS-0513692,
+CNS-0524096, CCF-0401498, OISE-0405402, CCF-0528201, CNS-0551724), and
+IBM Faculty Awards (2005, 2006, 2007, and 2008).
diff --git a/doc/usersguide/preliminary.rst b/doc/usersguide/preliminary.rst
new file mode 100644
index 0000000..5321777
--- /dev/null
+++ b/doc/usersguide/preliminary.rst
@@ -0,0 +1,4 @@
+.. toctree::
+   :maxdepth: 1
+
+   preface
diff --git a/doc/usersguide/provenance.rst b/doc/usersguide/provenance.rst
new file mode 100644
index 0000000..681572d
--- /dev/null
+++ b/doc/usersguide/provenance.rst
@@ -0,0 +1,14 @@
+.. _chap-provenance_browser:
+
+******************
+Provenance Browser
+******************
+
+The ``Provenance Browser`` allows you to browse through all executions performed on a vistrail.  When the ``Provenance`` mode is selected, executions are displayed in the ``Log Details`` panel on the right (see figure :ref:`Provenance Browser <fig-browser>`).  Selecting an execution from the ``Log Details`` panel will display the pipeline with modules colored according to their execution results.  Alternatively, this pipeline is displayed by double-clicking on the execution in the ``Work [...]
+
+.. _fig-browser:
+
+.. figure:: figures/provenance/browser.png
+   :width: 100%
+
+   Provenance Browser - *Left:* The ``Workspace`` has a button to enable/disable executions.  When enabled, executions of each tagged version in the vistrail will appear when each respective version is expanded.  *Right:* The ``Provenance Browser`` keeps track of all executions whether they belong to tagged versions or not.  When selected, the color coded execution pipeline will appear in the center panel.
diff --git a/doc/usersguide/pythoncalc.rst b/doc/usersguide/pythoncalc.rst
new file mode 100644
index 0000000..cbc0758
--- /dev/null
+++ b/doc/usersguide/pythoncalc.rst
@@ -0,0 +1,208 @@
+.. % NB: Please don't break any of the long lines - Verbatim is picky about line breaks
+
+.. index::
+   pair: Module registry; ``addModule``
+   pair: packages; ``initialize``
+   pair: Module registry; ``addInputPort``
+   pair: Module registry; ``addOutputPort``
+   pair: modules; ``ModuleError``
+
+.. role:: red
+
+.. code-block:: python
+   :linenos:
+
+   import core.modules.module_registry
+   from core.modules.vistrails_module import Module, ModuleError
+
+   version = "0.9.0"
+   name = "PythonCalc"
+   identifier = "org.vistrails.vistrails.pythoncalc"
+
+   class PythonCalc(Module):
+       """PythonCalc is a module that performs simple arithmetic operations on its inputs."""
+
+       def compute(self):
+           v1 = self.getInputFromPort("value1")
+           v2 = self.getInputFromPort("value2")
+           result = self.op(v1, v2)
+           self.setResult("value", result)
+
+       def op(self, v1, v2):
+           op = self.getInputFromPort("op")
+           if op == '+': return v1 + v2
+           elif op == '-': return v1 - v2
+           elif op == '*': return v1 * v2
+           elif op == '/': return v1 / v2
+           else: raise ModuleError(self, "unrecognized operation: '%s'" % op)
+
+   ###############################################################################
+
+   def initialize(*args, **keywords):
+
+       # We'll first create a local alias for the module registry so that
+       # we can refer to it in a shorter way.
+       reg = core.modules.module_registry.registry
+
+       # VisTrails cannot currently automatically detect your derived
+       # classes, and the ports that they support as input and
+       # output. Because of this, you as a module developer need to let
+       # VisTrails know that you created a new module. This is done by calling
+       # function addModule:
+       reg.add_module(PythonCalc)
+
+       # In a similar way, you need to report the ports the module wants
+       # to make available. This is done by calling addInputPort and
+       # addOutputPort appropriately. These calls only show how to set up
+       # one-parameter ports. We'll see in later tutorials how to set up
+       # multiple-parameter plots.
+       reg.add_input_port(PythonCalc, "value1", 
+                          (core.modules.basic_modules.Float, 'the first argument'))
+       reg.add_input_port(PythonCalc, "value2",
+                          (core.modules.basic_modules.Float, 'the second argument'))
+       # We declare this port as an enum, so that the user may only select one of
+       # the listed values
+       reg.add_input_port(PythonCalc, "op",
+                          (core.modules.basic_modules.String, 'the operation'),
+                          entry_types=['enum'], values=["['+', '-', '*', '/']"])
+       reg.add_output_port(PythonCalc, "value",
+                          (core.modules.basic_modules.Float, 'the result'))
+
+.. .. code-block:: python
+   :linenos:
+
+   ###############################################################################
+   ##
+   ## Copyright (C) 2011-2014, NYU-Poly.
+   ## Copyright (C) 2006-2011, University of Utah.
+   ## All rights reserved.
+   ## Contact: contact at vistrails.org
+   ##
+   ## This file is part of VisTrails.
+   ##
+   ## "Redistribution and use in source and binary forms, with or without 
+   ## modification, are permitted provided that the following conditions are met:
+   ##
+   ##  - Redistributions of source code must retain the above copyright notice, 
+   ##    this list of conditions and the following disclaimer.
+   ##  - Redistributions in binary form must reproduce the above copyright 
+   ##    notice, this list of conditions and the following disclaimer in the 
+   ##    documentation and/or other materials provided with the distribution.
+   ##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+   ##
+   ###############################################################################
+   """This package implements a very simple VisTrails module called
+   PythonCalc. This is intended as a simple example that can be referred
+   to by users to create their own packages and modules later.
+
+   If you're interested in developing new modules for VisTrails, you
+   should also consult the documentation in
+   core/modules/vistrails_module.py.
+   """
+
+   import core.modules
+   import core.modules.module_registry
+   from core.modules.vistrails_module import Module, ModuleError
+
+   ###############################################################################
+   # PythonCalc
+   #
+   # A VisTrails package is simply a Python class that subclasses from
+   # Module.  For this class to be executable, it must define a method
+   # compute(self) that will perform the appropriate computations and set
+   # the results.
+   #
+   # Extra helper methods can be defined, as usual. In this case, we're
+   # using a helper method op(self, v1, v2) that performs the right
+   # operations.
+
+   class PythonCalc(Module):
+       """PythonCalc is a module that performs simple arithmetic operations
+       on its inputs."""
+
+       # This constructor is strictly unnecessary. However, some modules
+       # might want to initialize per-object data. When implementing your
+       # own constructor, remember that it must not take any extra
+       # parameters.
+       def __init__(self):
+           Module.__init__(self)
+
+       # This is the method you should implement in every module that
+       # will be executed directly. VisTrails does not use the return
+       # value of this method.
+       def compute(self):
+           # getInputFromPort is a method defined in Module that returns
+           # the value stored at an input port. If there's no value
+           # stored on the port, the method will return None.
+           v1 = self.getInputFromPort("value1")
+           v2 = self.getInputFromPort("value2")
+
+           # You should call setResult to store the appropriate results
+           # on the ports.  In this case, we are only storing a
+           # floating-point result, so we can use the number types
+           # directly. For more complicated data, you should
+           # return an instance of a VisTrails Module. This will be made
+           # clear in further examples that use these more complicated data.
+           self.setResult("value", self.op(v1, v2))
+
+       def op(self, v1, v2):
+           op = self.getInputFromPort("op")
+           if op == '+':
+               return v1 + v2
+           elif op == '-':
+               return v1 - v2
+           elif op == '*':
+               return v1 * v2
+           elif op == '/':
+               return v1 / v2
+           # If a module wants to report an error to VisTrails, it should raise
+           # ModuleError with a descriptive error. This allows the interpreter
+           # to capture the error and report it to the caller of the evaluation
+           # function.
+           raise ModuleError(self, "unrecognized operation: '%s'" % op)
+
+   ###############################################################################
+   # the function initialize is called for each package, after all
+   # packages have been loaded. It it used to register the module with
+   # the VisTrails runtime.
+
+   def initialize(*args, **keywords):
+
+       # We'll first create a local alias for the module_registry so that
+       # we can refer to it in a shorter way.
+       reg = core.modules.module_registry
+
+       # VisTrails cannot currently automatically detect your derived
+       # classes, and the ports that they support as input and
+       # output. Because of this, you as a module developer need to let
+       # VisTrails know that you created a new module. This is done by calling
+       # function addModule:
+       reg.addModule(PythonCalc)
+
+       # In a similar way, you need to report the ports the module wants
+       # to make available. This is done by calling addInputPort and
+       # addOutputPort appropriately. These calls only show how to set up
+       # one-parameter ports. We'll see in later tutorials how to set up
+       # multiple-parameter plots.
+       reg.addInputPort(PythonCalc, "value1",
+                        (core.modules.basic_modules.Float, 'the first argument'))
+       reg.addInputPort(PythonCalc, "value2",
+                        (core.modules.basic_modules.Float, 'the second argument'))
+       reg.addInputPort(PythonCalc, "op",
+                        (core.modules.basic_modules.String, 'the operation'))
+       reg.addOutputPort(PythonCalc, "value",
+                         (core.modules.basic_modules.Float, 'the result'))
diff --git a/doc/usersguide/querying.rst b/doc/usersguide/querying.rst
new file mode 100644
index 0000000..bfadc67
--- /dev/null
+++ b/doc/usersguide/querying.rst
@@ -0,0 +1,230 @@
+.. _chap-querying:
+
+*************************
+Querying the Version Tree
+*************************
+
+.. role:: red
+
+.. index:: queries
+
+|vistrails| is designed for manipulating collections of workflows, and
+an integral part of this design is the ability to quickly search
+through these collections.  |vistrails| provides two methods for
+querying vistrails and workflows.  The first is a Query by Example
+interface which allows you to build query workflows and search for
+those with similar structures and parameters. The second is a
+textual interface with a straightforward syntax.  For each interface,
+the results are *visual*: each matching version is
+highlighted in the ``History`` view, and if the query
+involves specific workflow characteristics, any matching entities are
+also highlighted in the ``Pipeline`` view for the current
+version.
+
+Query By Example
+================
+
+.. index::
+   pair: queries; by example
+
+One of the problems faced when trying to query a collection of
+workflows is the fact that structure is important.  Suppose that you
+want to find only workflows where two modules are used in sequence.
+Instead of trying to translate this into a text-based syntax, it is
+easier to construct this relationship visually.  |vistrails| provides such an
+interface which mirrors the ``Pipeline`` view, allowing
+you to construct a (partial) workflow to serve as the search criteria.
+
+To use the Query by Example interface, click on the
+``Search`` button on the toolbar.  This view is extremely
+similar to the ``Pipeline`` view and pipelines can be built
+in a similar manner.  Just like the ``Pipeline`` view,
+modules are added by dragging them from the list on the left side of
+the window, connections are added by clicking and dragging from a port
+on one module to a corresponding port on another module.  Setting module parameters in this view will narrow the search to matching modules whose parameters fall within the specified range of values.  Figure :ref:`Example pipeline in Search mode <fig-querying-query>` shows an example pipeline that has been built in the query builder.
+
+.. _fig-querying-query:
+
+.. figure:: figures/querying/query.png
+   :width: 3in
+   :align: center
+
+   Example pipeline in ``Search`` mode.
+
+.. %TODO what are the next few sentences actually trying to say?
+.. %, and parameters can be edited on the right-side of the window.  One major difference between the ``Pipeline`` view and the ``Search`` view is that you can use comparison operations in parameter values.  For example, instead of searching for a pipeline that contains a Float with a value of ``4.5``, you can search for a pipeline that contains a Float with a value ``'< 4.5'`` or ``'> 4.5'``.
+
+.. index::
+   pair: queries; viewing results
+
+The next step is to decide whether to search the ``Current Vistrail``, ``Current Workflow``, or all ``Open Vistrails``.  The results of the first option are displayed on a version tree as well as in the ``Workspace`` panel.  Non-matching versions in the version tree will be grayed out while matching versions will be displayed in the tree as normal.  In contrast, the ``Workspace`` panel will display matching results and omit versions with no matches.  Double-clicking a version from the `` [...]
+
+The remaining two options are ``Current Workflow`` and ``Open Vistrails``.  The ``Current Workflow`` option is the simplest and will display the pipeline with matching modules highlighted.  The ``Open Vistrails`` option will put all of its results in the ``Workspace`` panel, listing open vistrails with their matching versions.   From here, double-clicking on a vistrail will bring up a version tree which emphasizes matching versions, or double-clicking on a version will bring up the assoc [...]
+
+After constructing a pipeline and selecting the appropriate search option, click the ``Execute`` button to begin the query.  This button will be available as long as the query window is not empty.  However, you may need to press the ``Back to Search`` button to return to the query window to re-execute.
+
+.. topic:: Note
+
+   You may leave the ``Query`` either through use of the toolbar or by pressing the ``Edit`` button.  However, the search results will persist until the search is cleared (press ``Clear Search``), returning the workspace to its normal form.
+
+.. topic:: Try it now!
+
+   Let's practice making a simple query. Open the :vtl:`offscreen.vt` example vistrail. Click on the ``Search`` button to enter ``Search`` mode.  Create a query like the one shown in Figure :ref:`Example pipeline in Search mode <fig-querying-query>` by dragging the modules ``SheetReference``, ``CellLocation``, and ``RichTextCell`` onto the Search canvas. (These modules can be found under the "|vistrails| Spreadsheet" header in the Modules panel.) Connect the input and output ports of the [...]
+
+
+.. _fig-querying-workspace:
+
+.. figure:: figures/querying/workspace_results.png
+   :align: center
+   :width: 2in
+
+   Workspace - The query results displayed in the workspace.
+
+.. _fig-querying-history:
+
+.. figure:: figures/querying/query2.png
+   :height: 3in
+   :align: center
+
+   History - Search results in the ``History`` view.
+
+.. _fig-querying-pipeline:
+
+.. figure:: figures/querying/query3.png
+   :height: 3in
+   :align: center
+
+   Pipeline - The results in the ``Pipeline`` view.
+
+Note that Query by Example provides the capability to iteratively
+refine searches by adding more criteria.  For example, if you were
+interested in workflows that contain a certain module, you may find that
+such a query returns too many results.  You could then refine the query
+to find only those workflows where the given module has a parameter
+setting that falls within a given range.
+This is done by specifying parameter values in the ``Methods`` panel on the right side of the window.
+One major difference between the ``Pipeline`` view and the ``Search`` view is that you can use comparison operations, such as '<' and '>', in parameter values. The following example illustrates this.
+
+.. topic:: Try it now!
+
+   Open the :vtl:`terminator.vt` example file, and enter ``Search`` mode. Drag the ``vtkActor`` module from the Modules panel onto the Search canvas. ``Execute`` the query, and see which versions of the workflow contain a ``vtkActor`` module. Select ``Back to Search`` to return to the ``Search`` view, select the ``vtkActor`` module, then select ``RotateZ`` method from the ``Module Information`` tab. In the ``RotateZ`` text field, select ``'>'`` and then enter '90'. When you ``Execute`` t [...]
+
+.. _fig-querying-vtkActor_example:
+
+.. figure:: figures/querying/query_vtkActor.png
+   :width: 3in
+   :align: center
+
+   Query result showing all workflows in the "terminator.vt" example that contain the module ``vtkActor``.
+
+.. figure:: figures/querying/query_vtkActor90.png
+   :width: 3in
+   :align: center
+
+   The same query refined to show only those workflows whose ``RotateZ`` value is greater than 90.
+
+Textual Queries
+===============
+
+.. %Removing this figure as the addition of the next example makes it redundant.
+.. %\begin{figure}
+.. %\centering
+.. %\includegraphics[width=3in]{query4.png}
+.. %\caption{A query made to find any changes made before February 21.}
+.. %\label{fig:querying:date}
+.. %\end{figure}
+
+.. index::
+   pair: queries; textual
+
+There are many ways to search for versions in the version tree using textual queries, but they all rely on a simple
+text box for input.  Begin a search by selecting ``Search`` on the toolbar.  The search box is at the top of the center panel and has a magnifying glass icon next to it.  If you enter query text, |vistrails|
+will attempt to match logical categories, but if your query is more
+specific, |vistrails| has special syntax to markup the query.
+To execute a query, simply press the 'Enter' key after typing your query.
+
+.. raw:: latex
+
+   \linebreak
+
+.. %Figure :ref:`fig-querying-date` shows an example query.
+
+.. _tab-querying-syntax:
+
+.. table:: Syntax for querying specific information using textual queries.
+
+   ==============  ================================================================
+    Search Type    Syntax                                                        
+   ==============  ================================================================
+   User name       ``user:`` *user name*
+   Annotation      ``notes:`` *phrase*
+   Tag             ``name:`` *version tag*
+   Date            ``before:`` *date* ``|`` *relative time*
+   \               ``after:`` *date* ``|`` *relative time*
+   ==============  ================================================================
+
+.. topic:: Note
+
+   Since we allow regular expressions in our search box, question marks are treated as meta-characters. Thus, searching for "?" returns everything and "abc?" will return everything containing "abc". You need to use "\\?" instead to search for "?". So the search for "??" would be "\\?\\?".
+
+Table :ref:`tab-querying-syntax` lists the different ways to markup a
+query.  Note that you can search by user name to see which changes a
+particular user has made, and also by date to see which changes were
+made in a specific time frame.  When searching by date, you can search
+for all changes before or after a given date or an amount of time
+relative to the present.  If searching for changes before or after a
+specific date, the date can be entered in a variety of formats.  The
+simplest is '*day* *month* *year*,' but if the
+year is omitted, the current year is used.  The month may be specified
+by either its full name or an abbreviation.  For example, ``'before: 18 November 2004'`` and ``'after: 20 Dec'`` are both valid queries.  If searching by relative time,
+you can prepend the amount of time relative to the present including
+the units to 'ago'.  An example of this type of query is
+``'after: 30 minutes ago'``.  The available units are seconds,
+minutes, hours, days, months, or years.
+
+You can concatenate simple search statements to create a compound
+query to search across different criteria or for a specific range.
+For example, to search for workflows whose tag includes
+``'brain'`` *and* were created by the user ``'johnsmith'``,
+the query would be ``'name: brain user: johnsmith'``.  To search
+for all workflows created between April 1 and June 1, the query would
+be ``'after: April 1 before: June 1'``.
+
+.. topic:: Try it now!
+
+   Open the :vtl:`terminator.vt` example file, and enter ``Search`` mode.  Let's look for all workflows that were created after November 24, 2010. In the search box in the ``Search`` panel, type ``'after: 24 nov 2010'`` and press 'Enter'. The expected result is shown in Figure :ref:`Results of a query to find any changes make after November 24, 2010 <fig-querying-july1>`.
+
+.. _fig-querying-july1:
+
+.. figure:: figures/querying/textquery.png
+   :width: 3.5in
+   :align: center
+
+   Results of a query to find any changes made after November 24, 2010.
+
+In addition, |vistrails| keeps track of the most recent textual
+queries, and repeating or clearing these queries can be accomplished by selecting the recent query from the dropdown menu attached to the search box.  Finally, the 'X' button next to the search box will reset the query.
+
+.. _sec-querying-results:
+
+Refining the Results
+^^^^^^^^^^^^^^^^^^^^
+
+.. %TODO consider dropping this section, and merging its content into the other sections. 
+
+.. index:: search; refine
+
+While in the ``Search`` view, you can select two different
+ways of viewing search results.  The magnifying glass icon to the left of the textual search box contains a dropdown menu with two options: "Search" and "Refine" (Figure :ref:`Clicking the button to the left... <fig-querying-search_or_refine>`).  The first displays results by simply highlighting the matching nodes while the second condenses the tree to show only the versions that match.  For large vistrails, this second method can help you determine relationships between the matching ver [...]
+
+.. %TODO I'm not sure that this button actually works as intended.
+
+.. _fig-querying-search_or_refine:
+
+.. figure:: figures/querying/search_or_refine.png
+   :width: 1.6in
+   :align: center
+
+   Clicking the button to the left of the query text box accesses a dropdown menu.
+
+.. index:: queries
diff --git a/doc/usersguide/spreadsheet.rst b/doc/usersguide/spreadsheet.rst
new file mode 100644
index 0000000..90bbb04
--- /dev/null
+++ b/doc/usersguide/spreadsheet.rst
@@ -0,0 +1,248 @@
+.. _chap-spreadsheet:
+
+***********
+Spreadsheet
+***********
+
+.. index:: spreadsheet
+
+.. _fig-spreadsheet:
+
+.. figure:: figures/spreadsheet/spreadsheet.png
+   :width: 5in
+   :align: center
+
+   The VisTrails Spreadsheet.
+
+As described in Section :ref:`sec-versions-diff`, |vistrails| has a
+powerful built-in mechanism to compare workflows.  However, this
+comparison shows changes in the *design* of the workflows, and we
+are often also interested in differences in the *results* of
+workflows.  The |vistrails| Spreadsheet provides a simple, flexible,
+and extensible interface to display and compare results from
+workflows.  Coupled with the version differences, users can explore
+the evolution of their workflows.
+
+The Spreadsheet package is installed with |vistrails| by default, and
+it can display a variety of data ranging from VTK renderings to
+webpages without additional configuration.  To view the spreadsheet if it is hidden, select ``Packages`` :math:`\rightarrow` ``Spreadsheet`` :math:`\rightarrow` ``Show Spreadsheet.``
+
+..  %% TODO add this sentence back in once the Custom Cell chapter is complete!
+..  %In addition to the included types of viewers, users can create and register additional viewers using customized cell widgets (see Chapter :ref:`chap-custom_cells`).
+
+.. _sec-spreadsheet-layout:
+
+The Spreadsheet Layout
+======================
+
+.. index::
+   pair: spreadsheet; layout
+
+As should be expected, the |vistrails| Spreadsheet consists of one or more sheets, each with a customizable number of rows and columns.  
+
+.. _sec-spreadsheet-custom:
+
+Custom Layout Options
+^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   pair: spreadsheet; rows
+   pair: spreadsheet; columns
+   pair: spreadsheet; cells
+
+To modify the layout for the active sheet, you can change both the number of rows and columns and resize individual cells.  The number of rows is controlled by the left spinner in the toolbar and the number of columns by the right spinner.  To resize a given row or column, click and drag on one edge of the row or column header.  In addition, you can resize an individual cell by moving the mouse to lower-right corner of the cell until the cursor changes and clicking and dragging to the de [...]
+Figure :ref:`Different states of a spreadsheet cell \(d\) <fig-cell_states>`).  Note that this will affect the entire
+layout, compressing or expanding rows and columns to generate or fill
+space for the resized cell.
+
+.. index::
+   pair: spreadsheet; default values
+
+To adjust the default number of rows and columns in the spreadsheet: select   ``preferences`` from the ``VisTrails`` menu, select ``spreadsheet`` from the ``Enabled Packages`` portion of the ``Module Packages`` tab, press the ``Configure`` button, and adjust the values as for rowCount and colCount as desired.
+
+Multiple Spreadsheets
+^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   triple: spreadsheet; sheets; adding
+   triple: spreadsheet; sheets; deleting
+   triple: spreadsheet; sheets; docking
+   triple: spreadsheet; sheets; ordering
+
+|VisTrails| supports the use of multiple spreadsheets which can be added, docked, ordered and deleted.  Sheets are added either by clicking the ``New Sheet`` button in the ``Spreadsheet`` toolbar or choosing the menu item with the same name from the ``Main`` menu.  Each of these sheets can optionally be displayed as a dock widget separated from the main spreadsheet window by dragging its tab name out of the tab bar at the bottom of the spreadsheet, allowing multiple spreadsheets to be vi [...]
+
+Sending Output to the Spreadsheet
+=================================
+
+.. index::
+   triple: spreadsheet; cells; positioning
+
+Users may send results to the spreadsheet by using a spreadsheet cell.  Upon inspecting the VisTrails Spreadsheet package (in the list of packages, to the left of the pipeline builder), one can see there are built-in cells for different kinds of data, e.g., RichTextCell to display HTML and plain text.
+
+By default, an unoccupied cell on the active sheet will be chosen to display the result. However, you can specify in the pipeline exactly where a spreadsheet cell will be placed by using CellLocation and SheetReference. CellLocation specifies the location (row and column) of a cell when connecting to a spreadsheet cell (VTKCell, ImageViewerCell, ...). Similarly, a SheetReference module (when connecting to a CellLocation) will specify which sheet the cell will be put on given its name, mi [...]
+
+Advanced Cell Options
+^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   triple: spreadsheet; cells; creating
+
+The user can define new cell types to display application-specific data. For example, we have developed VtkCell, MplFigureCell, and OpenGLCell. It is possible to display pretty much anything on the Spreadsheet!
+
+Examples of writing cell modules can be found in:  RichTextCell: packages/spreadsheet/widgets/richtext/richtext.py VTK: packages/vtk/vtkcell.py
+
+Here is the summary of some requirements on a cell widget:
+
+(1) It must be a Qt widget. It should inherit from spreadsheet_cell.QCellWidget in the spreadsheet package. Although any Qt Widget would work, certain features such as animation will not be available (without rewriting it).
+
+(2) It must re-implement the updateContents() function to take a set of inputs (usually coming from input ports of a wrapper Module) and display on the cells. VisTrails uses this function to update/reuse cells on the spreadsheet when new data comes in.
+
+(3) It needs a wrapper VisTrails Module (inherited from basic_widgets.SpreadsheetCell of the spreadsheet package). Inside the compute() method of this module, it may call self.display(CellWidgetType, (inputs)) to trigger the display event on the spreadsheet.
+
+
+Interacting with the Spreadsheet
+================================
+
+.. index:: 
+   pair: spreadsheet; modes
+
+Currently, there are two operating modes in the Spreadsheet: Interactive Mode and Editing Mode.  Interactive Mode allows users to view and interact with the spreadsheet cells, while Editing Mode provides operations for manipulating cells.  The modes can be toggled via the ``View`` menu or their corresponding keyboard shortcuts ('Ctrl-Shift-I') and ('Ctrl-Shift-E').
+
+Interactive Mode
+^^^^^^^^^^^^^^^^
+
+.. index::
+  triple: spreadsheet; modes; interactive
+
+In Interactive Mode, users can interact directly with the viewer for an individual cell, interact with multiple cells at once, or change the layout of the sheet.  Because cells can differ in their contents, interacting with a cell changes based on the type of data displayed.  For example, in a cell displaying VTK data (a ``VTKCell``), a user can rotate, pan, and zoom in or out using the mouse.
+
+.. index::
+   pair: spreadsheet; cells
+
+In a sheet, a cell can be both *active* and *selected*.  There can only be one active cell, and that cell is highlighted by a yellow or grey border.  Clicking on any cell will make it active.  This active cell will respond to keyboard shortcuts as well as mouse input.  In constrast to the active cell, one or more cells can be selected, and the active cell need not be selected.  To select multiple cells, either click on a row or column heading to toggle selection or 'Ctrl'-click to add or [...]
+
+Depending on the cell type, additional controls may appear in the
+toolbar when a cell is activated. These controls affect only the
+active cell, and change for different cell types. As shown by
+Figure :ref:`Different states of a spreadsheet cell \(d\) <fig-cell_states>`, a cell optimized for rendering 2D images (a ``ImageViewerCell``) adds controls for resizing, flipping, and rotating the image in the active cell.
+
+.. _fig-cell_states:
+
+.. figure:: figures/spreadsheet/cell_states.png
+   :width: 6.5in
+   :align: center
+
+   Different states of a spreadsheet cell. \(a\) inactive and unselected, \(b\) active and unselected, \(c\) active and selected, \(d\) an active cell with its toolbar and resizer.
+
+The Camera
+++++++++++
+Spreadsheet cells that display VTK data typically are associated with a vtkRenderer, which is associated with a vtkCamera.  If the camera is not assigned in the workflow, a default one is created.  If the rendered geometry is not visible in the window, pressing 'r' will invoke the renderer's ResetCamera() command, which centers the geometry.  Also, pressing 'i' will initiate interactions with interactive vtk objects.
+
+Arranging Cells
++++++++++++++++
+
+As described in Section :ref:`sec-spreadsheet-custom`, cells can be
+resized by either resizing rows, columns, or an individual cell.  In
+addition to resizing, a row or column can be moved by clicking on its
+header and dragging it along the header bar to the desired position.
+See Section :ref:`sec-spreadsheet-editing` for instructions on moving a
+specific cell to a different location.
+
+Synchronizing Cells
++++++++++++++++++++
+
+Often, when a group of cells all display results from similar workflows, it is useful to interact with all of these cells at the same time.  For example, for a group of ``VTKCells``, it is instructive to rotate or zoom in on multiple cells at once and compare the results.  For this reason, if a group of cells is selected, mouse and keyboard events for a single cell of the selection are propogated to each of the other selected cells.  Currently, this feature only works for ``VTKCells``, b [...]
+
+.. _fig-spreadsheet_sync:
+
+.. figure:: figures/spreadsheet/spreadsheet_sync.png
+   :width: 3in
+   :align: center
+
+   When selecting all cells, interacting with one VTK cell \(A1\) causes the other two VTK cells \(B1 and B2\) to change their camera to the same position.
+
+.. _sec-spreadsheet-editing:
+
+Editing Mode
+^^^^^^^^^^^^
+
+.. index::
+   triple: spreadsheet; modes; editing
+
+Recall that Editing Mode can be entered either by accessing the ``View`` menu or by keying 'Ctrl-Shift-E'. Editing Mode provides more
+operations to layout and organize spreadsheet cells.  In this mode,
+the view for each cell is frozen and overlaid with additional
+information and controls (see Figure :ref:`The spreadsheet in editing mode... <fig-editing_mode>`).  The top
+of the overlay displays information about which vistrail, version, and
+type of execution were used to generate the cell.  The bottom piece of
+the overlay contains a variety of controls to manipulate the cell
+depending on the its state.
+
+Cells can be moved or copied to different locations on the spreadsheet
+by clicking and dragging the appropriate icons (``Move`` or
+``Copy``) for a given cell to its desired location.  To move
+a cell to a location on a different sheet, drag the icon over the
+target sheet tab to bring that sheet into focus first and then drop it
+at the desired location. If you move a cell to an already-occupied
+cell, the contents of the two cells will be swapped.  See
+Figure :ref:`The spreadsheet in editing mode... <fig-editing_mode>` for an example of swapping two cells.
+
+.. _fig-editing_mode:
+
+.. figure:: figures/spreadsheet/editing_mode.png
+   :width: 6.5in
+   :align: center
+
+   The spreadsheet in Editing Mode. \(a\) All cell widgets are replaced with an information widget \(b\) Two cells are swapped after drag and drop the 'Move' icon from A1 to B1.
+
+Clicking the ``Locate Version`` icon will highlight the node in the version tree (in the ``History`` view) from which the visualization in that cell was generated. The next two icons, ``Create Analogy`` and ``Apply Analogy``, help with creating visualizations by analogy. Please refer to Chapter :ref:`chap-analogies` for information about this feature.
+
+If a cell was generated via parameter exploration (see
+Chapter :ref:`chap-paramexploration`), the ``Create Version``
+button will be available to save the workflow that generated the
+result back to the vistrail.  Clicking this button modifies the
+vistrail from which the cell was generated by adding a new version
+with the designated parameter settings.  Thus, if you go back to the
+``History`` mode of the |vistrails| Builder for that
+vistrail, you will find that a new version has been added to the
+version tree.
+
+Launching a Web Browser
+=======================
+
+.. index::
+   triple: spreadsheet; cells; web browser
+
+It is sometimes difficult to view web pages within a spreadsheet cell due to limited space.  It may therefore be desirable to launch a web browser from within the spreadsheet cell.  While this functionality is not provided by |Vistrails|, here are some possible solutions:
+
+(1) You can use parameter exploration to generate multiple sheets so you might have an exploration that opens each page in a new sheet. Use the third column/dimension in the exploration interface to have a parameter span sheets.
+
+(2) The spreadsheet is extensible so you can write a custom spreadsheet cell widget that has a button or label with the desired link (a QLabel with openExternalLinks set to True, for example).
+
+(3) You can tweak the existing RichTextCell by adding the line "self.browser.setOpenExternalLinks(True)" at line 63 of the source file "vistrails/packages/spreadsheet/widgets/richtext/richtext.py". Then, if your workflow creates a file with html markup text like "<a href="http://www.vistrails.org">VisTrails</a>" connected to a RichTextCell, clicking on the rendered link in the cell will open it in a web browser. You need to add the aforementioned line to the source to let Qt know that yo [...]
+
+Saving a Spreadsheet
+====================
+
+.. warning::
+
+   This is currently an experimental feature and as such is not robust.  If you rename or move the vistrails used by the saved spreadsheet, the spreadsheet will not load correctly.
+
+.. index::
+   pair: spreadsheet; saving
+
+Because spreadsheets can include several workflow executions or parameter explorations, it is helpful to be
+able to save the layout of the current spreadsheet.  To save a
+spreadsheet, simply choose the ``Save`` menu item from the
+``Main`` menu, and complete the dialog.  After saving a
+spreadsheet, you can reopen it using the ``Open`` menu item.  A whole sheet can also be saved by selecting Export (either from the menu or from the toolbar).
+
+Saving a Spreadsheet Image
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   triple: spreadsheet; saving; image
+
+To save an image from the spreadsheet, click on the image's cell to make it active.  Then select the camera on the toolbar to take a snapshot. The system will prompt you for the location and file name where it should be saved. The other icons can be used for saving multiple images that can be used for generating an animation on demand. 
+
+.. index:: spreadsheet
diff --git a/doc/usersguide/tabledata.rst b/doc/usersguide/tabledata.rst
new file mode 100644
index 0000000..fe1fe7d
--- /dev/null
+++ b/doc/usersguide/tabledata.rst
@@ -0,0 +1,60 @@
+.. _chap-tabledata:
+
+********************
+Tabular data package
+********************
+
+The tabledata package provides facilities to load and manipulate data in table
+formats.
+
+It provides modules to read tables from CSV files and numpy arrays (including
+plain binary files) and extract or convert columns.
+
+.. topic:: Try it Now!
+
+  This example shows how to use tabledata together with matplotlib to
+  visualize trip data from `NYC Citibike's open data
+  <http://www.citibikenyc.com/system-data>`_.
+
+  Note that you can find the completed example here: :vtl:`bikes.vt`.
+
+  Start by dragging the following modules to the canvas:
+
+   * ``HTTPFile`` (from the HTTP package)
+   * ``CSVFile`` (under ``read/csv``)
+   * ``TableCell``
+   * Two ``ExtractColumn`` modules
+   * ``StringToDates`` (under ``convert/dates``)
+   * ``MplLinePlot`` from the matplotlib package
+   * ``MplFigure`` from the matplotlib package
+   * ``MplFigureCell`` from the matplotlib package
+
+  Connect the modules as shown in Figure :ref:`fig-tabledata-pipeline`.
+
+.. _fig-tabledata-pipeline:
+
+.. figure:: figures/tabledata/pipeline.png
+   :align: center
+   :width: 5in
+
+   The pipeline for the Bikes example
+
+.. topic:: Next Step!
+
+  Set the 'url' input of HTTPFile to ``http://www.vistrails.org/download/download.php?type=DATA&id=citibike_from_launch.csv``.
+  Make sure 'header_present' is checked on CSVFile.
+
+  Set the 'column_name' parameters on both ExtractColumn modules to ``Date`` (for the one on the left) and ``Miles traveled today (midnight to 11:59 pm)`` (for the one on the right). Alternatively, you can set column_index to 0 and 3.
+
+
+  The workflow is now ready. On execution, you will see a graphical view of the
+  CSV file as a table, and a line plot showing the variations of the total
+  distance traveled daily.
+
+.. _fig-tabledata-results:
+
+.. figure:: figures/tabledata/results.png
+   :align: center
+   :width: 9in
+
+   The result in the |vistrails| Spreadsheet
diff --git a/doc/usersguide/version_tree.rst b/doc/usersguide/version_tree.rst
new file mode 100644
index 0000000..1afd7ab
--- /dev/null
+++ b/doc/usersguide/version_tree.rst
@@ -0,0 +1,173 @@
+.. _chap-version_tree:
+
+*********************************
+Interacting with the Version Tree
+*********************************
+
+.. index:: versions
+
+Version Tree View
+=================
+
+.. index::
+   pair: versions;viewing
+   single: history
+
+The ``History`` button on the |vistrails| toolbar lets users interact with a workflow history. It consists of a tree view in the center and the ``Properties`` tool container on the right for querying and managing version properties  (see Figure :ref:`In History mode, you can examine... <fig-version_tree_screenshot_labeled>`). Versions are displayed as ellipses in the tree view where the root of the tree is displayed at the top of the view. The nodes of the tree correspond to a version of [...]
+
+.. _fig-version_tree_screenshot_labeled:
+
+.. figure:: figures/version_tree/history_view_screenshot_labeled.png
+   :width: 5.5 in
+   :align: center
+
+   In ``History`` mode, you can examine and annotate different versions of a workflow.
+
+.. %TODO hmm... what exactly is the scheme for when version nodes are visible or invisible under the "new regime"?
+
+.. index:: tags
+
+The nodes are displayed as colored ellipses, and are either blue or orange.  A blue color denotes that the corresponding version was created by the current user while orange nodes were created by other users.  The brightness of each node indicates how recently a version was created; brighter nodes were created more recently than dimmer ones.  Each node may also have a *tag* that describes the version, and this tag is displayed as a text label in the center of the ellipse of the correspon [...]
+
+The nodes are connected by a solid line if the child node is a direct descendent of the parent node; that is, if you have made only a single change from the older version to the newer version. By default, only nodes that: are leaves, have more than one child node, are specially tagged (see Section :ref:`sec-adding_deleting_tags`), or are current version will be
+displayed. To save space, other nodes will be "collapsed," or hidden from view.  Collapsed nodes are marked by the appearance of a small expansion button along an edge connecting two nodes. Clicking this button expands the
+version tree to reveal the hidden versions (Figure :ref:`To conserve space... <fig-expand_collapse_versions>`). The tree expansion is smoothly
+animated to help you maintain context from one view to the next. Clicking the button a second time collapses the nodes once again. Because most non-trivial changes to a workflow take more than one action, most edges in a the
+version tree will be shown with these expansion buttons.
+
+.. _fig-expand_collapse_versions:
+
+.. figure:: figures/version_tree/collapsed_expanded.png
+   :height: 6in
+   :align: center
+
+   To conserve space, linear sequences of non-tagged nodes may be hidden from view.  They can be restored by clicking on the expansion button, which resembles a plus sign (+) inside a small box.
+
+.. %All of the versions are connected to each other by either solid or
+.. %broken lines. A solid line indicates that the child node is a direct
+.. %descendant of the parent node, meaning the user has made only a single
+.. %change from the older version to the newer version. Likewise, a broken
+.. %line indicates that more than one change has been made, but the
+.. %intermediate versions have not been tagged.  Because most non-trivial
+.. %changes to a workflow take more than action, most edges in a the
+.. %version tree will be shown as these broken lines.
+
+.. topic:: Try it now!
+
+   To see an example of a version tree, load the example vistrail :vtl:`vtk\_book\_3rd\_p189.vt`. All versions will be shown in orange unless your username happens to be "emanuele."  Recall that this tree displays the structure of changes to a workflow, so let's make some changes to see their effect on the version history. In the ``History`` view, select the node tagged ``Almost there``, and then click on the ``Pipeline`` button to switch to a view of the workflow.  Select a connection a [...]
+
+.. _fig-creating_versions:
+
+.. _fig-creating_versions_A:
+
+.. figure:: figures/version_tree/creating_versions_A.png
+   :height: 2.8in
+   :align: center
+
+   All versions created by other users are shown in orange.
+
+.. _fig-creating_versions_B:
+
+.. figure:: figures/version_tree/creating_versions_B.png
+   :height: 2.8in
+   :align: center
+
+   Deleting a connection results in a blue version connected by a solid line.
+
+.. _fig-creating_versions_C:
+
+.. figure:: figures/version_tree/creating_versions_C.png
+   :height: 2.8in
+   :align: center
+
+   More interactions on this version cause additional versions to be created. To save space, these intermediate nodes are hidden, and an expansion button appears on the edge between the current node and the last tagged node.
+
+.. _sec-adding_deleting_tags:
+
+Adding and Deleting Tags
+========================
+
+.. index::
+   pair: tags; adding
+   pair: tags; deleting
+
+.. %As noted above, only certain nodes, including specially tagged ones, are shown by default in the version tree.  To tag a version, simply add meaningful text to the tag text box in the ``Properties`` container and press 'Enter'.  If you would like to change the tag to different text, click in the same text box and modify the string, again hitting 'Enter' when finished.  Note that deleting all of the text in the tag field effectively deletes the tag.  A second way to delete a tag is to [...]
+
+As noted above, only certain nodes, including specially tagged ones, are shown by default in the version tree.  To tag a version, simply 
+click inside a selected node and type some meaningful text. The tag is created when you either click outside the node or press 'Enter'. If you would like to change the tag's text, click inside the node again and modify the text as before. 
+(Alternately, you can also create and modify tags using the ``Tag`` text field in the ``Properties`` panel.)
+
+Note that deleting all of the text in the tag field effectively deletes the tag. A second way to delete a tag is to click the 'X' button to the right of the text box. Removing a tag from a node may cause it to not be displayed in the default version tree view if it doesn't satisfy any of the other criteria for display.
+
+Upgrading Versions
+==================
+
+.. index::
+   pair: tags; upgrading
+
+As module packages are continuously updated, with new versions being released periodically, VisTrails is set up to automatically incorporate module upgrades into existing workflows before they are executed.  In other words, VisTrails upgrades the current vistrail's current version after the execute button is pressed, but prior to execution.  When this happens, a new version is created in the version tree and tagged 'Upgrade'.  You are then free to rename this version if desired.   
+
+After an upgrade, you will not be able to select the original version because the focus is passed to the upgraded version.  However, if you right-click on the original version and select 'Display raw pipeline', this version will keep the focus, which allows you to see its pipeline by pressing the ``Pipeline`` button on the toolbar.  See figure :ref:`Original Pipeline... <fig-raw-pipeline>`.
+
+.. _fig-raw-pipeline:
+
+.. figure:: figures/version_tree/raw_pipeline.png
+   :align: center
+   :width: 2.5in
+
+   Original Pipeline - This figure shows how to view the original pipeline after an upgrade has occurred.
+
+Finally, although VisTrails tags the new version with 'Upgrade' by default, some users prefer the original version's name to be transferred to the upgraded version.  VisTrails will do this if you: select ``Preferences`` from the ``VisTrails`` menu, select the ``Expert Configuration`` tab, and change the ``migrateTags`` value to 'True'. 
+
+Adding Version Annotations
+==========================
+
+.. index::
+   pair: versions; annotations
+   single: notes
+
+In addition to the tag field, the ``Properties`` panel displays information about the user who created the selected version
+and when that version was created.  Also, the ``Notes`` field which allows users to store notes or annotations related to a version.  As with tags, adding notes to a version is as easy as selecting the desired version and modifying the text field.  Notes are
+automatically saved when you save the vistrail file.  Finally, a thumbnail is displayed in the preview portion of the panel if the version has been successfully executed.
+
+Navigating Versions
+===================
+
+.. index::
+   pair: versions; navigating
+   single: undo
+   single: redo
+
+Clicking on nodes in the version tree is not the only way to navigate different versions of a workflow; you can also use ``Undo`` (Ctrl-z) and ``Redo`` (Ctrl-Shift-z).  Because the version tree captures all changes to a workflow, undo and redo not only revert or reinstate changes to a workflow, but also change the currently selected version in the version tree.  More precisely, undoing a change in a workflow is exactly the same as selecting the parent of the current node in the version t [...]
+
+.. _sec-versions-diff:
+
+Comparing Versions
+==================
+
+.. index::
+   pair: versions; comparing
+   single: visual diff; see versions, comparing
+   single: diff; see versions, comparing
+
+While selecting versions in the ``History`` view and using the ``Pipeline`` view to examine each version is extremely useful, this approach can be cumbersome when trying to compare two different versions.  To help with such a comparison, |vistrails| provides a ``Version Difference`` mechanism for quickly comparing two versions.  This is done by dragging one version and dropping it onto another, after which a ``Visual Diff`` tab will open (see Figure :ref:`A Visual Diff showing the differ [...]
+
+.. index::
+   single: legend
+   pair: parameters; differences
+
+In the new tab, the difference is displayed in a manner that is very similar to the pipeline view, but modules and connections are colored based on similarity.  Dark gray indicates those modules and connections that are shared between the two versions; orange and blue show modules and connections that exist in one workflow and not the other; and light gray modules are those where parameters between the two versions differ.  The Legend, which is displayed in the ``Diff Properties`` panel  [...]
+
+.. _fig-visual_diff:
+
+.. figure:: figures/version_tree/visual_diff.png
+   :width: 5in
+   :align: center
+
+   A ``Visual Diff`` showing the difference between version ``z-space`` and version ``textureMapper``.
+
+.. topic:: Try it now!
+
+  To try out this feature, open the :vtl:`lung.vt` example vistrail, and click the ``History`` button. Within the version tree, click and drag the ``z-space`` version to the ``textureMapper`` version.  After the diff appears, select ``View`` :math:`\rightarrow` ``Diff Properties`` (if the ``Diff Properties`` panel is not visible), and then click on the ``vtkRenderer`` module to see the parameter differences.  We can see that one of the changes from ``z-space`` to ``textureMapper`` was to [...]
+
+.. index:: versions
diff --git a/doc/usersguide/vistrails_server.rst b/doc/usersguide/vistrails_server.rst
new file mode 100644
index 0000000..3610c20
--- /dev/null
+++ b/doc/usersguide/vistrails_server.rst
@@ -0,0 +1,124 @@
+.. _chap-vistrails-server:
+
+***********************
+VisTrails Server Setup
+***********************
+
+.. index:: server 
+
+* lets assume that everything is going to be put in the /server dir::
+
+    $ cd /server
+    $ mkdir vistrails
+
+* put VisTrails Source in vistrails/ folder::
+
+    $ cd vistrails
+    $ git clone git://vistrails.org:vistrails.git git # or just download the latest release or nightly build
+
+* make a logs dir for the server::
+
+    $ mkdir logs
+
+* if you are running the server without crowdLabs or as a remote server, you need to create a media directory with the following structure::
+
+    /path/to/media_dir/
+                       wf_execution/
+                       graphs/
+                              workflows/
+                              vistrails/
+                       medleys/
+                              images/
+
+  You can run ``python scripts/create_server_media_dir_structure.py /path/to/media_dir`` to create the directory structure automatically.
+
+* Determine how you will start the vistrails server. You have a choice of using Xvfb or not. If you use it, /server/vistrails/git/scripts/start_vistrails_xvfb.sh is what you will use, otherwise, use start_vistrails.sh
+
+Using Xvfb is slower and not recommended if your workflows will make use of volume rendering or other graphics-card intensive techniques. 
+
+.. _sec-server-using-xvfb:
+
+Using Xvfb
+===========
+
+* edit /server/vistrails/git/scripts/start_vistrails_xvfb.sh file and make sure it is consistent with your system setup::
+
+    LOG_DIR=/server/vistrails/logs
+    Xvfb_CMD=/usr/bin/Xvfb
+    VIRTUAL_DISPLAY=":6"
+    VISTRAILS_DIR=/server/vistrails/git/vistrails
+    ADDRESS="<your_server.com>"
+    PORT="8081" #the port where the server will listen for requests
+    CONF_FILE="server.cfg"
+    NUMBER_OF_OTHER_VISTRAILS_INSTANCES="1"
+    MULTI_OPTION="-M" #execute the main instance multithreaded
+
+* The setup above will execute 2 instances of the server. You can add more instances by changing the variable NUMBER_OF_OTHER_VISTRAILS_INSTANCES. When using multiple instances, the ports and virtual displays will be used incrementally, so if the main instance is using port 8081 and virtual display :6, the next instance will use port 8082 and virtual display :7, and so on. 
+
+.. _sec-server-using-x-directly:
+
+Connecting to X server directly
+===============================
+
+* If you decide no to use Xvfb, edit /server/vistrails/git/scripts/start_vistrails.sh file and make sure it is consistent with your system setup::
+
+    LOG_DIR=/server/vistrails/logs
+    VISTRAILS_DIR=/server/vistrails/git/vistrails
+    ADDRESS="<your_server.com>"
+    PORT="8081" #the port where the server will listen for requests
+    CONF_FILE="server.cfg"
+    NUMBER_OF_OTHER_VISTRAILS_INSTANCES="2"
+    MULTI_OPTION="-M" #execute the main instance multithreaded
+
+* The setup above will execute 3 instances of the server. You can add or remove more instances by changing the variable NUMBER_OF_OTHER_VISTRAILS_INSTANCES. When using multiple instances, the ports will be used incrementally, so if the main instance is using port 8081, the next instance will use port 8082, and so on. 
+
+.. _sec-server-basic-configuration:
+
+Basic Configuration
+===================
+
+* If the vistrails server will receive requests from the outside world and if you are using a firewall, make sure the ports used by the vistrails server are open and accessible.
+
+* create a file called server.cfg in /server/vistrails/git/vistrails/ as follows::
+
+    [access]
+    permitted_addresses = localhost, 127.0.0.1, <crowdlabs-server-address>
+
+    [media]
+    media_dir=/server/crowdlabs/site_media/media
+
+    [database]
+    host = <vistrail database address>
+    read_user = <read user>
+    read_password = <read password>
+    write_user = <write user>
+    write_password = <write user password>
+
+    [script]
+    script_file=/server/vistrails/git/scripts/start_vistrails.sh
+    virtual_display=<virtual display number>
+
+* change permitted_addresses variable in to include the address of the machine running of the crowdLabs server (or other machines you want to be able to connect to the server)::
+
+    [access]
+    permitted_addresses = localhost, 127.0.0.1, <crowdlabs-server-address>
+
+
+* Add the password for the full permission mysql user created in :ref:`VisTrails Database Setup <mysql-full-perm-user>`::
+
+    write_user = <write user>
+    write_password = <write user password>
+
+* Configure the full path to the script file and if you are using Xvfb, also specify the virtual display of the main instance::
+
+    [script]
+    script_file=/server/vistrails/git/scripts/start_vistrails.sh
+    virtual_display=0 #not using any display
+
+* run vistrails in server mode::
+
+    $ cd /server/vistrails/git/scripts
+    # If you are running Xvfb:
+    $ ./start_vistrails_xvfb.sh
+    # Or if you are connecting to X server directly:
+    $ ./start_vistrails.sh
diff --git a/doc/usersguide/vtl/README b/doc/usersguide/vtl/README
new file mode 100644
index 0000000..7bd4c34
--- /dev/null
+++ b/doc/usersguide/vtl/README
@@ -0,0 +1,21 @@
+To link to examples you need to put a vtl file on the server first
+
+To create  a link to an example:
+
+1. Create the example in examples/usersguide/, or use an existing example
+
+2. Create a vtl file containing a link to the example like this:
+   <vtlink filename="@examples/usersguide/global_variables.vt" version="60"/>
+   Name it something like global_variables.vtl
+   Place it in the doc/usersguide/vtl directory
+
+3. Create the link in the usersguide like this:
+   Using macro (title will be same as vt filename):
+       :vtl:`terminator.vt`
+   Using macro with custom title:
+       :vtl:`(Open result) <global_variables.vt>`
+   Raw version:
+   `(Open result) <http://www.vistrails.org/usersguide/v2.1/examples/global_variables.vtl>`_
+
+4. Copy the new vtl files to the server:
+    scp doc/usersguide/vtl/* vistrails.org:/srv/wiki/vistrails/usersguide/v2.1/examples/
\ No newline at end of file
diff --git a/doc/usersguide/vtl/bikes.vtl b/doc/usersguide/vtl/bikes.vtl
new file mode 100644
index 0000000..35a3bce
--- /dev/null
+++ b/doc/usersguide/vtl/bikes.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/bikes.vt"/>
diff --git a/doc/usersguide/vtl/brain_vistrail.vtl b/doc/usersguide/vtl/brain_vistrail.vtl
new file mode 100644
index 0000000..847f11d
--- /dev/null
+++ b/doc/usersguide/vtl/brain_vistrail.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/brain_vistrail.vt"/>
diff --git a/doc/usersguide/vtl/cfassistant1.vtl b/doc/usersguide/vtl/cfassistant1.vtl
new file mode 100644
index 0000000..0d85593
--- /dev/null
+++ b/doc/usersguide/vtl/cfassistant1.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/cfassistant.vt" version="example1"/>
diff --git a/doc/usersguide/vtl/cfassistant2.vtl b/doc/usersguide/vtl/cfassistant2.vtl
new file mode 100644
index 0000000..154946a
--- /dev/null
+++ b/doc/usersguide/vtl/cfassistant2.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/cfassistant.vt" version="example2"/>
diff --git a/doc/usersguide/vtl/global_variables1.vtl b/doc/usersguide/vtl/global_variables1.vtl
new file mode 100644
index 0000000..46cef35
--- /dev/null
+++ b/doc/usersguide/vtl/global_variables1.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/global_variables.vt" version="60"/>
diff --git a/doc/usersguide/vtl/lung.vtl b/doc/usersguide/vtl/lung.vtl
new file mode 100644
index 0000000..b199453
--- /dev/null
+++ b/doc/usersguide/vtl/lung.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/lung.vt"/>
diff --git a/doc/usersguide/vtl/mashups1.vtl b/doc/usersguide/vtl/mashups1.vtl
new file mode 100644
index 0000000..6a243f1
--- /dev/null
+++ b/doc/usersguide/vtl/mashups1.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/mashups.vt" mashuptrail="9e7148ee-2518-11e3-b863-3c07543dba07" mashupVersion="5"/>
diff --git a/doc/usersguide/vtl/offscreen.vtl b/doc/usersguide/vtl/offscreen.vtl
new file mode 100644
index 0000000..0ce5aed
--- /dev/null
+++ b/doc/usersguide/vtl/offscreen.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/offscreen.vt"/>
diff --git a/doc/usersguide/vtl/pe1.vtl b/doc/usersguide/vtl/pe1.vtl
new file mode 100644
index 0000000..927da63
--- /dev/null
+++ b/doc/usersguide/vtl/pe1.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/parameter_exploration.vt" parameterExploration="1"/>
diff --git a/doc/usersguide/vtl/pe2.vtl b/doc/usersguide/vtl/pe2.vtl
new file mode 100644
index 0000000..b9f9abb
--- /dev/null
+++ b/doc/usersguide/vtl/pe2.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/parameter_exploration.vt" parameterExploration="2"/>
diff --git a/doc/usersguide/vtl/pe3.vtl b/doc/usersguide/vtl/pe3.vtl
new file mode 100644
index 0000000..f4a4ad2
--- /dev/null
+++ b/doc/usersguide/vtl/pe3.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/parameter_exploration.vt" parameterExploration="3"/>
diff --git a/doc/usersguide/vtl/pe4.vtl b/doc/usersguide/vtl/pe4.vtl
new file mode 100644
index 0000000..dda7eb5
--- /dev/null
+++ b/doc/usersguide/vtl/pe4.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/usersguide/parameter_exploration.vt" parameterExploration="4"/>
diff --git a/doc/usersguide/vtl/protein_visualization.vtl b/doc/usersguide/vtl/protein_visualization.vtl
new file mode 100644
index 0000000..1a0887a
--- /dev/null
+++ b/doc/usersguide/vtl/protein_visualization.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/protein_visualization.vt"/>
diff --git a/doc/usersguide/vtl/spx.vtl b/doc/usersguide/vtl/spx.vtl
new file mode 100644
index 0000000..7efe5b8
--- /dev/null
+++ b/doc/usersguide/vtl/spx.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/spx.vt"/>
diff --git a/doc/usersguide/vtl/terminator.vtl b/doc/usersguide/vtl/terminator.vtl
new file mode 100644
index 0000000..5c890af
--- /dev/null
+++ b/doc/usersguide/vtl/terminator.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/terminator.vt"/>
diff --git a/doc/usersguide/vtl/triangle_area.vtl b/doc/usersguide/vtl/triangle_area.vtl
new file mode 100644
index 0000000..565ec42
--- /dev/null
+++ b/doc/usersguide/vtl/triangle_area.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/triangle_area.vt"/>
diff --git a/doc/usersguide/vtl/vtk.vtl b/doc/usersguide/vtl/vtk.vtl
new file mode 100644
index 0000000..2354b88
--- /dev/null
+++ b/doc/usersguide/vtl/vtk.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/vtk.vt"/>
diff --git a/doc/usersguide/vtl/vtk_book_3rd_p189.vtl b/doc/usersguide/vtl/vtk_book_3rd_p189.vtl
new file mode 100644
index 0000000..3fcf15f
--- /dev/null
+++ b/doc/usersguide/vtl/vtk_book_3rd_p189.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/vtk_book_3rd_p189.vt"/>
diff --git a/doc/usersguide/vtl/vtk_http.vtl b/doc/usersguide/vtl/vtk_http.vtl
new file mode 100644
index 0000000..be96537
--- /dev/null
+++ b/doc/usersguide/vtl/vtk_http.vtl
@@ -0,0 +1 @@
+<vtlink filename="@examples/vtk_http.vt"/>
diff --git a/doc/vistrails.xsd b/doc/vistrails.xsd
new file mode 100644
index 0000000..3d67783
--- /dev/null
+++ b/doc/vistrails.xsd
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2006 sp2 U (http://www.altova.com) by Emanuele Santos (University of UTAH) -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<xs:element name="visTrail">
+		<xs:annotation>
+			<xs:documentation>Comment describing your root element</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:sequence maxOccurs="unbounded">
+				<xs:sequence maxOccurs="unbounded">
+					<xs:element name="action">
+						<xs:complexType>
+							<xs:sequence>
+								<xs:element name="notes" minOccurs="0"/>
+								<xs:choice>
+									<xs:sequence maxOccurs="unbounded">
+										<xs:element name="move">
+											<xs:complexType>
+												<xs:attribute name="dx" type="xs:float"/>
+												<xs:attribute name="dy" type="xs:float"/>
+												<xs:attribute name="id" type="xs:int"/>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+									<xs:element name="object">
+										<xs:complexType>
+											<xs:attribute name="cache" type="xs:int"/>
+											<xs:attribute name="id" type="xs:int"/>
+											<xs:attribute name="name" type="xs:string"/>
+											<xs:attribute name="x" type="xs:float"/>
+											<xs:attribute name="y" type="xs:float"/>
+										</xs:complexType>
+									</xs:element>
+									<xs:sequence maxOccurs="unbounded">
+										<xs:element name="set">
+											<xs:complexType>
+												<xs:attribute name="function" type="xs:string"/>
+												<xs:attribute name="functionId" type="xs:int"/>
+												<xs:attribute name="moduleId" type="xs:int"/>
+												<xs:attribute name="parameter" type="xs:string"/>
+												<xs:attribute name="parameterId" type="xs:int"/>
+												<xs:attribute name="type" type="xs:string"/>
+												<xs:attribute name="value" type="xs:anySimpleType"/>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+									<xs:element name="connect">
+										<xs:complexType>
+											<xs:choice>
+												<xs:element name="filterInput">
+													<xs:complexType>
+														<xs:attribute name="destId" type="xs:int"/>
+														<xs:attribute name="destPort" type="xs:int"/>
+														<xs:attribute name="sourceId" type="xs:int"/>
+														<xs:attribute name="sourcePort" type="xs:int"/>
+													</xs:complexType>
+												</xs:element>
+												<xs:element name="objectInput">
+													<xs:complexType>
+														<xs:attribute name="destId" type="xs:int"/>
+														<xs:attribute name="name" type="xs:string"/>
+														<xs:attribute name="sourceId" type="xs:int"/>
+													</xs:complexType>
+												</xs:element>
+											</xs:choice>
+											<xs:attribute name="id" type="xs:int"/>
+										</xs:complexType>
+									</xs:element>
+									<xs:sequence maxOccurs="unbounded">
+										<xs:element name="connection">
+											<xs:complexType>
+												<xs:attribute name="connectionId" type="xs:int"/>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+									<xs:sequence maxOccurs="unbounded">
+										<xs:element name="module">
+											<xs:complexType>
+												<xs:attribute name="moduleId" type="xs:int"/>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+									<xs:element name="function">
+										<xs:complexType>
+											<xs:attribute name="functionId" type="xs:int"/>
+											<xs:attribute name="moduleId" type="xs:int"/>
+										</xs:complexType>
+									</xs:element>
+								</xs:choice>
+							</xs:sequence>
+							<xs:attribute name="parent" type="xs:int"/>
+							<xs:attribute name="time" type="xs:int"/>
+							<xs:attribute name="what" type="xs:string"/>
+							<xs:attribute name="date" type="xs:string" use="optional"/>
+							<xs:attribute name="user" type="xs:string" use="optional"/>
+							<xs:attribute name="notes" type="xs:string" use="optional"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+				<xs:sequence minOccurs="0" maxOccurs="unbounded">
+					<xs:element name="tag">
+						<xs:complexType>
+							<xs:attribute name="name" type="xs:string"/>
+							<xs:attribute name="time" type="xs:int"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+				<xs:sequence minOccurs="0" maxOccurs="unbounded">
+					<xs:element name="macro">
+						<xs:complexType>
+							<xs:sequence minOccurs="0" maxOccurs="unbounded">
+								<xs:element name="action">
+									<xs:complexType>
+										<xs:attribute name="time" type="xs:int"/>
+									</xs:complexType>
+								</xs:element>
+							</xs:sequence>
+							<xs:attribute name="name" type="xs:string"/>
+							<xs:attribute name="id" type="xs:int"/>
+							<xs:attribute name="desc" type="xs:string" use="optional"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+</xs:schema>
diff --git a/examples/EMBOSS_webservices.vt b/examples/EMBOSS_webservices.vt
new file mode 100644
index 0000000..076a2ce
Binary files /dev/null and b/examples/EMBOSS_webservices.vt differ
diff --git a/examples/KEGGPathway.vt b/examples/KEGGPathway.vt
new file mode 100644
index 0000000..3cb82e8
Binary files /dev/null and b/examples/KEGGPathway.vt differ
diff --git a/examples/KEGG_SearchEntities_webservice.vt b/examples/KEGG_SearchEntities_webservice.vt
new file mode 100644
index 0000000..cf20cbb
Binary files /dev/null and b/examples/KEGG_SearchEntities_webservice.vt differ
diff --git a/examples/KEGG_webservices.vt b/examples/KEGG_webservices.vt
new file mode 100644
index 0000000..4e5ec1f
Binary files /dev/null and b/examples/KEGG_webservices.vt differ
diff --git a/examples/XSLTSample.xsl b/examples/XSLTSample.xsl
new file mode 100644
index 0000000..d291c4a
--- /dev/null
+++ b/examples/XSLTSample.xsl
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<xsl:stylesheet
+  version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:output method="xml" encoding="UTF-8"/>
+  <xsl:template match="/">
+    <html>
+      <head><title>XSLT Sample</title></head>
+      <body>
+         <h2>The Sequence for the Given Gene is: </h2>
+                <ul>
+                  <li>
+        <xsl:value-of select="DDBJXML/SEQUENCE"/> 
+                  </li>
+                </ul>
+<h3>Please fill in the following inputs and Submit:</h3>
+<xsl:text disable-output-escaping="yes"><![CDATA[
+  <form method="post" action="http://geon01.sdsc.edu:8164/pt2/jsp/ptf.jsp">      
+                <b>Program: </b><input name="program" size="20" type="text"><BR>
+                <b>Database: </b><input name="database" size="20" type="text"><BR>
+                <b>Query: </b><input name="query" size="20" type="text"><BR>
+                <INPUT TYPE="submit" VALUE="Make BLAST search using the specified inputs">        
+</form>
+]]></xsl:text>   
+      </body>
+    </html>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/examples/afront.xml b/examples/afront.xml
new file mode 100644
index 0000000..ad95b2b
--- /dev/null
+++ b/examples/afront.xml
@@ -0,0 +1,803 @@
+  <visTrail version="0.3.0">
+    <action date="01 Mar 2007 17:56:06" parent="0" time="1" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="0" name="Afront" x="9.0" y="273.0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:12" parent="1" time="2" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-46.0" dy="-38.0" id="0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:12" parent="2" time="3" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="1" name="File" x="-58.0" y="381.0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:16" parent="3" time="4" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="10.0" dy="-84.0" id="0"/>
+      <move dx="30.0" dy="-45.0" id="1"/>
+    </action>
+    <action date="01 Mar 2007 17:56:16" parent="4" time="5" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="name" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="01 Mar 2007 17:56:24" parent="5" time="6" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="name" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="/home/cscheid/cscheid_old/meshes/bunny.off"/>
+    </action>
+    <action date="01 Mar 2007 17:56:25" parent="6" time="7" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="name" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="/home/cscheid/cscheid_old/meshes/bunny.off"/>
+    </action>
+    <action date="01 Mar 2007 17:56:29" parent="7" time="8" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="eta" functionId="0" moduleId="0" parameter="eta" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:32" parent="8" time="9" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="eta" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="0.8"/>
+    </action>
+    <action date="01 Mar 2007 17:56:34" parent="9" time="10" user="cscheid" what="deleteFunction">
+      <notes>
+        None
+      </notes>
+      <function functionId="0" moduleId="0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:35" parent="10" time="11" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="rho" functionId="0" moduleId="0" parameter="rho" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:37" parent="11" time="12" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="rho" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="0.8"/>
+    </action>
+    <action date="01 Mar 2007 17:56:38" parent="12" time="13" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="rho" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="0.8"/>
+    </action>
+    <action date="01 Mar 2007 17:56:41" parent="13" time="14" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="0" destinationModule="Afront" destinationPort="file(File)" id="0" sourceId="1" sourceModule="File" sourcePort="self(File)"/>
+    </action>
+    <action date="01 Mar 2007 17:56:50" parent="14" time="15" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="5.0" dy="26.0" id="0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:50" parent="15" time="16" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="2" name="MeshQualityHistogram" x="35.0" y="46.0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:53" parent="16" time="17" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-23.0" dy="25.0" id="0"/>
+    </action>
+    <action date="01 Mar 2007 17:56:53" parent="17" time="18" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="2" destinationModule="MeshQualityHistogram" destinationPort="file(File)" id="1" sourceId="0" sourceModule="Afront" sourcePort="output(File)"/>
+    </action>
+    <action date="01 Mar 2007 17:56:57" parent="18" time="19" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-53.0" dy="26.0" id="2"/>
+    </action>
+    <action date="01 Mar 2007 17:56:57" parent="19" time="20" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="3" name="PythonSource" x="-30.0" y="-86.0"/>
+    </action>
+    <action date="01 Mar 2007 17:58:52" parent="20" time="21" user="cscheid" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="3" portName="input" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="01 Mar 2007 17:58:52" parent="21" time="22" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20self.getInputFromPort%28%27input%27%29%0A%0Av%20%3D%201.0%0Afor%20l%20in%20f.readlines%28%29%3A%0A%20%20%20v%20-%3D%20float%28l%29%20/%20100.0%0A%0Aprint%20%22mesh%20quality%3A%20%22%2C%20v"/>
+    </action>
+    <action date="01 Mar 2007 17:58:54" parent="22" time="23" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="3" destinationModule="PythonSource" destinationPort="input(File)" id="2" sourceId="2" sourceModule="MeshQualityHistogram" sourcePort="output(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:00:32" parent="23" time="24" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20self.getInputFromPort%28%27input%27%29%0A%0Av%20%3D%201.0%0Afor%20l%20in%20file%28f.name%29.readlines%28%29%3A%0A%20%20%20v%20-%3D%20float%28l%29%20/%20100.0%0A%0Aprint%20%22mesh%20quality%3A%20%22%2C%20v"/>
+    </action>
+    <action date="01 Mar 2007 18:00:48" parent="24" time="25" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20self.getInputFromPort%28%27input%27%29%0A%0Av%20%3D%201.0%0Afor%20l%20in%20file%28f.name%29.readlines%28%29%3A%0A%20%20%20print%20l%0A%20%20%20v%20-%3D%20float%28l%29%20/%20100.0%0A%0Aprint%20%22mesh%20quality%3A%20%22%2C%20v"/>
+    </action>
+    <action date="01 Mar 2007 18:09:13" parent="25" time="26" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20self.getInputFromPort%28%27input%27%29%0A%0Av%20%3D%201.0%0Afor%20l%20in%20file%28f.name%29.readlines%28%29%3A%0A%20%20%20v%20-%3D%20float%28l%29%20/%20100.0%0A%0Aprint%20%22mesh%20quality%3A%20%22%2C%20v"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="0" time="27" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="0" name="vtkDataSetReader" x="50.4689536324" y="-75.039097946"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="27" time="28" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="1" name="OutputPort" x="66.5683979218" y="-176.342434481"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="28" time="29" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="2" name="InputPort" x="72.8614246679" y="145.860534924"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="29" time="30" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="3" name="PythonSource" x="50.127651043" y="23.962638969"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="30" time="31" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="0" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="31" time="32" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="1" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="32" time="33" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="name" functionId="0" moduleId="2" parameter="<no description>" parameterId="0" type="String" value="input_file"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="33" time="34" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="2" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="34" time="35" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="%23%20Extracts%20the%20internal%20file%20name%20so%20VTK%20can%20use%20it%0A%23%20Also%2C%20makes%20local%20copy%20so%20that%20the%20file%20survives%20filepool%0A%23%20cleanup.%0Afrom%20packages.spreadsheet.spreadsheet_controller%20import%20spreadsheetController%0Aself.checkInputPort%28%22file%22%29%0Awindow%20%3D%20spreadsheetController.findSpreadshee [...]
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="35" time="36" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="3" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="36" time="37" user="cscheid" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="3" portName="file" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="37" time="38" user="cscheid" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="3" portName="name" portSpec="(String)" portType="output"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="38" time="39" user="cscheid" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="3" portName="file" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="39" time="40" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="1" destinationModule="OutputPort" destinationPort="InternalPipe(Module)" id="0" sourceId="0" sourceModule="vtkDataSetReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="40" time="41" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="0" destinationModule="vtkDataReader" destinationPort="SetFileName(String)" id="1" sourceId="3" sourceModule="PythonSource" sourcePort="name(String)"/>
+    </action>
+    <action date="01 Mar 2007 18:09:26" parent="41" time="42" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="3" destinationModule="PythonSource" destinationPort="file(File)" id="2" sourceId="2" sourceModule="InputPort" sourcePort="InternalPipe(Variant)"/>
+    </action>
+    <action date="01 Mar 2007 18:10:45" parent="26" time="43" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="4" name="MeshFilter" x="-260.146183261" y="3.39321108601"/>
+    </action>
+    <action date="01 Mar 2007 18:10:48" parent="43" time="44" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="output_format" functionId="0" moduleId="4" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:12:31" parent="44" time="45" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="output_format" functionId="0" moduleId="4" parameter="<no description>" parameterId="0" type="String" value=".vtk"/>
+    </action>
+    <action date="01 Mar 2007 18:12:34" parent="45" time="46" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="4" destinationModule="MeshFilter" destinationPort="input_file(File)" id="3" sourceId="0" sourceModule="Afront" sourcePort="output(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:13:38" parent="46" time="47" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="5" name="vtkVistrailsFileReader" x="-272.292020374" y="-128.719864177"/>
+    </action>
+    <action date="01 Mar 2007 18:13:41" parent="47" time="48" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="5" destinationModule="vtkVistrailsFileReader" destinationPort="input_file(File)" id="4" sourceId="4" sourceModule="MeshFilter" sourcePort="output_file(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="48" time="49" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="6" name="VTKCell" x="-180.664206774" y="-165.520338043"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="49" time="50" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="7" name="vtkDataSetMapper" x="-237.282186703" y="301.998142802"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="50" time="51" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="8" name="vtkRenderer" x="-220.460112232" y="-3.1201219181"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="51" time="52" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="9" name="vtkActor" x="-258.041526728" y="119.069528254"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="52" time="53" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="6" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="53" time="54" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="ScalarVisibilityOn" functionId="0" moduleId="7" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="54" time="55" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="7" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="55" time="56" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="8" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="56" time="57" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="9" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="57" time="58" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="6" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="5" sourceId="8" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="58" time="59" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="9" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="6" sourceId="7" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:08" parent="59" time="60" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="8" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="7" sourceId="9" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:14" parent="60" time="61" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-39.0229417805" dy="-559.894382068" id="6"/>
+      <move dx="-39.0229417805" dy="-559.894382068" id="7"/>
+      <move dx="-39.0229417805" dy="-559.894382068" id="8"/>
+      <move dx="-39.0229417805" dy="-559.894382068" id="9"/>
+    </action>
+    <action date="01 Mar 2007 18:14:14" parent="61" time="62" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="7" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="8" sourceId="5" sourceModule="vtkVistrailsFileReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="0" time="63" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="0" name="VTKCell" x="-209.687148555" y="-715.414720111"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="63" time="64" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="1" name="vtkActor" x="-287.064468509" y="-430.824853814"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="64" time="65" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="2" name="vtkVistrailsFileReader" x="-262.292020374" y="-118.719864177"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="65" time="66" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="3" name="vtkRenderer" x="-249.483054013" y="-553.014503986"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="66" time="67" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="4" name="vtkDataSetMapper" x="-266.305128484" y="-247.896239266"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="67" time="68" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="0" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="68" time="69" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="1" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="69" time="70" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="2" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="70" time="71" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="3" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="71" time="72" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="ScalarVisibilityOn" functionId="0" moduleId="4" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="72" time="73" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="4" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="73" time="74" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="0" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="0" sourceId="3" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="74" time="75" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="1" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="1" sourceId="4" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="75" time="76" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="3" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="2" sourceId="1" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:33" parent="76" time="77" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="4" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="3" sourceId="2" sourceModule="vtkVistrailsFileReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:41" parent="77" time="78" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="5" name="InputPort" x="-312.960721232" y="26.921352364"/>
+    </action>
+    <action date="01 Mar 2007 18:14:42" parent="78" time="79" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="2" destinationModule="vtkVistrailsFileReader" destinationPort="input_file(File)" id="4" sourceId="5" sourceModule="InputPort" sourcePort="InternalPipe(Variant)"/>
+    </action>
+    <action date="01 Mar 2007 18:14:56" parent="62" time="80" user="cscheid" what="deleteConnection">
+      <notes>
+        None
+      </notes>
+      <connection connectionId="5"/>
+      <connection connectionId="7"/>
+      <connection connectionId="8"/>
+      <connection connectionId="4"/>
+      <connection connectionId="6"/>
+    </action>
+    <action date="01 Mar 2007 18:14:56" parent="80" time="81" user="cscheid" what="deleteModule">
+      <notes>
+        None
+      </notes>
+      <module moduleId="8"/>
+      <module moduleId="5"/>
+      <module moduleId="7"/>
+      <module moduleId="9"/>
+      <module moduleId="6"/>
+    </action>
+    <action date="01 Mar 2007 18:15:01" parent="81" time="82" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="10" name="MeshCell" x="-269.411673235" y="-189.161387591"/>
+    </action>
+    <action date="01 Mar 2007 18:15:04" parent="82" time="83" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="10" destinationModule="MeshCell" destinationPort="input_file(File)" id="9" sourceId="4" sourceModule="MeshFilter" sourcePort="output_file(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:15:10" parent="83" time="84" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="74.5181223843" dy="-45.8573060826" id="2"/>
+      <move dx="74.5181223843" dy="-45.8573060826" id="3"/>
+      <move dx="11.4643265207" dy="82.1610067314" id="10"/>
+    </action>
+    <action date="01 Mar 2007 18:15:10" parent="84" time="85" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="11" name="MeshFilter" x="-250.146183261" y="13.393211086"/>
+    </action>
+    <action date="01 Mar 2007 18:15:10" parent="85" time="86" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="output_format" functionId="0" moduleId="11" parameter="<no description>" parameterId="0" type="String" value=".vtk"/>
+    </action>
+    <action date="01 Mar 2007 18:15:10" parent="86" time="87" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="11" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:15:13" parent="87" time="88" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-87.8931699917" dy="179.607782157" id="11"/>
+    </action>
+    <action date="01 Mar 2007 18:15:13" parent="88" time="89" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="11" destinationModule="MeshFilter" destinationPort="input_file(File)" id="10" sourceId="1" sourceModule="File" sourcePort="self(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:15:14" parent="89" time="90" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="12" name="MeshCell" x="-247.947346715" y="-97.000380859"/>
+    </action>
+    <action date="01 Mar 2007 18:15:14" parent="90" time="91" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="12" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:15:17" parent="91" time="92" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-187.250666504" dy="141.393360421" id="12"/>
+    </action>
+    <action date="01 Mar 2007 18:15:17" parent="92" time="93" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="12" destinationModule="MeshCell" destinationPort="input_file(File)" id="11" sourceId="11" sourceModule="MeshFilter" sourcePort="output_file(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="93" time="94" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-265.590231062" dy="-26.7500952149" id="1"/>
+      <move dx="-107.000380859" dy="-204.447156285" id="11"/>
+      <move dx="-11.4643265207" dy="-152.857686942" id="12"/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="94" time="95" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="13" name="MplFigureCell" x="37.0688549561" y="-60.0259508645"/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="95" time="96" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="14" name="MplPlot" x="-104.504769347" y="212.057733157"/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="96" time="97" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="15" name="MplFigure" x="-2.3575207408" y="92.971924974"/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="97" time="98" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="13" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="98" time="99" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0Afig%20%3D%20gcf%28%29%0A%0Aax3d%20%3D%20axes3d.Axes3D%28fig%29%0Aplt%20%3D%20fig.axes.append%28ax3d%29%0A%0Adelta%20%3D%20pi%20/%20199.0%0Au%20%3D%20arange%280%2C%202%2Api%2B%28delta%2A2%29%2C%20delta%2A2%29%0Av%20%3D%20arange%280%2C%20pi%2Bdelta%2C%20delta%29%0A%0Ax%20%3D%20outer%28cos%28u%29%2Csin%28v%29 [...]
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="99" time="100" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="14" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="100" time="101" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="15" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:16:57" parent="101" time="102" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="13" destinationModule="MplFigureCell" destinationPort="FigureManager(MplFigureManager)" id="12" sourceId="15" sourceModule="MplFigure" sourcePort="FigureManager(MplFigureManager)"/>
+    </action>
+    <action date="01 Mar 2007 18:16:58" parent="102" time="103" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="15" destinationModule="MplFigure" destinationPort="Script(String)" id="13" sourceId="14" sourceModule="MplPlot" sourcePort="source(String)"/>
+    </action>
+    <action date="01 Mar 2007 18:19:45" parent="103" time="104" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-187.250666504" dy="-460.483781913" id="13"/>
+      <move dx="-89.8038910785" dy="-443.287292132" id="14"/>
+      <move dx="-171.96489781" dy="-433.733686698" id="15"/>
+    </action>
+    <action date="01 Mar 2007 18:19:45" parent="104" time="105" user="cscheid" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="14" portName="inputFile" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="01 Mar 2007 18:19:45" parent="105" time="106" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0Afig%20%3D%20gcf%28%29%0A%0Aplot%28array%28%5B0%2C%201%2C%202%2C%203%5D%29%2C%20array%28%5B1%2C%203%2C%201%2C%203%5D%29%29%0A"/>
+    </action>
+    <action date="01 Mar 2007 18:19:52" parent="106" time="107" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="14" destinationModule="MplPlot" destinationPort="inputFile(File)" id="14" sourceId="2" sourceModule="MeshQualityHistogram" sourcePort="output(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:19:53" parent="107" time="108" user="cscheid" what="deleteConnection">
+      <notes>
+        None
+      </notes>
+      <connection connectionId="2"/>
+    </action>
+    <action date="01 Mar 2007 18:19:53" parent="108" time="109" user="cscheid" what="deleteModule">
+      <notes>
+        None
+      </notes>
+      <module moduleId="3"/>
+    </action>
+    <action date="01 Mar 2007 18:21:37" parent="109" time="110" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0Afig%20%3D%20gcf%28%29%0A%0Ax%20%3D%20arange%280.0%2C%201.0%2C%201.0/100.0%29%0Ay%20%3D%20array%28%5Bfloat%28x%29%20for%20x%20in%20file%28inputFile.name%29%5D%29%0A%0Aplot%28x%2C%20y%29%0A"/>
+    </action>
+    <action date="01 Mar 2007 18:23:36" parent="110" time="111" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0AinputFile%20%3D%20self.getInputFromPort%28%27inputFile%27%29%0A%0Afig%20%3D%20gcf%28%29%0A%0Ax%20%3D%20arange%280.0%2C%201.0%2C%201.0/100.0%29%0Ay%20%3D%20array%28%5Bfloat%28x%29%20for%20x%20in%20file%28inputFile.name%29%5D%29%0A%0Aplot%28x%2C%20y%29%0A"/>
+    </action>
+    <action date="01 Mar 2007 18:24:06" parent="111" time="112" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0AinputFile%20%3D%20self.getInputFromPort%28%27inputFile%27%29%0A%0Afig%20%3D%20gcf%28%29%0A%0Ax%20%3D%20arange%280.0%2C%201.0%2C%201.0/100.0%29%0Ay%20%3D%20array%28%5Bfloat%28x%29%20for%20x%20in%20file%28inputFile.name%29%5D%29%0A%0Aprint%20x%0A%0Aprint%20y%0A%0Aplot%28x%2C%20y%29%0A"/>
+    </action>
+    <action date="01 Mar 2007 18:24:38" parent="112" time="113" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0AinputFile%20%3D%20self.getInputFromPort%28%27inputFile%27%29%0A%0Afig%20%3D%20gcf%28%29%0A%0Ax%20%3D%20arange%280.0%2C%201.0%2C%201.0/100.0%29%0Ay%20%3D%20array%28%5Bfloat%28v%29%20for%20v%20in%20file%28inputFile.name%29%5D%29%0A%0Aprint%20x%0A%0Aprint%20y%0A%0Aplot%28x%2C%20y%29%0A"/>
+    </action>
+    <action date="01 Mar 2007 18:25:09" parent="113" time="114" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="244.572299107" dy="150.946965855" id="13"/>
+      <move dx="244.572299107" dy="150.946965855" id="14"/>
+      <move dx="244.572299107" dy="150.946965855" id="15"/>
+    </action>
+    <action date="01 Mar 2007 18:25:09" parent="114" time="115" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="16" name="MplFigure" x="-164.322418551" y="-330.761761724"/>
+    </action>
+    <action date="01 Mar 2007 18:25:09" parent="115" time="116" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="17" name="MplFigureCell" x="-140.181811548" y="-510.509732778"/>
+    </action>
+    <action date="01 Mar 2007 18:25:09" parent="116" time="117" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="18" name="MplPlot" x="-184.308660425" y="-221.229558975"/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="117" time="118" user="cscheid" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="19" name="MeshQualityHistogram" x="66.5181223843" y="36.1426939174"/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="118" time="119" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="16" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="119" time="120" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="17" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="120" time="121" user="cscheid" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="String" value="import%20matplotlib.axes3d%20as%20axes3d%0A%0AinputFile%20%3D%20self.getInputFromPort%28%27inputFile%27%29%0A%0Afig%20%3D%20gcf%28%29%0A%0Ax%20%3D%20arange%280.0%2C%201.0%2C%201.0/100.0%29%0Ay%20%3D%20array%28%5Bfloat%28v%29%20for%20v%20in%20file%28inputFile.name%29%5D%29%0A%0Aprint%20x%0A%0Aprint%20y%0A%0Aplot%28x%2C%20y%29%0A"/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="121" time="122" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="18" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="122" time="123" user="cscheid" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="18" portName="inputFile" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="123" time="124" user="cscheid" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="19" value=""/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="124" time="125" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="17" destinationModule="MplFigureCell" destinationPort="FigureManager(MplFigureManager)" id="15" sourceId="16" sourceModule="MplFigure" sourcePort="FigureManager(MplFigureManager)"/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="125" time="126" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="16" destinationModule="MplFigure" destinationPort="Script(String)" id="16" sourceId="18" sourceModule="MplPlot" sourcePort="source(String)"/>
+    </action>
+    <action date="01 Mar 2007 18:25:10" parent="126" time="127" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="18" destinationModule="MplPlot" destinationPort="inputFile(File)" id="17" sourceId="19" sourceModule="MeshQualityHistogram" sourcePort="output(File)"/>
+    </action>
+    <action date="01 Mar 2007 18:25:24" parent="127" time="128" user="cscheid" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-196.804271938" dy="49.6787482562" id="11"/>
+      <move dx="-196.804271938" dy="49.6787482562" id="12"/>
+      <move dx="-168.143455636" dy="-225.46508824" id="16"/>
+      <move dx="-168.143455636" dy="-225.46508824" id="17"/>
+      <move dx="-168.143455636" dy="-225.46508824" id="18"/>
+      <move dx="-397.429986049" dy="-385.965659529" id="19"/>
+    </action>
+    <action date="01 Mar 2007 18:25:24" parent="128" time="129" user="cscheid" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="19" destinationModule="MeshQualityHistogram" destinationPort="file(File)" id="18" sourceId="1" sourceModule="File" sourcePort="self(File)"/>
+    </action>
+    <tag name="MeshCell" time="79"/>
+    <tag name="vtkVistrailsFileReader" time="42"/>
+  </visTrail>
diff --git a/examples/bikes.vt b/examples/bikes.vt
new file mode 100644
index 0000000..913b8ed
Binary files /dev/null and b/examples/bikes.vt differ
diff --git a/examples/brain_vistrail.vt b/examples/brain_vistrail.vt
new file mode 100644
index 0000000..6eb5f2a
Binary files /dev/null and b/examples/brain_vistrail.vt differ
diff --git a/examples/chebi_webservice.vt b/examples/chebi_webservice.vt
new file mode 100644
index 0000000..88dcaf1
Binary files /dev/null and b/examples/chebi_webservice.vt differ
diff --git a/examples/corie.xml b/examples/corie.xml
new file mode 100644
index 0000000..8640a5c
--- /dev/null
+++ b/examples/corie.xml
@@ -0,0 +1,9009 @@
+  <visTrail version="0.3.1">
+    <action date="20 Feb 2007 22:50:33" parent="0" time="1" user="emanuele" what="addModule">
+      <object cache="1" id="0" name="vtkCornerAnnotation" x="1034.11991838" y="-58.3393925256"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="1" time="2" user="emanuele" what="addModule">
+      <object cache="1" id="1" name="vtkActor" x="1527.32015179" y="-249.262640518"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="2" time="3" user="emanuele" what="addModule">
+      <object cache="1" id="2" name="vtkColorTransferFunction" x="688.135907588" y="231.58177416"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="3" time="4" user="emanuele" what="addModule">
+      <object cache="1" id="3" name="VTKCell" x="1391.97591862" y="-567.894434513"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="4" time="5" user="emanuele" what="addModule">
+      <object cache="1" id="4" name="vtkConeSource" x="1529.10671562" y="277.773705378"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="5" time="6" user="emanuele" what="addModule">
+      <object cache="1" id="5" name="vtkRenderer" x="1126.59136348" y="-482.339603991"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="6" time="7" user="emanuele" what="addModule">
+      <object cache="1" id="6" name="vtkCORIEUnstructuredGridReader" x="418.239165751" y="151.010904512"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="7" time="8" user="emanuele" what="addModule">
+      <object cache="1" id="7" name="vtkScalarBarActor" x="836.37112053" y="-202.13140985"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="8" time="9" user="emanuele" what="addModule">
+      <object cache="1" id="8" name="vtkUnstructuredGrid" x="1091.15098771" y="524.040867763"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="9" time="10" user="emanuele" what="addModule">
+      <object cache="1" id="9" name="vtkProbeFilter" x="1202.33440979" y="271.24222817"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="10" time="11" user="emanuele" what="addModule">
+      <object cache="1" id="10" name="vtkGlyph2D" x="1364.74284306" y="104.477008592"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="11" time="12" user="emanuele" what="addModule">
+      <object cache="1" id="11" name="vtkPoints" x="689.885161439" y="565.332955628"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="12" time="13" user="emanuele" what="addModule">
+      <object cache="1" id="12" name="vtkTextProperty" x="848.94125449" y="320.68414913"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="13" time="14" user="emanuele" what="addModule">
+      <object cache="1" id="13" name="vtkDataSetMapper" x="1383.08800066" y="-67.4334562647"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="14" time="15" user="emanuele" what="addModule">
+      <object cache="1" id="14" name="vtkProperty" x="1604.14239657" y="86.6113697478"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="15" time="16" user="emanuele" what="addModule">
+      <object cache="1" id="15" name="vtkActor" x="664.542307966" y="-301.817763707"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="16" time="17" user="emanuele" what="addModule">
+      <object cache="1" id="16" name="vtkCORIEUnstructuredGridReader" x="817.54781389" y="409.941849195"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="17" time="18" user="emanuele" what="addModule">
+      <object cache="1" id="17" name="vtkProperty" x="451.377069242" y="-140.384892112"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="18" time="19" user="emanuele" what="addModule">
+      <object cache="1" id="18" name="CellLocation" x="1425.54504314" y="-424.279517609"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="19" time="20" user="emanuele" what="addModule">
+      <object cache="1" id="19" name="vtkDataSetMapper" x="578.36256334" y="-46.76947102"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="20" time="21" user="emanuele" what="addModule">
+      <object cache="1" id="20" name="vtkCamera" x="1311.70460535" y="-224.351717051"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="21" time="22" user="emanuele" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 21:00:00"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="22" time="23" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="0" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="23" time="24" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="1" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="24" time="25" user="emanuele" what="changeParameter">
+      <set alias="" function="SetColorSpaceToRGB" functionId="0" moduleId="2" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="25" time="26" user="emanuele" what="changeParameter">
+      <set alias="" function="ClampingOn" functionId="1" moduleId="2" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="26" time="27" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.47"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="27" time="28" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.81"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="28" time="29" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="20"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.15"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.43"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="29" time="30" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="24"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.15"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.72"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="30" time="31" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="28"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.16"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="31" time="32" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="30"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.16"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.73"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="32" time="33" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.73"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.31"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="33" time="34" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31.4"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.45"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="34" time="35" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31.8"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.93"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="35" time="36" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.75"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="36" time="37" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.2"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.56"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="37" time="38" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.4"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.37"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="38" time="39" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.6"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.88"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="39" time="40" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.8"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.68"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="40" time="41" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="33.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.49"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="41" time="42" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.49"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="42" time="43" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="2" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="43" time="44" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="3" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="44" time="45" user="emanuele" what="changeParameter">
+      <set alias="" function="CappingOn" functionId="0" moduleId="4" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="45" time="46" user="emanuele" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="1" moduleId="4" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="46" time="47" user="emanuele" what="changeParameter">
+      <set alias="" function="SetHeight" functionId="2" moduleId="4" parameter="<no description>" parameterId="0" type="Float" value="3000"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="47" time="48" user="emanuele" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="3" moduleId="4" parameter="<no description>" parameterId="0" type="Float" value="300"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="48" time="49" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="4" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="49" time="50" user="emanuele" what="changeParameter">
+      <set alias="" function="SetBackground" functionId="0" moduleId="5" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="5" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="5" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="50" time="51" user="emanuele" what="changeParameter">
+      <set alias="" function="ResetCameraClippingRange" functionId="1" moduleId="5" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="51" time="52" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="5" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="52" time="53" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFileName" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="../examples/data/1_salt.63"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="53" time="54" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="95"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="54" time="55" user="emanuele" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="2" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="55" time="56" user="emanuele" what="changeParameter">
+      <set alias="" function="SetVerticalShift" functionId="3" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="-100"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="56" time="57" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="6" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="57" time="58" user="emanuele" what="changeParameter">
+      <set alias="" function="SetNumberOfLabels" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Integer" value="8"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="58" time="59" user="emanuele" what="changeParameter">
+      <set alias="" function="SetHeight" functionId="1" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="0.6"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="59" time="60" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="7" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="60" time="61" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="8" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="61" time="62" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="9" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="62" time="63" user="emanuele" what="changeParameter">
+      <set alias="" function="OrientOn" functionId="0" moduleId="10" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="63" time="64" user="emanuele" what="changeParameter">
+      <set alias="" function="SetVectorModeToUseVector" functionId="1" moduleId="10" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="64" time="65" user="emanuele" what="changeParameter">
+      <set alias="" function="SetColorModeToColorByScalar" functionId="2" moduleId="10" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="65" time="66" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="10" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="66" time="67" user="emanuele" what="changeParameter">
+      <set alias="" function="InsertNextPoint" functionId="0" moduleId="11" parameter="<no description>" parameterId="0" type="Float" value="113734.609286"/>
+      <set alias="" function="InsertNextPoint" functionId="0" moduleId="11" parameter="<no description>" parameterId="1" type="Float" value="165718.376885"/>
+      <set alias="" function="InsertNextPoint" functionId="0" moduleId="11" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="67" time="68" user="emanuele" what="changeParameter">
+      <set alias="" function="InsertNextPoint" functionId="1" moduleId="11" parameter="<no description>" parameterId="0" type="Float" value="99973.093896"/>
+      <set alias="" function="InsertNextPoint" functionId="1" moduleId="11" parameter="<no description>" parameterId="1" type="Float" value="304108.195791"/>
+      <set alias="" function="InsertNextPoint" functionId="1" moduleId="11" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="68" time="69" user="emanuele" what="changeParameter">
+      <set alias="" function="InsertNextPoint" functionId="2" moduleId="11" parameter="<no description>" parameterId="0" type="Float" value="96696.997373"/>
+      <set alias="" function="InsertNextPoint" functionId="2" moduleId="11" parameter="<no description>" parameterId="1" type="Float" value="441862.953096"/>
+      <set alias="" function="InsertNextPoint" functionId="2" moduleId="11" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="69" time="70" user="emanuele" what="changeParameter">
+      <set alias="" function="InsertNextPoint" functionId="3" moduleId="11" parameter="<no description>" parameterId="0" type="Float" value="290740.998481"/>
+      <set alias="" function="InsertNextPoint" functionId="3" moduleId="11" parameter="<no description>" parameterId="1" type="Float" value="149131.407453"/>
+      <set alias="" function="InsertNextPoint" functionId="3" moduleId="11" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="70" time="71" user="emanuele" what="changeParameter">
+      <set alias="" function="InsertNextPoint" functionId="4" moduleId="11" parameter="<no description>" parameterId="0" type="Float" value="255945.317532"/>
+      <set alias="" function="InsertNextPoint" functionId="4" moduleId="11" parameter="<no description>" parameterId="1" type="Float" value="433511.203416"/>
+      <set alias="" function="InsertNextPoint" functionId="4" moduleId="11" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="71" time="72" user="emanuele" what="changeParameter">
+      <set alias="" function="InsertNextPoint" functionId="5" moduleId="11" parameter="<no description>" parameterId="0" type="Float" value="278171.046176"/>
+      <set alias="" function="InsertNextPoint" functionId="5" moduleId="11" parameter="<no description>" parameterId="1" type="Float" value="291109.255391"/>
+      <set alias="" function="InsertNextPoint" functionId="5" moduleId="11" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="72" time="73" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="11" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="73" time="74" user="emanuele" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="12" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="12" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="12" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="74" time="75" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFontFamilyToArial" functionId="1" moduleId="12" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="75" time="76" user="emanuele" what="changeParameter">
+      <set alias="" function="ShadowOff" functionId="2" moduleId="12" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="76" time="77" user="emanuele" what="changeParameter">
+      <set alias="" function="BoldOff" functionId="3" moduleId="12" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="77" time="78" user="emanuele" what="changeParameter">
+      <set alias="" function="ItalicOff" functionId="4" moduleId="12" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="78" time="79" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="12" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="79" time="80" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="13" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="80" time="81" user="emanuele" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="14" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="14" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="81" time="82" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="14" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="82" time="83" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="15" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="83" time="84" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFileName" functionId="0" moduleId="16" parameter="<no description>" parameterId="0" type="String" value="../examples/data/1_wind.62"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="84" time="85" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="1" moduleId="16" parameter="<no description>" parameterId="0" type="Integer" value="95"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="85" time="86" user="emanuele" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="2" moduleId="16" parameter="<no description>" parameterId="0" type="Float" value="1.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="86" time="87" user="emanuele" what="changeParameter">
+      <set alias="" function="SetVerticalShift" functionId="3" moduleId="16" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="87" time="88" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="16" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="88" time="89" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="17" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="89" time="90" user="emanuele" what="changeParameter">
+      <set alias="" function="ColumnRowAddress" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="String" value="A1"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="90" time="91" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="18" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="91" time="92" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="19" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="92" time="93" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="288871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="823378.928288"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="93" time="94" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="288871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="94" time="95" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="95" time="96" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="20" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="96" time="97" user="emanuele" what="addConnection">
+      <connect destinationId="0" destinationModule="vtkCornerAnnotation" destinationPort="SetTextProperty(vtkTextProperty)" id="0" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="97" time="98" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="1" sourceId="0" sourceModule="vtkCornerAnnotation" sourcePort="self(vtkCornerAnnotation)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="98" time="99" user="emanuele" what="addConnection">
+      <connect destinationId="1" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="2" sourceId="14" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="99" time="100" user="emanuele" what="addConnection">
+      <connect destinationId="1" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="3" sourceId="13" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="100" time="101" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="4" sourceId="1" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="101" time="102" user="emanuele" what="addConnection">
+      <connect destinationId="19" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="5" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="102" time="103" user="emanuele" what="addConnection">
+      <connect destinationId="7" destinationModule="vtkScalarBarActor" destinationPort="SetLookupTable(vtkScalarsToColors)" id="6" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="103" time="104" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="7" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="104" time="105" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="VTKCell" destinationPort="Location(CellLocation)" id="8" sourceId="18" sourceModule="CellLocation" sourcePort="self(CellLocation)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="105" time="106" user="emanuele" what="addConnection">
+      <connect destinationId="10" destinationModule="vtkGlyph2D" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="9" sourceId="4" sourceModule="vtkConeSource" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="106" time="107" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="10" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="107" time="108" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="11" sourceId="7" sourceModule="vtkScalarBarActor" sourcePort="self(vtkScalarBarActor)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="108" time="109" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="SetActiveCamera(vtkCamera)" id="12" sourceId="20" sourceModule="vtkCamera" sourcePort="self(vtkCamera)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="109" time="110" user="emanuele" what="addConnection">
+      <connect destinationId="19" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="13" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="110" time="111" user="emanuele" what="addConnection">
+      <connect destinationId="7" destinationModule="vtkScalarBarActor" destinationPort="SetTitleTextProperty(vtkTextProperty)" id="14" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="111" time="112" user="emanuele" what="addConnection">
+      <connect destinationId="8" destinationModule="vtkPointSet" destinationPort="SetPoints(vtkPoints)" id="15" sourceId="11" sourceModule="vtkPoints" sourcePort="self(vtkPoints)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="112" time="113" user="emanuele" what="addConnection">
+      <connect destinationId="9" destinationModule="vtkDataSetAlgorithm" destinationPort="SetInput(vtkDataObject)" id="16" sourceId="8" sourceModule="vtkUnstructuredGrid" sourcePort="self(vtkUnstructuredGrid)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="113" time="114" user="emanuele" what="addConnection">
+      <connect destinationId="9" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="17" sourceId="16" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="114" time="115" user="emanuele" what="addConnection">
+      <connect destinationId="10" destinationModule="vtkGlyph2D" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="18" sourceId="9" sourceModule="vtkProbeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="115" time="116" user="emanuele" what="addConnection">
+      <connect destinationId="13" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="19" sourceId="10" sourceModule="vtkGlyph2D" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="116" time="117" user="emanuele" what="addConnection">
+      <connect destinationId="15" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="20" sourceId="19" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="20 Feb 2007 22:50:33" parent="117" time="118" user="emanuele" what="addConnection">
+      <connect destinationId="15" destinationModule="vtkActor" destinationPort="SetBackfaceProperty(vtkProperty)" id="21" sourceId="17" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="118" time="119" user="emanuele" what="addModule">
+      <object cache="1" id="21" name="HTTPFile" x="510.751822568" y="760.282758217"/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="119" time="120" user="emanuele" what="addModule">
+      <object cache="1" id="22" name="Unzip" x="520.597962218" y="675.192654404"/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="120" time="121" user="emanuele" what="changeParameter">
+      <set alias="" function="url" functionId="0" moduleId="21" parameter="<no description>" parameterId="0" type="String" value="http://www.vistrails.org/data/1_wind.62.zip"/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="121" time="122" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="21" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="122" time="123" user="emanuele" what="changeParameter">
+      <set alias="" function="filename_in_archive" functionId="0" moduleId="22" parameter="<no description>" parameterId="0" type="String" value="1_wind.62"/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="123" time="124" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="22" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:51:50" parent="124" time="125" user="emanuele" what="addConnection">
+      <connect destinationId="22" destinationModule="Unzip" destinationPort="archive_file(File)" id="22" sourceId="21" sourceModule="HTTPFile" sourcePort="file(File)"/>
+    </action>
+    <action date="20 Feb 2007 22:52:18" parent="125" time="126" user="emanuele" what="moveModule">
+      <move dx="314.808975907" dy="43.959811951" id="11"/>
+      <move dx="225.471293555" dy="-56.7223380013" id="21"/>
+      <move dx="225.471293555" dy="-56.7223380013" id="22"/>
+    </action>
+    <action date="20 Feb 2007 22:52:18" parent="126" time="127" user="emanuele" what="addModule">
+      <object cache="1" id="23" name="PythonSource" x="498.129984085" y="582.910364636"/>
+    </action>
+    <action date="20 Feb 2007 22:52:19" parent="127" time="128" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="23" parameter="<no description>" parameterId="0" type="String" value="%23%20Extracts%20the%20internal%20file%20name%20so%20VTK%20can%20use%20it%0A%23%20Also%2C%20makes%20local%20copy%20so%20that%20the%20file%20survives%20filepool%0A%23%20cleanup.%0Afrom%20packages.spreadsheet.spreadsheet_controller%20import%20spreadsheetController%0Aself.checkInputPort%28%22file%22%29%0Awindow%20%3D%20spreadsheetController.findSpreadshe [...]
+    </action>
+    <action date="20 Feb 2007 22:52:19" parent="128" time="129" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="23" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:52:35" parent="129" time="130" user="emanuele" what="moveModule">
+      <move dx="269.431105506" dy="-55.3042795513" id="23"/>
+    </action>
+    <action date="20 Feb 2007 22:52:35" parent="130" time="131" user="emanuele" what="deleteFunction">
+      <function functionId="0" moduleId="16"/>
+    </action>
+    <action date="20 Feb 2007 22:53:03" parent="131" time="132" user="emanuele" what="addModulePort">
+      <addPort moduleId="23" portName="file" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 22:53:03" parent="132" time="133" user="emanuele" what="addModulePort">
+      <addPort moduleId="23" portName="name" portSpec="(String)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 22:53:15" parent="133" time="134" user="emanuele" what="addModulePort">
+      <addPort moduleId="23" portName="file" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 22:53:19" parent="134" time="135" user="emanuele" what="addConnection">
+      <connect destinationId="23" destinationModule="PythonSource" destinationPort="file(File)" id="23" sourceId="22" sourceModule="Unzip" sourcePort="file(File)"/>
+    </action>
+    <action date="20 Feb 2007 22:53:28" parent="135" time="136" user="emanuele" what="moveModule">
+      <move dx="0.0" dy="-1.41805845003" id="16"/>
+    </action>
+    <action date="20 Feb 2007 22:53:31" parent="136" time="137" user="emanuele" what="addConnection">
+      <connect destinationId="16" destinationModule="vtkDataReader" destinationPort="SetFileName(String)" id="24" sourceId="23" sourceModule="PythonSource" sourcePort="name(String)"/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="137" time="138" user="emanuele" what="addModule">
+      <object cache="1" id="24" name="Unzip" x="756.069255773" y="628.470316403"/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="138" time="139" user="emanuele" what="addModule">
+      <object cache="1" id="25" name="HTTPFile" x="746.223116123" y="713.560420216"/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="139" time="140" user="emanuele" what="changeParameter">
+      <set alias="" function="filename_in_archive" functionId="0" moduleId="24" parameter="<no description>" parameterId="0" type="String" value="1_wind.62"/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="140" time="141" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="24" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="141" time="142" user="emanuele" what="changeParameter">
+      <set alias="" function="url" functionId="0" moduleId="25" parameter="<no description>" parameterId="0" type="String" value="http://www.vistrails.org/data/1_wind.62.zip"/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="142" time="143" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="25" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:55:16" parent="143" time="144" user="emanuele" what="addConnection">
+      <connect destinationId="24" destinationModule="Unzip" destinationPort="archive_file(File)" id="25" sourceId="25" sourceModule="HTTPFile" sourcePort="file(File)"/>
+    </action>
+    <action date="20 Feb 2007 22:55:34" parent="144" time="145" user="emanuele" what="moveModule">
+      <move dx="-393.264654737" dy="-294.948491053" id="24"/>
+      <move dx="-393.264654737" dy="-294.948491053" id="25"/>
+    </action>
+    <action date="20 Feb 2007 22:55:34" parent="145" time="146" user="emanuele" what="changeParameter">
+      <set alias="" function="url" functionId="0" moduleId="25" parameter="<no description>" parameterId="0" type="String" value="http://www.vistrails.org/data/1_salt.63.zip"/>
+    </action>
+    <action date="20 Feb 2007 22:55:44" parent="146" time="147" user="emanuele" what="changeParameter">
+      <set alias="" function="filename_in_archive" functionId="0" moduleId="24" parameter="<no description>" parameterId="0" type="String" value="1_salt.63"/>
+    </action>
+    <action date="20 Feb 2007 22:55:52" parent="147" time="148" user="emanuele" what="addModule">
+      <object cache="1" id="26" name="PythonSource" x="777.561089591" y="537.606085085"/>
+    </action>
+    <action date="20 Feb 2007 22:55:52" parent="148" time="149" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="26" parameter="<no description>" parameterId="0" type="String" value="%23%20Extracts%20the%20internal%20file%20name%20so%20VTK%20can%20use%20it%0A%23%20Also%2C%20makes%20local%20copy%20so%20that%20the%20file%20survives%20filepool%0A%23%20cleanup.%0Afrom%20packages.spreadsheet.spreadsheet_controller%20import%20spreadsheetController%0Aself.checkInputPort%28%22file%22%29%0Awindow%20%3D%20spreadsheetController.findSpreadshe [...]
+    </action>
+    <action date="20 Feb 2007 22:55:52" parent="149" time="150" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="26" value=""/>
+    </action>
+    <action date="20 Feb 2007 22:56:26" parent="150" time="151" user="emanuele" what="moveModule">
+      <move dx="-400.827436559" dy="-283.60431832" id="26"/>
+    </action>
+    <action date="20 Feb 2007 22:56:26" parent="151" time="152" user="emanuele" what="addModulePort">
+      <addPort moduleId="26" portName="file" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 22:56:26" parent="152" time="153" user="emanuele" what="addModulePort">
+      <addPort moduleId="26" portName="name" portSpec="(String)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 22:56:27" parent="153" time="154" user="emanuele" what="addModulePort">
+      <addPort moduleId="26" portName="file" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 22:56:45" parent="154" time="155" user="emanuele" what="deleteFunction">
+      <function functionId="0" moduleId="6"/>
+    </action>
+    <action date="20 Feb 2007 22:56:57" parent="155" time="156" user="emanuele" what="addConnection">
+      <connect destinationId="6" destinationModule="vtkDataReader" destinationPort="SetFileName(String)" id="26" sourceId="26" sourceModule="PythonSource" sourcePort="name(String)"/>
+    </action>
+    <action date="20 Feb 2007 22:57:00" parent="156" time="157" user="emanuele" what="addConnection">
+      <connect destinationId="26" destinationModule="PythonSource" destinationPort="file(File)" id="27" sourceId="24" sourceModule="Unzip" sourcePort="file(File)"/>
+    </action>
+    <action date="20 Feb 2007 22:58:53" parent="157" time="158" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="16" parameter="<no description>" parameterId="0" type="Integer" value="60"/>
+    </action>
+    <action date="20 Feb 2007 22:59:01" parent="158" time="159" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="60"/>
+    </action>
+    <action date="20 Feb 2007 23:00:33" parent="159" time="160" user="emanuele" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Oct-11 18:00:00"/>
+    </action>
+    <action date="20 Feb 2007 23:01:17" parent="160" time="161" user="emanuele" what="changeParameter">
+      <set alias="" function="ColumnRowAddress" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="String" value="B1"/>
+    </action>
+    <action date="20 Feb 2007 23:02:57" parent="157" time="162" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="16" parameter="<no description>" parameterId="0" type="Integer" value="30"/>
+    </action>
+    <action date="20 Feb 2007 23:03:02" parent="162" time="163" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="30"/>
+    </action>
+    <action date="20 Feb 2007 23:03:16" parent="163" time="164" user="emanuele" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Oct-11 12:00:00"/>
+    </action>
+    <action date="20 Feb 2007 23:04:39" parent="157" time="165" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="16" parameter="<no description>" parameterId="0" type="Integer" value="90"/>
+    </action>
+    <action date="20 Feb 2007 23:04:44" parent="165" time="166" user="emanuele" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="90"/>
+    </action>
+    <action date="20 Feb 2007 23:05:01" parent="166" time="167" user="emanuele" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Oct-11 24:00:00"/>
+    </action>
+    <action date="20 Feb 2007 23:05:07" parent="167" time="168" user="emanuele" what="changeParameter">
+      <set alias="" function="ColumnRowAddress" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="String" value="C1"/>
+    </action>
+    <action date="20 Feb 2007 23:06:32" parent="164" time="169" user="emanuele" what="deleteConnection">
+      <connection connectionId="7"/>
+      <connection connectionId="8"/>
+    </action>
+    <action date="20 Feb 2007 23:06:32" parent="169" time="170" user="emanuele" what="deleteModule">
+      <module moduleId="3"/>
+    </action>
+    <action date="20 Feb 2007 23:07:04" parent="170" time="171" user="emanuele" what="moveModule">
+      <move dx="-87.2343489712" dy="46.0403508459" id="5"/>
+    </action>
+    <action date="20 Feb 2007 23:07:04" parent="171" time="172" user="emanuele" what="addModule">
+      <object cache="1" id="27" name="SheetReference" x="845.30516105" y="-1059.21860426"/>
+    </action>
+    <action date="20 Feb 2007 23:07:04" parent="172" time="173" user="emanuele" what="addModule">
+      <object cache="1" id="28" name="RichTextCell" x="832.724802472" y="-850.069864812"/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="173" time="174" user="emanuele" what="addModule">
+      <object cache="1" id="29" name="CellLocation" x="840.504976386" y="-955.819381689"/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="174" time="175" user="emanuele" what="changeParameter">
+      <set alias="" function="MinColumnCount" functionId="0" moduleId="27" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="175" time="176" user="emanuele" what="changeParameter">
+      <set alias="" function="MinRowCount" functionId="1" moduleId="27" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="176" time="177" user="emanuele" what="changeParameter">
+      <set alias="" function="SheetName" functionId="2" moduleId="27" parameter="<no description>" parameterId="0" type="String" value="Salinity 60"/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="177" time="178" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="27" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="178" time="179" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="28" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:07:05" parent="179" time="180" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="29" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:07:06" parent="180" time="181" user="emanuele" what="addConnection">
+      <connect destinationId="29" destinationModule="CellLocation" destinationPort="SheetReference(SheetReference)" id="28" sourceId="27" sourceModule="SheetReference" sourcePort="self(SheetReference)"/>
+    </action>
+    <action date="20 Feb 2007 23:07:06" parent="181" time="182" user="emanuele" what="addConnection">
+      <connect destinationId="28" destinationModule="RichTextCell" destinationPort="Location(CellLocation)" id="29" sourceId="29" sourceModule="CellLocation" sourcePort="self(CellLocation)"/>
+    </action>
+    <action date="20 Feb 2007 23:07:46" parent="182" time="183" user="emanuele" what="moveModule">
+      <move dx="-25.3348992958" dy="250.182130546" id="27"/>
+      <move dx="-25.3348992958" dy="250.182130546" id="28"/>
+      <move dx="-25.3348992958" dy="250.182130546" id="29"/>
+    </action>
+    <action date="20 Feb 2007 23:07:46" parent="183" time="184" user="emanuele" what="addModule">
+      <object cache="1" id="30" name="PythonSource" x="754.625002262" y="-594.276667201"/>
+    </action>
+    <action date="20 Feb 2007 23:07:46" parent="184" time="185" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Awindow%20%3D%20vtk.vtkRenderWindow%28%29%0Ar%20%3D%20self.getInputFromPort%28%22renderer%22%29.vtkInstance%0Ar.ResetCamera%28%29%0Awindow.AddRenderer%28r%29%0Awindow.OffScreenRenderingOn%28%29%0Awindow.Start%28%29%0Awindow.Render%28%29%0Awin2image%20%3D%20vtk.vtkWindowToImageFilter%28%29%0Awin2image.SetInput%28window%29%0Awin2image.Upda [...]
+    </action>
+    <action date="20 Feb 2007 23:07:46" parent="185" time="186" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="30" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:08:32" parent="186" time="187" user="emanuele" what="moveModule">
+      <move dx="-19.0011744719" dy="129.841358891" id="30"/>
+    </action>
+    <action date="20 Feb 2007 23:08:32" parent="187" time="188" user="emanuele" what="addModulePort">
+      <addPort moduleId="30" portName="renderer" portSpec="(vtkRenderer)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 23:08:33" parent="188" time="189" user="emanuele" what="addModulePort">
+      <addPort moduleId="30" portName="image" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 23:08:53" parent="189" time="190" user="emanuele" what="moveModule">
+      <move dx="-129.841358891" dy="31.6686241198" id="30"/>
+    </action>
+    <action date="20 Feb 2007 23:08:53" parent="190" time="191" user="emanuele" what="addModule">
+      <object cache="1" id="31" name="PythonSource" x="836.780897749" y="-721.414679071"/>
+    </action>
+    <action date="20 Feb 2007 23:08:53" parent="191" time="192" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="31" parameter="<no description>" parameterId="0" type="String" value="imageFile%20%3D%20self.getInputFromPort%28%22imageFile%22%29%0A%0Atext%20%3D%20%27%3CHTML%3E%3CTITLE%3EElcirc%20run%20todaydev%3C/TITLE%3E%3CBODY%20BGCOLOR%3D%22%23FFFFFF%22%3E%3CTABLE%20WIDTH%3D%22100%25%22%20BORDER%3D%221%22%20BGCOLOR%3D%22%23FFFFFF%22%20CELLPADDING%3D%224%22%3E%20%27%0Atext%20%2B%3D%20%27%3CTR%3E%3CTD%3EToday%20Salinity%3CBR%3Esali [...]
+    </action>
+    <action date="20 Feb 2007 23:08:53" parent="192" time="193" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="31" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:09:32" parent="193" time="194" user="emanuele" what="moveModule">
+      <move dx="0.0" dy="-38.0023489437" id="27"/>
+      <move dx="0.0" dy="-28.5017617078" id="28"/>
+      <move dx="6.33372482396" dy="-25.3348992958" id="29"/>
+      <move dx="376.856627025" dy="-88.6721475354" id="30"/>
+      <move dx="-123.507634067" dy="202.679194367" id="31"/>
+    </action>
+    <action date="20 Feb 2007 23:09:32" parent="194" time="195" user="emanuele" what="addModulePort">
+      <addPort moduleId="31" portName="imageFile" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 23:09:32" parent="195" time="196" user="emanuele" what="addModulePort">
+      <addPort moduleId="31" portName="htmlFile" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 23:09:42" parent="196" time="197" user="emanuele" what="moveModule">
+      <move dx="-53.8366610036" dy="38.0023489437" id="5"/>
+    </action>
+    <action date="20 Feb 2007 23:09:42" parent="197" time="198" user="emanuele" what="addConnection">
+      <connect destinationId="30" destinationModule="PythonSource" destinationPort="renderer(vtkRenderer)" id="30" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="20 Feb 2007 23:09:52" parent="198" time="199" user="emanuele" what="moveModule">
+      <move dx="-32.3332087983" dy="36.6443033047" id="30"/>
+      <move dx="347.043107768" dy="-62.5108703433" id="31"/>
+    </action>
+    <action date="20 Feb 2007 23:09:52" parent="199" time="200" user="emanuele" what="addConnection">
+      <connect destinationId="31" destinationModule="PythonSource" destinationPort="imageFile(File)" id="31" sourceId="30" sourceModule="PythonSource" sourcePort="image(File)"/>
+    </action>
+    <action date="20 Feb 2007 23:09:55" parent="200" time="201" user="emanuele" what="addConnection">
+      <connect destinationId="28" destinationModule="RichTextCell" destinationPort="File(File)" id="32" sourceId="31" sourceModule="PythonSource" sourcePort="htmlFile(File)"/>
+    </action>
+    <action date="20 Feb 2007 23:11:52" parent="201" time="202" user="emanuele" what="changeParameter">
+      <set alias="" function="SheetName" functionId="2" moduleId="27" parameter="<no description>" parameterId="0" type="String" value="Salinity30"/>
+    </action>
+    <action date="20 Feb 2007 23:11:55" parent="202" time="203" user="emanuele" what="changeParameter">
+      <set alias="" function="SheetName" functionId="2" moduleId="27" parameter="<no description>" parameterId="0" type="String" value="Salinity 30"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="161" time="204" user="emanuele" what="addModule">
+      <object cache="1" id="27" name="SheetReference" x="845.30516105" y="-1059.21860426"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="204" time="205" user="emanuele" what="addModule">
+      <object cache="1" id="28" name="RichTextCell" x="832.724802472" y="-850.069864812"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="205" time="206" user="emanuele" what="addModule">
+      <object cache="1" id="29" name="CellLocation" x="840.504976386" y="-955.819381689"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="206" time="207" user="emanuele" what="changeParameter">
+      <set alias="" function="MinColumnCount" functionId="0" moduleId="27" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="207" time="208" user="emanuele" what="changeParameter">
+      <set alias="" function="MinRowCount" functionId="1" moduleId="27" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="208" time="209" user="emanuele" what="changeParameter">
+      <set alias="" function="SheetName" functionId="2" moduleId="27" parameter="<no description>" parameterId="0" type="String" value="Salinity 60"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="209" time="210" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="27" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="210" time="211" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="28" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="211" time="212" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="29" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="212" time="213" user="emanuele" what="addConnection">
+      <connect destinationId="29" destinationModule="CellLocation" destinationPort="SheetReference(SheetReference)" id="28" sourceId="27" sourceModule="SheetReference" sourcePort="self(SheetReference)"/>
+    </action>
+    <action date="20 Feb 2007 23:13:20" parent="213" time="214" user="emanuele" what="addConnection">
+      <connect destinationId="28" destinationModule="RichTextCell" destinationPort="Location(CellLocation)" id="29" sourceId="29" sourceModule="CellLocation" sourcePort="self(CellLocation)"/>
+    </action>
+    <action date="20 Feb 2007 23:13:47" parent="214" time="215" user="emanuele" what="addModule">
+      <object cache="1" id="30" name="PythonSource" x="960.305887126" y="-474.794528421"/>
+    </action>
+    <action date="20 Feb 2007 23:13:47" parent="215" time="216" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Awindow%20%3D%20vtk.vtkRenderWindow%28%29%0Ar%20%3D%20self.getInputFromPort%28%22renderer%22%29.vtkInstance%0Ar.ResetCamera%28%29%0Awindow.AddRenderer%28r%29%0Awindow.OffScreenRenderingOn%28%29%0Awindow.Start%28%29%0Awindow.Render%28%29%0Awin2image%20%3D%20vtk.vtkWindowToImageFilter%28%29%0Awin2image.SetInput%28window%29%0Awin2image.Upda [...]
+    </action>
+    <action date="20 Feb 2007 23:13:47" parent="216" time="217" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="30" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:14:06" parent="217" time="218" user="emanuele" what="addModule">
+      <object cache="1" id="31" name="PythonSource" x="1070.31637145" y="-571.246355048"/>
+    </action>
+    <action date="20 Feb 2007 23:14:06" parent="218" time="219" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="31" parameter="<no description>" parameterId="0" type="String" value="imageFile%20%3D%20self.getInputFromPort%28%22imageFile%22%29%0A%0Atext%20%3D%20%27%3CHTML%3E%3CTITLE%3EElcirc%20run%20todaydev%3C/TITLE%3E%3CBODY%20BGCOLOR%3D%22%23FFFFFF%22%3E%3CTABLE%20WIDTH%3D%22100%25%22%20BORDER%3D%221%22%20BGCOLOR%3D%22%23FFFFFF%22%20CELLPADDING%3D%224%22%3E%20%27%0Atext%20%2B%3D%20%27%3CTR%3E%3CTD%3EToday%20Salinity%3CBR%3Esali [...]
+    </action>
+    <action date="20 Feb 2007 23:14:06" parent="219" time="220" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="31" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:14:39" parent="220" time="221" user="emanuele" what="moveModule">
+      <move dx="-278.683892254" dy="-41.1692113557" id="31"/>
+    </action>
+    <action date="20 Feb 2007 23:14:39" parent="221" time="222" user="emanuele" what="addModulePort">
+      <addPort moduleId="31" portName="imageFile" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 23:14:40" parent="222" time="223" user="emanuele" what="addModulePort">
+      <addPort moduleId="31" portName="htmlFile" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 23:14:46" parent="223" time="224" user="emanuele" what="addConnection">
+      <connect destinationId="28" destinationModule="RichTextCell" destinationPort="File(File)" id="30" sourceId="31" sourceModule="PythonSource" sourcePort="htmlFile(File)"/>
+    </action>
+    <action date="20 Feb 2007 23:15:31" parent="224" time="225" user="emanuele" what="moveModule">
+      <move dx="47.5029361797" dy="-117.173909243" id="30"/>
+      <move dx="107.673322007" dy="-53.8366610036" id="31"/>
+    </action>
+    <action date="20 Feb 2007 23:15:31" parent="225" time="226" user="emanuele" what="addModulePort">
+      <addPort moduleId="30" portName="renderer" portSpec="(vtkRenderer)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 23:15:31" parent="226" time="227" user="emanuele" what="addModulePort">
+      <addPort moduleId="30" portName="image" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 23:15:37" parent="227" time="228" user="emanuele" what="deleteConnection">
+      <connection connectionId="7"/>
+      <connection connectionId="8"/>
+    </action>
+    <action date="20 Feb 2007 23:15:37" parent="228" time="229" user="emanuele" what="deleteModule">
+      <module moduleId="3"/>
+    </action>
+    <action date="20 Feb 2007 23:15:41" parent="229" time="230" user="emanuele" what="deleteConnection"/>
+    <action date="20 Feb 2007 23:15:41" parent="230" time="231" user="emanuele" what="deleteModule">
+      <module moduleId="18"/>
+    </action>
+    <action date="20 Feb 2007 23:15:46" parent="231" time="232" user="emanuele" what="addConnection">
+      <connect destinationId="30" destinationModule="PythonSource" destinationPort="renderer(vtkRenderer)" id="31" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="20 Feb 2007 23:15:54" parent="232" time="233" user="emanuele" what="moveModule">
+      <move dx="28.5017617078" dy="3.16686241198" id="30"/>
+    </action>
+    <action date="20 Feb 2007 23:15:54" parent="233" time="234" user="emanuele" what="addConnection">
+      <connect destinationId="31" destinationModule="PythonSource" destinationPort="imageFile(File)" id="32" sourceId="30" sourceModule="PythonSource" sourcePort="image(File)"/>
+    </action>
+    <action date="20 Feb 2007 23:16:19" parent="203" time="235" user="emanuele" what="moveModule">
+      <move dx="2.79721122452" dy="0.0" id="18"/>
+    </action>
+    <action date="20 Feb 2007 23:16:19" parent="235" time="236" user="emanuele" what="deleteConnection"/>
+    <action date="20 Feb 2007 23:16:19" parent="236" time="237" user="emanuele" what="deleteModule">
+      <module moduleId="18"/>
+    </action>
+    <action date="20 Feb 2007 23:17:09" parent="168" time="238" user="emanuele" what="deleteConnection">
+      <connection connectionId="7"/>
+      <connection connectionId="8"/>
+    </action>
+    <action date="20 Feb 2007 23:17:09" parent="238" time="239" user="emanuele" what="deleteModule">
+      <module moduleId="3"/>
+    </action>
+    <action date="20 Feb 2007 23:17:11" parent="239" time="240" user="emanuele" what="deleteConnection"/>
+    <action date="20 Feb 2007 23:17:11" parent="240" time="241" user="emanuele" what="deleteModule">
+      <module moduleId="18"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="241" time="242" user="emanuele" what="addModule">
+      <object cache="1" id="27" name="SheetReference" x="865.30516105" y="-1039.21860426"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="242" time="243" user="emanuele" what="addModule">
+      <object cache="1" id="28" name="CellLocation" x="770.569532929" y="-897.275620359"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="243" time="244" user="emanuele" what="addModule">
+      <object cache="1" id="29" name="RichTextCell" x="849.512822349" y="-775.466202927"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="244" time="245" user="emanuele" what="changeParameter">
+      <set alias="" function="MinColumnCount" functionId="0" moduleId="27" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="245" time="246" user="emanuele" what="changeParameter">
+      <set alias="" function="MinRowCount" functionId="1" moduleId="27" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="246" time="247" user="emanuele" what="changeParameter">
+      <set alias="" function="SheetName" functionId="2" moduleId="27" parameter="<no description>" parameterId="0" type="String" value="Salinity 90"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="247" time="248" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="27" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="248" time="249" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="28" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="249" time="250" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="29" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="250" time="251" user="emanuele" what="addConnection">
+      <connect destinationId="28" destinationModule="CellLocation" destinationPort="SheetReference(SheetReference)" id="28" sourceId="27" sourceModule="SheetReference" sourcePort="self(SheetReference)"/>
+    </action>
+    <action date="20 Feb 2007 23:17:12" parent="251" time="252" user="emanuele" what="addConnection">
+      <connect destinationId="29" destinationModule="RichTextCell" destinationPort="Location(CellLocation)" id="29" sourceId="28" sourceModule="CellLocation" sourcePort="self(CellLocation)"/>
+    </action>
+    <action date="20 Feb 2007 23:17:37" parent="252" time="253" user="emanuele" what="addModule">
+      <object cache="1" id="30" name="PythonSource" x="1070.31637145" y="-571.246355048"/>
+    </action>
+    <action date="20 Feb 2007 23:17:37" parent="253" time="254" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="String" value="imageFile%20%3D%20self.getInputFromPort%28%22imageFile%22%29%0A%0Atext%20%3D%20%27%3CHTML%3E%3CTITLE%3EElcirc%20run%20todaydev%3C/TITLE%3E%3CBODY%20BGCOLOR%3D%22%23FFFFFF%22%3E%3CTABLE%20WIDTH%3D%22100%25%22%20BORDER%3D%221%22%20BGCOLOR%3D%22%23FFFFFF%22%20CELLPADDING%3D%224%22%3E%20%27%0Atext%20%2B%3D%20%27%3CTR%3E%3CTD%3EToday%20Salinity%3CBR%3Esali [...]
+    </action>
+    <action date="20 Feb 2007 23:17:37" parent="254" time="255" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="30" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:17:55" parent="255" time="256" user="emanuele" what="addModule">
+      <object cache="1" id="31" name="PythonSource" x="960.305887126" y="-474.794528421"/>
+    </action>
+    <action date="20 Feb 2007 23:17:55" parent="256" time="257" user="emanuele" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="31" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Awindow%20%3D%20vtk.vtkRenderWindow%28%29%0Ar%20%3D%20self.getInputFromPort%28%22renderer%22%29.vtkInstance%0Ar.ResetCamera%28%29%0Awindow.AddRenderer%28r%29%0Awindow.OffScreenRenderingOn%28%29%0Awindow.Start%28%29%0Awindow.Render%28%29%0Awin2image%20%3D%20vtk.vtkWindowToImageFilter%28%29%0Awin2image.SetInput%28window%29%0Awin2image.Upda [...]
+    </action>
+    <action date="20 Feb 2007 23:17:55" parent="257" time="258" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="31" value=""/>
+    </action>
+    <action date="20 Feb 2007 23:18:47" parent="258" time="259" user="emanuele" what="moveModule">
+      <move dx="-50.1123073025" dy="-84.5645185729" id="30"/>
+      <move dx="-28.1881728576" dy="-81.4324993665" id="31"/>
+    </action>
+    <action date="20 Feb 2007 23:18:47" parent="259" time="260" user="emanuele" what="addModulePort">
+      <addPort moduleId="31" portName="renderer" portSpec="(vtkRenderer)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 23:18:47" parent="260" time="261" user="emanuele" what="addModulePort">
+      <addPort moduleId="31" portName="image" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 23:19:09" parent="261" time="262" user="emanuele" what="addModulePort">
+      <addPort moduleId="30" portName="imageFile" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="20 Feb 2007 23:19:10" parent="262" time="263" user="emanuele" what="addModulePort">
+      <addPort moduleId="30" portName="htmlFile" portSpec="(File)" portType="output"/>
+    </action>
+    <action date="20 Feb 2007 23:19:15" parent="263" time="264" user="emanuele" what="moveModule">
+      <move dx="-12.5280768256" dy="3.1320192064" id="31"/>
+    </action>
+    <action date="20 Feb 2007 23:19:15" parent="264" time="265" user="emanuele" what="addConnection">
+      <connect destinationId="30" destinationModule="PythonSource" destinationPort="imageFile(File)" id="30" sourceId="31" sourceModule="PythonSource" sourcePort="image(File)"/>
+    </action>
+    <action date="20 Feb 2007 23:19:20" parent="265" time="266" user="emanuele" what="addConnection">
+      <connect destinationId="29" destinationModule="RichTextCell" destinationPort="File(File)" id="31" sourceId="30" sourceModule="PythonSource" sourcePort="htmlFile(File)"/>
+    </action>
+    <action date="20 Feb 2007 23:19:33" parent="266" time="267" user="emanuele" what="moveModule">
+      <move dx="-43.8482688897" dy="53.2443265089" id="5"/>
+    </action>
+    <action date="20 Feb 2007 23:19:33" parent="267" time="268" user="emanuele" what="addConnection">
+      <connect destinationId="31" destinationModule="PythonSource" destinationPort="renderer(vtkRenderer)" id="32" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="07 Mar 2007 12:57:29" parent="157" time="269" user="hvo" what="moveModule">
+      <move dx="24.1926213319" dy="-39.8466704291" id="18"/>
+    </action>
+    <action date="07 Mar 2007 12:57:29" parent="269" time="270" user="hvo" what="addModule">
+      <object cache="1" id="27" name="SingleCellSheetReference" x="1461.51894752" y="-330.158126412"/>
+    </action>
+    <action date="07 Mar 2007 12:57:32" parent="270" time="271" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="CellLocation" destinationPort="SheetReference(SheetReference)" id="28" sourceId="27" sourceModule="SingleCellSheetReference" sourcePort="self(SingleCellSheetReference)"/>
+    </action>
+    <action date="07 Mar 2007 12:58:11" parent="271" time="272" user="hvo" what="deleteConnection">
+      <connection connectionId="21"/>
+    </action>
+    <action date="07 Mar 2007 12:58:11" parent="272" time="273" user="hvo" what="deleteModule">
+      <module moduleId="17"/>
+    </action>
+    <action date="07 Mar 2007 13:18:35" parent="273" time="274" user="hvo" what="addModule">
+      <object cache="1" id="28" name="vtkCylinder" x="342.965984764" y="-210.618115125"/>
+    </action>
+    <action date="07 Mar 2007 13:19:26" parent="274" time="275" user="hvo" what="moveModule">
+      <move dx="-1.42309537247" dy="1.42309537247" id="26"/>
+      <move dx="155.117395599" dy="24.1926213319" id="28"/>
+    </action>
+    <action date="07 Mar 2007 13:20:47" parent="275" time="276" user="hvo" what="moveModule">
+      <move dx="108.155248307" dy="-68.3085778784" id="0"/>
+      <move dx="-1.42309537247" dy="0.0" id="6"/>
+      <move dx="91.0781038379" dy="-183.579303048" id="12"/>
+    </action>
+    <action date="07 Mar 2007 13:21:09" parent="276" time="277" user="hvo" what="moveModule">
+      <move dx="-95.3473899553" dy="227.695259595" id="28"/>
+    </action>
+    <action date="07 Mar 2007 13:21:09" parent="277" time="278" user="hvo" what="addModule">
+      <object cache="1" id="29" name="vtkCutter" x="397.043608918" y="-187.848589166"/>
+    </action>
+    <action date="07 Mar 2007 13:21:18" parent="278" time="279" user="hvo" what="moveModule">
+      <move dx="-9.96166760727" dy="116.693820542" id="29"/>
+    </action>
+    <action date="07 Mar 2007 13:21:18" parent="279" time="280" user="hvo" what="addConnection">
+      <connect destinationId="29" destinationModule="vtkCutter" destinationPort="SetCutFunction(vtkImplicitFunction)" id="29" sourceId="28" sourceModule="vtkCylinder" sourcePort="self(vtkCylinder)"/>
+    </action>
+    <action date="07 Mar 2007 13:21:41" parent="280" time="281" user="hvo" what="moveModule">
+      <move dx="-4.2692861174" dy="-152.271204854" id="19"/>
+      <move dx="-41.2697658015" dy="28.4619074493" id="28"/>
+      <move dx="85.385722348" dy="29.8850028218" id="29"/>
+    </action>
+    <action date="07 Mar 2007 13:21:41" parent="281" time="282" user="hvo" what="addConnection">
+      <connect destinationId="19" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="30" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:21:44" parent="282" time="283" user="hvo" what="deleteConnection">
+      <connection connectionId="13"/>
+    </action>
+    <action date="07 Mar 2007 13:21:53" parent="283" time="284" user="hvo" what="moveModule">
+      <move dx="-29.8850028218" dy="-42.692861174" id="28"/>
+      <move dx="55.5007195262" dy="4.2692861174" id="29"/>
+    </action>
+    <action date="07 Mar 2007 13:21:53" parent="284" time="285" user="hvo" what="addConnection">
+      <connect destinationId="29" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="31" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:22:20" parent="285" time="286" user="hvo" what="moveModule">
+      <move dx="243.349308692" dy="12.8078583522" id="2"/>
+      <move dx="99.6166760727" dy="-1.42309537247" id="7"/>
+      <move dx="214.887401242" dy="-21.346430587" id="12"/>
+      <move dx="130.924774267" dy="18.5002398421" id="15"/>
+      <move dx="108.155248307" dy="68.3085778784" id="19"/>
+      <move dx="428.351707113" dy="128.078583522" id="28"/>
+      <move dx="24.1926213319" dy="39.8466704291" id="29"/>
+    </action>
+    <action date="07 Mar 2007 13:22:20" parent="286" time="287" user="hvo" what="changeParameter">
+      <set alias="" function="GenerateCutScalarsOn" functionId="0" moduleId="29" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:22:40" parent="287" time="288" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:25:25" parent="288" time="289" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:25:29" parent="289" time="290" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="297794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:25:33" parent="290" time="291" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="297794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:25:35" parent="291" time="292" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="1" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:25:43" parent="292" time="293" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="1" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="100000"/>
+    </action>
+    <action date="07 Mar 2007 13:25:44" parent="293" time="294" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="1" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="100000"/>
+    </action>
+    <action date="07 Mar 2007 13:35:32" parent="294" time="295" user="hvo" what="addModule">
+      <object cache="1" id="30" name="vtkGeneralTransform" x="663.819690788" y="276.354120199"/>
+    </action>
+    <action date="07 Mar 2007 13:35:35" parent="295" time="296" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="32" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 13:39:06" parent="296" time="297" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:39:18" parent="297" time="298" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="89"/>
+    </action>
+    <action date="07 Mar 2007 13:39:20" parent="298" time="299" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 13:39:21" parent="299" time="300" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 13:40:02" parent="300" time="301" user="hvo" what="moveModule">
+      <move dx="-1.42450577422" dy="-1.42450577422" id="29"/>
+    </action>
+    <action date="07 Mar 2007 13:40:02" parent="301" time="302" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="287794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:40:02" parent="302" time="303" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="287794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:40:14" parent="303" time="304" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:40:15" parent="304" time="305" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:11" parent="305" time="306" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:13" parent="306" time="307" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:20" parent="307" time="308" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="107794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:21" parent="308" time="309" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="107794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:27" parent="309" time="310" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="203246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="107794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:29" parent="310" time="311" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="203246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="107794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:41:36" parent="311" time="312" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="203246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="107794"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:41:41" parent="312" time="313" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="203246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:41:42" parent="313" time="314" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="203246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:41:47" parent="314" time="315" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:41:49" parent="315" time="316" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:41:54" parent="316" time="317" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:41:56" parent="317" time="318" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:42:02" parent="318" time="319" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="303246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:42:04" parent="319" time="320" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="323246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:42:05" parent="320" time="321" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="323246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:42:12" parent="321" time="322" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:42:13" parent="322" time="323" user="hvo" what="changeParameter">
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetCenter" functionId="0" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:42:46" parent="323" time="324" user="hvo" what="moveModule">
+      <move dx="15.6695635165" dy="-45.5841847752" id="19"/>
+      <move dx="126.781013906" dy="29.9146212587" id="29"/>
+    </action>
+    <action date="07 Mar 2007 13:42:46" parent="324" time="325" user="hvo" what="addModule">
+      <object cache="1" id="31" name="vtkActor" x="805.467082233" y="-273.317523865"/>
+    </action>
+    <action date="07 Mar 2007 13:42:47" parent="325" time="326" user="hvo" what="addModule">
+      <object cache="1" id="32" name="vtkDataSetMapper" x="692.24852553" y="-120.732097996"/>
+    </action>
+    <action date="07 Mar 2007 13:42:47" parent="326" time="327" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="31" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:42:47" parent="327" time="328" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="32" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:42:47" parent="328" time="329" user="hvo" what="addConnection">
+      <connect destinationId="31" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="33" sourceId="32" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="07 Mar 2007 13:42:58" parent="329" time="330" user="hvo" what="moveModule">
+      <move dx="9.97154041956" dy="-9.97154041956" id="15"/>
+      <move dx="-277.778625974" dy="-25.641103936" id="31"/>
+      <move dx="-237.892464295" dy="-34.1881385814" id="32"/>
+    </action>
+    <action date="07 Mar 2007 13:42:58" parent="330" time="331" user="hvo" what="addConnection">
+      <connect destinationId="32" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="34" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:43:02" parent="331" time="332" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="35" sourceId="31" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 13:43:27" parent="332" time="333" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.84901154845" id="6"/>
+    </action>
+    <action date="07 Mar 2007 13:43:27" parent="333" time="334" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="2.0"/>
+    </action>
+    <action date="07 Mar 2007 13:43:30" parent="334" time="335" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+    </action>
+    <action date="07 Mar 2007 13:43:30" parent="335" time="336" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+    </action>
+    <action date="07 Mar 2007 13:43:59" parent="336" time="337" user="hvo" what="moveModule">
+      <move dx="1.42450577422" dy="0.0" id="6"/>
+      <move dx="1.42450577422" dy="0.0" id="15"/>
+    </action>
+    <action date="07 Mar 2007 13:43:59" parent="337" time="338" user="hvo" what="deleteConnection">
+      <connection connectionId="10"/>
+    </action>
+    <action date="07 Mar 2007 13:44:32" parent="338" time="339" user="hvo" what="addConnection">
+      <connect destinationId="32" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="36" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="07 Mar 2007 13:44:38" parent="339" time="340" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="37" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 13:47:30" parent="340" time="341" user="hvo" what="addModule">
+      <object cache="1" id="33" name="vtkDiskSource" x="487.180974784" y="450.143824655"/>
+    </action>
+    <action date="07 Mar 2007 13:47:37" parent="341" time="342" user="hvo" what="moveModule">
+      <move dx="437.323272687" dy="-414.531180299" id="33"/>
+    </action>
+    <action date="07 Mar 2007 13:47:37" parent="342" time="343" user="hvo" what="changeParameter">
+      <set alias="" function="SetInnerRadius" functionId="0" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:47:47" parent="343" time="344" user="hvo" what="changeParameter">
+      <set alias="" function="SetInnerRadius" functionId="0" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="100000"/>
+    </action>
+    <action date="07 Mar 2007 13:47:51" parent="344" time="345" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="1" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:47:59" parent="345" time="346" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="1" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="110000"/>
+    </action>
+    <action date="07 Mar 2007 13:48:01" parent="346" time="347" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="1" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="110000"/>
+    </action>
+    <action date="07 Mar 2007 13:50:12" parent="347" time="348" user="hvo" what="addConnection">
+      <connect destinationId="19" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="38" sourceId="33" sourceModule="vtkDiskSource" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:50:14" parent="348" time="349" user="hvo" what="deleteConnection">
+      <connection connectionId="38"/>
+    </action>
+    <action date="07 Mar 2007 13:50:18" parent="349" time="350" user="hvo" what="addModule">
+      <object cache="1" id="34" name="vtkActor" x="537.688456259" y="-288.958627801"/>
+    </action>
+    <action date="07 Mar 2007 13:50:18" parent="350" time="351" user="hvo" what="addModule">
+      <object cache="1" id="35" name="vtkDataSetMapper" x="464.356061235" y="-144.920236577"/>
+    </action>
+    <action date="07 Mar 2007 13:50:18" parent="351" time="352" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="34" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:50:18" parent="352" time="353" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="35" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:50:18" parent="353" time="354" user="hvo" what="addConnection">
+      <connect destinationId="34" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="39" sourceId="35" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="07 Mar 2007 13:50:28" parent="354" time="355" user="hvo" what="moveModule">
+      <move dx="-460.115365074" dy="-424.502720719" id="33"/>
+      <move dx="343.305891588" dy="-334.758856943" id="34"/>
+      <move dx="343.305891588" dy="-334.758856943" id="35"/>
+    </action>
+    <action date="07 Mar 2007 13:50:28" parent="355" time="356" user="hvo" what="addConnection">
+      <connect destinationId="35" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="40" sourceId="33" sourceModule="vtkDiskSource" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:50:32" parent="356" time="357" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="41" sourceId="34" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 13:51:29" parent="357" time="358" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42450577422" id="33"/>
+    </action>
+    <action date="07 Mar 2007 13:51:29" parent="358" time="359" user="hvo" what="changeParameter">
+      <set alias="" function="SetCircumferentialResolution" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="07 Mar 2007 13:51:30" parent="359" time="360" user="hvo" what="changeParameter">
+      <set alias="" function="SetCircumferentialResolution" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="20"/>
+    </action>
+    <action date="07 Mar 2007 13:51:31" parent="360" time="361" user="hvo" what="changeParameter">
+      <set alias="" function="SetCircumferentialResolution" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="20"/>
+    </action>
+    <action date="07 Mar 2007 13:51:43" parent="361" time="362" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:51:50" parent="362" time="363" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 13:51:55" parent="363" time="364" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.84901154845" id="30"/>
+    </action>
+    <action date="07 Mar 2007 13:51:55" parent="364" time="365" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:51:59" parent="365" time="366" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="28"/>
+    </action>
+    <action date="07 Mar 2007 13:54:11" parent="366" time="367" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadialResolution" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="07 Mar 2007 13:54:12" parent="367" time="368" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadialResolution" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:54:13" parent="368" time="369" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadialResolution" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="1\"/>
+    </action>
+    <action date="07 Mar 2007 13:54:15" parent="369" time="370" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadialResolution" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="1\"/>
+    </action>
+    <action date="07 Mar 2007 13:54:26" parent="370" time="371" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadialResolution" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:54:27" parent="371" time="372" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadialResolution" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="07 Mar 2007 13:55:16" parent="372" time="373" user="hvo" what="changeParameter">
+      <set alias="" function="SetCircumferentialResolution" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+    </action>
+    <action date="07 Mar 2007 13:55:20" parent="373" time="374" user="hvo" what="changeParameter">
+      <set alias="" function="SetCircumferentialResolution" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+    </action>
+    <action date="07 Mar 2007 13:55:50" parent="374" time="375" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="35"/>
+    </action>
+    <action date="07 Mar 2007 13:56:32" parent="375" time="376" user="hvo" what="addModule">
+      <object cache="1" id="36" name="vtkTransformPolyDataFilter" x="552.160462162" y="-481.00576343"/>
+    </action>
+    <action date="07 Mar 2007 13:56:40" parent="376" time="377" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-7.11546987323" id="30"/>
+      <move dx="-78.2701686055" dy="83.9625445041" id="33"/>
+      <move dx="-25.6156915436" dy="14.2309397465" id="36"/>
+    </action>
+    <action date="07 Mar 2007 13:56:40" parent="377" time="378" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="42" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 13:56:44" parent="378" time="379" user="hvo" what="moveModule">
+      <move dx="9.96165782252" dy="51.2313830872" id="36"/>
+    </action>
+    <action date="07 Mar 2007 13:56:44" parent="379" time="380" user="hvo" what="deleteConnection">
+      <connection connectionId="40"/>
+    </action>
+    <action date="07 Mar 2007 13:56:47" parent="380" time="381" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="43" sourceId="33" sourceModule="vtkDiskSource" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:56:49" parent="381" time="382" user="hvo" what="addConnection">
+      <connect destinationId="35" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="44" sourceId="36" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:56:53" parent="382" time="383" user="hvo" what="deleteConnection">
+      <connection connectionId="39"/>
+      <connection connectionId="44"/>
+    </action>
+    <action date="07 Mar 2007 13:56:53" parent="383" time="384" user="hvo" what="deleteModule">
+      <module moduleId="35"/>
+    </action>
+    <action date="07 Mar 2007 13:56:57" parent="384" time="385" user="hvo" what="addModule">
+      <object cache="1" id="37" name="vtkDataSetMapper" x="464.356061235" y="-144.920236577"/>
+    </action>
+    <action date="07 Mar 2007 13:56:57" parent="385" time="386" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="37" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:57:02" parent="386" time="387" user="hvo" what="moveModule">
+      <move dx="347.234929813" dy="-372.850621357" id="37"/>
+    </action>
+    <action date="07 Mar 2007 13:57:02" parent="387" time="388" user="hvo" what="addConnection">
+      <connect destinationId="37" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="45" sourceId="36" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 13:57:07" parent="388" time="389" user="hvo" what="addConnection">
+      <connect destinationId="34" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="46" sourceId="37" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="07 Mar 2007 13:57:36" parent="389" time="390" user="hvo" what="addModule">
+      <object cache="1" id="38" name="vtkGeneralTransform" x="673.819690788" y="276.389638777"/>
+    </action>
+    <action date="07 Mar 2007 13:57:36" parent="390" time="391" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 13:57:36" parent="391" time="392" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 13:57:36" parent="392" time="393" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="38" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:57:41" parent="393" time="394" user="hvo" what="moveModule">
+      <move dx="-192.117686577" dy="135.193927591" id="38"/>
+    </action>
+    <action date="07 Mar 2007 13:57:41" parent="394" time="395" user="hvo" what="addConnection">
+      <connect destinationId="30" destinationModule="vtkAbstractTransform" destinationPort="SetInverse(vtkAbstractTransform)" id="47" sourceId="38" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 13:57:45" parent="395" time="396" user="hvo" what="deleteConnection">
+      <connection connectionId="47"/>
+    </action>
+    <action date="07 Mar 2007 13:57:47" parent="396" time="397" user="hvo" what="addConnection">
+      <connect destinationId="30" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="48" sourceId="38" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 13:58:00" parent="397" time="398" user="hvo" what="moveModule">
+      <move dx="58.3468529605" dy="-15.6540337211" id="38"/>
+    </action>
+    <action date="07 Mar 2007 13:58:00" parent="398" time="399" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="38"/>
+    </action>
+    <action date="07 Mar 2007 13:58:03" parent="399" time="400" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="30"/>
+    </action>
+    <action date="07 Mar 2007 13:58:07" parent="400" time="401" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:58:09" parent="401" time="402" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 13:58:10" parent="402" time="403" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 13:58:12" parent="403" time="404" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 13:58:19" parent="404" time="405" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="49" sourceId="38" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 13:58:21" parent="405" time="406" user="hvo" what="deleteConnection">
+      <connection connectionId="42"/>
+    </action>
+    <action date="07 Mar 2007 13:59:02" parent="406" time="407" user="hvo" what="moveModule">
+      <move dx="-24.192597569" dy="58.3468529605" id="32"/>
+    </action>
+    <action date="07 Mar 2007 13:59:02" parent="407" time="408" user="hvo" what="deleteConnection">
+      <connection connectionId="37"/>
+    </action>
+    <action date="07 Mar 2007 13:59:25" parent="408" time="409" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="1" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="101000"/>
+    </action>
+    <action date="07 Mar 2007 13:59:26" parent="409" time="410" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="1" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="101000"/>
+    </action>
+    <action date="07 Mar 2007 13:59:42" parent="410" time="411" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="50" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 13:59:44" parent="411" time="412" user="hvo" what="deleteConnection">
+      <connection connectionId="35"/>
+    </action>
+    <action date="07 Mar 2007 14:00:20" parent="412" time="413" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="38"/>
+    </action>
+    <action date="07 Mar 2007 14:00:20" parent="413" time="414" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:00:21" parent="414" time="415" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:00:23" parent="415" time="416" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:00:24" parent="416" time="417" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:00:40" parent="417" time="418" user="hvo" what="moveModule">
+      <move dx="18.5002216704" dy="-41.2697252647" id="38"/>
+    </action>
+    <action date="07 Mar 2007 14:00:40" parent="418" time="419" user="hvo" what="deleteConnection">
+      <connection connectionId="49"/>
+    </action>
+    <action date="07 Mar 2007 14:00:43" parent="419" time="420" user="hvo" what="moveModule">
+      <move dx="-52.6544770619" dy="41.2697252647" id="38"/>
+    </action>
+    <action date="07 Mar 2007 14:00:43" parent="420" time="421" user="hvo" what="deleteConnection">
+      <connection connectionId="48"/>
+    </action>
+    <action date="07 Mar 2007 14:00:46" parent="421" time="422" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="51" sourceId="38" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:00:47" parent="422" time="423" user="hvo" what="deleteConnection">
+      <connection connectionId="32"/>
+    </action>
+    <action date="07 Mar 2007 14:00:49" parent="423" time="424" user="hvo" what="addConnection">
+      <connect destinationId="38" destinationModule="vtkAbstractTransform" destinationPort="SetInverse(vtkAbstractTransform)" id="52" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:00:52" parent="424" time="425" user="hvo" what="moveModule">
+      <move dx="83.9625445041" dy="-27.0387855183" id="38"/>
+    </action>
+    <action date="07 Mar 2007 14:00:52" parent="425" time="426" user="hvo" what="deleteConnection">
+      <connection connectionId="52"/>
+    </action>
+    <action date="07 Mar 2007 14:00:54" parent="426" time="427" user="hvo" what="addConnection">
+      <connect destinationId="38" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="53" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:01:15" parent="427" time="428" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:01:23" parent="428" time="429" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:01:27" parent="429" time="430" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:01:30" parent="430" time="431" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="38"/>
+    </action>
+    <action date="07 Mar 2007 14:01:30" parent="431" time="432" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="0" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="38" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:01:35" parent="432" time="433" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:01:35" parent="433" time="434" user="hvo" what="deleteConnection">
+      <connection connectionId="51"/>
+      <connection connectionId="53"/>
+    </action>
+    <action date="07 Mar 2007 14:01:35" parent="434" time="435" user="hvo" what="deleteModule">
+      <module moduleId="38"/>
+    </action>
+    <action date="07 Mar 2007 14:01:39" parent="435" time="436" user="hvo" what="moveModule">
+      <move dx="15.6540337211" dy="52.6544770619" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:01:39" parent="436" time="437" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="54" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:02:04" parent="437" time="438" user="hvo" what="moveModule">
+      <move dx="-49.8082891126" dy="-59.7699469351" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:02:04" parent="438" time="439" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:02:07" parent="439" time="440" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:02:08" parent="440" time="441" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:02:09" parent="441" time="442" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:04:00" parent="442" time="443" user="hvo" what="moveModule">
+      <move dx="61.1930409098" dy="-4.26928192394" id="31"/>
+    </action>
+    <action date="07 Mar 2007 14:04:00" parent="443" time="444" user="hvo" what="deleteConnection">
+      <connection connectionId="41"/>
+    </action>
+    <action date="07 Mar 2007 14:04:16" parent="444" time="445" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:04:16" parent="445" time="446" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:04:18" parent="446" time="447" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:04:21" parent="447" time="448" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="313246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:04:38" parent="448" time="449" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.42309397465" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:04:38" parent="449" time="450" user="hvo" what="deleteConnection">
+      <connection connectionId="34"/>
+    </action>
+    <action date="07 Mar 2007 14:05:18" parent="450" time="451" user="hvo" what="moveModule">
+      <move dx="1.42309397465" dy="0.0" id="29"/>
+    </action>
+    <action date="07 Mar 2007 14:05:18" parent="451" time="452" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:05:19" parent="452" time="453" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:05:28" parent="453" time="454" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="1" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="307794"/>
+    </action>
+    <action date="07 Mar 2007 14:05:41" parent="454" time="455" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="30"/>
+    </action>
+    <action date="07 Mar 2007 14:05:47" parent="455" time="456" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:05:49" parent="456" time="457" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="207794"/>
+    </action>
+    <action date="07 Mar 2007 14:05:50" parent="457" time="458" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:05:53" parent="458" time="459" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:05:53" parent="459" time="460" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="1" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:06:09" parent="460" time="461" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:06:11" parent="461" time="462" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:06:12" parent="462" time="463" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:06:12" parent="463" time="464" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="333246"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:06:34" parent="464" time="465" user="hvo" what="addConnection">
+      <connect destinationId="32" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="55" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 14:06:36" parent="465" time="466" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkViewport" destinationPort="AddActor2D(vtkProp)" id="56" sourceId="31" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 14:06:41" parent="466" time="467" user="hvo" what="deleteConnection">
+      <connection connectionId="56"/>
+    </action>
+    <action date="07 Mar 2007 14:06:43" parent="467" time="468" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="57" sourceId="31" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 14:07:43" parent="468" time="469" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="207794"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:07:44" parent="469" time="470" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="30"/>
+    </action>
+    <action date="07 Mar 2007 14:08:52" parent="470" time="471" user="hvo" what="deleteConnection">
+      <connection connectionId="57"/>
+    </action>
+    <action date="07 Mar 2007 14:09:09" parent="471" time="472" user="hvo" what="moveModule">
+      <move dx="1.42309397465" dy="0.0" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:09:09" parent="472" time="473" user="hvo" what="addModule">
+      <object cache="1" id="39" name="vtkGeneralTransform" x="639.665435397" y="269.274168904"/>
+    </action>
+    <action date="07 Mar 2007 14:09:09" parent="473" time="474" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="39" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:09:09" parent="474" time="475" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="39" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:09:13" parent="475" time="476" user="hvo" what="moveModule">
+      <move dx="-37.0004433408" dy="81.1163565548" id="39"/>
+    </action>
+    <action date="07 Mar 2007 14:09:13" parent="476" time="477" user="hvo" what="addConnection">
+      <connect destinationId="30" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="58" sourceId="39" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:09:16" parent="477" time="478" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="39"/>
+    </action>
+    <action date="07 Mar 2007 14:09:20" parent="478" time="479" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:09:23" parent="479" time="480" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:09:24" parent="480" time="481" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:09:26" parent="481" time="482" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="39" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:09:36" parent="482" time="483" user="hvo" what="deleteConnection">
+      <connection connectionId="58"/>
+    </action>
+    <action date="07 Mar 2007 14:09:36" parent="483" time="484" user="hvo" what="deleteModule">
+      <module moduleId="39"/>
+    </action>
+    <action date="07 Mar 2007 14:09:40" parent="484" time="485" user="hvo" what="moveModule">
+      <move dx="-7.11546987323" dy="86.8087324534" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:09:40" parent="485" time="486" user="hvo" what="deleteConnection">
+      <connection connectionId="54"/>
+    </action>
+    <action date="07 Mar 2007 14:09:41" parent="486" time="487" user="hvo" what="addModule">
+      <object cache="1" id="40" name="vtkGeneralTransform" x="639.665435397" y="269.274168904"/>
+    </action>
+    <action date="07 Mar 2007 14:09:41" parent="487" time="488" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:09:41" parent="488" time="489" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="40" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:09:44" parent="489" time="490" user="hvo" what="addConnection">
+      <connect destinationId="40" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="59" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:09:46" parent="490" time="491" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="60" sourceId="40" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:09:48" parent="491" time="492" user="hvo" what="moveModule">
+      <move dx="31.3080674422" dy="-46.9621011633" id="40"/>
+    </action>
+    <action date="07 Mar 2007 14:09:48" parent="492" time="493" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="40"/>
+    </action>
+    <action date="07 Mar 2007 14:09:54" parent="493" time="494" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:09:58" parent="494" time="495" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:09:58" parent="495" time="496" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:09:59" parent="496" time="497" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:13" parent="497" time="498" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:14" parent="498" time="499" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:28" parent="499" time="500" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:29" parent="500" time="501" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:38" parent="501" time="502" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:38" parent="502" time="503" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:43" parent="503" time="504" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:44" parent="504" time="505" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:10:53" parent="505" time="506" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:11:06" parent="506" time="507" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:11:10" parent="507" time="508" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:11:11" parent="508" time="509" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:11:16" parent="509" time="510" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:11:16" parent="510" time="511" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="40" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:11:58" parent="511" time="512" user="hvo" what="moveModule">
+      <move dx="7.11546987323" dy="-62.6161348844" id="29"/>
+    </action>
+    <action date="07 Mar 2007 14:11:58" parent="512" time="513" user="hvo" what="deleteConnection">
+      <connection connectionId="60"/>
+      <connection connectionId="59"/>
+    </action>
+    <action date="07 Mar 2007 14:11:58" parent="513" time="514" user="hvo" what="deleteModule">
+      <module moduleId="40"/>
+    </action>
+    <action date="07 Mar 2007 14:12:01" parent="514" time="515" user="hvo" what="moveModule">
+      <move dx="22.7695035943" dy="-81.1163565548" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:12:01" parent="515" time="516" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="61" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:12:01" parent="516" time="517" user="hvo" what="addModule">
+      <object cache="1" id="41" name="vtkGeneralTransform" x="680.973502839" y="232.312067741"/>
+    </action>
+    <action date="07 Mar 2007 14:12:01" parent="517" time="518" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:12:01" parent="518" time="519" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="41" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:12:07" parent="519" time="520" user="hvo" what="moveModule">
+      <move dx="-9.96165782252" dy="-15.6540337211" id="30"/>
+      <move dx="-85.3856384787" dy="109.578236048" id="41"/>
+    </action>
+    <action date="07 Mar 2007 14:12:07" parent="520" time="521" user="hvo" what="addConnection">
+      <connect destinationId="30" destinationModule="vtkAbstractTransform" destinationPort="SetInverse(vtkAbstractTransform)" id="62" sourceId="41" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:12:11" parent="521" time="522" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:12:12" parent="522" time="523" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:12:14" parent="523" time="524" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:12:24" parent="524" time="525" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:12:25" parent="525" time="526" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:12:26" parent="526" time="527" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:12:37" parent="527" time="528" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="-300000"/>
+    </action>
+    <action date="07 Mar 2007 14:12:39" parent="528" time="529" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="-300000"/>
+    </action>
+    <action date="07 Mar 2007 14:12:41" parent="529" time="530" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="-300000"/>
+    </action>
+    <action date="07 Mar 2007 14:12:42" parent="530" time="531" user="hvo" what="deleteConnection">
+      <connection connectionId="62"/>
+    </action>
+    <action date="07 Mar 2007 14:12:44" parent="531" time="532" user="hvo" what="addConnection">
+      <connect destinationId="30" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="63" sourceId="41" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:13:00" parent="532" time="533" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.42309397465" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:13:00" parent="533" time="534" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-90"/>
+    </action>
+    <action date="07 Mar 2007 14:13:01" parent="534" time="535" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-90"/>
+    </action>
+    <action date="07 Mar 2007 14:13:03" parent="535" time="536" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="-300000"/>
+    </action>
+    <action date="07 Mar 2007 14:13:04" parent="536" time="537" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:13:05" parent="537" time="538" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:13:14" parent="538" time="539" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:13:16" parent="539" time="540" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="-300000"/>
+    </action>
+    <action date="07 Mar 2007 14:13:17" parent="540" time="541" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="-300000"/>
+    </action>
+    <action date="07 Mar 2007 14:13:25" parent="541" time="542" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:13:26" parent="542" time="543" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:13:27" parent="543" time="544" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:13:28" parent="544" time="545" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:13:38" parent="545" time="546" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-3000000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:13:40" parent="546" time="547" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-3000000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-3000000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:13:41" parent="547" time="548" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-3000000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-3000000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:13:46" parent="548" time="549" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="-3000000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:13:52" parent="549" time="550" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:40:25" parent="550" time="551" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="29"/>
+    </action>
+    <action date="07 Mar 2007 14:40:27" parent="551" time="552" user="hvo" what="changeParameter">
+      <set alias="" function="GenerateCutScalarsOff" functionId="0" moduleId="29" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:40:45" parent="552" time="553" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="41"/>
+    </action>
+    <action date="07 Mar 2007 14:40:45" parent="553" time="554" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="600000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:40:46" parent="554" time="555" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="600000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:40:53" parent="555" time="556" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:40:54" parent="556" time="557" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="41" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:41:18" parent="557" time="558" user="hvo" what="deleteConnection">
+      <connection connectionId="63"/>
+    </action>
+    <action date="07 Mar 2007 14:41:18" parent="558" time="559" user="hvo" what="deleteModule">
+      <module moduleId="41"/>
+    </action>
+    <action date="07 Mar 2007 14:41:21" parent="559" time="560" user="hvo" what="moveModule">
+      <move dx="15.6540337211" dy="102.462766174" id="30"/>
+    </action>
+    <action date="07 Mar 2007 14:41:21" parent="560" time="561" user="hvo" what="deleteConnection">
+      <connection connectionId="61"/>
+    </action>
+    <action date="07 Mar 2007 14:41:25" parent="561" time="562" user="hvo" what="addModule">
+      <object cache="1" id="42" name="vtkGeneralTransform" x="662.434938991" y="363.198371231"/>
+    </action>
+    <action date="07 Mar 2007 14:41:25" parent="562" time="563" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="-90"/>
+    </action>
+    <action date="07 Mar 2007 14:41:25" parent="563" time="564" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="42" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:41:30" parent="564" time="565" user="hvo" what="moveModule">
+      <move dx="-11.3847517972" dy="-108.155142073" id="42"/>
+    </action>
+    <action date="07 Mar 2007 14:41:30" parent="565" time="566" user="hvo" what="addConnection">
+      <connect destinationId="42" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="64" sourceId="30" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:41:33" parent="566" time="567" user="hvo" what="moveModule">
+      <move dx="1.42309397465" dy="-2.84618794929" id="42"/>
+    </action>
+    <action date="07 Mar 2007 14:41:33" parent="567" time="568" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="65" sourceId="42" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:43:58" parent="568" time="569" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.42309397465" id="30"/>
+      <move dx="1.42309397465" dy="0.0" id="33"/>
+      <move dx="0.0" dy="1.42309397465" id="42"/>
+    </action>
+    <action date="07 Mar 2007 14:43:58" parent="569" time="570" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="30"/>
+    </action>
+    <action date="07 Mar 2007 14:44:01" parent="570" time="571" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:44:05" parent="571" time="572" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:44:07" parent="572" time="573" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="600000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:44:08" parent="573" time="574" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="600000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:44:08" parent="574" time="575" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="600000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:44:13" parent="575" time="576" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:44:18" parent="576" time="577" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:44:20" parent="577" time="578" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:44:55" parent="578" time="579" user="hvo" what="deleteConnection">
+      <connection connectionId="64"/>
+    </action>
+    <action date="07 Mar 2007 14:44:55" parent="579" time="580" user="hvo" what="deleteModule">
+      <module moduleId="30"/>
+    </action>
+    <action date="07 Mar 2007 14:44:58" parent="580" time="581" user="hvo" what="moveModule">
+      <move dx="-4.26928192394" dy="82.5394505294" id="42"/>
+    </action>
+    <action date="07 Mar 2007 14:44:58" parent="581" time="582" user="hvo" what="addModule">
+      <object cache="1" id="43" name="vtkGeneralTransform" x="662.473281168" y="263.620135183"/>
+    </action>
+    <action date="07 Mar 2007 14:44:58" parent="582" time="583" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-90"/>
+    </action>
+    <action date="07 Mar 2007 14:44:58" parent="583" time="584" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="43" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:45:02" parent="584" time="585" user="hvo" what="addConnection">
+      <connect destinationId="43" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="66" sourceId="42" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:45:04" parent="585" time="586" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkImplicitFunction" destinationPort="SetTransform(vtkAbstractTransform)" id="67" sourceId="43" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:45:05" parent="586" time="587" user="hvo" what="deleteConnection">
+      <connection connectionId="65"/>
+    </action>
+    <action date="07 Mar 2007 14:45:08" parent="587" time="588" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="43"/>
+    </action>
+    <action date="07 Mar 2007 14:45:08" parent="588" time="589" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="43"/>
+    </action>
+    <action date="07 Mar 2007 14:45:10" parent="589" time="590" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:45:14" parent="590" time="591" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:45:15" parent="591" time="592" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:45:16" parent="592" time="593" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:45:17" parent="593" time="594" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:45:18" parent="594" time="595" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-30000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:45:24" parent="595" time="596" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 14:45:30" parent="596" time="597" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:45:37" parent="597" time="598" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:45:39" parent="598" time="599" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:45:46" parent="599" time="600" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:45:47" parent="600" time="601" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:46:04" parent="601" time="602" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="300000"/>
+    </action>
+    <action date="07 Mar 2007 14:46:10" parent="602" time="603" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:46:13" parent="603" time="604" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:46:14" parent="604" time="605" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:48:08" parent="605" time="606" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="07 Mar 2007 14:48:23" parent="606" time="607" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="40000"/>
+    </action>
+    <action date="07 Mar 2007 14:48:24" parent="607" time="608" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="40000"/>
+    </action>
+    <action date="07 Mar 2007 14:48:36" parent="608" time="609" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="68" sourceId="31" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 14:49:09" parent="609" time="610" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:49:48" parent="610" time="611" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="6"/>
+    </action>
+    <action date="07 Mar 2007 14:49:48" parent="611" time="612" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="288871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="523378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:49:49" parent="612" time="613" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="288871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="523378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:51:34" parent="613" time="614" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="32"/>
+    </action>
+    <action date="07 Mar 2007 14:51:34" parent="614" time="615" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="288871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="423378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:51:36" parent="615" time="616" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="288871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="423378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:51:40" parent="616" time="617" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="188871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="423378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:51:43" parent="617" time="618" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="188871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="07 Mar 2007 14:51:52" parent="618" time="619" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="388871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="423378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:51:54" parent="619" time="620" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="388871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="07 Mar 2007 14:51:54" parent="620" time="621" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="388871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="07 Mar 2007 14:52:05" parent="621" time="622" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="318871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="423378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:52:10" parent="622" time="623" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="318871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="07 Mar 2007 14:52:10" parent="623" time="624" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="318871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="07 Mar 2007 14:52:21" parent="624" time="625" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="318871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="323378.928288"/>
+    </action>
+    <action date="07 Mar 2007 14:53:18" parent="625" time="626" user="hvo" what="addModule">
+      <object cache="1" id="44" name="vtkGeneralTransform" x="658.203999245" y="346.159585713"/>
+    </action>
+    <action date="07 Mar 2007 14:53:18" parent="626" time="627" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="44" parameter="<no description>" parameterId="0" type="Float" value="-90"/>
+    </action>
+    <action date="07 Mar 2007 14:53:18" parent="627" time="628" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="44" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:53:24" parent="628" time="629" user="hvo" what="moveModule">
+      <move dx="-280.349513005" dy="-557.852838061" id="44"/>
+    </action>
+    <action date="07 Mar 2007 14:53:24" parent="629" time="630" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="69" sourceId="44" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:53:28" parent="630" time="631" user="hvo" what="moveModule">
+      <move dx="35.5773493661" dy="-5.69237589858" id="44"/>
+    </action>
+    <action date="07 Mar 2007 14:53:28" parent="631" time="632" user="hvo" what="addConnection">
+      <connect destinationId="44" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="70" sourceId="43" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:53:49" parent="632" time="633" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="71" sourceId="43" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:53:54" parent="633" time="634" user="hvo" what="deleteConnection">
+      <connection connectionId="69"/>
+    </action>
+    <action date="07 Mar 2007 14:54:10" parent="634" time="635" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="72" sourceId="44" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:54:12" parent="635" time="636" user="hvo" what="deleteConnection">
+      <connection connectionId="71"/>
+    </action>
+    <action date="07 Mar 2007 14:54:15" parent="636" time="637" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="73" sourceId="34" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 14:54:42" parent="637" time="638" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:54:43" parent="638" time="639" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:54:46" parent="639" time="640" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:54:47" parent="640" time="641" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:54:48" parent="641" time="642" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:55:15" parent="642" time="643" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.42309397465" id="42"/>
+    </action>
+    <action date="07 Mar 2007 14:55:15" parent="643" time="644" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:55:17" parent="644" time="645" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-300000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 14:55:43" parent="645" time="646" user="hvo" what="deleteConnection">
+      <connection connectionId="70"/>
+    </action>
+    <action date="07 Mar 2007 14:55:46" parent="646" time="647" user="hvo" what="addConnection">
+      <connect destinationId="44" destinationModule="vtkAbstractTransform" destinationPort="SetInverse(vtkAbstractTransform)" id="74" sourceId="43" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:56:02" parent="647" time="648" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="44" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:56:03" parent="648" time="649" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="44" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:56:12" parent="649" time="650" user="hvo" what="deleteConnection">
+      <connection connectionId="72"/>
+      <connection connectionId="74"/>
+    </action>
+    <action date="07 Mar 2007 14:56:12" parent="650" time="651" user="hvo" what="deleteModule">
+      <module moduleId="44"/>
+    </action>
+    <action date="07 Mar 2007 14:56:17" parent="651" time="652" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="75" sourceId="43" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:56:30" parent="652" time="653" user="hvo" what="deleteConnection">
+      <connection connectionId="75"/>
+    </action>
+    <action date="07 Mar 2007 14:56:32" parent="653" time="654" user="hvo" what="addModule">
+      <object cache="1" id="45" name="vtkGeneralTransform" x="658.203999245" y="346.159585713"/>
+    </action>
+    <action date="07 Mar 2007 14:56:32" parent="654" time="655" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="45" parameter="<no description>" parameterId="0" type="Float" value="-90"/>
+    </action>
+    <action date="07 Mar 2007 14:56:32" parent="655" time="656" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="45" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:56:38" parent="656" time="657" user="hvo" what="moveModule">
+      <move dx="-219.156472095" dy="-559.275932036" id="45"/>
+    </action>
+    <action date="07 Mar 2007 14:56:38" parent="657" time="658" user="hvo" what="addConnection">
+      <connect destinationId="45" destinationModule="vtkAbstractTransform" destinationPort="SetInverse(vtkAbstractTransform)" id="76" sourceId="43" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:56:40" parent="658" time="659" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="77" sourceId="45" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:56:42" parent="659" time="660" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="45"/>
+    </action>
+    <action date="07 Mar 2007 14:57:00" parent="660" time="661" user="hvo" what="changeParameter">
+      <set alias="" function="RotateY" functionId="0" moduleId="45" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:57:02" parent="661" time="662" user="hvo" what="changeParameter">
+      <set alias="" function="RotateY" functionId="0" moduleId="45" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:57:13" parent="662" time="663" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="45"/>
+    </action>
+    <action date="07 Mar 2007 14:57:15" parent="663" time="664" user="hvo" what="changeParameter">
+      <set alias="" function="RotateZ" functionId="0" moduleId="45" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:57:18" parent="664" time="665" user="hvo" what="changeParameter">
+      <set alias="" function="RotateZ" functionId="0" moduleId="45" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:58:21" parent="665" time="666" user="hvo" what="moveModule">
+      <move dx="-42.6928192394" dy="76.8470746309" id="32"/>
+      <move dx="-22.7695035943" dy="74.0008866816" id="45"/>
+    </action>
+    <action date="07 Mar 2007 14:58:21" parent="666" time="667" user="hvo" what="deleteConnection">
+      <connection connectionId="77"/>
+    </action>
+    <action date="07 Mar 2007 14:58:24" parent="667" time="668" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="45"/>
+    </action>
+    <action date="07 Mar 2007 14:58:24" parent="668" time="669" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="45"/>
+    </action>
+    <action date="07 Mar 2007 14:58:26" parent="669" time="670" user="hvo" what="addModule">
+      <object cache="1" id="46" name="vtkGeneralTransform" x="426.278023555" y="-130.538553616"/>
+    </action>
+    <action date="07 Mar 2007 14:58:26" parent="670" time="671" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="46" value=""/>
+    </action>
+    <action date="07 Mar 2007 14:58:33" parent="671" time="672" user="hvo" what="moveModule">
+      <move dx="-41.2697252647" dy="-2.84618794929" id="45"/>
+      <move dx="-2.84618794929" dy="-88.231826428" id="46"/>
+    </action>
+    <action date="07 Mar 2007 14:58:33" parent="672" time="673" user="hvo" what="addConnection">
+      <connect destinationId="46" destinationModule="vtkAbstractTransform" destinationPort="SetInverse(vtkAbstractTransform)" id="78" sourceId="45" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:58:36" parent="673" time="674" user="hvo" what="deleteConnection">
+      <connection connectionId="78"/>
+    </action>
+    <action date="07 Mar 2007 14:58:41" parent="674" time="675" user="hvo" what="addConnection">
+      <connect destinationId="46" destinationModule="vtkGeneralTransform" destinationPort="SetInput(vtkAbstractTransform)" id="79" sourceId="45" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:58:46" parent="675" time="676" user="hvo" what="addConnection">
+      <connect destinationId="36" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="80" sourceId="46" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 14:58:49" parent="676" time="677" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="46" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 14:59:52" parent="677" time="678" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="46" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 14:59:53" parent="678" time="679" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="46" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 15:00:18" parent="679" time="680" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.42309397465" id="33"/>
+      <move dx="0.0" dy="-1.42309397465" id="36"/>
+    </action>
+    <action date="07 Mar 2007 15:00:18" parent="680" time="681" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOff" functionId="0" moduleId="37" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 15:00:42" parent="681" time="682" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="33"/>
+    </action>
+    <action date="07 Mar 2007 15:00:42" parent="682" time="683" user="hvo" what="addModule">
+      <object cache="1" id="47" name="Integer" x="526.544770619" y="562.122119985"/>
+    </action>
+    <action date="07 Mar 2007 15:00:45" parent="683" time="684" user="hvo" what="moveModule">
+      <move dx="-79.6932625801" dy="25.6156915436" id="47"/>
+    </action>
+    <action date="07 Mar 2007 15:00:45" parent="684" time="685" user="hvo" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="47" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="07 Mar 2007 15:00:51" parent="685" time="686" user="hvo" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="47" parameter="<no description>" parameterId="0" type="Integer" value="4000"/>
+    </action>
+    <action date="07 Mar 2007 15:00:53" parent="686" time="687" user="hvo" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="47" parameter="<no description>" parameterId="0" type="Integer" value="4000"/>
+    </action>
+    <action date="07 Mar 2007 15:00:58" parent="687" time="688" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="28"/>
+    </action>
+    <action date="07 Mar 2007 15:01:13" parent="688" time="689" user="hvo" what="deleteConnection"/>
+    <action date="07 Mar 2007 15:01:13" parent="689" time="690" user="hvo" what="deleteModule">
+      <module moduleId="47"/>
+    </action>
+    <action date="07 Mar 2007 15:01:19" parent="690" time="691" user="hvo" what="addModule">
+      <object cache="1" id="48" name="Float" x="516.583112796" y="552.160462162"/>
+    </action>
+    <action date="07 Mar 2007 15:01:21" parent="691" time="692" user="hvo" what="addConnection">
+      <connect destinationId="28" destinationModule="vtkCylinder" destinationPort="SetRadius(Float)" id="81" sourceId="48" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="07 Mar 2007 15:01:24" parent="692" time="693" user="hvo" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="48" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 15:01:26" parent="693" time="694" user="hvo" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="48" parameter="<no description>" parameterId="0" type="Float" value="4000"/>
+    </action>
+    <action date="07 Mar 2007 15:01:29" parent="694" time="695" user="hvo" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="48" parameter="<no description>" parameterId="0" type="Float" value="4000"/>
+    </action>
+    <action date="07 Mar 2007 15:01:38" parent="695" time="696" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="33"/>
+    </action>
+    <action date="07 Mar 2007 15:02:17" parent="696" time="697" user="hvo" what="addConnection">
+      <connect destinationId="33" destinationModule="vtkDiskSource" destinationPort="SetInnerRadius(Float)" id="82" sourceId="48" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="07 Mar 2007 15:02:29" parent="697" time="698" user="hvo" what="addConnection">
+      <connect destinationId="33" destinationModule="vtkDiskSource" destinationPort="SetOuterRadius(Float)" id="83" sourceId="48" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="07 Mar 2007 15:02:37" parent="698" time="699" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="33"/>
+    </action>
+    <action date="07 Mar 2007 15:03:04" parent="699" time="700" user="hvo" what="moveModule">
+      <move dx="25.6156915436" dy="44.115913214" id="48"/>
+    </action>
+    <action date="07 Mar 2007 15:03:04" parent="700" time="701" user="hvo" what="deleteConnection">
+      <connection connectionId="81"/>
+      <connection connectionId="82"/>
+      <connection connectionId="83"/>
+    </action>
+    <action date="07 Mar 2007 15:03:04" parent="701" time="702" user="hvo" what="deleteModule">
+      <module moduleId="48"/>
+    </action>
+    <action date="07 Mar 2007 15:03:14" parent="702" time="703" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 15:03:22" parent="703" time="704" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 15:03:24" parent="704" time="705" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="4000"/>
+    </action>
+    <action date="07 Mar 2007 15:03:26" parent="705" time="706" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="4000"/>
+    </action>
+    <action date="07 Mar 2007 15:03:28" parent="706" time="707" user="hvo" what="changeParameter">
+      <set alias="" function="SetInnerRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 15:03:33" parent="707" time="708" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="33"/>
+    </action>
+    <action date="07 Mar 2007 15:03:35" parent="708" time="709" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 15:03:44" parent="709" time="710" user="hvo" what="changeParameter">
+      <set alias="" function="SetInnerRadius" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius-5000$"/>
+    </action>
+    <action date="07 Mar 2007 15:03:47" parent="710" time="711" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius+5000$"/>
+    </action>
+    <action date="07 Mar 2007 15:03:48" parent="711" time="712" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius+5000$"/>
+    </action>
+    <action date="07 Mar 2007 15:04:04" parent="712" time="713" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius+1000$"/>
+    </action>
+    <action date="07 Mar 2007 15:04:08" parent="713" time="714" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius+500$"/>
+    </action>
+    <action date="07 Mar 2007 15:04:10" parent="714" time="715" user="hvo" what="changeParameter">
+      <set alias="" function="SetInnerRadius" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius-500$"/>
+    </action>
+    <action date="07 Mar 2007 15:04:37" parent="715" time="716" user="hvo" what="moveModule">
+      <move dx="-86.8087324534" dy="56.9237589858" id="42"/>
+    </action>
+    <action date="07 Mar 2007 15:04:37" parent="716" time="717" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-280000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 15:04:48" parent="717" time="718" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-290000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 15:04:52" parent="718" time="719" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="8000"/>
+    </action>
+    <action date="07 Mar 2007 15:15:38" parent="719" time="720" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.42309397465" id="28"/>
+    </action>
+    <action date="07 Mar 2007 15:15:38" parent="720" time="721" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="07 Mar 2007 15:15:40" parent="721" time="722" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="07 Mar 2007 15:34:03" parent="722" time="723" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="20000"/>
+    </action>
+    <action date="07 Mar 2007 16:44:07" parent="723" time="724" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="32"/>
+    </action>
+    <action date="07 Mar 2007 16:44:07" parent="724" time="725" user="hvo" what="changeParameter">
+      <set alias="radius" function="SetRadius" functionId="0" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="30000"/>
+    </action>
+    <action date="07 Mar 2007 16:47:06" parent="725" time="726" user="hvo" what="moveModule">
+      <move dx="27.0387855183" dy="11.3847517972" id="34"/>
+    </action>
+    <action date="07 Mar 2007 16:47:06" parent="726" time="727" user="hvo" what="addModule">
+      <object cache="1" id="49" name="vtkProperty" x="1614.14239657" y="96.6113697478"/>
+    </action>
+    <action date="07 Mar 2007 16:47:07" parent="727" time="728" user="hvo" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="49" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="49" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="49" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 16:47:07" parent="728" time="729" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="49" value=""/>
+    </action>
+    <action date="07 Mar 2007 16:47:18" parent="729" time="730" user="hvo" what="moveModule">
+      <move dx="-710.123893348" dy="-510.890736898" id="49"/>
+    </action>
+    <action date="07 Mar 2007 16:47:18" parent="730" time="731" user="hvo" what="addConnection">
+      <connect destinationId="34" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="84" sourceId="49" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="07 Mar 2007 16:48:42" parent="731" time="732" user="hvo" what="changeParameter">
+      <set alias="" function="SetInnerRadius" functionId="2" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius-1000$"/>
+    </action>
+    <action date="07 Mar 2007 16:48:45" parent="732" time="733" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius+1000$"/>
+    </action>
+    <action date="07 Mar 2007 16:48:46" parent="733" time="734" user="hvo" what="changeParameter">
+      <set alias="" function="SetOuterRadius" functionId="3" moduleId="33" parameter="<no description>" parameterId="0" type="Float" value="$radius+1000$"/>
+    </action>
+    <action date="07 Mar 2007 17:15:39" parent="734" time="735" user="hvo" what="addModule">
+      <object cache="1" id="50" name="vtkClipPolyData" x="478.159575481" y="-555.006650112"/>
+    </action>
+    <action date="07 Mar 2007 17:15:53" parent="735" time="736" user="hvo" what="moveModule">
+      <move dx="-31.3080674422" dy="-59.7699469351" id="37"/>
+      <move dx="66.8854168083" dy="35.5773493661" id="50"/>
+    </action>
+    <action date="07 Mar 2007 17:15:53" parent="736" time="737" user="hvo" what="addConnection">
+      <connect destinationId="37" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="85" sourceId="50" sourceModule="vtkClipPolyData" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 17:15:54" parent="737" time="738" user="hvo" what="deleteConnection">
+      <connection connectionId="45"/>
+    </action>
+    <action date="07 Mar 2007 17:15:58" parent="738" time="739" user="hvo" what="addConnection">
+      <connect destinationId="50" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="86" sourceId="36" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 17:16:32" parent="739" time="740" user="hvo" what="changeParameter">
+      <set alias="" function="InsideOutOn" functionId="0" moduleId="50" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:17:02" parent="740" time="741" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:17:04" parent="741" time="742" user="hvo" what="changeParameter">
+      <set alias="" function="InsideOutOff" functionId="0" moduleId="50" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:28:42" parent="742" time="743" user="hvo" what="moveModule">
+      <move dx="-92.501108352" dy="-7.11546987323" id="28"/>
+      <move dx="-1.42309397465" dy="0.0" id="50"/>
+    </action>
+    <action date="07 Mar 2007 17:28:42" parent="743" time="744" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:28:56" parent="744" time="745" user="hvo" what="changeParameter">
+      <set alias="" function="InsideOutOn" functionId="0" moduleId="50" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:29:11" parent="745" time="746" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:29:14" parent="746" time="747" user="hvo" what="changeParameter">
+      <set alias="" function="InsideOutOff" functionId="0" moduleId="50" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:30:15" parent="747" time="748" user="hvo" what="changeParameter">
+      <set alias="" function="GenerateClippedOutputOn" functionId="1" moduleId="50" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:30:45" parent="748" time="749" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:30:47" parent="749" time="750" user="hvo" what="changeParameter">
+      <set alias="" function="InsideOutOn" functionId="1" moduleId="50" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:32:05" parent="750" time="751" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:32:06" parent="751" time="752" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:42:20" parent="752" time="753" user="hvo" what="moveModule">
+      <move dx="111.001330022" dy="9.96165782252" id="50"/>
+    </action>
+    <action date="07 Mar 2007 17:42:20" parent="753" time="754" user="hvo" what="deleteConnection">
+      <connection connectionId="85"/>
+      <connection connectionId="86"/>
+    </action>
+    <action date="07 Mar 2007 17:42:20" parent="754" time="755" user="hvo" what="deleteModule">
+      <module moduleId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:42:21" parent="755" time="756" user="hvo" what="addConnection">
+      <connect destinationId="37" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="87" sourceId="36" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 17:42:29" parent="756" time="757" user="hvo" what="addModule">
+      <object cache="1" id="51" name="vtkPointsProjectedHull" x="479.582669456" y="-462.50554176"/>
+    </action>
+    <action date="07 Mar 2007 17:42:34" parent="757" time="758" user="hvo" what="moveModule">
+      <move dx="-93.9242023266" dy="-24.192597569" id="37"/>
+      <move dx="101.0396722" dy="-39.8466312901" id="51"/>
+    </action>
+    <action date="07 Mar 2007 17:42:34" parent="758" time="759" user="hvo" what="deleteConnection">
+      <connection connectionId="87"/>
+    </action>
+    <action date="07 Mar 2007 17:42:41" parent="759" time="760" user="hvo" what="addConnection">
+      <connect destinationId="37" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="88" sourceId="36" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 17:47:03" parent="760" time="761" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="1.42309397465" id="28"/>
+      <move dx="-24.192597569" dy="56.9237589858" id="29"/>
+      <move dx="274.657137107" dy="431.197474318" id="51"/>
+    </action>
+    <action date="07 Mar 2007 17:47:03" parent="761" time="762" user="hvo" what="deleteConnection"/>
+    <action date="07 Mar 2007 17:47:03" parent="762" time="763" user="hvo" what="deleteModule">
+      <module moduleId="51"/>
+    </action>
+    <action date="07 Mar 2007 17:49:41" parent="763" time="764" user="hvo" what="moveModule">
+      <move dx="129.501551693" dy="-4.26928192394" id="28"/>
+    </action>
+    <action date="07 Mar 2007 17:49:41" parent="764" time="765" user="hvo" what="addModule">
+      <object cache="1" id="52" name="PythonSource" x="859.548760686" y="38.4235373154"/>
+    </action>
+    <action date="07 Mar 2007 17:50:14" parent="765" time="766" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.84618794929" id="52"/>
+    </action>
+    <action date="07 Mar 2007 17:50:14" parent="766" time="767" user="hvo" what="addModulePort">
+      <addPort moduleId="52" portName="points" portSpec="(vtkPoints)" portType="input"/>
+    </action>
+    <action date="07 Mar 2007 17:50:15" parent="767" time="768" user="hvo" what="addModulePort">
+      <addPort moduleId="52" portName="hull" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="07 Mar 2007 17:50:36" parent="768" time="769" user="hvo" what="moveModule">
+      <move dx="-15.6540337211" dy="-139.463209515" id="52"/>
+    </action>
+    <action date="07 Mar 2007 17:50:50" parent="769" time="770" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="52" portName="points" portType="input"/>
+    </action>
+    <action date="07 Mar 2007 17:50:50" parent="770" time="771" user="hvo" what="addModulePort">
+      <addPort moduleId="52" portName="data" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="07 Mar 2007 17:50:58" parent="771" time="772" user="hvo" what="addConnection">
+      <connect destinationId="52" destinationModule="PythonSource" destinationPort="data(vtkPolyData)" id="89" sourceId="29" sourceModule="vtkPolyDataAlgorithm" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="07 Mar 2007 17:52:18" parent="772" time="773" user="hvo" what="moveModule">
+      <move dx="22.7695035943" dy="55.5006650112" id="52"/>
+    </action>
+    <action date="07 Mar 2007 17:52:19" parent="773" time="774" user="hvo" what="deleteConnection">
+      <connection connectionId="89"/>
+    </action>
+    <action date="07 Mar 2007 17:52:19" parent="774" time="775" user="hvo" what="deleteModule">
+      <module moduleId="52"/>
+    </action>
+    <action date="07 Mar 2007 17:52:35" parent="775" time="776" user="hvo" what="addModule">
+      <object cache="1" id="53" name="vtkPolyDataMapper2D" x="842.47163299" y="-65.4623228337"/>
+    </action>
+    <action date="07 Mar 2007 17:52:45" parent="776" time="777" user="hvo" what="moveModule">
+      <move dx="1.42309397465" dy="-1.42309397465" id="29"/>
+      <move dx="39.8466312901" dy="-8.53856384787" id="53"/>
+    </action>
+    <action date="07 Mar 2007 17:52:45" parent="777" time="778" user="hvo" what="addConnection">
+      <connect destinationId="53" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="90" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 17:52:48" parent="778" time="779" user="hvo" what="addModule">
+      <object cache="1" id="54" name="vtkActor" x="816.863128427" y="-283.289064284"/>
+    </action>
+    <action date="07 Mar 2007 17:52:48" parent="779" time="780" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="54" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:53:01" parent="780" time="781" user="hvo" what="moveModule">
+      <move dx="169.348182983" dy="2.84618794929" id="54"/>
+    </action>
+    <action date="07 Mar 2007 17:53:01" parent="781" time="782" user="hvo" what="deleteConnection"/>
+    <action date="07 Mar 2007 17:53:01" parent="782" time="783" user="hvo" what="deleteModule">
+      <module moduleId="54"/>
+    </action>
+    <action date="07 Mar 2007 17:53:16" parent="783" time="784" user="hvo" what="addModule">
+      <object cache="1" id="55" name="vtkActor2D" x="1007.55053405" y="-274.657137107"/>
+    </action>
+    <action date="07 Mar 2007 17:53:19" parent="784" time="785" user="hvo" what="addConnection">
+      <connect destinationId="55" destinationModule="vtkActor2D" destinationPort="SetMapper(vtkMapper2D)" id="91" sourceId="53" sourceModule="vtkPolyDataMapper2D" sourcePort="self(vtkPolyDataMapper2D)"/>
+    </action>
+    <action date="07 Mar 2007 17:53:21" parent="785" time="786" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="92" sourceId="55" sourceModule="vtkActor2D" sourcePort="self(vtkActor2D)"/>
+    </action>
+    <action date="07 Mar 2007 17:53:24" parent="786" time="787" user="hvo" what="deleteConnection">
+      <connection connectionId="73"/>
+    </action>
+    <action date="07 Mar 2007 17:54:34" parent="787" time="788" user="hvo" what="deleteConnection">
+      <connection connectionId="46"/>
+      <connection connectionId="84"/>
+      <connection connectionId="88"/>
+    </action>
+    <action date="07 Mar 2007 17:54:34" parent="788" time="789" user="hvo" what="deleteModule">
+      <module moduleId="34"/>
+      <module moduleId="37"/>
+    </action>
+    <action date="07 Mar 2007 17:54:36" parent="789" time="790" user="hvo" what="moveModule">
+      <move dx="-291.734264802" dy="-58.3468529605" id="49"/>
+    </action>
+    <action date="07 Mar 2007 17:54:36" parent="790" time="791" user="hvo" what="deleteConnection"/>
+    <action date="07 Mar 2007 17:54:36" parent="791" time="792" user="hvo" what="deleteModule">
+      <module moduleId="49"/>
+    </action>
+    <action date="07 Mar 2007 17:54:38" parent="792" time="793" user="hvo" what="deleteConnection">
+      <connection connectionId="43"/>
+      <connection connectionId="80"/>
+    </action>
+    <action date="07 Mar 2007 17:54:38" parent="793" time="794" user="hvo" what="deleteModule">
+      <module moduleId="36"/>
+    </action>
+    <action date="07 Mar 2007 17:54:43" parent="794" time="795" user="hvo" what="deleteConnection">
+      <connection connectionId="79"/>
+      <connection connectionId="76"/>
+    </action>
+    <action date="07 Mar 2007 17:54:43" parent="795" time="796" user="hvo" what="deleteModule">
+      <module moduleId="45"/>
+      <module moduleId="46"/>
+      <module moduleId="33"/>
+    </action>
+    <action date="07 Mar 2007 17:54:56" parent="796" time="797" user="hvo" what="moveModule">
+      <move dx="32.7311614168" dy="-72.5777927069" id="42"/>
+      <move dx="2.84618794929" dy="-22.7695035943" id="43"/>
+    </action>
+    <action date="07 Mar 2007 17:54:56" parent="797" time="798" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOff" functionId="0" moduleId="53" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:57:05" parent="798" time="799" user="hvo" what="changeParameter">
+      <set alias="" function="PickableOff" functionId="0" moduleId="55" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:57:08" parent="799" time="800" user="hvo" what="changeParameter">
+      <set alias="" function="DragableOff" functionId="1" moduleId="55" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:57:11" parent="800" time="801" user="hvo" what="changeParameter">
+      <set alias="" function="VisibilityOn" functionId="2" moduleId="55" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 17:57:18" parent="801" time="802" user="hvo" what="deleteConnection">
+      <connection connectionId="50"/>
+    </action>
+    <action date="07 Mar 2007 17:58:48" parent="802" time="803" user="hvo" what="moveModule">
+      <move dx="-42.6928192394" dy="5.69237589858" id="19"/>
+      <move dx="-29.8849734676" dy="7.11546987323" id="53"/>
+    </action>
+    <action date="07 Mar 2007 18:01:24" parent="803" time="804" user="hvo" what="moveModule">
+      <move dx="-1.42309397465" dy="0.0" id="19"/>
+      <move dx="-72.5777927069" dy="54.0775710365" id="29"/>
+    </action>
+    <action date="07 Mar 2007 18:01:24" parent="804" time="805" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 18:01:25" parent="805" time="806" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 18:02:13" parent="806" time="807" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:02:15" parent="807" time="808" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="-290000"/>
+    </action>
+    <action date="07 Mar 2007 18:02:16" parent="808" time="809" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="-290000"/>
+    </action>
+    <action date="07 Mar 2007 18:02:17" parent="809" time="810" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="-290000"/>
+    </action>
+    <action date="07 Mar 2007 18:02:47" parent="810" time="811" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:02:49" parent="811" time="812" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-290000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:03:00" parent="812" time="813" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="1" type="Float" value="-290000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="43" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:03:03" parent="813" time="814" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 18:03:05" parent="814" time="815" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="42" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="07 Mar 2007 18:03:06" parent="815" time="816" user="hvo" what="deleteConnection">
+      <connection connectionId="91"/>
+      <connection connectionId="90"/>
+    </action>
+    <action date="07 Mar 2007 18:03:06" parent="816" time="817" user="hvo" what="deleteModule">
+      <module moduleId="53"/>
+    </action>
+    <action date="07 Mar 2007 18:03:07" parent="817" time="818" user="hvo" what="deleteConnection">
+      <connection connectionId="92"/>
+    </action>
+    <action date="07 Mar 2007 18:03:07" parent="818" time="819" user="hvo" what="deleteModule">
+      <module moduleId="55"/>
+    </action>
+    <action date="07 Mar 2007 18:26:12" parent="819" time="820" user="hvo" what="moveModule">
+      <move dx="-5.69237589858" dy="-93.9242023266" id="29"/>
+    </action>
+    <action date="07 Mar 2007 18:26:12" parent="820" time="821" user="hvo" what="addModule">
+      <object cache="1" id="56" name="vtkPlane" x="885.342963543" y="-13.9864607195"/>
+    </action>
+    <action date="07 Mar 2007 18:27:26" parent="821" time="822" user="hvo" what="moveModule">
+      <move dx="32.1688596548" dy="0.0" id="6"/>
+      <move dx="1.39864607195" dy="0.0" id="28"/>
+      <move dx="-4.19593821584" dy="-30.7702135828" id="56"/>
+    </action>
+    <action date="07 Mar 2007 18:27:26" parent="822" time="823" user="hvo" what="deleteConnection"/>
+    <action date="07 Mar 2007 18:27:26" parent="823" time="824" user="hvo" what="deleteModule">
+      <module moduleId="56"/>
+    </action>
+    <action date="07 Mar 2007 18:29:34" parent="824" time="825" user="hvo" what="moveModule">
+      <move dx="-46.1553203743" dy="12.5878146475" id="15"/>
+      <move dx="-25.175629295" dy="29.3715675109" id="19"/>
+      <move dx="0.0" dy="-1.39864607195" id="28"/>
+      <move dx="85.3174103888" dy="46.1553203743" id="29"/>
+    </action>
+    <action date="07 Mar 2007 18:29:34" parent="825" time="826" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="93" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 18:29:37" parent="826" time="827" user="hvo" what="addModule">
+      <object cache="1" id="57" name="vtkActor" x="770.707808053" y="-270.701249637"/>
+    </action>
+    <action date="07 Mar 2007 18:29:37" parent="827" time="828" user="hvo" what="addModule">
+      <object cache="1" id="58" name="vtkDataSetMapper" x="638.626546537" y="-131.252339361"/>
+    </action>
+    <action date="07 Mar 2007 18:29:37" parent="828" time="829" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="57" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:29:37" parent="829" time="830" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="58" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:29:37" parent="830" time="831" user="hvo" what="addConnection">
+      <connect destinationId="57" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="94" sourceId="58" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="07 Mar 2007 18:29:44" parent="831" time="832" user="hvo" what="moveModule">
+      <move dx="194.411804001" dy="-18.1823989353" id="7"/>
+      <move dx="170.634820778" dy="23.7769832231" id="57"/>
+      <move dx="170.634820778" dy="23.7769832231" id="58"/>
+    </action>
+    <action date="07 Mar 2007 18:29:44" parent="832" time="833" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="95" sourceId="57" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="07 Mar 2007 18:29:50" parent="833" time="834" user="hvo" what="addConnection">
+      <connect destinationId="58" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="96" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:31:13" parent="834" time="835" user="hvo" what="moveModule">
+      <move dx="15.3851067914" dy="-19.5810450073" id="57"/>
+      <move dx="90.9119946766" dy="-9.79052250363" id="58"/>
+    </action>
+    <action date="07 Mar 2007 18:31:13" parent="835" time="836" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOff" functionId="0" moduleId="58" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:31:28" parent="836" time="837" user="hvo" what="addModule">
+      <object cache="1" id="59" name="vtkProperty" x="1614.14239657" y="96.6113697478"/>
+    </action>
+    <action date="07 Mar 2007 18:31:28" parent="837" time="838" user="hvo" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="59" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="59" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="07 Mar 2007 18:31:28" parent="838" time="839" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="59" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:31:33" parent="839" time="840" user="hvo" what="moveModule">
+      <move dx="-688.133867398" dy="-109.094393612" id="59"/>
+    </action>
+    <action date="07 Mar 2007 18:31:33" parent="840" time="841" user="hvo" what="addConnection">
+      <connect destinationId="57" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="97" sourceId="59" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="07 Mar 2007 18:31:36" parent="841" time="842" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="59"/>
+    </action>
+    <action date="07 Mar 2007 18:31:40" parent="842" time="843" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 18:31:43" parent="843" time="844" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="07 Mar 2007 18:31:49" parent="844" time="845" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="2000"/>
+    </action>
+    <action date="07 Mar 2007 18:31:51" parent="845" time="846" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="2000"/>
+    </action>
+    <action date="07 Mar 2007 18:32:04" parent="846" time="847" user="hvo" what="moveModule">
+      <move dx="-74.1282418132" dy="15.3851067914" id="58"/>
+      <move dx="48.9526125182" dy="-8.39187643168" id="59"/>
+    </action>
+    <action date="07 Mar 2007 18:32:04" parent="847" time="848" user="hvo" what="deleteConnection">
+      <connection connectionId="93"/>
+    </action>
+    <action date="07 Mar 2007 18:32:53" parent="848" time="849" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.79729214389" id="58"/>
+    </action>
+    <action date="07 Mar 2007 18:32:53" parent="849" time="850" user="hvo" what="addModule">
+      <object cache="1" id="60" name="vtkLinearTransform" x="959.471205356" y="-107.69574754"/>
+    </action>
+    <action date="07 Mar 2007 18:32:56" parent="850" time="851" user="hvo" what="moveModule">
+      <move dx="-79.722826101" dy="5.59458428779" id="60"/>
+    </action>
+    <action date="07 Mar 2007 18:32:56" parent="851" time="852" user="hvo" what="addConnection">
+      <connect destinationId="57" destinationModule="vtkProp3D" destinationPort="SetUserTransform(vtkLinearTransform)" id="98" sourceId="60" sourceModule="vtkLinearTransform" sourcePort="self(vtkLinearTransform)"/>
+    </action>
+    <action date="07 Mar 2007 18:33:14" parent="852" time="853" user="hvo" what="moveModule">
+      <move dx="54.5471968059" dy="144.060545411" id="60"/>
+    </action>
+    <action date="07 Mar 2007 18:33:14" parent="853" time="854" user="hvo" what="deleteConnection">
+      <connection connectionId="98"/>
+    </action>
+    <action date="07 Mar 2007 18:33:14" parent="854" time="855" user="hvo" what="deleteModule">
+      <module moduleId="60"/>
+    </action>
+    <action date="07 Mar 2007 18:33:37" parent="855" time="856" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyToShiftZBuffer" functionId="1" moduleId="58" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:33:39" parent="856" time="857" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="58"/>
+    </action>
+    <action date="07 Mar 2007 18:33:46" parent="857" time="858" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyZShift" functionId="1" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 18:33:50" parent="858" time="859" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyToShiftZBuffer" functionId="2" moduleId="58" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:33:52" parent="859" time="860" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyZShift" functionId="1" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+    </action>
+    <action date="07 Mar 2007 18:33:53" parent="860" time="861" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyZShift" functionId="1" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+    </action>
+    <action date="07 Mar 2007 18:34:17" parent="861" time="862" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="58"/>
+    </action>
+    <action date="07 Mar 2007 18:34:24" parent="862" time="863" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyZShift" functionId="2" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 18:34:26" parent="863" time="864" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyZShift" functionId="2" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:34:27" parent="864" time="865" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyZShift" functionId="2" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:34:33" parent="865" time="866" user="hvo" what="moveModule">
+      <move dx="1.39864607195" dy="0.0" id="57"/>
+    </action>
+    <action date="07 Mar 2007 18:34:33" parent="866" time="867" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="07 Mar 2007 18:34:34" parent="867" time="868" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="59" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="07 Mar 2007 18:35:09" parent="868" time="869" user="hvo" what="deleteFunction">
+      <function functionId="2" moduleId="58"/>
+    </action>
+    <action date="07 Mar 2007 18:35:10" parent="869" time="870" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="58"/>
+    </action>
+    <action date="07 Mar 2007 18:35:40" parent="870" time="871" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyPolygonOffsetParameters" functionId="1" moduleId="58" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetResolveCoincidentTopologyPolygonOffsetParameters" functionId="1" moduleId="58" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 18:35:43" parent="871" time="872" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="58"/>
+    </action>
+    <action date="07 Mar 2007 18:36:45" parent="872" time="873" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyToOff" functionId="1" moduleId="58" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:36:55" parent="873" time="874" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="07 Mar 2007 18:36:57" parent="874" time="875" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:36:58" parent="875" time="876" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:36:59" parent="876" time="877" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="2" type="Float" value="10"/>
+    </action>
+    <action date="07 Mar 2007 18:37:00" parent="877" time="878" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="57" parameter="<no description>" parameterId="2" type="Float" value="10"/>
+    </action>
+    <action date="07 Mar 2007 18:38:06" parent="878" time="879" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="57"/>
+    </action>
+    <action date="07 Mar 2007 18:41:55" parent="879" time="880" user="hvo" what="addModule">
+      <object cache="1" id="61" name="vtkTransformFilter" x="902.126716406" y="-180.425343281"/>
+    </action>
+    <action date="07 Mar 2007 18:42:06" parent="880" time="881" user="hvo" what="addConnection">
+      <connect destinationId="61" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="99" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:42:11" parent="881" time="882" user="hvo" what="moveModule">
+      <move dx="39.1620900145" dy="-64.3377193096" id="58"/>
+      <move dx="-71.3309496693" dy="187.418573641" id="61"/>
+    </action>
+    <action date="07 Mar 2007 18:42:11" parent="882" time="883" user="hvo" what="deleteConnection">
+      <connection connectionId="96"/>
+    </action>
+    <action date="07 Mar 2007 18:42:14" parent="883" time="884" user="hvo" what="moveModule">
+      <move dx="103.499809324" dy="0.0" id="59"/>
+    </action>
+    <action date="07 Mar 2007 18:42:14" parent="884" time="885" user="hvo" what="addConnection">
+      <connect destinationId="58" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="100" sourceId="61" sourceModule="vtkTransformFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:42:37" parent="885" time="886" user="hvo" what="moveModule">
+      <move dx="13.9864607195" dy="-89.5133486046" id="61"/>
+    </action>
+    <action date="07 Mar 2007 18:42:37" parent="886" time="887" user="hvo" what="deleteConnection">
+      <connection connectionId="100"/>
+      <connection connectionId="99"/>
+    </action>
+    <action date="07 Mar 2007 18:42:37" parent="887" time="888" user="hvo" what="deleteModule">
+      <module moduleId="61"/>
+    </action>
+    <action date="07 Mar 2007 18:42:44" parent="888" time="889" user="hvo" what="addModule">
+      <object cache="1" id="62" name="vtkTransformPolyDataFilter" x="893.734839974" y="-78.324180029"/>
+    </action>
+    <action date="07 Mar 2007 18:42:51" parent="889" time="890" user="hvo" what="moveModule">
+      <move dx="-48.9526125182" dy="0.0" id="62"/>
+    </action>
+    <action date="07 Mar 2007 18:42:51" parent="890" time="891" user="hvo" what="addConnection">
+      <connect destinationId="62" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="101" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:42:54" parent="891" time="892" user="hvo" what="addConnection">
+      <connect destinationId="58" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="102" sourceId="62" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:42:59" parent="892" time="893" user="hvo" what="deleteConnection">
+      <connection connectionId="102"/>
+    </action>
+    <action date="07 Mar 2007 18:43:01" parent="893" time="894" user="hvo" what="addConnection">
+      <connect destinationId="58" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="103" sourceId="62" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:43:03" parent="894" time="895" user="hvo" what="deleteConnection">
+      <connection connectionId="101"/>
+    </action>
+    <action date="07 Mar 2007 18:43:07" parent="895" time="896" user="hvo" what="addConnection">
+      <connect destinationId="62" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="104" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:44:58" parent="896" time="897" user="hvo" what="moveModule">
+      <move dx="-62.6045423531" dy="-6.95606026146" id="29"/>
+      <move dx="0.0" dy="25.0418169413" id="62"/>
+    </action>
+    <action date="07 Mar 2007 18:44:58" parent="897" time="898" user="hvo" what="addModule">
+      <object cache="1" id="63" name="vtkGeneralTransform" x="673.896375143" y="250.850631589"/>
+    </action>
+    <action date="07 Mar 2007 18:44:58" parent="898" time="899" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="-330000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="-290000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:44:58" parent="899" time="900" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="63" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:45:13" parent="900" time="901" user="hvo" what="moveModule">
+      <move dx="164.16302217" dy="-191.987263216" id="63"/>
+    </action>
+    <action date="07 Mar 2007 18:45:13" parent="901" time="902" user="hvo" what="addConnection">
+      <connect destinationId="62" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="105" sourceId="63" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="07 Mar 2007 18:45:16" parent="902" time="903" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="-290000"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:45:17" parent="903" time="904" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 18:45:18" parent="904" time="905" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="100"/>
+    </action>
+    <action date="07 Mar 2007 18:45:21" parent="905" time="906" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="100"/>
+    </action>
+    <action date="07 Mar 2007 18:47:36" parent="906" time="907" user="hvo" what="changeParameter">
+      <set alias="" function="EdgeVisibilityOn" functionId="1" moduleId="59" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:48:17" parent="907" time="908" user="hvo" what="moveModule">
+      <move dx="2.78242410458" dy="-4.17363615688" id="59"/>
+    </action>
+    <action date="07 Mar 2007 18:48:17" parent="908" time="909" user="hvo" what="changeParameter">
+      <set alias="" function="SetRepresentationToWireframe" functionId="2" moduleId="59" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 18:48:19" parent="909" time="910" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="59"/>
+    </action>
+    <action date="07 Mar 2007 18:49:44" parent="910" time="911" user="hvo" what="moveModule">
+      <move dx="33.389089255" dy="6.95606026146" id="62"/>
+    </action>
+    <action date="07 Mar 2007 18:49:44" parent="911" time="912" user="hvo" what="deleteConnection">
+      <connection connectionId="104"/>
+    </action>
+    <action date="07 Mar 2007 18:49:47" parent="912" time="913" user="hvo" what="addConnection">
+      <connect destinationId="58" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="106" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 18:49:48" parent="913" time="914" user="hvo" what="deleteConnection">
+      <connection connectionId="103"/>
+    </action>
+    <action date="07 Mar 2007 19:05:33" parent="914" time="915" user="hvo" what="moveModule">
+      <move dx="-1.39121205229" dy="0.0" id="62"/>
+    </action>
+    <action date="07 Mar 2007 19:05:33" parent="915" time="916" user="hvo" what="addConnection">
+      <connect destinationId="58" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="107" sourceId="62" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 19:05:34" parent="916" time="917" user="hvo" what="deleteConnection">
+      <connection connectionId="106"/>
+    </action>
+    <action date="07 Mar 2007 19:05:37" parent="917" time="918" user="hvo" what="addConnection">
+      <connect destinationId="62" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="108" sourceId="29" sourceModule="vtkCutter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="07 Mar 2007 19:05:43" parent="918" time="919" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 19:05:43" parent="919" time="920" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="63" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 19:06:22" parent="920" time="921" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="58"/>
+    </action>
+    <action date="07 Mar 2007 19:06:32" parent="921" time="922" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolveCoincidentTopologyToPolygonOffset" functionId="1" moduleId="58" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="07 Mar 2007 19:14:35" parent="922" time="923" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.39121205229" id="16"/>
+    </action>
+    <action date="07 Mar 2007 19:14:35" parent="923" time="924" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="07 Mar 2007 19:14:36" parent="924" time="925" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 11:10:31" parent="0" time="926" user="hvo" what="addModule">
+      <object cache="1" id="0" name="PythonSource" x="-273.795107571" y="459.367347148"/>
+    </action>
+    <action date="08 Mar 2007 11:22:52" parent="926" time="927" user="hvo" what="addModulePort">
+      <addPort moduleId="0" portName="filename" portSpec="(File)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 11:22:52" parent="927" time="928" user="hvo" what="addModulePort">
+      <addPort moduleId="0" portName="polyline" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 11:22:52" parent="928" time="929" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename.name%2C%20%27r%27%29%0AvCount%20%3D%20int%28f.readline%28%29%29%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:23:13" parent="929" time="930" user="hvo" what="moveModule">
+      <move dx="-0.826507468297" dy="0.0" id="0"/>
+    </action>
+    <action date="08 Mar 2007 11:23:13" parent="930" time="931" user="hvo" what="addModule">
+      <object cache="1" id="1" name="String" x="-289.277613904" y="556.239526164"/>
+    </action>
+    <action date="08 Mar 2007 11:23:16" parent="931" time="932" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.826507468297" id="1"/>
+    </action>
+    <action date="08 Mar 2007 11:23:16" parent="932" time="933" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 11:23:16" parent="933" time="934" user="hvo" what="deleteModule">
+      <module moduleId="1"/>
+    </action>
+    <action date="08 Mar 2007 11:23:31" parent="934" time="935" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.826507468297" id="0"/>
+    </action>
+    <action date="08 Mar 2007 11:23:31" parent="935" time="936" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="0" portName="filename" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 11:23:31" parent="936" time="937" user="hvo" what="addModulePort">
+      <addPort moduleId="0" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 11:23:31" parent="937" time="938" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0AvCount%20%3D%20int%28f.readline%28%29%29%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:23:34" parent="938" time="939" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="0" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 11:23:44" parent="939" time="940" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="08 Mar 2007 11:23:44" parent="940" time="941" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="08 Mar 2007 11:24:24" parent="941" time="942" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0AvCount%20%3D%20int%28f.readline%28%29%29.rstrip%28%29%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:24:52" parent="942" time="943" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0As%20%3D%20f.readline%28%29%0Aprint%20%22%25s%22%2C%20s%0AvCount%20%3D%20int%28%29.rstrip%28%27%5Cn%27%29%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%27%5Cn%27%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:25:11" parent="943" time="944" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0As%20%3D%20f.readline%28%29%0Aprint%20%22%25s%22%2C%20s%0AvCount%20%3D%20int%28s.rstrip%28%27%5Cn%27%29%29%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%27%5Cn%27%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:34:30" parent="944" time="945" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0Aprint%20%22%25s%22%2C%20s%0AvCount%20%3D%20int%28s.rstrip%28%29%29%0Aprint%20vCount%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%27%5Cn%27%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:34:56" parent="945" time="946" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0Aprint%20%22%25s%22%2C%20s%0AvCount%20%3D%20int%28s.rstrip%28%29%29%0Aprint%20vCount%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:35:49" parent="946" time="947" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0Aprint%20%22%25s%22%2C%20s%0AvCount%20%3D%20int%28s.rstrip%28%29%29%0Aprint%20vCount%0Afor%20i%20in%20range%28vCount-1%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:36:15" parent="947" time="948" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28s.rstrip%28%29%29%0Aprint%20vCount%0Afor%20i%20in%20range%28vCount-1%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:36:50" parent="948" time="949" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0Aprint%20vCount%0Afor%20i%20in%20range%28vCount-1%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:36:56" parent="949" time="950" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="f%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0Aprint%20vCount%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstrip%28%29.split%28%29%0A%20%20%20print%20xS%2C%20yS%2C%20zS"/>
+    </action>
+    <action date="08 Mar 2007 11:40:09" parent="950" time="951" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%0A%20%20%20%28idS%2C%20xS%2C%20yS%2C%20zS%29%20%3D%20f.readline%28%29.rstri [...]
+    </action>
+    <action date="08 Mar 2007 11:54:01" parent="951" time="952" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="0" portName="polyline" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 11:54:01" parent="952" time="953" user="hvo" what="addModulePort">
+      <addPort moduleId="0" portName="ugrid" portSpec="(vtkUnstructuredGrid)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 11:54:01" parent="953" time="954" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 11:54:11" parent="954" time="955" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 11:54:20" parent="955" time="956" user="hvo" what="moveModule">
+      <move dx="-24.9978813559" dy="122.453389831" id="0"/>
+    </action>
+    <action date="08 Mar 2007 11:54:20" parent="956" time="957" user="hvo" what="addModule">
+      <object cache="1" id="2" name="vtkDataSetMapper" x="-267.730932203" y="498.146186441"/>
+    </action>
+    <action date="08 Mar 2007 11:54:32" parent="957" time="958" user="hvo" what="addModule">
+      <object cache="1" id="3" name="vtkActor" x="-254.326271186" y="384.75"/>
+    </action>
+    <action date="08 Mar 2007 11:54:34" parent="958" time="959" user="hvo" what="addConnection">
+      <connect destinationId="3" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="0" sourceId="2" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 11:54:37" parent="959" time="960" user="hvo" what="moveModule">
+      <move dx="5.07203389831" dy="-24.9978813559" id="2"/>
+    </action>
+    <action date="08 Mar 2007 11:54:37" parent="960" time="961" user="hvo" what="addConnection">
+      <connect destinationId="2" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="1" sourceId="0" sourceModule="PythonSource" sourcePort="ugrid(vtkUnstructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 11:54:44" parent="961" time="962" user="hvo" what="addModule">
+      <object cache="1" id="4" name="VTKCell" x="-247.805084746" y="295.98940678"/>
+    </action>
+    <action date="08 Mar 2007 11:54:54" parent="962" time="963" user="hvo" what="addModule">
+      <object cache="1" id="5" name="vtkRenderer" x="-350.142065935" y="297.356829864"/>
+    </action>
+    <action date="08 Mar 2007 11:55:03" parent="963" time="964" user="hvo" what="moveModule">
+      <move dx="4.10551836105" dy="-99.7054459112" id="4"/>
+      <move dx="101.46495378" dy="4.10551836105" id="5"/>
+    </action>
+    <action date="08 Mar 2007 11:55:03" parent="964" time="965" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="2" sourceId="3" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 11:55:05" parent="965" time="966" user="hvo" what="addConnection">
+      <connect destinationId="4" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="3" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="08 Mar 2007 11:55:24" parent="966" time="967" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 11:56:47" parent="925" time="968" user="hvo" what="deleteConnection">
+      <connection connectionId="107"/>
+      <connection connectionId="105"/>
+      <connection connectionId="108"/>
+      <connection connectionId="95"/>
+      <connection connectionId="94"/>
+      <connection connectionId="97"/>
+    </action>
+    <action date="08 Mar 2007 11:56:47" parent="968" time="969" user="hvo" what="deleteModule">
+      <module moduleId="62"/>
+      <module moduleId="57"/>
+      <module moduleId="58"/>
+    </action>
+    <action date="08 Mar 2007 11:56:49" parent="969" time="970" user="hvo" what="moveModule">
+      <move dx="8.34727231375" dy="-98.7760557127" id="63"/>
+    </action>
+    <action date="08 Mar 2007 11:56:49" parent="970" time="971" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 11:56:49" parent="971" time="972" user="hvo" what="deleteModule">
+      <module moduleId="63"/>
+    </action>
+    <action date="08 Mar 2007 11:56:50" parent="972" time="973" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 11:56:50" parent="973" time="974" user="hvo" what="deleteModule">
+      <module moduleId="59"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="974" time="975" user="hvo" what="addModule">
+      <object cache="1" id="64" name="vtkActor" x="-244.326271186" y="394.75"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="975" time="976" user="hvo" what="addModule">
+      <object cache="1" id="65" name="PythonSource" x="-289.619496395" y="590.994229511"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="976" time="977" user="hvo" what="addModule">
+      <object cache="1" id="66" name="vtkDataSetMapper" x="-252.658898305" y="483.148305085"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="977" time="978" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="64" value=""/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="978" time="979" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="65" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%2 [...]
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="979" time="980" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="65" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="980" time="981" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="65" value=""/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="981" time="982" user="hvo" what="addModulePort">
+      <addPort moduleId="65" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="982" time="983" user="hvo" what="addModulePort">
+      <addPort moduleId="65" portName="ugrid" portSpec="(vtkUnstructuredGrid)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="983" time="984" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="66" value=""/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="984" time="985" user="hvo" what="addConnection">
+      <connect destinationId="64" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="109" sourceId="66" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 11:57:01" parent="985" time="986" user="hvo" what="addConnection">
+      <connect destinationId="66" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="110" sourceId="65" sourceModule="PythonSource" sourcePort="ugrid(vtkUnstructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 11:57:24" parent="986" time="987" user="hvo" what="moveModule">
+      <move dx="1194.38412433" dy="-538.228795268" id="64"/>
+      <move dx="1194.38412433" dy="-538.228795268" id="65"/>
+      <move dx="1194.38412433" dy="-538.228795268" id="66"/>
+    </action>
+    <action date="08 Mar 2007 11:57:24" parent="987" time="988" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="111" sourceId="64" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 11:58:21" parent="988" time="989" user="hvo" what="moveModule">
+      <move dx="-37.8110617296" dy="-77.913702958" id="64"/>
+      <move dx="-37.8110617296" dy="-77.913702958" id="65"/>
+      <move dx="-37.8110617296" dy="-77.913702958" id="66"/>
+    </action>
+    <action date="08 Mar 2007 11:58:21" parent="989" time="990" user="hvo" what="addModule">
+      <object cache="1" id="67" name="vtkProperty" x="962.463389481" y="65.3100157148"/>
+    </action>
+    <action date="08 Mar 2007 11:58:24" parent="990" time="991" user="hvo" what="moveModule">
+      <move dx="18.3326359901" dy="-19.4784257395" id="67"/>
+    </action>
+    <action date="08 Mar 2007 11:58:24" parent="991" time="992" user="hvo" what="addConnection">
+      <connect destinationId="64" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="112" sourceId="67" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="08 Mar 2007 11:58:30" parent="992" time="993" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 11:58:33" parent="993" time="994" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 11:58:34" parent="994" time="995" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 11:58:42" parent="995" time="996" user="hvo" what="changeParameter">
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 11:58:44" parent="996" time="997" user="hvo" what="changeParameter">
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 11:58:44" parent="997" time="998" user="hvo" what="changeParameter">
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 11:58:45" parent="998" time="999" user="hvo" what="changeParameter">
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetEdgeColor" functionId="1" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 11:59:27" parent="999" time="1000" user="hvo" what="addModulePort">
+      <addPort moduleId="65" portName="zShift" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 11:59:28" parent="1000" time="1001" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="65" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%2 [...]
+    </action>
+    <action date="08 Mar 2007 11:59:31" parent="1001" time="1002" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="65" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 11:59:34" parent="1002" time="1003" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="65" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 11:59:34" parent="1003" time="1004" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="65" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 12:00:09" parent="1004" time="1005" user="hvo" what="moveModule">
+      <move dx="1.14578974938" dy="0.0" id="67"/>
+    </action>
+    <action date="08 Mar 2007 12:00:09" parent="1005" time="1006" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="67"/>
+    </action>
+    <action date="08 Mar 2007 12:00:10" parent="1006" time="1007" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="67"/>
+    </action>
+    <action date="08 Mar 2007 12:00:40" parent="1007" time="1008" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 12:00:42" parent="1008" time="1009" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:00:43" parent="1009" time="1010" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:00:44" parent="1010" time="1011" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 12:00:45" parent="1011" time="1012" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="67" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 12:01:53" parent="1012" time="1013" user="hvo" what="addModule">
+      <object cache="1" id="68" name="vtkTubeFilter" x="875.072380892" y="-82.0815110852"/>
+    </action>
+    <action date="08 Mar 2007 12:02:10" parent="1013" time="1014" user="hvo" what="moveModule">
+      <move dx="57.039694144" dy="-140.512417281" id="64"/>
+      <move dx="-19.4769687321" dy="-80.6902990329" id="66"/>
+      <move dx="84.8639351898" dy="-335.282104602" id="67"/>
+      <move dx="-18.0857566798" dy="-19.4769687321" id="68"/>
+    </action>
+    <action date="08 Mar 2007 12:02:10" parent="1014" time="1015" user="hvo" what="deleteConnection">
+      <connection connectionId="110"/>
+    </action>
+    <action date="08 Mar 2007 12:02:14" parent="1015" time="1016" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 12:02:16" parent="1016" time="1017" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 12:02:19" parent="1017" time="1018" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 12:02:21" parent="1018" time="1019" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfSides" functionId="1" moduleId="68" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="08 Mar 2007 12:02:23" parent="1019" time="1020" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfSides" functionId="1" moduleId="68" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 12:02:25" parent="1020" time="1021" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfSides" functionId="1" moduleId="68" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 12:02:27" parent="1021" time="1022" user="hvo" what="changeParameter">
+      <set alias="" function="CappingOn" functionId="2" moduleId="68" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:02:36" parent="1022" time="1023" user="hvo" what="moveModule">
+      <move dx="27.8242410458" dy="-15.3033325752" id="68"/>
+    </action>
+    <action date="08 Mar 2007 12:02:36" parent="1023" time="1024" user="hvo" what="addConnection">
+      <connect destinationId="68" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="113" sourceId="65" sourceModule="PythonSource" sourcePort="ugrid(vtkUnstructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 12:02:38" parent="1024" time="1025" user="hvo" what="addConnection">
+      <connect destinationId="66" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="114" sourceId="68" sourceModule="vtkTubeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 12:03:01" parent="1025" time="1026" user="hvo" what="changeParameter">
+      <set alias="" function="SidesShareVerticesOn" functionId="3" moduleId="68" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:07:33" parent="1026" time="1027" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.39121205229" id="65"/>
+      <move dx="0.0" dy="1.39121205229" id="68"/>
+    </action>
+    <action date="08 Mar 2007 12:07:33" parent="1027" time="1028" user="hvo" what="deleteConnection">
+      <connection connectionId="113"/>
+    </action>
+    <action date="08 Mar 2007 12:07:33" parent="1028" time="1029" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="65" portName="ugrid" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 12:07:34" parent="1029" time="1030" user="hvo" what="addModulePort">
+      <addPort moduleId="65" portName="polydata" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 12:07:34" parent="1030" time="1031" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="65" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%2 [...]
+    </action>
+    <action date="08 Mar 2007 12:07:41" parent="1031" time="1032" user="hvo" what="addConnection">
+      <connect destinationId="68" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="115" sourceId="65" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 12:08:17" parent="1032" time="1033" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="65" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%2 [...]
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="967" time="1034" user="hvo" what="addModule">
+      <object cache="1" id="6" name="PythonSource" x="876.953566205" y="-16.5394807673"/>
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1034" time="1035" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1035" time="1036" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1036" time="1037" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1037" time="1038" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="6" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1038" time="1039" user="hvo" what="addModulePort">
+      <addPort moduleId="6" portName="zShift" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1039" time="1040" user="hvo" what="addModulePort">
+      <addPort moduleId="6" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 12:09:01" parent="1040" time="1041" user="hvo" what="addModulePort">
+      <addPort moduleId="6" portName="polydata" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 12:09:12" parent="1041" time="1042" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.809964134143" id="0"/>
+      <move dx="-1406.80729087" dy="667.405997368" id="6"/>
+    </action>
+    <action date="08 Mar 2007 12:09:12" parent="1042" time="1043" user="hvo" what="deleteConnection">
+      <connection connectionId="1"/>
+    </action>
+    <action date="08 Mar 2007 12:09:12" parent="1043" time="1044" user="hvo" what="deleteModule">
+      <module moduleId="0"/>
+    </action>
+    <action date="08 Mar 2007 12:09:14" parent="1044" time="1045" user="hvo" what="addConnection">
+      <connect destinationId="2" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="4" sourceId="6" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 12:39:06" parent="1045" time="1046" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 12:41:17" parent="1046" time="1047" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 12:44:43" parent="1047" time="1048" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 12:45:06" parent="1048" time="1049" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%20 [...]
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1033" time="1050" user="hvo" what="addModule">
+      <object cache="1" id="69" name="PythonSource" x="-519.853724665" y="660.866516601"/>
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1050" time="1051" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Afor%20i%20in%20range%28vCount%29%3A%20%20%20%20%0A%2 [...]
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1051" time="1052" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1052" time="1053" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1053" time="1054" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="69" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1054" time="1055" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="zShift" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1055" time="1056" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 12:45:18" parent="1056" time="1057" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="polydata" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 12:45:24" parent="1057" time="1058" user="hvo" what="moveModule">
+      <move dx="1321.98617795" dy="-692.701244534" id="69"/>
+    </action>
+    <action date="08 Mar 2007 12:45:24" parent="1058" time="1059" user="hvo" what="deleteConnection">
+      <connection connectionId="115"/>
+    </action>
+    <action date="08 Mar 2007 12:45:24" parent="1059" time="1060" user="hvo" what="deleteModule">
+      <module moduleId="65"/>
+    </action>
+    <action date="08 Mar 2007 12:45:26" parent="1060" time="1061" user="hvo" what="addConnection">
+      <connect destinationId="68" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetOutput(vtkDataObject)" id="116" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 12:45:31" parent="1061" time="1062" user="hvo" what="moveModule">
+      <move dx="87.3542007701" dy="29.5462737899" id="69"/>
+    </action>
+    <action date="08 Mar 2007 12:45:31" parent="1062" time="1063" user="hvo" what="deleteConnection">
+      <connection connectionId="116"/>
+    </action>
+    <action date="08 Mar 2007 12:45:33" parent="1063" time="1064" user="hvo" what="addConnection">
+      <connect destinationId="68" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="117" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 12:46:20" parent="1064" time="1065" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 12:46:21" parent="1065" time="1066" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 12:46:46" parent="1066" time="1067" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="300"/>
+    </action>
+    <action date="08 Mar 2007 12:46:48" parent="1067" time="1068" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="68" parameter="<no description>" parameterId="0" type="Float" value="300"/>
+    </action>
+    <action date="08 Mar 2007 12:47:02" parent="1068" time="1069" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="318871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:47:08" parent="1069" time="1070" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="218871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:47:09" parent="1070" time="1071" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="218871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:47:43" parent="1071" time="1072" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="218871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:47:45" parent="1072" time="1073" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="218871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:48:13" parent="1073" time="1074" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="418871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:48:15" parent="1074" time="1075" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="418871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:48:16" parent="1075" time="1076" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="418871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:48:49" parent="1076" time="1077" user="hvo" what="moveModule">
+      <move dx="-1.39121205229" dy="0.0" id="20"/>
+    </action>
+    <action date="08 Mar 2007 12:48:49" parent="1077" time="1078" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:48:52" parent="1078" time="1079" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:48:54" parent="1079" time="1080" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="291735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:48:57" parent="1080" time="1081" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="311735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:49:00" parent="1081" time="1082" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="311735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:49:01" parent="1082" time="1083" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="311735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:49:30" parent="1083" time="1084" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="338871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="311735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:49:34" parent="1084" time="1085" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="338871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="301735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 12:49:40" parent="1085" time="1086" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="358871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="301735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:49:42" parent="1086" time="1087" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="338871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="301735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:49:43" parent="1087" time="1088" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="0" type="Float" value="338871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="1" type="Float" value="301735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="20" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 12:54:49" parent="1088" time="1089" user="hvo" what="deleteFunction">
+      <function functionId="2" moduleId="68"/>
+    </action>
+    <action date="08 Mar 2007 12:54:57" parent="1089" time="1090" user="hvo" what="changeParameter">
+      <set alias="" function="CappingOff" functionId="3" moduleId="68" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 12:55:55" parent="1090" time="1091" user="hvo" what="moveModule">
+      <move dx="94.6024195558" dy="-27.8242410458" id="29"/>
+      <move dx="58.4309061963" dy="139.121205229" id="69"/>
+    </action>
+    <action date="08 Mar 2007 12:55:55" parent="1091" time="1092" user="hvo" what="addModule">
+      <object cache="1" id="70" name="vtkImplicitDataSet" x="733.168751558" y="68.1693905623"/>
+    </action>
+    <action date="08 Mar 2007 12:55:58" parent="1092" time="1093" user="hvo" what="addConnection">
+      <connect destinationId="29" destinationModule="vtkCutter" destinationPort="SetCutFunction(vtkImplicitFunction)" id="118" sourceId="70" sourceModule="vtkImplicitDataSet" sourcePort="self(vtkImplicitDataSet)"/>
+    </action>
+    <action date="08 Mar 2007 12:56:09" parent="1093" time="1094" user="hvo" what="moveModule">
+      <move dx="-65.3869664577" dy="25.0418169413" id="28"/>
+      <move dx="18.0857566798" dy="-41.7363615688" id="29"/>
+    </action>
+    <action date="08 Mar 2007 12:56:09" parent="1094" time="1095" user="hvo" what="addConnection">
+      <connect destinationId="70" destinationModule="vtkImplicitDataSet" destinationPort="SetDataSet(vtkDataSet)" id="119" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 12:56:12" parent="1095" time="1096" user="hvo" what="deleteConnection">
+      <connection connectionId="29"/>
+    </action>
+    <action date="08 Mar 2007 12:56:16" parent="1096" time="1097" user="hvo" what="moveModule">
+      <move dx="40.3451495165" dy="-8.34727231375" id="19"/>
+    </action>
+    <action date="08 Mar 2007 12:56:16" parent="1097" time="1098" user="hvo" what="deleteConnection">
+      <connection connectionId="68"/>
+    </action>
+    <action date="08 Mar 2007 13:07:18" parent="1098" time="1099" user="hvo" what="addModule">
+      <object cache="1" id="71" name="vtkLinearExtrusionFilter" x="955.762679924" y="23.650604889"/>
+    </action>
+    <action date="08 Mar 2007 13:29:21" parent="1099" time="1100" user="hvo" what="moveModule">
+      <move dx="9.73848436604" dy="-6.95606026146" id="70"/>
+      <move dx="12.5209084706" dy="-29.2154530981" id="71"/>
+    </action>
+    <action date="08 Mar 2007 13:29:21" parent="1100" time="1101" user="hvo" what="deleteConnection">
+      <connection connectionId="119"/>
+    </action>
+    <action date="08 Mar 2007 13:29:25" parent="1101" time="1102" user="hvo" what="addConnection">
+      <connect destinationId="71" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="120" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 13:30:32" parent="1102" time="1103" user="hvo" what="moveModule">
+      <move dx="279.203697203" dy="-13.4827087283" id="0"/>
+      <move dx="147.468477543" dy="51.4748459348" id="1"/>
+      <move dx="-292.083996987" dy="299.711459647" id="2"/>
+      <move dx="147.468477543" dy="51.4748459348" id="3"/>
+      <move dx="48.6924218302" dy="129.382720863" id="4"/>
+      <move dx="299.110591243" dy="-4.17363615688" id="5"/>
+      <move dx="184.567294433" dy="802.348349632" id="7"/>
+      <move dx="189.204839112" dy="173.901506536" id="9"/>
+      <move dx="231.834007484" dy="-165.554234223" id="12"/>
+      <move dx="175.292718589" dy="52.8660579871" id="13"/>
+      <move dx="147.468477543" dy="51.4748459348" id="18"/>
+      <move dx="147.468477543" dy="51.4748459348" id="20"/>
+      <move dx="147.468477543" dy="51.4748459348" id="27"/>
+      <move dx="-99.5313891199" dy="9.78997270032" id="29"/>
+      <move dx="0.0" dy="744.037925225" id="32"/>
+      <move dx="-172.956184372" dy="-52.2131877351" id="64"/>
+      <move dx="-73.4247952524" dy="-58.7398362019" id="66"/>
+      <move dx="-205.589426707" dy="-57.1081740852" id="67"/>
+      <move dx="-182.746157073" dy="-16.3166211672" id="68"/>
+      <move dx="-24.4749317508" dy="-11.421634817" id="70"/>
+      <move dx="142.109582671" dy="-40.6540795221" id="71"/>
+    </action>
+    <action date="08 Mar 2007 13:30:32" parent="1103" time="1104" user="hvo" what="addModule">
+      <object cache="1" id="72" name="vtkActor" x="979.286485558" y="-351.904915507"/>
+    </action>
+    <action date="08 Mar 2007 13:30:32" parent="1104" time="1105" user="hvo" what="addModule">
+      <object cache="1" id="73" name="vtkDataSetMapper" x="894.437195563" y="-203.684492174"/>
+    </action>
+    <action date="08 Mar 2007 13:30:33" parent="1105" time="1106" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="72" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:30:33" parent="1106" time="1107" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="73" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:30:33" parent="1107" time="1108" user="hvo" what="addConnection">
+      <connect destinationId="72" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="121" sourceId="73" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 13:30:40" parent="1108" time="1109" user="hvo" what="moveModule">
+      <move dx="223.537709991" dy="1.63166211672" id="72"/>
+      <move dx="207.221088823" dy="34.2649044511" id="73"/>
+    </action>
+    <action date="08 Mar 2007 13:30:40" parent="1109" time="1110" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="122" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:30:48" parent="1110" time="1111" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="123" sourceId="72" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 13:31:01" parent="1111" time="1112" user="hvo" what="changeParameter">
+      <set alias="" function="SetVector" functionId="0" moduleId="71" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetVector" functionId="0" moduleId="71" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetVector" functionId="0" moduleId="71" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 13:31:08" parent="1112" time="1113" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="71" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 13:31:45" parent="1113" time="1114" user="hvo" what="moveModule">
+      <move dx="-83.2147679527" dy="-26.1065938675" id="15"/>
+      <move dx="-81.583105836" dy="-42.4232150347" id="19"/>
+      <move dx="39.1598908013" dy="-68.5298089023" id="64"/>
+      <move dx="96.2680648865" dy="16.3166211672" id="66"/>
+      <move dx="-93.0047406531" dy="-71.7931331357" id="67"/>
+    </action>
+    <action date="08 Mar 2007 13:31:45" parent="1114" time="1115" user="hvo" what="deleteConnection">
+      <connection connectionId="111"/>
+    </action>
+    <action date="08 Mar 2007 13:32:38" parent="1115" time="1116" user="hvo" what="changeParameter">
+      <set alias="" function="SetExtrusionTypeToVectorExtrusion" functionId="2" moduleId="71" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:33:32" parent="1116" time="1117" user="hvo" what="changeParameter">
+      <set alias="" function="SetVector" functionId="0" moduleId="71" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetVector" functionId="0" moduleId="71" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetVector" functionId="0" moduleId="71" parameter="<no description>" parameterId="2" type="Float" value="-1"/>
+    </action>
+    <action date="08 Mar 2007 13:33:35" parent="1117" time="1118" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="71" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 13:33:37" parent="1118" time="1119" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="71" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 13:33:56" parent="1119" time="1120" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="124" sourceId="64" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 13:34:25" parent="1120" time="1121" user="hvo" what="deleteConnection">
+      <connection connectionId="123"/>
+    </action>
+    <action date="08 Mar 2007 13:34:48" parent="1121" time="1122" user="hvo" what="addConnection">
+      <connect destinationId="70" destinationModule="vtkImplicitDataSet" destinationPort="SetDataSet(vtkDataSet)" id="125" sourceId="71" sourceModule="vtkPolyDataAlgorithm" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 13:34:56" parent="1122" time="1123" user="hvo" what="moveModule">
+      <move dx="43.8427548837" dy="8.76855097674" id="15"/>
+      <move dx="118.375438186" dy="2.92285032558" id="68"/>
+    </action>
+    <action date="08 Mar 2007 13:34:56" parent="1123" time="1124" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="126" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 13:42:36" parent="1124" time="1125" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.46142516279" id="70"/>
+      <move dx="11.6914013023" dy="115.45258786" id="71"/>
+    </action>
+    <action date="08 Mar 2007 13:42:36" parent="1125" time="1126" user="hvo" what="addModule">
+      <object cache="1" id="74" name="vtkProbeFilter" x="1011.30621265" y="-32.1513535814"/>
+    </action>
+    <action date="08 Mar 2007 13:42:58" parent="1126" time="1127" user="hvo" what="moveModule">
+      <move dx="-4.38427548837" dy="-17.5371019535" id="74"/>
+    </action>
+    <action date="08 Mar 2007 13:42:58" parent="1127" time="1128" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="127" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:43:05" parent="1128" time="1129" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="128" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:43:09" parent="1129" time="1130" user="hvo" what="changeParameter">
+      <set alias="" function="SpatialMatchOn" functionId="0" moduleId="74" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:43:14" parent="1130" time="1131" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="129" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:43:15" parent="1131" time="1132" user="hvo" what="deleteConnection">
+      <connection connectionId="122"/>
+    </action>
+    <action date="08 Mar 2007 13:43:57" parent="1132" time="1133" user="hvo" what="deleteConnection">
+      <connection connectionId="118"/>
+      <connection connectionId="125"/>
+    </action>
+    <action date="08 Mar 2007 13:43:57" parent="1133" time="1134" user="hvo" what="deleteModule">
+      <module moduleId="70"/>
+    </action>
+    <action date="08 Mar 2007 13:44:00" parent="1134" time="1135" user="hvo" what="deleteConnection">
+      <connection connectionId="126"/>
+    </action>
+    <action date="08 Mar 2007 13:44:18" parent="1135" time="1136" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="130" sourceId="72" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 13:45:24" parent="1136" time="1137" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="74"/>
+    </action>
+    <action date="08 Mar 2007 13:45:28" parent="1137" time="1138" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOn" functionId="0" moduleId="73" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:46:49" parent="1138" time="1139" user="hvo" what="deleteConnection">
+      <connection connectionId="127"/>
+    </action>
+    <action date="08 Mar 2007 13:46:51" parent="1139" time="1140" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="131" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:46:54" parent="1140" time="1141" user="hvo" what="deleteConnection">
+      <connection connectionId="128"/>
+    </action>
+    <action date="08 Mar 2007 13:46:56" parent="1141" time="1142" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="132" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:47:37" parent="1142" time="1143" user="hvo" what="deleteConnection">
+      <connection connectionId="132"/>
+    </action>
+    <action date="08 Mar 2007 13:47:38" parent="1143" time="1144" user="hvo" what="deleteConnection">
+      <connection connectionId="131"/>
+    </action>
+    <action date="08 Mar 2007 13:47:41" parent="1144" time="1145" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="133" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:47:44" parent="1145" time="1146" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="134" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:55:02" parent="1146" time="1147" user="hvo" what="moveModule">
+      <move dx="1.46142516279" dy="1.46142516279" id="71"/>
+      <move dx="20.4599522791" dy="-48.2270303721" id="74"/>
+    </action>
+    <action date="08 Mar 2007 13:55:02" parent="1147" time="1148" user="hvo" what="addModule">
+      <object cache="1" id="75" name="vtkLinearExtrusionFilter" x="1132.08457237" y="79.2336601288"/>
+    </action>
+    <action date="08 Mar 2007 13:55:02" parent="1148" time="1149" user="hvo" what="changeParameter">
+      <set alias="" function="SetVector" functionId="0" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetVector" functionId="0" moduleId="75" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetVector" functionId="0" moduleId="75" parameter="<no description>" parameterId="2" type="Float" value="-1"/>
+    </action>
+    <action date="08 Mar 2007 13:55:02" parent="1149" time="1150" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 13:55:02" parent="1150" time="1151" user="hvo" what="changeParameter">
+      <set alias="" function="SetExtrusionTypeToVectorExtrusion" functionId="2" moduleId="75" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:55:02" parent="1151" time="1152" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="75" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:55:09" parent="1152" time="1153" user="hvo" what="moveModule">
+      <move dx="4.38427548837" dy="-121.298288512" id="73"/>
+      <move dx="16.0756767907" dy="-62.841282" id="74"/>
+      <move dx="-24.8442277674" dy="-115.45258786" id="75"/>
+    </action>
+    <action date="08 Mar 2007 13:55:09" parent="1153" time="1154" user="hvo" what="deleteConnection">
+      <connection connectionId="133"/>
+    </action>
+    <action date="08 Mar 2007 13:55:11" parent="1154" time="1155" user="hvo" what="addConnection">
+      <connect destinationId="75" destinationModule="vtkAlgorithm" destinationPort="AddInputConnection(vtkAlgorithmOutput)" id="135" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:55:13" parent="1155" time="1156" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="136" sourceId="75" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:55:17" parent="1156" time="1157" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="75"/>
+    </action>
+    <action date="08 Mar 2007 13:55:22" parent="1157" time="1158" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="0" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 13:55:23" parent="1158" time="1159" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="75"/>
+    </action>
+    <action date="08 Mar 2007 13:55:25" parent="1159" time="1160" user="hvo" what="changeParameter">
+      <set alias="" function="SetExtrusionTypeToNormalExtrusion" functionId="1" moduleId="75" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:55:52" parent="1160" time="1161" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="75"/>
+    </action>
+    <action date="08 Mar 2007 13:56:08" parent="1161" time="1162" user="hvo" what="deleteConnection">
+      <connection connectionId="136"/>
+    </action>
+    <action date="08 Mar 2007 13:56:12" parent="1162" time="1163" user="hvo" what="moveModule">
+      <move dx="1.46142516279" dy="35.074203907" id="75"/>
+    </action>
+    <action date="08 Mar 2007 13:56:12" parent="1163" time="1164" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="137" sourceId="75" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:56:14" parent="1164" time="1165" user="hvo" what="deleteConnection">
+      <connection connectionId="129"/>
+    </action>
+    <action date="08 Mar 2007 13:56:41" parent="1165" time="1166" user="hvo" what="moveModule">
+      <move dx="8.76855097674" dy="-2.92285032558" id="75"/>
+    </action>
+    <action date="08 Mar 2007 13:56:41" parent="1166" time="1167" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 13:56:43" parent="1167" time="1168" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 13:56:44" parent="1168" time="1169" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 13:57:15" parent="1169" time="1170" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="100000"/>
+    </action>
+    <action date="08 Mar 2007 13:57:16" parent="1170" time="1171" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="1" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="100000"/>
+    </action>
+    <action date="08 Mar 2007 13:57:34" parent="1171" time="1172" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="75"/>
+    </action>
+    <action date="08 Mar 2007 13:57:39" parent="1172" time="1173" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="0" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 13:57:41" parent="1173" time="1174" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="0" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 13:57:42" parent="1174" time="1175" user="hvo" what="changeParameter">
+      <set alias="" function="SetScaleFactor" functionId="0" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 13:57:44" parent="1175" time="1176" user="hvo" what="changeParameter">
+      <set alias="" function="SetExtrusionTypeToPointExtrusion" functionId="1" moduleId="75" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 13:57:52" parent="1176" time="1177" user="hvo" what="changeParameter">
+      <set alias="" function="SetExtrusionPoint" functionId="2" moduleId="75" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetExtrusionPoint" functionId="2" moduleId="75" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetExtrusionPoint" functionId="2" moduleId="75" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 13:58:32" parent="1177" time="1178" user="hvo" what="moveModule">
+      <move dx="23.3828026046" dy="-51.1498806977" id="75"/>
+    </action>
+    <action date="08 Mar 2007 13:58:32" parent="1178" time="1179" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="75"/>
+    </action>
+    <action date="08 Mar 2007 13:58:34" parent="1179" time="1180" user="hvo" what="deleteConnection">
+      <connection connectionId="137"/>
+      <connection connectionId="135"/>
+    </action>
+    <action date="08 Mar 2007 13:58:34" parent="1180" time="1181" user="hvo" what="deleteModule">
+      <module moduleId="75"/>
+    </action>
+    <action date="08 Mar 2007 13:58:37" parent="1181" time="1182" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="138" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:58:39" parent="1182" time="1183" user="hvo" what="deleteConnection">
+      <connection connectionId="138"/>
+    </action>
+    <action date="08 Mar 2007 13:58:42" parent="1183" time="1184" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="139" sourceId="71" sourceModule="vtkLinearExtrusionFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 13:58:50" parent="1184" time="1185" user="hvo" what="moveModule">
+      <move dx="51.1498806977" dy="94.9926355814" id="74"/>
+    </action>
+    <action date="08 Mar 2007 13:58:50" parent="1185" time="1186" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="140" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:09:16" parent="1186" time="1187" user="hvo" what="moveModule">
+      <move dx="16.0756767907" dy="-27.767078093" id="71"/>
+    </action>
+    <action date="08 Mar 2007 14:09:16" parent="1187" time="1188" user="hvo" what="addModule">
+      <object cache="1" id="76" name="vtkTransformPolyDataFilter" x="1210.06003479" y="135.91254014"/>
+    </action>
+    <action date="08 Mar 2007 14:09:24" parent="1188" time="1189" user="hvo" what="moveModule">
+      <move dx="-447.196099814" dy="-61.3798568372" id="71"/>
+      <move dx="40.9199045581" dy="-102.299761395" id="74"/>
+    </action>
+    <action date="08 Mar 2007 14:09:24" parent="1189" time="1190" user="hvo" what="deleteConnection">
+      <connection connectionId="139"/>
+    </action>
+    <action date="08 Mar 2007 14:09:34" parent="1190" time="1191" user="hvo" what="moveModule">
+      <move dx="-80.3783839535" dy="-17.5371019535" id="74"/>
+      <move dx="-93.5312104186" dy="-135.91254014" id="76"/>
+    </action>
+    <action date="08 Mar 2007 14:09:34" parent="1191" time="1192" user="hvo" what="addConnection">
+      <connect destinationId="76" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="141" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 14:09:44" parent="1192" time="1193" user="hvo" what="addModule">
+      <object cache="1" id="77" name="vtkGeneralTransform" x="604.126428208" y="331.928645966"/>
+    </action>
+    <action date="08 Mar 2007 14:09:44" parent="1193" time="1194" user="hvo" what="changeParameter">
+      <set alias="" function="RotateX" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="90"/>
+    </action>
+    <action date="08 Mar 2007 14:09:44" parent="1194" time="1195" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="77" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:09:49" parent="1195" time="1196" user="hvo" what="moveModule">
+      <move dx="534.881609581" dy="-187.062420837" id="77"/>
+    </action>
+    <action date="08 Mar 2007 14:09:49" parent="1196" time="1197" user="hvo" what="addConnection">
+      <connect destinationId="76" destinationModule="vtkTransformPolyDataFilter" destinationPort="SetTransform(vtkAbstractTransform)" id="142" sourceId="77" sourceModule="vtkGeneralTransform" sourcePort="self(vtkGeneralTransform)"/>
+    </action>
+    <action date="08 Mar 2007 14:10:17" parent="1197" time="1198" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="77"/>
+    </action>
+    <action date="08 Mar 2007 14:10:20" parent="1198" time="1199" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:10:24" parent="1199" time="1200" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:10:24" parent="1200" time="1201" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:10:27" parent="1201" time="1202" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-10000"/>
+    </action>
+    <action date="08 Mar 2007 14:10:28" parent="1202" time="1203" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-10000"/>
+    </action>
+    <action date="08 Mar 2007 14:10:45" parent="1203" time="1204" user="hvo" what="moveModule">
+      <move dx="39.4584793953" dy="43.8427548837" id="76"/>
+      <move dx="-122.759713674" dy="151.98821693" id="77"/>
+    </action>
+    <action date="08 Mar 2007 14:10:45" parent="1204" time="1205" user="hvo" what="addModule">
+      <object cache="1" id="78" name="vtkRuledSurfaceFilter" x="1082.91604563" y="-62.841282"/>
+    </action>
+    <action date="08 Mar 2007 14:10:55" parent="1205" time="1206" user="hvo" what="addConnection">
+      <connect destinationId="78" destinationModule="vtkRuledSurfaceFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="143" sourceId="76" sourceModule="vtkTransformPolyDataFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:12:33" parent="1206" time="1207" user="hvo" what="addModule">
+      <object cache="1" id="79" name="vtkAppendPolyData" x="1058.07181786" y="-10.2299761395"/>
+    </action>
+    <action date="08 Mar 2007 14:12:35" parent="1207" time="1208" user="hvo" what="moveModule">
+      <move dx="2.92285032558" dy="108.145462046" id="76"/>
+    </action>
+    <action date="08 Mar 2007 14:12:35" parent="1208" time="1209" user="hvo" what="deleteConnection">
+      <connection connectionId="143"/>
+    </action>
+    <action date="08 Mar 2007 14:12:38" parent="1209" time="1210" user="hvo" what="moveModule">
+      <move dx="48.2270303721" dy="-48.2270303721" id="78"/>
+    </action>
+    <action date="08 Mar 2007 14:12:38" parent="1210" time="1211" user="hvo" what="addConnection">
+      <connect destinationId="78" destinationModule="vtkRuledSurfaceFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="144" sourceId="79" sourceModule="vtkAppendPolyData" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:12:51" parent="1211" time="1212" user="hvo" what="moveModule">
+      <move dx="-40.9199045581" dy="10.2299761395" id="69"/>
+    </action>
+    <action date="08 Mar 2007 14:12:51" parent="1212" time="1213" user="hvo" what="addConnection">
+      <connect destinationId="79" destinationModule="vtkAppendPolyData" destinationPort="AddInput(vtkPolyData)" id="145" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 14:13:04" parent="1213" time="1214" user="hvo" what="moveModule">
+      <move dx="-54.0727310232" dy="39.4584793953" id="76"/>
+    </action>
+    <action date="08 Mar 2007 14:13:07" parent="1214" time="1215" user="hvo" what="addConnection">
+      <connect destinationId="79" destinationModule="vtkAppendPolyData" destinationPort="AddInput(vtkPolyData)" id="146" sourceId="76" sourceModule="vtkPolyDataAlgorithm" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 14:13:18" parent="1215" time="1216" user="hvo" what="moveModule">
+      <move dx="11.6914013023" dy="21.9213774419" id="78"/>
+    </action>
+    <action date="08 Mar 2007 14:13:18" parent="1216" time="1217" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:13:20" parent="1217" time="1218" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:13:22" parent="1218" time="1219" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="100"/>
+    </action>
+    <action date="08 Mar 2007 14:13:23" parent="1219" time="1220" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="100"/>
+    </action>
+    <action date="08 Mar 2007 14:13:26" parent="1220" time="1221" user="hvo" what="changeParameter">
+      <set alias="" function="SetRuledModeToResample" functionId="1" moduleId="78" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:13:31" parent="1221" time="1222" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetSourceConnection(vtkAlgorithmOutput)" id="147" sourceId="78" sourceModule="vtkRuledSurfaceFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:13:34" parent="1222" time="1223" user="hvo" what="deleteConnection">
+      <connection connectionId="147"/>
+    </action>
+    <action date="08 Mar 2007 14:13:37" parent="1223" time="1224" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="148" sourceId="78" sourceModule="vtkRuledSurfaceFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:14:29" parent="1224" time="1225" user="hvo" what="deleteConnection">
+      <connection connectionId="148"/>
+    </action>
+    <action date="08 Mar 2007 14:14:32" parent="1225" time="1226" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="149" sourceId="78" sourceModule="vtkRuledSurfaceFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:14:35" parent="1226" time="1227" user="hvo" what="deleteConnection">
+      <connection connectionId="140"/>
+    </action>
+    <action date="08 Mar 2007 14:16:23" parent="1227" time="1228" user="hvo" what="deleteConnection">
+      <connection connectionId="149"/>
+    </action>
+    <action date="08 Mar 2007 14:16:29" parent="1228" time="1229" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="150" sourceId="78" sourceModule="vtkRuledSurfaceFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:16:35" parent="1229" time="1230" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="151" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:20:11" parent="1230" time="1231" user="hvo" what="moveModule">
+      <move dx="-149.065366605" dy="-43.8427548837" id="20"/>
+      <move dx="2.92285032558" dy="-27.767078093" id="72"/>
+    </action>
+    <action date="08 Mar 2007 14:20:11" parent="1231" time="1232" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="2"/>
+    </action>
+    <action date="08 Mar 2007 14:20:42" parent="1232" time="1233" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="152" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 14:21:15" parent="1233" time="1234" user="hvo" what="moveModule">
+      <move dx="70.1484078139" dy="-20.4599522791" id="29"/>
+      <move dx="176.832444698" dy="83.301234279" id="71"/>
+    </action>
+    <action date="08 Mar 2007 14:21:15" parent="1234" time="1235" user="hvo" what="deleteConnection">
+      <connection connectionId="30"/>
+      <connection connectionId="31"/>
+    </action>
+    <action date="08 Mar 2007 14:21:15" parent="1235" time="1236" user="hvo" what="deleteModule">
+      <module moduleId="29"/>
+    </action>
+    <action date="08 Mar 2007 14:21:23" parent="1236" time="1237" user="hvo" what="addConnection">
+      <connect destinationId="19" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="153" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 14:22:00" parent="1237" time="1238" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.46142516279" id="6"/>
+    </action>
+    <action date="08 Mar 2007 14:22:00" parent="1238" time="1239" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+    </action>
+    <action date="08 Mar 2007 14:22:01" parent="1239" time="1240" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+    </action>
+    <action date="08 Mar 2007 14:23:54" parent="1240" time="1241" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="45"/>
+    </action>
+    <action date="08 Mar 2007 14:23:55" parent="1241" time="1242" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="45"/>
+    </action>
+    <action date="08 Mar 2007 14:25:02" parent="1242" time="1243" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.46142516279" id="78"/>
+    </action>
+    <action date="08 Mar 2007 14:25:02" parent="1243" time="1244" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-1000"/>
+    </action>
+    <action date="08 Mar 2007 14:25:03" parent="1244" time="1245" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-1000"/>
+    </action>
+    <action date="08 Mar 2007 14:25:28" parent="1245" time="1246" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-2000"/>
+    </action>
+    <action date="08 Mar 2007 14:25:29" parent="1246" time="1247" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-2000"/>
+    </action>
+    <action date="08 Mar 2007 14:26:02" parent="1247" time="1248" user="hvo" what="deleteConnection">
+      <connection connectionId="152"/>
+    </action>
+    <action date="08 Mar 2007 14:26:07" parent="1248" time="1249" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 14:26:09" parent="1249" time="1250" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 14:31:58" parent="1250" time="1251" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.46142516279" id="2"/>
+    </action>
+    <action date="08 Mar 2007 14:31:58" parent="1251" time="1252" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:32:09" parent="1252" time="1253" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.474509803922"/>
+    </action>
+    <action date="08 Mar 2007 14:32:15" parent="1253" time="1254" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.474509803922"/>
+    </action>
+    <action date="08 Mar 2007 14:32:54" parent="1254" time="1255" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="2.5"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.81"/>
+    </action>
+    <action date="08 Mar 2007 14:32:57" parent="1255" time="1256" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="2.5"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.474509803922"/>
+    </action>
+    <action date="08 Mar 2007 14:33:00" parent="1256" time="1257" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.15"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.43"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:09" parent="1257" time="1258" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.145098039216"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.43"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:16" parent="1258" time="1259" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.145098039216"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.427450980392"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:17" parent="1259" time="1260" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.145098039216"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.427450980392"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:46" parent="1260" time="1261" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="7.5"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.15"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.72"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:47" parent="1261" time="1262" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="7.5"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.15"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.72"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:54" parent="1262" time="1263" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="7.5"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.149019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.72"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:33:56" parent="1263" time="1264" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="7.5"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.149019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.72"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:34:00" parent="1264" time="1265" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="7.5"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.149019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.717647058824"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:34:06" parent="1265" time="1266" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="10.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.16"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:34:15" parent="1266" time="1267" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="10.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.156862745098"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 14:34:31" parent="1267" time="1268" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="12.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.16"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.73"/>
+    </action>
+    <action date="08 Mar 2007 14:34:37" parent="1268" time="1269" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="12.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.164705882353"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.73"/>
+    </action>
+    <action date="08 Mar 2007 14:34:43" parent="1269" time="1270" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="12.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.164705882353"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.725490196078"/>
+    </action>
+    <action date="08 Mar 2007 14:34:45" parent="1270" time="1271" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="12.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.164705882353"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.725490196078"/>
+    </action>
+    <action date="08 Mar 2007 14:34:54" parent="1271" time="1272" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="15.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.73"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.31"/>
+    </action>
+    <action date="08 Mar 2007 14:35:23" parent="1272" time="1273" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="15.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.733333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.31"/>
+    </action>
+    <action date="08 Mar 2007 14:35:27" parent="1273" time="1274" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="15.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.733333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.309803921569"/>
+    </action>
+    <action date="08 Mar 2007 14:35:30" parent="1274" time="1275" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="17.5"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.45"/>
+    </action>
+    <action date="08 Mar 2007 14:35:41" parent="1275" time="1276" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="17.5"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.454901960784"/>
+    </action>
+    <action date="08 Mar 2007 14:35:42" parent="1276" time="1277" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="17.5"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.454901960784"/>
+    </action>
+    <action date="08 Mar 2007 14:35:53" parent="1277" time="1278" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="20.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.93"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:35:54" parent="1278" time="1279" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="20.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.93"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:07" parent="1279" time="1280" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="20.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.933333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:10" parent="1280" time="1281" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="20.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.933333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:12" parent="1281" time="1282" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="22.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.75"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:24" parent="1282" time="1283" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="22.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.749019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:25" parent="1283" time="1284" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="22.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.749019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:29" parent="1284" time="1285" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="25.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.56"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:41" parent="1285" time="1286" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="25.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.560784313725"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:42" parent="1286" time="1287" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="25.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.560784313725"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:36:57" parent="1287" time="1288" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="27.5"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.37"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:04" parent="1288" time="1289" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="27.5"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.372549019608"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:12" parent="1289" time="1290" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="30.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.88"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:21" parent="1290" time="1291" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="30.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.878431372549"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:34" parent="1291" time="1292" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.5"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.68"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:37" parent="1292" time="1293" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.5"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.674509803922"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:41" parent="1293" time="1294" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.49"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:37:58" parent="1294" time="1295" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:38:04" parent="1295" time="1296" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35.5"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.49"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:38:08" parent="1296" time="1297" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35.5"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:38:15" parent="1297" time="1298" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35.5"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:39:00" parent="1298" time="1299" user="hvo" what="moveModule">
+      <move dx="143.219665953" dy="-132.989689814" id="2"/>
+    </action>
+    <action date="08 Mar 2007 14:39:00" parent="1299" time="1300" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="154" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 14:39:44" parent="1300" time="1301" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-35"/>
+    </action>
+    <action date="08 Mar 2007 14:39:46" parent="1301" time="1302" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-35"/>
+    </action>
+    <action date="08 Mar 2007 14:40:00" parent="1302" time="1303" user="hvo" what="moveModule">
+      <move dx="64.3027071628" dy="27.767078093" id="71"/>
+      <move dx="0.0" dy="-1.46142516279" id="73"/>
+    </action>
+    <action date="08 Mar 2007 14:40:00" parent="1303" time="1304" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:40:02" parent="1304" time="1305" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:40:02" parent="1305" time="1306" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:40:06" parent="1306" time="1307" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 14:40:08" parent="1307" time="1308" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 14:40:48" parent="1308" time="1309" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 14:40:50" parent="1309" time="1310" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalScale" functionId="1" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 14:41:19" parent="1310" time="1311" user="hvo" what="deleteConnection">
+      <connection connectionId="124"/>
+    </action>
+    <action date="08 Mar 2007 14:41:25" parent="1311" time="1312" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="72"/>
+    </action>
+    <action date="08 Mar 2007 14:42:23" parent="1312" time="1313" user="hvo" what="moveModule">
+      <move dx="-86.2240846046" dy="-146.142516279" id="9"/>
+      <move dx="312.744984837" dy="2.92285032558" id="16"/>
+    </action>
+    <action date="08 Mar 2007 14:42:23" parent="1313" time="1314" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-100"/>
+    </action>
+    <action date="08 Mar 2007 14:42:26" parent="1314" time="1315" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-100"/>
+    </action>
+    <action date="08 Mar 2007 14:43:40" parent="1315" time="1316" user="hvo" what="moveModule">
+      <move dx="-39.4584793953" dy="11.6914013023" id="66"/>
+    </action>
+    <action date="08 Mar 2007 14:43:40" parent="1316" time="1317" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="155" sourceId="64" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 14:43:57" parent="1317" time="1318" user="hvo" what="deleteConnection">
+      <connection connectionId="155"/>
+    </action>
+    <action date="08 Mar 2007 14:44:01" parent="1318" time="1319" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="156" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 14:44:49" parent="1319" time="1320" user="hvo" what="moveModule">
+      <move dx="-1.46142516279" dy="0.0" id="77"/>
+    </action>
+    <action date="08 Mar 2007 14:44:49" parent="1320" time="1321" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:44:51" parent="1321" time="1322" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:45:57" parent="1322" time="1323" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="-100"/>
+    </action>
+    <action date="08 Mar 2007 14:45:59" parent="1323" time="1324" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="-100"/>
+    </action>
+    <action date="08 Mar 2007 14:46:23" parent="1324" time="1325" user="hvo" what="moveModule">
+      <move dx="-1.46142516279" dy="0.0" id="16"/>
+    </action>
+    <action date="08 Mar 2007 14:46:23" parent="1325" time="1326" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalShift" functionId="2" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:46:24" parent="1326" time="1327" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalShift" functionId="2" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:46:27" parent="1327" time="1328" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalShift" functionId="2" moduleId="16" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 14:46:29" parent="1328" time="1329" user="hvo" what="changeParameter">
+      <set alias="" function="SetVerticalShift" functionId="2" moduleId="16" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 14:46:33" parent="1329" time="1330" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:46:38" parent="1330" time="1331" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 14:46:39" parent="1331" time="1332" user="hvo" what="deleteConnection">
+      <connection connectionId="156"/>
+    </action>
+    <action date="08 Mar 2007 14:47:21" parent="1332" time="1333" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.46142516279" id="71"/>
+    </action>
+    <action date="08 Mar 2007 14:47:21" parent="1333" time="1334" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-35"/>
+    </action>
+    <action date="08 Mar 2007 14:47:22" parent="1334" time="1335" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-35"/>
+    </action>
+    <action date="08 Mar 2007 14:47:37" parent="1335" time="1336" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 14:47:39" parent="1336" time="1337" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:47:40" parent="1337" time="1338" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:47:42" parent="1338" time="1339" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 14:47:43" parent="1339" time="1340" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="100"/>
+    </action>
+    <action date="08 Mar 2007 14:48:44" parent="1340" time="1341" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="157" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 14:49:56" parent="1341" time="1342" user="hvo" what="moveModule">
+      <move dx="10.2299761395" dy="176.832444698" id="19"/>
+    </action>
+    <action date="08 Mar 2007 14:50:09" parent="1342" time="1343" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkMapper" destinationPort="SetScalarRange(Float,Float)" id="158" sourceId="19" sourceModule="vtkMapper" sourcePort="GetScalarRange(Float,Float)"/>
+    </action>
+    <action date="08 Mar 2007 14:50:15" parent="1343" time="1344" user="hvo" what="deleteConnection">
+      <connection connectionId="157"/>
+    </action>
+    <action date="08 Mar 2007 14:51:00" parent="1344" time="1345" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-25"/>
+    </action>
+    <action date="08 Mar 2007 14:51:02" parent="1345" time="1346" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-25"/>
+    </action>
+    <action date="08 Mar 2007 14:51:09" parent="1346" time="1347" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="-1"/>
+    </action>
+    <action date="08 Mar 2007 14:51:12" parent="1347" time="1348" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="69" parameter="<no description>" parameterId="0" type="Float" value="-1"/>
+    </action>
+    <action date="08 Mar 2007 14:51:17" parent="1348" time="1349" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.46142516279" id="20"/>
+      <move dx="0.0" dy="1.46142516279" id="78"/>
+    </action>
+    <action date="08 Mar 2007 14:51:17" parent="1349" time="1350" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="20"/>
+    </action>
+    <action date="08 Mar 2007 14:51:20" parent="1350" time="1351" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="20"/>
+    </action>
+    <action date="08 Mar 2007 14:52:22" parent="1351" time="1352" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="159" sourceId="15" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 14:53:44" parent="1352" time="1353" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.46142516279" id="2"/>
+    </action>
+    <action date="08 Mar 2007 14:53:44" parent="1353" time="1354" user="hvo" what="changeParameter">
+      <set alias="" function="SetColorModeToMapScalars" functionId="1" moduleId="73" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 14:56:17" parent="1354" time="1355" user="hvo" what="deleteConnection">
+      <connection connectionId="159"/>
+      <connection connectionId="20"/>
+    </action>
+    <action date="08 Mar 2007 14:56:17" parent="1355" time="1356" user="hvo" what="deleteModule">
+      <module moduleId="15"/>
+    </action>
+    <action date="08 Mar 2007 14:56:26" parent="1356" time="1357" user="hvo" what="moveModule">
+      <move dx="102.299761395" dy="-32.1513535814" id="64"/>
+      <move dx="-18.9985271163" dy="71.6098329767" id="67"/>
+    </action>
+    <action date="08 Mar 2007 14:56:26" parent="1357" time="1358" user="hvo" what="deleteConnection">
+      <connection connectionId="112"/>
+      <connection connectionId="109"/>
+      <connection connectionId="114"/>
+      <connection connectionId="117"/>
+    </action>
+    <action date="08 Mar 2007 14:56:26" parent="1358" time="1359" user="hvo" what="deleteModule">
+      <module moduleId="67"/>
+      <module moduleId="64"/>
+      <module moduleId="68"/>
+      <module moduleId="66"/>
+    </action>
+    <action date="08 Mar 2007 14:56:33" parent="1359" time="1360" user="hvo" what="moveModule">
+      <move dx="-90.608360093" dy="-36.5356290698" id="71"/>
+    </action>
+    <action date="08 Mar 2007 14:56:33" parent="1360" time="1361" user="hvo" what="deleteConnection">
+      <connection connectionId="120"/>
+    </action>
+    <action date="08 Mar 2007 14:56:33" parent="1361" time="1362" user="hvo" what="deleteModule">
+      <module moduleId="71"/>
+    </action>
+    <action date="08 Mar 2007 14:59:14" parent="1362" time="1363" user="hvo" what="moveModule">
+      <move dx="-42.3813297209" dy="792.092438232" id="31"/>
+      <move dx="154.911067256" dy="-882.700798325" id="32"/>
+    </action>
+    <action date="08 Mar 2007 14:59:14" parent="1363" time="1364" user="hvo" what="deleteConnection">
+      <connection connectionId="33"/>
+      <connection connectionId="36"/>
+      <connection connectionId="55"/>
+    </action>
+    <action date="08 Mar 2007 14:59:14" parent="1364" time="1365" user="hvo" what="deleteModule">
+      <module moduleId="32"/>
+    </action>
+    <action date="08 Mar 2007 14:59:16" parent="1365" time="1366" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 14:59:16" parent="1366" time="1367" user="hvo" what="deleteModule">
+      <module moduleId="31"/>
+    </action>
+    <action date="08 Mar 2007 14:59:20" parent="1367" time="1368" user="hvo" what="moveModule">
+      <move dx="32.1513535814" dy="-36.5356290698" id="19"/>
+      <move dx="-549.495861209" dy="-11.6914013023" id="73"/>
+    </action>
+    <action date="08 Mar 2007 14:59:20" parent="1368" time="1369" user="hvo" what="deleteConnection">
+      <connection connectionId="158"/>
+      <connection connectionId="5"/>
+      <connection connectionId="153"/>
+    </action>
+    <action date="08 Mar 2007 14:59:20" parent="1369" time="1370" user="hvo" what="deleteModule">
+      <module moduleId="19"/>
+    </action>
+    <action date="08 Mar 2007 14:59:30" parent="1370" time="1371" user="hvo" what="moveModule">
+      <move dx="1.46142516279" dy="-372.663416512" id="2"/>
+      <move dx="-135.91254014" dy="-11.6914013023" id="74"/>
+    </action>
+    <action date="08 Mar 2007 14:59:30" parent="1371" time="1372" user="hvo" what="deleteConnection">
+      <connection connectionId="16"/>
+      <connection connectionId="15"/>
+    </action>
+    <action date="08 Mar 2007 14:59:30" parent="1372" time="1373" user="hvo" what="deleteModule">
+      <module moduleId="8"/>
+      <module moduleId="11"/>
+    </action>
+    <action date="08 Mar 2007 14:59:34" parent="1373" time="1374" user="hvo" what="deleteConnection">
+      <connection connectionId="17"/>
+      <connection connectionId="24"/>
+      <connection connectionId="22"/>
+      <connection connectionId="23"/>
+    </action>
+    <action date="08 Mar 2007 14:59:34" parent="1374" time="1375" user="hvo" what="deleteModule">
+      <module moduleId="16"/>
+      <module moduleId="21"/>
+      <module moduleId="22"/>
+      <module moduleId="23"/>
+    </action>
+    <action date="08 Mar 2007 14:59:36" parent="1375" time="1376" user="hvo" what="moveModule">
+      <move dx="-27.767078093" dy="21.9213774419" id="9"/>
+    </action>
+    <action date="08 Mar 2007 14:59:36" parent="1376" time="1377" user="hvo" what="deleteConnection">
+      <connection connectionId="18"/>
+    </action>
+    <action date="08 Mar 2007 14:59:36" parent="1377" time="1378" user="hvo" what="deleteModule">
+      <module moduleId="9"/>
+    </action>
+    <action date="08 Mar 2007 14:59:37" parent="1378" time="1379" user="hvo" what="deleteConnection">
+      <connection connectionId="19"/>
+      <connection connectionId="9"/>
+    </action>
+    <action date="08 Mar 2007 14:59:37" parent="1379" time="1380" user="hvo" what="deleteModule">
+      <module moduleId="10"/>
+    </action>
+    <action date="08 Mar 2007 14:59:38" parent="1380" time="1381" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 14:59:38" parent="1381" time="1382" user="hvo" what="deleteModule">
+      <module moduleId="4"/>
+    </action>
+    <action date="08 Mar 2007 14:59:40" parent="1382" time="1383" user="hvo" what="deleteConnection">
+      <connection connectionId="2"/>
+    </action>
+    <action date="08 Mar 2007 14:59:40" parent="1383" time="1384" user="hvo" what="deleteModule">
+      <module moduleId="14"/>
+    </action>
+    <action date="08 Mar 2007 14:59:41" parent="1384" time="1385" user="hvo" what="deleteConnection">
+      <connection connectionId="3"/>
+    </action>
+    <action date="08 Mar 2007 14:59:41" parent="1385" time="1386" user="hvo" what="deleteModule">
+      <module moduleId="13"/>
+    </action>
+    <action date="08 Mar 2007 14:59:42" parent="1386" time="1387" user="hvo" what="deleteConnection">
+      <connection connectionId="4"/>
+    </action>
+    <action date="08 Mar 2007 14:59:42" parent="1387" time="1388" user="hvo" what="deleteModule">
+      <module moduleId="1"/>
+    </action>
+    <action date="08 Mar 2007 14:59:52" parent="1388" time="1389" user="hvo" what="moveModule">
+      <move dx="116.914013023" dy="-35.074203907" id="0"/>
+      <move dx="127.143989163" dy="-463.271776605" id="7"/>
+      <move dx="-1.46142516279" dy="1.46142516279" id="12"/>
+    </action>
+    <action date="08 Mar 2007 14:59:52" parent="1389" time="1390" user="hvo" what="deleteConnection">
+      <connection connectionId="66"/>
+      <connection connectionId="67"/>
+    </action>
+    <action date="08 Mar 2007 14:59:52" parent="1390" time="1391" user="hvo" what="deleteModule">
+      <module moduleId="42"/>
+      <module moduleId="28"/>
+      <module moduleId="43"/>
+    </action>
+    <action date="08 Mar 2007 15:00:57" parent="1391" time="1392" user="hvo" what="moveModule">
+      <move dx="40.9199045581" dy="-191.446696326" id="0"/>
+      <move dx="564.110112837" dy="71.6098329767" id="2"/>
+      <move dx="-73.0712581395" dy="-346.357763581" id="3"/>
+      <move dx="-182.678145349" dy="-236.750876372" id="5"/>
+      <move dx="561.187262511" dy="-160.756767907" id="6"/>
+      <move dx="-106.684036884" dy="-457.426075953" id="7"/>
+      <move dx="153.449642093" dy="-150.526791767" id="12"/>
+      <move dx="-23.3828026046" dy="-226.520900233" id="18"/>
+      <move dx="93.5312104186" dy="-412.121895907" id="20"/>
+      <move dx="711.714054279" dy="-128.605414326" id="24"/>
+      <move dx="711.714054279" dy="-128.605414326" id="25"/>
+      <move dx="711.714054279" dy="-128.605414326" id="26"/>
+      <move dx="-64.3027071628" dy="-255.749403488" id="27"/>
+      <move dx="-537.804459907" dy="151.98821693" id="69"/>
+      <move dx="-146.142516279" dy="-181.216720186" id="72"/>
+      <move dx="412.121895907" dy="-58.4570065116" id="73"/>
+      <move dx="-132.989689814" dy="-10.2299761395" id="74"/>
+      <move dx="-474.963177907" dy="-16.0756767907" id="76"/>
+      <move dx="-280.593631256" dy="113.991162698" id="77"/>
+      <move dx="-467.656052093" dy="-4.38427548837" id="78"/>
+      <move dx="-587.492915442" dy="39.4584793953" id="79"/>
+    </action>
+    <action date="08 Mar 2007 15:00:57" parent="1392" time="1393" user="hvo" what="deleteConnection">
+      <connection connectionId="144"/>
+    </action>
+    <action date="08 Mar 2007 15:00:59" parent="1393" time="1394" user="hvo" what="addConnection">
+      <connect destinationId="78" destinationModule="vtkRuledSurfaceFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="160" sourceId="79" sourceModule="vtkAppendPolyData" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 15:01:55" parent="1394" time="1395" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-10"/>
+    </action>
+    <action date="08 Mar 2007 15:02:01" parent="1395" time="1396" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-10"/>
+    </action>
+    <action date="08 Mar 2007 15:02:40" parent="1396" time="1397" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 15:02:43" parent="1397" time="1398" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 15:02:45" parent="1398" time="1399" user="hvo" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 15:02:47" parent="1399" time="1400" user="hvo" what="changeParameter">
+      <set alias="" function="SetTimeStep" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 15:03:46" parent="1400" time="1401" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.46142516279" id="26"/>
+    </action>
+    <action date="08 Mar 2007 15:04:59" parent="1401" time="1402" user="hvo" what="moveModule">
+      <move dx="-140.296815628" dy="46.7656052093" id="0"/>
+      <move dx="-1.46142516279" dy="0.0" id="2"/>
+      <move dx="-160.756767907" dy="8.76855097674" id="7"/>
+      <move dx="-73.0712581395" dy="-30.6899284186" id="73"/>
+      <move dx="-166.602468558" dy="36.5356290698" id="12"/>
+      <move dx="-29.2285032558" dy="-111.068312372" id="18"/>
+      <move dx="1.46142516279" dy="11.6914013023" id="20"/>
+      <move dx="29.2285032558" dy="17.5371019535" id="27"/>
+    </action>
+    <action date="08 Mar 2007 15:04:59" parent="1402" time="1403" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="73"/>
+    </action>
+    <action date="08 Mar 2007 15:05:09" parent="1403" time="1404" user="hvo" what="changeParameter">
+      <set alias="" function="InterpolateScalarsBeforeMappingOn" functionId="1" moduleId="73" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 15:05:22" parent="1404" time="1405" user="hvo" what="changeParameter">
+      <set alias="" function="SetScalarModeToUsePointData" functionId="2" moduleId="73" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 15:06:41" parent="1405" time="1406" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="35"/>
+    </action>
+    <action date="08 Mar 2007 15:06:43" parent="1406" time="1407" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="35"/>
+    </action>
+    <action date="08 Mar 2007 15:09:45" parent="1407" time="1408" user="hvo" what="moveModule">
+      <move dx="-1.46142516279" dy="0.0" id="76"/>
+    </action>
+    <action date="08 Mar 2007 15:09:45" parent="1408" time="1409" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-2"/>
+    </action>
+    <action date="08 Mar 2007 15:09:47" parent="1409" time="1410" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-2"/>
+    </action>
+    <action date="08 Mar 2007 15:10:48" parent="1410" time="1411" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="15"/>
+    </action>
+    <action date="08 Mar 2007 15:10:50" parent="1411" time="1412" user="hvo" what="changeParameter">
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="0" type="Integer" value="100"/>
+      <set alias="" function="SetResolution" functionId="0" moduleId="78" parameter="<no description>" parameterId="1" type="Integer" value="15"/>
+    </action>
+    <action date="08 Mar 2007 15:11:06" parent="1412" time="1413" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="73"/>
+    </action>
+    <action date="08 Mar 2007 15:11:09" parent="1413" time="1414" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="73"/>
+    </action>
+    <action date="08 Mar 2007 15:11:56" parent="1414" time="1415" user="hvo" what="addModule">
+      <object cache="1" id="80" name="vtkProperty" x="1150.14160312" y="-412.121895907"/>
+    </action>
+    <action date="08 Mar 2007 15:11:59" parent="1415" time="1416" user="hvo" what="addConnection">
+      <connect destinationId="72" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="161" sourceId="80" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="08 Mar 2007 15:13:01" parent="1416" time="1417" user="hvo" what="changeParameter">
+      <set alias="" function="SetInterpolationToFlat" functionId="0" moduleId="80" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 15:13:46" parent="1417" time="1418" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-10"/>
+    </action>
+    <action date="08 Mar 2007 15:14:51" parent="1418" time="1419" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="80"/>
+    </action>
+    <action date="08 Mar 2007 15:14:52" parent="1419" time="1420" user="hvo" what="deleteConnection">
+      <connection connectionId="161"/>
+    </action>
+    <action date="08 Mar 2007 15:14:52" parent="1420" time="1421" user="hvo" what="deleteModule">
+      <module moduleId="80"/>
+    </action>
+    <action date="08 Mar 2007 15:17:24" parent="1421" time="1422" user="hvo" what="moveModule">
+      <move dx="-58.1362943906" dy="18.433459197" id="72"/>
+      <move dx="-72.3158783884" dy="-15.5975423975" id="73"/>
+    </action>
+    <action date="08 Mar 2007 15:17:24" parent="1422" time="1423" user="hvo" what="addModule">
+      <object cache="1" id="81" name="vtkPolyDataMapper2D" x="683.45594869" y="-306.279014351"/>
+    </action>
+    <action date="08 Mar 2007 15:17:31" parent="1423" time="1424" user="hvo" what="moveModule">
+      <move dx="90.7493375854" dy="11.3436671982" id="81"/>
+    </action>
+    <action date="08 Mar 2007 15:17:31" parent="1424" time="1425" user="hvo" what="addConnection">
+      <connect destinationId="81" destinationModule="vtkPolyDataMapper2D" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="162" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 15:17:45" parent="1425" time="1426" user="hvo" what="moveModule">
+      <move dx="1.41795839977" dy="-1.41795839977" id="72"/>
+      <move dx="83.6595455865" dy="-18.433459197" id="73"/>
+      <move dx="-138.959923178" dy="-277.919846355" id="81"/>
+    </action>
+    <action date="08 Mar 2007 15:17:45" parent="1426" time="1427" user="hvo" what="addModule">
+      <object cache="1" id="82" name="vtkActor" x="1011.4682352" y="-530.823592472"/>
+    </action>
+    <action date="08 Mar 2007 15:17:45" parent="1427" time="1428" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="82" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="82" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="82" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 15:17:45" parent="1428" time="1429" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="82" value=""/>
+    </action>
+    <action date="08 Mar 2007 15:17:56" parent="1429" time="1430" user="hvo" what="moveModule">
+      <move dx="-337.474099146" dy="-180.080716771" id="82"/>
+    </action>
+    <action date="08 Mar 2007 15:17:56" parent="1430" time="1431" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 15:17:56" parent="1431" time="1432" user="hvo" what="deleteModule">
+      <module moduleId="82"/>
+    </action>
+    <action date="08 Mar 2007 15:18:07" parent="1432" time="1433" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOn" functionId="1" moduleId="73" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 15:18:13" parent="1433" time="1434" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="73"/>
+    </action>
+    <action date="08 Mar 2007 15:18:30" parent="1434" time="1435" user="hvo" what="moveModule">
+      <move dx="-1.41795839977" dy="0.0" id="73"/>
+    </action>
+    <action date="08 Mar 2007 15:18:30" parent="1435" time="1436" user="hvo" what="addModule">
+      <object cache="1" id="83" name="vtkActor2D" x="699.053491087" y="-706.143283086"/>
+    </action>
+    <action date="08 Mar 2007 15:18:32" parent="1436" time="1437" user="hvo" what="addConnection">
+      <connect destinationId="83" destinationModule="vtkActor2D" destinationPort="SetMapper(vtkMapper2D)" id="163" sourceId="81" sourceModule="vtkPolyDataMapper2D" sourcePort="self(vtkPolyDataMapper2D)"/>
+    </action>
+    <action date="08 Mar 2007 15:18:34" parent="1437" time="1438" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="164" sourceId="83" sourceModule="vtkActor2D" sourcePort="self(vtkActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 15:20:00" parent="1438" time="1439" user="hvo" what="addModule">
+      <object cache="1" id="84" name="vtkCoordinate" x="517.554815917" y="-365.833267141"/>
+    </action>
+    <action date="08 Mar 2007 15:20:03" parent="1439" time="1440" user="hvo" what="addConnection">
+      <connect destinationId="81" destinationModule="vtkPolyDataMapper2D" destinationPort="SetTransformCoordinate(vtkCoordinate)" id="165" sourceId="84" sourceModule="vtkCoordinate" sourcePort="self(vtkCoordinate)"/>
+    </action>
+    <action date="08 Mar 2007 15:20:07" parent="1440" time="1441" user="hvo" what="changeParameter">
+      <set alias="" function="SetCoordinateSystemToWorld" functionId="0" moduleId="84" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 19:48:59" parent="1441" time="1442" user="hvo" what="moveModule">
+      <move dx="-18.433459197" dy="-22.6873343963" id="0"/>
+      <move dx="2.83591679954" dy="-24.1052927961" id="7"/>
+      <move dx="-24.1052927961" dy="-56.7183359909" id="12"/>
+      <move dx="-5.67183359909" dy="-56.7183359909" id="74"/>
+    </action>
+    <action date="08 Mar 2007 19:49:08" parent="1442" time="1443" user="hvo" what="addModule">
+      <object cache="1" id="85" name="PythonSource" x="650.842905495" y="-207.021926367"/>
+    </action>
+    <action date="08 Mar 2007 19:49:17" parent="1443" time="1444" user="hvo" what="moveModule">
+      <move dx="-2.83591679954" dy="-69.4799615888" id="74"/>
+    </action>
+    <action date="08 Mar 2007 19:49:17" parent="1444" time="1445" user="hvo" what="addModulePort">
+      <addPort moduleId="85" portName="polydata" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 19:49:23" parent="1445" time="1446" user="hvo" what="addConnection">
+      <connect destinationId="85" destinationModule="PythonSource" destinationPort="polydata(vtkPolyData)" id="166" sourceId="78" sourceModule="vtkPolyDataAlgorithm" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 19:49:28" parent="1446" time="1447" user="hvo" what="moveModule">
+      <move dx="24.1052927961" dy="-12.7616255979" id="85"/>
+    </action>
+    <action date="08 Mar 2007 19:49:28" parent="1447" time="1448" user="hvo" what="deleteConnection">
+      <connection connectionId="150"/>
+      <connection connectionId="134"/>
+    </action>
+    <action date="08 Mar 2007 19:49:54" parent="1448" time="1449" user="hvo" what="moveModule">
+      <move dx="-66.6440447893" dy="0.0" id="74"/>
+      <move dx="154.557465575" dy="-79.4056703872" id="85"/>
+    </action>
+    <action date="08 Mar 2007 19:49:54" parent="1449" time="1450" user="hvo" what="deleteConnection">
+      <connection connectionId="166"/>
+    </action>
+    <action date="08 Mar 2007 19:49:54" parent="1450" time="1451" user="hvo" what="deleteModule">
+      <module moduleId="85"/>
+    </action>
+    <action date="08 Mar 2007 19:49:58" parent="1451" time="1452" user="hvo" what="moveModule">
+      <move dx="32.6130431948" dy="116.272588781" id="74"/>
+    </action>
+    <action date="08 Mar 2007 19:49:58" parent="1452" time="1453" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="167" sourceId="78" sourceModule="vtkRuledSurfaceFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 19:50:00" parent="1453" time="1454" user="hvo" what="deleteConnection">
+      <connection connectionId="167"/>
+    </action>
+    <action date="08 Mar 2007 19:50:04" parent="1454" time="1455" user="hvo" what="moveModule">
+      <move dx="2.83591679954" dy="29.7771263952" id="78"/>
+    </action>
+    <action date="08 Mar 2007 19:50:04" parent="1455" time="1456" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="168" sourceId="78" sourceModule="vtkRuledSurfaceFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 19:50:07" parent="1456" time="1457" user="hvo" what="addConnection">
+      <connect destinationId="74" destinationModule="vtkProbeFilter" destinationPort="SetInputConnection1(vtkAlgorithmOutput)" id="169" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 19:50:12" parent="1457" time="1458" user="hvo" what="deleteConnection">
+      <connection connectionId="164"/>
+      <connection connectionId="163"/>
+      <connection connectionId="165"/>
+      <connection connectionId="162"/>
+    </action>
+    <action date="08 Mar 2007 19:50:12" parent="1458" time="1459" user="hvo" what="deleteModule">
+      <module moduleId="83"/>
+      <module moduleId="84"/>
+      <module moduleId="81"/>
+    </action>
+    <action date="08 Mar 2007 19:50:24" parent="1459" time="1460" user="hvo" what="moveModule">
+      <move dx="-131.870131179" dy="-185.75255037" id="72"/>
+      <move dx="-109.182796782" dy="-172.990924772" id="73"/>
+    </action>
+    <action date="08 Mar 2007 19:50:24" parent="1460" time="1461" user="hvo" what="addModule">
+      <object cache="1" id="86" name="PythonSource" x="711.815116685" y="-344.563891145"/>
+    </action>
+    <action date="08 Mar 2007 19:50:31" parent="1461" time="1462" user="hvo" what="addModulePort">
+      <addPort moduleId="86" portName="polydata" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 19:50:52" parent="1462" time="1463" user="hvo" what="moveModule">
+      <move dx="-1.41795839977" dy="0.0" id="74"/>
+    </action>
+    <action date="08 Mar 2007 19:55:03" parent="1463" time="1464" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="78"/>
+      <move dx="-14.1795839977" dy="-21.2693759966" id="86"/>
+    </action>
+    <action date="08 Mar 2007 19:55:03" parent="1464" time="1465" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="86" portName="polydata" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 19:55:03" parent="1465" time="1466" user="hvo" what="addModulePort">
+      <addPort moduleId="86" portName="probed" portSpec="(vtkProbeFilter)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 19:55:08" parent="1466" time="1467" user="hvo" what="moveModule">
+      <move dx="55.3003775911" dy="-11.3436671982" id="86"/>
+    </action>
+    <action date="08 Mar 2007 19:55:08" parent="1467" time="1468" user="hvo" what="addConnection">
+      <connect destinationId="86" destinationModule="PythonSource" destinationPort="probed(vtkProbeFilter)" id="170" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="self(vtkProbeFilter)"/>
+    </action>
+    <action date="08 Mar 2007 19:55:26" parent="1468" time="1469" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="probeFilter%20%3D%20probed.vtkInstance%0Aprint%20type%28probeFilter%29"/>
+    </action>
+    <action date="08 Mar 2007 19:59:34" parent="1469" time="1470" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="probeFilter%20%3D%20probed.vtkInstance%0Aa%20%3D%20probeFilter.GetOutput%28%29"/>
+    </action>
+    <action date="08 Mar 2007 19:59:54" parent="1470" time="1471" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="74"/>
+    </action>
+    <action date="08 Mar 2007 20:06:47" parent="1471" time="1472" user="hvo" what="deleteConnection">
+      <connection connectionId="170"/>
+    </action>
+    <action date="08 Mar 2007 20:07:13" parent="1472" time="1473" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.41795839977" id="86"/>
+    </action>
+    <action date="08 Mar 2007 20:07:13" parent="1473" time="1474" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="86" portName="probed" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 20:07:13" parent="1474" time="1475" user="hvo" what="addModulePort">
+      <addPort moduleId="86" portName="probed" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 20:07:14" parent="1475" time="1476" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="dataset%20%3D%20probed.vtkInstance%0Aprint%20type%28dataset%29"/>
+    </action>
+    <action date="08 Mar 2007 20:07:16" parent="1476" time="1477" user="hvo" what="addConnection">
+      <connect destinationId="86" destinationModule="PythonSource" destinationPort="probed(vtkPolyData)" id="171" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 20:09:02" parent="1477" time="1478" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="polyData%20%3D%20probed.vtkInstance.GetPolyDataOutput%28%29%0Aprint%20polyData.GetNumberOfPoints%28%29"/>
+    </action>
+    <action date="08 Mar 2007 20:09:34" parent="1478" time="1479" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="polyData%20%3D%20probed.vtkInstance%0Aprint%20polyData.GetNumberOfPoints%28%29"/>
+    </action>
+    <action date="08 Mar 2007 20:10:16" parent="1479" time="1480" user="hvo" what="deleteConnection">
+      <connection connectionId="171"/>
+    </action>
+    <action date="08 Mar 2007 20:12:14" parent="1480" time="1481" user="hvo" what="moveModule">
+      <move dx="-1.41795839977" dy="0.0" id="74"/>
+    </action>
+    <action date="08 Mar 2007 20:12:16" parent="1481" time="1482" user="hvo" what="addConnection">
+      <connect destinationId="86" destinationModule="PythonSource" destinationPort="probed(vtkPolyData)" id="172" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 20:13:13" parent="1482" time="1483" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="polyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Afor%20i%20in%20range%28pCount%29%3A%0A%20%20%20%20print%20polyData.GetPoint%28i%29"/>
+    </action>
+    <action date="08 Mar 2007 20:13:21" parent="1483" time="1484" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="polyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Afor%20i%20in%20range%28pCount%29%3A%0A%20%20%20%20print%20i%2C%20polyData.GetPoint%28i%29"/>
+    </action>
+    <action date="08 Mar 2007 20:21:27" parent="1484" time="1485" user="hvo" what="moveModule">
+      <move dx="0.0" dy="4.25387519932" id="86"/>
+    </action>
+    <action date="08 Mar 2007 20:21:27" parent="1485" time="1486" user="hvo" what="addModulePort">
+      <addPort moduleId="86" portName="sgrid" portSpec="(vtkStructuredGrid)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 20:21:27" parent="1486" time="1487" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Afor%20i%20in%20range%28pCount%29%3A%0A%20%20%20%20print%20i%2C%20polyData.GetPoint%28i%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimension%2816%2C%20101%29%0Agrid.SetPoints%28polyData.GetPoints%28%29%29%0A%0Afrom%20core.modules.mo [...]
+    </action>
+    <action date="08 Mar 2007 20:21:43" parent="1487" time="1488" user="hvo" what="moveModule">
+      <move dx="-160.229299174" dy="12.7616255979" id="86"/>
+    </action>
+    <action date="08 Mar 2007 20:21:52" parent="1488" time="1489" user="hvo" what="deleteConnection">
+      <connection connectionId="151"/>
+    </action>
+    <action date="08 Mar 2007 20:21:56" parent="1489" time="1490" user="hvo" what="addConnection">
+      <connect destinationId="73" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="173" sourceId="86" sourceModule="PythonSource" sourcePort="sgrid(vtkStructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 20:22:12" parent="1490" time="1491" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Afor%20i%20in%20range%28pCount%29%3A%0A%20%20%20%20print%20i%2C%20polyData.GetPoint%28i%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%29%0Agrid.SetPoints%28polyData.GetPoints%28%29%29%0A%0Afrom%20core.modules.m [...]
+    </action>
+    <action date="08 Mar 2007 20:24:03" parent="1491" time="1492" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Afor%20i%20in%20range%28pCount%29%3A%0A%20%20%20%20print%20i%2C%20polyData.GetPoint%28i%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0Agrid.SetPoints%28polyData.GetPoints%28%29%29%0A%0Afrom%20core.mo [...]
+    </action>
+    <action date="08 Mar 2007 20:37:22" parent="1492" time="1493" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetData%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtk [...]
+    </action>
+    <action date="08 Mar 2007 20:38:04" parent="1493" time="1494" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20points.GetData%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPo [...]
+    </action>
+    <action date="08 Mar 2007 20:41:22" parent="1494" time="1495" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:42:21" parent="1495" time="1496" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:43:00" parent="1496" time="1497" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:43:17" parent="1497" time="1498" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0A%23data%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0A [...]
+    </action>
+    <action date="08 Mar 2007 20:43:39" parent="1498" time="1499" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0A%23data%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0A [...]
+    </action>
+    <action date="08 Mar 2007 20:44:07" parent="1499" time="1500" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0A%23points%20%3D%20polyData.GetPoints%28%29%0A%23data%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A [...]
+    </action>
+    <action date="08 Mar 2007 20:44:27" parent="1500" time="1501" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:44:39" parent="1501" time="1502" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:44:52" parent="1502" time="1503" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:45:03" parent="1503" time="1504" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:47:41" parent="1504" time="1505" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="86"/>
+    </action>
+    <action date="08 Mar 2007 20:47:49" parent="1505" time="1506" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="72"/>
+    </action>
+    <action date="08 Mar 2007 20:47:49" parent="1506" time="1507" user="hvo" what="addModule">
+      <object cache="0" id="87" name="Enhance" x="820.997913468" y="-392.774476737"/>
+    </action>
+    <action date="08 Mar 2007 20:47:50" parent="1507" time="1508" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 20:47:50" parent="1508" time="1509" user="hvo" what="deleteModule">
+      <module moduleId="87"/>
+    </action>
+    <action date="08 Mar 2007 20:48:31" parent="1509" time="1510" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:48:34" parent="1510" time="1511" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="72"/>
+    </action>
+    <action date="08 Mar 2007 20:48:34" parent="1511" time="1512" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="100"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 20:48:36" parent="1512" time="1513" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="100"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 20:48:38" parent="1513" time="1514" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 20:48:40" parent="1514" time="1515" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:48:41" parent="1515" time="1516" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:50:31" parent="1516" time="1517" user="hvo" what="addModule">
+      <object cache="0" id="88" name="vtkStructuredGridOutlineFilter" x="750.099993479" y="-516.136857517"/>
+    </action>
+    <action date="08 Mar 2007 20:50:34" parent="1517" time="1518" user="hvo" what="deleteConnection">
+      <connection connectionId="121"/>
+      <connection connectionId="154"/>
+      <connection connectionId="173"/>
+    </action>
+    <action date="08 Mar 2007 20:50:34" parent="1518" time="1519" user="hvo" what="deleteModule">
+      <module moduleId="73"/>
+    </action>
+    <action date="08 Mar 2007 20:50:46" parent="1519" time="1520" user="hvo" what="moveModule">
+      <move dx="-18.433459197" dy="24.1052927961" id="88"/>
+    </action>
+    <action date="08 Mar 2007 20:50:46" parent="1520" time="1521" user="hvo" what="addConnection">
+      <connect destinationId="88" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="174" sourceId="86" sourceModule="PythonSource" sourcePort="sgrid(vtkStructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 20:50:56" parent="1521" time="1522" user="hvo" what="addModule">
+      <object cache="0" id="89" name="vtkDataSetMapper" x="836.595455865" y="-615.393945501"/>
+    </action>
+    <action date="08 Mar 2007 20:51:00" parent="1522" time="1523" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="175" sourceId="88" sourceModule="vtkStructuredGridOutlineFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 20:51:02" parent="1523" time="1524" user="hvo" what="addConnection">
+      <connect destinationId="72" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="176" sourceId="89" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 20:51:31" parent="1524" time="1525" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:51:51" parent="1525" time="1526" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="177" sourceId="86" sourceModule="PythonSource" sourcePort="sgrid(vtkStructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 20:51:56" parent="1526" time="1527" user="hvo" what="moveModule">
+      <move dx="168.737049573" dy="32.6130431948" id="88"/>
+    </action>
+    <action date="08 Mar 2007 20:51:56" parent="1527" time="1528" user="hvo" what="deleteConnection">
+      <connection connectionId="175"/>
+    </action>
+    <action date="08 Mar 2007 20:52:16" parent="1528" time="1529" user="hvo" what="addModule">
+      <object cache="0" id="90" name="vtkProperty" x="1071.97655023" y="-572.855193508"/>
+    </action>
+    <action date="08 Mar 2007 20:52:19" parent="1529" time="1530" user="hvo" what="addConnection">
+      <connect destinationId="72" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="178" sourceId="90" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="08 Mar 2007 20:52:26" parent="1530" time="1531" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 20:52:28" parent="1531" time="1532" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 20:52:29" parent="1532" time="1533" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 20:52:29" parent="1533" time="1534" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="90" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 20:52:41" parent="1534" time="1535" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="86"/>
+    </action>
+    <action date="08 Mar 2007 20:52:47" parent="1535" time="1536" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:52:49" parent="1536" time="1537" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="10000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:54:53" parent="1537" time="1538" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="86" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 20:55:06" parent="1538" time="1539" user="hvo" what="moveModule">
+      <move dx="1.41795839977" dy="-1.41795839977" id="88"/>
+    </action>
+    <action date="08 Mar 2007 20:55:06" parent="1539" time="1540" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="179" sourceId="88" sourceModule="vtkStructuredGridOutlineFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 20:55:10" parent="1540" time="1541" user="hvo" what="deleteConnection">
+      <connection connectionId="177"/>
+    </action>
+    <action date="08 Mar 2007 20:55:41" parent="1541" time="1542" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="180" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 20:55:59" parent="1542" time="1543" user="hvo" what="deleteConnection">
+      <connection connectionId="179"/>
+    </action>
+    <action date="08 Mar 2007 20:56:58" parent="1543" time="1544" user="hvo" what="moveModule">
+      <move dx="-1.41795839977" dy="0.0" id="78"/>
+    </action>
+    <action date="08 Mar 2007 20:57:08" parent="1544" time="1545" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOn" functionId="0" moduleId="89" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 20:57:47" parent="1545" time="1546" user="hvo" what="moveModule">
+      <move dx="1.41795839977" dy="0.0" id="0"/>
+      <move dx="-1.41795839977" dy="-4.25387519932" id="7"/>
+      <move dx="1.41795839977" dy="0.0" id="76"/>
+    </action>
+    <action date="08 Mar 2007 20:57:51" parent="1546" time="1547" user="hvo" what="deleteConnection">
+      <connection connectionId="174"/>
+      <connection connectionId="172"/>
+    </action>
+    <action date="08 Mar 2007 20:57:51" parent="1547" time="1548" user="hvo" what="deleteModule">
+      <module moduleId="86"/>
+    </action>
+    <action date="08 Mar 2007 20:57:53" parent="1548" time="1549" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 20:57:53" parent="1549" time="1550" user="hvo" what="deleteModule">
+      <module moduleId="88"/>
+    </action>
+    <action date="08 Mar 2007 20:58:05" parent="1550" time="1551" user="hvo" what="deleteConnection">
+      <connection connectionId="178"/>
+    </action>
+    <action date="08 Mar 2007 20:58:05" parent="1551" time="1552" user="hvo" what="deleteModule">
+      <module moduleId="90"/>
+    </action>
+    <action date="08 Mar 2007 20:58:40" parent="1552" time="1553" user="hvo" what="moveModule">
+      <move dx="18.433459197" dy="161.647257574" id="72"/>
+      <move dx="-51.0465023918" dy="259.486387158" id="89"/>
+    </action>
+    <action date="08 Mar 2007 20:58:40" parent="1553" time="1554" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="10000"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:58:42" parent="1554" time="1555" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:58:45" parent="1555" time="1556" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 20:58:46" parent="1556" time="1557" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 20:59:06" parent="1557" time="1558" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 20:59:11" parent="1558" time="1559" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 20:59:13" parent="1559" time="1560" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 20:59:14" parent="1560" time="1561" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="10000"/>
+    </action>
+    <action date="08 Mar 2007 20:59:37" parent="1561" time="1562" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="181" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 20:59:47" parent="1562" time="1563" user="hvo" what="moveModule">
+      <move dx="-1.41795839977" dy="0.0" id="72"/>
+    </action>
+    <action date="08 Mar 2007 20:59:47" parent="1563" time="1564" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 20:59:49" parent="1564" time="1565" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 21:00:22" parent="1565" time="1566" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="37.5"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:00:23" parent="1566" time="1567" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="37.5"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:00:46" parent="1567" time="1568" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="36.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:00:52" parent="1568" time="1569" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="34.5"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.674509803922"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:00:54" parent="1569" time="1570" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="33.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.878431372549"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:00" parent="1570" time="1571" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31.5"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.372549019608"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:04" parent="1571" time="1572" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="30"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.560784313725"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:09" parent="1572" time="1573" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="28.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.749019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:13" parent="1573" time="1574" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="27"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.933333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:46" parent="1574" time="1575" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="37"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:50" parent="1575" time="1576" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35.5"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.674509803922"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:53" parent="1576" time="1577" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="35"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.878431372549"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:56" parent="1577" time="1578" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="34.5"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.372549019608"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:01:58" parent="1578" time="1579" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="34"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.560784313725"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:02:01" parent="1579" time="1580" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="33.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.749019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:02:03" parent="1580" time="1581" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="33"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.933333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:02:06" parent="1581" time="1582" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.5"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.454901960784"/>
+    </action>
+    <action date="08 Mar 2007 21:02:08" parent="1582" time="1583" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.733333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.309803921569"/>
+    </action>
+    <action date="08 Mar 2007 21:02:11" parent="1583" time="1584" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.164705882353"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.725490196078"/>
+    </action>
+    <action date="08 Mar 2007 21:02:13" parent="1584" time="1585" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.156862745098"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 21:02:17" parent="1585" time="1586" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.156862745098"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 21:02:46" parent="1586" time="1587" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-3"/>
+    </action>
+    <action date="08 Mar 2007 21:02:54" parent="1587" time="1588" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="36.5"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:03:03" parent="1588" time="1589" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="34.5"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.878431372549"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:03:05" parent="1589" time="1590" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="33.5"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.372549019608"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:03:08" parent="1590" time="1591" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="32.5"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.560784313725"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:03:13" parent="1591" time="1592" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="31.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.749019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:03:15" parent="1592" time="1593" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="29.5"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="0.933333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 21:03:24" parent="1593" time="1594" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="28.5"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.454901960784"/>
+    </action>
+    <action date="08 Mar 2007 21:03:29" parent="1594" time="1595" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="27.5"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.733333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.309803921569"/>
+    </action>
+    <action date="08 Mar 2007 21:03:32" parent="1595" time="1596" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="26.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.164705882353"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="0.725490196078"/>
+    </action>
+    <action date="08 Mar 2007 21:03:34" parent="1596" time="1597" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="25.5"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="1" type="Float" value="0.156862745098"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="2" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 21:04:17" parent="1597" time="1598" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="5000"/>
+    </action>
+    <action date="08 Mar 2007 21:04:18" parent="1598" time="1599" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="72" parameter="<no description>" parameterId="2" type="Float" value="5000"/>
+    </action>
+    <action date="08 Mar 2007 21:04:54" parent="1599" time="1600" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-1.5"/>
+    </action>
+    <action date="08 Mar 2007 21:04:56" parent="1600" time="1601" user="hvo" what="changeParameter">
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="Translate" functionId="0" moduleId="77" parameter="<no description>" parameterId="2" type="Float" value="-1.5"/>
+    </action>
+    <action date="08 Mar 2007 21:05:31" parent="1601" time="1602" user="hvo" what="addModule">
+      <object cache="0" id="91" name="PythonSource" x="602.706611104" y="-351.579391942"/>
+    </action>
+    <action date="08 Mar 2007 21:05:31" parent="1602" time="1603" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="91" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 21:05:31" parent="1603" time="1604" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="91" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:05:31" parent="1604" time="1605" user="hvo" what="addModulePort">
+      <addPort moduleId="91" portName="probed" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:05:31" parent="1605" time="1606" user="hvo" what="addModulePort">
+      <addPort moduleId="91" portName="sgrid" portSpec="(vtkStructuredGrid)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:06:02" parent="1606" time="1607" user="hvo" what="moveModule">
+      <move dx="75.1517951879" dy="-154.557465575" id="91"/>
+    </action>
+    <action date="08 Mar 2007 21:12:02" parent="1607" time="1608" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="91" portName="sgrid" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:12:03" parent="1608" time="1609" user="hvo" what="addModulePort">
+      <addPort moduleId="91" portName="sgrid" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:12:04" parent="1609" time="1610" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="91" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:13:56" parent="1610" time="1611" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="91" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:14:10" parent="1611" time="1612" user="hvo" what="moveModule">
+      <move dx="-49.628543992" dy="1.41795839977" id="91"/>
+    </action>
+    <action date="08 Mar 2007 21:14:15" parent="1612" time="1613" user="hvo" what="addModule">
+      <object cache="0" id="92" name="vtkDataSetMapper" x="795.548953474" y="-345.907558343"/>
+    </action>
+    <action date="08 Mar 2007 21:14:15" parent="1613" time="1614" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOn" functionId="0" moduleId="92" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:14:15" parent="1614" time="1615" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="92" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:14:19" parent="1615" time="1616" user="hvo" what="moveModule">
+      <move dx="-141.795839977" dy="-289.263513553" id="92"/>
+    </action>
+    <action date="08 Mar 2007 21:14:19" parent="1616" time="1617" user="hvo" what="addConnection">
+      <connect destinationId="92" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="182" sourceId="91" sourceModule="PythonSource" sourcePort="sgrid(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 21:14:21" parent="1617" time="1618" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="92"/>
+    </action>
+    <action date="08 Mar 2007 21:14:22" parent="1618" time="1619" user="hvo" what="addModule">
+      <object cache="0" id="93" name="vtkActor" x="898.031563223" y="-559.182760468"/>
+    </action>
+    <action date="08 Mar 2007 21:14:22" parent="1619" time="1620" user="hvo" what="changeParameter">
+      <set alias="" function="SetScale" functionId="0" moduleId="93" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="93" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetScale" functionId="0" moduleId="93" parameter="<no description>" parameterId="2" type="Float" value="5000"/>
+    </action>
+    <action date="08 Mar 2007 21:14:22" parent="1620" time="1621" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="93" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:14:26" parent="1621" time="1622" user="hvo" what="moveModule">
+      <move dx="-75.1517951879" dy="-181.498675171" id="93"/>
+    </action>
+    <action date="08 Mar 2007 21:14:26" parent="1622" time="1623" user="hvo" what="addConnection">
+      <connect destinationId="93" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="183" sourceId="92" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 21:14:29" parent="1623" time="1624" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.41795839977" id="92"/>
+    </action>
+    <action date="08 Mar 2007 21:14:29" parent="1624" time="1625" user="hvo" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOn" functionId="0" moduleId="92" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:14:36" parent="1625" time="1626" user="hvo" what="addConnection">
+      <connect destinationId="92" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="184" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 21:14:40" parent="1626" time="1627" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkViewport" destinationPort="AddActor2D(vtkProp)" id="185" sourceId="93" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 21:14:41" parent="1627" time="1628" user="hvo" what="deleteConnection">
+      <connection connectionId="185"/>
+    </action>
+    <action date="08 Mar 2007 21:14:44" parent="1628" time="1629" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="186" sourceId="93" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 21:15:19" parent="1629" time="1630" user="hvo" what="moveModule">
+      <move dx="-103.510963183" dy="39.7028351936" id="91"/>
+    </action>
+    <action date="08 Mar 2007 21:15:19" parent="1630" time="1631" user="hvo" what="addConnection">
+      <connect destinationId="91" destinationModule="PythonSource" destinationPort="probed(vtkPolyData)" id="187" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 21:16:26" parent="1631" time="1632" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="91" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:16:39" parent="1632" time="1633" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="91" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:17:28" parent="1633" time="1634" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="91" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:17:59" parent="1634" time="1635" user="hvo" what="deleteConnection">
+      <connection connectionId="182"/>
+    </action>
+    <action date="08 Mar 2007 21:18:00" parent="1635" time="1636" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="91" portName="sgrid" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:18:01" parent="1636" time="1637" user="hvo" what="addModulePort">
+      <addPort moduleId="91" portName="polyData" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:18:04" parent="1637" time="1638" user="hvo" what="addConnection">
+      <connect destinationId="92" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="188" sourceId="91" sourceModule="PythonSource" sourcePort="polyData(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 21:19:11" parent="1638" time="1639" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="7"/>
+    </action>
+    <action date="08 Mar 2007 21:19:11" parent="1639" time="1640" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="93"/>
+    </action>
+    <action date="08 Mar 2007 21:19:46" parent="1640" time="1641" user="hvo" what="deleteConnection">
+      <connection connectionId="183"/>
+      <connection connectionId="184"/>
+      <connection connectionId="188"/>
+      <connection connectionId="187"/>
+    </action>
+    <action date="08 Mar 2007 21:19:46" parent="1641" time="1642" user="hvo" what="deleteModule">
+      <module moduleId="92"/>
+      <module moduleId="91"/>
+    </action>
+    <action date="08 Mar 2007 21:19:47" parent="1642" time="1643" user="hvo" what="deleteConnection">
+      <connection connectionId="186"/>
+    </action>
+    <action date="08 Mar 2007 21:19:47" parent="1643" time="1644" user="hvo" what="deleteModule">
+      <module moduleId="93"/>
+    </action>
+    <action date="08 Mar 2007 21:23:20" parent="1644" time="1645" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="26"/>
+    </action>
+    <action date="08 Mar 2007 21:23:20" parent="1645" time="1646" user="hvo" what="addModule">
+      <object cache="0" id="94" name="Unzip" x="456.582604727" y="-330.384307147"/>
+    </action>
+    <action date="08 Mar 2007 21:23:31" parent="1646" time="1647" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="78"/>
+    </action>
+    <action date="08 Mar 2007 21:23:31" parent="1647" time="1648" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 21:23:31" parent="1648" time="1649" user="hvo" what="deleteModule">
+      <module moduleId="94"/>
+    </action>
+    <action date="08 Mar 2007 21:37:29" parent="1649" time="1650" user="hvo" what="addModule">
+      <object cache="0" id="95" name="PythonSource" x="534.718899117" y="-455.016063924"/>
+    </action>
+    <action date="08 Mar 2007 21:37:29" parent="1650" time="1651" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:37:29" parent="1651" time="1652" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="95" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:37:29" parent="1652" time="1653" user="hvo" what="addModulePort">
+      <addPort moduleId="95" portName="probed" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:37:29" parent="1653" time="1654" user="hvo" what="addModulePort">
+      <addPort moduleId="95" portName="polyData" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:37:44" parent="1654" time="1655" user="hvo" what="moveModule">
+      <move dx="1.41795839977" dy="-26.9412095957" id="95"/>
+    </action>
+    <action date="08 Mar 2007 21:37:44" parent="1655" time="1656" user="hvo" what="addConnection">
+      <connect destinationId="95" destinationModule="PythonSource" destinationPort="probed(vtkPolyData)" id="189" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="GetOutput(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 21:38:38" parent="1656" time="1657" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-79.4056703872" id="89"/>
+    </action>
+    <action date="08 Mar 2007 21:38:45" parent="1657" time="1658" user="hvo" what="moveModule">
+      <move dx="41.1207935934" dy="-155.975423975" id="72"/>
+      <move dx="36.8669183941" dy="-207.021926367" id="89"/>
+    </action>
+    <action date="08 Mar 2007 21:38:45" parent="1658" time="1659" user="hvo" what="deleteConnection">
+      <connection connectionId="180"/>
+    </action>
+    <action date="08 Mar 2007 21:38:47" parent="1659" time="1660" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="190" sourceId="95" sourceModule="PythonSource" sourcePort="polyData(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 21:39:13" parent="1660" time="1661" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:47:35" parent="1661" time="1662" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoints%20%3D%20vtk.vtkPoints%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 21:48:28" parent="1662" time="1663" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Aprint%20points.GetNumberOfPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016% [...]
+    </action>
+    <action date="08 Mar 2007 21:49:05" parent="1663" time="1664" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0Aprint%20polyData.__classname__%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 21:49:18" parent="1664" time="1665" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0ApolyData%20%3D%20probed.vtkInstance%0Aprint%20polyData.classname%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0AnewPoin [...]
+    </action>
+    <action date="08 Mar 2007 21:49:29" parent="1665" time="1666" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="74"/>
+    </action>
+    <action date="08 Mar 2007 21:49:37" parent="1666" time="1667" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="74"/>
+    </action>
+    <action date="08 Mar 2007 21:51:57" parent="1667" time="1668" user="hvo" what="moveModule">
+      <move dx="188.58846717" dy="-2.83591679954" id="95"/>
+    </action>
+    <action date="08 Mar 2007 21:51:57" parent="1668" time="1669" user="hvo" what="deleteConnection">
+      <connection connectionId="189"/>
+    </action>
+    <action date="08 Mar 2007 21:51:58" parent="1669" time="1670" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="95" portName="probed" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:51:58" parent="1670" time="1671" user="hvo" what="addModulePort">
+      <addPort moduleId="95" portName="probed" portSpec="(vtkProbeFilter)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:51:59" parent="1671" time="1672" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0Aprint%20polyData.classname%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29. [...]
+    </action>
+    <action date="08 Mar 2007 21:52:05" parent="1672" time="1673" user="hvo" what="addConnection">
+      <connect destinationId="95" destinationModule="PythonSource" destinationPort="probed(vtkProbeFilter)" id="191" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="self(vtkProbeFilter)"/>
+    </action>
+    <action date="08 Mar 2007 21:52:29" parent="1673" time="1674" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 21:53:49" parent="1674" time="1675" user="hvo" what="addModule">
+      <object cache="0" id="96" name="PythonSource" x="602.706611104" y="-351.579391942"/>
+    </action>
+    <action date="08 Mar 2007 21:53:49" parent="1675" time="1676" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="96" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0ApolyData%20%3D%20probed.vtkInstance%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%2816%2C%20101%2C%201%29%0A%0AcolCount%20%3D%20101%0ArowCount%20%3D%2016%0A%0Anew [...]
+    </action>
+    <action date="08 Mar 2007 21:53:49" parent="1676" time="1677" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="96" value=""/>
+    </action>
+    <action date="08 Mar 2007 21:53:49" parent="1677" time="1678" user="hvo" what="addModulePort">
+      <addPort moduleId="96" portName="probed" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:53:49" parent="1678" time="1679" user="hvo" what="addModulePort">
+      <addPort moduleId="96" portName="sgrid" portSpec="(vtkStructuredGrid)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 21:54:13" parent="1679" time="1680" user="hvo" what="moveModule">
+      <move dx="171.572966372" dy="87.9134207858" id="95"/>
+      <move dx="62.39016959" dy="-60.9722111902" id="96"/>
+    </action>
+    <action date="08 Mar 2007 21:54:13" parent="1680" time="1681" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="96" portName="probed" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:54:13" parent="1681" time="1682" user="hvo" what="addModulePort">
+      <addPort moduleId="96" portName="probed" portSpec="(vtkProbeFilter)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 21:54:14" parent="1682" time="1683" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="96" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%281 [...]
+    </action>
+    <action date="08 Mar 2007 21:54:19" parent="1683" time="1684" user="hvo" what="addConnection">
+      <connect destinationId="96" destinationModule="PythonSource" destinationPort="probed(vtkProbeFilter)" id="192" sourceId="74" sourceModule="vtkProbeFilter" sourcePort="self(vtkProbeFilter)"/>
+    </action>
+    <action date="08 Mar 2007 21:54:22" parent="1684" time="1685" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="193" sourceId="96" sourceModule="PythonSource" sourcePort="sgrid(vtkStructuredGrid)"/>
+    </action>
+    <action date="08 Mar 2007 21:54:24" parent="1685" time="1686" user="hvo" what="deleteConnection">
+      <connection connectionId="190"/>
+    </action>
+    <action date="08 Mar 2007 21:55:40" parent="1686" time="1687" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="96" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0Agrid%20%3D%20vtk.vtkStructuredGrid%28%29%0Agrid.SetDimensions%281 [...]
+    </action>
+    <action date="08 Mar 2007 21:55:55" parent="1687" time="1688" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.41795839977" id="96"/>
+    </action>
+    <action date="08 Mar 2007 21:56:13" parent="1688" time="1689" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 21:56:18" parent="1689" time="1690" user="hvo" what="addConnection">
+      <connect destinationId="89" destinationModule="vtkDataSetMapper" destinationPort="SetInput(vtkDataSet)" id="194" sourceId="95" sourceModule="PythonSource" sourcePort="polyData(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 21:56:20" parent="1690" time="1691" user="hvo" what="deleteConnection">
+      <connection connectionId="193"/>
+      <connection connectionId="192"/>
+    </action>
+    <action date="08 Mar 2007 21:56:20" parent="1691" time="1692" user="hvo" what="deleteModule">
+      <module moduleId="96"/>
+    </action>
+    <action date="08 Mar 2007 21:56:59" parent="1692" time="1693" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 21:57:57" parent="1693" time="1694" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 21:58:18" parent="1694" time="1695" user="hvo" what="moveModule">
+      <move dx="-358.743475142" dy="35.4489599943" id="95"/>
+    </action>
+    <action date="08 Mar 2007 22:03:27" parent="1695" time="1696" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 22:03:35" parent="1696" time="1697" user="hvo" what="addModule">
+      <object cache="0" id="97" name="vtkPolyDataMapper2D" x="636.663321498" y="-492.031564721"/>
+    </action>
+    <action date="08 Mar 2007 22:03:38" parent="1697" time="1698" user="hvo" what="moveModule">
+      <move dx="1.41795839977" dy="-24.1052927961" id="97"/>
+    </action>
+    <action date="08 Mar 2007 22:03:38" parent="1698" time="1699" user="hvo" what="deleteConnection">
+      <connection connectionId="194"/>
+    </action>
+    <action date="08 Mar 2007 22:03:40" parent="1699" time="1700" user="hvo" what="addConnection">
+      <connect destinationId="97" destinationModule="vtkPolyDataMapper2D" destinationPort="SetInput(vtkPolyData)" id="195" sourceId="95" sourceModule="PythonSource" sourcePort="polyData(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 22:03:56" parent="1700" time="1701" user="hvo" what="moveModule">
+      <move dx="1.41795839977" dy="0.0" id="97"/>
+    </action>
+    <action date="08 Mar 2007 22:03:56" parent="1701" time="1702" user="hvo" what="addModule">
+      <object cache="0" id="98" name="vtkActor2D" x="616.811903901" y="-650.842905495"/>
+    </action>
+    <action date="08 Mar 2007 22:03:58" parent="1702" time="1703" user="hvo" what="addConnection">
+      <connect destinationId="98" destinationModule="vtkActor2D" destinationPort="SetMapper(vtkMapper2D)" id="196" sourceId="97" sourceModule="vtkPolyDataMapper2D" sourcePort="self(vtkPolyDataMapper2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:04:07" parent="1703" time="1704" user="hvo" what="addConnection">
+      <connect destinationId="97" destinationModule="vtkPolyDataMapper2D" destinationPort="SetLookupTable(vtkScalarsToColors)" id="197" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 22:04:08" parent="1704" time="1705" user="hvo" what="deleteConnection">
+      <connection connectionId="181"/>
+    </action>
+    <action date="08 Mar 2007 22:04:09" parent="1705" time="1706" user="hvo" what="deleteConnection">
+      <connection connectionId="130"/>
+      <connection connectionId="176"/>
+    </action>
+    <action date="08 Mar 2007 22:04:09" parent="1706" time="1707" user="hvo" what="deleteModule">
+      <module moduleId="72"/>
+      <module moduleId="89"/>
+    </action>
+    <action date="08 Mar 2007 22:04:13" parent="1707" time="1708" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="198" sourceId="98" sourceModule="vtkActor2D" sourcePort="self(vtkActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:04:20" parent="1708" time="1709" user="hvo" what="addModule">
+      <object cache="0" id="99" name="vtkCoordinate" x="952.868044647" y="-564.347443109"/>
+    </action>
+    <action date="08 Mar 2007 22:04:39" parent="1709" time="1710" user="hvo" what="moveModule">
+      <move dx="266.576179157" dy="-63.8081279897" id="98"/>
+    </action>
+    <action date="08 Mar 2007 22:04:44" parent="1710" time="1711" user="hvo" what="moveModule">
+      <move dx="31.195084795" dy="-7.08979199886" id="97"/>
+      <move dx="-95.0032127847" dy="150.303590376" id="99"/>
+    </action>
+    <action date="08 Mar 2007 22:04:44" parent="1711" time="1712" user="hvo" what="addConnection">
+      <connect destinationId="97" destinationModule="vtkPolyDataMapper2D" destinationPort="SetTransformCoordinate(vtkCoordinate)" id="199" sourceId="99" sourceModule="vtkCoordinate" sourcePort="self(vtkCoordinate)"/>
+    </action>
+    <action date="08 Mar 2007 22:04:51" parent="1712" time="1713" user="hvo" what="moveModule">
+      <move dx="-25.5232511959" dy="11.3436671982" id="97"/>
+      <move dx="59.5542527904" dy="29.7771263952" id="99"/>
+    </action>
+    <action date="08 Mar 2007 22:05:11" parent="1713" time="1714" user="hvo" what="changeParameter">
+      <set alias="" function="SetCoordinateSystemToViewport" functionId="0" moduleId="99" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:05:30" parent="1714" time="1715" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="99"/>
+    </action>
+    <action date="08 Mar 2007 22:05:33" parent="1715" time="1716" user="hvo" what="changeParameter">
+      <set alias="" function="SetCoordinateSystemToNormalizedViewport" functionId="0" moduleId="99" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:06:11" parent="1716" time="1717" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 22:07:47" parent="1717" time="1718" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 22:09:03" parent="1718" time="1719" user="hvo" what="deleteConnection">
+      <connection connectionId="28"/>
+    </action>
+    <action date="08 Mar 2007 22:09:03" parent="1719" time="1720" user="hvo" what="deleteModule">
+      <module moduleId="27"/>
+    </action>
+    <action date="08 Mar 2007 22:32:06" parent="1720" time="1721" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.83771533976" id="95"/>
+    </action>
+    <action date="08 Mar 2007 22:32:06" parent="1721" time="1722" user="hvo" what="addModule">
+      <object cache="0" id="100" name="PythonSource" x="547.554815917" y="-351.430809539"/>
+    </action>
+    <action date="08 Mar 2007 22:32:07" parent="1722" time="1723" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCou [...]
+    </action>
+    <action date="08 Mar 2007 22:32:07" parent="1723" time="1724" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="100" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:32:07" parent="1724" time="1725" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="probed" portSpec="(vtkProbeFilter)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:32:07" parent="1725" time="1726" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="polyData" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 22:36:33" parent="1726" time="1727" user="hvo" what="moveModule">
+      <move dx="442.683593003" dy="-198.640073783" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:36:33" parent="1727" time="1728" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="probed" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:36:34" parent="1728" time="1729" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="polyData" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 22:36:34" parent="1729" time="1730" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="axisActor" portSpec="(vtkAxisActor2D)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 22:36:35" parent="1730" time="1731" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 22:36:38" parent="1731" time="1732" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="200" sourceId="100" sourceModule="PythonSource" sourcePort="axisActor(vtkAxisActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:37:34" parent="1732" time="1733" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.7%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.7%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29 [...]
+    </action>
+    <action date="08 Mar 2007 22:37:51" parent="1733" time="1734" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 22:40:36" parent="1734" time="1735" user="hvo" what="moveModule">
+      <move dx="1.32745454942" dy="0.0" id="0"/>
+      <move dx="-43.806000131" dy="51.7707274275" id="7"/>
+      <move dx="-13.2745454942" dy="27.8765455379" id="12"/>
+      <move dx="31.8589091862" dy="-45.1334546804" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:40:36" parent="1735" time="1736" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="LabelTextProperty" portSpec="(vtkTextProperty)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:40:37" parent="1736" time="1737" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="TitleTextProperty" portSpec="(vtkTextProperty)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:40:38" parent="1737" time="1738" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="Title" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:40:38" parent="1738" time="1739" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 22:41:26" parent="1739" time="1740" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 22:41:56" parent="1740" time="1741" user="hvo" what="moveModule">
+      <move dx="-33.1863637356" dy="-1.32745454942" id="99"/>
+      <move dx="35.8412728344" dy="23.8941818896" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:41:56" parent="1741" time="1742" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="LabelTextProperty(vtkTextProperty)" id="201" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 22:42:01" parent="1742" time="1743" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="TitleTextProperty(vtkTextProperty)" id="202" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 22:42:07" parent="1743" time="1744" user="hvo" what="changeParameter">
+      <set alias="" function="Title" functionId="1" moduleId="100" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:42:21" parent="1744" time="1745" user="hvo" what="changeParameter">
+      <set alias="" function="Title" functionId="1" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="First Transect"/>
+    </action>
+    <action date="08 Mar 2007 22:42:24" parent="1745" time="1746" user="hvo" what="changeParameter">
+      <set alias="" function="Title" functionId="1" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="First Transect"/>
+    </action>
+    <action date="08 Mar 2007 22:42:50" parent="1746" time="1747" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 22:44:14" parent="1747" time="1748" user="hvo" what="changeParameter">
+      <set alias="" function="SetHeight" functionId="1" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="0.5"/>
+    </action>
+    <action date="08 Mar 2007 22:44:16" parent="1748" time="1749" user="hvo" what="changeParameter">
+      <set alias="" function="SetHeight" functionId="1" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="0.5"/>
+    </action>
+    <action date="08 Mar 2007 22:44:43" parent="1749" time="1750" user="hvo" what="moveModule">
+      <move dx="-22.5667273402" dy="-37.1687273839" id="7"/>
+      <move dx="0.0" dy="-2.65490909885" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:45:25" parent="1750" time="1751" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="Propety" portSpec="(vtkProperty2D)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:45:26" parent="1751" time="1752" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20vtk.vtkAxisActor2D%28%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 22:45:56" parent="1752" time="1753" user="hvo" what="addModule">
+      <object cache="0" id="101" name="vtkProperty2D" x="951.784911937" y="-488.503274188"/>
+    </action>
+    <action date="08 Mar 2007 22:45:59" parent="1753" time="1754" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="Propety(vtkProperty2D)" id="203" sourceId="101" sourceModule="vtkProperty2D" sourcePort="self(vtkProperty2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:46:08" parent="1754" time="1755" user="hvo" what="moveModule">
+      <move dx="82.3021820643" dy="76.9923638666" id="7"/>
+      <move dx="116.816000349" dy="139.382727689" id="101"/>
+    </action>
+    <action date="08 Mar 2007 22:46:08" parent="1755" time="1756" user="hvo" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 22:46:11" parent="1756" time="1757" user="hvo" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:46:11" parent="1757" time="1758" user="hvo" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:46:12" parent="1758" time="1759" user="hvo" what="changeParameter">
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetColor" functionId="0" moduleId="101" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 22:46:44" parent="1759" time="1760" user="hvo" what="changeParameter">
+      <set alias="" function="SetLineWidth" functionId="1" moduleId="101" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 22:46:57" parent="1760" time="1761" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="101"/>
+    </action>
+    <action date="08 Mar 2007 22:47:26" parent="1761" time="1762" user="hvo" what="deleteConnection">
+      <connection connectionId="203"/>
+    </action>
+    <action date="08 Mar 2007 22:47:26" parent="1762" time="1763" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="Propety" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:47:27" parent="1763" time="1764" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="Property" portSpec="(vtkProperty2D)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:47:30" parent="1764" time="1765" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="Property(vtkProperty2D)" id="204" sourceId="101" sourceModule="vtkProperty2D" sourcePort="self(vtkProperty2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:48:59" parent="1765" time="1766" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.32745454942" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:49:10" parent="1766" time="1767" user="hvo" what="moveModule">
+      <move dx="25.221636439" dy="92.9218184596" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:49:10" parent="1767" time="1768" user="hvo" what="addModule">
+      <object cache="0" id="102" name="vtkAxisActor2D" x="992.936002969" y="-553.54854711"/>
+    </action>
+    <action date="08 Mar 2007 22:50:45" parent="1768" time="1769" user="hvo" what="moveModule">
+      <move dx="-111.506182152" dy="2.65490909885" id="102"/>
+    </action>
+    <action date="08 Mar 2007 22:50:45" parent="1769" time="1770" user="hvo" what="addConnection">
+      <connect destinationId="102" destinationModule="vtkActor2D" destinationPort="SetProperty(vtkProperty2D)" id="205" sourceId="101" sourceModule="vtkProperty2D" sourcePort="self(vtkProperty2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:50:50" parent="1770" time="1771" user="hvo" what="moveModule">
+      <move dx="110.178727602" dy="-55.7530910758" id="100"/>
+      <move dx="118.143454899" dy="21.2392727908" id="102"/>
+    </action>
+    <action date="08 Mar 2007 22:50:50" parent="1771" time="1772" user="hvo" what="deleteConnection">
+      <connection connectionId="204"/>
+    </action>
+    <action date="08 Mar 2007 22:50:55" parent="1772" time="1773" user="hvo" what="addConnection">
+      <connect destinationId="102" destinationModule="vtkAxisActor2D" destinationPort="SetTitleTextProperty(vtkTextProperty)" id="206" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 22:50:59" parent="1773" time="1774" user="hvo" what="addConnection">
+      <connect destinationId="102" destinationModule="vtkAxisActor2D" destinationPort="SetLabelTextProperty(vtkTextProperty)" id="207" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 22:51:07" parent="1774" time="1775" user="hvo" what="deleteConnection">
+      <connection connectionId="201"/>
+      <connection connectionId="202"/>
+    </action>
+    <action date="08 Mar 2007 22:52:17" parent="1775" time="1776" user="hvo" what="moveModule">
+      <move dx="-175.224000524" dy="-80.9747275148" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:52:17" parent="1776" time="1777" user="hvo" what="deleteConnection">
+      <connection connectionId="200"/>
+    </action>
+    <action date="08 Mar 2007 22:52:17" parent="1777" time="1778" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="LabelTextProperty" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:52:18" parent="1778" time="1779" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="Property" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:52:18" parent="1779" time="1780" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="Title" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:52:19" parent="1780" time="1781" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="TitleTextProperty" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:52:19" parent="1781" time="1782" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="axisActor" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 22:52:20" parent="1782" time="1783" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="AxisActor" portSpec="(vtkAxisActor2D)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 22:52:20" parent="1783" time="1784" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="OutputActor" portSpec="(vtkAxisActor2D)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 22:52:21" parent="1784" time="1785" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20AxisActor.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29% [...]
+    </action>
+    <action date="08 Mar 2007 22:52:25" parent="1785" time="1786" user="hvo" what="moveModule">
+      <move dx="1.32745454942" dy="0.0" id="100"/>
+    </action>
+    <action date="08 Mar 2007 22:52:25" parent="1786" time="1787" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="100"/>
+    </action>
+    <action date="08 Mar 2007 22:52:30" parent="1787" time="1788" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="AxisActor(vtkAxisActor2D)" id="208" sourceId="102" sourceModule="vtkAxisActor2D" sourcePort="self(vtkAxisActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:52:33" parent="1788" time="1789" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="209" sourceId="100" sourceModule="PythonSource" sourcePort="OutputActor(vtkAxisActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 22:53:07" parent="1789" time="1790" user="hvo" what="moveModule">
+      <move dx="104.868909404" dy="31.8589091862" id="100"/>
+      <move dx="226.994727951" dy="45.1334546804" id="102"/>
+    </action>
+    <action date="08 Mar 2007 22:53:07" parent="1790" time="1791" user="hvo" what="changeParameter">
+      <set alias="" function="SetTickOffset" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="08 Mar 2007 22:53:15" parent="1791" time="1792" user="hvo" what="changeParameter">
+      <set alias="" function="SetTickOffset" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="0.1"/>
+    </action>
+    <action date="08 Mar 2007 22:53:17" parent="1792" time="1793" user="hvo" what="changeParameter">
+      <set alias="" function="SetTickOffset" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="0.1"/>
+    </action>
+    <action date="08 Mar 2007 22:53:31" parent="1793" time="1794" user="hvo" what="changeParameter">
+      <set alias="" function="SetTickOffset" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 22:53:32" parent="1794" time="1795" user="hvo" what="changeParameter">
+      <set alias="" function="SetTickOffset" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 22:54:08" parent="1795" time="1796" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 22:54:50" parent="1796" time="1797" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 22:55:09" parent="1797" time="1798" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinorTickLength" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="08 Mar 2007 22:55:15" parent="1798" time="1799" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinorTickLength" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="08 Mar 2007 22:55:16" parent="1799" time="1800" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinorTickLength" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+    </action>
+    <action date="08 Mar 2007 22:55:33" parent="1800" time="1801" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 22:55:48" parent="1801" time="1802" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:56:05" parent="1802" time="1803" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="Distance"/>
+    </action>
+    <action date="08 Mar 2007 22:56:09" parent="1803" time="1804" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="Distance"/>
+    </action>
+    <action date="08 Mar 2007 22:56:11" parent="1804" time="1805" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFactor" functionId="1" moduleId="102" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 22:56:48" parent="1805" time="1806" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 22:56:53" parent="1806" time="1807" user="hvo" what="changeParameter">
+      <set alias="" function="AdjustLabelsOn" functionId="1" moduleId="102" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 22:57:16" parent="1807" time="1808" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 23:02:55" parent="1808" time="1809" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="length" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:02:56" parent="1809" time="1810" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20 [...]
+    </action>
+    <action date="08 Mar 2007 23:03:32" parent="1810" time="1811" user="hvo" what="moveModule">
+      <move dx="-13.2745454942" dy="-6.63727274712" id="100"/>
+    </action>
+    <action date="08 Mar 2007 23:03:32" parent="1811" time="1812" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="length" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:03:34" parent="1812" time="1813" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20AxisActor.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29% [...]
+    </action>
+    <action date="08 Mar 2007 23:03:39" parent="1813" time="1814" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 23:04:28" parent="1814" time="1815" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:04:32" parent="1815" time="1816" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="Distance"/>
+    </action>
+    <action date="08 Mar 2007 23:04:36" parent="1816" time="1817" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="Distance"/>
+    </action>
+    <action date="08 Mar 2007 23:04:40" parent="1817" time="1818" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="length(Float)" id="210" sourceId="69" sourceModule="PythonSource" sourcePort="length(Float)"/>
+    </action>
+    <action date="08 Mar 2007 23:05:23" parent="1818" time="1819" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20 [...]
+    </action>
+    <action date="08 Mar 2007 23:06:08" parent="1819" time="1820" user="hvo" what="changeParameter">
+      <set alias="" function="AdjustLabelsOn" functionId="1" moduleId="102" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:06:23" parent="1820" time="1821" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfLabels" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="08 Mar 2007 23:06:25" parent="1821" time="1822" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfLabels" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="4"/>
+    </action>
+    <action date="08 Mar 2007 23:06:48" parent="1822" time="1823" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfLabels" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="3"/>
+    </action>
+    <action date="08 Mar 2007 23:06:51" parent="1823" time="1824" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfLabels" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Integer" value="3"/>
+    </action>
+    <action date="08 Mar 2007 23:07:00" parent="1824" time="1825" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 23:07:27" parent="1825" time="1826" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFactor" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:07:31" parent="1826" time="1827" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFactor" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 23:07:34" parent="1827" time="1828" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFactor" functionId="2" moduleId="102" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 23:10:04" parent="1828" time="1829" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="Distance (m)"/>
+    </action>
+    <action date="08 Mar 2007 23:11:20" parent="1829" time="1830" user="hvo" what="moveModule">
+      <move dx="-179.206364172" dy="10.6196363954" id="100"/>
+      <move dx="-201.773091512" dy="29.2040000873" id="102"/>
+    </action>
+    <action date="08 Mar 2007 23:11:20" parent="1830" time="1831" user="hvo" what="deleteConnection">
+      <connection connectionId="208"/>
+    </action>
+    <action date="08 Mar 2007 23:11:46" parent="1831" time="1832" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.32745454942" id="100"/>
+    </action>
+    <action date="08 Mar 2007 23:11:46" parent="1832" time="1833" user="hvo" what="deleteConnection">
+      <connection connectionId="209"/>
+    </action>
+    <action date="08 Mar 2007 23:11:47" parent="1833" time="1834" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="AxisActor" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:11:48" parent="1834" time="1835" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="OutputActor" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:11:48" parent="1835" time="1836" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="Actor2D" portSpec="(vtkActor2D)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:11:48" parent="1836" time="1837" user="hvo" what="addModulePort">
+      <addPort moduleId="100" portName="OutputActor" portSpec="(vtkActor2D)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:11:49" parent="1837" time="1838" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0A [...]
+    </action>
+    <action date="08 Mar 2007 23:11:52" parent="1838" time="1839" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="Actor2D(vtkActor2D)" id="211" sourceId="102" sourceModule="vtkAxisActor2D" sourcePort="self(vtkAxisActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:12:08" parent="1839" time="1840" user="hvo" what="moveModule">
+      <move dx="62.3903638229" dy="-18.5843636919" id="100"/>
+    </action>
+    <action date="08 Mar 2007 23:12:08" parent="1840" time="1841" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="212" sourceId="100" sourceModule="PythonSource" sourcePort="OutputActor(vtkActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:12:21" parent="1841" time="1842" user="hvo" what="moveModule">
+      <move dx="135.400364041" dy="13.2745454942" id="102"/>
+    </action>
+    <action date="08 Mar 2007 23:12:21" parent="1842" time="1843" user="hvo" what="addModule">
+      <object cache="0" id="103" name="vtkCubeAxesActor2D" x="911.961275454" y="-465.936546848"/>
+    </action>
+    <action date="08 Mar 2007 23:12:24" parent="1843" time="1844" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="Actor2D(vtkActor2D)" id="213" sourceId="103" sourceModule="vtkCubeAxesActor2D" sourcePort="self(vtkCubeAxesActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:12:28" parent="1844" time="1845" user="hvo" what="addModule">
+      <object cache="0" id="104" name="PythonSource" x="1004.22077257" y="-593.169065299"/>
+    </action>
+    <action date="08 Mar 2007 23:12:28" parent="1845" time="1846" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="104" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0A [...]
+    </action>
+    <action date="08 Mar 2007 23:12:28" parent="1846" time="1847" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="104" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:12:28" parent="1847" time="1848" user="hvo" what="addModulePort">
+      <addPort moduleId="104" portName="length" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:12:28" parent="1848" time="1849" user="hvo" what="addModulePort">
+      <addPort moduleId="104" portName="Actor2D" portSpec="(vtkActor2D)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:12:28" parent="1849" time="1850" user="hvo" what="addModulePort">
+      <addPort moduleId="104" portName="OutputActor" portSpec="(vtkActor2D)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:12:34" parent="1850" time="1851" user="hvo" what="moveModule">
+      <move dx="376.997092036" dy="136.727818591" id="104"/>
+    </action>
+    <action date="08 Mar 2007 23:12:37" parent="1851" time="1852" user="hvo" what="moveModule">
+      <move dx="-26.5490909885" dy="-55.7530910758" id="104"/>
+    </action>
+    <action date="08 Mar 2007 23:12:37" parent="1852" time="1853" user="hvo" what="deleteConnection">
+      <connection connectionId="211"/>
+    </action>
+    <action date="08 Mar 2007 23:12:42" parent="1853" time="1854" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.65490909885" id="100"/>
+      <move dx="-157.967091381" dy="-43.806000131" id="104"/>
+    </action>
+    <action date="08 Mar 2007 23:12:42" parent="1854" time="1855" user="hvo" what="addConnection">
+      <connect destinationId="104" destinationModule="PythonSource" destinationPort="Actor2D(vtkActor2D)" id="214" sourceId="102" sourceModule="vtkAxisActor2D" sourcePort="self(vtkAxisActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:12:45" parent="1855" time="1856" user="hvo" what="addConnection">
+      <connect destinationId="104" destinationModule="PythonSource" destinationPort="length(Float)" id="215" sourceId="69" sourceModule="PythonSource" sourcePort="length(Float)"/>
+    </action>
+    <action date="08 Mar 2007 23:14:48" parent="1856" time="1857" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetRanges%280%2C%20length%2C%205%2C%200%2C%200%2C%200%29%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.95%29%0Aactor.GetPosition2 [...]
+    </action>
+    <action date="08 Mar 2007 23:15:35" parent="1857" time="1858" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetRanges%280%2C%20length%2C%205%2C%200%2C%200%2C%200%29%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosi [...]
+    </action>
+    <action date="08 Mar 2007 23:16:29" parent="1858" time="1859" user="hvo" what="moveModule">
+      <move dx="25.221636439" dy="-18.5843636919" id="103"/>
+    </action>
+    <action date="08 Mar 2007 23:16:29" parent="1859" time="1860" user="hvo" what="changeParameter">
+      <set alias="" function="SetXLabel" functionId="0" moduleId="103" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:16:32" parent="1860" time="1861" user="hvo" what="changeParameter">
+      <set alias="" function="SetXLabel" functionId="0" moduleId="103" parameter="<no description>" parameterId="0" type="String" value="What"/>
+    </action>
+    <action date="08 Mar 2007 23:16:33" parent="1861" time="1862" user="hvo" what="changeParameter">
+      <set alias="" function="SetXLabel" functionId="0" moduleId="103" parameter="<no description>" parameterId="0" type="String" value="What"/>
+    </action>
+    <action date="08 Mar 2007 23:17:23" parent="1862" time="1863" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetRanges%280.25%2C%200.9%2C%200.65%2C%200.95%2C%200%2C%200%29%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.G [...]
+    </action>
+    <action date="08 Mar 2007 23:18:50" parent="1863" time="1864" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.32745454942" id="103"/>
+    </action>
+    <action date="08 Mar 2007 23:18:50" parent="1864" time="1865" user="hvo" what="deleteConnection">
+      <connection connectionId="213"/>
+    </action>
+    <action date="08 Mar 2007 23:18:50" parent="1865" time="1866" user="hvo" what="deleteModule">
+      <module moduleId="103"/>
+    </action>
+    <action date="08 Mar 2007 23:18:55" parent="1866" time="1867" user="hvo" what="addModule">
+      <object cache="0" id="105" name="vtkLegendBoxActor" x="958.422184684" y="-461.954183199"/>
+    </action>
+    <action date="08 Mar 2007 23:18:57" parent="1867" time="1868" user="hvo" what="addConnection">
+      <connect destinationId="100" destinationModule="PythonSource" destinationPort="Actor2D(vtkActor2D)" id="216" sourceId="105" sourceModule="vtkLegendBoxActor" sourcePort="self(vtkLegendBoxActor)"/>
+    </action>
+    <action date="08 Mar 2007 23:19:05" parent="1868" time="1869" user="hvo" what="changeParameter">
+      <set alias="" function="BorderOn" functionId="0" moduleId="105" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:19:39" parent="1869" time="1870" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 23:20:47" parent="1870" time="1871" user="hvo" what="moveModule">
+      <move dx="-1.32745454942" dy="-1.32745454942" id="104"/>
+      <move dx="-35.8412728344" dy="-2.65490909885" id="105"/>
+    </action>
+    <action date="08 Mar 2007 23:21:33" parent="1871" time="1872" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.3%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:21:45" parent="1872" time="1873" user="hvo" what="moveModule">
+      <move dx="63.7178183723" dy="-27.8765455379" id="105"/>
+    </action>
+    <action date="08 Mar 2007 23:21:45" parent="1873" time="1874" user="hvo" what="addConnection">
+      <connect destinationId="105" destinationModule="vtkActor2D" destinationPort="SetProperty(vtkProperty2D)" id="217" sourceId="101" sourceModule="vtkProperty2D" sourcePort="self(vtkProperty2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:22:05" parent="1874" time="1875" user="hvo" what="moveModule">
+      <move dx="-7.96472729654" dy="5.30981819769" id="12"/>
+    </action>
+    <action date="08 Mar 2007 23:22:05" parent="1875" time="1876" user="hvo" what="addConnection">
+      <connect destinationId="105" destinationModule="vtkLegendBoxActor" destinationPort="SetEntryTextProperty(vtkTextProperty)" id="218" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 23:22:58" parent="1876" time="1877" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.3%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:23:17" parent="1877" time="1878" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 23:23:34" parent="1878" time="1879" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.7%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:23:49" parent="1879" time="1880" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28% [...]
+    </action>
+    <action date="08 Mar 2007 23:24:34" parent="1880" time="1881" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 23:24:49" parent="1881" time="1882" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="219" sourceId="104" sourceModule="PythonSource" sourcePort="OutputActor(vtkActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:25:37" parent="1882" time="1883" user="hvo" what="changeParameter">
+      <set alias="" function="BoxOn" functionId="1" moduleId="105" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:25:49" parent="1883" time="1884" user="hvo" what="deleteFunction">
+      <function functionId="1" moduleId="105"/>
+    </action>
+    <action date="08 Mar 2007 23:37:42" parent="1884" time="1885" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetNumberOfEntries%281%29%0Aactor.SetEntryString%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:38:09" parent="1885" time="1886" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.7%2C%200.75%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetNumberOfEntries%281%29%0Aactor.SetEntryString%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:38:57" parent="1886" time="1887" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.65%2C%200.3%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetNumberOfEntries%281%29%0Aactor.SetEntryString%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:40:42" parent="1887" time="1888" user="hvo" what="moveModule">
+      <move dx="-92.9218184596" dy="50.4432728781" id="101"/>
+      <move dx="-18.5843636919" dy="2.65490909885" id="102"/>
+      <move dx="2.65490909885" dy="25.221636439" id="104"/>
+    </action>
+    <action date="08 Mar 2007 23:40:42" parent="1888" time="1889" user="hvo" what="addModule">
+      <object cache="0" id="106" name="vtkAxisActor2D" x="1170.1952762" y="-432.042364958"/>
+    </action>
+    <action date="08 Mar 2007 23:40:43" parent="1889" time="1890" user="hvo" what="addModule">
+      <object cache="0" id="107" name="PythonSource" x="1205.37422769" y="-547.327792464"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1890" time="1891" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="106" parameter="<no description>" parameterId="0" type="String" value="Distance (m)"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1891" time="1892" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfLabels" functionId="1" moduleId="106" parameter="<no description>" parameterId="0" type="Integer" value="3"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1892" time="1893" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFactor" functionId="2" moduleId="106" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1893" time="1894" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="106" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1894" time="1895" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="107" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0A [...]
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1895" time="1896" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="107" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1896" time="1897" user="hvo" what="addModulePort">
+      <addPort moduleId="107" portName="length" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1897" time="1898" user="hvo" what="addModulePort">
+      <addPort moduleId="107" portName="Actor2D" portSpec="(vtkActor2D)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1898" time="1899" user="hvo" what="addModulePort">
+      <addPort moduleId="107" portName="OutputActor" portSpec="(vtkActor2D)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:40:44" parent="1899" time="1900" user="hvo" what="addConnection">
+      <connect destinationId="107" destinationModule="PythonSource" destinationPort="Actor2D(vtkActor2D)" id="220" sourceId="106" sourceModule="vtkAxisActor2D" sourcePort="self(vtkAxisActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:40:58" parent="1900" time="1901" user="hvo" what="moveModule">
+      <move dx="116.816000349" dy="14.6020000437" id="0"/>
+      <move dx="211.065273358" dy="19.9118182414" id="106"/>
+      <move dx="195.135818765" dy="23.8941818896" id="107"/>
+    </action>
+    <action date="08 Mar 2007 23:40:58" parent="1901" time="1902" user="hvo" what="addConnection">
+      <connect destinationId="106" destinationModule="vtkAxisActor2D" destinationPort="SetTitleTextProperty(vtkTextProperty)" id="221" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 23:41:00" parent="1902" time="1903" user="hvo" what="addConnection">
+      <connect destinationId="106" destinationModule="vtkAxisActor2D" destinationPort="SetLabelTextProperty(vtkTextProperty)" id="222" sourceId="12" sourceModule="vtkTextProperty" sourcePort="self(vtkTextProperty)"/>
+    </action>
+    <action date="08 Mar 2007 23:41:04" parent="1903" time="1904" user="hvo" what="addConnection">
+      <connect destinationId="106" destinationModule="vtkActor2D" destinationPort="SetProperty(vtkProperty2D)" id="223" sourceId="101" sourceModule="vtkProperty2D" sourcePort="self(vtkProperty2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:41:35" parent="1904" time="1905" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="107" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.25%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0 [...]
+    </action>
+    <action date="08 Mar 2007 23:41:49" parent="1905" time="1906" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="107" portName="length" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:41:49" parent="1906" time="1907" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="107" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.25%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.25%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0 [...]
+    </action>
+    <action date="08 Mar 2007 23:42:15" parent="1907" time="1908" user="hvo" what="moveModule">
+      <move dx="-160.62200048" dy="-80.9747275148" id="107"/>
+    </action>
+    <action date="08 Mar 2007 23:42:15" parent="1908" time="1909" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="224" sourceId="107" sourceModule="PythonSource" sourcePort="OutputActor(vtkActor2D)"/>
+    </action>
+    <action date="08 Mar 2007 23:44:03" parent="1909" time="1910" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="107" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.9%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aa [...]
+    </action>
+    <action date="08 Mar 2007 23:44:41" parent="1910" time="1911" user="hvo" what="changeParameter">
+      <set alias="" function="SetTitle" functionId="0" moduleId="106" parameter="<no description>" parameterId="0" type="String" value="z(m)"/>
+    </action>
+    <action date="08 Mar 2007 23:45:00" parent="1911" time="1912" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="107" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.9%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.9%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aa [...]
+    </action>
+    <action date="08 Mar 2007 23:45:26" parent="1912" time="1913" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="08 Mar 2007 23:45:34" parent="1913" time="1914" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="100" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPosition%280.15%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPosition2%280.65%2C%200.3%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetNumberOfEntries%281%29%0Aactor.SetEntryString%2 [...]
+    </action>
+    <action date="08 Mar 2007 23:45:41" parent="1914" time="1915" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="104" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.15%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.8%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0A [...]
+    </action>
+    <action date="08 Mar 2007 23:45:50" parent="1915" time="1916" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="107" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.8%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.8%2C%200.95%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aa [...]
+    </action>
+    <action date="08 Mar 2007 23:46:38" parent="1916" time="1917" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFormat" functionId="3" moduleId="102" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:46:43" parent="1917" time="1918" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFormat" functionId="3" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="%d"/>
+    </action>
+    <action date="08 Mar 2007 23:46:58" parent="1918" time="1919" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFormat" functionId="3" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="%.0g"/>
+    </action>
+    <action date="08 Mar 2007 23:47:12" parent="1919" time="1920" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFormat" functionId="3" moduleId="102" parameter="<no description>" parameterId="0" type="String" value="%.0f"/>
+    </action>
+    <action date="08 Mar 2007 23:47:39" parent="1920" time="1921" user="hvo" what="deleteFunction">
+      <function functionId="2" moduleId="106"/>
+    </action>
+    <action date="08 Mar 2007 23:47:45" parent="1921" time="1922" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFormat" functionId="2" moduleId="106" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:47:49" parent="1922" time="1923" user="hvo" what="deleteFunction">
+      <function functionId="2" moduleId="102"/>
+    </action>
+    <action date="08 Mar 2007 23:47:58" parent="1923" time="1924" user="hvo" what="changeParameter">
+      <set alias="" function="SetLabelFormat" functionId="2" moduleId="106" parameter="<no description>" parameterId="0" type="String" value="%.0f"/>
+    </action>
+    <action date="08 Mar 2007 23:49:05" parent="157" time="1925" user="hvo" what="deleteConnection">
+      <connection connectionId="21"/>
+    </action>
+    <action date="08 Mar 2007 23:49:05" parent="1925" time="1926" user="hvo" what="deleteModule">
+      <module moduleId="17"/>
+    </action>
+    <action date="08 Mar 2007 23:49:44" parent="1926" time="1927" user="hvo" what="addModule">
+      <object cache="0" id="27" name="vtkCamera" x="1413.70913982" y="-608.611545767"/>
+    </action>
+    <action date="08 Mar 2007 23:49:44" parent="1927" time="1928" user="hvo" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="27" parameter="<no description>" parameterId="0" type="Float" value="338871.329767"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="27" parameter="<no description>" parameterId="1" type="Float" value="301735.486037"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="27" parameter="<no description>" parameterId="2" type="Float" value="123378.928288"/>
+    </action>
+    <action date="08 Mar 2007 23:49:44" parent="1928" time="1929" user="hvo" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="27" parameter="<no description>" parameterId="0" type="Float" value="338871.329767"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="27" parameter="<no description>" parameterId="1" type="Float" value="301735.486037"/>
+      <set alias="" function="SetFocalPoint" functionId="1" moduleId="27" parameter="<no description>" parameterId="2" type="Float" value="-2550"/>
+    </action>
+    <action date="08 Mar 2007 23:49:44" parent="1929" time="1930" user="hvo" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="27" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="27" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="27" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 23:49:44" parent="1930" time="1931" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="27" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:49:50" parent="1931" time="1932" user="hvo" what="moveModule">
+      <move dx="-266.118834651" dy="333.004317157" id="27"/>
+    </action>
+    <action date="08 Mar 2007 23:49:50" parent="1932" time="1933" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="SetActiveCamera(vtkCamera)" id="28" sourceId="27" sourceModule="vtkCamera" sourcePort="self(vtkCamera)"/>
+    </action>
+    <action date="08 Mar 2007 23:49:51" parent="1933" time="1934" user="hvo" what="deleteConnection">
+      <connection connectionId="12"/>
+    </action>
+    <action date="08 Mar 2007 23:49:51" parent="1934" time="1935" user="hvo" what="deleteModule">
+      <module moduleId="20"/>
+    </action>
+    <action date="08 Mar 2007 23:50:20" parent="1935" time="1936" user="hvo" what="deleteConnection">
+      <connection connectionId="22"/>
+      <connection connectionId="16"/>
+      <connection connectionId="15"/>
+      <connection connectionId="17"/>
+      <connection connectionId="24"/>
+      <connection connectionId="23"/>
+    </action>
+    <action date="08 Mar 2007 23:50:20" parent="1936" time="1937" user="hvo" what="deleteModule">
+      <module moduleId="21"/>
+      <module moduleId="8"/>
+      <module moduleId="11"/>
+      <module moduleId="16"/>
+      <module moduleId="22"/>
+      <module moduleId="23"/>
+    </action>
+    <action date="08 Mar 2007 23:50:23" parent="1937" time="1938" user="hvo" what="deleteConnection">
+      <connection connectionId="9"/>
+      <connection connectionId="3"/>
+      <connection connectionId="19"/>
+      <connection connectionId="2"/>
+      <connection connectionId="18"/>
+    </action>
+    <action date="08 Mar 2007 23:50:23" parent="1938" time="1939" user="hvo" what="deleteModule">
+      <module moduleId="4"/>
+      <module moduleId="13"/>
+      <module moduleId="14"/>
+      <module moduleId="10"/>
+      <module moduleId="9"/>
+    </action>
+    <action date="08 Mar 2007 23:50:24" parent="1939" time="1940" user="hvo" what="deleteConnection">
+      <connection connectionId="4"/>
+    </action>
+    <action date="08 Mar 2007 23:50:24" parent="1940" time="1941" user="hvo" what="deleteModule">
+      <module moduleId="1"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1941" time="1942" user="hvo" what="addModule">
+      <object cache="0" id="28" name="vtkColorTransferFunction" x="1356.73099808" y="120.05781881"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1942" time="1943" user="hvo" what="changeParameter">
+      <set alias="" function="SetColorSpaceToRGB" functionId="0" moduleId="28" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1943" time="1944" user="hvo" what="changeParameter">
+      <set alias="" function="ClampingOn" functionId="1" moduleId="28" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1944" time="1945" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.474509803922"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1945" time="1946" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="2.5"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+      <set alias="" function="AddRGBPoint" functionId="3" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.474509803922"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1946" time="1947" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="5.0"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.145098039216"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.427450980392"/>
+      <set alias="" function="AddRGBPoint" functionId="4" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1947" time="1948" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="7.5"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.149019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.717647058824"/>
+      <set alias="" function="AddRGBPoint" functionId="5" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1948" time="1949" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="25.5"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.156862745098"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="6" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1949" time="1950" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="26.5"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.164705882353"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="7" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.725490196078"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1950" time="1951" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="27.5"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.733333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="8" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.309803921569"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1951" time="1952" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="28.5"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="9" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.454901960784"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1952" time="1953" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="29.5"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.933333333333"/>
+      <set alias="" function="AddRGBPoint" functionId="10" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1953" time="1954" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="31.5"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.749019607843"/>
+      <set alias="" function="AddRGBPoint" functionId="11" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1954" time="1955" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="32.5"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.560784313725"/>
+      <set alias="" function="AddRGBPoint" functionId="12" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1955" time="1956" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="33.5"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.372549019608"/>
+      <set alias="" function="AddRGBPoint" functionId="13" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1956" time="1957" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="34.5"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.878431372549"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="14" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1957" time="1958" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="35.5"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.674509803922"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="15" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1958" time="1959" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="36.5"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="16" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1959" time="1960" user="hvo" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="28" parameter="<no description>" parameterId="0" type="Float" value="37.5"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="28" parameter="<no description>" parameterId="1" type="Float" value="0.494117647059"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="28" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="17" moduleId="28" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:50:36" parent="1960" time="1961" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="28" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:50:40" parent="1961" time="1962" user="hvo" what="moveModule">
+      <move dx="-336.264896945" dy="40.0017721273" id="28"/>
+    </action>
+    <action date="08 Mar 2007 23:50:40" parent="1962" time="1963" user="hvo" what="addConnection">
+      <connect destinationId="19" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="29" sourceId="28" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 23:50:47" parent="1963" time="1964" user="hvo" what="addConnection">
+      <connect destinationId="7" destinationModule="vtkScalarBarActor" destinationPort="SetLookupTable(vtkScalarsToColors)" id="30" sourceId="28" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 23:50:48" parent="1964" time="1965" user="hvo" what="deleteConnection">
+      <connection connectionId="5"/>
+      <connection connectionId="6"/>
+    </action>
+    <action date="08 Mar 2007 23:50:48" parent="1965" time="1966" user="hvo" what="deleteModule">
+      <module moduleId="2"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1966" time="1967" user="hvo" what="addModule">
+      <object cache="0" id="29" name="PythonSource" x="379.193195786" y="309.050944155"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1967" time="1968" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="29" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20 [...]
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1968" time="1969" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="29" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1969" time="1970" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="29" parameter="<no description>" parameterId="0" type="Float" value="-1"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1970" time="1971" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="29" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1971" time="1972" user="hvo" what="addModulePort">
+      <addPort moduleId="29" portName="zShift" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1972" time="1973" user="hvo" what="addModulePort">
+      <addPort moduleId="29" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1973" time="1974" user="hvo" what="addModulePort">
+      <addPort moduleId="29" portName="polydata" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:51:53" parent="1974" time="1975" user="hvo" what="addModulePort">
+      <addPort moduleId="29" portName="length" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1975" time="1976" user="hvo" what="addModule">
+      <object cache="0" id="30" name="vtkProperty" x="778.21158305" y="-408.351821848"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1976" time="1977" user="hvo" what="addModule">
+      <object cache="0" id="31" name="vtkDataSetMapper" x="877.821985802" y="-234.416305906"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1977" time="1978" user="hvo" what="addModule">
+      <object cache="0" id="32" name="vtkTubeFilter" x="830.440146371" y="-118.864371182"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1978" time="1979" user="hvo" what="addModule">
+      <object cache="0" id="33" name="vtkActor" x="845.490191988" y="-472.647912144"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1979" time="1980" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="30" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="30" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="30" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1980" time="1981" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="30" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1981" time="1982" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="31" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1982" time="1983" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="32" parameter="<no description>" parameterId="0" type="Float" value="300"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1983" time="1984" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfSides" functionId="1" moduleId="32" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1984" time="1985" user="hvo" what="changeParameter">
+      <set alias="" function="SidesShareVerticesOn" functionId="2" moduleId="32" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1985" time="1986" user="hvo" what="changeParameter">
+      <set alias="" function="CappingOff" functionId="3" moduleId="32" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1986" time="1987" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="32" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1987" time="1988" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="33" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1988" time="1989" user="hvo" what="addConnection">
+      <connect destinationId="33" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="31" sourceId="30" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1989" time="1990" user="hvo" what="addConnection">
+      <connect destinationId="33" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="32" sourceId="31" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 23:52:18" parent="1990" time="1991" user="hvo" what="addConnection">
+      <connect destinationId="31" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="33" sourceId="32" sourceModule="vtkTubeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 23:52:45" parent="1991" time="1992" user="hvo" what="moveModule">
+      <move dx="67.5029904648" dy="157.506977751" id="0"/>
+      <move dx="16.2507199267" dy="-62.5027689489" id="32"/>
+      <move dx="490.021708559" dy="161.257143888" id="7"/>
+      <move dx="415.018385821" dy="-88.7539319075" id="12"/>
+      <move dx="16.2507199267" dy="-62.5027689489" id="33"/>
+      <move dx="42.5018828853" dy="5.00022151591" id="24"/>
+      <move dx="-190.008417605" dy="-110.00487335" id="28"/>
+      <move dx="507.522483865" dy="-410.018164305" id="29"/>
+      <move dx="16.2507199267" dy="-62.5027689489" id="30"/>
+      <move dx="16.2507199267" dy="-62.5027689489" id="31"/>
+    </action>
+    <action date="08 Mar 2007 23:52:45" parent="1992" time="1993" user="hvo" what="addConnection">
+      <connect destinationId="32" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="34" sourceId="29" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="08 Mar 2007 23:52:48" parent="1993" time="1994" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="35" sourceId="33" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 23:53:12" parent="1994" time="1995" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="32" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 23:53:17" parent="1995" time="1996" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="32" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="08 Mar 2007 23:53:37" parent="1996" time="1997" user="hvo" what="deleteConnection">
+      <connection connectionId="11"/>
+      <connection connectionId="14"/>
+      <connection connectionId="30"/>
+    </action>
+    <action date="08 Mar 2007 23:53:37" parent="1997" time="1998" user="hvo" what="deleteModule">
+      <module moduleId="7"/>
+    </action>
+    <action date="08 Mar 2007 23:53:43" parent="1998" time="1999" user="hvo" what="moveModule">
+      <move dx="85.0037657705" dy="-67.5029904648" id="0"/>
+    </action>
+    <action date="08 Mar 2007 23:53:43" parent="1999" time="2000" user="hvo" what="deleteConnection">
+      <connection connectionId="1"/>
+      <connection connectionId="0"/>
+    </action>
+    <action date="08 Mar 2007 23:53:43" parent="2000" time="2001" user="hvo" what="deleteModule">
+      <module moduleId="0"/>
+    </action>
+    <action date="08 Mar 2007 23:53:44" parent="2001" time="2002" user="hvo" what="deleteConnection"/>
+    <action date="08 Mar 2007 23:53:44" parent="2002" time="2003" user="hvo" what="deleteModule">
+      <module moduleId="12"/>
+    </action>
+    <action date="08 Mar 2007 23:56:26" parent="1924" time="2004" user="hvo" what="addModule">
+      <object cache="0" id="108" name="vtkDataSetMapper" x="588.36256334" y="-36.76947102"/>
+    </action>
+    <action date="08 Mar 2007 23:56:26" parent="2004" time="2005" user="hvo" what="addModule">
+      <object cache="0" id="109" name="vtkActor" x="674.542307966" y="-291.817763707"/>
+    </action>
+    <action date="08 Mar 2007 23:56:26" parent="2005" time="2006" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="108" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:56:26" parent="2006" time="2007" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="109" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:56:26" parent="2007" time="2008" user="hvo" what="addConnection">
+      <connect destinationId="109" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="225" sourceId="108" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="08 Mar 2007 23:56:38" parent="2008" time="2009" user="hvo" what="moveModule">
+      <move dx="894.691354307" dy="32.633119306" id="108"/>
+      <move dx="894.691354307" dy="32.633119306" id="109"/>
+    </action>
+    <action date="08 Mar 2007 23:56:38" parent="2009" time="2010" user="hvo" what="addConnection">
+      <connect destinationId="108" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="226" sourceId="6" sourceModule="vtkCORIEUnstructuredGridReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="08 Mar 2007 23:57:10" parent="2010" time="2011" user="hvo" what="addModule">
+      <object cache="0" id="110" name="vtkRenderer" x="1136.59136348" y="-472.339603991"/>
+    </action>
+    <action date="08 Mar 2007 23:57:10" parent="2011" time="2012" user="hvo" what="changeParameter">
+      <set alias="" function="SetBackground" functionId="0" moduleId="110" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="110" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="110" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="08 Mar 2007 23:57:10" parent="2012" time="2013" user="hvo" what="changeParameter">
+      <set alias="" function="ResetCameraClippingRange" functionId="1" moduleId="110" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:57:10" parent="2013" time="2014" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="110" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:57:20" parent="2014" time="2015" user="hvo" what="moveModule">
+      <move dx="437.827684023" dy="-103.338211136" id="110"/>
+    </action>
+    <action date="08 Mar 2007 23:57:20" parent="2015" time="2016" user="hvo" what="addConnection">
+      <connect destinationId="110" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="227" sourceId="109" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="08 Mar 2007 23:57:38" parent="2016" time="2017" user="hvo" what="moveModule">
+      <move dx="-5.43885321767" dy="-12.2374197398" id="110"/>
+    </action>
+    <action date="08 Mar 2007 23:57:38" parent="2017" time="2018" user="hvo" what="addConnection">
+      <connect destinationId="3" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="228" sourceId="110" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="08 Mar 2007 23:58:09" parent="2018" time="2019" user="hvo" what="changeParameter">
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="08 Mar 2007 23:58:20" parent="2019" time="2020" user="hvo" what="changeParameter">
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="2" type="Float" value=""/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:58:27" parent="2020" time="2021" user="hvo" what="changeParameter">
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="1" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="2" type="Float" value=""/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:58:56" parent="2021" time="2022" user="hvo" what="changeParameter">
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="1" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="2" type="Float" value="0.5"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="08 Mar 2007 23:58:59" parent="2022" time="2023" user="hvo" what="changeParameter">
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="1" type="Float" value="0.1"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="2" type="Float" value="0.5"/>
+      <set alias="" function="SetViewport" functionId="2" moduleId="110" parameter="<no description>" parameterId="3" type="Float" value="0.5"/>
+    </action>
+    <action date="08 Mar 2007 23:59:32" parent="2023" time="2024" user="hvo" what="moveModule">
+      <move dx="-1.35971330442" dy="-85.6619381783" id="108"/>
+    </action>
+    <action date="08 Mar 2007 23:59:32" parent="2024" time="2025" user="hvo" what="addConnection">
+      <connect destinationId="108" destinationModule="vtkMapper" destinationPort="SetLookupTable(vtkScalarsToColors)" id="229" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="08 Mar 2007 23:59:57" parent="2025" time="2026" user="hvo" what="moveModule">
+      <move dx="-24.4748394795" dy="96.5396446137" id="20"/>
+    </action>
+    <action date="08 Mar 2007 23:59:57" parent="2026" time="2027" user="hvo" what="deleteConnection">
+      <connection connectionId="12"/>
+    </action>
+    <action date="08 Mar 2007 23:59:59" parent="2027" time="2028" user="hvo" what="addConnection">
+      <connect destinationId="110" destinationModule="vtkRenderer" destinationPort="SetActiveCamera(vtkCamera)" id="230" sourceId="20" sourceModule="vtkCamera" sourcePort="self(vtkCamera)"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2028" time="2029" user="hvo" what="addModule">
+      <object cache="0" id="111" name="vtkDataSetMapper" x="904.072705729" y="-286.919074855"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2029" time="2030" user="hvo" what="addModule">
+      <object cache="0" id="112" name="vtkProperty" x="804.462302977" y="-460.854590797"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2030" time="2031" user="hvo" what="addModule">
+      <object cache="0" id="113" name="vtkActor" x="871.740911915" y="-525.150681093"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2031" time="2032" user="hvo" what="addModule">
+      <object cache="0" id="114" name="vtkTubeFilter" x="856.690866298" y="-171.367140131"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2032" time="2033" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="111" value=""/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2033" time="2034" user="hvo" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="112" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="112" parameter="<no description>" parameterId="1" type="Float" value="0"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="112" parameter="<no description>" parameterId="2" type="Float" value="0"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2034" time="2035" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="112" value=""/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2035" time="2036" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="113" value=""/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2036" time="2037" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="114" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2037" time="2038" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfSides" functionId="1" moduleId="114" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2038" time="2039" user="hvo" what="changeParameter">
+      <set alias="" function="SidesShareVerticesOn" functionId="2" moduleId="114" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2039" time="2040" user="hvo" what="changeParameter">
+      <set alias="" function="CappingOff" functionId="3" moduleId="114" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2040" time="2041" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="114" value=""/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2041" time="2042" user="hvo" what="addConnection">
+      <connect destinationId="113" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="231" sourceId="111" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2042" time="2043" user="hvo" what="addConnection">
+      <connect destinationId="111" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="232" sourceId="114" sourceModule="vtkTubeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="09 Mar 2007 00:00:53" parent="2043" time="2044" user="hvo" what="addConnection">
+      <connect destinationId="113" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="233" sourceId="112" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="09 Mar 2007 00:01:06" parent="2044" time="2045" user="hvo" what="moveModule">
+      <move dx="-458.223383589" dy="-4.07913991325" id="111"/>
+      <move dx="-458.223383589" dy="-4.07913991325" id="112"/>
+      <move dx="-458.223383589" dy="-4.07913991325" id="113"/>
+      <move dx="-458.223383589" dy="-4.07913991325" id="114"/>
+    </action>
+    <action date="09 Mar 2007 00:01:06" parent="2045" time="2046" user="hvo" what="addConnection">
+      <connect destinationId="114" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="234" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="09 Mar 2007 00:01:19" parent="2046" time="2047" user="hvo" what="addConnection">
+      <connect destinationId="110" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="235" sourceId="113" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="09 Mar 2007 09:52:49" parent="2047" time="2048" user="hvo" what="moveModule">
+      <move dx="-1.37056987171" dy="0.0" id="2"/>
+    </action>
+    <action date="09 Mar 2007 09:52:49" parent="2048" time="2049" user="hvo" what="changeParameter">
+      <set alias="TimeStep" function="SetTimeStep" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="09 Mar 2007 09:55:30" parent="2049" time="2050" user="hvo" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 $int(TimeStep*45/60)$:$int((TimeStep*45) % 60)$:00"/>
+    </action>
+    <action date="09 Mar 2007 09:57:31" parent="2050" time="2051" user="hvo" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 $int(TimeStep/4)$:$int((TimeStep%4)*15)$:00"/>
+    </action>
+    <action date="09 Mar 2007 10:04:05" parent="2051" time="2052" user="hvo" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 $int(TimeStep/4)$:$'%2d' % (int((TimeStep%4)*15))$:00"/>
+    </action>
+    <action date="09 Mar 2007 10:04:07" parent="2052" time="2053" user="hvo" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 $int(TimeStep/4)$:$'%2d' % (int((TimeStep%4)*15))$:00"/>
+    </action>
+    <action date="09 Mar 2007 10:12:24" parent="2053" time="2054" user="hvo" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 $int(TimeStep/4)$:$'%02d' % (int((TimeStep%4)*15))$:00"/>
+    </action>
+    <action date="09 Mar 2007 10:19:59" parent="2054" time="2055" user="hvo" what="changeParameter">
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Integer" value="1"/>
+      <set alias="" function="SetText" functionId="0" moduleId="0" parameter="<no description>" parameterId="1" type="String" value="2006-Jul-11 $'%02d' % (int(TimeStep/4))$:$'%02d' % (int((TimeStep%4)*15))$:00"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="0" time="2056" user="hvo" what="addModule">
+      <object cache="0" id="0" name="vtkDataSetMapper" x="455.84932214" y="-280.998214768"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2056" time="2057" user="hvo" what="addModule">
+      <object cache="0" id="1" name="PythonSource" x="379.193195786" y="309.050944155"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2057" time="2058" user="hvo" what="addModule">
+      <object cache="0" id="2" name="vtkTubeFilter" x="408.467482709" y="-165.446280044"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2058" time="2059" user="hvo" what="addModule">
+      <object cache="0" id="3" name="vtkActor" x="423.517528326" y="-519.229821006"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2059" time="2060" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="0" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2060" time="2061" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2061" time="2062" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2062" time="2063" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="1" parameter="<no description>" parameterId="0" type="Float" value="-1"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2063" time="2064" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="1" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2064" time="2065" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="zShift" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2065" time="2066" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2066" time="2067" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="polydata" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2067" time="2068" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="length" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2068" time="2069" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2069" time="2070" user="hvo" what="changeParameter">
+      <set alias="" function="SetNumberOfSides" functionId="1" moduleId="2" parameter="<no description>" parameterId="0" type="Integer" value="10"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2070" time="2071" user="hvo" what="changeParameter">
+      <set alias="" function="SidesShareVerticesOn" functionId="2" moduleId="2" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2071" time="2072" user="hvo" what="changeParameter">
+      <set alias="" function="CappingOff" functionId="3" moduleId="2" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2072" time="2073" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="2" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2073" time="2074" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="3" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2074" time="2075" user="hvo" what="addConnection">
+      <connect destinationId="3" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="0" sourceId="0" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2075" time="2076" user="hvo" what="addConnection">
+      <connect destinationId="0" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="1" sourceId="2" sourceModule="vtkTubeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="09 Mar 2007 13:15:31" parent="2076" time="2077" user="hvo" what="addConnection">
+      <connect destinationId="2" destinationModule="vtkPolyDataAlgorithm" destinationPort="SetInput(vtkDataObject)" id="2" sourceId="1" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="09 Mar 2007 13:15:44" parent="2077" time="2078" user="hvo" what="moveModule">
+      <move dx="44.2160934173" dy="244.072835663" id="0"/>
+      <move dx="-3.53728747338" dy="91.0851524396" id="1"/>
+      <move dx="40.6788059439" dy="303.322400843" id="2"/>
+      <move dx="73.3987150727" dy="318.355872605" id="3"/>
+    </action>
+    <action date="09 Mar 2007 13:15:44" parent="2078" time="2079" user="hvo" what="addModule">
+      <object cache="0" id="4" name="VTKCell" x="831.310665335" y="-468.248456393"/>
+    </action>
+    <action date="09 Mar 2007 13:15:49" parent="2079" time="2080" user="hvo" what="addModule">
+      <object cache="0" id="5" name="vtkRenderer" x="652.607148161" y="-368.717383536"/>
+    </action>
+    <action date="09 Mar 2007 13:15:56" parent="2080" time="2081" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="3" sourceId="3" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="09 Mar 2007 13:15:59" parent="2081" time="2082" user="hvo" what="addConnection">
+      <connect destinationId="4" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="4" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="09 Mar 2007 13:25:39" parent="2082" time="2083" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:26:09" parent="2083" time="2084" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:26:33" parent="2084" time="2085" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:28:33" parent="2085" time="2086" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:29:08" parent="2086" time="2087" user="hvo" what="addModule">
+      <object cache="0" id="6" name="vtkSphereSource" x="685.407160807" y="232.993193277"/>
+    </action>
+    <action date="09 Mar 2007 13:29:32" parent="2087" time="2088" user="hvo" what="moveModule">
+      <move dx="15.8344888635" dy="41.8482919964" id="6"/>
+    </action>
+    <action date="09 Mar 2007 13:30:17" parent="2088" time="2089" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="centerX" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:30:18" parent="2089" time="2090" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="centerY" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:30:18" parent="2090" time="2091" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="centerZ" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:30:18" parent="2091" time="2092" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:30:23" parent="2092" time="2093" user="hvo" what="addModule">
+      <object cache="0" id="7" name="Tuple" x="357.407034348" y="278.23459003"/>
+    </action>
+    <action date="09 Mar 2007 13:30:34" parent="2093" time="2094" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.13103491882" id="7"/>
+    </action>
+    <action date="09 Mar 2007 13:30:34" parent="2094" time="2095" user="hvo" what="addModulePort">
+      <addPort moduleId="7" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 13:30:34" parent="2095" time="2096" user="hvo" what="addModulePort">
+      <addPort moduleId="7" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 13:30:34" parent="2096" time="2097" user="hvo" what="addModulePort">
+      <addPort moduleId="7" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 13:30:35" parent="2097" time="2098" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="7" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:30:35" parent="2098" time="2099" user="hvo" what="addModulePort">
+      <addPort moduleId="7" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 13:30:48" parent="2099" time="2100" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-55.4207110223" id="6"/>
+    </action>
+    <action date="09 Mar 2007 13:30:50" parent="2100" time="2101" user="hvo" what="addConnection">
+      <connect destinationId="6" destinationModule="vtkSphereSource" destinationPort="SetCenter(Float,Float,Float)" id="5" sourceId="7" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 13:30:59" parent="2101" time="2102" user="hvo" what="moveModule">
+      <move dx="-47.5034665906" dy="-11.3103491882" id="6"/>
+      <move dx="217.158704414" dy="21.4896634576" id="7"/>
+    </action>
+    <action date="09 Mar 2007 13:30:59" parent="2102" time="2103" user="hvo" what="addConnection">
+      <connect destinationId="7" destinationModule="Tuple" destinationPort="centerY(Float)" id="6" sourceId="1" sourceModule="PythonSource" sourcePort="centerY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 13:31:07" parent="2103" time="2104" user="hvo" what="addConnection">
+      <connect destinationId="7" destinationModule="Tuple" destinationPort="centerX(Float)" id="7" sourceId="1" sourceModule="PythonSource" sourcePort="centerX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 13:31:09" parent="2104" time="2105" user="hvo" what="addConnection">
+      <connect destinationId="7" destinationModule="Tuple" destinationPort="centerZ(Float)" id="8" sourceId="1" sourceModule="PythonSource" sourcePort="centerZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 13:31:18" parent="2105" time="2106" user="hvo" what="moveModule">
+      <move dx="-147.034539447" dy="-20.3586285388" id="7"/>
+    </action>
+    <action date="09 Mar 2007 13:31:18" parent="2106" time="2107" user="hvo" what="addModule">
+      <object cache="0" id="8" name="vtkDataSetMapper" x="510.065415557" y="-26.9253791045"/>
+    </action>
+    <action date="09 Mar 2007 13:31:19" parent="2107" time="2108" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="8" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:31:23" parent="2108" time="2109" user="hvo" what="moveModule">
+      <move dx="270.317345599" dy="-27.1448380517" id="8"/>
+    </action>
+    <action date="09 Mar 2007 13:31:23" parent="2109" time="2110" user="hvo" what="addModule">
+      <object cache="0" id="9" name="vtkActor" x="506.916243399" y="-190.873948401"/>
+    </action>
+    <action date="09 Mar 2007 13:31:23" parent="2110" time="2111" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="9" value=""/>
+    </action>
+    <action date="09 Mar 2007 13:31:28" parent="2111" time="2112" user="hvo" what="moveModule">
+      <move dx="249.95871706" dy="14.7034539447" id="9"/>
+    </action>
+    <action date="09 Mar 2007 13:31:28" parent="2112" time="2113" user="hvo" what="addConnection">
+      <connect destinationId="9" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="9" sourceId="8" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="09 Mar 2007 13:31:31" parent="2113" time="2114" user="hvo" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="10" sourceId="9" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="09 Mar 2007 13:31:38" parent="2114" time="2115" user="hvo" what="addConnection">
+      <connect destinationId="8" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="11" sourceId="6" sourceModule="vtkSphereSource" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="09 Mar 2007 13:32:14" parent="2115" time="2116" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:32:23" parent="2116" time="2117" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:32:34" parent="2117" time="2118" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 13:32:37" parent="2118" time="2119" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="09 Mar 2007 13:32:38" parent="2119" time="2120" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="09 Mar 2007 13:33:46" parent="2120" time="2121" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:40:27" parent="2121" time="2122" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:41:20" parent="2122" time="2123" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:41:54" parent="2123" time="2124" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:43:32" parent="2124" time="2125" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:45:22" parent="2125" time="2126" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:50:04" parent="2126" time="2127" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:51:22" parent="2127" time="2128" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:52:53" parent="2128" time="2129" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:53:26" parent="2129" time="2130" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:58:04" parent="2130" time="2131" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 13:58:41" parent="2131" time="2132" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:04:11" parent="2132" time="2133" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:06:28" parent="2133" time="2134" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:06:47" parent="2134" time="2135" user="hvo" what="moveModule">
+      <move dx="-0.924067941514" dy="0.0" id="1"/>
+    </action>
+    <action date="09 Mar 2007 14:07:47" parent="2135" time="2136" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:08:18" parent="2136" time="2137" user="hvo" what="deleteConnection">
+      <connection connectionId="5"/>
+    </action>
+    <action date="09 Mar 2007 14:30:34" parent="2137" time="2138" user="hvo" what="deleteConnection">
+      <connection connectionId="6"/>
+      <connection connectionId="7"/>
+      <connection connectionId="8"/>
+    </action>
+    <action date="09 Mar 2007 14:30:34" parent="2138" time="2139" user="hvo" what="deleteModule">
+      <module moduleId="7"/>
+    </action>
+    <action date="09 Mar 2007 14:30:38" parent="2139" time="2140" user="hvo" what="addModule">
+      <object cache="0" id="10" name="Tuple" x="426.919388979" y="268.903770981"/>
+    </action>
+    <action date="09 Mar 2007 14:30:48" parent="2140" time="2141" user="hvo" what="addModulePort">
+      <addPort moduleId="10" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:30:49" parent="2141" time="2142" user="hvo" what="addModulePort">
+      <addPort moduleId="10" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:30:49" parent="2142" time="2143" user="hvo" what="addModulePort">
+      <addPort moduleId="10" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:30:50" parent="2143" time="2144" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="10" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 14:30:50" parent="2144" time="2145" user="hvo" what="addModulePort">
+      <addPort moduleId="10" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 14:31:02" parent="2145" time="2146" user="hvo" what="moveModule">
+      <move dx="27.7220382454" dy="0.0" id="10"/>
+    </action>
+    <action date="09 Mar 2007 14:31:02" parent="2146" time="2147" user="hvo" what="addConnection">
+      <connect destinationId="10" destinationModule="Tuple" destinationPort="centerX(Float)" id="12" sourceId="1" sourceModule="PythonSource" sourcePort="centerX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:31:03" parent="2147" time="2148" user="hvo" what="addConnection">
+      <connect destinationId="10" destinationModule="Tuple" destinationPort="centerY(Float)" id="13" sourceId="1" sourceModule="PythonSource" sourcePort="centerY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:31:05" parent="2148" time="2149" user="hvo" what="addConnection">
+      <connect destinationId="10" destinationModule="Tuple" destinationPort="centerZ(Float)" id="14" sourceId="1" sourceModule="PythonSource" sourcePort="centerZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:31:15" parent="2149" time="2150" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.924067941514" id="6"/>
+    </action>
+    <action date="09 Mar 2007 14:31:17" parent="2150" time="2151" user="hvo" what="addConnection">
+      <connect destinationId="6" destinationModule="vtkSphereSource" destinationPort="SetCenter(Float,Float,Float)" id="15" sourceId="10" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:31:46" parent="2151" time="2152" user="hvo" what="deleteConnection">
+      <connection connectionId="15"/>
+      <connection connectionId="12"/>
+      <connection connectionId="13"/>
+      <connection connectionId="14"/>
+    </action>
+    <action date="09 Mar 2007 14:31:46" parent="2152" time="2153" user="hvo" what="deleteModule">
+      <module moduleId="10"/>
+    </action>
+    <action date="09 Mar 2007 14:32:37" parent="2153" time="2154" user="hvo" what="moveModule">
+      <move dx="60.0644161984" dy="-123.825104163" id="1"/>
+      <move dx="-37.8867856021" dy="172.800705063" id="6"/>
+    </action>
+    <action date="09 Mar 2007 14:32:37" parent="2154" time="2155" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="spheresource" portSpec="(vtkSphereSource)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:32:37" parent="2155" time="2156" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:42:48" parent="2156" time="2157" user="hvo" what="addModule">
+      <object cache="0" id="11" name="Tuple" x="569.582137467" y="197.093501536"/>
+    </action>
+    <action date="09 Mar 2007 14:43:02" parent="2157" time="2158" user="hvo" what="moveModule">
+      <move dx="47.9172274377" dy="-19.8901698798" id="11"/>
+    </action>
+    <action date="09 Mar 2007 14:43:02" parent="2158" time="2159" user="hvo" what="addModulePort">
+      <addPort moduleId="11" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:43:03" parent="2159" time="2160" user="hvo" what="addModulePort">
+      <addPort moduleId="11" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:43:03" parent="2160" time="2161" user="hvo" what="addModulePort">
+      <addPort moduleId="11" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:43:04" parent="2161" time="2162" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="11" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 14:43:04" parent="2162" time="2163" user="hvo" what="addModulePort">
+      <addPort moduleId="11" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 14:43:12" parent="2163" time="2164" user="hvo" what="addConnection">
+      <connect destinationId="11" destinationModule="Tuple" destinationPort="centerX(Float)" id="16" sourceId="1" sourceModule="PythonSource" sourcePort="centerX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:43:15" parent="2164" time="2165" user="hvo" what="addConnection">
+      <connect destinationId="11" destinationModule="Tuple" destinationPort="centerY(Float)" id="17" sourceId="1" sourceModule="PythonSource" sourcePort="centerY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:43:17" parent="2165" time="2166" user="hvo" what="addConnection">
+      <connect destinationId="11" destinationModule="Tuple" destinationPort="centerZ(Float)" id="18" sourceId="1" sourceModule="PythonSource" sourcePort="centerZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:43:51" parent="2166" time="2167" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:54:55" parent="2167" time="2168" user="hvo" what="moveModule">
+      <move dx="0.0" dy="1.93270236987" id="11"/>
+    </action>
+    <action date="09 Mar 2007 14:54:55" parent="2168" time="2169" user="hvo" what="deleteConnection">
+      <connection connectionId="16"/>
+      <connection connectionId="17"/>
+      <connection connectionId="18"/>
+    </action>
+    <action date="09 Mar 2007 14:54:55" parent="2169" time="2170" user="hvo" what="deleteModule">
+      <module moduleId="11"/>
+    </action>
+    <action date="09 Mar 2007 14:54:59" parent="2170" time="2171" user="hvo" what="addModule">
+      <object cache="0" id="12" name="Tuple" x="564.349092001" y="183.606725137"/>
+    </action>
+    <action date="09 Mar 2007 14:56:22" parent="2171" time="2172" user="hvo" what="addModulePort">
+      <addPort moduleId="12" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:56:22" parent="2172" time="2173" user="hvo" what="addModulePort">
+      <addPort moduleId="12" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:56:23" parent="2173" time="2174" user="hvo" what="addModulePort">
+      <addPort moduleId="12" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:56:23" parent="2174" time="2175" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="12" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 14:56:24" parent="2175" time="2176" user="hvo" what="addModulePort">
+      <addPort moduleId="12" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 14:56:29" parent="2176" time="2177" user="hvo" what="addConnection">
+      <connect destinationId="12" destinationModule="Tuple" destinationPort="centerX(Float)" id="19" sourceId="1" sourceModule="PythonSource" sourcePort="centerX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:56:31" parent="2177" time="2178" user="hvo" what="addConnection">
+      <connect destinationId="12" destinationModule="Tuple" destinationPort="centerY(Float)" id="20" sourceId="1" sourceModule="PythonSource" sourcePort="centerY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:56:33" parent="2178" time="2179" user="hvo" what="addConnection">
+      <connect destinationId="12" destinationModule="Tuple" destinationPort="centerZ(Float)" id="21" sourceId="1" sourceModule="PythonSource" sourcePort="centerZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:56:49" parent="2179" time="2180" user="hvo" what="moveModule">
+      <move dx="37.0680438669" dy="-44.3008329141" id="12"/>
+    </action>
+    <action date="09 Mar 2007 14:56:52" parent="2180" time="2181" user="hvo" what="moveModule">
+      <move dx="70.5196932101" dy="-339.941085218" id="6"/>
+    </action>
+    <action date="09 Mar 2007 14:56:54" parent="2181" time="2182" user="hvo" what="addConnection">
+      <connect destinationId="6" destinationModule="vtkSphereSource" destinationPort="SetCenter(Float,Float,Float)" id="22" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 14:59:02" parent="2182" time="2183" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="1" portName="spheresource" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 14:59:02" parent="2183" time="2184" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 14:59:20" parent="2184" time="2185" user="hvo" what="moveModule">
+      <move dx="10.4175151979" dy="-25.6431143334" id="6"/>
+    </action>
+    <action date="09 Mar 2007 14:59:20" parent="2185" time="2186" user="hvo" what="addModule">
+      <object cache="0" id="13" name="vtkSliderWidget" x="931.966936554" y="-129.01691899"/>
+    </action>
+    <action date="09 Mar 2007 14:59:47" parent="2186" time="2187" user="hvo" what="moveModule">
+      <move dx="-90.5522474898" dy="-77.7306903231" id="8"/>
+      <move dx="-71.3199117397" dy="-52.8889233126" id="9"/>
+      <move dx="-36.8619768542" dy="-44.8754500834" id="13"/>
+    </action>
+    <action date="09 Mar 2007 14:59:47" parent="2187" time="2188" user="hvo" what="addModule">
+      <object cache="0" id="14" name="vtkInteractionHandler" x="927.960199939" y="-342.175306886"/>
+    </action>
+    <action date="09 Mar 2007 14:59:49" parent="2188" time="2189" user="hvo" what="moveModule">
+      <move dx="-52.8889233126" dy="20.8350303959" id="14"/>
+    </action>
+    <action date="09 Mar 2007 14:59:49" parent="2189" time="2190" user="hvo" what="addConnection">
+      <connect destinationId="4" destinationModule="VTKCell" destinationPort="InteractionHandler(vtkInteractionHandler)" id="23" sourceId="14" sourceModule="vtkInteractionHandler" sourcePort="self(vtkInteractionHandler)"/>
+    </action>
+    <action date="09 Mar 2007 14:59:52" parent="2190" time="2191" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="Observer(vtkInteractorObserver)" id="24" sourceId="13" sourceModule="vtkSliderWidget" sourcePort="self(vtkSliderWidget)"/>
+    </action>
+    <action date="09 Mar 2007 15:00:14" parent="2191" time="2192" user="hvo" what="moveModule">
+      <move dx="28.8485036251" dy="36.8619768542" id="13"/>
+    </action>
+    <action date="09 Mar 2007 15:00:14" parent="2192" time="2193" user="hvo" what="addModule">
+      <object cache="0" id="15" name="vtkSliderRepresentation3D" x="886.290139148" y="-4.00673661459"/>
+    </action>
+    <action date="09 Mar 2007 15:00:17" parent="2193" time="2194" user="hvo" what="moveModule">
+      <move dx="-32.8552402397" dy="-33.6565875626" id="15"/>
+    </action>
+    <action date="09 Mar 2007 15:00:17" parent="2194" time="2195" user="hvo" what="addConnection">
+      <connect destinationId="13" destinationModule="vtkSliderWidget" destinationPort="SetRepresentation(vtkSliderRepresentation)" id="25" sourceId="15" sourceModule="vtkSliderRepresentation3D" sourcePort="self(vtkSliderRepresentation3D)"/>
+    </action>
+    <action date="09 Mar 2007 15:01:12" parent="2195" time="2196" user="hvo" what="moveModule">
+      <move dx="-12.0202098438" dy="-80.9360796148" id="13"/>
+      <move dx="42.4714081147" dy="-30.4511982709" id="15"/>
+    </action>
+    <action date="09 Mar 2007 15:01:18" parent="2196" time="2197" user="hvo" what="addConnection">
+      <connect destinationId="15" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint1InWorldCoordinates(Float,Float,Float)" id="26" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:01:21" parent="2197" time="2198" user="hvo" what="moveModule">
+      <move dx="-122.606140407" dy="26.4444616563" id="6"/>
+    </action>
+    <action date="09 Mar 2007 15:01:21" parent="2198" time="2199" user="hvo" what="deleteConnection">
+      <connection connectionId="11"/>
+      <connection connectionId="22"/>
+    </action>
+    <action date="09 Mar 2007 15:01:21" parent="2199" time="2200" user="hvo" what="deleteModule">
+      <module moduleId="6"/>
+    </action>
+    <action date="09 Mar 2007 15:02:28" parent="2200" time="2201" user="hvo" what="moveModule">
+      <move dx="66.5118278022" dy="-71.3199117397" id="12"/>
+    </action>
+    <action date="09 Mar 2007 15:02:28" parent="2201" time="2202" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="rayX" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 15:02:28" parent="2202" time="2203" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="rayY" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 15:02:29" parent="2203" time="2204" user="hvo" what="addModulePort">
+      <addPort moduleId="1" portName="rayZ" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 15:02:29" parent="2204" time="2205" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:03:51" parent="2205" time="2206" user="hvo" what="addModule">
+      <object cache="0" id="16" name="Tuple" x="677.92896367" y="77.9859804832"/>
+    </action>
+    <action date="09 Mar 2007 15:03:51" parent="2206" time="2207" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="16" value=""/>
+    </action>
+    <action date="09 Mar 2007 15:03:51" parent="2207" time="2208" user="hvo" what="addModulePort">
+      <addPort moduleId="16" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 15:03:51" parent="2208" time="2209" user="hvo" what="addModulePort">
+      <addPort moduleId="16" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 15:03:51" parent="2209" time="2210" user="hvo" what="addModulePort">
+      <addPort moduleId="16" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 15:03:51" parent="2210" time="2211" user="hvo" what="addModulePort">
+      <addPort moduleId="16" portName="value" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 15:03:59" parent="2211" time="2212" user="hvo" what="moveModule">
+      <move dx="100.168415365" dy="-14.4242518125" id="16"/>
+    </action>
+    <action date="09 Mar 2007 15:03:59" parent="2212" time="2213" user="hvo" what="addConnection">
+      <connect destinationId="16" destinationModule="Tuple" destinationPort="centerX(Float)" id="27" sourceId="1" sourceModule="PythonSource" sourcePort="rayX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:04:01" parent="2213" time="2214" user="hvo" what="addConnection">
+      <connect destinationId="16" destinationModule="Tuple" destinationPort="centerY(Float)" id="28" sourceId="1" sourceModule="PythonSource" sourcePort="rayY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:04:04" parent="2214" time="2215" user="hvo" what="addConnection">
+      <connect destinationId="16" destinationModule="Tuple" destinationPort="centerZ(Float)" id="29" sourceId="1" sourceModule="PythonSource" sourcePort="rayZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:04:20" parent="2215" time="2216" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.801347322918" id="15"/>
+    </action>
+    <action date="09 Mar 2007 15:04:41" parent="2216" time="2217" user="hvo" what="deleteConnection">
+      <connection connectionId="29"/>
+    </action>
+    <action date="09 Mar 2007 15:04:41" parent="2217" time="2218" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="16" portName="centerZ" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 15:04:42" parent="2218" time="2219" user="hvo" what="addModulePort">
+      <addPort moduleId="16" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 15:04:42" parent="2219" time="2220" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="16" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 15:04:42" parent="2220" time="2221" user="hvo" what="addModulePort">
+      <addPort moduleId="16" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 15:04:58" parent="2221" time="2222" user="hvo" what="addConnection">
+      <connect destinationId="15" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint2InWorldCoordinates(Float,Float,Float)" id="30" sourceId="16" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:05:06" parent="2222" time="2223" user="hvo" what="addConnection">
+      <connect destinationId="16" destinationModule="Tuple" destinationPort="centerZ(Float)" id="31" sourceId="1" sourceModule="PythonSource" sourcePort="rayZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:05:46" parent="2223" time="2224" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:06:00" parent="2224" time="2225" user="hvo" what="addModule">
+      <object cache="0" id="17" name="vtkSphereSource" x="580.175461793" y="9.61616787502"/>
+    </action>
+    <action date="09 Mar 2007 15:06:22" parent="2225" time="2226" user="hvo" what="moveModule">
+      <move dx="147.447907417" dy="125.010182375" id="12"/>
+      <move dx="-59.299701896" dy="80.1347322918" id="16"/>
+      <move dx="37.6633241772" dy="58.498354573" id="17"/>
+    </action>
+    <action date="09 Mar 2007 15:06:22" parent="2226" time="2227" user="hvo" what="addConnection">
+      <connect destinationId="8" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="32" sourceId="17" sourceModule="vtkSphereSource" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="09 Mar 2007 15:06:39" parent="2227" time="2228" user="hvo" what="moveModule">
+      <move dx="-228.383987032" dy="-68.1145224481" id="12"/>
+      <move dx="9.61616787502" dy="-0.801347322918" id="16"/>
+      <move dx="93.7576367814" dy="-42.4714081147" id="17"/>
+    </action>
+    <action date="09 Mar 2007 15:06:39" parent="2228" time="2229" user="hvo" what="addConnection">
+      <connect destinationId="17" destinationModule="vtkSphereSource" destinationPort="SetCenter(Float,Float,Float)" id="33" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:06:59" parent="2229" time="2230" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="17" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:07:01" parent="2230" time="2231" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="17" parameter="<no description>" parameterId="0" type="Float" value="10000"/>
+    </action>
+    <action date="09 Mar 2007 15:07:02" parent="2231" time="2232" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="17" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="09 Mar 2007 15:07:03" parent="2232" time="2233" user="hvo" what="changeParameter">
+      <set alias="" function="SetRadius" functionId="0" moduleId="17" parameter="<no description>" parameterId="0" type="Float" value="1000"/>
+    </action>
+    <action date="09 Mar 2007 15:07:47" parent="2233" time="2234" user="hvo" what="moveModule">
+      <move dx="0.0" dy="0.801347322918" id="15"/>
+    </action>
+    <action date="09 Mar 2007 15:07:47" parent="2234" time="2235" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:07:49" parent="2235" time="2236" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="500"/>
+    </action>
+    <action date="09 Mar 2007 15:07:53" parent="2236" time="2237" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="500"/>
+    </action>
+    <action date="09 Mar 2007 15:09:44" parent="2237" time="2238" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:10:51" parent="2238" time="2239" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="100"/>
+    </action>
+    <action date="09 Mar 2007 15:14:16" parent="2239" time="2240" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="17"/>
+    </action>
+    <action date="09 Mar 2007 15:14:37" parent="2240" time="2241" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:14:45" parent="2241" time="2242" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="15"/>
+    </action>
+    <action date="09 Mar 2007 15:15:00" parent="2242" time="2243" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:15:04" parent="2243" time="2244" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+    </action>
+    <action date="09 Mar 2007 15:15:05" parent="2244" time="2245" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="10"/>
+    </action>
+    <action date="09 Mar 2007 15:15:15" parent="2245" time="2246" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="2"/>
+    </action>
+    <action date="09 Mar 2007 15:15:16" parent="2246" time="2247" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="2"/>
+    </action>
+    <action date="09 Mar 2007 15:15:36" parent="2247" time="2248" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="09 Mar 2007 15:15:42" parent="2248" time="2249" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="1.2"/>
+    </action>
+    <action date="09 Mar 2007 15:15:43" parent="2249" time="2250" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="1.2"/>
+    </action>
+    <action date="09 Mar 2007 15:15:53" parent="2250" time="2251" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+    </action>
+    <action date="09 Mar 2007 15:15:54" parent="2251" time="2252" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+    </action>
+    <action date="09 Mar 2007 15:16:12" parent="2252" time="2253" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:16:17" parent="2253" time="2254" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.2"/>
+    </action>
+    <action date="09 Mar 2007 15:16:41" parent="2254" time="2255" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+    </action>
+    <action date="09 Mar 2007 15:16:42" parent="2255" time="2256" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="15" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+    </action>
+    <action date="09 Mar 2007 15:16:56" parent="2256" time="2257" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="15"/>
+    </action>
+    <action date="09 Mar 2007 15:17:22" parent="2257" time="2258" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:18:23" parent="2258" time="2259" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:18:41" parent="2259" time="2260" user="hvo" what="deleteConnection">
+      <connection connectionId="32"/>
+      <connection connectionId="33"/>
+    </action>
+    <action date="09 Mar 2007 15:18:41" parent="2260" time="2261" user="hvo" what="deleteModule">
+      <module moduleId="17"/>
+    </action>
+    <action date="09 Mar 2007 15:18:43" parent="2261" time="2262" user="hvo" what="deleteConnection">
+      <connection connectionId="9"/>
+    </action>
+    <action date="09 Mar 2007 15:18:43" parent="2262" time="2263" user="hvo" what="deleteModule">
+      <module moduleId="8"/>
+    </action>
+    <action date="09 Mar 2007 15:18:44" parent="2263" time="2264" user="hvo" what="deleteConnection">
+      <connection connectionId="10"/>
+    </action>
+    <action date="09 Mar 2007 15:18:44" parent="2264" time="2265" user="hvo" what="deleteModule">
+      <module moduleId="9"/>
+    </action>
+    <action date="09 Mar 2007 15:19:06" parent="2265" time="2266" user="hvo" what="changeParameter">
+      <set alias="" function="SetSliderShapeToCylinder" functionId="0" moduleId="15" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 15:20:51" parent="2266" time="2267" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:21:58" parent="2267" time="2268" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="15"/>
+    </action>
+    <action date="09 Mar 2007 15:22:10" parent="2268" time="2269" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.801347322918" id="15"/>
+    </action>
+    <action date="09 Mar 2007 15:22:10" parent="2269" time="2270" user="hvo" what="deleteConnection">
+      <connection connectionId="25"/>
+      <connection connectionId="26"/>
+      <connection connectionId="30"/>
+    </action>
+    <action date="09 Mar 2007 15:22:10" parent="2270" time="2271" user="hvo" what="deleteModule">
+      <module moduleId="15"/>
+    </action>
+    <action date="09 Mar 2007 15:22:15" parent="2271" time="2272" user="hvo" what="addModule">
+      <object cache="0" id="18" name="vtkSliderRepresentation3D" x="837.40795245" y="-93.7576367814"/>
+    </action>
+    <action date="09 Mar 2007 15:22:17" parent="2272" time="2273" user="hvo" what="moveModule">
+      <move dx="5.60943126043" dy="45.6767974063" id="18"/>
+    </action>
+    <action date="09 Mar 2007 15:22:17" parent="2273" time="2274" user="hvo" what="addConnection">
+      <connect destinationId="13" destinationModule="vtkSliderWidget" destinationPort="SetRepresentation(vtkSliderRepresentation)" id="34" sourceId="18" sourceModule="vtkSliderRepresentation3D" sourcePort="self(vtkSliderRepresentation3D)"/>
+    </action>
+    <action date="09 Mar 2007 15:22:29" parent="2274" time="2275" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint1InWorldCoordinates(Float,Float,Float)" id="35" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:22:37" parent="2275" time="2276" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint2InWorldCoordinates(Float,Float,Float)" id="36" sourceId="16" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:24:09" parent="2276" time="2277" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:24:28" parent="2277" time="2278" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:24:51" parent="2278" time="2279" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:24:52" parent="2279" time="2280" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="09 Mar 2007 15:24:55" parent="2280" time="2281" user="hvo" what="changeParameter">
+      <set alias="" function="SetTubeWidth" functionId="0" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="09 Mar 2007 15:26:58" parent="2281" time="2282" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:27:12" parent="2282" time="2283" user="hvo" what="deleteFunction">
+      <function functionId="0" moduleId="18"/>
+    </action>
+    <action date="09 Mar 2007 15:27:57" parent="2283" time="2284" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:28:22" parent="2284" time="2285" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:29:29" parent="2285" time="2286" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:30:23" parent="2286" time="2287" user="hvo" what="changeParameter">
+      <set alias="" function="SetSliderShapeToCylinder" functionId="0" moduleId="18" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 15:35:22" parent="2287" time="2288" user="hvo" what="moveModule">
+      <move dx="-56.8956599272" dy="-35.2592822084" id="2"/>
+      <move dx="24.0404196876" dy="63.3064385105" id="18"/>
+    </action>
+    <action date="09 Mar 2007 15:35:22" parent="2288" time="2289" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="37" sourceId="1" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="09 Mar 2007 15:36:59" parent="2289" time="2290" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20shareData%29%3A%0A%20%20%20%20print%20type%28obj%29%2C%20type%28sharedData%29"/>
+    </action>
+    <action date="09 Mar 2007 15:39:12" parent="2290" time="2291" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20print%20type%28obj%29%2C%20type%28sharedData%29"/>
+    </action>
+    <action date="09 Mar 2007 15:41:14" parent="2291" time="2292" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29"/>
+    </action>
+    <action date="09 Mar 2007 15:42:08" parent="2292" time="2293" user="hvo" what="changeParameter">
+      <set alias="" function="SetMaximumValue" functionId="1" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:42:11" parent="2293" time="2294" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:42:20" parent="2294" time="2295" user="hvo" what="changeParameter">
+      <set alias="" function="SetMaximumValue" functionId="1" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="1.0"/>
+    </action>
+    <action date="09 Mar 2007 15:42:21" parent="2295" time="2296" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:42:22" parent="2296" time="2297" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:42:34" parent="2297" time="2298" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20print%20rep.GetValue%28%29"/>
+    </action>
+    <action date="09 Mar 2007 15:43:04" parent="2298" time="2299" user="hvo" what="deleteConnection">
+      <connection connectionId="35"/>
+    </action>
+    <action date="09 Mar 2007 15:43:08" parent="2299" time="2300" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint2InWorldCoordinates(Float,Float,Float)" id="38" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:43:09" parent="2300" time="2301" user="hvo" what="deleteConnection">
+      <connection connectionId="38"/>
+      <connection connectionId="36"/>
+    </action>
+    <action date="09 Mar 2007 15:43:17" parent="2301" time="2302" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint2InWorldCoordinates(Float,Float,Float)" id="39" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:43:25" parent="2302" time="2303" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint1InWorldCoordinates(Float,Float,Float)" id="40" sourceId="16" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:43:55" parent="2303" time="2304" user="hvo" what="moveModule">
+      <move dx="41.6700607918" dy="-24.8417670105" id="12"/>
+      <move dx="-8.8148205521" dy="19.23233575" id="16"/>
+    </action>
+    <action date="09 Mar 2007 15:43:55" parent="2304" time="2305" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint1InWorldCoordinates(Float,Float,Float)" id="41" sourceId="12" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:43:58" parent="2305" time="2306" user="hvo" what="addConnection">
+      <connect destinationId="18" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint2InWorldCoordinates(Float,Float,Float)" id="42" sourceId="16" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 15:43:59" parent="2306" time="2307" user="hvo" what="deleteConnection">
+      <connection connectionId="40"/>
+    </action>
+    <action date="09 Mar 2007 15:44:02" parent="2307" time="2308" user="hvo" what="moveModule">
+      <move dx="14.4242518125" dy="33.6565875626" id="12"/>
+    </action>
+    <action date="09 Mar 2007 15:44:02" parent="2308" time="2309" user="hvo" what="deleteConnection">
+      <connection connectionId="39"/>
+    </action>
+    <action date="09 Mar 2007 15:44:17" parent="2309" time="2310" user="hvo" what="changeParameter">
+      <set alias="" function="SetMaximumValue" functionId="1" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:44:19" parent="2310" time="2311" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="1.0"/>
+    </action>
+    <action date="09 Mar 2007 15:44:22" parent="2311" time="2312" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="1.0"/>
+    </action>
+    <action date="09 Mar 2007 15:45:57" parent="2312" time="2313" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20print%20rep.GetPoint1Coordinate%28%29.GetValues%28%29"/>
+    </action>
+    <action date="09 Mar 2007 15:46:26" parent="2313" time="2314" user="hvo" what="changeParameter">
+      <set alias="" function="ShowSliderLabelOff" functionId="3" moduleId="18" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 15:46:55" parent="2314" time="2315" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:47:01" parent="2315" time="2316" user="hvo" what="changeParameter">
+      <set alias="" function="SetValue" functionId="4" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="09 Mar 2007 15:47:04" parent="2316" time="2317" user="hvo" what="changeParameter">
+      <set alias="" function="SetValue" functionId="4" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="-0.5"/>
+    </action>
+    <action date="09 Mar 2007 15:47:06" parent="2317" time="2318" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="09 Mar 2007 15:47:07" parent="2318" time="2319" user="hvo" what="changeParameter">
+      <set alias="" function="SetMaximumValue" functionId="1" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="09 Mar 2007 15:47:09" parent="2319" time="2320" user="hvo" what="changeParameter">
+      <set alias="" function="SetValue" functionId="4" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.5"/>
+    </action>
+    <action date="09 Mar 2007 15:47:10" parent="2320" time="2321" user="hvo" what="changeParameter">
+      <set alias="" function="SetValue" functionId="4" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.5"/>
+    </action>
+    <action date="09 Mar 2007 15:47:46" parent="2321" time="2322" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 15:47:58" parent="2322" time="2323" user="hvo" what="moveModule">
+      <move dx="-0.801347322918" dy="0.0" id="13"/>
+    </action>
+    <action date="09 Mar 2007 15:48:24" parent="2323" time="2324" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20print%20rep.GetPoint1Coordinate%28%29.GetValue%28%29"/>
+    </action>
+    <action date="09 Mar 2007 15:51:44" parent="2324" time="2325" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 15:52:15" parent="2325" time="2326" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 15:56:21" parent="2326" time="2327" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 15:57:07" parent="2327" time="2328" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 15:57:38" parent="2328" time="2329" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 15:58:29" parent="2329" time="2330" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 15:58:55" parent="2330" time="2331" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:00:00" parent="2331" time="2332" user="hvo" what="moveModule">
+      <move dx="-4.80808393751" dy="-18.4309884271" id="2"/>
+    </action>
+    <action date="09 Mar 2007 16:04:49" parent="2332" time="2333" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:05:10" parent="2333" time="2334" user="hvo" what="moveModule">
+      <move dx="-0.801347322918" dy="0.0" id="14"/>
+    </action>
+    <action date="09 Mar 2007 16:06:19" parent="2334" time="2335" user="hvo" what="moveModule">
+      <move dx="-0.801347322918" dy="0.0" id="18"/>
+    </action>
+    <action date="09 Mar 2007 16:06:40" parent="2335" time="2336" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:09:14" parent="2336" time="2337" user="hvo" what="moveModule">
+      <move dx="-87.3468581981" dy="-118.599403792" id="0"/>
+      <move dx="60.1010492189" dy="-109.78458324" id="2"/>
+      <move dx="12.8215571667" dy="-39.266018823" id="3"/>
+      <move dx="0.0" dy="-0.801347322918" id="14"/>
+    </action>
+    <action date="09 Mar 2007 16:09:39" parent="2337" time="2338" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:10:43" parent="2338" time="2339" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.801347322918" id="3"/>
+    </action>
+    <action date="09 Mar 2007 16:10:50" parent="2339" time="2340" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="43" sourceId="2" sourceModule="vtkTubeFilter" sourcePort="self(vtkTubeFilter)"/>
+    </action>
+    <action date="09 Mar 2007 16:11:15" parent="2340" time="2341" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20 [...]
+    </action>
+    <action date="09 Mar 2007 16:12:02" parent="2341" time="2342" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20print%20sharedData%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.Ge [...]
+    </action>
+    <action date="09 Mar 2007 16:14:53" parent="2342" time="2343" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20 [...]
+    </action>
+    <action date="09 Mar 2007 16:16:31" parent="2343" time="2344" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20 [...]
+    </action>
+    <action date="09 Mar 2007 16:16:42" parent="2344" time="2345" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.801347322918" id="0"/>
+      <move dx="-11.2188625209" dy="109.78458324" id="5"/>
+    </action>
+    <action date="09 Mar 2007 16:16:42" parent="2345" time="2346" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="44" sourceId="5" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="09 Mar 2007 16:17:11" parent="2346" time="2347" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20 [...]
+    </action>
+    <action date="09 Mar 2007 16:17:38" parent="2347" time="2348" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20 [...]
+    </action>
+    <action date="09 Mar 2007 16:18:23" parent="2348" time="2349" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData%5B0%5D.vtkInstance%0A%20%20%20%20tubeFilter%20%3D%20sharedData%5B1%5D.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20 [...]
+    </action>
+    <action date="09 Mar 2007 16:20:30" parent="2349" time="2350" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:20:32" parent="2350" time="2351" user="hvo" what="deleteConnection">
+      <connection connectionId="44"/>
+    </action>
+    <action date="09 Mar 2007 16:20:34" parent="2351" time="2352" user="hvo" what="deleteConnection">
+      <connection connectionId="43"/>
+    </action>
+    <action date="09 Mar 2007 16:21:05" parent="2352" time="2353" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:21:35" parent="2353" time="2354" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:28:23" parent="2354" time="2355" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:29:04" parent="2355" time="2356" user="hvo" what="moveModule">
+      <move dx="-23.2390723646" dy="-78.532037646" id="5"/>
+    </action>
+    <action date="09 Mar 2007 16:29:04" parent="2356" time="2357" user="hvo" what="deleteFunction">
+      <function functionId="2" moduleId="2"/>
+    </action>
+    <action date="09 Mar 2007 16:29:25" parent="2357" time="2358" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20%20%20value%20%3D%20rep.GetValue%28%29%0A%20%20%20%20center%20%3D%20copy. [...]
+    </action>
+    <action date="09 Mar 2007 16:29:52" parent="2358" time="2359" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="45" sourceId="2" sourceModule="vtkTubeFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="09 Mar 2007 16:29:54" parent="2359" time="2360" user="hvo" what="deleteConnection">
+      <connection connectionId="37"/>
+    </action>
+    <action date="09 Mar 2007 16:49:24" parent="2360" time="2361" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20sharedData.SetCapping%281-sharedData%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%20% [...]
+    </action>
+    <action date="09 Mar 2007 16:49:41" parent="2361" time="2362" user="hvo" what="deleteConnection">
+      <connection connectionId="45"/>
+    </action>
+    <action date="09 Mar 2007 16:49:43" parent="2362" time="2363" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="46" sourceId="2" sourceModule="vtkTubeFilter" sourcePort="self(vtkTubeFilter)"/>
+    </action>
+    <action date="09 Mar 2007 16:50:12" parent="2363" time="2364" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20sharedData.SetRadiusFactor%28100000%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%20%2 [...]
+    </action>
+    <action date="09 Mar 2007 16:50:19" parent="2364" time="2365" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20sharedData.vtkInstance.SetRadiusFactor%28100000%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%2 [...]
+    </action>
+    <action date="09 Mar 2007 16:52:35" parent="2365" time="2366" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20sharedData.vtkInstance.SetRadiusFactor%28100000%29%0A%20%20%20%20print%20obj.GetInteractor%28%29.GetRenderWindow%28%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyDa [...]
+    </action>
+    <action date="09 Mar 2007 16:53:06" parent="2366" time="2367" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20sharedData.vtkInstance.SetInput%28None%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.GetRepresentation%28%29%0A%2 [...]
+    </action>
+    <action date="09 Mar 2007 16:54:05" parent="2367" time="2368" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20tubeFilter.SetInput%28None%29%0A%20%20%20%20tubeFilter.Update%28%29%0A%20%20%20%20print%20tubeFilter.GetOutput%28%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20shar [...]
+    </action>
+    <action date="09 Mar 2007 16:54:38" parent="2368" time="2369" user="hvo" what="moveModule">
+      <move dx="-1.99788383718" dy="-23.9746060462" id="0"/>
+    </action>
+    <action date="09 Mar 2007 16:54:51" parent="2369" time="2370" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20tubeFilter.SetInput%28vtk.vtkPolyData%28%29%29%0A%20%20%20%20tubeFilter.Update%28%29%0A%20%20%20%20print%20tubeFilter.GetOutput%28%29%0A%20%20%20% [...]
+    </action>
+    <action date="09 Mar 2007 16:55:07" parent="2370" time="2371" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20tubeFilter.SetInput%28vtk.vtkPolyData%28%29%29%0A%20%20%20%20print%20tubeFilter.GetOutput%28%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D% [...]
+    </action>
+    <action date="09 Mar 2007 16:55:32" parent="2371" time="2372" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20tubeFilter.SetInput%28vtk.vtkPolyData%28%29%29%0A%20%20%20%20return%0A%20%20%20%20polyData%20%3D%20sharedData.vtkInstance%0A%20%20%20%20points%20% [...]
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2372" time="2373" user="hvo" what="moveModule">
+      <move dx="8.99047726733" dy="-58.9375731969" id="14"/>
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2373" time="2374" user="hvo" what="addModule">
+      <object cache="0" id="19" name="Tuple" x="653.087196659" y="143.696460962"/>
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2374" time="2375" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="19" value=""/>
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2375" time="2376" user="hvo" what="addModulePort">
+      <addPort moduleId="19" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2376" time="2377" user="hvo" what="addModulePort">
+      <addPort moduleId="19" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2377" time="2378" user="hvo" what="addModulePort">
+      <addPort moduleId="19" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 16:55:47" parent="2378" time="2379" user="hvo" what="addModulePort">
+      <addPort moduleId="19" portName="value" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 16:55:53" parent="2379" time="2380" user="hvo" what="moveModule">
+      <move dx="-67.9280504643" dy="-33.9640252321" id="12"/>
+      <move dx="29.9682575578" dy="-299.682575578" id="19"/>
+    </action>
+    <action date="09 Mar 2007 16:55:54" parent="2380" time="2381" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.998941918592" id="19"/>
+    </action>
+    <action date="09 Mar 2007 16:55:54" parent="2381" time="2382" user="hvo" what="deleteConnection"/>
+    <action date="09 Mar 2007 16:55:54" parent="2382" time="2383" user="hvo" what="deleteModule">
+      <module moduleId="19"/>
+    </action>
+    <action date="09 Mar 2007 16:56:00" parent="2383" time="2384" user="hvo" what="addModule">
+      <object cache="0" id="20" name="Tuple" x="712.245587956" y="-132.859275173"/>
+    </action>
+    <action date="09 Mar 2007 16:56:18" parent="2384" time="2385" user="hvo" what="moveModule">
+      <move dx="-76.9185277316" dy="-2.99682575578" id="20"/>
+    </action>
+    <action date="09 Mar 2007 16:56:18" parent="2385" time="2386" user="hvo" what="addModulePort">
+      <addPort moduleId="20" portName="tubefilter" portSpec="(vtkTubeFilter)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 16:56:18" parent="2386" time="2387" user="hvo" what="addModulePort">
+      <addPort moduleId="20" portName="originaldata" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 16:56:18" parent="2387" time="2388" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="20" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 16:56:19" parent="2388" time="2389" user="hvo" what="addModulePort">
+      <addPort moduleId="20" portName="value" portSpec="(vtkTubeFilter,vtkPolyData)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 16:56:23" parent="2389" time="2390" user="hvo" what="moveModule">
+      <move dx="35.9619090693" dy="9.98941918592" id="20"/>
+    </action>
+    <action date="09 Mar 2007 16:56:23" parent="2390" time="2391" user="hvo" what="deleteConnection">
+      <connection connectionId="46"/>
+    </action>
+    <action date="09 Mar 2007 16:56:41" parent="2391" time="2392" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.998941918592" id="20"/>
+    </action>
+    <action date="09 Mar 2007 16:56:41" parent="2392" time="2393" user="hvo" what="deleteConnection"/>
+    <action date="09 Mar 2007 16:56:41" parent="2393" time="2394" user="hvo" what="deleteModule">
+      <module moduleId="20"/>
+    </action>
+    <action date="09 Mar 2007 16:56:52" parent="2394" time="2395" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="47" sourceId="2" sourceModule="vtkTubeFilter" sourcePort="self(vtkTubeFilter)"/>
+    </action>
+    <action date="09 Mar 2007 16:57:37" parent="2395" time="2396" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20polyData%20%3D%20vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28tubeFilter.GetInput%28%29%29%0A%20%20%20%20points%20%3D%20polyData.GetPoin [...]
+    </action>
+    <action date="09 Mar 2007 16:57:57" parent="2396" time="2397" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28tubeFilter.GetInput%28%29%29%0A%20%20%20%20points%20%3D%20polyData.Get [...]
+    </action>
+    <action date="09 Mar 2007 16:58:22" parent="2397" time="2398" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.01"/>
+    </action>
+    <action date="09 Mar 2007 16:58:23" parent="2398" time="2399" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.01"/>
+    </action>
+    <action date="09 Mar 2007 16:58:37" parent="2399" time="2400" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.1"/>
+    </action>
+    <action date="09 Mar 2007 16:58:58" parent="2400" time="2401" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.3"/>
+    </action>
+    <action date="09 Mar 2007 16:58:59" parent="2401" time="2402" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0.3"/>
+    </action>
+    <action date="09 Mar 2007 16:59:16" parent="2402" time="2403" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-0.998941918592" id="14"/>
+    </action>
+    <action date="09 Mar 2007 17:00:59" parent="2403" time="2404" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="09 Mar 2007 17:01:00" parent="2404" time="2405" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="18" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="09 Mar 2007 17:01:38" parent="2405" time="2406" user="hvo" what="moveModule">
+      <move dx="-0.912864542162" dy="0.0" id="1"/>
+      <move dx="15.9830706975" dy="-64.9312247085" id="3"/>
+      <move dx="16.9820126161" dy="-50.9460378482" id="5"/>
+      <move dx="-4.99470959296" dy="77.9174696502" id="14"/>
+    </action>
+    <action date="09 Mar 2007 17:02:33" parent="2406" time="2407" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20N [...]
+    </action>
+    <action date="09 Mar 2007 17:03:27" parent="2407" time="2408" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28tubeFilter.GetInput%28%29%29%0A%20%20%20%20points%20%3D%20polyData.Get [...]
+    </action>
+    <action date="09 Mar 2007 17:04:51" parent="2408" time="2409" user="hvo" what="deleteConnection">
+      <connection connectionId="47"/>
+    </action>
+    <action date="09 Mar 2007 17:04:55" parent="2409" time="2410" user="hvo" what="addConnection">
+      <connect destinationId="14" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="48" sourceId="1" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="09 Mar 2007 17:06:04" parent="2410" time="2411" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20sharedData.vtkInstance.SetPolys%28vtk.vtkCellArray%28%29%29%0A%20%20%20%20return%0A%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData% [...]
+    </action>
+    <action date="09 Mar 2007 17:06:39" parent="2411" time="2412" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20sharedData.vtkInstance.ShallowCopy%28vtk.vtkPolyData%28%29%29%29%0A%20%20%20%20return%0A%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20polyData%20%3D%20vtk.vtkPoly [...]
+    </action>
+    <action date="09 Mar 2007 17:06:55" parent="2412" time="2413" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20sharedData.vtkInstance.ShallowCopy%28vtk.vtkPolyData%28%29%29%0A%20%20%20%20return%0A%0A%20%20%20%20tubeFilter%20%3D%20sharedData.vtkInstance%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyDat [...]
+    </action>
+    <action date="09 Mar 2007 17:07:56" parent="2413" time="2414" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="14" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28sharedData.vtkInstance%29%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj.G [...]
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2055" time="2415" user="hvo" what="addModule">
+      <object cache="0" id="115" name="PythonSource" x="443.883392027" y="286.310992432"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2415" time="2416" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="115" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%2 [...]
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2416" time="2417" user="hvo" what="changeParameter">
+      <set alias="" function="filename" functionId="1" moduleId="115" parameter="<no description>" parameterId="0" type="String" value="../examples/data/vslice_circ1.bp"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2417" time="2418" user="hvo" what="changeParameter">
+      <set alias="" function="zShift" functionId="2" moduleId="115" parameter="<no description>" parameterId="0" type="Float" value="-1"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2418" time="2419" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="115" value=""/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2419" time="2420" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="zShift" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2420" time="2421" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="filename" portSpec="(String)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2421" time="2422" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="polydata" portSpec="(vtkPolyData)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2422" time="2423" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="rayX" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2423" time="2424" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="rayY" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2424" time="2425" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="rayZ" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2425" time="2426" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="length" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2426" time="2427" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="centerZ" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2427" time="2428" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="centerX" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:31" parent="2428" time="2429" user="hvo" what="addModulePort">
+      <addPort moduleId="115" portName="centerY" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:08:41" parent="2429" time="2430" user="hvo" what="moveModule">
+      <move dx="119.239578839" dy="30.1525371776" id="115"/>
+    </action>
+    <action date="09 Mar 2007 17:09:08" parent="2430" time="2431" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="centerX" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:09:09" parent="2431" time="2432" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="centerY" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:09:09" parent="2432" time="2433" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="centerZ" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:09:10" parent="2433" time="2434" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="rayX" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:09:11" parent="2434" time="2435" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="rayY" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:09:11" parent="2435" time="2436" user="hvo" what="addModulePort">
+      <addPort moduleId="69" portName="rayZ" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:09:12" parent="2436" time="2437" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20 [...]
+    </action>
+    <action date="09 Mar 2007 17:09:13" parent="2437" time="2438" user="hvo" what="deleteConnection"/>
+    <action date="09 Mar 2007 17:09:13" parent="2438" time="2439" user="hvo" what="deleteModule">
+      <module moduleId="115"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2439" time="2440" user="hvo" what="addModule">
+      <object cache="0" id="116" name="vtkSliderWidget" x="921.131906158" y="-207.966471834"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2440" time="2441" user="hvo" what="addModule">
+      <object cache="0" id="117" name="vtkInteractionHandler" x="888.265696978" y="-294.160669278"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2441" time="2442" user="hvo" what="addModule">
+      <object cache="0" id="118" name="vtkSliderRepresentation3D" x="876.256456075" y="25.2255991354"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2442" time="2443" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="116" value=""/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2443" time="2444" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="117" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28sharedData.vtkInstance%29%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj. [...]
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2444" time="2445" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="117" value=""/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2445" time="2446" user="hvo" what="changeParameter">
+      <set alias="" function="SetSliderShapeToCylinder" functionId="0" moduleId="118" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2446" time="2447" user="hvo" what="changeParameter">
+      <set alias="" function="SetMaximumValue" functionId="1" moduleId="118" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2447" time="2448" user="hvo" what="changeParameter">
+      <set alias="" function="SetMinimumValue" functionId="2" moduleId="118" parameter="<no description>" parameterId="0" type="Float" value="0"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2448" time="2449" user="hvo" what="changeParameter">
+      <set alias="" function="ShowSliderLabelOff" functionId="3" moduleId="118" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2449" time="2450" user="hvo" what="changeParameter">
+      <set alias="" function="SetValue" functionId="4" moduleId="118" parameter="<no description>" parameterId="0" type="Float" value="0.5"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2450" time="2451" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="118" value=""/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2451" time="2452" user="hvo" what="addConnection">
+      <connect destinationId="117" destinationModule="vtkInteractionHandler" destinationPort="Observer(vtkInteractorObserver)" id="236" sourceId="116" sourceModule="vtkSliderWidget" sourcePort="self(vtkSliderWidget)"/>
+    </action>
+    <action date="09 Mar 2007 17:46:02" parent="2452" time="2453" user="hvo" what="addConnection">
+      <connect destinationId="116" destinationModule="vtkSliderWidget" destinationPort="SetRepresentation(vtkSliderRepresentation)" id="237" sourceId="118" sourceModule="vtkSliderRepresentation3D" sourcePort="self(vtkSliderRepresentation3D)"/>
+    </action>
+    <action date="09 Mar 2007 17:46:21" parent="2453" time="2454" user="hvo" what="moveModule">
+      <move dx="39.7465262796" dy="-586.603905092" id="116"/>
+      <move dx="39.7465262796" dy="-586.603905092" id="117"/>
+      <move dx="39.7465262796" dy="-586.603905092" id="118"/>
+    </action>
+    <action date="09 Mar 2007 17:46:21" parent="2454" time="2455" user="hvo" what="addConnection">
+      <connect destinationId="3" destinationModule="VTKCell" destinationPort="InteractionHandler(vtkInteractionHandler)" id="238" sourceId="117" sourceModule="vtkInteractionHandler" sourcePort="self(vtkInteractionHandler)"/>
+    </action>
+    <action date="09 Mar 2007 17:46:50" parent="2455" time="2456" user="hvo" what="moveModule">
+      <move dx="87.7164717895" dy="1.37056987171" id="116"/>
+      <move dx="278.225683957" dy="12.3351288454" id="117"/>
+      <move dx="-84.9753320461" dy="644.167839704" id="118"/>
+    </action>
+    <action date="09 Mar 2007 17:46:50" parent="2456" time="2457" user="hvo" what="addModule">
+      <object cache="0" id="119" name="Tuple" x="679.802656369" y="243.961437165"/>
+    </action>
+    <action date="09 Mar 2007 17:47:04" parent="2457" time="2458" user="hvo" what="addModulePort">
+      <addPort moduleId="119" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:47:05" parent="2458" time="2459" user="hvo" what="addModulePort">
+      <addPort moduleId="119" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:47:05" parent="2459" time="2460" user="hvo" what="addModulePort">
+      <addPort moduleId="119" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:47:06" parent="2460" time="2461" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="119" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:47:07" parent="2461" time="2462" user="hvo" what="addModulePort">
+      <addPort moduleId="119" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:47:09" parent="2462" time="2463" user="hvo" what="addModule">
+      <object cache="0" id="120" name="Tuple" x="838.788761487" y="265.890555112"/>
+    </action>
+    <action date="09 Mar 2007 17:47:19" parent="2463" time="2464" user="hvo" what="addModulePort">
+      <addPort moduleId="120" portName="centerX" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:47:20" parent="2464" time="2465" user="hvo" what="addModulePort">
+      <addPort moduleId="120" portName="centerY" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:47:21" parent="2465" time="2466" user="hvo" what="addModulePort">
+      <addPort moduleId="120" portName="centerZ" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="09 Mar 2007 17:47:21" parent="2466" time="2467" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="120" portName="value" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:47:22" parent="2467" time="2468" user="hvo" what="addModulePort">
+      <addPort moduleId="120" portName="value" portSpec="(Float,Float,Float)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 17:50:45" parent="2468" time="2469" user="hvo" what="addConnection">
+      <connect destinationId="119" destinationModule="Tuple" destinationPort="centerX(Float)" id="239" sourceId="69" sourceModule="PythonSource" sourcePort="centerX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:50:47" parent="2469" time="2470" user="hvo" what="addConnection">
+      <connect destinationId="119" destinationModule="Tuple" destinationPort="centerY(Float)" id="240" sourceId="69" sourceModule="PythonSource" sourcePort="centerY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:50:51" parent="2470" time="2471" user="hvo" what="addConnection">
+      <connect destinationId="119" destinationModule="Tuple" destinationPort="centerZ(Float)" id="241" sourceId="69" sourceModule="PythonSource" sourcePort="centerZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:50:55" parent="2471" time="2472" user="hvo" what="moveModule">
+      <move dx="115.127869224" dy="-74.0107730724" id="119"/>
+    </action>
+    <action date="09 Mar 2007 17:50:55" parent="2472" time="2473" user="hvo" what="addConnection">
+      <connect destinationId="120" destinationModule="Tuple" destinationPort="centerX(Float)" id="242" sourceId="69" sourceModule="PythonSource" sourcePort="rayX(Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:50:58" parent="2473" time="2474" user="hvo" what="addConnection">
+      <connect destinationId="120" destinationModule="Tuple" destinationPort="centerY(Float)" id="243" sourceId="69" sourceModule="PythonSource" sourcePort="rayY(Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:51:01" parent="2474" time="2475" user="hvo" what="addConnection">
+      <connect destinationId="120" destinationModule="Tuple" destinationPort="centerZ(Float)" id="244" sourceId="69" sourceModule="PythonSource" sourcePort="rayZ(Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:51:29" parent="2475" time="2476" user="hvo" what="moveModule">
+      <move dx="21.9291179474" dy="-20.5585480757" id="118"/>
+    </action>
+    <action date="09 Mar 2007 17:51:35" parent="2476" time="2477" user="hvo" what="moveModule">
+      <move dx="69.8990634573" dy="2.74113974342" id="119"/>
+    </action>
+    <action date="09 Mar 2007 17:51:35" parent="2477" time="2478" user="hvo" what="addConnection">
+      <connect destinationId="118" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint1InWorldCoordinates(Float,Float,Float)" id="245" sourceId="119" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:51:44" parent="2478" time="2479" user="hvo" what="addConnection">
+      <connect destinationId="118" destinationModule="vtkSliderRepresentation3D" destinationPort="SetPoint2InWorldCoordinates(Float,Float,Float)" id="246" sourceId="120" sourceModule="Tuple" sourcePort="value(Float,Float,Float)"/>
+    </action>
+    <action date="09 Mar 2007 17:52:28" parent="2479" time="2480" user="hvo" what="addConnection">
+      <connect destinationId="117" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="247" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="09 Mar 2007 17:53:30" parent="2480" time="2481" user="hvo" what="moveModule">
+      <move dx="74.0107730724" dy="5.48227948684" id="117"/>
+    </action>
+    <action date="09 Mar 2007 17:55:53" parent="2481" time="2482" user="hvo" what="moveModule">
+      <move dx="1.37056987171" dy="1.37056987171" id="114"/>
+    </action>
+    <action date="09 Mar 2007 17:57:11" parent="2482" time="2483" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.92988347575" id="3"/>
+    </action>
+    <action date="09 Mar 2007 17:57:15" parent="2483" time="2484" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-2.92988347575" id="117"/>
+    </action>
+    <action date="09 Mar 2007 18:00:43" parent="2484" time="2485" user="hvo" what="moveModule">
+      <move dx="-100.051600635" dy="1.37056987171" id="117"/>
+    </action>
+    <action date="09 Mar 2007 18:00:43" parent="2485" time="2486" user="hvo" what="addModule">
+      <object cache="0" id="121" name="vtkInteractionHandler" x="1290.24868029" y="-855.877049514"/>
+    </action>
+    <action date="09 Mar 2007 18:00:43" parent="2486" time="2487" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="121" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28sharedData.vtkInstance%29%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj. [...]
+    </action>
+    <action date="09 Mar 2007 18:00:43" parent="2487" time="2488" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="121" value=""/>
+    </action>
+    <action date="09 Mar 2007 18:00:48" parent="2488" time="2489" user="hvo" what="moveModule">
+      <move dx="-2.74113974342" dy="47.9699455099" id="121"/>
+    </action>
+    <action date="09 Mar 2007 18:00:48" parent="2489" time="2490" user="hvo" what="addConnection">
+      <connect destinationId="3" destinationModule="VTKCell" destinationPort="InteractionHandler(vtkInteractionHandler)" id="248" sourceId="121" sourceModule="vtkInteractionHandler" sourcePort="self(vtkInteractionHandler)"/>
+    </action>
+    <action date="09 Mar 2007 18:00:52" parent="2490" time="2491" user="hvo" what="addConnection">
+      <connect destinationId="121" destinationModule="vtkInteractionHandler" destinationPort="Observer(vtkInteractorObserver)" id="249" sourceId="116" sourceModule="vtkSliderWidget" sourcePort="self(vtkSliderWidget)"/>
+    </action>
+    <action date="09 Mar 2007 18:01:13" parent="2491" time="2492" user="hvo" what="addConnection">
+      <connect destinationId="121" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="250" sourceId="95" sourceModule="PythonSource" sourcePort="polyData(vtkPolyData)"/>
+    </action>
+    <action date="09 Mar 2007 18:01:33" parent="2492" time="2493" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="121" parameter="<no description>" parameterId="0" type="String" value="def%20endInteractionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20print%20%27hi%27"/>
+    </action>
+    <action date="09 Mar 2007 18:01:37" parent="2493" time="2494" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.37056987171" id="117"/>
+    </action>
+    <action date="09 Mar 2007 18:04:28" parent="2494" time="2495" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="121" parameter="<no description>" parameterId="0" type="String" value="def%20endInteractionHandler%28obj%2C%20ps%29%3A%0A%20%20%20%20ps.compute%28%29"/>
+    </action>
+    <action date="09 Mar 2007 18:05:16" parent="2495" time="2496" user="hvo" what="deleteConnection">
+      <connection connectionId="250"/>
+    </action>
+    <action date="09 Mar 2007 18:05:40" parent="2496" time="2497" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="121" parameter="<no description>" parameterId="0" type="String" value="def%20endInteractionHandler%28obj%2C%20ps%29%3A%0A%20%20%20%20ps.compute%28%29"/>
+    </action>
+    <action date="09 Mar 2007 18:12:40" parent="2497" time="2498" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:12:46" parent="2498" time="2499" user="hvo" what="deleteConnection">
+      <connection connectionId="248"/>
+      <connection connectionId="249"/>
+    </action>
+    <action date="09 Mar 2007 18:12:46" parent="2499" time="2500" user="hvo" what="deleteModule">
+      <module moduleId="121"/>
+    </action>
+    <action date="09 Mar 2007 18:14:38" parent="2500" time="2501" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:17:56" parent="2501" time="2502" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:19:07" parent="2502" time="2503" user="hvo" what="moveModule">
+      <move dx="104.16331025" dy="37.0053865362" id="95"/>
+    </action>
+    <action date="09 Mar 2007 18:19:07" parent="2503" time="2504" user="hvo" what="addModulePort">
+      <addPort moduleId="95" portName="self" portSpec="(PythonSource)" portType="output"/>
+    </action>
+    <action date="09 Mar 2007 18:19:13" parent="2504" time="2505" user="hvo" what="addModule">
+      <object cache="0" id="122" name="vtkInteractionHandler" x="1190.19707965" y="-855.877049514"/>
+    </action>
+    <action date="09 Mar 2007 18:19:13" parent="2505" time="2506" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="122" parameter="<no description>" parameterId="0" type="String" value="def%20interactionHandler%28obj%2C%20sharedData%29%3A%0A%20%20%20%20import%20math%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20vtk%0A%20%20%20%20%0A%20%20%20%20polyData%20%3D%20vtk.vtkPolyData%28%29%0A%20%20%20%20polyData.ShallowCopy%28sharedData.vtkInstance%29%0A%20%20%20%20points%20%3D%20polyData.GetPoints%28%29%0A%20%20%20%20rep%20%3D%20obj. [...]
+    </action>
+    <action date="09 Mar 2007 18:19:13" parent="2506" time="2507" user="hvo" what="changeAnnotation">
+      <set key="" moduleId="122" value=""/>
+    </action>
+    <action date="09 Mar 2007 18:19:20" parent="2507" time="2508" user="hvo" what="moveModule">
+      <move dx="-98.6810307632" dy="-37.0053865362" id="117"/>
+      <move dx="98.6810307632" dy="54.8227948684" id="122"/>
+    </action>
+    <action date="09 Mar 2007 18:19:20" parent="2508" time="2509" user="hvo" what="addConnection">
+      <connect destinationId="122" destinationModule="vtkInteractionHandler" destinationPort="Observer(vtkInteractorObserver)" id="251" sourceId="116" sourceModule="vtkSliderWidget" sourcePort="self(vtkSliderWidget)"/>
+    </action>
+    <action date="09 Mar 2007 18:19:24" parent="2509" time="2510" user="hvo" what="moveModule">
+      <move dx="-74.0107730724" dy="30.1525371776" id="122"/>
+    </action>
+    <action date="09 Mar 2007 18:19:24" parent="2510" time="2511" user="hvo" what="addConnection">
+      <connect destinationId="3" destinationModule="VTKCell" destinationPort="InteractionHandler(vtkInteractionHandler)" id="252" sourceId="122" sourceModule="vtkInteractionHandler" sourcePort="self(vtkInteractionHandler)"/>
+    </action>
+    <action date="09 Mar 2007 18:19:44" parent="2511" time="2512" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="122" parameter="<no description>" parameterId="0" type="String" value="def%20endInteractionHandler%28obj%2C%20ps%29%3A%0A%20%20%20%20print%20type%28ps%29"/>
+    </action>
+    <action date="09 Mar 2007 18:20:09" parent="2512" time="2513" user="hvo" what="moveModule">
+      <move dx="63.0462140987" dy="-30.1525371776" id="122"/>
+    </action>
+    <action date="09 Mar 2007 18:20:09" parent="2513" time="2514" user="hvo" what="addConnection">
+      <connect destinationId="122" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="253" sourceId="95" sourceModule="PythonSource" sourcePort="self(PythonSource)"/>
+    </action>
+    <action date="09 Mar 2007 18:20:48" parent="2514" time="2515" user="hvo" what="changeParameter">
+      <set alias="" function="Handler" functionId="0" moduleId="122" parameter="<no description>" parameterId="0" type="String" value="def%20endInteractionHandler%28obj%2C%20ps%29%3A%0A%20%20%20%20ps.compute%28%29"/>
+    </action>
+    <action date="09 Mar 2007 18:22:19" parent="2515" time="2516" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:24:08" parent="2516" time="2517" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:25:06" parent="2517" time="2518" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:27:20" parent="2518" time="2519" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:29:36" parent="2519" time="2520" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:31:12" parent="2520" time="2521" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:32:20" parent="2521" time="2522" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:33:25" parent="2522" time="2523" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="09 Mar 2007 18:34:36" parent="2523" time="2524" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="12 Mar 2007 13:05:39" parent="2524" time="2525" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="69" value=""/>
+    </action>
+    <action date="12 Mar 2007 13:06:04" parent="2525" time="2526" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="69" value="Read Slice"/>
+    </action>
+    <action date="12 Mar 2007 13:06:30" parent="2526" time="2527" user="hvo" what="moveModule">
+      <move dx="56.1933647401" dy="47.9699455099" id="69"/>
+    </action>
+    <action date="12 Mar 2007 13:06:30" parent="2527" time="2528" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="69" value="where is it"/>
+    </action>
+    <action date="12 Mar 2007 13:07:04" parent="2528" time="2529" user="hvo" what="moveModule">
+      <move dx="60.3050743553" dy="-13.7056987171" id="118"/>
+    </action>
+    <action date="12 Mar 2007 13:07:27" parent="2529" time="2530" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="120" value=""/>
+    </action>
+    <action date="12 Mar 2007 13:07:38" parent="2530" time="2531" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="120" value="center"/>
+    </action>
+    <action date="12 Mar 2007 13:07:58" parent="2531" time="2532" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="119" value=""/>
+    </action>
+    <action date="12 Mar 2007 13:08:03" parent="2532" time="2533" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="119" value="ray"/>
+    </action>
+    <action date="12 Mar 2007 13:08:35" parent="2533" time="2534" user="hvo" what="moveModule">
+      <move dx="-39.7465262796" dy="-1.37056987171" id="119"/>
+    </action>
+    <action date="12 Mar 2007 13:08:45" parent="2534" time="2535" user="hvo" what="moveModule">
+      <move dx="0.0" dy="-1.37056987171" id="69"/>
+    </action>
+    <action date="12 Mar 2007 13:08:45" parent="2535" time="2536" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="69" value="read vertical slice"/>
+    </action>
+    <action date="12 Mar 2007 13:09:27" parent="2536" time="2537" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0AlastXY%20%3D%20 [...]
+    </action>
+    <action date="12 Mar 2007 13:19:22" parent="2537" time="2538" user="hvo" what="moveModule">
+      <move dx="89.0870416612" dy="-5.48227948684" id="102"/>
+    </action>
+    <action date="12 Mar 2007 13:39:30" parent="2538" time="2539" user="hvo" what="moveModule">
+      <move dx="28.7819673059" dy="-6.85284935855" id="95"/>
+    </action>
+    <action date="12 Mar 2007 13:40:40" parent="2539" time="2540" user="hvo" what="moveModule">
+      <move dx="-448.176348049" dy="-27.4113974342" id="100"/>
+    </action>
+    <action date="12 Mar 2007 13:41:26" parent="2540" time="2541" user="hvo" what="moveModule">
+      <move dx="87.7164717895" dy="-71.269633329" id="100"/>
+    </action>
+    <action date="12 Mar 2007 13:41:28" parent="2541" time="2542" user="hvo" what="moveModule">
+      <move dx="1.37056987171" dy="0.0" id="114"/>
+    </action>
+    <action date="12 Mar 2007 13:41:28" parent="2542" time="2543" user="hvo" what="deleteConnection">
+      <connection connectionId="210"/>
+    </action>
+    <action date="12 Mar 2007 13:41:32" parent="2543" time="2544" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="100" portName="length" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 13:42:47" parent="2544" time="2545" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0Afor%20i%20in%20 [...]
+    </action>
+    <action date="12 Mar 2007 13:45:26" parent="2545" time="2546" user="hvo" what="addModulePort">
+      <addPort moduleId="95" portName="length" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 13:45:27" parent="2546" time="2547" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28 [...]
+    </action>
+    <action date="12 Mar 2007 13:45:33" parent="2547" time="2548" user="hvo" what="deleteConnection">
+      <connection connectionId="215"/>
+    </action>
+    <action date="12 Mar 2007 13:45:34" parent="2548" time="2549" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="69" portName="length" portType="output"/>
+    </action>
+    <action date="12 Mar 2007 13:45:58" parent="2549" time="2550" user="hvo" what="moveModule">
+      <move dx="-1.37056987171" dy="0.0" id="95"/>
+    </action>
+    <action date="12 Mar 2007 13:45:58" parent="2550" time="2551" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="95" portName="length" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 13:45:58" parent="2551" time="2552" user="hvo" what="addModulePort">
+      <addPort moduleId="95" portName="length" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="12 Mar 2007 13:46:02" parent="2552" time="2553" user="hvo" what="addConnection">
+      <connect destinationId="104" destinationModule="PythonSource" destinationPort="length(Float)" id="254" sourceId="95" sourceModule="PythonSource" sourcePort="length(Float)"/>
+    </action>
+    <action date="12 Mar 2007 13:46:50" parent="2553" time="2554" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28 [...]
+    </action>
+    <action date="12 Mar 2007 13:47:48" parent="2554" time="2555" user="hvo" what="moveModule">
+      <move dx="-1.37056987171" dy="0.0" id="117"/>
+    </action>
+    <action date="12 Mar 2007 13:49:08" parent="2555" time="2556" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="95" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0AprobeFilter%20%3D%20probed.vtkInstance%0AprobeFilter.Update%28%29%0ApolyData%20%3D%20probeFilter.GetOutput%28%29%0ApCount%20%3D%20polyData.GetNumberOfPoints%28%29%0Apoints%20%3D%20polyData.GetPoints%28%29%0Adata%20%3D%20polyData.GetPointData%28%29.GetScalars%28%29%0A%0AcolCoun [...]
+    </action>
+    <action date="12 Mar 2007 13:49:26" parent="2556" time="2557" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="69" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Af%20%3D%20open%28filename%2C%20%27r%27%29%0Afn%20%3D%20f.readline%28%29.rstrip%28%29%0AvCount%20%3D%20int%28f.readline%28%29.rstrip%28%29%29%0A%0Apoints%20%3D%20vtk.vtkPoints%28%29%0Apoints.SetNumberOfPoints%28vCount%29%0A%0Alength%20%3D%200.0%0Afor%20i%20in%20range%28vCount%2 [...]
+    </action>
+    <action date="12 Mar 2007 13:55:56" parent="2557" time="2558" user="hvo" what="moveModule">
+      <move dx="-30.1525371776" dy="-8.22341923027" id="102"/>
+      <move dx="0.0" dy="-1.37056987171" id="104"/>
+    </action>
+    <action date="12 Mar 2007 13:56:14" parent="2558" time="2559" user="hvo" what="deleteConnection">
+      <connection connectionId="254"/>
+    </action>
+    <action date="12 Mar 2007 13:56:14" parent="2559" time="2560" user="hvo" what="deleteModulePort">
+      <deletePort moduleId="104" portName="length" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 13:56:16" parent="2560" time="2561" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="104" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.15%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.8%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0A [...]
+    </action>
+    <action date="12 Mar 2007 13:58:42" parent="2561" time="2562" user="hvo" what="moveModule">
+      <move dx="254.925996138" dy="-26.0408275625" id="5"/>
+      <move dx="-120.610148711" dy="-31.5231070494" id="116"/>
+      <move dx="41.1170961513" dy="-31.5231070494" id="122"/>
+    </action>
+    <action date="12 Mar 2007 13:58:42" parent="2562" time="2563" user="hvo" what="addModule">
+      <object cache="0" id="123" name="PythonSource" x="1121.12615506" y="-683.914365984"/>
+    </action>
+    <action date="12 Mar 2007 13:59:45" parent="2563" time="2564" user="hvo" what="moveModule">
+      <move dx="-111.016159609" dy="49.3405153816" id="123"/>
+    </action>
+    <action date="12 Mar 2007 13:59:45" parent="2564" time="2565" user="hvo" what="addModulePort">
+      <addPort moduleId="123" portName="bend" portSpec="(PythonSource)" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 13:59:46" parent="2565" time="2566" user="hvo" what="addModulePort">
+      <addPort moduleId="123" portName="measure" portSpec="(PythonSource)" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 13:59:47" parent="2566" time="2567" user="hvo" what="addModulePort">
+      <addPort moduleId="123" portName="self" portSpec="(PythonSource)" portType="output"/>
+    </action>
+    <action date="12 Mar 2007 13:59:47" parent="2567" time="2568" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="123" parameter="<no description>" parameterId="0" type="String" value="bend.compute%28%29%0Ameasure.compute%28%29"/>
+    </action>
+    <action date="12 Mar 2007 13:59:50" parent="2568" time="2569" user="hvo" what="addConnection">
+      <connect destinationId="122" destinationModule="vtkInteractionHandler" destinationPort="SharedData(Module)" id="255" sourceId="123" sourceModule="PythonSource" sourcePort="self(PythonSource)"/>
+    </action>
+    <action date="12 Mar 2007 13:59:52" parent="2569" time="2570" user="hvo" what="deleteConnection">
+      <connection connectionId="253"/>
+    </action>
+    <action date="12 Mar 2007 13:59:56" parent="2570" time="2571" user="hvo" what="addConnection">
+      <connect destinationId="123" destinationModule="PythonSource" destinationPort="bend(PythonSource)" id="256" sourceId="95" sourceModule="PythonSource" sourcePort="self(PythonSource)"/>
+    </action>
+    <action date="12 Mar 2007 14:00:17" parent="2571" time="2572" user="hvo" what="moveModule">
+      <move dx="-82.2341923027" dy="16.4468384605" id="123"/>
+    </action>
+    <action date="12 Mar 2007 14:00:17" parent="2572" time="2573" user="hvo" what="addModule">
+      <object cache="0" id="124" name="PythonSource" x="855.235599948" y="-487.922874329"/>
+    </action>
+    <action date="12 Mar 2007 14:01:14" parent="2573" time="2574" user="hvo" what="moveModule">
+      <move dx="142.539266658" dy="119.239578839" id="105"/>
+    </action>
+    <action date="12 Mar 2007 14:01:16" parent="2574" time="2575" user="hvo" what="moveModule">
+      <move dx="1.37056987171" dy="0.0" id="124"/>
+    </action>
+    <action date="12 Mar 2007 14:01:16" parent="2575" time="2576" user="hvo" what="deleteConnection"/>
+    <action date="12 Mar 2007 14:01:16" parent="2576" time="2577" user="hvo" what="deleteModule">
+      <module moduleId="124"/>
+    </action>
+    <action date="12 Mar 2007 14:01:25" parent="2577" time="2578" user="hvo" what="addModulePort">
+      <addPort moduleId="104" portName="self" portSpec="(PythonSource)" portType="output"/>
+    </action>
+    <action date="12 Mar 2007 14:01:28" parent="2578" time="2579" user="hvo" what="moveModule">
+      <move dx="-30.1525371776" dy="16.4468384605" id="104"/>
+    </action>
+    <action date="12 Mar 2007 14:01:28" parent="2579" time="2580" user="hvo" what="addConnection">
+      <connect destinationId="123" destinationModule="PythonSource" destinationPort="measure(PythonSource)" id="257" sourceId="104" sourceModule="PythonSource" sourcePort="self(PythonSource)"/>
+    </action>
+    <action date="12 Mar 2007 14:01:44" parent="2580" time="2581" user="hvo" what="moveModule">
+      <move dx="-28.7819673059" dy="-2.74113974342" id="102"/>
+      <move dx="-12.3351288454" dy="-20.5585480757" id="104"/>
+      <move dx="100.051600635" dy="-35.6348166645" id="123"/>
+    </action>
+    <action date="12 Mar 2007 14:01:44" parent="2581" time="2582" user="hvo" what="addModulePort">
+      <addPort moduleId="104" portName="polyline" portSpec="(vtkPolyData)" portType="input"/>
+    </action>
+    <action date="12 Mar 2007 14:01:49" parent="2582" time="2583" user="hvo" what="addConnection">
+      <connect destinationId="104" destinationModule="PythonSource" destinationPort="polyline(vtkPolyData)" id="258" sourceId="69" sourceModule="PythonSource" sourcePort="polydata(vtkPolyData)"/>
+    </action>
+    <action date="12 Mar 2007 14:05:59" parent="2583" time="2584" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="104" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.15%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.8%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedV [...]
+    </action>
+    <action date="12 Mar 2007 14:06:36" parent="2584" time="2585" user="hvo" what="changeParameter">
+      <set alias="" function="source" functionId="0" moduleId="104" parameter="<no description>" parameterId="0" type="String" value="import%20vtk%0Aimport%20math%0Afrom%20core.modules.module_registry%20import%20registry%0A%0Aactor%20%3D%20Actor2D.vtkInstance%0Aactor.SetPoint1%280.15%2C%200.65%29%0Aactor.GetPositionCoordinate%28%29.SetCoordinateSystemToNormalizedViewport%28%29%0Aactor.SetPoint2%280.8%2C%200.65%29%0Aactor.GetPosition2Coordinate%28%29.SetCoordinateSystemToNormalizedV [...]
+    </action>
+    <action date="12 Mar 2007 14:08:09" parent="2585" time="2586" user="hvo" what="moveModule">
+      <move dx="0.0" dy="5.48227948684" id="69"/>
+    </action>
+    <action date="12 Mar 2007 14:08:09" parent="2586" time="2587" user="hvo" what="changeAnnotation">
+      <set key="__desc__" moduleId="95" value=""/>
+    </action>
+    <tag name="webpage 90" time="268"/>
+    <tag name="Both" time="1354"/>
+    <tag name="Test2" time="1640"/>
+    <tag name="TimeStep 60" time="161"/>
+    <tag name="webpage 30" time="237"/>
+    <tag name="webpage 60" time="234"/>
+    <tag name="TimeStep 90" time="168"/>
+    <tag name="Test1" time="1546"/>
+    <tag name="Static" time="2439"/>
+    <tag name="TimeStep 30" time="164"/>
+    <tag name="Interactive" time="2524"/>
+    <tag name=" A transect" time="1718"/>
+    <tag name="basic workflow" time="157"/>
+  </visTrail>
diff --git a/examples/gcd.xml b/examples/gcd.xml
new file mode 100644
index 0000000..2734584
--- /dev/null
+++ b/examples/gcd.xml
@@ -0,0 +1,1785 @@
+<vistrail id="" name="" version="1.0.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2013-10-14 15:05:53" id="1" prevId="0" session="0" user="Remi">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-127.0" y="52.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:05:54" id="2" prevId="1" session="0" user="Remi">
+    <add id="2" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="3" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="110.0" y="42.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:05:56" id="3" prevId="2" session="0" user="Remi">
+    <add id="4" objectId="0" parentObjId="0" parentObjType="module" what="function">
+      <function id="0" name="name" pos="0" />
+    </add>
+    <add id="5" objectId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="a" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:05:59" id="4" prevId="3" session="0" user="Remi">
+    <add id="6" objectId="1" parentObjId="1" parentObjType="module" what="function">
+      <function id="1" name="name" pos="0" />
+    </add>
+    <add id="7" objectId="1" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="b" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:06:07" id="5" prevId="4" session="0" user="Remi">
+    <change id="8" newObjId="3" oldObjId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="3" x="-111.0" y="218.0" />
+    </change>
+    <change id="9" newObjId="4" oldObjId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="4" x="110.0" y="222.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:06:07" id="6" prevId="5" session="0" user="Remi">
+    <add id="10" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="If" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3" />
+    </add>
+    <add id="11" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="-9.0" y="-2.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:06:10" id="7" prevId="6" session="0" user="Remi">
+    <add id="12" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="13" objectId="5" parentObjId="3" parentObjType="module" what="location">
+      <location id="5" x="16.0" y="-102.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:06:10" id="8" prevId="7" session="0" user="Remi">
+    <add id="14" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0" />
+    </add>
+    <add id="15" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="2" moduleName="If" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="16" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="3" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:07:17" id="9" prevId="8" session="0" user="Remi">
+    <add id="17" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1" />
+    </add>
+    <add id="18" objectId="6" parentObjId="4" parentObjType="module" what="location">
+      <location id="6" x="-217.0" y="86.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:07:21" id="10" prevId="9" session="0" user="Remi">
+    <add id="19" objectId="5" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="5" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="20" objectId="7" parentObjId="5" parentObjType="module" what="location">
+      <location id="7" x="181.0" y="90.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:07:46" id="11" prevId="10" session="0" user="Remi">
+    <add id="21" objectId="0" parentObjId="5" parentObjType="module" what="portSpec">
+      <portSpec id="0" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+        <portSpecItem default="" entryType="" id="0" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="22" objectId="1" parentObjId="5" parentObjType="module" what="portSpec">
+      <portSpec id="1" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+        <portSpecItem default="" entryType="" id="1" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="23" objectId="2" parentObjId="5" parentObjType="module" what="portSpec">
+      <portSpec id="2" maxConns="-1" minConns="0" name="o" optional="0" sortKey="0" type="output">
+        <portSpecItem default="" entryType="" id="2" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="24" objectId="2" parentObjId="5" parentObjType="module" what="function">
+      <function id="2" name="source" pos="0" />
+    </add>
+    <add id="25" objectId="2" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="o%20%3D%20a%20%3C%20b" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:07:51" id="12" prevId="11" session="0" user="Remi">
+    <add id="26" objectId="0" parentObjId="5" parentObjType="module" what="annotation">
+      <annotation id="0" key="__desc__" value=". < ." />
+    </add>
+  </action>
+  <action date="2013-10-14 15:07:59" id="13" prevId="12" session="0" user="Remi">
+    <add id="27" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1" />
+    </add>
+    <add id="28" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="0" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="29" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="5" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:08:00" id="14" prevId="13" session="0" user="Remi">
+    <add id="30" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2" />
+    </add>
+    <add id="31" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="1" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="32" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="5" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:08:13" id="15" prevId="14" session="0" user="Remi">
+    <change id="33" newObjId="8" oldObjId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="8" x="-33.0" y="-50.0" />
+    </change>
+    <change id="34" newObjId="9" oldObjId="5" parentObjId="3" parentObjType="module" what="location">
+      <location id="9" x="-8.0" y="-150.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:08:13" id="16" prevId="15" session="0" user="Remi">
+    <add id="35" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3" />
+    </add>
+    <add id="36" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="5" moduleName="PythonSource" name="o" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="37" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="2" moduleName="If" name="Condition" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:08:31" id="17" prevId="16" session="0" user="Remi">
+    <annotation id="1" key="__description__" value="Paste" />
+    <add id="38" objectId="6" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="6" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1" />
+    </add>
+    <add id="39" objectId="10" parentObjId="6" parentObjType="module" what="location">
+      <location id="10" x="11.0" y="-10.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:08:47" id="18" prevId="17" session="0" user="Remi">
+    <change id="40" newObjId="11" oldObjId="9" parentObjId="3" parentObjType="module" what="location">
+      <location id="11" x="-8.0" y="-151.0" />
+    </change>
+    <change id="41" newObjId="12" oldObjId="10" parentObjId="6" parentObjType="module" what="location">
+      <location id="12" x="-20.0" y="88.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:08:47" id="19" prevId="18" session="0" user="Remi">
+    <delete id="42" objectId="2" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="43" objectId="3" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="44" objectId="1" parentObjId="" parentObjType="" what="connection" />
+    <delete id="45" objectId="4" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="46" objectId="5" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="47" objectId="2" parentObjId="" parentObjType="" what="connection" />
+    <delete id="48" objectId="3" parentObjId="0" parentObjType="module" what="location" />
+    <delete id="49" objectId="0" parentObjId="0" parentObjType="function" what="parameter" />
+    <delete id="50" objectId="0" parentObjId="0" parentObjType="module" what="function" />
+    <delete id="51" objectId="0" parentObjId="" parentObjType="" what="module" />
+    <delete id="52" objectId="4" parentObjId="1" parentObjType="module" what="location" />
+    <delete id="53" objectId="1" parentObjId="1" parentObjType="function" what="parameter" />
+    <delete id="54" objectId="1" parentObjId="1" parentObjType="module" what="function" />
+    <delete id="55" objectId="1" parentObjId="" parentObjType="" what="module" />
+  </action>
+  <action date="2013-10-14 15:08:52" id="20" prevId="19" session="0" user="Remi">
+    <add id="56" objectId="7" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="7" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="57" objectId="13" parentObjId="7" parentObjType="module" what="location">
+      <location id="13" x="-140.0" y="251.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:08:56" id="21" prevId="20" session="0" user="Remi">
+    <add id="58" objectId="3" parentObjId="7" parentObjType="module" what="function">
+      <function id="3" name="name" pos="0" />
+    </add>
+    <add id="59" objectId="3" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="nbs" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:01" id="22" prevId="21" session="0" user="Remi">
+    <change id="60" newObjId="15" oldObjId="13" parentObjId="7" parentObjType="module" what="location">
+      <location id="15" x="-98.0" y="256.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:09:01" id="23" prevId="22" session="0" user="Remi">
+    <add id="61" objectId="8" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="8" name="Untuple" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="62" objectId="14" parentObjId="8" parentObjType="module" what="location">
+      <location id="14" x="-86.0" y="214.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:01" id="24" prevId="23" session="0" user="Remi">
+    <add id="63" objectId="4" parentObjId="" parentObjType="" what="connection">
+      <connection id="4" />
+    </add>
+    <add id="64" objectId="8" parentObjId="4" parentObjType="connection" what="port">
+      <port id="8" moduleId="7" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="65" objectId="9" parentObjId="4" parentObjType="connection" what="port">
+      <port id="9" moduleId="8" moduleName="Untuple" name="tuple" signature="(org.vistrails.vistrails.basic:Tuple)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:10" id="25" prevId="24" session="0" user="Remi">
+    <change id="66" newObjId="16" oldObjId="15" parentObjId="7" parentObjType="module" what="location">
+      <location id="16" x="-98.0" y="301.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:09:10" id="26" prevId="25" session="0" user="Remi">
+    <add id="67" objectId="3" parentObjId="8" parentObjType="module" what="portSpec">
+      <portSpec id="3" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="output">
+        <portSpecItem default="" entryType="" id="3" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="68" objectId="4" parentObjId="8" parentObjType="module" what="portSpec">
+      <portSpec id="4" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="output">
+        <portSpecItem default="" entryType="" id="4" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="69" objectId="5" parentObjId="8" parentObjType="module" what="portSpec">
+      <portSpec id="5" maxConns="-1" minConns="0" name="value" optional="0" sortKey="-1" type="input">
+        <portSpecItem default="" entryType="" id="5" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+        <portSpecItem default="" entryType="" id="6" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="1" values="" />
+      </portSpec>
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:15" id="27" prevId="26" session="0" user="Remi">
+    <add id="70" objectId="5" parentObjId="" parentObjType="" what="connection">
+      <connection id="5" />
+    </add>
+    <add id="71" objectId="10" parentObjId="5" parentObjType="connection" what="port">
+      <port id="10" moduleId="7" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="72" objectId="11" parentObjId="5" parentObjType="connection" what="port">
+      <port id="11" moduleId="8" moduleName="Untuple" name="value" signature="(org.vistrails.vistrails.basic:Integer,org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:17" id="28" prevId="27" session="0" user="Remi">
+    <delete id="73" objectId="8" parentObjId="4" parentObjType="connection" what="port" />
+    <delete id="74" objectId="9" parentObjId="4" parentObjType="connection" what="port" />
+    <delete id="75" objectId="4" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:09:24" id="29" prevId="28" session="0" user="Remi">
+    <add id="76" objectId="6" parentObjId="" parentObjType="" what="connection">
+      <connection id="6" />
+    </add>
+    <add id="77" objectId="12" parentObjId="6" parentObjType="connection" what="port">
+      <port id="12" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="78" objectId="13" parentObjId="6" parentObjType="connection" what="port">
+      <port id="13" moduleId="5" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:26" id="30" prevId="29" session="0" user="Remi">
+    <add id="79" objectId="7" parentObjId="" parentObjType="" what="connection">
+      <connection id="7" />
+    </add>
+    <add id="80" objectId="14" parentObjId="7" parentObjType="connection" what="port">
+      <port id="14" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="81" objectId="15" parentObjId="7" parentObjType="connection" what="port">
+      <port id="15" moduleId="5" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:43" id="31" prevId="30" session="0" user="Remi">
+    <add id="82" objectId="9" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="9" name="Tuple" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="83" objectId="17" parentObjId="9" parentObjType="module" what="location">
+      <location id="17" x="-308.0" y="-24.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:46" id="32" prevId="31" session="0" user="Remi">
+    <add id="84" objectId="2" parentObjId="9" parentObjType="module" what="annotation">
+      <annotation id="2" key="__desc__" value="a, b-a" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:09:58" id="33" prevId="32" session="0" user="Remi">
+    <change id="85" newObjId="18" oldObjId="17" parentObjId="9" parentObjType="module" what="location">
+      <location id="18" x="-251.0" y="-22.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:09:58" id="34" prevId="33" session="0" user="Remi">
+    <add id="86" objectId="6" parentObjId="9" parentObjType="module" what="portSpec">
+      <portSpec id="6" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+        <portSpecItem default="" entryType="" id="7" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="87" objectId="7" parentObjId="9" parentObjType="module" what="portSpec">
+      <portSpec id="7" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+        <portSpecItem default="" entryType="" id="8" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="88" objectId="8" parentObjId="9" parentObjType="module" what="portSpec">
+      <portSpec id="8" maxConns="-1" minConns="0" name="value" optional="0" sortKey="-1" type="output">
+        <portSpecItem default="" entryType="" id="9" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+        <portSpecItem default="" entryType="" id="10" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="1" values="" />
+      </portSpec>
+    </add>
+  </action>
+  <action date="2013-10-14 15:10:01" id="35" prevId="34" session="0" user="Remi">
+    <add id="89" objectId="8" parentObjId="" parentObjType="" what="connection">
+      <connection id="8" />
+    </add>
+    <add id="90" objectId="16" parentObjId="8" parentObjType="connection" what="port">
+      <port id="16" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="91" objectId="17" parentObjId="8" parentObjType="connection" what="port">
+      <port id="17" moduleId="9" moduleName="Tuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:10:05" id="36" prevId="35" session="0" user="Remi">
+    <add id="92" objectId="9" parentObjId="" parentObjType="" what="connection">
+      <connection id="9" />
+    </add>
+    <add id="93" objectId="18" parentObjId="9" parentObjType="connection" what="port">
+      <port id="18" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="94" objectId="19" parentObjId="9" parentObjType="connection" what="port">
+      <port id="19" moduleId="4" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:10:08" id="37" prevId="36" session="0" user="Remi">
+    <add id="95" objectId="4" parentObjId="4" parentObjType="module" what="function">
+      <function id="4" name="op" pos="0" />
+    </add>
+    <add id="96" objectId="4" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:10:09" id="38" prevId="37" session="0" user="Remi">
+    <change id="97" newObjId="5" oldObjId="4" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="-" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:10:14" id="39" prevId="38" session="0" user="Remi">
+    <add id="98" objectId="10" parentObjId="" parentObjType="" what="connection">
+      <connection id="10" />
+    </add>
+    <add id="99" objectId="20" parentObjId="10" parentObjType="connection" what="port">
+      <port id="20" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="100" objectId="21" parentObjId="10" parentObjType="connection" what="port">
+      <port id="21" moduleId="4" moduleName="PythonCalc" name="value2" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:10:19" id="40" prevId="39" session="0" user="Remi">
+    <add id="101" objectId="10" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="10" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="102" objectId="19" parentObjId="10" parentObjType="module" what="location">
+      <location id="19" x="-211.5" y="40.5" />
+    </add>
+    <add id="103" objectId="11" parentObjId="" parentObjType="" what="connection">
+      <connection id="11" />
+    </add>
+    <add id="104" objectId="22" parentObjId="11" parentObjType="connection" what="port">
+      <port id="22" moduleId="4" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="105" objectId="23" parentObjId="11" parentObjType="connection" what="port">
+      <port id="23" moduleId="10" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="106" objectId="12" parentObjId="" parentObjType="" what="connection">
+      <connection id="12" />
+    </add>
+    <add id="107" objectId="24" parentObjId="12" parentObjType="connection" what="port">
+      <port id="24" moduleId="10" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="108" objectId="25" parentObjId="12" parentObjType="connection" what="port">
+      <port id="25" moduleId="9" moduleName="Tuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:10:56" id="41" prevId="40" session="0" user="Remi">
+    <change id="109" newObjId="20" oldObjId="8" parentObjId="2" parentObjType="module" what="location">
+      <location id="20" x="-32.0" y="-206.0" />
+    </change>
+    <change id="110" newObjId="21" oldObjId="11" parentObjId="3" parentObjType="module" what="location">
+      <location id="21" x="-7.0" y="-307.0" />
+    </change>
+    <change id="111" newObjId="22" oldObjId="6" parentObjId="4" parentObjType="module" what="location">
+      <location id="22" x="-217.0" y="87.0" />
+    </change>
+    <change id="112" newObjId="23" oldObjId="12" parentObjId="6" parentObjType="module" what="location">
+      <location id="23" x="-2.0" y="87.0" />
+    </change>
+    <change id="113" newObjId="24" oldObjId="18" parentObjId="9" parentObjType="module" what="location">
+      <location id="24" x="-223.0" y="-76.0" />
+    </change>
+    <change id="114" newObjId="25" oldObjId="19" parentObjId="10" parentObjType="module" what="location">
+      <location id="25" x="-181.5" y="23.5" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:10:56" id="42" prevId="41" session="0" user="Remi">
+    <add id="115" objectId="13" parentObjId="" parentObjType="" what="connection">
+      <connection id="13" />
+    </add>
+    <add id="116" objectId="26" parentObjId="13" parentObjType="connection" what="port">
+      <port id="26" moduleId="9" moduleName="Tuple" name="self" signature="(org.vistrails.vistrails.basic:Tuple)" type="source" />
+    </add>
+    <add id="117" objectId="27" parentObjId="13" parentObjType="connection" what="port">
+      <port id="27" moduleId="2" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:05" id="43" prevId="42" session="0" user="Remi">
+    <add id="118" objectId="5" parentObjId="2" parentObjType="module" what="function">
+      <function id="5" name="TrueOutputPorts" pos="0" />
+    </add>
+    <add id="119" objectId="6" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:06" id="44" prevId="43" session="0" user="Remi">
+    <add id="120" objectId="6" parentObjId="2" parentObjType="module" what="function">
+      <function id="6" name="FalseOutputPorts" pos="1" />
+    </add>
+    <add id="121" objectId="7" parentObjId="6" parentObjType="function" what="parameter">
+      <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:22" id="45" prevId="44" session="0" user="Remi">
+    <add id="122" objectId="14" parentObjId="" parentObjType="" what="connection">
+      <connection id="14" />
+    </add>
+    <add id="123" objectId="28" parentObjId="14" parentObjType="connection" what="port">
+      <port id="28" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="124" objectId="29" parentObjId="14" parentObjType="connection" what="port">
+      <port id="29" moduleId="6" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:25" id="46" prevId="45" session="0" user="Remi">
+    <add id="125" objectId="15" parentObjId="" parentObjType="" what="connection">
+      <connection id="15" />
+    </add>
+    <add id="126" objectId="30" parentObjId="15" parentObjType="connection" what="port">
+      <port id="30" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="127" objectId="31" parentObjId="15" parentObjType="connection" what="port">
+      <port id="31" moduleId="6" moduleName="PythonCalc" name="value2" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:27" id="47" prevId="46" session="0" user="Remi">
+    <add id="128" objectId="7" parentObjId="6" parentObjType="module" what="function">
+      <function id="7" name="op" pos="0" />
+    </add>
+    <add id="129" objectId="8" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:28" id="48" prevId="47" session="0" user="Remi">
+    <change id="130" newObjId="9" oldObjId="8" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="9" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="-" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:11:32" id="49" prevId="48" session="0" user="Remi">
+    <add id="131" objectId="11" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="11" name="Tuple" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="132" objectId="26" parentObjId="11" parentObjType="module" what="location">
+      <location id="26" x="5.0" y="-14.0" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:39" id="50" prevId="49" session="0" user="Remi">
+    <add id="133" objectId="9" parentObjId="11" parentObjType="module" what="portSpec">
+      <portSpec id="9" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+        <portSpecItem default="" entryType="" id="11" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="134" objectId="10" parentObjId="11" parentObjType="module" what="portSpec">
+      <portSpec id="10" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+        <portSpecItem default="" entryType="" id="12" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="135" objectId="11" parentObjId="11" parentObjType="module" what="portSpec">
+      <portSpec id="11" maxConns="-1" minConns="0" name="value" optional="0" sortKey="-1" type="output">
+        <portSpecItem default="" entryType="" id="13" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+        <portSpecItem default="" entryType="" id="14" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="1" values="" />
+      </portSpec>
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:43" id="51" prevId="50" session="0" user="Remi">
+    <add id="136" objectId="12" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="12" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="137" objectId="27" parentObjId="12" parentObjType="module" what="location">
+      <location id="27" x="17.5" y="39.0" />
+    </add>
+    <add id="138" objectId="16" parentObjId="" parentObjType="" what="connection">
+      <connection id="16" />
+    </add>
+    <add id="139" objectId="32" parentObjId="16" parentObjType="connection" what="port">
+      <port id="32" moduleId="6" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="140" objectId="33" parentObjId="16" parentObjType="connection" what="port">
+      <port id="33" moduleId="12" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="141" objectId="17" parentObjId="" parentObjType="" what="connection">
+      <connection id="17" />
+    </add>
+    <add id="142" objectId="34" parentObjId="17" parentObjType="connection" what="port">
+      <port id="34" moduleId="12" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="143" objectId="35" parentObjId="17" parentObjType="connection" what="port">
+      <port id="35" moduleId="11" moduleName="Tuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:49" id="52" prevId="51" session="0" user="Remi">
+    <change id="144" newObjId="28" oldObjId="26" parentObjId="11" parentObjType="module" what="location">
+      <location id="28" x="-10.0" y="-76.0" />
+    </change>
+    <change id="145" newObjId="29" oldObjId="27" parentObjId="12" parentObjType="module" what="location">
+      <location id="29" x="22.5" y="27.0" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:11:49" id="53" prevId="52" session="0" user="Remi">
+    <add id="146" objectId="18" parentObjId="" parentObjType="" what="connection">
+      <connection id="18" />
+    </add>
+    <add id="147" objectId="36" parentObjId="18" parentObjType="connection" what="port">
+      <port id="36" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="148" objectId="37" parentObjId="18" parentObjType="connection" what="port">
+      <port id="37" moduleId="11" moduleName="Tuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:11:56" id="54" prevId="53" session="0" user="Remi">
+    <add id="149" objectId="19" parentObjId="" parentObjType="" what="connection">
+      <connection id="19" />
+    </add>
+    <add id="150" objectId="38" parentObjId="19" parentObjType="connection" what="port">
+      <port id="38" moduleId="11" moduleName="Tuple" name="self" signature="(org.vistrails.vistrails.basic:Tuple)" type="source" />
+    </add>
+    <add id="151" objectId="39" parentObjId="19" parentObjType="connection" what="port">
+      <port id="39" moduleId="2" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:12:36" id="55" prevId="54" session="0" user="Remi">
+    <add id="152" objectId="3" parentObjId="11" parentObjType="module" what="annotation">
+      <annotation id="3" key="__desc__" value="a-b" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:12:39" id="56" prevId="55" session="0" user="Remi">
+    <change id="153" newObjId="4" oldObjId="3" parentObjId="11" parentObjType="module" what="annotation">
+      <annotation id="4" key="__desc__" value="a-b, b" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:16:25" id="57" prevId="56" session="1" user="Remi">
+    <add id="154" objectId="13" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="13" name="And" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3" />
+    </add>
+    <add id="155" objectId="30" parentObjId="13" parentObjType="module" what="location">
+      <location id="30" x="219.538590604" y="-202.651006711" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:16:34" id="58" prevId="57" session="1" user="Remi">
+    <add id="156" objectId="14" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="14" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="157" objectId="31" parentObjId="14" parentObjType="module" what="location">
+      <location id="31" x="186.889261745" y="-96.822147651" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:16:34" id="59" prevId="58" session="1" user="Remi">
+    <add id="158" objectId="20" parentObjId="" parentObjType="" what="connection">
+      <connection id="20" />
+    </add>
+    <add id="159" objectId="40" parentObjId="20" parentObjType="connection" what="port">
+      <port id="40" moduleId="14" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+    </add>
+    <add id="160" objectId="41" parentObjId="20" parentObjType="connection" what="port">
+      <port id="41" moduleId="13" moduleName="And" name="InputList" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:16:39" id="60" prevId="59" session="1" user="Remi">
+    <add id="161" objectId="12" parentObjId="14" parentObjType="module" what="portSpec">
+      <portSpec id="12" maxConns="-1" minConns="0" name="item0" optional="0" sortKey="-1" type="input">
+        <portSpecItem default="" entryType="" id="0" label="" module="Module" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+  </action>
+  <action date="2013-10-14 15:16:42" id="61" prevId="60" session="1" user="Remi">
+    <add id="162" objectId="21" parentObjId="" parentObjType="" what="connection">
+      <connection id="21" />
+    </add>
+    <add id="163" objectId="42" parentObjId="21" parentObjType="connection" what="port">
+      <port id="42" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="164" objectId="43" parentObjId="21" parentObjType="connection" what="port">
+      <port id="43" moduleId="14" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:16:45" id="62" prevId="61" session="1" user="Remi">
+    <add id="165" objectId="22" parentObjId="" parentObjType="" what="connection">
+      <connection id="22" />
+    </add>
+    <add id="166" objectId="44" parentObjId="22" parentObjType="connection" what="port">
+      <port id="44" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="167" objectId="45" parentObjId="22" parentObjType="connection" what="port">
+      <port id="45" moduleId="14" moduleName="List" name="item0" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:17:03" id="63" prevId="62" session="1" user="Remi">
+    <add id="168" objectId="8" parentObjId="3" parentObjType="module" what="function">
+      <function id="8" name="name" pos="0" />
+    </add>
+    <add id="169" objectId="10" parentObjId="8" parentObjType="function" what="parameter">
+      <parameter alias="" id="10" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="state" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:17:05" id="64" prevId="63" session="1" user="Remi">
+    <annotation id="5" key="__description__" value="Paste" />
+    <add id="170" objectId="15" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="15" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="171" objectId="9" parentObjId="15" parentObjType="module" what="function">
+      <function id="9" name="name" pos="0" />
+    </add>
+    <add id="172" objectId="11" parentObjId="9" parentObjType="function" what="parameter">
+      <parameter alias="" id="11" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="state" />
+    </add>
+    <add id="173" objectId="32" parentObjId="15" parentObjType="module" what="location">
+      <location id="32" x="81.0604026846" y="-166.624161074" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:17:13" id="65" prevId="64" session="1" user="Remi">
+    <change id="174" newObjId="33" oldObjId="32" parentObjId="15" parentObjType="module" what="location">
+      <location id="33" x="233.048657718" y="-310.731543624" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:17:13" id="66" prevId="65" session="1" user="Remi">
+    <change id="175" newObjId="12" oldObjId="11" parentObjId="9" parentObjType="function" what="parameter">
+      <parameter alias="" id="12" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="continue" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:17:16" id="67" prevId="66" session="1" user="Remi">
+    <add id="176" objectId="23" parentObjId="" parentObjType="" what="connection">
+      <connection id="23" />
+    </add>
+    <add id="177" objectId="46" parentObjId="23" parentObjType="connection" what="port">
+      <port id="46" moduleId="13" moduleName="And" name="Result" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="178" objectId="47" parentObjId="23" parentObjType="connection" what="port">
+      <port id="47" moduleId="15" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:21:27" id="68" prevId="67" session="2" user="Remi">
+    <annotation id="6" key="__description__" value="Paste" />
+    <add id="179" objectId="16" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="16" name="If" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3" />
+    </add>
+    <add id="180" objectId="11" parentObjId="16" parentObjType="module" what="function">
+      <function id="11" name="FalseOutputPorts" pos="1" />
+    </add>
+    <add id="181" objectId="14" parentObjId="11" parentObjType="function" what="parameter">
+      <parameter alias="" id="14" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+    </add>
+    <add id="182" objectId="10" parentObjId="16" parentObjType="module" what="function">
+      <function id="10" name="TrueOutputPorts" pos="0" />
+    </add>
+    <add id="183" objectId="13" parentObjId="10" parentObjType="function" what="parameter">
+      <parameter alias="" id="13" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+    </add>
+    <add id="184" objectId="34" parentObjId="16" parentObjType="module" what="location">
+      <location id="34" x="273.968177109" y="-44.151896311" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:21:31" id="69" prevId="68" session="2" user="Remi">
+    <change id="185" newObjId="35" oldObjId="34" parentObjId="16" parentObjType="module" what="location">
+      <location id="35" x="448.311562542" y="-103.021091392" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:21:31" id="70" prevId="69" session="2" user="Remi">
+    <add id="186" objectId="24" parentObjId="" parentObjType="" what="connection">
+      <connection id="24" />
+    </add>
+    <add id="187" objectId="48" parentObjId="24" parentObjType="connection" what="port">
+      <port id="48" moduleId="5" moduleName="PythonSource" name="o" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="188" objectId="49" parentObjId="24" parentObjType="connection" what="port">
+      <port id="49" moduleId="16" moduleName="If" name="Condition" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:21:36" id="71" prevId="70" session="2" user="Remi">
+    <change id="189" newObjId="36" oldObjId="35" parentObjId="16" parentObjType="module" what="location">
+      <location id="36" x="450.575762353" y="-131.323589027" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:21:42" id="72" prevId="71" session="2" user="Remi">
+    <add id="190" objectId="25" parentObjId="" parentObjType="" what="connection">
+      <connection id="25" />
+    </add>
+    <add id="191" objectId="50" parentObjId="25" parentObjType="connection" what="port">
+      <port id="50" moduleId="8" moduleName="Untuple" name="self" signature="(org.vistrails.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="192" objectId="51" parentObjId="25" parentObjType="connection" what="port">
+      <port id="51" moduleId="16" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:21:51" id="73" prevId="72" session="2" user="Remi">
+    <add id="193" objectId="26" parentObjId="" parentObjType="" what="connection">
+      <connection id="26" />
+    </add>
+    <add id="194" objectId="52" parentObjId="26" parentObjType="connection" what="port">
+      <port id="52" moduleId="8" moduleName="Untuple" name="self" signature="(org.vistrails.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="195" objectId="53" parentObjId="26" parentObjType="connection" what="port">
+      <port id="53" moduleId="16" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:07" id="74" prevId="71" session="2" user="Remi">
+    <add id="196" objectId="17" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="17" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="197" objectId="37" parentObjId="17" parentObjType="module" what="location">
+      <location id="37" x="-434.726363677" y="200.381683257" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:08" id="75" prevId="74" session="2" user="Remi">
+    <add id="198" objectId="18" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="18" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="199" objectId="38" parentObjId="18" parentObjType="module" what="location">
+      <location id="38" x="-305.666974461" y="234.34468042" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:11" id="76" prevId="75" session="2" user="Remi">
+    <change id="200" newObjId="40" oldObjId="38" parentObjId="18" parentObjType="module" what="location">
+      <location id="40" x="-303.40277465" y="203.777982974" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:22:11" id="77" prevId="76" session="2" user="Remi">
+    <add id="201" objectId="19" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="19" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="202" objectId="39" parentObjId="19" parentObjType="module" what="location">
+      <location id="39" x="193.589083825" y="278.496576731" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:12" id="78" prevId="77" session="2" user="Remi">
+    <add id="203" objectId="20" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="20" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="204" objectId="41" parentObjId="20" parentObjType="module" what="location">
+      <location id="41" x="366.800369353" y="273.968177109" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:16" id="79" prevId="78" session="2" user="Remi">
+    <add id="205" objectId="21" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="21" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="206" objectId="42" parentObjId="21" parentObjType="module" what="location">
+      <location id="42" x="598.880849962" y="271.703977298" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:18" id="80" prevId="79" session="2" user="Remi">
+    <add id="207" objectId="22" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="22" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="208" objectId="43" parentObjId="22" parentObjType="module" what="location">
+      <location id="43" x="743.789637854" y="269.439777487" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:31" id="81" prevId="80" session="2" user="Remi">
+    <change id="209" newObjId="44" oldObjId="16" parentObjId="7" parentObjType="module" what="location">
+      <location id="44" x="-110.45309896" y="441.380388271" />
+    </change>
+    <change id="210" newObjId="45" oldObjId="14" parentObjId="8" parentObjType="module" what="location">
+      <location id="45" x="-98.4530989595" y="354.380388271" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:22:31" id="82" prevId="81" session="2" user="Remi">
+    <add id="211" objectId="27" parentObjId="" parentObjType="" what="connection">
+      <connection id="27" />
+    </add>
+    <add id="212" objectId="54" parentObjId="27" parentObjType="connection" what="port">
+      <port id="54" moduleId="18" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="213" objectId="55" parentObjId="27" parentObjType="connection" what="port">
+      <port id="55" moduleId="4" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:36" id="83" prevId="82" session="2" user="Remi">
+    <add id="214" objectId="28" parentObjId="" parentObjType="" what="connection">
+      <connection id="28" />
+    </add>
+    <add id="215" objectId="56" parentObjId="28" parentObjType="connection" what="port">
+      <port id="56" moduleId="17" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="216" objectId="57" parentObjId="28" parentObjType="connection" what="port">
+      <port id="57" moduleId="4" moduleName="PythonCalc" name="value2" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:38" id="84" prevId="83" session="2" user="Remi">
+    <delete id="217" objectId="20" parentObjId="10" parentObjType="connection" what="port" />
+    <delete id="218" objectId="21" parentObjId="10" parentObjType="connection" what="port" />
+    <delete id="219" objectId="10" parentObjId="" parentObjType="" what="connection" />
+    <delete id="220" objectId="18" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="221" objectId="19" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="222" objectId="9" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:22:41" id="85" prevId="84" session="2" user="Remi">
+    <add id="223" objectId="29" parentObjId="" parentObjType="" what="connection">
+      <connection id="29" />
+    </add>
+    <add id="224" objectId="58" parentObjId="29" parentObjType="connection" what="port">
+      <port id="58" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="225" objectId="59" parentObjId="29" parentObjType="connection" what="port">
+      <port id="59" moduleId="17" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:43" id="86" prevId="85" session="2" user="Remi">
+    <add id="226" objectId="30" parentObjId="" parentObjType="" what="connection">
+      <connection id="30" />
+    </add>
+    <add id="227" objectId="60" parentObjId="30" parentObjType="connection" what="port">
+      <port id="60" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="228" objectId="61" parentObjId="30" parentObjType="connection" what="port">
+      <port id="61" moduleId="18" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:46" id="87" prevId="86" session="2" user="Remi">
+    <add id="229" objectId="7" parentObjId="17" parentObjType="module" what="annotation">
+      <annotation id="7" key="__desc__" value="a" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:48" id="88" prevId="87" session="2" user="Remi">
+    <add id="230" objectId="8" parentObjId="18" parentObjType="module" what="annotation">
+      <annotation id="8" key="__desc__" value="b" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:22:57" id="89" prevId="88" session="2" user="Remi">
+    <delete id="231" objectId="16" parentObjId="8" parentObjType="connection" what="port" />
+    <delete id="232" objectId="17" parentObjId="8" parentObjType="connection" what="port" />
+    <delete id="233" objectId="8" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:22:58" id="90" prevId="89" session="2" user="Remi">
+    <add id="234" objectId="31" parentObjId="" parentObjType="" what="connection">
+      <connection id="31" />
+    </add>
+    <add id="235" objectId="62" parentObjId="31" parentObjType="connection" what="port">
+      <port id="62" moduleId="17" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="236" objectId="63" parentObjId="31" parentObjType="connection" what="port">
+      <port id="63" moduleId="9" moduleName="Tuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:23:06" id="91" prevId="90" session="2" user="Remi">
+    <add id="237" objectId="32" parentObjId="" parentObjType="" what="connection">
+      <connection id="32" />
+    </add>
+    <add id="238" objectId="64" parentObjId="32" parentObjType="connection" what="port">
+      <port id="64" moduleId="19" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="239" objectId="65" parentObjId="32" parentObjType="connection" what="port">
+      <port id="65" moduleId="6" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:23:08" id="92" prevId="91" session="2" user="Remi">
+    <add id="240" objectId="33" parentObjId="" parentObjType="" what="connection">
+      <connection id="33" />
+    </add>
+    <add id="241" objectId="66" parentObjId="33" parentObjType="connection" what="port">
+      <port id="66" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="242" objectId="67" parentObjId="33" parentObjType="connection" what="port">
+      <port id="67" moduleId="19" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:23:13" id="93" prevId="92" session="2" user="Remi">
+    <delete id="243" objectId="28" parentObjId="14" parentObjType="connection" what="port" />
+    <delete id="244" objectId="29" parentObjId="14" parentObjType="connection" what="port" />
+    <delete id="245" objectId="14" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:23:19" id="94" prevId="93" session="2" user="Remi">
+    <add id="246" objectId="34" parentObjId="" parentObjType="" what="connection">
+      <connection id="34" />
+    </add>
+    <add id="247" objectId="68" parentObjId="34" parentObjType="connection" what="port">
+      <port id="68" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="248" objectId="69" parentObjId="34" parentObjType="connection" what="port">
+      <port id="69" moduleId="6" moduleName="PythonCalc" name="value2" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:23:21" id="95" prevId="94" session="2" user="Remi">
+    <add id="249" objectId="35" parentObjId="" parentObjType="" what="connection">
+      <connection id="35" />
+    </add>
+    <add id="250" objectId="70" parentObjId="35" parentObjType="connection" what="port">
+      <port id="70" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="251" objectId="71" parentObjId="35" parentObjType="connection" what="port">
+      <port id="71" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:23:24" id="96" prevId="95" session="2" user="Remi">
+    <delete id="252" objectId="30" parentObjId="15" parentObjType="connection" what="port" />
+    <delete id="253" objectId="31" parentObjId="15" parentObjType="connection" what="port" />
+    <delete id="254" objectId="15" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:23:33" id="97" prevId="96" session="2" user="Remi">
+    <add id="255" objectId="36" parentObjId="" parentObjType="" what="connection">
+      <connection id="36" />
+    </add>
+    <add id="256" objectId="72" parentObjId="36" parentObjType="connection" what="port">
+      <port id="72" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="257" objectId="73" parentObjId="36" parentObjType="connection" what="port">
+      <port id="73" moduleId="11" moduleName="Tuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:23:35" id="98" prevId="97" session="2" user="Remi">
+    <delete id="258" objectId="36" parentObjId="18" parentObjType="connection" what="port" />
+    <delete id="259" objectId="37" parentObjId="18" parentObjType="connection" what="port" />
+    <delete id="260" objectId="18" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:24:06" id="99" prevId="98" session="2" user="Remi">
+    <change id="261" newObjId="46" oldObjId="20" parentObjId="2" parentObjType="module" what="location">
+      <location id="46" x="-243.979659394" y="-279.790387764" />
+    </change>
+    <change id="262" newObjId="47" oldObjId="21" parentObjId="3" parentObjType="module" what="location">
+      <location id="47" x="-218.979659394" y="-380.790387764" />
+    </change>
+    <change id="263" newObjId="48" oldObjId="22" parentObjId="4" parentObjType="module" what="location">
+      <location id="48" x="-428.979659394" y="13.2096122364" />
+    </change>
+    <change id="264" newObjId="49" oldObjId="23" parentObjId="6" parentObjType="module" what="location">
+      <location id="49" x="-213.979659394" y="13.2096122364" />
+    </change>
+    <change id="265" newObjId="50" oldObjId="24" parentObjId="9" parentObjType="module" what="location">
+      <location id="50" x="-434.979659394" y="-149.790387764" />
+    </change>
+    <change id="266" newObjId="51" oldObjId="25" parentObjId="10" parentObjType="module" what="location">
+      <location id="51" x="-393.479659394" y="-50.2903877636" />
+    </change>
+    <change id="267" newObjId="52" oldObjId="28" parentObjId="11" parentObjType="module" what="location">
+      <location id="52" x="-221.979659394" y="-149.790387764" />
+    </change>
+    <change id="268" newObjId="53" oldObjId="29" parentObjId="12" parentObjType="module" what="location">
+      <location id="53" x="-189.479659394" y="-46.7903877636" />
+    </change>
+    <change id="269" newObjId="54" oldObjId="37" parentObjId="17" parentObjType="module" what="location">
+      <location id="54" x="-646.706023071" y="126.591295494" />
+    </change>
+    <change id="270" newObjId="55" oldObjId="40" parentObjId="18" parentObjType="module" what="location">
+      <location id="55" x="-515.382434043" y="129.98759521" />
+    </change>
+    <change id="271" newObjId="56" oldObjId="39" parentObjId="19" parentObjType="module" what="location">
+      <location id="56" x="-305.50226614" y="133.599088031" />
+    </change>
+    <change id="272" newObjId="57" oldObjId="41" parentObjId="20" parentObjType="module" what="location">
+      <location id="57" x="-132.290980612" y="129.07068841" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:24:06" id="100" prevId="99" session="2" user="Remi">
+    <add id="273" objectId="9" parentObjId="20" parentObjType="module" what="annotation">
+      <annotation id="9" key="__desc__" value="b" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:08" id="101" prevId="100" session="2" user="Remi">
+    <add id="274" objectId="10" parentObjId="19" parentObjType="module" what="annotation">
+      <annotation id="10" key="__desc__" value="a" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:40" id="102" prevId="101" session="2" user="Remi">
+    <change id="275" newObjId="58" oldObjId="46" parentObjId="2" parentObjType="module" what="location">
+      <location id="58" x="-320.453333985" y="-286.498604833" />
+    </change>
+    <change id="276" newObjId="59" oldObjId="47" parentObjId="3" parentObjType="module" what="location">
+      <location id="59" x="-295.453333985" y="-387.498604833" />
+    </change>
+    <change id="277" newObjId="60" oldObjId="7" parentObjId="5" parentObjType="module" what="location">
+      <location id="60" x="54.8855190949" y="-62.9473491828" />
+    </change>
+    <change id="278" newObjId="61" oldObjId="30" parentObjId="13" parentObjType="module" what="location">
+      <location id="61" x="451.642901206" y="115.31848238" />
+    </change>
+    <change id="279" newObjId="62" oldObjId="31" parentObjId="14" parentObjType="module" what="location">
+      <location id="62" x="418.993572347" y="221.14734144" />
+    </change>
+    <change id="280" newObjId="63" oldObjId="33" parentObjId="15" parentObjType="module" what="location">
+      <location id="63" x="465.15296832" y="7.23794546658" />
+    </change>
+    <change id="281" newObjId="64" oldObjId="42" parentObjId="21" parentObjType="module" what="location">
+      <location id="64" x="95.7645697549" y="148.272783221" />
+    </change>
+    <change id="282" newObjId="65" oldObjId="43" parentObjId="22" parentObjType="module" what="location">
+      <location id="65" x="240.673357647" y="146.00858341" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:24:40" id="103" prevId="102" session="2" user="Remi">
+    <add id="283" objectId="11" parentObjId="21" parentObjType="module" what="annotation">
+      <annotation id="11" key="__desc__" value="a" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:42" id="104" prevId="103" session="2" user="Remi">
+    <add id="284" objectId="12" parentObjId="22" parentObjType="module" what="annotation">
+      <annotation id="12" key="__desc__" value="b" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:46" id="105" prevId="104" session="2" user="Remi">
+    <add id="285" objectId="37" parentObjId="" parentObjType="" what="connection">
+      <connection id="37" />
+    </add>
+    <add id="286" objectId="74" parentObjId="37" parentObjType="connection" what="port">
+      <port id="74" moduleId="8" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="287" objectId="75" parentObjId="37" parentObjType="connection" what="port">
+      <port id="75" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:48" id="106" prevId="105" session="2" user="Remi">
+    <add id="288" objectId="38" parentObjId="" parentObjType="" what="connection">
+      <connection id="38" />
+    </add>
+    <add id="289" objectId="76" parentObjId="38" parentObjType="connection" what="port">
+      <port id="76" moduleId="8" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="290" objectId="77" parentObjId="38" parentObjType="connection" what="port">
+      <port id="77" moduleId="22" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:52" id="107" prevId="106" session="2" user="Remi">
+    <add id="291" objectId="39" parentObjId="" parentObjType="" what="connection">
+      <connection id="39" />
+    </add>
+    <add id="292" objectId="78" parentObjId="39" parentObjType="connection" what="port">
+      <port id="78" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="293" objectId="79" parentObjId="39" parentObjType="connection" what="port">
+      <port id="79" moduleId="5" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:53" id="108" prevId="107" session="2" user="Remi">
+    <add id="294" objectId="40" parentObjId="" parentObjType="" what="connection">
+      <connection id="40" />
+    </add>
+    <add id="295" objectId="80" parentObjId="40" parentObjType="connection" what="port">
+      <port id="80" moduleId="22" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="296" objectId="81" parentObjId="40" parentObjType="connection" what="port">
+      <port id="81" moduleId="5" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:24:56" id="109" prevId="108" session="2" user="Remi">
+    <delete id="297" objectId="12" parentObjId="6" parentObjType="connection" what="port" />
+    <delete id="298" objectId="13" parentObjId="6" parentObjType="connection" what="port" />
+    <delete id="299" objectId="6" parentObjId="" parentObjType="" what="connection" />
+    <delete id="300" objectId="14" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="301" objectId="15" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="302" objectId="7" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:25:07" id="110" prevId="109" session="2" user="Remi">
+    <change id="303" newObjId="66" oldObjId="61" parentObjId="13" parentObjType="module" what="location">
+      <location id="66" x="357.727862234" y="-134.227192603" />
+    </change>
+    <change id="304" newObjId="67" oldObjId="62" parentObjId="14" parentObjType="module" what="location">
+      <location id="67" x="325.078533375" y="-28.3983335429" />
+    </change>
+    <change id="305" newObjId="68" oldObjId="63" parentObjId="15" parentObjType="module" what="location">
+      <location id="68" x="371.237929348" y="-242.307729516" />
+    </change>
+    <change id="306" newObjId="69" oldObjId="36" parentObjId="16" parentObjType="module" what="location">
+      <location id="69" x="155.414211298" y="-231.946845069" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:25:07" id="111" prevId="110" session="2" user="Remi">
+    <add id="307" objectId="41" parentObjId="" parentObjType="" what="connection">
+      <connection id="41" />
+    </add>
+    <add id="308" objectId="82" parentObjId="41" parentObjType="connection" what="port">
+      <port id="82" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="309" objectId="83" parentObjId="41" parentObjType="connection" what="port">
+      <port id="83" moduleId="14" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:25:08" id="112" prevId="111" session="2" user="Remi">
+    <delete id="310" objectId="42" parentObjId="21" parentObjType="connection" what="port" />
+    <delete id="311" objectId="43" parentObjId="21" parentObjType="connection" what="port" />
+    <delete id="312" objectId="21" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:25:11" id="113" prevId="112" session="2" user="Remi">
+    <delete id="313" objectId="44" parentObjId="22" parentObjType="connection" what="port" />
+    <delete id="314" objectId="45" parentObjId="22" parentObjType="connection" what="port" />
+    <delete id="315" objectId="22" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2013-10-14 15:25:12" id="114" prevId="113" session="2" user="Remi">
+    <add id="316" objectId="42" parentObjId="" parentObjType="" what="connection">
+      <connection id="42" />
+    </add>
+    <add id="317" objectId="84" parentObjId="42" parentObjType="connection" what="port">
+      <port id="84" moduleId="22" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="318" objectId="85" parentObjId="42" parentObjType="connection" what="port">
+      <port id="85" moduleId="14" moduleName="List" name="item0" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:25:25" id="115" prevId="114" session="2" user="Remi">
+    <add id="319" objectId="43" parentObjId="" parentObjType="" what="connection">
+      <connection id="43" />
+    </add>
+    <add id="320" objectId="86" parentObjId="43" parentObjType="connection" what="port">
+      <port id="86" moduleId="22" moduleName="Integer" name="value_as_string" signature="(org.vistrails.vistrails.basic:String)" type="source" />
+    </add>
+    <add id="321" objectId="87" parentObjId="43" parentObjType="connection" what="port">
+      <port id="87" moduleId="16" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:25:27" id="116" prevId="115" session="2" user="Remi">
+    <add id="322" objectId="44" parentObjId="" parentObjType="" what="connection">
+      <connection id="44" />
+    </add>
+    <add id="323" objectId="88" parentObjId="44" parentObjType="connection" what="port">
+      <port id="88" moduleId="21" moduleName="Integer" name="value_as_string" signature="(org.vistrails.vistrails.basic:String)" type="source" />
+    </add>
+    <add id="324" objectId="89" parentObjId="44" parentObjType="connection" what="port">
+      <port id="89" moduleId="16" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:25:37" id="117" prevId="116" session="2" user="Remi">
+    <add id="325" objectId="23" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="23" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="326" objectId="70" parentObjId="23" parentObjType="module" what="location">
+      <location id="70" x="191.855008185" y="-303.211411538" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:25:37" id="118" prevId="117" session="2" user="Remi">
+    <add id="327" objectId="45" parentObjId="" parentObjType="" what="connection">
+      <connection id="45" />
+    </add>
+    <add id="328" objectId="90" parentObjId="45" parentObjType="connection" what="port">
+      <port id="90" moduleId="16" moduleName="If" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="329" objectId="91" parentObjId="45" parentObjType="connection" what="port">
+      <port id="91" moduleId="23" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:25:43" id="119" prevId="118" session="2" user="Remi">
+    <change id="330" newObjId="71" oldObjId="70" parentObjId="23" parentObjType="module" what="location">
+      <location id="71" x="183.805147702" y="-338.094140299" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:25:43" id="120" prevId="119" session="2" user="Remi">
+    <add id="331" objectId="12" parentObjId="23" parentObjType="module" what="function">
+      <function id="12" name="name" pos="0" />
+    </add>
+    <add id="332" objectId="15" parentObjId="12" parentObjType="function" what="parameter">
+      <parameter alias="" id="15" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="result" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:27:23" id="121" prevId="120" session="2" user="Remi">
+    <change id="333" newObjId="72" oldObjId="58" parentObjId="2" parentObjType="module" what="location">
+      <location id="72" x="-332.217736942" y="-301.624265778" />
+    </change>
+    <change id="334" newObjId="73" oldObjId="59" parentObjId="3" parentObjType="module" what="location">
+      <location id="73" x="-307.217736942" y="-402.624265778" />
+    </change>
+    <change id="335" newObjId="74" oldObjId="48" parentObjId="4" parentObjType="module" what="location">
+      <location id="74" x="-494.524190155" y="3.12583827304" />
+    </change>
+    <change id="336" newObjId="75" oldObjId="60" parentObjId="5" parentObjType="module" what="location">
+      <location id="75" x="12.8697942477" y="-141.936911896" />
+    </change>
+    <change id="337" newObjId="76" oldObjId="49" parentObjId="6" parentObjType="module" what="location">
+      <location id="76" x="-240.869723296" y="9.84835424859" />
+    </change>
+    <change id="338" newObjId="77" oldObjId="50" parentObjId="9" parentObjType="module" what="location">
+      <location id="77" x="-500.524190155" y="-159.874161727" />
+    </change>
+    <change id="339" newObjId="78" oldObjId="51" parentObjId="10" parentObjType="module" what="location">
+      <location id="78" x="-459.024190155" y="-60.374161727" />
+    </change>
+    <change id="340" newObjId="79" oldObjId="52" parentObjId="11" parentObjType="module" what="location">
+      <location id="79" x="-183.325192534" y="-149.790387764" />
+    </change>
+    <change id="341" newObjId="80" oldObjId="53" parentObjId="12" parentObjType="module" what="location">
+      <location id="80" x="-218.05035229" y="-58.5547907208" />
+    </change>
+    <change id="342" newObjId="81" oldObjId="66" parentObjId="13" parentObjType="module" what="location">
+      <location id="81" x="362.769749216" y="-179.604175438" />
+    </change>
+    <change id="343" newObjId="82" oldObjId="67" parentObjId="14" parentObjType="module" what="location">
+      <location id="82" x="330.120420357" y="-73.7753163779" />
+    </change>
+    <change id="344" newObjId="83" oldObjId="68" parentObjId="15" parentObjType="module" what="location">
+      <location id="83" x="376.27981633" y="-287.684712351" />
+    </change>
+    <change id="345" newObjId="84" oldObjId="69" parentObjId="16" parentObjType="module" what="location">
+      <location id="84" x="147.011066329" y="-250.433764002" />
+    </change>
+    <change id="346" newObjId="85" oldObjId="71" parentObjId="23" parentObjType="module" what="location">
+      <location id="85" x="175.402002733" y="-356.581059232" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:27:23" id="122" prevId="121" session="2" user="Remi">
+    <delete id="347" objectId="0" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="348" objectId="1" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="349" objectId="0" parentObjId="" parentObjType="" what="connection" />
+    <delete id="350" objectId="6" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="351" objectId="7" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="352" objectId="3" parentObjId="" parentObjType="" what="connection" />
+    <delete id="353" objectId="10" parentObjId="5" parentObjType="connection" what="port" />
+    <delete id="354" objectId="11" parentObjId="5" parentObjType="connection" what="port" />
+    <delete id="355" objectId="5" parentObjId="" parentObjType="" what="connection" />
+    <delete id="356" objectId="22" parentObjId="11" parentObjType="connection" what="port" />
+    <delete id="357" objectId="23" parentObjId="11" parentObjType="connection" what="port" />
+    <delete id="358" objectId="11" parentObjId="" parentObjType="" what="connection" />
+    <delete id="359" objectId="24" parentObjId="12" parentObjType="connection" what="port" />
+    <delete id="360" objectId="25" parentObjId="12" parentObjType="connection" what="port" />
+    <delete id="361" objectId="12" parentObjId="" parentObjType="" what="connection" />
+    <delete id="362" objectId="26" parentObjId="13" parentObjType="connection" what="port" />
+    <delete id="363" objectId="27" parentObjId="13" parentObjType="connection" what="port" />
+    <delete id="364" objectId="13" parentObjId="" parentObjType="" what="connection" />
+    <delete id="365" objectId="32" parentObjId="16" parentObjType="connection" what="port" />
+    <delete id="366" objectId="33" parentObjId="16" parentObjType="connection" what="port" />
+    <delete id="367" objectId="16" parentObjId="" parentObjType="" what="connection" />
+    <delete id="368" objectId="34" parentObjId="17" parentObjType="connection" what="port" />
+    <delete id="369" objectId="35" parentObjId="17" parentObjType="connection" what="port" />
+    <delete id="370" objectId="17" parentObjId="" parentObjType="" what="connection" />
+    <delete id="371" objectId="38" parentObjId="19" parentObjType="connection" what="port" />
+    <delete id="372" objectId="39" parentObjId="19" parentObjType="connection" what="port" />
+    <delete id="373" objectId="19" parentObjId="" parentObjType="" what="connection" />
+    <delete id="374" objectId="40" parentObjId="20" parentObjType="connection" what="port" />
+    <delete id="375" objectId="41" parentObjId="20" parentObjType="connection" what="port" />
+    <delete id="376" objectId="20" parentObjId="" parentObjType="" what="connection" />
+    <delete id="377" objectId="46" parentObjId="23" parentObjType="connection" what="port" />
+    <delete id="378" objectId="47" parentObjId="23" parentObjType="connection" what="port" />
+    <delete id="379" objectId="23" parentObjId="" parentObjType="" what="connection" />
+    <delete id="380" objectId="48" parentObjId="24" parentObjType="connection" what="port" />
+    <delete id="381" objectId="49" parentObjId="24" parentObjType="connection" what="port" />
+    <delete id="382" objectId="24" parentObjId="" parentObjType="" what="connection" />
+    <delete id="383" objectId="54" parentObjId="27" parentObjType="connection" what="port" />
+    <delete id="384" objectId="55" parentObjId="27" parentObjType="connection" what="port" />
+    <delete id="385" objectId="27" parentObjId="" parentObjType="" what="connection" />
+    <delete id="386" objectId="56" parentObjId="28" parentObjType="connection" what="port" />
+    <delete id="387" objectId="57" parentObjId="28" parentObjType="connection" what="port" />
+    <delete id="388" objectId="28" parentObjId="" parentObjType="" what="connection" />
+    <delete id="389" objectId="58" parentObjId="29" parentObjType="connection" what="port" />
+    <delete id="390" objectId="59" parentObjId="29" parentObjType="connection" what="port" />
+    <delete id="391" objectId="29" parentObjId="" parentObjType="" what="connection" />
+    <delete id="392" objectId="60" parentObjId="30" parentObjType="connection" what="port" />
+    <delete id="393" objectId="61" parentObjId="30" parentObjType="connection" what="port" />
+    <delete id="394" objectId="30" parentObjId="" parentObjType="" what="connection" />
+    <delete id="395" objectId="62" parentObjId="31" parentObjType="connection" what="port" />
+    <delete id="396" objectId="63" parentObjId="31" parentObjType="connection" what="port" />
+    <delete id="397" objectId="31" parentObjId="" parentObjType="" what="connection" />
+    <delete id="398" objectId="64" parentObjId="32" parentObjType="connection" what="port" />
+    <delete id="399" objectId="65" parentObjId="32" parentObjType="connection" what="port" />
+    <delete id="400" objectId="32" parentObjId="" parentObjType="" what="connection" />
+    <delete id="401" objectId="66" parentObjId="33" parentObjType="connection" what="port" />
+    <delete id="402" objectId="67" parentObjId="33" parentObjType="connection" what="port" />
+    <delete id="403" objectId="33" parentObjId="" parentObjType="" what="connection" />
+    <delete id="404" objectId="68" parentObjId="34" parentObjType="connection" what="port" />
+    <delete id="405" objectId="69" parentObjId="34" parentObjType="connection" what="port" />
+    <delete id="406" objectId="34" parentObjId="" parentObjType="" what="connection" />
+    <delete id="407" objectId="70" parentObjId="35" parentObjType="connection" what="port" />
+    <delete id="408" objectId="71" parentObjId="35" parentObjType="connection" what="port" />
+    <delete id="409" objectId="35" parentObjId="" parentObjType="" what="connection" />
+    <delete id="410" objectId="72" parentObjId="36" parentObjType="connection" what="port" />
+    <delete id="411" objectId="73" parentObjId="36" parentObjType="connection" what="port" />
+    <delete id="412" objectId="36" parentObjId="" parentObjType="" what="connection" />
+    <delete id="413" objectId="74" parentObjId="37" parentObjType="connection" what="port" />
+    <delete id="414" objectId="75" parentObjId="37" parentObjType="connection" what="port" />
+    <delete id="415" objectId="37" parentObjId="" parentObjType="" what="connection" />
+    <delete id="416" objectId="76" parentObjId="38" parentObjType="connection" what="port" />
+    <delete id="417" objectId="77" parentObjId="38" parentObjType="connection" what="port" />
+    <delete id="418" objectId="38" parentObjId="" parentObjType="" what="connection" />
+    <delete id="419" objectId="78" parentObjId="39" parentObjType="connection" what="port" />
+    <delete id="420" objectId="79" parentObjId="39" parentObjType="connection" what="port" />
+    <delete id="421" objectId="39" parentObjId="" parentObjType="" what="connection" />
+    <delete id="422" objectId="80" parentObjId="40" parentObjType="connection" what="port" />
+    <delete id="423" objectId="81" parentObjId="40" parentObjType="connection" what="port" />
+    <delete id="424" objectId="40" parentObjId="" parentObjType="" what="connection" />
+    <delete id="425" objectId="82" parentObjId="41" parentObjType="connection" what="port" />
+    <delete id="426" objectId="83" parentObjId="41" parentObjType="connection" what="port" />
+    <delete id="427" objectId="41" parentObjId="" parentObjType="" what="connection" />
+    <delete id="428" objectId="84" parentObjId="42" parentObjType="connection" what="port" />
+    <delete id="429" objectId="85" parentObjId="42" parentObjType="connection" what="port" />
+    <delete id="430" objectId="42" parentObjId="" parentObjType="" what="connection" />
+    <delete id="431" objectId="86" parentObjId="43" parentObjType="connection" what="port" />
+    <delete id="432" objectId="87" parentObjId="43" parentObjType="connection" what="port" />
+    <delete id="433" objectId="43" parentObjId="" parentObjType="" what="connection" />
+    <delete id="434" objectId="88" parentObjId="44" parentObjType="connection" what="port" />
+    <delete id="435" objectId="89" parentObjId="44" parentObjType="connection" what="port" />
+    <delete id="436" objectId="44" parentObjId="" parentObjType="" what="connection" />
+    <delete id="437" objectId="90" parentObjId="45" parentObjType="connection" what="port" />
+    <delete id="438" objectId="91" parentObjId="45" parentObjType="connection" what="port" />
+    <delete id="439" objectId="45" parentObjId="" parentObjType="" what="connection" />
+    <delete id="440" objectId="72" parentObjId="2" parentObjType="module" what="location" />
+    <delete id="441" objectId="6" parentObjId="5" parentObjType="function" what="parameter" />
+    <delete id="442" objectId="5" parentObjId="2" parentObjType="module" what="function" />
+    <delete id="443" objectId="7" parentObjId="6" parentObjType="function" what="parameter" />
+    <delete id="444" objectId="6" parentObjId="2" parentObjType="module" what="function" />
+    <delete id="445" objectId="2" parentObjId="" parentObjType="" what="module" />
+    <delete id="446" objectId="73" parentObjId="3" parentObjType="module" what="location" />
+    <delete id="447" objectId="10" parentObjId="8" parentObjType="function" what="parameter" />
+    <delete id="448" objectId="8" parentObjId="3" parentObjType="module" what="function" />
+    <delete id="449" objectId="3" parentObjId="" parentObjType="" what="module" />
+    <delete id="450" objectId="74" parentObjId="4" parentObjType="module" what="location" />
+    <delete id="451" objectId="5" parentObjId="4" parentObjType="function" what="parameter" />
+    <delete id="452" objectId="4" parentObjId="4" parentObjType="module" what="function" />
+    <delete id="453" objectId="4" parentObjId="" parentObjType="" what="module" />
+    <delete id="454" objectId="75" parentObjId="5" parentObjType="module" what="location" />
+    <delete id="455" objectId="2" parentObjId="2" parentObjType="function" what="parameter" />
+    <delete id="456" objectId="2" parentObjId="5" parentObjType="module" what="function" />
+    <delete id="457" objectId="0" parentObjId="5" parentObjType="module" what="annotation" />
+    <delete id="458" objectId="0" parentObjId="5" parentObjType="module" what="portSpec" />
+    <delete id="459" objectId="1" parentObjId="5" parentObjType="module" what="portSpec" />
+    <delete id="460" objectId="2" parentObjId="5" parentObjType="module" what="portSpec" />
+    <delete id="461" objectId="5" parentObjId="" parentObjType="" what="module" />
+    <delete id="462" objectId="76" parentObjId="6" parentObjType="module" what="location" />
+    <delete id="463" objectId="9" parentObjId="7" parentObjType="function" what="parameter" />
+    <delete id="464" objectId="7" parentObjId="6" parentObjType="module" what="function" />
+    <delete id="465" objectId="6" parentObjId="" parentObjType="" what="module" />
+    <delete id="466" objectId="44" parentObjId="7" parentObjType="module" what="location" />
+    <delete id="467" objectId="3" parentObjId="3" parentObjType="function" what="parameter" />
+    <delete id="468" objectId="3" parentObjId="7" parentObjType="module" what="function" />
+    <delete id="469" objectId="7" parentObjId="" parentObjType="" what="module" />
+    <delete id="470" objectId="45" parentObjId="8" parentObjType="module" what="location" />
+    <delete id="471" objectId="3" parentObjId="8" parentObjType="module" what="portSpec" />
+    <delete id="472" objectId="4" parentObjId="8" parentObjType="module" what="portSpec" />
+    <delete id="473" objectId="5" parentObjId="8" parentObjType="module" what="portSpec" />
+    <delete id="474" objectId="8" parentObjId="" parentObjType="" what="module" />
+    <delete id="475" objectId="77" parentObjId="9" parentObjType="module" what="location" />
+    <delete id="476" objectId="2" parentObjId="9" parentObjType="module" what="annotation" />
+    <delete id="477" objectId="6" parentObjId="9" parentObjType="module" what="portSpec" />
+    <delete id="478" objectId="7" parentObjId="9" parentObjType="module" what="portSpec" />
+    <delete id="479" objectId="8" parentObjId="9" parentObjType="module" what="portSpec" />
+    <delete id="480" objectId="9" parentObjId="" parentObjType="" what="module" />
+    <delete id="481" objectId="78" parentObjId="10" parentObjType="module" what="location" />
+    <delete id="482" objectId="10" parentObjId="" parentObjType="" what="module" />
+    <delete id="483" objectId="79" parentObjId="11" parentObjType="module" what="location" />
+    <delete id="484" objectId="4" parentObjId="11" parentObjType="module" what="annotation" />
+    <delete id="485" objectId="9" parentObjId="11" parentObjType="module" what="portSpec" />
+    <delete id="486" objectId="10" parentObjId="11" parentObjType="module" what="portSpec" />
+    <delete id="487" objectId="11" parentObjId="11" parentObjType="module" what="portSpec" />
+    <delete id="488" objectId="11" parentObjId="" parentObjType="" what="module" />
+    <delete id="489" objectId="80" parentObjId="12" parentObjType="module" what="location" />
+    <delete id="490" objectId="12" parentObjId="" parentObjType="" what="module" />
+    <delete id="491" objectId="81" parentObjId="13" parentObjType="module" what="location" />
+    <delete id="492" objectId="13" parentObjId="" parentObjType="" what="module" />
+    <delete id="493" objectId="82" parentObjId="14" parentObjType="module" what="location" />
+    <delete id="494" objectId="12" parentObjId="14" parentObjType="module" what="portSpec" />
+    <delete id="495" objectId="14" parentObjId="" parentObjType="" what="module" />
+    <delete id="496" objectId="83" parentObjId="15" parentObjType="module" what="location" />
+    <delete id="497" objectId="12" parentObjId="9" parentObjType="function" what="parameter" />
+    <delete id="498" objectId="9" parentObjId="15" parentObjType="module" what="function" />
+    <delete id="499" objectId="15" parentObjId="" parentObjType="" what="module" />
+    <delete id="500" objectId="84" parentObjId="16" parentObjType="module" what="location" />
+    <delete id="501" objectId="13" parentObjId="10" parentObjType="function" what="parameter" />
+    <delete id="502" objectId="10" parentObjId="16" parentObjType="module" what="function" />
+    <delete id="503" objectId="14" parentObjId="11" parentObjType="function" what="parameter" />
+    <delete id="504" objectId="11" parentObjId="16" parentObjType="module" what="function" />
+    <delete id="505" objectId="16" parentObjId="" parentObjType="" what="module" />
+    <delete id="506" objectId="54" parentObjId="17" parentObjType="module" what="location" />
+    <delete id="507" objectId="7" parentObjId="17" parentObjType="module" what="annotation" />
+    <delete id="508" objectId="17" parentObjId="" parentObjType="" what="module" />
+    <delete id="509" objectId="55" parentObjId="18" parentObjType="module" what="location" />
+    <delete id="510" objectId="8" parentObjId="18" parentObjType="module" what="annotation" />
+    <delete id="511" objectId="18" parentObjId="" parentObjType="" what="module" />
+    <delete id="512" objectId="56" parentObjId="19" parentObjType="module" what="location" />
+    <delete id="513" objectId="10" parentObjId="19" parentObjType="module" what="annotation" />
+    <delete id="514" objectId="19" parentObjId="" parentObjType="" what="module" />
+    <delete id="515" objectId="57" parentObjId="20" parentObjType="module" what="location" />
+    <delete id="516" objectId="9" parentObjId="20" parentObjType="module" what="annotation" />
+    <delete id="517" objectId="20" parentObjId="" parentObjType="" what="module" />
+    <delete id="518" objectId="64" parentObjId="21" parentObjType="module" what="location" />
+    <delete id="519" objectId="11" parentObjId="21" parentObjType="module" what="annotation" />
+    <delete id="520" objectId="21" parentObjId="" parentObjType="" what="module" />
+    <delete id="521" objectId="65" parentObjId="22" parentObjType="module" what="location" />
+    <delete id="522" objectId="12" parentObjId="22" parentObjType="module" what="annotation" />
+    <delete id="523" objectId="22" parentObjId="" parentObjType="" what="module" />
+    <delete id="524" objectId="85" parentObjId="23" parentObjType="module" what="location" />
+    <delete id="525" objectId="15" parentObjId="12" parentObjType="function" what="parameter" />
+    <delete id="526" objectId="12" parentObjId="23" parentObjType="module" what="function" />
+    <delete id="527" objectId="23" parentObjId="" parentObjType="" what="module" />
+    <add id="528" objectId="24" parentObjId="" parentObjType="" what="group">
+      <group cache="1" id="24" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+        <workflow id="" name="untitled" version="" vistrail_id="">
+          <connection id="1">
+            <port id="1" moduleId="1" moduleName="If" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+            <port id="2" moduleId="2" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+          </connection>
+          <connection id="2">
+            <port id="3" moduleId="4" moduleName="PythonSource" name="o" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+            <port id="4" moduleId="1" moduleName="If" name="Condition" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+          </connection>
+          <connection id="3">
+            <port id="5" moduleId="6" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+            <port id="6" moduleId="7" moduleName="Untuple" name="value" signature="(org.vistrails.vistrails.basic:Integer,org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="4">
+            <port id="7" moduleId="3" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+            <port id="8" moduleId="9" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="5">
+            <port id="9" moduleId="9" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="10" moduleId="8" moduleName="Tuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="6">
+            <port id="11" moduleId="8" moduleName="Tuple" name="self" signature="(org.vistrails.vistrails.basic:Tuple)" type="source" />
+            <port id="12" moduleId="1" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <connection id="7">
+            <port id="13" moduleId="5" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+            <port id="14" moduleId="11" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="8">
+            <port id="15" moduleId="11" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="16" moduleId="10" moduleName="Tuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="9">
+            <port id="17" moduleId="10" moduleName="Tuple" name="self" signature="(org.vistrails.vistrails.basic:Tuple)" type="source" />
+            <port id="18" moduleId="1" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <connection id="10">
+            <port id="19" moduleId="13" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+            <port id="20" moduleId="12" moduleName="And" name="InputList" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+          </connection>
+          <connection id="11">
+            <port id="21" moduleId="12" moduleName="And" name="Result" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+            <port id="22" moduleId="14" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+          </connection>
+          <connection id="12">
+            <port id="23" moduleId="4" moduleName="PythonSource" name="o" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+            <port id="24" moduleId="15" moduleName="If" name="Condition" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+          </connection>
+          <connection id="13">
+            <port id="25" moduleId="17" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="26" moduleId="3" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="14">
+            <port id="27" moduleId="16" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="28" moduleId="3" moduleName="PythonCalc" name="value2" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="15">
+            <port id="29" moduleId="7" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="30" moduleId="16" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="16">
+            <port id="31" moduleId="7" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="32" moduleId="17" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="17">
+            <port id="33" moduleId="16" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="34" moduleId="8" moduleName="Tuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="18">
+            <port id="35" moduleId="18" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="36" moduleId="5" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="19">
+            <port id="37" moduleId="7" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="38" moduleId="18" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="20">
+            <port id="39" moduleId="19" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="40" moduleId="5" moduleName="PythonCalc" name="value2" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="21">
+            <port id="41" moduleId="7" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="42" moduleId="19" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="22">
+            <port id="43" moduleId="19" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="44" moduleId="10" moduleName="Tuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="23">
+            <port id="45" moduleId="7" moduleName="Untuple" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="46" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="24">
+            <port id="47" moduleId="7" moduleName="Untuple" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="48" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="25">
+            <port id="49" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="50" moduleId="4" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="26">
+            <port id="51" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="52" moduleId="4" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="27">
+            <port id="53" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="54" moduleId="13" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <connection id="28">
+            <port id="55" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="56" moduleId="13" moduleName="List" name="item0" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <connection id="29">
+            <port id="57" moduleId="21" moduleName="Integer" name="value_as_string" signature="(org.vistrails.vistrails.basic:String)" type="source" />
+            <port id="58" moduleId="15" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <connection id="30">
+            <port id="59" moduleId="20" moduleName="Integer" name="value_as_string" signature="(org.vistrails.vistrails.basic:String)" type="source" />
+            <port id="60" moduleId="15" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <connection id="31">
+            <port id="61" moduleId="15" moduleName="If" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+            <port id="62" moduleId="22" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+          </connection>
+          <module cache="1" id="1" name="If" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3">
+            <location id="1" x="-204.779080686" y="-265.233676235" />
+            <function id="1" name="TrueOutputPorts" pos="0">
+              <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+            </function>
+            <function id="2" name="FalseOutputPorts" pos="1">
+              <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+            </function>
+          </module>
+          <module cache="1" id="2" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="2" x="-179.779080686" y="-366.233676235" />
+            <function id="3" name="name" pos="0">
+              <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="state" />
+            </function>
+          </module>
+          <module cache="1" id="3" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1">
+            <location id="3" x="-367.085533899" y="39.5164278163" />
+            <function id="4" name="op" pos="0">
+              <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="-" />
+            </function>
+          </module>
+          <module cache="1" id="4" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="4" x="140.308450504" y="-105.546322352" />
+            <function id="5" name="source" pos="0">
+              <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="o%20%3D%20a%20%3C%20b" />
+            </function>
+            <annotation id="1" key="__desc__" value=". < ." />
+            <portSpec id="1" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+              <portSpecItem default="" entryType="" id="1" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="2" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+              <portSpecItem default="" entryType="" id="2" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="3" maxConns="-1" minConns="0" name="o" optional="0" sortKey="0" type="output">
+              <portSpecItem default="" entryType="" id="3" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="5" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1">
+            <location id="5" x="-113.431067039" y="46.2389437918" />
+            <function id="6" name="op" pos="0">
+              <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="-" />
+            </function>
+          </module>
+          <module cache="1" id="6" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="6" x="16.985557297" y="477.770977814" />
+            <function id="7" name="name" pos="0">
+              <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="nbs" />
+            </function>
+          </module>
+          <module cache="1" id="7" name="Untuple" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="7" x="28.985557297" y="390.770977814" />
+            <portSpec id="4" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="output">
+              <portSpecItem default="" entryType="" id="4" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="5" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="output">
+              <portSpecItem default="" entryType="" id="5" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="6" maxConns="-1" minConns="0" name="value" optional="0" sortKey="-1" type="input">
+              <portSpecItem default="" entryType="" id="6" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+              <portSpecItem default="" entryType="" id="7" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="1" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="8" name="Tuple" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="8" x="-373.085533899" y="-123.483572184" />
+            <annotation id="2" key="__desc__" value="a, b-a" />
+            <portSpec id="7" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+              <portSpecItem default="" entryType="" id="8" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="8" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+              <portSpecItem default="" entryType="" id="9" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="9" maxConns="-1" minConns="0" name="value" optional="0" sortKey="-1" type="output">
+              <portSpecItem default="" entryType="" id="10" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+              <portSpecItem default="" entryType="" id="11" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="1" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="9" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="9" x="-331.585533899" y="-23.9835721837" />
+          </module>
+          <module cache="1" id="10" name="Tuple" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="10" x="-55.8865362778" y="-113.39979822" />
+            <annotation id="3" key="__desc__" value="a-b, b" />
+            <portSpec id="10" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+              <portSpecItem default="" entryType="" id="12" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="11" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+              <portSpecItem default="" entryType="" id="13" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="12" maxConns="-1" minConns="0" name="value" optional="0" sortKey="-1" type="output">
+              <portSpecItem default="" entryType="" id="14" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+              <portSpecItem default="" entryType="" id="15" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="1" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="11" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="11" x="-90.6116960333" y="-22.1642011776" />
+          </module>
+          <module cache="1" id="12" name="And" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3">
+            <location id="12" x="490.208405472" y="-143.213585895" />
+          </module>
+          <module cache="1" id="13" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="13" x="457.559076613" y="-37.3847268346" />
+            <portSpec id="13" maxConns="-1" minConns="0" name="item0" optional="0" sortKey="-1" type="input">
+              <portSpecItem default="" entryType="" id="16" label="" module="Module" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="14" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="14" x="503.718472586" y="-251.294122808" />
+            <function id="8" name="name" pos="0">
+              <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="continue" />
+            </function>
+          </module>
+          <module cache="1" id="15" name="If" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3">
+            <location id="15" x="274.449722585" y="-214.043174458" />
+            <function id="9" name="TrueOutputPorts" pos="0">
+              <parameter alias="" id="9" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+            </function>
+            <function id="10" name="FalseOutputPorts" pos="1">
+              <parameter alias="" id="10" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+            </function>
+          </module>
+          <module cache="1" id="16" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="16" x="-519.267366814" y="162.981885037" />
+            <annotation id="4" key="__desc__" value="a" />
+          </module>
+          <module cache="1" id="17" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="17" x="-387.943777787" y="166.378184753" />
+            <annotation id="5" key="__desc__" value="b" />
+          </module>
+          <module cache="1" id="18" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="18" x="-178.063609883" y="169.989677574" />
+            <annotation id="6" key="__desc__" value="a" />
+          </module>
+          <module cache="1" id="19" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="19" x="-4.85232435585" y="165.461277953" />
+            <annotation id="7" key="__desc__" value="b" />
+          </module>
+          <module cache="1" id="20" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="20" x="223.203226011" y="184.663372764" />
+            <annotation id="8" key="__desc__" value="a" />
+          </module>
+          <module cache="1" id="21" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="21" x="368.112013904" y="182.399172953" />
+            <annotation id="9" key="__desc__" value="b" />
+          </module>
+          <module cache="1" id="22" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="22" x="302.840658989" y="-320.190469688" />
+            <function id="11" name="name" pos="0">
+              <parameter alias="" id="11" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="result" />
+            </function>
+          </module>
+        </workflow>
+      </group>
+    </add>
+    <add id="529" objectId="86" parentObjId="24" parentObjType="group" what="location">
+      <location id="86" x="-127.438656256" y="-36.3905895432" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:27:30" id="123" prevId="122" session="2" user="Remi">
+    <add id="530" objectId="25" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="25" name="While" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.3" />
+    </add>
+    <add id="531" objectId="87" parentObjId="25" parentObjType="module" what="location">
+      <location id="87" x="-106.621620243" y="-161.836387869" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:27:40" id="124" prevId="123" session="2" user="Remi">
+    <add id="532" objectId="46" parentObjId="" parentObjType="" what="connection">
+      <connection id="46" />
+    </add>
+    <add id="533" objectId="92" parentObjId="46" parentObjType="connection" what="port">
+      <port id="92" moduleId="24" moduleName="Group" name="self" signature="(org.vistrails.vistrails.basic:Group)" type="source" />
+    </add>
+    <add id="534" objectId="93" parentObjId="46" parentObjType="connection" what="port">
+      <port id="93" moduleId="25" moduleName="While" name="FunctionPort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:27:49" id="125" prevId="124" session="2" user="Remi">
+    <add id="535" objectId="13" parentObjId="25" parentObjType="module" what="function">
+      <function id="13" name="StateOutputPorts" pos="0" />
+    </add>
+    <add id="536" objectId="16" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="16" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['state']" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:27:56" id="126" prevId="125" session="2" user="Remi">
+    <add id="537" objectId="14" parentObjId="24" parentObjType="group" what="function">
+      <function id="14" name="nbs" pos="0" />
+    </add>
+    <add id="538" objectId="18" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="18" name="<no description>" pos="1" type="org.vistrails.vistrails.basic:Integer" val="" />
+    </add>
+    <add id="539" objectId="17" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="17" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="9" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:27:57" id="127" prevId="126" session="2" user="Remi">
+    <change id="540" newObjId="19" oldObjId="18" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="19" name="<no description>" pos="1" type="org.vistrails.vistrails.basic:Integer" val="12" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:28:02" id="128" prevId="127" session="2" user="Remi">
+    <change id="541" newObjId="20" oldObjId="19" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="20" name="<no description>" pos="1" type="org.vistrails.vistrails.basic:Integer" val="15" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:28:13" id="129" prevId="128" session="2" user="Remi">
+    <add id="542" objectId="15" parentObjId="25" parentObjType="module" what="function">
+      <function id="15" name="StateInputPorts" pos="1" />
+    </add>
+    <add id="543" objectId="21" parentObjId="15" parentObjType="function" what="parameter">
+      <parameter alias="" id="21" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['nbs']" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:28:16" id="130" prevId="129" session="2" user="Remi">
+    <add id="544" objectId="16" parentObjId="25" parentObjType="module" what="function">
+      <function id="16" name="OutputPort" pos="2" />
+    </add>
+    <add id="545" objectId="22" parentObjId="16" parentObjType="function" what="parameter">
+      <parameter alias="" id="22" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="result" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:28:20" id="131" prevId="130" session="2" user="Remi">
+    <add id="546" objectId="26" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="26" name="StandardOutput" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="547" objectId="88" parentObjId="26" parentObjType="module" what="location">
+      <location id="88" x="-16.1836387869" y="-268.458008111" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:28:20" id="132" prevId="131" session="2" user="Remi">
+    <add id="548" objectId="47" parentObjId="" parentObjType="" what="connection">
+      <connection id="47" />
+    </add>
+    <add id="549" objectId="94" parentObjId="47" parentObjType="connection" what="port">
+      <port id="94" moduleId="25" moduleName="While" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="550" objectId="95" parentObjId="47" parentObjType="connection" what="port">
+      <port id="95" moduleId="26" moduleName="StandardOutput" name="value" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-10-14 15:28:22" id="133" prevId="132" session="2" user="Remi">
+    <change id="551" newObjId="89" oldObjId="88" parentObjId="26" parentObjType="module" what="location">
+      <location id="89" x="-49.5028951127" y="-270.361965616" />
+    </change>
+  </action>
+  <action date="2013-10-14 15:28:57" id="134" prevId="133" session="2" user="Remi">
+    <add id="552" objectId="17" parentObjId="25" parentObjType="module" what="function">
+      <function id="17" name="ConditionPort" pos="3" />
+    </add>
+    <add id="553" objectId="23" parentObjId="17" parentObjType="function" what="parameter">
+      <parameter alias="" id="23" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="continue" />
+    </add>
+  </action>
+</vistrail>
diff --git a/examples/head.vt b/examples/head.vt
new file mode 100644
index 0000000..0b7c407
Binary files /dev/null and b/examples/head.vt differ
diff --git a/examples/infovis.vt b/examples/infovis.vt
new file mode 100644
index 0000000..799222b
Binary files /dev/null and b/examples/infovis.vt differ
diff --git a/examples/lung.vt b/examples/lung.vt
new file mode 100644
index 0000000..ce251cd
Binary files /dev/null and b/examples/lung.vt differ
diff --git a/examples/matplotlib/Acorr_ex8.vt b/examples/matplotlib/Acorr_ex8.vt
new file mode 100644
index 0000000..f4e9e27
Binary files /dev/null and b/examples/matplotlib/Acorr_ex8.vt differ
diff --git a/examples/matplotlib/Arrow_ex9.vt b/examples/matplotlib/Arrow_ex9.vt
new file mode 100644
index 0000000..2643084
Binary files /dev/null and b/examples/matplotlib/Arrow_ex9.vt differ
diff --git a/examples/matplotlib/Psd.vt b/examples/matplotlib/Psd.vt
new file mode 100644
index 0000000..d671910
Binary files /dev/null and b/examples/matplotlib/Psd.vt differ
diff --git a/examples/matplotlib/ReadMe.txt b/examples/matplotlib/ReadMe.txt
new file mode 100644
index 0000000..1576b02
--- /dev/null
+++ b/examples/matplotlib/ReadMe.txt
@@ -0,0 +1,23 @@
+(Note: the following *.vt files need to be imported in vistrails and executed)
+The following plots have been plotted with vistrails using matplotlib package.
+
+Arrow_ex9 	is an arrow marking downwards. by varying the input coordinates the direction of the arrow can be changed.
+					(x,y,dx,dy) are the required inputs.
+Acorr_ex8 	   plots an Acorr in matplotlib.
+					(x) is required input.			
+Axhspan_ex5 	plots the axhspan graph along the x axis.
+					(ymin,ymax) are the required input.
+bar_ex1 	represents a mplbar plot.
+				(left,height) are the required parameters.	
+hist_ex1 	plots a histogram.
+				(x) is the required input.			
+line2D_ex4 	is a dashed box plot
+					(x) is the required input.	
+line2D_ex7 	is a dashed line chart with line properties
+					(x,y) are the required input.
+lineplot_ex3 	is a simple line chart
+					(x,y) are the reuired input.
+pie_ex1 	is a pie chart with shadow
+				(x) is required input which is a list.
+polar_ex10 	represents the polar plot with radius and theta as input.
+					(r,theta) are input where theta is 2*pi*r.
\ No newline at end of file
diff --git a/examples/matplotlib/annotate.vt b/examples/matplotlib/annotate.vt
new file mode 100644
index 0000000..e3b9956
Binary files /dev/null and b/examples/matplotlib/annotate.vt differ
diff --git a/examples/matplotlib/axhspan_ex5.vt b/examples/matplotlib/axhspan_ex5.vt
new file mode 100644
index 0000000..12eabe2
Binary files /dev/null and b/examples/matplotlib/axhspan_ex5.vt differ
diff --git a/examples/matplotlib/bar_ex1.vt b/examples/matplotlib/bar_ex1.vt
new file mode 100644
index 0000000..88c4373
Binary files /dev/null and b/examples/matplotlib/bar_ex1.vt differ
diff --git a/examples/matplotlib/cohere.vt b/examples/matplotlib/cohere.vt
new file mode 100644
index 0000000..c706ee2
Binary files /dev/null and b/examples/matplotlib/cohere.vt differ
diff --git a/examples/matplotlib/contour.vt b/examples/matplotlib/contour.vt
new file mode 100644
index 0000000..248022a
Binary files /dev/null and b/examples/matplotlib/contour.vt differ
diff --git a/examples/matplotlib/contourf.vt b/examples/matplotlib/contourf.vt
new file mode 100644
index 0000000..c54aec7
Binary files /dev/null and b/examples/matplotlib/contourf.vt differ
diff --git a/examples/matplotlib/hist_ex1.vt b/examples/matplotlib/hist_ex1.vt
new file mode 100644
index 0000000..b8533bd
Binary files /dev/null and b/examples/matplotlib/hist_ex1.vt differ
diff --git a/examples/matplotlib/line2d_ex4.vt b/examples/matplotlib/line2d_ex4.vt
new file mode 100644
index 0000000..c0d6443
Binary files /dev/null and b/examples/matplotlib/line2d_ex4.vt differ
diff --git a/examples/matplotlib/line2d_ex7.vt b/examples/matplotlib/line2d_ex7.vt
new file mode 100644
index 0000000..ad5c7e1
Binary files /dev/null and b/examples/matplotlib/line2d_ex7.vt differ
diff --git a/examples/matplotlib/lineplot_ex3.vt b/examples/matplotlib/lineplot_ex3.vt
new file mode 100644
index 0000000..c90a889
Binary files /dev/null and b/examples/matplotlib/lineplot_ex3.vt differ
diff --git a/examples/matplotlib/pcolor.vt b/examples/matplotlib/pcolor.vt
new file mode 100644
index 0000000..0dcd34c
Binary files /dev/null and b/examples/matplotlib/pcolor.vt differ
diff --git a/examples/matplotlib/pie_ex1.vt b/examples/matplotlib/pie_ex1.vt
new file mode 100644
index 0000000..25f3433
Binary files /dev/null and b/examples/matplotlib/pie_ex1.vt differ
diff --git a/examples/matplotlib/polar_ex10.vt b/examples/matplotlib/polar_ex10.vt
new file mode 100644
index 0000000..846b616
Binary files /dev/null and b/examples/matplotlib/polar_ex10.vt differ
diff --git a/examples/matplotlib/scatter.vt b/examples/matplotlib/scatter.vt
new file mode 100644
index 0000000..c002e72
Binary files /dev/null and b/examples/matplotlib/scatter.vt differ
diff --git a/examples/matplotlib/semilog.vt b/examples/matplotlib/semilog.vt
new file mode 100644
index 0000000..94db983
Binary files /dev/null and b/examples/matplotlib/semilog.vt differ
diff --git a/examples/mummy.xml b/examples/mummy.xml
new file mode 100644
index 0000000..95782c8
--- /dev/null
+++ b/examples/mummy.xml
@@ -0,0 +1,552 @@
+  <visTrail version="0.3.0">
+    <action date="05 Jul 2006 11:12:53" parent="0" time="2" user="emanuele" what="addModule">
+      <object cache="1" id="0" name="vtkStructuredPointsReader" x="-0.967032957532" y="1.8021978022"/>
+    </action>
+    <action date="05 Jul 2006 11:13:10" parent="2" time="3" user="emanuele" what="moveModule">
+      <move dx="-2.93040299416" dy="88.6446914673" id="0"/>
+      <move dx="-2.93040299416" dy="88.6446914673" id="0"/>
+      <move dx="-2.93040299416" dy="88.6446914673" id="0"/>
+      <move dx="2.64289617538" dy="149.323638916" id="0"/>
+    </action>
+    <action date="05 Jul 2006 11:14:15" parent="3" time="4" user="emanuele" what="moveModule">
+      <move dx="2.64289617538" dy="149.323638916" id="0"/>
+      <move dx="2.64289617538" dy="149.323638916" id="0"/>
+      <move dx="2.64289617538" dy="149.323638916" id="0"/>
+      <move dx="2.64289617538" dy="149.323638916" id="0"/>
+      <move dx="-4.12526130676" dy="-33.0020904541" id="0"/>
+      <move dx="-4.12526130676" dy="-33.0020904541" id="0"/>
+    </action>
+    <action date="05 Jul 2006 11:14:15" parent="4" time="5" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFileName" functionId="0" moduleId="0" parameter="(unnamed)" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:14:41" parent="5" time="6" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFileName" functionId="0" moduleId="0" parameter="(unnamed)" parameterId="0" type="String" value="../examples/data/mummy.128.vtk"/>
+    </action>
+    <action date="05 Jul 2006 11:15:16" parent="6" time="7" user="emanuele" what="addModule">
+      <object cache="0" id="1" name="vtkPiecewiseFunction" x="-32.8559157536" y="204.296605696"/>
+    </action>
+    <action date="05 Jul 2006 11:16:04" parent="7" time="8" user="emanuele" what="moveModule">
+      <move dx="-4.12526130676" dy="-33.0020904541" id="0"/>
+      <move dx="-4.12526130676" dy="-33.0020904541" id="0"/>
+      <move dx="-4.12526130676" dy="-33.0020904541" id="0"/>
+      <move dx="-4.12526130676" dy="-33.0020904541" id="0"/>
+      <move dx="22.0703868866" dy="472.306304932" id="1"/>
+      <move dx="22.0703868866" dy="472.306304932" id="1"/>
+      <move dx="436.661560059" dy="142.583374023" id="1"/>
+      <move dx="-118.076850891" dy="-37.8737068176" id="0"/>
+      <move dx="-2.22786521912" dy="11.1393260956" id="1"/>
+    </action>
+    <action date="05 Jul 2006 11:16:04" parent="8" time="9" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="0" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="AddPoint" functionId="0" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:16:12" parent="9" time="10" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="0" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="79"/>
+      <set alias="" function="AddPoint" functionId="0" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:16:16" parent="10" time="11" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="0" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="79"/>
+      <set alias="" function="AddPoint" functionId="0" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:16:21" parent="11" time="12" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="1" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="AddPoint" functionId="1" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:16:27" parent="12" time="13" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="1" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="80"/>
+      <set alias="" function="AddPoint" functionId="1" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:16:32" parent="13" time="14" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="1" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="80"/>
+      <set alias="" function="AddPoint" functionId="1" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value="0.1"/>
+    </action>
+    <action date="05 Jul 2006 11:16:41" parent="14" time="15" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="2" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="AddPoint" functionId="2" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:16:46" parent="15" time="16" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="2" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="110"/>
+      <set alias="" function="AddPoint" functionId="2" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:16:52" parent="16" time="17" user="emanuele" what="changeParameter">
+      <set alias="" function="AddPoint" functionId="2" moduleId="1" parameter="(unnamed)" parameterId="0" type="Float" value="110"/>
+      <set alias="" function="AddPoint" functionId="2" moduleId="1" parameter="(unnamed)" parameterId="1" type="Float" value="0.8"/>
+    </action>
+    <action date="05 Jul 2006 11:17:39" parent="17" time="18" user="emanuele" what="moveModule">
+      <move dx="-61.6779518127" dy="-804.616882324" id="1"/>
+      <move dx="-204.864761353" dy="167.841003418" id="1"/>
+      <move dx="17.2777519226" dy="197.460006714" id="0"/>
+      <move dx="197.460021973" dy="88.8570022583" id="1"/>
+    </action>
+    <action date="05 Jul 2006 11:17:39" parent="18" time="19" user="emanuele" what="addModule">
+      <object cache="0" id="2" name="vtkColorTransferFunction" x="332.116694623" y="538.146279974"/>
+    </action>
+    <action date="05 Jul 2006 11:17:55" parent="19" time="20" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:18:03" parent="20" time="21" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="79.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:06" parent="21" time="22" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="79.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:09" parent="22" time="23" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="79.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:13" parent="23" time="24" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="79.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="0" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:18:15" parent="24" time="25" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:18:21" parent="25" time="26" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="80.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:24" parent="26" time="27" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="80.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.8"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:29" parent="27" time="28" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="80.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.8"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.3"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:34" parent="28" time="29" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="80.0"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.8"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.3"/>
+      <set alias="" function="AddRGBPoint" functionId="1" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:18:45" parent="29" time="30" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:18:51" parent="30" time="31" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="110.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:54" parent="31" time="32" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="110.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:56" parent="32" time="33" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="110.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:18:59" parent="33" time="34" user="emanuele" what="changeParameter">
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="0" type="Float" value="110.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="1" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="2" type="Float" value="1.0"/>
+      <set alias="" function="AddRGBPoint" functionId="2" moduleId="2" parameter="(unnamed)" parameterId="3" type="Float" value="1.0"/>
+    </action>
+    <action date="05 Jul 2006 11:19:16" parent="34" time="35" user="emanuele" what="addModule">
+      <object cache="0" id="3" name="vtkVolumeProperty" x="-172.779209448" y="604.01445454"/>
+    </action>
+    <action date="05 Jul 2006 11:19:34" parent="35" time="36" user="emanuele" what="moveModule">
+      <move dx="162.002761841" dy="-392.00668335" id="3"/>
+      <move dx="-4.00006818771" dy="10.0001707077" id="2"/>
+    </action>
+    <action date="05 Jul 2006 11:19:34" parent="36" time="37" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="vtkVolumeProperty" destinationPort="SetColor_2(vtkPiecewiseFunction)" id="0" sourceId="2" sourceModule="vtkColorTransferFunction" sourcePort="self(vtkColorTransferFunction)"/>
+    </action>
+    <action date="05 Jul 2006 11:20:07" parent="37" time="38" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="vtkVolumeProperty" destinationPort="SetScalarOpacity_2(vtkPiecewiseFunction)" id="1" sourceId="1" sourceModule="vtkPiecewiseFunction" sourcePort="self(vtkPiecewiseFunction)"/>
+    </action>
+    <action date="05 Jul 2006 11:21:01" parent="38" time="39" user="emanuele" what="moveModule">
+      <move dx="62.0010604858" dy="-136.002319336" id="2"/>
+      <move dx="134.002288818" dy="386.006591797" id="3"/>
+    </action>
+    <action date="05 Jul 2006 11:21:21" parent="39" time="40" user="emanuele" what="addModule">
+      <object cache="0" id="4" name="vtkVolumeRayCastCompositeFunction" x="-244.780439357" y="410.011148283"/>
+    </action>
+    <action date="05 Jul 2006 11:21:50" parent="40" time="41" user="emanuele" what="changeParameter">
+      <set alias="" function="SetInterpolationTypeToLinear" functionId="0" moduleId="3" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:22:03" parent="41" time="42" user="emanuele" what="changeParameter">
+      <set alias="" function="ShadeOn" functionId="1" moduleId="3" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:22:30" parent="42" time="43" user="emanuele" what="addModule">
+      <object cache="0" id="5" name="vtkVolumeRayCastMapper" x="-254.780610178" y="684.015817945"/>
+    </action>
+    <action date="05 Jul 2006 11:22:38" parent="43" time="44" user="emanuele" what="moveModule">
+      <move dx="-32.0005455017" dy="0.0" id="5"/>
+    </action>
+    <action date="05 Jul 2006 11:22:38" parent="44" time="45" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkVolumeRayCastMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="2" sourceId="0" sourceModule="vtkStructuredPointsReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="05 Jul 2006 11:22:54" parent="45" time="46" user="emanuele" what="moveModule">
+      <move dx="520.008911133" dy="452.00769043" id="4"/>
+      <move dx="-112.001914978" dy="86.0014648438" id="0"/>
+      <move dx="16.0002727509" dy="40.0006828308" id="4"/>
+    </action>
+    <action date="05 Jul 2006 11:22:55" parent="46" time="47" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="vtkVolumeRayCastMapper" destinationPort="SetVolumeRayCastFunction(vtkVolumeRayCastFunction)" id="3" sourceId="4" sourceModule="vtkVolumeRayCastCompositeFunction" sourcePort="self(vtkVolumeRayCastCompositeFunction)"/>
+    </action>
+    <action date="05 Jul 2006 11:23:17" parent="47" time="48" user="emanuele" what="changeParameter">
+      <set alias="" function="SetSampleDistance" functionId="0" moduleId="5" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:23:23" parent="48" time="49" user="emanuele" what="changeParameter">
+      <set alias="" function="SetSampleDistance" functionId="0" moduleId="5" parameter="(unnamed)" parameterId="0" type="Float" value="0.25"/>
+    </action>
+    <action date="05 Jul 2006 11:24:09" parent="49" time="50" user="emanuele" what="addModule">
+      <object cache="0" id="6" name="vtkVolume" x="-194.779585254" y="406.011080113"/>
+    </action>
+    <action date="05 Jul 2006 11:24:17" parent="50" time="51" user="emanuele" what="moveModule">
+      <move dx="-118.00201416" dy="-42.0007171631" id="6"/>
+    </action>
+    <action date="05 Jul 2006 11:24:17" parent="51" time="52" user="emanuele" what="addConnection">
+      <connect destinationId="6" destinationModule="vtkVolume" destinationPort="SetMapper(vtkAbstractVolumeMapper)" id="4" sourceId="5" sourceModule="vtkVolumeRayCastMapper" sourcePort="self(vtkVolumeRayCastMapper)"/>
+    </action>
+    <action date="05 Jul 2006 11:24:24" parent="52" time="53" user="emanuele" what="addConnection">
+      <connect destinationId="6" destinationModule="vtkVolume" destinationPort="SetProperty(vtkVolumeProperty)" id="5" sourceId="3" sourceModule="vtkVolumeProperty" sourcePort="self(vtkVolumeProperty)"/>
+    </action>
+    <action date="05 Jul 2006 11:25:15" parent="53" time="54" user="emanuele" what="addModule">
+      <object cache="0" id="7" name="vtkRenderer" x="151.226325141" y="134.006444536"/>
+    </action>
+    <action date="05 Jul 2006 11:25:26" parent="54" time="55" user="emanuele" what="moveModule">
+      <move dx="-306.005218506" dy="2.00003409386" id="7"/>
+    </action>
+    <action date="05 Jul 2006 11:25:26" parent="55" time="56" user="emanuele" what="addConnection">
+      <connect destinationId="7" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="6" sourceId="6" sourceModule="vtkVolume" sourcePort="self(vtkVolume)"/>
+    </action>
+    <action date="05 Jul 2006 11:25:31" parent="56" time="57" user="emanuele" what="deleteConnection">
+      <connection connectionId="6"/>
+    </action>
+    <action date="05 Jul 2006 11:25:42" parent="57" time="58" user="emanuele" what="addConnection">
+      <connect destinationId="7" destinationModule="vtkRenderer" destinationPort="AddVolume(vtkProp)" id="6" sourceId="6" sourceModule="vtkVolume" sourcePort="self(vtkVolume)"/>
+    </action>
+    <action date="05 Jul 2006 11:26:13" parent="58" time="59" user="emanuele" what="moveModule">
+      <move dx="52.0008888245" dy="42.0007171631" id="7"/>
+    </action>
+    <action date="05 Jul 2006 11:26:13" parent="59" time="60" user="emanuele" what="changeParameter">
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:26:17" parent="60" time="61" user="emanuele" what="changeParameter">
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:26:18" parent="61" time="62" user="emanuele" what="changeParameter">
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:26:21" parent="62" time="63" user="emanuele" what="changeParameter">
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:26:46" parent="63" time="64" user="emanuele" what="addModule">
+      <object cache="0" id="8" name="VTKCell" x="1.22376283138" y="-105.997645679"/>
+    </action>
+    <action date="05 Jul 2006 11:26:55" parent="64" time="65" user="emanuele" what="moveModule">
+      <move dx="110.001876831" dy="100.001701355" id="8"/>
+    </action>
+    <action date="05 Jul 2006 11:26:56" parent="65" time="66" user="emanuele" what="addConnection">
+      <connect destinationId="8" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="7" sourceId="7" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="05 Jul 2006 11:27:04" parent="66" time="67" user="emanuele" what="moveModule">
+      <move dx="52.0008888245" dy="42.0007171631" id="8"/>
+    </action>
+    <action date="05 Jul 2006 11:44:23" parent="67" time="68" user="emanuele" what="addModule">
+      <object cache="0" id="9" name="vtkCamera" x="447.024390583" y="175.802321742"/>
+    </action>
+    <action date="05 Jul 2006 11:45:01" parent="68" time="69" user="emanuele" what="moveModule">
+      <move dx="13.7722740173" dy="11.4768953323" id="9"/>
+    </action>
+    <action date="05 Jul 2006 11:45:01" parent="69" time="70" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewAngle" functionId="0" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:45:05" parent="70" time="71" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewAngle" functionId="0" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="30"/>
+    </action>
+    <action date="05 Jul 2006 11:45:13" parent="71" time="72" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:45:22" parent="72" time="73" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="658.889"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:45:32" parent="73" time="74" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="658.889"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="-346.805"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:45:41" parent="74" time="75" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="658.889"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="-346.805"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value="-195.327"/>
+    </action>
+    <action date="05 Jul 2006 11:45:50" parent="75" time="76" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:46:03" parent="76" time="77" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.166388"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:46:11" parent="77" time="78" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.166388"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="-0.394732"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:46:22" parent="78" time="79" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.166388"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="-0.394732"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value="0.903605"/>
+    </action>
+    <action date="05 Jul 2006 11:46:43" parent="79" time="80" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="05 Jul 2006 11:46:53" parent="80" time="81" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="111.157"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value=""/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:47:03" parent="81" time="82" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="111.157"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="150.498"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value=""/>
+    </action>
+    <action date="05 Jul 2006 11:47:19" parent="82" time="83" user="emanuele" what="changeParameter">
+      <notes>
+        <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Lucida Grande; font-size:13pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>
+      </notes>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="0" type="Float" value="111.157"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="1" type="Float" value="150.498"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="9" parameter="(unnamed)" parameterId="2" type="Float" value="122.775"/>
+    </action>
+    <action date="05 Jul 2006 11:48:37" parent="83" time="84" user="emanuele" what="addConnection">
+      <connect destinationId="7" destinationModule="vtkRenderer" destinationPort="SetActiveCamera(vtkCamera)" id="8" sourceId="9" sourceModule="vtkCamera" sourcePort="self(vtkCamera)"/>
+    </action>
+    <action date="05 Jul 2006 11:48:59" parent="84" time="85" user="emanuele" what="moveModule">
+      <move dx="-427.931274414" dy="144.718582153" id="9"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="0" time="86" user="emanuele" what="addModule">
+      <object cache="0" id="0" name="vtkRenderer" x="106.147061222" y="-590.161953604"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="86" time="87" user="emanuele" what="addModule">
+      <object cache="0" id="1" name="vtkContourFilter" x="263.555115764" y="-109.797516937"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="87" time="88" user="emanuele" what="addModule">
+      <object cache="0" id="2" name="vtkDataSetMapper" x="177.838497215" y="-257.043881891"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="88" time="89" user="emanuele" what="addModule">
+      <object cache="0" id="3" name="vtkActor" x="408.945517245" y="-443.966479924"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="89" time="90" user="emanuele" what="addModule">
+      <object cache="0" id="4" name="vtkCamera" x="475.211758196" y="-724.262382954"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="90" time="91" user="emanuele" what="addModule">
+      <object cache="0" id="5" name="VTKCell" x="49.0608815312" y="-728.492757793"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="91" time="92" user="emanuele" what="addModule">
+      <object cache="0" id="6" name="vtkStructuredPointsReader" x="9.70802920407" y="13.1094890511"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="92" time="93" user="emanuele" what="addModule">
+      <object cache="0" id="7" name="vtkProperty" x="513.411929439" y="-332.785870007"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="93" time="94" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="0" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="94" time="95" user="emanuele" what="changeParameter">
+      <set alias="" function="SetValue" functionId="0" moduleId="1" parameter="" parameterId="0" type="Integer" value="0"/>
+      <set alias="" function="SetValue" functionId="0" moduleId="1" parameter="" parameterId="1" type="Float" value="67"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="95" time="96" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="1" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="96" time="97" user="emanuele" what="changeParameter">
+      <set alias="" function="ScalarVisibilityOff" functionId="0" moduleId="2" parameter="" parameterId="-1" type="" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="97" time="98" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="2" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="98" time="99" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="3" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="99" time="100" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="0" moduleId="4" parameter="" parameterId="0" type="Float" value="744.495278753"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="4" parameter="" parameterId="1" type="Float" value="-452.645563908"/>
+      <set alias="" function="SetPosition" functionId="0" moduleId="4" parameter="" parameterId="2" type="Float" value="369.493592636"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="100" time="101" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="1" moduleId="4" parameter="" parameterId="0" type="Float" value="-0.0112199962915"/>
+      <set alias="" function="SetViewUp" functionId="1" moduleId="4" parameter="" parameterId="1" type="Float" value="-0.180037940492"/>
+      <set alias="" function="SetViewUp" functionId="1" moduleId="4" parameter="" parameterId="2" type="Float" value="-0.983595674892"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="101" time="102" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="2" moduleId="4" parameter="<no description>" parameterId="0" type="Float" value="134.736557007"/>
+      <set alias="" function="SetFocalPoint" functionId="2" moduleId="4" parameter="<no description>" parameterId="1" type="Float" value="135.585741997"/>
+      <set alias="" function="SetFocalPoint" functionId="2" moduleId="4" parameter="<no description>" parameterId="2" type="Float" value="148.703317642"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="102" time="103" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="4" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="103" time="104" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="5" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="104" time="105" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFileName" functionId="0" moduleId="6" parameter="" parameterId="0" type="String" value="../examples/data/head.120.vtk"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="105" time="106" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="6" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="106" time="107" user="emanuele" what="changeParameter">
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="107" time="108" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="7" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="108" time="109" user="emanuele" what="addConnection">
+      <connect destinationId="5" destinationModule="VTKCell" destinationPort="AddRenderer(vtkRenderer)" id="0" sourceId="0" sourceModule="vtkRenderer" sourcePort="self(vtkRenderer)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="109" time="110" user="emanuele" what="addConnection">
+      <connect destinationId="0" destinationModule="vtkRenderer" destinationPort="AddActor(vtkProp)" id="1" sourceId="3" sourceModule="vtkActor" sourcePort="self(vtkActor)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="110" time="111" user="emanuele" what="addConnection">
+      <connect destinationId="0" destinationModule="vtkRenderer" destinationPort="SetActiveCamera(vtkCamera)" id="2" sourceId="4" sourceModule="vtkCamera" sourcePort="self(vtkCamera)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="111" time="112" user="emanuele" what="addConnection">
+      <connect destinationId="1" destinationModule="vtkContourFilter" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="3" sourceId="6" sourceModule="vtkStructuredPointsReader" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="112" time="113" user="emanuele" what="addConnection">
+      <connect destinationId="2" destinationModule="vtkDataSetMapper" destinationPort="SetInputConnection0(vtkAlgorithmOutput)" id="4" sourceId="1" sourceModule="vtkContourFilter" sourcePort="GetOutputPort0(vtkAlgorithmOutput)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="113" time="114" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="vtkActor" destinationPort="SetMapper(vtkMapper)" id="5" sourceId="2" sourceModule="vtkDataSetMapper" sourcePort="self(vtkDataSetMapper)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:07" parent="114" time="115" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="vtkActor" destinationPort="SetProperty(vtkProperty)" id="6" sourceId="7" sourceModule="vtkProperty" sourcePort="self(vtkProperty)"/>
+    </action>
+    <action date="18 Jan 2007 21:29:22" parent="115" time="116" user="emanuele" what="changeParameter">
+      <set alias="filename" function="SetFileName" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="../examples/data/head.120.vtk"/>
+    </action>
+    <action date="18 Jan 2007 21:29:33" parent="116" time="117" user="emanuele" what="changeParameter">
+      <set alias="" function="SetValue" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+      <set alias="isovalue" function="SetValue" functionId="0" moduleId="1" parameter="<no description>" parameterId="1" type="Float" value="67"/>
+    </action>
+    <action date="18 Jan 2007 21:30:25" parent="85" time="118" user="emanuele" what="changeParameter">
+      <set alias="filename" function="SetFileName" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="String" value="../examples/data/mummy.128.vtk"/>
+    </action>
+    <action date="18 Jan 2007 21:31:37" parent="118" time="119" user="emanuele" what="changeParameter">
+      <set alias="Background_R" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="18 Jan 2007 21:31:47" parent="119" time="120" user="emanuele" what="changeParameter">
+      <set alias="Background_R" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="Background_G" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="18 Jan 2007 21:31:57" parent="120" time="121" user="emanuele" what="changeParameter">
+      <set alias="Background_R" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+      <set alias="Background_G" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="1" type="Float" value="0.0"/>
+      <set alias="Background_B" function="SetBackground" functionId="0" moduleId="7" parameter="<no description>" parameterId="2" type="Float" value="0.0"/>
+    </action>
+    <action date="18 Jan 2007 21:46:02" parent="117" time="122" user="emanuele" what="deleteConnection">
+      <connection connectionId="2"/>
+    </action>
+    <action date="18 Jan 2007 21:46:02" parent="122" time="123" user="emanuele" what="deleteModule">
+      <module moduleId="4"/>
+    </action>
+    <action date="18 Jan 2007 21:46:04" parent="123" time="124" user="emanuele" what="addModule">
+      <object cache="0" id="4" name="vtkCamera" x="42.8653901863" y="341.997799227"/>
+    </action>
+    <action date="18 Jan 2007 21:46:04" parent="124" time="125" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewAngle" functionId="0" moduleId="4" parameter="(unnamed)" parameterId="0" type="Float" value="30"/>
+    </action>
+    <action date="18 Jan 2007 21:46:04" parent="125" time="126" user="emanuele" what="changeParameter">
+      <set alias="" function="SetPosition" functionId="1" moduleId="4" parameter="(unnamed)" parameterId="0" type="Float" value="658.889"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="4" parameter="(unnamed)" parameterId="1" type="Float" value="-346.805"/>
+      <set alias="" function="SetPosition" functionId="1" moduleId="4" parameter="(unnamed)" parameterId="2" type="Float" value="-195.327"/>
+    </action>
+    <action date="18 Jan 2007 21:46:04" parent="126" time="127" user="emanuele" what="changeParameter">
+      <set alias="" function="SetViewUp" functionId="2" moduleId="4" parameter="(unnamed)" parameterId="0" type="Float" value="0.166388"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="4" parameter="(unnamed)" parameterId="1" type="Float" value="-0.394732"/>
+      <set alias="" function="SetViewUp" functionId="2" moduleId="4" parameter="(unnamed)" parameterId="2" type="Float" value="0.903605"/>
+    </action>
+    <action date="18 Jan 2007 21:46:04" parent="127" time="128" user="emanuele" what="changeParameter">
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="4" parameter="(unnamed)" parameterId="0" type="Float" value="111.157"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="4" parameter="(unnamed)" parameterId="1" type="Float" value="150.498"/>
+      <set alias="" function="SetFocalPoint" functionId="3" moduleId="4" parameter="(unnamed)" parameterId="2" type="Float" value="122.775"/>
+    </action>
+    <action date="18 Jan 2007 21:46:04" parent="128" time="129" user="emanuele" what="changeAnnotation">
+      <set key="" moduleId="4" value=""/>
+    </action>
+    <action date="18 Jan 2007 21:46:55" parent="129" time="130" user="emanuele" what="moveModule">
+      <move dx="357.893953153" dy="-856.730355211" id="4"/>
+    </action>
+    <action date="18 Jan 2007 21:46:55" parent="130" time="131" user="emanuele" what="addConnection">
+      <connect destinationId="0" destinationModule="vtkRenderer" destinationPort="SetActiveCamera(vtkCamera)" id="2" sourceId="4" sourceModule="vtkCamera" sourcePort="self(vtkCamera)"/>
+    </action>
+    <action date="18 Jan 2007 21:47:57" parent="131" time="132" user="emanuele" what="changeParameter">
+      <set alias="filename" function="SetFileName" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="../examples/data/mummy.128.vtk"/>
+    </action>
+    <action date="18 Jan 2007 21:48:06" parent="132" time="133" user="emanuele" what="changeParameter">
+      <set alias="filename" function="SetFileName" functionId="0" moduleId="6" parameter="<no description>" parameterId="0" type="String" value="../examples/data/mummy.128.vtk"/>
+    </action>
+    <action date="18 Jan 2007 21:49:00" parent="133" time="134" user="emanuele" what="moveModule">
+      <move dx="2.62040212778" dy="2.62040212778" id="7"/>
+    </action>
+    <action date="18 Jan 2007 21:49:00" parent="134" time="135" user="emanuele" what="changeParameter">
+      <set alias="Diffuse_Color_R" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="18 Jan 2007 21:49:12" parent="135" time="136" user="emanuele" what="changeParameter">
+      <set alias="Diffuse_Color_R" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="Diffuse_Color_G" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <action date="18 Jan 2007 21:49:24" parent="136" time="137" user="emanuele" what="changeParameter">
+      <set alias="Diffuse_Color_R" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="0" type="Float" value="1"/>
+      <set alias="Diffuse_Color_G" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="1" type="Float" value="1"/>
+      <set alias="Diffuse_Color_B" function="SetDiffuseColor" functionId="0" moduleId="7" parameter="<no description>" parameterId="2" type="Float" value="1"/>
+    </action>
+    <tag name="Isosufarce" time="137"/>
+    <tag name="Volume Rendering" time="121"/>
+  </visTrail>
diff --git a/examples/noaa_webservices.vt b/examples/noaa_webservices.vt
new file mode 100644
index 0000000..dda6f9d
Binary files /dev/null and b/examples/noaa_webservices.vt differ
diff --git a/examples/offscreen.vt b/examples/offscreen.vt
new file mode 100644
index 0000000..c190f43
Binary files /dev/null and b/examples/offscreen.vt differ
diff --git a/examples/plot.vt b/examples/plot.vt
new file mode 100644
index 0000000..16103c0
Binary files /dev/null and b/examples/plot.vt differ
diff --git a/examples/primes.xml b/examples/primes.xml
new file mode 100644
index 0000000..82ecd79
--- /dev/null
+++ b/examples/primes.xml
@@ -0,0 +1,2357 @@
+<vistrail id="" name="" version="1.0.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2013-09-06 11:26:54" id="1" prevId="0" session="0" user="Remi">
+    <annotation id="3" key="__description__" value="Paste" />
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="1" objectId="2" parentObjId="0" parentObjType="module" what="portSpec">
+      <portSpec id="2" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+        <portSpecItem default="" entryType="" id="2" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="2" objectId="1" parentObjId="0" parentObjType="module" what="portSpec">
+      <portSpec id="1" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+        <portSpecItem default="" entryType="" id="1" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="3" objectId="0" parentObjId="0" parentObjType="module" what="portSpec">
+      <portSpec id="0" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+        <portSpecItem default="" entryType="" id="0" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="4" objectId="0" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="0" key="__desc__" value=". < ." />
+    </add>
+    <add id="5" objectId="0" parentObjId="0" parentObjType="module" what="function">
+      <function id="0" name="source" pos="0" />
+    </add>
+    <add id="6" objectId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20a%20%3C%20b" />
+    </add>
+    <add id="7" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="181.966355936" y="-2.88028790861" />
+    </add>
+    <add id="8" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="And" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2" />
+    </add>
+    <add id="9" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="111.966355936" y="-217.880287908" />
+    </add>
+    <add id="10" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="11" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="95.8633409086" y="-122.880287908" />
+    </add>
+    <add id="12" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="13" objectId="5" parentObjId="3" parentObjType="module" what="portSpec">
+      <portSpec id="5" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+        <portSpecItem default="" entryType="" id="5" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="14" objectId="4" parentObjId="3" parentObjType="module" what="portSpec">
+      <portSpec id="4" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+        <portSpecItem default="" entryType="" id="4" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="15" objectId="3" parentObjId="3" parentObjType="module" what="portSpec">
+      <portSpec id="3" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+        <portSpecItem default="" entryType="" id="3" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="16" objectId="1" parentObjId="3" parentObjType="module" what="annotation">
+      <annotation id="1" key="__desc__" value=". / ." />
+    </add>
+    <add id="17" objectId="1" parentObjId="3" parentObjType="module" what="function">
+      <function id="1" name="source" pos="0" />
+    </add>
+    <add id="18" objectId="1" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20b%20%25%20a%20%3D%3D%200" />
+    </add>
+    <add id="19" objectId="3" parentObjId="3" parentObjType="module" what="location">
+      <location id="3" x="-43.6113466612" y="59.6438212406" />
+    </add>
+    <add id="20" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="Not" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="21" objectId="4" parentObjId="4" parentObjType="module" what="location">
+      <location id="4" x="31.7209643223" y="-36.1439550279" />
+    </add>
+    <add id="22" objectId="5" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="5" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1" />
+    </add>
+    <add id="23" objectId="2" parentObjId="5" parentObjType="module" what="annotation">
+      <annotation id="2" key="__desc__" value=". + 1" />
+    </add>
+    <add id="24" objectId="3" parentObjId="5" parentObjType="module" what="function">
+      <function id="3" name="value2" pos="1" />
+    </add>
+    <add id="25" objectId="3" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="1" />
+    </add>
+    <add id="26" objectId="2" parentObjId="5" parentObjType="module" what="function">
+      <function id="2" name="op" pos="0" />
+    </add>
+    <add id="27" objectId="2" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+    </add>
+    <add id="28" objectId="5" parentObjId="5" parentObjType="module" what="location">
+      <location id="5" x="-217.059286738" y="24.9064133305" />
+    </add>
+    <add id="29" objectId="6" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="6" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="30" objectId="6" parentObjId="6" parentObjType="module" what="location">
+      <location id="6" x="-111.593122731" y="208.82905206" />
+    </add>
+    <add id="31" objectId="7" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="7" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="32" objectId="4" parentObjId="7" parentObjType="module" what="function">
+      <function id="4" name="name" pos="0" />
+    </add>
+    <add id="33" objectId="4" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_max" />
+    </add>
+    <add id="34" objectId="7" parentObjId="7" parentObjType="module" what="location">
+      <location id="7" x="261.933912394" y="437.377239703" />
+    </add>
+    <add id="35" objectId="8" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="8" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="36" objectId="5" parentObjId="8" parentObjType="module" what="function">
+      <function id="5" name="name" pos="0" />
+    </add>
+    <add id="37" objectId="5" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_max_sqrt" />
+    </add>
+    <add id="38" objectId="8" parentObjId="8" parentObjType="module" what="location">
+      <location id="8" x="317.099490673" y="154.996084102" />
+    </add>
+    <add id="39" objectId="9" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="9" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="40" objectId="6" parentObjId="9" parentObjType="module" what="function">
+      <function id="6" name="name" pos="0" />
+    </add>
+    <add id="41" objectId="6" parentObjId="6" parentObjType="function" what="parameter">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_next" />
+    </add>
+    <add id="42" objectId="9" parentObjId="9" parentObjType="module" what="location">
+      <location id="9" x="-268.881414792" y="-238.149268289" />
+    </add>
+    <add id="43" objectId="10" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="10" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="44" objectId="7" parentObjId="10" parentObjType="module" what="function">
+      <function id="7" name="name" pos="0" />
+    </add>
+    <add id="45" objectId="7" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+    </add>
+    <add id="46" objectId="10" parentObjId="10" parentObjType="module" what="location">
+      <location id="10" x="-74.5510124689" y="-260.572007018" />
+    </add>
+    <add id="47" objectId="11" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="11" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="48" objectId="8" parentObjId="11" parentObjType="module" what="function">
+      <function id="8" name="name" pos="0" />
+    </add>
+    <add id="49" objectId="8" parentObjId="8" parentObjType="function" what="parameter">
+      <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+    </add>
+    <add id="50" objectId="11" parentObjId="11" parentObjType="module" what="location">
+      <location id="11" x="184.057907545" y="-341.293866444" />
+    </add>
+    <add id="51" objectId="12" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="12" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="52" objectId="9" parentObjId="12" parentObjType="module" what="function">
+      <function id="9" name="name" pos="0" />
+    </add>
+    <add id="53" objectId="9" parentObjId="9" parentObjType="function" what="parameter">
+      <parameter alias="" id="9" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_i" />
+    </add>
+    <add id="54" objectId="12" parentObjId="12" parentObjType="module" what="location">
+      <location id="12" x="-84.6987509181" y="310.893785862" />
+    </add>
+    <add id="55" objectId="13" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="13" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="56" objectId="13" parentObjId="13" parentObjType="module" what="location">
+      <location id="13" x="-230.213393406" y="-116.846435793" />
+    </add>
+    <add id="57" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0" />
+    </add>
+    <add id="58" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="1" moduleName="And" name="InputList" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+    </add>
+    <add id="59" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="2" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+    </add>
+    <add id="60" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1" />
+    </add>
+    <add id="61" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="2" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="62" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="0" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="63" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2" />
+    </add>
+    <add id="64" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="4" moduleName="Not" name="input" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+    </add>
+    <add id="65" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="3" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="66" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3" />
+    </add>
+    <add id="67" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="2" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="68" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="4" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="69" objectId="4" parentObjId="" parentObjType="" what="connection">
+      <connection id="4" />
+    </add>
+    <add id="70" objectId="9" parentObjId="4" parentObjType="connection" what="port">
+      <port id="9" moduleId="3" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+    <add id="71" objectId="8" parentObjId="4" parentObjType="connection" what="port">
+      <port id="8" moduleId="7" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="72" objectId="5" parentObjId="" parentObjType="" what="connection">
+      <connection id="5" />
+    </add>
+    <add id="73" objectId="11" parentObjId="5" parentObjType="connection" what="port">
+      <port id="11" moduleId="0" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="74" objectId="10" parentObjId="5" parentObjType="connection" what="port">
+      <port id="10" moduleId="8" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="75" objectId="6" parentObjId="" parentObjType="" what="connection">
+      <connection id="6" />
+    </add>
+    <add id="76" objectId="13" parentObjId="6" parentObjType="connection" what="port">
+      <port id="13" moduleId="10" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+    <add id="77" objectId="12" parentObjId="6" parentObjType="connection" what="port">
+      <port id="12" moduleId="4" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="78" objectId="7" parentObjId="" parentObjType="" what="connection">
+      <connection id="7" />
+    </add>
+    <add id="79" objectId="15" parentObjId="7" parentObjType="connection" what="port">
+      <port id="15" moduleId="11" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+    <add id="80" objectId="14" parentObjId="7" parentObjType="connection" what="port">
+      <port id="14" moduleId="1" moduleName="And" name="Result" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+    </add>
+    <add id="81" objectId="8" parentObjId="" parentObjType="" what="connection">
+      <connection id="8" />
+    </add>
+    <add id="82" objectId="17" parentObjId="8" parentObjType="connection" what="port">
+      <port id="17" moduleId="6" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="83" objectId="16" parentObjId="8" parentObjType="connection" what="port">
+      <port id="16" moduleId="5" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="84" objectId="9" parentObjId="" parentObjType="" what="connection">
+      <connection id="9" />
+    </add>
+    <add id="85" objectId="19" parentObjId="9" parentObjType="connection" what="port">
+      <port id="19" moduleId="6" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="86" objectId="18" parentObjId="9" parentObjType="connection" what="port">
+      <port id="18" moduleId="3" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+    <add id="87" objectId="10" parentObjId="" parentObjType="" what="connection">
+      <connection id="10" />
+    </add>
+    <add id="88" objectId="21" parentObjId="10" parentObjType="connection" what="port">
+      <port id="21" moduleId="6" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="89" objectId="20" parentObjId="10" parentObjType="connection" what="port">
+      <port id="20" moduleId="0" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="90" objectId="11" parentObjId="" parentObjType="" what="connection">
+      <connection id="11" />
+    </add>
+    <add id="91" objectId="23" parentObjId="11" parentObjType="connection" what="port">
+      <port id="23" moduleId="6" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+    <add id="92" objectId="22" parentObjId="11" parentObjType="connection" what="port">
+      <port id="22" moduleId="12" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="93" objectId="12" parentObjId="" parentObjType="" what="connection">
+      <connection id="12" />
+    </add>
+    <add id="94" objectId="25" parentObjId="12" parentObjType="connection" what="port">
+      <port id="25" moduleId="9" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+    <add id="95" objectId="24" parentObjId="12" parentObjType="connection" what="port">
+      <port id="24" moduleId="13" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="96" objectId="13" parentObjId="" parentObjType="" what="connection">
+      <connection id="13" />
+    </add>
+    <add id="97" objectId="27" parentObjId="13" parentObjType="connection" what="port">
+      <port id="27" moduleId="13" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="98" objectId="26" parentObjId="13" parentObjType="connection" what="port">
+      <port id="26" moduleId="5" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:27:27" id="2" prevId="1" session="0" user="Remi">
+    <add id="99" objectId="10" parentObjId="6" parentObjType="module" what="function">
+      <function id="10" name="value" pos="0" />
+    </add>
+    <add id="100" objectId="10" parentObjId="10" parentObjType="function" what="parameter">
+      <parameter alias="" id="10" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:27:27" id="3" prevId="2" session="0" user="Remi">
+    <delete id="101" objectId="10" parentObjId="10" parentObjType="function" what="parameter" />
+    <delete id="102" objectId="10" parentObjId="6" parentObjType="module" what="function" />
+  </action>
+  <action date="2013-09-06 11:27:49" id="4" prevId="1" session="0" user="Remi">
+    <add id="103" objectId="11" parentObjId="6" parentObjType="module" what="function">
+      <function id="11" name="value" pos="0" />
+    </add>
+    <add id="104" objectId="11" parentObjId="11" parentObjType="function" what="parameter">
+      <parameter alias="" id="11" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="3" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:28:22" id="5" prevId="1" session="0" user="Remi">
+    <change id="105" newObjId="12" oldObjId="4" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="12" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_test" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:28:31" id="6" prevId="5" session="0" user="Remi">
+    <change id="106" newObjId="13" oldObjId="5" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="13" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_max" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:28:58" id="7" prevId="6" session="0" user="Remi">
+    <add id="107" objectId="14" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="14" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="108" objectId="14" parentObjId="14" parentObjType="module" what="location">
+      <location id="14" x="-344.576761577" y="429.308752129" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:03" id="8" prevId="7" session="0" user="Remi">
+    <add id="109" objectId="14" parentObjId="" parentObjType="" what="connection">
+      <connection id="14" />
+    </add>
+    <add id="110" objectId="28" parentObjId="14" parentObjType="connection" what="port">
+      <port id="28" moduleId="14" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="111" objectId="29" parentObjId="14" parentObjType="connection" what="port">
+      <port id="29" moduleId="12" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:06" id="9" prevId="8" session="0" user="Remi">
+    <change id="112" newObjId="15" oldObjId="14" parentObjId="14" parentObjType="module" what="location">
+      <location id="15" x="-151.105383151" y="406.713554648" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:29:06" id="10" prevId="9" session="0" user="Remi">
+    <add id="113" objectId="12" parentObjId="14" parentObjType="module" what="function">
+      <function id="12" name="value" pos="0" />
+    </add>
+    <add id="114" objectId="14" parentObjId="12" parentObjType="function" what="parameter">
+      <parameter alias="" id="14" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="3" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:09" id="11" prevId="10" session="0" user="Remi">
+    <add id="115" objectId="15" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="15" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="116" objectId="16" parentObjId="15" parentObjType="module" what="location">
+      <location id="16" x="158.166382363" y="576.177535752" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:13" id="12" prevId="11" session="0" user="Remi">
+    <change id="117" newObjId="17" oldObjId="16" parentObjId="15" parentObjType="module" what="location">
+      <location id="17" x="233.012974017" y="567.704336696" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:29:13" id="13" prevId="12" session="0" user="Remi">
+    <add id="118" objectId="13" parentObjId="15" parentObjType="module" what="function">
+      <function id="13" name="value" pos="0" />
+    </add>
+    <add id="119" objectId="15" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="15" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="12" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:15" id="14" prevId="13" session="0" user="Remi">
+    <add id="120" objectId="15" parentObjId="" parentObjType="" what="connection">
+      <connection id="15" />
+    </add>
+    <add id="121" objectId="30" parentObjId="15" parentObjType="connection" what="port">
+      <port id="30" moduleId="15" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="122" objectId="31" parentObjId="15" parentObjType="connection" what="port">
+      <port id="31" moduleId="7" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:19" id="15" prevId="14" session="0" user="Remi">
+    <change id="123" newObjId="19" oldObjId="17" parentObjId="15" parentObjType="module" what="location">
+      <location id="19" x="248.547172285" y="556.406737956" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:29:19" id="16" prevId="15" session="0" user="Remi">
+    <add id="124" objectId="16" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="16" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="125" objectId="18" parentObjId="16" parentObjType="module" what="location">
+      <location id="18" x="386.942756853" y="290.913167561" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:30" id="17" prevId="16" session="0" user="Remi">
+    <add id="126" objectId="14" parentObjId="16" parentObjType="module" what="function">
+      <function id="14" name="value" pos="0" />
+    </add>
+    <add id="127" objectId="16" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="16" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="4" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:34" id="18" prevId="17" session="0" user="Remi">
+    <change id="128" newObjId="20" oldObjId="18" parentObjId="16" parentObjType="module" what="location">
+      <location id="20" x="314.920564884" y="290.913167561" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:29:34" id="19" prevId="18" session="0" user="Remi">
+    <add id="129" objectId="16" parentObjId="" parentObjType="" what="connection">
+      <connection id="16" />
+    </add>
+    <add id="130" objectId="32" parentObjId="16" parentObjType="connection" what="port">
+      <port id="32" moduleId="16" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="131" objectId="33" parentObjId="16" parentObjType="connection" what="port">
+      <port id="33" moduleId="8" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:45" id="20" prevId="19" session="0" user="Remi">
+    <delete id="132" objectId="32" parentObjId="16" parentObjType="connection" what="port" />
+    <delete id="133" objectId="33" parentObjId="16" parentObjType="connection" what="port" />
+    <delete id="134" objectId="16" parentObjId="" parentObjType="" what="connection" />
+    <delete id="135" objectId="20" parentObjId="16" parentObjType="module" what="location" />
+    <delete id="136" objectId="16" parentObjId="14" parentObjType="function" what="parameter" />
+    <delete id="137" objectId="14" parentObjId="16" parentObjType="module" what="function" />
+    <delete id="138" objectId="16" parentObjId="" parentObjType="" what="module" />
+  </action>
+  <action date="2013-09-06 11:29:50" id="21" prevId="20" session="0" user="Remi">
+    <add id="139" objectId="17" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="17" name="Float" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="140" objectId="21" parentObjId="17" parentObjType="module" what="location">
+      <location id="21" x="326.218163624" y="292.325367403" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:51" id="22" prevId="21" session="0" user="Remi">
+    <add id="141" objectId="17" parentObjId="" parentObjType="" what="connection">
+      <connection id="17" />
+    </add>
+    <add id="142" objectId="34" parentObjId="17" parentObjType="connection" what="port">
+      <port id="34" moduleId="17" moduleName="Float" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="143" objectId="35" parentObjId="17" parentObjType="connection" what="port">
+      <port id="35" moduleId="8" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:29:55" id="23" prevId="22" session="0" user="Remi">
+    <change id="144" newObjId="22" oldObjId="21" parentObjId="17" parentObjType="module" what="location">
+      <location id="22" x="324.805963782" y="292.325367403" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:29:55" id="24" prevId="23" session="0" user="Remi">
+    <add id="145" objectId="15" parentObjId="17" parentObjType="module" what="function">
+      <function id="15" name="value" pos="0" />
+    </add>
+    <add id="146" objectId="17" parentObjId="15" parentObjType="function" what="parameter">
+      <parameter alias="" id="17" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="3.4" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:31:19" id="25" prevId="24" session="1" user="Remi">
+    <change id="147" newObjId="18" oldObjId="14" parentObjId="12" parentObjType="function" what="parameter">
+      <parameter alias="" id="18" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="5" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:31:33" id="26" prevId="25" session="1" user="Remi">
+    <change id="148" newObjId="19" oldObjId="15" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="19" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="16" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:31:37" id="27" prevId="26" session="1" user="Remi">
+    <change id="149" newObjId="20" oldObjId="17" parentObjId="15" parentObjType="function" what="parameter">
+      <parameter alias="" id="20" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="4.0" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:31:44" id="28" prevId="27" session="1" user="Remi">
+    <change id="150" newObjId="21" oldObjId="18" parentObjId="12" parentObjType="function" what="parameter">
+      <parameter alias="" id="21" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:31:49" id="29" prevId="28" session="1" user="Remi">
+    <change id="151" newObjId="22" oldObjId="21" parentObjId="12" parentObjType="function" what="parameter">
+      <parameter alias="" id="22" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="3" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:33:22" id="30" prevId="6" session="1" user="Remi">
+    <delete id="152" objectId="1" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="153" objectId="0" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="154" objectId="0" parentObjId="" parentObjType="" what="connection" />
+    <delete id="155" objectId="3" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="156" objectId="2" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="157" objectId="1" parentObjId="" parentObjType="" what="connection" />
+    <delete id="158" objectId="5" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="159" objectId="4" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="160" objectId="2" parentObjId="" parentObjType="" what="connection" />
+    <delete id="161" objectId="7" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="162" objectId="6" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="163" objectId="3" parentObjId="" parentObjType="" what="connection" />
+    <delete id="164" objectId="9" parentObjId="4" parentObjType="connection" what="port" />
+    <delete id="165" objectId="8" parentObjId="4" parentObjType="connection" what="port" />
+    <delete id="166" objectId="4" parentObjId="" parentObjType="" what="connection" />
+    <delete id="167" objectId="11" parentObjId="5" parentObjType="connection" what="port" />
+    <delete id="168" objectId="10" parentObjId="5" parentObjType="connection" what="port" />
+    <delete id="169" objectId="5" parentObjId="" parentObjType="" what="connection" />
+    <delete id="170" objectId="13" parentObjId="6" parentObjType="connection" what="port" />
+    <delete id="171" objectId="12" parentObjId="6" parentObjType="connection" what="port" />
+    <delete id="172" objectId="6" parentObjId="" parentObjType="" what="connection" />
+    <delete id="173" objectId="15" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="174" objectId="14" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="175" objectId="7" parentObjId="" parentObjType="" what="connection" />
+    <delete id="176" objectId="17" parentObjId="8" parentObjType="connection" what="port" />
+    <delete id="177" objectId="16" parentObjId="8" parentObjType="connection" what="port" />
+    <delete id="178" objectId="8" parentObjId="" parentObjType="" what="connection" />
+    <delete id="179" objectId="19" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="180" objectId="18" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="181" objectId="9" parentObjId="" parentObjType="" what="connection" />
+    <delete id="182" objectId="21" parentObjId="10" parentObjType="connection" what="port" />
+    <delete id="183" objectId="20" parentObjId="10" parentObjType="connection" what="port" />
+    <delete id="184" objectId="10" parentObjId="" parentObjType="" what="connection" />
+    <delete id="185" objectId="23" parentObjId="11" parentObjType="connection" what="port" />
+    <delete id="186" objectId="22" parentObjId="11" parentObjType="connection" what="port" />
+    <delete id="187" objectId="11" parentObjId="" parentObjType="" what="connection" />
+    <delete id="188" objectId="25" parentObjId="12" parentObjType="connection" what="port" />
+    <delete id="189" objectId="24" parentObjId="12" parentObjType="connection" what="port" />
+    <delete id="190" objectId="12" parentObjId="" parentObjType="" what="connection" />
+    <delete id="191" objectId="27" parentObjId="13" parentObjType="connection" what="port" />
+    <delete id="192" objectId="26" parentObjId="13" parentObjType="connection" what="port" />
+    <delete id="193" objectId="13" parentObjId="" parentObjType="" what="connection" />
+    <delete id="194" objectId="0" parentObjId="0" parentObjType="module" what="location" />
+    <delete id="195" objectId="0" parentObjId="0" parentObjType="function" what="parameter" />
+    <delete id="196" objectId="0" parentObjId="0" parentObjType="module" what="function" />
+    <delete id="197" objectId="0" parentObjId="0" parentObjType="module" what="annotation" />
+    <delete id="198" objectId="2" parentObjId="0" parentObjType="module" what="portSpec" />
+    <delete id="199" objectId="1" parentObjId="0" parentObjType="module" what="portSpec" />
+    <delete id="200" objectId="0" parentObjId="0" parentObjType="module" what="portSpec" />
+    <delete id="201" objectId="0" parentObjId="" parentObjType="" what="module" />
+    <delete id="202" objectId="1" parentObjId="1" parentObjType="module" what="location" />
+    <delete id="203" objectId="1" parentObjId="" parentObjType="" what="module" />
+    <delete id="204" objectId="2" parentObjId="2" parentObjType="module" what="location" />
+    <delete id="205" objectId="2" parentObjId="" parentObjType="" what="module" />
+    <delete id="206" objectId="3" parentObjId="3" parentObjType="module" what="location" />
+    <delete id="207" objectId="1" parentObjId="1" parentObjType="function" what="parameter" />
+    <delete id="208" objectId="1" parentObjId="3" parentObjType="module" what="function" />
+    <delete id="209" objectId="1" parentObjId="3" parentObjType="module" what="annotation" />
+    <delete id="210" objectId="5" parentObjId="3" parentObjType="module" what="portSpec" />
+    <delete id="211" objectId="4" parentObjId="3" parentObjType="module" what="portSpec" />
+    <delete id="212" objectId="3" parentObjId="3" parentObjType="module" what="portSpec" />
+    <delete id="213" objectId="3" parentObjId="" parentObjType="" what="module" />
+    <delete id="214" objectId="4" parentObjId="4" parentObjType="module" what="location" />
+    <delete id="215" objectId="4" parentObjId="" parentObjType="" what="module" />
+    <delete id="216" objectId="5" parentObjId="5" parentObjType="module" what="location" />
+    <delete id="217" objectId="2" parentObjId="2" parentObjType="function" what="parameter" />
+    <delete id="218" objectId="2" parentObjId="5" parentObjType="module" what="function" />
+    <delete id="219" objectId="3" parentObjId="3" parentObjType="function" what="parameter" />
+    <delete id="220" objectId="3" parentObjId="5" parentObjType="module" what="function" />
+    <delete id="221" objectId="2" parentObjId="5" parentObjType="module" what="annotation" />
+    <delete id="222" objectId="5" parentObjId="" parentObjType="" what="module" />
+    <delete id="223" objectId="6" parentObjId="6" parentObjType="module" what="location" />
+    <delete id="224" objectId="6" parentObjId="" parentObjType="" what="module" />
+    <delete id="225" objectId="7" parentObjId="7" parentObjType="module" what="location" />
+    <delete id="226" objectId="12" parentObjId="4" parentObjType="function" what="parameter" />
+    <delete id="227" objectId="4" parentObjId="7" parentObjType="module" what="function" />
+    <delete id="228" objectId="7" parentObjId="" parentObjType="" what="module" />
+    <delete id="229" objectId="8" parentObjId="8" parentObjType="module" what="location" />
+    <delete id="230" objectId="13" parentObjId="5" parentObjType="function" what="parameter" />
+    <delete id="231" objectId="5" parentObjId="8" parentObjType="module" what="function" />
+    <delete id="232" objectId="8" parentObjId="" parentObjType="" what="module" />
+    <delete id="233" objectId="9" parentObjId="9" parentObjType="module" what="location" />
+    <delete id="234" objectId="6" parentObjId="6" parentObjType="function" what="parameter" />
+    <delete id="235" objectId="6" parentObjId="9" parentObjType="module" what="function" />
+    <delete id="236" objectId="9" parentObjId="" parentObjType="" what="module" />
+    <delete id="237" objectId="10" parentObjId="10" parentObjType="module" what="location" />
+    <delete id="238" objectId="7" parentObjId="7" parentObjType="function" what="parameter" />
+    <delete id="239" objectId="7" parentObjId="10" parentObjType="module" what="function" />
+    <delete id="240" objectId="10" parentObjId="" parentObjType="" what="module" />
+    <delete id="241" objectId="11" parentObjId="11" parentObjType="module" what="location" />
+    <delete id="242" objectId="8" parentObjId="8" parentObjType="function" what="parameter" />
+    <delete id="243" objectId="8" parentObjId="11" parentObjType="module" what="function" />
+    <delete id="244" objectId="11" parentObjId="" parentObjType="" what="module" />
+    <delete id="245" objectId="12" parentObjId="12" parentObjType="module" what="location" />
+    <delete id="246" objectId="9" parentObjId="9" parentObjType="function" what="parameter" />
+    <delete id="247" objectId="9" parentObjId="12" parentObjType="module" what="function" />
+    <delete id="248" objectId="12" parentObjId="" parentObjType="" what="module" />
+    <delete id="249" objectId="13" parentObjId="13" parentObjType="module" what="location" />
+    <delete id="250" objectId="13" parentObjId="" parentObjType="" what="module" />
+    <add id="251" objectId="18" parentObjId="" parentObjType="" what="group">
+      <group cache="1" id="18" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+        <workflow id="" name="untitled" version="" vistrail_id="">
+          <connection id="1">
+            <port id="1" moduleId="2" moduleName="And" name="InputList" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+            <port id="2" moduleId="3" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+          </connection>
+          <connection id="2">
+            <port id="3" moduleId="3" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+            <port id="4" moduleId="1" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+          </connection>
+          <connection id="3">
+            <port id="5" moduleId="5" moduleName="Not" name="input" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+            <port id="6" moduleId="4" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+          </connection>
+          <connection id="4">
+            <port id="7" moduleId="3" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+            <port id="8" moduleId="5" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+          </connection>
+          <connection id="5">
+            <port id="9" moduleId="4" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+            <port id="10" moduleId="8" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="6">
+            <port id="11" moduleId="1" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+            <port id="12" moduleId="9" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="7">
+            <port id="13" moduleId="11" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+            <port id="14" moduleId="5" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+          </connection>
+          <connection id="8">
+            <port id="15" moduleId="12" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+            <port id="16" moduleId="2" moduleName="And" name="Result" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+          </connection>
+          <connection id="9">
+            <port id="17" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="18" moduleId="6" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="10">
+            <port id="19" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="20" moduleId="4" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="11">
+            <port id="21" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="22" moduleId="1" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="12">
+            <port id="23" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+            <port id="24" moduleId="13" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="13">
+            <port id="25" moduleId="10" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+            <port id="26" moduleId="14" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+          </connection>
+          <connection id="14">
+            <port id="27" moduleId="14" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+            <port id="28" moduleId="6" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+          </connection>
+          <module cache="1" id="1" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="1" x="170.966355936" y="7.11971209128" />
+            <function id="1" name="source" pos="0">
+              <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20a%20%3C%20b" />
+            </function>
+            <annotation id="1" key="__desc__" value=". < ." />
+            <portSpec id="1" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+              <portSpecItem default="" entryType="" id="1" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="2" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+              <portSpecItem default="" entryType="" id="2" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="3" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+              <portSpecItem default="" entryType="" id="3" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="2" name="And" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2">
+            <location id="2" x="100.966355936" y="-207.880287908" />
+          </module>
+          <module cache="1" id="3" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="3" x="84.8633409086" y="-112.880287908" />
+          </module>
+          <module cache="1" id="4" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="4" x="-54.6113466612" y="69.6438212405" />
+            <function id="2" name="source" pos="0">
+              <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20b%20%25%20a%20%3D%3D%200" />
+            </function>
+            <annotation id="2" key="__desc__" value=". / ." />
+            <portSpec id="4" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+              <portSpecItem default="" entryType="" id="4" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="5" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+              <portSpecItem default="" entryType="" id="5" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="6" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+              <portSpecItem default="" entryType="" id="6" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="5" name="Not" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="5" x="20.7209643223" y="-26.143955028" />
+          </module>
+          <module cache="1" id="6" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1">
+            <location id="6" x="-228.059286738" y="34.9064133304" />
+            <function id="3" name="op" pos="0">
+              <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+            </function>
+            <function id="4" name="value2" pos="1">
+              <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="1" />
+            </function>
+            <annotation id="3" key="__desc__" value=". + 1" />
+          </module>
+          <module cache="1" id="7" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="7" x="-122.593122731" y="218.82905206" />
+          </module>
+          <module cache="1" id="8" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="8" x="250.933912394" y="447.377239703" />
+            <function id="5" name="name" pos="0">
+              <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_test" />
+            </function>
+          </module>
+          <module cache="1" id="9" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="9" x="306.099490673" y="164.996084102" />
+            <function id="6" name="name" pos="0">
+              <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_max" />
+            </function>
+          </module>
+          <module cache="1" id="10" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="10" x="-279.881414792" y="-228.149268289" />
+            <function id="7" name="name" pos="0">
+              <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_next" />
+            </function>
+          </module>
+          <module cache="1" id="11" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="11" x="-85.5510124689" y="-250.572007018" />
+            <function id="8" name="name" pos="0">
+              <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+            </function>
+          </module>
+          <module cache="1" id="12" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="12" x="173.057907545" y="-331.293866444" />
+            <function id="9" name="name" pos="0">
+              <parameter alias="" id="9" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+            </function>
+          </module>
+          <module cache="1" id="13" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="13" x="-95.6987509181" y="320.893785862" />
+            <function id="10" name="name" pos="0">
+              <parameter alias="" id="10" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_i" />
+            </function>
+          </module>
+          <module cache="1" id="14" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="14" x="-241.213393406" y="-106.846435793" />
+          </module>
+        </workflow>
+      </group>
+    </add>
+    <add id="252" objectId="23" parentObjId="18" parentObjType="group" what="location">
+      <location id="23" x="11.0" y="-9.99999999989" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:33:51" id="31" prevId="30" session="1" user="Remi">
+    <annotation id="15" key="__description__" value="Paste" />
+    <add id="253" objectId="19" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="19" name="Float" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="254" objectId="16" parentObjId="19" parentObjType="module" what="function">
+      <function id="16" name="value" pos="0" />
+    </add>
+    <add id="255" objectId="23" parentObjId="16" parentObjType="function" what="parameter">
+      <parameter alias="" id="23" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="4.0" />
+    </add>
+    <add id="256" objectId="24" parentObjId="19" parentObjType="module" what="location">
+      <location id="24" x="205.533222877" y="-142.478666917" />
+    </add>
+    <add id="257" objectId="20" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="20" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="258" objectId="17" parentObjId="20" parentObjType="module" what="function">
+      <function id="17" name="value" pos="0" />
+    </add>
+    <add id="259" objectId="24" parentObjId="17" parentObjType="function" what="parameter">
+      <parameter alias="" id="24" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="5" />
+    </add>
+    <add id="260" objectId="25" parentObjId="20" parentObjType="module" what="location">
+      <location id="25" x="-270.378124056" y="-28.090479672" />
+    </add>
+    <add id="261" objectId="21" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="21" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="262" objectId="18" parentObjId="21" parentObjType="module" what="function">
+      <function id="18" name="value" pos="0" />
+    </add>
+    <add id="263" objectId="25" parentObjId="18" parentObjType="function" what="parameter">
+      <parameter alias="" id="25" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="16" />
+    </add>
+    <add id="264" objectId="26" parentObjId="21" parentObjType="module" what="location">
+      <location id="26" x="129.27443138" y="121.602703636" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:34:02" id="32" prevId="31" session="1" user="Remi">
+    <change id="265" newObjId="27" oldObjId="24" parentObjId="19" parentObjType="module" what="location">
+      <location id="27" x="207.251343682" y="84.3132793917" />
+    </change>
+    <change id="266" newObjId="28" oldObjId="25" parentObjId="20" parentObjType="module" what="location">
+      <location id="28" x="-126.915036808" y="109.359184758" />
+    </change>
+    <change id="267" newObjId="29" oldObjId="26" parentObjId="21" parentObjType="module" what="location">
+      <location id="29" x="64.8449011788" y="133.629549274" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:34:02" id="33" prevId="32" session="1" user="Remi">
+    <add id="268" objectId="18" parentObjId="" parentObjType="" what="connection">
+      <connection id="18" />
+    </add>
+    <add id="269" objectId="36" parentObjId="18" parentObjType="connection" what="port">
+      <port id="36" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="270" objectId="37" parentObjId="18" parentObjType="connection" what="port">
+      <port id="37" moduleId="18" moduleName="Group" name="isprime_loop_test" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:34:37" id="34" prevId="32" session="1" user="Remi">
+    <add id="271" objectId="19" parentObjId="" parentObjType="" what="connection">
+      <connection id="19" />
+    </add>
+    <add id="272" objectId="38" parentObjId="19" parentObjType="connection" what="port">
+      <port id="38" moduleId="20" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="273" objectId="39" parentObjId="19" parentObjType="connection" what="port">
+      <port id="39" moduleId="18" moduleName="Group" name="isprime_loop_i" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:34:41" id="35" prevId="34" session="1" user="Remi">
+    <add id="274" objectId="20" parentObjId="" parentObjType="" what="connection">
+      <connection id="20" />
+    </add>
+    <add id="275" objectId="40" parentObjId="20" parentObjType="connection" what="port">
+      <port id="40" moduleId="19" moduleName="Float" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="276" objectId="41" parentObjId="20" parentObjType="connection" what="port">
+      <port id="41" moduleId="18" moduleName="Group" name="isprime_loop_max" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:34:43" id="36" prevId="35" session="1" user="Remi">
+    <add id="277" objectId="21" parentObjId="" parentObjType="" what="connection">
+      <connection id="21" />
+    </add>
+    <add id="278" objectId="42" parentObjId="21" parentObjType="connection" what="port">
+      <port id="42" moduleId="21" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="279" objectId="43" parentObjId="21" parentObjType="connection" what="port">
+      <port id="43" moduleId="18" moduleName="Group" name="isprime_loop_test" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:35:18" id="37" prevId="36" session="1" user="Remi">
+    <change id="280" newObjId="26" oldObjId="24" parentObjId="17" parentObjType="function" what="parameter">
+      <parameter alias="" id="26" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:35:33" id="38" prevId="37" session="1" user="Remi">
+    <change id="281" newObjId="27" oldObjId="26" parentObjId="17" parentObjType="function" what="parameter">
+      <parameter alias="" id="27" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="3" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:36:44" id="39" prevId="30" session="2" user="Remi">
+    <annotation id="21" key="__description__" value="Paste" />
+    <add id="282" objectId="22" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="22" name="While" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2" />
+    </add>
+    <add id="283" objectId="22" parentObjId="22" parentObjType="module" what="function">
+      <function id="22" name="ConditionPort" pos="3" />
+    </add>
+    <add id="284" objectId="31" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="31" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+    </add>
+    <add id="285" objectId="21" parentObjId="22" parentObjType="module" what="function">
+      <function id="21" name="OutputPort" pos="2" />
+    </add>
+    <add id="286" objectId="30" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="30" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+    </add>
+    <add id="287" objectId="20" parentObjId="22" parentObjType="module" what="function">
+      <function id="20" name="StateOutputPorts" pos="1" />
+    </add>
+    <add id="288" objectId="29" parentObjId="20" parentObjType="function" what="parameter">
+      <parameter alias="" id="29" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['isprime_loop_next']" />
+    </add>
+    <add id="289" objectId="19" parentObjId="22" parentObjType="module" what="function">
+      <function id="19" name="StateInputPorts" pos="0" />
+    </add>
+    <add id="290" objectId="28" parentObjId="19" parentObjType="function" what="parameter">
+      <parameter alias="" id="28" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['isprime_loop_i']" />
+    </add>
+    <add id="291" objectId="30" parentObjId="22" parentObjType="module" what="location">
+      <location id="30" x="26.1165100671" y="-197.602147651" />
+    </add>
+    <add id="292" objectId="23" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="23" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="293" objectId="31" parentObjId="23" parentObjType="module" what="location">
+      <location id="31" x="-27.8834899329" y="136.397852349" />
+    </add>
+    <add id="294" objectId="24" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="24" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="295" objectId="7" parentObjId="24" parentObjType="module" what="portSpec">
+      <portSpec id="7" maxConns="-1" minConns="0" name="sqrt" optional="0" sortKey="0" type="output">
+        <portSpecItem default="" entryType="" id="1" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="296" objectId="6" parentObjId="24" parentObjType="module" what="portSpec">
+      <portSpec id="6" maxConns="-1" minConns="0" name="nb" optional="0" sortKey="0" type="input">
+        <portSpecItem default="" entryType="" id="0" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+      </portSpec>
+    </add>
+    <add id="297" objectId="20" parentObjId="24" parentObjType="module" what="annotation">
+      <annotation id="20" key="__desc__" value="sqrt(.)" />
+    </add>
+    <add id="298" objectId="23" parentObjId="24" parentObjType="module" what="function">
+      <function id="23" name="source" pos="0" />
+    </add>
+    <add id="299" objectId="32" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="32" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="import%20math%0D%0A%0D%0Asqrt%20%3D%20math.sqrt%28nb%29" />
+    </add>
+    <add id="300" objectId="32" parentObjId="24" parentObjType="module" what="location">
+      <location id="32" x="114.116510067" y="42.397852349" />
+    </add>
+    <add id="301" objectId="25" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="25" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="302" objectId="24" parentObjId="25" parentObjType="module" what="function">
+      <function id="24" name="name" pos="0" />
+    </add>
+    <add id="303" objectId="33" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="33" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="prime_isprime" />
+    </add>
+    <add id="304" objectId="33" parentObjId="25" parentObjType="module" what="location">
+      <location id="33" x="38.1165100671" y="-304.602147651" />
+    </add>
+    <add id="305" objectId="26" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="26" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="306" objectId="25" parentObjId="26" parentObjType="module" what="function">
+      <function id="25" name="name" pos="0" />
+    </add>
+    <add id="307" objectId="34" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="34" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="prime_totest" />
+    </add>
+    <add id="308" objectId="34" parentObjId="26" parentObjType="module" what="location">
+      <location id="34" x="-43.0834899329" y="241.797852349" />
+    </add>
+    <add id="309" objectId="22" parentObjId="" parentObjType="" what="connection">
+      <connection id="22" />
+    </add>
+    <add id="310" objectId="45" parentObjId="22" parentObjType="connection" what="port">
+      <port id="45" moduleId="25" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+    <add id="311" objectId="44" parentObjId="22" parentObjType="connection" what="port">
+      <port id="44" moduleId="22" moduleName="While" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="312" objectId="23" parentObjId="" parentObjType="" what="connection">
+      <connection id="23" />
+    </add>
+    <add id="313" objectId="47" parentObjId="23" parentObjType="connection" what="port">
+      <port id="47" moduleId="24" moduleName="PythonSource" name="nb" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="314" objectId="46" parentObjId="23" parentObjType="connection" what="port">
+      <port id="46" moduleId="23" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="315" objectId="24" parentObjId="" parentObjType="" what="connection">
+      <connection id="24" />
+    </add>
+    <add id="316" objectId="49" parentObjId="24" parentObjType="connection" what="port">
+      <port id="49" moduleId="23" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+    <add id="317" objectId="48" parentObjId="24" parentObjType="connection" what="port">
+      <port id="48" moduleId="26" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:36:54" id="40" prevId="39" session="2" user="Remi">
+    <change id="318" newObjId="35" oldObjId="30" parentObjId="22" parentObjType="module" what="location">
+      <location id="35" x="5.49906040268" y="-133.17261745" />
+    </change>
+    <change id="319" newObjId="36" oldObjId="31" parentObjId="23" parentObjType="module" what="location">
+      <location id="36" x="-48.5009395973" y="200.82738255" />
+    </change>
+    <change id="320" newObjId="37" oldObjId="32" parentObjId="24" parentObjType="module" what="location">
+      <location id="37" x="93.4990604027" y="106.82738255" />
+    </change>
+    <change id="321" newObjId="38" oldObjId="33" parentObjId="25" parentObjType="module" what="location">
+      <location id="38" x="17.4990604027" y="-240.17261745" />
+    </change>
+    <change id="322" newObjId="39" oldObjId="34" parentObjId="26" parentObjType="module" what="location">
+      <location id="39" x="-63.7009395973" y="306.22738255" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:36:55" id="41" prevId="40" session="2" user="Remi">
+    <add id="323" objectId="25" parentObjId="" parentObjType="" what="connection">
+      <connection id="25" />
+    </add>
+    <add id="324" objectId="50" parentObjId="25" parentObjType="connection" what="port">
+      <port id="50" moduleId="24" moduleName="PythonSource" name="sqrt" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="325" objectId="51" parentObjId="25" parentObjType="connection" what="port">
+      <port id="51" moduleId="18" moduleName="Group" name="isprime_loop_max" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:36:58" id="42" prevId="41" session="2" user="Remi">
+    <add id="326" objectId="26" parentObjId="" parentObjType="" what="connection">
+      <connection id="26" />
+    </add>
+    <add id="327" objectId="52" parentObjId="26" parentObjType="connection" what="port">
+      <port id="52" moduleId="23" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="328" objectId="53" parentObjId="26" parentObjType="connection" what="port">
+      <port id="53" moduleId="18" moduleName="Group" name="isprime_loop_test" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:37:27" id="43" prevId="42" session="2" user="Remi">
+    <add id="329" objectId="27" parentObjId="" parentObjType="" what="connection">
+      <connection id="27" />
+    </add>
+    <add id="330" objectId="54" parentObjId="27" parentObjType="connection" what="port">
+      <port id="54" moduleId="18" moduleName="Group" name="self" signature="(org.vistrails.vistrails.basic:Group)" type="source" />
+    </add>
+    <add id="331" objectId="55" parentObjId="27" parentObjType="connection" what="port">
+      <port id="55" moduleId="22" moduleName="While" name="FunctionPort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:37:49" id="44" prevId="43" session="2" user="Remi">
+    <add id="332" objectId="27" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="27" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="333" objectId="40" parentObjId="27" parentObjType="module" what="location">
+      <location id="40" x="-297.311504541" y="392.54409584" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:37:52" id="45" prevId="44" session="2" user="Remi">
+    <add id="334" objectId="28" parentObjId="" parentObjType="" what="connection">
+      <connection id="28" />
+    </add>
+    <add id="335" objectId="56" parentObjId="28" parentObjType="connection" what="port">
+      <port id="56" moduleId="27" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="336" objectId="57" parentObjId="28" parentObjType="connection" what="port">
+      <port id="57" moduleId="26" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:37:56" id="46" prevId="45" session="2" user="Remi">
+    <change id="337" newObjId="41" oldObjId="40" parentObjId="27" parentObjType="module" what="location">
+      <location id="41" x="-144.010260012" y="396.028215034" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:37:56" id="47" prevId="46" session="2" user="Remi">
+    <add id="338" objectId="26" parentObjId="27" parentObjType="module" what="function">
+      <function id="26" name="value" pos="0" />
+    </add>
+    <add id="339" objectId="35" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="35" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="16" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:38:03" id="48" prevId="47" session="2" user="Remi">
+    <add id="340" objectId="27" parentObjId="18" parentObjType="group" what="function">
+      <function id="27" name="isprime_loop_i" pos="0" />
+    </add>
+    <add id="341" objectId="36" parentObjId="27" parentObjType="function" what="parameter">
+      <parameter alias="" id="36" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:38:16" id="49" prevId="43" session="2" user="Remi">
+    <add id="342" objectId="28" parentObjId="18" parentObjType="group" what="function">
+      <function id="28" name="isprime_loop_i" pos="0" />
+    </add>
+    <add id="343" objectId="37" parentObjId="28" parentObjType="function" what="parameter">
+      <parameter alias="" id="37" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:38:29" id="50" prevId="49" session="2" user="Remi">
+    <add id="344" objectId="28" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="28" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="345" objectId="42" parentObjId="28" parentObjType="module" what="location">
+      <location id="42" x="-271.980536913" y="408.993288591" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:38:31" id="51" prevId="50" session="2" user="Remi">
+    <add id="346" objectId="29" parentObjId="" parentObjType="" what="connection">
+      <connection id="29" />
+    </add>
+    <add id="347" objectId="58" parentObjId="29" parentObjType="connection" what="port">
+      <port id="58" moduleId="28" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="348" objectId="59" parentObjId="29" parentObjType="connection" what="port">
+      <port id="59" moduleId="26" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:38:35" id="52" prevId="51" session="2" user="Remi">
+    <change id="349" newObjId="43" oldObjId="42" parentObjId="28" parentObjType="module" what="location">
+      <location id="43" x="-105.315771812" y="403.880872483" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:38:35" id="53" prevId="52" session="2" user="Remi">
+    <add id="350" objectId="29" parentObjId="28" parentObjType="module" what="function">
+      <function id="29" name="value" pos="0" />
+    </add>
+    <add id="351" objectId="38" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="38" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="7" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:38:42" id="54" prevId="53" session="2" user="Remi">
+    <change id="352" newObjId="39" oldObjId="38" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="39" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="8" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:39:28" id="55" prevId="49" session="2" user="Remi">
+    <delete id="353" objectId="45" parentObjId="22" parentObjType="connection" what="port" />
+    <delete id="354" objectId="44" parentObjId="22" parentObjType="connection" what="port" />
+    <delete id="355" objectId="22" parentObjId="" parentObjType="" what="connection" />
+    <delete id="356" objectId="47" parentObjId="23" parentObjType="connection" what="port" />
+    <delete id="357" objectId="46" parentObjId="23" parentObjType="connection" what="port" />
+    <delete id="358" objectId="23" parentObjId="" parentObjType="" what="connection" />
+    <delete id="359" objectId="49" parentObjId="24" parentObjType="connection" what="port" />
+    <delete id="360" objectId="48" parentObjId="24" parentObjType="connection" what="port" />
+    <delete id="361" objectId="24" parentObjId="" parentObjType="" what="connection" />
+    <delete id="362" objectId="50" parentObjId="25" parentObjType="connection" what="port" />
+    <delete id="363" objectId="51" parentObjId="25" parentObjType="connection" what="port" />
+    <delete id="364" objectId="25" parentObjId="" parentObjType="" what="connection" />
+    <delete id="365" objectId="52" parentObjId="26" parentObjType="connection" what="port" />
+    <delete id="366" objectId="53" parentObjId="26" parentObjType="connection" what="port" />
+    <delete id="367" objectId="26" parentObjId="" parentObjType="" what="connection" />
+    <delete id="368" objectId="54" parentObjId="27" parentObjType="connection" what="port" />
+    <delete id="369" objectId="55" parentObjId="27" parentObjType="connection" what="port" />
+    <delete id="370" objectId="27" parentObjId="" parentObjType="" what="connection" />
+    <delete id="371" objectId="23" parentObjId="18" parentObjType="group" what="location" />
+    <delete id="372" objectId="37" parentObjId="28" parentObjType="function" what="parameter" />
+    <delete id="373" objectId="28" parentObjId="18" parentObjType="group" what="function" />
+    <delete id="374" objectId="18" parentObjId="" parentObjType="" what="group" />
+    <delete id="375" objectId="35" parentObjId="22" parentObjType="module" what="location" />
+    <delete id="376" objectId="28" parentObjId="19" parentObjType="function" what="parameter" />
+    <delete id="377" objectId="19" parentObjId="22" parentObjType="module" what="function" />
+    <delete id="378" objectId="29" parentObjId="20" parentObjType="function" what="parameter" />
+    <delete id="379" objectId="20" parentObjId="22" parentObjType="module" what="function" />
+    <delete id="380" objectId="30" parentObjId="21" parentObjType="function" what="parameter" />
+    <delete id="381" objectId="21" parentObjId="22" parentObjType="module" what="function" />
+    <delete id="382" objectId="31" parentObjId="22" parentObjType="function" what="parameter" />
+    <delete id="383" objectId="22" parentObjId="22" parentObjType="module" what="function" />
+    <delete id="384" objectId="22" parentObjId="" parentObjType="" what="module" />
+    <delete id="385" objectId="36" parentObjId="23" parentObjType="module" what="location" />
+    <delete id="386" objectId="23" parentObjId="" parentObjType="" what="module" />
+    <delete id="387" objectId="37" parentObjId="24" parentObjType="module" what="location" />
+    <delete id="388" objectId="32" parentObjId="23" parentObjType="function" what="parameter" />
+    <delete id="389" objectId="23" parentObjId="24" parentObjType="module" what="function" />
+    <delete id="390" objectId="20" parentObjId="24" parentObjType="module" what="annotation" />
+    <delete id="391" objectId="7" parentObjId="24" parentObjType="module" what="portSpec" />
+    <delete id="392" objectId="6" parentObjId="24" parentObjType="module" what="portSpec" />
+    <delete id="393" objectId="24" parentObjId="" parentObjType="" what="module" />
+    <delete id="394" objectId="38" parentObjId="25" parentObjType="module" what="location" />
+    <delete id="395" objectId="33" parentObjId="24" parentObjType="function" what="parameter" />
+    <delete id="396" objectId="24" parentObjId="25" parentObjType="module" what="function" />
+    <delete id="397" objectId="25" parentObjId="" parentObjType="" what="module" />
+    <delete id="398" objectId="39" parentObjId="26" parentObjType="module" what="location" />
+    <delete id="399" objectId="34" parentObjId="25" parentObjType="function" what="parameter" />
+    <delete id="400" objectId="25" parentObjId="26" parentObjType="module" what="function" />
+    <delete id="401" objectId="26" parentObjId="" parentObjType="" what="module" />
+    <add id="402" objectId="29" parentObjId="" parentObjType="" what="group">
+      <group cache="1" id="29" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+        <workflow id="" name="untitled" version="" vistrail_id="">
+          <connection id="1">
+            <port id="1" moduleId="5" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+            <port id="2" moduleId="2" moduleName="While" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="2">
+            <port id="3" moduleId="4" moduleName="PythonSource" name="nb" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+            <port id="4" moduleId="3" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+          </connection>
+          <connection id="3">
+            <port id="5" moduleId="3" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+            <port id="6" moduleId="6" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="4">
+            <port id="7" moduleId="4" moduleName="PythonSource" name="sqrt" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+            <port id="8" moduleId="1" moduleName="Group" name="isprime_loop_max" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+          </connection>
+          <connection id="5">
+            <port id="9" moduleId="3" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+            <port id="10" moduleId="1" moduleName="Group" name="isprime_loop_test" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="6">
+            <port id="11" moduleId="1" moduleName="Group" name="self" signature="(org.vistrails.vistrails.basic:Group)" type="source" />
+            <port id="12" moduleId="2" moduleName="While" name="FunctionPort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+          </connection>
+          <group cache="1" id="1" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <workflow id="" name="untitled" version="" vistrail_id="">
+              <connection id="1">
+                <port id="1" moduleId="2" moduleName="And" name="InputList" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+                <port id="2" moduleId="3" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+              </connection>
+              <connection id="2">
+                <port id="3" moduleId="3" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+                <port id="4" moduleId="1" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+              </connection>
+              <connection id="3">
+                <port id="5" moduleId="5" moduleName="Not" name="input" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+                <port id="6" moduleId="4" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+              </connection>
+              <connection id="4">
+                <port id="7" moduleId="3" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+                <port id="8" moduleId="5" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+              </connection>
+              <connection id="5">
+                <port id="9" moduleId="4" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+                <port id="10" moduleId="8" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+              </connection>
+              <connection id="6">
+                <port id="11" moduleId="1" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                <port id="12" moduleId="9" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+              </connection>
+              <connection id="7">
+                <port id="13" moduleId="11" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                <port id="14" moduleId="5" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+              </connection>
+              <connection id="8">
+                <port id="15" moduleId="12" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                <port id="16" moduleId="2" moduleName="And" name="Result" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+              </connection>
+              <connection id="9">
+                <port id="17" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                <port id="18" moduleId="6" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+              </connection>
+              <connection id="10">
+                <port id="19" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                <port id="20" moduleId="4" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+              </connection>
+              <connection id="11">
+                <port id="21" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                <port id="22" moduleId="1" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+              </connection>
+              <connection id="12">
+                <port id="23" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+                <port id="24" moduleId="13" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+              </connection>
+              <connection id="13">
+                <port id="25" moduleId="10" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                <port id="26" moduleId="14" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+              </connection>
+              <connection id="14">
+                <port id="27" moduleId="14" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                <port id="28" moduleId="6" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+              </connection>
+              <module cache="1" id="1" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="1" x="170.966355936" y="7.11971209128" />
+                <function id="1" name="source" pos="0">
+                  <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20a%20%3C%20b" />
+                </function>
+                <annotation id="1" key="__desc__" value=". < ." />
+                <portSpec id="1" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+                  <portSpecItem default="" entryType="" id="1" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+                <portSpec id="2" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+                  <portSpecItem default="" entryType="" id="2" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+                <portSpec id="3" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+                  <portSpecItem default="" entryType="" id="3" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+              </module>
+              <module cache="1" id="2" name="And" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2">
+                <location id="2" x="100.966355936" y="-207.880287908" />
+              </module>
+              <module cache="1" id="3" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="3" x="84.8633409086" y="-112.880287908" />
+              </module>
+              <module cache="1" id="4" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="4" x="-54.6113466612" y="69.6438212405" />
+                <function id="2" name="source" pos="0">
+                  <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20b%20%25%20a%20%3D%3D%200" />
+                </function>
+                <annotation id="2" key="__desc__" value=". / ." />
+                <portSpec id="4" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+                  <portSpecItem default="" entryType="" id="4" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+                <portSpec id="5" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+                  <portSpecItem default="" entryType="" id="5" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+                <portSpec id="6" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+                  <portSpecItem default="" entryType="" id="6" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+              </module>
+              <module cache="1" id="5" name="Not" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="5" x="20.7209643223" y="-26.143955028" />
+              </module>
+              <module cache="1" id="6" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1">
+                <location id="6" x="-228.059286738" y="34.9064133304" />
+                <function id="3" name="op" pos="0">
+                  <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+                </function>
+                <function id="4" name="value2" pos="1">
+                  <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="1" />
+                </function>
+                <annotation id="3" key="__desc__" value=". + 1" />
+              </module>
+              <module cache="1" id="7" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="7" x="-122.593122731" y="218.82905206" />
+              </module>
+              <module cache="1" id="8" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="8" x="250.933912394" y="447.377239703" />
+                <function id="5" name="name" pos="0">
+                  <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_test" />
+                </function>
+              </module>
+              <module cache="1" id="9" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="9" x="306.099490673" y="164.996084102" />
+                <function id="6" name="name" pos="0">
+                  <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_max" />
+                </function>
+              </module>
+              <module cache="1" id="10" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="10" x="-279.881414792" y="-228.149268289" />
+                <function id="7" name="name" pos="0">
+                  <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_next" />
+                </function>
+              </module>
+              <module cache="1" id="11" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="11" x="-85.5510124689" y="-250.572007018" />
+                <function id="8" name="name" pos="0">
+                  <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+                </function>
+              </module>
+              <module cache="1" id="12" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="12" x="173.057907545" y="-331.293866444" />
+                <function id="9" name="name" pos="0">
+                  <parameter alias="" id="9" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+                </function>
+              </module>
+              <module cache="1" id="13" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="13" x="-95.6987509181" y="320.893785862" />
+                <function id="10" name="name" pos="0">
+                  <parameter alias="" id="10" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_i" />
+                </function>
+              </module>
+              <module cache="1" id="14" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="14" x="-241.213393406" y="-106.846435793" />
+              </module>
+            </workflow>
+            <location id="1" x="8.45078299776" y="-48.4228187919" />
+            <function id="1" name="isprime_loop_i" pos="0">
+              <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+            </function>
+          </group>
+          <module cache="1" id="2" name="While" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2">
+            <location id="2" x="2.94984340045" y="-171.595436242" />
+            <function id="2" name="StateInputPorts" pos="0">
+              <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['isprime_loop_i']" />
+            </function>
+            <function id="3" name="StateOutputPorts" pos="1">
+              <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['isprime_loop_next']" />
+            </function>
+            <function id="4" name="OutputPort" pos="2">
+              <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+            </function>
+            <function id="5" name="ConditionPort" pos="3">
+              <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+            </function>
+          </module>
+          <module cache="1" id="3" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="3" x="-51.0501565996" y="162.404563758" />
+          </module>
+          <module cache="1" id="4" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="4" x="90.9498434004" y="68.4045637584" />
+            <function id="6" name="source" pos="0">
+              <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="import%20math%0D%0A%0D%0Asqrt%20%3D%20math.sqrt%28nb%29" />
+            </function>
+            <annotation id="1" key="__desc__" value="sqrt(.)" />
+            <portSpec id="1" maxConns="-1" minConns="0" name="sqrt" optional="0" sortKey="0" type="output">
+              <portSpecItem default="" entryType="" id="1" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+            <portSpec id="2" maxConns="-1" minConns="0" name="nb" optional="0" sortKey="0" type="input">
+              <portSpecItem default="" entryType="" id="2" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+            </portSpec>
+          </module>
+          <module cache="1" id="5" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="5" x="14.9498434004" y="-278.595436242" />
+            <function id="7" name="name" pos="0">
+              <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="prime_isprime" />
+            </function>
+          </module>
+          <module cache="1" id="6" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="6" x="-66.2501565996" y="267.804563758" />
+            <function id="8" name="name" pos="0">
+              <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="prime_totest" />
+            </function>
+          </module>
+        </workflow>
+      </group>
+    </add>
+    <add id="403" objectId="44" parentObjId="29" parentObjType="group" what="location">
+      <location id="44" x="2.54921700224" y="38.422818792" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:39:42" id="56" prevId="55" session="2" user="Remi">
+    <add id="404" objectId="30" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="30" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="405" objectId="45" parentObjId="30" parentObjType="module" what="location">
+      <location id="45" x="-59.3040268456" y="180.979530201" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:39:44" id="57" prevId="56" session="2" user="Remi">
+    <add id="406" objectId="30" parentObjId="" parentObjType="" what="connection">
+      <connection id="30" />
+    </add>
+    <add id="407" objectId="60" parentObjId="30" parentObjType="connection" what="port">
+      <port id="60" moduleId="30" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="408" objectId="61" parentObjId="30" parentObjType="connection" what="port">
+      <port id="61" moduleId="29" moduleName="Group" name="prime_totest" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:39:49" id="58" prevId="57" session="2" user="Remi">
+    <change id="409" newObjId="47" oldObjId="45" parentObjId="30" parentObjType="module" what="location">
+      <location id="47" x="-43.9667785235" y="163.597315436" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:39:49" id="59" prevId="58" session="2" user="Remi">
+    <add id="410" objectId="31" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="31" name="StandardOutput" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="411" objectId="46" parentObjId="31" parentObjType="module" what="location">
+      <location id="46" x="31.6969798658" y="-85.888590604" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:39:51" id="60" prevId="59" session="2" user="Remi">
+    <add id="412" objectId="31" parentObjId="" parentObjType="" what="connection">
+      <connection id="31" />
+    </add>
+    <add id="413" objectId="62" parentObjId="31" parentObjType="connection" what="port">
+      <port id="62" moduleId="29" moduleName="Group" name="prime_isprime" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="414" objectId="63" parentObjId="31" parentObjType="connection" what="port">
+      <port id="63" moduleId="31" moduleName="StandardOutput" name="value" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:39:53" id="61" prevId="60" session="2" user="Remi">
+    <add id="415" objectId="30" parentObjId="30" parentObjType="module" what="function">
+      <function id="30" name="value" pos="0" />
+    </add>
+    <add id="416" objectId="40" parentObjId="30" parentObjType="function" what="parameter">
+      <parameter alias="" id="40" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="7" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:40:10" id="62" prevId="61" session="2" user="Remi">
+    <change id="417" newObjId="41" oldObjId="40" parentObjId="30" parentObjType="function" what="parameter">
+      <parameter alias="" id="41" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="8" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:55:29" id="63" prevId="55" session="3" user="Remi">
+    <annotation id="31" key="__description__" value="Paste" />
+    <add id="418" objectId="32" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="32" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1" />
+    </add>
+    <add id="419" objectId="30" parentObjId="32" parentObjType="module" what="annotation">
+      <annotation id="30" key="__desc__" value=". + 1" />
+    </add>
+    <add id="420" objectId="32" parentObjId="32" parentObjType="module" what="function">
+      <function id="32" name="op" pos="1" />
+    </add>
+    <add id="421" objectId="43" parentObjId="32" parentObjType="function" what="parameter">
+      <parameter alias="" id="43" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+    </add>
+    <add id="422" objectId="31" parentObjId="32" parentObjType="module" what="function">
+      <function id="31" name="value2" pos="0" />
+    </add>
+    <add id="423" objectId="42" parentObjId="31" parentObjType="function" what="parameter">
+      <parameter alias="" id="42" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="1" />
+    </add>
+    <add id="424" objectId="48" parentObjId="32" parentObjType="module" what="location">
+      <location id="48" x="-203.710593617" y="71.6472105861" />
+    </add>
+    <add id="425" objectId="33" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="33" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="426" objectId="33" parentObjId="33" parentObjType="module" what="function">
+      <function id="33" name="name" pos="0" />
+    </add>
+    <add id="427" objectId="44" parentObjId="33" parentObjType="function" what="parameter">
+      <parameter alias="" id="44" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_i" />
+    </add>
+    <add id="428" objectId="49" parentObjId="33" parentObjType="module" what="location">
+      <location id="49" x="-114.368311738" y="228.855264277" />
+    </add>
+    <add id="429" objectId="34" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="34" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="430" objectId="34" parentObjId="34" parentObjType="module" what="function">
+      <function id="34" name="name" pos="0" />
+    </add>
+    <add id="431" objectId="45" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="45" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_next" />
+    </add>
+    <add id="432" objectId="50" parentObjId="34" parentObjType="module" what="location">
+      <location id="50" x="-151.018552718" y="-142.92634466" />
+    </add>
+    <add id="433" objectId="35" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="35" name="If" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2" />
+    </add>
+    <add id="434" objectId="36" parentObjId="35" parentObjType="module" what="function">
+      <function id="36" name="TrueOutputPorts" pos="1" />
+    </add>
+    <add id="435" objectId="47" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="47" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+    </add>
+    <add id="436" objectId="35" parentObjId="35" parentObjType="module" what="function">
+      <function id="35" name="FalseOutputPorts" pos="0" />
+    </add>
+    <add id="437" objectId="46" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="46" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['InternalPipe']" />
+    </add>
+    <add id="438" objectId="51" parentObjId="35" parentObjType="module" what="location">
+      <location id="51" x="144.20886947" y="-71.8158766627" />
+    </add>
+    <add id="439" objectId="36" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="36" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="440" objectId="52" parentObjId="36" parentObjType="module" what="location">
+      <location id="52" x="215.510882893" y="51.8888213243" />
+    </add>
+    <add id="441" objectId="37" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="37" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="442" objectId="37" parentObjId="37" parentObjType="module" what="function">
+      <function id="37" name="name" pos="0" />
+    </add>
+    <add id="443" objectId="48" parentObjId="37" parentObjType="function" what="parameter">
+      <parameter alias="" id="48" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_previouslist" />
+    </add>
+    <add id="444" objectId="53" parentObjId="37" parentObjType="module" what="location">
+      <location id="53" x="163.108198329" y="222.841841458" />
+    </add>
+    <add id="445" objectId="38" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="38" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="446" objectId="38" parentObjId="38" parentObjType="module" what="function">
+      <function id="38" name="name" pos="0" />
+    </add>
+    <add id="447" objectId="49" parentObjId="38" parentObjType="function" what="parameter">
+      <parameter alias="" id="49" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_newlist" />
+    </add>
+    <add id="448" objectId="54" parentObjId="38" parentObjType="module" what="location">
+      <location id="54" x="168.262560745" y="-184.352789415" />
+    </add>
+    <add id="449" objectId="39" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="39" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="450" objectId="55" parentObjId="39" parentObjType="module" what="location">
+      <location id="55" x="-182.736651002" y="-39.8701985397" />
+    </add>
+    <add id="451" objectId="40" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="40" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="452" objectId="56" parentObjId="40" parentObjType="module" what="location">
+      <location id="56" x="76.7167519982" y="149.799185722" />
+    </add>
+    <add id="453" objectId="32" parentObjId="" parentObjType="" what="connection">
+      <connection id="32" />
+    </add>
+    <add id="454" objectId="65" parentObjId="32" parentObjType="connection" what="port">
+      <port id="65" moduleId="32" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="455" objectId="64" parentObjId="32" parentObjType="connection" what="port">
+      <port id="64" moduleId="33" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="456" objectId="33" parentObjId="" parentObjType="" what="connection">
+      <connection id="33" />
+    </add>
+    <add id="457" objectId="67" parentObjId="33" parentObjType="connection" what="port">
+      <port id="67" moduleId="38" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+    <add id="458" objectId="66" parentObjId="33" parentObjType="connection" what="port">
+      <port id="66" moduleId="35" moduleName="If" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="459" objectId="34" parentObjId="" parentObjType="" what="connection">
+      <connection id="34" />
+    </add>
+    <add id="460" objectId="69" parentObjId="34" parentObjType="connection" what="port">
+      <port id="69" moduleId="35" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="461" objectId="68" parentObjId="34" parentObjType="connection" what="port">
+      <port id="68" moduleId="36" moduleName="List" name="self" signature="(org.vistrails.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="462" objectId="35" parentObjId="" parentObjType="" what="connection">
+      <connection id="35" />
+    </add>
+    <add id="463" objectId="71" parentObjId="35" parentObjType="connection" what="port">
+      <port id="71" moduleId="35" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="464" objectId="70" parentObjId="35" parentObjType="connection" what="port">
+      <port id="70" moduleId="37" moduleName="InputPort" name="self" signature="(org.vistrails.vistrails.basic:Module)" type="source" />
+    </add>
+    <add id="465" objectId="36" parentObjId="" parentObjType="" what="connection">
+      <connection id="36" />
+    </add>
+    <add id="466" objectId="73" parentObjId="36" parentObjType="connection" what="port">
+      <port id="73" moduleId="34" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+    <add id="467" objectId="72" parentObjId="36" parentObjType="connection" what="port">
+      <port id="72" moduleId="39" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="468" objectId="37" parentObjId="" parentObjType="" what="connection">
+      <connection id="37" />
+    </add>
+    <add id="469" objectId="75" parentObjId="37" parentObjType="connection" what="port">
+      <port id="75" moduleId="39" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+    </add>
+    <add id="470" objectId="74" parentObjId="37" parentObjType="connection" what="port">
+      <port id="74" moduleId="32" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="471" objectId="38" parentObjId="" parentObjType="" what="connection">
+      <connection id="38" />
+    </add>
+    <add id="472" objectId="77" parentObjId="38" parentObjType="connection" what="port">
+      <port id="77" moduleId="40" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="473" objectId="76" parentObjId="38" parentObjType="connection" what="port">
+      <port id="76" moduleId="33" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="474" objectId="39" parentObjId="" parentObjType="" what="connection">
+      <connection id="39" />
+    </add>
+    <add id="475" objectId="79" parentObjId="39" parentObjType="connection" what="port">
+      <port id="79" moduleId="36" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+    </add>
+    <add id="476" objectId="78" parentObjId="39" parentObjType="connection" what="port">
+      <port id="78" moduleId="37" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="477" objectId="40" parentObjId="" parentObjType="" what="connection">
+      <connection id="40" />
+    </add>
+    <add id="478" objectId="81" parentObjId="40" parentObjType="connection" what="port">
+      <port id="81" moduleId="36" moduleName="List" name="tail" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+    </add>
+    <add id="479" objectId="80" parentObjId="40" parentObjType="connection" what="port">
+      <port id="80" moduleId="40" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:55:38" id="64" prevId="63" session="3" user="Remi">
+    <change id="480" newObjId="57" oldObjId="48" parentObjId="32" parentObjType="module" what="location">
+      <location id="57" x="-207.146835227" y="66.49284817" />
+    </change>
+    <change id="481" newObjId="58" oldObjId="49" parentObjId="33" parentObjType="module" what="location">
+      <location id="58" x="-117.804553348" y="223.700901861" />
+    </change>
+    <change id="482" newObjId="59" oldObjId="50" parentObjId="34" parentObjType="module" what="location">
+      <location id="59" x="-154.454794328" y="-148.080707076" />
+    </change>
+    <change id="483" newObjId="60" oldObjId="51" parentObjId="35" parentObjType="module" what="location">
+      <location id="60" x="140.77262786" y="-76.9702390788" />
+    </change>
+    <change id="484" newObjId="61" oldObjId="52" parentObjId="36" parentObjType="module" what="location">
+      <location id="61" x="212.074641283" y="46.7344589082" />
+    </change>
+    <change id="485" newObjId="62" oldObjId="53" parentObjId="37" parentObjType="module" what="location">
+      <location id="62" x="159.671956719" y="217.687479042" />
+    </change>
+    <change id="486" newObjId="63" oldObjId="54" parentObjId="38" parentObjType="module" what="location">
+      <location id="63" x="164.826319135" y="-189.507151831" />
+    </change>
+    <change id="487" newObjId="64" oldObjId="55" parentObjId="39" parentObjType="module" what="location">
+      <location id="64" x="-186.172892612" y="-45.0245609558" />
+    </change>
+    <change id="488" newObjId="65" oldObjId="56" parentObjId="40" parentObjType="module" what="location">
+      <location id="65" x="73.2805103874" y="144.644823306" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:55:38" id="65" prevId="64" session="3" user="Remi">
+    <add id="489" objectId="41" parentObjId="" parentObjType="" what="connection">
+      <connection id="41" />
+    </add>
+    <add id="490" objectId="82" parentObjId="41" parentObjType="connection" what="port">
+      <port id="82" moduleId="33" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="491" objectId="83" parentObjId="41" parentObjType="connection" what="port">
+      <port id="83" moduleId="29" moduleName="Group" name="prime_totest" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:10" id="66" prevId="65" session="3" user="Remi">
+    <add id="492" objectId="42" parentObjId="" parentObjType="" what="connection">
+      <connection id="42" />
+    </add>
+    <add id="493" objectId="84" parentObjId="42" parentObjType="connection" what="port">
+      <port id="84" moduleId="29" moduleName="Group" name="prime_isprime" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="494" objectId="85" parentObjId="42" parentObjType="connection" what="port">
+      <port id="85" moduleId="35" moduleName="If" name="Condition" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:32" id="67" prevId="66" session="3" user="Remi">
+    <add id="495" objectId="41" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="41" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="496" objectId="66" parentObjId="41" parentObjType="module" what="location">
+      <location id="66" x="-176.10738255" y="337.610738255" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:32" id="68" prevId="67" session="3" user="Remi">
+    <add id="497" objectId="43" parentObjId="" parentObjType="" what="connection">
+      <connection id="43" />
+    </add>
+    <add id="498" objectId="86" parentObjId="43" parentObjType="connection" what="port">
+      <port id="86" moduleId="41" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="499" objectId="87" parentObjId="43" parentObjType="connection" what="port">
+      <port id="87" moduleId="33" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:34" id="69" prevId="68" session="3" user="Remi">
+    <add id="500" objectId="39" parentObjId="41" parentObjType="module" what="function">
+      <function id="39" name="value" pos="0" />
+    </add>
+    <add id="501" objectId="50" parentObjId="39" parentObjType="function" what="parameter">
+      <parameter alias="" id="50" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="8" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:38" id="70" prevId="69" session="3" user="Remi">
+    <add id="502" objectId="42" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="42" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="503" objectId="67" parentObjId="42" parentObjType="module" what="location">
+      <location id="67" x="101.369127517" y="335.033557047" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:38" id="71" prevId="70" session="3" user="Remi">
+    <add id="504" objectId="44" parentObjId="" parentObjType="" what="connection">
+      <connection id="44" />
+    </add>
+    <add id="505" objectId="88" parentObjId="44" parentObjType="connection" what="port">
+      <port id="88" moduleId="42" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+    </add>
+    <add id="506" objectId="89" parentObjId="44" parentObjType="connection" what="port">
+      <port id="89" moduleId="37" moduleName="InputPort" name="Default" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:56:43" id="72" prevId="71" session="3" user="Remi">
+    <add id="507" objectId="40" parentObjId="42" parentObjType="module" what="function">
+      <function id="40" name="value" pos="0" />
+    </add>
+    <add id="508" objectId="51" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="51" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="[2, 3, 5]" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:57:01" id="73" prevId="72" session="3" user="Remi">
+    <change id="509" newObjId="52" oldObjId="50" parentObjId="39" parentObjType="function" what="parameter">
+      <parameter alias="" id="52" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="7" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:57:36" id="74" prevId="66" session="3" user="Remi">
+    <delete id="510" objectId="65" parentObjId="32" parentObjType="connection" what="port" />
+    <delete id="511" objectId="64" parentObjId="32" parentObjType="connection" what="port" />
+    <delete id="512" objectId="32" parentObjId="" parentObjType="" what="connection" />
+    <delete id="513" objectId="67" parentObjId="33" parentObjType="connection" what="port" />
+    <delete id="514" objectId="66" parentObjId="33" parentObjType="connection" what="port" />
+    <delete id="515" objectId="33" parentObjId="" parentObjType="" what="connection" />
+    <delete id="516" objectId="69" parentObjId="34" parentObjType="connection" what="port" />
+    <delete id="517" objectId="68" parentObjId="34" parentObjType="connection" what="port" />
+    <delete id="518" objectId="34" parentObjId="" parentObjType="" what="connection" />
+    <delete id="519" objectId="71" parentObjId="35" parentObjType="connection" what="port" />
+    <delete id="520" objectId="70" parentObjId="35" parentObjType="connection" what="port" />
+    <delete id="521" objectId="35" parentObjId="" parentObjType="" what="connection" />
+    <delete id="522" objectId="73" parentObjId="36" parentObjType="connection" what="port" />
+    <delete id="523" objectId="72" parentObjId="36" parentObjType="connection" what="port" />
+    <delete id="524" objectId="36" parentObjId="" parentObjType="" what="connection" />
+    <delete id="525" objectId="75" parentObjId="37" parentObjType="connection" what="port" />
+    <delete id="526" objectId="74" parentObjId="37" parentObjType="connection" what="port" />
+    <delete id="527" objectId="37" parentObjId="" parentObjType="" what="connection" />
+    <delete id="528" objectId="77" parentObjId="38" parentObjType="connection" what="port" />
+    <delete id="529" objectId="76" parentObjId="38" parentObjType="connection" what="port" />
+    <delete id="530" objectId="38" parentObjId="" parentObjType="" what="connection" />
+    <delete id="531" objectId="79" parentObjId="39" parentObjType="connection" what="port" />
+    <delete id="532" objectId="78" parentObjId="39" parentObjType="connection" what="port" />
+    <delete id="533" objectId="39" parentObjId="" parentObjType="" what="connection" />
+    <delete id="534" objectId="81" parentObjId="40" parentObjType="connection" what="port" />
+    <delete id="535" objectId="80" parentObjId="40" parentObjType="connection" what="port" />
+    <delete id="536" objectId="40" parentObjId="" parentObjType="" what="connection" />
+    <delete id="537" objectId="82" parentObjId="41" parentObjType="connection" what="port" />
+    <delete id="538" objectId="83" parentObjId="41" parentObjType="connection" what="port" />
+    <delete id="539" objectId="41" parentObjId="" parentObjType="" what="connection" />
+    <delete id="540" objectId="84" parentObjId="42" parentObjType="connection" what="port" />
+    <delete id="541" objectId="85" parentObjId="42" parentObjType="connection" what="port" />
+    <delete id="542" objectId="42" parentObjId="" parentObjType="" what="connection" />
+    <delete id="543" objectId="57" parentObjId="32" parentObjType="module" what="location" />
+    <delete id="544" objectId="42" parentObjId="31" parentObjType="function" what="parameter" />
+    <delete id="545" objectId="31" parentObjId="32" parentObjType="module" what="function" />
+    <delete id="546" objectId="43" parentObjId="32" parentObjType="function" what="parameter" />
+    <delete id="547" objectId="32" parentObjId="32" parentObjType="module" what="function" />
+    <delete id="548" objectId="30" parentObjId="32" parentObjType="module" what="annotation" />
+    <delete id="549" objectId="32" parentObjId="" parentObjType="" what="module" />
+    <delete id="550" objectId="58" parentObjId="33" parentObjType="module" what="location" />
+    <delete id="551" objectId="44" parentObjId="33" parentObjType="function" what="parameter" />
+    <delete id="552" objectId="33" parentObjId="33" parentObjType="module" what="function" />
+    <delete id="553" objectId="33" parentObjId="" parentObjType="" what="module" />
+    <delete id="554" objectId="59" parentObjId="34" parentObjType="module" what="location" />
+    <delete id="555" objectId="45" parentObjId="34" parentObjType="function" what="parameter" />
+    <delete id="556" objectId="34" parentObjId="34" parentObjType="module" what="function" />
+    <delete id="557" objectId="34" parentObjId="" parentObjType="" what="module" />
+    <delete id="558" objectId="60" parentObjId="35" parentObjType="module" what="location" />
+    <delete id="559" objectId="46" parentObjId="35" parentObjType="function" what="parameter" />
+    <delete id="560" objectId="35" parentObjId="35" parentObjType="module" what="function" />
+    <delete id="561" objectId="47" parentObjId="36" parentObjType="function" what="parameter" />
+    <delete id="562" objectId="36" parentObjId="35" parentObjType="module" what="function" />
+    <delete id="563" objectId="35" parentObjId="" parentObjType="" what="module" />
+    <delete id="564" objectId="61" parentObjId="36" parentObjType="module" what="location" />
+    <delete id="565" objectId="36" parentObjId="" parentObjType="" what="module" />
+    <delete id="566" objectId="62" parentObjId="37" parentObjType="module" what="location" />
+    <delete id="567" objectId="48" parentObjId="37" parentObjType="function" what="parameter" />
+    <delete id="568" objectId="37" parentObjId="37" parentObjType="module" what="function" />
+    <delete id="569" objectId="37" parentObjId="" parentObjType="" what="module" />
+    <delete id="570" objectId="63" parentObjId="38" parentObjType="module" what="location" />
+    <delete id="571" objectId="49" parentObjId="38" parentObjType="function" what="parameter" />
+    <delete id="572" objectId="38" parentObjId="38" parentObjType="module" what="function" />
+    <delete id="573" objectId="38" parentObjId="" parentObjType="" what="module" />
+    <delete id="574" objectId="64" parentObjId="39" parentObjType="module" what="location" />
+    <delete id="575" objectId="39" parentObjId="" parentObjType="" what="module" />
+    <delete id="576" objectId="65" parentObjId="40" parentObjType="module" what="location" />
+    <delete id="577" objectId="40" parentObjId="" parentObjType="" what="module" />
+    <delete id="578" objectId="44" parentObjId="29" parentObjType="group" what="location" />
+    <delete id="579" objectId="29" parentObjId="" parentObjType="" what="group" />
+    <add id="580" objectId="43" parentObjId="" parentObjType="" what="group">
+      <group cache="1" id="43" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+        <workflow id="" name="untitled" version="" vistrail_id="">
+          <connection id="1">
+            <port id="1" moduleId="2" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+            <port id="2" moduleId="3" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="2">
+            <port id="3" moduleId="8" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+            <port id="4" moduleId="5" moduleName="If" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="3">
+            <port id="5" moduleId="5" moduleName="If" name="TruePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+            <port id="6" moduleId="6" moduleName="List" name="self" signature="(org.vistrails.vistrails.basic:Module)" type="source" />
+          </connection>
+          <connection id="4">
+            <port id="7" moduleId="5" moduleName="If" name="FalsePort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+            <port id="8" moduleId="7" moduleName="InputPort" name="self" signature="(org.vistrails.vistrails.basic:Module)" type="source" />
+          </connection>
+          <connection id="5">
+            <port id="9" moduleId="4" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+            <port id="10" moduleId="9" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+          </connection>
+          <connection id="6">
+            <port id="11" moduleId="9" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+            <port id="12" moduleId="2" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+          </connection>
+          <connection id="7">
+            <port id="13" moduleId="10" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+            <port id="14" moduleId="3" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="8">
+            <port id="15" moduleId="6" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+            <port id="16" moduleId="7" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+          </connection>
+          <connection id="9">
+            <port id="17" moduleId="6" moduleName="List" name="tail" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+            <port id="18" moduleId="10" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+          </connection>
+          <connection id="10">
+            <port id="19" moduleId="3" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+            <port id="20" moduleId="1" moduleName="Group" name="prime_totest" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+          </connection>
+          <connection id="11">
+            <port id="21" moduleId="1" moduleName="Group" name="prime_isprime" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+            <port id="22" moduleId="5" moduleName="If" name="Condition" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+          </connection>
+          <group cache="1" id="1" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <workflow id="" name="untitled" version="" vistrail_id="">
+              <connection id="1">
+                <port id="1" moduleId="5" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                <port id="2" moduleId="2" moduleName="While" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+              </connection>
+              <connection id="2">
+                <port id="3" moduleId="4" moduleName="PythonSource" name="nb" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                <port id="4" moduleId="3" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+              </connection>
+              <connection id="3">
+                <port id="5" moduleId="3" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+                <port id="6" moduleId="6" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+              </connection>
+              <connection id="4">
+                <port id="7" moduleId="4" moduleName="PythonSource" name="sqrt" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+                <port id="8" moduleId="1" moduleName="Group" name="isprime_loop_max" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+              </connection>
+              <connection id="5">
+                <port id="9" moduleId="3" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                <port id="10" moduleId="1" moduleName="Group" name="isprime_loop_test" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+              </connection>
+              <connection id="6">
+                <port id="11" moduleId="1" moduleName="Group" name="self" signature="(org.vistrails.vistrails.basic:Group)" type="source" />
+                <port id="12" moduleId="2" moduleName="While" name="FunctionPort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+              </connection>
+              <group cache="1" id="1" name="Group" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <workflow id="" name="untitled" version="" vistrail_id="">
+                  <connection id="1">
+                    <port id="1" moduleId="2" moduleName="And" name="InputList" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+                    <port id="2" moduleId="3" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+                  </connection>
+                  <connection id="2">
+                    <port id="3" moduleId="3" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+                    <port id="4" moduleId="1" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+                  </connection>
+                  <connection id="3">
+                    <port id="5" moduleId="5" moduleName="Not" name="input" signature="(org.vistrails.vistrails.basic:Boolean)" type="destination" />
+                    <port id="6" moduleId="4" moduleName="PythonSource" name="r" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+                  </connection>
+                  <connection id="4">
+                    <port id="7" moduleId="3" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+                    <port id="8" moduleId="5" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+                  </connection>
+                  <connection id="5">
+                    <port id="9" moduleId="4" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+                    <port id="10" moduleId="8" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+                  </connection>
+                  <connection id="6">
+                    <port id="11" moduleId="1" moduleName="PythonSource" name="b" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                    <port id="12" moduleId="9" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+                  </connection>
+                  <connection id="7">
+                    <port id="13" moduleId="11" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                    <port id="14" moduleId="5" moduleName="Not" name="value" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+                  </connection>
+                  <connection id="8">
+                    <port id="15" moduleId="12" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                    <port id="16" moduleId="2" moduleName="And" name="Result" signature="(org.vistrails.vistrails.basic:Boolean)" type="source" />
+                  </connection>
+                  <connection id="9">
+                    <port id="17" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                    <port id="18" moduleId="6" moduleName="PythonCalc" name="value1" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                  </connection>
+                  <connection id="10">
+                    <port id="19" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                    <port id="20" moduleId="4" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+                  </connection>
+                  <connection id="11">
+                    <port id="21" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                    <port id="22" moduleId="1" moduleName="PythonSource" name="a" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                  </connection>
+                  <connection id="12">
+                    <port id="23" moduleId="7" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+                    <port id="24" moduleId="13" moduleName="InputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+                  </connection>
+                  <connection id="13">
+                    <port id="25" moduleId="10" moduleName="OutputPort" name="InternalPipe" signature="(org.vistrails.vistrails.basic:Variant)" type="destination" />
+                    <port id="26" moduleId="14" moduleName="Round" name="out_value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+                  </connection>
+                  <connection id="14">
+                    <port id="27" moduleId="14" moduleName="Round" name="in_value" signature="(org.vistrails.vistrails.basic:Float)" type="destination" />
+                    <port id="28" moduleId="6" moduleName="PythonCalc" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+                  </connection>
+                  <module cache="1" id="1" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="1" x="170.966355936" y="7.11971209128" />
+                    <function id="1" name="source" pos="0">
+                      <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20a%20%3C%20b" />
+                    </function>
+                    <annotation id="1" key="__desc__" value=". < ." />
+                    <portSpec id="1" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+                      <portSpecItem default="" entryType="" id="1" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                    </portSpec>
+                    <portSpec id="2" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+                      <portSpecItem default="" entryType="" id="2" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                    </portSpec>
+                    <portSpec id="3" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+                      <portSpecItem default="" entryType="" id="3" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                    </portSpec>
+                  </module>
+                  <module cache="1" id="2" name="And" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2">
+                    <location id="2" x="100.966355936" y="-207.880287908" />
+                  </module>
+                  <module cache="1" id="3" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="3" x="84.8633409086" y="-112.880287908" />
+                  </module>
+                  <module cache="1" id="4" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="4" x="-54.6113466612" y="69.6438212405" />
+                    <function id="2" name="source" pos="0">
+                      <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="r%20%3D%20b%20%25%20a%20%3D%3D%200" />
+                    </function>
+                    <annotation id="2" key="__desc__" value=". / ." />
+                    <portSpec id="4" maxConns="-1" minConns="0" name="r" optional="0" sortKey="0" type="output">
+                      <portSpecItem default="" entryType="" id="4" label="" module="Boolean" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                    </portSpec>
+                    <portSpec id="5" maxConns="-1" minConns="0" name="b" optional="0" sortKey="1" type="input">
+                      <portSpecItem default="" entryType="" id="5" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                    </portSpec>
+                    <portSpec id="6" maxConns="-1" minConns="0" name="a" optional="0" sortKey="0" type="input">
+                      <portSpecItem default="" entryType="" id="6" label="" module="Integer" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                    </portSpec>
+                  </module>
+                  <module cache="1" id="5" name="Not" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="5" x="20.7209643223" y="-26.143955028" />
+                  </module>
+                  <module cache="1" id="6" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1">
+                    <location id="6" x="-228.059286738" y="34.9064133304" />
+                    <function id="3" name="op" pos="0">
+                      <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+                    </function>
+                    <function id="4" name="value2" pos="1">
+                      <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="1" />
+                    </function>
+                    <annotation id="3" key="__desc__" value=". + 1" />
+                  </module>
+                  <module cache="1" id="7" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="7" x="-122.593122731" y="218.82905206" />
+                  </module>
+                  <module cache="1" id="8" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="8" x="250.933912394" y="447.377239703" />
+                    <function id="5" name="name" pos="0">
+                      <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_test" />
+                    </function>
+                  </module>
+                  <module cache="1" id="9" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="9" x="306.099490673" y="164.996084102" />
+                    <function id="6" name="name" pos="0">
+                      <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_max" />
+                    </function>
+                  </module>
+                  <module cache="1" id="10" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="10" x="-279.881414792" y="-228.149268289" />
+                    <function id="7" name="name" pos="0">
+                      <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_next" />
+                    </function>
+                  </module>
+                  <module cache="1" id="11" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="11" x="-85.5510124689" y="-250.572007018" />
+                    <function id="8" name="name" pos="0">
+                      <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+                    </function>
+                  </module>
+                  <module cache="1" id="12" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="12" x="173.057907545" y="-331.293866444" />
+                    <function id="9" name="name" pos="0">
+                      <parameter alias="" id="9" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+                    </function>
+                  </module>
+                  <module cache="1" id="13" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="13" x="-95.6987509181" y="320.893785862" />
+                    <function id="10" name="name" pos="0">
+                      <parameter alias="" id="10" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_i" />
+                    </function>
+                  </module>
+                  <module cache="1" id="14" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                    <location id="14" x="-241.213393406" y="-106.846435793" />
+                  </module>
+                </workflow>
+                <location id="1" x="8.45078299776" y="-48.4228187919" />
+                <function id="1" name="isprime_loop_i" pos="0">
+                  <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+                </function>
+              </group>
+              <module cache="1" id="2" name="While" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2">
+                <location id="2" x="2.94984340045" y="-171.595436242" />
+                <function id="2" name="StateInputPorts" pos="0">
+                  <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['isprime_loop_i']" />
+                </function>
+                <function id="3" name="StateOutputPorts" pos="1">
+                  <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['isprime_loop_next']" />
+                </function>
+                <function id="4" name="OutputPort" pos="2">
+                  <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_result" />
+                </function>
+                <function id="5" name="ConditionPort" pos="3">
+                  <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="isprime_loop_continue" />
+                </function>
+              </module>
+              <module cache="1" id="3" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="3" x="-51.0501565996" y="162.404563758" />
+              </module>
+              <module cache="1" id="4" name="PythonSource" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="4" x="90.9498434004" y="68.4045637584" />
+                <function id="6" name="source" pos="0">
+                  <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="import%20math%0D%0A%0D%0Asqrt%20%3D%20math.sqrt%28nb%29" />
+                </function>
+                <annotation id="1" key="__desc__" value="sqrt(.)" />
+                <portSpec id="1" maxConns="-1" minConns="0" name="sqrt" optional="0" sortKey="0" type="output">
+                  <portSpecItem default="" entryType="" id="1" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+                <portSpec id="2" maxConns="-1" minConns="0" name="nb" optional="0" sortKey="0" type="input">
+                  <portSpecItem default="" entryType="" id="2" label="" module="Float" namespace="" package="org.vistrails.vistrails.basic" pos="0" values="" />
+                </portSpec>
+              </module>
+              <module cache="1" id="5" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="5" x="14.9498434004" y="-278.595436242" />
+                <function id="7" name="name" pos="0">
+                  <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="prime_isprime" />
+                </function>
+              </module>
+              <module cache="1" id="6" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+                <location id="6" x="-66.2501565996" y="267.804563758" />
+                <function id="8" name="name" pos="0">
+                  <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="prime_totest" />
+                </function>
+              </module>
+            </workflow>
+            <location id="1" x="-6.21040268455" y="10.6127516781" />
+          </group>
+          <module cache="1" id="2" name="PythonCalc" namespace="" package="org.vistrails.vistrails.pythoncalc" version="0.9.1">
+            <location id="2" x="-215.906454914" y="38.6827810561" />
+            <function id="1" name="value2" pos="0">
+              <parameter alias="" id="1" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Float" val="1" />
+            </function>
+            <function id="2" name="op" pos="1">
+              <parameter alias="" id="2" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="+" />
+            </function>
+            <annotation id="1" key="__desc__" value=". + 1" />
+          </module>
+          <module cache="1" id="3" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="3" x="-126.564173035" y="195.890834747" />
+            <function id="3" name="name" pos="0">
+              <parameter alias="" id="3" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_i" />
+            </function>
+          </module>
+          <module cache="1" id="4" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="4" x="-163.214414015" y="-175.89077419" />
+            <function id="4" name="name" pos="0">
+              <parameter alias="" id="4" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_next" />
+            </function>
+          </module>
+          <module cache="1" id="5" name="If" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2">
+            <location id="5" x="132.013008173" y="-104.780306193" />
+            <function id="5" name="FalseOutputPorts" pos="0">
+              <parameter alias="" id="5" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['InternalPipe']" />
+            </function>
+            <function id="6" name="TrueOutputPorts" pos="1">
+              <parameter alias="" id="6" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['value']" />
+            </function>
+          </module>
+          <module cache="1" id="6" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="6" x="203.315021596" y="18.9243917943" />
+          </module>
+          <module cache="1" id="7" name="InputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="7" x="150.912337032" y="189.877411928" />
+            <function id="7" name="name" pos="0">
+              <parameter alias="" id="7" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_previouslist" />
+            </function>
+          </module>
+          <module cache="1" id="8" name="OutputPort" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="8" x="156.066699448" y="-217.317218945" />
+            <function id="8" name="name" pos="0">
+              <parameter alias="" id="8" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_newlist" />
+            </function>
+          </module>
+          <module cache="1" id="9" name="Round" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="9" x="-194.932512299" y="-72.8346280697" />
+          </module>
+          <module cache="1" id="10" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1">
+            <location id="10" x="64.5208907006" y="116.834756192" />
+          </module>
+        </workflow>
+      </group>
+    </add>
+    <add id="581" objectId="68" parentObjId="43" parentObjType="group" what="location">
+      <location id="68" x="8.75961968679" y="27.8100671139" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:57:59" id="75" prevId="74" session="3" user="Remi">
+    <annotation id="36" key="__description__" value="Paste" />
+    <add id="582" objectId="44" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="44" name="Integer" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="583" objectId="41" parentObjId="44" parentObjType="module" what="function">
+      <function id="41" name="value" pos="0" />
+    </add>
+    <add id="584" objectId="53" parentObjId="41" parentObjType="function" what="parameter">
+      <parameter alias="" id="53" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="8" />
+    </add>
+    <add id="585" objectId="69" parentObjId="44" parentObjType="module" what="location">
+      <location id="69" x="-119.838926175" y="22.7651006711" />
+    </add>
+    <add id="586" objectId="45" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="45" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="587" objectId="42" parentObjId="45" parentObjType="module" what="function">
+      <function id="42" name="value" pos="0" />
+    </add>
+    <add id="588" objectId="54" parentObjId="42" parentObjType="function" what="parameter">
+      <parameter alias="" id="54" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="[2, 3, 5]" />
+    </add>
+    <add id="589" objectId="70" parentObjId="45" parentObjType="module" what="location">
+      <location id="70" x="157.637583893" y="20.1879194631" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:58:08" id="76" prevId="75" session="3" user="Remi">
+    <change id="590" newObjId="71" oldObjId="69" parentObjId="44" parentObjType="module" what="location">
+      <location id="71" x="-87.1946308729" y="149.046979866" />
+    </change>
+    <change id="591" newObjId="72" oldObjId="70" parentObjId="45" parentObjType="module" what="location">
+      <location id="72" x="131.00671141" y="156.77852349" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:58:08" id="77" prevId="76" session="3" user="Remi">
+    <add id="592" objectId="45" parentObjId="" parentObjType="" what="connection">
+      <connection id="45" />
+    </add>
+    <add id="593" objectId="90" parentObjId="45" parentObjType="connection" what="port">
+      <port id="90" moduleId="44" moduleName="Integer" name="value" signature="(org.vistrails.vistrails.basic:Integer)" type="source" />
+    </add>
+    <add id="594" objectId="91" parentObjId="45" parentObjType="connection" what="port">
+      <port id="91" moduleId="43" moduleName="Group" name="genprimes_i" signature="(org.vistrails.vistrails.basic:Integer)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:58:11" id="78" prevId="77" session="3" user="Remi">
+    <add id="595" objectId="46" parentObjId="" parentObjType="" what="connection">
+      <connection id="46" />
+    </add>
+    <add id="596" objectId="92" parentObjId="46" parentObjType="connection" what="port">
+      <port id="92" moduleId="45" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+    </add>
+    <add id="597" objectId="93" parentObjId="46" parentObjType="connection" what="port">
+      <port id="93" moduleId="43" moduleName="Group" name="genprimes_previouslist" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:58:20" id="79" prevId="78" session="3" user="Remi">
+    <change id="598" newObjId="55" oldObjId="53" parentObjId="41" parentObjType="function" what="parameter">
+      <parameter alias="" id="55" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="7" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:58:52" id="80" prevId="74" session="3" user="Remi">
+    <add id="599" objectId="46" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="46" name="While" namespace="" package="org.vistrails.vistrails.control_flow" version="0.2.2" />
+    </add>
+    <add id="600" objectId="73" parentObjId="46" parentObjType="module" what="location">
+      <location id="73" x="78.1744966443" y="-132.295302013" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:58:57" id="81" prevId="80" session="3" user="Remi">
+    <change id="601" newObjId="74" oldObjId="73" parentObjId="46" parentObjType="module" what="location">
+      <location id="74" x="88.4832214765" y="-98.7919463087" />
+    </change>
+  </action>
+  <action date="2013-09-06 11:59:02" id="82" prevId="81" session="3" user="Remi">
+    <add id="602" objectId="47" parentObjId="" parentObjType="" what="connection">
+      <connection id="47" />
+    </add>
+    <add id="603" objectId="94" parentObjId="47" parentObjType="connection" what="port">
+      <port id="94" moduleId="43" moduleName="Group" name="self" signature="(org.vistrails.vistrails.basic:Group)" type="source" />
+    </add>
+    <add id="604" objectId="95" parentObjId="47" parentObjType="connection" what="port">
+      <port id="95" moduleId="46" moduleName="While" name="FunctionPort" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:59:17" id="83" prevId="82" session="3" user="Remi">
+    <add id="605" objectId="43" parentObjId="46" parentObjType="module" what="function">
+      <function id="43" name="MaxIterations" pos="0" />
+    </add>
+    <add id="606" objectId="56" parentObjId="43" parentObjType="function" what="parameter">
+      <parameter alias="" id="56" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="100" />
+    </add>
+  </action>
+  <action date="2013-09-06 11:59:57" id="84" prevId="83" session="3" user="Remi">
+    <add id="607" objectId="44" parentObjId="43" parentObjType="group" what="function">
+      <function id="44" name="genprimes_i" pos="0" />
+    </add>
+    <add id="608" objectId="57" parentObjId="44" parentObjType="function" what="parameter">
+      <parameter alias="" id="57" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="2" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:00:05" id="85" prevId="84" session="3" user="Remi">
+    <add id="609" objectId="45" parentObjId="43" parentObjType="group" what="function">
+      <function id="45" name="genprimes_previouslist" pos="1" />
+    </add>
+    <add id="610" objectId="58" parentObjId="45" parentObjType="function" what="parameter">
+      <parameter alias="" id="58" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="[]" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:00:18" id="86" prevId="85" session="3" user="Remi">
+    <add id="611" objectId="46" parentObjId="46" parentObjType="module" what="function">
+      <function id="46" name="StateInputPorts" pos="1" />
+    </add>
+    <add id="612" objectId="59" parentObjId="46" parentObjType="function" what="parameter">
+      <parameter alias="" id="59" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['genprimes_i', 'genprimes_previouslist']" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:00:37" id="87" prevId="86" session="3" user="Remi">
+    <add id="613" objectId="47" parentObjId="46" parentObjType="module" what="function">
+      <function id="47" name="StateOutputPorts" pos="2" />
+    </add>
+    <add id="614" objectId="60" parentObjId="47" parentObjType="function" what="parameter">
+      <parameter alias="" id="60" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="['genprimes_next', 'genprimes_newlist']" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:00:49" id="88" prevId="87" session="3" user="Remi">
+    <add id="615" objectId="48" parentObjId="46" parentObjType="module" what="function">
+      <function id="48" name="OutputPort" pos="3" />
+    </add>
+    <add id="616" objectId="61" parentObjId="48" parentObjType="function" what="parameter">
+      <parameter alias="" id="61" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:String" val="genprimes_newlist" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:00:57" id="89" prevId="88" session="3" user="Remi">
+    <add id="617" objectId="47" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="47" name="StandardOutput" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="618" objectId="75" parentObjId="47" parentObjType="module" what="location">
+      <location id="75" x="130.577181208" y="-196.724832215" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:00:57" id="90" prevId="89" session="3" user="Remi">
+    <add id="619" objectId="48" parentObjId="" parentObjType="" what="connection">
+      <connection id="48" />
+    </add>
+    <add id="620" objectId="96" parentObjId="48" parentObjType="connection" what="port">
+      <port id="96" moduleId="46" moduleName="While" name="Result" signature="(org.vistrails.vistrails.basic:Variant)" type="source" />
+    </add>
+    <add id="621" objectId="97" parentObjId="48" parentObjType="connection" what="port">
+      <port id="97" moduleId="47" moduleName="StandardOutput" name="value" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-09-06 12:06:00" id="91" prevId="90" session="4" user="Remi">
+    <change id="622" newObjId="62" oldObjId="58" parentObjId="45" parentObjType="function" what="parameter">
+      <parameter alias="" id="62" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:List" val="[2]" />
+    </change>
+  </action>
+  <action date="2013-09-06 12:06:04" id="92" prevId="91" session="4" user="Remi">
+    <change id="623" newObjId="63" oldObjId="57" parentObjId="44" parentObjType="function" what="parameter">
+      <parameter alias="" id="63" name="<no description>" pos="0" type="org.vistrails.vistrails.basic:Integer" val="3" />
+    </change>
+  </action>
+  <actionAnnotation actionId="2" date="2013-09-06 11:27:33" id="5" key="__prune__" user="Remi" value="True" />
+  <actionAnnotation actionId="4" date="2013-09-06 11:28:12" id="6" key="__prune__" user="Remi" value="True" />
+  <actionAnnotation actionId="6" date="2013-09-06 11:28:47" id="7" key="__tag__" user="Remi" value="prime_isprime_internal" />
+  <actionAnnotation actionId="27" date="2013-09-06 11:32:46" id="10" key="__tag__" user="Remi" value="test_1_1" />
+  <actionAnnotation actionId="28" date="2013-09-06 11:32:58" id="11" key="__tag__" user="Remi" value="test_1_2" />
+  <actionAnnotation actionId="29" date="2013-09-06 11:33:03" id="13" key="__tag__" user="Remi" value="test_1_3" />
+  <actionAnnotation actionId="30" date="2013-09-06 11:33:35" id="14" key="__tag__" user="Remi" value="prime_isprime_internal grouped" />
+  <actionAnnotation actionId="36" date="2013-09-06 11:34:57" id="16" key="__tag__" user="Remi" value="test_2_1" />
+  <actionAnnotation actionId="33" date="2013-09-06 11:35:02" id="17" key="__prune__" user="Remi" value="True" />
+  <actionAnnotation actionId="37" date="2013-09-06 11:35:24" id="18" key="__tag__" user="Remi" value="test_2_2" />
+  <actionAnnotation actionId="38" date="2013-09-06 11:35:38" id="19" key="__tag__" user="Remi" value="test_2_3" />
+  <actionAnnotation actionId="49" date="2013-09-06 11:38:22" id="23" key="__tag__" user="Remi" value="prime_isprime" />
+  <actionAnnotation actionId="44" date="2013-09-06 11:38:24" id="24" key="__prune__" user="Remi" value="True" />
+  <actionAnnotation actionId="53" date="2013-09-06 11:38:54" id="25" key="__tag__" user="Remi" value="test_3_1" />
+  <actionAnnotation actionId="54" date="2013-09-06 11:38:58" id="26" key="__tag__" user="Remi" value="test_3_2" />
+  <actionAnnotation actionId="55" date="2013-09-06 11:39:37" id="27" key="__tag__" user="Remi" value="prime_isprime grouped" />
+  <actionAnnotation actionId="61" date="2013-09-06 11:40:01" id="28" key="__tag__" user="Remi" value="test_4_1" />
+  <actionAnnotation actionId="62" date="2013-09-06 11:40:16" id="29" key="__tag__" user="Remi" value="test_4_2" />
+  <actionAnnotation actionId="66" date="2013-09-06 11:56:20" id="32" key="__tag__" user="Remi" value="genprimes_internal" />
+  <actionAnnotation actionId="72" date="2013-09-06 11:56:55" id="33" key="__tag__" user="Remi" value="test_5_1" />
+  <actionAnnotation actionId="73" date="2013-09-06 11:57:07" id="34" key="__tag__" user="Remi" value="test_5_2" />
+  <actionAnnotation actionId="74" date="2013-09-06 11:57:46" id="35" key="__tag__" user="Remi" value="genprimes_internal grouped" />
+  <actionAnnotation actionId="78" date="2013-09-06 11:58:28" id="37" key="__tag__" user="Remi" value="test_6_1" />
+  <actionAnnotation actionId="79" date="2013-09-06 11:58:32" id="38" key="__tag__" user="Remi" value="test_6_2" />
+  <actionAnnotation actionId="92" date="2013-09-06 12:06:28" id="40" key="__tag__" user="Remi" value="genprimes" />
+</vistrail>
diff --git a/examples/protein_visualization.vt b/examples/protein_visualization.vt
new file mode 100644
index 0000000..bd59d12
Binary files /dev/null and b/examples/protein_visualization.vt differ
diff --git a/examples/r_stats.vt b/examples/r_stats.vt
new file mode 100644
index 0000000..1d9c5d9
Binary files /dev/null and b/examples/r_stats.vt differ
diff --git a/examples/scripting/README b/examples/scripting/README
new file mode 100644
index 0000000..80dbbb0
--- /dev/null
+++ b/examples/scripting/README
@@ -0,0 +1,11 @@
+This file explains script vtk_book_3rd_p189_script.py. It is a script that generates the same pipeline found in the example vt file with (practically) the same name, and is used to compare the new layout options designed to improve incremental/online layout.
+
+Two options were added to the original layout algorithm:
+
+-preserve_order: this preserves the order in the x-coordinate of existing modules in the pipeline. Modules with no previous x position (new modules) are positioned based on the original layout algorithm which tries to minimize connection crossings. 
+
+-no_gaps: this prevents connected modules from being more than one layer (aka row) apart from eachother.
+
+VisTrails files were generated using each of the 4 combinations of the above boolean options. These can be regenerated by changing the parameters in function layoutAndAdd on line 40 of the script, and the output file name at the end of the script. Open these in vistrails and traverse the version tree using undo and redo to see how the pipelines are layed out incrementally.
+
+brain_script.py builds the example pipeline from brain_vistrail.vt, and combined_script.py builds a pipeline of the two combined.
\ No newline at end of file
diff --git a/examples/scripting/brain_from_script.vt b/examples/scripting/brain_from_script.vt
new file mode 100644
index 0000000..d30ae3b
Binary files /dev/null and b/examples/scripting/brain_from_script.vt differ
diff --git a/examples/scripting/brain_script.py b/examples/scripting/brain_script.py
new file mode 100644
index 0000000..292535f
--- /dev/null
+++ b/examples/scripting/brain_script.py
@@ -0,0 +1,110 @@
+import os
+import sys
+
+try:
+    import vistrails
+except:
+    #try to append vistrails source dir relative to examples/scripting
+    this_dir = os.path.split(__file__)[0]
+    sys.path.append(os.path.join(this_dir, '../..'))
+    import vistrails
+
+from vistrails.core.application import init as vt_init
+from vistrails.core.api import Package, get_api
+
+#init vistrails
+vt_app = vt_init()
+vt_app.new_vistrail()
+api = get_api()
+
+httppkg = 'edu.utah.sci.vistrails.http'
+vtkpkg = 'edu.utah.sci.vistrails.vtk'
+
+http = Package(httppkg)
+vtk = Package(vtkpkg)
+
+#start with http file module
+httpFA = http.HTTPFile()
+httpFA.url = \
+    'http://www.vistrails.org/download/download.php?type=DATA&id=gktbhFA.vtk'
+
+#add and connect vtkDataSetReader
+dataFA = api.add_and_connect_module(vtkpkg, 'vtkDataSetReader', 'SetFile',
+                                    httpFA, 'file')
+
+#add contour filter
+contour = api.add_and_connect_module(vtkpkg, 'vtkContourFilter',
+                                     'SetInputConnection0',
+                                     dataFA, 'GetOutputPort0')
+contour.SetValue = (0, 0.6)
+
+#add normals, stripper, and probe filter
+normals = api.add_and_connect_module(vtkpkg, 'vtkPolyDataNormals',
+                                     'SetInputConnection0',
+                                     contour, 'GetOutputPort0')
+normals.SetFeatureAngle = 60.0
+
+stripper = api.add_and_connect_module(vtkpkg, 'vtkStripper',
+                                      'SetInputConnection0',
+                                      normals, 'GetOutputPort0')
+
+probe = api.add_and_connect_module(vtkpkg, 'vtkProbeFilter',
+                                   'SetInputConnection0',
+                                   stripper, 'GetOutputPort0')
+
+#build other branch in reverse
+colors = api.add_and_connect_module(vtkpkg, 'vtkImageMapToColors',
+                                    'GetOutputPort0',
+                                    probe, 'SetInputConnection1', True)
+colors.SetOutputFormatToRGBA = True
+
+lookup = api.add_and_connect_module(vtkpkg, 'vtkLookupTable', 'self',
+                                    colors, 'SetLookupTable', True)
+lookup.SetHueRange = (0.0, 0.8)
+lookup.SetSaturationRange = (0.3, 0.7)
+lookup.SetValueRange = (1.0, 1.0)
+
+dataL123 = api.add_and_connect_module(vtkpkg, 'vtkDataSetReader',
+                                      'GetOutputPort0',
+                                      colors, 'SetInputConnection0', True)
+
+httpL123 = api.add_and_connect_module(httppkg, 'HTTPFile', 'file',
+                                      dataL123, 'SetFile', True)
+
+httpL123.url = \
+    'http://www.vistrails.org/download/download.php?type=DATA&id=gktbhL123.vtk'
+
+#finish bottom section
+mapper = api.add_and_connect_module(vtkpkg, 'vtkPolyDataMapper',
+                                    'SetInputConnection0',
+                                    probe, 'GetOutputPort0')
+mapper.ScalarVisibilityOn = True
+
+actor = api.add_and_connect_module(vtkpkg, 'vtkActor', 'SetMapper',
+                                   mapper, 'self')
+
+prop = api.add_and_connect_module(vtkpkg, 'vtkProperty', 'self',
+                                  actor, 'SetProperty', True)
+prop.SetDiffuseColor = (1.0, 0.49, 0.25)
+prop.SetOpacity = 0.7
+prop.SetSpecular = 0.3
+prop.SetSpecularPower = 2.0
+
+renderer = api.add_and_connect_module(vtkpkg, 'vtkRenderer', 'AddActor',
+                                      actor, 'self')
+
+# Thought this used to work. Right now fails to convert to color when executed
+#renderer.SetBackgroundWidget = 'white'
+
+camera = api.add_and_connect_module(vtkpkg, 'vtkCamera', 'self',
+                                    renderer, 'SetActiveCamera', True)
+camera.SetFocalPoint = (15.666, 40.421, 39.991)
+camera.SetPosition = (207.961, 34.197, 129.680)
+camera.SetViewUp = (0.029, 1.0, 0.008)
+
+
+cell = api.add_and_connect_module(vtkpkg, 'VTKCell', 'AddRenderer',
+                                  renderer, 'self')
+
+#write to file
+api.save_vistrail('brain_from_script.vt')
diff --git a/examples/scripting/combined_script.py b/examples/scripting/combined_script.py
new file mode 100644
index 0000000..073a596
--- /dev/null
+++ b/examples/scripting/combined_script.py
@@ -0,0 +1,215 @@
+import sys
+sys.path.append('/Users/benbu/src/vistrails/vistrails/')
+
+import vistrails.core.application
+import vistrails.core.db.action
+import vistrails.core.db.locator
+import vistrails.core.modules.module_registry
+
+
+#init vistrails
+vt_app = vistrails.core.application.init()
+controller = vt_app.get_controller()
+registry = vistrails.core.modules.module_registry.get_module_registry()
+
+#========================== convenience methods ================================
+def newModule(package_name, module_name):
+    descriptor = registry.get_descriptor_by_name(package_name, module_name)
+    return controller.create_module_from_descriptor(descriptor)
+
+def newConnection(source, source_port, target, target_port):
+    c = controller.create_connection(source, source_port, target, target_port)
+    return c
+
+def setPortValue(module, port_name, value):
+    function = controller.create_function(module, port_name, [str(value)])
+    module.add_function(function)
+    return
+
+def addToPipeline(items, ops=[]):
+    item_ops = [('add',item) for item in items]
+    action = vistrails.core.db.action.create_action(item_ops + ops)
+    controller.add_new_action(action)
+    version = controller.perform_action(action)
+    controller.change_selected_version(version)
+
+def layoutAndAdd(module, connections):
+    if not isinstance(connections, list):
+        connections = [connections]
+    ops = controller.layout_modules_ops(preserve_order=True,
+                                        new_modules=[module],
+                                        new_connections=connections)
+    addToPipeline([module] + connections, ops)
+
+#========================== package prefixes ===================================
+httppkg = 'edu.utah.sci.vistrails.http'
+vtkpkg = 'edu.utah.sci.vistrails.vtk'
+
+#============================ start script =====================================
+
+#start with http file module
+httpFA = newModule(httppkg, 'HTTPFile')
+url = 'http://www.vistrails.org/download/download.php?type=DATA&id=gktbhFA.vtk'
+setPortValue(httpFA, 'url', url)
+
+#add to pipeline
+addToPipeline([httpFA])
+
+#create data set reader module for the gktbhFA.vtk file
+dataFA = newModule(vtkpkg, 'vtkDataSetReader')
+
+#connect modules
+http_dataFA = newConnection(httpFA, 'file', dataFA, 'SetFile')
+
+#layout new modules before adding
+layoutAndAdd(dataFA, http_dataFA)
+
+#add contour filter
+contour = newModule(vtkpkg, 'vtkContourFilter')
+setPortValue(contour, 'SetValue', (0,0.6))
+dataFA_contour = newConnection(dataFA, 'GetOutputPort0',
+                               contour, 'SetInputConnection0')
+layoutAndAdd(contour, dataFA_contour)
+
+#add normals, stripper, and probe filter
+normals = newModule(vtkpkg, 'vtkPolyDataNormals') #GetOutputPort0
+setPortValue(normals, 'SetFeatureAngle', 60.0)
+contour_normals = newConnection(contour, 'GetOutputPort0', 
+                                normals, 'SetInputConnection0')
+layoutAndAdd(normals, contour_normals)
+
+stripper = newModule(vtkpkg, 'vtkStripper') #GetOutputPort0
+normals_stripper = newConnection(normals, 'GetOutputPort0',
+                                 stripper, 'SetInputConnection0')
+layoutAndAdd(stripper, normals_stripper)
+
+probe = newModule(vtkpkg, 'vtkProbeFilter') #same
+stripper_probe = newConnection(stripper, 'GetOutputPort0',
+                               probe, 'SetInputConnection0')
+layoutAndAdd(probe, stripper_probe)
+
+#build other branch in reverse
+colors = newModule(vtkpkg, 'vtkImageMapToColors')
+setPortValue(colors, 'SetOutputFormatToRGBA', True)
+colors_probe = newConnection(colors, 'GetOutputPort0',
+                             probe, 'SetInputConnection1')
+layoutAndAdd(colors, colors_probe)
+
+lookup = newModule(vtkpkg, 'vtkLookupTable')
+setPortValue(lookup, 'SetHueRange', (0.0,0.8))
+setPortValue(lookup, 'SetSaturationRange', (0.3,0.7))
+setPortValue(lookup, 'SetValueRange', (1.0,1.0))
+lookup_colors = newConnection(lookup, 'self',
+                              colors, 'SetLookupTable')
+layoutAndAdd(lookup, lookup_colors)
+
+dataL123 = newModule(vtkpkg, 'vtkDataSetReader')
+dataL123_colors = newConnection(dataL123, 'GetOutputPort0',
+                                colors, 'SetInputConnection0')
+layoutAndAdd(dataL123, dataL123_colors)
+
+httpL123 = newModule(httppkg, 'HTTPFile')
+url = 'http://www.vistrails.org/download/download.php?type=DATA&id=gktbhL123.vtk'
+setPortValue(httpL123, 'url', url)
+httpL123_dataL123 = newConnection(httpL123, 'file',
+                                  dataL123, 'SetFile')
+layoutAndAdd(httpL123, httpL123_dataL123)
+
+#finish bottom section
+mapper = newModule(vtkpkg, 'vtkPolyDataMapper')
+setPortValue(mapper, 'ScalarVisibilityOn', True)
+probe_mapper = newConnection(probe, 'GetOutputPort0',
+                             mapper, 'SetInputConnection0')
+layoutAndAdd(mapper, probe_mapper)
+
+actor = newModule(vtkpkg, 'vtkActor')
+mapper_actor = newConnection(mapper, 'self',
+                             actor, 'SetMapper')
+layoutAndAdd(actor, mapper_actor)
+
+prop = newModule(vtkpkg, 'vtkProperty')
+setPortValue(prop, 'SetDiffuseColor', (1.0,0.49,0.25))
+setPortValue(prop, 'SetOpacity', 0.7)
+setPortValue(prop, 'SetSpecular', 0.3)
+setPortValue(prop, 'SetSpecularPower', 2.0)
+prop_actor = newConnection(prop, 'self',
+                           actor, 'SetProperty')
+layoutAndAdd(prop, prop_actor)
+
+renderer = newModule(vtkpkg, 'vtkRenderer')
+setPortValue(renderer, 'SetBackgroundWidget', 'white')
+actor_renderer = newConnection(actor, 'self',
+                               renderer, 'AddActor')
+layoutAndAdd(renderer, actor_renderer)
+
+camera = newModule(vtkpkg, 'vtkCamera')
+setPortValue(camera, 'SetFocalPoint', (15.666,40.421,39.991))
+setPortValue(camera, 'SetPosition', (207.961,34.197,129.680))
+setPortValue(camera, 'SetViewUp', (0.029, 1.0, 0.008))
+camera_renderer = newConnection(camera, 'self',
+                                renderer, 'SetActiveCamera')
+layoutAndAdd(camera, camera_renderer)
+
+#this is missing when running from script??
+# cell = newModule(vtkpkg, 'VTKCell')
+# cell = newModule(vtkpkg, 'vtkCell')
+# renderer_cell = newConnection(renderer, 'self',
+#                               cell, 'AddRenderer')
+# layoutAndAdd(cell, renderer_cell)
+
+#add book 3rd p189 example
+
+qcActor = newModule(vtkpkg, 'vtkActor')
+qcActor_renderer = newConnection(qcActor, 'self',
+                                 renderer, 'AddActor')
+layoutAndAdd(qcActor, qcActor_renderer)
+
+qcMapper = newModule(vtkpkg, 'vtkPolyDataMapper')
+qcMapper_actor = newConnection(qcMapper, 'self',
+                               qcActor, 'SetMapper')
+layoutAndAdd(qcMapper, qcMapper_actor)
+
+qContour = newModule(vtkpkg, 'vtkContourFilter')
+setPortValue(qContour, 'GenerateValues', (5,0,1.2))
+qContour_mapper = newConnection(qContour, 'GetOutputPort0',
+                                qcMapper, 'SetInputConnection0')
+layoutAndAdd(qContour, qContour_mapper)
+
+sample = newModule(vtkpkg, 'vtkSampleFunction')
+setPortValue(sample, 'SetSampleDimensions', (50,50,50))
+sample_qContour = newConnection(sample, 'GetOutputPort0',
+                                qContour, 'SetInputConnection0')
+layoutAndAdd(sample, sample_qContour)
+
+quad = newModule(vtkpkg, 'vtkQuadric')
+setPortValue(quad, 'SetCoefficients', (0.5,1,0.2,0,0.1,0,0,0.2,0,0))
+quad_sample = newConnection(quad, 'self',
+                            sample, 'SetImplicitFunction')
+layoutAndAdd(quad, quad_sample)
+
+oActor = newModule(vtkpkg, 'vtkActor')
+oActor_renderer = newConnection(oActor, 'self',
+                                renderer, 'AddActor')
+layoutAndAdd(oActor, oActor_renderer)
+
+oProp = newModule(vtkpkg, 'vtkProperty')
+setPortValue(oProp, 'SetColor', (0,0,0))
+oProp_actor = newConnection(oProp, 'self',
+                            oActor, 'SetProperty')
+layoutAndAdd(oProp, oProp_actor)
+
+oMapper = newModule(vtkpkg, 'vtkPolyDataMapper')
+oMapper_actor = newConnection(oMapper, 'self',
+                              oActor, 'SetMapper')
+layoutAndAdd(oMapper, oMapper_actor)
+
+outline = newModule(vtkpkg, 'vtkOutlineFilter')
+outline_mapper = newConnection(outline, 'GetOutputPort0',
+                               oMapper, 'SetInputConnection0')
+sample_outline = newConnection(sample, 'GetOutputPort0',
+                               outline, 'SetInputConnection0')
+layoutAndAdd(outline, [outline_mapper, sample_outline])
+
+#write to file
+locator = vistrails.core.db.locator.FileLocator('incremental_layout_combined.vt')
+controller.write_vistrail(locator)
diff --git a/examples/scripting/vtk_book_3rd_p189_script.py b/examples/scripting/vtk_book_3rd_p189_script.py
new file mode 100644
index 0000000..b6ca03a
--- /dev/null
+++ b/examples/scripting/vtk_book_3rd_p189_script.py
@@ -0,0 +1,114 @@
+import sys
+sys.path.append('/Users/benbu/src/vistrails/vistrails/')
+
+import vistrails.core.application
+import vistrails.core.db.action
+import vistrails.core.db.locator
+import vistrails.core.modules.module_registry
+
+
+#init vistrails
+vt_app = vistrails.core.application.init()
+controller = vt_app.get_controller()
+registry = vistrails.core.modules.module_registry.get_module_registry()
+
+#========================== convenience methods ================================
+def newModule(package_name, module_name):
+    descriptor = registry.get_descriptor_by_name(package_name, module_name)
+    return controller.create_module_from_descriptor(descriptor)
+
+def newConnection(source, source_port, target, target_port):
+    c = controller.create_connection(source, source_port, target, target_port)
+    return c
+
+def setPortValue(module, port_name, value):
+    function = controller.create_function(module, port_name, [str(value)])
+    module.add_function(function)
+    return
+
+def addToPipeline(items, ops=[]):
+    item_ops = [('add',item) for item in items]
+    action = vistrails.core.db.action.create_action(item_ops + ops)
+    controller.add_new_action(action)
+    version = controller.perform_action(action)
+    controller.change_selected_version(version)
+
+def layoutAndAdd(module, connections):
+    print 'adding %s' % module.name
+    if not isinstance(connections, list):
+        connections = [connections]
+    ops = controller.layout_modules_ops(preserve_order=True, no_gaps=False,
+                                        new_modules=[module],
+                                        new_connections=connections)
+    addToPipeline([module] + connections, ops)
+
+#========================== package prefixes ===================================
+httppkg = 'edu.utah.sci.vistrails.http'
+vtkpkg = 'edu.utah.sci.vistrails.vtk'
+
+#============================ start script =====================================
+
+renderer = newModule(vtkpkg, 'vtkRenderer')
+addToPipeline([renderer])
+
+#this is missing when running from script??
+# cell = newModule(vtkpkg, 'VTKCell')
+# cell = newModule(vtkpkg, 'vtkCell')
+# renderer_cell = newConnection(renderer, 'self',
+#                               cell, 'AddRenderer')
+# layoutAndAdd(cell, renderer_cell)
+
+qcActor = newModule(vtkpkg, 'vtkActor')
+qcActor_renderer = newConnection(qcActor, 'self',
+                                 renderer, 'AddActor')
+layoutAndAdd(qcActor, qcActor_renderer)
+
+oActor = newModule(vtkpkg, 'vtkActor')
+oActor_renderer = newConnection(oActor, 'self',
+                                renderer, 'AddActor')
+layoutAndAdd(oActor, oActor_renderer)
+
+qcMapper = newModule(vtkpkg, 'vtkPolyDataMapper')
+qcMapper_actor = newConnection(qcMapper, 'self',
+                               qcActor, 'SetMapper')
+layoutAndAdd(qcMapper, qcMapper_actor)
+
+oProp = newModule(vtkpkg, 'vtkProperty')
+setPortValue(oProp, 'SetColor', (0,0,0))
+oProp_actor = newConnection(oProp, 'self',
+                            oActor, 'SetProperty')
+layoutAndAdd(oProp, oProp_actor)
+
+oMapper = newModule(vtkpkg, 'vtkPolyDataMapper')
+oMapper_actor = newConnection(oMapper, 'self',
+                              oActor, 'SetMapper')
+layoutAndAdd(oMapper, oMapper_actor)
+
+qContour = newModule(vtkpkg, 'vtkContourFilter')
+setPortValue(qContour, 'GenerateValues', (5,0,1.2))
+qContour_mapper = newConnection(qContour, 'GetOutputPort0',
+                                qcMapper, 'SetInputConnection0')
+layoutAndAdd(qContour, qContour_mapper)
+
+sample = newModule(vtkpkg, 'vtkSampleFunction')
+setPortValue(sample, 'SetSampleDimensions', (50,50,50))
+sample_qContour = newConnection(sample, 'GetOutputPort0',
+                                qContour, 'SetInputConnection0')
+layoutAndAdd(sample, sample_qContour)
+
+outline = newModule(vtkpkg, 'vtkOutlineFilter')
+outline_mapper = newConnection(outline, 'GetOutputPort0',
+                               oMapper, 'SetInputConnection0')
+sample_outline = newConnection(sample, 'GetOutputPort0',
+                               outline, 'SetInputConnection0')
+layoutAndAdd(outline, [outline_mapper, sample_outline])
+
+quad = newModule(vtkpkg, 'vtkQuadric')
+setPortValue(quad, 'SetCoefficients', (0.5,1,0.2,0,0.1,0,0,0.2,0,0))
+quad_sample = newConnection(quad, 'self',
+                            sample, 'SetImplicitFunction')
+layoutAndAdd(quad, quad_sample)
+
+#write to file
+locator = vistrails.core.db.locator.FileLocator('p189_gaps_preserve_order.vt')
+controller.write_vistrail(locator)
diff --git a/examples/spx.vt b/examples/spx.vt
new file mode 100644
index 0000000..d5d8cca
Binary files /dev/null and b/examples/spx.vt differ
diff --git a/examples/structure_or_id_webservice.vt b/examples/structure_or_id_webservice.vt
new file mode 100644
index 0000000..0e9496f
Binary files /dev/null and b/examples/structure_or_id_webservice.vt differ
diff --git a/examples/terminator.vt b/examples/terminator.vt
new file mode 100644
index 0000000..f0ba758
Binary files /dev/null and b/examples/terminator.vt differ
diff --git a/examples/triangle_area.vt b/examples/triangle_area.vt
new file mode 100644
index 0000000..947a757
Binary files /dev/null and b/examples/triangle_area.vt differ
diff --git a/examples/usersguide/cfassistant.vt b/examples/usersguide/cfassistant.vt
new file mode 100644
index 0000000..5b64ab3
Binary files /dev/null and b/examples/usersguide/cfassistant.vt differ
diff --git a/examples/usersguide/global_variables.vt b/examples/usersguide/global_variables.vt
new file mode 100644
index 0000000..53c0061
Binary files /dev/null and b/examples/usersguide/global_variables.vt differ
diff --git a/examples/usersguide/mashups.vt b/examples/usersguide/mashups.vt
new file mode 100644
index 0000000..3d0ad44
Binary files /dev/null and b/examples/usersguide/mashups.vt differ
diff --git a/examples/usersguide/parameter_exploration.vt b/examples/usersguide/parameter_exploration.vt
new file mode 100644
index 0000000..66f60ae
Binary files /dev/null and b/examples/usersguide/parameter_exploration.vt differ
diff --git a/examples/vtk.vt b/examples/vtk.vt
new file mode 100644
index 0000000..a59ec52
Binary files /dev/null and b/examples/vtk.vt differ
diff --git a/examples/vtk_book_3rd_p189.vt b/examples/vtk_book_3rd_p189.vt
new file mode 100644
index 0000000..cb15d23
Binary files /dev/null and b/examples/vtk_book_3rd_p189.vt differ
diff --git a/examples/vtk_book_3rd_p193.vt b/examples/vtk_book_3rd_p193.vt
new file mode 100644
index 0000000..99cee00
Binary files /dev/null and b/examples/vtk_book_3rd_p193.vt differ
diff --git a/examples/vtk_examples/Annotation/TestText.py b/examples/vtk_examples/Annotation/TestText.py
new file mode 100644
index 0000000..289fa76
--- /dev/null
+++ b/examples/vtk_examples/Annotation/TestText.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of 2D text.
+
+import vtk
+
+# Create a sphere source, mapper, and actor
+sphere = vtk.vtkSphereSource()
+
+sphereMapper = vtk.vtkPolyDataMapper()
+sphereMapper.SetInputConnection(sphere.GetOutputPort())
+sphereMapper.GlobalImmediateModeRenderingOn()
+sphereActor = vtk.vtkLODActor()
+sphereActor.SetMapper(sphereMapper)
+
+# Create a scaled text actor. 
+# Set the text, font, justification, and properties (bold, italics,
+# etc.).
+textActor = vtk.vtkTextActor()
+textActor.ScaledTextOn()
+textActor.SetDisplayPosition(90, 50)
+textActor.SetInput("This is a sphere")
+
+# Set coordinates to match the old vtkScaledTextActor default value
+textActor.GetPosition2Coordinate().SetCoordinateSystemToNormalizedViewport()
+textActor.GetPosition2Coordinate().SetValue(0.6, 0.1)
+
+tprop = textActor.GetTextProperty()
+tprop.SetFontSize(18)
+tprop.SetFontFamilyToArial()
+tprop.SetJustificationToCentered()
+tprop.BoldOn()
+tprop.ItalicOn()
+tprop.ShadowOn()
+tprop.SetColor(0, 0, 1)
+
+# Create the Renderer, RenderWindow, RenderWindowInteractor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer; set the background and size; zoom
+# in; and render.
+ren.AddActor2D(textActor)
+ren.AddActor(sphereActor)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(250, 125)
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.5)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Annotation/TestText.vt b/examples/vtk_examples/Annotation/TestText.vt
new file mode 100644
index 0000000..4a53b06
Binary files /dev/null and b/examples/vtk_examples/Annotation/TestText.vt differ
diff --git a/examples/vtk_examples/Annotation/cubeAxes.py b/examples/vtk_examples/Annotation/cubeAxes.py
new file mode 100644
index 0000000..cffe5ca
--- /dev/null
+++ b/examples/vtk_examples/Annotation/cubeAxes.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of vtkCubeAxesActor2D to indicate
+# the position in space that the camera is currently viewing.  The
+# vtkCubeAxesActor2D draws axes on the bounding box of the data set
+# and labels the axes with x-y-z coordinates.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create a vtkBYUReader and read in a data set.
+fohe = vtk.vtkBYUReader()
+fohe.SetGeometryFileName(VTK_DATA_ROOT + "/Data/teapot.g")
+
+# Create a vtkPolyDataNormals filter to calculate the normals of the
+# data set.
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(fohe.GetOutputPort())
+# Set up the associated mapper and actor.
+foheMapper = vtk.vtkPolyDataMapper()
+foheMapper.SetInputConnection(normals.GetOutputPort())
+foheActor = vtk.vtkLODActor()
+foheActor.SetMapper(foheMapper)
+
+# Create a vtkOutlineFilter to draw the bounding box of the data set.
+# Also create the associated mapper and actor.
+outline = vtk.vtkOutlineFilter()
+outline.SetInputConnection(normals.GetOutputPort())
+mapOutline = vtk.vtkPolyDataMapper()
+mapOutline.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(mapOutline)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Create a vtkCamera, and set the camera parameters.
+camera = vtk.vtkCamera()
+camera.SetClippingRange(1.60187, 20.0842)
+camera.SetFocalPoint(0.21406, 1.5, 0)
+camera.SetPosition(8.3761, 4.94858, 4.12505)
+camera.SetViewUp(0.180325, 0.549245, -0.815974)
+
+# Create a vtkLight, and set the light parameters.
+light = vtk.vtkLight()
+light.SetFocalPoint(0.21406, 1.5, 0)
+light.SetPosition(8.3761, 4.94858, 4.12505)
+
+# Create the Renderers.  Assign them the appropriate viewport
+# coordinates, active camera, and light.
+ren = vtk.vtkRenderer()
+ren.SetViewport(0, 0, 0.5, 1.0)
+ren.SetActiveCamera(camera)
+ren.AddLight(light)
+ren2 = vtk.vtkRenderer()
+ren2.SetViewport(0.5, 0, 1.0, 1.0)
+ren2.SetActiveCamera(camera)
+ren2.AddLight(light)
+
+# Create the RenderWindow and RenderWindowInteractor.
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+renWin.AddRenderer(ren2)
+renWin.SetWindowName("VTK - Cube Axes")
+renWin.SetSize(600, 300)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, and set the background.
+ren.AddViewProp(foheActor)
+ren.AddViewProp(outlineActor)
+ren2.AddViewProp(foheActor)
+ren2.AddViewProp(outlineActor)
+
+ren.SetBackground(0.1, 0.2, 0.4)
+ren2.SetBackground(0.1, 0.2, 0.4)
+
+# Create a text property for both cube axes
+tprop = vtk.vtkTextProperty()
+tprop.SetColor(1, 1, 1)
+tprop.ShadowOn()
+
+# Create a vtkCubeAxesActor2D.  Use the outer edges of the bounding box to
+# draw the axes.  Add the actor to the renderer.
+axes = vtk.vtkCubeAxesActor2D()
+axes.SetInput(normals.GetOutput())
+axes.SetCamera(ren.GetActiveCamera())
+axes.SetLabelFormat("%6.4g")
+axes.SetFlyModeToOuterEdges()
+axes.SetFontFactor(0.8)
+axes.SetAxisTitleTextProperty(tprop)
+axes.SetAxisLabelTextProperty(tprop)
+ren.AddViewProp(axes)
+
+# Create a vtkCubeAxesActor2D.  Use the closest vertex to the camera to
+# determine where to draw the axes.  Add the actor to the renderer.
+axes2 = vtk.vtkCubeAxesActor2D()
+axes2.SetViewProp(foheActor)
+axes2.SetCamera(ren2.GetActiveCamera())
+axes2.SetLabelFormat("%6.4g")
+axes2.SetFlyModeToClosestTriad()
+axes2.SetFontFactor(0.8)
+axes2.ScalingOff()
+axes2.SetAxisTitleTextProperty(tprop)
+axes2.SetAxisLabelTextProperty(tprop)
+ren2.AddViewProp(axes2)
+
+# Set up a check for aborting rendering.
+def CheckAbort(obj, event):
+    # obj will be the object generating the event.  In this case it
+    # is renWin.    
+    if obj.GetEventPending() != 0:
+        obj.SetAbortRender(1)
+ 
+renWin.AddObserver("AbortCheckEvent", CheckAbort)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Annotation/cubeAxes.vt b/examples/vtk_examples/Annotation/cubeAxes.vt
new file mode 100644
index 0000000..3ceb805
Binary files /dev/null and b/examples/vtk_examples/Annotation/cubeAxes.vt differ
diff --git a/examples/vtk_examples/Annotation/textOrigin.py b/examples/vtk_examples/Annotation/textOrigin.py
new file mode 100644
index 0000000..54355dd
--- /dev/null
+++ b/examples/vtk_examples/Annotation/textOrigin.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of vtkVectorText and vtkFollower.
+# vtkVectorText is used to create 3D annotation.  vtkFollower is used to
+# position the 3D text and to ensure that the text always faces the
+# renderer's active camera (i.e., the text is always readable).
+
+import vtk
+
+# Create the axes and the associated mapper and actor.
+axes = vtk.vtkAxes()
+axes.SetOrigin(0, 0, 0)
+axesMapper = vtk.vtkPolyDataMapper()
+axesMapper.SetInputConnection(axes.GetOutputPort())
+axesActor = vtk.vtkActor()
+axesActor.SetMapper(axesMapper)
+
+# Create the 3D text and the associated mapper and follower (a type of
+# actor).  Position the text so it is displayed over the origin of the
+# axes.
+atext = vtk.vtkVectorText()
+atext.SetText("Origin")
+textMapper = vtk.vtkPolyDataMapper()
+textMapper.SetInputConnection(atext.GetOutputPort())
+textActor = vtk.vtkFollower()
+textActor.SetMapper(textMapper)
+textActor.SetScale(0.2, 0.2, 0.2)
+textActor.AddPosition(0, -0.1, 0)
+
+# Create the Renderer, RenderWindow, and RenderWindowInteractor.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer.
+ren.AddActor(axesActor)
+ren.AddActor(textActor)
+
+# Zoom in closer.
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.6)
+
+# Reset the clipping range of the camera; set the camera of the
+# follower; render.
+ren.ResetCameraClippingRange()
+textActor.SetCamera(ren.GetActiveCamera())
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Annotation/textOrigin.vt b/examples/vtk_examples/Annotation/textOrigin.vt
new file mode 100644
index 0000000..03e6e83
Binary files /dev/null and b/examples/vtk_examples/Annotation/textOrigin.vt differ
diff --git a/examples/vtk_examples/Annotation/xyPlot.py b/examples/vtk_examples/Annotation/xyPlot.py
new file mode 100644
index 0000000..938dccc
--- /dev/null
+++ b/examples/vtk_examples/Annotation/xyPlot.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of vtkXYPlotActor to display three
+# probe lines using three different techniques.  In this example, we
+# are loading data using the vtkPLOT3DReader.  We are using the
+# vtkProbeFilter to extract the underlying point data along three
+# probe lines.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create a PLOT3D reader and load the data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# Create three the line source to use for the probe lines.
+line = vtk.vtkLineSource()
+line.SetResolution(30)
+
+# Move the line into place and create the probe filter.  For
+# vtkProbeFilter, the probe line is the input, and the underlying data
+# set is the source.
+transL1 = vtk.vtkTransform()
+transL1.Translate(3.7, 0.0, 28.37)
+transL1.Scale(5, 5, 5)
+transL1.RotateY(90)
+tf = vtk.vtkTransformPolyDataFilter()
+tf.SetInputConnection(line.GetOutputPort())
+tf.SetTransform(transL1)
+probe = vtk.vtkProbeFilter()
+probe.SetInputConnection(tf.GetOutputPort())
+probe.SetSource(pl3d.GetOutput())
+
+# Move the line again and create another probe filter.
+transL2 = vtk.vtkTransform()
+transL2.Translate(9.2, 0.0, 31.20)
+transL2.Scale(5, 5, 5)
+transL2.RotateY(90)
+tf2 = vtk.vtkTransformPolyDataFilter()
+tf2.SetInputConnection(line.GetOutputPort())
+tf2.SetTransform(transL2)
+probe2 = vtk.vtkProbeFilter()
+probe2.SetInputConnection(tf2.GetOutputPort())
+probe2.SetSource(pl3d.GetOutput())
+
+# Move the line again and create a third probe filter.
+transL3 = vtk.vtkTransform()
+transL3.Translate(13.27, 0.0, 33.40)
+transL3.Scale(4.5, 4.5, 4.5)
+transL3.RotateY(90)
+tf3 = vtk.vtkTransformPolyDataFilter()
+tf3.SetInputConnection(line.GetOutputPort())
+tf3.SetTransform(transL3)
+probe3 = vtk.vtkProbeFilter()
+probe3.SetInputConnection(tf3.GetOutputPort())
+probe3.SetSource(pl3d.GetOutput())
+
+# Create a vtkAppendPolyData to merge the output of the three probe
+# filters into one data set.
+appendF = vtk.vtkAppendPolyData()
+appendF.AddInput(probe.GetPolyDataOutput())
+appendF.AddInput(probe2.GetPolyDataOutput())
+appendF.AddInput(probe3.GetPolyDataOutput())
+
+# Create a tube filter to represent the lines as tubes.  Set up the
+# associated mapper and actor.
+tuber = vtk.vtkTubeFilter()
+tuber.SetInputConnection(appendF.GetOutputPort())
+tuber.SetRadius(0.1)
+lineMapper = vtk.vtkPolyDataMapper()
+lineMapper.SetInputConnection(tuber.GetOutputPort())
+lineActor = vtk.vtkActor()
+lineActor.SetMapper(lineMapper)
+
+# Create an xy-plot using the output of the 3 probe filters as input.
+# The x-values we are plotting are arc length.
+xyplot = vtk.vtkXYPlotActor()
+xyplot.AddInput(probe.GetOutput())
+xyplot.AddInput(probe2.GetOutput())
+xyplot.AddInput(probe3.GetOutput())
+xyplot.GetPositionCoordinate().SetValue(0.0, 0.67, 0)
+xyplot.GetPosition2Coordinate().SetValue(1.0, 0.33, 0) #relative to Position
+xyplot.SetXValuesToArcLength()
+xyplot.SetNumberOfXLabels(6)
+xyplot.SetTitle("Pressure vs. Arc Length (Zoomed View)")
+xyplot.SetXTitle("")
+xyplot.SetYTitle("P")
+xyplot.SetXRange(.1, .35)
+xyplot.SetYRange(.2, .4)
+xyplot.GetProperty().SetColor(0, 0, 0)
+xyplot.GetProperty().SetLineWidth(2)
+# Set text prop color (same color for backward compat with test)
+# Assign same object to all text props
+tprop = xyplot.GetTitleTextProperty()
+tprop.SetColor(xyplot.GetProperty().GetColor())
+xyplot.SetAxisTitleTextProperty(tprop)
+xyplot.SetAxisLabelTextProperty(tprop)
+
+# Create an xy-plot using the output of the 3 probe filters as input.
+# The x-values we are plotting are normalized arc length.
+xyplot2 = vtk.vtkXYPlotActor()
+xyplot2.AddInput(probe.GetOutput())
+xyplot2.AddInput(probe2.GetOutput())
+xyplot2.AddInput(probe3.GetOutput())
+xyplot2.GetPositionCoordinate().SetValue(0.00, 0.33, 0)
+xyplot2.GetPosition2Coordinate().SetValue(1.0, 0.33, 0) #relative to Position
+xyplot2.SetXValuesToNormalizedArcLength()
+xyplot2.SetNumberOfXLabels(6)
+xyplot2.SetTitle("Pressure vs. Normalized Arc Length")
+xyplot2.SetXTitle("")
+xyplot2.SetYTitle("P")
+xyplot2.PlotPointsOn()
+xyplot2.PlotLinesOff()
+xyplot2.GetProperty().SetColor(1, 0, 0)
+xyplot2.GetProperty().SetPointSize(2)
+# Set text prop color (same color for backward compat with test)
+# Assign same object to all text props
+tprop = xyplot2.GetTitleTextProperty()
+tprop.SetColor(xyplot2.GetProperty().GetColor())
+xyplot2.SetAxisTitleTextProperty(tprop)
+xyplot2.SetAxisLabelTextProperty(tprop)
+
+# Create an xy-plot using the output of the 3 probe filters as input.
+# The x-values we are plotting are the underlying point data values.
+xyplot3 = vtk.vtkXYPlotActor()
+xyplot3.AddInput(probe.GetOutput())
+xyplot3.AddInput(probe2.GetOutput())
+xyplot3.AddInput(probe3.GetOutput())
+xyplot3.GetPositionCoordinate().SetValue(0.0, 0.0, 0)
+xyplot3.GetPosition2Coordinate().SetValue(1.0, 0.33, 0) #relative to Position
+xyplot3.SetXValuesToIndex()
+xyplot3.SetNumberOfXLabels(6)
+xyplot3.SetTitle("Pressure vs. Point Id")
+xyplot3.SetXTitle("Probe Length")
+xyplot3.SetYTitle("P")
+xyplot3.PlotPointsOn()
+xyplot3.GetProperty().SetColor(0, 0, 1)
+xyplot3.GetProperty().SetPointSize(3)
+# Set text prop color (same color for backward compat with test)
+# Assign same object to all text props
+tprop = xyplot3.GetTitleTextProperty()
+tprop.SetColor(xyplot3.GetProperty().GetColor())
+xyplot3.SetAxisTitleTextProperty(tprop)
+xyplot3.SetAxisLabelTextProperty(tprop)
+
+# Draw an outline of the PLOT3D data set.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Create the Renderers, RenderWindow, and RenderWindowInteractor.
+ren = vtk.vtkRenderer()
+ren2 = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+renWin.AddRenderer(ren2)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Set the background, viewport (necessary because we want to have the
+# renderers draw to different parts of the render window) of the first
+# renderer.  Add the outline and line actors to the renderer.
+ren.SetBackground(0.6784, 0.8471, 0.9020)
+ren.SetViewport(0, 0, .5, 1)
+ren.AddActor(outlineActor)
+ren.AddActor(lineActor)
+
+# Set the background and viewport of the second renderer.  Add the
+# xy-plot actors to the renderer.  Set the size of the render window.
+ren2.SetBackground(1, 1, 1)
+ren2.SetViewport(0.5, 0.0, 1.0, 1.0)
+ren2.AddActor2D(xyplot)
+ren2.AddActor2D(xyplot2)
+ren2.AddActor2D(xyplot3)
+renWin.SetSize(500, 250)
+
+# Set up the camera parameters.
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 100)
+cam1.SetFocalPoint(8.88908, 0.595038, 29.3342)
+cam1.SetPosition(-12.3332, 31.7479, 41.2387)
+cam1.SetViewUp(0.060772, -0.319905, 0.945498)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Annotation/xyPlot.vt b/examples/vtk_examples/Annotation/xyPlot.vt
new file mode 100644
index 0000000..c638807
Binary files /dev/null and b/examples/vtk_examples/Annotation/xyPlot.vt differ
diff --git a/examples/vtk_examples/DataManipulation/Arrays.py b/examples/vtk_examples/DataManipulation/Arrays.py
new file mode 100644
index 0000000..68cde31
--- /dev/null
+++ b/examples/vtk_examples/DataManipulation/Arrays.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of VTK data arrays as attribute
+# data as well as field data. It creates geometry (vtkPolyData) as
+# well as attribute data explicitly.
+
+import vtk
+
+# Create a float array which represents the points.
+pcoords = vtk.vtkFloatArray()
+# Note that by default, an array has 1 component.
+# We have to change it to 3 for points
+pcoords.SetNumberOfComponents(3)
+# We ask pcoords to allocate room for at least 4 tuples
+# and set the number of tuples to 4.
+pcoords.SetNumberOfTuples(4)
+# Assign each tuple. There are 5 specialized versions of SetTuple:
+# SetTuple1 SetTuple2 SetTuple3 SetTuple4 SetTuple9
+# These take 1, 2, 3, 4 and 9 components respectively.
+pcoords.SetTuple3(0, 0.0, 0.0, 0.0)
+pcoords.SetTuple3(1, 0.0, 1.0, 0.0)
+pcoords.SetTuple3(2, 1.0, 0.0, 0.0)
+pcoords.SetTuple3(3, 1.0, 1.0, 0.0)
+
+# Create vtkPoints and assign pcoords as the internal data array.
+points = vtk.vtkPoints()
+points.SetData(pcoords)
+
+# Create the cells. In this case, a triangle strip with 2 triangles
+# (which can be represented by 4 points)
+strips = vtk.vtkCellArray()
+strips.InsertNextCell(4)
+strips.InsertCellPoint(0)
+strips.InsertCellPoint(1)
+strips.InsertCellPoint(2)
+strips.InsertCellPoint(3)
+
+# Create an integer array with 4 tuples. Note that when using
+# InsertNextValue (or InsertNextTuple1 which is equivalent in
+# this situation), the array will expand automatically
+temperature = vtk.vtkIntArray()
+temperature.SetName("Temperature")
+temperature.InsertNextValue(10)
+temperature.InsertNextValue(20)
+temperature.InsertNextValue(30)
+temperature.InsertNextValue(40)
+
+# Create a double array.
+vorticity = vtk.vtkDoubleArray()
+vorticity.SetName("Vorticity")
+vorticity.InsertNextValue(2.7)
+vorticity.InsertNextValue(4.1)
+vorticity.InsertNextValue(5.3)
+vorticity.InsertNextValue(3.4)
+
+# Create the dataset. In this case, we create a vtkPolyData
+polydata = vtk.vtkPolyData()
+# Assign points and cells
+polydata.SetPoints(points)
+polydata.SetStrips(strips)
+# Assign scalars
+polydata.GetPointData().SetScalars(temperature)
+# Add the vorticity array. In this example, this field
+# is not used.
+polydata.GetPointData().AddArray(vorticity)
+
+# Create the mapper and set the appropriate scalar range
+# (default is (0,1)
+mapper = vtk.vtkPolyDataMapper()
+mapper.SetInput(polydata)
+mapper.SetScalarRange(0, 40)
+
+# Create an actor.
+actor = vtk.vtkActor()
+actor.SetMapper(mapper)
+
+# Create the rendering objects.
+ren = vtk.vtkRenderer()
+ren.AddActor(actor)
+
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/DataManipulation/Arrays.vt b/examples/vtk_examples/DataManipulation/Arrays.vt
new file mode 100644
index 0000000..a759936
Binary files /dev/null and b/examples/vtk_examples/DataManipulation/Arrays.vt differ
diff --git a/examples/vtk_examples/DataManipulation/BuildUGrid.py b/examples/vtk_examples/DataManipulation/BuildUGrid.py
new file mode 100644
index 0000000..f7584e1
--- /dev/null
+++ b/examples/vtk_examples/DataManipulation/BuildUGrid.py
@@ -0,0 +1,386 @@
+#!/usr/bin/env python
+
+# This example shows how to manually construct unstructured grids
+# using Python.  Unstructured grids require explicit point and cell
+# representations, so every point and cell must be created, and then
+# added to the vtkUnstructuredGrid instance.
+
+import vtk
+
+# Create several unstructured grids each containing a cell of a
+# different type.
+voxelPoints = vtk.vtkPoints()
+voxelPoints.SetNumberOfPoints(8)
+voxelPoints.InsertPoint(0, 0, 0, 0)
+voxelPoints.InsertPoint(1, 1, 0, 0)
+voxelPoints.InsertPoint(2, 0, 1, 0)
+voxelPoints.InsertPoint(3, 1, 1, 0)
+voxelPoints.InsertPoint(4, 0, 0, 1)
+voxelPoints.InsertPoint(5, 1, 0, 1)
+voxelPoints.InsertPoint(6, 0, 1, 1)
+voxelPoints.InsertPoint(7, 1, 1, 1)
+aVoxel = vtk.vtkVoxel()
+aVoxel.GetPointIds().SetId(0, 0)
+aVoxel.GetPointIds().SetId(1, 1)
+aVoxel.GetPointIds().SetId(2, 2)
+aVoxel.GetPointIds().SetId(3, 3)
+aVoxel.GetPointIds().SetId(4, 4)
+aVoxel.GetPointIds().SetId(5, 5)
+aVoxel.GetPointIds().SetId(6, 6)
+aVoxel.GetPointIds().SetId(7, 7)
+aVoxelGrid = vtk.vtkUnstructuredGrid()
+aVoxelGrid.Allocate(1, 1)
+aVoxelGrid.InsertNextCell(aVoxel.GetCellType(), aVoxel.GetPointIds())
+aVoxelGrid.SetPoints(voxelPoints)
+aVoxelMapper = vtk.vtkDataSetMapper()
+aVoxelMapper.SetInput(aVoxelGrid)
+aVoxelActor = vtk.vtkActor()
+aVoxelActor.SetMapper(aVoxelMapper)
+aVoxelActor.GetProperty().SetDiffuseColor(1, 0, 0)
+
+hexahedronPoints = vtk.vtkPoints()
+hexahedronPoints.SetNumberOfPoints(8)
+hexahedronPoints.InsertPoint(0, 0, 0, 0)
+hexahedronPoints.InsertPoint(1, 1, 0, 0)
+hexahedronPoints.InsertPoint(2, 1, 1, 0)
+hexahedronPoints.InsertPoint(3, 0, 1, 0)
+hexahedronPoints.InsertPoint(4, 0, 0, 1)
+hexahedronPoints.InsertPoint(5, 1, 0, 1)
+hexahedronPoints.InsertPoint(6, 1, 1, 1)
+hexahedronPoints.InsertPoint(7, 0, 1, 1)
+aHexahedron = vtk.vtkHexahedron()
+aHexahedron.GetPointIds().SetId(0, 0)
+aHexahedron.GetPointIds().SetId(1, 1)
+aHexahedron.GetPointIds().SetId(2, 2)
+aHexahedron.GetPointIds().SetId(3, 3)
+aHexahedron.GetPointIds().SetId(4, 4)
+aHexahedron.GetPointIds().SetId(5, 5)
+aHexahedron.GetPointIds().SetId(6, 6)
+aHexahedron.GetPointIds().SetId(7, 7)
+aHexahedronGrid = vtk.vtkUnstructuredGrid()
+aHexahedronGrid.Allocate(1, 1)
+aHexahedronGrid.InsertNextCell(aHexahedron.GetCellType(),
+                               aHexahedron.GetPointIds())
+aHexahedronGrid.SetPoints(hexahedronPoints)
+aHexahedronMapper = vtk.vtkDataSetMapper()
+aHexahedronMapper.SetInput(aHexahedronGrid)
+aHexahedronActor = vtk.vtkActor()
+aHexahedronActor.SetMapper(aHexahedronMapper)
+aHexahedronActor.AddPosition(2, 0, 0)
+aHexahedronActor.GetProperty().SetDiffuseColor(1, 1, 0)
+
+tetraPoints = vtk.vtkPoints()
+tetraPoints.SetNumberOfPoints(4)
+tetraPoints.InsertPoint(0, 0, 0, 0)
+tetraPoints.InsertPoint(1, 1, 0, 0)
+tetraPoints.InsertPoint(2, .5, 1, 0)
+tetraPoints.InsertPoint(3, .5, .5, 1)
+aTetra = vtk.vtkTetra()
+aTetra.GetPointIds().SetId(0, 0)
+aTetra.GetPointIds().SetId(1, 1)
+aTetra.GetPointIds().SetId(2, 2)
+aTetra.GetPointIds().SetId(3, 3)
+aTetraGrid = vtk.vtkUnstructuredGrid()
+aTetraGrid.Allocate(1, 1)
+aTetraGrid.InsertNextCell(aTetra.GetCellType(), aTetra.GetPointIds())
+aTetraGrid.SetPoints(tetraPoints)
+aTetraMapper = vtk.vtkDataSetMapper()
+aTetraMapper.SetInput(aTetraGrid)
+aTetraActor = vtk.vtkActor()
+aTetraActor.SetMapper(aTetraMapper)
+aTetraActor.AddPosition(4, 0, 0)
+aTetraActor.GetProperty().SetDiffuseColor(0, 1, 0)
+
+wedgePoints = vtk.vtkPoints()
+wedgePoints.SetNumberOfPoints(6)
+wedgePoints.InsertPoint(0, 0, 1, 0)
+wedgePoints.InsertPoint(1, 0, 0, 0)
+wedgePoints.InsertPoint(2, 0, .5, .5)
+wedgePoints.InsertPoint(3, 1, 1, 0)
+wedgePoints.InsertPoint(4, 1, 0, 0)
+wedgePoints.InsertPoint(5, 1, .5, .5)
+aWedge = vtk.vtkWedge()
+aWedge.GetPointIds().SetId(0, 0)
+aWedge.GetPointIds().SetId(1, 1)
+aWedge.GetPointIds().SetId(2, 2)
+aWedge.GetPointIds().SetId(3, 3)
+aWedge.GetPointIds().SetId(4, 4)
+aWedge.GetPointIds().SetId(5, 5)
+aWedgeGrid = vtk.vtkUnstructuredGrid()
+aWedgeGrid.Allocate(1, 1)
+aWedgeGrid.InsertNextCell(aWedge.GetCellType(), aWedge.GetPointIds())
+aWedgeGrid.SetPoints(wedgePoints)
+aWedgeMapper = vtk.vtkDataSetMapper()
+aWedgeMapper.SetInput(aWedgeGrid)
+aWedgeActor = vtk.vtkActor()
+aWedgeActor.SetMapper(aWedgeMapper)
+aWedgeActor.AddPosition(6, 0, 0)
+aWedgeActor.GetProperty().SetDiffuseColor(0, 1, 1)
+
+pyramidPoints = vtk.vtkPoints()
+pyramidPoints.SetNumberOfPoints(5)
+pyramidPoints.InsertPoint(0, 0, 0, 0)
+pyramidPoints.InsertPoint(1, 1, 0, 0)
+pyramidPoints.InsertPoint(2, 1, 1, 0)
+pyramidPoints.InsertPoint(3, 0, 1, 0)
+pyramidPoints.InsertPoint(4, .5, .5, 1)
+aPyramid = vtk.vtkPyramid()
+aPyramid.GetPointIds().SetId(0, 0)
+aPyramid.GetPointIds().SetId(1, 1)
+aPyramid.GetPointIds().SetId(2, 2)
+aPyramid.GetPointIds().SetId(3, 3)
+aPyramid.GetPointIds().SetId(4, 4)
+aPyramidGrid = vtk.vtkUnstructuredGrid()
+aPyramidGrid.Allocate(1, 1)
+aPyramidGrid.InsertNextCell(aPyramid.GetCellType(), aPyramid.GetPointIds())
+aPyramidGrid.SetPoints(pyramidPoints)
+aPyramidMapper = vtk.vtkDataSetMapper()
+aPyramidMapper.SetInput(aPyramidGrid)
+aPyramidActor = vtk.vtkActor()
+aPyramidActor.SetMapper(aPyramidMapper)
+aPyramidActor.AddPosition(8, 0, 0)
+aPyramidActor.GetProperty().SetDiffuseColor(1, 0, 1)
+
+pixelPoints = vtk.vtkPoints()
+pixelPoints.SetNumberOfPoints(4)
+pixelPoints.InsertPoint(0, 0, 0, 0)
+pixelPoints.InsertPoint(1, 1, 0, 0)
+pixelPoints.InsertPoint(2, 0, 1, 0)
+pixelPoints.InsertPoint(3, 1, 1, 0)
+aPixel = vtk.vtkPixel()
+aPixel.GetPointIds().SetId(0, 0)
+aPixel.GetPointIds().SetId(1, 1)
+aPixel.GetPointIds().SetId(2, 2)
+aPixel.GetPointIds().SetId(3, 3)
+aPixelGrid = vtk.vtkUnstructuredGrid()
+aPixelGrid.Allocate(1, 1)
+aPixelGrid.InsertNextCell(aPixel.GetCellType(), aPixel.GetPointIds())
+aPixelGrid.SetPoints(pixelPoints)
+aPixelMapper = vtk.vtkDataSetMapper()
+aPixelMapper.SetInput(aPixelGrid)
+aPixelActor = vtk.vtkActor()
+aPixelActor.SetMapper(aPixelMapper)
+aPixelActor.AddPosition(0, 0, 2)
+aPixelActor.GetProperty().SetDiffuseColor(0, 1, 1)
+
+quadPoints = vtk.vtkPoints()
+quadPoints.SetNumberOfPoints(4)
+quadPoints.InsertPoint(0, 0, 0, 0)
+quadPoints.InsertPoint(1, 1, 0, 0)
+quadPoints.InsertPoint(2, 1, 1, 0)
+quadPoints.InsertPoint(3, 0, 1, 0)
+aQuad = vtk.vtkQuad()
+aQuad.GetPointIds().SetId(0, 0)
+aQuad.GetPointIds().SetId(1, 1)
+aQuad.GetPointIds().SetId(2, 2)
+aQuad.GetPointIds().SetId(3, 3)
+aQuadGrid = vtk.vtkUnstructuredGrid()
+aQuadGrid.Allocate(1, 1)
+aQuadGrid.InsertNextCell(aQuad.GetCellType(), aQuad.GetPointIds())
+aQuadGrid.SetPoints(quadPoints)
+aQuadMapper = vtk.vtkDataSetMapper()
+aQuadMapper.SetInput(aQuadGrid)
+aQuadActor = vtk.vtkActor()
+aQuadActor.SetMapper(aQuadMapper)
+aQuadActor.AddPosition(2, 0, 2)
+aQuadActor.GetProperty().SetDiffuseColor(1, 0, 1)
+
+trianglePoints = vtk.vtkPoints()
+trianglePoints.SetNumberOfPoints(3)
+trianglePoints.InsertPoint(0, 0, 0, 0)
+trianglePoints.InsertPoint(1, 1, 0, 0)
+trianglePoints.InsertPoint(2, .5, .5, 0)
+triangleTCoords = vtk.vtkFloatArray()
+triangleTCoords.SetNumberOfComponents(3)
+triangleTCoords.SetNumberOfTuples(3)
+triangleTCoords.InsertTuple3(0, 1, 1, 1)
+triangleTCoords.InsertTuple3(1, 2, 2, 2)
+triangleTCoords.InsertTuple3(2, 3, 3, 3)
+aTriangle = vtk.vtkTriangle()
+aTriangle.GetPointIds().SetId(0, 0)
+aTriangle.GetPointIds().SetId(1, 1)
+aTriangle.GetPointIds().SetId(2, 2)
+aTriangleGrid = vtk.vtkUnstructuredGrid()
+aTriangleGrid.Allocate(1, 1)
+aTriangleGrid.InsertNextCell(aTriangle.GetCellType(),
+                             aTriangle.GetPointIds())
+aTriangleGrid.SetPoints(trianglePoints)
+aTriangleGrid.GetPointData().SetTCoords(triangleTCoords)
+aTriangleMapper = vtk.vtkDataSetMapper()
+aTriangleMapper.SetInput(aTriangleGrid)
+aTriangleActor = vtk.vtkActor()
+aTriangleActor.SetMapper(aTriangleMapper)
+aTriangleActor.AddPosition(4, 0, 2)
+aTriangleActor.GetProperty().SetDiffuseColor(.3, 1, .5)
+
+polygonPoints = vtk.vtkPoints()
+polygonPoints.SetNumberOfPoints(4)
+polygonPoints.InsertPoint(0, 0, 0, 0)
+polygonPoints.InsertPoint(1, 1, 0, 0)
+polygonPoints.InsertPoint(2, 1, 1, 0)
+polygonPoints.InsertPoint(3, 0, 1, 0)
+aPolygon = vtk.vtkPolygon()
+aPolygon.GetPointIds().SetNumberOfIds(4)
+aPolygon.GetPointIds().SetId(0, 0)
+aPolygon.GetPointIds().SetId(1, 1)
+aPolygon.GetPointIds().SetId(2, 2)
+aPolygon.GetPointIds().SetId(3, 3)
+aPolygonGrid = vtk.vtkUnstructuredGrid()
+aPolygonGrid.Allocate(1, 1)
+aPolygonGrid.InsertNextCell(aPolygon.GetCellType(), aPolygon.GetPointIds())
+aPolygonGrid.SetPoints(polygonPoints)
+aPolygonMapper = vtk.vtkDataSetMapper()
+aPolygonMapper.SetInput(aPolygonGrid)
+aPolygonActor = vtk.vtkActor()
+aPolygonActor.SetMapper(aPolygonMapper)
+aPolygonActor.AddPosition(6, 0, 2)
+aPolygonActor.GetProperty().SetDiffuseColor(1, .4, .5)
+
+triangleStripPoints = vtk.vtkPoints()
+triangleStripPoints.SetNumberOfPoints(5)
+triangleStripPoints.InsertPoint(0, 0, 1, 0)
+triangleStripPoints.InsertPoint(1, 0, 0, 0)
+triangleStripPoints.InsertPoint(2, 1, 1, 0)
+triangleStripPoints.InsertPoint(3, 1, 0, 0)
+triangleStripPoints.InsertPoint(4, 2, 1, 0)
+triangleStripTCoords = vtk.vtkFloatArray()
+triangleStripTCoords.SetNumberOfComponents(3)
+triangleStripTCoords.SetNumberOfTuples(3)
+triangleStripTCoords.InsertTuple3(0, 1, 1, 1)
+triangleStripTCoords.InsertTuple3(1, 2, 2, 2)
+triangleStripTCoords.InsertTuple3(2, 3, 3, 3)
+triangleStripTCoords.InsertTuple3(3, 4, 4, 4)
+triangleStripTCoords.InsertTuple3(4, 5, 5, 5)
+aTriangleStrip = vtk.vtkTriangleStrip()
+aTriangleStrip.GetPointIds().SetNumberOfIds(5)
+aTriangleStrip.GetPointIds().SetId(0, 0)
+aTriangleStrip.GetPointIds().SetId(1, 1)
+aTriangleStrip.GetPointIds().SetId(2, 2)
+aTriangleStrip.GetPointIds().SetId(3, 3)
+aTriangleStrip.GetPointIds().SetId(4, 4)
+aTriangleStripGrid = vtk.vtkUnstructuredGrid()
+aTriangleStripGrid.Allocate(1, 1)
+aTriangleStripGrid.InsertNextCell(aTriangleStrip.GetCellType(),
+                                  aTriangleStrip.GetPointIds())
+aTriangleStripGrid.SetPoints(triangleStripPoints)
+aTriangleStripGrid.GetPointData().SetTCoords(triangleStripTCoords)
+aTriangleStripMapper = vtk.vtkDataSetMapper()
+aTriangleStripMapper.SetInput(aTriangleStripGrid)
+aTriangleStripActor = vtk.vtkActor()
+aTriangleStripActor.SetMapper(aTriangleStripMapper)
+aTriangleStripActor.AddPosition(8, 0, 2)
+aTriangleStripActor.GetProperty().SetDiffuseColor(.3, .7, 1)
+
+linePoints = vtk.vtkPoints()
+linePoints.SetNumberOfPoints(2)
+linePoints.InsertPoint(0, 0, 0, 0)
+linePoints.InsertPoint(1, 1, 1, 0)
+aLine = vtk.vtkLine()
+aLine.GetPointIds().SetId(0, 0)
+aLine.GetPointIds().SetId(1, 1)
+aLineGrid = vtk.vtkUnstructuredGrid()
+aLineGrid.Allocate(1, 1)
+aLineGrid.InsertNextCell(aLine.GetCellType(), aLine.GetPointIds())
+aLineGrid.SetPoints(linePoints)
+aLineMapper = vtk.vtkDataSetMapper()
+aLineMapper.SetInput(aLineGrid)
+aLineActor = vtk.vtkActor()
+aLineActor.SetMapper(aLineMapper)
+aLineActor.AddPosition(0, 0, 4)
+aLineActor.GetProperty().SetDiffuseColor(.2, 1, 1)
+
+polyLinePoints = vtk.vtkPoints()
+polyLinePoints.SetNumberOfPoints(3)
+polyLinePoints.InsertPoint(0, 0, 0, 0)
+polyLinePoints.InsertPoint(1, 1, 1, 0)
+polyLinePoints.InsertPoint(2, 1, 0, 0)
+aPolyLine = vtk.vtkPolyLine()
+aPolyLine.GetPointIds().SetNumberOfIds(3)
+aPolyLine.GetPointIds().SetId(0, 0)
+aPolyLine.GetPointIds().SetId(1, 1)
+aPolyLine.GetPointIds().SetId(2, 2)
+aPolyLineGrid = vtk.vtkUnstructuredGrid()
+aPolyLineGrid.Allocate(1, 1)
+aPolyLineGrid.InsertNextCell(aPolyLine.GetCellType(),
+                             aPolyLine.GetPointIds())
+aPolyLineGrid.SetPoints(polyLinePoints)
+aPolyLineMapper = vtk.vtkDataSetMapper()
+aPolyLineMapper.SetInput(aPolyLineGrid)
+aPolyLineActor = vtk.vtkActor()
+aPolyLineActor.SetMapper(aPolyLineMapper)
+aPolyLineActor.AddPosition(2, 0, 4)
+aPolyLineActor.GetProperty().SetDiffuseColor(1, 1, 1)
+
+vertexPoints = vtk.vtkPoints()
+vertexPoints.SetNumberOfPoints(1)
+vertexPoints.InsertPoint(0, 0, 0, 0)
+aVertex = vtk.vtkVertex()
+aVertex.GetPointIds().SetId(0, 0)
+aVertexGrid = vtk.vtkUnstructuredGrid()
+aVertexGrid.Allocate(1, 1)
+aVertexGrid.InsertNextCell(aVertex.GetCellType(), aVertex.GetPointIds())
+aVertexGrid.SetPoints(vertexPoints)
+aVertexMapper = vtk.vtkDataSetMapper()
+aVertexMapper.SetInput(aVertexGrid)
+aVertexActor = vtk.vtkActor()
+aVertexActor.SetMapper(aVertexMapper)
+aVertexActor.AddPosition(0, 0, 6)
+aVertexActor.GetProperty().SetDiffuseColor(1, 1, 1)
+
+polyVertexPoints = vtk.vtkPoints()
+polyVertexPoints.SetNumberOfPoints(3)
+polyVertexPoints.InsertPoint(0, 0, 0, 0)
+polyVertexPoints.InsertPoint(1, 1, 0, 0)
+polyVertexPoints.InsertPoint(2, 1, 1, 0)
+aPolyVertex = vtk.vtkPolyVertex()
+aPolyVertex.GetPointIds().SetNumberOfIds(3)
+aPolyVertex.GetPointIds().SetId(0, 0)
+aPolyVertex.GetPointIds().SetId(1, 1)
+aPolyVertex.GetPointIds().SetId(2, 2)
+aPolyVertexGrid = vtk.vtkUnstructuredGrid()
+aPolyVertexGrid.Allocate(1, 1)
+aPolyVertexGrid.InsertNextCell(aPolyVertex.GetCellType(),
+                               aPolyVertex.GetPointIds())
+aPolyVertexGrid.SetPoints(polyVertexPoints)
+aPolyVertexMapper = vtk.vtkDataSetMapper()
+aPolyVertexMapper.SetInput(aPolyVertexGrid)
+aPolyVertexActor = vtk.vtkActor()
+aPolyVertexActor.SetMapper(aPolyVertexMapper)
+aPolyVertexActor.AddPosition(2, 0, 6)
+aPolyVertexActor.GetProperty().SetDiffuseColor(1, 1, 1)
+
+# Create the usual rendering stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+renWin.SetSize(300, 150)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.SetBackground(.1, .2, .4)
+
+ren.AddActor(aVoxelActor)
+ren.AddActor(aHexahedronActor)
+ren.AddActor(aTetraActor)
+ren.AddActor(aWedgeActor)
+ren.AddActor(aPyramidActor)
+ren.AddActor(aPixelActor)
+ren.AddActor(aQuadActor)
+ren.AddActor(aTriangleActor)
+ren.AddActor(aPolygonActor)
+ren.AddActor(aTriangleStripActor)
+ren.AddActor(aLineActor)
+ren.AddActor(aPolyLineActor)
+ren.AddActor(aVertexActor)
+ren.AddActor(aPolyVertexActor)
+
+ren.ResetCamera()
+ren.GetActiveCamera().Azimuth(30)
+ren.GetActiveCamera().Elevation(20)
+ren.GetActiveCamera().Dolly(2.8)
+ren.ResetCameraClippingRange()
+
+# Render the scene and start interaction.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/DataManipulation/BuildUGrid.vt b/examples/vtk_examples/DataManipulation/BuildUGrid.vt
new file mode 100644
index 0000000..a082613
Binary files /dev/null and b/examples/vtk_examples/DataManipulation/BuildUGrid.vt differ
diff --git a/examples/vtk_examples/DataManipulation/CreateStrip.py b/examples/vtk_examples/DataManipulation/CreateStrip.py
new file mode 100644
index 0000000..bea887b
--- /dev/null
+++ b/examples/vtk_examples/DataManipulation/CreateStrip.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+
+# This script shows how to manually create a vtkPolyData with a
+# triangle strip.
+
+import vtk
+
+# First we'll create some points.
+points = vtk.vtkPoints()
+points.InsertPoint(0, 0.0, 0.0, 0.0)
+points.InsertPoint(1, 0.0, 1.0, 0.0)
+points.InsertPoint(2, 1.0, 0.0, 0.0)
+points.InsertPoint(3, 1.0, 1.0, 0.0)
+points.InsertPoint(4, 2.0, 0.0, 0.0)
+points.InsertPoint(5, 2.0, 1.0, 0.0)
+points.InsertPoint(6, 3.0, 0.0, 0.0)
+points.InsertPoint(7, 3.0, 1.0, 0.0)
+
+# The cell array can be thought of as a connectivity list.  Here we
+# specify the number of points followed by that number of point
+# ids. This can be repeated as many times as there are primitives in
+# the list.
+strips = vtk.vtkCellArray()
+strips.InsertNextCell(8) # number of points
+strips.InsertCellPoint(0)
+strips.InsertCellPoint(1)
+strips.InsertCellPoint(2)
+strips.InsertCellPoint(3)
+strips.InsertCellPoint(4)
+strips.InsertCellPoint(5)
+strips.InsertCellPoint(6)
+strips.InsertCellPoint(7)
+profile = vtk.vtkPolyData()
+profile.SetPoints(points)
+profile.SetStrips(strips)
+
+map = vtk.vtkPolyDataMapper()
+map.SetInput(profile)
+
+strip = vtk.vtkActor()
+strip.SetMapper(map)
+strip.GetProperty().SetColor(0.3800, 0.7000, 0.1600)
+
+# Create the usual rendering stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(strip)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(250, 250)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/DataManipulation/CreateStrip.vt b/examples/vtk_examples/DataManipulation/CreateStrip.vt
new file mode 100644
index 0000000..8cabed3
Binary files /dev/null and b/examples/vtk_examples/DataManipulation/CreateStrip.vt differ
diff --git a/examples/vtk_examples/DataManipulation/marching.py b/examples/vtk_examples/DataManipulation/marching.py
new file mode 100644
index 0000000..e3c2c64
--- /dev/null
+++ b/examples/vtk_examples/DataManipulation/marching.py
@@ -0,0 +1,215 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of the vtkTransformPolyDataFilter
+# to reposition a 3D text string.
+
+import vtk
+from vtk.util.colors import *
+
+# Define a Single Cube
+Scalars = vtk.vtkFloatArray()
+Scalars.InsertNextValue(1.0)
+Scalars.InsertNextValue(0.0)
+Scalars.InsertNextValue(0.0)
+Scalars.InsertNextValue(1.0)
+Scalars.InsertNextValue(0.0)
+Scalars.InsertNextValue(0.0)
+Scalars.InsertNextValue(0.0)
+Scalars.InsertNextValue(0.0)
+
+Points = vtk.vtkPoints()
+Points.InsertNextPoint(0, 0, 0)
+Points.InsertNextPoint(1, 0, 0)
+Points.InsertNextPoint(1, 1, 0)
+Points.InsertNextPoint(0, 1, 0)
+Points.InsertNextPoint(0, 0, 1)
+Points.InsertNextPoint(1, 0, 1)
+Points.InsertNextPoint(1, 1, 1)
+Points.InsertNextPoint(0, 1, 1)
+
+Ids = vtk.vtkIdList()
+Ids.InsertNextId(0)
+Ids.InsertNextId(1)
+Ids.InsertNextId(2)
+Ids.InsertNextId(3)
+Ids.InsertNextId(4)
+Ids.InsertNextId(5)
+Ids.InsertNextId(6)
+Ids.InsertNextId(7)
+
+Grid = vtk.vtkUnstructuredGrid()
+Grid.Allocate(10, 10)
+Grid.InsertNextCell(12, Ids)
+Grid.SetPoints(Points)
+Grid.GetPointData().SetScalars(Scalars)
+
+# Find the triangles that lie along the 0.5 contour in this cube.
+Marching = vtk.vtkContourFilter()
+Marching.SetInput(Grid)
+Marching.SetValue(0, 0.5)
+Marching.Update()
+
+# Extract the edges of the triangles just found.
+triangleEdges = vtk.vtkExtractEdges()
+triangleEdges.SetInputConnection(Marching.GetOutputPort())
+# Draw the edges as tubes instead of lines.  Also create the associated
+# mapper and actor to display the tubes.
+triangleEdgeTubes = vtk.vtkTubeFilter()
+triangleEdgeTubes.SetInputConnection(triangleEdges.GetOutputPort())
+triangleEdgeTubes.SetRadius(.005)
+triangleEdgeTubes.SetNumberOfSides(6)
+triangleEdgeTubes.UseDefaultNormalOn()
+triangleEdgeTubes.SetDefaultNormal(.577, .577, .577)
+triangleEdgeMapper = vtk.vtkPolyDataMapper()
+triangleEdgeMapper.SetInputConnection(triangleEdgeTubes.GetOutputPort())
+triangleEdgeMapper.ScalarVisibilityOff()
+triangleEdgeActor = vtk.vtkActor()
+triangleEdgeActor.SetMapper(triangleEdgeMapper)
+triangleEdgeActor.GetProperty().SetDiffuseColor(lamp_black)
+triangleEdgeActor.GetProperty().SetSpecular(.4)
+triangleEdgeActor.GetProperty().SetSpecularPower(10)
+
+# Shrink the triangles we found earlier.  Create the associated mapper
+# and actor.  Set the opacity of the shrunken triangles.
+aShrinker = vtk.vtkShrinkPolyData()
+aShrinker.SetShrinkFactor(1)
+aShrinker.SetInputConnection(Marching.GetOutputPort())
+aMapper = vtk.vtkPolyDataMapper()
+aMapper.ScalarVisibilityOff()
+aMapper.SetInputConnection(aShrinker.GetOutputPort())
+Triangles = vtk.vtkActor()
+Triangles.SetMapper(aMapper)
+Triangles.GetProperty().SetDiffuseColor(banana)
+Triangles.GetProperty().SetOpacity(.6)
+
+# Draw a cube the same size and at the same position as the one
+# created previously.  Extract the edges because we only want to see
+# the outline of the cube.  Pass the edges through a vtkTubeFilter so
+# they are displayed as tubes rather than lines.
+CubeModel = vtk.vtkCubeSource()
+CubeModel.SetCenter(.5, .5, .5)
+Edges = vtk.vtkExtractEdges()
+Edges.SetInputConnection(CubeModel.GetOutputPort())
+Tubes = vtk.vtkTubeFilter()
+Tubes.SetInputConnection(Edges.GetOutputPort())
+Tubes.SetRadius(.01)
+Tubes.SetNumberOfSides(6)
+Tubes.UseDefaultNormalOn()
+Tubes.SetDefaultNormal(.577, .577, .577)
+# Create the mapper and actor to display the cube edges.
+TubeMapper = vtk.vtkPolyDataMapper()
+TubeMapper.SetInputConnection(Tubes.GetOutputPort())
+CubeEdges = vtk.vtkActor()
+CubeEdges.SetMapper(TubeMapper)
+CubeEdges.GetProperty().SetDiffuseColor(khaki)
+CubeEdges.GetProperty().SetSpecular(.4)
+CubeEdges.GetProperty().SetSpecularPower(10)
+
+# Create a sphere to use as a glyph source for vtkGlyph3D.
+Sphere = vtk.vtkSphereSource()
+Sphere.SetRadius(0.04)
+Sphere.SetPhiResolution(20)
+Sphere.SetThetaResolution(20)
+# Remove the part of the cube with data values below 0.5.
+ThresholdIn = vtk.vtkThresholdPoints()
+ThresholdIn.SetInput(Grid)
+ThresholdIn.ThresholdByUpper(.5)
+# Display spheres at the vertices remaining in the cube data set after
+# it was passed through vtkThresholdPoints.
+Vertices = vtk.vtkGlyph3D()
+Vertices.SetInputConnection(ThresholdIn.GetOutputPort())
+Vertices.SetSource(Sphere.GetOutput())
+# Create a mapper and actor to display the glyphs.
+SphereMapper = vtk.vtkPolyDataMapper()
+SphereMapper.SetInputConnection(Vertices.GetOutputPort())
+SphereMapper.ScalarVisibilityOff()
+CubeVertices = vtk.vtkActor()
+CubeVertices.SetMapper(SphereMapper)
+CubeVertices.GetProperty().SetDiffuseColor(tomato)
+CubeVertices.GetProperty().SetDiffuseColor(tomato)
+
+# Define the text for the label
+caseLabel = vtk.vtkVectorText()
+caseLabel.SetText("Case 1")
+
+# Set up a transform to move the label to a new position.
+aLabelTransform = vtk.vtkTransform()
+aLabelTransform.Identity()
+aLabelTransform.Translate(-0.2, 0, 1.25)
+aLabelTransform.Scale(.05, .05, .05)
+
+# Move the label to a new position.
+labelTransform = vtk.vtkTransformPolyDataFilter()
+labelTransform.SetTransform(aLabelTransform)
+labelTransform.SetInputConnection(caseLabel.GetOutputPort())
+  
+# Create a mapper and actor to display the text.
+labelMapper = vtk.vtkPolyDataMapper()
+labelMapper.SetInputConnection(labelTransform.GetOutputPort())
+ 
+labelActor = vtk.vtkActor()
+labelActor.SetMapper(labelMapper)
+ 
+# Define the base that the cube sits on.  Create its associated mapper
+# and actor.  Set the position of the actor.
+baseModel = vtk.vtkCubeSource()
+baseModel.SetXLength(1.5)
+baseModel.SetYLength(.01)
+baseModel.SetZLength(1.5)
+baseMapper = vtk.vtkPolyDataMapper()
+baseMapper.SetInputConnection(baseModel.GetOutputPort())
+base = vtk.vtkActor()
+base.SetMapper(baseMapper)
+base.SetPosition(.5, -0.09, .5)
+
+# Create the Renderer, RenderWindow, and RenderWindowInteractor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+renWin.SetSize(640, 480)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer
+ren.AddActor(triangleEdgeActor)
+ren.AddActor(base)
+ren.AddActor(labelActor)
+ren.AddActor(CubeEdges)
+ren.AddActor(CubeVertices)
+ren.AddActor(Triangles)
+
+# Set the background color.
+ren.SetBackground(slate_grey)
+
+# This sets up the right values for case12 of the marching cubes
+# algorithm (routine translated from vtktesting/mccases.tcl).
+def case12(scalars, caselabel, IN, OUT):
+    scalars.InsertValue(0, OUT)
+    scalars.InsertValue(1, IN)
+    scalars.InsertValue(2, OUT)
+    scalars.InsertValue(3, IN)
+    scalars.InsertValue(4, IN)
+    scalars.InsertValue(5, IN)
+    scalars.InsertValue(6, OUT)
+    scalars.InsertValue(7, OUT)
+    if IN == 1:
+        caselabel.SetText("Case 12 - 00111010")
+    else:
+        caselabel.SetText("Case 12 - 11000101")
+
+# Set the scalar values for this case of marching cubes.
+case12(Scalars, caseLabel, 0, 1)
+
+# Force the grid to update.
+Grid.Modified()
+
+# Position the camera.
+ren.ResetCamera()
+ren.GetActiveCamera().Dolly(1.2)
+ren.GetActiveCamera().Azimuth(30)
+ren.GetActiveCamera().Elevation(20)
+ren.ResetCameraClippingRange()
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/DataManipulation/marching.vt b/examples/vtk_examples/DataManipulation/marching.vt
new file mode 100644
index 0000000..a8a6fc9
Binary files /dev/null and b/examples/vtk_examples/DataManipulation/marching.vt differ
diff --git a/examples/vtk_examples/DataManipulation/pointToCellData.py b/examples/vtk_examples/DataManipulation/pointToCellData.py
new file mode 100644
index 0000000..bab4523
--- /dev/null
+++ b/examples/vtk_examples/DataManipulation/pointToCellData.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+
+# This example demonstrates the conversion of point data to cell data.
+# The conversion is necessary because we want to threshold data based
+# on cell scalar values.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read some data with point data attributes. The data is from a
+# plastic blow molding process (e.g., to make plastic bottles) and
+# consists of two logical components: a mold and a parison. The
+# parison is the hot plastic that is being molded, and the mold is
+# clamped around the parison to form its shape.
+reader = vtk.vtkUnstructuredGridReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/blow.vtk")
+reader.SetScalarsName("thickness9")
+reader.SetVectorsName("displacement9")
+
+# Convert the point data to cell data. The point data is passed
+# through the filter so it can be warped. The vtkThresholdFilter then
+# thresholds based on cell scalar values and extracts a portion of the
+# parison whose cell scalar values lie between 0.25 and 0.75.
+p2c = vtk.vtkPointDataToCellData()
+p2c.SetInputConnection(reader.GetOutputPort())
+p2c.PassPointDataOn()
+warp = vtk.vtkWarpVector()
+warp.SetInput(p2c.GetUnstructuredGridOutput())
+thresh = vtk.vtkThreshold()
+thresh.SetInputConnection(warp.GetOutputPort())
+thresh.ThresholdBetween(0.25, 0.75)
+thresh.SetInputArrayToProcess(1, 0, 0, 0, "thickness9")
+#thresh.SetAttributeModeToUseCellData()
+
+# This is used to extract the mold from the parison. 
+connect = vtk.vtkConnectivityFilter()
+connect.SetInputConnection(thresh.GetOutputPort())
+connect.SetExtractionModeToSpecifiedRegions()
+connect.AddSpecifiedRegion(0)
+connect.AddSpecifiedRegion(1)
+moldMapper = vtk.vtkDataSetMapper()
+moldMapper.SetInputConnection(reader.GetOutputPort())
+moldMapper.ScalarVisibilityOff()
+moldActor = vtk.vtkActor()
+moldActor.SetMapper(moldMapper)
+moldActor.GetProperty().SetColor(.2, .2, .2)
+moldActor.GetProperty().SetRepresentationToWireframe()
+
+# The threshold filter has been used to extract the parison.
+connect2 = vtk.vtkConnectivityFilter()
+connect2.SetInputConnection(thresh.GetOutputPort())
+parison = vtk.vtkGeometryFilter()
+parison.SetInputConnection(connect2.GetOutputPort())
+normals2 = vtk.vtkPolyDataNormals()
+normals2.SetInputConnection(parison.GetOutputPort())
+normals2.SetFeatureAngle(60)
+lut = vtk.vtkLookupTable()
+lut.SetHueRange(0.0, 0.66667)
+parisonMapper = vtk.vtkPolyDataMapper()
+parisonMapper.SetInputConnection(normals2.GetOutputPort())
+parisonMapper.SetLookupTable(lut)
+parisonMapper.SetScalarRange(0.12, 1.0)
+parisonActor = vtk.vtkActor()
+parisonActor.SetMapper(parisonMapper)
+
+# We generate some contour lines on the parison.
+cf = vtk.vtkContourFilter()
+cf.SetInputConnection(connect2.GetOutputPort())
+cf.SetValue(0, .5)
+contourMapper = vtk.vtkPolyDataMapper()
+contourMapper.SetInputConnection(cf.GetOutputPort())
+contours = vtk.vtkActor()
+contours.SetMapper(contourMapper)
+
+# Create graphics stuff
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(moldActor)
+ren.AddActor(parisonActor)
+ren.AddActor(contours)
+
+ren.ResetCamera()
+ren.GetActiveCamera().Azimuth(60)
+ren.GetActiveCamera().Roll(-90)
+ren.GetActiveCamera().Dolly(2)
+ren.ResetCameraClippingRange()
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(750, 400)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/DataManipulation/pointToCellData.vt b/examples/vtk_examples/DataManipulation/pointToCellData.vt
new file mode 100644
index 0000000..99c096a
Binary files /dev/null and b/examples/vtk_examples/DataManipulation/pointToCellData.vt differ
diff --git a/examples/vtk_examples/GUI/ImplicitPlaneWidget.py b/examples/vtk_examples/GUI/ImplicitPlaneWidget.py
new file mode 100644
index 0000000..50691db
--- /dev/null
+++ b/examples/vtk_examples/GUI/ImplicitPlaneWidget.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use the vtkPlaneWidget to probe a
+# dataset and then generate contours on the probed data.
+
+import vtk
+
+# Create a mace out of filters.
+sphere = vtk.vtkSphereSource()
+cone = vtk.vtkConeSource()
+glyph = vtk.vtkGlyph3D()
+glyph.SetInputConnection(sphere.GetOutputPort())
+glyph.SetSource(cone.GetOutput())
+glyph.SetVectorModeToUseNormal()
+glyph.SetScaleModeToScaleByVector()
+glyph.SetScaleFactor(0.25)
+
+# The sphere and spikes are appended into a single polydata.
+# This just makes things simpler to manage.
+apd = vtk.vtkAppendPolyData()
+apd.AddInput(glyph.GetOutput())
+apd.AddInput(sphere.GetOutput())
+
+maceMapper = vtk.vtkPolyDataMapper()
+maceMapper.SetInputConnection(apd.GetOutputPort())
+
+maceActor = vtk.vtkLODActor()
+maceActor.SetMapper(maceMapper)
+maceActor.VisibilityOn()
+
+# This portion of the code clips the mace with the vtkPlanes
+# implicit function. The clipped region is colored green.
+plane = vtk.vtkPlane()
+clipper = vtk.vtkClipPolyData()
+clipper.SetInputConnection(apd.GetOutputPort())
+clipper.SetClipFunction(plane)
+clipper.InsideOutOn()
+
+selectMapper = vtk.vtkPolyDataMapper()
+selectMapper.SetInputConnection(clipper.GetOutputPort())
+
+selectActor = vtk.vtkLODActor()
+selectActor.SetMapper(selectMapper)
+selectActor.GetProperty().SetColor(0, 1, 0)
+selectActor.VisibilityOff()
+selectActor.SetScale(1.01, 1.01, 1.01)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# The callback function
+def myCallback(obj, event):
+    global plane, selectActor
+    obj.GetPlane(plane)
+    selectActor.VisibilityOn()
+ 
+# Associate the line widget with the interactor
+planeWidget = vtk.vtkImplicitPlaneWidget()
+planeWidget.SetInteractor(iren)
+planeWidget.SetPlaceFactor(1.25)
+planeWidget.SetInput(glyph.GetOutput())
+planeWidget.PlaceWidget()
+planeWidget.AddObserver("InteractionEvent", myCallback)
+
+ren.AddActor(maceActor)
+ren.AddActor(selectActor)
+
+# Add the actors to the renderer, set the background and size
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(300, 300)
+ren.SetBackground(0.1, 0.2, 0.4)
+
+# Start interaction.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/GUI/ImplicitPlaneWidget.vt b/examples/vtk_examples/GUI/ImplicitPlaneWidget.vt
new file mode 100644
index 0000000..16b6bd9
Binary files /dev/null and b/examples/vtk_examples/GUI/ImplicitPlaneWidget.vt differ
diff --git a/examples/vtk_examples/GUI/ProbeWithPointWidget.py b/examples/vtk_examples/GUI/ProbeWithPointWidget.py
new file mode 100644
index 0000000..5d07070
--- /dev/null
+++ b/examples/vtk_examples/GUI/ProbeWithPointWidget.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use the vtkPointWidget to probe a
+# dataset and then color the probed point (represented as a cone) as
+# per the probed value and orient it as per the vector.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Start by loading some data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# The plane widget is used probe the dataset.
+pointWidget = vtk.vtkPointWidget()
+pointWidget.SetInput(pl3d.GetOutput())
+pointWidget.AllOff()
+pointWidget.PlaceWidget()
+point = vtk.vtkPolyData()
+pointWidget.GetPolyData(point)
+
+probe = vtk.vtkProbeFilter()
+probe.SetInput(point)
+probe.SetSource(pl3d.GetOutput())
+
+# create glyph
+cone = vtk.vtkConeSource()
+cone.SetResolution(16)
+
+inspector = vtk.vtkDataSetInspector()
+inspector.SetInputConnection(pl3d.GetOutputPort())
+
+pythoncalc = vtk.PythonCalc()
+pythoncalc.value1(inspector.GetLength())
+pythoncalc.value2(0.1)
+pythoncalc.op('*')
+
+glyph = vtk.vtkGlyph3D()
+glyph.SetInputConnection(probe.GetOutputPort())
+glyph.SetSource(cone.GetOutput())
+glyph.SetVectorModeToUseVector()
+glyph.SetScaleModeToDataScalingOff()
+# glyph.SetScaleFactor(pl3d.GetOutput().GetLength()*0.1)
+glyph.SetScaleFactor(pythoncalc.value())
+glyphMapper = vtk.vtkPolyDataMapper()
+glyphMapper.SetInputConnection(glyph.GetOutputPort())
+glyphActor = vtk.vtkActor()
+glyphActor.SetMapper(glyphMapper)
+glyphActor.VisibilityOff()
+
+# An outline is shown for context.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Actually set the color and orientation of the probe.
+def BeginInteraction(obj, event):
+    global point, glyphActor
+    obj.GetPolyData(point)
+    glyphActor.VisibilityOn() 
+
+def ProbeData(obj, event):
+    obj.GetPolyData(point) 
+
+# Associate the line widget with the interactor
+pointWidget.SetInteractor(iren)
+pointWidget.AddObserver("EnableEvent", BeginInteraction)
+pointWidget.AddObserver("StartInteractionEvent", BeginInteraction)
+pointWidget.AddObserver("InteractionEvent", ProbeData)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(glyphActor)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(300, 300)
+ren.SetBackground(0.1, 0.2, 0.4)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(9.71821, 0.458166, 29.3999)
+cam1.SetPosition(2.7439, -37.3196, 38.7167)
+cam1.SetViewUp(-0.16123, 0.264271, 0.950876)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/GUI/ProbeWithPointWidget.vt b/examples/vtk_examples/GUI/ProbeWithPointWidget.vt
new file mode 100644
index 0000000..4fad360
Binary files /dev/null and b/examples/vtk_examples/GUI/ProbeWithPointWidget.vt differ
diff --git a/examples/vtk_examples/GUI/ProbingWithPlaneWidget.py b/examples/vtk_examples/GUI/ProbingWithPlaneWidget.py
new file mode 100644
index 0000000..829fa87
--- /dev/null
+++ b/examples/vtk_examples/GUI/ProbingWithPlaneWidget.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use the vtkPlaneWidget to probe
+# a dataset and then generate contours on the probed data.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Start by loading some data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# The plane widget is used probe the dataset.
+planeWidget = vtk.vtkPlaneWidget()
+planeWidget.SetInput(pl3d.GetOutput())
+planeWidget.NormalToXAxisOn()
+planeWidget.SetResolution(20)
+planeWidget.SetRepresentationToOutline()
+planeWidget.PlaceWidget()
+plane = vtk.vtkPolyData()
+planeWidget.GetPolyData(plane)
+
+probe = vtk.vtkProbeFilter()
+probe.SetInput(plane)
+probe.SetSource(pl3d.GetOutput())
+
+contourMapper = vtk.vtkPolyDataMapper()
+contourMapper.SetInputConnection(probe.GetOutputPort())
+contourMapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+contourActor = vtk.vtkActor()
+contourActor.SetMapper(contourMapper)
+contourActor.VisibilityOff()
+
+# An outline is shown for context.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Actually generate contour lines.
+def BeginInteraction(obj, event):
+    global plane, contourActor
+    obj.GetPolyData(plane)
+    contourActor.VisibilityOn()
+
+def ProbeData(obj, event):
+    global plane
+    obj.GetPolyData(plane)
+
+
+# Associate the widget with the interactor
+planeWidget.SetInteractor(iren)
+# Handle the events.
+planeWidget.AddObserver("EnableEvent", BeginInteraction)
+planeWidget.AddObserver("StartInteractionEvent", BeginInteraction)
+planeWidget.AddObserver("InteractionEvent", ProbeData)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(contourActor)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(300, 300)
+ren.SetBackground(0.1, 0.2, 0.4)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(9.71821, 0.458166, 29.3999)
+cam1.SetPosition(2.7439, -37.3196, 38.7167)
+cam1.SetViewUp(-0.16123, 0.264271, 0.950876)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/GUI/ProbingWithPlaneWidget.vt b/examples/vtk_examples/GUI/ProbingWithPlaneWidget.vt
new file mode 100644
index 0000000..fa4a847
Binary files /dev/null and b/examples/vtk_examples/GUI/ProbingWithPlaneWidget.vt differ
diff --git a/examples/vtk_examples/GUI/StreamlinesWithLineWidget.py b/examples/vtk_examples/GUI/StreamlinesWithLineWidget.py
new file mode 100644
index 0000000..f5a522e
--- /dev/null
+++ b/examples/vtk_examples/GUI/StreamlinesWithLineWidget.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use the vtkLineWidget to seed and
+# manipulate streamlines. Two line widgets are created. One is invoked
+# by pressing 'i', the other by pressing 'L' (capital). Both can exist
+# together.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Start by loading some data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# The line widget is used seed the streamlines.
+lineWidget = vtk.vtkLineWidget()
+seeds = vtk.vtkPolyData()
+lineWidget.SetInput(pl3d.GetOutput())
+lineWidget.SetAlignToYAxis()
+lineWidget.PlaceWidget()
+lineWidget.GetPolyData(seeds)
+lineWidget.ClampToBoundsOn()
+
+rk4 = vtk.vtkRungeKutta4()
+streamer = vtk.vtkStreamLine()
+streamer.SetInputConnection(pl3d.GetOutputPort())
+streamer.SetSource(seeds)
+streamer.SetMaximumPropagationTime(100)
+streamer.SetIntegrationStepLength(.2)
+streamer.SetStepLength(.001)
+streamer.SetNumberOfThreads(1)
+streamer.SetIntegrationDirectionToForward()
+streamer.VorticityOn()
+streamer.SetIntegrator(rk4)
+rf = vtk.vtkRibbonFilter()
+rf.SetInputConnection(streamer.GetOutputPort())
+rf.SetWidth(0.1)
+rf.SetWidthFactor(5)
+streamMapper = vtk.vtkPolyDataMapper()
+streamMapper.SetInputConnection(rf.GetOutputPort())
+streamMapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+streamline = vtk.vtkActor()
+streamline.SetMapper(streamMapper)
+streamline.VisibilityOff()
+
+# The second line widget is used seed more streamlines.
+lineWidget2 = vtk.vtkLineWidget()
+seeds2 = vtk.vtkPolyData()
+lineWidget2.SetInput(pl3d.GetOutput())
+lineWidget2.PlaceWidget()
+lineWidget2.GetPolyData(seeds2)
+lineWidget2.SetKeyPressActivationValue('L')
+
+streamer2 = vtk.vtkStreamLine()
+streamer2.SetInputConnection(pl3d.GetOutputPort())
+streamer2.SetSource(seeds2)
+streamer2.SetMaximumPropagationTime(100)
+streamer2.SetIntegrationStepLength(.2)
+streamer2.SetStepLength(.001)
+streamer2.SetNumberOfThreads(1)
+streamer2.SetIntegrationDirectionToForward()
+streamer2.VorticityOn()
+streamer2.SetIntegrator(rk4)
+rf2 = vtk.vtkRibbonFilter()
+rf2.SetInputConnection(streamer2.GetOutputPort())
+rf2.SetWidth(0.1)
+rf2.SetWidthFactor(5)
+streamMapper2 = vtk.vtkPolyDataMapper()
+streamMapper2.SetInputConnection(rf2.GetOutputPort())
+streamMapper2.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+streamline2 = vtk.vtkActor()
+streamline2.SetMapper(streamMapper2)
+streamline2.VisibilityOff()
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Callback functions that actually generate streamlines.
+def BeginInteraction(obj, event):
+    global streamline
+    streamline.VisibilityOn() 
+
+def GenerateStreamlines(obj, event):
+    global seeds, renWin
+    obj.GetPolyData(seeds)
+    renWin.Render()
+
+def BeginInteraction2(obj, event):
+    global streamline2
+    streamline2.VisibilityOn()
+
+def GenerateStreamlines2(obj, event):
+    global seeds2, renWin
+    obj.GetPolyData(seeds2)
+    renWin.Render()
+
+# Associate the line widget with the interactor and setup callbacks.
+lineWidget.SetInteractor(iren)
+lineWidget.AddObserver("StartInteractionEvent", BeginInteraction)
+lineWidget.AddObserver("InteractionEvent", GenerateStreamlines)
+
+lineWidget2.SetInteractor(iren)
+lineWidget2.AddObserver("StartInteractionEvent", BeginInteraction2)
+lineWidget2.AddObserver("EndInteractionEvent", GenerateStreamlines2)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(streamline)
+ren.AddActor(streamline2)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(300, 300)
+ren.SetBackground(0.1, 0.2, 0.4)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(9.71821, 0.458166, 29.3999)
+cam1.SetPosition(2.7439, -37.3196, 38.7167)
+cam1.SetViewUp(-0.16123, 0.264271, 0.950876)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/GUI/StreamlinesWithLineWidget.vt b/examples/vtk_examples/GUI/StreamlinesWithLineWidget.vt
new file mode 100644
index 0000000..0e2b157
Binary files /dev/null and b/examples/vtk_examples/GUI/StreamlinesWithLineWidget.vt differ
diff --git a/examples/vtk_examples/GUI/TransformWithBoxWidget.py b/examples/vtk_examples/GUI/TransformWithBoxWidget.py
new file mode 100644
index 0000000..a04f332
--- /dev/null
+++ b/examples/vtk_examples/GUI/TransformWithBoxWidget.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+
+# Demonstrate how to use the vtkBoxWidget to translate, scale, and
+# rotate actors.  The basic idea is that the box widget controls an
+# actor's transform. A callback which modifies the transform is
+# invoked as the box widget is manipulated.
+
+import vtk
+
+# Start by creating some simple geometry; in this case a mace.
+sphere = vtk.vtkSphereSource()
+cone = vtk.vtkConeSource()
+glyph = vtk.vtkGlyph3D()
+glyph.SetInputConnection(sphere.GetOutputPort())
+glyph.SetSource(cone.GetOutput())
+glyph.SetVectorModeToUseNormal()
+glyph.SetScaleModeToScaleByVector()
+glyph.SetScaleFactor(0.25)
+appendData = vtk.vtkAppendPolyData()
+appendData.AddInput(glyph.GetOutput())
+appendData.AddInput(sphere.GetOutput())
+maceMapper = vtk.vtkPolyDataMapper()
+maceMapper.SetInputConnection(appendData.GetOutputPort())
+maceActor = vtk.vtkLODActor()
+maceActor.SetMapper(maceMapper)
+maceActor.VisibilityOn()
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# The box widget observes the events invoked by the render window
+# interactor.  These events come from user interaction in the render
+# window.
+boxWidget = vtk.vtkBoxWidget()
+boxWidget.SetInteractor(iren)
+boxWidget.SetPlaceFactor(1.25)
+
+# Add the actors to the renderer, set the background and window size.
+ren.AddActor(maceActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(300, 300)
+
+# As the box widget is interacted with, it produces a transformation
+# matrix that is set on the actor.
+t = vtk.vtkTransform()
+def TransformActor(obj, event):
+    global t, maceActor
+    obj.GetTransform(t)
+    maceActor.SetUserTransform(t)
+
+# Place the interactor initially. The actor is used to place and scale
+# the interactor. An observer is added to the box widget to watch for
+# interaction events. This event is captured and used to set the
+# transformation matrix of the actor.
+boxWidget.SetProp3D(maceActor)
+boxWidget.PlaceWidget()
+boxWidget.AddObserver("InteractionEvent", TransformActor)
+
+iren.Initialize() 
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/GUI/TransformWithBoxWidget.vt b/examples/vtk_examples/GUI/TransformWithBoxWidget.vt
new file mode 100644
index 0000000..40cca2c
Binary files /dev/null and b/examples/vtk_examples/GUI/TransformWithBoxWidget.vt differ
diff --git a/examples/vtk_examples/GUI/VolumeRenderWithBoxWidget.py b/examples/vtk_examples/GUI/VolumeRenderWithBoxWidget.py
new file mode 100644
index 0000000..7b8e549
--- /dev/null
+++ b/examples/vtk_examples/GUI/VolumeRenderWithBoxWidget.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python
+
+# Demonstrate how to use the vtkBoxWidget to control volume rendering
+# within the interior of the widget.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Load a volume, use the widget to control what's volume
+# rendered. Basically the idea is that the vtkBoxWidget provides a box
+# which clips the volume rendering.
+v16 = vtk.vtkVolume16Reader()
+v16.SetDataDimensions(64, 64)
+v16.GetOutput().SetOrigin(0.0, 0.0, 0.0)
+v16.SetDataByteOrderToLittleEndian()
+v16.SetFilePrefix(VTK_DATA_ROOT+ "/Data/headsq/quarter")
+v16.SetImageRange(1, 93)
+v16.SetDataSpacing(3.2, 3.2, 1.5)
+
+tfun = vtk.vtkPiecewiseFunction()
+tfun.AddPoint(70.0, 0.0)
+tfun.AddPoint(599.0, 0)
+tfun.AddPoint(600.0, 0)
+tfun.AddPoint(1195.0, 0)
+tfun.AddPoint(1200, .2)
+tfun.AddPoint(1300, .3)
+tfun.AddPoint(2000, .3)
+tfun.AddPoint(4095.0, 1.0)
+
+ctfun = vtk.vtkColorTransferFunction()
+ctfun.AddRGBPoint(0.0, 0.5, 0.0, 0.0)
+ctfun.AddRGBPoint(600.0, 1.0, 0.5, 0.5)
+ctfun.AddRGBPoint(1280.0, 0.9, 0.2, 0.3)
+ctfun.AddRGBPoint(1960.0, 0.81, 0.27, 0.1)
+ctfun.AddRGBPoint(4095.0, 0.5, 0.5, 0.5)
+
+compositeFunction = vtk.vtkVolumeRayCastCompositeFunction()
+
+volumeMapper = vtk.vtkVolumeRayCastMapper()
+volumeMapper.SetInputConnection(v16.GetOutputPort())
+volumeMapper.SetVolumeRayCastFunction(compositeFunction)
+
+volumeProperty = vtk.vtkVolumeProperty()
+volumeProperty.SetColor(ctfun)
+volumeProperty.SetScalarOpacity(tfun)
+volumeProperty.SetInterpolationTypeToLinear()
+volumeProperty.ShadeOn()
+
+newvol = vtk.vtkVolume()
+newvol.SetMapper(volumeMapper)
+newvol.SetProperty(volumeProperty)
+
+outline = vtk.vtkOutlineFilter()
+outline.SetInputConnection(v16.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# The SetInteractor method is how 3D widgets are associated with the
+# render window interactor. Internally, SetInteractor sets up a bunch
+# of callbacks using the Command/Observer mechanism (AddObserver()).
+boxWidget = vtk.vtkBoxWidget()
+boxWidget.SetInteractor(iren)
+boxWidget.SetPlaceFactor(1.0)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddVolume(newvol)
+
+ren.SetBackground(0, 0, 0)
+renWin.SetSize(300, 300)
+
+# When interaction starts, the requested frame rate is increased.
+def StartInteraction(obj, event):
+    global renWin
+    renWin.SetDesiredUpdateRate(10)
+
+# When interaction ends, the requested frame rate is decreased to
+# normal levels. This causes a full resolution render to occur.
+def EndInteraction(obj, event):
+    global renWin
+    renWin.SetDesiredUpdateRate(0.001)
+
+# The implicit function vtkPlanes is used in conjunction with the
+# volume ray cast mapper to limit which portion of the volume is
+# volume rendered.
+planes = vtk.vtkPlanes()
+def ClipVolumeRender(obj, event):
+    global planes, volumeMapper
+    obj.GetPlanes(planes)
+    volumeMapper.SetClippingPlanes(planes)
+ 
+
+# Place the interactor initially. The output of the reader is used to
+# place the box widget.
+boxWidget.SetInput(v16.GetOutput())
+boxWidget.PlaceWidget()
+boxWidget.InsideOutOn()
+boxWidget.AddObserver("StartInteractionEvent", StartInteraction)
+boxWidget.AddObserver("InteractionEvent", ClipVolumeRender)
+boxWidget.AddObserver("EndInteractionEvent", EndInteraction)
+
+outlineProperty = boxWidget.GetOutlineProperty()
+outlineProperty.SetRepresentationToWireframe()
+outlineProperty.SetAmbient(1.0)
+outlineProperty.SetAmbientColor(1, 1, 1)
+outlineProperty.SetLineWidth(3)
+
+selectedOutlineProperty = boxWidget.GetSelectedOutlineProperty()
+selectedOutlineProperty.SetRepresentationToWireframe()
+selectedOutlineProperty.SetAmbient(1.0)
+selectedOutlineProperty.SetAmbientColor(1, 0, 0)
+selectedOutlineProperty.SetLineWidth(3)
+
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/GUI/VolumeRenderWithBoxWidget.vt b/examples/vtk_examples/GUI/VolumeRenderWithBoxWidget.vt
new file mode 100644
index 0000000..0a21a3e
Binary files /dev/null and b/examples/vtk_examples/GUI/VolumeRenderWithBoxWidget.vt differ
diff --git a/examples/vtk_examples/IO/flamingo.py b/examples/vtk_examples/IO/flamingo.py
new file mode 100644
index 0000000..14a3f77
--- /dev/null
+++ b/examples/vtk_examples/IO/flamingo.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of vtk3DSImporter.
+# vtk3DSImporter is used to load 3D Studio files.  Unlike writers,
+# importers can load scenes (data as well as lights, cameras, actors
+# etc.). Importers will either generate an instance of vtkRenderWindow
+# and/or vtkRenderer or will use the ones you specify.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+
+# Create the importer and read a file
+importer = vtk.vtk3DSImporter()
+importer.ComputeNormalsOn()
+importer.SetFileName(VTK_DATA_ROOT + "/Data/iflamigm.3ds")
+importer.Read()
+
+# Here we let the importer create a renderer and a render window for
+# us. We could have also create and assigned those ourselves like so:
+# renWin = vtk.vtkRenderWindow()
+# importer.SetRenderWindow(renWin)
+
+# Assign an interactor.
+# We have to ask the importer for it's render window.
+# renWin = importer.GetRenderWindow()
+
+ren = importer.GetRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Set the render window's size
+renWin.SetSize(300, 300)
+
+# Set some properties on the renderer.
+# We have to ask the importer for it's renderer.
+# ren = importer.GetRenderer()
+ren.SetBackground(0.1, 0.2, 0.4)
+
+# Position the camera:
+# change view up to +z
+camera = ren.GetActiveCamera()
+camera.SetPosition(0, 1, 0)
+camera.SetFocalPoint(0, 0, 0)
+camera.SetViewUp(0, 0, 1)
+# let the renderer compute good position and focal point
+ren.ResetCamera()
+camera.Dolly(1.4)
+ren.ResetCameraClippingRange()
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/IO/flamingo.vt b/examples/vtk_examples/IO/flamingo.vt
new file mode 100644
index 0000000..9e206eb
Binary files /dev/null and b/examples/vtk_examples/IO/flamingo.vt differ
diff --git a/examples/vtk_examples/IO/stl.py b/examples/vtk_examples/IO/stl.py
new file mode 100644
index 0000000..a9cb50d
--- /dev/null
+++ b/examples/vtk_examples/IO/stl.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of vtkSTLReader to load data into
+# VTK from a file.  This example also uses vtkLODActor which changes
+# its graphical representation of the data to maintain interactive
+# performance.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create the reader and read a data file.  Connect the mapper and
+# actor.
+sr = vtk.vtkSTLReader()
+sr.SetFileName(VTK_DATA_ROOT + "/Data/42400-IDGH.stl")
+
+stlMapper = vtk.vtkPolyDataMapper()
+stlMapper.SetInputConnection(sr.GetOutputPort())
+
+stlActor = vtk.vtkLODActor()
+stlActor.SetMapper(stlMapper)
+
+# Create the Renderer, RenderWindow, and RenderWindowInteractor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the render; set the background and size
+ren.AddActor(stlActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(500, 500)
+
+# Zoom in closer
+ren.ResetCamera()
+cam1 = ren.GetActiveCamera()
+cam1.Zoom(1.4)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/IO/stl.vt b/examples/vtk_examples/IO/stl.vt
new file mode 100644
index 0000000..5891c13
Binary files /dev/null and b/examples/vtk_examples/IO/stl.vt differ
diff --git a/examples/vtk_examples/ImageProcessing/Contours2D.py b/examples/vtk_examples/ImageProcessing/Contours2D.py
new file mode 100644
index 0000000..edd434c
--- /dev/null
+++ b/examples/vtk_examples/ImageProcessing/Contours2D.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+# This example shows how to sample a mathematical function over a
+# volume. A slice from the volume is then extracted and then contoured
+# to produce 2D contour lines.
+#
+import vtk
+
+# Quadric definition. This is a type of implicit function. Here the 
+# coefficients to the equations are set.
+quadric = vtk.vtkQuadric()
+quadric.SetCoefficients(.5, 1, .2, 0, .1, 0, 0, .2, 0, 0)
+
+# The vtkSampleFunction uses the quadric function and evaluates function
+# value over a regular lattice (i.e., a volume).
+sample = vtk.vtkSampleFunction()
+sample.SetSampleDimensions(30, 30, 30)
+sample.SetImplicitFunction(quadric)
+sample.ComputeNormalsOff()
+sample.Update()
+
+# Here a single slice (i.e., image) is extracted from the volume. (Note: in
+# actuality the VOI request causes the sample function to operate on just the
+# slice.)
+extract = vtk.vtkExtractVOI()
+extract.SetInputConnection(sample.GetOutputPort())
+extract.SetVOI(0, 29, 0, 29, 15, 15)
+extract.SetSampleRate(1, 2, 3)
+
+# The image is contoured to produce contour lines. Thirteen contour values
+# ranging from (0,1.2) inclusive are produced.
+contours = vtk.vtkContourFilter()
+contours.SetInputConnection(extract.GetOutputPort())
+contours.GenerateValues(13, 0.0, 1.2)
+
+# The contour lines are mapped to the graphics library.
+contMapper = vtk.vtkPolyDataMapper()
+contMapper.SetInputConnection(contours.GetOutputPort())
+contMapper.SetScalarRange(0.0, 1.2)
+
+contActor = vtk.vtkActor()
+contActor.SetMapper(contMapper)
+
+# Create outline an outline of the sampled data.
+outline = vtk.vtkOutlineFilter()
+outline.SetInputConnection(sample.GetOutputPort())
+
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Create the renderer, render window, and interactor.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Set the background color to white. Associate the actors with the
+# renderer.
+ren.SetBackground(1, 1, 1)
+ren.AddActor(contActor)
+ren.AddActor(outlineActor)
+
+# Zoom in a little bit.
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.5)
+
+# Initialize and start the event loop.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/ImageProcessing/Contours2D.vt b/examples/vtk_examples/ImageProcessing/Contours2D.vt
new file mode 100644
index 0000000..93eb1e7
Binary files /dev/null and b/examples/vtk_examples/ImageProcessing/Contours2D.vt differ
diff --git a/examples/vtk_examples/Medical/Medical1.py b/examples/vtk_examples/Medical/Medical1.py
new file mode 100644
index 0000000..f3cfa9c
--- /dev/null
+++ b/examples/vtk_examples/Medical/Medical1.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+# This example reads a volume dataset, extracts an isosurface that
+# represents the skin and displays it.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create the renderer, the render window, and the interactor. The
+# renderer draws into the render window, the interactor enables mouse-
+# and keyboard-based interaction with the scene.
+aRenderer = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(aRenderer)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# The following reader is used to read a series of 2D slices (images)
+# that compose the volume. The slice dimensions are set, and the
+# pixel spacing. The data Endianness must also be specified. The reader
+# usese the FilePrefix in combination with the slice number to construct
+# filenames using the format FilePrefix.%d. (In this case the FilePrefix
+# is the root name of the file: quarter.)
+v16 = vtk.vtkVolume16Reader()
+v16.SetDataDimensions(64, 64)
+v16.SetDataByteOrderToLittleEndian()
+v16.SetFilePrefix(VTK_DATA_ROOT + "/Data/headsq/quarter")
+v16.SetImageRange(1, 93)
+v16.SetDataSpacing(3.2, 3.2, 1.5)
+
+# An isosurface, or contour value of 500 is known to correspond to the
+# skin of the patient. Once generated, a vtkPolyDataNormals filter is
+# is used to create normals for smooth surface shading during rendering.
+# The triangle stripper is used to create triangle strips from the
+# isosurface these render much faster on may systems.
+skinExtractor = vtk.vtkContourFilter()
+skinExtractor.SetInputConnection(v16.GetOutputPort())
+skinExtractor.SetValue(0, 500)
+skinNormals = vtk.vtkPolyDataNormals()
+skinNormals.SetInputConnection(skinExtractor.GetOutputPort())
+skinNormals.SetFeatureAngle(60.0)
+skinMapper = vtk.vtkPolyDataMapper()
+skinMapper.SetInputConnection(skinNormals.GetOutputPort())
+skinMapper.ScalarVisibilityOff()
+skin = vtk.vtkActor()
+skin.SetMapper(skinMapper)
+
+# An outline provides context around the data.
+outlineData = vtk.vtkOutlineFilter()
+outlineData.SetInputConnection(v16.GetOutputPort())
+mapOutline = vtk.vtkPolyDataMapper()
+mapOutline.SetInputConnection(outlineData.GetOutputPort())
+outline = vtk.vtkActor()
+outline.SetMapper(mapOutline)
+outline.GetProperty().SetColor(0, 0, 0)
+
+# It is convenient to create an initial view of the data. The FocalPoint
+# and Position form a vector direction. Later on (ResetCamera() method)
+# this vector is used to position the camera to look at the data in
+# this direction.
+aCamera = vtk.vtkCamera()
+aCamera.SetViewUp(0, 0, -1)
+aCamera.SetPosition(0, 1, 0)
+aCamera.SetFocalPoint(0, 0, 0)
+aCamera.ComputeViewPlaneNormal()
+
+# Actors are added to the renderer. An initial camera view is created.
+# The Dolly() method moves the camera towards the FocalPoint,
+# thereby enlarging the image.
+aRenderer.AddActor(outline)
+aRenderer.AddActor(skin)
+aRenderer.SetActiveCamera(aCamera)
+aRenderer.ResetCamera()
+aCamera.Dolly(1.5)
+
+# Set a background color for the renderer and set the size of the
+# render window (expressed in pixels).
+aRenderer.SetBackground(1, 1, 1)
+renWin.SetSize(640, 480)
+
+# Note that when camera movement occurs (as it does in the Dolly()
+# method), the clipping planes often need adjusting. Clipping planes
+# consist of two planes: near and far along the view direction. The
+# near plane clips out objects in front of the plane the far plane
+# clips out objects behind the plane. This way only what is drawn
+# between the planes is actually rendered.
+aRenderer.ResetCameraClippingRange()
+
+# Interact with the data.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Medical/Medical1.vt b/examples/vtk_examples/Medical/Medical1.vt
new file mode 100644
index 0000000..a513f31
Binary files /dev/null and b/examples/vtk_examples/Medical/Medical1.vt differ
diff --git a/examples/vtk_examples/Medical/Medical2.py b/examples/vtk_examples/Medical/Medical2.py
new file mode 100644
index 0000000..835e9fa
--- /dev/null
+++ b/examples/vtk_examples/Medical/Medical2.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+
+# This example reads a volume dataset, extracts two isosurfaces that
+# represent the skin and bone, and then displays them.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create the renderer, the render window, and the interactor. The
+# renderer draws into the render window, the interactor enables mouse-
+# and keyboard-based interaction with the scene.
+aRenderer = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(aRenderer)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# The following reader is used to read a series of 2D slices (images)
+# that compose the volume. The slice dimensions are set, and the
+# pixel spacing. The data Endianness must also be specified. The reader
+# usese the FilePrefix in combination with the slice number to construct
+# filenames using the format FilePrefix.%d. (In this case the FilePrefix
+# is the root name of the file: quarter.)
+v16 = vtk.vtkVolume16Reader()
+v16.SetDataDimensions(64, 64)
+v16.SetDataByteOrderToLittleEndian()
+v16.SetFilePrefix(VTK_DATA_ROOT + "/Data/headsq/quarter")
+v16.SetImageRange(1, 93)
+v16.SetDataSpacing(3.2, 3.2, 1.5)
+
+# An isosurface, or contour value of 500 is known to correspond to the
+# skin of the patient. Once generated, a vtkPolyDataNormals filter is
+# is used to create normals for smooth surface shading during rendering.
+# The triangle stripper is used to create triangle strips from the
+# isosurface these render much faster on may systems.
+skinExtractor = vtk.vtkContourFilter()
+skinExtractor.SetInputConnection(v16.GetOutputPort())
+skinExtractor.SetValue(0, 500)
+skinNormals = vtk.vtkPolyDataNormals()
+skinNormals.SetInputConnection(skinExtractor.GetOutputPort())
+skinNormals.SetFeatureAngle(60.0)
+skinStripper = vtk.vtkStripper()
+skinStripper.SetInputConnection(skinNormals.GetOutputPort())
+skinMapper = vtk.vtkPolyDataMapper()
+skinMapper.SetInputConnection(skinStripper.GetOutputPort())
+skinMapper.ScalarVisibilityOff()
+skin = vtk.vtkActor()
+skin.SetMapper(skinMapper)
+skin.GetProperty().SetDiffuseColor(1, .49, .25)
+skin.GetProperty().SetSpecular(.3)
+skin.GetProperty().SetSpecularPower(20)
+
+# An isosurface, or contour value of 1150 is known to correspond to the
+# skin of the patient. Once generated, a vtkPolyDataNormals filter is
+# is used to create normals for smooth surface shading during rendering.
+# The triangle stripper is used to create triangle strips from the
+# isosurface these render much faster on may systems.
+boneExtractor = vtk.vtkContourFilter()
+boneExtractor.SetInputConnection(v16.GetOutputPort())
+boneExtractor.SetValue(0, 1150)
+boneNormals = vtk.vtkPolyDataNormals()
+boneNormals.SetInputConnection(boneExtractor.GetOutputPort())
+boneNormals.SetFeatureAngle(60.0)
+boneStripper = vtk.vtkStripper()
+boneStripper.SetInputConnection(boneNormals.GetOutputPort())
+boneMapper = vtk.vtkPolyDataMapper()
+boneMapper.SetInputConnection(boneStripper.GetOutputPort())
+boneMapper.ScalarVisibilityOff()
+bone = vtk.vtkActor()
+bone.SetMapper(boneMapper)
+bone.GetProperty().SetDiffuseColor(1, 1, .9412)
+
+# An outline provides context around the data.
+outlineData = vtk.vtkOutlineFilter()
+outlineData.SetInputConnection(v16.GetOutputPort())
+mapOutline = vtk.vtkPolyDataMapper()
+mapOutline.SetInputConnection(outlineData.GetOutputPort())
+outline = vtk.vtkActor()
+outline.SetMapper(mapOutline)
+outline.GetProperty().SetColor(0, 0, 0)
+
+# It is convenient to create an initial view of the data. The FocalPoint
+# and Position form a vector direction. Later on (ResetCamera() method)
+# this vector is used to position the camera to look at the data in
+# this direction.
+aCamera = vtk.vtkCamera()
+aCamera.SetViewUp(0, 0, -1)
+aCamera.SetPosition(0, 1, 0)
+aCamera.SetFocalPoint(0, 0, 0)
+aCamera.ComputeViewPlaneNormal()
+
+# Actors are added to the renderer. An initial camera view is created.
+# The Dolly() method moves the camera towards the FocalPoint,
+# thereby enlarging the image.
+aRenderer.AddActor(outline)
+aRenderer.AddActor(skin)
+aRenderer.AddActor(bone)
+aRenderer.SetActiveCamera(aCamera)
+aRenderer.ResetCamera()
+aCamera.Dolly(1.5)
+
+# Set a background color for the renderer and set the size of the
+# render window (expressed in pixels).
+aRenderer.SetBackground(1, 1, 1)
+renWin.SetSize(640, 480)
+
+# Note that when camera movement occurs (as it does in the Dolly()
+# method), the clipping planes often need adjusting. Clipping planes
+# consist of two planes: near and far along the view direction. The
+# near plane clips out objects in front of the plane the far plane
+# clips out objects behind the plane. This way only what is drawn
+# between the planes is actually rendered.
+aRenderer.ResetCameraClippingRange()
+
+# Interact with the data.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Medical/Medical2.vt b/examples/vtk_examples/Medical/Medical2.vt
new file mode 100644
index 0000000..8af2120
Binary files /dev/null and b/examples/vtk_examples/Medical/Medical2.vt differ
diff --git a/examples/vtk_examples/Medical/Medical3.py b/examples/vtk_examples/Medical/Medical3.py
new file mode 100644
index 0000000..4960597
--- /dev/null
+++ b/examples/vtk_examples/Medical/Medical3.py
@@ -0,0 +1,196 @@
+#!/usr/bin/env python
+
+# This example reads a volume dataset, extracts two isosurfaces that
+# represent the skin and bone, creates three orthogonal planes
+# (saggital, axial, coronal), and displays them.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create the renderer, the render window, and the interactor. The
+# renderer draws into the render window, the interactor enables mouse-
+# and keyboard-based interaction with the scene.
+aRenderer = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(aRenderer)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# The following reader is used to read a series of 2D slices (images)
+# that compose the volume. The slice dimensions are set, and the
+# pixel spacing. The data Endianness must also be specified. The reader
+# usese the FilePrefix in combination with the slice number to construct
+# filenames using the format FilePrefix.%d. (In this case the FilePrefix
+# is the root name of the file: quarter.)
+v16 = vtk.vtkVolume16Reader()
+v16.SetDataDimensions(64, 64)
+v16.SetDataByteOrderToLittleEndian()
+v16.SetFilePrefix(VTK_DATA_ROOT + "/Data/headsq/quarter")
+v16.SetImageRange(1, 93)
+v16.SetDataSpacing(3.2, 3.2, 1.5)
+
+# An isosurface, or contour value of 500 is known to correspond to the
+# skin of the patient. Once generated, a vtkPolyDataNormals filter is
+# is used to create normals for smooth surface shading during rendering.
+# The triangle stripper is used to create triangle strips from the
+# isosurface these render much faster on may systems.
+skinExtractor = vtk.vtkContourFilter()
+skinExtractor.SetInputConnection(v16.GetOutputPort())
+skinExtractor.SetValue(0, 500)
+skinNormals = vtk.vtkPolyDataNormals()
+skinNormals.SetInputConnection(skinExtractor.GetOutputPort())
+skinNormals.SetFeatureAngle(60.0)
+skinStripper = vtk.vtkStripper()
+skinStripper.SetInputConnection(skinNormals.GetOutputPort())
+skinMapper = vtk.vtkPolyDataMapper()
+skinMapper.SetInputConnection(skinStripper.GetOutputPort())
+skinMapper.ScalarVisibilityOff()
+skin = vtk.vtkActor()
+skin.SetMapper(skinMapper)
+skin.GetProperty().SetDiffuseColor(1, .49, .25)
+skin.GetProperty().SetSpecular(.3)
+skin.GetProperty().SetSpecularPower(20)
+
+# An isosurface, or contour value of 1150 is known to correspond to the
+# skin of the patient. Once generated, a vtkPolyDataNormals filter is
+# is used to create normals for smooth surface shading during rendering.
+# The triangle stripper is used to create triangle strips from the
+# isosurface these render much faster on may systems.
+boneExtractor = vtk.vtkContourFilter()
+boneExtractor.SetInputConnection(v16.GetOutputPort())
+boneExtractor.SetValue(0, 1150)
+boneNormals = vtk.vtkPolyDataNormals()
+boneNormals.SetInputConnection(boneExtractor.GetOutputPort())
+boneNormals.SetFeatureAngle(60.0)
+boneStripper = vtk.vtkStripper()
+boneStripper.SetInputConnection(boneNormals.GetOutputPort())
+boneMapper = vtk.vtkPolyDataMapper()
+boneMapper.SetInputConnection(boneStripper.GetOutputPort())
+boneMapper.ScalarVisibilityOff()
+bone = vtk.vtkActor()
+bone.SetMapper(boneMapper)
+bone.GetProperty().SetDiffuseColor(1, 1, .9412)
+
+# An outline provides context around the data.
+outlineData = vtk.vtkOutlineFilter()
+outlineData.SetInputConnection(v16.GetOutputPort())
+mapOutline = vtk.vtkPolyDataMapper()
+mapOutline.SetInputConnection(outlineData.GetOutputPort())
+outline = vtk.vtkActor()
+outline.SetMapper(mapOutline)
+outline.GetProperty().SetColor(0, 0, 0)
+
+# Now we are creating three orthogonal planes passing through the
+# volume. Each plane uses a different texture map and therefore has
+# diferent coloration.
+
+# Start by creatin a black/white lookup table.
+bwLut = vtk.vtkLookupTable()
+bwLut.SetTableRange(0, 2000)
+bwLut.SetSaturationRange(0, 0)
+bwLut.SetHueRange(0, 0)
+bwLut.SetValueRange(0, 1)
+bwLut.Build()
+
+# Now create a lookup table that consists of the full hue circle (from
+# HSV).
+hueLut = vtk.vtkLookupTable()
+hueLut.SetTableRange(0, 2000)
+hueLut.SetHueRange(0, 1)
+hueLut.SetSaturationRange(1, 1)
+hueLut.SetValueRange(1, 1)
+hueLut.Build()
+
+# Finally, create a lookup table with a single hue but having a range
+# in the saturation of the hue.
+satLut = vtk.vtkLookupTable()
+satLut.SetTableRange(0, 2000)
+satLut.SetHueRange(.6, .6)
+satLut.SetSaturationRange(0, 1)
+satLut.SetValueRange(1, 1)
+satLut.Build()
+
+# Create the first of the three planes. The filter vtkImageMapToColors
+# maps the data through the corresponding lookup table created above.
+# The vtkImageActor is a type of vtkProp and conveniently displays an
+# image on a single quadrilateral plane. It does this using texture
+# mapping and as a result is quite fast. (Note: the input image has to
+# be unsigned char values, which the vtkImageMapToColors produces.)
+# Note also that by specifying the DisplayExtent, the pipeline
+# requests data of this extent and the vtkImageMapToColors only
+# processes a slice of data.
+saggitalColors = vtk.vtkImageMapToColors()
+saggitalColors.SetInputConnection(v16.GetOutputPort())
+saggitalColors.SetLookupTable(bwLut)
+saggital = vtk.vtkImageActor()
+saggital.SetInput(saggitalColors.GetOutput())
+saggital.SetDisplayExtent(32, 32, 0, 63, 0, 92)
+
+# Create the second (axial) plane of the three planes. We use the same
+# approach as before except that the extent differs.
+axialColors = vtk.vtkImageMapToColors()
+axialColors.SetInputConnection(v16.GetOutputPort())
+axialColors.SetLookupTable(hueLut)
+axial = vtk.vtkImageActor()
+axial.SetInput(axialColors.GetOutput())
+axial.SetDisplayExtent(0, 63, 0, 63, 46, 46)
+
+# Create the third (coronal) plane of the three planes. We use the same
+# approach as before except that the extent differs.
+coronalColors = vtk.vtkImageMapToColors()
+coronalColors.SetInputConnection(v16.GetOutputPort())
+coronalColors.SetLookupTable(satLut)
+coronal = vtk.vtkImageActor()
+coronal.SetInput(coronalColors.GetOutput())
+coronal.SetDisplayExtent(0, 63, 32, 32, 0, 92)
+
+# It is convenient to create an initial view of the data. The FocalPoint
+# and Position form a vector direction. Later on (ResetCamera() method)
+# this vector is used to position the camera to look at the data in
+# this direction.
+aCamera = vtk.vtkCamera()
+aCamera.SetViewUp(0, 0, -1)
+aCamera.SetPosition(0, 1, 0)
+aCamera.SetFocalPoint(0, 0, 0)
+aCamera.ComputeViewPlaneNormal()
+
+# Actors are added to the renderer.
+aRenderer.AddActor(outline)
+aRenderer.AddActor(saggital)
+aRenderer.AddActor(axial)
+aRenderer.AddActor(coronal)
+#aRenderer.AddActor(axial)
+#aRenderer.AddActor(coronal)
+aRenderer.AddActor(skin)
+aRenderer.AddActor(bone)
+
+# Turn off bone for this example.
+bone.VisibilityOff()
+
+# Set skin to semi-transparent.
+skin.GetProperty().SetOpacity(0.5)
+
+# An initial camera view is created.  The Dolly() method moves
+# the camera towards the FocalPoint, thereby enlarging the image.
+aRenderer.SetActiveCamera(aCamera)
+aRenderer.ResetCamera()
+aCamera.Dolly(1.5)
+
+# Set a background color for the renderer and set the size of the
+# render window (expressed in pixels).
+aRenderer.SetBackground(1, 1, 1)
+renWin.SetSize(640, 480)
+
+# Note that when camera movement occurs (as it does in the Dolly()
+# method), the clipping planes often need adjusting. Clipping planes
+# consist of two planes: near and far along the view direction. The
+# near plane clips out objects in front of the plane the far plane
+# clips out objects behind the plane. This way only what is drawn
+# between the planes is actually rendered.
+aRenderer.ResetCameraClippingRange()
+
+# Interact with the data.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Medical/Medical3.vt b/examples/vtk_examples/Medical/Medical3.vt
new file mode 100644
index 0000000..8bba608
Binary files /dev/null and b/examples/vtk_examples/Medical/Medical3.vt differ
diff --git a/examples/vtk_examples/Modelling/PerlinTerrain.py b/examples/vtk_examples/Modelling/PerlinTerrain.py
new file mode 100644
index 0000000..ea53af2
--- /dev/null
+++ b/examples/vtk_examples/Modelling/PerlinTerrain.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to combine a "geometric" implicit
+# function with noise at different frequencies to produce the
+# appearance of a landscape.
+
+import vtk
+
+plane = vtk.vtkPlane()
+
+p1 = vtk.vtkPerlinNoise()
+p1.SetFrequency(1, 1, 0)
+
+p2 = vtk.vtkPerlinNoise()
+p2.SetFrequency(3, 5, 0)
+p2.SetPhase(0.5, 0.5, 0)
+
+p3 = vtk.vtkPerlinNoise()
+p3.SetFrequency(16, 16, 0)
+
+sum = vtk.vtkImplicitSum()
+sum.SetNormalizeByWeight(1)
+sum.AddFunction(plane)
+sum.AddFunction(p1, 0.2)
+sum.AddFunction(p2, 0.1)
+sum.AddFunction(p3, 0.02)
+
+sample = vtk.vtkSampleFunction()
+sample.SetImplicitFunction(sum)
+sample.SetSampleDimensions(65, 65, 20)
+sample.SetModelBounds(-1, 1, -1, 1, -0.5, 0.5)
+sample.ComputeNormalsOff()
+surface = vtk.vtkContourFilter()
+surface.SetInputConnection(sample.GetOutputPort())
+surface.SetValue(0, 0.0)
+
+smooth = vtk.vtkPolyDataNormals()
+smooth.SetInputConnection(surface.GetOutputPort())
+smooth.SetFeatureAngle(90)
+
+mapper = vtk.vtkPolyDataMapper()
+mapper.SetInputConnection(smooth.GetOutputPort())
+mapper.ScalarVisibilityOff()
+actor = vtk.vtkActor()
+actor.SetMapper(mapper)
+actor.GetProperty().SetColor(0.4, 0.2, 0.1)
+
+# Create the renderer etc.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(actor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(500, 500)
+ren.ResetCamera()
+ren.GetActiveCamera().Elevation(-45)
+ren.GetActiveCamera().Azimuth(10)
+ren.GetActiveCamera().Dolly(1.35)
+ren.ResetCameraClippingRange()
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Modelling/PerlinTerrain.vt b/examples/vtk_examples/Modelling/PerlinTerrain.vt
new file mode 100644
index 0000000..60ec1b4
Binary files /dev/null and b/examples/vtk_examples/Modelling/PerlinTerrain.vt differ
diff --git a/examples/vtk_examples/Modelling/constrainedDelaunay.py b/examples/vtk_examples/Modelling/constrainedDelaunay.py
new file mode 100644
index 0000000..78bf325
--- /dev/null
+++ b/examples/vtk_examples/Modelling/constrainedDelaunay.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use a constraint polygon in
+# Delaunay triangulation.
+
+import vtk
+from vtk.util.colors import peacock
+
+# Generate the input points and constrained edges/polygons.
+points = vtk.vtkPoints()
+points.InsertPoint(0, 1, 4, 0)
+points.InsertPoint(1, 3, 4, 0)
+points.InsertPoint(2, 7, 4, 0)
+points.InsertPoint(3, 11, 4, 0)
+points.InsertPoint(4, 13, 4, 0)
+points.InsertPoint(5, 13, 8, 0)
+points.InsertPoint(6, 13, 12, 0)
+points.InsertPoint(7, 10, 12, 0)
+points.InsertPoint(8, 7, 12, 0)
+points.InsertPoint(9, 4, 12, 0)
+points.InsertPoint(10, 1, 12, 0)
+points.InsertPoint(11, 1, 8, 0)
+points.InsertPoint(12, 3.5, 5, 0)
+points.InsertPoint(13, 4.5, 5, 0)
+points.InsertPoint(14, 5.5, 8, 0)
+points.InsertPoint(15, 6.5, 8, 0)
+points.InsertPoint(16, 6.5, 5, 0)
+points.InsertPoint(17, 7.5, 5, 0)
+points.InsertPoint(18, 7.5, 8, 0)
+points.InsertPoint(19, 9, 8, 0)
+points.InsertPoint(20, 9, 5, 0)
+points.InsertPoint(21, 10, 5, 0)
+points.InsertPoint(22, 10, 7, 0)
+points.InsertPoint(23, 11, 5, 0)
+points.InsertPoint(24, 12, 5, 0)
+points.InsertPoint(25, 10.5, 8, 0)
+points.InsertPoint(26, 12, 11, 0)
+points.InsertPoint(27, 11, 11, 0)
+points.InsertPoint(28, 10, 9, 0)
+points.InsertPoint(29, 10, 11, 0)
+points.InsertPoint(30, 9, 11, 0)
+points.InsertPoint(31, 9, 9, 0)
+points.InsertPoint(32, 7.5, 9, 0)
+points.InsertPoint(33, 7.5, 11, 0)
+points.InsertPoint(34, 6.5, 11, 0)
+points.InsertPoint(35, 6.5, 9, 0)
+points.InsertPoint(36, 5, 9, 0)
+points.InsertPoint(37, 4, 6, 0)
+points.InsertPoint(38, 3, 9, 0)
+points.InsertPoint(39, 2, 9, 0)
+polys = vtk.vtkCellArray()
+polys.InsertNextCell(12)
+polys.InsertCellPoint(0)
+polys.InsertCellPoint(1)
+polys.InsertCellPoint(2)
+polys.InsertCellPoint(3)
+polys.InsertCellPoint(4)
+polys.InsertCellPoint(5)
+polys.InsertCellPoint(6)
+polys.InsertCellPoint(7)
+polys.InsertCellPoint(8)
+polys.InsertCellPoint(9)
+polys.InsertCellPoint(10)
+polys.InsertCellPoint(11)
+polys.InsertNextCell(28)
+polys.InsertCellPoint(39)
+polys.InsertCellPoint(38)
+polys.InsertCellPoint(37)
+polys.InsertCellPoint(36)
+polys.InsertCellPoint(35)
+polys.InsertCellPoint(34)
+polys.InsertCellPoint(33)
+polys.InsertCellPoint(32)
+polys.InsertCellPoint(31)
+polys.InsertCellPoint(30)
+polys.InsertCellPoint(29)
+polys.InsertCellPoint(28)
+polys.InsertCellPoint(27)
+polys.InsertCellPoint(26)
+polys.InsertCellPoint(25)
+polys.InsertCellPoint(24)
+polys.InsertCellPoint(23)
+polys.InsertCellPoint(22)
+polys.InsertCellPoint(21)
+polys.InsertCellPoint(20)
+polys.InsertCellPoint(19)
+polys.InsertCellPoint(18)
+polys.InsertCellPoint(17)
+polys.InsertCellPoint(16)
+polys.InsertCellPoint(15)
+polys.InsertCellPoint(14)
+polys.InsertCellPoint(13)
+polys.InsertCellPoint(12)
+
+polyData = vtk.vtkPolyData()
+polyData.SetPoints(points)
+polyData.SetPolys(polys)
+
+# Notice this trick. The SetInput() method accepts a vtkPolyData that
+# is also the input to the Delaunay filter. The points of the
+# vtkPolyData are used to generate the triangulation; the polygons are
+# used to create a constraint region. The polygons are very carefully
+# created and ordered in the right direction to indicate inside and
+# outside of the polygon.
+delny = vtk.vtkDelaunay2D()
+delny.SetInput(polyData)
+delny.SetSource(polyData)
+mapMesh = vtk.vtkPolyDataMapper()
+mapMesh.SetInputConnection(delny.GetOutputPort())
+meshActor = vtk.vtkActor()
+meshActor.SetMapper(mapMesh)
+
+# Now we just pretty the mesh up with tubed edges and balls at the
+# vertices.
+extract = vtk.vtkExtractEdges()
+extract.SetInputConnection(delny.GetOutputPort())
+tubes = vtk.vtkTubeFilter()
+tubes.SetInputConnection(extract.GetOutputPort())
+tubes.SetRadius(0.1)
+tubes.SetNumberOfSides(6)
+mapEdges = vtk.vtkPolyDataMapper()
+mapEdges.SetInputConnection(tubes.GetOutputPort())
+edgeActor = vtk.vtkActor()
+edgeActor.SetMapper(mapEdges)
+edgeActor.GetProperty().SetColor(peacock)
+edgeActor.GetProperty().SetSpecularColor(1, 1, 1)
+edgeActor.GetProperty().SetSpecular(0.3)
+edgeActor.GetProperty().SetSpecularPower(20)
+edgeActor.GetProperty().SetAmbient(0.2)
+edgeActor.GetProperty().SetDiffuse(0.8)
+
+# Create the rendering window, renderer, and interactive renderer
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(meshActor)
+ren.AddActor(edgeActor)
+ren.SetBackground(0, 0, 0)
+renWin.SetSize(450, 300)
+
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(2)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Modelling/constrainedDelaunay.vt b/examples/vtk_examples/Modelling/constrainedDelaunay.vt
new file mode 100644
index 0000000..9cdfbc8
Binary files /dev/null and b/examples/vtk_examples/Modelling/constrainedDelaunay.vt differ
diff --git a/examples/vtk_examples/Modelling/faultLines.py b/examples/vtk_examples/Modelling/faultLines.py
new file mode 100644
index 0000000..e3432de
--- /dev/null
+++ b/examples/vtk_examples/Modelling/faultLines.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+# Create a constrained Delaunay triangulation following fault lines. The
+# fault lines serve as constraint edges in the Delaunay triangulation.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+from vtk.util.colors import *
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Generate some points by reading a VTK data file. The data file also
+# has edges that represent constraint lines. This is originally from a
+# geologic horizon.
+reader = vtk.vtkPolyDataReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/faults.vtk")
+
+# Perform a 2D triangulation with constraint edges.
+delny = vtk.vtkDelaunay2D()
+delny.SetInputConnection(reader.GetOutputPort())
+delny.SetSourceConnection(reader.GetOutputPort())
+delny.SetTolerance(0.00001)
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(delny.GetOutputPort())
+mapMesh = vtk.vtkPolyDataMapper()
+mapMesh.SetInputConnection(normals.GetOutputPort())
+meshActor = vtk.vtkActor()
+meshActor.SetMapper(mapMesh)
+meshActor.GetProperty().SetColor(beige)
+
+# Now pretty up the mesh with tubed edges and balls at the vertices.
+tuber = vtk.vtkTubeFilter()
+tuber.SetInputConnection(reader.GetOutputPort())
+tuber.SetRadius(25)
+mapLines = vtk.vtkPolyDataMapper()
+mapLines.SetInputConnection(tuber.GetOutputPort())
+linesActor = vtk.vtkActor()
+linesActor.SetMapper(mapLines)
+linesActor.GetProperty().SetColor(1, 0, 0)
+linesActor.GetProperty().SetColor(tomato)
+
+# Create graphics objects
+# Create the rendering window, renderer, and interactive renderer
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(linesActor)
+ren.AddActor(meshActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(350, 250)
+
+cam1 = vtk.vtkCamera()
+cam1.SetClippingRange(2580, 129041)
+cam1.SetFocalPoint(461550, 6.58e+006, 2132)
+cam1.SetPosition(463960, 6.559e+06, 16982)
+cam1.SetViewUp(-0.321899, 0.522244, 0.78971)
+light = vtk.vtkLight()
+light.SetPosition(0, 0, 1)
+light.SetFocalPoint(0, 0, 0)
+ren.SetActiveCamera(cam1)
+ren.AddLight(light)
+
+ren.GetActiveCamera().Zoom(1.5)
+iren.LightFollowCameraOff()
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Modelling/faultLines.vt b/examples/vtk_examples/Modelling/faultLines.vt
new file mode 100644
index 0000000..0c8ef9b
Binary files /dev/null and b/examples/vtk_examples/Modelling/faultLines.vt differ
diff --git a/examples/vtk_examples/Modelling/hello.py b/examples/vtk_examples/Modelling/hello.py
new file mode 100644
index 0000000..7033dd0
--- /dev/null
+++ b/examples/vtk_examples/Modelling/hello.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use implicit modelling.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+from vtk.util.colors import red, peacock
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create lines which serve as the "seed" geometry. The lines spell the
+# word "hello".
+reader = vtk.vtkPolyDataReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/hello.vtk")
+lineMapper = vtk.vtkPolyDataMapper()
+lineMapper.SetInputConnection(reader.GetOutputPort())
+lineActor = vtk.vtkActor()
+lineActor.SetMapper(lineMapper)
+lineActor.GetProperty().SetColor(red)
+
+# Create implicit model with vtkImplicitModeller. This computes a
+# scalar field which is the distance from the generating geometry. The
+# contour filter then extracts the geoemtry at the distance value 0.25
+# from the generating geometry.
+imp = vtk.vtkImplicitModeller()
+imp.SetInputConnection(reader.GetOutputPort())
+imp.SetSampleDimensions(110, 40, 20)
+imp.SetMaximumDistance(0.25)
+imp.SetModelBounds(-1.0, 10.0, -1.0, 3.0, -1.0, 1.0)
+contour = vtk.vtkContourFilter()
+contour.SetInputConnection(imp.GetOutputPort())
+contour.SetValue(0, 0.25)
+impMapper = vtk.vtkPolyDataMapper()
+impMapper.SetInputConnection(contour.GetOutputPort())
+impMapper.ScalarVisibilityOff()
+impActor = vtk.vtkActor()
+impActor.SetMapper(impMapper)
+impActor.GetProperty().SetColor(peacock)
+impActor.GetProperty().SetOpacity(0.5)
+
+# Create the usual graphics stuff.
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(lineActor)
+ren.AddActor(impActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(600, 250)
+
+camera = vtk.vtkCamera()
+camera.SetClippingRange(1.81325, 90.6627)
+camera.SetFocalPoint(4.5, 1, 0)
+camera.SetPosition(4.5, 1.0, 6.73257)
+camera.SetViewUp(0, 1, 0)
+camera.Zoom(0.8)
+ren.SetActiveCamera(camera)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Modelling/hello.vt b/examples/vtk_examples/Modelling/hello.vt
new file mode 100644
index 0000000..488f8b4
Binary files /dev/null and b/examples/vtk_examples/Modelling/hello.vt differ
diff --git a/examples/vtk_examples/Modelling/iceCream.py b/examples/vtk_examples/Modelling/iceCream.py
new file mode 100644
index 0000000..5cfe59d
--- /dev/null
+++ b/examples/vtk_examples/Modelling/iceCream.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to use boolean combinations of implicit
+# functions to create a model of an ice cream cone.
+
+import vtk
+from vtk.util.colors import chocolate, mint
+
+# Create implicit function primitives. These have been carefully
+# placed to give the effect that we want. We are going to use various
+# combinations of these functions to create the shape we want; for
+# example, we use planes intersected with a cone (which is infinite in
+# extent) to get a finite cone.
+cone = vtk.vtkCone()
+cone.SetAngle(20)
+vertPlane = vtk.vtkPlane()
+vertPlane.SetOrigin(.1, 0, 0)
+vertPlane.SetNormal(-1, 0, 0)
+basePlane = vtk.vtkPlane()
+basePlane.SetOrigin(1.2, 0, 0)
+basePlane.SetNormal(1, 0, 0)
+iceCream = vtk.vtkSphere()
+iceCream.SetCenter(1.333, 0, 0)
+iceCream.SetRadius(0.5)
+bite = vtk.vtkSphere()
+bite.SetCenter(1.5, 0, 0.5)
+bite.SetRadius(0.25)
+
+# Combine primitives to build ice-cream cone. Clip the cone with planes.
+theCone = vtk.vtkImplicitBoolean()
+theCone.SetOperationTypeToIntersection()
+theCone.AddFunction(cone)
+theCone.AddFunction(vertPlane)
+theCone.AddFunction(basePlane)
+
+# Take a bite out of the ice cream.
+theCream = vtk.vtkImplicitBoolean()
+theCream.SetOperationTypeToDifference()
+theCream.AddFunction(iceCream)
+theCream.AddFunction(bite)
+
+# The sample function generates a distance function from the implicit
+# function (which in this case is the cone). This is then contoured to
+# get a polygonal surface.
+theConeSample = vtk.vtkSampleFunction()
+theConeSample.SetImplicitFunction(theCone)
+theConeSample.SetModelBounds(-1, 1.5, -1.25, 1.25, -1.25, 1.25)
+theConeSample.SetSampleDimensions(60, 60, 60)
+theConeSample.ComputeNormalsOff()
+theConeSurface = vtk.vtkContourFilter()
+theConeSurface.SetInputConnection(theConeSample.GetOutputPort())
+theConeSurface.SetValue(0, 0.0)
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection(theConeSurface.GetOutputPort())
+coneMapper.ScalarVisibilityOff()
+coneActor = vtk.vtkActor()
+coneActor.SetMapper(coneMapper)
+coneActor.GetProperty().SetColor(chocolate)
+
+# The same here for the ice cream.
+theCreamSample = vtk.vtkSampleFunction()
+theCreamSample.SetImplicitFunction(theCream)
+theCreamSample.SetModelBounds(0, 2.5, -1.25, 1.25, -1.25, 1.25)
+theCreamSample.SetSampleDimensions(60, 60, 60)
+theCreamSample.ComputeNormalsOff()
+theCreamSurface = vtk.vtkContourFilter()
+theCreamSurface.SetInputConnection(theCreamSample.GetOutputPort())
+theCreamSurface.SetValue(0, 0.0)
+creamMapper = vtk.vtkPolyDataMapper()
+creamMapper.SetInputConnection(theCreamSurface.GetOutputPort())
+creamMapper.ScalarVisibilityOff()
+creamActor = vtk.vtkActor()
+creamActor.SetMapper(creamMapper)
+creamActor.GetProperty().SetColor(mint)
+
+# Create the usual rendering stuff
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(coneActor)
+ren.AddActor(creamActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(250, 250)
+ren.ResetCamera()
+ren.GetActiveCamera().Roll(90)
+ren.GetActiveCamera().Dolly(1.5)
+ren.ResetCameraClippingRange()
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Modelling/iceCream.vt b/examples/vtk_examples/Modelling/iceCream.vt
new file mode 100644
index 0000000..cccdc33
Binary files /dev/null and b/examples/vtk_examples/Modelling/iceCream.vt differ
diff --git a/examples/vtk_examples/Rendering/CADPart.py b/examples/vtk_examples/Rendering/CADPart.py
new file mode 100644
index 0000000..39182bf
--- /dev/null
+++ b/examples/vtk_examples/Rendering/CADPart.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+
+# This simple example shows how to do basic rendering and pipeline
+# creation. It also demonstrates the use of the LODActor.
+
+# Import the VTK-Python module
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+from vtk.util.colors import *
+# Get the location of the data.
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# This creates a polygonal cylinder model with eight circumferential
+# facets.
+part = vtk.vtkSTLReader()
+part.SetFileName(VTK_DATA_ROOT + "/Data/42400-IDGH.stl")
+
+# The mapper is responsible for pushing the geometry into the graphics
+# library. It may also do color mapping, if scalars or other
+# attributes are defined.
+partMapper = vtk.vtkPolyDataMapper()
+partMapper.SetInputConnection(part.GetOutputPort())
+
+# The LOD actor is a special type of actor. It will change appearance
+# in order to render faster. At the highest resolution, it renders
+# ewverything just like an actor. The middle level is a point cloud,
+# and the lowest level is a simple bounding box.
+partActor = vtk.vtkLODActor()
+partActor.SetMapper(partMapper)
+partActor.GetProperty().SetColor(light_grey)
+partActor.RotateX(30.0)
+partActor.RotateY(-45.0)
+
+# Create the graphics structure. The renderer renders into the render
+# window. The render window interactor captures mouse events and will
+# perform appropriate camera or actor manipulation depending on the
+# nature of the events.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(partActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(200, 200)
+
+# We'll zoom in a little by accessing the camera and invoking a "Zoom"
+# method on it.
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.5)
+
+# This starts the event loop.
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Rendering/CADPart.vt b/examples/vtk_examples/Rendering/CADPart.vt
new file mode 100644
index 0000000..688f30c
Binary files /dev/null and b/examples/vtk_examples/Rendering/CADPart.vt differ
diff --git a/examples/vtk_examples/Rendering/Cylinder.py b/examples/vtk_examples/Rendering/Cylinder.py
new file mode 100644
index 0000000..ba4e705
--- /dev/null
+++ b/examples/vtk_examples/Rendering/Cylinder.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+
+# This simple example shows how to do basic rendering and pipeline
+# creation.
+
+import vtk
+# The colors module defines various useful colors.
+from vtk.util.colors import tomato
+
+# This creates a polygonal cylinder model with eight circumferential
+# facets.
+cylinder = vtk.vtkCylinderSource()
+cylinder.SetResolution(8)
+
+# The mapper is responsible for pushing the geometry into the graphics
+# library. It may also do color mapping, if scalars or other
+# attributes are defined.
+cylinderMapper = vtk.vtkPolyDataMapper()
+cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
+
+# The actor is a grouping mechanism: besides the geometry (mapper), it
+# also has a property, transformation matrix, and/or texture map.
+# Here we set its color and rotate it -22.5 degrees.
+cylinderActor = vtk.vtkActor()
+cylinderActor.SetMapper(cylinderMapper)
+cylinderActor.GetProperty().SetColor(tomato)
+cylinderActor.RotateX(30.0)
+cylinderActor.RotateY(-45.0)
+
+# Create the graphics structure. The renderer renders into the render
+# window. The render window interactor captures mouse events and will
+# perform appropriate camera or actor manipulation depending on the
+# nature of the events.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(cylinderActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(200, 200)
+
+# This allows the interactor to initalize itself. It has to be
+# called before an event loop. 
+iren.Initialize()
+
+# We'll zoom in a little by accessing the camera and invoking a "Zoom"
+# method on it.
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.5)
+renWin.Render()
+
+# Start the event loop.
+iren.Start()
diff --git a/examples/vtk_examples/Rendering/Cylinder.vt b/examples/vtk_examples/Rendering/Cylinder.vt
new file mode 100644
index 0000000..52efab4
Binary files /dev/null and b/examples/vtk_examples/Rendering/Cylinder.vt differ
diff --git a/examples/vtk_examples/Rendering/FilterCADPart.py b/examples/vtk_examples/Rendering/FilterCADPart.py
new file mode 100644
index 0000000..7786e73
--- /dev/null
+++ b/examples/vtk_examples/Rendering/FilterCADPart.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# This simple example shows how to do simple filtering in a pipeline.
+# See CADPart.py and Cylinder.py for related information.
+
+import vtk
+from vtk.util.colors import light_grey
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# This creates a polygonal cylinder model with eight circumferential
+# facets.
+part = vtk.vtkSTLReader()
+part.SetFileName(VTK_DATA_ROOT + "/Data/42400-IDGH.stl")
+
+# A filter is a module that takes at least one input and produces at
+# least one output. The SetInput and GetOutput methods are used to do
+# the connection. What is returned by GetOutput is a particulat
+# dataset type. If the type is compatible with the SetInput method,
+# then the filters can be connected together.
+#
+# Here we add a filter that computes surface normals from the geometry.
+shrink = vtk.vtkShrinkPolyData()
+shrink.SetInputConnection(part.GetOutputPort())
+shrink.SetShrinkFactor(0.85)
+
+# The mapper is responsible for pushing the geometry into the graphics
+# library. It may also do color mapping, if scalars or other
+# attributes are defined.
+partMapper = vtk.vtkPolyDataMapper()
+partMapper.SetInputConnection(shrink.GetOutputPort())
+
+# The LOD actor is a special type of actor. It will change appearance
+# in order to render faster. At the highest resolution, it renders
+# ewverything just like an actor. The middle level is a point cloud,
+# and the lowest level is a simple bounding box.
+partActor = vtk.vtkLODActor()
+partActor.SetMapper(partMapper)
+partActor.GetProperty().SetColor(light_grey)
+partActor.RotateX(30.0)
+partActor.RotateY(-45.0)
+
+# Create the graphics structure. The renderer renders into the
+# render window. The render window interactor captures mouse events
+# and will perform appropriate camera or actor manipulation
+# depending on the nature of the events.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(partActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(200, 200)
+
+# We'll zoom in a little by accessing the camera and invoking a "Zoom"
+# method on it.
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.5)
+
+iren.Initialize()
+renWin.Render()
+# Start the event loop.
+iren.Start()
diff --git a/examples/vtk_examples/Rendering/FilterCADPart.vt b/examples/vtk_examples/Rendering/FilterCADPart.vt
new file mode 100644
index 0000000..2fbb69e
Binary files /dev/null and b/examples/vtk_examples/Rendering/FilterCADPart.vt differ
diff --git a/examples/vtk_examples/Rendering/TPlane.py b/examples/vtk_examples/Rendering/TPlane.py
new file mode 100644
index 0000000..3b9d402
--- /dev/null
+++ b/examples/vtk_examples/Rendering/TPlane.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+
+# This simple example shows how to do basic texture mapping.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Load in the texture map. A texture is any unsigned char image. If it
+# is not of this type, you will have to map it through a lookup table
+# or by using vtkImageShiftScale.
+bmpReader = vtk.vtkBMPReader()
+bmpReader.SetFileName(VTK_DATA_ROOT + "/Data/masonry.bmp")
+atext = vtk.vtkTexture()
+atext.SetInputConnection(bmpReader.GetOutputPort())
+atext.InterpolateOn()
+
+# Create a plane source and actor. The vtkPlanesSource generates
+# texture coordinates.
+plane = vtk.vtkPlaneSource()
+planeMapper = vtk.vtkPolyDataMapper()
+planeMapper.SetInputConnection(plane.GetOutputPort())
+planeActor = vtk.vtkActor()
+planeActor.SetMapper(planeMapper)
+planeActor.SetTexture(atext)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(planeActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(500, 500)
+
+ren.ResetCamera()
+cam1 = ren.GetActiveCamera()
+cam1.Elevation(-30)
+cam1.Roll(-20)
+ren.ResetCameraClippingRange()
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Rendering/TPlane.vt b/examples/vtk_examples/Rendering/TPlane.vt
new file mode 100644
index 0000000..e896af0
Binary files /dev/null and b/examples/vtk_examples/Rendering/TPlane.vt differ
diff --git a/examples/vtk_examples/Rendering/assembly.py b/examples/vtk_examples/Rendering/assembly.py
new file mode 100644
index 0000000..27d5dcd
--- /dev/null
+++ b/examples/vtk_examples/Rendering/assembly.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of vtkAssembly.  In an assembly,
+# the motion of one actor affects the position of other actors.
+
+import vtk
+
+# Create four parts: a top level assembly (in this case, a
+# vtkCylinder) and three primitives (using vtkSphereSource,
+# vtkCubeSource, and vtkConeSource).  Set up mappers and actors for
+# each part of the assembly to carry information about material
+# properties and associated geometry.
+sphere = vtk.vtkSphereSource()
+sphereMapper = vtk.vtkPolyDataMapper()
+sphereMapper.SetInputConnection(sphere.GetOutputPort())
+sphereActor = vtk.vtkActor()
+sphereActor.SetMapper(sphereMapper)
+sphereActor.SetOrigin(2, 1, 3)
+sphereActor.RotateY(6)
+sphereActor.SetPosition(2.25, 0, 0)
+sphereActor.GetProperty().SetColor(1, 0, 1)
+
+cube = vtk.vtkCubeSource()
+cubeMapper = vtk.vtkPolyDataMapper()
+cubeMapper.SetInputConnection(cube.GetOutputPort())
+cubeActor = vtk.vtkActor()
+cubeActor.SetMapper(cubeMapper)
+cubeActor.SetPosition(0.0, .25, 0)
+cubeActor.GetProperty().SetColor(0, 0, 1)
+
+cone = vtk.vtkConeSource()
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection(cone.GetOutputPort())
+coneActor = vtk.vtkActor()
+coneActor.SetMapper(coneMapper)
+coneActor.SetPosition(0, 0, .25)
+coneActor.GetProperty().SetColor(0, 1, 0)
+
+# top part of the assembly
+cylinder = vtk.vtkCylinderSource()
+cylinderMapper = vtk.vtkPolyDataMapper()
+cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
+cylinderMapper.SetResolveCoincidentTopologyToPolygonOffset()
+cylinderActor = vtk.vtkActor()
+cylinderActor.SetMapper(cylinderMapper)
+cylinderActor.GetProperty().SetColor(1, 0, 0)
+
+# Create the assembly and add the 4 parts to it.  Also set the origin,
+# position and orientation in space.
+assembly = vtk.vtkAssembly()
+assembly.AddPart(cylinderActor)
+assembly.AddPart(sphereActor)
+assembly.AddPart(cubeActor)
+assembly.AddPart(coneActor)
+assembly.SetOrigin(5, 10, 15)
+assembly.AddPosition(5, 0, 0)
+assembly.RotateX(15)
+
+# Create the Renderer, RenderWindow, and RenderWindowInteractor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(assembly)
+ren.AddActor(coneActor)
+ren.SetBackground(0.1, 0.2, 0.4)
+renWin.SetSize(200, 200)
+
+# Set up the camera to get a particular view of the scene
+camera = vtk.vtkCamera()
+camera.SetClippingRange(21.9464, 30.0179)
+camera.SetFocalPoint(3.49221, 2.28844, -0.970866)
+camera.SetPosition(3.49221, 2.28844, 24.5216)
+camera.SetViewAngle(30)
+camera.SetViewUp(0, 1, 0)
+ren.SetActiveCamera(camera)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Rendering/assembly.vt b/examples/vtk_examples/Rendering/assembly.vt
new file mode 100644
index 0000000..5f767dd
Binary files /dev/null and b/examples/vtk_examples/Rendering/assembly.vt differ
diff --git a/examples/vtk_examples/Rendering/rainbow.py b/examples/vtk_examples/Rendering/rainbow.py
new file mode 100644
index 0000000..9cbab9d
--- /dev/null
+++ b/examples/vtk_examples/Rendering/rainbow.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use and manipulation of lookup tables.
+
+import vtk
+from vtk.util.colors import *
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# First create pipeline a simple pipeline that reads a structure grid
+# and then extracts a plane from the grid. The plane will be colored
+# differently by using different lookup tables.
+#
+# Note: the Update method is manually invoked because it causes the
+# reader to read; later on we use the output of the reader to set
+# a range for the scalar values.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+plane = vtk.vtkStructuredGridGeometryFilter()
+plane.SetInputConnection(pl3d.GetOutputPort())
+plane.SetExtent(1, 100, 1, 100, 7, 7)
+lut = vtk.vtkLookupTable()
+planeMapper = vtk.vtkPolyDataMapper()
+planeMapper.SetLookupTable(lut)
+planeMapper.SetInputConnection(plane.GetOutputPort())
+planeMapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+planeActor = vtk.vtkActor()
+planeActor.SetMapper(planeMapper)
+
+# This creates an outline around the data.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Much of the following is commented out. To try different lookup tables,
+# uncommented the appropriate portions.
+
+# This creates a black to white lut.
+##lut.SetHueRange(0, 0)
+##lut.SetSaturationRange(0, 0)
+##lut.SetValueRange(0.2, 1.0)
+
+# This creates a red to blue lut.
+##lut.SetHueRange(0.0, 0.667)
+
+# This creates a blue to red lut.
+##lut.SetHueRange(0.667, 0.0)
+
+# This creates a wierd effect. The Build() method causes the lookup
+# table to allocate memory and create a table based on the currect
+# hue, saturation, value, and alpha (transparency) range. Here we then
+# manually overwrite the values generated by the Build() method.
+lut.SetNumberOfColors(256)
+lut.Build()
+for i in range(0, 16):
+    lut.SetTableValue(i*16, red[0], red[1], red[2], 1)
+    lut.SetTableValue(i*16+1, green[0], green[1], green[2], 1)
+    lut.SetTableValue(i*16+2, blue[0], blue[1], blue[2], 1)
+    lut.SetTableValue(i*16+3, black[0], black[1], black[2], 1)
+
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(planeActor)
+
+ren.SetBackground(0.1, 0.2, 0.4)
+ren.TwoSidedLightingOff()
+
+renWin.SetSize(250, 250)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(8.88908, 0.595038, 29.3342)
+cam1.SetPosition(-12.3332, 31.7479, 41.2387)
+cam1.SetViewUp(0.060772, -0.319905, 0.945498)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/Rendering/rainbow.vt b/examples/vtk_examples/Rendering/rainbow.vt
new file mode 100644
index 0000000..6ead42d
Binary files /dev/null and b/examples/vtk_examples/Rendering/rainbow.vt differ
diff --git a/examples/vtk_examples/Tutorial/Step1/Cone.py b/examples/vtk_examples/Tutorial/Step1/Cone.py
new file mode 100644
index 0000000..ca13fca
--- /dev/null
+++ b/examples/vtk_examples/Tutorial/Step1/Cone.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+#
+# This example creates a polygonal model of a cone, and then renders it to
+# the screen. It will rotate the cone 360 degrees and then exit. The basic
+# setup of source -> mapper -> actor -> renderer -> renderwindow is 
+# typical of most VTK programs.
+#
+
+#
+# First we include the VTK Python packages that will make available 
+# all of the VTK commands to Python.
+#
+import vtk
+import time
+
+# 
+# Next we create an instance of vtkConeSource and set some of its
+# properties. The instance of vtkConeSource "cone" is part of a visualization
+# pipeline (it is a source process object); it produces data (output type is
+# vtkPolyData) which other filters may process.
+#
+cone = vtk.vtkConeSource()
+cone.SetHeight( 3.0 )
+cone.SetRadius( 1.0 )
+cone.SetResolution( 10 )
+  
+# 
+# In this example we terminate the pipeline with a mapper process object.
+# (Intermediate filters such as vtkShrinkPolyData could be inserted in
+# between the source and the mapper.)  We create an instance of
+# vtkPolyDataMapper to map the polygonal data into graphics primitives. We
+# connect the output of the cone souece to the input of this mapper.
+#
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection( cone.GetOutputPort() )
+
+# 
+# Create an actor to represent the cone. The actor orchestrates rendering of
+# the mapper's graphics primitives. An actor also refers to properties via a
+# vtkProperty instance, and includes an internal transformation matrix. We
+# set this actor's mapper to be coneMapper which we created above.
+#
+coneActor = vtk.vtkActor()
+coneActor.SetMapper( coneMapper )
+
+#
+# Create the Renderer and assign actors to it. A renderer is like a
+# viewport. It is part or all of a window on the screen and it is
+# responsible for drawing the actors it has.  We also set the background
+# color here
+#
+ren1= vtk.vtkRenderer()
+ren1.AddActor( coneActor )
+ren1.SetBackground( 0.1, 0.2, 0.4 )
+
+#
+# Finally we create the render window which will show up on the screen
+# We put our renderer into the render window using AddRenderer. We also
+# set the size to be 300 pixels by 300
+#
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer( ren1 )
+renWin.SetSize( 300, 300 )
+
+#
+# now we loop over 360 degreeees and render the cone each time
+#
+# for i in range(0,360):
+#     time.sleep(0.03)
+
+#     renWin.Render()
+#     ren1.GetActiveCamera().Azimuth( 1 )
diff --git a/examples/vtk_examples/Tutorial/Step1/Cone.vt b/examples/vtk_examples/Tutorial/Step1/Cone.vt
new file mode 100644
index 0000000..db705e0
Binary files /dev/null and b/examples/vtk_examples/Tutorial/Step1/Cone.vt differ
diff --git a/examples/vtk_examples/Tutorial/Step2/Cone2.py b/examples/vtk_examples/Tutorial/Step2/Cone2.py
new file mode 100644
index 0000000..d2a7332
--- /dev/null
+++ b/examples/vtk_examples/Tutorial/Step2/Cone2.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#
+#
+# This example shows how to add an observer to a Python program. It extends
+# the Step1/Python/Cone.py Python example (see that example for information on
+# the basic setup). 
+#
+# VTK uses a command/observer design pattern. That is, observers watch for
+# particular events that any vtkObject (or subclass) may invoke on
+# itself. For example, the vtkRenderer invokes a "StartEvent" as it begins
+# to render. Here we add an observer that invokes a command when this event
+# is observed.
+#
+
+import vtk
+import time
+
+#
+# define the callback
+#
+def myCallback(obj,string):
+    print "Starting a render"
+
+
+#
+# create the basic pipeline as in Step1
+#
+cone = vtk.vtkConeSource()
+cone.SetHeight( 3.0 )
+cone.SetRadius( 1.0 )
+cone.SetResolution( 10 )
+  
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection( cone.GetOutputPort() )
+coneActor = vtk.vtkActor()
+coneActor.SetMapper( coneMapper )
+
+ren1= vtk.vtkRenderer()
+ren1.AddActor( coneActor )
+ren1.SetBackground( 0.1, 0.2, 0.4 )
+
+#
+# Add the observer here
+#
+ren1.AddObserver("StartEvent", myCallback)
+
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer( ren1 )
+renWin.SetSize( 300, 300 )
+
+#
+# now we loop over 360 degreeees and render the cone each time
+#
+# for i in range(0,360):
+#     time.sleep(0.03)
+#     renWin.Render()
+#     ren1.GetActiveCamera().Azimuth( 1 )
+  
diff --git a/examples/vtk_examples/Tutorial/Step2/Cone2.vt b/examples/vtk_examples/Tutorial/Step2/Cone2.vt
new file mode 100644
index 0000000..2b3dd53
Binary files /dev/null and b/examples/vtk_examples/Tutorial/Step2/Cone2.vt differ
diff --git a/examples/vtk_examples/Tutorial/Step3/Cone3.py b/examples/vtk_examples/Tutorial/Step3/Cone3.py
new file mode 100644
index 0000000..0912f50
--- /dev/null
+++ b/examples/vtk_examples/Tutorial/Step3/Cone3.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+#
+# This example demonstrates how to use multiple renderers within a
+# render window. It is a variation of the Cone.py example. Please
+# refer to that example for additional documentation.
+#
+
+import vtk
+import time
+
+# 
+# Next we create an instance of vtkConeSource and set some of its
+# properties. The instance of vtkConeSource "cone" is part of a visualization
+# pipeline (it is a source process object); it produces data (output type is
+# vtkPolyData) which other filters may process.
+#
+cone = vtk.vtkConeSource()
+cone.SetHeight( 3.0 )
+cone.SetRadius( 1.0 )
+cone.SetResolution( 10 )
+
+# 
+# In this example we terminate the pipeline with a mapper process object.
+# (Intermediate filters such as vtkShrinkPolyData could be inserted in
+# between the source and the mapper.)  We create an instance of
+# vtkPolyDataMapper to map the polygonal data into graphics primitives. We
+# connect the output of the cone souece to the input of this mapper.
+#
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection(cone.GetOutputPort())
+
+# 
+# Create an actor to represent the cone. The actor orchestrates rendering of
+# the mapper's graphics primitives. An actor also refers to properties via a
+# vtkProperty instance, and includes an internal transformation matrix. We
+# set this actor's mapper to be coneMapper which we created above.
+#
+coneActor = vtk.vtkActor()
+coneActor.SetMapper(coneMapper)
+
+# 
+# Create two renderers and assign actors to them. A renderer renders into a
+# viewport within the vtkRenderWindow. It is part or all of a window on the
+# screen and it is responsible for drawing the actors it has.  We also set
+# the background color here. In this example we are adding the same actor
+# to two different renderers; it is okay to add different actors to
+# different renderers as well.
+#
+ren1 = vtk.vtkRenderer()
+ren1.AddActor(coneActor)
+ren1.SetBackground(0.1, 0.2, 0.4)
+ren1.SetViewport(0.0, 0.0, 0.5, 1.0)
+
+ren2 = vtk.vtkRenderer()
+ren2.AddActor(coneActor)
+ren2.SetBackground(0.1, 0.2, 0.4)
+ren2.SetViewport(0.5, 0.0, 1.0, 1.0)
+
+#
+# Finally we create the render window which will show up on the screen.
+# We add our two renderers into the render window using AddRenderer. We also
+# set the size to be 600 pixels by 300.
+#
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer( ren1 )
+renWin.AddRenderer( ren2 )
+renWin.SetSize(600, 300)
+
+#
+# Make one camera view 90 degrees from other.
+#
+ren1.ResetCamera()
+ren1.GetActiveCamera().Azimuth(90)
+
+#
+# Now we loop over 360 degreeees and render the cone each time.
+#
+# for i in range(0,360):
+#     time.sleep(0.03)
+    
+#     renWin.Render()
+#     ren1.GetActiveCamera().Azimuth( 1 )
+#     ren2.GetActiveCamera().Azimuth( 1 )
diff --git a/examples/vtk_examples/Tutorial/Step3/Cone3.vt b/examples/vtk_examples/Tutorial/Step3/Cone3.vt
new file mode 100644
index 0000000..6648e35
Binary files /dev/null and b/examples/vtk_examples/Tutorial/Step3/Cone3.vt differ
diff --git a/examples/vtk_examples/Tutorial/Step4/Cone4.py b/examples/vtk_examples/Tutorial/Step4/Cone4.py
new file mode 100644
index 0000000..05e68e6
--- /dev/null
+++ b/examples/vtk_examples/Tutorial/Step4/Cone4.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+#
+# This example demonstrates the creation of multiple actors and the
+# manipulation of their properties and transformations. It is a
+# derivative of Cone.py, see that example for more information.
+#
+
+import vtk
+import time
+
+# 
+# Next we create an instance of vtkConeSource and set some of its
+# properties. The instance of vtkConeSource "cone" is part of a visualization
+# pipeline (it is a source process object); it produces data (output type is
+# vtkPolyData) which other filters may process.
+#
+cone = vtk.vtkConeSource ()
+cone.SetHeight( 3.0 )
+cone.SetRadius( 1.0 )
+cone.SetResolution( 10 )
+
+# 
+# In this example we terminate the pipeline with a mapper process object.
+# (Intermediate filters such as vtkShrinkPolyData could be inserted in
+# between the source and the mapper.)  We create an instance of
+# vtkPolyDataMapper to map the polygonal data into graphics primitives. We
+# connect the output of the cone souece to the input of this mapper.
+#
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection(cone.GetOutputPort())
+
+# 
+# Create an actor to represent the first cone. The actor's properties are
+# modified to give it different surface properties. By default, an actor
+# is create with a property so the GetProperty() method can be used.
+#
+coneActor = vtk.vtkActor()
+coneActor.SetMapper(coneMapper)
+coneActor.GetProperty().SetColor(0.2, 0.63, 0.79)
+coneActor.GetProperty().SetDiffuse(0.7)
+coneActor.GetProperty().SetSpecular(0.4)
+coneActor.GetProperty().SetSpecularPower(20)
+
+#
+# Create a property and directly manipulate it. Assign it to the
+# second actor.
+#
+property = vtk.vtkProperty()
+property.SetColor(1.0, 0.3882, 0.2784)
+property.SetDiffuse(0.7)
+property.SetSpecular(0.4)
+property.SetSpecularPower(20)
+
+#
+# Create a second actor and a property. The property is directly
+# manipulated and then assigned to the actor. In this way, a single
+# property can be shared among many actors. Note also that we use the
+# same mapper as the first actor did. This way we avoid duplicating
+# geometry, which may save lots of memory if the geoemtry is large.
+coneActor2 = vtk.vtkActor()
+coneActor2.SetMapper(coneMapper)
+# coneActor2.GetProperty().SetColor(0.2, 0.63, 0.79)
+coneActor2.SetProperty(property)
+coneActor2.SetPosition(0, 2, 0)
+
+#
+# Create the Renderer and assign actors to it. A renderer is like a
+# viewport. It is part or all of a window on the screen and it is responsible
+# for drawing the actors it has.  We also set the background color here.
+#
+ren1 = vtk.vtkRenderer()
+ren1.AddActor(coneActor)
+ren1.AddActor(coneActor2)
+ren1.SetBackground(0.1, 0.2, 0.4)
+
+#
+# Finally we create the render window which will show up on the screen
+# We put our renderer into the render window using AddRenderer. We also
+# set the size to be 300 pixels by 300.
+#
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren1)
+renWin.SetSize(300, 300)
+
+#
+# Now we loop over 360 degreeees and render the cone each time.
+#
+# for i in range(0,360):
+#     time.sleep(0.03)
+    
+#     renWin.Render()
+#     ren1.GetActiveCamera().Azimuth( 1 )
+
diff --git a/examples/vtk_examples/Tutorial/Step4/Cone4.vt b/examples/vtk_examples/Tutorial/Step4/Cone4.vt
new file mode 100644
index 0000000..300acf9
Binary files /dev/null and b/examples/vtk_examples/Tutorial/Step4/Cone4.vt differ
diff --git a/examples/vtk_examples/Tutorial/Step5/Cone5.py b/examples/vtk_examples/Tutorial/Step5/Cone5.py
new file mode 100644
index 0000000..1380583
--- /dev/null
+++ b/examples/vtk_examples/Tutorial/Step5/Cone5.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+#
+# This example introduces the concepts of user interaction with VTK.
+# First, a different interaction style (than the default) is defined.
+# Second, the interaction is started. 
+#
+#
+
+import vtk
+
+# 
+# Next we create an instance of vtkConeSource and set some of its
+# properties. The instance of vtkConeSource "cone" is part of a visualization
+# pipeline (it is a source process object); it produces data (output type is
+# vtkPolyData) which other filters may process.
+#
+cone = vtk.vtkConeSource()
+cone.SetHeight( 3.0 )
+cone.SetRadius( 1.0 )
+cone.SetResolution( 10 )
+
+# 
+# In this example we terminate the pipeline with a mapper process object.
+# (Intermediate filters such as vtkShrinkPolyData could be inserted in
+# between the source and the mapper.)  We create an instance of
+# vtkPolyDataMapper to map the polygonal data into graphics primitives. We
+# connect the output of the cone souece to the input of this mapper.
+#
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection(cone.GetOutputPort())
+
+# 
+# Create an actor to represent the cone. The actor orchestrates rendering of
+# the mapper's graphics primitives. An actor also refers to properties via a
+# vtkProperty instance, and includes an internal transformation matrix. We
+# set this actor's mapper to be coneMapper which we created above.
+#
+coneActor = vtk.vtkActor()
+coneActor.SetMapper(coneMapper)
+
+#
+# Create the Renderer and assign actors to it. A renderer is like a
+# viewport. It is part or all of a window on the screen and it is responsible
+# for drawing the actors it has.  We also set the background color here.
+#
+ren1 = vtk.vtkRenderer()
+ren1.AddActor(coneActor)
+ren1.SetBackground(0.1, 0.2, 0.4)
+
+#
+# Finally we create the render window which will show up on the screen
+# We put our renderer into the render window using AddRenderer. We also
+# set the size to be 300 pixels by 300.
+#
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren1)
+renWin.SetSize(300, 300)
+
+# 
+# The vtkRenderWindowInteractor class watches for events (e.g., keypress,
+# mouse) in the vtkRenderWindow. These events are translated into
+# event invocations that VTK understands (see VTK/Common/vtkCommand.h
+# for all events that VTK processes). Then observers of these VTK
+# events can process them as appropriate.
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+#
+# By default the vtkRenderWindowInteractor instantiates an instance
+# of vtkInteractorStyle. vtkInteractorStyle translates a set of events
+# it observes into operations on the camera, actors, and/or properties
+# in the vtkRenderWindow associated with the vtkRenderWinodwInteractor. 
+# Here we specify a particular interactor style.
+style = vtk.vtkInteractorStyleTrackballCamera()
+iren.SetInteractorStyle(style)
+
+#
+# Unlike the previous scripts where we performed some operations and then
+# exited, here we leave an event loop running. The user can use the mouse
+# and keyboard to perform the operations on the scene according to the
+# current interaction style.
+#
+
+#
+# Initialize and start the event loop. Once the render window appears, mouse
+# in the window to move the camera. The Start() method executes an event
+# loop which listens to user mouse and keyboard events. Note that keypress-e
+# exits the event loop. (Look in vtkInteractorStyle.h for a summary of events, or
+# the appropriate Doxygen documentation.)
+#
+iren.Initialize()
+iren.Start()
diff --git a/examples/vtk_examples/Tutorial/Step5/Cone5.vt b/examples/vtk_examples/Tutorial/Step5/Cone5.vt
new file mode 100644
index 0000000..029e9a6
Binary files /dev/null and b/examples/vtk_examples/Tutorial/Step5/Cone5.vt differ
diff --git a/examples/vtk_examples/Tutorial/Step6/Cone6.py b/examples/vtk_examples/Tutorial/Step6/Cone6.py
new file mode 100644
index 0000000..2a47c45
--- /dev/null
+++ b/examples/vtk_examples/Tutorial/Step6/Cone6.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+#
+# This example introduces 3D widgets. 3D widgets take advantage of the
+# event/observer design pattern introduced previously. They typically
+# have a particular representation in the scene which can be interactively
+# selected and manipulated using the mouse and keyboard. As the widgets
+# are manipulated, they in turn invoke events such as StartInteractionEvent,
+# InteractionEvent, and EndInteractionEvent which can be used to manipulate
+# the scene that the widget is embedded in. 3D widgets work in the context
+# of the event loop which was set up in the previous example.
+#
+# Note: there are more 3D widget examples in VTK/Examples/GUI/.
+#
+
+# First we import the VTK Python package that will make available all
+# of the VTK commands to Python.
+import vtk
+
+# Next we create an instance of vtkConeSource and set some of its
+# properties. The instance of vtkConeSource "cone" is part of a
+# visualization pipeline (it is a source process object); it produces
+# data (output type is vtkPolyData) which other filters may process.
+cone = vtk.vtkConeSource()
+cone.SetHeight(3.0)
+cone.SetRadius(1.0)
+cone.SetResolution(10)
+
+# In this example we terminate the pipeline with a mapper process object.
+# (Intermediate filters such as vtkShrinkPolyData could be inserted in
+# between the source and the mapper.)  We create an instance of
+# vtkPolyDataMapper to map the polygonal data into graphics primitives. We
+# connect the output of the cone souece to the input of this mapper.
+coneMapper = vtk.vtkPolyDataMapper()
+coneMapper.SetInputConnection(cone.GetOutputPort())
+
+# Create an actor to represent the cone. The actor orchestrates rendering of
+# the mapper's graphics primitives. An actor also refers to properties via a
+# vtkProperty instance, and includes an internal transformation matrix. We
+# set this actor's mapper to be coneMapper which we created above.
+coneActor = vtk.vtkActor()
+coneActor.SetMapper(coneMapper)
+
+# Create the Renderer and assign actors to it. A renderer is like a
+# viewport. It is part or all of a window on the screen and it is
+# responsible for drawing the actors it has.  We also set the
+# background color here.
+ren1 = vtk.vtkRenderer()
+ren1.AddActor(coneActor)
+ren1.SetBackground(0.1, 0.2, 0.4)
+
+# Finally we create the render window which will show up on the screen
+# We put our renderer into the render window using AddRenderer. We
+# also set the size to be 300 pixels by 300.
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren1)
+renWin.SetSize(300, 300)
+
+# The vtkRenderWindowInteractor class watches for events (e.g., keypress,
+# mouse) in the vtkRenderWindow. These events are translated into
+# event invocations that VTK understands (see VTK/Common/vtkCommand.h
+# for all events that VTK processes). Then observers of these VTK
+# events can process them as appropriate.
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# By default the vtkRenderWindowInteractor instantiates an instance
+# of vtkInteractorStyle. vtkInteractorStyle translates a set of events
+# it observes into operations on the camera, actors, and/or properties
+# in the vtkRenderWindow associated with the vtkRenderWinodwInteractor. 
+# Here we specify a particular interactor style.
+style = vtk.vtkInteractorStyleTrackballCamera()
+iren.SetInteractorStyle(style)
+
+
+# Here we use a vtkBoxWidget to transform the underlying coneActor (by
+# manipulating its transformation matrix). Many other types of widgets
+# are available for use, see the documentation for more details.
+#
+# The SetInteractor method is how 3D widgets are associated with the render
+# window interactor. Internally, SetInteractor sets up a bunch of callbacks
+# using the Command/Observer mechanism (AddObserver()). The place factor 
+# controls the initial size of the widget with respect to the bounding box
+# of the input to the widget.
+boxWidget = vtk.vtkBoxWidget()
+boxWidget.SetInteractor(iren)
+boxWidget.SetPlaceFactor(1.25)
+
+# Place the interactor initially. The input to a 3D widget is used to
+# initially position and scale the widget. The EndInteractionEvent is
+# observed which invokes the SelectPolygons callback.
+boxWidget.SetProp3D(coneActor)
+boxWidget.PlaceWidget()
+
+# Similar to Step2/Python/Cone2.py, we define a callback for
+# interaction.  As can be seen the callback takes two arguments.  The
+# first being the object that generates the event and the second
+# argument the event name (which is a string).
+t = vtk.vtkTransform()
+def myCallback(widget, event_string):
+    boxWidget.GetTransform(t)
+    boxWidget.GetProp3D().SetUserTransform(t)
+        
+
+# Now for every interaction event that is generated by the boxWidget,
+# call our callback function.
+boxWidget.AddObserver("InteractionEvent", myCallback)
+
+# Normally the user presses the "i" key to bring a 3D widget to
+# life. Here we will manually enable it so it appears with the cone.
+# boxWidget.On()
+
+# Start the event loop.
+iren.Initialize()
+iren.Start()
+
+# There is no explicit need to free any objects at this point.
+# Once Python exits, memory is automatically freed.
diff --git a/examples/vtk_examples/Tutorial/Step6/Cone6.vt b/examples/vtk_examples/Tutorial/Step6/Cone6.vt
new file mode 100644
index 0000000..ea00e49
Binary files /dev/null and b/examples/vtk_examples/Tutorial/Step6/Cone6.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/BandContourTerrain.py b/examples/vtk_examples/VisualizationAlgorithms/BandContourTerrain.py
new file mode 100644
index 0000000..7911b2d
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/BandContourTerrain.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+
+# In this example we show the use of the
+# vtkBandedPolyDataContourFilter.  This filter creates separate,
+# constant colored bands for a range of scalar values. Each band is
+# bounded by two scalar values, and the cell data lying within the
+# value has the same cell scalar value.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+
+# The lookup table is similar to that used by maps. Two hues are used:
+# a brown for land, and a blue for water. The value of the hue is
+# changed to give the effect of elevation.
+Scale = 5
+lutWater = vtk.vtkLookupTable()
+lutWater.SetNumberOfColors(10)
+lutWater.SetHueRange(0.58, 0.58)
+lutWater.SetSaturationRange(0.5, 0.1)
+lutWater.SetValueRange(0.5, 1.0)
+lutWater.Build()
+lutLand = vtk.vtkLookupTable()
+lutLand.SetNumberOfColors(10)
+lutLand.SetHueRange(0.1, 0.1)
+lutLand.SetSaturationRange(0.4, 0.1)
+lutLand.SetValueRange(0.55, 0.9)
+lutLand.Build()
+
+
+# The DEM reader reads data and creates an output image.
+demModel = vtk.vtkDEMReader()
+demModel.SetFileName(VTK_DATA_ROOT + "/Data/SainteHelens.dem")
+demModel.Update()
+
+# We shrink the terrain data down a bit to yield better performance for 
+# this example.
+shrinkFactor = 4
+shrink = vtk.vtkImageShrink3D()
+shrink.SetShrinkFactors(shrinkFactor, shrinkFactor, 1)
+shrink.SetInputConnection(demModel.GetOutputPort())
+shrink.AveragingOn()
+
+# Convert the image into polygons.
+geom = vtk.vtkImageDataGeometryFilter()
+geom.SetInputConnection(shrink.GetOutputPort())
+
+# Warp the polygons based on elevation.
+warp = vtk.vtkWarpScalar()
+warp.SetInputConnection(geom.GetOutputPort())
+warp.SetNormal(0, 0, 1)
+warp.UseNormalOn()
+warp.SetScaleFactor(Scale)
+
+# Create the contour bands.
+bcf = vtk.vtkBandedPolyDataContourFilter()
+bcf.SetInput(warp.GetPolyDataOutput())
+bcf.GenerateValues(15, demModel.GetOutput().GetScalarRange())
+bcf.SetScalarModeToIndex()
+bcf.GenerateContourEdgesOn()
+
+# Compute normals to give a better look.
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(bcf.GetOutputPort())
+normals.SetFeatureAngle(60)
+normals.ConsistencyOff()
+normals.SplittingOff()
+
+demMapper = vtk.vtkPolyDataMapper()
+demMapper.SetInputConnection(normals.GetOutputPort())
+demMapper.SetScalarRange(0, 10)
+demMapper.SetLookupTable(lutLand)
+demMapper.SetScalarModeToUseCellData()
+
+demActor = vtk.vtkLODActor()
+demActor.SetMapper(demMapper)
+
+## Create contour edges
+edgeMapper = vtk.vtkPolyDataMapper()
+edgeMapper.SetInput(bcf.GetContourEdgesOutput())
+edgeMapper.SetResolveCoincidentTopologyToPolygonOffset()
+edgeActor = vtk.vtkActor()
+edgeActor.SetMapper(edgeMapper)
+edgeActor.GetProperty().SetColor(0, 0, 0)
+
+## Test clipping
+# Create the contour bands.
+bcf2 = vtk.vtkBandedPolyDataContourFilter()
+bcf2.SetInput(warp.GetPolyDataOutput())
+bcf2.ClippingOn()
+bcf2.GenerateValues(10, 1000, 2000)
+bcf2.SetScalarModeToValue()
+
+# Compute normals to give a better look.
+normals2 = vtk.vtkPolyDataNormals()
+normals2.SetInputConnection(bcf2.GetOutputPort())
+normals2.SetFeatureAngle(60)
+normals2.ConsistencyOff()
+normals2.SplittingOff()
+
+lut = vtk.vtkLookupTable()
+lut.SetNumberOfColors(10)
+demMapper2 = vtk.vtkPolyDataMapper()
+demMapper2.SetInputConnection(normals2.GetOutputPort())
+demMapper2.SetScalarRange(demModel.GetOutput().GetScalarRange())
+demMapper2.SetLookupTable(lut)
+demMapper2.SetScalarModeToUseCellData()
+
+demActor2 = vtk.vtkLODActor()
+demActor2.SetMapper(demMapper2)
+demActor2.AddPosition(0, 15000, 0)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(demActor)
+ren.AddActor(demActor2)
+ren.AddActor(edgeActor)
+
+ren.SetBackground(.4, .4, .4)
+renWin.SetSize(375, 200)
+
+cam = vtk.vtkCamera()
+cam.SetPosition(-17438.8, 2410.62, 25470.8)
+cam.SetFocalPoint(3985.35, 11930.6, 5922.14)
+cam.SetViewUp(0, 0, 1)
+ren.SetActiveCamera(cam)
+ren.ResetCamera()
+cam.Zoom(2)
+
+iren.Initialize()
+iren.SetDesiredUpdateRate(1)
+
+def CheckAbort(obj, event):
+    foo = renWin.GetEventPending()
+    if foo != 0:
+        renWin.SetAbortRender(1)
+
+renWin.AddObserver("AbortCheckEvent", CheckAbort)
+renWin.Render()
+
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/BandContourTerrain.vt b/examples/vtk_examples/VisualizationAlgorithms/BandContourTerrain.vt
new file mode 100644
index 0000000..7cb3857
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/BandContourTerrain.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ClipCow.py b/examples/vtk_examples/VisualizationAlgorithms/ClipCow.py
new file mode 100644
index 0000000..78428a4
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/ClipCow.py
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+
+# In this example vtkClipPolyData is used to cut a polygonal model
+# of a cow in half. In addition, the open clip is closed by triangulating
+# the resulting complex polygons.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+from vtk.util.colors import peacock, tomato
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# First start by reading a cow model. We also generate surface normals for
+# prettier rendering.
+cow = vtk.vtkBYUReader()
+cow.SetGeometryFileName(VTK_DATA_ROOT + "/Data/Viewpoint/cow.g")
+cowNormals = vtk.vtkPolyDataNormals()
+cowNormals.SetInputConnection(cow.GetOutputPort())
+
+# We clip with an implicit function. Here we use a plane positioned near
+# the center of the cow model and oriented at an arbitrary angle.
+plane = vtk.vtkPlane()
+plane.SetOrigin(0.25, 0, 0)
+plane.SetNormal(-1, -1, 0)
+
+# vtkClipPolyData requires an implicit function to define what it is to
+# clip with. Any implicit function, including complex boolean combinations
+# can be used. Notice that we can specify the value of the implicit function
+# with the SetValue method.
+clipper = vtk.vtkClipPolyData()
+clipper.SetInputConnection(cowNormals.GetOutputPort())
+clipper.SetClipFunction(plane)
+clipper.GenerateClipScalarsOn()
+clipper.GenerateClippedOutputOn()
+clipper.SetValue(0.5)
+clipMapper = vtk.vtkPolyDataMapper()
+clipMapper.SetInputConnection(clipper.GetOutputPort())
+clipMapper.ScalarVisibilityOff()
+backProp = vtk.vtkProperty()
+backProp.SetDiffuseColor(tomato)
+clipActor = vtk.vtkActor()
+clipActor.SetMapper(clipMapper)
+clipActor.GetProperty().SetColor(peacock)
+clipActor.SetBackfaceProperty(backProp)
+
+# Here we are cutting the cow. Cutting creates lines where the cut
+# function intersects the model. (Clipping removes a portion of the
+# model but the dimension of the data does not change.)
+#
+# The reason we are cutting is to generate a closed polygon at the
+# boundary of the clipping process. The cutter generates line
+# segments, the stripper then puts them together into polylines. We
+# then pull a trick and define polygons using the closed line
+# segements that the stripper created.
+cutEdges = vtk.vtkCutter()
+cutEdges.SetInputConnection(cowNormals.GetOutputPort())
+cutEdges.SetCutFunction(plane)
+cutEdges.GenerateCutScalarsOn()
+cutEdges.SetValue(0, 0.5)
+cutStrips = vtk.vtkStripper()
+cutStrips.SetInputConnection(cutEdges.GetOutputPort())
+cutStrips.Update()
+cutPoly = vtk.vtkPolyData()
+cutPoly.SetPoints(cutStrips.GetOutput().GetPoints())
+cutPoly.SetPolys(cutStrips.GetOutput().GetLines())
+
+# Triangle filter is robust enough to ignore the duplicate point at
+# the beginning and end of the polygons and triangulate them.
+cutTriangles = vtk.vtkTriangleFilter()
+cutTriangles.SetInput(cutPoly)
+cutMapper = vtk.vtkPolyDataMapper()
+cutMapper.SetInput(cutPoly)
+cutMapper.SetInputConnection(cutTriangles.GetOutputPort())
+cutActor = vtk.vtkActor()
+cutActor.SetMapper(cutMapper)
+cutActor.GetProperty().SetColor(peacock)
+
+# The clipped part of the cow is rendered wireframe.
+restMapper = vtk.vtkPolyDataMapper()
+restMapper.SetInput(clipper.GetClippedOutput())
+restMapper.ScalarVisibilityOff()
+restActor = vtk.vtkActor()
+restActor.SetMapper(restMapper)
+restActor.GetProperty().SetRepresentationToWireframe()
+
+# Create graphics stuff
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(clipActor)
+ren.AddActor(cutActor)
+ren.AddActor(restActor)
+ren.SetBackground(1, 1, 1)
+ren.ResetCamera()
+ren.GetActiveCamera().Azimuth(30)
+ren.GetActiveCamera().Elevation(30)
+ren.GetActiveCamera().Dolly(1.5)
+ren.ResetCameraClippingRange()
+
+renWin.SetSize(300, 300)
+iren.Initialize()
+
+# Lets you move the cut plane back and forth by invoking the function
+# Cut with the appropriate plane value (essentially a distance from
+# the original plane).  This is not used in this code but should give
+# you an idea of how to define a function to do this.
+def Cut(v):
+    clipper.SetValue(v)
+    cutEdges.SetValue(0, v)
+    cutStrips.Update()
+    cutPoly.SetPoints(cutStrips.GetOutput().GetPoints())
+    cutPoly.SetPolys(cutStrips.GetOutput().GetLines())
+    cutMapper.Update()
+    renWin.Render()
+ 
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ClipCow.vt b/examples/vtk_examples/VisualizationAlgorithms/ClipCow.vt
new file mode 100644
index 0000000..a890d84
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/ClipCow.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ColorIsosurface.py b/examples/vtk_examples/VisualizationAlgorithms/ColorIsosurface.py
new file mode 100644
index 0000000..9b61c90
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/ColorIsosurface.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+
+# This example shows how to color an isosurface with other
+# data. Basically an isosurface is generated, and a data array is
+# selected and used by the mapper to color the surface.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read some data. The important thing here is to read a function as a
+# data array as well as the scalar and vector.  (here function 153 is
+# named "Velocity Magnitude").Later this data array will be used to
+# color the isosurface.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.AddFunction(153)
+pl3d.Update()
+pl3d.DebugOn()
+    
+# The contour filter uses the labeled scalar (function number 100
+# above to generate the contour surface; all other data is
+# interpolated during the contouring process.
+iso = vtk.vtkContourFilter()
+iso.SetInputConnection(pl3d.GetOutputPort())
+iso.SetValue(0, .24)
+
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(iso.GetOutputPort())
+normals.SetFeatureAngle(45)
+
+# We indicate to the mapper to use the velcoity magnitude, which is a
+# vtkDataArray that makes up part of the point attribute data.
+isoMapper = vtk.vtkPolyDataMapper()
+isoMapper.SetInputConnection(normals.GetOutputPort())
+isoMapper.ScalarVisibilityOn()
+isoMapper.SetScalarRange(0, 1500)
+isoMapper.SetScalarModeToUsePointFieldData()
+isoMapper.ColorByArrayComponent("VelocityMagnitude", 0)
+
+isoActor = vtk.vtkLODActor()
+isoActor.SetMapper(isoMapper)
+isoActor.SetNumberOfCloudPoints(1000)
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Create the usual rendering stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(isoActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(500, 500)
+ren.SetBackground(0.1, 0.2, 0.4)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(9.71821, 0.458166, 29.3999)
+cam1.SetPosition(2.7439, -37.3196, 38.7167)
+cam1.SetViewUp(-0.16123, 0.264271, 0.950876)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ColorIsosurface.vt b/examples/vtk_examples/VisualizationAlgorithms/ColorIsosurface.vt
new file mode 100644
index 0000000..e205e01
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/ColorIsosurface.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/CutCombustor.py b/examples/vtk_examples/VisualizationAlgorithms/CutCombustor.py
new file mode 100644
index 0000000..78a546d
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/CutCombustor.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+# This example shows how to use cutting (vtkCutter) and how it
+# compares with extracting a plane from a computational grid.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read some data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# The cutter uses an implicit function to perform the cutting.
+# Here we define a plane, specifying its center and normal.
+# Then we assign the plane to the cutter.
+plane = vtk.vtkPlane()
+plane.SetOrigin(pl3d.GetOutput().GetCenter())
+plane.SetNormal(-0.287, 0, 0.9579)
+planeCut = vtk.vtkCutter()
+planeCut.SetInputConnection(pl3d.GetOutputPort())
+planeCut.SetCutFunction(plane)
+cutMapper = vtk.vtkPolyDataMapper()
+cutMapper.SetInputConnection(planeCut.GetOutputPort())
+cutMapper.SetScalarRange(pl3d.GetOutput().GetPointData().GetScalars().GetRange())
+cutActor = vtk.vtkActor()
+cutActor.SetMapper(cutMapper)
+
+# Here we extract a computational plane from the structured grid.
+# We render it as wireframe.
+compPlane = vtk.vtkStructuredGridGeometryFilter()
+compPlane.SetInputConnection(pl3d.GetOutputPort())
+compPlane.SetExtent(0, 100, 0, 100, 9, 9)
+planeMapper = vtk.vtkPolyDataMapper()
+planeMapper.SetInputConnection(compPlane.GetOutputPort())
+planeMapper.ScalarVisibilityOff()
+planeActor = vtk.vtkActor()
+planeActor.SetMapper(planeMapper)
+planeActor.GetProperty().SetRepresentationToWireframe()
+planeActor.GetProperty().SetColor(0, 0, 0)
+
+# The outline of the data puts the data in context.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineProp = outlineActor.GetProperty()
+outlineProp.SetColor(0, 0, 0)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(planeActor)
+ren.AddActor(cutActor)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(400, 300)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(11.1034, 59.5328)
+cam1.SetFocalPoint(9.71821, 0.458166, 29.3999)
+cam1.SetPosition(-2.95748, -26.7271, 44.5309)
+cam1.SetViewUp(0.0184785, 0.479657, 0.877262)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/CutCombustor.vt b/examples/vtk_examples/VisualizationAlgorithms/CutCombustor.vt
new file mode 100644
index 0000000..8d8ce2b
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/CutCombustor.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ExtractGeometry.py b/examples/vtk_examples/VisualizationAlgorithms/ExtractGeometry.py
new file mode 100644
index 0000000..8a6fda3
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/ExtractGeometry.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+
+# This example shows how to extract a piece of a dataset using an
+# implicit function. In this case the implicit function is formed by
+# the boolean combination of two ellipsoids.
+
+import vtk
+
+# Here we create two ellipsoidal implicit functions and boolean them
+# together tto form a "cross" shaped implicit function.
+quadric = vtk.vtkQuadric()
+quadric.SetCoefficients(.5, 1, .2, 0, .1, 0, 0, .2, 0, 0)
+sample = vtk.vtkSampleFunction()
+sample.SetSampleDimensions(50, 50, 50)
+sample.SetImplicitFunction(quadric)
+sample.ComputeNormalsOff()
+trans = vtk.vtkTransform()
+trans.Scale(1, .5, .333)
+sphere = vtk.vtkSphere()
+sphere.SetRadius(0.25)
+sphere.SetTransform(trans)
+trans2 = vtk.vtkTransform()
+trans2.Scale(.25, .5, 1.0)
+sphere2 = vtk.vtkSphere()
+sphere2.SetRadius(0.25)
+sphere2.SetTransform(trans2)
+union = vtk.vtkImplicitBoolean()
+union.AddFunction(sphere)
+union.AddFunction(sphere2)
+union.SetOperationType(0) #union
+
+# Here is where it gets interesting. The implicit function is used to
+# extract those cells completely inside the function. They are then 
+# shrunk to help show what was extracted.
+extract = vtk.vtkExtractGeometry()
+extract.SetInputConnection(sample.GetOutputPort())
+extract.SetImplicitFunction(union)
+shrink = vtk.vtkShrinkFilter()
+shrink.SetInputConnection(extract.GetOutputPort())
+shrink.SetShrinkFactor(0.5)
+dataMapper = vtk.vtkDataSetMapper()
+dataMapper.SetInputConnection(shrink.GetOutputPort())
+dataActor = vtk.vtkActor()
+dataActor.SetMapper(dataMapper)
+
+# The outline gives context to the original data.
+outline = vtk.vtkOutlineFilter()
+outline.SetInputConnection(sample.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineProp = outlineActor.GetProperty()
+outlineProp.SetColor(0, 0, 0)
+
+# The usual rendering stuff is created.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(dataActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(500, 500)
+ren.ResetCamera()
+ren.GetActiveCamera().Zoom(1.5)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ExtractGeometry.vt b/examples/vtk_examples/VisualizationAlgorithms/ExtractGeometry.vt
new file mode 100644
index 0000000..65d11c4
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/ExtractGeometry.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ExtractUGrid.py b/examples/vtk_examples/VisualizationAlgorithms/ExtractUGrid.py
new file mode 100644
index 0000000..58ca0f2
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/ExtractUGrid.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+
+# This example shows how to extract portions of an unstructured grid
+# using vtkExtractUnstructuredGrid. vtkConnectivityFilter is also used
+# to extract connected components.
+#
+# The data found here represents a blow molding process. Blow molding
+# requires a mold and parison (hot, viscous plastic) which is shaped
+# by the mold into the final form. The data file contains several steps
+# in time for the analysis.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create a reader to read the unstructured grid data. We use a
+# vtkDataSetReader which means the type of the output is unknown until
+# the data file is read. So we follow the reader with a
+# vtkCastToConcrete and cast the output to vtkUnstructuredGrid.
+reader = vtk.vtkDataSetReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/blow.vtk")
+reader.SetScalarsName("thickness9")
+reader.SetVectorsName("displacement9")
+castToUnstructuredGrid = vtk.vtkCastToConcrete()
+castToUnstructuredGrid.SetInputConnection(reader.GetOutputPort())
+warp = vtk.vtkWarpVector()
+warp.SetInput(castToUnstructuredGrid.GetUnstructuredGridOutput())
+
+# The connectivity filter extracts the first two regions. These are
+# know to represent the mold.
+connect = vtk.vtkConnectivityFilter()
+connect.SetInputConnection(warp.GetOutputPort())
+connect.SetExtractionModeToSpecifiedRegions()
+connect.AddSpecifiedRegion(0)
+connect.AddSpecifiedRegion(1)
+moldMapper = vtk.vtkDataSetMapper()
+moldMapper.SetInputConnection(reader.GetOutputPort())
+moldMapper.ScalarVisibilityOff()
+moldActor = vtk.vtkActor()
+moldActor.SetMapper(moldMapper)
+moldActor.GetProperty().SetColor(.2, .2, .2)
+moldActor.GetProperty().SetRepresentationToWireframe()
+
+# Another connectivity filter is used to extract the parison.
+connect2 = vtk.vtkConnectivityFilter()
+connect2.SetInputConnection(warp.GetOutputPort())
+connect2.SetExtractionModeToSpecifiedRegions()
+connect2.AddSpecifiedRegion(2)
+
+# We use vtkExtractUnstructuredGrid because we are interested in
+# looking at just a few cells. We use cell clipping via cell id to
+# extract the portion of the grid we are interested in.
+extractGrid = vtk.vtkExtractUnstructuredGrid()
+extractGrid.SetInputConnection(connect2.GetOutputPort())
+extractGrid.CellClippingOn()
+extractGrid.SetCellMinimum(0)
+extractGrid.SetCellMaximum(23)
+parison = vtk.vtkGeometryFilter()
+parison.SetInputConnection(extractGrid.GetOutputPort())
+normals2 = vtk.vtkPolyDataNormals()
+normals2.SetInputConnection(parison.GetOutputPort())
+normals2.SetFeatureAngle(60)
+lut = vtk.vtkLookupTable()
+lut.SetHueRange(0.0, 0.66667)
+parisonMapper = vtk.vtkPolyDataMapper()
+parisonMapper.SetInputConnection(normals2.GetOutputPort())
+parisonMapper.SetLookupTable(lut)
+parisonMapper.SetScalarRange(0.12, 1.0)
+parisonActor = vtk.vtkActor()
+parisonActor.SetMapper(parisonMapper)
+
+# graphics stuff
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(parisonActor)
+ren.AddActor(moldActor)
+ren.SetBackground(1, 1, 1)
+ren.ResetCamera()
+ren.GetActiveCamera().Azimuth(60)
+ren.GetActiveCamera().Roll(-90)
+ren.GetActiveCamera().Dolly(2)
+ren.ResetCameraClippingRange()
+renWin.SetSize(500, 375)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/ExtractUGrid.vt b/examples/vtk_examples/VisualizationAlgorithms/ExtractUGrid.vt
new file mode 100644
index 0000000..f32b492
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/ExtractUGrid.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/GenerateTextureCoords.py b/examples/vtk_examples/VisualizationAlgorithms/GenerateTextureCoords.py
new file mode 100644
index 0000000..06b463d
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/GenerateTextureCoords.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+
+# This example shows how to generate and manipulate texture coordinates.
+# A random cloud of points is generated and then triangulated with 
+# vtkDelaunay3D. Since these points do not have texture coordinates,
+# we generate them with vtkTextureMapToCylinder.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Begin by generating 25 random points in the unit sphere.
+sphere = vtk.vtkPointSource()
+sphere.SetNumberOfPoints(25)
+
+# Triangulate the points with vtkDelaunay3D. This generates a convex hull
+# of tetrahedron.
+delny = vtk.vtkDelaunay3D()
+delny.SetInputConnection(sphere.GetOutputPort())
+delny.SetTolerance(0.01)
+    
+# The triangulation has texture coordinates generated so we can map
+# a texture onto it.
+tmapper = vtk.vtkTextureMapToCylinder()
+tmapper.SetInputConnection(delny.GetOutputPort())
+tmapper.PreventSeamOn()
+
+# We scale the texture coordinate to get some repeat patterns.
+xform = vtk.vtkTransformTextureCoords()
+xform.SetInputConnection(tmapper.GetOutputPort())
+xform.SetScale(4, 4, 1)
+
+# vtkDataSetMapper internally uses a vtkGeometryFilter to extract the
+# surface from the triangulation. The output (which is vtkPolyData) is
+# then passed to an internal vtkPolyDataMapper which does the
+# rendering.
+mapper = vtk.vtkDataSetMapper()
+mapper.SetInputConnection(xform.GetOutputPort())
+
+# A texture is loaded using an image reader. Textures are simply images.
+# The texture is eventually associated with an actor.
+bmpReader = vtk.vtkBMPReader()
+bmpReader.SetFileName(VTK_DATA_ROOT + "/Data/masonry.bmp")
+atext = vtk.vtkTexture()
+atext.SetInputConnection(bmpReader.GetOutputPort())
+atext.InterpolateOn()
+triangulation = vtk.vtkActor()
+triangulation.SetMapper(mapper)
+triangulation.SetTexture(atext)
+
+# Create the standard rendering stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(triangulation)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(300, 300)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/GenerateTextureCoords.vt b/examples/vtk_examples/VisualizationAlgorithms/GenerateTextureCoords.vt
new file mode 100644
index 0000000..473a097
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/GenerateTextureCoords.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/SubsampleGrid.py b/examples/vtk_examples/VisualizationAlgorithms/SubsampleGrid.py
new file mode 100644
index 0000000..50bec35
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/SubsampleGrid.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+# This example demonstrates the subsampling of a structured grid.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read some structured data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# Here we subsample the grid. The SetVOI method requires six values
+# specifying (imin,imax, jmin,jmax, kmin,kmax) extents. In this
+# example we extracting a plane. Note that the VOI is clamped to zero
+# (min) and the maximum i-j-k value; that way we can use the
+# -1000,1000 specification and be sure the values are clamped. The
+# SampleRate specifies that we take every point in the i-direction;
+# every other point in the j-direction; and every third point in the
+# k-direction. IncludeBoundaryOn makes sure that we get the boundary
+# points even if the SampleRate does not coincident with the boundary.
+extract = vtk.vtkExtractGrid()
+extract.SetInputConnection(pl3d.GetOutputPort())
+extract.SetVOI(30, 30, -1000, 1000, -1000, 1000)
+extract.SetSampleRate(1, 2, 3)
+extract.IncludeBoundaryOn()
+mapper = vtk.vtkDataSetMapper()
+mapper.SetInputConnection(extract.GetOutputPort())
+mapper.SetScalarRange(.18, .7)
+actor = vtk.vtkActor()
+actor.SetMapper(mapper)
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Add the usual rendering stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(actor)
+
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(300, 180)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(2.64586, 47.905)
+cam1.SetFocalPoint(8.931, 0.358127, 31.3526)
+cam1.SetPosition(29.7111, -0.688615, 37.1495)
+cam1.SetViewUp(-0.268328, 0.00801595, 0.963294)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/SubsampleGrid.vt b/examples/vtk_examples/VisualizationAlgorithms/SubsampleGrid.vt
new file mode 100644
index 0000000..b1c438d
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/SubsampleGrid.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/TextureThreshold.py b/examples/vtk_examples/VisualizationAlgorithms/TextureThreshold.py
new file mode 100644
index 0000000..61fb9e8
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/TextureThreshold.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+
+# This example shows how to use a transparent texture map to perform
+# thresholding. The key is the vtkThresholdTextureCoords filter which
+# creates texture coordinates based on a threshold value. These
+# texture coordinates are used in conjuntion with a texture map with
+# varying opacity and intensity to create an inside, transition, and
+# outside region.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Begin by reading some structure grid data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/bluntfinxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/bluntfinq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# Now extract surfaces from the grid corresponding to boundary
+# geometry.  First the wall.
+wall = vtk.vtkStructuredGridGeometryFilter()
+wall.SetInputConnection(pl3d.GetOutputPort())
+wall.SetExtent(0, 100, 0, 0, 0, 100)
+wallMap = vtk.vtkPolyDataMapper()
+wallMap.SetInputConnection(wall.GetOutputPort())
+wallMap.ScalarVisibilityOff()
+wallActor = vtk.vtkActor()
+wallActor.SetMapper(wallMap)
+wallActor.GetProperty().SetColor(0.8, 0.8, 0.8)
+
+# Now the fin.
+fin = vtk.vtkStructuredGridGeometryFilter()
+fin.SetInputConnection(pl3d.GetOutputPort())
+fin.SetExtent(0, 100, 0, 100, 0, 0)
+finMap = vtk.vtkPolyDataMapper()
+finMap.SetInputConnection(fin.GetOutputPort())
+finMap.ScalarVisibilityOff()
+finActor = vtk.vtkActor()
+finActor.SetMapper(finMap)
+finActor.GetProperty().SetColor(0.8, 0.8, 0.8)
+
+# Extract planes to threshold. Start by reading the specially designed
+# texture map that has three regions: an inside, boundary, and outside
+# region. The opacity and intensity of this texture map are varied.
+tmap = vtk.vtkStructuredPointsReader()
+tmap.SetFileName(VTK_DATA_ROOT + "/Data/texThres2.vtk")
+texture = vtk.vtkTexture()
+texture.SetInputConnection(tmap.GetOutputPort())
+texture.InterpolateOff()
+texture.RepeatOff()
+
+# Here are the three planes which will be texture thresholded.
+plane1 = vtk.vtkStructuredGridGeometryFilter()
+plane1.SetInputConnection(pl3d.GetOutputPort())
+plane1.SetExtent(10, 10, 0, 100, 0, 100)
+thresh1 = vtk.vtkThresholdTextureCoords()
+thresh1.SetInputConnection(plane1.GetOutputPort())
+thresh1.ThresholdByUpper(1.5)
+plane1Map = vtk.vtkDataSetMapper()
+plane1Map.SetInputConnection(thresh1.GetOutputPort())
+plane1Map.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+plane1Actor = vtk.vtkActor()
+plane1Actor.SetMapper(plane1Map)
+plane1Actor.SetTexture(texture)
+plane1Actor.GetProperty().SetOpacity(0.999)
+
+plane2 = vtk.vtkStructuredGridGeometryFilter()
+plane2.SetInputConnection(pl3d.GetOutputPort())
+plane2.SetExtent(30, 30, 0, 100, 0, 100)
+thresh2 = vtk.vtkThresholdTextureCoords()
+thresh2.SetInputConnection(plane2.GetOutputPort())
+thresh2.ThresholdByUpper(1.5)
+plane2Map = vtk.vtkDataSetMapper()
+plane2Map.SetInputConnection(thresh2.GetOutputPort())
+plane2Map.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+plane2Actor = vtk.vtkActor()
+plane2Actor.SetMapper(plane2Map)
+plane2Actor.SetTexture(texture)
+plane2Actor.GetProperty().SetOpacity(0.999)
+
+plane3 = vtk.vtkStructuredGridGeometryFilter()
+plane3.SetInputConnection(pl3d.GetOutputPort())
+plane3.SetExtent(35, 35, 0, 100, 0, 100)
+thresh3 = vtk.vtkThresholdTextureCoords()
+thresh3.SetInputConnection(plane3.GetOutputPort())
+thresh3.ThresholdByUpper(1.5)
+plane3Map = vtk.vtkDataSetMapper()
+plane3Map.SetInputConnection(thresh3.GetOutputPort())
+plane3Map.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+plane3Actor = vtk.vtkActor()
+plane3Actor.SetMapper(plane3Map)
+plane3Actor.SetTexture(texture)
+plane3Actor.GetProperty().SetOpacity(0.999)
+
+# For context create an outline around the data.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineProp = outlineActor.GetProperty()
+outlineProp.SetColor(0, 0, 0)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+ren.AddActor(wallActor)
+ren.AddActor(finActor)
+ren.AddActor(plane1Actor)
+ren.AddActor(plane2Actor)
+ren.AddActor(plane3Actor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(500, 500)
+
+# Set up a nice view.
+cam1 = vtk.vtkCamera()
+cam1.SetClippingRange(1.51176, 75.5879)
+cam1.SetFocalPoint(2.33749, 2.96739, 3.61023)
+cam1.SetPosition(10.8787, 5.27346, 15.8687)
+cam1.SetViewAngle(30)
+cam1.SetViewUp(-0.0610856, 0.987798, -0.143262)
+ren.SetActiveCamera(cam1)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/TextureThreshold.vt b/examples/vtk_examples/VisualizationAlgorithms/TextureThreshold.vt
new file mode 100644
index 0000000..38d24f6
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/TextureThreshold.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/VisQuad.py b/examples/vtk_examples/VisualizationAlgorithms/VisQuad.py
new file mode 100644
index 0000000..bb2b003
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/VisQuad.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of the contour filter, and the use of
+# the vtkSampleFunction to generate a volume of data samples from an
+# implicit function.
+
+import vtk
+
+# VTK supports implicit functions of the form f(x,y,z)=constant. These 
+# functions can represent things spheres, cones, etc. Here we use a 
+# general form for a quadric to create an elliptical data field.
+quadric = vtk.vtkQuadric()
+quadric.SetCoefficients(.5, 1, .2, 0, .1, 0, 0, .2, 0, 0)
+
+# vtkSampleFunction samples an implicit function over the x-y-z range
+# specified (here it defaults to -1,1 in the x,y,z directions).
+sample = vtk.vtkSampleFunction()
+sample.SetSampleDimensions(30, 30, 30)
+sample.SetImplicitFunction(quadric)
+
+# Create five surfaces F(x,y,z) = constant between range specified. The
+# GenerateValues() method creates n isocontour values between the range
+# specified.
+contours = vtk.vtkContourFilter()
+contours.SetInputConnection(sample.GetOutputPort())
+contours.GenerateValues(5, 0.0, 1.2)
+
+contMapper = vtk.vtkPolyDataMapper()
+contMapper.SetInputConnection(contours.GetOutputPort())
+contMapper.SetScalarRange(0.0, 1.2)
+
+contActor = vtk.vtkActor()
+contActor.SetMapper(contMapper)
+
+# We'll put a simple outline around the data.
+outline = vtk.vtkOutlineFilter()
+outline.SetInputConnection(sample.GetOutputPort())
+
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0,0,0)
+
+# The usual rendering stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.SetBackground(1, 1, 1)
+ren.AddActor(contActor)
+ren.AddActor(outlineActor)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/VisQuad.vt b/examples/vtk_examples/VisualizationAlgorithms/VisQuad.vt
new file mode 100644
index 0000000..297b1a3
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/VisQuad.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/imageWarp.py b/examples/vtk_examples/VisualizationAlgorithms/imageWarp.py
new file mode 100644
index 0000000..4a2c37c
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/imageWarp.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+# This example shows how to combine data from both the imaging and
+# graphics pipelines. The vtkMergeFilter is used to merge the data
+# from each together.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read in an image and compute a luminance value. The image is
+# extracted as a set of polygons (vtkImageDataGeometryFilter). We then
+# will warp the plane using the scalar (luminance) values.
+reader = vtk.vtkBMPReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/masonry.bmp")
+luminance = vtk.vtkImageLuminance()
+luminance.SetInputConnection(reader.GetOutputPort())
+geometry = vtk.vtkImageDataGeometryFilter()
+geometry.SetInputConnection(luminance.GetOutputPort())
+warp = vtk.vtkWarpScalar()
+warp.SetInputConnection(geometry.GetOutputPort())
+warp.SetScaleFactor(-0.1)
+
+# Use vtkMergeFilter to combine the original image with the warped
+# geometry.
+merge = vtk.vtkMergeFilter()
+merge.SetGeometry(warp.GetOutput())
+merge.SetScalars(reader.GetOutput())
+mapper = vtk.vtkDataSetMapper()
+mapper.SetInputConnection(merge.GetOutputPort())
+mapper.SetScalarRange(0, 255)
+mapper.ImmediateModeRenderingOff()
+actor = vtk.vtkActor()
+actor.SetMapper(mapper)
+
+# Create renderer stuff
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(actor)
+ren.ResetCamera()
+ren.GetActiveCamera().Azimuth(20)
+ren.GetActiveCamera().Elevation(30)
+ren.SetBackground(0.1, 0.2, 0.4)
+ren.ResetCameraClippingRange()
+
+renWin.SetSize(250, 250)
+
+cam1 = ren.GetActiveCamera()
+cam1.Zoom(1.4)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/imageWarp.vt b/examples/vtk_examples/VisualizationAlgorithms/imageWarp.vt
new file mode 100644
index 0000000..0863754
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/imageWarp.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/officeTube.py b/examples/vtk_examples/VisualizationAlgorithms/officeTube.py
new file mode 100644
index 0000000..ee6556f
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/officeTube.py
@@ -0,0 +1,312 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of a single streamline and the
+# tube filter to create a streamtube.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+from vtk.util.colors import *
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# We read a data file the is a CFD analysis of airflow in an office
+# (with ventilation and a burning cigarette). We force an update so
+# that we can query the output for its length, i.e., the length of the
+# diagonal of the bounding box. This is useful for normalizing the
+# data.
+reader = vtk.vtkStructuredGridReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/office.binary.vtk")
+reader.Update()
+
+length = reader.GetOutput().GetLength()
+
+maxVelocity =reader.GetOutput().GetPointData().GetVectors().GetMaxNorm()
+# maxTime = 35.0*length/maxVelocity
+calc1 = vtk.PythonCalc()
+calc1.value1(35.0)
+calc1.value2(length)
+calc1.op('*')
+calc2 = vtk.PythonCalc()
+calc2.value1(calc1.value())
+calc2.value2(maxVelocity)
+calc2.op('/')
+maxTime = calc2.value()
+
+# Now we will generate a single streamline in the data. We select the
+# integration order to use (RungeKutta order 4) and associate it with
+# the streamer. The start position is the position in world space
+# where we want to begin streamline integration; and we integrate in
+# both directions. The step length is the length of the line segments
+# that make up the streamline (i.e., related to display). The
+# IntegrationStepLength specifies the integration step length as a
+# fraction of the cell size that the streamline is in.
+integ = vtk.vtkRungeKutta4()
+streamer = vtk.vtkStreamLine()
+streamer.SetInputConnection(reader.GetOutputPort())
+streamer.SetStartPosition(0.1, 2.1, 0.5)
+streamer.SetMaximumPropagationTime(500)
+streamer.SetStepLength(0.5)
+streamer.SetIntegrationStepLength(0.05)
+streamer.SetIntegrationDirectionToIntegrateBothDirections()
+streamer.SetIntegrator(integ)
+
+# The tube is wrapped around the generated streamline. By varying the
+# radius by the inverse of vector magnitude, we are creating a tube
+# whose radius is proportional to mass flux (in incompressible flow).
+streamTube = vtk.vtkTubeFilter()
+streamTube.SetInputConnection(streamer.GetOutputPort())
+streamTube.SetRadius(0.02)
+streamTube.SetNumberOfSides(12)
+streamTube.SetVaryRadiusToVaryRadiusByVector()
+mapStreamTube = vtk.vtkPolyDataMapper()
+mapStreamTube.SetInputConnection(streamTube.GetOutputPort())
+mapStreamTube.SetScalarRange(reader.GetOutput().GetPointData().GetScalars().GetRange())
+streamTubeActor = vtk.vtkActor()
+streamTubeActor.SetMapper(mapStreamTube)
+streamTubeActor.GetProperty().BackfaceCullingOn()
+
+# From here on we generate a whole bunch of planes which correspond to
+# the geometry in the analysis; tables, bookshelves and so on.
+table1 = vtk.vtkStructuredGridGeometryFilter()
+table1.SetInputConnection(reader.GetOutputPort())
+table1.SetExtent(11, 15, 7, 9, 8, 8)
+mapTable1 = vtk.vtkPolyDataMapper()
+mapTable1.SetInputConnection(table1.GetOutputPort())
+mapTable1.ScalarVisibilityOff()
+table1Actor = vtk.vtkActor()
+table1Actor.SetMapper(mapTable1)
+table1Actor.GetProperty().SetColor(.59, .427, .392)
+
+table2 = vtk.vtkStructuredGridGeometryFilter()
+table2.SetInputConnection(reader.GetOutputPort())
+table2.SetExtent(11, 15, 10, 12, 8, 8)
+mapTable2 = vtk.vtkPolyDataMapper()
+mapTable2.SetInputConnection(table2.GetOutputPort())
+mapTable2.ScalarVisibilityOff()
+table2Actor = vtk.vtkActor()
+table2Actor.SetMapper(mapTable2)
+table2Actor.GetProperty().SetColor(.59, .427, .392)
+
+FilingCabinet1 = vtk.vtkStructuredGridGeometryFilter()
+FilingCabinet1.SetInputConnection(reader.GetOutputPort())
+FilingCabinet1.SetExtent(15, 15, 7, 9, 0, 8)
+mapFilingCabinet1 = vtk.vtkPolyDataMapper()
+mapFilingCabinet1.SetInputConnection(FilingCabinet1.GetOutputPort())
+mapFilingCabinet1.ScalarVisibilityOff()
+FilingCabinet1Actor = vtk.vtkActor()
+FilingCabinet1Actor.SetMapper(mapFilingCabinet1)
+FilingCabinet1Actor.GetProperty().SetColor(.8, .8, .6)
+
+FilingCabinet2 = vtk.vtkStructuredGridGeometryFilter()
+FilingCabinet2.SetInputConnection(reader.GetOutputPort())
+FilingCabinet2.SetExtent(15, 15, 10, 12, 0, 8)
+mapFilingCabinet2 = vtk.vtkPolyDataMapper()
+mapFilingCabinet2.SetInputConnection(FilingCabinet2.GetOutputPort())
+mapFilingCabinet2.ScalarVisibilityOff()
+FilingCabinet2Actor = vtk.vtkActor()
+FilingCabinet2Actor.SetMapper(mapFilingCabinet2)
+FilingCabinet2Actor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Top = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Top.SetInputConnection(reader.GetOutputPort())
+bookshelf1Top.SetExtent(13, 13, 0, 4, 0, 11)
+mapBookshelf1Top = vtk.vtkPolyDataMapper()
+mapBookshelf1Top.SetInputConnection(bookshelf1Top.GetOutputPort())
+mapBookshelf1Top.ScalarVisibilityOff()
+bookshelf1TopActor = vtk.vtkActor()
+bookshelf1TopActor.SetMapper(mapBookshelf1Top)
+bookshelf1TopActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Bottom = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Bottom.SetInputConnection(reader.GetOutputPort())
+bookshelf1Bottom.SetExtent(20, 20, 0, 4, 0, 11)
+mapBookshelf1Bottom = vtk.vtkPolyDataMapper()
+mapBookshelf1Bottom.SetInputConnection(bookshelf1Bottom.GetOutputPort())
+mapBookshelf1Bottom.ScalarVisibilityOff()
+bookshelf1BottomActor = vtk.vtkActor()
+bookshelf1BottomActor.SetMapper(mapBookshelf1Bottom)
+bookshelf1BottomActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Front = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Front.SetInputConnection(reader.GetOutputPort())
+bookshelf1Front.SetExtent(13, 20, 0, 0, 0, 11)
+mapBookshelf1Front = vtk.vtkPolyDataMapper()
+mapBookshelf1Front.SetInputConnection(bookshelf1Front.GetOutputPort())
+mapBookshelf1Front.ScalarVisibilityOff()
+bookshelf1FrontActor = vtk.vtkActor()
+bookshelf1FrontActor.SetMapper(mapBookshelf1Front)
+bookshelf1FrontActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Back = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Back.SetInputConnection(reader.GetOutputPort())
+bookshelf1Back.SetExtent(13, 20, 4, 4, 0, 11)
+mapBookshelf1Back = vtk.vtkPolyDataMapper()
+mapBookshelf1Back.SetInputConnection(bookshelf1Back.GetOutputPort())
+mapBookshelf1Back.ScalarVisibilityOff()
+bookshelf1BackActor = vtk.vtkActor()
+bookshelf1BackActor.SetMapper(mapBookshelf1Back)
+bookshelf1BackActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1LHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1LHS.SetInputConnection(reader.GetOutputPort())
+bookshelf1LHS.SetExtent(13, 20, 0, 4, 0, 0)
+mapBookshelf1LHS = vtk.vtkPolyDataMapper()
+mapBookshelf1LHS.SetInputConnection(bookshelf1LHS.GetOutputPort())
+mapBookshelf1LHS.ScalarVisibilityOff()
+bookshelf1LHSActor = vtk.vtkActor()
+bookshelf1LHSActor.SetMapper(mapBookshelf1LHS)
+bookshelf1LHSActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1RHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1RHS.SetInputConnection(reader.GetOutputPort())
+bookshelf1RHS.SetExtent(13, 20, 0, 4, 11, 11)
+mapBookshelf1RHS = vtk.vtkPolyDataMapper()
+mapBookshelf1RHS.SetInputConnection(bookshelf1RHS.GetOutputPort())
+mapBookshelf1RHS.ScalarVisibilityOff()
+bookshelf1RHSActor = vtk.vtkActor()
+bookshelf1RHSActor.SetMapper(mapBookshelf1RHS)
+bookshelf1RHSActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Top = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Top.SetInputConnection(reader.GetOutputPort())
+bookshelf2Top.SetExtent(13, 13, 15, 19, 0, 11)
+mapBookshelf2Top = vtk.vtkPolyDataMapper()
+mapBookshelf2Top.SetInputConnection(bookshelf2Top.GetOutputPort())
+mapBookshelf2Top.ScalarVisibilityOff()
+bookshelf2TopActor = vtk.vtkActor()
+bookshelf2TopActor.SetMapper(mapBookshelf2Top)
+bookshelf2TopActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Bottom = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Bottom.SetInputConnection(reader.GetOutputPort())
+bookshelf2Bottom.SetExtent(20, 20, 15, 19, 0, 11)
+mapBookshelf2Bottom = vtk.vtkPolyDataMapper()
+mapBookshelf2Bottom.SetInputConnection(bookshelf2Bottom.GetOutputPort())
+mapBookshelf2Bottom.ScalarVisibilityOff()
+bookshelf2BottomActor = vtk.vtkActor()
+bookshelf2BottomActor.SetMapper(mapBookshelf2Bottom)
+bookshelf2BottomActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Front = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Front.SetInputConnection(reader.GetOutputPort())
+bookshelf2Front.SetExtent(13, 20, 15, 15, 0, 11)
+mapBookshelf2Front = vtk.vtkPolyDataMapper()
+mapBookshelf2Front.SetInputConnection(bookshelf2Front.GetOutputPort())
+mapBookshelf2Front.ScalarVisibilityOff()
+bookshelf2FrontActor = vtk.vtkActor()
+bookshelf2FrontActor.SetMapper(mapBookshelf2Front)
+bookshelf2FrontActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Back = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Back.SetInputConnection(reader.GetOutputPort())
+bookshelf2Back.SetExtent(13, 20, 19, 19, 0, 11)
+mapBookshelf2Back = vtk.vtkPolyDataMapper()
+mapBookshelf2Back.SetInputConnection(bookshelf2Back.GetOutputPort())
+mapBookshelf2Back.ScalarVisibilityOff()
+bookshelf2BackActor = vtk.vtkActor()
+bookshelf2BackActor.SetMapper(mapBookshelf2Back)
+bookshelf2BackActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2LHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2LHS.SetInputConnection(reader.GetOutputPort())
+bookshelf2LHS.SetExtent(13, 20, 15, 19, 0, 0)
+mapBookshelf2LHS = vtk.vtkPolyDataMapper()
+mapBookshelf2LHS.SetInputConnection(bookshelf2LHS.GetOutputPort())
+mapBookshelf2LHS.ScalarVisibilityOff()
+bookshelf2LHSActor = vtk.vtkActor()
+bookshelf2LHSActor.SetMapper(mapBookshelf2LHS)
+bookshelf2LHSActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2RHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2RHS.SetInputConnection(reader.GetOutputPort())
+bookshelf2RHS.SetExtent(13, 20, 15, 19, 11, 11)
+mapBookshelf2RHS = vtk.vtkPolyDataMapper()
+mapBookshelf2RHS.SetInputConnection(bookshelf2RHS.GetOutputPort())
+mapBookshelf2RHS.ScalarVisibilityOff()
+bookshelf2RHSActor = vtk.vtkActor()
+bookshelf2RHSActor.SetMapper(mapBookshelf2RHS)
+bookshelf2RHSActor.GetProperty().SetColor(.8, .8, .6)
+
+window = vtk.vtkStructuredGridGeometryFilter()
+window.SetInputConnection(reader.GetOutputPort())
+window.SetExtent(20, 20, 6, 13, 10, 13)
+mapWindow = vtk.vtkPolyDataMapper()
+mapWindow.SetInputConnection(window.GetOutputPort())
+mapWindow.ScalarVisibilityOff()
+windowActor = vtk.vtkActor()
+windowActor.SetMapper(mapWindow)
+windowActor.GetProperty().SetColor(.3, .3, .5)
+
+outlet = vtk.vtkStructuredGridGeometryFilter()
+outlet.SetInputConnection(reader.GetOutputPort())
+outlet.SetExtent(0, 0, 9, 10, 14, 16)
+mapOutlet = vtk.vtkPolyDataMapper()
+mapOutlet.SetInputConnection(outlet.GetOutputPort())
+mapOutlet.ScalarVisibilityOff()
+outletActor = vtk.vtkActor()
+outletActor.SetMapper(mapOutlet)
+outletActor.GetProperty().SetColor(0, 0, 0)
+
+inlet = vtk.vtkStructuredGridGeometryFilter()
+inlet.SetInputConnection(reader.GetOutputPort())
+inlet.SetExtent(0, 0, 9, 10, 0, 6)
+mapInlet = vtk.vtkPolyDataMapper()
+mapInlet.SetInputConnection(inlet.GetOutputPort())
+mapInlet.ScalarVisibilityOff()
+inletActor = vtk.vtkActor()
+inletActor.SetMapper(mapInlet)
+inletActor.GetProperty().SetColor(0, 0, 0)
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(reader.GetOutputPort())
+mapOutline = vtk.vtkPolyDataMapper()
+mapOutline.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(mapOutline)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Now create the usual graphics stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.AddActor(table1Actor)
+ren.AddActor(table2Actor)
+ren.AddActor(FilingCabinet1Actor)
+ren.AddActor(FilingCabinet2Actor)
+ren.AddActor(bookshelf1TopActor)
+ren.AddActor(bookshelf1BottomActor)
+ren.AddActor(bookshelf1FrontActor)
+ren.AddActor(bookshelf1BackActor)
+ren.AddActor(bookshelf1LHSActor)
+ren.AddActor(bookshelf1RHSActor)
+ren.AddActor(bookshelf2TopActor)
+ren.AddActor(bookshelf2BottomActor)
+ren.AddActor(bookshelf2FrontActor)
+ren.AddActor(bookshelf2BackActor)
+ren.AddActor(bookshelf2LHSActor)
+ren.AddActor(bookshelf2RHSActor)
+ren.AddActor(windowActor)
+ren.AddActor(outletActor)
+ren.AddActor(inletActor)
+ren.AddActor(outlineActor)
+ren.AddActor(streamTubeActor)
+
+ren.SetBackground(slate_grey)
+
+# Here we specify a particular view.
+aCamera = vtk.vtkCamera()
+aCamera.SetClippingRange(0.726079, 36.3039)
+aCamera.SetFocalPoint(2.43584, 2.15046, 1.11104)
+aCamera.SetPosition(-4.76183, -10.4426, 3.17203)
+aCamera.SetViewUp(0.0511273, 0.132773, 0.989827)
+aCamera.SetViewAngle(18.604)
+aCamera.Zoom(1.2)
+
+ren.SetActiveCamera(aCamera)
+renWin.SetSize(500, 300)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/officeTube.vt b/examples/vtk_examples/VisualizationAlgorithms/officeTube.vt
new file mode 100644
index 0000000..b537b5c
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/officeTube.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/officeTubes.py b/examples/vtk_examples/VisualizationAlgorithms/officeTubes.py
new file mode 100644
index 0000000..c92f279
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/officeTubes.py
@@ -0,0 +1,320 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of streamlines generated from seeds, 
+# combined with a tube filter to create several streamtubes.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+from vtk.util.colors import *
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# We read a data file the is a CFD analysis of airflow in an office
+# (with ventilation and a burning cigarette). We force an update so
+# that we can query the output for its length, i.e., the length of the
+# diagonal of the bounding box. This is useful for normalizing the
+# data.
+reader = vtk.vtkStructuredGridReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/office.binary.vtk")
+reader.Update()
+
+length = reader.GetOutput().GetLength()
+
+maxVelocity =reader.GetOutput().GetPointData().GetVectors().GetMaxNorm()
+# maxTime = 35.0*length/maxVelocity
+calc1 = vtk.PythonCalc()
+calc1.value1(35.0)
+calc1.value2(length)
+calc1.op('*')
+calc2 = vtk.PythonCalc()
+calc2.value1(calc1.value())
+calc2.value2(maxVelocity)
+calc2.op('/')
+maxTime = calc2.value()
+
+# Now we will generate multiple streamlines in the data. We create a
+# random cloud of points and then use those as integration seeds. We
+# select the integration order to use (RungeKutta order 4) and
+# associate it with the streamer. The start position is the position
+# in world space where we want to begin streamline integration; and we
+# integrate in both directions. The step length is the length of the
+# line segments that make up the streamline (i.e., related to
+# display). The IntegrationStepLength specifies the integration step
+# length as a fraction of the cell size that the streamline is in.
+
+# Create source for streamtubes
+seeds = vtk.vtkPointSource()
+seeds.SetRadius(0.15)
+seeds.SetCenter(0.1, 2.1, 0.5)
+seeds.SetNumberOfPoints(6)
+
+integ = vtk.vtkRungeKutta4()
+streamer = vtk.vtkStreamLine()
+streamer.SetInputConnection(reader.GetOutputPort())
+streamer.SetSource(seeds.GetOutput())
+streamer.SetMaximumPropagationTime(500)
+streamer.SetStepLength(0.5)
+streamer.SetIntegrationStepLength(0.05)
+streamer.SetIntegrationDirectionToIntegrateBothDirections()
+streamer.SetIntegrator(integ)
+
+# The tube is wrapped around the generated streamline. By varying the
+# radius by the inverse of vector magnitude, we are creating a tube
+# whose radius is proportional to mass flux (in incompressible flow).
+streamTube = vtk.vtkTubeFilter()
+streamTube.SetInputConnection(streamer.GetOutputPort())
+streamTube.SetRadius(0.02)
+streamTube.SetNumberOfSides(12)
+streamTube.SetVaryRadiusToVaryRadiusByVector()
+mapStreamTube = vtk.vtkPolyDataMapper()
+mapStreamTube.SetInputConnection(streamTube.GetOutputPort())
+mapStreamTube.SetScalarRange(reader.GetOutput().GetPointData().GetScalars().GetRange())
+streamTubeActor = vtk.vtkActor()
+streamTubeActor.SetMapper(mapStreamTube)
+streamTubeActor.GetProperty().BackfaceCullingOn()
+
+# From here on we generate a whole bunch of planes which correspond to
+# the geometry in the analysis; tables, bookshelves and so on.
+table1 = vtk.vtkStructuredGridGeometryFilter()
+table1.SetInputConnection(reader.GetOutputPort())
+table1.SetExtent(11, 15, 7, 9, 8, 8)
+mapTable1 = vtk.vtkPolyDataMapper()
+mapTable1.SetInputConnection(table1.GetOutputPort())
+mapTable1.ScalarVisibilityOff()
+table1Actor = vtk.vtkActor()
+table1Actor.SetMapper(mapTable1)
+table1Actor.GetProperty().SetColor(.59, .427, .392)
+
+table2 = vtk.vtkStructuredGridGeometryFilter()
+table2.SetInputConnection(reader.GetOutputPort())
+table2.SetExtent(11, 15, 10, 12, 8, 8)
+mapTable2 = vtk.vtkPolyDataMapper()
+mapTable2.SetInputConnection(table2.GetOutputPort())
+mapTable2.ScalarVisibilityOff()
+table2Actor = vtk.vtkActor()
+table2Actor.SetMapper(mapTable2)
+table2Actor.GetProperty().SetColor(.59, .427, .392)
+
+FilingCabinet1 = vtk.vtkStructuredGridGeometryFilter()
+FilingCabinet1.SetInputConnection(reader.GetOutputPort())
+FilingCabinet1.SetExtent(15, 15, 7, 9, 0, 8)
+mapFilingCabinet1 = vtk.vtkPolyDataMapper()
+mapFilingCabinet1.SetInputConnection(FilingCabinet1.GetOutputPort())
+mapFilingCabinet1.ScalarVisibilityOff()
+FilingCabinet1Actor = vtk.vtkActor()
+FilingCabinet1Actor.SetMapper(mapFilingCabinet1)
+FilingCabinet1Actor.GetProperty().SetColor(.8, .8, .6)
+
+FilingCabinet2 = vtk.vtkStructuredGridGeometryFilter()
+FilingCabinet2.SetInputConnection(reader.GetOutputPort())
+FilingCabinet2.SetExtent(15, 15, 10, 12, 0, 8)
+mapFilingCabinet2 = vtk.vtkPolyDataMapper()
+mapFilingCabinet2.SetInputConnection(FilingCabinet2.GetOutputPort())
+mapFilingCabinet2.ScalarVisibilityOff()
+FilingCabinet2Actor = vtk.vtkActor()
+FilingCabinet2Actor.SetMapper(mapFilingCabinet2)
+FilingCabinet2Actor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Top = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Top.SetInputConnection(reader.GetOutputPort())
+bookshelf1Top.SetExtent(13, 13, 0, 4, 0, 11)
+mapBookshelf1Top = vtk.vtkPolyDataMapper()
+mapBookshelf1Top.SetInputConnection(bookshelf1Top.GetOutputPort())
+mapBookshelf1Top.ScalarVisibilityOff()
+bookshelf1TopActor = vtk.vtkActor()
+bookshelf1TopActor.SetMapper(mapBookshelf1Top)
+bookshelf1TopActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Bottom = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Bottom.SetInputConnection(reader.GetOutputPort())
+bookshelf1Bottom.SetExtent(20, 20, 0, 4, 0, 11)
+mapBookshelf1Bottom = vtk.vtkPolyDataMapper()
+mapBookshelf1Bottom.SetInputConnection(bookshelf1Bottom.GetOutputPort())
+mapBookshelf1Bottom.ScalarVisibilityOff()
+bookshelf1BottomActor = vtk.vtkActor()
+bookshelf1BottomActor.SetMapper(mapBookshelf1Bottom)
+bookshelf1BottomActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Front = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Front.SetInputConnection(reader.GetOutputPort())
+bookshelf1Front.SetExtent(13, 20, 0, 0, 0, 11)
+mapBookshelf1Front = vtk.vtkPolyDataMapper()
+mapBookshelf1Front.SetInputConnection(bookshelf1Front.GetOutputPort())
+mapBookshelf1Front.ScalarVisibilityOff()
+bookshelf1FrontActor = vtk.vtkActor()
+bookshelf1FrontActor.SetMapper(mapBookshelf1Front)
+bookshelf1FrontActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1Back = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1Back.SetInputConnection(reader.GetOutputPort())
+bookshelf1Back.SetExtent(13, 20, 4, 4, 0, 11)
+mapBookshelf1Back = vtk.vtkPolyDataMapper()
+mapBookshelf1Back.SetInputConnection(bookshelf1Back.GetOutputPort())
+mapBookshelf1Back.ScalarVisibilityOff()
+bookshelf1BackActor = vtk.vtkActor()
+bookshelf1BackActor.SetMapper(mapBookshelf1Back)
+bookshelf1BackActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1LHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1LHS.SetInputConnection(reader.GetOutputPort())
+bookshelf1LHS.SetExtent(13, 20, 0, 4, 0, 0)
+mapBookshelf1LHS = vtk.vtkPolyDataMapper()
+mapBookshelf1LHS.SetInputConnection(bookshelf1LHS.GetOutputPort())
+mapBookshelf1LHS.ScalarVisibilityOff()
+bookshelf1LHSActor = vtk.vtkActor()
+bookshelf1LHSActor.SetMapper(mapBookshelf1LHS)
+bookshelf1LHSActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf1RHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf1RHS.SetInputConnection(reader.GetOutputPort())
+bookshelf1RHS.SetExtent(13, 20, 0, 4, 11, 11)
+mapBookshelf1RHS = vtk.vtkPolyDataMapper()
+mapBookshelf1RHS.SetInputConnection(bookshelf1RHS.GetOutputPort())
+mapBookshelf1RHS.ScalarVisibilityOff()
+bookshelf1RHSActor = vtk.vtkActor()
+bookshelf1RHSActor.SetMapper(mapBookshelf1RHS)
+bookshelf1RHSActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Top = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Top.SetInputConnection(reader.GetOutputPort())
+bookshelf2Top.SetExtent(13, 13, 15, 19, 0, 11)
+mapBookshelf2Top = vtk.vtkPolyDataMapper()
+mapBookshelf2Top.SetInputConnection(bookshelf2Top.GetOutputPort())
+mapBookshelf2Top.ScalarVisibilityOff()
+bookshelf2TopActor = vtk.vtkActor()
+bookshelf2TopActor.SetMapper(mapBookshelf2Top)
+bookshelf2TopActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Bottom = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Bottom.SetInputConnection(reader.GetOutputPort())
+bookshelf2Bottom.SetExtent(20, 20, 15, 19, 0, 11)
+mapBookshelf2Bottom = vtk.vtkPolyDataMapper()
+mapBookshelf2Bottom.SetInputConnection(bookshelf2Bottom.GetOutputPort())
+mapBookshelf2Bottom.ScalarVisibilityOff()
+bookshelf2BottomActor = vtk.vtkActor()
+bookshelf2BottomActor.SetMapper(mapBookshelf2Bottom)
+bookshelf2BottomActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Front = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Front.SetInputConnection(reader.GetOutputPort())
+bookshelf2Front.SetExtent(13, 20, 15, 15, 0, 11)
+mapBookshelf2Front = vtk.vtkPolyDataMapper()
+mapBookshelf2Front.SetInputConnection(bookshelf2Front.GetOutputPort())
+mapBookshelf2Front.ScalarVisibilityOff()
+bookshelf2FrontActor = vtk.vtkActor()
+bookshelf2FrontActor.SetMapper(mapBookshelf2Front)
+bookshelf2FrontActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2Back = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2Back.SetInputConnection(reader.GetOutputPort())
+bookshelf2Back.SetExtent(13, 20, 19, 19, 0, 11)
+mapBookshelf2Back = vtk.vtkPolyDataMapper()
+mapBookshelf2Back.SetInputConnection(bookshelf2Back.GetOutputPort())
+mapBookshelf2Back.ScalarVisibilityOff()
+bookshelf2BackActor = vtk.vtkActor()
+bookshelf2BackActor.SetMapper(mapBookshelf2Back)
+bookshelf2BackActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2LHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2LHS.SetInputConnection(reader.GetOutputPort())
+bookshelf2LHS.SetExtent(13, 20, 15, 19, 0, 0)
+mapBookshelf2LHS = vtk.vtkPolyDataMapper()
+mapBookshelf2LHS.SetInputConnection(bookshelf2LHS.GetOutputPort())
+mapBookshelf2LHS.ScalarVisibilityOff()
+bookshelf2LHSActor = vtk.vtkActor()
+bookshelf2LHSActor.SetMapper(mapBookshelf2LHS)
+bookshelf2LHSActor.GetProperty().SetColor(.8, .8, .6)
+
+bookshelf2RHS = vtk.vtkStructuredGridGeometryFilter()
+bookshelf2RHS.SetInputConnection(reader.GetOutputPort())
+bookshelf2RHS.SetExtent(13, 20, 15, 19, 11, 11)
+mapBookshelf2RHS = vtk.vtkPolyDataMapper()
+mapBookshelf2RHS.SetInputConnection(bookshelf2RHS.GetOutputPort())
+mapBookshelf2RHS.ScalarVisibilityOff()
+bookshelf2RHSActor = vtk.vtkActor()
+bookshelf2RHSActor.SetMapper(mapBookshelf2RHS)
+bookshelf2RHSActor.GetProperty().SetColor(.8, .8, .6)
+
+window = vtk.vtkStructuredGridGeometryFilter()
+window.SetInputConnection(reader.GetOutputPort())
+window.SetExtent(20, 20, 6, 13, 10, 13)
+mapWindow = vtk.vtkPolyDataMapper()
+mapWindow.SetInputConnection(window.GetOutputPort())
+mapWindow.ScalarVisibilityOff()
+windowActor = vtk.vtkActor()
+windowActor.SetMapper(mapWindow)
+windowActor.GetProperty().SetColor(.3, .3, .5)
+
+outlet = vtk.vtkStructuredGridGeometryFilter()
+outlet.SetInputConnection(reader.GetOutputPort())
+outlet.SetExtent(0, 0, 9, 10, 14, 16)
+mapOutlet = vtk.vtkPolyDataMapper()
+mapOutlet.SetInputConnection(outlet.GetOutputPort())
+mapOutlet.ScalarVisibilityOff()
+outletActor = vtk.vtkActor()
+outletActor.SetMapper(mapOutlet)
+outletActor.GetProperty().SetColor(0, 0, 0)
+
+inlet = vtk.vtkStructuredGridGeometryFilter()
+inlet.SetInputConnection(reader.GetOutputPort())
+inlet.SetExtent(0, 0, 9, 10, 0, 6)
+mapInlet = vtk.vtkPolyDataMapper()
+mapInlet.SetInputConnection(inlet.GetOutputPort())
+mapInlet.ScalarVisibilityOff()
+inletActor = vtk.vtkActor()
+inletActor.SetMapper(mapInlet)
+inletActor.GetProperty().SetColor(0, 0, 0)
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(reader.GetOutputPort())
+mapOutline = vtk.vtkPolyDataMapper()
+mapOutline.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(mapOutline)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Now create the usual graphics stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.AddActor(table1Actor)
+ren.AddActor(table2Actor)
+ren.AddActor(FilingCabinet1Actor)
+ren.AddActor(FilingCabinet2Actor)
+ren.AddActor(bookshelf1TopActor)
+ren.AddActor(bookshelf1BottomActor)
+ren.AddActor(bookshelf1FrontActor)
+ren.AddActor(bookshelf1BackActor)
+ren.AddActor(bookshelf1LHSActor)
+ren.AddActor(bookshelf1RHSActor)
+ren.AddActor(bookshelf2TopActor)
+ren.AddActor(bookshelf2BottomActor)
+ren.AddActor(bookshelf2FrontActor)
+ren.AddActor(bookshelf2BackActor)
+ren.AddActor(bookshelf2LHSActor)
+ren.AddActor(bookshelf2RHSActor)
+ren.AddActor(windowActor)
+ren.AddActor(outletActor)
+ren.AddActor(inletActor)
+ren.AddActor(outlineActor)
+ren.AddActor(streamTubeActor)
+
+ren.SetBackground(slate_grey)
+
+# Here we specify a particular view.
+aCamera = vtk.vtkCamera()
+aCamera.SetClippingRange(0.726079, 36.3039)
+aCamera.SetFocalPoint(2.43584, 2.15046, 1.11104)
+aCamera.SetPosition(-4.76183, -10.4426, 3.17203)
+aCamera.SetViewUp(0.0511273, 0.132773, 0.989827)
+aCamera.SetViewAngle(18.604)
+aCamera.Zoom(1.2)
+
+ren.SetActiveCamera(aCamera)
+renWin.SetSize(500, 300)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/officeTubes.vt b/examples/vtk_examples/VisualizationAlgorithms/officeTubes.vt
new file mode 100644
index 0000000..5f9efa4
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/officeTubes.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/probeComb.py b/examples/vtk_examples/VisualizationAlgorithms/probeComb.py
new file mode 100644
index 0000000..0a323a5
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/probeComb.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+
+# This shows how to probe a dataset with a plane. The probed data is
+# then contoured.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# We create three planes and position them in the correct position
+# using transform filters. They are then appended together and used as
+# a probe.
+plane = vtk.vtkPlaneSource()
+plane.SetResolution(50, 50)
+transP1 = vtk.vtkTransform()
+transP1.Translate(3.7, 0.0, 28.37)
+transP1.Scale(5, 5, 5)
+transP1.RotateY(90)
+tpd1 = vtk.vtkTransformPolyDataFilter()
+tpd1.SetInputConnection(plane.GetOutputPort())
+tpd1.SetTransform(transP1)
+outTpd1 = vtk.vtkOutlineFilter()
+outTpd1.SetInputConnection(tpd1.GetOutputPort())
+mapTpd1 = vtk.vtkPolyDataMapper()
+mapTpd1.SetInputConnection(outTpd1.GetOutputPort())
+tpd1Actor = vtk.vtkActor()
+tpd1Actor.SetMapper(mapTpd1)
+tpd1Actor.GetProperty().SetColor(0, 0, 0)
+
+transP2 = vtk.vtkTransform()
+transP2.Translate(9.2, 0.0, 31.20)
+transP2.Scale(5, 5, 5)
+transP2.RotateY(90)
+tpd2 = vtk.vtkTransformPolyDataFilter()
+tpd2.SetInputConnection(plane.GetOutputPort())
+tpd2.SetTransform(transP2)
+outTpd2 = vtk.vtkOutlineFilter()
+outTpd2.SetInputConnection(tpd2.GetOutputPort())
+mapTpd2 = vtk.vtkPolyDataMapper()
+mapTpd2.SetInputConnection(outTpd2.GetOutputPort())
+tpd2Actor = vtk.vtkActor()
+tpd2Actor.SetMapper(mapTpd2)
+tpd2Actor.GetProperty().SetColor(0, 0, 0)
+
+transP3 = vtk.vtkTransform()
+transP3.Translate(13.27, 0.0, 33.30)
+transP3.Scale(5, 5, 5)
+transP3.RotateY(90)
+tpd3 = vtk.vtkTransformPolyDataFilter()
+tpd3.SetInputConnection(plane.GetOutputPort())
+tpd3.SetTransform(transP3)
+outTpd3 = vtk.vtkOutlineFilter()
+outTpd3.SetInputConnection(tpd3.GetOutputPort())
+mapTpd3 = vtk.vtkPolyDataMapper()
+mapTpd3.SetInputConnection(outTpd3.GetOutputPort())
+tpd3Actor = vtk.vtkActor()
+tpd3Actor.SetMapper(mapTpd3)
+tpd3Actor.GetProperty().SetColor(0, 0, 0)
+
+appendF = vtk.vtkAppendPolyData()
+appendF.AddInput(tpd1.GetOutput())
+appendF.AddInput(tpd2.GetOutput())
+appendF.AddInput(tpd3.GetOutput())
+
+# The vtkProbeFilter takes two inputs. One is a dataset to use as the
+# probe geometry (SetInput); the other is the data to probe
+# (SetSource). The output dataset structure (geometry and topology) of
+# the probe is the same as the structure of the input. The probing
+# process generates new data values resampled from the source.
+probe = vtk.vtkProbeFilter()
+probe.SetInputConnection(appendF.GetOutputPort())
+probe.SetSource(pl3d.GetOutput())
+
+contour = vtk.vtkContourFilter()
+contour.SetInputConnection(probe.GetOutputPort())
+contour.GenerateValues(50, pl3d.GetOutput().GetScalarRange())
+contourMapper = vtk.vtkPolyDataMapper()
+contourMapper.SetInputConnection(contour.GetOutputPort())
+contourMapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+planeActor = vtk.vtkActor()
+planeActor.SetMapper(contourMapper)
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.AddActor(outlineActor)
+ren.AddActor(planeActor)
+ren.AddActor(tpd1Actor)
+ren.AddActor(tpd2Actor)
+ren.AddActor(tpd3Actor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(400, 400)
+
+ren.ResetCamera()
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(8.88908, 0.595038, 29.3342)
+cam1.SetPosition(-12.3332, 31.7479, 41.2387)
+cam1.SetViewUp(0.060772, -0.319905, 0.945498)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/probeComb.vt b/examples/vtk_examples/VisualizationAlgorithms/probeComb.vt
new file mode 100644
index 0000000..6b204a6
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/probeComb.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/smoothFran.py b/examples/vtk_examples/VisualizationAlgorithms/smoothFran.py
new file mode 100644
index 0000000..a640e4d
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/smoothFran.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+
+# This example shows how to use decimation to reduce a polygonal
+# mesh. We also use mesh smoothing and generate surface normals to
+# give a pleasing result.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# We start by reading some data that was originally captured from a
+# Cyberware laser digitizing system.
+fran = vtk.vtkPolyDataReader()
+fran.SetFileName(VTK_DATA_ROOT + "/Data/fran_cut.vtk")
+
+# We want to preserve topology (not let any cracks form). This may
+# limit the total reduction possible, which we have specified at 90%.
+deci = vtk.vtkDecimatePro()
+deci.SetInputConnection(fran.GetOutputPort())
+deci.SetTargetReduction(0.9)
+deci.PreserveTopologyOn()
+smoother = vtk.vtkSmoothPolyDataFilter()
+smoother.SetInputConnection(deci.GetOutputPort())
+smoother.SetNumberOfIterations(50)
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(smoother.GetOutputPort())
+normals.FlipNormalsOn()
+franMapper = vtk.vtkPolyDataMapper()
+franMapper.SetInputConnection(normals.GetOutputPort())
+franActor = vtk.vtkActor()
+franActor.SetMapper(franMapper)
+franActor.GetProperty().SetColor(1.0, 0.49, 0.25)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(franActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(250, 250)
+
+cam1 = vtk.vtkCamera()
+cam1.SetClippingRange(0.0475572, 2.37786)
+cam1.SetFocalPoint(0.052665, -0.129454, -0.0573973)
+cam1.SetPosition(0.327637, -0.116299, -0.256418)
+cam1.SetViewUp(-0.0225386, 0.999137, 0.034901)
+ren.SetActiveCamera(cam1)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/smoothFran.vt b/examples/vtk_examples/VisualizationAlgorithms/smoothFran.vt
new file mode 100644
index 0000000..f937bd3
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/smoothFran.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/spikeF.py b/examples/vtk_examples/VisualizationAlgorithms/spikeF.py
new file mode 100644
index 0000000..d1e97a2
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/spikeF.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+
+# This example demonstrates the use of glyphing. We also use a mask filter
+# to select a subset of points to glyph.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read a data file. This originally was a Cyberware laser digitizer scan 
+# of Fran J.'s face. Surface normals are generated based on local geometry
+# (i.e., the polygon normals surrounding eash point are averaged). We flip
+# the normals because we want them to point out from Fran's face.
+fran = vtk.vtkPolyDataReader()
+fran.SetFileName(VTK_DATA_ROOT + "/Data/fran_cut.vtk")
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(fran.GetOutputPort())
+normals.FlipNormalsOn()
+franMapper = vtk.vtkPolyDataMapper()
+franMapper.SetInputConnection(normals.GetOutputPort())
+franActor = vtk.vtkActor()
+franActor.SetMapper(franMapper)
+franActor.GetProperty().SetColor(1.0, 0.49, 0.25)
+
+# We subsample the dataset because we want to glyph just a subset of
+# the points. Otherwise the display is cluttered and cannot be easily
+# read. The RandonModeOn and SetOnRatio combine to random select one out
+# of every 10 points in the dataset.
+ptMask = vtk.vtkMaskPoints()
+ptMask.SetInputConnection(normals.GetOutputPort())
+ptMask.SetOnRatio(10)
+ptMask.RandomModeOn()
+
+# In this case we are using a cone as a glyph. We transform the cone so
+# its base is at 0,0,0. This is the point where glyph rotation occurs.
+cone = vtk.vtkConeSource()
+cone.SetResolution(6)
+transform = vtk.vtkTransform()
+transform.Translate(0.5, 0.0, 0.0)
+transformF = vtk.vtkTransformPolyDataFilter()
+transformF.SetInputConnection(cone.GetOutputPort())
+transformF.SetTransform(transform)
+
+# vtkGlyph3D takes two inputs: the input point set (SetInput) which can be
+# any vtkDataSet; and the glyph (SetSource) which must be a vtkPolyData.
+# We are interested in orienting the glyphs by the surface normals that
+# we previosuly generated.
+glyph = vtk.vtkGlyph3D()
+glyph.SetInputConnection(ptMask.GetOutputPort())
+glyph.SetSource(transformF.GetOutput())
+glyph.SetVectorModeToUseNormal()
+glyph.SetScaleModeToScaleByVector()
+glyph.SetScaleFactor(0.004)
+spikeMapper = vtk.vtkPolyDataMapper()
+spikeMapper.SetInputConnection(glyph.GetOutputPort())
+spikeActor = vtk.vtkActor()
+spikeActor.SetMapper(spikeMapper)
+spikeActor.GetProperty().SetColor(0.0, 0.79, 0.34)
+
+# Create the RenderWindow, Renderer and both Actors
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(franActor)
+ren.AddActor(spikeActor)
+
+renWin.SetSize(500, 500)
+ren.SetBackground(0.1, 0.2, 0.4)
+
+# Set a nice camera position.
+ren.ResetCamera()
+cam1 = ren.GetActiveCamera()
+cam1.Zoom(1.4)
+cam1.Azimuth(110)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/spikeF.vt b/examples/vtk_examples/VisualizationAlgorithms/spikeF.vt
new file mode 100644
index 0000000..c86a655
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/spikeF.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/streamSurface.py b/examples/vtk_examples/VisualizationAlgorithms/streamSurface.py
new file mode 100644
index 0000000..19e62e0
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/streamSurface.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+# This example demonstrates the generation of a streamsurface.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Read the data and specify which scalars and vectors to read.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# We use a rake to generate a series of streamline starting points
+# scattered along a line. Each point will generate a streamline. These
+# streamlines are then fed to the vtkRuledSurfaceFilter which stitches
+# the lines together to form a surface.
+rake = vtk.vtkLineSource()
+rake.SetPoint1(15, -5, 32)
+rake.SetPoint2(15, 5, 32)
+rake.SetResolution(21)
+rakeMapper = vtk.vtkPolyDataMapper()
+rakeMapper.SetInputConnection(rake.GetOutputPort())
+rakeActor = vtk.vtkActor()
+rakeActor.SetMapper(rakeMapper)
+
+integ = vtk.vtkRungeKutta4()
+sl = vtk.vtkStreamLine()
+sl.SetInputConnection(pl3d.GetOutputPort())
+sl.SetSource(rake.GetOutput())
+sl.SetIntegrator(integ)
+sl.SetMaximumPropagationTime(0.1)
+sl.SetIntegrationStepLength(0.1)
+sl.SetIntegrationDirectionToBackward()
+sl.SetStepLength(0.001)
+
+# The ruled surface stiches together lines with triangle strips.
+# Note the SetOnRatio method. It turns on every other strip that
+# the filter generates (only when multiple lines are input).
+scalarSurface = vtk.vtkRuledSurfaceFilter()
+scalarSurface.SetInputConnection(sl.GetOutputPort())
+scalarSurface.SetOffset(0)
+scalarSurface.SetOnRatio(2)
+scalarSurface.PassLinesOn()
+scalarSurface.SetRuledModeToPointWalk()
+scalarSurface.SetDistanceFactor(30)
+mapper = vtk.vtkPolyDataMapper()
+mapper.SetInputConnection(scalarSurface.GetOutputPort())
+mapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+actor = vtk.vtkActor()
+actor.SetMapper(mapper)
+
+# Put an outline around for context.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Now create the usual graphics stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.AddActor(rakeActor)
+ren.AddActor(actor)
+ren.AddActor(outlineActor)
+ren.SetBackground(1, 1, 1)
+
+renWin.SetSize(300, 300)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/streamSurface.vt b/examples/vtk_examples/VisualizationAlgorithms/streamSurface.vt
new file mode 100644
index 0000000..6b99abc
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/streamSurface.vt differ
diff --git a/examples/vtk_examples/VisualizationAlgorithms/warpComb.py b/examples/vtk_examples/VisualizationAlgorithms/warpComb.py
new file mode 100644
index 0000000..de5673d
--- /dev/null
+++ b/examples/vtk_examples/VisualizationAlgorithms/warpComb.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+
+# This example demonstrates how to extract "computational planes" from
+# a structured dataset. Structured data has a natural, logical
+# coordinate system based on i-j-k indices. Specifying imin,imax,
+# jmin,jmax, kmin,kmax pairs can indicate a point, line, plane, or
+# volume of data.
+#
+# In this example, we extract three planes and warp them using scalar
+# values in the direction of the local normal at each point. This
+# gives a sort of "velocity profile" that indicates the nature of the
+# flow.
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Here we read data from a annular combustor. A combustor burns fuel
+# and air in a gas turbine (e.g., a jet engine) and the hot gas
+# eventually makes its way to the turbine section.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# Planes are specified using a imin,imax, jmin,jmax, kmin,kmax
+# coordinate specification. Min and max i,j,k values are clamped to 0
+# and maximum value.
+plane = vtk.vtkStructuredGridGeometryFilter()
+plane.SetInputConnection(pl3d.GetOutputPort())
+plane.SetExtent(10, 10, 1, 100, 1, 100)
+plane2 = vtk.vtkStructuredGridGeometryFilter()
+plane2.SetInputConnection(pl3d.GetOutputPort())
+plane2.SetExtent(30, 30, 1, 100, 1, 100)
+plane3 = vtk.vtkStructuredGridGeometryFilter()
+plane3.SetInputConnection(pl3d.GetOutputPort())
+plane3.SetExtent(45, 45, 1, 100, 1, 100)
+
+# We use an append filter because that way we can do the warping,
+# etc. just using a single pipeline and actor.
+appendF = vtk.vtkAppendPolyData()
+appendF.AddInput(plane.GetOutput())
+appendF.AddInput(plane2.GetOutput())
+appendF.AddInput(plane3.GetOutput())
+warp = vtk.vtkWarpScalar()
+warp.SetInputConnection(appendF.GetOutputPort())
+warp.UseNormalOn()
+warp.SetNormal(1.0, 0.0, 0.0)
+warp.SetScaleFactor(2.5)
+normals = vtk.vtkPolyDataNormals()
+normals.SetInput(warp.GetPolyDataOutput())
+normals.SetFeatureAngle(60)
+planeMapper = vtk.vtkPolyDataMapper()
+planeMapper.SetInputConnection(normals.GetOutputPort())
+planeMapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
+planeActor = vtk.vtkActor()
+planeActor.SetMapper(planeMapper)
+
+# The outline provides context for the data and the planes.
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outline.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+outlineActor.GetProperty().SetColor(0, 0, 0)
+
+# Create the usual graphics stuff.
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+ren.AddActor(outlineActor)
+ren.AddActor(planeActor)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(500, 500)
+
+# Create an initial view.
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(8.88908, 0.595038, 29.3342)
+cam1.SetPosition(-12.3332, 31.7479, 41.2387)
+cam1.SetViewUp(0.060772, -0.319905, 0.945498)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VisualizationAlgorithms/warpComb.vt b/examples/vtk_examples/VisualizationAlgorithms/warpComb.vt
new file mode 100644
index 0000000..624b872
Binary files /dev/null and b/examples/vtk_examples/VisualizationAlgorithms/warpComb.vt differ
diff --git a/examples/vtk_examples/VolumeRendering/PseudoVolumeRendering.py b/examples/vtk_examples/VolumeRendering/PseudoVolumeRendering.py
new file mode 100644
index 0000000..7c48e49
--- /dev/null
+++ b/examples/vtk_examples/VolumeRendering/PseudoVolumeRendering.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+
+# Perform psuedo volume rendering in a structured grid by compositing
+# translucent cut planes. This same trick can be used for unstructured
+# grids. Note that for better results, more planes can be created. Also,
+# if your data is vtkImageData, there are much faster methods for volume
+# rendering.
+
+import vtk
+from vtk.util.colors import *
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create pipeline. Read structured grid data.
+pl3d = vtk.vtkPLOT3DReader()
+pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
+pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
+pl3d.SetScalarFunctionNumber(100)
+pl3d.SetVectorFunctionNumber(202)
+pl3d.Update()
+
+# A convenience, use this filter to limit data for experimentation.
+extract = vtk.vtkExtractGrid()
+extract.SetVOI(1, 55, -1000, 1000, -1000, 1000)
+extract.SetInputConnection(pl3d.GetOutputPort())
+
+# The (implicit) plane is used to do the cutting
+plane = vtk.vtkPlane()
+plane.SetOrigin(0, 4, 2)
+plane.SetNormal(0, 1, 0)
+
+# The cutter is set up to process each contour value over all cells
+# (SetSortByToSortByCell). This results in an ordered output of polygons
+# which is key to the compositing.
+cutter = vtk.vtkCutter()
+cutter.SetInputConnection(extract.GetOutputPort())
+cutter.SetCutFunction(plane)
+cutter.GenerateCutScalarsOff()
+cutter.SetSortByToSortByCell()
+
+clut = vtk.vtkLookupTable()
+clut.SetHueRange(0, .67)
+clut.Build()
+
+cutterMapper = vtk.vtkPolyDataMapper()
+cutterMapper.SetInputConnection(cutter.GetOutputPort())
+cutterMapper.SetScalarRange(.18, .7)
+cutterMapper.SetLookupTable(clut)
+
+cut = vtk.vtkActor()
+cut.SetMapper(cutterMapper)
+
+# Add in some surface geometry for interest.
+iso = vtk.vtkContourFilter()
+iso.SetInputConnection(pl3d.GetOutputPort())
+iso.SetValue(0, .22)
+normals = vtk.vtkPolyDataNormals()
+normals.SetInputConnection(iso.GetOutputPort())
+normals.SetFeatureAngle(45)
+isoMapper = vtk.vtkPolyDataMapper()
+isoMapper.SetInputConnection(normals.GetOutputPort())
+isoMapper.ScalarVisibilityOff()
+isoActor = vtk.vtkActor()
+isoActor.SetMapper(isoMapper)
+isoActor.GetProperty().SetDiffuseColor(tomato)
+isoActor.GetProperty().SetSpecularColor(white)
+isoActor.GetProperty().SetDiffuse(.8)
+isoActor.GetProperty().SetSpecular(.5)
+isoActor.GetProperty().SetSpecularPower(30)
+
+outline = vtk.vtkStructuredGridOutlineFilter()
+outline.SetInputConnection(pl3d.GetOutputPort())
+outlineTubes = vtk.vtkTubeFilter()
+outlineTubes.SetInputConnection(outline.GetOutputPort())
+outlineTubes.SetRadius(.1)
+
+outlineMapper = vtk.vtkPolyDataMapper()
+outlineMapper.SetInputConnection(outlineTubes.GetOutputPort())
+outlineActor = vtk.vtkActor()
+outlineActor.SetMapper(outlineMapper)
+
+# Create the RenderWindow, Renderer and Interactor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Add the actors to the renderer, set the background and size
+ren.AddActor(outlineActor)
+outlineActor.GetProperty().SetColor(banana)
+ren.AddActor(isoActor)
+isoActor.VisibilityOn()
+ren.AddActor(cut)
+opacity = .1
+cut.GetProperty().SetOpacity(1)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(640, 480)
+
+cam1 = ren.GetActiveCamera()
+cam1.SetClippingRange(3.95297, 50)
+cam1.SetFocalPoint(9.71821, 0.458166, 29.3999)
+cam1.SetPosition(2.7439, -37.3196, 38.7167)
+cam1.ComputeViewPlaneNormal()
+cam1.SetViewUp(-0.16123, 0.264271, 0.950876)
+
+# Cut: generates n cut planes normal to camera's view plane
+def Cut(n):
+    global cam1, opacity
+    plane.SetNormal(cam1.GetViewPlaneNormal())
+    plane.SetOrigin(cam1.GetFocalPoint())
+    cutter.GenerateValues(n, -5, 5)
+    clut.SetAlphaRange(opacity, opacity)
+    renWin.Render()
+ 
+
+# Generate 10 cut planes
+Cut(20)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VolumeRendering/PseudoVolumeRendering.vt b/examples/vtk_examples/VolumeRendering/PseudoVolumeRendering.vt
new file mode 100644
index 0000000..1f61c06
Binary files /dev/null and b/examples/vtk_examples/VolumeRendering/PseudoVolumeRendering.vt differ
diff --git a/examples/vtk_examples/VolumeRendering/SimpleRayCast.py b/examples/vtk_examples/VolumeRendering/SimpleRayCast.py
new file mode 100644
index 0000000..6032523
--- /dev/null
+++ b/examples/vtk_examples/VolumeRendering/SimpleRayCast.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# This is a simple volume rendering example that uses a
+# vtkVolumeRayCast mapper
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create the standard renderer, render window and interactor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Create the reader for the data
+reader = vtk.vtkStructuredPointsReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/ironProt.vtk")
+
+# Create transfer mapping scalar value to opacity
+opacityTransferFunction = vtk.vtkPiecewiseFunction()
+opacityTransferFunction.AddPoint(20, 0.0)
+opacityTransferFunction.AddPoint(255, 0.2)
+
+# Create transfer mapping scalar value to color
+colorTransferFunction = vtk.vtkColorTransferFunction()
+colorTransferFunction.AddRGBPoint(0.0, 0.0, 0.0, 0.0)
+colorTransferFunction.AddRGBPoint(64.0, 1.0, 0.0, 0.0)
+colorTransferFunction.AddRGBPoint(128.0, 0.0, 0.0, 1.0)
+colorTransferFunction.AddRGBPoint(192.0, 0.0, 1.0, 0.0)
+colorTransferFunction.AddRGBPoint(255.0, 0.0, 0.2, 0.0)
+
+# The property describes how the data will look
+volumeProperty = vtk.vtkVolumeProperty()
+volumeProperty.SetColor(colorTransferFunction)
+volumeProperty.SetScalarOpacity(opacityTransferFunction)
+volumeProperty.ShadeOn()
+volumeProperty.SetInterpolationTypeToLinear()
+
+# The mapper / ray cast function know how to render the data
+compositeFunction = vtk.vtkVolumeRayCastCompositeFunction()
+volumeMapper = vtk.vtkVolumeRayCastMapper()
+volumeMapper.SetVolumeRayCastFunction(compositeFunction)
+volumeMapper.SetInputConnection(reader.GetOutputPort())
+
+# The volume holds the mapper and the property and
+# can be used to position/orient the volume
+volume = vtk.vtkVolume()
+volume.SetMapper(volumeMapper)
+volume.SetProperty(volumeProperty)
+
+ren.AddVolume(volume)
+ren.SetBackground(1, 1, 1)
+renWin.SetSize(600, 600)
+renWin.Render()
+
+def CheckAbort(obj, event):
+    if obj.GetEventPending() != 0:
+        obj.SetAbortRender(1)
+ 
+renWin.AddObserver("AbortCheckEvent", CheckAbort)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VolumeRendering/SimpleRayCast.vt b/examples/vtk_examples/VolumeRendering/SimpleRayCast.vt
new file mode 100644
index 0000000..7cebbd6
Binary files /dev/null and b/examples/vtk_examples/VolumeRendering/SimpleRayCast.vt differ
diff --git a/examples/vtk_examples/VolumeRendering/SimpleTextureMap2D.py b/examples/vtk_examples/VolumeRendering/SimpleTextureMap2D.py
new file mode 100644
index 0000000..997f994
--- /dev/null
+++ b/examples/vtk_examples/VolumeRendering/SimpleTextureMap2D.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+
+# This is a simple volume rendering example that uses a
+# vtkVolumeTextureMapper2D mapper
+
+import vtk
+from vtk.util.misc import vtkGetDataRoot
+VTK_DATA_ROOT = vtkGetDataRoot()
+
+# Create the standard renderer, render window and interactor
+ren = vtk.vtkRenderer()
+renWin = vtk.vtkRenderWindow()
+renWin.AddRenderer(ren)
+iren = vtk.vtkRenderWindowInteractor()
+iren.SetRenderWindow(renWin)
+
+# Create the reader for the data
+reader = vtk.vtkStructuredPointsReader()
+reader.SetFileName(VTK_DATA_ROOT + "/Data/ironProt.vtk")
+
+# Create transfer mapping scalar value to opacity
+opacityTransferFunction = vtk.vtkPiecewiseFunction()
+opacityTransferFunction.AddPoint(20, 0.0)
+opacityTransferFunction.AddPoint(255, 0.2)
+
+# Create transfer mapping scalar value to color
+colorTransferFunction = vtk.vtkColorTransferFunction()
+colorTransferFunction.AddRGBPoint(0.0, 0.0, 0.0, 0.0)
+colorTransferFunction.AddRGBPoint(64.0, 1.0, 0.0, 0.0)
+colorTransferFunction.AddRGBPoint(128.0, 0.0, 0.0, 1.0)
+colorTransferFunction.AddRGBPoint(192.0, 0.0, 1.0, 0.0)
+colorTransferFunction.AddRGBPoint(255.0, 0.0, 0.2, 0.0)
+
+# The property describes how the data will look
+volumeProperty = vtk.vtkVolumeProperty()
+volumeProperty.SetColor(colorTransferFunction)
+volumeProperty.SetScalarOpacity(opacityTransferFunction)
+
+# The mapper knows how to render the data
+volumeMapper = vtk.vtkVolumeTextureMapper2D()
+volumeMapper.SetInputConnection(reader.GetOutputPort())
+
+# The volume holds the mapper and the property and can be used to
+# position/orient the volume
+volume = vtk.vtkVolume()
+volume.SetMapper(volumeMapper)
+volume.SetProperty(volumeProperty)
+
+ren.AddVolume(volume)
+renWin.Render()
+
+def CheckAbort(obj, event):
+    if obj.GetEventPending() != 0:
+        obj.SetAbortRender(1)
+ 
+renWin.AddObserver("AbortCheckEvent", CheckAbort)
+
+iren.Initialize()
+renWin.Render()
+iren.Start()
diff --git a/examples/vtk_examples/VolumeRendering/SimpleTextureMap2D.vt b/examples/vtk_examples/VolumeRendering/SimpleTextureMap2D.vt
new file mode 100644
index 0000000..2b8ef23
Binary files /dev/null and b/examples/vtk_examples/VolumeRendering/SimpleTextureMap2D.vt differ
diff --git a/examples/vtk_http.vt b/examples/vtk_http.vt
new file mode 100644
index 0000000..e006f58
Binary files /dev/null and b/examples/vtk_http.vt differ
diff --git a/extensions/http/README b/extensions/http/README
new file mode 100644
index 0000000..5ef9690
--- /dev/null
+++ b/extensions/http/README
@@ -0,0 +1,11 @@
+This folder contains files for adding vistrails to a regular web server.
+
+Just copy all the files in this directory to the folder where your web server
+files are located.
+Rename config.php.sample to config.php and modify it according to your server 
+installation. 
+
+More information is documented in the files.
+
+
+
diff --git a/extensions/http/config.php.sample b/extensions/http/config.php.sample
new file mode 100644
index 0000000..ca03a09
--- /dev/null
+++ b/extensions/http/config.php.sample
@@ -0,0 +1,82 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+//This file will store the configuration of your server
+// it will be used by all the other php scripts
+// Rename this file to config.php
+
+//This is where the RPC-XML server is running
+$VT_HOST = "localhost";
+$VT_PORT = 8080;
+
+//This controls how VisTrails will be accessed
+//Set it to false if you plan to execute in the command line
+$USE_VISTRAILS_XML_RPC_SERVER = True;
+
+//Set this to False if VisTrails server runs on a different machine
+$USE_LOCAL_VISTRAILS_SERVER = True;
+
+// Change this to point to the folder where run.py is
+// You won't need this if $USE_VISTRAILS_XML_RPC_SERVER is set to True
+// Used in run_vistrails.php
+$PATH_TO_VISTRAILS = '/vistrails/v1.2/vistrails';
+
+// Change this to point to the folder where the images should be generated
+// absoulte path should be used
+$PATH_TO_IMAGES = '/path/to/images/';
+
+// Change this to the web accessible path to the folder where the images were generated
+// Something like http://your.url.com$WEB_PATH_TO_IMAGES
+$WEB_PATH_TO_IMAGES = '/images/';
+
+// Change this to point to the folder where the workflow graphs should be generated
+// absoulte path should be used
+$PATH_TO_GRAPHS = '/path/to/graphs/';
+
+// Change this to the full url pointing to the root where the graphs were generated
+$URL_TO_GRAPHS = "http://your.domain.com/path/to/graphs/";
+
+// Change this to the full url pointing to the download.php script
+$URL_TO_DOWNLOAD = "http://your.domain.com/path/to/download.php";
+
+// Default configuration variables for database
+// They can be changed through the requests in the scripts
+// default database host
+$DB_HOST = 'your.hostname.com';
+// default databse port
+$DB_PORT = '3306';
+// default database name
+$DB_NAME = 'vistrails';
+?>
diff --git a/extensions/http/get_db_vistrail_list.php b/extensions/http/get_db_vistrail_list.php
new file mode 100644
index 0000000..d5830d2
--- /dev/null
+++ b/extensions/http/get_db_vistrail_list.php
@@ -0,0 +1,82 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+// This file will connect to VisTrails Server and return a page containing the 
+// list of vistrails available on the database
+// The url should follow this format:
+// run_vistrails.php?host=vistrails.org&db=vistrails
+// host and db are optional and you can set the default values below
+// if the port is different from the dafault you can also pass the new value on
+// the url
+
+//functions.php is located inside the ./mediawiki folder
+require_once 'functions.php';
+require_once 'config.php';
+
+// set variables with default values
+$host = $DB_HOST;
+$port = $DB_PORT;
+$dbname = $DB_NAME;
+$username = "vtserver";
+
+//Get the variables from the url
+if(array_key_exists('host', $_GET))
+	$host = $_GET['host'];
+if(array_key_exists('db',$_GET))
+	$dbname = $_GET['db'];
+if(array_key_exists('port',$_GET))
+	$port = $_GET['port'];
+
+
+//echo $host . $port . $dbname;
+$request = xmlrpc_encode_request('get_db_vt_list_xml',array($host, $port, $dbname));
+$response = do_call($VT_HOST,$VT_PORT,$request);
+$response = html_entity_decode($response);
+header("Content-Type: text/xml");
+clean_up($response);
+
+
+function clean_up($xmlstring){
+    try{
+	$node = @new SimpleXMLElement($xmlstring);
+	echo '<?xml version="1.0"?> '."\n";
+	echo $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0]->vistrails[0]->asXML();
+    } catch(Exception $e) {
+	echo "bad xml";
+    }
+}
+
+?>
diff --git a/extensions/http/get_vt_xml.php b/extensions/http/get_vt_xml.php
new file mode 100644
index 0000000..e2534b7
--- /dev/null
+++ b/extensions/http/get_vt_xml.php
@@ -0,0 +1,89 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+// This file will connect to vistrails XML RPC server and return a vistrail in
+// xml format
+// The url should follow this format:
+// get_vt_xml.php?host=vistrails.org&db=vistrails&vt=8
+// host and dbname are optional and you can set the default values below
+// if the port is different from the dafault you can also pass the new value on
+// the url
+//functions.php is located inside the ./mediawiki folder
+require_once 'functions.php';
+require_once 'config.php';
+
+// set variables with default values
+$host = $DB_HOST;
+$port = $DB_PORT;
+$dbname = $DB_NAME;
+$vtid = '';
+$username = "vtserver";
+
+//Get the variables from the url
+if(array_key_exists('host', $_GET))
+	$host = $_GET['host'];
+if(array_key_exists('db',$_GET))
+	$dbname = $_GET['db'];
+if(array_key_exists('port',$_GET))
+	$port = $_GET['port'];
+if(array_key_exists('vt',$_GET))
+	$vtid = $_GET['vt'];
+
+//Check if vtid was provided
+//echo $vtid;
+if($vtid != ''){
+	//echo $host . $port . $dbname . $vtid . $destdit . $version;
+    $request = xmlrpc_encode_request('get_vt_xml',
+ 	                                  array($host, $port, $dbname, $vtid));
+	$response = do_call($VT_HOST,$VT_PORT,$request);
+	$response = html_entity_decode($response);
+	header("Content-Type: text/xml");
+	clean_up($response);
+}
+else{
+	echo "ERROR: Vistrails id not provided.\n";
+}
+
+function clean_up($xmlstring){
+    try{
+	   $node = new SimpleXMLElement($xmlstring);
+	   echo '<?xml version="1.0"?> '."\n";
+	   echo $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0]->vistrail[0]->asXML();
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+?>
diff --git a/extensions/http/get_wf_pdf.php b/extensions/http/get_wf_pdf.php
new file mode 100644
index 0000000..9937b57
--- /dev/null
+++ b/extensions/http/get_wf_pdf.php
@@ -0,0 +1,137 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+// This file will connect to VisTrails XML RPC Server and return the url for
+// the pdf file of a workflow.
+// The url should follow this format:
+// get_wf_pdf.php?host=vistrails.org&db=vistrails&vt=8&version=598
+// host and dbname are optional and you can set the default values below
+// if the port is different from the dafault you can also pass the new value on
+// the url
+
+//functions.php is located inside the ./mediawiki folder
+require_once 'functions.php';
+require_once 'config.php';
+
+// set variables with default values
+$host = $DB_HOST;
+$port = $DB_PORT;
+$dbname = $DB_NAME;
+$vtid = '';
+$version = '';
+$username = "vtserver";
+$version_tag = '';
+
+//Get the variables from the url
+if(array_key_exists('host', $_GET))
+    $host = $_GET['host'];
+if(array_key_exists('db',$_GET))
+    $dbname = $_GET['db'];
+if(array_key_exists('port',$_GET))
+    $port = $_GET['port'];
+if(array_key_exists('vt',$_GET))
+    $vtid = $_GET['vt'];
+if(array_key_exists('version',$_GET))
+    $version = $_GET['version'];
+if(array_key_exists('tag',$_GET)){
+    $version_tag = $_GET['tag'];
+    if ($version_tag != ''){
+        $request = xmlrpc_encode_request('get_tag_version',
+                                         array($host, $port, $dbname, $vtid,
+                                               $version_tag));
+        $response = do_call($VT_HOST,$VT_PORT,$request);
+        $version = get_version_from_response($response);
+    }
+}
+if(array_key_exists('buildalways',$_GET))
+    $force_build = (bool) $_GET['buildalways'];
+        
+//echo $force_build;
+
+//Check if vtid and version were provided
+//echo $vtid . $version;
+if($vtid != '' and $version != ''){
+    //echo $host . $port . $dbname . $vtid . $version;
+    $filename = md5($host . '_'. $dbname .'_' . $port .'_' .$vtid . '_' . $version);
+    $filename = 'workflows/'.$filename . ".pdf";
+    $fullpath = $PATH_TO_GRAPHS. $filename;
+    $cached = file_exists($fullpath);
+    if($USE_LOCAL_VISTRAILS_SERVER or 
+       (!$cached or strcasecmp($force_build,'True') == 0)) {
+        $request = xmlrpc_encode_request('get_wf_graph_pdf',
+                                 array($host, $port, $dbname, $vtid, $version,
+                                 $USE_LOCAL_VISTRAILS_SERVER));
+        //echo $request;
+        $response = do_call($VT_HOST,$VT_PORT,$request);        
+        $path = clean_up($response, $filename);
+    } else {
+        $path = $filename;
+    }
+    echo "$URL_TO_GRAPHS$path";
+}
+else{
+    echo "ERROR: Vistrails id or version not provided.\n";
+}
+
+function get_version_from_response($xmlstring){
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->int[0];
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+function clean_up($xmlstring, $filename=""){
+    global $PATH_TO_GRAPHS, $USE_LOCAL_VISTRAILS_SERVER;
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        if ($USE_LOCAL_VISTRAILS_SERVER)
+            return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0];
+        else{
+            $contents = $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->base64[0];
+            $fileHandle = fopen($PATH_TO_GRAPHS. $filename, 'wb') or die("can't open file");
+            fputs($fileHandle, base64_decode($contents));
+            fclose($fileHandle);
+            return $filename;
+        }
+                  
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+?>
diff --git a/extensions/http/get_wf_xml.php b/extensions/http/get_wf_xml.php
new file mode 100644
index 0000000..6e1a59d
--- /dev/null
+++ b/extensions/http/get_wf_xml.php
@@ -0,0 +1,118 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+// This file will connect to VisTrails XML RPC Server and return a workflow
+// in XML format 
+// The url should follow this format:
+// get_wf_xml.php?host=vistrails.org&db=vistrails&vt=8&version=598
+// host and dbname are optional and you can set the default values below
+// if the port is different from the dafault you can also pass the new value on
+// the url
+
+//functions.php is located inside the ./mediawiki folder
+require_once 'functions.php';
+require_once 'config.php';
+
+// set variables with default values
+$host = $DB_HOST;
+$port = $DB_PORT;
+$dbname = $DB_NAME;
+$vtid = '';
+$version = '';
+$username = "vtserver";
+$version_tag = '';
+
+//Get the variables from the url
+if(array_key_exists('host', $_GET))
+	$host = $_GET['host'];
+if(array_key_exists('db',$_GET))
+	$dbname = $_GET['db'];
+if(array_key_exists('port',$_GET))
+	$port = $_GET['port'];
+if(array_key_exists('vt',$_GET))
+	$vtid = $_GET['vt'];
+if(array_key_exists('version',$_GET))
+	$version = $_GET['version'];
+if(array_key_exists('tag',$_GET)){
+	$version_tag = $_GET['tag'];
+	if ($version_tag != ''){
+		$request = xmlrpc_encode_request('get_tag_version',array($host, $port,
+																 $dbname, $vtid,
+																 $version_tag));
+		$response = do_call($VT_HOST,$VT_PORT,$request);
+		$version = get_version_from_response($response);
+	}
+}
+if(array_key_exists('buildalways',$_GET))
+	$force_build = (bool) $_GET['buildalways'];
+	
+//echo $force_build;
+
+//Check if vtid and version were provided
+//echo $vtid . $version;
+if($vtid != '' and $version != ''){
+	//echo $host . $port . $dbname . $vtid . $version;
+	$request = xmlrpc_encode_request('get_wf_xml',
+                                     array($host, $port, $dbname, $vtid, $version));
+	//echo $request;
+	$response = do_call($VT_HOST,$VT_PORT,$request);
+	$response = html_entity_decode($response);			
+	header("Content-Type: text/xml");
+	clean_up($response);
+}
+else{
+	echo "ERROR: Vistrails id or version not provided.\n";
+}
+
+function get_version_from_response($xmlstring){
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->int[0];
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+function clean_up($xmlstring){
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        echo '<?xml version="1.0"?> '."\n";
+	echo $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0]->workflow[0]->asXML();
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+?>
diff --git a/extensions/http/run_vistrails.php b/extensions/http/run_vistrails.php
new file mode 100644
index 0000000..b6fc09c
--- /dev/null
+++ b/extensions/http/run_vistrails.php
@@ -0,0 +1,270 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+// This file will execute vistrails and return a page containing the images
+// generated.
+// The url should follow this format:
+// run_vistrails.php?host=vistrails.org&db=vistrails&vt=8&version=598
+// host and dbname are optional and you can set the default values below
+// if the port is different from the dafault you can also pass the new value on
+// the url
+//functions.php is located inside the ./mediawiki folder
+require_once 'functions.php';
+require_once 'config.php';
+
+$SUPPORTED_IMAGE_FILES = array("png", "jpg", "gif");
+
+// set variables with default values
+$host = $DB_HOST;
+$port = $DB_PORT;
+$dbname = $DB_NAME;
+$vtid = '';
+$version = '';
+$username = "vtserver";
+$version_tag = '';
+$force_build = 'False';
+$pdf= 'False';
+$showtree = 'False';
+$showworkflow = 'False';
+
+//Get the variables from the url
+if(array_key_exists('host', $_GET))
+    $host = $_GET['host'];
+if(array_key_exists('db',$_GET))
+    $dbname = $_GET['db'];
+if(array_key_exists('port',$_GET))
+    $port = $_GET['port'];
+if(array_key_exists('vt',$_GET))
+    $vtid = $_GET['vt'];
+if(array_key_exists('version',$_GET))
+    $version = $_GET['version'];
+if(array_key_exists('tag',$_GET)){
+    $version_tag = $_GET['tag'];
+    if ($version_tag != ''){
+        $request = xmlrpc_encode_request('get_tag_version',array($host, $port,
+                                                                 $dbname, $vtid,
+                                                                 $version_tag));
+        $response = do_call($VT_HOST,$VT_PORT,$request);
+        $version = get_version_from_response($response);
+    }
+}
+if(array_key_exists('buildalways',$_GET))
+    $force_build = $_GET['buildalways'];
+
+if(array_key_exists('pdf',$_GET))
+    $pdf = $_GET['pdf'];
+if(array_key_exists('showworkflow',$_GET))
+    $showworkflow = $_GET['showworkflow'];
+
+if(array_key_exists('showtree',$_GET))
+    $showtree = $_GET['showtree'];
+
+//echo $force_build;
+
+//Check if vtid and version were provided
+if(($vtid != '' and $version != '') or
+  ($vtid != '' and strcasecmp($showtree,'True') == 0)){
+    $pdf_bool = False;
+    $pdf_tag = '';
+    if (strcasecmp($pdf,'True') == 0){
+        $pdf_bool = True;
+        $pdf_tag = '_pdf';
+    }
+    $build_always_bool = False;
+    if (strcasecmp($force_build,'True') == 0)
+        $build_always_bool = True;
+    if (strcasecmp($showtree,'True') == 0){
+        $filename = md5($host . '_'. $dbname .'_' . $port .'_' .$vtid);
+        if ($pdf_bool == True){
+            $func = "get_vt_graph_pdf";
+            $filename = 'vistrails/'.$filename . ".pdf";
+        } else {
+            $func = "get_vt_graph_png";
+            $filename = 'vistrails/'.$filename . ".png";
+        }
+        $request = xmlrpc_encode_request($func, array($host,
+                                                      $port,
+                                                      $dbname,
+                                                      $vtid,
+                                                      $USE_VISTRAILS_XML_RPC_SERVER));
+        $response = do_call($VT_HOST,$VT_PORT,$request);
+        $result = clean_up($response, $filename);
+        if ($pdf_bool == True)
+            $res = '<a href="' . $URL_TO_GRAPHS . $result .
+                            '">' . $result . '</a>';
+        else
+            $res = '<img src="'. $URL_TO_GRAPHS . $result.
+                       "\" alt=\"vt_id:$vtid\" />";
+        echo $res;
+    }
+    elseif (strcasecmp($showworkflow,'True') == 0){
+        $filename = md5($host . '_'. $dbname .'_' . $port .'_' .$vtid . '_' . $version);
+        if ($pdf_bool == True){
+             $func = "get_wf_graph_pdf";
+             $filename = 'workflows/'.$filename . ".pdf";
+        } else {
+             $func = "get_wf_graph_png";
+             $filename = 'workflows/'.$filename . ".png";
+        }
+        $fullpath = $PATH_TO_GRAPHS. $filename;
+        $cached = file_exists($fullpath);
+        if($USE_LOCAL_VISTRAILS_SERVER or 
+           (!$cached or strcasecmp($force_build,'True') == 0)) {
+            $request = xmlrpc_encode_request($func, array($host,
+                                                          $port,
+                                                          $dbname,
+                                                          $vtid,
+                                                          $version));
+            $response = do_call($VT_HOST,$VT_PORT,$request);
+            $result = clean_up($response, $filename);
+        } else {
+            $result = $filename;
+        }
+        if ($pdf_bool == True)
+            $res = '<a href="' . $URL_TO_GRAPHS . $result .
+                            '">' . $result . '</a>';
+        else
+            $res = '<img src="'. $URL_TO_GRAPHS . $result.
+                       "\" alt=\"vt_id:$vtid version:$version\" />";
+        echo $res;
+    }
+    else{
+        $destdir = $PATH_TO_IMAGES;
+        $destversion = $host . '_'. $dbname .'_' . $port . '_' .$vtid . '_' .
+                   $version. $pdf_tag;
+        $destversion = md5($destversion);
+        $destdir = $destdir . $destversion;
+        $result = '';
+        if((!path_exists_and_not_empty($destdir)) or strcasecmp($force_build,'True') == 0) {
+            if (!file_exists($destdir)){
+                mkdir($destdir);//,0770);
+                chmod($destdir,0770);
+            }
+
+            $request = xmlrpc_encode_request('run_from_db',
+                                         array($host, $port, $dbname, $vtid,
+                                                    $destdir, $version, $pdf_bool,
+                                                    '', $build_always_bool, '',
+                                                    $USE_LOCAL_VISTRAILS_SERVER));
+            $response = do_call($VT_HOST,$VT_PORT,$request);
+            $result = multiple_clean_up($response, $destdir);
+            //echo $result;
+        }
+       $files = scandir($destdir);
+       $n = sizeof($files);
+       if ($n > 2){
+          $res = '';
+          foreach($files as $filename) {
+             if($filename != '.' and $filename != '..'){
+                $info = pathinfo($filename);
+                if ( in_arrayi($info['extension'],$SUPPORTED_IMAGE_FILES)){
+                    list($width, $height, $type, $attr) = getimagesize($destdir.'/'.$filename);
+                    if ($width > 600)
+                        $width = 600;
+                    $res = $res . '<img src="'. $WEB_PATH_TO_IMAGES . $destversion.'/'.$filename.
+                       "\" alt=\"vt_id:$vtid version:$version\" width=\"$width\"/>";
+                }
+                else{
+                    //create an href tag
+                    $res = $res . '<a href="' . $WEB_PATH_TO_IMAGES .
+                            $destversion.'/'.$filename.'">' . $filename . '</a>';
+                    }
+            }
+        }
+        echo $res;
+       }
+       else{
+          echo "ERROR: Vistrails didn't produce any image.\n";
+          echo "This is the output: \n".$result;
+       }
+    }
+}
+else{
+    echo "ERROR: Vistrails id or version not provided.\n";
+}
+
+function get_version_from_response($xmlstring){
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        return $node->params[0]->param[0]->value[0]->int[0];
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+function clean_up($xmlstring, $filename=""){
+    global $PATH_TO_GRAPHS, $USE_LOCAL_VISTRAILS_SERVER;
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        if ($USE_LOCAL_VISTRAILS_SERVER)
+            return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0];
+        else{
+            $contents = $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->base64[0];
+            $fileHandle = fopen($PATH_TO_GRAPHS. $filename, 'wb') or die("can't open file");
+            fputs($fileHandle, base64_decode($contents));
+            fclose($fileHandle);
+            return $filename;
+        }
+                  
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+function multiple_clean_up($xmlstring, $destdir=""){
+    global $USE_LOCAL_VISTRAILS_SERVER;
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        //var_dump($node);
+        if ($USE_LOCAL_VISTRAILS_SERVER)
+            return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0];
+        else{
+            $contents = $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->struct[0];
+            foreach ($contents as $value){                                                                                                                  
+                $image_name = (string) $value->name[0];                                               
+                $image_contents = (string) $value->value[0]->base64[0];                               
+                $fileHandle = fopen($destdir.'/'. $image_name, 'wb') or die("can't open file");       
+                fputs($fileHandle, base64_decode($image_contents));                                   
+                fclose($fileHandle);                                                                  
+             }                                                                                       
+             return $destdir;                                                                        
+        }                                                                                                                                                                                    
+  } catch(Exception $e) {                                                                     
+    echo "bad xml";                                                                           
+  }                                       
+}
+
+?>
diff --git a/extensions/latex/Makefile b/extensions/latex/Makefile
new file mode 100644
index 0000000..535fae2
--- /dev/null
+++ b/extensions/latex/Makefile
@@ -0,0 +1,16 @@
+all: example example2 head           
+
+example:
+	pdflatex -shell-escape example
+
+example2:
+	pdflatex -shell-escape example2
+	bibtex example2
+	pdflatex -shell-escape example2
+	pdflatex -shell-escape example2
+
+head: 
+	pdflatex -shell-escape head
+
+clean:
+	\rm example.pdf example2.pdf head.pdf *.aux *.bbl *.blg *.log *~ *.cmdline *.cmdline.* example.out example2.out head.out
diff --git a/extensions/latex/README b/extensions/latex/README
new file mode 100644
index 0000000..dd30888
--- /dev/null
+++ b/extensions/latex/README
@@ -0,0 +1,91 @@
+This directory contains the vistrails package for latex.
+
+It allows you to include the image generated by vistrails 
+by calling vistrails directly.
+
+To use it, copy vistrails.sty and includevistrail.py to the same 
+place where your .tex files are.
+
+add the following lines to the beginning of the latex file:
+
+\usepackage{vistrails}
+
+If you want to run a local copy of vistrails (see head.tex file for instructions on the different platforms and versions of latex):
+
+\renewcommand{\vistrailspath}{/path/to/run.py}
+ 
+If you want to use a media wiki server (see http://www.vistrails.org/usersguide/v2.0/html/latex.html for instructions on how to set up the server), add the following to your tex file:
+
+\renewcommand{\vistrailspath}{http://yourwebserver.somethingelse/run_vistrails.php}
+
+To embed the links in the generated images, use 
+\renewcommand{\vistrailsdownload}{http://yourwebserver.somethingelse/download.php}
+or just set to empty to make the images not clickable:
+\renewcommand{\vistrailsdownload}{}
+
+This extension uses python. If you don't have python on your path, use this 
+to set the python interpreter:
+
+\renewcommand{\vistrailspythonpath}{python}
+
+
+Then include the following command where you would like to include 
+the vistrails images:
+
+\vistrails[host=<your_host>,
+db=vistrails,
+version=<version_number>,
+vtid=<vistrails_id>,
+tag=<tag>
+port=3306,
+buildalways, %will force execution or download
+execute, % vistrails will execute the workflow after the user opens it after clicking on the image
+showspreadsheetonly, % only the spreadsheet will be shown when the user opens the workflow 
+pdf, % download images as pdf files
+showworkflow, % show the workflow instead of the results
+showtree, % show version tree instead of the results 
+getvtl, % will also download the vistrail/workflow
+]{width=0.45\linewidth}
+
+The tag, port, buildalways, execute, showspreadsheetonly and pdf options are optional. 
+The default value for port is 3306. 
+If buildalways is provided it will always call 
+vistrails, even if it was already called once for the same combination
+of host, db, version, port and vt_id.
+If tag is provided, version can be ommitted and buildalways is implicit.
+execute and showspreasheetonly will affect the link on the generated pdf. If
+execute is provided the workflow will be execute when open, and
+showspreadsheetonly will show initially only the spreadsheet.
+pdf will return the results from the spreadsheet as pdf files
+
+The options inside { }  are the options you would give to 
+\includegraphics{} command
+
+After running at least once, VisTrails will cache the images and latex 
+instructions. 
+The latex code will be in the "cached" folder and the images in 
+vistrails_images.
+
+If you set the \vistrailspythonpath to a invalid path VisTrails will use 
+the cached files.
+
+The option -shell-escape needs to be activated on the latex command line:
+
+pdflatex -shell-escape example.tex
+
+Vistrails will create in the current directory a directory called 
+vistrails_images/host_db_vtid_version with the png files generated by 
+the spreadsheet.
+
+See head.tex for a complete example of usage.
+
+It is also possible to embed workflow results stored in crowdlabs.org
+
+To use it, copy crowdlabs.sty and includecrowdlabs.py to the same 
+place where your .tex files are. Do not use this in conjunction with the vistrails extension.
+
+add the following lines to the beginning of the latex file:
+
+\usepackage{crowdlabs}
+
+Then go to crowdlabs.org and visit the page of the workflow you want to embed and copy the embed to Latex snippet.
diff --git a/extensions/latex/crowdlabs.sty b/extensions/latex/crowdlabs.sty
new file mode 100644
index 0000000..a9ef2f7
--- /dev/null
+++ b/extensions/latex/crowdlabs.sty
@@ -0,0 +1,105 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Copyright (C) 2011-2014, NYU-Poly.
+%% Copyright (C) 2006-2011, University of Utah. 
+%% All rights reserved.
+%% Contact: contact at vistrails.org
+%%
+%% This file is part of VisTrails.
+%%
+%% "Redistribution and use in source and binary forms, with or without 
+%% modification, are permitted provided that the following conditions are met:
+%%
+%%  - Redistributions of source code must retain the above copyright notice, 
+%%    this list of conditions and the following disclaimer.
+%%  - Redistributions in binary form must reproduce the above copyright 
+%%    notice, this list of conditions and the following disclaimer in the 
+%%    documentation and/or other materials provided with the distribution.
+%%  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Note: shell-escape needs to be activated for this to work.
+%% This can either be done by passing -shell-escape as an option to
+%% latex or by adding/changing "shell_escape = t" in your texmf.cnf .
+
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesPackage{crowdlabs}[2013/06/07 v0.2 CrowdLabs in LaTeX]
+
+%% keyval package allows us to define arguments in a command as key-value pairs,
+%%  which is more convenient
+
+\RequirePackage{graphicx,keyval,ifthen}
+
+%% This is to hide the border of the included image
+\RequirePackage[pdfborder={0 0 0}]{hyperref}
+
+%% we will generate a file for passing to python
+\newwrite\pythonincludein
+
+%% by default we will run vistrails on the web server
+\newcommand{\urlcrowdlabs}{http://www.crowdlabs.org}
+
+%% full path to python or just python if it is on PATH
+\newcommand{\pythonpath}{python}
+
+%% this is for allowing line breaks, empty values in vistrails command's options
+\def\crowdlabs{\kernel at ifnextchar [{\@crowdlabs}{\@crowdlabs[]}}
+
+\def\@crowdlabs[#1]#2{%
+
+%% macros that will be used
+\def\clpdf{false}
+\def\clworkflow{false}
+\def\clvtid{}
+\def\clwfid{}
+\def\clbuildalways{false}
+
+\immediate\openout\pythonincludein=\jobname.crowd.cmdline
+\immediate\write\pythonincludein{url=\urlcrowdlabs}
+\setkeys{cl}{#1}
+
+\ifthenelse{\equal{\clvtid}{}}{% it's a workflow
+	\immediate\write\pythonincludein{wfid=\clwfid}
+	\immediate\write\pythonincludein{workflow=\clworkflow}
+}
+{% else it's a vistrail
+	\immediate\write\pythonincludein{vtid=\clvtid}
+}
+\immediate\write\pythonincludein{buildalways=\clbuildalways}
+\immediate\write\pythonincludein{pdf=\clpdf}
+
+\ifx\@empty#2\@empty
+    \immediate\write\pythonincludein{other=}
+\else
+    \immediate\write\pythonincludein{other=\string#2}
+\fi
+\immediate\closeout\pythonincludein
+\immediate\write18{"\pythonpath" includecrowdlabs.py \jobname.crowd.cmdline > \jobname.crowd.cmdline.tex 2> \jobname.crowd.cmdline.err}
+\immediate\input\jobname.crowd.cmdline.tex
+}
+
+%% key-value pairs for the command's options
+\define at key{cl}{vtid}{\def\clvtid{#1}}
+\define at key{cl}{wfid}{\def\clwfid{#1}}
+\define at key{cl}{showworkflow}[true]{\def\clworkflow{#1}}
+\define at key{cl}{pdf}[true]{\def\clpdf{#1}}
+\define at key{cl}{buildalways}[true]{\def\clbuildalways{#1}}
+
+
+
+
diff --git a/extensions/latex/example.pdf b/extensions/latex/example.pdf
new file mode 100644
index 0000000..83c2057
Binary files /dev/null and b/extensions/latex/example.pdf differ
diff --git a/extensions/latex/example.tex b/extensions/latex/example.tex
new file mode 100644
index 0000000..49fd391
--- /dev/null
+++ b/extensions/latex/example.tex
@@ -0,0 +1,246 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Copyright (C) 2011-2014, NYU-Poly.
+%% Copyright (C) 2006-2011, University of Utah. 
+%% All rights reserved.
+%% Contact: contact at vistrails.org
+%%
+%% This file is part of VisTrails.
+%%
+%% "Redistribution and use in source and binary forms, with or without 
+%% modification, are permitted provided that the following conditions are met:
+%%
+%%  - Redistributions of source code must retain the above copyright notice, 
+%%    this list of conditions and the following disclaimer.
+%%  - Redistributions in binary form must reproduce the above copyright 
+%%    notice, this list of conditions and the following disclaimer in the 
+%%    documentation and/or other materials provided with the distribution.
+%%  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{article}
+
+%% This file illustrates how to embed images of vistrails published on
+%% crowdLabs.  Please refer to
+%% http://www.crowdlabs.org/site_media/static/user_docs/vistrails_usage.html
+%% for instructions on how to publish workflows to crowdLabs and to
+%% http://www.crowdlabs.org/site_media/static/user_docs/embedding.html for
+%% more details about how to use this extension.
+
+%% This is crowdlabs main package
+\usepackage{crowdlabs}
+\usepackage{subfigure}
+
+%% The crowdlabs extension requires python. If your python is not in the path,
+%% uncomment the line below and edit with the path to your python executable
+%\renewcommand{\pythonpath}{C:/Python27/python.exe}
+
+%% You need to enable the crowdlabs package. Make sure crowdlabs.sty is located
+%% in the same directory as the .tex file in which you want to embed the images.
+
+%% If crowdlabs you are using is not on crowdlabs.org, 
+%% uncomment the line below and configure it with the current server
+%\renewcommand{\urlcrowdlabs}{http://yourcrowdlabsserver.com}
+
+\title{Embedding workflows in \LaTeX\ using crowdLabs}
+\author{The VisTrails Team}
+\begin{document}
+\maketitle
+\begin{abstract}
+This article shows how to embed images from workflows stored on
+\url{www.crowdlabs.org} in a \LaTeX\ document. The images can be
+workflow results, workflow graphs or VisTrails' history trees.
+\end{abstract}
+
+\begin{figure}[th]
+\begin{center}
+\crowdlabs[wfid=1054,
+buildalways=false]{width=0.50\linewidth}
+\end{center}
+\vspace{-.5cm}
+\caption{Embedding the image generated by the Isosurface workflow. Click on the image to see the details on \url{www.crowdlabs.org}.}
+\label{fig:isosurface}
+\end{figure}
+
+\section{Introduction}
+%% Please refer to \\
+%%  http://www.crowdlabs.org/site\_media/static/user\_docs/vistrails\_usage.html
+%%  \\
+%% for instructions on how to publish workflows on crowdLabs  and to \\
+%%  http://www.crowdlabs.org/site\_media/static/user\_docs/embedding.html \\
+%% for more details about how to use this extension.
+
+After uploading your workflows to crowdLabs\footnote{Please visit
+\url{http://www.crowdlabs.org/site_media/static/user_docs/vistrails_usage.html}
+if you need instructions on how to publish workflows to crowdLabs}, you need the following requirements in order to embed the workflows in the \LaTeX\ file:
+\begin{itemize}
+\item Python (\url{www.python.org})
+\item the file \textsf{crowdlabs.sty}
+\item and the file \textsf{includecrowdlabs.py} 
+\end{itemize} 
+
+Both \textsf{crowdlabs.sty} and \textsf{includecrowdlabs.py} are
+located in the same directory as this document and they should be
+copied to the same folder that your main document is located.
+
+\subsection{Preparing the \LaTeX\ document}
+
+After copying the files, you need to configure your document.In the
+preamble of the \LaTeX\ file add the crowdlabs package: 
+\begin{verbatim}
+   \usepackage{crowdlabs}
+\end{verbatim}
+
+As we mentioned before, the crowdLabs package requires Python to
+run. If the python executable is not accessible in the PATH, you will
+need to set the \texttt{\textbackslash pythonpath} command with the correct path for your environment:
+ 
+\begin{verbatim}
+   \renewcommand{\pythonpath}{C:/Python27/python.exe}
+\end{verbatim}
+
+Also, by default, \url{crowdlabs.org} will be used as the main server, but
+you can use your own crowdLabs server setting the \texttt{\textbackslash urlcrowdlabs} command: 
+\begin{verbatim}
+   \renewcommand{\urlcrowdlabs}{http://yourcrowdlabsserver.com}
+\end{verbatim}
+
+\section{Embedding workflows}
+If you go to \url{crowdlabs.org} and visit the details page of the
+workflow you would like to embed, you will see a tab just below the
+resulting image, named \textsf{Embed this Workflow}. Clicking on it,
+will display snippets you can use to embed that particular workflow in
+different types of documents. So copy the text displayed in the
+\textsf{In LaTex} box. For example, we will embed the image produced
+by the workflow
+\textbf{Isosurface}\footnote{\url{http://www.crowdlabs.org/vistrails/workflows/details/1054/}}.
+
+We copied and pasted the following text into this document:
+\begin{verbatim}
+  \crowdlabs[wfid=1054,
+   buildalways=false]{}
+\end{verbatim}
+
+And it generated the image in Figure~\ref{fig:isosurface}. Clicking on the image will take you to that workflow's details page.
+
+\subsection{Controlling the appearance of the image}
+In the \texttt{\textbackslash crowdlabs} command, there are different options to control how the workflow will be embedded. The example above is the simplest way to embed the results of a workflow. To control the size of the image, you write between the curly braces, the options you would normally send to the  \texttt{\textbackslash includegraphics} command. For example:  
+
+\begin{verbatim}
+  \crowdlabs[wfid=1054,
+   buildalways=false]{width=0.45\linewidth}
+\end{verbatim}
+
+You can also use the \texttt{\textbackslash crowdlabs} command together with the \texttt{\textbackslash subfigure} command:
+\begin{verbatim}
+  \begin{figure}[t]
+     \centering{
+        \subfigure[Isosurface]{\label{fig:isosurface2}  
+           \crowdlabs[wfid=1054,
+             buildalways=false]{width=0.35\linewidth}}
+        \subfigure[Volume Rendering]{\label{fig:vr}  
+            \crowdlabs[wfid=1046,
+             buildalways=false]{width=0.35\linewidth}} }
+  \end{figure}
+\end{verbatim}
+
+\begin{figure}[t]
+\centering{
+\mbox{\subfigure[Isosurface]
+ {\label{fig:isosurface2}  
+  \crowdlabs[wfid=1054,
+   buildalways=false]{width=0.35\linewidth} 
+ }
+\subfigure[Volume Rendering]
+ {\label{fig:vr}  
+  \crowdlabs[wfid=1046,
+  buildalways=false]{width=0.35\linewidth}
+ }}
+}
+\caption{Using the \texttt{\textbackslash crowdlabs} command with the \texttt{\textbackslash subfigure} command.}
+\label{fig:subfigure}
+\end{figure}
+
+\subsection{Caching images}
+The \textsf{buildalways} option controls whether the images should be cached or not. \textsf{buildalways=false} means that the image will be downloaded only once and every time that you compile your \LaTeX\ document, the image downloaded will be reused. On the other hand, if you set \textsf{buildalways=true}, the image will be downloaded from crowdLabs every time the document is compiled. The images are kept inside the \textsf{crowdlabs\_images} folder.
+
+\subsection{Embedding the workflow graph}
+To embed the workflow graph, just use the \textsf{showworkflow} option inside the \texttt{\textbackslash crowdlabs} command. For example, this is the command to embed the workflow graph that generated Figure~\ref{fig:isosurface}:\\
+
+\begin{verbatim}
+  \crowdlabs[wfid=1054,
+   showworkflow,
+   buildalways=false]{width=0.60\linewidth}
+\end{verbatim}
+
+And it will generate Figure~\ref{fig:workflow}.
+\begin{figure}[th]
+\begin{center}
+\crowdlabs[wfid=1054,
+showworkflow,
+pdf, % use the pdf key to generate in pdf
+buildalways=false]{width=0.60\linewidth}
+\end{center}
+\vspace{-.5cm}
+\caption{Isosurface workflow that generated Figure~\ref{fig:isosurface}}
+\label{fig:workflow}
+\end{figure}
+
+\subsection{Embedding figures in the PDF format}
+If you want to embed the figure in the PDF format, use the \textsf{pdf} option:
+
+\begin{verbatim}
+  \crowdlabs[wfid=1054,
+   showworkflow,
+   pdf,
+   buildalways=false]{width=0.60\linewidth}
+\end{verbatim}
+
+
+\subsection{Embedding VisTrails' history trees}
+
+It is also possible to embed the history tree of a Vistrail. To do that, use the \textsf{vtid=<...>} instead of the \textsf{wfid=<...>} option.
+
+\begin{verbatim}
+  \crowdlabs[vtid=209,
+  buildalways=false]{width=0.90\linewidth}    
+\end{verbatim}
+
+To get the \textsf{vtid} of a vistrail, just visit the page of the vistrail in crowdLabs and copy the number that appears in the address bar at the end of the url:
+
+\begin{verbatim}
+    http://www.crowdlabs.org/vistrails/details/209/
+\end{verbatim}
+
+So for the address above, 209 is the \textsf{vtid} of the vistrail \textbf{terminator-latex}.
+
+The command above generates the image in Figure~\ref{fig:tree}.
+\begin{figure}[th]
+\begin{center}
+\crowdlabs[vtid=209,
+% pdf, %uncomment this for using the pdf format
+buildalways=false]{width=0.90\linewidth}
+\end{center}
+\vspace{-.5cm}
+\caption{History tree containing the workflows used in this document}
+\label{fig:tree}
+\end{figure}
+
+The \textsf{pdf} option can also be used if you want to embed the tree in PDF format.
+
+\end{document}
diff --git a/extensions/latex/example2.bib b/extensions/latex/example2.bib
new file mode 100644
index 0000000..ef8a6b4
--- /dev/null
+++ b/extensions/latex/example2.bib
@@ -0,0 +1,3654 @@
+ at Book{Schroeder:2003:VTK,
+  author = 	 {Will Schroeder and Ken Martin and Bill Lorensen},
+  title = 	 {The Visualization Toolkit An Object-Oriented Approach To 3D Graphics},
+  publisher = 	 {Kitware},
+  year = 	 2003
+}
+
+ at Article{lee at ieee1995,
+  author = 	 {Edward A. Lee and Thomas M. Parks},
+  title = 	 {{Dataflow Process Networks}},
+  journal = 	 {Proceedings of the IEEE},
+  year = 	 {1995},
+  volume = 	 {83},
+  number = 	 {5},
+  pages = 	 {773-801},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at string{sigmod = "Proc. of ACM SIGMOD"}
+ at string{pods = "Proc. of ACM PODS"}
+ at string{vldb = "Proc. of VLDB"}
+ at string{www = "Proc. of WWW"}
+ at string{sigmod-record = "SIGMOD Record"}
+ at string{aaai = "Proc. of AAAI"}
+ at string{dood = "Proc. of DOOD"}
+ at string{icde = "Proc. of ICDE"}
+% @string{webdb = "Proc. of the Workshop on Web and Databases"}
+ at string{webdb = "Proc. of WebDB"}
+ at string{tods = "ACM TODS"}
+ at string{jiis = "Journal of Intelligent Information Systems"}
+ at string{icdt = "Proc. of ICDT"}
+ at string{dexa = "Proc. of DEXA"}
+ at string{dexaws = "Proc. of DEXA Workshop"}
+ at string{ssdbm = "Proc. of the Conference on Scientific and Statistical Database Management"}
+ at string{jep = "Journal of Electronic Publishing"}
+ at string{vis = "Prof. of IEEE Visualization"}
+ at string{supercomputing = "Prof. of Supercomputing"} 
+ at string{spie = "Proc. of SPIE"} 
+ at string{siggraph = "Proc. of SIGGRAPH"} 
+ at string{lpnmr = "Proc. of the International Conference on
+                  Logic Programming and Non-Monotonic Reasoning"}
+ at string{infovis = "Proc. of IEEE Information Visualization Symposium"}                  
+ at string{volvis = "Proc. IEEE Symposium on Volume
+                  Visualization and Graphics"}                  
+                  
+ at string{sigmod = "ACM SIGMOD"}
+ at string{pods = " ACM PODS"}
+ at string{vldb = " VLDB"}
+ at string{www = " WWW"}
+ at string{sigmod-record = "SIGMOD Record"}
+ at string{aaai = " AAAI"}
+ at string{dood = " DOOD"}
+ at string{icde = " ICDE"}
+ at string{webdb = "WebDB"}
+ at string{tods = "ACM TODS"}
+ at string{jiis = "Journal of Intelligent Information Systems"}
+ at string{icdt = "ICDT"}
+ at string{dexa = " DEXA"}
+ at string{dexaws = "DEXA Workshop"}
+ at string{ssdbm = "SSDBM"}
+ at string{jep = "Journal of Electronic Publishing"}
+ at string{vis = "IEEE Visualization"}
+ at string{supercomputing = "Supercomputing"} 
+ at string{spie = "SPIE"} 
+ at string{siggraph = "SIGGRAPH"} 
+ at string{lpnmr = "LPNMR"}
+ at string{infovis = "IEEE Information Visualization Symposium"}                  
+ at string{volvis = "IEEE VolVis"}                  
+ at string{plilp = "PLILP"}                  
+ at string{cganda = "IEEE Computer Graphics and Applications"}
+%% {Conference on Innovative Data Systems Research (CIDR)},                  
+ at string{cidr = "CIDR"}
+ at string{vis = "Proceedings of IEEE Visualization"}
+ at string{infovis = "Proceedings of IEEE Information Visualization Symposium"}                  
+ at string{volvis = "Proceedings of  IEEE VolVis"}                  
+ at string{spie = "Proceedings of  SPIE"} 
+ at string{cidr = "Proceedings of CIDR"}
+ at string{eextt = "Proceedings of EEXTT"}
+ at string{cikm = "Proceedings of CIKM"}
+ at string{xsym = "Proceedings of XML Database Symposium (XSym)"}
+ at string{mobilesearch = "Proceedings of the WWW Workshop on Mobile Search"}
+ at string{edbt = "Proceedings of EDBT"}
+ at string{sbbd = "Proceedings of SBBD"}
+ at string{widm = "Proceedings of WIDM"}
+ at string{fsttcs= "Proceedings of FSTTCS"}
+
+ at string{sigmod = "Proceedings of ACM SIGMOD"}
+ at string{pods = "Proceedings of PODS"}
+ at string{vldb = "Proceedings of VLDB"}
+ at string{www = "Proceedings of WWW"}
+ at string{wwwposter = "Poster Proceedings of WWW"}
+ at string{sigmod-record = "SIGMOD Record"}
+ at string{aaai = "Proceedings of AAAI"}
+ at string{dood = "Proceedings of DOOD"}
+ at string{icde = "Proceedings of ICDE"}
+% @string{webdb = "Proceedings of the Workshop on Web and Databases"}
+ at string{webdb = "Proceedings of WebDB"}
+ at string{tods = "ACM TODS"}
+ at string{jiis = "Journal of Intelligent Information Systems"}
+ at string{icdt = "Proceedings of ICDT"}
+ at string{dexa = "Proceedings of DEXA"}
+ at string{scishort = "SCI Institute--Univ. of Utah"}
+
+ at Article{analogy at tvcg2007,
+  author = 	 {C. Scheidegger and H. Vo and D. Koop and J. Freire
+                  and C. Silva},
+  title = 	 {Scalable Manipulation Primitives for
+    Visualization Systems},
+  journal = 	 {IEEE Transactions on Visualization and Computer Graphics},
+  year = 	 {2007},
+  OPTvolume = 	 {7},
+  OPTnumber = 	 {3},
+  OPTpages = 	 {275-287},
+  OPTmonth = 	 {July-September},
+  note = 	 {Accepted with minor revisions},
+  OPTannote = 	 {},
+  OPTURL =       {http://www.cs.ucdavis.edu/~ma/papers/TVCG2001.pdf}
+}
+
+
+
+ at Book{norman at book1994,
+  author = 	 {Donald A. Norman },
+  title = 	 {Things That Make Us Smart: Defending Human Attributes in the Age of the Machine},
+  publisher = 	 {Addison Wesley},
+  year = 	 {1994},
+}
+
+
+ at Misc{sdm at web,
+  key = 	 {SDM},
+  title = 	 {{Scientific Data Management Center}},
+  note = 	 {\url{http://sdm.lbl.gov/sdmcenter}},
+}
+
+ at Misc{sdm-report-july-sept-2005,
+  key = {SDM},
+  OPTauthor = 	 {},
+  title = 	 {{SDM-Center Quarterly Report}},
+  note = 	 {http://sdmcenter.lbl.gov/quarterly.reports/SDM.quarterly.July-Sept.2005.doc},
+}
+
+
+
+ at inproceedings{brodlie at vis1993,
+ author = {Ken Brodlie and Andrew Poon and Helen Wright and Lesley Brankin and Greg Banecki and Alan Gay},
+ title = {{GRASPARC}: a problem solving environment integrating computation and visualization},
+ booktitle = {IEEE Visualization '93},
+ year = {1993},
+ pages = {102--109},
+ }
+
+ at TechReport{vt-exp,
+  author = 	 {S. Callahan and J. Freire and E. Santos and C. Scheidegger and C. Silva and H. Vo},
+  title = 	 {Using Provenance to Streamline Data Exploration through Visualization},
+  institution =  scishort,
+  year = 	 {2006},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 {UUSCI-2006-016},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+
+ at article{simmhan at sigrec2005,
+ author = {Yogesh L. Simmhan and Beth Plale and Dennis Gannon},
+ title = {A survey of data provenance in e-science},
+ OPTjournal = {SIGMOD Rec.},
+journal = sigmod-record,
+ volume = {34},
+ number = {3},
+ year = {2005},
+ OPTissn = {0163-5808},
+ pages = {31--36},
+ OPTdoi = {http://doi.acm.org/10.1145/1084805.1084812},
+ OPTpublisher = {ACM Press},
+ OPTaddress = {New York, NY, USA},
+ }
+
+
+ at Book{vis-challenges2006,
+  author = 	 {Chris Johnson and Robert Moorhead and Tamara Munzner and Hanspeter Pfister and Penny Rheingans and Terry S. Yoo},
+  ALTeditor = 	 {},
+  title = 	 {NIH/NSF Visualization Research Challenges Report},
+  publisher = 	 {IEEE},
+  year = 	 {2006},
+  OPTkey = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+
+ at Misc{emulab,
+  key = 	 {emulab},
+  OPTauthor = 	 {},
+  title = 	 {{The Emulab Network Emulation Testbed}},
+  OPThowpublished = {},
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  note = 	 {\\\url{http://www.emulab.net}},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{eide at usenix2006,
+  author =	 "Eric Eide and Tim Stack and Leigh Stoller and \freiremarkref{\meabbrev} and Jay Lepreau",
+  title =	 "Integrated scientific workflow management for the Emulab network testbed",
+  pages = "363--368",
+  year =	 2006,
+  booktitle =	 {Proceedings of USENIX},
+  OPTnote =	 "To appear"
+}
+
+
+ at InProceedings{Baptista:2003:EOF,
+  author =	 {A. Baptista and T. Leen and Y. Zhang and A. Chawla
+                  and D. Maier and W.-Chi Feng and W.-Chang Feng and
+                  J. Walpole and C. Silva and \freiremarkref{\meabbrev}},
+  title =	 {Environmental Observation and Forecasting Systems:
+                  Vision, Challenges and Successes of a Prototype},
+  booktitle =	 {Conference on Systems Science and Information
+                  Technology for Environmental Applications
+                  (ISEIS)},
+  year =	 2003
+}
+
+ at inproceedings{roberts at vdea2000,
+author = {Jonathan C. Roberts},
+title = {{Multiple-View and Multiform Visualization}},
+OPTmonth = {January},
+year = {2000},
+pages = {176-185},
+keywords = {Visualization, Multiple views, Multiform, Abstraction},
+note = {},
+url = {http://www.cs.ukc.ac.uk/pubs/2000/963},
+OPTbooktitle = {Visual Data Exploration and Analysis VII, Proceedings of SPIE},
+booktitle = spie,
+OPTeditor = {Robert Erbacher and Alex Pang and Craig Wittenbrink and Jonathan Roberts},
+OPTorganization = {IS\&T and SPIE},
+OPTpublication_type = {inproceedings},
+OPTsubmission_id = {26938_949431288},
+OPTvolume = {3960},
+}
+
+ at inproceedings{roberts at iv98,
+author = {Jonathan C. Roberts},
+title = {{On Encouraging Multiple Views for Visualization}},
+month = {July},
+year = {1998},
+pages = {8-14},
+keywords = {visualization, multiple views, multiform, visualization system},
+note = {},
+url = {http://www.cs.ukc.ac.uk/pubs/1998/600},
+ISBN = {0-8186-8509-3},
+ISSN = {1093-9547},
+booktitle = {IV'98 - Proceedings International Conference on Information Visualization },
+editor = {Ebad Banissi and Farzad Khosrowshahi and Muhammad Sarfraz},
+publisher = {IEEE Computer Society},
+}
+
+ at InProceedings{roberts at waltz98,
+  author =	 {Jonathan C. Roberts},
+  title =	 {Waltz - Exploratory Visualization Tool For Volume
+                  Data, Using Multiform Abstract Displays},
+  OPTbooktitle =	 {Proceedings of SPIE},
+booktitle =	 spie,
+  pages =	 {112-122},
+  year =	 1998,
+  volume =	 3298
+}
+
+ at InProceedings{pattison-and-phillips,
+  author =	 {Tim Pattison and Matthew Phillips},
+  title =	 {View Coordination Architecture for Information
+                  Visualization},
+  booktitle =	 {Proceedings of Australian Symposium on Information
+                  Visualization, Sydney, Australia},
+  pages =	 {165-171},
+  year =	 2001
+}
+
+ at inproceedings{ma at vis1999,
+title	=	{Image Graps- A Novel Interface for Visual Data Exploration},
+booktitle	=	vis,
+author	=	{Kwan-Liu Ma },
+year	=	{1999},
+OPTkeywords	=	{collaborative visualization, scientific visualization, user interface design, volume rendering.},
+pages	=	{81-88},
+OPTorganization	=	{IEEE},
+OPTpublisher	=	{IEEE},
+OPTeventtime	=	{October 1999},
+OPTabstract	=	{For types of data visualization where the cost of producing images is high, and the relationship between the rendering parameters and the image produced is less than clear, a visual representation of the exploration process can make the process more eficient and effective. Image graphs represent not only the results but also the process of data visualization. Each node in an image graph consists of an image and the corresponding visualization parameters used to produce it. [...]
+}
+
+
+
+ at Article{brodlie at cvcgf,
+  author = 	 {K.W. Brodlie and D.A. Duce and J.R. Gallop and J.P.R.B. Walton and J.D. Wood},
+  title = 	 {Distributed and Collaborative Visualization},
+  journal = 	 {Computer Graphics Forum},
+  year = 	 {2004},
+  volume = 	 {23},
+  number = 	 {2},
+  pages = 	 {223-251},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{brodlie at vis2004,
+  author = 	 {Ken Brodlie and David Duce and Julian Gallop and Musbah Sagar and Jeremy Walton and Jason Wood},
+  title = 	 { Visualization in Grid Computing Environments},
+  booktitle = 	vis,
+  pages = 	 {155-162},
+  year = 	 {2004},
+  OPTnote = 	 {http://www.comp.leeds.ac.uk/vis/gviz/publications/gVizIEEE04.pdf},
+}
+
+
+ at InProceedings{brodlie at vis1997,
+  author = 	 {Jason Wood and Helen Wright and Ken Brodlie},
+  title = 	 {Collaborative Visualization},
+  booktitle = 	 vis,
+  pages = 	 {253-260},
+  year = 	 {1997},
+  OPTnote = 	 {},
+}
+
+
+ at Misc{xquery at w3c,
+  author =	 {S. Boag and D. Chamberlin and M. Fernandez and D. Florescu and J. Robie and J. Sim\'eon and M. Stefanescu},
+  title =	 {{XQuery} 1.0: An {XML} Query Language},
+  howpublished = {{W3C} Working Draft},
+  month =	 jun,
+  year =	 2001
+}
+
+ at inproceedings(webvcr at www9,
+author = "V. Anupam and \freiremarkref{\meabbrev} and B. Kumar and D. Lieuwen",
+title = "Automating {Web} Navigation with the {WebVCR}",
+pages = "503-517",
+booktitle = www,
+year={2000},
+optnote={To appear}		  
+)
+
+
+
+
+ at InProceedings{li at vldb2004,
+  author = 	 {Yunyao Li and Cong Yu and H. V. Jagadish},
+title = {Schema-Free {XQuery}},
+  booktitle = 	 vldb,
+  year = 	 {2004},
+  pages = 	 {72-83},
+}
+
+ at InProceedings{papak at sigmod2005,
+  author = 	 {Yu Xu and Yannis Papakonstantinou},
+title = {Efficient Keyword Search for Smallest {LCAs} in {XML} Databases},
+  booktitle = 	 sigmod,
+  year = 	 {2005},
+  pages = 	 {527-538},
+}
+
+ at InProceedings{freire at sigmod99,
+  author = 	 {H. Davulcu and \freiremarkref{\meabbrev} and  M. Kifer and I.V. Ramakrishnan},
+title = {A Layered Architecture for Querying Dynamic Web Content},
+  booktitle = 	 sigmod,
+  year = 	 {1999},
+  pages = 	 {491-502},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at inproceedings{ives at sigmod99,
+  author    = {Zachary G. Ives and
+               Daniela Florescu and
+               Marc Friedman and
+               Alon Y. Levy and
+               Daniel S. Weld},
+  OPTeditor    = {Alex Delis and
+               Christos Faloutsos and
+               Shahram Ghandeharizadeh},
+  title     = {An Adaptive Query Execution System for Data Integration},
+  OPTbooktitle = {SIGMOD 1999, Proceedings ACM SIGMOD International Conference
+               on Management of Data, June 1-3, 1999, Philadelphia, Pennsylvania,
+               USA},
+  booktitle = sigmod,
+  optpublisher = {ACM Press},
+  year      = {1999},
+  isbn      = {1-58113-084-8},
+  pages     = {299-310},
+}
+
+ at inproceedings{florescu at sigmod99,
+  author    = {Daniela Florescu and
+               Alon Y. Levy and
+               Ioana Manolescu and
+               Dan Suciu},
+  OPTeditor    = {Alex Delis and
+               Christos Faloutsos and
+               Shahram Ghandeharizadeh},
+  title     = {Query Optimization in the Presence of Limited Access Patterns},
+  booktitle = sigmod,
+  OPTbooktitle = {SIGMOD 1999, Proceedings ACM SIGMOD International Conference
+               on Management of Data, June 1-3, 1999, Philadelphia, Pennsylvania,
+               USA},
+  OPTpublisher = {ACM Press},
+  year      = {1999},
+  isbn      = {1-58113-084-8},
+  pages     = {311-322},
+}
+
+ at inproceedings{urhan at sigmod98,
+  author    = {Tolga Urhan and
+               Michael J. Franklin and
+               Laurent Amsaleg},
+  OPTeditor    = {Laura M. Haas and
+               Ashutosh Tiwary},
+  title     = {Cost-Based Query Scrambling for Initial Delays},
+  booktitle = sigmod,
+  OPTbooktitle = {SIGMOD 1998, Proceedings ACM SIGMOD International Conference
+               on Management of Data, June 2-4, 1998, Seattle, Washington, USA},
+  OPTpublisher = {ACM Press},
+  year      = {1998},
+  isbn      = {0-89791-995-5},
+  pages     = {130-141},
+}
+
+
+ at article{ louiqa at vldbj2000,
+    author = "Jean-Robert Gruser and Louiqa Raschid and Vladimir Zadorozhny and Tao Zhan",
+    title = "Learning response time for {WebSources} using query feedback and application in query optimization",
+    journal = "VLDB Journal",
+    volume = "9",
+    number = "1",
+    OPTmonth = "????",
+    pages = "18-37",
+    year = "2000",
+    url = "citeseer.nj.nec.com/gruser99learning.html" }
+
+ at article{ mohan at dataeng95,
+    author = "C. Mohan and Gustavo Alonso and Roger Gunthor and Mohan Kamath",
+    title = "Exotica: A Research Perspective on Workflow Management Systems",
+    journal = "Data Engineering Bulletin",
+    volume = "18",
+    number = "1",
+    pages = "19-26",
+    year = "1995",
+    url = "citeseer.nj.nec.com/mohan95exotica.html" }
+
+
+
+ at InProceedings{foster at ssdbm2002,
+  author = 	 { I. Foster and  J. Voeckler and M. Wilde and Y. Zhao},
+  title = 	 {Chimera: A Virtual Data System for Representing, Querying and
+ Automating Data Derivation},
+  booktitle = ssdbm,
+  pages = 	 {37-46},
+  year = 	 {2002},
+}
+
+
+ at inproceedings{levy at vldb96,
+  author    = {Alon Y. Levy and
+               Anand Rajaraman and
+               Joann J. Ordille},
+  OPTeditor    = {T. M. Vijayaraman and
+               Alejandro P. Buchmann and
+               C. Mohan and
+               Nandlal L. Sarda},
+  title     = {Querying Heterogeneous Information Sources Using Source Descriptions},
+  booktitle = vldb,
+  optbooktitle = {VLDB'96, Proceedings of 22th International Conference on Very
+               Large Data Bases, September 3-6, 1996, Mumbai (Bombay), India},
+  publisher = {Morgan Kaufmann},
+  year      = {1996},
+  isbn      = {1-55860-382-4},
+  pages     = {251-262},
+}
+
+
+ at InProceedings{frew at ssdbm2001,
+  author = 	 {James Frew and Rajendra Bose},
+  title = 	 {Earth System Science Workbench: A Data Management Infrastructure for Earth Science Products},
+  booktitle = ssdbm,
+  pages = 	 {180-189},
+  year = 	 {2001},
+}
+
+ at InProceedings{Freire:2000:WSA,
+  author =	 {Juliana Freire and Bharat Kumar},
+  title =	 {Web Services and Information Delivery for Diverse
+                  Environments},
+  booktitle =	 {VLDB Workshop on Technologies for E-Services},
+  year =	 2000
+}
+
+ at inproceedings{ webviews at www2001,
+  author =	 "Juliana Freire and Bharat Kumar and Daniel
+                  F. Lieuwen",
+  title =	 "WebViews: accessing personalized web content and
+                  services",
+  booktitle =	 www,
+  pages =	 "576-586",
+  year =	 2001,
+}
+
+
+ at Book{Larson:1996:Syntactica,
+  author =	 {Richard Larson and David S. Warren and Juliana
+                  Freire and Kostis Sagonas},
+  title =	 {Syntactica},
+  publisher =	 {MIT Press},
+  year =	 1996
+}
+
+ at Book{Larson:1997:Semantica,
+  author =	 {Richard Larson and David S. Warren and Juliana
+                  Freire and Patricia Gomez and Kostis Sagonas},
+  title =	 {Semantica},
+  publisher =	 {MIT Press},
+  year =	 1997
+}
+
+ at Misc{ogsi,
+  key = 	 {OGSI},
+  OPTauthor = 	 {},
+  title = 	 {OGSI Primer},
+  howpublished = {\url{http://www-unix.globus.org/toolkit}},
+  month = 	 {June},
+  year = 	 {2003},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+
+ at Misc{gsfl,
+  key = 	 {GSFL},
+  author = 	 {Sriram Krishnan and Patrick Wagstrom and Gregor von Laszewski},
+  title = 	 {{GSFL}: A Workflow Framework for Grid Services},
+  howpublished = {Argonne National Laboratory, Preprint ANL/MCS-P980-0802},
+}
+
+ at Misc{webservices,
+  key = 	 {Web Services},
+  author = 	 {W3C},
+  title = 	 {Web Services Activity},
+  howpublished = {\url{http://www.w3.org/2002/ws}},
+}
+
+
+ at InProceedings{hull at pods2003,
+  author = 	 {Richard Hull and Michael Benedikt and Vassilis Christophides and Jianwen Su},
+  title = 	 {E-services: a look behind the curtain},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  booktitle = pods,
+  pages = 	 {2003},
+  year = 	 {1-14},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at Misc{oldxquery at w3c,
+  author =	 {D. Chamberlin and J. Clark and D. Florescu and J. Robie and J. Sim\'eon and M. Stefanescu},
+  title =	 {{XQuery} 1.0: An {XML} Query Language},
+  howpublished = {{W3C} Working Draft},
+  month =	 jun,
+  year =	 2001
+}
+
+ at Misc{xerces,
+  key = 	 {Xerces},
+  title = 	 {Xerces Java Parser 1.4.3 },
+  note = {\oneurl{http://xml.apache.org/xerces-j}}
+}
+
+ at Misc{xercesold,
+  key = 	 {Xerces},
+  title = 	 {Xerces {Java} Parser 1.4.3},
+  howpublished = {\url{http://xml.apache.org/xerces-j}},
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at Misc{xpath at w3c,
+  key = 	 {XPath},
+  OPTauthor = 	 {W3C},
+  title = 	 {{XML} Path Language ({XPath}) 2.0},
+  howpublished = {\\\url{http://www.w3.org/TR/xpath20}}
+}
+
+
+
+ at Misc{xslt at w3c,
+  key = 	 {XSLT},
+  OPTauthor = 	 {W3C},
+  title = 	 {{XSL} Transformations ({XSLT})},
+  howpublished = {\url{http://www.w3.org/TR/xslt}}
+}
+
+ at Misc{xhtml at w3c,
+  key = 	 {XHTML},
+  OPTauthor = 	 {W3C},
+  title = 	 {{XHTML}},
+  howpublished = {\url{http://www.w3.org/MarkUp}}
+}
+
+ at Misc{wsdl at w3c,
+  key = 	 {WSDL},
+  OPTauthor = 	 {W3C},
+  title = 	 {Web Service Definition Language (WSDL)},
+  howpublished = {\url{http://www.w3.org/TR/wsdl.html}}
+}
+
+ at Misc{wml,
+  key = 	 {WML},
+  OPTauthor = 	 {W3C},
+  title = 	 {Wireless Markup Language (WML)},
+  howpublished = {\url{http://www1.wapforum.org/tech/terms.asp?doc=WAP-238-WML-20010911-a.pdf}}
+}
+
+
+
+ at Article{xl at deb2001,
+  author = 	 {Daniela Florescu and Donald Kossmann},
+  title = 	 {An {XML} Programming Language for {Web} Service Specification and Composition},
+  journal = 	 {IEEE Data Engineering Bulletin},
+  year = 	 {2001},
+  volume = 	 {24},
+  number = 	 {2},
+  pages = 	 {48-56}
+}
+
+
+ at InProceedings{xl at cidr2003,
+  author = 	 {Daniela Florescu and Andreas Gr�nhagen and Donald Kossmann},
+  title = 	 {{XL}: A Platform for {Web} Services},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  booktitle =  cidr,
+  OPTpages = 	 {},
+  year = 	 {2003},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at inproceedings{legodb at icde2002,
+  author    = {P. Bohannon and \freiremarkref{\meabbrev} and P. Roy and J. Sim\'eon},
+  title     = {From {XML} Schema to Relations:  A Cost-Based Approach to {XML} Storage},
+  booktitle = icde,
+  OPTpublisher = {IEEE Computer Society},
+  year      = {2002},
+  pages     = {64-75},
+}
+
+ at Misc{vtk,
+  author = 	 {Kitware},
+  title = 	 {{The Visualization Toolkit}},
+  howpublished = {\url{http://www.vtk.org}}
+}
+
+ at Misc{Darcs,
+  key = {DARCS},
+  author =       {David Roundy},
+  title =        {Darcs},
+  howpublished = {\url{http://abridgegame.org/darcs}}
+}
+
+ at Misc{kitware,
+  author = 	 {Kitware},
+  title = 	 {{The Visualization Toolkit (VTK) and Paraview}},
+  howpublished = {\url{http://www.kitware.com}}
+}
+
+ at Misc{tcl,
+  author = 	 {John Ousterhout},
+  title = 	 {Tcl/Tk},
+  howpublished = {\url{http://www.tcl.tk}}
+}
+
+ at Misc{python,
+  author = {Guido van Rossum},
+  title = {Python},
+  howpublished = {\url{http://www.python.org}},
+}
+
+ at Misc{dx,
+  author = 	 {IBM},
+  title = 	 {{OpenDX}},
+  howpublished = {\url{http://www.research.ibm.com/dx}},
+}
+
+ at Misc{gtb,
+  author =	 {Wagner Correa and Louis Bavoil and Shachar Fleishman
+                  and Walter Jimenez and James T. Klosowski and
+                  Gilberto C. A. G. Martins and Dirce Uesu and Sinesio
+                  Pesco and Lourena Rocha and Carlos Eduardo
+                  Scheidegger and Claudio T. Silva},
+  title =	 {Graphics Tool Box (GTB)},
+  howpublished = {\url{http://gtb.sourceforge.net}},
+}
+
+ at Misc{activizcom,
+  author = 	 {Kitware},
+  title = 	 {ActiViz/COM},
+  howpublished = {\url{http://www.kitware.com/products/activiz/activizCOM.html}},
+}
+
+ at Misc{paraview,
+  author = 	 {Kitware},
+  title = 	 {Paraview},
+  howpublished = {\url{http://www.paraview.org}},
+}
+
+ at Article{boukhelifa-and-rodgers,
+  author =	 {Nadia Boukhelifa and Peter J. Rodgers},
+  title =	 {A Model and Software System for Coordinated and
+                  Multiple Views in Exploratory Visualization},
+  journal =	 {Information Visualization},
+  year =	 2003,
+  volume =	 2,
+  number =	 4,
+  pages =	 {258-269}
+}
+
+ at Article{north-and-shneiderman,
+  author =	 {Chris North and Ben Shneiderman},
+  title =	 {Snap-Together Visualization: Can Users Construct and
+                  Operate Coordinated Visualizations?},
+  journal =	 {Int. J. Human-Computer Studies},
+  year =	 2000,
+  volume =	 53,
+  number =	 {715-739}
+}
+
+ at Article{herman-melancon-marshall,
+  author =	 {Ivan Herman and Guy Melan�on and M. Scott Marshall},
+  title =	 {Graph Visualization and Navigation in Information
+                  Visualization: A Survey},
+  journal =	 {IEEE Transactions on Visualization and Computer
+                  Graphics},
+  year =	 2000,
+  volume =	 6,
+  number =	 1,
+  pages =	 {24-43}
+}
+
+ at InProceedings{design-gallery,
+  author =	 {J. Marks and B. Andalman and P.A. Beardsley and
+                  W. Freeman and S. Gibson and J. Hodgins and T. Kang
+                  and B. Mirtich and H. Pfister and W. Ruml and
+                  K. Ryall and J. Seims and S. Shieber},
+  title =	 {Design Galleries: A General Approach to Setting
+                  Parameters for Computer Graphics and Animation},
+  booktitle =	 siggraph,
+  pages =	 {389-400},
+  year =	 1997
+}
+
+
+ at InProceedings{roberts,
+  author =	 {Jonathan C. Roberts},
+  title =	 {Waltz -- Exploratory Visualization Tool For Volume
+                  Data, Using Multiform Abstract Displays},
+  booktitle =	 spie,
+  pages =	 {112-122},
+  year =	 1998,
+  volume =	 3298
+}
+
+ at inproceedings{scirun,
+  author =	 {Steven G. Parker and Christopher R. Johnson},
+  title =	 {{SCIRun: a scientific programming environment for
+                  computational steering}},
+  booktitle =	 supercomputing,
+  year =	 {1995},
+  pages =	 {52},
+  OPTlocation =	 {San Diego, California, United States},
+  OPTpublisher =	 {ACM Press},
+}
+
+
+ at article{avs,
+  OPTauthor =	 {Craig Upson and Thomas Faulhaber, Jr. and David
+                  Kamins and David H. Laidlaw and David Schlegel and
+                  Jefrey Vroom and Robert Gurwitz and Andries van Dam},
+  author =	 {Craig {Upson et al}},
+  title =	 {The Application Visualization System: A
+                  Computational Environment for Scientific
+                  Visualization},
+  journal =	 cganda,
+  volume =	 9,
+  number =	 4,
+  year =	 1989,
+  OPTissn =	 {0272-1716},
+  pages =	 {30-42},
+  OPTpublisher =	 {IEEE Computer Society Press},
+}
+
+ at Unpublished{stc,
+  author =	 {Antonio Baptista},
+  title =	 {Science and Technology Center ({STC}) for Coastal
+                  Margin Observation and Prediction},
+  note =	 {Proposal submitted to National Science Foundation}
+}
+
+
+ at Unpublished{corie-itr,
+  author =	 {Antonio Baptista},
+  title =	 {ITR/IM+AP: Quality-Scalable Information Flow Systems for Environmental
+Observation and Forecasting},
+  note =	 {NSF ITR/IM+AP-0121475}
+}
+
+ at Unpublished{uncertainty_vis,
+ author = {Robert B. Gilbert and Fulvio Tonon and \freiremarkref{\meabbrev} and Claudio T. Silva and David R. Maidment},
+ title = {Visualizing Uncertainty with Uncertainty Multiples},
+ note = {To appear in GeoCongress 2006}
+}
+
+ at Misc{GraphViz:2005:GV,
+  author = "David Dobkin and John Ellson and Emden Gansner and Eleftherios Koutsofios
+     Stephen North and Kiem-Phong Vo and Gordon Woodhull",
+  title = "Graphviz 2.2",
+  URL = "http://www.graphviz.org",
+  year = "2005"
+}
+
+
+
+
+ at InProceedings{Ellson:2001:GraphViz,
+  author =	 {J. Ellson and E. R. Gansner and L. Koutsofios and
+                  S.C. North and G. Woodhull},
+  title =	 {Graphviz - Open Source Graph Drawing Tools},
+  booktitle =	 {Graph Drawing},
+  year =	 2001,
+  pages =	 {483--485}
+}
+
+ at Article{ludascher at pe2005,
+  author = 	 {B. Lud\"{a}scher and I. Altintas and C. Berkley and D. Higgins and E. Jaeger-Frank and M. Jones and E. Lee and J. Tao and Y. Zhao},
+  title = 	 {{Scientific Workflow Management and the Kepler System}},
+  OPTjournal = 	 {Concurrency and Computation: Practice \&  Experience, Special Issue on Scientific Workflows},
+  journal = 	 {Concurrency and Computation: Practice \&  Experience},
+  year = 	 {2005},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTpages = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at inproceedings{stolte at sigmod2003,
+  author    = {Etzard Stolte and
+               Christoph von Praun and
+               Gustavo Alonso and
+               Thomas R. Gross},
+  title     = {Scientific Data Repositories: Designing for a Moving Target.},
+  booktitle = sigmod,
+  year      = {2003},
+  pages     = {349-360},
+  ee        = {http://www.acm.org/sigmod/sigmod03/eproceedings/papers/r13p03.pdf},
+  OPTcrossref  = {DBLP:conf/sigmod/2003},
+  OPTbibsource = {DBLP, http://dblp.uni-trier.de}
+}
+                  
+ at InProceedings{kreuseler at infovis2004,
+  author =	 {Matthias Kreuseler and Thomas Nocke and Heidrun
+                  Schumann},
+  title =	 {A History Mechanism for Visual Data Mining},
+  booktitle =	 infovis,
+  pages =	 {49-56},
+  year =	 2004
+}
+
+ at Book{Davis:1994:CCL,
+  author =	 {Martin D. Davis and Ron Sigal and Elaine Weyuker},
+  title =	 {Computability, Complexity, and Languages},
+  publisher =	 {Academic Press},
+  year =	 1994
+}
+
+ at Book{Maier:1988:CWL,
+  author =	 {David Maier and David S. Warren},
+  title = 	 {Computing With Logic: Logic Programming With Prolog},
+  publisher = 	 {Addison-Wesley},
+  year = 	 1988
+}
+
+ at InProceedings{Rao:1997:XSB,
+  author =	 {Prasad Rao and Konstantinos Sagonas and Terrance
+                  Swift and David Warren and Juliana Freire},
+  title =	 {{XSB - A System for Efficiently Computing Well
+                  Founded Semantics}},
+  booktitle =	 lpnmr,
+  year =	 1997
+}
+
+
+
+ at Article{jankun-kelly at tvcg2001,
+  author = 	 {{T.J.} {Jankun-Kelly} and {Kwan-Liu} Ma},
+  title = 	 {Visualization Exploration and Encapsulation via a Spreadsheet-Like Interface},
+  journal = 	 {IEEE Transactions on Visualization and Computer Graphics},
+  year = 	 {2001},
+  volume = 	 {7},
+  number = 	 {3},
+  pages = 	 {275-287},
+  OPTmonth = 	 {July-September},
+  OPTnote = 	 {},
+  OPTannote = 	 {},
+  OPTURL =       {http://www.cs.ucdavis.edu/~ma/papers/TVCG2001.pdf}
+}
+
+
+
+
+ at InProceedings{jankun-kelly at vis2002,
+  author = 	 {{T.J.} {Jankun-Kelly} and {Kwan-Liu} Ma and Michael Gertz},
+  title = 	 {A Model for the Visualization Exploration Process},
+  booktitle = 	 vis,
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 {2002},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at InProceedings{freire at plilp1995,
+  author = 	 {Juliana Freire and Rui Hu and Terrance Swift and David Scott Warren},
+  title = 	 {Exploiting Parallelism in Tabled Evaluations},
+  booktitle = 	 plilp,
+  pages = 	 {115-132},
+  year = 	 {1995},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at Article{buneman at tods2004,
+  author = 	 {Peter Buneman and  Sanjeev Khanna and  Keishi Tajima and  Wang Chiew Tan},
+  title = 	 {Archiving scientific data},
+  journal = 	 {ACM Transactions on Database Systems},
+  year = 	 {2004},
+  OPTkey = 	 {},
+  volume = 	 {29},
+  number = 	 {1},
+  pages = 	 {2-42},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at inproceedings{avnur at sigmod2000,
+  author    = {Ron Avnur and Joseph M. Hellerstein},
+  title     = {Eddies: Continuously Adaptive Query Processing},
+  booktitle = sigmod,
+  year      = {2000},
+  pages     = {261-272},
+}
+
+
+ at InProceedings{chi at vis1997,
+  author = 	 {Ed {Huai-hsin} Chi and Phillip Barry and John Riedl  and Joseph Konstan},
+  title = 	 {A Spreadsheet Approach to Information Visualization},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  booktitle = infovis,
+  pages = 	 {17-24},
+  year = 	 {1997},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at article{chi at cganda1998,
+  author =	 {Ed {Huai-hsin} Chi and Phillip Barry and John Riedl and Joseph Konstan},
+  title =	 {Principles for Information Visualization Spreadsheets},
+  journal =	 cganda,
+  volume =	 18,
+  number =	 4,
+  year =	 1998,
+  pages =	 {30-38},
+  OPTpublisher =	 {IEEE Computer Society Press},
+}
+
+ at InProceedings{levoy at siggraph1994,
+  author =	 {Mark Levoy},
+  title =	 {Spreadsheet for Images},
+  booktitle =	 siggraph,
+  pages =	 {139-146},
+  year =	 1994
+}
+
+ at inproceedings{Chiang:1998:IOI,
+  author =     "Yi-Jen Chiang and Cl{\'{a}}udio T. Silva and William
+                  J. Schroeder",
+  title =     "Interactive Out-Of-Core Isosurface Extraction",
+  year =     1998,
+  booktitle =     vis,
+  pages =     "167-174",
+}
+
+ at Book{Luebke:2002:LOD,
+  OPTauthor =     {David Luebke and Martin Reddy and Jonathan Cohen and
+                  Amitabh Varshney and Benjamin Watson and Robert
+                  Huebner},
+  author =     {David {Luebke et al}},
+  title =     {Level of Detail for 3D Graphics},
+  publisher =     {Morgan-Kaufmann Publishers},
+  year =     2002
+}
+
+ at inproceedings{Weiler:2000:SLOD,
+  author =     {Manfred Weiler and Rudiger Westermann and Chuck
+                  Hansen and Kurt Zimmerman and Thomas Ertl},
+  title =     {Level-Of-Detail Volume Rendering view 3D Textures},
+  booktitle =     {Proceedings of IEEE Volume Visualization 2000},
+  year =     {2000}
+}
+
+ at inproceedings{Museth:2004:VIS,
+  author =     {Ken Museth and Santiago Lombeyda},
+  title =     {TetSplat: Real-time Rendering and Volume Clipping of
+                  Large Unstructured Tetrahedral Meshes},
+  booktitle =     {Proceedings of IEEE Visualization 2004},
+  year =     {2004},
+  pages =     {433-440}
+}
+
+ at article{Cignoni:2004:LOD,
+  author =     {Paolo Cignoni and Leila De Floriani and Paola
+                  Magillo and Enrico Puppo and Roberto Scopigno},
+  title =     {Selective Refinement Queries for Volume
+                  Visualization of Unstructured Tetrahedral Meshes.},
+  journal =     "IEEE Transactions on Visualization and Computer
+                  Graphics",
+  volume =     10,
+  number =     1,
+  year =     2004,
+  pages =     {29-45},
+}
+
+ at inproceedings{Leven:2002:VV,
+  author =     {Joshua Leven and Jason Corso and Jonathan D. Cohen
+                  and Subodh Kumar},
+  title =     {Interactive Visualization of Unstructured Grids
+                  Using Hierarchical 3D Textures},
+  booktitle =    volvis,
+  year =     {2002},
+  pages =     {37-44}
+}
+
+
+ at InProceedings{bright at cidr2005,
+  author = 	 {Laura Bright and David Maier},
+  title = 	 {Deriving and Managing Data Products in an Environmental Observation and Forecasting System},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  booktitle = cidr,
+  pages = 	 {162-173},
+  year = 	 {2005},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at inproceedings{franklin at vldb2004,
+  author    = {David T. Liu and Michael J. Franklin},
+  title     = {{The Design of GridDB: A Data-Centric Overlay for the Scientific Grid}},
+  booktitle = vldb,
+  year      = {2004},
+  pages     = {600-611}
+}
+
+ at Misc{thetus,
+  key = {Thetus},
+  title = {Thetus Publisher},
+  URL = {http://www.thetuscorp.com},
+  OPTyear = "2005"
+}
+
+
+ at inproceedings{haas at vldb1999,
+  author    = {Mary Tork Roth and Fatma Ozcan and Laura M. Haas},
+  title     = {{Cost Models DO Matter: Providing Cost Information for Diverse Data Sources in a Federated System}},
+  booktitle = vldb,
+  year      = {1999},
+  pages     = {599-610}
+}
+
+ at InProceedings{bavoil at vis2005,
+  author =	 {L. Bavoil and S. Callahan and P. Crossno and
+                  \freiremarkref{\meabbrev} and C. Scheidegger and C. Silva and H. Vo},
+  title =	 {VisTrails: Enabling Interactive Multiple-View
+                  Visualizations},
+  booktitle =	 vis,
+  pages =	 {135-142},
+  year =	 2005
+}
+
+ at InProceedings{vanwijk at vis2005,
+  author =	 {Jarke {van Wijk}},
+  title =	 {The value of visualization},
+  booktitle =	 vis,
+  OPTpages =	 {79-86},
+  year =	 2005
+}
+
+ at InProceedings{callahan at sciflow2006,
+  author =	 {S. Callahan and J. Freire and E. Santos and C. Scheidegger and C. Silva and H. Vo},
+  title =	 { Managing the Evolution of Dataflows with {VisTrails} \emph{(Extended Abstract)}},
+  booktitle =	 {IEEE Workshop on Workflow and Data Flow for Scientific Applications (SciFlow)},
+  OPTpages =	 {135--142},
+  year =	 2006,
+  OPTnote = {To appear}
+}
+
+ at InProceedings{callahan at sigmod2006,
+  author =	 {S. Callahan and \freiremarkref{\meabbrev} and E. Santos and C. Scheidegger and C. Silva and H. Vo},
+  title =	 {{VisTrails: Visualization meets Data Management}},
+  booktitle =	 sigmod,
+  pages =	 {745--747},
+  year =	 2006,
+  note = {Demo description. }
+}
+
+ at Misc{vistrail at nsf2005,
+  OPTkey = 	 {},
+  author = 	 {\freiremarkref{\meabbrev} and Cl\'audio Silva},
+  title = 	 {Managing Complex Visualizations},
+  OPThowpublished = {},
+  month = 	 jul,
+  year = 	 2005,
+  OPTnote = 	 {Proposal submitted to the NSF CISE Research Infrastructure 
+Program.},
+  note = 	 {NSF CISE-IIS grant \#0513692},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{jimenez at vis2003,
+  author =	 {W. Herrera-Jimenez and W. Corr\^{e}a and C. Silva
+                  and A. Baptista},
+  title =	 {Visualizing Spatial and Temporal Variability in
+                  Coastal Observatories},
+  booktitle =	 {IEEE Visualization 2003},
+  pages =	 {269--274},
+  year =	 2003
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  Juliana's   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ at InProceedings{shrex at widm2004,
+	author ={Sihem Amer-Yahia and Fang Du and \freiremarkref{\meabbrev}},
+	title =	{{A Comprehensive Solution to the XML-to-Relational
+                  Mapping Problem}},
+        pages = {31-38},
+	booktitle = widm,
+	year =				 2004,
+}
+
+
+ at InProceedings{barbosa at sbbd2004,
+  OPTauthor = 	 {Luciano Barbosa and Juliana Freire},
+  author = 	 {Luciano Barbosa and \freiremarkref{\meabbrev}},
+  title = 	 {Siphoning Hidden-Web Data through Keyword-Based Interfaces},
+  booktitle = sbbd,
+  pages = 	 {309-321},
+  year = 	 {2004}
+}
+
+ at TechReport{barbosa at techrep2005,
+  OPTauthor = 	 {Luciano Barbosa and Juliana Freire},
+  author = 	 {Luciano Barbosa and \freiremarkref{\meabbrev}},
+  title = 	 {Searching for Hidden-Web Databases},
+  institution =  {University of Utah},
+  year = 	 {2005},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTnumber = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at TechReport{vistrail at techrep2005,
+  author = 	 {Lois Bavoil and Steven Calahan and Patricia Crossno and \freiremarkref{\meabbrev} and Carlos Scheidegger and Cl\'audio Silva and Huy Vo},
+  title = 	 {VisTrails: Enabling Interactive Multiple-View Visualizations},
+  institution =  {University of Utah},
+  year = 	 {2005},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTnumber = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+
+ at Misc{stc at nsf2004,
+  OPTkey = 	 {},
+  author = 	 {Ant\'onio {Baptista et al}},
+  title = 	 {Science and Tecnology Center (STC) for Coastal
+Margin Observation and Prediction},
+  OPThowpublished = {},
+  OPTmonth = 	 mar,
+  year = 	 2004,
+  note = 	 {Submitted to NSF. Among the final six proposals recommended for funding
+ by the Blue Ribbon Panel },
+  OPTannote = 	 {}
+}
+
+
+ at Misc{corie at web,
+  key = 	 {CORIE},
+  title = 	 {{CORIE Web site }},
+  note = 	 {\url{http://www.ccalmr.ogi.edu/CORIE}},
+}
+
+
+
+
+ at InProceedings{freire at mobilesearch2002,
+  author = 	 {\freiremarkref{\meabbrev}},
+  title = 	 {Using Wrappers for Device Independent Web Access: Opportunities, Challenges and Limitations (Extended Abstract)},
+  booktitle = 	 mobilesearch,
+  OPTpages = 	 {},
+  year = 	 {2002},
+  note = 	 {Invited paper},
+  OPTannote = 	 {}
+}
+
+
+
+ at inproceedings(webvcr at www9,
+author = "V. Anupam and \freiremarkref{\meabbrev} and B. Kumar and D. Lieuwen",
+title = "Automating {Web} Navigation with the {WebVCR}",
+pages = "503-517",
+booktitle = www,
+year={2000},
+optnote={To appear}		  
+)
+
+ at misc(xmldm at www2002,
+OPTauthor = "Michael Benedikt and Mary Fernandez and \freiremarkref{Juliana Freire} and Arnaud Sahuguet",
+author = "Michael Benedikt and Mary Fernandez and \freiremarkref{\meabbrev} and Arnaud Sahuguet",
+title = "{XML} and Data Management",
+howpublished = "Full-day tutorial presented at WWW",
+note = "Available at \\ \oneurl{http://www.cse.ogi.edu/$\tilde{\ }$juliana/pub/xml-data-management-slides.pdf}",
+year={2002},
+)
+
+
+ at InProceedings{freire at sigmod99,
+  author = 	 { H. Davulcu and \freiremarkref{\meabbrev} and  M. Kifer and I.V. Ramakrishnan},
+title = {A Layered Architecture for Querying Dynamic Web Content},
+  booktitle = 	 sigmod,
+  year = 	 {1999},
+  pages = 	 {491-502},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{Freire:2000:WSA,
+  author =	 { \freiremarkref{\meabbrev} and Bharat Kumar},
+  title =	 {Web Services and Information Delivery for Diverse
+                  Environments},
+  booktitle =	 {Proceedings VLDB Workshop on Technologies for E-Services},
+  year =	 2000
+}
+
+ at inproceedings{ webviews at www2001,
+  author =	 " \freiremarkref{\meabbrev} and Bharat Kumar and Daniel
+                  F. Lieuwen",
+  title =	 "WebViews: accessing personalized web content and
+                  services",
+  booktitle =	 www,
+  pages =	 "576-586",
+  year =	 2001,
+}
+
+
+ at Book{Larson:1996:Syntactica,
+  author =	 { Richard Larson and David S. Warren and \freiremarkref{\meabbrev} and Kostis Sagonas},
+  title =	 {Syntactica},
+  publisher =	 {MIT Press},
+  year =	 1996
+}
+
+ at Book{Larson:1997:Semantica,
+  author =	 { Richard Larson and David S. Warren and \freiremarkref{\meabbrev} and Patricia Gomez and Kostis Sagonas},
+  title =	 {Semantica},
+  publisher =	 {MIT Press},
+  year =	 1997
+}
+
+
+ at inproceedings{statix at sigmod2002,
+  author    = { \freiremarkref{\meabbrev} and J. Haritsa and M. Ramanath  and P. Roy and J. Sim\'eon},
+  title     = {StatiX: Making {XML} Count},
+  booktitle = sigmod,
+  OPTpublisher = {ACM},
+  year      = {2002},
+  pages     = {181-191},
+}
+
+ at inproceedings{statix at icde2004,
+  author    = { \freiremarkref{\meabbrev} and M. Ramanath  and L. Zhang},
+  title     = {A Flexible Infrastructure for Gathering {XML} Statistics and 
+Estimating Query Cardinality},
+  booktitle = icde,
+  OPTpublisher = {ACM},
+  year      = {2004},
+  OPTpages     = {181-191},
+  note = {To appear}
+}
+
+ at inproceedings{shrex at vldb2004,
+  author    = { Fang Du and Sihem Amer-Yahia and  \freiremarkref{\meabbrev}},
+  title     = { {ShreX}: Managing {XML} Documents in Relational Databases},
+  booktitle = vldb,
+  year      = {2004},
+  pages     = {1297-1300}
+}
+
+ at inproceedings{imax at icde2005,
+  author    = { Maya Ramanath  and Lingzhi Zhang and \freiremarkref{\meabbrev} and Jayant Haritsa},
+  title     = { {IMAX}: The Big Picture of Dynamic {XML} Statistics},
+  booktitle = icde,
+  year      = {2005},
+  pages     = {273-284}
+}
+
+ at inproceedings{flexmap at xsym2003,
+  author    = {Maya Ramanath and \freiremarkref{\meabbrev} and Jayant Haritsa and Prasan Roy},
+  title     = {Searching for Efficient {XML}-to-Relational Mappings},
+  booktitle = xsym,
+  year      = {2003},
+  pages     = {19-36},
+  OPTnote      = {To appear}
+}
+
+ at inproceedings{barbosa at xsym2004,
+  author    = {Denilson Barbosa and \freiremarkref{\meabbrev} and Alberto Mendelzon},
+  title     = {Information Preservation in {XML}-to-Relational Mappings},
+  booktitle = xsym,
+  year      = {2004},
+  pages     = {66-81}
+}
+
+
+ at InProceedings{legodb at vldb2002,
+  OPTauthor = 	 {Philip Bohannon and \freiremarkref{\meabbrev} and Jayant Haritsa Maya Ramanath and Prasan Roy J\'er\^ome Sim\'eon},
+  author = 	 { P. Bohannon and \freiremarkref{\meabbrev} and J. Haritsa and M. Ramanath and P. Roy and J. Sim\'eon},
+  title = 	 {LegoDB: Customizing Relational Storage for XML Documents},
+  booktitle = 	 vldb,
+  pages =  {1091-1094},
+  year =	 2002,
+  OPTaddress =	 {Honk Kong, China},
+  OPTmonth =	 aug
+}
+
+ at InProceedings{legodb at icde2003,
+  OPTauthor = 	 {Philip Bohannon and Juliana Freire and Jayant Haritsa Maya Ramanath and Prasan Roy J\'er\^ome Sim\'eon},
+  author = 	 { P. Bohannon and \freiremarkref{\meabbrev} and J. Haritsa and M. Ramanath and P. Roy and J. Sim\'eon},
+  title = 	 {Bridging the {XML}-Relational Divide with {LegoDB}: A Demonstration},
+  booktitle = 	 icde,
+  year =	 2003,
+  OPTaddress =	 {Honk Kong, China},
+  OPTmonth =	 aug
+}
+
+ at InProceedings{legodb at eextt2002,
+  OPTauthor = 	 {Juliana Freire and J\'er\^ome Sim\'eon},
+  author = 	 {\freiremarkref{\meabbrev} and J. Sim\'eon},
+  title = 	 { Adaptive {XML} Shredding: Architecture, Implementation, and Challenges},
+  booktitle = 	 eextt,
+  pages = {104-116},
+  year =	 2002,
+  OPTaddress =	 {Honk Kong, China},
+  OPTmonth =	 aug
+}
+
+
+ at inproceedings(veriweb at www2002,
+author = " M. Benedikt and \freiremarkref{\meabbrev} and P. Godefroid",
+title = "VeriWeb: A Platform for Automating Web Site Testing",
+OPTpages = "503-517",
+booktitle = www,
+year={2002},
+)
+
+ at inproceedings(byers at www2001,
+author = " S. Byers and \freiremarkref{\meabbrev} and  C.~T.~Silva",
+title = "Efficient Acquisition of Web Data through Restricted Query Interfaces",
+pages = "184-185",
+booktitle = wwwposter,
+year={2001},
+)
+
+ at InProceedings{sihem at icde03,
+  author = 	 {Sihem Amer-Yahia and Yannis Kotidis and Divesh Srivastava},
+  title = 	 {{XML} Publishing: Look at Siblings too!},
+  booktitle = 	 icde,
+  OPTpages = 	 {},
+  year = 	 2003,
+  note = 	 {Poster paper}
+}
+
+                  
+
+ at Article{freire at cise2004,
+  author = 	 { \freiremarkref{\meabbrev} and Michael Benedikt},
+  title = 	 {Managing XML Data: An Abridged Overview},
+  journal = 	 {IEEE Computing in Science \& Engineering},
+  year = 	 {2004},
+  OPTkey = 	 {},
+  volume = 	 {6},
+  number = 	 {4},
+  pages = 	 {12-19},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     XML    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ at InProceedings{sekar at icdt2003,
+  author = 	 {R. Krishnamurthy and V. Chakaravarthy and J. Naughton},
+  title = 	 {On the Difficulty of Finding Optimal Relational Decompositions for {XML} Workloads: a Complexity Theoretic Perspective},
+  booktitle = 	 icdt,
+  pages = {270-284},
+  year = 	 {2003},
+}
+
+ at InProceedings{Shan at vldb99,
+  author = 	 {J. Shanmugasundaram and K. Tufte and G. He and C. Zhang and D. DeWitt and J. Naughton},
+  title = 	 {Relational Databases for Querying {XML} Documents: Limitations and Opportunities},
+  booktitle = 	 vldb,
+  pages = {302-314},
+  year = 	 1999
+}
+
+ at InProceedings{Deutsch at sigmod99,
+  author = 	 {A. Deutsch and M. Fernandez and D. Suciu},
+  title = 	 {Storing Semi-Structured Data with {STORED}},
+  booktitle = 	 sigmod,
+  pages = {431-442},
+  year = 	 1999
+}
+
+ at Article{florescu at deb99,
+  author = 	 {D. Florescu and D. Kossman},
+  title = 	 {Storing and Querying XML Data using an RDMBS},
+  journal = 	 {IEEE Data Engineering Bulletin},
+  year = 	 1999,
+  volume =	 22,
+  number =	 3,
+  pages =	 {27-34}
+}
+
+ at InProceedings{schmidt at webdb2000,
+  author = 	 {A. Schmidt and M. Kersten and M. Windhouwer and F. Waas},
+  title = 	 {Efficient Relational Storage and Retrieval of {XML} Documents},
+  booktitle = 	 webdb,
+  pages =	 {47-52},
+  year = 	 2000
+}
+
+ at InProceedings{shimura at dexa1999,
+  author = 	 {T. Shimura and  M. Yoshikawa and S. Uemura},
+  title = 	 {Storage and Retrieval of {XML} Documents Using Object-Relational Databases},
+  booktitle = 	 dexa,
+  pages = 	 {206-217},
+  year = 	 1999
+}
+
+ at InProceedings{tatarinov at sigmod2001,
+  author =       {Igor Tatarinov and Zachary G. Ives and Alon Y. Halevy and Daniel S. Weld},
+  title =        {Updating XML},
+  booktitle =    sigmod,
+  OPTpages = {not-available},
+  year =         2001
+}
+
+
+ at MastersThesis{lehti at thesis,
+  author = 	 {Patrick Lehti},
+  title = 	 {Design and Implementation of a Data Manipulation Processor
+for an XML Query Language},
+  school = 	 {Fraunhofer IPSI},
+  year = 	 {2002},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  note = 	 {\oneurl{http://www.ipsi.fhg.de/$\tilde{\ }$lehti/diplomarbeit.pdf}},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{Tatarinov at sigmod2002,
+  author =       {I. Tatarinov and S. Viglas and K. Beyer and J. Shanmugasundara
+m and E. Shekita and C. Zhang},
+  title =        {Storing and Querying Ordered {XML} Using a Relational Database
+ System},
+  booktitle =    sigmod,
+  pages = {204-215},
+  year =         2002
+}
+
+ at Misc{excelon,
+  key = 	 {Excelon},
+  title = 	 {Excelon},
+  note = {\oneurl{http://www.exceloncorp.com}}
+}
+
+ at Misc{tamino,
+  key = 	 {Tamino},
+  title = 	 {Tamino},
+  note = {\oneurl{http://www.softwareag.com/tamino}}
+}
+
+ at Misc{xml at oracle,
+  key = 	 {XML SQL},
+  title = 	 {Oracle's {XML} {SQL} Utility},
+  OPThowpublished = {\textsf{\footnotesize http://technet.ora\-cle.com/tech/ xml/oracle\_xsu}},
+  note = {\oneurl{http://technet.ora\-cle.com/tech/xml/oracle\_xsu}},
+  OPTnote =	 {straightforward mapping from xml into ordbms}
+}
+
+ at Misc{xml at sqlserver,
+  key =          {Microsoft Support for XML},
+  title = 	 {Microsoft Support for {XML}},
+  note = {\oneurl{http://msdn.micro\-soft.com/sqlxml}},
+}
+
+ at Misc{xml at db2,
+  key =          {IBM DB2 XML Extender},
+  title = 	 {{IBM} {DB2} {XML} {Extender}},
+  note = {\\ \oneurl{http://www4.ibm.com/soft\-ware/ data/db2/extenders/xmlext.html}}
+}
+
+
+ at Misc{oasis,
+  key = 	 {Oasis},
+  title = 	 {The {XML} Cover Pages},
+  note = {\oneurl{http://www.oasis-open.org/cover}}
+}
+
+ at Misc{coverpages,
+  key = 	 {Coverpages},
+  title = 	 {The {XML} Cover Pages},
+  note = {\oneurl{http://xml.coverpages.org}}
+}
+
+
+ at Misc{dtd at w3c,
+  author =	 {J. Bosac and T. Bray and D. Connolly and E. Maler and G. Nicol and C.~M. Sperberg-McQueen and L. Wood and J. Clark},
+  title =	 {Guide to the {W3C} {XML} Specification ("{XMLspec}") {DTD}},
+  month =	 jun,
+  year =	 1998
+}
+
+
+ at Misc{xmlspy,
+  key =		 {Spy},
+  title =	  {{XML} Spy},
+  note =	   {\\ \oneurl{http://www.xmlspy.com/}}
+}
+
+ at Misc{infoset at w3c,
+  author =	 {John Cowan and Richard Tobin},
+  title =	  {{XML} Information Set},
+  month =	   oct,
+  year =	    2001,
+  note =	     {{W3C} Recommendation}
+}
+
+ at Misc{xschema at w3c,
+  author =	 {Henry Thompson and David Beech and Murray Maloney and Noah Mendelsohn},
+  title =	 {{XML} {Schema} {Part} 1: Structures},
+  howpublished = {{W3C} Working Draft},
+  month =	 feb,
+  year =	 2000
+}
+
+
+ at misc{xml at w3ccomplete,
+   author = {Tim Bray and Jean Paoli and C. M. Sperberg-McQueen},
+   title = {Extensible markup language ({XML}) 1.0},
+   note = {\oneurl{http://www.w3.org/TR/REC-xml}},
+   howpublished = {{W3C} Recommendation}, 
+   month = feb,
+   year = 1998,
+}
+
+ at Misc{xml at w3c,
+  key = 	 {XML},
+  OPTauthor = 	 {W3C},
+  title = 	 {{Extensible Markup Language (XML)}},
+  howpublished = {\\\url{http://www.w3.org/XML}}
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Hidden Web %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at string{jep = "Journal of Electronic Publishing"}
+
+ at article{ lawrence at science98,
+    author = "Steve Lawrence and C. Lee Giles",
+    title = "Searching the {World Wide Web}",
+    journal = "Science",
+    volume = "280",
+    number = "5360",
+    pages = "98--100",
+    year = "1998",
+    url = "citeseer.nj.nec.com/lawrence98searching.html" }
+
+
+
+ at Book{soumen at mk2002,
+  author = 	 {S. Chakrabarti},
+  title = 	 {Mining the Web: Discovering Knowledge from Hypertext Data},
+  publisher = 	 {Morgan Kaufmann},
+  year = 	 {2002},
+}
+
+ at Misc{mageml,
+  key = 	 {MAGEML},
+  OPTauthor = 	 {},
+  title = 	 {{MAGE-ML}: Microarray Gene Expression Markup Language},
+  OPThowpublished = {\oneurl{http://www.mged.org/Workgroups/MAGE/mage-ml.html}},
+  OPTyear = 	 {},
+  note = 	 {\\ \oneurl{http://www.mged.org/Workgroups/MAGE/mage-ml.html}},
+}
+
+ at Misc{OLDvisitr at nsf2003,
+  OPTkey = 	 {},
+  author = 	 {Cl\'audio Silva and \freiremarkref{\meabbrev} and Ant\'onio Baptista},
+  title = 	 {Middleware Infrastruture for Managing Visualization and Data
+Exploration in Environmental Observation and Forecasting Systems},
+  OPThowpublished = {},
+  month = 	 mar,
+  year = 	 2003,
+  note = 	 {Medium ITR proposal submitted to the NSF Division of Advanced Computational Infrastructure and Research},
+  OPTannote = 	 {}
+}
+
+ at Misc{dbitr at nsf2003,
+  OPTkey = 	 {},
+  author = 	 {Lois Delcambre and \freiremarkref{\meabbrev} and  Paul Gorman
+	and James Larson and David Maier},
+  title = 	 {Taming the Information Jungle - Selecting, Organizing and Analyzing Disparate Information},
+  OPThowpublished = {},
+  month = 	 mar,
+  year = 	 2003,
+  note = 	 {Medium ITR proposal submitted to the NSF Division of Information
+and Intelligent Systems},
+  OPTannote = 	 {}
+}
+
+ at Misc{cluster at nsf2003,
+  OPTkey = 	 {},
+  author = 	 {\freiremarkref{\meabbrev} and Cl\'audio Silva},
+  title = 	 { A Cluster Infrastructure to Support Retrieval, Management 
+and Visualization of Massive Amounts of Data},
+  OPThowpublished = {},
+  month = 	 feb,
+  year = 	 2003,
+  OPTnote = 	 {Proposal submitted to the NSF CISE Research Infrastructure 
+Program.},
+  note = 	 {NSF CISE-RI-MII \emph{0323604}},
+  OPTannote = 	 {}
+}
+
+ at Misc{vistrail at nsf2003,
+  OPTkey = 	 {},
+  author = 	 {Cl\'audio Silva and \freiremarkref{\meabbrev}},
+  title = 	 { VisTrail:  A Toolkit for Managing Complex Visualization Processes},
+  OPThowpublished = {},
+  month = 	 jul,
+  year = 	 2003,
+  note = 	 {Proposal submitted to the NSF Division of Advanced Computational
+Infrastructure \& Research},
+  OPTannote = 	 {}
+}
+
+ at Misc{inria at nsf2003,
+  OPTkey = 	 {},
+  author = 	 {\freiremarkref{\meabbrev} and Michael Benedikt},
+  title = 	 { New Automata and Grammar-based Tools for Web Data
+Processing},
+  OPThowpublished = {},
+  month = 	 may,
+  year = 	 2003,
+  note = 	 {Proposal submitted to the NSF/INRIA Collaborative Research Program},
+  OPTannote = 	 {}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ at InProceedings{chaudhuri at sigmod98,
+  author = 	 {S. Chaudhuri, V.R. Narasayya},
+  title = 	 {AutoAdmin 'What-if' Index Analysis Utility},
+  booktitle = 	 sigmod,
+  pages = 	 {367-378},
+  year = 	 1998
+}
+
+ at InProceedings{agrawal at sigmod01,
+  author = 	 {S. Agrawal and  S. Chaudhuri and V.R. Narasayya},
+  title = 	 {Materialized View and Index Selection Tool for Microsoft SQL Server 2000},
+  booktitle = 	 sigmod,
+  OPTpages = 	 {},
+  year = 	 {2001},
+  OPTnote = 	 {To appear},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{klettke at webdb2000,
+  author = 	 {M. Klettke and  H. Meyer},
+  title = 	 {{XML} and Object-Relational Database Systems - Enhancing Structural Mappings Based on Statistics},
+  booktitle = 	 webdb,
+  pages = 	 {63-68},
+  year = 	 2000
+}
+
+ at misc(dom at w3c,
+key = "DOM",
+title = "{DOM}",
+note = {\oneurl{http://www.w3.org/DOM}}
+)
+
+ at Article{silkroute at tods2002,
+  author = 	 {Mary F. Fernandez and Yana Kadiyska and Dan Suciu and Atsuyuki Morishima and Wang Chiew Tan},
+  title = 	 {SilkRoute: A framework for publishing relational data in XML},
+  journal = 	 tods,
+  year = 	 {2002},
+  volume = 	 {27},
+  number = 	 {4},
+  pages = 	 {438-493},
+
+}
+
+ at InProceedings{xperanto,
+  author = 	 {M.J. Carey and J. Kiernan and J. Shanmugasundaram and E.J. Shekita and
+ S.N. Subramanian},
+  title = 	 { XPERANTO: Middleware for Publishing
+     Object-Relational Data as XML Documents},
+  booktitle = 	 vldb,
+  pages = 	 {646-648},
+  year = 	 {2000},
+  OPTnote = 	 {Carey at vldb00},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{Agrawal at vldb00,
+  author = 	 {S. Agrawal and  S. Chaudhuri and V.R. Narasayya},
+  title = 	 {Automated Selection of Materialized Views and Indexes in {SQL} Databases},
+  booktitle = 	 vldb,
+  pages = 	 {496-505},
+  year = 	 {2000},
+  OPTnote = 	 {To appear},
+  OPTannote = 	 {}
+}
+
+
+ at InProceedings{jirong at dasfaa03,
+  author =       {S. Zheng and J-R. Wen and H. Lu},
+  title =        {Cost-Driven Storage Schema Selection for {XML}},
+  booktitle =    {Proceedings of DASFAA},
+  year      =    2003
+}
+
+
+ at InProceedings{sauna at dasfaa2004,
+  author =       {Abhijit Kadlag and Amol V. Wanjari and {\freiremarkref{\meabbrev}} and Jayant R. Haritsa},
+  title =        {Supporting Exploratory Queries in Databases},
+  booktitle =    {Proceedings of DASFAA},
+  pages = {594-605},
+  year      =    2004
+}
+
+ at InProceedings{gmap at vldb94,
+  author = 	 {O. Tsatalos and M. Solomon and Y. Ioannidis},
+  title = 	 {The GMAP: A Versatile Tool for Physical Data Independence},
+  booktitle = 	 vldb,
+  pages = {367-378},
+  year = 	 1994
+}
+
+
+ at InProceedings{rao at sigmod2002,
+  author = 	 {Jun Rao and Chun Zhang and Nimrod Megiddo and Guy M. Lohman},
+  title = 	 {Automating physical database design in a parallel database},
+  booktitle = 	 sigmod,
+  pages = 	 {558-569},
+  year = 	 {2002},
+
+}
+
+ at InProceedings{db2advisor at icde2000,
+  author = 	 {Gary Valentin and  Michael Zuliani and  Daniel C. Zilio and  Guy M. Lohman and  Alan Skelley},
+  title = 	 {DB2 Advisor: An Optimizer Smart Enough to Recommend Its Own Indexes},
+  booktitle = 	 icde,
+  OPTpages = 	 {101-110},
+  year = 	 2000,
+}
+
+ at TechReport{galax at techrep,
+  author = 	 {Byron Choi and Mary Fernandez and Jerome Sim\'eon},
+  title = 	 {The XQuery Formal Semantics: A Foundation for Implementation and Optimization},
+  institution =  {AT\&T Research},
+  year = 	 {200},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 {MS-CIS-02-25},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at Misc{searchenginewatch,
+  key = 	 {searchenginewatch},
+  OPTauthor = 	 {},
+  title = 	 {Search Engines Size},
+  OPThowpublished = {},
+  month = 	 dec,
+  year = 	 2001,
+  OPTnote = 	 {\oneurl{http://searchenginewatch.com/reports/article.php/2156481}},
+  OPTannote = 	 {}
+}
+
+  
+
+ at Book{googlehacks,
+  OPTauthor = 	 {},
+  editor = 	 {Tara Calishain and Rael Dornfest},
+  title = 	 {Google Hacks: 100 Industrial-Strength Tips \& Tools},
+  publisher = 	 {O'Reilly \& Associates},
+  year = 	 {2003},
+  OPTnote = 	 {},
+}
+
+
+ at Article{soumen at www1999,
+  author = 	 {Soumen Chakrabarti and Martin van den Berg and Byron Dom},
+  title = 	 {Focused Crawling: A New Approach to Topic-Specific Web Resource Discovery},
+  journal = 	 {Computer Networks},
+  volume = 	 {31},
+  number = 	 {11-16},
+  pages = 	 {1623-1640},
+  year =         {1999}
+}
+
+ at InProceedings{doan at sigmod01,
+  author = 	 {AnHai Doan and Pedro Domingos and Alon Y. Halevy},
+  title = 	 {Reconciling Schemas of Disparate Data Sources: A Machine-Learning Approach},
+  booktitle = 	 sigmod,
+  OPTpages = 	 {},
+  year = 	 {2001},
+  OPTnote = 	 {To appear},
+  OPTannote = 	 {}
+}
+
+ at Misc{soap at w3c,
+  key = 	 {SOAP},
+  OPTauthor = 	 {},
+  title = 	 {{SOAP} Version 1.2 Part 0: Primer},
+  howpublished = {W3C Recommendation},
+  month = 	 jun,
+  year = 	 {2003},
+  note = 	 {\\ \oneurl{http://www.w3.org/TR/2003/REC-soap12-part0-20030624}},
+  OPTannote = 	 {}
+}
+
+
+
+ at Misc{http at w3c,
+  key = 	 {HTTP},
+  title = 	 {{HTTP} - Hypertext Transfer Protocol},
+  note = 	 {\oneurl{http://www.w3.org/Protocols}},
+}
+
+
+ at Misc{html at w3c,
+  key = 	 {HTML},
+  title = 	 {HyperText Markup Language ({HTML})},
+  note = 	 {\oneurl{http://www.w3.org/MarkUp}}
+}
+
+ at Misc{wsdl at w3c,
+  key = 	 {WSDL},
+  OPTauthor = 	 {W3C},
+  title = 	 {Web Service Definition Language (WSDL)},
+  howpublished = {http://www.w3.org/TR/wsdl.html}
+}
+
+ at InProceedings{webl at www98,
+  author = 	 {T. Kistlera and H. Marais},
+  title = 	 {{WebL}: a programming language for the {Web}},
+  booktitle = 	 www,
+  year = 	 {1998},
+  pages = 	 {283-294},
+  OPTnote = 	 {http://www.research.digital.com/SRC/WebL/index.html},
+  OPTannote = 	 {}
+}
+
+ at Misc{xsym2003,
+  key = 	 {XSym},
+  OPTauthor = 	 {},
+  title = 	 {{XML} {Database} {Symposium} ({XSym2003})},
+  OPThowpublished = {},
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  note = 	 {\oneurl{http://www.lirmm.fr/$\tilde{\ }$bella/XSym}},
+  OPTannote = 	 {}
+}
+
+ at Misc{cbr at uw,
+  key = 	 {Columbia},
+  title = 	 {{Columbia Basin Research -- School of Aquatic \& Fishery Sciences}},
+  note = 	 {\oneurl{\\ http://www.cbr.washington.edu}},
+}
+
+ at InProceedings{vianu at icdt2003,
+  author = 	 {Yannis Papakonstantinou and Victor Vianu},
+  title = 	 {Incremental Validation of {XML} Documents},
+  booktitle = 	 icdt,
+  year = 	 2003,
+  pages = 	 {47-63},
+}
+
+ at InProceedings{braganholo at webdb2003,
+  author = 	 {Vanessa P. Braganholo and  Susan B. Davidson and Carlos A. Heuser},
+  title = 	 { On the updatability of {XML} views over relational databases},
+  booktitle = 	 webdb,
+  pages = 	 {31-36},
+  year = 	 2003
+}
+
+
+ at inproceedings{braganholo at vldb2004,
+  author    = {Vanessa P. Braganholo and
+               Susan B. Davidson and
+               Carlos A. Heuser},
+  title     = {{From XML View Updates to Relational View Updates: old solutions
+               to a new problem.}},
+  booktitle = {VLDB},
+  year      = {2004},
+}
+
+ at Article{nestedrel at acr1986,
+  author = 	 {Stan J. Thomas and Patrick C. Fischer},
+  title = 	 { Nested Relational Structures},
+  journal = 	 {Advances in Computing Research},
+  year = 	 {1986},
+  OPTkey = 	 {},
+  volume = 	 {3},
+  OPTnumber = 	 {},
+  pages = 	 {269-307 },
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at Misc{edr at epa,
+  key = 	 {EPA},
+  title = 	 {Environmental Data Registry -- U.S. Environmental
+Protection Agency},
+  note = 	 {http://www.epa.gov/edr},
+}
+
+ at Misc{cleanair at epa,
+  key = 	 {EPA},
+  title = 	 {Clean Air Markets -- Data and Maps},
+  howpublished = {U.S. Environmental Protection Agency},
+  note = 	 {http://cfpub.epa.gov/gdm},
+}
+ at Misc{inex2005,
+  key = 	 {INEX},
+  OPTauthor = 	 {},
+  title = 	 {{INitiative} for the {Evaluation} of {XML} Retrieval ({INEX})},
+  OPThowpublished = {},
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  note = 	 {\\ \url{http://inex.is.informatik.uni-duisburg.de/2005}},
+  OPTannote = 	 {}
+}
+
+ at inproceedings{parsing at cikm2003,
+ author = {Matthias Nicola and Jasmi John},
+ title = {{XML Parsing: a Threat to Database Performance}},
+ booktitle = CIKM,
+ year = {2003},
+ }
+
+ at Misc{dblp,
+  key = 	 {DBLP},
+  OPTauthor = 	 {},
+  title = 	 {{DBLP}},
+  howpublished = {http://dblp.uni-trier.de/xml},
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{XSYM03:KKN,
+	author =			 {Rajasekar Krishnamurthy and Raghav Kaushik and
+                  Jeffrey F. Naughton},
+	booktitle =		 xsym,
+	year =				 2003,
+	title =				 {{XML-SQL Query Translation Literature: the State of
+                  the Art and Open Problems}}
+}
+
+ at InProceedings{chaudhuri at icde2004,
+  author = 	 {Surajit Chaudhuri and Zhiyuan Chen,
+  Kyuseok Shim and Yuqing Wu},
+
+  title = 	 {Storing XML (with XSD) in SQL Databases},
+  booktitle = 	 icde,
+  pages = 	 {842},
+  year = 	 2004,
+}
+
+
+ at InProceedings{toxgene at webdb2002,
+  author = 	 {Denilson Barbosa and Alberto O. Mendelzon and John Keenleyside and Kelly A. Lyons},
+
+  title = 	 {{ToXgene}: An extensible template-based data generator for {XML}},
+  booktitle = 	 webdb,
+  pages = 	 {49-54},
+  year = 	 2002,
+}
+
+ at InProceedings{xbench at icde2004,
+  author = 	 {{Benjamin Bin} Yao and {M. Tamer} �zsu, Nitin Khandelwal},
+
+  title = 	 {{XBench} Benchmark and Performance Testing of {XML} {DBMSs}},
+  booktitle = 	 icde,
+  pages = 	 {621-633},
+  year = 	 2004,
+}
+
+ at inproceedings{sihem at edbt2002,
+ author = {Sihem Amer-Yahia and SungRan Cho and Divesh Srivastava},
+ title = {Tree Pattern Relaxation},
+ booktitle = edbt,
+ year = {2002},
+ OPTisbn = {3-540-43324-4},
+ pages = {496-513},
+ OPTpublisher = {Springer-Verlag},
+ OPTaddress = {London, UK},
+ }
+
+
+ at inproceedings{xpathlearner at vldb02,
+  author =      {L. Lim and M. Wang and S. Padmanabhan and J. Vitter and R. Parr},
+  title =       {{XP}ath{L}earner: An On-Line Self-Tuning Markov Histogream for {XML} Path Selectivity Estimation},
+  booktitle =   vldb,
+  pages =       {442-453},
+  year =        2002
+}
+
+ at inproceedings{barbosa at icde2004,
+	author =			 {Denilson Barbosa and Alberto O. Mendelzon and Leonid
+                  Libkin and Laurent Mignet and Marcelo Arenas},
+	title =				 {{Efficient Incremental Validation of XML Documents}},
+	booktitle =		icde,
+	year =				 2004,
+	OPTpublisher =		 {IEEE Computer Society},
+}
+
+ at InProceedings{chen at vldb2003, 
+	author =			 {Yi Chen and Susan Davidson and Carmem S. Hara and
+                  Yifeng Zheng},
+	title =				 {{RRXF}: Redundancy reducing {XML} storage in
+                  relations},
+	booktitle =	vldb,
+	year =				 2003,
+}
+
+ at inproceedings{consens at sigmod2005, 
+	author =			 {Mariano Consens and Denilson Barbosa and Adian
+                  Teisanu and Laurent Mignet},
+	title =				 {{Goals and Benchmarks for Autonomic Configuration
+                  Recommenders}},
+	booktitle =		 sigmod,
+	year =				 2005,
+	note =				 {To appear}
+}
+
+ at INPROCEEDINGS{davidson at icde2003, 
+	author =			 {Susan Davidson and Wenfei Fan and Carmem Hara and
+                  Jing Qin},
+	booktitle =		 icde,
+	title =				 {{Propagating XML Constraints to Relations}},
+	year =				 2003
+}
+
+ at InProceedings{kane at cikm2002, 
+	author =			 {Bintou Kane and Hong Su and Elke A. Rundensteiner},
+	title =				 {{Consistently Updating XML Documents Using
+                  Incremental Constraint Check Queries}},
+	booktitle =		cikm,
+	year =				 2002,
+}
+
+ at InProceedings{donko at icde00,
+  author =       {D. Donjerkovic and Y. Ioannidis and R. Ramakrishnan},
+  title =        {Dynamic Histograms: Capturing Evolving Data Sets},
+  booktitle =    icde,
+  OPTpages =        {86},
+  year =         2000
+}
+
+ at inproceedings{multiHistMaint at fsttcs03,
+  author =      {S. Muthukrishnan and M. Strauss},
+  title =       {Maintenance of Multidimensional Histograms},
+  booktitle =   fsttcs,
+  OPTpages =       {352-362},
+  year =        2003
+}
+
+ at Misc{repcbr at uw,
+  key = 	 {CBRE},
+  title = 	 {Columbia Basin Research -- University of Washington},
+  note = {\url{http://http://www.cbr.washington.edu}}
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ at inproceedings{papak at icdt2003,
+	author =			 {Yannis Papakonstantinou and Victor Vianu},
+	title =				 {Incremental Validation of {XML} Documents},
+	booktitle =		 {International Conference on Database Theory},
+	pages =				 {47-63},
+	year =				 2003,
+	address =			 {Siena, Italy},
+	month =				 {January 8-10}
+}
+
+ at inproceedings{repbarbosa at icde2004,
+	author =			 {Denilson Barbosa and Alberto O. Mendelzon and Leonid
+                  Libkin and Laurent Mignet and Marcelo Arenas},
+	title =				 {Efficient Incremental Validation of {XML} Documents},
+	booktitle =		 {International Conference on Data Engineering},
+	year =				 2004,
+	note =				 {To appear}
+}
+
+ at inproceedings{bouchou at dbpl2003,
+	author =			 {Beatrice Bouchou and Mirian Halfeld-Ferrari-Alvez},
+	title =				 {{Updates and Incremental Validation of XML
+                  Documents}},
+	booktitle =		 {9th International Conference on Data Base
+                  Programming Languages (DBPL)},
+	year =				 2003,
+	month =				 {September 6-8},
+	address =			 {Potsdam, Germany}
+}
+
+ at InProceedings{OLDtatarinov at sigmod2001,
+  author =       {Igor Tatarinov and Zachary G. Ives and Alon Y. Halevy and Daniel S. Weld},
+  title =        {Updating XML},
+  booktitle =    sigmod,
+  OPTpages = {not-available},
+  year =         2001
+}
+
+ at InProceedings{mchugh at vldb1999,
+  author = 	 {J. McHugh and J. Widom},
+  title = 	 {Query Optimization for {XML}},
+  booktitle = 	 vldb,
+  pages = 	 {315-326},
+  year = 	 {1999},
+}
+
+ at inproceedings{twig at icde2001,
+  author    = {Z. Chen and H.V. Jagadish and F. Korn and N. Koudas and S. Muthukrishnan and R.T. Ng and D. Srivastava},
+  title     = {Counting Twig Matches in a Tree},
+  booktitle = icde,
+  OPTpublisher = {IEEE Computer Society},
+  year      = {2001},
+  pages     = {595-604}
+}
+
+ at InProceedings{aboulnaga at vldb2001,
+  author = 	 {A. Aboulnaga and A.R. Alameldeen and J.Naughton},
+  title = 	 {Estimating the Selectivity
+     of {XML} Path Expressions for {Internet} Scale Applications},
+  booktitle = 	 vldb,
+  pages = {591-600},
+  year = 	 2001
+}
+
+ at InProceedings{jag at edbt2002,
+  author = 	 {Y. Wu and J.~M. Patel and H.~V. Jagadish},
+  title = 	 {Estimating Answer Sizes for XML Queries},
+  booktitle = 	 edbt,
+  year = 	 {2002},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{minos at sigmod2002,
+  author = 	 {N. Polyzotis and M. Garofalakis},
+  title = 	 {Statistical Synopses for Graph Structured {XML} Databases},
+  booktitle = 	 sigmod,
+  year = 	 {2002},
+  pages = {358-369},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at Misc{OLDgalax,
+  key =		 {Galax},
+  title =	  {Galax},
+  OPTmonth =	   oct,
+  OPTyear =	    2001,
+  note =	     {\oneurl{http://db.bell-labs.com/galax}}
+}
+
+
+ at InProceedings{aboulnaga at sigmod1999,
+  author = {A. Aboulnaga and S. Chaudhuri},
+  title = 	 {Self-tuning Histograms: Building Histograms Without Looking at Data},
+  booktitle = 	 sigmod,
+  pages = 	 {181-192},
+  year = 	 {1999}
+}
+
+ at Book{tree-automata,
+  ALTauthor = 	 {},
+  editor = 	 {G. Rozenberg and  A. Salomaa},
+  title = 	 {Handbook of formal languages},
+  publisher = 	 {Springer Verlag},
+  year = 	 {1997},
+  volume = 	 {3},
+}
+
+ at Article{ioannidis at tods1993,
+  author = 	 {Y. Ioannidis and S. Christodoulakis},
+  title = 	 {Optimal Histograms for Limiting Worst-Case Error Propagation in the Size of
+      Join Results},
+  journal = 	 tods,
+  year = 	 {1993},
+  OPTkey = 	 {},
+  volume = 	 {18},
+  number = 	 {4},
+  pages = 	 {709-748},
+}
+
+ at InProceedings{kemper at sigmod1990,
+  author = {A. Kemper and  G. Moerkotte},
+  title = 	 {Access Support in Object Bases},
+  booktitle = 	 sigmod,
+  pages = 	 {364-374},
+  year = 	 {1990}
+}
+
+ at InProceedings{kemper at vldb1990,
+  author = {A. Kemper and  G. Moerkotte},
+  title = 	 {Advanced Query Processing in Object Bases Using Access Support Relations},
+  booktitle = 	 vldb,
+  pages = 	 {290-301},
+  year = 	 {1990}
+}
+
+ at InProceedings{toxin at webdb2001,
+  author = 	 {F. Rizzolo and A. Mendelzon.},
+  title = 	 {Indexing {XML} Data with ToXin},
+  booktitle = 	 {Workshop on the Web and Databases (WebDB},
+  OPTpages = 	 {},
+  year = 	 {2001},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at inproceedings{OLDlegodb at icde2002,
+  author    = {P. Bohannon and J. Freire and P. Roy and J. Sim\'eon},
+  title     = {From {XML} Schema to Relations:  A Cost-Based Approach to {XML} Storage},
+  booktitle = icde,
+  OPTpublisher = {IEEE Computer Society},
+  year      = {2002},
+  pages     = {64-75},
+  OPTnote  = {To appear}
+}
+
+ at Misc{blindlegodb at icde2002,
+  key = {zzz},
+  howpublished = {Reference removed for double-blind review},
+}
+
+ at inproceedings{OLDstatix at sigmod2002,
+  author    = { J. Freire and J. Haritsa and M. Ramanath  and P. Roy and J. Sim\'eon},
+  title     = {StatiX: Making {XML} Count},
+  booktitle = sigmod,
+  OPTpublisher = {ACM},
+  year      = {2002},
+  pages     = {181-191},
+}
+
+ at inproceedings{DUPstatix at sigmod2002,
+  author    = {J. Freire and J. Haritsa and M. Ramanath and P. Roy and J. Sim\'eon},
+  title     = {{StatiX}: Making {XML} Count},
+  booktitle = sigmod,
+  OPTpublisher = {ACM},
+  year      = {2002},
+  OPTpages     = {209-218},
+  note  = {To appear}
+}
+
+
+ at TechReport{statix at techrep2002,
+  author = 	 {J. Freire and J. Haritsa and M. Ramanath and P. Roy and J. Sim\'eon},
+  OPTtitle = 	 {{StatiX}: Making {XML} Count},
+  title = 	 {Gathering and Deriving Statistics for {XML} Data},
+  institution =  {Bell Labs},
+  year = 	 {2002},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTnumber = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at InProceedings{goldman at vldb97,
+  author = 	 {R. Goldman and J. Widom},
+  title = 	 {DataGuides: Enabling Query Formulation and
+      Optimization in Semistructured Databases},
+  booktitle = 	 vldb,
+  pages = 	 {436-445},
+  year = 	 {1997},
+  OPTnote = 	 {},
+}
+
+ at InProceedings{milo at icdt99,
+  author = 	 {T. Milo and D. Suciu},
+  title = 	 {Index Structures for Path Expressions},
+  booktitle = 	 icdt,
+  pages = 	 {277-295},
+  year = 	 {1999},
+  OPTnote = 	 {},
+}
+
+
+ at InProceedings{DUPaboulnaga at vldb2001,
+  author = 	 {A. Aboulnaga and A.R. Alameldeen and J.Naughton},
+  title = 	 {Estimating the Selectivity
+     of {XML} Path Expressions for {Internet} Scale Applications},
+  booktitle = 	 vldb,
+  pages = {591-600},
+  year = 	 2001
+}
+
+ at InProceedings{OLDgmap at vldb94,
+  author = 	 {O. Tsatalos and M. Solomon and Y. Ioannidis},
+  title = 	 {The GMAP: A Versatile Tool for Physical Data Independence},
+  booktitle = 	 vldb,
+  pages = {367-378},
+  year = 	 1994
+}
+
+ at InProceedings{OLDShan at vldb99,
+  author = 	 {J. Shanmugasundaram and K. Tufte and G. He and C. Zhang and D. DeWitt and J. Naughton},
+  title = 	 {Relational Databases for Querying {XML} Documents: Limitations and Opportunities},
+  booktitle = 	 vldb,
+  pages = {302-314},
+  year = 	 1999
+}
+
+ at InProceedings{Sellis at vldb97,
+  author = 	 {D. Theodoratos and  T. K. Sellis}, 
+  title = 	 {Data Warehouse Configuration},
+  booktitle = 	 vldb,
+  pages = 	 {126-135},
+  year = 	 1997
+}
+
+ at InProceedings{Carey at vldb99,
+  author = 	 {M. Carey and D. Chamberlin and S. Narayanan and B. Vance and D. Doole and S. Rielau and R. Swagerman and N. Mattos},
+
+  title = 	 {O-O, What Have They Done to DB2},
+  booktitle = 	 vldb,
+  year = 	 1999
+}
+
+ at InProceedings{OLDDeutsch at sigmod99,
+  author = 	 {A. Deutsch and M. Fernandez and D. Suciu},
+  title = 	 {Storing Semi-Structured Data with {STORED}},
+  booktitle = 	 sigmod,
+  pages = {431-442},
+  year = 	 1999
+}
+
+ at InProceedings{Deutsch at www99,
+  author = 	 {A. Deutsch and M. Fernandez and D. Florescu and A. Levy and D. Suciu},
+  title = 	 {{XML-QL}: A Query Language for {XML}},
+  booktitle = 	 www,
+  year = 	 1999
+}
+
+
+ at InProceedings{BROKENFernandez at www9-conf,
+  author = 	 { M.F. Fernandez and W.C. Tan and D. Suciu},
+  title = 	 {SilkRoute: trading between relations and {XML}},
+  booktitle = 	 {WWW9},
+  year = 	 2000
+}
+   
+ at Article{silkroute,
+  author = 	 {M.F. Fernandez and W.C. Tan and D. Suciu},
+  title = 	 {SilkRoute: trading between relations and {XML}},
+  journal = 	 {WWW9/Computer Networks},
+  year = 	 {2000},
+  volume = 	 {33},
+  number = 	 {1-6},
+  pages = 	 {723-745},
+  OPTnote = 	 {},
+  OPTannote = 	 {Fernandez at www00}
+}
+
+
+ at Misc{xql,
+  author = 	 {J. Robie and J. Lapp and D. Schach},
+  title = 	 {{XML} Query Language ({XQL})},
+  howpublished = {http://www.w3.org/TandS/QL/QL98/pp/xql.html},
+  year = 	 1998
+}
+
+ at Misc{oasis,
+  key = 	 {Oasis},
+  title = 	 {The {XML} Cover Pages},
+  note = {\oneurl{http://www.oasis-open.org/cover}}
+}
+
+
+ at Misc{DUPoasis,
+  OPTauthor = 	 {},
+  key = {Oasis},
+  title = 	 {{XML} Query Language (XQL)},
+  howpublished = {http://www.oasis-open.org},
+  year = 	 2001
+}
+
+
+ at Misc{tianVarious,
+  author = 	 {F. Tian and D. DeWitt and J. Chen and C. Zhung},
+  title = 	 {The Design and Performance Evaluation of Various {XML} Storage Strategies}, 
+  howpublished = {http://www.cs.wisc.edu/niagra/Publications.html},
+  year = 	 2001
+}
+
+ at Book{Raghu at book1997,
+  author = 	 {R. Ramakrishnan},
+  title = 	 {Database Management Systems},
+  publisher = 	 {Morgan Kaufman},
+  year = 	 1997
+}
+
+ at Misc{html,
+  key = 	 {HTML},
+  title = 	 {www.w3.org/HTML}
+}
+
+ at Misc{OLDxml at w3c,
+  key =          {XML},
+  author = 	 {T. Bray and J. Paoli and C. Sperberg-McQueen},
+  title = 	 {Extensible Markup Language ({XML}) 1.0},
+  month = 	 feb,
+  year = 	 1998,
+  note = 	 {{W3C} recommendation available at http://www.w3.org/TR/1998/REC-xml-19980219}
+}
+
+ at Misc{xquery-requirements at w3org,
+  key =          {Requirements},
+  author = 	 {D. Chamberlin and P. Fankhauser and J. Robie},
+  title = 	 {{XML} Query Requirements},
+  month = 	 feb,
+  year = 	 2001,
+  note = 	 {{W3C} Working Draft available at http://www.w3.org/}
+}
+
+ at Misc{xml-dm at w3org,
+  key =          {XDM},
+  author = 	 {M. Fernandez and J. Robie},
+  title = 	 {The {XML} Query Data Model},
+  month = 	 feb,
+  year = 	 2001,
+  note = 	 {{W3C} Working Draft available at http://www.w3.org/}
+}
+
+ at Misc{xml-algebra at w3org,
+  key =          {XAlgebra},
+  author = 	 {P. Fankhauser and M. Fernandez and A. Malhotra and M. Rys and J. Sim\'{e}on and P. Wadler},
+  title = 	 {The {XML} Query Algebra},
+  month = 	 feb,
+  year = 	 2001,
+  note = 	 {http://www.w3.org/TR/2001/WD-query-algebra-20010215}
+}
+
+ at Misc{xquery at w3crep,
+  author =	 {S. Boag and D. Chamberlin and M. Fernandez and D. Florescu and J. Robie and J. Sim\'eon and M. Stefanescu},
+  title =	 {{XQuery} 1.0: An {XML} Query Language},
+  howpublished = {{W3C} Working Draft},
+  month =	 jun,
+  year =	 2001
+}
+
+ at Misc{xquery at w3org,
+  key =          {XQuery},
+  author = 	 {D. Chamberlin and D. Florescu and J. Robie and J. Sim\'{e}on and M. Stefanescu},
+  title = 	 {{XQuery}: A Query Language for {XML}},
+  month = 	 feb,
+  year = 	 2001,
+  note = 	 {{W3C} Working Draft available at http://www.w3.org/}
+}
+
+ at Misc{excelon,
+  key = 	 {EXCELON},
+  title = 	 {Excelon},
+  howpublished = {http://www.odi.com/excelon}
+}
+ at Misc{suciu at ss-tutorial,
+  author = 	 {D. Suciu},
+  title = 	 {From Semi-Structured Data to {XML}},
+  howpublished = {http://www.research.att.com/\verb$~$suciu/slides.ppt},
+  year = 	 1999,
+  note = 	 {Tutorial presented at VLDB}
+}
+
+ at Book{abiteboul at book1999,
+  author = 	 {S. Abiteboul and P. Buneman and D. Suciu},
+  title = 	 {Data on the {Web}},
+  publisher = 	 {Morgan Kaufmann},
+  year = 	 1999
+}
+
+ at Article{lore at sigmod-record,
+  author = 	 {J. McHugh and S. Abiteboul and R. Goldman and D. Quass and J. Widom},
+  title = 	 {A Database Management System for Semistructured Data},
+  journal = 	 sigmod-record,
+  year = 	 1997,
+  volume = 	 26,
+  number = 	 3,
+  pages = 	 {54-66},
+  month = 	 sep
+}
+
+ at TechReport{lore at sigrec,
+  author = 	 {J. McHugh and S. Abiteboul and R. Goldman and D. Quass and J. Widom},
+  title = 	 {A Database Management System for Semistructured Data},
+  institution =  {Stanford},
+  year = 	 1997
+}
+
+ at InProceedings{cluet at sigmod98,
+  author = 	 {S. Cluet and C. Delobel and J. Sim\'{e}on and K. Smaga},
+  title = 	 {Your Mediators Need Data Conversion!},
+  booktitle = 	 sigmod,
+  pages = 	 {177-188},
+  year = 	 1998
+}
+
+ at Misc{widom at xml-note,
+  author = 	 {J. Widom},
+  title = 	 {Data Management for {XML} - Reseach Directions},
+  howpublished = {http://www-db.stanford.edu/\verb$~$widom/xml-whitepaper.html},
+  year = 	 1999
+}
+
+ at book{ullman at book1,
+AUTHOR = "J. Ullman",
+TITLE = "Principles of Data and Knowledge-base Systems Vol {I}",
+PUBLISHER = "Computer Science Press",
+YEAR = 1989}
+
+ at book{ullman at book2,
+AUTHOR = "J. Ullman",
+TITLE = "Principles of Data and Knowledge-base Systems Vol {II}",
+PUBLISHER = "Computer Science Press",
+YEAR = 1989}
+
+ at Unpublished{dcd,
+  author = 	 {T. Bray and C. Frankston and A. Malhotra},
+  title = 	 {Document Content Description for {XML}},
+  note = 	 {http://www.w3.org/TR/NOTE-dcd},
+  year = 	 1998
+}
+
+ at Misc{OLDxquery at w3c,
+  author =	 {D. Chambelin and J. Clark and D. Florescu and Jonathan Robie and J. Sim\'eon and M. Stefanescu},
+  title =	 {{XQuery} 1.0: An {XML} Query Language},
+  howpublished = {{W3C} Working Draft},
+  month =	 jun,
+  year =	 2001
+}
+
+ at Misc{OLDxschema at w3c,
+  author =	 {H. Thompson and D. Beech and M. Maloney and N. Mendelsohn},
+  title =	 {{XML} {Schema} {Part} 1: Structures},
+  howpublished = {{W3C} Working Draft},
+  month =	 feb,
+  year =	 2000
+}
+
+
+ at Misc{OLDdtd at w3c,
+  author =	 {J. Bosac and T. Bray and D. Connolly and E. Maler and G. Nicol and C.M. Sperberg-McQueen and L. Wood and J. Clark},
+  title =	 {Guide to the {W3C} {XML} Specification ("{XMLspec}") {DTD}},
+  howpublished = {http://www.w3.org/XML/1998/06/xmlspec-report},
+  month =	 jun,
+  year =	 1998
+}
+
+ at TechReport{florescu at inria99,
+  author = 	 {D. Florescu and  D. Kossmann},
+  title = 	 {A Performance Evaluation of Alternative
+Mapping Schemes for Storing {XML} in a Relational Database},
+  institution =  {INRIA},
+  year = 	 1999,
+  number = 	 3680
+}
+
+ at InProceedings{OLDchaudhuri at sigmod98,
+  author = 	 {S. Chaudhuri, V.R. Narasayya},
+  title = 	 {AutoAdmin 'What-if' Index Analysis Utility},
+  booktitle = 	 sigmod,
+  pages = 	 {367-378},
+  year = 	 1998
+}
+
+ at InProceedings{selinger at sigmod79,
+  author = 	 {P. Selinger and M. Astrahan and D. Chamberlin and R. Lorie and T. Price},
+  title = 	 {Access Path Selection in a Relational Database Management System},
+  booktitle = 	 sigmod,
+  pages = 	 {23-34},
+  year = 	 1979
+}
+
+ at inproceedings{Graefe at icde93,
+  author    = {G. Graefe and  W. McKenna},
+  title     = {The Volcano Optimizer Generator: Extensibility and Efficient
+               Search},
+  OPTbooktitle = {Proceedings of the Ninth International Conference on Data Engineering,
+               April 19-23, 1993, Vienna, Austria},
+  booktitle = icde,
+  OPTpublisher = {IEEE Computer Society},
+  year      = {1993},
+  OPTisbn      = {0-8186-3570-3},
+  pages     = {209-218},
+  OPTcrossref  = {DBLP:conf/icde/93},
+  bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+ at InProceedings{abiteboul at icdt97,
+  author = 	 {S. Abiteboul},
+  title = 	 {Access Path Selection in a Relational Database Management System},
+  booktitle = 	 icdt,
+  pages = 	 {1-18},
+  year = 	 1997
+}
+
+ at InProceedings{buneman at pods97,
+  author = 	 {P. Buneman},
+  title = 	 {Semistructured Data},
+  booktitle = 	 pods,
+  pages = 	 {117-121},
+  year = 	 1997
+}
+
+ at Book{kroenke at book1995,
+  author = 	 {David M. Kroenke},
+  title = 	 {Database Processing: Fundamentals, Design, and Implementation},
+  publisher = 	 {Prentice Hall},
+  year = 	 1995
+}
+
+ at InProceedings{OLDschmidt at webdb2000,
+  author = 	 {A. Schmidt and M. Kersten and M. Windhouwer and F. Waas},
+  title = 	 {Efficient Relational Storage and Retrieval of {XML} Documents},
+  booktitle = 	 webdb,
+  pages =	 {47-52},
+  year = 	 2000
+}
+
+ at InProceedings{kanne at icde2000,
+  author = 	 {C. Kanne and G. Moerkotte},
+  title = 	 {Efficient Storage of {XML} Data},
+  booktitle = 	 icde,
+  pages = 	 198,
+  year = 	 2000
+}
+
+ at InProceedings{fiebig at webdb2000,
+  author = 	 {T. Fiebig, G. Moerkotte},
+  title = 	 {Evaluating Queries on Structure with eXtended Access Support Relations},
+  booktitle = 	 webdb,
+  pages = 	 {41-46},
+  year = 	 2000
+}
+
+ at InProceedings{OLDklettke at webdb2000,
+  author = 	 {M. Klettke and  H. Meyer},
+  title = 	 {{XML} and Object-Relational Database Systems - Enhancing Structural Mappings Based on Statistics},
+  booktitle = 	 webdb,
+  pages = 	 {63-68},
+  year = 	 2000
+}
+
+ at InProceedings{klettke at xml2000,
+  author = 	 {M. Klettke and  H. Meyer},
+  title = 	 {Managing {XML} documents in object-relational databases},
+  booktitle = 	 {Proceedings of the {XML} Conference},
+  pages =	 {63-68},
+  year = 	 2000
+}
+
+ at InProceedings{kha at icde2001,
+  author = 	 {D. Kha and M. Yoshikawa and S. Uemura},
+  title = 	 {An {XML} Indexing Structure with Relative Region Coordinate},
+  pages = {313-320},
+  booktitle = 	 icde,
+  year = 	 2001,
+  OPTnote = 	 {To appear}
+}
+
+ at InProceedings{OLDshimura at dexa1999,
+  author = 	 {T. Shimura and  M. Yoshikawa and S. Uemura},
+  title = 	 {Storage and Retrieval of {XML} Documents Using Object-Relational Databases},
+  booktitle = 	 dexa,
+  pages = 	 {206-217},
+  year = 	 1999
+}
+
+ at Book{AbBuSu1999,
+  author =	 {S. Abiteboul and P. Buneman and D. Suciu},
+  title = 	 {Data on the Web: From Relations to Semistructured Data and {XML}},
+  publisher = 	 {Morgan Kaufmann},
+  year = 	 1999
+}
+
+
+ at InProceedings{FaKuSi2001,
+  author = 	 {W. Fan and G. Kuper and J. Sim\'eon},
+  title = 	 {A Unified Constraint Model for {XML}},
+  booktitle = 	 WWW,
+  pages = {179-190},
+  year =	 2001,
+  address =	 {Hong Kong, China},
+  month =	 may,
+  OPTnote =	 {to appear}
+}
+
+ at InProceedings{PaVi2000,
+  author = 	 {Yannis Papakonstantinou and Victor Vianu},
+  title = 	 {{DTD} Inference for Views of {XML} Data},
+  booktitle = 	 PODS,
+  year =	 2000,
+  address =	 {Dallas, Texas},
+  month =	 may
+}
+
+ at Book{RoSa1997,
+  editor =	 {Grzegorz Rozenberg and Arto Salomaa},
+  title = 	 {Handbook of Formal Languages},
+  publisher = 	 {Springer-Verlag},
+  year = 	 1997
+}
+
+
+ at InProceedings{Agrawal at sigmod01,
+  author = 	 {S. Agrawal and  S. Chaudhuri and V.R. Narasayya},
+  title = 	 {Index Tuning Wizard for Microsoft {SQL} Server 2000},
+  booktitle = 	 sigmod,
+  OPTpages = 	 {},
+  year = 	 {2001},
+  note = 	 {To appear},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{DUPmchugh at vldb1999,
+  author = 	 {J. McHugh and J. Widom},
+  title = 	 {Query Optimization for {XML}},
+  booktitle = 	 vldb,
+  pages = 	 {315-326},
+  year = 	 {1999},
+}
+
+ at InProceedings{OLDAgrawal at vldb00,
+  author = 	 {S. Agrawal and  S. Chaudhuri and V.R. Narasayya},
+  title = 	 {Automated Selection of Materialized Views and Indexes in {SQL} Databases},
+  booktitle = 	 vldb,
+  pages = 	 {496-505},
+  year = 	 {2000},
+  OPTnote = 	 {To appear},
+  OPTannote = 	 {}
+}
+
+ at Misc{xmlsql at oracle,
+  key = 	 {XML SQL},
+  OPTauthor = 	 {},
+  title = 	 {Oracle's {XML} {SQL} Utility},
+  howpublished = {http://technet.oracle.com/tech/xml/oracle\_xsu},
+  OPTnote = 	 {straightforward mapping from xml into ordbms},
+  OPTannote = 	 {}
+}
+
+ at Article{sqlserverxml at icdebulletin,
+  author = 	 {M. Rhys},
+  title = 	 {State-of-the-art {XML} Support in {RDBMS}: {M}icrosoft {SQL} {S}erver's {XML} Features},
+  journal = 	 {Bulletin of the Technical Committee on Data Engineering} ,
+  year = 	 2001,
+  volume = 	 24,
+  number = 	 2,
+  pages = 	 {3-11},
+  month = 	 jun
+}
+
+
+ at Misc{imdb,
+  key = 	 {IMDB},
+  OPTauthor = 	 {},
+  title = 	 {Internet {Movie} {Database}},
+  howpublished = {\url{http://www.imdb.com}},
+  OPTnote = 	 {Data can be downloaded from {\TTT ftp://ftp.fu-berlin.de/pub/misc/movies/database/tools/}},
+  OPTannote = 	 {}
+}
+
+
+ at InProceedings{OLDxperanto,
+  author = 	 {M.J. Carey and J. Kiernan and J. Shanmugasundaram and E.J. Shekita and
+ S.N. Subramanian},
+  title = 	 { XPERANTO: Middleware for Publishing
+     Object-Relational Data as {XML} Documents},
+  booktitle = 	 vldb,
+  pages = 	 {646-648},
+  year = 	 {2000},
+  OPTnote = 	 {Carey at vldb00},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{HoPi2000,
+  author = 	 {Haruo Hosoya and Benjamin C. Pierce},
+  title = 	 {{XDuce}: an {XML} Processing Language},
+  booktitle = 	 {International Workshop on the Web and Databases (WebDB'2000)},
+  year =	 2000,
+  address =	 {Dallas, Texas},
+  month =	 may
+}
+
+ at inproceedings{volc:icde93,
+    Author = "Goetz Graefe and William J. McKenna",
+    Title = "The Volcano Optimizer Generator: Extensibility and
+    Efficient Search",
+    Booktitle =  icde,
+    Year = 1993}
+
+ at inproceedings{rssb:sigmod00,
+    Author = "P. Roy and S. Seshadri and S. Sudarshan and S.
+Bhobe",
+    Title = "Efficient and Extensible Algorithms for Multi Query
+Optimization",
+pages = "249-260",
+    Booktitle =  sigmod,
+    Year = 2000}
+
+ at inproceedings{xtract at sigmod00,
+    Author = "M. Garofalakis and A. Gionis and R. Rastogi and S. Seshadri and K. Shim",
+    Title = "XTRACT: A System for Extracting Document Type
+     Descriptors from {XML} Documents",
+    Booktitle =  sigmod,
+    pages = "165-176",
+    Year = 2000}
+
+ at InProceedings{ChAbClSc1994,
+  author =       {V. Christophides and S. Abiteboul and S.
+Cluet and M. Scholl},
+  title =        {From Structured Documents to Novel Query Facilities},
+  booktitle =    SIGMOD,
+  year =         1994,
+  address =      {Minneapolis, Minnesota},
+  month =        may,
+  pages =        {313-324}
+}
+
+
+ at InProceedings{poosala at sigmod1996,
+  author = 	 {V. Poosala and Y. Ioannidis and P. Haas and  E. Shekita},
+  title = 	 {Improved Histograms for Selectivity Estimation of Range Predicates},
+  booktitle = 	 sigmod,
+  pages = 	 {294-305},
+  year = 	 {1996},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{poosala at vldb1997,
+  author = 	 {V. Poosala and Y. Ioannidis},
+  title = 	 {Selectivity Estimation Without the Attribute 
+                    Value Independence Assumption},
+  booktitle = 	 vldb,
+  pages = 	 {486-495},
+  year = 	 {1997},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{yannis at vldb1993,
+  author = 	 {Y. Ioannidis},
+  title = 	 {Universality of Serial Histograms},
+  booktitle = 	 vldb,
+  pages = 	 {256-267},
+  year = 	 {1993},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+ at Misc{OLDxerces,
+  key = 	 {Xerces},
+  title = 	 {Xerces Java Parser 1.4.3 },
+  howpublished = {http://xml.apache.org/xerces-j/},
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at Misc{xmark,
+  key = 	 {XMark},
+  title = 	 {{XMark}},
+  howpublished = {http://monetdb.cwi.nl/xml},
+}
+
+ at Misc{infoset at w3c,
+  author =	 {John Cowan and Richard Tobin},
+  title =	  {{XML} Information Set},
+  month =	   oct,
+  year =	    2001,
+  note =	     {{W3C} recommendation available at
+  http://www.w3.org/TR/xml-infoset/}
+}
+
+ at Misc{xmlspy,
+  key =		 {Spy},
+  title =	  {{XML} Spy},
+  note =	   {http://www.xmlspy.com/}
+}
+
+ at Misc{schemaformal at w3crepeated,
+  author =	 {Allen Brown and Matthew Fuchs and Jonathan Robie and
+  Philip Wadler},
+  title =	 {{XML Schema}: Formal Description},
+  year =	  2001,
+  note =	   {{W3C} Working Draft}
+}
+ at Misc{schemaformal at w3c,
+  author =	 {Allen Brown and Matthew Fuchs and Jonathan Robie and
+  Philip Wadler},
+  title =	 {{XML Schema}: Formal Description},
+  year =	  2001,
+  note =	   {{W3C} Working Draft},
+  OPTnote =	   {{W3C} working draft available at
+  http://www.w3.org/TR/2001/WD-xmlschema-formal-20010320/}
+}
+
+ at InProceedings{xduce,
+  author =	 {Haruo Hosoya and Jerome Vouillon and Benjamin
+  Pierce},
+  title =	 {Regular Expression Types for {XML}},
+  booktitle =	  {Proceedings of the International Conference on
+  Functional Programming (ICFP)},
+  pages =     {11-22},
+  year =       2000,
+  month =       sep
+}
+
+ at PhdThesis{neumannphd,
+  author =	 {Andreas Neumann},
+  title =	  {Parsing and Querying {XML} Documents in {SML}},
+  school =	   {Universitt Trier},
+  year =	    1999,
+  type =	     {Dissertation},
+  month =	      dec
+}
+
+ at Misc{DUPgalax,
+  key =		 {Galax},
+  title =	  {Galax System},
+  month =	   oct,
+  year =	    2001,
+  note =	     {http://db.bell-labs.com/galax/}
+}
+
+ at Misc{tata97,
+  author =	 {H. Comon and M. Dauchet and R. Gilleron and
+  F. Jacquemard and D. Lugiez and S. Tison and M. Tommasi},
+  title =	 {Tree Automata Techniques and Applications},
+  howpublished = {Available on:
+  http://www.grappa.univ-lille3.fr/tata},
+  year =	 1997
+}
+
+ at article{berry86,
+    author = "Gerard Berry and Ravi Sethi",
+    title = "From Regular Expressions to Deterministic Automata",
+    journal = "Theoretical Computer Science",
+    volume = "48",
+    number = "1",
+    pages = "117--126",
+    year = "1986"
+}
+
+
+ at Article{klein1,
+  author =       {A. Br\"uggemann-Klein},
+  title =         {Regular Expressions into Finite Automata},
+  journal =        {TCS},
+  year =   1993,
+  volume =  120,
+  number =   2,
+  pages =     {197-213}
+}
+
+ at Article{klein2,
+  author =       {A. Br\"uggemann-Klein and D. Wood},
+  title =         {One-Unambiguous Regular Languages},
+  journal =        {Information and Computation},
+  year =   1998,
+  volume =  140,
+  number =   2,
+  pages =     {229-253}
+}
+
+ at InProceedings{DUPminos at sigmod2002,
+  author = 	 {N. Polyzotis and M. Garofalakis},
+  title = 	 {Statistical Synopses for Graph Structured {XML} Databases},
+  booktitle = 	 sigmod,
+  year = 	 {2002},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{minos at vldb2002,
+  author = 	 {N. Polyzotis and M. Garofalakis},
+  title = 	 {Structure and Value Synopses for {XML} Data Graphs},
+  booktitle = 	 vldb,
+  year = 	 {2002},
+  pages = {466-477},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{DUPjag at edbt2002,
+  author = 	 {Y. Wu and J.~M. Patel and H.~V. Jagadish},
+  title = 	 {Estimating Answer Sizes for XML Queries},
+  booktitle = 	 edbt,
+  year = 	 {2002},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{piatetsky-shapiro at sigmod1984,
+  author = 	 {G. Piatetsky-Shapiro and C. Connell},
+  title = 	 {Accurate Estimation of the Number of Tuples Satisfying a Condition},
+  booktitle = 	 sigmod,
+  year = 	 {1984},
+  pages =        {256-276},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at InProceedings{xmill at sigmod2000,
+  author = 	 {H. Liefke and D. Suciu},
+  title = 	 {XMill: An Efficient Compressor for XML Data},
+  booktitle = 	 sigmod,
+  pages = 	 {},
+  year = 	 {2000},
+  OPTnote = 	 {},
+}
+
+ at InProceedings{xgrind at icde2002,
+  author = 	 {P. Tolani and J. Haritsa},
+  title = 	 {XGRIND: A Query-friendly XML Compressor},
+  booktitle = 	 icde,
+  pages = 	 {},
+  year = 	 {2002},
+  OPTnote = 	 {},
+}
+
+ at InProceedings{xpress at sigmod2003,
+  author = 	 {J. Min, M. Park and C. Chung},
+  title = 	 {XPRESS: A Queriable Compression for XML data},
+  booktitle = 	 sigmod,
+  pages = 	 {},
+  year = 	 {2003},
+  OPTnote = 	 {},
+}
+
+ at InProceedings{xquec at edbt2004,
+  author = 	 {A. Arion et al},
+  title = 	 {Efficient Query Evaluation over Compressed XML Data},
+  booktitle = 	 edbt,
+  pages = 	 {},
+  year = 	 {2004},
+  OPTnote = 	 {},
+}
+
+ at Article{gmp at tods2002,
+  author = 	 {P. Gibbons, Y. Matias and V. Poosala},
+  title = 	 {Fast Incremental Maintenance of Approximate Histograms},
+  journal = 	 tods,
+  year = 	 {2002},
+  OPTkey = 	 {},
+  volume = 	 {27},
+  number = 	 {3},
+  pages = 	 {261-298},
+}
+
+
+ at PhdThesis{poosala at diss1997,
+  author = 	 {Viswanath Poosala},
+  title = 	 { Histogram-based Estimation Techniques in Databases},
+  school = 	 {University of Wisconsin Madison},
+  year = 	 {1997},
+}
+
+ at MastersThesis{OLDlehti at thesis,
+  author = 	 {Patrick Lehti},
+  title = 	 {Design and Implementation of a Data Manipulation Processor for an XML Query Language},
+  school = 	 {Universit\"{a}t Darmstadt},
+  year = 	 {2001},
+}
+
+Denilson Barbosa, Alberto O. Mendelzon, John Keenleyside, Kelly A. Lyons: .WebDB 2002: 49-54
+
+ at InProceedings{toxgene,
+  author = 	 {Denilson Barbosa and Alberto O. Mendelzon and John Keenleyside and Kelly A. Lyons},
+  title = 	 {{ToXgene}: An extensible template-based data generator for {XML}},
+  booktitle = 	 webdb,
+  pages = {49-54},
+  year =	 2002
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ at InProceedings{benedikt at sigmod2003,
+  author = 	 {M. Benedikt and  C. Y. Chan and  W. Fan and  \freiremarkref{\meabbrev} and R. Rastogi},
+title = {Capturing both Types and Constraints in Data Integration},
+  booktitle = 	 sigmod,
+  year = 	 {2003},
+  pages = 	 {277-288},
+  OPTnote = 	 {To appear},
+  OPTannote = 	 {}
+}
+
+ at Misc{Clar1999,
+  author =	 {James Clark},
+  title =	 {{XSL} Transformations ({XSLT})},
+  howpublished = {W3C  Recommendation},
+  month =	 nov,
+  year =	 1999,
+  note =  {\\ \oneurl{http://www.w3.org/TR/xslt}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at misc{csilva1,
+  Author =	 {Bavoil, Louis and Callahan, Steven and Crossno,
+                  Patricia and Freire, Juliana and Scheidegger, Carlos
+                  and Silva, Claudio T. and Vo, Huy T.},
+  Title =	 {VisTrails: Enabling Interactive Multiple-View
+                  Visualizations},
+  Year =	 2005
+}
+
+ at article{csilva2,
+  Author =	 {Bernardon, Fabio and Pagot, C. and Comba, Joao
+                  L. D. and Silva, Claudio T.},
+  Title =	 {{GPU}-based Tiled Ray Casting using Depth Peeling},
+  Journal =	 {Journal of Graphics Tools},
+  Year =	 2005
+}
+
+ at article{csilva3,
+  Author =	 {Callahan, Steven and Ikits, Milan and Comba, Joao
+                  L. D. and Silva, Claudio T.},
+  Title =	 {Hardware-Assisted Visibility Sorting for
+                  Unstructured Volume Rendering},
+  Journal =	 {IEEE Transactions on Visualization and Computer
+                  Graphics},
+  Year =	 2005
+}
+
+ at incollection{csilva4,
+  Author =	 {Comba, Joao L. D. and Mitchell, Joseph S. B. and
+                  Silva, Claudio T.},
+  Title =	 {On the Convexification of Unstructured Grids From A
+                  Scientific Visualization Perspective},
+  BookTitle =	 {Scientific Visualization: Extracting Information and
+                  Knowledge from Scientific Datasets},
+  Editor =	 {Bonneau, G.-P. and Ertl, T. and Nielson, G. M.},
+  Publisher =	 {Springer-Verlag},
+  Year =	 2005
+}
+
+ at article{csilva5,
+  Author =	 {Cook, Richard and Max, Nelson and Silva, Claudio
+                  T. and Williams, Peter},
+  Title =	 {Efficient, Exact Visibility Ordering of Unstructured
+                  Meshes},
+  Journal =	 {IEEE Transactions on Visualization and Computer
+                  Graphics},
+  Volume =	 10,
+  Number =	 6,
+  Pages =	 {695-707},
+  Year =	 2004
+}
+
+ at article{csilva6,
+  Author =	 {Fleishman, Shachar and Cohen-Or, Daniel and Silva,
+                  Claudio T.},
+  Title =	 {Robust Moving-least Squares Fitting With Sharp
+                  Features},
+  Journal =	 {ACM Transactions on Graphics},
+  Year =	 2005
+}
+
+ at inproceedings{csilva7,
+  Author =	 {Pesco, Sinesio and Lindstrom, Peter and Pascucci,
+                  Valerio and Silva, Claudio T.},
+  Title =	 {Implicit Occluders},
+  BookTitle =	 {IEEE Symposium on Volume Visualization and Graphics
+                  2004},
+  Pages =	 {47-54},
+  Year =	 2004
+}
+
+ at techreport{csilva8,
+  Author =	 {Scheidegger, Carlos and Fleishman, Shachar and
+                  Silva, Claudio T.},
+  Title =	 {Triangulating Point Set Surfaces with Bounded Error},
+  institution =  {University of Utah},
+  Year =	 2005
+}
+
+ at techreport{csilva9,
+  Author =	 {Vo, Huy T. and Callahan, Steven and Lindstrom, Peter
+                  and Pascucci, Valerio and Silva, Claudio T.},
+  Title =	 {Streaming Simplification of Tetrahedral Meshes},
+  institution =  {University of Utah},
+  Year =	 {2005}
+}
+
+ at inproceedings{csilva10,
+  Author =	 {Uesu, Dirce and Bavoil, Louis and Fleishman, Shachar
+                  and Shepherd, Jason F. and Silva, Claudio T.},
+  Title =	 {Simplification of Unstructured Tetrahedral Meshes by
+                  Point Sampling},
+  BookTitle =	 {Volume Graphics 2005},
+  Year =	 2005
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at proceedings{webdb2003,
+  editor    = {Vassilis Christophides and
+               \freiremarkref{\meabbrev}},
+  title     = {International Workshop on Web and Databases},
+  booktitle = {WebDB},
+  year      = {2003},
+  OPTbibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+: , 4th Edition. McGraw-Hill Book Company 2001
+
+ at Book{silber at book,
+  author = 	 {Abraham Silberschatz and Henry F. Korth and S. Sudarshan},
+  title = 	 {Database System Concepts},
+  publisher = 	 {McGraw-Hill},
+  year = 	 {2005},
+}
+
+ at Book{mitchell at book1997,
+  author =   {Tom Mitchell},
+  title =    {Machine Learning},
+  publisher =    {McGraw Hill},
+  year =     {1997},
+}
+
+ at Book{baeza at book1999,
+  author =   {Ricardo A. Baeza-Yates and Berthier A. Ribeiro-Neto},
+  ALTeditor =    {},
+  title =    {Modern Information Retrieval},
+  publisher =    {ACM Press/Addison-Wesley},
+  year =     {1999},
+  OPTnote =      {}
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ at Article{eureka,
+  author = 	 {John C. Shafer and Rakesh Agrawal},
+  title = 	 {Continuous querying in database-centric Web applications},
+  journal = 	 {Computer Networks},
+  year = 	 {2000},
+  volume = 	 {33},
+  number = 	 {1-6},
+  pages = 	 {519-531},
+}
+
+ at article{mohan at deb1995,
+  author    = {C. Mohan and
+               Gustavo Alonso and
+               Roger G{\"u}nth{\"o}r and
+               Mohan Kamath},
+  title     = {Exotica: A Research Perspective ob Workflow Management Systems},
+  journal   = {IEEE Data Eng. Bull.},
+  volume    = {18},
+  number    = {1},
+  year      = {1995},
+  pages     = {19-26},
+  OPTee        = {db/journals/debu/MohanAGK95.html},
+  OPTbibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+
+ at TechReport{alonso at ieeeexpert1997,
+  author = 	 {G. Alonso and D. Agrawal and A. {El Abbadi} and C. Mohan},
+  title = 	 {Functionalities and Limitations of Current Workflow Management Systems},
+  institution =  {ETH---Zurich},
+  year = 	 {1997},
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTnumber = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+ at article{lee-dataflow at 2002,
+ author = {Edward A. Lee and Thomas M. Parks},
+ title = {Dataflow process networks},
+ book = {Readings in hardware/software co-design},
+ year = {2002},
+ OPTisbn = {1-55860-702-1},
+ pages = {59-85},
+ OPTpublisher = {Kluwer Academic Publishers},
+ OPTaddress = {Norwell, MA, USA},
+ }
+
+ at InCollection{lee-dataflow at book2002,
+  author = 	 {Edward A. Lee and Thomas M. Parks},
+ title = {Dataflow process networks},
+  editor = 	 {Giovanni {de Micheli} and R. Ernst and Wayne Wolf},
+  booktitle = 	 {Readings in hardware/software co-design},
+  publisher = 	 {Kluwer Academic Publishers},
+  year = 	 {2002},
+  pages = 	 {59-85},
+}
+
+
+ at Book{aalst at book2002,
+  author = 	 {{W. van der} Aalst and {K. van} Hee},
+  title = 	 {Workflow Management: Models, Methods, and
+Systems},
+  publisher = 	 {MIT Press},
+  year = 	 {2002},
+}
+
+ at inproceedings{ailamaki at ssdbm1998,
+  author    = {Anastassia Ailamaki and
+               Yannis E. Ioannidis and
+               Miron Livny},
+  OPTeditor    = {Maurizio Rafanelli and
+               Matthias Jarke},
+  title     = {Scientific Workflow Management by Database Management},
+  OPTbooktitle = {10th International Conference on Scientific and Statistical Database
+               Management, Proceedings, Capri, Italy, July 1-3, 1998},
+  booktitle = {Proceedings of SSDBM},
+  publisher = {IEEE Computer Society},
+  year      = {1998},
+  OPTisbn      = {0-8186-8575-1},
+  pages     = {190-199},
+  OPTee        = {db/conf/ssdbm/AilamakiIL98.html},
+  OPTcrossref  = {DBLP:conf/ssdbm/98},
+  OPTbibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+ at Misc{taverna,
+  key = 	 {Taverna},
+  title = 	 {{The Taverna Project}},
+  OPTyear = 	 {},
+  note = 	 {\url{http://taverna.sourceforge.net}},
+}
+
+ at Misc{triana,
+  key = 	 {Triana},
+  title = 	 {{The Triana Project}},
+  OPTyear = 	 {},
+  note = 	 {\url{http://www.trianacode.org}},
+}
+
+
+
+ at Misc{euprovenance,
+  key = 	 {Provenance},
+  title = 	 {{The EU Provenance  Project}},
+  OPTyear = 	 {},
+  note = 	 {\\\url{http://twiki.gridprovenance.org/bin/view/Provenance}},
+}
+
+
+
+ at InProceedings{gupta at icdt1997,
+  author = 	 {Himanshu Gupta},
+  title = 	 {Selection of Views to Materialize in a Data Warehouse},
+  booktitle = 	 icdt,
+  pages = 	 {98-112},
+  year = 	 1997
+}
+
+ at InProceedings{gupta at icdt1999,
+  author = 	 {Himanshu Gupta and Inderpal Singh Mumick},
+  title = 	 {Selection of Views to Materialize Under a Maintenance Cost Constraint},
+  booktitle = 	 icdt,
+  pages = 	 {453-470},
+  year = 	 1999
+}
+
+
+
+ at Misc{sciflow2006,
+  key = 	 {SCIFLOW},
+  title = 	 {{IEEE Workshop on Workflow and Data Flow for Scientific Applications
+(SciFlow 2006)}},
+  note = 	 {\url{http://www.cc.gatech.edu/~cooperb/sciflow06}},
+}
+
+ at Misc{sdm2003,
+  key = 	 {SDM},
+  title = 	 {{Scientific Data Management Framework Workshop}},
+  note = 	 {\\ \url{http://sdm.lbl.gov/$\tilde{ }$arie/sdm/SDM.Framework.wshp.htm}},
+}
+
+
+
+ at Misc{escience2004,
+  key = 	 {escience},
+  title = 	 {{e-Science Grid Environments Workshop}},
+  note = 	 {\url{http://www.nesc.ac.uk/esi}},
+}
+
+
+
+
+ at Article{sigmodrecord at sciflow2005,
+  title = 	 {Special Section on Scientific Workflows },
+  year = 	 {2005},
+  key = 	 {SIGMOD},
+  author = 	 { B. Ludaescher and C.Goble },
+  journal = {ACM SIGMOD Record},
+  volume = 	 {34},
+  number = 	 {3},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  month = 	 sep,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+Himanshu Gupta, Venky Harinarayan, Anand Rajaraman, Jeffrey D. Ullman: Index Selection for OLAP. ICDE 1997: 208-219
+
+
+ at InProceedings{crossno at vis2004,
+  author =	 {Patricia Crossno and  David H. Rogers and Rebecca M. Brannon and David Coblentz},
+  title =	 {Visualization of Salt-Induced Stress Perturbations},
+  booktitle =	 vis,
+  OPTpages =	 {369-376},
+  year =	 2004
+}
+
+ at InProceedings{wilson at vis2005,
+  author =	 {Andrew Wilson and Rebecca M. Brannon},
+  title =	 {Exploring 2D Tensor Fields Using Stress Nets},
+  booktitle =	 vis,
+  OPTpages =	 {2-9},
+  year =	 2005
+}
+
+
+ at InProceedings{levoy at VBC1990,
+ author = {M. Levoy and H. Fuchs and S. Pizer and J. Rosenman and E. L. Chaney and G. W. Sherouse and V. Interrante and J. Kiel},
+  title = {Volume Rendering in Radiation Treatment Planning},
+  booktitle = {Proceedings of the First Conference on Visualization in Biomedical Computing},
+  year = {1990},
+  month = {May},
+}
+
+ at article{pelizzari at CRDI2000,
+ author = {C. A. Pelizzari and G. T. Y. Chen},
+ title = {Volume Visualization in Radiation Treatment Planning},
+ journal = {Critical Reviews in Diagnostic Imaging},
+ volume = {41},
+ number = {6},
+ pages = {379--364},
+ year = {2000}
+} 
+ 
+ at article{jankun-kelly at tvcg2007, 
+ author = {T.J. Jankun-Kelly and Kwan-Liu Ma and Michael Gertz},  
+ title = {A Model and Framework for Visualization Exploration},  
+ year = {2007},
+ journal = {IEEE Transactions on Visualization and Computer Graphics},  
+ volume = {13},
+ number = {2},
+ pages = {357--369},
+}
+
+ at article{groth at tvcg2006,
+ author = {Dennis P. Groth and Kristy Streefkerk},
+ title = {Provenance and Annotation for Visual Exploration Systems},
+ journal = {IEEE Transactions on Visualization and Computer Graphics},
+ volume = {12},
+ number = {6},
+ year = {2006},
+ pages = {1500-1510},
+}
+
+ at InProceedings{Freire:2006:IPAW,
+ author = {J. Freire and C. T. Silva and S. P. Callahan and E. Santos and C. E. Scheidegger and H. T. Vo},
+ title = {Managing Rapidly-Evolving Scientific Workflows},
+ booktitle = {International Provenance and Annotation Workshop (IPAW)},
+ year = {2006},
+ pages = {10--18},
+ publisher = {Springer Verlag},
+ series = {LNCS 4145},
+}
+
+ at article{tory05a,
+author = {Melanie Tory and Simeon Potts and Torsten M\"oller},
+title = {A Parallel Coordinates Style Interface for Exploratory Volume Visualization},
+journal = {IEEE Transactions on Visualization and Computer Graphics},
+volume = {11},
+number = {1},
+year = {2005},
+pages = {71--80},
+}
+
+ at article{tory05b,
+author = {Melanie Tory and Torsten M\"oller},
+title = {Evaluating Visualizations: Do Expert Reviews Work?},
+journal = {IEEE Computer Graphics and Applications},
+volume = {25},
+number = {5},
+year = {2005},
+pages = {8--11},
+}
+
+ at article{roth01,
+author = {Mark Derthick and Steven F. Roth},
+title = {Enhancing Data Exploration with a Branching History of User Operations},
+journal = {Knowledge Based Systems},
+volume = {14},
+number = {1--2},
+pages = {65--74},
+year = {2001},
+}
+
+ at book{johnson79,
+author = {Michael R. Garey and David S. Johnson},
+title = {Computers and Intractability: A Guide to the Theory of NP-Completeness},
+publisher = {W. H. Freeman},
+isbn = {0-7167-1045-5},
+pages = {202},
+year = {1979},
+}
+
+ at ARTICLE{myGrid:Challenge06,
+  AUTHOR = {Jun Zhao and Carole Goble and Robert Stevens and Daniele
+                  Turi},
+  TITLE = {Mining Taverna's Semantic Web of Provenance},
+  JOURNAL = {Concurrency and Computation: Practice and Experience},
+  YEAR = {2007},
+  OPTKEY = {},
+  OPTVOLUME = {},
+  OPTNUMBER = {},
+  OPTPAGES = {},
+  OPTMONTH = {},
+  OPTNOTE = {},
+  OPTANNOTE = {},
+  ABSTRACT = {Taverna is a workflow workbench and execution environment developed as part of the UK's myGrid project. Taverna's provenance model captures: information about the origin of experimental data results collected during workflow runs; derivation paths that present a datum's lineage; an audit trail of the experiment execution leading to the data; the context of the workflow; and the evidence of the knowledge outcomes as a result of its execution. Flexible and open models are req [...]
+}
diff --git a/extensions/latex/example2.pdf b/extensions/latex/example2.pdf
new file mode 100644
index 0000000..8002563
Binary files /dev/null and b/extensions/latex/example2.pdf differ
diff --git a/extensions/latex/example2.tex b/extensions/latex/example2.tex
new file mode 100644
index 0000000..c0a4027
--- /dev/null
+++ b/extensions/latex/example2.tex
@@ -0,0 +1,218 @@
+\documentclass[11pt,twocolumn]{article}
+
+\usepackage{times}
+\usepackage[letterpaper,hmargin=1in,vmargin=1.25in]{geometry}
+\usepackage{float}
+\usepackage[rflt]{floatflt}
+\usepackage{xspace}
+\usepackage{cite,alltt}
+\usepackage{amsmath,amscd,amssymb}
+\usepackage[pdftex]{graphicx}
+\usepackage{array}
+\usepackage{mathptmx}
+
+\usepackage{crowdlabs}
+\usepackage{subfigure}
+\newcommand{\etc}{\emph{etc.}\xspace}
+\newcommand{\eg}{\emph{e.g.,}\xspace}
+\newcommand{\ie}{\emph{i.e.,}\xspace}
+
+
+\begin{document}
+
+\title{%Provenance for Visualizations: Beyond Reproduciblity\\
+Provenance for Visualizations: Reproducibility and Beyond}
+\author{Cl\'audio T. Silva \and Juliana Freire \and Steven P. Callahan}
+
+\maketitle
+
+\begin{abstract}
+  The demand for the construction of complex visualizations is growing
+  in many disciplines of science, as users are faced with ever
+  increasing volumes of data to analyze. The authors present
+  VisTrails, an open-source provenance management system that provides
+  infrastructure for data exploration and visualization.
+\end{abstract}
+
+\section{Introduction}
+Computing has been an enormous accelerator for science, leading to an
+information explosion in many different fields. Future scientific
+advances depend on our ability to comprehend the vast amounts of
+data currently being produced and acquired. 
+%
+To analyze and understand this data, though, we must assemble complex
+computational processes and generate insightful visualizations, which
+often require combining loosely coupled resources, specialized
+libraries, and grid and Web services. Such processes could generate
+yet more data, adding to the information overflow scientists currently
+deal with.  
+
+
+Today, the scientific community uses ad hoc approaches to
+data exploration, but such approaches have serious limitations. In
+particular, scientists and engineers must expend substantial effort
+managing data (such as scripts that encode computational tasks, raw
+data, data products, images, and notes) and recording provenance
+information (that is, all the information necessary for reproducing a
+certain piece of data or assertion) so that they can answer basic
+questions: Who created a data product and when? When was it modified,
+and who modified it? What process was used to create the data product?
+Were two data products derived from the same raw data? Not only is
+this process time-consuming, it’s also error-prone.  
+
+Without provenance, it’s difficult (and sometimes impossible) to
+reproduce and share results, solve problems collaboratively, validate
+results with different input data, understand the process used to
+solve a particular problem, and reuse the knowledge involved in data
+analysis. In addition, data products’ longevity becomes
+limited—without precise and sufficient information about how the data
+product was generated, its value diminishes significantly.  
+
+\begin{figure}[t]
+\centering{
+\includegraphics[width=0.9\linewidth, clip=false]{fig1.png}
+}
+\caption{Dataflow programming for visualization. (a) We commonly use a
+  script to describe a pipeline from existing libraries such as the
+  Visualization Toolkit (VTK). (b) Visual programming interfaces, such
+  as the one VisTrails provides, facilitate the creation and
+  maintenance of these dataflow pipelines. The green rectangles
+  represent modules, and the black lines represent connections.}
+\label{fig:fig1}
+\end{figure}
+
+The lack of adequate provenance support in visualization systems
+motivated us to build VisTrails, an open source provenance-management
+system that provides infrastructure for data exploration and
+visualization through workflows. VisTrails transparently records
+detailed provenance of exploratory computational tasks and leverages
+this information beyond just the ability to reproduce and share
+results. In particular, it uses this information to simplify the
+process of exploring data through visualization.
+
+\section{Visualization Systems}
+
+Visualization systems such as MayaVi
+(\url{http://mayavi.sourceforge.net}) and ParaView
+(\url{www.paraview.org})—which are built on top of Kitware's
+Visualization Toolkit (VTK)~\cite{Schroeder:2003:VTK}~—as well as
+SCIRun (\url{http://software.sci.utah.edu/scirun.html}) enable users
+to interactively create and manipulate complex visualizations. Such
+systems are based on the notion of data flows~\cite{lee at ieee1995}, and
+they provide visual interfaces for producing visualizations by
+assembling pipelines out of modules (or functions) connected in a
+network. SCIRun supports an interface that lets users directly edit
+data flows, giving them complete control. MayaVi and ParaView have a
+different interaction paradigm that implicitly builds data flows as
+the user makes “task-oriented” choices (such as selecting an
+isosurface value).
+
+
+Although these systems let users create complex visualizations, they
+lack the ability to support data exploration at a large scale.
+Notably, they don’t adequately support collaborative creation and
+exploration of multiple visualizations. Because these systems don’t
+distinguish between the definition of a data flow and its instances,
+to execute a given data flow with different parameters (for example,
+different input files), users must manually set these parameters
+through a GUI. Clearly, this process doesn’t scale to more than a few
+visualizations at a time. Additionally, modifications to parameters or
+to a data flow’s definition are destructive—the systems don’t maintain
+any change history. This requires the user to first construct the
+visualization and then remember the input data sets, parameter values,
+and the exact dataflow configuration that led to a particular image.
+
+
+Finally, before constructing a visualization, users must often
+acquire, generate, or transform a given data set—for example, to
+calibrate a simulation, they must obtain data from sensors, generate
+data from a simulation, and finally construct and compare the
+visualization for both data sets. Most visualization systems, however,
+don’t give users adequate support for creating the complex pipelines
+that use multiple libraries and services.
+
+\begin{figure*}[t]
+\centering{
+%\includegraphics[width=0.9\linewidth, clip=false]{fig2.png}
+\crowdlabs[wfid=1046,
+buildalways=false]{width=4cm}
+}
+\caption{The end result of the script or VisTrails pipeline (see
+  Figure~\ref{fig:fig1}) is a set of interactive visualizations.}
+\label{fig:histogram}
+\end{figure*}
+
+\section{VisTrails: Provenance for Visualization}
+VisTrails (\url{www.vistrails.org}) is a new visualization system we
+developed at the University of Utah that provides a comprehensive
+provenance-management infrastructure and can be easily combined with
+existing visualization libraries. Unlike previous systems, VisTrails
+uses an action-based provenance model that uniformly captures changes
+to both parameter values and pipeline definitions by unobtrusively
+tracking all changes that users make to pipelines in an exploration
+task. We refer to this detailed provenance of the pipeline evolution
+as a visualization trail, or vistrail. 
+
+The stored provenance ensures that users will be able to
+reproduce the visualizations and lets them easily navigate through the
+space of pipelines created for a given exploration task. The VisTrails
+interface lets users query, interact with, and understand the
+visualization process’s history. In particular, they can return to
+previous versions of a pipeline and change the specification or
+parameters to generate a new visualization without losing previous
+changes.  
+
+\begin{figure*}[t]
+\centering{
+%\includegraphics[width=0.9\linewidth, clip=false]{fig2.png}
+\crowdlabs[wfid=1050,
+buildalways=false]{width=4cm}
+}
+\caption{The end result of the script or VisTrails pipeline (see
+  Figure~\ref{fig:fig1}) is a set of interactive visualizations.}
+\label{fig:histogram_pdf}
+\end{figure*}
+
+Another important feature of the action-based provenance model is that
+it enables a series of operations that greatly simplify the
+exploration process and could reduce the time to insight. In
+particular, it allows the flexible reuse of pipelines and provides a
+scalable mechanism for creating and comparing numerous visualizations
+as well as their corresponding pipelines. Although we originally
+built VisTrails to support exploratory visualization tasks, its
+extensible infrastructure lets users integrate a wide range
+of libraries. This makes the system suitable for other exploratory
+tasks, including data mining and integration.  
+
+\section{Creating an Interactive Visualization with VisTrails}
+To illustrate the issues involved in creating visualizations and how
+provenance can aid in this process, we present the following scenario,
+common in medical data visualization.
+
+Starting from a volumetric computed tomography (CT) data set, we
+generate different visualizations by exploring the data through volume
+rendering, isosurfacing (extracting a contour), and slicing. Note that
+with proper modifications, this example also works for visualizing
+other types of data (for example, tetrahedral meshes). 
+
+\subsection{Dataflow Processing Networks and Visual Programming}
+A useful paradigm for building visualization applications is the
+\emph{dataflow model}. A data flow is a directed graph in which nodes
+represent computations, and edges represent data streams: each node or
+module corresponds to a procedure that’s applied on the input data and
+generates some output data as a result. The data flow in the graph
+determines the order in which a dataflow system executes the
+processing nodes. In visualization, we commonly refer to a dataflow
+network as a visualization pipeline. (For this article, we use the
+terms workflow, data flow, and pipeline interchangeably.)
+Figure~\ref{fig:fig1}b shows an example of the data flow used to
+derive the images shown in Figure~\ref{fig:histogram}. The green
+rectangles represent modules, and the black lines represent
+connections. Most of the modules in Figure~\ref{fig:fig1} are from VTK, and
+labels on each module indicate the corresponding VTK class. In this
+figure, we naturally think of data flowing from top to bottom,
+eventually being rendered and presented for display.
+
+\bibliography{example2} 
+\bibliographystyle{abbrv}
+\end{document}
diff --git a/extensions/latex/fig1.png b/extensions/latex/fig1.png
new file mode 100644
index 0000000..82e67a6
Binary files /dev/null and b/extensions/latex/fig1.png differ
diff --git a/extensions/latex/fig2.png b/extensions/latex/fig2.png
new file mode 100644
index 0000000..11ee530
Binary files /dev/null and b/extensions/latex/fig2.png differ
diff --git a/extensions/latex/find.cmd b/extensions/latex/find.cmd
new file mode 100644
index 0000000..2017045
--- /dev/null
+++ b/extensions/latex/find.cmd
@@ -0,0 +1,59 @@
+ at echo off
+setlocal enableextensions enabledelayedexpansion
+
+:: Needs an argument.
+
+if "x%*"=="x" (
+    echo Usage: which ^<progName^>
+    goto :end
+)
+
+:: First check if file exists
+if exist "%*" (
+    echo "%*"
+    goto :end
+)
+
+:: Then try the unadorned filename in PATH.
+
+set fullspec=
+call :find_it %*
+
+:: Then try all adorned filenames in order.
+
+set mypathext=!pathext!
+:loop1
+    :: Stop if found or out of extensions.
+
+    if "x!mypathext!"=="x" goto :loop1end
+
+    :: Get the next extension and try it.
+
+    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
+    call :find_it %1!myext!
+
+:: Remove the extension (not overly efficient but it works).
+
+:loop2
+    if not "x!myext!"=="x" (
+        set myext=!myext:~1!
+        set mypathext=!mypathext:~1!
+        goto :loop2
+    )
+    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!
+
+    goto :loop1
+:loop1end
+
+:end
+endlocal
+goto :eof
+
+:: Function to find and print a file in the path.
+
+:find_it
+    for %%i in (%*) do set fullspec=%%~$PATH:i
+    set z=%fullspec%
+    if not [%fullspec%]==[] set z=%fullspec:\=/%
+    if not "x!z!"=="x" @echo !z!
+    goto :eof
diff --git a/extensions/latex/head.pdf b/extensions/latex/head.pdf
new file mode 100644
index 0000000..fbeb6c1
Binary files /dev/null and b/extensions/latex/head.pdf differ
diff --git a/extensions/latex/head.tex b/extensions/latex/head.tex
new file mode 100644
index 0000000..90e7093
--- /dev/null
+++ b/extensions/latex/head.tex
@@ -0,0 +1,143 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Copyright (C) 2011-2014, NYU-Poly.
+%% Copyright (C) 2006-2011, University of Utah. 
+%% All rights reserved.
+%% Contact: contact at vistrails.org
+%%
+%% This file is part of VisTrails.
+%%
+%% "Redistribution and use in source and binary forms, with or without 
+%% modification, are permitted provided that the following conditions are met:
+%%
+%%  - Redistributions of source code must retain the above copyright notice, 
+%%    this list of conditions and the following disclaimer.
+%%  - Redistributions in binary form must reproduce the above copyright 
+%%    notice, this list of conditions and the following disclaimer in the 
+%%    documentation and/or other materials provided with the distribution.
+%%  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{article}
+\usepackage{vistrails}
+
+%% uncomment lines below and set to a local path if you want to run vistrails
+%% locally. Otherwise, we will run at www.vistrails.org
+
+%% If you are running on a Mac from a binary distribution uncomment the next 2 lines, modifying them according to your system configuration
+%\renewcommand{\vistrailspath}{/Applications/VisTrails/VisTrails.app/Contents/MacOS/vistrails}
+%\renewcommand{\vistrailsenv}{DYLD_LIBRARY_PATH= }
+
+%% If you are running on Windows from the binary distribution uncommnet the next 3 lines
+%\renewcommand{\vistrailspath}{C:/Program Files (x86)/VisTrails/vistrails/run.py}
+%\renewcommand{\vistrailspythonpath}{C:/Program Files (x86)/VisTrails/Python27/python.exe}
+%\renewcommand{\vistrailsenv}{PATH="C:/Program Files (x86)/VisTrails"}
+
+%% If you are running from source uncomment and modify the lines below 
+%% according to your system configuration.
+% \renewcommand{\vistrailspath}{D:/emanuele/vistrails/vistrails/run.py}
+
+%% If using MikTex or cygwin on Windows, you need to set the Path to point to your Qt Libraries
+%\renewcommand{\vistrailsenv}{PATH=D:/Qt/4.6.3/bin}
+
+%% If your python is in the path, you don't need to uncomment the line. Otherwise 
+%% add the complete path to your python executable
+%\renewcommand{\vistrailspythonpath}{C:/Python27/python.exe}
+
+\begin{document}
+
+This document shows examples of how to embed a vistrail from a local
+file. The file is head.vt and it is located in the same folder as this
+file.
+
+To build the pdf version of this document, configure this file
+according to your platform and from a terminal window type:
+\begin{verbatim}
+make head
+\end{verbatim}
+
+or
+\begin{verbatim}
+pdflatex -shell-escape head
+\end{verbatim}
+
+Embedding the results of workflow \emph{aliases}:
+\begin{center}
+\vistrail[filename=head.vt,
+version=15]{width=6cm}
+\end{center}
+
+Embedding the workflow \emph{aliases} as a pdf:
+\begin{center}
+\vistrail[filename=head.vt,
+version=15,
+pdf,
+showworkflow]{width=6cm}
+\end{center}
+
+Embedding a workflow as a smart tag (if the tag changes to another
+workflow, the new workflow will be used when the latex file is
+compiled)
+\begin{center}
+\vistrail[filename=head.vt,
+version=42,
+tag={volume rendering},
+buildalways]{width=6cm}
+\end{center}
+
+Embedding the complete tree:
+\begin{center}
+\vistrail[filename=head.vt,
+buildalways,
+showtree]{width=8cm}
+\end{center}
+
+%% Uncomment the following part part for accessing workflows directly
+%% in a database
+
+% Embedding workflow result:
+% \begin{center}
+% \vistrail[host=localhost,
+% db=vistrails,
+% port=3306,
+% vtid=1,
+% version=49]{width=6cm}
+% \end{center}
+
+% Embedding workflow graph as pdf
+% \begin{center}
+% \vistrail[host=localhost,
+% db=vistrails,
+% port=3306,
+% vtid=1,
+% version=49,
+% pdf,
+% showworkflow]{width=6cm}
+% \end{center}
+
+% Embedding the tree
+% \begin{center}
+% \vistrail[host=localhost,
+% db=vistrails,
+% port=3306,
+% vtid=1,
+% buildalways,
+% showtree]{width=8cm}
+% \end{center}
+\end{document}
+
diff --git a/extensions/latex/head.vt b/extensions/latex/head.vt
new file mode 100644
index 0000000..86c6116
Binary files /dev/null and b/extensions/latex/head.vt differ
diff --git a/extensions/latex/includecrowdlabs.py b/extensions/latex/includecrowdlabs.py
new file mode 100755
index 0000000..b83f62b
--- /dev/null
+++ b/extensions/latex/includecrowdlabs.py
@@ -0,0 +1,434 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# This runs on crowdlabs only!!!
+# the input file format should follow this:
+#   url=http://www.crowdlabs.org
+#   wfid=598
+#   vtid=34
+#   pdf=true
+#   workflow=true
+#   buildalways=true
+#   other=width=0.45\linewidth 
+#
+# buildalways, workflow and pdf are optional
+# at least one of wfid or vtid must be provided
+
+import sys
+import os.path
+import os
+from httplib import HTTP
+from urlparse import urlparse
+import urllib2
+import re
+import logging
+
+debug = True
+logger = None
+             
+###############################################################################
+
+def log(msg):
+    global debug, logger
+    if debug:
+        logger.debug(msg)
+        
+###############################################################################
+
+def usage():
+    print "Usage: "
+    print "   %s path/to/options_file" % sys.argv[0]
+    sys.exit(1)
+
+###############################################################################
+    
+def bool_conv(x):
+    """bool_conv(x: str) -> bool
+    Converts a string to boolean.
+    
+    """
+    s = str(x).upper()
+    if s == 'TRUE':
+        return True
+    if s == 'FALSE':
+        return False
+    
+###############################################################################    
+
+def path_exists_and_not_empty(path):
+    """path_exists_and_not_empty(path:str) -> boolean 
+    Returns True if given path exists and it's not empty, otherwise returns 
+    False.
+    
+    """
+    if os.path.exists(path):
+        for root, dirs, file_names in os.walk(path):
+            break
+        if len(file_names) > 0:
+            return True
+    return False
+
+###############################################################################
+ 
+def build_vistrails_cmd_line(path_to_vistrails, host, db_name, vt_id, version,
+                             port, path_to_figures):
+    """ build_vistrails_cmd_line(path_to_vistrails: str, host: str,
+                                 db_name: str, vt_id: str, version: str,
+                                 path_to_figures: str) -> str
+        Build the command line to run vistrails with the given parameters.
+    """
+    cmd_line = 'python "%s" -b -e "%s" -t %s -f %s -r %s -u %s "%s:%s" > \
+vistrails.log' % (vt_user,
+                  path_to_vistrails,
+                  path_to_figures,
+                  host,
+                  db_name,
+                  port,
+                  vt_id,
+                  version)
+    return cmd_line
+
+###############################################################################
+
+def generate_latex(server_url, wfid, path_to_figures, graphics_options):
+    """generate_latex(wfid: str, execute: bool,
+                      showspreadsheetonly: bool, path_to_figures: str,
+                      graphics_options: str)  -> str
+        This generates a piece of latex code containing the \href command and
+        a \includegraphics command for each image generated.
+    """
+    log("generate_latex")
+    url_params = "details/%s/" % wfid
+    url_params = url_params.replace("%","\%")
+    url = "%s%s"%(server_url,url_params)
+    href = "\href{%s}{" % url
+    for root, dirs, file_names in os.walk(path_to_figures):
+        break
+    n = len(file_names)
+    s = ''
+    
+    for f in file_names:
+        filename = os.path.join(path_to_figures,f).replace("%","\%")
+        if graphics_options:
+            s += "\includegraphics[%s]{%s}\n" % (graphics_options, filename)
+        else:
+            s += "\includegraphics{%s}\n" % filename
+    s += "}"
+    return href+s
+
+###############################################################################
+
+def generate_latex_error(error_msg):
+    """ generate_latex_error(error_msg: str) -> str
+        this generates a piece of latex code with an error message.
+    """
+    s = """\\PackageError{vistrails}{ An error occurred when executing vistrails. \\MessageBreak
+%s
+}{vistrails}""" % error_msg
+    return s
+    
+###############################################################################
+
+def download(url,filename):
+    try:
+        furl = urllib2.urlopen(url)
+        f = file(filename,'wb')
+        f.write(furl.read())
+        f.close()
+        return True
+    except:
+        return False
+        
+###############################################################################    
+
+def download_as_text(url):
+    try:
+        furl = urllib2.urlopen(url)
+        s = furl.read()
+        return s
+    except:
+        return None
+
+###############################################################################
+
+def download_workflow(url_crowdlabs, wfid, path_to_figures, wgraph=False,
+                      pdf=False, build_always=False):
+    """download_workflow(url_crowdlabs: str, wfid: str, path_to_figures: str, 
+                         wgraph: bool, pdf: bool, build_always: bool)
+                                   -> tuple(bool, str)
+        Try to download image from url and returns a tuple containing a boolean 
+        saying if it was successful or not and the latex code.
+    """    
+    log("download_workflow")
+    if not path_exists_and_not_empty(path_to_figures) or build_always:
+        if not os.path.exists(path_to_figures):
+            os.makedirs(path_to_figures)
+        
+        if check_url(url_crowdlabs):
+            website = "://".join(urlparse(url_crowdlabs)[:2])
+            if not wgraph:
+                if not pdf:
+                    request = "/vistrails/workflows/generate_visualization_image/%s/"%wfid
+                else:
+                    request = "/vistrails/workflows/generate_visualization_pdf/%s/"%wfid
+            else:
+                if not pdf:
+                    request = "/vistrails/workflows/generate_pipeline_image/%s/"%wfid
+                else:
+                    request = "/vistrails/workflows/generate_pipeline_pdf/%s/"%wfid
+
+            url = url_crowdlabs + request
+            log("from %s"%url)
+            try:
+                page = download_as_text(url)
+                # we will look for a list of comma separated in the html
+                images = page.split(",")
+                if len(images) > 0:
+                    failed = False
+                    for i in images:
+                        msg = ''
+                        pngfile = i.strip()
+                        if not check_url(pngfile):
+                            img = website + pngfile
+                        else:
+                            img = pngfile
+                        if not download(img, os.path.join(path_to_figures,
+                                        os.path.basename(img))):
+                            msg += "Error when download image: %s. <return>" %\
+                                   img
+                            failed = True
+                    if not failed:
+                        log("success")
+                        return (True, generate_latex(url_crowdlabs + "/vistrails/workflows/",
+                                                     wfid,
+                                                     path_to_figures,
+                                                     graphics_options))
+                    else:
+                        log("failed: %s"%msg)
+                        return (False, generate_latex_error(msg))
+                else:
+                    msg = "Web server returned: %s" % page
+                    log("failed: %s"%msg)
+                    return (False, generate_latex_error(msg))
+            
+            except Exception, e:
+                log("failed with exception: %s"%str(e))
+                return (False, generate_latex_error(str(e)))
+        else:
+            msg = "Invalid url: %s" % url_crowdlabs
+            return (False, generate_latex_error(msg))
+    else:
+        log("using cached images")
+        return (True, generate_latex(url_crowdlabs  + "/vistrails/workflows/", 
+                                     wfid,
+                                     path_to_figures, 
+                                     graphics_options))
+    
+###############################################################################
+
+def download_tree(url_crowdlabs, vtid, path_to_figures, pdf=False,
+                  build_always=False):
+    """download_tree(url_crowdlabs: str, vtid: str, path_to_figures: str, 
+                     pdf: bool, build_always: bool)
+                                   -> tuple(bool, str)
+        Try to download tree from url and returns a tuple containing a boolean 
+        saying if it was successful or not and the latex code.
+    """
+    log("download_tree")
+    if not path_exists_and_not_empty(path_to_figures) or build_always:
+        if not os.path.exists(path_to_figures):
+            os.makedirs(path_to_figures)
+        
+        if check_url(url_crowdlabs):
+            website = "://".join(urlparse(url_crowdlabs)[:2])
+            if not pdf:
+                request = "/vistrails/generate_provenance_image/%s/"%vtid
+            else:
+                request = "/vistrails/generate_provenance_pdf/%s/"%vtid
+            url = url_crowdlabs + request
+            log("from %s"%url)
+            try:
+                page = download_as_text(url)
+                # we will look for a list of comma separated in the html
+                images = page.split(",")
+                if len(images) > 0:
+                    failed = False
+                    for i in images:
+                        msg = ''
+                        pngfile = i.strip()
+                        if not check_url(pngfile):
+                            img = website + pngfile
+                        else:
+                            img = pngfile
+                        if not download(img, os.path.join(path_to_figures,
+                                        os.path.basename(img))):
+                            msg += "Error when download image: %s. <return>" %\
+                                   img
+                            failed = True
+                    if not failed:
+                        log("success")
+                        return (True, generate_latex(url_crowdlabs + "/vistrails/", vtid,
+                                                     path_to_figures,
+                                                     graphics_options))
+                    else:
+                        log("failed: %s"%msg)
+                        return (False, generate_latex_error(msg))
+                else:
+                    msg = "Web server returned: %s" % page
+                    log("failed: %s"%msg)
+                    return (False, generate_latex_error(msg))
+            
+            except Exception, e:
+                log("failed with exception: %s"%str(e))
+                return (False, generate_latex_error(str(e)))
+        else:
+            msg = "Invalid url: %s" % url_crowdlabs
+            log("failed: %s"%msg)
+            return (False, generate_latex_error(msg))
+    else:
+        log("using cached images")
+        return (True, generate_latex(url_crowdlabs + "/vistrails/", vtid,
+                                     path_to_figures, graphics_options))
+    
+    
+###############################################################################
+
+def check_url(url):
+    """check_url(url:str) -> bool
+    Check if a URL exists using the url's header.
+    """
+    try:
+        p = urlparse(url)
+        h = HTTP(p[1])
+        h.putrequest('HEAD', p[2])
+        h.endheaders()
+        if h.getreply()[0] == 200:
+            return True
+        else:
+            return False
+    except:
+        return False
+
+###############################################################################
+
+options_file = None
+try:
+    options_file = open(sys.argv[1])
+except IndexError:
+    usage()
+
+if debug:
+    logger = logging.getLogger("crowdLabsLatex")
+    handler = logging.FileHandler('crowdlabs.log')
+    handler.setFormatter(logging.Formatter('crowdLabsLatex - %(asctime)s %(message)s'))
+    handler.setLevel(logging.DEBUG)
+    logger.setLevel(logging.DEBUG)
+    logger.addHandler(handler)
+    log("***********************************")
+    log("********* SESSION START ***********")
+        
+lines = options_file.readlines()
+urlcrowdlabs = None
+wfid = None
+vtid = None
+pdf = False
+wgraph = False
+tree = False
+
+graphics_options = None
+build_always = False
+run_locally = True
+
+for line in lines:
+    args = line.split("=")
+    if len(args) > 2:
+        args[1] = "=".join(args[1:])
+    if args[0] == "url":
+        urlcrowdlabs = args[1].strip(" \n")
+    elif args[0] == "wfid":
+        wfid = args[1].strip(" \n")
+    elif args[0] == "vtid":
+        vtid = args[1].strip(" \n")
+        tree = True
+    elif args[0] == 'pdf':
+        pdf = bool_conv(args[1].strip(" \n"))    
+    elif args[0] == 'workflow':
+        wgraph = bool_conv(args[1].strip(" \n"))
+    elif args[0] == "buildalways":
+        build_always = bool_conv(args[1].strip(" \n"))
+    elif args[0] == "other":
+        graphics_options = args[1].strip(" \n")
+
+# then we use the combination wf_wfid or vt_vtid to
+# create a unique folder. 
+# TODO: Maybe we should use a hash of this. For now let's keep it
+# legible.
+out_type = "png"
+if pdf:
+    out_type = 'pdf'
+
+if check_url(urlcrowdlabs):
+    
+    if wfid is not None:
+        folder_suffix = ""
+        if wgraph:
+            folder_suffix = "_graph"
+        path_to_figures = os.path.join("crowdlabs_images",
+                                       "wf_%s_%s%s" %(wfid, out_type,folder_suffix))
+        log(path_to_figures)
+        result, latex = download_workflow(urlcrowdlabs, wfid,
+                                          path_to_figures, wgraph, pdf, build_always)        
+
+    elif vtid is not None:
+        path_to_figures = os.path.join("crowdlabs_images",
+                                       "vt_%s_%s" %(vtid, out_type))
+        log(path_to_figures)
+        result, latex = download_tree(urlcrowdlabs, vtid,
+                                          path_to_figures, pdf, build_always)
+        
+else:
+    result, latex = (False, generate_latex_error("Invalid url %s." % urlcrowdlabs))
+    
+# the printed answer will be included inline by the latex compiler.
+print latex
+if result == True:
+    log("********** SESSION END ************")
+    log("***********************************")
+    sys.exit(0)
+else:
+    log("********** SESSION END ************")
+    log("***********************************")
+    sys.exit(1)
diff --git a/extensions/latex/includevistrail.py b/extensions/latex/includevistrail.py
new file mode 100755
index 0000000..ada8adf
--- /dev/null
+++ b/extensions/latex/includevistrail.py
@@ -0,0 +1,1503 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# the input file format should follow this:
+#   path=/Users/emanuele/code/vistrails/branches/v1.2/vistrails/run.py
+#   python=/path/to/python
+#   env=DYLD_LIBRARY_PATH= 
+#   download=http://url.from.where.download.vt.files
+#   host=vistrails.sci.utah.edu
+#   user=username
+#   db=vistrails
+#   filename=path_to_vtfile
+#   version=598
+#   vtid=8
+#   port=3306
+#   buildalways=true
+#   tag=Some text
+#   pdf=false
+#   workflow=false
+#   tree=false
+#   getvtl=false
+#   embedworkflow=false
+#   includefulltree=false
+#   other=width=0.45\linewidth 
+#
+# the buildalways and port lines are optional
+# at least a version or a tag must be provided
+# if filename is provided host, db, user and vtid are ignored
+# please notice that the tag has precedence over version. If a tag is passed
+# we will query the database to get the latest version number.
+
+import sys
+import os.path
+import os
+from httplib import HTTP
+from urlparse import urlparse
+import urllib2
+import re
+import logging
+import shlex
+import shutil
+import subprocess
+import platform
+
+systemType = platform.system()
+debug = True
+logger = None
+
+###############################################################################
+
+def log(msg):
+    global debug, logger
+    if debug:
+        logger.debug(msg)
+
+###############################################################################
+        
+def usage():
+    print "Usage: "
+    print "   %s path/to/options_file" % sys.argv[0]
+    sys.exit(1)
+
+###############################################################################
+    
+def bool_conv(x):
+    """bool_conv(x: str) -> bool
+    Converts a string to boolean.
+    
+    """
+    s = str(x).upper()
+    if s == 'TRUE':
+        return True
+    if s == 'FALSE':
+        return False
+
+###############################################################################
+
+def path_exists_and_not_empty(path):
+    """path_exists_and_not_empty(path:str) -> boolean 
+    Returns True if given path exists and it's not empty, otherwise returns 
+    False.
+    
+    """
+    if os.path.exists(path):
+        for root, dirs, file_names in os.walk(path):
+            break
+        if len(file_names) > 0:
+            return True
+    return False
+
+###############################################################################
+
+def vtl_exists_in_folder(path):
+    """vtl_exists_in_folder(path:str) -> boolean 
+    Returns True if given path contains a *.vtl file, otherwise returns False.
+    
+    """
+    for dirpath, dirname,filenames in os.walk(path):
+        for f in filenames:
+            ext = os.path.splitext(f)[1]
+            if ext == ".vtl":
+                return True
+    return False
+
+###############################################################################
+
+def build_vtl_file(download_url, filename, version, tag, 
+                   execute, showspreadsheetonly, embedWorkflow=False,
+                   includeFullTree=False):
+    log("build_vtl_file")
+    try:
+        basename = os.path.splitext(os.path.basename(filename))[0]
+        if version != None:
+            basename += "_%s_%s_%s_%s"%(version,tag,showspreadsheetonly,execute)
+        basename += ".vtl"
+        vtl_filename = os.path.join(download_url, basename)
+        header = '<vtlink filename="%s" version="%s" execute="%s" showSpreadsheetOnly="%s" \
+forceDB="%s" tag="%s"/>'%(filename,#os.path.abspath(filename),
+              str(version),
+              str(execute),
+              str(showspreadsheetonly),
+              str(False),
+              str(tag))
+    except Exception, e:
+        log("Error: %s"%str(e))
+    log("will open %s"%vtl_filename)
+    log("vtlfile contents: %s"%header)
+    f = open(vtl_filename, "w")
+    f.write(header)
+    f.close()
+    return "run:"+ os.path.abspath(vtl_filename).replace("\\","/")
+
+###############################################################################
+
+def build_vtl_db(download_url, host, db_name, vt_id, version, port, tag, 
+                   execute, showspreadsheetonly, embedWorkflow=False, 
+                   includeFullTree=False):
+    """build_download_vtl_request(host: str, db_name:str, vt_id: str, version: str,
+                      port:str, tag: str, execute: bool,
+                      showspreadsheetonly: bool)  -> str  """
+    log("build_vtl_db")
+    try:
+        basename = "%s_%s_%s_%s_%s_%s_%s_%s_%s.vtl"%(host,
+                                               db_name,
+                                               port,
+                                               vt_id,
+                                               version,
+                                               execute,
+                                               embedWorkflow,
+                                               includeFullTree,
+                                               showspreadsheetonly)
+        vtl_filename = os.path.join(download_url, basename)
+        header = '<vtlink host="%s" database="%s" port="%s" vtid="%s" \
+version="%s" execute="%s" showSpreadsheetOnly="%s" forceDB="%s" />'%(
+              host,
+              db_name,
+              str(port),
+              str(vt_id),
+              str(version),
+              str(execute),
+              str(showspreadsheetonly),
+              str(True))
+    except Exception, e:
+        log("Error: %s"%str(e))
+    log("will open %s"%vtl_filename)
+    log("vtlfile contents: %s"%header)
+    f = open(vtl_filename, "w")
+    f.write(header)
+    f.close()
+    return "run:"+ os.path.abspath(vtl_filename)
+
+###############################################################################
+def download(url,filename, folder=None):
+    """download(url:string, filename: string) -> Boolean
+    Downloads a binary file from url to filename and returns True (success)
+    or False (failure)
+    
+    """
+    try:
+        furl = urllib2.urlopen(url)
+        if filename is None and folder is not None:
+            info = furl.info()
+            re_filename = re.compile('attachment;filename=(.*vtl)')
+            attach = info.dict['content-disposition']
+            filename = os.path.join(folder,
+                                    re_filename.match(attach).groups()[0])
+            
+        log("downloading file: " + filename)
+        f = file(filename,'wb')
+        f.write(furl.read())
+        f.close()
+        return True
+    except Exception, e:
+        log(str(e))
+        return False
+    
+###############################################################################        
+
+def download_as_text(url):
+    """download_as_text(url: string) -> string
+    Downloads a url as text. It will return None if it failed.
+    
+    """
+    try:
+        furl = urllib2.urlopen(url)
+        s = furl.read()
+        return s
+    except:
+        return None
+
+###############################################################################
+
+def build_download_vtl_request(download_url, host, db_name, vt_id, version, port, tag, 
+                   execute, showspreadsheetonly, embedWorkflow=False, 
+                   includeFullTree=False):
+    """build_download_vtl_request(host: str, db_name:str, vt_id: str, version: str,
+                      port:str, tag: str, execute: bool,
+                      showspreadsheetonly: bool)  -> str
+        This generates a piece of latex code containing the \href command and
+        a \includegraphics command for each image generated.
+    """
+    
+    url_params = "getvt=%s&db=%s&host=%s&port=%s&tag=%s&\
+execute=%s&showspreadsheetonly=%s&embedWorkflow=%s&includeFullTree=%s" % (vt_id,
+                                                    db_name,
+                                                    host,
+                                                    port,
+                                                    urllib2.quote(tag),
+                                                    execute,
+                                                    showspreadsheetonly,
+                                                    embedWorkflow,
+                                                    includeFullTree)
+    if version is not None:
+        url_params += "&version=%s"%urllib2.quote(version)
+    url_params = url_params.replace("%","\%")
+    url = "%s?%s"%(download_url, url_params)
+    
+    return url    
+
+###############################################################################
+
+def _download_content(url, request, path_to_figures):
+    """_download_images(url:string, request:string, path_to_figures:string) -> (Boolean, 
+                                                                message)
+    Downloads all images and pdf files listed in url and saves them to
+    path_to_figures
+    
+    """ 
+    website = url
+    url = request
+    try:
+        page = download_as_text(url)
+        # we will look for images and other files embedded in the html
+        re_imgs = re.compile('<img[^>]*/>')
+        re_src = re.compile('(.*src=")([^"]*)"')
+        re_a = re.compile('<a[^>]*>[^<]*</a>')
+        re_href = re.compile('(.*href=")([^"]*)"')
+        images = re_imgs.findall(page)
+        files = re_a.findall(page)
+        failed = False
+        msg = ''
+        if len(images) > 0 or len(files) > 0:
+            for i in images:
+                pngfile = re_src.match(i).groups()[1]
+                if not check_url(pngfile):
+                    img = website + pngfile
+                else:
+                    img = pngfile
+                    
+                if not download(img, os.path.join(path_to_figures,
+                                                  os.path.basename(img))):
+                    msg += "Error when downloading image: %s. <return>" %img
+                    failed = True
+                        
+            for f in files:
+                otherfile = re_href.match(f).groups()[1]
+                    
+                if not check_url(otherfile):
+                    filename = website + otherfile
+                else:
+                    filename = otherfile
+                    
+                if not download(filename, os.path.join(path_to_figures,
+                                os.path.basename(filename))):
+                    msg += "Error when downloading file: %s. <return>"%filename
+                    failed = True
+                        
+            if not failed :
+                return (True, "")
+            else:
+                return (False, msg)
+        else:
+            msg = "url: '%s' \n returned: %s" % (url,page.strip())
+            return (False, msg)
+            
+    except Exception, e:
+        return (False, str(e))
+    
+def build_vistrails_cmd_line_db(path_to_vistrails, path_to_python,
+                                env_for_vistrails, host, 
+                                db_name, db_user, vt_id, version, port, 
+                                path_to_figures, pdf=False, wgraph=False, 
+                                tree=False):
+    """ build_vistrails_cmd_line_db(path_to_vistrails: str, env_for_vistrails: str,
+                                     host: str, db_name: str, vt_id: str, 
+                                     version: str, path_to_figures: str,
+                                     pdf:bool, wgraph:bool, tree: bool) -> list
+        Build the command line to run vistrails with the given parameters.
+    """
+    #dump pdf
+    if pdf:
+        pdfoption = ["-p"]
+    else:
+        pdfoption = []
+    #user
+    if db_user is not None and db_user != "":
+        useroption = ['-u', '%s'%db_user]
+    else:
+        useroption = []
+    #dump tree and workflow graph
+    if wgraph:
+        graphoption = ['-G', '%s'%os.path.abspath(path_to_figures)]
+    elif tree:
+        graphoption = ['-U' ,'%s'%os.path.abspath(path_to_figures)]
+    else:
+        graphoption = ['-e', '%s'%os.path.abspath(path_to_figures)]
+    #don't select a workflow
+    if version is not None:
+        voption = ":%s"%version
+    else:
+        voption = ""
+        
+    prefix = ['%s'%path_to_vistrails]
+    if path_to_vistrails.endswith(".py"):
+        prefix = ['%s'%path_to_python,
+                  '%s'%path_to_vistrails]
+    cmd_line = prefix + ['-b'] + graphoption + ['-t', host, '-f',db_name] + \
+             useroption + ['-r', port] + pdfoption + [ '%s%s'%(vt_id, voption)]
+    return cmd_line
+
+###############################################################################
+
+def build_vistrails_cmd_line_file(path_to_vistrails, path_to_python,
+                                  env_for_vistrails, filename, 
+                                  version, path_to_figures, pdf=False, 
+                                  wgraph=False, tree=False):
+    """ build_vistrails_cmd_line_file(path_to_vistrails: str, 
+                                      env_for_vostrails: str, filename: str,
+                                      version: str, path_to_figures: str,
+                                      pdf:bool, wgraph:bool, tree: bool) -> str
+        Build the command line to run vistrails with the given parameters.
+    """
+    #dump pdf
+    if pdf:
+        pdfoption = ["-p"]
+    else:
+        pdfoption = []
+    #dump tree and workflow graph
+    if wgraph:
+        graphoption = ['-G','%s'%os.path.abspath(path_to_figures)]
+    elif tree:
+        graphoption = ['-U','%s'%os.path.abspath(path_to_figures)]
+    else:
+        graphoption = ['-e','%s'%os.path.abspath(path_to_figures)]
+    #don't select a workflow
+    if version is not None:
+        voption = ":%s"%version
+    else:
+        voption = ''
+    prefix = ['%s'%path_to_vistrails]
+    if path_to_vistrails.endswith(".py"):
+        prefix = ['%s'%path_to_python,
+                  '%s'%path_to_vistrails]
+    cmd_line = prefix + ['-b'] + graphoption + pdfoption + \
+               [ "%s%s"%(os.path.abspath(filename),voption)]
+                      
+    return cmd_line
+
+###############################################################################
+
+def generate_latex_db(is_local, download_url, host, db_name, vt_id, version, port, tag, 
+                      execute, showspreadsheetonly, path_to_figures, 
+                      graphics_options, embedWorkflow=False, 
+                      includeFullTree=False):
+    """generate_latex(host: str, db_name:str, vt_id: str, version: str,
+                      port:str, tag: str, execute: bool,
+                      showspreadsheetonly: bool, path_to_figures: str,
+                      graphics_options: str, embedWorkflow: bool, 
+                      includeFullTree:bool)  -> str
+        This generates a piece of latex code containing the \href command and
+        a \includegraphics command for each image generated.
+    """
+    if not is_local:
+        if download_url is not None and download_url != "":
+            url = build_download_vtl_request(download_url, host, db_name, vt_id, 
+                                             version, port, tag, execute, 
+                                             showspreadsheetonly, 
+                                             embedWorkflow=embedWorkflow,
+                                             includeFullTree=includeFullTree)
+            href = "\href{%s}{" % url
+    else:
+        if download_url is not None and download_url != "":
+            url = build_vtl_db(download_url, host, db_name, vt_id, 
+                            version, port, tag, execute, 
+                            showspreadsheetonly, embedWorkflow=embedWorkflow,
+                            includeFullTree=includeFullTree)
+            href = "\href{%s}{" % url
+    ALLOWED_GRAPHICS = [".png", ".jpg", ".pdf"]
+    images = []
+    for root, dirs, file_names in os.walk(path_to_figures):
+        for f in file_names:
+            ext = os.path.splitext(f)[1]
+            if ext in ALLOWED_GRAPHICS:
+                images.append(f)
+        break
+    n = len(images)
+    s = ''
+    
+    for f in images:
+        filename = os.path.join(path_to_figures,f).replace("%","\%")
+        if graphics_options:
+            s += "\includegraphics[%s]{%s}\n" % (graphics_options, filename.replace("\\","/"))
+        else:
+            s += "\includegraphics{%s}\n" % filename.replace("\\","/")
+    
+    if download_url is not None and download_url != "":
+        return href + s + "}"
+    else:
+        return s
+
+###############################################################################
+
+def generate_latex_file(download_url, vtfile, version, tag, 
+                      execute, showspreadsheetonly, path_to_figures, 
+                      graphics_options,embedWorkflow=False, 
+                      includeFullTree=False):
+    """generate_latex(host: str, db_name:str, vt_id: str, version: str,
+                      port:str, tag: str, execute: bool,
+                      showspreadsheetonly: bool, path_to_figures: str,
+                      graphics_options: str)  -> str
+        This generates a piece of latex code containing the \href command and
+        a \includegraphics command for each image generated.
+    """
+    log("generate_latex_file")
+    if download_url is not None and download_url != "":
+        url = build_vtl_file(download_url, vtfile, version, tag, execute, 
+                             showspreadsheetonly, embedWorkflow=False)
+        href = "\href{%s}{" % url
+        log(url)
+    ALLOWED_GRAPHICS = [".png", ".jpg", ".pdf"]
+    images = []
+    for root, dirs, file_names in os.walk(path_to_figures):
+        for f in file_names:
+            ext = os.path.splitext(f)[1]
+            if ext in ALLOWED_GRAPHICS:
+                images.append(f)
+        break
+    n = len(images)
+    s = ''
+    for f in images:
+        filename = os.path.join(path_to_figures,f).replace("%","\%")
+        if graphics_options:
+            s += "\includegraphics[%s]{%s}\n" % (graphics_options, filename.replace("\\","/"))
+        else:
+            s += "\includegraphics{%s}\n" % filename.replace("\\","/")
+    
+    if download_url is not None and download_url != "":
+        return href + s + "}"
+    else:
+        return s
+
+###############################################################################
+
+def generate_latex_error(error_msg):
+    """ generate_latex_error(error_msg: str) -> str
+        this generates a piece of latex code with an error message.
+    """
+    error_msg = error_msg.replace("\n", "\\MessageBreak ")
+    s = """\\PackageError{vistrails}{ An error occurred when executing vistrails. \\MessageBreak
+%s
+}{}""" % error_msg
+    return s
+
+###############################################################################
+
+def run_vistrails_locally_db(path_to_vistrails, path_to_python, 
+                             env_for_vistrails, host, db_name, 
+                             db_user, vt_id,
+                             version, port, path_to_figures, build_always=False,
+                             tag='', execute=False, showspreadsheetonly=False,
+                             pdf=False, embedWorkflow=False, 
+                             includeFullTree=False):
+    """run_vistrails_locally_db(path_to_vistrails: str, host: str,
+                             db_name: str, vt_id: str, version: str, port: str,
+                             path_to_figures: str) -> tuple(bool, str)
+        Run vistrails and returns a tuple containing a boolean saying if it was
+        successful or not and the latex code.
+    """
+    v = version
+    if tag != '':
+        v = tag
+    cmd_line = build_vistrails_cmd_line_db(path_to_vistrails, path_to_python,
+                                           env_for_vistrails, 
+                                           host, db_name, db_user, vt_id,
+                                           v, port, path_to_figures, pdf)
+    log("run_vistrails_locally_db")
+    log("cmdline: %s"%cmd_line)
+
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not os.path.exists(path_to_figures):
+        os.makedirs(path_to_figures)
+        
+    if build_always or not path_exists_and_not_empty(path_to_figures):
+        my_env = os.environ
+        sep = ":"
+        if systemType in ["Windows", "Microsoft"]:
+            sep = ";"
+        if env_for_vistrails != '':
+            data = shlex.split(env_for_vistrails)
+            for d in data:
+                (name,val) = d.split("=")
+                pos = val.find("$"+name)
+                if pos != -1:
+                    if pos == 0:
+                        my_env[name] = my_env.get(name,'') + \
+                                       val[pos+len(name)+1:]
+                    else:
+                        if pos + len(name) == len(val) -1:
+                            my_env[name] = val[0:pos] + my_env.get(name,'')
+                        else:
+                            my_env[name] = val[0:pos] + my_env.get(name,'') + \
+                                           val[pos+len(name)+1:]
+                else:
+                    my_env[name] = val
+        log("env: %s"%my_env)
+        if systemType in ['Windows', 'Microsoft']:
+            proc = subprocess.Popen(cmd_line,
+                                    env=my_env)
+        else:
+            proc = subprocess.Popen(cmd_line, shell=False,
+                                    env=my_env,
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT,
+                                    close_fds=True)
+        proc.wait()
+        log("result: %s"%proc.returncode)
+        if proc.stdout:
+            lines = proc.stdout.readlines()
+            log("stdout: %s"%lines)
+        if proc.returncode != 0:
+            shutil.rmtree(path_to_figures)
+            msg = "See vistrails.log for more information."
+            return (False, generate_latex_error(msg))
+        
+    return (True, generate_latex_db(True,os.getcwd(), host, db_name, vt_id, version, port, tag,
+                                    execute, showspreadsheetonly, 
+                                    path_to_figures, graphics_options, 
+                                    embedWorkflow, includeFullTree))
+
+###############################################################################
+
+def run_vistrails_locally_file(path_to_vistrails, path_to_python,
+                               env_for_vistrails, filename, 
+                               version, path_to_figures, build_always=False,
+                               tag='', execute=False, showspreadsheetonly=False,
+                               pdf=False, embedWorkflow=False, 
+                               includeFullTree=False):
+    """run_vistrails_locally_file(path_to_vistrails: str, filename: str,
+                                  version: str, path_to_figures: str,
+                                  build_always:bool, tag:str, execute:bool,
+                                  showspreadsheetonly:bool, pdf:bool) -> 
+                                                               tuple(bool, str)
+        Run vistrails and returns a tuple containing a boolean saying if it was
+        successful or not and the latex code.
+    """
+    v = version
+    if tag != '':
+        v = tag
+    cmd_line = build_vistrails_cmd_line_file(path_to_vistrails, path_to_python, 
+                                             env_for_vistrails,
+                                             filename, v, path_to_figures, 
+                                             pdf)
+    log("run_vistrails_locally_file")
+    log("cmdline: %s"%cmd_line)
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not os.path.exists(path_to_figures):
+        log("creating image path")
+        os.makedirs(path_to_figures)
+                
+    if build_always or not path_exists_and_not_empty(path_to_figures):
+        my_env = os.environ
+        sep = ":"
+        if systemType in ["Windows", "Microsoft"]:
+            sep = ";"
+        if env_for_vistrails != '':
+            data = shlex.split(env_for_vistrails)
+            log("env_for_vistrails: %s"%data)
+            for d in data:
+                (name,val) = d.split("=")
+                pos = val.find("$"+name)
+                if pos != -1:
+                    if pos == 0:
+                        my_env[name] = my_env.get(name,'') + \
+                                       val[pos+len(name)+1:]
+                    else:
+                        if pos + len(name) == len(val) -1:
+                            my_env[name] = val[0:pos] + my_env.get(name,'')
+                        else:
+                            my_env[name] = val[0:pos] + my_env.get(name,'') + \
+                                           val[pos+len(name)+1:]
+                else:
+                    my_env[name] = val
+        log("env: %s"%my_env)
+        if systemType in ['Windows', 'Microsoft']:
+            proc = subprocess.Popen(cmd_line,
+                                    env=my_env,
+                                    stdout=subprocess.PIPE)
+        else:
+            proc = subprocess.Popen(cmd_line, shell=False,
+                                    env=my_env,
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT,
+                                    close_fds=True)
+        proc.wait()
+        log("result: %s"%proc.returncode)
+        if proc.stdout:
+            lines = proc.stdout.readlines()
+            log("stdout: %s"%lines)
+        if proc.returncode != 0:
+            shutil.rmtree(path_to_figures)
+            msg = "See vistrails.log for more information."
+            return (False, generate_latex_error(msg))
+    log("will generate latex")
+    try:
+        return (True, generate_latex_file(os.path.dirname(os.path.abspath(filename)), 
+                                      filename, version, tag,
+                                      execute, showspreadsheetonly,
+                                      path_to_figures, graphics_options,
+                                      embedWorkflow, includeFullTree))
+    except Exception, e:
+        log("Error: %s"%str(e))
+###############################################################################
+
+def get_vt_graph_locally_db(path_to_vistrails, path_to_python,
+                            env_for_vistrails, host, db_name,
+                            db_user, vt_id, port, path_to_figures, 
+                            build_always=False, pdf=False,
+                            embedWorkflow=False, includeFullTree=False):
+    """get_vt_graph_locally_db(path_to_vistrails: str, host: str,
+                             db_name: str, vt_id: str, port: str,
+                             path_to_figures: str, build_always: bool,
+                             pdf:bool) -> tuple(bool, str)
+        Run vistrails for loading a vistrail and dump the tree to a file and 
+        returns a tuple containing a boolean saying if it was
+        successful or not and the latex code.
+    """
+    cmd_line = build_vistrails_cmd_line_db(path_to_vistrails, path_to_python,
+                                           env_for_vistrails, 
+                                           host, db_name, db_user, vt_id,
+                                           None, port, path_to_figures, pdf, False,
+                                           True)
+    log("get_vt_graph_locally_db")
+    log("cmdline: %s"%cmd_line)
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not os.path.exists(path_to_figures):
+        os.makedirs(path_to_figures)
+    
+    if build_always or not path_exists_and_not_empty(path_to_figures):
+        my_env = os.environ
+        sep = ":"
+        if systemType in ["Windows", "Microsoft"]:
+            sep = ";"
+        if env_for_vistrails != '':
+            data = shlex.split(env_for_vistrails)
+            for d in data:
+                (name,val) = d.split("=")
+                pos = val.find("$"+name)
+                if pos != -1:
+                    if pos == 0:
+                        my_env[name] = my_env.get(name,'') + \
+                                       val[pos+len(name)+1:]
+                    else:
+                        if pos + len(name) == len(val) -1:
+                            my_env[name] = val[0:pos] + my_env.get(name,'')
+                        else:
+                            my_env[name] = val[0:pos] + my_env.get(name,'') + \
+                                           val[pos+len(name)+1:]
+                else:
+                    my_env[name] = val
+        log("env: %s"%my_env)        
+        if systemType in ['Windows', 'Microsoft']:
+            proc = subprocess.Popen(cmd_line,
+                                    env=my_env,
+                                    stdout=subprocess.PIPE)
+        else:
+            proc = subprocess.Popen(cmd_line, shell=False,
+                                    env=my_env,
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT,
+                                    close_fds=True)
+        proc.wait()
+        log("result: %s"%proc.returncode)
+        if proc.stdout:
+            lines = proc.stdout.readlines()
+            log("stdout: %s"%lines)
+        if proc.returncode != 0:
+            os.rmdir(path_to_figures)
+            msg = "See vistrails.log for more information."
+            return (False, generate_latex_error(msg))
+
+    return (True, generate_latex_db(True, os.getcwd(), host, db_name, vt_id, None, port, '',
+                                 False, False,
+                                 path_to_figures, graphics_options,
+                                 embedWorkflow, includeFullTree))
+
+###############################################################################
+
+def get_vt_graph_locally_file(path_to_vistrails, path_to_python,
+                              env_for_vistrails, filename,
+                              path_to_figures, build_always=False, pdf=False,
+                              embedWorkflow=False, includeFullTree=False):
+    """get_vt_graph_locally_file(path_to_vistrails: str, env_for_vistrails: str,
+                                 filename: str, version: str, 
+                                 path_to_figures: str,build_always: bool,
+                                 pdf:bool) -> tuple(bool, str)
+        Run VisTrails to load a workflow and dump the graph to a file and 
+        returns a tuple containing a boolean saying whether it was
+        successful and the latex code.
+    """
+    cmd_line = build_vistrails_cmd_line_file(path_to_vistrails, 
+                                             path_to_python,
+                                             env_for_vistrails, 
+                                             filename, None, path_to_figures, 
+                                             pdf, False, True)
+    log("get_vt_graph_locally_file")
+    log("cmdline: %s"%cmd_line)
+    
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not os.path.exists(path_to_figures):
+        log("  creating images folder")
+        os.makedirs(path_to_figures)
+        
+    if build_always or not path_exists_and_not_empty(path_to_figures):
+        log("  folder was empty or forcing execution")
+        my_env = os.environ
+        sep = ":"
+        if systemType in ["Windows", "Microsoft"]:
+            sep = ";"
+        if env_for_vistrails != '':
+            data = shlex.split(env_for_vistrails)
+            for d in data:
+                (name,val) = d.split("=")
+                pos = val.find("$"+name)
+                if pos != -1:
+                    if pos == 0:
+                        my_env[name] = my_env.get(name,'') + \
+                                       val[pos+len(name)+1:]
+                    else:
+                        if pos + len(name) == len(val) -1:
+                            my_env[name] = val[0:pos] + my_env.get(name,'')
+                        else:
+                            my_env[name] = val[0:pos] + my_env.get(name,'') + \
+                                           val[pos+len(name)+1:]
+                else:
+                    my_env[name] = val
+        log("env: %s"%my_env)
+        if systemType in ['Windows', 'Microsoft']:
+            proc = subprocess.Popen(cmd_line,
+                                    env=my_env,
+                                    stdout=subprocess.PIPE)
+        else:
+            proc = subprocess.Popen(cmd_line, shell=False,
+                                    env=my_env,
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT,
+                                    close_fds=True)
+        proc.wait()
+        log("result: %s"%proc.returncode)
+        if proc.stdout:
+            lines = proc.stdout.readlines()
+            log("stdout: %s"%lines)
+        if proc.returncode != 0:
+            os.rmdir(path_to_figures)
+            msg = "See vistrails.log and vistrails_run.log for more information."
+            return (False, generate_latex_error(msg))
+    else:
+        log("  found cached images")
+        
+    return (True, generate_latex_file(os.path.dirname(os.path.abspath(filename)), 
+                                      filename, None, '', False, 
+                                      False, path_to_figures, 
+                                      graphics_options, embedWorkflow, 
+                                      includeFullTree))    
+
+###############################################################################    
+
+def get_wf_graph_locally_db(path_to_vistrails, path_to_python,
+                            env_for_vistrails, host, db_name,
+                            db_user, vt_id, version, port, path_to_figures, 
+                            build_always=False, tag='', pdf=False,
+                            embedWorkflow=False, includeFullTree=False):
+    """get_wf_graph_locally_db(path_to_vistrails: str, host: str,
+                             db_name: str, vt_id: str, version: str, port: str,
+                             path_to_figures: str,build_always: bool,
+                             tag: str, pdf:bool) -> tuple(bool, str)
+        Run vistrails for loading a workflow and dump the graph to a file and 
+        returns a tuple containing a boolean saying if it was
+        successful or not and the latex code.
+    """
+    v = version
+    if tag != '':
+        v = tag
+    cmd_line = build_vistrails_cmd_line_db(path_to_vistrails, 
+                                           path_to_python, env_for_vistrails, 
+                                           host, db_name, db_user, vt_id,
+                                           v, port, path_to_figures, pdf, 
+                                           True, False)
+    log("get_wf_graph_locally_db")
+    log("cmdline: %s"%cmd_line)
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not os.path.exists(path_to_figures):
+        log("  creating images folder")
+        os.makedirs(path_to_figures)
+        
+    if build_always or not path_exists_and_not_empty(path_to_figures):
+        log("  folder was empty or forcing execution")
+        my_env = os.environ
+        sep = ":"
+        if systemType in ["Windows", "Microsoft"]:
+            sep = ";"
+        if env_for_vistrails != '':
+            data = shlex.split(env_for_vistrails)
+            for d in data:
+                (name,val) = d.split("=")
+                pos = val.find("$"+name)
+                if pos != -1:
+                    if pos == 0:
+                        my_env[name] = my_env.get(name,'') + \
+                                       val[pos+len(name)+1:]
+                    else:
+                        if pos + len(name) == len(val) -1:
+                            my_env[name] = val[0:pos] + my_env.get(name,'')
+                        else:
+                            my_env[name] = val[0:pos] + my_env.get(name,'') + \
+                                           val[pos+len(name)+1:]
+                else:
+                    my_env[name] = val
+        log("env: %s"%my_env)
+        if systemType in ['Windows', 'Microsoft']:
+            log("env: %s"%my_env)
+            proc = subprocess.Popen(cmd_line,
+                                    env=my_env,
+                                    stdout=subprocess.PIPE)
+        else:
+            proc = subprocess.Popen(cmd_line, shell=False,
+                                    env=my_env,
+                                    stdin=subprocess.PIPE,    
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT,
+                                    close_fds=True)
+        proc.wait()
+        log("result: %s"%proc.returncode)
+        if proc.stdout:
+            lines = proc.stdout.readlines()
+            log("stdout: %s"%lines)
+        if proc.returncode != 0:
+            os.rmdir(path_to_figures)
+            msg = "See vistrails.log for more information."
+            return (False, generate_latex_error(msg))
+    else:
+        log("  found cached images")
+        
+    return (True, generate_latex_db(True, os.getcwd(), host, db_name, vt_id, version, 
+                                    port, tag, execute, showspreadsheetonly,
+                                    path_to_figures, graphics_options,
+                                    embedWorkflow, includeFullTree))
+
+###############################################################################
+
+def get_wf_graph_locally_file(path_to_vistrails, path_to_python,
+                              env_for_vistrails, filename,
+                              version, path_to_figures, build_always=False,
+                              tag='', pdf=False, embedWorkflow=False, 
+                              includeFullTree=False):
+    """get_wf_graph_locally_file(path_to_vistrails: str, env_for_vistrails: str,
+                                 filename: str, version: str, 
+                             path_to_figures: str,build_always: bool,
+                             tag: str, pdf:bool) -> tuple(bool, str)
+        Run VisTrails to load a workflow and dump the graph to a file and 
+        returns a tuple containing a boolean saying whether it was
+        successful and the latex code.
+    """
+    v = version
+    if tag != '':
+        v = tag
+    cmd_line = build_vistrails_cmd_line_file(path_to_vistrails, path_to_python,
+                                             env_for_vistrails, 
+                                             filename, v, path_to_figures, 
+                                             pdf, True, False)
+    log("get_wf_graph_locally_file")
+    log("cmdline: %s"%cmd_line)
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not os.path.exists(path_to_figures):
+        log("  creating images folder")
+        os.makedirs(path_to_figures)
+        
+    if build_always or not path_exists_and_not_empty(path_to_figures):
+        log("  folder was empty or forcing execution")
+        my_env = os.environ
+        sep = ":"
+        if systemType in ["Windows", "Microsoft"]:
+            sep = ";"
+        if env_for_vistrails != '':
+            data = shlex.split(env_for_vistrails)
+            for d in data:
+                (name,val) = d.split("=")
+                pos = val.find("$"+name)
+                if pos != -1:
+                    if pos == 0:
+                        my_env[name] = my_env.get(name,'') + \
+                                       val[pos+len(name)+1:]
+                    else:
+                        if pos + len(name) == len(val) -1:
+                            my_env[name] = val[0:pos] + my_env.get(name,'')
+                        else:
+                            my_env[name] = val[0:pos] + my_env.get(name,'') + \
+                                           val[pos+len(name)+1:]
+                else:
+                    my_env[name] = val
+        log("env: %s"%my_env)
+        if systemType in ['Windows', 'Microsoft']:
+            proc = subprocess.Popen(cmd_line,
+                                    env=my_env,
+                                    stdout=subprocess.PIPE)
+        else:
+            proc = subprocess.Popen(cmd_line, shell=False,
+                                    env=my_env,
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT,
+                                    close_fds=True)
+        proc.wait()
+        log("result: %s"%proc.returncode)
+        if proc.stdout:
+            lines = proc.stdout.readlines()
+            log("stdout: %s"%lines)
+        if proc.returncode != 0:
+            os.rmdir(path_to_figures)
+            msg = "See vistrails.log for more information."
+            return (False, generate_latex_error(msg))
+    else:
+        log("  found cached images")
+    log("   about to return")    
+    return (True, generate_latex_file(os.path.dirname(os.path.abspath(filename)), 
+                                      filename, version, tag, execute, 
+                                      showspreadsheetonly, path_to_figures, 
+                                      graphics_options, embedWorkflow, 
+                                      includeFullTree))    
+
+###############################################################################
+
+def run_vistrails_remotely(path_to_vistrails, download_url, host, db_name, vt_id,
+                           version, port, path_to_figures, build_always=False,
+                           tag='', execute=False, showspreadsheetonly=False,
+                           pdf=False, embedWorkflow=False, 
+                           includeFullTree=False):
+    """run_vistrails_remotely(path_to_vistrails: str, download_url: str host: str,
+                              db_name: str, vt_id: str, version: str, port: str,
+                              path_to_figures: str, build_always: bool,
+                              tag:str, execute: bool, showspreadsheetonly: bool,
+                              pdf: bool, embedWorkflow:bool, 
+                              includeFullTree:bool)
+                                   -> tuple(bool, str)
+        Call vistrails remotely to execute a workflow and returns a tuple 
+        containing a boolean saying whether it was successful and the latex 
+        code.
+    """ 
+    log("run_vistrails_remotely")
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not path_exists_and_not_empty(path_to_figures) or build_always:
+        if not os.path.exists(path_to_figures):
+            os.makedirs(path_to_figures)
+        
+        if check_url(path_to_vistrails):
+            website = "://".join(urlparse(path_to_vistrails)[:2])
+            request = "?host=%s&db=%s&vt=%s&version=%s&port=%s&pdf=%s" % (host,
+                                                                   db_name,
+                                                                   vt_id,
+                                                                   urllib2.quote(version),
+                                                                   port,
+                                                                   pdf)
+            url = path_to_vistrails + request
+            log("will download from: " + url)
+            
+            (result, msg) = _download_content(website, url, path_to_figures)
+            if result == True:
+                log("success")
+                return (result, generate_latex_db(False, download_url, host, db_name, vt_id, 
+                                               version, port, tag, execute,
+                                               showspreadsheetonly,
+                                               path_to_figures, 
+                                               graphics_options,
+                                               embedWorkflow, includeFullTree))
+            else:
+                log("Error: " + msg)
+                return (result, generate_latex_error(msg))
+        else:
+            msg = "Invalid url: %s" % path_to_vistrails
+            log("Error: " + msg)
+            return (False, generate_latex_error(msg))
+    else:
+        log("using cached files")
+        return (True, generate_latex_db(False, download_url, host, db_name, vt_id, 
+                                     version, port, tag, execute, 
+                                     showspreadsheetonly,
+                                     path_to_figures, graphics_options,
+                                     embedWorkflow, includeFullTree))
+                
+###############################################################################
+
+def get_vt_graph_remotely(path_to_vistrails, download_url, host, db_name, vt_id,
+                          port, path_to_figures, build_always=False, pdf=False,
+                          embedWorkflow=False, includeFullTree=False):
+    """get_vt_graph_remotely(path_to_vistrails: str, download_url: str, host: str,
+                              db_name: str, vt_id: str, port: str,
+                              path_to_figures: str, build_always: bool, pdf: bool)
+                                   -> tuple(bool, str)
+        Get the version tree image of a vistrail and returns a tuple containing 
+        a boolean saying whether it was successful and the latex code.
+    """    
+    log("get_vt_graph_remotely")
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not path_exists_and_not_empty(path_to_figures) or build_always:
+        if not os.path.exists(path_to_figures):
+            os.makedirs(path_to_figures)
+        
+        if check_url(path_to_vistrails):
+            website = "://".join(urlparse(path_to_vistrails)[:2])
+            request = "?host=%s&db=%s&vt=%s&port=%s&pdf=%s&showtree=True" % (host,
+                                                                   db_name,
+                                                                   vt_id,
+                                                                   port,
+                                                                   pdf)
+            url = path_to_vistrails + request
+            log("will download from: " + url)
+            
+            (result, msg) = _download_content(website, url, path_to_figures)
+            if result == True:
+                log("success")
+                return (result, generate_latex_db(False, download_url, host, db_name, 
+                                                  vt_id, None, 
+                                                  port, '', False,
+                                                  False,
+                                                  path_to_figures, 
+                                                  graphics_options,
+                                                  embedWorkflow, includeFullTree))
+            else:
+                log("Error: " + msg)
+                return (result, generate_latex_error(msg))
+        else:
+            msg = "Invalid url: %s" % path_to_vistrails
+            log("Error: " + msg)
+            return (False, generate_latex_error(msg))
+    else:
+        log("using cached files")
+        return (True, generate_latex_db(False, download_url, host, db_name, vt_id, 
+                                     None, port, '', 
+                                     False, False,
+                                     path_to_figures, graphics_options,
+                                     embedWorkflow, includeFullTree))
+        
+###############################################################################
+
+def get_wf_graph_remotely(path_to_vistrails, download_url, host, db_name, vt_id,
+                           version, port, path_to_figures, build_always=False, 
+                           tag='', pdf=False, embedWorkflow=False, 
+                           includeFullTree=False):
+    """get_wf_graph_remotely(path_to_vistrails: str, download_url:str, host: str,
+                              db_name: str, vt_id: str, version: str, port: str,
+                              path_to_figures: str, build_always: bool, 
+                              tag:str, pdf: bool) -> tuple(bool, str)
+        Get the graph of a workflow and returns a tuple containing a boolean 
+        saying whether it was successful and the latex code.
+    """
+    log("get_wf_graph_remotely") 
+    
+    if build_always:
+        #force to remove the folder so we avoid stale results
+        if os.path.exists(path_to_figures):
+            shutil.rmtree(path_to_figures)
+            
+    if not path_exists_and_not_empty(path_to_figures) or build_always:
+        if not os.path.exists(path_to_figures):
+            os.makedirs(path_to_figures)
+        
+        if check_url(path_to_vistrails):
+            website = "://".join(urlparse(path_to_vistrails)[:2])
+            request = "?host=%s&db=%s&vt=%s&version=%s&port=%s&pdf=%s&showworkflow=True" % (host,
+                                                                   db_name,
+                                                                   vt_id,
+                                                                   urllib2.quote(version),
+                                                                   port,
+                                                                   pdf)
+            url = path_to_vistrails + request
+            log("will download from: " + url)
+            
+            (result, msg) = _download_content(website, url, path_to_figures)
+            if result == True:
+                log("success")
+                return (result, generate_latex_db(False, download_url, host, db_name, 
+                                               vt_id, version, 
+                                               port, tag, False,
+                                               False,
+                                               path_to_figures, 
+                                               graphics_options,
+                                               embedWorkflow, includeFullTree))
+            else:
+                log("Error: " + msg)
+                return (result, generate_latex_error(msg))
+        else:
+            msg = "Invalid url: %s" % path_to_vistrails
+            log("Error: " + msg)
+            return (False, generate_latex_error(msg))
+    else:
+        log("using cached files")
+        return (True, generate_latex_db(False, download_url, host, db_name, vt_id, 
+                                     version, port, tag, 
+                                     False, False,
+                                     path_to_figures, graphics_options,
+                                     embedWorkflow, includeFullTree))
+            
+###############################################################################
+
+def check_path(path):
+    """check_path(path:str) -> bool
+    Checks if it's a valid system path.
+    If path is valid, we will update it to be a realpath.
+    
+    """
+    result = False
+    new_path = os.path.realpath(path)
+    if os.path.isfile(new_path):
+        path = new_path
+        result = True
+    else:
+        result = False
+    return result
+
+###############################################################################
+
+def check_url(url):
+        try:
+            p = urlparse(url)
+            h = HTTP(p[1])
+            h.putrequest('HEAD', p[2])
+            h.endheaders()
+            if h.getreply()[0] == 200:
+                return True
+            else:
+                return False
+        except Exception, e:
+            log(str(e))
+            return False
+
+###############################################################################
+
+options_file = None
+try:
+    options_file = open(sys.argv[1])
+except IndexError:
+    usage()
+    
+if debug:
+    logger = logging.getLogger("VisTrailsLatex")
+    handler = logging.FileHandler('vistrails.log')
+    handler.setFormatter(logging.Formatter('VisTrailsLatex - %(asctime)s %(message)s'))
+    handler.setLevel(logging.DEBUG)
+    logger.setLevel(logging.DEBUG)
+    logger.addHandler(handler)
+    log("***********************************")
+    log("********* SESSION START ***********")
+    
+lines = options_file.readlines()
+path_to_vistrails = None
+path_to_python = None
+download_url = None
+env_for_vistrails = None
+host = None
+db_name = None
+db_user = None
+vt_id = None
+filename = None
+version = None
+graphics_options = None
+build_always = False
+port = '3306'
+version_tag = ''
+showspreadsheetonly = False
+execute = False
+pdf = False
+wgraph = False
+tree = False
+getvtl = False
+embedWorkflow=False
+includeFullTree=False
+for line in lines:
+    args = line.split("=")
+    if len(args) > 2:
+        args[1] = "=".join(args[1:])
+    if args[0] == "path":
+        path_to_vistrails = args[1].strip(" \n")
+    elif args[0] == "python":
+        path_to_python = args[1].strip(" \n")
+    elif args[0] == "env":
+        env_for_vistrails = args[1].strip(" \n")
+    elif args[0] == "download":
+        download_url = args[1].strip(" \n")
+    elif args[0] == "host":
+        host = args[1].strip(" \n")
+    elif args[0] == "db":
+        db_name = args[1].strip(" \n")
+    elif args[0] == "user":
+        db_user = args[1].strip(" \n")
+    elif args[0] == "vtid":
+        vt_id = args[1].strip(" \n")
+    elif args[0] == "filename":
+        filename = args[1].strip(" \n")
+    elif args[0] == "version":
+        version = args[1].strip(" \n")
+    elif args[0] == "port":
+        port = args[1].strip(" \n")
+    elif args[0] == "buildalways":
+        build_always = bool_conv(args[1].strip(" \n"))
+    elif args[0] == "tag":
+        version_tag = args[1].strip(" \n")
+    elif args[0] == "execute":
+        execute = bool_conv(args[1].strip(" \n"))
+    elif args[0] == "showspreadsheetonly":
+        showspreadsheetonly = bool_conv(args[1].strip(" \n"))
+    elif args[0] == 'pdf':
+        pdf = bool_conv(args[1].strip(" \n"))
+    elif args[0] == 'workflow':
+        wgraph = bool_conv(args[1].strip(" \n"))
+    elif args[0] == 'tree':
+        tree = bool_conv(args[1].strip(" \n"))
+    elif args[0] == 'getvtl':
+        getvtl = bool_conv(args[1].strip(" \n"))
+    elif args[0] == 'embedworkflow':
+        embedWorkflow = bool_conv(args[1].strip(" \n"))
+    elif args[0] == 'includefulltree':
+        includeFullTree = bool_conv(args[1].strip(" \n"))
+    elif args[0] == "other":
+        graphics_options = args[1].strip(" \n")
+
+if showspreadsheetonly:
+    execute = True
+# then we use the combination host_db_name_port_vt_id_version or
+# filename_version to create a unique folder.
+
+# TODO: Maybe we should use a hash of this. For now let's keep it
+# legible.
+out_type = "png"
+if pdf:
+    out_type = 'pdf'
+if filename is not None:
+    path_to_figures = os.path.join("vistrails_images",
+                                   "%s_%s_%s" % (filename,
+                                                 version,
+                                                 out_type))
+    if tree:
+        #no need to encode version
+        path_to_figures = os.path.join("vistrails_images",
+                                       "%s_%s" % (filename, out_type))
+    elif wgraph:
+        path_to_figures = os.path.join("vistrails_images",
+                                       "%s_%s_%s_graph" % (filename,
+                                                           version,
+                                                           out_type)) 
+else:
+    path_to_figures = os.path.join("vistrails_images",
+                               "%s_%s_%s_%s_%s_%s" % (host, db_name, port,
+                                                   vt_id,
+                                                   version,
+                                                   out_type))    
+    if tree:
+        #no need to encode version
+        path_to_figures = os.path.join("vistrails_images",
+                                       "%s_%s_%s_%s_%s" % (host, db_name, port,
+                                                           vt_id,
+                                                           out_type)) 
+    elif wgraph:
+        path_to_figures = os.path.join("vistrails_images",
+                                       "%s_%s_%s_%s_%s_%s_graph" % (host, db_name, port,
+                                                                    vt_id,
+                                                                    version,
+                                                                    out_type))    
+# if the path_to_vistrails point to a file that exists on disk, we will use
+# it, else let's assume it's a url (we still check if the url is valid inside
+# the run_vistrails_remotely function)
+log("path_to_figures: %s"%path_to_figures)
+if check_path(path_to_vistrails) and filename is None: #run locally
+    if tree:
+        # we don't need to actually run the workflow, we just get the
+        # tree
+        log("will run get_vt_graph_locally_db")
+        result, latex = get_vt_graph_locally_db(path_to_vistrails,
+                                                path_to_python,
+                                                env_for_vistrails, host, db_name,
+                                                db_user,
+                                                vt_id, port, path_to_figures,
+                                                build_always, pdf, embedWorkflow,
+                                                includeFullTree)
+    elif wgraph:
+        # we don't need to actually run the workflow, we just get the
+        # workflow graph
+        log("will run get_wf_graph_locally_db")
+        result, latex = get_wf_graph_locally_db(path_to_vistrails,
+                                                path_to_python,
+                                                env_for_vistrails, host, db_name,
+                                                db_user,
+                                                vt_id, version, port, path_to_figures,
+                                                build_always, version_tag, pdf,
+                                                embedWorkflow, includeFullTree)
+    else:    
+        result, latex = run_vistrails_locally_db(path_to_vistrails,
+                                                 path_to_python,
+                                                 env_for_vistrails, host, db_name,
+                                                 db_user,
+                                                 vt_id, version, port, path_to_figures,
+                                                 build_always, version_tag, execute,
+                                                 showspreadsheetonly, pdf,
+                                                 embedWorkflow, includeFullTree)
+elif check_path(path_to_vistrails) and filename is not None: #run locally
+    if tree:
+        # we don't need to actually run the workflow, we just get the
+        # tree
+        result, latex = get_vt_graph_locally_file(path_to_vistrails,
+                                                  path_to_python,
+                                                  env_for_vistrails, filename,
+                                                  path_to_figures,
+                                                  build_always, pdf,
+                                                  embedWorkflow, includeFullTree)
+    elif wgraph:
+        # we don't need to actually run the workflow, we just get the
+        # workflow graph
+        log("will run get_wf_graph_locally_file")
+        result, latex = get_wf_graph_locally_file(path_to_vistrails,
+                                                  path_to_python,
+                                                  env_for_vistrails, filename,
+                                                  version, path_to_figures,
+                                                  build_always, version_tag, pdf,
+                                                  embedWorkflow, includeFullTree)
+    else:    
+        result, latex = run_vistrails_locally_file(path_to_vistrails,
+                                                   path_to_python,
+                                                   env_for_vistrails, filename,
+                                                   version, path_to_figures,
+                                                   build_always, version_tag, 
+                                                   execute, showspreadsheetonly,
+                                                   pdf,embedWorkflow, 
+                                                   includeFullTree)
+elif (not build_always or
+      (build_always and check_url(path_to_vistrails))): #run from the web
+    if tree:
+        result, latex = get_vt_graph_remotely(path_to_vistrails, download_url,
+                                              host, db_name,
+                                              vt_id, port, path_to_figures,
+                                              build_always, pdf, embedWorkflow,
+                                              includeFullTree)
+    elif wgraph:
+        result, latex = get_wf_graph_remotely(path_to_vistrails, download_url,
+                                              host, db_name,
+                                              vt_id, version, port, path_to_figures,
+                                              build_always,version_tag, pdf,
+                                              embedWorkflow, includeFullTree)
+    else:
+        result, latex = run_vistrails_remotely(path_to_vistrails, download_url,
+                                               host, db_name,
+                                               vt_id, version, port, path_to_figures,
+                                               build_always, version_tag, execute,
+                                               showspreadsheetonly,pdf,
+                                               embedWorkflow, includeFullTree)
+    #download vtl file
+    if getvtl:
+        if (not build_always and not vtl_exists_in_folder(path_to_figures) or
+            build_always):
+                url = build_download_vtl_request(download_url, host, db_name, 
+                                                 vt_id, version, port, version_tag, 
+                                                 execute, showspreadsheetonly, 
+                                                 embedWorkflow=embedWorkflow, 
+                                                 includeFullTree=includeFullTree)
+                log("get_vtl %s"%url)
+                if download(url, filename=None, folder=path_to_figures) == False:
+                    log("Error when downloading vtl to %s"%path_to_figures)
+        
+                
+else:
+    result, latex = (False, 
+                     generate_latex_error("It is possible that %s is not a valid \
+url nor a valid path to vistrails/run.py or that you don't have an internet connection \
+and some workflows have the buildalways option. If you already have cached files, \
+try removing the buildalways option from vistrails latex command" %\
+                     (path_to_vistrails)))
+    
+# the printed answer will be included inline by the latex compiler.
+print latex
+if result == True:
+    # we will also create a temporary file that can be used to include the
+    # images directly
+    if not os.path.isdir('cached'):
+        if os.path.exists('cached'):
+            print generate_latex_error("cached exists and it is not a folder")
+            sys.exit(1)
+        else:
+            os.mkdir('cached')
+    if tree:
+        texbasename = "%s_%s_%s_%s_%s.tex" % (host, db_name, port, vt_id,out_type)
+    elif wgraph:
+        texbasename = "%s_%s_%s_%s_%s_%s_graph.tex" % (host, db_name, port, vt_id,
+                                                    version, out_type)
+    else:
+        texbasename = "%s_%s_%s_%s_%s_%s.tex" % (host, db_name, port, vt_id, 
+                                              version, out_type)
+    texfilename = os.path.join('cached', texbasename)
+    texfile = open(texfilename, 'w')
+    texfile.write(latex)
+    texfile.close()
+    log("********** SESSION END ************")
+    log("***********************************")
+    sys.exit(0)
+else:
+    log("********** SESSION END ************")
+    log("***********************************")
+    sys.exit(1)
diff --git a/extensions/latex/vistrails.sty b/extensions/latex/vistrails.sty
new file mode 100644
index 0000000..174fe97
--- /dev/null
+++ b/extensions/latex/vistrails.sty
@@ -0,0 +1,187 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Copyright (C) 2011-2014, NYU-Poly.
+%% Copyright (C) 2006-2011, University of Utah. 
+%% All rights reserved.
+%% Contact: contact at vistrails.org
+%%
+%% This file is part of VisTrails.
+%%
+%% "Redistribution and use in source and binary forms, with or without 
+%% modification, are permitted provided that the following conditions are met:
+%%
+%%  - Redistributions of source code must retain the above copyright notice, 
+%%    this list of conditions and the following disclaimer.
+%%  - Redistributions in binary form must reproduce the above copyright 
+%%    notice, this list of conditions and the following disclaimer in the 
+%%    documentation and/or other materials provided with the distribution.
+%%  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Note: shell-escape needs to be activated for this to work.
+%% This can either be done by passing -shell-escape as an option to
+%% latex or by adding/changing "shell_escape = t" in your texmf.cnf .
+
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesPackage{vistrails}[2011/02/10 v0.4 VisTrails in LaTeX]
+
+%% keyval package allows us to define arguments in a command as key-value pairs,
+%%  which is more convenient
+%% ifplatform for detecting which version of OS we are running on
+\RequirePackage{graphicx,keyval,ifthen,ifplatform}
+
+%% This is to hide the border of the included image
+\RequirePackage[pdfborder={0 0 0}]{hyperref}
+\hypersetup{extension=notused}
+
+%% we will generate a file for passing to python
+\newwrite\pythonincludein
+
+%% by default we will run vistrails on the web server
+\newcommand{\vistrailspath}{}
+
+%% environment configuration to be set before executing vistrails
+%% for example
+%% \newcommand{\vistrailsenv}{DYLD_LIBRARY_PATH= }
+\newcommand{\vistrailsenv}{}
+
+%% url for downloading the vistrails linked from the images
+%% leave it empty if you don't want to embed a link in the pdf
+\newcommand{\vistrailsdownload}{}
+
+%% full path to python or just python if it is on PATH
+\newcommand{\vistrailspythonpath}{python}
+
+%% this is for allowing line breaks, empty values in vistrails command's options
+\def\vistrail{\kernel at ifnextchar [{\@vistrail}{\@vistrail[]}}
+\def\@vistrail[#1]#2{%
+
+%% macros that will be used
+\def\vthost{vistrails.org}
+\def\vtdb{vistrails}
+\def\vtuser{}
+\def\vtfilename{}
+\def\vtvtid{}
+\def\vtversion{}
+\def\vttag{}
+\def\vtport{3306}
+\def\vtbuildalways{false}
+\def\vtexecute{false}
+\def\vtshowspreadsheetonly{false}
+\def\vtpdf{false}
+\def\vtworkflow{false}
+\def\vttree{false}
+\def\vtgetvtl{false}
+\def\vtembedworkflow{false}
+\def\vtincludefulltree{false}
+\newread\myinput
+%% We use '\jobname.python.temp' to store a unique file saying if python is present
+\ifwindows
+  \immediate\write18{find.cmd \vistrailspythonpath > \jobname.python.temp}
+\else
+  \immediate\write18{type -P "\vistrailspythonpath" > \jobname.python.temp}
+\fi
+\immediate\openin\myinput=\jobname.python.temp
+% The group localizes the change to \endlinechar
+\bgroup
+  \endlinechar=-1
+  \immediate\read\myinput to \localline
+  % Since everything in the group is local, we have to explicitly make the
+  % assignment global
+  \global\let\pythonexists\localline
+\egroup
+\immediate\closein\myinput
+% Clean up after ourselves
+\ifwindows
+  \immediate\write18{del \jobname.python.temp}
+\else
+  \immediate\write18{rm -f -- \jobname.python.temp}
+\fi
+\setkeys{vt}{#1}
+\ifthenelse{\equal{\vtpdf}{true}}{\def\vttype{pdf}}{\def\vttype{png}}
+\ifthenelse{\equal{\pythonexists}{}}{%
+  % python does not exist. Include images directly
+  \ifthenelse{\equal{\vttree}{true}}{%
+  % include version tree image
+    \immediate\input cached/\vthost\string_\vtdb\string_\vtport\string_\vtvtid\string_\vttype.tex
+   }
+   {% else test if don't include the workflow graph
+    \ifthenelse{\equal{\vtworkflow}{false}}{% 
+        \immediate\input cached/\vthost\string_\vtdb\string_\vtport\string_\vtvtid\string_\vtversion\string_\vttype.tex
+     }
+     {% else include workflow graph
+        \immediate\input cached/\vthost\string_\vtdb\string_\vtport\string_\vtvtid\string_\vtversion\string_\vttype\string_graph.tex
+    }
+   }
+  }
+ { %else prepare input file for includevistrail.py
+   \immediate\openout\pythonincludein=\jobname.cmdline
+    \immediate\write\pythonincludein{path=\vistrailspath}
+    \immediate\write\pythonincludein{python=\vistrailspythonpath}
+    \immediate\write\pythonincludein{env=\vistrailsenv}
+    \immediate\write\pythonincludein{download=\vistrailsdownload}
+    \ifthenelse{\equal{\vtfilename}{}}{%
+      \immediate\write\pythonincludein{host=\vthost}
+      \immediate\write\pythonincludein{db=\vtdb}
+      \immediate\write\pythonincludein{vtid=\vtvtid}
+      \immediate\write\pythonincludein{user=\vtuser}
+    }
+    {% else it's a filename
+      \immediate\write\pythonincludein{filename=\vtfilename}
+    }
+    \immediate\write\pythonincludein{version=\vtversion}
+    \immediate\write\pythonincludein{tag=\vttag}
+    \immediate\write\pythonincludein{port=\vtport}
+    \immediate\write\pythonincludein{buildalways=\vtbuildalways}
+    \immediate\write\pythonincludein{execute=\vtexecute}
+    \immediate\write\pythonincludein{showspreadsheetonly=\vtshowspreadsheetonly}
+    \immediate\write\pythonincludein{pdf=\vtpdf}
+    \immediate\write\pythonincludein{workflow=\vtworkflow}
+    \immediate\write\pythonincludein{tree=\vttree}
+    \immediate\write\pythonincludein{getvtl=\vtgetvtl}
+    \immediate\write\pythonincludein{embedworkflow=\vtembedworkflow}
+    \immediate\write\pythonincludein{includefulltree=\vtincludefulltree}
+    \ifx\@empty#2\@empty
+        \immediate\write\pythonincludein{other=}
+    \else
+        \immediate\write\pythonincludein{other=\string#2}
+    \fi
+    \immediate\closeout\pythonincludein
+    \immediate\write18{"\vistrailspythonpath" \space includevistrail.py \jobname.cmdline > \jobname.cmdline.tex 2> \jobname.cmdline.err}
+    \immediate\input\jobname.cmdline.tex
+}
+}
+%% key-value pairs for the command's options
+\define at key{vt}{host}[vistrails.org]{\def\vthost{#1}}
+\define at key{vt}{db}[vistrails]{\def\vtdb{#1}}
+\define at key{vt}{user}[vistrails]{\def\vtuser{#1}}
+\define at key{vt}{vtid}{\def\vtvtid{#1}}
+\define at key{vt}{filename}{\def\vtfilename{#1}}
+\define at key{vt}{version}{\def\vtversion{#1}}
+\define at key{vt}{tag}[]{\def\vttag{#1}}
+\define at key{vt}{port}[3306]{\def\vtport{#1}}
+\define at key{vt}{buildalways}[true]{\def\vtbuildalways{#1}}
+\define at key{vt}{execute}[true]{\def\vtexecute{#1}}
+\define at key{vt}{showspreadsheetonly}[true]{\def\vtshowspreadsheetonly{#1}}
+\define at key{vt}{pdf}[true]{\def\vtpdf{#1}}
+\define at key{vt}{showworkflow}[true]{\def\vtworkflow{#1}}
+\define at key{vt}{showtree}[true]{\def\vttree{#1}}
+\define at key{vt}{getvtl}[true]{\def\vtgetvtl{#1}}
+\define at key{vt}{embedworkflow}[true]{\def\vtembedworkflow{#1}}
+\define at key{vt}{includefulltree}[true]{\def\vtincludefulltree{#1}}
+
diff --git a/extensions/mediawiki/README b/extensions/mediawiki/README
new file mode 100644
index 0000000..cb69746
--- /dev/null
+++ b/extensions/mediawiki/README
@@ -0,0 +1,18 @@
+This folder contains files for adding vistrails to mediawiki.
+
+Just copy 
+  download.php
+  functions.php
+  vistrailsExtension.php 
+  ../http/config.php.sample
+
+to the wiki/extensions/  folder.
+
+Rename config.php.sample to config.php and modify the file according to your needs.
+
+An example of usage is in 
+
+http://www.vistrails.org/index.php/Viswiki
+
+
+
diff --git a/extensions/mediawiki/download.php b/extensions/mediawiki/download.php
new file mode 100644
index 0000000..210d339
--- /dev/null
+++ b/extensions/mediawiki/download.php
@@ -0,0 +1,138 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+require_once 'functions.php';
+require_once 'config.php';
+ 
+if (array_key_exists('getvt', $_GET)) {
+	
+    $host = $DB_HOST;
+    $port = $DB_PORT;
+    $dbname = $_GET["db"];
+    $vtid = $_GET["getvt"];
+    $version = $_GET["version"];
+    $version_tag = '';
+    $execute = 'False';
+    $showspreadsheetonly = 'False';
+    $forceDB = 'False';
+    $includeFullTree = 'False';
+    $embedWorkflow = 'False';
+  
+    if(array_key_exists('port', $_GET))
+        $port = $_GET['port'];
+    if(array_key_exists('host', $_GET))
+        $host = $_GET['host'];
+    if(array_key_exists('tag', $_GET))
+        $version_tag = $_GET['tag'];
+    if(array_key_exists('execute', $_GET))
+        $execute = $_GET['execute'];
+    if(array_key_exists('showspreadsheetonly', $_GET))
+        $showspreadsheetonly = $_GET['showspreadsheetonly'];
+    if(array_key_exists('forceDB', $_GET))
+        $forceDB = $_GET['forceDB'];
+    if(array_key_exists('includeFullTree', $_GET))
+        $includeFullTree = $_GET['includeFullTree'];
+    if(array_key_exists('embedWorkflow', $_GET))
+        $embedWorkflow = $_GET['embedWorkflow'];
+        
+    $filename = md5($host . '_'. $dbname .'_' . $port .'_' .$vtid . '_' . $version);
+    $filename = $filename . ".vtl";
+	
+    //change the address below to appropriate folder 
+    //(with read+write access to apache user) if required
+    $fileHandle = fopen($PATH_TO_IMAGES. $filename, 'w') or die("can't open file");
+    $text = '<vtlink database="' . $dbname . '" host="'. $host .
+            '" port="'. $port . '" vtid="' . $vtid . '" execute="'.
+            $execute . '" showSpreadsheetOnly="'. $showspreadsheetonly.
+            '" forceDB="'.$forceDB.'"';
+    if(strcasecmp($embedWorkflow, 'True') == 0){
+        if (strcasecmp($includeFullTree,'True') == 0){
+           $request = xmlrpc_encode_request('get_vt_zip', array($host, $port,
+                                                                $dbname, $vtid));
+           $response = do_call($VT_HOST,$VT_PORT,$request);
+           $vtcontent = get_vt_from_response($response);
+           $text .= ' version="' . $version . '" tag="' . $version_tag .'"';
+           //echo $vtcontent;
+        }
+        else{
+           $request = xmlrpc_encode_request('get_wf_vt_zip', array($host, $port,
+                                                                $dbname, $vtid,
+                                                                $version)); 
+           $response = do_call($VT_HOST,$VT_PORT,$request);
+           $vtcontent = get_vt_from_response($response);
+           //when a workflow is embedded the version is written only when
+           //forceDB is True. Or else version points to the wrong workflow
+           if (strcasecmp($forceDB, 'True') == 0){
+                $text .= ' version="' . $version . '" tag="' . $version_tag .'"';
+           }
+        }
+        $text .= ' vtcontent="'.$vtcontent .'"';
+    }
+    else{
+        $text .= ' version="' . $version . '" tag="' . $version_tag .'"';
+    }
+    $text .= ' />';  
+    fputs($fileHandle, $text);
+    fclose($fileHandle);
+  
+    header("Content-Type: text/vistrails");
+    header("Content-Disposition: attachment;filename=" . $filename);
+
+    //the address below should be the same as one above in line 12
+    readfile($PATH_TO_IMAGES.$filename);
+    exit();
+}
+function get_vt_from_response($xmlstring) {
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0];
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+?>
+
+<html>
+<head>
+<title>Vistrails Download</title>
+<body>
+
+Wrong parameters set!
+
+</body>
+</html>
+<? //Ends ?>
+
diff --git a/extensions/mediawiki/functions.php b/extensions/mediawiki/functions.php
new file mode 100644
index 0000000..1200ff1
--- /dev/null
+++ b/extensions/mediawiki/functions.php
@@ -0,0 +1,81 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+
+function do_call($host, $port, $request) {
+ 
+    $url = "http://$host:$port/";
+    $header[] = "Content-type: text/xml";
+    $header[] = "Content-length: ".strlen($request);
+   
+    $ch = curl_init();  
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
+   
+    $data = curl_exec($ch);      
+    if (curl_errno($ch)) {
+        print curl_error($ch);
+    } else {
+        curl_close($ch);
+        return $data;
+    }
+}
+
+function in_arrayi($needle, $haystack) {
+    return in_array(strtolower($needle), array_map('strtolower', $haystack));
+}
+
+function path_exists_and_not_empty($path){
+    $directory_not_empty = FALSE;
+	if (file_exists($path)){
+		$directory = dir($path);
+	
+		while ((FALSE !== ($item = $directory->read())) && 
+		   ( ! $directory_not_empty)){
+			// If an item is not "." and "..", then something
+	    	// exists in the directory and it is not empty
+	    	if ($item != '.' && $item != '..'){
+		  		$directory_not_empty = TRUE;
+			}
+		}
+		$directory->close();
+	}
+	return $directory_not_empty;
+}
+
+?>
diff --git a/extensions/mediawiki/vistrailsExtension.php b/extensions/mediawiki/vistrailsExtension.php
new file mode 100644
index 0000000..495e768
--- /dev/null
+++ b/extensions/mediawiki/vistrailsExtension.php
@@ -0,0 +1,271 @@
+<?php
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2011-2014, NYU-Poly.
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////
+require_once 'functions.php';
+require_once 'config.php';
+
+$wgExtensionFunctions[] = 'registerVistrailTag';
+$wgExtensionCredits['parserhook'][] = array(
+    'name' => 'VistrailTag',
+    'author' => 'VT',
+    'url' => 'http://www.vistrails.org/',
+);
+
+$resp_result = '';
+function registerVistrailTag() {
+    global $wgParser;
+    $wgParser->setHook('vistrail', 'printVistrailTag');
+}
+
+function printVistrailTag($input,$params) {
+    global $PATH_TO_IMAGES, $WEB_PATH_TO_IMAGES, $URL_TO_GRAPHS,
+            $PATH_TO_GRAPHS, $VT_HOST, $VT_PORT, $USE_LOCAL_VISTRAILS_SERVER,
+            $USE_VISTRAILS_XML_RPC_SERVER, $PATH_TO_VISTRAILS, $URL_TO_DOWNLOAD,
+            $DB_HOST, $DB_NAME, $DB_PORT;
+    $host = $DB_HOST;
+    $dbname = $DB_NAME;
+    $username = "vtserver";
+    $vtid = "";
+    $version = "";
+    $port = $DB_PORT;
+    $version_tag = "";
+    $execute = "False";
+    $showspreadsheetonly = "False";
+    $force_build = 'False';
+    $embedWorkflow = 'False';
+    $includeFullTree = 'False';
+    $forceDB = 'False';
+    $showTree = 'False';
+    $showWorkflow = 'False';
+    foreach ($params as $key=>$value) {
+        if($key == "vtid")
+            $vtid = $value;
+        if($key == "version")
+            $version = $value;
+        if($key == "host")
+            $host = $value;
+        if($key == "db")
+            $dbname = $value;
+        if($key == "port")
+            $port = $value;
+        if($key == "tag"){
+            $version_tag = $value;
+            if($version_tag != ''){
+                $request = xmlrpc_encode_request('get_tag_version',
+                                                 array($host, $port,
+                                                       $dbname, $vtid,
+                                                       $version_tag));
+                $response = do_call($VT_HOST,$VT_PORT,$request);
+                $version = get_version_from_response($response);
+                //echo $version;
+            }
+        }
+        if ($key == "execute")
+            $execute = $value;
+        if ($key == "showspreadsheetonly")
+            $showspreadsheetonly = $value;
+        if ($key == "buildalways")
+            $force_build = $value;
+        if ($key == 'embedworkflow')
+            $embedWorkflow = $value;
+        if ($key == 'includefulltree')
+            $includeFullTree = $value;
+        if ($key == 'forcedb')
+            $forceDB = $value;
+        if ($key == 'showworkflow')
+            $showWorkflow = $value;
+        if ($key == 'showtree')
+            $showTree = $value;
+    }
+
+    $linkParams = "getvt=" . $vtid . "&version=" . $version . "&db=" .$dbname .
+                  "&host=" . $host . "&port=" . $port . "&tag=" .
+                  $version_tag . "&execute=" . $execute .
+                  "&showspreadsheetonly=" . $showspreadsheetonly .
+                  "&embedWorkflow=" . $embedWorkflow . "&includeFullTree=" .
+                  $includeFullTree . "&forceDB=" . $forceDB;
+        
+    if (strcasecmp($showTree,'True') == 0){
+        $filename = md5($host . '_'. $dbname .'_' . $port .'_' .$vtid);
+        $filename = 'vistrails/'.$filename . ".png";
+        //this request is cached only on the server side
+        $request = xmlrpc_encode_request("get_vt_graph_png", array($host, $port, 
+                                  $dbname, $vtid, $USE_LOCAL_VISTRAILS_SERVER));
+        $response = do_call($VT_HOST,$VT_PORT,$request);
+        $result = clean_up($response, $filename);
+
+        list($width, $height, $type, $attr) = getimagesize($PATH_TO_GRAPHS . $result);
+        if ($width > 400)
+           $width = 400;
+        $res = '<a href="'.$URL_TO_DOWNLOAD.'?' . $linkParams . '">';
+        $res = $res . '<img src="'. $URL_TO_GRAPHS . $result.
+                        "\" alt=\"vt_id:$vtid\" width=\"$width\"/>";
+        $res = $res . '</a>';
+        return($res);
+    }
+
+    elseif (strcasecmp($showWorkflow,'True') == 0){
+        $filename = md5($host . '_'. $dbname .'_' . $port .'_' .$vtid . '_' . $version);
+        $filename = 'workflows/'.$filename . ".png";
+        $fullpath = $PATH_TO_GRAPHS. $filename;
+        $cached = file_exists($fullpath);
+        if($USE_LOCAL_VISTRAILS_SERVER or 
+           (!$cached or strcasecmp($force_build,'True') == 0)) {
+            $request = xmlrpc_encode_request("get_wf_graph_png", array($host, 
+                                         $port, $dbname, $vtid, $version, 
+                                         $USE_LOCAL_VISTRAILS_SERVER));
+            $response = do_call($VT_HOST,$VT_PORT,$request);
+            $result = clean_up($response, $filename);
+        } else {
+            $result = $filename;
+        }
+        list($width, $height, $type, $attr) = getimagesize($PATH_TO_GRAPHS . $result);
+        if ($width > 400)
+           $width = 400;
+        $res = '<a href="'.$URL_TO_DOWNLOAD.'?' . $linkParams . '">';
+        $res = $res . '<img src="'. $URL_TO_GRAPHS . $result.
+                        "\" alt=\"vt_id:$vtid version:$version\" width=\"$width\"/>";
+        $res = $res . '</a>';
+        return($res);
+    }
+
+    else {
+        $result = '';
+        $destdir = $PATH_TO_IMAGES;
+        $destversion = $host . '_'. $dbname .'_' . $port . '_' .$vtid . '_' . $version;
+        $destversion = md5($destversion);
+        $destdir = $destdir . $destversion;
+        $build_always_bool = False;
+        if (strcasecmp($force_build,'True') == 0)
+            $build_always_bool = True;
+        if((!path_exists_and_not_empty($destdir)) or strcasecmp($force_build,'True') == 0) {
+            if(!file_exists($destdir)){
+                mkdir($destdir,0770);
+                chmod($destdir, 0770);
+            }
+            if(!$USE_VISTRAILS_XML_RPC_SERVER){
+                chdir($PATH_TO_VISTRAILS);
+                $setVariables = 'export PATH=$PATH:/usr/bin/X11;export HOME=/var/lib/wwwrun; export TEMP=/tmp; export DISPLAY=localhost:1.0; export LD_LIBRARY_PATH=/usr/local/lib;';
+
+                $mainCommand = 'python vistrails/run.py -b -e '. $destdir.' -t ' .
+                            host . ' -r ' . $port . ' -f ' . $dbname . ' -u ' .
+                            username . ' "' . $vtid .':' . $version .'"';
+                $result = exec($setVariables.$mainCommand . ' 2>&1', $output, $result);
+            }
+            else {
+                $request = xmlrpc_encode_request('run_from_db',
+                                                 array($host, $port, $dbname, $vtid,
+                                                       $destdir, $version, False, '',
+                                                       $build_always_bool, '',
+                                                       $USE_LOCAL_VISTRAILS_SERVER));
+                $response = do_call($VT_HOST,$VT_PORT,$request);
+                $result = multiple_clean_up($response, $destdir);
+            }
+        }
+    }
+    $files = scandir($destdir);
+    $n = sizeof($files);
+    if($n > 2){
+        $res = '<a href="'.$URL_TO_DOWNLOAD.'?' . $linkParams . '">';
+        foreach($files as $filename) {
+            if($filename != '.' and $filename != '..'){
+                list($width, $height, $type, $attr) = getimagesize($destdir.'/'.$filename);
+                if ($width > 350)
+                   $width = 350;
+                $res = $res . '<img src="'.$WEB_PATH_TO_IMAGES . $destversion.'/'.
+                       $filename.
+                       "\" alt=\"vt_id:$vtid version:$version\" width=\"$width\"/>";
+            }
+        }
+        $res = $res . '</a>';
+    }
+    else{
+        $res = "ERROR: Vistrails didn't produce any image.\n" .
+               "This is the output: \n" . $result;
+    }
+    return($res);
+}
+
+function get_version_from_response($xmlstring){
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        return (string) $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->int[0];
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+function clean_up($xmlstring, $filename=""){
+    global $PATH_TO_GRAPHS, $USE_LOCAL_VISTRAILS_SERVER;
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        if ($USE_LOCAL_VISTRAILS_SERVER)
+            return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0];
+        else{
+            $contents = $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->base64[0];
+            $fileHandle = fopen($PATH_TO_GRAPHS. $filename, 'wb') or die("can't open file");
+            fputs($fileHandle, base64_decode($contents));
+            fclose($fileHandle);
+            return $filename;
+        }
+                  
+    } catch(Exception $e) {
+        echo "bad xml";
+    }
+}
+
+function multiple_clean_up($xmlstring, $destdir=""){
+    global $USE_LOCAL_VISTRAILS_SERVER;
+    try{
+        $node = @new SimpleXMLElement($xmlstring);
+        //var_dump($node);
+        if ($USE_LOCAL_VISTRAILS_SERVER)
+            return $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->string[0];
+        else{
+            $contents = $node->params[0]->param[0]->value[0]->array[0]->data[0]->value[0]->struct[0];
+            foreach ($contents as $value){                                                                                                                  
+                $image_name = (string) $value->name[0];                                               
+                $image_contents = (string) $value->value[0]->base64[0];                               
+                $fileHandle = fopen($destdir.'/'. $image_name, 'wb') or die("can't open file");       
+                fputs($fileHandle, base64_decode($image_contents));                                   
+                fclose($fileHandle);                                                                  
+             }                                                                                       
+             return $destdir;                                                                        
+        }                                                                                                                                                                                    
+  } catch(Exception $e) {                                                                     
+    echo "bad xml";                                                                           
+  }                                       
+}
+?>
diff --git a/scripts/build_usersguide.py b/scripts/build_usersguide.py
new file mode 100755
index 0000000..9099572
--- /dev/null
+++ b/scripts/build_usersguide.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This will build the html and the pdf version of the user's guide and put
+them in where defined. 
+Please configure the variables below according to your server's setup
+
+"""
+import os
+import os.path
+import re
+import shutil
+import subprocess
+import sys
+import time
+### Begin configuration ###
+# Folder where vistrails is
+PATH_TO_VISTRAILS_GIT = "/Users/emanuele/code/vistrails"
+
+# Folder where the html files will be placed. This script will build
+# the docs in the standard location and move files later
+HTML_FOLDER = None
+
+# Complete file path to where copy final pdf file
+PDF_FILE = "/Users/vistrails/code/vistrails/dist/mac/dist/VisTrails/doc/VisTrails.pdf"
+
+# Should we run a `git pull` before building docs? 
+PERFORM_GIT_PULL = True
+
+### End configuration ### 
+### The following variables usually don't need to be changed
+USERSGUIDE_SUBPATH = ['doc', 'usersguide']
+GIT_PULL_CMD = ["git", "pull"]
+BUILD_HTML_SUBPATH = ["_build", "html"]
+BUILD_LATEX_SUBPATH = ["_build", "latex"]
+PDF_BUILD_NAME = "VisTrails.pdf"
+if __name__ == '__main__':
+    if (PATH_TO_VISTRAILS_GIT is not None and 
+        os.path.exists(PATH_TO_VISTRAILS_GIT)):
+        current_folder = os.getcwd()
+        if PERFORM_GIT_PULL:
+            print "performing git pull in %s..."%PATH_TO_VISTRAILS_GIT
+            os.chdir(PATH_TO_VISTRAILS_GIT)
+            proc = subprocess.Popen(GIT_PULL_CMD,
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT)
+            proc.wait()
+            if proc.returncode != 0:
+                print "ERROR: git pull failed."
+                if proc.stdout:
+                    print proc.stdout.readlines()
+        
+        os.chdir(os.path.join(PATH_TO_VISTRAILS_GIT,
+                              *USERSGUIDE_SUBPATH))
+        
+        print "Going into directory %s"%os.getcwd()
+        # now build html documentation    
+        print "now building html documentation..."
+        proc = subprocess.Popen(["make", "html"],
+                                stdin=subprocess.PIPE,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.STDOUT)
+        proc.wait()
+        if proc.returncode != 0:
+            print "ERROR: make html failed."
+            if proc.stdout:
+                print proc.stdout.readlines()
+        else:
+            # now move files to their final place
+            if HTML_FOLDER is not None:
+                if os.path.exists(HTML_FOLDER):
+                    shutil.rmtree(HTML_FOLDER)
+                html_build = os.path.join(os.getcwd(),
+                                          *BUILD_HTML_SUBPATH)
+            
+                shutil.move(html_build, HTML_FOLDER)
+        
+        #build latex files
+        print "now preparing latex files..."
+        latex_path = os.path.join(".",
+                                  *BUILD_LATEX_SUBPATH)
+        if os.path.exists(latex_path):
+            print "removing old %s directory..."%latex_path
+            proc = subprocess.Popen(["rm", "-rf", latex_path],
+                                    stdin=subprocess.PIPE,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.STDOUT)
+            proc.wait()
+        print "building latex files..."
+        proc = subprocess.Popen(["make", "latex"],
+                                stdin=subprocess.PIPE,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.STDOUT)
+        proc.wait()
+        if proc.returncode != 0:
+            print "ERROR: make latex failed."
+            if proc.stdout:
+                print proc.stdout.readlines()
+        else:
+            #now build pdf
+            print "now building pdf file..."
+            os.chdir(os.path.join(os.getcwd(),
+                     *BUILD_LATEX_SUBPATH))
+            proc = subprocess.Popen(["make", "all-pdf"],
+                                stdin=subprocess.PIPE,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.STDOUT)
+            # when the pdflatex command fails, it waits indefinitely for user
+            #input. We will wait for up to 90 seconds and terminate the process
+            result = None 
+            i = 0
+            while (result == None and i < 15):
+                result = proc.poll()
+                time.sleep(20)
+                i += 1
+                print proc.stdout.readlines()
+                sys.stdout.flush()
+            if result == None:
+                proc.terminate()
+                print "ERROR: make all-pdf failed."
+                if proc.stdout:
+                    print proc.stdout.readlines()
+            elif proc.returncode != 0:
+                print "ERROR: make all-pdf failed."
+                if proc.stdout:
+                    print proc.stdout.readlines()
+            else:
+                #now move file to its final place
+                if PDF_FILE is not None:
+                    pdf_build = os.path.join(os.getcwd(),
+                                             PDF_BUILD_NAME)
+                    shutil.move(pdf_build, PDF_FILE)
+        os.chdir(current_folder)
+        print "Done."
+    else:
+        print "PATH_TO_VISTRAILS_GIT was not provided. Exiting."
diff --git a/scripts/convert_files/convert_files.sh b/scripts/convert_files/convert_files.sh
new file mode 100755
index 0000000..410bd5d
--- /dev/null
+++ b/scripts/convert_files/convert_files.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+file_list=$1
+shift
+
+for i in `cat $file_list`; do
+    DIR=`dirname $i`
+    VT_FILE=$DIR/`basename $i .vt`_fixed.vt
+    echo $i
+    echo -- UNZIPPING
+    unzip $i
+    echo -- PRETTY PRINTING
+    xmlpp.pl vistrail > vistrail_pp
+    echo -- FIXING
+    ../fix_file.py vistrail_pp $* > vistrail
+    echo -- ZIPPING
+    zip fixed_vistrail.zip vistrail
+    echo -- MOVING
+    mv fixed_vistrail.zip $VT_FILE
+    echo -- CLEANING
+    rm vistrail
+    rm vistrail_pp
+    echo $i
+done
diff --git a/scripts/convert_files/fix_file.py b/scripts/convert_files/fix_file.py
new file mode 100644
index 0000000..25d61c3
--- /dev/null
+++ b/scripts/convert_files/fix_file.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+import re
+
+re_list = []
+
+if len(sys.argv) < 4:
+    print "Usage:"
+    print "%s file_to_process path_to_data_files data_file_1 data_file_2 ..." % sys.argv[0]
+    sys.exit(1)
+
+for i in xrange(3, len(sys.argv)):
+    re_list.append((sys.argv[i], re.compile(r"val='[^']*" + sys.argv[i] + r"[^']*'")))
+
+f = file(sys.argv[1])
+for l in f:
+    for (s, re_obj) in re_list:
+        l = re_obj.sub("val='" + sys.argv[2] + s + "'", l)
+    print l[:-1]
diff --git a/scripts/create_release_wiki_table.py b/scripts/create_release_wiki_table.py
new file mode 100644
index 0000000..6d83867
--- /dev/null
+++ b/scripts/create_release_wiki_table.py
@@ -0,0 +1,90 @@
+""" This will output text with release information ready to be pasted on the
+wiki page
+
+
+
+"""
+from datetime import date
+#Release version
+VT_VERSION = "2.1.1"
+VT_REVISION = "90975fc00211"
+
+#Sourceforge information
+SF_ROOT_URL = "http://downloads.sourceforge.net/project/vistrails/vistrails/"
+SF_FOLDER_NAME = "v2.1.1"
+SF_DOWNLOAD_URL = "%s%s"%(SF_ROOT_URL,SF_FOLDER_NAME)
+#binaries names
+MAC_64_BIN = "vistrails-mac-10.6-intel-%s-%s.dmg"%(VT_VERSION, VT_REVISION)
+WIN_32_BIN = "vistrails-setup-%s-%s.zip"%(VT_VERSION, VT_REVISION)
+WIN_64_BIN = "vistrails-x64-setup-%s-%s.zip"%(VT_VERSION, VT_REVISION)
+ALL_PLAT_SRC = "vistrails-src-%s-%s.tar.gz"%(VT_VERSION, VT_REVISION)
+#pdf
+USERSGUIDE = "VisTrails.pdf"
+
+#sizes
+MAC_64_SIZE = "182.3 MB"
+WIN_32_SIZE = "125.3 MB"
+WIN_64_SIZE = "150 MB"
+ALL_PLAT_SIZE = "19.2 MB"
+USERSGUIDE_SIZE = "8.7 MB"
+
+def create_text():
+    today = date.today().strftime("%Y-%m-%d")
+    
+    text = """|{{Hl4}} colspan="4" |'''%s build %s (%s)'''  [[known_issues|Known Issues]] {{SFReleaseNotes\
+       |link=https://sourceforge.net/projects/vistrails/files/vistrails/%s/README/view}} 
+|-
+"""%(VT_VERSION, VT_REVISION, today, SF_FOLDER_NAME)
+
+    text += """|
+* {{zip
+  |link=%s/%s
+  |text=%s}}
+|%s
+|i586
+|.zip (32-bit Windows)
+|-
+"""%(SF_DOWNLOAD_URL, WIN_32_BIN, WIN_32_BIN, WIN_32_SIZE)
+
+    text += """|
+* {{zip
+  |link=%s/%s
+  |text=%s}}
+|%s
+|i586
+|.zip (64-bit Windows)
+|-
+"""%(SF_DOWNLOAD_URL, WIN_64_BIN, WIN_64_BIN, WIN_64_SIZE)
+
+    text += """|
+* {{dmg
+  |link=%s/%s
+  |text=%s}}
+|%s
+|Mac OS X 10.6+ x64
+|.dmg (Mac bundle)
+|-
+"""%(SF_DOWNLOAD_URL, MAC_64_BIN, MAC_64_BIN, MAC_64_SIZE)
+
+    text += """|
+* {{targz
+|link=%s/%s
+|text=%s}}
+|%s
+|all
+|Source .tar.gz
+|-
+"""%(SF_DOWNLOAD_URL, ALL_PLAT_SRC, ALL_PLAT_SRC, ALL_PLAT_SIZE)
+    text += """|
+* {{Pdf
+|link=%s/%s
+|text=%s}}
+|%s
+|all
+|.pdf
+|-
+"""%(SF_DOWNLOAD_URL, USERSGUIDE, USERSGUIDE, USERSGUIDE_SIZE)
+    print text
+
+if __name__ == "__main__":
+    create_text()
diff --git a/scripts/create_server_media_dir_structure.py b/scripts/create_server_media_dir_structure.py
new file mode 100644
index 0000000..69d0e6c
--- /dev/null
+++ b/scripts/create_server_media_dir_structure.py
@@ -0,0 +1,99 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This will create the media_dir directory structure required by vistrails
+server when used as a remote server with crowdlabs (www.crowdlabs.org) 
+
+usage: python create_server_media_dir_structure.py /path/to/media_dir
+
+If media_dir does not exist, it will be created.
+
+"""
+
+import sys
+import os, os.path
+
+folders = [["wf_execution"],
+           ["graphs", "workflows"],
+           ["graphs", "vistrails"],
+           ["medleys", "images"]]
+def path_exists_and_not_empty(path):
+    """path_exists_and_not_empty(path:str) -> boolean 
+    Returns True if given path exists and it's not empty, otherwise returns 
+    False.
+    
+    """
+    if os.path.exists(path):
+        for root, dirs, file_names in os.walk(path):
+            break
+        if len(file_names) > 0 or len(dirs) > 0:
+            return True
+    return False
+
+if __name__ == "__main__":
+    args = sys.argv
+    error = False
+    if len(args) == 2:
+        media_dir = args[1]
+    else:
+        print "Usage: %s /path/to/media_dir" % args[0]
+        sys.exit(0)
+    if os.path.exists(media_dir):
+        if not os.path.isdir(media_dir):
+            print "Error: %s exists and it is not a directory." %media_dir
+            error = True
+        elif path_exists_and_not_empty(media_dir):
+            print "Error: %s exists and it is not empty. "% media_dir
+            error = True
+    else:
+        print "%s does not exist. Trying to create directory..."%media_dir
+        try:
+            os.mkdir(media_dir)
+        except Exception, e:
+            print "Error creating %s directory: %s" % (media_dir, str(e))
+            error = True
+    if not error:
+        print "Creating inner structure... "
+        for path_list in folders:
+            folder = os.path.join(media_dir, os.path.join(*path_list))
+            print "   ", folder
+            try:
+                os.makedirs(folder)
+            except Exception, e:
+                print "Error creating %s directory: %s" % (folder, str(e))
+        print "Done."
+    else:
+        print "There was an error. Please check the messages above. "
+        sys.exit(1)
+    
diff --git a/scripts/db_utils.py b/scripts/db_utils.py
new file mode 100644
index 0000000..eaec86e
--- /dev/null
+++ b/scripts/db_utils.py
@@ -0,0 +1,114 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import getopt
+import getpass
+import sys
+
+def usage(usageDict):
+    usageStr = ''
+    unrequired = ''
+    required = ''
+    align_len = 15
+    for (opt, info) in usageDict.iteritems():
+        if info[1]:
+            required += '-%s <%s> ' % (opt[0], info[2])
+            usageStr += '    -%s <%s> %s' % (opt[0], info[2], 
+                                             ' ' * (align_len - 
+                                                    len(info[2]) - 3))
+        else:
+            if len(opt) > 1:
+                unrequired += '[-%s <%s>] ' % (opt[0], info[2])
+                usageStr += '    -%s <%s> %s' % (opt[0], info[2], 
+                                                 ' ' * (align_len - 
+                                                        len(info[2]) - 3))
+            else:
+                unrequired += '[-%s] ' % opt[0]
+                usageStr += '    -%s %s' % (opt[0], ' ' * align_len)
+        usageStr += '%s\n' % info[0]
+    print 'Usage: %s %s %s%s\n%s' % (sys.executable,
+                                     sys.argv[0],
+                                     required, 
+                                     unrequired, 
+                                     usageStr)
+
+def parse_db_cmd_line(argv, more_options={}):
+    options = {}
+    optionsUsage = {'t:': ('set database host/port', False, 'host:port'),
+                    'p': ('use password', False),
+                    'u:': ('set database user', False, 'user'),
+                    'D:': ('set database name', False, 'database')
+                    }
+    optionsUsage.update(more_options)
+
+    optStr = ''.join(optionsUsage.keys())
+    optKeys = optStr.replace(':','')
+    for idx in xrange(len(optKeys)):
+        options[optKeys[idx]] = False
+
+    try:
+        (optlist, args) = getopt.getopt(argv[1:], optStr)
+        for opt in optlist:
+            if opt[1] is not None and opt[1] != '':
+                options[opt[0][1:]] = opt[1]
+            else:
+                options[opt[0][1:]] = True
+    except getopt.GetoptError:
+        usage(optionsUsage)
+        sys.exit(23)
+
+    for opt, spec in optionsUsage.iteritems():
+        if spec[1] and not options[opt[0]]:
+            usage(optionsUsage)
+            sys.exit(23)
+        
+    config = {'host': 'localhost',
+              'port': 3306,
+              'user': 'vistrails',
+              'db': 'vistrails'}
+
+    if options['p']:
+        config['passwd'] = getpass.getpass()
+    if options['t']:
+        host_arr = options['t'].split(':', 1)
+        config['host'] = host_arr[0]
+        if len(host_arr) > 1:
+            config['port'] = int(host_arr[1])
+    if options['u']:
+        config['user'] = options['u']
+    if options['D']:
+        config['db'] = options['D']
+
+    return (config, options)
diff --git a/scripts/delete_from_db.py b/scripts/delete_from_db.py
new file mode 100644
index 0000000..5212fb3
--- /dev/null
+++ b/scripts/delete_from_db.py
@@ -0,0 +1,57 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import sys
+sys.path.append(os.path.join(os.path.dirname(os.path.dirname(
+                os.path.abspath(__file__))), 'vistrails'))
+from vistrails.db.services import io
+from db_utils import parse_db_cmd_line
+
+def delete_from_db(config, obj_type, obj_id):
+    db_connection = io.open_db_connection(config)
+    io.delete_entity_from_db(db_connection, obj_type, obj_id)
+    io.close_db_connection(db_connection)
+
+if __name__ == '__main__':
+    more_options = {'t:': ('set object type', False, 'obj_type'),
+                    'i:': ('set object id', True, 'obj_id'),
+                    }
+    config, options = parse_db_cmd_line(sys.argv, more_options)
+    obj_type = 'vistrail'
+    if options['t']:
+        obj_type = options['t']
+    obj_id = int(options['i'])
+    delete_from_db(config, obj_type, obj_id)
+                   
diff --git a/scripts/diff_package.py b/scripts/diff_package.py
new file mode 100644
index 0000000..3260e0c
--- /dev/null
+++ b/scripts/diff_package.py
@@ -0,0 +1,101 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""To use this script, run VisTrails with the old version of a package enabled, and choose the Export -> Registry to XML... and save the file.  Then, enable the new version of the package and again export the registry to a second XML file.  Then, run this script with the package identifier, the old registry's filename, and the new registry's filename as arguments."""
+
+import os
+import sys
+# put the vistrails code on the python path
+sys.path.append(os.path.join(os.path.dirname(os.path.dirname(
+                os.path.abspath(__file__))), "vistrails"))
+
+import vistrails.core.application
+from vistrails.core.modules.module_registry import ModuleRegistry
+from vistrails.db.services.io import open_registry_from_xml
+
+def get_module_name(d):
+    if d.namespace:
+        return "%s|%s" % (d.namespace, d.name)
+    return d.name
+
+def diff_package(pkg_id, reg_fname1, reg_fname2):
+    reg1 = open_registry_from_xml(reg_fname1)
+    ModuleRegistry.convert(reg1)
+    reg2 = open_registry_from_xml(reg_fname2)
+    ModuleRegistry.convert(reg2)
+    
+    pkg1 = reg1.get_package_by_name(pkg_id)
+    pkg2 = reg2.get_package_by_name(pkg_id)
+
+    d2_modules_dict = dict(((d2.identifier, d2.name, d2.namespace), d2)
+                           for d2 in pkg2.descriptor_list)
+    for d1 in pkg1.descriptor_list:
+        if reg2.has_descriptor_with_name(pkg_id, d1.name, d1.namespace):
+            d2 = reg2.get_descriptor_by_name(pkg_id, d1.name, d1.namespace)
+            d1_port_specs = {}
+            for ps in d1.port_specs_list:
+                d1_port_specs[(ps.name, ps.type)] = ps.sigstring
+            d2_port_specs = {}
+            for ps in d2.port_specs_list:
+                d2_port_specs[(ps.name, ps.type)] = ps.sigstring
+            d2_port_specs_set = set(d2_port_specs.keys())
+            for ps_id, sig1 in d1_port_specs.iteritems():
+                if ps_id not in d2_port_specs:
+                    print "added %s port: %s:%s" % \
+                        (ps_id[1], get_module_name(d1), ps_id[0])
+                    continue
+                d2_port_specs_set.discard(ps_id)
+                if sig1 != d2_port_specs[ps_id]:
+                    print "changed %s port: %s:%s" % \
+                        (ps_id[1], get_module_name(d1), ps_id[0])
+                    print "  %s -> %s" % (sig1, d2_port_specs[ps_id])
+                else:
+                    # equal
+                    pass
+            for ps_id in d2_port_specs_set:
+                print "deleted %s port: %s:%s" % \
+                    (ps_id[1], get_module_name(d1), ps_id[0])
+            del d2_modules_dict[(d1.identifier, d1.name, d1.namespace)]
+        else:
+            print "deleted module: %s" % get_module_name(d1)
+    for d2 in d2_modules_dict.itervalues():
+        print "added module: %s" % get_module_name(d2)
+    
+if __name__ == '__main__':
+    if len(sys.argv) < 4:
+        print "Usage: %s %s <pkg_identifer> <old_registry> <new_registry>" % \
+            (sys.executable, sys.argv[0])
+        sys.exit(71)
+    vistrails.core.application.init()
+    diff_package(*sys.argv[1:])
diff --git a/scripts/extract.py b/scripts/extract.py
new file mode 100644
index 0000000..5475bfb
--- /dev/null
+++ b/scripts/extract.py
@@ -0,0 +1,58 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore
+import imp
+import sys
+
+def copyDir(src, dst):
+    for info in src.entryInfoList():
+        if info.isDir():
+            dst.mkdir(info.fileName())
+            src.cd(info.fileName())
+            dst.cd(info.fileName())
+            copyDir(src, dst)
+            src.cd('..')
+            dst.cd('..')
+        elif info.isFile():
+            QtCore.QFile.copy(info.filePath(), dst.filePath(info.fileName()))
+        
+if __name__=="__main__":
+    if len(sys.argv)!=2:
+        print "Usage: python extract.py resource_rc"
+        sys.exit(0)
+
+    moduleName = sys.argv[1]
+    imp.load_source('resModule', moduleName)
+    copyDir(QtCore.QDir(":"), QtCore.QDir("."))
diff --git a/scripts/force_start_vistrails.py b/scripts/force_start_vistrails.py
new file mode 100755
index 0000000..feb60db
--- /dev/null
+++ b/scripts/force_start_vistrails.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This script will read vistrails pids from files, kill them and call
+the script to start vistrails. """
+
+import os.path
+import os
+
+#settings
+LOG_DIR = '/server/vistrails/logs'
+VISTRAILS_SCRIPTS_DIR = '/server/vistrails/trunk/scripts'
+SCRIPT = 'start_vistrails.sh'
+PORTS = ['8081','8082','8083']
+
+
+if __name__ == '__main__':
+    cmds = []
+    for port in PORTS:
+        filename = os.path.join(LOG_DIR,
+                                "pid.%s.vistrails"%port)
+        f = open(filename)
+        pid = f.read()
+        f.close()
+        cmd = "kill -9 %s"%pid
+        cmds.append(cmd)
+
+    start_cmd = "nohup " + os.path.join(VISTRAILS_SCRIPTS_DIR,SCRIPT)
+    cmds.append(start_cmd)
+
+    for cmd in cmds:
+        os.system(cmd)
diff --git a/scripts/force_start_vistrails_nonohup.py b/scripts/force_start_vistrails_nonohup.py
new file mode 100755
index 0000000..d5b1a55
--- /dev/null
+++ b/scripts/force_start_vistrails_nonohup.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This script will read vistrails pids from files, kill them and call
+the script to start vistrails. """
+
+import os.path
+import os
+
+#settings
+LOG_DIR = '/server/vistrails/logs'
+VISTRAILS_SCRIPTS_DIR = '/server/vistrails/trunk/scripts'
+SCRIPT = 'start_vistrails.sh'
+PORTS = ['8081','8082','8083']
+
+
+if __name__ == '__main__':
+    cmds = []
+    for port in PORTS:
+        filename = os.path.join(LOG_DIR,
+                                "pid.%s.vistrails"%port)
+        f = open(filename)
+        pid = f.read()
+        f.close()
+        cmd = "kill -9 %s"%pid
+        cmds.append(cmd)
+
+    start_cmd = os.path.join(VISTRAILS_SCRIPTS_DIR,SCRIPT)
+    cmds.append(start_cmd)
+
+    for cmd in cmds:
+        os.system(cmd)
diff --git a/scripts/gen_vtk_examples/README b/scripts/gen_vtk_examples/README
new file mode 100644
index 0000000..72cea9d
--- /dev/null
+++ b/scripts/gen_vtk_examples/README
@@ -0,0 +1,67 @@
+David Koop
+04/28/2008
+
+These scripts are used to generate VisTrails versions of the vtk
+example python scripts.  The general idea is that because most of the
+scripts use qualified vtk calls, we can hijack the "import vtk" call
+and import a vtk class that generates a trace of the pipeline calls.
+From this trace, we can reconstruct a pipeline based on
+function/argument pairs.  In addition, we use a set of specialized
+functions to:
+
+  - translate calls to "existing" objects like GetActiveCamera(),
+    GetProperty() to use constructed objects instead
+
+  - translate linked "Get" calls (ie
+    "GetPointData().GetScalars().GetRange()") to use inspectors (part
+    of the VisTrails vtk package).
+
+  - translate other specialized functions calls like observers to work
+    with the VisTrails vtk package
+
+We will use three different directories:
+
+modified_scripts_dir: directory that stores vtk examples with
+  manual modifications to allow better translation.
+intermediate_dir: scratch directory where we attempt to translate all scripts
+out_dir: final directory where initial modified python script and
+  the translated vt file are stored.
+
+To run the entire process:
+
+  python gen_vtk_examples.py <modified_scripts_dir> <intermediate_dir> 
+    <out_dir>
+
+Note that the modified_scripts_dir assumes the standard vtk structure
+(ie "DataManipulation/Python/Arrays.py") while the other dirs omit the
+Python subdir (ie "DataManipulation/Arrays.py").
+
+Currently, these scripts work as a 3-step process:
+
+(1) Modify existing vtk python scripts to allow process to work
+correctly (ie use PythonCalc to do arithmetic computations).
+
+(2) Run
+
+  python copy_vtk_examples.py <modified_scripts_dir> <intermediate_dir>
+
+This script will call "convert_to_vt.py" to swap some of the inputs
+and call the translator code at the end of the script and copy this
+file to the output directory.  Then, it will run the python script.
+Because we use a class ("vtk_imposter.py") to intercept all vtk calls,
+we end up with a trace of the script.  We then invoke "vtk_to_vt.py"
+which translates this class into a pipeline.
+
+(3) Run
+
+  python get_vtk_examples.py examples_list.txt <modified_scripts_dir> 
+    <intermediate_dir> <out_dir>
+
+This script copies over the modified python script (not the converted
+script) and the new vistrail to a final output directory.  It uses the
+examples_list.txt to determine which scripts it ought to copy ('Y'
+indicates a successsful translation, 'N' indicates an unsuccessful
+translation).  This example list is updated **manually**.
+
+Note that "check_diffs.py" can be used to check the differences
+between the original and modified Python scripts.
\ No newline at end of file
diff --git a/scripts/gen_vtk_examples/check_diffs.py b/scripts/gen_vtk_examples/check_diffs.py
new file mode 100644
index 0000000..186c071
--- /dev/null
+++ b/scripts/gen_vtk_examples/check_diffs.py
@@ -0,0 +1,78 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import sys
+import os
+import re
+
+def run(in_dir, out_dir):
+    def collectFilenames(dir):
+        # create the regular expression matcher machines
+        fileNameParser = re.compile('.*\.py')
+
+        result = []
+        for file in os.listdir(dir):
+            # print childDirOrFile
+            childDirOrFile = os.path.join(dir,file)
+            if os.path.isfile(childDirOrFile):
+                # file does match?
+                if fileNameParser.match(childDirOrFile):
+                    result.append(childDirOrFile)
+            elif os.path.isdir(childDirOrFile):
+                result += collectFilenames(childDirOrFile)
+        return result
+
+    
+    all_files = collectFilenames(in_dir)
+
+    in_base = os.path.basename(in_dir)
+    out_base = os.path.basename(out_dir)
+    for fname in all_files:
+        path_before = os.path.dirname(fname)
+        path_end = os.path.basename(fname)
+        while os.path.basename(path_before) != in_base:
+            path_end = os.path.join(os.path.basename(path_before), path_end)
+            path_before = os.path.dirname(path_before)
+        other_fname = os.path.join(out_dir, path_end)
+
+        cmd_line = "diff %s %s" % (fname, other_fname)
+        print cmd_line
+        os.system(cmd_line)
+
+if __name__ == '__main__':
+    if len(sys.argv) < 3:
+        print 'Usage: python %s <in_directory> <out_directory>' % sys.argv[0]
+        sys.exit(-1)
+    run(*sys.argv[1:])
diff --git a/scripts/gen_vtk_examples/colors.py b/scripts/gen_vtk_examples/colors.py
new file mode 100644
index 0000000..af703d0
--- /dev/null
+++ b/scripts/gen_vtk_examples/colors.py
@@ -0,0 +1,251 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# This module defines many standard colors that should be useful.
+# These colors should be exactly the same as the ones defined in
+# colors.tcl.
+
+#  Whites
+antique_white = (0.9804, 0.9216, 0.8431)
+azure = (0.9412, 1.0000, 1.0000)
+bisque = (1.0000, 0.8941, 0.7686)
+blanched_almond = (1.0000, 0.9216, 0.8039)
+cornsilk = (1.0000, 0.9725, 0.8627)
+eggshell = (0.9900, 0.9000, 0.7900)
+floral_white = (1.0000, 0.9804, 0.9412)
+gainsboro = (0.8627, 0.8627, 0.8627)
+ghost_white = (0.9725, 0.9725, 1.0000)
+honeydew = (0.9412, 1.0000, 0.9412)
+ivory = (1.0000, 1.0000, 0.9412)
+lavender = (0.9020, 0.9020, 0.9804)
+lavender_blush = (1.0000, 0.9412, 0.9608)
+lemon_chiffon = (1.0000, 0.9804, 0.8039)
+linen = (0.9804, 0.9412, 0.9020)
+mint_cream = (0.9608, 1.0000, 0.9804)
+misty_rose = (1.0000, 0.8941, 0.8824)
+moccasin = (1.0000, 0.8941, 0.7098)
+navajo_white = (1.0000, 0.8706, 0.6784)
+old_lace = (0.9922, 0.9608, 0.9020)
+papaya_whip = (1.0000, 0.9373, 0.8353)
+peach_puff = (1.0000, 0.8549, 0.7255)
+seashell = (1.0000, 0.9608, 0.9333)
+snow = (1.0000, 0.9804, 0.9804)
+thistle = (0.8471, 0.7490, 0.8471)
+titanium_white = (0.9900, 1.0000, 0.9400)
+wheat = (0.9608, 0.8706, 0.7020)
+white = (1.0000, 1.0000, 1.0000)
+white_smoke = (0.9608, 0.9608, 0.9608)
+zinc_white = (0.9900, 0.9700, 1.0000)
+
+#  Greys
+cold_grey = (0.5000, 0.5400, 0.5300)
+dim_grey = (0.4118, 0.4118, 0.4118)
+grey = (0.7529, 0.7529, 0.7529)
+light_grey = (0.8275, 0.8275, 0.8275)
+slate_grey = (0.4392, 0.5020, 0.5647)
+slate_grey_dark = (0.1843, 0.3098, 0.3098)
+slate_grey_light = (0.4667, 0.5333, 0.6000)
+warm_grey = (0.5000, 0.5000, 0.4100)
+
+#  Blacks
+black = (0.0000, 0.0000, 0.0000)
+ivory_black = (0.1600, 0.1400, 0.1300)
+lamp_black = (0.1800, 0.2800, 0.2300)
+
+#  Reds
+alizarin_crimson = (0.8900, 0.1500, 0.2100)
+brick = (0.6100, 0.4000, 0.1200)
+cadmium_red_deep = (0.8900, 0.0900, 0.0500)
+coral = (1.0000, 0.4980, 0.3137)
+coral_light = (0.9412, 0.5020, 0.5020)
+deep_pink = (1.0000, 0.0784, 0.5765)
+english_red = (0.8300, 0.2400, 0.1000)
+firebrick = (0.6980, 0.1333, 0.1333)
+geranium_lake = (0.8900, 0.0700, 0.1900)
+hot_pink = (1.0000, 0.4118, 0.7059)
+indian_red = (0.6900, 0.0900, 0.1200)
+light_salmon = (1.0000, 0.6275, 0.4784)
+madder_lake_deep = (0.8900, 0.1800, 0.1900)
+maroon = (0.6902, 0.1882, 0.3765)
+pink = (1.0000, 0.7529, 0.7961)
+pink_light = (1.0000, 0.7137, 0.7569)
+raspberry = (0.5300, 0.1500, 0.3400)
+red = (1.0000, 0.0000, 0.0000)
+rose_madder = (0.8900, 0.2100, 0.2200)
+salmon = (0.9804, 0.5020, 0.4471)
+tomato = (1.0000, 0.3882, 0.2784)
+venetian_red = (0.8300, 0.1000, 0.1200)
+
+#  Browns
+beige = (0.6400, 0.5800, 0.5000)
+brown = (0.5000, 0.1647, 0.1647)
+brown_madder = (0.8600, 0.1600, 0.1600)
+brown_ochre = (0.5300, 0.2600, 0.1200)
+burlywood = (0.8706, 0.7216, 0.5294)
+burnt_sienna = (0.5400, 0.2100, 0.0600)
+burnt_umber = (0.5400, 0.2000, 0.1400)
+chocolate = (0.8235, 0.4118, 0.1176)
+deep_ochre = (0.4500, 0.2400, 0.1000)
+flesh = (1.0000, 0.4900, 0.2500)
+flesh_ochre = (1.0000, 0.3400, 0.1300)
+gold_ochre = (0.7800, 0.4700, 0.1500)
+greenish_umber = (1.0000, 0.2400, 0.0500)
+khaki = (0.9412, 0.9020, 0.5490)
+khaki_dark = (0.7412, 0.7176, 0.4196)
+light_beige = (0.9608, 0.9608, 0.8627)
+peru = (0.8039, 0.5216, 0.2471)
+rosy_brown = (0.7373, 0.5608, 0.5608)
+raw_sienna = (0.7800, 0.3800, 0.0800)
+raw_umber = (0.4500, 0.2900, 0.0700)
+sepia = (0.3700, 0.1500, 0.0700)
+sienna = (0.6275, 0.3216, 0.1765)
+saddle_brown = (0.5451, 0.2706, 0.0745)
+sandy_brown = (0.9569, 0.6431, 0.3765)
+tan = (0.8235, 0.7059, 0.5490)
+van_dyke_brown = (0.3700, 0.1500, 0.0200)
+
+#  Oranges
+cadmium_orange = (1.0000, 0.3800, 0.0100)
+cadmium_red_light = (1.0000, 0.0100, 0.0500)
+carrot = (0.9300, 0.5700, 0.1300)
+dark_orange = (1.0000, 0.5490, 0.0000)
+mars_orange = (0.5900, 0.2700, 0.0800)
+mars_yellow = (0.8900, 0.4400, 0.1000)
+orange = (1.0000, 0.5000, 0.0000)
+orange_red = (1.0000, 0.2706, 0.0000)
+yellow_ochre = (0.8900, 0.5100, 0.0900)
+
+#  Yellows
+aureoline_yellow = (1.0000, 0.6600, 0.1400)
+banana = (0.8900, 0.8100, 0.3400)
+cadmium_lemon = (1.0000, 0.8900, 0.0100)
+cadmium_yellow = (1.0000, 0.6000, 0.0700)
+cadmium_yellow_light = (1.0000, 0.6900, 0.0600)
+gold = (1.0000, 0.8431, 0.0000)
+goldenrod = (0.8549, 0.6471, 0.1255)
+goldenrod_dark = (0.7216, 0.5255, 0.0431)
+goldenrod_light = (0.9804, 0.9804, 0.8235)
+goldenrod_pale = (0.9333, 0.9098, 0.6667)
+light_goldenrod = (0.9333, 0.8667, 0.5098)
+melon = (0.8900, 0.6600, 0.4100)
+naples_yellow_deep = (1.0000, 0.6600, 0.0700)
+yellow = (1.0000, 1.0000, 0.0000)
+yellow_light = (1.0000, 1.0000, 0.8784)
+
+#  Greens
+chartreuse = (0.4980, 1.0000, 0.0000)
+chrome_oxide_green = (0.4000, 0.5000, 0.0800)
+cinnabar_green = (0.3800, 0.7000, 0.1600)
+cobalt_green = (0.2400, 0.5700, 0.2500)
+emerald_green = (0.0000, 0.7900, 0.3400)
+forest_green = (0.1333, 0.5451, 0.1333)
+green = (0.0000, 1.0000, 0.0000)
+green_dark = (0.0000, 0.3922, 0.0000)
+green_pale = (0.5961, 0.9843, 0.5961)
+green_yellow = (0.6784, 1.0000, 0.1843)
+lawn_green = (0.4863, 0.9882, 0.0000)
+lime_green = (0.1961, 0.8039, 0.1961)
+mint = (0.7400, 0.9900, 0.7900)
+olive = (0.2300, 0.3700, 0.1700)
+olive_drab = (0.4196, 0.5569, 0.1373)
+olive_green_dark = (0.3333, 0.4196, 0.1843)
+permanent_green = (0.0400, 0.7900, 0.1700)
+sap_green = (0.1900, 0.5000, 0.0800)
+sea_green = (0.1804, 0.5451, 0.3412)
+sea_green_dark = (0.5608, 0.7373, 0.5608)
+sea_green_medium = (0.2353, 0.7020, 0.4431)
+sea_green_light = (0.1255, 0.6980, 0.6667)
+spring_green = (0.0000, 1.0000, 0.4980)
+spring_green_medium = (0.0000, 0.9804, 0.6039)
+terre_verte = (0.2200, 0.3700, 0.0600)
+viridian_light = (0.4300, 1.0000, 0.4400)
+yellow_green = (0.6039, 0.8039, 0.1961)
+
+#  Cyans
+aquamarine = (0.4980, 1.0000, 0.8314)
+aquamarine_medium = (0.4000, 0.8039, 0.6667)
+cyan = (0.0000, 1.0000, 1.0000)
+cyan_white = (0.8784, 1.0000, 1.0000)
+turquoise = (0.2510, 0.8784, 0.8157)
+turquoise_dark = (0.0000, 0.8078, 0.8196)
+turquoise_medium = (0.2824, 0.8196, 0.8000)
+turquoise_pale = (0.6863, 0.9333, 0.9333)
+
+#  Blues
+alice_blue = (0.9412, 0.9725, 1.0000)
+blue = (0.0000, 0.0000, 1.0000)
+blue_light = (0.6784, 0.8471, 0.9020)
+blue_medium = (0.0000, 0.0000, 0.8039)
+cadet = (0.3725, 0.6196, 0.6275)
+cobalt = (0.2400, 0.3500, 0.6700)
+cornflower = (0.3922, 0.5843, 0.9294)
+cerulean = (0.0200, 0.7200, 0.8000)
+dodger_blue = (0.1176, 0.5647, 1.0000)
+indigo = (0.0300, 0.1800, 0.3300)
+manganese_blue = (0.0100, 0.6600, 0.6200)
+midnight_blue = (0.0980, 0.0980, 0.4392)
+navy = (0.0000, 0.0000, 0.5020)
+peacock = (0.2000, 0.6300, 0.7900)
+powder_blue = (0.6902, 0.8784, 0.9020)
+royal_blue = (0.2549, 0.4118, 0.8824)
+slate_blue = (0.4157, 0.3529, 0.8039)
+slate_blue_dark = (0.2824, 0.2392, 0.5451)
+slate_blue_light = (0.5176, 0.4392, 1.0000)
+slate_blue_medium = (0.4824, 0.4078, 0.9333)
+sky_blue = (0.5294, 0.8078, 0.9216)
+sky_blue_deep = (0.0000, 0.7490, 1.0000)
+sky_blue_light = (0.5294, 0.8078, 0.9804)
+steel_blue = (0.2745, 0.5098, 0.7059)
+steel_blue_light = (0.6902, 0.7686, 0.8706)
+turquoise_blue = (0.0000, 0.7800, 0.5500)
+ultramarine = (0.0700, 0.0400, 0.5600)
+
+#  Magentas
+blue_violet = (0.5412, 0.1686, 0.8863)
+cobalt_violet_deep = (0.5700, 0.1300, 0.6200)
+magenta = (1.0000, 0.0000, 1.0000)
+orchid = (0.8549, 0.4392, 0.8392)
+orchid_dark = (0.6000, 0.1961, 0.8000)
+orchid_medium = (0.7294, 0.3333, 0.8275)
+permanent_red_violet = (0.8600, 0.1500, 0.2700)
+plum = (0.8667, 0.6275, 0.8667)
+purple = (0.6275, 0.1255, 0.9412)
+purple_medium = (0.5765, 0.4392, 0.8588)
+ultramarine_violet = (0.3600, 0.1400, 0.4300)
+violet = (0.5600, 0.3700, 0.6000)
+violet_dark = (0.5804, 0.0000, 0.8275)
+violet_red = (0.8157, 0.1255, 0.5647)
+violet_red_medium = (0.7804, 0.0824, 0.5216)
+violet_red_pale = (0.8588, 0.4392, 0.5765)
diff --git a/scripts/gen_vtk_examples/convert_to_vt.py b/scripts/gen_vtk_examples/convert_to_vt.py
new file mode 100644
index 0000000..ad600ed
--- /dev/null
+++ b/scripts/gen_vtk_examples/convert_to_vt.py
@@ -0,0 +1,98 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+class ConvertVTKToVT(object):
+    def __init__(self, in_filename, out_py_file):
+        self.in_filename = in_filename
+        self.out_py_file = out_py_file
+        
+        
+    def run(self):
+        in_file = file(self.in_filename)
+        out_file = file(self.out_py_file, 'w')
+
+        does_continue = False
+        line_count = 0
+        found_starter = False
+        for line in in_file:
+            if line_count == 0:
+                if line.startswith('#!'):
+                    found_starter = True
+                else:
+                    print >> out_file, \
+                        "# This file produced automatically by convert_to_vt.py\n# "
+            elif line_count == 1 and found_starter:
+                print >> out_file, \
+                    "# This file produced automatically by convert_to_vt.py\n# "
+                found_starter = False
+                
+            if (line.find('import ') != -1 and line.find('vtk') != -1) or \
+                    line.find('VTK_DATA_ROOT = ') != -1 or \
+                    does_continue:
+                if line.rstrip() == 'import vtk':
+                    print >>out_file, 'import sys'
+                    print >>out_file, 'sys.path.append' + \
+                        '("/vistrails/src/trunk/scripts/gen_vtk_examples")'
+                    print >>out_file, 'import vtk_imposter'
+                    print >>out_file, 'from colors import *'
+                    print >>out_file, 'vtk = vtk_imposter.vtk()'
+                    print >>out_file, 'VTK_DATA_ROOT = ""'
+                    print >>out_file, ''
+                    print >>out_file, '#', line[:-1]
+                else:
+                    if line.rstrip()[-1] == '\\':
+                        does_continue = True
+                    else:
+                        does_continue = False
+                    print >>out_file, '#', line[:-1]
+            else:
+                out_file.write(line)
+            line_count += 1
+        print >>out_file, '\nif len(sys.argv) > 1:'
+        print >>out_file, '    out_filename = sys.argv[1]'
+        print >>out_file, 'else:'
+        print >>out_file, '    out_filename = None'
+        print >>out_file, 'vtk.to_vt(out_filename)'
+        out_file.close()
+            
+
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv) < 3:
+        print 'Usage: %s <in_file> <out_py_file>' % sys.argv[0]
+        sys.exit(0)
+    converter = ConvertVTKToVT(*sys.argv[1:])
+    converter.run()
+    
diff --git a/scripts/gen_vtk_examples/copy_vtk_examples.py b/scripts/gen_vtk_examples/copy_vtk_examples.py
new file mode 100644
index 0000000..bc0e20f
--- /dev/null
+++ b/scripts/gen_vtk_examples/copy_vtk_examples.py
@@ -0,0 +1,99 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import sys
+import os
+import re
+from convert_to_vt import ConvertVTKToVT
+
+def run(in_dir, out_dir):
+    def collectFilenames(dir):
+        # create the regular expression matcher machines
+        fileNameParser = re.compile('.*\.py')
+
+        result = []
+        for file in os.listdir(dir):
+            # print childDirOrFile
+            childDirOrFile = os.path.join(dir,file)
+            if os.path.isfile(childDirOrFile):
+                # file does match?
+                if fileNameParser.match(childDirOrFile):
+                    result.append(childDirOrFile)
+            elif os.path.isdir(childDirOrFile):
+                result += collectFilenames(childDirOrFile)
+        return result
+    
+    all_files = collectFilenames(in_dir)
+    in_base = os.path.basename(in_dir)
+    for fname in all_files:
+        path_before = os.path.dirname(fname)
+        path_end = ''
+        while os.path.basename(path_before) != in_base:
+            if os.path.basename(path_before) != 'Python':
+                if path_end == '':
+                    path_end = os.path.basename(path_before)
+                else:
+                    path_end = os.path.join(os.path.basename(path_before), 
+                                            path_end)
+            path_before = os.path.dirname(path_before)
+        out_dirname = os.path.join(out_dir, path_end)
+
+        to_make_dirs = []
+        a_dirname = out_dirname
+        while not os.path.exists(a_dirname):
+            to_make_dirs.append(a_dirname)
+            a_dirname = os.path.dirname(a_dirname)
+        # print >>sys.stderr, 'to_make_dirs:', to_make_dirs
+        for a_dirname in reversed(to_make_dirs):
+            # print >>sys.stderr, 'making dir', a_dirname
+            os.mkdir(a_dirname)
+
+        script_name = os.path.basename(fname)
+        vt_name = os.path.splitext(script_name)[0] + '.vt'
+        out_py_name = os.path.join(out_dirname, script_name)
+        out_vt_name = os.path.join(out_dirname, vt_name)
+
+        converter = ConvertVTKToVT(fname, out_py_name)
+        converter.run()
+
+        print >>sys.stderr, "running 'python %s %s'..." % (out_py_name,
+                                                           out_vt_name)
+        os.system('python %s %s' % (out_py_name, out_vt_name))
+
+if __name__ == '__main__':
+    if len(sys.argv) < 3:
+        print 'Usage: %s <in_directory> <out_directory>' % sys.argv[0]
+        sys.exit(-1)
+    run(*sys.argv[1:])
diff --git a/scripts/gen_vtk_examples/examples_list.txt b/scripts/gen_vtk_examples/examples_list.txt
new file mode 100644
index 0000000..f632974
--- /dev/null
+++ b/scripts/gen_vtk_examples/examples_list.txt
@@ -0,0 +1,83 @@
+Annotation/DispAllFonts.py N vtkTkRenderWindowInteractor
+Annotation/TestText.py YC 
+Annotation/TestTextOldWay.py N python fails vtkTextMapper error (may work)
+Annotation/annotatePick.py N connections and parameters for Pick
+Annotation/cubeAxes.py Y
+Annotation/labeledMesh.py N cycles (vtkSelectVisiblePoints)
+Annotation/multiLineText.py N ShallowCopy and vtkTextMapper error
+Annotation/textOrigin.py YC
+Annotation/xyPlot.py Y
+DataManipulation/Arrays.py Y
+DataManipulation/BuildUGrid.py YC
+DataManipulation/CreateStrip.py Y
+DataManipulation/FinancialField.py N GetRange()[1] vtkProgrammable*
+DataManipulation/marching.py YC
+DataManipulation/pointToCellData.py YC
+GUI/BoxWidget.py N vtkPlanes -- probably can change to make vtkClipPolyData an input to the vtkInteractionHandler
+GUI/CustomInteraction.py N Observers aren't being added
+GUI/ImagePlaneWidget.py N GetWholeExtent assignment to tuple, others
+GUI/ImageTracerWidget.py N scalar range list index, others
+GUI/ImplicitPlaneWidget.py Y
+GUI/OrthogonalPlanesWithTkPhoto.py N non qualified vtk modules
+GUI/ProbeWithPointWidget.py YM multiplication between function and float
+GUI/ProbingWithPlaneWidget.py Y
+GUI/SphereWidget.py N GetElevationBounds()[0]
+GUI/StreamlinesWithLineWidget.py Y a little buggy on updates
+GUI/TransformWithBoxWidget.py Y
+GUI/VolumeRenderWithBoxWidget.py Y
+IO/flamingo.py YC also background color wrong...
+IO/stl.py YC
+ImageProcessing/Contours2D.py YC
+ImageProcessing/ImageInteractor.py N polyDataMapper error + interactor
+Medical/Medical1.py YC
+Medical/Medical2.py YC
+Medical/Medical3.py YC
+Modelling/DelMesh.py N vtkMath.Random()
+Modelling/Delaunay3D.py N vtkMath.Random()
+Modelling/PerlinTerrain.py YC
+Modelling/SpherePuzzle.py N vtkTkRenderWindowInteractor
+Modelling/constrainedDelaunay.py YC
+Modelling/expCos.py N vtkProgrammableFilter
+Modelling/faultLines.py Y
+Modelling/hello.py YC
+Modelling/iceCream.py YC
+Modelling/procrustesAlignment.py N SetInputConnection(int, object)
+Modelling/reconstructSurface.py N SetExecuteMethod
+ParallelProcessing/MPI/ParallelCone.py N non-qualified vtk modules
+Rendering/CADPart.py YC
+Rendering/CSpline.py N vtkMath.Random()
+Rendering/Cylinder.py YC
+Rendering/FilterCADPart.py YC
+Rendering/RenderLargeImage.py N png image header corrputed
+Rendering/TPlane.py YC
+Rendering/assembly.py Y 
+Rendering/rainbow.py Y
+Tutorial/Step1/Cone.py YC
+Tutorial/Step2/Cone2.py YM no observer to do print, removed azimuth loop
+Tutorial/Step3/Cone3.py YMC removed azimuth loop
+Tutorial/Step4/Cone4.py YM removed azimuth loop, extra SetColor
+Tutorial/Step5/Cone5.py Y
+Tutorial/Step6/Cone6.py YM BoxWidget callback and On call
+VisualizationAlgorithms/BandContourTerrain.py Y extra vtkLookupTable
+VisualizationAlgorithms/ClipCow.py YC
+VisualizationAlgorithms/ColorIsosurface.py Y
+VisualizationAlgorithms/CutCombustor.py Y fix SetScalarRange call
+VisualizationAlgorithms/DepthSort.py N Circular vtkActor-vtkDepthSortPolyData
+VisualizationAlgorithms/ExtractGeometry.py Y
+VisualizationAlgorithms/ExtractUGrid.py Y 
+VisualizationAlgorithms/GenerateTextureCoords.py Y
+VisualizationAlgorithms/SubsampleGrid.py Y
+VisualizationAlgorithms/TextureThreshold.py Y
+VisualizationAlgorithms/VisQuad.py Y
+VisualizationAlgorithms/deciFran.py P script isn't written correctly!
+VisualizationAlgorithms/imageWarp.py Y
+VisualizationAlgorithms/officeTube.py Y
+VisualizationAlgorithms/officeTubes.py Y
+VisualizationAlgorithms/probeComb.py Y
+VisualizationAlgorithms/smoothFran.py Y
+VisualizationAlgorithms/spikeF.py Y
+VisualizationAlgorithms/streamSurface.py Y
+VisualizationAlgorithms/warpComb.py Y
+VolumeRendering/PseudoVolumeRendering.py Y
+VolumeRendering/SimpleRayCast.py Y
+VolumeRendering/SimpleTextureMap2D.py Y
diff --git a/scripts/gen_vtk_examples/gen_vtk_examples.py b/scripts/gen_vtk_examples/gen_vtk_examples.py
new file mode 100644
index 0000000..ee7ba28
--- /dev/null
+++ b/scripts/gen_vtk_examples/gen_vtk_examples.py
@@ -0,0 +1,50 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+
+import copy_vtk_examples
+import get_vtk_examples
+
+def run(begin_dir, intermediate_dir, output_dir, 
+        examples_list='examples_list.txt'):
+    copy_vtk_examples.run(begin_dir, intermediate_dir)
+    get_vtk_examples.run(begin_dir, intermediate_dir, output_dir, examples_list)
+    
+if __name__ == '__main__':
+    if len(sys.argv) < 4:
+        print "Usage: python %s " % sys.argv[0] + \
+            "<begin_dir> <intermediate_dir> <out_dir> [examples_list]"
+        sys.exit(-1)
+    run(*sys.argv[1:])
diff --git a/scripts/gen_vtk_examples/get_vtk_examples.py b/scripts/gen_vtk_examples/get_vtk_examples.py
new file mode 100644
index 0000000..95f254f
--- /dev/null
+++ b/scripts/gen_vtk_examples/get_vtk_examples.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+import os
+
+def run(py_dirname, in_dirname, out_dirname, filename='examples_list.txt'):
+    f = open(filename)
+    total = 0
+    total_good = 0
+    for line in f:
+        # print line
+        arr = line.rstrip().split(None, 2)
+        total += 1
+        if arr[1][0] == 'Y':
+            total_good += 1
+
+            vt_file = os.path.splitext(arr[0])[0] + '.vt'
+            py_file = arr[0]
+
+            vt_name = os.path.join(in_dirname, vt_file)
+            out_vt_name = os.path.join(out_dirname, vt_file)
+            py_name = os.path.join(py_dirname, py_file)
+            
+            py_name = os.path.join(os.path.dirname(py_name),
+                                   "Python",
+                                   os.path.basename(py_name))
+            out_py_name = os.path.join(out_dirname, py_file)
+            to_make_dirs = []
+            a_dirname = os.path.dirname(out_vt_name)
+            while not os.path.exists(a_dirname):
+                to_make_dirs.append(a_dirname)
+                a_dirname = os.path.dirname(a_dirname)
+            for a_dirname in reversed(to_make_dirs):
+                # print "os.mkdir('%s')" % a_dirname
+                os.mkdir(a_dirname)
+            
+            # print "os.system('cp %s %s')" % (py_name, out_py_name)
+            # print "os.system('cp %s %s')" % (vt_name, out_vt_name)
+            os.system('cp %s %s' % (py_name, out_py_name))
+            os.system('cp %s %s' % (vt_name, out_vt_name))
+    print "%d of %d" % (total_good, total)
+
+if __name__ == '__main__':
+    if len(sys.argv) < 5:
+        print "Usage: python %s " % sys.argv[0] + \
+            "<python_dir> <in_dir> <out_dir> [examples_list]"
+        sys.exit(-1)
+    run(*sys.argv[1:])
diff --git a/scripts/gen_vtk_examples/vtk_imposter.py b/scripts/gen_vtk_examples/vtk_imposter.py
new file mode 100644
index 0000000..5c02174
--- /dev/null
+++ b/scripts/gen_vtk_examples/vtk_imposter.py
@@ -0,0 +1,106 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+class vtk_base(object):
+    def __init__(self, n=None, *args, **kwargs):
+        self._name = n
+        self._args = args
+        self._kwargs = kwargs
+        
+    def __call__(self, *args, **kwargs):
+        # print 'calling %s __call__ with' % self.__class__.__name__, \
+        #     args, kwargs
+        return self.__class__.__dict__['_call'](self, self.n, *args, **kwargs)
+        
+    def __getattr__(self, name):
+        # print 'calling %s __getattr__ with' % self.__class__.__name__, name
+        if name in ('__str__','__repr__'): 
+            return lambda: 'instance of %s at %s' % (str(self.__class__), 
+                                                     id(self))
+        self.n = name
+        return self
+
+    def _call(self, n, *args, **kwargs):
+        # print 'calling _call with', n, args, kwargs
+        pass
+
+class vtk_function(vtk_base):
+    id_count = 0
+
+    def __init__(self, n=None, parent=None, *args, **kwargs):
+        vtk_base.__init__(self, n, *args, **kwargs)
+        self.parent = parent
+        self.sub_functions = []
+        self.id = vtk_function.id_count
+        vtk_function.id_count += 1
+
+    def _call(self, n, *args, **kwargs):
+        vtk_base._call(self, n, *args, **kwargs)
+        new_sub_function = vtk_function(n, self, *args, **kwargs)
+        self.__dict__['sub_functions'].append(new_sub_function)
+        return new_sub_function
+
+class vtk_module(vtk_base):
+    def __init__(self, n=None, *args, **kwargs):
+        vtk_base.__init__(self, n, *args, **kwargs)
+        self.functions = []
+
+    def _call(self, n, *args, **kwargs):
+        vtk_base._call(self, n, *args, **kwargs)
+        new_function = vtk_function(n, self, *args, **kwargs)
+        self.__dict__['functions'].append(new_function)
+        return new_function
+    
+class vtk(vtk_base):
+
+    def __init__(self, n=None, *args, **kwargs):
+        vtk_base.__init__(self, n, *args, **kwargs)
+        self.modules = []
+        # print 'self.__dict__:', self.__dict__
+
+    def _call(self, n, *args, **kwargs):
+        vtk_base._call(self, n, *args, **kwargs)
+        new_module = vtk_module(n, *args, **kwargs)
+        self.__dict__['modules'].append(new_module)
+        return new_module
+
+    def to_vt(self, filename):
+        from vtk_to_vt import VTK2VT
+        my_writer = VTK2VT()
+        for module in self.modules:
+            my_writer.create_module(module)
+        for module in self.modules:
+            my_writer.create_functions(module)
+        my_writer.print_vt(filename)
diff --git a/scripts/gen_vtk_examples/vtk_to_vt.py b/scripts/gen_vtk_examples/vtk_to_vt.py
new file mode 100644
index 0000000..4d2a705
--- /dev/null
+++ b/scripts/gen_vtk_examples/vtk_to_vt.py
@@ -0,0 +1,1117 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import sys
+sys.path.append('/vistrails/src/trunk/vistrails')
+import os
+os.environ['EXECUTABLEPATH'] = ""
+import copy
+import datetime
+import re
+import urllib
+
+from vistrails.db.domain import DBModule, DBConnection, DBPort, DBFunction, \
+    DBParameter, DBLocation, DBPortSpec, DBTag, DBAnnotation, DBVistrail, \
+    DBRegistry
+import vistrails.db.services.io
+from vistrails.db.services.io import SaveBundle
+from vtk_imposter import vtk_module, vtk_function
+
+class VTK2VT(object):
+    vtk_data_url = 'http://www.vtk.org/files/release/5.0/vtkdata-5.0.4.zip'
+    package_name = 'edu.utah.sci.vistrails.vtk'
+    basic_name = 'edu.utah.sci.vistrails.basic'
+    pythoncalc_name = 'edu.utah.sci.vistrails.pythoncalc'
+    http_name = 'edu.utah.sci.vistrails.http'
+    variant_sigstring ='(edu.utah.sci.vistrails.basic:Tuple)'
+    unused_functions = set(['Update', 
+                            'Read', 
+                            'Write', 
+                            'Start', 
+                            'Initialize',
+                            'Render', 
+                            'PlaceWidget', 
+                            'AddObserver',
+                            'SetSize',
+                            ])
+    translate_ports = {'SetInputConnection': {None: 'SetInputConnection0'},
+                       'GetOutputPort': {None: 'GetOutputPort0'},
+                       'SetRenderWindow': {None: 'SetVTKCell'},
+                       'SetInteractorStyle': {None: 'InteractorStyle'},
+                       'ResetCamera': {None: 'ResetCamera'},
+                       'AddInput': {None: 'AddInput',
+                                    'vtkXYPlotActor': 'AddInput_2'},
+                       'SetInput': {None: 'SetInput',
+                                    'vtkPolyDataNormals': 'SetInput_1',
+                                    'vtkGlyph3D': 'SetInput_1',
+                                    'vtkDelaunay2D': 'SetInput_1',
+                                    'vtkDelaunay3D': 'SetInput_1',
+                                    'vtkWarpVector': 'SetInput_1',
+                                    'vtkContourFilter': 'SetInput_1',
+                                    'vtkTubeFilter': 'SetInput_1',
+                                    'vtkThresholdPoints': 'SetInput_1',
+                                    'vtkProbeFilter': 'SetInput_1',
+                                    'vtkTriangleFilter': 'SetInput_1',
+                                    'vtkBandedPolyDataContourFilter': \
+                                        'SetInput_1',
+                                    'vtkWarpScalar': 'SetInput_1'},
+                       'SetSourceConnection': {None: 'SetSourceConnection',
+                                               'vtkGlyph3D': \
+                                                   'SetSourceConnection_2'},
+                       'AddFunction': {None: 'AddFunction',
+                                       ('vtkImplicitSum', 'vtkPlane'): \
+                                           'AddFunction_2',
+                                       ('vtkImplicitSum', 'Tuple'): \
+                                           'AddFunction_1'},
+                       'SetColor': {None: 'SetColor',
+                                    ('vtkVolumeProperty', 
+                                     'vtkColorTransferFunction'): \
+                                        'SetColor_4',
+                                    ('vtkVolumeProperty', 
+                                     'vtkPiecewiseFunction'): \
+                                        'SetColor_2'},
+                       'SetScalarOpacity': {None: 'SetScalarOpacity',
+                                            'vtkVolumeProperty': \
+                                                'SetScalarOpacity_2'},
+                       'SetSource': {None: 'SetSource',
+                                     'vtkGlyph3D': 'SetSource_1'},
+                       }
+
+    inspector_functions = {'GetScalarRange': 'vtkDataSetInspector',
+                           'GetCenter': 'vtkDataSetInspector',
+                           'GetNumberOfCells': 'vtkDataSetInspector',
+                           'GetNumberOfPoints': 'vtkDataSetInspector',
+                           'GetLength': 'vtkDataSetInspector',
+                           'GetBounds': 'vtkDataSetInspector',
+                           'GetPointData': 'vtkDataSetInspector',
+                           'GetCellData': 'vtkDataSetInspector',
+                           'GetVerts': 'vtkPolyDataInspector',
+                           'GetPoints': 'vtkPolyDataInspector',
+                           'GetLines': 'vtkPolyDataInspector',
+                           'GetStrips': 'vtkPolyDataInspector',
+                           'GetPoints': 'vtkPolyDataInspector',
+                           'GetNumberOfVerts': 'vtkPolyDataInspector',
+                           'GetNumberOfPoints': 'vtkPolyDataInspector',
+                           'GetNumberOfPolys': 'vtkPolyDataInspector',
+                           'GetNumberOfStrips': 'vtkPolyDataInspector',
+                           'GetScalars': 'vtkDataSetAttributesInspector',
+                           'GetVectors': 'vtkDataSetAttributesInspector',
+                           'GetNormals': 'vtkDataSetAttributesInspector',
+                           'GetTCoords': 'vtkDataSetAttributesInspector',
+                           'GetTensors': 'vtkDataSetAttributesInspector',
+                           'GetGlobalIds': 'vtkDataSetAttributesInspector',
+                           'GetPedigreeIds': 'vtkDataSetAttributesInspector',
+                           'GetMaxNorm': 'vtkDataArrayInspector',
+                           'GetRange': 'vtkDataArrayInspector',
+                           }
+                           
+    getters = {'GetProperty': {None: ('SetProperty', 'vtkProperty', None),
+                               'vtkXYPlotActor': ('SetProperty',
+                                                  'vtkProperty2D', None)}, 
+               'GetActiveCamera': {None: ('SetActiveCamera', 
+                                          'vtkCamera', None)},
+               'GetTitleTextProperty':{None: ('SetTitleTextProperty', 
+                                              'vtkTextProperty',
+                                              [('BoldOn',),
+                                               ('ItalicOn',),
+                                               ('ShadowOn',),
+                                               ('SetFontFamilyToArial',)])},
+               'GetTextProperty': {None: ('SetTextProperty', 
+                                          'vtkTextProperty', None)},
+               'GetPointData': {None: ('SetPointData', 'vtkPointData', None)},
+               'GetCellData': {None: ('SetCellData', 'vtkCellData', None)},
+               'GetPointIds': {None: ('SetPointIds', 'vtkIdList', None),
+                               'vtkVoxel': ('SetPointIds', 'vtkIdList',
+                                            [('SetNumberOfIds', 8)]),
+                               'vtkHexahedron': ('SetPointIds', 'vtkIdList',
+                                                 [('SetNumberOfIds', 8)]),
+                               'vtkTetra': ('SetPointIds', 'vtkIdList',
+                                            [('SetNumberOfIds', 4)]),
+                               'vtkWedge': ('SetPointIds', 'vtkIdList',
+                                            [('SetNumberOfIds', 6)]),
+                               'vtkPyramid': ('SetPointIds', 'vtkIdList',
+                                              [('SetNumberOfIds', 5)]),
+                               'vtkPixel': ('SetPointIds', 'vtkIdList',
+                                            [('SetNumberOfIds', 4)]), 
+                               'vtkQuad': ('SetPointIds', 'vtkIdList',
+                                           [('SetNumberOfIds', 4)]), 
+                               'vtkTriangle': ('SetPointIds', 'vtkIdList',
+                                               [('SetNumberOfIds', 3)]), 
+                               'vtkLine': ('SetPointIds', 'vtkIdList',
+                                           [('SetNumberOfIds', 2)]), 
+                               'vtkVertex': ('SetPointIds', 'vtkIdList',
+                                             [('SetNumberOfIds', 1)]), 
+                               },
+               'GetRenderWindow': {None: ('SetVTKCell', 'VTKCell', None)},
+               }
+
+    set_file_name_pattern = re.compile('Set.*FileName$')
+
+    def __init__(self):
+        self.created_modules = {}
+        self.modules = {}
+        self.vt_modules = {}
+        self.vtk_modules = {}
+        self.connections = {}
+        self.vt_f_connections = {}
+        self.vt_b_connections = {}
+        self.max_module_id = 0
+        self.max_location_id = 0
+        self.max_function_id = 0
+        self.max_parameter_id = 0
+        self.max_connection_id = 0
+        self.max_port_id = 0
+        self.max_port_spec_id = 0
+        self.http_module = None
+
+        r_file = '/vistrails/registry.xml'
+        self.registry = vistrails.db.services.io.open_registry_from_xml(r_file)
+        self.registry_desc_idx = {}
+        for package in self.registry.db_packages:
+            for desc in package.db_module_descriptors:
+                self.registry_desc_idx[desc.db_id] = desc
+
+    def create_module(self, module):
+        # print 'creating module', module._name, id(module)
+        module_name = module._name
+        package_name = self.package_name
+        if module_name == 'vtkRenderWindow':
+            module_name = 'VTKCell'
+        elif module_name == 'vtkRenderWindowInteractor':
+            return
+        elif module_name == 'Tuple' or module_name == 'Unzip':
+            package_name = self.basic_name
+        elif module_name == 'PythonCalc':
+            package_name = self.pythoncalc_name
+        elif module_name == 'HTTPFile':
+            package_name = self.http_name
+        db_module = DBModule(id=self.max_module_id,
+                             name=module_name,
+                             package=package_name,
+                             location=DBLocation(id=self.max_location_id, 
+                                                 x=0.0, y=0.0),
+                             )
+        self.max_module_id += 1
+        self.max_location_id += 1
+        self.modules[id(module)] = db_module
+        self.vt_modules[db_module.db_id] = db_module
+        self.vtk_modules[id(module)] = module
+        # self.vt_f_connections[db_module.db_id] = []
+        # self.vt_b_connections[db_module.db_id] = []
+
+    def save_modules(self):
+        self.saved_functions = {}
+        for k, module in self.vtk_modules.iteritems():
+            self.saved_functions[k] = module.functions
+            module.functions = []
+            
+    def restore_modules(self):
+        for k, module in self.vtk_modules.iteritems():
+            module.functions = self.saved_functions[k]
+    
+    def do_layout(self):
+        queue = []
+        # sinks = []
+        vt_b_connections = self.vt_f_connections
+        vt_f_connections = self.vt_b_connections
+        b_connections = copy.deepcopy(vt_b_connections)
+        f_connections = copy.deepcopy(vt_f_connections)
+        for m_id, module in self.vt_modules.iteritems():
+            if m_id not in b_connections:
+                queue.append((module, 0))
+            # if module.db_id not in f_connections:
+            #     sinks.append([set([module])])
+
+        # print >>sys.stderr, 'queue:', queue
+        # topological sort
+        t_sort = []
+        for module, level in queue:
+            t_sort.append((module, level))
+            if module.db_id in f_connections:
+                for (next_id, _) in f_connections[module.db_id]:
+                    next_module = self.vt_modules[next_id]
+                    if next_module.db_id in b_connections:
+                        if len(b_connections[next_module.db_id]) == 0:
+                            continue
+                        remaining_list = b_connections[next_module.db_id][:]
+                        for t in remaining_list:
+                            if t[0] == module.db_id:
+                                b_connections[next_module.db_id].remove(t)
+                        if len(b_connections[next_module.db_id]) == 0:
+                            queue.append((next_module, level+1))
+        
+        # print >>sys.stderr, [(m.db_name, ell) for (m, ell) in t_sort]
+        levels = {}
+        module_levels = {}
+        for (m, ell) in t_sort:
+            if ell not in levels:
+                levels[ell] = []
+            levels[ell].append(m)
+            module_levels[m.db_id] = ell
+
+        for level, m_list in sorted(levels.iteritems()):
+            for i, m in enumerate(m_list):
+                if i >= len(m_list) - 1:
+                    continue
+
+                m_next = m_list[i+1]
+                m_idxs = []
+                m_next_idxs = []
+                if m.db_id not in vt_b_connections:
+                    continue
+                if m_next.db_id not in vt_b_connections:
+                    continue
+                for (n_id, _) in vt_b_connections[m.db_id]:
+                    n = self.vt_modules[n_id]
+                    n_idx = levels[module_levels[n_id]].index(n)
+                    m_idxs.append(n_idx)
+                for (n_id, _) in vt_b_connections[m_next.db_id]:
+                    n = self.vt_modules[n_id]
+                    n_idx = levels[module_levels[n_id]].index(n)
+                    m_next_idxs.append(n_idx)
+                num_overlaps_f = 0
+                num_overlaps_b = 0
+                for m_idx in m_idxs:
+                    for m_next_idx in m_next_idxs:
+                        if m_idx == m_next_idx:
+                            continue
+                        elif m_idx < m_next_idx:
+                            num_overlaps_b += 1
+                        else:
+                            num_overlaps_f += 1
+                if num_overlaps_f > num_overlaps_b:
+                    # swap
+                    swap = m_list[i]
+                    m_list[i] = m_list[i+1]
+                    m_list[i+1] = swap
+                                
+        dx = 250.0
+        dy = 100.0
+        current_y = 0.0
+        for level, m_list in levels.iteritems():
+            current_x = - (len(m_list) * dx) / 2.0
+            for m in m_list:
+                m.db_location.db_x = current_x
+                m.db_location.db_y = current_y
+                current_x += dx
+            current_y += dy
+                   
+    def get_vtk_cell(self, interactor):
+        found_vtk_cell = False
+        if interactor._name == 'vtkRenderWindowInteractor':
+            found_vtk_cell = False
+            for function in interactor.functions:
+                if function._name == 'SetRenderWindow' and \
+                        len(function._args) == 1 and \
+                        type(function._args[0]) == vtk_module:
+                    # use VTKCell to translate calls
+                    function_list = interactor.functions
+                    module = function._args[0]
+                    found_vtk_cell = True
+                    break
+        if found_vtk_cell:
+            return (module, function_list)
+        else:
+            print >>sys.stderr, "ERROR: cannot find VTKCell for Interactor"
+        return (None, None)
+    
+    def create_functions(self, module, function_list=None, f_pos=0):
+        # print >>sys.stderr, 'creating functions:', module._name
+#         import traceback
+#         traceback.print_stack(file=sys.stderr)
+        if module._name == 'vtkRenderWindowInteractor':
+            (module, new_function_list) = self.get_vtk_cell(module)
+            if not module:
+                # punt on it in this case
+                return
+            else:
+                function_list = []
+                for function in new_function_list[:]:
+                    if type(function.parent) == vtk_module:
+                        function.parent = module
+                    if function._name != 'SetRenderWindow':
+                        function_list.append(function)
+        if function_list is None:
+            function_list = module.functions
+        for function in function_list:
+            # print >>sys.stderr, '  creating:', function._name
+            db_function = self.create_function(function, f_pos)
+            if db_function:
+                self.modules[id(module)].db_add_function(db_function)
+                f_pos += 1
+        return f_pos
+
+    def find_or_create_module(self, function, allow_sub=True):
+#         print >>sys.stderr, 'find_or_create:', function._name, \
+#             function.parent._name, id(function)
+        parent_name = function.parent._name
+
+#                    'GetPositionCoordinate': {None: ('SetPosition',
+#                                                     'vtkCoordinate')},
+#                    'GetPosition2Coordinate': {None: ('SetPosition2',
+#                                                      'vtkCoordinate')}
+#                    }
+        
+        # if we have a getter, than check this stuff
+        if function._name.startswith('Get') and len(function._args) == 0 and \
+                len(function.sub_functions) == 1 and \
+                function.sub_functions[0]._name in self.inspector_functions:
+            # print >>sys.stderr, ">> found inspector function"
+            # print >>sys.stderr, "  ", function._name, function.parent._name
+            inspector_name = \
+                self.inspector_functions[function.sub_functions[0]._name]
+            key = (id(function.parent), function._name)
+            # print >>sys.stderr, '  ', key
+
+            out_function = function.sub_functions[0]
+            if key in self.created_modules:
+                inspector_module = self.created_modules[key]
+            else:
+                inspector_module = vtk_module(inspector_name)
+                self.create_module(inspector_module)
+                self.created_modules[key] = inspector_module
+
+                # need to attach first piece of call to inspector input
+                in_function = vtk_function('SetInput')
+                in_function.parent = inspector_module
+                function.sub_functions = []
+                in_function._args = [function]
+                inspector_module.functions.append(in_function)
+                self.create_functions(inspector_module, [in_function])
+            # need to attach rest to inspector output
+            found = False
+            out_function.parent = inspector_module
+            for old_function in inspector_module.functions:
+                if old_function._name == out_function._name and \
+                        (len(old_function.sub_functions) == 0 or
+                         len(out_function.sub_functions) == 0 or
+                         old_function.sub_functions[0]._name == \
+                             old_function.sub_functions[0]._name):
+                    found = True
+                    break
+            if not found:
+                inspector_module.functions.append(out_function)
+                self.create_functions(inspector_module, [out_function])
+            return (inspector_module, True)
+        elif function._name in self.getters and \
+                (function._name not in self.inspector_functions or
+                 self.inspector_functions[function._name] != \
+                     function.parent._name):
+#             and len(function.sub_functions) == 1 \
+#                 and function.sub_functions[0]._name not in \
+#                 self.inspector_functions:
+            # print >>sys.stderr, '>>', function._name, 'found in getters'
+            if not allow_sub:
+                print >>sys.stderr, "ERROR: sub function has getter"
+            key = (id(function.parent), function._name)
+            if key in self.created_modules:
+                p_module = self.created_modules[key]
+#                 print >>sys.stderr, "found in created_modules:", \
+#                     p_module._name
+                return (p_module, False)
+            if parent_name in self.getters[function._name]:
+                (setter, module_name, function_list) = \
+                    self.getters[function._name][parent_name]
+            else:
+                (setter, module_name, function_list) = \
+                    self.getters[function._name][None]
+#             print >>sys.stderr, 'self.getters:', self.getters[function._name]
+            found_setter = False
+            for p_function in function.parent.functions:
+                if p_function._name == setter:
+                    found_setter = True
+                    for arg in p_function._args:
+                        if type(arg) == vtk_module:
+                            p_module = arg
+                        else:
+                            if arg == function:
+                                found_setter = False
+                            else:
+                                p_module = arg.parent
+                    if found_setter and type(p_module) != vtk_module:
+                        print >>sys.stderr, "ERROR: type of p_module incorrect"
+                        found_setter = False
+                    if found_setter:
+                        # print >>sys.stderr, "found", module_name, p_module._name
+                        self.create_functions(p_module, function.sub_functions)
+                        return (p_module, False)
+            if not found_setter:
+                # print >>sys.stderr, "doing create for", module_name
+                p_module = \
+                    self.create_module_for_get(function, setter, module_name,
+                                               function_list)
+                # print >>sys.stderr, id(p_module)
+            return (p_module, False)
+        return (None, False)
+
+    def create_module_for_get(self, function, setter, module_name, 
+                              function_list=None):
+        # create new vtkProperty module
+        # add connection to parent module on SetProperty call
+        # for sub_function in function.sub_functions:
+            # add each sub_function to the vtkProperty module
+        src_module = None
+        # if len(function.sub_functions) > 0:
+
+        db_module = DBModule(id=self.max_module_id,
+                     name=module_name,
+                     package=self.package_name,
+                     location=DBLocation(id=self.max_location_id, 
+                                         x=0.0, y=0.0),
+                     )
+        self.max_module_id += 1
+        self.max_location_id += 1
+        src_module = vtk_module(module_name)                
+        self.modules[id(src_module)] = db_module
+        self.vt_modules[db_module.db_id] = db_module
+        self.vtk_modules[id(src_module)] = src_module
+        if function_list:
+            src_functions = []
+            for f in function_list:
+                # doesn't work for functions with args yet
+                src_function = vtk_function(f[0])
+                if len(f) > 1:
+                    src_function._args = list(f[1:])
+                src_function.parent = src_module
+                src_functions.append(src_function)
+                # print >>sys.stderr, '**', src_function._name
+            # src_module.functions = src_functions
+            self.create_functions(src_module, src_functions)
+            # print >>sys.stderr, "** done with create"
+
+        # self.vt_f_connections[db_module.db_id] = []
+        # self.vt_b_connections[db_module.db_id] = []
+        self.created_modules[(id(function.parent), function._name)] = \
+            src_module
+        dst_function = vtk_function(setter)
+        dst_function.parent = function.parent
+        self.create_connection(src_module, dst_function)
+
+        return src_module
+
+    def create_tuple(self, function):
+        tuple_module = vtk_module('Tuple')
+        tuple_module.blah()
+        self.create_module(tuple_module)
+        db_tuple_module = self.modules[id(tuple_module)]
+        tuple_f_pos = 0
+        final_sigs = []
+        for i, arg in enumerate(function._args):
+            port_spec = DBPortSpec(id=self.max_port_spec_id,
+                                   name='arg' + str(i),
+                                   type='input',
+                                   sigstring=self.variant_sigstring)
+            db_tuple_module.db_add_portSpec(port_spec)
+            self.max_port_spec_id += 1
+            if type(arg) == vtk_module or \
+                    type(arg) == vtk_function:
+                # connection
+                tuple_function = vtk_function('arg' + str(i))
+                tuple_function.parent = tuple_module
+                conn = self.create_connection(arg, tuple_function)
+                port_spec.db_sigstring = \
+                    conn.db_ports_type_index['source'].db_signature
+                conn.db_ports_type_index['destination'].db_signature = \
+                    port_spec.db_sigstring
+                final_sigs.append(port_spec.db_sigstring[1:-1])
+            else:
+                db_parameters = self.get_parameters([arg])
+                db_function = DBFunction(id=self.max_function_id,
+                                         name='arg' + str(i),
+                                         pos=tuple_f_pos,
+                                         parameters=db_parameters,
+                                         )
+                self.max_function_id += 1
+                tuple_f_pos += 1
+                db_tuple_module.db_add_function(db_function)
+                port_spec.db_sigstring = \
+                    "(" + ','.join(p.db_type for p in db_parameters) + ")"
+                final_sigs.extend(p.db_type for p in db_parameters)
+        final_sigstring = "(" + ",".join(final_sigs) + ")"
+        port_spec = DBPortSpec(id=self.max_port_spec_id,
+                               name='value',
+                               type='output',
+                               sigstring=final_sigstring)
+        db_tuple_module.db_add_portSpec(port_spec)
+        self.max_port_spec_id += 1
+        tuple_output = vtk_function('value')
+        tuple_output.parent = tuple_module
+        self.create_connection(tuple_output, function)
+        return tuple_module
+
+    def get_parameters(self, params):
+        def get_type(arg):
+            python_types = {int: 'edu.utah.sci.vistrails.basic:Integer', 
+                            str: 'edu.utah.sci.vistrails.basic:String', 
+                            float: 'edu.utah.sci.vistrails.basic:Float',
+                            bool: 'edu.utah.sci.vistrails.basic:Boolean'}
+            if type(arg) not in python_types:
+                return None
+            return python_types[type(arg)]
+        # end get_type
+
+        def create_param(arg, position):
+            p_type = get_type(arg)
+            if p_type:
+                p = DBParameter(id=self.max_parameter_id,
+                            type=p_type,
+                            val=arg,
+                            pos=position,
+                            )
+                db_parameters.append(p)
+                self.max_parameter_id += 1
+                position += 1
+            return position
+        # end create_param
+
+        db_parameters = []
+        pos = 0
+        for arg in params:
+            if type(arg) == tuple:
+                for tuple_arg in arg:
+                    pos = create_param(tuple_arg, pos)
+            else:
+                pos = create_param(arg, pos)
+        return db_parameters
+    # end get_parameters
+        
+
+    def create_function(self, function, f_pos, allow_sub=True):
+
+        # print >>sys.stderr, 'type(function.parent):', type(function.parent)
+        db_function = None
+        (p_module, _) = self.find_or_create_module(function, allow_sub)
+        if p_module:
+            # print >>sys.stderr, 'found p_module', p_module._name, 'for', function._name
+            add_functions = []
+            for sub_function in function.sub_functions:
+                if not sub_function._name.startswith('Get'):
+                    # print >>sys.stderr, 'adding function:', sub_function._name
+                    add_functions.append(sub_function)
+            self.create_functions(p_module, add_functions, 
+                                  len(self.modules[id(p_module)].db_functions))
+#             self.create_functions(p_module, function.sub_functions,
+#                                   len(self.modules[id(p_module)].db_functions))
+            db_function = None
+        else:
+            if function._name in self.unused_functions:
+                return None
+            parameters = []
+            connections = []
+            for arg in function._args:
+                if type(arg) == vtk_module or \
+                        type(arg) == vtk_function:                    
+                    connections.append(arg)
+                else:
+                    parameters.append(arg)
+
+            if len(function._args) == 0 and \
+                    len(function.sub_functions) == 0 and \
+                    not function._name.startswith('Get'):
+                parameters.append(None)
+            elif function._name.startswith('Get'):
+                parameters = []
+                connections = []
+#             if function._name == 'SetScalarRange' and \
+#                     len(function._args) == 1:
+#                 # use a vtkDataSetInspector to get scalar range
+#                 arg = function._args[0]
+#                 if type(arg) == vtk_function and \
+#                         type(arg.parent) == vtk_function and \
+#                         arg._name == 'GetScalarRange' and \
+#                         arg.parent._name == 'GetOutput':
+#                     inspector_module = vtk_module('vtkDataSetInspector')
+#                     inspector_module.SetInputConnection(
+#                         arg.parent.parent.GetOutputPort())
+#                     self.create_module(inspector_module)
+#                     self.create_functions(inspector_module)
+
+#                     function._args = (inspector_module.GetScalarRange(),)
+#                     connections = [function._args[0]]
+#             elif function._name == 'GenerateValues' and \
+#                     len(function._args) == 2:
+#                 # use a vtkDataSetInspector to get scalar range
+#                 arg = function._args[0]
+#                 if type(arg) != int:
+#                     print >>sys.stderr, \
+#                         "ERROR: GenerateValues first arg type is incorrect"
+#                     return None
+#                 arg = function._args[1]
+#                 if type(arg) == vtk_function and \
+#                         type(arg.parent) == vtk_function and \
+#                         arg._name == 'GetScalarRange' and \
+#                         arg.parent._name == 'GetOutput':
+#                     inspector_module = vtk_module('vtkDataSetInspector')
+#                     inspector_module.SetInputConnection(
+#                         arg.parent.parent.GetOutputPort())
+#                     self.create_module(inspector_module)
+#                     self.create_functions(inspector_module)
+
+#                     function._args = (function._args[0], 
+#                                       inspector_module.GetScalarRange())
+#                     connections = [function._args[1]]
+#                     parameters = [function._args[0]]   
+            if self.set_file_name_pattern.match(function._name) and \
+                    type(function.parent) == vtk_module and \
+                    len(function._args) == 1 and \
+                    type(function._args[0]) == str:
+                # replace SetFileName with a HTTPFile -> Unzip -> SetFile
+                if not self.http_module:
+                    self.http_module = vtk_module('HTTPFile')
+                    self.http_module.url(self.vtk_data_url)
+                    self.create_module(self.http_module)
+                    self.create_functions(self.http_module)
+                unzip_module = vtk_module('Unzip')
+                self.create_module(unzip_module)
+                unzip_module.filename_in_archive(function._args[0][1:])
+                unzip_module.archive_file(self.http_module.file())
+                self.create_functions(unzip_module)
+                set_file_function = vtk_function(function._name[:-4])
+                set_file_function.parent = function.parent
+                set_file_function._args = [unzip_module.file()]
+                self.create_functions(function.parent, [set_file_function])
+                return None
+            if function._name == 'SetInteractor' and \
+                    len(function._args) == 1 and \
+                    type(function._args[0]) == vtk_module and \
+                    type(function.parent) == vtk_module:
+                observer_module = function.parent
+                for a_function in observer_module.functions:
+                    # right way to do this is to make SharedData a Tuple
+                    if a_function._name == 'AddObserver' and \
+                            len(a_function._args) == 2: 
+                        (vtk_cell, _) = self.get_vtk_cell(function._args[0])
+                        handler_module = vtk_module('vtkInteractionHandler')
+                        handler_module.Observer(function.parent)
+                        self.create_module(handler_module)
+                        vtk_cell.InteractionHandler(handler_module)
+                        for b_index, b_function in \
+                                enumerate(vtk_cell.functions):
+                            if b_function._name == 'InteractionHandler':
+                                break
+                        # probably need to make this position right...
+                        self.create_functions(vtk_cell, [b_function],
+                                              len(self.modules[id(vtk_cell)].db_functions))
+                        del vtk_cell.functions[b_index]
+                     
+                        # print >>sys.stderr, a_function._args
+                        (event_type, python_function) = a_function._args
+                        # print >>sys.stderr, 'AddObserver', event_type, \
+                        #     'executing'
+                        self.save_modules()
+                        python_function(observer_module, None)
+                        f = event_type[0].lower() + event_type[1:]
+                        f = f.replace('Event', 'Handler')
+                        handler_code = 'def %s(observer, shareddata):\n' % f
+                        # probably need to order the function calls here
+                        # ideally, this would be an abstraction of some sort
+                        shared_data = set()
+                        for s_module in self.vtk_modules.itervalues():
+                            if len(s_module.functions) > 0:
+                                if not s_module._name == 'vtkRenderWindow':
+                                    shared_data.add(s_module)
+                                    # print >>sys.stderr, s_module._name
+                                    for s_function in s_module.functions:
+                                        for s_arg in s_function._args:
+                                            while type(s_arg) == vtk_function:
+                                                s_arg = s_arg.parent
+                                            if type(s_arg) == vtk_module:
+                                                shared_data.add(s_arg)
+                                                #print >>sys.stderr, s_arg._name
+
+                        s_codelines = []
+                        s_arg_map = {}
+                        s_arg_idx = 1
+
+                        if len(shared_data) < 1 or (len(shared_data) == 1 and \
+                                                        observer_module in \
+                                                        shared_data):
+                            handler_code += '    pass\n'
+                        else:
+                            if len(shared_data) > 2:
+                                handler_code += '    ('
+                                comma = ','
+                            else:
+                                handler_code += '    '
+                                comma = ''
+                            for s_module in shared_data:
+                                if s_module != observer_module:
+                                    handler_code += 'arg' + str(s_arg_idx) + \
+                                        comma
+                                    s_arg_map[id(s_module)] = s_arg_idx
+                                    loop_arg_idx = s_arg_idx
+                                    s_arg_idx += 1
+                                else:
+                                    loop_arg_idx = 0
+                                for s_function in s_module.functions:
+                                    s_line = (s_function.id, loop_arg_idx, 
+                                              s_function)
+                                    # print >>sys.stderr, "s_line:", s_line
+                                    s_codelines.append(s_line)
+                            if len(shared_data) > 2:
+                                handler_code += ') = shareddata\n'
+                            else:
+                                handler_code += ' = shareddata\n'
+                            # need to assign input module names, then write code
+                            s_codelines.sort()
+
+                            # need to check to see if an arg...
+                            for (_, m_idx, s_function) in s_codelines:
+                                s_module_name = 'observer' if m_idx == 0 else \
+                                    'arg%d.vtkInstance' % m_idx
+                                s_function_str = s_function._name
+                                while len(s_function.sub_functions) > 0:
+                                    if len(s_function.sub_functions) > 1:
+                                        print >> sys.stderr, \
+                                            "ERROR: too many subfunctions"
+                                    # FIXME need to do args here, too
+                                    s_function_str += '().' + \
+                                        s_function.sub_functions[0]._name
+                                    s_function = s_function.sub_functions[0]
+                                handler_code += '    %s.%s(' % \
+                                    (s_module_name, s_function_str)
+
+                                s_arg_str = ''
+                                for arg in s_function._args:
+                                    if type(arg) == vtk_module:
+                                        s_module = arg
+                                    elif type(arg) == vtk_function:
+                                        s_module = arg.parent
+                                    else:
+                                        s_arg_str += arg + ', '
+                                        continue
+                                    m_idx = s_arg_map[id(s_module)]
+                                    s_module_name = 'observer' if m_idx == 0 \
+                                        else 'arg%d.vtkInstance' % m_idx
+                                    if type(arg) == vtk_module:
+                                        s_arg_str += s_module_name
+                                    else:
+                                        s_arg_str += s_module_name + \
+                                            arg._name + '()'
+                                handler_code += s_arg_str + ')\n'
+                                    
+                                    
+                        self.restore_modules()                        
+                        # print >>sys.stderr, handler_code
+#                         s_data_function = vtk_function('SharedData')
+#                         s_data_function.parent = handler_module
+#                         s_data_function._args = list(shared_data)
+                        shared_data.discard(observer_module)
+                        shared_data.discard(handler_module)
+                        handler_module.SharedData(*shared_data)
+                        handler_module.Handler(urllib.quote(handler_code))
+                        # print >> sys.stderr, "shared_data", shared_data
+                        # functions.append(s_data_function)
+                        self.create_functions(handler_module)
+
+                return None
+            elif len(function.sub_functions) == 1:
+                sub_function = function.sub_functions[0]
+                if function._name == 'GetPositionCoordinate' and \
+                        sub_function._name == 'SetValue':
+                    # print >>sys.stderr, 'sub_function:', sub_function._args[:2]
+                    new_function = vtk_function('SetPosition')
+                    new_function._args = sub_function._args[:2]
+                    new_function._kwargs = sub_function._kwargs
+                    new_function.parent = function.parent
+                    function = new_function
+                    parameters.extend(new_function._args)
+                elif function._name == 'GetPosition2Coordinate' and \
+                        sub_function._name == 'SetValue':
+                    # print >>sys.stderr, 'sub_function:', sub_function._args[:2]
+                    new_function = vtk_function('SetPosition2')
+                    new_function._args = sub_function._args[:2]
+                    new_function._kwargs = sub_function._kwargs
+                    new_function.parent = function.parent
+                    function = new_function
+                    parameters.extend(new_function._args)
+                    
+#                 # we need to use a Tuple module
+#                 tuple_module = vtk_module('Tuple')
+#                 self.create_module(tuple_module)
+#                 new_arg_list = []
+#                 for arg in function._args:
+#                     if type(arg) == vtk_module or \
+#                             type(arg) == vtk_function:
+#                         self.create_connection(arg, tuple_module)
+#                     else:
+#                         new_arg_list.append(arg)
+#                 tuple_function = vtk_function(
+#                 function._args = 
+
+            if len(connections) > 0:
+                if len(connections) > 1 or len(parameters) > 0:
+                    # need tuple
+                    tuple_module = self.create_tuple(function)
+                    db_function = None
+                else:
+                    if allow_sub:
+                        for arg in connections:
+                            self.create_connection(arg, function)
+                    else:
+                        print >>sys.stderr, \
+                            "ERROR: sub function has connections"
+            elif len(parameters) > 0:
+                db_parameters = self.get_parameters(parameters)
+                db_function = DBFunction(id=self.max_function_id,
+                                         name=function._name,
+                                         pos=f_pos,
+                                         parameters=db_parameters,
+                                         )
+                self.max_function_id += 1
+        return db_function
+        
+    def create_connection(self, src, dst):
+        convert_type_map = {'input': 'destination', 'output': 'source'}
+        def create_port(vtk_module, type, name, other_vtk_module):
+            # print >>sys.stderr, 'creating port:', vtk_module._name, name
+            if id(vtk_module) not in self.modules:
+                print >>sys.stderr, 'ERROR: cannot create port', \
+                    vtk_module._name, type, name
+                import traceback
+                traceback.print_stack()
+                return (None, None)
+
+            db_module = self.modules[id(vtk_module)]
+            db_package = \
+                self.registry.db_packages_identifier_index[db_module.db_package]
+            if db_module.db_namespace is None:
+                db_module.db_namespace = ''
+            d_key = (db_module.db_name, db_module.db_namespace)
+            db_module_desc = db_package.db_module_descriptors_name_index[d_key]
+
+            if name in self.translate_ports:
+                if db_module.db_name in self.translate_ports[name]:
+                    name = self.translate_ports[name][db_module.db_name]
+                elif (db_module.db_name, 
+                      other_vtk_module._name) in self.translate_ports[name]:
+                    name = self.translate_ports[name][(db_module.db_name,
+                                                       other_vtk_module._name)]
+                else:
+                    name = self.translate_ports[name][None]
+
+            ps_key = (name, type)
+            if ps_key in db_module.db_portSpecs_name_index:
+                db_module_desc = db_module
+            while ps_key not in db_module_desc.db_portSpecs_name_index:
+                base_id = db_module_desc.db_base_descriptor_id
+                if base_id < 0:
+                    print >>sys.stderr, 'ERROR: cannot create port', \
+                        vtk_module._name, type, name
+                    import traceback
+                    traceback.print_stack()
+                    return (None, None)
+                db_module_desc = self.registry_desc_idx[base_id]
+
+            db_port_spec = db_module_desc.db_portSpecs_name_index[ps_key]
+            db_signature = db_port_spec.db_sigstring
+
+            new_port = DBPort(id=self.max_port_id,
+                              type=convert_type_map[type],
+                              moduleId=db_module.db_id,
+                              moduleName=db_module.db_name,
+                              name=name,
+                              signature=db_signature,
+                              )
+            self.max_port_id += 1
+            return (db_module, new_port)
+        # end create_port
+        
+        def find_port_info(entity):
+            if type(entity) == vtk_module:
+                if entity._name == 'vtkRenderWindowInteractor':
+                    (entity, _) = self.get_vtk_cell(entity)
+                found_module = entity
+                port_name = 'self'
+            elif type(entity) == vtk_function and \
+                    type(entity.parent) == vtk_module:
+                (found_module, inspector) = self.find_or_create_module(entity)
+                if found_module:
+                    if inspector:
+                        port_name = entity._name
+                    else:
+                        port_name = 'self'
+                else:
+                    found_module = entity.parent
+                    port_name = entity._name
+            elif type(entity) == vtk_function and  \
+                    type(entity.parent) == vtk_function:
+                (found_module, _) = self.find_or_create_module(entity.parent)
+                port_name = entity._name
+                if not found_module:
+                    print >>sys.stderr, \
+                        "ERROR: cannot convert function", entity._name
+                    
+#             elif type(entity) == vtk_function:
+#                 found_module = self.find_or_create_module(entity)
+#                 if found_module:
+#                     port_name = 'self'
+#                 else:
+#                     if type(entity.parent) == vtk_function:
+#                         found_module = self.find_or_create_module(entity.parent)
+#                         port_name = entity._name
+#                         if not found_module:
+#                             print >>sys.stderr, \
+#                                 "ERROR: cannot convert function", entity._name
+#                     else:
+#                         found_module = entity.parent
+#                         port_name = entity._name
+            else:
+                print >>sys.stderr, 'ERROR: cannot deal with type "' + \
+                    str(type(entity))
+                found_module = None
+                port_name = None
+            return (found_module, port_name)
+        # end find_port_info
+
+        src_port = None
+        src_module = None
+        dst_port = None
+        dst_module = None
+
+        # print >> sys.stderr, "creating connection:", src._name, dst._name
+
+        (src_vtk_module, src_port_name) = find_port_info(src)
+        (dst_vtk_module, dst_port_name) = find_port_info(dst)
+        if src_vtk_module and dst_vtk_module:
+            (src_module, src_port) = create_port(src_vtk_module, 'output',
+                                                 src_port_name, dst_vtk_module)
+            (dst_module, dst_port) = create_port(dst_vtk_module, 'input',
+                                                 dst_port_name, src_vtk_module)
+
+#         if type(src) == vtk_module:
+#             src_vtk_module = src
+#             (src_module, src_port) = create_port(src, 'source', 'self', 
+#                                                  dst.parent)
+#         elif type(src) == vtk_function:
+#             # print >>sys.stderr, 'src:', src._name, src.parent._name
+#             src_vtk_module = self.find_or_create_module(src)
+#             if src_vtk_module:
+#                 print >>sys.stderr, '** found early "%s"' % src._name, src_vtk_module._name
+#                 print >>sys.stderr, 'src_vtk_module:', src_vtk_module._name
+#                 src_name = 'self'
+#             if not src_vtk_module:
+#                 if type(src.parent) == vtk_function:
+#                     src_vtk_module = self.find_or_create_module(src.parent)
+#                     src_name = src._name
+#                     print >>sys.stderr, 'found src_vtk_module', src_vtk_module._name, 'for', src.parent._name, src_name
+
+#                     # print >>sys.stderr, "src_vtk_module:", id(src_vtk_module)
+#                     if not src_vtk_module:
+#                         print >>sys.stderr, \
+#                             "ERROR: cannot convert function", src._name
+#                 else:
+#                     src_vtk_module = src.parent
+#                     src_name = src._name
+#             if src_vtk_module:
+#                 (src_module, src_port) = create_port(src_vtk_module, 'source', 
+#                                                      src_name, dst.parent)
+#         else:
+#             print >>sys.stderr, 'ERROR: cannot deal with type "' + \
+#                 str(type(src)) + '"'
+
+#         if type(dst) == vtk_function:
+#             (dst_module, dst_port) = create_port(dst.parent, 'destination',
+#                                                  dst._name, src_vtk_module)
+#         else:
+#             print >>sys.stderr, 'ERROR: cannot deal with type "' + \
+#                 str(type(dst)) + '"'
+
+        if not src_module or not dst_module:
+            print >>sys.stderr, 'ERROR: cannot create connection', \
+                src._name, dst._name
+            return None
+#         print >>sys.stderr, 'creating connection:', \
+#             src_module.db_name, dst_module.db_name
+        connection = DBConnection(id=self.max_connection_id,
+                                  ports=[src_port, dst_port],
+                                  )
+        self.max_connection_id += 1
+        key = (id(src_module), id(dst_module))
+        if key not in self.connections:
+            self.connections[key] = []
+        self.connections[key].append(connection)
+        if src_module.db_id not in self.vt_f_connections:
+            self.vt_f_connections[src_module.db_id] = []
+        self.vt_f_connections[src_module.db_id].append((dst_module.db_id, 
+                                                        connection))
+        if dst_module.db_id not in self.vt_b_connections:
+            self.vt_b_connections[dst_module.db_id] = []
+        self.vt_b_connections[dst_module.db_id].append((src_module.db_id,
+                                                        connection))
+        return connection
+
+    def print_vt(self, filename=None):
+        import vistrails.db.services.io
+        import vistrails.db.services.action
+
+        action_list = []
+        for module in self.modules.itervalues():
+            # print 'module:', module._name, id(module)
+            action_list.append(('add', module))
+        for connection_list in self.connections.itervalues():
+            for connection in connection_list:
+                # print 'connection:', connection._name, id(connection)
+                action_list.append(('add', connection))
+        self.do_layout()
+        action = vistrails.db.services.action.create_action(action_list)
+        action.db_id = 1
+        action.db_prevId = 0
+        action.db_user = 'dakoop'
+        action.db_date = datetime.datetime.now()
+
+        tag = DBTag(name='Auto-Translated', id=1L)
+            
+        op_id = 0
+        for op in action.db_operations:
+            op.db_id = op_id
+            op_id += 1
+        vistrail = DBVistrail(actions=[action], tags=[tag], version='0.9.0')
+        if filename: 
+            # f = file(filename, 'w')
+            script_name = os.path.splitext(filename)[0] + '.py'
+
+            # total hack to make this a capital E
+            script_name = 'E' + script_name[3:]
+            annotation = DBAnnotation(id=1,
+                                      key='notes',
+                                      value="This workflow was automatically generated from a modified version of the vtk python example script '%s' from the vtk 5.0.4 distribution.  In most cases, running this workflow will generate a visualization that is identical to the result from the example script." % script_name)
+            action.db_add_annotation(annotation)
+
+            vistrails.db.services.io.save_bundle_to_zip_xml(SaveBundle(DBVistrail.vtType, vistrail), filename)
+        else:
+            f = None
+            print >>f, vistrails.db.services.io.serialize(vistrail)
+            
diff --git a/scripts/mac_update_bin.sh b/scripts/mac_update_bin.sh
new file mode 100755
index 0000000..0c504a0
--- /dev/null
+++ b/scripts/mac_update_bin.sh
@@ -0,0 +1,88 @@
+#!/bin/bash
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+ROOT_DIR_NAME="vistrails"
+EXAMPLES_DIR_NAME="examples"
+BIN_PATH_25="Contents/Resources/lib/python2.5"
+BIN_PATH_26="Contents/Resources/lib/python2.6"
+BIN_PATH_27="Contents/Resources/lib/python2.7"
+OLD_DIRS="api core db gui packages tests"
+
+if [ -z "$1" ] || [ -z "$2" ]
+then
+    echo "usage: $0 <src_dir> <bin_dir>"
+    exit 65
+fi
+
+if [ -e "$2/$BIN_PATH_27" ]
+then
+    BIN_PATH=$BIN_PATH_27
+elif [ -e "$2/$BIN_PATH_26" ]
+then
+    BIN_PATH=$BIN_PATH_26
+elif [ -e "$2/$BIN_PATH_25" ]
+then
+    BIN_PATH=$BIN_PATH_25
+fi
+
+# remove the old lower-level symlinks if they exist
+for dir in $OLD_DIRS
+do
+    if [ -e "$2/$BIN_PATH/$dir" ]
+    then
+        rm -r $2/$BIN_PATH/$dir
+    fi
+done
+
+if [ -e "$2/$BIN_PATH/$ROOT_DIR_NAME" ]
+then
+    rm -r $2/$BIN_PATH/$ROOT_DIR_NAME
+fi
+ln -s -f -F $1/$ROOT_DIR_NAME $2/$BIN_PATH/$ROOT_DIR_NAME
+
+if [ -e "$2/$BIN_PATH/../../run.py" ]
+then
+    rm $2/$BIN_PATH/../../run.py
+fi
+ln -s -f -F $1/$ROOT_DIR_NAME/run.py $2/$BIN_PATH/../../run.py
+
+if [ -e "$2/../$EXAMPLES_DIR_NAME" ]
+then
+    rm -r $2/../$EXAMPLES_DIR_NAME
+fi
+ln -s -f -F $1/$EXAMPLES_DIR_NAME $2/../$EXAMPLES_DIR_NAME
+
+
+exit 0
diff --git a/scripts/merge_vistrails.py b/scripts/merge_vistrails.py
new file mode 100644
index 0000000..79769e7
--- /dev/null
+++ b/scripts/merge_vistrails.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+#FIXME !!! DOES NOT MERGE EXECUTION LOGS STORED IN VT FILE !!!
+
+import sys
+if '../vistrails' not in sys.path:
+    sys.path.append('../vistrails')
+
+import vistrails.db.services.vistrail
+from vistrails.db.domain import DBModule, DBConnection, DBPort, DBFunction, \
+    DBParameter, DBLocation, DBPortSpec, DBTag, DBAnnotation, DBVistrail, \
+    DBAction
+from vistrails.db.services import io
+
+def main(out_fname, in_fnames):
+    """main(out_fname: str, in_fnames: list<str>) -> None
+    Combines all vistrails specified in in_fnames into a single vistrail
+    by renumbering their ids
+
+    """
+    # FIXME this breaks when you use abstractions!
+    (save_bundle, vt_save_dir) = io.open_bundle_from_zip_xml(DBVistrail.vtType, in_fnames[0])
+    for in_fname in in_fnames[1:]:
+        (new_save_bundle, new_save_dir) = io.open_bundle_from_zip_xml(DBVistrail.vtType, in_fname)
+        vistrails.db.services.vistrail.merge(save_bundle, new_save_bundle, "", True, vt_save_dir, new_save_dir)
+    io.save_bundle_to_zip_xml(save_bundle, out_fname)
+    
+if __name__ == '__main__':
+    if len(sys.argv) < 3:
+        print "Usage: %s [output filename] [list of input vistrails]" % \
+            sys.argv[0]
+        sys.exit(0)
+    main(sys.argv[1], sys.argv[2:])
diff --git a/scripts/module_appearance/main.py b/scripts/module_appearance/main.py
new file mode 100755
index 0000000..714b18a
--- /dev/null
+++ b/scripts/module_appearance/main.py
@@ -0,0 +1,280 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+##############################################################################
+# create_module_appearance.py helps VisTrails package developers customize
+# the appearance of modules in their packages.
+
+from PyQt4 import QtGui, QtCore, Qt
+from module_appearance import Ui_MainWindow
+import sys
+
+default_pen = QtGui.QPen()
+default_pen.setWidth(2)
+default_pen.setColor(QtCore.Qt.black)
+
+selected_pen = QtGui.QPen()
+selected_pen.setWidth(3)
+selected_pen.setColor(QtCore.Qt.yellow)
+
+##############################################################################
+
+class ModuleFringeJoint(QtGui.QGraphicsEllipseItem):
+    
+    brush = QtGui.QBrush(QtGui.QColor(192, 192, 192))
+    def __init__(self, leftLine, rightLine):
+        pt = rightLine.line().p1()
+        sz = 5
+        QtGui.QGraphicsEllipseItem.__init__(self, -sz/2, -sz/2, sz, sz)
+        self.setPos(pt)
+        self.leftLine = leftLine
+        self.rightLine = rightLine
+        self.setAcceptHoverEvents(True)
+        self.setPen(default_pen)
+        self.setBrush(self.brush)
+        self.setZValue(1.0)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True)
+        
+    def removeSelf(self):
+        scene = self.scene()
+        scene.removeItem(self)
+        scene.removeItem(self.rightLine)
+        self.leftLine.rightJoint = self.rightLine.rightJoint
+        self.leftLine.moveRightPoint(self.rightLine.line().p2())
+        if self.rightLine.rightJoint is not None:
+            self.rightLine.rightJoint.leftLine = self.leftLine
+        
+    def mouseMoveEvent(self, event):
+        QtGui.QGraphicsItem.mouseMoveEvent(self, event)
+        self.leftLine.moveRightPoint(self.scenePos())
+        self.rightLine.moveLeftPoint(self.scenePos())
+        app.window.update_text_view()
+
+    def keyPressEvent(self, event):
+        if event.matches(QtGui.QKeySequence.Delete):
+            self.removeSelf()
+
+    def hoverEnterEvent(self, event):
+        self.setPen(selected_pen)
+        self.setFocus(QtCore.Qt.OtherFocusReason)
+
+    def hoverLeaveEvent(self, event):
+        self.setPen(default_pen)
+        self.clearFocus()
+
+    @staticmethod
+    def toScene(pt, side):
+        if side == 'left':
+            raise Exception("unimplemented")
+        elif side == 'right':
+            return QtCore.QPointF(pt[0] * 80.0 + 100.0, pt[1] * 80.0 - 40.0)
+        else:
+            raise Exception("side must be either 'right' or 'left'")
+        
+    def toVisTrails(self, side):
+        px, py = self.scenePos().x(), self.scenePos().y()
+        if side == 'left':
+            return ((100.0+px)/80.0, (40.0-py)/80.0)
+        elif side == 'right':
+            return ((px-100.0)/80.0, (40.0-py)/80.0)
+        else:
+            raise Exception("side must be either 'right' or 'left'")
+
+class ModuleFringeLine(QtGui.QGraphicsLineItem):
+
+    def __init__(self, leftJoint, rightJoint, *args, **kwargs):
+        QtGui.QGraphicsLineItem.__init__(self, *args, **kwargs)
+        self.setAcceptHoverEvents(True)
+        self.setPen(default_pen)
+        self.setAcceptedMouseButtons(QtCore.Qt.LeftButton)
+        self.leftJoint = leftJoint
+        self.rightJoint = rightJoint
+        self.setZValue(0.0)
+
+    def mouseDoubleClickEvent(self, event):
+        self.createNewLine(event.pos())
+        app.window.update_text_view()
+
+    def hoverEnterEvent(self, event):
+        self.setPen(selected_pen)
+
+    def hoverLeaveEvent(self, event):
+        self.setPen(default_pen)
+
+    def moveLeftPoint(self, pt):
+        self.setLine(QtCore.QLineF(pt, self.line().p2()))
+
+    def moveRightPoint(self, pt):
+        self.setLine(QtCore.QLineF(self.line().p1(), pt))
+
+    def createNewLine(self, pt):
+        old_line = self.line()
+        self.setLine(QtCore.QLineF(old_line.p1(), pt))
+        new_line = QtCore.QLineF(pt, old_line.p2())
+        
+        old_joint = self.rightJoint
+
+        new_fringe_line = ModuleFringeLine(None, self.rightJoint, new_line)
+        new_joint = ModuleFringeJoint(self, new_fringe_line)
+
+        self.rightJoint = new_joint
+        new_fringe_line.leftJoint = new_joint
+        if old_joint is not None:
+            old_joint.leftLine = new_fringe_line
+        
+        scene = self.scene()
+        scene.addItem(new_fringe_line)
+        scene.addItem(new_joint)
+        return new_fringe_line
+
+##############################################################################
+
+class MainWindow(QtGui.QMainWindow):
+
+    def __init__(self, parent=None):
+        QtGui.QMainWindow.__init__(self)
+        self.ui = Ui_MainWindow()
+        self.ui.setupUi(self)
+        self.gv = self.ui.graphicsView
+        self.setup_graphics_view()
+        self.connect(self.ui.pushButton_Quit,
+                     QtCore.SIGNAL("clicked()"),
+                     QtGui.qApp.quit)
+        self.connect(self.ui.pushButton_symmetric,
+                     QtCore.SIGNAL("clicked()"),
+                     self.make_symmetric)
+        self.connect(self.ui.pushButton_mirrored,
+                     QtCore.SIGNAL("clicked()"),
+                     self.make_mirrored)
+        self.connect(self.ui.pushButton_Clear,
+                     QtCore.SIGNAL("clicked()"),
+                     self.clear_points)
+
+    def setup_graphics_view(self):
+        self.scene = QtGui.QGraphicsScene()
+        self.gv.setScene(self.scene)
+        self.gv.setBackgroundBrush(QtCore.Qt.gray)
+        pen = QtGui.QPen()
+        pen.setWidth(2)
+        pen.setColor(QtCore.Qt.black)
+
+        self.scene.addLine(-100,-40,100,-40,pen)
+        self.scene.addLine(-100, 40,100, 40,pen)
+
+        # l1 is the left line
+        self.l1 = ModuleFringeLine(None, None, -100,  40, -100, -40)
+
+        # l2 is the right line
+        self.l2 = ModuleFringeLine(None, None,  100, -40,  100,  40)
+        
+        self.scene.addItem(self.l1)
+        self.scene.addItem(self.l2)
+
+        self.update_text_view()
+
+    @staticmethod
+    def get_points(line, side):
+        lst = []
+        while not (line.rightJoint is None):
+            lst.append(line.rightJoint.toVisTrails(side))
+            line = line.rightJoint.rightLine
+        return lst
+    
+    def update_text_view(self):
+        s = ''
+        left_list = self.get_points(self.l1, 'left')
+        right_list = self.get_points(self.l2, 'right')
+        
+        for (preamble, postamble,
+             side, pts) in zip(['reg.add_module(your_class,\n               moduleLeftFringe=[(0.0, 0.0), ',
+                                '               moduleRightFringe=[(0.0, 0.0), '],
+                               ['(0.0, 1.0)],\n', '(0.0, 1.0)])\n'],
+                               ['left', 'right'],
+                               [left_list, reversed(right_list)]):
+            f = pts
+            s += preamble
+            for p in pts:
+                s += ('(%.4f, %.4f), ' % p)
+            s += postamble
+        self.ui.textEdit.clear()
+        self.ui.textEdit.append(s)
+
+    ##########################################################################
+    # slots
+
+    def make_symmetric(self):
+        while not (self.l2.rightJoint is None):
+            self.l2.rightJoint.removeSelf()
+        l1 = self.l1
+        l2 = self.l2
+        while not (l1.rightJoint is None):
+            t = l1.rightJoint.toVisTrails('left')
+            t = (-t[0], t[1])
+            p = ModuleFringeJoint.toScene(t, 'right')
+            l2 = l2.createNewLine(p)
+            l1 = l1.rightJoint.rightLine
+        self.update_text_view()
+
+    def make_mirrored(self):
+        while not (self.l2.rightJoint is None):
+            self.l2.rightJoint.removeSelf()
+        l1 = self.l1
+        pl = []
+        while not (l1.rightJoint is None):
+            p = l1.rightJoint.scenePos()
+            pl.append(QtCore.QPointF(-p.x(), p.y()))
+            l1 = l1.rightJoint.rightLine
+        l2 = self.l2
+        for p in reversed(pl):
+            l2 = l2.createNewLine(p)
+        self.update_text_view()
+
+    def clear_points(self):
+        while not (self.l2.rightJoint is None):
+            self.l2.rightJoint.removeSelf()
+        while not (self.l1.rightJoint is None):
+            self.l1.rightJoint.removeSelf()
+        self.update_text_view()
+
+##############################################################################
+
+if __name__ == '__main__':
+    app = QtGui.QApplication(sys.argv)
+    app.window = MainWindow()
+    app.window.show()
+    app.exec_()
+
diff --git a/scripts/module_appearance/module_appearance.py b/scripts/module_appearance/module_appearance.py
new file mode 100644
index 0000000..78fd520
--- /dev/null
+++ b/scripts/module_appearance/module_appearance.py
@@ -0,0 +1,109 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'module_appearance.ui'
+#
+# Created: Mon Oct 11 20:15:11 2010
+#      by: PyQt4 UI code generator 4.7.2
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(819, 602)
+        self.centralwidget = QtGui.QWidget(MainWindow)
+        self.centralwidget.setObjectName("centralwidget")
+        self.verticalLayoutWidget = QtGui.QWidget(self.centralwidget)
+        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 811, 551))
+        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
+        self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.graphicsView = QtGui.QGraphicsView(self.verticalLayoutWidget)
+        self.graphicsView.setObjectName("graphicsView")
+        self.verticalLayout.addWidget(self.graphicsView)
+        self.horizontalLayout_2 = QtGui.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.textEdit = QtGui.QTextEdit(self.verticalLayoutWidget)
+        self.textEdit.setObjectName("textEdit")
+        self.horizontalLayout_2.addWidget(self.textEdit)
+        self.textEdit_help = QtGui.QTextEdit(self.verticalLayoutWidget)
+        self.textEdit_help.setObjectName("textEdit_help")
+        self.horizontalLayout_2.addWidget(self.textEdit_help)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout = QtGui.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.pushButton_symmetric = QtGui.QPushButton(self.verticalLayoutWidget)
+        self.pushButton_symmetric.setObjectName("pushButton_symmetric")
+        self.horizontalLayout.addWidget(self.pushButton_symmetric)
+        self.pushButton_mirrored = QtGui.QPushButton(self.verticalLayoutWidget)
+        self.pushButton_mirrored.setObjectName("pushButton_mirrored")
+        self.horizontalLayout.addWidget(self.pushButton_mirrored)
+        self.pushButton_Clear = QtGui.QPushButton(self.verticalLayoutWidget)
+        self.pushButton_Clear.setObjectName("pushButton_Clear")
+        self.horizontalLayout.addWidget(self.pushButton_Clear)
+        spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.pushButton_Quit = QtGui.QPushButton(self.verticalLayoutWidget)
+        self.pushButton_Quit.setObjectName("pushButton_Quit")
+        self.horizontalLayout.addWidget(self.pushButton_Quit)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.statusbar = QtGui.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+
+        self.retranslateUi(MainWindow)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
+        self.textEdit_help.setHtml(QtGui.QApplication.translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">To edit the shape, double-click the fringe lines and drag the vertices. To delete the vertices, select them and press "Delete" on your keyboard. </p>\n"
+"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">The resulting code snippet can be used to generate a module fringe in VisTrails like the one being displayed.</p>\n"
+"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">The buttons "Make rotationally symmetric" and "Make mirrored" use the left side of the module to produce the right side. They <span style=\" font-weight:600;\">will erase</span> the decorations on the right side.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+        self.pushButton_symmetric.setText(QtGui.QApplication.translate("MainWindow", "Make rotationally symmetric", None, QtGui.QApplication.UnicodeUTF8))
+        self.pushButton_mirrored.setText(QtGui.QApplication.translate("MainWindow", "Make mirrored", None, QtGui.QApplication.UnicodeUTF8))
+        self.pushButton_Clear.setText(QtGui.QApplication.translate("MainWindow", "Clear", None, QtGui.QApplication.UnicodeUTF8))
+        self.pushButton_Quit.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/scripts/module_appearance/module_appearance.ui b/scripts/module_appearance/module_appearance.ui
new file mode 100644
index 0000000..8ac9b8d
--- /dev/null
+++ b/scripts/module_appearance/module_appearance.ui
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>819</width>
+    <height>602</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <widget class="QWidget" name="verticalLayoutWidget">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>0</y>
+      <width>811</width>
+      <height>551</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QGraphicsView" name="graphicsView"/>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <widget class="QTextEdit" name="textEdit"/>
+       </item>
+       <item>
+        <widget class="QTextEdit" name="textEdit_help">
+         <property name="html">
+          <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To edit the shape, double-click the fringe lines and drag the vertices. To delete the vertices, select them and press &quot;Delete&quot; on your keyboard. </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The resulting code snippet can be used to generate a module fringe in VisTrails like the one being displayed.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The buttons &quot;Make rotationally symmetric&quot; and &quot;Make mirrored&quot; use the left side of the module to produce the right side. They <span style=" font-weight:600;">will erase</span> the decorations on the right side.</p></body></html></string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0">
+       <item>
+        <widget class="QPushButton" name="pushButton_symmetric">
+         <property name="text">
+          <string>Make rotationally symmetric</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pushButton_mirrored">
+         <property name="text">
+          <string>Make mirrored</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pushButton_Clear">
+         <property name="text">
+          <string>Clear</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pushButton_Quit">
+         <property name="text">
+          <string>Quit</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/scripts/opm/opm2dot.py b/scripts/opm/opm2dot.py
new file mode 100644
index 0000000..a9de8ae
--- /dev/null
+++ b/scripts/opm/opm2dot.py
@@ -0,0 +1,185 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import sys
+from xml.etree import cElementTree as ElementTree
+
+def run(filename, account=None):
+    root = ElementTree.parse(filename)
+    node_id = 0
+    lookup = {}
+    error_edges = []
+
+    def should_include(obj):
+        if account is None:
+            return True
+        else:
+            for an_account in obj.getiterator('account'):
+                if an_account.get('id') == account:
+                    return True
+        return False
+        
+    print 'digraph {'
+    print 'edge [dir = "back", style="dashed"];'
+    for process in root.getiterator('processes').next().getiterator('process'):
+        if not should_include(process):
+            continue
+        process_id = process.get('id')
+        error = None
+        for child in process.getiterator('value').next().getchildren():
+            if child.tag == 'moduleExec':
+                process_label = child.get('moduleName')
+                if child.get('completed') == '-1':
+                    error = child.get('error')
+            elif child.tag == 'groupExec':
+                process_label = child.get('groupName')
+                if child.get('completed') == '-1':
+                    error = child.get('error')
+        if child.tag == 'groupExec':
+            shape = 'hexagon'
+        elif child.tag == 'moduleExec' and child.get('moduleName') == 'Map':
+            shape = 'hexagon'
+        else:
+            shape = 'box'
+        print '%d [label="%s", shape=%s, color=blue];' % \
+            (node_id, process_label, shape)
+        lookup[process_id] = node_id
+        node_id += 1
+        if error is not None:
+            print '%d [label="ERROR: %s", shape=octagon, color=black];' % (node_id,
+                                                                    error)
+            error_edges.append((node_id - 1, node_id))
+        node_id += 1
+
+    for artifact in root.getiterator('artifacts').next().getiterator('artifact'):
+        if not should_include(artifact):
+            continue
+        artifact_id = artifact.get('id')
+        for child in artifact.getiterator('value').next().getchildren():
+            if child.tag == 'portSpec':
+                port_name = str(child.get('name'))
+                # artifact_label = '[' + str(child.get('name')) + ']'
+                spec = str(child.get('sigstring'))
+                if spec:
+                    artifact_label = port_name + ' = [' + spec[spec.index(':')+1:spec.index(')')] + ']'
+                else:
+                    artifact_label = port_name
+            elif child.tag == 'function':
+                artifact_label = str(child.get('name')) + ' = ('
+                comma = ''
+                for param in child.getiterator('parameter'):
+                    param_val = param.get('val')
+                    if len(param_val) > 32:
+                        if param.get('type') == \
+                                'edu.utah.sci.vistrails.basic:File':
+                            print >>sys.stderr, "got here"
+                            dir_names = []
+                            dir_name = param_val
+                            while os.path.split(dir_name)[1]:
+                                (dir_name, next_name) = os.path.split(dir_name)
+                                dir_names.append(next_name)
+                            dir_names.append('/')
+                            if len(dir_names) <= 1:
+                                param_val = param_val
+                            dir_names.reverse()
+                            if len(dir_names[-1]) > 28:
+                                i = 1
+                                j = 1
+                                arr = dir_names[-1].split('_')
+                                while len('_'.join(arr[:i] + ['...'] + arr[-j:])) < 28:
+                                    if i == j:
+                                        i += 1
+                                    else:
+                                        j += 1
+                                dir_names[-1] = '_'.join(arr[:i] + ['...'] + arr[-j:])
+                            print >>sys.stderr, dir_names
+                            i = 1
+                            while (len(os.path.join(dir_names[0], dir_names[1],
+                                                    '...', 
+                                                    *dir_names[-i:])) < 32 and
+                                   i+1 < len(dir_names)):
+                                print >>sys.stderr, \
+                                    len(os.path.join(dir_names[0], 
+                                                     dir_names[1],
+                                                     '...', 
+                                                     *dir_names[-i:]))
+                                i += 1
+                            print >>sys.stderr, i
+                            param_val = os.path.join(dir_names[0], 
+                                                     dir_names[1], '...',
+                                                     *dir_names[-i:])
+                        else:
+                            param_val = param_val[:24] + '...' + param_val[-8:]
+                    artifact_label += comma + param_val
+                    comma = ', '
+                artifact_label += ')'
+            else:
+                print >>sys.stderr, "ERROR:", child.tag
+                artifact_label = artifact.get('id')
+        print '%d [label="%s", color=red];' % (node_id, artifact_label)
+        lookup[artifact_id] = node_id
+        node_id += 1
+    for used in root.getiterator('causalDependencies').next().getiterator('used'):
+        if not should_include(used):
+            continue
+
+        print "%d -> %d;" % \
+            (lookup[used.getiterator('cause').next().get('id')], 
+             lookup[used.getiterator('effect').next().get('id')])
+    for wgb in root.getiterator('causalDependencies').next().getiterator('wasGeneratedBy'):
+        if not should_include(wgb):
+            continue
+
+        print "%d -> %d;" % \
+            (lookup[wgb.getiterator('cause').next().get('id')], 
+             lookup[wgb.getiterator('effect').next().get('id')])
+    for wtb in root.getiterator('causalDependencies').next().getiterator('wasTriggeredBy'):
+        if not should_include(wtb):
+            continue
+        print "%d -> %d;" % \
+            (lookup[wtb.getiterator('cause').next().get('id')], 
+             lookup[wtb.getiterator('effect').next().get('id')])
+
+    for error_edge in error_edges:
+        print "%d -> %d;" % error_edge
+    print "}"
+    
+
+if __name__ == '__main__':
+    if len(sys.argv) < 2:
+        print "Usage: python %s <opm_file> [account]" % sys.argv[0]
+        sys.exit(42)
+    account = sys.argv[2] if len(sys.argv) > 2 else None
+    run(sys.argv[1], account)
diff --git a/scripts/release_notes.py b/scripts/release_notes.py
new file mode 100755
index 0000000..35ce651
--- /dev/null
+++ b/scripts/release_notes.py
@@ -0,0 +1,326 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""This will write text of a release notes file based on commit messages and trac
+tickets. Use the configuration section below to tune the start and end commits.
+The text will be written to the standard output.
+"""
+
+import xmlrpclib
+import git
+import getpass
+import os
+import sys
+import re
+import tempfile
+import subprocess
+import shutil
+
+#### configuration ####
+commit_start = "90975fc00211" # hash of version used on last release notes
+commit_end = "HEAD" # current hash
+branch = "v2.1" # git branch to be used
+release_name = "2.1.1"
+clonepath = None # set this to the complete path of a vistrails clone to be used
+                 # if None, the remote repository will be cloned to a temporary
+                 # folder and removed at the end of the script
+#clonepath = '/Users/tommy/git/vistrails'
+cloneremote = 'git://www.vistrails.org/vistrails.git'
+#### end configuration #####
+
+## The script will ask for your Trac user and password
+## so no need to change this now
+username = None
+password = None
+need_cleanup = False
+
+################################################################################
+def userpass(realm, u, may_save):
+    global username
+    global password
+    if not username:
+        print "Username:",
+        sys.stdout.flush()
+        username = raw_input()
+        password = getpass.getpass()
+    return True, username, password, False
+
+################################################################################
+
+def clone_vistrails_git_repository(path_to):
+    global cloneremote
+    cmdlist = ['git', 'clone', cloneremote,
+               path_to]
+    print "Cloning vistrails from:"
+    print "  %s to"%cloneremote
+    print "  %s"%path_to
+    print "Be patient. This may take a while."
+    process = subprocess.Popen(cmdlist, shell=False,
+                               stdin=subprocess.PIPE,
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT,
+                               close_fds=True)
+    process.wait()
+    if process.returncode == 0:
+        print "repository is cloned."
+    return process.returncode
+
+################################################################################
+
+def init_repo():
+    global clonepath, need_cleanup, branch
+    ok = False
+    if clonepath is None:
+        clonepath = tempfile.mkdtemp(prefix="vtrel")
+        try:
+            if clone_vistrails_git_repository(clonepath) == 0:
+                ok = True
+                init_branch(clonepath,branch)
+            need_cleanup = True
+        except Exception, e:
+            print "ERROR: Could not clone vistrails repository!"
+            print str(e)
+            shutil.rmtree(clonepath)
+            sys.exit(1)
+    else:
+        init_branch(clonepath,branch)
+        pull_changes(clonepath)
+        ok = True
+    if ok:
+        repo = git.Repo(clonepath)
+        return repo
+    else:
+        print "ERROR: git clone failed."
+        sys.exit(1)
+
+################################################################################
+
+def cleanup_repo():
+    global clonepath, need_cleanup
+    if need_cleanup:
+        shutil.rmtree(clonepath)
+        
+################################################################################
+
+def init_branch(path_to, branch):
+    cmdlist = ['git', 'checkout', "%s"%branch]
+    print "Checking out %s branch..."%branch
+    current_dir = os.getcwd()
+    os.chdir(path_to)
+    process = subprocess.Popen(cmdlist, shell=False,
+                               stdin=subprocess.PIPE,
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT,
+                               close_fds=True)
+    process.wait()
+    lines = process.stdout.readlines()
+    for line in lines:
+        print "   ", line
+    if process.returncode == 0:
+        print "Branch %s was checked out."%branch
+    os.chdir(current_dir)    
+    return process.returncode
+
+################################################################################
+
+def pull_changes(path_to):
+    cmdlist = ['git', 'pull']
+    print "Pulling changes into the branch..."
+    current_dir = os.getcwd()
+    os.chdir(path_to)
+    process = subprocess.Popen(cmdlist, shell=False,
+                               stdin=subprocess.PIPE,
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT,
+                               close_fds=True)
+    process.wait()
+    lines = process.stdout.readlines()
+    for line in lines:
+        print "   ", line
+    if process.returncode == 0:
+        print "Changes were pulled."
+    os.chdir(current_dir)    
+    return process.returncode
+
+################################################################################
+
+def checkout_branch(repo, branch):
+    repobranch = getattr(repo.heads, branch)
+    repobranch.checkout()
+
+##############################################################################
+
+def build_release_notes(repo, branch):
+    global username
+    global password
+    global commit_start, commit_end
+    
+    def check_inside_skip(skip_list, message):
+        found = False
+        for s in skip_list:
+            if s.find(message) != -1:
+                found = True
+                break
+        return found
+    
+    re_ticket_old = re.compile(r'<ticket>(.*?)</ticket>', re.M | re.S)
+    re_ticket = re.compile(r'^Ticket: (.*?)$', re.M | re.S)
+    re_bugfix_old = re.compile(r'<bugfix>(.*?)</bugfix>', re.M | re.S)
+    re_bugfix = re.compile(r'^Bugfix: (.*?)$', re.M | re.S)
+    re_feature_old = re.compile(r'<feature>(.*?)</feature>', re.M | re.S)
+    re_feature = re.compile(r'^Feature:(.*?)$', re.M | re.S)
+    re_skip = re.compile(r'<skip>(.*?)</skip>', re.M | re.S)
+
+    #build list and dictionary with commits
+    logs = []
+    log_map_time = {}
+    checkout_branch(repo,branch)
+    for c in repo.iter_commits("%s..%s"%(commit_start,commit_end)):
+        logs.append(c)
+        log_map_time[c.hexsha] = c.committed_date
+        
+    #populate dictionaries
+    bugfixes = {}
+    tickets = {}
+    features = {}
+    changes = {}
+    ticket_info = {}
+    
+    for log in logs:
+        ls = re_skip.findall(log.message)
+        lf = re_feature.findall(log.message)
+        lf.extend(re_feature_old.findall(log.message))
+        lt = re_ticket.findall(log.message)
+        lt.extend(re_ticket_old.findall(log.message))
+        lb = re_bugfix.findall(log.message)
+        lb.extend(re_ticket_old.findall(log.message))
+        for s in ls:
+            changes[s.strip()] = log.hexsha
+        for f in lf:
+            features[f.strip()] = log.hexsha
+        for t in lt:
+            # handle tickets with # (should not be used)
+            t = t.strip()
+            if t.startswith('#'):
+                t = t[1:]
+            try:
+                tickets[int(t)] = log.hexsha
+            except ValueError:
+                pass
+        for b in lb:
+            bugfixes[b.strip()] = log.hexsha
+        if len(ls) == 0 and len(lf) == 0 and len(lt) == 0 and len(lb) == 0:
+            changes[log.message] = log.hexsha
+                
+
+    #get ticket summaries from xmlrpc plugin installed on vistrails trac
+    print "Will connect to VisTrails Trac with authentication..."
+    if not username:
+        print "Username:",
+        sys.stdout.flush()
+        username = raw_input()
+        password = getpass.getpass()
+
+    url = "https://%s:%s@www.vistrails.org/login/xmlrpc"%(username,
+                                                               password)
+    server = xmlrpclib.ServerProxy(url)
+    print "downloading tickets.",
+    for (tid,r) in tickets.iteritems():
+        print ".",
+        sys.stdout.flush()
+        try:
+            ticket_info[tid] = server.ticket.get(tid)
+        except Exception, e:
+            tickets.remove(tid)
+            print "commit %s: Could not get info for ticket %s"%(r,tid)
+    print "done."
+
+    #place tickets on bugfixes or enhancements
+    for (tid,r) in tickets.iteritems():
+        txt = "Ticket %s: %s"%(tid,ticket_info[tid][3]['summary'])
+        if ticket_info[tid][3]['type'] == 'enhancement':
+            features[txt] = r
+        elif ticket_info[tid][3]['type'] in ['defect', 'defect+question']:
+            bugfixes[txt] = r
+        else:
+            #put the rest as changes
+            changes[txt] = r
+    if commit_end == "HEAD" and len(logs) > 0:
+        commit_end = logs[0].hexsha
+
+    print
+    print
+    print "Release Name: v%s build %s from %s branch" % (release_name,
+                                                         commit_end[0:12],
+                                                         branch)
+    print 
+    print "Enhancements: "
+    times = []
+    for t, r in features.iteritems():
+        times.append((log_map_time[r], t))
+    revisions = sorted(times)
+    revisions.reverse()
+    for (t,text) in revisions:
+        r = features[text]
+        print " - %s (%s)" %(text,r[0:12])
+    
+    print
+    print "Bug fixes: "
+    times = []
+    for t, r in bugfixes.iteritems():
+        times.append((log_map_time[r], t))
+    revisions = sorted(times)
+    revisions.reverse()
+    for (t,text) in revisions:
+        r = bugfixes[text]
+        print " - %s (%s)" %(text,r[0:12])
+
+    print
+    print "Other changes: "
+    times = []
+    for t, r in changes.iteritems():
+        times.append((log_map_time[r], t))
+    revisions = sorted(times)
+    revisions.reverse()
+    for (t,text) in revisions:
+        r = changes[text]
+        print " - %s (%s)" %(text.split('\n')[0][0:100],r[0:12])
+
+if __name__ == "__main__":
+    repo = init_repo()
+    build_release_notes(repo, branch)
+    cleanup_repo()
+
+
diff --git a/scripts/restart-vistrails-server.sh b/scripts/restart-vistrails-server.sh
new file mode 100755
index 0000000..a9b1a41
--- /dev/null
+++ b/scripts/restart-vistrails-server.sh
@@ -0,0 +1,40 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+crondir=`pwd`
+export DISPLAY=localhost:1.0
+vistrails_dir="/server/wiki/vistrails/main/vistrails/v1.2/vistrails"
+cd $vistrails_dir
+python stop_vistrails_server.py http://vistrails.sci.utah.edu:8080
+nohup python vistrails_server.py -T vistrails.sci.utah.edu -R 8080&
\ No newline at end of file
diff --git a/scripts/run_vistrails_batch_xvfb.sh b/scripts/run_vistrails_batch_xvfb.sh
new file mode 100755
index 0000000..2c6b79f
--- /dev/null
+++ b/scripts/run_vistrails_batch_xvfb.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+#settings
+LOG_DIR=/server/vistrails/logs
+Xvfb_CMD=/usr/bin/Xvfb
+VIRTUAL_DISPLAY=":6"
+VISTRAILS_DIR=/server/vistrails/source
+VT_FILE=""
+WORKFLOW=""
+if (("$#" > "0")); then
+    VIRTUAL_DISPLAY="$1"
+fi
+if (("$#" > "1")); then
+    VT_FILE="$2"
+fi
+if (("$#" > "2")); then
+    WORKFLOW="$3"
+fi
+Xvfb_PARAM="$VIRTUAL_DISPLAY -screen 0 1280x960x24"
+LOG_XVFB="$LOG_DIR/xvfb$VIRTUAL_DISPLAY.log"
+
+#try to find Process ID of running X-Server
+echo "checking if Xvfb is already running..."
+echo "ps -eaf | grep $Xvfb_CMD | grep $VIRTUAL_DISPLAY | awk '{print \$2}'"
+pid=`ps -eaf | grep $Xvfb_CMD | grep $VIRTUAL_DISPLAY | awk '{print \$2}'`
+if [ "$pid" ]; then
+    echo "Xvfb already running [pid=${pid}]"
+else
+    #start a virtual server
+    if [ -x $Xvfb_CMD ]; then
+	$Xvfb_CMD $Xvfb_PARAM>& $LOG_XVFB &
+	
+	sleep 5
+
+	#Make sure it started
+	pid=`ps -eaf | grep $Xvfb_CMD | grep $VIRTUAL_DISPLAY | awk '{print $2}'`
+	if [ "$pid" ]; then
+	    echo "done."
+	else
+	    echo "FAILED."
+	fi
+    else
+	echo "Error: Could not find $Xvfb_CMD. Cannot start Xvfb."
+    fi
+fi
+echo -n "Executing VisTrails on display $VIRTUAL_DISPLAY.0 - "
+cd $VISTRAILS_DIR
+export DISPLAY=$VIRTUAL_DISPLAY
+python vistrails/run.py -b $VT_FILE:$WORKFLOW 
+
diff --git a/scripts/sql_delete.py b/scripts/sql_delete.py
new file mode 100644
index 0000000..15090b0
--- /dev/null
+++ b/scripts/sql_delete.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+if '/vistrails/src/trunk/vistrails' not in sys.path:
+    sys.path.append('/vistrails/src/trunk/vistrails')
+import vistrails.db.services.io
+import urlparse
+import getpass
+
+def run(url, type, id):
+    scheme, rest = url.split('://', 1)
+    url = 'http://' + rest
+    (_, net_loc, db_name, args_str, _) = urlparse.urlsplit(url)
+    db_name = db_name[1:]
+    net_loc_arr = net_loc.split('@',1)
+    if len(net_loc_arr) > 1:
+        user, rest = net_loc_arr
+    else:
+        user = 'root'
+        rest = net_loc_arr[0]
+
+    host_port_arr = rest.split(':', 1)
+    if len(host_port_arr) > 1:
+        host, port = host_port_arr
+    else:
+        host = host_port_arr[0]
+        port = '3306'
+
+    config = {'host': host, 'port': int(port),
+              'user': user, 'db': db_name}
+    print config
+    try:
+        conn = vistrails.db.services.io.open_db_connection(config)
+    except Exception:
+        passwd = getpass.getpass()
+        config['passwd'] = passwd
+        conn = vistrails.db.services.io.open_db_connection(config)
+        
+    vistrails.db.services.io.delete_from_db(conn, type, id)
+
+if __name__ == '__main__':
+    if len(sys.argv) < 4:
+        print "Usage: %s %s <db_connection_str> <type> <id>" % \
+            (sys.executable, sys.argv[0])
+        print "   <db_connection_str> := [<user>@]<host>[:<port>]/<db>"
+        print "   Password prompt displayed if required"
+        sys.exit(61)
+    run(*sys.argv[1:])
diff --git a/scripts/sql_to_xml.py b/scripts/sql_to_xml.py
new file mode 100644
index 0000000..14ecdf0
--- /dev/null
+++ b/scripts/sql_to_xml.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+sys.path.append('/vistrails/src/trunk/vistrails')
+from vistrails.db.services import io
+import MySQLdb
+
+def convert_sql_to_xml(filename, id):
+    config = {'host': 'vistrails.sci.utah.edu', 
+              'port': 3306,
+              'user': 'vistrails',
+              'passwd': '8edLj4',
+              'db': 'vistrails'}
+    try:
+        db_connection = io.open_db_connection(config)        
+        vistrail = io.open_vistrail_from_db(db_connection, id)
+        io.save_vistrail_to_xml(vistrail, filename)
+        io.close_db_connection(db_connection)
+    except MySQLdb.Error, e:
+        print e
+
+if __name__ == '__main__':
+    convert_sql_to_xml('/tmp/vt_from_db.xml', 4)
diff --git a/scripts/start_vistrails.sh b/scripts/start_vistrails.sh
new file mode 100755
index 0000000..86123f3
--- /dev/null
+++ b/scripts/start_vistrails.sh
@@ -0,0 +1,82 @@
+#!/bin/bash
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+#settings
+LOG_DIR=/server/vistrails/logs
+
+VISTRAILS_DIR=/server/vistrails/trunk/vistrails
+ADDRESS="crowdlabs.sci.utah.edu"
+PORT="8081"
+CONF_FILE="server.cfg"
+NUMBER_OF_OTHER_VISTRAILS_INSTANCES="2"
+MULTI_OPTION="-M"
+if (("$#" > "0")); then
+    VIRTUAL_DISPLAY="$1"
+fi
+if (("$#" > "1")); then
+    ADDRESS="$2"
+fi
+if (("$#" > "2")); then
+    PORT="$3"
+fi
+if (("$#" > "3")); then
+    NUMBER_OF_OTHER_VISTRAILS_INSTANCES="$4"
+fi
+if (("$#" == "5")); then
+   if(("$5" == "0")); then
+       MULTI_OPTION=""
+   else
+       MULTI_OPTION="-M"
+   fi
+fi
+
+PID="$LOG_DIR/pid.$PORT.vistrails"
+
+echo -n "Starting VisTrails in Server Mode on display :0 - "
+cd $VISTRAILS_DIR
+export DISPLAY=:0
+python stop_vistrails_server.py http://$ADDRESS:$PORT
+sleep 5
+#try again because sometimes it doesn't quit
+python stop_vistrails_server.py http://$ADDRESS:$PORT
+
+#finally kill it if it still did not respond because it was hanging
+kill -9 `cat $PID`
+
+export PYTHONPATH=/home/emanuele/src/titan/build/lib:$PYTHONPATH
+export LD_LIBRARY_PATH=/home/emanuele/src/titan/build/lib:$LD_LIBRARY_PATH
+python vistrails_server.py -T $ADDRESS -R $PORT -C $CONF_FILE -O$NUMBER_OF_OTHER_VISTRAILS_INSTANCES $MULTI_OPTION&
+echo $! > $PID
+
diff --git a/scripts/start_vistrails_xvfb.sh b/scripts/start_vistrails_xvfb.sh
new file mode 100755
index 0000000..e57d256
--- /dev/null
+++ b/scripts/start_vistrails_xvfb.sh
@@ -0,0 +1,109 @@
+#!/bin/bash
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+#settings
+LOG_DIR=/server/vistrails/logs
+Xvfb_CMD=/usr/bin/Xvfb
+VIRTUAL_DISPLAY=":6"
+VISTRAILS_DIR=/server/vistrails/git/vistrails
+ADDRESS="vis-7.sci.utah.edu"
+PORT="8081"
+CONF_FILE="server.cfg"
+NUMBER_OF_OTHER_VISTRAILS_INSTANCES="1"
+MULTI_OPTION="-M"
+if (("$#" > "0")); then
+    VIRTUAL_DISPLAY="$1"
+fi
+if (("$#" > "1")); then
+    ADDRESS="$2"
+fi
+if (("$#" > "2")); then
+    PORT="$3"
+fi
+if (("$#" > "3")); then
+    NUMBER_OF_OTHER_VISTRAILS_INSTANCES="$4"
+fi
+if (("$#" == "5")); then
+   if(("$5" == "0")); then
+       MULTI_OPTION=""
+   else
+       MULTI_OPTION="-M"
+   fi
+fi
+
+Xvfb_PARAM="$VIRTUAL_DISPLAY -screen 0 1280x960x24"
+PID="$LOG_DIR/pid.$PORT.vistrails"
+LOG_XVFB="$LOG_DIR/xvfb$VIRTUAL_DISPLAY.log"
+
+#try to find Process ID of running X-Server
+echo "checking if Xvfb is already running..."
+echo "ps -eaf | grep $Xvfb_CMD | grep $VIRTUAL_DISPLAY | awk '{print \$2}'"
+pid=`ps -eaf | grep $Xvfb_CMD | grep $VIRTUAL_DISPLAY | awk '{print \$2}'`
+if [ "$pid" ]; then
+    echo "Xvfb already running [pid=${pid}]"
+else
+    #start a virtual server
+    if [ -x $Xvfb_CMD ]; then
+	$Xvfb_CMD $Xvfb_PARAM>& $LOG_XVFB &
+	
+	sleep 5
+
+	#Make sure it started
+	pid=`ps -eaf | grep $Xvfb_CMD | grep $VIRTUAL_DISPLAY | awk '{print $2}'`
+	if [ "$pid" ]; then
+	    echo "done."
+	else
+	    echo "FAILED."
+	fi
+    else
+	echo "Error: Could not find $Xvfb_CMD. Cannot start Xvfb."
+    fi
+fi
+echo -n "Starting VisTrails in Server Mode on display $VIRTUAL_DISPLAY.0 - "
+cd $VISTRAILS_DIR
+export DISPLAY=$VIRTUAL_DISPLAY
+python stop_vistrails_server.py http://$ADDRESS:$PORT
+#give some time for quitting                                                             
+sleep 5
+#try again because sometimes it doesn't quit                                           
+python stop_vistrails_server.py http://$ADDRESS:$PORT
+sleep 5
+
+#finally kill it if it still did not respond because it was hanging
+kill -9 `cat $PID`
+
+python vistrails_server.py -T $ADDRESS -R $PORT -C $CONF_FILE -O$NUMBER_OF_OTHER_VISTRAILS_INSTANCES $MULTI_OPTION&
+echo $! > $PID
+
diff --git a/scripts/system_info.py b/scripts/system_info.py
new file mode 100755
index 0000000..74c554b
--- /dev/null
+++ b/scripts/system_info.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Basic information
+
+import sys
+import platform
+
+print "Python:"
+print "  Basic version: %s.%s.%s" % (sys.version_info[0],
+                                     sys.version_info[1],
+                                     sys.version_info[2], )
+print "  Full version: " + sys.version.replace('\n', ' ')
+print
+
+def c(s):
+    return s or "<COULD NOT DETERMINE>"
+
+print "System:"
+print "  Type: " + c(platform.system())
+print "  Architecture: " + c(platform.architecture()[0])
+print "  Machine: " + c(platform.machine())
+print "  Platform: " + c(platform.platform())
+print "  Processor: " + c(platform.processor())
+print
+
+##############################################################################
+
+print "Libraries:"
+
+try:
+    import sip
+    print "  sip installed."
+    print "    version: " + sip.SIP_VERSION_STR
+except ImportError:
+    print "  sip NOT installed."
+print
+
+try:
+    import PyQt4.Qt
+    print "  PyQt installed."
+    print "    Qt version: " + PyQt4.Qt.QT_VERSION_STR
+    print "    PyQt version: " + PyQt4.Qt.PYQT_VERSION_STR
+except ImportError:
+    print "  PyQt NOT installed."
+print
+
+try:
+    import vtk
+    print "  VTK installed."
+    print "    VTK short version: " + vtk.vtkVersion().GetVTKVersion()
+    print "    VTK full version: " + vtk.vtkVersion().GetVTKSourceVersion()
+except ImportError:
+    print "  VTK NOT installed."
diff --git a/scripts/unzip_vistrail.sh b/scripts/unzip_vistrail.sh
new file mode 100755
index 0000000..8df1878
--- /dev/null
+++ b/scripts/unzip_vistrail.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+mkdir $2
+zipfile=`basename $1 .vt`.zip
+cp $1 $2/$zipfile
+pushd $2
+unzip $zipfile
+xmlpp.pl vistrail >vistrail_pp
+popd
diff --git a/scripts/update_copyright_year.py b/scripts/update_copyright_year.py
new file mode 100644
index 0000000..e770b6b
--- /dev/null
+++ b/scripts/update_copyright_year.py
@@ -0,0 +1,73 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Finds all .py files recursively in current directory (.)
+# and updates 2007 year with 2008 in the file header. 
+import re
+import os
+new_copyright = ["## Copyright (C) 2011-2014, NYU-Poly.\n"]
+
+re_copyright = re.compile(r"\s+## Copyright \(C\) 2011-2014, NYU-Poly\.\s+")
+line_copyright = re.compile(r"## Copyright \(C\) 2011-2014, NYU-Poly\.")
+IGNORE_LIST = ["update_copyright_year.py"]
+files = []
+for (path, dnames, fnames) in os.walk('.'):
+    for fn in fnames:
+        if fn not in IGNORE_LIST and fn.endswith(".py"):
+            files.append(os.path.join(path, fn))
+
+print len(files), " files found"
+count = 0
+for fname in files:
+    fin = open(fname)
+    lines = fin.readlines()
+    fin.seek(0)
+    all_lines = fin.read()
+    fin.close()
+    if re_copyright.search(all_lines) > 0:
+        #Search through the first lines because sometimes it's not exactly in the second line:
+        for i in [2,3,4,5]:
+            if line_copyright.search(lines[i]) > 0:
+                print "Updating: %s"%fname
+                newlines = lines[:i]
+                newlines.extend(new_copyright)
+                cropped = lines[i+1:] #Replace by i+1 when it is to update just the year.
+                newlines.extend(cropped)
+                fout = file(fname, 'w')
+                fout.writelines(newlines)
+                fout.close()
+                count += 1
+                break
+
+print count, " files updated"
diff --git a/scripts/update_db.py b/scripts/update_db.py
new file mode 100644
index 0000000..81c7acb
--- /dev/null
+++ b/scripts/update_db.py
@@ -0,0 +1,115 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import os
+import sys
+import tempfile
+sys.path.append(os.path.join(os.path.dirname(os.path.dirname(
+                os.path.abspath(__file__))), 'vistrails'))
+from vistrails.db.services import io
+from vistrails.db.versions import currentVersion
+from db_utils import parse_db_cmd_line
+
+# DO NOT RUN THIS WHILE USERS HAVE ACCESS TO THE DATABASE!
+def update_db(config, new_version=None, tmp_dir=None, restore=False):
+    obj_types = {'vistrail': io.open_bundle_from_db,
+                 # 'workflow': io.open_from_db, 
+                 # 'log': io.open_from_db,
+                 # 'registry': io.open_from_db
+                 }
+    if new_version is None:
+        new_version = currentVersion
+    if tmp_dir is None:
+        tmp_dir = tempfile.mkdtemp(prefix='vt_db')
+        print 'creating tmpdir:', tmp_dir
+
+    db_connection = io.open_db_connection(config)
+    obj_id_lists = {}
+    filenames = []
+    if restore:
+        for dirpath, dirname, files in os.walk(restore):
+            for fname in files:
+                if fname.endswith('.vt'):
+                    filenames.append(os.path.join(restore, fname))
+    else:
+        for obj_type in obj_types:
+            obj_id_lists[obj_type] = io.get_db_object_list(config, obj_type)
+
+        # read data out of database
+        thumbnail_dir = os.path.join(tmp_dir, 'thumbs')
+        os.mkdir(thumbnail_dir)
+        for obj_type, obj_ids in obj_id_lists.iteritems():
+            for (obj_id, _, _) in obj_ids:
+                old_version = io.get_db_object_version(db_connection, obj_id, 
+                                                       'vistrail')
+
+                print 'getting', obj_type, 'id', obj_id
+                local_tmp_dir = os.path.join(tmp_dir, str(obj_id))
+                vt_name = os.path.join(tmp_dir, str(obj_id) + '.vt')
+                filenames.append(vt_name)
+                os.mkdir(local_tmp_dir)
+                res = obj_types[obj_type](obj_type, db_connection, obj_id,
+                                          thumbnail_dir)
+                io.save_vistrail_bundle_to_zip_xml(res, vt_name, local_tmp_dir)
+
+        # drop the old database
+        # recreate with the new version of the specs
+        io.setup_db_tables(db_connection, None, old_version)
+
+    # add the new data back
+    for filename in filenames:
+        (res, _) = io.open_vistrail_bundle_from_zip_xml(filename)
+        try:
+            io.save_vistrail_bundle_to_db(res, db_connection, 'with_ids')
+        except Exception, e:
+            import traceback
+            print filename, e, traceback.format_exc()
+    io.close_db_connection(db_connection)
+
+if __name__ == '__main__':
+    import vistrails.core.application
+
+    more_options = {'v:': ('set new schema version', False, 'version'),
+                    'd:': ('set temporary directory', False, 'directory'),
+                    'e:': ('restore from directory', False, 'restore')
+                    }
+    config, options = parse_db_cmd_line(sys.argv, more_options)
+    new_version = None
+    if options['v']:
+        new_version = options['v']
+
+    vistrails.core.application.init()
+
+    update_db(config, new_version, options['d'], options['e']) 
diff --git a/scripts/update_email_contact.py b/scripts/update_email_contact.py
new file mode 100644
index 0000000..d9d8dc1
--- /dev/null
+++ b/scripts/update_email_contact.py
@@ -0,0 +1,37 @@
+# Finds all files matching extensions recursively in current directory (.)
+# and updates tthe contact e-mail address
+
+import re
+import os
+
+OLD_EMAIL = "Copyright (C) 2011-2012, NYU-Poly"
+NEW_EMAIL = "Copyright (C) 2011-2014, NYU-Poly"
+EXTENSIONS = [".py", ".xml", ".xsd", ".php", ".sql", ".sh", ".rst", ".tex",
+              ".txt", "LICENSE", ".iss", ".sty", ".mako"]
+IGNORE_LIST = ["update_email_contact.py"]
+
+files = []
+for (path, dnames, fnames) in os.walk('.'):
+    for fn in fnames:
+        for ext in EXTENSIONS:
+            if fn.endswith(ext) and fn not in IGNORE_LIST:
+                files.append(os.path.join(path, fn))
+                break
+
+print len(files), " files will be processed."
+
+count = 0
+for fname in files:
+    fin = open(fname)
+    all_lines = fin.read()
+    fin.close()
+    pos = all_lines.find(OLD_EMAIL)
+    if pos > -1:
+        print "Updating: %s"%fname
+        newlines = all_lines.replace(OLD_EMAIL, NEW_EMAIL)
+        fout = file(fname, 'w')
+        fout.write(newlines)
+        fout.close()
+        count += 1
+print count, " files updated "
+ 
\ No newline at end of file
diff --git a/scripts/update_hash.py b/scripts/update_hash.py
new file mode 100755
index 0000000..f3616f3
--- /dev/null
+++ b/scripts/update_hash.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+
+import glob
+import sys
+
+if len(sys.argv)<3:
+    print "Usage: ./update_hash.py old_hash new_hash"
+    sys.exit(-1)
+
+files = ["release_notes.py",
+         "create_release_wiki_table.py",
+         "../vistrails/core/system/__init__.py",
+         "../dist/mac/Input/README",
+         "../dist/windows/Input/releaseNotes.txt",
+         "../dist/source/make-vistrails-src-release.py",
+         "../doc/usersguide/conf.py"]
+
+for path in files:
+    for f in glob.glob(path):
+        print "Updating", f
+        
+        file = open(f)
+        text = file.read()
+        file.close()
+        
+        text = text.replace(sys.argv[1], sys.argv[2])
+        
+        file = open(f, "w")
+        file.write(text)
+        file.close()
diff --git a/scripts/update_to_mod_bsd_license.py b/scripts/update_to_mod_bsd_license.py
new file mode 100644
index 0000000..8c53cd3
--- /dev/null
+++ b/scripts/update_to_mod_bsd_license.py
@@ -0,0 +1,292 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Finds all .py files recursively in current directory (.)
+# and updates to modified BSD license in the file header. 
+import re
+import os
+py_bsd_3_license = """###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+xml_bsd_3_license = "<!--"+ py_bsd_3_license + "-->"
+php_bsd_3_license = """////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2006-2011, University of Utah. 
+// All rights reserved.
+// Contact: contact at vistrails.org
+//
+// This file is part of VisTrails.
+//
+// "Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+//  - Redistributions of source code must retain the above copyright notice, 
+//    this list of conditions and the following disclaimer.
+//  - Redistributions in binary form must reproduce the above copyright 
+//    notice, this list of conditions and the following disclaimer in the 
+//    documentation and/or other materials provided with the distribution.
+//  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+//
+////////////////////////////////////////////////////////////////////////////"""
+sql_bsd_3_license = """--#############################################################################
+--
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################"""
+py_old_license = """############################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+############################################################################
+"""
+sql_old_license = """--#########################################################################
+--
+-- Copyright (C) 2006-2010 University of Utah. All rights reserved.
+--
+-- This file is part of VisTrails.
+--
+-- This file may be used under the terms of the GNU General Public
+-- License version 2.0 as published by the Free Software Foundation
+-- and appearing in the file LICENSE.GPL included in the packaging of
+-- this file.  Please review the following to ensure GNU General Public
+-- Licensing requirements will be met:
+-- http://www.opensource.org/licenses/gpl-license.php
+--
+-- If you are unsure which license is appropriate for your use (for
+-- instance, you are interested in developing a commercial derivative
+-- of VisTrails), please contact us at contact at vistrails.org.
+--
+-- This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+-- WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+--
+--##########################################################################"""
+xml_old_license = """<!--########################################################################
+##
+## Copyright (C) 2006-2010 University of Utah. All rights reserved.
+##
+## This file is part of VisTrails.
+##
+## This file may be used under the terms of the GNU General Public
+## License version 2.0 as published by the Free Software Foundation
+## and appearing in the file LICENSE.GPL included in the packaging of
+## this file.  Please review the following to ensure GNU General Public
+## Licensing requirements will be met:
+## http://www.opensource.org/licenses/gpl-license.php
+##
+## If you are unsure which license is appropriate for your use (for
+## instance, you are interested in developing a commercial derivative
+## of VisTrails), please contact us at contact at vistrails.org.
+##
+## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+##
+#########################################################################-->"""
+
+php_old_license = """////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2006-2010 University of Utah. All rights reserved.
+//
+// This file is part of VisTrails.
+//
+// This file may be used under the terms of the GNU General Public
+// License version 2.0 as published by the Free Software Foundation
+// and appearing in the file LICENSE.GPL included in the packaging of
+// this file.  Please review the following to ensure GNU General Public
+// Licensing requirements will be met:
+// http://www.opensource.org/licenses/gpl-license.php
+//
+// If you are unsure which license is appropriate for your use (for
+// instance, you are interested in developing a commercial derivative
+// of VisTrails), please contact us at contact at vistrails.org.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+////////////////////////////////////////////////////////////////////////////"""
+def process_files(files, old_license, new_license, type):
+    count = 0
+    not_found = []
+    gpl_found = []
+    for fname in files:
+        fin = open(fname)
+        all_lines = fin.read()
+        fin.close()
+        pos = all_lines.find(old_license)
+        pos_gen = all_lines.find("GNU General Public")
+        if pos > -1:
+            print "Updating: %s"%fname
+            newlines = all_lines.replace(old_license, new_license)
+            fout = file(fname, 'w')
+            fout.write(newlines)
+            fout.close()
+            count += 1
+        else:
+            if pos_gen > -1:
+                gpl_found.append(fname)
+            else:
+                if all_lines.find(new_license) == -1:
+                    print "Appending license to %s"%fname
+                    newlines = new_license+"\n"+all_lines
+                    fout = file(fname, 'w')
+                    fout.write(newlines)
+                    fout.close()
+                    count +=1
+    print count, " %s files updated"%type
+    print " found reference to gpl in the following files:"
+    for fname in gpl_found:
+        print "  ", fname
+
+py_files = []
+xml_files = []
+php_files = []
+sql_files = []
+others = []
+for (path, dnames, fnames) in os.walk('.'):
+    for fn in fnames:
+        if fn.endswith(".py"):
+            py_files.append(os.path.join(path, fn))
+        elif fn.endswith(".xml") or fn.endswith(".xsd"):
+            xml_files.append(os.path.join(path,fn))
+        elif fn.endswith(".php"):
+            php_files.append(os.path.join(path,fn))
+        elif fn.endswith(".sql"):
+            sql_files.append(os.path.join(path,fn))
+        else:
+            others.append(os.path.join(path,fn))
+
+print len(py_files), " python files found"
+process_files(py_files, py_old_license, py_bsd_3_license, 'python')
+
+print len(sql_files), " sql files found"
+process_files(sql_files, sql_old_license, sql_bsd_3_license, 'sql')
+
+print len(xml_files), " xml files found"
+process_files(xml_files, xml_old_license, xml_bsd_3_license, 'xml')
+
+print len(php_files), " php files found"
+process_files(php_files, php_old_license, php_bsd_3_license, 'php')
+
+#print "Ignored files: "
+#for f in others:
+#    print f
diff --git a/scripts/update_vistrails_command.py b/scripts/update_vistrails_command.py
new file mode 100755
index 0000000..d59768c
--- /dev/null
+++ b/scripts/update_vistrails_command.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This script assumes that VisTrails.command file is located at ../ 
+Run this script after you copied the VisTrails folder and run from where it 
+is located. 
+
+"""
+import os, os.path
+
+if __name__ == "__main__":
+    # get VisTrails folder
+    vt_folder = os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))
+    app_command = os.path.join(vt_folder,'VisTrails.app/Contents/MacOS/vistrails')
+    command_file = os.path.join(vt_folder, 'VisTrails.command')
+    
+    file_header = """#This will execute VisTrails in a separate terminal window
+#If you get an error saying:
+#Found another instance of VisTrails running
+#Sending parameters to main instance  []
+#Failed:  QLocalSocket::connectToServer: Connection refused 
+#make sure VisTrails is not already running and simply try to run the script again
+#This might indicate that VisTrails did not quit properly 
+
+"""
+    file_contents = "DYLD_LIBRARY_PATH= " + app_command
+    f = open(command_file, 'w')
+    f.write(file_header)
+    f.write(file_contents)
+    f.close()
+    
diff --git a/scripts/watch_vistrail_servers.py b/scripts/watch_vistrail_servers.py
new file mode 100644
index 0000000..1396fca
--- /dev/null
+++ b/scripts/watch_vistrail_servers.py
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import xmlrpclib
+import os
+from subprocess import Popen, PIPE
+from time import sleep
+import smtplib
+from email.mime.text import MIMEText
+import logging
+import logging.handlers
+
+class VistrailWatcher(object):
+    """
+    A class for watching the status of VisTrail Servers running on a machine
+    Servers are pinged and if one down, it is restarted
+    """
+
+    def __init__(self, server, email_addresses, root_virtual_display=None):
+        self.server = server
+        self.root_virtual_display = root_virtual_display
+
+        self.email_addresses = email_addresses
+        self.sender = "vistrails_server_watcher@%s" % server
+
+        self.proxies = {}
+        self.is_down = {}
+
+        self.logger = self.make_logger("vt_watcher.log")
+
+        # find running VisTrails servers
+        proc1 = Popen(["ps", "-eaf"], stdout = PIPE)
+        proc2 = Popen(["grep", "vistrails_server"], stdin=proc1.stdout, stdout=PIPE)
+        proc3 = Popen(["awk", "{print $13}"], stdin=proc2.stdout, stdout=PIPE)
+        out, err = proc3.communicate()
+
+        # get the status servers ports (1 less than normal vt server port)
+        out = out.strip().split('\n')
+        self.ports = [int(x)-1 for x in out[1:]] # exclude multithreaded inst.
+
+        # create proxies
+        for port in self.ports:
+            self.proxies[port] = xmlrpclib.ServerProxy("http://%s:%d" % \
+                                                       (self.server, port))
+            self.is_down[port] = False
+
+    def make_logger(self, filename):
+        """ create logger instance with log file rotation """
+
+        logger = logging.getLogger("VistrailsWatcher")
+        handler = logging.handlers.RotatingFileHandler(filename,
+                                                       maxBytes = 1024*1024,
+                                                       backupCount=5)
+        handler.setFormatter(logging.Formatter('VT Watcher- %(asctime)s '
+                                               '%(levelname)-8s %(message)s'))
+        handler.setLevel(logging.DEBUG)
+        logger.setLevel(logging.DEBUG)
+        logger.addHandler(handler)
+        return logger
+
+    def send_email(self, msg):
+        """ send email notification that server is down """
+
+        if not self.email_addresses:
+            return
+
+        # Create a text/plain message
+        msg = MIMEText(msg)
+
+        msg['Subject'] = '%s VisTrails Server Down' % self.server
+        msg['From'] = self.sender
+        msg['To'] = ', '.join(self.email_addresses)
+
+        # Send the message via our own SMTP server, but don't include the
+        # envelope header.
+        s = smtplib.SMTP('localhost')
+        s.sendmail(self.sender, self.email_addresses, msg.as_string())
+        s.quit()
+
+    def restart_instance(self, port):
+        """ restart VisTrails Single Tread instance on given port """
+
+        self.logger.info("restarting server on port %s" % port)
+        script = os.path.join("/server/vistrails/git/scripts",
+                              "start_vistrails_xvfb.sh")
+
+        instance_virtual_display = self.root_virtual_display + \
+                self.ports.index(port) + 1
+
+        args = [script,":%s" % instance_virtual_display,
+                self.server, str(port+1), '0', '0']
+        try:
+            Popen(args)
+            sleep(20)
+        except Exception, e:
+            self.logger.error("Couldn't start the instance on display:"
+                              "%s port: %s") % (instance_virtual_display, port)
+            self.logger.error(str(e))
+
+    def watch(self):
+        """ ping Single Thread VisTrail servers every 5 mins """
+
+        if not self.ports:
+            self.logger.info("no running instances found")
+            print "no running instances found"
+            return
+
+        self.logger.info("watching %s" % str(self.ports))
+        while 1:
+            for port in self.ports:
+                try:
+                    if not self.proxies[port].try_ping():
+                        if not self.is_down[port]:
+                            # first time down, send email
+                            self.send_email("%s:%d is down" % (self.server, port))
+                            self.logger.info("%s:%d is down" % (self.server, port))
+                            self.restart_instance(port)
+                        self.is_down[port] = True
+                    else:
+                        if self.is_down[port]:
+                            self.logger.info("%s:%d is back up" % (self.server, port))
+                        self.is_down[port] = False
+                except Exception, e:
+                    if not self.is_down[port]:
+                        # first time down, send email
+                        self.send_email("%s:%d is down" % (self.server, port))
+                        self.logger.info("%s:%d is down" % (self.server, port))
+                        self.restart_instance(port)
+                    self.is_down[port] = True
+            sleep(60*5)
+
+
+if __name__ == '__main__':
+    vt_watcher = VistrailWatcher("vis-7.sci.utah.edu", ["phillipmates at gmail.com"], root_virtual_display = 6)
+    vt_watcher.watch()
diff --git a/scripts/win_update_bin.sh b/scripts/win_update_bin.sh
new file mode 100755
index 0000000..8fc9d4e
--- /dev/null
+++ b/scripts/win_update_bin.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+SRC_PATH="vistrails"
+BIN_PATH="vistrails"
+
+if [ -z "$1" ] || [ -z "$2" ]
+then
+    echo "usage: $0 <src_dir> <bin_dir>"
+    exit 65
+fi
+curdir=`pwd`
+cd "$1/$SRC_PATH"
+ELEMENTS="*"
+for elem in $ELEMENTS
+do
+    if [ -e "$2/$BIN_PATH/$elem" ]
+    then
+	rm -r "$2/$BIN_PATH/$elem"
+    fi
+    cp -r "$1/$SRC_PATH/$elem" "$2/$BIN_PATH/$elem"
+done
+cd "$curdir"
+
+if [ -e "$2/$BIN_PATH/.svn" ]
+then
+    rm -r "$2/$BIN_PATH/.svn"
+fi
+cp -r "$1/$SRC_PATH/.svn" "$2/$BIN_PATH/.svn"
+exit 0
diff --git a/vistrails/__init__.py b/vistrails/__init__.py
new file mode 100644
index 0000000..68d6941
--- /dev/null
+++ b/vistrails/__init__.py
@@ -0,0 +1,37 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Main file for the VisTrails distribution."""
+
+# FIXME: In the future, bootstrap everything from here.
diff --git a/vistrails/api/__init__.py b/vistrails/api/__init__.py
new file mode 100644
index 0000000..8e873b0
--- /dev/null
+++ b/vistrails/api/__init__.py
@@ -0,0 +1,378 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.gui.application import get_vistrails_application
+
+import unittest
+import copy
+import random
+import vistrails.gui.utils
+
+##############################################################################
+# Exceptions
+
+class NoVistrail(Exception):
+    pass
+
+class NoGUI(Exception):
+    pass
+
+##############################################################################
+
+def switch_to_pipeline_view():
+    """switch_to_pipeline_view():
+
+    Changes current viewing mode to pipeline view in the builder window.
+
+    """
+    get_vistrails_application().builderWindow.qactions['pipeline'].trigger()
+
+def switch_to_history_view():
+    """switch_to_history_view():
+
+    Changes current viewing mode to history view in the builder window.
+
+    """
+    get_vistrails_application().builderWindow.qactions['history'].trigger()
+    
+def switch_to_query_view():
+    """switch_to_query_view():
+
+    Changes current viewing mode to query view in the builder window.
+
+    """
+    get_vistrails_application().builderWindow.qactions['search'].trigger()
+
+def switch_to_mashup_view():
+    """switch_to_mashup_view():
+
+    Changes current viewing mode to mashup view in the builder window.
+
+    """
+    get_vistrails_application().builderWindow.qactions['mashup'].trigger()
+ 
+################################################################################
+# Access to current state
+
+def get_builder_window():
+    """get_builder_window():
+
+    returns the main VisTrails GUI window
+
+    raises NoGUI.
+
+    """
+    try:
+        return get_vistrails_application().builderWindow
+    except AttributeError:
+        raise NoGUI
+    
+def get_current_controller():
+    """get_current_controller():
+
+    returns the VistrailController of the currently selected vistrail.
+
+    raises NoVistrail.
+
+    """
+    try:
+        return get_vistrails_application().builderWindow.get_current_controller()
+    except AttributeError:
+        raise NoVistrail
+
+def get_current_vistrail():
+    """get_current_vistrail():
+
+    Returns the currently selected vistrail.
+
+    """
+    return get_current_controller().vistrail
+
+def get_current_vistrail_view():
+    """get_current_vistrail():
+
+    Returns the currently selected vistrail view.
+
+    """
+    view = get_vistrails_application().builderWindow.get_current_view()
+    if view is None:
+        raise NoVistrail
+    return view    
+
+def close_current_vistrail(quiet=False):
+    get_vistrails_application().builderWindow.close_vistrail(get_current_vistrail_view())
+
+def get_module_registry():
+    from vistrails.core.modules.module_registry import get_module_registry
+    return get_module_registry()
+
+##############################################################################
+# Do things
+
+def add_module(x, y, identifier, name, namespace, controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    if controller.current_version==-1:
+        controller.change_selected_version(0)
+    result = controller.add_module(x, y, identifier, name, namespace)
+    controller.updatePipelineScene()
+    result = controller.current_pipeline.modules[result.id]
+    return result
+    
+def add_module_from_descriptor(descriptor, x=0.0, y=0.0, 
+                               internal_version=-1, controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    if controller.current_version==-1:
+        controller.change_selected_version(0)
+    result = controller.add_module_from_descriptor(descriptor, x, y, 
+                                                   internal_version)
+    controller.updatePipelineScene()
+    result = controller.current_pipeline.modules[result.id]
+    return result
+    
+def add_connection(output_id, output_port_spec, input_id, input_port_spec, 
+                   controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    result = controller.add_connection(output_id, output_port_spec,
+                                       input_id, input_port_spec)
+    controller.updatePipelineScene()
+    result = controller.current_pipeline.connections[result.id]
+    return result
+
+def create_group(module_ids, connection_ids, controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    controller.create_group(module_ids, connection_ids)
+    controller.updatePipelineScene()
+
+def get_modules_by_name(name, package=None, namespace=None, controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    res = []
+    for module in controller.current_pipeline.modules.itervalues():
+        if (module.name == name and
+            (package is None or module.package == package) and
+            (namespace is None or module.namespace == namespace)):
+            res.append(module)
+    return res
+
+def get_selected_modules(controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    modules = []
+    selected = controller.get_selected_item_ids()
+    if selected is None:
+        return []
+    (sel_module_ids, sel_connection_ids) = selected
+    for m_id in sel_module_ids:
+        modules.append(controller.current_pipeline.modules[m_id])
+    return modules
+    
+def change_parameter(module_id, function_name, param_list, function_id=-1L,
+                     alias_list=[], controller=None):
+    """change_parameter(module_id: long, 
+                        function_name: str, 
+                        param_list: list(str),
+                        function_id: long,
+                        alias_list: list(str),
+                        controller: VistrailController,
+                        ) -> None
+    Note: param_list is a list of strings no matter what the parameter type!
+    Note: alias_list will be REMOVED!!
+    """
+    if controller is None:
+        controller = get_current_controller()
+    module = controller.current_pipeline.modules[module_id]
+    controller.update_function(module, function_name, param_list, function_id, 
+                               alias_list)
+    controller.updatePipelineScene()
+
+def change_parameter_by_id(module_id, function_id, old_param_id, new_value, 
+                           controller=None):
+    """change_parameter_by_id(module_id: long,
+                             function_id: long,
+                             old_param_id: long,
+                             new_value: str,
+                             controller: VistrailController) -> long
+    Returns the id of the new parameter.
+    Note: function_id is the real_id! Use f.real_id to access real_id
+    Note: old_param_id is the real_id! Use p.real_id to access real_id
+    """
+    if controller is None:
+        controller = get_current_controller()
+    module = controller.current_pipeline.modules[module_id]
+    function = module.function_idx[function_id]
+    pos = function.parameter_idx[old_param_id].pos
+    controller.update_parameter(function, old_param_id, new_value)
+    controller.updatePipelineScene()
+    return function.params[pos].real_id
+
+def change_parameter_by_pos(module_id, function_pos, old_param_pos, new_value,
+                            controller=None):
+    """change_parameter_by_id(module_id: long,
+                             function_pos: int,
+                             old_param_pos: int,
+                             new_value: str,
+                             controller: VistrailController) -> long
+    Returns the id of the new parameter.
+    """
+    if controller is None:
+        controller = get_current_controller()
+    module = controller.current_pipeline.modules[module_id]
+    function = module.functions[function_pos]
+    old_param_id = function.params[old_param_pos].real_id
+    controller.update_parameter(function, old_param_id, new_value)
+    controller.updatePipelineScene()
+    return function.params[old_param_pos].real_id
+
+def add_port_spec(module_id, port_spec, controller=None):
+    if controller is None:
+        controller = get_current_controller()
+    # module = controller.current_pipeline.modules[module_id]
+    controller.add_module_port(module_id, (port_spec.type, port_spec.name,
+                                           port_spec.sigstring))
+    controller.updatePipelineScene()
+
+##############################################################################
+
+def select_version(version, ctrl=None):
+    """select_version(int or str, ctrl=None):
+
+    Given an integer, selects a version with the given number from the
+    given vistrail (or the current one if no controller is given).
+
+    Given a string, selects a version with that tag.
+
+    """
+    if ctrl is None:
+        ctrl = get_current_controller()
+    vistrail = ctrl.vistrail
+    if isinstance(version, str):
+        version = vistrail.get_tag_str(version).action_id
+    ctrl.change_selected_version(version)
+    ctrl.invalidate_version_tree(False)
+
+def undo():
+    get_current_vistrail_view().undo()
+
+def redo():
+    get_current_vistrail_view().redo()
+
+def get_available_versions():
+    """get_available_version(): ([int], {int: str})
+
+    From the currently selected vistrail, return all available
+    versions and the existing tags.
+
+    """
+    ctrl = get_current_controller()
+    vistrail = ctrl.vistrail
+    return (vistrail.actionMap.keys(), vistrail.get_tagMap())
+
+def open_vistrail_from_file(filename):
+    from vistrails.core.db.locator import FileLocator
+
+    f = FileLocator(filename)
+    view = get_builder_window().open_vistrail(f)
+    return view
+
+def close_vistrail(view, quiet=True):
+    """close_vistrail(view: QVistrailView, quiet:bool)-> None
+    Closes vistrail in view. If quiet is True it will discard changes
+    automatically.
+    
+    """
+    get_builder_window().close_vistrail(view, quiet=quiet)
+
+def close_all_vistrails(quiet=True):
+    get_builder_window().close_all_vistrails(quiet)
+    
+def new_vistrail():
+    # Returns VistrailView - remember to be consistent about it..
+    get_vistrails_application().builderWindow.new_vistrail(False)
+    result = get_vistrails_application().builderWindow.get_current_view()
+    return result
+
+def get_vistrail_from_file(filename):
+    from vistrails.core.db.locator import FileLocator
+    from vistrails.core.vistrail.vistrail import Vistrail
+    v = FileLocator(filename).load()
+    if not isinstance(v, Vistrail):
+        v = v.vistrail
+    return v
+
+##############################################################################
+# Testing
+
+
+class TestAPI(vistrails.gui.utils.TestVisTrailsGUI):
+
+    def setUp(self):
+        app = vistrails.gui.application.get_vistrails_application()
+        app.builderWindow.auto_view = False
+        app.builderWindow.close_all_vistrails(True)
+
+    def test_close_current_vistrail_no_vistrail(self):
+        self.assertRaises(NoVistrail, lambda: get_current_vistrail_view())
+
+    def test_new_vistrail_no_save(self):
+        v = new_vistrail()
+        import vistrails.gui.vistrail_view
+        assert isinstance(v, vistrails.gui.vistrail_view.QVistrailView)
+        assert not v.controller.changed
+        close_vistrail(v)
+
+    def test_new_vistrail_button_states(self):
+        assert get_vistrails_application().builderWindow.qactions['newVistrail'].isEnabled()
+        assert not get_vistrails_application().builderWindow.qactions['closeVistrail'].isEnabled()
+        assert not get_vistrails_application().builderWindow.qactions['saveFile'].isEnabled()
+        assert not get_vistrails_application().builderWindow.qactions['saveFileAs'].isEnabled()
+        view = new_vistrail()
+        assert get_vistrails_application().builderWindow.qactions['newVistrail'].isEnabled()
+        assert get_vistrails_application().builderWindow.qactions['closeVistrail'].isEnabled()
+        self.assertEqual(get_vistrails_application().builderWindow.qactions['saveFile'].isEnabled(),
+                         view.has_changes())
+        assert get_vistrails_application().builderWindow.qactions['saveFileAs'].isEnabled()
+
+    def test_detach_vistrail(self):
+        view = new_vistrail()
+        get_vistrails_application().builderWindow.detach_view(view)
+        get_vistrails_application().builderWindow.attach_view(view)
+        close_vistrail(view)
+
+    
+    
+    
diff --git a/vistrails/core/__init__.py b/vistrails/core/__init__.py
new file mode 100644
index 0000000..cb7e847
--- /dev/null
+++ b/vistrails/core/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+def get_vistrails_application():
+    import vistrails.core.application
+    return vistrails.core.application.get_vistrails_application()
+
+def is_running_gui():
+    return get_vistrails_application() and get_vistrails_application().is_running_gui()
diff --git a/vistrails/core/analogy/__init__.py b/vistrails/core/analogy/__init__.py
new file mode 100644
index 0000000..d1687d7
--- /dev/null
+++ b/vistrails/core/analogy/__init__.py
@@ -0,0 +1,456 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.data_structures.bijectivedict import Bidict
+from itertools import imap, chain
+from vistrails.core.modules.module_registry import get_module_registry, \
+    ModuleRegistryException
+import vistrails.core.db.io
+from vistrails.core.requirements import MissingRequirement
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.port_spec import PortSpec, PortEndPoint
+import copy
+from vistrails.core.vistrail.pipeline import Pipeline
+
+from eigen import *
+
+##########################################################################
+
+
+_debug = False
+
+def perform_analogy_on_vistrail(vistrail, version_a, version_b, version_c, 
+                                pipeline_a=None, pipeline_c=None, alpha=0.15):
+    """perform_analogy(vistrail, version_a, version_b, version_c,
+                       pipeline_a=None, pipeline_c=None, alpha=0.15): action
+    Creates a new action version_d to the vistrail such that the difference
+    between a and b is the same as between c and d, and returns this
+    action."""
+
+    ############################################################################
+    # STEP 1: find mapping from a to c
+
+    #     pipeline_c = Pipeline(vistrail.actionChain(version_c))
+    #     pipeline_a = Pipeline(vistrail.actionChain(version_a))
+
+    if _debug:
+        print 'version_a:', version_a
+        print 'version_b:', version_b
+        print 'version_c:', version_c
+
+    if pipeline_a is None:
+        pipeline_a = vistrails.core.db.io.get_workflow(vistrail, version_a)
+        pipeline_a.validate()
+    if pipeline_c is None:
+        pipeline_c = vistrails.core.db.io.get_workflow(vistrail, version_c)
+        pipeline_c.validate()
+    
+    e = EigenPipelineSimilarity2(pipeline_a, pipeline_c, alpha=alpha)
+    e._debug = _debug
+
+    (input_module_remap,
+     output_module_remap,
+     combined_module_remap) = e.solve()
+
+    if _debug:
+        print 'Input remap'
+        print input_module_remap
+        print 'Output remap'
+        print output_module_remap
+        print 'Combined remap'
+        print combined_module_remap
+
+    module_remap = combined_module_remap
+    if _debug:
+        print "Computing names..."
+        
+    def name_remap(d):
+        return dict([(from_id,
+                      pipeline_c.modules[to_id].name)
+                     for (from_id, to_id)
+                     in d.iteritems()])
+
+    module_name_remap = name_remap(module_remap)
+    input_module_name_remap = name_remap(input_module_remap)
+    output_module_name_remap = name_remap(output_module_remap)
+
+    if _debug:
+        print 'Name remap'
+        print module_name_remap
+
+    # find connection remap
+    connection_remap = {}
+    for a_connect in pipeline_a.connections.itervalues():
+        # FIXME assumes that all connections have both source and dest
+        a_source = a_connect.source.moduleId
+        a_dest = a_connect.destination.moduleId
+        match = None
+        for c_connect in pipeline_c.connections.itervalues():
+            if (output_module_remap[a_source] == c_connect.source.moduleId and 
+                input_module_remap[a_dest] == c_connect.destination.moduleId):
+                match = c_connect
+                if (a_connect.source.spec == c_connect.source.spec and 
+                    a_connect.destination.spec == c_connect.destination.spec):
+                    break
+        if match is not None:
+            connection_remap[a_connect.id] = c_connect.id
+        elif _debug:
+            print "failed to find connection match", a_connect.id, a_source, \
+                a_dest
+
+    # find function remap
+
+    # construct total remap
+    id_remap = {}
+    sum_ax = 0.0
+    sum_ay = 0.0
+    sum_cx = 0.0
+    sum_cy = 0.0
+    for (a_id, c_id) in module_remap.iteritems():
+        id_remap[('module', a_id)] = c_id
+        module_a = pipeline_a.modules[a_id]
+        sum_ax += module_a.location.x
+        sum_ay += module_a.location.y
+        module_c = pipeline_c.modules[c_id]
+        sum_cx += module_c.location.x
+        sum_cy += module_c.location.y
+        
+    if len(module_remap) != 0:
+        avg_ax = sum_ax / len(module_remap)
+        avg_ay = sum_ay / len(module_remap)
+        avg_cx = sum_cx / len(module_remap)
+        avg_cy = sum_cy / len(module_remap)
+    else:
+        avg_ax = 0.0
+        avg_ay = 0.0
+        avg_cx = 0.0
+        avg_cy = 0.0
+        
+#    avg_ax = sum_ax / len(module_remap) if len(module_remap) != 0 else 0.0
+#    avg_ay = sum_ay / len(module_remap) if len(module_remap) != 0 else 0.0
+#    avg_cx = sum_cx / len(module_remap) if len(module_remap) != 0 else 0.0
+#    avg_cy = sum_cy / len(module_remap) if len(module_remap) != 0 else 0.0
+        
+    for (a_id, c_id) in connection_remap.iteritems():
+        id_remap[('connection', a_id)] = c_id
+    ############################################################################
+    # STEP 2: find actions to be remapped (b-a)
+
+    # this creates a new action with new operations
+    baAction = vistrails.core.db.io.getPathAsAction(vistrail, version_a, version_b, True)
+
+#     for operation in baAction.operations:
+#         print "ba_op0:", operation.id,  operation.vtType, operation.what, 
+#         print operation.old_obj_id, "to", operation.parentObjType,
+#         print operation.parentObjId
+
+    ############################################################################
+    # STEP 3: remap (b-a) using mapping in STEP 1 so it can be applied to c
+
+    # for all module references, update the module ids according to the remap
+    # need to consider modules, parent_obj_ids, ports
+    # if things don't make sense, they're cut out in STEP 4, not here
+
+    reg = get_module_registry()
+    ops = []
+
+    # NOTE !!! delete ops are before any add ops so this is ok !!!
+    # if this changes, this may break
+    c_modules = set(pipeline_c.modules)
+    c_connections = set(pipeline_c.connections)
+    c_locations = dict((m_id, m.location) 
+                       for (m_id, m) in pipeline_c.modules.iteritems())
+    c_annotations = dict(((m_id, a.key), a) for m_id, m in \
+                             pipeline_c.modules.iteritems()
+                         for a in m.annotations)
+    c_parameters = dict(((f.real_id, p.pos), p) 
+                        for m in pipeline_c.modules.itervalues() 
+                        for f in m.functions 
+                        for p in f.parameters)
+    conns_to_delete = set()
+
+    for op in baAction.operations:
+        if op.vtType == 'delete':
+            parent_obj_type = op.parentObjType
+            if parent_obj_type == 'abstraction' or parent_obj_type == 'group':
+                parent_obj_type = 'module'
+            if (op.what == 'module' or 
+                op.what == 'abstraction' or 
+                op.what == 'group'):
+                if module_remap.has_key(op.old_obj_id):
+                    remap_id = module_remap[op.old_obj_id]
+                    module = pipeline_c.modules[remap_id]
+                    graph = pipeline_c.graph
+                    for _, c_id in graph.edges_from(remap_id):
+                        conn = pipeline_c.connections[c_id]
+                        ops.extend(vistrails.core.db.io.create_delete_op_chain(conn))
+                    for _, c_id in graph.edges_to(remap_id):
+                        conn = pipeline_c.connections[c_id]
+                        ops.extend(vistrails.core.db.io.create_delete_op_chain(conn))
+                    ops.extend(vistrails.core.db.io.create_delete_op_chain(module))
+                    c_modules.discard(remap_id)
+                else:
+                    ops.append(op)
+                    c_modules.discard(op.old_obj_id)
+            elif op.what == 'connection':
+                if connection_remap.has_key(op.old_obj_id):
+                    conn = pipeline_c.connections[connection_remap[ \
+                            op.old_obj_id]]
+                    ops.extend(vistrails.core.db.io.create_delete_op_chain(conn))
+                    c_connections.discard(conn.id)
+                else:
+                    ops.append(op)
+                    c_connections.discard(op.old_obj_id)
+            elif (parent_obj_type, op.parentObjId) not in id_remap:
+                if op.what == 'location':
+                    c_locations.pop(op.parentObjId, None)
+                if op.what == 'annotation':
+                    for (m_id, key), a in c_annotations.iteritems():
+                        if a.id == op.old_obj_id:
+                            c_annotations.pop((m_id, key), None)
+                            break
+                if op.what == 'parameter':
+                    for (f_id, pos), p in c_parameters.iteritems():
+                        if p.real_id == op.old_obj_id:
+                            c_parameters.pop((f_id, pos), None)
+                            break
+                    
+                ops.append(op)
+        elif op.vtType == 'add' or op.vtType == 'change':
+            old_id = op.new_obj_id
+            new_id = vistrail.idScope.getNewId(op.what)
+            op.new_obj_id = new_id
+            op.data.db_id = new_id
+            op_what = op.what
+            if op_what == 'abstraction' or op_what == 'group':
+                op_what = 'module'
+            id_remap[(op_what, old_id)] = new_id
+            if (op.what == 'module' or 
+                op.what == 'abstraction' or 
+                op.what == 'group'):
+                module_name_remap[old_id] = op.data.name
+                c_modules.add(new_id)
+            elif op.what == 'connection':
+                c_connections.add(new_id)
+
+            parent_obj_type = op.parentObjType
+            if parent_obj_type == 'abstraction' or parent_obj_type == 'group':
+                parent_obj_type = 'module'
+            if op.parentObjId is not None and \
+                    id_remap.has_key((parent_obj_type, op.parentObjId)):
+                op.parentObjId = id_remap[(parent_obj_type, op.parentObjId)]
+            if op.what == 'location':
+                # need to make this a 'change' if it's an 'add' and
+                # the module already exists
+                if op.vtType == 'add':
+                    if op.parentObjId in c_locations:
+                        new_op_list = vistrails.core.db.io.create_change_op_chain(
+                            c_locations[op.parentObjId], op.data,
+                            (op.parentObjType, op.parentObjId))
+                        op = new_op_list[0]
+                    c_locations[op.parentObjId] = op.data
+                elif op.vtType == 'change':
+                    c_locations[op.parentObjId] = op.data
+            elif op.what == 'annotation':
+                if op.vtType == 'add':
+                    if (op.parentObjId, op.data.key) in c_annotations:
+                        new_op_list = vistrails.core.db.io.create_change_op_chain(
+                            c_annotations[(op.parentObjId, op.data.key)],
+                            op.data,
+                            (Module.vtType, op.parentObjId))
+                        op = new_op_list[0]
+                    c_annotations[(op.parentObjId, op.data.key)] = op.data
+                elif op.vtType == 'change':
+                    c_annotations[(op.parentObjId, op.data.key)] = op.data
+            elif op.what == 'parameter':
+                if op.vtType == 'add':
+                    if (op.parentObjId, op.data.pos) in c_parameters:
+                        new_op_list = vistrails.core.db.io.create_change_op_chain(
+                            c_parameters[(op.parentObjId, op.data.pos)],
+                            op.data,
+                            (ModuleFunction.vtType, op.parentObjId))
+                        op = new_op_list[0]
+                    c_parameters[(op.parentObjId, op.data.pos)] = op.data
+                elif op.vtType == 'change':
+                    c_parameters[(op.parentObjId, op.data.pos)] = op.data
+            elif op.what == 'port':
+                port = op.data
+                # check the input/output module remaps since that is
+                # what we use to modify the ids
+                if port.type == 'source' and \
+                        port.moduleId in output_module_remap:
+                    temp_id = output_module_remap[port.moduleId]
+                elif port.type == 'destination' and \
+                        port.moduleId in input_module_remap:
+                    temp_id = input_module_remap[port.moduleId]
+                else:
+                    temp_id = port.moduleId
+                if ('module', temp_id) in id_remap:
+                    temp_id = id_remap[('module', temp_id)]
+                if temp_id in c_modules:
+                    if port.type == 'source':
+                        try:
+                            port.moduleName = output_module_name_remap[port.moduleId]
+                            port.moduleId = output_module_remap[port.moduleId]
+                            m = pipeline_c.modules[port.moduleId]
+                            d = m.module_descriptor
+                            def remap():
+                                port_type = \
+                                    PortSpec.port_type_map.inverse[port.type]
+                                try:
+                                    pspec = reg.get_port_spec(m.package, m.name,
+                                                              m.namespace,
+                                                              port.name, 
+                                                              port_type)
+                                except ModuleRegistryException:
+                                    return False
+                                all_ports = reg.all_source_ports(d)
+                                # print "pspec", pspec
+                                # First try to find a perfect match
+                                for (klass_name, ports) in all_ports:
+                                    for candidate_port in ports:
+                                        if (candidate_port.type_equals(pspec) and
+                                            candidate_port.name == port.name):
+                                            #print "found perfect match"
+                                            port.spec = candidate_port
+                                            return True
+                                # Now try to find an imperfect one
+                                for (klass_name, ports) in all_ports:
+                                    for candidate_port in ports:
+                                        print candidate_port
+                                        if candidate_port.type_equals(pspec):
+                                            #print "found imperfect match"
+                                            port.name = candidate_port.name
+                                            port.spec = candidate_port
+                                            return True
+                                return False
+                            if not remap():
+                                print "COULD NOT FIND source MATCH!!!"
+                        except KeyError:
+                            # This happens when the module was added as part of the analogy
+                            port.moduleName = module_name_remap[port.moduleId]
+                            port.moduleId = id_remap[('module', port.moduleId)]
+                    elif port.type == 'destination':
+                        try:
+                            port.moduleName = input_module_name_remap[port.moduleId]
+                            port.moduleId = input_module_remap[port.moduleId]
+                            m = pipeline_c.modules[port.moduleId]
+                            d = m.module_descriptor
+                            def remap():
+                                port_type = \
+                                    PortSpec.port_type_map.inverse[port.type]
+                                try:
+                                    pspec = reg.get_port_spec(m.package, m.name,
+                                                              m.namespace,
+                                                              port.name, 
+                                                              port_type)
+                                    # print "This is the spec", port.spec, \
+                                    #     port.db_spec
+                                except ModuleRegistryException:
+                                    return False
+                                all_ports = reg.all_destination_ports(d)
+                                # First try to find a perfect match
+                                for (klass_name, ports) in all_ports:
+                                    for candidate_port in ports:
+                                        if (candidate_port.type_equals(pspec) and
+                                            candidate_port.name == port.name):
+                                            # print "found perfect match"
+                                            port.spec = candidate_port
+                                            return True
+                                # Now try to find an imperfect one
+                                for (klass_name, ports) in all_ports:
+                                    for candidate_port in ports:
+                                        if candidate_port.type_equals(pspec):
+                                            # print "found imperfect match"
+                                            port.name = candidate_port.name
+                                            port.spec = candidate_port
+                                            return True
+                                return False
+                            if not remap():
+                                print "COULD NOT FIND destination MATCH!!!"
+                            remap()
+                        except KeyError:
+                            # This happens when the module was added as part of the analogy
+                            port.moduleName = module_name_remap[port.moduleId]
+                            port.moduleId = id_remap[('module', port.moduleId)]
+                else:
+                    # delete the connection since it won't work
+                    conns_to_delete.add(op.parentObjId)
+                    continue
+            ops.append(op)
+
+    baAction.operations = []
+    for op in ops:
+        if op.what == 'connection' and op.new_obj_id in conns_to_delete:
+            pass
+        elif op.what == 'port' and op.parentObjId in conns_to_delete:
+            pass
+        else:
+            baAction.operations.append(op)
+
+    # baAction.operations = ops
+    
+    # baAction should now have remapped everything
+
+    ############################################################################
+    # STEP 4: apply remapped (b-a) to c
+
+    # some actions cannot be applied because they reference stuff that
+    # isn't in c.  need to no-op for them
+    
+    # want to take the pipeline for c and simply apply (b-a), but return
+    # False for operations that don't make sense.
+    
+    # get operationDict for c, do update with baAction but discard ops
+    # that don't make sense
+
+#     for operation in baAction.operations:
+#         print "ba_op1:", operation.id, operation.vtType, operation.what, 
+#         print operation.old_obj_id, "to", operation.parentObjType,
+#         print operation.parentObjId
+
+    baAction.prevId = version_c
+    vistrails.core.db.io.fixActions(vistrail, version_c, [baAction])
+    for operation in baAction.operations:
+        if operation.what == 'location' and (operation.vtType == 'add' or
+                                             operation.vtType == 'change'):
+            operation.data.x -= avg_ax - avg_cx
+            operation.data.y -= avg_ay - avg_cy
+#         print "ba_op2:", operation.id, operation.vtType, operation.what, 
+#         print operation.old_obj_id, "to", operation.parentObjType,
+#         print operation.parentObjId
+    # this will be taken care by the controller
+    #vistrail.add_action(baAction, version_c)
+    return baAction
diff --git a/vistrails/core/analogy/eigen.py b/vistrails/core/analogy/eigen.py
new file mode 100644
index 0000000..2a81e7e
--- /dev/null
+++ b/vistrails/core/analogy/eigen.py
@@ -0,0 +1,566 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.bundles import py_import
+from vistrails.core.data_structures.bijectivedict import Bidict
+from itertools import imap, chain
+import copy
+
+import math
+import operator
+from pipeline_utils import *
+
+from vistrails.core.utils import append_to_dict_of_lists
+from vistrails.core.system import temporary_directory
+
+import scipy
+
+
+##############################################################################
+# This is the analogy implementation
+
+##############################################################################
+# EigenBase
+
+def mzeros(*args, **kwargs):
+    nkwargs = copy.copy(kwargs)
+    nkwargs['dtype'] = float
+    az = scipy.zeros(*args, **nkwargs)
+    return scipy.matrix(az)
+
+def mones(*args, **kwargs):
+    nkwargs = copy.copy(kwargs)
+    nkwargs['dtype'] = float
+    az = scipy.ones(*args, **nkwargs)
+    return scipy.matrix(az)
+
+#mzeros = lambda *args, **kwargs: scipy.matrix(scipy.zeros(*args, **kwargs))
+# mones = lambda *args, **kwargs: scipy.matrix(scipy.ones(*args, **kwargs))
+ 
+class EigenBase(object):
+
+    ##########################################################################
+    # Constructor and initialization
+
+    def __init__(self,
+                 pipeline1,
+                 pipeline2):
+        self._p1 = pipeline1
+        self._p2 = pipeline2
+        self._debug = False
+        self.init_vertex_similarity()
+        self.init_edge_similarity()
+
+    def init_vertex_similarity(self):
+        num_verts_p1 = len(self._p1.graph.vertices)
+        num_verts_p2 = len(self._p2.graph.vertices)
+        m_i = mzeros((num_verts_p1, num_verts_p2))
+        m_o = mzeros((num_verts_p1, num_verts_p2))
+        def get_vertex_map(g):
+            return Bidict([(v, k) for (k, v)
+                           in enumerate(g.iter_vertices())])
+        # vertex_maps: vertex_id to matrix index
+        self._g1_vertex_map = get_vertex_map(self._p1.graph)
+        self._g2_vertex_map = get_vertex_map(self._p2.graph)
+        for i in xrange(num_verts_p1):
+            for j in xrange(num_verts_p2):
+                v1_id = self._g1_vertex_map.inverse[i]
+                v2_id = self._g2_vertex_map.inverse[j]
+                (in_s8y, out_s8y) = self.compare_modules(v1_id, v2_id)
+                m_i[i,j] = in_s8y
+                m_o[i,j] = out_s8y
+        # print m_i
+        # print m_o
+        self._input_vertex_s8y = m_i
+        self._output_vertex_s8y = m_o
+        self._vertex_s8y = (m_i + m_o) / 2.0
+
+    def init_edge_similarity(self):
+        def get_edge_map(g):
+            itor = enumerate(imap(lambda x: x[2],
+                                  g.iter_all_edges()))
+            return Bidict([(v, k) for (k, v)
+                           in itor])
+        # edge_maps: edge_id to matrix index
+        self._g1_edge_map = get_edge_map(self._p1.graph)
+        self._g2_edge_map = get_edge_map(self._p2.graph)
+
+        m_e = mzeros((len(self._g1_edge_map),
+                      len(self._g2_edge_map)))
+
+        for i in xrange(len(self._g1_edge_map)):
+            for j in xrange(len(self._g2_edge_map)):
+                c1_id = self._g1_edge_map.inverse[i]
+                c2_id = self._g2_edge_map.inverse[j]
+                s8y = self.compare_connections(c1_id, c2_id)
+                m_e[i, j] = s8y
+        self._edge_s8y = m_e
+
+    ##########################################################################
+    # Atomic comparisons for modules and connections
+
+    def create_type_portmap(self, ports):
+        result = {}
+        for port_name, port_descs in ports.iteritems():
+            for port_desc in port_descs:
+                sp = tuple(port_desc)
+                append_to_dict_of_lists(result, sp, port_name)
+        return result
+
+    def compare_modules(self, p1_id, p2_id):
+        """Returns two values \in [0, 1] that is how similar the
+        modules are intrinsically, ie. without looking at
+        neighborhoods. The first value gives similarity wrt input
+        ports, the second to output ports."""
+        (m1_inputs, m1_outputs) = self.get_ports(self._p1.modules[p1_id])
+        (m2_inputs, m2_outputs) = self.get_ports(self._p2.modules[p2_id])
+
+
+        m2_input_hist = self.create_type_portmap(m2_inputs)
+        m2_output_hist = self.create_type_portmap(m2_outputs)
+
+        output_similarity = 0.0
+        total = 0
+        # Outputs can be covariant, inputs can be contravariant
+        # FIXME: subtypes, etc etc
+        for (port_name, port_descs) in m1_outputs.iteritems():
+            # we use max() .. because we want to count
+            # nullary ports as well
+            total_descs = max(len(port_descs), 1)
+            total += total_descs
+            # assert len(port_descs) == 1
+            if (m2_outputs.has_key(port_name) and
+                m2_outputs[port_name] == port_descs):
+                output_similarity += float(total_descs)
+            else:
+                for port_desc in port_descs:
+                    port_desc = tuple(port_desc)
+                    if m2_output_hist.has_key(port_desc):
+                        output_similarity += 1
+        if len(m1_outputs):
+            output_similarity /= total
+        else:
+            output_similarity = 0.2
+
+        if (self._p1.modules[p1_id].name !=
+            self._p2.modules[p2_id].name):
+            output_similarity *= 0.99
+
+        input_similarity = 0.0
+        total = 0
+        # FIXME: consider supertypes, etc etc
+        
+        for (port_name, port_descs) in m1_inputs.iteritems():
+            # we use max() .. because we want to count
+            # nullary ports as well
+            total_descs = max(len(port_descs), 1)
+            total += total_descs
+            if (m2_inputs.has_key(port_name) and
+                m2_inputs[port_name] == port_descs):
+                input_similarity += 1.0
+            else:
+                for port_desc in port_descs:
+                    port_desc = tuple(port_desc)
+                    if m2_input_hist.has_key(port_desc):
+                        input_similarity += 1
+
+        if len(m1_inputs):
+            input_similarity /= total
+        else:
+            input_similarity = 0.2
+
+        if (self._p1.modules[p1_id].name !=
+            self._p2.modules[p2_id].name):
+            input_similarity *= 0.99
+
+        return (input_similarity, output_similarity)
+
+    def compare_connections(self, p1_id, p2_id):
+        """Returns a value \in [0, 1] that says how similar
+        the two connections are."""
+        c1 = self._p1.connections[p1_id]
+        c2 = self._p2.connections[p2_id]
+
+        # FIXME: Make this softer in the future
+        if self._debug:
+            print "COMPARING %s:%s -> %s:%s with %s:%s -> %s:%s" % \
+                (self._p1.modules[c1.sourceId].name, c1.source.name,
+                 self._p1.modules[c1.destinationId].name, c1.destination.name,
+                 self._p2.modules[c2.sourceId].name, c2.source.name,
+                 self._p2.modules[c2.destinationId].name, c2.destination.name),
+        if c1.source.name != c2.source.name:
+            if self._debug:
+                print 0.0
+            return 0.0
+        if c1.destination.name != c2.destination.name:
+            if self._debug:
+                print 0.0
+            return 0.0
+
+        m_c1_sid = self._g1_vertex_map[c1.sourceId]
+        m_c1_did = self._g1_vertex_map[c1.destinationId]
+        m_c2_sid = self._g2_vertex_map[c2.sourceId]
+        m_c2_did = self._g2_vertex_map[c2.destinationId]
+
+        if self._debug:
+            print (self._output_vertex_s8y[m_c1_sid, m_c2_sid] +
+                    self._input_vertex_s8y[m_c1_did, m_c2_did]) / 2.0
+        return (self._output_vertex_s8y[m_c1_sid, m_c2_sid] +
+                self._input_vertex_s8y[m_c1_did, m_c2_did]) / 2.0
+
+
+    ##########################################################################
+    # Utility
+
+    @staticmethod
+    def pm(m, digits=5):
+        def get_digits(x):
+            if x == 0: return 0
+            return int(math.log(abs(x) * 10.0, 10.0))
+        vd = scipy.vectorize(get_digits)
+        dm = vd(m)
+        widths = dm.max(0)
+        (l, c) = m.shape
+        for i in xrange(l):
+            EigenBase.pv(m[i,:],
+                         digits=digits,
+                         left_digits=widths)
+
+    @staticmethod
+    def pv(v, digits=5, left_digits=None):
+        # FIXME - some scipy indexing seems to be currently
+        # inconsistent across different deployed versions. Fix this.
+        if isinstance(v, scipy.matrix):
+            v = scipy.array(v)[0]
+        (c,) = v.shape
+        print "[ ",
+        for j in xrange(c):
+            if left_digits != None:
+                d = left_digits[0,j]
+            else:
+                d = 0
+            fmt = ("%" +
+                   str(d + digits + 1) + 
+                   "." + str(digits) + "f ")
+            print (fmt % v[j]),
+        print "]"
+
+    def print_s8ys(self):
+        print "Input s8y"
+        self.pm(self._input_vertex_s8y)
+        print "\nOutput s8y"
+        self.pm(self._output_vertex_s8y)
+        print "\nConnection s8y"
+        self.pm(self._edge_s8y)
+        print "\nCombined s8y"
+        self.pm(self._vertex_s8y)
+
+    # FIXME: move this somewhere decent.
+    def get_ports(self, module, include_optional=False):
+        """get_ports(module) -> (input_ports, output_ports)
+
+        Returns all ports for a given module name, all the way
+        up the class hierarchy."""
+
+        def remove_descriptions(d):
+            def update_elements(spec):
+                return [v.name for v
+                        in spec.descriptors()]
+            for k in d.keys():
+                v = update_elements(d[k])
+                if len(v):
+                    d[k] = v
+                else:
+                    del d[k]
+
+        inputs = dict([(port.name, port) for
+                       port in module.destinationPorts()
+                       if (not port.optional or include_optional)])
+        outputs = dict([(port.name, port) for
+                        port in module.sourcePorts()
+                        if (not port.optional or include_optional)])
+
+        remove_descriptions(inputs)
+        remove_descriptions(outputs)
+        return (inputs, outputs)
+
+##############################################################################
+# EigenPipelineSimilarity
+
+class EigenPipelineSimilarity(EigenBase):
+
+    ##########################################################################
+    # Constructor and initialization
+
+    def __init__(self,
+                 pipeline1,
+                 pipeline2):
+        EigenBase.__init__(self, pipeline1, pipeline2)
+        self.init_operator()
+
+    def init_operator(self):
+        num_verts_p1 = len(self._p1.graph.vertices)
+        num_verts_p2 = len(self._p2.graph.vertices)
+        def ix(a,b): return num_verts_p2 * a + b
+        self._operator = mzeros((num_verts_p1 * num_verts_p2,
+                                 num_verts_p1 * num_verts_p2))
+
+        u = 0.85
+        
+        for i in xrange(num_verts_p1):
+            v1_id = self._g1_vertex_map.inverse[i]
+            for j in xrange(num_verts_p2):
+                ix_ij = ix(i,j)
+                self._operator[ix_ij, ix_ij] = u
+                v2_id = self._g2_vertex_map.inverse[j]
+                def edges(pip, v_id):
+                    return chain(imap(lambda (f, t, i): (t, i),
+                                      self._p1.graph.iter_edges_from(v1_id)),
+                                 imap(lambda (f, t, i): (f, i),
+                                      self._p1.graph.iter_edges_to(v1_id)))
+                p1_edges = edges(self._p1, v1_id)
+                p2_edges = edges(self._p2, v2_id)
+                running_sum = 0.0
+                for (_, p1_edge) in p1_edges:
+                    for (_, p2_edge) in p2_edges:
+                        e1_id = self._g1_edge_map[p1_edge]
+                        e2_id = self._g2_edge_map[p2_edge]
+                        running_sum += self._edge_s8y[e1_id, e2_id]
+                p1_edges = edges(self._p1, v1_id)
+                p2_edges = edges(self._p2, v2_id)
+                if not running_sum:
+                    continue
+                for (p1_v, p1_edge_id) in p1_edges:
+                    for (p2_v, p2_edge_id) in p2_edges:
+                        e1_id = self._g1_edge_map[p1_edge_id]
+                        e2_id = self._g2_edge_map[p2_edge_id]
+                        p1_v_id = self._g1_vertex_map[p1_v]
+                        p2_v_id = self._g2_vertex_map[p2_v]
+                        value = self._edge_s8y[e1_id, e2_id]
+                        value *= (1.0 - u) / running_sum
+                        self._operator[ix_ij, ix(p1_v_id, p2_v_id)] = value
+
+    ##############################################################################
+    # Solve
+
+    def step(self, m):
+        v = m.reshape(len(self._p1.modules) *
+                      len(self._p2.modules))
+        v = scipy.dot(self._operator, v)
+        v = v.reshape(len(self._p1.modules),
+                      len(self._p2.modules)).transpose()
+        v = (v / v.sum(0)).transpose()
+        return v
+
+    def solve(self):
+        i = 0
+        while i < 50:
+            i += 1
+            v = self.step(self._vertex_s8y)
+            residue = self._vertex_s8y - v
+            residue *= residue
+            if residue.sum() < 0.0001:
+                break
+            self._vertex_s8y = v
+        mp = [(self._g1_vertex_map.inverse[ix],
+               self._g2_vertex_map.inverse[v])
+              for (ix, v) in
+              enumerate(self._vertex_s8y.argmax(1))]
+        return dict(mp)
+        
+##############################################################################
+# EigenPipelineSimilarity2
+
+class EigenPipelineSimilarity2(EigenBase):
+
+    def __init__(self, *args, **kwargs):
+        basekwargs = copy.copy(kwargs)
+        del basekwargs['alpha']
+        EigenBase.__init__(self, *args, **basekwargs)
+        self.init_operator(alpha=kwargs['alpha'])
+
+    def init_operator(self, alpha):
+        def edges(pip, v_id):
+            def from_fn(x): return (x[1], x[2])
+            def to_fn(x): return (x[0], x[2])
+            return chain(imap(from_fn,   pip.graph.iter_edges_from(v_id)),
+                         imap(to_fn,     pip.graph.iter_edges_to(v_id)))
+        num_verts_p1 = len(self._p1.graph.vertices)
+        num_verts_p2 = len(self._p2.graph.vertices)
+        n = num_verts_p1 * num_verts_p2
+        def ix(a,b): return num_verts_p2 * a + b
+        # h is the raw substochastic matrix
+        from scipy import sparse
+        h = sparse.lil_matrix((n, n))
+        # a is the dangling node vector
+        a = mzeros(n)
+        for i in xrange(num_verts_p1):
+            v1_id = self._g1_vertex_map.inverse[i]
+            for j in xrange(num_verts_p2):
+                ix_ij = ix(i,j)
+                v2_id = self._g2_vertex_map.inverse[j]
+                running_sum = 0.0
+                for (_, p1_edge) in edges(self._p1, v1_id):
+                    for (_, p2_edge) in edges(self._p2, v2_id):
+                        e1_id = self._g1_edge_map[p1_edge]
+                        e2_id = self._g2_edge_map[p2_edge]
+                        running_sum += self._edge_s8y[e1_id, e2_id]
+                if running_sum == 0.0:
+                    a[0, ix_ij] = 1.0
+                    continue
+                for (p1_v, p1_edge_id) in edges(self._p1, v1_id):
+                    for (p2_v, p2_edge_id) in edges(self._p2, v2_id):
+                        e1_id = self._g1_edge_map[p1_edge_id]
+                        e2_id = self._g2_edge_map[p2_edge_id]
+                        p1_v_id = self._g1_vertex_map[p1_v]
+                        p2_v_id = self._g2_vertex_map[p2_v]
+                        value = self._edge_s8y[e1_id, e2_id] / running_sum
+                        h[ix_ij, ix(p1_v_id, p2_v_id)] = value
+
+        self._alpha = alpha
+        self._n = n
+        self._h = h
+        self._a = a
+        self._e = mones(n) / n
+
+    def step(self, pi_k):
+        r = pi_k * self._h * self._alpha
+        t = pi_k * self._alpha * self._a.transpose()
+        r += self._v * (t[0,0] + 1.0 - self._alpha)
+        return r
+
+    def solve_v(self, s8y):
+        fl = s8y.flatten()
+        self._v = fl / fl.sum()
+        v = copy.copy(self._e)
+        step = 0
+        def write_current_matrix():
+            f = open('%s/%s_%03d.v' % (temporary_directory(),
+                                       self._debug_matrix_file, step), 'w')
+            x = v.reshape(len(self._p1.modules),
+                          len(self._p2.modules))
+            for i in xrange(len(self._p1.modules)):
+                for j in xrange(len(self._p2.modules)):
+                    f.write('%f ' % x[i,j])
+                f.write('\n')
+            f.close()
+        while 1:
+            if self._debug:
+                write_current_matrix()
+            new = self.step(v)
+            r = (v-new)
+            r = scipy.multiply(r,r)
+            s = r.sum()
+            if s < 0.0000001 and step >= 10:
+                return v
+            step += 1
+            v = new
+
+    def solve(self):
+        def write_debug_pipeline_positions(pipeline, mmap, f):
+            f.write('%d %d\n' % (len(pipeline.modules),
+                                 len(pipeline.connections)))
+            for k, v in mmap.iteritems():
+                f.write('%d %d\n' % (k, v))
+            c = pipeline_centroid(pipeline)
+            mn, mx = pipeline_bbox(pipeline)
+            f.write('%f %f %f %f\n' % (mn.x, mn.y, mx.x, mx.y))
+            for i, m in pipeline.modules.iteritems():
+                nc = m.center - c
+                f.write('%d %s %f %f\n' % (i, m.name, nc.x, nc.y))
+            for i, c in pipeline.connections.iteritems():
+                f.write('%d %d %d\n' % (i, c.sourceId, c.destinationId))
+            
+        if self._debug:
+            out = open('%s/pipelines.txt' % temporary_directory(), 'w')
+            write_debug_pipeline_positions(self._p1, self._g1_vertex_map, out)
+            write_debug_pipeline_positions(self._p2, self._g2_vertex_map, out)
+            self.print_s8ys()
+            
+        self._debug_matrix_file = 'input_matrix'
+        r_in  = self.solve_v(self._input_vertex_s8y)
+        self._debug_matrix_file = 'output_matrix'
+        r_out = self.solve_v(self._output_vertex_s8y)
+        r_in = r_in.reshape(len(self._p1.modules),
+                            len(self._p2.modules))
+        r_out = r_out.reshape(len(self._p1.modules),
+                              len(self._p2.modules))
+
+        s = r_in.sum(1)
+        s[s==0.0] = 1
+        r_in /= s
+
+        s = r_out.sum(1)
+        s[s==0.0] = 1
+        r_out /= s
+        
+        r_combined = scipy.multiply(r_in, r_out)
+
+        # Breaks ties on combined similarity
+        r_in = r_in * 0.9 + r_combined * 0.1
+        r_out = r_out * 0.9 + r_combined * 0.1
+
+        if self._debug:
+            print "== G1 =="
+            for (k,v) in sorted(self._g1_vertex_map.iteritems(), key=operator.itemgetter(1)):
+                print v, k, self._p1.modules[k].name
+            print "== G2 =="
+            for (k,v) in sorted(self._g2_vertex_map.iteritems(), key=operator.itemgetter(1)):
+                print v, k, self._p2.modules[k].name
+            
+            print "input similarity"
+            self.pm(r_in, digits=3)
+            print "output similarity"
+            self.pm(r_out, digits=3)
+            print "combined similarity"
+            self.pm(r_combined, digits=3)
+
+        inputmap = dict([(self._g1_vertex_map.inverse[ix],
+                          self._g2_vertex_map.inverse[v[0,0]])
+                         for (ix, v) in
+                         enumerate(r_in.argmax(1))])
+        outputmap = dict([(self._g1_vertex_map.inverse[ix],
+                           self._g2_vertex_map.inverse[v[0,0]])
+                          for (ix, v) in
+                          enumerate(r_out.argmax(1))])
+        combinedmap = dict([(self._g1_vertex_map.inverse[ix],
+                             self._g2_vertex_map.inverse[v[0,0]])
+                            for (ix, v) in
+                            enumerate(r_combined.argmax(1))])
+#         print inputmap
+#         print outputmap
+        return inputmap, outputmap, combinedmap
+
+
+    
diff --git a/vistrails/core/analogy/pipeline_utils.py b/vistrails/core/analogy/pipeline_utils.py
new file mode 100644
index 0000000..c9e3f3a
--- /dev/null
+++ b/vistrails/core/analogy/pipeline_utils.py
@@ -0,0 +1,66 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+
+############################################################################
+# Utility functions for debugging on eigen.py
+from vistrails.core.data_structures.point import Point
+
+def smart_sum(v):
+    try:
+        fst = v.next()
+        return sum(v, fst)
+    except:
+        pass
+    fst = v[0]
+    return sum(v[1:], fst)
+
+def pipeline_centroid(pipeline):
+    """Returns the centroid of a given pipeline."""
+    return (smart_sum(x.location for
+                      x in pipeline.modules.itervalues()) *
+            (1.0 / len(pipeline.modules)))
+
+def pipeline_bbox(pipeline):
+    mn_x = 1000000000.0
+    mn_y = 1000000000.0
+    mx_x = -1000000000.0
+    mx_y = -1000000000.0
+    for m in pipeline.modules.itervalues():
+        mn_x = min(mn_x, m.location.x)
+        mn_y = min(mn_y, m.location.y)
+        mx_x = max(mx_x, m.location.x)
+        mx_y = max(mx_y, m.location.y)
+    return (Point(mn_x, mn_y), Point(mx_x, mx_y))
diff --git a/vistrails/core/api.py b/vistrails/core/api.py
new file mode 100644
index 0000000..951046c
--- /dev/null
+++ b/vistrails/core/api.py
@@ -0,0 +1,572 @@
+import itertools
+
+import vistrails.core.application
+from vistrails.core.db.locator import FileLocator, untitled_locator
+import vistrails.core.db.io
+from vistrails.core.modules.basic_modules import identifier as basic_pkg
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.utils import create_port_spec_string
+from vistrails.core.packagemanager import get_package_manager
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.vistrail.vistrail import Vistrail
+
+# from core.modules.package import Package as _Package
+# from core.vistrail.module import Module as _Module
+
+_api = None
+
+def get_api():
+    if _api is None:
+        set_api(VisTrailsAPI())
+    return _api
+
+def set_api(api):
+    global _api
+    _api = api
+
+class Port(object):
+    def __init__(self, module, port_spec):
+        # print 'calling vistrails_port.__init__'
+        self._vistrails_module = module
+        self._port_spec = port_spec
+
+    def __call__(self, *args, **kwargs):
+        if len(args) + len(kwargs) > 0:
+            self._vistrails_module._update_func(self._port_spec,
+                                                *args, **kwargs)
+            return None
+        return self
+
+class Module(object):
+    def __init__(self, module, *args, **kwargs):
+        self._module = module
+        self._module_desc = self._module.module_descriptor
+        self._package = None # don't think we need this now
+        self.__call__(*args, **kwargs)
+
+    def __call__(self, *args, **kwargs):
+        reg = get_module_registry()
+        if len(args) > 0:
+            constant_desc = reg.get_descriptor_by_name(basic_pkg, "Constant")
+            if reg.is_descriptor_subclass(self._module_desc, constant_desc):
+                kwargs['value'] = args[0]
+            
+        for attr_name, value in kwargs.iteritems():
+            self._process_attr_value(attr_name, value)
+        return self
+
+    @staticmethod
+    def create_module(module, *args, **kwargs):
+        m = Module(module)
+        return m
+
+    def _process_attr_value(self, attr_name, value):
+        if self._module.has_port_spec(attr_name, 'input'):
+            port_spec = self._module.get_port_spec(attr_name, 'input')
+
+            args = None
+            # FIXME want this to be any iterable
+            if isinstance(value, tuple):
+                args = value
+            else:
+                args = (value,)
+            self._update_func(port_spec, *args)
+        else:
+            raise AttributeError("type object '%s' has no "
+                                 "attribute '%s'" % \
+                                     (self.__class__.__name__,
+                                      attr_name))                
+
+    def __getattr__(self, attr_name):
+        def create_port(port_spec):
+            return Port(self, port_spec)
+
+        if self._module.has_port_spec(attr_name, 'output'):
+            port_spec = \
+                self._module.get_port_spec(attr_name, 'output')
+            return create_port(port_spec)
+        elif self._module.has_port_spec(attr_name, 'input'):
+            port_spec = \
+                self._module.get_port_spec(attr_name, 'input')
+            return create_port(port_spec)
+        else:
+            raise AttributeError("type object '%s' has no "
+                                 "attribute '%s'" % \
+                                     (self.__class__.__name__, 
+                                      attr_name))
+
+    def __setattr__(self, attr_name, value):
+        if attr_name.startswith('_'):
+            self.__dict__[attr_name] = value
+        else:
+            self._process_attr_value(attr_name, value)
+
+    def _update_func(self, port_spec, *args, **kwargs):
+        # print 'running _update_func', port_spec.name
+        # print args
+        vt_api = get_api()
+
+        if port_spec.type != 'input':
+            if self._module.has_port_spec(port_spec.name, 'input'):
+                port_spec = \
+                    self._module.get_port_spec(port_spec.name, 'input')
+            else:
+                raise TypeError("cannot update an output port spec")
+
+        # FIXME deal with kwargs
+        num_ports = 0
+        num_params = 0
+        for value in args:
+            # print 'processing', type(value), value
+            if isinstance(value, Port):
+                # make connection to specified output port
+                # print 'updating port'
+                num_ports += 1
+            elif isinstance(value, Module):
+                # make connection to 'self' output port of value
+                # print 'updating module'
+                num_ports += 1
+            else:
+                # print 'update literal', type(value), value
+                num_params += 1
+        if num_ports > 1 or (num_ports == 1 and num_params > 0):
+            reg = vistrails.core.modules.module_registry.get_module_registry()
+            tuple_desc = reg.get_descriptor_by_name(basic_pkg, 'Tuple')
+            tuple_module = vt_api.add_module_from_descriptor(tuple_desc)
+            output_port_spec = PortSpec(id=-1,
+                                        name='value',
+                                        type='output',
+                                        sigstring=port_spec.sigstring)
+            vt_api.add_port_spec(tuple_module, output_port_spec)
+            self._update_func(port_spec, *[tuple_module.value()])
+            assert len(port_spec.descriptors()) == len(args)
+            for i, descriptor in enumerate(port_spec.descriptors()):
+                arg_name = 'arg%d' % i
+                sigstring = create_port_spec_string([descriptor.spec_tuple])
+                tuple_port_spec = PortSpec(id=-1,
+                                           name=arg_name,
+                                           type='input',
+                                           sigstring=sigstring)
+                vt_api.add_port_spec(tuple_module, tuple_port_spec)
+                tuple_module._process_attr_value(arg_name, args[i])
+                
+        elif num_ports == 1:
+            other = args[0]
+            if isinstance(other, Port):
+                if other._port_spec.type != 'output':
+                    other_module = other._vistrails_module._module
+                    if other_module.has_port_spec(port_spec.name, 
+                                                   'output'):
+                        other_port_spec = \
+                            other_module.get_port_spec(port_spec.name, 
+                                                        'output')
+                    else:
+                        raise TypeError("cannot update an input "
+                                        "port spec")
+                else:
+                    other_port_spec = other._port_spec
+
+                vt_api.add_connection(other._vistrails_module,
+                                      other_port_spec,
+                                      self, 
+                                      port_spec)
+            elif isinstance(other, Module):
+                other_port_spec = \
+                    other._module.get_port_spec('self', 'output')
+                vt_api.add_connection(other, 
+                                      other_port_spec,
+                                      self,
+                                      port_spec)
+        else:
+            vt_api.change_parameter(self,
+                                    port_spec.name,
+                                    [str(x) for x in args])
+
+class Package(object):
+    def __init__(self, identifier, version=''):
+        self._package = None
+        # namespace_dict : {namespace : (namespace_dict, modules)}
+        self._namespaces = ({}, [])
+        reg = get_module_registry()
+        self._package = reg.get_package_by_name(identifier, version)
+        for desc in self._package.descriptor_list:
+            if desc.namespace:
+                namespaces = desc.namespace.split('|')
+            else:
+                namespaces = []
+            cur_namespace = self._namespaces[0]
+            cur_modules = self._namespaces[1]
+            for namespace in namespaces:
+                if namespace not in cur_namespace:
+                    cur_namespace[namespace] = ({}, [])
+                cur_modules = cur_namespace[namespace][1]
+                cur_namespace = cur_namespace[namespace][0]
+            cur_modules.append(desc)
+
+        iteritems = [self._namespaces]
+        for (namespaces, modules) in iteritems:
+            modules.sort(key=lambda d: d.name)
+            iteritems = itertools.chain(iteritems, namespaces.itervalues())
+
+    def __getattr__(self, attr_name):
+        reg = get_module_registry()
+        d = reg.get_descriptor_by_name(self._package.identifier,
+                                       attr_name, '', 
+                                       self._package.version)
+        vt_api = get_api()
+        module = vt_api.add_module_from_descriptor(d)
+        return module
+ 
+    def get_modules(self, namespace=None):
+        modules = []
+        if namespace == '':
+            modules = [d.name for d in self._namespaces[1]]
+        else:
+            if namespace is None:
+                namespace = ''
+                modules = [d.name for d in self._namespaces[1]]
+                namespaces = sorted(self._namespaces[0].iteritems())
+            else:
+                namespace_dict = self._namespaces[0]
+                descs = self._namespaces[1]
+                for ns in namespace.split('|'):
+                    (namespace_dict, descs) = namespace_dict[ns]
+                namespaces = [(namespace, (namespace_dict, descs))]
+            
+            for (ns, (child_namespaces, descs)) in namespaces:
+                modules.extend(ns + '|' + d.name for d in descs)
+                namespaces = \
+                    itertools.chain([(ns + '|' + c[0], c[1]) 
+                                     for c in child_namespaces.iteritems()],
+                                    namespaces)
+        return modules
+
+    def list_modules(self, namespace=None):
+        for module in self.get_modules(namespace):
+            print module
+
+class VisTrailsAPI(object):
+
+    # !!! Do not pass controller or app unless you know what you are doing !!!
+    def __init__(self, controller=None, app=None):
+        self._controller = controller
+        self._app = app
+        self._packages = None
+        self._old_log = None
+
+    def _get_app(self):
+        if self._app is not None:
+            return self._app
+        return vistrails.core.application.get_vistrails_application()
+    app = property(_get_app)
+
+    # !!! Do not call set_app unless you know what you are doing !!!
+    def set_app(self, app):
+        self._app = app
+
+    def _get_controller(self):
+        if self._controller is not None:
+            return self._controller
+        controller = self.app.get_controller()
+        if controller is None:
+            raise ValueError("You must have a vistrail open before calling "
+                             "this API method.")
+        return controller
+    controller = property(_get_controller)
+
+    # !!! Do not call set_controller unless you know what you are doing !!!
+    def set_controller(self, controller=None):
+        self._controller = controller
+
+    def add_module(self, identifier, name, namespace='', internal_version=-1):
+        m = self.controller.add_module(identifier, name, namespace, 
+                                       internal_version=internal_version)
+        # have to go back since there is a copy when the action is performed
+        module = self.controller.current_pipeline.modules[m.id]
+        return Module.create_module(module)
+
+    def add_module_from_descriptor(self, desc):
+        m = self.controller.add_module_from_descriptor(desc)
+        # have to go back since there is a copy when the action is performed
+        module = self.controller.current_pipeline.modules[m.id]
+        return Module.create_module(module)
+
+    def add_connection(self, module_a, port_a, module_b, port_b):
+        conn = self.controller.add_connection(module_a._module.id, port_a,
+                                               module_b._module.id, port_b)
+
+    def add_port_spec(self, module, port_spec):
+        self.controller.add_module_port(module._module.id,
+                                         (port_spec.type, port_spec.name,
+                                          port_spec.sigstring))
+
+    def add_and_connect_module(self,
+                               identifier,
+                               name,
+                               port,
+                               module_b,
+                               port_b,
+                               is_source=False,
+                               auto_layout=True,
+                               **kwargs):
+        """Adds a module and connects in single action. Returns new module.
+
+        identifier - package identifier for new module
+        name - name of new module
+        module_b - existing module to connect new module to
+        port - port on new module to connect
+        port_b - port on existing module to connect
+        is_source - whether or not new module is source of connection
+        auto_layout - layout pipeline
+        **kwargs - additional arguments to create module
+        """
+
+        module = self.controller.create_module(identifier, name, **kwargs)
+
+        if is_source:
+            source, source_port = module, port
+            target, target_port = module_b._module, port_b
+        else:
+            target, target_port = module, port
+            source, source_port = module_b._module, port_b
+
+        create_conn = self.controller.create_connection
+        conn = create_conn(source, source_port, target, target_port)
+
+        if auto_layout:
+            layout = self.controller.layout_modules_ops
+            layout_ops = layout([], True, [module], [conn], None, True)
+        else:
+            layout_ops = []
+
+        ops = [('add', module), ('add', conn)] + layout_ops
+        action = vistrails.core.db.action.create_action(ops)
+        self.controller.add_new_action(action)
+        version = self.controller.perform_action(action)
+        self.controller.change_selected_version(version)
+
+        # have to go back since there is a copy when the action is performed
+        m = self.controller.current_pipeline.modules[module.id]
+        return Module.create_module(m)
+
+    def change_parameter(self, module, function_name, param_list):
+        self.controller.update_function(module._module, function_name,
+                                         param_list)
+
+    def execute(self, custom_aliases=None, custom_params=None,
+                 extra_info=None, reason='API Pipeline Execution'):
+        return self.controller.execute_current_workflow(custom_aliases, custom_params,
+                                                  extra_info, reason)
+
+    def get_packages(self):
+        if self._packages is None:
+            self._packages = {}
+            self._old_package_ids = {}
+            reg = get_module_registry()
+            for package in reg.package_list:
+                pkg = Package(package.identifier, package.version)
+                self._packages[package.identifier] = pkg
+                for old_name in package.old_identifiers:
+                    self._old_package_ids[old_name] = pkg
+        return self._packages
+
+    def list_packages(self):
+        for package in self.get_packages():
+            print package
+
+    def get_package(self, identifier):
+        packages = self.get_packages()
+        if identifier not in packages and identifier in self._old_package_ids:
+            return self._old_package_ids[identifier]
+        else:
+            return packages[identifier]
+
+    def load_package(self, identifier, codepath):
+        packages = self.get_packages()
+        if identifier not in packages:
+            pm = get_package_manager()
+            pm.late_enable_package(codepath)
+            self._packages = None
+        return self.get_package(identifier)
+            
+    def list_modules(self):
+        for identifier, package in sorted(self.get_packages().iteritems()):
+            print identifier
+            for module in package.get_modules():
+                print ' --', module
+
+    def _convert_version(self, version):
+        if isinstance(version, basestring):
+            try:
+                version = \
+                    self.controller.vistrail.get_version_number(version)
+            except:
+                raise ValueError('Cannot locate version "%s"' % version)
+        return version
+
+    def tag_version(self, tag, version=None):
+        if version is None:
+            version = self.controller.current_version
+        else:
+            version = self._convert_version(version)
+        self.controller.vistrail.set_tag(version, tag)
+
+    def save_vistrail(self, locator_str):
+        return self.app.save_vistrail(locator_str)
+
+    def new_vistrail(self):
+        return bool(self.app.new_vistrail())
+
+    def load_vistrail(self, locator_str):
+        return bool(self.app.open_vistrail(locator_str))
+    open_vistrail = load_vistrail
+
+    def load_workflow(self, locator_str):
+        self.app.open_workflow(locator_str)
+    open_workflow = load_workflow
+
+    def select_version(self, version):
+        self.app.select_version(version)
+
+    def close_vistrail(self):
+        self.app.close_vistrail()
+
+    def get_current_workflow(self):
+        return self.controller.current_pipeline
+
+    def get_all_executions(self):
+        wf_execs = []
+        if (self._old_log is None and
+            hasattr(self.controller.vistrail, 'db_log_filename') and
+            self.controller.vistrail.db_log_filename is not None):
+            self._old_log = \
+                vistrails.core.db.io.open_log(self.controller.vistrail.db_log_filename, True)
+        if self._old_log is not None:
+            wf_execs.extend(self._old_log.workflow_execs)
+        wf_execs.extend(self.controller.log.workflow_execs)
+        return wf_execs
+
+import os
+import unittest
+from vistrails.core.system import temporary_directory
+
+class TestAPI(unittest.TestCase):
+    if not hasattr(unittest.TestCase, 'assertIsInstance'):
+        def assertIsInstance(self, obj, cls, msg=None):
+            assert(isinstance(obj, cls))
+    
+    @classmethod
+    def setUpClass(cls):
+        get_api().new_vistrail()
+
+    @classmethod
+    def tearDownClass(cls):
+        get_api().close_vistrail()
+
+    def setUp(self):
+        get_api().controller.change_selected_version(0)
+
+    def get_basic_package(self):
+        basic = get_api().get_package(basic_pkg)
+        self.assertIsInstance(basic, Package)
+        return basic
+
+    def create_modules(self,basic):
+        s1 = basic.String("abc")
+        self.assertIsInstance(s1, Module)
+        s2 = basic.String("def")
+        self.assertIsInstance(s2, Module)
+        return s1, s2
+        
+    def test_api(self):
+        self.get_basic_package()
+
+    def test_add_modules(self):
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+
+        # assert there exist two String modules
+        self.assertEqual(len(get_api().controller.current_pipeline.modules), 2)
+        for m in get_api().controller.current_pipeline.modules.itervalues():
+            self.assertEqual(m.package, basic_pkg)
+            self.assertEqual(m.name, "String")
+
+    def check_connections(self):
+        conns = []
+        modules = get_api().controller.current_pipeline.modules
+        for c in get_api().controller.current_pipeline.connections.itervalues():
+            conns.append((modules[c.sourceId].name, c.source.name,
+                          modules[c.destinationId].name, c.destination.name))
+        conns.sort()
+        self.assertEqual(conns,
+                         [('String', 'value', 'ConcatenateString', 'str1'),
+                          ('String', 'value', 'ConcatenateString', 'str2')])
+
+    def test_add_connections_by_assignment(self):
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+        c = basic.ConcatenateString()
+        c.str1 = s1.value
+        c.str2 = s2.value
+        self.check_connections()
+
+    def test_add_connections_by_call(self):
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+        c = basic.ConcatenateString()
+        c.str1(s1.value)
+        c.str2(s2.value)
+        self.check_connections()
+
+    def test_add_connections_by_constructor(self):
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+        c = basic.ConcatenateString(str1=s1.value, str2=s2.value)
+        self.check_connections()
+
+    def check_parameters(self):
+        params = []
+        for m in get_api().controller.current_pipeline.modules.itervalues():
+            for f in m.functions:
+                params.append((m.name, f.name, f.params[0].strValue))
+        params.sort()
+        self.assertEqual(params,
+                         [('String', 'value', 'abc'),
+                          ('String', 'value', 'def')])
+            
+    def test_add_parameters_by_assignment(self):
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+        s1.value = "abc"
+        s2.value = "def"
+        self.check_parameters()
+
+    def test_add_parameters_by_call(self):
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+        s1.value("abc")
+        s2.value("def")
+        self.check_parameters()
+
+    def test_add_parameters_by_constructor(self):
+        basic = self.get_basic_package()
+        s1 = basic.String("abc")
+        s2 = basic.String("def")
+        self.check_parameters()
+
+    def test_write_and_read_vistrail(self):
+        self.assertTrue(get_api().new_vistrail())
+        basic = self.get_basic_package()
+        s1, s2 = self.create_modules(basic)
+        fname = os.path.join(temporary_directory(), "test_write_read.vt")
+        self.assertTrue(get_api().save_vistrail(fname))
+        self.assertTrue(os.path.exists(fname))
+        get_api().close_vistrail()
+        self.assertTrue(get_api().open_vistrail(fname))
+        self.assertEqual(get_api().controller.current_version, 4)
+        get_api().close_vistrail()
+
+if __name__ == '__main__':
+    vistrails.core.application.init()
+    unittest.main()
diff --git a/vistrails/core/application.py b/vistrails/core/application.py
new file mode 100644
index 0000000..9dd3d01
--- /dev/null
+++ b/vistrails/core/application.py
@@ -0,0 +1,833 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import atexit
+import copy
+import os
+import shutil
+import sys
+import tempfile
+import weakref
+import warnings
+
+from vistrails.core import command_line
+from vistrails.core import debug
+from vistrails.core import keychain
+from vistrails.core import system
+from vistrails.core.collection import Collection
+import vistrails.core.configuration
+from vistrails.core.db.locator import BaseLocator, FileLocator, DBLocator, \
+    UntitledLocator
+import vistrails.core.db.io
+import vistrails.core.interpreter.cached
+import vistrails.core.interpreter.default
+import vistrails.core.startup
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core.utils import InstanceObject, VistrailsWarning
+from vistrails.core.utils.uxml import enter_named_element
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core.vistrail.controller import VistrailController
+from vistrails.db import VistrailsDBException
+
+VistrailsApplication = None
+APP_SUCCESS = 0 # Success exit code
+APP_FAIL = 1 # fialed exit code
+APP_DONE = 2 # Success but shut down prematurely (other instance called)
+
+def finalize_vistrails(app):
+    vistrails.core.interpreter.cached.CachedInterpreter.cleanup()
+
+def get_vistrails_application():
+    global VistrailsApplication
+    if VistrailsApplication is not None:
+        return VistrailsApplication()
+    return None
+
+def set_vistrails_application(app):
+    global VistrailsApplication
+    VistrailsApplication = weakref.ref(app, finalize_vistrails)
+
+def is_running_gui():
+    app = get_vistrails_application()
+    return app.is_running_gui()
+
+def init(options_dict={}, args=None):
+    app = VistrailsCoreApplication()
+    set_vistrails_application(app)
+    app.init(optionsDict=options_dict, args=args)
+    return app
+
+class VistrailsApplicationInterface(object):
+    def __init__(self):
+        self._initialized = False
+        self.notifications = {}
+
+    def setupOptions(self, args=None):
+        """ setupOptions() -> None
+        Check and store all command-line arguments
+        
+        """
+        add = command_line.CommandLineParser.add_option
+        add("-S", "--startup", action="store", type="str", default=None,
+            dest="dotVistrails",
+            help="Set startup file (default is ~/.vistrails)")
+        add("-?", action="help",
+            help="show this help message and exit")
+        add("-v", "--version", action="callback",
+            callback=lambda option, opt, value, parser: self.printVersion(),
+            help="print version information and quit")
+        add("-V", "--verbose", action="store", type="int", default=None,
+            dest="verbose", help="set verboseness level (0--2, "
+            "default=0, higher means more verbose)")
+        add("-n", "--nosplash", action="store_false",
+            default = None,
+            help="don't display splash on startup")
+        add("-c", "--cache", action="store", type="int", default=None,
+            dest="cache", help="enable/disable caching")
+        add("-m", "--movies", action="store", type="int", default=None,
+            dest="movies", help="set automatic movie creation on spreadsheet "
+            "(0 or 1, default=1. Set this to zero to work around vtk bug with "
+            "offscreen renderer and opengl texture3d mappers)")
+        add("-s", "--multiheads", action="store_true",
+            default = None,
+            help="display the builder and spreadsheet on different screens "
+            "(if available)")
+        add("-x", "--maximized", action="store_true",
+            default = None,
+            help="Maximize VisTrails windows at startup")
+        add("-b", "--noninteractive", action="store_true",
+            default = None,
+            help="run in non-interactive mode")
+        add("-e", "--dumpcells", action="store", dest="dumpcells",
+            default = None,
+            help="when running in non-interactive mode, directory to dump "
+            "spreadsheet cells before exiting")
+        add("-p", "--pdf", action="store_true",
+            default = None,
+            help="dump files in pdf format (non-interactive mode only)")
+        add("-l", "--nologger", action="store_true",
+            default = None,
+            help="disable the logging")
+        add('--no-logfile', action='store_true',
+            dest='nologfile',
+            default=None,
+            help="Disable the log file (output still happens in terminal)")
+        add("-d", "--debugsignals", action="store_true",
+            default = None,
+            help="debug Qt Signals")
+        add("-a", "--parameters", action="store", dest="parameters",
+            help="workflow parameter settings (non-interactive mode only)")
+        add("-t", "--host", action="store", dest="host",
+            help="hostname or ip address of database server")
+        add("-r", "--port", action="store", type="int", default=3306,
+            dest="port", help="database port")
+        add("-f", "--db", action="store", dest="db",
+            help="database name")
+        add("-u", "--user", action="store", dest="user",
+            help="database username")
+        add("-i", "--showspreadsheetonly", action="store_true",
+            default = None,
+            help="only the spreadsheet will be shown. This implies -w was given.\
+The builder window can be accessed by a spreadsheet menu option.")
+        add("-w", "--executeworkflows", action="store_true",
+            default = None,
+            help="The workflows will be executed")
+        add("-F", "--fixedcells", action="store_true",
+            default = None,
+            help="Use a fixed spreadsheet cell size of 200*180")
+        add("-I", "--workflowinfo", action="store",
+            default = None,
+            help=("Save workflow graph and spec in specified directory "
+                  "(only valid in console mode)."))
+        add("-E", "--reviewmode", action="store_true",
+            default = None,
+            help="Show the spreadsheet in the reviewing mode")
+        add("-q", "--quickstart", action="store",
+            help="Start VisTrails using the specified static registry")
+        add("-D", "--detachHistoryView", action="store_true",
+            help="Detach the history view from the builder windows")
+        add("-P", "--parameterExploration", action="store_true",
+            help="Execute Parameter Exploration")
+        add("-G", "--workflowgraph", action="store",
+            default = None,
+            help=("Save workflow graph in specified directory without running "
+                  "the workflow (only valid in console mode)."))
+        add("-U", "--evolutiongraph", action="store",
+            default = None,
+            help=("Save evolution graph in specified directory without running "
+                  "any workflow (only valid in console mode)."))
+        add("-g", "--noSingleInstance", action="store_true",
+            help=("Run VisTrails without the single instance restriction."))
+        add("--no-bundleinstall", action='store_false',
+            dest='installBundles',
+            help=("Do not try to install missing Python packages "
+                  "automatically"))
+        add('--spawned-mode', '--spawned', action='store_true',
+            dest='spawned',
+            help=("Do not use the .vistrails directory, and load packages "
+                  "automatically when needed"))
+
+        if args != None:
+            command_line.CommandLineParser.parse_options(args=args)
+        else:
+            command_line.CommandLineParser.parse_options()
+
+    def printVersion(self):
+        """ printVersion() -> None
+        Print version of Vistrail and exit
+        
+        """
+        print system.about_string()
+        sys.exit(0)
+
+    def read_dotvistrails_option(self, optionsDict=None):
+        """ read_dotvistrails_option() -> None
+        Check if the user sets a new dotvistrails folder and updates
+        self.temp_configuration with the new value.
+
+        Also handles the 'spawned-mode' option, by using a temporary directory
+        as .vistrails directory, and a specific default configuration.
+        """
+        if optionsDict is None:
+            optionsDict = {}
+        def get(opt):
+            return (optionsDict.get(opt) or
+                    command_line.CommandLineParser().get_option(opt))
+
+        if get('spawned'):
+            # Here we are in 'spawned' mode, i.e. we are running
+            # non-interactively as a slave
+            # We are going to create a .vistrails directory as a temporary
+            # directory and copy a specific configuration file
+            # We don't want to load packages that the user might enabled in
+            # this machine's configuration file as it would slow down the
+            # startup time, but we'll load any needed package without
+            # confirmation
+            tmpdir = tempfile.mkdtemp(prefix='vt_spawned_')
+            @atexit.register
+            def clean_dotvistrails():
+                shutil.rmtree(tmpdir, ignore_errors=True)
+            self.temp_configuration.dotVistrails = tmpdir
+            if get('dotVistrails') is not None:
+                debug.warning("--startup option ignored since --spawned-mode "
+                              "is used")
+            shutil.copyfile(os.path.join(system.vistrails_root_directory(),
+                                         'core', 'resources',
+                                         'spawned_startup_xml'),
+                            os.path.join(tmpdir, 'startup.xml'))
+            self.temp_configuration.enablePackagesSilently = True
+            self.temp_configuration.nologfile = True
+            self.temp_configuration.singleInstance = False
+        elif get('dotVistrails') is not None:
+            self.temp_configuration.dotVistrails = get('dotVistrails')
+
+    def readOptions(self):
+        """ readOptions() -> None
+        Read arguments from the command line
+        
+        """
+        get = command_line.CommandLineParser().get_option
+        if get('nosplash')!=None:
+            self.temp_configuration.showSplash = bool(get('nosplash'))
+        if get('debugsignals')!=None:
+            self.temp_configuration.debugSignals = bool(get('debugsignals'))
+        if get('dotVistrails')!=None:
+            self.temp_configuration.dotVistrails = get('dotVistrails')
+        if get('multiheads')!=None:
+            self.temp_configuration.multiHeads = bool(get('multiheads'))
+        if get('maximized')!=None:
+            self.temp_configuration.maximizeWindows = bool(get('maximized'))
+        if get('movies')!=None:
+            self.temp_configuration.showMovies = bool(get('movies'))
+        if get('cache')!=None:
+            self.temp_configuration.useCache = bool(get('cache'))
+        if get('verbose')!=None:
+            self.temp_configuration.verbosenessLevel = get('verbose')
+            dbg = debug.DebugPrint.getInstance()
+            levels = [dbg.WARNING, dbg.INFO, dbg.DEBUG]
+            dbg.set_message_level(levels[get('verbose')])
+        if get('fixedcells') != None:
+            self.temp_configuration.fixedSpreadsheetCells = str(get('fixedcells'))
+        if get('noninteractive')!=None:
+            self.temp_configuration.interactiveMode = \
+                                                  not bool(get('noninteractive'))
+            if get('workflowinfo') != None:
+                self.temp_configuration.workflowInfo = str(get('workflowinfo'))
+            if get('dumpcells') != None:
+                self.temp_configuration.spreadsheetDumpCells = get('dumpcells')
+            if get('pdf') != None:
+                self.temp_configuration.spreadsheetDumpPDF = get('pdf')
+            if get('workflowgraph') != None:
+                self.temp_configuration.workflowGraph = str(get('workflowgraph'))
+            if get('evolutiongraph') != None:
+                self.temp_configuration.evolutionGraph = str(get('evolutiongraph'))
+        if get('executeworkflows') != None:
+            self.temp_configuration.executeWorkflows = \
+                                            bool(get('executeworkflows'))
+        if get('showspreadsheetonly') != None:
+            self.temp_configuration.showSpreadsheetOnly = \
+                                            bool(get('showspreadsheetonly'))
+            # asking to show only the spreadsheet will force the workflows to
+            # be executed
+            if get('reviewmode') != None:
+                self.temp_configuration.reviewMode = bool(get('reviewmode'))
+
+            if self.temp_configuration.showSpreadsheetOnly and not self.temp_configuration.reviewMode:
+                self.temp_configuration.executeWorkflows = True
+            
+        self.temp_db_options = InstanceObject(host=get('host'),
+                                                 port=get('port'),
+                                                 db=get('db'),
+                                                 user=get('user'),
+                                                 parameters=get('parameters')
+                                                 )
+        if get('nologger')!=None:
+            self.temp_configuration.nologger = bool(get('nologger'))
+        if get('quickstart') != None:
+            self.temp_configuration.staticRegistry = str(get('quickstart'))
+        if get('parameterExploration')!= None:
+            self.temp_configuration.parameterExploration = \
+                str(get('parameterExploration'))
+        if get('detachHistoryView')!= None:
+            self.temp_configuration.detachHistoryView = bool(get('detachHistoryView'))
+        if get('noSingleInstance')!=None:
+            self.temp_configuration.singleInstance = not bool(get('noSingleInstance'))
+        if get('installBundles')!=None:
+            self.temp_configuration.installBundles = bool(get('installBundles'))
+        self.input = command_line.CommandLineParser().positional_arguments()
+
+    def init(self, optionsDict=None, args=None):
+        """ VistrailsApplicationSingleton(optionDict: dict)
+                                          -> VistrailsApplicationSingleton
+        Create the application with a dict of settings
+        
+        """
+        warnings.simplefilter('once', VistrailsWarning, append=True)
+        # gui.theme.initializeCurrentTheme()
+        # self.connect(self, QtCore.SIGNAL("aboutToQuit()"), self.finishSession)
+        
+        # This is the persistent configuration
+        # Setup configuration to default
+        self.configuration = vistrails.core.configuration.default()
+        
+        self.keyChain = keychain.KeyChain()
+        self.setupOptions(args)
+        
+        # self.temp_configuration is the configuration that will be updated 
+        # with the command line and custom options dictionary. 
+        # We have to do this because we don't want to make these settings 
+        # persistent. This is the actual VisTrails current configuration
+        self.temp_configuration = copy.copy(self.configuration)
+        
+        vistrails.core.interpreter.default.connect_to_configuration(self.temp_configuration)
+        
+        # now we want to open vistrails and point to a specific version
+        # we will store the version in temp options as it doesn't
+        # need to be persistent. We will do the same to database
+        # information passed in the command line
+        self.temp_db_options = InstanceObject(host=None,
+                                           port=None,
+                                           db=None,
+                                           user=None,
+                                           vt_id=None,
+                                           parameters=None
+                                           ) 
+        
+        # Read only new .vistrails folder option if passed in the command line
+        # or in the optionsDict because this may affect the configuration file 
+        # VistrailsStartup will load. This updates self.temp_configuration
+        self.read_dotvistrails_option(optionsDict)
+
+        # the problem here is that if the user pointed to a new .vistrails
+        # folder, the persistent configuration will always point to the 
+        # default ~/.vistrails. So we will copy whatever it's on 
+        # temp_configuration to the persistent one. In case the configuration
+        # that is on disk is different, it will overwrite this one
+        self.configuration.dotVistrails = self.temp_configuration.dotVistrails
+        
+        # During this initialization, VistrailsStartup will load the
+        # configuration from disk and update both configurations
+        self.vistrailsStartup = \
+            vistrails.core.startup.VistrailsStartup(self.configuration,
+                                          self.temp_configuration)
+
+        # Starting in version 1.2.1 logging is enabled by default.
+        # Users have to explicitly disable it through the command-line
+        self.configuration.nologger = False
+        self.temp_configuration.nologger = False
+        
+        if optionsDict:
+            for (k, v) in optionsDict.iteritems():
+                setattr(self.temp_configuration, k, v)
+
+        # Command line options override temp_configuration
+        self.readOptions()
+
+        self.check_all_requirements()
+
+        if self.temp_configuration.check('staticRegistry'):
+            reg = self.temp_configuration.staticRegistry
+        else:
+            reg = None
+        self.vistrailsStartup.set_registry(reg)
+
+    def check_all_requirements(self):
+        # check scipy
+        vistrails.core.requirements.require_python_module('scipy', {
+                'linux-debian': 'python-scipy',
+                'linux-ubuntu': 'python-scipy',
+                'linux-fedora': 'scipy',
+                'pip': 'scipy'})
+
+        # ZIP manipulations use the command-line executables
+        vistrails.core.requirements.require_executable('zip')
+        vistrails.core.requirements.require_executable('unzip')
+
+    def get_python_environment(self):
+        """get_python_environment(): returns an environment that
+includes local definitions from startup.py. Should only be called
+after self.init()"""
+        return self._python_environment
+
+    def destroy(self):
+        """ destroy() -> None
+        Finalize all packages to, such as, get rid of temp files
+        
+        """
+        if hasattr(self, 'vistrailsStartup'):
+            self.vistrailsStartup.destroy()
+        Collection.clearInstance()
+
+    def __del__(self):
+        """ __del__() -> None
+        Make sure to finalize in the destructor
+        
+        """
+        self.destroy()
+    
+    def _parse_vtinfo(self, info, use_filename=True):
+        name = None
+        version = None
+        if use_filename and os.path.isfile(info):
+            name = info
+        else:
+            data = info.split(":")
+            if len(data) >= 2:
+                if use_filename:
+                    if os.path.isfile(str(data[0])):
+                        name = str(data[0])
+                    else:
+                        # maybe we are running on Windows and a full path
+                        # was passed as the filename so it has a : separating
+                        # the driver letter
+                        if system.systemType in ["Windows", "Microsoft"]:
+                            if os.path.isfile(":".join(data[:2])):
+                                name = ":".join(data[:2])
+                                data.pop(0)
+                                data[0] = name
+                elif not use_filename:
+                    name = str(data[0])
+                # will try to convert version to int
+                # if it fails, it's a tag name
+                try:
+                    #maybe a tag name contains ':' in its name
+                    #so we need to bring it back together
+                    rest = ":".join(data[1:])
+                    version = int(rest)
+                except ValueError:
+                    version = str(rest)
+            elif len(data) == 1:
+                if use_filename and os.path.isfile(str(data[0])):
+                    name = str(data[0])
+                elif not use_filename:
+                    name = str(data[0])
+        return (name, version)
+    
+    def process_interactive_input(self):
+        pe = None
+        usedb = False
+        if self.temp_db_options.host:
+            usedb = True
+        if self.input:
+            #check if versions are embedded in the filename
+            for filename in self.input:
+                f_name, version = self._parse_vtinfo(filename, not usedb)
+                locator = None
+                if f_name is None:
+                    debug.critical("Could not find file %s" % filename)
+                    return False
+                elif not usedb:
+                    locator = FileLocator(os.path.abspath(f_name))
+                    #_vnode and _vtag will be set when a .vtl file is open and
+                    # it can be either a FileLocator or a DBLocator
+                    
+                elif usedb:
+                    locator = DBLocator(host=self.temp_db_options.host,
+                                        port=self.temp_db_options.port,
+                                        database=self.temp_db_options.db,
+                                        user='',
+                                        passwd='',
+                                        obj_id=f_name,
+                                        obj_type=None,
+                                        connection_id=None)
+                if locator:
+                    if self.temp_configuration.check('parameterExploration'):
+                        pe = version
+                        version = None
+                    else:
+                        if hasattr(locator, '_vnode') and \
+                                locator._vnode is not None:
+                            version = locator._vnode
+                        if hasattr(locator,'_vtag'):
+                            # if a tag is set, it should be used instead of the
+                            # version number
+                            if locator._vtag != '':
+                                version = locator._vtag
+                    execute = self.temp_configuration.executeWorkflows
+                    mashuptrail = None
+                    mashupversion = None
+                    if hasattr(locator, '_mshptrail'):
+                        mashuptrail = locator._mshptrail
+                    if hasattr(locator, '_mshpversion'):
+                        mashupversion = locator._mshpversion
+                        if mashupversion:
+                            execute = True
+                    if not self.temp_configuration.showSpreadsheetOnly:
+                        self.showBuilderWindow()
+                    self.builderWindow.open_vistrail_without_prompt(locator,
+                                                                    version, execute,
+                                                                    mashuptrail=mashuptrail, 
+                                                                    mashupVersion=mashupversion)
+
+                    if self.temp_configuration.check('parameterExploration'):
+                        self.builderWindow.executeParameterExploration(pe)
+                
+                if self.temp_configuration.reviewMode:
+                    self.builderWindow.interactiveExportCurrentPipeline()
+
+        return True
+
+    def finishSession(self):
+        vistrails.core.interpreter.cached.CachedInterpreter.cleanup()
+        
+    def save_configuration(self):
+        """ save_configuration() -> None
+        Save the current vistrail configuration to the startup.xml file.
+        This is required to capture changes to the configuration that we 
+        make programmatically during the session, ie., browsed directories or
+        window sizes.
+
+        """
+        dom = self.vistrailsStartup.startup_dom()
+        doc = dom.documentElement
+        configuration_element = enter_named_element(doc, 'configuration')
+        doc.removeChild(configuration_element)
+        self.configuration.write_to_dom(dom, doc)
+        self.vistrailsStartup.write_startup_dom(dom)
+        dom.unlink()
+
+    def create_notification(self, notification_id, *args, **kwargs):
+        notifications = self.notifications
+        if notification_id not in notifications:
+            notifications[notification_id] = set()
+        else:
+            print "already added notification", notification_id
+
+    def register_notification(self, notification_id, method, *args, **kwargs):
+        notifications = self.notifications     
+        #print '>>> GLOBAL adding notification', notification_id, method  
+        #print id(notifications), notifications
+        if notification_id not in notifications:
+            self.create_notification(notification_id)
+        notifications[notification_id].add(method)
+
+    def unregister_notification(self, notification_id, method, *args, **kwargs):
+        notifications = self.notifications    
+        #print '>>> GLOBAL remove notification', notification_id, method   
+        #print id(notifications), notifications           
+        if notification_id in notifications:
+            notifications[notification_id].remove(method)
+
+    def send_notification(self, notification_id, *args):
+        # do global notifications
+        if notification_id in self.notifications:
+            # print 'global notification ', notification_id
+            for m in self.notifications[notification_id]:
+                try:
+                    #print "  m: ", m
+                    m(*args)
+                except Exception, e:
+                    import traceback
+                    traceback.print_exc()
+       
+    def showBuilderWindow(self):
+        pass
+ 
+    def add_vistrail(self, *objs):
+        """add_vistrail creates and returns a new controller based on the
+        information contained in objs.
+
+        """
+        raise NotImplementedError("Subclass must implement add_vistrail!")
+
+    def ensure_vistrail(self, locator):
+        """ensure_vistrail returns the controller matching the locator if the
+        vistrail is already open, otherwise it returns None.
+
+        """
+        raise NotImplementedError("Subclass must implement ensure_vistrail")
+
+    def select_version(self, version=None):
+        """select_version changes the version of the currently open vistrail
+        to the specified version.
+
+        """
+        raise NotImplementedError("Subclass must implement select_version")
+
+    def get_current_controller(self):
+        """get_current_controller returns the currently active controller, if
+        one exists, otherwise None.
+
+        """
+        raise NotImplementedError("Subclass must implement "
+                                  "get_current_controller")
+
+    def update_locator(self, old_locator, new_locator):
+        """update_locator updates the application state to ensure that any
+        vistrails referenced by old_locator are now referenced by
+        new_locator.
+
+        """
+        raise NotImplementedError("Subclass must implement update_locator")
+
+    def convert_version(self, version):
+        if isinstance(version, basestring):
+            try:
+                version = \
+                    self.get_controller().vistrail.get_version_number(version)
+            except:
+                version = None
+        return version
+
+    def new_vistrail(self):
+        return self.open_vistrail(None)
+
+    def open_vistrail(self, locator=None, version=None, is_abstraction=False):
+        if isinstance(locator, basestring):
+            locator = BaseLocator.from_url(locator)
+        elif locator is None:
+            locator = UntitledLocator()
+
+        controller = self.ensure_vistrail(locator)
+        if controller is None:
+            # vistrail is not already open
+            try:
+                loaded_objs = vistrails.core.db.io.load_vistrail(locator, False)
+                controller = self.add_vistrail(loaded_objs[0], locator, 
+                                               *loaded_objs[1:])
+                if locator.is_untitled():
+                    return True
+                controller.is_abstraction = is_abstraction
+                thumb_cache = ThumbnailCache.getInstance()
+                controller.vistrail.thumbnails = controller.find_thumbnails(
+                    tags_only=thumb_cache.conf.tagsOnly)
+                controller.vistrail.abstractions = controller.find_abstractions(
+                    controller.vistrail, True)
+                controller.vistrail.mashups = controller._mashups
+                collection = Collection.getInstance()
+                url = locator.to_url()
+                entity = collection.updateVistrail(url, controller.vistrail)
+                # add to relevant workspace categories
+                if not controller.is_abstraction:
+                    collection.add_to_workspace(entity)
+                collection.commit()
+            except VistrailsDBException, e:
+                import traceback
+                debug.critical(str(e), traceback.format_exc())
+                return None
+            except Exception, e:
+                # debug.critical('An error has occurred', str(e))
+                #print "An error has occurred", str(e)
+                raise
+
+        version = self.convert_version(version)
+        if version is None:
+            controller.select_latest_version()
+            version = controller.current_version
+        self.select_version(version)
+        # flush in case version was upgraded
+        controller.flush_delayed_actions()
+        return True
+        
+    def open_workflow(self, locator):
+        if isinstance(locator, basestring):
+            locator = BaseLocator.from_url(locator)
+
+        vistrail = Vistrail()
+        try:
+            if locator is None:
+                return False
+            if locator is not None:
+                workflow = locator.load(Pipeline)
+                action_list = []
+                for module in workflow.module_list:
+                    action_list.append(('add', module))
+                for connection in workflow.connection_list:
+                    action_list.append(('add', connection))
+                action = vistrails.core.db.action.create_action(action_list)
+                vistrail.add_action(action, 0L)
+                vistrail.update_id_scope()
+                vistrail.addTag("Imported workflow", action.id)
+
+                # FIXME might need different locator?                
+                controller = self.add_vistrail(vistrail, locator)
+        except VistrailsDBException, e:
+            import traceback
+            debug.critical(str(e), traceback.format_exc())
+            return None
+        except Exception, e:
+            # debug.critical('An error has occurred', str(e))
+            raise
+
+        controller.select_latest_version()
+        controller.set_changed(True)
+        return True
+
+    def save_vistrail(self, locator=None, controller=None, export=False):
+        if controller is None:
+            controller = self.get_current_controller()
+            if controller is None:
+                return False
+        if locator is None and controller is not None:
+            locator = controller.locator
+        elif isinstance(locator, basestring):
+            locator = BaseLocator.from_url(locator)
+
+        if not locator:
+            return False
+        old_locator = controller.locator
+
+        try:
+            controller.write_vistrail(locator, export=export)
+        except Exception, e:
+            import traceback
+            debug.critical('Failed to save vistrail: %s' % str(e),
+                           traceback.format_exc())
+            raise
+        if export:
+            return controller.locator
+
+        self.update_locator(old_locator, controller.locator)
+        # update collection
+        try:
+            thumb_cache = ThumbnailCache.getInstance()
+            controller.vistrail.thumbnails = controller.find_thumbnails(
+                tags_only=thumb_cache.conf.tagsOnly)
+            controller.vistrail.abstractions = controller.find_abstractions(
+                controller.vistrail, True)
+            controller.vistrail.mashups = controller._mashups
+
+            collection = Collection.getInstance()
+            url = locator.to_url()
+            entity = collection.updateVistrail(url, controller.vistrail)
+            # add to relevant workspace categories
+            collection.add_to_workspace(entity)
+            collection.commit()
+        except Exception, e:
+            import traceback
+            debug.critical('Failed to index vistrail', traceback.format_exc())
+        return controller.locator
+
+    def close_vistrail(self, locator=None, controller=None):
+        if controller is None:
+            controller = self.get_current_controller()
+            if controller is None:
+                return False
+        if locator is None and controller is not None:
+            locator = controller.locator
+        elif isinstance(locator, basestring):
+            locator = BaseLocator.from_url(locator)
+        
+        controller.close_vistrail(locator)
+        controller.cleanup()
+        self.remove_vistrail(locator)
+
+class VistrailsCoreApplication(VistrailsApplicationInterface):
+    def __init__(self):
+        VistrailsApplicationInterface.__init__(self)
+        self._controllers = {}
+        self._cur_controller = None
+
+    def init(self, optionsDict=None, args=None):
+        VistrailsApplicationInterface.init(self, optionsDict=optionsDict, args=args)
+        self.vistrailsStartup.init()
+
+    def is_running_gui(self):
+        return False
+
+    def get_current_controller(self):
+        return self._cur_controller
+    get_controller = get_current_controller
+
+    def add_vistrail(self, *objs):
+        (vistrail, locator, abstraction_files, thumbnail_files, mashups) = objs
+        controller = VistrailController(*objs)
+        self._controllers[locator] = controller
+        self._cur_controller = controller
+        return self._cur_controller
+        
+    def remove_vistrail(self, locator=None):
+        if locator is None and self._cur_controller is not None:
+            locator = self._cur_controller.locator
+        del self._controllers[locator]
+        if len(self._controllers) > 0:
+            self._cur_controller = self._controllers.itervalues().next()
+
+    def ensure_vistrail(self, locator):
+        if locator in self._controllers:
+            self._cur_controller = self._controllers[locator]
+            return self._cur_controller
+        return None
+
+    def update_locator(self, old_locator, new_locator):
+        self._controllers[new_locator] = self._controllers[old_locator]
+        del self._controllers[old_locator]
+
+    def select_version(self, version):
+        if self._cur_controller is not None:
+            self._cur_controller.change_selected_version(version)
+            return True
+        return False
+        
diff --git a/vistrails/core/bundles/__init__.py b/vistrails/core/bundles/__init__.py
new file mode 100644
index 0000000..14a819b
--- /dev/null
+++ b/vistrails/core/bundles/__init__.py
@@ -0,0 +1,40 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Package for bundle management. "Bundle" refers to system-level
+packages managed by specialized systems such as RedHat's RPM, Debian
+and Ubuntu's APT, OSX's fink, etc."""
+from vistrails.core.bundles.pyimport import py_import
+from vistrails.core.bundles.installbundle import install
diff --git a/vistrails/core/bundles/installbundle.py b/vistrails/core/bundles/installbundle.py
new file mode 100644
index 0000000..c4f05af
--- /dev/null
+++ b/vistrails/core/bundles/installbundle.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core import is_running_gui
+
+def install(dependency_dictionary):
+    """Tries to install a bundle after a py_import() failed.."""
+ 
+    if not is_running_gui():
+        return False
+
+    import vistrails.gui.bundles.installbundle
+    return vistrails.gui.bundles.installbundle.install(dependency_dictionary)
diff --git a/vistrails/core/bundles/pyimport.py b/vistrails/core/bundles/pyimport.py
new file mode 100644
index 0000000..f48cb97
--- /dev/null
+++ b/vistrails/core/bundles/pyimport.py
@@ -0,0 +1,92 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""module responsible for smartly importing python modules, checking
+for necessary installs."""
+
+import vistrails.core.bundles.installbundle
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core import debug
+
+##############################################################################
+
+_previously_failed_pkgs = set()
+
+class PyImportException(ImportError):
+    pass
+
+class PyImportBug(PyImportException):
+    pass
+
+def _vanilla_import(module_name):
+    return __import__(module_name, globals(), locals(), [])
+
+def py_import(module_name, dependency_dictionary):
+    """Tries to import a python module, installing if necessary.
+
+    If the import doesn't succeed, we guess which system we are running on and
+    install the corresponding package from the dictionary. We then run the
+    import again.
+    If the installation fails, we won't try to install that same module again
+    for the session.
+    """
+    try:
+        result = _vanilla_import(module_name)
+        return result
+    except ImportError:
+        if not getattr(get_vistrails_configuration(), 'installBundles'):
+            raise
+
+    if module_name in _previously_failed_pkgs:
+        raise PyImportException("Import of Python module '%s' failed again, "
+                                "not triggering installation" % module_name)
+    debug.warning("Import of python module '%s' failed. "
+                  "Will try to install bundle." % module_name)
+
+    success = vistrails.core.bundles.installbundle.install(dependency_dictionary)
+
+    if not success:
+        _previously_failed_pkgs.add(module_name)
+        raise PyImportException("Installation of Python module '%s' failed." %
+                                module_name)
+    try:
+        result = _vanilla_import(module_name)
+        return result
+    except ImportError, e:
+        _previously_failed_pkgs.add(module_name)
+        raise PyImportBug("Installation of package '%s' succeeded, but import "
+                          "still fails." % module_name)
+
+##############################################################################
diff --git a/vistrails/core/cache/__init__.py b/vistrails/core/cache/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/cache/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/cache/hasher.py b/vistrails/core/cache/hasher.py
new file mode 100644
index 0000000..bdbe8b8
--- /dev/null
+++ b/vistrails/core/cache/hasher.py
@@ -0,0 +1,130 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Hasher class for vistrail items."""
+from vistrails.core.cache.utils import hash_list
+
+try:
+    import hashlib
+    sha_hash = hashlib.sha1
+except ImportError:
+    import sha
+    sha_hash = sha.new
+
+##############################################################################
+
+class Hasher(object):
+
+    @staticmethod
+    def parameter_signature(p, constant_hasher_map={}):
+        k = (p.identifier, p.type, p.namespace)
+        custom_hasher = constant_hasher_map.get(k, None)
+        if custom_hasher:
+            return custom_hasher(p)
+        else:
+            hasher = sha_hash()
+            u = hasher.update
+            u(p.type)
+            u(p.identifier)
+            u(p.namespace or "")
+            u(p.strValue)
+            u(p.name)
+            u(p.evaluatedStrValue)
+            return hasher.digest()
+
+    @staticmethod
+    def function_signature(function, constant_hasher_map={}):
+        hasher = sha_hash()
+        u = hasher.update
+        u(function.name)
+        u(function.returnType)
+        u(hash_list(function.params,
+                    Hasher.parameter_signature,
+                    constant_hasher_map))
+        return hasher.digest()
+
+    @staticmethod
+    def connection_signature(c):
+        hasher = sha_hash()
+        u = hasher.update
+        u(c.source.name)
+        u(c.destination.name)
+        return hasher.digest()
+
+    @staticmethod
+    def connection_subpipeline_signature(c, source_sig, dest_sig):
+        """Returns the signature for the connection, including source
+and dest subpipelines"""
+        hasher = sha_hash()
+        u = hasher.update
+        u(Hasher.connection_signature(c))
+        u(source_sig)
+        u(dest_sig)
+        return hasher.digest()
+
+    @staticmethod
+    def module_signature(obj, constant_hasher_map={}):
+        hasher = sha_hash()
+        u = hasher.update
+        u(obj.module_descriptor.name)
+        u(obj.module_descriptor.package)
+        u(obj.module_descriptor.namespace or '')
+        u(obj.module_descriptor.package_version or '')
+        u(obj.module_descriptor.version or '')
+        u(hash_list(obj.functions, Hasher.function_signature, constant_hasher_map))
+        return hasher.digest()
+
+    @staticmethod
+    def subpipeline_signature(module_sig, upstream_sigs):
+        """Returns the signature for a subpipeline, given the
+signatures for the upstream pipelines and connections.
+
+        WARNING: For efficiency, upstream_sigs is mutated!
+        """
+        hasher = sha_hash()
+        hasher.update(module_sig)
+        upstream_sigs.sort()
+        for pipeline_connection_sig in upstream_sigs:
+            hasher.update(pipeline_connection_sig)
+        return hasher.digest()
+
+    @staticmethod
+    def compound_signature(sig_list):
+        """compound_signature(list of signatures) -> sha digest
+        returns the signature of the compound object formed by the list
+        of signatures, assuming the list order is irrelevant"""
+        hasher = sha_hash()
+        for h in sorted(sig_list):
+            hasher.update(h)
+        return hasher.digest()
diff --git a/vistrails/core/cache/utils.py b/vistrails/core/cache/utils.py
new file mode 100644
index 0000000..137eefd
--- /dev/null
+++ b/vistrails/core/cache/utils.py
@@ -0,0 +1,51 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Helper functions for cache package."""
+
+try:
+    import hashlib
+    sha_hash = hashlib.sha1
+except ImportError:
+    import sha
+    sha_hash = sha.new
+
+##############################################################################
+
+def hash_list(lst, hasher_f, constant_hasher_map={}):
+    hasher = sha_hash()
+    hash_l = [hasher_f(el, constant_hasher_map) for el in lst]
+    hash_l.sort()
+    for hel in hash_l: hasher.update(hel)
+    return hasher.digest()
diff --git a/vistrails/core/collection/__init__.py b/vistrails/core/collection/__init__.py
new file mode 100644
index 0000000..191d745
--- /dev/null
+++ b/vistrails/core/collection/__init__.py
@@ -0,0 +1,391 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import glob
+import os
+import sqlite3
+from itertools import chain
+
+from entity import Entity
+from vistrail import VistrailEntity
+from workflow import WorkflowEntity
+from workflow_exec import WorkflowExecEntity
+from thumbnail import ThumbnailEntity
+from mashup import MashupEntity
+from parameter_exploration import ParameterExplorationEntity
+
+from vistrails.core.db.locator import ZIPFileLocator, DBLocator, FileLocator, BaseLocator
+from vistrails.core.db.io import load_vistrail
+import vistrails.core.system
+import vistrails.db.services.io
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core import debug
+
+schema = ["create table entity(id integer primary key, type integer, "
+          "name text, user integer, mod_time text, create_time text, "
+          "size integer, description text, url text)",
+          "create table entity_children(parent integer, child integer)",
+          "create table entity_workspace(entity integer, workspace text)",
+          "create table workspaces(id text primary key)",
+          "insert into workspaces values ('Default')"]
+
+class Collection(object):
+    entity_types = dict((x.type_id, x)
+                        for x in [VistrailEntity, WorkflowEntity, 
+                                  WorkflowExecEntity, ThumbnailEntity,
+                                  MashupEntity, ParameterExplorationEntity])
+    def __init__(self, database=None):
+        if database is None:
+            self.database = ':memory:'
+        else:
+            self.database = database
+
+        self.entities = {}
+        self.deleted_entities = {}
+        self.temp_entities = {}
+        self.workspaces = {}
+        self.currentWorkspace = 'Default'
+        self.listeners = [] # listens for entity creation removal
+        self.max_id = 0
+        
+        if not os.path.exists(self.database):
+            debug.log("'%s' does not exist. Trying to create" % self.database)
+            self.conn = sqlite3.connect(self.database)
+            try:
+                cur = self.conn.cursor()
+                [cur.execute(s) for s in schema]
+                self.conn.commit()
+            except Exception, e:
+                debug.critical("Could not create vistrail index schema",
+                               str(e))
+        else:
+            self.conn = sqlite3.connect(self.database)
+        self.load_entities()
+
+    #Singleton technique
+    _instance = None
+
+    @staticmethod
+    def getInstance():
+        if Collection._instance is False:
+            debug.critical("Collection.getInstance() called but the "
+                           "Collection has been deleted!")
+            raise RuntimeError("Collection has been deleted!")
+        elif Collection._instance is None:
+            dotVistrails = vistrails.core.system.current_dot_vistrails()
+
+            path = os.path.join(dotVistrails, "index.db")
+            obj = Collection(path)
+            Collection._instance = obj
+        return Collection._instance
+
+    @staticmethod
+    def clearInstance():
+        if Collection._instance:
+            Collection._instance.conn.close()
+        Collection._instance = False
+
+    def add_listener(self, c):
+        """ Add objects that listen to entity creation/removal
+            Object may implement the following method
+             updated(self)
+        """
+        self.listeners.append(c)
+
+    def clear(self):
+        cur = self.conn.cursor()
+        cur.execute('delete from entity;')
+        cur.execute('delete from entity_children;')
+        cur.execute('delete from workspaces;')
+        cur.execute('delete from entity_workspace;')
+
+    def get_current_entities(self):
+        """NOTE: returns an iterator"""
+        return chain(self.entities.itervalues(), 
+                     self.temp_entities.itervalues())
+
+    def load_entities(self):
+        cur = self.conn.cursor()
+        cur.execute("select max(id) from entity;")
+        for row in cur.fetchall():
+            n = row[0]
+            self.max_id = n if n is not None else 0
+        
+        cur.execute("select * from entity;")
+        for row in cur.fetchall():
+            entity = self.load_entity(*row)
+            if entity is not None:
+                self.entities[entity.id] = entity
+
+        # now need to map children to correct places
+        cur.execute("select * from entity_children;")
+        for row in cur.fetchall():
+            if row[0] in self.entities and row[1] in self.entities:
+                self.entities[row[0]].children.append(self.entities[row[1]])
+                self.entities[row[1]].parent = self.entities[row[0]]
+
+        cur.execute("select * from workspaces;")
+        for row in cur.fetchall():
+            self.workspaces[row[0]] = []
+
+        cur.execute("select * from entity_workspace;")
+        for row in cur.fetchall():
+            e_id, workspace = row
+            if e_id in self.entities:
+                if workspace not in self.workspaces:
+                    self.workspaces[workspace] = []
+                self.workspaces[workspace].append(self.entities[e_id])
+
+    def save_entities(self):
+        # TODO delete entities with no workspace
+        for entity in self.deleted_entities.itervalues():
+            self.db_delete_entity(entity)
+        self.deleted_entities = {}
+        
+        for entity in self.entities.itervalues():
+            if entity.was_updated:
+                self.save_entity(entity)
+                
+        cur = self.conn.cursor()
+        cur.execute('delete from workspaces;')
+        cur.executemany("insert into workspaces values (?)", 
+                        [(i,) for i in self.workspaces])
+
+        cur.execute('delete from entity_workspace;')
+        cur.executemany("insert into entity_workspace values (?, ?)", 
+            ((k.id, i) for i,j in self.workspaces.iteritems() for k in j))
+
+    def load_entity(self, *args):
+        if args[1] in Collection.entity_types:
+            entity = Collection.entity_types[args[1]].load(*args)
+            return entity
+        else:
+            debug.critical("Cannot find entity type '%s'" % args[1])
+        return None
+
+    def add_entity(self, entity):
+        """ Adds entities to memory recursively """
+        if entity.id is None:
+            self.max_id += 1
+            entity.id = self.max_id
+        entity.was_updated = True
+        self.entities[entity.id] = entity
+        for child in entity.children:
+            child.parent = entity
+            self.add_entity(child)
+        
+    def add_temp_entity(self, entity):
+        """Add an entity to memory only.  Used for vistrails that have
+        not been saved."""
+        self.max_id += 1
+        entity.id = self.max_id
+        self.temp_entities[entity.id] = entity
+        for child in entity.children:
+            child.parent = entity
+            self.add_temp_entity(child)
+
+    def is_temp_entity(self, entity):
+        return entity.id in self.temp_entities
+            
+    def save_entity(self, entity):
+        """ saves entities to disk """
+        cur = self.conn.cursor()
+        entity_tuple = entity.save()
+        cur.execute("insert or replace into entity values(%s)" % \
+                    ','.join(('?',) * len(entity_tuple)), entity_tuple)
+        entity.was_updated = False
+        cur.execute('delete from entity_children where parent=?', (entity.id,))
+        cur.executemany("insert into entity_children values (?, ?)",
+                        ((entity.id, child.id) for child in entity.children))
+
+    def commit(self):
+        self.save_entities()
+        self.conn.commit()
+        for o in self.listeners:
+            if hasattr(o, "updated"):
+                o.updated()
+
+    def delete_entity(self, entity):
+        """ Delete entity from memory recursively """
+        if entity.id in self.temp_entities:
+            del self.temp_entities[entity.id]
+        else:
+            self.deleted_entities[entity.id] = entity
+            if entity.id in self.entities:
+                del self.entities[entity.id]
+        for child in entity.children:
+            self.delete_entity(child)
+
+    def add_workspace(self, workspace):
+        if workspace not in self.workspaces:
+            self.workspaces[workspace] = []
+
+    def add_to_workspace(self, entity, workspace=None):
+        if not entity:
+            return
+        if not workspace:
+            workspace = self.currentWorkspace
+        self.add_workspace(workspace)
+        if entity not in self.workspaces[workspace]:
+            self.workspaces[workspace].append(entity)
+        
+    def del_from_workspace(self, entity, workspace=None):
+        if not workspace:
+            workspace = self.currentWorkspace
+        if workspace in self.workspaces:
+            if entity in self.workspaces[workspace]:
+                self.workspaces[workspace].remove(entity)
+
+    def delete_workspace(self, workspace):
+        if workspace in self.workspaces:
+            del self.workspaces[workspace]
+
+    def db_delete_entity(self, entity):
+        """ Delete entity from database """
+        cur = self.conn.cursor()
+        if entity.id is not None:
+            cur.execute("delete from entity where id=?", (entity.id,))
+            cur.execute("delete from entity_children where parent=?", (entity.id,))
+            cur.execute("delete from entity_children where child=?", (entity.id,))
+
+    def create_workflow_entity(self, workflow):
+        entity = WorkflowEntity(workflow)
+        self.add_entity(entity)
+        return entity
+
+    def create_vistrail_entity(self, vistrail):
+        entity = VistrailEntity(vistrail)
+        self.add_entity(entity)
+        return entity
+
+    def update_from_database(self, db_locator):
+        # db_conn = db_locator.get_connection()
+        config = (('host', db_locator._host),
+                  ('port', int(db_locator._port)),
+                  ('db', db_locator._db),
+                  ('user', db_locator._user),
+                  ('passwd', db_locator._passwd))
+        rows = vistrails.db.services.io.get_db_object_list(dict(config), 'vistrail')
+        for row in rows:
+            if row[0] in [1,]:
+                continue
+            kwargs = {'obj_type': 'vistrail', 'obj_id': row[0]}
+            locator = DBLocator(*[x[1] for x in config], **kwargs)
+            (vistrail, abstractions, thumbnails, mashups) = load_vistrail(locator)
+            vistrail.abstractions = abstractions
+            vistrail.thumbnails = thumbnails
+            vistrail.mashups = mashups
+            self.create_vistrail_entity(vistrail)
+
+    def update_from_directory(self, directory):
+        filenames = glob.glob(os.path.join(directory, '*.vt'))
+        for filename in filenames:
+            locator = FileLocator(filename)
+            url = locator.to_url()
+            self.updateVistrail(url)
+
+    def fromUrl(self, url):
+        """ Check if entity with this url exist in index and return it """
+        for e in self.entities.itervalues():
+            if e.url == url:
+                return e
+        return None
+
+    def urlExists(self, url):
+        """ Check if entity with this url exist """
+        locator = BaseLocator.from_url(url)
+        if locator.is_valid():
+                return True
+        return False
+
+    def updateVistrail(self, url, vistrail=None):
+        """ updateVistrail(self, string:url, Vistrail:vistrail)
+        Update the specified entity url. Delete or reload as necessary.
+        Need to make sure workspaces are updated if the entity is changed.
+        """
+        entities = [e for e in self.entities.itervalues() if e.url == url]
+        entity = entities[0] if len(entities) else None
+        while entity and entity.parent:
+            entity = entity.parent 
+            url = entity.url
+        workspaces = [p for p in self.workspaces if entity in self.workspaces[p]]
+        if entity:
+            for p in workspaces:
+                self.del_from_workspace(entity, p)
+            self.delete_entity(entity)
+
+        locator = BaseLocator.from_url(url)
+        if locator.is_valid():
+            if not vistrail:
+                (vistrail, abstractions, thumbnails, mashups) = load_vistrail(locator)
+                vistrail.abstractions = abstractions
+                vistrail.thumbnails = thumbnails
+                vistrail.mashups = mashups
+            entity = self.create_vistrail_entity(vistrail)
+            for p in workspaces:
+                self.add_to_workspace(entity, p)
+            return entity
+        else:
+            # probably an unsaved vistrail
+            pass
+#            debug.critical("Locator is not valid!")
+
+def main():
+    import sys
+    sys.path.append('/home/tommy/git/vistrails/vistrails')
+
+    # vistrail = load_vistrail(ZIPFileLocator('/vistrails/examples/spx.vt'))[0]
+#    db_locator = DBLocator('vistrails.sci.utah.edu', 3306,
+#                           'vistrails', 'vistrails', '8edLj4',
+#                           obj_id=9, obj_type='vistrail')
+    # vistrail = load_vistrail(db_locator)[0]
+    c = Collection('/home/tommy/git/vistrails/vistrails/core/collection/test.db')
+    c.clear()
+    c.update_from_directory('/home/tommy/git/vistrails/examples')
+#    c.update_from_database(db_locator)
+
+    # entity = c.create_vistrail_entity(vistrail)
+    c.entities = {}
+    c.load_entities()
+#    print c.entities[2].url
+#    locator = BaseLocator.from_url(c.entities[2].url)
+#    c.entities[1].description = 'blah blah blah'
+#    c.save_entity(c.entities[1])
+#    print locator.to_url()
+    # c.load_entities()
+
+#    print BaseLocator.from_url('/vistrails/examples/spx.xml').to_url()
+
+if __name__ == '__main__':
+    main()
diff --git a/vistrails/core/collection/entity.py b/vistrails/core/collection/entity.py
new file mode 100644
index 0000000..4daf1e0
--- /dev/null
+++ b/vistrails/core/collection/entity.py
@@ -0,0 +1,119 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.db.locator import BaseLocator
+
+class Entity(object):
+    def __init__(self):
+        self.parent = None
+        self.children = []
+        self.image_fnames = []
+        self.was_updated = False
+        self.is_open = False
+
+    def load(self, *args):
+        (self.id, 
+         _, 
+         self.name, 
+         self.user,
+         self.mod_time, 
+         self.create_time,
+         self.size,
+         self.description,
+         self.url) = args
+
+    def save(self):
+        return (self.id,
+                self.type_id,
+                self.name,
+                self.user,
+                self.mod_time,
+                self.create_time,
+                self.size,
+                self.description,
+                self.url)
+
+    def _get_start_date(self):
+        return self.create_time
+    start_date = property(_get_start_date)
+
+    def _get_end_date(self):
+        return self.mod_time
+    end_date = property(_get_end_date)
+
+#     # returns string
+#     def get_name(self):
+#         return self.name
+
+#     # returns datetime
+#     def get_mod_time(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_create_time(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns string
+#     # FIXME: perhaps this should be a User object at some point
+#     def get_user(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns tuple (<entity_type>, <entity_id>)
+#     def get_id(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns integer
+#     def get_size(self):
+#         raise RuntimeError("Method is abstract")
+
+#     def get_description(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns possibly empty list of Entity objects
+#     def get_children(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns list of strings representing paths
+#     # FIXME: should this be uris for database access?
+#     def get_image_fnames(self):
+#         raise RuntimeError("Method is abstract")
+    
+    # returns boolean, True if search input is satisfied else False
+    def match(self, search):
+        raise RuntimeError("Method is abstract")
+
+    def locator(self):
+        locator = BaseLocator.from_url(self.url)
+        return locator
+
diff --git a/vistrails/core/collection/mashup.py b/vistrails/core/collection/mashup.py
new file mode 100644
index 0000000..2f88e90
--- /dev/null
+++ b/vistrails/core/collection/mashup.py
@@ -0,0 +1,109 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from entity import Entity
+
+class MashupEntity(Entity):
+    type_id = 5
+
+    def __init__(self, mashup=None):
+        Entity.__init__(self)
+        self.id = None
+        self.update(mashup)
+
+    @staticmethod
+    def load(*args):
+        entity = MashupEntity()
+        Entity.load(entity, *args)
+        return entity
+
+    def update(self, mashup):
+        self.mashup = mashup
+        if self.mashup is not None:
+            self.name = mashup.name \
+            if mashup.name else "Version #" + str(mashup.id)
+            self.user = 'testing'
+            self.mod_time = 'test'
+            self.create_time = 'test'
+            self.size = len(self.mashup.alias_list)
+            self.description = ""
+            self.url = 'test'
+            self.was_updated = True
+
+#             self.name = self.workflow.name
+#             self.user = self.workflow.user
+#             self.mod_time = self.workflow.py_date
+#             self.create_time = self.workflow.py_date
+#             self.size = len(self.workflow.modules)
+#             self.description = self.workflow.notes
+#             self.was_updated = True
+        
+#     # returns string
+#     def get_name(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_mod_time(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_create_time(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns string
+#     # FIXME: perhaps this should be a User object at some point
+#     def get_user(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns tuple (<entity_type>, <entity_id>)
+#     def get_id(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns integer
+#     def get_size(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns possibly empty list of Entity objects
+#     def get_children(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns list of strings representing paths
+#     # FIXME: should this be uris for database access?
+#     def get_image_fnames(self):
+#         raise RuntimeError("Method is abstract")
+    
+    # returns boolean, True if search input is satisfied else False
+    def match(self, search):
+        raise RuntimeError("Not implemented")
\ No newline at end of file
diff --git a/vistrails/core/collection/parameter_exploration.py b/vistrails/core/collection/parameter_exploration.py
new file mode 100644
index 0000000..942cf87
--- /dev/null
+++ b/vistrails/core/collection/parameter_exploration.py
@@ -0,0 +1,100 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from entity import Entity
+
+class ParameterExplorationEntity(Entity):
+    type_id = 6
+
+    def __init__(self, pe=None):
+        Entity.__init__(self)
+        self.id = None
+        self.update(pe)
+
+    @staticmethod
+    def load(*args):
+        entity = ParameterExplorationEntity()
+        Entity.load(entity, *args)
+        return entity
+
+    def update(self, pe):
+        self.pe = pe
+        if self.pe is not None:
+            self.name = pe.name
+            self.user = pe.user
+            self.mod_time = pe.date
+            self.create_time = pe.date
+            self.size = len(pe.functions)
+            self.description = ""
+            self.url = 'test'
+            self.was_updated = True
+        
+#     # returns string
+#     def get_name(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_mod_time(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_create_time(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns string
+#     # FIXME: perhaps this should be a User object at some point
+#     def get_user(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns tuple (<entity_type>, <entity_id>)
+#     def get_id(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns integer
+#     def get_size(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns possibly empty list of Entity objects
+#     def get_children(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns list of strings representing paths
+#     # FIXME: should this be uris for database access?
+#     def get_image_fnames(self):
+#         raise RuntimeError("Method is abstract")
+    
+    # returns boolean, True if search input is satisfied else False
+    def match(self, search):
+        raise RuntimeError("Not implemented")
\ No newline at end of file
diff --git a/vistrails/core/collection/schema.sql b/vistrails/core/collection/schema.sql
new file mode 100644
index 0000000..c916c4b
--- /dev/null
+++ b/vistrails/core/collection/schema.sql
@@ -0,0 +1,37 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+create table entity(id integer primary key, type integer, name text, user integer, mod_time text, create_time text, size integer, description text, url text);
+create table entity_children(parent integer, child integer);
+create table type_map(id integer, type string);
\ No newline at end of file
diff --git a/vistrails/core/collection/search.py b/vistrails/core/collection/search.py
new file mode 100644
index 0000000..8628cb2
--- /dev/null
+++ b/vistrails/core/collection/search.py
@@ -0,0 +1,670 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# search functions for entity-type objects
+# notes in plain text, not html, should be fix later
+import re
+import time
+
+from vistrails.core.query import extract_text
+
+import unittest
+import datetime
+import vistrails.core
+
+################################################################################
+
+class SearchParseError(Exception):
+    def __init__(self, *args, **kwargs):
+        Exception.__init__(self, *args, **kwargs)
+
+class SearchStmt(object):
+    def __init__(self, content):
+        self.text = content
+        self.content = re.compile('.*'+content+'.*', re.MULTILINE | re.IGNORECASE)
+
+    def match(self, entity):
+        return True
+
+    def matchModule(self, v, m):
+        return True
+
+    def run(self, v, n):
+        pass
+
+    def __call__(self):
+        """Make SearchStmt behave just like a QueryObject."""
+        return self
+
+class TimeSearchStmt(SearchStmt):
+    oneSecond = 1.0
+    oneMinute = oneSecond * 60.0
+    oneHour = oneMinute * 60.0
+    oneDay = oneHour * 24.0
+    oneWeek = oneDay * 7.0
+    oneMonth = oneDay * 31.0 # wrong, I know
+    oneYear = oneDay * 365.0 # wrong, I know
+    amounts = {'seconds': oneSecond,
+               'minutes': oneMinute,
+               'hours': oneHour,
+               'days': oneDay,
+               'weeks': oneWeek,
+               'months': oneMonth,
+               'years': oneYear}
+    months = {'january': 1,
+              'february': 2,
+              'march': 3,
+              'april': 4,
+              'may': 5,
+              'june': 6,
+              'july': 7,
+              'august': 8,
+              'september': 9,
+              'october': 10,
+              'november': 11,
+              'december': 12}
+    
+    dateEntry = r'([^\,\/\: ]+)'
+    timeEntry = r'(\d?\d?)'
+    dateSep = r' *[\,\/\- ] *'
+    timeSep = r' *: *'
+    sep = r' *'
+    start = r'^ *'
+    finish = r' *$'
+    twoEntryDate = (dateEntry+
+                    dateSep+
+                    dateEntry)
+    threeEntryDate = (dateEntry+
+                      dateSep+
+                      dateEntry+
+                      dateSep+
+                      dateEntry)
+    twoEntryTime = (timeEntry+
+                    timeSep+
+                    timeEntry)
+    threeEntryTime = (timeEntry+
+                      timeSep+
+                      timeEntry+
+                      timeSep+
+                      timeEntry)
+
+    dateRE = [re.compile((start+
+                          twoEntryDate+
+                          finish)), # Mar 12   Mar, 12    
+              re.compile((start+
+                          threeEntryDate+
+                          finish)), # Mar, 12, 2006    2006 Mar 12     etc
+              re.compile((start+
+                          twoEntryTime+
+                          finish)),
+              re.compile((start+
+                          threeEntryTime+
+                          finish)),
+              re.compile((start+
+                          twoEntryDate+
+                          sep+
+                          twoEntryTime+
+                          finish)),
+              re.compile((start+
+                          twoEntryDate+
+                          sep+
+                          threeEntryTime+
+                          finish)),
+              re.compile((start+
+                          threeEntryDate+
+                          sep+
+                          twoEntryTime+
+                          finish)),
+              re.compile((start+
+                          threeEntryDate+
+                          sep+
+                          threeEntryTime+
+                          finish)),
+              re.compile((start+
+                          twoEntryTime+
+                          sep+
+                          twoEntryDate+
+                          finish)),
+              re.compile((start+
+                          twoEntryTime+
+                          sep+
+                          threeEntryDate+
+                          finish)),
+              re.compile((start+
+                          threeEntryTime+
+                          sep+
+                          twoEntryDate+
+                          finish)),
+              re.compile((start+
+                          threeEntryTime+
+                          sep+
+                          threeEntryDate+
+                          finish))]
+    
+    def __init__(self, date):
+        self.date = self.parseDate(date)
+
+    def parseDate(self, dateStr):
+        def parseAgo(s):
+            [amount, unit] = s.split(' ')
+            try:
+                amount = float(amount)
+            except ValueError:
+                raise SearchParseError("Expected a number, got %s" % amount)
+            if amount <= 0:
+                raise SearchParseError("Expected a positive number, got %s" % amount)
+            unitRe = re.compile('^'+unit)
+            keys = [k
+                    for k in TimeSearchStmt.amounts.keys()
+                    if unitRe.match(k)]
+            if len(keys) == 0:
+                raise SearchParseError("Time unit unknown: %s" % unit)
+            elif len(keys) > 1:
+                raise SearchParseError("Time unit ambiguous: %s matches %s" % (unit, keys))
+            return round(time.time()) - TimeSearchStmt.amounts[keys[0]] * amount
+
+        def guessDate(unknownEntries, year=None):
+            def guessStrMonth(s):
+                monthRe = re.compile('^'+s)
+                keys = [k
+                        for k in TimeSearchStmt.months.keys()
+                        if monthRe.match(k)]
+                if len(keys) == 0:
+                    raise SearchParseError("Unknown month: %s" % s)
+                elif len(keys) > 1:
+                    raise SearchParseError("Ambiguous month: %s matches %s" % (s, keys))
+                return TimeSearchStmt.months[keys[0]]
+            if not year:
+                m = None
+                # First heuristic: if month comes first, then year comes last
+                try:
+                    e0 = int(unknownEntries[0])
+                except ValueError:
+                    m = guessStrMonth(unknownEntries[0])
+                    try:
+                        d = int(unknownEntries[1])
+                    except ValueError:
+                        raise SearchParseError("Expected day, got %s" % unknownEntries[1])
+                    try:
+                        y = int(unknownEntries[2])
+                    except ValueError:
+                        raise SearchParseError("Expected year, got %s" % unknownEntries[2])
+                    return (y, m, d)
+                # Second heuristic: if month comes last, then year comes first
+                try:
+                    e2 = int(unknownEntries[2])
+                except ValueError:
+                    m = guessStrMonth(unknownEntries[2])
+                    try:
+                        d = int(unknownEntries[1])
+                    except ValueError:
+                        raise SearchParseError("Expected day, got %s" % unknownEntries[1])
+                    try:
+                        y = int(unknownEntries[0])
+                    except ValueError:
+                        raise SearchParseError("Expected year, got %s" % unknownEntries[0])
+                    return (y, m, d)
+                # If month is the middle one, decide day and year by size
+                # (year is largest, hopefully year was entered using 4 digits)
+                try:
+                    e1 = int(unknownEntries[1])
+                except ValueError:
+                    m = guessStrMonth(unknownEntries[1])
+                    try:
+                        d = int(unknownEntries[2])
+                    except ValueError:
+                        raise SearchParseError("Expected day or year, got %s" % unknownEntries[2])
+                    try:
+                        y = int(unknownEntries[0])
+                    except ValueError:
+                        raise SearchParseError("Expected year or year, got %s" % unknownEntries[0])
+                    return (max(y,d), m, min(y, d))
+                lst = [(e0,0),(e1,1),(e2,2)]
+                lst.sort()
+                return guessDate([str(lst[0][0]),
+                                  str(lst[1][0])],
+                                 year=e2)
+            # We know year, decide month using similar heuristics - try string month first,
+            # then decide which is possible
+            try:
+                e0 = int(unknownEntries[0])
+            except ValueError:
+                m = guessStrMonth(unknownEntries[0])
+                try:
+                    d = int(unknownEntries[1])
+                except ValueError:
+                    raise SearchParseError("Expected day, got %s" % unknownEntries[1])
+                return (year, m, d)
+            try:
+                e1 = int(unknownEntries[1])
+            except ValueError:
+                m = guessStrMonth(unknownEntries[1])
+                try:
+                    d = int(unknownEntries[0])
+                except ValueError:
+                    raise SearchParseError("Expected day, got %s" % unknownEntries[0])
+                return (year, m, d)
+            if e0 > 12:
+                return (year, e1, e0)
+            else:
+                return (year, e0, e1)
+
+        dateStr = dateStr.lower().lstrip().rstrip()
+        if dateStr.endswith(" ago"):
+            return parseAgo(dateStr[:-4])
+        if dateStr == "yesterday":
+            lst = list(time.localtime(round(time.time()) - TimeSearchStmt.oneDay))
+            # Reset hour, minute, second
+            lst[3] = 0
+            lst[4] = 0
+            lst[5] = 0
+            return time.mktime(lst)
+        if dateStr == "today":
+            lst = list(time.localtime())
+            # Reset hour, minute, second
+            lst[3] = 0
+            lst[4] = 0
+            lst[5] = 0
+            return time.mktime(lst)
+        if dateStr.startswith("this "):
+            rest = dateStr[5:]
+            lst = list(time.localtime(round(time.time())))
+            if rest == "minute":
+                lst[5] = 0
+            elif rest == "hour":
+                lst[5] = 0
+                lst[4] = 0
+            elif rest == "day":
+                lst[5] = 0
+                lst[4] = 0
+                lst[3] = 0
+            elif rest == "week": # weeks start on monday
+                lst[5]  = 0
+                lst[4]  = 0
+                lst[3]  = 0
+                # This hack saves me the hassle of computing negative days, months, etc
+                lst = list(time.localtime(time.mktime(lst) - TimeSearchStmt.oneDay * lst[6]))
+            elif rest == "month":
+                lst[5]  = 0
+                lst[4]  = 0
+                lst[3]  = 0
+                lst[2]  = 1
+            elif rest == "year":
+                lst[5]  = 0
+                lst[4]  = 0
+                lst[3]  = 0
+                lst[2]  = 1
+                lst[1]  = 1
+            return time.mktime(lst)
+                
+        result = [x.match(dateStr) for x in TimeSearchStmt.dateRE]
+        this = list(time.localtime())
+        def setTwoDate(g):
+            d = guessDate(g, year=this[0])
+            this[0] = d[0]
+            this[1] = d[1]
+            this[2] = d[2]
+        def setThreeDate(g):
+            d = guessDate(g)
+            this[0] = d[0]
+            this[1] = d[1]
+            this[2] = d[2]
+        def setTwoTime(g):
+            this[3] = int(g[0])
+            this[4] = int(g[1])
+            this[5] = 0
+        def setThreeTime(g):
+            this[3] = int(g[0])
+            this[4] = int(g[1])
+            this[5] = int(g[2])
+        if result[0]:
+            setTwoDate(result[0].groups())
+            setTwoTime([0,0])
+        elif result[1]:
+            setThreeDate(result[1].groups())
+            setTwoTime([0,0])
+        elif result[2]:
+            setTwoTime(result[2].groups())
+        elif result[3]:
+            setThreeTime(result[3].groups())
+        elif result[4]:
+            g = result[4].groups()
+            setTwoDate([g[0], g[1]])
+            setTwoTime([g[2], g[3]])
+        elif result[5]:
+            g = result[5].groups()
+            setTwoDate([g[0], g[1]])
+            setThreeTime([g[2], g[3], g[4]])
+        elif result[6]:
+            g = result[6].groups()
+            setThreeDate([g[0], g[1], g[2]])
+            setTwoTime([g[3], g[4]])
+        elif result[7]:
+            g = result[7].groups()
+            setThreeDate([g[0], g[1], g[2]])
+            setThreeTime([g[3], g[4], g[5]])
+        elif result[8]:
+            g = result[8].groups()
+            setTwoTime([g[0], g[1]])
+            setTwoDate([g[2], g[3]])
+        elif result[9]:
+            g = result[9].groups()
+            setTwoTime([g[0], g[1]])
+            setThreeDate([g[2], g[3], g[4]])
+        elif result[10]:
+            g = result[10].groups()
+            setThreeTime([g[0], g[1], g[2]])
+            setTwoDate([g[3], g[4]])
+        elif result[11]:
+            g = result[11].groups()
+            setThreeTime([g[0], g[1], g[2]])
+            setThreeDate([g[3], g[4],g[5]])
+        else:
+            raise SearchParseError("Expected a date, got '%s'" % dateStr)
+        return time.mktime(this)
+        
+class BeforeSearchStmt(TimeSearchStmt):
+    def match(self, entity):
+        if not entity.mod_time:
+            return False
+        t = time.mktime(time.strptime(entity.mod_time, "%d %b %Y %H:%M:%S"))
+        return t <= self.date
+
+class AfterSearchStmt(TimeSearchStmt):
+    def match(self, entity):
+        if not entity.mod_time:
+            return False
+        t = time.mktime(time.strptime(entity.mod_time, "%d %b %Y %H:%M:%S"))
+        return t >= self.date
+
+class UserSearchStmt(SearchStmt):
+    def match(self, entity):
+        if not entity.user:
+            return False
+        return self.content.match(entity.user)
+
+class NotesSearchStmt(SearchStmt):
+    def match(self, entity):
+        if entity.description:
+            plainNotes = extract_text(entity.description)
+            return self.content.search(plainNotes)
+        return False
+
+class NameSearchStmt(SearchStmt):
+    def match(self, entity):
+        return self.content.match(entity.name)
+
+class AndSearchStmt(SearchStmt):
+    def __init__(self, lst):
+        self.matchList = lst
+    def match(self, entity):
+        for s in self.matchList:
+            if not s.match(entity):
+                return False
+        return True
+
+class OrSearchStmt(SearchStmt):
+    def __init__(self, lst):
+        self.matchList = lst
+    def match(self, entity):
+        for s in self.matchList:
+            if s.match(entity):
+                return True
+        return False
+
+class NotSearchStmt(SearchStmt):
+    def __init__(self, stmt):
+        self.stmt = stmt
+    def match(self, entity):
+        return not self.stmt.match(entity)
+
+class TrueSearch(SearchStmt):
+    def __init__(self):
+        pass
+    def match(self, entity):
+        return True
+
+################################################################################
+
+class SearchCompiler(object):
+    SEPARATOR = -1
+    def __init__(self, searchStr):
+        self.searchStmt = self.compile(searchStr)
+    def compile(self, searchStr):
+        lst = []
+        t1 = searchStr.split(' ')
+        while t1:
+            tok = t1[0]
+            cmd = tok.split(':')
+            if not SearchCompiler.dispatch.has_key(cmd[0]):
+                fun = SearchCompiler.parseAny
+            else:
+                fun = SearchCompiler.dispatch[cmd[0]]
+            if len(cmd) > 1:
+                [search, rest] = fun(self, cmd[1:] + t1[1:])
+            else:
+                [search, rest] = fun(self, t1)
+            lst.append(search)
+            t1 = rest
+        return AndSearchStmt(lst)
+    def parseUser(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        return (UserSearchStmt(tokStream[0]), tokStream[1:])
+    def parseAny(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        tok = tokStream[0]
+        return (OrSearchStmt([UserSearchStmt(tok),
+                              NotesSearchStmt(tok),
+                              NameSearchStmt(tok)]), tokStream[1:])
+    def parseNotes(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        lst = []
+        while len(tokStream):
+            tok = tokStream[0]
+            if ':' in tok:
+                return (AndSearchStmt(lst), tokStream)
+            lst.append(NotesSearchStmt(tok))
+            tokStream = tokStream[1:]
+        return (AndSearchStmt(lst), [])
+    def parseName(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        lst = []
+        while len(tokStream):
+            tok = tokStream[0]
+            if ':' in tok:
+                return (AndSearchStmt(lst), tokStream)
+            lst.append(NameSearchStmt(tok))
+            tokStream = tokStream[1:]
+        return (AndSearchStmt(lst), [])
+    def parseBefore(self, tokStream):
+        old_tokstream = tokStream
+        try:
+            if len(tokStream) == 0:
+                raise SearchParseError('Expected token, got end of search')
+            lst = []
+            while len(tokStream):
+                tok = tokStream[0]
+                # ugly, special case times
+                if (':' in tok and
+                    not TimeSearchStmt.dateRE[2].match(tok) and
+                    not TimeSearchStmt.dateRE[3].match(tok)):
+                    return (BeforeSearchStmt(" ".join(lst)), tokStream)
+                lst.append(tok)
+                tokStream = tokStream[1:]
+            return (BeforeSearchStmt(" ".join(lst)), [])
+        except SearchParseError, e:
+            if 'Expected a date' in e.args[0]:
+                try:
+                    return self.parseAny(old_tokstream)
+                except SearchParseError, e2:
+                    print "Another exception...", e2.args[0]
+                    raise e
+            else:
+                raise
+            
+    def parseAfter(self, tokStream):
+        try:
+            if len(tokStream) == 0:
+                raise SearchParseError('Expected token, got end of search')
+            lst = []
+            while len(tokStream):
+                tok = tokStream[0]
+                # ugly, special case times
+                if (':' in tok and
+                    not TimeSearchStmt.dateRE[2].match(tok) and
+                    not TimeSearchStmt.dateRE[3].match(tok)):
+                    return (AfterSearchStmt(" ".join(lst)), tokStream)
+                lst.append(tok)
+                tokStream = tokStream[1:]
+            return (AfterSearchStmt(" ".join(lst)), [])
+        except SearchParseError, e:
+            if 'Expected a date' in e.args[0]:
+                try:
+                    return self.parseAny(['after'] + tokStream)
+                except SearchParseError, e2:
+                    print "Another exception...", e2.args[0]
+                    raise e
+            else:
+                raise
+
+    dispatch = {'user': parseUser,
+                'notes': parseNotes,
+                'before': parseBefore,
+                'after': parseAfter,
+                'name': parseName,
+                'any': parseAny}
+                
+            
+
+################################################################################
+
+
+class TestSearch(unittest.TestCase):
+    def test1(self):
+        self.assertEquals((TimeSearchStmt('1 day ago').date -
+                           TimeSearchStmt('2 days ago').date), TimeSearchStmt.oneDay)
+    def test2(self):
+        self.assertEquals((TimeSearchStmt('12 mar 2006').date -
+                           TimeSearchStmt('11 mar 2006').date), TimeSearchStmt.oneDay)
+    def test3(self):
+        # This will fail if year flips during execution. Oh well :)
+        yr = datetime.datetime.today().year
+        self.assertEquals((TimeSearchStmt('12 mar').date -
+                           TimeSearchStmt('12 mar %d' % yr).date), 0.0)
+    def test4(self):
+        # This will fail if year flips during execution. Oh well :)
+        yr = datetime.datetime.today().year
+        self.assertEquals((TimeSearchStmt('mar 12').date -
+                           TimeSearchStmt('12 mar %d' % yr).date), 0.0)
+    def test5(self):
+        yr = datetime.datetime.today().year
+        self.assertEquals((TimeSearchStmt('03 15').date -
+                           TimeSearchStmt('15 mar %d' % yr).date), 0.0)
+    def test6(self):
+        self.assertEquals((TimeSearchStmt('03/15/2006').date -
+                           TimeSearchStmt('15 mar 2006').date), 0.0)
+    def test7(self):
+        self.assertEquals((TimeSearchStmt('1 day ago').date -
+                           TimeSearchStmt('24 hours ago').date), 0.0)
+    def test8(self):
+        self.assertEquals((TimeSearchStmt('1 hour ago').date -
+                           TimeSearchStmt('60 minutes ago').date), 0.0)
+    def test9(self):
+        self.assertEquals((TimeSearchStmt('1 minute ago').date -
+                           TimeSearchStmt('60 seconds ago').date), 0.0)
+    def test10(self):
+        self.assertEquals((TimeSearchStmt('1 week ago').date -
+                           TimeSearchStmt('7 days ago').date), 0.0)
+    def test11(self):
+        self.assertEquals((TimeSearchStmt('1 month ago').date -
+                           TimeSearchStmt('31 days ago').date), 0.0)
+    def test12(self):
+        self.assertEquals(TimeSearchStmt('12 mar 2007 21:00:00').date,
+                          TimeSearchStmt('21:00:00 12 mar 2007').date)
+    def test13(self):
+        # This will fail if year flips during execution. Oh well :)
+        yr = datetime.datetime.today().year
+        self.assertEquals(TimeSearchStmt('12 mar %d 21:00' % yr).date,
+                          TimeSearchStmt('21:00:00 12 mar').date)
+    def test14(self):
+        self.assertEquals(TimeSearchStmt('13 apr 2006 21:00').date,
+                          TimeSearchStmt('04/13/2006 21:00:00').date)
+    def test15(self):
+        import vistrails.core.vistrail
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        # FIXME: Add notes to this.
+#         self.assertTrue(NotesSearchStmt('mapper').match(v.actionMap[36]))
+#         self.assertFalse(NotesSearchStmt('-qt-block-indent').match(v.actionMap[36]))
+
+    # test16 and 17 now pass.
+    #     def test16(self):
+    #         self.assertRaises(SearchParseError, lambda *args: SearchCompiler('before:'))
+    #     def test17(self):
+    #         self.assertRaises(SearchParseError, lambda *args: SearchCompiler('after:yesterday before:lalala'))
+    def test18(self):
+        self.assertEquals(TimeSearchStmt('   13 apr 2006  ').date,
+                          TimeSearchStmt(' 13 apr 2006   ').date)
+    def test19(self):
+        self.assertEquals(SearchCompiler('before:13 apr 2006 12:34:56').searchStmt.matchList[0].date,
+                          BeforeSearchStmt('13 apr 2006 12:34:56').date)
+    def test20(self):
+        self.assertEquals(SearchCompiler('after:yesterday').searchStmt.matchList[0].date,
+                          SearchCompiler('before:yesterday').searchStmt.matchList[0].date)
+    def test21(self):
+        self.assertEquals(SearchCompiler('after:today').searchStmt.matchList[0].date,
+                          SearchCompiler('before:today').searchStmt.matchList[0].date)
+    def test22(self):
+        self.assertEquals(SearchCompiler('before:today').searchStmt.matchList[0].date,
+                          SearchCompiler('before:this day').searchStmt.matchList[0].date)
+    def test23(self):
+        t = time.localtime()
+        import vistrails.core.utils
+        inv = vistrails.core.utils.invert(TimeSearchStmt.months)
+        m = inv[t[1]]
+        self.assertEquals(SearchCompiler('after:%s %s %s' % (t[0], m, t[2])).searchStmt.matchList[0].date,
+                          SearchCompiler('after:today').searchStmt.matchList[0].date)
+    def test24(self):
+        # Test compiling these searches
+        SearchCompiler('before')
+        SearchCompiler('after')
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/collection/test.db b/vistrails/core/collection/test.db
new file mode 100644
index 0000000..014d757
Binary files /dev/null and b/vistrails/core/collection/test.db differ
diff --git a/vistrails/core/collection/thumbnail.py b/vistrails/core/collection/thumbnail.py
new file mode 100644
index 0000000..4134dc8
--- /dev/null
+++ b/vistrails/core/collection/thumbnail.py
@@ -0,0 +1,72 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import stat
+from time import localtime
+from datetime import datetime
+from vistrails.core.thumbnails import ThumbnailCache
+
+from entity import Entity
+
+class ThumbnailEntity(Entity):
+    type_id = 4
+
+    def __init__(self, thumbnail=None):
+        Entity.__init__(self)
+        self.id = None
+        self.update(thumbnail)
+
+    @staticmethod
+    def load(*args):
+        entity = ThumbnailEntity()
+        Entity.load(entity, *args)
+        return entity
+
+    def update(self, thumbnail):
+        self.thumbnail = thumbnail
+        if self.thumbnail is not None:
+            # store in cache if not already there
+            cache = ThumbnailCache.getInstance()
+            cache._copy_thumbnails([thumbnail])
+            self.name = os.path.basename(thumbnail)
+            statinfo = os.stat(self.thumbnail)
+            self.user = statinfo[stat.ST_UID]
+            self.size = statinfo[stat.ST_SIZE]
+            time = datetime(*localtime(statinfo[stat.ST_MTIME])[:6]).strftime('%d %b %Y %H:%M:%S')
+            self.mod_time = ''
+            self.create_time = time
+            self.description = ""
+            self.url = 'test'
+            self.was_updated = True
diff --git a/vistrails/core/collection/vistrail.py b/vistrails/core/collection/vistrail.py
new file mode 100644
index 0000000..38c48a7
--- /dev/null
+++ b/vistrails/core/collection/vistrail.py
@@ -0,0 +1,526 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import locale
+import sys
+
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core import debug
+from vistrails.core.query import extract_text
+import vistrails.core.system
+from vistrails.core.db.locator import BaseLocator
+
+from entity import Entity
+from workflow import WorkflowEntity
+from workflow_exec import WorkflowExecEntity
+from thumbnail import ThumbnailEntity
+from mashup import MashupEntity
+from vistrails.core.collection.parameter_exploration import ParameterExplorationEntity
+
+class VistrailEntity(Entity):
+    type_id = 1
+
+    def __init__(self, vistrail=None):
+        Entity.__init__(self)
+        self.id = None
+        self.wf_entity_map = {}
+        self.mshp_entity_map = {}
+        self.pe_entity_map = {}
+        self.wf_exec_entity_map = {}
+        self._vt_tag_map = {}
+        self._mshp_tag_map = {}
+        # self._last_wf_exec_id = None
+        self.reload(vistrail)
+
+    @staticmethod
+    def load(*args):
+        entity = VistrailEntity()
+        Entity.load(entity, *args)
+        return entity
+    
+    def create_workflow_entity(self, workflow, action):
+        entity = WorkflowEntity(workflow)
+        self.children.append(entity)
+        entity.parent = self
+        if self.vistrail.has_notes(action.id):
+            plain_notes = extract_text(self.vistrail.get_notes(action.id))
+            entity.description = plain_notes
+        else:
+            entity.description = ''
+        entity.user = action.user
+        entity.mod_time = action.date
+        entity.create_time = action.date
+        locator = BaseLocator.from_url(self.url)
+        locator.kwargs['version_node'] = action.id
+        entity.url = locator.to_url()
+        return entity
+    
+    def create_mashup_entity(self, trail_id, mashup, action):
+        entity = MashupEntity(mashup)
+        self.children.append(entity)
+        entity.parent = self
+        vt_version = mashup.version
+        if self.vistrail.has_notes(vt_version):
+            plain_notes = extract_text(self.vistrail.get_notes(vt_version))
+            entity.description = plain_notes
+        else:
+            entity.description = ''
+        entity.user = action.user
+        entity.mod_time = action.date
+        entity.create_time = action.date
+        locator = BaseLocator.from_url(self.url)
+        locator.kwargs['mashuptrail'] = trail_id
+        locator.kwargs['mashup'] = action.id
+        entity.url = locator.to_url()
+        return entity
+
+    def create_parameter_exploration_entity(self, pe):
+        entity = ParameterExplorationEntity(pe)
+        self.children.append(entity)
+        entity.parent = self
+        entity.name = pe.name
+        if pe.name:
+            entity.name = pe.name
+        else:
+            # find logical name using vistrail tag
+            entity.name = "Latest for " + \
+                          self.vistrail.get_pipeline_name(pe.action_id)
+        locator = BaseLocator.from_url(self.url)
+        locator.kwargs['parameterExploration'] = pe.id
+        entity.url = locator.to_url()
+        return entity
+
+    def create_wf_exec_entity(self, wf_exec, wf_entity):
+        entity = WorkflowExecEntity(wf_exec)
+        wf_entity.children.append(entity)
+        entity.parent = wf_entity
+        locator = BaseLocator.from_url(self.url)
+        locator.kwargs['workflow_exec'] = entity.name
+        entity.url = locator.to_url()
+        return entity
+
+    def get_vistrail_info(self, vistrail=None):
+        if vistrail is None:
+            vistrail = self.vistrail
+        name = None
+        if vistrail.locator:
+            name = vistrail.locator.short_name
+        if name is None:
+            if vistrail.db_name:
+                name = vistrail.db_name
+            else:
+                name = u"untitled"
+            
+        size = vistrail.get_version_count()
+        if size < 1:
+            # empty vistrail
+            user = vistrails.core.system.current_user()
+            mod_time = vistrails.core.system.current_time()
+            create_time = vistrails.core.system.current_time()
+        else:
+            latestVersionId = vistrail.get_latest_version()
+            latestVersion = vistrail.actionMap[latestVersionId]
+            user = latestVersion.user
+            mod_time = latestVersion.date
+            # FIXME: relies on 1 being the first version...
+            firstVersion = vistrail.actionMap[1] \
+                if 1 in vistrail.actionMap else latestVersion
+            create_time = firstVersion.date
+        url = vistrail.locator.to_url() if vistrail.locator else "untitled:"
+        return (name, size, user, mod_time, create_time, url)
+
+    def set_vistrail(self, vistrail):
+        self.vistrail = vistrail
+
+        (self.name, self.size, self.user, self.mod_time, self.create_time, \
+             self.url) = self.get_vistrail_info()
+        self.description = ""
+        self.was_updated = True
+
+    def add_workflow_entity(self, version_id):
+        if version_id not in self.vistrail.actionMap:
+            return
+        action = self.vistrail.actionMap[version_id]
+        tag = None
+        if self.vistrail.has_tag(version_id):
+            tag = self.vistrail.get_tag(version_id)
+        try:
+            workflow = self.vistrail.getPipeline(version_id)
+        except:
+            import traceback
+            debug.critical("Failed to construct pipeline '%s'" % 
+                               (tag if tag else version_id),
+                           traceback.format_exc())
+            workflow = self.vistrail.getPipeline(0)
+        if tag:
+            workflow.name = tag
+        # if workflow already exists, we want to update it...
+        # spin through self.children and look for matching
+        # workflow entity?
+        # self.children.append(WorkflowEntity(workflow))
+        self.wf_entity_map[version_id] = \
+            self.create_workflow_entity(workflow, action)
+
+        # get thumbnail
+        thumbnail = self.vistrail.get_thumbnail(version_id)
+        if thumbnail is not None:
+            cache = ThumbnailCache.getInstance()
+            path = cache.get_abs_name_entry(thumbnail)
+            if path:
+                entity = ThumbnailEntity(path)
+                self.wf_entity_map[action.id].children.append(entity)
+                entity.parent = self.wf_entity_map[action.id]
+        return self.wf_entity_map[version_id]
+
+    def add_mashup_entity(self, mashuptrail, version_id, tag=None):
+        if not hasattr(self.vistrail, 'mashups'):
+            return
+        if mashuptrail not in self.vistrail.mashups:
+            return
+        action = mashuptrail.actionMap[version_id]
+        mashup = mashuptrail.getMashup(version_id)
+        if tag:
+            mashup.name = tag
+        mashup.id = action.id
+        entity_key = (mashuptrail.id,version_id)
+        self.mshp_entity_map[entity_key] = \
+                   self.create_mashup_entity(mashuptrail.id, mashup, action)
+        # get thumbnail for the workflow it points
+        thumb_version = mashuptrail.vtVersion
+        thumbnail = self.vistrail.get_thumbnail(thumb_version)
+        if thumbnail is not None:
+            cache = ThumbnailCache.getInstance()
+            path = cache.get_abs_name_entry(thumbnail)
+            if path:
+                entity = ThumbnailEntity(path)
+                mshp_entity = self.mshp_entity_map[entity_key]
+                mshp_entity.children.append(entity)
+                entity.parent = mshp_entity
+        return self.mshp_entity_map[entity_key]
+
+    def add_parameter_exploration_entity(self, pe):
+        if not hasattr(self.vistrail, 'parameter_explorations'):
+            return
+        self.pe_entity_map[pe.name] = \
+                   self.create_parameter_exploration_entity(pe)
+        # get thumbnail for the workflow it points
+        thumbnail = self.vistrail.get_thumbnail(pe.action_id)
+        if thumbnail is not None:
+            cache = ThumbnailCache.getInstance()
+            path = cache.get_abs_name_entry(thumbnail)
+            if path:
+                entity = ThumbnailEntity(path)
+                pe_entity = self.pe_entity_map[pe.name]
+                pe_entity.children.append(entity)
+                entity.parent = self
+        return self.pe_entity_map[pe.name]
+       
+    def add_wf_exec_entity(self, wf_exec, add_to_map=False):
+        version_id = wf_exec.parent_version
+        is_new = False
+        if version_id not in self.wf_entity_map:
+            is_new = True
+            # FIXME add new workflow entity for this version
+            if version_id not in self.vistrail.actionMap:
+                raise LookupError("Version %d does not occur in vistrail." %
+                                  version_id)
+            action = self.vistrail.actionMap[version_id]
+            try:
+                workflow = self.vistrail.getPipeline(version_id)
+            except:
+                import traceback
+                if self.vistrail.has_tag(version_id):
+                    tag_str = self.vistrail.get_tag(version_id)
+                else:
+                    tag_str = str(version_id)
+                debug.critical("Failed to construct pipeline '%s'" % tag_str,
+                               traceback.format_exc())
+                workflow = self.vistrail.getPipeline(0)
+            wf_entity = self.create_workflow_entity(workflow, action)
+            self.wf_entity_map[version_id] = wf_entity
+        else:
+            wf_entity = self.wf_entity_map[version_id]
+
+        entity = self.create_wf_exec_entity(wf_exec, wf_entity)
+        if add_to_map:
+            self.wf_exec_entity_map[wf_exec.id] = entity
+        if is_new:
+            return (entity, wf_entity)
+        return (entity, None)
+                        
+    def add_mashup_entities_from_mashuptrail(self, mashuptrail):
+        added_entry_keys = set()
+        inv_tag_map = {}
+        tagMap = mashuptrail.getTagMap()
+        tags = tagMap.keys()
+        if len(tags) > 0:
+            tags.sort()
+            for tag in tags:
+                version_id = tagMap[tag]
+                inv_tag_map[version_id] = tag
+                action = mashuptrail.actionMap[version_id]
+                mashup = mashuptrail.getMashup(version_id)
+                mashup.name = tag
+                #make sure we identify a mashup by its version
+                mashup.id = action.id
+                entity_key = (mashuptrail.id,version_id)
+                self.mshp_entity_map[entity_key] = \
+                   self.create_mashup_entity(mashuptrail.id, mashup, action)
+                added_entry_keys.add(entity_key)
+                # get thumbnail for the workflow it points
+                thumb_version = mashuptrail.vtVersion
+                thumbnail = self.vistrail.get_thumbnail(thumb_version)
+                if thumbnail is not None:
+                    cache = ThumbnailCache.getInstance()
+                    path = cache.get_abs_name_entry(thumbnail)
+                    if path:
+                        entity = ThumbnailEntity(path)
+                        mshp_entity = self.mshp_entity_map[entity_key]
+                        mshp_entity.children.append(entity)
+                        entity.parent = mshp_entity
+        return inv_tag_map
+
+    def reload(self, vistrail):
+        if vistrail is not None:
+            self.set_vistrail(vistrail)
+
+            for version_id in self.vistrail.get_tagMap():
+                self.add_workflow_entity(version_id)
+            
+            #mashups
+            if hasattr(self.vistrail, 'mashups'):
+                self._mshp_tag_map = {}
+                for mashuptrail in self.vistrail.mashups:
+                    self._mshp_tag_map[mashuptrail.id] = \
+                         self.add_mashup_entities_from_mashuptrail(mashuptrail)
+
+            #parameter explorations
+            if hasattr(self.vistrail, 'parameter_explorations'):
+                self.pe_entity_map = {}
+                # find named pe's
+                #max_pe = {}
+                for pe in self.vistrail.parameter_explorations:
+                    if pe.name:
+                        self.pe_entity_map[pe.name] = \
+                             self.add_parameter_exploration_entity(pe)
+                #    if pe.action_id not in max_pe or max_pe[pe.action_id]<pe.id:
+                #        max_pe[pe.action_id] = pe
+
+                #for pe in max_pe.values():
+                #    if pe.id not in self.pe_entity_map:
+                #        self.pe_entity_map[pe.id] = \
+                #             self.add_parameter_exploration_entity(pe)
+                
+            # read persisted log entries
+            try:
+                log = vistrail.get_persisted_log()
+            except:
+                import traceback
+                debug.critical("Failed to read log", traceback.format_exc())
+                
+            if log is not None:
+                for wf_exec in log.workflow_execs:
+                    self.add_wf_exec_entity(wf_exec, False)
+
+            # read unpersisted log entries
+            if vistrail.log is not None:
+                for wf_exec in self.vistrail.log.workflow_execs:
+                    self.add_wf_exec_entity(wf_exec, True)
+
+            self._vt_tag_map = copy.copy(self.vistrail.get_tagMap())
+                      
+    def update_vistrail(self, vistrail):
+        # like set_vistrail but checks everything!
+
+        (name, size, user, mod_time, create_time, url) = \
+            self.get_vistrail_info(vistrail)
+
+        was_updated = False
+        new_entity = False
+        if name != self.name:
+            # self.name = name
+            new_entity = True
+        if size != self.size:
+            self.size = size
+            was_updated = True
+        if user != self.user:
+            self.user = user
+            was_updated = True
+        if mod_time != self.mod_time:
+            self.mod_time = mod_time
+            was_updated = True
+        if create_time != self.create_time:
+            self.create_time = create_time
+            was_updated = True
+        if url != self.url:
+            # self.url = url
+            new_entity = True
+
+        # if we need a new entity, just return, don't update old one
+        if new_entity:
+            return (True, was_updated)
+ 
+        self.vistrail = vistrail
+        self.vistrail.was_updated = was_updated
+        return (False, was_updated)
+
+    def update_workflows(self):
+        # here we just need to check for changes in tags
+        added_tags = []
+        deleted_tags = []
+        for version_id, tag in self.vistrail.get_tagMap().iteritems():
+            if version_id not in self._vt_tag_map:
+                added_tags.append(self.add_workflow_entity(version_id))
+            elif tag != self._vt_tag_map[version_id]:
+                deleted_tags.append(self.wf_entity_map[version_id])
+                added_tags.append(self.add_workflow_entity(version_id))
+        for version_id, tag in self._vt_tag_map.iteritems():
+            if version_id not in self.vistrail.get_tagMap():
+                deleted_tags.append(self.wf_entity_map[version_id])
+                del self.wf_entity_map[version_id]
+        self._vt_tag_map = copy.copy(self.vistrail.get_tagMap())
+        return (added_tags, deleted_tags)
+
+    def update_log(self):
+        # only need to check non-persisted wf_execs since log is immutable
+        # if vistrail.log.get_last_workflow_exec_id() == self._last_wf_exec_id:
+        #     return []
+        added_workflows = []
+        added_wf_execs = []
+        for wf_exec in self.vistrail.log.workflow_execs:
+            if wf_exec.id not in self.wf_exec_entity_map:
+                (exec_entity, wf_entity) = \
+                    self.add_wf_exec_entity(wf_exec, True)
+                if wf_entity is not None:
+                    added_workflows.append(wf_entity)
+                added_wf_execs.append(exec_entity)
+        return (added_workflows, added_wf_execs)
+
+    def update_mashups(self):
+        added_mashups = []
+        deleted_mashups = []
+        if hasattr(self.vistrail, 'mashups'):
+            for mashuptrail in self.vistrail.mashups:
+                if mashuptrail.id not in self._mshp_tag_map:
+                    self._mshp_tag_map[mashuptrail.id] = {}
+                mashup_tag_map = self._mshp_tag_map[mashuptrail.id]
+                tagMap = mashuptrail.getTagMap()
+                #mashups tag map is inverted map[tag] -> version
+                new_mshp_map = {}
+                for tag, version_id in tagMap.iteritems():
+                    new_mshp_map[version_id] = tag
+                    if version_id not in mashup_tag_map:
+                        added_mashups.append(self.add_mashup_entity(mashuptrail, version_id, tag))
+                    elif tag != mashup_tag_map[version_id]:
+                        deleted_mashups.append(self.mshp_entity_map[(mashuptrail.id,
+                                                                     version_id)])
+                        added_mashups.append(self.add_mashup_entity(mashuptrail, version_id, tag))
+                for version_id, tag in mashup_tag_map.iteritems():
+                    if version_id not in tagMap.values():
+                        deleted_mashups.append(self.mshp_entity_map[(mashuptrail.id,
+                                                                     version_id)])
+                        del self.mshp_entity_map[(mashuptrail.id, version_id)]
+                self._mshp_tag_map[mashuptrail.id] = new_mshp_map
+        return (added_mashups, deleted_mashups)
+
+    def update_parameter_explorations(self):
+        # Check for new or deleted pe:s by id
+        added_pes = []
+        deleted_pes = []
+        if hasattr(self.vistrail, 'parameter_explorations'):
+            for pe in self.vistrail.parameter_explorations:
+                if pe.name and pe.name not in self.pe_entity_map:
+                    added_pes.append(self.add_parameter_exploration_entity(pe))
+            for pe_name in self.pe_entity_map.keys():
+                if not self.vistrail.has_named_paramexp(pe_name):
+                    deleted_pes.append(self.pe_entity_map[pe_name])
+                    del self.pe_entity_map[pe_name]
+        return (added_pes, deleted_pes)
+                
+#        for key, mashup in self.mshp_entity_map.iteritems():
+#            deleted_mashups.append(mashup)
+#        self.mshp_entity_map = {}
+#
+#        if hasattr(self.vistrail, 'mashups'):
+#            for mashuptrail in self.vistrail.mashups:
+#                self.mshp_entity_map.update(
+#                    self.add_mashup_entities_from_mashuptrail(mashuptrail))
+#        for key, mashup in self.mshp_entity_map.iteritems():
+#            added_mashups.append(mashup)
+#        return (added_mashups, deleted_mashups)
+                
+#     # returns string
+#     def get_name(self):
+#         return self.vistrail.name
+    
+#     # returns datetime
+#     def get_mod_time(self):
+#         return self.vistrail.get_most_recent_action().py_date
+
+#     # returns datetime
+#     def get_create_time(self):
+#         return self.vistrail.get_first_action().py_date
+    
+#     # returns string
+#     # FIXME: perhaps this should be a User object at some point
+#     def get_user(self):
+#         return self.vistrail.get_most_recent_action().py_date
+    
+#     # returns tuple (<entity_type>, <entity_id>)
+#     def get_id(self):
+#         return (self.vistrail.vtType, self.vistrail.id)
+
+#     # returns integer
+#     def get_size(self):
+#         return len(self.vistrail.actionMap)
+    
+#     # returns possibly empty list of Entity objects
+#     def get_children(self):
+#         return len(self.vistrail.tagMap)
+
+#     # returns list of strings representing paths
+#     # FIXME: should this be urls for database access?
+#     def get_image_fnames(self):
+#         return []
+    
+    # returns boolean, True if search input is satisfied else False
+    def match(self, search):
+        # try match on self
+        
+
+        # if no match on self, check for a match on all children
+        for child in self.get_children():
+            if child.match(search):
+                return True
diff --git a/vistrails/core/collection/workflow.py b/vistrails/core/collection/workflow.py
new file mode 100644
index 0000000..a5c339f
--- /dev/null
+++ b/vistrails/core/collection/workflow.py
@@ -0,0 +1,109 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from entity import Entity
+
+class WorkflowEntity(Entity):
+    type_id = 2
+
+    def __init__(self, workflow=None):
+        Entity.__init__(self)
+        self.id = None
+        self.update(workflow)
+
+    @staticmethod
+    def load(*args):
+        entity = WorkflowEntity()
+        Entity.load(entity, *args)
+        return entity
+
+    def update(self, workflow):
+        self.workflow = workflow
+        if self.workflow is not None:
+            self.name = workflow.name \
+            if workflow.name else "Version #" + str(workflow.id)
+            self.user = 'testing'
+            self.mod_time = 'test'
+            self.create_time = 'test'
+            self.size = len(self.workflow.modules)
+            self.description = ""
+            self.url = 'test'
+            self.was_updated = True
+
+#             self.name = self.workflow.name
+#             self.user = self.workflow.user
+#             self.mod_time = self.workflow.py_date
+#             self.create_time = self.workflow.py_date
+#             self.size = len(self.workflow.modules)
+#             self.description = self.workflow.notes
+#             self.was_updated = True
+        
+#     # returns string
+#     def get_name(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_mod_time(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns datetime
+#     def get_create_time(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns string
+#     # FIXME: perhaps this should be a User object at some point
+#     def get_user(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns tuple (<entity_type>, <entity_id>)
+#     def get_id(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns integer
+#     def get_size(self):
+#         raise RuntimeError("Method is abstract")
+    
+#     # returns possibly empty list of Entity objects
+#     def get_children(self):
+#         raise RuntimeError("Method is abstract")
+
+#     # returns list of strings representing paths
+#     # FIXME: should this be uris for database access?
+#     def get_image_fnames(self):
+#         raise RuntimeError("Method is abstract")
+    
+    # returns boolean, True if search input is satisfied else False
+    def match(self, search):
+        raise RuntimeError("Not implemented")
+
diff --git a/vistrails/core/collection/workflow_exec.py b/vistrails/core/collection/workflow_exec.py
new file mode 100644
index 0000000..f3fef3e
--- /dev/null
+++ b/vistrails/core/collection/workflow_exec.py
@@ -0,0 +1,70 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from entity import Entity
+
+class WorkflowExecEntity(Entity):
+    type_id = 3
+
+    def __init__(self, workflow_exec=None):
+        Entity.__init__(self)
+        self.id = None
+        self.update(workflow_exec)
+
+    @staticmethod
+    def load(*args):
+        entity = WorkflowExecEntity()
+        Entity.load(entity, *args)
+        return entity
+
+    def update(self, workflow_exec):
+        self.workflow_exec = workflow_exec
+        if self.workflow_exec is not None:
+            self.name = "%s" % self.workflow_exec.db_ts_start
+            self.user = self.workflow_exec.user
+            self.mod_time = \
+                self.workflow_exec.ts_end.strftime('%d %b %Y %H:%M:%S') \
+                if self.workflow_exec.ts_end else '1 Jan 0000 00:00:00'
+            self.create_time = \
+                self.workflow_exec.ts_start.strftime('%d %b %Y %H:%M:%S') \
+                if self.workflow_exec.ts_start else '1 Jan 0000 00:00:00'
+            self.size = len(self.workflow_exec.item_execs)
+            self.description = ""
+            self.url = 'test'
+            self.was_updated = True
+        
+    # returns boolean, True if search input is satisfied else False
+    def match(self, search):
+        raise NotImplementedError
+
diff --git a/vistrails/core/command_line.py b/vistrails/core/command_line.py
new file mode 100644
index 0000000..386791f
--- /dev/null
+++ b/vistrails/core/command_line.py
@@ -0,0 +1,101 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Very thin convenience wrapper around optparse.OptionParser."""
+
+import optparse
+import sys
+
+class CommandLineParserSingleton(object):
+    """CommandLineParser is a very thin wrapper around
+    optparse.OptionParser to make easier the parsing of command line
+    parameters."""
+    def __call__(self):
+        return self
+    
+    def __init__(self):
+        self.parser = optparse.OptionParser()
+        self.options_were_read = False
+        self.args = []
+
+    def init_options(self,args=None):
+        """self.init_options(args: [string]) -> None. Initialize option dictionary,
+        by parsing command line arguments according to the options set
+        by previous add_option calls.
+
+        Few programs should call this. Call self.parse_options() unless
+        you know what you're doing."""
+        if args is None:
+            if hasattr(sys, "argv"):
+                args = sys.argv[1:]
+            else:
+                args = []
+        (self.options, self.args) = self.parser.parse_args(args)
+        self.options_were_read = True
+
+    def add_option(self, *args, **kwargs):
+        """self.add_option(*args, **kwargs) -> None. Adds a new option
+        to the command line parser. Behaves identically to the
+        optparse.OptionParser.add_option."""
+        self.parser.add_option(*args, **kwargs)
+
+    def get_option(self, key):
+        """self.get_option(key) -> value. Returns a value corresponding
+        to the given key that was parsed from the command line. Throws
+        AttributeError if key is not present."""
+        self.parse_options()
+        return getattr(self.options, key)
+
+    def parse_options(self,args=None):
+        """self.parse_options() -> None. Parse command line arguments,
+        according to the options set by previous add_option calls."""
+        if not self.options_were_read:
+            self.init_options(args)
+
+    def get_arg(self,number):
+        """self.get_arg(number) -> value. Returns the value corresponding
+        to the argument at position number from the command line. Returns 
+        None if number is greater or equal the number of arguments. """
+        if len(self.args) > number:
+            return self.args[number]
+        else:
+            return None 
+
+    def positional_arguments(self):
+        """positional_arguments() -> [string]. Returns a list of strings
+        representing the positional arguments in the command line."""
+        return self.args
+
+# singleton trick
+CommandLineParser = CommandLineParserSingleton()
diff --git a/vistrails/core/common.py b/vistrails/core/common.py
new file mode 100644
index 0000000..8ff715b
--- /dev/null
+++ b/vistrails/core/common.py
@@ -0,0 +1,43 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.utils import \
+     InstanceObject, \
+     lock_method, \
+     enum, \
+     trace_method_args, trace_method_args, bump_trace, report_stack, \
+     memo_method, \
+     all, any, \
+     eprint, \
+     VistrailsInternalError
diff --git a/vistrails/core/configuration.py b/vistrails/core/configuration.py
new file mode 100644
index 0000000..1c928a1
--- /dev/null
+++ b/vistrails/core/configuration.py
@@ -0,0 +1,358 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Configuration variables for controlling specific things in VisTrails."""
+import copy
+import os.path
+import shutil
+import sys
+import tempfile
+import weakref
+
+from vistrails.core import debug
+from vistrails.core import system
+from vistrails.core.utils import (InstanceObject, Ref, append_to_dict_of_lists,
+                        VistrailsInternalError)
+from vistrails.core.utils.uxml import (named_elements,
+                             elements_filter, eval_xml_value,
+                             quote_xml_value)
+
+##############################################################################
+
+class ConfigurationObject(InstanceObject):
+    """A ConfigurationObject is an InstanceObject that respects the
+    following convention: values that are not 'present' in the object
+    should have value (None, type), where type is the type of the
+    expected object.
+
+    ConfigurationObject exists so that the GUI can automatically infer
+    the right types for the widgets.
+
+    """
+
+    def __init__(self, *args, **kwargs):
+        InstanceObject.__init__(self, *args, **kwargs)
+        self.__subscribers__ = {}
+   
+    def __setattr__(self, name, value):
+        object.__setattr__(self, name, value)
+        if name == '__subscribers__':
+            return
+        if name in self.__subscribers__:
+            to_remove = []
+            for subscriber in self.__subscribers__[name]:
+                obj = subscriber()
+                if obj:
+                    obj(name, value)
+                else:
+                    to_remove.append(obj)
+            for ref in to_remove:
+                self.__subscribers__[name].remove(ref)
+
+    def unsubscribe(self, field, callable_):
+        """unsubscribe(field, callable_): remove observer from subject
+        """
+        self.__subscribers__[field].remove(weakref.ref(callable_))
+        
+    def subscribe(self, field, callable_):
+        """subscribe(field, callable_): call observer callable_ when
+        self.field is set.
+        """
+        append_to_dict_of_lists(self.__subscribers__, field,
+                                Ref(callable_))
+                  
+    def has(self, key):
+        """has(key) -> bool.
+
+        Returns true if key has valid value in the object.
+        """
+        
+        if not hasattr(self, key):
+            return False
+        v = getattr(self, key)
+        if isinstance(v, tuple) and v[0] is None and isinstance(v[1], type):
+            return False
+        return True
+
+    def check(self, key):
+        """check(key) -> obj
+
+        Returns False if key is absent in object, and returns object
+        otherwise.
+        """
+        
+        return self.has(key) and getattr(self, key)
+
+    def allkeys(self):
+        """allkeys() -> list of strings
+
+        Returns all options stored in this object.
+        """
+        
+        return self.__dict__.keys()
+
+    def keys(self):
+        """keys(self) -> list of strings
+        Returns all public options stored in this object.
+        Public options are keys that do not start with a _
+        """
+        return [k for k in self.__dict__.keys() if not k.startswith('_')]
+    
+    def write_to_dom(self, dom, element):
+        conf_element = dom.createElement('configuration')
+        element.appendChild(conf_element)
+        for (key, value) in self.__dict__.iteritems():
+            if key == '__subscribers__':
+                continue
+            key_element = dom.createElement('key')
+            key_element.setAttribute('name', key)
+            if isinstance(value, (int, long, basestring, bool, float)):
+                conf_element.appendChild(key_element)
+                value_element = quote_xml_value(dom, value)
+                key_element.appendChild(value_element)
+            elif isinstance(value, tuple):
+                pass
+            else:
+                assert isinstance(value, ConfigurationObject)
+                conf_element.appendChild(key_element)
+                value.write_to_dom(dom, key_element)
+
+    def set_from_dom_node(self, node):
+        assert str(node.nodeName) == 'configuration'
+        for key in elements_filter(node, lambda node: node.nodeName == 'key'):
+            key_name = str(key.attributes['name'].value)
+            value = [x for x in
+                     elements_filter(key, lambda node: node.nodeName in
+                                    ['unicode', 'bool', 'str', 'int', 'float', 'configuration'])][0]
+            value_type = value.nodeName
+            if value_type == 'configuration':
+                if hasattr(self,key_name):
+                    getattr(self, key_name).set_from_dom_node(value)
+            elif value_type in ['bool', 'str', 'int', 'float']:
+                setattr(self, key_name, eval_xml_value(value))
+        
+
+    def __copy__(self):
+        result = ConfigurationObject()
+        for (key, value) in self.__dict__.iteritems():
+            setattr(result, key, copy.copy(value))
+        return result
+
+def default():
+    """ default() -> ConfigurationObject
+    Returns the default configuration of VisTrails
+    
+    """
+
+    base_dir = {
+        'abstractionsDirectory': (None, str),
+        'alwaysShowDebugPopup': False,
+        'autoConnect': True,
+        'autosave': True,
+        'dataDirectory': (None, str),
+        'dbDefault': False,
+#        'debugSignals': False,
+        'defaultFileType':system.vistrails_default_file_type(),
+        'detachHistoryView': False,
+        'dotVistrails': system.default_dot_vistrails(),
+        'enablePackagesSilently': False,
+        'errorOnConnectionTypeerror': False,
+        'errorOnVariantTypeerror': True,
+        'executeWorkflows': False,
+        'fileDirectory': (None, str),
+#        'evolutionGraph': (None, str),
+        'handlerDontAsk': False,
+        'installBundles': True,
+        'installBundlesWithPip': False,
+        'interactiveMode': True,
+        'logFile': (None, str),
+        'logger': default_logger(),
+        'maxMemory': (None, int),
+        'maximizeWindows': False,
+        'maxRecentVistrails': 5,
+        'migrateTags': False,
+        'minMemory': (None, int),
+        'multiHeads': False,
+        'nologger': True,
+        'nologfile': False,
+        'packageDirectory': (None, str),
+        'pythonPrompt': False,
+        'recentVistrailList': (None, str),
+        'repositoryLocalPath': (None, str),
+        'repositoryHTTPURL': "http://www.vistrails.org/packages",
+        'reviewMode': False,
+        'rootDirectory': (None, str),
+        'runningJobsList': (None, str),
+        'shell': default_shell(),
+        'showHistoryViewOnLoad': False,
+        'showPipelineViewOnLoad': False,
+        'showScrollbars': True,
+        'showMovies': True,
+        'showSplash': True,
+        'showSpreadsheetOnly': False,
+        'singleInstance': True,
+        'spawned': False,
+        'spreadsheetDumpCells': (None, str),
+        'spreadsheetDumpPDF': False,
+        'staticRegistry': (None, str),
+        'stopOnError': True,
+        'temporaryDirectory': (None, str),
+        'thumbs': default_thumbs(),
+        'upgradeOn': True,
+        'upgradeDelay': True,
+        'upgradeModuleFailPrompt': True,
+        'useCache': True,
+        'userPackageDirectory': (None, str),
+        'verbosenessLevel': (None, int),
+#        'workflowGraph': (None, str),
+#        'workflowInfo': (None, str),
+        'webRepositoryLogin': (None, str),
+        'webRepositoryURL': "http://www.crowdlabs.org",
+        'isInServerMode': False,
+        }
+    specific_dir = add_specific_config(base_dir)
+    return ConfigurationObject(**specific_dir)
+
+def default_logger():
+    """default_logger() -> ConfigurationObject
+    Returns the default configuration for the VisTrails logger
+    
+    """
+    logger_dir = {
+        'dbHost': '',
+        'dbName': '',
+        'dbPasswd': '',
+        'dbPort': 0,
+        'dbUser': '',
+        }
+    return ConfigurationObject(**logger_dir)
+
+def default_shell():
+    """default_shell() -> ConfigurationObject
+    Returns the default configuration for the VisTrails shell
+    
+    """
+    if system.systemType == 'Linux':
+        shell_dir = {
+            'font_face': 'Fixed',
+            'font_size': 12,
+            }
+    elif system.systemType in ['Windows', 'Microsoft']:
+        shell_dir = {
+            'font_face': 'Courier New',
+            'font_size': 8,
+            }
+    elif system.systemType == 'Darwin':
+        shell_dir = {
+            'font_face': 'Monaco',
+            'font_size': 12,
+            }
+    else:
+        raise VistrailsInternalError('system type not recognized')
+    return ConfigurationObject(**shell_dir)
+
+def default_thumbs():
+    """default_thumbs() -> ConfigurationObject
+    Returns the default configuration for VisTrails Pipelines Thumbnails    
+    """
+    thumbs_dir = {
+                  'autoSave': True,
+                  'cacheDirectory': (None, str),
+                  'cacheSize': 20,
+                  'mouseHover': False,
+                  'tagsOnly': False,
+                }
+    return ConfigurationObject(**thumbs_dir)
+
+def add_specific_config(base_dir):
+     """add_specific_config() -> dict
+    Returns a dict with other specific configuration
+    to the current platform added to base_dir
+    
+    """
+     newdir = dict(base_dir)
+     if system.systemType == 'Darwin':
+         newdir['useMacBrushedMetalStyle'] = True
+         
+     return newdir
+
+def get_vistrails_persistent_configuration():
+    """get_vistrails_persistent_configuration() -> ConfigurationObject or None
+    Returns the persistent configuration of the application. It returns None if
+    configuration was not found (when running as a bogus application
+    for example.
+    Notice that this function should be use only to write configurations to
+    the user's startup.xml file. Otherwise, use get_vistrails_configuration  or
+    get_vistrails_temp_configuration.
+
+    """
+    from vistrails.core.application import get_vistrails_application
+    app = get_vistrails_application()
+    if hasattr(app, 'configuration'):
+        return app.configuration
+    else:
+        return None
+    
+def get_vistrails_configuration():
+    """get_vistrails_configuration() -> ConfigurationObject or None
+    Returns the current configuration of the application. It returns None if
+    configuration was not found (when running as a bogus application
+    for example. This configuration is the one that is used just for the
+    current session and is not persistent. To make changes persistent, 
+    use get_vistrails_persistent_configuration() instead.
+    
+    """
+    from vistrails.core.application import get_vistrails_application
+    app = get_vistrails_application()
+    if hasattr(app, 'temp_configuration'):
+        return app.temp_configuration
+    else:
+        return None
+
+def get_vistrails_temp_configuration():
+    """get_vistrails_temp_configuration() -> ConfigurationObject or None
+    Returns the temp configuration of the application. It returns None if
+    configuration was not found (when running as a bogus application
+    for example. The temp configuration is the one that is used just for the
+    current session and is not persistent. To make changes persistent, 
+    use get_vistrails_persistent_configuration() instead.
+    
+    """
+    from vistrails.core.application import get_vistrails_application
+    app = get_vistrails_application()
+    if hasattr(app, 'temp_configuration'):
+        return app.temp_configuration
+    else:
+        return None
diff --git a/vistrails/core/console_mode.py b/vistrails/core/console_mode.py
new file mode 100644
index 0000000..196218d
--- /dev/null
+++ b/vistrails/core/console_mode.py
@@ -0,0 +1,395 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" Module used when running  vistrails uninteractively """
+from __future__ import absolute_import
+import os.path
+import uuid
+from vistrails.core.application import is_running_gui
+from vistrails.core.configuration import get_vistrails_configuration
+import vistrails.core.interpreter.default
+import vistrails.core.db.io
+from vistrails.core.db.io import load_vistrail
+from vistrails.core.db.locator import XMLFileLocator, ZIPFileLocator
+from vistrails.core import debug
+from vistrails.core.utils import VistrailsInternalError, expression
+from vistrails.core.vistrail.controller import VistrailController
+from vistrails.core.vistrail.vistrail import Vistrail
+
+import vistrails.core.packagemanager
+import vistrails.core.system
+import unittest
+import vistrails.core.vistrail
+import vistrails.db
+
+################################################################################
+    
+def run_and_get_results(w_list, parameters='', workflow_info=None, 
+                        update_vistrail=True, extra_info=None, 
+                        reason='Console Mode Execution'):
+    """run_and_get_results(w_list: list of (locator, version), parameters: str,
+                           workflow_info:str, update_vistrail: boolean,
+                           extra_info:dict)
+    Run all workflows in w_list, and returns an interpreter result object.
+    version can be a tag name or a version id.
+    
+    """
+    elements = parameters.split("$&$")
+    aliases = {}
+    result = []
+    for locator, workflow in w_list:
+        (v, abstractions , thumbnails, mashups)  = load_vistrail(locator)
+        controller = VistrailController(v, locator, abstractions, thumbnails, 
+                                        mashups, auto_save=update_vistrail)
+        if isinstance(workflow, basestring):
+            version = v.get_version_number(workflow)
+        elif isinstance(workflow, (int, long)):
+            version = workflow
+        elif workflow is None:
+            version = controller.get_latest_version_in_graph()
+        else:
+            msg = "Invalid version tag or number: %s" % workflow
+            raise VistrailsInternalError(msg)
+        controller.change_selected_version(version)
+        
+        for e in elements:
+            pos = e.find("=")
+            if pos != -1:
+                key = e[:pos].strip()
+                value = e[pos+1:].strip()
+            
+                if controller.current_pipeline.has_alias(key):
+                    aliases[key] = value
+                    
+        if workflow_info is not None and controller.current_pipeline is not None:
+            # FIXME DAK: why is this always done?!? there is a flag for it...
+            if is_running_gui():
+                controller.updatePipelineScene()
+                base_fname = "%s_%s_pipeline.pdf" % (locator.short_filename, version)
+                filename = os.path.join(workflow_info, base_fname)
+                controller.current_pipeline_scene.saveToPDF(filename)
+            else:
+                debug.critical("Cannot save pipeline figure when not "
+                               "running in gui mode")
+            base_fname = "%s_%s_pipeline.xml" % (locator.short_filename, version)
+            filename = os.path.join(workflow_info, base_fname)
+            vistrails.core.db.io.save_workflow(controller.current_pipeline, filename)
+        if not update_vistrail:
+            conf = get_vistrails_configuration()
+            if conf.has('thumbs'):
+                conf.thumbs.autoSave = False
+        
+        (results, _) = \
+            controller.execute_current_workflow(custom_aliases=aliases,
+                                                extra_info=extra_info,
+                                                reason=reason)
+        new_version = controller.current_version
+        if new_version != version:
+            debug.warning("Version '%s' (%s) was upgraded. The actual "
+                          "version executed was %s" % \
+                              (workflow, version, new_version))
+        run = results[0]
+        run.workflow_info = (locator.name, new_version)
+        run.pipeline = controller.current_pipeline
+
+        if update_vistrail:
+            controller.write_vistrail(locator)
+        result.append(run)
+    return result
+
+################################################################################
+
+def get_wf_graph(w_list, workflow_info=None, pdf=False):
+    """run_and_get_results(w_list: list of (locator, version), 
+                           workflow_info:str, pdf:bool)
+    Load all workflows in wf_list and dump their graph to workflow_info.
+    
+    """
+    result = []
+    if is_running_gui():
+        from vistrails.gui.vistrail_controller import VistrailController as \
+             GUIVistrailController
+        for locator, workflow in w_list:
+            try:
+                (v, abstractions , thumbnails, mashups)  = load_vistrail(locator)
+                controller = GUIVistrailController(v, locator, abstractions, 
+                                                   thumbnails, mashups,
+                                                   auto_save=False)
+                version = None
+                if isinstance(workflow, basestring):
+                    version = v.get_version_number(workflow)
+                elif isinstance(workflow, (int, long)):
+                    version = workflow
+                elif workflow is None:
+                    version = controller.get_latest_version_in_graph()
+                else:
+                    msg = "Invalid version tag or number: %s" % workflow
+                    raise VistrailsInternalError(msg)
+            
+                if (workflow_info is not None and 
+                    controller.current_pipeline is not None):
+                    controller.updatePipelineScene()
+                    if pdf:
+                        base_fname = "%s_%s_pipeline.pdf" % \
+                                     (locator.short_filename, version)
+                        filename = os.path.join(workflow_info, base_fname)
+                        controller.current_pipeline_scene.saveToPDF(filename)
+                    else:
+                        base_fname = "%s_%s_pipeline.png" % \
+                                     (locator.short_filename, version)
+                        filename = os.path.join(workflow_info, base_fname)
+                        controller.current_pipeline_scene.saveToPNG(filename)
+                    result.append((True, ""))
+            except Exception, e:
+                result.append((False, str(e)))
+    else:
+        error_str = "Cannot save pipeline figure when not " \
+            "running in gui mode"
+        debug.critical(error_str)
+        result.append((False, error_str))
+    return result
+
+################################################################################
+
+def get_vt_graph(vt_list, tree_info, pdf=False):
+    """get_vt_graph(vt_list: list of locator, tree_info:str)
+    Load all vistrails in vt_list and dump their tree to tree_info.
+    
+    """
+    result = []
+    if is_running_gui():
+        from vistrails.gui.vistrail_controller import VistrailController as \
+             GUIVistrailController
+        for locator in vt_list:
+            try:
+                (v, abstractions , thumbnails, mashups)  = load_vistrail(locator)
+                controller = GUIVistrailController(v, locator, abstractions, 
+                                                   thumbnails, mashups)
+                if tree_info is not None:
+                        from vistrails.gui.version_view import QVersionTreeView
+                        version_view = QVersionTreeView()
+                        version_view.scene().setupScene(controller)
+                        if pdf:
+                            base_fname = "graph_%s.pdf" % locator.short_filename
+                            filename = os.path.join(tree_info, base_fname)
+                            version_view.scene().saveToPDF(filename)
+                        else:
+                            base_fname = "graph_%s.png" % locator.short_filename
+                            filename = os.path.join(tree_info, base_fname)
+                            version_view.scene().saveToPNG(filename)
+                        del version_view
+                        result.append((True, ""))
+            except Exception, e:
+                result.append((False, str(e)))
+    else:
+        error_str = "Cannot save version tree figure when not " \
+            "running in gui mode"
+        debug.critical(error_str)
+        result.append((False, error_str))
+    return result
+
+################################################################################
+
+def run(w_list, parameters='', workflow_info=None, update_vistrail=True,
+        extra_info=None, reason="Console Mode Execution"):
+    """run(w_list: list of (locator, version), parameters: str) -> boolean
+    Run all workflows in w_list, version can be a tag name or a version id.
+    Returns list of errors (empty list if there are no errors)
+    """
+    all_errors = []
+    results = run_and_get_results(w_list, parameters, workflow_info, 
+                                  update_vistrail,extra_info, reason)
+    for result in results:
+        (objs, errors, executed) = (result.objects,
+                                    result.errors, result.executed)
+        for err in sorted(errors.iteritems()):
+            all_errors.append(result.workflow_info + err)
+    return all_errors
+
+def run_parameter_exploration(locator, pe_id, extra_info = {},
+                              reason="Console Mode Parameter Exploration Execution"):
+    """run_parameter_exploration(w_list: (locator, version),
+                                 pe_id: str/int,
+                                 reason: str) -> (pe_id, [error msg])
+    Run parameter exploration in w, and returns an interpreter result object.
+    version can be a tag name or a version id.
+    
+    """
+    if is_running_gui():
+        from vistrails.gui.vistrail_controller import VistrailController as \
+             GUIVistrailController
+        try:
+            (v, abstractions , thumbnails, mashups)  = load_vistrail(locator)
+            controller = GUIVistrailController(v, locator, abstractions, 
+                                               thumbnails, mashups)
+            try:
+                pe_id = int(pe_id)
+                pe = controller.vistrail.get_paramexp(pe_id)
+            except ValueError:
+                pe = controller.vistrail.get_named_paramexp(pe_id)
+            controller.change_selected_version(pe.action_id)
+            controller.executeParameterExploration(pe, extra_info=extra_info,
+                                                   showProgress=False)
+        except Exception, e:
+            import traceback
+            return (locator, pe_id, str(e), traceback.format_exc())
+
+def run_parameter_explorations(w_list, extra_info = {},
+                       reason="Console Mode Parameter Exploration Execution"):
+    """run(w_list: list of (locator, pe_id), reason: str) -> boolean
+    For each workflow in w_list, run parameter exploration pe_id
+    version can be a tag name or a version id.
+    Returns list of errors (empty list if there are no errors)
+    """
+    all_errors = []
+    for locator, pe_id in w_list:
+        result = run_parameter_exploration(locator, pe_id, reason=reason,
+                                           extra_info=extra_info)
+        if result:
+            all_errors.append(result)
+    return all_errors
+
+def cleanup():
+    vistrails.core.interpreter.cached.CachedInterpreter.cleanup()
+
+################################################################################
+#Testing
+
+
+class TestConsoleMode(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        manager = vistrails.core.packagemanager.get_package_manager()
+        if manager.has_package('org.vistrails.vistrails.console_mode_test'):
+            return
+
+        d = {'console_mode_test': 'vistrails.tests.resources.'}
+        manager.late_enable_package('console_mode_test',d)
+
+    @classmethod
+    def tearDownClass(cls):
+        manager = vistrails.core.packagemanager.get_package_manager()
+        if manager.has_package('org.vistrails.vistrails.console_mode_test'):
+            manager.late_disable_package('console_mode_test')
+            
+    def test1(self):
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                                 '/tests/resources/dummy.xml')
+        result = run([(locator, "int chain")], update_vistrail=False)
+        self.assertEqual(len(result), 0)
+
+    def test_tuple(self):
+        from vistrails.core.vistrail.module_param import ModuleParam
+        from vistrails.core.vistrail.module_function import ModuleFunction
+        from vistrails.core.utils import DummyView
+        from vistrails.core.vistrail.module import Module
+        import vistrails.db.domain
+       
+        id_scope = vistrails.db.domain.IdScope()
+        interpreter = vistrails.core.interpreter.default.get_default_interpreter()
+        v = DummyView()
+        p = vistrails.core.vistrail.pipeline.Pipeline()
+        params = [ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                              pos=0,
+                              type='Float',
+                              val='2.0',
+                              ),
+                  ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                              pos=1,
+                              type='Float',
+                              val='2.0',
+                              )]
+        function = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                  name='input')
+        function.add_parameters(params)
+        module = Module(id=id_scope.getNewId(Module.vtType),
+                           name='TestTupleExecution',
+                           package='org.vistrails.vistrails.console_mode_test',
+                           version='0.9.1')
+        module.add_function(function)
+        
+        p.add_module(module)
+        
+        kwargs = {'locator': XMLFileLocator('foo'),
+                  'current_version': 1L,
+                  'view': v,
+                  }
+        interpreter.execute(p, **kwargs)
+
+    def test_python_source(self):
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                                 '/tests/resources/pythonsource.xml')
+        result = run([(locator,"testPortsAndFail")], update_vistrail=False)
+        self.assertEqual(len(result), 0)
+
+    def test_python_source_2(self):
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                                 '/tests/resources/pythonsource.xml')
+        result = run_and_get_results([(locator, "test_simple_success")],
+                                     update_vistrail=False)[0]
+        self.assertEquals(len(result.executed), 1)
+
+    def test_dynamic_module_error(self):
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() + 
+                                 '/tests/resources/dynamic_module_error.xml')
+        result = run([(locator, "test")], update_vistrail=False)
+        self.assertNotEqual(len(result), 0)
+
+    def test_change_parameter(self):
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() + 
+                                 '/tests/resources/test_change_vistrail.xml')
+        result = run([(locator, "v1")], update_vistrail=False)
+        self.assertEqual(len(result), 0)
+
+        result = run([(locator, "v2")], update_vistrail=False)
+        self.assertEquals(len(result), 0)
+
+    def test_ticket_73(self):
+        # Tests serializing a custom-named module to disk
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() + 
+                                 '/tests/resources/test_ticket_73.xml')
+        v = locator.load()
+
+        import tempfile
+        (fd, filename) = tempfile.mkstemp()
+        os.close(fd)
+        locator = XMLFileLocator(filename)
+        try:
+            locator.save(v)
+        finally:
+            os.remove(filename)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/data_structures/__init__.py b/vistrails/core/data_structures/__init__.py
new file mode 100644
index 0000000..210957e
--- /dev/null
+++ b/vistrails/core/data_structures/__init__.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Python package for all data structures that are used throughout
+VisTrails."""
+
+# from core.data_structures.point import Point
+# from core.data_structures.rect import Rect
+# from core.data_structures.graph import Graph
+# from core.data_structures.queue import Queue
+# from core.data_structures.stack import Stack
+# from core.data_structures.bijectivedict import Bidict
+pass
diff --git a/vistrails/core/data_structures/bijectivedict.py b/vistrails/core/data_structures/bijectivedict.py
new file mode 100644
index 0000000..617d8b5
--- /dev/null
+++ b/vistrails/core/data_structures/bijectivedict.py
@@ -0,0 +1,123 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class Bidict(dict):
+    """Subclass of mapping that automatically keeps track of the
+inverse mapping. Note: self.inverse is a simple dict, so it won't keep
+track of deletions directly to self.inverse and things like that. Use
+this for lookups ONLY!. Also, if mapping is not bijective, there's no
+guarantee the inverse mapping will be consistent (particularly in the
+presence of deletions.)"""
+
+    def __init__(self, *args, **kwargs):
+
+        dict.__init__(self, *args, **kwargs)
+        self.inverse = {}
+        for (k, v) in self.iteritems():
+            self.inverse[v] = k
+
+    def __setitem__(self, key, value):
+        dict.__setitem__(self, key, value)
+        self.inverse[value] = key
+
+    def __delitem__(self, key):
+        v = self[key]
+        dict.__delitem__(self, key)
+        # Might not be true if mapping was not bijective
+        if v in self.inverse:
+            del self.inverse[v]
+
+    def __copy__(self):
+        r = Bidict()
+        r.inverse = copy.copy(self.inverse)
+        r.update(self)
+        return r
+
+    def update(self, other):
+        try:
+            for i in other.iterkeys():
+                self[i] = other[i]
+        except:
+            for (k,v) in other:
+                self[k] = v
+
+##############################################################################
+
+import unittest
+
+class TestBidict(unittest.TestCase):
+
+    def test1(self):
+        x = Bidict()
+        for i in xrange(10):
+            x[i] = 9-i
+        for i in xrange(10):
+            self.assertEquals(x[i], 9-i)
+            self.assertEquals(x.inverse[i], 9-i)
+        del x[1]
+        self.assertRaises(KeyError, x.__getitem__, 1)
+        self.assertRaises(KeyError, x.inverse.__getitem__, 8)
+
+    def test_non_bijective(self):
+        """Tests resilience (not correctness!) under non-bijectiveness."""
+        x = Bidict()
+        x[1] = 2
+        x[3] = 2
+        del x[1]
+        del x[3]
+
+    def test_copy(self):
+        """Tests copying a Bidict."""
+        x = Bidict()
+        x[1] = 2
+        x[3] = 4
+        y = copy.copy(x)
+        assert y.inverse[4] == x.inverse[4]
+        assert y.inverse[2] == x.inverse[2]
+
+    def test_update(self):
+        """Tests if updating a bidict with a dict works"""
+        x = {1:2, 3:4}
+        y = Bidict()
+        y.update(x)
+        assert y.inverse[4] == 3
+        assert y.inverse[2] == 1
+        
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/data_structures/graph.py b/vistrails/core/data_structures/graph.py
new file mode 100644
index 0000000..68d99c3
--- /dev/null
+++ b/vistrails/core/data_structures/graph.py
@@ -0,0 +1,1135 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import math
+import random
+import copy
+
+from itertools import imap, chain, izip
+
+from vistrails.core.utils import all
+from vistrails.core.data_structures.queue import Queue
+from vistrails.core.data_structures.stack import Stack
+
+import unittest
+import random
+
+################################################################################
+# Graph
+
+class GraphException(Exception):
+    pass
+
+class Graph(object):
+    """Graph holds a graph with possible multiple edges. The
+    datastructures are all dictionary-based, so datatypes more general than ints
+    can be used. For example:
+    
+    >>> import graph
+    >>> g = graph.Graph()
+    >>> g.add_vertex('foo')
+    >>> g.add_vertex('bar')
+    >>> g.add_edge('foo', 'bar', 'edge_foo')
+    >>> g.add_edge('foo', 'bar', 'edge_bar')
+    >>> g.add_edge('bar', 'foo', 'edge_back')
+    >>> g.out_degree('foo')
+    2
+    >>> g.out_degree('bar')
+    1    
+    """
+
+    ##########################################################################
+    # Constructor
+    
+    def __init__(self):
+        """ Graph() -> Graph
+        Initialize an empty graph and return nothing
+
+        """
+        self.vertices = {}
+        self.adjacency_list = {}
+        self.inverse_adjacency_list = {}
+
+    @staticmethod
+    def map_vertices(graph, vertex_map=None, edge_map=None):
+        """ map_verices(graph: Graph, vertex_map: dict): Graph
+
+        Creates a new graph that is a mapping of vertex ids through
+        vertex_map.
+
+        """
+        result = Graph()
+        if vertex_map is None:
+            vertex_map = dict((v, v) for v in self.vertices)
+        if edge_map is None:
+            edge_map = {}
+            for vfrom, lto in graph.adjacency_list.iteritems():
+                for (vto, eid) in lto:
+                    edge_map[eid] = eid
+        result.vertices = dict((vertex_map[v], True) for v in graph.vertices)
+        for (vto, lto) in graph.adjacency_list.iteritems():
+            result.adjacency_list[vto] = [(vertex_map[to], edge_map[eid]) for (to, eid) in lto]
+        for (vto, lto) in graph.inverse_adjacency_list.iteritems():
+            result.inverse_adjacency_list[vto] = [(vertex_map[to], edge_map[eid]) for (to, eid) in lto]
+        return result
+
+    ##########################################################################
+    # Accessors
+            
+    def inverse(self):
+        """inverse() -> Graph
+        Inverse all edge directions on the graph and return a Graph
+
+        """
+        result = copy.copy(self)
+        t = result.adjacency_list
+        result.adjacency_list = result.inverse_adjacency_list
+        result.inverse_adjacency_list = t
+        return result
+
+    def inverse_immutable(self):
+        """inverse_immutable() -> Graph
+        
+        Fast version of inverse(), but requires that output not be
+        mutated (it shares with self.)
+        """
+        result = Graph()
+        result.vertices = self.vertices
+        result.adjacency_list = self.inverse_adjacency_list
+        result.inverse_adjacency_list = self.adjacency_list
+        return result
+
+    def undirected_immutable(self):
+        """undirected_immutable() -> Graph
+
+        Creates an undirected version of self. Notice that this
+        version should not be mutated because there is sharing in the
+        adjacency lists and the vertex map.
+
+        Additionally, if self wasn't acyclic, then
+        undirected_immutable() won't be simple.
+        """
+        result = Graph()
+        result.vertices = self.vertices
+        result.adjacency_list = dict((k, (self.adjacency_list[k] +
+                                          self.inverse_adjacency_list[k]))
+                                     for k in self.vertices)
+        result.inverse_adjacency_list = result.adjacency_list
+        return result
+        
+    def out_degree(self, froom):
+        """ out_degree(froom: id type) -> int
+        Compute the number of edges leaving 'froom' and return an int
+
+        Keyword arguments:
+        froom -- 'immutable' vertex id
+
+        """
+        return len(self.adjacency_list[froom])
+    
+    def in_degree(self, to):
+        """ in_degree(to: id type) -> int
+        Compute the number of edges entering 'to' and return an int
+
+        Keyword arguments:
+        to -- 'immutable' vertex id
+
+        """
+        return len(self.inverse_adjacency_list[to])
+    
+    def sinks(self):
+        """ sinks() -> list(id type)
+        Find all vertices whose out_degree is zero and return a list of ids
+
+        """
+        return [idx for idx in self.vertices.keys() \
+                if self.out_degree(idx) == 0]
+    
+    def sources(self):
+        """ sources() -> list(id type)
+        Find all vertices whose in_degree is zero and return a list of ids
+
+        """
+        return [idx for idx in self.vertices.keys() if self.in_degree(idx) == 0]
+
+    def edges_to(self, id):
+        """ edges_to(id: id type) -> list(list)
+        Find edges entering a vertex id and return a list of tuples (id,id)
+
+        Keyword arguments:
+        id : 'immutable' vertex id
+        
+        """
+        return self.inverse_adjacency_list[id]
+
+    def edges_from(self, id):
+        """ edges_from(id: id type) -> list(list)
+        Find edges leaving a vertex id and return a list of tuples (id,id)
+        
+        Keyword arguments:
+        id : 'immutable' vertex id
+
+        """
+        return self.adjacency_list[id]
+
+    def get_edge(self, frm, to):
+        """ get_edge(frm, to) -> edge_id
+
+        Returns the id from the edge from->to."""
+        for (t, e_id) in self.edges_from(frm):
+            if t == to:
+                return e_id
+
+    def has_edge(self, frm, to):
+        """ has_edge(frm, to) -> bool
+
+        True if there exists an edge (frm, to)"""
+
+        for (t, _) in self.edges_from(frm):
+            if t == to:
+                return True
+        return False
+
+    ##########################################################################
+    # Mutate graph
+
+    def add_vertex(self, id, data=None):
+        """ add_vertex(id: id type, data) -> None
+        Add a vertex to the graph if it is not already in the graph
+        and return nothing
+
+        Keyword arguments:
+        id -- vertex id
+        
+        """
+        if not id in self.vertices:
+            self.vertices[id] = data
+            self.adjacency_list[id] = []
+            self.inverse_adjacency_list[id] = []
+
+    def add_edge(self, froom, to, id=None):
+        """ add_edge(froom: id type, to: id type, id: id type) -> None
+        Add an edge from vertex 'froom' to vertex 'to' and return nothing
+
+        Keyword arguments:
+        froom -- 'immutable' origin vertex id
+        to    -- 'immutable' destination vertex id
+        id    -- 'immutable' edge id (default None)
+          
+        """
+        self.add_vertex(froom)
+        self.add_vertex(to)
+        self.adjacency_list[froom].append((to, id))
+        self.inverse_adjacency_list[to].append((froom, id))
+        
+    def delete_vertex(self, id):
+        """ delete_vertex(id: id type) -> None
+        Remove a vertex from graph and return nothing
+
+        Keyword arguments:
+        -- id : 'immutable' vertex id
+          
+        """
+        
+        for (origin, edge_id) in self.inverse_adjacency_list[id]:
+            t = (id, edge_id)
+            self.adjacency_list[origin].remove(t)
+        for (dest, edge_id) in self.adjacency_list[id]:
+            t = (id, edge_id)
+            self.inverse_adjacency_list[dest].remove(t)
+        del self.adjacency_list[id]
+        del self.inverse_adjacency_list[id]
+        del self.vertices[id]
+
+    class RenameVertexError(GraphException):
+        pass
+    
+    def rename_vertex(self, old_vertex, new_vertex):
+        """ rename_vertex(old_vertex, new_vertex) -> None
+
+        renames old_vertex to new_vertex in the graph, updating the edges
+        appropriately. Should not be used to merge vertices, will raise
+        exception if new_vertex exists in graph.
+
+        """
+        if not (old_vertex in self.vertices):
+            raise self.RenameVertexError("vertex '%s' does not exist" % old_vertex) 
+        if new_vertex in self.vertices:
+            raise self.RenameVertexError("vertex '%s' already exists" % new_vertex)
+        self.add_vertex(new_vertex)
+
+        # the slice ([:]) is important for copying, since change_edge
+        # mutates the list we'll be traversing
+        for (v_from, e_id) in self.inverse_adjacency_list[old_vertex][:]:
+            self.change_edge(v_from, old_vertex, new_vertex, e_id, e_id)
+
+        self.adjacency_list[new_vertex] = self.adjacency_list[old_vertex]
+        del self.adjacency_list[old_vertex]
+        del self.vertices[old_vertex]
+       
+    def change_edge(self, old_froom, old_to, new_to, old_id=None, new_id=None):
+        """ change_edge(old_froom: id, old_to: id, new_to: id, 
+                        old_id: id, new_id: id) -> None
+        Changes the destination of an edge in a graph **in place**
+        
+        Keyword arguments:
+        old_froom -- 'immutable' origin vertex id
+        old_to    -- 'immutable' destination vertex id
+        new_to    -- 'immutable' destination vertex id
+        old_id    -- 'immutable' edge id (default None)
+        new_id    -- 'immutable' edge id (default None)
+        """
+        
+        if old_id == None:
+            efroom = self.adjacency_list[old_froom]
+            for i, edge in enumerate(efroom):
+                if edge[0] == old_to:
+                    old_id = edge[1]
+                    forward_idx = i
+                    break
+        else:
+            forward_idx = self.adjacency_list[old_froom].index((old_to, old_id))
+
+        self.adjacency_list[old_froom][forward_idx] = ((new_to, new_id))
+        self.inverse_adjacency_list[old_to].remove((old_froom, old_id))
+        self.inverse_adjacency_list[new_to].append((old_froom, new_id))
+
+    def delete_edge(self, froom, to, id=None):
+        """ delete_edge(froom: id type, to: id type, id: id type) -> None
+        Remove an edge from graph and return nothing
+
+        Keyword arguments:
+        froom -- 'immutable' origin vertex id
+        to    -- 'immutable' destination vertex id
+        id    -- 'immutable' edge id
+          
+        """
+        if id is None:
+            efroom = self.adjacency_list[froom]
+            for edge in efroom:
+                if edge[0] == to:
+                    id = edge[1]
+                    break
+        if id is None:
+            raise GraphException("delete_edge didn't find edge (%s,%s)"%
+                                 (froom, to))
+        self.adjacency_list[froom].remove((to, id))
+        self.inverse_adjacency_list[to].remove((froom, id))
+
+    ##########################################################################
+    # Graph algorithms
+
+    def closest_vertex(self, frm, target_list):
+        """ closest_vertex(frm, target_list) -> id Uses bfs-like
+        algorithm to find closest vertex to frm in target_list
+
+        """
+        if frm in target_list:
+            return frm
+        target_list = set(target_list)
+        visited = set([frm])
+        parent = {}
+        q = Queue()
+        q.push(frm)
+        while 1:
+            try:
+                current = q.pop()
+            except q.EmptyQueue:
+                raise GraphException("no vertices reachable: %s %s" % (frm, list(target_list)))
+            efrom = self.edges_from(current)
+            for (to, eid) in efrom:
+                if to in target_list:
+                    return to
+                if to not in visited:
+                    parent[to] = current
+                    q.push(to)
+                    visited.add(to)
+
+    def bfs(self, frm):
+        """ bfs(frm:id type) -> dict(id type)
+        Perform Breadth-First-Search and return a dict of parent id
+
+        Keyword arguments:
+        frm -- 'immutable' vertex id
+
+        """
+        visited = set([frm])
+        parent = {}
+        q = Queue()
+        q.push(frm)
+        while 1:
+            try:
+                current = q.pop()
+            except q.EmptyQueue:
+                break
+            efrom = self.edges_from(current)
+            for (to, eid) in efrom:
+                if to not in visited:
+                    parent[to] = current
+                    q.push(to)
+                    visited.add(to)
+        return parent
+
+    class GraphContainsCycles(GraphException):
+        def __init__(self, v1, v2):
+            self.back_edge = (v1, v2)
+        def __str__(self):
+            return ("Graph contains cycles: back edge %s encountered" %
+                    self.back_edge)
+
+    def dfs(self,
+            vertex_set=None,
+            raise_if_cyclic=False,
+            enter_vertex=None,
+            leave_vertex=None):
+        """ dfs(self,vertex_set=None,raise_if_cyclic=False,enter_vertex=None,
+                leave_vertex=None) -> (discovery, parent, finish)
+        Performs a depth-first search on a graph and returns three dictionaries with
+        relevant information. If vertex_set is not None, then it is used as
+        the list of ids to perform the DFS on.
+        
+        See CLRS p. 541.
+
+        enter_vertex, when present, is called just before visiting a vertex
+        for the first time (and only once) with the vertex id as a parameter.
+
+        leave_vertex, when present, is called just after visiting a vertex
+        for the first time (and only once) with the vertex id as a parameter.
+        """
+
+        if not vertex_set:
+            vertex_set = self.vertices
+
+        # Ugly ugly python
+        # http://mail.python.org/pipermail/python-list/2006-April/378964.html
+
+        # We cannot explicitly "del data":
+        # http://www.python.org/dev/peps/pep-0227/
+
+        class Closure(object):
+            
+            def clear(self):
+                del self.discovery
+                del self.parent
+                del self.finish
+                del self.t
+        
+        # Straight CLRS p.541
+        data = Closure()
+        data.discovery = {} # d in CLRS
+        data.parent = {} # \pi in CLRS
+        data.finish = {}  # f in CLRS
+        data.t = 0
+
+        (enter, leave, back, other) = xrange(4)
+
+        # inspired by http://www.ics.uci.edu/~eppstein/PADS/DFS.py
+
+        def handle(v, w, edgetype):
+            data.t += 1
+            if edgetype == enter:
+                data.discovery[v] = data.t
+                if enter_vertex:
+                    enter_vertex(w)
+                if v != w:
+                    data.parent[w] = v
+            elif edgetype == leave:
+                data.finish[w] = data.t
+                if leave_vertex:
+                    leave_vertex(w)
+            elif edgetype == back and raise_if_cyclic:
+                raise self.GraphContainsCycles(v, w)
+        
+        visited = set()
+        gray = set()
+        # helper function to build stack structure
+        def st(v): return (v, iter(self.adjacency_list[v]))
+        for vertex in vertex_set:
+            if vertex not in visited:
+                handle(vertex, vertex, enter)
+                visited.add(vertex)
+                stack = Stack()
+                stack.push(st(vertex))
+                gray.add(vertex)
+                while stack.size:
+                    parent, children = stack.top()
+                    try:
+                        child, _ = children.next()
+                        if child in visited:
+                            handle(parent, child, (child in gray
+                                                   and back
+                                                   or other))
+                        else:
+                            handle(parent, child, enter)
+                            visited.add(child)
+                            stack.push(st(child))
+                            gray.add(child)
+                    except StopIteration:
+                        gray.remove(parent)
+                        stack.pop()
+                        if stack.size:
+                            handle(stack.top()[0], parent, leave)
+                handle(vertex, vertex, leave)
+
+        result = (data.discovery, data.parent, data.finish)
+        data.clear()
+        return result
+
+    class VertexHasNoParentError(GraphException):
+        def __init__(self, v):
+            Exception.__init__(self, v)
+            self._v = v
+        def __str__(self):
+            return ("called parent() on vertex '%s', which has no parent nodes"
+                    % self._v)
+
+    def parent(self, v):
+        """ parent(v: id type) -> id type
+        Find the parent of vertex v and return an id
+
+        Keyword arguments:
+        v -- 'immutable' vertex id
+
+        raises VertexHasNoParentError is vertex has no parent
+
+        raises KeyError is vertex is not on graph
+
+        """
+        l=self.inverse_adjacency_list[v]
+        if len(l):
+            (froom, a) = l[-1]
+        else:
+            raise self.VertexHasNoParentError(v)
+        return froom
+    
+    def vertices_topological_sort(self,vertex_set=None):
+        """ vertices_topological_sort(self,vertex_set=None) ->
+        sequence(vertices) Returns a sequence of all vertices, so that
+        they are in topological sort order (every node traversed is
+        such that their parent nodes have already been
+        traversed). vertex_set is optionally a list of vertices on
+        which to perform the topological sort.
+
+        This is O(n log n) instead of the optimal O(n), 
+        """
+        (d, p, f) = self.dfs(vertex_set,raise_if_cyclic=True)
+        # Optimized these three lines into the last one
+        # lst = [(v, k) for (k,v) in f.iteritems()]
+        # lst.sort(reverse=True)
+        # return [v for (k, v) in lst]
+        return [k for (k, _) in sorted(f.iteritems(), 
+                                       key=lambda x: (x[1], x[0]),
+                                       reverse=True)]
+
+    def topologically_contractible(self, subgraph):
+        """topologically_contractible(subgraph) -> Boolean.
+
+        Returns true if contracting the subgraph to a single vertex
+        doesn't create cycles. This is equivalent to checking whether
+        a pipeline subgraph forms a legal abstraction."""
+        x = copy.copy(self)
+        conns_to_subgraph = self.connections_to_subgraph(subgraph)
+        conns_from_subgraph = self.connections_from_subgraph(subgraph)
+        for v in subgraph.vertices.iterkeys():
+            x.delete_vertex(v)
+        free_vertex = max(subgraph.vertices.iterkeys()) + 1
+        x.add_vertex(free_vertex)
+        for (edge_from, edge_to, edge_id) in conns_to_subgraph:
+            x.add_edge(free_vertex, edge_to)
+        for (edge_from, edge_to, edge_id) in conns_from_subgraph:
+            x.add_edge(edge_from, free_vertex)
+        try:
+            x.vertices_topological_sort()
+            return True
+        except self.GraphContainsCycles:
+            return False
+
+    ##########################################################################
+    # Subgraphs
+
+    def subgraph(self, vertex_set):
+        """ subgraph(vertex_set) -> Graph.
+
+        Returns a subgraph of self containing all vertices and
+        connections between them."""
+        result = Graph()
+        vertex_set = set(vertex_set)
+        # add vertices
+        for vertex in vertex_set:
+            result.add_vertex(vertex)
+        # add edges
+        for vertex_from in vertex_set:
+            for (vertex_to, edge_id) in self.edges_from(vertex_from):
+                if vertex_to in vertex_set:
+                    result.add_edge(vertex_from, vertex_to, edge_id)
+        return result
+
+    def connections_to_subgraph(self, subgraph):
+        """connections_to_subgraph(subgraph) -> [(vert_from, vert_to, edge_id)]
+
+        Returns the list of all edges that connect to a vertex \in
+        subgraph. subgraph is assumed to be a subgraph of self"""
+        vertices_to_traverse = set(self.vertices.iterkeys())
+        subgraph_verts = set(subgraph.vertices.iterkeys())
+        vertices_to_traverse -= subgraph_verts
+
+        result = []
+        for v in vertices_to_traverse:
+            for e in self.adjacency_list[v]:
+                (v_to, e_id) = e
+                if v_to in subgraph_verts:
+                    result.append((v, v_to, e_id))
+        return result
+
+    def connections_from_subgraph(self, subgraph):
+        """connections_from_subgraph(subgraph) -> [(vert_from, vert_to, edge_id)]
+
+        Returns the list of all edges that connect from a vertex \in
+        subgraph to a vertex \not \in subgraph. subgraph is assumed to
+        be a subgraph of self"""
+        subgraph_verts = set(subgraph.vertices.iterkeys())
+        vertices_to_traverse = subgraph_verts
+
+        result = []
+        for v in vertices_to_traverse:
+            for e in self.adjacency_list[v]:
+                (v_to, e_id) = e
+                if v_to not in subgraph_verts:
+                    result.append((v, v_to, e_id))
+        return result
+
+    ##########################################################################
+    # Iterators
+
+
+    def iter_edges_from(self, vertex):
+        """iter_edges_from(self, vertex) -> iterable
+
+        Returns an iterator over all edges in the form
+        (vertex, vert_to, edge_id)."""
+        def fn(edge):
+            (edge_to, edge_id) = edge
+            return (vertex, edge_to, edge_id)
+        return imap(fn, self.adjacency_list[vertex])
+
+    def iter_edges_to(self, vertex):
+        """iter_edges_to(self, vertex) -> iterable
+
+        Returns an iterator over all edges in the form
+        (vertex, vert_to, edge_id)."""
+        def fn(edge):
+            (edge_from, edge_id) = edge
+            return (edge_from, vertex, edge_id)
+        return imap(fn, self.inverse_adjacency_list[vertex])
+
+    def iter_all_edges(self):
+        """iter_all_edges() -> iterable
+
+        Returns an iterator over all edges in the graph in the form
+        (vert_from, vert_to, edge_id)."""
+        verts = self.iter_vertices()
+        edge_itors = imap(self.iter_edges_from, verts)
+        return chain(*[v for v in edge_itors])
+
+    def iter_vertices(self):
+        """iter_vertices() -> iterable
+
+        Returns an iterator over all vertex ids of the graph."""
+        return self.vertices.iterkeys()
+
+    ##########################################################################
+    # Special Python methods
+
+    def __str__(self):
+        """ __str__() -> str
+        Format the graph for serialization and return a string
+
+        """
+        vs = self.vertices.keys()
+        vs.sort()
+        al = []
+        for i in [map(lambda (t, i): (f, t, i), l)
+                  for (f, l) in self.adjacency_list.items()]:
+            al.extend(i)
+        al.sort(edge_cmp)
+        return "digraph G { " \
+               + ";".join([str(s) for s in vs]) + ";" \
+               + ";".join(["%s -> %s [label=\"%s\"]" % s for s in al]) + "}"
+
+    def __repr__(self):
+        """ __repr__() -> str
+        Similar to __str__ to re-represent the graph and returns a string
+
+        """
+        return self.__str__()
+
+    def __copy__(self):
+        """ __copy__() -> Graph
+        Make a copy of the graph and return a Graph
+
+        """
+        cp = Graph()
+        cp.vertices = copy.copy(self.vertices)
+        cp.adjacency_list = dict((k, v[:]) for (k,v) in self.adjacency_list.iteritems())
+        cp.inverse_adjacency_list = dict((k, v[:]) for (k,v) in self.inverse_adjacency_list.iteritems())
+        return cp
+
+    def __eq__(self, other):
+        # Does not test isomorphism - vertices must be consistently labeled
+        # might be slow - don't use in tight code
+        if type(self) <> type(other):
+            return False
+        for v in self.vertices:
+            if not v in other.vertices:
+                return False
+        for vfrom, elist in self.adjacency_list.iteritems():
+            for vto, eid in elist:
+                if not other.get_edge(vfrom, vto) == eid:
+                    return False
+        return True
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    ##########################################################################
+    # Etc
+
+    @staticmethod
+    def from_random(size):
+        """ from_random(size:int) -> Graph
+        Create a DAG with approximately size/e vertices and 3*|vertex| edges
+        and return a Graph
+
+        Keyword arguments:
+        size -- the estimated size of the graph to generate
+
+        """
+        result = Graph()
+        verts = filter(lambda x: x>0, peckcheck.a_list(peckcheck.an_int)(size))
+        for v in verts:
+            result.add_vertex(v)
+        k = size / math.e
+        p = (6*k) / ((k+1)*(k+2))
+        eid = 0
+        for v in verts:
+            for k in verts:
+                if v < k and random.random() > p:
+                    result.add_edge(v, k, eid)
+                    eid = eid + 1
+        return result
+
+def edge_cmp(v1, v2):
+    """ edge_cmp(v1: id type, v2:id type) -> int
+    Defines how the comparison must be done between edges  and return a boolean
+
+    Keyword arguments:
+    v1 -- 'sequence' edge information
+    v2 -- 'sequence' other edge information
+    
+    """
+    (from1, to1, id1) = v1
+    (from2, to2, id2) = v2
+    c1 = cmp(from1, from2)
+    if c1:
+        return c1
+    c2 = cmp(to1, to2)
+    if c2:
+        return c2
+    else:
+        return cmp(id1, id2)
+
+################################################################################
+# Unit testing
+
+
+class TestGraph(unittest.TestCase):
+     """ Class to test Graph
+
+     It tests vertex addition, the out_degree of a sink and in_degree of a
+     source consistencies.
+    
+     """
+
+     def make_complete(self, v):
+         """returns a complete graph with v verts."""
+         g = Graph()
+         for x in xrange(v):
+             g.add_vertex(x)
+         for f in xrange(v):
+             for t in xrange(f+1, v):
+                 g.add_edge(f, t, f * v + t)
+         return g
+
+     def make_linear(self, v, bw=False):
+         """returns a linear graph with v verts. if bw=True, add
+         backward links."""
+         g = Graph()
+         for x in xrange(v):
+             g.add_vertex(x)
+         for x,y in izip(xrange(v-1), xrange(1, v)):
+             g.add_edge(x, y, x)
+             if bw:
+                 g.add_edge(y, x, x + v)
+         return g
+
+     def get_default_graph(self):
+         g = Graph()
+         g.add_vertex(0)
+         g.add_vertex(1)
+         g.add_vertex(2)
+         g.add_vertex(3)
+         g.add_vertex(4)
+         g.add_edge(0,1,0)
+         g.add_edge(1,2,1)
+         g.add_edge(0,3,2)
+         g.add_edge(3,2,3)
+         g.add_edge(2,4,4)
+         return g
+     
+     def test1(self):
+         """Test adding edges and vertices"""
+         g = Graph()
+         g.add_vertex('0')
+         g.add_vertex('1')
+         g.add_vertex('2')
+         g.add_vertex('3')
+         g.add_edge('0', '1', 0)
+         g.add_edge('1', '2', 1)
+         g.add_edge('2', '3', 2)
+         parent = g.bfs('0')
+         self.assertEquals(parent['3'], '2')
+         self.assertEquals(parent['2'], '1')
+         self.assertEquals(parent['1'], '0')
+
+     def test2(self):
+         """Test bread-first-search"""
+         g = self.get_default_graph()
+         p = g.bfs(0)
+         k = p.keys()
+         k.sort()
+         self.assertEquals(k, [1, 2, 3, 4])
+         inv = g.inverse()
+         p_inv = inv.bfs(4)
+         k2 = p_inv.keys()
+         k2.sort()
+         self.assertEquals(k2, [0, 1, 2, 3])
+         
+     def test3(self):
+         """Test sink and source degree consistency"""
+         g = Graph()
+         for i in xrange(100):
+             g.add_vertex(i);
+         for i in xrange(1000):
+             v1 = random.randint(0,99)
+             v2 = random.randint(0,99)
+             g.add_edge(v1, v2, i)
+         sinkResult = [None for i in g.sinks() if g.out_degree(i) == 0]
+         sourceResult = [None for i in g.sources() if g.in_degree(i) == 0]
+         if len(sinkResult) <> len(g.sinks()):
+             assert False
+         if len(sourceResult) <> len(g.sources()):
+             assert False
+
+     def test_remove_vertices(self):
+         g = self.make_linear(5)
+         g.delete_vertex(1)
+         g.delete_vertex(2)
+     
+     def test_DFS(self):
+         """Test DFS on graph."""
+         g = self.get_default_graph()
+         g.dfs()
+
+     def test_topological_sort(self):
+         """Test toposort on graph."""
+         g = self.get_default_graph()
+         g.vertices_topological_sort()
+
+         g = self.make_linear(10)
+         r = g.vertices_topological_sort()
+         assert r == [0,1,2,3,4,5,6,7,8,9]
+
+         g = Graph()
+         g.add_vertex('a')
+         g.add_vertex('b')
+         g.add_vertex('c')
+         g.add_edge('a', 'b')
+         g.add_edge('b', 'c')
+         assert g.vertices_topological_sort() == ['a', 'b', 'c']
+
+     def test_limited_DFS(self):
+         """Test DFS on graph using a limited set of starting vertices."""
+         g = self.get_default_graph()
+         g.dfs(vertex_set=[1])
+         g.dfs(vertex_set=[1,3])
+         g.dfs(vertex_set=[1,2])
+
+     def test_limited_topological_sort(self):
+         """Test toposort on graph using a limited set of starting vertices."""
+         g = self.get_default_graph()
+         g.vertices_topological_sort(vertex_set=[1])
+         g.vertices_topological_sort(vertex_set=[1,3])
+         g.vertices_topological_sort(vertex_set=[1,2])
+
+     def test_print_empty_graph(self):
+         """Test print on empty graph"""
+         g = Graph()
+         g.__str__()
+
+     def test_delete(self):
+         """Tests consistency of data structure after deletion."""
+         g = Graph()
+         g.add_vertex(0)
+         g.add_vertex(1)
+         g.add_vertex(2)
+         g.add_edge(0, 1, 0)
+         g.add_edge(1, 2, 1)
+         g.delete_vertex(2)
+         self.assertEquals(g.adjacency_list[1], [])
+
+     def test_raising_DFS(self):
+         """Tests if DFS with cycle-checking will raise exceptions."""
+         g = Graph()
+         g.add_vertex(0)
+         g.add_vertex(1)
+         g.add_vertex(2)
+         g.add_edge(0, 1)
+         g.add_edge(1, 2)
+         g.add_edge(2, 0)
+         with self.assertRaises(Graph.GraphContainsCycles):
+             g.dfs(raise_if_cyclic=True)
+
+     def test_call_inverse(self):
+         """Test if calling inverse methods work."""
+         g = Graph()
+         g.add_vertex(0)
+         g.add_vertex(1)
+         g.add_vertex(2)
+         g.add_edge(0, 1)
+         g.add_edge(1, 2)
+         g.add_edge(2, 0)
+         g2 = g.inverse()
+         g3 = g.inverse_immutable()
+     
+     def test_subgraph(self):
+         """Test subgraph routines."""
+         g = self.make_complete(5)
+         sub = g.subgraph([0,1])
+         assert 0 in sub.vertices
+         assert 1 in sub.vertices
+         assert (1,1) in sub.adjacency_list[0]
+         assert (0,1) in sub.inverse_adjacency_list[1]
+
+         g = self.make_linear(3)
+         sub = g.subgraph([0, 2])
+         assert 0 in sub.vertices
+         assert 2 in sub.vertices
+         assert sub.adjacency_list[0] == []
+         assert sub.adjacency_list[2] == []
+         
+     def test_connections_to_subgraph(self):
+         """Test connections_to_subgraph."""
+         g = self.make_linear(5)
+         sub = g.subgraph([3])
+         assert len(g.connections_to_subgraph(sub)) == 1
+         g = self.make_linear(5, True)
+         sub = g.subgraph([3])
+         assert len(g.connections_to_subgraph(sub)) == 2
+
+     def test_connections_from_subgraph(self):
+         """Test connections_from_subgraph."""
+         g = self.make_linear(5)
+         sub = g.subgraph([3])
+         assert len(g.connections_from_subgraph(sub)) == 1
+         g = self.make_linear(5, True)
+         sub = g.subgraph([3])
+         assert len(g.connections_from_subgraph(sub)) == 2
+
+     def test_topologically_contractible(self):
+         """Test topologically_contractible."""
+         g = self.make_linear(5)
+         sub = g.subgraph([1, 2])
+         assert g.topologically_contractible(sub)
+         sub = g.subgraph([1, 3])
+         assert not g.topologically_contractible(sub)
+
+         g = Graph()
+         g.add_vertex(0)
+         g.add_vertex(1)
+         g.add_vertex(2)
+         g.add_vertex(3)
+         g.add_edge(0, 1)
+         g.add_edge(2, 3)
+         for i in xrange(1, 16):
+             s = []
+             for j in xrange(4):
+                 if i & (1 << j): s.append(j)
+             assert g.topologically_contractible(g.subgraph(s))
+
+     def test_iter_vertices(self):
+         g = self.get_default_graph()
+         l = list(g.iter_vertices())
+         l.sort()
+         assert l == [0,1,2,3,4]
+
+     def test_iter_edges(self):
+         g = self.get_default_graph()
+         l = [v for v in g.iter_all_edges()]
+         l.sort()
+         assert l == [(0,1,0), (0,3,2), (1, 2, 1), (2, 4, 4), (3, 2, 3)]
+
+     def test_iter_edges_empty(self):
+         """Test iterators on empty parts of the graph."""
+         g = Graph()
+         for a in g.iter_vertices():
+             assert False
+         g.add_vertex(0)
+         for a in g.iter_edges_from(0):
+             assert False
+         for a in g.iter_edges_to(0):
+             assert False
+         for a in g.iter_all_edges():
+             assert False
+
+     def test_get_edge_none(self):
+         g = Graph()
+         g.add_vertex(0)
+         g.add_vertex(1)
+         assert g.get_edge(0, 1) == None
+
+     def test_dfs_before(self):
+         g = self.make_linear(10)
+         inc = []
+         dec = []
+         def before(id): inc.append(id)
+         def after(id): dec.append(id)
+         g.dfs(enter_vertex=before,
+               leave_vertex=after)
+         assert inc == [0,1,2,3,4,5,6,7,8,9]
+         assert inc == list(reversed(dec))
+         assert all(a < b for a, b in izip(inc[:-1], inc[1:]))
+         assert all(a > b for a, b in izip(dec[:-1], dec[1:]))
+
+     def test_parent_source(self):
+         g = self.make_linear(10)
+         self.assertRaises(g.VertexHasNoParentError,
+                           lambda: g.parent(0))
+         for i in xrange(1, 10):
+             assert g.parent(i) == i-1
+
+     def test_rename_vertex(self):
+         g = self.make_linear(10)
+         self.assertRaises(g.RenameVertexError,
+                           lambda: g.rename_vertex(0, 1))
+         assert g.get_edge(0, 1) is not None
+         assert g.get_edge(0, 11) is None
+         g.rename_vertex(1, 11)
+         assert g.get_edge(0, 1) is None
+         assert g.get_edge(0, 11) is not None
+         g.rename_vertex(11, 1)
+         assert g.get_edge(0, 1) is not None
+         assert g.get_edge(0, 11) is None
+
+     def test_delete_get_edge(self):
+         g = self.make_linear(10)
+         self.assertRaises(GraphException, lambda: g.delete_edge(7, 9))
+         assert g.has_edge(7, 8)
+         g.delete_edge(7, 8)
+         assert not g.has_edge(7, 8)
+
+     def test_bfs(self):
+         g = self.make_linear(5)
+         lst = g.bfs(0).items()
+         lst.sort()
+         assert lst == [(1, 0), (2, 1), (3, 2), (4, 3)]
+         lst = g.bfs(2).items()
+         lst.sort()
+         assert lst == [(3, 2), (4, 3)]
+
+     def test_undirected(self):
+         g = self.make_linear(5).undirected_immutable()
+         lst = g.bfs(0).items()
+         lst.sort()
+         assert lst == [(1, 0), (2, 1), (3, 2), (4, 3)]
+         lst = g.bfs(2).items()
+         lst.sort()
+         assert lst == [(0, 1), (1, 2), (3, 2), (4, 3)]
+
+     def test_closest_vertex(self):
+         g = self.make_linear(10)
+         g.delete_edge(7, 8)
+         g = g.undirected_immutable()
+         self.assertRaises(GraphException, lambda: g.closest_vertex(1, [9]))
+         assert g.closest_vertex(3, [2, 6, 7]) == 2
+         assert g.closest_vertex(3, [2, 3, 6, 7]) == 3
+         # Test using dictionary as target_list
+
+         d1 = {2:True, 6:True, 7:False}
+         d2 = {2:True, 6:True, 7:False, 3:False}
+         d3 = {9:True}
+         self.assertRaises(GraphException, lambda: g.closest_vertex(1, d3))
+         assert g.closest_vertex(3, d1) == 2
+         assert g.closest_vertex(3, d2) == 3
+
+     def test_copy_not_share(self):
+         g = self.make_linear(10)
+         g2 = copy.copy(g)
+         for v in g.vertices:
+             assert id(g.adjacency_list[v]) <> id(g2.adjacency_list[v])
+             assert id(g.inverse_adjacency_list[v]) <> id(g2.inverse_adjacency_list[v])
+
+     def test_copy_works(self):
+         g = self.make_linear(10)
+         g2 = copy.copy(g)
+         for v in g.vertices:
+             assert v in g2.vertices
+             assert g2.adjacency_list[v] == g.adjacency_list[v]
+             assert g2.inverse_adjacency_list[v] == g.inverse_adjacency_list[v]
+
+     def test_equals(self):
+         g = self.make_linear(5)
+         assert copy.copy(g) == g
+         g2 = copy.copy(g)
+         g2.add_vertex(10)
+         assert g2 <> g
+
+     def test_map_vertices(self):
+         g = self.make_linear(5)
+         m = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
+         assert g == Graph.map_vertices(g, m)
+         m = {0: 5, 1: 6, 2: 7, 3: 8, 4: 9}
+         assert g <> Graph.map_vertices(g, m)
+         
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/data_structures/point.py b/vistrails/core/data_structures/point.py
new file mode 100644
index 0000000..9534d2e
--- /dev/null
+++ b/vistrails/core/data_structures/point.py
@@ -0,0 +1,199 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import math
+
+################################################################################
+# Point
+
+class Point(object):
+    """Point is a point in 2D. It behaves as a vector, too, because that's
+    convenient."""
+
+    ##########################################################################
+    # Constructor
+    
+    def __init__(self, x=0, y=0):
+        """ Point(x: float, y: float) -> Point
+        Initialize and return a Point
+        
+        """
+        self.x = float(x)
+        self.y = float(y)
+
+    # copy is implicit - all fields are immutable
+
+    ##########################################################################
+
+    def reset(self,x,y):
+        """ reset(x: float, y: float) -> None
+        Resets the point to given coordinates and return nothing
+
+        """
+        self.x = float(x)
+        self.y = float(y)
+
+    def is_inside(self, rect):
+        """ is_inside(rect: Rect) -> boolean
+        Check if the point is falling inside rect and return a boolean
+        
+        """
+        return (self.x >= rect.lower_left.x and
+                self.x <= rect.upper_right.x and
+                self.y >= rect.lower_left.y and
+                self.y <= rect.upper_right.y)
+    
+    def length(self):
+        """ length() -> float
+        Interprets self as a vector to compute the L_2 norm and return a float
+
+        """
+        return math.sqrt(self.x * self.x + self.y * self.y)
+
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(self) != type(other):
+            print "Type mismatch"
+            return
+        l = (self - other).length()
+        if l >= self.eq_delta:
+            print "Points are too far away:"
+            print self
+            print other
+        else:
+            print "No difference found: delta is %f" % l
+            assert self == other
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        return "(%f, %f)@%X" % (self.x, self.y, id(self))
+
+    def __neg__(self):
+        """ __neg__() -> Point
+        Compute a point p such that: self + p == Point(0,0), and return a Point
+        
+        """
+        return Point(-self.x,-self.y)
+
+    def __add__(self, other):
+        """ __add__(other: Point) -> Point
+        Returns a point p such that: self + other == p, and return a Point
+        
+        """
+        return Point(self.x + other.x, self.y + other.y)
+
+    def __sub__(self, other):
+        """ __sub__(other: Point) -> Point
+        Returns a point p such that: self - other == p, and return a Point
+
+        """
+        return Point(self.x - other.x, self.y - other.y)
+
+    def __mul__(self, other):
+        """ __mul__(other: float) -> Point
+        Interprets self as a vector to perform a scalar multiplication and
+        return a Point
+
+        """
+        return Point(self.x * other, self.y * other)
+
+    eq_delta = 0.0001
+    def __eq__(self, other):
+        """__eq__(other: Point) -> boolean 
+        Two points are equal if they have the same components 
+        
+        """
+        if type(self) != type(other):
+            return False
+        return (self.x - other.x) ** 2 + (self.y - other.y) ** 2 < 1e-8
+        
+    def __ne__(self, other):
+        """__ne__(other: Point) -> boolean 
+        Two points are differenr if they don't have the same components 
+        
+        """
+        return not self.__eq__(other)
+
+    def __rmul__(self, other):
+        """ __rmul__(other: float) -> Point
+        Interprets self as a vector to perform a scalar multiplication and
+        return a Point
+
+        """
+        return Point(self.x * other, self.y * other)
+
+
+################################################################################
+# Unit tests
+
+import unittest
+import random
+
+class TestPoint(unittest.TestCase):
+
+    @staticmethod
+    def assert_double_equals(a, b, eps = 0.00001):
+        assert abs(a-b) < eps
+
+    def test_add_length(self):
+        """Uses triangle inequality to exercise add and length"""
+        for i in xrange(100):
+            x = Point(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+            y = Point(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+            assert (x+y).length() <= x.length() + y.length()
+
+    def test_mul_length(self):
+        """Uses vector space properties to exercise mul, rmul and length"""
+        for i in xrange(100):
+            x = Point(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+            s = random.uniform(0.0, 10.0)
+            self.assert_double_equals(s * x.length(), (s * x).length())
+            self.assert_double_equals(s * x.length(), (x * s).length())
+
+    def test_comparison_operators(self):
+        """ Test comparison operators """
+        a = Point(0, 1)
+        b = Point(0, 1)
+        assert a == b
+        assert a != None
+        b = Point(0, 0.1)
+        assert a != b
+
+if __name__ == '__main__':
+    unittest.main()
+        
diff --git a/vistrails/core/data_structures/queue.py b/vistrails/core/data_structures/queue.py
new file mode 100644
index 0000000..634869c
--- /dev/null
+++ b/vistrails/core/data_structures/queue.py
@@ -0,0 +1,232 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+################################################################################
+
+class Queue(object):
+
+    def __init__(self, capacity=8):
+        """ Queue(capacity: int) -> Queue
+        Initialize the queue with a default capacity of zero in size
+
+        """
+        self.__buffer = [None] * capacity
+        self.__capacity = capacity
+        self.__size = 0
+        self.__begin = 0
+        self.__end = 0
+        
+    def __len__(self):
+        """ __len__() -> int
+        Compute the number of elements when using the built-in len()
+        and return an int
+
+        """
+        l = self.__end - self.__begin
+        if l < 0:
+            return self.__capacity + l
+        else:
+            return l
+        
+    def front(self):
+        """ front() -> element type
+        Get the front of the queue and return an element type
+
+        """
+        return self.__buffer[self.__begin]
+    
+    def back(self):
+        """ back() -> element type
+        Get the back (last) element of the queue and return an element type
+
+        """
+        return self.__buffer[(self.__end + self.__capacity - 1) %
+                             self.__capacity]
+    
+    def push(self, obj):
+        """ push(obj: element type) -> None
+        Push obj onto the back queue and return nothing
+
+        """
+        # olen = len(self)
+        if (self.__end + 1) % self.__capacity == self.__begin:
+            self.__rebuffer(self.__capacity * 2)
+        self.__buffer[self.__end] = obj
+        self.__end += 1
+        if self.__end == self.__capacity:
+            self.__end = 0
+        # nlen = len(self)
+        # assert nlen == olen + 1
+
+    class EmptyQueue(Exception):
+        pass
+    
+    def pop(self):
+        """ pop() -> element type
+        Pop the front element of the queue and return an element type
+
+        """
+        # olen = len(self)
+        if len(self) == 0:
+            raise self.EmptyQueue()
+        r = self.__buffer[self.__begin]
+        self.__buffer[self.__begin] = None
+        self.__begin += 1
+        if self.__begin == self.__capacity:
+            self.__begin = 0
+        if self.__capacity > 8 and (self.__capacity / len(self)) >= 4:
+            self.__rebuffer(self.__capacity / 2)
+        # nlen = len(self)
+        # assert olen == nlen + 1
+        return r
+
+    def capacity(self):
+        return self.__capacity
+
+    def __rebuffer(self, newcapacity):
+        """ __rebuffer(newcapacity: int) -> none
+        Reallocate the internal buffer to fit at newcapacity elements and
+        return nothing
+
+        """
+        nb = [None] * newcapacity
+        if self.__begin < self.__end:
+            l = self.__end - self.__begin
+            nb[0:l] = self.__buffer[self.__begin:self.__end]
+            self.__begin = 0
+            self.__end = l
+        else:
+            l1 = self.__capacity - self.__begin
+            l2 = l1 + self.__end
+            nb[0:l1] = self.__buffer[self.__begin:]
+            nb[l1:l2] = self.__buffer[:self.__end]
+            self.__begin = 0
+            self.__end = l2
+        self.__buffer = nb
+        self.__capacity = newcapacity
+        
+    def __str__(self):
+        """ __str__() -> str
+        Format the queue for serialization and return a string
+
+        """
+        return str(self.__buffer)
+
+################################################################################
+
+import unittest
+import random
+
+class TestQueue(unittest.TestCase):
+    
+    def test_basic(self):
+        """Test push/pop operations"""
+        q = Queue()
+        q.push(1)
+        q.push(2)
+        q.push(3)
+        q.push(4)
+        self.assertEquals(q.pop(), 1)
+        self.assertEquals(q.pop(), 2)
+        self.assertEquals(q.pop(), 3)
+        self.assertEquals(q.pop(), 4)
+        
+    def test_expand_basic(self):
+        """Test if the queue is expanding its capacity right with push()"""
+        q = Queue()
+        for i in xrange(512):
+            assert len(q) == i
+            q.push(i)
+            assert len(q) == i+1
+        self.assertEquals(len(q), 512)
+        for i in xrange(512):
+            assert len(q) == 512 - i
+            self.assertEquals(q.pop(), i)
+            assert len(q) == 511 - i
+            
+    def test_expand_contract(self):
+        """Test if the queue is expanding and contracting with push()/pop()"""
+        def run_it():
+            pushed = 0
+            popped = 0
+            q = Queue()
+            for t in xrange(100):
+                for i in xrange(100):
+                    # Test expand with high probability
+                    a = random.choice([0,0,0,0,0,1])
+                    if (a == 0) or (len(q) == 0):
+                        olen = len(q)
+                        q.push(pushed)
+                        nlen = len(q)
+                        assert nlen == olen+1, "push invariant"
+                        pushed += 1
+                    else:
+                        olen = len(q)
+                        v = q.pop()
+                        nlen = len(q)
+                        assert olen == nlen+1, "pop invariant"
+                        self.assertEquals(v, popped)
+                        popped += 1
+                for i in xrange(100):
+                    # Test contract with high probability
+                    a = random.choice([1,1,1,1,1,0])
+                    if (a == 0) or (len(q) == 0):
+                        olen = len(q)
+                        q.push(pushed)
+                        nlen = len(q)
+                        assert nlen == olen+1, "push invariant"
+                        pushed += 1
+                    else:
+                        olen = len(q)
+                        v = q.pop()
+                        nlen = len(q)
+                        assert olen == nlen+1, "pop invariant"
+                        self.assertEquals(v, popped)
+                        popped += 1
+        # run test 100 times
+        for i in xrange(1):
+            run_it()
+
+    def test_pop(self):
+        x = Queue()
+        try:
+            x.pop()
+        except x.EmptyQueue:
+            pass
+        else:
+            assert False
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/data_structures/rect.py b/vistrails/core/data_structures/rect.py
new file mode 100644
index 0000000..806042f
--- /dev/null
+++ b/vistrails/core/data_structures/rect.py
@@ -0,0 +1,148 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.core.data_structures.point import Point
+
+import unittest
+import random
+
+################################################################################
+# Rect
+
+class Rect(object):
+    def __init__(self, lower_left=None, upper_right=None):
+        """ Rect(lower_left: Point, upper_right: Point) -> Rect
+        Creates a Rect given the lower_left and the upper_right points. It creates
+        a copy of the given points. Return a Rect
+
+        """        
+        if lower_left == None:
+            self.lower_left = Point()
+        else:
+            self.lower_left = copy.copy(lower_left)
+
+        if upper_right == None:
+            self.upper_right = Point()
+        else:
+            self.upper_right = copy.copy(upper_right)
+        self.check_extent()
+
+    @staticmethod
+    def create(left, right, down, up):
+        """ create(left: float, right: float, down: float, up: float) -> Point
+        Creates a Rect from four float extents and return a Rect
+
+        """
+        return Rect(Point(min(left, right),
+                          min(up, down)),
+                    Point(max(left, right),
+                          max(down, up)))
+    
+    def set_left(self, x):
+        """ set_left(x: float) -> None
+        Sets the left limit of the Rect and return nothing
+
+        """
+        self.lower_left.x = x
+
+    def set_right(self, x):
+        """ set_right(x: float) -> None
+        Sets the right limit of the Rect and return nothing
+
+        """
+        self.upper_right.x = x
+
+    def set_up(self,y):
+        """ set_up(y: float) -> None
+        Sets the upper limit of the Rect and return nothing
+
+        """
+        self.upper_right.y = y
+
+    def set_down(self, y):
+        """ set_down(y: float) -> None
+        Sets the lower limit of the Rect and return nothing
+
+        """
+        self.lower_left.y = y
+
+    def center(self):
+        """ center() -> Point
+        Compute the center of the Rect and return a Point
+
+        """
+        return (self.upper_right + self.lower_left) * 0.5
+
+    def check_extent(self):
+        """ check_extent() -> None
+        Makes sure left limit is less than right limit, and lower limit is less
+        than upper limit. In other words, ensures that, immediately after the
+        call:
+        self.lower_left.x <= self.upper_right.x and
+        self.lower_left.y <= self.upper_right.y
+
+        """
+        if self.lower_left.x > self.upper_right.x:
+            dlx = self.lower_left.x
+            self.lower_left.x = self.upper_right.x
+            self.upper_right.y = dlx
+
+        if self.lower_left.y > self.upper_right.y:
+            dly = self.lower_left.y
+            self.lower_left.y = self.upper_right.y
+            self.upper_right.y = dly
+
+################################################################################
+# Unit tests
+
+
+class TestRect(unittest.TestCase):
+
+    def test_create(self):
+        """Exercises Rect.create()"""
+        for i in xrange(100):
+            a = random.uniform(-1.0, 1.0)
+            b = random.uniform(-1.0, 1.0)
+            c = random.uniform(-1.0, 1.0)
+            d = random.uniform(-1.0, 1.0)
+
+            r = Rect.create(a, b, c, d)
+            assert r.lower_left.x == min(a, b)
+            assert r.upper_right.x == max(a, b)
+            assert r.lower_left.y == min(c, d)
+            assert r.upper_right.y == max(c, d)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/data_structures/stack.py b/vistrails/core/data_structures/stack.py
new file mode 100644
index 0000000..a4da378
--- /dev/null
+++ b/vistrails/core/data_structures/stack.py
@@ -0,0 +1,103 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Simple stack data structure."""
+
+###############################################################################
+
+class EmptyStack(Exception):
+    pass
+
+
+class Stack(object):
+
+    def __init__(self):
+        object.__init__(self)
+        self.__cell = []
+        self.__size = 0
+
+    def top(self):
+        """Returns the top of the stack."""
+        if not self.__cell:
+            raise EmptyStack()
+        else:
+            return self.__cell[0]
+
+    def push(self, obj):
+        """Pushes an element onto the stack."""
+        self.__cell = [obj, self.__cell]
+        self.__size += 1
+
+    def pop(self):
+        """Pops the top off of the stack."""
+        if not self.__cell:
+            raise EmptyStack()
+        else:
+            self.__cell = self.__cell[1]
+            self.__size -= 1
+
+    def __len__(self):
+        return self.__size
+
+    def __get_size(self):
+        return self.__size
+
+    size = property(__get_size, doc="The size of the stack.")
+
+###############################################################################
+
+import unittest
+
+class TestStack(unittest.TestCase):
+
+    def test_basic(self):
+        s = Stack()
+        self.assertEquals(s.size, 0)
+        s.push(10)
+        self.assertEquals(s.top(), 10)
+        self.assertEquals(len(s), 1)
+        s.pop()
+        self.assertEquals(len(s), 0)
+        self.assertEquals(0, s.size)
+
+    def test_pop_empty_raises(self):
+        s = Stack()
+        self.assertRaises(EmptyStack, s.pop)
+
+    def test_top_empty_raises(self):
+        s = Stack()
+        self.assertRaises(EmptyStack, s.top)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/db/__init__.py b/vistrails/core/db/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/db/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/db/action.py b/vistrails/core/db/action.py
new file mode 100644
index 0000000..be6c209
--- /dev/null
+++ b/vistrails/core/db/action.py
@@ -0,0 +1,76 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.vistrail.location import Location
+import vistrails.db.services.action
+
+def create_action(op_list):
+    if len(op_list) > 0:
+        from vistrails.core.vistrail.action import Action
+        action = vistrails.db.services.action.create_action(op_list)
+        Action.convert(action)
+        return action
+    return None
+
+def create_action_from_ops(ops, simplify=False):
+    if len(ops) > 0:
+        from vistrails.core.vistrail.action import Action
+        action = vistrails.db.services.action.create_action_from_ops(ops, simplify)
+        Action.convert(action)
+        return action
+    return None
+
+def merge_actions(action_list):
+    ops = []
+    for action in action_list:
+        ops.extend(action.operations)
+    return create_action_from_ops(ops, True)
+
+def create_paste_action(pipeline, id_scope, id_remap=None):
+    action_list = []
+    if id_remap is None:
+        id_remap = {}
+    for module in pipeline.modules.itervalues():
+        module = module.do_copy(True, id_scope, id_remap)
+        action_list.append(('add', module))
+    for connection in pipeline.connections.itervalues():
+        connection = connection.do_copy(True, id_scope, id_remap)
+        action_list.append(('add', connection))
+    action = create_action(action_list)
+
+    # fun stuff to work around bug where pasted entities aren't dirty
+    for (child, _, _) in action.db_children():
+        child.is_dirty = True
+    return action
+
diff --git a/vistrails/core/db/io.py b/vistrails/core/db/io.py
new file mode 100644
index 0000000..589e5c6
--- /dev/null
+++ b/vistrails/core/db/io.py
@@ -0,0 +1,226 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.vistrail.action import Action
+from vistrails.core.log.log import Log
+from vistrails.core.vistrail.operation import AddOp, ChangeOp, DeleteOp
+from vistrails.db.services.io import SaveBundle
+import vistrails.db.services.io
+import vistrails.db.services.vistrail
+import vistrails.db.services.action
+from xml.dom.minidom import parse, getDOMImplementation
+
+def get_db_vistrail_list(config):
+    return vistrails.db.services.io.get_db_object_list(config,'vistrail')
+
+def get_workflow(vt, version):
+    from vistrails.core.vistrail.pipeline import Pipeline
+    workflow = vistrails.db.services.vistrail.materializeWorkflow(vt, version)
+    Pipeline.convert(workflow)
+    return workflow
+
+def open_workflow(filename):
+    from vistrails.core.vistrail.pipeline import Pipeline
+    workflow = vistrails.db.services.io.open_workflow_from_xml(filename)
+    Pipeline.convert(workflow)
+    return workflow
+
+def save_workflow(workflow, filename):
+    vistrails.db.services.io.save_workflow_to_xml(workflow, filename)
+
+def save_vistrail_to_xml(vistrail, filename):
+    vistrails.db.services.io.save_vistrail_to_xml(vistrail, filename)
+
+def load_vistrail(locator, is_abstraction=False):
+    from vistrails.core.vistrail.vistrail import Vistrail
+
+    abstraction_files = []
+    thumbnail_files = []
+    mashups = []
+    vistrail = None
+    if locator is None:
+        vistrail = Vistrail()
+    else:
+        res = locator.load()
+        if type(res) == type(SaveBundle(None)):
+            vistrail = res.vistrail
+            abstraction_files.extend(res.abstractions)
+            thumbnail_files.extend(res.thumbnails)
+            mashups.extend(res.mashups)
+        else:
+            vistrail = res
+    vistrail.is_abstraction = is_abstraction
+    return (vistrail, abstraction_files, thumbnail_files, mashups)
+    
+def open_registry(filename):
+    from vistrails.core.modules.module_registry import ModuleRegistry
+    registry = vistrails.db.services.io.open_registry_from_xml(filename)
+    ModuleRegistry.convert(registry)
+    return registry
+
+def unserialize(str, klass):
+    """returns VisTrails entity given an XML serialization
+
+    """
+    obj = vistrails.db.services.io.unserialize(str, klass.vtType)
+    if obj:
+        #maybe we should also put a try except here
+        klass.convert(obj)
+    return obj
+
+def serialize(object):
+    """returns XML serialization for any VisTrails entity
+
+    """
+    return vistrails.db.services.io.serialize(object)
+
+def open_log(fname, was_appended=False):
+    log = vistrails.db.services.io.open_log_from_xml(fname, was_appended)
+    Log.convert(log)
+    return log
+
+
+def merge_logs(new_log, log_fname):
+    log = vistrails.db.services.io.merge_logs(new_log, log_fname)
+    Log.convert(log)
+    return log
+
+def get_workflow_diff(vt_pair_1, vt_pair_2):
+    """get_workflow_diff( tuple(Vistrail, id), tuple(Vistrail, id) ) ->
+            Pipeline, Pipeline, [tuple(id, id)], [tuple(id, id)], 
+            [id], [id], [tuple(id, id, list)]
+
+    Return a difference between two workflows referenced as vistrails.
+    """
+
+    from vistrails.core.vistrail.pipeline import Pipeline
+    (v1, v2, pairs, heuristic_pairs, v1_only, v2_only, param_changes, \
+         _, _, _, _) = \
+         vistrails.db.services.vistrail.getWorkflowDiff(vt_pair_1, vt_pair_2, True)
+    Pipeline.convert(v1)
+    Pipeline.convert(v2)
+    return (v1, v2, pairs, heuristic_pairs, v1_only, v2_only, param_changes)
+
+def get_workflow_diff_with_connections(vt_pair_1, vt_pair_2):
+    """get_workflow_diff_with_connections
+
+    Similar to get_workflow_diff but with connection pairings.
+    """
+
+    from vistrails.core.vistrail.pipeline import Pipeline
+    (v1, v2, m_pairs, m_heuristic, v1_only, v2_only, param_changes, \
+         c_pairs, c_heuristic, c1_only, c2_only) = \
+         vistrails.db.services.vistrail.getWorkflowDiff(vt_pair_1, vt_pair_2, False)
+    Pipeline.convert(v1)
+    Pipeline.convert(v2)
+    return (v1, v2, m_pairs, m_heustric, v1_only, v2_only, param_changes,
+            c_pairs, c_heuristic, c1_only, c2_only)
+
+def getPathAsAction(vt, v1, v2, do_copy=False):
+    a = vistrails.db.services.vistrail.getPathAsAction(vt, v1, v2, do_copy)
+    Action.convert(a)
+    return a
+
+def fixActions(vt, v, actions):
+    return vistrails.db.services.vistrail.fixActions(vt, v, actions)
+
+def convert_operation_list(ops):
+    for op in ops:
+        if op.vtType == 'add':
+            AddOp.convert(op)
+        elif op.vtType == 'change':
+            ChangeOp.convert(op)
+        elif op.vtType == 'delete':
+            DeleteOp.convert(op)
+        else:
+            raise TypeError("Unknown operation type '%s'" % op.vtType)
+
+def create_action(action_list):
+    """create_action(action_list: list) -> Action
+    where action_list is a list of tuples
+     (
+      type, 
+      object, 
+      parent_type=None,
+      parent_id=None,
+      new_obj=None
+     )
+    and the method returns a *single* action that accomplishes all 
+    of the operations.
+
+    Examples: create_action([('add', module1), ('delete', connection2)]
+              create_action([('add', param1, 'function', function1),
+                             ('change', old_func, new_func, 'module', m1)])
+    Note that create_action([('add', module)]) adds a module and *all* of its
+    children.
+    """
+    action = vistrails.db.services.action.create_action(action_list)
+    Action.convert(action)
+    return action
+    
+def create_add_op_chain(object, parent=(None, None)):
+    """create_add_op_chain(object: object, 
+                           parent=(type : str, id : long)) -> [op]
+    where [op] is a list of operations to add the given object and its
+    children to a workflow.
+    """
+    ops = vistrails.db.services.action.create_add_op_chain(object, parent)
+    convert_operation_list(ops)
+    return ops
+
+def create_change_op_chain(old_obj, new_obj, parent=(None,None)):
+    """create_change_op_chain(old_obj: object, new_obj: object, 
+                              parent=(type : str, id : long)) -> [op]
+    where [op] is a list of operations to change the given object and its
+    children to the new object in a workflow.
+    """
+    ops = vistrails.db.services.action.create_change_op_chain(old_obj, new_obj, parent)
+    convert_operation_list(ops)
+    return ops
+
+def create_delete_op_chain(object, parent=(None, None)):
+    """create_delete_op_chain(object: object, 
+                              parent=(type : str, id : long)) -> [op]
+    where [op] is a list of operations to delete the given object and its
+    children from a workflow.
+    """
+    ops = vistrails.db.services.action.create_delete_op_chain(object, parent)
+    convert_operation_list(ops)
+    return ops
+
+def create_temp_folder(prefix='vt_save'):
+    return vistrails.db.services.io.create_temp_folder(prefix=prefix)
+
+def remove_temp_folder(temp_dir):
+    vistrails.db.services.io.remove_temp_folder(temp_dir)
diff --git a/vistrails/core/db/locator.py b/vistrails/core/db/locator.py
new file mode 100644
index 0000000..7a54f0c
--- /dev/null
+++ b/vistrails/core/db/locator.py
@@ -0,0 +1,760 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import base64
+import getpass
+import os.path
+from vistrails.core import get_vistrails_application
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core.system import vistrails_default_file_type, get_elementtree_library, \
+                        default_connections_file, vistrails_examples_directory
+from vistrails.core.external_connection import ExtConnectionList, DBConnection
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core import debug
+from vistrails.db.services.locator import XMLFileLocator as _XMLFileLocator, \
+    DBLocator as _DBLocator, ZIPFileLocator as _ZIPFileLocator, \
+    BaseLocator as _BaseLocator, UntitledLocator as _UntitledLocator
+from vistrails.db.services.io import SaveBundle, test_db_connection
+from vistrails.db import VistrailsDBException
+from vistrails.db.domain import DBWorkflow
+ElementTree = get_elementtree_library()
+
+class BaseLocator(_BaseLocator):
+    @staticmethod
+    def convert_locator(locator):
+        if locator.__class__ == _XMLFileLocator:
+            locator.__class__ = XMLFileLocator
+        elif locator.__class__ == _ZIPFileLocator:
+            locator.__class__ = ZIPFileLocator
+        elif locator.__class__ == _DBLocator:
+            DBLocator.convert(locator)
+        elif locator.__class__ == _UntitledLocator:
+            locator.__class__ = UntitledLocator
+            
+    @staticmethod
+    def from_url(url):
+        locator = _BaseLocator.from_url(url)
+        BaseLocator.convert_locator(locator)
+        return locator
+
+class CoreLocator(object):
+    @staticmethod
+    def prompt_autosave(parent_widget):
+        pass # Opens a dialog that prompts the user if they want to
+             # use temporaries
+
+
+    @staticmethod
+    def load_from_gui(parent_widget, obj_type):
+        pass # Opens a dialog that the user will be able to use to
+             # show the right values, and returns a locator suitable
+             # for loading a file
+
+    @staticmethod
+    def save_from_gui(parent_widget, obj_type, locator):
+        pass # Opens a dialog that the user will be able to use to
+             # show the right values, and returns a locator suitable
+             # for saving a file
+
+    def update_from_gui(self, klass=None):
+        pass
+
+    # FIXME Need to do some more intelligent conversions anywhere this
+    # function gets called
+    @staticmethod
+    def get_convert_klass(vt_type):
+        from vistrails.core.vistrail.vistrail import Vistrail
+        from vistrails.core.vistrail.pipeline import Pipeline
+        from vistrails.core.log.log import Log
+        from vistrails.core.modules.module_registry import ModuleRegistry
+        from vistrails.core.log.opm_graph import OpmGraph
+        
+        klass_map = {Vistrail.vtType: Vistrail,
+                     Pipeline.vtType: Pipeline,
+                     Log.vtType: Log,
+                     ModuleRegistry.vtType: ModuleRegistry,
+                     OpmGraph.vtType: OpmGraph}
+        return klass_map[vt_type]
+
+class UntitledLocator(_UntitledLocator, CoreLocator):
+    def load(self, klass=None):
+        from vistrails.core.vistrail.vistrail import Vistrail
+        if klass is None:
+            klass = Vistrail
+        obj = _UntitledLocator.load(self, klass.vtType)
+        klass.convert(obj)
+        obj.locator = self
+        return obj
+
+class XMLFileLocator(_XMLFileLocator, CoreLocator):
+
+    def __init__(self, filename, **kwargs):
+        _XMLFileLocator.__init__(self, filename, **kwargs)
+        
+    def load(self, klass=None):
+        from vistrails.core.vistrail.vistrail import Vistrail
+        if klass is None:
+            klass = Vistrail
+        obj = _XMLFileLocator.load(self, klass.vtType)
+        klass.convert(obj)
+        obj.locator = self
+        return obj
+
+    def save(self, obj):
+        is_bundle = False
+        if type(obj) == type(SaveBundle(None)):
+            is_bundle = True
+            save_bundle = obj
+            obj = save_bundle.get_primary_obj()
+        klass = obj.__class__
+        obj = _XMLFileLocator.save(self, obj, False)
+        klass.convert(obj)
+        obj.locator = self
+        if is_bundle:
+            return SaveBundle(save_bundle.bundle_type, obj)
+        return obj
+
+    def save_as(self, obj, version=None):
+        is_bundle = False
+        if type(obj) == type(SaveBundle(None)):
+            is_bundle = True
+            save_bundle = obj
+            obj = save_bundle.get_primary_obj()
+        klass = obj.__class__
+        obj = _XMLFileLocator.save(self, obj, True, version)
+        klass.convert(obj)
+        obj.locator = self
+        if is_bundle:
+            return SaveBundle(save_bundle.bundle_type, obj)
+        return obj
+
+    ##########################################################################
+
+    def __eq__(self, other):
+        if not isinstance(other, XMLFileLocator):
+            return False
+        return self._name == other._name
+
+    ##########################################################################
+
+    @staticmethod
+    def prompt_autosave(parent_widget):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_autosave_prompt(parent_widget)
+        
+    @staticmethod
+    def load_from_gui(parent_widget, obj_type):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_load_file_locator_from_gui(parent_widget, obj_type)
+
+    @staticmethod
+    def save_from_gui(parent_widget, obj_type, locator=None):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_save_file_locator_from_gui(parent_widget, obj_type,
+                                                         locator)
+
+#    def update_from_gui(self, parent_widget, klass=None):
+#        from core.vistrail.vistrail import Vistrail
+#        if klass is None:
+#            klass = Vistrail
+#        import gui.extras.core.db.locator as db_gui
+#        return db_gui.get_load_file_locator_from_gui(parent_widget, klass.vtType)
+
+class DBLocator(_DBLocator, CoreLocator):
+    class getKeyChain(object):
+        def set_key(self, key, passwd):
+            get_vistrails_application().keyChain.set_key(key,passwd)
+        
+        def get_key(self, key):
+            return get_vistrails_application().keyChain.get_key(key)
+    
+    keyChain = getKeyChain()
+    
+    def __init__(self, host, port, database, user, passwd, name=None,
+                 **kwargs):
+        _DBLocator.__init__(self, host, port, database, user, passwd, name,
+                            **kwargs)
+        self.__list = ExtConnectionList.getInstance(default_connections_file())
+        self.ext_connection_id = -1
+
+    def load(self, klass=None):
+        from vistrails.core.vistrail.vistrail import Vistrail
+        if klass is None:
+            klass = Vistrail
+        save_bundle = _DBLocator.load(self, klass.vtType, ThumbnailCache.getInstance().get_directory())
+        if klass.vtType == DBWorkflow.vtType:
+            wf = save_bundle
+            klass = self.get_convert_klass(wf.vtType)
+            klass.convert(wf)
+            wf.locator = self
+            return wf
+        for obj in save_bundle.get_db_objs():
+            klass = self.get_convert_klass(obj.vtType)
+            klass.convert(obj)
+            obj.locator = self
+        return save_bundle
+
+    def save(self, save_bundle):
+        save_bundle = _DBLocator.save(self, save_bundle, False)
+        for obj in save_bundle.get_db_objs():
+            klass = self.get_convert_klass(obj.vtType)
+            klass.convert(obj)
+            obj.locator = self
+        return save_bundle
+
+    def save_as(self, save_bundle, version=None):
+        save_bundle = _DBLocator.save(self, save_bundle, True, version)
+        for obj in save_bundle.get_db_objs():
+            klass = self.get_convert_klass(obj.vtType)
+            klass.convert(obj)
+            obj.locator = self
+        # Need to copy images into thumbnail cache directory so references
+        # won't become invalid if they are in a temp dir that gets destroyed
+        # when the previous locator is closed
+        import shutil
+        thumb_cache = ThumbnailCache.getInstance()
+        thumb_cache_dir = thumb_cache.get_directory()
+        new_thumbnails = []
+        for thumbnail in save_bundle.thumbnails:
+            if os.path.dirname(thumbnail) == thumb_cache_dir:
+                new_thumbnails.append(thumbnail)
+            else:
+                cachedir_thumbnail = os.path.join(thumb_cache_dir, os.path.basename(thumbnail))
+                try:
+                    shutil.copyfile(thumbnail, cachedir_thumbnail)
+                    new_thumbnails.append(cachedir_thumbnail)
+                except Exception, e:
+                    debug.critical('copying %s -> %s failed: %s' % \
+                                       (thumbnail, cachedir_thumbnail, str(e)))
+        save_bundle.thumbnails = new_thumbnails
+        # Need to update thumbnail cache in case some references have changed
+        thumb_cache.add_entries_from_files(save_bundle.thumbnails)
+        return save_bundle
+
+    def update_from_gui(self, parent_widget, klass=None):
+        from vistrails.core.vistrail.vistrail import Vistrail
+        import vistrails.gui.extras.core.db.locator as db_gui
+        if klass is None:
+            klass = Vistrail
+        config = self.find_connection_info(self._host, self._port, self._db) 
+        if config is None or config['succeeded']==False:
+            config = db_gui.get_db_connection_from_gui(parent_widget,
+                                                       -1,
+                                                       "",
+                                                       self._host,
+                                                       self._port,
+                                                       self._user,
+                                                       self._passwd,
+                                                       self._db)
+        
+        if config is not None and config['succeeded'] == True:
+            self._host = config['host']
+            self._port = config['port']
+            self._db = config['db']
+            self._user = config['user']
+            self._passwd = config['passwd']
+            self.ext_connection_id = self.set_connection_info(**config)
+            return True
+        
+        return False
+    
+    def update_from_console(self):
+        config = self.find_connection_info(self._host, self._port, self._db)
+        
+        if config is None:
+            # the problem here is if VisTrails is being run through command
+            # line from LaTex, stdout is being redirected to a log file, so
+            # the user does not see the prompt in raw_input. getpass uses the 
+            # controlling terminal so it works fine. Just to make sure he sees 
+            # the first message prompt we will the controlling terminal
+            try:
+                f= open('/dev/tty', 'w')
+                f.write("\nConnect to db with username [%s]: "%self._user)
+                f.close()
+                user = raw_input()
+            except:
+                debug.warning("Couldn't write to terminal. Will try stdout")
+                user = raw_input("Connecting to db with username[%s]: "%self._user)
+            try:
+                if user != '':
+                    self._user = user
+                passwd = getpass.getpass("password:")
+                self._passwd = passwd
+                config = {'host': self._host,
+                          'port': int(self._port),
+                          'user': self._user,
+                          'passwd': self._passwd,
+                          'db': self._db
+                          }
+                test_db_connection(config)
+                config['succeeded'] = True
+                config['name'] = '%s@%s'%(self._user,self._host)
+                config['id'] = -1
+            except VistrailsDBException, e:
+                debug.critical('VisTrails DB Exception',  str(e))
+                config['succeeded'] = False
+            except Exception, e2:
+                debug.critical('VisTrails Exception', str(e2))
+                config['succeeded'] = False
+        if config is not None:
+            if config['succeeded'] == False:
+                passwd = getpass.getpass("\nVisTrails DB password for user %s:"%config['user'])
+                self._user = config['user']
+                self._passwd = passwd
+                dbconfig = {'host': self._host,
+                          'port': int(self._port),
+                          'user': self._user,
+                          'passwd': self._passwd,
+                          'db': self._db
+                          }
+                try:
+                    test_db_connection(dbconfig)
+                    config['succeeded'] = True
+                    config['passwd'] = self._passwd
+                except VistrailsDBException, e:
+                    debug.critical('VisTrails DB Exception',  str(e))
+                    config['succeeded'] = False
+            
+            if config['succeeded'] == True:
+                self._host = config['host']
+                self._port = config['port']
+                self._db = config['db']
+                self._user = config['user']
+                self._passwd = config['passwd']
+                self.ext_connection_id = self.set_connection_info(**config)
+                return True
+            return False
+        return False
+        
+    def find_connection_info(self, host, port, db):
+        """find_connection_info(host:str, port: int, db: str) -> dict
+        Returns complete info of a connection with the given parameters
+
+        """
+        id = self.__list.find_db_connection(host,port,db)
+        if id != -1:
+            return self.get_connection_info(id)
+        else:
+            return None
+    
+    def get_connection_info(self, id):
+        """get_connection_info(id: int) -> dict
+        Returns info of ExtConnection """
+        conn = self.__list.get_connection(id)
+        if conn != None:
+            succeeded = False
+            key = str(conn.id) + "." + conn.name + "." + conn.host
+            passwd = DBLocator.keyChain.get_key(key)
+            config = {'host': conn.host,
+                      'port': conn.port,
+                      'user': conn.user,
+                      'passwd': passwd}
+            try:
+                test_db_connection(config)
+                succeeded = True
+            except VistrailsDBException:
+                succeeded = False
+                
+            config['id'] = conn.id
+            config['name'] = conn.name
+            config['db'] = conn.database
+            config['succeeded'] = succeeded
+        else:
+            config = None
+        return config
+    
+    def set_connection_info(self, *args, **kwargs):
+        """set_connection_info(id: int, name: str, host: str, port:int,
+                     user:str, passwd:str, db:str) -> None
+        If the connection exists it will update it, else it will add it
+
+        """
+        if kwargs.has_key("id"):
+            id = kwargs["id"]
+        if kwargs.has_key("name"):
+            name = kwargs["name"]
+        if kwargs.has_key("host"):
+            host = kwargs["host"]
+        if kwargs.has_key("port"):
+            port = kwargs["port"]
+        if kwargs.has_key("user"):
+            user = kwargs["user"]
+        if kwargs.has_key("passwd"):
+            passwd = kwargs["passwd"]
+        if kwargs.has_key("db"):
+            db = kwargs["db"]
+
+        conn = DBConnection(id=id,
+                            name=name,
+                            host=host,
+                            port=port,
+                            user=user,
+                            passwd='',
+                            database=db,
+                            dbtype='MySQL')
+        
+        if self.__list.has_connection(id):   
+            self.__list.set_connection(id,conn)
+        else:
+            if conn.id == -1:
+                conn.id = self.__list.get_fresh_id()
+            self.__list.add_connection(conn)
+        key = str(conn.id) + "." + conn.name + "." + conn.host
+        DBLocator.keyChain.set_key(key,passwd)
+        return conn.id
+    
+    ##########################################################################
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        return (self._host == other._host and
+                self._port == other._port and
+                self._db == other._db and
+                self._user == other._user and
+                #self._name == other._name and
+                long(self._obj_id) == long(other._obj_id) and
+                self._obj_type == other._obj_type)
+
+    ##########################################################################
+
+    @staticmethod
+    def prompt_autosave(parent_widget):
+        return True
+
+    @staticmethod
+    def load_from_gui(parent_widget, obj_type):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_load_db_locator_from_gui(parent_widget, obj_type)
+
+    @staticmethod
+    def save_from_gui(parent_widget, obj_type, locator=None):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_save_db_locator_from_gui(parent_widget, obj_type,
+                                                   locator)
+
+    @staticmethod
+    def from_xml(node, include_name=False):
+        locator = _DBLocator.from_xml(node, include_name)
+        locator.__class__ = DBLocator
+        return locator
+    
+    @staticmethod
+    def convert(locator):
+        locator.__class__ = DBLocator
+        locator.__list = ExtConnectionList.getInstance(
+                                                   default_connections_file())
+
+class ZIPFileLocator(_ZIPFileLocator, CoreLocator):
+
+    def __init__(self, filename, **kwargs):
+        _ZIPFileLocator.__init__(self, filename, **kwargs)
+
+    def load(self, klass=None):
+        from vistrails.core.vistrail.vistrail import Vistrail
+        if klass is None:
+            klass = Vistrail
+        save_bundle = _ZIPFileLocator.load(self, klass.vtType)
+        for obj in save_bundle.get_db_objs():
+            klass = self.get_convert_klass(obj.vtType)
+            klass.convert(obj)
+            obj.locator = self
+        return save_bundle
+
+    def save(self, save_bundle):
+        save_bundle = _ZIPFileLocator.save(self, save_bundle, False)
+        for obj in save_bundle.get_db_objs():
+            klass = self.get_convert_klass(obj.vtType)
+            klass.convert(obj)
+            obj.locator = self
+        return save_bundle
+
+    def save_as(self, save_bundle, version=None):
+        save_bundle = _ZIPFileLocator.save(self, save_bundle, True, version)
+        for obj in save_bundle.get_db_objs():
+            klass = self.get_convert_klass(obj.vtType)
+            klass.convert(obj)
+            obj.locator = self
+        # Need to update thumbnail cache since files have moved
+        ThumbnailCache.getInstance().add_entries_from_files(save_bundle.thumbnails)
+        return save_bundle
+
+    ##########################################################################
+
+    def __eq__(self, other):
+        if not isinstance(other, ZIPFileLocator):
+            return False
+        return self._name == other._name
+
+    ##########################################################################
+
+    @staticmethod
+    def prompt_autosave(parent_widget):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_autosave_prompt(parent_widget)
+
+    @staticmethod
+    def load_from_gui(parent_widget, obj_type):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_load_file_locator_from_gui(parent_widget, obj_type)
+
+    @staticmethod
+    def save_from_gui(parent_widget, obj_type, locator=None):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_save_file_locator_from_gui(parent_widget, obj_type,
+                                                         locator)
+
+class FileLocator(CoreLocator):
+    def __new__(self, filename=None, **kwargs):
+        if filename:
+            if filename.endswith('.vt'):
+                return ZIPFileLocator(filename, **kwargs)
+            elif filename.endswith('.vtl'):
+                return FileLocator.from_link_file(filename)
+            else:
+                return XMLFileLocator(filename, **kwargs)
+        else:
+            #return class based on default file type
+            if vistrails_default_file_type() == '.vt':
+                return ZIPFileLocator
+            else:
+                return XMLFileLocator
+
+    @staticmethod
+    def prompt_autosave(parent_widget):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_autosave_prompt(parent_widget)
+    
+    @staticmethod
+    def load_from_gui(parent_widget, obj_type):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_load_file_locator_from_gui(parent_widget, obj_type)
+
+    @staticmethod
+    def save_from_gui(parent_widget, obj_type, locator=None):
+        import vistrails.gui.extras.core.db.locator as db_gui
+        return db_gui.get_save_file_locator_from_gui(parent_widget, obj_type,
+                                                         locator)
+
+    @staticmethod
+    def parse(element):
+        """ parse(element) -> XMLFileLocator
+        Parse an XML object representing a locator and returns an
+        XMLFileLocator or a ZIPFileLocator object.
+
+        """
+        if str(element.getAttribute('type')) == 'file':
+            for n in element.childNodes:
+                if n.localName == "name":
+                    filename = str(n.firstChild.nodeValue).strip(" \n\t")
+                    return FileLocator(filename)
+            return None
+        else:
+            return None
+    
+    #ElementTree port
+    @staticmethod
+    def from_xml(node):
+        """from_xml(node:ElementTree.Element) -> XMLFileLocator or None
+        Parse an XML object representing a locator and returns a
+        XMLFileLocator or a ZIPFileLocator object."""
+        if node.tag != 'locator':
+            return None
+        type_ = node.get('type', '')
+        if str(type_) == 'file':
+            for child in node.getchildren():
+                if child.tag == 'name':
+                    filename = child.text.encode('latin-1').strip()
+                    return FileLocator(filename)
+        return None
+    
+    @staticmethod
+    def from_link_file(filename):
+        """from_link_file(filename: str) -> DBLocator
+        This will parse a '.vtl' file and  will create a DBLocator. .vtl files
+        are vistrail link files and they are used to point vistrails to open
+        vistrails from the database on the web. """
+        def convert_from_str(value,type):
+            def bool_conv(x):
+                s = str(x).upper()
+                if s == 'TRUE':
+                    return True
+                if s == 'FALSE':
+                    return False
+            
+            if value is not None:
+                if type == 'str':
+                    return str(value)
+                elif value.strip() != '':
+                    if type == 'long':
+                        return long(value)
+                    elif type == 'float':
+                        return float(value)
+                    elif type == 'int':
+                        return int(value)
+                    elif type == 'bool':
+                        return bool_conv(value)
+                    elif type == 'base64':
+                        return base64.b64decode(value)
+            return None
+        
+        def guess_extension_from_contents(contents):
+            if contents.startswith("<vistrail"):
+                return ".xml"
+            else:
+                return ".vt"
+            
+        tree = ElementTree.parse(filename)
+        node = tree.getroot()
+        if node.tag != 'vtlink':
+            return None
+        #read attributes
+        data = node.get('host', None)
+        host = convert_from_str(data, 'str')
+        data = node.get('port', None)
+        port = convert_from_str(data,'int')
+        data = node.get('database', None)
+        database = convert_from_str(data,'str')
+        data = node.get('vtid')
+        vt_id = convert_from_str(data, 'int')
+        data = node.get('version')
+        version = convert_from_str(data, 'str')
+        data = node.get('tag')
+        tag = convert_from_str(data, 'str')
+        data = node.get('execute')
+        execute = convert_from_str(data, 'bool')
+        data = node.get('showSpreadsheetOnly')
+        showSpreadsheetOnly = convert_from_str(data, 'bool')
+        data = node.get('url', None)
+        url = convert_from_str(data,'str')
+        data = node.get('vtcontent', None)
+        vtcontent = convert_from_str(data,'base64')
+        data = node.get('filename', None)
+        vtname = convert_from_str(data, 'str')
+        data = node.get('forceDB',None)
+        forceDB = convert_from_str(data,'bool')
+        data = node.get('mashuptrail', None)
+        mashuptrail = convert_from_str(data, 'str')
+        data = node.get('mashupVersion', None)
+        mashupVersion = convert_from_str(data, 'int')
+        data = node.get('parameterExploration', None)
+        parameterExploration = convert_from_str(data, 'int')
+        
+        #if execute is False, we will show the builder too
+        if showSpreadsheetOnly and not execute:
+            showSpreadsheetOnly = False
+        try:
+            version = int(version)
+        except:
+            pass
+
+        if tag is None:
+            tag = '';
+            
+        ## execute and showSpreadsheetOnly should be written to the current
+        ## configuration
+        config = get_vistrails_configuration()
+        config.executeWorkflows = execute
+        config.showSpreadsheetOnly = showSpreadsheetOnly
+        if not forceDB:
+            if vtcontent is not None:
+                if url is not None:
+                    basename = url.split('/')[-1]
+                    base,ext = os.path.splitext(basename)
+                    dirname = os.path.dirname(filename)
+                    fname = os.path.join(dirname,basename)
+                else:
+                    basename = os.path.basename(filename)
+                    base,ext = os.path.splitext(basename)
+                    ext = guess_extension_from_contents(vtcontent)
+                    dirname = os.path.dirname(filename)
+                    fname = os.path.join(dirname,"%s%s"%(base,ext))
+                create_file = True
+                if os.path.exists(fname): #file was extracted before
+                    create_file = False
+                    oldf = open(fname)
+                    oldcontents = oldf.read()
+                    if oldcontents != vtcontent:
+                        import vistrails.gui.extras.core.db.locator as db_gui
+                        (overwrite, newname) = \
+                                 db_gui.ask_to_overwrite_file(None, 'vistrail')
+                        create_file = True
+                        if newname:
+                            fname = newname
+                        elif overwrite == False:
+                            i=1
+                            while os.path.exists(fname):
+                                newbase = "%s_%s%s" % (base, i, ext)
+                                fname = os.path.join(dirname,newbase)
+                                i+=1
+                        
+                if create_file:
+                    f = open(fname,'wb')
+                    f.write(vtcontent)
+                    f.close()
+                return FileLocator(fname, version_node=version, version_tag=tag,
+                                   mashuptrail=mashuptrail,
+                                   mashupVersion=mashupVersion,
+                                   parameterExploration=parameterExploration)
+        if host is not None:
+            user = ""
+            passwd = ""
+            
+            return DBLocator(host, port, database,
+                             user, passwd, None, obj_id=vt_id,
+                             obj_type='vistrail',connection_id=None,
+                             version_node=version, version_tag=tag,
+                             mashuptrail=mashuptrail,
+                             mashupVersion=mashupVersion,
+                             parameterExploration=parameterExploration)
+        elif vtname is not None:
+            if os.path.dirname(vtname) == '':
+                #check if file exists in the same directory as the .vtl file
+                dirname = os.path.dirname(filename)
+                newvtname = os.path.join(dirname,vtname)
+                if os.path.exists(newvtname):
+                    vtname = newvtname
+            #check for magic strings
+            if "@examples" in vtname:
+                vtname=vtname.replace("@examples", vistrails_examples_directory())
+            return FileLocator(vtname, version_node=version, version_tag=tag,
+                               mashuptrail=mashuptrail,
+                               mashupVersion=mashupVersion,
+                               parameterExploration=parameterExploration)
+        
+        
+    ##########################################################################
+
+def untitled_locator():
+    return UntitledLocator()
diff --git a/vistrails/core/debug.py b/vistrails/core/debug.py
new file mode 100644
index 0000000..d48826b
--- /dev/null
+++ b/vistrails/core/debug.py
@@ -0,0 +1,314 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import logging
+import logging.handlers
+import inspect
+import os
+import os.path
+import re
+import time
+import vistrails.core
+
+# from core.utils import VersionTooLow
+# from core import system
+
+################################################################################
+
+_warningformat = re.compile(
+        '^(.+):'
+        '([0-9]+): '
+        '([A-Za-z_][A-Za-z0-9_]*): '
+        '((?:.|\n)+)$')
+
+class EmitWarnings(logging.Handler):
+    """A logging Handler that re-logs warning messages in our log format.
+
+    This parses the warnings logged by the standard `warnings` module and
+    writes them to the given logger at level WARNING in the format we use
+    (see DebugPrint#message()).
+    """
+    def __init__(self, logger):
+        logging.Handler.__init__(self)
+        self.logger = logger
+
+    def emit(self, record):
+        # Here we basically do the contrary of warnings:formatwarning()
+        m = _warningformat.match(record.args[0])
+        if m == None:
+            self.logger.warning("(File info not available)\n" +
+                           record.args[0])
+        else:
+            filename, lineno, category, message = m.groups()
+            # And here we do self.message()
+            self.logger.warning('%s, line %s\n%s: %s' % (filename, lineno,
+                                                    category, message))
+
+################################################################################
+
+class DebugPrint:
+    """ Class to be used for debugging information.
+
+    Verboseness can be set in the following way:
+        - DebugPrint.CRITICAL
+            Only critical messages will be shown
+        - DebugPrint.WARNING
+            Warnings and critical messages will be shown (default)
+        - DebugPrint.INFO
+            Information, warning and Critical messages will be shown (verbose)
+        - DebugPrint.DEBUG
+            All logging messages will be shown (extra verbose)
+
+    It uses information such as file name and line number only when printing
+    to files and consoles, a stream can be registered to be used in gui.debug.
+    Also, it goes up only one level in the traceback stack,
+    so it will only get information of who called the DebugPrint functions.
+
+    Example of usage:
+        >>> from core import debug
+        >>> debug.DebugPrint.getInstance().set_message_level(
+                    debug.DebugPrint.WARNING)
+        # the following messages will be shown
+        >>> debug.critical('This is an error message')
+        >>> debug.warning('This is a warning message')
+        # only warnings and above are shown
+        >>> debug.log('This is a log message and it will not be shown')
+
+    """
+    (CRITICAL, WARNING, INFO, DEBUG) = (logging.CRITICAL,
+                                       logging.WARNING,
+                                       logging.INFO,
+                                       logging.DEBUG) # python logging levels
+    #Singleton technique
+    _instance = None
+    class DebugPrintSingleton():
+        def __call__(self, *args, **kw):
+            if DebugPrint._instance is None:
+                obj = DebugPrint(*args, **kw)
+                DebugPrint._instance = obj
+            return DebugPrint._instance
+
+    getInstance = DebugPrintSingleton()
+
+    def make_logger(self, f=None):
+        self.fhandler = None
+        """self.make_logger_240(file) -> logger. Creates a logging object to
+        be used within the DebugPrint class that sends the debugging
+        output to file.
+        We will configure log so it outputs to both stderr and a file.
+
+        """
+        # Setup root logger
+        self.logger = logging.getLogger('VisLog')
+        self.logger.setLevel(logging.DEBUG)
+        self.format = logging.Formatter("%(asctime)s %(levelname)s:\n%(message)s")
+
+        # Setup warnings logger
+        if hasattr(logging, 'captureWarnings'):
+            wlogger = logging.getLogger('py.warnings')
+            wlogger.propagate = False
+            wlogger.addHandler(EmitWarnings(self.logger))
+            logging.captureWarnings(True)
+
+        # first we define a handler for logging to a file
+        if f:
+            self.set_logfile(f)
+
+        #then we define a handler to log to the console
+        self.console = logging.StreamHandler()
+        self.console.setFormatter(self.format)
+        self.console.setLevel(logging.WARNING)
+        self.logger.addHandler(self.console)
+
+#    if system.python_version() <= (2,4,0,'',0):
+#        raise VersionTooLow('Python', '2.4.0')
+
+    def __init__(self):
+        self.make_logger()
+        self.app = None
+
+    def set_logfile(self, f):
+        """set_logfile(file) -> None. Redirects debugging
+        output to file."""
+        if f is None:
+            if self.fhandler:
+                self.logger.removeHandler(self.fhandler)
+                self.fhandler = None
+            return
+
+        def rotate_file_if_necessary(filename):
+            statinfo = os.stat(filename)
+            if statinfo.st_size > 1024*1024:
+                #rotate file
+                mincount = 1
+                maxcount = 5
+                count = maxcount
+                newfile = "%s.%s"%(filename, count)
+                while not os.path.exists(newfile) and count >= mincount:
+                    count = count - 1
+                    newfile = "%s.%s"%(filename, count)
+                if count == 5:
+                    os.unlink("%s.%s"%(filename, count))
+                    count = 4
+                while count >= mincount:
+                    os.rename("%s.%s"%(filename, count), "%s.%s"%(filename, count+1))
+                    count = count -1
+                os.rename(filename, "%s.%s"%(filename, mincount))
+
+        try:
+            # there's a problem on Windows with RotatingFileHandler and that
+            # happens when VisTrails starts child processes (it seems related
+            # to the way Windows manages file handlers)
+            # see http://bugs.python.org/issue4749
+            # in this case we will deal with log files differently on Windows:
+            # we will check if we need to rotate the file at the beginning of
+            # the session.
+            import vistrails.core.system
+            if vistrails.core.system.systemType in ["Windows", "Microsoft"]:
+                if not os.path.exists(f):
+                    open(f,'w').close()
+                rotate_file_if_necessary(f)
+                handler = logging.FileHandler(f)
+            else:
+                handler = logging.handlers.RotatingFileHandler(f, maxBytes=1024*1024,
+                                                               backupCount=5)
+            handler.setFormatter(self.format)
+            handler.setLevel(logging.DEBUG)
+            if self.fhandler:
+                self.logger.removeHandler(self.fhandler)
+            self.fhandler = handler
+            self.logger.addHandler(handler)
+
+        except Exception, e:
+            self.critical("Could not set log file %s: %s"%(f,str(e)))
+
+    def set_message_level(self,level):
+        """self.set_message_level(level) -> None. Sets the logging
+        verboseness.  level must be one of (DebugPrint.CRITICAL,
+        DebugPrint.WARNING, DebugPrint.INFO, DebugPrint.DEBUG)."""
+        self.console.setLevel(level)
+
+    def register_splash(self, app):
+        """ register_splash(self, classname)
+        Registers a method splashMessage(message)
+        """
+        self.app = app
+
+    def splashMessage(self, msg):
+        """ splashMessage(self, string)
+        Writes a splashmessage if app is registered
+        """
+        if self.app:
+            self.app.splashMessage(msg)
+
+    def message(self, caller, msg, details=''):
+        """self.message(caller, str, str) -> str. Returns a string with a
+        formatted message to be send to the debugging output. This
+        should not be called explicitly from userland. Consider using
+        self.log(), self.warning() or self.critical() instead."""
+        msg = (msg + '\n' + details) if details else msg
+        source = inspect.getsourcefile(caller)
+        line = caller.f_lineno
+        if source and line:
+            return source + ", line " + str(line) + "\n" + msg
+        else:
+            return "(File info not available)\n" + msg
+
+    def debug(self, msg, details = ''):
+        """self.log(str, str) -> None. Send information message (low
+        importance) to log with appropriate call site information."""
+        caller = inspect.currentframe().f_back # who called us?
+        self.logger.debug(self.message(caller, msg, details))
+
+    def log(self, msg, details = ''):
+        """self.log(str, str) -> None. Send information message (low
+        importance) to log with appropriate call site information."""
+        caller = inspect.currentframe().f_back # who called us?
+        self.logger.info(self.message(caller, msg, details))
+
+    def warning(self, msg, details = ''):
+        """self.warning(str, str) -> None. Send warning message (medium
+        importance) to log with appropriate call site information."""
+        caller = inspect.currentframe().f_back # who called us?
+        self.logger.warning(self.message(caller, msg, details))
+
+    def critical(self, msg, details = ''):
+        """self.critical(str, str) -> None. Send critical message (high
+        importance) to log with appropriate call site information."""
+        caller = inspect.currentframe().f_back # who called us?
+        self.logger.critical(self.message(caller, msg, details))
+
+splashMessage = DebugPrint.getInstance().splashMessage
+critical = DebugPrint.getInstance().critical
+warning  = DebugPrint.getInstance().warning
+log      = DebugPrint.getInstance().log
+debug    = DebugPrint.getInstance().debug
+
+#   critical: terminal, messagebox
+#   warning: terminal
+#   log : shown if -V 1
+#   debug : shown if -V 2
+
+################################################################################
+
+def timecall(method):
+    """timecall is a method decorator that wraps any call in timing calls
+    so we get the total time taken by a function call as a debugging message."""
+    def call(self, *args, **kwargs):
+        caller = inspect.currentframe().f_back
+        start = time.time()
+        method(self, *args, **kwargs)
+        end = time.time()
+        critical("time: %.5s" % (end-start))
+    call.__doc__ = method.__doc__
+    return call
+
+################################################################################
+
+def object_at(desc):
+    """object_at(id) -> object
+
+    id is an int returning from id() or a hex string of id()
+
+    Fetches all live objects, finds the one with given id, and returns
+    it.  Warning: THIS IS FOR DEBUGGING ONLY. IT IS SLOW."""
+    if isinstance(desc, int):
+        target_id = desc
+    elif isinstance(desc, basestring):
+        target_id = int(desc, 16) # Reads desc as the hex address
+    import gc
+    for obj in gc.get_objects():
+        if id(obj) == target_id:
+            return obj
+    raise KeyError("Couldn't find object")
diff --git a/vistrails/core/external_connection.py b/vistrails/core/external_connection.py
new file mode 100644
index 0000000..277e18b
--- /dev/null
+++ b/vistrails/core/external_connection.py
@@ -0,0 +1,350 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains classes related to loading and saving a set of
+connection objects to an XML file.
+It defines the following
+classes:
+ - ExtConnection
+ - DBConnection
+ - ExtConnectionList
+"""
+import os
+import tempfile
+import unittest
+
+from vistrails.core.utils import VistrailsInternalError, abstract
+from vistrails.core.utils.enum import enum
+from vistrails.core.utils.uxml import named_elements, XMLWrapper
+################################################################################
+
+ConnectionType = enum('ConnectionType',
+                      ['DB', 'HTTP', 'Unknown'],
+                      "Enumeration of Connection Types")
+
+class ExtConnection(object):
+    """Stores Information for an External Connection"""
+    parseDispatch = {}
+    
+    def __init__(self, id=-1, name='', host='', type=ConnectionType.Unknown):
+        """__init__(id: int,  name: str, host: str, type: ConnectionType)
+                    -> ExtConnection
+        It creates an external connection. Ignoring the connection type, every
+        connection should have at least a name, a hostname and an id """
+        self.id = id
+        self.name = name
+        self.host = host
+        self.type = type
+        
+    def serialize(self, dom, element):
+        abstract()
+
+    @staticmethod
+    def parse(element):
+        type = str(element.getAttribute('type'))
+        return ExtConnection.parseDispatch[type](element)
+
+class DBConnection(ExtConnection):
+    """Stores Information for Database Connection """
+    def __init__(self, id=-1, name='', host='', port=0, user='', passwd='',
+                 database='', dbtype=''):
+        """__init__(id: int,  name: str, host: str, port: int, username: str,
+                    passwd: str, database: str, type:ConnectionType)->DBConnection
+           It creates a DBConnection Object
+        """
+        ExtConnection.__init__(self, id, name, host, ConnectionType.DB)
+        self.port = port
+        self.user = user
+        self.passwd = passwd
+        self.database = database
+        self.dbtype = dbtype
+
+    def serialize(self, dom, element):
+        """serialize(dom, element) -> None
+        Convert this object to an XML representation.
+        """
+        conn = dom.createElement('connection')
+        conn.setAttribute('id', str(self.id))
+        conn.setAttribute('name', str(self.name))
+        conn.setAttribute('host', str(self.host))
+        conn.setAttribute('port',str(self.port))
+        conn.setAttribute('user', str(self.user))
+        conn.setAttribute('passwd', str(self.passwd))
+        conn.setAttribute('database', str(self.database))
+        conn.setAttribute('type', str(self.type))
+        conn.setAttribute('dbtype', str(self.dbtype))
+        element.appendChild(conn)
+
+    def __str__(self):
+        """ __str__() -> str - Writes itself as a string """ 
+        return """<<id= '%s' name='%s' type='%s' host='%s' 
+        user='%s' database='%s' dbtype='%s'>>""" %  (
+            self.id,
+            self.name,
+            self.type,
+            self.host,
+            self.user,
+            self.database,
+            self.dbtype)
+
+    @staticmethod
+    def parse(element):
+        """ parse(element) -> DBConnection
+        Parse an XML object representing a DBConnection and returns a
+        DBConnection object. 
+        
+        """
+        conn = DBConnection()
+        conn.type = ConnectionType.DB
+        conn.id = int(element.getAttribute('id'))
+        conn.name = str(element.getAttribute('name'))
+        conn.host = str(element.getAttribute('host'))
+        conn.port = int(element.getAttribute('port'))
+        conn.user = str(element.getAttribute('user'))
+        conn.passwd = str(element.getAttribute('passwd'))
+        conn.database = str(element.getAttribute('database'))
+        conn.dbtype = str(element.getAttribute('dbtype'))
+        return conn
+
+    def __eq__(self, other):
+        """ __eq__(other: DBConnection) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if other == None:
+            return False
+        if self.type != other.type:
+            return False
+        if self.id != other.id:
+            return False
+        if self.name != other.name:
+            return False
+        if self.host != other.host:
+            return False
+        if self.port != other.port:
+            return False
+        if self.user != other.user:
+            return False
+        if self.passwd != other.passwd:
+            return False
+        if self.database != other.database:
+            return False
+        if self.dbtype != other.dbtype:
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not (self == other)
+
+ExtConnection.parseDispatch[str(ConnectionType.DB)] = DBConnection.parse
+
+class ExtConnectionList(XMLWrapper):
+    """Class to store and manage a list of connections.
+
+    """
+    _instance = None
+    class ExtConnectionListSingleton(object):
+        def __call__(self, *args, **kw):
+            if ExtConnectionList._instance is None:
+                obj = ExtConnectionList(*args, **kw)
+                ExtConnectionList._instance = obj
+            return ExtConnectionList._instance
+    
+    getInstance = ExtConnectionListSingleton()
+    
+    def __init__(self, filename=''):
+        """ __init__() -> ExtConnectionList """
+        if not ExtConnectionList._instance:
+            self.__connections = {}
+            self.changed = False
+            self.current_id = 1
+            self.filename = filename
+            self.load_connections()
+            ExtConnectionList._instance = self
+        else:
+            raise RuntimeError, 'Only one instance of ExtConnectionList is \
+allowed!'
+
+    def load_connections(self):
+        """load_connections()-> None
+        Load connections from its internal filename
+
+        """
+        if os.path.exists(self.filename):
+            self.parse(self.filename)
+
+    def add_connection(self, conn):
+        """add_connection(conn: ExtConnection) -> None
+        Adds a connection to the list
+
+        """
+        if self.__connections.has_key(conn.id):
+            msg = "External Connection '%s' with repeated id" % conn.name
+            raise VistrailsInternalError(msg)
+        self.__connections[conn.id] = conn
+        self.current_id = max(self.current_id, conn.id+1)
+        self.serialize()
+
+    def get_connection(self, id):
+        """get_connection(id: int) -> ExtConnection
+        Returns connection object associated with id
+
+        """
+        if self.__connections.has_key(id):
+            return self.__connections[id]
+        else:
+            return None
+
+    def has_connection(self, id):
+        """has_connection(id: int) -> Boolean
+        Returns True if connection with id exists """
+        return self.__connections.has_key(id)
+
+    def find_db_connection(self, host, port, db):
+        """find_db_connection(host: str, port: int, db: str) -> id
+        Returns the id of the first connection that matches the provided
+        parameters. It will return -1 if not found
+
+        """
+        for conn in self.__connections.itervalues():
+            if conn.host == host and conn.port == port and conn.database == db:
+                return conn.id
+        return -1
+    
+    def set_connection(self, id, conn):
+        """set_connection(id: int, conn: ExtConnection)- > None
+        Updates the connection with id to be conn
+
+        """
+        if self.__connections.has_key(id):
+            self.__connections[id] = conn
+            self.serialize()
+            
+    def remove_connection(self, id):
+        """remove_connection(id: int) -> None 
+        Remove connection with id 'id'
+        
+        """
+        if self.__connections.has_key(id):
+            del self.__connections[id]
+            self.serialize()
+        
+    def clear(self):
+        """ clear() -> None 
+        Remove current connections """
+        self.__connections.clear()
+        self.current_id = 1
+
+    def count(self):
+        """count() -> int - Returns the number of connections """
+        return len(self.__connections)
+
+    def items(self):
+        """ items() -> - Returns the connections """
+        return self.__connections.items()
+
+    def parse(self, filename):
+        """parse(filename: str) -> None  
+        Loads a list of connections from a XML file, appending it to
+        self.__connections.
+        
+        """
+        self.open_file(filename)
+        root = self.dom.documentElement
+        for element in named_elements(root, 'connection'):
+            self.add_connection(ExtConnection.parse(element))
+        self.refresh_current_id()
+
+    def serialize(self):
+        """serialize(filename:str) -> None 
+        Writes connection list to given filename.
+          
+        """
+        dom = self.create_document('connections')
+        root = dom.documentElement
+        
+        for conn in self.__connections.values():
+            conn.serialize(dom, root)
+
+        self.write_document(root, self.filename)
+
+    def refresh_current_id(self):
+        """refresh_current_id() -> None
+        Recomputes the next unused id from scratch
+        
+        """
+        self.current_id = max([0] + self.__connections.keys()) + 1
+
+    def get_fresh_id(self):
+        """get_fresh_id() -> int - Returns an unused id. """
+        return self.current_id
+
+
+###############################################################################
+
+class TestConnectionList(unittest.TestCase):
+    def test1(self):
+        """ Exercising writing and reading a file """
+        fd, filename = tempfile.mkstemp(prefix='vt_', suffix='_connections.xml')
+        os.close(fd)
+        try:
+            conns = ExtConnectionList.getInstance()
+            conns.filename = filename
+            conns.clear()
+            conn = DBConnection()
+            conn.id = 1
+            conn.name = 'test'
+            conn.host = 'somehost.com'
+            conn.port = 1234
+            conn.user = 'nobody'
+            conn.passwd = '123'
+            conn.database = 'anydatabase'
+            conn.dbtype = 'MySQL'
+
+            conns.add_connection(conn)
+
+            #reading it again
+            conns.clear()
+            self.assertEquals(conns.count(),0)
+            conns.load_connections()
+            self.assertEquals(conns.count(),1)
+            newconn = conns.get_connection(1)
+            self.assertEqual(conn, newconn)
+        finally:
+            #remove created file
+            os.unlink(filename)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/inspector.py b/vistrails/core/inspector.py
new file mode 100644
index 0000000..6533e04
--- /dev/null
+++ b/vistrails/core/inspector.py
@@ -0,0 +1,247 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Helper classes for inspecting vistrails/pipelines at runtime"""
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.system import get_vistrails_default_pkg_prefix
+################################################################################
+
+class PipelineInspector(object):
+    """
+    PipelineInspector inspects a pipeline to get informations such as
+    the number of spreadsheet cells or compatibility for sub-modules
+    
+    """
+    def __init__(self):
+        """ PipelineInspector() -> None
+        Initialize pipeline information
+        
+        """
+        # A dict of input port module ids to its name/type
+        self.input_ports = {}
+        self.input_port_by_name = {}
+
+        # A dict of output port module ids to its name/type
+        self.output_ports = {}
+        self.output_port_by_name = {}
+
+        # A list of ids of module of type cell
+        self.spreadsheet_cells = []
+
+        # A dict of ambiguous modules mapped to their annotated id
+        self.annotated_modules = {}
+
+    def inspect(self, pipeline):
+        """ inspect(pipeline: Pipeline) -> None
+        Inspect a pipeline and update information
+        
+        """
+        self.inspect_input_output_ports(pipeline)
+        self.inspect_spreadsheet_cells(pipeline)
+        self.inspect_ambiguous_modules(pipeline)
+
+    def has_input_ports(self):
+        """ has_input_ports() -> bool
+        Check if the inspected pipeline has any input ports
+        
+        """
+        return len(self.input_ports)>0
+    
+    def has_output_ports(self):
+        """ has_output_ports() -> bool
+        Check if the inspected pipeline has any output ports
+        
+        """
+        return len(self.output_ports)>0
+
+    def number_of_cells(self):
+        """ number_of_cells() -> int
+        Return the number of cells that will occupied on the spreadsheet
+        
+        """
+        return len(self.spreadsheet_cells)
+
+    def is_sub_module(self):
+        """ is_sub_module() -> bool
+        Check whether or not this pipeline is a sub module
+        
+        """
+        return self.has_input_ports() or self.has_output_ports()    
+
+    def inspect_input_output_ports(self, pipeline):
+        """ inspect_input_output_ports(pipeline: Pipeline) -> None
+        Inspect the pipeline input/output ports, useful for submodule
+        
+        """
+        registry = get_module_registry()
+        self.input_ports = {}
+        self.input_port_by_name = {}
+        self.output_ports = {}
+        self.output_port_by_name = {}
+        if not pipeline: return        
+        for cId, conn in pipeline.connections.iteritems():
+            src_module = pipeline.modules[conn.source.moduleId]
+            dst_module = pipeline.modules[conn.destination.moduleId]
+            if src_module.name=='InputPort':
+                spec = registry.getInputPortSpec(dst_module,
+                                                 conn.destination.name)
+                name = self.get_port_name(src_module)
+                if name=='':
+                    name = conn.destination.name
+                self.input_ports[src_module.id] = (name,
+                                                 spec[0])
+                self.input_port_by_name[name] = src_module.id
+            if dst_module.name=='OutputPort':
+                spec = registry.getOutputPortSpec(src_module,
+                                                 conn.source.name)
+                name = self.get_port_name(dst_module)
+                if name=='':
+                    name = conn.source.name
+                self.output_ports[dst_module.id] = (name,
+                                                  spec[0])
+                self.output_port_by_name[name] = dst_module.id
+
+    def get_port_name(self, module):
+        """ get_port_name(module: InputPort/OutputPort) -> str
+        Return the real name of the port module based on 'name' function
+        
+        """
+        for f in module.functions:
+            if f.name=='name' and f.params:
+                return f.params[0].strValue
+        return ''
+            
+    def inspect_spreadsheet_cells(self, pipeline):
+        """ inspect_spreadsheet_cells(pipeline: Pipeline) -> None
+        Inspect the pipeline to see how many cells is needed
+        
+        """
+        registry = get_module_registry()
+        self.spreadsheet_cells = []
+        if not pipeline: return
+
+        def find_spreadsheet_cells(pipeline, root_id=None):
+            if root_id is None:
+                root_id = []
+            # Sometimes we run without the spreadsheet!
+            spreadsheet_pkg = \
+                '%s.spreadsheet' % get_vistrails_default_pkg_prefix()
+            if registry.has_module(spreadsheet_pkg, 'SpreadsheetCell'):
+                # First pass to check cells types
+                cellType = \
+                    registry.get_descriptor_by_name(spreadsheet_pkg,
+                                                    'SpreadsheetCell').module
+                for mId, module in pipeline.modules.iteritems():
+                    desc = registry.get_descriptor_by_name(module.package, 
+                                                           module.name, 
+                                                           module.namespace)
+                    if issubclass(desc.module, cellType):
+                        self.spreadsheet_cells.append(root_id + [mId])
+
+            for subworkflow_id in self.find_subworkflows(pipeline):
+                subworkflow = pipeline.modules[subworkflow_id]
+                if subworkflow.pipeline is not None:
+                    find_spreadsheet_cells(subworkflow.pipeline, 
+                                           root_id + [subworkflow_id])
+
+        find_spreadsheet_cells(pipeline)
+    
+    def find_subworkflows(self, pipeline):
+        if not pipeline: 
+            return
+        subworkflows = []
+        for m_id, module in pipeline.modules.iteritems():
+            if module.is_abstraction() or module.is_group():
+                subworkflows.append(m_id)
+        return subworkflows
+
+    def inspect_ambiguous_modules(self, pipeline):
+        """ inspect_ambiguous_modules(pipeline: Pipeline) -> None
+        inspect_ambiguous_modules returns a dict of ambiguous modules,
+        i.e. cannot determine the exact module by giving just its
+        name. Then in each group of dupplicate modules, a set of
+        annotated id is generated for them sorted based on their id.
+        The annotated_modules dictionary will map actual module id into
+        their annotated one (if it is ambiguous)
+        
+        """
+        self.annotated_modules = {}
+        if not pipeline: return
+
+        orig_pipeline = pipeline
+        count = {}
+        module_name = {}
+        for moduleId in pipeline.modules.iterkeys():
+            module = pipeline.modules[moduleId]
+            if module_name.has_key(module.name): # ambiguous
+                if count[module.name]==1:
+                    self.annotated_modules[module_name[module.name]] = 1
+                count[module.name] += 1
+                self.annotated_modules[moduleId] = count[module.name]
+            else:
+                module_name[module.name] = moduleId
+                count[module.name] = 1
+
+        for id_list in self.spreadsheet_cells:
+            pipeline = orig_pipeline
+            # only need to worry about nested cells here
+            if len(id_list) >= 2:
+                id_iter = iter(id_list)
+                m = pipeline.modules[id_iter.next()]
+                for m_id in id_iter:
+                    pipeline = m.pipeline
+                    m = pipeline.modules[m_id]
+                if m.name in module_name:
+                    if count[m.name] == 1:
+                        self.annotated_modules[module_name[m.name]] = 1
+                    count[m.name] += 1
+                    self.annotated_modules[tuple(id_list)] = count[m.name]
+                else:
+                    module_name[m.name] = tuple(id_list)
+                    count[m.name] = 1
+
+
+# if __name__ == '__main__':
+#     from core.startup import VistrailsStartup
+#     from core.xml_parser import XMLParser
+#     xmlFile = 'C:/cygwin/home/stew/src/vistrails/trunk/examples/vtk.xml'    
+#     vs = VistrailsStartup()
+#     vs.init()
+#     parser = XMLParser()
+#     parser.openVistrail(xmlFile)
+#     vistrail = parser.getVistrail()
+#     pipeline = vistrail.getPipeline('Single Renderer')
+#     print vistrail.latestTime
diff --git a/vistrails/core/interpreter/__init__.py b/vistrails/core/interpreter/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/interpreter/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/interpreter/base.py b/vistrails/core/interpreter/base.py
new file mode 100644
index 0000000..d0fc06c
--- /dev/null
+++ b/vistrails/core/interpreter/base.py
@@ -0,0 +1,240 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.data_structures.graph import Graph
+from vistrails.core.utils import expression
+from vistrails.core.utils import trace_method
+from vistrails.core import debug
+import copy
+import parser
+
+##############################################################################
+
+class InternalTuple(object):
+    """Tuple used internally for constant tuples."""
+
+    def _get_length(self, length):
+        return len(self._values)
+    def _set_length(self, length):
+        self._values = [None] * length
+    length = property(_get_length, _set_length)
+
+    def compute(self):
+        return
+
+    def set_input_port(self, index, connector):
+        self._values[index] = connector()
+
+    def get_output(self, port):
+        return tuple(self._values)
+
+    def update(self):
+        pass
+
+##############################################################################
+
+class AbortExecution(Exception):
+    """Internal exception raised to signal the interpreter it should stop.
+    """
+
+##############################################################################
+
+class BaseInterpreter(object):
+
+    def __init__(self):
+        """ BaseInterpreter() -> BaseInterpreter
+        Initialize class members
+        
+        """
+        self.done_summon_hook = None
+        self.done_update_hook = None
+
+    def get_name_dependencies(self, astList):
+        """get_name_dependencies(astList) -> list of something 
+        
+        """
+        
+        result = []
+        if astList[0]==1: # NAME token
+            result += [astList[1]]
+        else:
+            for e in astList:
+                if isinstance(e, list):
+                    result += self.get_name_dependencies(e)
+        return result
+
+#    def build_alias_dictionary(self, pipeline):
+#        aliases = {}
+#        for mid in pipeline.modules:
+#            for f in pipeline.modules[mid].functions:
+#                fsig = f.getSignature()
+#                for pidx in xrange(len(f.params)):
+#                    palias = f.params[pidx].alias
+#                    if palias and palias!='':
+#                        for f1 in reversed(pipeline.modules[mid].functions):
+#                            if f1.getSignature()==fsig:
+#                                p = f1.params[pidx]
+#                                aliases[palias] = (p.type, expression.parse_expression(str(p.strValue)))
+#                                break
+#        return aliases
+
+    def compute_evaluation_order(self, aliases):
+        # Build the dependencies graph
+        dp = {}
+        for alias,(atype,(base,exp)) in aliases.items():
+            edges = []
+            for e in exp:
+                edges += self.get_name_dependencies()
+            dp[alias] = edges
+            
+        # Topological Sort to find the order to compute aliases
+        # Just a slow implementation, O(n^3)...
+        unordered = copy.copy(list(aliases.keys()))
+        ordered = []
+        while unordered:
+            added = []
+            for i in xrange(len(unordered)):
+                ok = True
+                u = unordered[i]
+                for j in xrange(len(unordered)):
+                    if i!=j:
+                        for v in dp[unordered[j]]:
+                            if u==v:
+                                ok = False
+                                break
+                        if not ok: break
+                if ok: added.append(i)
+            if not added:
+                debug.warning('Looping dependencies detected!')
+                break
+            for i in reversed(added):
+                ordered.append(unordered[i])
+                del unordered[i]
+        return ordered
+
+    def evaluate_exp(self, atype, base, exps, aliases):
+        # FIXME: eval should pretty much never be used
+        import datetime        
+        for e in exps: base = (base[:e[0]] +
+                               str(eval(e[1],
+                                        {'datetime':locals()['datetime']},
+                                        aliases)) +
+                               base[e[0]:])
+        if not atype in ['string', 'String']:
+            if base=='':
+                base = '0'
+            try:
+                base = eval(base,None,None)
+            except:
+                pass
+        return base
+
+    def resolve_aliases(self, pipeline,
+                        customAliases=None):
+        # We don't build the alias dictionary anymore because as we don't 
+        # perform expression evaluation anymore, the values won't change.
+        # We only care for custom aliases because they might have a value 
+        # different from what it's stored.
+        
+        aliases = {}
+        if customAliases:
+            #customAliases can be only a subset of the aliases
+            #so we need to build the Alias Dictionary always
+            for k,v in customAliases.iteritems():
+                aliases[k] = v
+            # no support for expression evaluation. The code that does that is
+            # ugly and dangerous.
+#        ordered = self.compute_evaluation_order(aliases)
+#        casting = {'int': int, 'float': float, 'double': float, 'string': str,
+#                   'Integer': int, 'Float': float, 'String': str}
+#        for alias in reversed(ordered):
+#            (atype,base) = aliases[alias]
+#            #no expression evaluation anymore
+#            aliases[alias] = base
+#            #value = self.evaluate_exp(atype,base,exps,aliases)
+#            #aliases[alias] = value
+        for alias in aliases:
+            try:
+                info = pipeline.aliases[alias]
+                param = pipeline.db_get_object(info[0],info[1])
+                param.strValue = str(aliases[alias])
+            except KeyError:
+                pass
+                    
+        return aliases
+    
+    def update_params(self, pipeline,
+                        customParams=None):
+        """update_params(pipeline: Pipeline, 
+                         customParams=[(vttype, oId, strval)] -> None
+        This will set the new parameter values in the pipeline before
+        execution 
+        
+        """
+        if customParams:
+            for (vttype, oId, strval) in customParams:
+                try:
+                    param = pipeline.db_get_object(vttype,oId)
+                    param.strValue = str(strval)
+                except Exception, e:
+                    debug.debug("Problem when updating params: %s"%str(e))
+
+    def resolve_variables(self, vistrail_variables, pipeline):
+        for m in pipeline.module_list:
+            if m.is_vistrail_var():
+                vistrail_var = vistrail_variables(m.get_vistrail_var())
+                if vistrail_var is None: # assume set in parameter exploration
+                    continue
+                strValue = vistrail_var.value
+                for func in m.functions:
+                    if func.name == 'value':
+                        func.params[0].strValue = strValue
+
+    def set_done_summon_hook(self, hook):
+        """ set_done_summon_hook(hook: function(pipeline, objects)) -> None
+        Assign a function to call right after every objects has been
+        summoned during execution
+        
+        """
+        self.done_summon_hook = hook
+
+    def set_done_update_hook(self, hook):
+        """ set_done_update_hook(hook: function(pipeline, objects)) -> None
+        Assign a function to call right after every objects has been
+        updated
+        
+        """
+        self.done_update_hook = hook
+
+##############################################################################
diff --git a/vistrails/core/interpreter/cached.py b/vistrails/core/interpreter/cached.py
new file mode 100644
index 0000000..da79517
--- /dev/null
+++ b/vistrails/core/interpreter/cached.py
@@ -0,0 +1,834 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import base64
+import copy
+import cPickle
+import gc
+
+from vistrails.core.common import InstanceObject, lock_method, \
+    VistrailsInternalError
+from vistrails.core.data_structures.bijectivedict import Bidict
+import vistrails.core.interpreter.base
+from vistrails.core.interpreter.base import AbortExecution
+import vistrails.core.interpreter.utils
+from vistrails.core.log.controller import DummyLogController
+from vistrails.core.modules.basic_modules import identifier as basic_pkg
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.vistrails_module import ModuleConnector, \
+    ModuleHadError, ModuleError, ModuleBreakpoint, ModuleErrors, \
+    ModuleWasSuspended
+from vistrails.core.utils import DummyView
+import vistrails.core.system
+import vistrails.core.vistrail.pipeline
+
+# from core.modules.module_utils import FilePool
+
+##############################################################################
+
+class CachedInterpreter(vistrails.core.interpreter.base.BaseInterpreter):
+
+    def __init__(self):
+        vistrails.core.interpreter.base.BaseInterpreter.__init__(self)
+        self.debugger = None
+        self.create()
+
+    def create(self):
+        # FIXME moved here because otherwise we hit the registry too early
+        from vistrails.core.modules.module_utils import FilePool
+        self._file_pool = FilePool()
+        self._persistent_pipeline = vistrails.core.vistrail.pipeline.Pipeline()
+        self._objects = {}
+        self._executed = {}
+        self.filePool = self._file_pool
+        
+    def clear(self):
+        self._file_pool.cleanup()
+        self._persistent_pipeline.clear()
+        for obj in self._objects.itervalues():
+            obj.clear()
+        self._objects = {}
+        self._executed = {}
+
+    def __del__(self):
+        self.clear()
+
+    def clean_modules(self, modules_to_clean):
+        """clean_modules(modules_to_clean: list of persistent module ids)
+
+        Removes modules from the persistent pipeline, and the modules that
+        depend on them."""
+        if not modules_to_clean:
+            return
+        g = self._persistent_pipeline.graph
+        modules_to_clean = (set(modules_to_clean) &
+                            set(self._persistent_pipeline.modules.iterkeys()))
+        dependencies = g.vertices_topological_sort(modules_to_clean)
+        for v in dependencies:
+            self._persistent_pipeline.delete_module(v)
+            del self._objects[v]
+
+    def clean_non_cacheable_modules(self):
+        """clean_non_cacheable_modules() -> None
+
+        Removes all modules that are not cacheable from the persistent
+        pipeline, and the modules that depend on them, and 
+        previously suspended modules """
+        non_cacheable_modules = [i for
+                                 (i, mod) in self._objects.iteritems()
+                                 if not mod.is_cacheable() or \
+                                 mod.suspended]
+        self.clean_modules(non_cacheable_modules)
+
+    def _clear_package(self, identifier):
+        """clear_package(identifier: str) -> None
+
+        Removes all modules from the given package from the persistent
+        pipeline.
+        """
+        modules = [mod.id
+                   for mod in self._persistent_pipeline.module_list
+                   if mod.module_descriptor.identifier == identifier]
+        self.clean_modules(modules)
+
+    def setup_pipeline(self, pipeline, **kwargs):
+        """setup_pipeline(controller, pipeline, locator, currentVersion,
+                          view, aliases, **kwargs)
+        Matches a pipeline with the persistent pipeline and creates
+        instances of modules that aren't in the cache.
+        """
+        def fetch(name, default):
+            r = kwargs.get(name, default)
+            try:
+                del kwargs[name]
+            except KeyError:
+                pass
+            return r
+        controller = fetch('controller', None)
+        locator = fetch('locator', None)
+        current_version = fetch('current_version', None)
+        view = fetch('view', DummyView())
+        vistrail_variables = fetch('vistrail_variables', None)
+        aliases = fetch('aliases', None)
+        params = fetch('params', None)
+        extra_info = fetch('extra_info', None)
+        logger = fetch('logger', DummyLogController())
+        sinks = fetch('sinks', None)
+        reason = fetch('reason', None)
+        actions = fetch('actions', None)
+        done_summon_hooks = fetch('done_summon_hooks', [])
+        module_executed_hook = fetch('module_executed_hook', [])
+        stop_on_error = fetch('stop_on_error', True)
+
+        reg = get_module_registry()
+
+        if len(kwargs) > 0:
+            raise VistrailsInternalError('Wrong parameters passed '
+                                         'to setup_pipeline: %s' % kwargs)
+
+        def create_null():
+            """Creates a Null value"""
+            getter = get_module_registry().get_descriptor_by_name
+            descriptor = getter(basic_pkg, 'Null')
+            return descriptor.module()
+        
+        def create_constant(param, module):
+            """Creates a Constant from a parameter spec"""
+            getter = reg.get_descriptor_by_name
+            desc = getter(param.identifier, param.type, param.namespace)
+            constant = desc.module()
+            constant.id = module.id
+#             if param.evaluatedStrValue:
+#                 constant.setValue(param.evaluatedStrValue)
+            if param.strValue != '':
+                constant.setValue(param.strValue)
+            else:
+                constant.setValue( \
+                    constant.translate_to_string(constant.default_value))
+            return constant
+
+        ### BEGIN METHOD ###
+
+#         if self.debugger:
+#             self.debugger.update()
+        to_delete = []
+        errors = {}
+
+        if controller is not None:
+            # Controller is none for sub_modules
+            controller.validate(pipeline)
+        else:
+            pipeline.validate()
+
+        self.resolve_aliases(pipeline, aliases)
+        if vistrail_variables:
+            self.resolve_variables(vistrail_variables,  pipeline)
+
+        self.update_params(pipeline, params)
+        
+        (tmp_to_persistent_module_map,
+         conn_map,
+         module_added_set,
+         conn_added_set) = self.add_to_persistent_pipeline(pipeline)
+
+        # Create the new objects
+        for i in module_added_set:
+            persistent_id = tmp_to_persistent_module_map[i]
+            module = self._persistent_pipeline.modules[persistent_id]
+            obj = self._objects[persistent_id] = module.summon()
+            obj.interpreter = self
+            obj.id = persistent_id
+            obj.is_breakpoint = module.is_breakpoint
+            obj.signature = module._signature
+            
+            # Checking if output should be stored
+            if module.has_annotation_with_key('annotate_output'):
+                annotate_output = module.get_annotation_by_key('annotate_output')
+                #print annotate_output
+                if annotate_output:
+                    obj.annotate_output = True
+
+            for f in module.functions:
+                connector = None
+                if len(f.params) == 0:
+                    connector = ModuleConnector(create_null(), 'value')
+                elif len(f.params) == 1:
+                    p = f.params[0]
+                    try:
+                        constant = create_constant(p, module)
+                        connector = ModuleConnector(constant, 'value')
+                    except ValueError, e:
+                        err = ModuleError(self, 'Cannot convert parameter '
+                                          'value "%s"\n' % p.strValue + str(e))
+                        errors[i] = err
+                        to_delete.append(obj.id)
+                    except Exception, e:
+                        err = ModuleError(self, 'Uncaught exception: "%s"' % \
+                                              p.strValue + str(e))
+                        errors[i] = err
+                        to_delete.append(obj.id)
+                else:
+                    tupleModule = vistrails.core.interpreter.base.InternalTuple()
+                    tupleModule.length = len(f.params)
+                    for (j,p) in enumerate(f.params):
+                        try:
+                            constant = create_constant(p, module)
+                            constant.update()
+                            connector = ModuleConnector(constant, 'value')
+                            tupleModule.set_input_port(j, connector)
+                        except ValueError, e:
+                            err = ModuleError(self, "Cannot convert parameter "
+                                              "value '%s'\n" % p.strValue + \
+                                                  str(e))
+                            errors[i] = err
+                            to_delete.append(obj.id)
+                        except Exception, e:
+                            err = ModuleError(self, 'Uncaught exception: '
+                                              '"%s"' % p.strValue + str(e))
+                            errors[i] = err
+                            to_delete.append(obj.id)
+                    connector = ModuleConnector(tupleModule, 'value')
+                if connector:
+                    obj.set_input_port(f.name, connector, is_method=True)
+
+        # Create the new connections
+        for i in conn_added_set:
+            persistent_id = conn_map[i]
+            conn = self._persistent_pipeline.connections[persistent_id]
+            src = self._objects[conn.sourceId]
+            dst = self._objects[conn.destinationId]
+            conn.makeConnection(src, dst)
+
+        if self.done_summon_hook:
+            self.done_summon_hook(self._persistent_pipeline, self._objects)
+        for callable_ in done_summon_hooks:
+            callable_(self._persistent_pipeline, self._objects)
+
+        tmp_id_to_module_map = {}
+        for i, j in tmp_to_persistent_module_map.iteritems():
+            tmp_id_to_module_map[i] = self._objects[j]
+        return (tmp_id_to_module_map, tmp_to_persistent_module_map.inverse,
+                module_added_set, conn_added_set, to_delete, errors)
+
+    def execute_pipeline(self, pipeline, tmp_id_to_module_map, 
+                         persistent_to_tmp_id_map, **kwargs):
+        def fetch(name, default):
+            r = kwargs.get(name, default)
+            try:
+                del kwargs[name]
+            except KeyError:
+                pass
+            return r
+        controller = fetch('controller', None)
+        locator = fetch('locator', None)
+        current_version = fetch('current_version', None)
+        view = fetch('view', DummyView())
+        vistrail_variables = fetch('vistrail_variables', None)
+        aliases = fetch('aliases', None)
+        params = fetch('params', None)
+        extra_info = fetch('extra_info', None)
+        logger = fetch('logger', DummyLogController())
+        sinks = fetch('sinks', None)
+        reason = fetch('reason', None)
+        actions = fetch('actions', None)
+        module_executed_hook = fetch('module_executed_hook', [])
+        module_suspended_hook = fetch('module_suspended_hook', [])
+        done_summon_hooks = fetch('done_summon_hooks', [])
+        clean_pipeline = fetch('clean_pipeline', False)
+        stop_on_error = fetch('stop_on_error', True)
+        # parent_exec = fetch('parent_exec', None)
+
+        if len(kwargs) > 0:
+            raise VistrailsInternalError('Wrong parameters passed '
+                                         'to execute_pipeline: %s' % kwargs)
+
+        errors = {}
+        executed = {}
+        suspended = {}
+        cached = {}
+
+        # LOGGING SETUP
+        def get_remapped_id(id):
+            return persistent_to_tmp_id_map[id]
+
+        # the executed dict works on persistent ids
+        def add_to_executed(obj):
+            executed[obj.id] = True
+            for callable_ in module_executed_hook:
+                callable_(obj.id)
+
+        # the suspended dict works on persistent ids
+        def add_to_suspended(obj):
+            suspended[obj.id] = obj.suspended
+            for callable_ in module_suspended_hook:
+                callable_(obj.id)
+                
+        def set_computing(obj):
+            i = get_remapped_id(obj.id)
+            view.set_module_computing(i)
+
+        # views work on local ids
+        def begin_compute(obj):
+            i = get_remapped_id(obj.id)
+            view.set_module_computing(i)
+
+            reg = get_module_registry()
+            module_name = reg.get_descriptor(obj.__class__).name
+
+            # !!!self.parent_execs is mutated!!!
+            logger.start_execution(obj, i, module_name,
+                                   parent_execs=self.parent_execs)
+
+        # views and loggers work on local ids
+        def begin_update(obj):
+            i = get_remapped_id(obj.id)
+            view.set_module_active(i)
+
+        def update_cached(obj):
+            cached[obj.id] = True
+            i = get_remapped_id(obj.id)
+
+            reg = get_module_registry()
+            module_name = reg.get_descriptor(obj.__class__).name
+
+            # !!!self.parent_execs is mutated!!!
+            logger.start_execution(obj, i, module_name,
+                                   parent_execs=self.parent_execs,
+                                   cached=1)
+            view.set_module_not_executed(i)
+            num_pops = logger.finish_execution(obj,'', self.parent_execs)
+
+        # views and loggers work on local ids
+        def end_update(obj, error='', errorTrace=None, was_suspended = False):
+            i = get_remapped_id(obj.id)
+            if was_suspended:
+                view.set_module_suspended(i, error)
+                error = error.msg
+            elif not error:
+                view.set_module_success(i)
+            else:
+                view.set_module_error(i, error)
+
+            # !!!self.parent_execs is mutated!!!
+            logger.finish_execution(obj, error, self.parent_execs, errorTrace,
+                                    was_suspended)
+
+        # views and loggers work on local ids
+        def annotate(obj, d):
+            i = get_remapped_id(obj.id)
+            logger.insert_module_annotations(obj, d)
+
+        # views and loggers work on local ids
+        def update_progress(obj, percentage=0.0):
+            i = get_remapped_id(obj.id)
+            view.set_module_progress(i, percentage)
+            
+        def add_exec(exec_):
+            logger.add_exec(exec_, self.parent_execs)
+            
+        logging_obj = InstanceObject(signalSuccess=add_to_executed,
+                                     signalSuspended=add_to_suspended,
+                                     begin_update=begin_update,
+                                     begin_compute=begin_compute,
+                                     update_progress=update_progress,
+                                     end_update=end_update,
+                                     update_cached=update_cached,
+                                     set_computing=set_computing,
+                                     add_exec = add_exec,
+                                     annotate=annotate,
+                                     log=logger)
+
+        # PARAMETER CHANGES SETUP
+        parameter_changes = []
+        def change_parameter(obj, name, value):
+            parameter_changes.append((get_remapped_id(obj.id),
+                                      name, value))
+        def make_change_parameter(obj):
+            return lambda *args: change_parameter(obj, *args)
+
+        # Update **all** modules in the current pipeline
+        for i, obj in tmp_id_to_module_map.iteritems():
+            obj.logging = logging_obj
+            obj.change_parameter = make_change_parameter(obj)
+            
+            # Update object pipeline information
+            obj.moduleInfo['locator'] = locator
+            obj.moduleInfo['version'] = current_version
+            obj.moduleInfo['moduleId'] = i
+            obj.moduleInfo['pipeline'] = pipeline
+            obj.moduleInfo['controller'] = controller
+            if extra_info is not None:
+                obj.moduleInfo['extra_info'] = extra_info
+            if reason is not None:
+                obj.moduleInfo['reason'] = reason
+            if actions is not None:
+                obj.moduleInfo['actions'] = actions
+
+        ## Checking 'sinks' from kwargs to resolve only requested sinks
+        # Note that we accept any module in 'sinks', even if it's not actually
+        # a sink in the graph
+        if sinks is not None:
+            persistent_sinks = [tmp_id_to_module_map[sink]
+                                for sink in sinks
+                                if sink in tmp_id_to_module_map]
+        else:
+            persistent_sinks = [tmp_id_to_module_map[sink]
+                                for sink in pipeline.graph.sinks()]
+
+        # Update new sinks
+        for obj in persistent_sinks:
+            abort = False
+            try:
+                obj.update()
+                continue
+            except ModuleWasSuspended:
+                continue
+            except ModuleHadError:
+                pass
+            except AbortExecution:
+                break
+            except ModuleErrors, mes:
+                for me in mes.module_errors:
+                    me.module.logging.end_update(me.module, me.msg)
+                    errors[me.module.id] = me
+                    abort = abort or me.abort
+            except ModuleError, me:
+                me.module.logging.end_update(me.module, me.msg, me.errorTrace)
+                errors[me.module.id] = me
+                abort = me.abort
+            except ModuleBreakpoint, mb:
+                mb.module.logging.end_update(mb.module)
+                errors[mb.module.id] = mb
+                abort = True
+            if stop_on_error or abort:
+                break
+
+        if self.done_update_hook:
+            self.done_update_hook(self._persistent_pipeline, self._objects)
+                
+        # objs, errs, and execs are mappings that use the local ids as keys,
+        # as opposed to the persistent ids.
+        # They are thus ideal to external consumption.
+        objs = {}
+        # dict([(i, self._objects[tmp_to_persistent_module_map[i]])
+        #              for i in tmp_to_persistent_module_map.keys()])
+        errs = {}
+        execs = {}
+        suspends = {}
+        caches = {}
+
+        to_delete = []
+        for (tmp_id, obj) in tmp_id_to_module_map.iteritems():
+            if clean_pipeline:
+                to_delete.append(obj.id)
+            objs[tmp_id] = obj
+            if obj.id in errors:
+                errs[tmp_id] = errors[obj.id]
+                if not clean_pipeline:
+                    to_delete.append(obj.id)
+            if obj.id in executed:
+                execs[tmp_id] = executed[obj.id]
+            elif obj.id in suspended:
+                suspends[tmp_id] = suspended[obj.id]
+            elif obj.id in cached:
+                caches[tmp_id] = cached[obj.id]
+            else:
+                # these modules didn't execute
+                execs[tmp_id] = False
+
+        return (to_delete, objs, errs, execs, suspends, caches, parameter_changes)
+
+    def finalize_pipeline(self, pipeline, to_delete, objs, errs, execs,
+                          suspended, cached, **kwargs):
+        def fetch(name, default):
+            r = kwargs.get(name, default)
+            try:
+                del kwargs[name]
+            except KeyError:
+                pass
+            return r
+        view = fetch('view', DummyView())
+        reset_computed = fetch('reset_computed', True)
+     
+        self.clean_modules(to_delete)
+
+        for i in objs:
+            if i in errs:
+                view.set_module_error(i, errs[i].msg, errs[i].errorTrace)
+            elif i in suspended and suspended[i]:
+                view.set_module_suspended(i, suspended[i])
+            elif i in execs and execs[i]:
+                view.set_module_success(i)
+            elif i in cached and cached[i]:
+                view.set_module_not_executed(i)
+            else:
+                view.set_module_persistent(i)
+
+        if reset_computed:
+            for module in self._objects.itervalues():
+                module.computed = False
+
+    def unlocked_execute(self, pipeline, **kwargs):
+        """unlocked_execute(pipeline, **kwargs): Executes a pipeline using
+        caching. Caching works by reusing pipelines directly.  This
+        means that there exists one global pipeline whose parts get
+        executed over and over again. This allows nested execution."""
+
+        res = self.setup_pipeline(pipeline, **kwargs)
+        modules_added = res[2]
+        conns_added = res[3]
+        to_delete = res[4]
+        errors = res[5]
+        if len(errors) == 0:
+            res = self.execute_pipeline(pipeline, *(res[:2]), **kwargs)
+        else:
+            res = (to_delete, res[0], errors, {}, {}, {}, [])
+        self.finalize_pipeline(pipeline, *(res[:-1]), **kwargs)
+        
+        return InstanceObject(objects=res[1],
+                              errors=res[2],
+                              executed=res[3],
+                              suspended=res[4],
+                              parameter_changes=res[6],
+                              modules_added=modules_added,
+                              conns_added=conns_added)
+
+    @lock_method(vistrails.core.interpreter.utils.get_interpreter_lock())
+    def execute(self, pipeline, **kwargs):
+        """execute(pipeline, **kwargs):
+
+        kwargs:
+          controller = fetch('controller', None)
+          locator = fetch('locator', None)
+          current_version = fetch('current_version', None)
+          view = fetch('view', DummyView())
+          aliases = fetch('aliases', None)
+          params = fetch('params', None)
+          extra_info = fetch('extra_info', None)
+          logger = fetch('logger', DummyLogController())
+          reason = fetch('reason', None)
+          actions = fetch('actions', None)
+          done_summon_hooks = fetch('done_summon_hooks', [])
+          module_executed_hook = fetch('module_executed_hook', [])
+
+        Executes a pipeline using caching. Caching works by reusing
+        pipelines directly.  This means that there exists one global
+        pipeline whose parts get executed over and over again.
+
+        This function returns a triple of dictionaries (objs, errs, execs).
+
+        objs is a mapping from local ids (the ids in the pipeline) to
+        objects **in the persistent pipeline**. Notice, these are not
+        the objects inside the passed pipeline, but the objects they
+        were mapped to in the persistent pipeline.
+
+        errs is a dictionary from local ids to error messages of modules
+        that might have returns errors.
+
+        execs is a dictionary from local ids to boolean values indicating
+        whether they were executed or not.
+
+        If modules have no error associated with but were not executed, it
+        means they were cached."""
+
+        # Setup named arguments. We don't use named parameters so
+        # that positional parameter calls fail earlier
+        new_kwargs = {}
+        def fetch(name, default):
+            r = kwargs.get(name, default)
+            new_kwargs[name] = r
+            try:
+                del kwargs[name]
+            except KeyError:
+                pass
+            return r
+        controller = fetch('controller', None)
+        locator = fetch('locator', None)
+        current_version = fetch('current_version', None)
+        view = fetch('view', DummyView())
+        vistrail_variables = fetch('vistrail_variables', None)
+        aliases = fetch('aliases', None)
+        params = fetch('params', None)
+        extra_info = fetch('extra_info', None)
+        logger = fetch('logger', DummyLogController())
+        sinks = fetch('sinks', None)
+        reason = fetch('reason', None)
+        actions = fetch('actions', None)
+        done_summon_hooks = fetch('done_summon_hooks', [])
+        module_executed_hook = fetch('module_executed_hook', [])
+        stop_on_error = fetch('stop_on_error', True)
+
+        if len(kwargs) > 0:
+            raise VistrailsInternalError('Wrong parameters passed '
+                                         'to execute: %s' % kwargs)
+
+        self.clean_non_cacheable_modules()
+
+#         if controller is not None:
+#             vistrail = controller.vistrail
+#             (pipeline, module_remap) = \
+#                 core.db.io.expand_workflow(vistrail, pipeline)
+#             new_kwargs['module_remap'] = module_remap
+#         else:
+#             vistrail = None
+
+        if controller is not None:
+            vistrail = controller.vistrail
+        else:
+            vistrail = None
+
+        self.parent_execs = [None]
+        logger.start_workflow_execution(vistrail, pipeline, current_version)
+        self.annotate_workflow_execution(logger, reason, aliases, params)
+        result = self.unlocked_execute(pipeline, **new_kwargs)
+        logger.finish_workflow_execution(result.errors, suspended=result.suspended)
+        self.parent_execs = [None]
+
+        return result
+
+    def annotate_workflow_execution(self, logger, reason, aliases, params):
+        """annotate_workflow_Execution(logger: LogController, reason:str,
+                                        aliases:dict, params:list)-> None
+        It will annotate the workflow execution in logger with the reason,
+        aliases and params.
+        
+        """
+        d = {}
+        d["__reason__"] = reason
+        if aliases is not None and isinstance(aliases, dict):
+            d["__aliases__"] = cPickle.dumps(aliases)
+        if params is not None and isinstance(params, list):
+            d["__params__"] = cPickle.dumps(params)
+        logger.insert_workflow_exec_annotations(d)
+        
+    def add_to_persistent_pipeline(self, pipeline):
+        """add_to_persistent_pipeline(pipeline):
+        (module_id_map, connection_id_map, modules_added)
+        Adds a pipeline to the persistent pipeline of the cached interpreter
+        and adds current logging object to each existing module.
+
+        Returns four things: two dictionaries describing the mapping
+        of ids from the passed pipeline to the persistent one (the
+        first one has the module id mapping, the second one has the
+        connection id mapping), a set of all module ids added to the
+        persistent pipeline, and a set of all connection ids added to
+        the persistent pipeline."""
+        module_id_map = Bidict()
+        connection_id_map = Bidict()
+        modules_added = set()
+        connections_added = set()
+        pipeline.refresh_signatures()
+        # we must traverse vertices in topological sort order
+        verts = pipeline.graph.vertices_topological_sort()
+        for new_module_id in verts:
+            new_sig = pipeline.subpipeline_signature(new_module_id)
+            if not self._persistent_pipeline.has_subpipeline_signature(new_sig):
+                # Must add module to persistent pipeline
+                persistent_module = copy.copy(pipeline.modules[new_module_id])
+                persistent_id = self._persistent_pipeline.fresh_module_id()
+                persistent_module.id = persistent_id
+                self._persistent_pipeline.add_module(persistent_module)
+                self._persistent_pipeline.modules[persistent_id]._signature = \
+                    base64.b16encode(new_sig).lower()
+                module_id_map[new_module_id] = persistent_id
+                modules_added.add(new_module_id)
+            else:
+                i = self._persistent_pipeline \
+                        .subpipeline_id_from_signature(new_sig)
+                module_id_map[new_module_id] = i
+        for connection in pipeline.connections.itervalues():
+            new_sig = pipeline.connection_signature(connection.id)
+            if not self._persistent_pipeline.has_connection_signature(new_sig):
+                # Must add connection to persistent pipeline
+                persistent_connection = copy.copy(connection)
+                persistent_id = self._persistent_pipeline.fresh_connection_id()
+                persistent_connection.id = persistent_id
+                persistent_connection.sourceId = module_id_map[
+                    connection.sourceId]
+                persistent_connection.destinationId = module_id_map[
+                    connection.destinationId]
+                self._persistent_pipeline.add_connection(persistent_connection)
+                connection_id_map[connection.id] = persistent_id
+                connections_added.add(connection.id)
+            else:
+                i = self._persistent_pipeline \
+                        .connection_id_from_signature(new_sig)
+                connection_id_map[connection.id] = i
+        # update persistent signatures
+        self._persistent_pipeline.compute_signatures()
+        return (module_id_map, connection_id_map,
+                modules_added, connections_added)
+        
+    def find_persistent_entities(self, pipeline):
+        """returns a map from a pipeline to the persistent pipeline, 
+        assuming those pieces exist"""
+        persistent_p = self._persistent_pipeline
+        object_map = {}
+        module_id_map = {}
+        connection_id_map = {}
+        pipeline.refresh_signatures()
+        # we must traverse vertices in topological sort order
+        verts = pipeline.graph.vertices_topological_sort()
+        for module_id in verts:
+            sig = pipeline.subpipeline_signature(module_id)
+            if persistent_p.has_subpipeline_signature(sig):
+                i = persistent_p.subpipeline_id_from_signature(sig)
+                module_id_map[module_id] = i
+                object_map[module_id] = self._objects[i]
+            else:
+                module_id_map[module_id] = None
+                object_map[module_id] = None
+        for connection in pipeline.connections.itervalues():
+            sig = pipeline.connection_signature(connection.id)
+            if persistent_p.has_connection_signature(sig):
+                connection_id_map[connection.id] = \
+                    persistent_p.connection_id_from_signature(sig)
+            else:
+                connection_id_map[connection.id] = None
+        return (object_map, module_id_map, connection_id_map)
+
+    __instance = None
+    @staticmethod
+    def get():
+        if not CachedInterpreter.__instance:
+            CachedInterpreter.__instance = CachedInterpreter()
+        return CachedInterpreter.__instance
+
+    @staticmethod
+    def cleanup():
+        if CachedInterpreter.__instance:
+            CachedInterpreter.__instance.clear()
+        objs = gc.collect()
+
+    @staticmethod
+    def flush():
+        if CachedInterpreter.__instance:
+            CachedInterpreter.__instance.clear()
+            CachedInterpreter.__instance.create()
+        objs = gc.collect()
+
+    @staticmethod
+    def clear_package(identifier):
+        if CachedInterpreter.__instance:
+            CachedInterpreter.__instance._clear_package(identifier)
+
+##############################################################################
+# Testing
+
+import unittest
+
+
+class TestCachedInterpreter(unittest.TestCase):
+
+    def test_cache(self):
+        from vistrails.core.db.locator import XMLFileLocator
+        from vistrails.core.vistrail.controller import VistrailController
+        from vistrails.core.db.io import load_vistrail
+        
+        """Test if basic caching is working."""
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                            '/tests/resources/dummy.xml')
+        (v, abstractions, thumbnails, mashups) = load_vistrail(locator)
+        
+        # the controller will take care of upgrades
+        controller = VistrailController(v, locator, abstractions, thumbnails, 
+                                        mashups)
+        p1 = v.getPipeline('int chain')
+        n = v.get_version_number('int chain')
+        controller.change_selected_version(n)
+        controller.flush_delayed_actions()
+        p1 = controller.current_pipeline
+        
+        view = DummyView()
+        interpreter = vistrails.core.interpreter.cached.CachedInterpreter.get()
+        result = interpreter.execute(p1, 
+                                     locator=v,
+                                     current_version=n,
+                                     view=view,
+                                     )
+        # to force fresh params
+        p2 = v.getPipeline('int chain')
+        controller.change_selected_version(n)
+        controller.flush_delayed_actions()
+        p2 = controller.current_pipeline
+        result = interpreter.execute(p2, 
+                                     locator=v,
+                                     current_version=n,
+                                     view=view,
+                                     )
+        assert len(result.modules_added) == 1
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/interpreter/default.py b/vistrails/core/interpreter/default.py
new file mode 100644
index 0000000..d169973
--- /dev/null
+++ b/vistrails/core/interpreter/default.py
@@ -0,0 +1,82 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import vistrails.core.interpreter.cached
+import vistrails.core.interpreter.noncached
+
+import unittest
+
+cached_interpreter = vistrails.core.interpreter.cached.CachedInterpreter
+noncached_interpreter = vistrails.core.interpreter.noncached.Interpreter
+__default_interpreter = cached_interpreter
+
+##############################################################################
+
+def set_cache_configuration(field, value):
+    assert field == 'useCache'
+    if value:
+        set_default_interpreter(cached_interpreter)
+    else:
+        set_default_interpreter(noncached_interpreter)
+
+def connect_to_configuration(configuration):
+    configuration.subscribe('useCache', set_cache_configuration)
+
+def get_default_interpreter():
+    """Returns an instance of the default interpreter class."""
+    return __default_interpreter.get()
+
+def set_default_interpreter(interpreter_class):
+    """Sets the default interpreter class."""
+    global __default_interpreter
+    __default_interpreter = interpreter_class
+
+##############################################################################
+
+
+class TestDefaultInterpreter(unittest.TestCase):
+
+    def test_set(self):
+        old_interpreter = type(get_default_interpreter())
+        try:
+            set_default_interpreter(noncached_interpreter)
+            self.assertEquals(type(get_default_interpreter()),
+                              noncached_interpreter)
+            set_default_interpreter(cached_interpreter)
+            self.assertEquals(type(get_default_interpreter()),
+                              cached_interpreter)
+        finally:
+            set_default_interpreter(old_interpreter)
+            self.assertEquals(type(get_default_interpreter()),
+                              old_interpreter)
diff --git a/vistrails/core/interpreter/noncached.py b/vistrails/core/interpreter/noncached.py
new file mode 100644
index 0000000..2666b7d
--- /dev/null
+++ b/vistrails/core/interpreter/noncached.py
@@ -0,0 +1,69 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core import modules
+from vistrails.core.common import *
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core.modules.vistrails_module import ModuleConnector, ModuleError
+from vistrails.core.utils import DummyView
+import copy
+import vistrails.core.interpreter.base
+import vistrails.core.interpreter.utils
+import vistrails.core.vistrail.pipeline
+import atexit
+
+# from core.modules.module_utils import FilePool
+
+################################################################################
+
+class Interpreter(vistrails.core.interpreter.cached.CachedInterpreter):
+
+    def clean_non_cacheable_modules(self):
+        non_cacheable_modules = [i for
+                                 (i, mod) in self._objects.iteritems()]
+        self.clean_modules(non_cacheable_modules)
+
+    __instance = None
+    @staticmethod
+    def get():
+        if not Interpreter.__instance:
+            instance = Interpreter()
+            Interpreter.__instance = instance
+            def cleanup():
+                instance._file_pool.cleanup()
+            atexit.register(cleanup)
+        return Interpreter.__instance
+        
+
+################################################################################
diff --git a/vistrails/core/interpreter/utils.py b/vistrails/core/interpreter/utils.py
new file mode 100644
index 0000000..2190f99
--- /dev/null
+++ b/vistrails/core/interpreter/utils.py
@@ -0,0 +1,42 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import threading
+
+##############################################################################
+
+_lock = threading.Lock()
+def get_interpreter_lock():
+    return _lock
diff --git a/vistrails/core/keychain.py b/vistrails/core/keychain.py
new file mode 100644
index 0000000..c0c2ccd
--- /dev/null
+++ b/vistrails/core/keychain.py
@@ -0,0 +1,276 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Keychain keeps a dictionary of key/value pairs.
+It is useful for storing passwords during a vistrails session.
+The values are hashed given the key and the caller object id.
+A value can only be retrieved by the same object that set it.
+Use this at your own risk!
+
+"""
+import inspect
+import os
+import sys
+from vistrails.core import debug
+from vistrails.core.utils import VistrailsInternalError
+from itertools import izip
+
+import struct
+
+import unittest
+try:
+    import hashlib
+    md5_hash = hashlib.md5
+except ImportError:
+    import md5
+    md5_hash = md5.new
+
+##############################################################################
+
+class KeyChain(object):
+    """ 
+    """
+
+    def __init__(self):
+        """ initializes the internal dictionary"""
+        self.__keys = {}
+
+    def count(self):
+        """count() -> int
+        Returns the number of keys
+
+        """
+        return len(self.__keys.keys())
+
+    def clear(self):
+        """clear() -> None
+        clear the internal dictionary
+        """
+        self.__keys.clear()
+    
+    def set_key(self, key, value):
+        """ set_key(key: str, value: str) -> None
+        Sets a key value pair in the internal dictionary
+
+        """
+        #get the arguments of the frame that called us
+        args = inspect.getargvalues(inspect.currentframe().f_back)[3]
+        try:
+            #this will return the instance of the object that called us
+            caller = id(args['self'])
+            newkey = str(caller)+str(key)
+            hashkey = md5_hash(newkey).hexdigest()[:16]
+            cryptvalue = crypt(hashkey,value)
+            self.__keys[hashkey] = cryptvalue
+            
+        except KeyError:
+            debug.critical("KeyChain: You need to call this method inside "
+                           "another a object's method")
+
+    def get_key(self, key):
+        """ get_key(key:str) -> str
+        Returns the value for the key. Only the object that set the key is
+        able to retrieve its value
+
+        """
+        result = ""
+        #get the arguments of the frame that called us
+        args = inspect.getargvalues(inspect.currentframe().f_back)[3]
+        try:
+            #this will return the instance of the object that called us
+            caller = id(args['self'])
+            newkey = str(caller)+str(key)
+            hashkey = md5_hash(newkey).hexdigest()[:16]
+            if self.__keys.has_key(hashkey):
+                return crypt(hashkey,self.__keys[hashkey])
+            else:
+                debug.debug("KeyChain: the key is not present or only the"
+                              " object that set the key can get it")
+                return  ""
+        except KeyError:
+            debug.critical("KeyChain: You need to call this method inside "
+                           "another object's method")
+        
+##############################################################################
+""" 
+XTEA Block Encryption Algorithm
+
+Author: Paul Chakravarti (paul_dot_chakravarti_at_mac_dot_com)
+License: Public Domain
+
+This module provides a Python implementation of the XTEA block encryption
+algorithm (http://www.cix.co.uk/~klockstone/xtea.pdf). 
+
+The module implements the basic XTEA block encryption algortithm
+(`xtea_encrypt`/`xtea_decrypt`) and also provides a higher level `crypt`
+function which symmetrically encrypts/decrypts a variable length string using
+XTEA in OFB mode as a key generator. The `crypt` function does not use
+`xtea_decrypt` which is provided for completeness only (but can be used
+to support other stream modes - eg CBC/CFB).
+
+This module is intended to provide a simple 'privacy-grade' Python encryption
+algorithm with no external dependencies. The implementation is relatively slow
+and is best suited to small volumes of data. Note that the XTEA algorithm has
+not been subjected to extensive analysis (though is believed to be relatively
+secure - see http://en.wikipedia.org/wiki/XTEA). For applications requiring
+'real' security please use a known and well tested algorithm/implementation.
+
+The security of the algorithm is entirely based on quality (entropy) and
+secrecy of the key. You should generate the key from a known random source and
+exchange using a trusted mechanism. In addition, you should always use a random
+IV to seed the key generator (the IV is not sensitive and does not need to be
+exchanged securely)
+
+    >>> import os
+    >>> iv = 'ABCDEFGH'
+    >>> z = crypt('0123456789012345','Hello There',iv)
+    >>> z.encode('hex')
+    'fe196d0a40d6c222b9eff3'
+    >>> crypt('0123456789012345',z,iv)
+    'Hello There'
+
+""" 
+
+
+def crypt(key,data,iv='\00\00\00\00\00\00\00\00',n=32):
+    """
+        Encrypt/decrypt variable length string using XTEA cypher as
+        key generator (OFB mode)
+        * key = 128 bit (16 char) 
+        * iv = 64 bit (8 char)
+        * data = string (any length)
+
+        >>> import os
+        >>> key = os.urandom(16)
+        >>> iv = os.urandom(8)
+        >>> data = os.urandom(10000)
+        >>> z = crypt(key,data,iv)
+        >>> crypt(key,z,iv) == data
+        True
+
+    """
+    def keygen(key,iv,n):
+        while True:
+            iv = xtea_encrypt(key,iv,n)
+            for k in iv:
+                yield ord(k)
+    xor = [ chr(x^y) for (x,y) in izip(map(ord,data),keygen(key,iv,n))]
+    return "".join(xor)
+
+def xtea_encrypt(key,block,n=32,endian="!"):
+    """
+        Encrypt 64 bit data block using XTEA block cypher
+        * key = 128 bit (16 char) 
+        * block = 64 bit (8 char)
+        * n = rounds (default 32)
+        * endian = byte order (see 'struct' doc - default big/network) 
+
+        >>> z = xtea_encrypt('0123456789012345','ABCDEFGH')
+        >>> z.encode('hex')
+        'b67c01662ff6964a'
+
+        Only need to change byte order if sending/receiving from 
+        alternative endian implementation 
+
+        >>> z = xtea_encrypt('0123456789012345','ABCDEFGH',endian="<")
+        >>> z.encode('hex')
+        'ea0c3d7c1c22557f'
+
+    """
+    v0,v1 = struct.unpack(endian+"2L",block)
+    k = struct.unpack(endian+"4L",key)
+    sum,delta,mask = 0L,0x9e3779b9L,0xffffffffL
+    for round in xrange(n):
+        v0 = (v0 + (((v1<<4 ^ v1>>5) + v1) ^ (sum + k[sum & 3]))) & mask
+        sum = (sum + delta) & mask
+        v1 = (v1 + (((v0<<4 ^ v0>>5) + v0) ^ (sum + k[sum>>11 & 3]))) & mask
+    return struct.pack(endian+"2L",v0,v1)
+
+def xtea_decrypt(key,block,n=32,endian="!"):
+    """
+        Decrypt 64 bit data block using XTEA block cypher
+        * key = 128 bit (16 char) 
+        * block = 64 bit (8 char)
+        * n = rounds (default 32)
+        * endian = byte order (see 'struct' doc - default big/network) 
+
+        >>> z = 'b67c01662ff6964a'.decode('hex')
+        >>> xtea_decrypt('0123456789012345',z)
+        'ABCDEFGH'
+
+        Only need to change byte order if sending/receiving from 
+        alternative endian implementation 
+
+        >>> z = 'ea0c3d7c1c22557f'.decode('hex')
+        >>> xtea_decrypt('0123456789012345',z,endian="<")
+        'ABCDEFGH'
+
+    """
+    v0,v1 = struct.unpack(endian+"2L",block)
+    k = struct.unpack(endian+"4L",key)
+    delta,mask = 0x9e3779b9L,0xffffffffL
+    sum = (delta * n) & mask
+    for round in xrange(n):
+        v1 = (v1 - (((v0<<4 ^ v0>>5) + v0) ^ (sum + k[sum>>11 & 3]))) & mask
+        sum = (sum - delta) & mask
+        v0 = (v0 - (((v1<<4 ^ v1>>5) + v1) ^ (sum + k[sum & 3]))) & mask
+    return struct.pack(endian+"2L",v0,v1)
+    
+##############################################################################
+
+class A(object):
+    def set_key(self, chain, key, value):
+        chain.set_key(key,value)
+
+    def get_key(self, chain, key):
+        return chain.get_key(key)
+    
+class TestKeyChain(unittest.TestCase):
+    def testusage(self):
+        keyChain = KeyChain()
+        this = A()
+        other = A()
+        #test key insertion
+        this.set_key(keyChain, "mykey.name", "value")
+        self.assertEquals(keyChain.count(),1)
+        #test key retrieval
+        value = this.get_key(keyChain, "mykey.name")
+        self.assertEquals(value, "value")
+        #test key protection
+        value = other.get_key(keyChain, "mykey.name")
+        self.assertEquals(value, "")   
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/layout/__init__.py b/vistrails/core/layout/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/layout/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/layout/tree_layout.py b/vistrails/core/layout/tree_layout.py
new file mode 100644
index 0000000..d38c6fd
--- /dev/null
+++ b/vistrails/core/layout/tree_layout.py
@@ -0,0 +1,459 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file has the implementation of an algorithm to layout general
+rooted trees in a nice way. The "lw" in the file name "tree_layout_lw.py"
+stands for (L)inear (W)alker. This code is based on the paper:
+
+    Christoph Buchheim, Michael Junger, and Sebastian Leipert.
+    Improving walker's algorithm to run in linear time.
+    In Stephen G. Kobourov and Michael T. Goodrich, editors, Graph
+    Drawing, volume 2528 of Lecture Notes in Computer Science, pages
+    344-353. Springer, 2002.
+
+which is a faster (it is linear!) way to compute the tree layout
+proposed by Walker than the algorithm described by him.
+The original paper is:
+
+    John Q. Walker II.
+    A node-positioning algorithm for general trees.
+    Softw., Pract. Exper., 20(7):685-705, 1990.
+
+"""
+
+class TreeLW:
+    """
+    The input to the algorithm must be a tree
+    in this format.
+
+    """
+    def __init__(self):
+        self.nodes = []
+        self.maxLevel = 0
+
+    def root(self):
+        return self.nodes[0]
+
+    def addNode(self, parentNode, width, height, object = None):
+        newNode = NodeLW(width,height,object)        
+        self.nodes.append(newNode)
+
+        # add
+        if parentNode != None:
+            parentNode.addChild(newNode)
+
+        # update max level
+        self.maxLevel = max(self.maxLevel,newNode.level)
+        return newNode
+
+    def changeParentOfNodeWithNoParent(self, parentNode, childNode):
+        if childNode.parent != None:
+            raise ValueError("Node already has a parent")
+
+        parentNode.addChild(childNode)
+        maxLevel = self.__dfsUpdateLevel(childNode)
+
+        # update max level
+        self.maxLevel = max(self.maxLevel, maxLevel)
+
+    def __dfsUpdateLevel(self, node):
+        if node.parent == None:
+            node.level = 0
+        else:
+            node.level = node.parent.level + 1
+        maxLevel = node.level
+        for child in node.childs:
+            maxLevel = max(maxLevel, self.__dfsUpdateLevel(child))
+        return maxLevel
+
+    def boundingBox(self):
+        kbb = KeepBoundingBox()
+        for w in self.nodes:
+            kbb.addPoint(w.x-w.width/2.0, w.y-w.height/2.0)
+            kbb.addPoint(w.x+w.width/2.0, w.y+w.height/2.0)
+        return kbb.getBoundingBox()            
+
+    def getMaxNodeHeightPerLevel(self):
+        result = [0] * (self.maxLevel+1)
+        for w in self.nodes:
+            level = w.level
+            result[level] = max(result[level],w.height)
+        return result
+
+    @staticmethod
+    def randomTree(n,  k=10000000):
+        p = [0] * n
+        import random
+        for i in xrange(1, n):
+            minIndex = max(i-k, 0)
+            index = random.randint(minIndex, i-1) # random number in {0,1,2,...,i-1}
+            p[i] = index
+        t = TreeLW()
+        nodes= []
+        for i in xrange(n):
+            if i==0:
+                parent= None
+            else:
+                parent=nodes[p[i]]
+            width = 5 + 10*random.random()
+            height = 5 + 10*random.random()
+            nodes.append(t.addNode(parent,width,height,i))
+        return t            
+
+class KeepBoundingBox:
+    def __init__(self):
+        self.minx = None
+        self.miny = None
+        self.maxx = None
+        self.maxy = None
+        self.size = 0
+
+    def addPoint(self,x,y):
+        if self.minx == None or self.minx > x:
+            self.minx = x
+        if self.miny == None or self.miny > y:
+            self.miny = y
+        if self.maxx == None or self.maxx < x:
+            self.maxx = x
+        if self.maxy == None or self.maxy < y:
+            self.maxy = y
+        self.size = self.size + 1
+
+    def getBoundingBox(self):
+        return [self.minx, self.miny, self.maxx-self.minx, self.maxy - self.miny]
+
+class NodeLW:
+    """
+    Node of the tree with all the auxiliar
+    variables needed to the LW algorithm.
+    The fields width, height and object
+    are given as input. The first two are
+    used to layout while the last one might
+    be used by the user of this class.
+
+    """    
+    def __init__(self, width, height, object = None):
+        self.width = width
+        self.height = height
+        self.object = object
+
+        self.childs = []
+
+        self.parent = None
+        self.index = 0
+
+        # level of the node
+        self.level = 0
+        
+        # intermediate variables for 
+        # layout algorithm
+        self.mod = 0
+        self.prelim = 0
+        self.ancestor = None
+        self.thread = None
+        self.change = 0
+        self.shift = 0
+
+        # final center position
+        self.x = 0
+        self.y = 0
+        
+    def getNumChilds(self):
+        return len(self.childs)
+        
+    def hasChild(self):
+        return len(self.childs) > 0
+
+    def addChild(self, node):
+        self.childs.append(node)
+        node.index = len(self.childs) - 1
+        node.parent = self
+        node.level = self.level + 1
+
+    def isLeaf(self):
+        return len(self.childs) == 0
+
+    def leftChild(self):
+        return self.childs[0]
+
+    def rightChild(self):
+        return self.childs[len(self.childs)-1]
+
+    def leftSibling(self):
+        if self.index > 0:
+            return self.parent.childs[self.index-1]
+        else:
+            return None
+
+    def leftMostSibling(self):
+        if self.parent != None:
+            return self.parent.childs[0]
+        else:
+            return self
+
+    def isSiblingOf(self, v):
+        return self.parent == v.parent and self.parent != None
+
+class TreeLayoutLW:
+
+    """
+    TreeLayoutLW: the LW stands for Linear Walker.
+
+    This code is based on the paper:
+
+    Christoph Buchheim, Michael Junger, and Sebastian Leipert.
+    Improving walker's algorithm to run in linear time.
+    In Stephen G. Kobourov and Michael T. Goodrich, editors, Graph
+    Drawing, volume 2528 of Lecture Notes in Computer Science, pages
+    344-353. Springer, 2002.
+
+    which is a faster (linear) way to compute the tree layout
+    proposed by Walker than the algorithm described by him.
+    The original paper is:
+
+    John Q. Walker II.
+    A node-positioning algorithm for general trees.
+    Softw., Pract. Exper., 20(7):685-705, 1990.
+    """
+
+    # vertical alignment of nodes in the 
+    # level band: TOP, MIDDLE, BOTTOM
+    TOP = 0
+    MIDDLE = 1
+    BOTTOM = 2
+
+    def __init__(self, tree, vertical_alignment=1, xdistance=10, ydistance=10):
+        self.xdistance = xdistance
+        self.ydistance = ydistance
+        self.tree = tree
+        self.vertical_alignment = vertical_alignment
+        self.treeLayout()
+
+    def treeLayout(self):
+        for v in self.tree.nodes:
+            v.mod = 0
+            v.thread = None
+            v.ancestor = v
+            
+        r = self.tree.root()
+        self.firstWalk(r)
+        self.secondWalk(r, -r.prelim)
+        self.setVerticalPositions()
+
+    def setVerticalPositions(self):
+
+        # set y position
+        maxNodeHeightPerLevel = self.tree.getMaxNodeHeightPerLevel()
+        info_level = []
+        position_level = 0
+        for level in xrange(len(maxNodeHeightPerLevel)):
+            height_level = maxNodeHeightPerLevel[level]
+            info_level.append((position_level,height_level))
+            position_level += self.ydistance + height_level
+            
+        #
+        for w in self.tree.nodes:
+            level = w.level
+            position_level, height_level = info_level[level]
+            if self.vertical_alignment == TreeLayoutLW.TOP:
+                w.y = position_level + w.height/2.0
+            elif self.vertical_alignment == TreeLayoutLW.MIDDLE:
+                w.y = position_level + height_level/2.0
+            else: # bottom
+                w.y = position_level + height_level - w.height/2.0
+                
+        
+    def gap(self, v1, v2):
+
+        return self.xdistance + (v1.width + v2.width)/2.0        
+
+
+    def firstWalk(self, v):
+        
+        if v.isLeaf():
+            v.prelim = 0
+            w = v.leftSibling()
+            if w != None:
+                v.prelim = w.prelim + self.gap(w,v)
+
+        else:
+            
+            defaultAncestor = v.leftChild()
+            for w in v.childs:
+                self.firstWalk(w)
+                defaultAncestor = self.apportion(w, defaultAncestor)
+            self.executeShifts(v)
+            
+            midpoint = (v.leftChild().prelim + v.rightChild().prelim) / 2.0
+
+            w = v.leftSibling()
+            if w != None:
+                v.prelim = w.prelim + self.gap(w,v)
+                v.mod = v.prelim - midpoint
+            else:
+                v.prelim = midpoint
+
+
+    def apportion(self,  v,  defaultAncestor):
+
+        """
+        Apportion: to divide and assign proportionally.
+
+        Suppose the the left siblings of "v" are all aligned. 
+        Now align the subtree with root "v" (note: the correct
+        alignment of the left siblings of "v" are encoded 
+        in the auxiliar variables, the x and y 
+        are not correct; only in the end the correct 
+        values are assigned to x  and y). 
+        By property (*) in Section 4 the gratest 
+        distinct ancestor of a node "w" in the 
+        subtrees at rooted at the left siblings of "v"
+        is w.ancestor if this value is a left sibling
+        of v otherwise it is "defaultAncestor".
+
+        """
+        w = v.leftSibling()
+        if w != None:
+            # p stands for + or plus (right subtree)
+            # m stands for - or minus (left subtree)
+            # i stands for inside
+            # o stands for outside
+            # v stands for vertex
+            # s stands for shift
+            vip = vop = v
+            vim = w
+            vom = vip.leftMostSibling()
+            sip = vip.mod
+            sop = vop.mod
+            sim = vim.mod
+            som = vom.mod
+            while self.nextRight(vim) != None and self.nextLeft(vip) != None:
+                
+                vim = self.nextRight(vim)
+                vip = self.nextLeft(vip)
+                vom = self.nextLeft(vom)
+                vop = self.nextRight(vop)
+
+                vop.ancestor = v
+                
+                shift = (vim.prelim + sim) - (vip.prelim + sip) + self.gap(vim,vip)
+                
+                if shift > 0:
+                    self.moveSubtree(self.ancestor(vim,v,defaultAncestor),v,shift)
+                    sip += shift
+                    sop += shift
+
+                sim += vim.mod
+                sip += vip.mod
+                som += vom.mod
+                sop += vop.mod
+
+            if self.nextRight(vim) != None and self.nextRight(vop) == None:            
+                vop.thread = self.nextRight(vim)
+                vop.mod += sim - sop
+
+            if self.nextLeft(vip) != None and self.nextLeft(vom) == None:            
+                vom.thread = self.nextLeft(vip)
+                vom.mod += sip - som
+                defaultAncestor = v
+            
+        return defaultAncestor
+
+    def nextLeft(self, v):
+        if v.hasChild():
+            return v.leftChild()
+        else:
+            return v.thread
+
+    def nextRight(self, v):
+        if v.hasChild():
+            return v.rightChild()
+        else:
+            return v.thread
+
+    def moveSubtree(self, wm, wp, shift):
+        subtrees = float(wp.index - wm.index)
+        wp.change += -shift/subtrees
+        wp.shift += shift
+        wm.change += shift/subtrees
+        wp.prelim += shift
+        wp.mod += shift
+
+    def executeShifts(self, v):
+        shift = 0
+        change = 0
+        for i in xrange(v.getNumChilds()-1,-1,-1):
+            w = v.childs[i]
+            w.prelim += shift
+            w.mod += shift
+            change += w.change
+            shift += w.shift + change
+
+    def ancestor(self, vim, v, defaultAncestor):
+        if vim.ancestor.isSiblingOf(v):
+            return vim.ancestor
+        else:
+            return defaultAncestor
+
+    def secondWalk(self,  v, m):
+        v.x = v.prelim + m
+        for w in v.childs:
+            self.secondWalk(w, m + v.mod)
+
+# graph
+if __name__ == "__main__":
+
+    t = TreeLW()
+
+    a = t.addNode(None,1,1,"a")
+
+    b = t.addNode(a,1,1,"b")
+    c = t.addNode(a,1,1,"c")
+    d = t.addNode(a,1,1,"d")
+
+    e = t.addNode(b,1,1,"e")
+    f = t.addNode(b,1,1,"f")
+    g = t.addNode(d,1,1,"g")
+    h = t.addNode(d,1,1,"h")
+
+    i = t.addNode(f,1,1,"i")
+    j = t.addNode(f,1,1,"j")
+    k = t.addNode(h,1,1,"k")
+    l = t.addNode(h,1,1,"l")
+    m = t.addNode(h,1,1,"m")
+    n = t.addNode(h,1,1,"n")
+    o = t.addNode(h,1,1,"o")
+    
+    layout = TreeLayoutLW(t)
+    
diff --git a/vistrails/core/layout/version_tree_layout.py b/vistrails/core/layout/version_tree_layout.py
new file mode 100644
index 0000000..4854381
--- /dev/null
+++ b/vistrails/core/layout/version_tree_layout.py
@@ -0,0 +1,203 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" 
+Interface Vistrails - TreeLayoutLW to align version trees.
+Originally written by Lauro D. Lins.
+
+"""
+from tree_layout import TreeLW, NodeLW, TreeLayoutLW
+from vistrails.core.data_structures.point import Point
+
+################################################################################
+
+class NodeVistrailsTreeLayoutLW(object):
+    """
+    Preserving the interface that version_view 
+    expects with the DotNode.
+    
+    """
+    def __init__(self):
+        """ DotNode() -> DotNode
+        Initialize DotNode as a data structure holding geometry info
+        
+        """
+        self.p = Point(0,0)
+        self.height = 0.0        
+        self.width = 0.0
+        self.id = 0
+
+    def move(self, x, y):
+        """ move(x: float, y: float) -> None
+
+        """
+        self.p.x = self.p.x + x
+        self.p.y = self.p.y + y
+
+class VistrailsTreeLayoutLW(object):
+    """
+    DotLayout is the graph outputed from Dotty which will be used and
+    parsed by version tree view
+    
+    """
+    def __init__(self, text_width_f, text_height, text_horizontal_margin,
+                 text_vertical_margin):
+        """ DotLayout() -> DotLayout()
+        Initialize DotNode as a data structure holding graph structure
+        
+        """
+        self.text_width_f = text_width_f
+        self.text_height = text_height
+        self.text_horizontal_margin = text_horizontal_margin
+        self.text_vertical_margin = text_vertical_margin
+        self.nodes = {}
+        self.height = 0.0
+        self.scale = 0.0
+        self.width = 0.0
+
+    def generateTreeLW(self, vistrail, graph):
+        """ output_vistrail_graph(f: str) -> None
+        Using vistrail and graph to generate layout
+        
+        """
+        
+        # create list of nodes
+        X = set()
+
+        # include the root manually
+        nodes = [(0,"")]
+        X.add(0)
+
+        # include the tagged nodes
+        for id, tag_name in vistrail.get_tagMap().iteritems():
+            if id in graph.vertices:
+                nodes.append((id, tag_name))
+                X.add(id)
+
+        # mount list of edges (parent, child).
+        # preserving the order given by
+        # "graph.edges_from()".
+        edges = []
+        for id in graph.vertices:
+            froom = graph.edges_from(id)
+            for (first,second) in froom:
+                # print "arc %d -> %d" % (id, first)                
+                edges.append((id,first))
+                if id not in X:
+#                    nodes.append((id," "))
+                    nodes.append((id, vistrail.get_description(id)))
+                    X.add(id)
+                if first not in X:
+#                    nodes.append((first," "))
+                    nodes.append((first, vistrail.get_description(first)))
+                    X.add(first)
+
+        # get widths and heights for the nodes
+        empty_width = self.text_horizontal_margin + self.text_width_f(" " * 5)
+        
+        # default height for all nodes
+        height = self.text_height + self.text_vertical_margin
+
+        # create an empty tree
+        tree = TreeLW()
+
+        # create map from id to tree node
+        mapTreeNodes = {}
+
+        # add the remaining nodes
+        for id, tag in nodes:
+            width = self.text_horizontal_margin + self.text_width_f(tag)
+            width = max(width, empty_width)
+            # print "add node to the tree %d %s" % (id, tag)
+            mapTreeNodes[id] = tree.addNode(None,width,height,(id,tag))
+
+        # preserve the order of the edges
+        # to add the childs to their parents
+        for (parentId, childId) in edges:
+            # print "add arc into tree %d -> %d" % (parentId, childId)
+            parent = mapTreeNodes[parentId]
+            child = mapTreeNodes[childId]
+#             if child.parent != None:
+#                 print "child already has a parent!!! %d -> %d" % (parentId, childId)
+#                 raise ValueError("Node already has a parent")
+            tree.changeParentOfNodeWithNoParent(parent, child)
+
+        # return the tree
+        return tree
+
+    def layout_from(self, vistrail, graph):
+        """ layout_from(vistrail: VisTrail, graph: Graph) -> None
+        Take a graph from VisTrail version and use Dotty to lay it out
+        
+        """
+
+        tree = self.generateTreeLW(vistrail, graph)
+
+        min_horizontal_separation = 20
+        min_vertical_separation = 50
+
+        layout = TreeLayoutLW(tree, TreeLayoutLW.TOP,
+                              min_horizontal_separation,
+                              min_vertical_separation)
+
+        # prepare the result
+        self.nodes = {}
+        for v in tree.nodes:
+            id, tag = v.object
+            newNode = NodeVistrailsTreeLayoutLW()
+            newNode.p = Point(v.x, v.y)
+            newNode.width = v.width
+            newNode.height = v.height
+            newNode.id = id
+            # newNode.label = tag 
+            self.nodes[id] = newNode
+
+        # keep track of the bounding box 
+        # of the whole tree
+        (minx, miny, width, height) = tree.boundingBox()
+        self.scale = 0.0
+        self.width = width
+        self.height = height
+
+    def move_node(self, id, x, y):
+        """ move_node(id: int, x: float, y: float) -> None
+
+        """
+        self.nodes[id].move(x,y)
+
+    def add_node(self, id, node):
+        """ add_node(id: int, node: NodeVistrailsTreeLayoutLW) -> None
+        
+        """
+        self.nodes[id] = node
diff --git a/vistrails/core/layout/workflow_layout.py b/vistrails/core/layout/workflow_layout.py
new file mode 100644
index 0000000..3b4e7e7
--- /dev/null
+++ b/vistrails/core/layout/workflow_layout.py
@@ -0,0 +1,774 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This code creates layouts for workflow digraphs.
+Originally written by Lauro D. Lins.
+
+"""
+
+####################################################
+
+def uniquify(seq, idfun=None): 
+    # order preserving
+    if idfun is None:
+        def idfun(x): return x
+    seen = {}
+    result = []
+    for item in seq:
+        marker = idfun(item)
+        # in old Python versions:
+        # if seen.has_key(marker)
+        # but in new ones:
+        if marker in seen: continue
+        seen[marker] = 1
+        result.append(item)
+    return result
+
+
+class Defaults(object):
+    u            = 10.0
+    label_margin = 20.0 
+
+class Vec2(object):
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+    def set(self, x, y):
+        self.x = x
+        self.y = y
+    def __add__(self, other):
+        if isinstance(other, (float, int)):
+            return Vec2(self.x + other, self.y + other)
+        else:
+            return Vec2(self.x + other.x, self.y + other.y)
+    def __radd__(self, other):
+        return self.__add__(other)
+    def __sub__(self, other):
+        if isinstance(other, (float, int)):
+            return Vec2(self.x - other, self.y - other)
+        else:
+            return Vec2(self.x - other.x, self.y - other.y)
+    def __rsub__(self, other):
+        return self.__sub__(other)
+    def __mul__(self, other):
+        if isinstance(other, (float, int)):
+            return Vec2(self.x * other, self.y * other)
+        else:
+            return Vec2(self.x * other.x, self.y * other.y)
+    def __rmul__(self, other):
+        return self.__mul__(other)
+    def dot(self, other):
+        return self.x * other.x + self.y * other.y
+    def __str__(self):
+        return "(%.2f, %.2f)" % (self.x, self.y)
+    def __repr__(self):
+        return "(%.2f, %.2f)" % (self.x, self.y)
+
+####################################################
+
+UNDEFINED_LAYER = None
+INPUT_PORT, OUTPUT_PORT = 1,2
+
+class Pipeline(object):
+
+    def __init__(self):
+        self.modules     = []
+        self.connections = []
+
+    def createModule(self, shortname, name, num_input_ports, num_output_ports, prev_x=None):
+        mod = Module(self, len(self.modules), shortname, name, num_input_ports, num_output_ports, prev_x)
+        self.modules.append(mod)
+        return mod
+
+    def createConnection(self, mod_source, port_source_idx, mod_target, port_target_idx):     
+        source_port = mod_source.getOutputPort(port_source_idx)
+        target_port = mod_target.getInputPort(port_target_idx)
+
+        conn = Connection(self, source_port, target_port)
+        source_port.addConnection(conn)
+        target_port.addConnection(conn)
+
+        self.connections.append(conn)
+
+        return conn
+
+    # def updateCache(self):
+    #     self.cached_num_modules      = len(self.modules)
+    #     self.cached_num_connections  = len(self.connections)
+
+
+
+class Module(object):
+
+    def __init__(self, workflow, key, shortname, name, num_input_ports, num_output_ports, prev_x=None):
+
+        self.workflow     = workflow
+        self.key          = key
+        self.shortname    = shortname
+        self.name         = name
+
+        self.input_ports  = [ Port(self, INPUT_PORT,  i) for i in xrange(num_input_ports ) ]
+        self.output_ports = [ Port(self, OUTPUT_PORT, i) for i in xrange(num_output_ports) ]
+
+        self.layout_layer_number = UNDEFINED_LAYER
+        self.layout_layer_index  = 0
+
+        self.cached              = False
+        self.cached_in_degree    = 0
+        self.cached_out_degree   = 0
+
+        self.cached_connections_succ  = [] # successor modules
+        self.cached_connections_pred  = [] # predecessor modules
+
+        self.cached_succ         = [] # successor modules
+        self.cached_pred         = [] # predecessor modules
+
+        self.cached_num_succ     = 0
+        self.cached_num_pred     = 0
+
+        self.flags               = 0
+
+        self.layout_pos          = Vec2(0,0)
+        self.layout_dim          = Vec2(1,1)
+        
+        self.prev_x = prev_x
+
+    def clearFlags(self):
+        self.flags = 0
+
+    def updateCache(self):
+        self.cached_in_degree = self.getInDegree()
+        self.cached_out_degree = self.getOutDegree()
+
+        self.cached_connections_succ  = [] # successor modules
+        self.cached_connections_pred  = [] # predecessor modules
+
+        # cached succ
+        self.cached_succ = []
+        for p in self.output_ports:
+            p.collectOppositeModules(self.cached_succ)
+            self.cached_connections_succ.extend([c for c in p.connections])
+
+        uniquify(self.cached_succ)
+        # print "%s's of cached_succ: " % (self.shortname),
+        # print [m.name for m in self.cached_succ]
+
+
+        # cached pred
+        self.cached_pred = []
+        for p in self.input_ports:
+            p.collectOppositeModules(self.cached_pred)
+            self.cached_connections_pred.extend([c for c in p.connections])
+        uniquify(self.cached_pred)
+
+        self.cached_num_succ     = len(self.cached_succ)
+        self.cached_num_pred     = len(self.cached_pred)
+
+        self.cached = True
+
+    def getInputPort(self, idx):
+        return self.input_ports[idx]
+                              
+    def getOutputPort(self, idx):
+        return self.output_ports[idx]
+
+    def getInDegree(self):
+        count = 0
+        for ip in self.input_ports:
+            count += ip.getNumConnections()
+        return count
+
+    def getOutDegree(self):
+        count = 0
+        for ip in self.output_ports:
+            count += ip.getNumConnections()
+        return count
+
+
+
+class Connection(object):
+    def __init__(self, workflow, source_port, target_port):
+        self.workflow    = workflow
+        self.source_port = source_port # an output port
+        self.target_port = target_port # an input port
+
+    def getOppositePort(self, port):
+        if self.source_port == port:
+            return self.target_port
+        elif self.target_port == port:
+            return self.source_port
+        else:
+            raise ValueError("oppositePort problem: no opposite port")
+
+
+
+class Port(object):
+
+    def __init__(self, module, kind, index):
+        self.module      = module
+        self.kind        = kind
+        self.index       = index
+        self.connections = []
+
+        self.layout_pos  = Vec2(0,0)
+        self.layout_dim  = Vec2(1,1)
+
+    def getNumConnections(self):
+        return len(self.connections)
+
+    def addConnection(self, connection):
+        self.connections.append(connection)
+
+        # module is not cached
+        self.module.cached = False
+
+    def collectOppositeModules(self, lst):
+        for c in self.connections:
+            lst.append(c.getOppositePort(self).module)
+
+
+
+class ItemDFS(object):
+    def __init__(self, module, index, max_index):
+        self.module    = module
+        self.index     = index
+        self.max_index = max_index
+
+        # the creation of ItemDFS implies
+        # that it will be stacked on the DFSIterator
+        # and the module flag goes from 0 to 1
+        self.module.flags = 1
+
+
+
+class DFSIterator(object):
+
+    def __init__(self, workflow, update_module_cache=False):
+        self.stack = []
+
+        # stack source modules
+        for m in workflow.modules:
+
+            m.clearFlags()
+
+            if not m.cached:
+                m.updateCache()
+
+            if m.cached_in_degree == 0: # source modules
+                m.flags = 1
+                self.stack.append(ItemDFS(m,-1,m.cached_num_succ))
+
+
+    def next(self):
+        
+        while len(self.stack) > 0:
+
+            top = self.stack[-1]
+            top.index += 1
+            mod = top.module
+            
+            #DEBUG
+            #print "pop %s index %d max_index %d" % (mod.shortname, top.index, top.max_index)
+
+            if top.index >= top.max_index:
+                self.stack.pop()
+                return mod
+            else:
+                next_mod = mod.cached_succ[top.index]
+                if next_mod.flags > 0:
+                    continue
+                next_mod.flags = 1
+                self.stack.append(ItemDFS(next_mod, -1, next_mod.cached_num_succ))
+
+        return None
+
+class Layer(object):
+
+    def __init__(self, index):
+        self.index   = index
+        self.modules = []
+
+        self.y = 0.0
+
+        self.max_module_height = 0.0
+        self.sum_modules_width = 0.0
+
+    def addModule(self, module):
+        self.modules.append(module)
+
+        self.sum_modules_width += module.layout_dim.x
+        self.max_module_height  = max(self.max_module_height,module.layout_dim.y)
+
+        # print "addModule(self, module): max_module_height = ", self.max_module_height
+
+
+
+class Layers(object):
+
+    def __init__(self):
+        self.layers  = []
+
+    def addModule(self, module, layer_number):
+
+        num_layers = len(self.layers)
+
+        # print "num_layers",    num_layers
+        # print "layer_number ", layer_number
+        # print "layers",self.layers
+        
+        if layer_number >= num_layers:
+           self.layers.extend([Layer(i) for i in xrange(num_layers,layer_number+1)])
+        
+        layer = self.layers[layer_number]
+        layer.addModule(module)
+
+    
+class Page(object):
+    def __init__(self, page_x0, page_y0, page_width, page_height):
+        self.x0     = page_x0
+        self.y0     = page_y0
+        self.width  = page_width
+        self.height = page_height
+
+    def __str__(self):
+        # print self.x0
+        # print self.y0
+        # print self.width
+        # print self.height
+        return "%.2f %.2f %.2f %.2f" % (self.x0, self.y0, self.width, self.height)
+
+class WorkflowLayout(object):
+    def __init__(self, wf, module_size_f, module_margin, port_size,
+                 port_interspace):
+        self.wf = wf
+        self.module_size_f = module_size_f
+        self.module_margin = module_margin
+        self.port_size = port_size
+        self.port_interspace = port_interspace
+
+    #
+    # Compute sizes
+    # 
+    def compute_module_sizes(self): 
+        wf = self.wf # wf is a workflow
+
+        u = Defaults.u # u is the base unit in points to derive the other sizes 
+
+        #
+        # A module visual representation consists of three rows
+        #
+        # first row: input ports
+        # mid   row: text label
+        # third row: output ports
+        #
+        row_margin = 0.20 * u
+        row_height = u + 2 * row_margin
+
+        module_height       =  3 * row_height # three stripes of
+
+        #DEBUG
+        #print "module_height = ", module_height
+
+        module_text_margin  = u
+        module_ports_margin = row_margin
+
+        # port_margin         = 0.30 * u
+        # port_interspace     = 0.15 * u
+        # port_size           = 0.75 * u
+
+        for module in wf.modules:
+            module_width, module_height = self.module_size_f(module)
+
+            # [DK] why do we have to do this here?
+            if not module.cached:
+                module.updateCache()
+
+            max_num_ports = max(len(module.input_ports), len(module.output_ports))
+
+            # ports_width = 2*module_ports_margin + max_num_ports * u + (max_num_ports-1) * module_ports_margin 
+            # text_width  = 2*module_text_margin  + len(module.name) * u * 0.6
+
+            # module_width = max(ports_width, text_width)
+
+            module.layout_pos.set(0,0)
+            module.layout_dim.set(module_width, module_height)
+
+            for port_list, do_reverse, d in [(module.input_ports, False, -1), 
+                                             (module.output_ports, True, 1)]:
+                if do_reverse:
+                    port_iter = reversed(port_list)
+                else:
+                    port_iter = port_list
+
+                for i, p in enumerate(port_iter):
+                    p.layout_pos.set(d * module_width/2.0 -
+                                     d * self.module_margin[0] -
+                                     d * (i + 0.5) * self.port_size[0] -
+                                     d * self.port_interspace * i,
+                                     d * (module_height/2.0 -
+                                          self.module_margin[1] - 
+                                          self.port_size[1]))
+                    p.layout_dim.set(*self.port_size)
+                                     
+            # for p in module.input_ports:
+            #     p.layout_pos.set(-module_width/2.0    +  # initial position
+            #                       port_margin         +  # ports margin
+            #                       (p.index + 0.5) * port_size +  # widths of previous ports + half port width
+            #                       port_interspace * p.index,     # sum of previous interspace
+            #                       -module_height / 2.0 + row_height / 2.0 )
+            #     p.layout_dim.set(*port_size)
+
+
+            # op = list(module.output_ports)
+            # op.reverse()
+            # for i in xrange(len(op)):
+            #     p = op[i]
+            #     p.layout_pos.set( module_width/2.0 - 
+            #                       port_margin - 
+            #                       (i + 0.5) * port_size -
+            #                       port_interspace * i,
+            #                       +module_height/2.0 - row_height / 2.0 )
+            #     p.layout_dim.set(port_size, port_size)
+
+    def assign_modules_to_layers(self):
+        wf = self.wf
+
+        iterator = DFSIterator(wf)
+
+        # topologically sorted permulation of the modules
+        permutation = []
+        while True:
+            mod = iterator.next()
+            if mod == None:
+                break
+            permutation.append(mod)
+        permutation.reverse()
+
+        # define layers
+        i = 0
+        for module in permutation:
+            if module.cached_num_pred == 0:
+                module.layout_layer_number = 0
+            else:
+                module.layout_layer_number = 1 + max([pred.layout_layer_number for pred in module.cached_pred])
+
+            # use permutation index as a the sort key to define
+            # the initial permutation of the modules in each layer
+            module.layout_layer_index = i
+            i += 1
+
+
+        # log
+        # for module in permutation:
+        #     print "layer of %s = %d" % (module.shortname, module.layout_layer_number)
+
+        # adjust free modules (a free module in this context is
+        # a module whose minimum successor layer and maximum predecessor layer
+        # have more than one intermediate layer in between
+
+        #
+        # TODO: adjust layer
+        for module in permutation:
+            if module.cached_num_pred == 0 and module.cached_num_succ > 0:
+                module.layout_layer_number = min([succ.layout_layer_number for succ in module.cached_succ]) - 1
+            # else:
+            #     a = min([succ.layout_layer_number for succ in module.cached_succ]) - 1
+            # print "layer of %s = %d" % (module.shortname, module.layout_layer_number)
+
+    def assign_module_to_layers_no_gaps(self):
+        if len(self.wf.modules) == 0:
+            return
+        
+        visited = set()
+        min_layer = [0]
+        def set_module_layer_number(module, layer_number):
+            module.layout_layer_number = layer_number
+            visited.add(module)
+            min_layer[0] = min(min_layer[0], layer_number)
+            for port in module.input_ports:
+                for conn in port.connections:
+                    if conn.source_port.module not in visited:
+                        set_module_layer_number(conn.source_port.module, layer_number-1)
+            for port in module.output_ports:
+                for conn in port.connections:
+                    if conn.target_port.module not in visited:
+                        set_module_layer_number(conn.target_port.module, layer_number+1)
+               
+        set_module_layer_number(self.wf.modules[0], 0)
+                        
+        #adjust all layers numbers so that the min is 0
+        if min_layer[0] < 0:
+            for module in self.wf.modules:
+                module.layout_layer_number -= min_layer[0]
+
+    def assign_module_permutation_to_each_layer(self, preserve_order=False):
+        wf = self.wf
+
+        # create layers
+        layers = Layers()
+        for module in wf.modules:
+            layers.addModule(module, module.layout_layer_number)
+
+        # sort modules by the current value of layout_layer_index
+        for layer in layers.layers:
+            layer.modules.sort(lambda a,b: a.layout_layer_index - b.layout_layer_index)
+            for i in xrange(len(layer.modules)):
+                layer.modules[i].layout_layer_index = i
+
+        #
+        num_layers = len(layers.layers)
+
+        lastModified = [-1 for i in xrange(num_layers)]
+
+        #
+        # sweep down and up reducing the number of crossings
+        # using the barycentric method (heuristic)
+        #
+        iteration = 0
+        updates = len(wf.modules)
+        while updates > 0 and iteration < 100:
+
+            # print "iteration: ", iteration
+
+            updates = 0
+
+            DOWN, UP = 1, -1
+            for direction in [DOWN, UP]:
+
+                # print "   direction:", direction
+
+                delta = 1 if direction == DOWN else -1
+
+                i0, i1 = (0,num_layers) if direction == DOWN else (num_layers-1,-1)
+
+                # sweep "direction"
+                for i in xrange(i0+delta,i1,direction):
+                # for i in xrange(2,4):
+
+
+                    i_prev = i-delta
+                    # print "      layer:"        , i
+                    # print "         layer_prev:", i_prev
+
+                    layer = layers.layers[i]
+
+                    # if one module on layer then continue
+                    num_modules = len(layer.modules)
+                    if num_modules == 1:
+                        continue
+
+                    # if nothing chaged on this layer and the "previous" layer (in the sweep direction)
+                    # in the last iteration then nothing needs to be done
+                    if iteration - lastModified[i_prev] > 1 and \
+                           iteration - lastModified[i] > 1:
+                        continue
+
+                    # apply barycentric permutation to layer "i" using neighbors on layer "i + delta"
+                    barycenters = [-1] * num_modules
+                    for j in xrange(num_modules):
+
+                        module      = layer.modules[j]
+                        connections = \
+                            module.cached_connections_pred  \
+                            if direction == DOWN else       \
+                            module.cached_connections_succ
+
+                        value = 0.0
+                        for c in connections:
+                            opposite_port = c.source_port if direction == DOWN else c.target_port
+                            value += opposite_port.module.layout_layer_index + opposite_port.index/100.0
+                        if len(connections) > 0:
+                            value /= 1.0 * len(connections)
+                            barycenters[j] = value
+
+                    for j in xrange(1,num_modules):
+                        if barycenters[j] < 0:
+                            barycenters[j] = barycenters[j-1] + 1e-5
+
+                    # print "         barycenters: ", barycenters
+
+
+                    new_order = [(barycenters[j], layer.modules[j]) for j in xrange(num_modules)]
+                    new_order.sort()
+
+                    # print "            indices before: ", [u.layout_layer_index for u in layer.modules]
+                    # print "            indices after:  ", [aux[0] for aux in new_order]
+                    # print "            names before =  ",[mod.name for mod in layer.modules]
+
+                    for j in xrange(num_modules):
+                        module = new_order[j][1]
+                        if module.layout_layer_index != j:
+                            # print "            module indexed %d goes to index %d" % (module.layout_layer_index,j)
+                            lastModified[i] = iteration
+                            updates += 1
+
+                    if lastModified[i] == iteration:
+                        for j in xrange(num_modules):
+                            module = new_order[j][1]
+                            module.layout_layer_index = j
+
+
+                    # sort using the last layout_layer_index
+                    layer.modules.sort(lambda a,b: a.layout_layer_index - b.layout_layer_index)
+                    # print "            names after =",[mod.name for mod in layer.modules]
+
+
+                # print "      updates: ", updates
+
+            # iteration
+            iteration += 1
+
+            # break
+            break
+        
+        if preserve_order:
+            for layer in layers.layers:                
+
+                # sort using the last layout_layer_index
+                layer.modules.sort(key=lambda x: x.layout_layer_index)
+            
+                #separate modules that have no previous x value
+                temp = []
+                for i in reversed(range(len(layer.modules))):
+                    if layer.modules[i].prev_x is None:
+                        temp.append((i,layer.modules.pop(i)))
+                
+                #sort on previous x
+                layer.modules.sort(key=lambda x: x.prev_x)
+                
+                #put separated modules back in their original slot
+                for item in reversed(temp):
+                    layer.modules.insert(item[0],item[1])
+                    
+                #reassign index
+                for i in range(len(layer.modules)):
+                    layer.modules[i].layout_layer_index = i
+            
+    #
+    # this method is "friend" of the classes above in the C++ sense:
+    # it can access and modify
+    #
+    def compute_layout(self, layer_x_separation, layer_y_separation): 
+        wf = self.wf # wf is a workflow
+
+        # create layers
+        layers = Layers()
+        for module in wf.modules:
+            layers.addModule(module, module.layout_layer_number)
+
+        for layer in layers.layers:# sort using the last layout_layer_index
+            layer.modules.sort(lambda a,b: a.layout_layer_index - b.layout_layer_index)
+
+        # spread layers
+        min_x = max_x = 0.0
+        y = min_y = max_y = 0.0
+
+        top_layer = True
+
+        for layer in layers.layers:
+
+            # print "layer: ", layer.index
+
+            if not top_layer:
+                y += layer_y_separation
+            else:
+                top_layer = False
+
+
+            layer_half_height = layer.max_module_height / 2.0
+
+            # print "layer_half_height", layer_half_height
+
+            y += layer_half_height
+
+
+            # print "layer ", layer.index, " y = ", y
+
+            layer_num_modules = len(layer.modules)
+            layer_width = layer.sum_modules_width + (layer_num_modules-1) * layer_x_separation
+            layer_min_x = -layer_width/2.0
+
+            x = layer_min_x
+
+            # set module positions
+            for i in xrange(layer_num_modules):
+
+                if (i > 0):
+                    x += layer_x_separation
+
+                module = layer.modules[i]
+
+                module_half_width = module.layout_dim.x / 2.0
+
+                x += module_half_width
+
+                module.layout_pos.set(x, y)
+
+                x += module_half_width
+
+            layer_max_x = x
+
+            min_x = min(min_x, layer_min_x)
+            max_x = max(max_x, layer_max_x)
+
+            y += layer_half_height
+
+        max_y = y # y only got smaller
+
+
+        #
+        page_x_margin = 3 * Defaults.u
+        page_y_margin = 3 * Defaults.u
+
+        page_util_width  = max_x - min_x
+        page_util_height = max_y - min_y
+
+        page_width  = page_util_width  + page_x_margin * 2
+        page_height = page_util_height + page_y_margin * 2
+
+        page_x0     = -page_width /2.0
+        page_y0     = -page_y_margin
+
+        page = Page(page_x0, page_y0, page_width, page_height)
+
+        return page
+
+    def run_all(self, layer_x_separation=50, layer_y_separation=50, preserve_order=False, no_gaps=False):
+        self.compute_module_sizes()
+        if no_gaps:
+            self.assign_module_to_layers_no_gaps()
+        else:
+            self.assign_modules_to_layers()
+        self.assign_module_permutation_to_each_layer(preserve_order)
+        self.compute_layout(layer_x_separation, layer_y_separation)
\ No newline at end of file
diff --git a/vistrails/core/log/__init__.py b/vistrails/core/log/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/log/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/log/controller.py b/vistrails/core/log/controller.py
new file mode 100644
index 0000000..bb44e6d
--- /dev/null
+++ b/vistrails/core/log/controller.py
@@ -0,0 +1,362 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.log.workflow_exec import WorkflowExec
+from vistrails.core.log.module_exec import ModuleExec
+from vistrails.core.log.loop_exec import LoopExec
+from vistrails.core.log.group_exec import GroupExec
+from vistrails.core.log.machine import Machine
+from vistrails.core.modules.sub_module import Group, Abstraction
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.vistrail import Vistrail
+import vistrails.core.system
+
+class DummyLogController(object):
+    """DummyLogger is a class that has the entire interface for a logger
+    but simply ignores the calls."""
+    def start_workflow_execution(self, *args, **kwargs): pass
+    def finish_workflow_execution(self, *args, **kwargs): pass
+    def create_module_exec(self, *args, **kwargs): pass
+    def create_group_exec(self, *args, **kwargs): pass
+    def create_loop_exec(self, *args, **kwargs): pass
+    def start_execution(self, *args, **kwargs): pass
+    def finish_execution(self, *args, **kwargs): pass
+    def start_module_loop_execution(self, *args, **kwargs): pass
+    def finish_module_loop_execution(self, *args, **kwargs): pass
+    def start_group_loop_execution(self, *args, **kwargs): pass
+    def finish_group_loop_execution(self, *args, **kwargs): pass
+    def start_module_execution(self, *args, **kwargs): pass
+    def finish_module_execution(self, *args, **kwargs): pass
+    def start_group_execution(self, *args, **kwargs): pass
+    def finish_group_execution(self, *args, **kwargs): pass
+    def start_loop_execution(self, *args, **kwargs): pass
+    def finish_loop_execution(self, *args, **kwargs): pass
+    def insert_module_annotations(self, *args, **kwargs): pass
+    def insert_workflow_exec_annotations(self, *args, **kwargs): pass
+    def add_exec(self, *args, **kwargs): pass
+
+class LogControllerFactory(object):
+    _instance = None
+    class LogControllerFactorySingleton(object):
+        def __call__(self, *args, **kw):
+            if LogControllerFactory._instance is None:
+                obj = LogControllerFactory(*args, **kw)
+                LogControllerFactory._instance = obj
+            return LogControllerFactory._instance
+        
+    getInstance = LogControllerFactorySingleton()
+    
+    def __init__(self):
+        self.machine = Machine(id=-1,
+                               name=vistrails.core.system.current_machine(),
+                               os=vistrails.core.system.systemType,
+                               architecture=vistrails.core.system.current_architecture(),
+                               processor=vistrails.core.system.current_processor(),
+                               ram=vistrails.core.system.guess_total_memory())
+    
+    def create_logger(self, log):
+        return LogController(log, self.machine)
+
+LogControllerFactory.getInstance()
+
+class LogController(object):
+    def __init__(self, log, machine):
+        self.log = log
+        self.workflow_exec = None
+        self.machine = machine
+        to_add = True
+        for machine in self.log.machine_list:
+            if self.machine.equals_no_id(machine):
+                to_add = False
+                self.machine = machine
+        if to_add:
+            self.machine.id = self.log.id_scope.getNewId(Machine.vtType)
+            self.log.add_machine(self.machine)
+            
+    def start_workflow_execution(self, vistrail=None, pipeline=None, 
+                                 currentVersion=None):
+        if vistrail is not None:
+            parent_type = Vistrail.vtType
+            parent_id = vistrail.id
+        else:
+            parent_type = Pipeline.vtType
+            parent_id = pipeline.id
+
+        wf_exec_id = self.log.id_scope.getNewId(WorkflowExec.vtType)
+        if vistrail is not None:
+            session = vistrail.current_session
+        else:
+            session = None
+        self.workflow_exec = WorkflowExec(id=wf_exec_id,
+                                          user=vistrails.core.system.current_user(),
+                                          ip=vistrails.core.system.current_ip(),
+                                          vt_version= \
+                                              vistrails.core.system.vistrails_version(),
+                                          ts_start=vistrails.core.system.current_time(),
+                                          parent_type=parent_type,
+                                          parent_id=parent_id,
+                                          parent_version=currentVersion,
+                                          completed=0,
+                                          session=session)
+        self.log.add_workflow_exec(self.workflow_exec)
+
+    def finish_workflow_execution(self, errors, suspended=False):
+        self.workflow_exec.ts_end = vistrails.core.system.current_time()
+        if suspended:
+            self.workflow_exec.completed = -2
+        elif len(errors) > 0:
+            self.workflow_exec.completed = -1
+        else:
+            self.workflow_exec.completed = 1
+            
+    def add_exec(self, exec_, parent_execs):
+        parent_exec = parent_execs[-1]
+        if parent_exec:
+            parent_exec.add_item_exec(exec_)
+        else:
+            self.workflow_exec.add_item_exec(exec_)
+
+    def create_module_exec(self, module, module_id, module_name,
+                           cached):
+        m_exec_id = self.log.id_scope.getNewId(ModuleExec.vtType)
+        module_exec = ModuleExec(id=m_exec_id,
+                                 machine_id=self.machine.id,
+                                 module_id=module_id,
+                                 module_name=module_name,
+                                 cached=cached,
+                                 ts_start=vistrails.core.system.current_time(),
+                                 completed=0)
+        return module_exec
+
+    def create_group_exec(self, group, module_id, group_name, cached):
+        g_exec_id = self.log.id_scope.getNewId(GroupExec.vtType)
+        if isinstance(group, Abstraction):
+            group_type = 'SubWorkflow'
+        else:
+            group_type = 'Group'
+        group_exec = GroupExec(id=g_exec_id,
+                               machine_id=self.machine.id,
+                               module_id=module_id,
+                               group_name=group_name,
+                               group_type=group_type,
+                               cached=cached,
+                               ts_start=vistrails.core.system.current_time(),
+                               completed=0)
+        return group_exec
+
+    def create_loop_exec(self, iteration):
+        l_exec_id = self.log.id_scope.getNewId(LoopExec.vtType)
+        loop_exec = LoopExec(id=l_exec_id,
+                             iteration=iteration,
+                             ts_start=vistrails.core.system.current_time())
+        return loop_exec
+
+    def start_execution(self, module, module_id, module_name, parent_execs,
+                        cached=0):
+        parent_exec = parent_execs[-1]
+        if module.is_looping:
+            parent_exec = self.start_loop_execution(module, module_id, 
+                                                    module_name, 
+                                                    parent_exec, cached,
+                                                    module.loop_iteration)
+            parent_execs.append(parent_exec)
+
+        if isinstance(module, Group):
+            ret = self.start_group_execution(module, module_id, module_name,
+                                             parent_exec, cached)
+            if ret is not None:
+                parent_execs.append(ret)
+        else:
+            ret = self.start_module_execution(module, module_id, module_name,
+                                              parent_exec, cached)
+            if ret is not None:
+                parent_execs.append(ret)
+        
+    def finish_execution(self, module, error, parent_execs, errorTrace=None,
+                         suspended=False):
+        if isinstance(module, Group):
+            if self.finish_group_execution(module, error, suspended):
+                parent_execs.pop()
+        else:
+            if self.finish_module_execution(module, error, errorTrace, suspended):
+                parent_execs.pop()
+        if module.is_looping:
+            self.finish_loop_execution(module, error, parent_execs.pop(), suspended)
+
+    def start_module_execution(self, module, module_id, module_name,
+                               parent_exec, cached):
+        module_exec = self.create_module_exec(module, module_id,
+                                              module_name,
+                                              cached)
+        module.module_exec = module_exec
+        if parent_exec:
+            parent_exec.add_item_exec(module_exec)
+        else:
+            self.workflow_exec.add_item_exec(module_exec)
+        if module.is_looping_module:
+            return module_exec
+        return None
+
+    def finish_module_execution(self, module, error, errorTrace=None,
+                                suspended=False):
+        if not hasattr(module,'module_exec'):
+            return False
+        module.module_exec.ts_end = vistrails.core.system.current_time()
+        if suspended:
+            module.module_exec.completed = -2
+            module.module_exec.error = error
+        elif not error:
+            module.module_exec.completed = 1
+        else:
+            module.module_exec.completed = -1
+            module.module_exec.error = error
+            if errorTrace:
+                a_id = self.log.id_scope.getNewId(Annotation.vtType)
+                annotation = Annotation(id=a_id,
+                                        key="errorTrace",
+                                        value=errorTrace)
+                module.module_exec.add_annotation(annotation)
+        del module.module_exec
+        if module.is_looping_module:
+            return True
+
+    def start_group_execution(self, group, module_id, group_name,
+                              parent_exec, cached):
+        group_exec = self.create_group_exec(group, module_id,
+                                            group_name, cached)
+        group.group_exec = group_exec
+        if parent_exec:
+            parent_exec.add_item_exec(group_exec)
+        else:
+            self.workflow_exec.add_item_exec(group_exec)
+        return group_exec
+
+    def finish_group_execution(self, group, error, suspended=False):
+        if not hasattr(group,'group_exec'):
+            return False
+        group.group_exec.ts_end = vistrails.core.system.current_time()
+        if suspended:
+            group.group_exec.completed = -2
+            group.group_exec.error = error
+        elif not error:
+            group.group_exec.completed = 1
+        else:
+#             if group.group_exec.module_execs and group.group_exec.\
+#                module_execs[-1].error:
+#                 error = 'Error in module execution with id %d.'%\
+#                         group.group_exec.module_execs[-1].id
+#             if group.group_exec.group_execs and group.group_exec.\
+#                group_execs[-1].error:
+#                 error = 'Error in group execution with id %d.'%\
+#                         group.group_exec.group_execs[-1].id
+            group.group_exec.completed = -1
+            group.group_exec.error = error
+        del group.group_exec
+        return True
+
+    def start_loop_execution(self, module, module_id, module_name, 
+                             parent_exec, cached, iteration):
+        loop_exec = self.create_loop_exec(iteration)
+        if parent_exec:
+            parent_exec.add_loop_exec(loop_exec)
+        else:
+            self.workflow_exec.add_item_exec(loop_exec)
+        return loop_exec
+
+    def finish_loop_execution(self, module, error, loop_exec, suspended=True):
+        if not loop_exec:
+            return False
+        loop_exec.ts_end = vistrails.core.system.current_time()
+        if suspended:
+            loop_exec.completed = -2
+            loop_exec.error = error
+        elif not error:
+            loop_exec.completed = 1
+        else:
+            loop_exec.completed = -1
+            loop_exec.error = error
+        return True
+
+#         is_group = isinstance(module, Group)
+#         if is_group:
+#             module.group_exec.loop_execs[-1].ts_end = core.system.\
+#                                                       current_time()
+#             if not error:
+#                 module.group_exec.loop_execs[-1].completed = 1
+#             else:
+#                 if module.group_exec.loop_execs[-1].module_execs and\
+#                    module.group_exec.loop_execs[-1].module_execs[-1].error:
+#                     error = 'Error in module execution with id %d.'%\
+#                             module.group_exec.loop_execs[-1].\
+#                             module_execs[-1].id
+#                 if module.group_exec.loop_execs[-1].group_execs and\
+#                    module.group_exec.loop_execs[-1].group_execs[-1].error:
+#                     error = 'Error in group execution with id %d.'%\
+#                             module.group_exec.loop_execs[-1].\
+#                             group_execs[-1].id
+#                 module.group_exec.loop_execs[-1].completed = -1
+#                 module.group_exec.loop_execs[-1].error = error
+#         else:
+#             module.module_exec.loop_execs[-1].ts_end = core.system.\
+#                                                        current_time()
+#             if not error:
+#                 module.module_exec.loop_execs[-1].completed = 1
+#             else:
+#                 module.module_exec.loop_execs[-1].completed = -1
+#                 module.module_exec.loop_execs[-1].error = error
+#         return True
+
+    def insert_module_annotations(self, module, a_dict):
+        for k,v in a_dict.iteritems():
+            a_id = self.log.id_scope.getNewId(Annotation.vtType)
+            annotation = Annotation(id=a_id,
+                                    key=k,
+                                    value=v)
+            if hasattr(module, 'is_group'):
+                module.group_exec.add_annotation(annotation)
+            else:
+                module.module_exec.add_annotation(annotation)
+            
+    def insert_workflow_exec_annotations(self, a_dict):
+        """insert_workflow_exec_annotations(a_dict)-> None
+        This will create an annotation for each pair in a_dict in 
+        self.workflow_exec"""
+        if self.workflow_exec:
+            for k,v in a_dict.iteritems():
+                a_id = self.log.id_scope.getNewId(Annotation.vtType)
+                annotation = Annotation(id=a_id,
+                                        key=k,
+                                        value=v)
+                self.workflow_exec.add_annotation(annotation)
diff --git a/vistrails/core/log/group_exec.py b/vistrails/core/log/group_exec.py
new file mode 100644
index 0000000..bd0a75d
--- /dev/null
+++ b/vistrails/core/log/group_exec.py
@@ -0,0 +1,104 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.log.module_exec import ModuleExec
+from vistrails.core.log.loop_exec import LoopExec
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.db.domain import DBGroupExec
+
+class GroupExec(DBGroupExec):
+    """ Class that stores info for logging a group/abstraction execution. """
+
+    def __init__(self, *args, **kwargs):
+        DBGroupExec.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroupExec.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = GroupExec
+        return cp
+
+    @staticmethod
+    def convert(_group_exec):
+        if _group_exec.__class__ == GroupExec:
+            return
+        _group_exec.__class__ = GroupExec
+        for annotation in _group_exec.annotations:
+            Annotation.convert(annotation)
+        for item_exec in _group_exec.item_execs:
+            if item_exec.vtType == ModuleExec.vtType:
+                ModuleExec.convert(item_exec)
+            elif item_exec.vtType == GroupExec.vtType:
+                GroupExec.convert(item_exec)
+            elif item_exec.vtType == LoopExec.vtType:
+                LoopExec.convert(item_exec)            
+
+    ##########################################################################
+    # Properties
+
+    id = DBGroupExec.db_id
+    ts_start = DBGroupExec.db_ts_start
+    ts_end = DBGroupExec.db_ts_end
+    cached = DBGroupExec.db_cached
+    module_id = DBGroupExec.db_module_id
+    group_name = DBGroupExec.db_group_name
+    group_type = DBGroupExec.db_group_type
+    completed = DBGroupExec.db_completed
+    error = DBGroupExec.db_error
+    machine_id = DBGroupExec.db_machine_id
+
+    def _get_duration(self):
+        if self.db_ts_end is not None:
+            return self.db_ts_end - self.db_ts_start
+        return None
+    duration = property(_get_duration)
+
+    def _get_annotations(self):
+        return self.db_annotations
+    def _set_annotations(self, annotations):
+        self.db_annotations = annotations
+    annotations = property(_get_annotations, _set_annotations)
+    def add_annotation(self, annotation):
+        self.db_add_annotation(annotation)
+
+    def _get_item_execs(self):
+        return self.db_item_execs
+    def _set_item_execs(self, item_execs):
+        self.db_item_execs = item_execs
+    item_execs = property(_get_item_execs, _set_item_execs)
+    def add_item_exec(self, item_exec):
+        self.db_add_item_exec(item_exec)
+
diff --git a/vistrails/core/log/log.py b/vistrails/core/log/log.py
new file mode 100644
index 0000000..db05bf2
--- /dev/null
+++ b/vistrails/core/log/log.py
@@ -0,0 +1,103 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+
+from vistrails.core.log.machine import Machine
+from vistrails.core.log.workflow_exec import WorkflowExec
+from vistrails.db.domain import DBLog
+
+class Log(DBLog):
+    """ Class that stores info for logging a workflow execution. """
+
+    def __init__(self, *args, **kwargs):
+        DBLog.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Log
+        return cp
+
+    @staticmethod
+    def convert(_log):
+        if _log.__class__ == Log:
+            return
+        _log.__class__ = Log
+        for machine in _log.machine_list:
+            Machine.convert(machine)
+        for workflow_exec in _log.workflow_execs:
+            WorkflowExec.convert(workflow_exec)
+
+
+    ##########################################################################
+    # Properties
+
+    def _get_id(self):
+        return self.db_id
+    def _set_id(self, id):
+        self.db_id = id
+    id = property(_get_id, _set_id)
+
+    def _get_machines(self):
+        return self.db_machines_id_index
+    machines = property(_get_machines)
+    def _get_machine_list(self):
+        return self.db_machines
+    machine_list = property(_get_machine_list)
+    def add_machine(self, machine):
+        self.db_add_machine(machine)
+
+    def _get_workflow_execs(self):
+        return self.db_workflow_execs
+    workflow_execs = property(_get_workflow_execs)
+    def add_workflow_exec(self, wf_exec):
+        self.db_add_workflow_exec(wf_exec)
+
+    def delete_all_workflow_execs(self):
+        for wf_exec in copy.copy(self.workflow_execs):
+            self.db_delete_workflow_exec(wf_exec)
+
+    def _get_vistrail_id(self):
+        return self.db_vistrail_id
+    def _set_vistrail_id(self, id):
+        self.db_vistrail_id = id
+    vistrail_id = property(_get_vistrail_id, _set_vistrail_id)
+
+    def get_last_workflow_exec_id(self):
+        if len(self.workflow_execs) < 1:
+            return -1
+        return max(wf_exec.id for wf_exec in self.workflow_execs)
diff --git a/vistrails/core/log/loop_exec.py b/vistrails/core/log/loop_exec.py
new file mode 100644
index 0000000..3b1495b
--- /dev/null
+++ b/vistrails/core/log/loop_exec.py
@@ -0,0 +1,88 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBLoopExec
+
+class LoopExec(DBLoopExec):
+    """ Class that stores info for logging a loop execution. """
+
+    def __init__(self, *args, **kwargs):
+        DBLoopExec.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLoopExec.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = LoopExec
+        return cp
+
+    @staticmethod
+    def convert(_loop_exec):
+        from vistrails.core.log.module_exec import ModuleExec
+        from vistrails.core.log.group_exec import GroupExec
+
+        if _loop_exec.__class__ == LoopExec:
+            return
+        _loop_exec.__class__ = LoopExec
+        for item_exec in _loop_exec.item_execs:
+            if item_exec.vtType == ModuleExec.vtType:
+                ModuleExec.convert(item_exec)
+            elif item_exec.vtType == GroupExec.vtType:
+                GroupExec.convert(item_exec)
+            elif item_exec.vtType == LoopExec.vtType:
+                LoopExec.convert(item_exec)
+
+    ##########################################################################
+    # Properties
+
+    id = DBLoopExec.db_id
+    ts_start = DBLoopExec.db_ts_start
+    ts_end = DBLoopExec.db_ts_end
+    completed = DBLoopExec.db_completed
+    error = DBLoopExec.db_error
+
+    def _get_duration(self):
+        if self.db_ts_end is not None:
+            return self.db_ts_end - self.db_ts_start
+        return None
+    duration = property(_get_duration)
+
+    def _get_item_execs(self):
+        return self.db_item_execs
+    def _set_item_execs(self, item_execs):
+        self.db_item_execs = item_execs
+    item_execs = property(_get_item_execs, _set_item_execs)
+    def add_item_exec(self, item_exec):
+        self.db_add_item_exec(item_exec)
diff --git a/vistrails/core/log/machine.py b/vistrails/core/log/machine.py
new file mode 100644
index 0000000..14842a1
--- /dev/null
+++ b/vistrails/core/log/machine.py
@@ -0,0 +1,104 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBMachine
+
+class Machine(DBMachine):
+    """ Class that stores info for logging a module execution. """
+
+    def __init__(self, *args, **kwargs):
+        DBMachine.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Machine
+        return cp
+
+    @staticmethod
+    def convert(_machine):
+        if _machine.__class__ == Machine:
+            return
+        _machine.__class__ = Machine
+
+    ##########################################################################
+    # Properties
+
+    def _get_id(self):
+        return self.db_id
+    def _set_id(self, id):
+        self.db_id = id
+    id = property(_get_id, _set_id)
+
+    def _get_name(self):
+        return self.db_name
+    def _set_name(self, name):
+        self.db_name = name
+    name = property(_get_name, _set_name)
+
+    def _get_os(self):
+        return self.db_os
+    def _set_os(self, os):
+        self.db_os = os
+    os = property(_get_os, _set_os)
+
+    def _get_architecture(self):
+        return self.db_architecture
+    def _set_architecture(self, architecture):
+        self.db_architecture = architecture
+    architecture = property(_get_architecture, _set_architecture)
+
+    def _get_processor(self):
+        return self.db_processor
+    def _set_processor(self, processor):
+        self.db_processor = processor
+    processor = property(_get_processor, _set_processor)
+
+    def _get_ram(self):
+        return self.db_ram
+    def _set_ram(self, ram):
+        self.db_ram = ram
+    ram = property(_get_ram, _set_ram)
+
+    ##########################################################################
+    # Properties
+
+    def equals_no_id(self, other):
+        return (self.name == other.name and
+                self.os == other.os and
+                self.architecture == other.architecture and
+                self.processor == other.processor and
+                self.ram == other.ram)
diff --git a/vistrails/core/log/module_exec.py b/vistrails/core/log/module_exec.py
new file mode 100644
index 0000000..789d044
--- /dev/null
+++ b/vistrails/core/log/module_exec.py
@@ -0,0 +1,97 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.log.loop_exec import LoopExec
+from vistrails.db.domain import DBModuleExec
+
+class ModuleExec(DBModuleExec):
+    """ Class that stores info for logging a module execution. """
+
+    def __init__(self, *args, **kwargs):
+        DBModuleExec.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ModuleExec
+        return cp
+
+    @staticmethod
+    def convert(_module_exec):
+        if _module_exec.__class__ == ModuleExec:
+            return
+        _module_exec.__class__ = ModuleExec
+        for annotation in _module_exec.annotations:
+            Annotation.convert(annotation)
+        for loop_exec in _module_exec.loop_execs:
+            LoopExec.convert(loop_exec)
+
+    ##########################################################################
+    # Properties
+
+    id = DBModuleExec.db_id
+    ts_start = DBModuleExec.db_ts_start
+    ts_end = DBModuleExec.db_ts_end
+    cached = DBModuleExec.db_cached
+    completed = DBModuleExec.db_completed
+    module_id = DBModuleExec.db_module_id
+    module_name = DBModuleExec.db_module_name
+    machine_id = DBModuleExec.db_machine_id
+    error = DBModuleExec.db_error
+
+    def _get_duration(self):
+        if self.db_ts_end is not None:
+            return self.db_ts_end - self.db_ts_start
+        return None
+    duration = property(_get_duration)
+
+    def _get_annotations(self):
+        return self.db_annotations
+    def _set_annotations(self, annotations):
+        self.db_annotations = annotations
+    annotations = property(_get_annotations, _set_annotations)
+    def add_annotation(self, annotation):
+        self.db_add_annotation(annotation)
+
+    def _get_loop_execs(self):
+        return self.db_loop_execs
+    def _set_loop_execs(self, loop_execs):
+        self.db_loop_execs = loop_execs
+    loop_execs = property(_get_loop_execs, _set_loop_execs)
+    def add_loop_exec(self, loop_exec):
+        self.db_add_loop_exec(loop_exec)
+        
diff --git a/vistrails/core/log/opm_graph.py b/vistrails/core/log/opm_graph.py
new file mode 100644
index 0000000..bd9a2b5
--- /dev/null
+++ b/vistrails/core/log/opm_graph.py
@@ -0,0 +1,88 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBOpmGraph
+
+class OpmGraph(DBOpmGraph):
+    """ Class that stores info for generating OPM Provenance. """
+
+    def __init__(self, *args, **kwargs):
+        if 'log' in kwargs:
+            self.log = kwargs['log']
+            del kwargs['log']
+        else:
+            self.log = None
+        if 'workflow' in kwargs:
+            self.workflow = kwargs['workflow']
+            del kwargs['workflow']
+        elif 'pipeline' in kwargs:
+            self.workflow = kwargs['pipeline']
+            del kwargs['pipeline']
+        else:
+            self.workflow = None
+        if 'registry' in kwargs:
+            self.registry = kwargs['registry']
+            del kwargs['registry']
+        else:
+            self.registry = None
+        if 'version' in kwargs:
+            self.version = kwargs['version']
+            del kwargs['version']
+        else:
+            self.version = None
+        DBOpmGraph.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self):
+        cp = DBOpmGraph.__copy__(self)
+        cp.__class__ = OpmGraph
+        cp.log = self.log
+        cp.workflow = self.workflow
+        cp.version = self.version
+        cp.registry = self.registry
+        return cp
+
+    @staticmethod
+    def convert(_graph):
+        if _graph.__class__ == OpmGraph:
+            return
+        _graph.__class__ = OpmGraph
+
+    ##########################################################################
+    # Properties
+
+    # No need to do properties right now...
+
diff --git a/vistrails/core/log/prov_document.py b/vistrails/core/log/prov_document.py
new file mode 100644
index 0000000..b9c3117
--- /dev/null
+++ b/vistrails/core/log/prov_document.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBProvDocument
+
+class ProvDocument(DBProvDocument):
+    """ Class that stores info for generating PROV model. """
+
+    def __init__(self, *args, **kwargs):
+        if 'log' in kwargs:
+            self.log = kwargs['log']
+            del kwargs['log']
+        else:
+            self.log = None
+        if 'workflow' in kwargs:
+            self.workflow = kwargs['workflow']
+            del kwargs['workflow']
+        else:
+            self.workflow = None
+        if 'registry' in kwargs:
+            self.registry = kwargs['registry']
+            del kwargs['registry']
+        else:
+            self.registry = None
+        if 'version' in kwargs:
+            self.version = kwargs['version']
+            del kwargs['version']
+        else:
+            self.version = None
+        DBProvDocument.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self):
+        cp = DBProvDocument.__copy__(self)
+        cp.__class__ = ProvDocument
+        cp.log = self.log
+        cp.workflow = self.workflow
+        cp.version = self.version
+        cp.registry = self.registry
+        return cp
+
+    @staticmethod
+    def convert(_graph):
+        if _graph.__class__ == ProvDocument:
+            return
+        _graph.__class__ = ProvDocument
+
+    ##########################################################################
+    # Properties
+
+    # No need to do properties right now...
+
diff --git a/vistrails/core/log/workflow_exec.py b/vistrails/core/log/workflow_exec.py
new file mode 100644
index 0000000..0ca9dc6
--- /dev/null
+++ b/vistrails/core/log/workflow_exec.py
@@ -0,0 +1,106 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.log.module_exec import ModuleExec
+from vistrails.core.log.group_exec import GroupExec
+from vistrails.core.log.loop_exec import LoopExec
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.db.domain import DBWorkflowExec
+
+class WorkflowExec(DBWorkflowExec):
+    """ Class that stores info for logging a workflow execution. """
+
+    def __init__(self, *args, **kwargs):
+        DBWorkflowExec.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = WorkflowExec
+        return cp
+
+    @staticmethod
+    def convert(_wf_exec):
+        if _wf_exec.__class__ == WorkflowExec:
+            return
+        _wf_exec.__class__ = WorkflowExec
+        for annotation in _wf_exec.annotations:
+            Annotation.convert(annotation)
+        for item_exec in _wf_exec.item_execs:
+            if item_exec.vtType == ModuleExec.vtType:
+                ModuleExec.convert(item_exec)
+            elif item_exec.vtType == GroupExec.vtType:
+                GroupExec.convert(item_exec)
+            elif item_exec.vtType == LoopExec.vtType:
+                LoopExec.convert(item_exec)
+
+    ##########################################################################
+    # Properties
+
+    id = DBWorkflowExec.db_id
+    user = DBWorkflowExec.db_user
+    ip = DBWorkflowExec.db_ip
+    session = DBWorkflowExec.db_session
+    vt_version = DBWorkflowExec.db_vt_version
+    ts_start = DBWorkflowExec.db_ts_start
+    ts_end = DBWorkflowExec.db_ts_end
+    parent_type = DBWorkflowExec.db_parent_type
+    parent_id = DBWorkflowExec.db_parent_id
+    parent_version = DBWorkflowExec.db_parent_version
+    name = DBWorkflowExec.db_name
+    completed = DBWorkflowExec.db_completed
+
+    def _get_duration(self):
+        if self.db_ts_end is not None:
+            return self.db_ts_end - self.db_ts_start
+        return None
+    duration = property(_get_duration)
+
+    def _get_annotations(self):
+        return self.db_annotations
+    def _set_annotations(self, annotations):
+        self.db_annotations = annotations
+    annotations = property(_get_annotations, _set_annotations)
+    def add_annotation(self, annotation):
+        self.db_add_annotation(annotation)
+        
+    def _get_item_execs(self):
+        return self.db_item_execs
+    def _set_item_execs(self, item_execs):
+        self.db_item_execs = item_execs
+    item_execs = property(_get_item_execs, _set_item_execs)
+    def add_item_exec(self, item_exec):
+        self.db_add_item_exec(item_exec)
diff --git a/vistrails/core/mashup/__init__.py b/vistrails/core/mashup/__init__.py
new file mode 100644
index 0000000..3376fe3
--- /dev/null
+++ b/vistrails/core/mashup/__init__.py
@@ -0,0 +1,130 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import uuid
+from datetime import date, datetime
+from time import strptime
+################################################################################                           
+
+def conv_to_bool(x):
+    if isinstance(x, str):
+        s = str(x).upper()
+        if s == 'TRUE':
+            return True
+        if s == 'FALSE':
+            return False
+    elif isinstance(x, (int, long)):
+        if x == 0:
+            return False
+        else:
+            return True
+    elif isinstance(x, bool):
+        return x
+        
+def conv_from_bool(x):
+    if isinstance(x, bool):
+        if x == True:
+            return 1
+        else:
+            return 0
+    elif isinstance(x, (int, long)):
+        return x
+    
+def convert_symbols(val):
+    val = val.replace("<", "<")
+    val = val.replace(">", ">")
+    val = val.replace("&","&")
+    return val
+
+
+
+#class XMLObject(object):
+#    """Base class for mashup classes"""
+#    @staticmethod
+#    def convert_from_str(value, type):
+#        def bool_conv(x):
+#            s = str(x).upper()
+#            if s == 'TRUE':
+#                return True
+#            if s == 'FALSE':
+#                return False
+#
+#        if value is not None:
+#            if type == 'str':
+#                return str(value)
+#            elif value.strip() != '':
+#                if type == 'long':
+#                    return long(value)
+#                elif type == 'float':
+#                    return float(value)
+#                elif type == 'int':
+#                    return int(value)
+#                elif type == 'bool':
+#                    return bool_conv(value)
+#                elif type == 'date':
+#                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+#                elif type == 'datetime':
+#                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+#                elif type == 'uuid':
+#                    return uuid.UUID(value)
+#        return None
+#
+#    @staticmethod
+#    def convert_to_str(value,type):
+#        if value is not None:
+#            if type == 'date':
+#                return value.isoformat()
+#            elif type == 'datetime':
+#                return value.strftime('%Y-%m-%d %H:%M:%S')
+#            else:
+#                return str(value)
+#        return ''
+#    
+#    @staticmethod
+#    def indent(elem, level=0):
+#        i = "\n" + level*"  "
+#        if len(elem):
+#            if not elem.text or not elem.text.strip():
+#                elem.text = i + "  "
+#            if not elem.tail or not elem.tail.strip():
+#                elem.tail = i
+#            for elem in elem:
+#                XMLObject.indent(elem, level+1)
+#            if not elem.tail or not elem.tail.strip():
+#                elem.tail = i
+#        else:
+#            if level and (not elem.tail or not elem.tail.strip()):
+#                elem.tail = i
+################################################################################
\ No newline at end of file
diff --git a/vistrails/core/mashup/action.py b/vistrails/core/mashup/action.py
new file mode 100644
index 0000000..357aec2
--- /dev/null
+++ b/vistrails/core/mashup/action.py
@@ -0,0 +1,194 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+from vistrails.db.domain import DBMashupAction
+from vistrails.core.mashup.mashup import Mashup
+
+class Action(DBMashupAction):
+    
+    def __init__(self, id, prevId, user='', mashup=None, date=None):
+        DBMashupAction.__init__(self, id, prevId, date, user, mashup)
+        
+    id = DBMashupAction.db_id
+    prevId = DBMashupAction.db_prevId
+    parent_id = DBMashupAction.db_prevId
+    user = DBMashupAction.db_user
+    mashup = DBMashupAction.db_mashup
+        
+    def _get_date(self):
+        if self.db_date is not None:
+            return self.db_date.strftime('%d %b %Y %H:%M:%S')
+        return datetime(1900,1,1).strftime('%d %b %Y %H:%M:%S')
+
+    def _set_date(self, date):
+        if isinstance(date, datetime):
+            self.db_date = date
+        elif isinstance(date, basestring) and date.strip() != '':
+            newDate = datetime(*strptime(date, '%d %b %Y %H:%M:%S')[0:6])
+            self.db_date = newDate
+    date = property(_get_date, _set_date)
+        
+    @staticmethod
+    def convert(_action):
+        if _action.__class__ == Action:
+            return
+        _action.__class__ = Action
+        Mashup.convert(_action.mashup)
+         
+    def __copy__(self):
+        return Action.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupAction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Action
+        Mashup.convert(cp.mashup)
+        return cp
+    
+#    def toXml(self, node=None):
+#        """toXml(node: ElementTree.Element) -> ElementTree.Element
+#           writes itself to xml
+#        """
+#
+#        if node is None:
+#            node = ElementTree.Element('action')
+#        
+#        #set attributes
+#        node.set('id', self.convert_to_str(self.id,'long'))
+#        node.set('parent_id', self.convert_to_str(self.parent_id,'long'))
+#        node.set('user', self.convert_to_str(self.user,'str'))
+#        node.set('date', self.convert_to_str(self._date,'datetime'))
+#        mnode = ElementTree.SubElement(node, 'mashup')
+#        self.mashup.toXml(mnode)
+#        return node
+#    
+#    @staticmethod
+#    def fromXml(node):
+#        if node.tag != 'action':
+#            debug.debug("node.tag != 'action'")
+#            return None
+#        #read attributes
+#        data = node.get('id', None)
+#        id = Action.convert_from_str(data, 'long')
+#        data = node.get('parent_id', None)
+#        parent_id = Action.convert_from_str(data, 'long')
+#        data = node.get('user', None)
+#        user = Action.convert_from_str(data, 'str')
+#        data = node.get('date', None)
+#        date = Action.convert_from_str(data, 'datetime')
+#        child = node.getchildren()[0]
+#        if child.tag == 'mashup':
+#            mashup = Mashup.fromXml(child)
+#        return Action(id=id, parent_id=parent_id, mashup=mashup, user=user,
+#                      date=date)
+        
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        
+        msg = "<<type='%s' id='%s' parent_id='%s' date='%s' user='%s'>>"
+        return msg % (type(self),
+                      self.id,
+                      self.prevId,
+                      self.db_date,
+                      self.user)
+        
+    def __eq__(self, other):
+        """ __eq__(other: Alias) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.mashup != other.mashup:
+            return False
+        return True
+
+    def __ne__(self, other):
+        """ __ne__(other: Component) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+################################################################################
+            
+import unittest
+from vistrails.db.domain import IdScope
+import copy
+
+class TestAction(unittest.TestCase):
+    def create_action(self, id_scope=IdScope()):
+        from vistrails.core.mashup.component import Component
+        from vistrails.core.mashup.alias import Alias
+        from vistrails.core.mashup.mashup import Mashup
+        c1 = Component(id=id_scope.getNewId('mashup_component'),
+                          vttype='parameter', param_id=15L, 
+                          parent_vttype='function', parent_id=3L, mid=4L,
+                          type='String', value='test', p_pos=0, pos=1, 
+                          strvaluelist='test1,test2', widget="text")
+        a1 = Alias(id=id_scope.getNewId('mashup_alias'), name='alias1', component=c1)
+        
+        m = Mashup(id=id_scope.getNewId('mashup'), name='mashup1', vtid='empty.vt', 
+                   version=15L, alias_list=[a1])
+        action = Action(id=id_scope.getNewId('mashup_action'),
+                        prevId=0L,
+                        date=datetime(2007,11,18),
+                        mashup=m)
+        return action
+    
+    def test_copy(self):
+        id_scope = IdScope()
+        a1 = self.create_action(id_scope)
+        a2 = copy.copy(a1)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+        a3 = a1.do_copy(True, id_scope, {})
+        self.assertEquals(a1, a3)
+        self.assertNotEquals(a1.id, a3.id)
+
+#    def test_serialization(self):
+#        a1 = self.create_action()
+#        node = a1.toXml()
+#        a2 = Action.fromXml(node)
+#        self.assertEquals(a1, a2)
+#        self.assertEquals(a1.id, a2.id)
+        
+    def test_str(self):
+        a1 = self.create_action()
+        str(a1)
diff --git a/vistrails/core/mashup/action_annotation.py b/vistrails/core/mashup/action_annotation.py
new file mode 100644
index 0000000..6cfa589
--- /dev/null
+++ b/vistrails/core/mashup/action_annotation.py
@@ -0,0 +1,176 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBMashupActionAnnotation
+from datetime import date, datetime
+from time import strptime
+
+class ActionAnnotation(DBMashupActionAnnotation):
+    def __init__(self, id, action_id, key=None, value=None, user=None, date=None):
+        DBMashupActionAnnotation.__init__(self, id, key, value, action_id, date, 
+                                          user)
+    id = DBMashupActionAnnotation.db_id
+    action_id = DBMashupActionAnnotation.db_action_id
+    key = DBMashupActionAnnotation.db_key
+    value = DBMashupActionAnnotation.db_value
+    user = DBMashupActionAnnotation.db_user
+        
+    def _get_date(self):
+        if self.db_date is not None:
+            return self.db_date.strftime('%d %b %Y %H:%M:%S')
+        return datetime(1900,1,1).strftime('%d %b %Y %H:%M:%S')
+
+    def _set_date(self, date):
+        if isinstance(date, datetime):
+            self.db_date = date
+        elif isinstance(date, basestring) and date.strip() != '':
+            newDate = datetime(*strptime(date, '%d %b %Y %H:%M:%S')[0:6])
+            self.db_date = newDate
+    date = property(_get_date, _set_date)
+    
+    @staticmethod
+    def convert(_annotation):
+        _annotation.__class__ = ActionAnnotation
+        
+    def __copy__(self):
+        return ActionAnnotation.do_copy(self)
+    
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupActionAnnotation.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ActionAnnotation
+        return cp
+    
+#    def toXml(self, node=None):
+#        """toXml(node: ElementTree.Element) -> ElementTree.Element
+#           writes itself to xml
+#        """
+#
+#        if node is None:
+#            node = ElementTree.Element('actionAnnotation')
+#        
+#        #set attributes
+#        node.set('id', self.convert_to_str(self.id,'long'))
+#        node.set('action_id', self.convert_to_str(self.action_id,'long'))
+#        node.set('user', self.convert_to_str(self.user,'str'))
+#        node.set('key', self.convert_to_str(self.key,'str'))
+#        node.set('value', self.convert_to_str(self.value,'str'))
+#        node.set('date', self.convert_to_str(self._date,'datetime'))
+#        return node
+#    
+#    @staticmethod
+#    def fromXml(node):
+#        if node.tag != 'actionAnnotation':
+#            debug.debug("node.tag != 'actionAnnotation'")
+#            return None
+#        #read attributes
+#        data = node.get('id', None)
+#        id = Action.convert_from_str(data, 'long')
+#        data = node.get('action_id', None)
+#        action_id = Action.convert_from_str(data, 'long')
+#        data = node.get('key', None)
+#        key = Action.convert_from_str(data, 'str')
+#        data = node.get('value', None)
+#        value = Action.convert_from_str(data, 'str')
+#        data = node.get('user', None)
+#        user = Action.convert_from_str(data, 'str')
+#        data = node.get('date', None)
+#        date = Action.convert_from_str(data, 'datetime')
+#        return ActionAnnotation(id=id, action_id=action_id, key=key, value=value,
+#                      user=user, date=date)
+    
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an
+        mashup_actionAnnotation object.
+
+        """
+        rep = ("<mashup_actionAnnotation id=%s action_id=%s key=%s value=%s "
+               "date=%s user=%s</annotation>")
+        return  rep % (str(self.id), str(self.action_id), str(self.key), 
+                       str(self.value), str(self.date), str(self.user))
+
+    def __eq__(self, other):
+        """ __eq__(other: mashup_actionAnnotation) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.key != other.key:
+            return False
+        if self.value != other.value:
+            return False
+        if self.action_id != other.action_id:
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+        
+################################################################################
+import unittest
+from vistrails.db.domain import IdScope
+import copy
+
+class TestActionAnnotation(unittest.TestCase):
+    def create_annotation(self, id_scope=IdScope()):
+
+        annotation = \
+            ActionAnnotation(id=id_scope.getNewId('mashup_actionAnnotation'),
+                             key='akey', action_id=1L,
+                             value='some value', user='test')
+        return annotation
+
+    def test_copy(self):
+        id_scope = IdScope()
+        a1 = self.create_annotation(id_scope)
+        a2 = copy.copy(a1)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+        a3 = a1.do_copy(True, id_scope, {})
+        self.assertEquals(a1, a3)
+        self.assertNotEquals(a1.id, a3.id)
+
+#    def test_serialization(self):
+#        a1 = self.create_annotation()
+#        node = a1.toXml()
+#        a2 = ActionAnnotation.fromXml(node)
+#        self.assertEquals(a1, a2)
+#        self.assertEquals(a1.id, a2.id)
+
+    def test_str(self):
+        a1 = self.create_annotation()
+        str(a1)
diff --git a/vistrails/core/mashup/alias.py b/vistrails/core/mashup/alias.py
new file mode 100644
index 0000000..4446cc3
--- /dev/null
+++ b/vistrails/core/mashup/alias.py
@@ -0,0 +1,164 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBMashupAlias
+from vistrails.core.mashup.component import Component
+
+import unittest
+from vistrails.db.domain import IdScope
+import copy
+
+################################################################################
+class Alias(DBMashupAlias):
+    def __init__(self, id, name, component=None):
+        DBMashupAlias.__init__(self, id, name, component)
+    
+    id = DBMashupAlias.db_id
+    name = DBMashupAlias.db_name
+    component = DBMashupAlias.db_component
+    
+    @staticmethod
+    def convert(_alias):
+        _alias.__class__ = Alias
+        Component.convert(_alias.component)
+        
+    def __copy__(self):
+        return Alias.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupAlias.do_copy(self, new_ids, id_scope, id_remap)
+        Alias.convert(cp)
+        return cp
+    
+    ##########################################################################
+    # Serialization / Unserialization
+        
+#    def toXml(self, node=None):
+#        """toXml(node: ElementTree.Element) -> ElementTree.Element
+#            writes itself to xml
+#        """
+#        if node is None:
+#            node = ElementTree.Element('alias')
+#
+#        #set attributes
+#        node.set('id', self.convert_to_str(self.id,'long'))
+#        node.set('name', self.convert_to_str(self.name,'str'))
+#        child_ = ElementTree.SubElement(node, 'component')
+#        self.component.toXml(child_)
+#
+#        return node
+#
+#    @staticmethod
+#    def fromXml(node):
+#        if node.tag != 'alias':
+#            return None
+#
+#        #read attributes
+#        data = node.get('id', None)
+#        id = Alias.convert_from_str(data, 'long')
+#        data = node.get('name', None)
+#        name = Alias.convert_from_str(data, 'str')
+#        for child in node.getchildren():
+#            if child.tag == "component":
+#                component = Component.fromXml(child)
+#        alias = Alias(id,name,component)
+#        return alias
+    
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        
+        return ("(Alias id='%s' name='%s' component=%s)@%X" %
+                    (self.id,
+                     self.name,
+                     self.component,
+                     id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: Alias) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.name != other.name:
+            return False
+        if self.component != other.component:
+            return False
+        return True
+
+    def __ne__(self, other):
+        """ __ne__(other: Component) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+
+################################################################################
+
+
+class TestAlias(unittest.TestCase):
+    def create_alias(self, id_scope=IdScope()):
+        c1 = Component(id=id_scope.getNewId('mashup_component'),
+                          vttype='parameter', param_id=15L, 
+                          parent_vttype='function', parent_id=3L, mid=4L,
+                          type='String', value='test', p_pos=0, pos=1, 
+                          strvaluelist='test1,test2', widget="text")
+        a1 = Alias(id=id_scope.getNewId('mashup_alias'), name='alias1', component=c1)
+        return a1
+    
+    def test_copy(self):
+        id_scope = IdScope()
+        a1 = self.create_alias(id_scope)
+        a2 = copy.copy(a1)
+        self.assertEqual(a1,a2)
+        self.assertEqual(a1.id, a2.id)
+        a3 = a2.do_copy(True, id_scope, {})
+        self.assertEqual(a1,a3)
+        self.assertNotEqual(a1.id, a3.id)
+        
+#    def test_serialization(self):
+#        a1 = self.create_alias()
+#        node = a1.toXml()
+#        a2 = Alias.fromXml(node)
+#        self.assertEqual(a1, a2)
+#        self.assertEqual(a1.id, a2.id)
+        
+    def test_str(self):
+        a1 = self.create_alias()
+        str(a1)
diff --git a/vistrails/core/mashup/component.py b/vistrails/core/mashup/component.py
new file mode 100644
index 0000000..f29d76a
--- /dev/null
+++ b/vistrails/core/mashup/component.py
@@ -0,0 +1,325 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import urllib
+from vistrails.core.mashup import conv_from_bool, conv_to_bool, convert_symbols
+from vistrails.db.domain import DBMashupComponent
+
+import unittest
+from vistrails.db.domain import IdScope
+import copy
+
+################################################################################
+class Component(DBMashupComponent):
+    def __init__(self, id, vttype, param_id, parent_vttype, parent_id, mid, 
+                 type, value, p_pos, pos, strvaluelist, minVal="0",
+                 maxVal="1", stepSize="1", parent='', seq=0, widget="text"):
+    
+        """Component() 
+        widget can be: text, slider, combobox, numericstepper, checkbox
+
+        """
+        DBMashupComponent.__init__(self, id, param_id, vttype, parent_vttype, 
+                                   parent_id, p_pos, mid, pos, type, value, 
+                                   minVal, maxVal, stepSize, strvaluelist, 
+                                   widget, seq, parent)
+        if isinstance(seq, bool):
+            self.seq = seq
+
+    id = DBMashupComponent.db_id
+    vttype = DBMashupComponent.db_vttype
+    vtid = DBMashupComponent.db_vtid
+    vtparent_type = DBMashupComponent.db_vtparent_type
+    vtparent_id = DBMashupComponent.db_vtparent_id
+    vtmid = DBMashupComponent.db_vtmid
+    vtpos = DBMashupComponent.db_vtpos
+    pos = DBMashupComponent.db_pos
+    type = DBMashupComponent.db_type
+    minVal = DBMashupComponent.db_minVal
+    maxVal = DBMashupComponent.db_maxVal
+    stepSize = DBMashupComponent.db_stepSize
+    parent = DBMashupComponent.db_parent
+    widget = DBMashupComponent.db_widget
+    strvaluelist = DBMashupComponent.db_strvaluelist
+    
+    def _get_seq(self):
+        return conv_to_bool(self.db_seq)
+    def _set_seq(self, s):
+        self.db_seq = conv_from_bool(s)
+    seq = property(_get_seq,_set_seq)
+     
+    def _get_val(self):
+        self.db_val = convert_symbols(self.db_val)
+        return self.db_val
+    def _set_val(self, v):
+        self.db_val = v
+    val = property(_get_val,_set_val)
+    
+    def _get_valuelist(self):
+        self.strvaluelist = convert_symbols(self.strvaluelist)
+        data = self.strvaluelist.split(',')
+        result = []
+        for d in data:
+            result.append(urllib.unquote_plus(d))
+        return result
+    def _set_valuelist(self, valuelist):
+        q = []
+        for v in valuelist:
+            q.append(urllib.quote_plus(v))
+        self.strvaluelist = ",".join(q)
+    valueList = property(_get_valuelist,_set_valuelist)
+
+    @staticmethod
+    def convert(_component):
+        _component.__class__ = Component
+        
+    def __copy__(self):
+        return Component.do_copy(self)
+    
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        """do_copy() -> Component 
+        returns a clone of itself"""
+        cp = DBMashupComponent.do_copy(self, new_ids, id_scope, id_remap)      
+        Component.convert(cp)
+        return cp
+    
+    ##########################################################################
+    # Serialization / Unserialization
+    
+#    def toXml(self, node=None):
+#        """toXml(node: ElementTree.Element) -> ElementTree.Element
+#             writes itself to xml
+#        """
+#        if node is None:
+#            node = ElementTree.Element('component')
+#        #set attributes
+#        node.set('id', self.convert_to_str(self.id,'long'))
+#        node.set('vttype', self.convert_to_str(self.vttype,'str'))
+#        node.set('vtid', self.convert_to_str(self.vtid,'long'))
+#        node.set('vtparent_type', self.convert_to_str(self.vtparent_type,'str'))
+#        node.set('vtparent_id', self.convert_to_str(self.vtparent_id,'long'))
+#        node.set('vtmid', self.convert_to_str(self.vtmid,'long'))
+#        node.set('vtpos', self.convert_to_str(self.vtpos,'long'))
+#        
+#        node.set('pos', self.convert_to_str(self.pos,'long'))
+#        node.set('type', self.convert_to_str(self.type,'str'))
+#        
+#        node.set('val', self.convert_to_str(self.val, 'str'))
+#        node.set('minVal', self.convert_to_str(self.minVal,'str'))
+#        node.set('maxVal', self.convert_to_str(self.maxVal,'str'))
+#        node.set('stepSize', self.convert_to_str(self.stepSize,'str'))
+#        node.set('valueList',self.convert_to_str(self.strvaluelist,'str'))
+#        node.set('parent', self.convert_to_str(self.parent,'str'))
+#        node.set('seq', self.convert_to_str(self.seq,'bool'))
+#        node.set('widget',self.convert_to_str(self.widget,'str'))
+#        return node
+#
+#    @staticmethod
+#    def fromXml(node):
+#        if node.tag != 'component':
+#            return None
+#
+#        #read attributes
+#        data = node.get('id', None)
+#        id = Component.convert_from_str(data, 'long')
+#        data = node.get('vttype', None)
+#        vttype = Component.convert_from_str(data, 'str')
+#        data = node.get('vtid', None)
+#        vtid = Component.convert_from_str(data, 'long')
+#        data = node.get('vtparent_type', None)
+#        vtparent_type = Component.convert_from_str(data, 'str')
+#        data = node.get('vtparent_id', None)
+#        vtparent_id = Component.convert_from_str(data, 'long')
+#        data = node.get('vtmid', None)
+#        vtmid = Component.convert_from_str(data, 'long')
+#        data = node.get('vtpos', None)
+#        vtpos = Component.convert_from_str(data, 'long')
+#        data = node.get('pos', None)
+#        pos = Component.convert_from_str(data, 'long')
+#        data = node.get('type', None)
+#        type = Component.convert_from_str(data, 'str')
+#        data = node.get('val', None)
+#        val = Component.convert_from_str(data, 'str')
+#        val = val.replace("<", "<")
+#        val = val.replace(">", ">")
+#        val = val.replace("&","&")
+#        data = node.get('minVal', None)
+#        minVal = Component.convert_from_str(data, 'str')
+#        data = node.get('maxVal', None)
+#        maxVal = Component.convert_from_str(data, 'str')
+#        data = node.get('stepSize', None)
+#        stepSize = Component.convert_from_str(data, 'str')
+#        data = node.get('valueList', None)
+#        values = Component.convert_from_str(data, 'str')
+#        values = values.replace("<", "<")
+#        values = values.replace(">", ">")
+#        values = values.replace("&","&")
+#        data = node.get('parent', None)
+#        parent = Component.convert_from_str(data, 'str')
+#        data = node.get('seq', None)
+#        seq = Component.convert_from_str(data, 'bool')
+#        data = node.get('widget', None)
+#        widget = Component.convert_from_str(data, 'str')
+#       
+#        component = Component(id=id, vttype=vttype, param_id=vtid, 
+#                              parent_vttype=vtparent_type, 
+#                              parent_id=vtparent_id, mid=vtmid, type=type,
+#                              value=val, p_pos=vtpos, pos=pos,
+#                              minVal=minVal,
+#                              maxVal=maxVal,
+#                              stepSize=stepSize,
+#                              strvaluelist=values,
+#                              parent=parent,
+#                              seq=seq,
+#                              widget=widget)
+#        return component
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        
+        return ("(Component id='%s' vttype='%s' vtid='%s' vtparent_type='%s' \
+vtparent_id='%s' vtmid='%s' vtpos='%s' type='%s' pos='%s' val='%s' minVal='%s' \
+maxVal='%s' stepSize='%s' strvaluelist='%s' parent='%s' seq='%s' widget='%s')@%X" %
+                    (self.id,
+                     self.vttype,
+                     self.vtid,
+                     self.vtparent_type,
+                     self.vtparent_id,
+                     self.vtmid,
+                     self.vtpos,
+                     self.type,
+                     self.pos,
+                     self.val,
+                     self.minVal,
+                     self.maxVal,
+                     self.stepSize,
+                     self.strvaluelist,
+                     self.parent,
+                     self.seq,
+                     self.widget,
+                     id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: Component) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.vttype != other.vttype:
+            return False
+        if self.vtid != other.vtid:
+            return False
+        if self.vtparent_type != other.vtparent_type:
+            return False
+        if self.vtparent_id != other.vtparent_id:
+            return False
+        if self.vtmid != other.vtmid:
+            return False
+        if self.vtpos != other.vtpos:
+            return False
+        if self.type != other.type:
+            return False
+        if self.pos != other.pos:
+            return False
+        if self.val != other.val:
+            return False
+        if self.minVal != other.minVal:
+            return False
+        if self.maxVal != other.maxVal:
+            return False
+        if self.stepSize != other.stepSize:
+            return False
+        if self.strvaluelist != other.strvaluelist:
+            return False
+        if self.parent != other.parent:
+            return False
+        if self.seq != other.seq:
+            return False
+        if self.widget != other.widget:
+            return False
+        return True
+
+    def __ne__(self, other):
+        """ __ne__(other: Component) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+    
+################################################################################
+
+
+class TestComponent(unittest.TestCase):
+    def create_component(self, id_scope=IdScope()):
+        c = Component(id=id_scope.getNewId('mashup_component'),
+                          vttype='parameter', param_id=15L, 
+                          parent_vttype='function', parent_id=3L, mid=4L,
+                          type='String', value='test', p_pos=0, pos=1, 
+                          strvaluelist='test1,test2', widget="text")
+        return c
+    
+    def test_copy(self):
+        id_scope = IdScope()
+        c1 = self.create_component(id_scope)
+        c2 = copy.copy(c1)
+        self.assertEqual(c1, c2)
+        self.assertEqual(c1.id, c2.id)
+        c3 = c2.do_copy(True, id_scope, {})
+        self.assertEqual(c1,c3)
+        self.assertNotEqual(c1.id, c3.id)
+        
+    def test_valuelist(self):
+        c1 = self.create_component()
+        c1.strvaluelist = "1,2,3"
+        self.assertEqual(['1','2','3'], c1.valueList)
+        c1.valueList = ['1','2','3']
+        self.assertEqual(c1.strvaluelist,"1,2,3")
+        
+#        #testing values with , after serialization
+#        c1.valueList = ['a,b,c', '123', ',as']
+#        c2 = Component.fromXml(c1.toXml())
+#        self.assertEqual(c1.strvaluelist, c2.strvaluelist)
+#        self.assertEqual(c1.valueList, c2.valueList)
+#        self.assertEqual(c2.valueList, ['a,b,c', '123', ',as'])
+        
+    def test_str(self):
+        c1 = self.create_component()
+        str(c1)
+        
\ No newline at end of file
diff --git a/vistrails/core/mashup/controller.py b/vistrails/core/mashup/controller.py
new file mode 100644
index 0000000..97b1ab7
--- /dev/null
+++ b/vistrails/core/mashup/controller.py
@@ -0,0 +1,346 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import os.path
+from vistrails.core.system import current_user, current_time
+from vistrails.core.mashup.alias import Alias
+from vistrails.core.mashup.component import Component
+from vistrails.core.mashup.mashup import Mashup
+
+class MashupController(object):
+    def __init__(self, originalController, vt_controller, vt_version, mshptrail=None):
+        self.vtController = vt_controller
+        self.originalController = originalController
+        self.vtVersion = vt_version
+        self.vtPipeline = self.vtController.vistrail.getPipeline(self.vtVersion)
+        self.vtPipeline.validate()
+        self.mshptrail = mshptrail
+        self.id_scope = mshptrail.id_scope
+        self.currentVersion = -1
+        self.currentMashup = None
+        self._changed = False
+
+    def setChanged(self, on):
+        self._changed = on
+        self.originalController.set_changed(True)
+        
+    def setCurrentVersion(self, version):
+        self.currentVersion = version
+        self.vtPipeline = self.vtController.vistrail.getPipeline(self.vtVersion)
+        if version > -1:
+            self.currentMashup = self.mshptrail.getMashup(version)
+            self.updatePipelineAliasesFromCurrentMashup()
+            
+    def getVistrailParam(self, alias):
+        if self.vtPipeline:
+            return self.vtPipeline.db_get_object(alias.component.vttype,
+                                                  alias.component.vtid)
+        return None
+    
+    def execute(self, params):
+        if self.vtPipeline and self.vtController:
+            mashup_id = self.mshptrail.id
+            mashup_version = self.currentVersion
+            reason = "mashup::%s::%s"%(str(mashup_id), mashup_version)
+            result = self.vtController.execute_current_workflow(custom_params=params,
+                                                              reason=reason)
+            self.originalController.set_changed(True)
+            return result
+        return ([], False)
+            
+    def updateCurrentTag(self, name):
+        if self.mshptrail.changeTag(self.currentVersion, name, current_user(),
+                                 current_time()):
+            self.setChanged(True)
+            return True
+        else:
+            return False
+    
+    def moveTag(self, from_version, to_version, name):
+        tag = self.mshptrail.getTagForActionId(from_version)
+        if tag:
+            self.mshptrail.removeTagByActionId(from_version)
+            self.mshptrail.addTag(to_version, tag, user=current_user(),
+                                  date=current_time())
+            
+    def getCurrentTag(self):
+        return self.mshptrail.getTagForActionId(self.currentVersion)
+    
+    def versionHasTag(self, version):
+        return self.mshptrail.hasTagForActionId(version)
+    
+    def hasTagWithName(self, name):
+        return self.mshptrail.hasTagWithName(name)
+    
+    def getVistrailName(self):
+        name = ''
+        locator = self.currentMashup.vtid
+        if locator != None:
+            if locator.name == None:
+                name = ''
+            else:
+                name = os.path.split(locator.name)[1]
+            if name == '':
+                name = self.controller.vtController.name
+        return name
+        
+    def resetVistrailPipeline(self):
+        self.vtController.change_selected_version(self.vtVersion)
+    
+    def getVistrailWorkflowTag(self):
+        return self.vtController.get_pipeline_name(self.vtVersion)
+    
+    def reorderAliases(self, new_order):
+        if self.currentMashup:
+            new_aliases = []
+            pos = 0
+            for old_pos in new_order:
+                alias = copy.copy(self.currentMashup.alias_list[old_pos])
+                alias.component.pos = pos
+                new_aliases.append(alias)
+                pos += 1
+            return self.createMashupVersion(new_aliases, quiet=False)
+                
+    def updateAlias(self, alias):
+        """updateAlias(alias)-> long
+        This will create a version with an alias change (can't be a position
+        change). Position changes are taken care in reorderAliases method. 
+        
+        """
+        #print " controller updateAlias ", alias
+        new_aliases = []
+
+        if self.currentMashup:
+            for a in self.currentMashup.alias_list:
+                if a.id != alias.id:
+                    calias = copy.copy(a)
+                else:
+                    #print "found alias: ", a
+                    calias = copy.copy(alias)
+                new_aliases.append(calias)
+        return self.createMashupVersion(new_aliases, quiet=False)
+        
+    def updateAliasFromParam(self, param):
+        add_alias = True
+        new_aliases = []
+        pos = 0
+        for alias in self.currentMashup.alias_list:
+            if alias.component.vtid != param.id:
+                calias = copy.copy(alias)
+                calias.component.pos = pos
+                new_aliases.append(calias)
+                pos += 1
+            else:
+                #print "found alias: ", alias
+                add_alias = False
+                if param.alias != '':
+                    new_alias = copy.copy(alias)
+                    new_alias.name = param.alias
+                    new_aliases.append(new_alias)
+                    pos += 1
+        if add_alias:
+            parameter = self.vtPipeline.db_get_object(param.dbtype, param.id)
+            cid = self.id_scope.getNewId('component')
+            aid = self.id_scope.getNewId('alias')
+            component = Component(cid, parameter.vtType, 
+                                  parameter.real_id, param.parent_dbtype, 
+                                  param.parent_id,
+                                  param.mId, parameter.type, 
+                                  parameter.strValue, parameter.pos, 
+                                  pos, "")
+            alias = Alias(aid, param.alias, component) 
+            new_aliases.append(alias)
+            self.vtPipeline.add_alias(param.alias, param.type, param.id,
+                                      param.parent_dbtype, param.parent_id,
+                                      param.mId)
+        else:
+            self.vtPipeline.change_alias(param.alias, param.type, param.id,
+                                         param.parent_dbtype, param.parent_id,
+                                         param.mId)
+        
+        return self.createMashupVersion(new_aliases, quiet=False)
+        
+    def updateAliasesFromPipeline(self, pipeline):
+        """updateAliasesFromPipeline(self, pipeline) -> long
+        This will generate a new mashup by updating the aliases of the current 
+        mashup according to the aliases in a pipeline. This assumes that the 
+        mashup's current aliases are different from pipeline aliases by at most 
+        one change (eg., an alias rename, an alias addition, an alias removal)
+        
+        """
+        pip_aliases = pipeline.aliases.keys()
+        mashup_aliases = [a.name for a in self.currentMashup.alias_list]
+        new_aliases = []
+        if len(pip_aliases) == len(mashup_aliases):
+            #an alias probably changed its name or its value    
+            old_a = None
+            new_a = None
+            for a in self.currentMashup.alias_list:
+                if a.name not in pip_aliases:
+                    old_a = copy.copy(a)
+                    new_aliases.append(old_a)
+                else:
+                    new_aliases.append(a)
+            for a in pip_aliases:
+                if a not in mashup_aliases:
+                    new_a = (a, pipeline.aliases[a])
+            if old_a is not None and new_a is not None:
+                (a, info) = new_a
+                parameter = pipeline.db_get_object(info[0],info[1])
+                old_a.name = a
+                old_a.component.vttype = parameter.vtType 
+                old_a.component.vtid = parameter.real_id
+                old_a.component.vtparent_type = info[2]
+                old_a.component.vt_parent_id = info[3]
+                old_a.component.mid = info[4]
+                old_a.component.type = parameter.type
+                old_a.component.val = parameter.strValue
+                old_a.component.vtpos = parameter.pos
+            
+        elif len(pip_aliases) < len(mashup_aliases):
+            # an alias was removed
+            pos = 0
+            for a in self.currentMashup.alias_list:
+                if a.name in pip_aliases:
+                    alias = copy.copy(a)
+                    alias.component.pos = pos
+                    new_aliases.append(alias)
+                    pos += 1
+        else:
+            #an alias was added
+            pos = len(mashup_aliases)
+            new_aliases = [a for a in self.currentMashup.alias_list]
+            for a in pip_aliases:
+                if a not in mashup_aliases:
+                    info = pipeline.aliases[a]
+                    parameter = pipeline.db_get_object(info[0],info[1])
+                    cid = self.id_scope.getNewId('component')
+                    aid = self.id_scope.getNewId('alias')
+                    component = Component(cid, parameter.vtType, 
+                                          parameter.real_id, info[2], info[3],
+                                          info[4], parameter.type, 
+                                          parameter.strValue, parameter.pos, 
+                                          pos, "")
+                    alias = Alias(aid, a, component) 
+                    new_aliases.append(alias)
+                    pos += 1
+        
+        return self.createMashupVersion(new_aliases, quiet=False)
+        
+    def updatePipelineAliasesFromCurrentMashup(self):
+        self.resetVistrailPipeline()
+        self.vtPipeline = copy.copy(self.vtController.current_pipeline)
+        #first we clear all aliases in pipeline
+        to_remove = self.vtPipeline.aliases.values()
+        for (type, oId, parentType, parentId, mid) in to_remove:
+            self.vtPipeline.remove_alias(type, oId, parentType, parentId, mid)
+            parameter = self.vtPipeline.db_get_object(type,oId)
+            parameter.alias = ''
+            
+        #now we populate the pipeline according to the aliases in the mashup 
+        for alias in self.currentMashup.alias_list:
+            self.vtPipeline.add_alias(alias.name, alias.component.vttype, 
+                                      alias.component.vtid,
+                                      alias.component.vtparent_type, 
+                                      alias.component.vtparent_id,
+                                      alias.component.vtmid)
+            parameter = self.vtPipeline.db_get_object(alias.component.vttype,
+                                                      alias.component.vtid)
+            parameter.alias = alias.name
+        
+    def getMashupName(self, version=-1):
+        action_map = self.mshptrail.actionMap
+        if version == -1:
+            version = self.currentVersion
+        count = 0
+        while True:
+            hasTag = self.mshptrail.hasTagForActionId(version)
+            if hasTag or version <= 1:
+                if hasTag:
+                    name = self.mshptrail.getTagForActionId(version)
+                else:
+                    name = "ROOT"
+                count_str = ""
+                if count > 0:
+                    count_str = " + " + str(count)
+                return name + count_str
+            version = action_map[version].parent_id
+            count += 1
+            
+    def findFirstTaggedParent(self, version):
+        action_map = self.mshptrail.actionMap
+        version = action_map[version].parent_id
+        while True:
+            hasTag = self.mshptrail.hasTagForActionId(version)
+            if hasTag or version <= 1:
+                name = ""
+                if hasTag:
+                    name = self.mshptrail.getTagForActionId(version)
+                return (version, name)
+            version = action_map[version].parent_id
+            
+    def removeAlias(self, name):
+        """removeAlias(name: str) -> long
+        This will create a new version of the mashup without alias name, add it
+        to the trail and set the version as the current version. It will return 
+        the version number 
+        """
+        new_aliases = []
+        if self.currentMashup:
+            pos = 0
+            for alias in self.currentMashup.alias_list:
+                if alias.name != name:
+                    calias = copy.copy(alias)
+                    calias.component.pos = pos
+                    new_aliases.append(calias)
+                    pos += 1
+            return self.createMashupVersion(alias_list=new_aliases, quiet=False)
+            
+    def createMashupVersion(self, alias_list, quiet=False):
+        id = self.id_scope.getNewId('mashup')
+        mashup = Mashup(id=id, name="mashup%s"%id, 
+                        vtid=self.currentMashup.vtid, 
+                        version=self.currentMashup.version, 
+                        alias_list=alias_list)
+        currVersion = self.mshptrail.addVersion(parent_id=self.currentVersion,
+                                                mashup=mashup, 
+                                                user=current_user(),
+                                                date=current_time())
+        self.mshptrail.currentVersion = currVersion
+        self.currentMashup = mashup
+        #print "created new mashup ", currVersion
+        self.setCurrentVersion(currVersion, quiet)
+        self.setChanged(True)
+        return currVersion
diff --git a/vistrails/core/mashup/mashup.py b/vistrails/core/mashup/mashup.py
new file mode 100644
index 0000000..fd83b10
--- /dev/null
+++ b/vistrails/core/mashup/mashup.py
@@ -0,0 +1,324 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import IdScope
+from vistrails.db.domain import DBMashup
+from vistrails.core.mashup import conv_to_bool, conv_from_bool
+from vistrails.core.mashup.alias import Alias
+from vistrails.core.mashup.component import Component
+from vistrails.core.system import get_elementtree_library
+
+import unittest
+import copy
+
+ElementTree = get_elementtree_library()
+
+class Mashup(DBMashup):
+    def __init__(self, id, name, vtid=None, version=None, alias_list=None, 
+                 t='vistrail', has_seq=None, layout='', geometry='', 
+                 id_scope=IdScope()):
+        if has_seq == None:
+            has_seq = 0
+            
+        DBMashup.__init__(self, id, name, version, alias_list, t, vtid, layout, 
+                          geometry, has_seq)
+        self.id_scope = id_scope
+        if has_seq == None:
+            self.has_seq = False
+            if isinstance(self.alias_list, list):
+                for v in self.alias_list:
+                    if v.component.seq == True:
+                        self.has_seq = True
+        else:
+            self.has_seq = has_seq
+    id = DBMashup.db_id
+    name = DBMashup.db_name
+    version = DBMashup.db_version
+    alias_list = DBMashup.db_aliases
+    aliases = DBMashup.db_aliases
+    vtid = DBMashup.db_vtid
+    type = DBMashup.db_type
+    layout = DBMashup.db_layout
+    geometry = DBMashup.db_geometry
+        
+    def _get_has_seq(self):
+        return conv_to_bool(self.db_has_seq)
+    def _set_has_seq(self, s):
+        self.db_has_seq = conv_from_bool(s)
+    has_seq = property(_get_has_seq,_set_has_seq)
+    
+    @staticmethod
+    def convert(_mashup):
+        _mashup.__class__ = Mashup
+
+        for alias in _mashup.alias_list:
+            Alias.convert(alias)
+            
+    def __copy__(self):
+        return Mashup.do_copy(self)
+    
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        """do_copy() -> Mashup 
+        returns a clone of itself"""
+        cp = DBMashup.do_copy(self, new_ids, id_scope, id_remap)
+        Mashup.convert(cp)
+        return cp
+    
+    ##########################################################################
+    # Serialization / Unserialization
+    
+#    def toXml(self, node=None):
+#        """toXml(node: ElementTree.Element) -> ElementTree.Element
+#           writes itself to xml
+#        """
+#
+#        if node is None:
+#            node = ElementTree.Element('mashup')
+#
+#        #set attributes
+#        node.set('id', self.convert_to_str(self.id,'long'))
+#        node.set('version', self.convert_to_str(self.version,'long'))
+#        node.set('vtid', self.convert_to_str(self.vtid,'str'))
+#        node.set('name', self.convert_to_str(self.name,'str'))
+#        node.set('type', self.convert_to_str(self.type,'str'))
+#        node.set('has_seq', self.convert_to_str(self.has_seq,'bool'))
+#        for v in self.alias_list:
+#            child_ = ElementTree.SubElement(node, 'alias')
+#            v.toXml(child_)
+#        
+#        layoutnode = ElementTree.SubElement(node,'layout')
+#        layoutnode.text = str(self.layout)
+#        
+#        geomnode = ElementTree.SubElement(node,'geometry')
+#        geomnode.text = str(self.geometry)
+#        
+#        return node
+#
+#    @staticmethod
+#    def fromXml(node):
+#        if node.tag != 'mashup':
+#            #print "node.tag != 'mashup'"
+#            return None
+#        #read attributes
+#        data = node.get('id', None)
+#        id = Mashup.convert_from_str(data, 'long')
+#        data = node.get('name', None)
+#        name = Mashup.convert_from_str(data, 'str')
+#        data = node.get('version', None)
+#        version = Mashup.convert_from_str(data, 'long')
+#        data = node.get('vtid', None)
+#        vtid = Mashup.convert_from_str(data, 'str')
+#        data = node.get('type', None)
+#        type = Mashup.convert_from_str(data, 'str')
+#        data = node.get('has_seq', None)
+#        seq = Component.convert_from_str(data, 'bool')
+#        alias_list = []
+#        layout = None
+#        geometry = None
+#        for child in node.getchildren():
+#            if child.tag == "alias":
+#                alias = Alias.fromXml(child)
+#                alias_list.append(alias)
+#            if child.tag == "layout":
+#                layout = str(child.text).strip(" \n\t")
+#            if child.tag == "geometry":
+#                geometry = str(child.text).strip(" \n\t")
+#        return Mashup(id=id, name=name, vtid=vtid, version=version, 
+#                               alias_list=alias_list, t=type, has_seq=seq,
+#                               layout=layout, geometry=geometry)
+        
+    def loadAliasesFromPipeline(self, pipeline, id_scope):
+        """loadAliasesFromPipelines(pipeline: Pipeline) -> None 
+        This will replace current aliases with the ones present in Pipeline
+        
+        """
+        
+        if pipeline:
+            self.alias_list = []
+            if len(pipeline.aliases) > 0:
+                pos = 0
+                for aname,info in pipeline.aliases.iteritems():
+                    parameter = pipeline.db_get_object(info[0],info[1])
+                    cid = id_scope.getNewId('component')
+                    aid = id_scope.getNewId('alias')
+                    component = Component(cid, parameter.vtType, 
+                                          parameter.real_id, info[2], info[3],
+                                          info[4], parameter.type, 
+                                          parameter.strValue, parameter.pos, 
+                                          pos, "")
+                    alias = Alias(aid, aname, component)
+                    self.alias_list.append(alias)
+                    pos += 1 
+                  
+    def remapPipelineObjects(self, id_remap):
+        for alias in self.alias_list:
+            try:
+                new_pid = id_remap[(alias.component.vtparent_type,
+                                    alias.component.vtparent_id)]
+                alias.component.vtparent_id = new_pid
+                new_id = id_remap[(alias.component.vttype,alias.component.vtid)]
+                alias.component.vtid = new_id
+            except:
+                pass
+            
+    def validateForPipeline(self, pipeline):
+        """validateForPipeline(pipeline) -> None
+        This will make sure that the parameters in the alias list are present
+        in the pipeline. If they were removed, the aliases pointing to it will 
+        be removed. This changes the mashup in place """
+        to_remove = []
+        for alias in self.alias_list:
+            try:
+                param = pipeline.db_get_object(alias.component.vttype,
+                                               alias.component.vtid)
+            except:
+                to_remove.append(alias)
+        for a in to_remove:
+            self.alias_list.remove(a)    
+        pos = 0
+        mashup_aliases = []
+        for a in self.alias_list:
+            mashup_aliases.append(a.name)
+            a.component.pos = pos
+            pos+=1
+            
+        for a, info in pipeline.aliases.iteritems():
+            if a not in mashup_aliases:
+                parameter = pipeline.db_get_object(info[0],info[1])
+                cid = self.id_scope.getNewId('component')
+                aid = self.id_scope.getNewId('alias')
+                component = Component(cid, parameter.vtType, 
+                                      parameter.real_id, info[2], info[3],
+                                      info[4], parameter.type, 
+                                      parameter.strValue, parameter.pos, 
+                                      pos, "")
+                newalias = Alias(aid, a, component) 
+                self.alias_list.append(newalias)
+                pos +=1      
+                   
+    def getAliasByName(self, name):
+        for alias in self.alias_list:
+            if alias.name == name:
+                return alias
+                        
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        
+        return ("(Mashup id='%s' name='%s' version='%s' vtid='%s' type='%s' \
+layout='%s' geometry='%s' alias_list='%s')@%X" %
+                    (self.id,
+                     self.name,
+                     self.version,
+                     self.vtid,
+                     self.type,
+                     self.layout,
+                     self.geometry,
+                     self.alias_list,
+                     id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: Mashup) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.name != other.name:
+            return False
+        if self.vtid != other.vtid:
+            return False
+        if self.version != other.version:
+            return False
+        if self.type != other.type:
+            return False
+        if self.layout != other.layout:
+            return False
+        if self.geometry != other.geometry:
+            return False
+        if len(self.alias_list) != len(other.alias_list):
+            return False
+        for p,q in zip(self.alias_list, other.alias_list):
+            if p != q:
+                return False
+        return True
+
+    def __ne__(self, other):
+        """ __ne__(other: Component) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)              
+        
+################################################################################
+
+
+class TestMashup(unittest.TestCase):
+    def create_mashup(self, id_scope=IdScope()):
+        c1 = Component(id=id_scope.getNewId('component'),
+                          vttype='parameter', param_id=15L, 
+                          parent_vttype='function', parent_id=3L, mid=4L,
+                          type='String', value='test', p_pos=0, pos=1, 
+                          strvaluelist='test1,test2', widget="text")
+        a1 = Alias(id=id_scope.getNewId('alias'), name='alias1', component=c1)
+        
+        m = Mashup(id=id_scope.getNewId('mashup'), name='mashup1', vtid='empty.vt', 
+                   version=15L, alias_list=[a1])
+        return m
+    
+    def test_copy(self):
+        id_scope = IdScope()
+        m1 = self.create_mashup(id_scope)
+        m2 = copy.copy(m1)
+        self.assertEqual(m1, m2)
+        self.assertEqual(m1.id, m2.id)
+        m3 = m2.do_copy(True, id_scope, {})
+        self.assertEqual(m1, m3)
+        self.assertNotEqual(m1.id, m3.id)
+        
+#    def test_serialization(self):
+#        m1 = self.create_mashup()
+#        node = m1.toXml()
+#        m2 = Mashup.fromXml(node)
+#        self.assertEqual(m1, m2)
+#        self.assertEqual(m1.id, m2.id)
+        
+    def test_str(self):
+        m1 = self.create_mashup()
+        str(m1)
+    
\ No newline at end of file
diff --git a/vistrails/core/mashup/mashup_trail.py b/vistrails/core/mashup/mashup_trail.py
new file mode 100644
index 0000000..b0e41d6
--- /dev/null
+++ b/vistrails/core/mashup/mashup_trail.py
@@ -0,0 +1,271 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from vistrails.db.domain import IdScope
+from vistrails.db.domain import DBMashuptrail
+from vistrails.core.mashup.action import Action
+from vistrails.core.vistrail.annotation import Annotation 
+from vistrails.core.mashup.action_annotation import ActionAnnotation 
+
+################################################################################
+    
+class Mashuptrail(DBMashuptrail):
+    """ MashupTrail is a class that stores versions of Mashups.
+    For now it keeps a linear history."""
+    def __init__(self, id, vt_version, id_scope=None):
+        DBMashuptrail.__init__(self, None, id, version="", vtVersion=vt_version)
+        self.db_actions = []
+        self.currentVersion = -1
+        self.db_annotations = []
+        self.db_actionAnnotations = []
+        if not id_scope:
+            self.id_scope = IdScope(1L)
+        else:
+            self.id_scope = id_scope
+        
+    id = DBMashuptrail.db_name
+    vtVersion = DBMashuptrail.db_vtVersion
+    actions = DBMashuptrail.db_actions
+    annotations = DBMashuptrail.db_annotations
+    actionAnnotations = DBMashuptrail.db_actionAnnotations
+    
+    def _get_actionMap(self):
+        return self.db_actions_id_index
+    actionMap = property(_get_actionMap)
+    
+    @staticmethod
+    def convert(_mtrail):
+        _mtrail.__class__ = Mashuptrail
+
+        for action in _mtrail.actions:
+            Action.convert(action)
+
+        for annotation in _mtrail.annotations:
+            Annotation.convert(annotation)
+
+        for aannotation in _mtrail.actionAnnotations:
+            ActionAnnotation.convert(aannotation)
+        _mtrail.id_scope = IdScope(1L)
+        _mtrail.updateIdScope()
+            
+    def addVersion(self, parent_id, mashup, user, date):
+        id = self.getLatestVersion() + 1
+        mashup.id_scope = self.id_scope
+        mashup.id = id
+        mashup.version = self.vtVersion
+        action = Action(id=id, prevId=parent_id, mashup=mashup,
+                        user=user, date=date)
+        self.db_add_action(action)
+        
+        return action.id
+    
+    def __copy__(self):
+        return Mashuptrail.do_copy(self)
+    
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        """do_copy() -> Mashuptrail 
+        returns a clone of itself"""
+        cp = DBMashuptrail.do_copy(self, new_ids, id_scope, id_remap)
+        Mashuptrail.convert(cp)        
+        cp.currentVersion = self.currentVersion        
+        return cp
+    
+    def getLatestVersion(self):
+        try:
+            max_ver = max(a.id for a in self.actions)
+            return max_ver
+        except:
+            return 0
+        
+    def getMashup(self, version):
+        if version in self.actionMap.keys():
+            return self.actionMap[version].mashup
+        else:
+            return None
+        
+    def validateMashupsForPipeline(self, version, pipeline):
+        """validateMashupsForPipeline(version:long, pipeline:Pipeline)->None
+        This will make sure that the aliases present in all mashups are 
+        consistent with the current pipeline. 
+        
+        """
+        for action in self.actions:
+            action.mashup.id_scope = self.id_scope
+            action.mashup.validateForPipeline(pipeline)
+            action.mashup.version = version
+    
+    ####################################################################
+    ## Tag manipulation
+    ##    
+    def hasTagWithName(self, name):
+        for a in self.actionAnnotations:
+            if a.key == "__tag__":
+                if a.value == name:
+                    return True
+        return False
+        
+    def hasTagForActionId(self, action_id):
+        for a in self.actionAnnotations:
+            if a.key == "__tag__" and a.action_id == action_id:
+                return True
+        return False
+    
+    def getTagForActionId(self, action_id):
+        for a in self.actionAnnotations:
+            if a.key == "__tag__" and a.action_id == action_id:
+                return a.value
+        return ""
+    
+    def changeTag(self, action_id, name, user, date):
+        if self.hasTagWithName(name):
+            return False
+        if self.hasTagForActionId(action_id):
+            self.removeTagByActionId(action_id)
+        return self.addTag(action_id, name, user, date)
+            
+    def addTag(self, action_id, name, user, date):
+        if not self.hasTagWithName(name):
+            self.addActionAnnotation(action_id=action_id, key="__tag__", 
+                                     value=name, user=user, date=date)
+            return True
+        return False
+    
+    def removeTagByActionId(self, action_id):
+        found = None
+        for a in self.actionAnnotations:
+            if a.key == "__tag__" and a.action_id == action_id:
+                found = a
+                break
+        if found:
+            self.actionAnnotations.remove(found)
+                   
+    def getTagMap(self):
+        """getTagMap() -> dict of tag:action_id"""
+        tagMap = {}
+        for a in self.actionAnnotations:
+            if a.key == "__tag__":
+                tagMap[a.value] = a.action_id
+        return tagMap
+    
+    def addActionAnnotation(self, action_id, key, value, user, date):
+        id = self.id_scope.getNewId("mashup_actionAnnotation")
+        annot = ActionAnnotation(id=id, action_id=action_id, key=key,
+                                 value=value, user=user, date=date)
+        self.actionAnnotations.append(annot)
+
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        
+        return ("(Mashuptrail id='%s' vtVersion='%s' actions='%s')@%X" %
+                    (self.id,
+                     self.vtVersion,
+                     self.actions,
+                     id(self)))
+    
+    ######################################################################
+    ## Serialization and Unserialization
+    ##                
+#    def toXml(self, node=None):
+#        """toXml(node: ElementTree.Element) -> ElementTree.Element
+#           writes itself to xml
+#        """
+#
+#        if node is None:
+#            node = ElementTree.Element('mashuptrail')
+#        
+#        #set attributes
+#        node.set('id', self.convert_to_str(self.id, 'uuid'))
+#        node.set('vtVersion', self.convert_to_str(self.vtVersion,'long'))
+#        node.set('version', self.convert_to_str(self.version, 'str'))
+#        for action in self.actions:
+#            child_ = ElementTree.SubElement(node, 'action')
+#            action.toXml(child_)
+#        for annot in self.annotations:
+#            child_ = ElementTree.SubElement(node, 'actionAnnotation')
+#            annot.toXml(child_)
+#        return node
+#    
+#    @staticmethod
+#    def fromXml(node):
+#        if node.tag != 'mashuptrail':
+#            debug.debug("node.tag != 'mashuptrail'")
+#            return None
+#        #read attributes
+#        data = node.get('id', None)
+#        id = Mashuptrail.convert_from_str(data, 'uuid')
+#        data = node.get('vtVersion', None)
+#        vtVersion = Mashuptrail.convert_from_str(data, 'long')
+#        data = node.get('version', None)
+#        version = Mashuptrail.convert_from_str(data, 'str')
+#        actions = []
+#        action_map = {}
+#        annotations = []
+#        for child in node.getchildren():
+#            if child.tag == 'action':
+#                action = Action.fromXml(child)
+#                actions.append(action)
+#                action_map[action.id] = action
+#            elif child.tag == 'actionAnnotation':
+#                annot = ActionAnnotation.fromXml(child)
+#                annotations.append(annot)
+#                
+#        mtrail = Mashuptrail(id,vtVersion)
+#        mtrail.version = version
+#        mtrail.actions = actions
+#        mtrail.actionMap = action_map
+#        mtrail.annotations = annotations
+#        mtrail.currentVersion = mtrail.getLatestVersion()
+#        mtrail.updateIdScope()
+#        return mtrail
+    
+    ######################################################################
+    ## IdScope
+    ##      
+    def updateIdScope(self):
+        for action in self.actions:
+            self.id_scope.updateBeginId('mashup_action', action.id+1)
+            for alias in action.mashup.alias_list:
+                self.id_scope.updateBeginId('mashup_alias', alias.id+1)
+                self.id_scope.updateBeginId('mashup_component', alias.component.id+1)
+        for annotation in self.annotations:
+            self.id_scope.updateBeginId('annotation', annotation.id+1)
+        for aannotation in self.actionAnnotations:
+            self.id_scope.updateBeginId('mashup_actionAnnotation', aannotation.id+1)
+        
+
diff --git a/vistrails/core/modules/__init__.py b/vistrails/core/modules/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/modules/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/modules/abstraction.py b/vistrails/core/modules/abstraction.py
new file mode 100644
index 0000000..aff73cc
--- /dev/null
+++ b/vistrails/core/modules/abstraction.py
@@ -0,0 +1,180 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import re
+from itertools import chain
+
+from vistrails.core import debug
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+from vistrails.core.modules.sub_module import read_vistrail, new_abstraction, \
+    get_abstraction_dependencies, save_abstraction
+import vistrails.core.modules.module_registry
+from vistrails.core.system import vistrails_version
+from vistrails.core.utils import InvalidPipeline
+
+name = 'My SubWorkflows'
+version = '1.6'
+identifier = 'local.abstractions'
+
+my_vistrails = {}
+
+def initialize(*args, **kwargs):
+    import vistrails.core.packagemanager
+    manager = vistrails.core.packagemanager.get_package_manager()
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+#     conf = get_vistrails_configuration()
+#     if conf.check("userPackageDirectory"):
+#         if conf.check('userPackageDirectory'):
+#             abstraction_dir = os.path.join(conf.userPackageDirectory,
+#                                            'abstractions')
+
+#     abs_fnames = []
+#     p = re.compile(r".*\.vt")
+#     for abstraction in os.listdir(abstraction_dir):
+#         if p.match(abstraction):
+#             abs_fnames.append(os.path.join(abstraction_dir, abstraction))
+    abs_vistrails = my_vistrails
+    last_count = len(my_vistrails) + 1
+
+    missing_depends = {}
+    cannot_load = {}
+    while len(abs_vistrails) > 0 and len(abs_vistrails) < last_count:
+        new_vistrails = {}
+        for (abs_name, abs_info) in abs_vistrails.iteritems():
+            (abs_vistrail, abs_fname, abs_depends) = abs_info
+            packages = get_abstraction_dependencies(abs_vistrail)
+            add_abstraction = True
+            for package, inter_depends in packages.iteritems():
+                if package != identifier:
+                    if not manager.has_package(package):
+                        add_abstraction = False
+                        cannot_load[abs_name] = abs_vistrail
+                        break
+                else:
+                    for descriptor_info in inter_depends:
+                        if not reg.has_descriptor_with_name(*descriptor_info):
+                            add_abstraction = False
+                            new_vistrails[abs_name] = abs_info
+                            missing_depends[abs_name] = "Missing module '%s:%s'"\
+                                                        % (descriptor_info[0],
+                                                           descriptor_info[1])
+                            break
+            if add_abstraction:
+                abstraction = None
+                try:
+                    abstraction = \
+                        new_abstraction(abs_name, abs_vistrail, abs_fname)
+                except InvalidPipeline, e:
+                    # handle_invalid_pipeline will raise it's own InvalidPipeline
+                    # exception if it fails
+                    try:
+                        import vistrails.core.vistrail.controller
+                        module_version = abs_vistrail.get_latest_version()
+                        # Use a "dummy" controller to handle the upgrade
+                        controller = vistrails.core.vistrail.controller.VistrailController(abs_vistrail)
+                        (new_version, new_pipeline) = \
+                            controller.handle_invalid_pipeline(e, long(module_version), 
+                                                               abs_vistrail, False, True)
+                        del controller
+                        save_abstraction(abs_vistrail, abs_fname)
+                        abstraction = new_abstraction(abs_name, abs_vistrail, abs_fname,
+                                                      new_version, new_pipeline)
+                    except Exception, _e:
+                        cannot_load[abs_name] = (abs_vistrail, _e)
+                except Exception, e:
+                    cannot_load[abs_name] = (abs_vistrail, e)
+                if abstraction is not None:
+                    options = {'namespace': abstraction.uuid,
+                               'hide_namespace': True,
+                               'version': str(abstraction.internal_version)}
+                    reg.auto_add_module((abstraction, options))
+                    reg.auto_add_ports(abstraction)
+                    # print "Added subworkflow", abs_name, abstraction.uuid
+                elif abs_name not in cannot_load:
+                    cannot_load[abs_name] = (abs_vistrail, '')
+        last_count = len(abs_vistrails)
+        abs_vistrails = new_vistrails
+
+    for abs_name, (_, e) in cannot_load.iteritems():
+        debug.critical("Cannot load subworkflow '%s'" % abs_name)
+        if e:
+            debug.critical("- %s" % e)
+    for abs_name in abs_vistrails:
+        if abs_name in missing_depends:
+            debug.critical("Cannot load subworkflow '%s'" % abs_name,
+                           missing_depends[abs_name])
+        else:
+            debug.critical("Cannot load subworkflow '%s'" % abs_name)
+
+def package_dependencies():
+    import vistrails.core.packagemanager
+    manager = vistrails.core.packagemanager.get_package_manager()
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    conf = get_vistrails_configuration()
+    if conf.check("abstractionsDirectory"):
+        abstraction_dir = conf.abstractionsDirectory
+    p = re.compile(r".*\.xml")
+    all_packages = set()
+    for abstraction in os.listdir(abstraction_dir):
+        if p.match(abstraction):
+            abs_fname = os.path.join(abstraction_dir, abstraction)
+            try:
+                vistrail = read_vistrail(abs_fname)
+                dependencies = get_abstraction_dependencies(vistrail)
+            except vistrails.core.modules.module_registry.MissingPackage, e:
+                dependencies = {e._identifier: set()}
+            add_abstraction = True
+            inter_depends = []
+            for package, depends in dependencies.iteritems():
+                if package != identifier:
+                    if not manager.has_package(package):
+                        add_abstraction = False
+                        break
+                else:
+                    inter_depends.append(depends)
+            if add_abstraction:
+                # print 'adding', abstraction[:-4]
+                all_packages.update(p for p in dependencies.iterkeys()
+                                    if p != identifier)
+                my_vistrails[abstraction[:-4]] = \
+                    (vistrail, abs_fname, inter_depends)
+            else:
+                debug.critical(("Subworkflow '%s' is missing packages it " +
+                                "depends on") % abstraction)
+    # print 'all_packages:', all_packages
+    return list(all_packages)
diff --git a/vistrails/core/modules/basic_modules.py b/vistrails/core/modules/basic_modules.py
new file mode 100644
index 0000000..2a17b6d
--- /dev/null
+++ b/vistrails/core/modules/basic_modules.py
@@ -0,0 +1,1710 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""basic_modules defines basic VisTrails Modules that are used in most
+pipelines."""
+import vistrails.core.cache.hasher
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.vistrails_module import Module, new_module, \
+     Converter, NotCacheable, ModuleError
+import vistrails.core.system
+from vistrails.core.utils import InstanceObject
+from vistrails.core import debug
+
+from abc import ABCMeta
+from itertools import izip
+import os
+import pickle
+import re
+import shutil
+#import zipfile
+import urllib
+
+try:
+    import hashlib
+    sha_hash = hashlib.sha1
+except ImportError:
+    import sha
+    sha_hash = sha.new
+
+###############################################################################
+
+version = '2.1'
+name = 'Basic Modules'
+identifier = 'org.vistrails.vistrails.basic'
+old_identifiers = ['edu.utah.sci.vistrails.basic']
+
+class Constant(Module):
+    """Base class for all Modules that represent a constant value of
+    some type.
+    
+    When implementing your own constant, You have to adhere to the
+    following interface:
+
+    Implement the following methods:
+    
+       translate_to_python(x): Given a string, translate_to_python
+       must return a python value that will be the value seen by the
+       execution modules.
+
+       For example, translate_to_python called on a float parameter
+       with value '3.15' will return float('3.15').
+       
+       translate_to_string(): Return a string representation of the
+       current constant, which will eventually be passed to
+       translate_to_python.
+
+       validate(v): return True if given python value is a plausible
+       value for the constant. It should be implemented such that
+       validate(translate_to_python(x)) == True for all valid x
+
+    A constant must also expose its default value, through the field
+    default_value.
+
+    There are fields you are not allowed to use in your constant classes.
+    These are: 'id', 'interpreter', 'logging' and 'change_parameter'
+
+    You can also define the constant's own GUI widget.
+    See core/modules/constant_configuration.py for details.
+    
+    """
+    def compute(self):
+        """Constant.compute() only checks validity (and presence) of
+        input value."""
+        v = self.getInputFromPort("value")
+        b = self.validate(v)
+        if not b:
+            raise ModuleError(self, "Internal Error: Constant failed validation")
+        self.setResult("value", v)
+        self.setResult("value_as_string", self.translate_to_string(v))
+
+    def setValue(self, v):
+        self.setResult("value", self.translate_to_python(v))
+        self.upToDate = True
+        
+    def serialize(self):
+        return self.outputPorts['value_as_string']
+    
+    def deserialize(self, v):
+        return self.translate_to_python(v)
+
+    @staticmethod
+    def translate_to_string(v):
+        return str(v)
+
+    @staticmethod
+    def get_widget_class():
+        # return StandardConstantWidget
+        return None
+
+    @staticmethod
+    def get_query_widget_class():
+        return None
+
+    @staticmethod
+    def get_param_explore_widget_list():
+        return []
+
+    @staticmethod
+    def query_compute(value_a, value_b, query_method):
+        if query_method == '==' or query_method is None:
+            return (value_a == value_b)
+        elif query_method == '!=':
+            return (value_a != value_b)
+        return False
+
+def new_constant(name, py_conversion=None, default_value=None, validation=None,
+                 widget_type=None,
+                 str_conversion=None, base_class=Constant,
+                 compute=None, query_widget_type=None,
+                 query_compute=None,
+                 param_explore_widget_list=None):
+    """new_constant(name: str, 
+                    py_conversion: callable,
+                    default_value: python_type,
+                    validation: callable,
+                    widget_type: (path, name) tuple or QWidget type,
+                    str_conversion: callable,
+                    base_class: class,
+                    compute: callable,
+                    query_widget_type: (path, name) tuple or QWidget type,
+                    query_compute: static callable,
+                    param_explore_widget_list: 
+                        list((path, name) tuple or QWidget type)) -> Module
+
+    new_constant dynamically creates a new Module derived from
+    Constant with given py_conversion and str_conversion functions, a
+    corresponding python type and a widget type. py_conversion is a
+    python callable that takes a string and returns a python value of
+    the type that the class should hold. str_conversion does the reverse.
+
+    This is the quickest way to create new Constant Modules."""
+
+    d = {}
+
+    if py_conversion is not None:
+        d["translate_to_python"] = py_conversion
+    elif base_class == Constant:
+        raise ValueError("Must specify translate_to_python for constant")
+    else:
+        d["translate_to_python"] = staticmethod(base_class.translate_to_python)
+    if validation is not None:
+        d["validate"] = validation
+    elif base_class == Constant:
+        raise ValueError("Must specify validation for constant")
+    else:
+        d["validate"] = staticmethod(base_class.validate)
+    if default_value is not None:
+        d["default_value"] = default_value
+    elif base_class == Constant:
+        d["default_value"] = None
+    else:
+        d["default_value"] = base_class.default_value
+
+    if str_conversion is not None:
+        d['translate_to_string'] = str_conversion
+    if compute is not None:
+        d['compute'] = compute
+    if query_compute is not None:
+        d['query_compute'] = query_compute
+    if widget_type is not None:
+        @staticmethod
+        def get_widget_class():
+            return widget_type
+        d['get_widget_class'] = get_widget_class
+    if query_widget_type is not None:
+        @staticmethod
+        def get_query_widget_class():
+            return query_widget_type
+        d['get_query_widget_class'] = get_query_widget_class
+    if param_explore_widget_list is not None:
+        @staticmethod
+        def get_param_explore_widget_list():
+            return param_explore_widget_list
+        d['get_param_explore_widget_list'] = get_param_explore_widget_list
+
+    m = new_module(base_class, name, d)
+    m._input_ports = [('value', m)]
+    m._output_ports = [('value', m)]
+    return m
+
+def bool_conv(x):
+    s = str(x).upper()
+    if s == 'TRUE':
+        return True
+    if s == 'FALSE':
+        return False
+    raise ValueError('Boolean from String in VisTrails should be either \
+"true" or "false", got "%s" instead' % x)
+
+def int_conv(x):
+    if x.startswith('0x'):
+        return int(x, 16)
+    else:
+        return int(x)
+
+ at staticmethod
+def numeric_compare(value_a, value_b, query_method):
+    value_a = float(value_a)
+    value_b = float(value_b)
+    if query_method == '==' or query_method is None:
+        return (value_a == value_b)
+    elif query_method == '<':
+        return (value_a < value_b)
+    elif query_method == '>':
+        return (value_a > value_b)
+    elif query_method == '<=':
+        return (value_a <= value_b)
+    elif query_method == '>=':
+        return (value_a >= value_b)
+
+ at staticmethod
+def string_compare(value_a, value_b, query_method):
+    if query_method == '*[]*' or query_method is None:
+        return (value_b in value_a)
+    elif query_method == '==':
+        return (value_a == value_b)
+    elif query_method == '=~':
+        try:
+            m = re.match(value_b, value_a)
+            if m is not None:
+                return (m.end() ==len(value_a))
+        except:
+            pass
+    return False
+
+Boolean = new_constant('Boolean' , staticmethod(bool_conv),
+                       False, staticmethod(lambda x: isinstance(x, bool)),
+                       widget_type=('vistrails.gui.modules.constant_configuration', 
+                                    'BooleanWidget'))
+Float   = new_constant('Float'   , staticmethod(float), 0.0, 
+                       staticmethod(lambda x: isinstance(x, (int, long, float))),
+                       query_widget_type=('vistrails.gui.modules.query_configuration',
+                                          'NumericQueryWidget'),
+                       query_compute=numeric_compare,
+                       param_explore_widget_list=[('vistrails.gui.modules.paramexplore',
+                                                   'FloatExploreWidget')])
+Integer = new_constant('Integer' , staticmethod(int_conv), 0, 
+                       staticmethod(lambda x: isinstance(x, (int, long))),
+                       base_class=Float,
+                       query_widget_type=('vistrails.gui.modules.query_configuration',
+                                          'NumericQueryWidget'),
+                       query_compute=numeric_compare,
+                       param_explore_widget_list=[('vistrails.gui.modules.paramexplore',
+                                                   'IntegerExploreWidget')])
+String  = new_constant('String'  , staticmethod(str), "", 
+                       staticmethod(lambda x: isinstance(x, str)),
+                       query_widget_type=('vistrails.gui.modules.query_configuration',
+                                          'StringQueryWidget'),
+                       query_compute=string_compare,
+                       widget_type=('vistrails.gui.modules.constant_configuration',
+                                    'StringWidget'))
+
+##############################################################################
+
+class Path(Constant):
+    name = ""
+
+    @staticmethod
+    def translate_to_python(x):
+        result = Path()
+        result.name = x
+        result.setResult("value", result)
+        return result
+
+    @staticmethod
+    def translate_to_string(x):
+        return str(x.name)
+
+    @staticmethod
+    def validate(v):
+        #print 'validating', v
+        #print 'isinstance', isinstance(v, Path)
+        return isinstance(v, Path)
+
+    def get_name(self):
+        n = None
+        if self.hasInputFromPort("value"):
+            n = self.getInputFromPort("value").name
+        if n is None:
+            self.checkInputPort("name")
+            n = self.getInputFromPort("name")
+        return n
+
+    def set_results(self, n):
+        self.name = n
+        self.setResult("value", self)
+        self.setResult("value_as_string", self.translate_to_string(self))
+
+    def compute(self):
+        n = self.get_name()
+        self.set_results(n)
+
+    @staticmethod
+    def get_widget_class():
+        return ("vistrails.gui.modules.constant_configuration",
+                "PathChooserWidget")
+
+Path.default_value = Path()
+
+class File(Path):
+    """File is a VisTrails Module that represents a file stored on a
+    file system local to the machine where VisTrails is running."""
+    @staticmethod
+    def translate_to_python(x):
+        result = File()
+        result.name = x
+        result.setResult("value", result)
+        return result
+
+    def compute(self):
+        n = self.get_name()
+        if (self.hasInputFromPort("create_file") and
+                self.getInputFromPort("create_file")):
+            vistrails.core.system.touch(n)
+        if not os.path.isfile(n):
+            raise ModuleError(self, 'File %r does not exist' % n)
+        self.set_results(n)
+        self.setResult("local_filename", n)
+
+    @staticmethod
+    def get_widget_class():
+        return ("vistrails.gui.modules.constant_configuration",
+                "FileChooserWidget")
+
+File.default_value = File()
+    
+class Directory(Path):
+    @staticmethod
+    def translate_to_python(x):
+        result = Directory()
+        result.name = x
+        result.setResult("value", result)
+        return result
+
+    def compute(self):
+        n = self.get_name()
+        if (self.hasInputFromPort("create_directory") and
+                self.getInputFromPort("create_directory")):
+            try:
+                vistrails.core.system.mkdir(n)
+            except Exception, e:
+                raise ModuleError(self, 'mkdir: ' + str(e))
+        if not os.path.isdir(n):
+            raise ModuleError(self, 'Directory "%s" does not exist' % n)
+        self.set_results(n)
+
+        dir_list = os.listdir(n)
+        output_list = []
+        for item in dir_list:
+            full_path = os.path.join(n, item)
+            if os.path.isfile(full_path):
+                file_item = File()
+                file_item.name = full_path
+                file_item.upToDate = True
+                output_list.append(file_item)
+            elif os.path.isdir(full_path):
+                dir_item = Directory()
+                dir_item.name = full_path
+                dir_item.upToDate = True
+                output_list.append(dir_item)
+        self.setResult('itemList', output_list)
+
+    @staticmethod
+    def get_widget_class():
+        return ("vistrails.gui.modules.constant_configuration",
+                "DirectoryChooserWidget")
+
+Directory.default_value = Directory()
+
+def path_parameter_hasher(p):
+    def get_mtime(path):
+        v_list = [int(os.path.getmtime(path))]
+        if os.path.isdir(path):
+            for subpath in os.listdir(path):
+                subpath = os.path.join(path, subpath)
+                if os.path.isdir(subpath):
+                    v_list.extend(get_mtime(subpath))
+        return v_list
+
+    h = vistrails.core.cache.hasher.Hasher.parameter_signature(p)
+    try:
+        # FIXME: This will break with aliases - I don't really care that much
+        v_list = get_mtime(p.strValue)
+    except OSError:
+        return h
+    hasher = sha_hash()
+    hasher.update(h)
+    for v in v_list:
+        hasher.update(str(v))
+    return hasher.digest()
+
+##############################################################################
+
+class OutputPath(Path):
+    def get_name(self):
+        n = None
+        if self.hasInputFromPort("value"):
+            n = self.getInputFromPort("value").name
+        if n is None:
+            self.checkInputPort("name")
+            n = self.getInputFromPort("name")
+        return n
+        
+    def set_results(self, n):
+        self.name = n
+        self.setResult("value", self)
+        self.setResult("value_as_string", self.translate_to_string(self))
+
+    def compute(self):
+        n = self.get_name()
+        self.set_results(n)
+        
+    @staticmethod
+    def get_widget_class():
+        return ("vistrails.gui.modules.constant_configuration", 
+                "OutputPathChooserWidget")
+
+OutputPath.default_value = OutputPath()
+
+class FileSink(NotCacheable, Module):
+    """FileSink takes a file and writes it to a user-specified
+    location in the file system.  The file is stored at location
+    specified by the outputPath.  The overwrite flag allows users to
+    specify whether an existing path should be overwritten."""
+
+    def compute(self):
+        input_file = self.getInputFromPort("file")
+        output_path = self.getInputFromPort("outputPath")
+        full_path = output_path.name
+
+        try:
+            vistrails.core.system.link_or_copy(input_file.name, full_path)
+        except OSError, e:
+            if self.hasInputFromPort("overwrite") and \
+                    self.getInputFromPort("overwrite"):
+                try:
+                    os.unlink(full_path)
+                    vistrails.core.system.link_or_copy(input_file.name, full_path)
+                except OSError:
+                    msg = "(override true) Could not create file '%s'" % \
+                        full_path
+                    raise ModuleError(self, msg)
+            else:
+                msg = "Could not create file '%s': %s" % (full_path, e)
+                raise ModuleError(self, msg)
+            
+        if (self.hasInputFromPort("publishFile") and
+            self.getInputFromPort("publishFile") or 
+            not self.hasInputFromPort("publishFile")):
+            if self.moduleInfo.has_key('extra_info'):
+                if self.moduleInfo['extra_info'].has_key('pathDumpCells'):
+                    folder = self.moduleInfo['extra_info']['pathDumpCells']
+                    base_fname = os.path.basename(full_path)
+                    (base_fname, file_extension) = os.path.splitext(base_fname)
+                    base_fname = os.path.join(folder, base_fname)
+                    # make a unique filename
+                    filename = base_fname + file_extension
+                    counter = 2
+                    while os.path.exists(filename):
+                        filename = base_fname + "_%d%s" % (counter,
+                                                           file_extension)
+                        counter += 1
+                    try:
+                        vistrails.core.system.link_or_copy(input_file.name, filename)
+                    except OSError:
+                        msg = "Could not publish file '%s' \n   on  '%s': %s" % \
+                               (full_path, filename, e)
+                        # I am not sure whether we should raise an error
+                        # I will just print a warning for now (Emanuele)
+                        debug.warning("%s" % msg)
+
+class DirectorySink(NotCacheable, Module):
+    """DirectorySink takes a directory and writes it to a
+    user-specified location in the file system.  The directory is
+    stored at location specified by the outputPath.  The overwrite
+    flag allows users to specify whether an existing path should be
+    overwritten."""
+
+    def compute(self):
+        input_dir = self.getInputFromPort("dir")
+        output_path = self.getInputFromPort("outputPath")
+        full_path = output_path.name
+
+        if os.path.exists(full_path):
+            if (self.hasInputFromPort("overwrite") and 
+                self.getInputFromPort("overwrite")):
+                try:
+                    if os.path.isfile(full_path):
+                        os.remove(full_path)
+                    else:
+                        shutil.rmtree(full_path)
+                except OSError, e:
+                    msg = ('Could not delete existing path "%s" '
+                           '(overwrite on)' % full_path)
+                    raise ModuleError(self, msg + '\n' + str(e))
+            else:
+                msg = ('Could not write to existing path "%s" '
+                       '(overwrite off)' % full_path)
+                raise ModuleError(self, msg)
+            
+        try:
+            shutil.copytree(input_dir.name, full_path)
+        except OSError, e:
+            msg = 'Could not copy path from "%s" to "%s"' % \
+                (input_dir.name, full_path)
+            raise ModuleError(self, msg + '\n' + str(e))
+
+##############################################################################
+
+class WriteFile(Converter):
+    """Writes a String to a temporary File.
+    """
+    def compute(self):
+        contents = self.getInputFromPort('in_value')
+        suffix = self.forceGetInputFromPort('suffix', '')
+        result = self.interpreter.filePool.create_file(suffix=suffix)
+        with open(result.name, 'wb') as fp:
+            fp.write(contents)
+        self.setResult('out_value', result)
+
+##############################################################################
+
+class Color(Constant):
+    # We set the value of a color object to be an InstanceObject that
+    # contains a tuple because a tuple would be interpreted as a
+    # type(tuple) which messes with the interpreter
+
+    default_value = InstanceObject(tuple=(1,1,1))
+
+    @staticmethod
+    def translate_to_python(x):
+        return InstanceObject(
+            tuple=tuple([float(a) for a in x.split(',')]))
+
+    @staticmethod
+    def translate_to_string(v):
+        return ','.join('%f' % c for c in v.tuple)
+
+    @staticmethod
+    def validate(x):
+        return isinstance(x, InstanceObject) and hasattr(x, 'tuple')
+
+    @staticmethod
+    def to_string(r, g, b):
+        return "%s,%s,%s" % (r,g,b)
+
+    @staticmethod
+    def get_widget_class():
+        return ("vistrails.gui.modules.constant_configuration", "ColorWidget")
+        
+    @staticmethod
+    def get_query_widget_class():
+        return ("vistrails.gui.modules.query_configuration", "ColorQueryWidget")
+
+    @staticmethod
+    def get_param_explore_widget_list():
+        return [('vistrails.gui.modules.paramexplore', 'RGBExploreWidget'),
+                ('vistrails.gui.modules.paramexplore', 'HSVExploreWidget')]
+
+    @staticmethod
+    def query_compute(value_a, value_b, query_method):
+        # SOURCE: http://www.easyrgb.com/index.php?X=MATH
+        def rgb_to_xyz(r, g, b):
+            # r,g,b \in [0,1]
+
+            if r > 0.04045: 
+                r = ( ( r + 0.055 ) / 1.055 ) ** 2.4
+            else:
+                r = r / 12.92
+            if g > 0.04045:
+                g = ( ( g + 0.055 ) / 1.055 ) ** 2.4
+            else:
+                g = g / 12.92
+            if b > 0.04045: 
+                b = ( ( b + 0.055 ) / 1.055 ) ** 2.4
+            else:
+                b = b / 12.92
+
+            r *= 100
+            g *= 100
+            b *= 100
+
+            # Observer. = 2 deg, Illuminant = D65
+            x = r * 0.4124 + g * 0.3576 + b * 0.1805
+            y = r * 0.2126 + g * 0.7152 + b * 0.0722
+            z = r * 0.0193 + g * 0.1192 + b * 0.9505
+            return (x,y,z)
+
+        def xyz_to_cielab(x,y,z):
+            # Observer= 2 deg, Illuminant= D65
+            ref_x, ref_y, ref_z = (95.047, 100.000, 108.883)
+            x /= ref_x
+            y /= ref_y
+            z /= ref_z
+
+            if x > 0.008856:
+                x = x ** ( 1/3.0 )
+            else:                    
+                x = ( 7.787 * x ) + ( 16 / 116.0 )
+            if y > 0.008856:
+                y = y ** ( 1/3.0 )
+            else:
+                y = ( 7.787 * y ) + ( 16 / 116.0 )
+            if z > 0.008856: 
+                z = z ** ( 1/3.0 )
+            else:
+                z = ( 7.787 * z ) + ( 16 / 116.0 )
+
+            L = ( 116 * y ) - 16
+            a = 500 * ( x - y )
+            b = 200 * ( y - z )
+            return (L, a, b)
+
+        def rgb_to_cielab(r,g,b):
+            return xyz_to_cielab(*rgb_to_xyz(r,g,b))
+        
+        value_a_rgb = (float(a) for a in value_a.split(','))
+        value_b_rgb = (float(b) for b in value_b.split(','))
+        value_a_lab = rgb_to_cielab(*value_a_rgb)
+        value_b_lab = rgb_to_cielab(*value_b_rgb)
+        
+        # cie76 difference
+        diff = sum((v_1 - v_2) ** 2 
+                   for v_1, v_2 in izip(value_a_lab, value_b_lab)) ** (0.5)
+
+        # print "CIE 76 DIFFERENCE:", diff
+        if query_method is None:
+            query_method = '2.3'
+        return diff < float(query_method)
+
+##############################################################################
+
+class StandardOutput(NotCacheable, Module):
+    """StandardOutput is a VisTrails Module that simply prints the
+    value connected on its port to standard output. It is intended
+    mostly as a debugging device."""
+    
+    def compute(self):
+        v = self.getInputFromPort("value")
+        print v
+
+##############################################################################
+
+# Tuple will be reasonably magic right now. We'll integrate it better
+# with vistrails later.
+# TODO: Check Tuple class, test, integrate.
+class Tuple(Module):
+    """Tuple represents a tuple of values. Tuple might not be well
+    integrated with the rest of VisTrails, so don't use it unless
+    you know what you're doing."""
+
+    def __init__(self):
+        Module.__init__(self)
+        self.input_ports_order = []
+        self.values = tuple()
+
+    def compute(self):
+        values = tuple([self.getInputFromPort(p)
+                        for p in self.input_ports_order])
+        self.values = values
+        self.setResult("value", values)
+
+class Untuple(Module):
+    """Untuple takes a tuple and returns the individual values.  It
+    reverses the actions of Tuple.
+
+    """
+    def __init__(self):
+        Module.__init__(self)
+        self.output_ports_order = []
+
+    def compute(self):
+        if self.hasInputFromPort("tuple"):
+            tuple = self.getInputFromPort("tuple")
+            values = tuple.values
+        else:
+            values = self.getInputFromPort("value")
+        for p, value in izip(self.output_ports_order, values):
+            self.setResult(p, value)
+
+##############################################################################
+
+# TODO: Create a better Module for ConcatenateString.
+class ConcatenateString(Module):
+    """ConcatenateString takes many strings as input and produces the
+    concatenation as output. Useful for constructing filenames, for
+    example.
+
+    This class will probably be replaced with a better API in the
+    future."""
+
+    fieldCount = 4
+
+    def compute(self):
+        result = ""
+        for i in xrange(self.fieldCount):
+            v = i+1
+            port = "str%s" % v
+            if self.hasInputFromPort(port):
+                inp = self.getInputFromPort(port)
+                result += inp
+        self.setResult("value", result)
+
+##############################################################################
+
+class Not(Module):
+    """Not inverts a Boolean.
+    """
+
+    def compute(self):
+        value = self.getInputFromPort('input')
+        self.setResult('value', not value)
+
+##############################################################################
+# List
+
+# If numpy is available, we consider numpy arrays to be lists as well
+class ListType:
+    __metaclass__ = ABCMeta
+
+ListType.register(list)
+try:
+    import numpy
+except ImportError:
+    numpy = None
+else:
+    ListType.register(numpy.ndarray)
+
+class List(Constant):
+    default_value = []
+
+    def __init__(self):
+        Constant.__init__(self)
+        self.input_ports_order = []
+
+    @staticmethod
+    def validate(x):
+        return isinstance(x, ListType)
+
+    @staticmethod
+    def translate_to_python(v):
+        return eval(v)
+
+    @staticmethod
+    def translate_to_string(v, dims=None):
+        if dims is None:
+            if numpy is not None and isinstance(v, numpy.ndarray):
+                dims = v.ndim
+            else:
+                dims = 1
+        if dims == 1:
+            return '[%s]' % ', '.join(repr(c)
+                                      for c in v)
+        else:
+            return '[%s]' % ', '.join(List.translate_to_string(c, dims-1)
+                                      for c in v)
+
+    def compute(self):
+        head, middle, items, tail = [], [], [], []
+        got_value = False
+
+        if self.hasInputFromPort('value'):
+            # run the regular compute here
+            Constant.compute(self)
+            middle = self.outputPorts['value']
+            got_value = True
+        if self.hasInputFromPort('head'):
+            head = self.getInputListFromPort('head')
+            got_value = True
+        if self.input_ports_order:
+            items = [self.getInputFromPort(p)
+                     for p in self.input_ports_order]
+            got_value = True
+        if self.hasInputFromPort('tail'):
+            tail = self.getInputFromPort('tail')
+            got_value = True
+
+        if not got_value:
+            self.getInputFromPort('value')
+        self.setResult('value', head + middle + items + tail)
+
+List._input_ports = [('value', List)]
+List._output_ports = [('value', List)]
+
+##############################################################################
+# Dictionary
+                    
+def dict_conv(v):
+    v_dict = eval(v)
+    return v_dict
+
+def dict_compute(self):
+    d = {}
+    if self.hasInputFromPort('value'):
+        Constant.compute(self)
+        d.update(self.outputPorts['value'])
+    if self.hasInputFromPort('addPair'):
+        pairs_list = self.getInputListFromPort('addPair')
+        d.update(pairs_list)
+    if self.hasInputFromPort('addPairs'):
+        d.update(self.getInputFromPort('addPairs'))
+        
+    self.setResult("value", d)
+        
+Dictionary = new_constant('Dictionary', staticmethod(dict_conv),
+                          {}, staticmethod(lambda x: isinstance(x, dict)),
+                          compute=dict_compute)
+
+##############################################################################
+
+# TODO: Null should be a subclass of Constant?
+class Null(Module):
+    """Null is the class of None values."""
+    
+    def compute(self):
+        self.setResult("value", None)
+
+##############################################################################
+
+class Unpickle(Module):
+    """Unpickles a string.
+    """
+    def compute(self):
+        value = self.getInputFromPort('input')
+        self.setResult('result', pickle.loads(value))
+
+##############################################################################
+
+class CodeRunnerMixin(object):
+    def __init__(self):
+        self.output_ports_order = []
+        super(CodeRunnerMixin, self).__init__()
+
+    def run_code(self, code_str,
+                 use_input=False,
+                 use_output=False):
+        """run_code runs a piece of code as a VisTrails module.
+        use_input and use_output control whether to use the inputport
+        and output port dictionary as local variables inside the
+        execution."""
+        import vistrails.core.packagemanager
+        def fail(msg):
+            raise ModuleError(self, msg)
+        def cache_this():
+            self.is_cacheable = lambda *args, **kwargs: True
+        locals_ = locals()
+        if use_input:
+            for k in self.inputPorts:
+                locals_[k] = self.getInputFromPort(k)
+        if use_output:
+            for output_portname in self.output_ports_order:
+                locals_[output_portname] = None
+        _m = vistrails.core.packagemanager.get_package_manager()
+        reg = get_module_registry()
+        locals_.update({'fail': fail,
+                        'package_manager': _m,
+                        'cache_this': cache_this,
+                        'registry': reg,
+                        'self': self})
+        if 'source' in locals_:
+            del locals_['source']
+        exec code_str in locals_, locals_
+        if use_output:
+            for k in self.output_ports_order:
+                if locals_.get(k) != None:
+                    self.setResult(k, locals_[k])
+
+##############################################################################
+
+class PythonSource(CodeRunnerMixin, NotCacheable, Module):
+    """PythonSource is a Module that executes an arbitrary piece of
+    Python code.
+
+    It is especially useful for one-off pieces of 'glue' in a
+    pipeline.
+
+    If you want a PythonSource execution to fail, call
+    fail(error_message).
+
+    If you want a PythonSource execution to be cached, call
+    cache_this().
+    """
+
+    def compute(self):
+        s = urllib.unquote(str(self.getInputFromPort('source')))
+        self.run_code(s, use_input=True, use_output=True)
+
+##############################################################################
+
+class SmartSource(NotCacheable, Module):
+
+    def run_code(self, code_str,
+                 use_input=False,
+                 use_output=False):
+        import vistrails.core.packagemanager
+        def fail(msg):
+            raise ModuleError(self, msg)
+        def cache_this():
+            self.is_cacheable = lambda *args, **kwargs: True
+        locals_ = locals()
+
+        def smart_input_entry(k):
+            v = self.getInputFromPort(k)
+            if isinstance(v, Module) and hasattr(v, 'get_source'):
+                v = v.get_source()
+            return (k, v)
+
+        def get_mro(v):
+            # Tries to get the mro from strange class hierarchies like VTK's
+            try:
+                return v.mro()
+            except AttributeError:
+                def yield_all(v):
+                    b = v.__bases__
+                    yield v
+                    for base in b:
+                        g = yield_all(base)
+                        while 1: yield g.next()
+                return [x for x in yield_all(v)]
+            
+        if use_input:
+            inputDict = dict([smart_input_entry(k)
+                              for k in self.inputPorts])
+            locals_.update(inputDict)
+        if use_output:
+            for output_portname in self.output_ports_order:
+                locals_[output_portname] = None
+        _m = vistrails.core.packagemanager.get_package_manager()
+        locals_.update({'fail': fail,
+                        'package_manager': _m,
+                        'cache_this': cache_this,
+                        'self': self})
+        del locals_['source']
+        exec code_str in locals_, locals_
+        if use_output:
+            oports = self.registry.get_descriptor(SmartSource).output_ports
+            for k in self.output_ports_order:
+                if locals_.get(k) != None:
+                    v = locals_[k]
+                    spec = oports.get(k, None)
+
+                    if spec:
+                        # See explanation of algo in doc/smart_source_resolution_algo.txt
+                        # changed from spec.types()[0]
+                        port_vistrail_base_class = spec.descriptors()[0].module
+                        mro = get_mro(type(v))
+                        source_types = self.registry.python_source_types
+                        found = False
+                        for python_class in mro:
+                            if python_class in source_types:
+                                vistrail_classes = [x for x in source_types[python_class]
+                                                    if issubclass(x, port_vistrail_base_class)]
+                                if len(vistrail_classes) == 0:
+                                    # FIXME better error handling
+                                    raise ModuleError(self, "Module Registry inconsistent")
+                                vt_class = vistrail_classes[0]
+                                found = True
+                                break
+                        if found:
+                            vt_instance = vt_class()
+                            vt_instance.set_source(v)
+                            v = vt_instance
+                    self.setResult(k, v)
+
+    def compute(self):
+        s = urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        self.run_code(s, use_input=True, use_output=True)
+
+##############################################################################
+
+def zip_extract_file(archive, filename_in_archive, output_filename):
+    return os.system(
+            "%s > %s" % (
+                    vistrails.core.system.list2cmdline([
+                            'unzip',
+                            '-p', archive,
+                            filename_in_archive]),
+                    vistrails.core.system.list2cmdline([output_filename])))
+
+
+def zip_extract_all_files(archive, output_path):
+    return os.system(
+            vistrails.core.system.list2cmdline([
+                    'unzip',
+                    archive,
+                    '-d', output_path]))
+
+
+class Unzip(Module):
+    """Unzip extracts a file from a ZIP archive."""
+
+    def compute(self):
+        self.checkInputPort("archive_file")
+        self.checkInputPort("filename_in_archive")
+        filename_in_archive = self.getInputFromPort("filename_in_archive")
+        archive_file = self.getInputFromPort("archive_file")
+        if not os.path.isfile(archive_file.name):
+            raise ModuleError(self, "archive file does not exist")
+        suffix = self.interpreter.filePool.guess_suffix(filename_in_archive)
+        output = self.interpreter.filePool.create_file(suffix=suffix)
+        s = zip_extract_file(archive_file.name,
+                             filename_in_archive,
+                             output.name)
+        if s != 0:
+            raise ModuleError(self, "unzip command failed with status %d" % s)
+        self.setResult("file", output)
+
+
+class UnzipDirectory(Module):
+    """UnzipDirectory extracts every file from a ZIP archive."""
+
+    def compute(self):
+        self.checkInputPort("archive_file")
+        archive_file = self.getInputFromPort("archive_file")
+        if not os.path.isfile(archive_file.name):
+            raise ModuleError(self, "archive file does not exist")
+        output = self.interpreter.filePool.create_directory()
+        s = zip_extract_all_files(archive_file.name,
+                                  output.name)
+        if s != 0:
+            raise ModuleError(self, "unzip command failed with status %d" % s)
+        self.setResult("directory", output)
+
+##############################################################################
+
+class Round(Converter):
+    """Turns a Float into an Integer.
+    """
+    def compute(self):
+        fl = self.getInputFromPort('in_value')
+        floor = self.getInputFromPort('floor')
+        if floor:
+            integ = int(fl)         # just strip the decimals
+        else:
+            integ = int(fl + 0.5)   # nearest
+        self.setResult('out_value', integ)
+
+
+class TupleToList(Converter):
+    """Turns a Tuple into a List.
+    """
+    @classmethod
+    def can_convert(cls, sub_descs, super_descs):
+        if len(sub_descs) <= 1:
+            return False
+        reg = get_module_registry()
+        return super_descs == [reg.get_descriptor(List)]
+
+    def compute(self):
+        tu = self.getInputFromPort('in_value')
+        if not isinstance(tu, tuple):
+            raise ModuleError(self, "Input is not a tuple")
+        self.setResult('out_value', list(tu))
+
+##############################################################################
+    
+class Variant(Module):
+    """
+    Variant is tracked internally for outputing a variant type on
+    output port. For input port, Module type should be used
+    
+    """
+    pass
+
+##############################################################################
+
+class Assert(Module):
+    """
+    Assert is a simple module that conditionally stops the execution.
+    """
+    def compute(self):
+        condition = self.getInputFromPort('condition')
+        if not condition:
+            raise ModuleError(self, "Assert: condition is False",
+                              abort=True)
+
+
+class AssertEqual(Module):
+    """
+    AssertEqual works like Assert but compares two values.
+
+    It is provided for convenience.
+    """
+    def compute(self):
+        values = (self.getInputFromPort('value1'),
+                  self.getInputFromPort('value2'))
+        if values[0] != values[1]:
+            raise ModuleError(self, "AssertEqual: values are different",
+                              abort=True)
+
+##############################################################################
+
+def init_constant(m):
+    reg = get_module_registry()
+
+    reg.add_module(m)
+    reg.add_input_port(m, "value", m)
+    reg.add_output_port(m, "value", m)
+    
+def initialize(*args, **kwargs):
+    reg = get_module_registry()
+
+    # !!! is_root should only be set for Module !!!
+    reg.add_module(Module, is_root=True, abstract=True)
+    reg.add_output_port(Module, "self", Module, optional=True)
+
+    reg.add_module(Converter, abstract=True)
+    reg.add_input_port(Converter, 'in_value', Module)
+    reg.add_output_port(Converter, 'out_value', Module)
+
+    reg.add_module(Constant, abstract=True)
+
+    reg.add_module(Boolean)
+    reg.add_module(Float)
+    reg.add_module(Integer)
+    reg.add_module(String,
+                   configureWidgetType=("vistrails.gui.modules.string_configure",
+                                        "TextConfigurationWidget"))
+    
+    reg.add_output_port(Constant, "value_as_string", String)
+    reg.add_output_port(String, "value_as_string", String, True)
+
+    reg.add_module(List,
+                   configureWidgetType=(
+                           "vistrails.gui.modules.list_configuration",
+                           "ListConfigurationWidget"))
+    reg.add_input_port(List, "head", Module)
+    reg.add_input_port(List, "tail", List)
+
+    reg.add_module(Path)
+    reg.add_input_port(Path, "value", Path)
+    reg.add_output_port(Path, "value", Path)
+    reg.add_input_port(Path, "name", String, True)
+
+    reg.add_module(File, constantSignatureCallable=path_parameter_hasher)
+    reg.add_input_port(File, "value", File)
+    reg.add_output_port(File, "value", File)
+    reg.add_output_port(File, "self", File, True)
+    reg.add_input_port(File, "create_file", Boolean, True)
+    reg.add_output_port(File, "local_filename", String, True)
+
+    reg.add_module(Directory, constantSignatureCallable=path_parameter_hasher)
+    reg.add_input_port(Directory, "value", Directory)
+    reg.add_output_port(Directory, "value", Directory)
+    reg.add_output_port(Directory, "itemList", List)
+    reg.add_input_port(Directory, "create_directory", Boolean, True)
+
+    reg.add_module(OutputPath)
+    reg.add_output_port(OutputPath, "value", OutputPath)
+
+    reg.add_module(FileSink)
+    reg.add_input_port(FileSink, "file", File)
+    reg.add_input_port(FileSink, "outputPath", OutputPath)
+    reg.add_input_port(FileSink, "overwrite", Boolean, True, 
+                       defaults="('True',)")
+    reg.add_input_port(FileSink,  "publishFile", Boolean, True)
+    
+    reg.add_module(DirectorySink)
+    reg.add_input_port(DirectorySink, "dir", Directory)
+    reg.add_input_port(DirectorySink, "outputPath", OutputPath)
+    reg.add_input_port(DirectorySink, "overwrite", Boolean, True, 
+                       defaults="('True',)")
+
+    reg.add_module(WriteFile)
+    reg.add_input_port(WriteFile, 'in_value', String)
+    reg.add_input_port(WriteFile, 'suffix', String, True, defaults='[""]')
+    reg.add_output_port(WriteFile, 'out_value', File)
+
+    reg.add_module(Color)
+    reg.add_input_port(Color, "value", Color)
+    reg.add_output_port(Color, "value", Color)
+
+    reg.add_module(StandardOutput)
+    reg.add_input_port(StandardOutput, "value", Module)
+
+    reg.add_module(Tuple, 
+                   configureWidgetType=("vistrails.gui.modules.tuple_configuration",
+                                        "TupleConfigurationWidget"))
+
+    reg.add_module(Untuple, 
+                   configureWidgetType=("vistrails.gui.modules.tuple_configuration",
+                                        "UntupleConfigurationWidget"))
+
+    reg.add_module(ConcatenateString)
+    for i in xrange(ConcatenateString.fieldCount):
+        j = i+1
+        port = "str%s" % j
+        reg.add_input_port(ConcatenateString, port, String)
+    reg.add_output_port(ConcatenateString, "value", String)
+
+    reg.add_module(Not)
+    reg.add_input_port(Not, 'input', Boolean)
+    reg.add_output_port(Not, 'value', Boolean)
+
+    reg.add_module(Dictionary)
+    reg.add_input_port(Dictionary, "addPair", [Module, Module])
+    reg.add_input_port(Dictionary, "addPairs", List)
+
+    reg.add_module(Null, hide_descriptor=True)
+
+    reg.add_module(Variant, abstract=True)
+
+    reg.add_module(Assert)
+    reg.add_input_port(Assert, 'condition', Boolean)
+
+    reg.add_module(AssertEqual)
+    reg.add_input_port(AssertEqual, 'value1', Module)
+    reg.add_input_port(AssertEqual, 'value2', Module)
+
+    reg.add_module(Unpickle, hide_descriptor=True)
+    reg.add_input_port(Unpickle, 'input', String)
+    reg.add_output_port(Unpickle, 'result', Variant)
+
+    reg.add_module(PythonSource,
+                   configureWidgetType=("vistrails.gui.modules.python_source_configure",
+                                        "PythonSourceConfigurationWidget"))
+    reg.add_input_port(PythonSource, 'source', String, True, defaults=str(['']))
+    reg.add_output_port(PythonSource, 'self', Module)
+
+    reg.add_module(SmartSource,
+                   configureWidgetType=("vistrails.gui.modules.python_source_configure",
+                                        "PythonSourceConfigurationWidget"))
+    reg.add_input_port(SmartSource, 'source', String, True, defaults=str(['']))
+
+    reg.add_module(Unzip)
+    reg.add_input_port(Unzip, 'archive_file', File)
+    reg.add_input_port(Unzip, 'filename_in_archive', String)
+    reg.add_output_port(Unzip, 'file', File)
+
+    reg.add_module(UnzipDirectory)
+    reg.add_input_port(UnzipDirectory, 'archive_file', File)
+    reg.add_output_port(UnzipDirectory, 'directory', Directory)
+
+    reg.add_module(Round, hide_descriptor=True)
+    reg.add_input_port(Round, 'in_value', Float)
+    reg.add_output_port(Round, 'out_value', Integer)
+    reg.add_input_port(Round, 'floor', Boolean, optional=True,
+                       defaults="('True',)")
+
+    reg.add_module(TupleToList, hide_descriptor=True)
+    reg.add_input_port(TupleToList, 'in_value', Variant)
+    reg.add_output_port(TupleToList, 'out_value', List)
+
+    # initialize the sub_module modules, too
+    import vistrails.core.modules.sub_module
+    vistrails.core.modules.sub_module.initialize(*args, **kwargs)
+
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+   from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler
+   reg = get_module_registry()
+
+   def outputName_remap(old_conn, new_module):
+       ops = []
+       old_src_module = pipeline.modules[old_conn.source.moduleId]
+       op_desc = reg.get_descriptor(OutputPath)
+       new_x = (old_src_module.location.x + new_module.location.x) / 2.0
+       new_y = (old_src_module.location.y + new_module.location.y) / 2.0
+       op_module = \
+           controller.create_module_from_descriptor(op_desc, new_x, new_y)
+       ops.append(('add', op_module))
+       create_new_connection = UpgradeWorkflowHandler.create_new_connection
+       new_conn_1 = create_new_connection(controller,
+                                          old_src_module,
+                                          old_conn.source,
+                                          op_module,
+                                          "name")
+       ops.append(('add', new_conn_1))
+       new_conn_2 = create_new_connection(controller,
+                                          op_module,
+                                          "value",
+                                          new_module,
+                                          "outputPath")
+       ops.append(('add', new_conn_2))
+       return ops
+
+   module_remap = {'FileSink':
+                       [(None, '1.6', None,
+                         {'dst_port_remap':
+                              {'overrideFile': 'overwrite',
+                               'outputName': outputName_remap},
+                          'function_remap':
+                              {'overrideFile': 'overwrite',
+                               'outputName': 'outputPath'}})],
+                   'GetItemsFromDirectory':
+                       [(None, '1.6', 'Directory',
+                         {'dst_port_remap':
+                              {'dir': 'value'},
+                          'src_port_remap':
+                              {'itemlist': 'itemList'},
+                          })],
+                   'InputPort':
+                       [(None, '1.6', None,
+                         {'dst_port_remap': {'old_name': None}})],
+                   'OutputPort':
+                       [(None, '1.6', None,
+                         {'dst_port_remap': {'old_name': None}})],
+                   'PythonSource':
+                       [(None, '1.6', None, {})],
+                   }
+
+   return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline,
+                                              module_remap)
+
+
+###############################################################################
+
+import unittest
+
+class TestConcatenateString(unittest.TestCase):
+    @staticmethod
+    def concatenate(**kwargs):
+        from vistrails.tests.utils import execute, intercept_result
+        with intercept_result(ConcatenateString, 'value') as results:
+            errors = execute([
+                    ('ConcatenateString', 'org.vistrails.vistrails.basic', [
+                        (name, [('String', value)])
+                        for name, value in kwargs.iteritems()
+                    ]),
+                ])
+            if errors:
+                return None
+        return results
+
+    def test_concatenate(self):
+        """Concatenates strings"""
+        self.assertEqual(self.concatenate(
+                str1="hello ", str2="world"),
+                ["hello world"])
+        self.assertEqual(self.concatenate(
+                str3="hello world"),
+                ["hello world"])
+        self.assertEqual(self.concatenate(
+                str2="hello ", str4="world"),
+                ["hello world"])
+        self.assertEqual(self.concatenate(
+                str1="hello", str3=" ", str4="world"),
+                ["hello world"])
+
+    def test_empty(self):
+        """Runs ConcatenateString with no input"""
+        self.assertEqual(self.concatenate(), [""])
+
+
+class TestNot(unittest.TestCase):
+    def run_pipeline(self, functions):
+        from vistrails.tests.utils import execute, intercept_result
+        with intercept_result(Not, 'value') as results:
+            errors = execute([
+                    ('Not', 'org.vistrails.vistrails.basic',
+                     functions),
+                ])
+        return errors, results
+
+    def test_true(self):
+        errors, results = self.run_pipeline([
+                ('input', [('Boolean', 'True')])])
+        self.assertFalse(errors)
+        self.assertEqual(len(results), 1)
+        self.assertIs(results[0], False)
+
+    def test_false(self):
+        errors, results = self.run_pipeline([
+                ('input', [('Boolean', 'False')])])
+        self.assertFalse(errors)
+        self.assertEqual(len(results), 1)
+        self.assertIs(results[0], True)
+
+    def test_notset(self):
+        errors, results = self.run_pipeline([])
+        self.assertTrue(errors)
+
+
+class TestList(unittest.TestCase):
+    @staticmethod
+    def build_list(value=None, head=None, tail=None):
+        from vistrails.tests.utils import execute, intercept_result
+        with intercept_result(List, 'value') as results:
+            functions = []
+            def add(n, v, t):
+                if v is not None:
+                    for e in v:
+                        functions.append(
+                                (n, [(t, e)])
+                            )
+            add('value', value, 'List')
+            add('head', head, 'String')
+            add('tail', tail, 'List')
+
+            errors = execute([
+                    ('List', 'org.vistrails.vistrails.basic', functions),
+                ])
+            if errors:
+                return None
+        # List is a Constant, so the interpreter will set the result 'value'
+        # from the 'value' input port automatically
+        # Ignore these first results
+        return results[-1]
+
+    def test_simple(self):
+        """Tests the default ports of the List module"""
+        self.assertEqual(self.build_list(
+                value=['["a", "b", "c"]']),
+                ["a", "b", "c"])
+        self.assertEqual(self.build_list(
+                head=["d"],
+                value=['["a", "b", "c"]']),
+                ["d", "a", "b", "c"])
+        self.assertEqual(self.build_list(
+                head=["d"],
+                value=['["a", "b", "c"]'],
+                tail=['["e", "f"]']),
+                ["d", "a", "b", "c", "e", "f"])
+        self.assertEqual(self.build_list(
+                value=['[]'],
+                tail=['[]']),
+                [])
+
+    def test_multiple(self):
+        """Tests setting multiple values on a port"""
+        # Multiple values on 'head'
+        self.assertEqual(self.build_list(
+                head=["a", "b"]),
+                ["a", "b"])
+        self.assertEqual(self.build_list(
+                head=["a", "b"],
+                value=['["c", "d"]']),
+                ["a", "b", "c", "d"])
+
+        # Multiple values on 'value'
+        res = self.build_list(value=['["a", "b"]', '["c", "d"]'])
+        self.assertIn(res, [["a", "b"], ["c", "d"]])
+
+    def test_items(self):
+        """Tests the multiple 'itemN' ports"""
+        from vistrails.tests.utils import execute, intercept_result
+        def list_with_items(nb_items, **kwargs):
+            with intercept_result(List, 'value') as results:
+                errors = execute([
+                        ('List', 'org.vistrails.vistrails.basic', [
+                            (k, [('String', v)])
+                            for k, v in kwargs.iteritems()
+                        ]),
+                    ],
+                    add_port_specs=[
+                        (0, 'input', 'item%d' % i,
+                         '(org.vistrails.vistrails.basic:Module)')
+                        for i in xrange(nb_items)
+                    ])
+                if errors:
+                    return None
+            return results[-1]
+
+        self.assertEqual(
+                list_with_items(2, head="one", item0="two", item1="three"),
+                ["one", "two", "three"])
+
+        # All 'itemN' ports have to be set
+        self.assertIsNone(
+                list_with_items(3, head="one", item0="two", item2="three"))
+
+
+class TestPythonSource(unittest.TestCase):
+    def test_simple(self):
+        """A simple PythonSource returning a string"""
+        import urllib2
+        from vistrails.tests.utils import execute, intercept_result
+        source = 'customout = "nb is %d" % customin'
+        source = urllib2.quote(source)
+        with intercept_result(PythonSource, 'customout') as results:
+            self.assertFalse(execute([
+                    ('PythonSource', 'org.vistrails.vistrails.basic', [
+                        ('source', [('String', source)]),
+                        ('customin', [('Integer', '42')])
+                    ]),
+                    ('String', 'org.vistrails.vistrails.basic', []),
+                ],
+                [
+                    (0, 'customout', 1, 'value'),
+                ],
+                add_port_specs=[
+                    (0, 'input', 'customin',
+                     'org.vistrails.vistrails.basic:Integer'),
+                    (0, 'output', 'customout',
+                     'org.vistrails.vistrails.basic:String'),
+                ]))
+        self.assertEqual(results[-1], "nb is 42")
+
+
+class TestNumericConversions(unittest.TestCase):
+    def test_full(self):
+        from vistrails.tests.utils import execute, intercept_result
+        with intercept_result(Round, 'out_value') as results:
+            self.assertFalse(execute([
+                    ('Integer', 'org.vistrails.vistrails.basic', [
+                        ('value', [('Integer', '5')])
+                    ]),
+                    ('Float', 'org.vistrails.vistrails.basic', []),
+                    ('PythonCalc', 'org.vistrails.vistrails.pythoncalc', [
+                        ('value2', [('Float', '2.7')]),
+                        ('op', [('String', '+')]),
+                    ]),
+                    ('Round', 'org.vistrails.vistrails.basic', [
+                        ('floor', [('Boolean', 'True')]),
+                    ]),
+                ],
+                [
+                    (0, 'value', 1, 'value'),
+                    (1, 'value', 2, 'value1'),
+                    (2, 'value', 3, 'in_value'),
+                ]))
+        self.assertEqual(results, [7])
+
+
+class TestUnzip(unittest.TestCase):
+    def test_unzip_file(self):
+        from vistrails.tests.utils import execute, intercept_result
+        from vistrails.core.system import vistrails_root_directory
+        zipfile = os.path.join(vistrails_root_directory(),
+                               'tests', 'resources',
+                               'test_archive.zip')
+        with intercept_result(Unzip, 'file') as outfiles:
+            self.assertFalse(execute([
+                    ('Unzip', 'org.vistrails.vistrails.basic', [
+                        ('archive_file', [('File', zipfile)]),
+                        ('filename_in_archive', [('String', 'file1.txt')]),
+                    ]),
+                ]))
+        self.assertEqual(len(outfiles), 1)
+        with open(outfiles[0].name, 'rb') as outfile:
+            self.assertEqual(outfile.read(), "some random\ncontent")
+
+    def test_unzip_all(self):
+        from vistrails.tests.utils import execute, intercept_result
+        from vistrails.core.system import vistrails_root_directory
+        zipfile = os.path.join(vistrails_root_directory(),
+                               'tests', 'resources',
+                               'test_archive.zip')
+        with intercept_result(UnzipDirectory, 'directory') as outdir:
+            self.assertFalse(execute([
+                    ('UnzipDirectory', 'org.vistrails.vistrails.basic', [
+                        ('archive_file', [('File', zipfile)]),
+                    ]),
+                ]))
+        self.assertEqual(len(outdir), 1)
+
+        self.assertEqual(
+                [(d, f) for p, d, f in os.walk(outdir[0].name)],
+                [(['subdir'], ['file1.txt']),
+                 ([], ['file2.txt'])])
+
+
+from vistrails.core.configuration import get_vistrails_configuration
+
+class TestTypechecking(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        conf = get_vistrails_configuration()
+        cls.error_all = conf.errorOnConnectionTypeerror
+        cls.error_variant = conf.errorOnVariantTypeerror
+
+    @classmethod
+    def tearDownClass(cls):
+        conf = get_vistrails_configuration()
+        conf.errorOnConnectionTypeerror = cls.error_all
+        conf.errorOnVariantTypeerror = cls.error_variant
+
+    @staticmethod
+    def set_settings(error_all, error_variant):
+        conf = get_vistrails_configuration()
+        conf.errorOnConnectionTypeerror = error_all
+        conf.errorOnVariantTypeerror = error_variant
+
+    def run_test_pipeline(self, result, expected_results, *args, **kwargs):
+        from vistrails.tests.utils import execute, intercept_result
+        for error_all, error_variant, expected in expected_results:
+            self.set_settings(error_all, error_variant)
+            with intercept_result(*result) as results:
+                error = execute(*args, **kwargs)
+            if not expected:
+                self.assertTrue(error)
+            else:
+                self.assertFalse(error)
+                self.assertEqual(results, expected)
+
+    def test_basic(self):
+        import urllib2
+        # Base case: no typing error
+        # This should succeed in every case
+        self.run_test_pipeline(
+            (PythonSource, 'r'),
+            [(False, False, ["test"]),
+             (True, True, ["test"])],
+            [
+                ('PythonSource', 'org.vistrails.vistrails.basic', [
+                    ('source', [('String', urllib2.quote('o = "test"'))]),
+                ]),
+                ('PythonSource', 'org.vistrails.vistrails.basic', [
+                    ('source', [('String', urllib2.quote('r = i'))])
+                ]),
+            ],
+            [
+                (0, 'o', 1, 'i'),
+            ],
+            add_port_specs=[
+                (0, 'output', 'o',
+                 'org.vistrails.vistrails.basic:String'),
+                (1, 'input', 'i',
+                 'org.vistrails.vistrails.basic:String'),
+                (1, 'output', 'r',
+                 'org.vistrails.vistrails.basic:String')
+            ])
+
+    def test_fake(self):
+        import urllib2
+        # A module is lying, declaring a String but returning an int
+        # This should fail with errorOnConnectionTypeerror=True (not the
+        # default)
+        self.run_test_pipeline(
+            (PythonSource, 'r'),
+            [(False, False, [42]),
+             (False, True, [42]),
+             (True, True, False)],
+            [
+                ('PythonSource', 'org.vistrails.vistrails.basic', [
+                    ('source', [('String', urllib2.quote('o = 42'))]),
+                ]),
+                ('PythonSource', 'org.vistrails.vistrails.basic', [
+                    ('source', [('String', urllib2.quote('r = i'))])
+                ]),
+            ],
+            [
+                (0, 'o', 1, 'i'),
+            ],
+            add_port_specs=[
+                (0, 'output', 'o',
+                 'org.vistrails.vistrails.basic:String'),
+                (1, 'input', 'i',
+                 'org.vistrails.vistrails.basic:String'),
+                (1, 'output', 'r',
+                 'org.vistrails.vistrails.basic:String')
+            ])
+
+    def test_inputport(self):
+        import urllib2
+        # This test uses an InputPort module, whose output port should not be
+        # considered a Variant port (although it is)
+        self.run_test_pipeline(
+            (PythonSource, 'r'),
+            [(False, False, [42]),
+             (False, True, [42]),
+             (True, True, [42])],
+            [
+                ('InputPort', 'org.vistrails.vistrails.basic', [
+                    ('ExternalPipe', [('Integer', '42')]),
+                ]),
+                ('PythonSource', 'org.vistrails.vistrails.basic', [
+                    ('source', [('String', urllib2.quote('r = i'))])
+                ]),
+            ],
+            [
+                (0, 'InternalPipe', 1, 'i'),
+            ],
+            add_port_specs=[
+                (1, 'input', 'i',
+                 'org.vistrails.vistrails.basic:String'),
+                (1, 'output', 'r',
+                 'org.vistrails.vistrails.basic:String'),
+            ])
diff --git a/vistrails/core/modules/constant_configuration.py b/vistrails/core/modules/constant_configuration.py
new file mode 100644
index 0000000..ca9064b
--- /dev/null
+++ b/vistrails/core/modules/constant_configuration.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# *** MOVED *** to gui.modules.constant_configuration
+import traceback
+from vistrails.core import debug
+
+from vistrails.gui.modules.constant_configuration import *
+debug.warning("The use of core.modules.constant_configuration is deprecated.  "
+              "Please use gui.modules.constant_configuration.",
+              ''.join(traceback.format_stack()))
+
diff --git a/vistrails/core/modules/module_configure.py b/vistrails/core/modules/module_configure.py
new file mode 100644
index 0000000..fa576d4
--- /dev/null
+++ b/vistrails/core/modules/module_configure.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# *** MOVED *** to gui.modules.module_configure
+import traceback
+from vistrails.core import debug
+
+from vistrails.gui.modules.module_configure import *
+debug.warning("The use of core.modules.module_configure is deprecated.  "
+              "Please use gui.modules.module_configure.",
+              ''.join(traceback.format_stack()))
+
diff --git a/vistrails/core/modules/module_descriptor.py b/vistrails/core/modules/module_descriptor.py
new file mode 100644
index 0000000..be535ab
--- /dev/null
+++ b/vistrails/core/modules/module_descriptor.py
@@ -0,0 +1,404 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import pydoc
+
+from vistrails.core import debug
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.vistrail.port_spec import PortSpec
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.utils import create_descriptor_string
+from vistrails.db.domain import DBModuleDescriptor
+
+# this is used by add_port to signal a repeated port. Should never
+# happen, but it does. Probably means a bug on the dynamic modules
+# such as MplPlot and Tuple.  Of course, that also means that we
+# should be robust in the presence of these errors, since user-defined
+# modules could exhibit this bug
+
+class OverloadedPort(Exception):
+    pass
+
+###############################################################################
+# ModuleDescriptor
+
+class ModuleDescriptor(DBModuleDescriptor):
+    """ModuleDescriptor is a class that holds information about
+    modules in the registry. There exists exactly one ModuleDescriptor
+    for every registered VisTrails module in the system.
+
+    self.module: reference to the python class that defines the module
+    self.name: name of the module
+    self.identifier: identifier of the package that module belongs to
+    self.input_ports: dictionary of names of input ports to the types
+      consumed by the ports
+    self.output_ports: dictionary of names of output ports to the types
+      produces by the ports
+    self.input_ports_optional: dictionary of input port names that records
+      whether ports should show up by default on GUI
+    self.output_ports_optional: dictionary of output port names that records
+      whether ports should show up by default on GUI
+    self.port_order: stores a map from names to numbers to order the ports
+      in the GUI
+
+    self._is_abstract: whether module is abstract
+    self._configuration_widget: reference to the Qt class that provides a
+      custom configuration widget for the class.  Note that this can
+      be a tuple (path, name) that will be loaded only when needed via
+      __import__ (! this is preferred !) or as a QWidget (deprecated)
+
+    self._left_fringe and self._right_fringe: lists of 2D points that
+      define a drawing style for modules in the GUI
+    self._module_color: color of the module in the GUI
+
+    self._widget_item: stores a reference to the ModuleTreeWidgetItem so
+      that when ports are added to modules things get correctly updated.
+
+    self._input_port_cache, self._output_port_cache,
+      self._port_caches: Dictionaries for fast port spec lookup,
+      created because port spec lookups are sometimes part of hot code
+      paths and need to go as fast as possible.
+    """
+
+    ##########################################################################
+
+    def __init__(self, *args, **kwargs):
+        self.children = []
+        if 'module' in kwargs:
+            self.module = kwargs['module']
+            if 'name' not in kwargs:
+                kwargs['name'] = self.module.__name__
+            del kwargs['module']
+        else:
+            self.module = None
+        if 'base_descriptor' in kwargs:
+            if kwargs['base_descriptor'] is not None:
+                self._base_descriptor = kwargs['base_descriptor']
+                if 'base_descriptor_id' not in kwargs:
+                    kwargs['base_descriptor_id'] = self._base_descriptor.id
+                self._port_count = self._base_descriptor._port_count
+                self._base_descriptor.children.append(self)
+            else:
+                self._base_descriptor = None
+                self._port_count = 0
+            del kwargs['base_descriptor']
+        else:
+            self._base_descriptor = None
+            self._port_count = 0
+        # rename identifier to package for db
+        if 'identifier' in kwargs:
+            if 'package' not in kwargs:
+                kwargs['package'] = kwargs['identifier']
+            del kwargs['identifier']
+        if 'base_descriptor_id' not in kwargs:
+            kwargs['base_descriptor_id'] = -1
+        DBModuleDescriptor.__init__(self, *args, **kwargs)
+        self.set_defaults()
+
+    def set_defaults(self, other=None):
+        if other is None:
+            self._abstraction_refs = 1
+            self._is_abstract = False
+            self._configuration_widget = None
+            self._left_fringe = None
+            self._right_fringe = None
+            self._module_color = None
+            self._hasher_callable = None
+            self._widget_item = None
+            self._is_hidden = False
+            self._namespace_hidden = False
+            self.children = []
+            # The ghost attributes represent the original values
+            # for the descriptor of an upgraded package subworkflow
+            # so it can be displayed with it's original package
+            # rather than 'local.abstractions'
+            self.ghost_identifier = ''
+            self.ghost_package_version = ''
+            self.ghost_namespace = None
+        else:
+            # FIXME this will break things, I think
+            self.children = copy.copy(other.children)
+            
+            self._base_descriptor = other._base_descriptor
+            self.module = other.module
+            self._port_count = other._port_count
+            self._abstraction_refs = self._abstraction_refs
+            self._is_abstract = other._is_abstract
+            self._configuration_widget = other._configuration_widget
+            self._left_fringe = other._left_fringe
+            self._right_fringe = other._right_fringe
+            self._module_color = other._module_color
+            self._hasher_callable = other._hasher_callable
+            self._widget_item = other._widget_item
+            self._is_hidden = other._is_hidden
+            self._namespace_hidden = other._namespace_hidden
+            self.ghost_identifier = other.ghost_identifier
+            self.ghost_package_version = other.ghost_package_version
+            self.ghost_namespace = other.ghost_namespace
+        self.port_specs = self.db_portSpecs_name_index
+        if self.version is None:
+            self.version = ''
+        if self.namespace is None:
+            self.namespace = ''
+
+    def __copy__(self):
+        return ModuleDescriptor.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleDescriptor.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ModuleDescriptor
+        cp.set_defaults(self)
+        return cp
+        
+    @staticmethod
+    def convert(_desc):
+        if _desc.__class__ == ModuleDescriptor:
+            return
+        _desc.__class__ = ModuleDescriptor
+        
+        for port_spec in _desc.db_portSpecs:
+            PortSpec.convert(port_spec)
+
+        # do more init stuff
+        _desc.children = []
+        _desc.module = None
+        _desc._base_descriptor = None
+        _desc._port_count = 0
+        _desc.set_defaults()
+
+    ##########################################################################
+    # Properties
+
+    id = DBModuleDescriptor.db_id
+    name = DBModuleDescriptor.db_name
+    identifier = DBModuleDescriptor.db_package
+    package = DBModuleDescriptor.db_package
+    namespace = DBModuleDescriptor.db_namespace
+    package_version = DBModuleDescriptor.db_package_version
+    version = DBModuleDescriptor.db_version
+    base_descriptor_id = DBModuleDescriptor.db_base_descriptor_id
+    port_specs_list = DBModuleDescriptor.db_portSpecs
+    
+    def _get_base_descriptor(self):
+        if self._base_descriptor is None and self.base_descriptor_id >= 0:
+            from vistrails.core.modules.module_registry import get_module_registry
+            reg = get_module_registry()
+            self._base_descriptor = \
+                reg.descriptors_by_id[self.base_descriptor_id]
+        return self._base_descriptor
+    def _set_base_descriptor(self, base_descriptor):
+        self._base_descriptor = base_descriptor
+        self.base_descriptor_id = base_descriptor.id
+    base_descriptor = property(_get_base_descriptor, _set_base_descriptor)
+
+    def _get_sigstring(self):
+        return create_descriptor_string(self.db_package, self.db_name,
+                                        self.db_namespace)
+    sigstring = property(_get_sigstring)
+
+    def _get_spec_tuple(self):
+        return (self.package, self.name, self.namespace)
+    spec_tuple = property(_get_spec_tuple)
+
+    def set_module_abstract(self, v):
+        self._is_abstract = v
+
+    def module_abstract(self):
+#         if not self.has_ports():
+#             return True
+        return self._is_abstract
+
+    def set_configuration_widget(self, configuration_widget_type):
+        """set_configuration_widget(configuration_widget_type: 
+                                        (path, name) tuple or QWidget) -> None
+        
+        """
+        self._configuration_widget = configuration_widget_type
+
+    def configuration_widget(self):
+        return self._configuration_widget
+
+    def set_module_color(self, color):
+        if color:
+            assert isinstance(color, tuple)
+            assert len(color) == 3
+            for i in 0,1,2:
+                assert isinstance(color[i], float)
+        self._module_color = color
+
+    def module_color(self):
+        return self._module_color
+
+    def set_module_fringe(self, left_fringe, right_fringe):
+        if left_fringe is None:
+            assert right_fringe is None
+            self._left_fringe = None
+            self._right_fringe = None
+        else:
+            vistrails.core.modules.module_registry._check_fringe(left_fringe)
+            vistrails.core.modules.module_registry._check_fringe(right_fringe)
+            self._left_fringe = left_fringe
+            self._right_fringe = right_fringe
+
+    def module_fringe(self):
+        if self._left_fringe is None and self._right_fringe is None:
+            return None
+        return (self._left_fringe, self._right_fringe)
+
+    def module_documentation(self, module=None):
+        doc = pydoc.getdoc(self.module)
+        if hasattr(self.module, 'get_documentation'):
+            try:
+                doc = self.module.get_documentation(doc, module)
+            except Exception, e:
+                import traceback
+                debug.critical(str(e), traceback.format_exc())
+                doc = doc or "(Error getting documentation)"
+        doc = doc or "(No documentation available)"
+        return doc
+
+    def module_package(self):
+        return self.identifier
+
+    def set_hasher_callable(self, callable_):
+        self._hasher_callable = callable_
+    def hasher_callable(self):
+        return self._hasher_callable
+
+    def _get_is_hidden(self):
+        return self._is_hidden
+    def _set_is_hidden(self, hidden):
+        self._is_hidden = hidden
+    is_hidden = property(_get_is_hidden, _set_is_hidden)
+
+    def _get_namespace_hidden(self):
+        return self._namespace_hidden
+    def _set_namespace_hidden(self, hidden):
+        self._namespace_hidden = hidden
+    namespace_hidden = property(_get_namespace_hidden, _set_namespace_hidden)
+
+    ##########################################################################
+    # Operators
+
+    def __hash__(self):
+        return (type(self), self.package, self.name, self.namespace, 
+                self.version).__hash__()
+
+    def __eq__(self, other):
+        return (self.package == other.package and
+                self.name == other.name and
+                self.namespace == other.namespace and
+                self.version == other.version)
+
+    def __str__(self):
+        return ("ModuleDescriptor(id=%s, package=%s, name=%s, namespace=%s, "
+                "version=%s, base_descriptor_id=%s)" % \
+                    (self.id, self.package, self.name, self.namespace,
+                     self.version, self.base_descriptor_id))
+ 
+    ##########################################################################
+    # Abstract module detection support
+
+    def set_widget(self, widget_item):
+        self._widget_item = widget_item
+
+    def has_ports(self):
+        """Returns True is module has any ports (this includes
+        superclasses).  This method exists to make automatic abstract
+        module detection efficient."""
+        return self._port_count > 0
+
+    def port_count(self):
+        """Return the total number of available for the module."""
+        return self._port_count
+
+    # Signal handling
+    def new_input_port(self):
+        """Updates needed variables when new input port is added
+        to either this module or the superclass."""
+        self._port_count += 1
+        if self._widget_item:
+            self._widget_item.added_input_port()
+        for child in self.children:
+            child.new_input_port()
+        
+    def new_output_port(self):
+        """Updates needed variables when new output port is added
+        to either this module or the superclass."""
+        self._port_count += 1
+        if self._widget_item:
+            self._widget_item.added_output_port()
+        for child in self.children:
+            child.new_output_port()
+
+    ##########################################################################
+
+    # port_type is 'input' or 'output'
+    def has_port_spec(self, name, port_type):
+        return self.db_has_portSpec_with_name((name, port_type))
+
+    def get_port_spec(self, name, port_type):
+        if not self.db_has_portSpec_with_name((name, port_type)):
+            raise ValueError("ModuleDescriptor.get_port_spec called when spec "
+                             " (%s, %s) doesn't exist" % (name, port_type))
+        return self.db_get_portSpec_by_name((name, port_type))
+
+    def set_port_spec(self, name, port_type, port_spec):
+        self.db_add_portSpec(port_spec)
+
+    def add_port_spec(self, port_spec):
+        self.db_add_portSpec(port_spec)
+
+    def delete_port_spec(self, port_spec):
+        self.db_delete_portSpec(port_spec)
+        
+    def delete_input_port(self, name):
+        key = (name, 'input')
+        if key in self.port_specs:
+            self.delete_port_spec(self.port_specs[key])
+        else:
+            raise VistrailsInternalError("delete_input_port called on "
+                                         "nonexistent port '%s'" % name)
+
+    def delete_output_port(self, name):
+        key = (name, 'output')
+        if key in self.port_specs:
+            self.delete_port_spec(self.port_specs[key])
+        else:
+            raise VistrailsInternalError("delete_output_port called on "
+                                         "nonexistent port '%s'" % name)
+
+
+
diff --git a/vistrails/core/modules/module_registry.py b/vistrails/core/modules/module_registry.py
new file mode 100644
index 0000000..acdbc02
--- /dev/null
+++ b/vistrails/core/modules/module_registry.py
@@ -0,0 +1,2001 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from itertools import izip, chain
+import copy
+import os
+import tempfile
+import traceback
+import uuid
+
+from vistrails.core import debug, get_vistrails_application
+from vistrails.core.data_structures.graph import Graph
+import vistrails.core.modules
+import vistrails.core.modules.vistrails_module
+from vistrails.core.modules.module_descriptor import ModuleDescriptor
+from vistrails.core.modules.package import Package
+import vistrails.core.modules.utils
+from vistrails.core.utils import VistrailsInternalError, memo_method, \
+     InvalidModuleClass, ModuleAlreadyExists, append_to_dict_of_lists, \
+     all, profile, versions_increasing, InvalidPipeline
+from vistrails.core.system import vistrails_root_directory, vistrails_version, \
+    get_vistrails_basic_pkg_id
+from vistrails.core.vistrail.port import Port, PortEndPoint
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.vistrail.port_spec_item import PortSpecItem
+import vistrails.core.cache.hasher
+from vistrails.db.domain import DBRegistry
+
+import unittest
+
+##############################################################################
+
+# This is used by add_module to make sure the fringe specifications
+# make sense
+def _check_fringe(fringe):
+    assert isinstance(fringe, list)
+    assert len(fringe) >= 1
+    for v in fringe:
+        assert isinstance(v, tuple)
+        assert len(v) == 2
+        assert isinstance(v[0], float)
+        assert isinstance(v[1], float)
+
+def _toposort_modules(module_list):
+    """_toposort_modules([class]) -> [class]
+
+    _toposort_modules takes a list of modules and returns them
+    sorted topologically wrt to the subclass relation, such that
+    if a and b are both in the list and issubclass(a,b), then a
+    will appear before b in the resulting order.
+    """
+
+    g = Graph()
+    for m in module_list:
+        if isinstance(m, tuple):
+            g.add_vertex(m[0], m)
+        else:
+            g.add_vertex(m, m)
+    for m in module_list:
+        if isinstance(m, tuple):
+            m = m[0]
+        for subclass in m.mro()[1:]: # skip self
+            if subclass in g.vertices:
+                g.add_edge(subclass, m)
+    return [g.vertices[v] for v in g.vertices_topological_sort()]
+
+def _parse_abstraction_name(filename):
+    # assume only 1 possible prefix or suffix
+    prefixes = ["abstraction_"]
+    suffixes = [".vt", ".xml"]
+    name = os.path.basename(filename)
+    for prefix in prefixes:
+        if name.startswith(prefix):
+            name = name[len(prefix):]
+            break
+    for suffix in suffixes:
+        if name.endswith(suffix):
+            name = name[:-len(suffix)]
+            break
+    return name
+
+def _toposort_abstractions(package, abstraction_list):
+    from vistrails.core.modules.sub_module import find_internal_abstraction_refs
+    g = Graph()
+    for a in abstraction_list:
+        if isinstance(a, tuple):
+            if isinstance(a[1], dict) and 'name' in a[1]:
+                name = (a[1]['name'], a[1].get('namespace', ''))
+            else:
+                name = (_parse_abstraction_name(a[0]), '')
+            g.add_vertex(name, a)
+        else:
+            g.add_vertex((_parse_abstraction_name(a), ''), a)
+    for a in abstraction_list:
+        if isinstance(a, tuple):
+            a = a[0]
+        for ref in find_internal_abstraction_refs(package, a):
+            if ref in g.vertices:
+                g.add_edge(ref, a)
+    return [g.vertices[v] for v in g.vertices_topological_sort()]
+
+###############################################################################
+# ModuleRegistrySignals
+
+class ModuleRegistrySignals(object):
+
+    # # new_module_signal is emitted with descriptor of new module
+    # new_module_signal = QtCore.SIGNAL("new_module")
+    # # new_abstraction_signal is emitted with descriptor of new abstraction
+    # new_abstraction_signal = QtCore.SIGNAL("new_abstraction")
+    # # new_package_signal is emitted with identifier of new package (only for abstractions)
+    # new_package_signal = QtCore.SIGNAL("new_package")
+    # # deleted_module_signal is emitted with descriptor of deleted module
+    # deleted_module_signal = QtCore.SIGNAL("deleted_module")
+    # # deleted_abstraction_signal is emitted with descriptor of deleted abstraction
+    # deleted_abstraction_signal = QtCore.SIGNAL("deleted_abstraction")
+    # # deleted_package_signal is emitted with package identifier
+    # deleted_package_signal = QtCore.SIGNAL("deleted_package")
+    # # new_input_port_signal is emitted with identifier and name of module, 
+    # # new port and spec
+    # new_input_port_signal = QtCore.SIGNAL("new_input_port_signal")
+    # # new_output_port_signal is emitted with identifier and name of module,
+    # # new port and spec
+    # new_output_port_signal = QtCore.SIGNAL("new_output_port_signal")
+
+    # show_module_signal = QtCore.SIGNAL("show_module")
+    # hide_module_signal = QtCore.SIGNAL("hide_module")
+    # module_updated_signal = QtCore.SIGNAL("module_updated")
+
+    def __init__(self):
+        app = get_vistrails_application()
+        notifications = ["reg_new_module",
+                         "reg_new_abstraction",
+                         "reg_new_package",
+                         "reg_deleted_module",
+                         "reg_deleted_abstraction",
+                         "reg_deleted_package",
+                         "reg_new_input_port",
+                         "reg_new_output_port",
+                         "reg_show_module",
+                         "reg_hide_module",
+                         "reg_module_updated"]
+
+        for notification in notifications:
+            app.create_notification(notification)
+        
+    def emit_new_module(self, descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_new_module", descriptor)
+        # self.emit(self.new_module_signal, descriptor)
+
+    def emit_new_abstraction(self, descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_new_abstraction", descriptor)
+        # self.emit(self.new_abstraction_signal, descriptor)
+
+    def emit_new_package(self, identifier, prepend=False):
+        app = get_vistrails_application()
+        app.send_notification("reg_new_package", identifier, prepend)
+        # self.emit(self.new_package_signal, identifier, prepend)        
+        
+    def emit_deleted_module(self, descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_deleted_module", descriptor)
+        # self.emit(self.deleted_module_signal, descriptor)
+
+    def emit_deleted_abstraction(self, descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_deleted_abstraction", descriptor)
+        # self.emit(self.deleted_abstraction_signal, descriptor)
+    
+    def emit_deleted_package(self, package):
+        app = get_vistrails_application()
+        app.send_notification("reg_deleted_package", package)
+        # self.emit(self.deleted_package_signal, package)
+
+    def emit_new_input_port(self, identifier, name, port_name, spec):
+        app = get_vistrails_application()
+        app.send_notification("reg_new_input_port", identifier, name, 
+                              port_name, spec)
+        # self.emit(self.new_input_port_signal, identifier, name, port_name,
+        #           spec)
+
+    def emit_new_output_port(self, identifier, name, port_name, spec):
+        app = get_vistrails_application()
+        app.send_notification("reg_new_output_port", identifier, name, 
+                              port_name, spec)
+        # self.emit(self.new_output_port_signal, identifier, name, port_name, 
+        #           spec)
+
+    def emit_show_module(self, descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_show_module", descriptor)
+        # self.emit(self.show_module_signal, descriptor)
+
+    def emit_hide_module(self, descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_hide_module", descriptor)
+        # self.emit(self.hide_module_signal, descriptor)
+
+    def emit_module_updated(self, old_descriptor, new_descriptor):
+        app = get_vistrails_application()
+        app.send_notification("reg_module_updated", old_descriptor, 
+                              new_descriptor)
+        # self.emit(self.module_updated_signal, old_descriptor, new_descriptor)
+
+###############################################################################
+# ModuleRegistry
+
+# !!!!!! DEPRECATED !!!!!!
+# Use get_module_registry()
+global registry, add_module, add_input_port, has_input_port, add_output_port, \
+    set_current_package, get_descriptor_by_name, get_module_by_name, \
+    get_descriptor
+registry                 = None
+add_module               = None
+add_input_port           = None
+has_input_port           = None
+add_output_port          = None
+set_current_package      = None
+get_descriptor_by_name   = None
+get_module_by_name       = None
+get_descriptor           = None
+
+
+class ModuleRegistryException(Exception):
+    def __init__(self, identifier, name=None, namespace=None,
+                 package_version=None, module_version=None, module_id=None):
+        Exception.__init__(self)
+        self._identifier = identifier
+        self._name = name
+        self._namespace = namespace
+        self._package_version = package_version
+        self._module_version = module_version
+        self._module_id = module_id
+
+    def __str__(self):
+        p_version_str = ""
+        m_str = ""
+        if self._package_version:
+            p_version_str = " (version '%s')" % self._package_version
+        if self._name:
+            if self._namespace:
+                m_str = " : %s|%s" % (self._namespace, self._name)
+            else:
+                m_str = " : %s" % self._name
+            if self._module_version:
+                m_str += " (version '%s')" % self._module_version
+
+        return "RegistryException: %s%s%s" % (self._identifier,
+                                              p_version_str, m_str)
+
+    def __eq__(self, other):
+        return type(self) == type(other) and \
+            self._identifier == other._identifier and \
+            self._name == other._name and \
+            self._namespace == other._namespace and \
+            self._package_version == other._package_version and \
+            self._module_version == other._module_version and \
+            self._module_id == other._module_id
+
+    def __hash__(self):
+        return (type(self), self._identifier, self._name, self._namespace,
+                self._package_version, self._module_version, 
+                self._module_id).__hash__()
+
+    def _get_module_name(self):
+        if self._namespace:
+            return "%s|%s" % (self._namespace, self._name)
+        return self._name
+    _module_name = property(_get_module_name)
+
+    def _get_package_name(self):
+        if self._package_version:
+            return "%s (version %s)" % (self._identifier, 
+                                        self._package_version)
+        return self._identifier
+    _package_name = property(_get_package_name)
+
+class MissingPackage(ModuleRegistryException):
+    def __init__(self, identifier):
+        ModuleRegistryException.__init__(self, identifier)
+
+    def __str__(self):
+        return "Missing package: %s" % self._identifier
+
+    def _get_module_id(self):
+        return None
+    def _set_module_id(self, m_id):
+        # do not set
+        pass
+    _module_id = property(_get_module_id, _set_module_id)
+
+class MissingModule(ModuleRegistryException):
+    def __init__(self, identifier, name, namespace, package_version=None,
+                 module_id=None):
+        ModuleRegistryException.__init__(self, identifier, name, namespace,
+                                         package_version, None, module_id)
+
+    def __str__(self):
+        return "Missing module %s in package %s" % (self._module_name,
+                                                    self._package_name)
+
+class MissingPackageVersion(ModuleRegistryException):
+    def __init__(self, identifier, version):
+        ModuleRegistryException.__init__(self, identifier, None, None, 
+                                         version)
+
+    def __str__(self):
+        return "Missing version %s of package %s" % \
+            (self._package_version, self._identifier)
+
+class MissingModuleVersion(ModuleRegistryException):
+    def __init__(self, identifier, name, namespace, module_version, 
+                 package_version=None, module_id=None):
+        ModuleRegistryException.__init__(self, identifier, name, namespace,
+                                         package_version, module_version, module_id)
+
+    def __str__(self):
+        return "Missing version %s of module %s from package %s" % \
+            (self._module_version, self._module_name, self._package_name)
+
+class AmbiguousResolution(ModuleRegistryException):
+    def __init__(self, name, namespace, matches):
+        ModuleRegistryException.__init__(self, "<unkown package>", 
+                                         name, namespace)
+        self.matches = matches
+
+    def __str__(self):
+        return ("Ambiguous resolution of module %s.  Could resolve to:\n%s" % \
+                    (self._module_name, 
+                     ',\n'.join(str(m) for m in self.matches)))
+
+class MissingPort(ModuleRegistryException):
+    def __init__(self, descriptor, port_name, port_type):
+        ModuleRegistryException.__init__(self,
+                                         descriptor.identifier,
+                                         descriptor.name,
+                                         descriptor.namespace)
+        self._port_name = port_name
+        self._port_type = port_type
+
+    def __str__(self):
+        return "Missing %s port %s from module %s in package %s" % \
+            (self._port_type, self._port_name, self._module_name, 
+             self._package_name)
+
+class PortMismatch(MissingPort):
+    def __init__(self, identifier, name, namespace, port_name, port_type, port_sigstring):
+        ModuleRegistryException.__init__(self,
+                                         identifier,
+                                         name,
+                                         namespace)
+
+        self._port_name = port_name
+        self._port_type = port_type
+        self._port_sigstring = port_sigstring
+
+    def __str__(self):
+        return ("%s port '%s' of signature '%s' has bad specification"
+                " in module %s of package %s") % \
+                (self._port_type.capitalize(), self._port_name,
+                 self._port_sigstring, self._module_name, self._package_name)
+
+class PortsIncompatible(ModuleRegistryException):
+
+    def __init__(self, output_identifier, output_name, output_namespace,
+                 output_port, input_identifier, input_name, input_namespace,
+                 input_port):
+        ModuleRegistryException.__init__(self, output_identifier, output_name,
+                                         output_namespace)
+        self._output_port = output_port
+        self._input_identifier = input_identifier
+        self._input_name = input_name
+        self._input_namespace = input_namespace
+        self._input_port = input_port
+
+    def __str__(self):
+        if self._namespace:
+            out_name = "%s:%s|%s" % (self._identifier, self._namespace,
+                                     self._name)
+        else:
+            out_name = "%s:%s" % (self._identifier, self._name)
+        if self._input_namespace:
+            in_name = "%s:%s|%s" % (self._input_identifier,
+                                    self._input_namespace,
+                                    self._input_name)
+        else:
+            in_name = "%s:%s" % (self._input_identifier, self._input_name)
+        return ('Output port "%s" from module "%s" cannot connect to '
+                'input port "%s" from module "%s".' % (self._output_port,
+                                                       out_name,
+                                                       self._input_port,
+                                                       in_name))
+
+class DuplicateModule(ModuleRegistryException):
+    def __init__(self, old_descriptor, new_identifier, new_name, 
+                 new_namespace):
+        ModuleRegistryException.__init__(self,
+                                         new_identifier,
+                                         new_name,
+                                         new_namespace)
+        self.old_descriptor = old_descriptor
+
+    def __str__(self):
+        if self.old_descriptor.namespace:
+            old_name = "%s|%s" % (self.old_descriptor.namespace,
+                                  self.old_descriptor.name)
+        else:
+            old_name = self.old_descriptor.name
+        return ("Module %s in package %s already exists as "
+                "%s in package %s") % \
+                (self._module_name, self._package_name, old_name, 
+                 self.old_descriptor.identifier)
+
+class DuplicateIdentifier(ModuleRegistryException):
+    def __init__(self, identifier, name, namespace=None,
+                 package_version=None, module_version=None):
+        ModuleRegistryException.__init__(self, identifier, name, namespace,
+                                         package_version, module_version)
+
+    def __str__(self):
+        return "There is already a module %s in package %s" % \
+            (self._module_name, self._package_name)
+
+class InvalidPortSpec(ModuleRegistryException):
+    def __init__(self, descriptor, port_name, port_type, exc):
+        ModuleRegistryException.__init__(self,
+                                         descriptor.identifier,
+                                         descriptor.name,
+                                         descriptor.namespace)
+        self._port_name = port_name
+        self._port_type = port_type[0].capitalize() + port_type[1:]
+        self._exc = exc
+        
+    def __str__(self):
+        return ('%s port "%s" from module %s in package %s '
+                'has bad specification\n  %s' % \
+            (self._port_type, self._port_name, self._module_name,
+             self._package_name, str(self._exc)))
+
+class MissingBaseClass(Exception):
+    def __init__(self, base):
+        Exception.__init__(self)
+        self._base = base
+
+    def __str__(self):
+        return "Base class has not been registered : %s" % (self._base.__name__)
+
+class ModuleRegistry(DBRegistry):
+    """ModuleRegistry serves as a registry of VisTrails modules.
+    """
+
+    ##########################################################################
+    # Constructor and copy
+
+    def __init__(self, *args, **kwargs):
+        """ModuleRegistry is the base class for objects that store a hierarchy
+        of registered VisTrails Modules. There is one global registry for the
+        system, and some modules have local registries (in the case of
+        dynamically configurable modules, like PythonSource).
+
+        """
+        
+        if 'root_descriptor_id' not in kwargs:
+            kwargs['root_descriptor_id'] = -1
+        DBRegistry.__init__(self, *args, **kwargs)
+
+        self._conversions = dict()
+        self._converters = set()
+
+        self.set_defaults()
+
+    def __copy__(self):
+        ModuleRegistry.do_copy(self)
+
+    def set_defaults(self, other=None):
+        self._root_descriptor = None
+        self.signals = ModuleRegistrySignals()
+        self.setup_indices()
+        if other is None:
+            # _constant_hasher_map stores callables for custom parameter
+            # hashers
+            self._constant_hasher_map = {}
+            basic_pkg = get_vistrails_basic_pkg_id()
+            if basic_pkg in self.packages:
+                self._default_package = self.packages[basic_pkg]
+                self._current_package = self._default_package
+            else:
+                self._default_package = None
+                self._current_package = None
+        else:
+            self._constant_hasher_map = copy.copy(other._constant_hasher_map)
+            self._current_package = \
+                self.packages[other._current_package.identifier]
+            self._default_package = \
+                self.packages[other._default_package.identifier]
+
+    def setup_indices(self):
+        self.descriptors_by_id = {}
+        self.package_versions = self.db_packages_identifier_index
+        self.packages = {}
+        self._module_key_map = {}
+        for pkg in self.package_versions.itervalues():
+            for key in chain(pkg.old_identifiers, [pkg.identifier]):
+                if key in self.packages:
+                    old_pkg = self.packages[key]
+                    if versions_increasing(old_pkg.version, pkg.version):
+                        self.packages[key] = pkg
+                else:
+                    self.packages[key] = pkg
+            for descriptor in pkg.descriptor_list:
+                self.descriptors_by_id[descriptor.id] = descriptor
+                k = (descriptor.identifier, descriptor.name, 
+                     descriptor.namespace, pkg.version, descriptor.version)
+                if descriptor.module is not None:
+                    self._module_key_map[descriptor.module] = k
+        for descriptor in self.descriptors_by_id.itervalues():
+            if descriptor.base_descriptor_id in self.descriptors_by_id:
+                base_descriptor = \
+                    self.descriptors_by_id[descriptor.base_descriptor_id]
+                if descriptor not in base_descriptor.children:
+                    base_descriptor.children.append(descriptor)
+        
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRegistry.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ModuleRegistry
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_reg):
+        if _reg.__class__ == ModuleRegistry:
+            return
+        _reg.__class__ = ModuleRegistry
+        for package in _reg.package_list:
+            Package.convert(package)
+        _reg.set_defaults()
+
+    def set_global(self):
+        global registry, add_module, add_input_port, has_input_port, \
+            add_output_port, set_current_package, get_descriptor_by_name, \
+            get_module_by_name, get_descriptor
+
+        if registry is not None:
+            raise VistrailsInternalError("Global registry already set.")
+
+        registry                 = self
+        add_module               = self.add_module
+        add_input_port           = self.add_input_port
+        has_input_port           = self.has_input_port
+        add_output_port          = self.add_output_port
+        set_current_package      = self.set_current_package
+        get_descriptor_by_name   = self.get_descriptor_by_name
+        get_module_by_name       = self.get_module_by_name
+        get_descriptor           = self.get_descriptor
+
+    ##########################################################################
+    # Properties
+
+    package_list = DBRegistry.db_packages
+    root_descriptor_id = DBRegistry.db_root_descriptor_id
+
+    def _get_root_descriptor(self):
+        if self._root_descriptor is None:
+            if self.root_descriptor_id >= 0:
+                self._root_descriptor = \
+                    self.descriptors_by_id[self.root_descriptor_id]
+        return self._root_descriptor
+    def _set_root_descriptor(self, descriptor):
+        self._root_descriptor = descriptor
+        self.root_descriptor_id = descriptor.id
+    root_descriptor = property(_get_root_descriptor, _set_root_descriptor)
+
+    def add_descriptor(self, desc, package=None):
+        if package is None:
+            package = self._default_package
+        # self.descriptors[(desc.package, desc.name, desc.namespace)] = desc
+        self.descriptors_by_id[desc.id] = desc
+        package.add_descriptor(desc)
+    def delete_descriptor(self, desc, package=None):
+        if package is None:
+            try:
+                package = self.packages[desc.identifier]
+            except KeyError:
+                package = self._default_package
+        if desc.base_descriptor_id != -1 and desc.base_descriptor:
+            desc.base_descriptor.children.remove(desc)
+        # del self.descriptors[(desc.package, desc.name, desc.namespace)]
+        del self.descriptors_by_id[desc.id]
+        package.delete_descriptor(desc)
+    def add_package(self, package):
+        DBRegistry.db_add_package(self, package)
+        for key in chain(package.old_identifiers, [package.identifier]):
+            if key in self.packages:
+                old_pkg = self.packages[key]
+                if versions_increasing(old_pkg.version, package.version):
+                    self.packages[key] = package
+            else:
+                self.packages[key] = package
+
+    def delete_package(self, package):
+        DBRegistry.db_delete_package(self, package)
+        # FIXME hard to incremental updates here so we'll just recreate
+        # this can be slow
+        self.setup_indices()
+
+    def create_default_package(self):
+        basic_pkg = get_vistrails_basic_pkg_id()
+        default_codepath = os.path.join(vistrails_root_directory(), 
+                                        "core", "modules", "basic_modules.py")
+        self._default_package = \
+            Package(id=self.idScope.getNewId(Package.vtType),
+                    codepath=default_codepath,
+                    load_configuration=False,
+                    identifier=basic_pkg,
+                    name='Basic Modules',
+                    version=vistrails_version(),
+                    description="Basic modules for VisTrails")
+        # FIXME need to serialize old_identifiers!
+        self._default_package.old_identifiers = ['edu.utah.sci.vistrails.basic']
+        self.add_package(self._default_package)
+        return self._default_package
+
+    def has_abs_upgrade(self, identifier, name, namespace='', 
+                        package_version='', module_version=''):
+
+        # if this fails, we want to raise the exception
+        try:
+            package = self.get_package_by_name(identifier, package_version)
+        except MissingPackageVersion:
+            package = self.get_package_by_name(identifier)
+        return package.has_abs_upgrade(name, namespace, module_version)
+
+    def get_abs_upgrade(self, identifier, name, namespace='',
+                        package_version='', module_version=''):
+        try:
+            package = self.get_package_by_name(identifier, package_version)
+        except MissingPackageVersion:
+            package = self.get_package_by_name(identifier)
+        return package.get_abs_upgrade(name, namespace, module_version)
+
+    # def has_abs_upgrade(self, descriptor_info):
+    #     return descriptor_info in self._abs_pkg_upgrades
+
+    # def get_abs_upgrade(self, descriptor_info):
+    #     if self.has_abs_upgrade(descriptor_info):
+    #         return self._abs_pkg_upgrades[descriptor_info]
+    #     return None
+
+    ##########################################################################
+    # Per-module registry functions
+
+    def add_hierarchy(self, global_registry, module):
+        # a per-module registry needs to have all the module hierarchy
+        # registered there so that add_module doesn't fail with
+        # missing base class. We do _NOT_ add the ports, so watch out!
+        
+        reg = global_registry
+        d = reg.get_descriptor_by_name(module.package, module.name, 
+                                       module.namespace)
+        # we exclude the first module in the hierarchy because it's Module
+        # which we know exists (constructor adds)
+        hierarchy = reg.get_module_hierarchy(d)
+        for desc in reversed(hierarchy[:-1]):
+            old_base = desc.base_descriptor
+            base_descriptor = self.get_descriptor_by_name(old_base.package,
+                                                          old_base.name,
+                                                          old_base.namespace)
+            # FIXME: this package_version should live on descriptor?
+            package = self.get_package_by_name(desc.package)
+            self.update_registry(base_descriptor, desc.module, desc.package, 
+                                 desc.name, desc.namespace, package.version,
+                                 desc.version)
+
+    def get_package_by_name(self, identifier, package_version=''):
+        package_version = package_version or ''
+        package_version_key = (identifier, package_version)
+#         if package_version is not None and package_version.strip() == "":
+#             package_version = None
+        try:
+            if not package_version:
+                return self.packages[identifier]
+            else:
+                return self.package_versions[package_version_key]
+        except KeyError:
+            if identifier not in self.packages:
+                raise MissingPackage(identifier)
+            elif package_version and \
+                    package_version_key not in self.package_versions:
+                raise MissingPackageVersion(identifier, package_version)
+
+    def get_module_by_name(self, identifier, name, namespace=None):
+        """get_module_by_name(name: string): class
+
+        Returns the VisTrails module (the class) registered under the
+        given name.
+
+        """
+        return self.get_descriptor_by_name(identifier, name, namespace).module
+
+    def has_descriptor_with_name(self, identifier, name, namespace='',
+                                 package_version='', module_version=''):
+        namespace = namespace or ''
+        package_version = package_version or ''
+        module_version = module_version or ''
+
+        try:
+            if not package_version:
+                package = self.packages[identifier]
+            else:
+                package_version_key = (identifier, package_version)
+                package = self.package_versions[package_version_key]
+            if not module_version:
+                descriptor = package.descriptors[(name, namespace)]
+            else:
+                descriptor_version_key = (name, namespace, module_version)
+                descriptor = \
+                    package.descriptor_versions[descriptor_version_key]
+        except KeyError:
+            return False
+        return True
+    has_module = has_descriptor_with_name
+
+    def get_descriptor_by_name(self, identifier, name, namespace='', 
+                               package_version='', module_version=''):
+        """get_descriptor_by_name(package_identifier : str,
+                                  module_name : str,
+                                  namespace : str,
+                                  package_version : str,
+                                  module_version : str) -> ModuleDescriptor
+        Gets the specified descriptor from the registry.  If you do not
+        specify package_version, you will get the currently loaded version.
+        If you do not specify the module_version, you will get the most recent
+        version.  Note that module_version is currently only used for
+        abstractions.
+
+        Raises a ModuleRegistryException if lookup fails.
+        """
+        namespace = namespace or ''
+        package_version = package_version or ''
+        module_version = module_version or ''
+
+        try:
+            package = self.packages[identifier]
+            if package_version:
+                package_version_key = (identifier, package_version)
+                package = self.package_versions[package_version_key]
+            if not module_version:
+                descriptor = package.descriptors[(name, namespace)]
+            else:
+                descriptor_version_key = (name, namespace, module_version)
+                descriptor = \
+                    package.descriptor_versions[descriptor_version_key]
+            return descriptor
+        except KeyError:
+            if identifier not in self.packages:
+                raise MissingPackage(identifier)
+            elif (name, namespace) not in package.descriptors:
+                raise MissingModule(identifier, name, namespace, 
+                                    package_version)
+            elif package_version and \
+                    package_version_key not in self.package_versions:
+                raise MissingPackageVersion(identifier, package_version)
+            elif module_version and descriptor_version_key not in \
+                    package.descriptor_versions:
+                raise MissingModuleVersion(identifier, name, namespace,
+                                           module_version, package_version)
+            else:
+                raise ModuleRegistryException(identifier, name, namespace,
+                                              package_version, module_version)
+
+    def get_similar_descriptor(self, identifier, name, namespace=None,
+                               package_version=None, module_version=None):
+        try:
+            return self.get_descriptor_by_name(identifier, name, namespace,
+                                               package_version, module_version)
+        except MissingPackageVersion:
+            return self.get_similar_descriptor(identifier, name, namespace,
+                                               None, module_version)
+        except MissingModuleVersion:
+            return self.get_similar_descriptor(identifier, name, namespace,
+                                               package_version, None)
+#         except Exception:
+#             raise
+
+        return None
+            
+    def get_descriptor(self, module):
+        """get_descriptor(module: class) -> ModuleDescriptor
+
+        Returns the ModuleDescriptor of a given vistrails module (a
+        class that subclasses from modules.vistrails_module.Module)
+
+        """
+        # assert isinstance(module, type)
+        # assert issubclass(module, core.modules.vistrails_module.Module)
+        # assert self._module_key_map.has_key(module)
+        k = self._module_key_map[module]
+        return self.get_descriptor_by_name(*k)
+
+    # get_descriptor_from_module is a synonym for get_descriptor
+    get_descriptor_from_module = get_descriptor
+
+    def module_ports(self, p_type, descriptor):
+        return [(p.name, p)
+                for p in descriptor.port_specs_list
+                if p.type == p_type]
+        
+    def module_source_ports_from_descriptor(self, do_sort, descriptor):
+        ports = {}
+        for desc in reversed(self.get_module_hierarchy(descriptor)):
+            ports.update(self.module_ports('output', desc))
+        all_ports = ports.values()
+        if do_sort:
+            all_ports.sort(key=lambda x: (x.sort_key, x.id))
+        return all_ports        
+
+    def module_source_ports(self, do_sort, identifier, module_name, 
+                            namespace=None, version=None):
+        descriptor = self.get_descriptor_by_name(identifier, module_name, 
+                                                 namespace, version)
+        return self.module_source_ports_from_descriptor(do_sort, descriptor)
+
+    def module_destination_ports_from_descriptor(self, do_sort, descriptor):
+        ports = {}
+        for desc in reversed(self.get_module_hierarchy(descriptor)):
+            ports.update(self.module_ports('input', desc))
+        all_ports = ports.values()
+        if do_sort:
+            all_ports.sort(key=lambda x: (x.sort_key, x.id))
+        return all_ports
+        
+    def module_destination_ports(self, do_sort, identifier, module_name,
+                                 namespace=None, version=None):
+        descriptor = self.get_descriptor_by_name(identifier, module_name, 
+                                                 namespace, version)
+        return self.module_destination_ports_from_descriptor(do_sort,
+                                                             descriptor)
+
+    ##########################################################################
+    # Legacy
+
+    def get_descriptor_from_name_only(self, name):
+        """get_descriptor_from_name_only(name) -> descriptor
+
+        This tries to return a descriptor from a name without a
+        package. The call should only be used for converting from
+        legacy vistrails to new ones. For one, it is slow on misses. 
+
+        """
+        matches = []
+        for pkg in self.package_list:
+            matches.extend((pkg, key) for key in pkg.descriptors.iterkeys()
+                           if key[0] == name)
+#         matches = [[(pkg, desc) for desc in pkg.descriptors.iterkeys()
+#                     if desc[0] == name] for pkg in self.package_list]
+
+#         matches = [x for x in
+#                    self.descriptors.iterkeys()
+#                    if x[1] == name]
+        if len(matches) == 0:
+            raise MissingModule("<unknown package>", name, None)
+        if len(matches) > 1:
+            matches_str = [(m[0].identifier, m[1][0], m[1][1],
+                            m[0].version) for m in matches]
+            raise AmbiguousResolution(name, None, matches_str)
+        (pkg, key) = matches[0]
+        desc = pkg.descriptors[key]
+        result = self.get_descriptor_by_name(pkg.identifier, desc.name, 
+                                             desc.namespace, pkg.version, 
+                                             desc.version)
+        return result
+
+    ##########################################################################
+
+    def module_signature(self, pipeline, module):
+        """Returns signature of a given core.vistrail.Module in the
+        given core.vistrail.Pipeline, possibly using user-defined
+        hasher.
+        """
+        chm = self._constant_hasher_map
+        descriptor = self.get_descriptor_by_name(module.package,
+                                                 module.name,
+                                                 module.namespace)
+        if not descriptor:
+            return vistrails.core.cache.hasher.Hasher.module_signature(module, chm)
+        c = descriptor.hasher_callable()
+        if c:
+            return c(pipeline, module, chm)
+        else:
+            return vistrails.core.cache.hasher.Hasher.module_signature(module, chm)
+
+    def get_module_color(self, identifier, name, namespace=None):
+        return self.get_descriptor_by_name(identifier, name, namespace).module_color()
+
+    def get_module_fringe(self, identifier, name, namespace=None):
+        return self.get_descriptor_by_name(identifier, name, namespace).module_fringe()
+
+    def update_registry(self, base_descriptor, module, identifier, name, 
+                        namespace, package_version=None, version=None):
+        if namespace is not None and not namespace.strip():
+            namespace = None
+
+        # add to package list, creating new package if necessary
+        if identifier not in self.packages:
+            if self._current_package.identifier == identifier:
+                package = self._current_package
+            else:
+                package_id = self.idScope.getNewId(Package.vtType)
+                package = Package(id=package_id,
+                                  codepath="",
+                                  load_configuration=False,
+                                  name="",
+                                  identifier=identifier,
+                                  version=package_version,
+                                  )
+            self.add_package(package)
+        else:
+            package = self.package_versions[(identifier, package_version)]
+
+        # create descriptor
+        descriptor_id = self.idScope.getNewId(ModuleDescriptor.vtType)
+        descriptor = ModuleDescriptor(id=descriptor_id,
+                                      module=module,
+                                      package=identifier,
+                                      base_descriptor=base_descriptor,
+                                      name=name,
+                                      namespace=namespace,
+                                      package_version=package_version,
+                                      version=version
+                                      )
+        self.add_descriptor(descriptor, package)
+
+        # invalidate the map of converters
+        if issubclass(module,
+                vistrails.core.modules.vistrails_module.Converter):
+            self._conversions = dict()
+            self._converters.add(descriptor)
+
+        if module is not None:
+            self._module_key_map[module] = (identifier, name, namespace,
+                                            package_version, version)
+        return descriptor
+
+    def auto_add_ports(self, module):
+        """auto_add_module(module or (module, kwargs)): add
+        input/output ports to registry. Don't call this directly - it is
+        meant to be used by the packagemanager, when inspecting the package
+        contents."""
+        for (port_key, adder_f) in [('_input_ports', self.add_input_port),
+                                    ('_output_ports', self.add_output_port)]:
+            if port_key in module.__dict__:
+                for port_info in module.__dict__[port_key]:
+                    added = False
+                    if isinstance(port_info, PortSpec):
+                        # force port type to match list it occurs in
+                        # we just need "input" or "output"
+                        port_info.type = port_key[1:-6]
+                        descriptor = self.get_descriptor(module)
+                        self.add_port_spec(descriptor, port_info)
+                        added = True
+                    elif len(port_info) >= 2:
+                        port_name, port_sig = port_info[:2]
+                        if len(port_info) > 2 and \
+                                isinstance(port_info[2], dict):
+                            kwargs = port_info[2]
+                            adder_f(module, port_name, port_sig, **kwargs)
+                            added = True
+                        else:
+                            args = port_info[2:]
+                            adder_f(module, port_name, port_sig, *args)
+                            added = True
+                        
+                    if not added:
+                        raise TypeError("Expected (port_name, port_signature, "
+                                        "kwargs_dict) or (port_name, "
+                                        "port_signature, *args)")
+
+    def auto_add_module(self, module):
+        """auto_add_module(module or (module, kwargs)): add module
+        to registry. Don't call this directly - it is
+        meant to be used by the packagemanager, when inspecting the package
+        contents."""
+        if isinstance(module, type):
+            return self.add_module(module)
+        elif (isinstance(module, tuple) and
+              len(module) == 2 and
+              isinstance(module[0], type) and
+              isinstance(module[1], dict)):
+            descriptor = self.add_module(module[0], **module[1])
+            return descriptor
+        else:
+            raise TypeError("Expected module or (module, kwargs)")
+
+    def add_module(self, module, **kwargs):
+        """add_module(module: class, **kwargs) -> Tree
+
+        kwargs:
+          name=None,
+          configureWidgetType=None,
+          signatureCallable=None,
+          moduleColor=None,
+          moduleFringe=None,
+          moduleLeftFringe=None,
+          moduleRightFringe=None,
+          abstract=None,
+          package=None,
+          namespace=None,
+          version=None,
+          package_version=None,
+          hide_namespace=False,
+          hide_descriptor=False,
+          is_root=False,
+          ghost_package=None,
+          ghost_package_version=None,
+          ghost_namespace=None,
+
+        Registers a new module with VisTrails. Receives the class
+        itself and an optional name that will be the name of the
+        module (if not given, uses module.__name__).  This module will
+        be available for use in pipelines.
+
+        If moduleColor is not None, then registry stores it so that
+        the gui can use it correctly. moduleColor must be a tuple of
+        three floats between 0 and 1.
+
+        if moduleFringe is not None, then registry stores it so that
+        the gui can use it correctly. moduleFringe must be a list of
+        pairs of floating points.  The first point must be (0.0, 0.0),
+        and the last must be (0.0, 1.0). This will be used to generate
+        custom lateral fringes for module boxes. It must be the case
+        that all x values must be positive, and all y values must be
+        between 0.0 and 1.0. Alternatively, the user can set
+        moduleLeftFringe and moduleRightFringe to set two different
+        fringes.
+
+        if package is not None, then we override the current package
+        to be the given one. This is only intended to be used with
+        local per-module module registries (in other words: if you
+        don't know what a local per-module registry is, you can ignore
+        this, and never use the 'package' option).        
+
+        If namespace is not None, then we associate a namespace with
+        the module. A namespace is essentially appended to the package
+        identifier so that multiple modules inside the same package
+        can share the same name.
+
+        If signatureCallable is not None, then the cache uses this
+        callable as the function to generate the signature for the
+        module in the cache. The function should take three
+        parameters: the pipeline (of type core.vistrail.Pipeline), the
+        module (of type core.vistrail.Module), and a dict that stores
+        parameter hashers. This dict is supposed to be passed to
+        core/cache/hasher.py:Hasher, in case that needs to be called.
+
+        If constantSignatureCallable is not None, then the cache uses
+        this callable as the funciton to generate the signature for
+        the given constant.  If this is not None, then the added
+        module must be a subclass of Constant.
+
+        If hide_namespace is True, the ModulePalette will not display
+        the namespace for that module.  If hide_descriptor is True,
+        the ModulePalette will not display that module in its list
+        (similar to abstract).
+
+        If is_root is True, the added module will become the root
+        module.  Note that this is only possible for the first module
+        added.
+        
+        If ghost_package is not None, then the 'ghost_identifier'
+        'ghost_identifier' is set on the descriptor, which will cause
+        the module to be displayed under that package in the module
+        palette, rather than the package specified by the
+        'identifier' attribute of the descriptor.
+        
+        If ghost_package_version is not None, then the attribute
+        'ghost_package_version' is set on the descriptor.  Currently
+        this value is unused, but eventually if multiple packages
+        with the same identifier but different package versions
+        are loaded simultaneously, this will allow overriding of
+        the package_version to associate with in the module palette.
+
+        If ghost_namespace is not None, the descriptor will be
+        displayed under the specified namespace instead of the
+        'namespace' attribute of the descriptor.
+
+        Notice: in the future, more named parameters might be added to
+        this method, and the order is not specified. Always call
+        add_module with named parameters.
+
+        """
+        # Setup named arguments. We don't use named parameters so
+        # that positional parameter calls fail earlier
+        def fetch(name, default):
+            r = kwargs.get(name, default)
+            try:
+                del kwargs[name]
+            except KeyError:
+                pass
+            return r
+        name = fetch('name', module.__name__)
+        configureWidgetType = fetch('configureWidgetType', None)
+        signatureCallable = fetch('signatureCallable', None)
+        constantSignatureCallable = fetch('constantSignatureCallable', None)
+        moduleColor = fetch('moduleColor', None)
+        moduleFringe = fetch('moduleFringe', None)
+        moduleLeftFringe = fetch('moduleLeftFringe', None) 
+        moduleRightFringe = fetch('moduleRightFringe', None)
+        is_abstract = fetch('abstract', False)
+        identifier = fetch('package', self._current_package.identifier)
+        namespace = fetch('namespace', None)
+        version = fetch('version', None)
+        package_version = fetch('package_version', 
+                                self._current_package.version)
+        hide_namespace = fetch('hide_namespace', False)
+        hide_descriptor = fetch('hide_descriptor', False)
+        is_root = fetch('is_root', False)
+        ghost_identifier = fetch('ghost_package', None)
+        ghost_package_version = fetch('ghost_package_version', None)
+        ghost_namespace = fetch('ghost_namespace', None)
+
+        if len(kwargs) > 0:
+            raise VistrailsInternalError(
+                'Wrong parameters passed to addModule: %s' % kwargs)
+        
+        package = self.package_versions[(identifier, package_version)]
+        desc_key = (name, namespace, version)
+        if desc_key in package.descriptor_versions:
+            raise ModuleAlreadyExists(identifier, name)
+
+        # We allow multiple inheritance as long as only one of the superclasses
+        # is a subclass of Module.
+        if is_root:
+            base_descriptor = None
+        else:
+            candidates = self.get_subclass_candidates(module)
+            if len(candidates) != 1:
+                raise InvalidModuleClass(module)
+            baseClass = candidates[0]
+            if not self._module_key_map.has_key(baseClass) :
+                raise MissingBaseClass(baseClass)
+            base_descriptor = self.get_descriptor(baseClass)
+
+        if module in self._module_key_map:
+            # This is really obsolete as having two descriptors
+            # pointing to the same module isn't a big deal except to
+            # get_descriptor which shouldn't be used often
+            if identifier != 'local.abstractions':
+                raise DuplicateModule(self.get_descriptor(module), identifier,
+                                      name, namespace)
+        elif self.has_descriptor_with_name(identifier, name, namespace,
+                                           package_version, version):
+            raise DuplicateIdentifier(identifier, name, namespace,
+                                      package_version, version)
+        descriptor = self.update_registry(base_descriptor, module, identifier, 
+                                          name, namespace, package_version,
+                                          version)
+        if is_root:
+            self.root_descriptor = descriptor
+
+        descriptor.set_module_abstract(is_abstract)
+        descriptor.set_configuration_widget(configureWidgetType)
+        descriptor.is_hidden = hide_descriptor
+        descriptor.namespace_hidden = hide_namespace
+
+        if signatureCallable:
+            descriptor.set_hasher_callable(signatureCallable)
+
+        if constantSignatureCallable:
+            try:
+                basic_pkg = get_vistrails_basic_pkg_id()
+                c = self.get_descriptor_by_name(basic_pkg, 'Constant').module
+            except ModuleRegistryException:
+                msg = "Constant not found - can't set constantSignatureCallable"
+                raise VistrailsInternalError(msg)
+            if not issubclass(module, c):
+                raise TypeError("To set constantSignatureCallable, module " +
+                                "must be a subclass of Constant")
+            # FIXME, currently only allow one per hash, no versioning
+            hash_key = (identifier, name, namespace)
+            self._constant_hasher_map[hash_key] = constantSignatureCallable
+        descriptor.set_module_color(moduleColor)
+
+        if moduleFringe:
+            _check_fringe(moduleFringe)
+            leftFringe = list(reversed([(-x, 1.0-y) for (x, y) in moduleFringe]))
+            descriptor.set_module_fringe(leftFringe, moduleFringe)
+        elif moduleLeftFringe and moduleRightFringe:
+            _check_fringe(moduleLeftFringe)
+            _check_fringe(moduleRightFringe)
+            descriptor.set_module_fringe(moduleLeftFringe, moduleRightFringe)
+        
+        if ghost_identifier:
+            descriptor.ghost_identifier = ghost_identifier
+        if ghost_package_version:
+            descriptor.ghost_package_version = ghost_package_version
+        if ghost_namespace:
+            descriptor.ghost_namespace = ghost_namespace
+                 
+        self.signals.emit_new_module(descriptor)
+        if self.is_abstraction(descriptor):
+            self.signals.emit_new_abstraction(descriptor)
+        return descriptor
+
+    def auto_add_subworkflow(self, subworkflow):
+        if isinstance(subworkflow, str):
+            return self.add_subworkflow(subworkflow)
+        elif (isinstance(subworkflow, tuple) and
+              len(subworkflow) == 2 and
+              isinstance(subworkflow[0], str) and
+              isinstance(subworkflow[1], dict)):
+            descriptor = self.add_subworkflow(subworkflow[0], **subworkflow[1])
+            return descriptor
+        else:
+            raise TypeError("Expected filename or (filename, kwargs)")
+
+    def add_subworkflow(self, vt_fname, **kwargs):
+        from vistrails.core.modules.sub_module import new_abstraction, read_vistrail, \
+            get_next_abs_annotation_key
+
+        # vt_fname is relative to the package path
+        if 'package' in kwargs:
+            identifier = kwargs['package']
+        else:
+            identifier = self._current_package.identifier
+        if 'package_version' in kwargs:
+            package_version = kwargs['package_version']
+        else:
+            package_version = self._current_package.version
+        if 'version' in kwargs:
+            version = kwargs['version']
+        else:
+            version = -1L
+        if 'name' in kwargs:
+            name = kwargs['name']
+        else:
+            name = _parse_abstraction_name(vt_fname)
+            kwargs['name'] = name
+ 
+        package = self.package_versions[(identifier, package_version)]
+        if not os.path.isabs(vt_fname):
+            vt_fname = os.path.join(package.package_dir, vt_fname)
+        else:
+            debug.warning("Using absolute path for subworkflow: '%s'" % \
+                vt_fname)
+        
+        vistrail = read_vistrail(vt_fname)
+        namespace = kwargs.get('namespace', '')
+        
+        # create module from workflow
+        module = None
+        is_upgraded_abstraction = False
+        try:
+            module = new_abstraction(name, vistrail, vt_fname, version)
+        except InvalidPipeline, e:
+            # This import MUST be delayed until this point or it will fail
+            import vistrails.core.vistrail.controller 
+            from vistrails.core.db.io import save_vistrail_to_xml
+            from vistrails.core.modules.abstraction import identifier as \
+                abstraction_pkg, version as abstraction_ver
+            # Use a "dummy" controller to handle the upgrade
+            controller = vistrails.core.vistrail.controller.VistrailController(vistrail)
+            if version == -1L:
+                version = vistrail.get_latest_version()
+            (new_version, new_pipeline) = \
+                controller.handle_invalid_pipeline(e, long(version), vistrail, 
+                                                   False, True)
+            del controller
+            vistrail.set_annotation('__abstraction_descriptor_info__', 
+                                    (identifier, name, namespace, 
+                                     package_version, str(version)))
+            vt_save_dir = tempfile.mkdtemp(prefix='vt_upgrade_abs')
+            vt_fname = os.path.join(vt_save_dir, os.path.basename(vt_fname))
+            
+            
+            # need to create new namespace for upgraded version
+            new_namespace = str(uuid.uuid1())
+            annotation_key = get_next_abs_annotation_key(vistrail)
+            vistrail.set_annotation(annotation_key, new_namespace)
+
+            # FIXME: Should delete this upgrade file when vistrails is exited
+            save_vistrail_to_xml(vistrail, vt_fname) 
+            module = new_abstraction(name, vistrail, vt_fname, new_version, 
+                                     new_pipeline)
+            # need to set identifier to local.abstractions and its version
+            kwargs['package'] = abstraction_pkg
+            kwargs['package_version'] = abstraction_ver
+            # only want to change the namespace on the new version
+            # (the one being added to local.abstractions)
+            kwargs['namespace'] = new_namespace
+
+            # Set ghost attributes so module palette shows it in
+            # package instead of 'My Subworkflows'
+            kwargs['ghost_package'] = identifier
+            kwargs['ghost_package_version'] = package_version
+            kwargs['ghost_namespace'] = namespace
+            is_upgraded_abstraction = True
+                                    
+        module.internal_version = str(module.internal_version)
+        kwargs['version'] = module.internal_version
+        descriptor = None
+        if kwargs:
+            descriptor = self.add_module(module, **kwargs)
+        else:
+            descriptor = self.add_module(module)
+        if is_upgraded_abstraction:
+            descriptor_info = (identifier, name, namespace,  
+                               package_version, str(version))
+            # print 'adding to upgrades:', descriptor_info
+            # print '  ', descriptor.package, descriptor.name, descriptor.namespace, descriptor.version, descriptor.package_version
+            if identifier != abstraction_pkg:
+                info_exc = ModuleRegistryException(*descriptor_info)
+                debug.critical("Module %s in package %s is out-of-date.  "
+                               "Please check with the package developer for "
+                               "a new version." % (info_exc._module_name,
+                                                   info_exc._package_name))
+            package.add_abs_upgrade(descriptor, name, namespace, str(version))
+            self.auto_add_ports(descriptor.module)
+        return descriptor
+
+    def has_input_port(self, module, portName):
+        descriptor = self.get_descriptor(module)
+        # return descriptor.input_ports.has_key(portName)
+        return (portName, 'input') in descriptor.port_specs
+
+    def has_output_port(self, module, portName):
+        descriptor = self.get_descriptor(module)
+        # return descriptor.output_ports.has_key(portName)
+        return (portName, 'output') in descriptor.port_specs
+
+    def create_port_spec(self, name, type, signature=None, sigstring=None,
+                         optional=False, sort_key=-1, labels=None, 
+                         defaults=None, values=None, entry_types=None,
+                         docstring=None, shape=None, 
+                         min_conns=0, max_conns=-1):
+        if signature is None and sigstring is None:
+            raise VistrailsInternalError("create_port_spec: one of signature "
+                                         "and sigstring must be specified")
+        spec_id = self.idScope.getNewId(PortSpec.vtType)
+        spec = PortSpec(id=spec_id,
+                        name=name,
+                        type=type,
+                        signature=signature,
+                        sigstring=sigstring,
+                        optional=optional,
+                        sort_key=sort_key,
+                        labels=labels,
+                        defaults=defaults,
+                        values=values,
+                        entry_types=entry_types,
+                        docstring=docstring,
+                        shape=shape,
+                        min_conns=min_conns,
+                        max_conns=max_conns)
+
+        # don't know how many port spec items are created until after...
+        for psi in spec.port_spec_items:
+            psi.id = self.idScope.getNewId(PortSpecItem.vtType)
+        return spec
+
+    def add_port_spec(self, descriptor, spec):
+        # check if the spec is valid
+        try:
+            spec.descriptors()
+        except ModuleRegistryException, e:
+            raise InvalidPortSpec(descriptor, spec.name, spec.type, e)
+
+        descriptor.add_port_spec(spec)
+        if spec.type == 'input':
+            self.signals.emit_new_input_port(descriptor.identifier,
+                                             descriptor.name, spec.name, spec)
+        elif spec.type == 'output':
+            self.signals.emit_new_output_port(descriptor.identifier,
+                                              descriptor.name, spec.name, spec)
+
+    def get_port_spec_from_descriptor(self, desc, port_name, port_type):
+        for d in self.get_module_hierarchy(desc):
+            if d.has_port_spec(port_name, port_type):
+                return d.get_port_spec(port_name, port_type)
+
+        # if we don't find it, raise MissingPort exception
+        raise MissingPort(desc, port_name, port_type)
+
+    def get_port_spec(self, package, module_name, namespace, 
+                      port_name, port_type):
+        desc = self.get_descriptor_by_name(package, module_name, namespace)
+        return self.get_port_spec_from_descriptor(desc, port_name, 
+                                                  port_type)
+
+    def has_port_spec_from_descriptor(self, desc, port_name, port_type):
+        for d in self.get_module_hierarchy(desc):
+            if d.has_port_spec(port_name, port_type):
+                return True
+        return False
+
+    def has_port_spec(self, package, module_name, namespace,
+                      port_name, port_type):
+        desc = self.get_descriptor_by_name(package, module_name, namespace)
+        return self.has_port_spec_from_descriptor(desc, port_name, 
+                                                  port_type)
+
+    def add_port(self, descriptor, port_name, port_type, port_sig=None, 
+                 port_sigstring=None, optional=False, sort_key=-1,
+                 labels=None, defaults=None, values=None, entry_types=None, 
+                 docstring=None, shape=None, min_conns=0, max_conns=-1):
+        spec = self.create_port_spec(port_name, port_type, port_sig,
+                                     port_sigstring, optional, sort_key,
+                                     labels, defaults, values, entry_types,
+                                     docstring, shape,
+                                     min_conns, max_conns)
+
+        self.add_port_spec(descriptor, spec)
+
+    def add_input_port(self, module, portName, portSignature, optional=False, 
+                       sort_key=-1, labels=None, defaults=None, values=None,
+                       entry_types=None, docstring=None, shape=None, 
+                       min_conns=0, max_conns=-1):
+        """add_input_port(module: class,
+                          portName: string,
+                          portSignature: string,
+                          optional: bool,
+                          sort_key: int,
+                          labels: tuple(string),
+                          defaults: tuple(string),
+                          values: list(list(string)),
+                          entry_types: list(string),
+                          docstring: string,
+                          shape: tuple,
+                          min_conns: int,
+                          max_conns: int) -> None
+
+        Registers a new input port with VisTrails. Receives the module
+        that will now have a certain port, a string representing the
+        name, and a signature of the port, described in
+        doc/module_registry.txt. Optionally, it receives whether the
+        input port is optional."""
+        descriptor = self.get_descriptor(module)
+        if isinstance(portSignature, basestring):
+            self.add_port(descriptor, portName, 'input', None, portSignature, 
+                          optional, sort_key, labels, defaults, values,
+                          entry_types, docstring, shape, min_conns, max_conns)
+        else:
+            self.add_port(descriptor, portName, 'input', portSignature, None, 
+                          optional, sort_key, labels, defaults, values,
+                          entry_types, docstring, shape, min_conns, max_conns)
+
+
+    def add_output_port(self, module, portName, portSignature, optional=False, 
+                        sort_key=-1, docstring=None, shape=None, 
+                        min_conns=0, max_conns=-1):
+        """add_output_port(module: class,
+                           portName: string,
+                           portSignature: string,
+                           optional: bool,
+                           sort_key: int,
+                           docstring: string,
+                           shape: tuple,
+                           min_conns: int,
+                           max_conns: int) -> None
+
+        Registers a new output port with VisTrails. Receives the
+        module that will now have a certain port, a string
+        representing the name, and a signature of the port, described
+        in doc/module_registry.txt. Optionally, it receives whether
+        the output port is optional."""
+        descriptor = self.get_descriptor(module)
+        if isinstance(portSignature, basestring):
+            self.add_port(descriptor, portName, 'output', None, portSignature, 
+                          optional, sort_key, None, None, None, None, 
+                          docstring, shape, min_conns, max_conns)
+        else:
+            self.add_port(descriptor, portName, 'output', portSignature, None, 
+                          optional, sort_key, None, None, None, None, 
+                          docstring, shape, min_conns, max_conns)
+
+    def create_package(self, codepath, load_configuration=True):
+        package_id = self.idScope.getNewId(Package.vtType)
+        package = Package(id=package_id,
+                          codepath=codepath,
+                          load_configuration=load_configuration)
+        return package
+
+    def initialize_package(self, package):
+        if package.initialized():
+            return
+        debug.splashMessage("Initializing " + package.codepath + "...")
+        debug.log("Initializing " + package.codepath)
+        if (package.identifier, package.version) not in self.package_versions:
+            self.add_package(package)
+        self.set_current_package(package)
+        try:
+            package.initialize()
+            # Perform auto-initialization
+            if hasattr(package.module, '_modules'):
+                modules = package.module._modules
+                if isinstance(modules, dict):
+                    module_list = []
+                    for namespace, m_list in modules.iteritems():
+                        for module in m_list:
+                            m_dict = {'namespace': namespace}
+                            if isinstance(module, tuple):
+                                m_dict.update(module[1])
+                                module_list.append((module[0], m_dict))
+                            else:
+                                module_list.append((module, m_dict))
+                else:
+                    module_list = modules
+                modules = _toposort_modules(module_list)
+                # We add all modules before adding ports because
+                # modules inside package might use each other as ports
+                for module in modules:
+                    self.auto_add_module(module)
+
+            # allow all modules to auto_add_ports!
+            added_descriptors = set()
+            for descriptor in package.descriptor_list:
+                if hasattr(descriptor, 'module'):
+                    self.auto_add_ports(descriptor.module)
+                    added_descriptors.add(descriptor)
+            # Perform auto-initialization of abstractions
+            if hasattr(package.module, '_subworkflows'):
+                subworkflows = \
+                    _toposort_abstractions(package,
+                                           package.module._subworkflows)
+                for subworkflow in subworkflows:
+                    self.auto_add_subworkflow(subworkflow)
+            for descriptor in package.descriptor_list:
+                if descriptor not in added_descriptors:
+                    if hasattr(descriptor, 'module'):
+                        self.auto_add_ports(descriptor.module)
+                        added_descriptors.add(descriptor)
+        except Exception, e:
+            raise package.InitializationFailed(package, 
+                                               [traceback.format_exc()])
+
+        # The package might have decided to rename itself, let's store that
+        self.set_current_package(None)
+        debug.splashMessage("Initializing " + package.codepath + '... done.')
+        package._initialized = True 
+
+    def delete_module(self, identifier, module_name, namespace=None):
+        """deleteModule(module_name): Removes a module from the registry."""
+        descriptor = self.get_descriptor_by_name(identifier, module_name, 
+                                                 namespace)
+        assert len(descriptor.children) == 0
+
+        # invalidate the map of converters
+        converter_desc = self.get_descriptor(
+                vistrails.core.modules.vistrails_module.Converter)
+        if self.is_descriptor_subclass(descriptor, converter_desc):
+            self._conversions = dict()
+            self._converters.remove(descriptor)
+
+        self.signals.emit_deleted_module(descriptor)
+        if self.is_abstraction(descriptor):
+            self.signals.emit_deleted_abstraction(descriptor)
+        package = self.packages[descriptor.identifier]
+        self.delete_descriptor(descriptor, package)
+        if descriptor.module is not None:
+            del self._module_key_map[descriptor.module]
+
+    def remove_package(self, package):
+        """remove_package(package) -> None:
+        Removes an entire package from the registry.
+
+        """
+        # graph is the class hierarchy graph for this subset
+        graph = Graph()
+        if package.identifier not in self.packages:
+            raise MissingPackage(package.identifier)
+        package = self.packages[package.identifier]
+        for descriptor in package.descriptor_list:
+            graph.add_vertex(descriptor.sigstring)
+        for descriptor in package.descriptor_list:            
+            base_id = descriptor.base_descriptor_id
+            if base_id in package.descriptors_by_id:
+                base_descriptor = \
+                    package.descriptors_by_id[descriptor.base_descriptor_id]
+                graph.add_edge(descriptor.sigstring, base_descriptor.sigstring)
+
+        top_sort = graph.vertices_topological_sort()
+        # set up fast removal of model
+        for sigstring in top_sort:
+            self.delete_module(
+                *vistrails.core.modules.utils.parse_descriptor_string(sigstring))
+        
+        # Remove upgraded package subworkflows from registry
+        for key, version_dict in package._abs_pkg_upgrades.iteritems():
+            for version, descriptor in version_dict.iteritems():
+                self.delete_module(descriptor.identifier, descriptor.name, 
+                                   descriptor.namespace)
+        package._abs_pkg_upgrades.clear()
+        
+        package.unload()
+        self.delete_package(package)
+        self.signals.emit_deleted_package(package)
+
+    def delete_input_port(self, descriptor, port_name):
+        """ Just remove a name input port with all of its specs """
+        descriptor.delete_input_port(port_name)
+
+    def delete_output_port(self, descriptor, port_name):
+        """ Just remove a name output port with all of its specs """
+        descriptor.delete_output_port(port_name)
+
+    def source_ports_from_descriptor(self, descriptor, sorted=True):
+        ports = [p[1] for p in self.module_ports('output', descriptor)]
+        if sorted:
+            ports.sort(key=lambda x: x.name)
+        return ports
+    
+    def destination_ports_from_descriptor(self, descriptor, sorted=True):
+        ports = [p[1] for p in self.module_ports('input', descriptor)]
+        if sorted:
+            ports.sort(key=lambda x: x.name)
+        return ports
+        
+    def all_source_ports(self, descriptor, sorted=True):
+        """Returns source ports for all hierarchy leading to given module"""
+        getter = self.source_ports_from_descriptor
+        return [(desc.name, getter(desc, sorted))
+                for desc in self.get_module_hierarchy(descriptor)]
+
+    def all_destination_ports(self, descriptor, sorted=True):
+        """Returns destination ports for all hierarchy leading to
+        given module"""
+        getter = self.destination_ports_from_descriptor
+        return [(desc.name, getter(desc, sorted))
+                for desc in self.get_module_hierarchy(descriptor)]
+
+    def get_port_from_all_destinations(self, descriptor, name):
+        """Searches for port identified by name in the destination ports
+        for all hierarchy leading to given module """
+        all_ports = self.all_destination_ports(descriptor)
+        for (klass, port_list) in all_ports:
+            for port in port_list:
+                if port.name == name:
+                    return port
+        else:
+            return None
+        
+    def is_method(self, port_spec):
+        basic_pkg = get_vistrails_basic_pkg_id()
+        constant_desc = \
+            self.get_descriptor_by_name(basic_pkg, 'Constant')
+        return port_spec.type == 'input' and \
+            all(self.is_descriptor_subclass(d, constant_desc) 
+                for d in port_spec.descriptors())
+    is_constant = is_method
+
+    def method_ports(self, module_descriptor):
+        """method_ports(module_descriptor: ModuleDescriptor) 
+              -> [PortSpec]}
+
+        Returns a list of port specs that are methods 
+        (spec contains only subclasses of Constant).
+
+        """
+        getter = self.module_destination_ports_from_descriptor
+        return [spec for spec in sorted(getter(False, module_descriptor),
+                                        key=lambda x: x.name)
+                if self.is_method(spec)]
+
+    def port_and_port_spec_match(self, port, port_spec):
+        """port_and_port_spec_match(port: Port | PortSpec, 
+                                    port_spec: PortSpec
+                                    ) -> bool
+        Checks if port is similar to port_spec or not.  These ports must
+        have the same name and type"""
+        if port.type in PortSpec.port_type_map:
+            port_type = port.type
+        elif port.type in PortSpec.port_type_map.inverse:
+            port_type = PortSpec.port_type_map.inverse[port.type]
+        else:
+            raise TypeError('Port type "%s" invalid' % str(port.type))
+        if port_type != port_spec.type:
+            return False
+        if port.name != port_spec.name:
+            return False
+        if port.sigstring == port_spec.sigstring:
+            return True
+        return self.are_specs_matched(port, port_spec)
+
+    def ports_can_connect(self, sourceModulePort, destinationModulePort,
+                          allow_conversion=False, out_converters=None):
+        """ports_can_connect(sourceModulePort,destinationModulePort) ->
+        Boolean returns true if there could exist a connection
+        connecting these two ports."""
+        if sourceModulePort.type == destinationModulePort.type:
+            return False
+        return self.are_specs_matched(sourceModulePort, destinationModulePort,
+                                      allow_conversion=allow_conversion,
+                                      out_converters=out_converters)
+
+    def is_port_sub_type(self, sub, super):
+        """ is_port_sub_type(sub: Port, super: Port) -> bool        
+        Check if port super and sub are similar or not. These ports
+        must have exact name as well as position
+        
+        """
+        if sub.type != super.type:
+            return False
+        if sub.name != super.name:
+            return False
+        return self.are_specs_matched(sub, super)
+
+    def get_converters(self, sub_descs, super_descs):
+        key = (tuple(sub_descs), tuple(super_descs))
+
+        # Get the result from the cache
+        try:
+            return self._conversions[key]
+        except KeyError:
+            pass
+
+        converters = []
+
+        # Compute the result
+        for converter in self._converters:
+            if converter.module is (
+                    vistrails.core.modules.vistrails_module.Converter):
+                continue
+
+            if converter.module.can_convert(sub_descs, super_descs):
+                converters.append(converter)
+
+        # Store in the cache that there was no result
+        self._conversions[key] = converters
+        return converters
+
+    def are_specs_matched(self, sub, super, allow_conversion=False,
+                          out_converters=None):
+        """ are_specs_matched(sub: Port, super: Port) -> bool        
+        Check if specs of sub and super port are matched or not
+        
+        """
+        basic_pkg = get_vistrails_basic_pkg_id()
+        variant_desc = self.get_descriptor_by_name(basic_pkg, 'Variant')
+        # sometimes sub is coming None
+        # I don't know if this is expected, so I will put a test here
+        sub_descs = []
+        if sub:
+            sub_descs = sub.descriptors()
+        if sub_descs is None:
+            return False
+        elif sub_descs == [variant_desc]:
+            return True
+        super_descs = []
+        if super:
+            super_descs = super.descriptors()
+        if super_descs is None:
+            return False
+        elif super_descs == [variant_desc]:
+            return True
+
+        def check_types(sub_descs, super_descs):
+            for (sub_desc, super_desc) in izip(sub_descs, super_descs):
+                if (sub_desc == variant_desc or super_desc == variant_desc):
+                    continue
+                if not self.is_descriptor_subclass(sub_desc, super_desc):
+                    return False
+            return True
+
+        if (len(sub_descs) == len(super_descs) and
+                check_types(sub_descs, super_descs)):
+            return True
+
+        if allow_conversion:
+            converters = self.get_converters(sub_descs, super_descs)
+            if converters:
+                if out_converters is not None:
+                    out_converters.extend(converters)
+                return True
+
+        return False
+
+    def get_module_hierarchy(self, descriptor):
+        """get_module_hierarchy(descriptor) -> [klass].
+        Returns the module hierarchy all the way to Module, excluding
+        any mixins."""
+        if descriptor.module is None:
+            descriptors = [descriptor]
+            base_id = descriptor.base_descriptor_id
+            while base_id >= 0:
+                descriptor = self.descriptors_by_id[base_id]
+                descriptors.append(descriptor)
+                base_id = descriptor.base_descriptor_id
+            return descriptors
+        return [self.get_descriptor(klass)
+                for klass in descriptor.module.mro()
+                if issubclass(klass, vistrails.core.modules.vistrails_module.Module)]
+        
+    def get_input_port_spec(self, module, portName):
+        """ get_input_port_spec(module: Module, portName: str) ->
+        spec-tuple Return the output port of a module given the module
+        and port name.
+
+        FIXME: This should be renamed.
+        
+        """
+        descriptor = module.module_descriptor
+        if module.has_port_spec(portName, 'input'):
+            return module.get_port_spec(portName, 'input')
+        return None
+
+    def get_output_port_spec(self, module, portName):
+        """ get_output_port_spec(module: Module, portName: str) -> spec-tuple
+        Return the output port of a module given the module
+        and port name.
+
+        FIXME: This should be renamed.
+        
+        """
+        descriptor = module.module_descriptor
+        if module.has_port_spec(portName, 'output'):
+            return module.get_port_spec(portName, 'output')
+        return None
+
+    @staticmethod
+    def get_subclass_candidates(module):
+        """get_subclass_candidates(module) -> [class]
+
+        Tries to eliminate irrelevant mixins for the hierarchy. Returns all
+        base classes that subclass from Module."""
+        return [klass
+                for klass in module.__bases__
+                if issubclass(klass, vistrails.core.modules.vistrails_module.Module)]
+
+    def set_current_package(self, package):
+        """ set_current_package(package: Package) -> None        
+        Set the current package for all addModule operations to
+        name. This means that all modules added after this call will
+        be assigned to the specified package.  Set package to None to
+        indicate that VisTrails default package should be used instead.
+
+        Do not call this directly. The package manager will call this
+        with the correct value prior to calling 'initialize' on the
+        package.
+        
+        """
+        if package is None:
+            package = self._default_package
+        self._current_package = package
+
+    def get_module_package(self, identifier, name, namespace):
+        """ get_module_package(identifier, moduleName: str) -> str
+        Return the name of the package where the module is registered.
+        
+        """
+        descriptor = self.get_descriptor_by_name(identifier, name, namespace)
+        return descriptor.module_package()
+
+    def get_configuration_widget(self, identifier, name, namespace):
+        descriptor = self.get_descriptor_by_name(identifier, name, namespace)
+        klass = descriptor.configuration_widget()
+        if isinstance(klass, tuple):
+            (path, klass_name) = klass
+            module = __import__(path, globals(), locals(), [klass_name])
+            klass = getattr(module, klass_name)            
+        return klass
+
+    def is_descriptor_subclass(self, sub, super):
+        """is_descriptor_subclass(sub : ModuleDescriptor, 
+                                  super: ModuleDescriptor) -> bool
+        
+        """
+        # use issubclass for speed if we've loaded the modules
+        if sub.module is not None and super.module is not None:
+            return issubclass(sub.module, super.module)
+        
+        # otherwise, use descriptors themselves
+        if sub == super:
+            return True
+        while sub != self.root_descriptor:
+            sub = sub.base_descriptor
+            if sub == super:
+                return True
+
+        return False
+
+    def find_descriptor_subclass(self, d1, d2):
+        if self.is_descriptor_subclass(d1, d2):
+            return d1
+        elif self.is_descriptor_subclass(d2, d1):
+            return d2
+        return None
+        
+    def find_descriptor_superclass(self, d1, d2):
+        """find_descriptor_superclass(d1: ModuleDescriptor,
+                                      d2: ModuleDescriptor) -> ModuleDescriptor
+        Finds the lowest common superclass descriptor for d1 and d2
+
+        """        
+        if self.is_descriptor_subclass(d1, d2):
+            return d2
+        elif self.is_descriptor_subclass(d2, d1):
+            return d1
+
+        d1_list = [d1]
+        while d1 != self.root_descriptor:
+            d1 = d1.base_descriptor
+            d1_list.append(d1)
+        d1_idx = -1
+        while self.is_descriptor_subclass(d2, d1_list[d1_idx]):
+            d1_idx -= 1
+        if d1_idx == -1:
+            return None
+        return d1_list[d1_idx+1]
+
+    def is_abstraction(self, descriptor):
+        basic_pkg = get_vistrails_basic_pkg_id()
+        try:
+            abstraction_desc = self.get_descriptor_by_name(basic_pkg, 
+                                                       'SubWorkflow')
+        except MissingModule:
+            # No abstractions can be loaded before the basic
+            # SubWorkflow descriptor is initialized
+            return False
+        return abstraction_desc != descriptor and \
+            self.is_descriptor_subclass(descriptor, abstraction_desc)
+            
+    def show_module(self, descriptor):
+        self.signals.emit_show_module(descriptor)
+    def hide_module(self, descriptor):
+        self.signals.emit_hide_module(descriptor)
+    def update_module(self, old_descriptor, new_descriptor):
+        self.signals.emit_module_updated(old_descriptor, new_descriptor)
+
+    def expand_port_spec_string(self, p_string, cur_package=None, 
+                                old_style=False):
+        return vistrails.core.modules.utils.expand_port_spec_string(p_string, cur_package,
+                                                          old_style)
+
+###############################################################################
+
+# registry                 = ModuleRegistry()
+# add_module               = registry.add_module
+# add_input_port           = registry.add_input_port
+# has_input_port           = registry.has_input_port
+# add_output_port          = registry.add_output_port
+# set_current_package      = registry.set_current_package
+# get_descriptor_by_name   = registry.get_descriptor_by_name
+# get_module_by_name       = registry.get_module_by_name
+# get_descriptor           = registry.get_descriptor
+
+def get_module_registry():
+    global registry
+    if not registry:
+        raise VistrailsInternalError("Registry not constructed yet.")
+    return registry
+
+def module_registry_loaded():
+    global registry
+    return registry is not None
+
+##############################################################################
+
+
+class TestModuleRegistry(unittest.TestCase):
+
+    def test_portspec_construction(self):
+        from vistrails.core.modules.basic_modules import Float, Integer
+        t1 = PortSpec(signature=Float)
+        t2 = PortSpec(signature=[Float])
+        self.assertEquals(t1, t2)
+
+        t1 = PortSpec(signature=[Float, Integer])
+        t2 = PortSpec(signature=[Integer, Float])
+        self.assertNotEquals(t1, t2)
diff --git a/vistrails/core/modules/module_utils.py b/vistrails/core/modules/module_utils.py
new file mode 100644
index 0000000..893a0da
--- /dev/null
+++ b/vistrails/core/modules/module_utils.py
@@ -0,0 +1,167 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Utilities for user-defined Modules
+import os
+import tempfile
+from vistrails.core.modules import basic_modules
+from vistrails.core.system import link_or_copy
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core import debug
+
+import unittest
+
+################################################################################
+
+class FilePool(object):
+
+    """FilePool provides a convenient interface for Module developers to
+use temporary files. """
+    
+    def __init__(self):
+        d = {'prefix':'vt_tmp'}
+        if get_vistrails_configuration().check('temporaryDirectory'):
+            dir = get_vistrails_configuration().temporaryDirectory
+            if os.path.exists(dir):
+                d['dir'] = dir
+            else:
+                debug.critical("Temporary directory does not exist: %s" % dir)
+
+        self.directory = tempfile.mkdtemp(**d)
+        self.files = {}
+        
+    def cleanup(self):
+        """cleanup() -> None
+
+Cleans up the file pool, by removing all temporary files
+and the directory they existed in. Module developers should never
+call this directly."""
+        if not os.path.isdir(self.directory):
+            # cleanup has already happened
+            return
+        try:
+            for root, dirs, files in os.walk(self.directory, topdown=False):
+                for name in files:
+                    os.remove(os.path.join(root, name))
+                for name in dirs:
+                    os.rmdir(os.path.join(root, name))
+            os.rmdir(self.directory)
+        except OSError, e:
+            raise VistrailsInternalError("Can't remove %s: %s" %
+                                         (self.directory,
+                                          str(e)))
+
+    def create_file(self, suffix = '', prefix = 'vt_tmp'):
+        """create_file(suffix='', prefix='vt_tmp') -> File.
+
+Returns a File module representing a writable file for use in modules. To
+avoid race conditions, this file will already exist in the file system."""
+        (fd, name) = tempfile.mkstemp(suffix=suffix,
+                                      prefix=prefix,
+                                      dir=self.directory)
+        os.close(fd)
+        result = basic_modules.File()
+        result.name = name
+        result.upToDate = True
+        self.files[name] = result
+        return result
+
+    def create_directory(self, suffix = '', prefix = 'vt_tmp'):
+        """create_directory(suffix='', prefix='vt_tmp') -> Directory.
+
+Returns a Directory module representing a writable directory for use in modules. To
+avoid race conditions, this directory will already exist in the file system."""
+        name = tempfile.mkdtemp(suffix=suffix,
+                                      prefix=prefix,
+                                      dir=self.directory)
+        result = basic_modules.Directory()
+        result.name = name
+        result.upToDate = True
+        self.files[name] = result
+        return result
+
+    def guess_suffix(self, file_name):
+        """guess_suffix(file_name) -> String.
+        Tries to guess the suffix of the given filename.
+        
+        """
+        return os.path.splitext(file_name)[1]
+
+    def make_local_copy(self, src):
+        """make_local_copy(src) -> File
+
+Returns a file in the filePool that's either a link or a copy of the
+given file path. This ensures the file's longevity when
+necessary. Since it might use a hardlink for speed, modules should
+only use this method if the file is not going to be changed in the
+future."""
+        (fd, name) = tempfile.mkstemp(suffix=self.guess_suffix(src),
+                                      dir=self.directory)
+        os.close(fd)
+        # FIXME: Watch out for race conditions
+        os.unlink(name)
+        link_or_copy(src, name)
+        result = basic_modules.File()
+        result.name = name
+        result.upToDate = True
+        self.files[name] = result
+        return result
+        
+################################################################################
+
+
+class TestFilePool(unittest.TestCase):
+
+    def test_guess_suffix(self):
+        """Tests FilePool.guess_suffix"""
+        x = FilePool()
+        self.assertEquals(x.guess_suffix('asd.foo'), '.foo')
+        self.assertEquals(x.guess_suffix('bar'), '')
+        self.assertEquals(x.guess_suffix('./lalala'), '')
+        self.assertEquals(x.guess_suffix('./lalala.bar'), '.bar')
+        self.assertEquals(x.guess_suffix('user.foo/lalala'), '')
+        x.cleanup()
+        del x
+
+    def test_double_cleanup(self):
+        x = FilePool()
+        x.cleanup()
+        try:
+            x.cleanup()
+        except VistrailsInternalError:
+            self.fail("cleanup failed")
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/modules/package.py b/vistrails/core/modules/package.py
new file mode 100644
index 0000000..0bb64f3
--- /dev/null
+++ b/vistrails/core/modules/package.py
@@ -0,0 +1,765 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import inspect
+from itertools import chain
+import os
+import re
+import sys
+import traceback
+import xml.dom
+
+from vistrails.core import debug
+from vistrails.core import get_vistrails_application
+from vistrails.core.modules.module_descriptor import ModuleDescriptor
+from vistrails.core.utils import versions_increasing, VistrailsInternalError
+from vistrails.core.utils.uxml import (named_elements, enter_named_element)
+
+from vistrails.db.domain import DBPackage
+
+##############################################################################
+
+class Package(DBPackage):
+    Base, User, Other = 0, 1, 2
+
+    FIX_PACKAGE_NAMES = ["api", "core", "db", "gui", "packages", "tests"]
+
+    class InitializationFailed(Exception):
+        def __init__(self, package, tracebacks):
+            self.package = package
+            self.tracebacks = tracebacks
+        def __str__(self):
+            try:
+                name = self.package.name
+                if name is None:
+                    name = 'codepath <%s>' % self.package.codepath
+            except AttributeError:
+                name = 'codepath <%s>' % self.package.codepath
+            return ("Package '%s' failed to initialize because of the "
+                    "following exceptions:\n%s" % \
+                        (name, "\n".join(self.tracebacks)))
+
+    class LoadFailed(Exception):
+        def __init__(self, package, exception, traceback):
+            self.package = package
+            self.exception = exception
+            self.traceback = traceback
+        def __str__(self):
+            return ("Package '%s' failed to load, raising '%s: %s'. Traceback:\n%s" %
+                    (self.package.codepath,
+                     self.exception.__class__.__name__,
+                     self.exception,
+                     self.traceback))
+
+    class MissingDependency(Exception):
+        def __init__(self, package, dependencies):
+            self.package = package
+            self.dependencies = dependencies
+        def __str__(self):
+            def dep_string(dep):
+                retval = dep[0]
+                if dep[1] is not None:
+                    retval += ': requires version >= %s' % dep[1]
+                    if dep[2] is not None:
+                        retval += ' and <= %s' % dep[2]
+                elif dep[2] is not None:
+                    retval += ': requires version <= %s' % dep[2]
+                return retval
+
+            return ("Package '%s' has unmet dependencies:\n  %s" %
+                    (self.package.name,
+                     '\n  '.join([dep_string(d) for d in self.dependencies])))
+
+    def __init__(self, *args, **kwargs):
+        if 'load_configuration' in kwargs:
+            arg = kwargs['load_configuration']
+            if not isinstance(arg, (int, long)):
+                if isinstance(arg, bool):
+                    if arg:
+                        kwargs['load_configuration'] = 1
+                    else:
+                        kwargs['load_configuration'] = 0
+                    # kwargs['load_configuration'] = 1 if arg else 0
+                else:
+                    raise VistrailsInternalError("Cannot convert "
+                                                 "load_configuration")
+
+        DBPackage.__init__(self, *args, **kwargs)
+        self.set_defaults()
+        self._force_no_unload = None
+        self._force_unload = None
+        self._force_sys_unload = None
+        self._imports_are_good = True
+    
+    def __copy__(self):
+        Package.do_copy(self)
+
+    def set_defaults(self, other=None):
+        self.setup_indices()
+        if other is None:
+            self._module = None
+            self._init_module = None
+            self._loaded = False
+            self._initialized = False
+            self._abs_pkg_upgrades = {}
+            self.package_dir = None
+            self.prefix = None
+            self.py_dependencies = set()
+            self.old_identifiers = []
+        else:
+            self._module = other._module
+            self._init_module = other._init_module
+            self._loaded = other._loaded
+            self._initialized = other._initialized
+            self._abs_pkg_upgrades = copy.copy(other._abs_pkg_upgrades)
+            self.package_dir = other.package_dir
+            self.prefix = other.prefix
+            self.py_dependencies = copy.copy(other.py_dependencies)
+            self.old_identifiers = [i for i in self.old_identifiers]
+        # FIXME decide whether we want None or ''
+        if self.version is None:
+            self.version = ''
+
+    def setup_indices(self):
+        self.descriptor_versions = self.db_module_descriptors_name_index
+        self.descriptors_by_id = self.db_module_descriptors_id_index
+        self.descriptors = {}
+        for key, desc in self.descriptor_versions.iteritems():
+            key = key[:2]
+            if key in self.descriptors:
+                old_desc = self.descriptors[key]
+                if versions_increasing(old_desc.version, desc.version):
+                    self.descriptors[key] = desc
+            else:
+                self.descriptors[key] = desc
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPackage.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Package
+        cp.set_defaults(self)
+        
+    @staticmethod
+    def convert(_package):
+        if _package.__class__ == Package:
+            return
+        _package.__class__ = Package
+
+        for descriptor in _package.db_module_descriptors:
+            ModuleDescriptor.convert(descriptor)
+        _package.set_defaults()
+
+    ##########################################################################
+    # Properties
+    
+    id = DBPackage.db_id
+    name = DBPackage.db_name
+    identifier = DBPackage.db_identifier
+    description = DBPackage.db_description
+    version = DBPackage.db_version
+    codepath = DBPackage.db_codepath
+    load_configuration = DBPackage.db_load_configuration
+    descriptor_list = DBPackage.db_module_descriptors
+
+    def add_descriptor(self, desc):
+        self.db_add_module_descriptor(desc)
+        key = (desc.name, desc.namespace)
+        if key in self.descriptors:
+            old_desc = self.descriptors[key]
+            if versions_increasing(old_desc.version, desc.version):
+                self.descriptors[key] = desc
+        else:
+            self.descriptors[key] = desc
+        
+    def delete_descriptor(self, desc):
+        self.db_delete_module_descriptor(desc)
+        # FIXME hard to incremental updates here so we'll just recreate
+        # this can be slow
+        self.setup_indices()
+
+    def _get_module(self):
+        return self._module
+    module = property(_get_module)
+
+    def _get_init_module(self):
+        return self._init_module
+    init_module = property(_get_init_module)
+
+    def _get_configuration(self):
+        if hasattr(self._module, 'configuration'):
+            return self._module.configuration
+        else:
+            return None
+    def _set_configuration(self, configuration):
+        if hasattr(self._module, 'configuration'):
+            self._module.configuration = configuration
+        else:
+            raise AttributeError("Can't set configuration on a module "
+                                 "without one")
+    configuration = property(_get_configuration, _set_configuration)
+
+    ##########################################################################
+    # Operators
+
+    def __hash__(self):
+        if self.identifier and self.version:
+            return (type(self), self.identifier, self.version).__hash__()
+        return (type(self), self.codepath).__hash__()
+
+    def __eq__(self, other):
+        return (type(self) == type(other) and 
+                self.identifier == other.identifier and
+                self.version == other.version)
+
+    def __str__(self):
+        return ("Package(id=%s, identifier=%s, version=%s, name=%s, "
+                "codepath=%s") % (self.id, self.identifier,
+                                  self.version, self.name,
+                                  self.codepath)
+
+    ##########################################################################
+    # Methods
+
+    _python_lib_regex = re.compile(r'python[0-9.]+[a-z]?/lib/',
+                                   re.IGNORECASE)
+    _lib_python_regex = re.compile(r'lib/python[0-9.]+[a-z]?/',
+                                   re.IGNORECASE)
+    def import_override(self, orig_import,
+                        name, globals, locals, fromlist, level,
+                        package_importing_directly):
+        def in_package_list(pkg_name, pkg_list):
+            if pkg_list is None:
+                return False
+            for pkg in pkg_list:
+                if pkg_name == pkg or pkg_name.startswith(pkg + '.'):
+                    return True
+            return False
+
+        def is_sys_pkg(pkg):
+            try:
+                pkg_fname = pkg.__file__
+            except AttributeError:
+                return True
+            if "site-packages" in pkg_fname:
+                return True
+            if os.sep != '/':
+                pkg_fname = pkg_fname.replace(os.sep, '/')
+            return (self._python_lib_regex.search(pkg_fname) or
+                    self._lib_python_regex.search(pkg_fname))
+
+        sys_modules = sys.modules.keys()
+
+        def checked_add_package(qual_name, pkg):
+            if qual_name in sys_modules:
+                return
+            if (not in_package_list(qual_name, self._force_no_unload) and
+                    (self._force_sys_unload or not is_sys_pkg(pkg)
+                     or in_package_list(qual_name, self._force_unload)) and
+                     not qual_name.endswith('_rc')):
+                self.py_dependencies.add(qual_name)
+
+        fixed = False
+        try:
+            res = orig_import(name, globals, locals, fromlist, level)
+        except ImportError:
+            if not package_importing_directly:
+                # We only fix stuff imported directly from a package, i.e. we
+                # only tolerate misspellings in the package's code
+                raise
+
+            # backward compatibility for packages that import without
+            # "vistrails." prefix
+            for pkg in Package.FIX_PACKAGE_NAMES:
+                if name == pkg or name.startswith(pkg + '.'):
+                    if self._imports_are_good: # only warn first time
+                        self._imports_are_good = False
+                        debug.warning(
+                            "In package '%s', Please use the 'vistrails.' "
+                            "prefix when importing vistrails packages." %
+                            (self.identifier or self.codepath))
+                    fixed = pkg
+                    name = "vistrails." + name
+                    break
+            if fixed:
+                res = orig_import(name, globals, locals, fromlist, level)
+            else:
+                raise
+        mod = res
+
+        if not fromlist:
+            checked_add_package(mod.__name__, mod)
+            for comp in name.split('.')[1:]:
+                try:
+                    mod = getattr(mod, comp)
+                    checked_add_package(mod.__name__, mod)
+                except AttributeError:
+                    break
+        else:
+            res_name = mod.__name__
+            checked_add_package(mod.__name__, mod)
+            for from_name in fromlist:
+                qual_name = res_name + '.' + from_name
+                checked_add_package(qual_name, mod)
+
+        if fixed and not fromlist:
+            return getattr(res, fixed)
+        else:
+            return res
+
+    def get_py_deps(self):
+        return self.py_dependencies
+
+    def remove_py_deps(self, deps):
+        self.py_dependencies.difference_update(deps)
+
+    def load(self, prefix=None):
+        """load(module=None). Loads package's module.
+
+        If package is already loaded, this is a NOP.
+
+        """
+
+        errors = []
+        if self._loaded:
+            return
+
+        def import_from(p_path):
+            # print 'running import_from'
+            try:
+                # print p_path + self.codepath
+                self.prefix = p_path
+                __import__(p_path + self.codepath,
+                           globals(),
+                           locals(),
+                           [])
+                self._module = module = sys.modules[p_path + self.codepath]
+                self.py_dependencies.add(p_path + self.codepath)
+                self._package_type = self.Base
+
+                if hasattr(module, "_force_no_unload_pkg_list"):
+                    self._force_no_unload = module._force_no_unload_pkg_list
+                else:
+                    self._force_no_unload = []
+                if hasattr(module, "_force_unload_pkg_list"):
+                    self._force_unload = module._force_unload_pkg_list
+                else:
+                    self._force_unload = []
+                if hasattr(module, "_force_sys_unload"):
+                    self._force_sys_unload = module._force_sys_unload
+                else:
+                    self._force_sys_unload = False
+            except ImportError, e:
+                errors.append(traceback.format_exc())
+                self.prefix = None
+                return False
+            return True
+
+        try:
+            if self.prefix is not None:
+                r = not import_from(self.prefix)
+            elif prefix is not None:
+                r = not import_from(prefix)
+            else:
+                r = (not import_from('vistrails.packages.') and
+                     not import_from('userpackages.'))
+        except Exception, e:
+            raise self.LoadFailed(self, e, traceback.format_exc())
+
+        if r:
+            raise self.InitializationFailed(self, errors)
+
+        # Sometimes we don't want to change startup.xml, for example
+        # when peeking at a package that's on the available package list
+        # on edit -> preferences. That's what the load_configuration field
+        # is for
+        if self.load_configuration:
+            if hasattr(self._module, 'configuration'):
+                # hold a copy of the initial configuration so it can be reset
+                self._initial_configuration = \
+                    copy.copy(self._module.configuration)
+            self.load_persistent_configuration()
+
+        self.set_properties()
+
+    def initialize(self):
+        if not self._loaded:
+            raise VistrailsInternalError("Called initialize() on non-loaded "
+                                         "Package %s" % self.codepath)
+
+        self.check_requirements()
+
+        try:
+            name = self.prefix + self.codepath + '.init'
+            try:
+                __import__(name, globals(), locals(), [])
+            except ImportError, e:
+                # FIXME !!! Want to differentiate between .init not
+                # existing and an error with an import in the .init
+                # file !!!
+                if str(e) != 'No module named init':
+                    raise
+                else:
+                    self._init_module = self._module
+            else:
+                self._init_module = sys.modules[name]
+                self.py_dependencies.add(name)
+                # Copy attributes (shallow) from _module into _init_module's namespace and point _module to _init_module
+                module_attributes = ['identifier', 'name', 'version',
+                                     'configuration', 'package_dependencies',
+                                     'package_requirements',
+                                     'can_handle_identifier',
+                                     'can_handle_vt_file']
+                for attr in module_attributes:
+                    if (hasattr(self._module, attr) and
+                            not hasattr(self._init_module, attr)):
+                        setattr(self._init_module, attr, getattr(self._module, attr))
+                self._module = self._init_module
+
+            if hasattr(self._init_module, 'initialize'):
+                self._init_module.initialize()
+        except Exception:
+            self.unload()
+            raise
+
+    def unload(self):
+        for path in self.py_dependencies:
+            if path not in sys.modules:
+                # print "skipping %s" % path
+                pass
+            else:
+                # print 'deleting path:', path, path in sys.modules
+                del sys.modules[path]
+        self.py_dependencies.clear()
+        self._loaded = False
+
+    def set_properties(self):
+        # Set properties
+        try:
+            self._loaded = True
+            self.name = self._module.name
+            self.identifier = self._module.identifier
+            self.version = self._module.version
+            if hasattr(self._module, "old_identifiers"):
+                self.old_identifiers = self._module.old_identifiers
+            self.package_dir = os.path.dirname(self._module.__file__)
+        except AttributeError, e:
+            try:
+                v = self._module.__file__
+            except AttributeError:
+                v = self._module
+            raise e
+        descr = inspect.getdoc(self._module)
+        if descr:
+            self.description = re.sub('^ *\n', '', descr.rstrip())
+        else:
+            self.description = "(No description available)"
+
+    def can_handle_all_errors(self):
+        return hasattr(self._init_module, 'handle_all_errors')
+
+    def can_handle_upgrades(self):
+        return hasattr(self._init_module, 'handle_module_upgrade_request')
+
+    def can_handle_identifier(self, identifier):
+        """ Asks package if it can handle this package
+        """
+        try:
+            return (hasattr(self.init_module, 'can_handle_identifier') and
+                    self.init_module.can_handle_identifier(identifier))
+        except Exception, e:
+            debug.critical("Got exception calling %s's can_handle_identifier: "
+                           "%s: %s" % (self.name,
+                                       type(e).__name__, ', '.join(e.args)))
+            return False
+
+    def can_handle_vt_file(self, name):
+        """ Asks package if it can handle a file inside a zipped vt file
+        """
+        try:
+            return (hasattr(self.init_module, 'can_handle_vt_file') and
+                    self.init_module.can_handle_vt_file(name))
+        except Exception, e:
+            debug.critical("Got exception calling %s's can_handle_vt_file: "
+                           "%s: %s" % (self.name,
+                                       type(e).__name__, ', '.join(e.args)))
+            return False
+
+    def can_handle_missing_modules(self):
+        return hasattr(self._init_module, 'handle_missing_module')
+
+    def handle_all_errors(self, *args, **kwargs):
+        return self._init_module.handle_all_errors(*args, **kwargs)
+
+    def handle_module_upgrade_request(self, *args, **kwargs):
+        return self._init_module.handle_module_upgrade_request(*args, **kwargs)
+        
+    def handle_missing_module(self, *args, **kwargs):
+        """report_missing_module(name, namespace):
+
+        Calls the package's module handle_missing_module function, if
+        present, to allow the package to dynamically add a missing
+        module.
+        """
+        return self._init_module.handle_missing_module(*args, **kwargs)
+
+    def add_abs_upgrade(self, new_desc, name, namespace, module_version):
+        key = (name, namespace)
+        if key not in self._abs_pkg_upgrades:
+            self._abs_pkg_upgrades[key] = {}
+        self._abs_pkg_upgrades[key][module_version] = new_desc
+
+    def has_abs_upgrade(self, name, namespace='', module_version=''):
+        key = (name, namespace)
+        if key not in self._abs_pkg_upgrades:
+            return False
+        if module_version and module_version not in self._abs_pkg_upgrades[key]:
+            return False
+        return True
+        
+    def get_abs_upgrade(self, name, namespace='', module_version=''):
+        key = (name, namespace)
+        if key in self._abs_pkg_upgrades:
+            if module_version:
+                if module_version in self._abs_pkg_upgrades[key]:
+                    return self._abs_pkg_upgrades[key][module_version]
+            else:
+                latest_version = max(self._abs_pkg_upgrades[key].iterkeys())
+                return self._abs_pkg_upgrades[key][latest_version]
+        return None
+
+    def has_contextMenuName(self):
+        return hasattr(self._init_module, 'contextMenuName')
+
+    def contextMenuName(self, signature):
+        return self._init_module.contextMenuName(signature)
+    
+    def has_callContextMenu(self):
+        return hasattr(self._init_module, 'callContextMenu')
+
+    def callContextMenu(self, signature):
+        return self._init_module.callContextMenu(signature)
+
+    def loadVistrailFileHook(self, vistrail, tmp_dir):
+        if hasattr(self._init_module, 'loadVistrailFileHook'):
+            try:
+                self._init_module.loadVistrailFileHook(vistrail, tmp_dir)
+            except Exception, e:
+                debug.critical("Got exception in %s's loadVistrailFileHook(): "
+                               "%s: %s" % (self.name, type(e).__name__,
+                                           ', '.join(e.args)))
+
+    def saveVistrailFileHook(self, vistrail, tmp_dir):
+        if hasattr(self._init_module, 'saveVistrailFileHook'):
+            try:
+                self._init_module.saveVistrailFileHook(vistrail, tmp_dir)
+            except Exception, e:
+                debug.critical("Got exception in %s's saveVistrailFileHook(): "
+                               "%s: %s" % (self.name, type(e).__name__,
+                                           ', '.join(e.args)))
+
+    def check_requirements(self):
+        try:
+            callable_ = self._module.package_requirements
+        except AttributeError:
+            return
+        else:
+            callable_()
+
+    def menu_items(self):
+        try:
+            callable_ = self._module.menu_items
+        except AttributeError:
+            return None
+        else:
+            try:
+                return callable_()
+            except Exception, e:
+                debug.critical("Couldn't load menu items for %s: %s: %s" % (
+                               self.name, type(e).__name__, ', '.join(e.args)))
+
+    def finalize(self):
+        if not self._initialized:
+            return
+        debug.log("Finalizing %s" % self.name)
+        try:
+            callable_ = self._module.finalize
+        except AttributeError:
+            pass
+        else:
+            try:
+                callable_()
+            except Exception, e:
+                debug.critical("Couldn't finalize %s: %s: %s" % (
+                               self.name, type(e).__name__, ', '.join(e.args)))
+        # Save configuration
+        if self.configuration:
+            self.set_persistent_configuration()
+        self.unload()
+        self._module = None
+        self._init_module = None
+        self._initialized = False
+
+    def dependencies(self):
+        try:
+            callable_ = self._module.package_dependencies
+        except AttributeError:
+            deps = []
+        else:
+            try:
+                deps = callable_()
+            except Exception, e:
+                debug.critical("Couldn't get dependencies of %s: %s: %s" % (
+                               self.name, type(e).__name__, ', '.join(e.args)))
+
+        if self._module is not None and \
+                hasattr(self._module, '_dependencies'):
+            deps.extend(self._module._dependencies)
+        return deps
+
+    def loaded(self):
+        return self._loaded
+
+    def initialized(self):
+        return self._initialized
+
+    ##########################################################################
+    # Configuration
+
+    def _get_package_node(self, dom, create):
+        doc = dom.documentElement
+        packages = enter_named_element(doc, 'packages')
+        for package_node in named_elements(packages, 'package'):
+            if package_node.attributes['name'].value == self.codepath:
+                return package_node, 'enabled'
+        oldpackages = enter_named_element(doc, 'disabledpackages')
+        for package_node in named_elements(oldpackages, 'package'):
+            if package_node.attributes['name'].value == self.codepath:
+                return package_node, 'disabled'
+
+        if create is None:
+            return None, None
+        else:
+            package_node = dom.createElement('package')
+            package_node.setAttribute('name', self.codepath)
+            if create == 'enabled':
+                packages.appendChild(package_node)
+            elif create == 'disabled':
+                oldpackages.appendChild(package_node)
+            else:
+                raise ValueError
+            get_vistrails_application().vistrailsStartup.write_startup_dom(dom)
+            return package_node, create
+
+    def _move_package_node(self, dom, where, node):
+        doc = dom.documentElement
+        packages = enter_named_element(doc, 'packages')
+        oldpackages = enter_named_element(doc, 'disabledpackages')
+        if where == 'enabled':
+            oldpackages.removeChild(node)
+            packages.appendChild(node)
+        elif where == 'disabled':
+            packages.removeChild(node)
+            oldpackages.appendChild(node)
+        else:
+            raise ValueError
+        get_vistrails_application().vistrailsStartup.write_startup_dom(dom)
+
+    def remove_own_dom_element(self):
+        """Moves the node to the <disabledpackages> section.
+        """
+        dom = get_vistrails_application().vistrailsStartup.startup_dom()
+
+        node, section = self._get_package_node(dom, create='disabled')
+        if section == 'enabled':
+            self._move_package_node(dom, 'disabled', node)
+
+    def reset_configuration(self):
+        """Reset package configuration to original package settings.
+        """
+
+        (dom, element) = self.find_own_dom_element()
+        doc = dom.documentElement
+        configuration = enter_named_element(element, 'configuration')
+        if configuration:
+            element.removeChild(configuration)
+        self.configuration = copy.copy(self._initial_configuration)
+
+        startup = get_vistrails_application().vistrailsStartup
+        startup.write_startup_dom(dom)
+
+    def find_own_dom_element(self):
+        """find_own_dom_element() -> (DOM, Node)
+
+        Opens the startup DOM, looks for the element that belongs to the package,
+        and returns DOM and node. Creates a new one in the <disabledpackages>
+        section if none is found.
+        """
+        dom = get_vistrails_application().vistrailsStartup.startup_dom()
+
+        node, section = self._get_package_node(dom, create='disabled')
+        return (dom, node)
+
+    def load_persistent_configuration(self):
+        (dom, element) = self.find_own_dom_element()
+
+        configuration = enter_named_element(element, 'configuration')
+        if configuration:
+            self.configuration.set_from_dom_node(configuration)
+        dom.unlink()
+
+    def set_persistent_configuration(self):
+        (dom, element) = self.find_own_dom_element()
+        child = enter_named_element(element, 'configuration')
+        if child:
+            element.removeChild(child)
+        self.configuration.write_to_dom(dom, element)
+        get_vistrails_application().vistrailsStartup.write_startup_dom(dom)
+        dom.unlink()
+
+    def create_startup_package_node(self):
+        """Writes the node to the <packages> section.
+
+        If it was in the <disabledpackages> section, move it, else, create it.
+        """
+        dom = get_vistrails_application().vistrailsStartup.startup_dom()
+
+        node, section = self._get_package_node(dom, create='enabled')
+        if section == 'disabled':
+            self._move_package_node(dom, 'enabled', node)
+
+        configuration = enter_named_element(node, 'configuration')
+        if configuration:
+            self.configuration.set_from_dom_node(configuration)
+
+        dom.unlink()
diff --git a/vistrails/core/modules/paramexplore.py b/vistrails/core/modules/paramexplore.py
new file mode 100644
index 0000000..6b8214a
--- /dev/null
+++ b/vistrails/core/modules/paramexplore.py
@@ -0,0 +1,250 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from vistrails.core import debug
+from vistrails.core.modules.basic_modules import Color
+from vistrails.core.utils.color import rgb2hsv, hsv2rgb
+
+
+class BaseLinearInterpolator(object):
+    def __init__(self, ptype, mn, mx, steps):
+        self._ptype = ptype
+        self._mn = mn
+        self._mx = mx
+        self._steps = steps
+
+    def get_values(self):
+        cast = self._ptype
+        begin = self._mn
+        end = self._mx
+        size = self._steps
+        if size <= 1:
+            return [begin]
+        result = [cast(begin + ((end - begin) * i / cast(size - 1)))
+                  for i in xrange(size)]
+        return result
+
+
+class IntegerLinearInterpolator(BaseLinearInterpolator):
+    def __init__(self, mn, mx, steps):
+        BaseLinearInterpolator.__init__(self, int, mn, mx, steps)
+
+
+class FloatLinearInterpolator(BaseLinearInterpolator):
+    def __init__(self, mn, mx, steps):
+        BaseLinearInterpolator.__init__(self, float, mn, mx, steps)
+
+
+###############################################################################
+
+class BaseColorInterpolator(object):
+    def __init__(self, ifunc, begin, end, size):
+        self._ifunc = ifunc
+        self.begin = begin
+        self.end = end
+        self.size = size
+
+    def get_values(self):
+        if self.size <= 1:
+            return [self.begin]
+        result = [self._ifunc(self.begin, self.end, self.size, i)
+                  for i in xrange(self.size)]
+        return result
+
+
+class RGBColorInterpolator(BaseColorInterpolator):
+    def __init__(self, begin, end, size):
+        def fun(b, e, s, i):
+            b = [float(x) for x in b.split(',')]
+            e = [float(x) for x in e.split(',')]
+            u = float(i) / (float(s) - 1.0)
+            [r,g,b] = [b[i] + u * (e[i] - b[i]) for i in [0,1,2]]
+            return Color.to_string(r, g, b)
+        BaseColorInterpolator.__init__(self, fun, begin, end, size)
+
+
+class HSVColorInterpolator(BaseColorInterpolator):
+    def __init__(self, begin, end, size):
+        BaseColorInterpolator.__init__(self, None, begin, end, size)
+
+    def get_values(self):
+        b = [float(x) for x in self.begin.split(',')]
+        e = [float(x) for x in self.end.split(',')]
+
+        b_hsv = rgb2hsv(b)
+        e_hsv = rgb2hsv(e)
+
+        size_fact = 1.0 / (float(self.size) - 1.0)
+
+        # Ignore the undefined hues
+        if b_hsv[0] is None:
+            b_hsv[0] = e_hsv[0]
+        elif e_hsv[0] is None:
+            e_hsv[0] = b_hsv[0]
+
+        if b_hsv[0] is None:
+            # There is no hue at all!
+            b_hsv[0] = e_hsv[0] = 0.0 # unused value
+            hue_step = 0.0
+        else:
+            # Compute hue
+            # Because the hue is an angle, there is two ways to interpolate it;
+            # choose the shorter path
+            diff1 = e_hsv[0] - b_hsv[0]
+            diff2 = e_hsv[0] - b_hsv[0] + 360.0
+            if diff2 >= 360.0:
+                diff2 -= 360.0
+            assert 0.0 <= diff2 < 360.0
+            if abs(diff1) < abs(diff2):
+                hue_step = diff1
+            else:
+                hue_step = diff2
+
+        colors = []
+        for i in xrange(self.size):
+            u = i * size_fact
+            hue = b_hsv[0] + u * hue_step
+            if hue < 0.0:
+                hue += 360.0
+            elif hue > 360.0:
+                hue -= 360.0
+            colors.append(Color.to_string(*hsv2rgb((
+                    hue,
+                    b_hsv[1] + u * (e_hsv[1] - b_hsv[1]),
+                    b_hsv[2] + u * (e_hsv[2] - b_hsv[2])
+                ))))
+
+        return colors
+
+
+###############################################################################
+
+class UserDefinedFunctionInterpolator(object):
+    def __init__(self, ptype, code, steps):
+        self._ptype = ptype
+        self._code = code
+        self._steps = steps
+    def get_values(self):
+        def get():
+            import code
+            values = []
+            d = {}
+            try:
+                exec(self._code) in {}, d
+            except Exception, e:
+                return [self._ptype.default_value] * self._steps
+            def evaluate(i):
+                try:
+                    v = d['value'](i)
+                    if v == None:
+                        return self._ptype.default_value
+                    return v
+                except Exception, e:
+                    return str(e)
+            return [evaluate(i) for i in xrange(self._steps)]
+        result = get()
+
+        if not all(self._ptype.validate(x) for x in result):
+            # FIXME: We should throw an error here instead
+            debug.critical(
+                    'Failed Validation',
+                    'One of the <i>%s</i>\'s user defined functions has '
+                    'failed validation, which usually means it generated a '
+                    'value of a type different than that specified by the '
+                    'parameter. Parameter Exploration aborted.' % self._ptype)
+            return None
+        return result
+
+
+################################################################################
+
+import unittest
+
+
+class TestLinearInterpolator(unittest.TestCase):
+    def test_int(self):
+        x = BaseLinearInterpolator(int, 0, 999, 1000)
+        assert x.get_values() == range(1000)
+
+    def test_float(self):
+        # test the property that differences in value must be linearly
+        # proportional to differences in index for a linear interpolation
+        import random
+        s = random.randint(4, 10000)
+        v1 = random.random()
+        v2 = random.random()
+        mn = min(v1, v2)
+        mx = max(v1, v2)
+        x = BaseLinearInterpolator(float, mn, mx, s).get_values()
+        v1 = random.randint(0, s-1)
+        v2 = 0
+        while v2 == v1:
+            v2 = random.randint(0, s-1)
+        v3 = random.randint(0, s-1)
+        v4 = 0
+        while v3 == v4:
+            v4 = random.randint(0, s-1)
+        r1 = (v2 - v1) / (x[v2] - x[v1])
+        r2 = (v4 - v3) / (x[v4] - x[v3])
+        assert abs(r1 - r2) < 1e-6
+
+
+class TestColorInterpolation(unittest.TestCase):
+    def test_rgb_interpolation(self):
+        interp = RGBColorInterpolator('0.5,0.7,0.8', '0.5,0.9,0.3', 6)
+        self.assertEqual(interp.get_values(),
+                         ['0.5,0.7,0.8', '0.5,0.74,0.7', '0.5,0.78,0.6',
+                          '0.5,0.82,0.5', '0.5,0.86,0.4', '0.5,0.9,0.3'])
+
+    def test_hsv_interpolation(self):
+        tests = [((120.0, 0.8, 0.2), (170.0, 0.5, 0.2),
+                  [(120.0, 0.8, 0.2), (130.0, 0.74, 0.2), (140.0, 0.68, 0.2),
+                   (150.0, 0.62, 0.2), (160.0, 0.56, 0.2), (170.0, 0.5, 0.2)]),
+                 ((260.0, 0.2, 0.7), (40.0, 0.8, 0.1),
+                  [(260.0, 0.2, 0.7), (288.0, 0.32, 0.58), (316.0, 0.44, 0.46),
+                   (344.0, 0.56, 0.34), (12.0, 0.68, 0.22), (40.0, 0.8, 0.1)])]
+
+        for b, e, expected in tests:
+            b = hsv2rgb(b)
+            e = hsv2rgb(e)
+            interp = HSVColorInterpolator(','.join(str(c) for c in b),
+                                          ','.join(str(c) for c in e),
+                                          6)
+            for i, color in enumerate(interp.get_values()):
+                color = [float(e) for e in color.split(',')]
+                color = rgb2hsv(color)
+                self.assertAlmostEqual(color[0], expected[i][0], delta=0.2)
+                self.assertAlmostEqual(color[1], expected[i][1], delta=0.005)
+                self.assertAlmostEqual(color[2], expected[i][2], delta=0.005)
diff --git a/vistrails/core/modules/python_source_configure.py b/vistrails/core/modules/python_source_configure.py
new file mode 100644
index 0000000..a711b79
--- /dev/null
+++ b/vistrails/core/modules/python_source_configure.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# *** MOVED *** to gui.modules.python_source_configure
+import traceback
+from vistrails.core import debug
+
+from vistrails.gui.modules.python_source_configure import *
+debug.warning("The use of core.modules.python_source_configure is deprecated.  "
+              "Please use gui.modules.python_source_configure.",
+              ''.join(traceback.format_stack()))
+
diff --git a/vistrails/core/modules/query_configuration.py b/vistrails/core/modules/query_configuration.py
new file mode 100644
index 0000000..3d1279a
--- /dev/null
+++ b/vistrails/core/modules/query_configuration.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# *** MOVED *** to gui.modules.query_configuration
+import traceback
+from vistrails.core import debug
+
+from vistrails.gui.modules.query_configuration import *
+debug.warning("The use of core.modules.query_configuration is deprecated.  "
+              "Please use gui.modules.query_configuration.",
+              ''.join(traceback.format_stack()))
+
diff --git a/vistrails/core/modules/source_configure.py b/vistrails/core/modules/source_configure.py
new file mode 100644
index 0000000..5f804d3
--- /dev/null
+++ b/vistrails/core/modules/source_configure.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# *** MOVED *** to gui.modules.source_configure
+import traceback
+from vistrails.core import debug
+
+from vistrails.gui.modules.source_configure import *
+debug.warning("The use of core.modules.source_configure is deprecated.  "
+              "Please use gui.modules.source_configure.",
+              ''.join(traceback.format_stack()))
+
diff --git a/vistrails/core/modules/sub_module.py b/vistrails/core/modules/sub_module.py
new file mode 100644
index 0000000..f6ad512
--- /dev/null
+++ b/vistrails/core/modules/sub_module.py
@@ -0,0 +1,496 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+""" Define facilities for setting up SubModule Module in VisTrails """
+from itertools import izip
+import random
+import uuid
+
+from vistrails.core.cache.hasher import Hasher
+from vistrails.core.cache.utils import hash_list
+from vistrails.core.modules import module_registry
+from vistrails.core.modules.basic_modules import String, Boolean, Variant, \
+    NotCacheable, identifier as basic_pkg
+from vistrails.core.modules.vistrails_module import Module, InvalidOutput, new_module, \
+    ModuleError, ModuleSuspended
+from vistrails.core.utils import ModuleAlreadyExists, DummyView, VistrailsInternalError
+import os.path
+import vistrails.db
+
+try:
+    import hashlib
+    sha_hash = hashlib.sha1
+except ImportError:
+    import sha
+    sha_hash = sha.new
+
+##############################################################################
+
+class InputPort(Module):
+    
+    def compute(self):
+        exPipe = self.forceGetInputFromPort('ExternalPipe')
+        if exPipe is not None:
+            self.setResult('InternalPipe', exPipe)
+        else:
+            if self.hasInputFromPort('Default'):
+                self.setResult('InternalPipe',
+                               self.getInputFromPort('Default'))
+            else:
+                self.setResult('InternalPipe', InvalidOutput)
+
+###############################################################################
+    
+class OutputPort(Module):
+    
+    def compute(self):
+        inPipe = self.getInputFromPort('InternalPipe')
+        self.setResult('ExternalPipe', inPipe)
+    
+###############################################################################
+
+class Group(Module):
+    def __init__(self):
+        Module.__init__(self)
+        self.is_group = True
+        self.persistent_modules = []
+
+    def compute(self):
+        if not hasattr(self, 'pipeline') or self.pipeline is None:
+            raise VistrailsInternalError("%s cannot execute--" % \
+                                             self.__class__.__name__ + \
+                                         "pipeline doesn't exist")
+        elif not hasattr(self, 'input_remap') or self.input_remap is None or \
+                not hasattr(self, 'output_remap') or self.output_remap is None:
+            raise VistrailsInternalError("%s cannot execute--" % \
+                                             self.__class__.__name__ + \
+                                         "remap dictionaries don't exist")
+            
+        res = self.interpreter.setup_pipeline(self.pipeline)
+        self.persistent_modules = res[0].values()
+        if len(res[5]) > 0:
+            raise ModuleError(self, 'Error(s) inside group:\n' +
+                              '\n'.join(me.msg for me in res[5].itervalues()))
+        tmp_id_to_module_map = res[0]
+        for iport_name, conn in self.inputPorts.iteritems():
+            iport_module = self.input_remap[iport_name]
+            iport_obj = tmp_id_to_module_map[iport_module.id]
+            iport_obj.set_input_port('ExternalPipe', conn[0])
+        
+        kwargs = {'logger': self.logging.log, 'clean_pipeline': True,
+                  'current_version': self.moduleInfo['version']}
+        module_info_args = set(['locator', 'reason', 'extra_info', 'actions'])
+        for arg in module_info_args:
+            if arg in self.moduleInfo:
+                kwargs[arg] = self.moduleInfo[arg]
+
+#         if hasattr(self, 'group_exec'):
+#             kwargs['parent_exec'] = self.group_exec
+
+        res = self.interpreter.execute_pipeline(self.pipeline, *(res[:2]), 
+                                                **kwargs)
+        if len(res[2]) > 0:
+            raise ModuleError(self, 'Error(s) inside group:\n' +
+                              '\n '.join(me.module.__class__.__name__ + ': ' + \
+                                            me.msg for me in res[2].itervalues()))
+        if len(res[4]) > 0:
+            # extract messages and previous ModuleSuspended exceptions
+            message = '\n'.join([msg for msg in res[4].itervalues()])
+            children = [tmp_id_to_module_map[module_id]._module_suspended
+                        for module_id in res[4]]
+            raise ModuleSuspended(self, message, children=children)
+            
+        for oport_name, oport_module in self.output_remap.iteritems():
+            if oport_name is not 'self':
+                # oport_module = self.output_remap[oport_name]
+                oport_obj = tmp_id_to_module_map[oport_module.id]
+                self.setResult(oport_name, oport_obj.get_output('ExternalPipe'))
+        self.interpreter.finalize_pipeline(self.pipeline, *res[:-1],
+                                           **{'reset_computed': False})
+
+    def is_cacheable(self):
+        return all(m.is_cacheable() for m in self.persistent_modules)
+
+###############################################################################
+
+def coalesce_port_specs(neighbors, type):
+    from vistrails.core.modules.basic_modules import identifier as basic_pkg
+    reg = module_registry.get_module_registry()
+    cur_descs = None
+    if type == 'input':
+        find_common = reg.find_descriptor_subclass
+        common_desc = reg.get_descriptor_by_name(basic_pkg, 'Variant')
+    elif type == 'output':
+        find_common = reg.find_descriptor_superclass
+        common_desc = reg.get_descriptor_by_name(basic_pkg, 'Module')
+    else:
+        raise VistrailsInternalError("Cannot understand type '%s'" % type)
+
+    for (module, port_name) in neighbors:
+        if cur_descs is None:
+            port_spec = module.get_port_spec(port_name, type)
+            cur_descs = port_spec.descriptors()
+        else:
+            next_port_spec = module.get_port_spec(port_name, type)
+            next_descs = next_port_spec.descriptors()
+            if len(cur_descs) != len(next_descs):
+                raise VistrailsInternalError("Cannot have single port "
+                                             "connect to incompatible "
+                                             "types")
+            descs = []
+            for cur_desc, next_desc in izip(cur_descs, next_descs):
+                new_desc = find_common(cur_desc, next_desc)
+                if new_desc is None:
+                    new_desc = common_desc
+                descs.append(new_desc)
+            cur_descs = descs
+    if cur_descs:
+        sigstring = '(' + ','.join(d.sigstring for d in cur_descs) + ')'
+    else:
+        sigstring = None
+    return sigstring
+
+def get_port_spec_info(pipeline, module):
+    type_map = {'OutputPort': 'output', 'InputPort': 'input'}
+    try:
+        type = type_map[module.name]
+    except KeyError:
+        raise VistrailsInternalError("cannot translate type '%s'" % type)
+    if type == 'input':
+        get_edges = pipeline.graph.edges_from
+        get_port_name = \
+            lambda x: pipeline.connections[x].destination.name
+    elif type == 'output':
+        get_edges = pipeline.graph.edges_to
+        get_port_name = \
+            lambda x: pipeline.connections[x].source.name
+    # conns = get_edges(module.id)
+#     for i, m in pipeline.modules.iteritems():
+#         print i, m.name
+#     for j, c in pipeline.connections.iteritems():
+#         print j, c.source.moduleId, c.destination.moduleId
+
+    neighbors = [(pipeline.modules[m_id], get_port_name(c_id))
+                 for (m_id, c_id) in get_edges(module.id)]
+    port_name = neighbors[0][1]
+    sigstring = coalesce_port_specs(neighbors, type)
+    old_name = port_name
+    # sigstring = neighbor.get_port_spec(port_name, type).sigstring
+
+    # FIXME check old registry here?
+    port_optional = False
+    for function in module.functions:
+        if function.name == 'name':
+            port_name = function.params[0].strValue
+        if function.name == 'optional':
+            port_optional = function.params[0].strValue == 'True'
+#     print 'psi:', port_name, old_name, sigstring
+    return (port_name, sigstring, port_optional, neighbors)
+
+###############################################################################
+
+class Abstraction(Group):
+    def __init__(self):
+        Group.__init__(self)
+
+    # the compute method is inherited from Group!
+
+def read_vistrail(vt_fname):
+    import vistrails.db.services.io
+    from vistrails.core.vistrail.vistrail import Vistrail
+    vistrail = vistrails.db.services.io.open_vistrail_from_xml(vt_fname)
+    Vistrail.convert(vistrail)
+    return vistrail
+
+def read_vistrail_from_db(db_connection, abs_id, version):
+    import vistrails.db.services.io
+    from vistrails.core.vistrail.vistrail import Vistrail
+    vistrail = vistrails.db.services.io.open_vistrail_from_db(db_connection, abs_id, version)
+    Vistrail.convert(vistrail)
+    return vistrail
+
+def get_abs_namespace_info(vistrail):
+    annotation_add = None
+    annotation_key = '__abstraction_uuid__'
+    namespaces = []
+    while vistrail.get_annotation(annotation_key) is not None:
+        namespaces.append(vistrail.get_annotation(annotation_key).value)
+        if annotation_add is None:
+            annotation_add = 2
+        else:
+            annotation_add += 1
+        annotation_key = '__abstraction_uuid_%d__' % annotation_add
+    return namespaces, annotation_add
+
+def get_all_abs_namespaces(vistrail):
+    return get_abs_namespace_info(vistrail)[0]
+
+def get_cur_abs_namespace(vistrail):
+    all_namespaces = get_abs_namespace_info(vistrail)[0]
+    if len(all_namespaces) > 0:
+        return all_namespaces[-1]
+    return None
+
+def get_next_abs_annotation_key(vistrail):
+    annotation_add = get_abs_namespace_info(vistrail)[1]
+    if annotation_add is None:
+        return "__abstraction_uuid__"
+    return "__abstraction_uuid_%d__" % annotation_add
+
+def get_cur_abs_annotation_key(vistrail):
+    annotation_add = get_abs_namespace_info(vistrail)[1]
+    if annotation_add is None:
+        return None
+    elif annotation_add == 2:
+        return '__abstraction_uuid__'
+    return '__abstraction_uuid_%d__' % (annotation_add - 1)
+    
+def save_abstraction(vistrail, fname):
+    from vistrails.core.db.io import save_vistrail_to_xml
+
+    # check if vistrail is changed before calling this!
+    new_namespace = str(uuid.uuid1())
+    annotation_key = get_next_abs_annotation_key(vistrail)
+    vistrail.set_annotation(annotation_key, new_namespace)
+    save_vistrail_to_xml(vistrail, fname)
+
+def new_abstraction(name, vistrail, vt_fname=None, internal_version=-1L,
+                    pipeline=None):
+    """make_abstraction(name: str, 
+                        vistrail: (str or Vistrail), 
+                        registry: ModuleRegistry,
+                        vt_fname: str,
+                        internal_version: long,
+                        pipeline: Pipeline) -> type
+
+    Creates a new VisTrails module that is a subclass of Abstraction
+    according to the vistrail file provided and the version.  The version
+    can either be a tag (string) or an id (long)
+    """
+
+    if isinstance(vistrail, basestring):
+        vt_fname = vistrail
+        vistrail = read_vistrail(vistrail)
+    elif vt_fname is None:
+        raise VistrailsInternalError("Abstraction must provide "
+                                     "vt_fname with vistrail")
+    
+    if internal_version == -1L:
+        internal_version = vistrail.get_latest_version()
+    action = vistrail.actionMap[internal_version]
+    if pipeline is None:
+        pipeline = vistrail.getPipeline(internal_version)
+        # try to make the subworkflow work with the package versions we have
+        pipeline.validate()
+    uuid = get_cur_abs_namespace(vistrail)
+
+    if vistrail.has_notes(action.id):
+        docstring = vistrail.get_notes(action.id)
+    else:
+        docstring = None
+
+    d = {}
+    input_modules = []
+    output_modules = []
+    for module in pipeline.module_list:
+        #FIXME make this compare more robust
+        if module.name == 'InputPort' and module.package == basic_pkg:
+            input_modules.append(module)
+        elif module.name == 'OutputPort' and module.package == basic_pkg:
+            output_modules.append(module)
+    input_ports = []
+    output_ports = []
+    input_remap = {}
+    output_remap = {}
+    for module in input_modules:
+        (port_name, sigstring, optional, _) = \
+            get_port_spec_info(pipeline, module)
+        input_ports.append((port_name, sigstring, optional))
+        input_remap[port_name] = module
+    for module in output_modules:
+        (port_name, sigstring, optional, _) = \
+            get_port_spec_info(pipeline, module)
+        output_ports.append((port_name, sigstring, optional))
+        output_remap[port_name] = module
+
+    # necessary for group
+    d['_input_ports'] = input_ports
+    d['_output_ports'] = output_ports
+    d['input_remap'] = input_remap
+    d['output_remap'] = output_remap
+    d['pipeline'] = pipeline
+
+    # abstraction specific
+    d['vt_fname'] = vt_fname
+    d['vistrail'] = vistrail
+    d['internal_version'] = internal_version
+    d['uuid'] = uuid
+
+    # print "input_ports", d['_input_ports']
+    # print "output_ports", d['_output_ports']
+    return new_module(Abstraction, name, d, docstring)
+
+def get_abstraction_dependencies(vistrail, internal_version=-1L):
+    if isinstance(vistrail, basestring):
+        vistrail = read_vistrail(vistrail)
+    if internal_version == -1L:
+        internal_version = vistrail.get_latest_version()
+    # action = vistrail.actionMap[internal_version]
+    pipeline = vistrail.getPipeline(internal_version)
+    
+    packages = {}
+    for module in pipeline.module_list:
+        if module.package not in packages:
+            packages[module.package] = set()
+        packages[module.package].add(module.descriptor_info)
+    return packages
+
+def find_internal_abstraction_refs(pkg, vistrail, internal_version=-1L):
+    if isinstance(vistrail, basestring):
+        vistrail = read_vistrail(os.path.join(pkg.package_dir, vistrail))
+    if internal_version == -1L:
+        internal_version = vistrail.get_latest_version()
+    pipeline = vistrail.getPipeline(internal_version)
+    abstractions = []
+    for m in pipeline.module_list:
+        if m.vtType == 'abstraction' and m.package == pkg.identifier:
+            abstractions.append((m.name, m.namespace))
+    return abstractions
+
+def random_signature(pipeline, obj, chm):
+    hasher = sha_hash()
+    hasher.update(str(random.random()))
+    return hasher.digest()
+
+def input_port_signature(pipeline, obj, chm):
+    if hasattr(obj, '_input_port_signature') and \
+            obj._input_port_signature is not None:
+        return obj._input_port_signature
+    return random_signature(pipeline, obj, chm)
+
+def group_signature(pipeline, module, chm):
+    if module._port_specs is None:
+        module.make_port_specs()
+    input_conns = {}
+    input_functions = {}
+    for from_module, c_id in pipeline.graph.edges_to(module.id):
+        conn = pipeline.connections[c_id]
+        if conn.destination.name not in input_conns:
+            input_conns[conn.destination.name] = []
+        input_conns[conn.destination.name].append((from_module, conn))
+    for function in module.functions:
+        if function.name not in input_functions:
+            input_functions[function.name] = []
+        input_functions[function.name].append(function)
+    covered_modules = dict((k, False) for k in module._input_remap)
+    for input_port_name, conn_list in input_conns.iteritems():
+        covered_modules[input_port_name] = True
+        input_module = module._input_remap[input_port_name]
+        upstream_sigs = [(pipeline.subpipeline_signature(m) +
+                          Hasher.connection_signature(c))
+                         for (m, c) in conn_list]
+        module_sig = Hasher.module_signature(input_module, chm)
+        sig = Hasher.subpipeline_signature(module_sig, upstream_sigs)
+        if input_port_name in input_functions:
+            function_sig = hash_list(input_functions[input_port_name], 
+                                     Hasher.function_signature, chm)
+            sig = Hasher.compound_signature([sig, function_sig])
+        input_module._input_port_signature = sig
+    for input_port_name, done in covered_modules.iteritems():
+        if done:
+            continue
+        covered_modules[input_port_name] = True
+        input_module = module._input_remap[input_port_name]
+        if input_port_name in input_functions:
+            module_sig = Hasher.module_signature(input_module, chm)
+            function_sig = hash_list(input_functions[input_port_name], 
+                                     Hasher.function_signature, chm)
+            sig = Hasher.compound_signature([module_sig, function_sig])
+        else:
+            sig = Hasher.module_signature(input_module, chm)
+        input_module._input_port_signature = sig
+
+    module.pipeline.refresh_signatures()
+
+    sig_list = []
+    sig_list.append(Hasher.module_signature(module, chm))
+    for m_id in module.pipeline.graph.sinks():
+        sig_list.append(module.pipeline.subpipeline_signature(m_id))
+    return Hasher.compound_signature(sig_list)
+
+def parse_abstraction_name(filename, get_all_parts=False):
+    # assume only 1 possible prefix or suffix
+    import re
+    prefixes = ["abstraction_"]
+    suffixes = [".vt", ".xml"]
+    path, fname = os.path.split(filename)
+    hexpat = '[a-fA-F0-9]'
+    uuidpat = hexpat + '{8}-' + hexpat + '{4}-' + hexpat + '{4}-' + hexpat + '{4}-' + hexpat + '{12}'
+    prepat = '|'.join(prefixes).replace('.','\\.')
+    sufpat = '|'.join(suffixes).replace('.','\\.')
+    pattern = re.compile("(" + prepat + ")?(.+?)(\(" + uuidpat + "\))?(" + sufpat + ")", re.DOTALL)
+    matchobj = pattern.match(fname)
+    prefix, absname, uuid, suffix = [matchobj.group(x) or '' for x in xrange(1,5)]
+    if get_all_parts:
+        return (path, prefix, absname, uuid[1:-1], suffix)
+    return absname
+
+
+###############################################################################
+
+def initialize(*args, **kwargs):
+    # These are all from sub_module.py!
+    reg = module_registry.get_module_registry()
+
+    reg.add_module(InputPort, signatureCallable=input_port_signature)
+    reg.add_input_port(InputPort, "name", String, True)
+    reg.add_input_port(InputPort, "optional", Boolean, True)
+    reg.add_input_port(InputPort, "spec", String)
+    reg.add_input_port(InputPort, "ExternalPipe", Variant, True)
+    reg.add_input_port(InputPort, "Default", Variant)
+    reg.add_output_port(InputPort, "InternalPipe", Variant)
+
+    reg.add_module(OutputPort)
+    reg.add_input_port(OutputPort, "name", String, True)
+    reg.add_input_port(OutputPort, "optional", Boolean, True)
+    reg.add_input_port(OutputPort, "spec", String)
+    reg.add_input_port(OutputPort, "InternalPipe", Variant)
+    reg.add_output_port(OutputPort, "ExternalPipe", Variant, True)
+
+    reg.add_module(Group, signatureCallable=group_signature,
+                   hide_descriptor=True)
+    reg.add_output_port(Group, "self", Group, True)
+
+    reg.add_module(Abstraction, name="SubWorkflow", hide_descriptor=True)
diff --git a/vistrails/core/modules/tuple_configuration.py b/vistrails/core/modules/tuple_configuration.py
new file mode 100644
index 0000000..d03fb33
--- /dev/null
+++ b/vistrails/core/modules/tuple_configuration.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# *** MOVED *** to gui.modules.tuple_configuration
+import traceback
+from vistrails.core import debug
+
+from vistrails.gui.modules.tuple_configuration import *
+debug.warning("The use of core.modules.tuple_configuration is deprecated.  "
+              "Please use gui.modules.tuple_configuration.",
+              ''.join(traceback.format_stack()))
+
diff --git a/vistrails/core/modules/utils.py b/vistrails/core/modules/utils.py
new file mode 100644
index 0000000..9083550
--- /dev/null
+++ b/vistrails/core/modules/utils.py
@@ -0,0 +1,228 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import vistrails.core
+from vistrails.core.system import get_vistrails_default_pkg_prefix
+
+def create_descriptor_string(package, name, namespace=None,
+                             use_package=True):
+    package_str = ""
+    namespace_str = ""
+    if use_package:
+        package_str = "%s:" % package
+    if namespace:
+        namespace_str = "%s|" % namespace
+    return "%s%s%s" % (package_str, namespace_str, name)
+
+def parse_descriptor_string(d_string, cur_package=None):
+    """parse_descriptor_string will expand names of modules using
+    information about the current package and allowing shortcuts
+    for any bundled vistrails packages (e.g. "basic" for
+    "org.vistrails.vistrails.basic").  It also allows a nicer
+    format for namespace/module specification (namespace comes
+    fist unlike port specifications where it is after the module
+    name...
+
+    Examples:
+      "persistence:PersistentInputFile", None -> 
+          ("org.vistrails.vistrails.persistence", PersistentInputFile", "")
+      "basic:String", None ->
+          ("org.vistrails.vistrails.basic", "String", "")
+      "NamespaceA|NamespaceB|Module", "org.example.my" ->
+          ("org.example.my", "Module", "NamespaceA|NamespaceB")
+    """
+
+    package = ''
+    qual_name = ''
+    name = ''
+    namespace = None
+    parts = d_string.strip().split(':', 1)
+    if len(parts) > 1:
+        qual_name = parts[1]
+        if '.' in parts[0]:
+            package = parts[0]
+        else:
+            package = '%s.%s' % (get_vistrails_default_pkg_prefix(), parts[0])
+    else:
+        qual_name = d_string
+        if cur_package is None:
+            from vistrails.core.modules.module_registry import get_module_registry
+            reg = get_module_registry()
+            if reg._current_package is not None:
+                package = reg._current_package.identifier
+            else:
+                import vistrails.core.modules.basic_modules
+                basic_pkg = vistrails.core.modules.basic_modules.identifier
+                package = basic_pkg
+        else:
+            package = cur_package
+    qual_parts = qual_name.rsplit('|', 1)
+    if len(qual_parts) > 1:
+        namespace, name = qual_parts
+    else:
+        name = qual_name
+    return (package, name, namespace)
+
+def parse_port_spec_item_string(spec, cur_package=None):
+    spec = spec.strip()
+    spec_arr = spec.split(':', 2)
+    if len(spec_arr) > 2:
+        # switch format of spec to more natural
+        # <package>:<namespace>|<name> for descriptor parsing
+        spec = '%s:%s|%s' % (spec_arr[0], spec_arr[2], spec_arr[1])
+    return parse_descriptor_string(spec, cur_package)
+
+def create_port_spec_item_string(package, name, namespace=None, 
+                                 old_style=False):
+    if old_style:
+        if namespace:
+            namespace = ':' + namespace
+        return '%s:%s%s' % (package, name, namespace)
+    else:
+        return create_descriptor_string(package, name, namespace)
+
+def parse_port_spec_string(p_string, cur_package=None):
+    port_spec = p_string.strip()
+    if port_spec.startswith('('):
+        port_spec = port_spec[1:]
+    if port_spec.endswith(')'):
+        port_spec = port_spec[:-1]
+    if port_spec.strip() == '':
+        return []
+
+    specs_list = []
+    for spec in port_spec.split(','):
+        specs_list.append(parse_port_spec_item_string(spec, 
+                                                      cur_package))
+    return specs_list
+
+
+def create_port_spec_string(specs_list, old_style=False):
+    return '(' + ','.join(create_port_spec_item_string(
+            *(specs + ((None, old_style) if len(specs) < 3 else (old_style,))))
+                          for specs in specs_list) + ')'
+
+def expand_port_spec_string(p_string, cur_package=None, 
+                            old_style=False):
+    specs_list = parse_port_spec_string(p_string, cur_package)
+    return create_port_spec_string(specs_list, old_style)
+
+
+def make_modules_dict(*dcts, **kwargs):
+    """Makes a dictionary suitable to be exposed as the '_modules' of a package.
+
+    This combines dictionaries hierarchically to make a global dict from other
+    "sub-dicts", allowing to structure a package with subpackages.
+
+    For example, you could have:
+        a/aa.py:
+            _modules = {'aa': [Some, Module]}
+        a/__init__.py:
+            from .aa import _modules as aa_modules
+            from .ab import _modules as bb_modules
+            _modules = make_modules_dict(aa_modules, bb_modules, namespace='a')
+        b.py:
+            _modules = {'b': [Other, Modules]}
+        init.py:
+            from .a import _modules as a_modules
+            from .b import _modules as b_modules
+            _modules = make_modules_dict(a_modules, b_modules)
+
+    The resulting module hierarchy will be:
+        a.aa.Some, a.aa.Module
+        b.Other, b.Modules
+    """
+    namespace = kwargs.pop('namespace', '')
+    if kwargs:
+        raise TypeError("make_modules_dict got unexpected keyword arguments")
+    if namespace:
+        build_namespace = lambda n: '%s|%s' % (namespace, n)
+    else:
+        build_namespace = lambda n: n
+
+    dct = dict()
+    for d in dcts:
+        if not isinstance(d, dict):
+            d = {'': d}
+
+        for subname, sublist in d.iteritems():
+            if subname:
+                name = build_namespace(subname)
+            else:
+                name = namespace
+            dct.setdefault(name, []).extend(sublist)
+
+    return dct
+
+
+###############################################################################
+
+import unittest
+
+
+class UnorderedList(object):
+    def __init__(self, *elems):
+        self._set = set(elems)
+
+    def __eq__(self, other):
+        return set(other) == self._set
+
+    def __str__(self):
+        return 'ul(%s)' % ', '.join(repr(e) for e in self._set)
+
+    def __repr__(self):
+        return str(self)
+
+
+class TestModulesDict(unittest.TestCase):
+    def test_modulesdict(self):
+        ul = UnorderedList
+        pkg_a_aa = {'aa': [1, 2], 'aa|n': [3]}
+        pkg_a_ab = {'ab': [4, 5]}
+        pkg_a = make_modules_dict(pkg_a_aa, pkg_a_ab, [12, 13], namespace='a')
+        self.assertEqual(set(pkg_a.keys()),
+                         set(['a', 'a|aa', 'a|aa|n', 'a|ab']))
+        pkg_b = {'b': [6, 7]}
+        glob = [10, 11]
+        more = {'a|aa': [8, 9]}
+        pkg = make_modules_dict(pkg_a, pkg_b, glob, more)
+        self.assertEqual(
+                pkg,
+                {
+                    '': ul(10, 11),
+                    'a': ul(12, 13),
+                    'a|aa': ul(1, 2, 8, 9),
+                    'a|aa|n': ul(3),
+                    'a|ab': ul(4, 5),
+                    'b': ul(6, 7)})
diff --git a/vistrails/core/modules/vistrails_module.py b/vistrails/core/modules/vistrails_module.py
new file mode 100644
index 0000000..d2dd47a
--- /dev/null
+++ b/vistrails/core/modules/vistrails_module.py
@@ -0,0 +1,752 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from itertools import izip
+
+from vistrails.core.data_structures.bijectivedict import Bidict
+
+class NeedsInputPort(Exception):
+    def __init__(self, obj, port):
+        self.obj = obj
+        self.port = port
+    def __str__(self):
+        return "Module %s needs port %s" % (self.obj, self.port)
+
+
+class IncompleteImplementation(Exception):
+    def __str__(self):
+        return "Module has incomplete implementation"
+
+
+class MissingModule(Exception):
+    pass
+
+class ModuleBreakpoint(Exception):
+    def __init__(self, module):
+        self.module = module
+        self.msg = "Hit breakpoint"
+        self.errorTrace = ''
+
+    def __str__(self):
+        retstr = "Encoutered breakpoint at Module %s:\n" % (self.module)
+        for k in self.module.__dict__.keys():
+            retstr += "\t%s = %s\n" % (k, self.module.__dict__[k])
+
+        inputs = self.examine_inputs()
+        retstr += "\nModule has inputs:\n"
+        
+        for i in inputs.keys():
+            retstr += "\t%s = %s\n" % (i, inputs[i])
+
+        return retstr
+
+    def examine_inputs(self):
+        in_ports = self.module.__dict__["inputPorts"]
+        inputs = {}
+        for p in in_ports:
+            inputs[p] = self.module.getInputListFromPort(p)
+
+        return inputs
+
+class ModuleHadError(Exception):
+    """Exception occurring when a module that failed gets updated again.
+
+    It is caught by the interpreter that doesn't log it.
+    """
+    def __init__(self, module):
+        self.module = module
+
+class ModuleWasSuspended(ModuleHadError): 
+    """Exception occurring when a module that was suspended gets updated again. 
+    """
+
+class ModuleError(Exception):
+
+    """Exception representing a VisTrails module runtime error. This
+exception is recognized by the interpreter and allows meaningful error
+reporting to the user and to the logging mechanism."""
+    
+    def __init__(self, module, errormsg, abort=False):
+        """ModuleError should be passed the module instance that signaled the
+error and the error message as a string."""
+        Exception.__init__(self, errormsg)
+        self.abort = abort # force abort even if stopOnError is False
+        self.module = module
+        self.msg = errormsg
+        import traceback
+        self.errorTrace = traceback.format_exc()
+
+class ModuleSuspended(ModuleError):
+    """Exception representing a VisTrails module being suspended. Raising 
+    ModuleSuspended flags that the module is not ready to finish yet and
+    that the workflow should be executed later.  A suspended module does
+    not execute the modules downstream but all other branches will be
+    executed. This is useful when executing external jobs where you do not
+    want to block vistrails while waiting for the execution to finish.
+
+    'queue' is a class instance that should provide a finished() method for
+    checking if the job has finished
+
+    'children' is a list of ModuleSuspended instances that is used for nested
+    modules
+    
+    """
+    
+    def __init__(self, module, errormsg, queue=None, children=None):
+        self.queue = queue
+        self.children = children
+        ModuleError.__init__(self, module, errormsg)
+
+class ModuleErrors(Exception):
+    """Exception representing a list of VisTrails module runtime errors.
+    This exception is recognized by the interpreter and allows meaningful
+    error reporting to the user and to the logging mechanism."""
+    def __init__(self, module_errors):
+        """ModuleErrors should be passed a list of ModuleError objects"""
+        Exception.__init__(self, str(tuple(me.msg for me in module_errors)))
+        self.module_errors = module_errors
+
+class _InvalidOutput(object):
+    """ Specify an invalid result
+    """
+    pass
+
+InvalidOutput = _InvalidOutput
+
+################################################################################
+# DummyModuleLogging
+
+class DummyModuleLogging(object):
+    def end_update(self, *args, **kwargs): pass
+    def begin_update(self, *args, **kwargs): pass
+    def begin_compute(self, *args, **kwargs): pass
+    def update_cached(self, *args, **kwargs): pass
+    def signalSuccess(self, *args, **kwargs): pass
+    def annotate(self, *args, **kwargs): pass
+
+_dummy_logging = DummyModuleLogging()
+
+################################################################################
+# Serializable
+
+class Serializable(object):
+    """
+    Serializable is a mixin class used to define methods to serialize and
+    deserialize modules. 
+    """
+    
+    def serialize(self):
+        """
+        Method used to serialize a module.
+        """
+        raise NotImplementedError('The serialize method is not defined for this module.')
+    
+    def deserialize(self):
+        """
+        Method used to deserialize a module.
+        """
+        raise NotImplementedError('The deserialize method is not defined for this module.')
+
+################################################################################
+# Module
+
+class Module(Serializable):
+
+    """Module is the base module from which all module functionality
+is derived from in VisTrails. It defines a set of basic interfaces to
+deal with data input/output (through ports, as will be explained
+later), as well as a basic mechanism for dataflow based updates.
+
+Execution Model
+
+  VisTrails assumes fundamentally that a pipeline is a dataflow. This
+  means that pipeline cycles are disallowed, and that modules are
+  supposed to be free of side-effects. This is obviously not possible
+  in general, particularly for modules whose sole purpose is to
+  interact with operating system resources. In these cases, designing
+  a module is harder -- the side effects should ideally not be exposed
+  to the module interface.  VisTrails provides some support for making
+  this easier, as will be discussed later.
+
+  VisTrails caches intermediate results to increase efficiency in
+  exploration. It does so by reusing pieces of pipelines in later
+  executions.
+  
+Terminology
+
+  Module Interface: The module interface is the set of input and
+  output ports a module exposes.
+
+Designing New Modules
+
+  Designing new modules is essentially a matter of subclassing this
+  module class and overriding the compute() method. There is a
+  fully-documented example of this on the default package
+  'pythonCalc', available on the 'packages/pythonCalc' directory.
+
+  Caching
+
+    Caching affects the design of a new module. Most importantly,
+    users have to account for compute() being called more than
+    once. Even though compute() is only called once per individual
+    execution, new connections might mean that previously uncomputed
+    output must be made available.
+
+    Also, operating system side-effects must be carefully accounted
+    for. Some operations are fundamentally side-effectful (creating OS
+    output like uploading a file on the WWW or writing a file to a
+    local hard drive). These modules should probably not be cached at
+    all. VisTrails provides an easy way for modules to report that
+    they should not be cached: simply subclass from the NotCacheable
+    mixin provided in this python module. (NB: In order for the mixin
+    to work appropriately, NotCacheable must appear *BEFORE* any other
+    subclass in the class hierarchy declarations). These modules (and
+    anything that depends on their results) will then never be reused.
+
+
+  Intermediate Files
+
+    Many modules communicate through intermediate files. VisTrails
+    provides automatic filename and handle management to alleviate the
+    burden of determining tricky things (e.g. longevity) of these
+    files. Modules can request temporary file names through the file pool,
+    currently accessible through
+
+    self.interpreter.filePool
+
+    The FilePool class is available in core/modules/module_utils.py -
+    consult its documentation for usage. Notably, using the file pool
+    will make temporary files work correctly with caching, and will
+    make sure the temporaries are correctly removed.
+
+
+
+"""
+
+    def __init__(self):
+        self.inputPorts = {}
+        self.outputPorts = {}
+        self.upToDate = False
+        self.had_error = False
+        self.was_suspended = False
+        self.setResult("self", self) # every object can return itself
+        self.logging = _dummy_logging
+
+        # isMethod stores whether a certain input port is a method.
+        # If so, isMethod maps the port to the order in which it is
+        # stored. This is so that modules that need to know about the
+        # method order can work correctly
+        self.is_method = Bidict()
+        self._latest_method_order = 0
+        
+        # Pipeline info that a module should know about This is useful
+        # for a spreadsheet cell to know where it is from. It will be
+        # also used for talking back and forth between the spreadsheet
+        # and the builder besides Parameter Exploration.
+        self.moduleInfo = {
+            'locator': None,
+            'controller': None,
+            'vistrailName': 'Unknown',
+            'version': -1,
+            'pipeline': None,
+            'moduleId': -1,
+            'reason': 'Pipeline Execution',
+            'actions': []
+            }
+
+        self.is_breakpoint = False
+
+        # is_looping stores wether the module is a part of a loop
+        self.is_looping = False
+
+        # is_looping_module stores whether the module is a looping module
+        self.is_looping_module = False
+
+        # computed stores wether the module was computed
+        # used for the logging stuff
+        self.computed = False
+        
+        self.suspended = False
+
+        self.signature = None
+        
+        # stores whether the output of the module should be annotated in the
+        # execution log
+        self.annotate_output = False
+
+    def __copy__(self):
+        """Makes a copy of the input/output ports on shallow copy.
+        """
+        s = super(Module, self)
+        if hasattr(s, '__copy__'):
+            clone = s.__copy__()
+        else:
+            clone = object.__new__(self.__class__)
+            clone.__dict__ = self.__dict__.copy()
+        clone.inputPorts = copy.copy(self.inputPorts)
+        clone.outputPorts = copy.copy(self.outputPorts)
+        clone.outputPorts['self'] = clone
+        return clone
+
+    def clear(self):
+        """clear(self) -> None. Removes all references, prepares for
+deletion."""
+        for connector_list in self.inputPorts.itervalues():
+            for connector in connector_list:
+                connector.clear()
+        self.inputPorts = {}
+        self.outputPorts = {}
+        self.logging = _dummy_logging
+        self.is_method = Bidict()
+        self._latest_method_order = 0
+
+    def is_cacheable(self):
+        """is_cacheable() -> bool. A Module should return whether it
+can be reused across executions. It is safe for a Module to return
+different values in different occasions. In other words, it is
+possible for modules to be cacheable depending on their execution
+context."""
+        return True
+
+    def updateUpstreamPort(self, port):
+        # update single port
+        if port in self.inputPorts:
+            for connector in self.inputPorts[port]:
+                connector.obj.update()
+                if hasattr(connector.obj, 'suspended') and \
+                   connector.obj.suspended:
+                    self.suspended = connector.obj.suspended
+            for connector in copy.copy(self.inputPorts[port]):
+                if connector.obj.get_output(connector.port) is InvalidOutput:
+                    self.removeInputConnector(port, connector)
+
+    def updateUpstream(self):
+        """ updateUpstream() -> None        
+        Go upstream from the current module, then update its upstream
+        modules and check input connection based on upstream modules
+        results
+        
+        """
+        for connectorList in self.inputPorts.itervalues():
+            for connector in connectorList:
+                connector.obj.update()
+                if hasattr(connector.obj, 'suspended') and \
+                   connector.obj.suspended:
+                    self.suspended = connector.obj.suspended
+        for iport, connectorList in copy.copy(self.inputPorts.items()):
+            for connector in connectorList:
+                if connector.obj.get_output(connector.port) is InvalidOutput:
+                    self.removeInputConnector(iport, connector)
+                    
+    def update(self):
+        """ update() -> None        
+        Check if the module is up-to-date then update the
+        modules. Report to the logger if available
+        
+        """
+        if self.had_error:
+            raise ModuleHadError(self)
+        elif self.was_suspended:
+            raise ModuleWasSuspended(self)
+        elif self.computed:
+            return
+        self.logging.begin_update(self)
+        self.updateUpstream()
+        if self.suspended:
+            self.had_error = True
+            return
+        if self.upToDate:
+            if not self.computed:
+                self.logging.update_cached(self)
+                self.computed = True
+            return
+        self.had_error = True # Unset later in this method
+        self.logging.begin_compute(self)
+        try:
+            if self.is_breakpoint:
+                raise ModuleBreakpoint(self)
+            self.compute()
+            self.computed = True
+        except ModuleSuspended, e:
+            self.suspended = e.msg
+            self._module_suspended = e
+            self.had_error, self.was_suspended = False, True
+            self.logging.end_update(self, e, was_suspended=True)
+            self.logging.signalSuspended(self)
+            return
+        except ModuleError, me:
+            if hasattr(me.module, 'interpreter'):
+                raise
+            else:
+                msg = "A dynamic module raised an exception: '%s'"
+                msg %= str(me)
+                raise ModuleError(self, msg)
+        except ModuleErrors:
+            raise
+        except KeyboardInterrupt, e:
+            raise ModuleError(self, 'Interrupted by user')
+        except ModuleBreakpoint:
+            raise
+        except Exception, e: 
+            import traceback
+            traceback.print_exc()
+            raise ModuleError(self, 'Uncaught exception: "%s"' % str(e))
+        if self.annotate_output:
+            self.annotate_output_values()
+        self.upToDate = True
+        self.had_error = False
+        self.logging.end_update(self)
+        self.logging.signalSuccess(self)
+
+    def checkInputPort(self, name):
+        """checkInputPort(name) -> None.
+Makes sure input port 'name' is filled."""
+        if not self.hasInputFromPort(name):
+            raise ModuleError(self, "'%s' is a mandatory port" % name)
+
+    def compute(self):
+        pass
+
+    def setResult(self, port, value):
+        self.outputPorts[port] = value
+        
+    def annotate_output_values(self):
+        output_values = []
+        for port in self.outputPorts:
+            output_values.append((port, self.outputPorts[port]))
+        self.logging.annotate(self, {'output': output_values})
+
+    def get_output(self, port):
+        # if self.outputPorts.has_key(port) or not self.outputPorts[port]: 
+        if port not in self.outputPorts:
+            raise ModuleError(self, "output port '%s' not found" % port)
+        return self.outputPorts[port]
+
+    def getInputConnector(self, inputPort):
+        if not self.inputPorts.has_key(inputPort):
+            raise ModuleError(self, "Missing value from port %s" % inputPort)
+        return self.inputPorts[inputPort][0]
+
+    def getDefaultValue(self, inputPort):
+        reg = self.registry
+
+        d = None
+        try:
+            d = reg.get_descriptor(self.__class__)
+        except:
+            pass
+        if not d:
+            return None
+
+        ps = None
+        try:
+            ps = reg.get_port_spec_from_descriptor(d, inputPort, 'input')
+        except:
+            pass
+        if not ps:
+            return None
+
+        if len(ps.port_spec_items) == 1:
+            psi = ps.port_spec_items[0]
+            if psi.default is not None:
+                m_klass = psi.descriptor.module
+                return m_klass.translate_to_python(psi.default)
+        else:
+            default_val = []
+            default_valid = True
+            for psi in ps.port_spec_items:
+                if psi.default is None:
+                    default_valid = False
+                    break
+                m_klass = psi.descriptor.module
+                default_val.append(
+                    m_klass.translate_to_python(psi.default))
+            if default_valid:
+                return tuple(default_val)
+
+        return None
+
+    def getInputFromPort(self, inputPort, allowDefault=True):
+        if inputPort not in self.inputPorts:
+            if allowDefault and self.registry:
+                defaultValue = self.getDefaultValue(inputPort)
+                if defaultValue is not None:
+                    return defaultValue
+            raise ModuleError(self, "Missing value from port %s" % inputPort)
+        # Cannot resolve circular reference here, need to be fixed later
+        from vistrails.core.modules.sub_module import InputPort
+        for conn in self.inputPorts[inputPort]:
+            if isinstance(conn.obj, InputPort):
+                return conn()
+        return self.inputPorts[inputPort][0]()
+
+    def hasInputFromPort(self, inputPort):
+        return self.inputPorts.has_key(inputPort)
+
+    def __str__(self):
+        return "<<%s>>" % str(self.__class__)
+
+    def annotate(self, d):
+        self.logging.annotate(self, d)
+
+    def forceGetInputFromPort(self, inputPort, defaultValue=None):
+        if self.hasInputFromPort(inputPort):
+            return self.getInputFromPort(inputPort)
+        else:
+            return defaultValue
+
+    def set_input_port(self, inputPort, conn, is_method=False):
+        if self.inputPorts.has_key(inputPort):
+            self.inputPorts[inputPort].append(conn)
+        else:
+            self.inputPorts[inputPort] = [conn]
+        if is_method:
+            self.is_method[conn] = (self._latest_method_order, inputPort)
+            self._latest_method_order += 1
+
+    def getInputListFromPort(self, inputPort):
+        if not self.inputPorts.has_key(inputPort):
+            raise ModuleError(self, "Missing value from port %s" % inputPort)
+        # Cannot resolve circular reference here, need to be fixed later
+        from vistrails.core.modules.sub_module import InputPort
+        fromInputPortModule = [connector()
+                               for connector in self.inputPorts[inputPort]
+                               if isinstance(connector.obj, InputPort)]
+        if len(fromInputPortModule)>0:
+            return fromInputPortModule
+        return [connector() for connector in self.inputPorts[inputPort]]
+
+    def forceGetInputListFromPort(self, inputPort):
+        if not self.inputPorts.has_key(inputPort):
+            return []
+        return self.getInputListFromPort(inputPort)
+
+    def enableOutputPort(self, outputPort):
+        """ enableOutputPort(outputPort: str) -> None
+        Set an output port to be active to store result of computation
+        
+        """
+        # Don't reset existing values, it screws up the caching.
+        if not self.outputPorts.has_key(outputPort):
+            self.setResult(outputPort, None)
+            
+    def removeInputConnector(self, inputPort, connector):
+        """ removeInputConnector(inputPort: str,
+                                 connector: ModuleConnector) -> None
+        Remove a connector from the connection list of an input port
+        
+        """
+        if self.inputPorts.has_key(inputPort):
+            conList = self.inputPorts[inputPort]
+            if connector in conList:
+                conList.remove(connector)
+            if conList==[]:
+                del self.inputPorts[inputPort]
+
+    def create_instance_of_type(self, ident, name, ns=''):
+        """ Create a vistrails module from the module registry.  This creates an instance of the module
+        for use in creating the object output by a Module.
+        """
+        from vistrails.core.modules.module_registry import get_module_registry
+        try:
+            reg = get_module_registry()
+            m = reg.get_module_by_name(ident, name, ns)
+            return m()
+        except:
+            msg = "Cannot get module named " + str(name) + \
+                  " with identifier " + str(ident) + " and namespace " + ns
+            raise ModuleError(self, msg)
+
+    @classmethod
+    def provide_input_port_documentation(cls, port_name):
+        return None
+
+    @classmethod
+    def provide_output_port_documentation(cls, port_name):
+        return None
+
+################################################################################
+
+class NotCacheable(object):
+
+    def is_cacheable(self):
+        return False
+
+################################################################################
+
+class Converter(Module):
+    """Base class for automatic conversion modules.
+
+    Modules that subclass Converter will be inserted automatically when
+    connecting incompatible ports, if possible.
+
+    You must override the 'in_value' and 'out_value' ports by providing the
+    types your module actually matches.
+
+    Alternatively, you can override the classmethod can_convert() to provide
+    a custom condition.
+    """
+    @classmethod
+    def can_convert(cls, sub_descs, super_descs):
+        from vistrails.core.modules.module_registry import get_module_registry
+        from vistrails.core.system import get_vistrails_basic_pkg_id
+        reg = get_module_registry()
+        basic_pkg = get_vistrails_basic_pkg_id()
+        variant_desc = reg.get_descriptor_by_name(basic_pkg, 'Variant')
+        desc = reg.get_descriptor(cls)
+
+        def check_types(sub_descs, super_descs):
+            for (sub_desc, super_desc) in izip(sub_descs, super_descs):
+                if (sub_desc == variant_desc or super_desc == variant_desc):
+                    continue
+                if not reg.is_descriptor_subclass(sub_desc, super_desc):
+                    return False
+            return True
+
+        in_port = reg.get_port_spec_from_descriptor(
+                desc,
+                'in_value', 'input')
+        if (len(sub_descs) != len(in_port.descriptors()) or
+                not check_types(sub_descs, in_port.descriptors())):
+            return False
+        out_port = reg.get_port_spec_from_descriptor(
+                desc,
+                'out_value', 'output')
+        if (len(out_port.descriptors()) != len(super_descs)
+                or not check_types(out_port.descriptors(), super_descs)):
+            return False
+
+        return True
+
+    def compute(self):
+        raise NotImplementedError
+
+################################################################################
+
+class ModuleConnector(object):
+    def __init__(self, obj, port, spec=None, typecheck=None):
+        # typecheck is a list of booleans indicating which descriptors to
+        # typecheck
+        self.obj = obj
+        self.port = port
+        self.spec = spec
+        self.typecheck = typecheck
+
+    def clear(self):
+        """clear() -> None. Removes references, prepares for deletion."""
+        self.obj = None
+        self.port = None
+
+    def __call__(self):
+        result = self.obj.get_output(self.port)
+        if self.spec is not None and self.typecheck is not None:
+            descs = self.spec.descriptors()
+            typecheck = self.typecheck
+            if len(descs) == 1:
+                if not typecheck[0]:
+                    return result
+                mod = descs[0].module
+                if hasattr(mod, 'validate') and not mod.validate(result):
+                    raise ModuleError(self.obj, "Type passed on Variant port "
+                                      "%s does not match destination type "
+                                      "%s" % (self.port, descs[0].name))
+            else:
+                if len(typecheck) == 1:
+                    if typecheck[0]:
+                        typecheck = [True] * len(descs)
+                    else:
+                        return result
+                if not isinstance(result, tuple):
+                    raise ModuleError(self.obj, "Type passed on Variant port "
+                                      "%s is not a tuple" % self.port)
+                elif len(result) != len(descs):
+                    raise ModuleError(self.obj, "Object passed on Variant "
+                                      "port %s does not have the correct "
+                                      "length (%d, expected %d)" % (
+                                      self.port, len(result), len(descs)))
+                for i, desc in enumerate(descs):
+                    if not typecheck[i]:
+                        continue
+                    mod = desc.module
+                    if hasattr(mod, 'validate'):
+                        if not mod.validate(result[i]):
+                            raise ModuleError(
+                                    self.obj,
+                                    "Element %d of tuple passed on Variant "
+                                    "port %s does not match the destination "
+                                    "type %s" % (i, self.port, desc.name))
+        return result
+
+def new_module(baseModule, name, dict={}, docstring=None):
+    """new_module(baseModule or [baseModule list],
+                  name,
+                  dict={},
+                  docstring=None
+
+    Creates a new VisTrails module dynamically. Exactly one of the
+    elements of the baseModule list (or baseModule itself, in the case
+    it's a single class) should be a subclass of Module.
+    """
+    if isinstance(baseModule, type):
+        assert issubclass(baseModule, Module)
+        superclasses = (baseModule, )
+    elif isinstance(baseModule, list):
+        assert len([x for x in baseModule
+                    if issubclass(x, Module)]) == 1
+        superclasses = tuple(baseModule)
+    d = copy.copy(dict)
+    if docstring:
+        d['__doc__'] = docstring
+    return type(name, superclasses, d)
+    
+# This is the gist of how type() works. The example is run from a python
+# toplevel
+
+# >>> class X(object):
+# ...     def f(self): return 3
+# ... 
+# >>> a = X()
+# >>> a.f()
+# 3
+# >>> Y = type('Y', (X, ), {'g': lambda x : 4})
+# >>> b = Y()
+# >>> b.f()
+# 3
+# >>> b.g()
+# 4
+# >>> Z = type('Z', (X, ), {'f': lambda x : 4} )
+# >>> c = Z()
+# >>> c.f()
+# 4
diff --git a/vistrails/core/packagemanager.py b/vistrails/core/packagemanager.py
new file mode 100644
index 0000000..7a5d87b
--- /dev/null
+++ b/vistrails/core/packagemanager.py
@@ -0,0 +1,932 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""The package manager takes care of everything that has got to do
+with handling packages, from setting paths to adding new packages
+to checking dependencies to initializing them."""
+import copy
+import inspect
+import itertools
+import os
+import sys
+import warnings
+
+from vistrails.core import debug, get_vistrails_application
+from vistrails.core.configuration import ConfigurationObject
+import vistrails.core.data_structures.graph
+import vistrails.core.db.io
+from vistrails.core.modules.module_registry import ModuleRegistry, \
+                                         MissingPackage, MissingPackageVersion
+from vistrails.core.modules.package import Package
+from vistrails.core.utils import VistrailsInternalError, InstanceObject, \
+    versions_increasing, VistrailsDeprecation
+import vistrails.packages
+##############################################################################
+
+
+global _package_manager
+_package_manager = None
+
+class PackageManager(object):
+    # # add_package_menu_signal is emitted with a tuple containing the package
+    # # identifier, package name and the menu item
+    # add_package_menu_signal = QtCore.SIGNAL("add_package_menu")
+    # # remove_package_menu_signal is emitted with the package identifier
+    # remove_package_menu_signal = QtCore.SIGNAL("remove_package_menu")
+    # # package_error_message_signal is emitted with the package identifier,
+    # # package name and the error message
+    # package_error_message_signal = QtCore.SIGNAL("package_error_message_signal")
+    # # reloading_package_signal is emitted when a package reload has disabled
+    # # the packages, but has not yet enabled them
+    # reloading_package_signal = QtCore.SIGNAL("reloading_package_signal")
+
+    class DependencyCycle(Exception):
+        def __init__(self, p1, p2):
+            self._package_1 = p1
+            self._package_2 = p2
+        def __str__(self):
+            return ("Packages '%s' and '%s' have cyclic dependencies" %
+                    (self._package_1,
+                     self._package_2))
+
+    class PackageInternalError(Exception):
+        def __init__(self, n, d):
+            self._package_name = n
+            self._description = d
+        def __str__(self):
+            return "Package '%s' has a bug: %s" % (self._package_name,
+                                                   self._description)
+
+    def import_packages_module(self):
+        """Imports the packages module using path trickery to find it
+        in the right place.
+
+        """
+        if self._packages is not None:
+            return self._packages
+        # Imports standard packages directory
+        conf = self._configuration
+        old_sys_path = copy.copy(sys.path)
+        if conf.check('packageDirectory'):
+            sys.path.insert(0, conf.packageDirectory)
+        try:
+            import vistrails.packages
+        except ImportError:
+            debug.critical('ImportError: "packages" sys.path: %s' % sys.path)
+            raise
+        finally:
+            sys.path = old_sys_path
+        self._packages = vistrails.packages
+        return vistrails.packages
+
+    def import_user_packages_module(self):
+        """Imports the packages module using path trickery to find it
+        in the right place.
+
+        """
+        if self._userpackages is not None:
+            return self._userpackages
+        # Imports user packages directory
+        conf = self._configuration
+        old_sys_path = copy.copy(sys.path)
+        if conf.check('userPackageDirectory'):
+            sys.path.insert(0, os.path.join(conf.userPackageDirectory,
+                                            os.path.pardir))
+        try:
+            import userpackages
+        except ImportError:
+            debug.critical('ImportError: "userpackages" sys.path: %s' % sys.path)
+            raise
+        finally:
+            sys.path = old_sys_path
+        os.environ['VISTRAILS_USERPACKAGES_DIR'] = conf.userPackageDirectory
+        self._userpackages = userpackages
+        return userpackages
+
+    def __init__(self, configuration):
+        """__init__(configuration: ConfigurationObject) -> PackageManager
+        configuration is the persistent configuration object of the application.
+        
+        """
+        global _package_manager
+        if _package_manager:
+            m = "Package manager can only be constructed once."
+            raise VistrailsInternalError(m)
+        _package_manager = self
+        self._configuration = configuration
+
+        # Contains packages that have not yet been enabled, but exist on the
+        # filesystem
+        self._available_packages = {} # codepath: str -> Package
+        # These other lists contain enabled packages
+        self._package_list = {} # codepath: str -> Package
+        self._package_versions = {} # identifier: str -> version -> Package
+        self._old_identifier_map = {} # old_id: str -> new_id: str
+        self._dependency_graph = vistrails.core.data_structures.graph.Graph()
+
+        self._registry = None
+        self._userpackages = None
+        self._packages = None
+        self._abstraction_pkg = None
+        self._currently_importing_package = None
+
+    def init_registry(self, registry_filename=None):
+        if registry_filename is not None:
+            self._registry = vistrails.core.db.io.open_registry(registry_filename)
+            self._registry.set_global()
+        else:
+            self._registry = ModuleRegistry()
+            self._registry.set_global()
+
+            def setup_basic_package():
+                # setup basic package
+                basic_package = self.add_package('basic_modules')
+                # FIXME need to serialize old_identifiers
+                basic_package.old_identifiers = ['edu.utah.sci.vistrails.basic']
+                self._registry._default_package = basic_package
+                prefix_dictionary = {'basic_modules': 'vistrails.core.modules.'}
+                self.initialize_packages(prefix_dictionary)
+            setup_basic_package()
+
+            self._abstraction_pkg = self.add_package('abstraction', False)
+            # FIXME need to get this info from the package, but cannot
+            # do this since controller isn't imported yet
+            self._abstraction_pkg.identifier = 'local.abstractions'
+            self._abstraction_pkg.name = 'My SubWorkflows'
+            self._abstraction_pkg.version = '1.6'
+            self._registry.add_package(self._abstraction_pkg)
+
+        # Setup a global __import__ hook that calls Package#import_override()
+        # for all imports executed from that package
+        import __builtin__
+        self._orig_import = __builtin__.__import__
+        __builtin__.__import__ = self._import_override
+
+    def _import_override(self,
+                         name, globals={}, locals={}, fromlist=[], level=-1):
+        # Get the caller module, using globals (like the original __import
+        # does)
+        try:
+            if globals is None:
+                raise KeyError
+            module = globals['__name__']
+        except KeyError:
+            # Another method of getting the caller module, using the stack
+            caller = inspect.currentframe().f_back
+            module = inspect.getmodule(caller)
+            # Some frames might not be associated to a module, because of the
+            # use of exec for instance; we just skip these until we reach a
+            # valid one
+            while module is None:
+                caller = caller.f_back
+                if caller is None:
+                    break
+                module = inspect.getmodule(caller)
+            if module:
+                module = module.__name__
+
+        # Get the Package from the module name
+        if module:
+            importing_pkg = None
+            current = self._currently_importing_package
+            if (current is not None and
+                    current.prefix and
+                    module.startswith(current.prefix + current.codepath)):
+                importing_pkg = current
+            else:
+                for pkg in itertools.chain(
+                        self._package_list.itervalues(),
+                        self._available_packages.itervalues()):
+                    if (pkg.prefix is not None and
+                            module.startswith(pkg.prefix + pkg.codepath)):
+                        importing_pkg = pkg
+                        break
+
+            # If we are importing directly from a package
+            if importing_pkg is not None:
+                old_current = self._currently_importing_package
+                self._currently_importing_package = importing_pkg
+                result = importing_pkg.import_override(
+                        self._orig_import,
+                        name, globals, locals, fromlist, level,
+                        package_importing_directly=True)
+                self._currently_importing_package = old_current
+                return result
+            # If we are doing it indirectly (from other stuff imported from a
+            # package)
+            elif self._currently_importing_package is not None:
+                return self._currently_importing_package.import_override(
+                        self._orig_import,
+                        name, globals, locals, fromlist, level,
+                        package_importing_directly=False)
+
+        # Else, this is not from a package
+        return self._orig_import(name, globals, locals, fromlist, level)
+
+    def finalize_packages(self):
+        """Finalizes all installed packages. Call this only prior to
+exiting VisTrails."""
+        for package in self._package_list.itervalues():
+            package.finalize()
+        self._package_list = {}
+        self._package_versions = {}
+        self._old_identifier_map = {}
+        global _package_manager
+        _package_manager = None
+
+    def get_available_package(self, codepath):
+        try:
+            pkg = self._available_packages[codepath]
+        except KeyError:
+            pkg = self._registry.create_package(codepath)
+            self._available_packages[codepath] = pkg
+        return pkg
+
+    def add_package(self, codepath, add_to_package_list=True):
+        """Adds a new package to the manager. This does not initialize it.
+To do so, call initialize_packages()"""
+        package = self.get_available_package(codepath)
+        if add_to_package_list:
+            self.add_to_package_list(codepath, package)
+        return package
+
+    def add_to_package_list(self, codepath, package):
+        self._available_packages[codepath] = package
+        self._package_list[codepath] = package
+
+    def initialize_abstraction_pkg(self, prefix_dictionary):
+        if self._abstraction_pkg is None:
+            raise RuntimeError("Subworkflows packages is None")
+        self.add_to_package_list(self._abstraction_pkg.codepath,
+                                 self._abstraction_pkg)
+        self.late_enable_package(self._abstraction_pkg.codepath, 
+                                 prefix_dictionary, False)
+
+    def remove_old_identifiers(self, identifier):
+        # remove refs in old_identifier_map
+        old_ids = []
+        for old_id, cur_id in self._old_identifier_map.iteritems():
+            if cur_id == identifier:
+                old_ids.append(old_id)
+        for old_id in old_ids:
+            del self._old_identifier_map[old_id]
+
+    def remove_package(self, codepath):
+        """remove_package(name): Removes a package from the system."""
+        pkg = self._package_list[codepath]
+
+        from vistrails.core.interpreter.cached import CachedInterpreter
+        CachedInterpreter.clear_package(pkg.identifier)
+
+        self._dependency_graph.delete_vertex(pkg.identifier)
+        del self._package_versions[pkg.identifier][pkg.version]
+        if len(self._package_versions[pkg.identifier]) == 0:
+            del self._package_versions[pkg.identifier]
+        self.remove_old_identifiers(pkg.identifier)
+        self.remove_menu_items(pkg)
+        pkg.finalize()
+        del self._package_list[codepath]
+        self._registry.remove_package(pkg)
+        app = get_vistrails_application()
+        app.send_notification("package_removed", codepath)
+
+    def has_package(self, identifier, version=None):
+        """has_package(identifer: string) -> Boolean.
+Returns true if given package identifier is present."""
+
+        # check if it's an old identifier
+        identifier = self._old_identifier_map.get(identifier, identifier)
+        if identifier in self._package_versions:
+            return (version is None or 
+                    version in self._package_versions[identifier])
+        return False
+
+    def look_at_available_package(self, codepath):
+        """look_at_available_package(codepath: string) -> Package
+
+        Returns a Package object for an uninstalled package. This does
+        NOT install a package.
+        """
+        return self.get_available_package(codepath)
+
+    def get_package(self, identifier, version=None):
+        # check if it's an old identifier
+        identifier = self._old_identifier_map.get(identifier, identifier)
+        try:
+            package_versions = self._package_versions[identifier]
+            if version is not None:
+                return package_versions[version]
+        except KeyError:
+            # dynamic packages are only registered in the registry
+            try:
+                return self._registry.get_package_by_name(identifier, version)
+            except MissingPackageVersion:
+                return self._registry.get_package_by_name(identifier)
+            
+
+        max_version = '0'
+        max_pkg = None
+        for version, pkg in package_versions.iteritems():
+            if versions_increasing(max_version, version):
+                max_version = version
+                max_pkg = pkg
+        return max_pkg
+
+    def get_package_by_codepath(self, codepath):
+        """get_package_by_codepath(codepath: string) -> Package.
+        Returns a package with given codepath if it is enabled,
+        otherwise throws exception
+        """
+        if codepath not in self._package_list:
+            raise MissingPackage(codepath)
+        else:
+            return self._package_list[codepath]
+
+    def get_package_by_identifier(self, identifier):
+        """get_package_by_identifier(identifier: string) -> Package.
+        Deprecated, use get_package() instead.
+        """
+        warnings.warn(
+                "You should use get_package instead of "
+                "get_package_by_identifier",
+                VistrailsDeprecation,
+                stacklevel=2)
+        return self.get_package(identifier)
+
+    def get_package_configuration(self, codepath):
+        """get_package_configuration(codepath: string) ->
+        ConfigurationObject or None
+
+        Returns the configuration object for the package, if existing,
+        or None. Throws MissingPackage if package doesn't exist.
+        """
+
+        pkg = self.get_package_by_codepath(codepath)
+
+        if not hasattr(pkg.module, 'configuration'):
+            return None
+        else:
+            c = pkg.module.configuration
+            if not isinstance(c, ConfigurationObject):
+                d = "'configuration' attribute should be a ConfigurationObject"
+                raise self.PackageInternalError(codepath, d)
+            return c
+
+    def check_dependencies(self, package, deps):
+        # want to check that necessary version also exists, if specified
+        missing_deps = []
+        for dep in deps:
+            min_version = None
+            max_version = None
+            if isinstance(dep, tuple):
+                identifier = dep[0]
+                if len(dep) > 1:
+                    min_version = dep[1]
+                    if len(dep) > 2:
+                        max_version = dep[2]
+            else:
+                identifier = dep
+
+            # check if it's an old identifier
+            identifier = self._old_identifier_map.get(identifier, identifier)
+            if identifier not in self._package_versions:
+                missing_deps.append((identifier, None, None))
+            else:
+                if min_version is None and max_version is None:
+                    continue
+                found_version = False
+                for version, pkg in \
+                        self._package_versions[identifier].iteritems():
+                    if ((min_version is None or
+                         versions_increasing(min_version, version)) and
+                        (max_version is None or
+                         versions_increasing(version, max_version))):
+                        found_version = True
+                if not found_version:
+                    missing_deps.append((identifier, min_version, max_version))
+
+        if len(missing_deps) > 0:
+            raise Package.MissingDependency(package, missing_deps)
+        return True
+
+    def add_dependencies(self, package):
+        """add_dependencies(package) -> None.  Register all
+        dependencies a package contains by calling the appropriate
+        callback.
+
+        Does not add multiple dependencies - if a dependency is already there,
+        add_dependencies ignores it.
+        """
+        deps = package.dependencies()
+        # FIXME don't hardcode this
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+        if package.identifier != basic_pkg:
+            deps.append(basic_pkg)
+
+        self.check_dependencies(package, deps)
+
+        for dep in deps:
+            if isinstance(dep, tuple):
+                dep_name = dep[0]
+            else:
+                dep_name = dep
+            dep_name = self.get_package(dep_name).identifier
+
+            if not self._dependency_graph.has_edge(package.identifier,
+                                                   dep_name):
+                self._dependency_graph.add_edge(package.identifier, dep_name)
+
+    def late_enable_package(self, codepath, prefix_dictionary={},
+                            needs_add=True):
+        """late_enable_package enables a package 'late', that is,
+        after VisTrails initialization. All dependencies need to be
+        already enabled.
+        """
+        if needs_add:
+            if codepath in self._package_list:
+                msg = 'duplicate package identifier: %s' % codepath
+                raise VistrailsInternalError(msg)
+            self.add_package(codepath)
+        pkg = self.get_package_by_codepath(codepath)
+        try:
+            pkg.load(prefix_dictionary.get(pkg.codepath, None))
+            pkg.create_startup_package_node()
+        except Exception, e:
+            # invert self.add_package
+            del self._package_list[codepath]
+            raise
+        self._dependency_graph.add_vertex(pkg.identifier)
+        if pkg.identifier not in self._package_versions:
+            self._package_versions[pkg.identifier] = {}
+        self._package_versions[pkg.identifier][pkg.version] = pkg
+        for old_id in pkg.old_identifiers:
+            self._old_identifier_map[old_id] = pkg.identifier
+        try:
+            self.add_dependencies(pkg)
+            #check_requirements is now called in pkg.initialize()
+            #pkg.check_requirements()
+            self._registry.initialize_package(pkg)
+            self._registry.signals.emit_new_package(pkg.identifier, True)
+            app = get_vistrails_application()
+            app.send_notification("package_added", codepath)
+            self.add_menu_items(pkg)
+        except Exception, e:
+            del self._package_versions[pkg.identifier][pkg.version]
+            if len(self._package_versions[pkg.identifier]) == 0:
+                del self._package_versions[pkg.identifier]
+            self.remove_old_identifiers(pkg.identifier)
+            self._dependency_graph.delete_vertex(pkg.identifier)
+            # invert self.add_package
+            del self._package_list[codepath]
+            # if we adding the package to the registry, make sure we
+            # remove it if initialization fails
+            try:
+                self._registry.remove_package(pkg)
+            except MissingPackage:
+                pass
+            raise e
+
+    def late_disable_package(self, codepath):
+        """late_disable_package disables a package 'late', that is,
+        after VisTrails initialization. All reverse dependencies need to be
+        already disabled.
+        """
+        pkg = self.get_package_by_codepath(codepath)
+        self.remove_package(codepath)
+        pkg.remove_own_dom_element()
+
+    def reload_package_disable(self, codepath):
+        # for all reverse dependencies, disable them
+        prefix_dictionary = {}
+        pkg = self.get_package_by_codepath(codepath)
+        reverse_deps = []
+        for dep_id in self.all_reverse_dependencies(pkg.identifier):
+            reverse_deps.append(self.get_package(dep_id))
+
+        for dep_pkg in reverse_deps:
+            prefix_dictionary[dep_pkg.codepath] = dep_pkg.prefix
+            self.late_disable_package(dep_pkg.codepath)
+
+        # Queue the re-enabling of the packages so event loop can free
+        # any QObjects whose deleteLater() method is invoked
+        app = get_vistrails_application()
+        app.send_notification("pm_reloading_package", codepath,
+                              reverse_deps, prefix_dictionary)
+        # self.emit(self.reloading_package_signal,
+        #           codepath,
+        #           reverse_deps,
+        #           prefix_dictionary)
+
+    def reload_package_enable(self, reverse_deps, prefix_dictionary):
+        # for all reverse dependencies, enable them
+        for dep_pkg in reversed(reverse_deps):
+            self.late_enable_package(dep_pkg.codepath, prefix_dictionary)
+
+    def initialize_packages(self,prefix_dictionary={}):
+        """initialize_packages(prefix_dictionary={}): None
+
+        Initializes all installed packages. If prefix_dictionary is
+        not {}, then it should be a dictionary from package names to
+        the prefix such that prefix + package_name is a valid python
+        import."""
+
+        packages = self.import_packages_module()
+        userpackages = self.import_user_packages_module()
+
+        failed = []
+        # import the modules
+        for package in self._package_list.itervalues():
+            # print '+ initializing', package.codepath, id(package)
+            if package.initialized():
+                # print '- already initialized'
+                continue
+            try:
+                package.load(prefix_dictionary.get(package.codepath, None))
+            except Package.LoadFailed, e:
+                debug.critical("Package %s failed to load and will be "
+                               "disabled" % package.name, str(e))
+                # We disable the package manually to skip over things
+                # we know will not be necessary - the only thing needed is
+                # the reference in the package list
+                package.remove_own_dom_element()
+                failed.append(package)
+            except Package.InitializationFailed, e:
+                debug.critical("Initialization of package <codepath %s> "
+                               "failed and will be disabled" % \
+                                   package.codepath, str(e))
+                # We disable the package manually to skip over things
+                # we know will not be necessary - the only thing needed is
+                # the reference in the package list
+                package.remove_own_dom_element()
+                failed.append(package)
+            else:
+                if package.identifier not in self._package_versions:
+                    self._package_versions[package.identifier] = {}
+                    self._dependency_graph.add_vertex(package.identifier)
+                elif package.version in \
+                        self._package_versions[package.identifier]:
+                    raise VistrailsInternalError("Duplicate package version: "
+                                                 "'%s' (version %s) in %s" % \
+                                                     (package.identifier, 
+                                                      package.version, 
+                                                      package.codepath))
+                else:
+                    debug.warning('Duplicate package identifier: %s' % \
+                                      package.identifier)
+                self._package_versions[package.identifier][package.version] = \
+                    package
+                for old_id in package.old_identifiers:
+                    self._old_identifier_map[old_id] = package.identifier
+
+        for pkg in failed:
+            del self._package_list[pkg.codepath]
+        failed = []
+
+        # determine dependencies
+        for package in self._package_list.itervalues():
+            try:
+                self.add_dependencies(package)
+            except Package.MissingDependency, e:
+                debug.critical("Dependencies of package %s are missing "
+                               "so it will be disabled" % package.name, str(e))
+            except Exception, e:
+                debug.critical("Got an exception while getting dependencies "
+                               "of %s so it will be disabled" % package.name,
+                               str(e))
+            else:
+                continue
+            package.remove_own_dom_element()
+            self._dependency_graph.delete_vertex(package.identifier)
+            del self._package_versions[package.identifier][package.version]
+            if len(self._package_versions[package.identifier]) == 0:
+                del self._package_versions[package.identifier]
+            self.remove_old_identifiers(package.identifier)
+            failed.append(package)
+
+        for pkg in failed:
+            del self._package_list[pkg.codepath]
+
+        # perform actual initialization
+        try:
+            g = self._dependency_graph.inverse_immutable()
+            sorted_packages = g.vertices_topological_sort()
+        except vistrails.core.data_structures.graph.Graph.GraphContainsCycles, e:
+            raise self.DependencyCycle(e.back_edge[0],
+                                       e.back_edge[1])
+
+        for name in sorted_packages:
+            pkg = self.get_package(name)
+            if not pkg.initialized():
+                #check_requirements is now called in pkg.initialize()
+                #pkg.check_requirements()
+                try:
+                    self._registry.initialize_package(pkg)
+                except Package.InitializationFailed, e:
+                    debug.critical("Initialization of package <codepath %s> "
+                                   "failed and will be disabled" % \
+                                       pkg.codepath, str(e))
+                    # We disable the package manually to skip over things
+                    # we know will not be necessary - the only thing needed is
+                    # the reference in the package list
+                    self.late_disable_package(pkg.codepath)
+#                     pkg.remove_own_dom_element()
+#                     failed.append(package)
+                else:
+                    self.add_menu_items(pkg)
+                    app = get_vistrails_application()
+                    app.send_notification("package_added", pkg.codepath)
+
+
+    def add_menu_items(self, pkg):
+        """add_menu_items(pkg: Package) -> None
+        If the package implemented the function menu_items(),
+        the package manager will emit a signal with the menu items to
+        be added to the builder window """
+        items = pkg.menu_items()
+        if items:
+            app = get_vistrails_application()
+            app.send_notification("pm_add_package_menu", pkg.identifier,
+                                  pkg.name, items)
+            # self.emit(self.add_package_menu_signal,
+            #           pkg.identifier,
+            #           pkg.name,
+            #           items)
+
+    def remove_menu_items(self, pkg):
+        """remove_menu_items(pkg: Package) -> None
+        Send a signal with the pkg identifier. The builder window should
+        catch this signal and remove the package menu items"""
+        if pkg.menu_items():
+            app = get_vistrails_application()
+            app.send_notification("pm_remove_package_menu",
+                                   pkg.identifier)
+            # self.emit(self.remove_package_menu_signal,
+            #           pkg.identifier)
+
+    def show_error_message(self, pkg, msg):
+        """show_error_message(pkg: Package, msg: str) -> None
+        Print a message to standard error output and emit a signal to the
+        builder so if it is possible, a message box is also shown """
+
+        debug.critical("Package %s (%s) says: %s"%(pkg.name,
+                                                   pkg.identifier,
+                                                   msg))
+        app = get_vistrails_application()
+        app.send_notification("pm_package_error_message", pkg.identifier,
+                              pkg.name, msg)
+        # self.emit(self.package_error_message_signal,
+        #           pkg.identifier,
+        #           pkg.name,
+        #           msg)
+
+    def enabled_package_list(self):
+        """package_list() -> returns list of all enabled packages."""
+        return self._package_list.values()
+
+    def identifier_is_available(self, identifier):
+        """identifier_is_available(identifier: str) -> Pkg
+
+        returns true if there exists a package with the given
+        identifier in the list of available (ie, disabled) packages.
+
+        If true, returns succesfully loaded, uninitialized package."""
+        for codepath in self.available_package_names_list():
+            pkg = self.get_available_package(codepath)
+            try:
+                pkg.load()
+                if pkg.identifier == identifier:
+                    return pkg
+                elif identifier in pkg.old_identifiers:
+                    return pkg
+                if (hasattr(pkg._module, "can_handle_identifier") and
+                        pkg._module.can_handle_identifier(identifier)):
+                    return pkg
+            except pkg.LoadFailed:
+                pass
+            except pkg.InitializationFailed:
+                pass
+            except Exception, e:
+                pass
+        return None
+
+    def available_package_names_list(self):
+        """available_package_names_list() -> returns list with code-paths of all
+        available packages, by looking at the appropriate directories.
+
+        The distinction between package names, identifiers and
+        code-paths is described in doc/package_system.txt
+        """
+
+        pkg_name_set = set()
+
+        def is_vistrails_package(path):
+            return ((path.endswith('.py') and
+                     not path.endswith('__init__.py') and
+                     os.path.isfile(path)) or
+                    os.path.isdir(path) and \
+                        os.path.isfile(os.path.join(path, '__init__.py')))
+
+        def search(dirname):
+            for name in os.listdir(dirname):
+                if is_vistrails_package(os.path.join(dirname, name)):
+                    if name.endswith('.py'):
+                        name = name[:-3]
+                    pkg_name_set.add(name)
+
+        # Finds standard packages
+        packages = self.import_packages_module()
+        search(os.path.dirname(packages.__file__))
+        userpackages = self.import_user_packages_module()
+        search(os.path.dirname(userpackages.__file__))
+
+        pkg_name_set.update(self._package_list)
+        return list(pkg_name_set)
+
+    def dependency_graph(self):
+        """dependency_graph() -> Graph.  Returns a graph with package
+        dependencies, where u -> v if u depends on v.  Vertices are
+        strings representing package names."""
+        return self._dependency_graph
+
+    def can_be_disabled(self, identifier):
+        """Returns whether has no reverse dependencies (other
+        packages that depend on it."""
+        return self._dependency_graph.in_degree(identifier) == 0
+
+    def reverse_dependencies(self, identifier):
+        lst = [x[0] for x in
+               self._dependency_graph.inverse_adjacency_list[identifier]]
+        return lst
+
+    # use this call if we're not necessarily loading
+    def build_dependency_graph(self, pkg_identifiers):
+        dep_graph = vistrails.core.data_structures.graph.Graph()
+
+        def process_dependencies(identifier):
+            dep_graph.add_vertex(identifier)
+            pkg = self.identifier_is_available(identifier)
+            if pkg:
+                deps = pkg.dependencies()
+                for dep in deps:
+                    if isinstance(dep, tuple):
+                        dep_name = dep[0]
+                    else:
+                        dep_name = dep
+
+                    if dep_name not in self._dependency_graph.vertices and \
+                            not dep_graph.has_edge(identifier, dep_name):
+                        dep_graph.add_edge(identifier, dep_name)
+                        process_dependencies(dep_name)
+        
+        for pkg_identifier in pkg_identifiers:
+            process_dependencies(pkg_identifier)
+
+        return dep_graph
+
+    def get_ordered_dependencies(self, dep_graph, identifiers=None):
+        try:
+            sorted_packages = dep_graph.vertices_topological_sort(identifiers)
+        except vistrails.core.data_structures.graph.Graph.GraphContainsCycles, e:
+            raise self.DependencyCycle(e.back_edge[0],
+                                       e.back_edge[1])
+        return sorted_packages
+        
+    def get_all_dependencies(self, identifier, reverse=False, dep_graph=None):
+        if dep_graph is None:
+            dep_graph = self._dependency_graph
+
+        if reverse:
+            adj_list = dep_graph.inverse_adjacency_list
+        else:
+            adj_list = dep_graph.adjacency_list
+            
+        all = [identifier]
+        last_adds = [identifier]
+        while len(last_adds) != 0:
+            adds = [x[0] for y in last_adds for x in adj_list[y]]
+            all.extend(adds)
+            last_adds = adds
+        
+        seen = set()
+        order = []
+        for pkg in reversed(all):
+            if pkg not in seen:
+                order.append(pkg)
+                seen.add(pkg)
+        return order        
+
+    def all_dependencies(self, identifier, dep_graph=None):
+        return self.get_all_dependencies(identifier, False, dep_graph)
+
+    def all_reverse_dependencies(self, identifier, dep_graph=None):
+        return self.get_all_dependencies(identifier, True, dep_graph)
+
+def get_package_manager():
+    global _package_manager
+    if not _package_manager:
+        raise VistrailsInternalError("package manager not constructed yet.")
+    return _package_manager
+
+##############################################################################
+
+import unittest
+
+
+class TestImports(unittest.TestCase):
+    def test_package(self):
+        # Hacks PackageManager so that it temporarily uses our test package
+        # instead of userpackages
+        pm = get_package_manager()
+        from vistrails.tests.resources import import_pkg
+        def fake_userpkg_mod():
+            pm._userpackages = import_pkg
+            return import_pkg
+        old_userpackages = pm._userpackages
+        old_import_userpackages = pm.import_user_packages_module
+        pm._userpackages = import_pkg
+        pm.import_user_packages_module = fake_userpkg_mod
+
+        old_fix_names = list(Package.FIX_PACKAGE_NAMES)
+        Package.FIX_PACKAGE_NAMES.append('tests.resources.import_targets')
+
+        try:
+            # Check the package is in the list
+            available_pkg_names = pm.available_package_names_list()
+            self.assertIn('test_import_pkg', available_pkg_names)
+
+            # Import __init__ and check metadata
+            pkg = pm.look_at_available_package('test_import_pkg')
+            pkg.load('vistrails.tests.resources.import_pkg.')
+            self.assertEqual(pkg.identifier,
+                             'org.vistrails.tests.test_import_pkg')
+            self.assertEqual(pkg.version,
+                             '0.42')
+            for n in ['vistrails.tests.resources.import_targets.test1',
+                      'vistrails.tests.resources.import_targets.test2']:
+                self.assertIn(n, sys.modules)
+
+            # Import init.py
+            pm.late_enable_package(
+                    'test_import_pkg',
+                    {'test_import_pkg':
+                     'vistrails.tests.resources.import_pkg.'})
+            pkg = pm.get_package_by_codepath('test_import_pkg')
+            for n in ['vistrails.tests.resources.import_targets.test3',
+                      'vistrails.tests.resources.import_targets.test4',
+                      'vistrails.tests.resources.import_targets.test5']:
+                self.assertIn(n, sys.modules)
+
+            # Check dependencies
+            deps = pkg.get_py_deps()
+            for dep in ['vistrails.tests.resources.import_pkg.test_import_pkg',
+                        'vistrails.tests.resources.import_pkg.test_import_pkg.init',
+                        'vistrails.tests.resources.import_pkg.test_import_pkg.module1',
+                        'vistrails.tests.resources.import_pkg.test_import_pkg.module2',
+                        'vistrails.tests.resources.import_targets',
+                        'vistrails.tests.resources.import_targets.test1',
+                        'vistrails.tests.resources.import_targets.test2',
+                        'vistrails.tests.resources.import_targets.test3',
+                        'vistrails.tests.resources.import_targets.test4',
+                        'vistrails.tests.resources.import_targets.test5',
+                        'vistrails.tests.resources.import_targets.test6']:
+                self.assertIn(dep, deps)
+        finally:
+            pm._userpackages = old_userpackages
+            pm.import_user_packages_module = old_import_userpackages
+            Package.FIX_PACKAGE_NAMES = old_fix_names
+            try:
+                pm.late_disable_package('test_import_pkg')
+            except MissingPackage:
+                pass
diff --git a/vistrails/core/packagerepository.py b/vistrails/core/packagerepository.py
new file mode 100644
index 0000000..2a7a9b5
--- /dev/null
+++ b/vistrails/core/packagerepository.py
@@ -0,0 +1,187 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core import debug
+import os
+import vistrails.core.configuration
+import shutil
+import urllib2
+import tempfile
+import os.path
+
+##############################################################################
+# The local codepaths have '.' replaced by '_' because '.' in the names
+# of directories that will be used as python libraries confuses the Python
+# runtime.
+
+##############################################################################
+
+class PackageRepository(object):
+
+    def __init__(self):
+        conf = vistrails.core.configuration.get_vistrails_configuration()
+        if conf.check('userPackageDirectory'):
+            self._upd = conf.userPackageDirectory
+        else:
+            self._upd = conf.get('dotVistrails') + '/.userpackages/'
+
+    def create_main_directory(self, codepath):
+        debug.log("Makedir '%s'" % (os.path.join(self._upd, codepath)))
+        os.mkdir(os.path.join(self._upd, codepath))
+
+    ##########################################################################
+
+    def create_directory(self, codepath, filename):
+        r = os.path.join(self._upd, codepath, filename)
+        debug.log("Makedir '%s'" % r)
+        os.mkdir(r)
+
+    def copy_file(self, codepath, filename, local_name):
+        r = os.path.join(self._upd,
+                         codepath, filename)
+        debug.log("Copyfile '%s' to '%s'" % (local_name, r))
+        shutil.copyfile(local_name, r)
+
+    ##########################################################################
+    # implement these
+
+    # def find_package(self, identifier):
+    #     pass
+
+    # def install_package(self, identifier):
+    #     pass
+
+    ##########################################################################
+
+    class InvalidPackage(Exception):
+        pass
+
+##############################################################################
+
+class LocalPackageRepository(PackageRepository):
+
+    def __init__(self, repository_path):
+        PackageRepository.__init__(self)
+        self._path = repository_path
+
+    def find_package(self, identifier):
+        lst = set(os.listdir(self._path))
+        codepath = identifier.replace('.', '_')
+        if codepath in lst:
+            return codepath
+
+    def install_package(self, codepath):
+        debug.log("package found!")
+        # read manifest
+        try:
+            f = open(os.path.join(self._path, codepath, 'MANIFEST'))
+        except IOError, e:
+            raise InvalidPackage("Package is missing manifest.")
+        # create directory
+        self.create_main_directory(codepath)
+        for l in f:
+            l = l[:-1]
+            if len(l) == 0:
+                continue
+            file_type = l[0]
+            l = l[2:]
+            if file_type == 'D':
+                self.create_directory(codepath, l)
+            elif file_type == 'F':
+                self.copy_file(codepath, l, os.path.join(self._path, codepath, l))
+
+##############################################################################
+
+class HTTPPackageRepository(PackageRepository):
+
+    def __init__(self, repository_url):
+        PackageRepository.__init__(self)
+        self._path = repository_url
+
+    def find_package(self, identifier):
+        identifier = identifier.replace('.', '_')
+        package_url = self._path + '/' + identifier
+        try:
+            f = urllib2.urlopen(package_url)
+            return identifier
+        except urllib2.HTTPError:
+            return None
+
+    def install_package(self, codepath):
+        debug.log("package found!")
+        # read manifest
+        try:
+            f = urllib2.urlopen(self._path + '/' + codepath + '/MANIFEST')
+        except urllib2.HTTPError, e:
+            raise InvalidPackage("Package is missing manifest.")
+        self.create_main_directory(codepath)
+        for l in f:
+            l = l[:-1]
+            if len(l) == 0:
+                continue
+            file_type = l[0]
+            l = l[2:]
+            if file_type == 'D':
+                self.create_directory(codepath, l)
+            elif file_type == 'F':
+                fd, name = tempfile.mkstemp()
+                os.close(fd)
+                try:
+                    fout = open(name, 'w')
+                    fin = urllib2.urlopen(self._path + '/' + codepath + '/' + l)
+                    fout.write(fin.read()) # There should be a better way to do this
+                    fin.close()
+                    fout.close()
+                    self.copy_file(codepath, l, name)
+                finally:
+                    os.unlink(name)
+
+##############################################################################
+
+_repository = None
+def get_repository():
+    global _repository
+    if _repository:
+        return _repository
+    import vistrails.core.configuration
+    conf = vistrails.core.configuration.get_vistrails_configuration()
+    if conf.check('repositoryHTTPURL'):
+        _repository = HTTPPackageRepository(conf.repositoryHTTPURL)
+        debug.log("Using HTTP Package Repository @ %s" % conf.repositoryHTTPURL)
+    elif conf.check('repositoryLocalPath'):
+        _repository = LocalPackageRepository(conf.repositoryLocalPath)
+        debug.log("Using Local Repository @ %s" % conf.repositoryLocalPath)
+    else:
+        _repository = None
+    return _repository
diff --git a/vistrails/core/param_explore.py b/vistrails/core/param_explore.py
new file mode 100644
index 0000000..2bbba31
--- /dev/null
+++ b/vistrails/core/param_explore.py
@@ -0,0 +1,263 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+This module handles Parameter Exploration in VisTrails
+"""
+from vistrails.core import debug
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+import copy
+
+import unittest
+
+################################################################################
+
+class ParameterExploration(object):
+    """
+    ParameterExploration is a class that will take a pipeline and a
+    set of parameter values and executes all of them
+
+    """
+    
+    def __init__(self, specs):
+        """ ParameterExploration(specs: list) -> ParameterExploration
+        Takes a list of interpolator list. The number of items in the
+        list is also the number of dimensions this parameter
+        exploration is going to explore on
+        
+        """
+        self.specs = specs
+
+    def explore(self, pipeline):
+        """ explore(pipeline: VisPipeline) -> list[VisPipeline]        
+        Apply parameter exploration on multiple dimensions using the
+        values in self.specs
+        
+        """
+        pipelineList = [pipeline]
+        for i in xrange(len(self.specs)):
+            pipelineList = self.interpolateList(pipelineList, self.specs[i])
+        return pipelineList
+
+    def interpolateList(self, pipelineList, interpList):
+        """ interpolateList(pipeline: list[VisPipeLine],
+                            interpList: InterpolateDiscreteParam)
+                            -> list[VisPipeline]                            
+        Returns a list of interpolated pipelines, by applying the
+        interpolators in a multiplication manner
+        
+        """
+        if len(interpList)<1: return pipelineList
+        stepCount = interpList[0].stepCount
+        result = []
+        for step in xrange(stepCount):
+            for pipeline in pipelineList:
+                newp = copy.copy(pipeline)
+                for interp in interpList:
+                    interp.perform(newp, step)
+                result.append(newp)
+        return result
+    
+class InterpolateDiscreteParam(object):
+    """
+    InterpolateDiscreteParam takes in ranges and a number of
+    steps. Then given a pipeline, it will interpolate and generate a
+    number of steps pipelines with values interpolated between the
+    ranges
+    
+    """
+
+    def __init__(self, module, function, ranges, stepCount):
+        """ InterpolateDiscreteParam(module: Module,
+                                     function: str,
+                                     ranges: list(tuple),
+                                     stepCount: int)
+                                     -> InterpolateDiscreteParam
+                                     
+        Initialize the interpolator with a specific module function
+        given a list of parameter ranges
+
+        Keyword arguments:
+        module    --- module id in a pipeline        
+        function  --- a string express the function name that belongs
+                      to module
+                      
+        ranges    --- [tupe(min,max) or tuple(s1,s2..,s{stepCount}],
+                      ranges specified for each argument of function
+                      where s{i} is of type 'str'
+                      
+        stepCount --- the number of step for the interpolation
+                                     
+        """
+        self.module = module
+        self.function = function
+        self.stepCount = stepCount
+        self.values = self.interpolate(ranges, stepCount)
+
+    def interpolate(self, ranges, stepCount):
+        """ interpolate(ranges: tuple, stepCount: int) -> list
+        
+        This function takes a number of (min,max) or (s1,...sn) to
+        interpolate exact stepCount number of step. The output will be
+        a list of stepCount elements where each of them is (a1,...,an).
+        a{i} is either int or string and n is the number of arguments.
+        
+        """
+        params = []
+        for r in ranges:
+            interpolatedValues = []
+            argumentType = type(r[0])
+            if argumentType in [int, float]:
+                for i in xrange(stepCount):
+                    if stepCount>1: t = i/float(stepCount-1)
+                    else: t = 0
+                    interpolatedValues.append(argumentType(r[0]+t*(r[1]-r[0])))
+            elif argumentType==str:
+                interpolatedValues = list(r)
+            else:
+                debug.critical('Cannot interpolate non-cardinal types')
+                assert False
+            params.append(interpolatedValues)
+        return zip(*params)
+        
+        
+    def perform(self, pipeline, step):
+        """ perform(pipeline: VisPipeline, step: int) -> None        
+        This will takes a pipeline and apply the interpolated values
+        at step 'step' to the pipeline. Then return the updated
+        pipeline
+
+        """
+        m = pipeline.modules[self.module.id]
+        f = ModuleFunction()
+        f.name = self.function
+        f.returnType = 'void'
+        value = self.values[step]
+        for v in value:
+            p = ModuleParam()
+            convert = {'int':'Integer', 'str':'String',
+                       'float':'Float', 'double':'Float'}
+            p.type = convert[type(v).__name__]
+            p.strValue = str(v)
+            f.params.append(p)
+        m.functions.append(f)
+
+class ActionBasedParameterExploration(object):
+    """
+    ActionBasedParameterExploration is going to replace
+    ParameterExploration class to perform parameter exploration. It is
+    an action based parameter exploration
+    
+    """
+    def explore(self, pipeline, actions, pre_actions=[]):
+        """ explore(pipeline: Pipeline, actions: [action set],
+                           pre_actions: [action set]) -> [(pipeline, actions)]
+        Perform the parameter exploration on the pipeline with a set
+        of actions. Each 'action set' represent a tuple of actions that we
+        need to apply on the pipeline at a step in a dimension. For example:
+        actions = [[(action1a, action2a), (action1b, action2b)],
+                   [(action3a), (action3b)]]
+                   
+        which means this is a 2 x 1 parameter exploration resulting of
+        executing 2 pipelines. The first one is
+        pipeline.action1a.action2a.action3a and the second one is
+        pipeline.action1b.action2b.action3b.
+        
+        pre_actions are actions that should be applied first to all pipelines
+        and usually contains creation of functions that do not already exist
+
+        The return values are a list of tuples containing interpolated
+        pipeline and a set of actions leading to that interpolated
+        pipeline. This is useful for update the parameter exploration
+        back to the builder.
+        
+        """
+        results = []
+        resultActions = []
+        
+        def exploreDimension(pipeline, performedActions, dim):
+            """ exploreDimension(pipeline: Pipeline, performedActions: [actions],
+                                 dim: int) -> None
+            Start applying actions to the pipeline at dimension
+            dim. 'pipeline' will not be modified in the function
+            
+            """
+            if dim<0:
+                results.append(pipeline)
+                resultActions.append(performedActions)
+                return
+            currentActions = actions[dim]
+            if len(currentActions)==0:
+                # Ignore empty dimension
+                exploreDimension(pipeline, performedActions, dim-1)
+                return
+            for actionSet in currentActions:
+                currentPipeline = copy.copy(pipeline)
+                currentPeformedActions = copy.copy(performedActions)
+                for action in actionSet:
+                    currentPipeline.perform_action(action)
+                    currentPeformedActions.append(action)
+                exploreDimension(currentPipeline, currentPeformedActions, dim-1)
+        
+        # perform pre_actions
+        currentPipeline = copy.copy(pipeline)
+        for action in pre_actions:
+            currentPipeline.perform_action(action)
+        
+        exploreDimension(currentPipeline, pre_actions, len(actions)-1)
+        return (results, resultActions)
+
+################################################################################
+        
+
+class TestParameterExploration(unittest.TestCase):
+    """
+    Test if ParameterExploration is executing correctly. For now it is a very
+    simple test to test more of the interpolated values
+    
+    """
+    def testInterpolator(self):
+        interpolator = InterpolateDiscreteParam(0, 'testing',
+                                                [(0,10),
+                                                 (0.0,10.0),
+                                                 ('one', 'two', 'three')],
+                                                3)
+        self.assertEqual(interpolator.values,
+                         [(0, 0.0, 'one'),
+                          (5, 5.0, 'two'),
+                          (10, 10.0, 'three')])
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/paramexplore/__init__.py b/vistrails/core/paramexplore/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/paramexplore/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/paramexplore/function.py b/vistrails/core/paramexplore/function.py
new file mode 100644
index 0000000..e833463
--- /dev/null
+++ b/vistrails/core/paramexplore/function.py
@@ -0,0 +1,201 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This module contains class definitions for:
+
+    * PEFunction
+"""
+from vistrails.db.domain import DBPEFunction, DBPEParameter
+from vistrails.core.paramexplore.param import PEParam
+import copy
+
+import unittest
+from vistrails.db.domain import IdScope
+
+################################################################################
+
+class PEFunction(DBPEFunction):
+    """ Stores a function for a parameter exploration """
+
+    ##########################################################################
+    # Constructors and copy
+    
+    def __init__(self, *args, **kwargs):
+        DBPEFunction.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = -1
+        if self.module_id is None:
+            self.module_id = -1
+        if self.port_name is None:
+            self.port_name = ""
+        if self.is_alias is None:
+            self.is_alias = 0
+        self.set_defaults()
+        
+    def set_defaults(self, other=None):
+        pass
+
+    def __copy__(self):
+        """ __copy__() -> ModuleFunction - Returns a clone of itself """
+        return PEFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPEFunction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = PEFunction
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_function):
+        if _function.__class__ == PEFunction:
+            return
+        _function.__class__ = PEFunction
+        for _parameter in _function.db_get_parameters():
+            PEParam.convert(_parameter)
+        _function.set_defaults()
+
+    ##########################################################################
+    # Properties
+
+    id = DBPEFunction.db_id
+    module_id = DBPEFunction.db_module_id
+    port_name = DBPEFunction.db_port_name
+    is_alias = DBPEFunction.db_is_alias
+
+    def _get_params(self):
+        self.db_parameters.sort(key=lambda x: x.db_pos)
+        return self.db_parameters
+    def _set_params(self, params):
+        self.db_parameters = params
+
+    parameters = property(_get_params, _set_params)
+    params = property(_get_params, _set_params)
+
+    def add_parameter(self, param):
+        self.db_add_parameter(param)
+    addParameter = add_parameter
+
+    def add_parameters(self, params):
+        for p in params:
+            self.db_add_parameter(p)
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        return ("<PEFunction id=%s module_id=%s port_name='%s' is_alias=%s params=%s)@%X" %
+                (self.id,
+                 self.module_id,
+                 self.port_name,
+                 self.is_alias,
+                 [str(p) for p in self.params],
+                 id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: ModuleFunction) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.port_name != other.port_name:
+            return False
+        if self.module_id != other.module_id:
+            return False
+        if self.is_alias != other.is_alias:
+            return False
+        if len(self.params) != len(other.params):
+            return False
+        for p,q in zip(self.params, other.params):
+            if p != q:
+                return False
+        return True
+            
+    def __ne__(self, other):
+        """ __ne__(other: ModuleFunction) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+
+################################################################################
+# Testing
+
+class TestModuleFunction(unittest.TestCase):
+
+    def create_function(self, id_scope=IdScope()):
+        param = PEParam(id=id_scope.getNewId(PEParam.vtType),
+                            pos=2,
+                            interpolator='Stepper',
+                            dimension=4,
+                            value='[1, 2]')
+        function = PEFunction(id=id_scope.getNewId(PEFunction.vtType),
+                                  module_id=7,
+                                  port_name='value',
+                                  is_alias=0,
+                                  parameters=[param])
+        return function
+
+    def test_copy(self):        
+        id_scope = IdScope()
+        f1 = self.create_function(id_scope)
+        f2 = copy.copy(f1)
+        self.assertEquals(f1, f2)
+        self.assertEquals(f1.id, f2.id)
+        f3 = f1.do_copy(True, id_scope, {})
+        self.assertEquals(f1, f3)
+        self.assertNotEquals(f1.id, f3.id)
+
+    def testComparisonOperators(self):
+        f = self.create_function()
+        g = self.create_function()
+        self.assertEqual(f, g)
+        g.module_id = 1 
+        self.assertNotEqual(f, g)
+        g.module_id = 7
+        g.port_name = "val"
+        self.assertNotEqual(f, g)
+        g.port_name = "value"
+        g.is_alias = 1
+        self.assertNotEqual(f, g)
+
+    def test_str(self):
+        str(self.create_function())
+
+if __name__ == '__main__':
+    unittest.main()
+    
diff --git a/vistrails/core/paramexplore/param.py b/vistrails/core/paramexplore/param.py
new file mode 100644
index 0000000..6a79146
--- /dev/null
+++ b/vistrails/core/paramexplore/param.py
@@ -0,0 +1,170 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This module contains class definitions for:
+    * PEParam
+
+ """
+from vistrails.db.domain import DBPEParameter
+
+import unittest
+import copy
+from vistrails.db.domain import IdScope
+
+################################################################################
+
+class PEParam(DBPEParameter):
+    """ Stores a parameter setting for a parameter exploration function """
+
+    ##########################################################################
+    # Constructor
+
+    def __init__(self, *args, **kwargs):
+        DBPEParameter.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = -1
+        if self.pos is None:
+            self.pos = -1
+        if self.interpolator is None:
+            self.interpolator = ""
+        if self.value is None:
+            self.value = ""
+        if self.dimension is None:
+            self.dimension = -1
+    
+    def __copy__(self):
+        return PEParam.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPEParameter.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = PEParam
+        return cp
+
+    @staticmethod
+    def convert(_parameter):
+        if _parameter.__class__ == PEParam:
+            return
+        _parameter.__class__ = PEParam
+
+    ##########################################################################
+
+    id = DBPEParameter.db_id
+    pos = DBPEParameter.db_pos
+    interpolator = DBPEParameter.db_interpolator
+    value = DBPEParameter.db_value
+    dimension = DBPEParameter.db_dimension
+
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        return ("(PEParam id=%s pos=%s interpolator='%s' value='%s' dimension=%s)@%X" %
+                (self.id,
+                 self.pos,
+                 self.interpolator,
+                 self.value,
+                 self.dimension,
+                 id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: PEParam) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.pos != other.pos:
+            return False
+        if self.interpolator != other.interpolator:
+            return False
+        if self.value != other.value:
+            return False
+        if self.dimension != other.dimension:
+            return False
+        return True
+
+    def __ne__(self, other):
+        """ __ne__(other: ModuleParam) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+
+###############################################################################
+# Testing
+
+
+class TestModuleParam(unittest.TestCase):
+
+    def create_param(self, id_scope=IdScope()):
+        param = PEParam(id=id_scope.getNewId(PEParam.vtType),
+                            pos=1,
+                            interpolator='normal-int',
+                            value='[1, 2]',
+                            dimension=1)
+        return param
+
+    def test_copy(self):        
+        id_scope = IdScope()
+        p1 = self.create_param(id_scope)
+        p2 = copy.copy(p1)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)
+        p3 = p1.do_copy(True, id_scope, {})
+        self.assertEquals(p1, p3)
+        self.assertNotEquals(p1.id, p3.id)
+
+    def testComparisonOperators(self):
+        """ Test comparison operators """
+        p = self.create_param()
+        q = self.create_param()
+        self.assertEqual(p, q)
+        q.pos = 2
+        self.assertNotEqual(p, q)
+        q.pos = 1
+        q.interpolator = 'other-int'
+        self.assertNotEqual(p, q)
+        q.interpolator = 'normal-int'
+        q.value = '[1, 3]'
+        self.assertNotEqual(p, q)
+        q.value = '[1, 2]'
+        q.dimension = 2
+        self.assertNotEqual(p, q)
+
+    def test_str(self):
+        str(self.create_param())
diff --git a/vistrails/core/paramexplore/paramexplore.py b/vistrails/core/paramexplore/paramexplore.py
new file mode 100644
index 0000000..df468c9
--- /dev/null
+++ b/vistrails/core/paramexplore/paramexplore.py
@@ -0,0 +1,325 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains the definition of the class ParameterExploration """
+
+from xml.sax.saxutils import unescape
+
+import vistrails.core.db.action
+
+from vistrails.db.domain import DBParameterExploration, IdScope
+from vistrails.core.paramexplore.function import PEFunction
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.module import Module
+from vistrails.core.modules.paramexplore import IntegerLinearInterpolator, \
+   FloatLinearInterpolator, RGBColorInterpolator, HSVColorInterpolator,\
+   UserDefinedFunctionInterpolator
+
+
+import unittest
+import copy
+
+###############################################################################
+
+class ParameterExploration(DBParameterExploration):
+    """ParameterExploration
+
+    """
+
+    def __init__(self, *args, **kwargs):
+        DBParameterExploration.__init__(self, *args, **kwargs)
+
+        self.set_defaults()
+
+    def __copy__(self):
+        """ __copy__() -> ParameterExploration - Returns a clone of itself """
+        return ParameterExploration.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameterExploration.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ParameterExploration
+        cp.set_defaults(self)
+        return cp
+
+    def set_defaults(self, other=None):
+        if other is None:
+            self.changed = False
+        else:
+            self.changed = other.changed
+
+    @staticmethod
+    def convert(_parameter_exploration):
+        _parameter_exploration.__class__ = ParameterExploration
+
+        for function in _parameter_exploration.db_functions:
+            PEFunction.convert(function)
+
+        _parameter_exploration.set_defaults()
+
+    ##########################################################################
+    # Properties
+
+    id = DBParameterExploration.db_id
+    action_id = DBParameterExploration.db_action_id
+    user = DBParameterExploration.db_user
+    date = DBParameterExploration.db_date
+    _dims = DBParameterExploration.db_dims
+    _layout = DBParameterExploration.db_layout
+    name = DBParameterExploration.db_name
+    functions = DBParameterExploration.db_functions
+    
+    def get_dims(self):
+        try:
+            return eval(self._dims)
+        except:
+            return []
+    def set_dims(self, d):
+        try:
+            _dims = repr(d)
+        except:
+            _dims = []
+    dims = property(get_dims, set_dims)
+
+    def get_layout(self):
+        try:
+            return eval(self._layout)
+        except:
+            return {}
+    def set_layout(self, l):
+        try:
+            _layout = repr(l)
+        except:
+            _layout = '{}'
+    layout = property(get_layout, set_layout)
+
+    def collectParameterActions(self, pipeline):
+        """ collectParameterActions() -> list
+        Return a list of action lists corresponding to each dimension
+        
+        """
+        if not pipeline:
+            return
+        unescape_dict = { "'":"'", '"':'"', '&#xa;':'\n' }
+        from vistrails.core.modules.module_registry import get_module_registry
+        reg = get_module_registry()
+        parameterValues = [[], [], [], []]
+        # a list of added functions [(module_id, function_name)] = function
+        added_functions = {}
+        vistrail_vars = []
+        function_actions = []
+        for i in xrange(len(self.functions)):
+            pe_function = self.functions[i]
+            module = pipeline.db_get_object(Module.vtType, pe_function.module_id)
+            # collect overridden vistrail vars
+            if module.is_vistrail_var():
+                vistrail_vars.append(module.get_vistrail_var())
+            port_spec = reg.get_input_port_spec(module, pe_function.port_name)
+            tmp_f_id = -1L
+            tmp_p_id = -1L
+            for param in pe_function.parameters:
+                port_spec_item = port_spec.port_spec_items[param.pos]
+                dim = param.dimension
+                if dim not in [0, 1, 2, 3]:
+                    continue
+                count = self.dims[dim]
+                # find interpolator values
+                values = []
+                text = '%s' % unescape(param.value, unescape_dict)
+                if param.interpolator == 'Linear Interpolation':
+                    # need to figure out type
+                    if port_spec_item.module == "Integer":
+                        i_range = eval(text)
+                        p_min = int(i_range[0])
+                        p_max =int(i_range[1])
+                        values = IntegerLinearInterpolator(p_min, p_max,
+                                                     count).get_values()
+                    if port_spec_item.module == "Float":
+                        i_range = eval(text)
+                        p_min = float(i_range[0])
+                        p_max =float(i_range[1])
+                        values = FloatLinearInterpolator(p_min, p_max,
+                                                     count).get_values()
+                elif param.interpolator == 'RGB Interpolation':
+                    i_range = eval(text)
+                    p_min = str(i_range[0])
+                    p_max =str(i_range[1])
+                    values = RGBColorInterpolator(p_min, p_max,
+                                                     count).get_values()
+                elif param.interpolator == 'HSV Interpolation':
+                    i_range = eval(text)
+                    p_min = str(i_range[0])
+                    p_max =str(i_range[1])
+                    values = HSVColorInterpolator(p_min, p_max,
+                                                     count).get_values()
+                elif param.interpolator == 'List':
+                    p_module = port_spec_item.descriptor.module
+                    values = [p_module.translate_to_python(m)
+                              for m in eval(text)]
+                elif param.interpolator == 'User-defined Function':
+                    p_module = port_spec_item.descriptor.module
+                    values = UserDefinedFunctionInterpolator(p_module,
+                            text, count).get_values()
+                if not values:
+                    return None
+                # find parameter or create one
+                function = [f for f in module.functions
+                            if f.name == port_spec.name]
+                if function:
+                    function = function[0]
+                else:
+                    try:
+                        function = added_functions[(module.id,port_spec.name)]
+                    except KeyError:
+                        # add to function list
+                        params = []
+                        for psi in port_spec.port_spec_items:
+                            parameter = ModuleParam(id=tmp_p_id,
+                                        pos=psi.pos,
+                                        name='<no description>',
+                                        val=psi.default,
+                                        type=psi.descriptor.sigstring) 
+                            params.append(parameter)
+                            tmp_p_id -= 1
+                        function = ModuleFunction(id=tmp_f_id,
+                                                  pos=module.getNumFunctions(),
+                                                  name=port_spec.name,
+                                                  parameters=params)
+                        tmp_f_id -= 1
+                        added_functions[(module.id, port_spec.name)]=function 
+                        action = vistrails.core.db.action.create_action([('add',
+                                                                function,
+                                                                module.vtType,
+                                                                module.id)])
+                        function_actions.append(action)
+                parameter = function.params[port_spec_item.pos]
+                # find old parameter
+                old_param = parameter
+                actions = []
+                for v in values:
+                    desc = port_spec_item.descriptor
+                    if not isinstance(v, str):
+                        str_value = desc.module.translate_to_string(v)
+                    else:
+                        str_value = v
+                    new_param = ModuleParam(id=tmp_p_id,
+                                            pos=old_param.pos,
+                                            name=old_param.name,
+                                            alias=pe_function.is_alias,
+                                            val=str_value,
+                                            type=old_param.type)
+                    tmp_p_id -= 1
+                    action_spec = ('change', old_param, new_param,
+                                   function.vtType, function.real_id)
+                    action = vistrails.core.db.action.create_action([action_spec])
+                    actions.append(action)
+                parameterValues[dim].append(actions)
+        return [zip(*p) for p in parameterValues], function_actions, vistrail_vars
+
+    def __eq__(self, other):
+        """ __eq__(other: ParameterExploration) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.action_id != other.action_id:
+            return False
+        if self._dims != other._dims:
+            return False
+        if self._layout != other._layout:
+            return False
+        if len(self.functions) != len(other.functions):
+            return False
+        for p,q in zip(self.functions, other.functions):
+            if p.real_id != q.real_id or p != q:
+                return False
+        return True
+
+# Testing
+
+
+class TestParameterExploration(unittest.TestCase):
+
+    def create_pe(self, id_scope=IdScope()):
+        pe = ParameterExploration(
+                            id=id_scope.getNewId(ParameterExploration.vtType),
+                            action_id=6,
+                            user='tommy',
+                            date='2007-11-23 12:48',
+                            dims='[1,2]',
+                            layout='{1:"normal"}',
+                            name='test-pe',
+                            functions=[])
+        return pe
+
+    def test_copy(self):        
+        id_scope = IdScope()
+        pe1 = self.create_pe(id_scope)
+        pe2 = copy.copy(pe1)
+        self.assertEquals(pe1, pe2)
+        self.assertEquals(pe1.id, pe2.id)
+        pe3 = pe1.do_copy(True, id_scope, {})
+        self.assertEquals(pe1, pe3)
+        self.assertNotEquals(pe1.id, pe3.id)
+
+    def testComparisonOperators(self):
+        """ Test comparison operators """
+        p = self.create_pe()
+        q = self.create_pe()
+        self.assertEqual(p, q)
+        q.action_id = 8
+        self.assertNotEqual(p, q)
+        q.action_id = 6
+        q.user = 'bobo'
+        self.assertNotEqual(p, q)
+        q.user = 'tommy'
+        q.date = '2008-11-23 12:48'
+        self.assertNotEqual(p, q)
+        q.date = p.date
+        q._dims = '[1,4]'
+        self.assertNotEqual(p, q)
+        q._dims = '[1,2]'
+        q._layout = '{1:"different"}'
+        self.assertNotEqual(p, q)
+        q._layout = p._layout
+        q.name = 'test-pe2'
+        self.assertNotEqual(p, q)
+        q.name = p.name
+        q.functions = [1]
+        self.assertNotEqual(p, q)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/publishing/__init__.py b/vistrails/core/publishing/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/publishing/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/publishing/parse_latex.py b/vistrails/core/publishing/parse_latex.py
new file mode 100644
index 0000000..ae086f1
--- /dev/null
+++ b/vistrails/core/publishing/parse_latex.py
@@ -0,0 +1,170 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from itertools import izip
+import re
+
+def parse_vt_command(opt_arg, arg):
+    opt_dict = {}
+    for opt_str in opt_arg[1:-1].split(','):
+        opt_str = opt_str.strip()
+        opt_list = opt_str.split('=',1)
+        if len(opt_list) > 1:
+            if opt_list[0].strip():
+                opt_dict[opt_list[0]] = opt_list[1]
+        else:
+            if opt_list[0].strip():
+                opt_dict[opt_list[0]] = None
+    opt_dict['_args'] = arg[1:-1]
+    return opt_dict
+
+def build_vt_command(opt_dict):
+    if '_args' in opt_dict:
+        args = opt_dict['_args']
+    else:
+        args = ''
+    opt_str = ''
+    for k, v in opt_dict.iteritems():
+        if k == '_args':
+            continue
+        if v is None:
+            opt_str += '%s,\n' % k
+        else:
+            opt_str += '%s=%s,\n' % (k,v)
+    if opt_str:
+        full_str = "\\vistrail[%s]{%s}" % (opt_str, args)
+    else:
+        full_str = "\\vistrail{%s}" % args
+    #print '^^ LATEX ^^', opt_dict, full_str
+    return full_str
+
+def parse_latex_file(fname):
+    # vt_begin_re = re.compile(r"% -- VISTRAILS BEGIN --")
+    # vt_end_re = re.compile(r"% -- VISTRAILS END --")
+    vt_begin_re = re.compile(r"^(?:(?:\\%)|[^%])*(\\vistrail[\[\{])")
+
+    # we'll just assume balanced parens here...
+    # vt_end_re = re.compile(r"\}")
+    vt_bracket_re = re.compile(r"[\[\]]")
+    vt_brace_re = re.compile(r"[\{\}]")
+    f = open(fname)
+    
+    raw_text = [""]
+    raw_idx = 0
+    vt_text = []
+    for line in f:
+        m = vt_begin_re.search(line)
+        if not m:
+            raw_text[raw_idx] += line
+        else:
+            # print 'found:', m.start(1), m.end(1), line[m.end(1) - 1]
+
+            # first end the current raw_text block
+            raw_text[raw_idx] += line[:m.start(1)]
+            raw_text.append("")
+            raw_idx += 1
+
+            cmd_text = ""
+            # line = line[m.start(1):]
+            line = line[m.end(1)-1:]
+
+            # we'll just assume balanced parens here...
+            if line[0] == '[':
+                brackets_complete = False
+                found_start = False
+                brackets = 0
+                while not brackets_complete:
+                    for m in vt_bracket_re.finditer(line):
+                        bracket_char = line[m.start()]
+                        if bracket_char == '[':
+                            brackets += 1
+                            found_start = True
+                        else:
+                            brackets -= 1
+                        if found_start and brackets == 0:
+                            brackets_complete = True
+                            cmd_text += line[:m.end()]
+                            line = line[m.end():]
+                            break
+                    if brackets_complete:
+                        break
+                    cmd_text += line
+                    line = f.next()
+            
+            opt_cmd_text = cmd_text
+            cmd_text = ""
+            braces_complete = False
+            found_start = False
+            braces = 0
+            while not braces_complete:
+                for m in vt_brace_re.finditer(line):
+                    brace_char = line[m.start()]
+                    if brace_char == '{':
+                        braces += 1
+                        found_start = True
+                    else:
+                        braces -= 1
+                    if found_start and braces == 0:
+                        braces_complete = True
+                        cmd_text += line[:m.end()]
+                        break
+                if braces_complete:
+                    break
+                cmd_text += line
+                line = f.next()
+            # print cmd_text
+            vt_text.append((opt_cmd_text,cmd_text))
+            raw_text[raw_idx] += line[m.end():]
+            
+        # if vt_begin_re.search(line):
+        #     line = f.next()
+        #     while not vt_end_re.search(line):
+        #         print line.strip()
+        #         line = f.next()
+    f.close()
+
+    # vt_text.append(("", ""))
+    #for t, vt in izip(raw_text, vt_text + [("", "")]):
+        #print "RAW:", t
+        #print "VT:", parse_vt_command(*vt)
+    return (raw_text, vt_text)
+
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv) < 2:
+        print "Usage: %s %s <latex-file>" % (sys.executable, sys.argv[0])
+        sys.exit(-1)
+    
+    parse_latex_file(sys.argv[1])
diff --git a/vistrails/core/query/__init__.py b/vistrails/core/query/__init__.py
new file mode 100644
index 0000000..1a22cf3
--- /dev/null
+++ b/vistrails/core/query/__init__.py
@@ -0,0 +1,565 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# ################################################################################
+# # QueryWF: Base class for queries over workflows
+
+# class QueryWF(object):
+
+#     def __init__(self, transformer, logQueries):
+#         self.transformer = transformer
+#         self. = logQueries
+    
+
+# ################################################################################
+
+# class QueryWFModuleName(QueryWF):
+    
+#     def __init__(self, name):
+#         self.name = name
+
+#     def run(self, module):
+#         return module.name == self.name
+
+# ################################################################################
+
+# class QueryWFParameter(QueryWF):
+    
+#     def __init__(self, param, name):
+#         self.param = param
+#         self.name = name
+
+#     def run(self, module):
+#         for f in module.functions:
+#             if (f.name == name and 
+#                 len(f.params) == 1 and
+#                 f.params[0].name == self.name:
+#                 return True
+#         return False
+
+# ################################################################################
+
+# class QueryWFAnd(QueryWF):
+            
+#     def __init__(self, queries):
+#         self.queries = queries
+
+#     def run(self, module):
+#         for query in self.queries:
+#             if not query.run(module):
+#                 return False
+#         return True
+
+# ################################################################################
+
+# class QueryWFOr(QueryWF):
+    
+#     def __init__(self, queries):
+#         self.queries = queries
+
+#     def run(self, module):
+#         for query in self.queries:
+#             if query.run(module):
+#                 return True
+#         return False
+
+# ################################################################################
+
+# class QueryWFNot(QueryWF):
+
+#     def __init__(self, query):
+#         self.query = query
+
+#     def run(self, module):
+#         return not self.query.run(module)
+
+# ################################################################################
+
+# class QueryWFResultTransformer(object):
+#     pass
+
+# ################################################################################
+
+# class QueryWFUpstream(QueryWFResultTransformer):
+
+#     def run(self, pipeline, module_ids):
+#         result = set()
+#         inv_graph = pipeline.graph.inverse()
+#         for i in module_ids:
+#             result = result.union(set(inv_graph.bfs(i).keys() + [i]))
+#         return result
+
+
+# class QueryWFIdentity(QueryWFResultTransformer):
+
+#     def run(self, pipeline, module_ids):
+#         return module_ids
+
+
+# class QueryWFUnion(QueryWFResultTransformer):
+
+#     def __init__(self, queries):
+#         self.queries = queries
+
+#     def run(self, pipeline, module_ids):
+#         result = set()
+#         for query in queries:
+#             result = result.union(query.run(pipeline, module_ids))
+
+################################################################################
+import xml.sax.saxutils
+
+from vistrails.core.utils import memo_method
+
+# convenience method that does the full html extract if PyQt is loaded
+def extract_text(escaped_html_str):
+    notes = xml.sax.saxutils.unescape(escaped_html_str)
+    try:
+        from PyQt4 import QtGui
+    except ImportError:
+        return str(notes)
+    else:
+        fragment = QtGui.QTextDocumentFragment.fromHtml(notes)
+        return str(fragment.toPlainText())
+
+# The queries are old and are preserved for reference.  Some code is
+# quite old (references to vis_application, for example).
+
+class Query(object):
+
+    def upstream(self, graph, id):
+        return graph.bfs(id).keys()
+
+    weekdayMap = {'mo':0, 'tu':1, 'we':2, 'th':3, 'fr':4, 'sa':5, 'su':6}
+
+    def weekday(self, time, weekday):
+        return time.weekday() == self.weekdayMap[weekday.lower()[:2]]
+
+    def computeIndices(self):
+        self.versionDict = {}
+
+        if not len(self.queryResult):
+            return
+        elif len(self.queryResult[0]) == 1:
+            for (v,) in self.queryResult:
+                self.versionDict[v] = {}
+        elif len(self.queryResult[0]) == 2:
+            for (v, m) in self.queryResult:
+                if not self.versionDict.has_key(v):
+                    self.versionDict[v] = {m: []}
+                self.versionDict[v][m] = {}
+        else:
+            assert len(self.queryResult[0]) == 3
+            for (v, m, e) in self.queryResult:
+                if not self.versionDict.has_key(v):
+                    self.versionDict[v] = {m: [e]}
+                elif not self.versionDict[v].has_key(m):
+                    self.versionDict[v][m] = [e]
+                else:
+                    self.versionDict[v][m].append(e)
+
+    def match(self, vistrail, action):
+        return action.timestep in self.versionDict
+
+    def matchModule(self, version_id, module):
+        return (self.tupleLength < 2 or
+                (version_id in self.versionDict and
+                 module.id in self.versionDict[version_id]))
+
+    def executionInstances(self, version_id, module_id):
+        versionDict = self.versionDict
+        assert self.tupleLength == 3
+        if versionDict[version_id].has_key(module_id):
+            return versionDict[version_id][module_id]
+        else:
+            return None
+
+class Query1a(Query):
+
+    def run(self, vistrail, name):
+        result = []
+        versions = vistrail.get_tagMap().itervalues()
+        for version in versions:
+            p = vistrail.getPipeline(version)
+            for module_id, module in p.modules.iteritems():
+                if module.name == 'FileSink':
+                    for f in module.functions:
+                        if (f.name == 'outputName' and
+                            len(f.params) == 1 and
+                            f.params[0].value() == 'atlas-x.gif'):
+                            result.append((version, module_id))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+
+
+class Query1b(Query):
+
+    def run(self, vistrail, name):
+        result = []
+        versions = vistrail.get_tagMap().itervalues()
+        for version in versions:
+            p = vistrail.getPipeline(version)
+            ms = []
+            for module_id, module in p.modules.iteritems():
+                if module.name == 'FileSink':
+                    for f in module.functions:
+                        if (f.name == 'outputName' and
+                            len(f.params) == 1 and
+                            f.params[0].value() == 'atlas-x.gif'):
+                            ms.append(module_id)
+            s = set()
+            inv_graph = p.graph.inverse()
+            for m in ms:
+                s = s.union(set(inv_graph.bfs(m).keys() + [m]))
+            for m in s:
+                result.append((version, m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+
+
+class Query1c(Query):
+
+    def run(self, vistrail, name):
+        import vistrails.gui.vis_application
+        c = vistrails.gui.vis_application.logger.db.cursor()
+        c.execute("""
+        select distinct module_id, wf_version from
+        wf_exec, exec, vistrails
+        where
+           wf_exec.wf_exec_id = exec.wf_exec_id and
+           vistrails.vistrails_name = %s and
+           vistrails.vistrails_id = wf_exec.vistrails_id""", name)
+        lst = list(c.fetchall())
+        versions = set([x[1] for x in lst])
+        executions = set(lst)
+        result = []
+        for version in versions:
+            p = vistrail.getPipeline(int(version))
+            ms = []
+            for module_id, module in p.modules.iteritems():
+                if (module_id, version) not in executions:
+                    continue
+                if module.name == 'FileSink':
+                    for f in module.functions:
+                        if (f.name == 'outputName' and
+                            len(f.params) == 1 and
+                            f.params[0].value() == 'atlas-x.gif'):
+                            ms.append(module_id)
+            s = set()
+            inv_graph = p.graph.inverse()
+            for m in ms:
+                s = s.union(set(inv_graph.bfs(m).keys() + [m]))
+            for m in s:
+                result.append((int(version), m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+    
+
+class Query2(Query):
+
+    def run(self, vistrail, name):
+        import vistrails.gui.vis_application
+        c = vistrails.gui.vis_application.logger.db.cursor()
+        c.execute("""
+        select distinct module_id, wf_version from
+        wf_exec, exec, vistrails
+        where
+           wf_exec.wf_exec_id = exec.wf_exec_id and
+           vistrails.vistrails_name = %s and
+           vistrails.vistrails_id = wf_exec.vistrails_id""", name)
+        lst = list(c.fetchall())
+        versions = set([x[1] for x in lst])
+        executions = set(lst)
+        result = []
+        for version in versions:
+            p = vistrail.getPipeline(int(version))
+            inv_graph = p.graph.inverse()
+
+            # s = upstream(x) union x where x.name = filesink blablabla
+            s = set()
+            for module_id, module in p.modules.iteritems():
+                if (module_id, version) not in executions:
+                    continue
+                if module.name == 'FileSink':
+                    for f in module.functions:
+                        if (f.name == 'outputName' and
+                            len(f.params) == 1 and
+                            f.params[0].value() == 'atlas-x.gif'):
+                            s = s.union(set(self.upstream(inv_graph, module_id) + [module_id]))
+                            break
+
+            # s2 = upstream(y) where y.name = softmean
+            s2 = set()
+            for module_id, module in p.modules.iteritems():
+                if module.name == 'SoftMean':
+                    s2 = s2.union(set(self.upstream(inv_graph, module_id) + [module_id]))
+
+            qresult = s - s2
+            
+            for m in qresult:
+                result.append((int(version), m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+
+
+class Query3(Query):
+
+    def run(self, vistrail, name):
+        import vistrails.gui.vis_application
+        c = vistrails.gui.vis_application.logger.db.cursor()
+        c.execute("""
+        select distinct module_id, wf_version from
+        wf_exec, exec, vistrails
+        where
+           wf_exec.wf_exec_id = exec.wf_exec_id and
+           vistrails.vistrails_name = %s and
+           vistrails.vistrails_id = wf_exec.vistrails_id""", name)
+        lst = list(c.fetchall())
+        versions = set([x[1] for x in lst])
+        executions = set(lst)
+        result = []
+        for version in versions:
+            p = vistrail.getPipeline(int(version))
+            ms = []
+            for module_id, module in p.modules.iteritems():
+                if (module_id, version) not in executions:
+                    continue
+                if module.name == 'FileSink':
+                    for f in module.functions:
+                        if (f.name == 'outputName' and
+                            len(f.params) == 1 and
+                            f.params[0].value() == 'atlas-x.gif'):
+                            ms.append(module_id)
+            s = set()
+            inv_graph = p.graph.inverse()
+            for m in ms:
+                s = s.union(set(inv_graph.bfs(m).keys() + [m]))
+            for m in s:
+                if (p.modules[m].has_annotation_with_key('stage') and
+                    p.modules[m].get_annotation_by_key('stage').value in \
+                        ['3','4','5']):
+                    result.append((int(version), m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+        
+            
+class Query4(Query):
+
+    def run(self, vistrail, name):
+        import vistrails.gui.vis_application
+        c = vistrails.gui.vis_application.logger.db.cursor()
+        c.execute("""
+        select distinct exec.ts_start, exec.ts_end, exec_id, module_id, wf_version from
+        wf_exec, exec, vistrails
+        where
+           exec.module_name = %s and
+           wf_exec.wf_exec_id = exec.wf_exec_id and
+           vistrails.vistrails_name = %s and
+           vistrails.vistrails_id = wf_exec.vistrails_id""", ('AlignWarp', name))
+
+        result = []
+        for ts_start, ts_end, exec_id, module_id, wf_version in c.fetchall():
+            p = vistrail.getPipeline(int(wf_version))
+            m = p.modules[module_id]
+            assert m.name == 'AlignWarp'
+            # We assume here that no module takes longer than a day to execute.
+            wd = 'monday'
+            if self.weekday(ts_start, wd) or self.weekday(ts_end, wd):
+                result.append((wf_version, module_id, exec_id))
+
+        self.queryResult = result
+        self.tupleLength = 3
+        self.computeIndices()
+        return result
+
+class Query5(Query):
+
+    @memo_method
+    def pipeline(self, vistrail, version):
+        return vistrail.getPipeline(version)
+
+    @memo_method
+    def upstream_set(self, graph, m_id):
+        return set(self.upstream(graph, m_id))
+
+    def run(self, vistrail, name):
+        import vistrails.gui.vis_application
+        c = vistrails.gui.vis_application.logger.db.cursor()
+        c.execute("""
+        select distinct
+           wf_exec.wf_version, exec.module_id
+        from
+           wf_exec, exec, annotation, vistrails
+        where
+           wf_exec.wf_exec_id = exec.wf_exec_id and
+           vistrails.vistrails_name = %s and
+           vistrails.vistrails_id = wf_exec.vistrails_id and
+           annotation.exec_id = exec.exec_id and
+           annotation.key = %s and
+           annotation.value = %s""", (name, 'global maximum', '4095'))
+        result = []
+        all = c.fetchall()
+        #print len(all)
+        version_module = {}
+        for wf_version, module_id in all:
+            if not wf_version in version_module:
+                version_module[wf_version] = set([module_id])
+            else:
+                version_module[wf_version].add(module_id)
+        #print vistrail.get_tagMap()
+        for wf_version, module_ids in version_module.iteritems():
+            #print wf_version
+            p = self.pipeline(vistrail, int(wf_version))
+            inv_graph = p.graph.inverse()
+            s = set()
+            for m_id, module in p.modules.iteritems():
+                if module.name == 'FileSink':
+                    for f in module.functions:
+                        if (f.name == 'outputName' and
+                            len(f.params) == 1 and
+                            f.params[0].value().find('atlas') != -1):
+                            u_id = self.upstream_set(inv_graph, m_id)
+                            if module_ids.intersection(u_id):
+                                s = s.union(u_id).union(set([m_id]))
+                            break
+            for m in s:
+                result.append((int(wf_version), m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+        
+
+class Query6(Query):
+
+    def run(self, vistrail, name):
+        import vistrails.gui.vis_application
+        c = vistrails.gui.vis_application.logger.db.cursor()
+        c.execute("""
+        select distinct module_id, wf_version from
+        wf_exec, exec, vistrails
+        where
+           exec.module_name = %s and
+           wf_exec.wf_exec_id = exec.wf_exec_id and
+           vistrails.vistrails_name = %s and
+           vistrails.vistrails_id = wf_exec.vistrails_id""", ('SoftMean', name))
+        result = []
+        for (module_id, wf_version) in c.fetchall():
+            p = vistrail.getPipeline(int(wf_version))
+            m = p.modules[module_id]
+            assert m.name == 'SoftMean'
+            inv_graph = p.graph.inverse()
+            up = self.upstream(inv_graph, module_id)
+            up.append(module_id)
+            found = False
+            for up_id in up:
+                up_module = p.modules[up_id]
+                if up_module.name == 'AlignWarp':
+                    for f in up_module.functions:
+                        if (f.name == 'model' and
+                            len(f.params) == 1 and
+                            f.params[0].value() == 12):
+                            found = True
+                            break
+                if found:
+                    break
+            if found:
+                for up_id in up:
+                    result.append((wf_version, up_id))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+
+
+class Query8(Query):
+
+    def run(self, vistrail, name):
+        result = []
+        versions = vistrail.get_tagMap().itervalues()
+        for version in versions:
+            s = set()
+            p = vistrail.getPipeline(version)
+            inv_graph = p.graph.inverse()
+            for module_id, module in p.modules.iteritems():
+                if module.name == 'AlignWarp':
+                    found = False
+                    u_ids = self.upstream(inv_graph, module_id)
+                    for i in u_ids:
+                        if (p.modules[i].has_annotation_with_key('center')
+                            and p.modules[i].get_annotation_by_key('center') \
+                                == 'UChicago'):
+                            found = True
+                            break
+                    if found:
+                        s = s.union(set(u_ids + [module_id]))
+            for m in s:
+                result.append((version, m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
+
+
+class Query9(Query):
+
+    def run(self, vistrail, name):
+        result = []
+        versions = vistrail.get_tagMap().itervalues()
+        for version in versions:
+            s = set()
+            p = vistrail.getPipeline(version)
+            inv_graph = p.graph.inverse()
+            for module_id, module in p.modules.iteritems():
+                annot = module.annotations
+                if (module.has_annotation_with_key('studyModality')
+                    and module.get_annotation_by_key('studyModality') in \
+                        ['visual', 'audio', 'speech']):
+                    s = s.union(set(self.upstream(inv_graph, module_id) + [module_id]))
+            for m in s:
+                result.append((version, m))
+        self.queryResult = result
+        self.tupleLength = 2
+        self.computeIndices()
+        return result
diff --git a/vistrails/core/query/combined.py b/vistrails/core/query/combined.py
new file mode 100644
index 0000000..5096d23
--- /dev/null
+++ b/vistrails/core/query/combined.py
@@ -0,0 +1,81 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from version import SearchCompiler
+from visual import VisualQuery
+
+class CombinedSearch(VisualQuery):
+    def __init__(self, search_str=None, pipeline=None, versions_to_check=None):
+        VisualQuery.__init__(self, pipeline, versions_to_check)
+        self.search_str = search_str
+
+    def run(self, vistrail, name):
+        VisualQuery.run(self, vistrail, name)
+        self.search_stmt = SearchCompiler(self.search_str).searchStmt
+
+    def match(self, vistrail, action):
+        if self.queryPipeline is not None and \
+                len(self.queryPipeline.modules) > 0:
+            if action.timestep in self.versionDict:
+                return self.search_stmt.match(vistrail, action)
+            return False
+        else:
+            return self.search_stmt.match(vistrail, action)
+
+    def matchModule(self, version_id, module):
+        if self.queryPipeline is not None and \
+                len(self.queryPipeline.modules) > 0:
+            return VisualQuery.matchModule(self, version_id, module)
+        return True
+    
+    def getResultEntity(self, vistrail, versions_to_check):
+        from vistrails.core.collection.vistrail import VistrailEntity
+
+        locators = []
+        vistrail_entity = None
+        for version in versions_to_check:
+            if version in vistrail.actionMap:
+                action = vistrail.actionMap[version]
+                if self.match(vistrail, action):
+                    # have a match, get vistrail entity
+                    if vistrail_entity is None:
+                        vistrail_entity = VistrailEntity()
+                        # don't want to add all workflows, executions
+                        vistrail_entity.set_vistrail(vistrail)
+                    vistrail_entity.add_workflow_entity(version)
+                    # FIXME this is not done at the low level but in
+                    # Collection class, probably should be reworked
+                    vistrail_entity.wf_entity_map[version].parent = \
+                        vistrail_entity
+        return vistrail_entity
diff --git a/vistrails/core/query/multiple.py b/vistrails/core/query/multiple.py
new file mode 100644
index 0000000..5a4afb2
--- /dev/null
+++ b/vistrails/core/query/multiple.py
@@ -0,0 +1,78 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.query import Query
+from combined import CombinedSearch
+
+class MultipleSearch(Query):
+    # vistrails_to_check { Vistrail: set(version_ids) }
+    def __init__(self, search_str=None, pipeline=None, entities_to_check={}):
+        self.entities_to_check = entities_to_check
+        self.queryPipeline = pipeline
+        self.search_str = search_str
+        self.queries = {}
+        self.queries_by_vistrail = {}
+        self.cur_vistrail = None
+
+    def setCurrentVistrail(self, vistrail):
+        self.cur_vistrail = vistrail
+
+    def run(self):
+        for entity, versions_to_check in self.entities_to_check.iteritems():
+            query = CombinedSearch(self.search_str, self.queryPipeline, 
+                                   versions_to_check)
+            query.run(entity.vistrail, '')
+            self.queries[entity] = query
+            self.queries_by_vistrail[entity.vistrail] = query
+
+    def match(self, vistrail, action):
+        self.setCurrentVistrail(vistrail)
+        query = self.queries_by_vistrail[vistrail]
+        return query.match(vistrail, action)
+
+    def matchModule(self, version_id, module):
+        query = self.queries_by_vistrail[self.cur_vistrail]
+        return query.matchModule(version_id, module)
+    
+    def getResultEntities(self):
+        result_entities = []
+        for entity, query in self.queries.iteritems():
+            versions_to_check = self.entities_to_check[entity]
+            result_entity = query.getResultEntity(entity.vistrail, 
+                                                  versions_to_check)
+            if result_entity is not None:
+                # needed for workspace results that are temporary...
+                result_entity._window = entity._window
+                result_entities.append(result_entity)
+        return result_entities
diff --git a/vistrails/core/query/version.py b/vistrails/core/query/version.py
new file mode 100644
index 0000000..4a769e4
--- /dev/null
+++ b/vistrails/core/query/version.py
@@ -0,0 +1,695 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# We need to remove QtGui and QtCore refernce by storing all of our
+# notes in plain text, not html, should be fix later
+from vistrails.core.query import extract_text
+import vistrails.core.utils
+import re
+import time
+
+import unittest
+import datetime
+
+################################################################################
+
+class SearchParseError(Exception):
+    def __init__(self, *args, **kwargs):
+        Exception.__init__(self, *args, **kwargs)
+
+class SearchStmt(object):
+    def __init__(self, content):
+        self.text = content
+        self.content = re.compile('.*'+content+'.*', re.MULTILINE | re.IGNORECASE)
+
+    def match(self, vistrail, action):
+        return True
+
+    def matchModule(self, v, m):
+        return True
+
+    def run(self, v, n):
+        pass
+
+    def __call__(self):
+        """Make SearchStmt behave just like a QueryObject."""
+        return self
+
+class TimeSearchStmt(SearchStmt):
+    oneSecond = 1.0
+    oneMinute = oneSecond * 60.0
+    oneHour = oneMinute * 60.0
+    oneDay = oneHour * 24.0
+    oneWeek = oneDay * 7.0
+    oneMonth = oneDay * 31.0 # wrong, I know
+    oneYear = oneDay * 365.0 # wrong, I know
+    amounts = {'seconds': oneSecond,
+               'minutes': oneMinute,
+               'hours': oneHour,
+               'days': oneDay,
+               'weeks': oneWeek,
+               'months': oneMonth,
+               'years': oneYear}
+    months = {'january': 1,
+              'february': 2,
+              'march': 3,
+              'april': 4,
+              'may': 5,
+              'june': 6,
+              'july': 7,
+              'august': 8,
+              'september': 9,
+              'october': 10,
+              'november': 11,
+              'december': 12}
+    
+    dateEntry = r'([^\,\/\: ]+)'
+    timeEntry = r'(\d?\d?)'
+    dateSep = r' *[\,\/\- ] *'
+    timeSep = r' *: *'
+    sep = r' *'
+    start = r'^ *'
+    finish = r' *$'
+    twoEntryDate = (dateEntry+
+                    dateSep+
+                    dateEntry)
+    threeEntryDate = (dateEntry+
+                      dateSep+
+                      dateEntry+
+                      dateSep+
+                      dateEntry)
+    twoEntryTime = (timeEntry+
+                    timeSep+
+                    timeEntry)
+    threeEntryTime = (timeEntry+
+                      timeSep+
+                      timeEntry+
+                      timeSep+
+                      timeEntry)
+
+    dateRE = [re.compile((start+
+                          twoEntryDate+
+                          finish)), # Mar 12   Mar, 12    
+              re.compile((start+
+                          threeEntryDate+
+                          finish)), # Mar, 12, 2006    2006 Mar 12     etc
+              re.compile((start+
+                          twoEntryTime+
+                          finish)),
+              re.compile((start+
+                          threeEntryTime+
+                          finish)),
+              re.compile((start+
+                          twoEntryDate+
+                          sep+
+                          twoEntryTime+
+                          finish)),
+              re.compile((start+
+                          twoEntryDate+
+                          sep+
+                          threeEntryTime+
+                          finish)),
+              re.compile((start+
+                          threeEntryDate+
+                          sep+
+                          twoEntryTime+
+                          finish)),
+              re.compile((start+
+                          threeEntryDate+
+                          sep+
+                          threeEntryTime+
+                          finish)),
+              re.compile((start+
+                          twoEntryTime+
+                          sep+
+                          twoEntryDate+
+                          finish)),
+              re.compile((start+
+                          twoEntryTime+
+                          sep+
+                          threeEntryDate+
+                          finish)),
+              re.compile((start+
+                          threeEntryTime+
+                          sep+
+                          twoEntryDate+
+                          finish)),
+              re.compile((start+
+                          threeEntryTime+
+                          sep+
+                          threeEntryDate+
+                          finish))]
+    
+    def __init__(self, date):
+        self.date = self.parseDate(date)
+
+    def parseDate(self, dateStr):
+        def parseAgo(s):
+            [amount, unit] = s.split(' ')
+            try:
+                amount = float(amount)
+            except ValueError:
+                raise SearchParseError("Expected a number, got %s" % amount)
+            if amount <= 0:
+                raise SearchParseError("Expected a positive number, got %s" % amount)
+            unitRe = re.compile('^'+unit)
+            keys = [k
+                    for k in TimeSearchStmt.amounts.keys()
+                    if unitRe.match(k)]
+            if len(keys) == 0:
+                raise SearchParseError("Time unit unknown: %s" % unit)
+            elif len(keys) > 1:
+                raise SearchParseError("Time unit ambiguous: %s matches %s" % (unit, keys))
+            return round(time.time()) - TimeSearchStmt.amounts[keys[0]] * amount
+
+        def guessDate(unknownEntries, year=None):
+            def guessStrMonth(s):
+                monthRe = re.compile('^'+s)
+                keys = [k
+                        for k in TimeSearchStmt.months.keys()
+                        if monthRe.match(k)]
+                if len(keys) == 0:
+                    raise SearchParseError("Unknown month: %s" % s)
+                elif len(keys) > 1:
+                    raise SearchParseError("Ambiguous month: %s matches %s" % (s, keys))
+                return TimeSearchStmt.months[keys[0]]
+            if not year:
+                m = None
+                # First heuristic: if month comes first, then year comes last
+                try:
+                    e0 = int(unknownEntries[0])
+                except ValueError:
+                    m = guessStrMonth(unknownEntries[0])
+                    try:
+                        d = int(unknownEntries[1])
+                    except ValueError:
+                        raise SearchParseError("Expected day, got %s" % unknownEntries[1])
+                    try:
+                        y = int(unknownEntries[2])
+                    except ValueError:
+                        raise SearchParseError("Expected year, got %s" % unknownEntries[2])
+                    return (y, m, d)
+                # Second heuristic: if month comes last, then year comes first
+                try:
+                    e2 = int(unknownEntries[2])
+                except ValueError:
+                    m = guessStrMonth(unknownEntries[2])
+                    try:
+                        d = int(unknownEntries[1])
+                    except ValueError:
+                        raise SearchParseError("Expected day, got %s" % unknownEntries[1])
+                    try:
+                        y = int(unknownEntries[0])
+                    except ValueError:
+                        raise SearchParseError("Expected year, got %s" % unknownEntries[0])
+                    return (y, m, d)
+                # If month is the middle one, decide day and year by size
+                # (year is largest, hopefully year was entered using 4 digits)
+                try:
+                    e1 = int(unknownEntries[1])
+                except ValueError:
+                    m = guessStrMonth(unknownEntries[1])
+                    try:
+                        d = int(unknownEntries[2])
+                    except ValueError:
+                        raise SearchParseError("Expected day or year, got %s" % unknownEntries[2])
+                    try:
+                        y = int(unknownEntries[0])
+                    except ValueError:
+                        raise SearchParseError("Expected year or year, got %s" % unknownEntries[0])
+                    return (max(y,d), m, min(y, d))
+                lst = [(e0,0),(e1,1),(e2,2)]
+                lst.sort()
+                return guessDate([str(lst[0][0]),
+                                  str(lst[1][0])],
+                                 year=e2)
+            # We know year, decide month using similar heuristics - try string month first,
+            # then decide which is possible
+            try:
+                e0 = int(unknownEntries[0])
+            except ValueError:
+                m = guessStrMonth(unknownEntries[0])
+                try:
+                    d = int(unknownEntries[1])
+                except ValueError:
+                    raise SearchParseError("Expected day, got %s" % unknownEntries[1])
+                return (year, m, d)
+            try:
+                e1 = int(unknownEntries[1])
+            except ValueError:
+                m = guessStrMonth(unknownEntries[1])
+                try:
+                    d = int(unknownEntries[0])
+                except ValueError:
+                    raise SearchParseError("Expected day, got %s" % unknownEntries[0])
+                return (year, m, d)
+            if e0 > 12:
+                return (year, e1, e0)
+            else:
+                return (year, e0, e1)
+
+        dateStr = dateStr.lower().lstrip().rstrip()
+        if dateStr.endswith(" ago"):
+            return parseAgo(dateStr[:-4])
+        if dateStr == "yesterday":
+            lst = list(time.localtime(round(time.time()) - TimeSearchStmt.oneDay))
+            # Reset hour, minute, second
+            lst[3] = 0
+            lst[4] = 0
+            lst[5] = 0
+            return time.mktime(lst)
+        if dateStr == "today":
+            lst = list(time.localtime())
+            # Reset hour, minute, second
+            lst[3] = 0
+            lst[4] = 0
+            lst[5] = 0
+            return time.mktime(lst)
+        if dateStr.startswith("this "):
+            rest = dateStr[5:]
+            lst = list(time.localtime(round(time.time())))
+            if rest == "minute":
+                lst[5] = 0
+            elif rest == "hour":
+                lst[5] = 0
+                lst[4] = 0
+            elif rest == "day":
+                lst[5] = 0
+                lst[4] = 0
+                lst[3] = 0
+            elif rest == "week": # weeks start on monday
+                lst[5]  = 0
+                lst[4]  = 0
+                lst[3]  = 0
+                # This hack saves me the hassle of computing negative days, months, etc
+                lst = list(time.localtime(time.mktime(lst) - TimeSearchStmt.oneDay * lst[6]))
+            elif rest == "month":
+                lst[5]  = 0
+                lst[4]  = 0
+                lst[3]  = 0
+                lst[2]  = 1
+            elif rest == "year":
+                lst[5]  = 0
+                lst[4]  = 0
+                lst[3]  = 0
+                lst[2]  = 1
+                lst[1]  = 1
+            return time.mktime(lst)
+                
+        result = [x.match(dateStr) for x in TimeSearchStmt.dateRE]
+        this = list(time.localtime())
+        def setTwoDate(g):
+            d = guessDate(g, year=this[0])
+            this[0] = d[0]
+            this[1] = d[1]
+            this[2] = d[2]
+        def setThreeDate(g):
+            d = guessDate(g)
+            this[0] = d[0]
+            this[1] = d[1]
+            this[2] = d[2]
+        def setTwoTime(g):
+            this[3] = int(g[0])
+            this[4] = int(g[1])
+            this[5] = 0
+        def setThreeTime(g):
+            this[3] = int(g[0])
+            this[4] = int(g[1])
+            this[5] = int(g[2])
+        if result[0]:
+            setTwoDate(result[0].groups())
+            setTwoTime([0,0])
+        elif result[1]:
+            setThreeDate(result[1].groups())
+            setTwoTime([0,0])
+        elif result[2]:
+            setTwoTime(result[2].groups())
+        elif result[3]:
+            setThreeTime(result[3].groups())
+        elif result[4]:
+            g = result[4].groups()
+            setTwoDate([g[0], g[1]])
+            setTwoTime([g[2], g[3]])
+        elif result[5]:
+            g = result[5].groups()
+            setTwoDate([g[0], g[1]])
+            setThreeTime([g[2], g[3], g[4]])
+        elif result[6]:
+            g = result[6].groups()
+            setThreeDate([g[0], g[1], g[2]])
+            setTwoTime([g[3], g[4]])
+        elif result[7]:
+            g = result[7].groups()
+            setThreeDate([g[0], g[1], g[2]])
+            setThreeTime([g[3], g[4], g[5]])
+        elif result[8]:
+            g = result[8].groups()
+            setTwoTime([g[0], g[1]])
+            setTwoDate([g[2], g[3]])
+        elif result[9]:
+            g = result[9].groups()
+            setTwoTime([g[0], g[1]])
+            setThreeDate([g[2], g[3], g[4]])
+        elif result[10]:
+            g = result[10].groups()
+            setThreeTime([g[0], g[1], g[2]])
+            setTwoDate([g[3], g[4]])
+        elif result[11]:
+            g = result[11].groups()
+            setThreeTime([g[0], g[1], g[2]])
+            setThreeDate([g[3], g[4],g[5]])
+        else:
+            raise SearchParseError("Expected a date, got '%s'" % dateStr)
+        return time.mktime(this)
+        
+class BeforeSearchStmt(TimeSearchStmt):
+    def match(self, vistrail, action):
+        if not action.date:
+            return False
+        t = time.mktime(time.strptime(action.date, "%d %b %Y %H:%M:%S"))
+        return t <= self.date
+
+class AfterSearchStmt(TimeSearchStmt):
+    def match(self, vistrail, action):
+        if not action.date:
+            return False
+        t = time.mktime(time.strptime(action.date, "%d %b %Y %H:%M:%S"))
+        return t >= self.date
+
+class UserSearchStmt(SearchStmt):
+    def match(self, vistrail, action):
+        if not action.user:
+            return False
+        return self.content.match(action.user)
+
+class NotesSearchStmt(SearchStmt):
+    def match(self, vistrail, action):
+        if vistrail.has_notes(action.id):
+            plainNotes = extract_text(vistrail.get_notes(action.id))
+            return self.content.search(plainNotes)
+        return False
+
+class NameSearchStmt(SearchStmt):
+    def match(self, vistrail, action):
+        m = 0
+        tm = vistrail.get_tagMap()
+        if action.timestep in tm:
+            m = self.content.match(tm[action.timestep])
+        if bool(m) == False:
+            m = self.content.match(vistrail.get_description(action.timestep))
+        return bool(m)
+
+class ModuleSearchStmt(SearchStmt):
+    def match(self, vistrail, action):
+        pipeline = vistrail.getPipeline(action.timestep)
+        for module in pipeline.modules.itervalues():
+            if self.content.match(module.name):
+                return True
+        return False
+
+class AndSearchStmt(SearchStmt):
+    def __init__(self, lst):
+        self.matchList = lst
+    def match(self, vistrail, action):
+        for s in self.matchList:
+            if not s.match(vistrail, action):
+                return False
+        return True
+
+class OrSearchStmt(SearchStmt):
+    def __init__(self, lst):
+        self.matchList = lst
+    def match(self, vistrail, action):
+        for s in self.matchList:
+            if s.match(vistrail, action):
+                return True
+        return False
+
+class NotSearchStmt(SearchStmt):
+    def __init__(self, stmt):
+        self.stmt = stmt
+    def match(self, vistrail, action):
+        return not self.stmt.match(action)
+
+class TrueSearch(SearchStmt):
+    def __init__(self):
+        pass
+    def match(self, vistrail, action):
+        return True
+
+################################################################################
+
+class SearchCompiler(object):
+    SEPARATOR = -1
+    def __init__(self, searchStr):
+        self.searchStmt = self.compile(searchStr)
+    def compile(self, searchStr):
+        lst = []
+        t1 = searchStr.split(' ')
+        while t1:
+            tok = t1[0]
+            cmd = tok.split(':')
+            if not SearchCompiler.dispatch.has_key(cmd[0]):
+                fun = SearchCompiler.parseAny
+            else:
+                fun = SearchCompiler.dispatch[cmd[0]]
+            if len(cmd) > 1:
+                [search, rest] = fun(self, cmd[1:] + t1[1:])
+            else:
+                [search, rest] = fun(self, t1)
+            lst.append(search)
+            t1 = rest
+        return AndSearchStmt(lst)
+    def parseUser(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        return (UserSearchStmt(tokStream[0]), tokStream[1:])
+    def parseAny(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        tok = tokStream[0]
+        return (OrSearchStmt([UserSearchStmt(tok),
+                              NotesSearchStmt(tok),
+                              NameSearchStmt(tok)]), tokStream[1:])
+    def parseNotes(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        lst = []
+        while len(tokStream):
+            tok = tokStream[0]
+            if ':' in tok:
+                return (AndSearchStmt(lst), tokStream)
+            lst.append(NotesSearchStmt(tok))
+            tokStream = tokStream[1:]
+        return (AndSearchStmt(lst), [])
+    def parseName(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        lst = []
+        while len(tokStream):
+            tok = tokStream[0]
+            if ':' in tok:
+                return (AndSearchStmt(lst), tokStream)
+            lst.append(NameSearchStmt(tok))
+            tokStream = tokStream[1:]
+        return (AndSearchStmt(lst), [])
+    def parseModule(self, tokStream):
+        if len(tokStream) == 0:
+            raise SearchParseError('Expected token, got end of search')
+        lst = []
+        while len(tokStream):
+            tok = tokStream[0]
+            if ':' in tok:
+                return (AndSearchStmt(lst), tokStream)
+            lst.append(ModuleSearchStmt(tok))
+            tokStream = tokStream[1:]
+        return (AndSearchStmt(lst), [])
+    def parseBefore(self, tokStream):
+        old_tokstream = tokStream
+        try:
+            if len(tokStream) == 0:
+                raise SearchParseError('Expected token, got end of search')
+            lst = []
+            while len(tokStream):
+                tok = tokStream[0]
+                # ugly, special case times
+                if (':' in tok and
+                    not TimeSearchStmt.dateRE[2].match(tok) and
+                    not TimeSearchStmt.dateRE[3].match(tok)):
+                    return (BeforeSearchStmt(" ".join(lst)), tokStream)
+                lst.append(tok)
+                tokStream = tokStream[1:]
+            return (BeforeSearchStmt(" ".join(lst)), [])
+        except SearchParseError, e:
+            if 'Expected a date' in e.args[0]:
+                try:
+                    return self.parseAny(old_tokstream)
+                except SearchParseError, e2:
+                    print "Another exception...", e2.args[0]
+                    raise e
+            else:
+                raise
+            
+    def parseAfter(self, tokStream):
+        try:
+            if len(tokStream) == 0:
+                raise SearchParseError('Expected token, got end of search')
+            lst = []
+            while len(tokStream):
+                tok = tokStream[0]
+                # ugly, special case times
+                if (':' in tok and
+                    not TimeSearchStmt.dateRE[2].match(tok) and
+                    not TimeSearchStmt.dateRE[3].match(tok)):
+                    return (AfterSearchStmt(" ".join(lst)), tokStream)
+                lst.append(tok)
+                tokStream = tokStream[1:]
+            return (AfterSearchStmt(" ".join(lst)), [])
+        except SearchParseError, e:
+            if 'Expected a date' in e.args[0]:
+                try:
+                    return self.parseAny(['after'] + tokStream)
+                except SearchParseError, e2:
+                    print "Another exception...", e2.args[0]
+                    raise e
+            else:
+                raise
+
+    dispatch = {'user': parseUser,
+                'notes': parseNotes,
+                'before': parseBefore,
+                'after': parseAfter,
+                'name': parseName,
+                'module': parseModule,
+                'any': parseAny}
+                
+            
+
+################################################################################
+
+
+class TestSearch(unittest.TestCase):
+    def test1(self):
+        self.assertEquals((TimeSearchStmt('1 day ago').date -
+                           TimeSearchStmt('2 days ago').date), TimeSearchStmt.oneDay)
+    def test2(self):
+        self.assertEquals((TimeSearchStmt('12 mar 2006').date -
+                           TimeSearchStmt('11 mar 2006').date), TimeSearchStmt.oneDay)
+    def test3(self):
+        # This will fail if year flips during execution. Oh well :)
+        yr = datetime.datetime.today().year
+        self.assertEquals((TimeSearchStmt('12 mar').date -
+                           TimeSearchStmt('12 mar %d' % yr).date), 0.0)
+    def test4(self):
+        # This will fail if year flips during execution. Oh well :)
+        yr = datetime.datetime.today().year
+        self.assertEquals((TimeSearchStmt('mar 12').date -
+                           TimeSearchStmt('12 mar %d' % yr).date), 0.0)
+    def test5(self):
+        yr = datetime.datetime.today().year
+        self.assertEquals((TimeSearchStmt('03 15').date -
+                           TimeSearchStmt('15 mar %d' % yr).date), 0.0)
+    def test6(self):
+        self.assertEquals((TimeSearchStmt('03/15/2006').date -
+                           TimeSearchStmt('15 mar 2006').date), 0.0)
+    def test7(self):
+        self.assertEquals((TimeSearchStmt('1 day ago').date -
+                           TimeSearchStmt('24 hours ago').date), 0.0)
+    def test8(self):
+        self.assertEquals((TimeSearchStmt('1 hour ago').date -
+                           TimeSearchStmt('60 minutes ago').date), 0.0)
+    def test9(self):
+        self.assertEquals((TimeSearchStmt('1 minute ago').date -
+                           TimeSearchStmt('60 seconds ago').date), 0.0)
+    def test10(self):
+        self.assertEquals((TimeSearchStmt('1 week ago').date -
+                           TimeSearchStmt('7 days ago').date), 0.0)
+    def test11(self):
+        self.assertEquals((TimeSearchStmt('1 month ago').date -
+                           TimeSearchStmt('31 days ago').date), 0.0)
+    def test12(self):
+        self.assertEquals(TimeSearchStmt('12 mar 2007 21:00:00').date,
+                          TimeSearchStmt('21:00:00 12 mar 2007').date)
+    def test13(self):
+        # This will fail if year flips during execution. Oh well :)
+        yr = datetime.datetime.today().year
+        self.assertEquals(TimeSearchStmt('12 mar %d 21:00' % yr).date,
+                          TimeSearchStmt('21:00:00 12 mar').date)
+    def test14(self):
+        self.assertEquals(TimeSearchStmt('13 apr 2006 21:00').date,
+                          TimeSearchStmt('04/13/2006 21:00:00').date)
+    def test15(self):
+        import vistrails.core.vistrail
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        # FIXME: Add notes to this.
+#         self.assertTrue(NotesSearchStmt('mapper').match(v.actionMap[36]))
+#         self.assertFalse(NotesSearchStmt('-qt-block-indent').match(v.actionMap[36]))
+
+    # test16 and 17 now pass.
+    #     def test16(self):
+    #         self.assertRaises(SearchParseError, lambda *args: SearchCompiler('before:'))
+    #     def test17(self):
+    #         self.assertRaises(SearchParseError, lambda *args: SearchCompiler('after:yesterday before:lalala'))
+    def test18(self):
+        self.assertEquals(TimeSearchStmt('   13 apr 2006  ').date,
+                          TimeSearchStmt(' 13 apr 2006   ').date)
+    def test19(self):
+        self.assertEquals(SearchCompiler('before:13 apr 2006 12:34:56').searchStmt.matchList[0].date,
+                          BeforeSearchStmt('13 apr 2006 12:34:56').date)
+    def test20(self):
+        self.assertEquals(SearchCompiler('after:yesterday').searchStmt.matchList[0].date,
+                          SearchCompiler('before:yesterday').searchStmt.matchList[0].date)
+    def test21(self):
+        self.assertEquals(SearchCompiler('after:today').searchStmt.matchList[0].date,
+                          SearchCompiler('before:today').searchStmt.matchList[0].date)
+    def test22(self):
+        self.assertEquals(SearchCompiler('before:today').searchStmt.matchList[0].date,
+                          SearchCompiler('before:this day').searchStmt.matchList[0].date)
+    def test23(self):
+        t = time.localtime()
+        import vistrails.core.utils
+        inv = vistrails.core.utils.invert(TimeSearchStmt.months)
+        m = inv[t[1]]
+        self.assertEquals(SearchCompiler('after:%s %s %s' % (t[0], m, t[2])).searchStmt.matchList[0].date,
+                          SearchCompiler('after:today').searchStmt.matchList[0].date)
+    def test24(self):
+        # Test compiling these searches
+        SearchCompiler('before')
+        SearchCompiler('after')
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/query/visual.py b/vistrails/core/query/visual.py
new file mode 100644
index 0000000..9e87d14
--- /dev/null
+++ b/vistrails/core/query/visual.py
@@ -0,0 +1,239 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core import query
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.utils import append_to_dict_of_lists
+import copy
+import re
+
+################################################################################
+
+class VisualQuery(query.Query):
+
+    def __init__(self, pipeline, versions_to_check):
+        self.queryPipeline = copy.copy(pipeline)
+        self.versions_to_check = versions_to_check
+
+    def heuristicDAGIsomorphism(self,
+                                target, template,
+                                target_ids, template_ids):
+        resultIds = set()
+        while 1:
+            templateNames = set([(i, template.modules[i].name)
+                                 for i in template_ids])
+            targetNames = {}
+            for i in target_ids:
+                append_to_dict_of_lists(targetNames, target.modules[i].name, i)
+
+            nextTargetIds = set()
+            nextTemplateIds = set()
+
+            for (i, templateName) in templateNames:
+                if templateName not in targetNames:
+                    return (False, resultIds)
+                else:
+                    templateModule = template.modules[i]
+                    matched = [tId
+                               for tId in targetNames[templateName]
+                               if self.matchQueryModule(target.modules[tId],
+                                                        templateModule)]
+                    resultIds.update(matched)
+                    for matchedTargetId in matched:
+                        nextTargetIds.update([moduleId for
+                                              (moduleId, edgeId) in
+                                              target.graph.edges_from(matchedTargetId)])
+                    nextTemplateIds.update([moduleId for
+                                            (moduleId, edgeId) in
+                                            template.graph.edges_from(i)])
+
+            if not len(nextTemplateIds):
+                return (True, resultIds)
+
+            target_ids = nextTargetIds
+            template_ids = nextTemplateIds
+
+    def run(self, vistrail, name):
+        result = []
+        self.tupleLength = 2
+        for version in self.versions_to_check:
+            p = vistrail.getPipeline(version)
+            matches = set()
+            queryModuleNameIndex = {}
+            for moduleId, module in p.modules.iteritems():
+                append_to_dict_of_lists(queryModuleNameIndex, module.name, moduleId)
+            for querySourceId in self.queryPipeline.graph.sources():
+                querySourceName = self.queryPipeline.modules[querySourceId].name
+                if not queryModuleNameIndex.has_key(querySourceName):
+                    # need to reset matches here!
+                    matches = set()
+                    continue
+                candidates = queryModuleNameIndex[querySourceName]
+                atLeastOneMatch = False
+                for candidateSourceId in candidates:
+                    querySource = self.queryPipeline.modules[querySourceId]
+                    candidateSource = p.modules[candidateSourceId]
+                    if not self.matchQueryModule(candidateSource,
+                                                 querySource):
+                        continue
+                    (match, targetIds) = self.heuristicDAGIsomorphism \
+                                             (template = self.queryPipeline, 
+                                              target = p,
+                                              template_ids = [querySourceId],
+                                              target_ids = [candidateSourceId])
+                    if match:
+                        atLeastOneMatch = True
+                        matches.update(targetIds)
+                        
+                # We always perform AND operation
+                if not atLeastOneMatch:
+                    matches = set()
+                    break
+                
+            for m in matches:
+                result.append((version, m))
+        self.queryResult = result
+        self.computeIndices()
+        return result
+                
+    def __call__(self):
+        """Returns a copy of itself. This needs to be implemented so that
+        a visualquery object looks like a class that can be instantiated
+        once per vistrail."""
+        return VisualQuery(self.queryPipeline)
+
+    def matchQueryModule(self, template, target):
+        """ matchQueryModule(template, target: Module) -> bool        
+        Return true if the target module can be matched to the
+        template module
+        
+        """
+        if target.name != template.name:
+            return False
+        if target.getNumFunctions()>template.getNumFunctions():
+            return False
+        candidateFunctions = {}
+        for fid in xrange(template.getNumFunctions()):
+            f = template.functions[fid]
+            append_to_dict_of_lists(candidateFunctions, f.name, f)
+
+        for f in target.functions:
+            if f.name not in candidateFunctions:
+                return False
+            fNotMatch = True
+            candidates = candidateFunctions[f.name]
+            for cf in candidates:
+                if len(cf.params)!=len(f.params):
+                    continue
+                pMatch = True
+                for pid in xrange(len(cf.params)):
+                    cp = cf.params[pid]
+                    p = f.params[pid]                    
+                    if not self.matchQueryParam(p, cp):
+                        pMatch = False
+                        break
+                if pMatch:
+                    fNotMatch = False
+                    break
+            if fNotMatch:
+                return False
+        return True
+
+    def matchQueryParam(self, template, target):
+        """ matchQueryParam(template: Param, target: Param) -> bool
+        Check to see if target can match with a query template
+        
+        """
+        if (template.type != target.type or
+            template.identifier != target.identifier or 
+            template.namespace != target.namespace):
+            return False
+        
+        reg = get_module_registry()
+        desc = reg.get_descriptor_by_name(template.identifier, template.type,
+                                          template.namespace)
+        return desc.module.query_compute(target.strValue, template.strValue,
+                                         template.queryMethod)
+
+        # if template.type=='String':
+        #     op = template.queryMethod/2
+        #     caseInsensitive = template.queryMethod%2==0
+        #     templateStr = template.strValue
+        #     targetStr = target.strValue
+        #     if caseInsensitive:
+        #         templateStr = templateStr.lower()
+        #         targetStr = targetStr.lower()
+
+        #     if op==0:
+        #         return templateStr in targetStr
+        #     if op==1:
+        #         return templateStr==targetStr
+        #     if op==2:
+        #         try:
+        #             mo = re.match(templateStr, targetStr)
+        #             if mo!=None:
+        #                 return mo.end()==len(targetStr)
+        #             else:
+        #                 return False
+        #         except:
+        #             return False
+        # else:
+        #     # FIXME: eval should pretty much never be used
+        #     if template.strValue.strip()=='':
+        #         return True
+        #     realTypeDict = {'Integer': int, 'Float': float}
+        #     realType = realTypeDict[template.type]
+        #     try:
+        #         return realType(template.strValue)==realType(target.strValue)
+        #     except: # not a constant
+        #         try:
+        #             return bool(eval(target.strValue+' '+template.strValue))
+        #         except: # not a '<', '>', or '==' expression
+        #             try:
+        #                 s = template.strValue.replace(' ', '')
+        #                 if s[0]=='(':
+        #                     mid1 = '<%s)' % target.strValue
+        #                 if s[0]=='[':
+        #                     mid1 = '<=%s)' % target.strValue
+        #                 if s[-1]==')':
+        #                     mid2 = '(%s<' % target.strValue
+        #                 if s[-1]==']':
+        #                     mid2 = '(%s<=' % target.strValue
+                            
+        #                 s = s.replace(',', '%s and %s' % (mid1, mid2))
+        #                 s = '(' + s[1:-1] + ')'
+        #                 return eval(s)
+        #             except:
+        #                 print 'Invalid query "%s".' % template.strValue
+        #                 return False
diff --git a/vistrails/core/recent_vistrails.py b/vistrails/core/recent_vistrails.py
new file mode 100644
index 0000000..9f0297c
--- /dev/null
+++ b/vistrails/core/recent_vistrails.py
@@ -0,0 +1,111 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" RecentVistrailList is a Helper class to manage serialization and
+unserialization of a list of locators to XML """
+from vistrails.core.system import get_elementtree_library
+from vistrails.core.db.locator import FileLocator, DBLocator
+
+ElementTree = get_elementtree_library()
+
+class RecentVistrailList(object):
+    def __init__(self):
+        self.maxlocators = 0
+        self.locators = []
+        self.locators_map = {}
+        
+    @staticmethod
+    def unserialize(text):
+        """ unserialize(text) -> RecentVistrailList """
+        root = ElementTree.fromstring(text)
+        if root.tag != 'recentVistrails':
+            return None
+        vtlist = RecentVistrailList()
+        for node in root.getchildren():
+            loc = FileLocator.from_xml(node)
+            if loc is None:
+                loc = DBLocator.from_xml(node, include_name=True)
+            if loc is not None:
+                vtlist.locators.append(loc)
+                vtlist.locators_map[loc.name] = loc
+        return vtlist
+    
+    def serialize(self, node=None):
+        """serialize(node: ElementTree.Element) -> text
+        Convert this object to an XML representation.
+        """
+        if node is None:
+            node = ElementTree.Element('recentVistrails')
+        for loc in self.locators:
+            childNode = ElementTree.SubElement(node, 'locator')
+            if isinstance(loc, DBLocator):
+                loc.to_xml(childNode, include_name=True)
+            else:
+                loc.to_xml(childNode)
+        return ElementTree.tostring(node)
+    
+    def ensure_no_more_than_max(self, max):
+        while len(self.locators) > max:
+            locator = self.locators.pop()
+            del self.locators_map[locator.name]
+            
+        self.maxlocators = max
+        
+    def add_locator(self, locator):
+        if locator in self.locators:
+            self.locators.remove(locator)
+        self.locators.insert(0, locator)
+        self.locators_map[locator.name] = locator
+        
+        self.ensure_no_more_than_max(self.maxlocators)
+        
+    def remove_locator(self, locator):
+        if locator in self.locators:
+            self.locators.remove(locator)
+            del self.locators_map[locator.name]
+            
+    def length(self):
+        return len(self.locators)
+    
+    def get_locator(self, index):
+        try:
+            return self.locators[index]
+        except IndexError:
+            return None
+        
+    def get_locator_by_name(self, name):
+        try:
+            return self.locators_map[name]
+        except KeyError:
+            return None
\ No newline at end of file
diff --git a/vistrails/core/repository/__init__.py b/vistrails/core/repository/__init__.py
new file mode 100644
index 0000000..cdc9214
--- /dev/null
+++ b/vistrails/core/repository/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Nothing here on purpose
+pass
diff --git a/vistrails/core/repository/poster/__init__.py b/vistrails/core/repository/poster/__init__.py
new file mode 100644
index 0000000..bd04291
--- /dev/null
+++ b/vistrails/core/repository/poster/__init__.py
@@ -0,0 +1,67 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Copyright (c) 2010 Chris AtLee
+# 
+# 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.
+
+"""poster module
+
+Support for streaming HTTP uploads, and multipart/form-data encoding
+
+```poster.version``` is a 3-tuple of integers representing the version number.
+New releases of poster will always have a version number that compares greater
+than an older version of poster.
+New in version 0.6."""
+import vistrails.core.repository.poster.streaminghttp
+import vistrails.core.repository.poster.encode
+
+#version = (0, 7, 0) # Thanks JP!
diff --git a/vistrails/core/repository/poster/encode.py b/vistrails/core/repository/poster/encode.py
new file mode 100644
index 0000000..2905c47
--- /dev/null
+++ b/vistrails/core/repository/poster/encode.py
@@ -0,0 +1,469 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Copyright (c) 2010 Chris AtLee
+# 
+# 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.
+
+"""multipart/form-data encoding module
+
+This module provides functions that faciliate encoding name/value pairs
+as multipart/form-data suitable for a HTTP POST or PUT request.
+
+multipart/form-data is the standard way to upload files over HTTP"""
+
+__all__ = ['gen_boundary', 'encode_and_quote', 'MultipartParam',
+        'encode_string', 'encode_file_header', 'get_body_size', 'get_headers',
+        'multipart_encode']
+
+try:
+    import uuid
+    def gen_boundary():
+        """Returns a random string to use as the boundary for a message"""
+        return uuid.uuid4().hex
+except ImportError:
+    import random, sha
+    def gen_boundary():
+        """Returns a random string to use as the boundary for a message"""
+        bits = random.getrandbits(160)
+        return sha.new(str(bits)).hexdigest()
+
+import urllib, re, os, mimetypes
+
+def encode_and_quote(data):
+    """If ``data`` is unicode, return urllib.quote_plus(data.encode("utf-8"))
+    otherwise return urllib.quote_plus(data)"""
+    if data is None:
+        return None
+
+    if isinstance(data, unicode):
+        data = data.encode("utf-8")
+    return urllib.quote_plus(data)
+
+def _strify(s):
+    """If s is a unicode string, encode it to UTF-8 and return the results,
+    otherwise return str(s), or None if s is None"""
+    if s is None:
+        return None
+    if isinstance(s, unicode):
+        return s.encode("utf-8")
+    return str(s)
+
+class MultipartParam(object):
+    """Represents a single parameter in a multipart/form-data request
+
+    ``name`` is the name of this parameter.
+
+    If ``value`` is set, it must be a string or unicode object to use as the
+    data for this parameter.
+
+    If ``filename`` is set, it is what to say that this parameter's filename
+    is.  Note that this does not have to be the actual filename any local file.
+
+    If ``filetype`` is set, it is used as the Content-Type for this parameter.
+    If unset it defaults to "text/plain; charset=utf8"
+
+    If ``filesize`` is set, it specifies the length of the file ``fileobj``
+
+    If ``fileobj`` is set, it must be a file-like object that supports
+    .read().
+
+    Both ``value`` and ``fileobj`` must not be set, doing so will
+    raise a ValueError assertion.
+
+    If ``fileobj`` is set, and ``filesize`` is not specified, then
+    the file's size will be determined first by stat'ing ``fileobj``'s
+    file descriptor, and if that fails, by seeking to the end of the file,
+    recording the current position as the size, and then by seeking back to the
+    beginning of the file.
+
+    ``cb`` is a callable which will be called from iter_encode with (self,
+    current, total), representing the current parameter, current amount
+    transferred, and the total size.
+    """
+    def __init__(self, name, value=None, filename=None, filetype=None,
+                        filesize=None, fileobj=None, cb=None):
+        self.name = encode_and_quote(name)
+        self.value = _strify(value)
+        if filename is None:
+            self.filename = None
+        else:
+            if isinstance(filename, unicode):
+                # Encode with XML entities
+                self.filename = filename.encode("ascii", "xmlcharrefreplace")
+            else:
+                self.filename = str(filename)
+            self.filename = self.filename.encode("string_escape").\
+                    replace('"', '\\"')
+        self.filetype = _strify(filetype)
+
+        self.filesize = filesize
+        self.fileobj = fileobj
+        self.cb = cb
+
+        if self.value is not None and self.fileobj is not None:
+            raise ValueError("Only one of value or fileobj may be specified")
+
+        if fileobj is not None and filesize is None:
+            # Try and determine the file size
+            try:
+                self.filesize = os.fstat(fileobj.fileno()).st_size
+            except (OSError, AttributeError):
+                try:
+                    fileobj.seek(0, 2)
+                    self.filesize = fileobj.tell()
+                    fileobj.seek(0)
+                except:
+                    raise ValueError("Could not determine filesize")
+
+    def __cmp__(self, other):
+        attrs = ['name', 'value', 'filename', 'filetype', 'filesize', 'fileobj']
+        myattrs = [getattr(self, a) for a in attrs]
+        oattrs = [getattr(other, a) for a in attrs]
+        return cmp(myattrs, oattrs)
+
+    def reset(self):
+        if self.fileobj is not None:
+            self.fileobj.seek(0)
+        elif self.value is None:
+            raise ValueError("Don't know how to reset this parameter")
+
+    @classmethod
+    def from_file(cls, paramname, filename):
+        """Returns a new MultipartParam object constructed from the local
+        file at ``filename``.
+
+        ``filesize`` is determined by os.path.getsize(``filename``)
+
+        ``filetype`` is determined by mimetypes.guess_type(``filename``)[0]
+
+        ``filename`` is set to os.path.basename(``filename``)
+        """
+
+        return cls(paramname, filename=os.path.basename(filename),
+                filetype=mimetypes.guess_type(filename)[0],
+                filesize=os.path.getsize(filename),
+                fileobj=open(filename, "rb"))
+
+    @classmethod
+    def from_params(cls, params):
+        """Returns a list of MultipartParam objects from a sequence of
+        name, value pairs, MultipartParam instances,
+        or from a mapping of names to values
+
+        The values may be strings or file objects, or MultipartParam objects.
+        MultipartParam object names must match the given names in the
+        name,value pairs or mapping, if applicable."""
+        if hasattr(params, 'items'):
+            params = params.items()
+
+        retval = []
+        for item in params:
+            if isinstance(item, cls):
+                retval.append(item)
+                continue
+            name, value = item
+            if isinstance(value, cls):
+                assert value.name == name
+                retval.append(value)
+                continue
+            if hasattr(value, 'read'):
+                # Looks like a file object
+                filename = getattr(value, 'name', None)
+                if filename is not None:
+                    filetype = mimetypes.guess_type(filename)[0]
+                else:
+                    filetype = None
+
+                retval.append(cls(name=name, filename=filename,
+                    filetype=filetype, fileobj=value))
+            else:
+                retval.append(cls(name, value))
+        return retval
+
+    def encode_hdr(self, boundary):
+        """Returns the header of the encoding of this parameter"""
+        boundary = encode_and_quote(boundary)
+
+        headers = ["--%s" % boundary]
+
+        if self.filename:
+            disposition = 'form-data; name="%s"; filename="%s"' % (self.name,
+                    self.filename)
+        else:
+            disposition = 'form-data; name="%s"' % self.name
+
+        headers.append("Content-Disposition: %s" % disposition)
+
+        if self.filetype:
+            filetype = self.filetype
+        else:
+            filetype = "text/plain; charset=utf-8"
+
+        headers.append("Content-Type: %s" % filetype)
+
+        if self.filesize is not None:
+            headers.append("Content-Length: %i" % self.filesize)
+        else:
+            headers.append("Content-Length: %i" % len(self.value))
+
+        headers.append("")
+        headers.append("")
+
+        return "\r\n".join(headers)
+
+    def encode(self, boundary):
+        """Returns the string encoding of this parameter"""
+        if self.value is None:
+            value = self.fileobj.read()
+        else:
+            value = self.value
+
+        if re.search("^--%s$" % re.escape(boundary), value, re.M):
+            raise ValueError("boundary found in encoded string")
+
+        return "%s%s\r\n" % (self.encode_hdr(boundary), value)
+
+    def iter_encode(self, boundary, blocksize=4096):
+        """Yields the encoding of this parameter
+        If self.fileobj is set, then blocks of ``blocksize`` bytes are read and
+        yielded."""
+        total = self.get_size(boundary)
+        current = 0
+        if self.value is not None:
+            block = self.encode(boundary)
+            current += len(block)
+            yield block
+            if self.cb:
+                self.cb(self, current, total)
+        else:
+            block = self.encode_hdr(boundary)
+            current += len(block)
+            yield block
+            if self.cb:
+                self.cb(self, current, total)
+            last_block = ""
+            encoded_boundary = "--%s" % encode_and_quote(boundary)
+            boundary_exp = re.compile("^%s$" % re.escape(encoded_boundary),
+                    re.M)
+            while True:
+                block = self.fileobj.read(blocksize)
+                if not block:
+                    current += 2
+                    yield "\r\n"
+                    if self.cb:
+                        self.cb(self, current, total)
+                    break
+                last_block += block
+                if boundary_exp.search(last_block):
+                    raise ValueError("boundary found in file data")
+                last_block = last_block[-len(encoded_boundary)-2:]
+                current += len(block)
+                yield block
+                if self.cb:
+                    self.cb(self, current, total)
+
+    def get_size(self, boundary):
+        """Returns the size in bytes that this param will be when encoded
+        with the given boundary."""
+        if self.filesize is not None:
+            valuesize = self.filesize
+        else:
+            valuesize = len(self.value)
+
+        return len(self.encode_hdr(boundary)) + 2 + valuesize
+
+def encode_string(boundary, name, value):
+    """Returns ``name`` and ``value`` encoded as a multipart/form-data
+    variable.  ``boundary`` is the boundary string used throughout
+    a single request to separate variables."""
+
+    return MultipartParam(name, value).encode(boundary)
+
+def encode_file_header(boundary, paramname, filesize, filename=None,
+        filetype=None):
+    """Returns the leading data for a multipart/form-data field that contains
+    file data.
+
+    ``boundary`` is the boundary string used throughout a single request to
+    separate variables.
+
+    ``paramname`` is the name of the variable in this request.
+
+    ``filesize`` is the size of the file data.
+
+    ``filename`` if specified is the filename to give to this field.  This
+    field is only useful to the server for determining the original filename.
+
+    ``filetype`` if specified is the MIME type of this file.
+
+    The actual file data should be sent after this header has been sent.
+    """
+
+    return MultipartParam(paramname, filesize=filesize, filename=filename,
+            filetype=filetype).encode_hdr(boundary)
+
+def get_body_size(params, boundary):
+    """Returns the number of bytes that the multipart/form-data encoding
+    of ``params`` will be."""
+    size = sum(p.get_size(boundary) for p in MultipartParam.from_params(params))
+    return size + len(boundary) + 6
+
+def get_headers(params, boundary):
+    """Returns a dictionary with Content-Type and Content-Length headers
+    for the multipart/form-data encoding of ``params``."""
+    headers = {}
+    boundary = urllib.quote_plus(boundary)
+    headers['Content-Type'] = "multipart/form-data; boundary=%s" % boundary
+    headers['Content-Length'] = str(get_body_size(params, boundary))
+    return headers
+
+class multipart_yielder:
+    def __init__(self, params, boundary, cb):
+        self.params = params
+        self.boundary = boundary
+        self.cb = cb
+
+        self.i = 0
+        self.p = None
+        self.param_iter = None
+        self.current = 0
+        self.total = get_body_size(params, boundary)
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        """generator function to yield multipart/form-data representation
+        of parameters"""
+        if self.param_iter is not None:
+            try:
+                block = self.param_iter.next()
+                self.current += len(block)
+                if self.cb:
+                    self.cb(self.p, self.current, self.total)
+                return block
+            except StopIteration:
+                self.p = None
+                self.param_iter = None
+
+        if self.i is None:
+            raise StopIteration
+        elif self.i >= len(self.params):
+            self.param_iter = None
+            self.p = None
+            self.i = None
+            block = "--%s--\r\n" % self.boundary
+            self.current += len(block)
+            if self.cb:
+                self.cb(self.p, self.current, self.total)
+            return block
+
+        self.p = self.params[self.i]
+        self.param_iter = self.p.iter_encode(self.boundary)
+        self.i += 1
+        return self.next()
+
+    def reset(self):
+        self.i = 0
+        self.current = 0
+        for param in self.params:
+            param.reset()
+
+def multipart_encode(params, boundary=None, cb=None):
+    """Encode ``params`` as multipart/form-data.
+
+    ``params`` should be a sequence of (name, value) pairs or MultipartParam
+    objects, or a mapping of names to values.
+    Values are either strings parameter values, or file-like objects to use as
+    the parameter value.  The file-like objects must support .read() and either
+    .fileno() or both .seek() and .tell().
+
+    If ``boundary`` is set, then it as used as the MIME boundary.  Otherwise
+    a randomly generated boundary will be used.  In either case, if the
+    boundary string appears in the parameter values a ValueError will be
+    raised.
+
+    If ``cb`` is set, it should be a callback which will get called as blocks
+    of data are encoded.  It will be called with (param, current, total),
+    indicating the current parameter being encoded, the current amount encoded,
+    and the total amount to encode.
+
+    Returns a tuple of `datagen`, `headers`, where `datagen` is a
+    generator that will yield blocks of data that make up the encoded
+    parameters, and `headers` is a dictionary with the assoicated
+    Content-Type and Content-Length headers.
+
+    Examples:
+
+    >>> datagen, headers = multipart_encode( [("key", "value1"), ("key", "value2")] )
+    >>> s = "".join(datagen)
+    >>> assert "value2" in s and "value1" in s
+
+    >>> p = MultipartParam("key", "value2")
+    >>> datagen, headers = multipart_encode( [("key", "value1"), p] )
+    >>> s = "".join(datagen)
+    >>> assert "value2" in s and "value1" in s
+
+    >>> datagen, headers = multipart_encode( {"key": "value1"} )
+    >>> s = "".join(datagen)
+    >>> assert "value2" not in s and "value1" in s
+
+    """
+    if boundary is None:
+        boundary = gen_boundary()
+    else:
+        boundary = urllib.quote_plus(boundary)
+
+    headers = get_headers(params, boundary)
+    params = MultipartParam.from_params(params)
+
+    return multipart_yielder(params, boundary, cb), headers
diff --git a/vistrails/core/repository/poster/streaminghttp.py b/vistrails/core/repository/poster/streaminghttp.py
new file mode 100644
index 0000000..5f1cfd0
--- /dev/null
+++ b/vistrails/core/repository/poster/streaminghttp.py
@@ -0,0 +1,255 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Copyright (c) 2010 Chris AtLee
+# 
+# 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.
+
+"""Streaming HTTP uploads module.
+
+This module extends the standard httplib and urllib2 objects so that
+iterable objects can be used in the body of HTTP requests.
+
+In most cases all one should have to do is call :func:`register_openers()`
+to register the new streaming http handlers which will take priority over
+the default handlers, and then you can use iterable objects in the body
+of HTTP requests.
+
+**N.B.** You must specify a Content-Length header if using an iterable object
+since there is no way to determine in advance the total size that will be
+yielded, and there is no way to reset an interator.
+
+Example usage:
+
+>>> from StringIO import StringIO
+>>> import urllib2, poster.streaminghttp
+
+>>> opener = poster.streaminghttp.register_openers()
+
+>>> s = "Test file data"
+>>> f = StringIO(s)
+
+>>> req = urllib2.Request("http://localhost:5000", f,
+...                       {'Content-Length': str(len(s))})
+"""
+
+import httplib, urllib2, socket
+from httplib import NotConnected
+
+__all__ = ['StreamingHTTPConnection', 'StreamingHTTPRedirectHandler',
+        'StreamingHTTPHandler', 'register_openers']
+
+if hasattr(httplib, 'HTTPS'):
+    __all__.extend(['StreamingHTTPSHandler', 'StreamingHTTPSConnection'])
+
+class _StreamingHTTPMixin:
+    """Mixin class for HTTP and HTTPS connections that implements a streaming
+    send method."""
+    def send(self, value):
+        """Send ``value`` to the server.
+
+        ``value`` can be a string object, a file-like object that supports
+        a .read() method, or an iterable object that supports a .next()
+        method.
+        """
+        # Based on python 2.6's httplib.HTTPConnection.send()
+        if self.sock is None:
+            if self.auto_open:
+                self.connect()
+            else:
+                raise NotConnected()
+
+        # send the data to the server. if we get a broken pipe, then close
+        # the socket. we want to reconnect when somebody tries to send again.
+        #
+        # NOTE: we DO propagate the error, though, because we cannot simply
+        #       ignore the error... the caller will know if they can retry.
+        if self.debuglevel > 0:
+            print "send:", repr(value)
+        try:
+            blocksize = 8192
+            if hasattr(value, 'read') :
+                if hasattr(value, 'seek'):
+                    value.seek(0)
+                if self.debuglevel > 0:
+                    print "sendIng a read()able"
+                data = value.read(blocksize)
+                while data:
+                    self.sock.sendall(data)
+                    data = value.read(blocksize)
+            elif hasattr(value, 'next'):
+                if hasattr(value, 'reset'):
+                    value.reset()
+                if self.debuglevel > 0:
+                    print "sendIng an iterable"
+                for data in value:
+                    self.sock.sendall(data)
+            else:
+                self.sock.sendall(value)
+        except socket.error, v:
+            if v[0] == 32:      # Broken pipe
+                self.close()
+            raise
+
+class StreamingHTTPConnection(_StreamingHTTPMixin, httplib.HTTPConnection):
+    """Subclass of `httplib.HTTPConnection` that overrides the `send()` method
+    to support iterable body objects"""
+
+class StreamingHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
+    """Subclass of `urllib2.HTTPRedirectHandler` that overrides the
+    `redirect_request` method to properly handle redirected POST requests
+
+    This class is required because python 2.5's HTTPRedirectHandler does
+    not remove the Content-Type or Content-Length headers when requesting
+    the new resource, but the body of the original request is not preserved.
+    """
+
+    handler_order = urllib2.HTTPRedirectHandler.handler_order - 1
+
+    # From python2.6 urllib2's HTTPRedirectHandler
+    def redirect_request(self, req, fp, code, msg, headers, newurl):
+        """Return a Request or None in response to a redirect.
+
+        This is called by the http_error_30x methods when a
+        redirection response is received.  If a redirection should
+        take place, return a new Request to allow http_error_30x to
+        perform the redirect.  Otherwise, raise HTTPError if no-one
+        else should try to handle this url.  Return None if you can't
+        but another Handler might.
+        """
+        m = req.get_method()
+        if (code in (301, 302, 303, 307) and m in ("GET", "HEAD")
+            or code in (301, 302, 303) and m == "POST"):
+            # Strictly (according to RFC 2616), 301 or 302 in response
+            # to a POST MUST NOT cause a redirection without confirmation
+            # from the user (of urllib2, in this case).  In practice,
+            # essentially all clients do redirect in this case, so we
+            # do the same.
+            # be conciliant with URIs containing a space
+            newurl = newurl.replace(' ', '%20')
+            newheaders = dict((k, v) for k, v in req.headers.items()
+                              if k.lower() not in (
+                                  "content-length", "content-type")
+                             )
+            return urllib2.Request(newurl,
+                           headers=newheaders,
+                           origin_req_host=req.get_origin_req_host(),
+                           unverifiable=True)
+        else:
+            raise urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)
+
+class StreamingHTTPHandler(urllib2.HTTPHandler):
+    """Subclass of `urllib2.HTTPHandler` that uses
+    StreamingHTTPConnection as its http connection class."""
+
+    handler_order = urllib2.HTTPHandler.handler_order - 1
+
+    def http_open(self, req):
+        """Open a StreamingHTTPConnection for the given request"""
+        return self.do_open(StreamingHTTPConnection, req)
+
+    def http_request(self, req):
+        """Handle a HTTP request.  Make sure that Content-Length is specified
+        if we're using an interable value"""
+        # Make sure that if we're using an iterable object as the request
+        # body, that we've also specified Content-Length
+        if req.has_data():
+            data = req.get_data()
+            if hasattr(data, 'read') or hasattr(data, 'next'):
+                if not req.has_header('Content-length'):
+                    raise ValueError(
+                            "No Content-Length specified for iterable body")
+        return urllib2.HTTPHandler.do_request_(self, req)
+
+if hasattr(httplib, 'HTTPS'):
+    class StreamingHTTPSConnection(_StreamingHTTPMixin,
+            httplib.HTTPSConnection):
+        """Subclass of `httplib.HTTSConnection` that overrides the `send()`
+        method to support iterable body objects"""
+
+    class StreamingHTTPSHandler(urllib2.HTTPSHandler):
+        """Subclass of `urllib2.HTTPSHandler` that uses
+        StreamingHTTPSConnection as its http connection class."""
+
+        handler_order = urllib2.HTTPSHandler.handler_order - 1
+
+        def https_open(self, req):
+            return self.do_open(StreamingHTTPSConnection, req)
+
+        def https_request(self, req):
+            # Make sure that if we're using an iterable object as the request
+            # body, that we've also specified Content-Length
+            if req.has_data():
+                data = req.get_data()
+                if hasattr(data, 'read') or hasattr(data, 'next'):
+                    if not req.has_header('Content-length'):
+                        raise ValueError(
+                                "No Content-Length specified for iterable body")
+            return urllib2.HTTPSHandler.do_request_(self, req)
+
+
+def register_openers(cookiejar=None):
+    """Register the streaming http handlers in the global urllib2 default
+    opener object.
+
+    Returns the created OpenerDirector object."""
+    handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler]
+    if hasattr(httplib, "HTTPS"):
+        handlers.append(StreamingHTTPSHandler)
+
+    if cookiejar:
+        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar), *handlers)
+    else:
+        opener = urllib2.build_opener(*handlers)
+
+    urllib2.install_opener(opener)
+
+    return opener
diff --git a/vistrails/core/requirements.py b/vistrails/core/requirements.py
new file mode 100644
index 0000000..01b76d5
--- /dev/null
+++ b/vistrails/core/requirements.py
@@ -0,0 +1,94 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""module that allows online inspection of environment to test presence of
+runtime components such as binaries, libraries, other python modules, etc."""
+import sys
+
+import vistrails.core.bundles.installbundle
+from vistrails.core.configuration import get_vistrails_configuration
+import vistrails.core.system
+
+##############################################################################
+
+def python_module_exists(module_name):
+    """python_module_exists(module_name): Boolean.
+Returns if python module of given name can be safely imported."""
+    
+    try:
+        sys.modules[module_name]
+        return True
+    except KeyError:
+        pass
+    try:
+        __import__(module_name)
+        return True
+    except ImportError:
+        return False
+    
+
+def executable_file_exists(filename):
+    """executable_file_exists(filename): Boolean.
+Returns if certain file is in current path and is executable."""
+    result = vistrails.core.system.executable_is_in_path(filename)
+    if result == "":
+        result = vistrails.core.system.executable_is_in_pythonpath(filename)
+    return result != ""
+
+# FIXME: Add documentation.
+
+def require_python_module(module_name, dep_dict=None):
+    exists = python_module_exists(module_name)
+    if (not exists and
+            dep_dict and
+            getattr(get_vistrails_configuration(), 'installBundles')):
+        vistrails.core.bundles.installbundle.install(dep_dict)
+        exists = python_module_exists(module_name)
+    if not exists:
+        raise MissingRequirement(module_name)
+
+def require_executable(filename):
+    if not executable_file_exists(filename):
+        raise MissingRequirement(filename)
+
+##############################################################################
+
+class MissingRequirement(Exception):
+    """Raise this exception in packages when necessary items are missing."""
+    def __init__(self, req):
+        self.requirement = req
+    def __str__(self):
+        return "Missing Requirement: %s" % self.requirement
+
diff --git a/vistrails/core/resources/default_vistrails_startup b/vistrails/core/resources/default_vistrails_startup
new file mode 100644
index 0000000..0a6c394
--- /dev/null
+++ b/vistrails/core/resources/default_vistrails_startup
@@ -0,0 +1,204 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Vistrails initialization file
+##############################################################################
+
+##############################################################################
+# Basic configuration
+
+# Comment this to use the logging mechanism (which is being 
+# overhauled, so right now it's also broken)
+configuration.nologger = True
+
+# Uncomment this to prevent VisTrails's splash screen from appearing
+# configuration.showSplash = False
+
+# Uncomment this to enable VisTrails's python shell by default
+# configuration.pythonPrompt = True
+
+# Uncomment this to switch to the non-caching execution model
+# configuration.useCache = False
+
+# Uncomment this to start VisTrails with maximized windows
+# configuration.maximizeWindows = True
+
+# Uncomment this if you run multiple monitors, to start VisTrails
+# with different windows in different monitors
+# configuration.multiHeads = True
+
+# Set verbosenessLevel to 1 or 2 to enable dumping of non-critical warnings
+# and information messages to stderr.
+# configuration.verbosenessLevel = 1 # 2
+
+##############################################################################
+# VisTrails packages.
+
+# VisTrails packages are collections of modules that provide user-specified
+# functionality to VisTrails. Use addPackage to let VisTrails know which 
+# packages you want enabled.
+
+# Interpackage dependencies must currently be handled manually by the user.
+
+# For example, the spreadsheet package depends on VTK for some functionality,
+# so if you want that functionality, you should add the vtk package before
+# the spreadsheet package.
+
+# the vtk package is the main visualization package for VisTrails
+# addPackage('vtk')
+
+# pythonCalc is an example package intended simply to demonstrate how to
+# create new packages
+# addPackage('pythonCalc')
+
+# ImageMagick uses the ImageMagick command-line suite to perform various
+# tasks on images (conversion, filtering, etc).
+#addPackage('ImageMagick')
+
+# The spreadsheet package enables the Visualization Spreadsheet
+# addPackage('spreadsheet')
+
+# The HTTP package provides an easy way to access files from http and use
+# them as regular files in VisTrails pipelines.
+# addPackage('HTTP')
+
+# The pylab (matplotlib) package for plotting and histograms
+# addPackage('pylab')
+
+
+################################################################################
+# Hooks
+
+# Currently, there is only one hook in VisTrails: the startup hook. By adding
+# arbitrary callables to the startup hook, it is possible to run user-defined
+# code after all packages have been initialized, but before VisTrails runs.
+
+# This is intended to show that it is possible to have user-defined code
+# in specific places in VisTrails. If you think you need a hook somewhere that
+# we haven't allowed yet, please let us know, and we'll include it in a future
+# release.
+
+def testHook():
+    """Prints the Module class hierarchy to stdout."""
+    def printTree(n, indent = 0):
+        def iprint(str):
+            print '%s%s' % (" " * indent, str)
+        iprint('Class: %s' % n.descriptor.name)
+        for c in n.children:
+            printTree(c, indent+4)
+            
+    import modules
+    import modules.module_registry
+    t = modules.module_registry.registry.classTree
+    printTree(t)
+
+# Uncomment this line to install the startup hook
+# addStartupHook(testHook)
+
+
+##############################################################################
+# If you have an appropriate Qt license, you can install signal inspectors,
+# which might make debugging a whole lot easier. To do that, uncomment the
+# following lines.
+
+
+# import qt
+# connections = {}
+# def connectHandler(*args):
+#     """This handler writes all signal connections to /tmp/signalslotnames.txt"""
+#     emitter = args[0].__class__.__name__
+#     signal = args[1]
+#     f = signal.find('(')
+#     if f == -1:
+#         signal = signal[1:]
+#     else:
+#         signal = signal[1:f]
+#     try:
+#         receiver = args[2].im_class.__name__
+#         slot = args[2].im_func.__name__
+#     except AttributeError:
+#         receiver = args[2].__self__.__class__.__name__
+#         slot = args[2].__class__.__name__
+#     entry = (emitter, signal, receiver, slot)
+#     print entry
+#     global connections
+#     try:
+#         connections[emitter].add((signal, receiver, slot))
+#     except:
+#         connections[emitter] = set(((signal, receiver, slot),))
+#     signals = {}
+#     slots = {}
+#     sig_count = 1
+#     slot_count = 1
+#     f = open('/tmp/connections.txt', 'w')
+#     f.write('digraph {\n')
+#     for (k, v) in connections.iteritems():
+#         print k, v
+#         recs = {}
+#         for (sig, rec, sl) in v:
+#             if not signals.has_key(sig):
+#                 signals[sig] = sig_count
+#                 sig_count += 1
+#             if not slots.has_key(sl):
+#                 slots[sl] = slot_count
+#                 slot_count += 1
+#             try:
+#                 recs[rec].append( str(signals[sig]) + ':' + str(slots[sl]))
+#             except:
+#                 recs[rec] = [str(signals[sig]) + ':' + str(slots[sl])]
+#         for rec, sigslotlist in recs.iteritems():
+#             f.write('%s -> %s [label = "%s"];\n' % (k, rec, ";".join(sigslotlist)))
+# #     if not entry in connections:
+# #         f = open('/tmp/connections.txt', 'a')
+# #         f.write("%s %s %s\n" % emi)
+# #         f.close()
+# #     connections.add(entry)
+#     f.write('}\n')
+#     f.close()
+#     f = open('/tmp/signalslotnames.txt', 'w')
+#     sigs = [(v, k) for (k, v) in signals.items()]
+#     sigs.sort()
+#     sls = [(v, k) for (k, v) in slots.items()]
+#     sls.sort()
+#     f.write('signals: \n')
+#     for (k,v) in sigs:
+#         f.write('%s: %s\n' % (k, v))
+#     f.write('slots: \n')
+#     for (k,v) in sls:
+#         f.write('%s: %s\n' % (k, v))
+
+
+# This line hooks connectHandler to Qt's signals. You can use user-defined
+# code here.
+# qt.enableSignalDebugging(connectCall = connectHandler)
diff --git a/vistrails/core/resources/default_vistrails_startup_xml b/vistrails/core/resources/default_vistrails_startup_xml
new file mode 100644
index 0000000..f901b45
--- /dev/null
+++ b/vistrails/core/resources/default_vistrails_startup_xml
@@ -0,0 +1,70 @@
+<startup version="0.1">
+  <configuration>
+    <key name="nologger">
+      <bool value="True"/>
+    </key>
+  </configuration>
+  <packages>
+    <package name="vtk"/>
+    <package name="pythonCalc"/>
+    <package name="spreadsheet"/>
+    <package name="dialogs"/>
+    <package name="HTTP"/>
+    <package name="controlflow"/>
+    <package name="tabledata"/>
+  </packages>
+  <disabledpackages/>
+</startup>
+
+<!--
+	This is what a "regular" startup file looks like.
+
+<startup version="0.1">
+  <configuration>
+    <key name="nologger">
+      <bool value="True"/>
+    </key>
+    <key name="shell">
+      <configuration>
+        <key name="font_face">
+  	  <str value="Bitstream Vera mono"/>
+        </key>
+        <key name="font_size">
+	  <int value="9"/>
+        </key>
+      </configuration>
+    </key>
+  </configuration>
+  <packages>
+    <package name="vtk"/>
+    <package name="spreadsheet"/>
+    <package name="pythonCalc"/>
+    <package name="ImageMagick"/>
+    <package name="HTTP"/>
+    <package name="teem"/>
+    <package name="ectmc"/>
+    <package name="macet"/>
+    <package name="trimesh2"/>
+    <package name="meshutils"/>
+    <package name="afront">
+      <configuration>
+	<key name="debug">
+	  <bool value="True"/>
+	</key>
+      </configuration>
+    </package>
+    <package name="metro"/>
+    <package name="console_mode_test"/>
+    <package name="ProteinDataBank"/>
+    <package name="dialogs"/>
+    <package name="SciPy"/>
+    <package name="webServices">
+      <configuration>
+         <key name="wsdlList">
+           <str value=""/>
+         </key>
+      </configuration>
+    </package>
+  </packages>
+</startup>
+-->
diff --git a/vistrails/core/resources/spawned_startup_xml b/vistrails/core/resources/spawned_startup_xml
new file mode 100644
index 0000000..b65ed3a
--- /dev/null
+++ b/vistrails/core/resources/spawned_startup_xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" ?>
+<startup version="0.1">
+  <packages>
+    <package name="spreadsheet">
+      <configuration>
+        <key name="columnCount">
+          <int value="3"/>
+        </key>
+        <key name="rowCount">
+          <int value="2"/>
+        </key>
+        <key name="dumpfileType">
+          <str value="PNG"/>
+        </key>
+      </configuration>
+    </package>
+    <package name="controlflow"/>
+    <package name="abstraction"/>
+  </packages>
+  <disabledpackages/>
+  <configuration>
+    <key name="nologger">
+      <bool value="True"/>
+    </key>
+    <key name="nologfile">
+      <bool value="True"/>
+    </key>
+    <key name="spawned">
+      <bool value="True"/>
+    </key>
+    <key name="shell">
+      <configuration>
+        <key name="font_face">
+          <str value="Bitstream Vera mono"/>
+        </key>
+        <key name="font_size">
+          <int value="9"/>
+        </key>
+      </configuration>
+    </key>
+  </configuration>
+</startup>
diff --git a/vistrails/core/startup.py b/vistrails/core/startup.py
new file mode 100644
index 0000000..3487722
--- /dev/null
+++ b/vistrails/core/startup.py
@@ -0,0 +1,598 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Describes the start-up process of VisTrails"""
+from vistrails.core import debug
+from vistrails.core import system
+from vistrails.core.utils.uxml import named_elements, elements_filter, \
+     eval_xml_value, enter_named_element
+import copy
+import vistrails.core.packagemanager
+import vistrails.core.utils
+import os.path
+import shutil
+import sys
+import tempfile
+import vistrails.core.configuration
+import xml.dom.minidom
+
+################################################################################
+
+class VistrailsStartup(object):
+    """
+    VistrailsStartup is the class that initializes VisTrails based on
+    a configuration. Both application mode (interactive and
+    non-interactive) and import mode of VisTrails use this start up
+    process to install packages and run .vistrails file. The purpose
+    of this class is to separate the initialization process with Qt
+    Application
+    
+    """
+
+    def __init__(self, config=None, tempconfig=None):
+        """ VistrailsStartup(config, tempconfig: ConfigurationObject,
+                             optionsDict: dict) -> None
+        Setup the configuration. config is the persistent configuration and 
+        tempconfig is the current configuration.
+        
+        """
+        assert (config is None or
+                isinstance(config, vistrails.core.configuration.ConfigurationObject))
+        assert (tempconfig is None or
+                isinstance(tempconfig, vistrails.core.configuration.ConfigurationObject))
+        if config:
+            self.configuration = config
+        else:
+            self.configuration = vistrails.core.configuration.default()
+        if tempconfig:
+            self.temp_configuration = tempconfig
+        else:
+            self.temp_configuration = copy.copy(self.configuration)
+        
+        self.startupHooks = []
+        
+        # This needs to be here because we want to log all initialization
+        # steps
+        self.setupLogFile()
+        self._python_environment = self.runDotVistrails()
+        self.load_configuration()
+        
+        #the problem is that maybe the logFile now points to a different place
+        self.setupLogFile()
+        
+        self.setupDefaultFolders()
+        #package_manager needs the persistent configuration    
+        self._package_manager = vistrails.core.packagemanager.PackageManager(
+            self.configuration)
+            
+        self._do_load_packages = True
+        self._package_dictionary = {}
+        # stores all packages that must be enabled on startup
+        self._needed_packages = []
+        
+    def init(self):
+        """ init() -> None        
+        Initialize VisTrails with optionsDict. optionsDict can be
+        another VisTrails Configuration object, e.g. ConfigurationObject
+        
+        """
+        if self._do_load_packages:
+            self.load_packages()
+        if self._do_load_packages:
+            # don't call this anymore since we do an add_package for it now
+            # self.setupBaseModules()
+            self.installPackages()
+        self.runStartupHooks()
+
+    def set_needed_packages(self, package_list):
+        self._needed_packages = package_list
+
+    ##########################################################################
+    # startup.xml related
+
+    def startup_dom(self):
+        filename = os.path.join(self.temp_configuration.dotVistrails,'startup.xml')
+        return xml.dom.minidom.parse(filename)
+
+    def write_startup_dom(self, dom):
+        filename = os.path.join(self.temp_configuration.dotVistrails,'startup.xml')
+        f = open(filename, 'w')
+        f.write(dom.toxml())
+                
+    def load_configuration(self):
+        """load_configuration() -> None
+        Loads the appropriate configuration from .vistrails/startup.xml.
+        This will overwrite both configuration and temp_configuration
+        
+        """
+        dom = self.startup_dom()
+        conf = enter_named_element(dom.documentElement, 'configuration')
+        self.configuration.set_from_dom_node(conf)
+        self.temp_configuration.set_from_dom_node(conf)
+        
+    def load_packages(self):
+        """load_packages() -> None
+
+        Loads the appropriate packages from .vistrails/startup.xml.
+        """
+        
+        for package_name in self._needed_packages:
+            self._package_manager.add_package(package_name)
+
+        def parse_package(node):
+            is_value = (lambda node: node.nodeName in
+                        set(['bool', 'str', 'int', 'float']))
+            package_name = str(node.attributes['name'].value)
+            # FIXME use more robust checks here!
+            if package_name != 'basic_modules' and \
+                    package_name != 'abstraction':
+                self._package_manager.add_package(package_name)
+        dom = self.startup_dom()
+        doc = dom.documentElement
+        packages_node = enter_named_element(doc, 'packages')
+        for package_node in named_elements(packages_node, 'package'):
+            parse_package(package_node)
+
+    ##########################################################################
+
+    def get_python_environment(self):
+        """get_python_environment(): returns the python environment generated
+by startup.py. This should only be called after init()."""
+        return self._python_environment
+
+    def create_default_directory(self):
+        if os.path.lexists(self.temp_configuration.dotVistrails):
+            return
+
+        debug.log('Will try to create default directory')
+        try:
+            os.mkdir(self.temp_configuration.dotVistrails)
+            debug.log('Succeeded!')
+        except:
+            debug.critical("""Failed to create initialization directory.
+                    This could be an indication of a permissions problem.
+                    Make sure parent directory of '%s' is writable."""
+                    % self.temp_configuration.dotVistrails)
+            sys.exit(1)
+                
+    def runDotVistrails(self):
+        """ runDotVistrails() -> None
+        Setup to run user .vistrails file
+
+        """        
+        def addStartupHook(hook):
+            """ addStartupHook(hook: function) -> None
+            Add a hook for start-up after initialization
+            
+            """
+            self.startupHooks.append(hook)
+
+        def addPackage(packageName, *args, **keywords):
+            """ addPackage(packageName: str, *args) -> None
+            """
+            self._package_manager.add_package(packageName)
+
+        def create_user_packages_init(userpackagesname):
+            try:
+                name = os.path.join(userpackagesname, '__init__.py')
+                f = open(name, 'w')
+                f.write('pass\n')
+                f.close()
+            except:
+                msg = ("""Failed to create file '%s'. This could indicate a
+                rare combination of a race condition and a permissions problem.
+                Please make sure it is writable.""" % name)
+                debug.critical(msg)
+                sys.exit(1)
+
+        def create_user_packages_dir(userpackagesname=None):
+            debug.warning('Will try to create userpackages directory')
+            if userpackagesname is None:
+                userpackagesname = os.path.join(self.temp_configuration.dotVistrails,
+                                            'userpackages')
+            if not os.path.isdir(userpackagesname):
+                try:
+                    os.mkdir(userpackagesname)
+                    self.configuration.userPackageDirectory = userpackagesname
+                    self.temp_configuration.userPackageDirectory = \
+                        userpackagesname
+                except:
+                    msg = ("""Failed to create userpackages directory: '%s'.
+                    This could be an indication of a permissions problem.
+                    Make sure directory '%s' in writable.""" %
+                           (userpackagesname,
+                            self.configuration.dotVistrails))
+                    debug.critical(msg)
+                    sys.exit(1)
+            create_user_packages_init(userpackagesname)
+                
+        def create_thumbnails_dir(thumbnails_dir=None):
+            debug.log('Will try to create thumbnails directory')
+            if thumbnails_dir is None:
+                thumbnails_dir = os.path.join(self.temp_configuration.dotVistrails,
+                                            'thumbs')
+
+            if not os.path.isdir(thumbnails_dir):
+                try:
+                    os.mkdir(thumbnails_dir)
+                    self.configuration.thumbs.cacheDirectory = thumbnails_dir
+                    self.temp_configuration.thumbs.cacheDirectory = \
+                        thumbnails_dir
+                except:
+                    msg = ("Failed to create thumbnails cache directory: '%s'.  "
+                           "This could be an indication of a permissions "
+                           "problem.  Make sure directory '%s' is writable." % \
+                               (thumbnails_dir, 
+                                self.configuration.dotVistrails))
+                    debug.critical(msg)
+                    sys.exit(1)   
+                                
+        def create_abstractions_dir(abstractions_dir=None):
+            debug.log('Will try to create subworkflows directory')
+            abstractions_dir = os.path.join(self.temp_configuration.dotVistrails,
+                                            'subworkflows')
+
+            if not os.path.isdir(abstractions_dir):
+                try:
+                    os.mkdir(abstractions_dir)
+                    self.configuration.abstractionsDirectory = abstractions_dir
+                    self.temp_configuration.abstractionsDirectory = \
+                        abstractions_dir
+                except:
+                    msg = ("Failed to create subworkflows directory: '%s'.  "
+                           "This could be an indication of a permissions "
+                           "problem.  Make sure directory '%s' is writable." % \
+                               (abstractions_dir, 
+                                self.configuration.dotVistrails))
+                    debug.critical(msg)
+                    sys.exit(1)
+#             try:
+#                 root_dir = core.system.vistrails_root_directory()
+#                 default_file = os.path.join(root_dir,'core','resources',
+#                                             'abstractions_init')
+#                 user_file = os.path.join(abstractions_dir, '__init__.py')
+#                 print 'copying', default_file, '->', abstractions_dir
+#                 shutil.copyfile(default_file, user_file)
+#                 debug.log('Succeeded!')
+#             except Exception, e:
+#                 print e
+#                 debug.critical("Failed to copy default file to abstractions "
+#                                "package.  This could be an indication of a "
+#                                "permissions problem. Make sure directory "
+#                                "'%s' is writable" % abstractions_dir)
+#                 sys.exit(1)
+
+        def install_default_startup():
+            debug.log('Will try to create default startup script')
+            try:
+                root_dir = vistrails.core.system.vistrails_root_directory()
+                default_file = os.path.join(root_dir,'core','resources',
+                                            'default_vistrails_startup')
+                user_file = os.path.join(self.temp_configuration.dotVistrails,
+                                         'startup.py')
+                shutil.copyfile(default_file,user_file)
+                debug.log('Succeeded!')
+            except:
+                debug.critical("""Failed to copy default file %s.
+                This could be an indication of a permissions problem.
+                Make sure directory '%s' is writable"""
+                % (user_file,self.temp_configuration.dotVistrails))
+                sys.exit(1)
+
+        def install_default_startupxml_if_needed():
+            fname = os.path.join(self.temp_configuration.dotVistrails,
+                                 'startup.xml')
+            root_dir = vistrails.core.system.vistrails_root_directory() 
+            origin = os.path.join(root_dir, 'core','resources',
+                                  'default_vistrails_startup_xml')
+            def skip():
+                if os.path.isfile(fname):
+                    try:
+                        d = self.startup_dom()
+                        v = str(d.getElementsByTagName('startup')[0].attributes['version'].value)
+                        r = vistrails.core.utils.version_string_to_list(v)
+                        return r >= [0, 1]
+                    except:
+                        return False
+                else:
+                    return False
+            if skip():
+                return
+            try:
+                shutil.copyfile(origin, fname)
+                debug.log('Succeeded!')
+            except:
+                debug.critical("""Failed to copy default configuration
+                file to %s. This could be an indication of a
+                permissions problem. Please make sure '%s' is writable."""
+                               % (fname,
+                                  self.temp_configuration.dotVistrails))
+
+        def execDotVistrails(tried_once=False):
+            """ execDotVistrails() -> None
+            Actually execute the Vistrail initialization
+            
+            """
+            # if it is file, then must move old-style .vistrails to
+            # directory.
+            if os.path.isfile(self.temp_configuration.dotVistrails):
+                debug.warning("Old-style initialization hooks. Will try to set things correctly.")
+                (fd, name) = tempfile.mkstemp()
+                os.close(fd)
+                try:
+                    shutil.copyfile(self.temp_configuration.dotVistrails, name)
+                    try:
+                        os.unlink(self.temp_configuration.dotVistrails)
+                    except:
+                        debug.critical("""Failed to remove old initialization file.
+                        This could be an indication of a permissions problem.
+                        Make sure file '%s' is writable."""
+                        % self.temp_configuration.dotVistrails)
+                        sys.exit(1)
+                    self.create_default_directory()
+                    try:
+                        destiny = os.path.join(self.temp_configuration.dotVistrails,
+                                               'startup.py')
+                        shutil.copyfile(name, destiny)
+                    except:
+                        debug.critical("""Failed to copy old initialization file to
+                        newly-created initialization directory. This must have been
+                        a race condition. Please remove '%s' and
+                        restart VisTrails."""
+                        % self.temp_configuration.dotVistrails)
+                        sys.exit(1)
+                    debug.critical("Successful move!")
+                finally:
+                    try:
+                        os.unlink(name)
+                    except:
+                        debug.warning("Failed to erase temporary file.")
+
+            if os.path.isdir(self.temp_configuration.dotVistrails):
+                if self.temp_configuration.check('userPackageDirectory'):
+                    userpackages = self.temp_configuration.userPackageDirectory
+                else:
+                    userpackages = os.path.join(self.temp_configuration.dotVistrails,
+                                            'userpackages')
+                startup = os.path.join(self.temp_configuration.dotVistrails,
+                                       'startup.py')
+                if self.temp_configuration.check('abstractionsDirectory'):
+                    abstractions = self.temp_configuration.abstractionsDirectory
+                else:
+                    abstractions = os.path.join(self.temp_configuration.dotVistrails,
+                                            'subworkflows')
+                if (self.temp_configuration.has('thumbs') and
+                    self.temp_configuration.thumbs.check('cacheDirectory')):
+                    thumbnails = self.temp_configuration.thumbs.cacheDirectory
+                else:
+                    thumbnails = os.path.join(self.temp_configuration.dotVistrails,
+                                          'thumbs')
+                if not os.path.isdir(userpackages):
+                    create_user_packages_dir(userpackages)
+                if not os.path.isfile(os.path.join(userpackages, 
+                                                   '__init__.py')):
+                    create_user_packages_init(userpackages)
+                if not os.path.isdir(abstractions):
+                    create_abstractions_dir(abstractions)
+                if not os.path.isdir(thumbnails):
+                    create_thumbnails_dir(thumbnails)
+                try:
+                    
+                    dotVistrails = open(startup)
+                    g = {}
+                    localsDir = {'configuration': self.temp_configuration,
+                                 'addStartupHook': addStartupHook,
+                                 'addPackage': addPackage}
+                    old_path = copy.copy(sys.path)
+                    sys.path.append(self.temp_configuration.dotVistrails)
+                    exec dotVistrails in localsDir
+                    sys.path = old_path
+                    del localsDir['addPackage']
+                    del localsDir['addStartupHook']
+                    return localsDir
+                except IOError:
+                    if tried_once:
+                        debug.critical("""Still cannot find default file.
+                        Something has gone wrong. Please make sure ~/.vistrails
+                        exists, is writable, and ~/.vistrails/startup.py does
+                        not exist.""")
+                        sys.exit(1)
+                    debug.critical('%s not found' % startup)
+                    debug.critical('Will try to install default '
+                                              'startup file')
+                    install_default_startup()
+                    install_default_startupxml_if_needed()
+                    return execDotVistrails(True)
+            elif not os.path.lexists(self.temp_configuration.dotVistrails):
+                debug.log('%s not found' % self.temp_configuration.dotVistrails)
+                self.create_default_directory()
+                create_user_packages_dir()
+                create_abstractions_dir()
+                create_thumbnails_dir()
+                install_default_startup()
+                install_default_startupxml_if_needed()
+                return execDotVistrails(True)
+
+        #install_default_startupxml_if_needed()
+        # Now execute the dot vistrails
+        return execDotVistrails()
+
+    def setupDefaultFolders(self):
+        """ setupDefaultFolders() -> None        
+        Give default values to folders when there are no values specified
+        
+        """
+        if self.temp_configuration.has('rootDirectory'):
+            system.set_vistrails_root_directory(self.temp_configuration.rootDirectory)
+        if self.temp_configuration.has('dataDirectory'):
+            system.set_vistrails_data_directory( \
+                self.temp_configuration.dataDirectory)
+        if self.temp_configuration.has('fileDirectory'):
+            system.set_vistrails_file_directory( \
+                self.temp_configuration.fileDirectory)
+        if (self.temp_configuration.has('verbosenessLevel') and
+            self.temp_configuration.verbosenessLevel != -1):
+            verbose = self.temp_configuration.verbosenessLevel
+            if verbose < 0:
+                msg = ("""Don't know how to set verboseness level to %s - "
+                       "setting to the lowest one I know of: 0""" % verbose)
+                debug.critical(msg)
+                verbose = 0
+            if verbose > 2:
+                msg = ("""Don't know how to set verboseness level to %s - "
+                       "setting to the highest one I know of: 2""" % verbose)
+                debug.critical(msg)
+                verbose = 2
+            dbg = debug.DebugPrint.getInstance()
+            levels = [dbg.WARNING, dbg.INFO, dbg.DEBUG]
+            dbg.set_message_level(levels[verbose])
+            debug.log("Set verboseness level to %s" % verbose)
+        
+        #these checks may need to update the persistent configuration, so
+        # we have to change both objects
+        #userpackages directory
+        if not self.temp_configuration.check('userPackageDirectory'):
+            s = os.path.join(self.temp_configuration.dotVistrails,
+                             'userpackages')
+            self.temp_configuration.userPackageDirectory = s
+        if not self.configuration.check('userPackageDirectory'):
+            s = os.path.join(self.configuration.dotVistrails,
+                             'userpackages')
+            self.configuration.userPackageDirectory = s
+        #abstractions directory    
+        if not self.temp_configuration.check('abstractionsDirectory') or \
+                self.temp_configuration.abstractionsDirectory == \
+                os.path.join(self.temp_configuration.userPackageDirectory, 
+                             'abstractions'):
+            s = os.path.join(self.temp_configuration.dotVistrails,
+                             'subworkflows')
+            self.temp_configuration.abstractionsDirectory = s
+        if not self.configuration.check('abstractionsDirectory') or \
+                self.configuration.abstractionsDirectory == \
+                os.path.join(self.configuration.userPackageDirectory, 
+                             'abstractions'):
+            s = os.path.join(self.configuration.dotVistrails,
+                             'subworkflows')
+            self.configuration.abstractionsDirectory = s
+        #thumbnails directory    
+        if self.temp_configuration.has('thumbs'):
+            if not self.temp_configuration.thumbs.check('cacheDirectory'):
+                s = os.path.join(self.temp_configuration.dotVistrails,'thumbs')
+                self.temp_configuration.thumbs.cacheDirectory = s
+        if self.configuration.has('thumbs'):
+            if not self.configuration.thumbs.check('cacheDirectory'):
+                s = os.path.join(self.configuration.dotVistrails, 'thumbs')
+                self.configuration.thumbs.cacheDirectory = s
+        
+    def setupLogFile(self):
+        def get_version():
+            import vistrails.core.system
+            version = vistrails.core.system.vistrails_version()
+            return version.replace(".","_")
+        #To make sure we always save a log file name according to the
+        #current version, we will only consider the directory stored in
+        # logFile and append a name with the correct version encoded. 
+        if not self.temp_configuration.check('logFile'):
+            s = os.path.join(self.temp_configuration.dotVistrails,
+                             'vistrails_%s.log'%(get_version()))
+            self.temp_configuration.logFile = s
+        else:
+            dirname = os.path.dirname(self.temp_configuration.logFile)
+            self.temp_configuration.logFile = os.path.join(dirname,
+                                        'vistrails_%s.log'%(get_version()))
+        if not self.configuration.check('logFile'):
+            # if this was not set before, it should point to the
+            # value in temp_configuration
+            s = os.path.join(self.temp_configuration.dotVistrails,
+                             'vistrails_%s.log'%(get_version()))
+            self.configuration.logFile = s
+        else:
+            dirname = os.path.dirname(self.configuration.logFile)
+            self.configuration.logFile = os.path.join(dirname,
+                                        'vistrails_%s.log'%(get_version()))
+        if not os.path.lexists(self.temp_configuration.dotVistrails):
+            self.create_default_directory()
+        if self.configuration.check('nologfile'):
+            debug.DebugPrint.getInstance().set_logfile(None)
+        else:
+            debug.DebugPrint.getInstance().set_logfile(self.temp_configuration.logFile)
+        
+    def setupBaseModules(self):
+        """ setupBaseModules() -> None        
+        Import basic modules for self-registration. The import here is
+        on purpose, not a typo against the coding rule
+        
+        """
+        import vistrails.core.modules.vistrails_module
+        import vistrails.core.modules.basic_modules
+        import vistrails.core.modules.sub_module
+
+    def installPackages(self):
+        """ installPackages() -> None
+        Scheme through packages directory and initialize them all
+        """
+        # Imports standard packages directory
+        self._package_manager.initialize_packages(self._package_dictionary)
+
+        # Enable abstractions
+        import vistrails.core.modules.abstraction
+        abstraction_pkg = "abstraction"
+        abstraction_dict = {abstraction_pkg: 'vistrails.core.modules.'}
+        self._package_manager.initialize_abstraction_pkg(abstraction_dict)
+
+    def runStartupHooks(self):
+        """ runStartupHooks() -> None
+        After initialization, need to run all start up hooks registered
+        
+        """
+        for hook in self.startupHooks:
+            try:
+                hook()
+            except Exception, e:
+                debug.critical("Exception raised during hook: %s - %s" %
+                             (e.__class__, e))
+
+    def destroy(self):
+        """ destroy() -> None
+        Finalize all packages to, such as, get rid of temp files
+        
+        """
+        self._package_manager.finalize_packages()
+
+    def set_registry(self, registry_filename=None):
+        if registry_filename is not None:
+            self._do_load_packages = False
+        self._package_manager.init_registry(registry_filename)
+            
diff --git a/vistrails/core/system/__init__.py b/vistrails/core/system/__init__.py
new file mode 100644
index 0000000..6ab99e9
--- /dev/null
+++ b/vistrails/core/system/__init__.py
@@ -0,0 +1,453 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from __future__ import with_statement
+
+import datetime
+import getpass
+import os
+import os.path
+import subprocess
+import sys
+import platform
+import socket
+import urllib2
+from vistrails.core import debug
+from vistrails.core.utils import unimplemented, VistrailsInternalError, Chdir
+
+import unittest
+
+##############################################################################
+
+systemType = platform.system()
+
+if systemType in ['Windows', 'Microsoft']:
+    from vistrails.core.system.windows import guess_total_memory, temporary_directory, \
+        list2cmdline, \
+        home_directory, remote_copy_program, remote_shell_program, \
+        graph_viz_dot_command_line, remove_graph_viz_temporaries, \
+        link_or_copy,executable_is_in_path, executable_is_in_pythonpath, \
+        execute_cmdline, get_executable_path, execute_piped_cmdlines, TestWindows
+
+elif systemType in ['Linux']:
+    from vistrails.core.system.linux import guess_total_memory, temporary_directory, \
+        list2cmdline, \
+        home_directory, remote_copy_program, remote_shell_program, \
+        graph_viz_dot_command_line, remove_graph_viz_temporaries, \
+        link_or_copy, XDestroyWindow, executable_is_in_path, \
+        executable_is_in_pythonpath, execute_cmdline, get_executable_path, \
+        execute_piped_cmdlines, TestLinux
+
+elif systemType in ['Darwin']:
+    from vistrails.core.system.osx import guess_total_memory, temporary_directory, \
+        list2cmdline, \
+        home_directory, remote_copy_program, remote_shell_program, \
+        graph_viz_dot_command_line, remove_graph_viz_temporaries, \
+        link_or_copy, executable_is_in_path, executable_is_in_pythonpath, \
+        execute_cmdline, get_executable_path, execute_piped_cmdlines, TestMacOSX
+else:
+    debug.critical("VisTrails could not detect your operating system.")
+    sys.exit(1)
+
+def touch(file_name):
+    """touch(file_name) -> None Equivalent to 'touch' in a shell. If
+    file exists, updates modified time to current time. If not,
+    creates a new 0-length file.
+    
+    """
+    if os.path.isfile(file_name):
+        os.utime(file_name, None)
+    else:
+        open(file_name, 'w')
+
+def mkdir(dir_name):
+    """mkdir(dir_name) -> None Equivalent to 'mkdir' in a shell except
+    that if the directory exists, it will not be overwritten.
+
+    """
+    if not os.path.isdir(dir_name):
+        os.mkdir(dir_name)
+
+##############################################################################
+
+# Makes sure root directory is sensible.
+if __name__ == '__main__':
+    _thisDir = sys.argv[0]
+else:
+    _thisDir = sys.modules[__name__].__file__
+_thisDir = os.path.split(_thisDir)[0]
+__rootDir = os.path.realpath(os.path.join(_thisDir,
+                                          '..',
+                                          '..'))
+
+__dataDir = os.path.realpath(os.path.join(__rootDir,
+                                          'data'))
+__fileDir = os.path.realpath(os.path.join(__rootDir,
+                                          '..','examples'))
+
+if systemType in ['Darwin'] and not os.path.exists(__fileDir):
+    # Assume we are running from py2app
+    __fileDir = os.path.realpath(os.path.join(__rootDir,
+                                              '/'.join(['..']*6),'examples'))
+
+__examplesDir = __fileDir
+
+__defaultFileType = '.vt'
+
+__defaultPkgPrefix = 'org.vistrails.vistrails'
+
+def get_vistrails_default_pkg_prefix():
+    return __defaultPkgPrefix
+
+def get_vistrails_basic_pkg_id():
+    return "%s.basic" % get_vistrails_default_pkg_prefix()
+
+def set_vistrails_data_directory(d):
+    """ set_vistrails_data_directory(d:str) -> None 
+    Sets vistrails data directory taking into account environment variables
+
+    """
+    global __dataDir
+    new_d = os.path.expanduser(d)
+    new_d = os.path.expandvars(new_d)
+    while new_d != d:
+        d = new_d
+        new_d = os.path.expandvars(d)
+    __dataDir = os.path.realpath(d)
+
+def set_vistrails_file_directory(d):
+    """ set_vistrails_file_directory(d: str) -> None
+    Sets vistrails file directory taking into accoun environment variables
+    
+    """
+    global __fileDir
+    new_d = os.path.expanduser(d)
+    new_d = os.path.expandvars(new_d)
+    while new_d != d:
+        d = new_d
+        new_d = os.path.expandvars(d)
+    __fileDir = os.path.realpath(d)
+
+def set_vistrails_root_directory(d):
+    """ set_vistrails_root_directory(d:str) -> None 
+    Sets vistrails root directory taking into account environment variables
+
+    """
+
+    global __rootDir
+    new_d = os.path.expanduser(d)
+    new_d = os.path.expandvars(new_d)
+    while new_d != d:
+        d = new_d
+        new_d = os.path.expandvars(d)
+    __rootDir = os.path.realpath(d)
+
+def set_vistrails_default_file_type(t):
+    """ set_vistrails_default_file_type(t:str) -> None
+    Which file type to use when the user doesn't provide a file extension
+
+    """
+    global __defaultFileType
+    if t in ['.vt', '.xml']:
+        __defaultFileType = t
+    else:
+        __defaultFileType = '.vt'
+        
+def vistrails_root_directory():
+    """ vistrails_root_directory() -> str
+    Returns vistrails root directory
+
+    """
+    return __rootDir
+
+def vistrails_file_directory():
+    """ vistrails_file_directory() -> str 
+    Returns current vistrails file directory
+
+    """
+    return __fileDir
+
+def vistrails_examples_directory():
+    """ vistrails_file_directory() -> str 
+    Returns vistrails examples directory
+
+    """
+    return __examplesDir
+
+def vistrails_data_directory():
+    """ vistrails_data_directory() -> str 
+    Returns vistrails data directory
+
+    """
+    return __dataDir
+
+def vistrails_default_file_type():
+    """ vistrails_default_file_type() -> str
+    Returns vistrails file type
+
+    """
+    return __defaultFileType
+
+def packages_directory():
+    """ packages_directory() -> str 
+    Returns vistrails packages directory
+
+    """
+    return os.path.join(vistrails_root_directory(),'packages')
+
+def blank_vistrail_file():
+    unimplemented()
+
+def resource_directory():
+    """ resource_directory() -> str 
+    Returns vistrails gui resource directory
+
+    """
+    return os.path.join(vistrails_root_directory(),
+                        'gui', 'resources')
+
+def default_options_file():
+    """ default_options_file() -> str 
+    Returns vistrails default options file
+
+    """
+    return os.path.join(home_directory(), ".vistrailsrc")
+
+def default_dot_vistrails():
+    """ default_dot_vistrails() -> str 
+    Returns the default VisTrails per-user directory.
+
+    """
+    return os.path.join(home_directory(), '.vistrails')
+
+def current_dot_vistrails():
+    """ current_dot_vistrails() -> str
+    Returns the VisTrails per-user directory.
+
+    """
+    from vistrails.core.configuration import get_vistrails_configuration
+    return get_vistrails_configuration().dotVistrails
+
+def default_connections_file():
+    """ default_connections_file() -> str
+    Returns default Vistrails per-user connections file
+
+    """
+    return os.path.join(current_dot_vistrails(), 'connections.xml')
+
+def python_version():
+    """python_version() -> (major, minor, micro, release, serial)
+    Returns python version info."""
+    return sys.version_info
+
+def vistrails_version():
+    """vistrails_version() -> string - Returns the current VisTrails version."""
+    # 0.1 was the Vis2005 version
+    # 0.2 was the SIGMOD demo version
+    # 0.3 was the plugin/vtk version
+    # 0.4 is cleaned up version with new GUI
+    # 1.0 is version with new schema
+    return '2.1.1'
+
+def get_latest_vistrails_version():
+    """get_latest_vistrails_version() -> string - Returns latest vistrails
+    release version as queried from vistrails.org"""
+
+    version = ''
+    version_url = \
+            "http://www.vistrails.org/download/download.php?id=release_version.txt"
+    try:
+        request = urllib2.Request(version_url)
+        get_latest_version = urllib2.urlopen(request)
+        version = get_latest_version.read().strip()
+    except urllib2.HTTPError, err:
+        debug.warning("Unable to check for updates: %s" % str(err))
+        return version
+
+    return version
+
+def new_vistrails_release_exists():
+    """ new_vistrail_release_exists() -> (bool, str)
+    Returns (True, new_version_str) if newer version exists
+
+    """
+
+    local_version = [int(x) for x in vistrails_version().split('.')]
+
+    remote_str = get_latest_vistrails_version()
+    if remote_str:
+        remote_version = [int(x) for x in remote_str.split('.')]
+    else:
+        remote_version = [0]
+
+    if cmp(local_version, remote_version) is -1:
+        return (True, remote_str)
+
+    return (False, None)
+
+def vistrails_revision():
+    """vistrails_revision() -> str 
+    When run on a working copy, shows the current svn revision else
+    shows the latest release revision
+
+    """
+    git_dir = os.path.join(vistrails_root_directory(), '..')
+    with Chdir(git_dir):
+        release = "97362185cfd1"
+        import vistrails.core.requirements
+        if vistrails.core.requirements.executable_file_exists('git'):
+            lines = []
+            result = execute_cmdline(['git', 'describe', '--always', '--abbrev=12'],
+                                     lines)
+            if len(lines) == 1:
+                if result == 0:
+                    release = lines[0].strip(" \n")
+    return release
+
+def current_user():
+    return getpass.getuser()
+
+def current_ip():
+    """ current_ip() -> str
+    Gets current IP address trying to avoid the IPv6 interface """
+    try:
+        info = socket.getaddrinfo(socket.gethostname(), None)
+        # Try to find an IPv4
+        for i in info:
+            if i[0] == socket.AF_INET:
+                return i[4][0]
+        # Return any address
+        for i in info:
+            if i[0] in (socket.AF_INET, socket.AF_INET6):
+                return i[4][0]
+    except:
+        return ''
+
+def current_time():
+    """current_time() -> datetime.datetime
+    Returns the current time
+
+    """
+    # FIXME should use DB if available...
+    return datetime.datetime.now()
+
+def current_machine():
+    return socket.getfqdn()
+
+def current_architecture():
+    bit_string = platform.architecture()[0]
+    if bit_string.endswith('bit'):
+        return int(bit_string[:-3])
+    else:
+        return 32 # default value
+
+def current_processor():
+    proc = platform.processor()
+    if not proc:
+        proc = 'n/a'
+    return proc
+
+def short_about_string():
+    return """VisTrails version %s.%s -- contact at vistrails.org""" % \
+            (vistrails_version(), vistrails_revision())
+
+def about_string():
+    """about_string() -> string - Returns the about string for VisTrails."""
+    return """VisTrails version %s.%s -- contact at vistrails.org
+
+Copyright (C) 2011-2014 NYU-Poly. Copyright (C) 2006-2011 University of Utah. 
+All rights reserved.
+http://www.vistrails.org
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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.""" % (vistrails_version(), 
+                                                         vistrails_revision())
+
+def get_elementtree_library():
+    try:
+        import cElementTree as ElementTree
+    except ImportError:
+        # try python 2.5-style
+        import xml.etree.cElementTree as ElementTree
+    return ElementTree
+    
+def execute_cmdline2(cmd_list):
+    return execute_piped_cmdlines([cmd_list])
+
+################################################################################
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+class TestSystem(unittest.TestCase):
+
+    def test_vistrails_revision(self):
+        r = vistrails_root_directory()
+        with Chdir(r):
+            v1 = vistrails_revision()
+            try:
+                with Chdir(os.path.join(r, '..')):
+                    self.assertEquals(v1, vistrails_revision())
+            except AssertionError:
+                raise
+            except:
+                pass
+            try:
+                with Chdir(os.path.join(r, '..', '..')):
+                    self.assertEquals(v1, vistrails_revision())
+            except AssertionError:
+                raise
+            except:
+                pass
+            
+            
diff --git a/vistrails/core/system/linux.py b/vistrails/core/system/linux.py
new file mode 100644
index 0000000..cbdf7a5
--- /dev/null
+++ b/vistrails/core/system/linux.py
@@ -0,0 +1,208 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import re
+import shutil
+from ctypes import CDLL, c_void_p
+from vistrails.core.system.unix import executable_is_in_path,\
+     executable_is_in_pythonpath, list2cmdline, execute_cmdline, \
+     get_executable_path, execute_piped_cmdlines
+
+import unittest
+
+################################################################################
+
+_meminfo_fmt = re.compile(r'([^:]+):\s+([0-9]+)(?: (kB|B))?\n$')
+
+def parse_meminfo():
+    """parse_meminfo() -> dictionary
+    Parses /proc/meminfo and returns appropriate dictionary. Only available on
+    Linux."""
+    info = {}
+    with open('/proc/meminfo') as fp:
+        for line in fp:
+            m = _meminfo_fmt.match(line)
+            if m is None:
+                raise VistrailsInternalError("Invalid format found in "
+                                             "/proc/meminfo")
+            key, value, unit = m.groups()
+            if unit == 'kB':
+                value = int(value) * 1000
+            else:
+                value = int(value)
+            info[key] = value
+    return info
+
+def guess_total_memory():
+    """ guess_total_memory() -> int 
+    Return system memory in bytes. 
+    
+    """
+    return parse_meminfo()['MemTotal']
+
+def temporary_directory():
+    """ temporary_directory() -> str 
+    Returns the path to the system's temporary directory 
+    
+    """
+    return "/tmp/"
+
+def home_directory():
+    """ home_directory() -> str 
+    Returns user's home directory using environment variable $HOME
+    
+    """
+    return os.getenv('HOME')
+
+def remote_copy_program():
+    return "scp -p"
+
+def remote_shell_program():
+    return "ssh -p"
+
+def graph_viz_dot_command_line():
+    return 'dot -Tplain -o '
+
+def remove_graph_viz_temporaries():
+    """ remove_graph_viz_temporaries() -> None 
+    Removes temporary files generated by dot 
+    
+    """
+    os.unlink(temporary_directory() + "dot_output_vistrails.txt")
+    os.unlink(temporary_directory() + "dot_tmp_vistrails.txt")
+
+def link_or_copy(src, dst):
+    """link_or_copy(src:str, dst:str) -> None 
+    Tries to create a hard link to a file. If it is not possible, it will
+    copy file src to dst 
+    
+    """
+    # Links if possible, but we're across devices, we need to copy.
+    try:
+        os.link(src, dst)
+    except OSError, e:
+        if e.errno == 18:
+            # Across-device linking is not possible. Let's copy.
+            shutil.copyfile(src, dst)
+        else:
+            raise e
+
+def get_libX11():
+    """ get_libX11() -> CDLL    
+    Return the X11 library loaded with ctypes. Only available on
+    Linux.  We also need a way to find the correct X11 library name on
+    different machines. Right now, libX11.so.6 is used.
+    
+    """
+    from vistrails.core.bundles import py_import
+    ctypes = py_import('ctypes', {
+            'pip': 'ctypes',
+            'linux-debian': 'python-ctypes',
+            'linux-ubuntu': 'python-ctypes',
+            'linux-fedora': 'python-ctypes'})
+    c_void_p = ctypes.c_void_p
+    CDLL = ctypes.CDLL
+    return CDLL('libX11.so.6')
+
+def XDestroyWindow(displayId, windowId):
+    """ XDestroyWindow(displayId: void_p_str, windowId: void_p_str) -> None
+    Destroy the X window specified by two strings displayId and
+    windowId containing void pointer string of (Display*) and (Window)    
+    type.
+    This is specific for VTKCell to remove the top shell window. Since
+    VTK does not expose X11-related functions to Python, we have to
+    use ctypes to hi-jack X11 library and call XDestroyWindow to kill
+    the top-shell widget after reparent the OpenGL canvas to another
+    Qt widget
+    
+    """
+    from vistrails.core.bundles import py_import
+    ctypes = py_import('ctypes', {
+            'pip': 'ctypes',
+            'linux-debian': 'python-ctypes',
+            'linux-ubuntu': 'python-ctypes',
+            'linux-fedora': 'python-ctypes'})
+    c_void_p = ctypes.c_void_p
+    displayPtr = c_void_p(int(displayId[1:displayId.find('_void_p')], 16))
+    windowPtr = c_void_p(int(windowId[1:windowId.find('_void_p')], 16))
+    libx = get_libX11()
+    libx.XDestroyWindow(displayPtr, windowPtr)
+
+################################################################################
+
+
+class TestLinux(unittest.TestCase):
+     """ Class to test Linux specific functions """
+     
+     def test1(self):
+         """ Test if guess_total_memory() is returning an int >= 0"""
+         result = guess_total_memory()
+         assert isinstance(result, (int, long))
+         assert result >= 0
+
+     def test2(self):
+         """ Test if home_directory is not empty """
+         result = home_directory()
+         assert result != ""
+
+     def test3(self):
+         """ Test if temporary_directory is not empty """
+         result = temporary_directory()
+         assert result != ""
+
+     def test4(self):
+         """ Test if origin of link_or_copy'ed file is deleteable. """
+         import tempfile
+         import os
+         (fd1, name1) = tempfile.mkstemp()
+         os.close(fd1)
+         (fd2, name2) = tempfile.mkstemp()
+         os.close(fd2)
+         os.unlink(name2)
+         link_or_copy(name1, name2)
+         try:
+             os.unlink(name1)
+         except:
+             self.fail("Should not throw")
+         os.unlink(name2)
+
+     def test_executable_file_in_path(self):
+         # Should exist in any POSIX shell, which is what we have in OSX
+         result = executable_is_in_path('ls')
+         assert os.access(result, os.X_OK)
+
+if __name__ == '__main__':
+    unittest.main()
+             
diff --git a/vistrails/core/system/mac_site.py b/vistrails/core/system/mac_site.py
new file mode 100644
index 0000000..3cdac45
--- /dev/null
+++ b/vistrails/core/system/mac_site.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" contains parts from site.py for python2.7 needed when using py2app
+"""
+
+import sys
+
+# for distutils.commands.install
+# These values are initialized by the getuserbase() and getusersitepackages()
+# functions, through the main() function when Python starts.
+USER_SITE = None
+USER_BASE = None
+
+def getuserbase():
+    """Returns the `user base` directory path.
+
+    The `user base` directory can be used to store data. If the global
+    variable ``USER_BASE`` is not initialized yet, this function will also set
+    it.
+    """
+    global USER_BASE
+    if USER_BASE is not None:
+        return USER_BASE
+    from sysconfig import get_config_var
+    USER_BASE = get_config_var('userbase')
+    return USER_BASE
+
+def getusersitepackages():
+    """Returns the user-specific site-packages directory path.
+
+    If the global variable ``USER_SITE`` is not initialized yet, this
+    function will also set it.
+    """
+    global USER_SITE
+    user_base = getuserbase() # this will also set USER_BASE
+
+    if USER_SITE is not None:
+        return USER_SITE
+
+    from sysconfig import get_path
+    import os
+
+    if sys.platform == 'darwin':
+        from sysconfig import get_config_var
+        if get_config_var('PYTHONFRAMEWORK'):
+            USER_SITE = get_path('purelib', 'osx_framework_user')
+            return USER_SITE
+
+    USER_SITE = get_path('purelib', '%s_user' % os.name)
+    return USER_SITE
+
+class _Helper(object):
+    """Define the builtin 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+    
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
\ No newline at end of file
diff --git a/vistrails/core/system/osx.py b/vistrails/core/system/osx.py
new file mode 100644
index 0000000..9547375
--- /dev/null
+++ b/vistrails/core/system/osx.py
@@ -0,0 +1,290 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" Mac OS X specific file """
+      
+# from xml import dom
+# from xml.dom.xmlbuilder import DOMInputSource, DOMBuilder
+import xml.etree.cElementTree as ElementTree
+import datetime
+import os
+import shutil
+import subprocess
+import time
+from vistrails.core.system.unix import executable_is_in_path, list2cmdline, \
+     executable_is_in_pythonpath, execute_cmdline, execute_piped_cmdlines
+import vistrails.core.utils
+
+import unittest
+
+###############################################################################
+# Extract system detailed information of a Mac system
+#
+# Based on a Python Cookbook recipe available online :
+#    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/303063
+# and in the Python Coobook, page 418
+# Credit: Brian Quinlan
+#
+# Rewritten to use ElementTree instead of PyXML
+#
+# This recipe uses the system_profiler application to retrieve detailed
+# information about a Mac OS X system. There are two useful ways to use it:
+# the first is to ask for a complete Python datastructure containing
+# information about the system (see OSXSystemProfiler.all()) and the 
+# other is two ask for particular keys in the system information database.
+
+def group(lst, n):
+    """group([0,3,4,10,2,3], 2) => [(0,3), (4,10), (2,3)]
+    
+    Group a list into consecutive n-tuples. Incomplete tuples are
+    discarded e.g.
+    
+    >>> group(range(10), 3)
+    [(0, 1, 2), (3, 4, 5), (6, 7, 8)]
+    
+    """
+    return zip(*[lst[i::n] for i in xrange(n)]) 
+
+class OSXSystemProfiler(object):
+    "Provide information from the Mac OS X System Profiler"
+
+    def __init__(self, category=None, detail=None):
+        """detail can range from -2 to +1, with larger numbers returning more
+        information. Beware of +1, it can take several minutes for
+        system_profiler to generate the data."""
+
+        command = ['system_profiler', '-xml']
+        if category is not None:
+            command.append(str(category))
+        if detail is not None:
+            command.extend(['-detailLevel', '%d' % detail])
+        p = subprocess.Popen(command, stdout=subprocess.PIPE)
+        self.document = ElementTree.parse(p.stdout)
+
+    def _content(self, node):
+        "Get the text node content of an element or an empty string"
+        return (node.text or '')
+
+    def _convert_value_node(self, node):
+        """Convert a 'value' node (i.e. anything but 'key') into a Python data
+        structure"""
+        if node.tag == 'string':
+            return self._content(node)
+        elif node.tag == 'integer':
+            return int(self._content(node))
+        elif node.tag == 'real':
+            return float(self._content(node))
+        elif node.tag == 'date': #  <date>2004-07-05T13:29:29Z</date>
+            return datetime.datetime(
+                *time.strptime(self._content(node), '%Y-%m-%dT%H:%M:%SZ')[:5])
+        elif node.tag == 'array':
+            return [self._convert_value_node(n) for n in node.getchildren()]
+        elif node.tag == 'dict':
+            return dict([(self._content(n), self._convert_value_node(m))
+                for n, m in group(node.getchildren(), 2)])
+        else:
+            raise ValueError(node.tag)
+    
+    def __getitem__(self, key):
+        nodes = self.document.getiterator('dict')
+        results = []
+        for node in nodes:
+            for child in node:
+                if child.tag == 'key' and child.text == key:
+                    v = self._convert_value_node(node)[key]
+                    if isinstance(v, dict) and v.has_key('_order'):
+                        # this is just information for display
+                        pass
+                    else:
+                        results.append(v)
+        return results
+    
+#     def all(self):
+#         """Return the complete information from the system profiler
+#         as a Python data structure"""
+        
+#         return self._convert_value_node(
+#             self.document.documentElement.firstChild)
+
+###############################################################################
+
+def example():
+    from optparse import OptionParser
+    from pprint import pprint
+
+    info = OSXSystemProfiler("SPHardwareDataType")
+    parser = OptionParser()
+    parser.add_option("-f", "--field", action="store", dest="field",
+                      help="display the value of the specified field")
+    
+    (options, args) = parser.parse_args()
+    if len(args) != 0:
+        parser.error("no arguments are allowed")
+    
+    if options.field is not None:
+        pprint(info[options.field])
+    else:
+        # just print some comment keys known to exist in only one important
+        # dictionary
+        for k in ['cpu_type', 'current_processor_speed', 'l2_cache_size',
+                  'physical_memory', 'user_name', 'os_version', 'ip_address']:
+            print '%s: %s' % (k, info[k][0])
+
+###############################################################################
+
+def parse_meminfo():
+    """ parse_meminfo() -> int
+    Uses the system_profiler application to retrieve detailed information
+    about a Mac OS X system. Returns memory size in Megabytes.
+    
+    Just use the "SPHardwareDataType" category to limit the amount of
+    information gathered.
+
+    """
+        
+    result = -1
+    info = OSXSystemProfiler("SPHardwareDataType")
+    mem = info['physical_memory'][0]
+    # print "*** MEMORY", mem
+    if mem.upper().endswith(' GB'):
+        result = int(float(mem[:-3]) * 1024) * 1L
+    elif mem.upper().endswidth(' MB'):
+        result = int(mem[:-3]) * 1L
+    # print '>>>>', result
+    return result
+
+def guess_total_memory():
+    """ guess_total_memory() -> int 
+    Return system memory in bytes. If PyXML is not installed it returns -1 
+    
+    """
+    return parse_meminfo()
+
+def temporary_directory():
+    """ temporary_directory() -> str 
+    Returns the path to the system's temporary directory 
+    
+    """
+    return "/tmp/"
+
+def home_directory():
+    """ home_directory() -> str 
+    Returns user's home directory using environment variable $HOME
+    
+    """
+    return os.getenv('HOME')
+
+def remote_copy_program():
+    return "scp -p"
+
+def remote_shell_program():
+    return "ssh -p"
+
+def graph_viz_dot_command_line():
+    """ graph_viz_dot_command_line() -> str
+    Returns dot command line
+
+    """
+    return 'dot -Tplain -o '
+
+def remove_graph_viz_temporaries():
+    """ remove_graph_viz_temporaries() -> None 
+    Removes temporary files generated by dot 
+    
+    """
+    os.unlink(temporary_directory() + "dot_output_vistrails.txt")
+    os.unlink(temporary_directory() + "dot_tmp_vistrails.txt")
+
+def link_or_copy(src, dst):
+    """link_or_copy(src:str, dst:str) -> None 
+    Tries to create a hard link to a file. If it is not possible, it will
+    copy file src to dst 
+    
+    """
+    # Links if possible, but we're across devices, we need to copy.
+    try:
+        os.link(src, dst)
+    except OSError, e:
+        if e.errno == 18:
+            # Across-device linking is not possible. Let's copy.
+            shutil.copyfile(src, dst)
+        else:
+            raise e
+
+def get_executable_path(executable_name):
+    vt_path = os.getenv("EXECUTABLEPATH")
+    if vt_path is not None:
+        vt_path = vt_path.strip()
+        executable_path = \
+            os.path.join(os.path.dirname(vt_path), executable_name)
+        if os.path.exists(executable_path):
+            return executable_path
+    paths = os.environ['PATH']
+    paths = paths.split(os.pathsep)
+    for prefix in paths:
+        path = os.path.join(prefix, executable_name)
+        if os.path.exists(path):
+            return path
+    return None
+
+################################################################################
+
+
+class TestMacOSX(unittest.TestCase):
+     """ Class to test Mac OS X specific functions """
+     
+     def test1(self):
+         """ Test if guess_total_memory() is returning an int >= 0"""
+         result = guess_total_memory()
+         assert isinstance(result, (int, long))
+         assert result >= 0
+
+     def test2(self):
+         """ Test if home_directory is not empty """
+         result = home_directory()
+         assert result != ""
+
+     def test3(self):
+         """ Test if temporary_directory is not empty """
+         result = temporary_directory()
+         assert result != ""
+
+     def test_executable_file_in_path(self):
+         # Should exist in any POSIX shell, which is what we have in OSX
+         result = executable_is_in_path('ls')
+         assert result == "/bin/ls" # Any UNIX should respect this.
+
+if __name__ == '__main__':
+    unittest.main()
+             
diff --git a/vistrails/core/system/unix.py b/vistrails/core/system/unix.py
new file mode 100644
index 0000000..0cede13
--- /dev/null
+++ b/vistrails/core/system/unix.py
@@ -0,0 +1,125 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Routines common to Linux and OSX."""
+import os
+import os.path
+import stat
+import subprocess
+import sys
+import vistrails.core.utils
+import re
+
+def executable_is_in_path(filename):
+    """executable_is_in_path(filename): string
+    Tests if filename corresponds to an executable file on the path. Returns
+the filename if true, or an empty string if false."""
+    cmdline = ['which','%s' % filename]
+    output = []
+    result = execute_cmdline(cmdline, output)
+    if result == 1:
+        return ""
+    if result != 0:
+        msg = ("'%s' failed. Return code %s. Output: %s" %
+               (cmdline, result, output))
+        raise vistrails.core.utils.VistrailsInternalError(msg)
+    else:
+        output = output[0][:-1]
+        return output
+
+def executable_is_in_pythonpath(filename):
+    """executable_is_in_pythonpath(filename: str)
+    Check if exename can be reached in the PYTHONPATH environment. Return
+    the filename if true, or an empty string if false.
+    
+    """
+    pathlist = sys.path
+    for dir in pathlist:
+        fullpath = os.path.join(dir, filename)
+        try:
+            st = os.stat(fullpath)
+        except os.error:
+            continue        
+        if stat.S_ISREG(st[stat.ST_MODE]):
+            return filename
+    return ""
+
+def list2cmdline(lst):
+    for el in lst:
+        assert isinstance(el, basestring)
+    return subprocess.list2cmdline(lst)
+
+def execute_cmdline(lst, output):
+    """execute_cmdline(lst: list of str, output)-> int
+    Builds a command line enquoting the arguments properly and executes it
+    using subprocess.Popen. It returns the error code and the output is on 'output'.
+
+    cscheid: why don't we return a tuple of int, lst instead of mutating that list?
+
+    """
+    process = subprocess.Popen(lst, shell=False,
+                               stdin=subprocess.PIPE,
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT,
+                               close_fds=True)
+    # cscheid: Should this be busy-waiting? What's going on here?
+    result = None
+    while result == None:
+        result = process.poll()
+    output.extend(process.stdout.readlines())
+    return result
+
+def get_executable_path(executable_name):
+    paths = os.environ['PATH']
+    paths = paths.split(os.pathsep)
+    for prefix in paths:
+        path = os.path.join(prefix, executable_name)
+        if os.path.exists(path):
+            return path
+    return None
+
+def execute_piped_cmdlines(cmd_list_list):
+    stdin = subprocess.PIPE
+    for cmd_list in cmd_list_list:
+        cmd_line = list2cmdline(cmd_list)
+        process = subprocess.Popen(cmd_line, shell=True,
+                                   stdin=stdin,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+                                   close_fds=True)
+        stdin = process.stdout
+    (output, errs) = process.communicate()
+    result = process.returncode
+    return (result, output, errs)
diff --git a/vistrails/core/system/windows.py b/vistrails/core/system/windows.py
new file mode 100644
index 0000000..88e085c
--- /dev/null
+++ b/vistrails/core/system/windows.py
@@ -0,0 +1,250 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import shutil
+import sys
+import stat
+import subprocess
+import vistrails.core.system
+
+import unittest
+
+try:
+    from ctypes import windll, Structure, c_ulong, c_ulonglong, byref, sizeof
+    importSuccess = True
+    
+    class WIN32MEMORYSTATUSEX(Structure):
+        """ Structure that represents memory information returned by 
+        Windows API
+        
+        """
+        _fields_ = [
+            ('dwLength', c_ulong),
+            ('dwMemoryLoad', c_ulong),
+            ('dwTotalPhys', c_ulonglong),
+            ('dwAvailPhys', c_ulonglong),
+            ('dwTotalPageFile', c_ulonglong),
+            ('dwAvailPageFile', c_ulonglong),
+            ('dwTotalVirtual', c_ulonglong),
+            ('dwAvailVirtual', c_ulonglong),
+            ('dwAvailExtendedVirtual', c_ulonglong),
+            ]
+
+except ImportError:
+    importSuccess = False
+    
+##############################################################################
+def parse_meminfo():
+    """ 
+    parse_meminfo() -> long
+    Calls Windows 32 API GlobalMemoryStatus(Ex) to get memory information 
+    It requires ctypes module
+    
+    """ 
+    try:
+        kernel32 = windll.kernel32
+
+        result = WIN32MEMORYSTATUSEX()
+        result.dwLength = sizeof(WIN32MEMORYSTATUSEX)
+        kernel32.GlobalMemoryStatusEx(byref(result))
+    except:
+        return -1
+    return long(result.dwTotalPhys / 1024)
+
+def guess_total_memory():
+    """ guess_total_memory() -> int 
+    Return system memory in megabytes. If ctypes is not installed it returns -1 
+    
+    """
+    if importSuccess:
+        return parse_meminfo()
+    else:
+        return -1
+
+def temporary_directory():
+    """ temporary_directory() -> str 
+    Returns the path to the system's temporary directory. Tries to use the $TMP 
+    environment variable, if it is present. Else, tries $TEMP, else uses 'c:/' 
+    
+    """
+    if os.environ.has_key('TMP'):
+        return os.environ['TMP'] + '\\'
+    elif os.environ.has_key('TEMP'):
+        return os.environ['TEMP'] + '\\'
+    else:
+        return 'c:/'
+
+def home_directory():
+    """ home_directory() -> str 
+    Returns user's home directory using windows environment variables
+    $HOMEDRIVE and $HOMEPATH
+    
+    """
+    if len(os.environ['HOMEPATH']) == 0:
+        return '\\'
+    else:
+        return os.environ['HOMEDRIVE'] + os.environ['HOMEPATH']
+
+def remote_copy_program():
+    return "pscp -P"
+
+def remote_shell_program():
+    return "plink -P"
+
+def graph_viz_dot_command_line():
+    """ graph_viz_dot_command_line() -> str
+    Returns dot command line
+
+    """
+    return 'dot -Tplain -o'
+
+def remove_graph_viz_temporaries():
+    pass
+
+def link_or_copy(src, dst):
+    """link_or_copy(src:str, dst:str) -> None 
+    Copies file src to dst 
+    
+    """
+    shutil.copyfile(src, dst)
+
+def executable_is_in_path(filename):
+    """ executable_is_in_path(filename: str) -> string    
+    Check if exename can be reached in the PATH environment. Return
+    the filename if true, or an empty string if false.
+    
+    """
+    pathlist = (os.environ['PATH'].split(os.pathsep) +
+                [vistrails.core.system.vistrails_root_directory(),
+                 "."])
+    for dir in pathlist:
+        fullpath = os.path.join(dir, filename)
+        try:
+            st = os.stat(fullpath)
+        except os.error:
+            try:
+                st = os.stat(fullpath+'.exe')
+            except:
+                continue        
+        if stat.S_ISREG(st[stat.ST_MODE]):
+            return filename
+    return ""
+
+def executable_is_in_pythonpath(filename):
+    """ executable_is_in_pythonpath(filename: str) -> string    
+    Check if exename can be reached in the PYTHONPATH environment. Return
+    the filename if true, or an empty string if false.
+    
+    """
+    pathlist = sys.path
+    for dir in pathlist:
+        fullpath = os.path.join(dir, filename)
+        try:
+            st = os.stat(fullpath)
+        except os.error:
+            try:
+                st = os.stat(fullpath+'.exe')
+            except:
+                continue        
+        if stat.S_ISREG(st[stat.ST_MODE]):
+            return filename
+    return ""
+
+def list2cmdline(lst):
+    for el in lst:
+        assert isinstance(el, basestring)
+    return subprocess.list2cmdline(lst)
+
+def execute_cmdline(lst, output):
+    """execute_cmdline(lst: list of str)-> int Builds a command line
+    enquoting the arguments properly and executes it using popen4. It
+    returns the output on output. popen4 doesn't return a code, so it
+    will always return 0
+
+    """
+    proc = subprocess.Popen(lst, shell=True, stdin=subprocess.PIPE, 
+                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    proc.wait()
+    if proc.stdout:
+        output.extend(proc.stdout.readlines())
+    return proc.returncode
+
+def get_executable_path(executable_name):
+    filename = os.path.abspath(os.path.join(os.path.dirname(__file__),'../../../',executable_name))
+    if os.path.exists(filename) or os.path.exists(filename+'.exe'):
+        return filename
+    return None
+
+def execute_piped_cmdlines(cmd_list_list):
+    stdin = subprocess.PIPE
+    for cmd_list in cmd_list_list:
+        cmd_line = list2cmdline(cmd_list)
+        process = subprocess.Popen(cmd_line, shell=True,
+                                   stdin=stdin,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE)
+        stdin = process.stdout
+    (output, errs) = process.communicate()
+    result = process.returncode
+    return (result, output, errs)
+
+################################################################################
+
+
+class TestWindows(unittest.TestCase):
+     """ Class to test Windows specific functions """
+     
+     def test1(self):
+         """ Test if guess_total_memory() is returning an int >= 0"""
+         result = guess_total_memory()
+         assert isinstance(result, (int, long))
+         assert result >= 0
+
+     def test2(self):
+         """ Test if home_directory is not empty """
+         result = home_directory()
+         assert result != ""
+
+     def test3(self):
+         """ Test if temporary_directory is not empty """
+         result = temporary_directory()
+         assert result != ""
+
+     def test_executable_file_in_path(self):
+         result = executable_is_in_path('cmd')
+         assert result != ""
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/theme.py b/vistrails/core/theme.py
new file mode 100644
index 0000000..176aa56
--- /dev/null
+++ b/vistrails/core/theme.py
@@ -0,0 +1,118 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+This module describes a core theme structure for VisTrails GUI. It
+specifies measurements
+"""
+
+from vistrails.core.utils.color import ColorByName
+import vistrails.core.system
+################################################################################
+
+class DefaultCoreTheme(object):
+    """
+    This is the default core theme which contains non-qt values,
+    measurements for Vistrail. Other core themes should derive from
+    this class and change appropriate values
+    
+    """
+    
+    def __init__(self):
+        """ DefaultTheme() -> DefaultTheme
+        This is for initializing all non-Qt values
+        
+        """
+        ######################
+        #### MEASUREMENTS ####
+
+        # Padded space of Version shape and its label
+        self.VERSION_LABEL_MARGIN = (60, 35)
+
+        # Padded space of Module shape into its label
+        self.MODULE_LABEL_MARGIN = (20, 20, 20, 15)
+
+        # Margin of Module shape into its ports
+        self.MODULE_PORT_MARGIN = (4, 4, 4, 4)
+
+        # Space between ports inside a module
+        self.MODULE_PORT_SPACE = 4
+
+        # The space added to the end of port shapes before it reaches the
+        # margin of the module
+        self.MODULE_PORT_PADDED_SPACE = 20
+
+        # Width and Height of Port shape
+        self.PORT_WIDTH = 10
+        self.PORT_HEIGHT = 10
+
+        # Width and Height of Configure button shape
+        self.CONFIGURE_WIDTH = 6
+        self.CONFIGURE_HEIGHT = 10
+
+        self.BREAKPOINT_FRINGE = \
+            (((0.0,0.0),(-0.5,0.25),(-0.5,0.75),(0.0,1.0)),
+             ((0.0,0.0),(0.5,0.25),(0.5,0.75),(0.0,1.0)))
+                                       
+
+        # The number of control points when drawing connection curve
+        self.CONNECTION_CONTROL_POINTS = 20
+
+        # Control the size and gap for the 3 little segments when
+        # draw connections between versions
+        self.LINK_SEGMENT_LENGTH = 15
+        self.LINK_SEGMENT_GAP = 5
+        self.LINK_SEGMENT_SQUARE_LENGTH = 12
+
+        # The size of the frame containing the PIP graphics view
+        self.PIP_IN_FRAME_WIDTH = 5
+        self.PIP_OUT_FRAME_WIDTH = 1
+
+        # The size of the frame containing the PIP graphics view
+        self.PIP_DEFAULT_SIZE = (128, 128)
+
+        # The default minimum size of the graphics views
+        self.BOUNDING_RECT_MINIMUM = 512
+
+        # Default Paramter Inspector Window dimension
+        self.VISUAL_DIFF_PARAMETER_WINDOW_SIZE = (348,256)
+
+        # Default legend size (small rectangular shape)
+        self.VISUAL_DIFF_LEGEND_SIZE = (16, 16)
+
+        # Virtual Cell Label default  size
+        self.VIRTUAL_CELL_LABEL_SIZE = (40, 40)
+
+        # Query Preview Size
+        self.QUERY_PREVIEW_SIZE = (256, 256)
diff --git a/vistrails/core/thumbnails.py b/vistrails/core/thumbnails.py
new file mode 100644
index 0000000..838905d
--- /dev/null
+++ b/vistrails/core/thumbnails.py
@@ -0,0 +1,291 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+""" Utilities for dealing with the thumbnails """
+import os
+import os.path
+import shutil
+import time
+import uuid
+import mimetypes
+# mimetypes are broken by default on windows so use the builtins
+# Remove line below when it is fixed here: http://bugs.python.org/issue15207
+mimetypes.init(files=[])
+from vistrails.core import debug
+from vistrails.core.configuration import get_vistrails_configuration, \
+      get_vistrails_persistent_configuration
+from vistrails.core.utils import VistrailsInternalError
+
+############################################################################
+class CacheEntry(object):
+    def __init__(self, abs_name, name, time, size):
+        self.abs_name = abs_name
+        self.name = name
+        self.time = time
+        self.size = size
+        
+class ThumbnailCache(object):
+    _instance = None
+    IMAGE_MAX_WIDTH = 200 
+    SUPPORTED_TYPES = ['image/png','image/jpeg','image/bmp','image/gif']
+    class ThumbnailCacheSingleton(object):
+        def __call__(self, *args, **kw):
+            if ThumbnailCache._instance is None:
+                obj = ThumbnailCache(*args, **kw)
+                ThumbnailCache._instance = obj
+            return ThumbnailCache._instance
+        
+    getInstance = ThumbnailCacheSingleton()
+    
+    def __init__(self):
+        self.elements = {}
+        self.vtelements = {}
+        self.conf = None
+        conf = get_vistrails_configuration()
+        if conf.has('thumbs'):
+            self.conf = conf.thumbs
+        self.init_cache()
+        
+    def get_directory(self):
+        if self.conf.check('cacheDirectory'):
+            thumbnail_dir = self.conf.cacheDirectory
+            if not os.path.exists(thumbnail_dir):
+                raise VistrailsInternalError("Cannot find %s" % thumbnail_dir)
+            return thumbnail_dir
+        
+        raise VistrailsInternalError("'thumbs.cacheDirectory' not"
+                                     " specified in configuration")
+        return None
+    
+    def init_cache(self):
+        for root,dirs, files in os.walk(self.get_directory()):
+            for f in files:
+                fname = os.path.join(root,f)
+                statinfo = os.stat(fname)
+                size = int(statinfo[6])
+                time = float(statinfo[8])
+                entry = CacheEntry(fname, f, time, size)
+                self.elements[f] = entry
+                
+    def get_abs_name_entry(self,name):
+        """get_abs_name_entry(name) -> str 
+        It will look for absolute file path of name in self.elements and 
+        self.vtelements. It returns None if item was not found.
+        
+        """
+        try:
+            return self.elements[name].abs_name
+        except KeyError, e:
+            try:
+                return self.vtelements[name].abs_name
+            except KeyError, e:
+                return None
+        
+    def size(self):
+        size = 0
+        for entry in self.elements.itervalues():
+            size += entry.size
+        return size
+
+    def move_cache_directory(self, sourcedir, destdir):
+        """change_cache_directory(sourcedir: str, dest_dir: str) -> None"
+        Moves files from sourcedir to destdir
+        
+        """
+        if os.path.exists(destdir):
+            for entry in self.elements.itervalues():
+                try:
+                    srcname = entry.abs_name
+                    dstname = os.path.join(destdir,entry.name)
+                    shutil.move(srcname,dstname)
+                    entry.abs_name = dstname
+                        
+                except shutil.Error, e:
+                    debug.warning("Could not move thumbnail from %s to %s: %s" \
+                                  % (sourcedir, destdir, str(e)))
+                    
+    def remove_lru(self,n=1):
+        elements = self.elements.values()
+        elements.sort(key=lambda obj: obj.time)
+        num = min(n,len(elements))
+        debug.debug("Will remove %s elements from cache..."%num)
+        debug.debug("Cache has %s elements and %s bytes"%(len(elements),
+                                                             self.size()))
+        for i in range(num):
+            try:
+                del self.elements[elements[i].name]    
+                os.unlink(elements[i].abs_name)
+            except os.error, e:
+                debug.warning("Could not remove file %s: %s" % \
+                                 (elements[i].abs_name, str(e)))
+    def remove(self,key):
+        if key in self.elements.keys():
+            entry = self.elements[key]
+            del self.elements[key]
+            os.unlink(entry.abs_name)
+        elif key in self.vtelements.keys():
+            entry = self.vtelements[key]
+            del self.vtelements[key]
+            os.unlink(entry.abs_name)
+            
+    def clear(self):
+        self.elements = {}
+        self._delete_files(self.get_directory())
+        
+    def add_entry_from_cell_dump(self, folder, key=None):
+        """create_entry_from_cell_dump(folder: str) -> str
+        Creates a cache entry from images in folder by merge them in a single 
+        image and returns the name of the image in cache.
+        If a valid key is provided, it will use it as the name of the 
+        image file.
+        
+        """
+        
+        image = None
+        thumbnail_fnames = self._get_thumbnail_fnames(folder)
+        if len(thumbnail_fnames) > 0:
+            image = self._merge_thumbnails(thumbnail_fnames)
+        fname = None
+        if image != None and image.width() > 0 and image.height() > 0:
+            fname = "%s.png" % str(uuid.uuid1())
+            abs_fname = self._save_thumbnail(image, fname) 
+            statinfo = os.stat(abs_fname)
+            size = int(statinfo[6])
+            time = float(statinfo[8])
+            entry = CacheEntry(abs_fname, fname, time, size)
+            #remove old element
+            if key:
+                self.remove(key)
+            if self.size() + size > self.conf.cacheSize*1024*1024:
+                self.remove_lru(10)
+                
+            self.elements[fname] = entry
+        return fname
+        
+    def add_entries_from_files(self, absfnames):
+        """add_entries_from_files(absfnames: list of str) -> None
+        In this case the files already exist somewhere on disk.
+        We just keep references to them.
+        
+        """
+        for abs_fname in absfnames:
+            fname = os.path.basename(abs_fname)
+            statinfo = os.stat(abs_fname)
+            size = int(statinfo[6])
+            time = float(statinfo[8])
+            entry = CacheEntry(abs_fname, fname, time, size)
+            self.vtelements[fname] = entry
+
+    @staticmethod
+    def _delete_files(dirname):
+        """delete_files(dirname: str) -> None
+        Deletes all files inside dirname
+    
+        """
+        try:
+            for root, dirs, files in os.walk(dirname):
+                for fname in files:
+                    os.unlink(os.path.join(root,fname))
+                    
+        except OSError, e:
+            debug.warning("Error when removing thumbnails: %s"%str(e))
+    
+    @staticmethod
+    def _get_thumbnail_fnames(folder):
+        """Returns the filenames of the images to be composited in the given
+        folder.  (folder: str) -> list(str)
+        
+        """
+        fnames = []
+        for root, dirs, files in os.walk(folder):
+            for f in files:
+                ftype = mimetypes.guess_type(f)
+                if ftype[0] in ThumbnailCache.SUPPORTED_TYPES:
+                    fnames.append(os.path.join(root,f))
+        return fnames
+
+    @staticmethod
+    def _merge_thumbnails(fnames):
+        """_merge_thumbnails(fnames: list(str)) -> QImage 
+        Generates a single image formed by all the images in the fnames list.
+        
+        """
+        from PyQt4 import QtCore, QtGui
+        height = 0
+        width = 0
+        pixmaps = []
+        # OS may return wrong order so  we need to sort
+        fnames.sort()
+        for fname in fnames:
+            pix = QtGui.QPixmap(fname)
+            if pix.height() > 0 and pix.width() > 0:
+                pixmaps.append(pix)
+                #width += pix.width()
+                #height = max(height, pix.height())
+                height += pix.height()
+                width = max(width,pix.width())            
+        if len(pixmaps) > 0 and height > 0 and width > 0:        
+            finalImage = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32)
+            painter = QtGui.QPainter(finalImage)
+            x = 0
+            for pix in pixmaps:
+                painter.drawPixmap(0, x, pix)
+                x += pix.height()
+            painter.end()
+            if width > ThumbnailCache.IMAGE_MAX_WIDTH:
+                finalImage = finalImage.scaledToWidth(ThumbnailCache.IMAGE_MAX_WIDTH,
+                                                      QtCore.Qt.SmoothTransformation)
+        else:
+            finalImage = None
+        return finalImage
+
+    def _save_thumbnail(self, pngimage, fname):
+        """_save_thumbnail(pngimage:QImage, fname: str) -> str 
+        Returns the absolute path of the saved image
+        
+        """
+        png_fname = os.path.join(self.get_directory(), fname)
+        if os.path.exists(png_fname):
+            os.unlink(png_fname)
+        pngimage.save(png_fname)
+        return png_fname
+
+    def _copy_thumbnails(self, thumbnails):
+        """_copy_thumbnails(thumbnails: list of str) -> None """
+        local_dir = self.get_directory()
+        for thumb in thumbnails:
+            local_thumb = os.path.join(local_dir, os.path.basename(thumb))
+            if os.path.exists(thumb) and not os.path.exists(local_thumb):
+                shutil.copyfile(thumb, local_thumb)
diff --git a/vistrails/core/upgradeworkflow.py b/vistrails/core/upgradeworkflow.py
new file mode 100644
index 0000000..9db165a
--- /dev/null
+++ b/vistrails/core/upgradeworkflow.py
@@ -0,0 +1,578 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""This file contains code to handle InvalidPipeline exceptions that contain
+upgrade requests."""
+from vistrails.core import debug
+import vistrails.core.db.action
+from vistrails.core.modules.module_registry import get_module_registry, \
+     ModuleDescriptor, MissingModule, MissingPort
+from vistrails.core.modules.utils import parse_descriptor_string, \
+    create_descriptor_string, parse_port_spec_string, \
+    create_port_spec_string, expand_port_spec_string
+from vistrails.core.packagemanager import get_package_manager
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.connection import Connection
+from vistrails.core.vistrail.port import Port
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.utils import versions_increasing
+import copy
+
+##############################################################################
+
+class UpgradeWorkflowError(Exception):
+
+    def __init__(self, msg, module=None, port_name=None, port_type=None):
+        Exception.__init__(self, msg)
+        self._msg = msg
+        self._module = module
+        self._port_name = port_name
+        self._port_type = port_type.lower() if port_type else None
+        
+    def __str__(self):
+        return "Upgrading workflow failed.\n" + self._msg
+
+class UpgradeWorkflowHandler(object):
+
+    @staticmethod
+    def dispatch_request(controller, module_id, current_pipeline):
+        reg = get_module_registry()
+        pm = get_package_manager()
+        if module_id not in current_pipeline.modules:
+            # It is possible that some other upgrade request has
+            # already removed the invalid module of this request. In
+            # that case, disregard the request.
+            debug.log("module %s already handled. skipping" % module_id)
+            return []
+        invalid_module = current_pipeline.modules[module_id]
+        pkg = pm.get_package(invalid_module.package)
+        if hasattr(pkg.module, 'handle_module_upgrade_request'):
+            f = pkg.module.handle_module_upgrade_request
+            return f(controller, module_id, current_pipeline)
+        else:
+            debug.log('Package "%s" cannot handle upgrade request. '
+                      'VisTrails will attempt automatic upgrade.' % \
+                          pkg.identifier)
+            auto_upgrade = UpgradeWorkflowHandler.attempt_automatic_upgrade
+            return auto_upgrade(controller, current_pipeline, module_id)
+
+    @staticmethod
+    def check_port_spec(module, port_name, port_type, descriptor=None, 
+                        sigstring=None):
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+
+        reg = get_module_registry()
+        found = False
+        try:
+            if descriptor is not None:
+                s = reg.get_port_spec_from_descriptor(descriptor, port_name,
+                                                      port_type)
+                found = True
+
+                spec_tuples = parse_port_spec_string(sigstring, basic_pkg)
+                for i in xrange(len(spec_tuples)):
+                    spec_tuple = spec_tuples[i]
+                    port_pkg = reg.get_package_by_name(spec_tuple[0])
+                    if port_pkg.identifier != spec_tuple[0]:
+                        # we have an old identifier
+                        spec_tuples[i] = (port_pkg.identifier,) + spec_tuple[1:]
+                sigstring = create_port_spec_string(spec_tuples)
+                # sigstring = expand_port_spec_string(sigstring, basic_pkg)
+                if s.sigstring != sigstring:
+                    msg = ('%s port "%s" of module "%s" exists, but '
+                           'signatures differ "%s" != "%s"') % \
+                           (port_type.capitalize(), port_name, module.name,
+                            s.sigstring, sigstring)
+                    raise UpgradeWorkflowError(msg, module, port_name, port_type)
+        except MissingPort:
+            pass
+
+        if not found and \
+                not module.has_portSpec_with_name((port_name, port_type)):
+            msg = '%s port "%s" of module "%s" does not exist.' % \
+                (port_type.capitalize(), port_name, module.name)
+            raise UpgradeWorkflowError(msg, module, port_name, port_type)
+
+    @staticmethod
+    def find_descriptor(controller, pipeline, module_id, desired_version=''):
+        from vistrails.core.modules.abstraction \
+            import identifier as local_abstraction_pkg
+        reg = get_module_registry()
+
+        get_descriptor = reg.get_descriptor_by_name
+        pm = get_package_manager()
+        invalid_module = pipeline.modules[module_id]
+        mpkg, mname, mnamespace, mid = (invalid_module.package,
+                                        invalid_module.name,
+                                        invalid_module.namespace,
+                                        invalid_module.id)
+        pkg = pm.get_package(mpkg)
+        desired_version = ''
+        d = None
+        # don't check for abstraction/subworkflow since the old module
+        # could be a subworkflow
+        if reg.has_abs_upgrade(*invalid_module.descriptor_info):
+            return reg.get_abs_upgrade(*invalid_module.descriptor_info)
+
+        try:
+            try:
+                d = get_descriptor(mpkg, mname, mnamespace, '', desired_version)
+            except MissingModule, e:
+                r = None
+                if pkg.can_handle_missing_modules():
+                    r = pkg.handle_missing_module(controller, module_id, 
+                                                  pipeline)
+                    d = get_descriptor(mpkg, mname, mnamespace, '', 
+                                       desired_version)
+                if not r:
+                    raise e
+        except MissingModule, e:
+            return None
+        assert isinstance(d, ModuleDescriptor)
+        return d
+
+    @staticmethod
+    def check_upgrade(pipeline, module_id, d, function_remap={},
+                      src_port_remap={}, dst_port_remap={}):
+        invalid_module = pipeline.modules[module_id]
+        def check_connection_port(port):
+            port_type = PortSpec.port_type_map.inverse[port.type]
+            UpgradeWorkflowHandler.check_port_spec(invalid_module,
+                                                   port.name, port_type,
+                                                   d, port.sigstring)
+            
+        # check if connections are still valid
+        for _, conn_id in pipeline.graph.edges_from(module_id):
+            port = pipeline.connections[conn_id].source
+            if port.name not in src_port_remap:
+                check_connection_port(port)
+        for _, conn_id in pipeline.graph.edges_to(module_id):
+            port = pipeline.connections[conn_id].destination
+            if port.name not in dst_port_remap:
+                check_connection_port(port)
+
+        # check if function values are still valid
+        for function in invalid_module.functions:
+            # function_spec = function.get_spec('input')
+            if function.name not in function_remap:
+                UpgradeWorkflowHandler.check_port_spec(invalid_module,
+                                                       function.name, 
+                                                       'input', d,
+                                                       function.sigstring)
+
+    @staticmethod
+    def attempt_automatic_upgrade(controller, pipeline, module_id,
+                                  function_remap={}, src_port_remap={}, 
+                                  dst_port_remap={}, annotation_remap={}):
+        """attempt_automatic_upgrade(module_id, pipeline): [Action]
+
+        Attempts to automatically upgrade module by simply adding a
+        new module with the current package version, and recreating
+        all connections and functions. If any of the ports used are
+        not available, raise an exception that will trigger the
+        failure of the entire upgrade.
+
+        attempt_automatic_upgrade returns a list of actions if 
+        successful.
+        """
+
+        invalid_module = pipeline.modules[module_id]
+        mpkg, mname, mnamespace, mid = (invalid_module.package,
+                                        invalid_module.name,
+                                        invalid_module.namespace,
+                                        invalid_module.id)
+        d = UpgradeWorkflowHandler.find_descriptor(controller, pipeline, 
+                                                   module_id)
+        if not d:
+            if mnamespace:
+                nss = mnamespace + '|' + mname
+            else:
+                nss = mname
+            msg = ("Could not upgrade module %s from package %s.\n" %
+                    (mname, mpkg))
+            raise UpgradeWorkflowError(msg)
+
+        UpgradeWorkflowHandler.check_upgrade(pipeline, module_id, d, 
+                                             function_remap, 
+                                             src_port_remap, dst_port_remap)
+
+        # If we passed all of these checks, then we consider module to
+        # be automatically upgradeable. Now create actions that will
+        # delete functions, module, and connections, and add new
+        # module with corresponding functions and connections.
+
+        return UpgradeWorkflowHandler.replace_module(controller, pipeline, 
+                                                     module_id, d, 
+                                                     function_remap,
+                                                     src_port_remap, 
+                                                     dst_port_remap,
+                                                     annotation_remap)
+
+    @staticmethod
+    def create_new_connection(controller, src_module, src_port, 
+                              dst_module, dst_port):
+        # spec -> name, type, signature
+        output_port_id = controller.id_scope.getNewId(Port.vtType)
+        if isinstance(src_port, basestring):
+            output_port_spec = src_module.get_port_spec(src_port, 'output')
+            output_port = Port(id=output_port_id,
+                               spec=output_port_spec,
+                               moduleId=src_module.id,
+                               moduleName=src_module.name)
+        else:
+            output_port = Port(id=output_port_id,
+                               name=src_port.name,
+                               type=src_port.type,
+                               signature=src_port.signature,
+                               moduleId=src_module.id,
+                               moduleName=src_module.name)
+
+        input_port_id = controller.id_scope.getNewId(Port.vtType)
+        if isinstance(dst_port, basestring):
+            input_port_spec = dst_module.get_port_spec(dst_port, 'input')
+            input_port = Port(id=input_port_id,
+                              spec=input_port_spec,
+                              moduleId=dst_module.id,
+                              moduleName=dst_module.name)
+        else:
+            input_port = Port(id=input_port_id,
+                              name=dst_port.name,
+                              type=dst_port.type,
+                              signature=dst_port.signature,
+                              moduleId=dst_module.id,
+                              moduleName=dst_module.name)
+        conn_id = controller.id_scope.getNewId(Connection.vtType)
+        connection = Connection(id=conn_id,
+                                ports=[input_port, output_port])
+        return connection
+
+
+
+    @staticmethod
+    def replace_generic(controller, pipeline, old_module, new_module,
+                        function_remap={}, src_port_remap={}, 
+                        dst_port_remap={}, annotation_remap={}):
+        ops = []
+        ops.extend(controller.delete_module_list_ops(pipeline, [old_module.id]))
+        
+        for annotation in old_module.annotations:
+            if annotation.key not in annotation_remap:
+                annotation_key = annotation.key
+            else:
+                remap = annotation_remap[annotation.key]
+                if remap is None:
+                    # don't add the annotation back in
+                    continue
+                elif not isinstance(remap, basestring):
+                    ops.extend(remap(annotation))
+                    continue
+                else:
+                    annotation_key = remap
+
+            new_annotation = \
+                Annotation(id=controller.id_scope.getNewId(Annotation.vtType),
+                           key=annotation_key,
+                           value=annotation.value)
+            new_module.add_annotation(new_annotation)
+
+        if not old_module.is_group() and not old_module.is_abstraction():
+            for port_spec in old_module.port_spec_list:
+                if port_spec.type == 'input':
+                    if port_spec.name not in dst_port_remap:
+                        spec_name = port_spec.name
+                    else:
+                        remap = dst_port_remap[port_spec.name]
+                        if remap is None:
+                            continue
+                        elif not isinstance(remap, basestring):
+                            ops.extend(remap(port_spec))
+                            continue
+                        else:
+                            spec_name = remap
+                elif port_spec.type == 'output':
+                    if port_spec.name not in src_port_remap:
+                        spec_name = port_spec.name
+                    else:
+                        remap = src_port_remap[port_spec.name]
+                        if remap is None:
+                            continue
+                        elif not isinstance(remap, basestring):
+                            ops.extend(remap(port_spec))
+                            continue
+                        else:
+                            spec_name = remap                
+                new_spec = port_spec.do_copy(True, controller.id_scope, {})
+                new_spec.name = spec_name
+                new_module.add_port_spec(new_spec)
+
+        function_ops = []
+        for function in old_module.functions:
+            if function.name not in function_remap:
+                function_name = function.name
+            else:
+                remap = function_remap[function.name]
+                if remap is None:
+                    # don't add the function back in
+                    continue                    
+                elif not isinstance(remap, basestring):
+                    function_ops.extend(remap(function, new_module))
+                    continue
+                else:
+                    function_name = remap
+
+            if len(function.parameters) > 0:
+                new_param_vals, aliases = zip(*[(p.strValue, p.alias) 
+                                                for p in function.parameters])
+            else:
+                new_param_vals = []
+                aliases = []
+            new_function = controller.create_function(new_module, 
+                                                      function_name,
+                                                      new_param_vals,
+                                                      aliases)
+            new_module.add_function(new_function)
+
+        # add the new module
+        ops.append(('add', new_module))
+        ops.extend(function_ops)
+
+        create_new_connection = UpgradeWorkflowHandler.create_new_connection
+
+        for _, conn_id in pipeline.graph.edges_from(old_module.id):
+            old_conn = pipeline.connections[conn_id]
+            if old_conn.source.name not in src_port_remap:
+                source_name = old_conn.source.name
+            else:
+                remap = src_port_remap[old_conn.source.name]
+                if remap is None:
+                    # don't add this connection back in
+                    continue
+                elif not isinstance(remap, basestring):
+                    ops.extend(remap(old_conn, new_module))
+                    continue
+                else:
+                    source_name = remap
+                    
+            old_dst_module = pipeline.modules[old_conn.destination.moduleId]
+
+            new_conn = create_new_connection(controller,
+                                             new_module,
+                                             source_name,
+                                             old_dst_module,
+                                             old_conn.destination)
+            ops.append(('add', new_conn))
+            
+        for _, conn_id in pipeline.graph.edges_to(old_module.id):
+            old_conn = pipeline.connections[conn_id]
+            if old_conn.destination.name not in dst_port_remap:
+                destination_name = old_conn.destination.name
+            else:
+                remap = dst_port_remap[old_conn.destination.name]
+                if remap is None:
+                    # don't add this connection back in
+                    continue
+                elif not isinstance(remap, basestring):
+                    ops.extend(remap(old_conn, new_module))
+                    continue
+                else:
+                    destination_name = remap
+                    
+            old_src_module = pipeline.modules[old_conn.source.moduleId]
+            new_conn = create_new_connection(controller,
+                                             old_src_module,
+                                             old_conn.source,
+                                             new_module,
+                                             destination_name)
+            ops.append(('add', new_conn))
+        
+        return [vistrails.core.db.action.create_action(ops)]
+
+    @staticmethod
+    def replace_group(controller, pipeline, module_id, new_subpipeline):
+        old_group = pipeline.modules[module_id]
+        basic_pkg = get_vistrails_basic_pkg_id()
+        new_group = controller.create_module(basic_pkg, 'Group', '', 
+                                             old_group.location.x, 
+                                             old_group.location.y)
+        new_group.pipeline = new_subpipeline
+        return UpgradeWorkflowHandler.replace_generic(controller, pipeline, 
+                                                      old_group, new_group)
+
+    @staticmethod
+    def replace_module(controller, pipeline, module_id, new_descriptor,
+                       function_remap={}, src_port_remap={}, dst_port_remap={},
+                       annotation_remap={}):
+        old_module = pipeline.modules[module_id]
+        internal_version = -1
+        # try to determine whether new module is an abstraction
+        if (hasattr(new_descriptor, 'module') and
+            hasattr(new_descriptor.module, "vistrail") and 
+            hasattr(new_descriptor.module, "internal_version")):
+            internal_version = new_descriptor.version
+        new_module = \
+            controller.create_module_from_descriptor(new_descriptor,
+                                                     old_module.location.x,
+                                                     old_module.location.y,
+                                                     internal_version)
+
+        return UpgradeWorkflowHandler.replace_generic(controller, pipeline, 
+                                                      old_module, new_module,
+                                                      function_remap, 
+                                                      src_port_remap, 
+                                                      dst_port_remap,
+                                                      annotation_remap)
+
+    @staticmethod
+    def remap_module(controller, module_id, pipeline, module_remap):
+
+        """remap_module offers a method to shortcut the
+        specification of upgrades.  It is useful when just changing
+        the names of ports or modules, but can also be used to add
+        intermediate modules or change the format of parameters.  It
+        is usually called from handle_module_upgrade_request, and the
+        first three arguments are passed from the arguments to that
+        method.
+
+        module_remap specifies all of the changes and is of the format
+        {<old_module_name>: [(<start_version>, <end_version>, 
+                             <new_module_klass> | <new_module_id> | None, 
+                             <remap_dictionary>)]}
+        where new_module_klass is the class and new_module_id
+        is a string of the format 
+            <package_name>:[<namespace> | ]<module_name>
+        passing None keeps the original name,
+        and remap_dictionary is {<remap_type>:
+        <name_changes>} and <name_changes> is a map from <old_name> to
+        <new_name> or <remap_function>
+        The remap functions are passed the old object and the new
+        module and should return a list of operations with elements of
+        the form ('add', <obj>).
+
+        For example:
+
+        def outputName_remap(old_conn, new_module):
+            ops = []
+            ...
+            return ops
+        module_remap = {'FileSink': [(None, '1.5.1', FileSink,
+                                     {'dst_port_remap':
+                                          {'overrideFile': 'overwrite',
+                                           'outputName': outputName_remap},
+                                      'function_remap':
+                                          {'overrideFile': 'overwrite',
+                                           'outputName': 'outputPath'}}),
+                        }
+        """
+
+        reg = get_module_registry()
+
+        old_module = pipeline.modules[module_id]
+        old_desc_str = create_descriptor_string(old_module.package,
+                                                old_module.name,
+                                                old_module.namespace,
+                                                False)
+        # print 'running module_upgrade_request', old_module.name
+        if old_desc_str in module_remap:
+            for upgrade_tuple in module_remap[old_desc_str]:
+                (start_version, end_version, new_module_type, remap) = \
+                    upgrade_tuple
+                old_version = old_module.version
+                if ((start_version is None or 
+                     not versions_increasing(old_version, start_version)) and
+                    (end_version is None or
+                     versions_increasing(old_version, end_version))):
+                    # do upgrade
+                    
+                    if new_module_type is None:
+                        try:
+                            new_module_desc = \
+                                reg.get_descriptor_by_name(old_module.package, 
+                                                           old_module.name, 
+                                                           old_module.namespace)
+                        except MissingModule, e:
+                            # if the replacement is an abstraction,
+                            # and it has been upgraded, we use that
+                            if reg.has_abs_upgrade(old_module.package,
+                                                   old_module.name,
+                                                   old_module.namespace):
+                                new_module_desc = \
+                                    reg.get_abs_upgrade(old_module.package,
+                                                        old_module.name,
+                                                        old_module.namespace)
+                            else:
+                                raise e
+                    elif isinstance(new_module_type, basestring):
+                        d_tuple = parse_descriptor_string(new_module_type,
+                                                          old_module.package)
+                        try:
+                            new_module_desc = \
+                                reg.get_descriptor_by_name(*d_tuple)
+                        except MissingModule, e:
+                            # if the replacement is an abstraction,
+                            # and it has been upgraded, we use that
+                            if reg.has_abs_upgrade(*d_tuple):
+                                new_module_desc = reg.get_abs_upgrade(*d_tuple)
+                            else:
+                                raise e
+                    else: # we have a klass for get_descriptor
+                        new_module_desc = reg.get_descriptor(new_module_type)
+                   
+                    src_port_remap = remap.get('src_port_remap', {})
+                    dst_port_remap = remap.get('dst_port_remap', {})
+                    # !!! we're going to let dst_port_remap serve as a
+                    # base for function_remap but the developer is
+                    # responsible for knowing that anything beyond name
+                    # remaps requires different functions
+                    function_remap = copy.copy(dst_port_remap)
+                    function_remap.update(remap.get('function_remap', {}))
+                    annotation_remap = remap.get('annotation_remap', {})
+                    action_list = \
+                        UpgradeWorkflowHandler.replace_module(controller, 
+                                                              pipeline,
+                                                              module_id, 
+                                                              new_module_desc,
+                                                              function_remap,
+                                                              src_port_remap,
+                                                              dst_port_remap,
+                                                              annotation_remap)
+                    return action_list
+
+        # otherwise, just try to automatic upgrade
+        # attempt_automatic_upgrade
+        return UpgradeWorkflowHandler.attempt_automatic_upgrade(controller, 
+                                                                pipeline,
+                                                                module_id)
+    
diff --git a/vistrails/core/utils/__init__.py b/vistrails/core/utils/__init__.py
new file mode 100644
index 0000000..1b09d76
--- /dev/null
+++ b/vistrails/core/utils/__init__.py
@@ -0,0 +1,644 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+This module defines common functions and exception class definitions
+used all over VisTrails.
+"""
+from __future__ import with_statement
+
+import vistrails.core.debug
+from vistrails.core.utils.enum import enum
+from vistrails.core.utils.timemethod import time_method, time_call
+from vistrails.core.utils.tracemethod import trace_method, bump_trace, report_stack, \
+     trace_method_options, trace_method_args
+from vistrails.core.utils.color import ColorByName
+from vistrails.core.utils.lockmethod import lock_method
+import copy
+import errno
+import itertools
+import os
+import sys
+import weakref
+
+
+import unittest
+import tempfile
+
+################################################################################
+
+def invert(d):
+    """invert(dict) -> dict. Returns an inverted dictionary by
+    switching key-value pairs. If you use this repeatedly,
+    consider switching the underlying data structure to a
+    core.data_structures.bijectivedict.Bidict instead."""
+    return dict([[v,k] for k,v in d.items()])
+
+################################################################################
+
+def unimplemented():
+    """Raises UnimplementedException."""
+    raise UnimplementedException()
+
+def abstract():
+    """Raises AbstractException.""" 
+    raise AbstractException()
+
+class VistrailsWarning(Warning):
+    pass
+
+class VistrailsDeprecation(VistrailsWarning):
+    pass
+
+################################################################################
+
+class NoMakeConnection(Exception):
+    """NoMakeConnection is raised when a VisConnection doesn't know
+    how to create a live version of itself. This is an internal error
+    that should never be seen by a user. Please report a bug if you
+    see this."""
+    def __init__(self, conn):
+        self.conn = conn
+    def __str__(self):
+        return "Connection %s has no makeConnection method" % self.conn
+
+class NoSummon(Exception):
+    """NoSummon is raised when a VisObject doesn't know how to create
+    a live version of itself. This is an internal error that should
+    never be seen by a user. Please report a bug if you see this."""
+    def __init__(self, obj):
+        self.obj = obj
+    def __str__(self):
+        return "Module %s has no summon method" % self.obj
+
+class UnimplementedException(Exception):
+    """UnimplementedException is raised when some interface hasn't
+    been implemented yet. This is an internal error that should never
+    be seen by a user. Please report a bug if you see this."""
+    def __str__(self):
+        return "Object is Unimplemented"
+
+class AbstractException(Exception):
+    """AbstractException is raised when an abstract method is called.
+    This is an internal error that should never be seen by a
+    user. Please report a bug if you see this."""
+    def __str__(self):
+        return "Abstract Method was called"
+
+class VistrailsInternalError(Exception):
+    """VistrailsInternalError is raised when an unexpected internal
+    inconsistency happens. This is (clearly) an internal error that
+    should never be seen by a user. Please report a bug if you see
+    this."""
+    def __init__(self, msg):
+        self.emsg = msg
+    def __str__(self):
+        return "Vistrails Internal Error: " + str(self.emsg)
+
+class VersionTooLow(Exception):
+    """VersionTooLow is raised when you're running an outdated version
+    of some necessary software or package."""
+    def __init__(self, sw, required_version):
+        self.sw = sw
+        self.required_version = required_version
+    def __str__(self):
+        return ("Your version of '" +
+                self.sw +
+                "' is too low. Please upgrade to " +
+                self.required_version +
+                " or later")
+
+class InvalidModuleClass(Exception):
+    """InvalidModuleClass is raised when there's something wrong with
+a class that's being registered as a module within VisTrails."""
+
+    def __init__(self, klass):
+        self.klass = klass
+
+    def __str__(self):
+        return ("class '%s' cannot be registered in VisTrails. Please" +
+                " consult the documentation.") % self.klass.__name__
+
+class ModuleAlreadyExists(Exception):
+    """ModuleAlreadyExists is raised when trying to add a class that
+    is already in the module registry."""
+
+    def __init__(self, identifier, moduleName):
+        self._identifier = identifier
+        self._name = moduleName
+
+    def __str__(self):
+        return ("'%s, %s' cannot be registered in VisTrails because of another "
+                "module with the same identifier and name already exists." %
+                (self._identifier,
+                 self._name))
+
+class PortAlreadyExists(Exception):
+    """PortAlreadyExists is raised when trying to add a PortSpec that
+    has the same name and type as an existing PortSpec."""
+
+    def __init__(self, identifier, module_name, port_type, port_name):
+        self._identifier = identifier
+        self._module_name = module_name
+        self._port_type = port_type
+        self._port_name = port_name
+        
+    def __str__(self):
+        return "Module '%s:%s' already contains an %s port named '%s'" % \
+            (self._identifier, self._module_name, self._port_type,
+             self._port_name)
+
+class InvalidPipeline(Exception):
+    """InvalidPipeline is raised when a pipeline cannot be instantiated due 
+    to missing information in the registry, like unloaded packages or missing
+    modules.
+
+    parameters:
+
+    exception_set: list of all exceptions related to why this is an
+    invalid pipeline
+
+    pipeline: pipeline that is invalid (potentially incomplete, in the
+    case where modules could not be found, etc). This is stored here
+    so that pipeline upgrades can be performed appropriately. Since
+    Controller.do_version_switch (sensibly) bails before setting the
+    invalid pipeline to current_pipeline and the new value to
+    current_version, these need to percolate through the exceptions so
+    the values can be fixed.
+
+    version: version id of the pipeline in the vistrail
+    """
+    def __init__(self, exception_set, pipeline=None, version=None):
+        self._exception_set = exception_set
+        #the problem here is that sometimes the pipeline can't be copied when
+        # it is invalid. So if it throws an Exception, we will just ignore
+        try:
+            self._pipeline = copy.copy(pipeline)
+        except:
+            self._pipeline = None
+        self._version = version
+
+    def __str__(self):
+        return "Pipeline has errors. Please see the detailed message for more information.\n  " + \
+            '\n  '.join(line for e in self._exception_set 
+                        for line in str(e).splitlines())
+
+    def get_exception_set(self):
+        return self._exception_set
+
+################################################################################
+
+# Only works for functions with NO kwargs!
+def memo_method(method):
+    """memo_method is a method decorator that memoizes results of the
+    decorated method, trading off memory for time by caching previous
+    results of the calls."""
+    attrname = "_%s_memo_result" % id(method)
+    memo = {}
+    def decorated(self, *args):
+        try:
+            return memo[args]
+        except KeyError:
+            result = method(self, *args)
+            memo[args] = result
+            return result
+    warn = "(This is a memoized method: Don't mutate the return value you're given.)"
+    if method.__doc__:
+        decorated.__doc__ = method.__doc__ + "\n\n" + warn
+    else:
+        decorated.__doc__ = warn
+    return decorated
+
+##############################################################################
+# Profiling, utilities
+
+_profiled_list = []
+def profile(func):
+    """profile is a method decorator that profiles the calls of a
+    given method using cProfile. You need to get the decorated method
+    programmatically later to get to the profiler stats. It will be
+    available as the attribute 'profiler_object' on the decorated
+    result.
+
+    From there, you can simply call save_all_profiles(), and that will
+    take the list of all profiled methods and save them to different
+    files.
+
+    If you like manual labor, you probably want to do something like this:
+
+    >>> po = ...... .profiler_object
+    >>> po.dump_stats('/tmp/some_temporary_file')
+    >>> import pstats
+    >>> ps = pstats.Stats('/tmp/some_temporary_file')
+    >>> ps.sort_stats('time') # or cumtime, or calls, or others - see doc
+    >>> ps.print_stats()
+
+    """
+
+    # Notice that on ubuntu you will need
+    # sudo apt-get install python-profiler
+
+    try:
+        import cProfile as prof
+    except ImportError:
+        import profile as prof
+
+    pobject = prof.Profile()
+    def method(*args, **kwargs):
+        return pobject.runcall(func, *args, **kwargs)
+
+    method.profiler_object = pobject
+    _profiled_list.append((func.__name__, method))
+    return method
+
+def get_profiled_methods():
+    return _profiled_list
+
+def save_profile_to_disk(callable_, filename):
+    callable_.profiler_object.dump_stats(filename)
+
+def save_all_profiles():
+    # This is internal because core.system imports core.utils... :/
+    import vistrails.core.system
+    td = vistrails.core.system.temporary_directory()
+    for (name, method) in get_profiled_methods():
+        fout = td + name + '.pyp'
+        #print fout
+        method.profiler_object.dump_stats(fout)
+
+##############################################################################
+
+def debug(func):
+    """debug is a method decorator that invokes the python integrated
+    debugger in a given method. Use it to step through tricky
+    code. Note that pdb is not integrated with emacs or anything like
+    that, so you'll need a shell to see what's going on.
+
+    """
+    import pdb
+
+    def method(*args, **kwargs):
+        return pdb.runcall(func, *args, **kwargs)
+    return method
+
+################################################################################
+
+# Write our own all() and any() if python version < 2.5
+if sys.version_info < (2, 5):
+    def any(iterable):
+        """any(iterable) -> Boolean - Returns true if any element
+        is true. This is meant to be the equivalent of python 2.5's any
+        when running on python < 2.5"""
+        for b in iterable:
+            if b:
+                return True
+        return False
+
+    def all(iterable):
+        """all(iterable) -> Boolean - Returns true if no elements are
+        False.  This is meant to be the equivalent of python 2.5's
+        all() when running on python < 2.5"""
+        for b in iterable:
+            if not b:
+                return False
+        return True
+else:
+    import __builtin__
+    any = __builtin__.any
+    all = __builtin__.all
+
+def iter_index(iterable, item):
+    """iter_index(iterable, item) -> int - Iterates through iterator
+    until item is found, and returns the index inside the iterator.
+
+    iter_index is analogous to list.index for iterators."""
+    try:
+        itor = itertools.izip(iterable, itertools.count(0))
+        return itertools.dropwhile(lambda (v,c): v != item, itor).next()[1]
+    except StopIteration:
+        return -1
+                                              
+
+def eprint(*args):
+    """eprint(*args) -> False - Prints the arguments, then returns
+    false. Useful inside a lambda expression, for example."""
+    for v in args:
+        print v,
+    print
+
+def uniq(l):
+    """uniq(l) -> List. Returns a new list consisting of elements that
+    test pairwise different for equality. Requires all elements to be
+    sortable, and runs in O(n log n) time."""
+    if len(l) == 0:
+        return []
+    a = copy.copy(l)
+    a.sort()
+    l1 = a[:-1] 
+    l2 = a[1:]
+    return [a[0]] + [next for (i, next) in itertools.izip(l1, l2) if i != next]
+
+class InstanceObject(object):
+    """InstanceObject is a convenience class created to facilitate
+    creating of one-off objects with many fields. It simply translates
+    the passed kwargs on the constructor to a set of fields with
+    the right values."""
+    def __init__(self, **kw):
+        self.__dict__.update(kw)
+
+    def __str__(self):
+        pre = "(%s " % self.__class__.__name__
+        items = [('%s: %s' % (k, str(v)))
+                 for (k, v)
+                 in sorted(self.__dict__.items())]
+        items_str = ('\n' + (' ' * len(pre))).join(items)
+        post = ')@%X' % id(self)
+        return pre + items_str + post
+    
+    def write_source(self, prefix=""):
+        result = ""
+        for (k, v) in sorted(self.__dict__.items()):
+            if isinstance(v, InstanceObject):
+                newprefix = prefix + "." + k
+                result += v.write_source(newprefix)
+            else:
+                result += prefix
+                result += "." + str(k) + " = " 
+                if isinstance(v, basestring):
+                    result +=  "'" + str(v) + "'\n"
+                else:
+                    result += str(v) + "\n"
+        return result
+
+def append_to_dict_of_lists(dict, key, value):
+    """Appends /value/ to /dict/[/key/], or creates entry such that
+    /dict/[/key/] == [/value/]."""
+    try:
+        dict[key].append(value)
+    except KeyError:
+        dict[key] = [value]
+
+def version_string_to_list(version):
+    """version_string_to_list converts a version string to a list of
+    numbers and strings:
+
+    version_string('0.1') -> [0, 1]
+    version_string('0.9.9alpha') -> [0, 9, '9alpha']
+
+    """
+    def convert(value):
+        try:
+            return int(value)
+        except ValueError:
+            return value
+    return [convert(value) for value in version.split('.')]
+
+def versions_increasing(v1, v2):
+    v1_list = v1.split('.')
+    v1_list.reverse()
+    v2_list = v2.split('.')
+    v2_list.reverse()
+    try:
+        while len(v1_list) > 0 and len(v2_list) > 0:
+            v1_num = int(v1_list.pop())
+            v2_num = int(v2_list.pop())
+            if v1_num < v2_num:
+                return True
+            elif v1_num > v2_num:
+                return False
+        if len(v1_list) < len(v2_list):
+            return True
+        elif len(v1_list) > len(v2_list):
+            return False
+    except ValueError:
+        vistrails.core.debug.critical("Cannot compare versions whose components " +
+                       "are not integers")
+    return False
+                
+
+##############################################################################
+# DummyView & DummyScene
+
+class DummyScene(object):
+    def __init(self):
+        self.current_version = -1
+        self.current_pipeline = None
+    def get_selected_module_ids(self):
+        return [] 
+    def flushMoveActions(self, *args, **kwargs): pass
+    
+class DummyView(object):
+    def __init__(self):
+        self._scene = DummyScene()
+    def set_module_active(self, *args, **kwargs): pass
+    def set_module_computing(self, *args, **kwargs): pass
+    def set_module_success(self, *args, **kwargs): pass
+    def set_module_suspended(self, *args, **kwargs): pass
+    def set_module_error(self, *args, **kwargs): pass
+    def set_module_not_executed(self, *args, **kwargs): pass
+    def set_module_progress(self, *args, **kwargs): pass
+    def set_module_persistent(self, *args, **kwargs): pass
+    def flushMoveActions(self, *args, **kwargs): pass
+    def scene(self): 
+        return self._scene
+##############################################################################    
+# FIXME: Add tests
+def no_interrupt(callable_, *args, **kwargs):
+    """no_interrupt(callable_, *args, **kwargs) -> return arguments
+    from callable.
+
+    Calls callable_ with *args and **kwargs and keeps retrying as long as call
+is interrupted by the OS. This makes calling read more convenient when
+using output from the subprocess module."""
+    while True:
+        try:
+            return callable_(*args, **kwargs)
+        except IOError, e:
+            if e.errno == errno.EINTR:
+                continue
+            else:
+                raise
+
+################################################################################
+# class for creating weak references to bound methods
+# based on recipe http://code.activestate.com/recipes/81253/
+# converted to work also in python 2.6.x without using deprecated methods
+# not tested in python 2.5.x but it should work
+class Ref(object):
+    """ Wraps any callable, most importantly a bound method, in a way that
+    allows a bound method's object to be GC'ed, while providing the same
+    interface as a normal weak reference. """
+    def __init__(self, fn):
+        try:
+            #try getting object, function, and class
+            o, f, c = fn.im_self, fn.im_func, fn.im_class
+        except AttributeError: #it's not a bound method
+            self._obj = None
+            self._func = fn
+            self._clas = None
+        else: #it's a bound method
+            if o is None: self._obj = None #... actually UN-bound
+            else: self._obj = weakref.ref(o)
+            self._func = f
+            self._clas = None
+            
+    def __call__(self):
+        if self._obj is None: return self._func
+        elif self._obj() is None: return None
+        try:
+            import types
+            instance_method = types.MethodType
+        except ImportError:
+            #new is deprecated in python 2.6
+            import new
+            instance_method = new.instancemethod
+        return instance_method(self._func, self._obj(), self._clas)
+    
+################################################################################
+
+class Chdir(object):
+    def __init__(self, dirname):
+        self._old_dir = os.getcwd()
+        self._new_dir = dirname
+        
+    def __enter__(self):
+        os.chdir(self._new_dir)
+        
+    def __exit__(self, *args):
+        os.chdir(self._old_dir)
+################################################################################
+
+
+
+class _TestRegularFibo(object):
+    def __init__(self):
+        self.calls = 0
+
+    def f(self, x):
+        self.calls += 1
+        if x == 0: return 0
+        if x == 1: return 1
+        return self.f(x-1) + self.f(x-2)
+
+class _TestMemoFibo(_TestRegularFibo):
+    f = memo_method(_TestRegularFibo.f)
+
+class TestCommon(unittest.TestCase):
+    def test_append_to_dict_of_lists(self):
+        f = {}
+        self.assertEquals(f.has_key(1), False)
+        append_to_dict_of_lists(f, 1, 1)
+        self.assertEquals(f.has_key(1), True)
+        self.assertEquals(f[1], [1])
+        append_to_dict_of_lists(f, 1, 1)
+        self.assertEquals(f.has_key(1), True)
+        self.assertEquals(f[1], [1, 1])
+        append_to_dict_of_lists(f, 1, 2)
+        self.assertEquals(f.has_key(1), True)
+        self.assertEquals(f[1], [1, 1, 2])
+        append_to_dict_of_lists(f, 2, "Foo")
+        self.assertEquals(f.has_key(2), True)
+        self.assertEquals(f[2], ["Foo"])
+
+    def test_memo(self):
+        regular = _TestRegularFibo()
+        r1 = regular.f(20)
+        memoized = _TestMemoFibo()
+        r2 = memoized.f(20)
+        self.assertEqual(r1, 6765)
+        self.assertEqual(r2, 6765)
+        self.assertLess(memoized.calls, regular.calls)
+        self.assertEqual(regular.calls, 21891)
+        self.assertEqual(memoized.calls, 21)
+
+    def test_memo_2(self):
+        count = [0]
+        class C1(object):
+            pass
+        class C2(object):
+            pass
+        class TestClassMemo(object):
+            def __init__(self, cell):
+                self.cell = cell
+            @memo_method
+            def f(self, cl, x):
+                self.cell[0] += 1
+                return x
+        t = TestClassMemo(count)
+        self.assertEquals(count[0], 0)
+        t.f(C1, 0)
+        self.assertEquals(count[0], 1)
+        t.f(C1, 0)
+        self.assertEquals(count[0], 1)
+        t.f(C1, 1)
+        self.assertEquals(count[0], 2)
+        t.f(C2, 0)
+        self.assertEquals(count[0], 3)
+
+    def test_version_string_to_list(self):
+        self.assertEquals(version_string_to_list("0.1"), [0, 1])
+        self.assertEquals(version_string_to_list("1.0.2"), [1, 0, 2])
+        self.assertEquals(version_string_to_list("1.0.2beta"), [1, 0, '2beta'])
+    
+    def test_ref(self):
+        class C(object):
+            def f(self):
+                return 'hello'
+        c = C()
+        cf = weakref.ref(c.f)
+        #bound methods behave not as expected. You want cf() not to be None
+        self.assertEquals(cf(), None)
+        #so we use the new class
+        cf = Ref(c.f)
+        #it behaves as expected
+        self.assertEquals(cf()(),'hello')
+        del c
+        #and after deletion the reference is dead
+        self.assertEquals(cf(), None)
+        
+    def test_chdir(self):
+        def raise_exception():
+            with Chdir(tempfile.gettempdir()):
+                raise Exception
+            
+        currentpath = os.getcwd()
+        with Chdir(tempfile.gettempdir()):
+            pass
+        self.assertEquals(os.getcwd(), currentpath)
+        
+        self.assertRaises(Exception, raise_exception)
+        self.assertEquals(os.getcwd(), currentpath)
+        
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/utils/color.py b/vistrails/core/utils/color.py
new file mode 100644
index 0000000..0b20b30
--- /dev/null
+++ b/vistrails/core/utils/color.py
@@ -0,0 +1,452 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+Contain color related utilities such as color look up by name or
+color defines
+"""
+
+################################################################################
+
+class ColorByName(object):
+    """
+    Provides a list of colors that can be queried by name
+    
+    """
+    colors = { 'antique_white' : [ 0.9804, 0.9216, 0.8431 ],
+               'azure' : [ 0.9412, 1.0000, 1.0000 ],
+               'bisque' : [ 1.0000, 0.8941, 0.7686 ],
+               'blanched_almond' : [ 1.0000, 0.9216, 0.8039 ],
+               'cornsilk' : [ 1.0000, 0.9725, 0.8627 ],
+               'eggshell' : [ 0.9900, 0.9000, 0.7900 ],
+               'floral_white' : [ 1.0000, 0.9804, 0.9412 ],
+               'gainsboro' : [ 0.8627, 0.8627, 0.8627],
+               'ghost_white' : [ 0.9725, 0.9725, 1.0000],
+               'honeydew' : [ 0.9412, 1.0000, 0.9412 ],
+               'ivory' : [ 1.0000, 1.0000, 0.9412 ],
+               'lavender' : [ 0.9020, 0.9020, 0.9804],
+               'lavender_blush' : [1.0000, 0.9412, 0.9608 ],
+               'lemon_chiffon' : [1.0000, 0.9804, 0.8039 ],
+               'linen' : [ 0.9804, 0.9412, 0.9020 ],
+               'mint_cream' : [ 0.9608, 1.0000, 0.9804 ],
+               'misty_rose' : [ 1.0000, 0.8941, 0.8824 ],
+               'moccasin' : [ 1.0000, 0.8941, 0.7098 ],
+               'navajo_white' : [ 1.0000, 0.8706, 0.6784 ], 
+               'old_lace' : [ 0.9922, 0.9608, 0.9020 ], 
+               'papaya_whip' : [ 1.0000, 0.9373, 0.8353 ], 
+               'peach_puff' : [ 1.0000, 0.8549, 0.7255 ], 
+               'seashell' : [ 1.0000, 0.9608, 0.9333 ], 
+               'snow' : [ 1.0000, 0.9804, 0.9804 ],
+               'thistle' : [ 0.8471, 0.7490, 0.8471 ], 
+               'titanium_white' : [ 0.9900, 1.0000, 0.9400 ],
+               'wheat' : [ 0.9608, 0.8706, 0.7020 ],
+               'white' : [ 1.0000, 1.0000, 1.0000 ],
+               'white_smoke' : [ 0.9608, 0.9608, 0.9608 ],
+               'zinc_white' : [ 0.9900, 0.9700, 1.0000 ],
+
+               #Greys
+               'cold_grey' : [ 0.5000, 0.5400, 0.5300 ], 
+               'light_dim_grey' : [ 0.45, 0.45, 0.45 ],
+               'dim_grey' : [ 0.4118, 0.4118, 0.4118 ],
+               'dark_dim_grey' : [ 0.35, 0.35, 0.35 ],
+               'grey' : [ 0.7529, 0.7529, 0.7529 ],
+               'very_light_grey' : [ 0.95, 0.95, 0.95 ],
+               'light_grey' : [ 0.8275, 0.8275, 0.8275 ],
+               'slate_grey' : [ 0.4392, 0.5020, 0.5647 ],
+               'slate_grey_dark' : [ 0.1843, 0.3098, 0.3098 ],
+               'slate_grey_light' : [ 0.4667, 0.5333, 0.6000 ],
+               'warm_grey' : [ 0.5000, 0.5000, 0.4100 ],
+
+               #Blacks
+               'black' : [ 0.0000, 0.0000, 0.0000], 
+               'ivory_black' : [ 0.1600, 0.1400, 0.1300 ],
+               'lamp_black' : [ 0.1800, 0.2800, 0.2300 ],
+
+               #Reds
+               'alizarin_crimson' : [ 0.8900, 0.1500, 0.2100 ], 
+               'brick' : [ 0.6100, 0.4000, 0.1200 ],
+               'cadmium_red_deep' : [ 0.8900, 0.0900, 0.0500 ],
+               'coral' : [ 1.0000, 0.4980, 0.3137 ],
+               'coral_light' : [ 0.9412, 0.5020, 0.5020 ],
+               'deep_pink' : [ 1.0000, 0.0784, 0.5765], 
+               'english_red' : [ 0.8300, 0.2400, 0.1000 ], 
+               'firebrick' : [ 0.6980, 0.1333, 0.1333 ],
+               'geranium_lake' : [ 0.8900, 0.0700, 0.1900 ],
+               'hot_pink' : [ 1.0000, 0.4118, 0.7059 ], 
+               'indian_red' : [ 0.6900, 0.0900, 0.1200 ],
+               'light_salmon' : [ 1.0000, 0.6275, 0.4784 ],
+               'madder_lake_deep' :[ 0.8900, 0.1800, 0.1900 ],
+               'maroon' : [0.6902, 0.1882, 0.3765 ],
+               'pink' : [ 1.0000, 0.7529, 0.7961 ],
+               'pink_light' : [ 1.0000, 0.7137, 0.7569 ],
+               'raspberry' : [ 0.5300, 0.1500, 0.3400 ],
+               'red': [ 1.0000, 0.0000, 0.0000 ],
+               'rose_madder' : [ 0.8900, 0.2100, 0.2200 ],
+               'salmon' : [ 0.9804, 0.5020, 0.4471 ],
+               'tomato': [ 1.0000, 0.3882, 0.2784 ],
+               'venetian_red' : [ 0.8300, 0.1000, 0.1200 ],
+
+               #Browns
+               'beige' : [ 0.6400, 0.5800, 0.5000 ],  
+               'brown' : [ 0.5000, 0.1647, 0.1647 ],  
+               'brown_madder' : [ 0.8600, 0.1600, 0.1600 ],  
+               'brown_ochre': [ 0.5300, 0.2600, 0.1200 ],  
+               'burlywood' : [ 0.8706, 0.7216, 0.5294 ],  
+               'burnt_sienna' : [ 0.5400, 0.2100, 0.0600 ],  
+               'burnt_umber' : [ 0.5400, 0.2000, 0.1400 ],  
+               'chocolate' : [ 0.8235, 0.4118, 0.1176 ],  
+               'deep_ochre' : [ 0.4500, 0.2400, 0.1000 ],  
+               'flesh': [ 1.0000, 0.4900, 0.2500 ],  
+               'flesh_ochre': [ 1.0000, 0.3400, 0.1300 ],  
+               'gold_ochre': [ 0.7800, 0.4700, 0.1500 ],  
+               'greenish_umber': [ 1.0000, 0.2400, 0.0500 ],  
+               'khaki': [ 0.9412, 0.9020, 0.5490 ],  
+               'khaki_dark': [ 0.7412, 0.7176, 0.4196 ],  
+               'light_beige': [ 0.9608, 0.9608, 0.8627 ],  
+               'peru': [ 0.8039, 0.5216, 0.2471 ],  
+               'rosy_brown': [ 0.7373, 0.5608, 0.5608 ],  
+               'raw_sienna': [ 0.7800, 0.3800, 0.0800 ],  
+               'raw_umber': [ 0.4500, 0.2900, 0.0700 ],  
+               'sepia': [ 0.3700, 0.1500, 0.0700 ],  
+               'sienna': [ 0.6275, 0.3216, 0.1765 ],  
+               'saddle_brown': [ 0.5451, 0.2706, 0.0745 ],  
+               'sandy_brown': [ 0.9569, 0.6431, 0.3765 ],  
+               'tan': [ 0.8235, 0.7059, 0.5490 ],  
+               'van_dyke_brown': [ 0.3700, 0.1500, 0.0200 ],  
+
+               #Oranges
+               'cadmium_orange': [ 1.0000, 0.3800, 0.0100 ],  
+               'cadmium_red_light': [ 1.0000, 0.0100, 0.0500 ],  
+               'carrot': [ 0.9300, 0.5700, 0.1300 ],  
+               'dark_orange': [ 1.0000, 0.5490, 0.0000 ],  
+               'mars_orange': [ 0.5900, 0.2700, 0.0800 ],  
+               'mars_yellow': [ 0.8900, 0.4400, 0.1000 ],  
+               'orange': [ 1.0000, 0.5000, 0.0000 ],  
+               'orange_red': [ 1.0000, 0.2706, 0.0000 ],  
+               'yellow_ochre': [ 0.8900, 0.5100, 0.0900 ],  
+               
+               #Yellows
+               'aureoline_yellow': [ 1.0000, 0.6600, 0.1400 ],  
+               'banana': [ 0.8900, 0.8100, 0.3400 ],  
+               'cadmium_lemon': [ 1.0000, 0.8900, 0.0100 ],  
+               'cadmium_yellow': [ 1.0000, 0.6000, 0.0700 ],  
+               'cadmium_yellow_light': [ 1.0000, 0.6900, 0.0600 ],  
+               'gold': [ 1.0000, 0.8431, 0.0000 ],  
+               'goldenrod': [ 0.8549, 0.6471, 0.1255 ],  
+               'goldenrod_medium': [0.8549, 0.6971, 0.2255],
+               'goldenrod_dark': [ 0.7216, 0.5255, 0.0431 ],  
+               'goldenrod_light': [ 0.9804, 0.9804, 0.8235 ],  
+               'goldenrod_pale': [ 0.9333, 0.9098, 0.6667 ],  
+               'light_goldenrod': [ 0.9333, 0.8667, 0.5098 ],  
+               'melon': [ 0.8900, 0.6600, 0.4100 ],  
+               'naples_yellow_deep': [ 1.0000, 0.6600, 0.0700 ],  
+               'yellow': [ 1.0000, 1.0000, 0.0000 ],  
+               'yellow_light': [ 1.0000, 1.0000, 0.8784 ],  
+
+               #Greens
+               'chartreuse': [ 0.4980, 1.0000, 0.0000 ],  
+               'chrome_oxide_green': [ 0.4000, 0.5000, 0.0800 ],  
+               'cinnabar_green': [ 0.3800, 0.7000, 0.1600 ],  
+               'cobalt_green': [ 0.2400, 0.5700, 0.2500 ],  
+               'emerald_green': [ 0.0000, 0.7900, 0.3400 ],  
+               'forest_green': [ 0.1333, 0.5451, 0.1333 ],  
+               'green': [ 0.0000, 1.0000, 0.0000 ],  
+               'green_dark': [ 0.0000, 0.3922, 0.0000 ],  
+               'green_pale': [ 0.5961, 0.9843, 0.5961 ],  
+               'green_yellow': [ 0.6784, 1.0000, 0.1843 ],  
+               'lawn_green': [ 0.4863, 0.9882, 0.0000 ],  
+               'lime_green': [ 0.1961, 0.8039, 0.1961 ],  
+               'mint': [ 0.7400, 0.9900, 0.7900 ],  
+               'olive': [ 0.2300, 0.3700, 0.1700 ],  
+               'olive_drab': [ 0.4196, 0.5569, 0.1373 ],  
+               'olive_green_dark': [ 0.3333, 0.4196, 0.1843 ],  
+               'permanent_green': [ 0.0400, 0.7900, 0.1700 ],  
+               'sap_green': [ 0.1900, 0.5000, 0.0800 ],  
+               'sea_green': [ 0.1804, 0.5451, 0.3412 ],  
+               'sea_green_dark': [ 0.5608, 0.7373, 0.5608 ],  
+               'sea_green_medium': [ 0.2353, 0.7020, 0.4431 ],  
+               'sea_green_light': [ 0.1255, 0.6980, 0.6667 ],  
+               'spring_green': [ 0.0000, 1.0000, 0.4980 ],  
+               'spring_green_medium': [ 0.0000, 0.9804, 0.6039 ],  
+               'terre_verte': [ 0.2200, 0.3700, 0.0600 ],  
+               'viridian_light': [ 0.4300, 1.0000, 0.4400 ],  
+               'yellow_green': [ 0.6039, 0.8039, 0.1961 ],  
+
+               #Cyans
+               'aquamarine': [ 0.4980, 1.0000, 0.8314 ],  
+               'aquamarine_medium': [ 0.4000, 0.8039, 0.6667 ],  
+               'cyan': [ 0.0000, 1.0000, 1.0000 ],  
+               'cyan_white': [ 0.8784, 1.0000, 1.0000 ],  
+               'turquoise': [ 0.2510, 0.8784, 0.8157 ],  
+               'turquoise_dark': [ 0.0000, 0.8078, 0.8196 ],  
+               'turquoise_medium': [ 0.2824, 0.8196, 0.8000 ],  
+               'turquoise_pale': [ 0.6863, 0.9333, 0.9333 ],  
+               
+               #Blues
+               'alice_blue': [ 0.9412, 0.9725, 1.0000 ],  
+               'blue': [ 0.0000, 0.0000, 1.0000 ],  
+               'blue_light': [ 0.6784, 0.8471, 0.9020 ],  
+               'blue_medium': [ 0.0000, 0.0000, 0.8039 ],  
+               'cadet': [ 0.3725, 0.6196, 0.6275 ],  
+               'cobalt': [ 0.2400, 0.3500, 0.6700 ],  
+               'cornflower': [ 0.3922, 0.5843, 0.9294 ],  
+               'desatcornflower': [ 0.5138, 0.6098, 0.7835 ],  
+               'cerulean': [ 0.0200, 0.7200, 0.8000 ],  
+               'dodger_blue': [ 0.1176, 0.5647, 1.0000 ],  
+               'indigo': [ 0.0300, 0.1800, 0.3300 ],  
+               'manganese_blue': [ 0.0100, 0.6600, 0.6200 ],  
+               'midnight_blue': [ 0.0980, 0.0980, 0.4392 ],  
+               'navy': [ 0.0000, 0.0000, 0.5020 ],  
+               'peacock': [ 0.2000, 0.6300, 0.7900 ],  
+               'powder_blue': [ 0.6902, 0.8784, 0.9020 ],  
+               'royal_blue': [ 0.2549, 0.4118, 0.8824 ],  
+               'slate_blue': [ 0.4157, 0.3529, 0.8039 ],  
+               'slate_blue_dark': [ 0.2824, 0.2392, 0.5451 ],  
+               'slate_blue_light': [ 0.5176, 0.4392, 1.0000 ],  
+               'slate_blue_medium': [ 0.4824, 0.4078, 0.9333 ],  
+               'sky_blue': [ 0.5294, 0.8078, 0.9216 ],  
+               'sky_blue_deep': [ 0.0000, 0.7490, 1.0000 ],  
+               'sky_blue_light': [ 0.5294, 0.8078, 0.9804 ],  
+               'steel_blue': [ 0.2745, 0.5098, 0.7059 ],  
+               'steel_blue_light': [ 0.6902, 0.7686, 0.8706 ],  
+               'turquoise_blue': [ 0.0000, 0.7800, 0.5500 ],  
+               'ultramarine': [ 0.0700, 0.0400, 0.5600 ],  
+               
+               #Magentas
+               'blue_violet': [ 0.5412, 0.1686, 0.8863 ],  
+               'cobalt_violet_deep': [ 0.5700, 0.1300, 0.6200 ],  
+               'magenta': [ 1.0000, 0.0000, 1.0000 ],  
+               'orchid': [ 0.8549, 0.4392, 0.8392 ],  
+               'orchid_dark': [ 0.6000, 0.1961, 0.8000 ],  
+               'orchid_medium': [ 0.7294, 0.3333, 0.8275 ],  
+               'permanent_red_violet': [ 0.8600, 0.1500, 0.2700 ],  
+               'plum': [ 0.8667, 0.6275, 0.8667 ],  
+               'purple': [ 0.6275, 0.1255, 0.9412 ],  
+               'purple_medium': [ 0.5765, 0.4392, 0.8588 ],  
+               'ultramarine_violet': [ 0.3600, 0.1400, 0.4300 ],  
+               'violet': [ 0.5600, 0.3700, 0.6000 ],  
+               'violet_dark': [ 0.5804, 0.0000, 0.8275 ],  
+               'violet_red': [ 0.8157, 0.1255, 0.5647 ],  
+               'violet_red_medium': [ 0.7804, 0.0824, 0.5216 ],  
+               'violet_red_pale': [ 0.8588, 0.4392, 0.5765 ] }
+    @staticmethod
+    def get(name):
+        """ get(str) -> Color        
+        This is a static method returning a color with the
+        given name or black if name not found. Alpha channel is also
+        included
+        
+        """
+        if name in ColorByName.colors:
+            return ColorByName.colors[name] + [1.0]
+        else:
+            return [0.0, 0.0, 0.0, 1.0]
+
+    @staticmethod
+    def get_int(name):
+        """ get_int(str) -> Color in int range
+        Similar to get() but color ranges are from 0 to 255
+        
+        """
+        if name in ColorByName.colors:
+            return [int(ColorByName.colors[name][0]*255),
+                    int(ColorByName.colors[name][1]*255),
+                    int(ColorByName.colors[name][2]*255),
+                    255]
+        else:
+            return [0, 0, 0, 255]
+
+    @staticmethod
+    def get_no_alpha(name):
+        """ get_no_alpha(str) -> Color        
+        This is a static method returning a color with the given name
+        or black if name not found. Alpha channel is not included
+        
+        """
+        if name in ColorByName.colors:
+            return ColorByName.colors[name]+[] # to make copy
+        else:
+            return [0.0, 0.0, 0.0]
+
+    @staticmethod
+    def get_no_alpha_int(name):
+        """ get_no_alpha_int(str) -> Color in int range
+        Similar to get_no_alpha() but color ranges are from 0 to 255
+        
+        """
+        if name in ColorByName.colors:
+            return [int(ColorByName.colors[name][0]*255),
+                    int(ColorByName.colors[name][1]*255),
+                    int(ColorByName.colors[name][2]*255)]
+        else:
+            return [0, 0, 0]
+
+class ColorManipulator(object):
+    """
+    ColorManipulator is a class containing color-manipulation routines
+    
+    """
+    @staticmethod
+    def multiply(color, ratio):
+        """ multiply(color: list, ratio: float) -> Color        
+        This is a static method returning a color that has its RGB to
+        be only a ratio of color
+        
+        """
+        result = []
+        for i in xrange(len(color)):
+            if i<3:
+                result.append(color[i]*ratio)
+            else:
+                return result + color[3:]
+        return color
+
+################################################################################
+
+def rgb2hsv(rgb):
+    """Converts RGB to HSV.
+
+    Note that H may be None when S is 0 (for grey colors).
+    """
+    r, g, b = rgb
+    minimum = min(r, g, b)
+    maximum = max(r, g, b)
+
+    v = maximum
+
+    delta = maximum - minimum
+
+    if delta != 0:
+        s = delta / maximum
+    else:
+        # h is undefined
+        s = 0
+        h = None
+        return (h, s, v)
+
+    if r == maximum:
+        h = (g - b) / delta     # between yellow & magenta
+    elif g == maximum:
+        h = 2 + (b - r) / delta # between cyan & yellow
+    else:
+        h = 4 + (r - g) / delta # between magenta & cyan
+
+    h *= 60 # degrees
+
+    if h < 0:
+        h += 360
+
+    return (h, s, v)
+
+
+def hsv2rgb(hsv):
+    """Converts HSV to RGB.
+
+    Accepts H=None when S=0.
+    """
+    h, s, v = hsv
+
+    if s == 0:
+        return (v, v, v)
+
+    h /= 60
+    i = int(h)
+    f = h - i   # factorial part
+    p = v * (1 - s)
+    q = v * (1 - s * f)
+    t = v * (1 - s * (1 - f))
+
+    if i == 0:
+        return (v, t, p)
+    elif i == 1:
+        return (q, v, p)
+    elif i == 2:
+        return (p, v, t)
+    elif i == 3:
+        return (p, q, v)
+    elif i == 4:
+        return (t, p, v)
+    else: # i == 5
+        return (v, p, q)
+
+################################################################################
+
+import unittest
+
+class TestColorByName(unittest.TestCase):
+    """
+    A few simple tests to make sure ColorByName is working as expected
+    
+    """
+    def test_alpha_channel(self):
+        self.assertEquals(ColorByName.get('blue'),
+                          [0.0, 0.0, 1.0 , 1.0])
+        self.assertEquals(ColorByName.get_no_alpha('red'),
+                          [1.0, 0.0, 0.0])
+        self.assertEquals(ColorByName.get('not exist'),
+                          [0.0, 0.0, 0.0, 1.0]),        
+        self.assertEquals(ColorByName.get_no_alpha('another not exist'),
+                          [0.0, 0.0, 0.0]),
+
+
+class TestColorConversion(unittest.TestCase):
+    colors = [(0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 0.8, 0.3),
+              (0.9, 0.0, 0.6), (0.4, 0.4, 0.4), (1.0, 1.0, 1.0)]
+
+    def test_hsv_conversions(self):
+        for color in self.colors:
+            res = hsv2rgb(rgb2hsv(color))
+            for i in xrange(3):
+                self.assertAlmostEqual(color[i], res[i])
+
+    def test_hsv_with_qt(self):
+        try:
+            from PyQt4 import QtGui
+        except ImportError:
+            self.skipTest("QtGui not available")
+        for color in self.colors:
+            our_hsv = rgb2hsv(color)
+            qcolor = QtGui.QColor(*[int(color[i]*255) for i in xrange(3)])
+            qt_hsv = [qcolor.hueF(), qcolor.saturationF(), qcolor.valueF()]
+            if qt_hsv[0] == -1.0:
+                qt_hsv[0] = None
+            else:
+                self.assertAlmostEqual(our_hsv[0], qt_hsv[0] * 360.0,
+                                       delta=0.2)
+            self.assertAlmostEqual(our_hsv[1], qt_hsv[1], delta=0.005)
+            self.assertAlmostEqual(our_hsv[2], qt_hsv[2], delta=0.005)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/utils/enum.py b/vistrails/core/utils/enum.py
new file mode 100644
index 0000000..3ab79b0
--- /dev/null
+++ b/vistrails/core/utils/enum.py
@@ -0,0 +1,142 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""enum helps create enumeration classes.
+
+"""
+from itertools import izip
+
+def enum(className, enumValues, doc = None):
+    """enum(className: str, enumValues: [str], doc = None) -> class.
+    Creates a new enumeration class. For example:
+
+    >>> import enum
+    >>> Colors = enum.enum('Colors',
+                           ['Red', 'Green', 'Blue'],
+                           "Enumeration of primary colors")
+
+    will create a class that can be used as follows:
+
+    >>> x = Colors.Red
+    >>> y = Colors.Blue
+    >>> x == y
+    False
+    >>> z = Colors.REd
+    Traceback (most recent call last):
+      File "<stdin>", line 1, in ?
+    AttributeError: type object 'Colors' has no attribute 'REd'
+    >>> z = Colors.Red
+    >>> z == x
+    True
+    >>> x.__doc__
+    'Enumeration of primary colors'
+    
+    """                  
+    def __init__(self, v):
+        self.__v = v
+        
+    def str(v):
+        return the_enum.st[v]
+    
+    def __str__(self):
+        return the_enum.str(self.__v)
+    
+    def __repr__(self):
+        return className + "." + the_enum.str(self.__v)
+    
+    def __eq__(self, other):
+        try:
+            return (self.__v == other.__v and 
+                    self.__className == other.__className)
+        except AttributeError:
+            return False
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def from_str(v):
+        return the_enum(the_enum.st.index(v))
+
+    the_enum = type(className, (object, ),
+                   {'__init__': __init__,
+                    'str': staticmethod(str),
+                    'from_str': staticmethod(from_str),
+                    '__str__': __str__,
+                    '__repr__': __repr__,
+                    'st': enumValues,
+                    '__className': className,
+                    '__eq__': __eq__,
+                    '__ne__': __ne__,
+                    '__doc__': doc,
+                    '__hash__': lambda self: self.__v})
+    for (v, x) in izip(enumValues, xrange(len(enumValues))):
+        setattr(the_enum, v, the_enum(x))
+    return the_enum
+
+################################################################################
+
+import unittest
+
+class TestEnum(unittest.TestCase):
+
+    def test1(self):
+        e1 = enum('e1', ['v1', 'v2', 'v3'])
+        self.assertEquals(e1.v1, e1.v1)
+        self.assertEquals(e1.v2, e1.v2)
+        self.assertEquals(e1.v3, e1.v3)
+        self.assertNotEquals(e1.v1, e1.v2)
+        self.assertNotEquals(e1.v1, e1.v3)
+        self.assertNotEquals(e1.v2, e1.v3)
+        self.assertNotEquals(e1.v2, e1.v1)
+        self.assertNotEquals(e1.v3, e1.v1)
+        self.assertNotEquals(e1.v3, e1.v2)
+
+    def test2(self):
+        e1 = enum('e1', ['v1', 'v2', 'v3'])
+        e2 = enum('e1', ['v1', 'v2', 'v3'])
+        self.assertEquals(e1.v1, e2.v1)
+
+    def test3(self):
+        e1 = enum('e1', ['v1', 'v2', 'v3'])
+        self.assertNotEquals(e1.v1, 5)
+
+    def test4(self):
+        e2 = enum('e1', ['v1', 'v2', 'v3'])
+        x = e2.v2
+        import copy
+        y = copy.copy(x)
+        self.assertEquals(x, y)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/utils/expression.py b/vistrails/core/utils/expression.py
new file mode 100644
index 0000000..98b9bb4
--- /dev/null
+++ b/vistrails/core/utils/expression.py
@@ -0,0 +1,82 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" Helper functions for parsing and evaluating expressions """
+
+################################################################################
+
+def evaluate_expressions(expressions):
+    """ evaluate_expressions(expressions: str) -> int/float/string        
+    Evaluate the contents of the line edit inside each '$' pair
+    
+    """
+
+    # FIXME: eval should pretty much never be used
+    (base, exps) = parse_expression(str(expressions))
+    for e in exps:
+        try:                        
+            base = base[:e[0]] + unicode(eval(e[1],None,None)) + base[e[0]:]
+        except:
+            base = base[:e[0]] + '$' + e[1] + '$' + base[e[0]:]
+    return base
+
+def parse_expression(expression):
+    """ parse_expression(expression: str) -> output (see below)        
+    Parse the mixed expression string into expressions and string
+    constants
+
+    Keyword arguments:        
+    output - (simplified string, [(pos:exp),(pos:exp),...]
+        simplified string: the string without any '$exp$'. All
+        $$ will be replace by a single $.
+    (pos:exp) - the expression to be computed and where it should be
+        inserted back to the simplified string, starting from
+        the end of the string.
+
+    """
+    import re
+    output = expression
+    result = []
+    p = re.compile(r'\$[^$]+\$')
+    e = p.finditer(output)
+    if e:
+        offset = 0
+        for s in e:
+            exp = s.group()
+            result.append((s.span()[0]-offset, exp[1:len(exp)-1]))
+            offset += s.span()[1]-s.span()[0]
+        result.reverse()
+        output = p.sub('', output)
+        output.replace('$$','$')
+    return (output, result)
diff --git a/vistrails/core/utils/gcutils.py b/vistrails/core/utils/gcutils.py
new file mode 100644
index 0000000..172130c
--- /dev/null
+++ b/vistrails/core/utils/gcutils.py
@@ -0,0 +1,73 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Utilities for debugging garbage collection, leaked memory, etc."""
+
+import gc
+
+def get_objects_by_typename():
+    gc.collect()
+    x = {}
+    for obj in gc.get_objects():
+        t = type(obj).__name__
+        if t in x:
+            x[t].append(obj)
+        else:
+            x[t] = [obj]
+    return x
+
+def get_objects_by_livecount(obj_dict=None):
+    if not obj_dict:
+        obj_dict = get_objects_by_typename()
+    else:
+        gc.collect()
+    lst = [(len(val), k) for (k, val) in obj_dict.iteritems()]
+    lst.sort()
+    return lst
+
+def get_referrers(obj, path=None):
+    if not path:
+        path = []
+    referrers = gc.get_referrers(obj)
+    for edge in path:
+        referrers = gc.get_referrers(referrers[edge])
+    return referrers
+
+def count_object_by_name(name):
+    objects = get_objects_by_livecount()
+    for (count, oName) in objects:
+        if oName==name:
+            return count
+    return 0
diff --git a/vistrails/core/utils/lockmethod.py b/vistrails/core/utils/lockmethod.py
new file mode 100644
index 0000000..9006415
--- /dev/null
+++ b/vistrails/core/utils/lockmethod.py
@@ -0,0 +1,99 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+def lock_method(lock):
+    
+    def decorator(method):
+        def decorated(self, *args, **kwargs):
+            try:
+                lock.acquire()
+                result = method(self, *args, **kwargs)
+            finally:
+                lock.release()
+            return result
+        decorated.func_doc = method.__doc__
+        return decorated
+
+    return decorator
+
+##############################################################################
+
+import unittest
+import threading
+
+class TestLockMethod(unittest.TestCase):
+
+    lock = threading.Lock()
+    @lock_method(lock)
+    def foo(self):
+        self.assertEquals(self.lock.locked(), True)
+
+    @lock_method(lock)
+    def foo_throws(self):
+        raise Exception()
+
+    @lock_method(lock)
+    def foo_finally(self):
+        try:
+            raise Exception
+            return False
+        finally:
+            return True
+
+    @lock_method(lock)
+    def foo_docstring(self):
+        """FOO"""
+        pass
+
+    def test_common(self):
+        self.assertEquals(self.lock.locked(), False)
+        self.foo()
+        self.assertEquals(self.lock.locked(), False)
+
+    def test_throws(self):
+        self.assertEquals(self.lock.locked(), False)
+        self.assertRaises(Exception, self.foo_throws)
+        self.assertEquals(self.lock.locked(), False)
+
+    def test_finally(self):
+        self.assertEquals(self.lock.locked(), False)
+        self.assertEquals(self.foo_finally(), True)
+        self.assertEquals(self.lock.locked(), False)
+
+    def test_docstring(self):
+        self.assertEquals(self.foo_docstring.__doc__, "FOO")
+        
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/utils/timemethod.py b/vistrails/core/utils/timemethod.py
new file mode 100644
index 0000000..f43b8d4
--- /dev/null
+++ b/vistrails/core/utils/timemethod.py
@@ -0,0 +1,57 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Defines a time decorator that times function calls."""
+
+import time
+
+def time_method(method):
+    def decorated(self, *args, **kwargs):
+        t = time.time()
+        try:
+            return method(self, *args, **kwargs)
+        finally:
+            print time.time() - t
+    return decorated
+
+def time_call(callable_):
+    def decorated(*args, **kwargs):
+        t = time.time()
+        try:
+            return callable_(*args, **kwargs)
+        finally:
+            print time.time() - t
+    return decorated
+
+##############################################################################
diff --git a/vistrails/core/utils/tracemethod.py b/vistrails/core/utils/tracemethod.py
new file mode 100644
index 0000000..6054dbd
--- /dev/null
+++ b/vistrails/core/utils/tracemethod.py
@@ -0,0 +1,176 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Defines a trace decorator that traces function calls. This is not currently
+thread-safe. It won't crash, but the bump() printouts might not be correct.
+
+Also defines report_stack, a decorator that dumps the traceback whenever
+a method gets called."""
+import sys
+import traceback
+from vistrails.core.data_structures.stack import Stack
+
+import unittest
+import tempfile
+import os
+
+_output_file = sys.stderr
+
+__current_method_name = Stack()
+
+def _indent():
+    _output_file.write(' ' * (len(__current_method_name)-1))
+
+def trace_method_options(method,
+                         with_args=False,
+                         with_kwargs=False,
+                         with_return=False):
+    """trace_method_options is a method decorator that traces
+    entry-exit of functions. It also prints args, kwargs and return
+    values if optional parameters with_args, with_kwargs and
+    with_return are set to True."""
+    def decorated(self, *args, **kwargs):
+        __current_method_name.push([method.__name__, 0])
+        try:
+            _indent()
+            _output_file.write(method.__name__ +  ".enter")
+            if with_args:
+                _output_file.write(" (args: ")
+                _output_file.write(str([str(arg) for arg in args]))
+                _output_file.write(")")
+            if with_kwargs:
+                _output_file.write(" (kwargs: ")
+                kwarglist = [(k, str(v)) for (k,v) in kwargs.iteritems()]
+                kwarglist.sort()
+                _output_file.write(str(kwarglist))
+                _output_file.write(")")
+            _output_file.write('\n')
+            result = method(self, *args, **kwargs)
+            _indent()
+            _output_file.write(method.__name__ + ".exit")
+            if with_return:
+                _output_file.write(" (return: %s)" % str(result))
+            _output_file.write('\n')
+        finally:
+            __current_method_name.pop()
+        return result
+    return decorated
+
+def trace_method(method):
+    return trace_method_options(method)
+
+def trace_method_args(method):
+    return trace_method_options(method, with_args=True)
+
+def bump_trace():
+    __current_method_name.top()[1] += 1
+    _indent()
+    _output_file.write('%s.%s\n' % tuple(__current_method_name.top()))
+
+def report_stack(method):
+    def decorated(self, *args, **kwargs):
+        print "-" * 78
+        try:
+            print "Method: " + method.im_class.__name__ + '.' + method.__name__
+        except:
+            pass
+        try:
+            print "Function: " + method.func_name
+        except:
+            pass
+        traceback.print_stack()
+        print "-" * 78
+        return method(self, *args, **kwargs)
+    return decorated
+        
+###############################################################################
+
+
+ at trace_method
+def test_fun(p1):
+    return p1 + 5
+
+ at trace_method
+def test_fun_2(p1):
+    bump_trace()
+    result = test_fun(p1) + 3
+    bump_trace()
+    return result
+
+class TestTraceMethod(unittest.TestCase):
+
+    def test_trace_1(self):
+        global _output_file
+        (fd, name) = tempfile.mkstemp()
+        os.close(fd)
+        try:
+            _output_file = open(name, 'w')
+
+            x = test_fun(10)
+            self.assertEquals(x, 15)
+
+            _output_file.close()
+            _output_file = sys.stderr
+
+            output = "".join(open(name, 'r').readlines())
+            self.assertEquals(output,
+                              'test_fun.enter\n' +
+                              'test_fun.exit\n')
+        finally:
+            os.unlink(name)
+
+    def test_trace_2(self):
+        global _output_file
+        (fd, name) = tempfile.mkstemp()
+        os.close(fd)
+        _output_file = open(name, 'w')
+
+        x = test_fun_2(10)
+        self.assertEquals(x, 18)
+        
+        _output_file.close()
+        _output_file = sys.stderr
+
+        output = "".join(open(name, 'r').readlines())
+        self.assertEquals(output,
+                          'test_fun_2.enter\n' +
+                          'test_fun_2.1\n' +
+                          ' test_fun.enter\n' +
+                          ' test_fun.exit\n' +
+                          'test_fun_2.2\n' +
+                          'test_fun_2.exit\n')
+        os.unlink(name)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/utils/uxml.py b/vistrails/core/utils/uxml.py
new file mode 100644
index 0000000..3d93a38
--- /dev/null
+++ b/vistrails/core/utils/uxml.py
@@ -0,0 +1,246 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.dom import minidom
+import xml.parsers.expat
+import __builtin__
+
+def eval_xml_value(node):
+    """eval_xml_value(node) -> value
+
+       evaluates an xml node as the following examples:
+
+       <str value='foo'/> -> 'foo'
+       <int value='3'/> -> 3
+       <float value='3.141592'> -> 3.141592
+       <bool value='False'> -> False
+    """
+    
+    key_name = node.nodeName
+    type_ = getattr(__builtin__, key_name)
+    str_value = str(node.attributes['value'].value)
+
+    # Tricky case bool('False') == True
+    if type_ == bool:
+        if str_value == 'True':
+            return True
+        elif str_value == 'False':
+            return False
+        else:
+            raise ValueError("eval_xml_value: Bogus bool value '%s'" % str_value)
+    return type_(str_value)
+
+def quote_xml_value(dom, value):
+    """quote_xml_value(dom, value) -> value
+
+       quotes a value as an xml node so that
+       eval_xml_value(quote_xml_value(dom, value)) == value
+
+       <str value='foo'/> <- 'foo'
+       <int value='3'/> <- 3
+       <float value='3.141592'> <- 3.141592
+       <bool value='False'> <- False
+    """
+
+    el = dom.createElement(type(value).__name__)
+    el.setAttribute('value', str(value))
+    return el
+
+def named_elements(element, elname):
+    """named_elements(element, elname) -> Node 
+    Helper function that iterates over the element child Nodes searching
+    for node with name elname.
+
+    """
+    for node in element.childNodes:
+        if node.nodeName == elname:
+            yield node
+
+def enter_named_element(element, elname):
+    """enter_named_element(element, elname) -> Node 
+    Returns first child of element with name elname
+
+    """
+    for node in named_elements(element, elname):
+        return node
+    return None
+
+def elements_filter(element, element_predicate):
+    """elements_filter(element, element_predicate) -> Node iterator
+    Helper function that iterates over the element child Nodes searching
+    for nodes that pass element_predicate, that is, node for which
+
+    element_predicate(node) == True
+
+    """
+    for node in element.childNodes:
+        if element_predicate(node):
+            yield node
+
+class XMLWrapper(object):
+    """Helper to parse a general XML file. It provides functions to open and 
+    close files.
+    It must be subclassed to parse specifi files. """
+
+    class XMLParseError(Exception):
+
+       
+        def __init__(self, line, char, code):
+            self._line = line
+            self._char = char
+            self._code = code
+            
+        def __str__(self):
+            return ("XML Parse error at line %s, col %s: %s" %
+                    (self._line,
+                     self._char,
+                     xml.parsers.expat.ErrorString(self._code)))
+
+    def open_file(self, filename):
+        """open_file(filename: str) -> None 
+        Parses an XML file.
+
+        """
+        self.filename = filename
+        try:
+            self.dom = minidom.parse(filename)
+        except xml.parsers.expat.ExpatError, e:
+            raise self.XMLParseError(e.lineno, e.offset, e.code) 
+
+    def create_document_from_string(self, text):
+        """parse_string(text:str) -> dom
+        Parses an xml string and returns the DOM object
+
+        """
+        try:
+            dom = minidom.parseString(text)
+        except xml.parsers.expat.ExpatError, e:
+            raise self.XMLParseError(e.lineno, e.offset, e.code)
+        return dom
+    
+    def close_file(self):
+        """close_file() -> None 
+        Removes the association with the XML file loaded by open_file 
+        method. 
+
+        """
+        if self.dom:
+            self.dom.unlink()
+        self.filename = None
+        self.dom = None
+    
+    def create_document(self, nodename):
+        """create_document(nodename: str) -> xml element 
+        Creates a documentElement 
+        
+        """
+        impl = minidom.getDOMImplementation()
+        dom = impl.createDocument(None, nodename, None)
+        return dom
+
+    def write_document(self, root, filename):
+        """write_document(root:xml element, filename: str) -> None
+        Save as an XML file 
+        
+        """
+        output_file = open(filename,'w')
+        root.writexml(output_file, "  ", "  ", '\n')
+        output_file.close()
+
+    def __str__(self):
+        """ __str__() -> str 
+        Returns the XML that self.dom represents as a string 
+        
+        """
+        return self.dom.toprettyxml()
+
+################################################################################
+# Testing
+
+import unittest
+
+class TestXmlUtils(unittest.TestCase):
+    def test_named_elements(self):
+        """ Exercises searching for elements """
+        xmlStr = """<root> 
+                        <child>
+                            <grandchild></grandchild>
+                            <grandchild></grandchild>
+                         </child>
+                         <child></child>
+                     </root>"""
+        dom = minidom.parseString(xmlStr)
+        root = dom.documentElement
+        childcount = 0
+        for node in named_elements(root,'child'):
+            childcount += 1
+        self.assertEquals(childcount,2)
+        
+        grandchildcount = 0
+        for node in named_elements(root,'grandchild'):
+            grandchildcount += 1
+        self.assertEquals(grandchildcount,0)
+
+    def test_eval_quote(self):
+        xmlStr = """<root> 
+                        <child>
+                            <grandchild></grandchild>
+                            <grandchild></grandchild>
+                         </child>
+                         <child></child>
+                     </root>"""
+        dom = minidom.parseString(xmlStr)
+        def do_it_1(v):
+            q = quote_xml_value(dom, v)
+            v2 = eval_xml_value(q)
+            self.assertEquals(v, v2)
+        def do_it_2(q):
+            q = minidom.parseString(q).documentElement
+            v = eval_xml_value(q)
+            self.assertEquals(q.toxml(), quote_xml_value(dom, v).toxml())
+        do_it_1(2)
+        do_it_1(3.0)
+        do_it_1(False)
+        do_it_1(True)
+        do_it_1('Foobar')
+        do_it_1('with<brackets>')
+
+        do_it_2('<str value="Foo"/>')
+        do_it_2('<bool value="False"/>')
+        do_it_2('<bool value="True"/>')
+        do_it_2('<int value="3"/>')
+        do_it_2('<float value="4.0"/>')
+        
+if __name__ == "__main__":
+    unittest.main()
diff --git a/vistrails/core/vistrail/__init__.py b/vistrails/core/vistrail/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/core/vistrail/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/core/vistrail/abstraction.py b/vistrails/core/vistrail/abstraction.py
new file mode 100644
index 0000000..d0faf55
--- /dev/null
+++ b/vistrails/core/vistrail/abstraction.py
@@ -0,0 +1,198 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+
+from vistrails.core.modules.module_registry import get_module_registry
+import vistrails.core.modules.sub_module 
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.db.domain import DBAbstraction
+
+import unittest
+
+class Abstraction(DBAbstraction, Module):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBAbstraction.__init__(self, *args, **kwargs)
+        if self.cache is None:
+            self.cache = 1
+        if self.id is None:
+            self.id = -1
+        if self.location is None:
+            self.location = Location(x=-1.0, y=-1.0)
+        if self.name is None:
+            self.name = ''
+        if self.package is None:
+            self.package = ''
+        if self.version is None:
+            self.version = ''
+        self.set_defaults()
+
+    def set_defaults(self, other=None):
+        Module.set_defaults(self, other)
+        self._is_latest_version = True
+        self.check_latest_version()
+        # if other is None:
+        #     self._is_latest_version = True
+        # else:
+        #     self._is_latest_version = other._is_latest_version
+
+    def setup_indices(self):
+        pass
+
+    def __copy__(self):
+        return Abstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Abstraction
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_abstraction):
+        if _abstraction.__class__ == Abstraction:
+            return
+        _abstraction.__class__ = Abstraction
+        if _abstraction.db_location:
+            Location.convert(_abstraction.db_location)
+        for _function in _abstraction.db_functions:
+            ModuleFunction.convert(_function)
+        for _annotation in _abstraction.db_get_annotations():
+            Annotation.convert(_annotation)
+        _abstraction.set_defaults()
+
+    ##########################################################################
+    # Properties
+    
+    # We need to repeat these here because Module uses DBModule. ...
+    id = DBAbstraction.db_id
+    cache = DBAbstraction.db_cache
+    annotations = DBAbstraction.db_annotations
+    location = DBAbstraction.db_location
+    center = DBAbstraction.db_location
+    name = DBAbstraction.db_name
+    label = DBAbstraction.db_name
+    namespace = DBAbstraction.db_namespace
+    package = DBAbstraction.db_package
+    version = DBAbstraction.db_version
+    internal_version = DBAbstraction.db_internal_version
+
+    def is_abstraction(self):
+        return True
+
+    def check_latest_version(self):
+        reg = get_module_registry()
+        try:
+            desc = reg.get_descriptor_by_name(self.package, self.name, 
+                                              self.namespace)
+        except:
+            # Should only get here if the abstraction's descriptor was
+            # removed from the registry which only happens when the
+            # abstraction should be destroyed.
+            self._is_latest_version = False
+            return
+        latest_version = desc.module.vistrail.get_latest_version()
+        self._is_latest_version = \
+            (long(latest_version) == long(self.internal_version))
+
+    def is_latest_version(self):
+        return self._is_latest_version
+
+    def _get_pipeline(self):
+        return self.module_descriptor.module.pipeline
+    pipeline = property(_get_pipeline)
+
+    def _get_vistrail(self):
+        return self.module_descriptor.module.vistrail
+    vistrail = property(_get_vistrail)
+
+    # override db-mirrored accesses in Module
+    port_specs = {}
+    port_spec_list = []
+    _input_port_specs = []
+    _output_port_specs = []
+
+    def has_portSpec_with_name(self, name):
+        return False
+    def get_portSpec_by_name(self, name):
+        return None
+    def add_port_spec(self, port_spec):
+        raise VistrailsInternalError("Cannot add port spec to abstraction")
+    def delete_port_spec(self, port_spec):
+        raise VistrailsInternalError("Cannot delete port spec from abstraction")
+
+    ##########################################################################
+
+    def get_port_spec_info(self, module):
+        return vistrails.core.modules.sub_module.get_port_spec_info(self.pipeline, 
+                                                          module)
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an Abstraction
+        object. 
+
+        """
+#        rep = '<abstraction id="%s" name="%s">' + \
+#             '<actions>%s</actions>' + \
+#             '<tags>%s</tags>' + \
+#             '</abstraction>'
+#         return  rep % (str(self.id), str(self.name), 
+#                        [str(a) for a in self.action_list],
+#                        [str(t) for t in self.tag_list])
+        rep = '<abstraction id="%s" name="%s"/>'
+        return rep % (str(self.id), str(self.name))
+
+    def __eq__(self, other):
+        """ __eq__(other: Abstraction) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
diff --git a/vistrails/core/vistrail/action.py b/vistrails/core/vistrail/action.py
new file mode 100644
index 0000000..565e2bb
--- /dev/null
+++ b/vistrails/core/vistrail/action.py
@@ -0,0 +1,280 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.operation import AddOp, ChangeOp, DeleteOp
+from vistrails.db.domain import DBAction
+from itertools import izip
+
+import unittest
+import vistrails.core
+
+class Action(DBAction):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBAction.__init__(self, *args, **kwargs)
+        if self.timestep is None:
+            self.timestep = -1
+        if self.parent is None:
+            self.parent = -1
+        if self.user is None:
+            self.user = ''
+        if self.expand is None:
+            self.expand = 0
+
+    def __copy__(self):
+        return Action.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Action
+        return cp
+    
+    ##########################################################################
+    # Constants
+
+    ANNOTATION_DESCRIPTION = '__description__'
+    ANNOTATION_ANALOGY_INFO = '__analogy_info__'
+
+    ##########################################################################
+    # Properties
+
+    id = DBAction.db_id
+    timestep = DBAction.db_id
+    parent = DBAction.db_prevId
+    prevId = DBAction.db_prevId
+    session = DBAction.db_session
+    user = DBAction.db_user
+    expand = 0
+    annotations = DBAction.db_annotations
+    operations = DBAction.db_operations
+
+    def _get_date(self):
+        if self.db_date is not None:
+            return self.db_date.strftime('%d %b %Y %H:%M:%S')
+        return datetime(1900,1,1).strftime('%d %b %Y %H:%M:%S')
+
+    def _set_date(self, date):
+        if isinstance(date, datetime):
+            self.db_date = date
+        elif isinstance(date, basestring) and date.strip() != '':
+            newDate = datetime(*strptime(date, '%d %b %Y %H:%M:%S')[0:6])
+            self.db_date = newDate
+    date = property(_get_date, _set_date)
+
+    def has_annotation_with_key(self, key):
+        return self.db_has_annotation_with_key(key)
+    def get_annotation_by_key(self, key):
+        return self.db_get_annotation_by_key(key)
+    def add_annotation(self, annotation):
+        self.db_add_annotation(annotation)
+    def delete_annotation(self, annotation):
+        self.db_delete_annotation(annotation)
+
+    def _get_description(self):
+        if self.db_has_annotation_with_key(self.ANNOTATION_DESCRIPTION):
+            return \
+                self.db_get_annotation_by_key(self.ANNOTATION_DESCRIPTION).value
+        return None
+    description = property(_get_description)
+
+    def _get_analogy_info(self):
+        if self.db_has_annotation_with_key(self.ANNOTATION_ANALOGY_INFO):
+            ann = self.db_get_annotation_by_key(self.ANNOTATION_ANALOGY_INFO)
+            return ann.value
+        return None
+    analogy_info = property(_get_analogy_info)
+
+    def add_operation(self, operation):
+        self.db_operations.db_add_operation(operation)
+
+    ##########################################################################
+    # DB Conversion
+    
+    @staticmethod
+    def convert(_action):
+        if _action.__class__ == Action:
+            return
+        _action.__class__ = Action
+        for _annotation in _action.annotations:
+            Annotation.convert(_annotation)
+        for _operation in _action.operations:
+            if _operation.vtType == 'add':
+                AddOp.convert(_operation)
+            elif _operation.vtType == 'change':
+                ChangeOp.convert(_operation)
+            elif _operation.vtType == 'delete':
+                DeleteOp.convert(_operation)
+            else:
+                raise TypeError("Unknown operation type '%s'" %
+                                _operation.vtType)
+            
+    ##########################################################################
+    # Operators
+
+    def __eq__(self, other):
+        """ __eq__(other: Module) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if len(self.annotations) != len(other.annotations):
+            return False
+        if len(self.operations) != len(other.operations):
+            return False
+        for f,g in zip(self.annotations, other.annotations):
+            if f != g:
+                return False
+        for f,g in zip(self.operations, other.operations):
+            if f != g:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+    def __str__(self):
+        """__str__() -> str 
+        Returns a string representation of an action object.
+
+        """
+        msg = "<<type='%s' timestep='%s' parent='%s' date='%s'" + \
+            "user='%s'>>"
+        return msg % (type(self),
+                      self.timestep,
+                      self.parent,
+                      self.date,
+                      self.user)
+
+################################################################################
+# Unit tests
+
+class TestAction(unittest.TestCase):
+    
+    def create_action(self, id_scope=None):
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+        from vistrails.core.vistrail.action import Action
+        from vistrails.core.vistrail.module import Module
+        from vistrails.core.vistrail.module_function import ModuleFunction
+        from vistrails.core.vistrail.module_param import ModuleParam
+        from vistrails.core.vistrail.operation import AddOp
+        from vistrails.db.domain import IdScope
+        from datetime import datetime
+        
+        if id_scope is None:
+            id_scope = IdScope()
+        param = ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                            type='Integer',
+                            val='1')
+        function = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                  name='value',
+                                  parameters=[param])
+        m = Module(id=id_scope.getNewId(Module.vtType),
+                   name='Float',
+                   package=basic_pkg,
+                   functions=[function])
+
+        add_op = AddOp(id=id_scope.getNewId('operation'),
+                       what='module',
+                       objectId=m.id,
+                       data=m)
+        action = Action(id=id_scope.getNewId(Action.vtType),
+                        prevId=0,
+                        date=datetime(2007,11,18),
+                        operations=[add_op])
+        return action
+
+    def test_copy(self):
+        import copy
+        from vistrails.db.domain import IdScope
+        
+        id_scope = IdScope()
+        a1 = self.create_action(id_scope)
+        a2 = copy.copy(a1)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+        a3 = a1.do_copy(True, id_scope, {})
+        self.assertEquals(a1, a3)
+        self.assertNotEquals(a1.id, a3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        a1 = self.create_action()
+        xml_str = vistrails.core.db.io.serialize(a1)
+        a2 = vistrails.core.db.io.unserialize(xml_str, Action)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+
+    def test1(self):
+        """Exercises aliasing on modules"""
+        import vistrails.core.vistrail
+        from vistrails.core.db.locator import XMLFileLocator
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        p1 = v.getPipeline('final')
+        p2 = v.getPipeline('final')
+        self.assertEquals(len(p1.modules), len(p2.modules))
+        for k in p1.modules.keys():
+            if p1.modules[k] is p2.modules[k]:
+                self.fail("didn't expect aliases in two different pipelines")
+
+    def test2(self):
+        """Exercises aliasing on points"""
+        import vistrails.core.vistrail
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                            '/tests/resources/dummy.xml').load()
+        p1 = v.getPipeline('final')
+        v.getPipeline('final')
+        p2 = v.getPipeline('final')
+        m1s = p1.modules.items()
+        m2s = p2.modules.items()
+        m1s.sort()
+        m2s.sort()
+        for ((i1,m1),(i2,m2)) in izip(m1s, m2s):
+            self.assertEquals(m1.center.x, m2.center.x)
+            self.assertEquals(m1.center.y, m2.center.y)
+            
+if __name__ == '__main__':
+    unittest.main() 
diff --git a/vistrails/core/vistrail/action_annotation.py b/vistrails/core/vistrail/action_annotation.py
new file mode 100644
index 0000000..782c51e
--- /dev/null
+++ b/vistrails/core/vistrail/action_annotation.py
@@ -0,0 +1,144 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBActionAnnotation
+
+import unittest
+import copy
+import vistrails.core
+
+class ActionAnnotation(DBActionAnnotation):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBActionAnnotation.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = -1
+        
+    def __copy__(self):
+        return ActionAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBActionAnnotation.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ActionAnnotation
+        return cp
+
+    @staticmethod
+    def convert(_annotation):
+        _annotation.__class__ = ActionAnnotation
+
+    ##########################################################################
+    # Properties
+
+    id = DBActionAnnotation.db_id
+    key = DBActionAnnotation.db_key
+    value = DBActionAnnotation.db_value
+    action_id = DBActionAnnotation.db_action_id
+    date = DBActionAnnotation.db_date
+    user = DBActionAnnotation.db_user
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an
+        ActionAnnotation object.
+
+        """
+        rep = ("<actionAnnotation id=%s action_id=%s key=%s value=%s "
+               "date=%s user=%s</annotation>")
+        return  rep % (str(self.id), str(self.action_id), str(self.key), 
+                       str(self.value), str(self.date), str(self.user))
+
+    def __eq__(self, other):
+        """ __eq__(other: ActionAnnotation) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.key != other.key:
+            return False
+        if self.value != other.value:
+            return False
+        if self.action_id != other.action_id:
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+################################################################################
+# Unit tests
+
+
+class TestActionAnnotation(unittest.TestCase):
+
+    def create_annotation(self, id_scope=None):
+        from vistrails.db.domain import IdScope
+
+        if id_scope is None:
+            id_scope = IdScope()
+        annotation = \
+            ActionAnnotation(id=id_scope.getNewId(ActionAnnotation.vtType),
+                             key='akey', action_id=1L,
+                             value='some value', user='test')
+        return annotation
+
+    def test_copy(self):
+        from vistrails.db.domain import IdScope
+        id_scope = IdScope()
+
+        a1 = self.create_annotation(id_scope)
+        a2 = copy.copy(a1)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+        a3 = a1.do_copy(True, id_scope, {})
+        self.assertEquals(a1, a3)
+        self.assertNotEquals(a1.id, a3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        a1 = self.create_annotation()
+        xml_str = vistrails.core.db.io.serialize(a1)
+        a2 = vistrails.core.db.io.unserialize(xml_str, ActionAnnotation)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+
+    def test_str(self):
+        a1 = self.create_annotation()
+        str(a1)
diff --git a/vistrails/core/vistrail/annotation.py b/vistrails/core/vistrail/annotation.py
new file mode 100644
index 0000000..6b38855
--- /dev/null
+++ b/vistrails/core/vistrail/annotation.py
@@ -0,0 +1,136 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBAnnotation
+
+import unittest
+import copy
+import vistrails.core
+
+class Annotation(DBAnnotation):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBAnnotation.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = -1
+        
+    def __copy__(self):
+        return Annotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Annotation
+        return cp
+
+    @staticmethod
+    def convert(_annotation):
+        _annotation.__class__ = Annotation
+
+    ##########################################################################
+    # Properties
+
+    id = DBAnnotation.db_id
+    key = DBAnnotation.db_key
+    value = DBAnnotation.db_value
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an Annotation
+        object. 
+
+        """
+        rep = "<annotation id=%s key=%s value=%s</annotation>"
+        return  rep % (str(self.id), str(self.key), str(self.value))
+
+    def __eq__(self, other):
+        """ __eq__(other: Annotation) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.key != other.key:
+            return False
+        if self.value != other.value:
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+################################################################################
+# Unit tests
+
+
+class TestAnnotation(unittest.TestCase):
+
+    def create_annotation(self, id_scope=None):
+        from vistrails.db.domain import IdScope
+
+        if id_scope is None:
+            id_scope = IdScope()
+        annotation = Annotation(id=id_scope.getNewId(Annotation.vtType),
+                                key='akey %s',
+                                value='some value %s')
+        return annotation
+
+    def test_copy(self):
+        from vistrails.db.domain import IdScope
+        id_scope = IdScope()
+
+        a1 = self.create_annotation(id_scope)
+        a2 = copy.copy(a1)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+        a3 = a1.do_copy(True, id_scope, {})
+        self.assertEquals(a1, a3)
+        self.assertNotEquals(a1.id, a3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        a1 = self.create_annotation()
+        xml_str = vistrails.core.db.io.serialize(a1)
+        a2 = vistrails.core.db.io.unserialize(xml_str, Annotation)
+        self.assertEquals(a1, a2)
+        self.assertEquals(a1.id, a2.id)
+
+    def test_str(self):
+        a1 = self.create_annotation()
+        str(a1)
diff --git a/vistrails/core/vistrail/connection.py b/vistrails/core/vistrail/connection.py
new file mode 100644
index 0000000..8d93bf2
--- /dev/null
+++ b/vistrails/core/vistrail/connection.py
@@ -0,0 +1,408 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.configuration import get_vistrails_configuration
+""" This python module defines Connection class.
+"""
+import copy
+from vistrails.db.domain import DBConnection
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.vistrails_module import ModuleConnector
+from vistrails.core.vistrail.port import PortEndPoint, Port
+
+import unittest
+from vistrails.db.domain import IdScope
+
+################################################################################
+
+Variant_desc = None
+InputPort_desc = None
+
+def moduleConnection(conn):
+    """moduleConnection(conn)-> function
+    Returns a function to build a module connection
+
+    """
+    def theFunction(src, dst):
+        global Variant_desc, InputPort_desc
+        if Variant_desc is None:
+            reg = get_module_registry()
+            Variant_desc = reg.get_descriptor_by_name(
+                    'org.vistrails.vistrails.basic', 'Variant')
+            InputPort_desc = reg.get_descriptor_by_name(
+                    'org.vistrails.vistrails.basic', 'InputPort')
+
+        iport = conn.destination.name
+        oport = conn.source.name
+        src.enableOutputPort(oport)
+        conf = get_vistrails_configuration()
+        error_on_others = getattr(conf, 'errorOnConnectionTypeerror')
+        error_on_variant = (error_on_others or
+                            getattr(conf, 'errorOnVariantTypeerror'))
+        errors = [error_on_others, error_on_variant]
+        if isinstance(src, InputPort_desc.module):
+            typecheck = [False]
+        else:
+            typecheck = [errors[desc is Variant_desc]
+                         for desc in conn.source.spec.descriptors()]
+        dst.set_input_port(
+                iport,
+                ModuleConnector(src, oport, conn.destination.spec, typecheck))
+    return theFunction
+
+################################################################################
+
+class Connection(DBConnection):
+    """ A Connection is a connection between two modules.
+    Right now there's only Module connections.
+
+    """
+
+    ##########################################################################
+    # Constructors and copy
+    
+    @staticmethod
+    def from_port_specs(source, dest):
+        """from_port_specs(source: PortSpec, dest: PortSpec) -> Connection
+        Static method that creates a Connection given source and 
+        destination ports.
+
+        """
+        conn = Connection()
+        conn.source = copy.copy(source)
+        conn.destination = copy.copy(dest)
+        return conn
+        
+    @staticmethod
+    def fromID(id):
+        """fromTypeID(id: int) -> Connection
+        Static method that creates a Connection given an id.
+
+        """
+        conn = Connection()
+        conn.id = id
+        conn.source.endPoint = PortEndPoint.Source
+        conn.destination.endPoint = PortEndPoint.Destination
+        return conn
+    
+    def __init__(self, *args, **kwargs):
+        """__init__() -> Connection 
+        Initializes source and destination ports.
+        
+        """
+        DBConnection.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.db_id = -1
+        if not len(self.ports) > 0:
+            self.source = Port(type='source')
+            self.destination = Port(type='destination')
+#             self.source.endPoint = PortEndPoint.Source
+#             self.destination.endPoint = PortEndPoint.Destination
+        self.makeConnection = moduleConnection(self)
+
+    def __copy__(self):
+        """__copy__() -> Connection -  Returns a clone of self.
+        
+        """
+        return Connection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Connection
+        cp.makeConnection = moduleConnection(cp)
+        for port in cp.ports:
+            Port.convert(port)
+        return cp
+
+    ##########################################################################
+
+    @staticmethod
+    def convert(_connection):
+#        print "ports: %s" % _Connection._get_ports(_connection)
+        if _connection.__class__ == Connection:
+            return
+        _connection.__class__ = Connection
+
+        for port in _connection.ports:
+            Port.convert(port)
+
+#         _connection.sourceInfo = \
+#             (_connection.source.moduleName, _connection.source.sig)
+#         _connection.destinationInfo = \
+#             (_connection.destination.moduleName, _connection.destination.sig)
+# #        print _connection.sourceInfo
+# #        print _connection.destinationInfo
+#         portFromRepresentation = registry.portFromRepresentation
+#         newSource = \
+#             portFromRepresentation(_connection.source.moduleName, 
+#                                    _connection.source.sig,
+#                                    PortEndPoint.Source, None, True)
+#         newDestination = \
+#             portFromRepresentation(_connection.destination.moduleName,
+#                                    _connection.destination.sig,
+#                                    PortEndPoint.Destination, None, True)
+#         newSource.moduleId = _connection.source.moduleId
+#         newDestination.moduleId = _connection.destination.moduleId
+#         _connection.source = newSource
+#         _connection.destination = newDestination
+        _connection.makeConnection = moduleConnection(_connection)
+
+
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(other) != type(self):
+            print "Type mismatch"
+            return
+        if self.__source != other.__source:
+            print "Source mismatch"
+            self.__source.show_comparison(other.__source)
+            return
+        if self.__dest != other.__dest:
+            print "Dest mismatch"
+            self.__dest.show_comparison(other.__dest)
+            return
+        print "no difference found"
+        assert self == other
+
+    ##########################################################################
+    # Properties
+
+    id = DBConnection.db_id
+    ports = DBConnection.db_ports
+    
+    def add_port(self, port):
+        self.db_add_port(port)
+
+    def _get_sourceId(self):
+        """ _get_sourceId() -> int
+        Returns the module id of source port. Do not use this function, 
+        use sourceId property: c.sourceId 
+
+        """
+        return self.source.moduleId
+
+    def _set_sourceId(self, id):
+        """ _set_sourceId(id : int) -> None 
+        Sets this connection source id. It updates both self.__source.moduleId
+        and self.__source.id. Do not use this function, use sourceId 
+        property: c.sourceId = id
+
+        """
+        self.source.moduleId = id
+        self.source.id = id
+    sourceId = property(_get_sourceId, _set_sourceId)
+
+    def _get_destinationId(self):
+        """ _get_destinationId() -> int
+        Returns the module id of dest port. Do not use this function, 
+        use sourceId property: c.destinationId 
+
+        """
+        return self.destination.moduleId
+
+    def _set_destinationId(self, id):
+        """ _set_destinationId(id : int) -> None 
+        Sets this connection destination id. It updates self.__dest.moduleId. 
+        Do not use this function, use destinationId property: 
+        c.destinationId = id
+
+        """
+        self.destination.moduleId = id
+    destinationId = property(_get_destinationId, _set_destinationId)
+
+    def _get_type(self):
+        """_get_type() -> VistrailModuleType - Returns this connection type.
+        Do not use this function, use type property: c.type = t 
+
+        """
+        return self.source.type
+
+    def _set_type(self, t):
+        """ _set_type(t: VistrailModuleType) -> None 
+        Sets this connection type and updates self.__source.type and 
+        self.__dest.type. It also updates the correct makeConnection function.
+        Do not use this function, use type property: c.type = t
+
+        """
+        self.source.type = t
+        self.destination.type = t
+        self.updateMakeConnection()
+    type = property(_get_type, _set_type)
+
+    def _get_source(self):
+        """_get_source() -> Port
+        Returns source port. Do not use this function, use source property: 
+        c.source 
+
+        """
+        try:
+            return self.db_get_port_by_type('source')
+        except KeyError:
+            pass
+        return None
+
+    def _set_source(self, source):
+        """_set_source(source: Port) -> None 
+        Sets this connection source port. It also updates this connection 
+        makeConnection function. Do not use this function, use source 
+        property instead: c.source = source
+
+        """
+        try:
+            port = self.db_get_port_by_type('source')
+            self.db_delete_port(port)
+        except KeyError:
+            pass
+        if source is not None:
+            self.db_add_port(source)
+    source = property(_get_source, _set_source)
+
+    def _get_destination(self):
+        """_get_destination() -> Port
+        Returns destination port. Do not use this function, use destination
+        property: c.destination 
+
+        """
+#        return self.db_ports['destination']
+        try:
+            return self.db_get_port_by_type('destination')
+        except KeyError:
+            pass
+        return None
+
+    def _set_destination(self, dest):
+        """_set_destination(dest: Port) -> None 
+        Sets this connection destination port. It also updates this connection 
+        makeConnection function. Do not use this function, use destination 
+        property instead: c.destination = dest
+
+        """
+        try:
+            port = self.db_get_port_by_type('destination')
+            self.db_delete_port(port)
+        except KeyError:
+            pass
+        if dest is not None:
+            self.db_add_port(dest)
+    destination = property(_get_destination, _set_destination)
+    dest = property(_get_destination, _set_destination)
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of a Connection
+        object. 
+
+        """
+        rep = "<connection id='%s'>%s%s</connection>"
+        return  rep % (str(self.id), str(self.source), str(self.destination))
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        return (self.source == other.source and
+                self.dest == other.dest)
+
+    def equals_no_id(self, other):
+        """Checks equality up to ids (connection and ports)."""
+        if type(self) != type(other):
+            return False
+        return (self.source.equals_no_id(other.source) and
+                self.dest.equals_no_id(other.dest))
+    
+################################################################################
+# Testing
+
+
+class TestConnection(unittest.TestCase):
+
+    def create_connection(self, id_scope=IdScope()):
+        from vistrails.core.vistrail.port import Port
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+        source = Port(id=id_scope.getNewId(Port.vtType),
+                      type='source', 
+                      moduleId=21L, 
+                      moduleName='String', 
+                      name='value',
+                      signature='(%s:String)' % basic_pkg)
+        destination = Port(id=id_scope.getNewId(Port.vtType),
+                           type='destination',
+                           moduleId=20L,
+                           moduleName='Float',
+                           name='value',
+                           signature='(%s:Float)' % basic_pkg)
+        connection = Connection(id=id_scope.getNewId(Connection.vtType),
+                                ports=[source, destination])
+        return connection
+
+    def test_copy(self):
+        id_scope = IdScope()
+        
+        c1 = self.create_connection(id_scope)
+        c2 = copy.copy(c1)
+        self.assertEquals(c1, c2)
+        self.assertEquals(c1.id, c2.id)
+        c3 = c1.do_copy(True, id_scope, {})
+        self.assertEquals(c1, c3)
+        self.assertNotEquals(c1.id, c3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        c1 = self.create_connection()
+        xml_str = vistrails.core.db.io.serialize(c1)
+        c2 = vistrails.core.db.io.unserialize(xml_str, Connection)
+        self.assertEquals(c1, c2)
+        self.assertEquals(c1.id, c2.id)
+
+    def testModuleConnection(self):
+        a = Connection.fromID(0)
+        c = moduleConnection(a)
+        def bogus(asd):
+            return 3
+        assert type(c) == type(bogus)
+
+    def testEmptyConnection(self):
+        """Tests sane initialization of empty connection"""
+        c = Connection()
+        self.assertEquals(c.source.endPoint, PortEndPoint.Source)
+        self.assertEquals(c.destination.endPoint, PortEndPoint.Destination)
+        
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/vistrail/controller.py b/vistrails/core/vistrail/controller.py
new file mode 100644
index 0000000..03a4bd4
--- /dev/null
+++ b/vistrails/core/vistrail/controller.py
@@ -0,0 +1,3891 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from itertools import izip
+import os
+import uuid
+import shutil
+import tempfile
+
+from vistrails.core.configuration import get_vistrails_configuration, \
+                                         get_vistrails_persistent_configuration
+import vistrails.core.db.action
+import vistrails.core.db.io
+import vistrails.core.db.locator
+from vistrails.core import debug
+from vistrails.core.data_structures.graph import Graph
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.core.layout.workflow_layout import WorkflowLayout, \
+    Pipeline as LayoutPipeline, Defaults as LayoutDefaults
+from vistrails.core.log.controller import LogControllerFactory, DummyLogController
+from vistrails.core.log.log import Log
+from vistrails.core.modules.abstraction import identifier as abstraction_pkg, \
+    version as abstraction_ver
+from vistrails.core.modules.basic_modules import identifier as basic_pkg
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.module_registry import ModuleRegistryException, \
+    MissingModuleVersion, MissingModule, MissingPackageVersion, MissingPort, \
+    MissingPackage, PortsIncompatible
+from vistrails.core.modules.package import Package
+from vistrails.core.modules.sub_module import new_abstraction, read_vistrail, \
+    get_all_abs_namespaces, get_cur_abs_namespace, get_cur_abs_annotation_key, \
+    get_next_abs_annotation_key, save_abstraction, parse_abstraction_name
+from vistrails.core.packagemanager import PackageManager, get_package_manager
+import vistrails.core.packagerepository
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler, UpgradeWorkflowError
+from vistrails.core.utils import VistrailsInternalError, PortAlreadyExists, DummyView, \
+    InvalidPipeline
+from vistrails.core.system import vistrails_default_file_type
+from vistrails.core.vistrail.abstraction import Abstraction
+from vistrails.core.vistrail.action import Action
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.connection import Connection
+from vistrails.core.vistrail.group import Group
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module, ModuleFunction, ModuleParam
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.port import Port
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.vistrail.port_spec_item import PortSpecItem
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core.theme import DefaultCoreTheme
+from vistrails.db import VistrailsDBException
+from vistrails.db.domain import IdScope, DBWorkflowExec
+from vistrails.db.services.io import create_temp_folder, remove_temp_folder
+from vistrails.db.services.io import SaveBundle, open_vt_log_from_db
+from vistrails.db.services.vistrail import getSharedRoot
+from vistrails.core.utils import any
+
+def vt_action(description_or_f=None):
+    def get_f(f, description=None):
+        def new_f(self, *args, **kwargs):
+            self.flush_delayed_actions()
+            action = f(self, *args, **kwargs)
+            if action is not None:
+                self.add_new_action(action, description)
+                self.perform_action(action)
+            return action
+        return new_f
+
+    if isinstance(description_or_f, basestring):
+        d = description_or_f
+        def wrap(f):
+            return get_f(f, d)
+        return wrap
+    else:
+        return get_f(description_or_f)
+
+class CompareThumbnailsError(Exception):
+
+    def __init__(self, msg, first=None, second=None):
+        Exception.__init__(self, msg)
+        self._msg = msg
+        self._first = first
+        self._second = second
+        
+    def __str__(self):
+        return "Comparing thumbnails failed.\n%s\n%s\n%s" % \
+            (self._msg, self._first, self._second)
+
+class VistrailController(object):
+    def __init__(self, vistrail=None, locator=None, abstractions=None, 
+                 thumbnails=None, mashups=None, id_scope=None, 
+                 set_log_on_vt=True, auto_save=True):
+        self.vistrail = None
+        self.locator = None
+        self._auto_save = auto_save
+        self.name = ''
+        self.file_name = ''
+        self.is_abstraction = False
+        self.changed = False
+
+        # if _cache_pipelines is True, cache pipelines to speed up
+        # version switching
+        self._cache_pipelines = True
+        self.flush_pipeline_cache()
+        self._current_full_graph = None
+        self._current_terse_graph = None
+        self.num_versions_always_shown = 1
+
+        # if self.search is True, vistrail is currently being searched
+        self.search = None
+        self.search_str = None
+        # If self.refine is True, search mismatches are hidden instead
+        # of ghosted
+        self.refine = False
+        self.full_tree = False
+
+        self._asked_packages = set()
+        self._delayed_actions = []
+        self._delayed_paramexps = []
+        self._delayed_mashups = []
+        self._loaded_abstractions = {}
+        
+        # This will just store the mashups in memory and send them to SaveBundle
+        # when writing the vistrail
+        self._mashups = []
+
+        # the redo stack stores the undone action ids 
+        # (undo is automatic with us, through the version tree)
+        self.redo_stack = []
+
+        # this is a reference to the current parameter exploration
+        self.current_parameter_exploration = None
+        
+        # theme used to estimate module size for layout
+        self.layoutTheme = DefaultCoreTheme()
+        
+        self.set_vistrail(vistrail, locator, 
+                          abstractions=abstractions, 
+                          thumbnails=thumbnails,
+                          mashups=mashups,
+                          id_scope=id_scope, 
+                          set_log_on_vt=set_log_on_vt)
+
+    # allow gui.vistrail_controller to reference individual views
+    def _get_current_version(self):
+        return self._current_version
+    def _set_current_version(self, version):
+        self._current_version = version
+    current_version = property(_get_current_version, _set_current_version)
+
+    def _get_current_pipeline(self):
+        return self._current_pipeline
+    def _set_current_pipeline(self, pipeline):
+        self._current_pipeline = pipeline
+    current_pipeline = property(_get_current_pipeline, _set_current_pipeline)
+
+    def flush_pipeline_cache(self):
+        self._pipelines = {0: Pipeline()}
+
+    def logging_on(self):
+        return not get_vistrails_configuration().check('nologger')
+            
+    def get_logger(self):
+        if self.logging_on():
+            return LogControllerFactory.getInstance().create_logger(self.log)
+        else:
+            return DummyLogController()
+        
+    def get_locator(self):
+        return self.locator
+    
+    def set_vistrail(self, vistrail, locator, abstractions=None, 
+                     thumbnails=None, mashups=None, id_scope=None,
+                     set_log_on_vt=True):
+        self.vistrail = vistrail
+        self.id_scope = id_scope
+        self.current_session = -1
+        self.log = Log()
+        if self.vistrail is not None:
+            self.id_scope = self.vistrail.idScope
+            self.current_session = self.vistrail.idScope.getNewId("session")
+            self.vistrail.current_session = self.current_session
+            if set_log_on_vt:
+                self.vistrail.log = self.log
+            if abstractions is not None:
+                self.ensure_abstractions_loaded(self.vistrail, abstractions)
+            if thumbnails is not None:
+                ThumbnailCache.getInstance().add_entries_from_files(thumbnails)
+            if mashups is not None:
+                self._mashups = mashups
+        self.current_version = -1
+        self.current_pipeline = Pipeline()
+        if self.locator != locator and self.locator is not None:
+            self.locator.clean_temporaries()
+        self.locator = locator
+        if self.locator is not None:
+            self.set_file_name(locator.name)
+        else:
+            self.set_file_name('')
+        if self.locator and self.locator.has_temporaries():
+            self.set_changed(True)
+        if self.vistrail is not None:
+            self.recompute_terse_graph()
+        
+    def close_vistrail(self, locator):
+        if not self.vistrail.is_abstraction:
+            self.unload_abstractions()
+        if locator is not None:
+            locator.clean_temporaries()
+            locator.close()
+
+    def cleanup(self):
+        pass
+
+    def set_id_scope(self, id_scope):
+        self.id_scope = id_scope
+
+    def set_changed(self, changed):
+        """ set_changed(changed: bool) -> None
+        Set the current state of changed and emit signal accordingly
+        
+        """
+        if changed!=self.changed:
+            self.changed = changed
+        
+    def set_file_name(self, file_name):
+        """ set_file_name(file_name: str) -> None
+        Change the controller file name
+        
+        """
+        if file_name == None:
+            file_name = ''
+        if self.file_name!=file_name:
+            self.file_name = file_name
+            self.name = os.path.split(file_name)[1]
+            if self.name=='':
+                self.name = 'untitled%s'%vistrails_default_file_type()
+                
+    def check_alias(self, name):
+        """check_alias(alias) -> Boolean 
+        Returns True if current pipeline has an alias named name """
+        # FIXME Why isn't this call on the pipeline?
+        return self.current_pipeline.has_alias(name)
+    
+    def check_vistrail_variable(self, name):
+        """check_vistrail_variable(var) -> Boolean
+        Returns True if vistrail has a variable named name """
+        if self.vistrail:
+            return self.vistrail.has_vistrail_var(name)
+        return False
+    
+    def set_vistrail_variable(self, name, value=None, set_changed=True):
+        """set_vistrail_variable(var) -> Boolean
+        Returns True if vistrail variable was changed """
+        if self.vistrail:
+            changed = self.vistrail.set_vistrail_var(name, value)
+            if changed and set_changed:
+                self.set_changed(changed)
+            return changed
+        return False
+
+    def get_vistrail_variable(self, name):
+        if self.vistrail:
+            return self.vistrail.get_vistrail_var(name)
+        return None
+   
+    def get_vistrail_variable_by_uuid(self, uuid):
+        if self.vistrail:
+            return self.vistrail.db_get_vistrailVariable_by_uuid(uuid)
+        return None
+ 
+    def get_vistrail_variables(self):
+        """get_vistrail_variables() -> list
+        Returns the list of vistrail variables """
+        if self.vistrail:
+            return self.vistrail.vistrail_vars
+        return []
+    
+    def get_vistrail_variable_name_by_uuid(self, uuid):
+        """def get_vistrail_variable_name_by_uuid(uuid: str) -> dict
+        Returns the var name for vistrail variable with uuid """
+        if self.vistrail and self.vistrail.db_has_vistrailVariable_with_uuid(uuid):
+            return self.vistrail.db_get_vistrailVariable_by_uuid(uuid).name
+    
+    def find_vistrail_var_module(self, var_uuid):
+        for m in self.current_pipeline.modules.itervalues():
+            if m.is_vistrail_var() and m.get_vistrail_var() == var_uuid:
+                return m
+        return None
+
+    def get_vistrail_var_pairs(self, to_module, port_name, var_uuid=None):
+        connections = self.get_connections_to(self.current_pipeline, 
+                                              [to_module.id], port_name)
+        pipeline = self.current_pipeline
+        v_pairs = {}
+        for connection in connections:
+            m = pipeline.modules[connection.source.moduleId]
+            if m.is_vistrail_var():
+                if var_uuid is None or m.get_vistrail_var() == var_uuid:
+                    if m.id not in v_pairs:
+                        v_pairs[m.id] = []
+                    v_pairs[m.id].append(connection)
+        return v_pairs
+
+    def create_vistrail_var_module(self, descriptor, x, y, var_uuid):
+        m = self.create_module_from_descriptor(descriptor, x, y)
+        a = Annotation(id=self.id_scope.getNewId(Annotation.vtType),
+                       key=Module.VISTRAIL_VAR_ANNOTATION,
+                       value=var_uuid)
+        m.add_annotation(a)
+        f = self.create_function(m, "value")
+        m.add_function(f)
+        return m
+
+    def check_vistrail_var_connected(self, v_module, to_module, to_port):
+        connections = self.get_connections_to(self.current_pipeline, 
+                                              [to_module.id], to_port)
+        for connection in connections:
+            if connection.source.moduleId == v_module.id:
+                return True
+        return False
+
+    def check_has_vistrail_var_connected(self, to_module, port_name):
+        connections = self.get_connections_to(self.current_pipeline, 
+                                              [to_module.id], port_name)
+        pipeline = self.current_pipeline
+        for connection in connections:
+            if pipeline.modules[connection.source.moduleId].is_vistrail_var():
+                return True
+        return False
+
+    @vt_action("Connected vistrail variable")
+    def connect_vistrail_var_action(self, connection, module=None):
+        ops = []
+        if module is not None:
+            ops.append(('add', module))
+        ops.append(('add', connection))
+        action = vistrails.core.db.action.create_action(ops)
+        return action
+        
+    def connect_vistrail_var(self, descriptor, var_uuid,
+                             to_module, to_port, x, y):
+        ops = []
+        new_module = None
+        v_module = self.find_vistrail_var_module(var_uuid)
+        if v_module is None:
+            v_module = self.create_vistrail_var_module(descriptor, x, y, 
+                                                       var_uuid)
+            new_module = v_module
+        elif self.check_vistrail_var_connected(v_module, to_module, to_port):
+            return (None, None)
+
+        c = self.create_connection(v_module, "value", to_module, to_port)
+        action = self.connect_vistrail_var_action(c, new_module)
+        return (c, new_module)
+
+    def delete_modules_and_connections(self, modules, connections):
+        ops = []
+        ops.extend([('delete', c) for c in connections])
+        ops.extend([('delete', m) for m in modules])
+        if len(ops) > 0:
+            action = vistrails.core.db.action.create_action(ops)
+            return action
+        return None
+
+    @vt_action("Disconnected vistrail variable")
+    def disconnect_vistrail_vars(self, modules, connections):
+        return self.delete_modules_and_connections(modules, connections)
+
+    def get_disconnect_vistrail_vars(self, to_module, to_port, 
+                                     to_var_uuid=None):
+        to_delete_modules = []
+        to_delete_conns = []
+        v_pairs = self.get_vistrail_var_pairs(to_module, to_port, to_var_uuid)
+        for (v_module_id, v_conns) in v_pairs.iteritems():
+            to_delete_conns.extend(v_conns)
+            total_conns = self.get_connections_from(self.current_pipeline,
+                                                    [v_module_id])
+            # remove v_module if it isn't connected to others
+            if (len(total_conns) - len(v_conns)) < 1:
+                to_delete_modules.append(
+                    self.current_pipeline.modules[v_module_id])
+
+        # action = self.delete_modules_and_connections(to_delete_modules,
+        #                                              to_delete_conns)
+        # if action:
+        #     self.vistrail.change_description("Disconnected Vistrail Variables",
+        #                                      action.id)
+        return (to_delete_modules, to_delete_conns)
+
+    def getParameterExplorationById(self, id):
+        """ getParameterExplorationById(self, id) -> ParameterExploration
+        Returns a ParameterExploration given its id
+        """
+        if self.vistrail and \
+           self.vistrail.db_has_parameter_exploration_with_id(id):
+            return  self.vistrail.db_get_parameter_exploration_by_id(id)
+        return None
+
+    def getLatestParameterExplorationByVersion(self, id):
+        """ getLatestParameterExplorationByVersion(self, version) ->
+                                                        ParameterExploration
+        Returns a parameter exploration given its action_id and
+        that it has not been named
+        """
+        for i in xrange(len(self.vistrail.db_parameter_explorations)):
+            pe = self.vistrail.db_parameter_explorations[i]
+            if pe.action_id == id and not pe.name:
+                return pe
+        return None
+
+    def invalidate_version_tree(self, *args, **kwargs):
+        """ invalidate_version_tree(self, *args, **kwargs) -> None
+        Does nothing, gui/vistrail_controller.py does, though
+        """
+        pass
+
+    ##########################################################################
+    # Actions, etc
+
+    def has_move_actions(self):
+        return False
+    
+    def flush_move_actions(self):
+        return False
+
+    def migrate_tags(self, from_version, to_version, vistrail=None):
+        if vistrail is None:
+            vistrail = self.vistrail
+        tag = vistrail.get_tag(from_version)
+        if tag:
+            vistrail.set_tag(from_version, "")
+            vistrail.set_tag(to_version, tag)
+        notes = vistrail.get_notes(from_version)
+        if notes:
+            vistrail.set_notes(from_version, "")
+            vistrail.set_notes(to_version, notes)
+
+    def flush_delayed_actions(self):
+        start_version = self.current_version
+        desc_key = Action.ANNOTATION_DESCRIPTION
+        added_upgrade = False
+        should_migrate_tags = get_vistrails_configuration().check("migrateTags")
+        for action in self._delayed_actions:
+            self.vistrail.add_action(action, start_version, 
+                                     self.current_session)
+            # HACK to populate upgrade information
+            if (action.has_annotation_with_key(desc_key) and
+                action.get_annotation_by_key(desc_key).value == 'Upgrade'):
+                self.vistrail.set_upgrade(start_version, str(action.id))
+            if should_migrate_tags:
+                self.migrate_tags(start_version, action.id)
+            self.current_version = action.id
+            start_version = action.id
+            added_upgrade = True
+        for pe in self._delayed_paramexps:
+            pe.action_id = self.current_version
+            self.vistrail.db_add_parameter_exploration(pe)
+        for mashup in self._delayed_mashups:
+            # mashup is a mashuptrail.
+            # We need to update all action id references.
+            mashup.vtVersion = self.current_version
+            for action in mashup.actions:
+                action.mashup.version = self.current_version
+            self._mashups.append(mashup)
+
+            #self.vistrail.db_add_parameter_exploration(pe)
+        # We have to do moves after the delayed actions because the pipeline
+        # may have been updated
+        added_moves = self.flush_move_actions()
+        self._delayed_actions = []
+        self._delayed_paramexps = []
+        self._delayed_mashups = []
+        if added_upgrade or added_moves:
+            self.recompute_terse_graph()
+            self.invalidate_version_tree(False)
+
+    def perform_action(self, action):
+        """ performAction(action: Action) -> timestep
+        
+        Performs given action on current pipeline.
+        
+        """
+        if action is not None:
+            self.current_pipeline.perform_action(action)
+            self.current_version = action.db_id
+            return action.db_id
+        return None
+
+    def add_new_action(self, action, description=None):
+        """add_new_action(action) -> None
+
+        Call this function to add a new action to the vistrail being
+        controlled by the vistrailcontroller.
+
+        FIXME: In the future, this function should watch the vistrail
+        and get notified of the change.
+
+        """
+        if action is not None:
+            if self.current_version == -1:
+                self.change_selected_version(0)
+            self.vistrail.add_action(action, self.current_version, 
+                                     self.current_session)
+            if description is not None:
+                self.vistrail.change_description(description, action.id)
+            self.set_changed(True)
+            self.current_version = action.db_id
+            self.recompute_terse_graph()
+            
+    def create_module_from_descriptor(self, *args, **kwargs):
+        return self.create_module_from_descriptor_static(self.id_scope,
+                                                         *args, **kwargs)
+
+    @staticmethod
+    def create_module_from_descriptor_static(id_scope, descriptor, 
+                                             x=0.0, y=0.0, 
+                                             internal_version=-1):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        package = reg.get_package_by_name(descriptor.identifier)
+        loc_id = id_scope.getNewId(Location.vtType)
+        location = Location(id=loc_id,
+                            x=x, 
+                            y=y,
+                            )
+        if internal_version > -1:
+            # only get the current namespace if this is a local subworkflow
+            if package == abstraction_pkg:
+                namespace = get_cur_abs_namespace(descriptor.module.vistrail)
+            else:
+                namespace = descriptor.namespace
+            abstraction_id = id_scope.getNewId(Abstraction.vtType)
+            module = Abstraction(id=abstraction_id,
+                                 name=descriptor.name,
+                                 package=descriptor.identifier,
+                                 namespace=namespace,
+                                 version=package.version,
+                                 location=location,
+                                 internal_version=internal_version,
+                                 )
+        elif descriptor.identifier == basic_pkg and \
+                descriptor.name == 'Group':
+            group_id = id_scope.getNewId(Group.vtType)
+            module = Group(id=group_id,
+                           name=descriptor.name,
+                           package=descriptor.identifier,
+                           namespace=descriptor.namespace,
+                           version=package.version,
+                           location=location,
+                           )
+        else:
+            module_id = id_scope.getNewId(Module.vtType)
+            module = Module(id=module_id,
+                            name=descriptor.name,
+                            package=descriptor.identifier,
+                            namespace=descriptor.namespace,
+                            version=package.version,
+                            location=location,
+                            )
+        module.is_valid = True
+        return module
+
+    def create_module(self, *args, **kwargs):
+        return self.create_module_static(self.id_scope, *args, **kwargs)
+
+    @staticmethod
+    def create_module_static(id_scope, identifier, name, namespace='', 
+                             x=0.0, y=0.0, internal_version=-1):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        d = reg.get_descriptor_by_name(identifier, name, namespace)
+        static_call = VistrailController.create_module_from_descriptor_static
+        return static_call(id_scope, d, x, y, internal_version)
+
+    def create_connection_from_ids(self, output_id, output_port_spec,
+                                       input_id, input_port_spec):
+        output_module = self.current_pipeline.modules[output_id]
+        input_module = self.current_pipeline.modules[input_id]
+        return self.create_connection(output_module, output_port_spec, 
+                                      input_module, input_port_spec)
+
+    def create_connection(self, *args, **kwargs):
+        return self.create_connection_static(self.id_scope, *args, **kwargs)
+
+    @staticmethod
+    def create_connection_static(id_scope, output_module, output_port_spec,
+                                 input_module, input_port_spec):     
+        if isinstance(output_port_spec, basestring):
+            output_port_spec = \
+                output_module.get_port_spec(output_port_spec, 'output')
+        if isinstance(input_port_spec, basestring):
+            input_port_spec = \
+                input_module.get_port_spec(input_port_spec, 'input')            
+        if output_port_spec is None:
+            raise VistrailsInternalError("output port spec is None")
+        if input_port_spec is None:
+            raise VistrailsInternalError("input port spec is None")
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        if not reg.ports_can_connect(output_port_spec, input_port_spec):
+            raise PortsIncompatible(output_module.package,
+                                    output_module.name,
+                                    output_module.namespace,
+                                    output_port_spec.name,
+                                    input_module.package,
+                                    input_module.name,
+                                    input_module.namespace,
+                                    input_port_spec.name)
+        output_port_id = id_scope.getNewId(Port.vtType)
+        output_port = Port(id=output_port_id,
+                           spec=output_port_spec,
+                           moduleId=output_module.id,
+                           moduleName=output_module.name)
+        input_port_id = id_scope.getNewId(Port.vtType)
+        input_port = Port(id=input_port_id,
+                           spec=input_port_spec,
+                           moduleId=input_module.id,
+                           moduleName=input_module.name)
+        conn_id = id_scope.getNewId(Connection.vtType)
+        connection = Connection(id=conn_id,
+                                ports=[input_port, output_port])
+        return connection
+
+    def create_param(self, *args, **kwargs):
+        return self.create_param_static(self.id_scope, *args, **kwargs)
+
+    @staticmethod
+    def create_param_static(id_scope, port_spec, pos, value, alias='', 
+                            query_method=None):
+        param_id = id_scope.getNewId(ModuleParam.vtType)
+        descriptor = port_spec.descriptors()[pos]
+        param_type = descriptor.sigstring
+        # FIXME add/remove description
+        # FIXME make ModuleParam constructor accept port_spec
+        new_param = ModuleParam(id=param_id,
+                                pos=pos,
+                                name='<no description>',
+                                alias=alias,
+                                val=value,
+                                type=param_type,
+                                )
+
+        # FIXME probably should put this in the ModuleParam constructor
+        new_param.queryMethod = query_method
+        return new_param
+
+    def create_params(self, *args, **kwargs):
+        return self.create_params_static(self.id_scope, *args, **kwargs)
+
+    @staticmethod
+    def create_params_static(id_scope, port_spec, values, aliases=[], 
+                             query_methods=[]):
+        params = []
+        for i in xrange(len(port_spec.descriptors())):
+            if i < len(values):
+                value = str(values[i])
+            else:
+                value = None
+            if i < len(aliases):
+                alias = str(aliases[i])
+            else:
+                alias = ''
+            if i < len(query_methods):
+                query_method = query_methods[i]
+            else:
+                query_method = None
+            param = VistrailController.create_param_static(id_scope, port_spec,
+                                                           i, value, alias,
+                                                           query_method)
+            params.append(param)
+        return params
+
+    def create_function(self, *args, **kwargs):
+        return self.create_function_static(self.id_scope, *args, **kwargs)
+
+    @staticmethod
+    def create_function_static(id_scope, module, function_name, 
+                               param_values=[], aliases=[], query_methods=[]):
+        port_spec = module.get_port_spec(function_name, 'input')
+        if len(param_values) <= 0 and port_spec.defaults is not None:
+            param_values = port_spec.defaults
+
+        f_id = id_scope.getNewId(ModuleFunction.vtType)
+        new_function = ModuleFunction(id=f_id,
+                                      pos=module.getNumFunctions(),
+                                      name=function_name,
+                                      )
+        new_function.is_valid = True
+        new_params = \
+            VistrailController.create_params_static(id_scope, port_spec, 
+                                                    param_values, aliases,
+                                                    query_methods)
+        new_function.add_parameters(new_params)        
+        return new_function
+
+    def create_functions(self, *args, **kwargs):
+        return self.create_functions_static(self.id_scope, *args, **kwargs)
+
+    @staticmethod
+    def create_functions_static(id_scope, module, functions):
+        """create_functions(module: Module,
+                            functions: [function_name: str,
+                                        param_values: [str]]) 
+            -> [ModuleFunction]
+        
+        """
+        new_functions = []
+        static_call = VistrailController.create_function_static
+        for f in functions:
+            new_functions.append(static_call(id_scope, module, *f))
+        return new_functions
+
+    def create_port_spec(self, *args, **kwargs):
+        return self.create_port_spec_static(self.id_scope, *args, **kwargs)
+    
+    @staticmethod
+    def create_port_spec_static(id_scope, module, port_type, port_name, 
+                                port_sigstring, port_sort_key=-1):
+        p_id = id_scope.getNewId(PortSpec.vtType)
+        port_spec = PortSpec(id=p_id,
+                             type=port_type,
+                             name=port_name,
+                             sigstring=port_sigstring,
+                             sort_key=port_sort_key,
+                             )
+        # don't know how many port spec items are created until after...
+        for psi in port_spec.port_spec_items:
+            psi.id = id_scope.getNewId(PortSpecItem.vtType)
+        return port_spec
+
+    def get_module_connection_ids(self, module_ids, graph):
+        connection_ids = set()
+        for module_id in module_ids:
+            for v, id in graph.edges_from(module_id):
+                connection_ids.add(id)
+            for v, id in graph.edges_to(module_id):
+                connection_ids.add(id)
+        return connection_ids
+
+    def delete_module_list_ops(self, pipeline, module_ids):
+        graph = pipeline.graph
+        connect_ids = self.get_module_connection_ids(module_ids, graph)
+        ops = []
+        for c_id in connect_ids:
+            ops.append(('delete', pipeline.connections[c_id]))
+        for m_id in module_ids:
+            ops.append(('delete', pipeline.modules[m_id]))
+        return ops
+
+    def update_port_spec_ops(self, module, deleted_ports, added_ports):
+        op_list = []
+        deleted_port_info = set()
+        changed_port_info = set()
+        for p in deleted_ports:
+            port_info = (p[1], p[0])
+            if module.has_portSpec_with_name(port_info):
+                port = module.get_portSpec_by_name(port_info)
+                deleted_port_info.add(port_info + (port.sigstring,))
+        for p in added_ports:
+            port_info = (p[1], p[0], p[2])
+            if port_info in deleted_port_info:
+                changed_port_info.add(port_info[:2])
+            
+        # Remove any connections related to deleted ports
+        for c in self.current_pipeline.connections.itervalues():
+            if ((c.sourceId == module.id and
+                 any(c.source.name == p[1] for p in deleted_ports
+                     if (p[1], p[0]) not in changed_port_info)) or
+                (c.destinationId == module.id and
+                 any(c.destination.name == p[1] for p in deleted_ports
+                     if (p[1], p[0]) not in changed_port_info))):
+                op_list.append(('delete', c))
+
+        # Remove any functions related to deleted ports
+        for p in deleted_ports:
+            if (p[1], p[0]) not in changed_port_info:
+                for function in module.functions:
+                    if function.name == p[1]:
+                        op_list.append(('delete', function, 
+                                        Module.vtType, module.id))
+
+        # Remove all deleted ports
+        # !! Reset delted_port_info to not store sigstring
+        deleted_port_info = set()
+        for p in deleted_ports:
+            port_info = (p[1], p[0])
+            if module.has_portSpec_with_name(port_info):
+                port_spec = module.get_portSpec_by_name(port_info)
+                op_list.append(('delete', port_spec, Module.vtType, module.id))
+                deleted_port_info.add(port_info)
+
+        # Add all added ports
+        for p in added_ports:
+            if (p[1], p[0]) not in deleted_port_info and \
+                    module.has_port_spec(p[1], p[0]):
+                raise PortAlreadyExists(module.package, module.name, p[0], p[1])
+            port_spec = self.create_port_spec(module, *p)
+            op_list.append(('add', port_spec, Module.vtType, module.id))
+        return op_list
+
+    def update_function_ops(self, module, function_name, param_values=[],
+                            old_id=-1L, should_replace=True, aliases=[],
+                            query_methods=[]):
+        """NOTE: aliases will be removed in the future!"""
+        op_list = []
+        port_spec = module.get_port_spec(function_name, 'input')
+
+        if should_replace and old_id < 0:
+            for old_function in module.functions:
+                if old_function.name == function_name:
+                    old_id = old_function.real_id
+
+        # ensure that replacements don't happen for functions that
+        # shouldn't be replaced
+        if should_replace and old_id >= 0:
+            function = module.function_idx[old_id]
+            if param_values is None:
+                op_list.append(('delete', function, module.vtType, module.id))
+            else:
+                for i, new_param_value in enumerate(param_values):
+                    old_param = function.params[i]
+                    if ((len(aliases) > i and old_param.alias != aliases[i]) or
+                        (len(query_methods) > i and 
+                         old_param.queryMethod != query_methods[i]) or
+                        (old_param.strValue != new_param_value)):
+                        if len(aliases) > i:
+                            alias = aliases[i]
+                        else:
+                            alias = ''
+                        if len(query_methods) > i:
+                            query_method = query_methods[i]
+                        else:
+                            query_method = None
+                        new_param = self.create_param(port_spec, i, 
+                                                      new_param_value, alias,
+                                                      query_method)
+                        op_list.append(('change', old_param, new_param,
+                                        function.vtType, function.real_id))
+        elif param_values is not None:
+            if len(param_values) < 1:
+                new_function = self.create_function(module, function_name,
+                                                    param_values, aliases,
+                                                    query_methods)
+                op_list.append(('add', new_function,
+                                module.vtType, module.id))        
+            else:
+                psis = port_spec.port_spec_items
+                found = False
+                for param_value, psi in izip(param_values, psis):
+                    if param_value != psi.default:
+                        found = True
+                        break
+                if found:
+                    new_function = self.create_function(module, function_name,
+                                                        param_values, aliases,
+                                                        query_methods)
+                    op_list.append(('add', new_function,
+                                    module.vtType, module.id))
+        return op_list
+
+    def update_functions_ops(self, module, functions):
+        """update_functions_ops(module: Module, 
+                                functions: [function_name: str,
+                                            param_values: [str],
+                                            old_id: long (-1)
+                                            should_replace: bool (True)])
+            -> [Op]
+        Returns a list of operations that will create and update the
+        functions of the specified module with new values.
+
+        """
+        op_list = []
+        for f in functions:
+            op_list.extend(self.update_function_ops(module, *f))
+        return op_list
+
+    def create_updated_parameter(self, old_param, new_value):
+        """update_parameter(old_param: ModuleParam, new_value: str)
+              -> ModuleParam
+        Generates a change parameter action if the value is different
+
+        """
+        if old_param.strValue == new_value:
+            return None
+
+        param_id = self.id_scope.getNewId(ModuleParam.vtType)
+        new_param = ModuleParam(id=param_id,
+                                pos=old_param.pos,
+                                name=old_param.name,
+                                alias=old_param.alias,
+                                val=new_value,
+                                type=old_param.typeStr,
+                                )
+        return new_param
+
+    def update_annotation_ops(self, module, annotations):
+        """update_annotation_ops(module: Module, annotations: [(str, str)])
+              -> [operation_list]
+        
+        """
+        op_list = []
+        for (key, value) in annotations:
+            a_id = self.id_scope.getNewId(Annotation.vtType)
+            annotation = Annotation(id=a_id,
+                                    key=key, 
+                                    value=value,
+                                    )
+            if module.has_annotation_with_key(key):
+                old_annotation = module.get_annotation_by_key(key)
+                op_list.append(('change', old_annotation, annotation,
+                                module.vtType, module.id))
+            else:
+                op_list.append(('add', annotation, module.vtType, module.id))
+        return op_list
+
+    def check_subworkflow_versions(self, changed_subworkflow_desc):
+        if self.current_pipeline is not None:
+            self.current_pipeline.check_subworkflow_versions()
+
+    @vt_action
+    def add_module_action(self, module):
+        action = vistrails.core.db.action.create_action([('add', module)])
+        return action
+
+    def add_module_from_descriptor(self, descriptor, x=0.0, y=0.0, 
+                                   internal_version=-1):
+        module = self.create_module_from_descriptor(descriptor, x, y, 
+                                                    internal_version)
+        action = self.add_module_action(module)
+        return module
+
+
+    def add_module(self, identifier, name, namespace='', x=0.0, y=0.0, 
+                   internal_version=-1):
+        """ addModule(x: int, y: int, identifier, name: str, namespace='') 
+               -> Module
+        Add a new module into the current pipeline
+        
+        """
+        module = self.create_module(identifier, name, namespace, x, y,
+                                    internal_version)
+        action = self.add_module_action(module)
+        return module
+            
+    def delete_module(self, module_id):
+        """ delete_module(module_id: int) -> version id
+        Delete a module from the current pipeline
+        
+        """
+        return self.delete_module_list([module_id])
+
+    def create_module_list_deletion_action(self, pipeline, module_ids):
+        """ create_module_list_deletion_action(
+               pipeline: Pipeline,
+               module_ids: [int]) -> Action
+        Create action that will delete multiple modules from the given pipeline.
+
+        """
+        ops = self.delete_module_list_ops(pipeline, module_ids)
+        return vistrails.core.db.action.create_action(ops)
+
+    @vt_action
+    def delete_module_list(self, module_ids):
+        """ delete_module_list(module_ids: [int]) -> [version id]
+        Delete multiple modules from the current pipeline
+        
+        """
+        action = self.create_module_list_deletion_action(self.current_pipeline,
+                                                         module_ids)
+        return action
+    
+    def move_modules_ops(self, move_list):
+        """ move_module_list(move_list: [(id,x,y)]) -> [operations]        
+        Returns the operations that will move each module to its 
+        specified location
+        
+        """
+        operations = []
+        for (id, x, y) in move_list:
+            module = self.current_pipeline.get_module_by_id(id)
+            if module.location:
+                if module.location.x == x and module.location.y == y:
+                    continue
+            loc_id = self.vistrail.idScope.getNewId(Location.vtType)
+            location = Location(id=loc_id, x=x, y=y)
+            if module.location and module.location.id != -1:
+                old_location = module.location
+                operations.append(('change', old_location, location,
+                                    module.vtType, module.id))
+            else:
+                #should probably be an error
+                operations.append(('add', location, module.vtType, module.id))
+        return operations
+
+    def move_module_list(self, move_list):
+        """ move_module_list(move_list: [(id,x,y)]) -> [version id]        
+        Move all modules to a new location. No flushMoveActions is
+        allowed to to emit to avoid recursive actions
+        
+        """
+        action_list = self.move_modules_ops(move_list)
+        action = vistrails.core.db.action.create_action(action_list)
+        self.add_new_action(action)
+        return self.perform_action(action)
+
+    @vt_action
+    def add_connection_action(self, connection):
+        action = vistrails.core.db.action.create_action([('add', connection)])
+        return action
+
+    def add_connection(self, output_id, output_port_spec, 
+                       input_id, input_port_spec):
+        """ add_connection(output_id: long,
+                           output_port_spec: PortSpec | str,
+                           input_id: long,
+                           input_port_spec: PortSpec | str) -> Connection
+        Add a new connection into Vistrail
+        
+        """
+        connection = \
+            self.create_connection_from_ids(output_id, output_port_spec, 
+                                            input_id, input_port_spec)
+        action = self.add_connection_action(connection)
+        return connection
+    
+    def delete_connection(self, id):
+        """ delete_connection(id: int) -> version id
+        Delete a connection with id 'id'
+        
+        """
+        return self.delete_connection_list([id])
+
+    @vt_action
+    def delete_connection_list(self, connect_ids):
+        """ delete_connection_list(connect_ids: list) -> version id
+        Delete a list of connections
+        
+        """
+        action_list = []
+        for c_id in connect_ids:
+            action_list.append(('delete', 
+                                self.current_pipeline.connections[c_id]))
+        action = vistrails.core.db.action.create_action(action_list)
+        return action
+
+    @vt_action
+    def add_function_action(self, module, function):
+        action = vistrails.core.db.action.create_action([('add', function, 
+                                                module.vtType, module.id)])
+        return action
+
+    def add_function(self, module, function_name):
+        function = self.create_function(module, function_name)
+        action = self.add_function_action(module, function)
+        return function
+
+    @vt_action
+    def update_function(self, module, function_name, param_values, old_id=-1L,
+                        aliases=[], query_methods=[], should_replace=True):
+        op_list = self.update_function_ops(module, function_name, param_values,
+                                           old_id, aliases=aliases,
+                                           query_methods=query_methods,
+                                           should_replace=should_replace)
+        if len(op_list) > 0:
+            action = vistrails.core.db.action.create_action(op_list)
+            return action
+        return None
+
+    @vt_action
+    def update_parameter(self, function, old_param_id, new_value):
+        old_param = function.parameter_idx[old_param_id]
+        new_param = self.create_updated_parameter(old_param, new_value)
+        if new_param is None:
+            return None
+        op = ('change', old_param, new_param, 
+              function.vtType, function.real_id)
+        action = vistrails.core.db.action.create_action([op])
+        return action
+
+    @vt_action
+    def delete_method(self, function_pos, module_id):
+        """ delete_method(function_pos: int, module_id: int) -> version id
+        Delete a method with function_pos from module module_id
+
+        """
+
+        module = self.current_pipeline.get_module_by_id(module_id)
+        function = module.functions[function_pos]
+        action = vistrails.core.db.action.create_action([('delete', function,
+                                                module.vtType, module.id)])
+        return action
+
+    @vt_action
+    def delete_function(self, real_id, module_id):
+        module = self.current_pipeline.get_module_by_id(module_id)
+        function = module.get_function_by_real_id(real_id)
+        action = vistrails.core.db.action.create_action([('delete', function,
+                                                module.vtType, module.id)])
+        return action
+
+    @vt_action
+    def delete_annotation(self, key, module_id):
+        """ delete_annotation(key: str, module_id: long) -> version_id
+        Deletes an annotation from a module
+        
+        """
+        module = self.current_pipeline.get_module_by_id(module_id)
+        annotation = module.get_annotation_by_key(key)
+        action = vistrails.core.db.action.create_action([('delete', annotation,
+                                                module.vtType, module.id)])
+        return action
+
+    @vt_action
+    def add_annotation(self, pair, module_id):
+        """ add_annotation(pair: (str, str), moduleId: int)        
+        Add/Update a key/value pair annotation into the module of
+        moduleId
+        
+        """
+        assert isinstance(pair[0], basestring)
+        assert isinstance(pair[1], basestring)
+        if pair[0].strip()=='':
+            return
+
+        module = self.current_pipeline.get_module_by_id(module_id)
+        a_id = self.vistrail.idScope.getNewId(Annotation.vtType)
+        annotation = Annotation(id=a_id,
+                                key=pair[0], 
+                                value=pair[1],
+                                )
+        if module.has_annotation_with_key(pair[0]):
+            old_annotation = module.get_annotation_by_key(pair[0])
+            action = \
+                vistrails.core.db.action.create_action([('change', old_annotation,
+                                                   annotation,
+                                                   module.vtType, module.id)])
+        else:
+            action = vistrails.core.db.action.create_action([('add', annotation,
+                                                        module.vtType, 
+                                                        module.id)])
+        return action
+
+    def update_functions_ops_from_ids(self, module_id, functions):
+        module = self.current_pipeline.modules[module_id]
+        return self.update_functions_ops(module, functions)
+
+    def update_port_spec_ops_from_ids(self, module_id, deleted_ports, 
+                                      added_ports):
+        module = self.current_pipeline.modules[module_id]
+        return self.update_port_spec_ops(module, deleted_ports, added_ports)
+
+    @vt_action
+    def update_functions(self, module, functions):
+        op_list = self.update_functions_ops(module, functions)
+        if len(op_list) > 0:
+            action = vistrails.core.db.action.create_action(op_list)
+        else:
+            action = None
+        return action
+
+    @vt_action
+    def update_ports_and_functions(self, module_id, deleted_ports, added_ports,
+                                   functions):
+        op_list = self.update_port_spec_ops_from_ids(module_id, deleted_ports, 
+                                                     added_ports)
+        op_list.extend(self.update_functions_ops_from_ids(module_id, functions))
+        action = vistrails.core.db.action.create_action(op_list)
+        return action
+
+    @vt_action
+    def update_ports(self, module_id, deleted_ports, added_ports):
+        op_list = self.update_port_spec_ops_from_ids(module_id, deleted_ports, 
+                                                     added_ports)
+        action = vistrails.core.db.action.create_action(op_list)
+        return action
+
+    def has_module_port(self, module_id, port_tuple):
+        """ has_module_port(module_id: int, port_tuple: (str, str)): bool
+        Parameters
+        ----------
+        
+        - module_id : 'int'        
+        - port_tuple : (portType, portName)
+
+        Returns true if there exists a module port in this module with given params
+
+        """
+        (type, name) = port_tuple
+        module = self.current_pipeline.get_module_by_id(module_id)
+        return len([x for x in module.db_portSpecs
+                    if x.name == name and x.type == type]) > 0
+
+    @vt_action
+    def add_module_port(self, module_id, port_tuple):
+        """ add_module_port(module_id: int, port_tuple: (str, str, list)
+        Parameters
+        ----------
+        
+        - module_id : 'int'        
+        - port_tuple : (portType, portName, portSpec)
+        
+        """
+        module = self.current_pipeline.get_module_by_id(module_id)
+        p_id = self.vistrail.idScope.getNewId(PortSpec.vtType)
+        port_spec = PortSpec(id=p_id,
+                             type=port_tuple[0],
+                             name=port_tuple[1],
+                             sigstring=port_tuple[2],
+                             )
+        # don't know how many port spec items are created until after...
+        for psi in port_spec.port_spec_items:
+            psi.id = self.vistrail.idScope.getNewId(PortSpecItem.vtType)
+        action = vistrails.core.db.action.create_action([('add', port_spec,
+                                                module.vtType, module.id)])
+        return action
+
+    @vt_action
+    def delete_module_port(self, module_id, port_tuple):
+        """
+        Parameters
+        ----------
+        
+        - module_id : 'int'
+        - port_tuple : (portType, portName, portSpec)
+        
+        """
+        spec_id = -1
+        module = self.current_pipeline.get_module_by_id(module_id)
+        port_spec = module.get_portSpec_by_name((port_tuple[1], port_tuple[0]))
+        action_list = [('delete', port_spec, module.vtType, module.id)]
+        for function in module.functions:
+            if function.name == port_spec.name:
+                action_list.append(('delete', function, 
+                                    module.vtType, module.id))
+        action = vistrails.core.db.action.create_action(action_list)
+        return action
+
+    def create_group(self, module_ids, connection_ids):
+        self.flush_delayed_actions()
+        (group, connections) = \
+            self.build_group(self.current_pipeline, 
+                             module_ids, connection_ids)
+        op_list = []
+        op_list.extend(('delete', self.current_pipeline.connections[c_id])
+                       for c_id in connection_ids)
+        op_list.extend(('delete', self.current_pipeline.modules[m_id]) 
+                       for m_id in module_ids)
+        op_list.append(('add', group))
+        op_list.extend(('add', c) for c in connections)
+        action = vistrails.core.db.action.create_action(op_list)
+        self.add_new_action(action)
+#         for op in action.operations:
+#             print op.vtType, op.what, op.old_obj_id, op.new_obj_id
+        result = self.perform_action(action)
+        return group
+    
+    def create_abstraction(self, module_ids, connection_ids, name):
+        self.flush_delayed_actions()
+        (abstraction, connections) = \
+            self.build_abstraction(self.current_pipeline, 
+                                   module_ids, connection_ids, name)
+        op_list = []
+        op_list.extend(('delete', self.current_pipeline.connections[c_id])
+                       for c_id in connection_ids)
+        op_list.extend(('delete', self.current_pipeline.modules[m_id]) 
+                       for m_id in module_ids)
+        op_list.append(('add', abstraction))
+        op_list.extend(('add', c) for c in connections)
+        action = vistrails.core.db.action.create_action(op_list)
+        self.add_new_action(action)
+        result = self.perform_action(action)
+        return abstraction
+
+    def create_abstractions_from_groups(self, group_ids):
+        for group_id in group_ids:
+            self.create_abstraction_from_group(group_id)
+
+    def create_abstraction_from_group(self, group_id, name=""):
+        self.flush_delayed_actions()
+        name = self.get_abstraction_name(name)
+        
+        (abstraction, connections) = \
+            self.build_abstraction_from_group(self.current_pipeline, 
+                                              group_id, name)
+
+        op_list = []
+        getter = self.get_connections_to_and_from
+        op_list.extend(('delete', c)
+                       for c in getter(self.current_pipeline, [group_id]))
+        op_list.append(('delete', self.current_pipeline.modules[group_id]))
+        op_list.append(('add', abstraction))
+        op_list.extend(('add', c) for c in connections)
+        action = vistrails.core.db.action.create_action(op_list)
+        self.add_new_action(action)
+        result = self.perform_action(action)
+        return abstraction
+
+
+    def ungroup_set(self, module_ids):
+        self.flush_delayed_actions()
+        for m_id in module_ids:
+            self.create_ungroup(m_id)
+
+    def create_ungroup(self, module_id):
+        (modules, connections) = \
+            self.build_ungroup(self.current_pipeline, module_id)
+        pipeline = self.current_pipeline
+        old_conn_ids = self.get_module_connection_ids([module_id], 
+                                                      pipeline.graph)
+        op_list = []
+        op_list.extend(('delete', pipeline.connections[c_id]) 
+                       for c_id in old_conn_ids)
+        op_list.append(('delete', pipeline.modules[module_id]))
+        op_list.extend(('add', m) for m in modules)
+        op_list.extend(('add', c) for c in connections)
+        action = vistrails.core.db.action.create_action(op_list)
+        self.add_new_action(action)
+        res = self.perform_action(action)
+        self.validate(self.current_pipeline, False)
+        return res
+
+
+
+    ##########################################################################
+    # Methods to access/find pipeline information
+    
+    def get_connections_to(self, pipeline, module_ids, port_name=None):
+        connection_ids = set()
+        graph = pipeline.graph
+        for m_id in module_ids:
+            for _, id in graph.edges_to(m_id):
+                connection_ids.add(id)
+        return [pipeline.connections[c_id] for c_id in connection_ids
+                if port_name is None or \
+                    pipeline.connections[c_id].destination.name == port_name]
+
+    def get_connections_from(self, pipeline, module_ids, port_name=None):
+        connection_ids = set()
+        graph = pipeline.graph
+        for m_id in module_ids:
+            for _, id in graph.edges_from(m_id):
+                connection_ids.add(id)
+        return [pipeline.connections[c_id] for c_id in connection_ids
+                if port_name is None or \
+                    pipeline.connections[c_id].source.name == port_name]
+
+    def get_connections_to_and_from(self, pipeline, module_ids):
+        connection_ids = set()
+        graph = pipeline.graph
+        for m_id in module_ids:
+            for _, id in graph.edges_from(m_id):
+                connection_ids.add(id)
+            for _, id in graph.edges_to(m_id):
+                connection_ids.add(id)
+        return [pipeline.connections[c_id] for c_id in connection_ids]
+        
+    ##########################################################################
+    # Grouping/abstraction
+
+    def get_avg_location(self, modules):
+        if len(modules) < 1:
+            return (0.0, 0.0)
+
+        sum_x = 0.0
+        sum_y = 0.0
+        for module in modules:
+            sum_x += module.location.x
+            sum_y += module.location.y
+        return (sum_x / len(modules), sum_y / len(modules))
+
+    def translate_modules(self, modules, x, y):
+        for module in modules:
+            module.location.x -= x
+            module.location.y -= y
+
+    def center_modules(self, modules):
+        (avg_x, avg_y) = self.get_avg_location(modules)
+        self.translate_modules(modules, avg_x, avg_y)
+
+    @staticmethod
+    def get_neighbors(pipeline, module, upstream=True):
+#         for i, m in pipeline.modules.iteritems():
+#             print i, m.name
+#         for j, c in pipeline.connections.iteritems():
+#             print j, c.source.moduleId, c.destination.moduleId
+
+        neighbors = []
+        if upstream:
+            get_edges = pipeline.graph.edges_to
+            get_port_name = \
+                lambda x: pipeline.connections[x].source.name
+        else:
+            get_edges = pipeline.graph.edges_from
+            get_port_name = \
+                lambda x: pipeline.connections[x].destination.name
+        for (m_id, conn_id) in get_edges(module.id):
+            neighbors.append((pipeline.modules[m_id], get_port_name(conn_id)))
+        return neighbors
+
+    @staticmethod
+    def get_upstream_neighbors(pipeline, module):
+        return VistrailController.get_neighbors(pipeline, module, True)
+    @staticmethod
+    def get_downstream_neighbors(pipeline, module):
+        return VistrailController.get_neighbors(pipeline, module, False)
+
+    def check_subpipeline_port_names(self):
+        def create_name(base_name, names):
+            if base_name in names:
+                port_name = base_name + '_' + str(names[base_name])
+                names[base_name] += 1
+            else:
+                port_name = base_name
+                names[base_name] = 2
+            return port_name
+
+        in_names = {}
+        out_names = {}
+        in_cur_names = []
+        out_cur_names = []
+        in_process_list = []
+        out_process_list = []
+        pipeline = self.current_pipeline
+        for m in pipeline.module_list:
+            if m.package == basic_pkg and (m.name == 'InputPort' or
+                                           m.name == 'OutputPort'):
+                if m.name == 'InputPort':
+                    neighbors = self.get_downstream_neighbors(pipeline, m)
+                    names = in_names
+                    cur_names = in_cur_names
+                    process_list = in_process_list
+                elif m.name == 'OutputPort':
+                    neighbors = self.get_upstream_neighbors(pipeline, m)
+                    names = out_names
+                    cur_names = out_cur_names
+                    
+                if len(neighbors) < 1:
+                    # print "not adding, no neighbors"
+                    # don't add it!
+                    continue
+
+                name_function = None
+                base_name = None
+                for function in m.functions:
+                    if function.name == 'name':
+                        name_function = function
+                        if len(function.params) > 0:
+                            base_name = function.params[0].strValue
+                if base_name is not None:
+                    cur_names.append(base_name)
+                else:
+                    base_name = neighbors[0][1]
+                    if base_name == 'self':
+                        base_name = neighbors[0][0].name
+                    process_list.append((m, base_name))
+
+        op_list = []
+        for (port_type, names, cur_names, process_list) in \
+                [("input", in_names, in_cur_names, in_process_list), \
+                     ("output", out_names, out_cur_names, out_process_list)]:
+            cur_names.sort()
+            last_name = None
+            for name in cur_names:
+                if name == last_name:
+                    msg = 'Cannot assign the name "%s" to more ' \
+                        'than one %s port' % (name, port_type)
+                    raise RuntimeError(msg)
+                last_name = name
+                idx = name.rfind("_")
+                if idx < 0:
+                    names[name] = 2
+                else:
+                    base_name = None
+                    try:
+                        val = int(name[idx+1:])
+                        base_name = name[:idx]
+                    except ValueError:
+                        pass
+                    if base_name is not None and base_name in names:
+                        cur_val = names[base_name]
+                        if val >= cur_val:
+                            names[base_name] = val + 1
+                    else:
+                        names[name] = 2
+
+            for (m, base_name) in process_list:
+                port_name = create_name(base_name, names)
+                # FIXME use update_function when it is moved to
+                # core (see core_no_gui branch)
+                ops = self.update_function_ops(m, 'name', 
+                                               [port_name])
+                op_list.extend(ops)
+        self.flush_delayed_actions()
+        action = vistrails.core.db.action.create_action(op_list)
+        if action is not None:
+            self.add_new_action(action)
+            self.perform_action(action)
+        return action
+
+    def create_subpipeline(self, full_pipeline, module_ids, connection_ids, 
+                           id_remap, id_scope=None):
+        if not id_scope:
+            id_scope = IdScope(1, {Group.vtType: Module.vtType,
+                                   Abstraction.vtType: Module.vtType})
+        old_id_scope = self.id_scope
+        self.set_id_scope(id_scope)
+        
+        connections = [full_pipeline.connections[c_id] 
+                       for c_id in connection_ids]
+
+        pipeline = Pipeline()
+        pipeline.id = None # get rid of id so that sql saves correctly
+
+        in_names = {}
+        out_names = {}
+        def create_name(base_name, names):
+            if base_name in names:
+                port_name = base_name + '_' + str(names[base_name])
+                names[base_name] += 1
+            else:
+                port_name = base_name
+                names[base_name] = 2
+            return port_name
+
+        for m in full_pipeline.module_list:
+            if m.id not in module_ids:
+                continue
+            if m.package == basic_pkg and (m.name == 'InputPort' or
+                                           m.name == 'OutputPort'):
+                if m.name == 'InputPort':
+                    neighbors = self.get_downstream_neighbors(full_pipeline, m)
+                    names = in_names
+                elif m.name == 'OutputPort':
+                    neighbors = self.get_upstream_neighbors(full_pipeline, m)
+                    names = out_names
+                if len(neighbors) < 1:
+                    # print "not adding, no neighbors"
+                    # don't add it!
+                    continue
+
+                m = m.do_copy(True, id_scope, id_remap)
+                name_function = None
+                for function in m.functions:
+                    if function.name == 'name':
+                        name_function = function
+                        base_name = function.params[0].strValue
+                if name_function is None:
+                    base_name = neighbors[0][1]
+                if base_name == 'self':
+                    base_name = neighbors[0][0].name
+                port_name = create_name(base_name, names)
+                if name_function is not None:
+                    name_function.params[0].strValue = port_name
+                else:
+                    functions = [('name', [port_name])]
+                    for f in self.create_functions(m, functions):
+                        m.add_function(f)
+                pipeline.add_module(m)
+            else:
+                pipeline.add_module(m.do_copy(True, id_scope, id_remap))
+
+        # translate group to center
+        (avg_x, avg_y) = self.get_avg_location(pipeline.module_list)
+        self.translate_modules(pipeline.module_list, avg_x, avg_y)
+        module_index = dict([(m.id, m) for m in pipeline.module_list])
+
+        def create_port(port_type, other_port, other_module, old_module, names):
+            x = old_module.location.x
+            y = old_module.location.y
+            module_name = port_type.capitalize() + 'Port'
+            base_name = other_port.name
+            if base_name == 'self':
+                base_name = other_module.name
+            port_name = create_name(base_name, names)
+            module = self.create_module(basic_pkg, module_name, '', 
+                                        x - avg_x, y - avg_y)
+            functions = [('name', [port_name])]
+            for f in self.create_functions(module, functions):
+                module.add_function(f)
+            
+            return (module, 'InternalPipe', port_name)
+
+        def add_to_pipeline(port_type, port, other_port, names):
+            old_module = full_pipeline.modules[port.moduleId]
+            old_port_name = port.name
+            port_name = other_port.name
+            module_id = id_remap[(Module.vtType, other_port.moduleId)]
+            module = module_index[module_id]
+            key = (module_id, port_name, port_type)
+            if key in existing_ports:
+                (new_module, new_port, new_name) = existing_ports[key]
+            else:
+                (new_module, new_port, new_name) = \
+                    create_port(port_type, other_port, module, 
+                                old_module, names)
+                existing_ports[key] = (new_module, new_port, new_name)
+                pipeline.add_module(new_module)
+                if port_type == 'input':
+                    # print "output:", new_module.name, new_module.id, new_name
+                    # print "input:", module.name, module.id, port_name
+                    new_conn = self.create_connection(new_module, new_port,
+                                                      module, port_name)
+                elif port_type == 'output':
+                    # print "output:", module.name, module.id, port_name  
+                    # print "input:", new_module.name, new_module.id, new_name
+                    new_conn = self.create_connection(module, port_name,
+                                                      new_module, new_port)
+                else:
+                    raise VistrailsInternalError("port_type incorrect")
+                pipeline.add_connection(new_conn)
+            return (old_module, old_port_name, new_name)
+            
+
+        outside_connections = []
+        existing_ports = {}
+        for connection in connections:
+            all_inside = True
+            all_outside = True
+            for port in connection.ports:
+                if not (Module.vtType, port.moduleId) in id_remap:
+                    all_inside = False
+                else:
+                    all_outside = False
+
+            # if a connection has an "external" connection, we need to
+            # create an input port or output port module
+            if all_inside:
+                pipeline.add_connection(connection.do_copy(True, id_scope,
+                                                           id_remap))
+            else:
+                old_in_module = None
+                old_out_module = None
+                if (Module.vtType, connection.source.moduleId) not in id_remap:
+                    (old_out_module, old_out_port, old_in_port) = \
+                        add_to_pipeline('input', connection.source, 
+                                        connection.destination, in_names)
+                elif (Module.vtType, connection.destination.moduleId) \
+                        not in id_remap:
+                    (old_in_module, old_in_port, old_out_port) = \
+                        add_to_pipeline('output', connection.destination, 
+                                        connection.source, out_names)
+                outside_connections.append((old_out_module, old_out_port,
+                                            old_in_module, old_in_port))
+
+        self.set_id_scope(old_id_scope)
+        return (pipeline, outside_connections)
+
+    def get_connections_to_subpipeline(self, module, partial_connections):
+        connections = []
+        for (out_module, out_port, in_module, in_port) in partial_connections:
+            if out_module is None:
+                out_module = module
+            if in_module is None:
+                in_module = module
+            connections.append(self.create_connection(out_module, out_port,
+                                                      in_module, in_port))
+        return connections
+
+    def build_group(self, full_pipeline, module_ids, connection_ids):
+        id_remap = {}
+        (pipeline, outside_connections) = \
+            self.create_subpipeline(full_pipeline, module_ids, connection_ids,
+                                    id_remap)
+
+        # now group to vistrail
+        (avg_x, avg_y) = self.get_avg_location([full_pipeline.modules[m_id]
+                                                for m_id in module_ids])
+        group = self.create_module(basic_pkg, 'Group', '', avg_x, avg_y)
+        group.pipeline = pipeline
+
+        connections = \
+            self.get_connections_to_subpipeline(group, outside_connections)
+
+        return (group, connections)
+
+    def build_abstraction(self, full_pipeline, module_ids, 
+                          connection_ids, name):
+        id_remap = {}
+        (pipeline, outside_connections) = \
+            self.create_subpipeline(full_pipeline, module_ids, connection_ids, 
+                                    id_remap)
+        
+        # save vistrail
+        abs_vistrail = self.create_vistrail_from_pipeline(pipeline)
+        abs_vistrail.name = name
+        abs_vistrail.change_description("Copied from pipeline", 1L)
+        abs_fname = self.save_abstraction(abs_vistrail)
+
+        # need to late enable stuff on the abstraction_pkg package
+        self.add_abstraction_to_registry(abs_vistrail, abs_fname, name, 
+                                         None, "1")
+        namespace = get_cur_abs_namespace(abs_vistrail)
+        (avg_x, avg_y) = self.get_avg_location([full_pipeline.modules[m_id]
+                                                for m_id in module_ids])
+        abstraction = self.create_module(abstraction_pkg, name, namespace, 
+                                         avg_x, avg_y, 1L)
+        connections = self.get_connections_to_subpipeline(abstraction, 
+                                                          outside_connections)
+        return (abstraction, connections)
+
+    def build_abstraction_from_group(self, full_pipeline, group_id, name):
+        if name is None:
+            return
+        group = self.current_pipeline.modules[group_id]
+        abs_vistrail = self.create_vistrail_from_pipeline(group.pipeline)
+        abs_vistrail.name = name
+        abs_vistrail.change_description("Created from group", 1L)
+        abs_fname = self.save_abstraction(abs_vistrail)
+
+        group_connections = self.get_connections_to_and_from(full_pipeline,
+                                                             [group_id])
+        outside_connections = []
+        for c in group_connections:
+            out_module = full_pipeline.modules[c.source.moduleId]
+            out_port = c.source.name
+            in_module = full_pipeline.modules[c.destination.moduleId]
+            in_port = c.destination.name
+            if c.source.moduleId == group_id:
+                out_module = None
+            if c.destination.moduleId == group.id:
+                in_module = None
+            outside_connections.append((out_module, out_port, 
+                                        in_module, in_port))
+
+        # need to late enable stuff on the 'local.abstractions' package
+        self.add_abstraction_to_registry(abs_vistrail, abs_fname, name,
+                                         None, "1")
+        namespace = get_cur_abs_namespace(abs_vistrail)
+        abstraction = self.create_module(abstraction_pkg, name, namespace, 
+                                         group.location.x, group.location.y, 
+                                         1L)
+        connections = self.get_connections_to_subpipeline(abstraction, 
+                                                          outside_connections)
+        return (abstraction, connections)
+
+    def create_vistrail_from_pipeline(self, pipeline):
+        abs_vistrail = Vistrail()
+        
+        id_remap = {}
+        action = vistrails.core.db.action.create_paste_action(pipeline, 
+                                                    abs_vistrail.idScope,
+                                                    id_remap)
+        abs_vistrail.add_action(action, 0L, 0)
+        return abs_vistrail
+        
+    def get_abstraction_dir(self):
+        conf = get_vistrails_configuration()
+        if conf.check('abstractionsDirectory'):
+            abstraction_dir = conf.abstractionsDirectory
+            if not os.path.exists(abstraction_dir):
+                raise VistrailsInternalError("Cannot find %s" % \
+                                                 abstraction_dir)
+            return abstraction_dir
+        else:
+            raise VistrailsInternalError("'abstractionsDirectory' not"
+                                         " specified in configuration")
+        return None
+
+    def get_abstraction_desc(self, package, name, namespace, module_version=None):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        if reg.has_descriptor_with_name(package, name, namespace,
+                                        None, module_version):
+            return reg.get_descriptor_by_name(package, name,
+                                              namespace, None, module_version)
+        return None
+
+    def add_abstraction_to_registry(self, abs_vistrail, abs_fname, name, 
+                                    namespace=None, module_version=None,
+                                    is_global=True, avail_fnames=[]):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        cur_namespace = get_cur_abs_namespace(abs_vistrail)
+        if namespace is None:
+            namespace = cur_namespace
+        if module_version is None:
+            module_version = -1L
+
+        self.ensure_abstractions_loaded(abs_vistrail, avail_fnames)
+        try:
+            abstraction = new_abstraction(name, abs_vistrail, abs_fname,
+                                          long(module_version))
+        except InvalidPipeline, e:
+            # handle_invalid_pipeline will raise it's own InvalidPipeline
+            # exception if it fails
+            
+            # use a new controller that is tied to the abstraction
+            # vistrail to process exceptions, also force upgrades to
+            # be immediately incorporated, use self.__class_ to create
+            # controller so user is prompted if in GUI mode
+            abs_controller = self.__class__(abs_vistrail, auto_save=False)
+            (new_version, new_pipeline) = \
+                abs_controller.handle_invalid_pipeline(e, long(module_version),
+                                                       force_no_delay=True) 
+            try:
+                abstraction = new_abstraction(name, abs_vistrail, abs_fname,
+                                              new_version)
+            except InvalidPipeline, e:
+                # we need to process a second InvalidPipeline exception
+                # because the first may be simply for a missing package,
+                # then we hit upgrades with the second one
+
+                (new_version, new_pipeline) = \
+                    abs_controller.handle_invalid_pipeline(e, new_version,
+                                                           force_no_delay=True)
+            del abs_controller
+
+            save_abstraction(abs_vistrail, abs_fname)
+            self.set_changed(True)
+            abstraction = new_abstraction(name, abs_vistrail, abs_fname,
+                                          new_version, new_pipeline)
+            module_version = str(new_version)
+
+        all_namespaces = get_all_abs_namespaces(abs_vistrail)
+
+        old_desc = None
+        for ns in all_namespaces:
+            try:
+                desc = reg.get_similar_descriptor(abstraction_pkg,
+                                                  name,
+                                                  ns)
+                if not desc.is_hidden:
+                    old_desc = desc
+                    # print "found old_desc", old_desc.name, old_desc.version
+                    break
+            except ModuleRegistryException, e:
+                pass
+            
+        global_hide = not is_global or old_desc is not None
+        newest_desc = None
+        requested_desc = None
+        for ns in all_namespaces:
+            hide_descriptor = (ns != cur_namespace) or global_hide
+            # print '()()() adding abstraction', namespace
+            if reg.has_descriptor_with_name(abstraction_pkg, 
+                                            name, 
+                                            ns,
+                                            abstraction_ver, 
+                                            str(module_version)):
+                # don't add something twice
+                continue
+            new_desc = reg.auto_add_module((abstraction, 
+                                            {'package': abstraction_pkg,
+                                             'package_version': abstraction_ver,
+                                             'namespace': ns,
+                                             'version': str(module_version),
+                                             'hide_namespace': True,
+                                             'hide_descriptor': hide_descriptor,
+                                             }))
+            if ns == cur_namespace:
+                newest_desc = new_desc
+            if ns == namespace:
+                requested_desc = new_desc
+            reg.auto_add_ports(abstraction)
+        if old_desc is not None:
+            # print '$$$ calling update_module'
+            reg.update_module(old_desc, newest_desc)
+        return requested_desc
+
+#         package = reg.get_package_by_name(abstraction_pkg)
+#         for desc in package.descriptor_versions.itervalues():
+#             print desc.package, desc.name, desc.namespace, desc.version
+
+    def abstraction_exists(self, name):
+        # FIXME need to check directory in case abstraction was not
+        # loaded due to dependencies.
+        # FIXME, also need to check this for groups, probably
+        abstraction_dir = self.get_abstraction_dir()
+        vt_fname = os.path.join(abstraction_dir, name + '.xml')
+        return os.path.exists(vt_fname)
+
+    def load_abstraction(self, abs_fname, is_global=True, abs_name=None,
+                         module_version=None, avail_fnames=[]):
+        if abs_name is None:
+            abs_name = parse_abstraction_name(abs_fname)
+        if abs_fname in self._loaded_abstractions:
+            abs_vistrail = self._loaded_abstractions[abs_fname]
+        else:
+            abs_vistrail = read_vistrail(abs_fname)
+            self._loaded_abstractions[abs_fname] = abs_vistrail
+        
+        # print "LOAD_VT NAMESPACES:", get_all_abs_namespaces(abs_vistrail)
+
+        abstraction_uuid = get_cur_abs_namespace(abs_vistrail)
+        if abstraction_uuid is None:
+            # No current uuid exists - generate one
+            abstraction_uuid = str(uuid.uuid1())
+            abs_vistrail.set_annotation('__abstraction_uuid__', abstraction_uuid)
+        origin_uuid = abs_vistrail.get_annotation('__abstraction_origin_uuid__')
+        if origin_uuid is None:
+            # No origin uuid exists - set to current uuid (for backwards compatibility)
+            origin_uuid = abstraction_uuid
+            abs_vistrail.set_annotation('__abstraction_origin_uuid__', origin_uuid)
+        else:
+            origin_uuid = origin_uuid.value
+            
+        if module_version is None:
+            module_version = str(abs_vistrail.get_latest_version())
+        elif isinstance(module_version, (int, long)):
+            module_version = str(module_version)
+        # If an upgraded version has already been created, we want to use that rather than loading the old version.
+        # This step also avoid duplication of abstraction upgrades.  Otherwise, when we try to add the old version
+        # to the registry, it raises an InvalidPipeline exception and automatically tries to handle it by creating
+        # another upgrade for the old version.
+        upgrade_version = abs_vistrail.get_upgrade(long(module_version))
+        if upgrade_version is not None:
+            old_version = module_version
+            module_version = str(upgrade_version)
+        
+        desc = self.get_abstraction_desc(abstraction_pkg, abs_name, 
+                                         abstraction_uuid, module_version)
+        if desc is None:
+            #print "adding version", module_version, "of", abs_name, "(namespace: %s)"%abstraction_uuid, "to registry"
+            desc = self.add_abstraction_to_registry(abs_vistrail, abs_fname, 
+                                                    abs_name, None, 
+                                                    module_version, 
+                                                    is_global, avail_fnames)
+            #if desc.version != module_version:
+                #print "upgraded version", module_version, "of", abs_name, "(namespace: %s)"%abstraction_uuid, "to version", desc.version, "and namespace", desc.namespace
+#        else:
+#            if upgrade_version is not None:
+#                print "version", old_version, "of", abs_name, "(namespace: %s)"%abstraction_uuid, "already in registry as upgraded version", module_version
+#            else:
+#                print "version", module_version, "of", abs_name, "(namespace: %s)"%abstraction_uuid, "already in registry"
+        return desc
+    
+    def unload_abstractions(self):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        for abs_fname, abs_vistrail in self._loaded_abstractions.iteritems():
+            abs_name = parse_abstraction_name(abs_fname)
+            # FIXME? do we need to remove all versions (call
+            # delete_module over and over?)
+            for namespace in get_all_abs_namespaces(abs_vistrail):
+                try:
+                    reg.delete_module(abstraction_pkg, abs_name, namespace)
+                except:
+                    pass
+        self._loaded_abstractions.clear()
+
+        # for abs_fname, abs_vistrail in self._loaded_abstractions.iteritems():
+        #     abs_desc_info = abs_vistrail.get_annotation('__abstraction_descriptor_info__')
+        #     if abs_desc_info is not None:
+        #         abs_desc_info = eval(abs_desc_info.value)
+        #         # Don't unload package abstractions that have been
+        #         # upgraded by this controller (during a manual version
+        #         # upgrade) because that would also unload the version
+        #         # in the module palette
+        #         if abs_desc_info[2] == abs_vistrail.get_annotation('__abstraction_uuid__').value:
+        #             continue
+        #     abs_name = parse_abstraction_name(abs_fname)
+        #     abs_namespace = abs_vistrail.get_annotation('__abstraction_uuid__').value
+        #     try:
+        #         descriptor = self.get_abstraction_descriptor(abs_name, abs_namespace)
+        #         print "removing all versions of", abs_name, "from registry (namespace: %s)"%abs_namespace
+        #         while descriptor is not None:
+        #             reg = core.modules.module_registry.get_module_registry()
+        #             reg.delete_module(abstraction_pkg, abs_name, abs_namespace)
+        #             descriptor = self.get_abstraction_descriptor(abs_name, abs_namespace)
+        #     except:
+        #         # No versions of the abstraction exist in the registry now
+        #         pass
+        # self._loaded_abstractions.clear()
+
+#    def update_abstraction(self, abstraction, new_actions):
+#        module_version = abstraction.internal_version
+#        if isinstance(module_version, basestring):
+#            module_version = int(module_version)
+#        abstraction_uuid = \
+#            abstraction.vistrail.get_annotation('__abstraction_uuid__').value
+#        upgrade_action = self.create_upgrade_action(new_actions) 
+#        
+#        a = (abstraction.vistrail, 
+#             module_version)
+#        
+#        desc = self.get_abstraction_desc(abstraction.name, abstraction_uuid,
+#                                         new_version)
+#        if desc is None:
+#            # desc = self.add_abstraction_to_registry(abstraction.vistrail,
+#            # abstraction.
+#            pass
+#        # FIXME finish this!
+                                         
+                                         
+        
+
+    def manage_package_names(self, vistrail, package):
+        vistrail = copy.copy(vistrail)
+        dependencies = []
+        for action in vistrail.actions:
+            for operation in action.operations:
+                if (operation.vtType == 'add' or 
+                    operation.vtType == 'change'):
+                    if (operation.what == 'abstraction' and 
+                        operation.data.package == abstraction_pkg):
+                        operation.data.package = package
+                    elif (operation.what == 'abstraction' or
+                          operation.what == 'module' or
+                          operation.what == 'group'):
+                        dependencies.append(operation.data.package)
+                    
+        return (vistrail, dependencies)
+
+    def save_abstraction(self, vistrail, name=None, package=None, 
+                         save_dir=None, overwrite=False):
+        if (package is None) != (save_dir is None):
+            raise VistrailsInternalError("Must set both package and "
+                                         "save_dir or neither")
+        if name is None:
+            name = vistrail.name
+
+        if package is None and self.abstraction_exists(name):
+            raise VistrailsInternalError("Abstraction with name '%s' already "
+                                         "exists" % name)
+        
+        # Set uuid's (this is somewhat tricky because of backwards
+        # compatibility - there was originally only
+        # '__abstraction_uuid__' and no origin, so we have to handle
+        # cases where a uuid is set, but hasn't been set as the origin
+        # yet).
+        new_uuid = str(uuid.uuid1())
+        if vistrail.get_annotation('__abstraction_origin_uuid__') is None:
+            # No origin uuid exists
+            current_uuid = vistrail.get_annotation('__abstraction_uuid__')
+            if current_uuid is None:
+                # No current uuid exists - generate one and use it as
+                # origin and current uuid
+                vistrail.set_annotation('__abstraction_origin_uuid__', new_uuid)
+                # vistrail.set_annotation('__abstraction_uuid__', new_uuid)
+            else:
+                # A current uuid exists - set it as origin and
+                # generate a new current uuid
+                vistrail.set_annotation('__abstraction_origin_uuid__', 
+                                        current_uuid.value)
+                # vistrail.set_annotation('__abstraction_uuid__', str(uuid.uuid1()))
+        # else:
+        #     # Origin uuid exists - just generate a new current uuid
+        #     vistrail.set_annotation('__abstraction_uuid__', str(uuid.uuid1()))
+        annotation_key = get_next_abs_annotation_key(vistrail)
+        vistrail.set_annotation(annotation_key, new_uuid)
+
+        if save_dir is None:
+            save_dir = self.get_abstraction_dir()
+        vt_fname = os.path.join(save_dir, name + '.xml')
+        if not overwrite and os.path.exists(vt_fname):
+            raise VistrailsInternalError("'%s' already exists" % \
+                                             vt_fname)
+        vistrails.core.db.io.save_vistrail_to_xml(vistrail, vt_fname)
+        return vt_fname
+
+    def upgrade_abstraction_module(self, module_id, test_only=False):
+        """upgrade_abstraction_module(module_id, test_only) -> None or
+        (preserved: bool, missing_ports: list)
+
+        If test_only is False, attempts to automatically upgrade an
+        abstraction by adding a new abstraction with the current package
+        version, and recreates all connections and functions.  If any
+        of the ports/functions used are not available, they are not
+        reconnected/readded to the new abstraction.
+        
+        If test_only is True, (preserved: bool, missing_ports: list)
+        is returned, where 'preserved' is a boolean that is True
+        if the abstraction can be replaced with all functions and
+        connections preserved.  If 'preserved' is True, then
+        'missing_ports' is an empty list, otherwise it contains a
+        list of tuples (port_type: str, port_name: str) of all
+        ports that have been removed.
+        
+        """
+        # get the new descriptor first
+        invalid_module = self.current_pipeline.modules[module_id]
+        # make sure that we don't get an obselete descriptor
+        invalid_module._module_descriptor = None
+        abs_fname = invalid_module.module_descriptor.module.vt_fname
+        #print "&&& abs_fname", abs_fname
+        (path, prefix, abs_name, abs_namespace, suffix) = \
+            parse_abstraction_name(abs_fname, True)
+        # abs_vistrail = invalid_module.vistrail
+        abs_vistrail = read_vistrail(abs_fname)
+        abs_namespace = get_cur_abs_namespace(abs_vistrail)
+        lookup = {(abs_name, abs_namespace): abs_fname}
+        descriptor_info = invalid_module.descriptor_info
+        newest_version = str(abs_vistrail.get_latest_version())
+        #print '&&& check_abstraction', abs_namespace, newest_version
+        d = self.check_abstraction((descriptor_info[0],
+                                    descriptor_info[1],
+                                    abs_namespace,
+                                    descriptor_info[3],
+                                    newest_version),
+                                   lookup)
+
+        failed = True
+        src_ports_gone = {}
+        dst_ports_gone = {}
+        fns_gone = {}
+        missing_ports = []
+        check_upgrade = UpgradeWorkflowHandler.check_upgrade
+        while failed:
+            try:
+                check_upgrade(self.current_pipeline, module_id, d, 
+                              function_remap=fns_gone, 
+                              src_port_remap=src_ports_gone, 
+                              dst_port_remap=dst_ports_gone)
+                if test_only:
+                    return (len(missing_ports) == 0, missing_ports)
+                failed = False
+            except UpgradeWorkflowError, e:
+                if test_only:
+                    missing_ports.append((e._port_type, e._port_name))
+                if e._module is None or e._port_type is None or \
+                        e._port_name is None:
+                    raise e
+                # Remove the offending connection/function by remapping to None
+                if e._port_type == 'output':
+                    src_ports_gone[e._port_name] = None
+                elif e._port_type == 'input':
+                    dst_ports_gone[e._port_name] = None
+                    fns_gone[e._port_name] = None
+                else:
+                    raise e
+        upgrade_action = \
+            UpgradeWorkflowHandler.replace_module(self, self.current_pipeline,
+                                                  module_id, d, 
+                                                  fns_gone,
+                                                  src_ports_gone,
+                                                  dst_ports_gone)[0]
+        self.flush_delayed_actions()
+        self.add_new_action(upgrade_action)
+        self.perform_action(upgrade_action)
+        self.vistrail.change_description("Upgrade Subworkflow", 
+                                         self.current_version)
+
+    def get_abstraction_descriptor(self, name, namespace=None):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        return reg.get_descriptor_by_name(abstraction_pkg, name, namespace)
+
+#     def load_abstraction(self, abs_fname, abs_name=None):
+#         if abs_name is None:
+#             abs_name = os.path.basename(abs_fname)[12:-4]
+#         abs_vistrail = read_vistrail(abs_fname)
+#         abstraction_uuid = \
+#             abs_vistrail.get_annotation('__abstraction_uuid__').value
+#         if self.abstraction_exists(abs_name):
+#             descriptor = self.get_abstraction_descriptor(abs_name)
+#             if descriptor.module.uuid == abstraction_uuid:
+#                 return
+#         if self.abstraction_exists(abs_name, abstraction_uuid):
+#             descriptor = \
+#                 self.get_abstraction_descriptor(abs_name, abstraction_uuid)
+#             descriptor._abstraction_refs += 1
+#             # print 'load ref_count:', descriptor.abstraction_refs
+#             return
+            
+#         self.add_abstraction(abs_vistrail, abs_fname, abs_name, 
+#                              abstraction_uuid)
+            
+#    def unload_abstraction(self, name, namespace):
+#        if self.abstraction_exists(name):
+#            descriptor = self.get_abstraction_descriptor(name, namespace)
+#            descriptor._abstraction_refs -= 1
+#            # print 'unload ref_count:', descriptor.abstraction_refs
+#            if descriptor._abstraction_refs < 1:
+#                # unload abstraction
+#                print "deleting module:", name, namespace
+#                reg = core.modules.module_registry.get_module_registry()
+#                reg.delete_module(abstraction_pkg, name, namespace)
+
+    def import_abstraction(self, new_name, package, name, namespace, 
+                           module_version=None):
+        # copy from a local namespace to local.abstractions
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        descriptor = self.get_abstraction_desc(package, name, namespace, str(module_version))
+        if descriptor is None:
+            # if not self.abstraction_exists(name):
+            raise VistrailsInternalError("Abstraction %s|%s (package: %s) not on registry" %\
+                                             (name, namespace, package))
+        # FIXME have save_abstraction take abs_fname as argument and do
+        # shutil copy
+        # abs_fname = descriptor.module.vt_fname
+        abs_vistrail = descriptor.module.vistrail
+        # Strip the descriptor info annotation before saving so the imported version will be editable
+        abs_desc_info = abs_vistrail.get_annotation('__abstraction_descriptor_info__')
+        if abs_desc_info is not None:
+            abs_vistrail.set_annotation('__abstraction_descriptor_info__', None)
+        abs_fname = self.save_abstraction(abs_vistrail, new_name)
+        # Duplicate the vistrail and set the uuid and descriptor annotation back on the original vistrail
+        imported_vistrail = read_vistrail(abs_fname)
+        annotation_key = get_next_abs_annotation_key(abs_vistrail)
+        abs_vistrail.set_annotation(annotation_key, namespace)
+        if abs_desc_info is not None:
+            abs_vistrail.set_annotation('__abstraction_descriptor_info__', abs_desc_info.value)
+        #if new_name == name and package == abstraction_pkg:
+        #    reg.show_module(descriptor)
+        #    descriptor.module.vt_fname = abs_fname
+        #else:
+        new_desc = self.add_abstraction_to_registry(imported_vistrail, abs_fname, new_name,
+                                                    None, str(module_version))
+        reg.show_module(new_desc)
+
+    def export_abstraction(self, new_name, pkg_name, dir, package, name, namespace, 
+                           module_version):
+        descriptor = self.get_abstraction_desc(package, name, namespace, module_version)
+        if descriptor is None:
+            raise VistrailsInternalError("Abstraction %s|%s (package: %s) not on registry" %\
+                                             (name, namespace, package))
+        
+        abs_vistrail = descriptor.module.vistrail
+        (abs_vistrail, dependencies) = self.manage_package_names(abs_vistrail, 
+                                                                 pkg_name)
+        abs_fname = self.save_abstraction(abs_vistrail, new_name, pkg_name,
+                                          dir)
+        return (os.path.basename(abs_fname), dependencies)
+    
+    def find_abstractions(self, vistrail, recurse=False):
+        abstractions = {}
+        for action in vistrail.actions:
+            for operation in action.operations:
+                if operation.vtType == 'add' or \
+                        operation.vtType == 'change':
+                    if operation.data is not None and operation.data.vtType == Abstraction.vtType:
+                        abstraction = operation.data
+                        if abstraction.package == abstraction_pkg:
+                            key = abstraction.descriptor_info
+                            if key not in abstractions:
+                                abstractions[key] = []
+                            abstractions[key].append(abstraction)
+        if recurse:
+            for abstraction_list in abstractions.values():
+                for abstraction in abstraction_list[:]:
+                    try:
+                        vistrail = abstraction.vistrail
+                    except MissingPackageVersion, e:
+                        try:
+                            reg = vistrails.core.modules.module_registry.get_module_registry()
+                            abstraction._module_descriptor = \
+                                reg.get_similar_descriptor(
+                                                 *abstraction.descriptor_info)
+                            vistrail = abstraction.vistrail
+                        except Exception, e:
+                            # ignore because there will be a load attempt later 
+                            continue
+                    except Exception, e:
+                        # ignore because there will be a load attempt later 
+                        continue
+                    r_abstractions = self.find_abstractions(vistrail, recurse)
+                    for k,v in r_abstractions.iteritems():
+                        if k not in abstractions:
+                            abstractions[k] = []
+                        abstractions[k].extend(v)
+        return abstractions
+
+    def check_abstraction(self, descriptor_tuple, lookup):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        try:
+            descriptor = reg.get_descriptor_by_name(*descriptor_tuple)
+            if not os.path.exists(descriptor.module.vt_fname):
+                # print "abstraction path doesn't exist"
+                reg.delete_descriptor(descriptor)
+                raise MissingModule(descriptor_tuple[0],
+                                    descriptor_tuple[1],
+                                    descriptor_tuple[2],
+                                    descriptor_tuple[4])
+            return descriptor
+        except MissingPackageVersion, e:
+            if descriptor_tuple[3] != '':
+                new_desc = (descriptor_tuple[0],
+                            descriptor_tuple[1],
+                            descriptor_tuple[2],
+                            '',
+                            descriptor_tuple[4])
+                return self.check_abstraction(new_desc, lookup)
+            else:
+                raise
+        except MissingModuleVersion, e:
+            if descriptor_tuple[4] != '':
+                other_desc = reg.get_descriptor_by_name(descriptor_tuple[0],
+                                                        descriptor_tuple[1],
+                                                        descriptor_tuple[2],
+                                                        descriptor_tuple[3],
+                                                        '')
+                new_desc = \
+                    self.load_abstraction(other_desc.module.vt_fname, 
+                                          False, descriptor_tuple[1],
+                                          descriptor_tuple[4])
+                descriptor_tuple = (new_desc.package, new_desc.name, 
+                                    new_desc.namespace, new_desc.package_version,
+                                    str(new_desc.version))
+                return self.check_abstraction(descriptor_tuple, lookup)
+            else:
+                raise
+        except MissingModule, e:
+            if (descriptor_tuple[1], descriptor_tuple[2]) not in lookup:
+                if (descriptor_tuple[1], None) not in lookup:
+                    raise
+                abs_fnames = lookup[(descriptor_tuple[1], None)]
+            else:
+                abs_fnames = [lookup[(descriptor_tuple[1], descriptor_tuple[2])]]
+            for abs_fname in abs_fnames:
+                new_desc = \
+                    self.load_abstraction(abs_fname, False, 
+                                          descriptor_tuple[1],
+                                          descriptor_tuple[4],
+                                          [v for k, v in lookup.iteritems()
+                                           if k[1] != None])
+                descriptor_tuple = (new_desc.package, new_desc.name, 
+                                    new_desc.namespace, new_desc.package_version,
+                                    str(new_desc.version))
+            return self.check_abstraction(descriptor_tuple, lookup)
+        return None
+        
+    def ensure_abstractions_loaded(self, vistrail, abs_fnames):
+        lookup = {}
+        for abs_fname in abs_fnames:
+            path, prefix, abs_name, abs_namespace, suffix = parse_abstraction_name(abs_fname, True)
+            # abs_name = os.path.basename(abs_fname)[12:-4]
+            lookup[(abs_name, abs_namespace)] = abs_fname
+            if (abs_name, None) not in lookup:
+                lookup[(abs_name, None)] = []
+            lookup[(abs_name, None)].append(abs_fname)
+            
+        # we're going to recurse manually (see
+        # add_abstraction_to_regsitry) because we can't call
+        # abstraction.vistrail until the module is loaded.
+        abstractions = self.find_abstractions(vistrail)
+        for descriptor_info, abstraction_list in abstractions.iteritems():
+            # print 'checking for abstraction "' + str(abstraction.name) + '"'
+            try:
+                descriptor = self.check_abstraction(descriptor_info,
+                                                    lookup)
+                for abstraction in abstraction_list:
+                    abstraction.module_descriptor = descriptor
+            except InvalidPipeline, e:
+                debug.critical("Error loading abstraction '%s'" % \
+                               descriptor_info[1], str(e))
+            
+    def build_ungroup(self, full_pipeline, module_id):
+
+        group = full_pipeline.modules[module_id]
+        if group.vtType == Group.vtType:
+            pipeline = group.pipeline
+        elif group.vtType == Abstraction.vtType:
+            pipeline = group.summon().pipeline
+        else:
+            print 'not a group or abstraction?'
+            return
+      
+        pipeline.ensure_connection_specs()
+
+        modules = []
+        connections = []
+        id_remap = {}
+        for module in pipeline.module_list:
+            # FIXME have better checks for this
+            if module.package != basic_pkg or (module.name != 'InputPort' and
+                                               module.name != 'OutputPort'):
+                modules.append(module.do_copy(True, self.id_scope, id_remap))
+        self.translate_modules(modules, -group.location.x, -group.location.y)
+        module_index = dict([(m.id, m) for m in modules])
+
+        open_ports = {}
+        for connection in pipeline.connection_list:
+            all_inside = True
+            all_outside = True
+            for port in connection.ports:
+                if (Module.vtType, port.moduleId) not in id_remap:
+                    all_inside = False
+                else:
+                    all_outside = False
+            
+            if all_inside:
+                connections.append(connection.do_copy(True, self.id_scope, 
+                                                      id_remap))
+            else:
+                if (Module.vtType, connection.source.moduleId) not in id_remap:
+                    port_module = \
+                        pipeline.modules[connection.source.moduleId]
+                    port_type = 'input'
+                elif (Module.vtType, connection.destination.moduleId) \
+                        not in id_remap:
+                    port_module = \
+                        pipeline.modules[connection.destination.moduleId]
+                    port_type = 'output'
+                else:
+                    continue
+
+                (port_name, _, _, neighbors) = \
+                    group.get_port_spec_info(port_module)
+                new_neighbors = \
+                    [(module_index[id_remap[(Module.vtType, m.id)]], n)
+                     for (m, n) in neighbors
+                     if (Module.vtType, m.id) in id_remap]
+                open_ports[(port_name, port_type)] = new_neighbors        
+
+        for connection in full_pipeline.connection_list:
+            if connection.source.moduleId == group.id:
+                key = (connection.source.name, 'output')
+                if key not in open_ports:
+                    continue
+                neighbors = open_ports[key]
+                input_module = \
+                    full_pipeline.modules[connection.destination.moduleId]
+                input_port = connection.destination.name
+                for (output_module, output_port) in neighbors:
+                    connections.append(self.create_connection(output_module,
+                                                              output_port,
+                                                              input_module,
+                                                              input_port))
+            elif connection.destination.moduleId == group.id:
+                key = (connection.destination.name, 'input')
+                if key not in open_ports:
+                    continue
+                neighbors = open_ports[key]
+                output_module = \
+                    full_pipeline.modules[connection.source.moduleId]
+                output_port = connection.source.name
+                for (input_module, input_port) in neighbors:
+                    connections.append(self.create_connection(output_module, 
+                                                              output_port,
+                                                              input_module, 
+                                                              input_port))
+        # end for
+
+        return (modules, connections)
+
+    def find_thumbnails(self, tags_only=True):
+        thumbnails = []
+        thumb_cache = ThumbnailCache.getInstance()
+        for action in self.vistrail.actions:
+            if self.vistrail.has_thumbnail(action.id):
+                thumbnail = self.vistrail.get_thumbnail(action.id)
+                if tags_only and not self.vistrail.has_tag(action.timestep):
+                    thumb_cache.remove(thumbnail)
+                    self.vistrail.set_thumbnail(action.timestep, "")
+                else:
+                    abs_fname = thumb_cache.get_abs_name_entry(thumbnail)
+                    if abs_fname is not None:
+                        thumbnails.append(abs_fname)
+                    else:
+                        self.vistrail.set_thumbnail(action.timestep, "")
+        return thumbnails
+    
+    def add_parameter_changes_from_execution(self, pipeline, version,
+                                             parameter_changes):
+        """add_parameter_changes_from_execution(pipeline, version,
+        parameter_changes) -> int.
+
+        Adds new versions to the current vistrail as a result of an
+        execution. Returns the version number of the new version."""
+
+        current_pipeline = self.current_pipeline
+        current_version = self.current_version
+
+        self.current_pipeline = pipeline
+        self.current_version = version
+
+        op_list = []
+        for (m_id, function_name, param_values) in parameter_changes:
+            try:
+                param_values_len = len(param_values)
+            except TypeError:
+                param_values = [param_values]
+            # FIXME should use registry to determine parameter types
+            # and then call the translate_to_string method on each
+            # parameter
+            param_values = [str(x) for x in param_values]
+            module = self.current_pipeline.modules[m_id]
+            # FIXME remove this code when aliases move
+            old_id = -1
+            for old_function in module.functions:
+                if old_function.name == function_name:
+                    old_id = old_function.real_id
+
+            # ensure that replacements don't happen for functions that
+            # shouldn't be replaced
+            aliases = []
+            if old_id >= 0:
+                function = module.function_idx[old_id]
+                for i in xrange(len(param_values)):
+                    aliases.append(function.params[i].alias)
+                    
+            op_list.extend(self.update_function_ops(module, function_name, 
+                                                    param_values,
+                                                    should_replace=True, 
+                                                    aliases=aliases))
+
+        action = vistrails.core.db.action.create_action(op_list)
+        self.add_new_action(action)
+
+        self.current_pipeline = current_pipeline
+        self.current_version = current_version
+        
+        return action.id
+    
+    ##########################################################################
+    # Workflow Execution
+    
+    def execute_workflow_list(self, vistrails):
+        """execute_workflow_list(vistrails: list) -> (results, bool)"""
+
+        stop_on_error = getattr(get_vistrails_configuration(),
+                                'stopOnError')
+        interpreter = get_default_interpreter()
+        changed = False
+        results = []
+        for vis in vistrails:
+            error = None
+            (locator, version, pipeline, view, aliases, params, reason, sinks, extra_info) = vis
+            temp_folder_used = False
+            if (not extra_info or not extra_info.has_key('pathDumpCells') or 
+                not extra_info['pathDumpCells']):
+                if extra_info is None:
+                    extra_info = {}
+                extra_info['pathDumpCells'] = create_temp_folder(prefix='vt_thumb')
+                temp_folder_used = True
+#           
+            kwargs = {'locator': locator,
+                      'current_version': version,
+                      'view': view,
+                      'logger': self.get_logger(),
+                      'controller': self,
+                      'aliases': aliases,
+                      'params': params,
+                      'reason': reason,
+                      'sinks': sinks,
+                      'extra_info': extra_info,
+                      'stop_on_error': stop_on_error,
+                      }    
+            if self.get_vistrail_variables():
+                kwargs['vistrail_variables'] = \
+                    self.get_vistrail_variable_by_uuid
+            result = interpreter.execute(pipeline, **kwargs)
+            
+            thumb_cache = ThumbnailCache.getInstance()
+            
+            if len(result.errors) == 0 and \
+            (thumb_cache.conf.autoSave or 'compare_thumbnails' in extra_info):
+                old_thumb_name = self.vistrail.get_thumbnail(version)
+                if 'compare_thumbnails' in extra_info:
+                    old_thumb_name = None
+                fname = thumb_cache.add_entry_from_cell_dump(
+                                        extra_info['pathDumpCells'],
+                                        old_thumb_name)
+                if 'compare_thumbnails' in extra_info:
+                    # check thumbnail difference
+                    prev = None
+                    if self.vistrail.has_thumbnail(version):
+                        prev = thumb_cache.get_abs_name_entry(self.vistrail.get_thumbnail(version))
+                    elif version in self.vistrail.actionMap and \
+                        int(self.vistrail.get_upgrade(self.vistrail.actionMap[version].parent)) == version and \
+                        self.vistrail.has_thumbnail(self.vistrail.actionMap[version].parent):
+                        prev = thumb_cache.get_abs_name_entry(self.vistrail.get_thumbnail(self.vistrail.actionMap[version].parent))
+                    else:
+                        error = CompareThumbnailsError("No thumbnail exist for version %s" % version)
+                    if prev:
+                        if not prev:
+                            error = CompareThumbnailsError("No thumbnail file exist for version %s" % version)
+                        elif not fname:
+                            raise CompareThumbnailsError("No thumbnail generated")
+                        else:
+                            next = thumb_cache.get_abs_name_entry(fname)
+                            if not next:
+                                raise CompareThumbnailsError("No thumbnail file generated for version %s" % version)
+                            else:
+                                min_err = extra_info['compare_thumbnails'](prev, next)
+                                treshold = 0.1
+                                if min_err > treshold:
+                                    raise CompareThumbnailsError("Thumbnails are different with value %s" % min_err, prev, next)
+
+                if fname is not None:
+                    self.vistrail.set_thumbnail(version, fname)
+                    changed = True
+              
+            if temp_folder_used:
+                remove_temp_folder(extra_info['pathDumpCells'])
+            
+            if result.parameter_changes:
+                l = result.parameter_changes
+                self.add_parameter_changes_from_execution(pipeline, version, l)
+                changed = True
+            
+            results.append(result)
+            if error:
+                result.errors[version] = error
+                return ([result], False)
+        if self.logging_on():
+            self.set_changed(True)
+            
+        if interpreter.debugger:
+            interpreter.debugger.update_values()
+        return (results,changed)
+    
+    def execute_current_workflow(self, custom_aliases=None, custom_params=None,
+                                 extra_info=None, reason='Pipeline Execution',
+                                 sinks=None):
+        """ execute_current_workflow(custom_aliases: dict, 
+                                     custom_params: list,
+                                     extra_info: dict) -> (list, bool)
+        Execute the current workflow (if exists)
+        custom_params is a list of tuples (vttype, oId, newval) with new values
+        for parameters
+        extra_info is a dictionary containing extra information for execution.
+        As we want to make the executions thread safe, we will pass information
+        specific to each pipeline through extra_info
+        As, an example, this will be useful for telling the spreadsheet where
+        to dump the images.
+        """
+        self.flush_delayed_actions()
+        if self.current_pipeline:
+            locator = self.get_locator()
+            if locator:
+                locator.clean_temporaries()
+                if self._auto_save:
+                    locator.save_temporary(self.vistrail)
+            view = DummyView()
+            return self.execute_workflow_list([(self.locator,
+                                                self.current_version,
+                                                self.current_pipeline,
+                                                view,
+                                                custom_aliases,
+                                                custom_params,
+                                                reason,
+                                                sinks,
+                                                extra_info)])
+
+    def recompute_terse_graph(self):
+        # get full version tree (including pruned nodes) this tree is
+        # kept updated all the time. This data is read only and should
+        # not be updated!
+        fullVersionTree = self.vistrail.tree.getVersionTree()
+
+        # create tersed tree
+        x = [(0,None)]
+        tersedVersionTree = Graph()
+
+        # cache actionMap and tagMap because they're properties, sort
+        # of slow
+        am = self.vistrail.actionMap
+        tm = self.vistrail.get_tagMap()
+        last_n = self.vistrail.getLastActions(self.num_versions_always_shown)
+
+        while 1:
+            try:
+                (current,parent)=x.pop()
+            except IndexError:
+                break
+
+            # mount childs list
+            if current in am and self.vistrail.is_pruned(current):
+                children = []
+            else:
+                children = \
+                    [to for (to, _) in fullVersionTree.adjacency_list[current]
+                     if (to in am) and (not self.vistrail.is_pruned(to) or \
+                                            to == self.current_version)]
+
+            if (self.full_tree or
+                (current == 0) or  # is root
+                (current in tm) or # hasTag:
+                (len(children) <> 1) or # not oneChild:
+                (current == self.current_version) or # isCurrentVersion
+                (am[current].expand) or  # forced expansion
+                (current in last_n)): # show latest
+
+                # yes it will!  this needs to be here because if we
+                # are refining version view receives the graph without
+                # the non matching elements
+                if( (not self.refine) or
+                    (self.refine and not self.search) or
+                    (current == 0) or
+                    (self.refine and self.search and
+                     self.search.match(self.vistrail,am[current]) or
+                     current == self.current_version)):
+                    # add vertex...
+                    tersedVersionTree.add_vertex(current)
+
+                    # ...and the parent
+                    if parent is not None:
+                        tersedVersionTree.add_edge(parent,current,0)
+
+                    # update the parent info that will be used by the
+                    # childs of this node
+                    parentToChildren = current
+                else:
+                    parentToChildren = parent
+            else:
+                parentToChildren = parent
+
+            for child in reversed(children):
+                x.append((child, parentToChildren))
+
+        self._current_terse_graph = tersedVersionTree
+        self._current_full_graph = self.vistrail.tree.getVersionTree()
+        
+    # def refine_graph(self, step=1.0):
+    #     """ refine_graph(step: float in [0,1]) -> (Graph, Graph)
+    #     Refine the graph of the current vistrail based the search
+    #     status of the controller. It also return the full graph as a
+    #     reference
+                     
+    #     """
+        
+    #     if self._current_full_graph is None:
+    #         self.recompute_terse_graph()
+    #     return (self._current_terse_graph, self._current_full_graph,
+    #             self._current_graph_layout)
+
+    def get_latest_version_in_graph(self):
+        if not self._current_terse_graph:
+            # DAK do we want refine_graph here?
+            # (current, full, layout) = self.refine_graph()
+            self.recompute_terse_graph()
+        if self._current_terse_graph:
+            return max(self._current_terse_graph.iter_vertices())
+        return max(self.actions)
+
+    def select_latest_version(self):
+        """ select_latest_version() -> None
+        Try to select the latest visible version on the tree
+        
+        """
+        self.change_selected_version(self.get_latest_version_in_graph())
+
+    def enable_missing_package(self, identifier, deps):
+        """callback for try_to_enable_package"""
+        return True
+
+    def install_missing_package(self, identifier):
+        """callback for try_to_enable_package"""
+        return True
+       
+    def try_to_enable_package(self, identifier, dep_graph, confirmed=False):
+        """try_to_enable_package(identifier: str,
+                                 dep_graph: Graph,
+                                 confirmed: boolean)
+        Returns True if changes have been made to the registry, which
+        means reloading a pipeline that previously failed with missing
+        packages might work now.  dep_graph will enable any
+        dependencies.  Setting confirmed to True will bypass prompts
+        for later enables.
+        """
+
+        pm = get_package_manager()
+        pkg = pm.identifier_is_available(identifier)
+        if pkg and not pm.has_package(pkg.identifier):
+            deps = pm.all_dependencies(identifier, dep_graph)[:-1]
+            if pkg.identifier in self._asked_packages:
+                return False
+            if not confirmed and \
+                    not self.enable_missing_package(pkg.identifier, deps):
+                self._asked_packages.add(pkg.identifier)
+                return False
+            # Ok, user wants to late-enable it. Let's give it a shot
+            try:
+                pm.late_enable_package(pkg.codepath)
+                pkg = pm.get_package_by_codepath(pkg.codepath)
+                if pkg.identifier != identifier:
+                    # pkg is probably a parent of the "identifier" package
+                    # try to load it
+                    if hasattr(pkg.module, "can_handle_identifier") and \
+                        pkg.module.can_handle_identifier(identifier):
+                        pkg.init_module.load_from_identifier(identifier)
+            except pkg.MissingDependency, e:
+                for dependency in e.dependencies:
+                    print 'MISSING DEPENDENCY:', dependency
+                    if not self.try_to_enable_package(dependency[0], dep_graph,
+                                                      True):
+                        return False
+                return self.try_to_enable_package(pkg.identifier, dep_graph, True)
+            except pkg.InitializationFailed:
+                self._asked_packages.add(pkg.identifier)
+                raise
+            # there's a new package in the system, so we retry
+            # changing the version by recursing, since other
+            # packages/modules might still be needed.
+            self._asked_packages.add(pkg.identifier)
+            return True
+        # identifier may refer to a subpackage
+        if pkg and pkg.identifier != identifier and \
+           hasattr(pkg.module, "can_handle_identifier") and \
+           pkg.module.can_handle_identifier(identifier) and \
+           hasattr(pkg.init_module, "load_from_identifier"):
+            pkg.init_module.load_from_identifier(identifier)
+            return True
+        # Package is not available, let's try to fetch it
+        rep = vistrails.core.packagerepository.get_repository()
+        if rep:
+            codepath = rep.find_package(identifier)
+            if codepath and self.install_missing_package(identifier):
+                rep.install_package(codepath)
+                return self.try_to_enable_package(identifier, dep_graph, True)
+        self._asked_packages.add(identifier)
+        return False
+
+    def set_action_annotation(self, action, key, value, id_scope=None):
+        if id_scope is None:
+            id_scope = self.id_scope
+        if action.has_annotation_with_key(key):
+            old_annotation = action.get_annotation_by_key(key)
+            if old_annotation.value == value:
+                return False
+            action.delete_annotation(old_annotation)
+        if value.strip() != '':
+            annotation = \
+                Annotation(id=id_scope.getNewId(Annotation.vtType),
+                           key=key,
+                           value=value,
+                           )
+            action.add_annotation(annotation)
+
+    def get_upgrade_module_remap(self, actions):
+        """Try to get a module remap when possible.  This uses the fact that
+        most generic actions will have a single delete module action
+        and a single add module action.
+
+        """
+        is_full_remap = True
+        remap = {}
+        for action in actions:
+            d_module_ids = []
+            a_module_ids = []
+            for op in action.operations:
+                if op.vtType == 'delete' and op.what == 'module':
+                    d_module_ids.append(op.db_objectId)
+                if op.vtType == 'add' and op.what == 'module':
+                    a_module_ids.append(op.db_objectId)
+            if len(d_module_ids) == 1 and len(a_module_ids) == 1:
+                remap[(Module.vtType, d_module_ids[0])] = a_module_ids[0]
+            elif len(d_module_ids) + len(a_module_ids) > 0:
+                is_full_remap = False
+        return (remap, is_full_remap)
+
+    def get_simple_upgrade_remap(self, actions):
+        """Try to get module/function/parameter remaps when possible.  This
+        uses the fact that most remaps only changes names and number of
+        deletes/adds are the same and adds are done in the reverse order of
+        deletes.
+        """
+        is_full_remap = True
+        remap = {}
+        for action in actions:
+            delete_ops = []
+            add_ops = []
+            for op in action.operations:
+                if op.vtType == 'delete':
+                    delete_ops.append(op)
+                if op.vtType == 'add':
+                    add_ops.append(op)
+            if len(delete_ops) != len(add_ops):
+                return (remap, False)
+            add_ops.reverse()
+            for deleted, added in zip(delete_ops, add_ops):
+                if deleted.what != added.what:
+                    return (remap, False)
+                if added.what == 'module':
+                    remap[(Module.vtType, deleted.db_objectId)] = added.db_objectId
+                if added.what == 'function':
+                    if len(delete_ops) != len(add_ops):
+                        return (remap, False)
+                    remap[(ModuleFunction.vtType, deleted.db_objectId)] = added.db_objectId
+                if added.what == 'parameter':
+                    if len(delete_ops) != len(add_ops):
+                        return (remap, False)
+                    remap[(ModuleParam.vtType, deleted.db_objectId)] = added.db_objectId
+        return (remap, is_full_remap)
+                            
+    def create_upgrade_action(self, actions):
+        new_action = vistrails.core.db.action.merge_actions(actions)
+        self.set_action_annotation(new_action, Action.ANNOTATION_DESCRIPTION, 
+                                   "Upgrade")
+        return new_action
+
+    def handle_invalid_pipeline(self, e, new_version, vistrail=None,
+                                report_all_errors=False, force_no_delay=False):
+        load_other_versions = False
+        # print 'running handle_invalid_pipeline'
+        if vistrail is None:
+            vistrail = self.vistrail
+        pm = get_package_manager()
+        root_exceptions = e.get_exception_set()
+        missing_packages = {}
+        def process_missing_packages(exception_set):
+            for err in exception_set:
+                err._was_handled = False
+                # print '--- trying to fix', str(err)
+                # FIXME need to get module_id from these exceptions
+                # when possible!  need to integrate
+                # report_missing_module and handle_module_upgrade
+                if isinstance(err, InvalidPipeline):
+                    process_missing_packages(err.get_exception_set())
+                elif isinstance(err, MissingPackage):
+                    #check if the package was already installed before (because
+                    #it was in the dependency list of a previous package
+                    if err._identifier not in missing_packages:
+                        missing_packages[err._identifier] = []
+                    missing_packages[err._identifier].append(err)
+
+        process_missing_packages(root_exceptions)
+        new_exceptions = []
+        
+        dep_graph = pm.build_dependency_graph(missing_packages.keys())
+        # for identifier, err_list in missing_packages.iteritems():
+        for identifier in pm.get_ordered_dependencies(dep_graph):
+            # print 'testing identifier', identifier
+            if not pm.has_package(identifier):
+                try:
+                    # print 'trying to enable package'
+                    if not self.try_to_enable_package(identifier, dep_graph):
+                        pass
+                        # print 'failed to enable package'
+                        # if not report_all_errors:
+                        #     raise err
+                    else:
+                        for err in missing_packages[identifier]:
+                            err._was_handled = True
+                except Exception, new_e:
+                    print '&&& hit other exception'
+                    new_exceptions.append(new_e)
+                    if not report_all_errors:
+                        raise new_e
+            else:
+                if identifier in missing_packages.iterkeys():
+                    for err in missing_packages[identifier]:
+                        err._was_handled = True
+            # else assume the package was already enabled
+
+        if len(new_exceptions) > 0:
+            # got new exceptions
+            pass
+
+        def process_package_versions(exception_set):
+            for err in exception_set:
+                if err._was_handled:
+                    continue
+                if isinstance(err, InvalidPipeline):
+                    process_package_versions(err.get_exception_set())
+                if isinstance(err, MissingPackageVersion):
+                    # try and load other version of package?
+                    err._was_handled = True
+                    pass
+        
+        # instead of upgrading, may wish to load the old version of
+        # the package if possible
+        if load_other_versions:
+            process_package_versions(root_exceptions)
+
+        def process_package_exceptions(exception_set, pipeline):
+            new_actions = []
+            package_errs = {}
+            for err in exception_set:
+                if err._was_handled:
+                    continue
+                # print '+++ trying to fix', str(err)
+                if isinstance(err, InvalidPipeline):
+                    id_scope = IdScope(1, {Group.vtType: Module.vtType,
+                                           Abstraction.vtType: Module.vtType})
+                    id_remap = {}
+                    new_pipeline = err._pipeline.do_copy(True, id_scope, 
+                                                         id_remap)
+                    new_exception_set = []
+                    for sub_err in err.get_exception_set():
+                        key = (Module.vtType, sub_err._module_id)
+                        if key in id_remap:
+                            sub_err._module_id = id_remap[key]
+                            new_exception_set.append(sub_err)
+                        else:
+                            new_exception_set.append(sub_err)
+                            
+                    # set id to None so db saves correctly
+                    new_pipeline.id = None
+                    old_id_scope = self.id_scope
+                    self.id_scope = id_scope
+                    inner_actions = \
+                        process_package_exceptions(new_exception_set,
+                                                   new_pipeline)
+                    self.id_scope = old_id_scope
+                    if len(inner_actions) > 0:
+                        # create action that recreates group/subworkflow
+                        old_module = pipeline.modules[err._module_id]
+                        if old_module.is_group():
+                            my_actions = \
+                                UpgradeWorkflowHandler.replace_group(
+                                self, pipeline, old_module.id, new_pipeline)
+                            for action in my_actions:
+                                pipeline.perform_action(action)
+                            new_actions.extend(my_actions)
+# This code shouldn't ever be reachable because invalid abstraction pipelines are handled when they're initially loaded.
+#                        elif old_module.is_abstraction():
+#                            # add new version to the abstraction
+#                            # then update the current pipeline by replacing
+#                            # abstraction module
+#
+#                            # FIXME finish this code
+#                            my_actions = \
+#                                UpgradeWorkflowHandler.replace_abstraction(
+#                                self, pipeline, old_module.id, inner_actions)
+#                            for action in my_actions:
+#                                pipeline.perform_action(action)
+#                            new_actions.extend(my_actions)
+                        
+                elif (isinstance(err, MissingModule) or 
+                      isinstance(err, MissingPackageVersion) or 
+                      isinstance(err, MissingModuleVersion)):
+                    if err._identifier not in package_errs:
+                        package_errs[err._identifier] = []
+                    package_errs[err._identifier].append(err)
+
+            for identifier, err_list in package_errs.iteritems():
+                try:
+                    pkg = pm.get_package(identifier)
+                except MissingPackage:
+                    # cannot get the package we need
+                    continue
+                details = '\n'.join(str(e) for e in err_list)
+                debug.log('Processing upgrades in package "%s"' %
+                          identifier, details)
+                if pkg.can_handle_all_errors():
+                    try:
+                        actions = pkg.handle_all_errors(self, err_list, 
+                                                        pipeline)
+                        if actions is not None:
+                            for action in actions:
+                                pipeline.perform_action(action)
+                            new_actions.extend(actions)
+                            for err in err_list:
+                                err._was_handled = True
+                    except Exception, new_e:
+                        new_exceptions.append(new_e)
+                        if not report_all_errors:
+                            return new_actions
+#                 elif pkg.can_handle_upgrades():
+#                     print '  handle upgrades'
+#                     for err in err_list:
+#                         try:
+#                             actions = pkg.handle_module_upgrade_request(
+#                                 self, err._module_id, pipeline)
+#                             if actions is not None:
+#                                 print 'handled', pipeline.modules[err._module_id].name
+#                                 for action in actions:
+#                                     pipeline.perform_action(action)
+#                                 new_actions.extend(actions)
+#                                 print 'OK'
+#                                 err._was_handled = True
+#                         except Exception, new_e:
+#                             new_exceptions.append(new_e)
+#                             if not report_all_errors:
+#                                 return
+                else:
+                    # print '  default upgrades'
+                    # process default upgrades
+                    # handler = UpgradeWorkflowHandler(self, pipeline)
+                    for err in err_list:
+                        try:
+                            actions = UpgradeWorkflowHandler.dispatch_request(
+                                self, err._module_id, pipeline)
+                            if actions is not None:
+                                for action in actions:
+                                    pipeline.perform_action(action)
+                                new_actions.extend(actions)
+                                err._was_handled = True
+                        except Exception, new_e:
+                            import traceback
+                            traceback.print_exc()
+                            new_exceptions.append(new_e)
+
+                if pkg.can_handle_missing_modules():
+                    for err in err_list + new_exceptions:
+                        if hasattr(err, '_was_handled') and err._was_handled:
+                            continue
+                        if isinstance(err, MissingModule):
+                            try:
+                                res = pkg.handle_missing_module(self, 
+                                                                err._module_id,
+                                                                pipeline)
+                                # need backward compatibility
+                                if res is True:
+                                    err._was_handled = True
+                                elif res is False:
+                                    pass
+                                else:
+                                    actions = res
+                                    if actions is not None:
+                                        for action in actions:
+                                            pipeline.perform_action(action)
+                                        new_actions.extend(actions)
+                                        err._was_handled = True
+                            except Exception, new_e:
+                                new_exceptions.append(new_e)
+                                if not report_all_errors:
+                                    return new_actions
+            return new_actions
+
+        if get_vistrails_configuration().check('upgradeOn'):
+            cur_pipeline = copy.copy(e._pipeline)
+            # note that cur_pipeline is modified to be the result of
+            # applying the actions in new_actions
+            new_actions = process_package_exceptions(root_exceptions, 
+                                                     cur_pipeline)
+        else:
+            new_actions = []
+            cur_pipeline = e._pipeline
+
+        if len(new_actions) > 0:
+            upgrade_action = self.create_upgrade_action(new_actions)
+            param_exps = self.vistrail.get_paramexps(new_version)
+            new_param_exps = []
+            if len(param_exps) > 0:
+                (module_remap, is_complete) = \
+                                    self.get_upgrade_module_remap(new_actions)
+                if is_complete:
+                    for pe in param_exps:
+                        new_pe = pe.do_copy(True, self.id_scope, module_remap)
+                        new_param_exps.append(new_pe)
+                else:
+                    debug.warning("Cannot translate old parameter "
+                                  "explorations through upgrade.")
+            mashup = None
+            if hasattr(self, "_mashups"):
+                for mashuptrail in self._mashups:
+                    if mashuptrail.vtVersion == new_version:
+                        mashup = mashuptrail
+            new_mashups = []
+            if mashup:
+                (mfp_remap, is_complete) = \
+                                self.get_simple_upgrade_remap(new_actions)
+                if is_complete:
+                    # FIXME: we should move the remapping to the db layer
+                    # But we need to fix the schema by making functions/params
+                    # foreign keys
+
+                    #mashup = mashup.do_copy(True, self.id_scope, mfp_remap)
+                    #mashup.id = uuid.uuid1()
+                    # we move it to the new version so that references still work
+                    self._mashups.remove(mashup)
+                    
+                    for action in mashup.actions:
+                        for alias in action.mashup.aliases:
+                            c = alias.component
+                            if (Module.vtType, c.vtmid) in mfp_remap:
+                                c.vtmid = mfp_remap[(Module.vtType, c.vtmid)]
+                            if (ModuleFunction.vtType,
+                                c.vtparent_id) in mfp_remap:
+                                c.vtparent_id=mfp_remap[(ModuleFunction.vtType,
+                                                         c.vtparent_id)]
+                            if (ModuleParam.vtType, c.vtid) in mfp_remap:
+                                c.vtid = mfp_remap[(ModuleParam.vtType,
+                                                     c.vtid)]
+                    mashup.currentVersion = mashup.getLatestVersion()
+                    
+                    new_mashups.append(mashup)
+                else:
+                    debug.warning("Cannot translate old mashup "
+                                  "through upgrade.")
+            
+            if get_vistrails_configuration().check('upgradeDelay') and not force_no_delay:
+                self._delayed_actions.append(upgrade_action)
+                self._delayed_paramexps.extend(new_param_exps)
+                self._delayed_mashups.extend(new_mashups)
+            else:
+                vistrail.add_action(upgrade_action, new_version, 
+                                    self.current_session)
+                vistrail.set_upgrade(new_version, str(upgrade_action.id))
+                if get_vistrails_configuration().check("migrateTags"):
+                    self.migrate_tags(new_version, upgrade_action.id, vistrail)
+                new_version = upgrade_action.id
+                for pe in new_param_exps:
+                    pe.action_id = new_version
+                    self.vistrail.db_add_parameter_exploration(pe)
+                for mashup in new_mashups:
+                    mashup.vtVersion = self.current_version
+                    for action in mashup.actions:
+                        action.mashup.version = self.current_version
+                    self._mashups.append(mashup)
+
+                self.set_changed(True)
+                self.recompute_terse_graph()
+
+        def check_exceptions(exception_set):
+            unhandled_exceptions = []
+            for err in exception_set:
+                if isinstance(err, InvalidPipeline):
+                    sub_exceptions = check_exceptions(err.get_exception_set())
+                    if len(sub_exceptions) > 0:
+                        new_err = InvalidPipeline(sub_exceptions, 
+                                                  err._pipeline,
+                                                  err._version)
+                        unhandled_exceptions.append(new_err)
+                else:
+                    if not err._was_handled:
+                        unhandled_exceptions.append(err)
+            return unhandled_exceptions
+
+        left_exceptions = check_exceptions(root_exceptions)
+        if len(left_exceptions) > 0 or len(new_exceptions) > 0:
+            details = '\n'.join(set(str(e) for e in left_exceptions + \
+                                    new_exceptions))
+            # debug.critical("Some exceptions could not be handled", details)
+            raise InvalidPipeline(left_exceptions + new_exceptions, 
+                                  cur_pipeline, new_version)
+        return (new_version, cur_pipeline)
+
+    def validate(self, pipeline, raise_exception=True):
+        vistrail_vars = self.get_vistrail_variables()
+        pipeline.validate(raise_exception, vistrail_vars)
+    
+    def do_version_switch(self, new_version, report_all_errors=False, 
+                          do_validate=True, from_root=False):
+        """ do_version_switch(new_version: int,
+                              resolve_all_errors: boolean) -> None        
+        Change the current vistrail version into new_version, reporting
+        either the first error or all errors.
+        
+        """
+
+        # This is tricky code, so watch carefully before you change
+        # it.  The biggest problem is that we want to perform state
+        # changes only after all exceptions have been handled, but
+        # creating a pipeline every time is too slow. The solution
+        # then is to mutate currentPipeline, and in case exceptions
+        # are thrown, we roll back by rebuilding the pipeline from
+        # scratch as the first thing on the exception handler, so to
+        # the rest of the exception handling code, things look
+        # stateless.
+
+        def get_cost(descendant, ancestor):
+            cost = 0
+            am = self.vistrail.actionMap
+            if descendant == -1:
+                descendant = 0
+            while descendant != ancestor:
+                descendant = am[descendant].parent
+                cost += 1
+            return cost
+        
+        def switch_version(version, allow_fail=False):
+            if self.current_version != -1 and not self.current_pipeline:
+                debug.warning("current_version is not -1 and "
+                              "current_pipeline is None")
+            if version != self.current_version:
+                # clear delayed actions
+                # FIXME: invert the delayed actions and integrate them into
+                # the general_action_chain?
+                if len(self._delayed_actions) > 0:
+                    self._delayed_actions = []
+                    self.current_pipeline = Pipeline()
+                    self.current_version = 0
+            if version == -1:
+                return None
+
+            # now we reuse some existing pipeline, even if it's the
+            # empty one for version zero
+            #
+            # The available pipelines are in self._pipelines, plus
+            # the current pipeline.
+            # Fast check: do we have to change anything?
+            if from_root:
+                result = self.vistrail.getPipeline(version)
+            elif version == self.current_version:
+                # we don't even need to check connection specs or
+                # registry
+                return self.current_pipeline
+            # Fast check: if target is cached, copy it and we're done.
+            elif version in self._pipelines:
+                result = copy.copy(self._pipelines[version])
+            else:
+                # Find the closest upstream pipeline to the current one
+                cv = self._current_full_graph.inverse_immutable().closest_vertex
+                closest = cv(version, self._pipelines)
+                cost_to_closest_version = get_cost(version, closest)
+                # Now we have to decide between the closest pipeline
+                # to version and the current pipeline
+                shared_parent = getSharedRoot(self.vistrail, 
+                                              [self.current_version, 
+                                               version])
+                cost_common_to_old = get_cost(self.current_version, 
+                                              shared_parent)
+                cost_common_to_new = get_cost(version, shared_parent)
+                cost_to_current_version = cost_common_to_old + \
+                    cost_common_to_new
+                # FIXME I'm assuming copying the pipeline has zero cost.
+                # Formulate a better cost model
+                if cost_to_closest_version < cost_to_current_version:
+                    if closest == 0:
+                        result = self.vistrail.getPipeline(version)
+                    else:
+                        result = copy.copy(self._pipelines[closest])
+                        action = self.vistrail.general_action_chain(closest, 
+                                                                    version)
+                        result.perform_action(action)
+                else:
+                    action = \
+                        self.vistrail.general_action_chain(self.current_version,
+                                                           version)
+                    if self.current_version == -1 or self.current_version == 0:
+                        result = Pipeline()
+                    else:
+                        result = copy.copy(self.current_pipeline)
+                    result.perform_action(action)
+                if self._cache_pipelines and \
+                        self.vistrail.has_tag(long(version)):
+                    # stash a copy for future use
+                    if do_validate:
+                        try:
+                            self.validate(result)
+                        except InvalidPipeline:
+                            if not allow_fail:
+                                raise
+                        else:
+                            self._pipelines[version] = copy.copy(result)
+                    else:
+                        self._pipelines[version] = copy.copy(result)
+            if do_validate:
+                try:
+                    self.validate(result)
+                except InvalidPipeline:
+                    if not allow_fail:
+                        raise
+            return result
+        # end switch_version
+
+        try:
+            self.current_pipeline = switch_version(new_version)
+            self.current_version = new_version
+        except InvalidPipeline, e:
+            # print 'EXCEPTION'
+            # print e
+            new_error = None
+
+            # DAK !!! don't need to rollback anymore!!!!
+            # we don't update self.current_pipeline until we actually
+            # get the result back
+
+            start_version = new_version
+            upgrade_version = self.vistrail.get_upgrade(new_version)
+            was_upgraded = False
+            if upgrade_version is not None:
+                try:
+                    upgrade_version = int(upgrade_version)
+                    if (upgrade_version in self.vistrail.actionMap and \
+                            not self.vistrail.is_pruned(upgrade_version)):
+                        self.current_pipeline = switch_version(upgrade_version)
+                        new_version = upgrade_version
+                        self.current_version = new_version
+                        # print 'self.current_version:', self.current_version
+                        was_upgraded = True
+                except InvalidPipeline:
+                    # try to handle using the handler and create
+                    # new upgrade
+                    pass
+            if not was_upgraded:
+                try:
+                    try:
+                        (new_version, pipeline) = \
+                            self.handle_invalid_pipeline(e, new_version,
+                                                         self.vistrail,
+                                                         report_all_errors)
+                    except InvalidPipeline, e:
+                        pipeline = e._pipeline
+                    # check that we handled the invalid pipeline
+                    # correctly
+                    try:
+                        self.validate(pipeline)
+                    # this means that there was a new exception after handling 
+                    # the invalid pipeline and we should handle it again.    
+                    except InvalidPipeline, e:
+                        (new_version, pipeline) = \
+                                 self.handle_invalid_pipeline(e, new_version,
+                                                              self.vistrail,
+                                                              report_all_errors)
+                        # check that we handled the invalid pipeline
+                        # correctly
+                    self.validate(pipeline)
+                    self.current_pipeline = pipeline
+                    self.current_version = new_version
+                except InvalidPipeline, e:
+                    # display invalid pipeline?
+                    # import traceback
+                    # traceback.print_exc()
+                    new_error = e
+                    
+                    # just do the version switch, anyway, but alert the
+                    # user to the remaining issues
+                    self.current_pipeline = e._pipeline
+                    new_version = e._version
+                    self.current_version = new_version
+
+            if new_version != start_version:
+                self.invalidate_version_tree(False)
+            if new_error is not None:
+                raise new_error
+
+    def change_selected_version(self, new_version, report_all_errors=True,
+                                do_validate=True, from_root=False):
+        try:
+            self.do_version_switch(new_version, report_all_errors, 
+                                   do_validate, from_root)
+        except InvalidPipeline, e:
+            # FIXME: do error handling through central switch that produces gui
+            # or core.debug messages as specified
+            def process_err(err):
+                if isinstance(err, Package.InitializationFailed):
+                    msg = ('Package "%s" failed during initialization. '
+                           'Please contact the developer of that package '
+                           'and report a bug.' % err.package.name)
+                    debug.critical(msg)
+                elif isinstance(err, MissingPackage):
+                    msg = ('Cannot find package "%s" in '
+                           'list of available packages. '
+                           'Please install it first.' % err._identifier)
+                    debug.critical(msg)
+                elif issubclass(err.__class__, MissingPort):
+                    msg = ('Cannot find %s port "%s" for module "%s" '
+                           'in loaded package "%s". A different package '
+                           'version might be necessary.') % \
+                           (err._port_type, err._port_name, 
+                            err._module_name, err._package_name)
+                    debug.critical(msg)
+                else:
+                    debug.critical(str(err))                
+
+            if report_all_errors:
+                for err in e._exception_set:
+                    process_err(err)
+            elif len(e._exception_set) > 0:
+                process_err(e._exception_set.__iter__().next())
+        except Exception, e:
+            import traceback
+            debug.critical(str(e), traceback.format_exc())
+
+    def write_temporary(self):
+        if self.vistrail and self.changed:
+            locator = self.get_locator()
+            if locator:
+                locator.save_temporary(self.vistrail)
+
+    def write_abstractions(self, locator, save_bundle, abstractions, 
+                           abs_save_dir):
+        def make_abstraction_path_unique(abs_fname, namespace):
+            # Constructs the abstraction name using the namespace to
+            # prevent conflicts and copies the abstraction to the new
+            # path so save_bundle has a valid file
+            path, prefix, absname, old_ns, suffix = \
+                parse_abstraction_name(abs_fname, True)
+            new_abs_fname = os.path.join(abs_save_dir, 
+                                         '%s%s(%s)%s' % (prefix, absname, 
+                                                         namespace, suffix))
+            # print " $@$@$ new_abs_fname:", new_abs_fname
+            shutil.copy(abs_fname, new_abs_fname)
+            return new_abs_fname
+
+        included_abstractions = {}
+        for abstraction_list in abstractions.itervalues():
+            for abstraction in abstraction_list:
+                abs_module = abstraction.module_descriptor.module
+                namespaces = set(get_all_abs_namespaces(abstraction.vistrail))
+                if abs_module is not None:
+                    abs_fname = abs_module.vt_fname
+                    path, prefix, abs_name, old_ns, suffix = \
+                        parse_abstraction_name(abs_fname, True)
+                    # do our indexing by abstraction name
+                    # we know that abstractions with different names
+                    # cannot overlap, but those that have the same
+                    # name may or may not
+                    if abs_name not in included_abstractions:
+                        included_abstractions[abs_name] = [(abstraction, 
+                                                            namespaces)]
+                    else:
+                        # only keep abstractions that don't repeat what
+                        # others already cover
+                        new_list = []
+                        found = False
+                        for (i_abs, i_namespaces) in \
+                                included_abstractions[abs_name]:
+                            if not (i_namespaces < namespaces):
+                                new_list.append((i_abs, i_namespaces))
+                            if i_namespaces >= namespaces:
+                                found = True
+                        # only add new one once
+                        if not found:
+                            new_list.append((abstraction, namespaces))
+                        included_abstractions[abs_name] = new_list
+
+        for abs_name, abstraction_list in included_abstractions.iteritems():
+            for (abstraction, _) in abstraction_list:
+                abs_module = abstraction.module_descriptor.module
+                if abs_module is None:
+                    continue
+                abs_fname = abs_module.vt_fname
+                if not os.path.exists(abs_fname):
+                    # Write vistrail to disk if the file no longer
+                    # exists (if temp file was deleted)
+                    abs_fname = os.path.join(abs_save_dir, 
+                                             abstraction.name + '.xml')
+                    save_abstraction(abstraction.vistrail, abs_fname)
+                namespace = get_cur_abs_namespace(abstraction.vistrail)
+                abs_unique_name = make_abstraction_path_unique(abs_fname,
+                                                               namespace)
+                save_bundle.abstractions.append(abs_unique_name)
+                                
+    def write_vistrail(self, locator, version=None, export=False):
+        """write_vistrail(locator,version) -> Boolean
+        It will return a boolean that tells if the tree needs to be 
+        invalidated
+        export=True means you should not update the current controller"""
+        result = False 
+        if self.vistrail and (self.changed or self.locator != locator):
+            # FIXME create this on-demand?
+            abs_save_dir = tempfile.mkdtemp(prefix='vt_abs')
+            is_abstraction = self.vistrail.is_abstraction
+            if is_abstraction and self.changed:
+                # first update any names if necessary
+                self.check_subpipeline_port_names()
+                new_namespace = str(uuid.uuid1())
+                annotation_key = get_next_abs_annotation_key(self.vistrail)
+                self.vistrail.set_annotation(annotation_key, new_namespace)
+            save_bundle = SaveBundle(self.vistrail.vtType)
+            if export:
+                save_bundle.vistrail = self.vistrail.do_copy()
+                if isinstance(locator, vistrails.core.db.locator.DBLocator):
+                    save_bundle.vistrail.db_log_filename = None
+            else:
+                save_bundle.vistrail = self.vistrail
+            if self.log and len(self.log.workflow_execs) > 0:
+                save_bundle.log = self.log
+            abstractions = self.find_abstractions(self.vistrail, True)
+            self.write_abstractions(locator, save_bundle, abstractions, 
+                                    abs_save_dir)
+            thumb_cache = ThumbnailCache.getInstance()
+            if thumb_cache.conf.autoSave:
+                save_bundle.thumbnails = self.find_thumbnails(
+                                           tags_only=thumb_cache.conf.tagsOnly)
+            
+            #mashups
+            save_bundle.mashups = self._mashups
+            # FIXME hack to use db_currentVersion for convenience
+            # it's not an actual field
+            self.vistrail.db_currentVersion = self.current_version
+            if self.locator != locator:
+                # check for db log
+                log = Log()
+                if isinstance(self.locator, vistrails.core.db.locator.DBLocator):
+                    connection = self.locator.get_connection()
+                    db_log = open_vt_log_from_db(connection, 
+                                                 self.vistrail.db_id)
+                    Log.convert(db_log)
+                    for workflow_exec in db_log.workflow_execs:
+                        workflow_exec.db_id = \
+                            log.id_scope.getNewId(DBWorkflowExec.vtType)
+                        log.db_add_workflow_exec(workflow_exec)
+                # add recent log entries
+                if self.log and len(self.log.workflow_execs) > 0:
+                    for workflow_exec in self.log.db_workflow_execs:
+                        workflow_exec = copy.copy(workflow_exec)
+                        workflow_exec.db_id = \
+                            log.id_scope.getNewId(DBWorkflowExec.vtType)
+                        log.db_add_workflow_exec(workflow_exec)
+                if len(log.workflow_execs) > 0:
+                    save_bundle.log = log
+                old_locator = self.get_locator()
+                if not export:
+                    self.locator = locator
+                save_bundle = locator.save_as(save_bundle, version)
+                new_vistrail = save_bundle.vistrail
+                if isinstance(locator, vistrails.core.db.locator.DBLocator):
+                    new_vistrail.db_log_filename = None
+                    locator.kwargs['obj_id'] = new_vistrail.db_id
+                if not export:
+                    # DAK don't think is necessary since we have a new
+                    # namespace for an abstraction on each save
+                    # Unload abstractions from old namespace
+                    # self.unload_abstractions() 
+                    # Load all abstractions from new namespaces
+                    self.ensure_abstractions_loaded(new_vistrail, 
+                                                    save_bundle.abstractions) 
+                    conf = get_vistrails_configuration()
+                    if conf.has('runningJobsList') and conf.runningJobsList:
+                        conf_jobs = conf.runningJobsList.split(';')
+                        conf_jobs = [job.replace(old_locator.to_url(),
+                                       locator.to_url()) for job in conf_jobs]
+                        conf.runningJobsList = ';'.join(conf_jobs)
+                        get_vistrails_persistent_configuration(
+                                      ).runningJobsList = conf.runningJobsList
+                    self.set_file_name(locator.name)
+                    if old_locator and not export:
+                        old_locator.clean_temporaries()
+                        old_locator.close()
+                    self.flush_pipeline_cache()
+                    self.change_selected_version(new_vistrail.db_currentVersion,
+                                                 from_root=True)
+            else:
+                save_bundle = self.locator.save(save_bundle)
+                new_vistrail = save_bundle.vistrail
+                # Load any abstractions that were given new namespaces
+                self.ensure_abstractions_loaded(new_vistrail, 
+                                                save_bundle.abstractions)
+            # FIXME abstractions only work with FileLocators right now
+            if is_abstraction:
+                new_vistrail.is_abstraction = True
+                if isinstance(self.locator, (
+                        vistrails.core.db.locator.XMLFileLocator,
+                        vistrails.core.db.locator.ZIPFileLocator)):
+                    filename = self.locator.name
+                    if filename in self._loaded_abstractions:
+                        del self._loaded_abstractions[filename]
+                    # we don't know if the subworkflow should be shown
+                    # if it doesn't currently exist, we don't want to add it
+                    # if it does, we will replace it via upgrade module
+                    # so it is not global
+                    self.load_abstraction(filename, False)
+                    
+                    # reg = core.modules.module_registry.get_module_registry()
+                    # for desc in reg.get_package_by_name('local.abstractions').descriptor_list:
+                    #     print desc.name, desc.namespace, desc.version
+            if not export:
+                if id(self.vistrail) != id(new_vistrail):
+                    new_version = new_vistrail.db_currentVersion
+                    # FIXME have to figure out what to do here !!!
+                    self.set_vistrail(new_vistrail, locator)
+                    self.change_selected_version(new_version)
+                    result = True
+                if self.log:
+                    self.log.delete_all_workflow_execs()
+                self.set_changed(False)
+                locator.clean_temporaries()
+
+            # delete any temporary subworkflows
+                try:
+                    for root, _, files in os.walk(abs_save_dir, topdown=False):
+                        for name in files:
+                            os.remove(os.path.join(root, name))
+                    os.rmdir(abs_save_dir)
+                except OSError, e:
+                    raise VistrailsDBException("Can't remove %s: %s" % \
+                                                   (abs_save_dir, str(e)))
+            return result
+
+
+    def write_workflow(self, locator):
+        if self.current_pipeline:
+            pipeline = Pipeline()
+            # pipeline.set_abstraction_map(self.vistrail.abstractionMap)
+            for module in self.current_pipeline.modules.itervalues():
+                # if module.vtType == AbstractionModule.vtType:
+                #     abstraction = \
+                #         pipeline.abstraction_map[module.abstraction_id]
+                #     pipeline.add_abstraction(abstraction)
+                pipeline.add_module(module)
+            for connection in self.current_pipeline.connections.itervalues():
+                pipeline.add_connection(connection)
+            save_bundle = SaveBundle(pipeline.vtType,workflow=pipeline)
+            locator.save_as(save_bundle)
+
+    def write_log(self, locator):
+        if self.log:
+            if self.vistrail.db_log_filename is not None:
+                log = vistrails.core.db.io.merge_logs(self.log, 
+                                            self.vistrail.db_log_filename)
+            else:
+                log = self.log
+            #print log
+            save_bundle = SaveBundle(log.vtType,log=log)
+            locator.save_as(save_bundle)
+
+    def read_log(self):
+        """ Returns the saved log from zip or DB
+        
+        """
+        return self.vistrail.get_persisted_log()
+ 
+    def write_registry(self, locator):
+        registry = vistrails.core.modules.module_registry.get_module_registry()
+        save_bundle = SaveBundle(registry.vtType, registry=registry)
+        locator.save_as(save_bundle)
+
+    def update_checkout_version(self, app=''):
+        self.vistrail.update_checkout_version(app)
+
+    def reset_redo_stack(self):
+        self.redo_stack = []
+
+    def undo(self):
+        """Performs one undo step, moving up the version tree."""
+        action_map = self.vistrail.actionMap
+        old_action = action_map.get(self.current_version, None)
+        self.redo_stack.append(self.current_version)
+        self.show_parent_version()
+        new_action = action_map.get(self.current_version, None)
+        return (old_action, new_action)
+        # self.set_pipeline_selection(old_action, new_action, 'undo')
+        # return self.current_version
+
+    def redo(self):
+        """Performs one redo step if possible, moving down the version tree."""
+        action_map = self.vistrail.actionMap
+        old_action = action_map.get(self.current_version, None)
+        if len(self.redo_stack) < 1:
+            debug.critical("Redo on an empty redo stack. Ignoring.")
+            return
+        next_version = self.redo_stack[-1]
+        self.redo_stack = self.redo_stack[:-1]
+        self.show_child_version(next_version)
+        new_action = action_map[self.current_version]
+        return (old_action, new_action)
+        # self.set_pipeline_selection(old_action, new_action, 'redo')
+        # return next_version
+
+    def can_redo(self):
+        return (len(self.redo_stack) > 0)
+
+    def can_undo(self):
+        return self.current_version > 0
+
+    def layout_modules(self, old_modules=[], preserve_order=False, 
+               new_modules=[], new_connections=[], module_size_func=None, no_gaps=False):
+        """Lays out modules and returns the new version.
+        
+        If old_modules are not specified, all modules in current pipeline are used.
+        If preserve_order is True, modules in each row will be ordered based on
+            their current x value
+        new_modules ignore preserve_order, and don't need exist yet in the pipeline
+        new_connections associated with new_modules
+        module_size_func is used to determine size of a module. It takes a
+            vistrails.core.layout.workflow_layout.Module object and returns a (width, height)
+            tuple.
+        If no_gaps is True, all connected modules will be at most 1 layer above or
+            below their child or parent respectively
+        """
+        
+        #fixes issue when opening old vistrails that needs upgrade
+        self.flush_delayed_actions()
+        
+        action_list = self.layout_modules_ops(old_modules, preserve_order, 
+                                      new_modules, new_connections, module_size_func, no_gaps)
+        if(len(action_list) > 0):
+            action = vistrails.core.db.action.create_action(action_list)
+            self.add_new_action(action)
+            version = self.perform_action(action)
+            self.change_selected_version(version)
+            return version
+        return self.current_version
+
+    def layout_modules_ops(self, old_modules=[], preserve_order=False, 
+               new_modules=[], new_connections=[], module_size_func=None, no_gaps=False):
+        """Returns operations needed to layout the modules.
+        
+        If old_modules are not specified, all modules in current pipeline are used.
+        If preserve_order is True, modules in each row will be ordered based on
+            their current x value
+        new_modules ignore preserve_order, and don't need exist yet in the pipeline
+        new_connections associated with new_modules
+        module_size_func is used to determine size of a module. It takes a
+            vistrails.core.layout.workflow_layout.Module object and returns a (width, height)
+            tuple.
+        If no_gaps is True, all connected modules will be at most 1 layer above or
+            below their child or parent respectively
+        """
+
+        connected_input_ports = set(
+                c.destination.spec for c in self.current_pipeline.connection_list)
+        connected_input_ports.update(
+                c.destination.spec for c in new_connections)
+        connected_output_ports = set(
+                c.source.spec for c in self.current_pipeline.connection_list)
+        connected_output_ports.update(
+                c.source.spec for c in new_connections)
+        connected_ports = connected_input_ports | connected_output_ports
+
+        def get_visible_port_names(port_list, visible_ports):
+            output_list = []
+            visible_list = []
+            for i, p in enumerate(port_list):
+                if not p.optional:
+                    output_list.append(p.name)
+                elif p.name in visible_ports or p in connected_ports:
+                    visible_list.append(p.name)
+            output_list.extend(visible_list)
+            return output_list
+        
+        if not old_modules or len(old_modules) == 0:
+            old_modules = self.current_pipeline.modules.values()
+        
+        #create layout objects
+        layoutPipeline = LayoutPipeline()
+
+        module_info = {} # {id: (module, layoutModule, in_port_names=[], out_port_names=[])}
+        
+        #add modules to layout, and find their visible ports
+        def _add_layout_module(module, prev_x):
+            in_ports = get_visible_port_names(module.destinationPorts(), 
+                                         module.visible_input_ports)
+            out_ports = get_visible_port_names(module.sourcePorts(),
+                                          module.visible_output_ports)
+            
+            layoutModule = layoutPipeline.createModule(module.id, 
+                                        module.name,
+                                        len(in_ports),
+                                        len(out_ports),
+                                        prev_x)
+            
+            module_info[module.id] = (module, layoutModule, in_ports, out_ports)
+        
+        for module in old_modules:
+            _add_layout_module(module, module.location.x)
+            
+        for module in new_modules:
+            _add_layout_module(module, None)
+        
+        #add connections to layout
+        old_ids = [module.id for module in old_modules]
+        old_conns = self.get_connections_to(self.current_pipeline, old_ids)
+        for conn in old_conns + new_connections:
+            if conn.source.moduleId in module_info:
+                layoutPipeline.createConnection(
+                        module_info[conn.source.moduleId][1],
+                        module_info[conn.source.moduleId][3].index(conn.source.name),
+                        module_info[conn.destination.moduleId][1],
+                        module_info[conn.destination.moduleId][2].index(conn.destination.name))
+            
+        #set default module size function if needed
+        paddedPortWidth = self.layoutTheme.PORT_WIDTH + self.layoutTheme.MODULE_PORT_SPACE
+        def estimate_module_size(module):
+            width = max(len(module.name)*6 + self.layoutTheme.MODULE_LABEL_MARGIN[0] + self.layoutTheme.MODULE_LABEL_MARGIN[1],
+                        len(module_info[module.shortname][2]) * paddedPortWidth + self.layoutTheme.MODULE_PORT_PADDED_SPACE,
+                        len(module_info[module.shortname][3]) * paddedPortWidth + self.layoutTheme.MODULE_PORT_PADDED_SPACE)
+            height = LayoutDefaults.u * 5 #todo, fix these sizes
+            return (width, height)
+        if module_size_func is None:
+            module_size_func = estimate_module_size
+            
+        workflowLayout = WorkflowLayout(layoutPipeline,
+                                        module_size_func,
+                                        self.layoutTheme.MODULE_PORT_MARGIN, 
+                                        (self.layoutTheme.PORT_WIDTH, self.layoutTheme.PORT_HEIGHT), 
+                                        self.layoutTheme.MODULE_PORT_SPACE)
+    
+        #do layout with layer x and y separation of 50
+        workflowLayout.run_all(50,50,preserve_order,no_gaps)
+                
+        #maintain center
+        center_x, center_y = self.get_avg_location([item[0] for item in module_info.values()])
+        new_center_x = sum([m.layout_pos.x for m in layoutPipeline.modules]) / len(layoutPipeline.modules)
+        new_center_y = -sum([m.layout_pos.y for m in layoutPipeline.modules]) / len(layoutPipeline.modules)
+        offset_x = center_x - new_center_x
+        offset_y = center_y - new_center_y
+        
+        #generate module move list
+        moves = []
+        for (module, layoutModule, _, _) in module_info.values():
+            new_x = layoutModule.layout_pos.x+offset_x
+            new_y = -layoutModule.layout_pos.y+offset_y
+            if module.id in self.current_pipeline.modules:
+                moves.append((module.id, new_x, new_y))
+            else:
+                #module doesn't exist in pipeline yet, just change x,y
+                module.location.x = new_x
+                module.location.y = new_y
+                
+        #return module move operations
+        return self.move_modules_ops(moves)
+        
+            
diff --git a/vistrails/core/vistrail/group.py b/vistrails/core/vistrail/group.py
new file mode 100644
index 0000000..7a74879
--- /dev/null
+++ b/vistrails/core/vistrail/group.py
@@ -0,0 +1,344 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from itertools import izip
+
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.port_spec import PortSpec, PortEndPoint
+from vistrails.db.domain import DBGroup
+
+from vistrails.core.utils import NoSummon, VistrailsInternalError, report_stack
+from vistrails.core.modules.basic_modules import identifier as basic_pkg, \
+    version as basic_pkg_version
+import vistrails.core.modules.sub_module
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.module_registry import get_module_registry, ModuleRegistry
+
+import unittest
+from vistrails.db.domain import IdScope
+
+class Group(DBGroup, Module):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        if 'pipeline' in kwargs:
+            kwargs['workflow'] = kwargs['pipeline']
+            del kwargs['pipeline']
+        DBGroup.__init__(self, *args, **kwargs)
+        if self.cache is None:
+            self.cache = 1
+        if self.id is None:
+            self.id = -1
+        if self.location is None:
+            self.location = Location(x=-1.0, y=-1.0)
+        if self.name is None:
+            self.name = ''
+        if self.package is None:
+            self.package = ''
+        if self.version is None:
+            self.version = ''
+        self.set_defaults()
+
+    def set_defaults(self, other=None):
+        Module.set_defaults(self, other)
+
+    def setup_indices(self):        
+        # delay this until needed (on materialize)
+        self._port_specs = None
+        self._port_specs_id_index = None
+        # self.make_port_specs()
+
+    def __copy__(self):
+        return Group.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Group
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_group):
+        if _group.__class__ == Group:
+            return
+        _group.__class__ = Group
+        if _group.db_location:
+            Location.convert(_group.db_location)
+        if _group.db_workflow:
+            from vistrails.core.vistrail.pipeline import Pipeline
+            Pipeline.convert(_group.db_workflow)
+        for _function in _group.db_functions:
+            ModuleFunction.convert(_function)
+        for _annotation in _group.db_get_annotations():
+            Annotation.convert(_annotation)
+        _group.set_defaults()
+
+    ##########################################################################
+    # Properties
+
+    # We need to repeat these here because Module uses DBModule. ...
+    id = DBGroup.db_id
+    cache = DBGroup.db_cache
+    annotations = DBGroup.db_annotations
+    location = DBGroup.db_location
+    center = DBGroup.db_location
+    # version = DBGroup.db_version
+    # name = DBGroup.db_name
+    # label = DBGroup.db_name
+    # namespace = DBGroup.db_namespace
+    # package = DBGroup.db_package
+
+    name = 'Group'
+    label = 'Group'
+    package = basic_pkg
+    namespace = None
+    version = basic_pkg_version
+    internal_version = ''
+
+    def summon(self):
+        result = self.module_descriptor.module()
+        result.pipeline = self.pipeline
+        if self._port_specs is None:
+            self.make_port_specs()
+        result.input_remap = self._input_remap
+        result.output_remap = self._output_remap
+        if self.cache != 1:
+            result.is_cacheable = lambda *args: False
+        if hasattr(result, 'input_ports_order'):
+            result.input_ports_order = [p.name for p in self.destinationPorts()]
+        if hasattr(result, 'output_ports_order'):
+            result.output_ports_order = [p.name for p in self.sourcePorts()]
+        result.registry = get_module_registry()
+        return result
+
+    def is_group(self):
+        return True
+
+    def _get_pipeline(self):
+        return self.db_workflow
+    def _set_pipeline(self, pipeline):
+        self.db_workflow = pipeline
+        self.setup_indices()
+    pipeline = property(_get_pipeline, _set_pipeline)
+    workflow = pipeline
+    
+    # override these from the Module class with defaults
+    # these are "local" port_specs, but Group's are "registry"
+    def _get_port_specs(self):
+        if self._port_specs_id_index is None:
+            if self._port_specs is None:
+                self.make_port_specs()
+            self._port_specs_id_index = {}
+            self._port_specs_id_index = \
+                dict([(p.id, p) for p in self._port_specs.itervalues()])
+        return self._port_specs_id_index
+    port_specs = property(_get_port_specs)
+
+    def _get_port_spec_list(self):
+        if self._port_specs is None:
+            self.make_port_specs()
+        return self._port_specs.values()
+    port_spec_list = property(_get_port_spec_list)
+
+    def has_portSpec_with_name(self, name):
+        if self._port_specs is None:
+            self.make_port_specs()
+        return name in self._port_specs
+
+    def get_portSpec_by_name(self, name):
+        if self._port_specs is None:
+            self.make_port_specs()
+        if name in self._port_specs:
+            return self._port_specs[name]
+        return None
+
+    def add_port_spec(self, spec):
+        # operate on self._port_specs instead of db level
+        if self._port_specs is None:
+            self.make_port_specs()
+        self._port_specs[(spec.name, spec.type)] = spec
+        self.port_specs[spec.id] = spec
+        if spec.type == 'input':
+            self._input_port_specs.append(spec)
+        elif spec.type == 'output':
+            self._output_port_specs.append(spec)
+    def delete_port_spec(self, spec):
+        if spec.type == 'input':
+            self._input_port_specs.remove(spec)
+        elif spec.type == 'output':
+            self._output_port_specs.remove(spec)
+        # operate on self._port_specs instead of db level
+        del self._port_specs[(spec.name, spec.type)]
+        del self.port_specs[spec.id]
+
+    def _get_input_port_specs(self):
+        if self._port_specs is None:
+            self.make_port_specs()
+        return Module._get_input_port_specs(self)
+    input_port_specs = property(_get_input_port_specs)
+    def _get_output_port_specs(self):
+        if self._port_specs is None:
+            self.make_port_specs()
+        return Module._get_output_port_specs(self)
+    output_port_specs = property(_get_output_port_specs)
+
+    def get_port_spec_info(self, module):
+        return vistrails.core.modules.sub_module.get_port_spec_info(self.pipeline, 
+                                                          module)
+
+    def make_port_specs(self):
+        self._port_specs = {}
+        self._input_port_specs = []
+        self._output_port_specs = []
+        self._input_remap = {}
+        self._output_remap = {}
+        if self.pipeline is None:
+            return
+
+        registry = get_module_registry()
+        for module in self.pipeline.module_list:
+            if module.name == 'OutputPort' and module.package == basic_pkg:
+                (port_name, sigstring, optional, _) = \
+                    self.get_port_spec_info(module)
+                port_spec = registry.create_port_spec(port_name, 'output',
+                                                      None, sigstring,
+                                                      optional)
+                self._port_specs[(port_name, 'output')] = port_spec
+                self._output_port_specs.append(port_spec)
+                self._output_remap[port_name] = module
+            elif module.name == 'InputPort' and module.package == basic_pkg:
+                (port_name, sigstring, optional, _) = \
+                    self.get_port_spec_info(module)
+                port_spec = registry.create_port_spec(port_name, 'input',
+                                                      None, sigstring,
+                                                      optional)
+                self._port_specs[(port_name, 'input')] = port_spec
+                self._input_port_specs.append(port_spec)
+                self._input_remap[port_name] = module
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an 
+        GroupModule object. 
+
+        """
+        rep = '<group id="%s">'
+        rep += str(self.location)
+        rep += str(self.functions)
+        rep += str(self.annotations)
+        rep += '</group>'
+        return  rep % str(self.id)
+
+    def __eq__(self, other):
+        """ __eq__(other: GroupModule) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        if self.location != other.location:
+            return False
+        if len(self.functions) != len(other.functions):
+            return False
+        if len(self.annotations) != len(other.annotations):
+            return False
+        for f,g in izip(self.functions, other.functions):
+            if f != g:
+                return False
+        for f,g in izip(self.annotations, other.annotations):
+            if f != g:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+################################################################################
+# Testing
+
+
+class TestGroup(unittest.TestCase):
+
+    def create_group(self, id_scope=IdScope()):
+        from vistrails.core.vistrail.location import Location
+        from vistrails.core.vistrail.module_function import ModuleFunction
+        from vistrails.core.vistrail.module_param import ModuleParam
+
+        params = [ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                                  type='Int',
+                                  val='1')]
+        functions = [ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                    name='value',
+                                    parameters=params)]
+        location = Location(id=id_scope.getNewId(Location.vtType),
+                            x=12.342,
+                            y=-19.432)
+        module = \
+            Group(id=id_scope.getNewId(Group.vtType),
+                  location=location,
+                  functions=functions,
+                  )
+        return module
+
+    def test_copy(self):
+        """Check that copy works correctly"""
+        
+        id_scope = IdScope()
+        m1 = self.create_group(id_scope)
+        m2 = copy.copy(m1)
+        self.assertEquals(m1, m2)
+        self.assertEquals(m1.id, m2.id)
+        m3 = m1.do_copy(True, id_scope, {})
+        self.assertEquals(m1, m3)
+        self.assertNotEquals(m1.id, m3.id)
+
+    def test_serialization(self):
+        """ Check that serialize and unserialize are working properly """
+        import vistrails.core.db.io
+
+        m1 = self.create_group()
+        xml_str = vistrails.core.db.io.serialize(m1)
+        m2 = vistrails.core.db.io.unserialize(xml_str, Group)
+        self.assertEquals(m1, m2)
+        self.assertEquals(m1.id, m2.id)
diff --git a/vistrails/core/vistrail/location.py b/vistrails/core/vistrail/location.py
new file mode 100644
index 0000000..de71bd1
--- /dev/null
+++ b/vistrails/core/vistrail/location.py
@@ -0,0 +1,199 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.data_structures.point import Point
+from vistrails.db.domain import DBLocation
+
+import unittest
+import copy
+import random
+from vistrails.db.domain import IdScope
+import vistrails.core
+
+class Location(DBLocation, Point):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBLocation.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = -1
+        
+    def __copy__(self):
+        return Location.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Location
+        return cp
+
+    ##########################################################################
+    # DB Conversion
+
+    @staticmethod
+    def convert(_location):
+        _location.__class__ = Location
+
+    ##########################################################################
+    # Properties
+
+    id = DBLocation.db_id
+    x = DBLocation.db_x
+    y = DBLocation.db_y
+    
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an Annotation
+        object. 
+
+        """
+        rep = "<location id=%s x=%s y=%s/>"
+        return  rep % (str(self.id), str(self.x), str(self.y))
+
+
+    eq_delta = 0.0001
+    def __eq__(self, other):
+        """ __eq__(other: Location) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        # Skip property lookup for performance
+        return ((self._db_x - other._db_x) ** 2 +
+                (self._db_y - other._db_y)) ** 2 < 1e-8
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __neg__(self):
+        """ __neg__() -> Location
+        Compute a point p such that: self + p == Location(0,0), 
+        and return a Location
+        
+        """
+        return Location(x=-self.db_x,y=-self.db_y)
+
+    def __add__(self, other):
+        """ __add__(other: Location) -> Location
+        Returns a point p such that: self + other == p, and return a Location
+        
+        """
+        return Location(x=(self.db_x + other.db_x), y=(self.db_y + other.db_y))
+
+    def __sub__(self, other):
+        """ __sub__(other: Location) -> Location
+        Returns a point p such that: self - other == p, and return a Location
+
+        """
+        return Location(x=(self.db_x - other.db_x), y=(self.db_y - other.db_y))
+
+    def __mul__(self, other):
+        """ __mul__(other: float) -> Location
+        Interprets self as a vector to perform a scalar multiplication and
+        return a Location
+
+        """
+        return Location(x=(self.db_x * other), y=(self.db_y * other))
+
+    def __rmul__(self, other):
+        """ __rmul__(other: float) -> Location
+        Interprets self as a vector to perform a scalar multiplication and
+        return a Location
+
+        """
+        return Location(x=(self.db_x * other), y=(self.db_y * other))
+    
+################################################################################
+# Testing
+
+
+class TestLocation(unittest.TestCase):
+
+    @staticmethod
+    def assert_double_equals(a, b, eps = 0.00001):
+        assert abs(a-b) < eps
+
+    def create_location(self, id_scope=IdScope()):
+        location = Location(id=id_scope.getNewId(Location.vtType),
+                            x=12.34567,
+                            y=14.65431)
+        return location
+
+    def test_copy(self):
+        id_scope = IdScope()
+        
+        loc1 = self.create_location(id_scope)
+        loc2 = copy.copy(loc1)
+        self.assertEquals(loc1, loc2)
+        self.assertEquals(loc1.id, loc2.id)
+        loc3 = loc1.do_copy(True, id_scope, {})
+        self.assertEquals(loc1, loc3)
+        self.assertNotEquals(loc1.id, loc3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        loc1 = self.create_location()
+        xml_str = vistrails.core.db.io.serialize(loc1)
+        loc2 = vistrails.core.db.io.unserialize(xml_str, Location)
+        self.assertEquals(loc1, loc2)
+        self.assertEquals(loc1.id, loc2.id)
+
+    def test_add_length(self):
+        """Uses triangle inequality to exercise add and length"""
+        for i in xrange(100):
+            x = Location(x=random.uniform(-1.0, 1.0), y=random.uniform(-1.0, 1.0))
+            y = Location(x=random.uniform(-1.0, 1.0), y=random.uniform(-1.0, 1.0))
+            assert (x+y).length() <= x.length() + y.length()
+
+    def test_mul_length(self):
+        """Uses vector space properties to exercise mul, rmul and length"""
+        for i in xrange(100):
+            x = Location(x=random.uniform(-1.0, 1.0), y=random.uniform(-1.0, 1.0))
+            s = random.uniform(0.0, 10.0)
+            self.assert_double_equals(s * x.length(), (s * x).length())
+            self.assert_double_equals(s * x.length(), (x * s).length())
+
+    def test_comparison_operators(self):
+        """ Test comparison operators """
+        a = Location(x=0, y=1)
+        b = Location(x=0, y=1)
+        assert a == b
+        assert a != None
+        b = Location(x=0, y=0.1)
+        assert a != b
diff --git a/vistrails/core/vistrail/module.py b/vistrails/core/vistrail/module.py
new file mode 100644
index 0000000..3360e14
--- /dev/null
+++ b/vistrails/core/vistrail/module.py
@@ -0,0 +1,526 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Check for testing
+""" This module defines the class Module 
+"""
+import copy
+from itertools import izip
+import weakref
+
+from vistrails.db.domain import DBModule
+from vistrails.core.data_structures.point import Point
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.port import Port, PortEndPoint
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.utils import NoSummon, VistrailsInternalError, report_stack
+from vistrails.core.modules.module_descriptor import OverloadedPort
+from vistrails.core.modules.module_registry import get_module_registry, ModuleRegistry
+
+import unittest
+import vistrails.core
+
+################################################################################
+
+# A Module stores not only the information, but a method (summon) that
+# creates a 'live' object, subclass of core/modules/vistrail_module/Module
+
+class Module(DBModule):
+    """ Represents a module from a Pipeline """
+
+    ##########################################################################
+    # Constructor and copy
+
+    def __init__(self, *args, **kwargs):
+        DBModule.__init__(self, *args, **kwargs)
+        if self.cache is None:
+            self.cache = 1
+        if self.id is None:
+            self.id = -1
+        if self.location is None:
+            self.location = Location(x=-1.0, y=-1.0)
+        if self.name is None:
+            self.name = ''
+        if self.package is None:
+            self.package = ''
+        if self.version is None:
+            self.version = ''
+        self.set_defaults()
+
+    def set_defaults(self, other=None):
+        if other is None:
+            self.portVisible = set()
+            self.visible_input_ports = set()
+            self.visible_output_ports = set()
+            self.connected_input_ports = {}
+            self.connected_output_ports = {}
+            self.is_valid = False
+            self.is_breakpoint = False
+            self.is_watched = False
+            self._descriptor_info = None
+            self._module_descriptor = None
+        else:
+            self.portVisible = copy.copy(other.portVisible)
+            self.visible_input_ports = copy.copy(other.visible_input_ports)
+            self.visible_output_ports = copy.copy(other.visible_output_ports)
+            self.connected_input_ports = copy.copy(other.connected_input_ports)
+            self.connected_output_ports = \
+                copy.copy(other.connected_output_ports)
+            self.is_valid = other.is_valid
+            self.is_breakpoint = other.is_breakpoint
+            self.is_watched = other.is_watched
+            self._descriptor_info = None
+            self._module_descriptor = other._module_descriptor
+        if not self.namespace:
+            self.namespace = None
+        self.function_idx = self.db_functions_id_index
+        self.setup_indices()
+
+    def setup_indices(self):
+        self._input_port_specs = []
+        self._output_port_specs = []
+        for port_spec in self.port_spec_list:
+            if port_spec.type == 'input':
+                self._input_port_specs.append(port_spec)
+            elif port_spec.type == 'output':
+                self._output_port_specs.append(port_spec)
+
+    def __copy__(self):
+        """__copy__() -> Module - Returns a clone of itself"""
+        return Module.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Module
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_module):
+        if _module.__class__ == Module:
+            return
+        _module.__class__ = Module
+        for _port_spec in _module.db_portSpecs:
+            PortSpec.convert(_port_spec)
+        if _module.db_location:
+            Location.convert(_module.db_location)
+        for _function in _module.db_functions:
+            ModuleFunction.convert(_function)
+        for _annotation in _module.db_get_annotations():
+            Annotation.convert(_annotation)
+        _module.set_defaults()
+
+    ##########################################################################
+    # CONSTANTS
+        
+    VISTRAIL_VAR_ANNOTATION = '__vistrail_var__'
+
+    ##########################################################################
+
+    id = DBModule.db_id
+    cache = DBModule.db_cache
+    annotations = DBModule.db_annotations
+    location = DBModule.db_location
+    center = DBModule.db_location
+    name = DBModule.db_name
+    label = DBModule.db_name
+    namespace = DBModule.db_namespace
+    package = DBModule.db_package
+    version = DBModule.db_version
+    port_spec_list = DBModule.db_portSpecs
+    internal_version = ''
+
+    # type check this (list, hash)
+    def _get_functions(self):
+        self.db_functions.sort(key=lambda x: x.db_pos)
+        return self.db_functions
+    def _set_functions(self, functions):
+        # want to convert functions to hash...?
+        self.db_functions = functions
+    functions = property(_get_functions, _set_functions)
+    def add_function(self, function):
+        self.db_add_function(function)
+    def has_function_with_real_id(self, f_id):
+        return self.db_has_function_with_id(f_id)
+    def get_function_by_real_id(self, f_id):
+        return self.db_get_function_by_id(f_id)
+
+    def add_annotation(self, annotation):
+        self.db_add_annotation(annotation)
+    def delete_annotation(self, annotation):
+        self.db_delete_annotation(annotation)
+    def has_annotation_with_key(self, key):
+        return self.db_has_annotation_with_key(key)
+    def get_annotation_by_key(self, key):
+        return self.db_get_annotation_by_key(key)        
+    def toggle_breakpoint(self):
+        self.is_breakpoint = not self.is_breakpoint
+    def toggle_watched(self):
+        self.is_watched = not self.is_watched
+
+    def is_vistrail_var(self):
+        return self.has_annotation_with_key(Module.VISTRAIL_VAR_ANNOTATION)
+    def get_vistrail_var(self):
+        return self.get_annotation_by_key(Module.VISTRAIL_VAR_ANNOTATION).value
+
+    def _get_port_specs(self):
+        return self.db_portSpecs_id_index
+    port_specs = property(_get_port_specs)
+    def has_portSpec_with_name(self, name):
+        return self.db_has_portSpec_with_name(name)
+    def get_portSpec_by_name(self, name):
+        return self.db_get_portSpec_by_name(name)
+    def add_port_spec(self, spec):
+        DBModule.db_add_portSpec(self, spec)
+        if spec.type == 'input':
+            self._input_port_specs.append(spec)
+        elif spec.type == 'output':
+            self._output_port_specs.append(spec)
+    # override DBModule.db_add_portSpec so that _*_port_specs are updated
+    db_add_portSpec = add_port_spec
+    def delete_port_spec(self, spec):
+        if spec.type == 'input':
+            self._input_port_specs.remove(spec)
+        elif spec.type == 'output':
+            self._output_port_specs.remove(spec)
+        DBModule.db_delete_portSpec(self, spec)
+    # override DBModule.db_delete_portSpec so that _*_port_specs are updated
+    db_delete_portSpec = delete_port_spec
+
+    def _get_input_port_specs(self):
+        return sorted(self._input_port_specs, 
+                      key=lambda x: (x.sort_key, x.id))
+    input_port_specs = property(_get_input_port_specs)
+    def _get_output_port_specs(self):
+        return sorted(self._output_port_specs, 
+                      key=lambda x: (x.sort_key, x.id), reverse=True)
+    output_port_specs = property(_get_output_port_specs)
+
+    def _get_descriptor_info(self):
+        if self._descriptor_info is None:
+            self._descriptor_info = (self.package, self.name, 
+                                     self.namespace, self.version,
+                                     str(self.internal_version))
+        return self._descriptor_info
+    descriptor_info = property(_get_descriptor_info)
+
+    def _get_module_descriptor(self):
+        if self._module_descriptor is None or \
+                self._module_descriptor() is None:
+            reg = get_module_registry()
+            self._module_descriptor = \
+                weakref.ref(reg.get_descriptor_by_name(*self.descriptor_info))
+        return self._module_descriptor()
+    def _set_module_descriptor(self, descriptor):
+        self._module_descriptor = weakref.ref(descriptor)
+    module_descriptor = property(_get_module_descriptor, 
+                                 _set_module_descriptor)
+
+    def get_port_spec(self, port_name, port_type):
+        """get_port_spec(port_name: str, port_type: str: ['input' | 'output'])
+             -> PortSpec
+
+        """
+        if self.has_portSpec_with_name((port_name, port_type)):
+            return self.get_portSpec_by_name((port_name, port_type))
+        desc = self.module_descriptor
+        reg = get_module_registry()
+        return reg.get_port_spec_from_descriptor(desc, port_name, port_type)
+
+    def has_port_spec(self, port_name, port_type):
+        if self.has_portSpec_with_name((port_name, port_type)):
+            return True
+        reg = get_module_registry()
+        desc = self.module_descriptor
+        return reg.has_port_spec_from_descriptor(desc, port_name, port_type)
+
+    def summon(self):
+        result = self.module_descriptor.module()
+        if self.cache != 1:
+            result.is_cacheable = lambda *args: False
+        if hasattr(result, 'input_ports_order'):
+            result.input_ports_order = [p.name for p in self.input_port_specs]
+        if hasattr(result, 'output_ports_order'):
+            result.output_ports_order = [p.name for p in self.output_port_specs]
+            # output_ports are reversed for display purposes...
+            result.output_ports_order.reverse()
+        # FIXME this may not be quite right because we don't have self.registry
+        # anymore.  That said, I'm not sure how self.registry would have
+        # worked for hybrids...
+        result.registry = get_module_registry()
+        return result
+
+    def is_group(self):
+        return False
+    def is_abstraction(self):
+        return False
+
+    def getNumFunctions(self):
+        """getNumFunctions() -> int - Returns the number of functions """
+        return len(self.functions)
+
+    def sourcePorts(self):
+        """sourcePorts() -> list of Port 
+        Returns list of source (output) ports module supports.
+
+        """
+        registry = get_module_registry()
+        desc = self.module_descriptor
+        ports = registry.module_source_ports_from_descriptor(True, desc)
+        ports.extend(self.output_port_specs)
+        return ports
+    
+    def destinationPorts(self):
+        """destinationPorts() -> list of Port 
+        Returns list of destination (input) ports module supports
+
+        """
+        registry = get_module_registry()
+        desc = self.module_descriptor
+        ports = registry.module_destination_ports_from_descriptor(True, desc)
+        ports.extend(self.input_port_specs)
+        return ports
+
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(other) != type(self):
+            print "Type mismatch"
+            print type(self), type(other)
+        elif self.id != other.id:
+            print "id mismatch"
+            print self.id, other.id
+        elif self.name != other.name:
+            print "name mismatch"
+            print self.name, other.name
+        elif self.cache != other.cache:
+            print "cache mismatch"
+            print self.cache, other.cache
+        elif self.location != other.location:
+            print "location mismatch"
+            # FIXME Location has no show_comparison
+            # self.location.show_comparison(other.location)
+        elif len(self.functions) != len(other.functions):
+            print "function length mismatch"
+            print len(self.functions), len(other.functions)
+        else:
+            for f, g in izip(self.functions, other.functions):
+                if f != g:
+                    print "function mismatch"
+                    f.show_comparison(g)
+                    return
+            print "No difference found"
+            assert self == other
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """__str__() -> str Returns a string representation of itself. """
+        def get_name():
+            if self.namespace:
+                return self.namespace + '|' + self.name
+            return self.name
+        return ("(Module '%s:%s' id=%s functions:%s port_specs:%s annotations:%s)@%X" %
+                (self.package,
+                 get_name(),
+                 self.id,
+                 [str(f) for f in self.functions],
+                 [str(port_spec) for port_spec in self.db_portSpecs],
+                 [str(a) for a in self.annotations],
+                 id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: Module) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        if self.name != other.name:
+            return False
+        if self.namespace != other.namespace:
+            return False
+        if self.package != other.package:
+            return False
+        if self.cache != other.cache:
+            return False
+        if self.location != other.location:
+            return False
+        if len(self.functions) != len(other.functions):
+            return False
+        if len(self.annotations) != len(other.annotations):
+            return False
+        for f, g in izip(self.functions, other.functions):
+            if f != g:
+                return False
+        for f, g in izip(self.annotations, other.annotations):
+            if f != g:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    ##########################################################################
+    # Properties
+
+
+################################################################################
+# Testing
+
+
+class TestModule(unittest.TestCase):
+
+    def create_module(self, id_scope=None):
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+        from vistrails.db.domain import IdScope
+        if id_scope is None:
+            id_scope = IdScope()
+        
+        params = [ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                                  type='Int',
+                                  val='1')]
+        functions = [ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                    name='value',
+                                    parameters=params)]
+        module = Module(id=id_scope.getNewId(Module.vtType),
+                        name='Float',
+                        package=basic_pkg,
+                        functions=functions)
+        return module
+
+    def test_copy(self):
+        """Check that copy works correctly"""
+        from vistrails.db.domain import IdScope
+        
+        id_scope = IdScope()
+        m1 = self.create_module(id_scope)
+        m2 = copy.copy(m1)
+        self.assertEquals(m1, m2)
+        self.assertEquals(m1.id, m2.id)
+        m3 = m1.do_copy(True, id_scope, {})
+        self.assertEquals(m1, m3)
+        self.assertNotEquals(m1.id, m3.id)
+
+    def test_serialization(self):
+        """ Check that serialize and unserialize are working properly """
+        import vistrails.core.db.io
+
+        m1 = self.create_module()
+        xml_str = vistrails.core.db.io.serialize(m1)
+        m2 = vistrails.core.db.io.unserialize(xml_str, Module)
+        self.assertEquals(m1, m2)
+        self.assertEquals(m1.id, m2.id)
+        
+    def testEq(self):
+        """Check correctness of equality operator."""
+        x = Module()
+        self.assertNotEquals(x, None)
+
+    def testAccessors(self):
+        """Check that accessors are working."""
+        x = Module()
+        self.assertEquals(x.id, -1)
+        x.id = 10
+        self.assertEquals(x.id, 10)
+        self.assertEquals(x.cache, 1)
+        x.cache = 1
+        self.assertEquals(x.cache, 1)
+        self.assertEquals(x.location.x, -1.0)
+        x.location = Location(x=1, y=x.location.y)
+        self.assertEquals(x.location.x, 1)
+        self.assertEquals(x.name, "")
+
+    def testSummonModule(self):
+        """Check that summon creates a correct module"""
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+
+        x = Module()
+        x.name = "String"
+        x.package = basic_pkg
+        try:
+            registry = get_module_registry()
+            c = x.summon()
+            m = registry.get_descriptor_by_name(basic_pkg, 'String').module
+            assert isinstance(c, m)
+        except NoSummon:
+            msg = "Expected to get a String object, got a NoSummon exception"
+            self.fail(msg)
+
+    def test_constructor(self):
+        m1_param = ModuleParam(val="1.2",
+                               type="Float",
+                               alias="",
+                               )
+        m1_function = ModuleFunction(name="value",
+                                     parameters=[m1_param],
+                                     )
+        m1 = Module(id=0,
+                    name='Float',
+                    functions=[m1_function],
+                    )
+                    
+        m2 = Module()
+        m2.name = "Float"
+        m2.id = 0
+        f = ModuleFunction()
+        f.name = "value"
+        m2.functions.append(f)
+        param = ModuleParam()
+        param.strValue = "1.2"
+        param.type = "Float"
+        param.alias = ""
+        f.params.append(param)
+        assert m1 == m2
+
+    def test_str(self):
+        m = Module(id=0,
+                   name='Float',
+                   functions=[ModuleFunction(name='value',
+                                             parameters=[ModuleParam(type='Int',
+                                                                     val='1',
+                                                                     )],
+                                             )],
+                   )
+        str(m)
+        
+if __name__ == '__main__':
+    unittest.main()
+    
diff --git a/vistrails/core/vistrail/module_function.py b/vistrails/core/vistrail/module_function.py
new file mode 100644
index 0000000..b3f819a
--- /dev/null
+++ b/vistrails/core/vistrail/module_function.py
@@ -0,0 +1,300 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This module contains class definitions for:
+
+    * ModuleFunction
+"""
+from vistrails.db.domain import DBFunction
+from vistrails.core.modules.utils import create_port_spec_string
+from vistrails.core.utils import enum, VistrailsInternalError, all, eprint
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.port_spec import PortSpec
+from itertools import izip
+import copy
+
+import unittest
+import copy
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.db.domain import IdScope
+import vistrails.core
+
+################################################################################
+
+PipelineElementType = enum('PipelineElementType',
+                           ['Module', 'Connection', 'Function', 'Parameter'])
+
+################################################################################
+
+class ModuleFunction(DBFunction):
+    __fields__ = ['name', 'returnType', 'params']
+    """ Stores a function from a vistrail module """
+
+    ##########################################################################
+    # Constructors and copy
+    
+    def __init__(self, *args, **kwargs):
+        DBFunction.__init__(self, *args, **kwargs)
+        if self.name is None:
+            self.name = ""
+        if self.real_id is None:
+            self.real_id = -1
+        if self.pos is None:
+            self.pos = -1
+        self.set_defaults()
+        
+    def set_defaults(self, other=None):
+        if other is None:
+            self.returnType = "void"
+            self.is_valid = False
+        else:
+            self.returnType = other.returnType
+            self.is_valid = other.is_valid
+        self.parameter_idx = self.db_parameters_id_index
+
+    def __copy__(self):
+        """ __copy__() -> ModuleFunction - Returns a clone of itself """
+        return ModuleFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ModuleFunction
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_function):
+        if _function.__class__ == ModuleFunction:
+            return
+        _function.__class__ = ModuleFunction
+        for _parameter in _function.db_get_parameters():
+            ModuleParam.convert(_parameter)
+        _function.set_defaults()
+
+    ##########################################################################
+    # Properties
+
+    id = DBFunction.db_pos
+    pos = DBFunction.db_pos
+    real_id = DBFunction.db_id
+    name = DBFunction.db_name   
+
+    def _get_sigstring(self):
+        return create_port_spec_string([p.spec_tuple for p in self.params])
+    sigstring = property(_get_sigstring)
+
+    def _get_params(self):
+        self.db_parameters.sort(key=lambda x: x.db_pos)
+        return self.db_parameters
+    def _set_params(self, params):
+        self.db_parameters = params
+    # If you're mutating the params property, watch out for the sort
+    # gotcha: every time you use the params on reading position,
+    # they get resorted
+    params = property(_get_params, _set_params)
+    parameters = property(_get_params, _set_params)
+
+    def add_parameter(self, param):
+        self.db_add_parameter(param)
+    addParameter = add_parameter
+
+    def add_parameters(self, params):
+        for p in params:
+            self.db_add_parameter(p)
+
+    ##########################################################################
+
+    def getNumParams(self):
+        """ getNumParams() -> int Returns the number of params. """
+        return len(self.params)
+    
+    def serialize(self, doc, element):
+        """serialize(doc, element) -> None - Writes itself in XML """
+        child = doc.createElement('function')
+        child.setAttribute('name',self.name)
+        child.setAttribute('returnType',self.type)
+        for p in self.params:
+                p.serialize(doc,child)
+        element.appendChild(child)
+
+    def get_spec(self, port_type):
+        """ get_spec(port_type) -> PortSpec
+
+        Returns a PortSpec corresponding to the function parameter
+        types set.  This is useful to make module functions look more
+        like they are 'regular' modules and connections (which is what
+        they get compiled down to in execution).
+
+        port_type is either 'input' or 'output', as strings, which
+        simply gets set on the spec being returned.
+        """
+        assert port_type == 'input' or port_type == 'output'
+        result = PortSpec(sigstring=self.sigstring)
+        result.type = port_type
+        return result
+
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(self) != type(other):
+            print "type mismatch"
+            return
+        if self.name != other.name:
+            print "name mismatch"
+            return
+        if self.returnType != other.returnType:
+            print "return type mismatch"
+            return
+        if len(self.params) != len(other.params):
+            print "params length mismatch"
+            return
+        for p,q in izip(self.params, other.params):
+            if p != q:
+                print "params mismatch"
+                p.show_comparison(q)
+                return
+        print "no difference found"
+        assert self == other
+        return
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        return ("<function id='%s' pos='%s' name='%s' params=%s)@%X" %
+                (self.real_id,
+                 self.pos,
+                 self.name,
+                 [str(p) for p in self.params],
+                 id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: ModuleFunction) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.name != other.name:
+            return False
+        if self.returnType != other.returnType:
+            return False
+        if len(self.params) != len(other.params):
+            return False
+        for p,q in zip(self.params, other.params):
+            if p != q:
+                return False
+        return True
+            
+    def __ne__(self, other):
+        """ __ne__(other: ModuleFunction) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+
+################################################################################
+# Testing
+
+
+#TODO add more meaningful tests
+
+class TestModuleFunction(unittest.TestCase):
+
+    def create_function(self, id_scope=IdScope()):
+        param = ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                            pos=2,
+                            type='Int',
+                            val='1')
+        function = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                  pos=0,
+                                  name='value',
+                                  parameters=[param])
+        return function
+
+    def test_copy(self):        
+        id_scope = IdScope()
+        f1 = self.create_function(id_scope)
+        f2 = copy.copy(f1)
+        self.assertEquals(f1, f2)
+        self.assertEquals(f1.id, f2.id)
+        f3 = f1.do_copy(True, id_scope, {})
+        self.assertEquals(f1, f3)
+        self.assertNotEquals(f1.real_id, f3.real_id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        f1 = self.create_function()
+        xml_str = vistrails.core.db.io.serialize(f1)
+        f2 = vistrails.core.db.io.unserialize(xml_str, ModuleFunction)
+        self.assertEquals(f1, f2)
+        self.assertEquals(f1.real_id, f2.real_id)
+                            
+    def testComparisonOperators(self):
+        f = ModuleFunction()
+        f.name = "value"
+        param = ModuleParam()
+        param.strValue = "1.2"
+        param.type = "Float"
+        param.alias = ""
+        f.addParameter(param)
+        g = ModuleFunction()
+        g.name = "value"
+        param = ModuleParam()
+        param.strValue = "1.2"
+        param.type = "Float"
+        param.alias = ""
+        g.addParameter(param)
+        assert f == g
+        param = ModuleParam()
+        param.strValue = "1.2"
+        param.type = "Float"
+        param.alias = ""
+        g.addParameter(param)
+        assert f != g
+
+    def test_str(self):
+        f = ModuleFunction(name='value',
+                           parameters=[ModuleParam(type='Float',
+                                                   val='1.2')],
+                           )
+        str(f)
+
+if __name__ == '__main__':
+    unittest.main()
+    
diff --git a/vistrails/core/vistrail/module_param.py b/vistrails/core/vistrail/module_param.py
new file mode 100644
index 0000000..0c8bc90
--- /dev/null
+++ b/vistrails/core/vistrail/module_param.py
@@ -0,0 +1,403 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This module contains class definitions for:
+    * ModuleParam
+
+ """
+from vistrails.db.domain import DBParameter
+from vistrails.core.modules.utils import parse_port_spec_item_string, \
+    create_port_spec_item_string
+from vistrails.core.utils import enum
+
+import unittest
+import copy
+from vistrails.db.domain import IdScope
+import vistrails.core
+from vistrails.core.system import get_vistrails_basic_pkg_id
+
+################################################################################
+
+class ModuleParam(DBParameter):
+    """ Stores a parameter setting for a vistrail function """
+
+    ##########################################################################
+    # Constructor
+
+    def __init__(self, *args, **kwargs):
+        if 'identifier' in kwargs:
+            identifier = kwargs['identifier']
+            del kwargs['identifier']
+        else:
+            identifier = None
+        if 'namespace' in kwargs:
+            namespace = kwargs['namespace']
+            del kwargs['namespace']
+        else:
+            namespace = None
+        DBParameter.__init__(self, *args, **kwargs)
+        if self.real_id is None:
+            self.real_id = -1
+        if self.strValue is None:
+            self.strValue = ""
+        if self.alias is None:
+            self.alias = ""
+        if self.pos is None:
+            self.pos = -1
+        if self.name is None:
+            self.name = ""
+    
+        self.minValue = ""
+        self.maxValue = ""
+        self.evaluatedStrValue = ""
+
+        self.parse_db_type()
+        if identifier:
+            self.identifier = identifier
+        if namespace:
+            self.namespace = namespace
+
+        # This is used for visual query and will not get serialized
+        self.queryMethod = None
+
+        # this is used for parameter settings
+        self._port_spec_item = None
+
+        # Used by constant widgets to determine how default is displayed
+        self.param_exists = True
+
+    def __copy__(self):
+        return ModuleParam.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ModuleParam
+        cp.minValue = self.minValue
+        cp.maxValue = self.maxValue
+        cp.evaluatedStrValue = self.evaluatedStrValue
+        cp.queryMethod = self.queryMethod
+        cp._port_spec_item = self._port_spec_item
+
+        # cp.identifier = self.identifier
+        # cp.namespace = self.namespace
+        # cp._type = self._type
+        cp.parse_db_type()
+
+        return cp
+
+    @staticmethod
+    def convert(_parameter):
+        if _parameter.__class__ == ModuleParam:
+            return
+        _parameter.__class__ = ModuleParam
+        _parameter.queryMethod = None
+        _parameter.minValue = ""
+        _parameter.maxValue = ""
+        _parameter.evaluatedStrValue = ""
+        _parameter._port_spec_item = None
+
+        # _parameter.identifier = ""
+        # _parameter.namespace = ""
+        # _parameter._type = ""
+        # _parameter.parse_type_str(_parameter.db_type)
+        _parameter.parse_db_type()
+
+    ##########################################################################
+
+    id = DBParameter.db_pos
+    pos = DBParameter.db_pos
+    real_id = DBParameter.db_id
+    name = DBParameter.db_name
+    typeStr = DBParameter.db_type
+    strValue = DBParameter.db_val
+    alias = DBParameter.db_alias
+
+    def parse_db_type(self):
+        if self.db_type:
+            (self._identifier, self._type, self._namespace) = \
+                parse_port_spec_item_string(self.db_type,
+                                            get_vistrails_basic_pkg_id())
+        else:
+            self._identifier = None
+            self._type = None
+            self._namespace = None
+
+    def update_db_type(self):
+        if not self._type:
+            self.db_type = None
+        else:
+            self.db_type = create_port_spec_item_string(self._identifier,
+                                                        self._type,
+                                                        self._namespace)
+
+    def _get_type(self):
+        if not hasattr(self, '_type'):
+            self.parse_db_type()
+        return self._type
+    def _set_type(self, type):
+        self._type = type
+        self.update_db_type()
+    type = property(_get_type, _set_type)
+
+    def _get_namespace(self):
+        if not hasattr(self, '_namespace'):
+            self.parse_db_type()
+        return self._namespace
+    def _set_namespace(self, namespace):
+        self._namespace = namespace
+        self.update_db_type()
+    namespace = property(_get_namespace, _set_namespace)
+
+    def _get_identifier(self):
+        if not hasattr(self, '_identifier'):
+            self.parse_db_type()
+        return self._identifier
+    def _set_identifier(self, identifier):
+        self._identifier = identifier
+        self.update_db_type()
+    identifier = property(_get_identifier, _set_identifier)
+        
+    def _get_port_spec_item(self):
+        return self._port_spec_item
+    def _set_port_spec_item(self, psi):
+        self._port_spec_item = psi
+    port_spec_item = property(_get_port_spec_item, _set_port_spec_item)
+
+    def _get_spec_tuple(self):
+        return (self._identifier, self._type, self._namespace)
+    spec_tuple = property(_get_spec_tuple)
+
+    def serialize(self, dom, element):
+        """ serialize(dom, element) -> None 
+        Writes itself in XML 
+
+        """
+        child = dom.createElement('param')
+        child.setAttribute('name',self.name)
+        ctype = dom.createElement('type')
+        cval = dom.createElement('val')
+        calias = dom.createElement('alias')
+        ttype = dom.createTextNode(self.typeStr)
+        tval = dom.createTextNode(self.strValue)        
+        talias = dom.createTextNode(self.alias)
+        child.appendchild(ctype)
+        child.appendChild(cval)
+        ctype.appendChild(ttype)
+        cval.appendChild(tval)
+        calias.appendChild(talias)
+        element.appendChild(child)
+
+    def value(self):
+        """  value() -> any type 
+        Returns its strValue as a python type.
+
+        """
+        from vistrails.core.modules.module_registry import get_module_registry
+        module = get_module_registry().get_module_by_name(self.identifier, 
+                                                          self.type, 
+                                                          self.namespace)
+        if self.strValue == "":
+            self.strValue = module.default_value
+            return module.default_value
+        return module.translate_to_python(self.strValue)
+
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(self) != type(other):
+            print "type mismatch"
+            return
+        if self.typeStr != other.typeStr:
+            print "paramtype mismatch"
+            return
+        if self.strValue != other.strValue:
+            print "strvalue mismatch"
+            return
+        if self.name != other.name:
+            print "name mismatch"
+            return
+        if self.alias != other.alias:
+            print "alias mismatch"
+            return
+        if self.minValue != other.minValue:
+            print "minvalue mismatch"
+            return
+        if self.maxValue != other.maxValue:
+            print "maxvalue mismatch"
+            return
+        if self.evaluatedStrValue != other.evaluatedStrValue:
+            print "evaluatedStrValue mismatch"
+            return
+        print "no difference found"
+        assert self == other
+        return
+        
+
+    ##########################################################################
+    # Operators
+
+    def __str__(self):
+        """ __str__() -> str - Returns a string representation of itself """
+        if self.minValue != "":
+            assert False
+        else:
+            return ("(Param '%s' db_type='%s' strValue='%s' real_id='%s' pos='%s' identifier='%s' alias='%s' namespace='%s')@%X" %
+                    (self.name,
+                     self.db_type,
+                     self.strValue,
+                     self.real_id,
+                     self.pos,
+                     self.identifier,
+                     self.alias,
+                     self.namespace,
+                     id(self)))
+
+    def __eq__(self, other):
+        """ __eq__(other: ModuleParam) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.type != other.type:
+            return False
+        if self.strValue != other.strValue:
+            return False
+        if self.name != other.name:
+            return False
+        if self.alias != other.alias:
+            return False
+        if self.minValue != other.minValue:
+            return False
+        if self.maxValue != other.maxValue:
+            return False
+        if self.evaluatedStrValue != other.evaluatedStrValue:
+            return False
+        return True
+
+    def __ne__(self, other):
+        """ __ne__(other: ModuleParam) -> boolean
+        Returns True if self and other don't have the same attributes. 
+        Used by !=  operator. 
+        
+        """
+        return not self.__eq__(other)
+
+###############################################################################
+# Testing
+
+
+class TestModuleParam(unittest.TestCase):
+
+    def create_param(self, id_scope=IdScope()):
+        param = ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                            pos=2,
+                            type='Int',
+                            val='1')
+        return param
+
+    def test_copy(self):        
+        id_scope = IdScope()
+        p1 = self.create_param(id_scope)
+        p2 = copy.copy(p1)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)
+        p3 = p1.do_copy(True, id_scope, {})
+        self.assertEquals(p1, p3)
+        self.assertNotEquals(p1.real_id, p3.real_id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        p1 = self.create_param()
+        xml_str = vistrails.core.db.io.serialize(p1)
+        p2 = vistrails.core.db.io.unserialize(xml_str, ModuleParam)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.real_id, p2.real_id)
+    
+    def testValue(self):
+        """ Test values returned by value() function """
+        basic_pkg = get_vistrails_basic_pkg_id()
+
+        p = ModuleParam()
+        p.type = "Float"
+        p.identifier = basic_pkg
+        assert p.value() == 0.0
+        p.strValue = "1.5"
+        assert p.value() == 1.5
+
+        p.type = "Integer"
+        p.identifier = basic_pkg
+        p.strValue = ""
+        assert p.value() == 0
+        p.strValue = "2"
+        assert p.value() == 2
+
+        p.type = "String"
+        p.identifier = basic_pkg
+        p.strValue = ""
+        assert p.value() == ""
+        p.strValue = "test"
+        assert p.value() == "test"
+
+        p.type = "Boolean"
+        p.identifier = basic_pkg
+        p.strValue = ""
+        assert p.value() == False
+        p.strValue = "False"
+        assert p.value() == False
+        p.strValue = "True"
+        assert p.value() == True
+
+    def testComparisonOperators(self):
+        """ Test comparison operators """
+        p = ModuleParam()
+        q = ModuleParam()
+        assert p == q
+        q.type = "Float"
+        assert p != q
+
+    def test_str(self):
+        p = ModuleParam(type='Float', val='1.5')
+        str(p)
+
+
+    def test_parse(self):
+        basic_pkg = get_vistrails_basic_pkg_id()
+
+        p = ModuleParam(type='Integer', val='1.5')
+        self.assertEqual(p.identifier, basic_pkg)
+        self.assertEqual(p.type, 'Integer')
+        self.assertFalse(p.namespace)
diff --git a/vistrails/core/vistrail/operation.py b/vistrails/core/vistrail/operation.py
new file mode 100644
index 0000000..bcb4f78
--- /dev/null
+++ b/vistrails/core/vistrail/operation.py
@@ -0,0 +1,413 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBAdd, DBChange, DBDelete
+from vistrails.db.domain import DBAnnotation, DBAbstraction, DBConnection, DBGroup, \
+    DBLocation, DBModule, DBFunction, DBPluginData, DBParameter, DBPort, \
+    DBPortSpec
+
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.abstraction import Abstraction
+from vistrails.core.vistrail.connection import Connection
+from vistrails.core.vistrail.group import Group
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.plugin_data import PluginData
+from vistrails.core.vistrail.port import Port
+from vistrails.core.vistrail.port_spec import PortSpec
+
+import unittest
+import copy
+from vistrails.db.domain import IdScope
+import vistrails.core
+
+def convert_data(_data):
+    map = {
+        DBAnnotation.vtType: Annotation,
+        DBAbstraction.vtType: Abstraction,
+        DBConnection.vtType: Connection,
+        DBLocation.vtType: Location,
+        DBModule.vtType: Module,
+        DBFunction.vtType: ModuleFunction,
+        DBGroup.vtType: Group,
+        DBParameter.vtType: ModuleParam,
+        DBPluginData.vtType: PluginData,
+        DBPort.vtType: Port,
+        DBPortSpec.vtType: PortSpec,
+        }
+    try:
+        map[_data.vtType].convert(_data)
+    except KeyError:
+        raise TypeError('cannot convert data of type %s' % _data.vtType)
+
+class AddOp(DBAdd):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBAdd.__init__(self, *args, **kwargs)
+    
+    def __copy__(self):
+        return AddOp.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = AddOp
+        return cp
+
+    @staticmethod
+    def convert(_add_op):
+        if _add_op.__class__ == AddOp:
+            return
+        _add_op.__class__ = AddOp
+        if _add_op.data is not None:
+            convert_data(_add_op.data)
+    ##########################################################################
+    # Properties
+
+    id = DBAdd.db_id
+    what = DBAdd.db_what
+    objectId = DBAdd.db_objectId
+    old_obj_id = DBAdd.db_objectId
+    new_obj_id = DBAdd.db_objectId
+    parentObjId = DBAdd.db_parentObjId
+    parentObjType = DBAdd.db_parentObjType
+    data = DBAdd.db_data
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an Annotation
+        object. 
+
+        """
+        
+        rep = ("<add id=%s what=%s objectId=%s parentObjId=%s" + \
+               " parentObjType=%s>") % (str(self.id), str(self.what), str(self.objectId),
+                                        str(self.parentObjId), str(self.parentObjType))
+        rep += str(self.data) + "</add>"
+        return rep
+
+    # FIXME expand this
+    def __eq__(self, other):
+        """ __eq__(other: AddOp) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+class ChangeOp(DBChange):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBChange.__init__(self, *args, **kwargs)
+
+    def __copy__(self):
+        return ChangeOp.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = ChangeOp
+        return cp
+    
+    @staticmethod
+    def convert(_change_op):
+        if _change_op.__class__ == ChangeOp:
+            return
+        _change_op.__class__ = ChangeOp
+        if _change_op.data is not None:
+            convert_data(_change_op.data)
+
+    ##########################################################################
+    # Properties
+    
+    id = DBChange.db_id
+    what = DBChange.db_what
+    oldObjId = DBChange.db_oldObjId
+    old_obj_id = DBChange.db_oldObjId
+    newObjId = DBChange.db_newObjId
+    new_obj_id = DBChange.db_newObjId
+    parentObjId = DBChange.db_parentObjId
+    parentObjType = DBChange.db_parentObjType
+    data = DBChange.db_data
+
+    # def _get_id(self):
+    #     return self.db_id
+    # def _set_id(self, id):
+    #     self.db_id = id
+    # id = property(_get_id, _set_id)
+
+    # def _get_what(self):
+    #     return self.db_what
+    # def _set_what(self, what):
+    #     self.db_what = what
+    # what = property(_get_what, _set_what)
+
+    # def _get_oldObjId(self):
+    #     return self.db_oldObjId
+    # def _set_oldObjId(self, oldObjId):
+    #     self.db_oldObjId = oldObjId
+    # oldObjId = property(_get_oldObjId, _set_oldObjId)
+    # old_obj_id = property(_get_oldObjId, _set_oldObjId)
+
+    # def _get_newObjId(self):
+    #     return self.db_newObjId
+    # def _set_newObjId(self, newObjId):
+    #     self.db_newObjId = newObjId
+    # newObjId = property(_get_newObjId, _set_newObjId)
+    # new_obj_id = property(_get_newObjId, _set_newObjId)
+
+    # def _get_parentObjId(self):
+    #     return self.db_parentObjId
+    # def _set_parentObjId(self, parentObjId):
+    #     self.db_parentObjId = parentObjId
+    # parentObjId = property(_get_parentObjId, _set_parentObjId)
+
+    # def _get_parentObjType(self):
+    #     return self.db_parentObjType
+    # def _set_parentObjType(self, parentObjType):
+    #     self.db_parentObjType = parentObjType
+    # parentObjType = property(_get_parentObjType, _set_parentObjType)
+
+    # def _get_data(self):
+    #     return self.db_data
+    # def _set_data(self, data):
+    #     self.db_data = data
+    # data = property(_get_data, _set_data)
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an Annotation
+        object. 
+
+        """
+        rep = "<change id=%s what=%s oldId=%s newId=%s parentObjId=%s" + \
+            " parentObjType=%s>" + str(self.data) + "</change>"
+        return rep % (str(self.id), str(self.what), str(self.oldObjId),
+                      str(self.newObjId), str(self.parentObjId), 
+                      str(self.parentObjType))
+
+    # FIXME expand this
+    def __eq__(self, other):
+        """ __eq__(other: ChangeOp) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+class DeleteOp(DBDelete):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBDelete.__init__(self, *args, **kwargs)
+    
+    def __copy__(self):
+        return DeleteOp.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DeleteOp
+        return cp
+
+    @staticmethod
+    def convert(_delete_op):
+        _delete_op.__class__ = DeleteOp
+
+    ##########################################################################
+    # Properties
+
+    id = DBDelete.db_id
+    what = DBDelete.db_what
+    objectId = DBDelete.db_objectId
+    old_obj_id = DBDelete.db_objectId
+    new_obj_id = DBDelete.db_objectId
+    parentObjId = DBDelete.db_parentObjId
+    parentObjType = DBDelete.db_parentObjType
+
+    # def _get_id(self):
+    #     return self.db_id
+    # def _set_id(self, id):
+    #     self.db_id = id
+    # id = property(_get_id, _set_id)
+
+    # def _get_what(self):
+    #     return self.db_what
+    # def _set_what(self, what):
+    #     self.db_what = what
+    # what = property(_get_what, _set_what)
+
+    # def _get_objectId(self):
+    #     return self.db_objectId
+    # def _set_objectId(self, objectId):
+    #     self.db_objectId = objectId
+    # objectId = property(_get_objectId, _set_objectId)
+    # old_obj_id = property(_get_objectId, _set_objectId)
+    # new_obj_id = property(_get_objectId, _set_objectId)
+
+    # def _get_parentObjId(self):
+    #     return self.db_parentObjId
+    # def _set_parentObjId(self, parentObjId):
+    #     self.db_parentObjId = parentObjId
+    # parentObjId = property(_get_parentObjId, _set_parentObjId)
+    
+    # def _get_parentObjType(self):
+    #     return self.db_parentObjType
+    # def _set_parentObjType(self, parentObjType):
+    #     self.db_parentObjType = parentObjType
+    # parentObjType = property(_get_parentObjType, _set_parentObjType)
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an Annotation
+        object. 
+
+        """
+        rep = "<delete id=%s what=%s objectId=%s parentObjId=%s" + \
+            " parentObjType=%s/>"
+        return rep % (str(self.id), str(self.what), str(self.objectId),
+                      str(self.parentObjId), str(self.parentObjType))
+
+    # FIXME expand this
+    def __eq__(self, other):
+        """ __eq__(other: DeleteOp) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+################################################################################
+# Unit tests
+
+
+class TestOperation(unittest.TestCase):
+    
+    def create_ops(self, id_scope=IdScope()):
+        from vistrails.core.modules.basic_modules import identifier as basic_pkg
+        from vistrails.core.vistrail.module import Module
+        from vistrails.core.vistrail.module_function import ModuleFunction
+        from vistrails.core.vistrail.module_param import ModuleParam
+        from vistrails.core.vistrail.annotation import Annotation
+        
+        if id_scope is None:
+            id_scope = IdScope(remap={AddOp.vtType: 'operation',
+                                      ChangeOp.vtType: 'operation',
+                                      DeleteOp.vtType: 'operation'})
+
+        m = Module(id=id_scope.getNewId(Module.vtType),
+                   name='Float',
+                   package=basic_pkg)
+        add_op = AddOp(id=id_scope.getNewId(AddOp.vtType),
+                       what=Module.vtType,
+                       objectId=m.id,
+                       data=m)
+        function = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                  name='value')
+        change_op = ChangeOp(id=id_scope.getNewId(ChangeOp.vtType),
+                             what=ModuleFunction.vtType,
+                             oldObjId=2,
+                             newObjId=function.real_id,
+                             parentObjId=m.id,
+                             parentObjType=Module.vtType,
+                             data=function)
+        param = ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                            type='Float',
+                            val='1.0')
+        
+        delete_op = DeleteOp(id=id_scope.getNewId(DeleteOp.vtType),
+                             what=ModuleParam.vtType,
+                             objectId=param.real_id,
+                             parentObjId=function.real_id,
+                             parentObjType=ModuleFunction.vtType)
+
+        annotation = Annotation(id=id_scope.getNewId(Annotation.vtType),
+                                key='foo',
+                                value='bar')
+        add_annotation = AddOp(id=id_scope.getNewId(AddOp.vtType),
+                               what=Annotation.vtType,
+                               objectId=m.id,
+                               data=annotation)
+        
+        return [add_op, change_op, delete_op, add_annotation]
+
+    def test_copy(self):       
+        id_scope = IdScope(remap={AddOp.vtType: 'operation',
+                                  ChangeOp.vtType: 'operation',
+                                  DeleteOp.vtType: 'operation'})
+        for op1 in self.create_ops(id_scope):
+            op2 = copy.copy(op1)
+            self.assertEquals(op1, op2)
+            self.assertEquals(op1.id, op2.id)
+            op3 = op1.do_copy(True, id_scope, {})
+            self.assertEquals(op1, op3)
+            self.assertNotEquals(op1.id, op3.id)
+            if hasattr(op1, 'data'):
+                self.assertNotEquals(op1.data.db_id, op3.data.db_id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        for op1 in self.create_ops():
+            xml_str = vistrails.core.db.io.serialize(op1)
+            op2 = vistrails.core.db.io.unserialize(xml_str, op1.__class__)
+            self.assertEquals(op1, op2)
+            self.assertEquals(op1.id, op2.id)
diff --git a/vistrails/core/vistrail/pipeline.py b/vistrails/core/vistrail/pipeline.py
new file mode 100644
index 0000000..fba8463
--- /dev/null
+++ b/vistrails/core/vistrail/pipeline.py
@@ -0,0 +1,1698 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+##TODO Tests
+""" This module defines the class Pipeline """
+from vistrails.core.cache.hasher import Hasher
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core.data_structures.graph import Graph
+from vistrails.core import debug
+from vistrails.core.modules.module_descriptor import ModuleDescriptor
+from vistrails.core.modules.module_registry import get_module_registry, \
+    ModuleRegistryException, MissingModuleVersion, MissingPackage, PortMismatch
+from vistrails.core.system import get_vistrails_default_pkg_prefix, \
+    get_vistrails_basic_pkg_id
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.utils import expression, append_to_dict_of_lists
+from vistrails.core.utils.uxml import named_elements
+from vistrails.core.vistrail.abstraction import Abstraction
+from vistrails.core.vistrail.connection import Connection
+from vistrails.core.vistrail.group import Group
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.plugin_data import PluginData
+from vistrails.core.vistrail.port import Port, PortEndPoint
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.db.domain import DBWorkflow
+import vistrails.core.vistrail.action
+from vistrails.core.utils import profile, InvalidPipeline, versions_increasing
+
+from xml.dom.minidom import getDOMImplementation, parseString
+import copy
+
+import unittest
+from vistrails.core.vistrail.abstraction import Abstraction
+from vistrails.core.vistrail.connection import Connection
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.port import Port
+from vistrails.db.domain import IdScope
+
+##############################################################################
+
+class MissingVistrailVariable(Exception):
+    def __init__(self, var_uuid, identifier, name, namespace):
+        self._var_uuid = var_uuid
+        self._identifier = identifier
+        self._name = name
+        self._namespace = namespace
+
+    def __str__(self):
+        return "Missing Vistrail Variable '%s' of type %s from package %s" % (self._var_uuid,
+                self._module_name, self._identifier)
+        
+    def __eq__(self, other):
+        return type(self) == type(other) and \
+            self._var_uuid == other._var_uuid and \
+            self._identifier == other._identifier and \
+            self._name == other._name and \
+            self._namespace == other._namespace
+
+    def __hash__(self):
+        return (type(self), self._var_uuid, self._identifier,
+                self._name, self._namespace).__hash__()
+
+    def _get_module_name(self):
+        if self._namespace:
+            return "%s|%s" % (self._namespace, self._name)
+        return self._name
+    _module_name = property(_get_module_name)
+
+class MissingFunction(Exception):
+    def __init__(self, name, module_name, module_id=None):
+        self.name = name
+        self.module_name = module_name
+        self.module_id = module_id
+
+    def __str__(self):
+        return ("Missing Function '%s' on module '%s'%s" % 
+                (self.name, self.module_name, " (id %d)" % self.module_id if
+                 self.module_id is not None else ""))
+
+class CycleInPipeline(Exception):
+    def __str__(self):
+        return "Pipeline contains a cycle"
+
+class Pipeline(DBWorkflow):
+    """ A Pipeline is a set of modules and connections between them. """
+    
+    def __init__(self, *args, **kwargs):
+        """ __init__() -> Pipelines
+        Initializes modules, connections and graph.
+
+        """
+        self.clear()
+
+        DBWorkflow.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = 0
+        if self.name is None:
+            self.name = 'untitled'
+        self.set_defaults()
+
+    def set_defaults(self, other=None):
+        if other is None:
+            self.is_valid = False
+            self.aliases = Bidict()
+            self._subpipeline_signatures = Bidict()
+            self._module_signatures = Bidict()
+            self._connection_signatures = Bidict()
+        else:
+            self.is_valid = other.is_valid
+            self.aliases = Bidict([(k,copy.copy(v))
+                                   for (k,v) in other.aliases.iteritems()])
+            self._connection_signatures = \
+                Bidict([(k,copy.copy(v))
+                        for (k,v) in other._connection_signatures.iteritems()])
+            self._subpipeline_signatures = \
+                Bidict([(k,copy.copy(v))
+                        for (k,v) in other._subpipeline_signatures.iteritems()])
+            self._module_signatures = \
+                Bidict([(k,copy.copy(v))
+                        for (k,v) in other._module_signatures.iteritems()])
+
+        self.graph = Graph()
+        for module in self.module_list:
+            self.graph.add_vertex(module.id)
+            # there should be another way to do this
+            m_id = module.id
+            for fun in module.functions:
+                for par in fun.parameters:
+                    self.change_alias(par.alias,
+                                      par.vtType,
+                                      par.real_id,
+                                      fun.vtType,
+                                      fun.real_id,
+                                      m_id)
+            module.connected_input_ports = {}
+            module.connected_output_ports = {}
+
+        for connection in self.connection_list:
+            self.graph.add_edge(connection.source.moduleId,
+                                connection.destination.moduleId,
+                                connection.id)
+            c = connection
+            source_name = c.source.name
+            output_ports = self.modules[c.sourceId].connected_output_ports
+            if source_name not in output_ports:
+                output_ports[source_name] = 0
+            output_ports[source_name] += 1
+                
+            dest_name = c.destination.name
+            input_ports = self.modules[c.destinationId].connected_input_ports
+            if dest_name not in input_ports:
+                input_ports[dest_name] = 0
+            input_ports[dest_name] += 1
+            
+    def __copy__(self):
+        """ __copy__() -> Pipeline - Returns a clone of itself """ 
+        return Pipeline.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Pipeline
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_workflow):
+        if _workflow.__class__ == Pipeline:
+            return
+        # do clear plus get the modules and connections
+        _workflow.__class__ = Pipeline
+        for _module in _workflow.db_modules:
+            if _module.vtType == Module.vtType:
+                Module.convert(_module)
+            elif _module.vtType == Abstraction.vtType:
+                Abstraction.convert(_module)
+            elif _module.vtType == Group.vtType:
+                Group.convert(_module)
+        for _connection in _workflow.db_connections:
+            Connection.convert(_connection)
+        for _plugin_data in _workflow.db_plugin_datas:
+            PluginData.convert(_plugin_data)
+        _workflow.set_defaults()
+
+    ##########################################################################
+
+    def find_method(self, module_id, parameter_name):
+        """find_method(module_id, parameter_name) -> int.
+
+        Finds the function_id for a given method name.
+        Returns -1 if method name is not there.
+
+        WARNING: Might not work for overloaded methods (where types
+        also matter)
+        """
+        try:
+            return [f.name
+                    for f
+                    in self.get_module_by_id(module_id).functions].index(parameter_name)
+        except ValueError:
+            return -1
+
+    ##########################################################################
+    # Properties
+
+    id = DBWorkflow.db_id
+    name = DBWorkflow.db_name
+    plugin_datas = DBWorkflow.db_plugin_datas
+
+    def _get_modules(self):
+        return self.db_modules_id_index
+    modules = property(_get_modules)
+    def _get_module_list(self):
+        return self.db_modules
+    module_list = property(_get_module_list)
+
+    def _get_connections(self):
+        return self.db_connections_id_index
+    connections = property(_get_connections)
+    def _get_connection_list(self):
+        return self.db_connections
+    connection_list = property(_get_connection_list)
+
+    def clear(self):
+        """clear() -> None. Erases pipeline contents."""
+        if hasattr(self, 'db_modules'):
+            for module in self.db_modules:
+                self.db_delete_module(module)
+        if hasattr(self, 'db_connections'):
+            for connection in self.db_connections:
+                self.db_delete_connection(connection)
+        self.graph = Graph()
+        self.aliases = Bidict()
+        self._subpipeline_signatures = Bidict()
+        self._module_signatures = Bidict()
+        self._connection_signatures = Bidict()
+
+    def get_tmp_id(self, type):
+        """get_tmp_id(type: str) -> long
+        returns a temporary id for a workflow item.  Use the idScope on the
+        vistrail for permanent ids.
+        """
+
+        return -self.tmp_id.getNewId(type)
+
+    def fresh_module_id(self):
+        return self.get_tmp_id(Module.vtType)
+    def fresh_connection_id(self):
+        return self.get_tmp_id(Connection.vtType)
+
+    def check_connection(self, c):
+        """check_connection(c: Connection) -> boolean 
+        Checks semantics of connection
+          
+        """
+        if c.source.endPoint != Port.SourceEndPoint:
+            return False
+        if c.destination.endPoint != Port.DestinationEndPoint:
+            return False
+        if not self.has_module_with_id(c.sourceId):
+            return False
+        if not self.has_module_with_id(c.destinationId):
+            return False
+        if c.source.type != c.destination.type:
+            return False
+        return True
+    
+    def connects_at_port(self, p):
+        """ connects_at_port(p: Port) -> list of Connection 
+        Returns a list of Connections that connect at port p
+        
+        """
+        result = []
+        if p.endPoint == Port.DestinationEndPoint:
+            el = self.graph.edges_to(p.moduleId)
+            for (edgeto, edgeid) in el:
+                dest = self.connection[edgeid].destination
+                if VTKRTTI().intrinsicPortEqual(dest, p):
+                    result.append(self.connection[edgeid])
+        elif p.endPoint == Port.SourceEndPoint:
+            el = self.graph.edges_from(p.moduleId)
+            for (edgeto, edgeid) in el:
+                source = self.connection[edgeid].source
+                if VTKRTTI().intrinsicPortEqual(source, p):
+                    result.append(self.connection[edgeid])
+        else:
+            raise VistrailsInternalError("port with bogus information")
+        return result
+
+    def connections_to_module(self, moduleId):
+        """ connections_to_module(int moduleId) -> list of module ids
+        returns a list of module ids that are inputs to the given moduleId
+
+        """
+
+        modules = []
+        for edge in self.graph.edges_to(moduleId):
+            modules.append(self.modules[edge[0]].id)
+        return modules
+
+    def get_inputPort_modules(self, moduleId, portName):
+        """ get_inputPort_modules(int moduleId, string portName)-> list of module ids
+        returns a list of module ids that are the input to a given port
+        on a given module
+
+        """
+        modules = []
+        for edge in self.graph.edges_to(moduleId):
+            if self.connections[edge[1]].destination.name == portName:
+                modules.append(self.modules[edge[0]].id)
+        return modules
+
+    def get_outputPort_modules(self, moduleId, portName):
+        """ get_outputPort_modules(int moduleId, string portName)-> list of module ids
+        returns a list of module ids that are the output to a given port
+        on a given module
+        """
+        modules = []
+        for edge in self.graph.edges_from(moduleId):
+            if self.connections[edge[1]].source.name == portName:
+                modules.append(self.modules[edge[0]].id)
+        return modules
+
+    def perform_action_chain(self, actionChain):
+        # BEWARE: if actionChain is long, you're probably better off
+        # going through general_action_chain, because it optimizes
+        # away unnecessary operations.
+        for action in actionChain:
+            self.perform_action(action)
+
+    def perform_action(self, action):
+#         print "+++"
+#         for operation in action.operations:
+#             print operation.vtType, operation.what, operation.old_obj_id, \
+#                 operation.new_obj_id, operation.parentObjType, operation.parentObjId
+#         print "---"
+        for operation in action.operations:
+            self.perform_operation(operation)
+
+    def perform_operation_chain(self, opChain):
+        for op in opChain:
+            self.perform_operation(op)
+
+    def perform_operation(self, op):
+        # print "doing %s %s %s" % (op.id, op.vtType, op.what)
+        if op.db_what == 'abstraction' or op.db_what == 'group':
+            what = 'module'
+        else:
+            what = op.db_what
+        funname = '%s_%s' % (op.vtType, what)
+        try:
+            f = getattr(self, funname)
+        except AttributeError:
+            db_funname = 'db_%s_object' % op.vtType
+            try:
+                f = getattr(self, db_funname)
+            except AttributeError:
+                msg = "Pipeline cannot execute '%s %s' operation" % \
+                    (op.vtType, op.what)
+                raise VistrailsInternalError(msg)
+
+        if op.vtType == 'add':
+            f(op.data, op.parentObjType, op.parentObjId)
+        elif op.vtType == 'delete':
+            f(op.objectId, op.what, op.parentObjType, op.parentObjId)
+        elif op.vtType == 'change':
+            f(op.oldObjId, op.data, op.parentObjType, op.parentObjId)
+
+    def add_module(self, m, *args):
+        """add_module(m: Module) -> None 
+        Add new module to pipeline
+          
+        """
+        if self.has_module_with_id(m.id):
+            raise VistrailsInternalError("duplicate module id: %d" % m.id )
+#         self.modules[m.id] = copy.copy(m)
+#         if m.vtType == Abstraction.vtType:
+#             m.abstraction = self.abstraction_map[m.abstraction_id]
+        self.db_add_object(m)
+        self.graph.add_vertex(m.id)
+
+    def change_module(self, old_id, m, *args):
+        if not self.has_module_with_id(old_id):
+            raise VistrailsInternalError("module %s doesn't exist" % old_id)
+        self.db_change_object(old_id, m)
+        self.graph.delete_vertex(old_id)
+        self.graph.add_vertex(m.id)
+
+    def delete_module(self, id, *args):
+        """delete_module(id:int) -> None 
+        Delete a module from pipeline given an id.
+
+        """
+        if not self.has_module_with_id(id):
+            raise VistrailsInternalError("id missing in modules")
+
+        # we're hiding the necessary operations by doing this!
+        for (_, conn_id) in self.graph.adjacency_list[id][:]:
+            self.delete_connection(conn_id)
+        for (_, conn_id) in self.graph.inverse_adjacency_list[id][:]:
+            self.delete_connection(conn_id)
+
+        # self.modules.pop(id)
+        self.db_delete_object(id, Module.vtType)
+        self.graph.delete_vertex(id)
+        if id in self._module_signatures:
+            del self._module_signatures[id]
+        if id in self._subpipeline_signatures:
+            del self._subpipeline_signatures[id]
+
+    def add_connection(self, c, *args):
+        """add_connection(c: Connection) -> None 
+        Add new connection to pipeline.
+          
+        """
+        if self.has_connection_with_id(c.id):
+            raise VistrailsInternalError("duplicate connection id " + str(c.id))
+#         self.connections[c.id] = copy.copy(c)
+        self.db_add_object(c)
+        if c.source is not None and c.destination is not None:
+            assert(c.sourceId != c.destinationId)        
+            self.graph.add_edge(c.sourceId, c.destinationId, c.id)
+            self.ensure_connection_specs([c.id])
+
+            source_name = c.source.name
+            output_ports = self.modules[c.sourceId].connected_output_ports
+            if source_name not in output_ports:
+                output_ports[source_name] = 0
+            output_ports[source_name] += 1
+                
+            dest_name = c.destination.name
+            input_ports = self.modules[c.destinationId].connected_input_ports
+            if dest_name not in input_ports:
+                input_ports[dest_name] = 0
+            input_ports[dest_name] += 1
+
+    def change_connection(self, old_id, c, *args):
+        """change_connection(old_id: long, c: Connection) -> None
+        Deletes connection identified by old_id and adds connection c
+
+        """
+        if not self.has_connection_with_id(old_id):
+            raise VistrailsInternalError("connection %s doesn't exist" % old_id)
+
+        old_conn = self.connections[old_id]
+        if old_conn.source is not None and old_conn.destination is not None:
+            self.graph.delete_edge(old_conn.sourceId, old_conn.destinationId,
+                                   old_conn.id)
+            if self.graph.out_degree(old_conn.sourceId) < 1:
+                self.modules[old_conn.sourceId].connected_output_ports.discard(
+                    conn.source.name)
+            if self.graph.in_degree(old_conn.destinationId) < 1:
+                connected_input_ports = \
+                    self.modules[old_conn.destinationId].connected_input_ports
+                connected_input_ports.discard(conn.destination.name)
+
+        if old_id in self._connection_signatures:
+            del self._connection_signatures[old_id]
+        self.db_change_object(old_id, c)        
+        if c.source is not None and c.destination is not None:
+            assert(c.sourceId != c.destinationId)
+            self.graph.add_edge(c.sourceId, c.destinationId, c.id)
+            self.ensure_connection_specs([c.id])
+            self.modules[c.sourceId].connected_output_ports.add(c.source.name)
+            self.modules[c.destinationId].connected_input_ports.add(
+                c.destination.name)
+
+    def delete_connection(self, id, *args):
+        """ delete_connection(id:int) -> None 
+        Delete connection identified by id from pipeline.
+           
+        """
+
+        if not self.has_connection_with_id(id):
+            raise VistrailsInternalError("id %s missing in connections" % id)
+        conn = self.connections[id]
+        # self.connections.pop(id)
+        self.db_delete_object(id, 'connection')
+        if conn.source is not None and conn.destination is not None and \
+                (conn.destinationId, conn.id) in \
+                self.graph.edges_from(conn.sourceId):
+            self.graph.delete_edge(conn.sourceId, conn.destinationId, conn.id)
+
+            c = conn
+            source_name = c.source.name
+            output_ports = self.modules[c.sourceId].connected_output_ports
+            output_ports[source_name] -= 1
+                
+            dest_name = c.destination.name
+            input_ports = self.modules[c.destinationId].connected_input_ports
+            input_ports[dest_name] -= 1
+
+        if id in self._connection_signatures:
+            del self._connection_signatures[id]
+        
+    def add_parameter(self, param, parent_type, parent_id):
+        self.db_add_object(param, parent_type, parent_id)
+        if not self.has_alias(param.alias):
+            self.change_alias(param.alias, 
+                              param.vtType, 
+                              param.real_id,
+                              parent_type,
+                              parent_id,
+                              None)
+
+    def delete_parameter(self, param_id, param_type, parent_type, parent_id):
+        self.db_delete_object(param_id, ModuleParam.vtType,
+                              parent_type, parent_id)
+        self.remove_alias(ModuleParam.vtType, param_id, parent_type, 
+                          parent_id, None)
+
+    def change_parameter(self, old_param_id, param, parent_type, parent_id):
+        self.remove_alias(ModuleParam.vtType, old_param_id, 
+                          parent_type, parent_id, None)
+        self.db_change_object(old_param_id, param,
+                              parent_type, parent_id)
+        if not self.has_alias(param.alias):
+            self.change_alias(param.alias, 
+                              param.vtType, 
+                              param.real_id,
+                              parent_type,
+                              parent_id,
+                              None)
+
+    def add_port(self, port, parent_type, parent_id):
+        self.db_add_object(port, parent_type, parent_id)
+        connection = self.connections[parent_id]
+        if connection.source is not None and \
+                connection.destination is not None:
+            self.graph.add_edge(connection.sourceId, 
+                                connection.destinationId, 
+                                connection.id)
+            c = connection
+            source_name = c.source.name
+            output_ports = self.modules[c.sourceId].connected_output_ports
+            if source_name not in output_ports:
+                output_ports[source_name] = 0
+            output_ports[source_name] += 1
+                
+            dest_name = c.destination.name
+            input_ports = self.modules[c.destinationId].connected_input_ports
+            if dest_name not in input_ports:
+                input_ports[dest_name] = 0
+            input_ports[dest_name] += 1
+
+    def delete_port(self, port_id, port_type, parent_type, parent_id):
+        conn = self.connections[parent_id]
+        if len(conn.ports) >= 2:
+            self.graph.delete_edge(conn.sourceId, 
+                                   conn.destinationId, 
+                                   conn.id)
+            c = conn
+            source_name = c.source.name
+            output_ports = self.modules[c.sourceId].connected_output_ports
+            output_ports[source_name] -= 1
+                
+            dest_name = c.destination.name
+            input_ports = self.modules[c.destinationId].connected_input_ports
+            input_ports[dest_name] -= 1
+            
+        self.db_delete_object(port_id, Port.vtType, parent_type, parent_id)
+
+    def change_port(self, old_port_id, port, parent_type, parent_id):
+        connection = self.connections[parent_id]
+        if len(connection.ports) >= 2:
+            source_list = self.graph.adjacency_list[connection.sourceId]
+            source_list.remove((connection.destinationId, connection.id))
+            dest_list = \
+                self.graph.inverse_adjacency_list[connection.destinationId]
+            dest_list.remove((connection.sourceId, connection.id))
+        self.db_change_object(old_port_id, port, parent_type, parent_id)
+        if len(connection.ports) >= 2:
+            source_list = self.graph.adjacency_list[connection.sourceId]
+            source_list.append((connection.destinationId, connection.id))
+            dest_list = \
+                self.graph.inverse_adjacency_list[connection.destinationId]
+            dest_list.append((connection.sourceId, connection.id))
+
+    def add_port_to_registry(self, portSpec, moduleId):
+        m = self.get_module_by_id(moduleId)
+        m.add_port_spec(portSpec)
+
+    def add_portSpec(self, port_spec, parent_type, parent_id):
+        # self.db_add_object(port_spec, parent_type, parent_id)
+        self.add_port_to_registry(port_spec, parent_id)
+        
+    def delete_port_from_registry(self, id, moduleId):
+        m = self.get_module_by_id(moduleId)
+        portSpec = m.port_specs[id]
+        m.delete_port_spec(portSpec)
+
+    def delete_portSpec(self, spec_id, portSpec_type, parent_type, parent_id):
+        self.delete_port_from_registry(spec_id, parent_id)
+        # self.db_delete_object(spec_id, PortSpec.vtType, parent_type, parent_id)
+
+    def change_portSpec(self, old_spec_id, port_spec, parent_type, parent_id):
+        self.delete_port_from_registry(old_spec_id, parent_id)
+        # self.db_change_object(old_spec_id, port_spec, parent_type, parent_id)
+        self.add_port_to_registry(port_spec, parent_id)
+
+    def add_alias(self, name, type, oId, parentType, parentId, mId):
+        """add_alias(name: str, oId: int, parentType:str, parentId: int, 
+                     mId: int) -> None 
+        Add alias to pipeline
+          
+        """
+        if self.has_alias(name):
+            raise VistrailsInternalError("duplicate alias")
+        if mId is not None:
+            self.aliases[name] = (type, oId, parentType, parentId, mId)
+        else:
+            mid = None
+            for _mod in self.modules.itervalues():
+                for _fun in _mod.functions:
+                    for _par in _fun.parameters:
+                        if (_par.vtType == type and _par.real_id == oId and
+                            _fun.vtType == parentType and 
+                            _fun.real_id == parentId):
+                            mid = _mod.id
+                            break
+            if mid is not None:
+                self.aliases[name] = (type, oId, parentType, parentId, mid)
+                
+    def remove_alias_by_name(self, name):
+        """remove_alias_by_name(name: str) -> None
+        Remove alias with given name """
+        if self.has_alias(name):
+            del self.aliases[name]
+
+    def remove_alias(self, type, oId, parentType, parentId, mId):
+        """remove_alias(name: str, type:str, oId: int, parentType: str, 
+                        parentId: int, mId: int)-> None
+        Remove alias identified by oId """
+        if mId is not None:
+            try:
+                oldname = self.aliases.inverse[(type,oId, parentType, parentId, mId)]
+                del self.aliases[oldname]
+            except KeyError:
+                pass
+        else:
+            oldname = None
+            for aname,(t,o,pt,pid,mid) in self.aliases.iteritems():
+                if (t == type and o == oId and pt == parentType and 
+                    pid == parentId):
+                    oldname = aname
+                    break
+            if oldname:
+                del self.aliases[oldname]
+
+    def change_alias(self, name, type, oId, parentType, parentId, mId):
+        """change_alias(name: str, type:str oId:int, parentType:str,
+                        parentId:int, mId: int)-> None
+        Change alias if name is non empty. Else remove alias
+        
+        """
+        if name == "":
+            self.remove_alias(type, oId, parentType, parentId, mId)
+        else:
+            if not self.has_alias(name):
+                self.remove_alias(type, oId, parentType, parentId, mId)
+                self.add_alias(name, type, oId, parentType, parentId, mId)
+                
+    def get_alias_str_value(self, name):
+        """ get_alias_str_value(name: str) -> str
+        returns the strValue of the parameter with alias name
+
+        """
+        try:
+            what, oId, parentType, parentId, mId = self.aliases[name]
+        except KeyError:
+            return ''
+        else:
+            if what == 'parameter':
+                parameter = self.db_get_object(what, oId)
+                return parameter.strValue
+            else:
+                raise VistrailsInternalError("only parameters are supported")
+
+    def set_alias_str_value(self, name, value):
+        """ set_alias_str_value(name: str, value: str) -> None
+        sets the strValue of the parameter with alias name 
+        
+        """
+        try:
+            what, oId, parentType, parentId, mId = self.aliases[name]
+        except KeyError:
+            pass
+        else:
+            if what == 'parameter':
+                #FIXME: check if a change parameter action needs to be generated
+                parameter = self.db_get_object(what, oId)
+                parameter.strValue = str(value)
+            else:
+                raise VistrailsInternalError("only parameters are supported")
+        
+    def get_module_by_id(self, id):
+        """get_module_by_id(id: int) -> Module
+        Accessor. id is the Module id.
+        
+        """
+        result = self.modules[id]
+        if result.vtType != Abstraction.vtType and \
+                result.vtType != Group.vtType and result.package is None:
+            registry = get_module_registry()
+            debug.critical('module %d is missing package' % id)
+            descriptor = registry.get_descriptor_from_name_only(result.name)
+            result.package = descriptor.identifier
+        return result
+    
+    def get_connection_by_id(self, id):
+        """get_connection_by_id(id: int) -> Connection
+        Accessor. id is the Connection id.
+        
+        """
+        self.ensure_connection_specs([id])
+        return self.connections[id]
+    
+    def module_count(self):
+        """ module_count() -> int 
+        Returns the number of modules in the pipeline.
+        
+        """
+        return len(self.modules)
+    
+    def connection_count(self):
+        """connection_count() -> int 
+        Returns the number of connections in the pipeline.
+        
+        """
+        return len(self.connections)
+    
+    def has_module_with_id(self, id):
+        """has_module_with_id(id: int) -> boolean 
+        Checks whether given module exists.
+
+        """
+        return id in self.modules
+    
+    def has_connection_with_id(self, id):
+        """has_connection_with_id(id: int) -> boolean 
+        Checks whether given connection exists.
+
+        """
+        return id in self.connections
+
+    def has_alias(self, name):
+        """has_alias(name: str) -> boolean 
+        Checks whether given alias exists.
+
+        """
+        return name in self.aliases
+
+    def out_degree(self, id):
+        """out_degree(id: int) -> int - Returns the out-degree of a module. """
+        return self.graph.out_degree(id)
+
+    ##########################################################################
+    # Caching-related
+
+    # Modules
+
+    def module_signature(self, module_id):
+        """module_signature(module_id): string
+        Returns the signature for the module with given module_id."""
+        try:
+            return self._module_signatures[module_id]
+        except KeyError:
+            registry = get_module_registry()
+            m = self.modules[module_id]
+            sig = registry.module_signature(self, m)
+            self._module_signatures[module_id] = sig
+            return sig
+    
+    def module_id_from_signature(self, signature):
+        """module_id_from_signature(sig): int
+        Returns the module_id that corresponds to the given signature.
+        This must have been previously computed."""
+        return self._module_signatures.inverse[signature]
+
+    def has_module_signature(self, signature):
+        return signature in self._module_signatures.inverse
+
+    # Subpipelines
+
+    def subpipeline_signature(self, module_id, visited_ids=None):
+        """subpipeline_signature(module_id): string
+        Returns the signature for the subpipeline whose sink id is module_id."""
+        if visited_ids is None:
+            visited_ids = set([module_id])
+        elif module_id in visited_ids:
+            raise CycleInPipeline()
+        try:
+            return self._subpipeline_signatures[module_id]
+        except KeyError:
+            upstream_sigs = [(self.subpipeline_signature(
+                                      m,
+                                      visited_ids | set([module_id])) +
+                              Hasher.connection_signature(
+                                      self.connections[edge_id]))
+                             for (m, edge_id) in
+                             self.graph.edges_to(module_id)]
+            module_sig = self.module_signature(module_id)
+            sig = Hasher.subpipeline_signature(module_sig,
+                                               upstream_sigs)
+            self._subpipeline_signatures[module_id] = sig
+            return sig
+
+    def subpipeline_id_from_signature(self, signature):
+        """subpipeline_id_from_signature(sig): int
+        Returns the module_id that corresponds to the given signature.
+        This must have been previously computed."""
+        return self._subpipeline_signatures.inverse[signature]
+
+    def has_subpipeline_signature(self, signature):
+        return signature in self._subpipeline_signatures.inverse
+
+    # Connections
+
+    def connection_signature(self, connection_id):
+        """connection_signature(id): string
+        Returns the signature for the connection with given id."""
+        try:
+            return self._connection_signatures[connection_id]
+        except KeyError:
+            c = self.connections[connection_id]
+            source_sig = self.subpipeline_signature(c.sourceId)
+            dest_sig = self.subpipeline_signature(c.destinationId)
+            sig = Hasher.connection_subpipeline_signature(c, source_sig,
+                                                          dest_sig)
+            self._connection_signatures[connection_id] = sig
+            return sig
+
+    def connection_id_from_signature(self, signature):
+        return self._connection_signatures.inverse[signature]
+
+    def has_connection_signature(self, signature):
+        return signature in self._connection_signatures.inverse
+
+    def refresh_signatures(self):
+        self._connection_signatures = {}
+        self._subpipeline_signatures = {}
+        self._module_signatures = {}
+        self.compute_signatures()
+
+    def compute_signatures(self):
+        """compute_signatures(): compute all module and subpipeline signatures
+        for this pipeline."""
+        for i in self.modules.iterkeys():
+            self.subpipeline_signature(i)
+        for c in self.connections.iterkeys():
+            self.connection_signature(c)
+
+    def get_subpipeline(self, module_set):
+        """get_subpipeline([module_id] or subgraph) -> Pipeline
+
+        Returns a subset of the current pipeline with the modules passed
+        in as module_ids and the internal connections between them."""
+        if isinstance(module_set, list):
+            subgraph = self.graph.subgraph(module_set)
+        elif isinstance(module_set, Graph):
+            subgraph = module_set
+        else:
+            raise TypeError("Expected list of ints or graph")
+        result = Pipeline()
+        for module_id in subgraph.iter_vertices():
+            result.add_module(copy.copy(self.modules[module_id]))
+        for (conn_from, conn_to, conn_id) in subgraph.iter_all_edges():
+            result.add_connection(copy.copy(self.connections[conn_id]))
+                # TODO : I haven't finished this yet. -cscheid
+        raise NotImplementedError
+        return result
+
+    ##########################################################################
+    # Registry-related
+
+    def validate(self, raise_exception=True, vistrail_vars={}):
+        # want to check entire pipeline and reconcile it with the
+        # registry - if anything fails, generate invalid pipeline with
+        # the errors
+        exceptions = set()
+        try:
+            self.ensure_modules_are_on_registry()
+        except InvalidPipeline, e:
+            exceptions.update(e.get_exception_set())
+
+        # do this before we check connection specs because it is
+        # possible that a subpipeline invalidates the module, meaning
+        # we shouldn't check the connection specs
+        for module in self.modules.itervalues():
+            if module.is_valid and (module.is_group() or 
+                                    module.is_abstraction()):
+                try:
+                    subpipeline = module.pipeline
+                    if subpipeline is not None:
+                        subpipeline.validate()
+                except InvalidPipeline, e:
+                    module.is_valid = False
+                    e._module_id = module.id
+                    exceptions.add(e)
+                if module.is_abstraction():
+                    try:
+                        desc = module.module_descriptor
+                        if long(module.internal_version) != long(desc.version):
+                            exceptions.add(MissingModuleVersion(desc.package, desc.name, desc.namespace, desc.version, desc.package_version, module.id))
+                    except:
+                        pass
+        try:
+            self.ensure_port_specs()
+        except InvalidPipeline, e:
+            exceptions.update(e.get_exception_set())
+        try:
+            self.ensure_connection_specs()
+        except InvalidPipeline, e:
+            exceptions.update(e.get_exception_set())
+        try:
+            self.ensure_functions()
+        except InvalidPipeline, e:
+            exceptions.update(e.get_exception_set())
+        try:
+            self.ensure_vistrail_variables(vistrail_vars)
+        except InvalidPipeline, e:
+            exceptions.update(e.get_exception_set())
+        
+        self.check_subworkflow_versions()
+        
+        if len(exceptions) > 0:
+            if raise_exception:
+                raise InvalidPipeline(exceptions, self)
+            else:
+                self.is_valid = False
+                return False
+
+        self.is_valid = True
+        return True
+
+    def ensure_old_modules_have_package_names(self):
+        """ensure_old_modules_have_package_names()
+
+        Makes sure each module has a package associated with it.
+
+        """
+        for i in self.modules.iterkeys():
+            self.get_module_by_id(i)
+
+    def ensure_connection_specs(self, connection_ids=None):
+        """ensure_connection_specs(connection_ids=None) -> None.
+
+        Computes the specs for the connections in connection_ids. If
+        connection_ids is None, computes it for every connection in the pipeline.
+        """
+        exceptions = set()
+
+        # print 'ensure_connection_specs:', sorted(self.modules.keys())
+
+        def find_spec(port):
+            port.is_valid = False
+            module = self.get_module_by_id(port.moduleId)
+            port_type_map = PortSpec.port_type_map
+            try:
+                # print 'running get_port_spec', port.name
+                port.spec = module.get_port_spec(port.name, 
+                                            port_type_map.inverse[port.type])
+                # print 'got spec', spec, spec.sigstring
+            except ModuleRegistryException, e:
+                # debug.critical('CONNECTION EXCEPTION: %s' % e)
+                exceptions.add(e)
+            else:
+                if port.spec.is_valid:
+                    port.is_valid = True
+            
+        if connection_ids is None:
+            connection_ids = self.connections.iterkeys()
+        for conn_id in connection_ids:
+            conn = self.connections[conn_id]
+            # print 'checking connection', conn_id, conn.source.moduleId, conn.source.moduleName, conn.source.name, conn.destination.moduleId, conn.destination.moduleName, conn.destination.name
+            src_module = self.modules[conn.source.moduleId]
+            if src_module.is_valid:
+                # print 'src_module:', src_module.name, src_module.id
+                find_spec(conn.source)
+            
+            dst_module = self.modules[conn.destination.moduleId]
+            if dst_module.is_valid:
+                # print 'dst_module:', dst_module.name, dst_module.id
+                find_spec(conn.destination)
+
+            # if not conn.source.spec:
+            # conn.source.spec = find_spec(conn.source)
+            # if not conn.destination.spec:
+            # conn.destination.spec = find_spec(conn.destination)
+            # print 'source spec:', conn.source.spec.sigstring
+            # print 'dest spec:', conn.destination.spec.sigstring
+
+        if len(exceptions) > 0:
+            raise InvalidPipeline(exceptions, self)
+
+    def ensure_modules_are_on_registry(self, module_ids=None):
+        """ensure_modules_are_on_registry(module_ids: optional list of module ids) -> None
+
+        Queries the module registry for the module information in the
+        given modules.  The only goal of this function is to trigger
+        exceptions in the registry that will be treated somewhere else
+        in the calling stack.
+        
+        If modules are not on registry, the registry will raise
+        ModuleRegistryException exceptions that should be caught and handled.
+
+        if no module_ids list is given, we assume every module in the pipeline.
+        """
+        def find_descriptors(pipeline, module_ids=None):
+            registry = get_module_registry()
+            conf = get_vistrails_configuration()
+            if module_ids == None:
+                module_ids = pipeline.modules.iterkeys()
+            exceptions = set()
+            for mid in module_ids:
+                module = pipeline.modules[mid]
+                module.is_valid = False
+                if not module.version:
+                    module.version = '0'
+                try:
+                    # FIXME check for upgrades, otherwise use similar
+                    # descriptor, the old behavior
+                    descriptor = module.module_descriptor
+                except ModuleRegistryException, e:
+                    e._module_id = mid
+                    exceptions.add(e)
+                else:
+                    module.is_valid = True
+            return exceptions
+        # end find_descriptors
+
+        exceptions = find_descriptors(self, module_ids)
+        if len(exceptions) > 0:
+            raise InvalidPipeline(exceptions, self)
+
+    def ensure_functions(self):
+        exceptions = set()
+        reg = get_module_registry()
+        for module in self.modules.itervalues():
+            for function in module.functions:
+                is_valid = True
+                if module.is_valid and not module.has_port_spec(function.name, 
+                                                                'input'):
+                    is_valid = False
+                    e = MissingFunction(function.name, module.name, module.id)
+                    e._module_id = module.id
+                    exceptions.add(e)
+                pos_map = {}
+                for p in function.parameters:
+                    if p.identifier == '':
+                        idn = get_vistrails_basic_pkg_id()
+                    else:
+                        idn = p.identifier
+
+                    try:
+                        desc = reg.get_module_by_name(idn,
+                                                      p.type,
+                                                      p.namespace)
+                    except ModuleRegistryException, e:
+                        is_valid = False
+                        e._module_id = module.id
+                        exceptions.add(e)
+
+                    if p.pos in pos_map:
+                        is_valid = False
+                        e = VistrailsInternalError("Module %d has multiple "
+                                                   "values for parameter %d "
+                                                   "of function %s (%d)" % \
+                                                       (module.id,
+                                                        p.pos,
+                                                        function.name,
+                                                        function.real_id))
+                        exceptions.add(e)
+                    pos_map[p.pos] = p
+                function.is_valid = is_valid
+        if len(exceptions) > 0:
+            raise InvalidPipeline(exceptions, self)
+        
+    def ensure_vistrail_variables(self, vistrail_vars):
+        var_uuids = [var.uuid for var in vistrail_vars]
+        exceptions = set()
+        for module in self.modules.itervalues():
+            if module.is_vistrail_var():
+                # first check if value is already set
+                # (used by parameter explorations)
+                value_set = False
+                for func in module.functions:
+                    if func.name == 'value':
+                        if func.params[0].strValue:
+                            value_set = True
+                            continue
+                if value_set:
+                    continue
+                var_uuid = module.get_vistrail_var()
+                if var_uuid not in var_uuids:
+                    e = MissingVistrailVariable(var_uuid, module.package, 
+                                                module.name, module.namespace)
+                    exceptions.add(e)
+        if len(exceptions) > 0:
+            raise InvalidPipeline(exceptions, self)
+
+    def ensure_port_specs(self):
+        exceptions = set()
+        for module in self.modules.itervalues():
+            # if module.is_valid:
+            try:
+                for port_spec in module.port_specs.itervalues():
+                    try:
+                        port_spec.descriptors()
+                    except MissingPackage, e:
+                        port_spec.is_valid = False
+                        e._module_id = module.id
+                        exceptions.add(e)
+                    except ModuleRegistryException, e:
+                        e = PortMismatch(module.package, module.name,
+                                         module.namespace, port_spec.name,
+                                         port_spec.type, port_spec.sigstring)
+                        port_spec.is_valid = False
+                        e._module_id = module.id
+                        exceptions.add(e)
+            except ModuleRegistryException, e:
+                if module.is_valid:
+                    module.is_valid = False
+    
+        if len(exceptions) > 0:
+            raise InvalidPipeline(exceptions, self)
+
+    def check_subworkflow_versions(self):
+        reg = get_module_registry()
+        for module in self.modules.itervalues():
+            if module.is_valid and module.is_abstraction():
+                module.check_latest_version()
+                
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(other) != type(self):
+            print "type mismatch"
+            return
+        if len(self.module_list) != len(other.module_list):
+            print "module lists of different sizes"
+            return
+        if len(self.connection_list) != len(other.connection_list):
+            print "Connection lists of different sizes"
+            return
+        for m_id, m in self.modules.iteritems():
+            if not m_id in other.modules:
+                print "module %d in self but not in other" % m_id
+                return
+            if m <> other.modules[m_id]:
+                print "module %s in self doesn't match module %s in other" % (m,  other.modules[m_id])
+                return
+        for m_id, m in other.modules.iteritems():
+            if not m_id in self.modules:
+                print "module %d in other but not in self" % m_id
+                return
+            # no need to check equality since this was already done before
+        for c_id, c in self.connections.iteritems():
+            if not c_id in other.connections:
+                print "connection %d in self but not in other" % c_id
+                return
+            if c <> other.connections[c_id]:
+                print "connection %s in self doesn't match connection %s in other" % (c,  other.connections[c_id])
+                return
+        for c_id, c, in other.connections.iteritems():
+            if not c_id in self.connections:
+                print "connection %d in other but not in self" % c_id
+                return
+            # no need to check equality since this was already done before
+        assert self == other
+
+    ##########################################################################
+    # Operators
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+# There's a bug in this code that's not easily worked around: if
+# modules are in different order in the list, there's no easy way to
+# check for equality. The solution is to move to a check that
+# takes module and connection ids into account.
+#     def __eq__(self, other):
+#         if type(other) != type(self):
+#             return False
+#         if len(self.module_list) != len(other.module_list):
+#             return False
+#         if len(self.connection_list) != len(other.connection_list):
+#             return False
+#         for f, g in zip(self.module_list, other.module_list):
+#             if f != g:
+#                 return False
+#         for f, g in zip(self.connection_list, other.connection_list):
+#             if f != g:
+#                 return False
+#         return True
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        if len(self.module_list) != len(other.module_list):
+            return False
+        if len(self.connection_list) != len(other.connection_list):
+            return False
+        for m_id, m in self.modules.iteritems():
+            if not m_id in other.modules:
+                return False
+            if m <> other.modules[m_id]:
+                return False
+        for m_id, m in other.modules.iteritems():
+            if not m_id in self.modules:
+                return False
+            # no need to check equality since this was already done before
+        for c_id, c in self.connections.iteritems():
+            if not c_id in other.connections:
+                return False
+            if c <> other.connections[c_id]:
+                return False
+        for c_id, c, in other.connections.iteritems():
+            if not c_id in self.connections:
+                return False
+            # no need to check equality since this was already done before
+        return True
+
+    def __str__(self):
+        return ("(Pipeline Modules: %s Graph:%s)@%X" %
+                ([(m, str(v)) for (m,v) in sorted(self.modules.items())],
+                 str(self.graph),
+                 id(self)))
+
+
+################################################################################
+
+
+class TestPipeline(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        # make sure pythonCalc is loaded
+        from vistrails.core.packagemanager import get_package_manager
+        pm = get_package_manager()
+        if 'pythonCalc' not in pm._package_list: # pragma: no cover # pragma: no partial
+            pm.late_enable_package('pythonCalc')
+
+    def create_default_pipeline(self, id_scope=None):
+        if id_scope is None:
+            id_scope = IdScope()
+        
+        p = Pipeline()
+        p.id = id_scope.getNewId(Pipeline.vtType)
+
+        def module1(p):
+            def f1():
+                f = ModuleFunction()
+                f.real_id = id_scope.getNewId(ModuleFunction.vtType)
+                f.name = 'op'
+                f.returnType = 'void'
+                param = ModuleParam()
+                param.type = 'String'
+                param.strValue = '+'
+                f.params.append(param)
+                return f
+            def f2():
+                f = ModuleFunction()
+                f.real_id = id_scope.getNewId(ModuleFunction.vtType)
+                f.name = 'value1'
+                f.returnType = 'void'
+                param = ModuleParam()
+                param.type = 'Float'
+                param.strValue = '2.0'
+                f.params.append(param)
+                return f
+            def f3():
+                f = ModuleFunction()
+                f.real_id = id_scope.getNewId(ModuleFunction.vtType)
+                f.name = 'value2'
+                f.returnType = 'void'
+                param = ModuleParam()
+                param.type = 'Float'
+                param.strValue = '4.0'
+                f.params.append(param)
+                return f
+            m = Module()
+            m.id = id_scope.getNewId(Module.vtType)
+            m.name = 'PythonCalc'
+            m.package = '%s.pythoncalc' % get_vistrails_default_pkg_prefix()
+            m.functions.append(f1())
+            return m
+        
+        def module2(p):
+            def f1():
+                f = ModuleFunction()
+                f.real_id = id_scope.getNewId(ModuleFunction.vtType)
+                f.name = 'op'
+                f.returnType = 'void'
+                param = ModuleParam()
+                param.type = 'String'
+                param.strValue = '+'
+                f.params.append(param)
+                return f
+            m = Module()
+            m.id = id_scope.getNewId(Module.vtType)
+            m.name = 'PythonCalc'
+            m.package = '%s.pythoncalc' % get_vistrails_default_pkg_prefix()
+            m.functions.append(f1())
+            return m
+        m1 = module1(p)
+        p.add_module(m1)
+        m2 = module1(p)
+        p.add_module(m2)
+        m3 = module2(p)
+        p.add_module(m3)
+
+        c1 = Connection()
+        c1.sourceId = m1.id
+        c1.destinationId = m3.id
+        c1.source.id = id_scope.getNewId(Port.vtType)
+        c1.destination.id = id_scope.getNewId(Port.vtType)
+        c1.source.name = 'value'
+        c1.source.moduleName = 'PythonCalc'
+        c1.destination.name = 'value1'
+        c1.destination.moduleName = 'PythonCalc'
+        c1.id = id_scope.getNewId(Connection.vtType)
+        p.add_connection(c1)
+
+        c2 = Connection()
+        c2.sourceId = m2.id
+        c2.destinationId = m3.id
+        c2.source.id = id_scope.getNewId(Port.vtType)
+        c2.destination.id = id_scope.getNewId(Port.vtType)
+        c2.source.name = 'value'
+        c2.source.moduleName = 'PythonCalc'
+        c2.destination.name = 'value2'
+        c2.destination.moduleName = 'PythonCalc'
+        c2.id = id_scope.getNewId(Connection.vtType)
+
+        p.add_connection(c2)
+        p.compute_signatures()
+        return p
+
+    def create_pipeline2(self, id_scope=None):
+        basic_pkg = get_vistrails_basic_pkg_id()
+        if id_scope is None:
+            id_scope = IdScope(remap={Abstraction.vtType: Module.vtType})
+
+        param1 = ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                             type='Int',
+                             val='1')
+        param2 = ModuleParam(id=id_scope.getNewId(ModuleParam.vtType),
+                             type='Float',
+                             val='1.3456')
+        func1 = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                               name='value',
+                               parameters=[param1])
+        func2 = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                               name='floatVal',
+                               parameters=[param2])
+        loc1 = Location(id=id_scope.getNewId(Location.vtType),
+                        x=12.342,
+                        y=-19.432)
+        loc2 = Location(id=id_scope.getNewId(Location.vtType),
+                        x=21.34,
+                        y=456.234)
+        m1 = Module(id=id_scope.getNewId(Module.vtType),
+                    package=basic_pkg,
+                    name='String',
+                    location=loc1,
+                    functions=[func1])
+        m2 = Abstraction(id=id_scope.getNewId(Abstraction.vtType),
+                         internal_version=13,
+                         location=loc2,
+                         functions=[func2])
+        source = Port(id=id_scope.getNewId(Port.vtType),
+                      type='source', 
+                      moduleId=m1.id, 
+                      moduleName='String', 
+                      name='value',
+                      signature='(%s:String)' % basic_pkg)
+        destination = Port(id=id_scope.getNewId(Port.vtType),
+                           type='destination',
+                           moduleId=m2.id,
+                           moduleName='Abstraction',
+                           name='self',
+                           signature='()')
+        c1 = Connection(id=id_scope.getNewId(Connection.vtType),
+                        ports=[source, destination])
+        pipeline = Pipeline(id=id_scope.getNewId(Pipeline.vtType),
+                            modules=[m1, m2],
+                            connections=[c1])
+        return pipeline
+
+    def setUp(self):
+        self.pipeline = self.create_default_pipeline()
+        self.sink_id = 2
+
+    def test_create_pipeline_signature(self):
+        self.pipeline.subpipeline_signature(self.sink_id)
+
+    def test_delete_signatures(self):
+        """Makes sure signatures are deleted when other things are."""
+        p = self.create_default_pipeline()
+        m_sig_size_before = len(p._module_signatures)
+        c_sig_size_before = len(p._connection_signatures)
+        p_sig_size_before = len(p._subpipeline_signatures)
+        p.delete_connection(0)
+        p.delete_module(0)
+        m_sig_size_after = len(p._module_signatures)
+        c_sig_size_after = len(p._connection_signatures)
+        p_sig_size_after = len(p._subpipeline_signatures)
+        self.assertNotEquals(m_sig_size_before, m_sig_size_after)
+        self.assertNotEquals(c_sig_size_before, c_sig_size_after)
+        self.assertNotEquals(p_sig_size_before, p_sig_size_after)
+
+    def test_delete_connections(self):
+        p = self.create_default_pipeline()
+        p.delete_connection(0)
+        p.delete_connection(1)
+        p.delete_module(2)
+        self.assertEquals(len(p.connections), 0)
+
+    def test_basic(self):
+        """Makes sure pipeline can be created, modules and connections
+        can be added and deleted."""
+        p = self.create_default_pipeline()
+    
+    def test_copy(self):
+        id_scope = IdScope()
+        
+        p1 = self.create_default_pipeline(id_scope)
+        p2 = copy.copy(p1)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)
+        p3 = p1.do_copy(True, id_scope, {})
+        self.assertNotEquals(p1, p3)
+        self.assertNotEquals(p1.id, p3.id)
+
+    def test_copy2(self):
+        import vistrails.core.db.io
+
+        # nedd to id modules and abstraction_modules with same counter
+        id_scope = IdScope(remap={Abstraction.vtType: Module.vtType})
+        
+        p1 = self.create_pipeline2(id_scope)
+        p2 = copy.copy(p1)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)
+        p3 = p1.do_copy(True, id_scope, {})
+        self.assertNotEquals(p1, p3)
+        self.assertNotEquals(p1.id, p3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        p1 = self.create_default_pipeline()
+        xml_str = vistrails.core.db.io.serialize(p1)
+        p2 = vistrails.core.db.io.unserialize(xml_str, Pipeline)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)        
+
+    def test_serialization2(self):
+        import vistrails.core.db.io
+        p1 = self.create_pipeline2()
+        xml_str = vistrails.core.db.io.serialize(p1)
+        p2 = vistrails.core.db.io.unserialize(xml_str, Pipeline)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)        
+
+    def test_aliases(self):
+        """ Exercises aliases manipulation """
+        import vistrails.core.db.action
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator( \
+            vistrails.core.system.vistrails_root_directory() +
+            '/tests/resources/test_alias.xml').load()
+
+        p1 = v.getPipeline('alias')
+        p2 = v.getPipeline('alias')
+        
+        # testing removing an alias
+        old_param = p1.modules[0].functions[0].params[0]
+        func = p1.modules[0].functions[0]
+        #old_id = p1.modules[0].functions[0].params[0].db_id
+        #old_f_id = p1.modules[0].functions[0].db_id
+        new_param = ModuleParam(id=-1,
+                                pos=old_param.pos,
+                                name=old_param.name,
+                                alias="",
+                                val=str(1.0),
+                                type=old_param.type)
+        action_spec = ('change', old_param, new_param,
+                       func.vtType, func.real_id)
+        action = vistrails.core.db.action.create_action([action_spec])
+        p1.perform_action(action)
+        self.assertEquals(p1.has_alias('v1'),False)
+        v1 = p2.aliases['v1']
+        old_param2 = p2.modules[0].functions[0].params[0]
+        new_param2 = ModuleParam(id=old_param.real_id,
+                                pos=old_param.pos,
+                                name=old_param.name,
+                                alias="v1",
+                                val=str(v),
+                                type=old_param.type)
+        func2 = p2.modules[0].functions[0]
+        action2 = vistrails.core.db.action.create_action([('change',
+                                                 old_param2,
+                                                 new_param2,
+                                                 func2.vtType,
+                                                 func2.real_id)
+                                                ])
+        p2.perform_action(action2)
+        self.assertEquals(v1, p2.aliases['v1'])
+        
+    def test_module_signature(self):
+        """Tests signatures for modules with similar (but not equal)
+        parameter specs."""
+        pycalc_pkg = '%s.pythoncalc' % get_vistrails_default_pkg_prefix()
+        p1 = Pipeline()
+        p1_functions = [ModuleFunction(name='value1',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='1.0',
+                                                               )],
+                                       ),
+                        ModuleFunction(name='value2',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='2.0',
+                                                               )],
+                                       )]
+        p1.add_module(Module(name='PythonCalc',
+                             package=pycalc_pkg,
+                             id=3,
+                             functions=p1_functions))
+
+        p2 = Pipeline()
+        p2_functions = [ModuleFunction(name='value1',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='2.0',
+                                                               )],
+                                       ),
+                        ModuleFunction(name='value2',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='1.0',
+                                                               )],
+                                       )]
+        p2.add_module(Module(name='PythonCalc', 
+                             package=pycalc_pkg,
+                             id=3,
+                             functions=p2_functions))
+
+        self.assertNotEquals(p1.module_signature(3),
+                             p2.module_signature(3))
+
+    def test_find_method(self):
+        p1 = Pipeline()
+        p1_functions = [ModuleFunction(name='i1',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='1.0',
+                                                               )],
+                                       ),
+                        ModuleFunction(name='i2',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='2.0',
+                                                               )],
+                                       )]
+        p1.add_module(Module(name='CacheBug', 
+                            package='%s.console_mode_test' % \
+                             get_vistrails_default_pkg_prefix(),
+                            id=3,
+                            functions=p1_functions))
+
+        self.assertEquals(p1.find_method(3, 'i1'), 0)
+        self.assertEquals(p1.find_method(3, 'i2'), 1)
+        self.assertEquals(p1.find_method(3, 'i3'), -1)
+        self.assertRaises(KeyError, p1.find_method, 4, 'i1')
+
+    def test_str(self):
+        p1 = Pipeline()
+        p1_functions = [ModuleFunction(name='i1',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='1.0',
+                                                               )],
+                                       ),
+                        ModuleFunction(name='i2',
+                                       parameters=[ModuleParam(type='Float',
+                                                               val='2.0',
+                                                               )],
+                                       )]
+        p1.add_module(Module(name='CacheBug', 
+                            package='%s.console_mode_test' % \
+                             get_vistrails_default_pkg_prefix(),
+                            id=3,
+                            functions=p1_functions))
+        str(p1)
+
+    def test_pipeline_equality_module_list_out_of_order(self):
+        p1 = Pipeline()
+        p1.add_module(Module(name='Foo',
+                             package='bar',
+                             id=0,
+                             functions=[]))
+        p1.add_module(Module(name='Foo2',
+                             package='bar',
+                             id=1,
+                             functions=[]))
+        p2 = Pipeline()
+        p2.add_module(Module(name='Foo2',
+                             package='bar',
+                             id=1,
+                             functions=[]))
+        p2.add_module(Module(name='Foo',
+                             package='bar',
+                             id=0,
+                             functions=[]))
+        assert p1 == p2
+
+#     def test_subpipeline(self):
+#         p = self.create_default_pipeline()
+#         p2 = p.get_subpipeline([0, 1])
+#         for m in p2.modules:
+#             print m
+#         for c in p2.connections:
+#             print c
+
+    def test_incorrect_port_spec(self):
+        import vistrails.core.modules.basic_modules
+        p = Pipeline()
+        basic_version = vistrails.core.modules.basic_modules.version
+        basic_pkg = vistrails.core.modules.basic_modules.identifier
+        m1 = Module(name="String",
+                    package=basic_pkg,
+                    version=basic_version,
+                    id=1L)
+        m2 = Module(name="String",
+                    package=basic_pkg,
+                    version=basic_version,
+                    id=2L)
+        source = Port(id=1L,
+                      type='source', 
+                      moduleId=m1.id, 
+                      moduleName='String', 
+                      name='value',
+                      signature='(%s:StringBean)' % basic_pkg)
+        destination = Port(id=2L,
+                           type='destination',
+                           moduleId=m2.id,
+                           moduleName='String',
+                           name='value',
+                           signature='(%s:NString)' % basic_pkg)
+        c1 = Connection(id=1L,
+                        ports=[source, destination])
+        p.add_module(m1)
+        p.add_module(m2)
+        p.add_connection(c1)
+        p.ensure_modules_are_on_registry()
+        p.ensure_connection_specs()
+        p_source = p.connections[c1.id].source
+        p_destination = p.connections[c1.id].destination
+        self.assertEqual(p_source.signature, '(%s:String)' % basic_pkg)
+        self.assertEqual(len(p_source.descriptors()), 1)
+        self.assertEqual(p_destination.signature, '(%s:String)' % basic_pkg)
+        self.assertEqual(len(p_destination.descriptors()), 1)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/vistrail/plugin_data.py b/vistrails/core/vistrail/plugin_data.py
new file mode 100644
index 0000000..c36b901
--- /dev/null
+++ b/vistrails/core/vistrail/plugin_data.py
@@ -0,0 +1,101 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBPluginData
+
+import unittest
+import copy
+import random
+from vistrails.db.domain import IdScope
+import vistrails.core
+
+class PluginData(DBPluginData):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBPluginData.__init__(self, *args, **kwargs)
+        if self.id is None:
+            self.id = -1
+        
+    def __copy__(self):
+        return PluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = PluginData
+        return cp
+
+    ##########################################################################
+    # DB Conversion
+
+    @staticmethod
+    def convert(_plugin_data):
+        _plugin_data.__class__ = PluginData
+
+    ##########################################################################
+    # Properties
+
+    id = DBPluginData.db_id
+    data = DBPluginData.db_data
+
+    ##########################################################################
+    # Operators
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        return self.data == other.data
+
+################################################################################
+# Testing
+
+
+class TestPluginData(unittest.TestCase):
+
+    def create_data(self, id=1, data=""):
+        return PluginData(id=id, data=data)
+
+    def test_create(self):
+        self.create_data(2, "testing the data field")
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        p_data1 = self.create_data()
+        xml_str = vistrails.core.db.io.serialize(p_data1)
+        p_data2 = vistrails.core.db.io.unserialize(xml_str, PluginData)
+        self.assertEquals(p_data1, p_data2)
+        self.assertEquals(p_data1.id, p_data2.id)
+
diff --git a/vistrails/core/vistrail/port.py b/vistrails/core/vistrail/port.py
new file mode 100644
index 0000000..3f17a62
--- /dev/null
+++ b/vistrails/core/vistrail/port.py
@@ -0,0 +1,303 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This module contains class definitions for:
+    * Port
+
+ """
+from vistrails.db.domain import DBPort
+from vistrails.core.utils import VistrailsInternalError, all
+from vistrails.core.vistrail.port_spec import PortSpec, PortEndPoint
+import vistrails.core.modules.vistrails_module
+import copy
+
+import unittest
+from vistrails.db.domain import IdScope
+
+################################################################################
+
+class Port(DBPort):
+    """ A port denotes one endpoint of a Connection.
+
+    self.spec: list of list of (module, str) 
+    
+    """
+    
+    ##########################################################################
+    # Constructor and copy
+    
+    def __init__(self, *args, **kwargs):
+        """The preferred way to create a port is to pass a PortSpec with
+        new information.  The construcotr pulls name, type, and signature 
+        info from the PortSpec.
+        
+        Example: Port(id=<id>, spec=<port_spec>, moduleId=<id>, 
+                      moduleName=<name>)
+
+        You can also pass the name, type, and signature, separately.
+        
+        Example: Port(id=<id>, name=<name>, type=[source|destination],
+                      signature=<sig>, moduleId=<id>, moduleName=<name>)
+
+        """
+
+        self._spec = None
+        self._descriptors = None
+        if 'spec' in kwargs:
+            self._spec = kwargs['spec']
+            del kwargs['spec']
+            if 'name' not in kwargs:
+                kwargs['name'] = self._spec.name
+            if 'type' not in kwargs:
+                if self._spec.type in PortSpec.port_type_map:
+                    kwargs['type'] = PortSpec.port_type_map[self._spec.type]
+            if 'signature' not in kwargs:
+                kwargs['signature'] = self._spec.sigstring
+#         else:
+#             self.spec = None
+        if 'id' not in kwargs:
+            kwargs['id'] = -1
+        if 'moduleId' not in kwargs:
+            kwargs['moduleId'] = 0
+        if 'moduleName' not in kwargs:
+            kwargs['moduleName'] = ""
+        if 'name' not in kwargs:
+            kwargs['name'] = ""
+        if 'signature' not in kwargs:
+            kwargs['signature'] = ""
+
+        DBPort.__init__(self, *args, **kwargs)
+
+        self.set_defaults()
+
+#             # if there is no spec, create it
+#             spec_type = PortSpec.port_type_map.inverse[self.type]
+#             self._spec = PortSpec(name=self.name, 
+#                                   type=spec_type,
+#                                   sigstring=self.signature)
+        
+    def set_defaults(self, other=None):                
+        if other is None:
+            self.is_valid = False
+        else:
+            self.is_valid = other.is_valid
+            self._spec = copy.copy(other._spec)
+            self._descriptors = copy.copy(other._descriptors)
+
+    def __copy__(self):
+        return Port.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Port
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_port):
+        if _port.__class__ == Port:
+            return
+        _port.__class__ = Port
+        _port._spec = None
+        _port._descriptors = None
+        _port.set_defaults()
+
+    ##########################################################################
+    # Properties
+    
+    id = DBPort.db_id
+    moduleId = DBPort.db_moduleId
+    moduleName = DBPort.db_moduleName
+    name = DBPort.db_name
+    type = DBPort.db_type
+
+    def _get_endPoint(self):
+        if self.db_type in PortSpec.end_point_map:
+            return PortSpec.end_point_map[self.db_type]
+        return PortEndPoint.Invalid
+    def _set_endPoint(self, endPoint):
+        if endPoint in PortSpec.end_point_map.inverse:
+            self.db_type = PortSpec.end_point_map.inverse[endPoint]
+        else:
+            self.db_type = 'invalid'
+    endPoint = property(_get_endPoint, _set_endPoint)
+
+    def _get_signature(self):
+        if not self.db_signature and self.spec is not None:
+            self.db_signature = self.spec.sigstring
+        return self.db_signature
+    def _set_signature(self, signature):
+        self.db_signature = signature
+    signature = property(_get_signature, _set_signature)
+    sigstring = signature
+    
+    def _get_spec(self):
+        return self._spec
+    def _set_spec(self, spec):
+        self._spec = spec
+        if self._spec is not None:
+            self.name = self._spec.name
+            self.type = PortSpec.port_type_map[self._spec.type]
+            self.signature = self._spec.sigstring
+            # self.find_port_types()
+        else:
+            self.signature = ""
+    spec = property(_get_spec, _set_spec)
+
+    # FIXME get rid of this one?
+    def _get_sig(self):
+        return self.name + self.signature
+    sig = property(_get_sig)
+
+    def descriptors(self):
+        if self._spec is not None:
+            return self._spec.descriptors()
+        return None
+
+    # return self._descriptors
+
+    ##########################################################################
+    # Debugging
+
+    def show_comparison(self, other):
+        if type(self) != type(other):
+            print "Type mismatch"
+        elif self.endPoint != other.endPoint:
+            print "endpoint mismatch"
+        elif self.moduleName != other.moduleName:
+            print "moduleName mismatch"
+        elif self.name != other.name:
+            print "name mismatch"
+        elif self.spec != other.spec:
+            print "spec mismatch"
+        else:
+            print "no difference found"
+            assert self == other
+
+    ##########################################################################
+    # Operators
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __eq__(self, other):
+        if type(self) != type(other):
+            return False
+        return (self.endPoint == other.endPoint and
+# FIXME module id can change...
+#                self.moduleId == other.moduleId and
+                self.moduleName == other.moduleName and
+                self.name == other.name and
+                self.signature == other.signature)
+    
+    def __str__(self):
+        """ __str__() -> str 
+        Returns a string representation of a Port object.  """
+        return '<Port endPoint="%s" moduleId=%s name=%s ' \
+            'type=Module %s/>' % (self.endPoint,
+                                  self.moduleId,
+                                  self.name,
+                                  self.spec)
+
+    def equals_no_id(self, other):
+        if type(self) != type(other):
+            return False
+        return (self.endPoint == other.endPoint and
+                self.moduleName == other.moduleName and
+                self.name == other.name and
+                self.signature == other.signature)
+
+###############################################################################
+
+
+if __name__ == '__main__':
+    import vistrails.core.modules.basic_modules
+    import vistrails.core.modules.module_registry
+    
+from vistrails.core.system import get_vistrails_basic_pkg_id
+
+class TestPort(unittest.TestCase):
+    def setUp(self):
+        self.registry = vistrails.core.modules.module_registry.get_module_registry()
+
+    def create_port(self, id_scope=IdScope()):
+        port = Port(id=id_scope.getNewId(Port.vtType),
+                    type='source',
+                    moduleId=12L, 
+                    moduleName='String', 
+                    name='value',
+                    signature='(%s:String)' % get_vistrails_basic_pkg_id())
+        return port
+
+    def test_copy(self):
+        id_scope = IdScope()
+        
+        p1 = self.create_port(id_scope)
+        p2 = copy.copy(p1)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)
+        p3 = p1.do_copy(True, id_scope, {})
+        self.assertEquals(p1, p3)
+        self.assertNotEquals(p1.id, p3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        p1 = self.create_port()
+        xml_str = vistrails.core.db.io.serialize(p1)
+        p2 = vistrails.core.db.io.unserialize(xml_str, Port)
+        self.assertEquals(p1, p2)
+        self.assertEquals(p1.id, p2.id)
+
+    def testPort(self):
+        x = Port()
+        a = str(x)
+
+    def test_registry_port_subtype(self):
+        """Test registry isPortSubType"""
+        descriptor = self.registry.get_descriptor_by_name( \
+                            get_vistrails_basic_pkg_id(), 'String')
+        ports = self.registry.source_ports_from_descriptor(descriptor)
+        assert self.registry.is_port_sub_type(ports[0], ports[0])
+
+    def test_registry_ports_can_connect(self):
+        """Test registry isPortSubType"""
+        descriptor = self.registry.get_descriptor_by_name( \
+                            get_vistrails_basic_pkg_id(), 'String')
+        oport = self.registry.source_ports_from_descriptor(descriptor)[0]
+        iport = self.registry.destination_ports_from_descriptor(descriptor)[0]
+        assert self.registry.ports_can_connect(oport, iport)
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/vistrails/core/vistrail/port_spec.py b/vistrails/core/vistrail/port_spec.py
new file mode 100644
index 0000000..948c6c0
--- /dev/null
+++ b/vistrails/core/vistrail/port_spec.py
@@ -0,0 +1,522 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from itertools import izip
+import operator
+
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core.modules.utils import create_port_spec_string, parse_port_spec_string
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.core.utils import enum, VistrailsInternalError
+from vistrails.core.vistrail.port_spec_item import PortSpecItem
+from vistrails.db.domain import DBPortSpec
+
+import unittest
+import copy
+from vistrails.db.domain import IdScope
+import vistrails.core
+
+################################################################################
+
+PortEndPoint = enum('PortEndPoint',
+                    ['Invalid', 'Source', 'Destination'])
+
+################################################################################
+
+class PortSpec(DBPortSpec):
+
+    port_type_map = Bidict([('input', 'destination'),
+                            ('output', 'source'),
+                            ('invalid', 'invalid')])
+    end_point_map = Bidict([('source', PortEndPoint.Source),
+                            ('destination', PortEndPoint.Destination),
+                            ('invalid', PortEndPoint.Invalid)])
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        signature = None
+        if 'signature' in kwargs:
+            signature = kwargs['signature']
+            del kwargs['signature']
+        sigstring = None
+        if 'sigstring' in kwargs:
+            sigstring = kwargs['sigstring']
+            del kwargs['sigstring']
+        defaults = None
+        if 'defaults' in kwargs:
+            defaults = kwargs['defaults']
+            del kwargs['defaults']
+        labels = None
+        if 'labels' in kwargs:
+            labels = kwargs['labels']
+            del kwargs['labels']
+        values = None
+        if 'values' in kwargs:
+            values = kwargs['values']
+            del kwargs['values']
+        entry_types = None
+        if 'entry_types' in kwargs:
+            entry_types = kwargs['entry_types']
+            del kwargs['entry_types']
+
+        if 'items' in kwargs and 'portSpecItems' not in kwargs:
+            kwargs['portSpecItems'] = kwargs['items']
+            del kwargs['items']
+
+        if 'optional' not in kwargs:
+            kwargs['optional'] = 0 # False
+        elif not isinstance(kwargs['optional'], (int, long)):
+            if isinstance(kwargs['optional'], bool):
+                if kwargs['optional']:
+                    kwargs['optional'] = 1
+                else:
+                    kwargs['optional'] = 0
+            else:
+                raise VistrailsInternalError("Cannot parse 'optional' kw "
+                                             "-- must be an int or bool")
+        if 'min_conns' not in kwargs:
+            kwargs['min_conns'] = 0
+        elif kwargs['optional'] == 1 and kwargs['min_conns'] > 0:
+            raise VistrailsInternalError("A mandatory port cannot be set "
+                                         "to optional")
+        if 'max_conns' not in kwargs:
+            kwargs['max_conns'] = -1
+        if kwargs['min_conns'] >= 0 and kwargs['max_conns'] >= 0 and \
+                kwargs['min_conns'] > kwargs['max_conns']:
+            raise VistrailsInternalError("Minimum number of connections "
+                                         "cannot be greater than maximum "
+                                         "number of connections")
+            
+        if 'sort_key' not in kwargs:
+            kwargs['sort_key'] = -1
+        if 'id' not in kwargs:
+            kwargs['id'] = -1
+        if 'tooltip' in kwargs:
+            self._tooltip = kwargs['tooltip']
+            del kwargs['tooltip']
+        else:
+            self._tooltip = None
+
+        if 'docstring' in kwargs:
+            self._docstring = kwargs['docstring']
+            del kwargs['docstring']
+        else:
+            self._docstring = None
+        if 'shape' in kwargs:
+            self._shape = kwargs['shape']
+            del kwargs['shape']
+        else:
+            self._shape = None
+
+        DBPortSpec.__init__(self, *args, **kwargs)
+
+        if sum(1 for container in (self.port_spec_items, signature, sigstring)
+               if container) > 1:
+            raise ValueError("Please specify only one of portSpecItems,"
+                             " signature, or sigstring kwargs.")
+        self.create_spec_items(self.port_spec_items, signature, sigstring, 
+                               defaults, labels, values, entry_types)
+
+        self._short_sigstring = None
+        # if signature is not None:
+        #     self.create_entries(signature)
+        # if not self.sigstring and self._entries is not None:
+        #     # create sigstring from entries
+        #     self.create_sigstring_and_descriptors()
+# DAKOOP: removed this---we will check in module_registry and pipeline 
+# validation, this way, we can let errors go all the way up
+#         elif self._entries is None and self.sigstring:
+#             # create entries from sigstring
+#             self.create_entries_and_descriptors()
+#         else:
+#             raise VistrailsInternalError("Need to specify signature or "
+#                                          "sigstring to create PortSpec")
+        # if self._entries is not None and self._tooltip is None:
+        #     self.create_tooltip()
+        self.is_valid = True
+
+    def __copy__(self):
+        return PortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec.do_copy(self, new_ids, id_scope, id_remap)
+        cp._short_sigstring = self._short_sigstring
+        cp._tooltip = self._tooltip
+        cp._shape = self._shape
+        cp._docstring = self._docstring
+        cp.is_valid = self.is_valid
+        cp.__class__ = PortSpec
+        # if cp._entries is not None:
+        #     cp.create_tooltip()
+        return cp
+
+    @staticmethod
+    def convert(_port_spec):
+        from vistrails.core.modules.module_registry import module_registry_loaded, \
+            ModuleRegistryException
+        if _port_spec.__class__ == PortSpec:
+            return
+        _port_spec.__class__ = PortSpec
+        for _port_spec_item in _port_spec.db_portSpecItems:
+            PortSpecItem.convert(_port_spec_item)
+        _port_spec._short_sigstring = None
+        _port_spec._tooltip = None
+        _port_spec._shape = None
+        _port_spec._docstring = None
+        _port_spec.is_valid = True
+
+        _port_spec.port_spec_items.sort(key=operator.attrgetter('db_pos'))
+
+    @staticmethod
+    def from_sigstring(sigstring):
+        """from_sig(sigstring: string) -> PortSpec
+
+        Returns a portspec from the given sigstring.
+
+        """
+        return PortSpec(sigstring=sigstring)
+
+    ##########################################################################
+    # Properties
+
+    id = DBPortSpec.db_id
+    name = DBPortSpec.db_name
+    type = DBPortSpec.db_type
+    optional = DBPortSpec.db_optional
+    sort_key = DBPortSpec.db_sort_key
+    min_conns = DBPortSpec.db_min_conns
+    max_conns = DBPortSpec.db_max_conns
+    port_spec_items = DBPortSpec.db_portSpecItems
+    items = DBPortSpec.db_portSpecItems
+
+    def _get_sigstring(self):
+        return create_port_spec_string([i.spec_tuple 
+                                        for i in self.port_spec_items])
+    sigstring = property(_get_sigstring)
+
+    def is_mandatory(self):
+        return (self.min_conns > 0)
+
+    def _get_labels(self):
+        return [i.label for i in self.port_spec_items]
+    labels = property(_get_labels)
+
+    def _get_defaults(self):
+        return [i.default for i in self.port_spec_items]
+    defaults = property(_get_defaults)
+    
+    def _get_short_sigstring(self):
+        if self._short_sigstring is None:
+            self.create_tooltip()
+        return self._short_sigstring
+    short_sigstring = property(_get_short_sigstring)
+
+    def _get_signature(self):
+        signature = []
+        for i in self.port_spec_items:
+            signature.append((i.descriptor.module, i.label))
+        return signature
+    signature = property(_get_signature)
+
+    def toolTip(self):
+        if self._tooltip is None:
+            self.create_tooltip()
+        return self._tooltip
+
+    def shape(self):
+        return self._shape
+    
+    def docstring(self):
+        return self._docstring
+
+    def descriptors(self):
+        return [i.descriptor for i in self.port_spec_items]
+
+    ##########################################################################
+    # Methods
+
+    def _resize_attrs(self, target, *lists):
+        for rlist in lists:
+            if len(target) > len(rlist):
+                rlist.extend(None for i in xrange(len(target)-len(rlist)))
+
+    def _set_attrs(self, item, *attrs):
+        attr_order = ['default', 'label', 'values', 'entry_type']
+        if item is None:
+            kwargs = dict(izip(attr_order, attrs))
+            return kwargs
+        else:
+            for (attr_key, attr) in izip(attr_order, attrs):
+                if attr is not None:
+                    setattr(item, attr_key, attr)
+
+
+    def create_spec_items(self, items=None, signature=None, sigstring=None, 
+                          defaults=None, labels=None, values=None, 
+                          entry_types=None):
+        if defaults is None:
+            defaults = []
+        elif isinstance(defaults, basestring):
+            defaults = eval(defaults)
+        if labels is None:
+            labels = []
+        elif isinstance(labels, basestring):
+            labels = eval(labels)
+        if values is None:
+            values = []
+        elif isinstance(values, basestring):
+            values = eval(values)
+        if entry_types is None:
+            entry_types = []
+        elif isinstance(entry_types, basestring):
+            entry_types = eval(entry_types)
+        attrs = [defaults, labels, values, entry_types]
+        if items:
+            self.set_items(items, *attrs)
+        elif signature is not None:
+            items = self.get_items_from_entries(signature, *attrs)
+        elif sigstring is not None:
+            items = self.get_items_from_sigstring(sigstring, *attrs)
+        self.port_spec_items = items
+
+    def set_items(self, items, *attrs):
+        self._resize_attrs(items, *attrs)
+        for i, item_tuple in enumerate(izip(items, *attrs)):
+            item_tuple[0].pos = i
+            self._set_attrs(*item_tuple)
+
+    def get_items_from_entries(self, signature, *attrs):
+        # This is reasonably messy code. The intent is that a
+        # signature given by the user in a call like this
+        # add_input_port(module, name, signature) should be one of the
+        # following:
+
+        # type only: add_input_port(_, _, Float)
+        # type plus description: add_input_port(_, _, (Float, 'radius'))
+
+        # multiple parameters, where each parameter can be either of the above:
+        # add_input_port(_, _, [Float, (Integer, 'count')])
+
+        from vistrails.core.modules.module_registry import get_module_registry
+        registry = get_module_registry()
+        entries = []
+        def canonicalize(sig_item):
+            if isinstance(sig_item, tuple):
+                # assert len(sig_item) == 2
+                # assert isinstance(sig_item[0], type)
+                # assert isinstance(sig_item[1], str)
+                descriptor = registry.get_descriptor(sig_item[0])
+                label = sig_item[1]
+                return (descriptor, label)
+            elif isinstance(sig_item, list):
+                descriptor = registry.get_descriptor_by_name(
+                    get_vistrails_basic_pkg_id(), 'List')
+                return (descriptor, None)
+            else:
+                # isinstance(sig_item, type):
+                return (registry.get_descriptor(sig_item), None)
+
+        # def _add_entry(sig_item):
+        ps_items = []
+        if not isinstance(signature, list):
+            signature = [signature]
+        self._resize_attrs(signature, *attrs)
+        for i, item_tuple in enumerate(izip(signature, *attrs)):
+            descriptor, item_label = canonicalize(item_tuple[0])
+            kwargs = self._set_attrs(None, *item_tuple[1:])
+            if not kwargs['label']:
+                if item_label != "<no description>":
+                    kwargs['label'] = item_label
+            ps_item = PortSpecItem(pos=i, 
+                                   package=descriptor.identifier,
+                                   module=descriptor.name,
+                                   namespace=descriptor.namespace,
+                                   **kwargs)
+            ps_items.append(ps_item)
+        return ps_items
+
+    def get_items_from_sigstring(self, sigstring, *attrs):
+        ps_items = []
+        specs_list = parse_port_spec_string(sigstring)
+        if len(specs_list) == 0:
+            return ps_items
+
+        self._resize_attrs(specs_list, *attrs)
+        for i, item_tuple in enumerate(izip(specs_list, *attrs)):
+            kwargs = self._set_attrs(None, *item_tuple[1:])
+            ps_item = PortSpecItem(pos=i,
+                                   package=item_tuple[0][0],
+                                   module=item_tuple[0][1],
+                                   namespace=item_tuple[0][2],
+                                   **kwargs)
+            ps_items.append(ps_item)
+        return ps_items
+
+    def create_tooltip(self):
+        """Creates a short_sigstring that does not include package names for
+        use with the tooltip. Note, however, that such sigstrings
+        can't be used to reconstruct a spec. They should only be used
+        for human-readable purposes.
+        """
+
+        self._short_sigstring = \
+            "(" + ",".join(d.name for d in self.descriptors()) + ")"
+        if self.type in ['input', 'output']:
+            port_string = self.type.capitalize()
+        else:
+            port_string = 'Invalid'
+        self._tooltip = "%s port %s\n%s" % (port_string,
+                                            self.name,
+                                            self._short_sigstring)
+        
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of an PortSpec
+        object. 
+
+        """
+        rep = "<portSpec id=%s name=%s type=%s signature=%s />"
+        return  rep % (str(self.id), str(self.name), 
+                       str(self.type), str(self.sigstring))
+
+    def __eq__(self, other):
+        """ __eq__(other: PortSpec) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if self is None and other is None:
+            return True
+        if type(self) != type(other) or \
+                self.name != other.name or \
+                self.type != other.type:
+            return False
+        if len(self.descriptors()) != len(other.descriptors()):
+            return False
+        for (mine, their) in izip(self.descriptors(), other.descriptors()):
+            if mine != their:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def type_equals(self, other):
+        """type_equals(other: PortSpec) -> Bool
+
+        Checks equality ignoring description strings. Only cares about types.
+        Does not do subtyping or supertyping: match must be perfect.
+
+        """
+        if self is None and other is None:
+            return True
+        if len(self.descriptors()) != len(other.descriptors()):
+            return False
+        for (mine, their) in izip(self.descriptors(), other.descriptors()):
+            if mine != their:
+                return False
+        return True
+        
+    def key_no_id(self):
+        """key_no_id(): tuple. returns a tuple that identifies
+        the port without caring about ids. Used for sorting
+        port lists."""
+        return (self.type,
+                self.name,
+                self.signature)
+
+################################################################################
+# Testing
+
+
+class TestPortSpec(unittest.TestCase):
+
+    def create_port_spec(self, id_scope=IdScope()):
+        # FIXME add a valid port spec
+        port_spec = PortSpec(id=id_scope.getNewId(PortSpec.vtType),
+                             name='SetValue',
+                             type='input',
+                             sigstring='(%s:String)' % \
+                                 get_vistrails_basic_pkg_id(),
+                             )
+        return port_spec
+
+    def test_copy(self):
+        id_scope = IdScope()
+        
+        s1 = self.create_port_spec(id_scope)
+        s2 = copy.copy(s1)
+        self.assertEquals(s1, s2)
+        self.assertEquals(s1.id, s2.id)
+        s3 = s1.do_copy(True, id_scope, {})
+        self.assertEquals(s1, s3)
+        self.assertNotEquals(s1.id, s3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        s1 = self.create_port_spec()
+        xml_str = vistrails.core.db.io.serialize(s1)
+        s2 = vistrails.core.db.io.unserialize(xml_str, PortSpec)
+        self.assertEquals(s1, s2)
+        self.assertEquals(s1.id, s2.id)
+
+    def test_create_from_signature(self):
+        from vistrails.core.modules.basic_modules import Float
+        port_spec = PortSpec(id=-1,
+                             name="SetXYZ",
+                             type='input',
+                             signature=[(Float, "x"), (Float, "y"), 
+                                        (Float, "z")])
+
+    def test_create_from_items(self):
+        basic_pkg = get_vistrails_basic_pkg_id()
+        item_a = PortSpecItem(pos=0,
+                              package=basic_pkg,
+                              module="Integer",
+                              label="a",
+                              default="123")
+        item_b = PortSpecItem(pos=1,
+                              package=basic_pkg,
+                              module="String",
+                              label="b",
+                              default="abc")
+        port_spec = PortSpec(id=-1,
+                             name="SetValue",
+                             type='input',
+                             portSpecItems=[item_a, item_b])
+        
diff --git a/vistrails/core/vistrail/port_spec_item.py b/vistrails/core/vistrail/port_spec_item.py
new file mode 100644
index 0000000..8d53e6b
--- /dev/null
+++ b/vistrails/core/vistrail/port_spec_item.py
@@ -0,0 +1,219 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.core.modules.utils import parse_port_spec_item_string, \
+    create_port_spec_item_string
+from vistrails.db.domain import DBPortSpecItem
+
+import unittest
+from vistrails.db.domain import IdScope
+
+class PortSpecItem(DBPortSpecItem):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        if "sigstring" in kwargs:
+            sigstring = kwargs["sigstring"]
+            del kwargs["sigstring"]
+
+            (package, module, namespace) = \
+                parse_port_spec_item_string(sigstring)
+            if "package" not in kwargs:
+                kwargs["package"] = package
+            if "module" not in kwargs:
+                kwargs["module"] = module
+            if "namespace" not in kwargs:
+                kwargs["namespace"] = namespace
+        if "values" in kwargs:
+            if (kwargs["values"] is not None and
+                    not isinstance(kwargs["values"], basestring)):
+                kwargs["values"] = str(kwargs["values"])
+        if 'id' not in kwargs:
+            kwargs['id'] = -1
+
+        def update_identifier(identifier):
+            """check for changed identifiers (e.g. edu.utah.sci.vistrails ->
+            org.vistrails.vistrails) and use the current one.
+
+            """
+            from vistrails.core.modules.module_registry import \
+                get_module_registry, MissingPackage
+            reg = get_module_registry()
+            try:
+                identifier = reg.get_package_by_name(identifier).identifier
+            except MissingPackage:
+                # catch this later, just trying to ensure that old
+                # identifiers are updated
+                pass
+            return identifier
+            
+        # args[3] is the package argument
+        # FIXME this is schema-dependent...
+        if len(args) > 3:
+            args[3] = update_identifier(args[3])
+        if "package" in kwargs:
+            kwargs["package"] = update_identifier(kwargs["package"])
+        DBPortSpecItem.__init__(self, *args, **kwargs)
+        self.set_defaults()
+
+    def set_defaults(self, other=None):
+        if other is None:
+            self._values = None
+            self._sigstring = None
+            self._descriptor = None
+        else:
+            self._values = copy.copy(other._values)
+            self._sigstring = other._sigstring
+            self._descriptor = other._descriptor
+
+    def __copy__(self):
+        """__copy__() -> PortSpecItem - Returns a clone of itself"""
+        return self.do_copy()
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpecItem.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = PortSpecItem
+        cp.set_defaults(self)
+        return cp
+
+    @staticmethod
+    def convert(_portSpecItem):
+        if _portSpecItem.__class__ == PortSpecItem:
+            return
+        _portSpecItem.__class__ = PortSpecItem
+        _portSpecItem.set_defaults()
+
+    id = DBPortSpecItem.db_id
+    pos = DBPortSpecItem.db_pos
+    label = DBPortSpecItem.db_label
+    default = DBPortSpecItem.db_default
+    entry_type = DBPortSpecItem.db_entry_type
+
+    def _get_module(self):
+        return self.db_module
+    def _set_module(self, module):
+        if self.db_module != module:
+            self._sigstring = None
+            self._descriptor = None
+            self.db_module = module
+    module = property(_get_module, _set_module)
+
+    def _get_package(self):
+        return self.db_package
+    def _set_package(self, package):
+        if self.db_package != package:
+            self._sigstring = None
+            self._descriptor = None
+            self.db_package = package
+    package = property(_get_package, _set_package)
+    
+    def _get_namespace(self):
+        return self.db_namespace
+    def _set_namespace(self, ns):
+        if self.db_namespace != ns:
+            self._sigstring = None
+            self._descriptor = None
+            self.db_namespace = ns
+    namespace = property(_get_namespace, _set_namespace)
+
+    def _get_sigstring(self):
+        if self._sigstring is None:
+            self._sigstring = create_port_spec_item_string(self.package,
+                                                           self.module,
+                                                           self.namespace)
+        return self._sigstring
+    sigstring = property(_get_sigstring)
+
+    def _get_descriptor(self):
+        if self._descriptor is None:
+            from vistrails.core.modules.module_registry import get_module_registry
+            reg = get_module_registry()
+            if self.package is None:
+                self._descriptor = \
+                    reg.get_descriptor_from_name_only(self.module)
+                self.db_package = self._descriptor.identifier
+                self.db_namespace = self._descriptor.namespace
+            else:
+                self._descriptor = reg.get_descriptor_by_name(self.package,
+                                                              self.module,
+                                                              self.namespace)
+        return self._descriptor
+    descriptor = property(_get_descriptor)
+
+    def _get_values(self):
+        if self._values is None:
+            # don't use eval here...
+            self._values = eval(self.db_values)
+        return self._values
+    def _set_values(self, values):
+        if not isinstance(values, basestring):
+            self._values = values
+            self.db_values = str(values)
+        else:
+            self.db_values = values
+            # don't use eval here...
+            self._values = eval(values)
+    values = property(_get_values, _set_values)
+
+    def _get_spec_tuple(self):
+        return (self.package, self.module, self.namespace)
+    spec_tuple = property(_get_spec_tuple)
+
+################################################################################
+# Testing
+
+from vistrails.core.system import get_vistrails_basic_pkg_id
+
+class TestPortSpecItem(unittest.TestCase):
+    def create_port_spec_item(self):
+        return PortSpecItem(id=0, pos=0, 
+                            module="String", 
+                            package=get_vistrails_basic_pkg_id(), 
+                            label="testLabel", 
+                            default="abc", 
+                            values=["abc", "def", "ghi"], 
+                            entry_type="enum")
+
+    def test_change_descriptor(self):
+        psi = self.create_port_spec_item()
+        d1 = psi.descriptor
+        s1 = psi.sigstring
+        psi.module = "Integer"
+        d2 = psi.descriptor
+        s2 = psi.sigstring
+        assert(d1 != d2)
+        assert(s1 != s2)
diff --git a/vistrails/core/vistrail/tag.py b/vistrails/core/vistrail/tag.py
new file mode 100644
index 0000000..fdfbfa3
--- /dev/null
+++ b/vistrails/core/vistrail/tag.py
@@ -0,0 +1,121 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBTag
+
+import unittest
+import copy
+from vistrails.db.domain import IdScope
+import vistrails.core
+
+class Tag(DBTag):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBTag.__init__(self, *args, **kwargs)
+        
+    def __copy__(self):
+        return Tag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Tag
+        return cp
+
+    @staticmethod
+    def convert(_tag):
+        _tag.__class__ = Tag
+    
+    ##########################################################################
+    # Properties
+
+    id = DBTag.db_id
+    time = DBTag.db_id
+    name = DBTag.db_name
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of a Tag
+        object. 
+
+        """
+        rep = "<tag name=%s time=%s />"
+        return  rep % (str(self.name), str(self.time))
+
+    def __eq__(self, other):
+        """ __eq__(other: Annotation) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(other) != type(self):
+            return False
+        return self.name == other.name
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+################################################################################
+# Testing
+
+
+class TestTag(unittest.TestCase):
+
+    def create_tag(self, id_scope=IdScope()):
+        tag = Tag(id=id_scope.getNewId(Tag.vtType),
+                  name='blah')
+        return tag
+
+    def test_copy(self):
+        id_scope = IdScope()
+        
+        t1 = self.create_tag(id_scope)
+        t2 = copy.copy(t1)
+        self.assertEquals(t1, t2)
+        self.assertEquals(t1.id, t2.id)
+        t3 = t1.do_copy(True, id_scope, {})
+        self.assertEquals(t1, t3)
+        self.assertNotEquals(t1.id, t3.id)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        t1 = self.create_tag()
+        xml_str = vistrails.core.db.io.serialize(t1)
+        t2 = vistrails.core.db.io.unserialize(xml_str, Tag)
+        self.assertEquals(t1, t2)
+        self.assertEquals(t1.id, t2.id)
diff --git a/vistrails/core/vistrail/vistrail.py b/vistrails/core/vistrail/vistrail.py
new file mode 100644
index 0000000..07ef0ea
--- /dev/null
+++ b/vistrails/core/vistrail/vistrail.py
@@ -0,0 +1,1382 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.paramexplore.paramexplore import ParameterExploration
+
+import copy
+import datetime
+import getpass
+
+from vistrails.db.domain import DBVistrail
+from vistrails.db.services.io import open_vt_log_from_db, open_log_from_xml
+from vistrails.core.db.locator import DBLocator
+from vistrails.core.log.log import Log
+from vistrails.core.data_structures.graph import Graph
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core import debug
+import vistrails.core.db.io
+from vistrails.core.utils import VistrailsInternalError, \
+     InvalidPipeline
+from vistrails.core.vistrail.action import Action
+from vistrails.core.vistrail.action_annotation import ActionAnnotation
+from vistrails.core.vistrail.vistrailvariable import VistrailVariable
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.operation import AddOp, ChangeOp, DeleteOp
+from vistrails.core.vistrail.plugin_data import PluginData
+
+import unittest
+import copy
+import random
+
+""" This file contains the definition of the class Vistrail """
+
+
+################################################################################
+
+class Vistrail(DBVistrail):
+    """Vistrail is the base class for storing versioned pipelines.
+
+    Because of the automatic loading from the db layer, the fields in
+    the class will seem mysterious.
+
+    self.currentVersion: version of the schema being used for this vistrail
+    (Do not confuse with the currently selected version on the controller)
+
+    self.actions: list of core/vistrail/action/Action objects
+
+    self.actionMap: dictionary from version number to action object.
+
+    Simple use cases:
+
+    To get a version number given a tag name, use
+    get_tag_str(tag_name).action_id
+
+    """
+
+    def __init__(self, locator=None):
+        DBVistrail.__init__(self)
+
+        self.locator = locator
+        self.set_defaults()
+
+    def __copy__(self):
+        """ __copy__() -> Vistrail - Returns a clone of itself """ 
+        return Vistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = Vistrail
+        cp.locator = copy.copy(self.locator)
+        cp.set_defaults(self)
+        return cp
+
+    def set_defaults(self, other=None):
+        if other is None:
+            self.changed = False
+            self.currentVersion = -1
+            self.savedQueries = []
+            self.is_abstraction = False
+        else:
+            self.changed = other.changed
+            self.currentVersion = other.currentVersion
+            self.savedQueries = copy.copy(other.savedQueries)
+            self.is_abstraction = other.is_abstraction
+
+        # object to keep explicit expanded 
+        # version tree always updated
+        self.tree = ExplicitExpandedVersionTree(self)
+        # add all versions to the trees
+        for action in sorted(self.actions, key=lambda a: a.id):
+            self.tree.addVersion(action.id, action.prevId)
+
+    @staticmethod
+    def convert(_vistrail):
+        _vistrail.__class__ = Vistrail
+
+        for action in _vistrail.actions:
+            Action.convert(action)
+#        for tag in _vistrail.tags:
+#            Tag.convert(tag)
+        for annotation in _vistrail.annotations:
+            Annotation.convert(annotation)
+        for annotation in _vistrail.action_annotations:
+            ActionAnnotation.convert(annotation)
+
+        for variable in _vistrail.vistrail_variables:
+            VistrailVariable.convert(variable)
+
+        for pe in _vistrail.parameter_explorations:
+            ParameterExploration.convert(pe)
+
+        _vistrail.set_defaults()
+
+    ##########################################################################
+    # Constants
+
+    TAG_ANNOTATION = '__tag__'
+    NOTES_ANNOTATION = '__notes__'
+    PARAMEXP_ANNOTATION = '__paramexp__'
+    THUMBNAIL_ANNOTATION = '__thumb__'
+    PRUNE_ANNOTATION = '__prune__'
+    UPGRADE_ANNOTATION = '__upgrade__'
+#    VARIABLES_ANNOTATION = '__vistrail_vars__'
+
+    ##########################################################################
+    # Properties
+
+    id = DBVistrail.db_id
+    actions = DBVistrail.db_actions # This is now read-write
+    tags = DBVistrail.db_tags # This is now read-write
+    annotations = DBVistrail.db_annotations
+    action_annotations = DBVistrail.db_actionAnnotations
+    vistrail_variables = DBVistrail.db_vistrailVariables
+    parameter_explorations = DBVistrail.db_parameter_explorations
+    
+    def _get_actionMap(self):
+        return self.db_actions_id_index
+    actionMap = property(_get_actionMap)
+    
+    def get_annotation(self, key):
+        if self.db_has_annotation_with_key(key):
+            return self.db_get_annotation_by_key(key)
+        return None
+    
+    def set_annotation(self, key, value):
+        if self.db_has_annotation_with_key(key):
+            old_annotation = self.db_get_annotation_by_key(key)
+            if old_annotation.value == value:
+                return False
+            self.db_delete_annotation(old_annotation)
+        if not (value is None or (isinstance(value, str) and value.strip() == '')):
+            annotation = Annotation(id=self.idScope.getNewId(Annotation.vtType),
+                                    key=key,
+                                    value=value,
+                                    )
+            self.db_add_annotation(annotation)
+        return True
+
+    def _get_plugin_info(self):
+        annotation = self.get_annotation("__plugin_info__")
+        if annotation is not None:
+            return annotation.value
+        else:
+            return ""
+#         return annotation.value if annotation is not None else ""
+    def _set_plugin_info(self, value):
+        return self.set_annotation("__plugin_info__", value)
+    plugin_info = property(_get_plugin_info, _set_plugin_info)
+
+    def _get_database_info(self):
+        annotation = self.get_annotation("__database_info__")
+        if annotation is not None:
+            return annotation.value
+        else:
+            return ""
+#         return annotation.value if annotation is not None else ""
+    def _set_database_info(self, value):
+        return self.set_annotation("__database_info__", value)
+    database_info = property(_get_database_info, _set_database_info)
+    
+    def _get_vistrail_vars(self):
+        return self.vistrail_variables
+    
+    def _set_vistrail_vars(self, vars):
+        self.vistrail_variables = vars
+    vistrail_vars = property(_get_vistrail_vars, _set_vistrail_vars)
+    
+    def has_vistrail_var(self, name):
+        return self.db_has_vistrailVariable_with_name(name)
+    
+    def get_vistrail_var(self, name):
+        if self.has_vistrail_var(name):
+            return self.db_get_vistrailVariable_by_name(name)
+        return None
+    
+    def set_vistrail_var(self, name, var):
+        if self.db_has_vistrailVariable_with_name(name):
+            old_var = self.db_get_vistrailVariable_by_name(name)
+            if var and old_var == var:
+                return False
+            self.db_delete_vistrailVariable(old_var)
+        if var:
+            self.db_add_vistrailVariable(var)
+        return True
+
+    def getVersionName(self, version):
+        """ getVersionName(version) -> str 
+        Returns the name of a version, if it exists. Returns an empty string
+        if it doesn't. 
+        
+        """
+        if self.has_tag(version):
+            return self.get_tag(version)
+        return ""
+
+    def get_pipeline_name(self, version):
+        tag_map = self.get_tagMap()
+        action_map = self.actionMap
+        count = 0
+        while True:
+            if version in tag_map or version <= 0:
+                if version in tag_map:
+                    name = tag_map[version]
+                else:
+                    name = "ROOT"
+                count_str = ""
+                if count > 0:
+                    count_str = " + " + str(count)
+                return name + count_str
+            version = action_map[version].parent
+            count += 1
+
+    def get_version_count(self):
+        """get_version_count() -> Integer
+        Returns the total number of versions in this vistrail.
+
+        """
+        return len(self.actionMap)
+
+    def get_version_number(self, version):
+        """get_version_number(version) -> Integer
+        Returns the version number given a tag.
+
+        """
+        return self.get_tag_str(version).action_id
+    
+    def get_latest_version(self):
+        """get_latest_version() -> Integer
+        Returns the latest version id for the vistrail.
+
+        FIXME: Running time O(|versions|)
+
+        FIXME: Check if pruning is handled correctly here.
+
+        """
+        try:
+            desc_key = Action.ANNOTATION_DESCRIPTION
+            # Get the max id of all actions (excluding upgrade actions)
+            max_ver = max(v.id for v in self.actions if not self.is_pruned(v.id) and not (v.has_annotation_with_key(desc_key) and v.get_annotation_by_key(desc_key).value == 'Upgrade'))
+            # If that action has an upgrade, use it
+            if self.has_upgrade(max_ver):
+                max_ver = long(self.get_upgrade(max_ver))
+            return max_ver
+        except:
+            return 0
+                   
+    def getPipeline(self, version):
+        """getPipeline(number or tagname) -> Pipeline
+        Return a pipeline object given a version number or a version name. 
+
+        """
+        try:
+            return Vistrail.getPipelineDispatcher[type(version)](self, version)
+        except Exception, e:
+            raise InvalidPipeline([e])
+    
+    def getPipelineVersionName(self, version):
+        """getPipelineVersionName(version:str) -> Pipeline
+        Returns a pipeline given a version name. If version name doesn't exist
+        it will return None.
+
+        """
+        if self.has_tag_str(version):
+            number = self.get_tag_str(version).action_id
+            return self.getPipelineVersionNumber(number)
+        else:
+            return None
+
+    def getPipelineVersionNumber(self, version):
+        """getPipelineVersionNumber(version:int) -> Pipeline
+        Returns a pipeline given a version number.
+
+        """
+        workflow = vistrails.core.db.io.get_workflow(self, version)
+        return workflow
+
+    def make_actions_from_diff(self, diff):
+        """ make_actions_from_diff(diff) -> [action]
+        Returns a sequence of actions that performs the diff.
+
+        (The point is that this might be smaller than the
+        algebra-based one).
+        """
+        (p1,
+         p2,
+         m_shared,
+         m_to_be_deleted,
+         m_to_be_added,
+         parameter_changes,
+         c_shared,
+         c_to_be_deleted,
+         c_to_be_added) = (diff.p1,
+                           diff.p2,
+                           diff.v1andv2,
+                           diff.v1only,
+                           diff.v2only,
+                           diff.paramchanged,
+                           diff.c1andc2,
+                           diff.c1only,
+                           diff.c2only)
+
+        p1_c = copy.copy(p1)
+        result = []
+
+        module_id_remap = Bidict()
+        module_id_remap.update(m_shared)
+
+        connection_id_remap = Bidict()
+        connection_id_remap.update(c_shared)
+        
+        for ((m_id_from, m_id_to), _) in parameter_changes:
+            module_id_remap[m_id_from] = m_id_to
+
+        # First all the modules to get the remap
+        for p2_m_id in m_to_be_added:
+            add_module = AddModuleAction()
+            add_module.module = copy.copy(p2.modules[p2_m_id])
+            add_module.module.id = p1_c.fresh_module_id()
+            module_id_remap[add_module.module.id] = p2_m_id
+            result.append(add_module)
+            add_module.perform(p1_c)
+
+
+        # Then all the connections using the remap
+        for p2_c_id in c_to_be_added:
+            c2 = p2.connections[p2_c_id]
+            add_connection = AddConnectionAction()
+            new_c = copy.copy(c2)
+            add_connection.connection = new_c
+            new_c.id = p1_c.fresh_connection_id()
+            new_c.sourceId = module_id_remap.inverse[c2.sourceId]
+            new_c.destinationId = module_id_remap.inverse[c2.destinationId]
+            connection_id_remap[c2.id] = new_c.id
+            result.append(add_connection)
+            add_connection.perform(p1_c)
+
+
+        # Now delete all connections:
+        delete_conns = DeleteConnectionAction()
+        delete_conns.ids = copy.copy(c_to_be_deleted)
+        if len(delete_conns.ids) > 0:
+            delete_conns.perform(p1_c)
+            result.append(delete_conns)
+
+        # And then all the modules
+        delete_modules = DeleteModuleAction()
+        delete_modules.ids = copy.copy(m_to_be_deleted)
+        if len(delete_modules.ids) > 0:
+            delete_modules.perform(p1_c)
+            result.append(delete_modules)
+
+        # From now on, module_id_remap is not necessary, we can act
+        # on p1 ids without worry. (they still exist)
+
+        # Now move everyone
+        move_action = MoveModuleAction()
+        for (p1_m_id, p2_m_id) in m_shared.iteritems():
+            delta = p2.modules[p2_m_id].location - p1.modules[p1_m_id].location
+            move_action.addMove(p1_m_id, delta.x, delta.y)
+        move_action.perform(p1_c)
+        result.append(move_action)
+
+        # Now change parameters
+        def make_param_change(fto_name, fto_params,
+                              m_id, f_id, m):
+            action = ChangeParameterAction()
+            for (p_id, param) in enumerate(fto_params):
+                p_name = m.functions[f_id].params[p_id].name
+                p_alias = m.functions[f_id].params[p_id].alias
+                (p_type, p_value) = param
+                action.addParameter(m_id, f_id, p_id, fto_name,
+                                    p_name, p_value, p_type, p_alias)
+            return action
+        
+        if len(parameter_changes):
+            # print parameter_changes
+            for ((m_from_id, m_to_id), plist) in parameter_changes:
+                m_from = p1.modules[m_to_id]
+                for ((ffrom_name, ffrom_params),
+                     (fto_name, fto_params)) in plist:
+                    for (f_id, f) in enumerate(m_from.functions):
+                        if f.name != fto_name: continue
+                        new_action = make_param_change(fto_name,
+                                                       fto_params,
+                                                       m_from_id,
+                                                       f_id,
+                                                       m_from)
+                        new_action.perform(p1_c)
+                        result.append(new_action)
+
+        return (result,
+                module_id_remap,
+                connection_id_remap)
+
+    def get_pipeline_diff_with_connections(self, v1, v2):
+        """like get_pipeline_diff but returns connection info
+        Keyword arguments:
+        v1     --- the first version number
+        v2     --- the second version number
+        return --- (p1, p2: VistrailPipeline,
+                    [shared modules (id in v1, id in v2) ...],
+                    [shared modules [heuristic match] (id in v1, id in v2)],
+                    [v1 not v2 modules],
+                    [v2 not v1 modules],
+                    [parameter-changed modules (see-below)],
+                    [shared connections (id in v1, id in v2) ...],
+                    [shared connections [heuristic] (id in v1, id in v2)],
+                    [c1 not in v2 connections],
+                    [c2 not in v1 connections])
+
+        parameter-changed modules = [((module id in v1, module id in v2),
+                                      [(function in v1, function in v2)...]),
+                                      ...]
+        
+        """
+        return vistrails.core.db.io.get_workflow_diff_with_connections((self, v1), 
+                                                             (self, v2))
+        
+    def get_pipeline_diff(self, v1, v2):
+        """ get_pipeline_diff(v1: int, v2: int) -> tuple        
+        Perform a diff between 2 versions, this will obtain the shared
+        modules by getting shared nodes on the version tree. After,
+        that, it will perform a heuristic algorithm to match
+        signatures of modules to get more shared/diff modules. The
+        heuristic is O(N^2), where N = the number of modules
+
+        Keyword arguments:
+        v1     --- the first version number
+        v2     --- the second version number
+        return --- (p1, p2: VistrailPipeline,
+                    [shared modules (id in v1, id in v2) ...],
+                    [shared modules [heuristic match] (id in v1, id in v2)],
+                    [v1 not v2 modules],
+                    [v2 not v1 modules],
+                    [parameter-changed modules (see-below)])
+
+        parameter-changed modules = [((module id in v1, module id in v2),
+                                      [(function in v1, function in v2)...]),
+                                      ...]
+        
+        """
+        return vistrails.core.db.io.get_workflow_diff((self, v1), (self, v2))
+                        
+    def getFirstCommonVersion(self, v1, v2):
+        """ Returns the first version that it is common to both v1 and v2 
+        Parameters
+        ----------
+        - v1 : 'int'
+         version number 1
+
+        - v2 : 'int'
+         version number 2
+
+        """
+        if (v1<=0 or v2<=0):
+            return 0
+        
+        t1 = set()
+        t1.add(v1)
+        t = self.actionMap[v1].parent
+        while  t != 0:
+            t1.add(t)
+            t = self.actionMap[t].parent
+        
+        t = v2
+        while t != 0:
+            if t in t1:
+                return t
+            t = self.actionMap[t].parent
+        return 0
+    
+    def getLastCommonVersion(self, v):
+        """getLastCommonVersion(v: Vistrail) -> int
+        Returns the last version that is common to this vistrail and v
+        
+        """
+        # TODO:  There HAS to be a better way to do this...
+        common = []
+        for action in self.actionMap:
+            if(v.hasVersion(action.timestep)):
+                common.append(action.timestep)
+                
+        timestep = 0
+        for time in common:
+            if time > timestep:
+                timestep = time
+
+        return timestep
+
+    def general_action_chain(self, v1, v2):
+        """general_action_chain(v1, v2): Returns an action that turns
+        pipeline v1 into v2."""
+
+        return vistrails.core.db.io.getPathAsAction(self, v1, v2)
+    
+    def actionChain(self, t, start=0):
+        """ actionChain(t:int, start=0) -> [Action]  
+        Returns the action chain (list of Action)  necessary to recreate a 
+        pipeline from a  certain time
+                      
+        """
+        assert t >= start
+        if t == start:
+            return []
+        result = []
+        action = self.actionMap[t]
+        
+        while 1:
+            result.append(action)
+            if action.timestep == start:
+                break
+            if action.parent == start:
+                if start != 0:
+                    action = self.actionMap[action.parent]
+                break
+            action = self.actionMap[action.parent]
+        result.reverse()
+        return result
+    
+    def update_object(self, obj, **kwargs):
+        self.db_update_object(obj, **kwargs)
+
+    def add_action(self, action, parent, session=None):
+        # FIXME: this should go to core.db.io
+        Action.convert(action)
+        if action.id < 0:
+            action.id = self.idScope.getNewId(action.vtType)
+        action.prevId = parent
+        action.date = self.getDate()
+        action.user = self.getUser()
+        if session is not None:
+            action.session = session
+        for op in action.operations:
+            if op.id < 0:
+                op.id = self.idScope.getNewId('operation')
+                if op.vtType == 'add' or op.vtType == 'change':
+                    self.db_add_object(op.db_data)
+        self.addVersion(action)                
+
+#     def add_abstraction(self, abstraction):
+#         Abstraction.convert(abstraction)
+#         if abstraction.id < 0:
+#             abstraction.id = self.idScope.getNewId(abstraction.vtType)
+#             action_remap = {}
+#             for action in abstraction.actions.itervalues():
+#                 if action.id < 0:
+#                     new_id = abstraction.idScope.getNewId(action.vtType)
+#                     action_remap[action.id] = new_id
+#                     action.id = new_id
+#                 action.date = self.getDate()
+#                 action.user = self.getUser()
+#                 for op in action.operations:
+#                     if op.id < 0:
+#                         op.id = self.idScope.getNewId('operation')
+#             for action in abstraction.actions.itervalues():
+#                 if action.prevId < 0:
+#                     action.prevId = action_remap[action.prevId]
+
+#         self.db_add_abstraction(abstraction)
+
+    def getLastActions(self, n):
+        """ getLastActions(n: int) -> list of ids
+        Returns the last n actions performed
+        """
+        last_n = []
+        num_actions = len(self.actionMap)
+        if num_actions < n:
+            n = num_actions
+        if n > 0:
+            sorted_keys = sorted(self.actionMap.keys())
+            last_n = sorted_keys[num_actions-n:num_actions-1]
+        return last_n
+
+    def hasVersion(self, version):
+        """hasVersion(version:int) -> boolean
+        Returns True if version with given timestamp exists
+
+        """
+        return version in self.actionMap
+    
+    def addVersion(self, action):
+        """ addVersion(action: Action) -> None 
+        Adds new version to vistrail
+          
+        """
+        if action.timestep in self.actionMap:
+            raise VistrailsInternalError("existing timestep: %d" % 
+                                         action.timestep)
+        self.db_add_action(action)
+        self.changed = True
+
+        # signal to update explicit tree
+        self.tree.addVersion(action.id, action.prevId)
+
+    def hasTag(self, tag):
+        """ hasTag(tag) -> boolean 
+        Returns True if a tag with given name or number exists
+       
+        """
+        if isinstance(tag, (int, long)):
+            return self.has_tag(tag)
+        elif isinstance(tag, basestring):
+            return self.has_tag_str(tag)
+        
+    def addTag(self, version_name, version_number):
+        """addTag(version_name, version_number) -> None
+        Adds new tag to vistrail
+          
+        """
+        if version_name == '':
+            return None
+        if self.has_tag(version_number):
+            debug.log("Version is already tagged")
+            raise VersionAlreadyTagged()
+        if self.has_tag_str(version_name):
+            debug.log("Tag already exists")
+            raise TagExists()
+        self.set_tag(version_number, version_name)
+        
+    def changeTag(self, version_name, version_number):
+        """changeTag(version_name, version_number) -> None        
+        Changes the old tag of version_number to version_name in the
+        vistrail.  If version_name is empty, this version will be
+        untagged.
+                  
+        """
+        if not self.has_tag(version_number):
+            debug.log("Version is not tagged")
+            raise VersionNotTagged()
+        if self.get_tag(version_number) == version_name:
+            return None
+        if self.has_tag_str(version_name):
+            debug.log("Tag already exists")
+            raise TagExists()
+        self.set_tag(version_number, version_name)
+
+    def has_action_annotation(self, action_id, key):
+        return self.db_has_actionAnnotation_with_action_id((action_id, key))
+    
+    def get_action_annotation(self, action_id, key):
+        if self.has_action_annotation(action_id, key):
+            return self.db_get_actionAnnotation_by_action_id((action_id, key))
+        return None
+
+    def delete_action_annotation(self, action_id, key):
+        annotation = self.get_action_annotation(action_id, key)
+        self.db_delete_actionAnnotation(annotation)
+
+    def set_action_annotation(self, action_id, key, value):
+        changed = False
+        if self.has_action_annotation(action_id, key):
+            annotation = self.get_action_annotation(action_id, key)
+            if annotation.value == value:
+                return False
+            self.db_delete_actionAnnotation(annotation)
+            changed = True
+        if value is not None and value.strip() != '':
+            new_id = self.idScope.getNewId(ActionAnnotation.vtType)
+            annotation = ActionAnnotation(id=new_id,
+                                          action_id=action_id,
+                                          key=key,
+                                          value=value,
+                                          date=self.getDate(),
+                                          user=self.getUser())
+            #print 'doing addAnnotation', action_id, key, value
+            self.db_add_actionAnnotation(annotation)
+            changed = True
+        if changed:
+            self.changed = True
+            return True
+        return False
+
+    def get_tagMap(self):
+        tagMap = {}
+        for annotation in self.action_annotations:
+            if annotation.db_key == Vistrail.TAG_ANNOTATION:
+                tagMap[annotation.db_action_id] = annotation.db_value
+        return tagMap
+    def has_tag_str(self, value):
+        return self.db_has_actionAnnotation_with_key((Vistrail.TAG_ANNOTATION,
+                                                      value))
+    def get_tag_str(self, value):
+        return self.db_get_actionAnnotation_by_key((Vistrail.TAG_ANNOTATION,
+                                                     value))
+    def has_tag(self, action_id):
+        return self.has_action_annotation(action_id, Vistrail.TAG_ANNOTATION)
+    def get_tag(self, action_id):
+        a = self.get_action_annotation(action_id, Vistrail.TAG_ANNOTATION)
+        if a is not None:
+            return a.value
+        return None
+    def set_tag(self, action_id, value):
+        return self.set_action_annotation(action_id, Vistrail.TAG_ANNOTATION,
+                                          value)
+
+    def has_notes(self, action_id):
+        return self.has_action_annotation(action_id, Vistrail.NOTES_ANNOTATION)
+    def get_notes(self, action_id):
+        a = self.get_action_annotation(action_id, Vistrail.NOTES_ANNOTATION)
+        if a is not None:
+            return a.value
+        return None
+    def set_notes(self, action_id, value):
+        return self.set_action_annotation(action_id, Vistrail.NOTES_ANNOTATION,
+                                          value)
+
+    def has_paramexp(self, action_id):
+        """ Check if vistrail has a latest paramexp for action action_id
+        """
+        return len(self.get_paramexps(action_id))>0
+    def get_paramexp(self, action_id):
+        """ Check if vistrail has a default paramexp for action action_id
+            and returns it (using latest id)
+        """
+        pes = self.get_paramexps(action_id)
+        if not len(pes):
+            return None
+        pes.sort(key=lambda x: x.id)
+        return pes[-1]
+    def get_paramexps(self, action_id):
+        """ return all pe:s for this action
+        """
+        return [pe for pe in self.parameter_explorations if pe.action_id == action_id]
+    def has_named_paramexp(self, name):
+        """ Check if vistrail has a paramexp named "name"
+        """
+        if not name:
+            return False
+        for pe in self.parameter_explorations:
+            if pe.name == name:
+                return True 
+        return False
+    def get_named_paramexp(self, name):
+        """ Returns the paramexp named "name" or None
+        """
+        for pe in self.parameter_explorations:
+            if pe.name == name:
+                return pe 
+        return None
+    def delete_paramexp(self, param_exp):
+        self.db_delete_parameter_exploration(param_exp)
+    def add_paramexp(self, param_exp):
+        param_exp.id = self.idScope.getNewId(param_exp.vtType)
+        self.db_add_parameter_exploration(param_exp)
+
+    def has_thumbnail(self, action_id):
+        return self.has_action_annotation(action_id,
+                                          Vistrail.THUMBNAIL_ANNOTATION)
+    def get_thumbnail(self, action_id):
+        a = self.get_action_annotation(action_id, 
+                                       Vistrail.THUMBNAIL_ANNOTATION)
+        if a is not None:
+            return a.value
+        return None
+    def set_thumbnail(self, action_id, value):
+        return self.set_action_annotation(action_id,
+                                          Vistrail.THUMBNAIL_ANNOTATION,
+                                          value)
+
+    def has_prune(self, action_id):
+        return self.has_action_annotation(action_id, Vistrail.PRUNE_ANNOTATION)
+    def get_prune(self, action_id):
+        a = self.get_action_annotation(action_id, Vistrail.PRUNE_ANNOTATION)
+        if a is not None:
+            return a.value
+        return None
+    def set_prune(self, action_id, value):
+        if isinstance(value, bool):
+            value = str(value)
+        return self.set_action_annotation(action_id, Vistrail.PRUNE_ANNOTATION,
+                                          value)
+    def is_pruned(self, action_id):
+        return self.get_prune(action_id) == str(True)
+
+    def has_upgrade(self, action_id):
+        return self.has_action_annotation(action_id, 
+                                          Vistrail.UPGRADE_ANNOTATION)
+    def get_upgrade(self, action_id, root_level=True):
+        a = self.get_action_annotation(action_id, Vistrail.UPGRADE_ANNOTATION)
+        if a is not None:
+            # Recurse to get the newest upgrade in case there are
+            # multiple chained upgrades
+            return self.get_upgrade(long(a.value), False)
+        if root_level:
+            return None
+        return action_id
+    def set_upgrade(self, action_id, value):
+        return self.set_action_annotation(action_id, 
+                                          Vistrail.UPGRADE_ANNOTATION,
+                                          value)
+    
+    def change_annotation(self, key, value, version_number):
+        """ change_annotation(key:str, value:str, version_number:long) -> None 
+        Changes the annotation of (key, value) for version version_number
+                  
+        """
+        
+        if version_number in self.actionMap:
+            action = self.actionMap[version_number]
+            if action.has_annotation_with_key(key):
+                old_annotation = action.get_annotation_by_key(key)
+                if old_annotation.value == value:
+                    return False
+                action.delete_annotation(old_annotation)
+            if value.strip() != '':
+                annotation = \
+                    Annotation(id=self.idScope.getNewId(Annotation.vtType),
+                               key=key,
+                               value=value,
+                               )
+                action.add_annotation(annotation)
+            self.changed = True
+            return True
+        return False
+
+    def change_description(self, description, version_number): 
+        """ change_description(description:str, version_number:int) -> None 
+        Changes the description of a version
+                  
+        """
+       
+        return self.change_annotation(Action.ANNOTATION_DESCRIPTION, 
+                                      description, version_number)
+
+    def change_analogy_info(self, analogy_info, version_number):
+        """ change_analogy_info(analogy_info:str, version_number:int) -> None 
+        Changes the analogy information of a version
+                  
+        """
+
+        return self.change_annotation(Action.ANNOTATION_ANALOGY_INFO,
+                                      analogy_info, version_number)
+
+    def get_description(self, version_number):
+        """ get_description(version_number: int) -> str
+        Compute the description of a version
+        
+        """
+        description = "Other action"
+        if not version_number:
+            description = "" # Root node
+        elif version_number in self.actionMap:
+            action = self.actionMap[version_number]
+            # if a description has been manually set, return that value
+            if action.description is not None:
+                return action.description
+            ops = action.operations
+            added_modules = 0
+            added_functions = 0
+            added_parameters = 0
+            added_connections = 0
+            added_annotations = 0
+            added_ports = 0
+            moved_modules = 0
+            changed_parameters = 0
+            changed_annotations = 0
+            deleted_modules = 0
+            deleted_connections = 0
+            deleted_parameters = 0
+            deleted_functions = 0
+            deleted_annotations = 0
+            deleted_ports = 0
+            for op in ops:
+                if op.vtType == 'add':
+                    if op.what == 'module':
+                        added_modules+=1
+                    elif op.what == 'connection':
+                        added_connections+=1
+                    elif op.what == 'function':
+                        added_functions+=1
+                    elif op.what == 'parameter':
+                        added_parameters+=1
+                    elif op.what == 'annotation':
+                        added_annotations+=1
+                    elif op.what == 'portSpec':
+                        added_ports += 1
+                elif op.vtType == 'change':
+                    if op.what == 'parameter':
+                        changed_parameters+=1
+                    elif op.what == 'location':
+                        moved_modules+=1
+                    elif op.what == 'annotation':
+                        changed_annotations+=1
+                elif op.vtType == 'delete':
+                    if op.what == 'module':
+                        deleted_modules+=1
+                    elif op.what == 'connection':
+                        deleted_connections+=1
+                    elif op.what == 'function':
+                        deleted_functions+=1
+                    elif op.what == 'parameter':
+                        deleted_parameters+=1
+                    elif op.what == 'annotation':
+                        deleted_annotations+=1
+                    elif op.what == 'portSpec':
+                        deleted_ports += 1
+                else:
+                    raise TypeError("Unknown operation type '%s'" % op.vtType)
+
+            if added_modules:
+                description = "Added module"
+                if added_modules > 1:
+                    description += "s"
+            elif added_connections:
+                description = "Added connection"
+                if added_connections > 1:
+                    description += "s"
+            elif added_functions or added_parameters:
+                description = "Added parameter"
+                if added_functions > 1 or added_parameters > 1:
+                    description += "s"
+            elif added_annotations:
+                description = "Added annotation"
+                if added_annotations > 1:
+                    description += "s"
+            elif added_ports:
+                description = "Added port"
+                if added_ports > 1:
+                    description += "s"
+            elif changed_parameters:
+                description = "Changed parameter"
+                if changed_parameters > 1:
+                    description += "s"
+            elif moved_modules:
+                description = "Moved module"
+                if moved_modules > 1:
+                    description += "s"
+            elif changed_annotations:
+                description = "Changed annotation"
+                if changed_annotations > 1:
+                    description += "s"
+            elif deleted_modules:
+                description = "Deleted module"
+                if deleted_modules > 1:
+                    description += "s"
+            elif deleted_connections:
+                description = "Deleted connection"
+                if deleted_connections > 1:
+                    description += "s"
+            elif deleted_parameters or deleted_functions:
+                description = "Deleted parameter"
+                if deleted_parameters > 1 or deleted_functions > 1:
+                    description += "s"
+            elif deleted_annotations:
+                description = "Deleted annotation"
+                if deleted_annotations > 1:
+                    description += "s"
+            elif deleted_ports:
+                description = "Deleted port"
+                if deleted_ports > 1:
+                    description += "s"
+        return description
+
+    # FIXME: remove this function (left here only for transition)
+    def getVersionGraph(self):
+        """getVersionGraph() -> Graph 
+        Returns the version graph
+        
+        """
+        result = Graph()
+        result.add_vertex(0)
+
+        # the sorting is for the display using graphviz
+        # we want to always add nodes from left to right
+        for action in sorted(self.actionMap.itervalues(), 
+                             key=lambda x: x.timestep):
+            # We need to check the presence of the parent's timestep
+            # on the graph because it might have been previously
+            # pruned. Remember that pruning is only marked for the
+            # topmost invisible action.
+            if (action.parent in result.vertices and
+                not self.is_pruned(action.id)):
+                result.add_edge(action.parent,
+                                action.timestep,
+                               0)
+        return result
+
+    def getDate(self):
+        """ getDate() -> str - Returns the current date and time. """
+    #    return time.strftime("%d %b %Y %H:%M:%S", time.localtime())
+        return datetime.datetime.now()
+    
+    def getUser(self):
+        """ getUser() -> str - Returns the username. """
+        return getpass.getuser()
+
+    def serialize(self, filename):
+        pass
+
+    def pruneVersion(self, version):
+        """ pruneVersion(version: int) -> None
+        Add a version into the prunedVersion set
+        
+        """
+        tagMap = self.get_tagMap()
+        if version!=0: # not root
+            def delete_tag(version):
+                if version in tagMap:
+                    # delete tag
+                    self.set_tag(version, '')
+            current_graph = self.getVersionGraph()
+            current_graph.dfs(vertex_set=[version], enter_vertex=delete_tag)
+            self.set_prune(version, str(True))
+
+            # self.prunedVersions.add(version)
+
+    def hideVersion(self, version):
+        """ hideVersion(version: int) -> None
+        Set the prune flag for the version
+
+        """
+        if version != 0:
+            self.set_prune(version, str(True))
+
+    def showVersion(self, version):
+        """ showVersion(version: int) -> None
+        Set the prune flag for the version
+
+        """
+        if version != 0:
+            self.set_prune(version, str(False))
+
+    def expandVersion(self, version):
+        """ expandVersion(version: int) -> None
+        Set the expand flag for the version
+        
+        """
+        if version!=0: # not root
+            self.actionMap[version].expand = 1
+
+    def collapseVersion(self, version):
+        """ collapseVersion(version: int) -> None
+        Reset the expand flag for the version
+        
+        """
+        if version!=0:
+            self.actionMap[version].expand = 0
+
+    def setSavedQueries(self, savedQueries):
+        """ setSavedQueries(savedQueries: list of (str, str, str)) -> None
+        Set the saved queries of this vistrail
+        
+        """
+        self.savedQueries = savedQueries
+
+    # Dispatch in runtime according to type
+    getPipelineDispatcher = {}
+    getPipelineDispatcher[type(0)] = getPipelineVersionNumber
+    getPipelineDispatcher[type(0L)] = getPipelineVersionNumber
+    getPipelineDispatcher[type('0')] = getPipelineVersionName
+
+    class InvalidAbstraction(Exception):
+        pass
+
+    def get_persisted_log(self):
+        """
+        Returns the log object for this vistrail if available
+        """
+        log = Log()
+        if isinstance(self.locator, vistrails.core.db.locator.ZIPFileLocator):
+            if self.db_log_filename is not None:
+                log = open_log_from_xml(self.db_log_filename, True)
+        if isinstance(self.locator, vistrails.core.db.locator.DBLocator):
+            connection = self.locator.get_connection()
+            log = open_vt_log_from_db(connection, self.db_id)
+        Log.convert(log)
+        return log
+    
+    def get_used_packages(self):
+        package_list = {}
+        for action in self.actions:
+            for op in action.operations:
+                try:
+                    if isinstance(op, AddOp) and op.what == 'module':
+                        package_list[op.data.package] = op.data.package
+                except:
+                    pass
+        return package_list
+                    
+
+##############################################################################
+
+class ExplicitExpandedVersionTree(object):
+    """
+    Keep explicit expanded and tersed version 
+    trees.
+    """
+    def __init__(self, vistrail):
+        self.vistrail = vistrail
+        self.expandedVersionTree = Graph()
+        self.expandedVersionTree.add_vertex(0)
+        self.tersedVersionTree = Graph()
+
+    def addVersion(self, id, prevId):
+        # print "add version %d child of %d" % (id, prevId)
+        self.expandedVersionTree.add_vertex(id)
+        self.expandedVersionTree.add_edge(prevId,id,0)
+    
+    def getVersionTree(self):
+        return self.expandedVersionTree
+        
+##############################################################################
+
+class VersionAlreadyTagged(Exception):
+    def __str__(self):
+        return "Version is already tagged"
+    pass
+
+class TagExists(Exception):
+    def __str__(self):
+        return "Tag already exists"
+    pass
+
+class VersionNotTagged(Exception):
+    def __str__(self):
+        return "Version is not tagged"
+    pass
+
+##############################################################################
+# Testing
+
+from vistrails.core.system import get_vistrails_basic_pkg_id
+
+class TestVistrail(unittest.TestCase):
+
+    def create_vistrail(self):
+        vistrail = Vistrail()
+
+        m = Module(id=vistrail.idScope.getNewId(Module.vtType),
+                   name='Float',
+                   package=get_vistrails_basic_pkg_id())
+        add_op = AddOp(id=vistrail.idScope.getNewId(AddOp.vtType),
+                       what=Module.vtType,
+                       objectId=m.id,
+                       data=m)
+        function_id = vistrail.idScope.getNewId(ModuleFunction.vtType)
+        function = ModuleFunction(id=function_id,
+                                  name='value')
+        change_op = ChangeOp(id=vistrail.idScope.getNewId(ChangeOp.vtType),
+                             what=ModuleFunction.vtType,
+                             oldObjId=2,
+                             newObjId=function.real_id,
+                             parentObjId=m.id,
+                             parentObjType=Module.vtType,
+                             data=function)
+        param = ModuleParam(id=vistrail.idScope.getNewId(ModuleParam.vtType),
+                            type='Integer',
+                            val='1')
+        delete_op = DeleteOp(id=vistrail.idScope.getNewId(DeleteOp.vtType),
+                             what=ModuleParam.vtType,
+                             objectId=param.real_id,
+                             parentObjId=function.real_id,
+                             parentObjType=ModuleFunction.vtType)
+
+        action1 = Action(id=vistrail.idScope.getNewId(Action.vtType),
+                         operations=[add_op])
+        action2 = Action(id=vistrail.idScope.getNewId(Action.vtType),
+                         operations=[change_op, delete_op])
+
+        vistrail.add_action(action1, 0)
+        vistrail.add_action(action2, action1.id)
+        vistrail.addTag('first action', action1.id)
+        vistrail.addTag('second action', action2.id)
+        return vistrail
+
+    def test_get_tag_str(self):
+        v = self.create_vistrail()
+        self.failUnlessRaises(KeyError, lambda: v.get_tag_str('not here'))
+        v.get_tag_str('first action')
+        v.get_tag_str('second action')
+
+    def test_copy(self):
+        v1 = self.create_vistrail()
+        v2 = copy.copy(v1)
+        v3 = v1.do_copy(True, v1.idScope, {})
+        # FIXME add checks for equality
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        v1 = self.create_vistrail()
+        xml_str = vistrails.core.db.io.serialize(v1)
+        v2 = vistrails.core.db.io.unserialize(xml_str, Vistrail)
+        # FIXME add checks for equality
+
+    def test1(self):
+        import vistrails.core.vistrail
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        #testing nodes in different branches
+        v1 = 36
+        v2 = 41
+        p1 = v.getFirstCommonVersion(v1,v2)
+        p2 = v.getFirstCommonVersion(v2,v1)
+        self.assertEquals(p1,p2)
+        
+        #testing nodes in the same branch
+        v1 = 15
+        v2 = 36
+        p1 = v.getFirstCommonVersion(v1,v2)
+        p2 = v.getFirstCommonVersion(v2,v1)
+        self.assertEquals(p1,p2)
+
+        if p1 == 0 or p2 == 0:
+            self.fail("vistrails tree is not single rooted.")
+
+    def test2(self):
+        import vistrails.core.vistrail
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        #testing diff
+        v1 = 17
+        v2 = 27
+        v3 = 22
+        v.get_pipeline_diff(v1,v2)
+        v.get_pipeline_diff(v1,v3)
+
+    def test_empty_action_chain(self):
+        """Tests calling action chain on empty version."""
+        v = Vistrail()
+        p = v.getPipeline(0)
+
+    def test_empty_action_chain_2(self):
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        assert v.actionChain(17, 17) == []
+
+    def test_get_version_negative_one(self):
+        """Tests getting the 'no version' vistrail. This should raise
+        VistrailsDBException.
+
+        """
+        v = Vistrail()
+        self.assertRaises(InvalidPipeline, lambda: v.getPipeline(-1))
+
+    def test_version_graph(self):
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.system
+        v = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/dummy.xml').load()
+        v.getVersionGraph()
+
+    def test_plugin_info(self):
+        import vistrails.core.db.io
+        plugin_info_str = "this is a test of plugin_info"
+        v1 = self.create_vistrail()
+        v1.plugin_info = plugin_info_str
+        xml_str = vistrails.core.db.io.serialize(v1)
+        v2 = vistrails.core.db.io.unserialize(xml_str, Vistrail)
+        assert plugin_info_str == v2.plugin_info
+
+    def test_database_info(self):
+        import vistrails.core.db.io
+        database_info_str = "db.hostname.edu:3306:TABLE_NAME"
+        v1 = self.create_vistrail()
+        v1.database_info = database_info_str
+        xml_str = vistrails.core.db.io.serialize(v1)
+        v2 = vistrails.core.db.io.unserialize(xml_str, Vistrail)
+        assert database_info_str == v2.database_info
+
+    def test_plugin_data(self):
+        import vistrails.core.db.io
+        v1 = self.create_vistrail()
+        plugin_data_str = "testing plugin_data"
+        p = PluginData(id=v1.idScope.getNewId(PluginData.vtType),
+                       data=plugin_data_str)
+        add_op = AddOp(id=v1.idScope.getNewId(AddOp.vtType),
+                       what=PluginData.vtType,
+                       objectId=p.id,
+                       data=p)
+        action = Action(id=v1.idScope.getNewId(Action.vtType),
+                        operations=[add_op])
+        v1.add_action(action, 0)
+        workflow = v1.getPipeline(action.id)
+        p2 = workflow.plugin_datas[0]
+        assert plugin_data_str == p2.data
+
+    def test_inverse(self):
+        """Test if inverses and general_action_chain are working by
+        doing a lot of action-based transformations on a pipeline and
+        checking against another way of getting the same one."""
+        def check_pipelines(p, p2):
+            if p != p2:
+                p.show_comparison(p2)
+                return False
+            return True
+        from vistrails.core.db.locator import XMLFileLocator
+        from vistrails.core.db.locator import FileLocator
+        import vistrails.core.system
+        import sys
+
+        def do_test(filename, locator_class, old_v=None, new_v=None):
+            v = locator_class(vistrails.core.system.vistrails_root_directory() +
+                              filename).load()
+            if not isinstance(v, Vistrail):
+                v = v.vistrail
+            version_ids = v.actionMap.keys()
+            if old_v is None:
+                old_v = random.choice(version_ids)
+            p = v.getPipeline(old_v)
+
+            def do_single_test(start_v, end_v):
+                p2 = v.getPipeline(end_v)
+                a = v.general_action_chain(start_v, end_v)
+                p.perform_action(a)
+                #if not check_pipelines(p, p2):
+                #    print start_v, end_v
+
+                assert p == p2
+
+            if new_v is not None:
+                do_single_test(old_v, new_v)
+            else:
+                for i in xrange(10):
+                    new_v = random.choice(version_ids)
+                    do_single_test(old_v, new_v)
+                    old_v = new_v
+                    
+
+        do_test('/tests/resources/dummy.xml', XMLFileLocator)
+        do_test('/tests/resources/terminator.vt', FileLocator)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/core/vistrail/vistrailvariable.py b/vistrails/core/vistrail/vistrailvariable.py
new file mode 100644
index 0000000..19a9eeb
--- /dev/null
+++ b/vistrails/core/vistrail/vistrailvariable.py
@@ -0,0 +1,135 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBVistrailVariable
+
+import unittest
+import copy
+import vistrails.core
+
+class VistrailVariable(DBVistrailVariable):
+
+    ##########################################################################
+    # Constructors and copy
+
+    def __init__(self, *args, **kwargs):
+        DBVistrailVariable.__init__(self, *args, **kwargs)
+        
+    def __copy__(self):
+        return VistrailVariable.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrailVariable.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = VistrailVariable
+        return cp
+
+    @staticmethod
+    def convert(_vistrailvariable):
+        _vistrailvariable.__class__ = VistrailVariable
+
+    ##########################################################################
+    # Properties
+
+    name = DBVistrailVariable.db_name
+    uuid = DBVistrailVariable.db_uuid
+    package = DBVistrailVariable.db_package
+    module = DBVistrailVariable.db_module
+    namespace = DBVistrailVariable.db_namespace
+    value = DBVistrailVariable.db_value
+
+    ##########################################################################
+    # Operators
+    
+    def __str__(self):
+        """__str__() -> str - Returns a string representation of a
+        VistrailVariable object. 
+
+        """
+        rep = "<vistrailvariable name=%s uuid=%s package=%s module=%s \
+namespace=%s value=%s</vistrailvariable>"
+        return  rep % (str(self.name), str(self.uuid), str(self.package),
+                       str(self.module), str(self.namespace), str(self.value))
+
+    def __eq__(self, other):
+        """ __eq__(other: VistrailVariable) -> boolean
+        Returns True if self and other have the same attributes. Used by == 
+        operator. 
+        
+        """
+        if type(self) != type(other):
+            return False
+        if self.name != other.name:
+            return False
+        if self.uuid != other.uuid:
+            return False
+        if self.package != other.package:
+            return False
+        if self.module != other.module:
+            return False
+        if self.namespace != other.namespace:
+            return False
+        if self.value != other.value:
+            return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+################################################################################
+# Unit tests
+
+
+class TestVistrailVariable(unittest.TestCase):
+
+    def create_vv(self):
+        var = VistrailVariable('a','false uuid','pack','module',"ns","3.14")
+        return var
+
+    def test_copy(self):
+        a1 = self.create_vv()
+        a2 = copy.copy(a1)
+        self.assertEquals(a1, a2)
+        a3 = a1.do_copy()
+        self.assertEquals(a1, a3)
+
+    def test_serialization(self):
+        import vistrails.core.db.io
+        a1 = self.create_vv()
+        xml_str = vistrails.core.db.io.serialize(a1)
+        a2 = vistrails.core.db.io.unserialize(xml_str, VistrailVariable)
+        self.assertEquals(a1, a2)
+
+    def test_str(self):
+        a1 = self.create_vv()
+        str(a1)
diff --git a/vistrails/db/__init__.py b/vistrails/db/__init__.py
new file mode 100644
index 0000000..fc3514e
--- /dev/null
+++ b/vistrails/db/__init__.py
@@ -0,0 +1,45 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+class VistrailsDBException(Exception):
+    """VistrailsDBException is raised when there is any exception in the 
+    db code for VisTrails
+    
+    """
+    def __init__(self, msg):
+        self.msg = msg
+    def __str__(self):
+        return "VistrailsDBException: " + str(self.msg)
+
diff --git a/vistrails/db/bin/README b/vistrails/db/bin/README
new file mode 100644
index 0000000..184396f
--- /dev/null
+++ b/vistrails/db/bin/README
@@ -0,0 +1,27 @@
+To generate code for the vistrails database interaction automatically,
+you will need to run generate.py with a directory of specs files.
+
+Usage: python generate.py -v <version> [-a] [-m] [-n] [-p] [-s] [-d <dir>] [-x] [-b <dir>] 
+    -a            generate all database information (-p -s -x)
+    -m            make all directories
+    -n            do not change current version
+    -p            generate python domain classes
+    -s            generate sql schema and persistence classes
+    -d <dir>  versions directory
+    -x            generate xml schema and persistence classes
+    -v <version>  vistrail version tag
+    -b <dir>  base directory
+
+If you have not created any directory structure for the version,
+common usage would be something like
+
+python generate.py -v 0.6.0 -m -a -n
+
+with -n depending on whether you wish to change the current version or not.
+
+In the specs file, you can create indexes using the index attribute
+for a property.  You can specify multiple indexes by delimiting them
+with spaces.  You can specify a composite index by separating the
+fields by a colon.  Finally, you can specify that an index is not 1-1
+with '!' as the starting character; this allows us to ignore KeyErrors
+on the deletes from that dictionary.
\ No newline at end of file
diff --git a/vistrails/db/bin/__init__.py b/vistrails/db/bin/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/bin/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/bin/auto_gen_objects.py b/vistrails/db/bin/auto_gen_objects.py
new file mode 100644
index 0000000..e994737
--- /dev/null
+++ b/vistrails/db/bin/auto_gen_objects.py
@@ -0,0 +1,417 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+def capitalizeOne(str):
+    result = ''
+    strs = str.split('_')
+    for a_str in strs:
+        result += a_str[0].upper() + a_str[1:]
+    return result
+
+class Field:
+    def __init__(self, params):
+        self.params = params
+
+    def getName(self):
+        try:
+            return self.params['name']
+        except KeyError:
+            try:
+                return self.params['object']
+            except KeyError:
+                pass
+        return None
+    
+    def getPluralName(self):
+        try:
+            return self.params['pluralName']
+        except KeyError:
+            pass
+        return "%ss" % Field.getName(self)
+
+    def getIterator(self):
+        if Field.getType(self) == 'hash':
+            return Field.getFieldName(self) + '.itervalues()'
+        return Field.getFieldName(self)
+
+    def getPrivateIterator(self):
+        if Field.getType(self) == 'hash':
+            return Field.getPrivateName(self) + '.itervalues()'
+        return Field.getPrivateName(self)
+
+    def getRegularIterator(self):
+        if Field.getType(self) == 'hash':
+            return Field.getRegularName(self) + '.itervalues()'
+        return Field.getRegularName(self)
+
+    def getSingleName(self):
+        return Field.getName(self)
+       
+    def getRegularName(self):
+        if Field.isPlural(self):
+            return Field.getPluralName(self)
+        return Field.getName(self)
+
+    def getPythonName(self):
+        return 'db_' + Field.getName(self)
+
+    def getFieldName(self):
+        return 'db_' + Field.getRegularName(self)
+
+    def getDefineAccessor(self):
+        return '__get_%s' % Field.getFieldName(self)
+
+    def getDefineMutator(self):
+        return '__set_%s' % Field.getFieldName(self)
+
+    def getAccessor(self):
+        return 'db_get_%s' % Field.getRegularName(self)
+
+    def getMutator(self):
+        return 'db_set_%s' % Field.getRegularName(self)
+
+    def getAppender(self):
+        return 'db_add_%s' % Field.getSingleName(self)
+
+    def getLookup(self):
+        return 'db_get_%s' % Field.getSingleName(self)
+
+    def getModifier(self):
+        return 'db_change_%s' % Field.getSingleName(self)
+
+    def getRemover(self):
+        return 'db_delete_%s' % Field.getSingleName(self)
+
+    def getList(self):
+        return 'db_get_%s' % Field.getRegularName(self)
+
+    def getListValues(self):
+        if Field.getType(self) == 'hash':
+            return Field.getPrivateName(self) + '.values()'
+        return Field.getPrivateName(self)
+
+    def getPrivateName(self):
+        return '_%s' % Field.getFieldName(self)
+
+    def getMapping(self):
+        try:
+            return self.params['mapping']
+        except KeyError:
+            pass
+        return 'one-to-one'
+
+    def getType(self):
+        try:
+            return self.params['type']
+        except KeyError:
+            pass
+        return 'str'
+
+    def getPythonType(self):
+        return Field.getType(self)
+
+    def getIndices(self):
+        try:
+            str = self.params['index']
+            indices = str.split()
+            for i, index in enumerate(indices):
+                compound_idx = index.split(':')
+                if len(compound_idx) > 1:
+                    indices[i] = compound_idx
+            return indices
+        except KeyError:
+            pass
+        return []
+
+    def getAllIndices(self):
+        indices = []
+        if self.isReference():
+            if self.isPlural():
+                ref_obj = self.getReferencedObject()
+                key = ref_obj.getKey()
+                if key is not None:
+                    indices.append(key.getRegularName())
+            for index in self.getIndices():
+                if isinstance(index, list):
+                    index_field = []
+                    for piece in index:
+                        ignore_del_err = False
+                        if piece[0] == '!':
+                            piece = piece[1:]
+                            ignore_del_err = True
+                        ref_field = ref_obj.getField(piece)
+                        if ref_field is not None:
+                            if ignore_del_err:
+                                index_field.append('!' + ref_field.getRegularName())
+                            else:
+                                index_field.append(ref_field.getRegularName())
+                    if len(index_field) > 1:
+                        indices.append(index_field)
+                    elif len(index_field) > 0:
+                        indices.append(index_field[0])
+                else:
+                    ignore_del_err = False
+                    if index[0] == '!':
+                        index = index[1:]
+                        ignore_del_err = True
+                    index_field = ref_obj.getField(index)
+                    if index_field is not None:
+                        if ignore_del_err:
+                            indices.append('!' + index_field.getRegularName())
+                        else:
+                            indices.append(index_field.getRegularName())
+        return indices
+
+    def isInverse(self):
+        try:
+            return self.params['inverse'] == 'true'
+        except KeyError:
+            pass
+        return False
+    
+    def isPlural(self):
+        return self.getMapping() == 'one-to-many' or \
+            self.getMapping() == 'many-to-many'
+ 
+    def shouldExpand(self):
+        return self.params.get('expand','true') == 'true'
+
+    def shouldExpandAction(self):
+        return self.params.get('expandAction', 'true') == 'true'
+
+    def hasDiscriminator(self):
+        return self.params.has_key('discriminator')
+
+    def getDiscriminator(self):
+        try:
+            return self.params['discriminator']
+        except KeyError:
+            pass
+        return None
+
+class Choice(Field):
+    def __init__(self, params, properties):
+        Field.__init__(self, params)
+        self.properties = properties
+
+    def __str__(self):
+        return 'choice: %s\nparams:\n\t%s\nprops:\n\t%s' % \
+            (self.getName(), self.params, self.properties)
+
+    def isReference(self):
+        if len(self.properties) > 0:
+            return self.properties[0].isReference()
+        return False
+
+    def getReference(self):
+        if len(self.properties) > 0:
+            return self.properties[0].getReference()
+        return None
+
+    def getReferencedObject(self):
+        if len(self.properties) > 0:
+            return self.properties[0].getReferencedObject()
+
+    def isChoice(self):
+        return True
+
+class Property(Field):
+    def __init__(self, params, specs):
+        Field.__init__(self, params)
+        self.specs = specs
+        self.referencedObject = None
+
+    def __str__(self):
+        return 'property: %s\nparams:\n\t%s\nspecs:\n\t%s' % \
+            (self.getName(), self.params, self.specs)
+    
+    def getReference(self):
+        try:
+            return self.params['object']
+        except KeyError:
+            pass
+        return ''
+
+    def getReferencedObject(self):
+        return self.referencedObject
+    
+    def setReferencedObject(self, obj):
+        self.referencedObject = obj
+
+    def isReference(self):
+        try:
+            return self.params['ref'] == 'true'
+        except KeyError:
+            pass
+        return False
+
+    def isPrimaryKey(self):
+        try:
+            return self.params['primaryKey'] == 'true'
+        except KeyError:
+            pass
+        return False
+    
+    def isForeignKey(self):
+        try:
+            return self.params['foreignKey'] == 'true'
+        except KeyError:
+            pass
+        return False
+
+    def isChoice(self):
+        return False
+
+class Object:
+    def __init__(self, params, properties, layouts, choices):
+        self.params = params
+        self.properties = properties
+        self.layouts = layouts
+        self.choices = choices
+
+    def __str__(self):
+        propStr = ''
+        for property in self.properties:
+            propStr += '\t%s\n' % property
+        choiceStr = ''
+        for choice in self.choices:
+            choiceStr += '\t%s\n' % choice
+        return 'params:\n\t%s\nlayouts\n\t%s\n' % \
+            (self.params, self.layouts) + \
+            'properites:\n%s\nchoices:\n%s\n' % \
+            (propStr, choiceStr)
+
+    def getName(self):
+        try:
+            return self.params['name']
+        except KeyError:
+            pass
+        return None
+
+    def getField(self, field_name):
+        for property in self.properties:
+            if Property.getName(property) == field_name:
+                return property
+        for choice in self.choices:
+            if Choice.getName(choice) == field_name:
+                return choice
+        return None
+            
+    def getRegularName(self):
+        return Object.getName(self)
+
+    def getPythonName(self):
+        return 'db_' + Object.getName(self)
+
+    def getClassName(self):
+        try:
+            return self.params['className']
+        except KeyError:
+            pass
+        return 'DB%s' % capitalizeOne(Object.getName(self))
+
+    def getChildren(self):
+        return 'db_children'
+
+    def getKey(self):
+        for property in self.properties:
+            if property.isPrimaryKey():
+                return property
+        return None
+
+    def getSingleProperties(self):
+        return [p for p in self.properties if not p.isPlural()]
+
+    def getPluralProperties(self):
+        return [p for p in self.properties if p.isPlural and not p.isInverse()]
+
+    def getForeignKeys(self):
+        return [p for p in self.properties if p.isForeignKey()]
+
+    def getReferences(self):
+        return self.getReferenceProperties() + self.getReferenceChoices()
+
+    def getNonInverseReferences(self):
+        return [ref for ref in self.getReferences() if not ref.isInverse()]
+
+    def getReferenceProperties(self):
+        return [p for p in self.properties if p.isReference()]
+
+    def getReferenceChoices(self):
+        return [c for c in self.choices if c.isReference()]
+
+    def getNonReferenceProperties(self):
+        return [p for p in self.properties if not p.isReference()]
+
+    def getInverseProperties(self):
+        return [p for p in self.properties if p.isInverse()]
+
+    def getNonInverseProperties(self):
+        return [p for p in self.properties if not p.isInverse()]
+    
+    def getPythonVarNames(self):
+        return [field.getRegularName() for field in self.getPythonFields()]
+
+    def getPythonFields(self):
+        return [c for c in self.choices if not c.isInverse()] + \
+            [p for p in self.properties if not p.isInverse()]
+
+    def getPythonPluralFields(self):
+        return [f for f in self.getPythonFields() if f.isPlural()]
+    
+    def getPythonLists(self):
+        return [f for f in self.getPythonPluralFields() 
+                if f.getPythonType() != 'hash']
+
+    def getPythonHashes(self):
+        return [f for f in self.getPythonPluralFields() 
+                if f.getPythonType() == 'hash']
+
+    def getDiscriminatorProperty(self, dName):
+        try:
+            for property in self.properties:
+                if property.getName() == dName:
+                    return property
+        except KeyError:
+            pass
+        return None
+
+    def getConstructorNames(self):
+        return [f.getRegularName() for f in self.getPythonFields()]
+
+    def getCopyNames(self):
+        return [(f.getRegularName(), f.getPrivateName()) 
+                for f in self.getPythonFields() 
+                if not f.isPlural() and not f.isReference()]
diff --git a/vistrails/db/bin/generate.py b/vistrails/db/bin/generate.py
new file mode 100644
index 0000000..c3d624a
--- /dev/null
+++ b/vistrails/db/bin/generate.py
@@ -0,0 +1,382 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""auto-generates code given specs"""
+
+# requires mako python package (easy_install Mako) and 
+# uses emacs via subprocess call for python indentation
+# the emacs call is slow because it checks all of the indentation
+
+from mako.template import Template
+
+import os
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+import getopt
+from parser import AutoGenParser
+import xml_gen_objects
+import sql_gen_objects
+
+BASE_DIR = os.path.dirname(os.getcwd())
+
+DOMAIN_INIT = """from auto_gen import *"""
+PERSISTENCE_INIT = \
+"""from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+"""
+COPYRIGHT_NOTICE = \
+"""###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""
+
+def preprocess_template(in_fname, out_fname=None):
+    in_file = open(in_fname)
+    if out_fname is not None:
+        out_file = open(out_fname, 'w')
+    else:
+        out_file = sys.stdout
+
+    single_slash = re.compile(r'\s*\\$')
+    double_slash = re.compile(r'\s*\\\\$')
+    triple_slash = re.compile(r'\s*\\\\\\$')
+    slash_bang = re.compile(r'\s*\\!$')
+    python_block = re.compile(r'^\s+<%')
+    strip_whitespace = False
+    for line in in_file:
+        if strip_whitespace:
+            line = line.lstrip()
+        if python_block.search(line):
+            line = python_block.sub(r'<%', line)
+        if triple_slash.search(line):
+            line = triple_slash.sub(r' ${"\\\\"}', line)
+            strip_whitespace = False
+        elif double_slash.search(line):
+            line = double_slash.sub(r'\\', line)
+            strip_whitespace = False
+        elif slash_bang.search(line):
+            line = line[:-3].rstrip()
+            strip_whitespace = True
+        elif single_slash.search(line):
+            line = line[:-2].rstrip() + ' '
+            strip_whitespace = True
+        else:
+            strip_whitespace = False
+        out_file.write(line)
+
+    if out_fname is not None:
+        out_file.close()
+    in_file.close()
+
+def indent_python(fname):
+    subprocess.Popen(["emacs", "-batch", fname, "-f", "mark-whole-buffer",
+                      "-f", "indent-region", "-f", "save-buffer", "-kill"],
+                     stdout=subprocess.PIPE).communicate()
+
+def run_template(template_fname, objects, version, version_string, output_file,
+                 indent=False):
+    [prefix, suffix] = os.path.basename(template_fname).split('.', 1)
+    (fd, p_fname) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
+    os.close(fd)
+    try:
+        preprocess_template(template_fname, p_fname)
+        template = Template(filename=p_fname, module_directory='/tmp/mako')
+
+        f = open(output_file, 'w')
+        f.write(template.render(objs=objects,
+                                version=version,
+                                version_string=version_string))
+        f.close()
+        if indent:
+            indent_python(output_file)
+    finally:
+        os.remove(p_fname)
+
+def usage(usageDict):
+    usageStr = ''
+    unrequired = ''
+    required = ''
+    for (opt, info) in usageDict.iteritems():
+        if info[1]:
+            required += '-%s <%s> ' % (opt[0], info[2])
+            usageStr += '    -%s <%s>  ' % (opt[0], info[2])
+        else:
+            if len(opt) > 1:
+                unrequired += '[-%s <%s>] ' % (opt[0], info[2])
+                usageStr += '    -%s <%s>  ' % (opt[0], info[2])
+            else:
+                unrequired += '[-%s] ' % opt[0]
+                usageStr += '    -%s            ' % opt[0]
+        usageStr += '%s\n' % info[0]
+    print 'Usage: python generate.py %s%s\n%s' % (required, 
+                                                             unrequired, 
+                                                             usageStr)
+
+def dirStructure(baseDir):
+    dirs = {}
+    dirs['base'] = baseDir
+    dirs['specs'] = os.path.join(dirs['base'], 'specs')
+    dirs['persistence'] = os.path.join(dirs['base'], 'persistence')
+    dirs['domain'] = os.path.join(dirs['base'], 'domain')
+    dirs['schemas'] = os.path.join(dirs['base'], 'schemas')
+    dirs['xmlPersistence'] = os.path.join(dirs['persistence'], 'xml')
+    dirs['sqlPersistence'] = os.path.join(dirs['persistence'], 'sql')
+    dirs['xmlSchema'] = os.path.join(dirs['schemas'], 'xml')
+    dirs['sqlSchema'] = os.path.join(dirs['schemas'], 'sql')
+    return dirs
+
+def makeAllDirs(dirs):
+    for (name, dir) in dirs.iteritems():
+        if not os.path.exists(dir):
+            print "creating directory '%s'" % dir
+            os.makedirs(dir)
+        if name not in set(['specs', 'schemas', 'xmlSchema', 'sqlSchema']):
+            init_file = os.path.join(dir, '__init__.py')
+            if not os.path.exists(init_file):
+                print "creating file '%s'" % init_file
+                f = open(init_file, 'w')
+                f.write(COPYRIGHT_NOTICE)
+                if name == 'domain':
+                    f.write(DOMAIN_INIT)
+                elif name == 'persistence':
+                    f.write(PERSISTENCE_INIT)
+                else:
+                    f.write('pass')
+                f.close()
+                    
+def main(argv=None):
+    options = {}
+    objects = None
+
+    optionsUsage = {'a': ('generate all database information (-p -s -x)', 
+                          False),
+                    'b:': ('base directory', False, 'dir'),
+                    'd:': ('versions directory', False, 'dir'),
+                    'p': ('generate python domain classes', False),
+                    's': ('generate sql schema and persistence classes', False),
+                    'x': ('generate xml schema and persistence classes', False),
+                    'v:': ('vistrail version tag', True, 'version'),
+                    'm': ('make all directories', False),
+                    'n': ('do not change current version', False)}
+
+    optStr = ''.join(optionsUsage.keys())
+    optKeys = optStr.replace(':','')
+    for idx in xrange(len(optKeys)):
+        options[optKeys[idx]] = False
+
+    try:
+        (optlist, args) = getopt.getopt(sys.argv[1:], optStr)
+        for opt in optlist:
+            if opt[1] is not None and opt[1] != '':
+                options[opt[0][1:]] = opt[1]
+            else:
+                options[opt[0][1:]] = True
+    except getopt.GetoptError:
+        usage(optionsUsage)
+        return
+
+    if options['b']:
+        baseDir = options['b']
+    else:
+        baseDir = BASE_DIR
+    baseDirs = dirStructure(baseDir)
+
+    if not options['v']:
+        usage(optionsUsage)
+        return
+
+    version = options['v']
+    # make sure version use dot-style
+    assert(len(version.split('.'))==3)
+    versionName = 'v' + version.replace('.', '_')
+    if options['d']:
+        versionsDir = options['d']
+    else:
+        versionsDir = os.path.join(baseDir, 'versions')
+    versionDir = os.path.join(versionsDir, versionName)
+    versionDirs = dirStructure(versionDir)
+
+    print baseDirs
+    print versionDirs
+
+    if options['m']:
+        makeAllDirs(baseDirs)
+        makeAllDirs(versionDirs)
+
+    # check whether we should use existing specs for version
+    use_base_specs = True
+    if options['n'] and os.path.exists(versionDirs['specs']):
+        for file in os.listdir(versionDirs['specs']):
+            if file.endswith('.xml'):
+                # assume we've already copied the specs
+                use_base_specs = False
+
+    if use_base_specs:
+        # copy specs to version        
+        print "copying base specs to version directory..."
+        for file in os.listdir(baseDirs['specs']):
+            if file.endswith('.xml'):
+                print 'copying %s' % file
+                filename = os.path.join(baseDirs['specs'], file)
+                toFile = os.path.join(versionDirs['specs'], file)
+                shutil.copyfile(filename, toFile)
+    else:
+        print "using existing specs from version directory..."
+
+    if options['p'] or options['a']:
+        # generate python domain objects
+        print "generating python domain objects..."
+        if objects is None:
+            parser = AutoGenParser()
+            objects = parser.parse(versionDirs['specs'])
+        run_template('templates/domain.py.mako', objects, version, versionName,
+                     os.path.join(versionDirs['domain'], 'auto_gen.py'),
+                     True)
+
+        if not options['n']:
+            domainFile = os.path.join(baseDirs['domain'], '__init__.py')
+            f = open(domainFile, 'w')
+            f.write(COPYRIGHT_NOTICE)
+            f.write('from vistrails.db.versions.%s.domain import *\n' % \
+                        versionName)
+            f.close()
+
+    if options['x'] or options['a']:
+        # generate xml schema and dao objects
+        print "generating xml schema and dao objects..."
+        if objects is None:
+            parser = AutoGenParser()
+            objects = parser.parse(versionDirs['specs'])
+        xml_objects = xml_gen_objects.convert(objects)
+        
+        run_template('templates/xml_schema.xsd.mako', 
+                     xml_gen_objects.convert_schema_order(xml_objects, 
+                                                          'vistrail'),
+                     version, versionName,
+                     os.path.join(versionDirs['xmlSchema'], 'vistrail.xsd'),
+                     False)
+
+        run_template('templates/xml_schema.xsd.mako', 
+                     xml_gen_objects.convert_schema_order(xml_objects, 
+                                                          'workflow'),
+                     version, versionName,
+                     os.path.join(versionDirs['xmlSchema'], 'workflow.xsd'),
+                     False)
+
+        run_template('templates/xml_schema.xsd.mako', 
+                     xml_gen_objects.convert_schema_order(xml_objects, 
+                                                          'log'),
+                     version, versionName,
+                     os.path.join(versionDirs['xmlSchema'], 'log.xsd'),
+                     False)
+
+        run_template('templates/xml.py.mako', xml_objects, version, versionName,
+                     os.path.join(versionDirs['xmlPersistence'], 'auto_gen.py'),
+                     True)
+
+    if options['s'] or options['a']:
+        # generate sql schema and dao objects
+        print "generating sql schema and dao objects..."
+        if objects is None:
+            parser = AutoGenParser()
+            objects = parser.parse(versionDirs['specs'])
+        sql_objects = sql_gen_objects.convert(objects)
+
+        run_template('templates/sql_schema.sql.mako', sql_objects, 
+                     version, versionName,
+                     os.path.join(versionDirs['sqlSchema'], 'vistrails.sql'),
+                     False)
+
+        run_template('templates/sql_delete.sql.mako', sql_objects, 
+                     version, versionName,
+                     os.path.join(versionDirs['sqlSchema'], 
+                                  'vistrails_drop.sql'),
+                     False)
+        
+        run_template('templates/sql.py.mako', sql_objects,
+                     version, versionName,
+                     os.path.join(versionDirs['sqlPersistence'], 'auto_gen.py'),
+                     True)
+
+    if not options['n']:
+        domainFile = os.path.join(baseDirs['persistence'], '__init__.py')
+        f = open(domainFile, 'w')
+        f.write(COPYRIGHT_NOTICE)
+        f.write('from vistrails.db.versions.%s.persistence import *\n' % \
+                    versionName)
+        f.close()
+            
+if __name__ == '__main__':
+    main()
diff --git a/vistrails/db/bin/parser.py b/vistrails/db/bin/parser.py
new file mode 100644
index 0000000..68dfbf1
--- /dev/null
+++ b/vistrails/db/bin/parser.py
@@ -0,0 +1,130 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import os
+from xml.dom import minidom, Node
+from auto_gen_objects import Object, Property, Choice
+
+class AutoGenParser:
+    def __init__(self):
+        pass
+
+    def parse(self, dir):
+        objects = {}
+        for file in os.listdir(dir):
+            if file.endswith('.xml'):
+                filename = os.path.join(dir, file)
+                # print filename
+                dom = minidom.parse(filename)
+                domObjects = dom.getElementsByTagName('object')
+                for node in domObjects:
+                    curObject = self.parseObject(node)
+                    objects[curObject.getName()] = curObject
+
+        # set the referenced objects here
+        for obj in objects.itervalues():
+            for prop in obj.properties:
+                if prop.getReference():
+                    try:
+                        prop.setReferencedObject(objects[prop.getReference()])
+                    except KeyError:
+                        print 'error:', prop.getReference()
+            for choice in obj.choices:
+                for prop in choice.properties:
+                    if prop.getReference():
+                        try:
+                            prop.setReferencedObject(
+                                objects[prop.getReference()])
+                        except KeyError:
+                            print 'error:', prop.getReference()
+                
+        return objects.values()
+
+    def parseObject(self, node):
+        params = {}
+        properties = []
+        choices = []
+        layouts = None
+        for attr in node.attributes.keys():
+            params[attr] = node.attributes.get(attr).value
+        for child in node.childNodes:
+            if child.nodeType == Node.ELEMENT_NODE:
+                if child.nodeName == 'layout':
+                    layouts = self.parseLayouts(child)
+                elif child.nodeName == 'property':
+                    property = self.parseProperty(child)
+                    properties.append(property)
+                elif child.nodeName == 'choice':
+                    choice = self.parseChoice(child)
+                    choices.append(choice)
+        return Object(params, properties, layouts, choices)
+    
+    def parseLayouts(self, node):
+        layouts = {}
+        for child in node.childNodes:
+            if child.nodeType == Node.ELEMENT_NODE:
+                layouts[child.nodeName] = self.parseDataToDict(child)
+        return layouts
+
+    def parseProperty(self, node):
+        params = {}
+        specs = {}
+        for attr in node.attributes.keys():
+            params[attr] = node.attributes.get(attr).value
+        for child in node.childNodes:
+            if child.nodeType == Node.ELEMENT_NODE:
+                specs[child.nodeName] = self.parseDataToDict(child)
+        return Property(params, specs)
+
+    def parseChoice(self, node):
+        params = {}
+        properties = []
+        for attr in node.attributes.keys():
+            params[attr] = node.attributes.get(attr).value
+        for child in node.childNodes:
+            if child.nodeType == Node.ELEMENT_NODE and \
+                    child.nodeName == 'property':
+                properties.append(self.parseProperty(child))
+        return Choice(params, properties)
+
+    def parseDataToDict(self, node):
+        dict = {}
+        if node.nodeType == Node.ELEMENT_NODE:
+            for attr in node.attributes.keys():
+                dict[attr] = node.attributes.get(attr).value
+            for child in node.childNodes:
+                if child.nodeType == Node.ELEMENT_NODE:
+                    dict[child.nodeName] = child.childNodes[0].data
+        return dict
diff --git a/vistrails/db/bin/sql_gen_objects.py b/vistrails/db/bin/sql_gen_objects.py
new file mode 100644
index 0000000..cf72c4b
--- /dev/null
+++ b/vistrails/db/bin/sql_gen_objects.py
@@ -0,0 +1,242 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen_objects import Object, Property, Choice
+
+SQL_TYPE = 'sql'
+
+class SQLObject(Object):
+    @staticmethod
+    def convert(obj):
+        if SQL_TYPE in obj.layouts:
+            obj.__class__ = SQLObject
+            for prop in obj.properties:
+                prop.__class__ = SQLProperty
+            for choice in obj.choices:
+                choice.__class__ = SQLChoice
+                for prop in choice.properties:
+                    prop.__class__ = SQLProperty
+        
+    def getName(self):
+        try:
+            return self.layouts[SQL_TYPE]['table']
+        except KeyError:
+            pass
+        return Object.getName(self)
+
+    def getSQLFields(self):
+        return self.getSQLProperties() + self.getSQLChoices()
+
+    def getSQLProperties(self):
+        return [p for p in self.properties if p.hasSpec()]
+
+    def getSQLChoices(self):
+        return [c for c in self.choices if c.hasSpec()]
+
+    def getSQLInverses(self):
+        return [f for f in self.getSQLFields() if f.isInverse()]
+
+    def getSQLInverseRefs(self):
+        return [f for f in self.getSQLFields() 
+                if f.isInverse() and f.isReference()]
+
+    def getSQLColumns(self):
+        return [f.getColumn() for f in self.getSQLFields()]
+
+    def getSQLReferences(self):
+        return ([p for p in self.properties 
+                 if p.isReference() and not p.isInverse()] + 
+                [c for c in self.choices 
+                 if c.isReference() and not c.isInverse()])
+
+    def getNormalSQLColumns(self):
+        return [p for p in self.properties if not p.isInverse() and \
+                    not p.isPrimaryKey() and not p.isReference() and \
+                    p.hasSpec()]
+
+    def getNormalSQLColumnsAndKey(self):
+        return self.getNormalSQLColumns() + [self.getKey()]
+
+    def getSQLConstructorPairs(self):
+        return [(f.getRegularName(), f.getRegularName()) 
+                for f in self.getNormalSQLColumnsAndKey()]
+
+    def getSQLColumnsAndKey(self):
+        return [p.getColumnn() for p in self.getNormalSQLColumnsAndKey()]
+
+    def getSQLReferenceProperties(self):
+        return [p for p in self.properties 
+                if not p.isInverse() and p.isReference()]
+
+    def getSQLForeignKeys(self):
+        return [p for p in self.properties 
+                if p.isInverse() and p.isForeignKey()]
+  
+    def getSQLReferencedField(self, refObj):
+        if refObj is not None:
+            # find inverse
+            for refProp in refObj.properties:
+                if refProp.isReference() and \
+                        refProp.isInverse() and \
+                        refProp.getReference() == self.getRegularName():
+                    return (refProp, False)
+            for choice in refObj.choices:
+                for refProp in self.getSQLPropertiesForChoice(choice):
+                    if refProp.isReference() and \
+                            refProp.getReference() == self.getRegularName():
+                        return (choice, True)
+        return (None, False)
+
+    def get_sql_referenced(self, ref_obj, inverse=False):
+        if ref_obj is not None:
+            for ref_prop in ref_obj.properties:
+                if not (inverse ^ ref_prop.isInverse()) and \
+                        ref_prop.isReference() and \
+                        ref_prop.getReference() == self.getRegularName():
+                    return (ref_prop, False)
+            for choice in ref_obj.choices:
+                if inverse ^ choice.isInverse():
+                    continue
+                for ref_prop in choice.properties:
+                    if ref_prop.isReference() and \
+                            ref_prop.getReference() == self.getRegularName():
+                        return (choice, True)
+        raise RuntimeError("didn't work", ref_obj.getRegularName(),
+                           self.getRegularName())
+            
+class SQLProperty (Property):
+    def hasSpec(self):
+        try:
+            sqlSpec = self.specs[SQL_TYPE]
+            return True
+        except KeyError:
+            pass
+        return False
+
+    def getName(self):
+        try:
+            return self.specs[SQL_TYPE]['name']
+        except KeyError:
+            pass
+        return Property.getName(self)
+
+    def getColumn(self):
+        try:
+            return self.specs[SQL_TYPE]['column']
+        except KeyError:
+            pass
+        return self.getName()
+    
+    def getType(self):
+        try:
+            return self.specs[SQL_TYPE]['type']
+        except KeyError:
+            pass
+        return 'int'
+
+    def getGlobalName(self):
+        try:
+            return self.specs[SQL_TYPE]['globalName']
+        except KeyError:
+            pass
+        return ''
+
+    def isText(self):
+        if string.find(self.getType().upper(), 'CHAR') != -1 or \
+                string.find(self.getType().upper(), 'DATE') != -1:
+            return True
+        return False
+
+    def isAutoInc(self):
+        try:
+            # FIXME include "and isPrimaryKey()" ?
+            return self.specs[SQL_TYPE]['autoInc'] == 'true' and \
+                self.isPrimaryKey()
+        except KeyError:
+            pass
+        return False
+
+    def isGlobal(self):
+        try:
+            return self.specs[SQL_TYPE]['global'] == 'true'
+        except KeyError:
+            pass
+        return False
+
+class SQLChoice(Choice):
+    def hasSpec(self):
+        if self.properties[0].hasSpec():
+            return True
+        return False
+
+    def getSpec(self):
+        if self.hasSpec():
+            return self.properties[0]
+        return None
+
+    def getColumn(self):
+        for property in self.properties:
+            if property.hasSpec():
+                break
+        try:
+            return property.specs[SQL_TYPE]['column']
+        except KeyError:
+            pass
+        return self.getName()
+      
+    def isGlobal(self):
+        try:
+            return self.properties[0].specs[SQL_TYPE]['global'] == 'true'
+        except KeyError:
+            pass
+        return False
+
+    def getGlobalName(self):
+        try:
+            return self.properties[0].specs[SQL_TYPE]['globalName']
+        except KeyError:
+            pass
+        return ''
+  
+    def getSQLProperties(self):
+        return [p for p in self.properties if p.hasSpec()]
+
+def convert(objects):
+    sql_objects = []
+    for obj in objects:
+        if SQL_TYPE in obj.layouts:
+            SQLObject.convert(obj)
+            sql_objects.append(obj)
+    return sql_objects
diff --git a/vistrails/db/bin/templates/domain.py.mako b/vistrails/db/bin/templates/domain.py.mako
new file mode 100644
index 0000000..5e2b456
--- /dev/null
+++ b/vistrails/db/bin/templates/domain.py.mako
@@ -0,0 +1,504 @@
+<%
+def getIndexName(index):
+    if type(index) == type([]):
+        # return '_'.join(index)
+        if index[0][0] == '!':
+            return index[0][1:]
+        return index[0]
+    else:
+        if index[0] == '!':
+            return index[1:]
+        return index
+
+def getIndexKey(field_str, index):
+    if type(index) == type([]):
+        if index[0][0] == '!':
+            index = [index[0][1:]] + index[1:]
+        return '(' + field_str + '.db_' + \
+            (',' + field_str + '.db_').join(index) + ')'
+    else:
+        if index[0] == '!':
+            index = index[1:]
+        return field_str + '.db_' + index
+
+def shouldIgnoreIndexDelete(index):
+    if type(index) == type([]):
+        return index[0][0] == '!'
+    return index[0] == '!'
+%> \\
+<%text>###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+</%text>
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+% for obj in objs:
+class ${obj.getClassName()}(object):
+
+    vtType = '${obj.getRegularName()}'
+
+    def __init__(self, ${', '.join(['%s=None' % n \
+                                    for n in obj.getConstructorNames()])}):
+        % for field in obj.getPythonFields():
+        % if field.isReference() and not field.isInverse():
+        self.db_deleted_${field.getRegularName()} = []
+        % endif
+        % if field.isPlural():
+        % for index in field.getAllIndices():
+        self.db_${field.getRegularName()}_${getIndexName(index)}_index = {}
+        % endfor
+        if ${field.getRegularName()} is None:
+            % if field.getPythonType() == 'hash':
+            self.${field.getPrivateName()} = {}
+            % else:
+            self.${field.getPrivateName()} = []
+            % endif
+        else:
+            self.${field.getPrivateName()} = ${field.getRegularName()}
+            % if len(field.getAllIndices()) > 0:
+            % if field.getPythonType() == 'hash':
+            for v in self.${field.getPrivateName()}.itervalues():
+            % else:
+            for v in self.${field.getPrivateName()}:
+            % endif
+                % for index in field.getAllIndices():
+                self.db_${field.getRegularName()}_${getIndexName(index)}_ \!
+                    index[${getIndexKey('v', index)}] = v
+                % endfor
+            % endif
+        % else:
+        self.${field.getPrivateName()} = ${field.getRegularName()}
+        % endif
+        % endfor
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return ${obj.getClassName()}.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = ${obj.getClassName()}( \!
+            ${',\n'.join(['%s=self.%s' % f for f in obj.getCopyNames()])})
+        % for field in obj.getPythonFields():
+        % if field.isPlural():
+        if self.${field.getPrivateName()} is None:
+            % if field.getPythonType() == 'hash':
+            cp.${field.getPrivateName()} = {}
+            % else:
+            cp.${field.getPrivateName()} = []
+            % endif
+        else:
+            % if field.getPythonType() == 'hash':
+            % if field.shouldExpand():
+            cp.${field.getPrivateName()} = \
+                dict([(k, v.do_copy(new_ids, id_scope, id_remap)) \
+                      for (k,v) in self.${field.getPrivateName()}.iteritems()])
+            % else:
+            cp.${field.getPrivateName()} = \
+                dict([(k, v.do_copy()) \
+                      for (k,v) in self.${field.getPrivateName()}.iteritems()])
+            % endif
+            % else:
+            % if field.shouldExpand():
+            cp.${field.getPrivateName()} = \
+                [v.do_copy(new_ids, id_scope, id_remap) \
+                     for v in self.${field.getPrivateName()}]
+            % else:
+            cp.${field.getPrivateName()} = \
+                [v.do_copy() for v in self.${field.getPrivateName()}]
+            % endif
+            % endif
+        % else:
+        % if field.isReference():
+        if self.${field.getPrivateName()} is not None:
+            % if field.shouldExpand():
+            cp.${field.getPrivateName()} = \
+                self.${field.getPrivateName()}.do_copy(new_ids, id_scope, \
+                                                           id_remap)
+            % else:
+            cp.${field.getPrivateName()} = \
+                self.${field.getPrivateName()}.do_copy()
+            % endif
+        % endif
+        % endif
+        % endfor
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            % if len(obj.getForeignKeys()) > 0:
+            % for field in obj.getForeignKeys():
+            <% 
+            if field.hasDiscriminator():
+                disc_prop = obj.getDiscriminatorProperty( \
+                    field.getDiscriminator())
+                lookup_str = "self.%s" % disc_prop.getPrivateName()
+            else:
+                ref_obj = field.getReferencedObject()
+                lookup_str = "'%s'" % ref_obj.getRegularName()
+            %> \\
+            if hasattr(self, '${field.getFieldName()}') and \
+                    (${lookup_str}, self.${field.getPrivateName()}) in id_remap:
+                cp.${field.getPrivateName()} = \
+                         id_remap[(${lookup_str}, \
+                                        self.${field.getPrivateName()})]
+            % endfor
+            % endif
+        
+        # recreate indices and set flags
+        % for field in obj.getPythonFields():
+        % if len(field.getAllIndices()) > 0:
+        % for index in field.getAllIndices():
+        cp.db_${field.getRegularName()}_${getIndexName(index)}_index = \
+            dict((${getIndexKey('v', index)}, v) \
+                     for v in cp.${field.getPrivateIterator()})
+        % endfor
+        % endif
+        % endfor
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    ## create static update_version
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = ${obj.getClassName()}()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        % for field in obj.getPythonFields():
+        if '${field.getRegularName()}' in class_dict:
+            res = class_dict['${field.getRegularName()}'](old_obj, trans_dict)
+            % if field.isPlural():
+            for obj in res:
+                new_obj.${field.getAppender()}(obj)
+            % else:
+            new_obj.${field.getFieldName()} = res
+            % endif
+        elif hasattr(old_obj, '${field.getFieldName()}') and \
+                old_obj.${field.getFieldName()} is not None:
+            % if field.isReference():
+            ## refObj = field.getReferencedObject()
+            % if field.isPlural():
+            for obj in old_obj.${field.getIterator()}:
+                % if field.isChoice():
+                <% cond = 'if' %> \\
+                % for prop in field.properties:
+                ## if prop.isReference():
+                ## propRefObj = prop.getReferencedObject()
+                ${cond} obj.vtType == \
+                    '${prop.getReferencedObject().getRegularName()}':
+                    new_obj.${field.getAppender()}( \!
+                        ${prop.getReferencedObject().getClassName()}. \!
+                         update_version(obj, trans_dict))
+                <% cond = 'elif' %> \\
+                % endfor
+                % else:
+                new_obj.${field.getAppender()}( \!
+                    ${field.getReferencedObject().getClassName()}. \!
+                     update_version(obj, trans_dict))
+                % endif
+            % else:
+            obj = old_obj.${field.getFieldName()}
+            % if field.isChoice():
+            <% cond = 'if' %> \\
+            % for prop in field.properties:
+            ## if prop.isReference():
+            ## propRefObj = prop.getReferencedObject()
+            ${cond} obj.vtType == \
+                '${prop.getReferencedObject().getRegularName()}':
+                new_obj.${field.getAppender()}( \!
+                    ${prop.getReferencedObject().getClassName()}. \!
+                     update_version(obj, trans_dict))
+            <% cond = 'elif' %> \\
+            % endfor
+            % else:
+            new_obj.${field.getAppender()}( \!
+                ${field.getReferencedObject().getClassName()}. \!
+                 update_version(obj, trans_dict))
+            % endif
+            % endif
+        % if not field.isInverse():
+        if hasattr(old_obj, 'db_deleted_${field.getRegularName()}') \
+                and hasattr(new_obj, 'db_deleted_${field.getRegularName()}'):
+            ## refObj = field.getReferencedObject()
+            for obj in old_obj.db_deleted_${field.getRegularName()}:
+                % if field.isChoice():
+                <% cond = 'if' %> \\
+                % for prop in field.properties:
+                ## if prop.isReference():
+                ## propRefObj = prop.getReferencedObject()
+                ${cond} obj.vtType == \
+                    '${prop.getReferencedObject().getRegularName()}':
+                    n_obj = ${prop.getReferencedObject().getClassName()}. \!
+                        update_version(obj, trans_dict)
+                    new_obj.db_deleted_${field.getRegularName()}.append(n_obj)
+                <% cond = 'elif' %> \\
+                % endfor
+                % else:
+                n_obj = ${field.getReferencedObject().getClassName()}. \!
+                    update_version(obj, trans_dict)
+                new_obj.db_deleted_${field.getRegularName()}.append(n_obj)
+                % endif
+        % endif
+        % else:
+            new_obj.${field.getFieldName()} = old_obj.${field.getFieldName()}
+        % endif
+        % endfor
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    ## create child methods
+    def ${obj.getChildren()}(self, parent=(None,None), orphan=False, for_action=False):
+        % if not any([not ref.isInverse() and ref.shouldExpand() \
+                      for ref in obj.getReferences()]):
+        return [(self, parent[0], parent[1])]
+        % else:
+        children = []
+        % for ref in obj.getReferences():
+        % if not ref.isInverse() and ref.shouldExpand():
+        ## refObj = ref.getReferencedObject()
+        % if not ref.shouldExpandAction():
+        if not for_action:
+            % if not ref.isPlural():
+            if self.${ref.getPrivateName()} is not None:
+                children.extend(self.${ref.getPrivateName()}. \!
+                                ${ref.getReferencedObject().getChildren()}( \!
+                                (self.vtType, self.db_id), orphan, for_action))
+            % else:
+            for child in self.${ref.getIterator()}:
+                children.extend(child.${ref.getReferencedObject().getChildren()}( \!
+                                (self.vtType, self.db_id), orphan, for_action))
+            % endif
+        % else:
+        % if not ref.isPlural():
+        if self.${ref.getPrivateName()} is not None:
+            children.extend(self.${ref.getPrivateName()}. \!
+                            ${ref.getReferencedObject().getChildren()}( \!
+                                (self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self.${ref.getPrivateName()} = None
+        % else:
+        to_del = []
+        for child in self.${ref.getIterator()}:
+            children.extend(child.${ref.getReferencedObject().getChildren()}( \!
+                                (self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.${ref.getRemover()}(child)
+        % endif
+        % endif
+        % endif
+        % endfor
+        children.append((self, parent[0], parent[1]))
+        return children
+        % endif
+    ## get deleted method
+    def db_deleted_children(self, remove=False):
+        children = []
+        % if len(obj.getNonInverseReferences()) > 0:
+        % for ref in obj.getNonInverseReferences():
+        children.extend(self.db_deleted_${ref.getRegularName()})
+        % endfor
+        if remove:
+            % for ref in obj.getNonInverseReferences():
+            self.db_deleted_${ref.getRegularName()} = []
+            % endfor
+        % endif
+        return children
+    ## dirty method
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        % for ref in obj.getNonInverseReferences():
+        % if not ref.isPlural():
+        if self.${ref.getPrivateName()} is not None and \
+                self.${ref.getPrivateName()}.has_changes():
+            return True
+        % else:
+        for child in self.${ref.getPrivateIterator()}:
+            if child.has_changes():
+                return True
+        % endif
+        % endfor
+        return False
+    ## create methods
+    % for field in obj.getPythonFields():
+    def ${field.getDefineAccessor()}(self):
+        return self.${field.getPrivateName()}
+    def ${field.getDefineMutator()}(self, ${field.getRegularName()}):
+        self.${field.getPrivateName()} = ${field.getRegularName()}
+        self.is_dirty = True
+    ${field.getFieldName()} = property(${field.getDefineAccessor()}, \
+                                            ${field.getDefineMutator()})
+    % if not field.isPlural():
+    def ${field.getAppender()}(self, ${field.getName()}):
+        self.${field.getPrivateName()} = ${field.getName()}
+    def ${field.getModifier()}(self, ${field.getName()}):
+        self.${field.getPrivateName()} = ${field.getName()}
+    def ${field.getRemover()}(self, ${field.getName()}):
+        % if field.isReference() and not field.isInverse():
+        if not self.is_new:
+            self.db_deleted_${field.getRegularName()}.append( \!
+                self.${field.getPrivateName()})
+        % endif
+        self.${field.getPrivateName()} = None
+    % else:
+    def ${field.getList()}(self):
+        return self.${field.getListValues()}
+    def ${field.getAppender()}(self, ${field.getName()}):
+        self.is_dirty = True
+        % if field.getPythonType() == 'hash':
+        self.${field.getPrivateName()}[${field.getName()}. \!
+            ${field.getReferencedObject().getKey().getPythonName()}] = \
+                ${field.getName()}
+        % else:
+        self.${field.getPrivateName()}.append(${field.getName()})
+        % endif
+        % for index in field.getAllIndices():
+        self.db_${field.getRegularName()}_${getIndexName(index)}_index[ \!
+            ${getIndexKey(field.getName(), index)}] = ${field.getName()}
+        % endfor
+    def ${field.getModifier()}(self, ${field.getName()}):
+        self.is_dirty = True
+        % if field.getPythonType() == 'hash':
+        ## childObj = field.getReferencedObject()
+        self.${field.getPrivateName()}[${field.getName()}. \!
+            ${field.getReferencedObject().getKey().getPythonName()}] = \
+                ${field.getName()}
+        % else:
+        ## childObj = field.getReferencedObject()
+        % if field.getReferencedObject().getKey() is not None:
+        found = False
+        for i in xrange(len(self.${field.getPrivateName()})):
+            if self.${field.getPrivateName()}[i]. \!
+                ${field.getReferencedObject().getKey().getPythonName()} == \
+                    ${field.getName()}. \!
+                    ${field.getReferencedObject().getKey().getPythonName()}:
+                self.${field.getPrivateName()}[i] = ${field.getName()}
+                found = True
+                break
+        if not found:
+            self.${field.getPrivateName()}.append(${field.getName()})
+        % else:
+        self.${field.getPrivateName()}.append(${field.getName()})
+        % endif
+        % endif
+        % for index in field.getAllIndices():
+        self.db_${field.getRegularName()}_${getIndexName(index)}_index[ \!
+            ${getIndexKey(field.getName(), index)}] = ${field.getName()}
+        % endfor
+    def ${field.getRemover()}(self, ${field.getName()}):
+        self.is_dirty = True
+        % if field.getPythonType() == 'hash':
+        ## childObj = field.getReferencedObject()
+        if not self.${field.getPrivateName()}[${field.getName()}. \!
+            ${field.getReferencedObject().getKey().getPythonName()}].is_new:
+            self.db_deleted_${field.getRegularName()}.append( \!
+                self.${field.getPrivateName()}[${field.getName()}. \!
+                    ${field.getReferencedObject().getKey().getPythonName()}])
+        del self.${field.getPrivateName()}[${field.getName()}. \!
+            ${field.getReferencedObject().getKey().getPythonName()}]
+        % else:
+        % if field.getReferencedObject().getKey() is None:
+        raise Exception('Cannot delete a non-keyed object')
+        % else:
+        for i in xrange(len(self.${field.getPrivateName()})):
+            if self.${field.getPrivateName()}[i]. \!
+                ${field.getReferencedObject().getKey().getPythonName()} == \
+                    ${field.getName()}. \!
+                    ${field.getReferencedObject().getKey().getPythonName()}:
+                if not self.${field.getPrivateName()}[i].is_new:
+                    self.db_deleted_${field.getRegularName()}.append( \!
+                        self.${field.getPrivateName()}[i])
+                del self.${field.getPrivateName()}[i]
+                break
+        % endif
+        % endif
+        % for index in field.getAllIndices():
+        % if shouldIgnoreIndexDelete(index):
+        try:
+            del self.db_${field.getRegularName()}_${getIndexName(index)}_ \!
+                index[${getIndexKey(field.getName(), index)}]
+        except KeyError:
+            pass
+        % else:
+        del self.db_${field.getRegularName()}_${getIndexName(index)}_ \!
+            index[${getIndexKey(field.getName(), index)}]
+        % endif
+        % endfor
+    def ${field.getLookup()}(self, key):
+        % if field.getPythonType() == 'hash':
+        if key in self.${field.getPrivateName()}:
+            return self.${field.getPrivateName()}[key]
+        return None
+        % else:
+        % if field.getReferencedObject().getKey() is not None:
+        for i in xrange(len(self.${field.getPrivateName()})):
+            if self.${field.getPrivateName()}[i]. \!
+                ${field.getReferencedObject().getKey().getPythonName()} == key:
+                return self.${field.getPrivateName()}[i]
+        % endif
+        return None
+        % endif
+    % endif
+    % for index in field.getAllIndices():
+    def db_get_${field.getSingleName()}_by_${getIndexName(index)}(self, key):
+        return self.db_${field.getRegularName()}_ \!
+            ${getIndexName(index)}_index[key]
+    def db_has_${field.getSingleName()}_with_${getIndexName(index)}(self, key):
+        return key in self.db_${field.getRegularName()}_ \!
+            ${getIndexName(index)}_index
+    % endfor
+    
+    % endfor
+    % if obj.getKey() is not None:
+    def getPrimaryKey(self):
+        return self.${obj.getKey().getPrivateName()}
+    % else:
+
+    % endif
+
+% endfor
diff --git a/vistrails/db/bin/templates/sql.py.mako b/vistrails/db/bin/templates/sql.py.mako
new file mode 100644
index 0000000..f74ad9f
--- /dev/null
+++ b/vistrails/db/bin/templates/sql.py.mako
@@ -0,0 +1,306 @@
+<%text>###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+</%text>
+"""generated automatically by auto_dao.py"""
+
+from sql_dao import SQLDAO
+from vistrails.db.versions.${version_string}.domain import *
+
+% for obj in objs:
+class ${obj.getClassName()}SQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = '${obj.getName()}'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    ## get_sql_columns
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['${"', '".join(obj.getSQLColumns())}']
+        table = '${obj.getName()}'
+        whereMap = global_props
+        orderBy = '${obj.getKey().getName()}'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, \
+                                             lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            % for count, field in enumerate(obj.getSQLFields()):
+            ${field.getRegularName()} = \
+                self.convertFromDB(row[${count}], '${field.getPythonType()}', \
+                                       '${field.getType()}')
+            % if field.isGlobal():
+            global_props['${field.getGlobalName()}'] = \
+                self.convertToDB(${field.getRegularName()}, \
+                                      '${field.getPythonType()}', \
+                                      '${field.getType()}')
+            % endif
+            % endfor
+            
+            ${obj.getRegularName()} = ${obj.getClassName()} \!
+                (${',\n'.join('%s=%s' % p 
+                              for p in obj.getSQLConstructorPairs())})
+            % for field in obj.getSQLInverses():
+            ${obj.getRegularName()}.${field.getFieldName()} = \
+                ${field.getRegularName()}
+            % endfor
+            ${obj.getRegularName()}.is_dirty = False
+            res[('${obj.getRegularName()}', \
+                 ${obj.getKey().getRegularName()})] = ${obj.getRegularName()}
+        return res
+
+    ## get_sql_select
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['${"', '".join(obj.getSQLColumns())}']
+        table = '${obj.getName()}'
+        whereMap = global_props
+        orderBy = '${obj.getKey().getName()}'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, \
+                                             lock)
+
+    ## process_sql_columns
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            % for count, field in enumerate(obj.getSQLFields()):
+            ${field.getRegularName()} = \
+                self.convertFromDB(row[${count}], '${field.getPythonType()}', \
+                                       '${field.getType()}')
+            % if field.isGlobal():
+            global_props['${field.getGlobalName()}'] = \
+                self.convertToDB(${field.getRegularName()}, \
+                                      '${field.getPythonType()}', \
+                                      '${field.getType()}')
+            % endif
+            % endfor
+            
+            ${obj.getRegularName()} = ${obj.getClassName()} \!
+                (${',\n'.join('%s=%s' % p 
+                              for p in obj.getSQLConstructorPairs())})
+            % for field in obj.getSQLInverses():
+            ${obj.getRegularName()}.${field.getFieldName()} = \
+                ${field.getRegularName()}
+            % endfor
+            ${obj.getRegularName()}.is_dirty = False
+            res[('${obj.getRegularName()}', \
+                 ${obj.getKey().getRegularName()})] = ${obj.getRegularName()}
+        return res
+
+    ## from_sql_fast
+    def from_sql_fast(self, obj, all_objects):
+        % if len(obj.getSQLInverseRefs()) < 1:
+        pass
+        % endif
+        % for backRef in obj.getSQLInverseRefs():
+        <% cond = "if" %> \\
+        % if backRef.isChoice():
+        % for prop in backRef.properties:
+        ${cond} obj.${obj.getDiscriminatorProperty( \!
+                backRef.getDiscriminator()).getFieldName()} == \
+                '${prop.getReferencedObject().getRegularName()}':
+            p = all_objects[('${prop.getReferencedObject().getRegularName()}', \
+                                 obj.${backRef.getFieldName()})]
+            p.${obj.get_sql_referenced(prop.getReferencedObject())[0] \!
+                .getAppender()}(obj)
+        <% cond = "elif" %> \\
+        % endfor
+        % else:
+        if ('${backRef.getReferencedObject().getRegularName()}', \
+                obj.${backRef.getFieldName()}) in all_objects:
+            p = all_objects[( \!
+                    '${backRef.getReferencedObject().getRegularName()}', \
+                        obj.${backRef.getFieldName()})]
+            p.${obj.get_sql_referenced(backRef.getReferencedObject())[0]. \!
+                getAppender()}(obj)
+        % endif
+        % endfor
+        
+    ## set_sql_columns
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['${"', '".join(obj.getSQLColumns())}']
+        table = '${obj.getName()}'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.${obj.getKey().getFieldName()} is not None:
+            keyStr = self.convertToDB(obj.${obj.getKey().getFieldName()}, \
+                                          '${obj.getKey().getPythonType()}', \
+                                          '${obj.getKey().getType()}')
+            whereMap['${obj.getKey().getColumn()}'] = keyStr
+        columnMap = {}
+        % for field in obj.getSQLFields():
+        if hasattr(obj, '${field.getPythonName()}') and \
+                obj.${field.getPythonName()} is not None:
+            columnMap['${field.getColumn()}'] = \\\
+                self.convertToDB(obj.${field.getFieldName()}, \
+                                     '${field.getPythonType()}', \
+                                     '${field.getType()}')
+        % endfor
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        % if obj.getKey().isAutoInc():
+        if obj.${obj.getKey().getPythonName()} is None:
+            obj.${obj.getKey().getPythonName()} = lastId
+            keyStr = self.convertToDB(obj.${obj.getKey().getPythonName()}, \
+                                          '${obj.getKey().getPythonType()}', \
+                                          '${obj.getKey().getType()}')
+        % endif
+        % for prop in obj.getNormalSQLColumnsAndKey():
+        % if prop.isGlobal():
+        if hasattr(obj, '${prop.getPythonName()}') and \
+                obj.${prop.getPythonName()} is not None:
+            global_props['${prop.getGlobalName()}'] = \
+                self.convertToDB(obj.${prop.getPythonName()}, \
+                                 '${prop.getPythonType()}', \
+                                     '${prop.getType()}')
+        % endif
+        % endfor
+        
+    ## set_sql_command
+    ## returns the sql command for saving this object or none if already up to date
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['${"', '".join(obj.getSQLColumns())}']
+        table = '${obj.getName()}'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.${obj.getKey().getFieldName()} is not None:
+            keyStr = self.convertToDB(obj.${obj.getKey().getFieldName()}, \
+                                          '${obj.getKey().getPythonType()}', \
+                                          '${obj.getKey().getType()}')
+            whereMap['${obj.getKey().getColumn()}'] = keyStr
+        columnMap = {}
+        % for field in obj.getSQLFields():
+        if hasattr(obj, '${field.getPythonName()}') and \
+                obj.${field.getPythonName()} is not None:
+            columnMap['${field.getColumn()}'] = \\\
+                self.convertToDB(obj.${field.getFieldName()}, \
+                                     '${field.getPythonType()}', \
+                                     '${field.getType()}')
+        % endfor
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    ## set_sql_process
+    ## takes the generated id and updates the object
+    def set_sql_process(self, obj, global_props, lastId):
+        % if obj.getKey().isAutoInc():
+        if obj.${obj.getKey().getPythonName()} is None:
+            obj.${obj.getKey().getPythonName()} = lastId
+            keyStr = self.convertToDB(obj.${obj.getKey().getPythonName()}, \
+                                          '${obj.getKey().getPythonType()}', \
+                                          '${obj.getKey().getType()}')
+        % endif
+        % for prop in obj.getNormalSQLColumnsAndKey():
+        % if prop.isGlobal():
+        if hasattr(obj, '${prop.getPythonName()}') and \
+                obj.${prop.getPythonName()} is not None:
+            global_props['${prop.getGlobalName()}'] = \
+                self.convertToDB(obj.${prop.getPythonName()}, \
+                                 '${prop.getPythonType()}', \
+                                     '${prop.getType()}')
+        % endif
+        % endfor
+        pass
+
+    ## to_sql_fast
+    def to_sql_fast(self, obj, do_copy=True):
+        % if len(obj.getSQLReferences()) < 1:
+        pass
+        % endif
+        % for ref in obj.getSQLReferences():
+        % if ref.isPlural():
+        for child in obj.${ref.getIterator()}:
+        % else:
+        if obj.${ref.getFieldName()} is not None:
+            child = obj.${ref.getFieldName()}
+        % endif
+            % if obj.get_sql_referenced(ref.getReferencedObject(), True)[1]:
+            child.${ref.getReferencedObject().getDiscriminatorProperty( \!
+                    obj.get_sql_referenced(ref.getReferencedObject(), \
+                                               True)[0].getDiscriminator()). \!
+                    getFieldName()} = obj.vtType
+            child.${obj.get_sql_referenced(ref.getReferencedObject(), \
+                                               True)[0].getFieldName()} = \
+                        obj.db_id
+            % else:
+            child.${obj.get_sql_referenced(ref.getReferencedObject(), \
+                                               True)[0].getFieldName()} = \
+                        obj.db_id
+            % endif
+        % endfor
+        
+    ## delete_sql_column
+    def delete_sql_column(self, db, obj, global_props):
+        table = '${obj.getName()}'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.${obj.getKey().getFieldName()} is not None:
+            keyStr = self.convertToDB(obj.${obj.getKey().getFieldName()}, \
+                                          '${obj.getKey().getPythonType()}', \
+                                          '${obj.getKey().getType()}')
+            whereMap['${obj.getKey().getColumn()}'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+% endfor
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        % for obj in objs:
+        if '${obj.getRegularName()}' not in self:
+            self['${obj.getRegularName()}'] = \
+                ${obj.getClassName()}SQLDAOBase(self)
+        % endfor
diff --git a/vistrails/db/bin/templates/sql_delete.sql.mako b/vistrails/db/bin/templates/sql_delete.sql.mako
new file mode 100644
index 0000000..fcd9736
--- /dev/null
+++ b/vistrails/db/bin/templates/sql_delete.sql.mako
@@ -0,0 +1,42 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+DROP TABLE IF EXISTS `vistrails_version`;
+
+DROP TABLE IF EXISTS thumbnail;
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS ${', '.join(['%s' % obj.getName() for obj in objs])};
diff --git a/vistrails/db/bin/templates/sql_schema.sql.mako b/vistrails/db/bin/templates/sql_schema.sql.mako
new file mode 100644
index 0000000..0410f55
--- /dev/null
+++ b/vistrails/db/bin/templates/sql_schema.sql.mako
@@ -0,0 +1,77 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+CREATE TABLE `vistrails_version`(`version` char(16)) engine=InnoDB;
+INSERT INTO `vistrails_version`(`version`) VALUES ('${version}');
+
+CREATE TABLE thumbnail(
+    id int not null auto_increment primary key,
+    file_name varchar(255),
+    image_bytes mediumblob,
+    last_modified datetime
+) engine=InnoDB;
+
+-- generated automatically by auto_dao.py
+
+% for obj in objs:
+CREATE TABLE ${obj.getName()}(
+% for i, prop in enumerate(obj.getSQLProperties() + obj.getSQLChoices()):
+    % if prop.isChoice():
+    % if prop.isInverse():
+    % if i != len(obj.getSQLProperties() + obj.getSQLChoices()) - 1:    
+    ${prop.getSpec().getColumn()} ${prop.getSpec().getType()},
+    % else:
+    ${prop.getSpec().getColumn()} ${prop.getSpec().getType()}
+    % endif
+    % endif
+    % else:
+    % if i != len(obj.getSQLProperties() + obj.getSQLChoices()) - 1:
+    % if prop.isAutoInc():
+    ${prop.getColumn()} ${prop.getType()} not null auto_increment primary key,
+    % else:
+    ${prop.getColumn()} ${prop.getType()},
+    % endif
+    % else:
+    % if prop.isAutoInc():
+    ${prop.getColumn()} ${prop.getType()} not null auto_increment primary key
+    % else:
+    ${prop.getColumn()} ${prop.getType()}
+    % endif
+    % endif
+    % endif
+% endfor
+) engine=InnoDB;
+
+% endfor
\ No newline at end of file
diff --git a/vistrails/db/bin/templates/xml.py.mako b/vistrails/db/bin/templates/xml.py.mako
new file mode 100644
index 0000000..93a0e91
--- /dev/null
+++ b/vistrails/db/bin/templates/xml.py.mako
@@ -0,0 +1,228 @@
+<%text>###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+</%text>
+"""generated automatically by auto_dao.py"""
+
+from vistrails.core.system import get_elementtree_library
+ElementTree = get_elementtree_library()
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.${version_string}.domain import *
+
+% for obj in objs:
+class ${obj.getClassName()}XMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    ## define fromXML function
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != '${obj.getName()}':
+            return None
+        % if len(obj.getXMLAttributes()) > 0:
+        
+        # read attributes
+        % for prop in obj.getXMLAttributes():
+        data = node.get('${prop.getName()}', None)
+        ${prop.getRegularName()} = \
+            self.convertFromStr(data, '${prop.getPythonType()}')
+        % endfor
+        % endif
+        % if len(obj.getXMLElements()) + len(obj.getXMLChoices()) > 0:
+        
+        % for field in obj.getXMLElements() + obj.getXMLChoices():
+        % if not field.isPlural():
+        ${field.getRegularName()} = None
+        % else:
+        % if field.getPythonType() == 'hash':
+        ${field.getRegularName()} = {}
+        % else:
+        ${field.getRegularName()} = []
+        % endif
+        % endif
+        % endfor
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            <% cond = 'if' %> \\
+            % for field in obj.getXMLElements() + obj.getXMLChoices():
+            % if field.isChoice():
+            % for prop in field.getXMLProperties():
+            ${cond} child_tag == '${prop.getXMLPropertyName()}':
+                % if prop.isReference():
+                _data = self.getDao('${prop.getReference()}').fromXML(child)
+                % else:
+                _data = self.convertFromStr(child.text, \!
+                                                '${prop.getPythonType()}')
+                % endif
+                % if field.isPlural():
+                % if field.getPythonType() == 'hash':
+                % if not field.isReference():
+                raise Exception("Cannot generate hash for non-referenced field")
+                % endif
+                ${field.getRegularName()}[_data. \!
+                    ${field.getReferencedObject().getKey().getFieldName()}] = \
+                    _data
+                % else:
+                ${field.getRegularName()}.append(_data)
+                % endif
+                % else:
+                ${field.getRegularName()} = _data
+                % endif
+                <% cond = 'elif' %> \\
+            % endfor
+            % else:
+            ${cond} child_tag == '${field.getXMLPropertyName()}':
+                % if field.isReference():
+                _data = self.getDao('${field.getReference()}').fromXML(child)
+                % else:
+                _data = self.convertFromStr(child.text, \!
+                                                '${field.getPythonType()}')
+                % endif
+                % if field.isPlural():
+                % if field.getPythonType() == 'hash':
+                % if not field.isReference():
+                raise Exception("Cannot generate hash for non-referenced field")
+                % endif
+                ${field.getRegularName()}[_data. \!
+                    ${field.getReferencedObject().getKey().getFieldName()}] = \
+                    _data
+                % else:
+                ${field.getRegularName()}.append(_data)
+                % endif
+                % else:
+                ${field.getRegularName()} = _data
+                % endif
+                <% cond = 'elif' %> \\
+            % endif
+            % endfor
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        % endif
+        
+        obj = ${obj.getClassName()}( \!
+            ${',\n'.join(['%s=%s' % f for f in obj.getConstructorPairs()])})
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, ${obj.getRegularName()}, node=None):
+        ## if not ${obj.getRegularName()}.has_changes():
+        ##     return
+        if node is None:
+            node = ElementTree.Element('${obj.getName()}')
+        % if len(obj.getXMLAttributes()) > 0:
+        
+        # set attributes
+        % for prop in obj.getXMLAttributes():
+        node.set('${prop.getName()}', \!
+                     self.convertToStr(${obj.getRegularName()}. \!
+                                        ${prop.getFieldName()}, \
+                                            '${prop.getPythonType()}'))
+        % endfor
+        % endif
+        
+        % if len(obj.getXMLElements()) + len(obj.getXMLChoices()) > 0:
+        # set elements
+        % for field in obj.getXMLElements() + obj.getXMLChoices():
+        ${field.getRegularName()} = \
+            ${obj.getRegularName()}.${field.getFieldName()}
+        % if field.isReference():
+        % if field.isPlural():
+        for ${field.getSingleName()} in ${field.getRegularIterator()}:
+        % else:
+        if ${field.getSingleName()} is not None:
+        % endif
+            % if field.isChoice():
+            <% cond = 'if' %> \\
+            % for prop in field.getXMLProperties():
+            ${cond} ${field.getSingleName()}.vtType == '${prop.getReference()}':
+                % if prop.isReference():
+                childNode = ElementTree.SubElement(node, \
+                    '${prop.getReferencedObject().getName()}')
+                self.getDao('${prop.getReference()}').toXML( \!
+                    ${field.getSingleName()}, childNode)
+                % else:
+                childNode = ElementTree.SubElement(node, \
+                                                   '${prop.getXMLPropertyName()}')
+                childNode.text = self.convertToStr(${prop.getSingleName()}, \
+                                                   '${prop.getPythonType()}')
+                % endif
+            <% cond = 'elif' %> \\
+            % endfor
+            % else:
+            if (${field.getRegularName()} is not None) and (${field.getRegularName()} != ""):
+                childNode = ElementTree.SubElement(node, \
+                    '${field.getReferencedObject().getName()}')
+                self.getDao('${field.getReference()}').toXML( \!
+                    ${field.getSingleName()}, childNode)
+            % endif
+        % else:
+        if (${field.getRegularName()} is not None) and (${field.getRegularName()} != ""):
+            childNode = ElementTree.SubElement(node, '${field.getXMLPropertyName()}')
+            childNode.text = self.convertToStr(${field.getSingleName()}, \
+                                                   '${field.getPythonType()}')
+        % endif
+        % endfor
+        
+        % endif
+        return node
+
+% endfor
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        % for obj in objs:
+        if '${obj.getRegularName()}' not in self:
+            self['${obj.getRegularName()}'] = \
+                ${obj.getClassName()}XMLDAOBase(self)
+        % endfor
diff --git a/vistrails/db/bin/templates/xml_schema.xsd.mako b/vistrails/db/bin/templates/xml_schema.xsd.mako
new file mode 100644
index 0000000..c722630
--- /dev/null
+++ b/vistrails/db/bin/templates/xml_schema.xsd.mako
@@ -0,0 +1,103 @@
+<%
+def writeElement(prop):
+    if prop.isReference():
+        if prop.getName() == prop.getReferencedObject().getName():
+            return '<xs:element ref="%s" minOccurs="%s" maxOccurs="%s"/>' % \
+                (prop.getName(), prop.getMinOccurs(), prop.getMaxOccurs())
+        else:
+            return ('<xs:element name="%s" ref="%s" minOccurs="%s" ' + \
+                        'maxOccurs="%s"/>') % \
+                        (prop.getName(), prop.getReferencedObject().getName(), 
+                         prop.getMinOccurs(), prop.getMaxOccurs())
+
+    return '<xs:element name="%s" minOccurs="%s" maxOccurs="%s"/>' % \
+        (prop.getName(), prop.getMinOccurs(), prop.getMaxOccurs())
+%> \\
+<%text><!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+</%text>
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  % for obj in objs:
+  <${obj.getNodeType()} name="${obj.getName()}">
+    % if len(obj.getXMLElements()) + len(obj.getXMLAttributes()) + \
+	len(obj.getXMLChoices()) > 0:
+    <xs:complexType>
+      % if len(obj.getXMLElements()) > 0:
+      <xs:sequence>
+	% for prop in obj.getXMLElements():
+        ${writeElement(prop)}
+        % endfor
+	% for choice in obj.getXMLChoices():
+        <xs:choice>
+          % for prop in choice.getXMLProperties():
+          % if prop.hasSpec() and not prop.isInferred():
+          % if prop.getNodeType() == 'xs:attribute':
+          <xs:attribute name="${prop.getName()}" \
+              type="${prop.getAttributeType()}"${prop.getAttributeUseText()}/>
+          % elif prop.getNodeType() == 'xs:element':
+          ${writeElement(prop)}
+	  % endif
+	  % endif
+	  % endfor
+        </xs:choice>
+	% endfor
+      </xs:sequence>
+      % else:
+      % for choice in obj.getXMLChoices():
+      <xs:choice>
+        % for prop in choice.getXMLProperties():
+        % if prop.hasSpec() and not prop.isInferred():
+        % if prop.getNodeType() == 'xs:attribute':
+        <xs:attribute name="${prop.getName()}" \
+           type="${prop.getAttributeType()}"${prop.getAttributeUseText()}/>
+        % elif prop.getNodeType() == 'xs:element':
+        ${writeElement(prop)}
+        % endif
+        % endif
+        % endfor
+      </xs:choice>
+      % endfor
+      % endif
+      % for prop in obj.getXMLAttributes():
+      <xs:attribute name="${prop.getName()}" \
+         type="${prop.getAttributeType()}"${prop.getAttributeUseText()}/>
+      % endfor
+    </xs:complexType>
+    % endif
+  </${obj.getNodeType()}>
+  % endfor
+</xs:schema>
diff --git a/vistrails/db/bin/xml_gen_objects.py b/vistrails/db/bin/xml_gen_objects.py
new file mode 100644
index 0000000..d89aec0
--- /dev/null
+++ b/vistrails/db/bin/xml_gen_objects.py
@@ -0,0 +1,208 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen_objects import Object, Property, Choice
+
+XML_TYPE = 'xml'
+
+class XMLObject(Object):
+    @staticmethod
+    def convert(obj):
+        if XML_TYPE in obj.layouts:
+            obj.__class__ = XMLObject
+            for prop in obj.properties:
+                prop.__class__ = XMLProperty
+            for choice in obj.choices:
+                choice.__class__ = XMLChoice
+                for prop in choice.properties:
+                    prop.__class__ = XMLProperty
+
+    def getName(self):
+        try:
+            return self.layouts[XML_TYPE]['name']
+        except KeyError:
+            pass
+        return Object.getName(self)
+
+    def getNodeType(self):
+        try:
+            return self.layouts[XML_TYPE]['nodeType']
+        except KeyError:
+            pass
+        return 'xs:element'
+
+    def getXMLAttributes(self):
+        return [p for p in self.properties if p.hasSpec() and \
+                    not p.isInferred() and p.getNodeType() == 'xs:attribute']
+
+    def getXMLElements(self):
+        return [p for p in self.properties if p.hasSpec() and \
+                    not p.isInferred() and p.getNodeType() == 'xs:element']
+
+    def getXMLChoices(self):
+        return [c for c in self.choices if not c.isInverse() and \
+                    any([p.hasSpec() for p in c.properties])]
+
+    def isXMLChoice(self):
+        return False
+
+    def getXMLInferredProperties(self):
+        return [p for p in self.properties if p.isInferred()]
+
+    def getConstructorPairs(self):
+        return [(f.getRegularName(), f.getRegularName()) 
+                for f in self.getPythonFields() if f.hasSpec()]
+
+class XMLProperty(Property):
+    def hasSpec(self):
+        return self.specs.has_key(XML_TYPE)
+
+    def getName(self):
+        try:
+            return self.specs[XML_TYPE]['name']
+        except KeyError:
+            pass
+        return Property.getName(self)
+
+    def getNodeType(self):
+        try:
+            return self.specs[XML_TYPE]['nodeType']
+        except KeyError:
+            pass
+        return 'xs:attribute'
+
+    def getAttributeType(self):
+        try:
+            return self.specs[XML_TYPE]['type']
+        except KeyError:
+            pass
+        return 'xs:string'
+
+    def getAttributeUse(self):
+        try:
+            return self.specs[XML_TYPE]['use']
+        except KeyError:
+            pass
+        return None
+
+    def getAttributeUseText(self):
+        if self.getAttributeUse() is not None:
+            return ' use=%s' & self.getAttributeUse()
+        return ''
+
+    def getChoice(self):
+        try:
+            return self.specs[XML_TYPE]['choice']
+        except KeyError:
+            pass
+        return None
+
+    def isInferred(self):
+        try:
+            return self.specs[XML_TYPE]['inferred'] == 'true'
+        except KeyError:
+            pass
+        return False
+
+    def getXMLPropertyName(self):
+        if self.isReference():
+            refObj = self.getReferencedObject()
+            return refObj.getName()
+        return self.getName()
+
+    def getMinOccurs(self):
+        return '0'
+
+    def getMaxOccurs(self):
+        if self.isReference() and self.getMapping() != 'one-to-many':
+            return '1'
+        return 'unbounded'
+
+class XMLChoice(Choice):
+    def hasSpec(self):
+        return self.properties[0].hasSpec()
+
+    def getXMLProperties(self):
+        return [p for p in self.properties if p.hasSpec()]
+
+    def getXMLAttributes(self):
+        return [p for p in self.properties if p.hasSpec() and \
+                    not p.isInferred() and p.getNodeType() == 'xs:attribute']
+
+    def getXMLElements(self):
+        return [p for p in self.properties if p.hasSpec() and \
+                    not p.isInferred() and p.getNodeType() == 'xs:element']
+
+    def getXMLInferredProperties(self):
+        return [p for p in self.properties if p.isInferred()]
+
+    def isXMLChoice(self):
+        return True
+
+def convert(objects):
+    xml_objects = []
+    for obj in objects:
+        if XML_TYPE in obj.layouts:
+            XMLObject.convert(obj)
+            xml_objects.append(obj)
+    return xml_objects
+
+def convert_schema_order(objects, root_type):
+    ref_objects = []
+    cur_objects = []
+    for obj in objects:
+        if obj.getName() == root_type:
+            ref_objects = [obj]
+            cur_objects = [obj]
+            break
+    if len(ref_objects) < 1:
+        raise ValueError("Cannot find root %s" % root_type)
+    while len(cur_objects) > 0:
+        next_objects = []
+        for obj in cur_objects:
+            for prop in obj.getXMLElements():
+                if prop.isReference() and \
+                        prop.getReferencedObject() not in ref_objects and \
+                        prop.getReferencedObject() not in next_objects:
+                    next_objects.append(prop.getReferencedObject())
+            for choice in obj.getXMLChoices():
+                for prop in choice.getXMLElements():
+                    if prop.isReference() and \
+                            prop.getReferencedObject() not in ref_objects and \
+                            prop.getReferencedObject() not in next_objects:
+                        next_objects.append(prop.getReferencedObject())
+        ref_objects.extend(next_objects)
+        cur_objects = next_objects
+    return ref_objects
diff --git a/vistrails/db/domain/__init__.py b/vistrails/db/domain/__init__.py
new file mode 100644
index 0000000..947b0dc
--- /dev/null
+++ b/vistrails/db/domain/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v1_0_3.domain import *
diff --git a/vistrails/db/persistence/__init__.py b/vistrails/db/persistence/__init__.py
new file mode 100644
index 0000000..06d6c7d
--- /dev/null
+++ b/vistrails/db/persistence/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v1_0_3.persistence import *
diff --git a/vistrails/db/services/__init__.py b/vistrails/db/services/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/services/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/services/abstraction.py b/vistrails/db/services/abstraction.py
new file mode 100644
index 0000000..43a7b51
--- /dev/null
+++ b/vistrails/db/services/abstraction.py
@@ -0,0 +1,57 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBWorkflow
+from vistrails.db.services.action_chain import getActionChain, getCurrentOperationDict, \
+    getCurrentOperations
+
+def getNewObjId(operation):
+    if operation.vtType == 'change':
+        return operation.db_newObjId
+    return operation.db_objectId
+
+def update_id_scope(vistrail):
+    for action in vistrail.db_actions:
+        vistrail.idScope.updateBeginId('action', action.db_id+1)
+        for operation in action.db_operations:
+            vistrail.idScope.updateBeginId('operation', operation.db_id+1)
+            if operation.vtType == 'add' or operation.vtType == 'change':
+                # update ids of data
+                vistrail.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                if operation.db_data is None:
+                    if operation.vtType == 'change':
+                        operation.db_objectId = operation.db_oldObjId
+        for annotation in action.db_annotations:
+            vistrail.idScope.updateBeginId('annotation', annotation.db_id+1)
diff --git a/vistrails/db/services/action.py b/vistrails/db/services/action.py
new file mode 100644
index 0000000..f2acbf5
--- /dev/null
+++ b/vistrails/db/services/action.py
@@ -0,0 +1,174 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.services.action_chain import simplify_ops
+from vistrails.db.domain import DBAction, DBAdd, DBDelete, DBChange
+import copy
+
+def create_delete_op_chain(object, parent=(None, None)):
+    opChain = []
+    for (obj, parentType, parentId) in object.db_children(parent, 
+                                                          for_action=True):
+        op = DBDelete(id=-1,
+                      what=obj.vtType,
+                      objectId=obj.db_id,
+                      parentObjType=parentType,
+                      parentObjId=parentId,
+                      )
+        opChain.append(op)
+    return opChain
+
+def create_add_op_chain(object, parent=(None, None)):
+    opChain = []
+    object = copy.copy(object)
+    adds = object.db_children(parent, True, for_action=True)
+    adds.reverse()
+    for (obj, parentType, parentId) in adds:
+        op = DBAdd(id=-1,
+                   what=obj.vtType,
+                   objectId=obj.db_id,
+                   parentObjType=parentType,
+                   parentObjId=parentId,
+                   data=obj,
+                   )
+        opChain.append(op)
+    return opChain
+
+def create_change_op_chain(old_obj, new_obj, parent=(None,None)):
+    opChain = []
+    new_obj = copy.copy(new_obj)
+    deletes = old_obj.db_children(parent, for_action=True)
+    deletes.pop()
+    for (obj, parentType, parentId) in deletes:
+        op = DBDelete(id=-1,
+                      what=obj.vtType,
+                      objectId=obj.db_id,
+                      parentObjType=parentType,
+                      parentObjId=parentId,
+                      )
+        opChain.append(op)
+
+    adds = new_obj.db_children(parent, True, for_action=True)
+    (obj, parentType, parentId) = adds.pop()
+    op = DBChange(id=-1,
+                  what=obj.vtType,
+                  oldObjId=old_obj.db_id,
+                  newObjId=obj.db_id,
+                  parentObjType=parentType,
+                  parentObjId=parentId,
+                  data=new_obj,
+                  )
+    opChain.append(op)
+
+    adds.reverse()
+    for (obj, parentType, parentId) in adds:
+        op = DBAdd(id=-1,
+                   what=obj.vtType,
+                   objectId=obj.db_id,
+                   parentObjType=parentType,
+                   parentObjId=parentId,
+                   data=obj,
+                   )
+    return opChain
+
+def create_copy_op_chain(object, parent=(None,None), id_scope=None):
+    opChain = []
+    id_remap = {}
+    object = copy.copy(object)
+
+    adds = object.db_children(parent, True, for_action=True)
+    adds.reverse()
+    for (obj, parentType, parentId) in adds:
+        if parentId is not None:
+            parentId = id_remap[(parentType, parentId)]
+        new_id = id_scope.getNewId(obj.vtType)
+        id_remap[(obj.vtType, obj.db_id)] = new_id
+        obj.db_id = new_id
+        op = DBAdd(id=-1,
+                   what=obj.vtType,
+                   objectId=obj.db_id,
+                   parentObjType=parentType,
+                   parentObjId=parentId,
+                   data=obj,
+                   )
+        opChain.append(op)
+    return opChain
+    
+
+def create_action(action_list):
+    """create_action(action_list: list) -> DBAction
+    where action_list is a list of tuples
+     (
+      type, 
+      object, 
+      new_obj=None,
+      parent_type=None,
+      parent_id=None,
+    )
+    Example: create_action([('add', module1), ('delete', connection2)]
+
+    """
+    ops = []
+    for tuple in action_list:
+        if tuple[0] == 'add' and len(tuple) >= 2:
+            if len(tuple) >= 4:
+                ops.extend(create_add_op_chain(tuple[1], (tuple[2], tuple[3])))
+            else:
+                ops.extend(create_add_op_chain(tuple[1]))
+        elif tuple[0] == 'delete' and len(tuple) >= 2:
+            if len(tuple) >= 4:
+                ops.extend(create_delete_op_chain(tuple[1], 
+                                                  (tuple[2], tuple[3])))
+            else:
+                ops.extend(create_delete_op_chain(tuple[1]))
+        elif tuple[0] == 'change' and len(tuple) >= 3:
+            if len(tuple) >= 5:
+                ops.extend(create_change_op_chain(tuple[1], tuple[2],
+                                                  (tuple[3], tuple[4])))
+            else:
+                ops.extend(create_change_op_chain(tuple[1], tuple[2]))
+        else:
+            msg = "unable to interpret action tuple " + tuple.__str__()
+            raise ValueError(msg)
+    action = DBAction(id=-1,
+                      operations=ops)
+    return action
+
+def create_action_from_ops(ops, simplify=False):
+    if simplify:
+        ops = simplify_ops(ops)
+
+    action = DBAction(id=-1,
+                      operations=ops)
+    return action
diff --git a/vistrails/db/services/action_chain.py b/vistrails/db/services/action_chain.py
new file mode 100644
index 0000000..b5a23c1
--- /dev/null
+++ b/vistrails/db/services/action_chain.py
@@ -0,0 +1,128 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+def getActionChain(obj, version, start=0):
+    result = []
+    currentId = version
+    while currentId > start: #and currentId > 0:
+        action = obj.db_get_action_by_id(currentId)
+        result.append(action)
+        currentId = action.db_prevId
+    result.reverse()
+    return result
+
+def simplify_ops(ops):
+    addDict = {}
+    deleteDict = {}
+    for op_count, op in enumerate(ops):
+        op.db_id = -op_count - 1
+        if op.vtType == 'add':
+            addDict[(op.db_what, op.db_objectId)] = op
+        elif op.vtType == 'delete':
+            try:
+                del addDict[(op.db_what, op.db_objectId)]
+            except KeyError:
+                deleteDict[(op.db_what, op.db_objectId)] = op
+        elif op.vtType == 'change':
+            try:
+                k = addDict[(op.db_what, op.db_oldObjId)]
+            except KeyError:
+                addDict[(op.db_what, op.db_newObjId)] = op
+            else:
+                old_old_id = getOldObjId(k)
+                del addDict[(op.db_what, op.db_oldObjId)]
+                addDict[(op.db_what, op.db_newObjId)] = \
+                    DBChange(id=opCount,
+                             what=op.db_what,
+                             oldObjId=old_old_id,
+                             newObjId=op.db_newObjId,
+                             parentObjId=op.db_parentObjId,
+                             parentObjType=op.db_parentObjType,
+                             data=op.db_data,
+                             )
+
+    deletes = deleteDict.values()
+    deletes.sort(key=lambda x: -x.db_id) # faster than sort(lambda x, y: -cmp(x.db_id, y.db_id))
+    adds = addDict.values()
+    adds.sort(key=lambda x: -x.db_id) # faster than sort(lambda x, y: -cmp(x.db_id, y.db_id))
+    return deletes + adds
+
+def getCurrentOperationDict(actions, currentOperations=None):
+    if currentOperations is None:
+        currentOperations = {}
+
+    # note that this operation assumes unique ids for each operation's data
+    # any add adds to the dict, delete removes from the dict, and
+    # change replaces the current value in the dict
+    for action in actions:
+        for operation in action.db_operations:
+            operationvtType = operation.vtType
+            d = operation.__dict__
+            if operationvtType == 'add':
+                currentOperations[(d['_db_what'], 
+                                   d['_db_objectId'])] = \
+                                   operation
+            elif operationvtType == 'delete':
+                what = d['_db_what']
+                objectId = d['_db_objectId']
+                t = (what, objectId)
+                try:
+                    del currentOperations[t]
+                except KeyError:
+                    msg = "Illegal delete operation: %d" % d['_db_id']
+                    raise RuntimeError(msg)
+            elif operationvtType == 'change':
+                what = d['_db_what']
+                objectId = d['_db_oldObjId']
+                t = (what, objectId)
+                try:
+                    del currentOperations[t]
+                except KeyError:
+                    msg = "Illegal change operation: %d" % d['_db_id']
+                    raise RuntimeError(msg)
+                currentOperations[(what,
+                                   d['_db_newObjId'])] = operation
+            else:
+                msg = "Unrecognized operation '%s'" % operation.vtType
+                raise TypeError(msg)
+
+    return currentOperations
+
+def getCurrentOperations(actions):
+    # sort the values left in the hash and return the list
+    sortedOperations = getCurrentOperationDict(actions).values()
+    sortedOperations.sort(key=lambda x: x.db_id)
+    return sortedOperations
+
diff --git a/vistrails/db/services/io.py b/vistrails/db/services/io.py
new file mode 100644
index 0000000..d155cec
--- /dev/null
+++ b/vistrails/db/services/io.py
@@ -0,0 +1,1905 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from __future__ import with_statement
+
+from datetime import datetime
+from vistrails.core import debug
+from vistrails.core.bundles import py_import
+from vistrails.core.system import get_elementtree_library, temporary_directory,\
+     execute_cmdline, systemType, get_executable_path
+from vistrails.core.utils import Chdir
+from vistrails.core.log.log import Log
+from vistrails.core.mashup.mashup_trail import Mashuptrail
+from vistrails.core.modules.sub_module import get_cur_abs_namespace,\
+    parse_abstraction_name, read_vistrail_from_db
+
+import vistrails.core.requirements
+
+import sys
+import os
+import os.path
+import shutil
+import tempfile
+import copy
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.domain import DBVistrail, DBWorkflow, DBLog, DBAbstraction, DBGroup, \
+    DBRegistry, DBWorkflowExec, DBOpmGraph, DBProvDocument, DBAnnotation, \
+    DBMashuptrail
+import vistrails.db.services.abstraction
+import vistrails.db.services.log
+import vistrails.db.services.opm
+import vistrails.db.services.prov
+import vistrails.db.services.registry
+import vistrails.db.services.workflow
+import vistrails.db.services.vistrail
+from vistrails.db.versions import getVersionDAO, currentVersion, getVersionSchemaDir, \
+    translate_vistrail, translate_workflow, translate_log, translate_registry
+
+import unittest
+import vistrails.core.system
+
+ElementTree = get_elementtree_library()
+
+CONNECT_TIMEOUT = 15
+
+_db_lib = None
+def get_db_lib():
+    global _db_lib
+    if _db_lib is None:
+        MySQLdb = py_import('MySQLdb', {
+                'pip': 'mysql-python',
+                'linux-debian': 'python-mysqldb',
+                'linux-ubuntu': 'python-mysqldb',
+                'linux-fedora': 'MySQL-python'})
+        # import sqlite3
+        _db_lib = MySQLdb
+    return _db_lib
+def set_db_lib(lib):
+    global _db_lib
+    _db_lib = lib
+
+
+class SaveBundle(object):
+    """Transient bundle of objects to be saved or loaded.
+       The bundle type MUST be specified in the constructor; it should be
+       the the vtType of the primary object in the bundle. This parameter
+       identifies which object is the primary object when mutiple objects
+       are stored in the bundle.
+
+       Args is the (unordered) list of objects to be included in the bundle
+       (vistrail, workflow, log, registry, opm_graph).  Any args without a
+       'vtType' attribute are explicitly ignored (including any args=None).
+
+       As kwargs, you can specify 'abstractions=[]' or 'thumbnails=[]',
+       both of which should be a list of filenames as strings.  You can also
+       specify the other bundle objects as kwargs, but abstractions and
+       thumbnails cannot be args, since they are both lists, and there is no
+       vtType to differentiate between them.
+
+       As a final option, you can directly set the objects in the bundle,
+       self.vistrail = vistrail_object, self.thumbnails = thumbs_list, etc.,
+       before passing the SaveBundle to a locator.  Both abstractions and
+       thumbnails are intialized for convenience so that you can directly
+       append to them when using this step-by-step bundle creation method.
+
+    """
+
+    def __init__(self, bundle_type, *args, **kwargs):
+        self.bundle_type = bundle_type
+        self.vistrail = None
+        self.workflow = None
+        self.log = None
+        self.registry = None
+        self.opm_graph = None
+        self.abstractions = []
+        self.thumbnails = []
+        self.mashups = []
+        # Make all args into attrs using vtType as attr name
+        # This requires that attr names in this class match the vtTypes
+        # i.e. if arg's vtType is 'vistrail', self.vistrail = arg, etc...
+        for arg in args:
+            if hasattr(arg, 'vtType'):
+                setattr(self, arg.vtType, arg)
+        # Make all keyword args directly into attrs
+        for (k,v) in kwargs.iteritems():
+            setattr(self, k, v)
+
+    def get_db_objs(self):
+        """Gets a list containing only the DB* objects in the bundle"""
+        return [obj for obj in self.__dict__.itervalues() if obj is not None and not isinstance(obj, (list, basestring))]
+
+    def get_primary_obj(self):
+        """get_primary_obj() -> DB*
+           Gets the bundle's primary DB* object based on the bundle type.
+        """
+        return getattr(self, self.bundle_type)
+
+    def __copy__(self):
+        return SaveBundle.do_copy(self)
+    
+    def do_copy(self):
+        cp = SaveBundle(self.bundle_type)
+        cp.vistrail = copy.copy(self.vistrail)
+        cp.workflow = copy.copy(self.workflow)
+        cp.log = copy.copy(self.log)
+        cp.registry = copy.copy(self.registry)
+        cp.opm_graph = copy.copy(self.opm_graph)
+        for a in self.abstractions:
+            cp.abstractions.append(a)
+        
+        for t in self.thumbnails:
+            cp.thumbnails.append(t)
+        
+        return cp
+
+def format_prepared_statement(statement):
+    """format_prepared_statement(statement: str) -> str
+    Formats a prepared statement for compatibility with the currently
+    loaded database library's paramstyle.
+
+    Currently only supports 'qmark' and 'format' paramstyles.
+    May be expanded later to allow for more compatibility options
+    on input and output.  See PEP 249 for more info.
+
+    """
+    style = get_db_lib().paramstyle
+    if style == 'format':
+        return statement.replace("?", "%s")
+    elif style == 'qmark':
+        return statement.replace("%s", "?")
+    return statement
+
+def open_db_connection(config):
+
+    if config is None:
+        msg = "You need to provide valid config dictionary"
+        raise VistrailsDBException(msg)
+    if 'connect_timeout' not in config:
+        config['connect_timeout'] = CONNECT_TIMEOUT
+    try:
+        # FIXME allow config to be kwargs and args?
+        db_connection = get_db_lib().connect(**config)
+        #db_connection = get_db_lib().connect(config)
+        return db_connection
+    except get_db_lib().Error, e:
+        # should have a DB exception type
+        msg = "cannot open connection (%d: %s)" % (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+
+def close_db_connection(db_connection):
+    if db_connection is not None:
+        db_connection.close()
+
+def test_db_connection(config):
+    """testDBConnection(config: dict) -> None
+    Tests a connection raising an exception in case of error.
+    
+    """
+    #print "Testing config", config
+    if 'connect_timeout' not in config:
+        config['connect_timeout'] = CONNECT_TIMEOUT
+    try:
+        db_connection = get_db_lib().connect(**config)
+        close_db_connection(db_connection)
+    except get_db_lib().Error, e:
+        msg = "connection test failed (%d: %s)" % (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    except TypeError, e:
+        msg = "connection test failed (%s)" %str(e)
+        raise VistrailsDBException(msg)
+
+def ping_db_connection(db_connection):
+    """ping_db_connection(db_connection) -> boolean 
+    It will ping the database to check if the connection is alive.
+    It returns True if it is, False otherwise. 
+    This can be used for preventing the "MySQL Server has gone away" error. 
+    """
+    try:
+        db_connection.ping()
+    except get_db_lib().OperationalError:
+        return False
+    return True
+    
+def translate_to_tbl_name(obj_type):
+    map = {DBVistrail.vtType: 'vistrail',
+           DBWorkflow.vtType: 'workflow',
+           DBLog.vtType: 'log_tbl',
+           DBRegistry.vtType: 'registry',
+           DBAbstraction.vtType: 'abstraction',
+           DBMashuptrail.vtType: 'mashuptrail',
+           DBAnnotation.vtType: 'annotation',
+           }
+    return map[obj_type]
+
+def date_to_str(date):
+    return date.strftime('%Y-%m-%d %H:%M:%S')
+
+def get_db_object_list(config, obj_type):
+    
+    result = []    
+    db = open_db_connection(config)
+
+    #FIXME Create a DBGetVistrailListSQLDAOBase for this
+    # and maybe there's another way to build this query
+    command = """SELECT o.id, o.name, o.last_modified
+    FROM %s o ORDER BY o.name"""
+
+    # if it is a vistrail we need to remove abstractions
+    if obj_type == DBVistrail.vtType:
+        id_key = '__abstraction_uuid__'
+        command = """SELECT o.id, o.name, o.last_modified
+        FROM %s o"""
+        command += """ WHERE o.id not in ( SELECT o.id
+          FROM %s o, %s a
+          WHERE o.id = a.parent_id AND '%s' = a.parent_type AND a.akey = '%s')
+        ORDER BY o.name""" % (translate_to_tbl_name(obj_type),
+                              translate_to_tbl_name(DBAnnotation.vtType),
+                              translate_to_tbl_name(obj_type),
+                              id_key)
+#     command = """SELECT o.id, v.name, a.date, a.user
+#     FROM %s o, action a,
+#     (SELECT a.entity_id, MAX(a.date) as recent, a.user
+#     FROM action a
+#     GROUP BY entity_id) latest
+#     WHERE o.id = latest.entity_id 
+#     AND a.entity_id = o.id
+#     AND a.date = latest.recent 
+#     """ % obj_type
+
+    try:
+        c = db.cursor()
+        c.execute(command % translate_to_tbl_name(obj_type))
+        rows = c.fetchall()
+        result = rows
+        c.close()
+        close_db_connection(db)
+        
+    except get_db_lib().Error, e:
+        msg = "Couldn't get list of vistrails objects from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return result
+
+def get_db_object_modification_time(db_connection, obj_id, obj_type):
+    command = """
+    SELECT o.last_modified
+    FROM %s o
+    WHERE o.id = %s
+    """
+
+    try:
+        db_connection.begin()
+        c = db_connection.cursor()
+        c.execute(command % (translate_to_tbl_name(obj_type), obj_id))
+        db_connection.commit()
+        time = c.fetchall()[0][0]
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't get object modification time from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return time
+
+def get_db_object_version(db_connection, obj_id, obj_type):
+    command = """
+    SELECT o.version
+    FROM %s o
+    WHERE o.id = %s
+    """
+
+    try:
+        c = db_connection.cursor()
+        #print command % (translate_to_tbl_name(obj_type), obj_id)
+        c.execute(command % (translate_to_tbl_name(obj_type), obj_id))
+        version = c.fetchall()[0][0]
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't get object version from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return version
+
+def get_db_version(db_connection):
+    command = """
+    SELECT `version`
+    FROM `vistrails_version`
+    """
+
+    try:
+        c = db_connection.cursor()
+        c.execute(command)
+        version = c.fetchall()[0][0]
+        c.close()
+    except get_db_lib().Error, e:
+        # just return None if we hit an error
+        return None
+    return version
+
+def get_db_id_from_name(db_connection, obj_type, name):
+    command = """
+    SELECT o.id 
+    FROM %s o
+    WHERE o.name = '%s'
+    """
+
+    try:
+        c = db_connection.cursor()
+        c.execute(command % (translate_to_tbl_name(obj_type), name))
+        rows = c.fetchall()
+        if len(rows) != 1:
+            if len(rows) == 0:
+                c.close()
+                msg = "Cannot find object of type '%s' named '%s'" % \
+                    (obj_type, name)
+                raise VistrailsDBException(msg)
+            elif len(rows) > 1:
+                c.close()
+                msg = "Found more than one object of type '%s' named '%s'" % \
+                    (obj_type, name)
+                raise VistrailsDBException(msg)
+        else:
+            c.close()
+            return int(rows[0][0])
+    except get_db_lib().Error, e:
+        c.close()
+        msg = "Connection error when trying to get db id from name"
+        raise VistrailsDBException(msg)
+
+def get_db_abstraction_modification_time(db_connection, abstraction):
+    id_key = '__abstraction_vistrail_id__'
+    command = """
+    SELECT o.last_modified
+    FROM %s o, %s a
+    WHERE o.id = %s AND
+          o.id = a.parent_id AND
+          '%s' = a.parent_type AND
+          a.akey = '""" + id_key + """' AND
+          a.value = '%s'
+    """
+
+    if abstraction.db_has_annotation_with_key(id_key):
+        id_value = abstraction.db_get_annotation_by_key(id_key).db_value
+    else:
+        return None
+
+    try:
+        c = db_connection.cursor()
+        c.execute(command % (translate_to_tbl_name(DBVistrail.vtType), 
+                             translate_to_tbl_name(DBAnnotation.vtType),
+                             abstraction.db_id,
+                             translate_to_tbl_name(DBVistrail.vtType),
+                             id_value))
+        modtime = c.fetchall()[0][0]
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't get modification time from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return modtime
+
+def get_db_abstraction_ids_from_vistrail(db_connection, vt_id):
+    """ get_db_abstractions_from_vistrail(db_connection: DBConnection,
+                                          vt_id: int): List
+        Returns abstractions associated with a vistrail
+    """
+    
+    id_key = '__abstraction_vistrail_id__'
+    return get_db_ids_from_vistrail(db_connection, vt_id, id_key)
+
+def get_db_mashuptrail_ids_from_vistrail(db_connection, vt_id):
+    """ get_db_mashuptrail_ids_from_vistrail(db_connection: DBConnection,
+                                          vt_id: int): List
+        Returns mashuptrails associated with a vistrail
+    """
+    id_key = '__mashuptrail_vistrail_id__'
+    return get_db_ids_from_vistrail(db_connection, vt_id, id_key)
+    
+def get_db_ids_from_vistrail(db_connection, vt_id, id_key):
+    """ get_db_ids_from_vistrail(db_connection: DBConnection,
+                                 vt_id: int, id_key: str): List
+        Returns object ids associated with a vistrail by an annotation
+    """
+    command = """
+    SELECT a.parent_id FROM %s a
+    WHERE a.akey = '%s' AND a.value = '%s'"""
+
+    try:
+        c = db_connection.cursor()
+        c.execute(command%(translate_to_tbl_name(DBAnnotation.vtType), id_key, vt_id))
+        abs_ids = c.fetchall()
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't get object ids from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return [i[0] for i in abs_ids]
+
+def get_matching_abstraction_id(db_connection, abstraction):
+    last_action_id = -1
+    last_action = None
+    for action in abstraction.db_actions:
+        if action.db_id > last_action_id:
+            last_action_id = action.db_id
+            last_action = action
+
+    command = """
+    SELECT g.id 
+    FROM abstraction g, action a
+    WHERE g.name = '%s'
+    AND a.entity_type = 'abstraction'
+    AND a.entity_id = g.id
+    AND a.user = '%s'
+    AND a.date = '%s'
+    AND a.id = %s
+    """
+    
+    id = None
+    try:
+        c = db_connection.cursor()
+        c.execute(command % (abstraction.db_name,
+                             last_action.db_user,
+                             date_to_str(last_action.db_date),
+                             last_action.db_id))
+        result = c.fetchall()
+        c.close()
+        if len(result) > 0:
+            #print 'got result:', result
+            id = result[0][0]
+    except get_db_lib().Error, e:
+        msg = "Couldn't get object modification time from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return id
+
+def setup_db_tables(db_connection, version=None, old_version=None):
+    if version is None:
+        version = currentVersion
+    if old_version is None:
+        old_version = version
+    try:
+        def execute_file(c, f):
+            cmd = ""
+#             auto_inc_str = 'auto_increment'
+#             not_null_str = 'not null'
+#             engine_str = 'engine=InnoDB;'
+            for line in f:
+#                 if line.find(auto_inc_str) > 0:
+#                     num = line.find(auto_inc_str)
+#                     line = line[:num] + line[num+len(auto_inc_str):]
+#                 if line.find(not_null_str) > 0:
+#                     num = line.find(not_null_str)
+#                     line = line[:num] + line[num+len(not_null_str):]
+                line = line.strip()
+                if cmd or not line.startswith('--'):
+                    cmd += line
+                    ending = line
+                else:
+                    ending = None
+                if ending and ending[-1] == ';':
+                    # FIXME engine stuff switch for MySQLdb, sqlite3
+                    cmd = cmd.rstrip()
+#                     if cmd.endswith(engine_str):
+#                         cmd = cmd[:-len(engine_str)] + ';'
+                    #print cmd
+                    c.execute(cmd)
+                    cmd = ""
+
+        # delete tables
+        c = db_connection.cursor()
+        schemaDir = getVersionSchemaDir(old_version)
+        f = open(os.path.join(schemaDir, 'vistrails_drop.sql'))
+        execute_file(c, f)
+#         db_script = f.read()
+#         c.execute(db_script)
+        c.close()
+        f.close()
+
+        # create tables        
+        c = db_connection.cursor()
+        schemaDir = getVersionSchemaDir(version)
+        f = open(os.path.join(schemaDir, 'vistrails.sql'))
+        execute_file(c, f)
+#         db_script = f.read()
+#         c.execute(db_script)
+        f.close()
+        c.close()
+    except get_db_lib().Error, e:
+        raise VistrailsDBException("unable to create tables: " + str(e))
+
+##############################################################################
+# General I/O
+
+def open_from_xml(filename, type):
+    if type == DBVistrail.vtType:
+        return open_vistrail_from_xml(filename)
+    elif type == DBWorkflow.vtType:
+        return open_workflow_from_xml(filename)
+    elif type == DBLog.vtType:
+        return open_log_from_xml(filename)
+    elif type == DBRegistry.vtType:
+        return open_registry_from_xml(filename)
+    else:
+        raise VistrailsDBException("cannot open object of type "
+                                   "'%s' from xml" % type)
+
+def save_to_xml(obj, filename, version=None):
+    if obj.vtType == DBVistrail.vtType:
+        return save_vistrail_to_xml(obj, filename, version)
+    elif obj.vtType == DBWorkflow.vtType:
+        return save_workflow_to_xml(obj, filename, version)
+    elif obj.vtType == DBLog.vtType:
+        return save_log_to_xml(obj, filename, version)
+    elif obj.vtType == DBRegistry.vtType:
+        return save_registry_to_xml(obj, filename, version)
+    elif obj.vtType == DBOpmGraph.vtType:
+        return save_opm_to_xml(obj, filename, version)
+    elif obj.vtType == DBProvDocument.vtType:
+        return save_prov_to_xml(obj, filename, version)
+    else:
+        raise VistrailsDBException("cannot save object of type "
+                                   "'%s' to xml" % type)
+
+def open_bundle_from_zip_xml(bundle_type, filename):
+    if bundle_type == DBVistrail.vtType:
+        return open_vistrail_bundle_from_zip_xml(filename)
+    else:
+        raise VistrailsDBException("cannot open bundle of type '%s' from zip" %\
+                                       bundle_type)
+
+def save_bundle_to_zip_xml(save_bundle, filename, tmp_dir=None, version=None):
+    bundle_type = save_bundle.bundle_type
+    if bundle_type == DBVistrail.vtType:
+        return save_vistrail_bundle_to_zip_xml(save_bundle, filename, tmp_dir, version)
+    elif bundle_type == DBLog.vtType:
+        return save_log_bundle_to_xml(save_bundle, filename, version)
+    elif bundle_type == DBWorkflow.vtType:
+        return save_workflow_bundle_to_xml(save_bundle, filename, version)
+    elif bundle_type == DBRegistry.vtType:
+        return save_registry_bundle_to_xml(save_bundle, filename, version)
+    else:
+        raise VistrailsDBException("cannot save bundle of type '%s' to zip" % \
+                                       bundle_type)
+
+def open_bundle_from_db(bundle_type, connection, primary_obj_id, tmp_dir=None):
+    if bundle_type == DBVistrail.vtType:
+        return open_vistrail_bundle_from_db(connection, primary_obj_id, tmp_dir)
+    else:
+        raise VistrailsDBException("cannot open bundle of type '%s' from db" %\
+                                       bundle_type)
+
+def save_bundle_to_db(save_bundle, connection, do_copy=False, version=None):
+    bundle_type = save_bundle.bundle_type
+    if bundle_type == DBVistrail.vtType:
+        return save_vistrail_bundle_to_db(save_bundle, connection, do_copy, version)
+    elif bundle_type == DBLog.vtType:
+        return save_log_bundle_to_db(save_bundle, connection, do_copy, version)
+    elif bundle_type == DBWorkflow.vtType:
+        return save_workflow_bundle_to_db(save_bundle, connection, do_copy, version)
+    elif bundle_type == DBRegistry.vtType:
+        return save_registry_bundle_to_db(save_bundle, connection, do_copy, version)
+    else:
+        raise VistrailsDBException("cannot save bundle of type '%s' to db" % \
+                                       bundle_type)
+
+def open_from_db(db_connection, type, obj_id):
+    if type == DBVistrail.vtType:
+        return open_vistrail_from_db(db_connection, obj_id)
+    elif type == DBWorkflow.vtType:
+        return open_workflow_from_db(db_connection, obj_id)
+    elif type == DBLog.vtType:
+        return open_log_from_db(db_connection, obj_id)
+    elif type == DBRegistry.vtType:
+        return open_registry_from_db(db_connection, obj_id)
+    else:
+        raise VistrailsDBException("cannot open object of type '%s' from db" % \
+                                       type)
+
+def save_to_db(obj, db_connection, do_copy=False):
+    if obj.vtType == DBVistrail.vtType:
+        return save_vistrail_to_db(obj, db_connection, do_copy)
+    elif obj.vtType == DBWorkflow.vtType:
+        return save_workflow_to_db(obj, db_connection, do_copy)
+    elif obj.vtType == DBLog.vtType:
+        return save_log_to_db(obj, db_connection, do_copy)
+    elif obj.vtType == DBRegistry.vtType:
+        return save_registry_to_db(obj, db_connection, do_copy)
+    else:
+        raise VistrailsDBException("cannot save object of type '%s' to db" % \
+                                       type)
+
+def delete_from_db(db_connection, type, obj_id):
+    if type in [DBVistrail.vtType, DBWorkflow.vtType, DBLog.vtType,
+                DBRegistry.vtType]:
+        return delete_entity_from_db(db_connection, type, obj_id)
+
+def close_zip_xml(temp_dir):
+    """close_zip_xml(temp_dir: string) -> None
+    Removes any temporary files for a vistrails file
+
+    temp_dir: directory storing any persistent files
+    """
+    if temp_dir is None:
+        return
+    if not os.path.isdir(temp_dir):
+        if os.path.isfile(temp_dir):
+            os.remove(temp_dir)
+
+        # cleanup has already happened
+        return
+    try:
+        for root, dirs, files in os.walk(temp_dir, topdown=False):
+            for name in files:
+                os.remove(os.path.join(root, name))
+            for name in dirs:
+                os.rmdir(os.path.join(root, name))
+        os.rmdir(temp_dir)
+    except OSError, e:
+        raise VistrailsDBException("Can't remove %s: %s" % (temp_dir, str(e)))
+
+def serialize(object):
+    daoList = getVersionDAO(currentVersion)
+    return daoList.serialize(object)
+
+def unserialize(str, obj_type):
+    daoList = getVersionDAO(currentVersion)
+    return daoList.unserialize(str, obj_type)
+ 
+##############################################################################
+# Vistrail I/O
+
+def open_vistrail_from_xml(filename):
+    """open_vistrail_from_xml(filename) -> Vistrail"""
+    tree = ElementTree.parse(filename)
+    version = get_version_for_xml(tree.getroot())
+    try:
+        daoList = getVersionDAO(version)
+        vistrail = daoList.open_from_xml(filename, DBVistrail.vtType, tree)
+        vistrail = translate_vistrail(vistrail, version)
+        vistrails.db.services.vistrail.update_id_scope(vistrail)
+    except VistrailsDBException, e:
+        if str(e).startswith('VistrailsDBException: Cannot find DAO for'):
+            msg = "This vistrail was created by a newer version of VisTrails "
+            msg += "and cannot be opened."
+            raise VistrailsDBException(msg)
+        raise e
+        
+    return vistrail
+
+def open_vistrail_bundle_from_zip_xml(filename):
+    """open_vistrail_bundle_from_zip_xml(filename) -> SaveBundle
+    Open a vistrail from a zip compressed format.
+    It expects that the vistrail file inside archive has name 'vistrail',
+    the log inside archive has name 'log',
+    abstractions inside archive have prefix 'abstraction_',
+    and thumbnails inside archive are '.png' files in 'thumbs' dir
+
+    """
+
+    vistrails.core.requirements.require_executable('unzip')
+
+    vt_save_dir = tempfile.mkdtemp(prefix='vt_save')
+    output = []
+    cmdline = ['unzip', '-q','-o','-d', vt_save_dir, filename]
+    result = execute_cmdline(cmdline, output)
+
+    if result != 0 and len(output) != 0:
+        raise VistrailsDBException("Unzip of '%s' failed" % filename)
+
+    vistrail = None
+    log = None
+    log_fname = None
+    abstraction_files = []
+    unknown_files = []
+    thumbnail_files = []
+    mashups = []
+    try:
+        for root, dirs, files in os.walk(vt_save_dir):
+            for fname in files:
+                if fname == 'vistrail' and root == vt_save_dir:
+                    vistrail = open_vistrail_from_xml(os.path.join(root, fname))
+                elif fname == 'log' and root == vt_save_dir:
+                    # FIXME read log to get execution info
+                    # right now, just ignore the file
+                    log = None 
+                    log_fname = os.path.join(root, fname)
+                    # log = open_log_from_xml(os.path.join(root, fname))
+                    # objs.append(DBLog.vtType, log)
+                elif fname.startswith('abstraction_'):
+                    abstraction_file = os.path.join(root, fname)
+                    abstraction_files.append(abstraction_file)
+                elif (fname.endswith('.png') and
+                      root == os.path.join(vt_save_dir,'thumbs')):
+                    thumbnail_file = os.path.join(root, fname)
+                    thumbnail_files.append(thumbnail_file)
+                elif root == os.path.join(vt_save_dir,'mashups'):
+                    mashup_file = os.path.join(root, fname)
+                    mashup = open_mashuptrail_from_xml(mashup_file)
+                    mashups.append(mashup)
+                else:
+                    handled = False
+                    from vistrails.core.packagemanager import get_package_manager
+                    pm = get_package_manager()
+                    for package in pm.enabled_package_list():
+                        if package.can_handle_vt_file(fname):
+                            handled = True
+                            continue
+                    if not handled:
+                        unknown_files.append(os.path.join(root, fname))
+    except OSError, e:
+        raise VistrailsDBException("Error when reading vt file")
+    if len(unknown_files) > 0:
+        raise VistrailsDBException("Unknown files in vt file: %s" % \
+                                       unknown_files)
+    if vistrail is None:
+        raise VistrailsDBException("vt file does not contain vistrail")
+    vistrail.db_log_filename = log_fname
+
+    # call package hooks
+    from vistrails.core.packagemanager import get_package_manager
+    pm = get_package_manager()
+    for package in pm.enabled_package_list():
+        package.loadVistrailFileHook(vistrail, vt_save_dir)
+
+    save_bundle = SaveBundle(DBVistrail.vtType, vistrail, log, 
+                             abstractions=abstraction_files, 
+                             thumbnails=thumbnail_files, mashups=mashups)
+    return (save_bundle, vt_save_dir)
+
+def open_vistrail_bundle_from_db(db_connection, vistrail_id, tmp_dir=None):
+    """open_vistrail_bundle_from_db(db_connection, id: long, tmp_dir: str) -> SaveBundle
+       Open a vistrail bundle from the database.
+
+    """
+    vt_abs_dir = tempfile.mkdtemp(prefix='vt_abs')
+    vistrail = open_vistrail_from_db(db_connection, vistrail_id)
+    # FIXME open log from db
+    log = None
+    # open abstractions from db
+    abstractions = []
+    try:
+        for abs_id in get_db_abstraction_ids_from_vistrail(db_connection, vistrail.db_id):
+            abs = read_vistrail_from_db(db_connection, abs_id, vistrail.db_version)
+            abs_fname = '%s%s(%s)%s' % ('abstraction_', abs.db_name, 
+                                      get_cur_abs_namespace(abs), '.xml')
+            fname = os.path.join(vt_abs_dir, abs_fname)
+            save_vistrail_to_xml(abs, fname)
+            abstractions.append(fname)
+    except Exception, e:
+        import traceback
+        debug.critical('Could not load abstraction from database: %s' % str(e),
+                                              traceback.format_exc())
+    # open mashuptrails from db
+    mashuptrails = []
+    try:
+        for mashup_id in get_db_mashuptrail_ids_from_vistrail(db_connection, vistrail.db_id):
+            mashup = open_mashuptrail_from_db(db_connection, mashup_id)
+            mashuptrails.append(mashup)
+    except Exception, e:
+        import traceback
+        debug.critical('Could not load mashuptrail from database: %s' % str(e),
+                                              traceback.format_exc())
+    thumbnails = open_thumbnails_from_db(db_connection, DBVistrail.vtType,
+                                         vistrail_id, tmp_dir)
+    return SaveBundle(DBVistrail.vtType, vistrail, log,
+                      abstractions=abstractions, thumbnails=thumbnails,
+                      mashups=mashuptrails)
+
+def open_vistrail_from_db(db_connection, id, lock=False, version=None):
+    """open_vistrail_from_db(db_connection, id : long, lock: bool, 
+                             version: str) 
+         -> DBVistrail 
+
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_object_version(db_connection, id, DBVistrail.vtType)
+    dao_list = getVersionDAO(version)
+    vistrail = \
+        dao_list.open_from_db(db_connection, DBVistrail.vtType, id, lock)
+    vistrail = translate_vistrail(vistrail, version)
+    for db_action in vistrail.db_get_actions():
+        db_action.db_operations.sort(key=lambda x: x.db_id)
+    vistrails.db.services.vistrail.update_id_scope(vistrail)
+    return vistrail
+
+def save_vistrail_to_xml(vistrail, filename, version=None):
+    tags = {'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            'xsi:schemaLocation': 'http://www.vistrails.org/vistrail.xsd'
+            }
+    if version is None:
+        version = currentVersion
+    if not vistrail.db_version:
+        vistrail.db_version = currentVersion
+
+    # current_action holds the current action id 
+    # (used by the controller--write_vistrail)
+    current_action = 0L
+    if hasattr(vistrail, 'db_currentVersion'):
+        current_action = vistrail.db_currentVersion
+
+    vistrail = translate_vistrail(vistrail, vistrail.db_version, version)
+
+    daoList = getVersionDAO(version)        
+    daoList.save_to_xml(vistrail, filename, tags, version)
+    vistrail = translate_vistrail(vistrail, version)
+    vistrail.db_currentVersion = current_action
+    return vistrail
+
+def save_vistrail_bundle_to_zip_xml(save_bundle, filename, vt_save_dir=None, version=None):
+    """save_vistrail_bundle_to_zip_xml(save_bundle: SaveBundle, filename: str,
+                                vt_save_dir: str, version: str)
+         -> (save_bundle: SaveBundle, vt_save_dir: str)
+
+    save_bundle: a SaveBundle object containing vistrail data to save
+    filename: filename to save to
+    vt_save_dir: directory storing any previous files
+
+    Generates a zip compressed version of vistrail.
+    It raises an Exception if there was an error.
+    
+    """
+
+    vistrails.core.requirements.require_executable('zip')
+
+    if save_bundle.vistrail is None:
+        raise VistrailsDBException('save_vistrail_bundle_to_zip_xml failed, '
+                                   'bundle does not contain a vistrail')
+    if not vt_save_dir:
+        vt_save_dir = tempfile.mkdtemp(prefix='vt_save')
+    # abstractions are saved in the root of the zip file
+    # abstraction_dir = os.path.join(vt_save_dir, 'abstractions')
+    #thumbnails and mashups have their own folder
+    thumbnail_dir = os.path.join(vt_save_dir, 'thumbs')
+    mashup_dir = os.path.join(vt_save_dir, 'mashups')
+    
+    # Save Vistrail
+    xml_fname = os.path.join(vt_save_dir, 'vistrail')
+    save_vistrail_to_xml(save_bundle.vistrail, xml_fname, version)
+
+    # Save Log
+    if save_bundle.vistrail.db_log_filename is not None:
+        xml_fname = os.path.join(vt_save_dir, 'log')
+        if save_bundle.vistrail.db_log_filename != xml_fname:
+            shutil.copyfile(save_bundle.vistrail.db_log_filename, xml_fname)
+            save_bundle.vistrail.db_log_filename = xml_fname
+
+    if save_bundle.log is not None:
+        xml_fname = os.path.join(vt_save_dir, 'log')
+        save_log_to_xml(save_bundle.log, xml_fname, version, True)
+        save_bundle.vistrail.db_log_filename = xml_fname
+
+    # Save Abstractions
+    saved_abstractions = []
+    for obj in save_bundle.abstractions:
+        if isinstance(obj, basestring):
+            # FIXME we should have an abstraction directory here instead
+            # of the abstraction_ prefix...
+            if not os.path.basename(obj).startswith('abstraction_'):
+                obj_fname = 'abstraction_' + os.path.basename(obj)
+            else:
+                obj_fname = os.path.basename(obj)
+            # xml_fname = os.path.join(abstraction_dir, obj_fname)
+            xml_fname = os.path.join(vt_save_dir, obj_fname)
+            saved_abstractions.append(xml_fname)
+            # if not os.path.exists(abstraction_dir):
+            #     os.mkdir(abstraction_dir)
+            # print "obj:", obj
+            # print "xml_fname:", xml_fname
+            if obj != xml_fname:
+                # print 'copying %s -> %s' % (obj, xml_fname)
+                try:
+                    shutil.copyfile(obj, xml_fname)
+                except Exception, e:
+                    saved_abstractions.pop()
+                    debug.critical('copying %s -> %s failed: %s' % \
+                                       (obj, xml_fname, str(e)))
+        else:
+            raise VistrailsDBException('save_vistrail_bundle_to_zip_xml failed, '
+                                       'abstraction list entry must be a filename')
+    # Save Thumbnails
+    saved_thumbnails = []
+    for obj in save_bundle.thumbnails:
+        if isinstance(obj, basestring):
+            obj_fname = os.path.basename(obj)
+            png_fname = os.path.join(thumbnail_dir, obj_fname)
+            saved_thumbnails.append(png_fname)
+            if not os.path.exists(thumbnail_dir):
+                os.mkdir(thumbnail_dir)
+            
+            try:
+                shutil.copyfile(obj, png_fname)
+            except shutil.Error, e:
+                #files are the same no need to show warning
+                saved_thumbnails.pop()
+            except IOError, e2:
+                saved_thumbnails.pop()
+                debug.warning('copying thumbnail %s -> %s failed: %s' % \
+                              (obj, png_fname, str(e2)))
+        else:
+            raise VistrailsDBException('save_vistrail_bundle_to_zip_xml failed, '
+                                       'thumbnail list entry must be a filename')
+    # Save Mashups
+    #print " mashups:"
+    if len(save_bundle.mashups) > 0 and not os.path.exists(mashup_dir):
+        os.mkdir(mashup_dir)
+    for obj in save_bundle.mashups:
+        #print "  ", obj
+        try:
+            xml_fname = os.path.join(mashup_dir, str(obj.id))
+            save_mashuptrail_to_xml(obj, xml_fname)
+        except Exception, e:
+            raise VistrailsDBException('save_vistrail_bundle_to_zip_xml failed, '
+                                       'when saving mashup: %s'%str(e))
+
+    # call package hooks
+    # it will fail if package manager has not been constructed yet
+    try:
+        from vistrails.core.packagemanager import get_package_manager
+        pm = get_package_manager()
+        for package in pm.enabled_package_list():
+            package.saveVistrailFileHook(save_bundle.vistrail, vt_save_dir)
+    except Exception, e:
+        debug.warning("Could not call package hooks", str(e))
+    tmp_zip_dir = tempfile.mkdtemp(prefix='vt_zip')
+    tmp_zip_file = os.path.join(tmp_zip_dir, "vt.zip")
+    output = []
+    rel_vt_save_dir = os.path.split(vt_save_dir)[1]
+
+    # on windows, we assume zip.exe is in the current directory when
+    # running from the binary install
+    zipcmd = 'zip'
+    if systemType in ['Windows', 'Microsoft']:
+        zipcmd = get_executable_path('zip.exe')
+        if not zipcmd or not os.path.exists(zipcmd):
+            zipcmd = 'zip.exe' #assume zip is in path
+    cmdline = [zipcmd, '-r', '-q', tmp_zip_file, '.']
+    try:
+        #if we want that directories are also stored in the zip file
+        # we need to run from the vt directory
+        with Chdir(vt_save_dir):
+            result = execute_cmdline(cmdline,output)
+        #print result, output
+        if result != 0 or len(output) != 0:
+            for line in output:
+                if line.find('deflated') == -1:
+                    raise VistrailsDBException(" ".join(output))
+        shutil.copyfile(tmp_zip_file, filename)
+    finally:
+        os.unlink(tmp_zip_file)
+        os.rmdir(tmp_zip_dir)
+    save_bundle = SaveBundle(save_bundle.bundle_type, save_bundle.vistrail, save_bundle.log, thumbnails=saved_thumbnails, abstractions=saved_abstractions)
+    return (save_bundle, vt_save_dir)
+
+def save_vistrail_bundle_to_db(save_bundle, db_connection, do_copy=False, version=None):
+    if save_bundle.vistrail is None:
+        raise VistrailsDBException('save_vistrail_bundle_to_db failed, '
+                                   'bundle does not contain a vistrail')
+    vistrail = save_vistrail_to_db(save_bundle.vistrail, db_connection, do_copy, version)
+    log = None
+    if save_bundle.vistrail.db_log_filename is not None:
+        if save_bundle.log is not None:
+            log = merge_logs(save_bundle.log,
+                             save_bundle.vistrail.db_log_filename)
+        else:
+            log = open_log_from_xml(save_bundle.vistrail.db_log_filename, True)
+    elif save_bundle.log is not None:
+        log = save_bundle.log
+    if log is not None:
+        # Set foreign key 'vistrail_id' for the log to point at its vistrail
+        log.db_vistrail_id = vistrail.db_id
+        log = save_log_to_db(log, db_connection, do_copy, version)
+    save_abstractions_to_db(save_bundle.abstractions, vistrail.db_id, db_connection, do_copy)
+    save_mashuptrails_to_db(save_bundle.mashups, vistrail.db_id, db_connection, do_copy)
+    save_thumbnails_to_db(save_bundle.thumbnails, db_connection)
+    return SaveBundle(DBVistrail.vtType, vistrail, log, abstractions=list(save_bundle.abstractions), thumbnails=list(save_bundle.thumbnails))
+
+def save_vistrail_to_db(vistrail, db_connection, do_copy=False, version=None):
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_version(db_connection)
+        if version is None:
+            version = currentVersion
+    if not vistrail.db_version:
+        vistrail.db_version = currentVersion
+
+    dao_list = getVersionDAO(version)
+
+    # db_connection.begin()
+    
+    # current_action holds the current action id 
+    # (used by the controller--write_vistrail)
+    current_action = 0L
+    if hasattr(vistrail, 'db_currentVersion'):
+        current_action = vistrail.db_currentVersion
+
+    if not do_copy and vistrail.db_last_modified is not None:
+        new_time = get_db_object_modification_time(db_connection, 
+                                                   vistrail.db_id,
+                                                   DBVistrail.vtType)
+        if new_time > vistrail.db_last_modified:
+            # need synchronization
+            old_vistrail = open_vistrail_from_db(db_connection,
+                                                 vistrail.db_id,
+                                                 True, version)
+            old_vistrail = translate_vistrail(old_vistrail, version)
+            # the "old" one is modified and changes integrated
+            current_action = \
+                vistrails.db.services.vistrail.synchronize(old_vistrail, vistrail, 
+                                                 current_action)
+            vistrail = old_vistrail
+    vistrail.db_last_modified = get_current_time(db_connection)
+
+    vistrail = translate_vistrail(vistrail, vistrail.db_version, version)
+    # get saved workflows from db
+    workflowIds = get_saved_workflows(vistrail, db_connection)
+    #print "Workflows already saved:", workflowIds
+    dao_list.save_to_db(db_connection, vistrail, do_copy)
+    vistrail = translate_vistrail(vistrail, version)
+    vistrail.db_currentVersion = current_action
+
+    # update all missing tagged workflows
+    tagMap = {}
+    for annotation in vistrail.db_actionAnnotations:
+        if annotation.db_key == '__tag__':
+            tagMap[annotation.db_action_id] = annotation.db_value
+    wfToSave = []
+    for id, name in tagMap.iteritems():
+        if id not in workflowIds:
+            #print "creating workflow", vistrail.db_id, id, name,
+            workflow = vistrails.db.services.vistrail.materializeWorkflow(vistrail, id)
+            workflow.db_id = None
+            workflow.db_vistrail_id = vistrail.db_id
+            workflow.db_parent_id = id
+            workflow.db_group = id
+            workflow.db_last_modified=vistrail.db_get_action_by_id(id).db_date
+            workflow.db_name = name
+            workflow = translate_workflow(workflow, currentVersion, version)
+            wfToSave.append(workflow)
+            #print "done"
+    if wfToSave:
+        dao_list.save_many_to_db(db_connection, wfToSave, True)
+    db_connection.commit()
+    return vistrail
+
+##############################################################################
+# Workflow I/O
+
+def open_workflow_from_xml(filename):
+    """open_workflow_from_xml(filename) -> DBWorkflow"""
+    tree = ElementTree.parse(filename)
+    version = get_version_for_xml(tree.getroot())
+    daoList = getVersionDAO(version)
+    workflow = daoList.open_from_xml(filename, DBWorkflow.vtType, tree)
+    workflow = translate_workflow(workflow, version)
+    vistrails.db.services.workflow.update_id_scope(workflow)
+    return workflow
+
+def open_workflow_from_db(db_connection, id, lock=False, version=None):
+    """open_workflow_from_db(db_connection, id : long: lock: bool, 
+                             version: str) 
+         -> DBWorkflow 
+    
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_object_version(db_connection, id, DBWorkflow.vtType)
+    dao_list = getVersionDAO(version)
+    workflow = \
+        dao_list.open_from_db(db_connection, DBWorkflow.vtType, id, lock)
+    workflow = translate_workflow(workflow, version)
+    return workflow
+    
+def save_workflow_to_xml(workflow, filename, version=None):
+    tags = {'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            'xsi:schemaLocation': 'http://www.vistrails.org/workflow.xsd'
+            }
+    if version is None:
+        version = currentVersion
+    if not workflow.db_version:
+        workflow.db_version = currentVersion
+    workflow = translate_workflow(workflow, workflow.db_version, version)
+
+    daoList = getVersionDAO(version)
+    daoList.save_to_xml(workflow, filename, tags, version)
+    workflow = translate_workflow(workflow, version)
+    return workflow
+
+def save_workflow_bundle_to_xml(save_bundle, filename, version=None):
+    if save_bundle.workflow is None:
+        raise VistrailsDBException('save_workflow_bundle_to_xml failed, '
+                                   'bundle does not contain a workflow')
+    workflow = save_workflow_to_xml(save_bundle.workflow, filename, version)
+    return SaveBundle(DBWorkflow.vtType, workflow=workflow)
+
+def save_workflow_to_db(workflow, db_connection, do_copy=False, version=None):
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_version(db_connection)
+        if version is None:
+            version = currentVersion
+    if not workflow.db_version:
+        workflow.db_version = currentVersion
+    workflow = translate_workflow(workflow, workflow.db_version, version)
+    dao_list = getVersionDAO(version)
+
+    db_connection.begin()
+    workflow.db_last_modified = get_current_time(db_connection)
+    dao_list.save_to_db(db_connection, workflow, do_copy)
+    db_connection.commit()
+    workflow = translate_workflow(workflow, version)
+    return workflow
+
+def save_workflow_bundle_to_db(save_bundle, db_connection, do_copy=False, 
+                               version=None):
+    if save_bundle.workflow is None:
+        raise VistrailsDBException('save_workflow_bundle_to_db failed, '
+                                   'bundle does not contain a workflow')
+    workflow = save_workflow_to_db(save_bundle.workflow, db_connection, do_copy, 
+                                   version)
+    return SaveBundle(DBWorkflow.vtType, workflow=workflow)
+
+def get_saved_workflows(vistrail, db_connection):
+    """ Returns list of action id:s representing populated workflows """
+    if not vistrail.db_id:
+        return []
+    c = db_connection.cursor()
+    c.execute("SELECT parent_id FROM workflow WHERE vistrail_id=%s;", (vistrail.db_id,))
+    ids = [i[0] for i in c.fetchall()]
+    c.close()
+    return ids
+
+##############################################################################
+# Logging I/O
+
+def open_log_from_xml(filename, was_appended=False):
+    """open_log_from_xml(filename) -> DBLog"""
+    if was_appended:
+        parser = ElementTree.XMLTreeBuilder()
+        parser.feed("<log>\n")
+        f = open(filename, "rb")
+        parser.feed(f.read())
+        parser.feed("</log>\n")
+        root = parser.close()
+        workflow_execs = []
+        for node in root:
+            version = get_version_for_xml(node)
+            daoList = getVersionDAO(version)
+            workflow_exec = \
+                daoList.read_xml_object(DBWorkflowExec.vtType, node)
+            if version != currentVersion:
+                # if version is wrong, dump this into a dummy log object, 
+                # then translate, then get workflow_exec back
+                log = DBLog()
+                translate_log(log, currentVersion, version)
+                log.db_add_workflow_exec(workflow_exec)
+                log = translate_log(log, version)
+                workflow_exec = log.db_workflow_execs[0]
+            workflow_execs.append(workflow_exec)
+        log = DBLog(workflow_execs=workflow_execs)
+        vistrails.db.services.log.update_ids(log)
+    else:
+        tree = ElementTree.parse(filename)
+        version = get_version_for_xml(tree.getroot())
+        daoList = getVersionDAO(version)
+        log = daoList.open_from_xml(filename, DBLog.vtType, tree)
+        log = translate_log(log, version)
+        vistrails.db.services.log.update_id_scope(log)
+    return log
+
+def open_log_from_db(db_connection, id, lock=False, version=None):
+    """open_log_from_db(db_connection, id : long: lock: bool, version: str) 
+         -> DBLog 
+    
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_object_version(db_connection, id, DBLog.vtType)
+    dao_list = getVersionDAO(version)
+    log = dao_list.open_from_db(db_connection, DBLog.vtType, id, lock)
+    log = translate_log(log, version)
+    return log
+
+def open_vt_log_from_db(db_connection, vt_id, version=None):
+    """ return the logs for the specified vistrail """
+    if version is None:
+        version = get_db_object_version(db_connection, vt_id, DBVistrail.vtType)
+    dao_list = getVersionDAO(version)
+    ids = []
+    if db_connection is not None:
+        try:
+            c = db_connection.cursor()
+            # FIXME MySQL versus sqlite3
+            res = c.execute("SELECT id FROM log_tbl WHERE vistrail_id=%s;", (vt_id,))
+            ids = [i[0] for i in c.fetchall()]
+            c.close()
+        except get_db_lib().Error, e:
+            debug.critical("Error getting log id:s %d: %s" % (e.args[0], e.args[1]))
+    log = DBLog()
+    if hasattr(dao_list, 'open_many_from_db'): # does not exist pre 1.0.2
+        logs = dao_list.open_many_from_db(db_connection, DBLog.vtType, ids)
+    else:
+        logs = [dao_list.open_from_db(db_connection, DBLog.vtType, id) \
+                for id in ids]
+    for new_log in logs:
+        for workflow_exec in new_log.db_workflow_execs:
+            workflow_exec.db_id = log.id_scope.getNewId(DBWorkflowExec.vtType)
+            log.db_add_workflow_exec(workflow_exec)
+    log = translate_log(log, version)
+    return log
+
+def save_log_to_xml(log, filename, version=None, do_append=False):
+    if version is None:
+        version = currentVersion
+    if not log.db_version:
+        log.db_version = currentVersion
+    log = translate_log(log, log.db_version, version)
+
+    daoList = getVersionDAO(version)
+    if do_append:
+        log_file = open(filename, 'ab')
+        for workflow_exec in log.db_workflow_execs:
+            # cannot do correct numbering here...
+            # but need to save so that we can use it for deletes
+            wf_exec_id = workflow_exec.db_id
+            workflow_exec.db_id = -1L
+            daoList.save_to_xml(workflow_exec, log_file, {}, version)
+            workflow_exec.db_id = wf_exec_id
+        log_file.close()
+    else:
+        tags = {'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+                'xsi:schemaLocation': 'http://www.vistrails.org/log.xsd'
+                }
+        daoList.save_to_xml(log, filename, tags, version)
+    log = translate_log(log, version)
+    return log
+
+def save_log_bundle_to_xml(save_bundle, filename, version=None):
+    if save_bundle.log is None:
+        raise VistrailsDBException('save_log_bundle_to_xml failed, '
+                                   'bundle does not contain a log')
+        
+    log = save_log_to_xml(save_bundle.log, filename, version)
+    return SaveBundle(DBLog.vtType, log=log)
+
+def save_log_to_db(log, db_connection, do_copy=False, version=None):
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_version(db_connection)
+        if version is None:
+            version = currentVersion
+    if not log.db_version:
+        log.db_version = currentVersion
+    log = translate_log(log, log.db_version, version)
+    dao_list = getVersionDAO(version)
+
+    db_connection.begin()
+    log.db_last_modified = get_current_time(db_connection)
+    dao_list.save_to_db(db_connection, log, do_copy)
+    db_connection.commit()
+    log = translate_log(log, version)
+    return log
+
+def save_log_bundle_to_db(save_bundle, db_connection, do_copy=False, 
+                          version=None):
+    if save_bundle.log is None:
+        raise VistrailsDBException('save_log_bundle_to_db failed, '
+                                   'bundle does not contain a log')
+        
+    log = save_log_to_db(save_bundle.log, db_connection, do_copy, version)
+    return SaveBundle(DBLog.vtType, log=log)
+
+def merge_logs(new_log, vt_log_fname):
+    log = open_log_from_xml(vt_log_fname, True)
+    for workflow_exec in new_log.db_workflow_execs:
+        workflow_exec.db_id = log.id_scope.getNewId(DBWorkflowExec.vtType)
+        log.db_add_workflow_exec(workflow_exec)
+    return log
+
+##############################################################################
+# OPM I/O
+
+def save_opm_to_xml(opm_graph, filename, version=None):    
+    # FIXME, we're using workflow, version, and log here...
+    # which aren't in DBOpmGraph...
+    if version is None:
+        version = currentVersion
+    daoList = getVersionDAO(version)
+    tags = {'xmlns': 'http://openprovenance.org/model/v1.01.a',
+            }
+    opm_graph = vistrails.db.services.opm.create_opm(opm_graph.workflow, 
+                                           opm_graph.version,
+                                           opm_graph.log,
+                                           opm_graph.registry)
+    daoList.save_to_xml(opm_graph, filename, tags, version)
+    return opm_graph
+
+##############################################################################
+# PROV I/O
+
+def save_prov_to_xml(prov_document, filename, version=None):    
+    # FIXME, we're using workflow, version, and log here...
+    # which aren't in DBProvDocument...
+    if version is None:
+        version = currentVersion
+    daoList = getVersionDAO(version)
+    tags = {'xmlns:prov': 'http://www.w3.org/ns/prov#',
+            'xmlns:dcterms': 'http://purl.org/dc/terms/',
+            'xmlns:vt': 'http://www.vistrails.org/registry.xsd',
+            }
+    prov_document = vistrails.db.services.prov.create_prov(prov_document.workflow, 
+                                                 prov_document.version,
+                                                 prov_document.log)
+    daoList.save_to_xml(prov_document, filename, tags, version)
+    return prov_document
+
+##############################################################################
+# Registry I/O
+
+def open_registry_from_xml(filename):
+    tree = ElementTree.parse(filename)
+    version = get_version_for_xml(tree.getroot())
+    daoList = getVersionDAO(version)
+    registry = daoList.open_from_xml(filename, DBRegistry.vtType, tree)
+    registry = translate_registry(registry, version)
+    vistrails.db.services.registry.update_id_scope(registry)
+    return registry
+
+def open_registry_from_db(db_connection, id, lock=False, version=None):
+    """open_registry_from_db(db_connection, id : long: lock: bool, 
+                             version: str) -> DBRegistry 
+    
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_object_version(db_connection, id, DBRegistry.vtType)
+    dao_list = getVersionDAO(version)
+    registry = dao_list.open_from_db(db_connection, DBRegistry.vtType, id, lock)
+    registry = translate_registry(registry, version)
+    return registry
+
+def save_registry_to_xml(registry, filename, version=None):
+    tags = {'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            'xsi:schemaLocation': 'http://www.vistrails.org/registry.xsd'
+            }
+    if version is None:
+        version = currentVersion
+    if not registry.db_version:
+        registry.db_version = currentVersion
+    registry = translate_registry(registry, registry.db_version, version)
+
+    daoList = getVersionDAO(version)
+    daoList.save_to_xml(registry, filename, tags, version)
+    registry = translate_registry(registry, version)
+    return registry
+
+def save_registry_bundle_to_xml(save_bundle, filename, version=None):
+    if save_bundle.registry is None:
+        raise VistrailsDBException('save_registry_bundle_to_xml failed, '
+                                   'bundle does not contain a registry')
+        
+    registry = save_registry_to_xml(save_bundle.registry, filename, version)
+    return SaveBundle(DBRegistry.vtType, registry=registry)
+
+def save_registry_to_db(registry, db_connection, do_copy=False, version=None):
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if version is None:
+        version = get_db_version(db_connection)
+        if version is None:
+            version = currentVersion
+    if not registry.db_version:
+        registry.db_version = currentVersion
+    registry = translate_registry(registry, registry.db_version, version)
+    dao_list = getVersionDAO(version)
+
+    db_connection.begin()
+    registry.db_last_modified = get_current_time(db_connection)
+    dao_list.save_to_db(db_connection, registry, do_copy)
+    db_connection.commit()
+    registry = translate_registry(registry, version)
+    return registry
+
+def save_registry_bundle_to_db(save_bundle, db_connection, do_copy=False, 
+                               version=None):
+    if save_bundle.registry is None:
+        raise VistrailsDBException('save_registry_bundle_to_db failed, '
+                                   'bundle does not contain a registry')
+        
+    registry = save_registry_to_db(save_bundle.registry, db_connection, do_copy, 
+                                   version)
+    return SaveBundle(DBRegistry.vtType, registry=registry)
+
+##############################################################################
+# Abstraction I/O
+
+def open_abstraction_from_db(db_connection, id, lock=False):
+    """open_abstraction_from_db(db_connection, id : long: lock: bool) 
+         -> DBAbstraction 
+    DEPRECATED
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    abstraction = read_sql_objects(db_connection, DBAbstraction.vtType, 
+                                   id, lock)[0]
+
+    # not sure where this really should be done...
+    # problem is that db reads the add ops, then change ops, then delete ops
+    # need them ordered by their id
+    for db_action in abstraction.db_get_actions():
+        db_action.db_operations.sort(key=lambda x: x.db_id)
+    vistrails.db.services.abstraction.update_id_scope(abstraction)
+    return abstraction
+
+def save_abstraction_to_db(abstraction, db_connection, do_copy=False):
+    """ DEPRECATED """
+    db_connection.begin()
+    if abstraction.db_last_modified is None:
+        do_copy = True
+    if not do_copy:
+        match_id = get_matching_abstraction_id(db_connection, abstraction)
+        # FIXME remove print
+        #print 'match_id:', match_id
+        if match_id is not None:
+            abstraction.db_id = match_id
+            abstraction.is_new = False
+        else:
+            do_copy = True
+        new_time = get_db_object_modification_time(db_connection, 
+                                                   abstraction.db_id,
+                                                   DBAbstraction.vtType)
+        if new_time > abstraction.db_last_modified:
+            # need synchronization
+            # FIXME remove print
+            #print '*** doing synchronization ***'
+            old_abstraction = open_abstraction_from_db(db_connection, 
+                                                       abstraction.db_id,
+                                                       True)
+            # the "old" one is modified and changes integrated
+            vistrails.db.services.vistrail.synchronize(old_abstraction, abstraction,
+                                             0L)
+            abstraction = old_abstraction
+    if do_copy:
+        abstraction.db_id = None
+    abstraction.db_last_modified = get_current_time(db_connection)
+    write_sql_objects(db_connection, [abstraction], do_copy)
+    db_connection.commit()
+    return abstraction
+
+def save_abstractions_to_db(abstractions, vt_id, db_connection, do_copy=False):
+    """save_abstraction_to_db(abs: DBVistrail, db_connection) -> None
+    Saves an abstraction to db, and updating existing abstractions
+
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+
+    for abs_name in abstractions:
+        try: 
+            abs = open_vistrail_from_xml(abs_name)
+            abs.db_name = parse_abstraction_name(abs_name)
+            id_key = '__abstraction_vistrail_id__'
+            id_value = str(vt_id)
+            if abs.db_has_annotation_with_key(id_key):
+                annotation = abs.db_get_annotation_by_key(id_key)
+                annotation.db_value = id_value
+            else:
+                annotation=DBAnnotation(abs.idScope.getNewId(DBAnnotation.vtType),
+                                        id_key, id_value)
+                abs.db_add_annotation(annotation)
+            db_mod_time = None if not abs.db_id else \
+                          get_db_abstraction_modification_time(db_connection, abs)
+
+            if db_mod_time:
+                delete_entity_from_db(db_connection, abs.vtType, abs.db_id)
+
+            abs.db_id = None
+            abs.db_last_modified = get_current_time(db_connection)
+            version = get_db_version(db_connection)
+            version = version if version else currentVersion
+            if not abs.db_version:
+                abs.db_version = currentVersion
+            abs = translate_vistrail(abs, abs.db_version, version)
+            # Always copy for now
+            getVersionDAO(version).save_to_db(db_connection, abs, True)
+            db_connection.commit()
+
+        except Exception, e:
+            debug.critical('Could not save abstraction to db: %s' % str(e))
+
+##############################################################################
+# Thumbnail I/O
+
+def open_thumbnails_from_db(db_connection, obj_type, obj_id, tmp_dir=None):
+    """open_thumbnails_from_db(db_connection, obj_type: DB*,
+                            obj_id: long, tmp_dir: str) -> [str]
+
+    Gets a list of all thumbnails associated with this object from the
+    annotations table in the db (by comparing obj_type with the column
+    'entity_type' and obj_id with the column 'entity_id') and for any
+    thumbnails not found in tmp_dir, they are retreived from the db and
+    saved into tmp_dir.
+    Returns a list of absolute file paths for all thumbnails associated
+    with this object that exist in tmp_dir after the function has run.
+
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if tmp_dir is None:
+        return []
+
+    # First get associated file names from annotation table
+    prepared_statement = format_prepared_statement(
+    """
+    SELECT a.value
+    FROM annotation a
+    WHERE a.akey = '__thumb__' AND a.entity_id = ? AND a.entity_type = ?
+    """)
+    try:
+        c = db_connection.cursor()
+        c.execute(prepared_statement, (obj_id, obj_type))
+        file_names = [file_name for (file_name,) in c.fetchall()]
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't get thumbnails list from db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+
+    # Next get all thumbnails from the db that aren't already in tmp_dir
+    get_db_file_names = [fname for fname in file_names if fname not in os.listdir(tmp_dir)]
+    for file_name in get_db_file_names:
+        prepared_statement = format_prepared_statement(
+        """
+        SELECT t.image_bytes
+        FROM thumbnail t
+        WHERE t.file_name = ?
+        """)
+        try:
+            c = db_connection.cursor()
+            c.execute(prepared_statement, (file_name,))
+            row = c.fetchone()
+            c.close()
+        except get_db_lib().Error, e:
+            msg = "Couldn't get thumbnail from db (%d : %s)" % \
+                (e.args[0], e.args[1])
+            raise VistrailsDBException(msg)
+        if row is not None:
+            image_bytes = row[0]
+            try:
+                absfname = os.path.join(tmp_dir, file_name)
+                image_file = open(absfname, 'wb')
+                image_file.write(image_bytes)
+                image_file.close()
+            except IOError, e:
+                msg = "Couldn't write thumbnail file to disk: %s" % absfname
+                raise VistrailsDBException(msg)
+        else:
+            debug.warning("db: Referenced thumbnail not found locally or in the database: '%s'" % file_name)
+    # Return only thumbnails that now exist locally
+    return [os.path.join(tmp_dir, file_name) for file_name in file_names if file_name in os.listdir(tmp_dir)]
+
+def save_thumbnails_to_db(absfnames, db_connection):
+    """save_thumbnails_to_db(absfnames: list, db_connection) -> None
+    Saves all thumbnails from a list of local absolute file paths into the db,
+    except those already present on the db.
+
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    if absfnames is None or len(absfnames) == 0:
+        return None
+
+    # Determine which thumbnails already exist in db
+    statement = """
+    SELECT t.file_name
+    FROM thumbnail t
+    WHERE t.file_name IN %s
+    """
+    check_file_names = [os.path.basename(absfname).replace("'", "''").replace("\\", "\\\\") for absfname in absfnames]
+    # SQL syntax needs SOMETHING if list is empty - use filename that's illegal on all platforms
+    check_file_names.append(':/')
+    sql_in_token = str(tuple(check_file_names))
+    try:
+        c = db_connection.cursor()
+        c.execute(statement % sql_in_token)
+        db_file_names = [file_name for (file_name,) in c.fetchall()]
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't check which thumbnails already exist in db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    insert_absfnames = [absfname for absfname in absfnames if os.path.basename(absfname) not in db_file_names]
+
+    # Save any thumbnails that don't already exist in db
+    prepared_statement = format_prepared_statement(
+    """
+    INSERT INTO thumbnail(file_name, image_bytes, last_modified)
+    VALUES (?, ?, ?)
+    """)
+    try:
+        c = db_connection.cursor()
+        for absfname in insert_absfnames:
+            image_file = open(absfname, 'rb')
+            image_bytes = image_file.read()
+            image_file.close()
+            c.execute(prepared_statement, (os.path.basename(absfname), image_bytes, get_current_time(db_connection).strftime('%Y-%m-%d %H:%M:%S')))
+            db_connection.commit()
+        c.close()
+    except IOError, e:
+        msg = "Couldn't read thumbnail file for writing to db: %s" % absfname
+        raise VistrailsDBException(msg)
+    except get_db_lib().Error, e:
+        msg = "Couldn't insert thumbnail into db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+    return None
+##############################################################################
+# Mashup I/O
+def open_mashuptrail_from_xml(filename):
+    """open_mashuptrail_from_xml(filename) -> Mashuptrail"""
+    tree = ElementTree.parse(filename)
+    version = get_version_for_xml(tree.getroot())
+    # this is here because initially the version in the mashuptrail file was 
+    # independent of VisTrails schema version. So if the version was "0.1.0" we
+    # can safely upgrade it directly to 1.0.3 as it was the first version when
+    # the mashuptrail started to use the same vistrails schema version
+    old_version = version
+    if version == "0.1.0":
+        version = "1.0.3"
+    try:
+        daoList = getVersionDAO(version)
+        mashuptrail = daoList.open_from_xml(filename, DBMashuptrail.vtType, tree)
+        if old_version == "0.1.0":
+            mashuptrail.db_version = version
+        Mashuptrail.convert(mashuptrail)
+        mashuptrail.currentVersion = mashuptrail.getLatestVersion()
+        mashuptrail.updateIdScope()
+    except VistrailsDBException, e:
+        msg = "There was a problem when reading mashups from the xml file: "
+        msg += str(e)
+        raise VistrailsDBException(msg)
+    return mashuptrail
+
+def save_mashuptrail_to_xml(mashuptrail, filename, version=None):
+    tags = {'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            'xsi:schemaLocation': 'http://www.vistrails.org/mashup.xsd'
+            }
+    if version is None:
+        version = currentVersion
+    
+    if not mashuptrail.db_version:
+        mashuptrail.db_version = version
+   
+    #FIXME: This must be enabled at some point
+    #mashuptrail = translate_mashuptrail(mashuptrail, mashuptrail.db_version, version)
+    daoList = getVersionDAO(version)
+    daoList.save_to_xml(mashuptrail, filename, tags, version)
+    return mashuptrail
+
+def open_mashuptrail_from_db(db_connection, mashup_id, lock=False):
+    """open_mashuptrail_from_db(filename) -> Mashuptrail"""
+
+    version = get_db_object_version(db_connection, mashup_id, DBMashuptrail.vtType)
+    try:
+        daoList = getVersionDAO(version)
+        mashuptrail = daoList.open_from_db(db_connection, DBMashuptrail.vtType, mashup_id, lock)
+        Mashuptrail.convert(mashuptrail)
+        mashuptrail.currentVersion = mashuptrail.getLatestVersion()
+        mashuptrail.updateIdScope()
+    except VistrailsDBException, e:
+        msg = "There was a problem when reading mashups from the db file: "
+        msg += str(e)
+        raise VistrailsDBException(msg)
+    return mashuptrail
+
+def save_mashuptrails_to_db(mashuptrails, vt_id, db_connection, do_copy=False):
+    """save_mashuptrails_to_db(mashuptrails: DBMashuptrail, vt_id: int,
+                               db_connection, do_copy: bool) -> None
+    Saves a list of mashuptrails to the db, and replacing existing mashuptrails
+
+    """
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+
+    old_ids = get_db_mashuptrail_ids_from_vistrail(db_connection, vt_id)
+    for mashuptrail in mashuptrails:
+        try: 
+            id_key = '__mashuptrail_vistrail_id__'
+            id_value = str(vt_id)
+            if mashuptrail.db_has_annotation_with_key(id_key):
+                annotation = mashuptrail.db_get_annotation_by_key(id_key)
+                annotation.db_value = id_value
+            else:
+                annotation=DBAnnotation(mashuptrail.id_scope.getNewId(DBAnnotation.vtType),
+                                        id_key, id_value)
+                mashuptrail.db_add_annotation(annotation)
+
+            if mashuptrail.db_id in old_ids:
+                delete_entity_from_db(db_connection, mashuptrail.vtType, mashuptrail.db_id)
+
+            # add vt_id to mashups
+            for action in mashuptrail.db_actions:
+                action.db_mashup.db_vtid = vt_id
+            mashuptrail.db_last_modified = get_current_time(db_connection)
+            mashuptrail.db_id = None
+            version = get_db_version(db_connection)
+            version = version if version else currentVersion
+            if not mashuptrail.db_version:
+                mashuptrail.db_version = currentVersion
+            #FIXME: This must be enabled at some point
+            #mashuptrail = translate_vistrail(mashuptrail, mashuptrail.db_version, version)
+            # Always copy for now
+            getVersionDAO(version).save_to_db(db_connection, mashuptrail, True)
+            db_connection.commit()
+
+        except Exception, e:
+            debug.critical('Could not save mashuptrail to db: %s' % str(e))
+
+##############################################################################
+# I/O Utilities
+
+def delete_entity_from_db(db_connection, type, obj_id):
+    if db_connection is None:
+        msg = "Need to call open_db_connection() before reading"
+        raise VistrailsDBException(msg)
+    version = get_db_version(db_connection)
+    if version is None:
+        version = currentVersion
+    dao_list = getVersionDAO(version)
+    dao_list.delete_from_db(db_connection, type, obj_id)
+    db_connection.commit()
+    
+def get_version_for_xml(root):
+    version = root.get('version', None)
+    if version is not None:
+        return version
+    msg = "Cannot find version information"
+    raise VistrailsDBException(msg)
+
+def get_type_for_xml(root):
+    return root.tag
+
+def get_current_time(db_connection=None):
+    timestamp = datetime.now()
+    if db_connection is not None:
+        try:
+            c = db_connection.cursor()
+            # FIXME MySQL versus sqlite3
+            c.execute("SELECT NOW();")
+            # c.execute("SELECT DATETIME('NOW');")
+            row = c.fetchone()
+            if row:
+                # FIXME MySQL versus sqlite3
+                timestamp = row[0]
+                # timestamp = datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
+            c.close()
+        except get_db_lib().Error, e:
+            debug.critical("Logger Error %d: %s" % (e.args[0], e.args[1]))
+
+    return timestamp
+
+def create_temp_folder(prefix='vt_save'):
+    return tempfile.mkdtemp(prefix=prefix)
+
+def remove_temp_folder(temp_dir):
+    if temp_dir is None:
+        return
+    if not os.path.isdir(temp_dir):
+        if os.path.isfile(temp_dir):
+            os.remove(temp_dir)
+
+        # cleanup has already happened
+        return
+    try:
+        for root, dirs, files in os.walk(temp_dir, topdown=False):
+            for name in files:
+                os.remove(os.path.join(root, name))
+            for name in dirs:
+                os.rmdir(os.path.join(root, name))
+        os.rmdir(temp_dir)
+    except OSError, e:
+        raise VistrailsDBException("Can't remove %s: %s" % (temp_dir, str(e)))
+    
+##############################################################################
+# Testing
+
+
+class TestDBIO(unittest.TestCase):
+    def test1(self):
+        """test importing an xml file"""
+
+        vistrail = open_vistrail_from_xml( \
+            os.path.join(vistrails.core.system.vistrails_root_directory(),
+                         'tests/resources/dummy.xml'))
+        assert vistrail is not None
+        
+    def test2(self):
+        """test importing an xml file"""
+
+        vistrail = open_vistrail_from_xml( \
+            os.path.join(vistrails.core.system.vistrails_root_directory(),
+                         'tests/resources/dummy_new.xml'))
+        assert vistrail is not None
+
+    def test3(self):
+        """test importing a vt file"""
+
+        # FIXME include abstractions
+        (save_bundle, vt_save_dir) = open_bundle_from_zip_xml( \
+            DBVistrail.vtType,
+            os.path.join(vistrails.core.system.vistrails_root_directory(),
+                         'tests/resources/dummy_new.vt'))
+        assert save_bundle.vistrail is not None
+
+    def test4(self):
+        """ test saving a vt file """
+
+        # FIXME include abstractions
+        testdir = tempfile.mkdtemp(prefix='vt_')
+        filename = os.path.join(testdir, 'dummy_new.vt')
+
+        try:
+            (save_bundle, vt_save_dir) = open_bundle_from_zip_xml(
+                DBVistrail.vtType,
+                os.path.join(vistrails.core.system.vistrails_root_directory(),
+                             'tests/resources/dummy_new.vt'))
+            try:
+                save_bundle_to_zip_xml(save_bundle, filename, vt_save_dir)
+                if os.path.isfile(filename):
+                    os.unlink(filename)
+            except Exception, e:
+                self.fail(str(e))
+        finally:
+            os.rmdir(testdir)
diff --git a/vistrails/db/services/locator.py b/vistrails/db/services/locator.py
new file mode 100644
index 0000000..ab9ac51
--- /dev/null
+++ b/vistrails/db/services/locator.py
@@ -0,0 +1,1235 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import cgi
+from datetime import datetime, date
+import hashlib
+import locale
+import os.path
+import re
+import sys
+from time import strptime
+import urllib
+import urlparse
+import uuid
+
+import vistrails.core.system
+from vistrails.db.services import io
+from vistrails.db.services.io import SaveBundle
+from vistrails.db.domain import DBVistrail, DBWorkflow
+from vistrails.db import VistrailsDBException
+from vistrails.core import debug
+from vistrails.core.system import get_elementtree_library, systemType
+
+ElementTree = get_elementtree_library()
+
+
+_drive_regex = re.compile(r"/*([a-zA-Z]:/.+)$")
+def pathname2url(path):
+    """ Takes an absolute filename and turns it into a file:// URL.
+
+    While urllib.pathname2url seems like a good idea, it doesn't appear
+    to do anything sensible in practice on Windows.
+    """
+    if path.startswith('file://'):
+        path = urllib.unquote(path[7:])
+    if systemType in ('Windows', 'Microsoft'):
+        path = path.replace('\\', '/')
+        match = _drive_regex.match(path)
+        if match is not None:
+            path = '/%s' % match.group(1)
+    path = urllib.quote(path, safe='/:')
+    return path
+
+
+def url2pathname(urlpath):
+    """ Takes a file:// URL and turns it into a filename.
+    """
+    path = urllib.url2pathname(urlpath)
+    if systemType in ('Windows', 'Microsoft'):
+        path = path.replace('/', '\\')
+        path = path.lstrip('\\')
+    return path
+
+
+class BaseLocator(object):
+
+    def load(self):
+        raise NotImplementedError("load is not implemented")
+
+    def save(self, obj, do_copy=True, version=None):
+        """Saves an object in the given place.
+        
+        """
+        raise NotImplementedError("save is not implemented")
+
+    def save_as(self, obj, version=None):
+        return self.save(obj, True, version) # calls save by default
+
+    def close(self):
+        """Closes locator.
+        
+        """
+        pass
+
+    def is_valid(self):
+        """Returns true if locator refers to a valid object.
+        
+        """
+        raise NotImplementedError("is_valid is not implemented")
+        
+    def get_temporary(self):
+        return None
+
+    def has_temporaries(self):
+        return self.get_temporary() is not None
+
+    def clean_temporaries(self):
+        pass
+
+    def save_temporary(self, obj):
+        pass
+    
+    def serialize(self, dom, element):
+        """Serializes this locator to XML.
+
+        """
+        raise NotImplementedError("serialize is not implemented")
+
+    def to_xml(self, node=None): 
+        """ElementTree port of serialize.
+
+        """
+        raise NotImplementedError("to_xml is not implemented")
+
+    @staticmethod
+    def parse(element):
+        """Parse an XML object representing a locator and returns a Locator.
+        
+        """
+        raise NotImplementedError("parse is not implemented")
+    
+    @staticmethod
+    def convert_filename_to_url(filename):
+        """ Converts a local filename to a file:// URL.
+
+        All file:// URLs are absolute, so abspath() will be used on the
+        argument.
+        """
+        exts = ["vt", "xml"]
+        q_mark = False
+        query_str_idx = None
+        for match in re.finditer("\.(%s)(\??)" % "|".join(exts), filename):
+            if match.group(2):
+                if q_mark:
+                    raise VistrailsDBException('Ambiguous URI with '
+                                               'multiple question '
+                                               'marks: "%s"' % filename)
+                else:
+                    q_mark = True
+                    query_str_idx = match.end()
+        if q_mark:
+            args_str = filename[query_str_idx-1:]
+            filename = filename[:query_str_idx-1]
+        else:
+            args_str = ""
+
+        return 'file://%s%s' % (pathname2url(os.path.abspath(filename)),
+                                urllib.quote(args_str, safe='/?=&'))
+
+    @staticmethod
+    def from_url(url):
+        """Assumes a valid URL if the scheme is specified.  For example,
+        'file:///C:/My%20Documents/test.vt'.  If only a filename is
+        specified, it converts the filename to a URL.
+
+        """
+        if '://' in url:
+            scheme = url.split('://', 1)[0]
+        elif url.startswith('untitled:'):
+            scheme = 'untitled'
+        else:
+            scheme = 'file'
+            url = BaseLocator.convert_filename_to_url(url)
+        if scheme == 'untitled':
+            return UntitledLocator.from_url(url)
+        elif scheme == 'db':
+            return DBLocator.from_url(url)
+        elif scheme == 'file':
+            old_uses_query = urlparse.uses_query
+            urlparse.uses_query = urlparse.uses_query + ['file']
+            scheme, host, path, query, fragment = urlparse.urlsplit(str(url))
+            urlparse.uses_query = old_uses_query
+            path = url2pathname(path)
+            if path.endswith(".vt"):
+                return ZIPFileLocator.from_url(url)
+            elif path.endswith(".xml"):
+                return XMLFileLocator.from_url(url)
+        return None
+
+    @staticmethod
+    def parse_args(arg_str):
+        args = {}
+        parsed_dict = cgi.parse_qs(arg_str)
+        if 'type' in parsed_dict:
+            args['obj_type'] = parsed_dict['type'][0]
+        if 'id' in parsed_dict:
+            args['obj_id'] = parsed_dict['id'][0]
+        args['version_node'] = None
+        args['version_tag'] = None
+        if 'workflow' in parsed_dict:
+            workflow_arg = parsed_dict['workflow'][0]
+            try:
+                args['version_node'] = int(workflow_arg)
+            except ValueError:
+                args['version_tag'] = workflow_arg
+        if 'workflow_exec' in parsed_dict:
+            args['workflow_exec'] = parsed_dict['workflow_exec'][0]
+        if 'parameterExploration' in parsed_dict:
+            args['parameterExploration'] = \
+                                        parsed_dict['parameterExploration'][0]
+        if 'mashuptrail' in parsed_dict:
+            args['mashuptrail'] = parsed_dict['mashuptrail'][0]
+        # should use mashupVersion, but also allow (and preserve) mashup
+        if 'mashupVersion' in parsed_dict:
+            args['mashupVersion'] = parsed_dict['mashupVersion'][0]
+        elif 'mashup' in parsed_dict:
+            args['mashup'] = parsed_dict['mashup'][0]
+        if 'workflow_exec' in parsed_dict:
+            args['workflow_exec'] = parsed_dict['workflow_exec'][0]
+        return args
+
+    @staticmethod
+    def generate_args(args):
+        generate_dict = {}
+        if 'obj_type' in args and args['obj_type']:
+            generate_dict['type'] = args['obj_type']
+        if 'obj_id' in args and args['obj_id']:
+            generate_dict['id'] = args['obj_id']
+        if 'version_node' in args and args['version_node']:
+            generate_dict['workflow'] = args['version_node']
+        elif 'version_tag' in args and args['version_tag']:
+            generate_dict['workflow'] = args['version_tag']
+        if 'parameterExploration' in args and args['parameterExploration']:
+            generate_dict['parameterExploration'] = args['parameterExploration']
+        if 'mashuptrail' in args and args['mashuptrail']:
+            generate_dict['mashuptrail'] = args['mashuptrail']
+        if 'mashupVersion' in args and args['mashupVersion']:
+            generate_dict['mashupVersion'] = args['mashupVersion']
+        elif 'mashup' in args and args['mashup']:
+            generate_dict['mashup'] = args['mashup']
+        if 'workflow_exec' in args and args['workflow_exec']:
+            generate_dict['workflow_exec'] = args['workflow_exec']
+        return urllib.urlencode(generate_dict)
+
+
+    def _get_name(self):
+        return None # Returns a name that will be displayed for the object
+    name = property(_get_name)
+
+    def _get_short_filename(self):
+        """ Returns a short name that can be used to derive other filenames
+        """
+        return None
+    short_filename = property(_get_short_filename)
+
+    def _get_short_name(self):
+        """ Returns a short name that can be used for display
+        """
+        return None
+    short_name = property(_get_short_name)
+
+    ###########################################################################
+    # Operators
+
+    def __eq__(self, other):
+        pass # Implement equality
+
+    def __ne__(self, other):
+        pass # Implement nonequality
+
+    def __hash__(self):
+        return hash(self.name)
+    
+    def is_untitled(self):
+        return False
+
+class SaveTemporariesMixin(object):
+    """A mixin class that saves temporary copies of a file.  It requires
+    self.name to exist for proper functioning.
+
+    """
+
+    @staticmethod
+    def get_autosave_dir():
+        dot_vistrails = vistrails.core.system.current_dot_vistrails()
+        auto_save_dir = os.path.join(dot_vistrails, "autosave")
+        if not os.path.exists(auto_save_dir):
+            # !!! we assume dot_vistrails exists !!!
+            os.mkdir(auto_save_dir)
+        if not os.path.isdir(auto_save_dir):
+            raise VistrailsDBException('Auto-save path "%s" is not a '
+                                       'directory' % auto_save_dir)
+        return auto_save_dir
+
+    def get_temp_basename(self):
+        return self.name
+
+    def save_temporary(self, obj):
+        fname = self._find_latest_temporary()
+        new_temp_fname = self._next_temporary(fname)
+        io.save_to_xml(obj, new_temp_fname)
+
+    def clean_temporaries(self):
+        """_remove_temporaries() -> None
+
+        Erases all temporary files.
+
+        """
+        def remove_it(fname):
+            os.unlink(fname)
+        self._iter_temporaries(remove_it)
+
+    def encode_name(self, filename):
+        """encode_name(filename) -> str
+        Encodes a file path using urllib.quoteplus
+
+        """
+        name = urllib.quote_plus(filename) + '_tmp_'
+        return os.path.join(self.get_autosave_dir(), name)
+
+    def _iter_temporaries(self, f):
+        """_iter_temporaries(f): calls f with each temporary file name, in
+        sequence.
+
+        """
+        latest = None
+        current = 0
+        while True:
+            fname = self.encode_name(self.get_temp_basename()) + str(current)
+            if os.path.isfile(fname):
+                f(fname)
+                current += 1
+            else:
+                break
+
+    def _find_latest_temporary(self):
+        """_find_latest_temporary(): String or None.
+
+        Returns the latest temporary file saved, if it exists. Returns
+        None otherwise.
+        
+        """
+        latest = [None]
+        def set_it(fname):
+            latest[0] = fname
+        self._iter_temporaries(set_it)
+        return latest[0]
+        
+    def _next_temporary(self, temporary):
+        """_find_latest_temporary(string or None): String
+
+        Returns the next suitable temporary file given the current
+        latest one.
+
+        """
+        if temporary == None:
+            return self.encode_name(self.get_temp_basename()) + '0'
+        else:
+            split = temporary.rfind('_')+1
+            base = temporary[:split]
+            number = int(temporary[split:])
+            return base + str(number+1)
+
+class UntitledLocator(SaveTemporariesMixin, BaseLocator):
+    UNTITLED_NAME = "Untitled"
+    UNTITLED_PREFIX = UNTITLED_NAME + "_"
+
+    def __init__(self, my_uuid=None, **kwargs):
+        if my_uuid is not None:
+            self._uuid = my_uuid
+        else:
+            self._uuid = uuid.uuid4()
+        self._vnode = kwargs.get('version_node', None)
+        self._vtag = kwargs.get('version_tag', '')
+        self._mshptrail = kwargs.get('mashuptrail', None)
+        if 'mashupVersion' in kwargs:
+            self._mshpversion = kwargs.get('mashupVersion', None)
+        else:
+            self._mshpversion = kwargs.get('mashup', None)
+        self._parameterexploration = kwargs.get('parameterExploration', None)
+        self.kwargs = kwargs
+
+    def load(self, type):
+        fname = self.get_temporary()
+        if fname:
+            obj = io.open_from_xml(fname, type)
+        else:
+            obj = DBVistrail()
+        obj.locator = self
+        return obj
+
+    def is_valid(self):
+        return False
+
+    def get_temp_basename(self):
+        return UntitledLocator.UNTITLED_PREFIX + self._uuid.hex
+
+    def get_temporary(self):
+        return self._find_latest_temporary()
+
+    def _get_name(self):
+        return UntitledLocator.UNTITLED_NAME
+    name = property(_get_name)
+
+    def _get_short_filename(self):
+        return self._get_name()
+    short_filename = property(_get_short_filename)
+
+    def _get_short_name(self):
+        return self._get_name().decode('ascii')
+    short_name = property(_get_short_name)
+
+    @staticmethod
+    def from_url(url):
+        if not url.startswith('untitled:'):
+            raise VistrailsDBException("URL does not start with untitled:")
+
+        rest = url[9:]
+        my_uuid = None
+        if len(rest) >= 32:
+            try:
+                my_uuid = uuid.UUID(rest[:32])
+                rest = rest[32:]
+            except ValueError:
+                pass
+        if not rest:
+            kwargs = dict()
+        elif rest[0] == '?':
+            kwargs = BaseLocator.parse_args(rest[1:])
+        else:
+            raise ValueError
+        return UntitledLocator(my_uuid, **kwargs)
+
+    def to_url(self):
+        args_str = BaseLocator.generate_args(self.kwargs)
+        url_tuple = ('untitled', '', self._uuid.hex, args_str, '')
+        return urlparse.urlunsplit(url_tuple)
+
+    def __hash__(self):
+        return self._uuid.int
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        return (self._uuid == other._uuid)
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def is_untitled(self):
+        return True
+    
+    @classmethod
+    def all_untitled_temporaries(cls):
+        autosave_dir = SaveTemporariesMixin.get_autosave_dir()
+        fnames = []
+        for fname in os.listdir(autosave_dir):
+            if fname.startswith(cls.UNTITLED_PREFIX) and \
+               os.path.isfile(os.path.join(autosave_dir, fname)):
+                fnames.append(fname)
+        locators = {}
+        for fname in fnames:
+            uuid_start = len(cls.UNTITLED_PREFIX)
+            my_uuid = uuid.UUID(fname[uuid_start:uuid_start+32])
+            if my_uuid not in locators:
+                locators[my_uuid] = cls(my_uuid)
+        return locators.values()
+
+class XMLFileLocator(BaseLocator, SaveTemporariesMixin):
+    def __init__(self, filename, **kwargs):
+        self._name = filename
+        self._vnode = kwargs.get('version_node', None)
+        self._vtag = kwargs.get('version_tag', '')
+        self._mshptrail = kwargs.get('mashuptrail', None)
+        if 'mashupVersion' in kwargs:
+            self._mshpversion = kwargs.get('mashupVersion', None)
+        else:
+            self._mshpversion = kwargs.get('mashup', None)
+        self._parameterexploration = kwargs.get('parameterExploration', None)
+        self.kwargs = kwargs
+
+    def load(self, type):
+        fname = self.get_temporary()
+        if fname:
+            obj = io.open_from_xml(fname, type)
+        else:
+            obj = io.open_from_xml(self._name, type)
+        obj.locator = self
+        return obj
+
+    def save(self, obj, do_copy=True, version=None):
+        is_bundle = False
+        if type(obj) == type(SaveBundle(None)):
+            is_bundle = True
+            save_bundle = obj
+            obj = save_bundle.get_primary_obj()
+        obj = io.save_to_xml(obj, self._name, version)
+        obj.locator = self
+        # Only remove the temporaries if save succeeded!
+        self.clean_temporaries()
+        if is_bundle:
+            return SaveBundle(save_bundle.bundle_type, obj)
+        return obj
+
+    def is_valid(self):
+        return os.path.isfile(self._name)
+
+    def get_temporary(self):
+        return self._find_latest_temporary()
+
+    def _get_name(self):
+        return str(self._name)
+    name = property(_get_name)
+
+    def _get_short_filename(self):
+        return os.path.splitext(os.path.basename(self._name))[0]
+    short_filename = property(_get_short_filename)
+
+    def _get_short_name(self):
+        name = self._get_short_filename()
+        enc = sys.getfilesystemencoding() or locale.getpreferredencoding()
+        return name.decode(enc)
+    short_name = property(_get_short_name)
+
+    @classmethod
+    def from_url(cls, url):
+        if '://' in url:
+            scheme, path = url.split('://', 1)
+            if scheme != 'file':
+                raise ValueError
+        else:
+            url = BaseLocator.convert_filename_to_url(url)
+
+        old_uses_query = urlparse.uses_query
+        urlparse.uses_query = urlparse.uses_query + ['file']
+        scheme, host, path, args_str, fragment = urlparse.urlsplit(url)
+        urlparse.uses_query = old_uses_query
+        # De-urlencode pathname
+        path = url2pathname(str(path))
+        kwargs = BaseLocator.parse_args(args_str)
+
+        return cls(os.path.abspath(path), **kwargs)
+
+    def to_url(self):
+        args_str = BaseLocator.generate_args(self.kwargs)
+        url_tuple = ('file', '',
+                     pathname2url(os.path.abspath(self._name)),
+                     args_str, '')
+        return urlparse.urlunsplit(url_tuple)
+
+    def serialize(self, dom, element):
+        """serialize(dom, element) -> None
+        Convert this object to an XML representation.
+
+        """
+        locator = dom.createElement('locator')
+        locator.setAttribute('type', 'file')
+        node = dom.createElement('name')
+        filename = dom.createTextNode(str(self._name))
+        node.appendChild(filename)
+        locator.appendChild(node)
+        element.appendChild(locator)
+
+    @staticmethod
+    def parse(element):
+        """ parse(element) -> XMLFileLocator or None
+        Parse an XML object representing a locator and returns a
+        XMLFileLocator object.
+
+        """
+        if str(element.getAttribute('type')) == 'file':
+            for n in element.childNodes:
+                if n.localName == "name":
+                    filename = str(n.firstChild.nodeValue).strip(" \n\t")
+                    return XMLFileLocator(filename)
+            return None
+        else:
+            return None
+
+    #ElementTree port
+    def to_xml(self, node=None):
+        """to_xml(node: ElementTree.Element) -> ElementTree.Element
+        Convert this object to an XML representation.
+        """
+        if node is None:
+            node = ElementTree.Element('locator')
+
+        node.set('type', 'file')
+        childnode = ElementTree.SubElement(node,'name')
+        childnode.text = self._name.decode('latin-1')
+        return node
+
+    @staticmethod
+    def from_xml(node):
+        """from_xml(node:ElementTree.Element) -> XMLFileLocator or None
+        Parse an XML object representing a locator and returns a
+        XMLFileLocator object."""
+        if node.tag != 'locator':
+            return None
+
+        #read attributes
+        data = node.get('type', '')
+        type = str(data)
+        if type == 'file':
+            for child in node.getchildren():
+                if child.tag == 'name':
+                    filename = child.text.encode('latin-1').strip()
+                    return XMLFileLocator(filename)
+        return None
+
+    def __str__(self):
+        return '<%s vistrail_name="%s" />' % (self.__class__.__name__, self._name)
+
+    ###########################################################################
+    # Operators
+
+    def __eq__(self, other):
+        if not isinstance(other, XMLFileLocator):
+            return False
+        return self._name == other._name
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+class ZIPFileLocator(XMLFileLocator):
+    """Files are compressed in zip format. The temporaries are
+    still in xml"""
+    def __init__(self, filename, **kwargs):
+        XMLFileLocator.__init__(self, filename, **kwargs)
+        self.tmp_dir = None
+
+    def load(self, type):
+        fname = self.get_temporary()
+        if fname:
+            from vistrails.db.domain import DBVistrail
+            obj = io.open_from_xml(fname, type)
+            return SaveBundle(DBVistrail.vtType, obj)
+        else:
+            (save_bundle, tmp_dir) = io.open_bundle_from_zip_xml(type, self._name)
+            self.tmp_dir = tmp_dir
+            for obj in save_bundle.get_db_objs():
+                obj.locator = self
+            return save_bundle
+
+    def save(self, save_bundle, do_copy=True, version=None):
+        if do_copy:
+            # make sure we create a fresh temporary directory if we're
+            # duplicating the vistrail
+            tmp_dir = None
+        else:
+            # otherwise, use the existing temp directory if one is set
+            tmp_dir = self.tmp_dir
+        (save_bundle, tmp_dir) = io.save_bundle_to_zip_xml(save_bundle, self._name, tmp_dir, version)
+        self.tmp_dir = tmp_dir
+        for obj in save_bundle.get_db_objs():
+            obj.locator = self
+        # Only remove the temporaries if save succeeded!
+        self.clean_temporaries()
+        return save_bundle
+
+    def close(self):
+        if self.tmp_dir is not None:
+            io.close_zip_xml(self.tmp_dir)
+            self.tmp_dir = None
+
+    ###########################################################################
+    # Operators
+
+    def __eq__(self, other):
+        if not isinstance(other, ZIPFileLocator):
+            return False
+        return self._name == other._name
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    @staticmethod
+    def parse(element):
+        """ parse(element) -> ZIPFileLocator or None
+        Parse an XML object representing a locator and returns a
+        ZIPFileLocator object.
+
+        """
+        if str(element.getAttribute('type')) == 'file':
+            for n in element.childNodes:
+                if n.localName == "name":
+                    filename = str(n.firstChild.nodeValue).strip(" \n\t")
+                    return ZIPFileLocator(filename)
+            return None
+        else:
+            return None
+        
+    #ElementTree port    
+    @staticmethod
+    def from_xml(node):
+        """from_xml(node:ElementTree.Element) -> ZIPFileLocator or None
+        Parse an XML object representing a locator and returns a
+        ZIPFileLocator object."""
+        if node.tag != 'locator':
+            return None
+
+        #read attributes
+        data = node.get('type', '')
+        type = str(data)
+        if type == 'file':
+            for child in node.getchildren():
+                if child.tag == 'name':
+                    filename = child.text.encode('latin-1').strip()
+                    return ZIPFileLocator(filename)
+            return None
+        return None
+
+# class URLLocator(ZIPFileLocator):
+#     def load(self, type):
+        
+class DBLocator(BaseLocator):
+    cache = {}
+    cache_timestamps = {}
+    connections = {}
+    cache_connections = {}
+        
+    def __init__(self, host, port, database, user, passwd, name=None,
+                 **kwargs):
+        self._host = host
+        self._port = int(port)
+        self._db = database
+        self._user = user
+        self._passwd = passwd
+        self._name = name
+        self._hash = ''
+        self.kwargs = kwargs
+        self._obj_id = self.kwargs.get('obj_id', None)
+        self._obj_type = self.kwargs.get('obj_type', None)
+        self._conn_id = self.kwargs.get('connection_id', None)
+        self._vnode = self.kwargs.get('version_node', None)
+        self._vtag = self.kwargs.get('version_tag', None)
+        self._mshptrail = self.kwargs.get('mashuptrail', None)
+        if 'mashupVersion' in self.kwargs:
+            self._mshpversion = self.kwargs.get('mashupVersion', None)
+        else:
+            self._mshpversion = self.kwargs.get('mashup', None)
+        self._parameterexploration = self.kwargs.get('parameterExploration', None)
+        
+    def _get_host(self):
+        return self._host
+    host = property(_get_host)
+
+    def _get_port(self):
+        return self._port
+    port = property(_get_port)
+
+    def _get_db(self):
+        return self._db
+    db = property(_get_db)
+    
+    def _get_obj_id(self):
+        return self._obj_id
+    obj_id = property(_get_obj_id)
+
+    def _get_obj_type(self):
+        return self._obj_type
+    obj_type = property(_get_obj_type)
+
+    def _get_connection_id(self):
+        return self._conn_id
+    connection_id = property(_get_connection_id)
+    
+    def _get_name(self):
+        return self._host + ':' + str(self._port) + ':' + self._db + ':' + \
+            str(self._name)
+    name = property(_get_name)
+
+    def _get_short_filename(self):
+        return str(self._name)
+    short_filename = property(_get_short_filename)
+
+    def _get_short_name(self):
+        name = self._name
+        if not isinstance(name, unicode):
+            name = name.decode('ascii')
+        return name
+    short_name = property(_get_short_name)
+
+    def hash(self):
+        node = self.to_xml()
+        xml_string = ElementTree.tostring(node)
+        #print "hash", xml_string
+        return hashlib.sha224(xml_string).hexdigest()
+    
+    def is_valid(self):
+        if self._conn_id is not None \
+                and self._conn_id in DBLocator.connections:
+            return True
+        try:
+            self.get_connection()
+        except:
+            return False
+        return True
+        
+    def get_connection(self):
+        if self._conn_id is not None \
+                and DBLocator.connections.has_key(self._conn_id):
+            connection = DBLocator.connections[self._conn_id]
+            if io.ping_db_connection(connection):
+                return connection
+        else:
+            if self._conn_id is None:
+                if DBLocator.cache_connections.has_key(self._hash):
+                    connection = DBLocator.cache_connections[self._hash]
+                    if io.ping_db_connection(connection):
+                        debug.log("Reusing cached connection")
+                        return connection
+
+                if len(DBLocator.connections.keys()) == 0:
+                    self._conn_id = 1
+                else:
+                    self._conn_id = max(DBLocator.connections.keys()) + 1
+        config = {'host': self._host,
+                  'port': self._port,
+                  'db': self._db,
+                  'user': self._user,
+                  'passwd': self._passwd}
+        #print "config:", config
+        connection = io.open_db_connection(config)
+            
+        DBLocator.connections[self._conn_id] = connection
+        DBLocator.cache_connections[self._hash] = connection
+        return connection
+
+    def load(self, type, tmp_dir=None):
+        self._hash = self.hash()
+        #print "LLoad Big|type", type
+        if DBLocator.cache.has_key(self._hash):
+            save_bundle = DBLocator.cache[self._hash]
+            obj = save_bundle.get_primary_obj()
+
+            ts = self.get_db_modification_time(obj.vtType)
+            #debug.log("cached time: %s, db time: %s"%(DBLocator.cache_timestamps[self._hash],ts))
+            if DBLocator.cache_timestamps[self._hash] == ts:
+                #debug.log("using cached vistrail")
+                self._name = obj.db_name
+                # If thumbnail cache was cleared, get thumbs from db
+                if tmp_dir is not None:
+                    for absfname in save_bundle.thumbnails:
+                        if not os.path.isfile(absfname):
+                            save_bundle.thumbnails = io.open_thumbnails_from_db(self.get_connection(), type, self.obj_id, tmp_dir)
+                            break
+                return save_bundle
+        #debug.log("loading vistrail from db")
+        connection = self.get_connection()
+        if type == DBWorkflow.vtType:
+            return io.open_from_db(connection, type, self.obj_id)
+        save_bundle = io.open_bundle_from_db(type, connection, self.obj_id, tmp_dir)
+        primary_obj = save_bundle.get_primary_obj()
+        self._name = primary_obj.db_name
+        #print "locator db name:", self._name
+        for obj in save_bundle.get_db_objs():
+            obj.locator = self
+        
+        _hash = self.hash()
+        DBLocator.cache[self._hash] = save_bundle.do_copy()
+        DBLocator.cache_timestamps[self._hash] = primary_obj.db_last_modified
+        return save_bundle
+
+    def save(self, save_bundle, do_copy=False, version=None):
+        connection = self.get_connection()
+        for obj in save_bundle.get_db_objs():
+            obj.db_name = self._name
+        save_bundle = io.save_bundle_to_db(save_bundle, connection, do_copy, version)
+        primary_obj = save_bundle.get_primary_obj()
+        self._obj_id = primary_obj.db_id
+        self._obj_type = primary_obj.vtType
+        for obj in save_bundle.get_db_objs():
+            obj.locator = self
+        #update the cache with a copy of the new bundle
+        self._hash = self.hash()
+        DBLocator.cache[self._hash] = save_bundle.do_copy()
+        DBLocator.cache_timestamps[self._hash] = primary_obj.db_last_modified
+        return save_bundle
+
+    def get_db_modification_time(self, obj_type=None):
+        if obj_type is None:
+            if self.obj_type is None:
+                obj_type = DBVistrail.vtType 
+            else:
+                obj_type = self.obj_type
+
+        ts = io.get_db_object_modification_time(self.get_connection(),
+                                                self.obj_id,
+                                                obj_type)
+        ts = datetime(*strptime(str(ts).strip(), '%Y-%m-%d %H:%M:%S')[0:6])
+        return ts
+        
+    def serialize(self, dom, element):
+        """serialize(dom, element) -> None
+        Convert this object to an XML representation.
+
+        """
+        locator = dom.createElement('locator')
+        locator.setAttribute('type', 'db')
+        locator.setAttribute('host', str(self._host))
+        locator.setAttribute('port', str(self._port))
+        locator.setAttribute('db', str(self._db))
+        locator.setAttribute('vt_id', str(self._obj_id))
+        node = dom.createElement('name')
+        filename = dom.createTextNode(str(self._name))
+        node.appendChild(filename)
+        locator.appendChild(node)
+        element.appendChild(locator)
+
+    @staticmethod
+    def parse(element):
+        """ parse(element) -> DBFileLocator or None
+        Parse an XML object representing a locator and returns a
+        DBFileLocator object.
+
+        """
+        if str(element.getAttribute('type')) == 'db':
+            host = str(element.getAttribute('host'))
+            port = int(element.getAttribute('port'))
+            database = str(element.getAttribute('db'))
+            vt_id = str(element.getAttribute('vt_id'))
+            user = ""
+            passwd = ""
+            for n in element.childNodes:
+                if n.localName == "name":
+                    name = str(n.firstChild.nodeValue).strip(" \n\t")
+                    #print host, port, database, name, vt_id
+                    return DBLocator(host, port, database,
+                                     user, passwd, name, vt_id, None)
+            return None
+        else:
+            return None
+    
+    @staticmethod
+    def from_url(url):
+        format = re.compile(
+                r"^"
+                "([a-zA-Z0-9_-]+)://"   # scheme
+                "(?:"
+                    "([^:@]+)"          # user name
+                    "(?:([^:@]+))?"     # password
+                "@)?"
+                "([^/]+)"               # net location
+                "/([^?]+)"              # database name
+                "(?:\?(.+))?"           # query arguments
+                "$")
+        match = format.match(url)
+        if match is None:
+            return ValueError
+        else:
+            scheme, user, passwd, net_loc, db_name, args_str = match.groups('')
+            if ':' in net_loc:
+                host, port = net_loc.rsplit(':', 1)
+            else:
+                host, port = net_loc, None
+            db_name = urllib.unquote(str(db_name))
+            kwargs = BaseLocator.parse_args(args_str)
+            return DBLocator(host, port, db_name, user, passwd, **kwargs)
+    
+    def to_url(self):
+        # FIXME may also want to allow database type to be encoded in 
+        # scheme (ie mysql://host/db, sqlite3://path/to)
+        net_loc = '%s:%s' % (self._host, self._port)
+        args_str = BaseLocator.generate_args(self.kwargs)
+        # query_str = '%s=%s' % (self._obj_type, self._obj_id)
+        url_tuple = ('db', net_loc, urllib.quote(self._db, ''), args_str, '')
+        return urlparse.urlunsplit(url_tuple)
+
+    #ElementTree port
+    def to_xml(self, node=None, include_name = False):
+        """to_xml(node: ElementTree.Element) -> ElementTree.Element
+        Convert this object to an XML representation.
+        """
+        if node is None:
+            node = ElementTree.Element('locator')
+
+        node.set('type', 'db')
+        node.set('host', str(self._host))
+        node.set('port', str(self._port))
+        node.set('db', str(self._db))
+        node.set('vt_id', str(self._obj_id))
+        node.set('user', str(self._user))
+        if include_name:
+            childnode = ElementTree.SubElement(node,'name')
+            childnode.text = str(self._name)
+        return node
+
+    @staticmethod
+    def from_xml(node, include_name=False):
+        """from_xml(node:ElementTree.Element) -> DBLocator or None
+        Parse an XML object representing a locator and returns a
+        DBLocator object."""
+        
+        def convert_from_str(value,type):
+            def bool_conv(x):
+                s = str(x).upper()
+                if s == 'TRUE':
+                    return True
+                if s == 'FALSE':
+                    return False
+
+            if value is not None:
+                if type == 'str':
+                    return str(value)
+                elif value.strip() != '':
+                    if type == 'long':
+                        return long(value)
+                    elif type == 'float':
+                        return float(value)
+                    elif type == 'int':
+                        return int(value)
+                    elif type == 'bool':
+                        return bool_conv(value)
+                    elif type == 'date':
+                        return date(*strptime(value, '%Y-%m-%d')[0:3])
+                    elif type == 'datetime':
+                        return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+            return None
+    
+        if node.tag != 'locator':
+            return None
+
+        #read attributes
+        data = node.get('type', '')
+        type = convert_from_str(data, 'str')
+        
+        if type == 'db':
+            data = node.get('host', None)
+            host = convert_from_str(data, 'str')
+            data = node.get('port', None)
+            port = convert_from_str(data,'int')
+            data = node.get('db', None)
+            database = convert_from_str(data,'str')
+            data = node.get('vt_id')
+            vt_id = convert_from_str(data, 'str')
+            data = node.get('user')
+            user = convert_from_str(data, 'str')
+            passwd = ""
+            name = None
+            if include_name:
+                for child in node.getchildren():
+                    if child.tag == 'name':
+                        name = str(child.text).strip(" \n\t")
+            return DBLocator(host, port, database,
+                             user, passwd, name, obj_id=vt_id, obj_type='vistrail')
+        else:
+            return None
+
+    def __str__(self):
+        return '<DBLocator host="%s" port="%s" database="%s" vistrail_id="%s" \
+vistrail_name="%s"/>' % ( self._host, self._port, self._db,
+                          self._obj_id, self._name)
+
+    ###########################################################################
+    # Operators
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        return (self._host == other._host and
+                self._port == other._port and
+                self._db == other._db and
+                self._user == other._user and
+                #self._name == other._name and
+                long(self._obj_id) == long(other._obj_id) and
+                self._obj_type == other._obj_type)
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+import unittest
+
+class TestLocators(unittest.TestCase):
+    if not hasattr(unittest.TestCase, 'assertIsInstance'):
+        def assertIsInstance(self, obj, cls, msg=None):
+            assert(isinstance(obj, cls))
+        def assertIsNone(self, obj):
+            self.assertEqual(obj, None)
+
+    @staticmethod
+    def path2url(fname):
+        path = os.path.abspath(fname)
+        path = path.replace(os.sep, '/')
+        if path.startswith('/'):
+            path = path[1:]
+        return "file:///%s" % urllib.quote(path, '/:')
+
+    def test_convert_filename(self):
+        # Test both systemTypes
+        global systemType
+        old_systemType = systemType
+        # Don't use abspath, it would cause Linux tests to fail on Windows
+        # we are using abspaths anyway
+        old_abspath = os.path.abspath
+        os.path.abspath = lambda x: x
+        try:
+            systemType = 'Linux'
+            self.assertEqual(
+                    BaseLocator.convert_filename_to_url(
+                            '/a dir/test.vt?v=a\xE9&b'),
+                    'file:///a%20dir/test.vt?v=a%E9&b')
+            systemType = 'Windows'
+            self.assertEqual(
+                    BaseLocator.convert_filename_to_url(
+                            'C:\\a dir\\test.vt?v=a\xE9&b'),
+                    'file:///C:/a%20dir/test.vt?v=a%E9&b')
+        finally:
+            systemType = old_systemType
+            os.path.abspath = old_abspath
+
+    def test_parse_untitled(self):
+        loc_str = "untitled:e78394a73b87429e952b71b858e03242?workflow=42"
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsInstance(loc, UntitledLocator)
+        self.assertEqual(loc.kwargs['version_node'], 42)
+        self.assertEqual(loc._uuid, 
+                         uuid.UUID('e78394a73b87429e952b71b858e03242'))
+        self.assertEqual(loc.to_url(), loc_str)
+
+    def test_untitled_no_uuid(self):
+        loc_str = "untitled:"
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsInstance(loc, UntitledLocator)
+        # make sure it adds a uuid
+        self.assertEqual(len(loc.to_url()), 41)
+
+    def test_parse_zip_file(self):
+        loc_str = self.path2url(
+                "/vistrails/tmp/test_parse_zip_file \xE9 \xEA.vt")
+        loc_str += "?workflow=abc"
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsInstance(loc, ZIPFileLocator)
+        self.assertEqual(loc.kwargs['version_tag'], "abc")
+        self.assertEqual(loc.short_filename, "test_parse_zip_file \xE9 \xEA")
+        self.assertEqual(loc.to_url(), loc_str)
+
+    def test_parse_zip_file_no_scheme(self):
+        loc_str = os.path.abspath(
+                "../tmp/test_parse_zip_file_no_scheme \xE9 \xEA.vt")
+        loc_str += "?workflow=abc"
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsInstance(loc, ZIPFileLocator)
+        self.assertEqual(loc.kwargs['version_tag'], "abc")
+        self.assertEqual(loc.short_filename,
+                         "test_parse_zip_file_no_scheme \xE9 \xEA")
+        loc_str = loc_str.replace(os.sep, '/')
+        if loc_str[0] == '/':
+            loc_str = loc_str[1:]
+        loc_str = "file:///%s" % urllib.quote(loc_str, '/:?=')
+        self.assertEqual(loc.to_url(), loc_str)
+
+    def test_parse_xml_file(self):
+        loc_str = self.path2url(
+                "/vistrails/tmp/test_parse_xml_file \xE9 \xEA.xml")
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsInstance(loc, XMLFileLocator)
+        self.assertEqual(loc.short_filename, "test_parse_xml_file \xE9 \xEA")
+        self.assertEqual(loc.to_url(), loc_str)
+
+    def test_short_names(self):
+        enc = sys.getfilesystemencoding() or locale.getpreferredencoding()
+        if (enc.lower() not in ('mbcs', 'utf-8', 'utf8',
+                                'latin-1', 'iso-8859-1', 'iso-8859-15')):
+            self.skipTest("unusual encoding on this system: %r" % enc)
+        if enc.lower() in ('mbcs', 'latin-1', 'iso-8859-1', 'iso-8859-15'):
+            fname = "test_short_names \xE9 \xEA"
+        elif enc.lower() in ('utf8', 'utf-8'):
+            fname = "test_short_names \xC3\xA9 \xC3\xAA"
+        else:
+            self.skipTest("unusual encoding on this system: %r" % enc)
+        loc = BaseLocator.from_url("../%s.xml" % fname)
+        self.assertEqual(loc.short_filename, fname)
+        self.assertEqual(loc.short_name, u"test_short_names \xE9 \xEA")
+
+    def test_win_xml_file(self):
+        try:
+            import ntpath
+            import nturl2path
+        except ImportError:
+            return self.skipTest("Do not have ntpath or nturl2path installed.")
+            
+        global systemType
+        old_sys_type = systemType
+        old_path = os.path
+        old_pathname2url = urllib.pathname2url
+        old_url2pathname = urllib.url2pathname
+        systemType = 'Windows'
+        os.path = ntpath
+        urllib.pathname2url = nturl2path.pathname2url
+        urllib.url2pathname = nturl2path.url2pathname
+        try:
+            loc_str = "C:\\vt?dir\\tmp\\test_win_xml_file.xml?workflow=3"
+            loc = BaseLocator.from_url(loc_str)
+            self.assertIsInstance(loc, XMLFileLocator)
+            self.assertEqual(loc.short_filename, "test_win_xml_file")
+            self.assertEqual(loc.kwargs['version_node'], 3)
+            self.assertEqual(
+                    loc.to_url(),
+                    "file:///C:/vt%3Fdir/tmp/test_win_xml_file.xml?workflow=3")
+        finally:
+            systemType = old_sys_type
+            os.path = old_path
+            urllib.pathname2url = old_pathname2url
+            urllib.url2pathname = old_url2pathname
+
+    def test_parse_db(self):
+        loc_str = "db://localhost:3306/vistrails?workflow=42"
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsInstance(loc, DBLocator)
+        self.assertEqual(loc.kwargs['version_node'], 42)
+        self.assertEqual(loc._host, "localhost")
+        self.assertEqual(loc._port, 3306)
+        self.assertEqual(loc._db, "vistrails")
+        self.assertEqual(loc.to_url(), loc_str)
+
+    def test_parse_bad_url(self):
+        loc_str = "http://blah.com/"
+        loc = BaseLocator.from_url(loc_str)
+        self.assertIsNone(loc)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/db/services/log.py b/vistrails/db/services/log.py
new file mode 100644
index 0000000..d5df8e6
--- /dev/null
+++ b/vistrails/db/services/log.py
@@ -0,0 +1,45 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBWorkflowExec
+
+def update_id_scope(log):
+    if hasattr(log, 'update_id_scope'):
+        log.update_id_scope()
+    else:
+        pass
+
+def update_ids(log):
+    for workflow_exec in log.db_workflow_execs:
+        workflow_exec.db_id = log.id_scope.getNewId(DBWorkflowExec.vtType)
diff --git a/vistrails/db/services/opm.py b/vistrails/db/services/opm.py
new file mode 100644
index 0000000..d5d00a9
--- /dev/null
+++ b/vistrails/db/services/opm.py
@@ -0,0 +1,780 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import sys
+from vistrails.core.system import get_vistrails_default_pkg_prefix, \
+    get_vistrails_basic_pkg_id
+import vistrails.db.services.io
+from vistrails.db.domain import DBOpmProcess, DBOpmArtifact, DBOpmUsed, \
+    DBOpmWasGeneratedBy, DBOpmProcessIdCause, DBOpmProcessIdEffect, \
+    DBOpmArtifactIdCause, DBOpmArtifactIdEffect, DBOpmRole, DBOpmAccountId, \
+    DBOpmAccount, DBOpmAccounts, DBOpmGraph, DBOpmArtifacts, \
+    DBOpmDependencies, DBOpmProcesses, DBOpmProcessValue, DBOpmArtifactValue, \
+    IdScope, DBGroupExec, DBLoopExec, DBModuleExec, DBOpmOverlaps, DBPort, \
+    DBConnection, DBGroup, DBPortSpec, DBOpmWasTriggeredBy, DBFunction, \
+    DBParameter
+from vistrails.db.services.vistrail import materializeWorkflow
+
+sys.path.append('/vistrails/src/trunk/vistrails')
+
+def create_process(item_exec, account, id_scope):
+    return DBOpmProcess(id='p' + str(id_scope.getNewId(DBOpmProcess.vtType)),
+                        value=DBOpmProcessValue(item_exec),
+                        accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_process_manual(p_str, account, id_scope):
+    item_exec = DBModuleExec(id=-1,
+                             module_name=p_str,
+                             module_id=-1,
+                             completed=1,
+                             )
+    return DBOpmProcess(id='p' + str(id_scope.getNewId(DBOpmProcess.vtType)),
+                        value=DBOpmProcessValue(item_exec),
+                        accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_artifact_from_filename(filename, account, id_scope):
+    parameter = DBParameter(id=-1,
+                            pos=0,
+                            type='%s:File' % get_vistrails_basic_pkg_id(),
+                            val=filename)
+    function = DBFunction(id=-1,
+                          name="file",
+                          pos=0,
+                          parameters=[parameter])
+    return DBOpmArtifact(id='a' + str(id_scope.getNewId(DBOpmArtifact.vtType)),
+                         value=DBOpmArtifactValue(function),
+                         accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_artifact_from_db_tuple(db_tuple, account, id_scope):
+    parameters = []
+    for db_str in db_tuple:
+        parameter = DBParameter(id=-1,
+                                pos=0,
+                                type='%s:String' % get_vistrails_basic_pkg_id(),
+                                val=db_str)
+        parameters.append(parameter)
+    function = DBFunction(id=-1,
+                          name="dbEntry",
+                          pos=0,
+                          parameters=parameters)
+    return DBOpmArtifact(id='a' + str(id_scope.getNewId(DBOpmArtifact.vtType)),
+                         value=DBOpmArtifactValue(function),
+                         accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_artifact_from_function(function, account, id_scope):
+    return DBOpmArtifact(id='a' + str(id_scope.getNewId(DBOpmArtifact.vtType)),
+                         value=DBOpmArtifactValue(function),
+                         accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_artifact_from_port_spec(port_spec, account, id_scope):
+    return DBOpmArtifact(id='a' + str(id_scope.getNewId(DBOpmArtifact.vtType)),
+                         value=DBOpmArtifactValue(port_spec),
+                         accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_used(process, artifact, account, id_scope):
+    return DBOpmUsed(effect=DBOpmProcessIdEffect(id=process.db_id),
+                     role=DBOpmRole(value="in"),
+                     cause=DBOpmArtifactIdCause(id=artifact.db_id),
+                     accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_was_generated_by(artifact, process, account, id_scope):
+    return DBOpmWasGeneratedBy(effect=DBOpmArtifactIdEffect(id=artifact.db_id),
+                               role=DBOpmRole(value="out"),
+                               cause=DBOpmProcessIdCause(id=process.db_id),
+                               accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_was_triggered_by(process1, process2, account, id_scope):
+    return DBOpmWasTriggeredBy(effect=DBOpmProcessIdEffect(id=process1.db_id),
+                               role=DBOpmRole(value="control"),
+                               cause=DBOpmProcessIdCause(id=process2.db_id),
+                               accounts=[DBOpmAccountId(id=account.db_id)])
+
+def create_account(depth, id_scope):
+    account_id = id_scope.getNewId(DBOpmAccount.vtType)
+    account = DBOpmAccount(id='acct' + str(account_id),
+                           value=str(depth))
+    return account
+
+def create_opm(workflow, version, log, reg):
+    id_scope = IdScope()
+    processes = []
+    # conn_artifacts = {}
+    artifacts = []
+    dependencies = []
+    accounts = []
+    depth_accounts = {}
+    file_artifacts = {}
+    db_artifacts = {}
+
+    def do_create_process(workflow, item_exec, account, module_processes):
+        process = create_process(item_exec, account, id_scope)
+        print 'adding process', process.db_id,
+        if hasattr(item_exec, 'db_module_name'):
+            print item_exec.db_module_name
+        elif hasattr(item_exec, 'db_group_nane'):
+            print item_exec.db_module_name
+        processes.append(process)
+        module = workflow.db_modules_id_index[item_exec.db_module_id]
+        module_processes[module.db_id] = (module, process)
+
+    def get_package(reg, pkg_identifier, pkg_version=''):
+        if not pkg_version:
+            # spin and get current package
+            for pkg in reg.db_packages:
+                if pkg.db_identifier == pkg_identifier:
+                    break
+                pkg = None
+        else:
+            pkg = reg.db_packages_identifier_index[(pkg_identifier,
+                                                    pkg_version)]
+        return pkg
+
+    def process_exec(item_exec, workflow, account, upstream_lookup,
+                     downstream_lookup, depth, conn_artifacts=None,
+                     function_artifacts=None, module_processes=None,
+                     in_upstream_artifacts={}, in_downstream_artifacts={},
+                     add_extras=False):
+
+        print 'in_upstream:', [(n, x.db_id) 
+                               for n, x_list in in_upstream_artifacts.iteritems() for x in x_list]
+        print 'in_downstream:', [(n, x.db_id)  
+                                 for n, x_list in in_downstream_artifacts.iteritems() for x in x_list]
+        # FIXME merge conn_artifacts and function_artifacts
+        # problem is that a conn_artifact is OUTPUT while function_artifact
+        # is INPUT
+        if conn_artifacts is None:
+            conn_artifacts = {}
+        if function_artifacts is None:
+            function_artifacts = {}
+        if module_processes is None:
+            module_processes = {}
+#         while item_exec.vtType == DBLoopExec.vtType:
+#             item_exec = item_exec.db_item_execs[0]
+        (module, process) = module_processes[item_exec.db_module_id]
+
+        def process_connection(conn):
+            source = conn.db_ports_type_index['source']
+            source_t = (source.db_moduleId, source.db_name)
+            in_cache = False
+            print '!!! processing', source_t
+            if source_t in conn_artifacts:
+                artifact = conn_artifacts[source_t]
+                in_cache = True
+            else:
+                # key off source module and port name
+                # get descriptor from registry and then port_spec
+                # store port_spec as artifact
+
+                if source.db_moduleId < 0:
+                    dest = conn.db_ports_type_index['destination']
+                    module = source.db_module
+                else:
+                    module = workflow.db_modules_id_index[source.db_moduleId]
+                print module.db_name, module.db_id
+
+                pkg = get_package(reg, module.db_package, module.db_version)
+
+                if not module.db_namespace:
+                    module_namespace = ''
+                else:
+                    module_namespace = module.db_namespace
+                module_desc = \
+                    pkg.db_module_descriptors_name_index[(module.db_name,
+                                                          module_namespace,
+                                                          '')]
+                # FIXME make work for module port_specs, too
+                # for example, a PythonSource with a given port in 
+                # module.db_portSpecs
+                port_spec = None
+                spec_t = (source.db_name, 'output')
+                if spec_t in module.db_portSpecs_name_index:
+                    port_spec = module.db_portSpecs_name_index[spec_t]
+                while port_spec is None and \
+                        module_desc.db_id != reg.db_root_descriptor_id:
+                    if spec_t in module_desc.db_portSpecs_name_index:
+                        port_spec = module_desc.db_portSpecs_name_index[spec_t]
+                    base_id = module_desc.db_base_descriptor_id
+
+                   # inefficient spin through db_packages but we do
+                   # not have the descriptors_by_id index that exists
+                   # on core.module_registry.ModuleRegistry here
+                    module_desc = None
+                    for pkg in reg.db_packages:
+                        if base_id in pkg.db_module_descriptors_id_index:
+                            module_desc = \
+                                pkg.db_module_descriptors_id_index[base_id]
+                            break
+                    if module_desc is None:
+                        raise KeyError("Cannot find base descriptor id %d" %
+                                       base_id)
+                    # pkg = get_package(reg, module_desc.db_package,
+                    #                   module_desc.db_package_version)
+                    # module_desc = pkg.db_module_descriptors_id_index[base_id]
+                if port_spec is None:
+                    port_spec = module_desc.db_portSpecs_name_index[spec_t]
+                print module_desc.db_name
+                
+                artifact = \
+                    create_artifact_from_port_spec(port_spec, account, id_scope)
+                artifacts.append(artifact)
+                print 'adding conn_artifact', artifact.db_id, source_t, \
+                    source.db_moduleName
+                conn_artifacts[source_t] = artifact
+            return (artifact, in_cache)
+
+        def process_map(module, found_input_ports, found_output_ports):
+            print "*** Processing Map"
+            if depth+1 in depth_accounts:
+                account = depth_accounts[depth+1]
+            else:
+                account = create_account(depth+1, id_scope)
+                accounts.append(account)
+                depth_accounts[depth+1] = account
+
+            # need to have process that extracts artifacts for each iteration
+            input_list_artifact = found_input_ports['InputList']
+            result_artifact = found_output_ports.get('Result', None)
+            input_port_list = \
+                eval(found_input_ports['InputPort'].db_parameters[0].db_val)
+            output_port = \
+                found_input_ports['OutputPort'].db_parameters[0].db_val
+
+            s_process = create_process_manual('Split', account, id_scope)
+            processes.append(s_process)
+            dependencies.append(create_used(s_process,
+                                            input_list_artifact,
+                                            account,
+                                            id_scope))
+            # need to have process that condenses artifacts from each iteration
+            if result_artifact is not None:
+                j_process = create_process_manual('Join', account, id_scope)
+                processes.append(j_process)
+            for loop_exec in item_exec.db_loop_execs:
+                loop_up_artifacts = {}
+                loop_down_artifacts = {}
+                for input_name in input_port_list:
+                    port_spec = DBPortSpec(id=-1,
+                                           name=input_name,
+                                           type='output')
+                    s_artifact = \
+                        create_artifact_from_port_spec(port_spec, account, 
+                                                       id_scope)
+                    artifacts.append(s_artifact)
+                    dependencies.append(create_was_generated_by(s_artifact,
+                                                                s_process,
+                                                                account,
+                                                                id_scope))
+                    if input_name not in loop_up_artifacts:
+                        loop_up_artifacts[input_name] = []
+                    loop_up_artifacts[input_name].append(s_artifact)
+
+                # process output_port
+                if loop_exec.db_completed == 1:
+                    port_spec = DBPortSpec(id=-1,
+                                           name=output_port,
+                                           type='output')
+                    o_artifact = \
+                            create_artifact_from_port_spec(port_spec, account, 
+                                                           id_scope)
+                    artifacts.append(o_artifact)
+                    if output_port not in loop_down_artifacts:
+                        loop_down_artifacts[output_port] = []
+                    loop_down_artifacts[output_port].append(o_artifact)
+
+                if result_artifact is not None:
+                    dependencies.append(create_used(j_process, o_artifact, 
+                                                    account, id_scope))
+                                                
+                # now process a loop_exec
+                for child_exec in loop_exec.db_item_execs:
+                    do_create_process(workflow, child_exec, account, 
+                                      module_processes)
+                for child_exec in loop_exec.db_item_execs:
+                    process_exec(child_exec, workflow, account, upstream_lookup,
+                                 downstream_lookup, depth+1, conn_artifacts,
+                                 function_artifacts, module_processes,
+                                 loop_up_artifacts, loop_down_artifacts, True)
+
+            # need to set Return artifact and connect j_process to it
+            if result_artifact is not None:
+                dependencies.append(create_was_generated_by(result_artifact,
+                                                            j_process,
+                                                            account,
+                                                            id_scope))
+
+        def process_group(module, found_input_ports, found_output_ports):
+            # identify depth and create new account if necessary
+            # recurse with new account
+            # need to link to upstream and downstream correctly
+            workflow = module.db_workflow
+            # run the whole upstream construction, etc, using this exec
+            # and the group's workflow
+            if depth+1 in depth_accounts:
+                account = depth_accounts[depth+1]
+            else:
+                account = create_account(depth+1, id_scope)
+                accounts.append(account)
+                depth_accounts[depth+1] = account
+            process_workflow(workflow, item_exec, account, 
+                             out_upstream_artifacts,
+                             out_downstream_artifacts, depth+1)            
+
+        def process_port_module(module, found_input_ports, found_output_ports):
+            port_name = found_input_ports['name'].db_parameters[0].db_val
+            if module.db_name == 'InputPort':
+                if port_name in in_upstream_artifacts:
+                    for artifact in in_upstream_artifacts[port_name]:
+                        dependencies.append(create_used(process, artifact,
+                                                        account, id_scope))
+            elif module.db_name == 'OutputPort':
+                if port_name in in_downstream_artifacts:
+                    for artifact in in_downstream_artifacts[port_name]:
+                        dependencies.append(create_was_generated_by(artifact,
+                                                                    process, 
+                                                                    account, 
+                                                                    id_scope))
+
+        def process_if_module(module, found_input_ports, found_output_ports):
+            print 'processing IFFFF'
+            # need to decide which path was taken?
+            # check which module was executed, then know which branch was
+            # taken?
+            true_conn = found_input_ports['TruePort']
+            false_conn = found_input_ports['FalsePort']
+            true_id = true_conn.db_ports_type_index['source'].db_moduleId
+            false_id = false_conn.db_ports_type_index['source'].db_moduleId
+            print '$$ TRUE ID:', true_id
+            print '$$ FALSE ID:', false_id
+            for x,y in module_processes.iteritems():
+                print x, ':', y
+            if true_id in module_processes:
+                cond_process = module_processes[true_id][1]
+            elif false_id in module_processes:
+                cond_process = module_processes[false_id][1]
+            else:
+                raise RuntimeError("cannot process if")
+            # FIXME: assume true for now
+            # eventually need to check which module_id was execed for this
+            # current item exec
+            dependencies.append(create_was_triggered_by(cond_process,
+                                                        process,
+                                                        account,
+                                                        id_scope))
+
+        if add_extras:
+            print '***adding extras'
+            out_upstream_artifacts = copy.copy(in_upstream_artifacts)
+            out_downstream_artifacts = copy.copy(in_downstream_artifacts)
+            for port_name, artifact_list in in_upstream_artifacts.iteritems():
+                for artifact in artifact_list:
+                    dependencies.append(create_used(process, artifact,
+                                                    account, id_scope))
+            for port_name, artifact_list in in_downstream_artifacts.iteritems():
+                for artifact in artifact_list:
+                    # conn_artifacts[(port_name, 'output')] = artifact
+                    dependencies.append(create_was_generated_by(artifact,
+                                                                process,
+                                                                account,
+                                                                id_scope))
+        else:
+            out_upstream_artifacts = {}
+            out_downstream_artifacts = {}
+
+
+        ctrl_flow_pkg = '%s.control_flow' % get_vistrails_default_pkg_prefix()
+        basic_pkg = get_vistrails_basic_pkg_id()
+        all_special_ports = {'%s:Map' % ctrl_flow_pkg:
+                                 [{'InputPort': False, 
+                                   'OutputPort': False, 
+                                   'InputList': True,
+                                   'FunctionPort': False},
+                                  {'Result': True},
+                                  process_map],
+                             '%s:Group' % basic_pkg:
+                                 [{},
+                                  {},
+                                  process_group],
+                             '%s:InputPort' % basic_pkg:
+                                 [{'name': False,
+                                   'spec': False,
+                                   'old_name': False},
+                                  {},
+                                  process_port_module],
+                             '%s:OutputPort' % basic_pkg:
+                                 [{'name': False,
+                                   'spec': False,
+                                   'old_name': False},
+                                  {},
+                                  process_port_module],
+                             '%s:If' % ctrl_flow_pkg:
+                                 [{'TruePort': False,
+                                   'FalsePort': False},
+                                  {},
+                                  process_if_module],
+                             }
+        
+        module_desc_str = module.db_package + ':' + module.db_name
+        special_ports = all_special_ports.get(module_desc_str, [{}, {}, None])
+        found_input_ports = {}
+        found_output_ports = {}
+        
+        # process used_files annotations
+        # process generated_tables annotations:
+        for annotation in item_exec.db_annotations:
+            def process_db_tuple(db_tuple):
+                db_tuple = (str(db_tuple[0]),) + db_tuple[1:]
+                if db_tuple not in db_artifacts:
+                    artifact = create_artifact_from_db_tuple(db_tuple,
+                                                             account,
+                                                             id_scope)
+                    artifacts.append(artifact)
+                    db_artifacts[db_tuple] = artifact
+                else:
+                    artifact = db_artifacts[db_tuple]
+                    if int(artifact.db_accounts[0].db_id[4:]) > \
+                            int(account.db_id[4:]):
+                        artifact.db_accounts[0] = account
+                return artifact
+
+            if annotation.db_key == 'used_files':
+                used_files = eval(annotation.db_value)
+                for fname in used_files:
+                    if fname not in file_artifacts:
+                        artifact = create_artifact_from_filename(fname,
+                                                                 account,
+                                                                 id_scope)
+                        artifacts.append(artifact)
+                        file_artifacts[fname] = artifact
+                    else:
+                        artifact = file_artifacts[fname]
+                        if int(artifact.db_accounts[0].db_id[4:]) > \
+                                int(account.db_id[4:]):
+                            artifact.db_accounts[0] = account
+                    dependencies.append(create_used(process, artifact,
+                                                    account, id_scope))
+            elif annotation.db_key == 'generated_tables':
+                generated_tables = eval(annotation.db_value)
+                for db_tuple in generated_tables:
+                    artifact = process_db_tuple(db_tuple)
+                    dependencies.append(create_was_generated_by(artifact,
+                                                                process,
+                                                                account,
+                                                                id_scope))
+            elif annotation.db_key == 'used_tables':
+                used_tables = eval(annotation.db_value)
+                for db_tuple in used_tables:
+                    artifact = process_db_tuple(db_tuple)
+                    dependencies.append(create_used(process, artifact,
+                                                    account, id_scope))
+
+        # process functions
+        for function in module.db_functions:
+            # FIXME let found_input_ports, found_output_ports store lists?
+            if function.db_name in special_ports[0]:
+                if not special_ports[0][function.db_name]:
+                    found_input_ports[function.db_name] = function
+                    continue
+            function_t = (module.db_id, function.db_name)
+            if function_t in function_artifacts:
+                artifact = function_artifacts[function_t]
+                if int(artifact.db_accounts[0].db_id[4:]) > \
+                        int(account.db_id[4:]):
+                    artifact.db_accounts[0] = account
+            else:
+                artifact = create_artifact_from_function(function, 
+                                                         account,
+                                                         id_scope)
+                print 'adding artifact', artifact.db_id
+                artifacts.append(artifact)
+                function_artifacts[function_t] = artifact
+            if function.db_name in special_ports[0]:
+                found_input_ports[function.db_name] = artifact
+            if function.db_name not in out_upstream_artifacts:
+                out_upstream_artifacts[function.db_name] = []
+            out_upstream_artifacts[function.db_name].append(artifact)
+            dependencies.append(create_used(process, artifact, account,
+                                            id_scope))
+
+        # process connections
+        if module.db_id in upstream_lookup:
+            for conns in upstream_lookup[module.db_id].itervalues():
+                for conn in conns:
+                    dest = conn.db_ports_type_index['destination']
+                    if dest.db_name in special_ports[0]:
+                        if not special_ports[0][dest.db_name]:
+                            found_input_ports[dest.db_name] = conn
+                            continue
+                    (artifact, in_cache) = process_connection(conn)
+                    if dest.db_name in special_ports[0]:
+                        found_input_ports[dest.db_name] = artifact
+                    if dest.db_name not in out_upstream_artifacts:
+                        out_upstream_artifacts[dest.db_name] = []
+                    out_upstream_artifacts[dest.db_name].append(artifact)
+                    print 'adding dependency (pa)', process.db_id, \
+                        artifact.db_id
+                    dependencies.append(create_used(process, artifact, 
+                                                    account, id_scope))
+
+        if item_exec.db_completed == 1:
+            if module.db_id in downstream_lookup:
+                # check if everything completed successfully for this?
+                for conns in downstream_lookup[module.db_id].itervalues():
+                    for conn in conns:
+                        source = conn.db_ports_type_index['source']
+                        if source.db_name in special_ports[1]:
+                            if not special_ports[1][source.db_name]:
+                                found_output_ports[source.db_name] = conn
+                                continue
+                        dest = conn.db_ports_type_index['destination']
+                        dest_module = \
+                            workflow.db_modules_id_index[dest.db_moduleId]
+                        dest_desc_str = dest_module.db_package + ':' + \
+                            dest_module.db_name
+                        dest_special_ports = all_special_ports.get(dest_desc_str,
+                                                                   [{}, {}, None])
+                        if dest.db_name in dest_special_ports[0] and \
+                                not dest_special_ports[0][dest.db_name]:
+                            print 'skipping', dest.db_name
+                            continue
+                        (artifact, in_cache) = process_connection(conn)
+                        if not in_cache:
+                            if source.db_name in special_ports[1]:
+                                found_output_ports[source.db_name] = artifact
+                            if source.db_name not in out_downstream_artifacts:
+                                out_downstream_artifacts[source.db_name] = []
+                            out_downstream_artifacts[source.db_name].append(artifact)
+                            print 'adding dependency (ap)', artifact.db_id, \
+                                process.db_id
+                            dependencies.append(create_was_generated_by(artifact, 
+                                                                        process, 
+                                                                        account,
+                                                                        id_scope))
+
+        if special_ports[2] is not None:
+            special_ports[2](module, found_input_ports, found_output_ports)
+
+    def process_workflow(workflow, parent_exec, account, upstream_artifacts={},
+                         downstream_artifacts={}, depth=0, top_version=False):
+        # create process for each module_exec
+        # for each module, find parameters and upstream connections
+        # tie them in
+        # each connection's source port is 
+        # associated with a transient data item
+        # use wasDerivedBy and used relationships to tie things together
+        # check run-time annotations?
+        print 'processing workflow', parent_exec
+
+        upstream_lookup = {}
+        downstream_lookup = {}
+        for connection in workflow.db_connections:
+            source = connection.db_ports_type_index['source']
+            if source.db_moduleId not in downstream_lookup:
+                downstream_lookup[source.db_moduleId] = {}
+            if source.db_name not in downstream_lookup[source.db_moduleId]:
+                downstream_lookup[source.db_moduleId][source.db_name] = []
+            downstream_lookup[source.db_moduleId][source.db_name].append(connection)
+
+            dest = connection.db_ports_type_index['destination']
+            if dest.db_moduleId not in upstream_lookup:
+                upstream_lookup[dest.db_moduleId] = {}
+            if dest.db_name not in upstream_lookup[dest.db_moduleId]:
+                upstream_lookup[dest.db_moduleId][dest.db_name] = []
+            upstream_lookup[dest.db_moduleId][dest.db_name].append(connection)
+
+        conn_artifacts = {}
+        function_artifacts = {}
+        module_processes = {}
+        print '  upstream_lookup:'
+        lookup = upstream_lookup
+        for id, name_list in lookup.iteritems():
+            print '    ', id, ':', name_list.keys()
+
+        print '  downstream_lookup:'
+        lookup = downstream_lookup
+        for id, name_list in lookup.iteritems():
+            print '    ', id, ':', name_list.keys()
+            
+        # print '  upstream_lookup:', upstream_lookup
+        # print '  downstream_lookup:', downstream_lookup
+        if top_version:
+            for workflow_exec in parent_exec.db_workflow_execs:
+                if workflow_exec.db_parent_version != version:
+                    continue
+                conn_artifacts = {}
+                function_artifacts = {}
+                module_processes = {}
+                upstream_artifacts = {}
+                downstream_artifacts = {}
+                for item_exec in workflow_exec.db_item_execs:
+                    do_create_process(workflow, item_exec, account, 
+                                      module_processes)
+                for item_exec in workflow_exec.db_item_execs:
+                    process_exec(item_exec, workflow, account,
+                                 upstream_lookup, downstream_lookup,
+                                 depth, conn_artifacts, function_artifacts,
+                                 module_processes,
+                                 upstream_artifacts, downstream_artifacts)
+        else:
+            for item_exec in parent_exec.db_item_execs:
+                do_create_process(workflow, item_exec, account, 
+                                  module_processes)
+            for item_exec in parent_exec.db_item_execs:
+                process_exec(item_exec, workflow, account, upstream_lookup,
+                             downstream_lookup, depth, conn_artifacts,
+                             function_artifacts, module_processes,
+                             upstream_artifacts, downstream_artifacts)
+                
+    account_id = id_scope.getNewId(DBOpmAccount.vtType)
+    account = DBOpmAccount(id='acct' + str(account_id),
+                           value=str(0))
+    accounts.append(account)
+    depth_accounts[0] = account
+    process_workflow(workflow, log, account, {}, {}, 0, True) 
+
+    #print processes
+    #print dependencies
+    max_depth = max(depth_accounts)
+    def add_finer_depths(objs, exclude_groups=False, exclude_deps=False, 
+                         p_ids=set()):
+        new_p_ids = []
+        for obj in objs:
+            can_update=True
+            if exclude_groups:
+                if obj.db_value.db_value.vtType == DBGroupExec.vtType:
+                    new_p_ids.append(obj.db_id)
+                    can_update = False
+                elif obj.db_value.db_value.vtType == DBModuleExec.vtType and \
+                        len(obj.db_value.db_value.db_loop_execs) > 0:
+                    new_p_ids.append(obj.db_id)
+                    can_update = False
+                
+            if exclude_deps:
+                if ((obj.vtType == DBOpmWasGeneratedBy.vtType and
+                     obj.db_cause.db_id in p_ids) or 
+                    (obj.vtType == DBOpmUsed.vtType and
+                     obj.db_effect.db_id in p_ids)):
+                    can_update = False
+            if can_update:
+                min_depth = int(obj.db_accounts[0].db_id[4:])
+                for i in xrange(min_depth+1, max_depth+1):
+                    obj.db_add_account(DBOpmAccountId(id='acct' + str(i)))
+        return new_p_ids
+
+    # FIXME: also exclude group dependencies (used, wasGeneratedBy)...
+    p_ids = add_finer_depths(processes, True)
+    print p_ids
+    add_finer_depths(artifacts)
+    add_finer_depths(dependencies, False, True, set(p_ids))
+
+    overlaps = []
+    for i in xrange(max_depth+1):
+        for j in xrange(i+1, max_depth+1):
+            ids = [DBOpmAccountId(id='acct' + str(i)),
+                   DBOpmAccountId(id='acct' + str(j))]
+            overlaps.append(DBOpmOverlaps(opm_account_ids=ids))
+
+    opm_graph = DBOpmGraph(accounts=DBOpmAccounts(accounts=accounts,
+                                                  opm_overlapss=overlaps),
+                           processes=DBOpmProcesses(processs=processes),
+                           artifacts=\
+                               DBOpmArtifacts(artifacts=artifacts),
+                           dependencies=\
+                               DBOpmDependencies(dependencys=dependencies),
+                           )
+    return opm_graph
+
+def add_module_descriptor_index(registry):
+    registry.db_module_descriptors_id_index = {}
+    for package in registry.db_packages:
+        for module_descriptor in package.db_module_descriptors:
+            registry.db_module_descriptors_id_index[module_descriptor.db_id] =\
+                module_descriptor
+
+def add_group_portSpecs_index(workflow):
+    basic_pkg = get_vistrails_basic_pkg_id()
+    def process_group(group):
+        def get_port_name(module):
+            port_name = None
+            for function in module.db_functions:
+                if function.db_name == 'name':
+                    port_name = function.db_parameters[0].db_val
+            return port_name
+        g_workflow = group.db_workflow
+        group.db_portSpecs_name_index = {}
+        for module in g_workflow.db_modules:
+            if module.db_name == 'InputPort' and module.db_package == basic_pkg:
+                port_name = get_port_name(module)
+                # FIXME add sigstring to DBPortSpec
+                group.db_portSpecs_name_index[(port_name, 'input')] = \
+                    DBPortSpec(id=-1,
+                               name=port_name,
+                               type='input')
+            elif module.db_name == 'OutputPort' and \
+                    module.db_package == basic_package:
+                port_name = get_port_name(module)
+                # FIXME add sigstring to DBPortSpec
+                group.db_portSpecs_name_index[(port_name, 'output')] = \
+                    DBPortSpec(id=-1,
+                               name=port_name,
+                               type='output')
+            elif module.db_name == 'Group' and module.db_package == basic_pkg:
+                process_group(module)
+
+    for module in workflow.db_modules:
+        if module.vtType == DBGroup.vtType:
+            process_group(module)
+
+def create_opm_from_vistrail(vistrail, version, log, registry):
+    workflow = materializeWorkflow(vistrail, version)
+    add_group_portSpecs_index(workflow)
+    add_module_descriptor_index(registry)
+    return create_opm(workflow, version, log, registry)
+
+def run(vistrail_xml, version, log_xml, registry_xml, output_fname):
+    from vistrails.db.persistence import DAOList
+
+    vistrail = vistrails.db.services.io.open_vistrail_from_xml(vistrail_xml)
+    log = vistrails.db.services.io.open_log_from_xml(log_xml)
+    registry = vistrails.db.services.io.open_registry_from_xml(registry_xml)
+    opm_graph = create_opm_from_vistrail(vistrail, int(version), log, registry)
+    dao_list = DAOList()
+    dao_list.save_to_xml(opm_graph, output_fname, {})
+
+if __name__ == '__main__':
+    if len(sys.argv) < 5:
+        print "Usage: python %s <vt_xml> <version> <log_xml> <registry_xml> <out_xml>" % sys.argv[0]
+        sys.exit(1)
+    run(*sys.argv[1:])
+                    
diff --git a/vistrails/db/services/prov.py b/vistrails/db/services/prov.py
new file mode 100644
index 0000000..61999da
--- /dev/null
+++ b/vistrails/db/services/prov.py
@@ -0,0 +1,585 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import sys
+import os
+#sys.path.append(os.getenv('VISTRAILS', ''))
+import vistrails.db.services.io
+from vistrails.db.domain import DBProvDocument, DBProvEntity, DBProvActivity, \
+    DBProvAgent, DBProvGeneration, DBProvUsage, DBProvAssociation, \
+    DBVtConnection, DBRefProvEntity, DBRefProvPlan, DBRefProvActivity, \
+    DBRefProvAgent, DBIsPartOf, IdScope, DBGroupExec, DBLoopExec, DBModuleExec, \
+    DBWorkflowExec, DBFunction, DBParameter, DBGroup, DBAbstraction
+from vistrails.db.services.vistrail import materializeWorkflow
+
+def create_prov_document(entities, activities, agents, connections, usages,
+                         generations, associations):
+    return DBProvDocument(prov_entitys=entities,
+                          prov_activitys=activities,
+                          prov_agents=agents,
+                          vt_connections=connections,
+                          prov_usages=usages,
+                          prov_generations=generations,
+                          prov_associations=associations)
+
+def create_prov_entity_from_workflow(id_scope, workflow):
+    return DBProvEntity(id='e' + str(id_scope.getNewId(DBProvEntity.vtType)),
+                        vt_id=workflow.db_id,
+                        prov_type='prov:Plan',
+                        prov_label=workflow._db_name,
+                        prov_value=None,
+                        vt_type='vt:workflow',
+                        vt_desc=None,
+                        vt_package=None,
+                        vt_version=workflow._db_version,
+                        vt_cache=None,
+                        vt_location_x=None,
+                        vt_location_y=None,
+                        is_part_of=None)
+
+def create_prov_entity_from_module(id_scope, module, is_part_of):
+
+    # getting module label defined by the user
+    desc = None
+    for db_annotation in module.db_annotations:
+        if db_annotation._db_key == '__desc__':
+            desc = db_annotation._db_value
+            break
+    
+    return DBProvEntity(id='e' + str(id_scope.getNewId(DBProvEntity.vtType)),
+                        vt_id=module._db_id,
+                        prov_type='prov:Plan',
+                        prov_label=module.db_name,
+                        prov_value=None,
+                        vt_type='vt:module',
+                        vt_desc=desc,
+                        vt_package=module.db_package,
+                        vt_version=module.db_version,
+                        vt_cache=module.db_cache,
+                        vt_location_x=module.db_location._db_x,
+                        vt_location_y=module.db_location._db_y,
+                        is_part_of=is_part_of)
+    
+def create_is_part_of(prov_object):
+    return DBIsPartOf(prov_ref=prov_object._db_id)
+    
+def create_prov_entity_from_group(id_scope, group, is_part_of):
+
+    # getting group label defined by the user
+    desc = None
+    for db_annotation in group.db_annotations:
+        if db_annotation._db_key == '__desc__':
+            desc = db_annotation._db_value
+            break
+    
+    return DBProvEntity(id='e' + str(id_scope.getNewId(DBProvEntity.vtType)),
+                        vt_id=group.db_id,
+                        prov_type='prov:Plan',
+                        prov_label=group.db_name,
+                        prov_value=None,
+                        vt_type='vt:group',
+                        vt_desc=desc,
+                        vt_package=None,
+                        vt_version=None,
+                        vt_cache=group.db_cache,
+                        vt_location_x=group.db_location._db_x,
+                        vt_location_y=group.db_location._db_y,
+                        is_part_of=is_part_of)
+    
+def create_prov_entity_from_abstraction(id_scope, abstraction, is_part_of):
+
+    # getting abstraction label defined by the user
+    desc = None
+    for db_annotation in abstraction.db_annotations:
+        if db_annotation._db_key == '__desc__':
+            desc = db_annotation._db_value
+            break
+    
+    return DBProvEntity(id='e' + str(id_scope.getNewId(DBProvEntity.vtType)),
+                        vt_id=abstraction.db_id,
+                        prov_type='prov:Plan',
+                        prov_label=abstraction.db_name,
+                        prov_value=None,
+                        vt_type='vt:subworkflow',
+                        vt_desc=desc,
+                        vt_package=None,
+                        vt_version=None,
+                        vt_cache=abstraction.db_cache,
+                        vt_location_x=abstraction.db_location._db_x,
+                        vt_location_y=abstraction.db_location._db_y,
+                        is_part_of=is_part_of)
+    
+def create_prov_entity_from_function(id_scope, function):
+    values = []
+    types = []
+    aliases = []
+    for parameter in function._db_parameters:
+        values.append(str(parameter._db_val))
+        types.append(str(parameter._db_type))
+        if parameter._db_alias:
+            aliases.append(parameter._db_alias)
+        else:
+            aliases.append('None')
+        
+    value = ''
+    type = ''
+    alias = None
+    if len(values) == 1:
+        value = values[0]
+        type = types[0]
+        alias = aliases[0]
+    elif len(values) > 1:
+        value = '(' + ','.join(values) + ')'
+        type = '(' + ','.join(types) + ')'
+        alias = '(' + ','.join(aliases) + ')'
+    
+    return DBProvEntity(id='e' + str(id_scope.getNewId(DBProvEntity.vtType)),
+                        vt_id=function.db_id,
+                        prov_type='vt:data',
+                        prov_label=function.db_name,
+                        prov_value=value,
+                        vt_type=type,
+                        vt_desc=alias,
+                        vt_package=None,
+                        vt_version=None,
+                        vt_cache=None,
+                        vt_location_x=None,
+                        vt_location_y=None,
+                        is_part_of=None)
+    
+def create_prov_entity_for_data(id_scope, conn):
+    return DBProvEntity(id='e' + str(id_scope.getNewId(DBProvEntity.vtType)),
+                        vt_id=conn.db_id,
+                        prov_type='vt:data',
+                        prov_label=None,
+                        prov_value=None,
+                        vt_type=None,
+                        vt_desc=None,
+                        vt_package=None,
+                        vt_version=None,
+                        vt_cache=None,
+                        vt_location_x=None,
+                        vt_location_y=None,
+                        is_part_of=None)
+    
+def create_vt_connection(id_scope, source, dest, mapping):
+    return DBVtConnection(id='c' + str(id_scope.getNewId(DBVtConnection.vtType)),
+                          vt_source=mapping[source._db_moduleId]._db_id,
+                          vt_dest=mapping[dest._db_moduleId]._db_id,
+                          vt_source_port=source.db_name,
+                          vt_dest_port=dest.db_name,
+                          vt_source_signature=source._db_signature,
+                          vt_dest_signature=dest._db_signature)
+    
+def create_prov_agent_from_user(id_scope, user):
+    return DBProvAgent(id='ag' + str(id_scope.getNewId(DBProvAgent.vtType)),
+                       vt_id=None,
+                       prov_type='prov:Person',
+                       prov_label=user,
+                       vt_machine_os=None,
+                       vt_machine_architecture=None,
+                       vt_machine_processor=None,
+                       vt_machine_ram=None)
+    
+def create_prov_agent_from_machine(id_scope, machine):
+    return DBProvAgent(id='ag' + str(id_scope.getNewId(DBProvAgent.vtType)),
+                       vt_id=machine.db_id,
+                       prov_type='vt:machine',
+                       prov_label=machine.db_name,
+                       vt_machine_os=machine._db_os,
+                       vt_machine_architecture=machine._db_architecture,
+                       vt_machine_processor=machine._db_processor,
+                       vt_machine_ram=machine._db_ram)
+    
+def create_prov_association(prov_activity, prov_agent, prov_entity):
+    ref_prov_activity = DBRefProvActivity(prov_ref=prov_activity._db_id)
+    ref_prov_agent = DBRefProvAgent(prov_ref=prov_agent._db_id)
+    ref_prov_entity = DBRefProvPlan(prov_ref=prov_entity._db_id)
+    
+    return DBProvAssociation(prov_activity=ref_prov_activity,
+                             prov_agent=ref_prov_agent,
+                             prov_plan=ref_prov_entity,
+                             prov_role=None)
+    
+def create_prov_activity_from_wf_exec(id_scope, wf_exec):
+    return DBProvActivity(id='a' + str(id_scope.getNewId(DBProvActivity.vtType)),
+                          vt_id=wf_exec._db_id,
+                          startTime=wf_exec._db_ts_start,
+                          endTime=wf_exec._db_ts_end,
+                          vt_type='vt:wf_exec',
+                          vt_cached=None,
+                          vt_completed=wf_exec._db_completed,
+                          vt_machine_id=None,
+                          vt_error=None,
+                          is_part_of=None)
+    
+def create_prov_activity_from_exec(id_scope, module_exec, machine_id, is_part_of):
+    type = ''
+    if module_exec.vtType == DBModuleExec.vtType:
+        type = 'vt:module_exec'
+    elif module_exec.vtType == DBGroupExec.vtType:
+        type = 'vt:group_exec'
+    else:
+        # something is wrong...
+        pass
+    return DBProvActivity(id='a' + str(id_scope.getNewId(DBProvActivity.vtType)),
+                          vt_id=module_exec._db_id,
+                          startTime=module_exec._db_ts_start,
+                          endTime=module_exec._db_ts_end,
+                          vt_type=type,
+                          vt_cached=module_exec._db_cached,
+                          vt_completed=module_exec._db_completed,
+                          vt_machine_id=machine_id,
+                          vt_error=module_exec._db_error,
+                          is_part_of=is_part_of)
+    
+def create_prov_usage(prov_activity, prov_entity):
+    ref_prov_activity = DBRefProvActivity(prov_ref=prov_activity._db_id)
+    ref_prov_entity = DBRefProvEntity(prov_ref=prov_entity._db_id)
+    
+    return DBProvUsage(prov_activity=ref_prov_activity,
+                       prov_entity=ref_prov_entity,
+                       prov_role=None)
+    
+def create_prov_generation(prov_entity, prov_activity):
+    ref_prov_entity = DBRefProvEntity(prov_ref=prov_entity._db_id)
+    ref_prov_activity = DBRefProvActivity(prov_ref=prov_activity._db_id)
+    
+    return DBProvGeneration(prov_entity=ref_prov_entity,
+                            prov_activity=ref_prov_activity,
+                            prov_role=None)
+
+def create_prov(workflow, version, log):
+    id_scope = IdScope()
+    entities = []
+    activities = []
+    agents = []
+    connections = []
+    usages = []
+    generations = []
+    associations = []
+    
+    # mapping between VT ids and PROV objects
+    entities_map = {}
+    agents_map = {}
+    
+    # mapping between module ids and their functions
+    module_functions = {}
+    
+    # mapping between module ids and module objects
+    module_list = {}
+    
+    # mapping between module ids and source connections
+    source_conn = {}
+    
+    # mapping between module ids and destination connections
+    dest_conn = {}
+    
+    # mapping between connection ids and PROV entities for data
+    prov_data_conn = {}
+    
+    # mapping between function ids and their PROV entities
+    prov_functions = {}
+    
+    # mapping of machine ids to corresponding PROV agents
+    machines = {}
+    
+    ############################################################################
+    def get_modules_and_conn(prov_workflow, workflow):
+        
+        # modules
+        for module in workflow._db_modules:
+#            print "Entity name:", module.name
+#            print module.id
+
+            module_list[module._db_id] = module
+            
+            # group
+            if module.vtType == DBGroup.vtType:
+                vt_part = create_is_part_of(prov_workflow)
+                prov_group = create_prov_entity_from_group(id_scope=id_scope,
+                                                           group=module,
+                                                           is_part_of=vt_part)
+                entities_map[module._db_id] = prov_group
+                entities.append(prov_group)
+                get_modules_and_conn(prov_group, module.db_workflow)
+            
+            # abstraction (subworkflow)
+            elif module.vtType == DBAbstraction.vtType:
+                vt_part = create_is_part_of(prov_workflow)
+                prov_abstraction = create_prov_entity_from_abstraction(id_scope=id_scope,
+                                                                       abstraction=module,
+                                                                       is_part_of=vt_part)
+                entities_map[module._db_id] = prov_abstraction
+                entities.append(prov_abstraction)
+                #get_modules_and_conn(prov_abstraction, module.db_workflow)
+            
+            # module
+            else:
+                vt_part = create_is_part_of(prov_workflow)
+                prov_module = create_prov_entity_from_module(id_scope=id_scope,
+                                                             module=module,
+                                                             is_part_of=vt_part)
+                entities_map[module._db_id] = prov_module
+                entities.append(prov_module)
+                
+            module_functions[module._db_id] = module._db_functions
+            for function in module._db_functions:
+                prov_data = create_prov_entity_from_function(id_scope, function)
+                prov_functions[function.db_id] = prov_data
+        
+        # connections
+        for conn in workflow._db_connections:
+            # storing information about connections
+            # used to create entities for input and output data
+            source = conn.db_ports_type_index['source']
+            dest = conn.db_ports_type_index['destination']
+            if not source_conn.has_key(source._db_moduleId):
+                source_conn[source._db_moduleId] = []
+            if not dest_conn.has_key(dest._db_moduleId):
+                dest_conn[dest._db_moduleId] = []
+            source_conn[source._db_moduleId].append(conn)
+            dest_conn[dest._db_moduleId].append(conn)
+            
+            prov_data = create_prov_entity_for_data(id_scope, conn)
+            prov_data_conn[conn.db_id] = [prov_data, False]
+            
+            vt_connection = create_vt_connection(id_scope, source, dest, entities_map)
+            connections.append(vt_connection)
+            
+        return True
+    ############################################################################
+
+    def get_execs(exec_, parent_exec, prov_agent):
+        
+        # module or group execution
+        if exec_.vtType != DBLoopExec.vtType:
+            
+#            print "Exec name:", exec_.module_name
+#            print exec_.module_id
+
+            # machine (PROV agent)
+            machine_id = None
+#            prov_machine = machines[exec_.machine_id][0]
+#            machine_id = prov_machine._db_id
+#            if not machines[exec_.machine_id][1]:
+#                agents.append(prov_machine)
+#                machines[exec_.machine_id][1] = True
+            
+            # PROV activity
+            vt_part = create_is_part_of(parent_exec)
+            prov_activity = create_prov_activity_from_exec(id_scope,
+                                                           exec_,
+                                                           machine_id,
+                                                           vt_part)
+            
+            try:
+                functions = module_functions[exec_._db_module_id]
+            except:
+                activities.append(prov_activity)
+                return True
+                
+            for function in functions:
+                prov_data = prov_functions[function.db_id]
+                
+                prov_usage = create_prov_usage(prov_activity, prov_data)
+                usages.append(prov_usage)
+                
+            if dest_conn.has_key(exec_._db_module_id):
+                connections = dest_conn[exec_._db_module_id]
+                for connection in connections:
+                    prov_input_data, inserted = prov_data_conn[connection.db_id]
+                    if not inserted:
+                        entities.append(prov_input_data)
+                        prov_data_conn[connection.db_id][1] = True
+                    
+                    prov_usage = create_prov_usage(prov_activity, prov_input_data)
+                    usages.append(prov_usage)
+                
+            if (prov_activity._db_vt_error == None) or (prov_activity._db_vt_error == ''):
+                if source_conn.has_key(exec_._db_module_id):
+                    connections = source_conn[exec_._db_module_id]
+                    for connection in connections:
+                        prov_output_data, inserted = prov_data_conn[connection.db_id]
+                        if not inserted:
+                            entities.append(prov_output_data)
+                            prov_data_conn[connection.db_id][1] = True
+                            
+                        prov_generation = create_prov_generation(prov_output_data, prov_activity)
+                        generations.append(prov_generation)
+            
+            activities.append(prov_activity)
+            
+            # PROV entity associated
+            prov_module_entity = entities_map[exec_._db_module_id]
+            prov_association = create_prov_association(prov_activity, prov_agent, prov_module_entity)
+            associations.append(prov_association)
+            
+            if exec_.vtType == DBModuleExec.vtType:
+                for loop_exec in exec_._db_loop_execs:
+                    get_execs(loop_exec, prov_activity, prov_agent)
+            elif exec_.vtType == DBGroupExec.vtType:
+                for item in exec_._db_item_execs:
+                    get_execs(item, prov_activity, prov_agent)
+            else:
+                # something is wrong...
+                pass
+            
+        # loop execution
+        elif exec_.vtType == DBLoopExec.vtType:
+            # here, the parent execution is related to the ControlFlow:Map module
+            # TODO: should get the input values from Map, and create Function +
+            # Parameter?
+            
+            # there must be only one item exec per loop exec - otherwise, something
+            # is wrong
+            item_exec = exec_.item_execs[0]
+            get_execs(item_exec, parent_exec, prov_agent)
+        
+        else:
+            # something is wrong...
+            pass
+        
+        return True
+    ############################################################################
+    
+    # workflow
+    prov_workflow = create_prov_entity_from_workflow(id_scope, workflow)
+    entities_map[workflow.db_id] = prov_workflow
+    entities.append(prov_workflow)
+    
+    # getting modules and connections 
+    get_modules_and_conn(prov_workflow, workflow)
+    
+    # storing input data
+    for id in prov_functions:
+        entities.append(prov_functions[id])
+    
+    # machines
+    for machine in log._db_machines:
+        machines[machine.db_id] = (create_prov_agent_from_machine(id_scope, machine), False)
+    
+    # executions
+    for exec_ in log._db_workflow_execs:
+        if exec_._db_parent_version != version:
+            continue
+        prov_agent = None
+        if exec_._db_user not in agents_map:
+            prov_agent = create_prov_agent_from_user(id_scope, exec_._db_user)
+            agents_map[exec_._db_user] = prov_agent
+            agents.append(prov_agent)
+        else:
+            prov_agent = agents_map[exec_._db_user]
+        
+        # creating PROV activity
+        prov_activity = create_prov_activity_from_wf_exec(id_scope, exec_)
+        activities.append(prov_activity)
+        
+        # creating association with PROV entity
+        prov_association = create_prov_association(prov_activity, prov_agent, prov_workflow)
+        
+        for item in exec_._db_item_execs:
+            get_execs(item, prov_activity, prov_agent)
+    
+    # PROV Document
+    return create_prov_document(entities=entities,
+                                activities=activities,
+                                agents=agents,
+                                connections=connections,
+                                usages=usages,
+                                generations=generations,
+                                associations=associations)
+    
+def add_group_portSpecs_index(workflow):
+    basic_pkg = get_vistrails_basic_pkg_id()
+    def process_group(group):
+        def get_port_name(module):
+            port_name = None
+            for function in module._db_functions:
+                if function.db_name == 'name':
+                    port_name = function.db_parameters[0].db_val
+            return port_name
+        g_workflow = group.db_workflow
+        group.db_portSpecs_name_index = {}
+        for module in g_workflow.db_modules:
+            if module.db_name == 'InputPort' and module.db_package == basic_pkg:
+                port_name = get_port_name(module)
+                # FIXME add sigstring to DBPortSpec
+                group.db_portSpecs_name_index[(port_name, 'input')] = \
+                    DBPortSpec(id=-1,
+                               name=port_name,
+                               type='input')
+            elif module.db_name == 'OutputPort' and \
+                    module.db_package == basic_pkg:
+                port_name = get_port_name(module)
+                # FIXME add sigstring to DBPortSpec
+                group.db_portSpecs_name_index[(port_name, 'output')] = \
+                    DBPortSpec(id=-1,
+                               name=port_name,
+                               type='output')
+            elif module.db_name == 'Group' and module.db_package == basic_pkg:
+                process_group(module)
+
+    for module in workflow.db_modules:
+        if module.vtType == DBGroup.vtType:
+            process_group(module)
+    
+def create_prov_from_vistrail(vistrail, version, log):
+    workflow = materializeWorkflow(vistrail, version)
+    add_group_portSpecs_index(workflow)
+    return create_prov(workflow, version, log)
+    
+def run(vistrail_xml, version, log_xml, output_fname):
+    from vistrails.db.persistence import DAOList
+    from vistrails.core.vistrail.vistrail import Vistrail
+    import vistrails.db.services.io
+    
+    vistrail = vistrails.db.services.io.open_vistrail_from_xml(vistrail_xml)
+    log = vistrails.db.services.io.open_log_from_xml(log_xml, was_appended=True)
+    version_id = vistrail.db_get_actionAnnotation_by_key((Vistrail.TAG_ANNOTATION, version)).db_action_id
+    prov_document = create_prov_from_vistrail(vistrail, int(version_id), log)
+    dao_list = DAOList()
+    tags = {'xmlns:prov': 'http://www.w3.org/ns/prov#',
+            'xmlns:dcterms': 'http://purl.org/dc/terms/',
+            'xmlns:vt': 'http://www.vistrails.org/registry.xsd',
+            }
+    dao_list.save_to_xml(prov_document, output_fname, tags)
+
+if __name__ == '__main__':
+    if len(sys.argv) < 4:
+        print "Usage: python %s <vt_xml> <version> <log_xml> <out_xml>" % sys.argv[0]
+        sys.exit(1)
+    run(*sys.argv[1:])
+
diff --git a/vistrails/db/services/query.py b/vistrails/db/services/query.py
new file mode 100644
index 0000000..9861e94
--- /dev/null
+++ b/vistrails/db/services/query.py
@@ -0,0 +1,262 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db import VistrailsDBException
+from vistrails.db.services.io import open_db_connection, close_db_connection, get_db_lib
+
+def runWorkflowQuery(config, vistrail=None, version=None, fromTime=None,
+        toTime=None, user=None, offset=0, limit=100, modules=[], thumbs=None):
+    # returns list of workflows:
+    #         (vistrail name, vistrail id, id, name, date, user, thumb)
+    result = []
+    db = open_db_connection(config)
+    select_part = \
+    """SELECT DISTINCT v.name, v.id, w.parent_id, a1.value,
+              action.date, action.user"""
+    from_part = \
+    """FROM workflow w"""
+    # "tag name" exist in workflow table but may have been changed
+    # so we use value from the vistrail __tag__ annotation
+    where_part = \
+    """WHERE w.entity_type='workflow'"""
+    limit_part = 'LIMIT %s, %s' % (int(offset), int(limit))
+
+    if vistrail:
+        try:
+            where_part += " AND v.id=%s" % int(vistrail)
+        except ValueError:
+            where_part += " AND v.name=%s" % \
+                   db.escape(vistrail, get_db_lib().converters.conversions)
+    if version:
+        try:
+            where_part += " AND w.parent_id=%s" % int(version)
+        except ValueError:
+            where_part += " AND a1.value=%s" % \
+                   db.escape(version, get_db_lib().converters.conversions)
+    if fromTime:
+        where_part += " AND w.last_modified>%s" % \
+               db.escape(fromTime, get_db_lib().converters.conversions)
+    if toTime:
+        where_part += " AND w.last_modified<%s" % \
+               db.escape(toTime, get_db_lib().converters.conversions)
+    if user:
+        where_part += " AND action.user=%s" % \
+               db.escape(user, get_db_lib().converters.conversions)
+    next_port = 1
+    old_alias = None
+    for i, module, connected in zip(range(1,len(modules)+1), *zip(*modules)):
+        module = module.lower()
+        alias = "m%s"%i
+        from_part += \
+        """ JOIN module {0} ON
+                ({0}.parent_id=w.id AND {0}.entity_type=w.entity_type AND
+                 {0}.name={1})
+        """.format(alias,
+                   db.escape(module, get_db_lib().converters.conversions))
+        if connected:
+            p1_alias, p2_alias=("port%s"%next_port), ("port%s"%(next_port+1))
+            next_port += 2
+            from_part += \
+            """ JOIN port {0} ON
+                ({0}.entity_id=w.id AND {0}.entity_type=w.entity_type AND
+                 {0}.moduleId={1}.id AND {0}.type='source')""".format(
+                 p1_alias, old_alias)
+            from_part += \
+            """ JOIN port {0} ON
+                ({0}.entity_id=w.id AND {0}.entity_type=w.entity_type AND
+                 {0}.moduleId={1}.id AND {0}.type='destination' AND
+                 {0}.parent_id = {2}.parent_id)""".format(
+                 p2_alias, alias, p1_alias)
+        old_alias = alias
+    from_part += \
+    """ JOIN vistrail v ON w.vistrail_id = v.id JOIN
+            action ON action.entity_id=w.vistrail_id AND
+                       action.id=w.parent_id LEFT JOIN
+            action_annotation a1 ON
+                a1.entity_id=w.vistrail_id AND
+                a1.action_id=w.parent_id AND
+                (a1.akey='__tag__' OR a1.akey IS NULL)"""
+    if thumbs:
+        select_part += ', t.image_bytes'
+        from_part += """ LEFT JOIN action_annotation a2 ON
+                              (a2.entity_id=w.vistrail_id AND
+                               a2.action_id=w.parent_id AND
+                               (a2.akey='__thumb__' OR
+                                a2.akey IS NULL)) LEFT JOIN
+                         thumbnail t ON a2.value=t.file_name"""
+    else:
+        select_part += ', NULL'
+
+    command = ' '.join([select_part, from_part, where_part, limit_part]) + ';'
+    #print command
+    try:
+        c = db.cursor()
+        c.execute(command)
+        rows = c.fetchall()
+        result = rows
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't perform query on db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+
+    # count all rows when offset = 0
+    if 0 == offset:
+        select_part = 'SELECT count(0)'
+        command = ' '.join([select_part,from_part,where_part]) +';'
+        #print command
+        try:
+            c = db.cursor()
+            c.execute(command)
+            res = c.fetchall()
+            result= (result, res[0][0])
+            c.close()
+        except get_db_lib().Error, e:
+            msg = "Couldn't perform query on db (%d : %s)" % \
+                (e.args[0], e.args[1])
+            raise VistrailsDBException(msg)
+
+    close_db_connection(db)
+    return result
+
+def runLogQuery(config, vistrail=None, version=None, fromTime=None, toTime=None,
+             user=None, completed=None, offset=0, limit=100, modules=[],
+             thumbs=None):
+    # returns list of workflow executions:
+    #         (vistrail name, vistrail id, log id, workflow id, workflow name,
+    #          execution id, start time, end time, user, completed, thumb)
+    result = []
+    db = open_db_connection(config)
+    select_part = \
+    """SELECT DISTINCT v.name, v.id, w.entity_id,
+              w.parent_version, a1.value, w.id,
+              w.ts_start, w.ts_end, w.user, w.completed"""
+    from_part = \
+    """FROM workflow_exec w JOIN
+            log_tbl l ON (l.id = w.entity_id) JOIN
+            vistrail v ON (l.vistrail_id = v.id) LEFT JOIN
+            action_annotation a1 ON (a1.entity_id=v.id AND
+                                     a1.action_id=w.parent_version)"""
+    where_part = \
+    """WHERE w.parent_type='vistrail' AND
+             w.entity_type='log' AND
+             (a1.akey='__tag__' OR a1.akey IS NULL)"""
+    limit_part = 'LIMIT %s, %s' % (int(offset), int(limit))
+
+    if vistrail:
+        try:
+            where_part += " AND v.id=%s" % int(vistrail)
+        except ValueError:
+            where_part += " AND v.name=%s" % \
+                   db.escape(vistrail, get_db_lib().converters.conversions)
+    if version:
+        try:
+            where_part += " AND w.parent_version=%s" % int(version)
+        except ValueError:
+            where_part += " AND a1.value=%s" % \
+                   db.escape(version, get_db_lib().converters.conversions)
+    if fromTime:
+        where_part += " AND w.ts_end>%s" % \
+               db.escape(fromTime, get_db_lib().converters.conversions)
+    if toTime:
+        where_part += " AND w.ts_start<%s" % \
+               db.escape(toTime, get_db_lib().converters.conversions)
+    if user:
+        where_part += " AND w.user=%s" % \
+               db.escape(user, get_db_lib().converters.conversions)
+    completed_dict = {'no':0, 'yes':1, 'ok':1}
+    if completed is not None:
+        try:
+            int(completed)
+        except ValueError:
+            completed = completed_dict.get(str(completed).lower(), -1)
+        where_part += " AND w.completed=%s" % completed
+    if thumbs:
+        select_part += ', t.image_bytes'
+        from_part += """ LEFT JOIN action_annotation a2 ON
+                              (a2.entity_id=v.id AND
+                               a2.action_id=w.parent_version) LEFT JOIN
+                         thumbnail t ON a2.value=t.file_name"""
+        where_part += " AND (a2.akey='__thumb__' OR a2.akey IS NULL)"
+    else:
+        select_part += ', NULL'
+        
+    # TODO nested module executions are not detected
+    for i, module, mCompleted in zip(range(1,len(modules)+1), *zip(*modules)):
+        alias = "m%s"%i
+        from_part += \
+        """ JOIN module_exec %s ON
+                (%s.parent_id=w.id AND
+                 %s.entity_id=w.entity_id AND
+                 %s.entity_type=w.entity_type)
+        """.replace('%s', alias)
+        where_part += \
+        """ AND %s.parent_type='workflow_exec'
+            AND %s.module_name=%s """ % (alias, alias,
+              db.escape(module.lower(), get_db_lib().converters.conversions) )
+        if mCompleted is not None:
+            mCompleted = completed_dict.get(str(mCompleted).lower(), -1)
+            where_part += """ AND %s.completed=%s""" % (alias, mCompleted)
+            
+    command = ' '.join([select_part, from_part, where_part, limit_part]) + ';'
+    #print command
+    try:
+        c = db.cursor()
+        c.execute(command)
+        rows = c.fetchall()
+        result = rows
+        c.close()
+    except get_db_lib().Error, e:
+        msg = "Couldn't perform query on db (%d : %s)" % \
+            (e.args[0], e.args[1])
+        raise VistrailsDBException(msg)
+
+    # count all rows when offset = 0
+    if 0 == offset:
+        select_part = 'SELECT count(0)'
+        command = ' '.join([select_part,from_part,where_part]) +';'
+        #print command
+        try:
+            c = db.cursor()
+            c.execute(command)
+            res = c.fetchall()
+            result= (result, res[0][0])
+            c.close()
+        except get_db_lib().Error, e:
+            msg = "Couldn't perform query on db (%d : %s)" % \
+                (e.args[0], e.args[1])
+            raise VistrailsDBException(msg)
+
+    close_db_connection(db)
+    return result
diff --git a/vistrails/db/services/registry.py b/vistrails/db/services/registry.py
new file mode 100644
index 0000000..062e6ce
--- /dev/null
+++ b/vistrails/db/services/registry.py
@@ -0,0 +1,48 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBPackage, DBModuleDescriptor, DBPortSpec
+
+def update_id_scope(registry):
+    if hasattr(registry, 'update_id_scope'):
+        registry.update_id_scope()
+    else:
+        for package in registry.db_packages:
+            registry.idScope.updateBeginId(DBPackage.vtType, package.db_id+1)
+            for descriptor in package.db_module_descriptors:
+                registry.idScope.updateBeginId(DBModuleDescriptor.vtType,
+                                               descriptor.db_id+1)
+                for port_spec in descriptor.db_portSpecs:
+                    registry.idScope.updateBeginId(DBPortSpec.vtType, 
+                                                   port_spec.db_id+1)
diff --git a/vistrails/db/services/vistrail.py b/vistrails/db/services/vistrail.py
new file mode 100644
index 0000000..d3caef8
--- /dev/null
+++ b/vistrails/db/services/vistrail.py
@@ -0,0 +1,1354 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.domain import DBWorkflow, DBAdd, DBDelete, DBAction, DBAbstraction, \
+    DBModule, DBConnection, DBPort, DBFunction, DBParameter, DBGroup
+from vistrails.db.services.action_chain import getActionChain, getCurrentOperationDict, \
+    getCurrentOperations, simplify_ops
+from vistrails.db import VistrailsDBException
+
+import copy
+import datetime
+import getpass
+
+import unittest
+import vistrails.core.system
+
+def update_id_scope(vistrail):
+    if hasattr(vistrail, 'update_id_scope'):
+        vistrail.update_id_scope()
+    else:
+        for action in vistrail.db_actions:
+            vistrail.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                vistrail.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                vistrail.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    vistrail.idScope.updateBeginId(operation.db_what, 
+                                                   getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    vistrail.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                vistrail.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+def materializeWorkflow(vistrail, version):
+    # construct path up through tree and perform each action
+    if vistrail.db_has_action_with_id(version):
+        workflow = DBWorkflow()
+        #for action in getActionChain(vistrail, version):
+        #    oldPerformAction(action, workflow)
+        performActions(getActionChain(vistrail, version), 
+                            workflow)
+        workflow.db_id = version
+        workflow.db_vistrailId = vistrail.db_id
+        return workflow
+    elif version == 0:
+        return DBWorkflow()
+    else:
+        raise VistrailsDBException("invalid workflow version %s" % version)
+
+def performAction(action, workflow):
+    if action.actionType == 'add':
+        for operation in action.db_operations:
+            workflow.db_add_object(operation.db_data, 
+                                   operation.db_parentObjType,
+                                   operation.db_parentObjId)
+    elif action.actionType == 'change':
+        for operation in action.db_operations:
+            workflow.db_change_object(operation.db_data,
+                                      operation.db_parentObjType,
+                                      operation.db_parentObjId)
+    elif action.actionType == 'delete':
+        for operation in action.operations:
+            workflow.db_delete_object(operation.db_objectId,
+                                      operation.db_what,
+                                      operation.db_parentObjType,
+                                      operation.db_parentObjId)
+    else:
+        msg = "Unrecognized action type '%s'" % action.db_actionType
+        raise TypeError(msg)
+
+def performDeletes(deleteOps, workflow):
+    for operation in deleteOps:
+        workflow.db_delete_object(getOldObjId(operation), operation.db_what,
+                                  operation.db_parentObjType,
+                                  operation.db_parentObjId)
+
+def performAdds(addOps, workflow):
+    for operation in addOps:
+#         print "operation %d: %s %s" % (operation.db_id, operation.vtType,
+#                                        operation.db_what)
+#         print "    to:  %s %s" % (operation.db_parentObjType, 
+#                                   operation.db_parentObjId)
+        workflow.db_add_object(operation.db_data,
+                               operation.db_parentObjType,
+                               operation.db_parentObjId)
+
+def performActions(actions, workflow):
+    # get the current actions and run addObject on the workflow
+    # note that delete actions have been removed and
+    # a change after an add is effectively an add if the add is discarded
+    performAdds(getCurrentOperations(actions), workflow)
+
+def synchronize(old_vistrail, new_vistrail, current_action_id):
+    id_remap = {}
+    for action in new_vistrail.db_actions:
+        if action.is_new:
+            new_action = action.do_copy(True, old_vistrail.idScope, id_remap)
+            old_vistrail.db_add_action(new_action)
+        else:
+            # it must exist in the old vistrail, too
+            old_action = old_vistrail.db_actions_id_index[action.db_id]
+            # use knowledge that we replace old notes...
+            for annotation in action.db_deleted_annotations:
+                if old_action.db_has_annotation_with_id(annotation.db_id):
+                    old_action.db_delete_annotation(annotation)
+                else:
+                    # FIXME conflict!
+                    # we know that the annotation that was there isn't anymore
+                    #print 'possible notes conflict'
+                    if old_action.db_has_annotation_with_key('notes'):
+                        old_annotation = \
+                            old_action.db_get_annotation_by_key('notes')
+                        old_action.db_delete_annotation(old_annotation)
+                    else:
+                        # we don't have to do anything
+                        pass
+            for annotation in action.db_annotations:
+                if annotation.is_new:
+                    new_annotation = annotation.do_copy(True, 
+                                                        old_vistrail.idScope,
+                                                        id_remap)
+                    old_action.db_add_annotation(new_annotation)
+
+    for tag in new_vistrail.db_deleted_tags:
+        if old_vistrail.db_has_tag_with_id(tag.db_id):
+            old_vistrail.db_delete_tag(tag)
+        else:
+            # FIXME conflict!
+            # we know the tag that was there isn't anymore
+            #print 'possible tag conflict'
+            # we don't have to do anything here, though
+            pass
+
+    for tag in new_vistrail.db_tags:
+        if tag.is_new:
+            new_tag = tag.do_copy(False)
+            # remap id
+            try:
+                new_tag.db_id = id_remap[(DBAction.vtType, new_tag.db_id)]
+            except KeyError:
+                pass
+            try:
+                old_tag = old_vistrail.db_tags_name_index[new_tag.db_name]
+            except KeyError:
+                # FIXME conflict!
+                #print "tag conflict--name already used"
+                old_vistrail.db_delete_tag(old_tag)
+            try:
+                old_tag = old_vistrail.db_tags_id_index[new_tag.db_id]
+            except KeyError:
+                #print 'possible tag conflict -- WILL NOT GET HERE!'
+                old_vistrail.db_delete_tag(old_tag)
+            old_vistrail.db_add_tag(new_tag)
+
+    new_action_id = \
+        id_remap.get((DBAction.vtType, current_action_id), current_action_id)
+    old_vistrail.db_currentVersion = new_action_id
+    return new_action_id
+
+def merge(sb, next_sb, app='', interactive = False, tmp_dir = '', next_tmp_dir = ''):
+    """ def merge(sb: SaveBundle, next_sb: SaveBundle, app: str,
+                  interactive: bool, tmp_dir: str, next_tmp_dir: str) -> None
+        Merges two save bundles that has been annotated with checkout
+        information from a database.
+        All changes from next_sb are appended onto sb. The changes in sb can
+        then be uploaded to the database and use as the new working copy.
+        first sb is the old one from db, last vt is the new one.
+        if interactive is gui.merge_gui.MergeGui then the tmp_dir's must be set.
+        """
+    vt = sb.vistrail
+    next_vt = next_sb.vistrail
+    merge_gui = interactive
+    MergeGUI = merge_gui.MergeGUI if merge_gui else False
+    skip = 0
+
+    id_remap = {}
+
+    checkout_key = "__checkout_version_"
+    action_key = checkout_key + app
+    annotation_key = action_key + '_annotationhash'
+    action_annotation_key = action_key + '_actionannotationhash'
+
+    # find the highest common checkin id
+    checkinId = 0
+    if len(app) and next_vt.db_has_annotation_with_key(action_key):
+        co = next_vt.db_get_annotation_by_key(action_key)
+        #print "found checkin id annotation"
+        checkinId = int(co._db_value)
+    else:
+        #print "calculating checkin id"
+        # create unique identifiers for all actions
+        actions = []
+        actionDict = {}
+        for action in vt.db_actions:
+            unique = action._db_user + str(action._db_date)
+            copy_no = 0
+            while (unique + str(copy_no)) in actionDict:
+                copy_no += 1
+            unique = unique + str(copy_no)
+            actions.append(unique)
+            actionDict[unique] = action
+        actionNexts = []
+        actionDictNext = {}
+        for action in next_vt.db_actions:
+            unique = action._db_user + str(action._db_date)
+            copy_no = 0
+            while (unique + str(copy_no)) in actionDictNext:
+                copy_no += 1
+            unique = unique + str(copy_no)
+            actionNexts.append(unique)
+            actionDictNext[unique] = action
+
+        # find last checkin action (only works for centralized syncs)
+        while checkinId < len(actions) and checkinId < len(actionNexts) and \
+            actions[checkinId] == actionNexts[checkinId]:
+                checkinId += 1
+        if checkinId > 0:
+            checkinId = actionDict[actions[checkinId-1]].db_id
+    #print "checkinId:", checkinId
+
+    # delete previous checkout annotations in vt
+    deletekeys = [action_key,annotation_key,action_annotation_key]
+    for key in deletekeys:
+        while vt.db_has_annotation_with_key(key):
+            a = vt.db_get_annotation_by_key(key)
+            vt.db_delete_annotation(a)
+
+    # check if someone else have changed the annotations
+    mergeAnnotations = True
+    if len(app) and next_vt.db_has_annotation_with_key(annotation_key):
+        #print "found annotationhash"
+        co = next_vt.db_get_annotation_by_key(annotation_key)
+        old_hash = co._db_value
+        mergeAnnotations = (old_hash != vt.hashAnnotations())
+    #print "merge annotations:", mergeAnnotations
+
+    # check if someone else have changed the action annotations
+    mergeActionAnnotations = True
+    if len(app) and next_vt.db_has_annotation_with_key(action_annotation_key):
+        #print "found actionannotationhash"
+        co = next_vt.db_get_annotation_by_key(action_annotation_key)
+        old_hash = co._db_value
+        mergeActionAnnotations = (old_hash != vt.hashActionAnnotations())
+    #print "merge actionannotations:", mergeActionAnnotations
+
+    ################## merge actions ######################
+    for action in next_vt.db_actions:
+        # check for identical actions
+        if action._db_id > checkinId:
+            new_action = action.do_copy(True, vt.idScope, id_remap)
+            vt.db_add_action(new_action)
+
+    ################## merge annotations ##################
+    if not mergeAnnotations:
+        # delete removed annotations
+        for annotation in [a for a in vt.db_annotations]:
+            if not next_vt.db_has_annotation_with_id(annotation.db_id):
+                # delete it
+                vt.db_delete_annotation(annotation)
+        # add new and update changed annotations
+        for annotation in next_vt.db_annotations:
+            if not vt.db_has_annotation_with_id(annotation.db_id):
+                # new annotation
+                new_annotation = annotation.do_copy(True, vt.idScope, id_remap)
+                vt.db_add_annotation(new_annotation)
+            else:
+                old_annotation = vt.db_get_annotation_by_id(annotation.db_id)
+                if old_annotation.db_key != annotation.db_key:
+                    # key changed
+                    old_annotation.db_key = annotation.db_key
+                if old_annotation.db_value != annotation.db_value:
+                    # value changed
+                    old_annotation.db_value = annotation.db_value
+    else:
+        annotations = {}
+        # create dict with keys and values
+        for annotation in vt.db_annotations:
+            if annotation.db_key not in annotations:
+                annotations[annotation.db_key] = []
+            if annotation.db_value not in annotations[annotation.db_key]:
+                annotations[annotation.db_key].append(annotation.db_value)
+        # add nonexisting key-value pairs
+        for annotation in next_vt.db_annotations:
+            if annotation.db_key not in annotations or \
+                    annotation.db_value not in annotations[annotation.db_key]:
+                new_annotation = annotation.do_copy(True, vt.idScope, id_remap)
+                vt.db_add_annotation(new_annotation)
+
+    ################# merge action annotations ############
+    if not mergeActionAnnotations:
+        # delete removed action annotations
+        for annotation in [a for a in vt.db_actionAnnotations]:
+            if not next_vt.db_has_actionAnnotation_with_id(annotation.db_id):
+                # delete it
+                vt.db_delete_actionAnnotation(annotation)
+                if annotation.db_key == '__thumb__' and len(sb.thumbnails) > 0:
+                    # remove thumb
+                    thumb = '/'.join(sb.thumbnails[0].split(
+                            '/')[:-1]) + '/' + annotation.db_value
+                    if thumb in sb.thumbnails:
+                        sb.thumbnails.remove(thumb)
+
+        # add new and update changed annotations
+        for annotation in next_vt.db_actionAnnotations:
+            if not vt.db_has_actionAnnotation_with_id(annotation.db_id):
+                # new actionAnnotation
+                annotation = annotation.do_copy(True, vt.idScope, id_remap)
+                vt.db_add_actionAnnotation(annotation)
+                if annotation.db_key == '__thumb__' and \
+                        len(next_sb.thumbnails) > 0:
+                    # add thumb
+                    thumb = '/'.join(next_sb.thumbnails[0].split(
+                            '/')[:-1])+'/'+ annotation.db_value
+                    if thumb not in sb.thumbnails:
+                        sb.thumbnails.append(thumb)
+            else:
+                old_annotation = \
+                    vt.db_get_actionAnnotation_by_id(annotation.db_id)
+                if old_annotation.db_value != annotation.db_value:
+                    # value changed
+                    if annotation.db_key == '__thumb__' and \
+                            len(sb.thumbnails) > 0:
+                        # remove thumb
+                        thumb = '/'.join(sb.thumbnails[0].split(
+                                '/')[:-1]) + '/' + old_annotation.db_value
+                        if thumb in sb.thumbnails:
+                            sb.thumbnails.remove(thumb)
+                    if annotation.db_key == '__thumb__' and \
+                            len(next_sb.thumbnails) > 0:
+                        # add thumb
+                        thumb = '/'.join(next_sb.thumbnails[0].split(
+                                '/')[:-1])+'/'+ annotation.db_value
+                        if thumb not in sb.thumbnails:
+                            sb.thumbnails.append(thumb)
+                    old_annotation.db_value = annotation.db_value
+                    old_annotation.db_date = annotation.db_date
+                    old_annotation.db_user = annotation.db_user
+    else:
+        # construct old action index (oas)
+        oas = {}
+        for a in vt.db_actionAnnotations:
+            if not a.db_action_id in oas:
+                oas[a.db_action_id] = {}
+            if not a.db_key in oas[a.db_action_id]:
+                oas[a.db_action_id][a.db_key] = []
+            oas[a.db_action_id][a.db_key].append(a)
+        # merge per action
+        for new_annotation in next_vt.db_actionAnnotations:
+            # keep both upgrades but update action id in new
+            if new_annotation.db_key == '__upgrade__':
+                value = int(new_annotation.db_value)
+                if ('action', value) in id_remap:
+                    new_annotation.db_value = str(id_remap[('action', value)])
+                annotation = new_annotation.do_copy(True, vt.idScope, id_remap)
+                vt.db_add_actionAnnotation(annotation)
+            elif new_annotation.db_action_id <= checkinId and \
+                    new_annotation.db_key in oas[new_annotation.db_action_id]:
+                old_action = oas[new_annotation.db_action_id]
+                # we have a conflict
+                # tags should be merged (the user need to resolve)
+                if new_annotation.db_key == '__tag__':
+                    # there is only one
+                    old_annotation = old_action[new_annotation.db_key][0]
+                    if old_annotation.db_value != new_annotation.db_value:
+                        value = old_annotation.db_value + " or " + \
+                            new_annotation.db_value
+                        if interactive:
+                            if skip == 1:
+                                pass
+                            elif skip == 2:
+                                old_annotation.db_value=new_annotation.db_value
+                                old_annotation.db_date = new_annotation.db_date
+                                old_annotation.db_user = new_annotation.db_user
+                            else:
+                                v, value = MergeGUI.resolveTags(
+                                    old_annotation, new_annotation, value)
+                                if v == merge_gui.CHOICE_OTHER_ALL:
+                                    skip = 1
+                                elif v == merge_gui.CHOICE_OTHER:
+                                    pass
+                                elif v == merge_gui.CHOICE_RESOLVED:
+                                    #print "Tag resolved:", value
+                                    old_annotation.db_value = value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                    pass
+                                elif v == merge_gui.CHOICE_OWN:
+                                    old_annotation.db_value = \
+                                        new_annotation.db_value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                elif v == merge_gui.CHOICE_OWN_ALL:
+                                    old_annotation.db_value = \
+                                        new_annotation.db_value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                    skip = 2
+                        else:
+                            old_annotation.db_value = value
+                            old_annotation.db_date = new_annotation.db_date
+                            old_annotation.db_user = new_annotation.db_user
+                # notes should be merged (the user need to resolve)
+                elif new_annotation.db_key == '__notes__':
+                    # there is only one
+                    old_annotation = old_action[new_annotation.db_key][0]
+                    if new_annotation.db_value != old_annotation.db_value:
+                        value = ("#### conflicting versions! ####<br/>" + 
+                                 "## Other version at %s by %s:%s<br/>" +
+                                 "## Your version at %s by %s:%s") % \
+                          (str(old_annotation.db_date), old_annotation.db_user,
+                          old_annotation.db_value, str(new_annotation.db_date),
+                          new_annotation.db_user, new_annotation.db_value)
+                        if interactive:
+                            if skip == 1:
+                                pass
+                            elif skip == 2:
+                                old_annotation.db_value=new_annotation.db_value
+                                old_annotation.db_date = new_annotation.db_date
+                                old_annotation.db_user = new_annotation.db_user
+                            else:
+                                v, value = MergeGUI.resolveNotes(
+                                    old_annotation, new_annotation, value)
+                                if v == merge_gui.CHOICE_OTHER_ALL:
+                                    skip = 1
+                                elif v == merge_gui.CHOICE_OTHER:
+                                    pass
+                                elif v == merge_gui.CHOICE_RESOLVED:
+                                    #print "Note resolved:", value
+                                    old_annotation.db_value = value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                    pass
+                                elif v == merge_gui.CHOICE_OWN:
+                                    old_annotation.db_value = \
+                                        new_annotation.db_value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                elif v == merge_gui.CHOICE_OWN_ALL:
+                                    old_annotation.db_value = \
+                                        new_annotation.db_value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                    skip = 2
+                        else:
+                            old_annotation.db_value = value
+                            old_annotation.db_date = new_annotation.db_date
+                            old_annotation.db_user = new_annotation.db_user
+
+                # thumbs should be updated (we loose the other update)
+                elif new_annotation.db_key == '__thumb__': 
+                    # there is only one
+                    old_annotation = old_action[new_annotation.db_key][0]
+                    if new_annotation.db_value != old_annotation.db_value:
+                        if interactive:
+                            if skip == 1:
+                                pass
+                            elif skip == 2:
+                                thumb = '/'.join(sb.thumbnails[0].split(
+                                        '/')[:-1])+'/'+ old_annotation.db_value
+                                if thumb in sb.thumbnails:
+                                    sb.thumbnails.remove(thumb)
+                                old_annotation.db_value=new_annotation.db_value
+                                old_annotation.db_date = new_annotation.db_date
+                                old_annotation.db_user = new_annotation.db_user
+                                thumb = '/'.join(next_sb.thumbnails[0].split(
+                                        '/')[:-1])+'/'+ new_annotation.db_value
+                                if thumb not in sb.thumbnails:
+                                    sb.thumbnails.append(thumb)
+                            else:
+                                v = MergeGUI.resolveThumbs(old_annotation,
+                                         new_annotation, tmp_dir, next_tmp_dir)
+                                if v == merge_gui.CHOICE_OTHER_ALL:
+                                    skip = 1
+                                elif v == merge_gui.CHOICE_OTHER:
+                                    pass
+                                elif v in (merge_gui.CHOICE_OWN,
+                                           merge_gui.CHOICE_OWN_ALL):
+                                    thumb = '/'.join(sb.thumbnails[0].split(
+                                        '/')[:-1])+'/'+ old_annotation.db_value
+                                    if thumb in sb.thumbnails:
+                                        sb.thumbnails.remove(thumb)
+                                    old_annotation.db_value = \
+                                        new_annotation.db_value
+                                    old_annotation.db_date = \
+                                        new_annotation.db_date
+                                    old_annotation.db_user = \
+                                        new_annotation.db_user
+                                    thumb='/'.join(next_sb.thumbnails[0].split(
+                                        '/')[:-1])+'/'+ new_annotation.db_value
+                                    if thumb not in sb.thumbnails:
+                                        sb.thumbnails.append(thumb)
+                                    if v == merge_gui.CHOICE_OWN_ALL:
+                                        skip = 2
+                        else:
+                            thumb = '/'.join(sb.thumbnails[0].split(
+                                    '/')[:-1])+'/'+ old_annotation.db_value
+                            if thumb in sb.thumbnails:
+                                sb.thumbnails.remove(thumb)
+                            old_annotation.db_value = new_annotation.db_value
+                            old_annotation.db_date = new_annotation.db_date
+                            old_annotation.db_user = new_annotation.db_user
+                            thumb = '/'.join(next_sb.thumbnails[0].split(
+                                    '/')[:-1])+'/'+ new_annotation.db_value
+                            if thumb not in sb.thumbnails:
+                                sb.thumbnails.append(thumb)
+                elif new_annotation.db_key == '__prune__': # keep old
+                    pass
+                # others should be appended if not already there
+                else:
+                    values = []
+                    for old_annotation in old_action[new_annotation.db_key]:
+                            values.append(old_annotation.db_value)
+                    if new_annotation.db_value not in values:
+                        annotation = new_annotation.do_copy(True, vt.idScope, \
+                                                                id_remap)
+                        vt.db_add_actionAnnotation(annotation)
+            else:
+                annotation = new_annotation.do_copy(True, vt.idScope, id_remap)
+                vt.db_add_actionAnnotation(annotation)
+                if annotation.db_key == '__thumb__':
+                    thumb = '/'.join(next_sb.thumbnails[0].split('/')[:-1]) + \
+                            '/' + annotation.db_value
+                    if thumb not in sb.thumbnails:
+                        sb.thumbnails.append(thumb)
+    # make this a valid checked out version
+    if len(app):
+        vt.update_checkout_version(app)
+
+################################################################################
+# Analogy methods
+
+def find_data(what, id, op_dict):
+    try:
+        return op_dict[(what, id)].db_data
+    except KeyError:
+        msg = 'cannot find data (%s, %s)'  % (what, id)
+        raise KeyError(msg)
+
+def invertOperations(op_dict, adds, deletes, do_copy=False):
+    inverse_ops = []       
+    deletes.reverse()
+    for op in deletes:
+        data = find_data(op.db_what, getOldObjId(op), op_dict)
+        if do_copy:
+            data = copy.copy(data)
+        inv_op = DBAdd(id=-1,
+                       what=op.db_what,
+                       objectId=getOldObjId(op),
+                       parentObjId=op.db_parentObjId,
+                       parentObjType=op.db_parentObjType,
+                       data=data
+                       )
+        inverse_ops.append(inv_op)
+    adds.reverse()
+    for op in adds:
+        inv_op = DBDelete(id=-1,
+                          what=op.db_what,
+                          objectId=getNewObjId(op),
+                          parentObjId=op.db_parentObjId,
+                          parentObjType=op.db_parentObjType,
+                          )
+        inverse_ops.append(inv_op)
+    return inverse_ops
+
+def normalOperations(adds, deletes, do_copy=False):
+    new_ops = []
+    for op in deletes:
+        new_op = DBDelete(id=-1,
+                          what=op.db_what,
+                          objectId=getOldObjId(op),
+                          parentObjId=op.db_parentObjId,
+                          parentObjType=op.db_parentObjType,
+                          )
+        new_ops.append(new_op)
+    for op in adds:
+        data = op.db_data
+        if do_copy:
+            data = copy.copy(op.db_data)
+        new_op = DBAdd(id=-1,
+                       what=op.db_what,
+                       objectId=getNewObjId(op),
+                       parentObjId=op.db_parentObjId,
+                       parentObjType=op.db_parentObjType,
+                       data=data)
+        new_ops.append(new_op)
+    return new_ops        
+
+def getPathAsAction(vistrail, v1, v2, do_copy=False):
+    sharedRoot = getSharedRoot(vistrail, [v1, v2])
+    sharedActionChain = getActionChain(vistrail, sharedRoot)
+    sharedOperationDict = getCurrentOperationDict(sharedActionChain)
+    v1Actions = getActionChain(vistrail, v1, sharedRoot)
+    v2Actions = getActionChain(vistrail, v2, sharedRoot)
+    (v1AddDict, v1DeleteDict) = getOperationDiff(v1Actions, 
+                                                 sharedOperationDict)
+    (v2AddDict, v2DeleteDict) = getOperationDiff(v2Actions,
+                                                 sharedOperationDict)
+    
+    # need to invert one of them (v1)
+    v1Adds = v1AddDict.values()
+    v1Adds.sort(key=lambda x: x.db_id) # faster than sort(lambda x, y: cmp(x.db_id, y.db_id))
+    v1Deletes = v1DeleteDict.values()
+    v1Deletes.sort(key=lambda x: x.db_id) # faster than sort(lambda x, y: cmp(x.db_id, y.db_id))
+    v1InverseOps = \
+        invertOperations(sharedOperationDict, v1Adds, v1Deletes, do_copy)
+    
+    # need to normalize ops of the other (v2)
+    v2Adds = v2AddDict.values()
+    v2Adds.sort(key=lambda x: x.db_id) # faster than sort(lambda x, y: cmp(x.db_id, y.db_id))
+    v2Deletes = v2DeleteDict.values()
+    v2Deletes.sort(key=lambda x: x.db_id) # faster than sort(lambda x, y: cmp(x.db_id, y.db_id))
+    v2Ops = normalOperations(v2Adds, v2Deletes, do_copy)
+
+    allOps = v1InverseOps + v2Ops
+    simplifiedOps = simplify_ops(allOps)
+    return DBAction(id=-1, 
+                    operations=simplifiedOps,
+                    )
+
+def addAndFixActions(startDict, actions):
+    curDict = copy.copy(startDict)
+    # print curDict
+    for action in actions:
+#         print "fixing action:", action.db_id
+        new_ops = []
+        for op in action.db_operations:
+#             print "op:", op.vtType, op.db_what, getOldObjId(op)
+#             print "   ", op.db_parentObjType, op.db_parentObjId
+            if op.vtType == 'add':
+                if op.db_parentObjId is None or \
+                        curDict.has_key((op.db_parentObjType, 
+                                         op.db_parentObjId)):
+                    curDict[(op.db_what, op.db_objectId)] = op
+                    new_ops.append(op)                    
+            elif op.vtType == 'change':
+                if curDict.has_key((op.db_what, op.db_oldObjId)) and \
+                        (op.db_parentObjId is None or \
+                             curDict.has_key((op.db_parentObjType, 
+                                              op.db_parentObjId))):
+                    del curDict[(op.db_what, op.db_oldObjId)]
+                    curDict[(op.db_what, op.db_newObjId)] = op
+                    new_ops.append(op)
+            elif op.vtType == 'delete':
+                if (op.db_parentObjId is None or
+                    curDict.has_key((op.db_parentObjType, 
+                                     op.db_parentObjId))) and \
+                    curDict.has_key((op.db_what, op.db_objectId)):
+                    del curDict[(op.db_what, op.db_objectId)]
+                    new_ops.append(op)
+        action.db_operations = new_ops
+    return curDict
+
+def fixActions(vistrail, v, actions):
+    startingChain = getActionChain(vistrail, v)
+    startingDict = getCurrentOperationDict(startingChain)
+    addAndFixActions(startingDict, actions)
+    
+################################################################################
+# Diff methods
+
+def getSharedRoot(vistrail, versions):
+    # base case is 0
+    current = copy.copy(versions)
+    while 0 not in current:
+        maxId = max(current)
+        if current.count(maxId) == len(current):
+            return maxId
+        else:
+            newId = vistrail.db_get_action_by_id(maxId).db_prevId
+            for i, v in enumerate(current):
+                if v == maxId:
+                    current[i] = newId
+    return 0
+
+def getOperationDiff(actions, operationDict):
+    addDict = {}
+    deleteDict = {}
+    for action in actions:
+#         print 'action: %d' % action.db_id
+        for operation in action.db_operations:
+            if operation.vtType == 'add':
+#                 print "add: %s %s" % (operation.db_what, 
+#                                       operation.db_objectId)
+                addDict[(operation.db_what, 
+                         operation.db_objectId)] = operation
+            elif operation.vtType == 'delete':
+#                 print "del: %s %s" % (operation.db_what, 
+#                                       operation.db_objectId)
+                if operationDict.has_key((operation.db_what,
+                                          operation.db_objectId)):
+                    deleteDict[(operation.db_what,
+                                operation.db_objectId)] = operation
+#                     del operationDict[(operation.db_what, 
+#                                        operation.db_objectId)]
+                elif addDict.has_key((operation.db_what,
+                                      operation.db_objectId)):
+                    del addDict[(operation.db_what,
+                                 operation.db_objectId)]
+                else:
+                    pass
+            elif operation.vtType == 'change':
+#                 print "chg: %s %s %s" % (operation.db_what, 
+#                                          operation.db_oldObjId,
+#                                          operation.db_newObjId)
+                if operationDict.has_key((operation.db_what,
+                                          operation.db_oldObjId)):
+                    deleteDict[(operation.db_what,
+                                operation.db_oldObjId)] = operation
+#                     del operationDict[(operation.db_what, 
+#                                        operation.db_oldObjId)]
+                elif addDict.has_key((operation.db_what,
+                                      operation.db_oldObjId)):
+                    del addDict[(operation.db_what, operation.db_oldObjId)]
+
+                addDict[(operation.db_what,
+                         operation.db_newObjId)] = operation
+            else:
+                msg = "Unrecognized operation '%s'" % operation.vtType
+                raise TypeError(msg)
+
+    return (addDict, deleteDict)
+
+def updateOperationDict(operationDict, deleteOps, addOps):
+    for operation in deleteOps:
+        if operationDict.has_key((operation.db_what, getOldObjId(operation))):
+            del operationDict[(operation.db_what, getOldObjId(operation))]
+        else:
+            msg = "Illegal operation: " + operation
+    for operation in addOps:
+        operationDict[(operation.db_what, getNewObjId(operation))] = operation
+    return operationDict
+
+def getObjects(actions):
+    objects = {}
+    for action in actions:
+        for operation in action.db_operations:
+            if not objects.has_key(operation.db_what):
+                objects[operation.db_what] = []
+            object = copy.copy(operation.db_data)
+            objects[operation.db_what].append(object)
+    return objects
+
+def getVersionDifferences(vistrail, versions):
+    sharedRoot = getSharedRoot(vistrail, versions)
+    sharedActionChain = getActionChain(vistrail, sharedRoot)
+    sharedOperationDict = getCurrentOperationDict(sharedActionChain)
+
+    vOnlySorted = []
+    for v in versions:
+        vActions = getActionChain(vistrail, v, sharedRoot)
+        (vAddDict, vDeleteDict) = getOperationDiff(vActions, 
+                                                   sharedOperationDict)
+        vOnlyAdds = vAddDict.values()
+        vOnlyAdds.sort(key=lambda x: x.db_id)
+        vOnlyDeletes = vDeleteDict.values()
+        vOnlyDeletes.sort(key=lambda x: x.db_id)
+        vOpDict = copy.copy(sharedOperationDict)
+        updateOperationDict(vOpDict, vOnlyDeletes, vOnlyAdds)
+        vOps = vOpDict.values()
+        vOps.sort(key=lambda x: x.db_id)
+        vOnlySorted.append((vOnlyAdds, vOnlyDeletes, vOps))
+
+    sharedOps = sharedOperationDict.values()
+    sharedOps.sort(key=lambda x: x.db_id)
+
+    return (sharedOps, vOnlySorted)
+
+def heuristicModuleMatch(m1, m2):
+    """takes two modules and returns 1 if exact match,
+    0 if module names match, -1 if no match
+    
+    """
+    if m1.db_name == m2.db_name and m1.db_namespace == m2.db_namespace and \
+            m1.db_package == m2.db_package:
+        if m1.vtType == 'group':
+            # check if we have __desc__ annotation
+            m1_desc = None
+            m2_desc = None
+            if '__desc__' in m1.db_annotations_key_index:
+                m1_desc = m1.db_annotations_key_index['__desc__']
+            if '__desc__' in m2.db_annotations_key_index:
+                m2_desc = m2.db_annotations_key_index['__desc__']
+            if not (m1_desc and m2_desc and m1_desc == m2_desc):
+                # if desc's don't exactly match, return 0
+                # else continue and check functions
+                # FIXME: maybe we should check functions here
+                return 0
+                
+        m1_functions = copy.copy(m1.db_get_functions())
+        m2_functions = copy.copy(m2.db_get_functions())
+        if len(m1_functions) != len(m2_functions):
+            return 0
+        for f1 in m1_functions[:]:
+            match = None
+            for f2 in m2_functions:
+                isMatch = heuristicFunctionMatch(f1, f2)
+                if isMatch == 1:
+                    match = f2
+                    break
+            if match is not None:
+                m1_functions.remove(f1)
+                m2_functions.remove(f2)
+            else:
+                return 0
+        if len(m1_functions) == len(m2_functions) == 0:
+            return 1
+        else:
+            return 0
+    return -1
+
+def heuristicFunctionMatch(f1, f2):
+    """takes two functions and returns 1 if exact match,
+    0 if function names match, -1 if no match
+
+    """
+    if f1.db_name == f2.db_name:
+        f1_parameters = copy.copy(f1.db_get_parameters())
+        f2_parameters = copy.copy(f2.db_get_parameters())
+        if len(f1_parameters) != len(f2_parameters):
+            return 0
+        for p1 in f1_parameters[:]:
+            match = None
+            for p2 in f2_parameters:
+                isMatch = heuristicParameterMatch(p1, p2)
+                if isMatch == 1:
+                    match = p2
+                    break
+            if match is not None:
+                f1_parameters.remove(p1)
+                f2_parameters.remove(match)
+            else:
+                return 0
+        if len(f1_parameters) == len(f2_parameters) == 0:
+            return 1
+        else:
+            return 0
+    return -1
+
+def heuristicParameterMatch(p1, p2):
+    """takes two parameters and returns 1 if exact match,
+    0 if partial match (types match), -1 if no match
+
+    """
+    if p1.db_type == p2.db_type and p1.db_pos == p2.db_pos:
+        if p1.db_val == p2.db_val:
+            return 1
+        else:
+            return 0
+    return -1
+
+def heuristicConnectionMatch(c1, c2):
+    """takes two connections and returns 1 if exact match,
+    0 if partial match (currently undefined), -1 if no match
+
+    """
+    c1_ports = copy.copy(c1.db_get_ports())
+    c2_ports = copy.copy(c2.db_get_ports())
+    for p1 in c1_ports[:]:
+        match = None
+        for p2 in c2_ports:
+            isMatch = heuristicPortMatch(p1, p2)
+            if isMatch == 1:
+                match = p2
+                break
+            elif isMatch == 0:
+                match = p2
+        if match is not None:
+            c1_ports.remove(p1)
+            c2_ports.remove(match)
+        else:
+            return -1
+    if len(c1_ports) == len(c2_ports) == 0:
+        return 1
+    return -1
+
+def heuristicPortMatch(p1, p2):
+    """takes two ports and returns 1 if exact match,
+    0 if partial match, -1 if no match
+    
+    """
+    if p1.db_moduleId == p2.db_moduleId:
+        return 1
+    elif p1.db_type == p2.db_type and \
+            p1.db_moduleName == p2.db_moduleName and \
+            p1.sig == p2.sig:
+        return 0
+    return -1
+
+def function_sig(function):
+    return (function.db_name,
+            [(param.db_type, param.db_val)
+             for param in function.db_get_parameters()])
+
+def getParamChanges(m1, m2, same_vt=True, heuristic_match=True):
+    paramChanges = []
+    # need to check to see if any children of m1 and m2 are affected
+    m1_functions = m1.db_get_functions()
+    m2_functions = m2.db_get_functions()
+    m1_unmatched = []
+    m2_unmatched = []
+    if same_vt:
+        for f1 in m1_functions:
+            # see if m2 has f1, too
+            f2 = m2.db_get_function(f1.db_id)
+            if f2 is None:            
+                m1_unmatched.append(f1)
+            else:
+                # function is same, check if parameters have changed
+                if heuristic_match:
+                    matchValue = heuristicFunctionMatch(f1, f2)
+                    if matchValue != 1:
+                        paramChanges.append((function_sig(f1), 
+                                             function_sig(f2)))
+                else:
+                    paramChanges.append((function_sig(f1), function_sig(f2)))
+        for f2 in m2_functions:
+            # see if m1 has f2, too
+            if m1.db_get_function(f2.db_id) is None:
+                m2_unmatched.append(f2)
+    else:
+        m1_unmatched.extend(m1_functions)
+        m2_unmatched.extend(m2_functions)
+
+#             functionMatch = True
+#             f1_params = f1.db_get_parameters()
+#             f2_params = f2.db_get_parameters()
+#             for p1 in f1_params:
+#                 if f2.db_get_parameter(p1.db_id) is None:
+#                     functionMatch = False
+#                     m1_unmatched.append(f1)
+#                     break
+#             for p2 in f2_params:
+#                 if f1.db_get_parameter(p2.db_id) is None:
+#                     functionMatch = False
+#                     m2_unmatched.append(f2)
+#                     break
+#             if functionMatch:
+
+    if len(m1_unmatched) + len(m2_unmatched) > 0:
+        if heuristic_match and len(m1_unmatched) > 0 and len(m2_unmatched) > 0:
+            # do heuristic matches
+            for f1 in m1_unmatched[:]:
+                matched = False
+                matchValue = 0
+                for f2 in m2_unmatched:
+                    matchValue = heuristicFunctionMatch(f1, f2)
+                    if matchValue == 1:
+                        # best match so quit
+                        matched = f1
+                        break
+                    elif matchValue == 0:
+                        # match, but not exact so continue to look
+                        matched = f1
+                if matched:
+                    if matchValue != 1:
+                        paramChanges.append((function_sig(f1), 
+                                             function_sig(f2)))
+                    m1_unmatched.remove(f1)
+                    m2_unmatched.remove(f2)
+
+        for f in m1_unmatched:
+            paramChanges.append((function_sig(f), (None, None)))
+        for f in m2_unmatched:
+            paramChanges.append(((None, None), function_sig(f)))
+        
+    return paramChanges
+
+def getOldObjId(operation):
+    if operation.vtType == 'change':
+        return operation.db_oldObjId
+    return operation.db_objectId
+
+def getNewObjId(operation):
+    if operation.vtType == 'change':
+        return operation.db_newObjId
+    return operation.db_objectId
+
+def setOldObjId(operation, id):
+    if operation.vtType == 'change':
+        operation.db_oldObjId = id
+    else:
+        operation.db_objectId = id
+
+def setNewObjId(operation, id):
+    if operation.vtType == 'change':
+        operation.db_newObjId = id
+    else:
+        operation.db_objectId = id
+
+def getWorkflowDiffCommon(vistrail, v1, v2, heuristic_match=True):
+    (sharedOps, vOnlyOps) = \
+        getVersionDifferences(vistrail, [v1, v2])
+
+    sharedWorkflow = DBWorkflow()
+    performAdds(sharedOps, sharedWorkflow)
+
+    # FIXME better to do additional ops (and do deletes) or do this?
+    v1Workflow = DBWorkflow()
+    v1Ops = vOnlyOps[0][2]
+    performAdds(v1Ops, v1Workflow)
+
+    v2Workflow = DBWorkflow()
+    v2Ops = vOnlyOps[1][2]
+    performAdds(v2Ops, v2Workflow)
+
+    # FIXME connections do not check their ports
+    sharedModuleIds = []
+    sharedConnectionIds = []
+    sharedFunctionIds = {}
+    for op in sharedOps:
+        if op.what == 'module' or op.what == 'abstraction' or \
+                op.what == 'group':
+            sharedModuleIds.append(getNewObjId(op))
+        elif op.what == 'connection':
+            sharedConnectionIds.append(getNewObjId(op))
+        elif op.what == 'function':
+            sharedFunctionIds[getNewObjId(op)] = op.db_parentObjId
+    
+    vOnlyModules = []
+    vOnlyConnections = []
+    paramChgModules = {}
+    for (vAdds, vDeletes, _) in vOnlyOps:
+        moduleDeleteIds = []
+        connectionDeleteIds = []
+        for op in vDeletes:
+            if op.what == 'module' or op.what == 'abstraction' or \
+                    op.what == 'group':
+                moduleDeleteIds.append(getOldObjId(op))
+                if getOldObjId(op) in sharedModuleIds:
+                    sharedModuleIds.remove(getOldObjId(op))
+                if paramChgModules.has_key(getOldObjId(op)):
+                    del paramChgModules[getOldObjId(op)]
+            elif op.what == 'function' and \
+                    (op.db_parentObjType == 'module' or 
+                     op.db_parentObjType == 'abstraction' or 
+                     op.db_parentObjType == 'group') and \
+                     op.db_parentObjId in sharedModuleIds:
+                # have a function change
+                paramChgModules[op.db_parentObjId] = None
+                sharedModuleIds.remove(op.db_parentObjId)
+            elif op.what == 'parameter' and op.db_parentObjType == 'function' \
+                    and sharedFunctionIds.has_key(op.db_parentObjId):
+                # have a parameter change
+                moduleId = sharedFunctionIds[op.db_parentObjId]
+                if moduleId in sharedModuleIds:
+                    paramChgModules[moduleId] = None
+                    sharedModuleIds.remove(moduleId)
+            elif op.what == 'connection':
+                connectionDeleteIds.append(getOldObjId(op))
+                if getOldObjId(op) in sharedConnectionIds:
+                    sharedConnectionIds.remove(getOldObjId(op))
+
+        moduleAddIds = []
+        connectionAddIds = []
+        for op in vAdds:
+            if op.what == 'module' or op.what == 'abstraction' or \
+                    op.what == 'group':
+                moduleAddIds.append(getNewObjId(op))
+            elif (op.what == 'function' and
+                  (op.db_parentObjType == 'module' or
+                   op.db_parentObjType == 'abstraction' or
+                   op.db_parentObjType == 'group') and
+                  op.db_parentObjId in sharedModuleIds):
+                # have a function change
+                paramChgModules[op.db_parentObjId] = None
+                sharedModuleIds.remove(op.db_parentObjId)
+            elif op.what == 'parameter' and op.db_parentObjType == 'function' \
+                    and sharedFunctionIds.has_key(op.db_parentObjId):
+                # have a parameter change
+                moduleId = sharedFunctionIds[op.db_parentObjId]
+                if moduleId in sharedModuleIds:
+                    paramChgModules[moduleId] = None
+                    sharedModuleIds.remove(moduleId)
+            elif op.what == 'connection':
+                connectionAddIds.append(getOldObjId(op))
+
+        vOnlyModules.append((moduleAddIds, moduleDeleteIds))
+        vOnlyConnections.append((connectionAddIds, connectionDeleteIds))
+
+    sharedModulePairs = [(id, id) for id in sharedModuleIds]
+    v1Only = vOnlyModules[0][0]
+    v2Only = vOnlyModules[1][0]
+    for id in vOnlyModules[1][1]:
+        if id not in vOnlyModules[0][1]:
+            v1Only.append(id)
+    for id in vOnlyModules[0][1]:
+        if id not in vOnlyModules[1][1]:
+            v2Only.append(id)
+
+    sharedConnectionPairs = [(id, id) for id in sharedConnectionIds]
+    c1Only = vOnlyConnections[0][0]
+    c2Only = vOnlyConnections[1][0]
+    for id in vOnlyConnections[1][1]:
+        if id not in vOnlyConnections[0][1]:
+            c1Only.append(id)
+    for id in vOnlyConnections[0][1]:
+        if id not in vOnlyConnections[1][1]:
+            c2Only.append(id)
+
+    paramChgModulePairs = [(id, id) for id in paramChgModules.keys()]
+
+    # print "^^^^ SHARED MODULE PAIRS:", sharedModulePairs
+    if heuristic_match:
+        (heuristicModulePairs, heuristicConnectionPairs, v1Only, v2Only, \
+             c1Only, c2Only) = do_heuristic_diff(v1Workflow, v2Workflow, \
+                                                     v1Only, v2Only, \
+                                                     c1Only, c2Only)
+        paramChgModulePairs.extend(heuristicModulePairs)
+
+    (heuristicModulePairs, paramChanges) = \
+        check_params_diff(v1Workflow, v2Workflow, paramChgModulePairs, 
+                          True, heuristic_match)
+
+    return (v1Workflow, v2Workflow, 
+            sharedModulePairs, heuristicModulePairs, v1Only, v2Only, 
+            paramChanges, sharedConnectionPairs, heuristicConnectionPairs, 
+            c1Only, c2Only)
+
+def do_heuristic_diff(v1Workflow, v2Workflow, v1_modules, v2_modules, 
+                      v1_connections, v2_connections):    
+    # add heuristic matches
+    heuristicModulePairs = []
+    heuristicConnectionPairs = []
+    paramChgModulePairs = []
+    
+    v1Only = copy.copy(v1_modules)
+    v2Only = copy.copy(v2_modules)
+    c1Only = copy.copy(v1_connections)
+    c2Only = copy.copy(v2_connections)
+
+    # we now check all heuristic pairs for parameter changes
+    # match modules
+    # for (m1_id, m2_id) in paramChgModulePairs[:]:
+    #     m1 = v1Workflow.db_get_module(m1_id)
+    #     m2 = v2Workflow.db_get_module(m2_id)
+    #     if heuristicModuleMatch(m1, m2) == 1:
+    #         # paramChgModulePairs.remove((m1_id, m2_id))
+    #         # heuristicModulePairs.append((m1_id, m2_id))
+    #         pass
+
+    for m1_id in v1Only[:]:
+        m1 = v1Workflow.db_get_module(m1_id)
+        match = None
+        for m2_id in v2Only:
+            m2 = v2Workflow.db_get_module(m2_id)
+            isMatch = heuristicModuleMatch(m1, m2)
+            if isMatch == 1:
+                match = (m1_id, m2_id)
+                break
+            elif isMatch == 0:
+                match = (m1_id, m2_id)
+        if match is not None:
+            v1Only.remove(match[0])
+            v2Only.remove(match[1])
+            # we now check all heuristic pairs for parameter changes
+            heuristicModulePairs.append(match)
+            # paramChgModulePairs.append(match)
+
+    # match connections
+    for c1_id in c1Only[:]:
+        c1 = v1Workflow.db_get_connection(c1_id)
+        match = None
+        for c2_id in c2Only:
+            c2 = v2Workflow.db_get_connection(c2_id)
+            isMatch = heuristicConnectionMatch(c1, c2)
+            if isMatch == 1:
+                match = (c1_id, c2_id)
+                break
+            elif isMatch == 0:
+                match = (c1_id, c2_id)
+        if match is not None:
+            # don't have port changes yet
+            c1Only.remove(match[0])
+            c2Only.remove(match[1])
+            heuristicConnectionPairs.append(match)
+
+    return (heuristicModulePairs, heuristicConnectionPairs, v1Only, v2Only,
+            c1Only, c2Only)
+
+def check_params_diff(v1Workflow, v2Workflow, paramChgModulePairs, 
+                      same_vt=True, heuristic_match=True):
+    matched = []
+    paramChanges = []
+    # print "^^^^ PARAM CHG PAIRS:", paramChgModulePairs
+    for (m1_id, m2_id) in paramChgModulePairs:
+        m1 = v1Workflow.db_get_module(m1_id)
+        m2 = v2Workflow.db_get_module(m2_id)
+        moduleParamChanges = getParamChanges(m1, m2, same_vt, heuristic_match)
+        if len(moduleParamChanges) > 0:
+            paramChanges.append(((m1_id, m2_id), moduleParamChanges))
+        else:
+            # heuristicModulePairs.append((m1_id, m2_id))
+            matched.append((m1_id, m2_id))
+
+    return (matched, paramChanges)    
+
+def getWorkflowDiff(vt_pair_1, vt_pair_2, heuristic_match=True):
+    (vistrail_1, v_1) = vt_pair_1
+    (vistrail_2, v_2) = vt_pair_2
+    
+    if vistrail_1 == vistrail_2:
+        return getWorkflowDiffCommon(vistrail_1, v_1, v_2, heuristic_match)
+    
+    workflow_1 = materializeWorkflow(vistrail_1, v_1)
+    workflow_2 = materializeWorkflow(vistrail_2, v_2)
+    modules_1 = workflow_1.db_modules_id_index.keys()
+    modules_2 = workflow_2.db_modules_id_index.keys()
+    conns_1 = workflow_1.db_connections_id_index.keys()
+    conns_2 = workflow_2.db_connections_id_index.keys()
+
+    if heuristic_match:
+        (m_matches, c_matches, modules_1, modules_2, conns_1, conns_2) = \
+            do_heuristic_diff(workflow_1, workflow_2, modules_1, modules_2, \
+                                  conns_1, conns_2)
+        (m_matches, param_changes) = check_params_diff(workflow_1, workflow_2, 
+                                                       m_matches, False,
+                                                       heuristic_match)
+        return (workflow_1, workflow_2, [], m_matches, modules_1, modules_2,
+                param_changes, [], c_matches, conns_1, conns_2)
+
+    return (workflow_1, workflow_2, [], [], modules_1, modules_2, [], [], [], 
+            conns_1, conns_2)
+
+################################################################################
+
+
+class TestDBVistrailService(unittest.TestCase):
+    def test_parameter_heuristic(self):
+        from vistrails.core.vistrail.module_param import ModuleParam
+        
+        param1 = ModuleParam(id=0, pos=0, type='String', val='abc')
+        param2 = ModuleParam(id=1, pos=0, type='String', val='abc')
+        param3 = ModuleParam(id=2, pos=1, type='Float', val='1.0')
+        param4 = ModuleParam(id=3, pos=0, type='String', val='def')
+        param5 = ModuleParam(id=4, pos=1, type='String', val='abc')
+
+        # test basic equality
+        assert heuristicParameterMatch(param1, param2) == 1
+        # test basic inequality
+        assert heuristicParameterMatch(param1, param3) == -1
+        # test partial match
+        assert heuristicParameterMatch(param1, param4) == 0
+        # test position inequality
+        assert heuristicParameterMatch(param1, param5) == -1
+
+    def test_function_heuristic(self):
+        from vistrails.core.vistrail.module_param import ModuleParam
+        from vistrails.core.vistrail.module_function import ModuleFunction
+        
+        param1 = ModuleParam(id=0, pos=0, type='String', val='abc')
+        param2 = ModuleParam(id=1, pos=1, type='Float', val='1.0')
+        param3 = ModuleParam(id=2, pos=0, type='String', val='abc')
+        param4 = ModuleParam(id=3, pos=1, type='Float', val='1.0')
+        param5 = ModuleParam(id=4, pos=0, type='String', val='abc')
+        param6 = ModuleParam(id=5, pos=1, type='Float', val='2.0')
+
+        function1 = ModuleFunction(name='f1', parameters=[param1, param2])
+        function2 = ModuleFunction(name='f1', parameters=[param3, param4])
+        function3 = ModuleFunction(name='f1', parameters=[param5, param6])
+        function4 = ModuleFunction(name='f2', parameters=[param1, param2])
+        function5 = ModuleFunction(name='f1', parameters=[param1])
+
+        # test basic equality
+        assert heuristicFunctionMatch(function1, function2) == 1
+        # test partial match
+        assert heuristicFunctionMatch(function1, function3) == 0
+        # test basic inequality
+        assert heuristicFunctionMatch(function1, function4) == -1
+        # test length inequality
+        assert heuristicFunctionMatch(function1, function5) == 0
+
+    def test_module_heuristic(self):
+        from vistrails.core.vistrail.module_param import ModuleParam
+        from vistrails.core.vistrail.module_function import ModuleFunction
+        from vistrails.core.vistrail.module import Module
+
+        param1 = ModuleParam(id=0, pos=0, type='String', val='abc')
+        param2 = ModuleParam(id=1, pos=1, type='Float', val='1.0')
+        param3 = ModuleParam(id=2, pos=0, type='String', val='abc')
+        param4 = ModuleParam(id=3, pos=1, type='Float', val='1.0')
+        param5 = ModuleParam(id=4, pos=0, type='Integer', val='2')
+        param6 = ModuleParam(id=5, pos=0, type='Integer', val='2')
+
+        function1 = ModuleFunction(name='f1', parameters=[param1, param2])
+        function2 = ModuleFunction(name='f1', parameters=[param3, param4])
+        function3 = ModuleFunction(name='f2', parameters=[param5])
+        function4 = ModuleFunction(name='f2', parameters=[param6])
+        function5 = ModuleFunction(name='f1', parameters=[param2, param4])
+        function6 = ModuleFunction(name='f2', parameters=[param5])
+
+        module1 = Module(name='m1', functions=[function1, function3])
+        module2 = Module(name='m1', functions=[function2, function4])
+        module3 = Module(name='m2', functions=[function1, function2])
+        module4 = Module(name='m1', functions=[function5])
+        module5 = Module(name='m1', functions=[function5, function6])
+
+        # test basic equality
+        assert heuristicModuleMatch(module1, module2) == 1
+        # test basic inequality
+        assert heuristicModuleMatch(module1, module3) == -1
+        # test length inequality
+        assert heuristicModuleMatch(module1, module4) == 0
+        # test parameter change inequality
+        assert heuristicModuleMatch(module1, module5) == 0
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/db/services/workflow.py b/vistrails/db/services/workflow.py
new file mode 100644
index 0000000..cbbb77c
--- /dev/null
+++ b/vistrails/db/services/workflow.py
@@ -0,0 +1,42 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+def update_id_scope(workflow):
+    if hasattr(workflow, 'update_id_scope'):
+        workflow.update_id_scope()
+    else:
+        pass
+
+
diff --git a/vistrails/db/specs/all.xml b/vistrails/db/specs/all.xml
new file mode 100644
index 0000000..ab07b76
--- /dev/null
+++ b/vistrails/db/specs/all.xml
@@ -0,0 +1,3823 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION_ANNOTATION +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="actionAnnotation">
+    <layout>
+      <xml nodeType="xs:element"/>
+      <sql table="action_annotation"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="action_id" type="long" foreignKey="true" object="action">
+      <xml name="actionId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>    
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="mashuptrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL_VARIABLE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrailVariable">
+    <layout>
+      <xml nodeType="xs:element"/>
+      <sql table="vistrail_variable"/>
+    </layout>
+
+    <property name="name" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="name" type="varchar(255)"/>
+    </property>
+
+    <property name="uuid" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="uuid" type="char(36)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="package" type="varchar(255)"/>
+    </property>
+
+    <property name="module" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="module" type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="namespace" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="value" type="varchar(8191)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:long"/>
+      <sql type="bigint"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOOP_EXEC +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="loop_exec">
+    <layout>
+      <xml name="loopExec" nodeType="xs:element"/>
+      <sql table="loop_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <!--<property name="input" type="str">
+      <xml name="input" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>-->
+
+    <property name="iteration" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+      
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP_EXEC ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group_exec">
+    <layout>
+      <xml name="groupExec" nodeType="xs:element"/>
+      <sql table="group_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="group_name" type="str">
+      <xml name="groupName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="group_type" type="str">
+      <xml name="groupType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <!--<property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>-->
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="signature" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="optional" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sort_key" type="int">
+      <xml name="sortKey" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpecItem" type="list" 
+	      mapping="one-to-many" expandAction="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="min_conns" type="int">
+      <xml name="minConns" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="max_conns" type="int">
+      <xml name="maxConns" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="module_descriptor">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPECITEM ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpecItem">
+    <layout>
+      <xml name="portSpecItem" nodeType="xs:element"/>
+      <sql table="port_spec_item"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="label" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="default" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="_default" type="varchar(4095)"/>
+    </property>
+
+    <property name="values" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="_values" type="mediumtext"/>
+    </property>
+
+    <property name="entry_type" type="str">
+      <xml name="entryType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="portSpec" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_DESCRIPTOR +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_descriptor">
+    <layout>
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+      <sql table="module_descriptor"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+	   
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package_version" type="str">
+      <xml name="packageVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="base_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="baseDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="package" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+    <!--
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="registry">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="package">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    -->
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PACKAGE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="package">
+    <layout>
+      <xml name="package" nodeType="xs:element"/>
+      <sql table="package"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="identifier" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="codepath" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+      
+    <property name="load_configuration" type="int">
+      <xml name="loadConfiguration" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>      
+
+    <property name="description" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_descriptor" type="list" 
+	      mapping="one-to-many" index="name:namespace:version">
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="registry" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- REGISTRY ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="registry">
+    <layout>
+      <xml name="registry" nodeType="xs:element"/>
+      <sql table="registry"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="root_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="rootDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <!-- <xml nodeType="xs:attribute" type="xs:string"/> -->
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="package" type="list"
+	      mapping="one-to-many" index="identifier:version">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="vistrailVariable" type="list" mapping="one-to-many"
+	      index="uuid">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="parameter_exploration" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+    <property ref="true" object="actionAnnotation" type="list" 
+	      mapping="one-to-many" index="action_id:key !key:value">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="group" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PE_PARAMETER ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="pe_parameter" className="DBPEParameter">
+    <layout>
+      <xml name="peParameter" nodeType="xs:element"/>
+      <sql table="pe_parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="interpolator" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="dimension" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <property ref="true" type="long" object="pe_function" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PE_FUNCTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="pe_function" className="DBPEFunction">
+    <layout>
+      <xml name="peFunction" nodeType="xs:element"/>
+      <sql table="pe_function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="port_name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="is_alias" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" name="parameter" object="pe_parameter" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <property ref="true" type="long" object="parameter_exploration" 
+	      inverse="true" mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER_EXPLORATION +++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter_exploration">
+    <layout>
+      <xml name="parameterExploration" nodeType="xs:element"/>
+      <sql table="parameter_exploration"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="action_id" type="long" foreignKey="true" object="action">
+      <xml name="actionId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="dims" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="layout" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" name="function" object="pe_function" type="list" 
+	      mapping="one-to-many" index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUP_ACTION +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashup_action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="mashup_action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="mashup_action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="mashup" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="mashuptrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+	<property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--+++++++++++++++++++++++++++++-->
+  <!-- MASHUP_ACTION_ANNOTATION +++-->
+  <!--+++++++++++++++++++++++++++++-->
+
+  <object name="mashup_actionAnnotation">
+    <layout>
+      <xml name="actionAnnotation" nodeType="xs:element"/>
+      <sql table="mashup_action_annotation"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+     </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="action_id" type="long" foreignKey="true" object="mashup_action">
+      <xml name="action_id" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>    
+
+    <property ref="true" type="long" object="mashuptrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUPTRAIL +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashuptrail">
+    <layout>
+      <xml name="mashuptrail" nodeType="xs:element"/>
+      <sql table="mashuptrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(36)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+    
+    <property name="vtVersion" type="long">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql column="vt_version" type="int"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property name="action" ref="true" object="mashup_action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="actionAnnotation" ref="true" object="mashup_actionAnnotation" type="list" 
+	      mapping="one-to-many" index="action_id:key !key:value">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--+++++++++++++++++++++++++++++-->
+  <!-- MASHUP_ALIAS +++++++++++++++-->
+  <!--+++++++++++++++++++++++++++++-->
+
+  <object name="mashup_alias">
+    <layout>
+      <xml name="alias" nodeType="xs:element"/>
+      <sql table="mashup_alias"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="component" ref="true" object="mashup_component" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+    <property name="parent" ref="true" object="mashup" type="long" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUP_COMPONENT ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashup_component">
+    <layout>
+      <xml name="component" nodeType="xs:element"/>
+      <sql table="mashup_component"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="vtid" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+     <property name="vttype" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="vtparent_type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(32)"/>
+    </property>
+    
+    <property name="vtparent_id" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="vtpos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="vtmid" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+    
+    <property name="minVal" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="maxVal" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="stepSize" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="strvaluelist" type="str">
+      <xml name="valueList" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+    
+    <property name="widget" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="seq" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property ref="true" object="mashup_alias" type="long" mapping="one-to-one" 
+	      inverse="true">
+      <sql column="alias_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUP ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashup">
+    <layout>
+      <xml name="mashup" nodeType="xs:element"/>
+      <sql table="mashup"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="alias" pluralName="aliases" type= "list" ref="true" 
+              object="mashup_alias" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="vtid" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="layout" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="geometry" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="has_seq" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="parent" ref="true" object="mashup_action" type="long" 
+		mapping="one-to-one" inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_GRAPH +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_graph">
+    <layout>
+      <xml name="opmGraph" nodeType="xs:element"/>
+      <!-- <sql table="opm_graph"/> -->
+    </layout>
+
+    <property name="accounts" ref="true" object="opm_accounts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="processes" ref="true" object="opm_processes" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="artifacts" ref="true" object="opm_artifacts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="agents" ref="true" object="opm_agents" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="dependencies" ref="true" object="opm_dependencies" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNTS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_accounts">
+    <layout>
+      <xml name="accounts" nodeType="xs:element"/>
+      <!-- <sql table="accounts"/> -->
+    </layout>
+
+    <property name="account" ref="true" object="opm_account" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="opm_overlaps" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_account">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_OVERLAPS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_overlaps">
+    <layout>
+      <xml name="overlaps" nodeType="xs:element"/>
+      <!-- <sql table="overlaps"/> -->
+    </layout>
+
+    <property ref="true" object="opm_account_id" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACTS +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifacts">
+    <layout>
+      <xml name="artifacts" nodeType="xs:element"/>
+      <!-- <sql table="artifacts"/> -->
+    </layout>
+
+    <property name="artifact" ref="true" object="opm_artifact" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_VALUE ++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="artifact_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="portSpec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="function" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact">
+    <layout>
+      <xml name="artifact" nodeType="xs:element"/>
+      <!-- <sql table="artifact"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" ref="true" object="opm_artifact_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESSES +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_processes">
+    <layout>
+      <xml name="processes" nodeType="xs:element"/>
+      <!-- <sql table="processes"/> -->
+    </layout>
+
+    <property name="process" ref="true" object="opm_process" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_VALUE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="process_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="module_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process">
+    <layout>
+      <xml name="process" nodeType="xs:element"/>
+      <!-- <sql table="process"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="value" ref="true" object="opm_process_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENTS ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agents">
+    <layout>
+      <xml name="agents" nodeType="xs:element"/>
+      <!-- <sql table="agents"/> -->
+    </layout>
+
+    <property name="agent" ref="true" object="opm_agent" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agent">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type=""/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_DEPENDENCIES ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_dependencies">
+    <layout>
+      <xml name="causalDependencies" nodeType="xs:element"/>
+      <!-- <sql table="causal_dependencies"/> -->
+    </layout>
+
+    <choice name="dependency" type="list" mapping="one-to-many">
+      <property name="used" ref="true" object="opm_used">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_generated_by" ref="true" 
+		object="opm_was_generated_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_triggered_by" ref="true" 
+		object="opm_was_triggered_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_derived_from" ref="true" 
+		object="opm_was_derived_from">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_controlled_by" ref="true" 
+		object="opm_was_controlled_by">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_TIME ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_time">
+    <layout>
+      <xml name="time" nodeType="xs:element"/>
+      <!-- <sql table="time"/> -->
+    </layout>
+
+    <property name="no_later_than" type="datetime">
+      <xml name="noLaterThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="no_earlier_than" type="datetime">
+      <xml name="noEarlierThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="clock_id" type="str">
+      <xml name="clockId" nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT_ID ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_account_id">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_account">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_CAUSE ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="process_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_EFFECT +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="process_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_CAUSE +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_EFFECT ++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT_ID ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_agent_id">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_agent">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ROLE ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_role">
+    <layout>
+      <xml name="role" nodeType="xs:element"/>
+      <!-- <sql table="role"/> -->
+    </layout>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(4095)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_USED ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_used">
+    <layout>
+      <xml name="used" nodeType="xs:element"/>
+      <!-- <sql table="used"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_GENERATED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_generated_by">
+    <layout>
+      <xml name="wasGeneratedBy" nodeType="xs:element"/>
+      <!-- <sql table="was_generated_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_CONTROLLED_BY +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_controlled_by">
+    <layout>
+      <xml name="wasControlledBy" nodeType="xs:element"/>
+      <!-- <sql table="was_controlled_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_agent_id"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="start" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="end" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_DERIVED_FROM ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_derived_from">
+    <layout>
+      <xml name="wasDerivedFrom" nodeType="xs:element"/>
+      <!-- <sql table="was_derived_from"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_TRIGGERED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_triggered_by">
+    <layout>
+      <xml name="wasTriggeredBy" nodeType="xs:element"/>
+      <!-- <sql table="was_triggered_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_DOCUMENT +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_document">
+    <layout>
+      <xml name="prov:document" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_entity" ref="true" object="prov_entity" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_activity" ref="true" object="prov_activity" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_agent" ref="true" object="prov_agent" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </property>
+    
+    <property name="vt_connection" ref="true" object="vt_connection" type="list" 
+          mapping="one-to-many">
+      <xml name="vt:connection" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_usage" ref="true" object="prov_usage" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:used" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_generation" ref="true" object="prov_generation" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:wasGeneratedBy" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_association" ref="true" object="prov_association" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:wasAssociatedWith" nodeType="xs:element"/>
+    </property>
+    
+    <!--<property name="vt_part" ref="true" object="vt_part" type="list" 
+          mapping="one-to-many">
+      <xml name="vt:isPartOf" nodeType="xs:element"/>
+    </property>-->
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_ENTITY +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_entity">
+    <layout>
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="prov:id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+    
+    <property name="prov_type" type="str">
+      <xml name="prov:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_label" type="str">
+      <xml name="prov:label" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_value" type="str">
+      <xml name="prov:value" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_id" type="str">
+      <xml name="vt:id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_type" type="str">
+      <xml name="vt:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_desc" type="str">
+      <xml name="vt:desc" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_package" type="str">
+      <xml name="vt:package" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_version" type="str">
+      <xml name="vt:version" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_cache" type="str">
+      <xml name="vt:cache" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_location_x" type="str">
+      <xml name="vt:location_x" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_location_y" type="str">
+      <xml name="vt:location_y" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="is_part_of" ref="true" object="is_part_of" type="str">
+      <xml name="dcterms:isPartOf" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_ENTITY +++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_entity">
+    <layout>
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_entity">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_PLAN +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_plan">
+    <layout>
+      <xml name="prov:plan" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_entity">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_ACTIVITY +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_activity">
+    <layout>
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="prov:id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+    
+    <property name="startTime" type="str">
+      <xml name="prov:startTime" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="endTime" type="str">
+      <xml name="prov:endTime" nodeType="xs:element" type="xs:string"/>
+    </property>
+
+    <property name="vt_id" type="str" primaryKey="true">
+      <xml name="vt:id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_type" type="str">
+      <xml name="vt:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_cached" type="str">
+      <xml name="vt:cached" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_completed" type="str">
+      <xml name="vt:completed" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_id" type="str">
+      <xml name="vt:machine_id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_error" type="str">
+      <xml name="vt:error" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="is_part_of" ref="true" object="is_part_of" type="str">
+      <xml name="dcterms:isPartOf" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_ACTIVITY +++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_activity">
+    <layout>
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_activity">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_AGENT ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_agent">
+    <layout>
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="prov:id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+
+    <property name="vt_id" type="str">
+      <xml name="vt:id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_type" type="str">
+      <xml name="prov:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_label" type="str">
+      <xml name="prov:label" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_os" type="str">
+      <xml name="vt:machine_os" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_architecture" type="str">
+      <xml name="vt:machine_architecture" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_processor" type="str">
+      <xml name="vt:machine_processor" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_ram" type="str">
+      <xml name="vt:machine_ram" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_AGENT ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_agent">
+    <layout>
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_agent">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VT_CONNECTION +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vt_connection">
+    <layout>
+      <xml name="vt:connection" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+
+    <property name="vt_source" type="str">
+      <xml name="vt:source" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_dest" type="str">
+      <xml name="vt:dest" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_source_port" type="str">
+      <xml name="vt:source_port" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_dest_port" type="str">
+      <xml name="vt:dest_port" nodeType="xs:element" type="xs:string"/>
+    </property>
+      
+    <property name="vt_source_signature" type="str">
+      <xml name="vt:source_signature" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_dest_signature" type="str">
+      <xml name="vt:dest_signature" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_USAGE ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_usage">
+    <layout>
+      <xml name="prov:used" nodeType="xs:element"/>
+    </layout>
+
+    <!--<property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>-->
+    
+    <property name="prov_activity" ref="true" object="ref_prov_activity" type="str">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_entity" ref="true" object="ref_prov_entity" type="str">
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_role" type="str">
+      <xml name="prov:role" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_GENERATION +++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_generation">
+    <layout>
+      <xml name="prov:wasGeneratedBy" nodeType="xs:element"/>
+    </layout>
+
+    <!--<property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>-->
+    
+    <property name="prov_entity" ref="true" object="ref_prov_entity" type="str">
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_activity" ref="true" object="ref_prov_activity" type="str">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_role" type="str">
+      <xml name="prov:role" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_ASSOCIATION ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_association">
+    <layout>
+      <xml name="prov:wasAssociatedWith" nodeType="xs:element"/>
+    </layout>
+
+    <!--<property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>-->
+    
+    <property name="prov_activity" ref="true" object="ref_prov_activity" type="str">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_agent" ref="true" object="ref_prov_agent" type="str">
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_plan" ref="true" object="ref_prov_plan" type="str">
+      <xml name="prov:plan" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_role" type="str">
+      <xml name="prov:role" nodeType="xs:element" type="xs:string"/>
+    </property>  
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- IS_PART_OF ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="is_part_of">
+    <layout>
+      <xml name="dcterms:isPartOf" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+</objects>
diff --git a/vistrails/db/tests/__init__.py b/vistrails/db/tests/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/db/tests/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/db/tests/setup_db_tables.py b/vistrails/db/tests/setup_db_tables.py
new file mode 100644
index 0000000..00f9fde
--- /dev/null
+++ b/vistrails/db/tests/setup_db_tables.py
@@ -0,0 +1,65 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# MACOSX binary install stuff
+import os
+import sys
+from vistrails.db.services import io
+
+sys.path.append("../..")
+
+def setup_tables(host, port, user, passwd, db):
+    config = {'host': host, 
+              'port': port,
+              'user': user,
+              'passwd': passwd,
+              'db': db}
+
+    try:
+        db_connection = io.open_db_connection(config)
+        io.setup_db_tables(db_connection)
+    except Exception, e:
+        print e
+
+if __name__ == '__main__':
+    args = sys.argv
+    if len(args) > 4:
+        host = str(args[1])
+        port = 3306
+        user = str(args[2])
+        passwd = str(args[3])
+        db = str(args[4])
+        setup_tables(host, port, user, passwd, db)
+    else:
+        print "Usage: %s host user passwd db" % args[0]
diff --git a/vistrails/db/tests/sql_to_xml.py b/vistrails/db/tests/sql_to_xml.py
new file mode 100644
index 0000000..e9ff98c
--- /dev/null
+++ b/vistrails/db/tests/sql_to_xml.py
@@ -0,0 +1,69 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# MACOSX binary install stuff
+import os
+
+import MySQLdb
+
+from vistrails.db.services import io
+import vistrails.tests
+
+if __name__ != '__main__':
+    import vistrails.tests
+    raise vistrails.tests.NotModule('This should not be imported as a module')
+    
+os.environ['EXECUTABLEPATH'] = '/vistrails/VisTrails.app/Contents/MacOS'
+
+
+
+def convert_sql_to_xml(filename, id):
+    config = {'host': 'localhost', 
+              'port': 3306,
+              'user': 'vistrails',
+              'passwd': 'vistrailspwd',
+              'db': 'vistrails'}
+    try:
+        dbConnection = io.open_db_connection(config)        
+        vistrail = io.open_vistrail_from_db(dbConnection, id)
+        io.setDBParameters(vistrail, config)
+        io.save_vistrail_to_xml(vistrail, filename)
+        io.close_db_connection(dbConnection)
+    except MySQLdb.Error, e:
+        print e
+
+if __name__ == '__main__':
+    convert_sql_to_xml('/vistrails/vtk_http_from_db.xml', 1)
+    # convert_sql_to_xml('/vistrails/head_from_db.xml', 1)
+    # convert_sql_to_xml('/vistrails/lung_from_db.xml', 2)
diff --git a/vistrails/db/tests/xml_to_sql.py b/vistrails/db/tests/xml_to_sql.py
new file mode 100644
index 0000000..d599836
--- /dev/null
+++ b/vistrails/db/tests/xml_to_sql.py
@@ -0,0 +1,69 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# MACOSX binary install stuff
+import os
+
+from vistrails.db.services import io
+
+os.environ['EXECUTABLEPATH'] = '/vistrails/VisTrails.app/Contents/MacOS'
+
+
+def convert_xml_to_sql(filename):
+    config = {'host': 'localhost', 
+              'port': 3306,
+              'user': 'vistrails',
+              'passwd': 'vistrailspwd',
+              'db': 'vistrails'}
+
+    try:
+        vistrail = io.open_vistrail_from_xml(filename)
+        dbConnection = io.open_db_connection(config)
+
+        print dbConnection.get_server_info()
+        print dbConnection.get_host_info()
+        print dbConnection.stat()
+        print str(dbConnection)
+
+        io.save_vistrail_to_db(vistrail, dbConnection)
+        io.close_db_connection(dbConnection)
+        print 'db_id: ', vistrail.db_id
+
+    except Exception, e:
+        print e
+
+if __name__ == '__main__':
+    # convert_xml_to_sql('/vistrails/vtk_http_new.xml')
+    convert_xml_to_sql('/vistrails/examples/head.xml')
+    # convert_xml_to_sql('/vistrails/examples/lung.xml')
diff --git a/vistrails/db/versions/__init__.py b/vistrails/db/versions/__init__.py
new file mode 100644
index 0000000..ad96364
--- /dev/null
+++ b/vistrails/db/versions/__init__.py
@@ -0,0 +1,165 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from itertools import izip
+import os
+
+from vistrails.core.system import vistrails_root_directory
+from vistrails.db import VistrailsDBException
+
+currentVersion = '1.0.3'
+
+def getVersionDAO(version=None):
+    if version is None:
+        version = currentVersion
+    persistence_dir = 'vistrails.db.versions.' + get_version_name(version) + \
+        '.persistence'
+    try:
+        persistence = __import__(persistence_dir, {}, {}, [''])
+    except ImportError as e:
+        if str(e).startswith('No module named v'):
+            # assume version is not available
+            msg = "Cannot find DAO for version '%s'" % version
+            raise VistrailsDBException(msg)
+        # assume other error
+        import traceback
+        raise VistrailsDBException(traceback.format_exc())
+    return persistence.DAOList()
+
+def translate_object(obj, method_name, version=None, target_version=None):
+    if version is None:
+        version = obj.version
+    if target_version is None:
+        target_version = currentVersion
+
+    version_map = {
+        '0.3.0': '0.3.1',
+        '0.3.1': '0.6.0',
+        '0.5.0': '0.6.0',
+        '0.6.0': '0.7.0',
+        '0.7.0': '0.8.0',
+        '0.8.0': '0.8.1',
+        '0.8.1': '0.9.0',
+        '0.9.0': '0.9.1',
+        '0.9.1': '0.9.3',
+        '0.9.2': '0.9.3',
+        '0.9.3': '0.9.4',
+        '0.9.4': '0.9.5',
+        '0.9.5': '1.0.0',
+        '1.0.0': '1.0.1',
+        '1.0.1': '1.0.2',
+        '1.0.2': '1.0.3',
+        }
+
+    rev_version_map = {
+        '1.0.3': '1.0.2',
+        '1.0.2': '1.0.1',
+        '1.0.1': '1.0.0',
+        '1.0.0': '0.9.5',
+        '0.9.5': '0.9.4',
+        '0.9.4': '0.9.3',
+        }
+
+    def get_translate_module(map, start_version, end_version):
+        translate_dir = 'vistrails.db.versions.' + \
+            get_version_name(end_version) + '.translate.' + \
+            get_version_name(start_version)
+        return __import__(translate_dir, {}, {}, [''])
+
+    path = []
+    old_tuple = version.split('.')
+    new_tuple = target_version.split('.')
+    map = version_map
+    for i, j in izip(old_tuple, new_tuple):
+        if i < j:
+            # forward
+            break
+        elif i > j:
+            # reverse
+            map = rev_version_map
+            break
+
+    # don't get stuck in an infinite loop
+    count = 0
+    while version != target_version:
+        if count > len(map):
+            break
+        next_version = map[version]
+        try:
+            translate_module = get_translate_module(map, version, next_version)
+        except Exception, e:
+            import traceback
+            raise VistrailsDBException("Cannot translate version: "
+                                       "error loading translation version %s method '%s': %s" % \
+                                           (version, method_name, traceback.format_exc()))
+        if not hasattr(translate_module, method_name):
+            raise VistrailsDBException("Cannot translate version: "
+                                       "version %s missing method '%s'" % \
+                                           (version, method_name))
+        obj = getattr(translate_module, method_name)(obj)
+        version = next_version
+        count += 1
+
+    if version != target_version:
+        msg = "An error occurred when translating,"
+        msg += "only able to translate to version '%s'" % version
+        raise VistrailsDBException(msg)
+
+    return obj
+
+def translate_vistrail(vistrail, version=None, target_version=None):
+    return translate_object(vistrail, 'translateVistrail', version, 
+                            target_version)
+
+def translate_workflow(workflow, version=None, target_version=None):
+    return translate_object(workflow, 'translateWorkflow', version, 
+                            target_version)
+
+def translate_log(log, version=None, target_version=None):
+    return translate_object(log, 'translateLog', version, target_version)
+
+def translate_registry(registry, version=None, target_version=None):
+    return translate_object(registry, 'translateRegistry', version, 
+                            target_version)
+
+def get_version_name(version_no):
+    return 'v' + version_no.replace('.', '_')
+
+def getVersionSchemaDir(version=None):
+    if version is None:
+        version = currentVersion
+    versionName = get_version_name(version)
+    schemaDir = os.path.join(vistrails_root_directory(), 'db', 'versions', 
+                             versionName, 'schemas', 'sql')
+    return schemaDir
diff --git a/vistrails/db/versions/v0_3_0/__init__.py b/vistrails/db/versions/v0_3_0/__init__.py
new file mode 100644
index 0000000..a6ad05c
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.3.0'
diff --git a/vistrails/db/versions/v0_3_0/domain/__init__.py b/vistrails/db/versions/v0_3_0/domain/__init__.py
new file mode 100644
index 0000000..1870fdf
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/domain/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
diff --git a/vistrails/db/versions/v0_3_0/domain/auto_gen.py b/vistrails/db/versions/v0_3_0/domain/auto_gen.py
new file mode 100644
index 0000000..9a5f3e6
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/domain/auto_gen.py
@@ -0,0 +1,876 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+class DBChangeParameter(object):
+
+    vtType = 'changeParameter'
+
+    def __init__(self, moduleId=None, alias=None, functionId=None, function=None, parameterId=None, parameter=None, type=None, value=None):
+        self.__db_moduleId = moduleId
+        self.__db_alias = alias
+        self.__db_functionId = functionId
+        self.__db_function = function
+        self.__db_parameterId = parameterId
+        self.__db_parameter = parameter
+        self.__db_type = type
+        self.__db_value = value
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_alias(self):
+        return self.__db_alias
+    def __set_db_alias(self, alias):
+        self.__db_alias = alias
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self.__db_alias = alias
+    def db_change_alias(self, alias):
+        self.__db_alias = alias
+    def db_delete_alias(self, alias):
+        self.__db_alias = None
+    
+    def __get_db_functionId(self):
+        return self.__db_functionId
+    def __set_db_functionId(self, functionId):
+        self.__db_functionId = functionId
+    db_functionId = property(__get_db_functionId, __set_db_functionId)
+    def db_add_functionId(self, functionId):
+        self.__db_functionId = functionId
+    def db_change_functionId(self, functionId):
+        self.__db_functionId = functionId
+    def db_delete_functionId(self, functionId):
+        self.__db_functionId = None
+    
+    def __get_db_function(self):
+        return self.__db_function
+    def __set_db_function(self, function):
+        self.__db_function = function
+    db_function = property(__get_db_function, __set_db_function)
+    def db_add_function(self, function):
+        self.__db_function = function
+    def db_change_function(self, function):
+        self.__db_function = function
+    def db_delete_function(self, function):
+        self.__db_function = None
+    
+    def __get_db_parameterId(self):
+        return self.__db_parameterId
+    def __set_db_parameterId(self, parameterId):
+        self.__db_parameterId = parameterId
+    db_parameterId = property(__get_db_parameterId, __set_db_parameterId)
+    def db_add_parameterId(self, parameterId):
+        self.__db_parameterId = parameterId
+    def db_change_parameterId(self, parameterId):
+        self.__db_parameterId = parameterId
+    def db_delete_parameterId(self, parameterId):
+        self.__db_parameterId = None
+    
+    def __get_db_parameter(self):
+        return self.__db_parameter
+    def __set_db_parameter(self, parameter):
+        self.__db_parameter = parameter
+    db_parameter = property(__get_db_parameter, __set_db_parameter)
+    def db_add_parameter(self, parameter):
+        self.__db_parameter = parameter
+    def db_change_parameter(self, parameter):
+        self.__db_parameter = parameter
+    def db_delete_parameter(self, parameter):
+        self.__db_parameter = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
+"""generated automatically by auto_dao.py"""
+
+class DBDeleteFunction(object):
+
+    vtType = 'deleteFunction'
+
+    def __init__(self, moduleId=None, functionId=None):
+        self.__db_moduleId = moduleId
+        self.__db_functionId = functionId
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_functionId(self):
+        return self.__db_functionId
+    def __set_db_functionId(self, functionId):
+        self.__db_functionId = functionId
+    db_functionId = property(__get_db_functionId, __set_db_functionId)
+    def db_add_functionId(self, functionId):
+        self.__db_functionId = functionId
+    def db_change_functionId(self, functionId):
+        self.__db_functionId = functionId
+    def db_delete_functionId(self, functionId):
+        self.__db_functionId = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
+"""generated automatically by auto_dao.py"""
+
+class DBDeleteConnection(object):
+
+    vtType = 'deleteConnection'
+
+    def __init__(self, connectionId=None):
+        self.__db_connectionId = connectionId
+    def __get_db_connectionId(self):
+        return self.__db_connectionId
+    def __set_db_connectionId(self, connectionId):
+        self.__db_connectionId = connectionId
+    db_connectionId = property(__get_db_connectionId, __set_db_connectionId)
+    def db_add_connectionId(self, connectionId):
+        self.__db_connectionId = connectionId
+    def db_change_connectionId(self, connectionId):
+        self.__db_connectionId = connectionId
+    def db_delete_connectionId(self, connectionId):
+        self.__db_connectionId = None
+    
+    def getPrimaryKey(self):
+        return self.__db_connectionId
+
+"""generated automatically by auto_dao.py"""
+
+class DBAddModule(object):
+
+    vtType = 'addModule'
+
+    def __init__(self, id=None, cache=None, name=None, x=None, y=None):
+        self.__db_id = id
+        self.__db_cache = cache
+        self.__db_name = name
+        self.__db_x = x
+        self.__db_y = y
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_x(self):
+        return self.__db_x
+    def __set_db_x(self, x):
+        self.__db_x = x
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self.__db_x = x
+    def db_change_x(self, x):
+        self.__db_x = x
+    def db_delete_x(self, x):
+        self.__db_x = None
+    
+    def __get_db_y(self):
+        return self.__db_y
+    def __set_db_y(self, y):
+        self.__db_y = y
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self.__db_y = y
+    def db_change_y(self, y):
+        self.__db_y = y
+    def db_delete_y(self, y):
+        self.__db_y = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+"""generated automatically by auto_dao.py"""
+
+class DBDeleteAnnotation(object):
+
+    vtType = 'deleteAnnotation'
+
+    def __init__(self, moduleId=None, key=None):
+        self.__db_moduleId = moduleId
+        self.__db_key = key
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
+"""generated automatically by auto_dao.py"""
+
+class DBDeleteModulePort(object):
+
+    vtType = 'deleteModulePort'
+
+    def __init__(self, moduleId=None, portType=None, portName=None):
+        self.__db_moduleId = moduleId
+        self.__db_portType = portType
+        self.__db_portName = portName
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_portType(self):
+        return self.__db_portType
+    def __set_db_portType(self, portType):
+        self.__db_portType = portType
+    db_portType = property(__get_db_portType, __set_db_portType)
+    def db_add_portType(self, portType):
+        self.__db_portType = portType
+    def db_change_portType(self, portType):
+        self.__db_portType = portType
+    def db_delete_portType(self, portType):
+        self.__db_portType = None
+    
+    def __get_db_portName(self):
+        return self.__db_portName
+    def __set_db_portName(self, portName):
+        self.__db_portName = portName
+    db_portName = property(__get_db_portName, __set_db_portName)
+    def db_add_portName(self, portName):
+        self.__db_portName = portName
+    def db_change_portName(self, portName):
+        self.__db_portName = portName
+    def db_delete_portName(self, portName):
+        self.__db_portName = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
+"""generated automatically by auto_dao.py"""
+
+class DBDeleteModule(object):
+
+    vtType = 'deleteModule'
+
+    def __init__(self, moduleId=None):
+        self.__db_moduleId = moduleId
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
+"""generated automatically by auto_dao.py"""
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, time=None, name=None):
+        self.__db_time = time
+        self.__db_name = name
+    def __get_db_time(self):
+        return self.__db_time
+    def __set_db_time(self, time):
+        self.__db_time = time
+    db_time = property(__get_db_time, __set_db_time)
+    def db_add_time(self, time):
+        self.__db_time = time
+    def db_change_time(self, time):
+        self.__db_time = time
+    def db_delete_time(self, time):
+        self.__db_time = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def getPrimaryKey(self):
+        return self.__db_time
+
+"""generated automatically by auto_dao.py"""
+
+class DBAddModulePort(object):
+
+    vtType = 'addModulePort'
+
+    def __init__(self, moduleId=None, portType=None, portName=None, portSpec=None):
+        self.__db_moduleId = moduleId
+        self.__db_portType = portType
+        self.__db_portName = portName
+        self.__db_portSpec = portSpec
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_portType(self):
+        return self.__db_portType
+    def __set_db_portType(self, portType):
+        self.__db_portType = portType
+    db_portType = property(__get_db_portType, __set_db_portType)
+    def db_add_portType(self, portType):
+        self.__db_portType = portType
+    def db_change_portType(self, portType):
+        self.__db_portType = portType
+    def db_delete_portType(self, portType):
+        self.__db_portType = None
+    
+    def __get_db_portName(self):
+        return self.__db_portName
+    def __set_db_portName(self, portName):
+        self.__db_portName = portName
+    db_portName = property(__get_db_portName, __set_db_portName)
+    def db_add_portName(self, portName):
+        self.__db_portName = portName
+    def db_change_portName(self, portName):
+        self.__db_portName = portName
+    def db_delete_portName(self, portName):
+        self.__db_portName = None
+    
+    def __get_db_portSpec(self):
+        return self.__db_portSpec
+    def __set_db_portSpec(self, portSpec):
+        self.__db_portSpec = portSpec
+    db_portSpec = property(__get_db_portSpec, __set_db_portSpec)
+    def db_add_portSpec(self, portSpec):
+        self.__db_portSpec = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.__db_portSpec = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.__db_portSpec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
+"""generated automatically by auto_dao.py"""
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, time=None, parent=None, user=None, what=None, date=None, notes=None, datas=None):
+        self.__db_time = time
+        self.__db_parent = parent
+        self.__db_user = user
+        self.__db_what = what
+        self.__db_date = date
+        self.__db_notes = notes
+        if datas is None:
+            self.__db_datas = []
+        else:
+            self.__db_datas = datas
+    def __get_db_time(self):
+        return self.__db_time
+    def __set_db_time(self, time):
+        self.__db_time = time
+    db_time = property(__get_db_time, __set_db_time)
+    def db_add_time(self, time):
+        self.__db_time = time
+    def db_change_time(self, time):
+        self.__db_time = time
+    def db_delete_time(self, time):
+        self.__db_time = None
+    
+    def __get_db_parent(self):
+        return self.__db_parent
+    def __set_db_parent(self, parent):
+        self.__db_parent = parent
+    db_parent = property(__get_db_parent, __set_db_parent)
+    def db_add_parent(self, parent):
+        self.__db_parent = parent
+    def db_change_parent(self, parent):
+        self.__db_parent = parent
+    def db_delete_parent(self, parent):
+        self.__db_parent = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_date(self):
+        return self.__db_date
+    def __set_db_date(self, date):
+        self.__db_date = date
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self.__db_date = date
+    def db_change_date(self, date):
+        self.__db_date = date
+    def db_delete_date(self, date):
+        self.__db_date = None
+    
+    def __get_db_notes(self):
+        return self.__db_notes
+    def __set_db_notes(self, notes):
+        self.__db_notes = notes
+    db_notes = property(__get_db_notes, __set_db_notes)
+    def db_add_notes(self, notes):
+        self.__db_notes = notes
+    def db_change_notes(self, notes):
+        self.__db_notes = notes
+    def db_delete_notes(self, notes):
+        self.__db_notes = None
+    
+    def __get_db_datas(self):
+        return self.__db_datas
+    def __set_db_datas(self, datas):
+        self.__db_datas = datas
+    db_datas = property(__get_db_datas, __set_db_datas)
+    def db_get_datas(self):
+        return self.__db_datas
+    def db_add_data(self, data):
+        self.__db_datas.append(data)
+    def db_change_data(self, data):
+        found = False
+        for i in xrange(len(self.__db_datas)):
+            if self.__db_datas[i].db_id == data.db_id:
+                self.__db_datas[i] = data
+                found = True
+                break
+        if not found:
+            self.__db_datas.append(data)
+    def db_delete_data(self, data):
+        for i in xrange(len(self.__db_datas)):
+            if self.__db_datas[i].db_id == data.db_id:
+                del self.__db_datas[i]
+                break
+    def db_get_data(self, key):
+        for i in xrange(len(self.__db_datas)):
+            if self.__db_datas[i].db_id == data.db_id:
+                return self.__db_datas[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_time
+
+"""generated automatically by auto_dao.py"""
+
+class DBAddConnection(object):
+
+    vtType = 'addConnection'
+
+    def __init__(self, id=None, destinationId=None, destinationModule=None, destinationPort=None, sourceId=None, sourceModule=None, sourcePort=None):
+        self.__db_id = id
+        self.__db_destinationId = destinationId
+        self.__db_destinationModule = destinationModule
+        self.__db_destinationPort = destinationPort
+        self.__db_sourceId = sourceId
+        self.__db_sourceModule = sourceModule
+        self.__db_sourcePort = sourcePort
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_destinationId(self):
+        return self.__db_destinationId
+    def __set_db_destinationId(self, destinationId):
+        self.__db_destinationId = destinationId
+    db_destinationId = property(__get_db_destinationId, __set_db_destinationId)
+    def db_add_destinationId(self, destinationId):
+        self.__db_destinationId = destinationId
+    def db_change_destinationId(self, destinationId):
+        self.__db_destinationId = destinationId
+    def db_delete_destinationId(self, destinationId):
+        self.__db_destinationId = None
+    
+    def __get_db_destinationModule(self):
+        return self.__db_destinationModule
+    def __set_db_destinationModule(self, destinationModule):
+        self.__db_destinationModule = destinationModule
+    db_destinationModule = property(__get_db_destinationModule, __set_db_destinationModule)
+    def db_add_destinationModule(self, destinationModule):
+        self.__db_destinationModule = destinationModule
+    def db_change_destinationModule(self, destinationModule):
+        self.__db_destinationModule = destinationModule
+    def db_delete_destinationModule(self, destinationModule):
+        self.__db_destinationModule = None
+    
+    def __get_db_destinationPort(self):
+        return self.__db_destinationPort
+    def __set_db_destinationPort(self, destinationPort):
+        self.__db_destinationPort = destinationPort
+    db_destinationPort = property(__get_db_destinationPort, __set_db_destinationPort)
+    def db_add_destinationPort(self, destinationPort):
+        self.__db_destinationPort = destinationPort
+    def db_change_destinationPort(self, destinationPort):
+        self.__db_destinationPort = destinationPort
+    def db_delete_destinationPort(self, destinationPort):
+        self.__db_destinationPort = None
+    
+    def __get_db_sourceId(self):
+        return self.__db_sourceId
+    def __set_db_sourceId(self, sourceId):
+        self.__db_sourceId = sourceId
+    db_sourceId = property(__get_db_sourceId, __set_db_sourceId)
+    def db_add_sourceId(self, sourceId):
+        self.__db_sourceId = sourceId
+    def db_change_sourceId(self, sourceId):
+        self.__db_sourceId = sourceId
+    def db_delete_sourceId(self, sourceId):
+        self.__db_sourceId = None
+    
+    def __get_db_sourceModule(self):
+        return self.__db_sourceModule
+    def __set_db_sourceModule(self, sourceModule):
+        self.__db_sourceModule = sourceModule
+    db_sourceModule = property(__get_db_sourceModule, __set_db_sourceModule)
+    def db_add_sourceModule(self, sourceModule):
+        self.__db_sourceModule = sourceModule
+    def db_change_sourceModule(self, sourceModule):
+        self.__db_sourceModule = sourceModule
+    def db_delete_sourceModule(self, sourceModule):
+        self.__db_sourceModule = None
+    
+    def __get_db_sourcePort(self):
+        return self.__db_sourcePort
+    def __set_db_sourcePort(self, sourcePort):
+        self.__db_sourcePort = sourcePort
+    db_sourcePort = property(__get_db_sourcePort, __set_db_sourcePort)
+    def db_add_sourcePort(self, sourcePort):
+        self.__db_sourcePort = sourcePort
+    def db_change_sourcePort(self, sourcePort):
+        self.__db_sourcePort = sourcePort
+    def db_delete_sourcePort(self, sourcePort):
+        self.__db_sourcePort = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+"""generated automatically by auto_dao.py"""
+
+class DBMoveModule(object):
+
+    vtType = 'moveModule'
+
+    def __init__(self, id=None, dx=None, dy=None):
+        self.__db_id = id
+        self.__db_dx = dx
+        self.__db_dy = dy
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_dx(self):
+        return self.__db_dx
+    def __set_db_dx(self, dx):
+        self.__db_dx = dx
+    db_dx = property(__get_db_dx, __set_db_dx)
+    def db_add_dx(self, dx):
+        self.__db_dx = dx
+    def db_change_dx(self, dx):
+        self.__db_dx = dx
+    def db_delete_dx(self, dx):
+        self.__db_dx = None
+    
+    def __get_db_dy(self):
+        return self.__db_dy
+    def __set_db_dy(self, dy):
+        self.__db_dy = dy
+    db_dy = property(__get_db_dy, __set_db_dy)
+    def db_add_dy(self, dy):
+        self.__db_dy = dy
+    def db_change_dy(self, dy):
+        self.__db_dy = dy
+    def db_delete_dy(self, dy):
+        self.__db_dy = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+"""generated automatically by auto_dao.py"""
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, version=None, actions=None, tags=None):
+        self.__db_version = version
+        if actions is None:
+            self.__db_actions = {}
+        else:
+            self.__db_actions = actions
+        if tags is None:
+            self.__db_tags = {}
+        else:
+            self.__db_tags = tags
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions.values()
+    def db_add_action(self, action):
+        self.__db_actions[action.db_time] = action
+    def db_change_action(self, action):
+        self.__db_actions[action.db_time] = action
+    def db_delete_action(self, action):
+        del self.__db_actions[action.db_time]
+    def db_get_action(self, key):
+        if self.__db_actions.has_key(key):
+            return self.__db_actions[key]
+        return None
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags.values()
+    def db_add_tag(self, tag):
+        self.__db_tags[tag.db_time] = tag
+    def db_change_tag(self, tag):
+        self.__db_tags[tag.db_time] = tag
+    def db_delete_tag(self, tag):
+        del self.__db_tags[tag.db_time]
+    def db_get_tag(self, key):
+        if self.__db_tags.has_key(key):
+            return self.__db_tags[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_version
+
+"""generated automatically by auto_dao.py"""
+
+class DBChangeAnnotation(object):
+
+    vtType = 'changeAnnotation'
+
+    def __init__(self, moduleId=None, key=None, value=None):
+        self.__db_moduleId = moduleId
+        self.__db_key = key
+        self.__db_value = value
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_moduleId
+
diff --git a/vistrails/db/versions/v0_3_0/persistence/__init__.py b/vistrails/db/versions/v0_3_0/persistence/__init__.py
new file mode 100644
index 0000000..fca428d
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/persistence/__init__.py
@@ -0,0 +1,53 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from xml.auto_gen import XMLDAOListBase
+import xml.io
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+
+    def open_from_xml(self, filename, vtType, tree=None):
+        return xml.io.open_from_xml(filename, vtType, self['xml'])
+
+    def save_to_xml(self, obj, filename):
+        xml.io.save_to_xml(obj, filename, self['xml'])
+
+    def serialize(self, obj):
+        return xml.io.serialize(obj, self['xml'])
+
+    def unserialize(self, str, type):
+        return xml.io.unserialize(str, type, self['xml'])
diff --git a/vistrails/db/versions/v0_3_0/persistence/xml/__init__.py b/vistrails/db/versions/v0_3_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_3_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_3_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..7371db2
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/persistence/xml/auto_gen.py
@@ -0,0 +1,638 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.db.versions.v0_3_0.persistence.xml.xml_dao import XMLDAO
+from vistrails.db.versions.v0_3_0.domain.auto_gen import *
+
+class DBChangeParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'set':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        alias = self.convertFromStr(self.getAttribute(node, 'alias'), 'str')
+        functionId = self.convertFromStr(self.getAttribute(node, 'functionId'), 'long')
+        function = self.convertFromStr(self.getAttribute(node, 'function'), 'str')
+        parameterId = self.convertFromStr(self.getAttribute(node, 'parameterId'), 'long')
+        parameter = self.convertFromStr(self.getAttribute(node, 'parameter'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        value = self.convertFromStr(self.getAttribute(node, 'value'), 'str')
+        
+        return DBChangeParameter(moduleId=moduleId,
+                                 alias=alias,
+                                 functionId=functionId,
+                                 function=function,
+                                 parameterId=parameterId,
+                                 parameter=parameter,
+                                 type=type,
+                                 value=value)
+    
+    def toXML(self, changeParameter, doc):
+        node = doc.createElement('set')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(changeParameter.db_moduleId, 'long'))
+        node.setAttribute('alias',self.convertToStr(changeParameter.db_alias, 'str'))
+        node.setAttribute('functionId',self.convertToStr(changeParameter.db_functionId, 'long'))
+        node.setAttribute('function',self.convertToStr(changeParameter.db_function, 'str'))
+        node.setAttribute('parameterId',self.convertToStr(changeParameter.db_parameterId, 'long'))
+        node.setAttribute('parameter',self.convertToStr(changeParameter.db_parameter, 'str'))
+        node.setAttribute('type',self.convertToStr(changeParameter.db_type, 'str'))
+        node.setAttribute('value',self.convertToStr(changeParameter.db_value, 'str'))
+        
+        return node
+
+class DBDeleteFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'function':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        functionId = self.convertFromStr(self.getAttribute(node, 'functionId'), 'long')
+        
+        return DBDeleteFunction(moduleId=moduleId,
+                                functionId=functionId)
+    
+    def toXML(self, deleteFunction, doc):
+        node = doc.createElement('function')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(deleteFunction.db_moduleId, 'long'))
+        node.setAttribute('functionId',self.convertToStr(deleteFunction.db_functionId, 'long'))
+        
+        return node
+
+class DBDeleteConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'connection':
+            return None
+        
+        # read attributes
+        connectionId = self.convertFromStr(self.getAttribute(node, 'connectionId'), 'long')
+        
+        return DBDeleteConnection(connectionId=connectionId)
+    
+    def toXML(self, deleteConnection, doc):
+        node = doc.createElement('connection')
+        
+        # set attributes
+        node.setAttribute('connectionId',self.convertToStr(deleteConnection.db_connectionId, 'long'))
+        
+        return node
+
+class DBAddModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'object':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        cache = self.convertFromStr(self.getAttribute(node, 'cache'), 'int')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        x = self.convertFromStr(self.getAttribute(node, 'x'), 'float')
+        y = self.convertFromStr(self.getAttribute(node, 'y'), 'float')
+        
+        return DBAddModule(id=id,
+                           cache=cache,
+                           name=name,
+                           x=x,
+                           y=y)
+    
+    def toXML(self, addModule, doc):
+        node = doc.createElement('object')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(addModule.db_id, 'long'))
+        node.setAttribute('cache',self.convertToStr(addModule.db_cache, 'int'))
+        node.setAttribute('name',self.convertToStr(addModule.db_name, 'str'))
+        node.setAttribute('x',self.convertToStr(addModule.db_x, 'float'))
+        node.setAttribute('y',self.convertToStr(addModule.db_y, 'float'))
+        
+        return node
+
+class DBDeleteAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'annotation':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        
+        return DBDeleteAnnotation(moduleId=moduleId,
+                                  key=key)
+    
+    def toXML(self, deleteAnnotation, doc):
+        node = doc.createElement('annotation')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(deleteAnnotation.db_moduleId, 'long'))
+        node.setAttribute('key',self.convertToStr(deleteAnnotation.db_key, 'str'))
+        
+        return node
+
+class DBDeleteModulePortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'deletePort':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        portType = self.convertFromStr(self.getAttribute(node, 'portType'), 'str')
+        portName = self.convertFromStr(self.getAttribute(node, 'portName'), 'str')
+        
+        return DBDeleteModulePort(moduleId=moduleId,
+                                  portType=portType,
+                                  portName=portName)
+    
+    def toXML(self, deleteModulePort, doc):
+        node = doc.createElement('deletePort')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(deleteModulePort.db_moduleId, 'long'))
+        node.setAttribute('portType',self.convertToStr(deleteModulePort.db_portType, 'str'))
+        node.setAttribute('portName',self.convertToStr(deleteModulePort.db_portName, 'str'))
+        
+        return node
+
+class DBDeleteModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'module':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        
+        return DBDeleteModule(moduleId=moduleId)
+    
+    def toXML(self, deleteModule, doc):
+        node = doc.createElement('module')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(deleteModule.db_moduleId, 'long'))
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'tag':
+            return None
+        
+        # read attributes
+        time = self.convertFromStr(self.getAttribute(node, 'time'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        return DBTag(time=time,
+                     name=name)
+    
+    def toXML(self, tag, doc):
+        node = doc.createElement('tag')
+        
+        # set attributes
+        node.setAttribute('time',self.convertToStr(tag.db_time, 'long'))
+        node.setAttribute('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBAddModulePortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'addPort':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        portType = self.convertFromStr(self.getAttribute(node, 'portType'), 'str')
+        portName = self.convertFromStr(self.getAttribute(node, 'portName'), 'str')
+        portSpec = self.convertFromStr(self.getAttribute(node, 'portSpec'), 'str')
+        
+        return DBAddModulePort(moduleId=moduleId,
+                               portType=portType,
+                               portName=portName,
+                               portSpec=portSpec)
+    
+    def toXML(self, addModulePort, doc):
+        node = doc.createElement('addPort')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(addModulePort.db_moduleId, 'long'))
+        node.setAttribute('portType',self.convertToStr(addModulePort.db_portType, 'str'))
+        node.setAttribute('portName',self.convertToStr(addModulePort.db_portName, 'str'))
+        node.setAttribute('portSpec',self.convertToStr(addModulePort.db_portSpec, 'str'))
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'action':
+            return None
+        
+        datas = []
+        
+        # read attributes
+        time = self.convertFromStr(self.getAttribute(node, 'time'), 'long')
+        parent = self.convertFromStr(self.getAttribute(node, 'parent'), 'long')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        date = self.convertFromStr(self.getAttribute(node, 'date'), 'str')
+        
+        notes = None
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'notes':
+                notes = self.convertFromStr(child.firstChild.nodeValue,'str')
+            elif what == 'addModule' and child.nodeName == 'object':
+                data = self.getDao('addModule').fromXML(child)
+                datas.append(data)
+                what = 'addModule'
+            elif what == 'addConnection' and child.nodeName == 'connect':
+                data = self.getDao('addConnection').fromXML(child)
+                datas.append(data)
+                what = 'addConnection'
+            elif what == 'changeParameter' and child.nodeName == 'set':
+                data = self.getDao('changeParameter').fromXML(child)
+                datas.append(data)
+                what = 'changeParameter'
+            elif what == 'changeAnnotation' and child.nodeName == 'set':
+                data = self.getDao('changeAnnotation').fromXML(child)
+                datas.append(data)
+                what = 'changeAnnotation'
+            elif what == 'addModulePort' and child.nodeName == 'addPort':
+                data = self.getDao('addModulePort').fromXML(child)
+                datas.append(data)
+                what = 'addModulePort'
+            elif what == 'moveModule' and child.nodeName == 'move':
+                data = self.getDao('moveModule').fromXML(child)
+                datas.append(data)
+                what = 'moveModule'
+            elif what == 'deleteModule' and child.nodeName == 'module':
+                data = self.getDao('deleteModule').fromXML(child)
+                datas.append(data)
+                what = 'deleteModule'
+            elif what == 'deleteConnection' and child.nodeName == 'connection':
+                data = self.getDao('deleteConnection').fromXML(child)
+                datas.append(data)
+                what = 'deleteConnection'
+            elif what == 'deleteFunction' and child.nodeName == 'function':
+                data = self.getDao('deleteFunction').fromXML(child)
+                datas.append(data)
+                what = 'deleteFunction'
+            elif what == 'deleteAnnotation' and child.nodeName == 'annotation':
+                data = self.getDao('deleteAnnotation').fromXML(child)
+                datas.append(data)
+                what = 'deleteAnnotation'
+            elif what == 'deleteModulePort' and child.nodeName == 'deletePort':
+                data = self.getDao('deleteModulePort').fromXML(child)
+                datas.append(data)
+                what = 'deleteModulePort'
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        return DBAction(time=time,
+                        parent=parent,
+                        user=user,
+                        what=what,
+                        date=date,
+                        notes=notes,
+                        datas=datas)
+    
+    def toXML(self, action, doc):
+        node = doc.createElement('action')
+        
+        # set attributes
+        node.setAttribute('time',self.convertToStr(action.db_time, 'long'))
+        node.setAttribute('parent',self.convertToStr(action.db_parent, 'long'))
+        node.setAttribute('user',self.convertToStr(action.db_user, 'str'))
+        node.setAttribute('what',self.convertToStr(action.db_what, 'str'))
+        node.setAttribute('date',self.convertToStr(action.db_date, 'str'))
+        
+        # set elements
+        if action.db_notes is not None:
+            child = action.db_notes
+            notesNode = doc.createElement('notes')
+            notesText = doc.createTextNode(self.convertToStr(child, 'str'))
+            notesNode.appendChild(notesText)
+            node.appendChild(notesNode)
+        datas = action.db_datas
+        for data in datas:
+            if action.db_what == 'addModule':
+                node.appendChild(self.getDao('addModule').toXML(data, doc))
+            elif action.db_what == 'addConnection':
+                node.appendChild(self.getDao('addConnection').toXML(data, doc))
+            elif action.db_what == 'changeParameter':
+                node.appendChild(self.getDao('changeParameter').toXML(data, doc))
+            elif action.db_what == 'changeAnnotation':
+                node.appendChild(self.getDao('changeAnnotation').toXML(data, doc))
+            elif action.db_what == 'addModulePort':
+                node.appendChild(self.getDao('addModulePort').toXML(data, doc))
+            elif action.db_what == 'moveModule':
+                node.appendChild(self.getDao('moveModule').toXML(data, doc))
+            elif action.db_what == 'deleteModule':
+                node.appendChild(self.getDao('deleteModule').toXML(data, doc))
+            elif action.db_what == 'deleteConnection':
+                node.appendChild(self.getDao('deleteConnection').toXML(data, doc))
+            elif action.db_what == 'deleteFunction':
+                node.appendChild(self.getDao('deleteFunction').toXML(data, doc))
+            elif action.db_what == 'deleteAnnotation':
+                node.appendChild(self.getDao('deleteAnnotation').toXML(data, doc))
+            elif action.db_what == 'deleteModulePort':
+                node.appendChild(self.getDao('deleteModulePort').toXML(data, doc))
+        
+        return node
+
+class DBAddConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'connect':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        destinationId = self.convertFromStr(self.getAttribute(node, 'destinationId'), 'long')
+        destinationModule = self.convertFromStr(self.getAttribute(node, 'destinationModule'), 'str')
+        destinationPort = self.convertFromStr(self.getAttribute(node, 'destinationPort'), 'str')
+        sourceId = self.convertFromStr(self.getAttribute(node, 'sourceId'), 'long')
+        sourceModule = self.convertFromStr(self.getAttribute(node, 'sourceModule'), 'str')
+        sourcePort = self.convertFromStr(self.getAttribute(node, 'sourcePort'), 'str')
+        
+        return DBAddConnection(id=id,
+                               destinationId=destinationId,
+                               destinationModule=destinationModule,
+                               destinationPort=destinationPort,
+                               sourceId=sourceId,
+                               sourceModule=sourceModule,
+                               sourcePort=sourcePort)
+    
+    def toXML(self, addConnection, doc):
+        node = doc.createElement('connect')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(addConnection.db_id, 'long'))
+        node.setAttribute('destinationId',self.convertToStr(addConnection.db_destinationId, 'long'))
+        node.setAttribute('destinationModule',self.convertToStr(addConnection.db_destinationModule, 'str'))
+        node.setAttribute('destinationPort',self.convertToStr(addConnection.db_destinationPort, 'str'))
+        node.setAttribute('sourceId',self.convertToStr(addConnection.db_sourceId, 'long'))
+        node.setAttribute('sourceModule',self.convertToStr(addConnection.db_sourceModule, 'str'))
+        node.setAttribute('sourcePort',self.convertToStr(addConnection.db_sourcePort, 'str'))
+        
+        return node
+
+class DBMoveModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'move':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        dx = self.convertFromStr(self.getAttribute(node, 'dx'), 'float')
+        dy = self.convertFromStr(self.getAttribute(node, 'dy'), 'float')
+        
+        return DBMoveModule(id=id,
+                            dx=dx,
+                            dy=dy)
+    
+    def toXML(self, moveModule, doc):
+        node = doc.createElement('move')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(moveModule.db_id, 'long'))
+        node.setAttribute('dx',self.convertToStr(moveModule.db_dx, 'float'))
+        node.setAttribute('dy',self.convertToStr(moveModule.db_dy, 'float'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'visTrail':
+            return None
+        
+        actions = {}
+        tags = {}
+        
+        # read attributes
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions[action.db_time] = action
+            elif child.nodeName == 'tag':
+                tag = self.getDao('tag').fromXML(child)
+                tags[tag.db_time] = tag
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        return DBVistrail(version=version,
+                          actions=actions,
+                          tags=tags)
+    
+    def toXML(self, vistrail, doc):
+        node = doc.createElement('visTrail')
+        
+        # set attributes
+        node.setAttribute('version',self.convertToStr(vistrail.db_version, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions.itervalues():
+            node.appendChild(self.getDao('action').toXML(action, doc))
+        tags = vistrail.db_tags
+        for tag in tags.itervalues():
+            node.appendChild(self.getDao('tag').toXML(tag, doc))
+        
+        return node
+
+class DBChangeAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'set':
+            return None
+        
+        # read attributes
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        value = self.convertFromStr(self.getAttribute(node, 'value'), 'str')
+        
+        return DBChangeAnnotation(moduleId=moduleId,
+                                  key=key,
+                                  value=value)
+    
+    def toXML(self, changeAnnotation, doc):
+        node = doc.createElement('set')
+        
+        # set attributes
+        node.setAttribute('moduleId',self.convertToStr(changeAnnotation.db_moduleId, 'long'))
+        node.setAttribute('key',self.convertToStr(changeAnnotation.db_key, 'str'))
+        node.setAttribute('value',self.convertToStr(changeAnnotation.db_value, 'str'))
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'changeParameter' not in self:
+            self['changeParameter'] = DBChangeParameterXMLDAOBase(self)
+        if 'deleteFunction' not in self:
+            self['deleteFunction'] = DBDeleteFunctionXMLDAOBase(self)
+        if 'deleteConnection' not in self:
+            self['deleteConnection'] = DBDeleteConnectionXMLDAOBase(self)
+        if 'addModule' not in self:
+            self['addModule'] = DBAddModuleXMLDAOBase(self)
+        if 'deleteAnnotation' not in self:
+            self['deleteAnnotation'] = DBDeleteAnnotationXMLDAOBase(self)
+        if 'deleteModulePort' not in self:
+            self['deleteModulePort'] = DBDeleteModulePortXMLDAOBase(self)
+        if 'deleteModule' not in self:
+            self['deleteModule'] = DBDeleteModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'addModulePort' not in self:
+            self['addModulePort'] = DBAddModulePortXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'addConnection' not in self:
+            self['addConnection'] = DBAddConnectionXMLDAOBase(self)
+        if 'moveModule' not in self:
+            self['moveModule'] = DBMoveModuleXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'changeAnnotation' not in self:
+            self['changeAnnotation'] = DBChangeAnnotationXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_3_0/persistence/xml/io.py b/vistrails/db/versions/v0_3_0/persistence/xml/io.py
new file mode 100644
index 0000000..0b01c45
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/persistence/xml/io.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.parsers.expat import ExpatError
+import xml.dom.minidom
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_3_0 import version as my_version
+
+def parse_xml_file(filename):
+    try:
+        return xml.dom.minidom.parse(filename)
+    except xml.parsers.expat.ExpatError, e:
+        msg = 'XML parse error at line %s, col %s: %s' % \
+            (e.lineno, e.offset, e.code)
+        raise VistrailsDBException(msg)
+
+def write_xml_file(filename, dom, prettyprint=True):
+    output = open(filename, 'w')
+    if prettyprint:
+        dom.writexml(output, '','  ','\n')
+    else:
+        dom.writexml(output)
+    output.close()
+
+def read_xml_object(vtType, node, dao_list):
+    return dao_list[vtType].fromXML(node)
+
+def write_xml_object(obj, dom, dao_list, node=None):
+    res_node = dao_list[obj.vtType].toXML(obj, dom, node)
+    return res_node
+
+def open_from_xml(filename, vtType, dao_list):
+    """open_from_xml(filename) -> DBVistrail"""
+    dom = parse_xml_file(filename)
+    vistrail = read_xml_object(vtType, dom.documentElement, dao_list)
+    dom.unlink()
+    return vistrail
+
+def save_to_xml(obj, filename, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(obj, dom, dao_list)
+    dom.appendChild(root)
+    if obj.vtType == 'vistrail':
+        root.setAttribute('version', my_version)
+        root.setAttribute('xmlns:xsi', 
+                          'http://www.w3.org/2001/XMLSchema-instance')
+        root.setAttribute('xsi:schemaLocation', 
+                          'http://www.vistrails.org/vistrail.xsd')
+    write_xml_file(filename, dom)
+    dom.unlink()
+
+def serialize(object, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(object, dom, dao_list)
+    dom.appendChild(root)
+    return dom.toxml()
+
+def unserialize(str, obj_type):
+    dom = xml.dom.minidom.parseString(str)
+    return read_xml_object(obj_type, dom.documentElement, dao_list)
+
diff --git a/vistrails/db/versions/v0_3_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_3_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..de42aa2
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/persistence/xml/xml_dao.py
@@ -0,0 +1,77 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_3_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_3_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..b0a275e
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,161 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="visTrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="notes" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element name="addModule" ref="object" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="addConnection" ref="connect" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="changeParameter" ref="set" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="changeAnnotation" ref="set" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="addModulePort" ref="addPort" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="moveModule" ref="move" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteModule" ref="module" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteConnection" ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteFunction" ref="function" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteAnnotation" ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteModulePort" ref="deletePort" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="time" type="xs:int"/>
+      <xs:attribute name="parent" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="date" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="time" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="object">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connect">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="destinationId" type="xs:int"/>
+      <xs:attribute name="destinationModule" type="xs:string"/>
+      <xs:attribute name="destinationPort" type="xs:string"/>
+      <xs:attribute name="sourceId" type="xs:int"/>
+      <xs:attribute name="sourceModule" type="xs:string"/>
+      <xs:attribute name="sourcePort" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="set">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="alias" type="xs:string"/>
+      <xs:attribute name="functionId" type="xs:int"/>
+      <xs:attribute name="function" type="xs:string"/>
+      <xs:attribute name="parameterId" type="xs:int"/>
+      <xs:attribute name="parameter" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="set">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="addPort">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="portType" type="xs:string"/>
+      <xs:attribute name="portName" type="xs:string"/>
+      <xs:attribute name="portSpec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="move">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="dx" type="xs:float"/>
+      <xs:attribute name="dy" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:attribute name="connectionId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="functionId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deletePort">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="portType" type="xs:string"/>
+      <xs:attribute name="portName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_3_0/specs/action.xml b/vistrails/db/versions/v0_3_0/specs/action.xml
new file mode 100644
index 0000000..104c998
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/action.xml
@@ -0,0 +1,101 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+  </layout>
+
+  <property name="time" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="parent" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="date" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="notes" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what" mapping="one-to-many">
+    <property ref="true" object="addModule" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="addConnection" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="changeParameter" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="changeAnnotation" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="addModulePort" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="moveModule" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteModule" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteConnection" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteFunction" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteAnnotation" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteModulePort" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/addConnection.xml b/vistrails/db/versions/v0_3_0/specs/addConnection.xml
new file mode 100644
index 0000000..99599cf
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/addConnection.xml
@@ -0,0 +1,68 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="addConnection">
+  <layout>
+    <xml name="connect" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="destinationId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="destinationModule" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="destinationPort" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="sourceId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="sourceModule" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="sourcePort" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/addModule.xml b/vistrails/db/versions/v0_3_0/specs/addModule.xml
new file mode 100644
index 0000000..d3584c1
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/addModule.xml
@@ -0,0 +1,60 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="addModule">
+  <layout>
+    <xml name="object" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/addModulePort.xml b/vistrails/db/versions/v0_3_0/specs/addModulePort.xml
new file mode 100644
index 0000000..5f83e50
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/addModulePort.xml
@@ -0,0 +1,56 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="addModulePort">
+  <layout>
+    <xml name="addPort" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="portType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="portName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="portSpec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/changeAnnotation.xml b/vistrails/db/versions/v0_3_0/specs/changeAnnotation.xml
new file mode 100644
index 0000000..3915523
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/changeAnnotation.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="changeAnnotation">
+  <layout>
+    <xml name="set" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/changeParameter.xml b/vistrails/db/versions/v0_3_0/specs/changeParameter.xml
new file mode 100644
index 0000000..8a8de86
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/changeParameter.xml
@@ -0,0 +1,72 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="changeParameter">
+  <layout>
+    <xml name="set" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="functionId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="function" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="parameterId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="parameter" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/deleteAnnotation.xml b/vistrails/db/versions/v0_3_0/specs/deleteAnnotation.xml
new file mode 100644
index 0000000..e20c4ae
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/deleteAnnotation.xml
@@ -0,0 +1,48 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteAnnotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/deleteConnection.xml b/vistrails/db/versions/v0_3_0/specs/deleteConnection.xml
new file mode 100644
index 0000000..8ff250a
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/deleteConnection.xml
@@ -0,0 +1,44 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteConnection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="connectionId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/deleteFunction.xml b/vistrails/db/versions/v0_3_0/specs/deleteFunction.xml
new file mode 100644
index 0000000..d647c15
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/deleteFunction.xml
@@ -0,0 +1,48 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteFunction">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="functionId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/deleteModule.xml b/vistrails/db/versions/v0_3_0/specs/deleteModule.xml
new file mode 100644
index 0000000..a07f569
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/deleteModule.xml
@@ -0,0 +1,44 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteModule">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/deleteModulePort.xml b/vistrails/db/versions/v0_3_0/specs/deleteModulePort.xml
new file mode 100644
index 0000000..e6e6a7c
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/deleteModulePort.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteModulePort">
+  <layout>
+    <xml name="deletePort" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="portType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="portName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/moveModule.xml b/vistrails/db/versions/v0_3_0/specs/moveModule.xml
new file mode 100644
index 0000000..3712805
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/moveModule.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="moveModule">
+  <layout>
+    <xml name="move" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="dx" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+
+  <property name="dy" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/tag.xml b/vistrails/db/versions/v0_3_0/specs/tag.xml
new file mode 100644
index 0000000..6022ef3
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/tag.xml
@@ -0,0 +1,48 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="time" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_0/specs/vistrail.xml b/vistrails/db/versions/v0_3_0/specs/vistrail.xml
new file mode 100644
index 0000000..aa68d46
--- /dev/null
+++ b/vistrails/db/versions/v0_3_0/specs/vistrail.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="visTrail" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="version" type="str" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property ref="true" object="action" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/__init__.py b/vistrails/db/versions/v0_3_1/__init__.py
new file mode 100644
index 0000000..1ba86e3
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.3.1'
diff --git a/vistrails/db/versions/v0_3_1/domain/__init__.py b/vistrails/db/versions/v0_3_1/domain/__init__.py
new file mode 100644
index 0000000..fb50f24
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/domain/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_3_0.domain import *
diff --git a/vistrails/db/versions/v0_3_1/persistence/__init__.py b/vistrails/db/versions/v0_3_1/persistence/__init__.py
new file mode 100644
index 0000000..47924e5
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/persistence/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_3_0.persistence import DAOList
diff --git a/vistrails/db/versions/v0_3_1/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_3_1/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..b0a275e
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/schemas/xml/vistrail.xsd
@@ -0,0 +1,161 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="visTrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="notes" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element name="addModule" ref="object" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="addConnection" ref="connect" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="changeParameter" ref="set" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="changeAnnotation" ref="set" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="addModulePort" ref="addPort" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="moveModule" ref="move" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteModule" ref="module" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteConnection" ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteFunction" ref="function" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteAnnotation" ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+          <xs:element name="deleteModulePort" ref="deletePort" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="time" type="xs:int"/>
+      <xs:attribute name="parent" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="date" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="time" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="object">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connect">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="destinationId" type="xs:int"/>
+      <xs:attribute name="destinationModule" type="xs:string"/>
+      <xs:attribute name="destinationPort" type="xs:string"/>
+      <xs:attribute name="sourceId" type="xs:int"/>
+      <xs:attribute name="sourceModule" type="xs:string"/>
+      <xs:attribute name="sourcePort" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="set">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="alias" type="xs:string"/>
+      <xs:attribute name="functionId" type="xs:int"/>
+      <xs:attribute name="function" type="xs:string"/>
+      <xs:attribute name="parameterId" type="xs:int"/>
+      <xs:attribute name="parameter" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="set">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="addPort">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="portType" type="xs:string"/>
+      <xs:attribute name="portName" type="xs:string"/>
+      <xs:attribute name="portSpec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="move">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="dx" type="xs:float"/>
+      <xs:attribute name="dy" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:attribute name="connectionId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="functionId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deletePort">
+    <xs:complexType>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="portType" type="xs:string"/>
+      <xs:attribute name="portName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_3_1/specs/action.xml b/vistrails/db/versions/v0_3_1/specs/action.xml
new file mode 100644
index 0000000..104c998
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/action.xml
@@ -0,0 +1,101 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+  </layout>
+
+  <property name="time" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="parent" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="date" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="notes" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what" mapping="one-to-many">
+    <property ref="true" object="addModule" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="addConnection" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="changeParameter" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="changeAnnotation" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="addModulePort" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="moveModule" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteModule" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteConnection" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteFunction" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteAnnotation" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="deleteModulePort" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/addConnection.xml b/vistrails/db/versions/v0_3_1/specs/addConnection.xml
new file mode 100644
index 0000000..99599cf
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/addConnection.xml
@@ -0,0 +1,68 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="addConnection">
+  <layout>
+    <xml name="connect" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="destinationId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="destinationModule" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="destinationPort" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="sourceId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="sourceModule" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="sourcePort" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/addModule.xml b/vistrails/db/versions/v0_3_1/specs/addModule.xml
new file mode 100644
index 0000000..d3584c1
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/addModule.xml
@@ -0,0 +1,60 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="addModule">
+  <layout>
+    <xml name="object" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/addModulePort.xml b/vistrails/db/versions/v0_3_1/specs/addModulePort.xml
new file mode 100644
index 0000000..5f83e50
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/addModulePort.xml
@@ -0,0 +1,56 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="addModulePort">
+  <layout>
+    <xml name="addPort" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="portType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="portName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="portSpec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/changeAnnotation.xml b/vistrails/db/versions/v0_3_1/specs/changeAnnotation.xml
new file mode 100644
index 0000000..3915523
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/changeAnnotation.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="changeAnnotation">
+  <layout>
+    <xml name="set" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/changeParameter.xml b/vistrails/db/versions/v0_3_1/specs/changeParameter.xml
new file mode 100644
index 0000000..8a8de86
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/changeParameter.xml
@@ -0,0 +1,72 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="changeParameter">
+  <layout>
+    <xml name="set" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="functionId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="function" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="parameterId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="parameter" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/deleteAnnotation.xml b/vistrails/db/versions/v0_3_1/specs/deleteAnnotation.xml
new file mode 100644
index 0000000..e20c4ae
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/deleteAnnotation.xml
@@ -0,0 +1,48 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteAnnotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/deleteConnection.xml b/vistrails/db/versions/v0_3_1/specs/deleteConnection.xml
new file mode 100644
index 0000000..8ff250a
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/deleteConnection.xml
@@ -0,0 +1,44 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteConnection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="connectionId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/deleteFunction.xml b/vistrails/db/versions/v0_3_1/specs/deleteFunction.xml
new file mode 100644
index 0000000..d647c15
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/deleteFunction.xml
@@ -0,0 +1,48 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteFunction">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="functionId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/deleteModule.xml b/vistrails/db/versions/v0_3_1/specs/deleteModule.xml
new file mode 100644
index 0000000..a07f569
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/deleteModule.xml
@@ -0,0 +1,44 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteModule">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/deleteModulePort.xml b/vistrails/db/versions/v0_3_1/specs/deleteModulePort.xml
new file mode 100644
index 0000000..e6e6a7c
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/deleteModulePort.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="deleteModulePort">
+  <layout>
+    <xml name="deletePort" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="moduleId" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="portType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property name="portName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/moveModule.xml b/vistrails/db/versions/v0_3_1/specs/moveModule.xml
new file mode 100644
index 0000000..3712805
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/moveModule.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="moveModule">
+  <layout>
+    <xml name="move" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="dx" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+
+  <property name="dy" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/tag.xml b/vistrails/db/versions/v0_3_1/specs/tag.xml
new file mode 100644
index 0000000..6022ef3
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/tag.xml
@@ -0,0 +1,48 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="time" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/specs/vistrail.xml b/vistrails/db/versions/v0_3_1/specs/vistrail.xml
new file mode 100644
index 0000000..aa68d46
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/specs/vistrail.xml
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="visTrail" nodeType="xs:element"/>
+  </layout>
+  
+  <property name="version" type="str" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+
+  <property ref="true" object="action" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_3_1/translate/__init__.py b/vistrails/db/versions/v0_3_1/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_3_1/translate/v0_3_0.py b/vistrails/db/versions/v0_3_1/translate/v0_3_0.py
new file mode 100644
index 0000000..13ecea7
--- /dev/null
+++ b/vistrails/db/versions/v0_3_1/translate/v0_3_0.py
@@ -0,0 +1,47 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+def translateVistrail(_vistrail):
+    # FIXME should this be a deepcopy?
+    vistrail = copy.deepcopy(_vistrail)
+    for action in vistrail.db_get_actions():
+#        print 'translating action %s' % action.db_time
+        if action.db_what == 'addModule':
+            if action.db_datas[0].db_cache == 0:
+                action.db_datas[0].db_cache = 1
+    vistrail.db_version = '0.3.1'
+    return vistrail
diff --git a/vistrails/db/versions/v0_5_0/__init__.py b/vistrails/db/versions/v0_5_0/__init__.py
new file mode 100644
index 0000000..81e9321
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.5.0'
diff --git a/vistrails/db/versions/v0_5_0/domain/__init__.py b/vistrails/db/versions/v0_5_0/domain/__init__.py
new file mode 100644
index 0000000..f9f4892
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/domain/__init__.py
@@ -0,0 +1,38 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
diff --git a/vistrails/db/versions/v0_5_0/domain/auto_gen.py b/vistrails/db/versions/v0_5_0/domain/auto_gen.py
new file mode 100644
index 0000000..ef7ae65
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/domain/auto_gen.py
@@ -0,0 +1,2696 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_spec = spec
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBPortSpec()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_type = self.db_type
+        cp.is_dirty = self.is_dirty
+        cp.db_spec = self.db_spec
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self.__db_id = id
+        self.__db_cache = cache
+        self.__db_name = name
+        self.__db_location = location
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+        if annotations is None:
+            self.__db_annotations = {}
+        else:
+            self.__db_annotations = annotations
+        if portSpecs is None:
+            self.__db_portSpecs = []
+        else:
+            self.__db_portSpecs = portSpecs
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBModule()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_cache = self.db_cache
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_location = self.db_location
+        cp.is_dirty = self.is_dirty
+        if self.db_functions is None:
+            cp.db_functions = None
+        else:
+            cp.db_functions = [copy.copy(v) for v in self.db_functions]
+        cp.is_dirty = self.is_dirty
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = dict([(k,copy.copy(v)) for (k,v) in self.db_annotations.iteritems()])
+        cp.is_dirty = self.is_dirty
+        if self.db_portSpecs is None:
+            cp.db_portSpecs = None
+        else:
+            cp.db_portSpecs = [copy.copy(v) for v in self.db_portSpecs]
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_location = None
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_functions = []
+        for child in self.db_annotations.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_annotations = {}
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_portSpecs = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                del self.__db_functions[i]
+                break
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations.values()
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        del self.__db_annotations[annotation.db_id]
+    def db_get_annotation(self, key):
+        if self.__db_annotations.has_key(key):
+            return self.__db_annotations[key]
+        return None
+    
+    def __get_db_portSpecs(self):
+        return self.__db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self.__db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self.__db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self.__db_portSpecs.append(portSpec)
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                self.__db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self.__db_portSpecs.append(portSpec)
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                del self.__db_portSpecs[i]
+                break
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == key:
+                return self.__db_portSpecs[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBSession(object):
+
+    vtType = 'session'
+
+    def __init__(self, id=None, user=None, ip=None, visVersion=None, tsStart=None, tsEnd=None, machineId=None, wfExecs=None):
+        self.__db_id = id
+        self.__db_user = user
+        self.__db_ip = ip
+        self.__db_visVersion = visVersion
+        self.__db_tsStart = tsStart
+        self.__db_tsEnd = tsEnd
+        self.__db_machineId = machineId
+        if wfExecs is None:
+            self.__db_wfExecs = {}
+        else:
+            self.__db_wfExecs = wfExecs
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBSession()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_user = self.db_user
+        cp.is_dirty = self.is_dirty
+        cp.db_ip = self.db_ip
+        cp.is_dirty = self.is_dirty
+        cp.db_visVersion = self.db_visVersion
+        cp.is_dirty = self.is_dirty
+        cp.db_tsStart = self.db_tsStart
+        cp.is_dirty = self.is_dirty
+        cp.db_tsEnd = self.db_tsEnd
+        cp.is_dirty = self.is_dirty
+        cp.db_machineId = self.db_machineId
+        cp.is_dirty = self.is_dirty
+        if self.db_wfExecs is None:
+            cp.db_wfExecs = None
+        else:
+            cp.db_wfExecs = dict([(k,copy.copy(v)) for (k,v) in self.db_wfExecs.iteritems()])
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_wfExecs.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_wfExecs = {}
+        children.extend(self.db_log.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_log = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_ip(self):
+        return self.__db_ip
+    def __set_db_ip(self, ip):
+        self.__db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self.__db_ip = ip
+    def db_change_ip(self, ip):
+        self.__db_ip = ip
+    def db_delete_ip(self, ip):
+        self.__db_ip = None
+    
+    def __get_db_visVersion(self):
+        return self.__db_visVersion
+    def __set_db_visVersion(self, visVersion):
+        self.__db_visVersion = visVersion
+        self.is_dirty = True
+    db_visVersion = property(__get_db_visVersion, __set_db_visVersion)
+    def db_add_visVersion(self, visVersion):
+        self.__db_visVersion = visVersion
+    def db_change_visVersion(self, visVersion):
+        self.__db_visVersion = visVersion
+    def db_delete_visVersion(self, visVersion):
+        self.__db_visVersion = None
+    
+    def __get_db_tsStart(self):
+        return self.__db_tsStart
+    def __set_db_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+        self.is_dirty = True
+    db_tsStart = property(__get_db_tsStart, __set_db_tsStart)
+    def db_add_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+    def db_change_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+    def db_delete_tsStart(self, tsStart):
+        self.__db_tsStart = None
+    
+    def __get_db_tsEnd(self):
+        return self.__db_tsEnd
+    def __set_db_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+        self.is_dirty = True
+    db_tsEnd = property(__get_db_tsEnd, __set_db_tsEnd)
+    def db_add_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+    def db_change_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+    def db_delete_tsEnd(self, tsEnd):
+        self.__db_tsEnd = None
+    
+    def __get_db_machineId(self):
+        return self.__db_machineId
+    def __set_db_machineId(self, machineId):
+        self.__db_machineId = machineId
+        self.is_dirty = True
+    db_machineId = property(__get_db_machineId, __set_db_machineId)
+    def db_add_machineId(self, machineId):
+        self.__db_machineId = machineId
+    def db_change_machineId(self, machineId):
+        self.__db_machineId = machineId
+    def db_delete_machineId(self, machineId):
+        self.__db_machineId = None
+    
+    def __get_db_wfExecs(self):
+        return self.__db_wfExecs
+    def __set_db_wfExecs(self, wfExecs):
+        self.__db_wfExecs = wfExecs
+        self.is_dirty = True
+    db_wfExecs = property(__get_db_wfExecs, __set_db_wfExecs)
+    def db_get_wfExecs(self):
+        return self.__db_wfExecs.values()
+    def db_add_wfExec(self, wfExec):
+        self.is_dirty = True
+        self.__db_wfExecs[wfExec.db_id] = wfExec
+    def db_change_wfExec(self, wfExec):
+        self.is_dirty = True
+        self.__db_wfExecs[wfExec.db_id] = wfExec
+    def db_delete_wfExec(self, wfExec):
+        self.is_dirty = True
+        del self.__db_wfExecs[wfExec.db_id]
+    def db_get_wfExec(self, key):
+        if self.__db_wfExecs.has_key(key):
+            return self.__db_wfExecs[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, sig=None):
+        self.__db_id = id
+        self.__db_type = type
+        self.__db_moduleId = moduleId
+        self.__db_moduleName = moduleName
+        self.__db_sig = sig
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBPort()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_type = self.db_type
+        cp.is_dirty = self.is_dirty
+        cp.db_moduleId = self.db_moduleId
+        cp.is_dirty = self.is_dirty
+        cp.db_moduleName = self.db_moduleName
+        cp.is_dirty = self.is_dirty
+        cp.db_sig = self.db_sig
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self.__db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self.__db_moduleName = None
+    
+    def __get_db_sig(self):
+        return self.__db_sig
+    def __set_db_sig(self, sig):
+        self.__db_sig = sig
+        self.is_dirty = True
+    db_sig = property(__get_db_sig, __set_db_sig)
+    def db_add_sig(self, sig):
+        self.__db_sig = sig
+    def db_change_sig(self, sig):
+        self.__db_sig = sig
+    def db_delete_sig(self, sig):
+        self.__db_sig = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, sessions=None, machines=None):
+        self.__db_id = id
+        if sessions is None:
+            self.__db_sessions = {}
+        else:
+            self.__db_sessions = sessions
+        if machines is None:
+            self.__db_machines = {}
+        else:
+            self.__db_machines = machines
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBLog()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        if self.db_sessions is None:
+            cp.db_sessions = None
+        else:
+            cp.db_sessions = dict([(k,copy.copy(v)) for (k,v) in self.db_sessions.iteritems()])
+        cp.is_dirty = self.is_dirty
+        if self.db_machines is None:
+            cp.db_machines = None
+        else:
+            cp.db_machines = dict([(k,copy.copy(v)) for (k,v) in self.db_machines.iteritems()])
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_sessions.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_sessions = {}
+        for child in self.db_machines.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_machines = {}
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_sessions(self):
+        return self.__db_sessions
+    def __set_db_sessions(self, sessions):
+        self.__db_sessions = sessions
+        self.is_dirty = True
+    db_sessions = property(__get_db_sessions, __set_db_sessions)
+    def db_get_sessions(self):
+        return self.__db_sessions.values()
+    def db_add_session(self, session):
+        self.is_dirty = True
+        self.__db_sessions[session.db_id] = session
+    def db_change_session(self, session):
+        self.is_dirty = True
+        self.__db_sessions[session.db_id] = session
+    def db_delete_session(self, session):
+        self.is_dirty = True
+        del self.__db_sessions[session.db_id]
+    def db_get_session(self, key):
+        if self.__db_sessions.has_key(key):
+            return self.__db_sessions[key]
+        return None
+    
+    def __get_db_machines(self):
+        return self.__db_machines
+    def __set_db_machines(self, machines):
+        self.__db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self.__db_machines.values()
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        del self.__db_machines[machine.db_id]
+    def db_get_machine(self, key):
+        if self.__db_machines.has_key(key):
+            return self.__db_machines[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_os = os
+        self.__db_architecture = architecture
+        self.__db_processor = processor
+        self.__db_ram = ram
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBMachine()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_os = self.db_os
+        cp.is_dirty = self.is_dirty
+        cp.db_architecture = self.db_architecture
+        cp.is_dirty = self.is_dirty
+        cp.db_processor = self.db_processor
+        cp.is_dirty = self.is_dirty
+        cp.db_ram = self.db_ram
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_log.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_log = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_os(self):
+        return self.__db_os
+    def __set_db_os(self, os):
+        self.__db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self.__db_os = os
+    def db_change_os(self, os):
+        self.__db_os = os
+    def db_delete_os(self, os):
+        self.__db_os = None
+    
+    def __get_db_architecture(self):
+        return self.__db_architecture
+    def __set_db_architecture(self, architecture):
+        self.__db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self.__db_architecture = None
+    
+    def __get_db_processor(self):
+        return self.__db_processor
+    def __set_db_processor(self, processor):
+        self.__db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self.__db_processor = processor
+    def db_change_processor(self, processor):
+        self.__db_processor = processor
+    def db_delete_processor(self, processor):
+        self.__db_processor = None
+    
+    def __get_db_ram(self):
+        return self.__db_ram
+    def __set_db_ram(self, ram):
+        self.__db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self.__db_ram = ram
+    def db_change_ram(self, ram):
+        self.__db_ram = ram
+    def db_delete_ram(self, ram):
+        self.__db_ram = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None, data=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.__db_data = data
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBAdd()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_what = self.db_what
+        cp.is_dirty = self.is_dirty
+        cp.db_objectId = self.db_objectId
+        cp.is_dirty = self.is_dirty
+        cp.db_parentObjId = self.db_parentObjId
+        cp.is_dirty = self.is_dirty
+        cp.db_parentObjType = self.db_parentObjType
+        cp.is_dirty = self.is_dirty
+        cp.db_data = self.db_data
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_action.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_action = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        self.__db_data = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBOther()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_key = self.db_key
+        cp.is_dirty = self.is_dirty
+        cp.db_value = self.db_value
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self.__db_id = id
+        self.__db_x = x
+        self.__db_y = y
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBLocation()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_x = self.db_x
+        cp.is_dirty = self.is_dirty
+        cp.db_y = self.db_y
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_x(self):
+        return self.__db_x
+    def __set_db_x(self, x):
+        self.__db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self.__db_x = x
+    def db_change_x(self, x):
+        self.__db_x = x
+    def db_delete_x(self, x):
+        self.__db_x = None
+    
+    def __get_db_y(self):
+        return self.__db_y
+    def __set_db_y(self, y):
+        self.__db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self.__db_y = y
+    def db_change_y(self, y):
+        self.__db_y = y
+    def db_delete_y(self, y):
+        self.__db_y = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWfExec(object):
+
+    vtType = 'wfExec'
+
+    def __init__(self, id=None, tsStart=None, tsEnd=None, wfVersion=None, vistrailId=None, vistrailName=None, execRecs=None):
+        self.__db_id = id
+        self.__db_tsStart = tsStart
+        self.__db_tsEnd = tsEnd
+        self.__db_wfVersion = wfVersion
+        self.__db_vistrailId = vistrailId
+        self.__db_vistrailName = vistrailName
+        if execRecs is None:
+            self.__db_execRecs = {}
+        else:
+            self.__db_execRecs = execRecs
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBWfExec()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_tsStart = self.db_tsStart
+        cp.is_dirty = self.is_dirty
+        cp.db_tsEnd = self.db_tsEnd
+        cp.is_dirty = self.is_dirty
+        cp.db_wfVersion = self.db_wfVersion
+        cp.is_dirty = self.is_dirty
+        cp.db_vistrailId = self.db_vistrailId
+        cp.is_dirty = self.is_dirty
+        cp.db_vistrailName = self.db_vistrailName
+        cp.is_dirty = self.is_dirty
+        if self.db_execRecs is None:
+            cp.db_execRecs = None
+        else:
+            cp.db_execRecs = dict([(k,copy.copy(v)) for (k,v) in self.db_execRecs.iteritems()])
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_session.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_session = None
+        for child in self.db_execRecs.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_execRecs = {}
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_tsStart(self):
+        return self.__db_tsStart
+    def __set_db_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+        self.is_dirty = True
+    db_tsStart = property(__get_db_tsStart, __set_db_tsStart)
+    def db_add_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+    def db_change_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+    def db_delete_tsStart(self, tsStart):
+        self.__db_tsStart = None
+    
+    def __get_db_tsEnd(self):
+        return self.__db_tsEnd
+    def __set_db_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+        self.is_dirty = True
+    db_tsEnd = property(__get_db_tsEnd, __set_db_tsEnd)
+    def db_add_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+    def db_change_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+    def db_delete_tsEnd(self, tsEnd):
+        self.__db_tsEnd = None
+    
+    def __get_db_wfVersion(self):
+        return self.__db_wfVersion
+    def __set_db_wfVersion(self, wfVersion):
+        self.__db_wfVersion = wfVersion
+        self.is_dirty = True
+    db_wfVersion = property(__get_db_wfVersion, __set_db_wfVersion)
+    def db_add_wfVersion(self, wfVersion):
+        self.__db_wfVersion = wfVersion
+    def db_change_wfVersion(self, wfVersion):
+        self.__db_wfVersion = wfVersion
+    def db_delete_wfVersion(self, wfVersion):
+        self.__db_wfVersion = None
+    
+    def __get_db_vistrailId(self):
+        return self.__db_vistrailId
+    def __set_db_vistrailId(self, vistrailId):
+        self.__db_vistrailId = vistrailId
+        self.is_dirty = True
+    db_vistrailId = property(__get_db_vistrailId, __set_db_vistrailId)
+    def db_add_vistrailId(self, vistrailId):
+        self.__db_vistrailId = vistrailId
+    def db_change_vistrailId(self, vistrailId):
+        self.__db_vistrailId = vistrailId
+    def db_delete_vistrailId(self, vistrailId):
+        self.__db_vistrailId = None
+    
+    def __get_db_vistrailName(self):
+        return self.__db_vistrailName
+    def __set_db_vistrailName(self, vistrailName):
+        self.__db_vistrailName = vistrailName
+        self.is_dirty = True
+    db_vistrailName = property(__get_db_vistrailName, __set_db_vistrailName)
+    def db_add_vistrailName(self, vistrailName):
+        self.__db_vistrailName = vistrailName
+    def db_change_vistrailName(self, vistrailName):
+        self.__db_vistrailName = vistrailName
+    def db_delete_vistrailName(self, vistrailName):
+        self.__db_vistrailName = None
+    
+    def __get_db_execRecs(self):
+        return self.__db_execRecs
+    def __set_db_execRecs(self, execRecs):
+        self.__db_execRecs = execRecs
+        self.is_dirty = True
+    db_execRecs = property(__get_db_execRecs, __set_db_execRecs)
+    def db_get_execRecs(self):
+        return self.__db_execRecs.values()
+    def db_add_execRec(self, execRec):
+        self.is_dirty = True
+        self.__db_execRecs[execRec.db_id] = execRec
+    def db_change_execRec(self, execRec):
+        self.is_dirty = True
+        self.__db_execRecs[execRec.db_id] = execRec
+    def db_delete_execRec(self, execRec):
+        self.is_dirty = True
+        del self.__db_execRecs[execRec.db_id]
+    def db_get_execRec(self, key):
+        if self.__db_execRecs.has_key(key):
+            return self.__db_execRecs[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_val = val
+        self.__db_alias = alias
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBParameter()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_pos = self.db_pos
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_type = self.db_type
+        cp.is_dirty = self.is_dirty
+        cp.db_val = self.db_val
+        cp.is_dirty = self.is_dirty
+        cp.db_alias = self.db_alias
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_val(self):
+        return self.__db_val
+    def __set_db_val(self, val):
+        self.__db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self.__db_val = val
+    def db_change_val(self, val):
+        self.__db_val = val
+    def db_delete_val(self, val):
+        self.__db_val = None
+    
+    def __get_db_alias(self):
+        return self.__db_alias
+    def __set_db_alias(self, alias):
+        self.__db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self.__db_alias = alias
+    def db_change_alias(self, alias):
+        self.__db_alias = alias
+    def db_delete_alias(self, alias):
+        self.__db_alias = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        if parameters is None:
+            self.__db_parameters = []
+        else:
+            self.__db_parameters = parameters
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBFunction()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_pos = self.db_pos
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        if self.db_parameters is None:
+            cp.db_parameters = None
+        else:
+            cp.db_parameters = [copy.copy(v) for v in self.db_parameters]
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_parameters = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_parameters(self):
+        return self.__db_parameters
+    def __set_db_parameters(self, parameters):
+        self.__db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self.__db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self.__db_parameters.append(parameter)
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                self.__db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self.__db_parameters.append(parameter)
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                del self.__db_parameters[i]
+                break
+    def db_get_parameter(self, key):
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == key:
+                return self.__db_parameters[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, id=None, name=None, modules=None, connections=None, annotations=None, others=None):
+        self.__db_id = id
+        self.__db_name = name
+        if modules is None:
+            self.__db_modules = {}
+        else:
+            self.__db_modules = modules
+        if connections is None:
+            self.__db_connections = {}
+        else:
+            self.__db_connections = connections
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+        if others is None:
+            self.__db_others = []
+        else:
+            self.__db_others = others
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBWorkflow()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        if self.db_modules is None:
+            cp.db_modules = None
+        else:
+            cp.db_modules = dict([(k,copy.copy(v)) for (k,v) in self.db_modules.iteritems()])
+        cp.is_dirty = self.is_dirty
+        if self.db_connections is None:
+            cp.db_connections = None
+        else:
+            cp.db_connections = dict([(k,copy.copy(v)) for (k,v) in self.db_connections.iteritems()])
+        cp.is_dirty = self.is_dirty
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+        cp.is_dirty = self.is_dirty
+        if self.db_others is None:
+            cp.db_others = None
+        else:
+            cp.db_others = [copy.copy(v) for v in self.db_others]
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_modules.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_modules = {}
+        for child in self.db_connections.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_connections = {}
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_annotations = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_others = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_modules(self):
+        return self.__db_modules
+    def __set_db_modules(self, modules):
+        self.__db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self.__db_modules.values()
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self.__db_modules[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        self.__db_modules[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        del self.__db_modules[module.db_id]
+    def db_get_module(self, key):
+        if self.__db_modules.has_key(key):
+            return self.__db_modules[key]
+        return None
+    
+    def __get_db_connections(self):
+        return self.__db_connections
+    def __set_db_connections(self, connections):
+        self.__db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self.__db_connections.values()
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        del self.__db_connections[connection.db_id]
+    def db_get_connection(self, key):
+        if self.__db_connections.has_key(key):
+            return self.__db_connections[key]
+        return None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    
+    def __get_db_others(self):
+        return self.__db_others
+    def __set_db_others(self, others):
+        self.__db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self.__db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self.__db_others.append(other)
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                self.__db_others[i] = other
+                found = True
+                break
+        if not found:
+            self.__db_others.append(other)
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                del self.__db_others[i]
+                break
+    def db_get_other(self, key):
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == key:
+                return self.__db_others[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, id=None, prevId=None, date=None, user=None, operations=None):
+        self.__db_id = id
+        self.__db_prevId = prevId
+        self.__db_date = date
+        self.__db_user = user
+        if operations is None:
+            self.__db_operations = []
+        else:
+            self.__db_operations = operations
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBAction()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_prevId = self.db_prevId
+        cp.is_dirty = self.is_dirty
+        cp.db_date = self.db_date
+        cp.is_dirty = self.is_dirty
+        cp.db_user = self.db_user
+        cp.is_dirty = self.is_dirty
+        if self.db_operations is None:
+            cp.db_operations = None
+        else:
+            cp.db_operations = [copy.copy(v) for v in self.db_operations]
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_prevId(self):
+        return self.__db_prevId
+    def __set_db_prevId(self, prevId):
+        self.__db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self.__db_prevId = None
+    
+    def __get_db_date(self):
+        return self.__db_date
+    def __set_db_date(self, date):
+        self.__db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self.__db_date = date
+    def db_change_date(self, date):
+        self.__db_date = date
+    def db_delete_date(self, date):
+        self.__db_date = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_operations(self):
+        return self.__db_operations
+    def __set_db_operations(self, operations):
+        self.__db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self.__db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self.__db_operations.append(operation)
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                self.__db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self.__db_operations.append(operation)
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                del self.__db_operations[i]
+                break
+    def db_get_operation(self, key):
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == key:
+                return self.__db_operations[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBAnnotation()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_key = self.db_key
+        cp.is_dirty = self.is_dirty
+        cp.db_value = self.db_value
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None, data=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_oldObjId = oldObjId
+        self.__db_newObjId = newObjId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.__db_data = data
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBChange()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_what = self.db_what
+        cp.is_dirty = self.is_dirty
+        cp.db_oldObjId = self.db_oldObjId
+        cp.is_dirty = self.is_dirty
+        cp.db_newObjId = self.db_newObjId
+        cp.is_dirty = self.is_dirty
+        cp.db_parentObjId = self.db_parentObjId
+        cp.is_dirty = self.is_dirty
+        cp.db_parentObjType = self.db_parentObjType
+        cp.is_dirty = self.is_dirty
+        cp.db_data = self.db_data
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_action.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_action = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self.__db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self.__db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self.__db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self.__db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        self.__db_data = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBMacro(object):
+
+    vtType = 'macro'
+
+    def __init__(self, id=None, name=None, descrptn=None, actions=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_descrptn = descrptn
+        if actions is None:
+            self.__db_actions = {}
+        else:
+            self.__db_actions = actions
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBMacro()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_descrptn = self.db_descrptn
+        cp.is_dirty = self.is_dirty
+        if self.db_actions is None:
+            cp.db_actions = None
+        else:
+            cp.db_actions = dict([(k,copy.copy(v)) for (k,v) in self.db_actions.iteritems()])
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_actions.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_actions = {}
+        children.extend(self.db_vistrail.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_vistrail = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_descrptn(self):
+        return self.__db_descrptn
+    def __set_db_descrptn(self, descrptn):
+        self.__db_descrptn = descrptn
+        self.is_dirty = True
+    db_descrptn = property(__get_db_descrptn, __set_db_descrptn)
+    def db_add_descrptn(self, descrptn):
+        self.__db_descrptn = descrptn
+    def db_change_descrptn(self, descrptn):
+        self.__db_descrptn = descrptn
+    def db_delete_descrptn(self, descrptn):
+        self.__db_descrptn = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions.values()
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        del self.__db_actions[action.db_id]
+    def db_get_action(self, key):
+        if self.__db_actions.has_key(key):
+            return self.__db_actions[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self.__db_id = id
+        self.db_type_index = {}
+        if ports is None:
+            self.__db_ports = []
+        else:
+            self.__db_ports = ports
+            for v in self.__db_ports:
+                self.db_type_index[v.db_type] = v
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBConnection()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        if self.db_ports is None:
+            cp.db_ports = None
+        else:
+            cp.db_ports = [copy.copy(v) for v in self.db_ports]
+            for v in cp.__db_ports:
+                cp.db_type_index[v.db_type] = v
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_ports = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ports(self):
+        return self.__db_ports
+    def __set_db_ports(self, ports):
+        self.__db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self.__db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self.__db_ports.append(port)
+        self.db_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                self.__db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self.__db_ports.append(port)
+        self.db_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                del self.__db_ports[i]
+                break
+        del self.db_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == key:
+                return self.__db_ports[i]
+        return None
+    def db_get_port_by_type(self, key):
+        return self.db_type_index[key]
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, name=None, time=None):
+        self.__db_name = name
+        self.__db_time = time
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBTag()
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_time = self.db_time
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_vistrail.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_vistrail = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_time(self):
+        return self.__db_time
+    def __set_db_time(self, time):
+        self.__db_time = time
+        self.is_dirty = True
+    db_time = property(__get_db_time, __set_db_time)
+    def db_add_time(self, time):
+        self.__db_time = time
+    def db_change_time(self, time):
+        self.__db_time = time
+    def db_delete_time(self, time):
+        self.__db_time = None
+    
+    def getPrimaryKey(self):
+        return self.__db_name
+
+class DBExecRec(object):
+
+    vtType = 'execRec'
+
+    def __init__(self, id=None, tsStart=None, tsEnd=None, moduleId=None, moduleName=None, annotations=None):
+        self.__db_id = id
+        self.__db_tsStart = tsStart
+        self.__db_tsEnd = tsEnd
+        self.__db_moduleId = moduleId
+        self.__db_moduleName = moduleName
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBExecRec()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_tsStart = self.db_tsStart
+        cp.is_dirty = self.is_dirty
+        cp.db_tsEnd = self.db_tsEnd
+        cp.is_dirty = self.is_dirty
+        cp.db_moduleId = self.db_moduleId
+        cp.is_dirty = self.is_dirty
+        cp.db_moduleName = self.db_moduleName
+        cp.is_dirty = self.is_dirty
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_annotations = []
+        children.extend(self.db_wfExec.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_wfExec = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_tsStart(self):
+        return self.__db_tsStart
+    def __set_db_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+        self.is_dirty = True
+    db_tsStart = property(__get_db_tsStart, __set_db_tsStart)
+    def db_add_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+    def db_change_tsStart(self, tsStart):
+        self.__db_tsStart = tsStart
+    def db_delete_tsStart(self, tsStart):
+        self.__db_tsStart = None
+    
+    def __get_db_tsEnd(self):
+        return self.__db_tsEnd
+    def __set_db_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+        self.is_dirty = True
+    db_tsEnd = property(__get_db_tsEnd, __set_db_tsEnd)
+    def db_add_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+    def db_change_tsEnd(self, tsEnd):
+        self.__db_tsEnd = tsEnd
+    def db_delete_tsEnd(self, tsEnd):
+        self.__db_tsEnd = None
+    
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self.__db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self.__db_moduleName = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, version=None, name=None, dbHost=None, dbPort=None, dbName=None, actions=None, tags=None, macros=None):
+        self.__db_id = id
+        self.__db_version = version
+        self.__db_name = name
+        self.__db_dbHost = dbHost
+        self.__db_dbPort = dbPort
+        self.__db_dbName = dbName
+        if actions is None:
+            self.__db_actions = {}
+        else:
+            self.__db_actions = actions
+        if tags is None:
+            self.__db_tags = {}
+        else:
+            self.__db_tags = tags
+        if macros is None:
+            self.__db_macros = {}
+        else:
+            self.__db_macros = macros
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBVistrail()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_version = self.db_version
+        cp.is_dirty = self.is_dirty
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.db_dbHost = self.db_dbHost
+        cp.is_dirty = self.is_dirty
+        cp.db_dbPort = self.db_dbPort
+        cp.is_dirty = self.is_dirty
+        cp.db_dbName = self.db_dbName
+        cp.is_dirty = self.is_dirty
+        if self.db_actions is None:
+            cp.db_actions = None
+        else:
+            cp.db_actions = dict([(k,copy.copy(v)) for (k,v) in self.db_actions.iteritems()])
+        cp.is_dirty = self.is_dirty
+        if self.db_tags is None:
+            cp.db_tags = None
+        else:
+            cp.db_tags = dict([(k,copy.copy(v)) for (k,v) in self.db_tags.iteritems()])
+        cp.is_dirty = self.is_dirty
+        if self.db_macros is None:
+            cp.db_macros = None
+        else:
+            cp.db_macros = dict([(k,copy.copy(v)) for (k,v) in self.db_macros.iteritems()])
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self.db_actions.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_actions = {}
+        for child in self.db_tags.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_tags = {}
+        for child in self.db_macros.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_macros = {}
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_dbHost(self):
+        return self.__db_dbHost
+    def __set_db_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+        self.is_dirty = True
+    db_dbHost = property(__get_db_dbHost, __set_db_dbHost)
+    def db_add_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_change_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_delete_dbHost(self, dbHost):
+        self.__db_dbHost = None
+    
+    def __get_db_dbPort(self):
+        return self.__db_dbPort
+    def __set_db_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+        self.is_dirty = True
+    db_dbPort = property(__get_db_dbPort, __set_db_dbPort)
+    def db_add_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_change_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_delete_dbPort(self, dbPort):
+        self.__db_dbPort = None
+    
+    def __get_db_dbName(self):
+        return self.__db_dbName
+    def __set_db_dbName(self, dbName):
+        self.__db_dbName = dbName
+        self.is_dirty = True
+    db_dbName = property(__get_db_dbName, __set_db_dbName)
+    def db_add_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_change_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_delete_dbName(self, dbName):
+        self.__db_dbName = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions.values()
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        del self.__db_actions[action.db_id]
+    def db_get_action(self, key):
+        if self.__db_actions.has_key(key):
+            return self.__db_actions[key]
+        return None
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags.values()
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        del self.__db_tags[tag.db_name]
+    def db_get_tag(self, key):
+        if self.__db_tags.has_key(key):
+            return self.__db_tags[key]
+        return None
+    
+    def __get_db_macros(self):
+        return self.__db_macros
+    def __set_db_macros(self, macros):
+        self.__db_macros = macros
+        self.is_dirty = True
+    db_macros = property(__get_db_macros, __set_db_macros)
+    def db_get_macros(self):
+        return self.__db_macros.values()
+    def db_add_macro(self, macro):
+        self.is_dirty = True
+        self.__db_macros[macro.db_id] = macro
+    def db_change_macro(self, macro):
+        self.is_dirty = True
+        self.__db_macros[macro.db_id] = macro
+    def db_delete_macro(self, macro):
+        self.is_dirty = True
+        del self.__db_macros[macro.db_id]
+    def db_get_macro(self, key):
+        if self.__db_macros.has_key(key):
+            return self.__db_macros[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    
+    def __copy__(self):
+        cp = DBDelete()
+        cp.db_id = self.db_id
+        cp.is_dirty = self.is_dirty
+        cp.db_what = self.db_what
+        cp.is_dirty = self.is_dirty
+        cp.db_objectId = self.db_objectId
+        cp.is_dirty = self.is_dirty
+        cp.db_parentObjId = self.db_parentObjId
+        cp.is_dirty = self.is_dirty
+        cp.db_parentObjType = self.db_parentObjType
+        cp.is_dirty = self.is_dirty
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.extend(self.db_action.db_children((self.vtType, self.db_id), orphan))
+        if orphan:
+            self.db_action = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
diff --git a/vistrails/db/versions/v0_5_0/domain/id_scope.py b/vistrails/db/versions/v0_5_0/domain/id_scope.py
new file mode 100644
index 0000000..3f151ff
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/domain/id_scope.py
@@ -0,0 +1,65 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L):
+        self.ids = {}
+        self.beginId = beginId
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        if self.ids.has_key(objType):
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        else:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        if not self.ids.has_key(objType) or self.ids[objType] <= beginId:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_5_0/domain/vistrail.py b/vistrails/db/versions/v0_5_0/domain/vistrail.py
new file mode 100644
index 0000000..4ca792e
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/domain/vistrail.py
@@ -0,0 +1,43 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBVistrail as _DBVistrail
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+        self.idScope.setBeginId('action', 1)
diff --git a/vistrails/db/versions/v0_5_0/domain/workflow.py b/vistrails/db/versions/v0_5_0/domain/workflow.py
new file mode 100644
index 0000000..97cb040
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/domain/workflow.py
@@ -0,0 +1,116 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1)
+
+    def __copy__(self):
+        cp = _DBWorkflow.__copy__(self)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.objects = {}
+        for (child, _, _) in cp.db_children():
+            cp.addToIndex(child)
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp
+
+    def addToIndex(self, object):
+        self.objects[(object.vtType, object.getPrimaryKey())] = object
+
+    def deleteFromIndex(self, object):
+        del self.objects[(object.vtType, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_add_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_add_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_change_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_change_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_delete_object(self, objId, objType, 
+                         parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_get_%s' % objType
+        try:
+            object = getattr(parentObj, funname)(objId)
+        except AttributeError:
+            attr_name = 'db_%s' % objType
+            object = getattr(parentObj, attr_name)
+        funname = 'db_delete_%s' % objType
+        getattr(parentObj, funname)(object)
+        self.deleteFromIndex(object)
diff --git a/vistrails/db/versions/v0_5_0/persistence/__init__.py b/vistrails/db/versions/v0_5_0/persistence/__init__.py
new file mode 100644
index 0000000..0a10c9d
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/__init__.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+import xml.io
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def open_from_xml(self, filename, vtType, tree=None):
+        return xml.io.open_from_xml(filename, vtType, self['xml'])
+
+    def save_to_xml(self, obj, filename):
+        xml.io.save_to_xml(obj, filename, self['xml'])
+
+    def serialize(self, obj):
+        return xml.io.serialize(obj, self['xml'])
+
+    def unserialize(self, str, type):
+        return xml.io.unserialize(str, type, self['xml'])
diff --git a/vistrails/db/versions/v0_5_0/persistence/sql/__init__.py b/vistrails/db/versions/v0_5_0/persistence/sql/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_5_0/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_5_0/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..a8da624
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/sql/auto_gen.py
@@ -0,0 +1,2228 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_5_0.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'type', 'spec', 'id']
+        table = 'port_spec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[3], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            portSpec = DBPortSpec(id=id,
+                                  name=name,
+                                  type=type,
+                                  spec=spec)
+            portSpec.is_dirty = False
+            list.append(portSpec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'port_spec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_spec is not None:
+                columnMap['spec'] = \
+                    self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['cache', 'name', 'id']
+        table = 'module'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            cache = self.convertFromDB(row[0], 'int', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+            if len(res) > 0:
+                location = res[0]
+            else:
+                location = None
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+            functions = res
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = {}
+            for obj in res:
+                annotations[obj.db_id] = obj
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+            portSpecs = res
+            
+            module = DBModule(id=id,
+                              cache=cache,
+                              name=name,
+                              location=location,
+                              functions=functions,
+                              annotations=annotations,
+                              portSpecs=portSpecs)
+            module.is_dirty = False
+            list.append(module)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'module'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_cache is not None:
+                columnMap['cache'] = \
+                    self.convertToDB(obj.db_cache, 'int', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        child = obj.db_location
+        if child is not None:
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_functions:
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations.itervalues():
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_portSpecs:
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBSessionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['user', 'ip', 'vis_ver', 'ts_start', 'tsEnd', 'machine_id', 'id']
+        table = 'session'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            user = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            visVersion = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            tsStart = self.convertFromDB(row[3], 'datetime', 'datetime')
+            tsEnd = self.convertFromDB(row[4], 'datetime', 'datetime')
+            machineId = self.convertFromDB(row[5], 'long', 'int')
+            id = self.convertFromDB(row[6], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'session_id': keyStr}
+            res = self.getDao('wfExec').fromSQL(db, None, foreignKey, globalProps)
+            wfExecs = {}
+            for obj in res:
+                wfExecs[obj.db_id] = obj
+            
+            session = DBSession(id=id,
+                                user=user,
+                                ip=ip,
+                                visVersion=visVersion,
+                                tsStart=tsStart,
+                                tsEnd=tsEnd,
+                                machineId=machineId,
+                                wfExecs=wfExecs)
+            session.is_dirty = False
+            list.append(session)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'session'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_user is not None:
+                columnMap['user'] = \
+                    self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+            if obj.db_ip is not None:
+                columnMap['ip'] = \
+                    self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+            if obj.db_visVersion is not None:
+                columnMap['vis_ver'] = \
+                    self.convertToDB(obj.db_visVersion, 'str', 'varchar(255)')
+            if obj.db_tsStart is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_tsStart, 'datetime', 'datetime')
+            if obj.db_tsEnd is not None:
+                columnMap['tsEnd'] = \
+                    self.convertToDB(obj.db_tsEnd, 'datetime', 'datetime')
+            if obj.db_machineId is not None:
+                columnMap['machine_id'] = \
+                    self.convertToDB(obj.db_machineId, 'long', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'session_id': keyStr}
+        for child in obj.db_wfExecs.itervalues():
+            self.getDao('wfExec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['type', 'moduleId', 'moduleName', 'sig', 'id']
+        table = 'port'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            type = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[1], 'long', 'int')
+            moduleName = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            sig = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            port = DBPort(id=id,
+                          type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          sig=sig)
+            port.is_dirty = False
+            list.append(port)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'port'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_moduleId is not None:
+                columnMap['moduleId'] = \
+                    self.convertToDB(obj.db_moduleId, 'long', 'int')
+            if obj.db_moduleName is not None:
+                columnMap['moduleName'] = \
+                    self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+            if obj.db_sig is not None:
+                columnMap['sig'] = \
+                    self.convertToDB(obj.db_sig, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['id']
+        table = 'log_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'log_id': keyStr}
+            res = self.getDao('session').fromSQL(db, None, foreignKey, globalProps)
+            sessions = {}
+            for obj in res:
+                sessions[obj.db_id] = obj
+            
+            foreignKey = {'log_id': keyStr}
+            res = self.getDao('machine').fromSQL(db, None, foreignKey, globalProps)
+            machines = {}
+            for obj in res:
+                machines[obj.db_id] = obj
+            
+            log = DBLog(id=id,
+                        sessions=sessions,
+                        machines=machines)
+            log.is_dirty = False
+            list.append(log)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'log_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'log_id': keyStr}
+        for child in obj.db_sessions.itervalues():
+            self.getDao('session').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = {'log_id': keyStr}
+        for child in obj.db_machines.itervalues():
+            self.getDao('machine').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'os', 'architecture', 'processor', 'ram', 'id']
+        table = 'machine'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[4], 'int', 'int')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            machine = DBMachine(id=id,
+                                name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram)
+            machine.is_dirty = False
+            list.append(machine)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'machine'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_os is not None:
+                columnMap['os'] = \
+                    self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+            if obj.db_architecture is not None:
+                columnMap['architecture'] = \
+                    self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+            if obj.db_processor is not None:
+                columnMap['processor'] = \
+                    self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+            if obj.db_ram is not None:
+                columnMap['ram'] = \
+                    self.convertToDB(obj.db_ram, 'int', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'object_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'add_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[1], 'long', 'int')
+            parentObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjType = self.convertFromDB(row[3], 'str', 'char(16)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            data = None
+            if what == 'module':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'location':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'annotation':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'function':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'connection':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'port':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'parameter':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'portSpec':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'other':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            
+            add = DBAdd(id=id,
+                        what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        data=data)
+            add.is_dirty = False
+            list.append(add)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'add_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_objectId is not None:
+                columnMap['object_id'] = \
+                    self.convertToDB(obj.db_objectId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        child = obj.db_data
+        if child.vtType == 'module':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'location':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'annotation':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'function':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'connection':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'port':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'parameter':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'portSpec':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'other':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['okey', 'value', 'id']
+        table = 'other'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            key = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            other = DBOther(id=id,
+                            key=key,
+                            value=value)
+            other.is_dirty = False
+            list.append(other)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'other'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_key is not None:
+                columnMap['okey'] = \
+                    self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+            if obj.db_value is not None:
+                columnMap['value'] = \
+                    self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['x', 'y', 'id']
+        table = 'location'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            x = self.convertFromDB(row[0], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            location = DBLocation(id=id,
+                                  x=x,
+                                  y=y)
+            location.is_dirty = False
+            list.append(location)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'location'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_x is not None:
+                columnMap['x'] = \
+                    self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+            if obj.db_y is not None:
+                columnMap['y'] = \
+                    self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBWfExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['ts_start', 'ts_end', 'wfVersion', 'vistrail_id', 'vistrail_name', 'id']
+        table = 'wf_exec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            tsStart = self.convertFromDB(row[0], 'datetime', 'datetime')
+            tsEnd = self.convertFromDB(row[1], 'datetime', 'datetime')
+            wfVersion = self.convertFromDB(row[2], 'int', 'int')
+            vistrailId = self.convertFromDB(row[3], 'long', 'int')
+            vistrailName = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'wf_exec_id': keyStr}
+            res = self.getDao('execRec').fromSQL(db, None, foreignKey, globalProps)
+            execRecs = {}
+            for obj in res:
+                execRecs[obj.db_id] = obj
+            
+            wfExec = DBWfExec(id=id,
+                              tsStart=tsStart,
+                              tsEnd=tsEnd,
+                              wfVersion=wfVersion,
+                              vistrailId=vistrailId,
+                              vistrailName=vistrailName,
+                              execRecs=execRecs)
+            wfExec.is_dirty = False
+            list.append(wfExec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'wf_exec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_tsStart is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_tsStart, 'datetime', 'datetime')
+            if obj.db_tsEnd is not None:
+                columnMap['ts_end'] = \
+                    self.convertToDB(obj.db_tsEnd, 'datetime', 'datetime')
+            if obj.db_wfVersion is not None:
+                columnMap['wfVersion'] = \
+                    self.convertToDB(obj.db_wfVersion, 'int', 'int')
+            if obj.db_vistrailId is not None:
+                columnMap['vistrail_id'] = \
+                    self.convertToDB(obj.db_vistrailId, 'long', 'int')
+            if obj.db_vistrailName is not None:
+                columnMap['vistrail_name'] = \
+                    self.convertToDB(obj.db_vistrailName, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'wf_exec_id': keyStr}
+        for child in obj.db_execRecs.itervalues():
+            self.getDao('execRec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['pos', 'name', 'type', 'val', 'alias', 'id']
+        table = 'parameter'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            pos = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[3], 'str', 'varchar(8192)')
+            alias = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            parameter = DBParameter(id=id,
+                                    pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias)
+            parameter.is_dirty = False
+            list.append(parameter)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'parameter'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_pos is not None:
+                columnMap['pos'] = \
+                    self.convertToDB(obj.db_pos, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_val is not None:
+                columnMap['val'] = \
+                    self.convertToDB(obj.db_val, 'str', 'varchar(8192)')
+            if obj.db_alias is not None:
+                columnMap['alias'] = \
+                    self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['pos', 'name', 'id']
+        table = 'function'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            pos = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('function','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+            parameters = res
+            
+            function = DBFunction(id=id,
+                                  pos=pos,
+                                  name=name,
+                                  parameters=parameters)
+            function.is_dirty = False
+            list.append(function)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'function'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_pos is not None:
+                columnMap['pos'] = \
+                    self.convertToDB(obj.db_pos, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('function','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_parameters:
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'workflow'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+            modules = {}
+            for obj in res:
+                modules[obj.db_id] = obj
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+            connections = {}
+            for obj in res:
+                connections[obj.db_id] = obj
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+            others = res
+            
+            workflow = DBWorkflow(id=id,
+                                  name=name,
+                                  modules=modules,
+                                  connections=connections,
+                                  annotations=annotations,
+                                  others=others)
+            workflow.is_dirty = False
+            list.append(workflow)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'workflow'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_modules.itervalues():
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_connections.itervalues():
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_others:
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['prev_id', 'date', 'user', 'id']
+        table = 'action'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            prevId = self.convertFromDB(row[0], 'long', 'int')
+            date = self.convertFromDB(row[1], 'datetime', 'datetime')
+            user = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[3], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            operations = []
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('add').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('delete').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('change').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            action = DBAction(id=id,
+                              prevId=prevId,
+                              date=date,
+                              user=user,
+                              operations=operations)
+            action.is_dirty = False
+            list.append(action)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'action'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_prevId is not None:
+                columnMap['prev_id'] = \
+                    self.convertToDB(obj.db_prevId, 'long', 'int')
+            if obj.db_date is not None:
+                columnMap['date'] = \
+                    self.convertToDB(obj.db_date, 'datetime', 'datetime')
+            if obj.db_user is not None:
+                columnMap['user'] = \
+                    self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        for child in obj.db_operations:
+            if child.vtType == 'add':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('add').toSQL(db, child, foreignKey, globalProps)
+            elif child.vtType == 'delete':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('delete').toSQL(db, child, foreignKey, globalProps)
+            elif child.vtType == 'change':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('change').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['akey', 'value', 'id']
+        table = 'annotation'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            key = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            annotation = DBAnnotation(id=id,
+                                      key=key,
+                                      value=value)
+            annotation.is_dirty = False
+            list.append(annotation)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'annotation'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_key is not None:
+                columnMap['akey'] = \
+                    self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+            if obj.db_value is not None:
+                columnMap['value'] = \
+                    self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'change_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[1], 'long', 'int')
+            newObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            data = None
+            if what == 'module':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'location':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'annotation':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'function':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'connection':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'port':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'parameter':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'portSpec':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'other':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            
+            change = DBChange(id=id,
+                              what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              data=data)
+            change.is_dirty = False
+            list.append(change)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'change_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_oldObjId is not None:
+                columnMap['old_obj_id'] = \
+                    self.convertToDB(obj.db_oldObjId, 'long', 'int')
+            if obj.db_newObjId is not None:
+                columnMap['new_obj_id'] = \
+                    self.convertToDB(obj.db_newObjId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        child = obj.db_data
+        if child.vtType == 'module':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'location':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'annotation':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'function':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'connection':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'port':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'parameter':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'portSpec':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'other':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBMacroSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'descrptn', 'id']
+        table = 'macro'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            descrptn = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('macro','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('action').fromSQL(db, None, foreignKey, globalProps)
+            actions = {}
+            for obj in res:
+                actions[obj.db_id] = obj
+            
+            macro = DBMacro(id=id,
+                            name=name,
+                            descrptn=descrptn,
+                            actions=actions)
+            macro.is_dirty = False
+            list.append(macro)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'macro'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_descrptn is not None:
+                columnMap['descrptn'] = \
+                    self.convertToDB(obj.db_descrptn, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('macro','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_actions.itervalues():
+            self.getDao('action').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['id']
+        table = 'connection_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('connection','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+            ports = res
+            
+            connection = DBConnection(id=id,
+                                      ports=ports)
+            connection.is_dirty = False
+            list.append(connection)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'connection_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('connection','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_ports:
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['time', 'name']
+        table = 'tag'
+        whereMap = {}
+        orderBy = 'name'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'str', 'varchar(255)')
+            whereMap['name'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            time = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            keyStr = self.convertToDB(name,'str','varchar(255)')
+
+            tag = DBTag(name=name,
+                        time=time)
+            tag.is_dirty = False
+            list.append(tag)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if obj.is_dirty:
+            columns = ['name']
+            table = 'tag'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['name'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_time is not None:
+                columnMap['time'] = \
+                    self.convertToDB(obj.db_time, 'long', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['name'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBExecRecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['ts_start', 'ts_end', 'module_id', 'module_name', 'id']
+        table = 'exec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            tsStart = self.convertFromDB(row[0], 'datetime', 'datetime')
+            tsEnd = self.convertFromDB(row[1], 'datetime', 'datetime')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('execRec','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            execRec = DBExecRec(id=id,
+                                tsStart=tsStart,
+                                tsEnd=tsEnd,
+                                moduleId=moduleId,
+                                moduleName=moduleName,
+                                annotations=annotations)
+            execRec.is_dirty = False
+            list.append(execRec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'exec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_tsStart is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_tsStart, 'datetime', 'datetime')
+            if obj.db_tsEnd is not None:
+                columnMap['ts_end'] = \
+                    self.convertToDB(obj.db_tsEnd, 'datetime', 'datetime')
+            if obj.db_moduleId is not None:
+                columnMap['module_id'] = \
+                    self.convertToDB(obj.db_moduleId, 'long', 'int')
+            if obj.db_moduleName is not None:
+                columnMap['module_name'] = \
+                    self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('execRec','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['version', 'name', 'id']
+        table = 'vistrail'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            version = self.convertFromDB(row[0], 'str', 'char(16)')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            if globalProps is None:
+                globalProps = {}
+            globalProps['vt_id'] = self.convertToDB(id, 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('vistrail','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('action').fromSQL(db, None, foreignKey, globalProps)
+            actions = {}
+            for obj in res:
+                actions[obj.db_id] = obj
+            
+            foreignKey = None
+            res = self.getDao('tag').fromSQL(db, None, foreignKey, globalProps)
+            tags = {}
+            for obj in res:
+                tags[obj.db_name] = obj
+            
+            foreignKey = None
+            res = self.getDao('macro').fromSQL(db, None, foreignKey, globalProps)
+            macros = {}
+            for obj in res:
+                macros[obj.db_id] = obj
+            
+            vistrail = DBVistrail(id=id,
+                                  version=version,
+                                  name=name,
+                                  actions=actions,
+                                  tags=tags,
+                                  macros=macros)
+            vistrail.is_dirty = False
+            list.append(vistrail)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'vistrail'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'str', 'char(16)')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                if obj.db_id is not None:
+                    columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+            if obj.db_id is None:
+                obj.db_id = lastId
+                keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            if globalProps is None:
+                globalProps = {}
+            globalProps['vt_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+
+        discStr = self.convertToDB('vistrail','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_actions.itervalues():
+            self.getDao('action').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = None
+        for child in obj.db_tags.itervalues():
+            self.getDao('tag').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = None
+        for child in obj.db_macros.itervalues():
+            self.getDao('macro').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'object_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'delete_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[1], 'long', 'int')
+            parentObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjType = self.convertFromDB(row[3], 'str', 'char(16)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            delete = DBDelete(id=id,
+                              what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType)
+            delete.is_dirty = False
+            list.append(delete)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'delete_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_objectId is not None:
+                columnMap['object_id'] = \
+                    self.convertToDB(obj.db_objectId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'session' not in self:
+            self['session'] = DBSessionSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'wfExec' not in self:
+            self['wfExec'] = DBWfExecSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'macro' not in self:
+            self['macro'] = DBMacroSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'execRec' not in self:
+            self['execRec'] = DBExecRecSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_5_0/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_5_0/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..f632eb8
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/sql/sql_dao.py
@@ -0,0 +1,141 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return "'" + str(value) + "'"
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return "'" + value.isoformat() + "'"
+            elif type == 'datetime':
+                return "'" + value.strftime('%Y-%m-%d %H:%M:%S') + "'"
+            else:
+                return str(value)
+
+        return "''"
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        return dbCommand
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        valueStr = ', '.join(values)
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s)""" % \
+                    (table, columnStr, valueStr)
+        return dbCommand
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            setStr += '%s %s = %s' % (comma, column, value)
+            comma = ','
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """UPDATE %s SET %s WHERE %s""" % \
+                    (table, setStr, whereStr)
+        return dbCommand
+
+    def executeSQL(self, db, dbCommand, isFetch):
+        # print 'dbCommand: %s' % dbCommand
+        data = None
+        cursor = db.cursor()
+        cursor.execute(dbCommand)
+        if isFetch:
+            data = cursor.fetchall()
+        else:
+            data = cursor.lastrowid
+        cursor.close()
+        return data
diff --git a/vistrails/db/versions/v0_5_0/persistence/xml/__init__.py b/vistrails/db/versions/v0_5_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_5_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_5_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..ed948a6
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/xml/auto_gen.py
@@ -0,0 +1,1266 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_5_0.domain import *
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'portSpec':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        spec = self.convertFromStr(self.getAttribute(node, 'spec'), 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, doc):
+        node = doc.createElement('portSpec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.setAttribute('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.setAttribute('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'module':
+            return None
+        
+        functions = []
+        portSpecs = []
+        
+        annotations = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        cache = self.convertFromStr(self.getAttribute(node, 'cache'), 'int')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        location = None
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'location':
+                location = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'function':
+                function = self.getDao('function').fromXML(child)
+                functions.append(function)
+            elif child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations[annotation.db_id] = annotation
+            elif child.nodeName == 'portSpec':
+                portSpec = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(portSpec)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, doc):
+        node = doc.createElement('module')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(module.db_id, 'long'))
+        node.setAttribute('cache',self.convertToStr(module.db_cache, 'int'))
+        node.setAttribute('name',self.convertToStr(module.db_name, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            node.appendChild(self.getDao('location').toXML(location, doc))
+        functions = module.db_functions
+        for function in functions:
+            node.appendChild(self.getDao('function').toXML(function, doc))
+        annotations = module.db_annotations
+        for annotation in annotations.itervalues():
+            node.appendChild(self.getDao('annotation').toXML(annotation, doc))
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            node.appendChild(self.getDao('portSpec').toXML(portSpec, doc))
+        
+        return node
+
+class DBSessionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'session':
+            return None
+        
+        wfExecs = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        ip = self.convertFromStr(self.getAttribute(node, 'ip'), 'str')
+        visVersion = self.convertFromStr(self.getAttribute(node, 'visVersion'), 'str')
+        tsStart = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        tsEnd = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        machineId = self.convertFromStr(self.getAttribute(node, 'machineId'), 'long')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'wfExec':
+                wfExec = self.getDao('wfExec').fromXML(child)
+                wfExecs[wfExec.db_id] = wfExec
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBSession(id=id,
+                        user=user,
+                        ip=ip,
+                        visVersion=visVersion,
+                        tsStart=tsStart,
+                        tsEnd=tsEnd,
+                        machineId=machineId,
+                        wfExecs=wfExecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, session, doc):
+        node = doc.createElement('session')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(session.db_id, 'long'))
+        node.setAttribute('user',self.convertToStr(session.db_user, 'str'))
+        node.setAttribute('ip',self.convertToStr(session.db_ip, 'str'))
+        node.setAttribute('visVersion',self.convertToStr(session.db_visVersion, 'str'))
+        node.setAttribute('tsStart',self.convertToStr(session.db_tsStart, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(session.db_tsEnd, 'datetime'))
+        node.setAttribute('machineId',self.convertToStr(session.db_machineId, 'long'))
+        
+        # set elements
+        wfExecs = session.db_wfExecs
+        for wfExec in wfExecs.itervalues():
+            node.appendChild(self.getDao('wfExec').toXML(wfExec, doc))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'port':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        moduleName = self.convertFromStr(self.getAttribute(node, 'moduleName'), 'str')
+        sig = self.convertFromStr(self.getAttribute(node, 'sig'), 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     sig=sig)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, doc):
+        node = doc.createElement('port')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(port.db_id, 'long'))
+        node.setAttribute('type',self.convertToStr(port.db_type, 'str'))
+        node.setAttribute('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.setAttribute('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.setAttribute('sig',self.convertToStr(port.db_sig, 'str'))
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'log':
+            return None
+        
+        sessions = {}
+        machines = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'session':
+                session = self.getDao('session').fromXML(child)
+                sessions[session.db_id] = session
+            elif child.nodeName == 'machine':
+                machine = self.getDao('machine').fromXML(child)
+                machines[machine.db_id] = machine
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBLog(id=id,
+                    sessions=sessions,
+                    machines=machines)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, doc):
+        node = doc.createElement('log')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(log.db_id, 'long'))
+        
+        # set elements
+        sessions = log.db_sessions
+        for session in sessions.itervalues():
+            node.appendChild(self.getDao('session').toXML(session, doc))
+        machines = log.db_machines
+        for machine in machines.itervalues():
+            node.appendChild(self.getDao('machine').toXML(machine, doc))
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'machine':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        os = self.convertFromStr(self.getAttribute(node, 'os'), 'str')
+        architecture = self.convertFromStr(self.getAttribute(node, 'architecture'), 'str')
+        processor = self.convertFromStr(self.getAttribute(node, 'processor'), 'str')
+        ram = self.convertFromStr(self.getAttribute(node, 'ram'), 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, doc):
+        node = doc.createElement('machine')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(machine.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(machine.db_name, 'str'))
+        node.setAttribute('os',self.convertToStr(machine.db_os, 'str'))
+        node.setAttribute('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.setAttribute('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.setAttribute('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'add':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        objectId = self.convertFromStr(self.getAttribute(node, 'objectId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'module':
+                data = self.getDao('module').fromXML(child)
+            elif child.nodeName == 'location':
+                data = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'annotation':
+                data = self.getDao('annotation').fromXML(child)
+            elif child.nodeName == 'function':
+                data = self.getDao('function').fromXML(child)
+            elif child.nodeName == 'connection':
+                data = self.getDao('connection').fromXML(child)
+            elif child.nodeName == 'port':
+                data = self.getDao('port').fromXML(child)
+            elif child.nodeName == 'parameter':
+                data = self.getDao('parameter').fromXML(child)
+            elif child.nodeName == 'portSpec':
+                data = self.getDao('portSpec').fromXML(child)
+            elif child.nodeName == 'other':
+                data = self.getDao('other').fromXML(child)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAdd(id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType,
+                    data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, doc):
+        node = doc.createElement('add')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(add.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(add.db_what, 'str'))
+        node.setAttribute('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data.vtType == 'module':
+            node.appendChild(self.getDao('module').toXML(data, doc))
+        elif data.vtType == 'location':
+            node.appendChild(self.getDao('location').toXML(data, doc))
+        elif data.vtType == 'annotation':
+            node.appendChild(self.getDao('annotation').toXML(data, doc))
+        elif data.vtType == 'function':
+            node.appendChild(self.getDao('function').toXML(data, doc))
+        elif data.vtType == 'connection':
+            node.appendChild(self.getDao('connection').toXML(data, doc))
+        elif data.vtType == 'port':
+            node.appendChild(self.getDao('port').toXML(data, doc))
+        elif data.vtType == 'parameter':
+            node.appendChild(self.getDao('parameter').toXML(data, doc))
+        elif data.vtType == 'portSpec':
+            node.appendChild(self.getDao('portSpec').toXML(data, doc))
+        elif data.vtType == 'other':
+            node.appendChild(self.getDao('other').toXML(data, doc))
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'other':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'value':
+                value = self.convertFromStr(child.firstChild.nodeValue,'str')
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, doc):
+        node = doc.createElement('other')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(other.db_id, 'long'))
+        node.setAttribute('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        if other.db_value is not None:
+            child = other.db_value
+            valueNode = doc.createElement('value')
+            valueText = doc.createTextNode(self.convertToStr(child, 'str'))
+            valueNode.appendChild(valueText)
+            node.appendChild(valueNode)
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'location':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        x = self.convertFromStr(self.getAttribute(node, 'x'), 'float')
+        y = self.convertFromStr(self.getAttribute(node, 'y'), 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, doc):
+        node = doc.createElement('location')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(location.db_id, 'long'))
+        node.setAttribute('x',self.convertToStr(location.db_x, 'float'))
+        node.setAttribute('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBWfExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'wfExec':
+            return None
+        
+        execRecs = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        tsStart = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        tsEnd = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        wfVersion = self.convertFromStr(self.getAttribute(node, 'wfVersion'), 'int')
+        vistrailId = self.convertFromStr(self.getAttribute(node, 'vistrailId'), 'long')
+        vistrailName = self.convertFromStr(self.getAttribute(node, 'vistrailName'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'execRec':
+                execRec = self.getDao('execRec').fromXML(child)
+                execRecs[execRec.db_id] = execRec
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBWfExec(id=id,
+                       tsStart=tsStart,
+                       tsEnd=tsEnd,
+                       wfVersion=wfVersion,
+                       vistrailId=vistrailId,
+                       vistrailName=vistrailName,
+                       execRecs=execRecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, wfExec, doc):
+        node = doc.createElement('wfExec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(wfExec.db_id, 'long'))
+        node.setAttribute('tsStart',self.convertToStr(wfExec.db_tsStart, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(wfExec.db_tsEnd, 'datetime'))
+        node.setAttribute('wfVersion',self.convertToStr(wfExec.db_wfVersion, 'int'))
+        node.setAttribute('vistrailId',self.convertToStr(wfExec.db_vistrailId, 'long'))
+        node.setAttribute('vistrailName',self.convertToStr(wfExec.db_vistrailName, 'str'))
+        
+        # set elements
+        execRecs = wfExec.db_execRecs
+        for execRec in execRecs.itervalues():
+            node.appendChild(self.getDao('execRec').toXML(execRec, doc))
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'parameter':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        pos = self.convertFromStr(self.getAttribute(node, 'pos'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        val = self.convertFromStr(self.getAttribute(node, 'val'), 'str')
+        alias = self.convertFromStr(self.getAttribute(node, 'alias'), 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, doc):
+        node = doc.createElement('parameter')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(parameter.db_id, 'long'))
+        node.setAttribute('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.setAttribute('name',self.convertToStr(parameter.db_name, 'str'))
+        node.setAttribute('type',self.convertToStr(parameter.db_type, 'str'))
+        node.setAttribute('val',self.convertToStr(parameter.db_val, 'str'))
+        node.setAttribute('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'function':
+            return None
+        
+        parameters = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        pos = self.convertFromStr(self.getAttribute(node, 'pos'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'parameter':
+                parameter = self.getDao('parameter').fromXML(child)
+                parameters.append(parameter)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, doc):
+        node = doc.createElement('function')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(function.db_id, 'long'))
+        node.setAttribute('pos',self.convertToStr(function.db_pos, 'long'))
+        node.setAttribute('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            node.appendChild(self.getDao('parameter').toXML(parameter, doc))
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'workflow':
+            return None
+        
+        annotations = []
+        others = []
+        
+        modules = {}
+        connections = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'module':
+                module = self.getDao('module').fromXML(child)
+                modules[module.db_id] = module
+            elif child.nodeName == 'connection':
+                connection = self.getDao('connection').fromXML(child)
+                connections[connection.db_id] = connection
+            elif child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeName == 'other':
+                other = self.getDao('other').fromXML(child)
+                others.append(other)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBWorkflow(id=id,
+                         name=name,
+                         modules=modules,
+                         connections=connections,
+                         annotations=annotations,
+                         others=others)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, doc):
+        node = doc.createElement('workflow')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(workflow.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(workflow.db_name, 'str'))
+        
+        # set elements
+        modules = workflow.db_modules
+        for module in modules.itervalues():
+            node.appendChild(self.getDao('module').toXML(module, doc))
+        connections = workflow.db_connections
+        for connection in connections.itervalues():
+            node.appendChild(self.getDao('connection').toXML(connection, doc))
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            node.appendChild(self.getDao('annotation').toXML(annotation, doc))
+        others = workflow.db_others
+        for other in others:
+            node.appendChild(self.getDao('other').toXML(other, doc))
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'action':
+            return None
+        
+        operations = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        prevId = self.convertFromStr(self.getAttribute(node, 'prevId'), 'long')
+        date = self.convertFromStr(self.getAttribute(node, 'date'), 'datetime')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'add':
+                operation = self.getDao('add').fromXML(child)
+                operations.append(operation)
+            elif child.nodeName == 'delete':
+                operation = self.getDao('delete').fromXML(child)
+                operations.append(operation)
+            elif child.nodeName == 'change':
+                operation = self.getDao('change').fromXML(child)
+                operations.append(operation)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAction(id=id,
+                       prevId=prevId,
+                       date=date,
+                       user=user,
+                       operations=operations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, doc):
+        node = doc.createElement('action')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(action.db_id, 'long'))
+        node.setAttribute('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.setAttribute('date',self.convertToStr(action.db_date, 'datetime'))
+        node.setAttribute('user',self.convertToStr(action.db_user, 'str'))
+        
+        # set elements
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                node.appendChild(self.getDao('add').toXML(operation, doc))
+            elif operation.vtType == 'delete':
+                node.appendChild(self.getDao('delete').toXML(operation, doc))
+            elif operation.vtType == 'change':
+                node.appendChild(self.getDao('change').toXML(operation, doc))
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'annotation':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        value = self.convertFromStr(self.getAttribute(node, 'value'), 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, doc):
+        node = doc.createElement('annotation')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(annotation.db_id, 'long'))
+        node.setAttribute('key',self.convertToStr(annotation.db_key, 'str'))
+        node.setAttribute('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'change':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        oldObjId = self.convertFromStr(self.getAttribute(node, 'oldObjId'), 'long')
+        newObjId = self.convertFromStr(self.getAttribute(node, 'newObjId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'module':
+                data = self.getDao('module').fromXML(child)
+            elif child.nodeName == 'location':
+                data = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'annotation':
+                data = self.getDao('annotation').fromXML(child)
+            elif child.nodeName == 'function':
+                data = self.getDao('function').fromXML(child)
+            elif child.nodeName == 'connection':
+                data = self.getDao('connection').fromXML(child)
+            elif child.nodeName == 'port':
+                data = self.getDao('port').fromXML(child)
+            elif child.nodeName == 'parameter':
+                data = self.getDao('parameter').fromXML(child)
+            elif child.nodeName == 'portSpec':
+                data = self.getDao('portSpec').fromXML(child)
+            elif child.nodeName == 'other':
+                data = self.getDao('other').fromXML(child)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBChange(id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType,
+                       data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, doc):
+        node = doc.createElement('change')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(change.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(change.db_what, 'str'))
+        node.setAttribute('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.setAttribute('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data.vtType == 'module':
+            node.appendChild(self.getDao('module').toXML(data, doc))
+        elif data.vtType == 'location':
+            node.appendChild(self.getDao('location').toXML(data, doc))
+        elif data.vtType == 'annotation':
+            node.appendChild(self.getDao('annotation').toXML(data, doc))
+        elif data.vtType == 'function':
+            node.appendChild(self.getDao('function').toXML(data, doc))
+        elif data.vtType == 'connection':
+            node.appendChild(self.getDao('connection').toXML(data, doc))
+        elif data.vtType == 'port':
+            node.appendChild(self.getDao('port').toXML(data, doc))
+        elif data.vtType == 'parameter':
+            node.appendChild(self.getDao('parameter').toXML(data, doc))
+        elif data.vtType == 'portSpec':
+            node.appendChild(self.getDao('portSpec').toXML(data, doc))
+        elif data.vtType == 'other':
+            node.appendChild(self.getDao('other').toXML(data, doc))
+        
+        return node
+
+class DBMacroXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'macro':
+            return None
+        
+        actions = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        descrptn = self.convertFromStr(self.getAttribute(node, 'descrptn'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions[action.db_id] = action
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBMacro(id=id,
+                      name=name,
+                      descrptn=descrptn,
+                      actions=actions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, macro, doc):
+        node = doc.createElement('macro')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(macro.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(macro.db_name, 'str'))
+        node.setAttribute('descrptn',self.convertToStr(macro.db_descrptn, 'str'))
+        
+        # set elements
+        actions = macro.db_actions
+        for action in actions.itervalues():
+            node.appendChild(self.getDao('action').toXML(action, doc))
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'connection':
+            return None
+        
+        ports = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'port':
+                port = self.getDao('port').fromXML(child)
+                ports.append(port)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, doc):
+        node = doc.createElement('connection')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            node.appendChild(self.getDao('port').toXML(port, doc))
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'tag':
+            return None
+        
+        # read attributes
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        time = self.convertFromStr(self.getAttribute(node, 'time'), 'long')
+        
+        obj = DBTag(name=name,
+                    time=time)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, doc):
+        node = doc.createElement('tag')
+        
+        # set attributes
+        node.setAttribute('name',self.convertToStr(tag.db_name, 'str'))
+        node.setAttribute('time',self.convertToStr(tag.db_time, 'long'))
+        
+        return node
+
+class DBExecRecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'exec':
+            return None
+        
+        annotations = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        tsStart = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        tsEnd = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        moduleName = self.convertFromStr(self.getAttribute(node, 'moduleName'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBExecRec(id=id,
+                        tsStart=tsStart,
+                        tsEnd=tsEnd,
+                        moduleId=moduleId,
+                        moduleName=moduleName,
+                        annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, execRec, doc):
+        node = doc.createElement('exec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(execRec.db_id, 'long'))
+        node.setAttribute('tsStart',self.convertToStr(execRec.db_tsStart, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(execRec.db_tsEnd, 'datetime'))
+        node.setAttribute('moduleId',self.convertToStr(execRec.db_moduleId, 'long'))
+        node.setAttribute('moduleName',self.convertToStr(execRec.db_moduleName, 'str'))
+        
+        # set elements
+        annotations = execRec.db_annotations
+        for annotation in annotations:
+            node.appendChild(self.getDao('annotation').toXML(annotation, doc))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'vistrail':
+            return None
+        
+        actions = {}
+        tags = {}
+        macros = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'str')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        dbHost = self.convertFromStr(self.getAttribute(node, 'dbHost'), 'str')
+        dbPort = self.convertFromStr(self.getAttribute(node, 'dbPort'), 'int')
+        dbName = self.convertFromStr(self.getAttribute(node, 'dbName'), 'str')
+        
+        
+        # read children
+        for child in node.childNodes:
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions[action.db_id] = action
+            elif child.nodeName == 'tag':
+                tag = self.getDao('tag').fromXML(child)
+                tags[tag.db_name] = tag
+            elif child.nodeName == 'macro':
+                macro = self.getDao('macro').fromXML(child)
+                macros[macro.db_id] = macro
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         dbHost=dbHost,
+                         dbPort=dbPort,
+                         dbName=dbName,
+                         actions=actions,
+                         tags=tags,
+                         macros=macros)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, doc):
+        node = doc.createElement('vistrail')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.setAttribute('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.setAttribute('name',self.convertToStr(vistrail.db_name, 'str'))
+        node.setAttribute('dbHost',self.convertToStr(vistrail.db_dbHost, 'str'))
+        node.setAttribute('dbPort',self.convertToStr(vistrail.db_dbPort, 'int'))
+        node.setAttribute('dbName',self.convertToStr(vistrail.db_dbName, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions.itervalues():
+            node.appendChild(self.getDao('action').toXML(action, doc))
+        tags = vistrail.db_tags
+        for tag in tags.itervalues():
+            node.appendChild(self.getDao('tag').toXML(tag, doc))
+        macros = vistrail.db_macros
+        for macro in macros.itervalues():
+            node.appendChild(self.getDao('macro').toXML(macro, doc))
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'delete':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        objectId = self.convertFromStr(self.getAttribute(node, 'objectId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, doc):
+        node = doc.createElement('delete')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(delete.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(delete.db_what, 'str'))
+        node.setAttribute('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'session' not in self:
+            self['session'] = DBSessionXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'wfExec' not in self:
+            self['wfExec'] = DBWfExecXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'macro' not in self:
+            self['macro'] = DBMacroXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'execRec' not in self:
+            self['execRec'] = DBExecRecXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_5_0/persistence/xml/io.py b/vistrails/db/versions/v0_5_0/persistence/xml/io.py
new file mode 100644
index 0000000..661d937
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/xml/io.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.parsers.expat import ExpatError
+import xml.dom.minidom
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_5_0 import version as my_version
+
+def parse_xml_file(filename):
+    try:
+        return xml.dom.minidom.parse(filename)
+    except xml.parsers.expat.ExpatError, e:
+        msg = 'XML parse error at line %s, col %s: %s' % \
+            (e.lineno, e.offset, e.code)
+        raise VistrailsDBException(msg)
+
+def write_xml_file(filename, dom, prettyprint=True):
+    output = open(filename, 'w')
+    if prettyprint:
+        dom.writexml(output, '','  ','\n')
+    else:
+        dom.writexml(output)
+    output.close()
+
+def read_xml_object(vtType, node, dao_list):
+    return dao_list[vtType].fromXML(node)
+
+def write_xml_object(obj, dom, dao_list, node=None):
+    res_node = dao_list[obj.vtType].toXML(obj, dom, node)
+    return res_node
+
+def open_from_xml(filename, vtType, dao_list):
+    """open_from_xml(filename) -> DBVistrail"""
+    dom = parse_xml_file(filename)
+    vistrail = read_xml_object(vtType, dom.documentElement, dao_list)
+    dom.unlink()
+    return vistrail
+
+def save_to_xml(obj, filename, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(obj, dom, dao_list)
+    dom.appendChild(root)
+    if obj.vtType == 'vistrail':
+        root.setAttribute('version', my_version)
+        root.setAttribute('xmlns:xsi', 
+                          'http://www.w3.org/2001/XMLSchema-instance')
+        root.setAttribute('xsi:schemaLocation', 
+                          'http://www.vistrails.org/vistrail.xsd')
+    write_xml_file(filename, dom)
+    dom.unlink()
+
+def serialize(object, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(object, dom, dao_list)
+    dom.appendChild(root)
+    return dom.toxml()
+
+def unserialize(str, obj_type):
+    dom = xml.dom.minidom.parseString(str)
+    return read_xml_object(obj_type, dom.documentElement, dao_list)
+
diff --git a/vistrails/db/versions/v0_5_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_5_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..de42aa2
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/persistence/xml/xml_dao.py
@@ -0,0 +1,77 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_5_0/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_5_0/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..8d403eb
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/schemas/sql/vistrails.sql
@@ -0,0 +1,236 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE session(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vis_ver varchar(255),
+    ts_start datetime,
+    tsEnd datetime,
+    machine_id int,
+    log_id int,
+    vt_id int
+);
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    sig varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE log_tbl(
+    id int,
+    vt_id int
+);
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    log_id int,
+    vt_id int
+);
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE wf_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    wfVersion int,
+    vistrail_id int,
+    vistrail_name varchar(255),
+    session_id int,
+    vt_id int
+);
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8192),
+    alias varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE workflow(
+    id int,
+    name varchar(255),
+    vt_id int
+);
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    user varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE macro(
+    id int,
+    name varchar(255),
+    descrptn varchar(255),
+    vt_id int
+);
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE tag(
+    name varchar(255),
+    time int,
+    vt_id int
+);
+
+CREATE TABLE exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    module_id int,
+    module_name varchar(255),
+    wf_exec_id int,
+    vt_id int
+);
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    version char(16),
+    name varchar(255)
+);
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
diff --git a/vistrails/db/versions/v0_5_0/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_5_0/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..fcb4304
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, session, port, log_tbl, machine, add_tbl, other, location, wf_exec, parameter, function, workflow, action, annotation, change_tbl, macro, connection_tbl, tag, exec, vistrail, delete_tbl
diff --git a/vistrails/db/versions/v0_5_0/schemas/xml/log.xsd b/vistrails/db/versions/v0_5_0/schemas/xml/log.xsd
new file mode 100644
index 0000000..1871490
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/schemas/xml/log.xsd
@@ -0,0 +1,102 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="log">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="session" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="machine" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="session">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="wfExec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="ip" type="xs:string"/>
+      <xs:attribute name="visVersion" type="xs:string"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="machineId" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="machine">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="os" type="xs:string"/>
+      <xs:attribute name="architecture" type="xs:string"/>
+      <xs:attribute name="processor" type="xs:string"/>
+      <xs:attribute name="ram" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="wfExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="execRec" ref="exec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="wfVersion" type="xs:int"/>
+      <xs:attribute name="vistrailId" type="xs:int"/>
+      <xs:attribute name="vistrailName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="exec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_5_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_5_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..23bdc68
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,213 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="macro" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="user" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="time" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="macro">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="descrptn" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="sig" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_5_0/schemas/xml/workflow.xsd b/vistrails/db/versions/v0_5_0/schemas/xml/workflow.xsd
new file mode 100644
index 0000000..d24c9f8
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/schemas/xml/workflow.xsd
@@ -0,0 +1,131 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="module" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+      <xs:attribute name="relative" type="xs:boolean"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="sig" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_5_0/specs/action.xml b/vistrails/db/versions/v0_5_0/specs/action.xml
new file mode 100644
index 0000000..2847761
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/action.xml
@@ -0,0 +1,104 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+  
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+<!--
+  <property name="actionType" type="str">
+    <xml inferred="true" choice="operation"/>
+    <sql column="action_type" type="char(16)"/>
+  </property>
+
+discriminator="actionType"
+-->
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="macro">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/add.xml b/vistrails/db/versions/v0_5_0/specs/add.xml
new file mode 100644
index 0000000..0973246
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/add.xml
@@ -0,0 +1,107 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/annotation.xml b/vistrails/db/versions/v0_5_0/specs/annotation.xml
new file mode 100644
index 0000000..58d4dd6
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/annotation.xml
@@ -0,0 +1,89 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml name="id" nodeType="xs:attribute" type="xs:int"/>
+    <sql column="id" type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml name="key" nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="execRec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/change.xml b/vistrails/db/versions/v0_5_0/specs/change.xml
new file mode 100644
index 0000000..178a19b
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/change.xml
@@ -0,0 +1,112 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/connection.xml b/vistrails/db/versions/v0_5_0/specs/connection.xml
new file mode 100644
index 0000000..781b127
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/connection.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+<!--
+  <property name="source" ref="true" object="port" type="object" 
+	    mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="destination" ref="true" object="port" type="object" 
+	    mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+-->
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/delete.xml b/vistrails/db/versions/v0_5_0/specs/delete.xml
new file mode 100644
index 0000000..9df9273
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/delete.xml
@@ -0,0 +1,77 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/execRec.xml b/vistrails/db/versions/v0_5_0/specs/execRec.xml
new file mode 100644
index 0000000..29f48ee
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/execRec.xml
@@ -0,0 +1,81 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="execRec">
+  <layout>
+    <xml name="exec" nodeType="xs:element"/>
+    <sql table="exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="tsStart" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql column="ts_start" type="datetime"/>
+  </property>
+
+  <property name="tsEnd" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql column="ts_end" type="datetime"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="module_id" type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="module_name" type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="wfExec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/function.xml b/vistrails/db/versions/v0_5_0/specs/function.xml
new file mode 100644
index 0000000..8254645
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/function.xml
@@ -0,0 +1,83 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/location.xml b/vistrails/db/versions/v0_5_0/specs/location.xml
new file mode 100644
index 0000000..6e56055
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/location.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_5_0/specs/log.xml b/vistrails/db/versions/v0_5_0/specs/log.xml
new file mode 100644
index 0000000..53d3d43
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/log.xml
@@ -0,0 +1,60 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="session" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/machine.xml b/vistrails/db/versions/v0_5_0/specs/machine.xml
new file mode 100644
index 0000000..bae6103
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/machine.xml
@@ -0,0 +1,82 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/macro.xml b/vistrails/db/versions/v0_5_0/specs/macro.xml
new file mode 100644
index 0000000..6c5fb37
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/macro.xml
@@ -0,0 +1,72 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="macro">
+  <layout>
+    <xml name="macro" nodeType="xs:element"/>
+    <sql table="macro"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="descrptn" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="action" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="vistrail" type="long" mapping="many-to-one" 
+	    inverse="true">
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+
+  
diff --git a/vistrails/db/versions/v0_5_0/specs/module.xml b/vistrails/db/versions/v0_5_0/specs/module.xml
new file mode 100644
index 0000000..922ac2b
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/module.xml
@@ -0,0 +1,95 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/other.xml b/vistrails/db/versions/v0_5_0/specs/other.xml
new file mode 100644
index 0000000..40e1388
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/other.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/parameter.xml b/vistrails/db/versions/v0_5_0/specs/parameter.xml
new file mode 100644
index 0000000..23236b5
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/parameter.xml
@@ -0,0 +1,94 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8192)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/port.xml b/vistrails/db/versions/v0_5_0/specs/port.xml
new file mode 100644
index 0000000..2a369ff
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/port.xml
@@ -0,0 +1,90 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="sig" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/portSpec.xml b/vistrails/db/versions/v0_5_0/specs/portSpec.xml
new file mode 100644
index 0000000..e42a5f0
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/portSpec.xml
@@ -0,0 +1,84 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/session.xml b/vistrails/db/versions/v0_5_0/specs/session.xml
new file mode 100644
index 0000000..0b1a03d
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/session.xml
@@ -0,0 +1,91 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="session">
+  <layout>
+    <xml name="session" type="xs:element"/>
+    <sql table="session"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="visVersion" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="vis_ver" type="varchar(255)"/>
+  </property>
+
+  <property name="tsStart" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql column="ts_start" type="datetime"/>
+  </property>
+
+  <property name="tsEnd" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql coumn="ts_end" type="datetime"/>
+  </property>
+  
+  <property name="machineId" type="long" foreignKey="true" object="machine">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="machine_id" type="int"/>
+  </property>
+
+  <property ref="true" object="wfExec" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+  
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/tag.xml b/vistrails/db/versions/v0_5_0/specs/tag.xml
new file mode 100644
index 0000000..22af100
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/tag.xml
@@ -0,0 +1,61 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="name" type="str" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="time" type="long" foreignKey="true" object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property ref="true" object="vistrail" type="long" mapping="many-to-one" 
+	    inverse="true">
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/vistrail.xml b/vistrails/db/versions/v0_5_0/specs/vistrail.xml
new file mode 100644
index 0000000..9ffbb79
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/vistrail.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="vt_id"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="macro" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/wfExec.xml b/vistrails/db/versions/v0_5_0/specs/wfExec.xml
new file mode 100644
index 0000000..aa56ca6
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/wfExec.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="wfExec">
+  <layout>
+    <xml name="wfExec" nodeType="xs:element"/>
+    <sql table="wf_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="tsStart" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql column="ts_start" type="datetime"/>
+  </property>
+
+  <property name="tsEnd" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql column="ts_end" type="datetime"/>
+  </property>
+
+  <property name="wfVersion" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql colunn="wf_version" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" foreignKey="true" object="vistrail">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="vistrail_id" type="int"/>
+  </property>
+
+  <property name="vistrailName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="vistrail_name" type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="session" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="session_id" type="int"/>
+  </property>
+
+  <property ref="true" object="execRec" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_5_0/specs/workflow.xml b/vistrails/db/versions/v0_5_0/specs/workflow.xml
new file mode 100644
index 0000000..4f3a576
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/specs/workflow.xml
@@ -0,0 +1,74 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="module" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="connection" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+  
diff --git a/vistrails/db/versions/v0_5_0/translate/__init__.py b/vistrails/db/versions/v0_5_0/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_5_0/translate/v0_3_1.py b/vistrails/db/versions/v0_5_0/translate/v0_3_1.py
new file mode 100644
index 0000000..eff91ce
--- /dev/null
+++ b/vistrails/db/versions/v0_5_0/translate/v0_3_1.py
@@ -0,0 +1,754 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+import copy
+from datetime import datetime
+from time import strptime
+
+from vistrails.core.data_structures.graph import Graph
+from vistrails.db.versions.v0_5_0.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort
+
+def convertDate(date):
+    if date is not None and date != '':
+        return datetime(*strptime(date, '%d %b %Y %H:%M:%S')[0:6])
+    return datetime(1900, 1, 1)
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+    for _action in _vistrail.db_get_actions():
+#        print 'translating action %s' % _action.db_time
+        functionName = 'translate%s%sAction' % \
+            (_action.db_what[0].upper(), _action.db_what[1:])
+        thisModule = sys.modules[__name__]
+        action = getattr(thisModule, functionName)(_action)
+        vistrail.db_add_action(action)
+    for _tag in _vistrail.db_get_tags():
+        tag = DBTag(time=_tag.db_time,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    convertIds(vistrail)
+#     for action in vistrail.getActions():
+#         print '%s %s' % (action.id, action.operations)
+    vistrail.db_version = '0.5.0'
+    return vistrail
+
+def translateAddModuleAction(_action):
+    operations = []
+    for _module in _action.db_datas:
+        module = DBModule(id=_module.db_id,
+                          name=_module.db_name,
+                          cache=1,
+                          location=DBLocation(id=_module.db_id,
+                                              x=_module.db_x,
+                                              y=_module.db_y))
+        module.db_location.relative = False
+        operation = DBAdd(id=_action.db_time,
+                          what='module',
+                          objectId=_module.db_id,
+                          data=module)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateAddConnectionAction(_action):
+    operations = []
+    for _connection in _action.db_datas:
+        source = DBPort(id=_connection.db_id,
+                        type='source',
+                        moduleId=_connection.db_sourceId,
+                        moduleName=_connection.db_sourceModule,
+                        sig=_connection.db_sourcePort)
+        destination = DBPort(id=_connection.db_id,
+                             type='destination',
+                             moduleId=_connection.db_destinationId,
+                             moduleName=_connection.db_destinationModule,
+                             sig=_connection.db_destinationPort)
+        connection = DBConnection(id=_connection.db_id,
+                                  ports=[source, destination])
+        operation = DBAdd(id=_action.db_time,
+                          what='connection',
+                          objectId=_connection.db_id,
+                          data=connection)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateChangeParameterAction(_action):
+    operations = []
+    for _set in _action.db_datas:
+        parameter = DBParameter(id=_set.db_parameterId,
+                                pos=_set.db_parameterId,
+                                name=_set.db_parameter,
+                                alias=_set.db_alias,
+                                val=_set.db_value,
+                                type=_set.db_type)
+        function = DBFunction(id=_set.db_functionId,
+                              pos=_set.db_functionId,
+                              name=_set.db_function,
+                              parameters=[parameter])
+        operation = DBChange(id=_action.db_time,
+                             what='function',
+                             oldObjId=_set.db_functionId,
+                             parentObjId=_set.db_moduleId,
+                             parentObjType='module',
+                             data=function)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateAddModulePortAction(_action):
+    operations = []
+    for _portSpec in _action.db_datas:
+        # ids need to be checked
+        portSpec = DBPortSpec(id=_portSpec.db_moduleId,
+                              name=_portSpec.db_portName,
+                              type=_portSpec.db_portType,
+                              spec=_portSpec.db_portSpec)
+        operation = DBAdd(id=_action.db_time,
+                          what='portSpec',
+                          objectId=(_portSpec.db_portName,
+                                    _portSpec.db_portType),
+                          parentObjId=_portSpec.db_moduleId,
+                          parentObjType='module',
+                          data=portSpec)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateChangeAnnotationAction(_action):
+    operations = []
+    for _annotation in _action.db_datas:
+        if _annotation.db_key.strip() != '' or \
+                _annotation.db_value.strip() != '':
+            annotation = DBAnnotation(id=-1,
+                                      key=_annotation.db_key,
+                                      value=_annotation.db_value)
+            operation = DBChange(id=_action.db_time,
+                                 what='annotation',
+                                 oldObjId=_annotation.db_key,
+                                 parentObjId=_annotation.db_moduleId,
+                                 parentObjType='module',
+                                 data=annotation)
+            operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateDeleteModuleAction(_action):
+    operations = []
+    for _module in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='module',
+                             objectId=_module.db_moduleId)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateDeleteConnectionAction(_action):
+    operations = []
+    for _connection in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='connection',
+                             objectId=_connection.db_connectionId)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateDeleteFunctionAction(_action):
+    operations = []
+    for _function in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='function',
+                             objectId=_function.db_functionId,
+                             parentObjId=_function.db_moduleId,
+                             parentObjType='module')
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateDeleteAnnotationAction(_action):
+    operations = []
+    for _annotation in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='annotation',
+                             objectId=_annotation.db_key)
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateDeleteModulePortAction(_action):
+    operations = []
+    for _portSpec in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='portSpec',
+                             objectId=(_portSpec.db_portName,
+                                       _portSpec.db_portType),
+                             parentObjId=_portSpec.db_moduleId,
+                             parentObjType='module')
+        operations.append(operation)
+
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+def translateMoveModuleAction(_action):
+    operations = []
+    for _location in _action.db_datas:
+        location = DBLocation(id=_location.db_id,
+                              x=_location.db_dx,
+                              y=_location.db_dy)
+        location.relative = True
+
+        operation = DBChange(id=_action.db_time,
+                             what='location',
+                             oldObjId=_location.db_id,
+                             parentObjId=_location.db_id,
+                             parentObjType='module',
+                             data=location)
+        operations.append(operation)
+    
+    action = DBAction(id=_action.db_time,
+                      prevId=_action.db_parent,
+                      date=convertDate(_action.db_date),
+                      user=_action.db_user,
+                      operations=operations)
+    return action
+
+
+### UPDATE IDS ###
+
+def convertIds(vistrail):
+    actions = vistrail.db_get_actions()
+    actions.sort(key=lambda x: x.db_id)
+    objectDict = {}
+#    refDict = {'objectDict': objectDict}
+
+    graph = Graph()
+    for action in actions:
+        graph.add_vertex(action.db_id)
+        graph.add_edge(action.db_prevId, action.db_id)
+
+    def convertAction(actionId):
+        if actionId == 0:
+            return
+
+        allOps = []
+        action = vistrail.db_get_action(actionId)
+#         objectDict = refDict['objectDict']
+#         if action.actionType == 'delete' or action.actionType == 'change':
+#             action.objectDict = copy.deepcopy(objectDict)
+#         else:
+#             action.objectDict = objectDict
+        for operation in action.db_get_operations():
+            allOps.extend(convertOperation(vistrail,
+                                           objectDict,
+                                           operation.vtType,
+                                           operation))
+        action.db_operations = allOps
+
+    def removeObjects(actionId):
+        if actionId == 0:
+            return
+#        print "removeObjects(%s)" % actionId
+        action = vistrail.db_get_action(actionId)
+
+        # need to reverse ops here
+        reverseOps = action.db_get_operations()
+        reverseOps.reverse()
+        for operation in reverseOps:
+            parentList = getTypeIdList(operation)
+            removeObject(operation.db_what,
+                         operation.db_oldId,
+                         objectDict,
+                         parentList[:-1])
+        reverseOps.reverse()
+
+
+    graph.dfs(enter_vertex=convertAction,
+              leave_vertex=removeObjects)
+
+def getTypeIdList(operation):
+    if operation.db_what in ('module', 'connection'):
+        return [(operation.db_what, operation.db_oldId)]
+    elif operation.db_what in \
+            ('function', 'portSpec', 'location', 'annotation'):
+        return [('module', operation.db_oldParentId),
+                (operation.db_what, operation.db_oldId)]
+    elif operation.db_what in ('port'):
+        return [('connection', operation.db_oldParentId),
+                (operation.db_what, operation.db_oldId)]
+    elif operation.db_what in ('parameter'):
+        return [('module', operation.db_moduleId),
+                ('function', operation.db_oldParentId),
+                ('parameter', operation.db_oldId)]
+    else:
+        print "unknown type: '%s'" % operation.db_what
+        return [(operation.db_what, operation.db_oldId)]
+
+def getOldId(object):
+    if object.vtType == 'annotation':
+        return object.db_key
+    elif object.vtType == 'port':
+        return object.db_type
+    elif object.vtType == 'portSpec':
+        return (object.db_name, object.db_type)
+    else:
+        return object.getPrimaryKey()
+
+def getChildren(object):
+    childList = []
+    if object.vtType == 'module':
+        childList = object.db_get_functions() + \
+            object.db_get_portSpecs() + \
+            object.db_get_annotations()
+        childList.append(object.db_location)
+        object.db_functions = []
+        object.db_portSpecs = []
+        object.db_annotations = {}
+        object.db_location = None
+    elif object.vtType == 'connection':
+         childList = object.db_get_ports()
+         object.db_ports = []
+    elif object.vtType == 'function':
+        childList =  object.db_get_parameters()
+        object.db_parameters = []
+    return childList
+
+def captureObject(object, objectDict, newId, parentList):
+    
+#    print "capturing %s" % object
+    currentDict = objectDict
+    for key in parentList:
+        (objType, objId) = key
+#        (currentId, newDict, _) = currentDict[(objType, objId)]
+#        currentDict = newDict
+        (objList, curIdx) = currentDict[(objType, objId)]
+        currentDict = objList[curIdx][1]
+    oldId = getOldId(object)
+#    print "capture: %s %s" % (object.vtType, oldId)
+#    currentDict[(object.vtType, oldId)] = (newId, {}, object)
+    if not currentDict.has_key((object.vtType, oldId)):
+        currentDict[(object.vtType, oldId)] = ([], -1)
+    (curList, curIdx) = currentDict[(object.vtType, oldId)]
+    curList.append((newId, {}, object, curIdx))
+    currentDict[(object.vtType, oldId)] = (curList, len(curList) - 1)
+
+def captureDelete(objType, objId, objectDict, parentList):
+    currentDict = objectDict
+    for (aType, aId) in parentList:
+#        (currentId, newDict, _) = currentDict[(objType, objId)]
+#        currentDict = newDict
+        (objList, curIdx) = currentDict[(aType, aId)]
+        currentDict = objList[curIdx][1]
+
+#    print "captureDelete: %s %s" % (objType, objId)
+    if not currentDict.has_key((objType, objId)):
+        raise Exception("invalid delete")
+    (curList, curIdx) = currentDict[(objType, objId)]
+    curList.append((-1, {}, None, curIdx))
+    currentDict[(objType, objId)] = (curList, len(curList) - 1)
+
+def removeObject(oldObjType, oldId, objectDict, parentList):
+#     print '%s %s' % (oldObjType, oldId)
+#     print objectDict
+#     print parentList
+
+    try:
+        currentDict = objectDict
+        for key in parentList:
+            (objType, objId) = key
+#            (currentId, newDict, _) = currentDict[(objType, objId)]
+#            currentDict = newDict
+            (objList, objIdx) = currentDict[(objType, objId)]
+            currentDict = objList[objIdx][1]
+#        print "remove: %s %s" % (oldObjType, oldId)
+        (curList, curIdx) = currentDict[(oldObjType, oldId)]
+#        print "ok"
+        newIdx = curList[curIdx][3]
+#        del curList[curIdx]
+        currentDict[(oldObjType, oldId)] = (curList, newIdx)
+    except KeyError:
+        print "cannot remove (%s, %s)" % (oldObjType, oldId)
+        print parentList
+        print objList
+        print "index: %s"  % objIdx
+
+def findNewId(typeIdList, objectDict):
+    try:
+        currentDict = objectDict
+        for key in typeIdList:
+#            (currentId, currentDict, currentObj) = currentDict[key]
+            (objList, curIdx) = currentDict[key]
+            if curIdx == -1:
+                return (None, None)
+            (currentId, currentDict, currentObj, _) = objList[curIdx]
+        if currentId == -1:
+            return (None, None)
+        return (currentId, currentObj)
+    except KeyError:
+        pass
+    return (None, None)
+
+def getChildList(typeIdList, objectDict):
+    try:
+        currentDict = objectDict
+        for (objType, objOldId) in typeIdList:
+#            (currentId, currentDict, _) = currentDict[(objType, objOldId)]
+            (objList, curIdx) = currentDict[(objType, objOldId)]
+            if curIdx == -1:
+                return {}
+            currentDict = objList[curIdx][1]
+        return currentDict
+    except KeyError:
+        pass
+    return {}
+
+def createOperation(actionType, objId, objType, parentId, parentType,
+                    object=None):
+    if actionType == 'add':
+        operation = DBAdd(what=objType,
+                          objectId=objId,
+                          parentObjId=parentId,
+                          parentObjType=parentType,
+                          data=object)
+
+    elif actionType == 'change':
+        operation = DBChange(what=objType,
+                             oldObjId=objId,
+                             parentObjId=parentId,
+                             parentObjType=parentType,
+                             data=object)
+    elif actionType == 'delete':
+        operation = DBDelete(what=objType,
+                             objectId=objId,
+                             parentObjId=parentId,
+                             parentObjType=parentType)
+    else:
+        msg = "Cannot find actionType='%s'" % actionType
+        raise Exception(msg)
+
+    return operation
+
+def convertChangeToAdd(operation):
+    return DBAdd(what=operation.db_what,
+                 objectId=operation.db_newObjId,
+                 parentObjId=operation.db_parentObjId,
+                 parentObjType=operation.db_parentObjType,
+                 data=operation.db_data)
+    
+def convertOperation(vistrail, objectDict, actionType, operation):
+    newOps = []
+    if actionType == 'add':
+        object = operation.db_data
+        if object.vtType == 'parameter' and object.db_pos == -1:
+            return newOps
+        operation.db_oldId = operation.db_objectId
+        if operation.db_what == 'annotation':
+            operation.db_oldId = object.db_key
+        elif operation.db_what == 'port':
+            operation.db_oldId = object.db_type
+        operation.db_oldParentId = operation.db_parentObjId
+        parentList = getTypeIdList(operation)
+
+
+        newId = vistrail.idScope.getNewId(object.vtType)
+        captureObject(object, objectDict, newId, parentList[:-1])
+        operation.db_objectId = newId
+        oldId = object.getPrimaryKey()
+        if object.vtType == 'annotation':
+            oldId = object.db_key
+        elif object.vtType == 'port':
+            oldId = object.db_type
+        if hasattr(object, 'db_id'):
+            object.db_id = newId
+
+        # set parent ids correctly...
+        operation.db_id = vistrail.idScope.getNewId('operation')
+        if operation.db_parentObjId is not None:
+            oldParentObjId = operation.db_parentObjId
+            operation.db_parentObjId = findNewId(parentList[:-1], objectDict)[0]
+        if object.vtType == 'port':
+            object.db_moduleId = \
+                findNewId([('module', object.db_moduleId)], objectDict)[0]
+#         if object.vtType == 'connection':
+#             for port in object.db_ports.itervalues():
+#                 port.db_moduleId = \
+#                     findNewId([('module', port.db_moduleId)], objectDict)[0]
+
+        newOps.append(operation)
+
+        # set child operations
+        children = getChildren(object)
+        for child in children:
+            # hack to get around fact that location ids are wrong
+            if child.vtType == 'location':
+                child.db_id = oldId
+            newOp = createOperation('add',
+                                    child.getPrimaryKey(),
+                                    child.vtType,
+                                    oldId,
+                                    object.vtType,
+                                    child)
+
+            # hack to get moduleId at parameter level
+            if child.vtType == 'parameter':
+                newOp.db_moduleId = oldParentObjId
+            newOps.extend(convertOperation(vistrail, 
+                                           objectDict, 
+                                           'add',
+                                           newOp))
+            newOp.db_parentObjId = newId
+    elif actionType == 'change':
+        object = operation.db_data
+        if object.vtType == 'parameter' and object.db_pos == -1:
+            return newOps
+        operation.db_oldId = operation.db_oldObjId
+        if operation.db_what == 'annotation':
+            operation.db_oldId = object.db_key
+        elif operation.db_what == 'port':
+            operation.db_oldId = object.db_type
+        operation.db_oldParentId = operation.db_parentObjId
+        parentList = getTypeIdList(operation)
+
+        # need to get changed id as new id if have one
+        (foundId, foundObj) = findNewId(parentList, objectDict)
+        if foundId is not None:
+            if foundObj.vtType == 'function' and \
+                    foundObj.db_pos == object.db_pos and \
+                    foundObj.db_name == object.db_name:
+                # don't create new function, convert parameter
+                for parameter in object.db_parameters:
+                    newOp = createOperation('change',
+                                            parameter.getPrimaryKey(),
+                                            parameter.vtType,
+                                            object.getPrimaryKey(),
+                                            object.vtType,
+                                            parameter)
+                    newOp.db_moduleId = operation.db_parentObjId
+                    newOps.extend(convertOperation(vistrail,
+                                                   objectDict,
+                                                   'change',
+                                                   newOp))
+                    newOp.db_parentObjId = foundId
+                return newOps
+            else:
+                if foundObj.vtType == 'location' and object.relative == True:
+                    object.db_x += foundObj.db_x
+                    object.db_y += foundObj.db_y
+                    object.relative = False
+                # get new id for new object
+                newId = vistrail.idScope.getNewId(object.vtType)
+                operation.db_oldObjId = foundId
+                operation.db_newObjId = newId
+        else:
+            # get new id for new object
+            newId = vistrail.idScope.getNewId(object.vtType)
+            operation.db_oldObjId = -1
+            operation.db_newObjId = newId
+            anOldId = operation.db_oldId
+            anOldParentId = operation.db_parentObjId
+            if hasattr(operation,'db_moduleId'):
+                aModuleId = operation.db_moduleId
+            else:
+                aModuleId = None
+            operation = convertChangeToAdd(operation)
+            operation.db_oldId = anOldId
+            operation.db_oldParentId = operation.db_parentObjId
+            operation.db_moduleId = aModuleId
+
+        # need to do child deletes first
+        childDict = getChildList(parentList, objectDict)
+        for k,v in childDict.items():
+            (objType, objId) = k
+#            (newId, newDict) = v
+#            print 'creating delete for %s'  % objType
+            newOp = createOperation('delete',
+                                    objId,
+                                    objType,
+                                    object.getPrimaryKey(),
+                                    object.vtType)
+            # hack to get moduleId at parameter level
+            if objType == 'parameter':
+                newOp.db_moduleId = operation.db_parentObjId
+            newOps.extend(convertOperation(vistrail,
+                                           objectDict,
+                                           'delete',
+                                           newOp))
+            newOp.db_parentObjId = newId
+        # don't reverse -- ordering is correct
+        # newOps.reverse()
+
+        # set new object id
+        captureObject(object, objectDict, newId, parentList[:-1])
+#        operation.db_objectId = newId
+        oldId = object.getPrimaryKey()
+        if object.vtType == 'annotation':
+            oldId = object.db_key
+        elif object.vtType == 'port':
+            oldId = object.db_type
+        if hasattr(object, 'db_id'):
+            object.db_id = newId
+
+        # set parent ids correctly...
+        operation.db_id = vistrail.idScope.getNewId('operation')
+        if operation.db_parentObjId is not None:
+            oldParentObjId = operation.db_parentObjId
+            operation.db_parentObjId = findNewId(parentList[:-1], objectDict)[0]
+        if object.vtType == 'port':
+            object.db_moduleId = \
+                findNewId([('module', object.db_moduleId)], objectDict)[0]
+#         if object.vtType == 'connection':
+#             for port in object.db_ports.itervalues():
+#                 port.db_moduleId = \
+#                     findNewId([('module', port.db_moduleId)], objectDict)[0]
+        newOps.append(operation)
+
+        # set child operations
+        children = getChildren(operation.db_data)
+        for child in children:
+#            print 'creating add for %s' % child.vtType
+            newOp = createOperation('add',
+                                    child.getPrimaryKey(),
+                                    child.vtType,
+                                    oldId,
+                                    object.vtType,
+                                    child)
+            # hack to get moduleId at parameter level
+            if child.vtType == 'parameter':
+                newOp.db_moduleId = oldParentObjId
+            newOps.extend(convertOperation(vistrail, 
+                                           objectDict, 
+                                           'add',
+                                           newOp))
+            newOp.db_parentObjId = newId
+    elif actionType == 'delete':
+        operation.db_oldId = operation.db_objectId
+#         if operation.db_what == 'annotation':
+#             operation.db_oldId = object.db_key
+#         elif operation.db_what == 'port':
+#             operation.db_oldId = object.db_type
+        operation.db_oldParentId = operation.db_parentObjId
+        parentList = getTypeIdList(operation)
+
+        # get new id for delete operation
+        (newId, _) = findNewId(parentList, objectDict)
+#        print 'found new id:  %s' % newId
+        if newId is None:
+            msg = "Cannot find id: %s" % parentList
+            print msg
+#            raise Exception(msg)
+            return []
+
+        # need to do child deletes first
+        childDict = getChildList(parentList, objectDict)
+        for k,v in childDict.items():
+            (objType, objId) = k
+#            (newId, newDict) = v
+            newOp = createOperation('delete',
+                                    objId,
+                                    objType,
+                                    operation.db_objectId,
+                                    operation.db_what)
+            # hack to get moduleId at parameter level
+            if objType == 'parameter':
+                newOp.db_moduleId = operation.db_parentObjId
+            newOps.extend(convertOperation(vistrail,
+                                           objectDict,
+                                           'delete',
+                                           newOp))
+            newOp.db_parentObjId = newId
+#        newOps.reverse()
+
+        captureDelete(operation.db_what, operation.db_objectId, objectDict, 
+                      parentList[:-1])
+        operation.db_objectId = newId
+        
+        # set parent ids correctly
+        operation.db_id = vistrail.idScope.getNewId('operation')
+        if operation.db_parentObjId is not None:
+            operation.db_parentObjId = findNewId(parentList[:-1], objectDict)[0]
+        newOps.append(operation)
+
+    return newOps
diff --git a/vistrails/db/versions/v0_6_0/__init__.py b/vistrails/db/versions/v0_6_0/__init__.py
new file mode 100644
index 0000000..c015978
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.6.0'
diff --git a/vistrails/db/versions/v0_6_0/domain/__init__.py b/vistrails/db/versions/v0_6_0/domain/__init__.py
new file mode 100644
index 0000000..f9f4892
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/domain/__init__.py
@@ -0,0 +1,38 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
diff --git a/vistrails/db/versions/v0_6_0/domain/auto_gen.py b/vistrails/db/versions/v0_6_0/domain/auto_gen.py
new file mode 100644
index 0000000..a95442a
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/domain/auto_gen.py
@@ -0,0 +1,3284 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBPortSpec()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_spec = self.db_spec
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, package=None, version=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self.__db_id = id
+        self.__db_cache = cache
+        self.__db_name = name
+        self.__db_package = package
+        self.__db_version = version
+        self.__db_location = location
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = {}
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations.itervalues():
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self.__db_portSpecs = {}
+        else:
+            self.__db_portSpecs = portSpecs
+            for v in self.__db_portSpecs.itervalues():
+                self.db_portSpecs_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBModule()
+        cp.db_id = self.db_id
+        cp.db_cache = self.db_cache
+        cp.db_name = self.db_name
+        cp.db_package = self.db_package
+        cp.db_version = self.db_version
+        cp.db_location = self.db_location
+        if self.db_functions is None:
+            cp.db_functions = None
+        else:
+            cp.db_functions = [copy.copy(v) for v in self.db_functions]
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = dict([(k,copy.copy(v)) for (k,v) in self.db_annotations.iteritems()])
+            for v in cp.__db_annotations.itervalues():
+                cp.db_annotations_key_index[v.db_key] = v
+        if self.db_portSpecs is None:
+            cp.db_portSpecs = None
+        else:
+            cp.db_portSpecs = dict([(k,copy.copy(v)) for (k,v) in self.db_portSpecs.iteritems()])
+            for v in cp.__db_portSpecs.itervalues():
+                cp.db_portSpecs_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        for child in self.db_functions:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_portSpecs.itervalues():
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_package(self):
+        return self.__db_package
+    def __set_db_package(self, package):
+        self.__db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self.__db_package = package
+    def db_change_package(self, package):
+        self.__db_package = package
+    def db_delete_package(self, package):
+        self.__db_package = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                del self.__db_functions[i]
+                break
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations.values()
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        del self.__db_annotations[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        if self.__db_annotations.has_key(key):
+            return self.__db_annotations[key]
+        return None
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def __get_db_portSpecs(self):
+        return self.__db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self.__db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self.__db_portSpecs.values()
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self.__db_portSpecs[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[portSpec.db_name] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        self.__db_portSpecs[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[portSpec.db_name] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        del self.__db_portSpecs[portSpec.db_id]
+        del self.db_portSpecs_name_index[portSpec.db_name]
+    def db_get_portSpec(self, key):
+        if self.__db_portSpecs.has_key(key):
+            return self.__db_portSpecs[key]
+        return None
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return self.db_portSpecs_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBTag()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('action', obj.db_id)):
+                obj.db_id = id_remap[('action', obj.db_id)]
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, sig=None):
+        self.__db_id = id
+        self.__db_type = type
+        self.__db_moduleId = moduleId
+        self.__db_moduleName = moduleName
+        self.__db_sig = sig
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBPort()
+        cp.db_id = self.db_id
+        cp.db_type = self.db_type
+        cp.db_moduleId = self.db_moduleId
+        cp.db_moduleName = self.db_moduleName
+        cp.db_sig = self.db_sig
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('module', obj.db_moduleId)):
+                obj.db_moduleId = id_remap[('module', obj.db_moduleId)]
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self.__db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self.__db_moduleName = None
+    
+    def __get_db_sig(self):
+        return self.__db_sig
+    def __set_db_sig(self, sig):
+        self.__db_sig = sig
+        self.is_dirty = True
+    db_sig = property(__get_db_sig, __set_db_sig)
+    def db_add_sig(self, sig):
+        self.__db_sig = sig
+    def db_change_sig(self, sig):
+        self.__db_sig = sig
+    def db_delete_sig(self, sig):
+        self.__db_sig = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, workflow_execs=None, machines=None):
+        self.__db_id = id
+        if workflow_execs is None:
+            self.__db_workflow_execs = {}
+        else:
+            self.__db_workflow_execs = workflow_execs
+        if machines is None:
+            self.__db_machines = {}
+        else:
+            self.__db_machines = machines
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBLog()
+        cp.db_id = self.db_id
+        if self.db_workflow_execs is None:
+            cp.db_workflow_execs = None
+        else:
+            cp.db_workflow_execs = dict([(k,copy.copy(v)) for (k,v) in self.db_workflow_execs.iteritems()])
+        if self.db_machines is None:
+            cp.db_machines = None
+        else:
+            cp.db_machines = dict([(k,copy.copy(v)) for (k,v) in self.db_machines.iteritems()])
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_workflow_execs.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_machines.itervalues():
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_workflow_execs(self):
+        return self.__db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self.__db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self.__db_workflow_execs.values()
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self.__db_workflow_execs[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self.__db_workflow_execs[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        del self.__db_workflow_execs[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        if self.__db_workflow_execs.has_key(key):
+            return self.__db_workflow_execs[key]
+        return None
+    
+    def __get_db_machines(self):
+        return self.__db_machines
+    def __set_db_machines(self, machines):
+        self.__db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self.__db_machines.values()
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        del self.__db_machines[machine.db_id]
+    def db_get_machine(self, key):
+        if self.__db_machines.has_key(key):
+            return self.__db_machines[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None, module_execs=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_os = os
+        self.__db_architecture = architecture
+        self.__db_processor = processor
+        self.__db_ram = ram
+        if module_execs is None:
+            self.__db_module_execs = []
+        else:
+            self.__db_module_execs = module_execs
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBMachine()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_os = self.db_os
+        cp.db_architecture = self.db_architecture
+        cp.db_processor = self.db_processor
+        cp.db_ram = self.db_ram
+        if self.db_module_execs is None:
+            cp.db_module_execs = None
+        else:
+            cp.db_module_execs = [copy.copy(v) for v in self.db_module_execs]
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_os(self):
+        return self.__db_os
+    def __set_db_os(self, os):
+        self.__db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self.__db_os = os
+    def db_change_os(self, os):
+        self.__db_os = os
+    def db_delete_os(self, os):
+        self.__db_os = None
+    
+    def __get_db_architecture(self):
+        return self.__db_architecture
+    def __set_db_architecture(self, architecture):
+        self.__db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self.__db_architecture = None
+    
+    def __get_db_processor(self):
+        return self.__db_processor
+    def __set_db_processor(self, processor):
+        self.__db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self.__db_processor = processor
+    def db_change_processor(self, processor):
+        self.__db_processor = processor
+    def db_delete_processor(self, processor):
+        self.__db_processor = None
+    
+    def __get_db_ram(self):
+        return self.__db_ram
+    def __set_db_ram(self, ram):
+        self.__db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self.__db_ram = ram
+    def db_change_ram(self, ram):
+        self.__db_ram = ram
+    def db_delete_ram(self, ram):
+        self.__db_ram = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs.append(module_exec)
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                self.__db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self.__db_module_execs.append(module_exec)
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                del self.__db_module_execs[i]
+                break
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == key:
+                return self.__db_module_execs[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None, data=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.__db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAdd()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        cp.db_data = self.db_data
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        self.__db_data = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBOther()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self.__db_id = id
+        self.__db_x = x
+        self.__db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBLocation()
+        cp.db_id = self.db_id
+        cp.db_x = self.db_x
+        cp.db_y = self.db_y
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_x(self):
+        return self.__db_x
+    def __set_db_x(self, x):
+        self.__db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self.__db_x = x
+    def db_change_x(self, x):
+        self.__db_x = x
+    def db_delete_x(self, x):
+        self.__db_x = None
+    
+    def __get_db_y(self):
+        return self.__db_y
+    def __set_db_y(self, y):
+        self.__db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self.__db_y = y
+    def db_change_y(self, y):
+        self.__db_y = y
+    def db_delete_y(self, y):
+        self.__db_y = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, name=None, module_execs=None):
+        self.__db_id = id
+        self.__db_user = user
+        self.__db_ip = ip
+        self.__db_vt_version = vt_version
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_parent_id = parent_id
+        self.__db_parent_type = parent_type
+        self.__db_parent_version = parent_version
+        self.__db_name = name
+        if module_execs is None:
+            self.__db_module_execs = {}
+        else:
+            self.__db_module_execs = module_execs
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBWorkflowExec()
+        cp.db_id = self.db_id
+        cp.db_user = self.db_user
+        cp.db_ip = self.db_ip
+        cp.db_vt_version = self.db_vt_version
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_parent_id = self.db_parent_id
+        cp.db_parent_type = self.db_parent_type
+        cp.db_parent_version = self.db_parent_version
+        cp.db_name = self.db_name
+        if self.db_module_execs is None:
+            cp.db_module_execs = None
+        else:
+            cp.db_module_execs = dict([(k,copy.copy(v)) for (k,v) in self.db_module_execs.iteritems()])
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs.itervalues():
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_ip(self):
+        return self.__db_ip
+    def __set_db_ip(self, ip):
+        self.__db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self.__db_ip = ip
+    def db_change_ip(self, ip):
+        self.__db_ip = ip
+    def db_delete_ip(self, ip):
+        self.__db_ip = None
+    
+    def __get_db_vt_version(self):
+        return self.__db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self.__db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self.__db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self.__db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self.__db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self.__db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self.__db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self.__db_parent_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs.values()
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        del self.__db_module_execs[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        if self.__db_module_execs.has_key(key):
+            return self.__db_module_execs[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        if parameters is None:
+            self.__db_parameters = []
+        else:
+            self.__db_parameters = parameters
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBFunction()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        if self.db_parameters is None:
+            cp.db_parameters = None
+        else:
+            cp.db_parameters = [copy.copy(v) for v in self.db_parameters]
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_parameters(self):
+        return self.__db_parameters
+    def __set_db_parameters(self, parameters):
+        self.__db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self.__db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self.__db_parameters.append(parameter)
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                self.__db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self.__db_parameters.append(parameter)
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                del self.__db_parameters[i]
+                break
+    def db_get_parameter(self, key):
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == key:
+                return self.__db_parameters[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, name=None, actions=None, tags=None):
+        self.__db_id = id
+        self.__db_name = name
+        if actions is None:
+            self.__db_actions = {}
+        else:
+            self.__db_actions = actions
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = {}
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags.itervalues():
+                self.db_tags_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAbstraction()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_actions is None:
+            cp.db_actions = None
+        else:
+            cp.db_actions = dict([(k,copy.copy(v)) for (k,v) in self.db_actions.iteritems()])
+        if self.db_tags is None:
+            cp.db_tags = None
+        else:
+            cp.db_tags = dict([(k,copy.copy(v)) for (k,v) in self.db_tags.iteritems()])
+            for v in cp.__db_tags.itervalues():
+                cp.db_tags_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_tags.itervalues():
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions.values()
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        del self.__db_actions[action.db_id]
+    def db_get_action(self, key):
+        if self.__db_actions.has_key(key):
+            return self.__db_actions[key]
+        return None
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags.values()
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        del self.__db_tags[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        if self.__db_tags.has_key(key):
+            return self.__db_tags[key]
+        return None
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, id=None, name=None, modules=None, connections=None, annotations=None, others=None, abstractionRefs=None):
+        self.__db_id = id
+        self.__db_name = name
+        if modules is None:
+            self.__db_modules = {}
+        else:
+            self.__db_modules = modules
+        if connections is None:
+            self.__db_connections = {}
+        else:
+            self.__db_connections = connections
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+        if others is None:
+            self.__db_others = []
+        else:
+            self.__db_others = others
+        if abstractionRefs is None:
+            self.__db_abstractionRefs = {}
+        else:
+            self.__db_abstractionRefs = abstractionRefs
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBWorkflow()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_modules is None:
+            cp.db_modules = None
+        else:
+            cp.db_modules = dict([(k,copy.copy(v)) for (k,v) in self.db_modules.iteritems()])
+        if self.db_connections is None:
+            cp.db_connections = None
+        else:
+            cp.db_connections = dict([(k,copy.copy(v)) for (k,v) in self.db_connections.iteritems()])
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+        if self.db_others is None:
+            cp.db_others = None
+        else:
+            cp.db_others = [copy.copy(v) for v in self.db_others]
+        if self.db_abstractionRefs is None:
+            cp.db_abstractionRefs = None
+        else:
+            cp.db_abstractionRefs = dict([(k,copy.copy(v)) for (k,v) in self.db_abstractionRefs.iteritems()])
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_modules.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        to_del = []
+        for child in self.db_connections.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_abstractionRefs.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstractionRef(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_modules.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_connections.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_others:
+            if child.has_changes():
+                return True
+        for child in self.db_abstractionRefs.itervalues():
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_modules(self):
+        return self.__db_modules
+    def __set_db_modules(self, modules):
+        self.__db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self.__db_modules.values()
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self.__db_modules[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        self.__db_modules[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        del self.__db_modules[module.db_id]
+    def db_get_module(self, key):
+        if self.__db_modules.has_key(key):
+            return self.__db_modules[key]
+        return None
+    
+    def __get_db_connections(self):
+        return self.__db_connections
+    def __set_db_connections(self, connections):
+        self.__db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self.__db_connections.values()
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        del self.__db_connections[connection.db_id]
+    def db_get_connection(self, key):
+        if self.__db_connections.has_key(key):
+            return self.__db_connections[key]
+        return None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    
+    def __get_db_others(self):
+        return self.__db_others
+    def __set_db_others(self, others):
+        self.__db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self.__db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self.__db_others.append(other)
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                self.__db_others[i] = other
+                found = True
+                break
+        if not found:
+            self.__db_others.append(other)
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                del self.__db_others[i]
+                break
+    def db_get_other(self, key):
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == key:
+                return self.__db_others[i]
+        return None
+    
+    def __get_db_abstractionRefs(self):
+        return self.__db_abstractionRefs
+    def __set_db_abstractionRefs(self, abstractionRefs):
+        self.__db_abstractionRefs = abstractionRefs
+        self.is_dirty = True
+    db_abstractionRefs = property(__get_db_abstractionRefs, __set_db_abstractionRefs)
+    def db_get_abstractionRefs(self):
+        return self.__db_abstractionRefs.values()
+    def db_add_abstractionRef(self, abstractionRef):
+        self.is_dirty = True
+        self.__db_abstractionRefs[abstractionRef.db_id] = abstractionRef
+    def db_change_abstractionRef(self, abstractionRef):
+        self.is_dirty = True
+        self.__db_abstractionRefs[abstractionRef.db_id] = abstractionRef
+    def db_delete_abstractionRef(self, abstractionRef):
+        self.is_dirty = True
+        del self.__db_abstractionRefs[abstractionRef.db_id]
+    def db_get_abstractionRef(self, key):
+        if self.__db_abstractionRefs.has_key(key):
+            return self.__db_abstractionRefs[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstractionRef(object):
+
+    vtType = 'abstractionRef'
+
+    def __init__(self, id=None, abstraction_id=None, version=None):
+        self.__db_id = id
+        self.__db_abstraction_id = abstraction_id
+        self.__db_version = version
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAbstractionRef()
+        cp.db_id = self.db_id
+        cp.db_abstraction_id = self.db_abstraction_id
+        cp.db_version = self.db_version
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_abstraction_id(self):
+        return self.__db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAnnotation()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None, data=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_oldObjId = oldObjId
+        self.__db_newObjId = newObjId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.__db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBChange()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_oldObjId = self.db_oldObjId
+        cp.db_newObjId = self.db_newObjId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        cp.db_data = self.db_data
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self.__db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self.__db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self.__db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self.__db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        self.__db_data = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_val = val
+        self.__db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBParameter()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_val = self.db_val
+        cp.db_alias = self.db_alias
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_val(self):
+        return self.__db_val
+    def __set_db_val(self, val):
+        self.__db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self.__db_val = val
+    def db_change_val(self, val):
+        self.__db_val = val
+    def db_delete_val(self, val):
+        self.__db_val = None
+    
+    def __get_db_alias(self):
+        return self.__db_alias
+    def __set_db_alias(self, alias):
+        self.__db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self.__db_alias = alias
+    def db_change_alias(self, alias):
+        self.__db_alias = alias
+    def db_delete_alias(self, alias):
+        self.__db_alias = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self.__db_id = id
+        self.db_ports_type_index = {}
+        if ports is None:
+            self.__db_ports = []
+        else:
+            self.__db_ports = ports
+            for v in self.__db_ports:
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBConnection()
+        cp.db_id = self.db_id
+        if self.db_ports is None:
+            cp.db_ports = None
+        else:
+            cp.db_ports = [copy.copy(v) for v in self.db_ports]
+            for v in cp.__db_ports:
+                cp.db_ports_type_index[v.db_type] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ports(self):
+        return self.__db_ports
+    def __set_db_ports(self, ports):
+        self.__db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self.__db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self.__db_ports.append(port)
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                self.__db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self.__db_ports.append(port)
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                del self.__db_ports[i]
+                break
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == key:
+                return self.__db_ports[i]
+        return None
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return self.db_ports_type_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, id=None, prevId=None, date=None, user=None, annotations=None, operations=None):
+        self.__db_id = id
+        self.__db_prevId = prevId
+        self.__db_date = date
+        self.__db_user = user
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = {}
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations.itervalues():
+                self.db_annotations_key_index[v.db_key] = v
+        if operations is None:
+            self.__db_operations = []
+        else:
+            self.__db_operations = operations
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAction()
+        cp.db_id = self.db_id
+        cp.db_prevId = self.db_prevId
+        cp.db_date = self.db_date
+        cp.db_user = self.db_user
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = dict([(k,copy.copy(v)) for (k,v) in self.db_annotations.iteritems()])
+            for v in cp.__db_annotations.itervalues():
+                cp.db_annotations_key_index[v.db_key] = v
+        if self.db_operations is None:
+            cp.db_operations = None
+        else:
+            cp.db_operations = [copy.copy(v) for v in self.db_operations]
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_prevId(self):
+        return self.__db_prevId
+    def __set_db_prevId(self, prevId):
+        self.__db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self.__db_prevId = None
+    
+    def __get_db_date(self):
+        return self.__db_date
+    def __set_db_date(self, date):
+        self.__db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self.__db_date = date
+    def db_change_date(self, date):
+        self.__db_date = date
+    def db_delete_date(self, date):
+        self.__db_date = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations.values()
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        del self.__db_annotations[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        if self.__db_annotations.has_key(key):
+            return self.__db_annotations[key]
+        return None
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def __get_db_operations(self):
+        return self.__db_operations
+    def __set_db_operations(self, operations):
+        self.__db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self.__db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self.__db_operations.append(operation)
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                self.__db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self.__db_operations.append(operation)
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                del self.__db_operations[i]
+                break
+    def db_get_operation(self, key):
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == key:
+                return self.__db_operations[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBDelete()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, version=None, name=None, dbHost=None, dbPort=None, dbName=None, actions=None, tags=None, abstractions=None):
+        self.__db_id = id
+        self.__db_version = version
+        self.__db_name = name
+        self.__db_dbHost = dbHost
+        self.__db_dbPort = dbPort
+        self.__db_dbName = dbName
+        if actions is None:
+            self.__db_actions = {}
+        else:
+            self.__db_actions = actions
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = {}
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags.itervalues():
+                self.db_tags_name_index[v.db_name] = v
+        if abstractions is None:
+            self.__db_abstractions = {}
+        else:
+            self.__db_abstractions = abstractions
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBVistrail()
+        cp.db_id = self.db_id
+        cp.db_version = self.db_version
+        cp.db_name = self.db_name
+        cp.db_dbHost = self.db_dbHost
+        cp.db_dbPort = self.db_dbPort
+        cp.db_dbName = self.db_dbName
+        if self.db_actions is None:
+            cp.db_actions = None
+        else:
+            cp.db_actions = dict([(k,copy.copy(v)) for (k,v) in self.db_actions.iteritems()])
+        if self.db_tags is None:
+            cp.db_tags = None
+        else:
+            cp.db_tags = dict([(k,copy.copy(v)) for (k,v) in self.db_tags.iteritems()])
+            for v in cp.__db_tags.itervalues():
+                cp.db_tags_name_index[v.db_name] = v
+        if self.db_abstractions is None:
+            cp.db_abstractions = None
+        else:
+            cp.db_abstractions = dict([(k,copy.copy(v)) for (k,v) in self.db_abstractions.iteritems()])
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_abstractions.itervalues():
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_tags.itervalues():
+            if child.has_changes():
+                return True
+        for child in self.db_abstractions.itervalues():
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_dbHost(self):
+        return self.__db_dbHost
+    def __set_db_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+        self.is_dirty = True
+    db_dbHost = property(__get_db_dbHost, __set_db_dbHost)
+    def db_add_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_change_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_delete_dbHost(self, dbHost):
+        self.__db_dbHost = None
+    
+    def __get_db_dbPort(self):
+        return self.__db_dbPort
+    def __set_db_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+        self.is_dirty = True
+    db_dbPort = property(__get_db_dbPort, __set_db_dbPort)
+    def db_add_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_change_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_delete_dbPort(self, dbPort):
+        self.__db_dbPort = None
+    
+    def __get_db_dbName(self):
+        return self.__db_dbName
+    def __set_db_dbName(self, dbName):
+        self.__db_dbName = dbName
+        self.is_dirty = True
+    db_dbName = property(__get_db_dbName, __set_db_dbName)
+    def db_add_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_change_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_delete_dbName(self, dbName):
+        self.__db_dbName = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions.values()
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        self.__db_actions[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        del self.__db_actions[action.db_id]
+    def db_get_action(self, key):
+        if self.__db_actions.has_key(key):
+            return self.__db_actions[key]
+        return None
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags.values()
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        del self.__db_tags[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        if self.__db_tags.has_key(key):
+            return self.__db_tags[key]
+        return None
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def __get_db_abstractions(self):
+        return self.__db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self.__db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self.__db_abstractions.values()
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self.__db_abstractions[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        self.__db_abstractions[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        del self.__db_abstractions[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        if self.__db_abstractions.has_key(key):
+            return self.__db_abstractions[key]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, module_id=None, module_name=None, annotations=None):
+        self.__db_id = id
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_module_id = module_id
+        self.__db_module_name = module_name
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBModuleExec()
+        cp.db_id = self.db_id
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_module_id = self.db_module_id
+        cp.db_module_name = self.db_module_name
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def copy_with_new_ids(self, parent, id_scope, id_remap):
+        cp = copy.copy(self)
+        children = cp.db_children(parent, False)
+        for (obj, _, _) in children:
+            new_id = id_scope.getNewId(obj.vtType)
+            id_remap[(obj.vtType, obj.db_id)] = new_id
+            obj.db_id = new_id
+        for (obj, _, _) in children:
+            if id_remap.has_key(('module', obj.db_module_id)):
+                obj.db_module_id = id_remap[('module', obj.db_module_id)]
+            if id_remap.has_key(('vistrail', obj.db_vistrailId)):
+                obj.db_vistrailId = id_remap[('vistrail', obj.db_vistrailId)]
+        
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_module_id(self):
+        return self.__db_module_id
+    def __set_db_module_id(self, module_id):
+        self.__db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self.__db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self.__db_module_name
+    def __set_db_module_name(self, module_name):
+        self.__db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self.__db_module_name = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
diff --git a/vistrails/db/versions/v0_6_0/domain/id_scope.py b/vistrails/db/versions/v0_6_0/domain/id_scope.py
new file mode 100644
index 0000000..3f151ff
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/domain/id_scope.py
@@ -0,0 +1,65 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L):
+        self.ids = {}
+        self.beginId = beginId
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        if self.ids.has_key(objType):
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        else:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        if not self.ids.has_key(objType) or self.ids[objType] <= beginId:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_6_0/domain/vistrail.py b/vistrails/db/versions/v0_6_0/domain/vistrail.py
new file mode 100644
index 0000000..4ca792e
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/domain/vistrail.py
@@ -0,0 +1,43 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBVistrail as _DBVistrail
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+        self.idScope.setBeginId('action', 1)
diff --git a/vistrails/db/versions/v0_6_0/domain/workflow.py b/vistrails/db/versions/v0_6_0/domain/workflow.py
new file mode 100644
index 0000000..97cb040
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/domain/workflow.py
@@ -0,0 +1,116 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1)
+
+    def __copy__(self):
+        cp = _DBWorkflow.__copy__(self)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.objects = {}
+        for (child, _, _) in cp.db_children():
+            cp.addToIndex(child)
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp
+
+    def addToIndex(self, object):
+        self.objects[(object.vtType, object.getPrimaryKey())] = object
+
+    def deleteFromIndex(self, object):
+        del self.objects[(object.vtType, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_add_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_add_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_change_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_change_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_delete_object(self, objId, objType, 
+                         parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_get_%s' % objType
+        try:
+            object = getattr(parentObj, funname)(objId)
+        except AttributeError:
+            attr_name = 'db_%s' % objType
+            object = getattr(parentObj, attr_name)
+        funname = 'db_delete_%s' % objType
+        getattr(parentObj, funname)(object)
+        self.deleteFromIndex(object)
diff --git a/vistrails/db/versions/v0_6_0/persistence/__init__.py b/vistrails/db/versions/v0_6_0/persistence/__init__.py
new file mode 100644
index 0000000..0a10c9d
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/__init__.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+import xml.io
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def open_from_xml(self, filename, vtType, tree=None):
+        return xml.io.open_from_xml(filename, vtType, self['xml'])
+
+    def save_to_xml(self, obj, filename):
+        xml.io.save_to_xml(obj, filename, self['xml'])
+
+    def serialize(self, obj):
+        return xml.io.serialize(obj, self['xml'])
+
+    def unserialize(self, str, type):
+        return xml.io.unserialize(str, type, self['xml'])
diff --git a/vistrails/db/versions/v0_6_0/persistence/sql/__init__.py b/vistrails/db/versions/v0_6_0/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_6_0/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_6_0/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..dffd921
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/sql/auto_gen.py
@@ -0,0 +1,4069 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_6_0.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[5], 'long', 'int')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_vistrailId = vistrailId
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'type', 'spec', 'id']
+        table = 'port_spec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[3], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            portSpec = DBPortSpec(id=id,
+                                  name=name,
+                                  type=type,
+                                  spec=spec)
+            portSpec.is_dirty = False
+            list.append(portSpec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'port_spec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_spec is not None:
+                columnMap['spec'] = \
+                    self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'cache', 'name', 'package', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[3], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_vistrailId = vistrailId
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'package', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['cache', 'name', 'package', 'version', 'id']
+        table = 'module'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            cache = self.convertFromDB(row[0], 'int', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+            if len(res) > 0:
+                location = res[0]
+            else:
+                location = None
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+            functions = res
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = {}
+            for obj in res:
+                annotations[obj.db_id] = obj
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+            portSpecs = {}
+            for obj in res:
+                portSpecs[obj.db_id] = obj
+            
+            module = DBModule(id=id,
+                              cache=cache,
+                              name=name,
+                              package=package,
+                              version=version,
+                              location=location,
+                              functions=functions,
+                              annotations=annotations,
+                              portSpecs=portSpecs)
+            module.is_dirty = False
+            list.append(module)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'module'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_cache is not None:
+                columnMap['cache'] = \
+                    self.convertToDB(obj.db_cache, 'int', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_package is not None:
+                columnMap['package'] = \
+                    self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        child = obj.db_location
+        if child is not None:
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_functions:
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations.itervalues():
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_portSpecs.itervalues():
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[3], 'long', 'int')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_parentType = parentType
+            tag.db_vistrailId = vistrailId
+            tag.db_parent = parent
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_tag(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'tag'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'tag'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            tag = DBTag(id=id,
+                        name=name)
+            tag.is_dirty = False
+            list.append(tag)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'tag'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'sig', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            sig = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          sig=sig,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_vistrailId = vistrailId
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'sig', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_sig') and obj.db_sig is not None:
+            columnMap['sig'] = \
+                self.convertToDB(obj.db_sig, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['type', 'moduleId', 'moduleName', 'sig', 'id']
+        table = 'port'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            type = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[1], 'long', 'int')
+            moduleName = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            sig = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            port = DBPort(id=id,
+                          type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          sig=sig)
+            port.is_dirty = False
+            list.append(port)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'port'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_moduleId is not None:
+                columnMap['moduleId'] = \
+                    self.convertToDB(obj.db_moduleId, 'long', 'int')
+            if obj.db_moduleName is not None:
+                columnMap['moduleName'] = \
+                    self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+            if obj.db_sig is not None:
+                columnMap['sig'] = \
+                    self.convertToDB(obj.db_sig, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'vt_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            vistrailId = self.convertFromDB(row[1], 'long', 'int')
+            
+            log = DBLog(id=id)
+            log.db_vistrailId = vistrailId
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'vt_id']
+        table = 'log_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_workflow_execs.itervalues():
+            child.db_log = obj.db_id
+        for child in obj.db_machines.itervalues():
+            child.db_log = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['id']
+        table = 'log_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'log_id': keyStr}
+            res = self.getDao('workflow_exec').fromSQL(db, None, foreignKey, globalProps)
+            workflow_execs = {}
+            for obj in res:
+                workflow_execs[obj.db_id] = obj
+            
+            foreignKey = {'log_id': keyStr}
+            res = self.getDao('machine').fromSQL(db, None, foreignKey, globalProps)
+            machines = {}
+            for obj in res:
+                machines[obj.db_id] = obj
+            
+            log = DBLog(id=id,
+                        workflow_execs=workflow_execs,
+                        machines=machines)
+            log.is_dirty = False
+            list.append(log)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'log_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'log_id': keyStr}
+        for child in obj.db_workflow_execs.itervalues():
+            self.getDao('workflow_exec').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = {'log_id': keyStr}
+        for child in obj.db_machines.itervalues():
+            self.getDao('machine').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'module_exec_id']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            module_execs = self.convertFromDB(row[8], 'long', 'int')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'module_exec_id']
+        table = 'machine'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_module_exec') and obj.db_module_exec is not None:
+            columnMap['module_exec_id'] = \
+                self.convertToDB(obj.db_module_execs, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_machine_id = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'os', 'architecture', 'processor', 'ram', 'id']
+        table = 'machine'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[4], 'int', 'int')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'machine_id': keyStr}
+            res = self.getDao('module_exec').fromSQL(db, None, foreignKey, globalProps)
+            module_execs = res
+            
+            machine = DBMachine(id=id,
+                                name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                module_execs=module_execs)
+            machine.is_dirty = False
+            list.append(machine)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'machine'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_os is not None:
+                columnMap['os'] = \
+                    self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+            if obj.db_architecture is not None:
+                columnMap['architecture'] = \
+                    self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+            if obj.db_processor is not None:
+                columnMap['processor'] = \
+                    self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+            if obj.db_ram is not None:
+                columnMap['ram'] = \
+                    self.convertToDB(obj.db_ram, 'int', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'machine_id': keyStr}
+        for child in obj.db_module_execs:
+            self.getDao('module_exec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_vistrailId = vistrailId
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'add_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'object_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'add_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[1], 'long', 'int')
+            parentObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjType = self.convertFromDB(row[3], 'str', 'char(16)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            data = None
+            if what == 'module':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'location':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'annotation':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'function':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'connection':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'port':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'parameter':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'portSpec':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'abstractionRef':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('abstractionRef').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'other':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            
+            add = DBAdd(id=id,
+                        what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        data=data)
+            add.is_dirty = False
+            list.append(add)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'add_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_objectId is not None:
+                columnMap['object_id'] = \
+                    self.convertToDB(obj.db_objectId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        child = obj.db_data
+        if child.vtType == 'module':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'location':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'annotation':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'function':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'connection':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'port':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'parameter':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'portSpec':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'abstractionRef':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('abstractionRef').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'other':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'okey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_vistrailId = vistrailId
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['okey', 'value', 'id']
+        table = 'other'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            key = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            other = DBOther(id=id,
+                            key=key,
+                            value=value)
+            other.is_dirty = False
+            list.append(other)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'other'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_key is not None:
+                columnMap['okey'] = \
+                    self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+            if obj.db_value is not None:
+                columnMap['value'] = \
+                    self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'x', 'y', 'parent_type', 'vt_id', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_vistrailId = vistrailId
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'vt_id', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['x', 'y', 'id']
+        table = 'location'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            x = self.convertFromDB(row[0], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            location = DBLocation(id=id,
+                                  x=x,
+                                  y=y)
+            location.is_dirty = False
+            list.append(location)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'location'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_x is not None:
+                columnMap['x'] = \
+                    self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+            if obj.db_y is not None:
+                columnMap['y'] = \
+                    self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'vt_id']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[4], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[5], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[6], 'long', 'int')
+            parent_type = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[8], 'long', 'int')
+            name = self.convertFromDB(row[9], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[10], 'long', 'int')
+            vistrailId = self.convertFromDB(row[11], 'long', 'int')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_vistrailId = vistrailId
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'vt_id']
+        table = 'workflow_exec'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs.itervalues():
+            child.db_workflow_exec = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'id']
+        table = 'workflow_exec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            user = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[3], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[4], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[5], 'long', 'int')
+            parent_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[7], 'long', 'int')
+            name = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[9], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'wf_exec_id': keyStr}
+            res = self.getDao('module_exec').fromSQL(db, None, foreignKey, globalProps)
+            module_execs = {}
+            for obj in res:
+                module_execs[obj.db_id] = obj
+            
+            workflow_exec = DBWorkflowExec(id=id,
+                                           user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           module_execs=module_execs)
+            workflow_exec.is_dirty = False
+            list.append(workflow_exec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'workflow_exec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_user is not None:
+                columnMap['user'] = \
+                    self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+            if obj.db_ip is not None:
+                columnMap['ip'] = \
+                    self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+            if obj.db_vt_version is not None:
+                columnMap['vt_version'] = \
+                    self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+            if obj.db_ts_start is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+            if obj.db_ts_end is not None:
+                columnMap['ts_end'] = \
+                    self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+            if obj.db_parent_id is not None:
+                columnMap['parent_id'] = \
+                    self.convertToDB(obj.db_parent_id, 'long', 'int')
+            if obj.db_parent_type is not None:
+                columnMap['parent_type'] = \
+                    self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+            if obj.db_parent_version is not None:
+                columnMap['parent_version'] = \
+                    self.convertToDB(obj.db_parent_version, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'wf_exec_id': keyStr}
+        for child in obj.db_module_execs.itervalues():
+            self.getDao('module_exec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'pos', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_vistrailId = vistrailId
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['pos', 'name', 'id']
+        table = 'function'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            pos = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('function','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+            parameters = res
+            
+            function = DBFunction(id=id,
+                                  pos=pos,
+                                  name=name,
+                                  parameters=parameters)
+            function.is_dirty = False
+            list.append(function)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'function'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_pos is not None:
+                columnMap['pos'] = \
+                    self.convertToDB(obj.db_pos, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('function','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_parameters:
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'vt_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            
+            abstraction = DBAbstraction(name=name,
+                                        id=id)
+            abstraction.db_vistrail = vistrail
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('vistrail', obj.db_vistrail)]
+        p.db_add_abstraction(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'vt_id']
+        table = 'abstraction'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'abstraction'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('abstraction','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('action').fromSQL(db, None, foreignKey, globalProps)
+            actions = {}
+            for obj in res:
+                actions[obj.db_id] = obj
+            
+            discStr = self.convertToDB('abstraction','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('tag').fromSQL(db, None, foreignKey, globalProps)
+            tags = {}
+            for obj in res:
+                tags[obj.db_id] = obj
+            
+            abstraction = DBAbstraction(id=id,
+                                        name=name,
+                                        actions=actions,
+                                        tags=tags)
+            abstraction.is_dirty = False
+            list.append(abstraction)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'abstraction'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('abstraction','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_actions.itervalues():
+            self.getDao('action').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('abstraction','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_tags.itervalues():
+            self.getDao('tag').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'vt_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrailId = self.convertFromDB(row[2], 'long', 'int')
+            
+            workflow = DBWorkflow(name=name,
+                                  id=id)
+            workflow.db_vistrailId = vistrailId
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'vt_id']
+        table = 'workflow'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_modules.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_connections.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_abstractionRefs.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'workflow'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+            modules = {}
+            for obj in res:
+                modules[obj.db_id] = obj
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+            connections = {}
+            for obj in res:
+                connections[obj.db_id] = obj
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+            others = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('abstractionRef').fromSQL(db, None, foreignKey, globalProps)
+            abstractionRefs = {}
+            for obj in res:
+                abstractionRefs[obj.db_id] = obj
+            
+            workflow = DBWorkflow(id=id,
+                                  name=name,
+                                  modules=modules,
+                                  connections=connections,
+                                  annotations=annotations,
+                                  others=others,
+                                  abstractionRefs=abstractionRefs)
+            workflow.is_dirty = False
+            list.append(workflow)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'workflow'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_modules.itervalues():
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_connections.itervalues():
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_others:
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_abstractionRefs.itervalues():
+            self.getDao('abstractionRef').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAbstractionRefSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'abstraction_id', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            abstraction_id = self.convertFromDB(row[1], 'long', 'int')
+            version = self.convertFromDB(row[2], 'long', 'int')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            abstractionRef = DBAbstractionRef(abstraction_id=abstraction_id,
+                                              version=version,
+                                              id=id)
+            abstractionRef.db_parentType = parentType
+            abstractionRef.db_vistrailId = vistrailId
+            abstractionRef.db_parent = parent
+            abstractionRef.is_dirty = False
+            res[('abstractionRef', id)] = abstractionRef
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_abstractionRef(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'abstraction_id', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['abstraction_id', 'version', 'id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            abstraction_id = self.convertFromDB(row[0], 'long', 'int')
+            version = self.convertFromDB(row[1], 'long', 'int')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            abstractionRef = DBAbstractionRef(id=id,
+                                              abstraction_id=abstraction_id,
+                                              version=version)
+            abstractionRef.is_dirty = False
+            list.append(abstractionRef)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'abstraction_ref'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_abstraction_id is not None:
+                columnMap['abstraction_id'] = \
+                    self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'long', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'akey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_vistrailId = vistrailId
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['akey', 'value', 'id']
+        table = 'annotation'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            key = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            annotation = DBAnnotation(id=id,
+                                      key=key,
+                                      value=value)
+            annotation.is_dirty = False
+            list.append(annotation)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'annotation'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_key is not None:
+                columnMap['akey'] = \
+                    self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+            if obj.db_value is not None:
+                columnMap['value'] = \
+                    self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_vistrailId = vistrailId
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'change_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'change_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[1], 'long', 'int')
+            newObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            data = None
+            if what == 'module':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'location':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'annotation':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'function':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'connection':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'port':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'parameter':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'portSpec':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'abstractionRef':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('abstractionRef').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'other':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            
+            change = DBChange(id=id,
+                              what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              data=data)
+            change.is_dirty = False
+            list.append(change)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'change_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_oldObjId is not None:
+                columnMap['old_obj_id'] = \
+                    self.convertToDB(obj.db_oldObjId, 'long', 'int')
+            if obj.db_newObjId is not None:
+                columnMap['new_obj_id'] = \
+                    self.convertToDB(obj.db_newObjId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        child = obj.db_data
+        if child.vtType == 'module':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'location':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'annotation':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'function':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'connection':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'port':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'parameter':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'portSpec':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'abstractionRef':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('abstractionRef').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'other':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'vt_id', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_vistrailId = vistrailId
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'vt_id', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['pos', 'name', 'type', 'val', 'alias', 'id']
+        table = 'parameter'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            pos = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[3], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            parameter = DBParameter(id=id,
+                                    pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias)
+            parameter.is_dirty = False
+            list.append(parameter)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'parameter'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_pos is not None:
+                columnMap['pos'] = \
+                    self.convertToDB(obj.db_pos, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_val is not None:
+                columnMap['val'] = \
+                    self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+            if obj.db_alias is not None:
+                columnMap['alias'] = \
+                    self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'parent_type', 'vt_id', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[2], 'long', 'int')
+            parent = self.convertFromDB(row[3], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_vistrailId = vistrailId
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'vt_id', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['id']
+        table = 'connection_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('connection','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+            ports = res
+            
+            connection = DBConnection(id=id,
+                                      ports=ports)
+            connection.is_dirty = False
+            list.append(connection)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'connection_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('connection','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_ports:
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'prev_id', 'date', 'user', 'parent_type', 'vt_id', 'parent_id']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            user = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[5], 'long', 'int')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              user=user,
+                              id=id)
+            action.db_parentType = parentType
+            action.db_vistrailId = vistrailId
+            action.db_parent = parent
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_action(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'user', 'parent_type', 'vt_id', 'parent_id']
+        table = 'action'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['prev_id', 'date', 'user', 'id']
+        table = 'action'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            prevId = self.convertFromDB(row[0], 'long', 'int')
+            date = self.convertFromDB(row[1], 'datetime', 'datetime')
+            user = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[3], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('action','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = {}
+            for obj in res:
+                annotations[obj.db_id] = obj
+            
+            operations = []
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('add').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('delete').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('change').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            action = DBAction(id=id,
+                              prevId=prevId,
+                              date=date,
+                              user=user,
+                              annotations=annotations,
+                              operations=operations)
+            action.is_dirty = False
+            list.append(action)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'action'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_prevId is not None:
+                columnMap['prev_id'] = \
+                    self.convertToDB(obj.db_prevId, 'long', 'int')
+            if obj.db_date is not None:
+                columnMap['date'] = \
+                    self.convertToDB(obj.db_date, 'datetime', 'datetime')
+            if obj.db_user is not None:
+                columnMap['user'] = \
+                    self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('action','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations.itervalues():
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        for child in obj.db_operations:
+            if child.vtType == 'add':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('add').toSQL(db, child, foreignKey, globalProps)
+            elif child.vtType == 'delete':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('delete').toSQL(db, child, foreignKey, globalProps)
+            elif child.vtType == 'change':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('change').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_vistrailId = vistrailId
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'delete_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'object_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'delete_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[1], 'long', 'int')
+            parentObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjType = self.convertFromDB(row[3], 'str', 'char(16)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            delete = DBDelete(id=id,
+                              what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType)
+            delete.is_dirty = False
+            list.append(delete)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'delete_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_objectId is not None:
+                columnMap['object_id'] = \
+                    self.convertToDB(obj.db_objectId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'version', 'name']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['vt_id'] = self.convertToDB(id, 'long', 'int')
+            version = self.convertFromDB(row[1], 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            
+            vistrail = DBVistrail(version=version,
+                                  name=name,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'version', 'name']
+        table = 'vistrail'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        global_props['vt_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags.itervalues():
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_abstractions.itervalues():
+            child.db_vistrail = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['version', 'name', 'id']
+        table = 'vistrail'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            version = self.convertFromDB(row[0], 'str', 'char(16)')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            if globalProps is None:
+                globalProps = {}
+            globalProps['vt_id'] = self.convertToDB(id, 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('vistrail','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('action').fromSQL(db, None, foreignKey, globalProps)
+            actions = {}
+            for obj in res:
+                actions[obj.db_id] = obj
+            
+            discStr = self.convertToDB('vistrail','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('tag').fromSQL(db, None, foreignKey, globalProps)
+            tags = {}
+            for obj in res:
+                tags[obj.db_id] = obj
+            
+            foreignKey = {'vt_id': keyStr}
+            res = self.getDao('abstraction').fromSQL(db, None, foreignKey, globalProps)
+            abstractions = {}
+            for obj in res:
+                abstractions[obj.db_id] = obj
+            
+            vistrail = DBVistrail(id=id,
+                                  version=version,
+                                  name=name,
+                                  actions=actions,
+                                  tags=tags,
+                                  abstractions=abstractions)
+            vistrail.is_dirty = False
+            list.append(vistrail)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'vistrail'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'str', 'char(16)')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                if obj.db_id is not None:
+                    columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+            if obj.db_id is None:
+                obj.db_id = lastId
+                keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            if globalProps is None:
+                globalProps = {}
+            globalProps['vt_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+
+        discStr = self.convertToDB('vistrail','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_actions.itervalues():
+            self.getDao('action').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('vistrail','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_tags.itervalues():
+            self.getDao('tag').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = {'vt_id': keyStr}
+        for child in obj.db_abstractions.itervalues():
+            self.getDao('abstraction').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'ts_start', 'ts_end', 'module_id', 'module_name', 'machine_id', 'wf_exec_id', 'vt_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            module_id = self.convertFromDB(row[3], 'long', 'int')
+            module_name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            machine_id = self.convertFromDB(row[5], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[6], 'long', 'int')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       id=id)
+            module_exec.db_machine_id = machine_id
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_vistrailId = vistrailId
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('machine', obj.db_machine_id)]
+        p.db_add_module_exec(obj)
+        p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+        p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'module_id', 'module_name', 'machine_id', 'wf_exec_id', 'vt_id']
+        table = 'module_exec'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['ts_start', 'ts_end', 'module_id', 'module_name', 'id']
+        table = 'module_exec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            ts_start = self.convertFromDB(row[0], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[1], 'datetime', 'datetime')
+            module_id = self.convertFromDB(row[2], 'long', 'int')
+            module_name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('module_exec','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            module_exec = DBModuleExec(id=id,
+                                       ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       annotations=annotations)
+            module_exec.is_dirty = False
+            list.append(module_exec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'module_exec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_ts_start is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+            if obj.db_ts_end is not None:
+                columnMap['ts_end'] = \
+                    self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+            if obj.db_module_id is not None:
+                columnMap['module_id'] = \
+                    self.convertToDB(obj.db_module_id, 'long', 'int')
+            if obj.db_module_name is not None:
+                columnMap['module_name'] = \
+                    self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('module_exec','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_6_0/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_6_0/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..7f92a24
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/sql/sql_dao.py
@@ -0,0 +1,141 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return "'" + str(value).replace("'", "''") + "'"
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return "'" + value.isoformat() + "'"
+            elif type == 'datetime':
+                return "'" + value.strftime('%Y-%m-%d %H:%M:%S') + "'"
+            else:
+                return str(value)
+
+        return "''"
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        return dbCommand
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        valueStr = ', '.join(values)
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s)""" % \
+                    (table, columnStr, valueStr)
+        return dbCommand
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            setStr += '%s %s = %s' % (comma, column, value)
+            comma = ','
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """UPDATE %s SET %s WHERE %s""" % \
+                    (table, setStr, whereStr)
+        return dbCommand
+
+    def executeSQL(self, db, dbCommand, isFetch):
+        print 'db: %s' % dbCommand
+        data = None
+        cursor = db.cursor()
+        cursor.execute(dbCommand)
+        if isFetch:
+            data = cursor.fetchall()
+        else:
+            data = cursor.lastrowid
+        cursor.close()
+        return data
diff --git a/vistrails/db/versions/v0_6_0/persistence/xml/__init__.py b/vistrails/db/versions/v0_6_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_6_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_6_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..78e1469
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/xml/auto_gen.py
@@ -0,0 +1,1749 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_6_0.domain import *
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'portSpec':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        spec = self.convertFromStr(self.getAttribute(node, 'spec'), 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, doc, node):
+        if node is None:
+            node = doc.createElement('portSpec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.setAttribute('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.setAttribute('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'module':
+            return None
+        
+        functions = []
+        
+        annotations = {}
+        portSpecs = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        cache = self.convertFromStr(self.getAttribute(node, 'cache'), 'int')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        package = self.convertFromStr(self.getAttribute(node, 'package'), 'str')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'str')
+        
+        location = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'location':
+                location = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'function':
+                function = self.getDao('function').fromXML(child)
+                functions.append(function)
+            elif child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations[annotation.db_id] = annotation
+            elif child.nodeName == 'portSpec':
+                portSpec = self.getDao('portSpec').fromXML(child)
+                portSpecs[portSpec.db_id] = portSpec
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       package=package,
+                       version=version,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, doc, node):
+        if node is None:
+            node = doc.createElement('module')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(module.db_id, 'long'))
+        node.setAttribute('cache',self.convertToStr(module.db_cache, 'int'))
+        node.setAttribute('name',self.convertToStr(module.db_name, 'str'))
+        node.setAttribute('package',self.convertToStr(module.db_package, 'str'))
+        node.setAttribute('version',self.convertToStr(module.db_version, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            if nodeMap.has_key(('location', location.db_id)):
+                childNode = nodeMap[('location', location.db_id)]
+                del nodeMap[('location', location.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(location, doc, childNode)
+        functions = module.db_functions
+        for function in functions:
+            if nodeMap.has_key(('function', function.db_id)):
+                childNode = nodeMap[('function', function.db_id)]
+                del nodeMap[('function', function.db_id)]
+            else:
+                childNode = doc.createElement('function')
+                node.appendChild(childNode)
+            self.getDao('function').toXML(function, doc, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations.itervalues():
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs.itervalues():
+            if nodeMap.has_key(('portSpec', portSpec.db_id)):
+                childNode = nodeMap[('portSpec', portSpec.db_id)]
+                del nodeMap[('portSpec', portSpec.db_id)]
+            else:
+                childNode = doc.createElement('portSpec')
+                node.appendChild(childNode)
+            self.getDao('portSpec').toXML(portSpec, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'tag':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, doc, node):
+        if node is None:
+            node = doc.createElement('tag')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(tag.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'port':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        moduleName = self.convertFromStr(self.getAttribute(node, 'moduleName'), 'str')
+        sig = self.convertFromStr(self.getAttribute(node, 'sig'), 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     sig=sig)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, doc, node):
+        if node is None:
+            node = doc.createElement('port')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(port.db_id, 'long'))
+        node.setAttribute('type',self.convertToStr(port.db_type, 'str'))
+        node.setAttribute('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.setAttribute('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.setAttribute('sig',self.convertToStr(port.db_sig, 'str'))
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'log':
+            return None
+        
+        workflow_execs = {}
+        machines = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'workflowExec':
+                workflow_exec = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs[workflow_exec.db_id] = workflow_exec
+            elif child.nodeName == 'machine':
+                machine = self.getDao('machine').fromXML(child)
+                machines[machine.db_id] = machine
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBLog(id=id,
+                    workflow_execs=workflow_execs,
+                    machines=machines)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, doc, node):
+        if node is None:
+            node = doc.createElement('log')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(log.db_id, 'long'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs.itervalues():
+            if nodeMap.has_key(('workflow_exec', workflow_exec.db_id)):
+                childNode = nodeMap[('workflow_exec', workflow_exec.db_id)]
+                del nodeMap[('workflow_exec', workflow_exec.db_id)]
+            else:
+                childNode = doc.createElement('workflow_exec')
+                node.appendChild(childNode)
+            self.getDao('workflow_exec').toXML(workflow_exec, doc, childNode)
+        machines = log.db_machines
+        for machine in machines.itervalues():
+            if nodeMap.has_key(('machine', machine.db_id)):
+                childNode = nodeMap[('machine', machine.db_id)]
+                del nodeMap[('machine', machine.db_id)]
+            else:
+                childNode = doc.createElement('machine')
+                node.appendChild(childNode)
+            self.getDao('machine').toXML(machine, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'machine':
+            return None
+        
+        module_execs = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        os = self.convertFromStr(self.getAttribute(node, 'os'), 'str')
+        architecture = self.convertFromStr(self.getAttribute(node, 'architecture'), 'str')
+        processor = self.convertFromStr(self.getAttribute(node, 'processor'), 'str')
+        ram = self.convertFromStr(self.getAttribute(node, 'ram'), 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram,
+                        module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, doc, node):
+        if node is None:
+            node = doc.createElement('machine')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(machine.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(machine.db_name, 'str'))
+        node.setAttribute('os',self.convertToStr(machine.db_os, 'str'))
+        node.setAttribute('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.setAttribute('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.setAttribute('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'add':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        objectId = self.convertFromStr(self.getAttribute(node, 'objectId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        data = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'module':
+                data = self.getDao('module').fromXML(child)
+            elif child.nodeName == 'location':
+                data = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'annotation':
+                data = self.getDao('annotation').fromXML(child)
+            elif child.nodeName == 'function':
+                data = self.getDao('function').fromXML(child)
+            elif child.nodeName == 'connection':
+                data = self.getDao('connection').fromXML(child)
+            elif child.nodeName == 'port':
+                data = self.getDao('port').fromXML(child)
+            elif child.nodeName == 'parameter':
+                data = self.getDao('parameter').fromXML(child)
+            elif child.nodeName == 'portSpec':
+                data = self.getDao('portSpec').fromXML(child)
+            elif child.nodeName == 'abstractionRef':
+                data = self.getDao('abstractionRef').fromXML(child)
+            elif child.nodeName == 'other':
+                data = self.getDao('other').fromXML(child)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAdd(id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType,
+                    data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, doc, node):
+        if node is None:
+            node = doc.createElement('add')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(add.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(add.db_what, 'str'))
+        node.setAttribute('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        data = add.db_data
+        if data.vtType == 'module':
+            if nodeMap.has_key(('module', data.db_id)):
+                childNode = nodeMap[('module', data.db_id)]
+                del nodeMap[('module', data.db_id)]
+            else:
+                childNode = doc.createElement('module')
+                node.appendChild(childNode)
+            self.getDao('module').toXML(data, doc, childNode)
+        elif data.vtType == 'location':
+            if nodeMap.has_key(('location', data.db_id)):
+                childNode = nodeMap[('location', data.db_id)]
+                del nodeMap[('location', data.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(data, doc, childNode)
+        elif data.vtType == 'annotation':
+            if nodeMap.has_key(('annotation', data.db_id)):
+                childNode = nodeMap[('annotation', data.db_id)]
+                del nodeMap[('annotation', data.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(data, doc, childNode)
+        elif data.vtType == 'function':
+            if nodeMap.has_key(('function', data.db_id)):
+                childNode = nodeMap[('function', data.db_id)]
+                del nodeMap[('function', data.db_id)]
+            else:
+                childNode = doc.createElement('function')
+                node.appendChild(childNode)
+            self.getDao('function').toXML(data, doc, childNode)
+        elif data.vtType == 'connection':
+            if nodeMap.has_key(('connection', data.db_id)):
+                childNode = nodeMap[('connection', data.db_id)]
+                del nodeMap[('connection', data.db_id)]
+            else:
+                childNode = doc.createElement('connection')
+                node.appendChild(childNode)
+            self.getDao('connection').toXML(data, doc, childNode)
+        elif data.vtType == 'port':
+            if nodeMap.has_key(('port', data.db_id)):
+                childNode = nodeMap[('port', data.db_id)]
+                del nodeMap[('port', data.db_id)]
+            else:
+                childNode = doc.createElement('port')
+                node.appendChild(childNode)
+            self.getDao('port').toXML(data, doc, childNode)
+        elif data.vtType == 'parameter':
+            if nodeMap.has_key(('parameter', data.db_id)):
+                childNode = nodeMap[('parameter', data.db_id)]
+                del nodeMap[('parameter', data.db_id)]
+            else:
+                childNode = doc.createElement('parameter')
+                node.appendChild(childNode)
+            self.getDao('parameter').toXML(data, doc, childNode)
+        elif data.vtType == 'portSpec':
+            if nodeMap.has_key(('portSpec', data.db_id)):
+                childNode = nodeMap[('portSpec', data.db_id)]
+                del nodeMap[('portSpec', data.db_id)]
+            else:
+                childNode = doc.createElement('portSpec')
+                node.appendChild(childNode)
+            self.getDao('portSpec').toXML(data, doc, childNode)
+        elif data.vtType == 'abstractionRef':
+            if nodeMap.has_key(('abstractionRef', data.db_id)):
+                childNode = nodeMap[('abstractionRef', data.db_id)]
+                del nodeMap[('abstractionRef', data.db_id)]
+            else:
+                childNode = doc.createElement('abstractionRef')
+                node.appendChild(childNode)
+            self.getDao('abstractionRef').toXML(data, doc, childNode)
+        elif data.vtType == 'other':
+            if nodeMap.has_key(('other', data.db_id)):
+                childNode = nodeMap[('other', data.db_id)]
+                del nodeMap[('other', data.db_id)]
+            else:
+                childNode = doc.createElement('other')
+                node.appendChild(childNode)
+            self.getDao('other').toXML(data, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'other':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        
+        value = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'value':
+                value = self.convertFromStr(child.firstChild.nodeValue,'str')
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, doc, node):
+        if node is None:
+            node = doc.createElement('other')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(other.db_id, 'long'))
+        node.setAttribute('key',self.convertToStr(other.db_key, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        if other.db_value is not None:
+            child = other.db_value
+            if nodeMap.has_key(('value',child.db_id)):
+                childNode = nodeMap[('value',child.db_id)]
+                del nodeMap[('value', child.db_id)]
+                textNode = childNode.firstChild
+                textNode.replaceWholeText(self.convertToStr(child, 'str'))
+            else:
+                childNode = doc.createElement('value')
+                node.appendChild(childNode)
+                textNode = doc.createTextNode(self.convertToStr(child, 'str'))
+                childNode.appendChild(textNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'location':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        x = self.convertFromStr(self.getAttribute(node, 'x'), 'float')
+        y = self.convertFromStr(self.getAttribute(node, 'y'), 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, doc, node):
+        if node is None:
+            node = doc.createElement('location')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(location.db_id, 'long'))
+        node.setAttribute('x',self.convertToStr(location.db_x, 'float'))
+        node.setAttribute('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'workflowExec':
+            return None
+        
+        module_execs = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        ip = self.convertFromStr(self.getAttribute(node, 'ip'), 'str')
+        vt_version = self.convertFromStr(self.getAttribute(node, 'vtVersion'), 'str')
+        ts_start = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        ts_end = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        parent_id = self.convertFromStr(self.getAttribute(node, 'parentId'), 'long')
+        parent_type = self.convertFromStr(self.getAttribute(node, 'parentType'), 'str')
+        parent_version = self.convertFromStr(self.getAttribute(node, 'parentVersion'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'moduleExec':
+                module_exec = self.getDao('module_exec').fromXML(child)
+                module_execs[module_exec.db_id] = module_exec
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, doc, node):
+        if node is None:
+            node = doc.createElement('workflowExec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.setAttribute('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.setAttribute('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.setAttribute('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.setAttribute('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.setAttribute('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.setAttribute('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.setAttribute('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.setAttribute('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs.itervalues():
+            if nodeMap.has_key(('module_exec', module_exec.db_id)):
+                childNode = nodeMap[('module_exec', module_exec.db_id)]
+                del nodeMap[('module_exec', module_exec.db_id)]
+            else:
+                childNode = doc.createElement('module_exec')
+                node.appendChild(childNode)
+            self.getDao('module_exec').toXML(module_exec, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'function':
+            return None
+        
+        parameters = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        pos = self.convertFromStr(self.getAttribute(node, 'pos'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'parameter':
+                parameter = self.getDao('parameter').fromXML(child)
+                parameters.append(parameter)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, doc, node):
+        if node is None:
+            node = doc.createElement('function')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(function.db_id, 'long'))
+        node.setAttribute('pos',self.convertToStr(function.db_pos, 'long'))
+        node.setAttribute('name',self.convertToStr(function.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            if nodeMap.has_key(('parameter', parameter.db_id)):
+                childNode = nodeMap[('parameter', parameter.db_id)]
+                del nodeMap[('parameter', parameter.db_id)]
+            else:
+                childNode = doc.createElement('parameter')
+                node.appendChild(childNode)
+            self.getDao('parameter').toXML(parameter, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'abstraction':
+            return None
+        
+        actions = {}
+        tags = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions[action.db_id] = action
+            elif child.nodeName == 'tag':
+                tag = self.getDao('tag').fromXML(child)
+                tags[tag.db_id] = tag
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAbstraction(id=id,
+                            name=name,
+                            actions=actions,
+                            tags=tags)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, doc, node):
+        if node is None:
+            node = doc.createElement('abstraction')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(abstraction.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        actions = abstraction.db_actions
+        for action in actions.itervalues():
+            if nodeMap.has_key(('action', action.db_id)):
+                childNode = nodeMap[('action', action.db_id)]
+                del nodeMap[('action', action.db_id)]
+            else:
+                childNode = doc.createElement('action')
+                node.appendChild(childNode)
+            self.getDao('action').toXML(action, doc, childNode)
+        tags = abstraction.db_tags
+        for tag in tags.itervalues():
+            if nodeMap.has_key(('tag', tag.db_id)):
+                childNode = nodeMap[('tag', tag.db_id)]
+                del nodeMap[('tag', tag.db_id)]
+            else:
+                childNode = doc.createElement('tag')
+                node.appendChild(childNode)
+            self.getDao('tag').toXML(tag, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'workflow':
+            return None
+        
+        annotations = []
+        others = []
+        
+        modules = {}
+        connections = {}
+        abstractionRefs = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'module':
+                module = self.getDao('module').fromXML(child)
+                modules[module.db_id] = module
+            elif child.nodeName == 'connection':
+                connection = self.getDao('connection').fromXML(child)
+                connections[connection.db_id] = connection
+            elif child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeName == 'other':
+                other = self.getDao('other').fromXML(child)
+                others.append(other)
+            elif child.nodeName == 'abstractionRef':
+                abstractionRef = self.getDao('abstractionRef').fromXML(child)
+                abstractionRefs[abstractionRef.db_id] = abstractionRef
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBWorkflow(id=id,
+                         name=name,
+                         modules=modules,
+                         connections=connections,
+                         annotations=annotations,
+                         others=others,
+                         abstractionRefs=abstractionRefs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, doc, node):
+        if node is None:
+            node = doc.createElement('workflow')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(workflow.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(workflow.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        modules = workflow.db_modules
+        for module in modules.itervalues():
+            if nodeMap.has_key(('module', module.db_id)):
+                childNode = nodeMap[('module', module.db_id)]
+                del nodeMap[('module', module.db_id)]
+            else:
+                childNode = doc.createElement('module')
+                node.appendChild(childNode)
+            self.getDao('module').toXML(module, doc, childNode)
+        connections = workflow.db_connections
+        for connection in connections.itervalues():
+            if nodeMap.has_key(('connection', connection.db_id)):
+                childNode = nodeMap[('connection', connection.db_id)]
+                del nodeMap[('connection', connection.db_id)]
+            else:
+                childNode = doc.createElement('connection')
+                node.appendChild(childNode)
+            self.getDao('connection').toXML(connection, doc, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        others = workflow.db_others
+        for other in others:
+            if nodeMap.has_key(('other', other.db_id)):
+                childNode = nodeMap[('other', other.db_id)]
+                del nodeMap[('other', other.db_id)]
+            else:
+                childNode = doc.createElement('other')
+                node.appendChild(childNode)
+            self.getDao('other').toXML(other, doc, childNode)
+        abstractionRefs = workflow.db_abstractionRefs
+        for abstractionRef in abstractionRefs.itervalues():
+            if nodeMap.has_key(('abstractionRef', abstractionRef.db_id)):
+                childNode = nodeMap[('abstractionRef', abstractionRef.db_id)]
+                del nodeMap[('abstractionRef', abstractionRef.db_id)]
+            else:
+                childNode = doc.createElement('abstractionRef')
+                node.appendChild(childNode)
+            self.getDao('abstractionRef').toXML(abstractionRef, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBAbstractionRefXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'abstractionRef':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        abstraction_id = self.convertFromStr(self.getAttribute(node, 'abstractionId'), 'long')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'long')
+        
+        obj = DBAbstractionRef(id=id,
+                               abstraction_id=abstraction_id,
+                               version=version)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstractionRef, doc, node):
+        if node is None:
+            node = doc.createElement('abstractionRef')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(abstractionRef.db_id, 'long'))
+        node.setAttribute('abstractionId',self.convertToStr(abstractionRef.db_abstraction_id, 'long'))
+        node.setAttribute('version',self.convertToStr(abstractionRef.db_version, 'long'))
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'annotation':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        value = self.convertFromStr(self.getAttribute(node, 'value'), 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, doc, node):
+        if node is None:
+            node = doc.createElement('annotation')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(annotation.db_id, 'long'))
+        node.setAttribute('key',self.convertToStr(annotation.db_key, 'str'))
+        node.setAttribute('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'change':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        oldObjId = self.convertFromStr(self.getAttribute(node, 'oldObjId'), 'long')
+        newObjId = self.convertFromStr(self.getAttribute(node, 'newObjId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        data = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'module':
+                data = self.getDao('module').fromXML(child)
+            elif child.nodeName == 'location':
+                data = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'annotation':
+                data = self.getDao('annotation').fromXML(child)
+            elif child.nodeName == 'function':
+                data = self.getDao('function').fromXML(child)
+            elif child.nodeName == 'connection':
+                data = self.getDao('connection').fromXML(child)
+            elif child.nodeName == 'port':
+                data = self.getDao('port').fromXML(child)
+            elif child.nodeName == 'parameter':
+                data = self.getDao('parameter').fromXML(child)
+            elif child.nodeName == 'portSpec':
+                data = self.getDao('portSpec').fromXML(child)
+            elif child.nodeName == 'abstractionRef':
+                data = self.getDao('abstractionRef').fromXML(child)
+            elif child.nodeName == 'other':
+                data = self.getDao('other').fromXML(child)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBChange(id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType,
+                       data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, doc, node):
+        if node is None:
+            node = doc.createElement('change')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(change.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(change.db_what, 'str'))
+        node.setAttribute('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.setAttribute('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        data = change.db_data
+        if data.vtType == 'module':
+            if nodeMap.has_key(('module', data.db_id)):
+                childNode = nodeMap[('module', data.db_id)]
+                del nodeMap[('module', data.db_id)]
+            else:
+                childNode = doc.createElement('module')
+                node.appendChild(childNode)
+            self.getDao('module').toXML(data, doc, childNode)
+        elif data.vtType == 'location':
+            if nodeMap.has_key(('location', data.db_id)):
+                childNode = nodeMap[('location', data.db_id)]
+                del nodeMap[('location', data.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(data, doc, childNode)
+        elif data.vtType == 'annotation':
+            if nodeMap.has_key(('annotation', data.db_id)):
+                childNode = nodeMap[('annotation', data.db_id)]
+                del nodeMap[('annotation', data.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(data, doc, childNode)
+        elif data.vtType == 'function':
+            if nodeMap.has_key(('function', data.db_id)):
+                childNode = nodeMap[('function', data.db_id)]
+                del nodeMap[('function', data.db_id)]
+            else:
+                childNode = doc.createElement('function')
+                node.appendChild(childNode)
+            self.getDao('function').toXML(data, doc, childNode)
+        elif data.vtType == 'connection':
+            if nodeMap.has_key(('connection', data.db_id)):
+                childNode = nodeMap[('connection', data.db_id)]
+                del nodeMap[('connection', data.db_id)]
+            else:
+                childNode = doc.createElement('connection')
+                node.appendChild(childNode)
+            self.getDao('connection').toXML(data, doc, childNode)
+        elif data.vtType == 'port':
+            if nodeMap.has_key(('port', data.db_id)):
+                childNode = nodeMap[('port', data.db_id)]
+                del nodeMap[('port', data.db_id)]
+            else:
+                childNode = doc.createElement('port')
+                node.appendChild(childNode)
+            self.getDao('port').toXML(data, doc, childNode)
+        elif data.vtType == 'parameter':
+            if nodeMap.has_key(('parameter', data.db_id)):
+                childNode = nodeMap[('parameter', data.db_id)]
+                del nodeMap[('parameter', data.db_id)]
+            else:
+                childNode = doc.createElement('parameter')
+                node.appendChild(childNode)
+            self.getDao('parameter').toXML(data, doc, childNode)
+        elif data.vtType == 'portSpec':
+            if nodeMap.has_key(('portSpec', data.db_id)):
+                childNode = nodeMap[('portSpec', data.db_id)]
+                del nodeMap[('portSpec', data.db_id)]
+            else:
+                childNode = doc.createElement('portSpec')
+                node.appendChild(childNode)
+            self.getDao('portSpec').toXML(data, doc, childNode)
+        elif data.vtType == 'abstractionRef':
+            if nodeMap.has_key(('abstractionRef', data.db_id)):
+                childNode = nodeMap[('abstractionRef', data.db_id)]
+                del nodeMap[('abstractionRef', data.db_id)]
+            else:
+                childNode = doc.createElement('abstractionRef')
+                node.appendChild(childNode)
+            self.getDao('abstractionRef').toXML(data, doc, childNode)
+        elif data.vtType == 'other':
+            if nodeMap.has_key(('other', data.db_id)):
+                childNode = nodeMap[('other', data.db_id)]
+                del nodeMap[('other', data.db_id)]
+            else:
+                childNode = doc.createElement('other')
+                node.appendChild(childNode)
+            self.getDao('other').toXML(data, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'parameter':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        pos = self.convertFromStr(self.getAttribute(node, 'pos'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        val = self.convertFromStr(self.getAttribute(node, 'val'), 'str')
+        alias = self.convertFromStr(self.getAttribute(node, 'alias'), 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, doc, node):
+        if node is None:
+            node = doc.createElement('parameter')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(parameter.db_id, 'long'))
+        node.setAttribute('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.setAttribute('name',self.convertToStr(parameter.db_name, 'str'))
+        node.setAttribute('type',self.convertToStr(parameter.db_type, 'str'))
+        node.setAttribute('val',self.convertToStr(parameter.db_val, 'str'))
+        node.setAttribute('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'connection':
+            return None
+        
+        ports = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'port':
+                port = self.getDao('port').fromXML(child)
+                ports.append(port)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, doc, node):
+        if node is None:
+            node = doc.createElement('connection')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            if nodeMap.has_key(('port', port.db_id)):
+                childNode = nodeMap[('port', port.db_id)]
+                del nodeMap[('port', port.db_id)]
+            else:
+                childNode = doc.createElement('port')
+                node.appendChild(childNode)
+            self.getDao('port').toXML(port, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'action':
+            return None
+        
+        operations = []
+        
+        annotations = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        prevId = self.convertFromStr(self.getAttribute(node, 'prevId'), 'long')
+        date = self.convertFromStr(self.getAttribute(node, 'date'), 'datetime')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations[annotation.db_id] = annotation
+            elif child.nodeName == 'add':
+                operation = self.getDao('add').fromXML(child)
+                operations.append(operation)
+            elif child.nodeName == 'delete':
+                operation = self.getDao('delete').fromXML(child)
+                operations.append(operation)
+            elif child.nodeName == 'change':
+                operation = self.getDao('change').fromXML(child)
+                operations.append(operation)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAction(id=id,
+                       prevId=prevId,
+                       date=date,
+                       user=user,
+                       annotations=annotations,
+                       operations=operations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, doc, node):
+        if node is None:
+            node = doc.createElement('action')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(action.db_id, 'long'))
+        node.setAttribute('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.setAttribute('date',self.convertToStr(action.db_date, 'datetime'))
+        node.setAttribute('user',self.convertToStr(action.db_user, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations.itervalues():
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                if nodeMap.has_key(('add', operation.db_id)):
+                    childNode = nodeMap[('add', operation.db_id)]
+                    del nodeMap[('add', operation.db_id)]
+                else:
+                    childNode = doc.createElement('add')
+                    node.appendChild(childNode)
+                self.getDao('add').toXML(operation, doc, childNode)
+            elif operation.vtType == 'delete':
+                if nodeMap.has_key(('delete', operation.db_id)):
+                    childNode = nodeMap[('delete', operation.db_id)]
+                    del nodeMap[('delete', operation.db_id)]
+                else:
+                    childNode = doc.createElement('delete')
+                    node.appendChild(childNode)
+                self.getDao('delete').toXML(operation, doc, childNode)
+            elif operation.vtType == 'change':
+                if nodeMap.has_key(('change', operation.db_id)):
+                    childNode = nodeMap[('change', operation.db_id)]
+                    del nodeMap[('change', operation.db_id)]
+                else:
+                    childNode = doc.createElement('change')
+                    node.appendChild(childNode)
+                self.getDao('change').toXML(operation, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'delete':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        objectId = self.convertFromStr(self.getAttribute(node, 'objectId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, doc, node):
+        if node is None:
+            node = doc.createElement('delete')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(delete.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(delete.db_what, 'str'))
+        node.setAttribute('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'vistrail':
+            return None
+        
+        actions = {}
+        tags = {}
+        abstractions = {}
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'str')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        dbHost = self.convertFromStr(self.getAttribute(node, 'dbHost'), 'str')
+        dbPort = self.convertFromStr(self.getAttribute(node, 'dbPort'), 'int')
+        dbName = self.convertFromStr(self.getAttribute(node, 'dbName'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions[action.db_id] = action
+            elif child.nodeName == 'tag':
+                tag = self.getDao('tag').fromXML(child)
+                tags[tag.db_id] = tag
+            elif child.nodeName == 'abstraction':
+                abstraction = self.getDao('abstraction').fromXML(child)
+                abstractions[abstraction.db_id] = abstraction
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         dbHost=dbHost,
+                         dbPort=dbPort,
+                         dbName=dbName,
+                         actions=actions,
+                         tags=tags,
+                         abstractions=abstractions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, doc, node):
+        if node is None:
+            node = doc.createElement('vistrail')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.setAttribute('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.setAttribute('name',self.convertToStr(vistrail.db_name, 'str'))
+        node.setAttribute('dbHost',self.convertToStr(vistrail.db_dbHost, 'str'))
+        node.setAttribute('dbPort',self.convertToStr(vistrail.db_dbPort, 'int'))
+        node.setAttribute('dbName',self.convertToStr(vistrail.db_dbName, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions.itervalues():
+            if nodeMap.has_key(('action', action.db_id)):
+                childNode = nodeMap[('action', action.db_id)]
+                del nodeMap[('action', action.db_id)]
+            else:
+                childNode = doc.createElement('action')
+                node.appendChild(childNode)
+            self.getDao('action').toXML(action, doc, childNode)
+        tags = vistrail.db_tags
+        for tag in tags.itervalues():
+            if nodeMap.has_key(('tag', tag.db_id)):
+                childNode = nodeMap[('tag', tag.db_id)]
+                del nodeMap[('tag', tag.db_id)]
+            else:
+                childNode = doc.createElement('tag')
+                node.appendChild(childNode)
+            self.getDao('tag').toXML(tag, doc, childNode)
+        abstractions = vistrail.db_abstractions
+        for abstraction in abstractions.itervalues():
+            if nodeMap.has_key(('abstraction', abstraction.db_id)):
+                childNode = nodeMap[('abstraction', abstraction.db_id)]
+                del nodeMap[('abstraction', abstraction.db_id)]
+            else:
+                childNode = doc.createElement('abstraction')
+                node.appendChild(childNode)
+            self.getDao('abstraction').toXML(abstraction, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'moduleExec':
+            return None
+        
+        annotations = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        ts_start = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        ts_end = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        module_id = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        module_name = self.convertFromStr(self.getAttribute(node, 'moduleName'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                # node.removeChild(child)
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           module_id=module_id,
+                           module_name=module_name,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, doc, node):
+        if node is None:
+            node = doc.createElement('moduleExec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.setAttribute('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.setAttribute('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.setAttribute('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_6_0/persistence/xml/io.py b/vistrails/db/versions/v0_6_0/persistence/xml/io.py
new file mode 100644
index 0000000..4b5116f
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/xml/io.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.parsers.expat import ExpatError
+import xml.dom.minidom
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_6_0 import version as my_version
+
+def parse_xml_file(filename):
+    try:
+        return xml.dom.minidom.parse(filename)
+    except xml.parsers.expat.ExpatError, e:
+        msg = 'XML parse error at line %s, col %s: %s' % \
+            (e.lineno, e.offset, e.code)
+        raise VistrailsDBException(msg)
+
+def write_xml_file(filename, dom, prettyprint=True):
+    output = open(filename, 'w')
+    if prettyprint:
+        dom.writexml(output, '','  ','\n')
+    else:
+        dom.writexml(output)
+    output.close()
+
+def read_xml_object(vtType, node, dao_list):
+    return dao_list[vtType].fromXML(node)
+
+def write_xml_object(obj, dom, dao_list, node=None):
+    res_node = dao_list[obj.vtType].toXML(obj, dom, node)
+    return res_node
+
+def open_from_xml(filename, vtType, dao_list):
+    """open_from_xml(filename) -> DBVistrail"""
+    dom = parse_xml_file(filename)
+    vistrail = read_xml_object(vtType, dom.documentElement, dao_list)
+    dom.unlink()
+    return vistrail
+
+def save_to_xml(obj, filename, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(obj, dom, dao_list)
+    dom.appendChild(root)
+    if obj.vtType == 'vistrail':
+        root.setAttribute('version', my_version)
+        root.setAttribute('xmlns:xsi', 
+                          'http://www.w3.org/2001/XMLSchema-instance')
+        root.setAttribute('xsi:schemaLocation', 
+                          'http://www.vistrails.org/vistrail.xsd')
+    write_xml_file(filename, dom)
+    dom.unlink()
+
+def serialize(object, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(object, dom, dao_list)
+    dom.appendChild(root)
+    return dom.toxml()
+
+def unserialize(str, obj_type):
+    dom = xml.dom.minidom.parseString(str)
+    return read_xml_object(obj_type, dom.documentElement, dao_list)
+
diff --git a/vistrails/db/versions/v0_6_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_6_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_6_0/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_6_0/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..05eeb79
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/schemas/sql/vistrails.sql
@@ -0,0 +1,242 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    sig varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE log_tbl(
+    id int,
+    vt_id int
+);
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    module_exec_id int
+);
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    vt_id int
+);
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE abstraction(
+    id int,
+    name varchar(255),
+    vt_id int
+);
+
+CREATE TABLE workflow(
+    id int,
+    name varchar(255),
+    vt_id int
+);
+
+CREATE TABLE abstraction_ref(
+    id int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    user varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    version char(16),
+    name varchar(255)
+);
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    module_id int,
+    module_name varchar(255),
+    machine_id int,
+    wf_exec_id int,
+    vt_id int
+);
+
diff --git a/vistrails/db/versions/v0_6_0/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_6_0/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..4540fbb
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,37 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, log_tbl, machine, add_tbl, other, location, workflow_exec, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, parameter, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v0_6_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_6_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..9471940
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,227 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="user" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="sig" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_6_0/specs/abstraction.xml b/vistrails/db/versions/v0_6_0/specs/abstraction.xml
new file mode 100644
index 0000000..6f76c61
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/abstraction.xml
@@ -0,0 +1,65 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstraction">
+  <layout>
+    <xml name="abstraction" nodeType="xs:element"/>
+    <sql table="abstraction"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="action" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="hash" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="vistrail" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/abstractionRef.xml b/vistrails/db/versions/v0_6_0/specs/abstractionRef.xml
new file mode 100644
index 0000000..5645c3d
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/abstractionRef.xml
@@ -0,0 +1,78 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstractionRef">
+  <layout>
+    <xml name="abstractionRef" nodeType="xs:element"/>
+    <sql table="abstraction_ref"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="abstraction_id" type="long">
+    <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/action.xml b/vistrails/db/versions/v0_6_0/specs/action.xml
new file mode 100644
index 0000000..d9c259f
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/action.xml
@@ -0,0 +1,100 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+  
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="annotation" type="hash" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/add.xml b/vistrails/db/versions/v0_6_0/specs/add.xml
new file mode 100644
index 0000000..7cbca5c
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/add.xml
@@ -0,0 +1,110 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/annotation.xml b/vistrails/db/versions/v0_6_0/specs/annotation.xml
new file mode 100644
index 0000000..19e9a54
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/annotation.xml
@@ -0,0 +1,93 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="action">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/change.xml b/vistrails/db/versions/v0_6_0/specs/change.xml
new file mode 100644
index 0000000..54b348f
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/change.xml
@@ -0,0 +1,115 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/connection.xml b/vistrails/db/versions/v0_6_0/specs/connection.xml
new file mode 100644
index 0000000..b559fab
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/connection.xml
@@ -0,0 +1,74 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/delete.xml b/vistrails/db/versions/v0_6_0/specs/delete.xml
new file mode 100644
index 0000000..9df9273
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/delete.xml
@@ -0,0 +1,77 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/function.xml b/vistrails/db/versions/v0_6_0/specs/function.xml
new file mode 100644
index 0000000..8254645
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/function.xml
@@ -0,0 +1,83 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/location.xml b/vistrails/db/versions/v0_6_0/specs/location.xml
new file mode 100644
index 0000000..6e56055
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/location.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_6_0/specs/log.xml b/vistrails/db/versions/v0_6_0/specs/log.xml
new file mode 100644
index 0000000..c2554e3
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/log.xml
@@ -0,0 +1,62 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" cascade="false" type="hash" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" cascade="false" type="hash" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/machine.xml b/vistrails/db/versions/v0_6_0/specs/machine.xml
new file mode 100644
index 0000000..dea813d
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/machine.xml
@@ -0,0 +1,85 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="long" mapping="one-to-many">
+    <sql column="module_exec_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/module.xml b/vistrails/db/versions/v0_6_0/specs/module.xml
new file mode 100644
index 0000000..3a89cf8
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/module.xml
@@ -0,0 +1,107 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="hash" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="hash" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/module_exec.xml b/vistrails/db/versions/v0_6_0/specs/module_exec.xml
new file mode 100644
index 0000000..465407b
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/module_exec.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module_exec">
+  <layout>
+    <xml name="moduleExec" nodeType="xs:element"/>
+    <sql table="module_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="module_id" type="long" foreignKey="true" object="module">
+    <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="module_name" type="str">
+    <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="machine" name="machine_id" type="long" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="machine_id" type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/other.xml b/vistrails/db/versions/v0_6_0/specs/other.xml
new file mode 100644
index 0000000..40e1388
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/other.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/parameter.xml b/vistrails/db/versions/v0_6_0/specs/parameter.xml
new file mode 100644
index 0000000..78f6cf7
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/parameter.xml
@@ -0,0 +1,94 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/port.xml b/vistrails/db/versions/v0_6_0/specs/port.xml
new file mode 100644
index 0000000..2a369ff
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/port.xml
@@ -0,0 +1,90 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="sig" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/portSpec.xml b/vistrails/db/versions/v0_6_0/specs/portSpec.xml
new file mode 100644
index 0000000..e42a5f0
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/portSpec.xml
@@ -0,0 +1,84 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/tag.xml b/vistrails/db/versions/v0_6_0/specs/tag.xml
new file mode 100644
index 0000000..f8412b9
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/tag.xml
@@ -0,0 +1,71 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	    object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+  
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/vistrail.xml b/vistrails/db/versions/v0_6_0/specs/vistrail.xml
new file mode 100644
index 0000000..4f139cb
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/vistrail.xml
@@ -0,0 +1,81 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="vt_id"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="hash" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstraction" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_6_0/specs/workflow.xml b/vistrails/db/versions/v0_6_0/specs/workflow.xml
new file mode 100644
index 0000000..486e3f8
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/workflow.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="module" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="connection" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstractionRef" type="hash" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+  
diff --git a/vistrails/db/versions/v0_6_0/specs/workflow_exec.xml b/vistrails/db/versions/v0_6_0/specs/workflow_exec.xml
new file mode 100644
index 0000000..6944ede
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/specs/workflow_exec.xml
@@ -0,0 +1,106 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow_exec">
+  <layout>
+    <xml name="workflowExec" nodeType="xs:element"/>
+    <sql table="workflow_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="vt_version" type="str">
+    <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="parent_id" type="long">
+    <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent_type" type="str">
+    <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parent_version" type="long">
+    <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="hash" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_6_0/translate/__init__.py b/vistrails/db/versions/v0_6_0/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_6_0/translate/v0_3_1.py b/vistrails/db/versions/v0_6_0/translate/v0_3_1.py
new file mode 100644
index 0000000..27f5a80
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/translate/v0_3_1.py
@@ -0,0 +1,716 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+import copy
+from datetime import datetime
+from time import strptime
+
+from vistrails.core.data_structures.graph import Graph
+from vistrails.db.versions.v0_6_0.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort
+
+def convertDate(date):
+    if date is not None and date != '':
+        return datetime(*strptime(date, '%d %b %Y %H:%M:%S')[0:6])
+    return datetime(1900, 1, 1)
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+    id_scope = vistrail.idScope
+    for _action in _vistrail.db_get_actions():
+#         print 'translating action %s' % _action.db_time
+        functionName = 'translate%s%sAction' % \
+            (_action.db_what[0].upper(), _action.db_what[1:])
+        thisModule = sys.modules[__name__]
+        action = getattr(thisModule, functionName)(_action, id_scope)
+        vistrail.db_add_action(action)
+    for _tag in _vistrail.db_get_tags():
+        tag = DBTag(id=_tag.db_time,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    convertIds(vistrail)
+#     for action in vistrail.getActions():
+#         print '%s %s' % (action.id, action.operations)
+    vistrail.db_version = '0.6.0'
+    return vistrail
+
+def createAction(_action, operations, id_scope):
+    annotations = {}
+    if _action.db_notes is not None and _action.db_notes.strip() != '':
+        annotations['notes'] = DBAnnotation(id=id_scope.getNewId(DBAnnotation.vtType),
+                                            key='notes',
+                                            value=_action.db_notes.strip(),
+                                            )
+    return DBAction(id=_action.db_time,
+                    prevId=_action.db_parent,
+                    date=convertDate(_action.db_date),
+                    user=_action.db_user,
+                    operations=operations,
+                    annotations=annotations,
+                    )
+
+def translateAddModuleAction(_action, id_scope):
+    operations = []
+    for _module in _action.db_datas:
+        # note that we're just blindly setting all cache tags to 1 since
+        # v0.3.1 didn't really switch this
+        module = DBModule(id=_module.db_id,
+                          name=_module.db_name,
+                          cache=1,
+                          location=DBLocation(id=_module.db_id,
+                                              x=_module.db_x,
+                                              y=_module.db_y))
+        module.db_location.relative = False
+        operation = DBAdd(id=_action.db_time,
+                          what='module',
+                          objectId=_module.db_id,
+                          data=module)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateAddConnectionAction(_action, id_scope):
+    operations = []
+    for _connection in _action.db_datas:
+        source = DBPort(id=_connection.db_id,
+                        type='source',
+                        moduleId=_connection.db_sourceId,
+                        moduleName=_connection.db_sourceModule,
+                        sig=_connection.db_sourcePort)
+        destination = DBPort(id=_connection.db_id,
+                             type='destination',
+                             moduleId=_connection.db_destinationId,
+                             moduleName=_connection.db_destinationModule,
+                             sig=_connection.db_destinationPort)
+        connection = DBConnection(id=_connection.db_id,
+                                  ports=[source, destination])
+        operation = DBAdd(id=_action.db_time,
+                          what='connection',
+                          objectId=_connection.db_id,
+                          data=connection)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateChangeParameterAction(_action, id_scope):
+    operations = []
+    for _set in _action.db_datas:
+        parameter = DBParameter(id=_set.db_parameterId,
+                                pos=_set.db_parameterId,
+                                name=_set.db_parameter,
+                                alias=_set.db_alias,
+                                val=_set.db_value,
+                                type=_set.db_type)
+        function = DBFunction(id=_set.db_functionId,
+                              pos=_set.db_functionId,
+                              name=_set.db_function,
+                              parameters=[parameter])
+        operation = DBChange(id=_action.db_time,
+                             what='function',
+                             oldObjId=_set.db_functionId,
+                             parentObjId=_set.db_moduleId,
+                             parentObjType='module',
+                             data=function)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateAddModulePortAction(_action, id_scope):
+    operations = []
+    for _portSpec in _action.db_datas:
+        # ids need to be checked
+        portSpec = DBPortSpec(id=_portSpec.db_moduleId,
+                              name=_portSpec.db_portName,
+                              type=_portSpec.db_portType,
+                              spec=_portSpec.db_portSpec)
+        operation = DBAdd(id=_action.db_time,
+                          what='portSpec',
+                          objectId=(_portSpec.db_portName,
+                                    _portSpec.db_portType),
+                          parentObjId=_portSpec.db_moduleId,
+                          parentObjType='module',
+                          data=portSpec)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateChangeAnnotationAction(_action, id_scope):
+    operations = []
+    for _annotation in _action.db_datas:
+        if _annotation.db_key.strip() != '' or \
+                _annotation.db_value.strip() != '':
+            annotation = DBAnnotation(id=-1,
+                                      key=_annotation.db_key,
+                                      value=_annotation.db_value)
+            operation = DBChange(id=_action.db_time,
+                                 what='annotation',
+                                 oldObjId=_annotation.db_key,
+                                 parentObjId=_annotation.db_moduleId,
+                                 parentObjType='module',
+                                 data=annotation)
+            operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateDeleteModuleAction(_action, id_scope):
+    operations = []
+    for _module in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='module',
+                             objectId=_module.db_moduleId)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateDeleteConnectionAction(_action, id_scope):
+    operations = []
+    for _connection in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='connection',
+                             objectId=_connection.db_connectionId)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateDeleteFunctionAction(_action, id_scope):
+    operations = []
+    for _function in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='function',
+                             objectId=_function.db_functionId,
+                             parentObjId=_function.db_moduleId,
+                             parentObjType='module')
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateDeleteAnnotationAction(_action, id_scope):
+    operations = []
+    for _annotation in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='annotation',
+                             objectId=_annotation.db_key)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateDeleteModulePortAction(_action, id_scope):
+    operations = []
+    for _portSpec in _action.db_datas:
+        operation = DBDelete(id=_action.db_time,
+                             what='portSpec',
+                             objectId=(_portSpec.db_portName,
+                                       _portSpec.db_portType),
+                             parentObjId=_portSpec.db_moduleId,
+                             parentObjType='module')
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+def translateMoveModuleAction(_action, id_scope):
+    operations = []
+    for _location in _action.db_datas:
+        location = DBLocation(id=_location.db_id,
+                              x=_location.db_dx,
+                              y=_location.db_dy)
+        location.relative = True
+
+        operation = DBChange(id=_action.db_time,
+                             what='location',
+                             oldObjId=_location.db_id,
+                             parentObjId=_location.db_id,
+                             parentObjType='module',
+                             data=location)
+        operations.append(operation)
+
+    return createAction(_action, operations, id_scope)
+
+### UPDATE IDS ###
+
+def convertIds(vistrail):
+    actions = vistrail.db_get_actions()
+    actions.sort(key=lambda x: x.db_id)
+    objectDict = {}
+#    refDict = {'objectDict': objectDict}
+
+    graph = Graph()
+    for action in actions:
+        graph.add_vertex(action.db_id)
+        graph.add_edge(action.db_prevId, action.db_id)
+
+    def convertAction(actionId):
+#         print 'converting %s' % actionId
+        if actionId == 0:
+            return
+        allOps = []
+        action = vistrail.db_get_action(actionId)
+#         objectDict = refDict['objectDict']
+#         if action.actionType == 'delete' or action.actionType == 'change':
+#             action.objectDict = copy.deepcopy(objectDict)
+#         else:
+#             action.objectDict = objectDict
+        for operation in action.db_get_operations():
+            allOps.extend(convertOperation(vistrail,
+                                           objectDict,
+                                           operation.vtType,
+                                           operation))
+        action.db_operations = allOps
+
+    def removeObjects(actionId):
+        if actionId == 0:
+            return
+#        print "removeObjects(%s)" % actionId
+        action = vistrail.db_get_action(actionId)
+
+        # need to reverse ops here
+        reverseOps = action.db_get_operations()
+        reverseOps.reverse()
+        for operation in reverseOps:
+            parentList = getTypeIdList(operation)
+            removeObject(operation.db_what,
+                         operation.db_oldId,
+                         objectDict,
+                         parentList[:-1])
+        reverseOps.reverse()
+
+
+    graph.dfs(enter_vertex=convertAction,
+              leave_vertex=removeObjects)
+
+def getTypeIdList(operation):
+    if operation.db_what in ('module', 'connection'):
+        return [(operation.db_what, operation.db_oldId)]
+    elif operation.db_what in \
+            ('function', 'portSpec', 'location', 'annotation'):
+        return [('module', operation.db_oldParentId),
+                (operation.db_what, operation.db_oldId)]
+    elif operation.db_what in ('port'):
+        return [('connection', operation.db_oldParentId),
+                (operation.db_what, operation.db_oldId)]
+    elif operation.db_what in ('parameter'):
+        return [('module', operation.db_moduleId),
+                ('function', operation.db_oldParentId),
+                ('parameter', operation.db_oldId)]
+    else:
+        print "unknown type: '%s'" % operation.db_what
+        return [(operation.db_what, operation.db_oldId)]
+
+def getOldId(object):
+    if object.vtType == 'annotation':
+        return object.db_key
+    elif object.vtType == 'port':
+        return object.db_type
+    elif object.vtType == 'portSpec':
+        return (object.db_name, object.db_type)
+    else:
+        return object.getPrimaryKey()
+
+def getChildren(object):
+    childList = []
+    if object.vtType == 'module':
+        childList = object.db_get_functions() + \
+            object.db_get_portSpecs() + \
+            object.db_get_annotations()
+        childList.append(object.db_location)
+        object.db_functions = []
+        object.db_portSpecs = {}
+        object.db_annotations = {}
+        object.db_location = None
+    elif object.vtType == 'connection':
+         childList = object.db_get_ports()
+         object.db_ports = []
+    elif object.vtType == 'function':
+        childList =  object.db_get_parameters()
+        object.db_parameters = []
+    return childList
+
+def captureObject(object, objectDict, newId, parentList):
+    
+#    print "capturing %s" % object
+    currentDict = objectDict
+    for key in parentList:
+        (objType, objId) = key
+#        (currentId, newDict, _) = currentDict[(objType, objId)]
+#        currentDict = newDict
+        (objList, curIdx) = currentDict[(objType, objId)]
+        currentDict = objList[curIdx][1]
+    oldId = getOldId(object)
+#    print "capture: %s %s" % (object.vtType, oldId)
+#    currentDict[(object.vtType, oldId)] = (newId, {}, object)
+    if not currentDict.has_key((object.vtType, oldId)):
+        currentDict[(object.vtType, oldId)] = ([], -1)
+    (curList, curIdx) = currentDict[(object.vtType, oldId)]
+    curList.append((newId, {}, object, curIdx))
+    currentDict[(object.vtType, oldId)] = (curList, len(curList) - 1)
+
+def captureDelete(objType, objId, objectDict, parentList):
+    currentDict = objectDict
+    for (aType, aId) in parentList:
+#        (currentId, newDict, _) = currentDict[(objType, objId)]
+#        currentDict = newDict
+        (objList, curIdx) = currentDict[(aType, aId)]
+        currentDict = objList[curIdx][1]
+
+#    print "captureDelete: %s %s" % (objType, objId)
+    if not currentDict.has_key((objType, objId)):
+        raise Exception("invalid delete")
+    (curList, curIdx) = currentDict[(objType, objId)]
+    curList.append((-1, {}, None, curIdx))
+    currentDict[(objType, objId)] = (curList, len(curList) - 1)
+
+def removeObject(oldObjType, oldId, objectDict, parentList):
+#     print '%s %s' % (oldObjType, oldId)
+#     print objectDict
+#     print parentList
+
+    try:
+        currentDict = objectDict
+        for key in parentList:
+            (objType, objId) = key
+#            (currentId, newDict, _) = currentDict[(objType, objId)]
+#            currentDict = newDict
+            (objList, objIdx) = currentDict[(objType, objId)]
+            currentDict = objList[objIdx][1]
+#        print "remove: %s %s" % (oldObjType, oldId)
+        (curList, curIdx) = currentDict[(oldObjType, oldId)]
+#        print "ok"
+        newIdx = curList[curIdx][3]
+#        del curList[curIdx]
+        currentDict[(oldObjType, oldId)] = (curList, newIdx)
+    except KeyError:
+        print "cannot remove (%s, %s)" % (oldObjType, oldId)
+        print parentList
+        print objList
+        print "index: %s"  % objIdx
+
+def findNewId(typeIdList, objectDict):
+    try:
+        currentDict = objectDict
+        for key in typeIdList:
+#            (currentId, currentDict, currentObj) = currentDict[key]
+            (objList, curIdx) = currentDict[key]
+            if curIdx == -1:
+                return (None, None)
+            (currentId, currentDict, currentObj, _) = objList[curIdx]
+        if currentId == -1:
+            return (None, None)
+        return (currentId, currentObj)
+    except KeyError:
+        pass
+    return (None, None)
+
+def getChildList(typeIdList, objectDict):
+    try:
+        currentDict = objectDict
+        for (objType, objOldId) in typeIdList:
+#            (currentId, currentDict, _) = currentDict[(objType, objOldId)]
+            (objList, curIdx) = currentDict[(objType, objOldId)]
+            if curIdx == -1:
+                return {}
+            currentDict = objList[curIdx][1]
+        return currentDict
+    except KeyError:
+        pass
+    return {}
+
+def createOperation(actionType, objId, objType, parentId, parentType,
+                    object=None):
+    if actionType == 'add':
+        operation = DBAdd(what=objType,
+                          objectId=objId,
+                          parentObjId=parentId,
+                          parentObjType=parentType,
+                          data=object)
+
+    elif actionType == 'change':
+        operation = DBChange(what=objType,
+                             oldObjId=objId,
+                             parentObjId=parentId,
+                             parentObjType=parentType,
+                             data=object)
+    elif actionType == 'delete':
+        operation = DBDelete(what=objType,
+                             objectId=objId,
+                             parentObjId=parentId,
+                             parentObjType=parentType)
+    else:
+        msg = "Cannot find actionType='%s'" % actionType
+        raise Exception(msg)
+
+    return operation
+
+def convertChangeToAdd(operation):
+    return DBAdd(what=operation.db_what,
+                 objectId=operation.db_newObjId,
+                 parentObjId=operation.db_parentObjId,
+                 parentObjType=operation.db_parentObjType,
+                 data=operation.db_data)
+    
+def convertOperation(vistrail, objectDict, actionType, operation):
+    newOps = []
+    if actionType == 'add':
+        object = operation.db_data
+        if object.vtType == 'parameter' and object.db_pos == -1:
+            return newOps
+        operation.db_oldId = operation.db_objectId
+        if operation.db_what == 'annotation':
+            operation.db_oldId = object.db_key
+        elif operation.db_what == 'port':
+            operation.db_oldId = object.db_type
+        operation.db_oldParentId = operation.db_parentObjId
+        parentList = getTypeIdList(operation)
+
+
+        newId = vistrail.idScope.getNewId(object.vtType)
+        captureObject(object, objectDict, newId, parentList[:-1])
+        operation.db_objectId = newId
+        oldId = object.getPrimaryKey()
+        if object.vtType == 'annotation':
+            oldId = object.db_key
+        elif object.vtType == 'port':
+            oldId = object.db_type
+        if hasattr(object, 'db_id'):
+            object.db_id = newId
+
+        # set parent ids correctly...
+        operation.db_id = vistrail.idScope.getNewId('operation')
+        if operation.db_parentObjId is not None:
+            oldParentObjId = operation.db_parentObjId
+            operation.db_parentObjId = findNewId(parentList[:-1], objectDict)[0]
+        if object.vtType == 'port':
+            object.db_moduleId = \
+                findNewId([('module', object.db_moduleId)], objectDict)[0]
+#         if object.vtType == 'connection':
+#             for port in object.db_ports.itervalues():
+#                 port.db_moduleId = \
+#                     findNewId([('module', port.db_moduleId)], objectDict)[0]
+
+        newOps.append(operation)
+
+        # set child operations
+        children = getChildren(object)
+        for child in children:
+            # hack to get around fact that location ids are wrong
+            if child.vtType == 'location':
+                child.db_id = oldId
+            newOp = createOperation('add',
+                                    child.getPrimaryKey(),
+                                    child.vtType,
+                                    oldId,
+                                    object.vtType,
+                                    child)
+
+            # hack to get moduleId at parameter level
+            if child.vtType == 'parameter':
+                newOp.db_moduleId = oldParentObjId
+            newOps.extend(convertOperation(vistrail, 
+                                           objectDict, 
+                                           'add',
+                                           newOp))
+            newOp.db_parentObjId = newId
+    elif actionType == 'change':
+        object = operation.db_data
+        if object.vtType == 'parameter' and object.db_pos == -1:
+            return newOps
+        operation.db_oldId = operation.db_oldObjId
+        if operation.db_what == 'annotation':
+            operation.db_oldId = object.db_key
+        elif operation.db_what == 'port':
+            operation.db_oldId = object.db_type
+        operation.db_oldParentId = operation.db_parentObjId
+        parentList = getTypeIdList(operation)
+
+        # need to get changed id as new id if have one
+        (foundId, foundObj) = findNewId(parentList, objectDict)
+        if foundId is not None:
+            if foundObj.vtType == 'function' and \
+                    foundObj.db_pos == object.db_pos and \
+                    foundObj.db_name == object.db_name:
+                # don't create new function, convert parameter
+                for parameter in object.db_parameters:
+                    newOp = createOperation('change',
+                                            parameter.getPrimaryKey(),
+                                            parameter.vtType,
+                                            object.getPrimaryKey(),
+                                            object.vtType,
+                                            parameter)
+                    newOp.db_moduleId = operation.db_parentObjId
+                    newOps.extend(convertOperation(vistrail,
+                                                   objectDict,
+                                                   'change',
+                                                   newOp))
+                    newOp.db_parentObjId = foundId
+                return newOps
+            else:
+                if foundObj.vtType == 'location' and object.relative == True:
+                    object.db_x += foundObj.db_x
+                    object.db_y += foundObj.db_y
+                    object.relative = False
+                # get new id for new object
+                newId = vistrail.idScope.getNewId(object.vtType)
+                operation.db_oldObjId = foundId
+                operation.db_newObjId = newId
+        else:
+            # get new id for new object
+            newId = vistrail.idScope.getNewId(object.vtType)
+            operation.db_oldObjId = -1
+            operation.db_newObjId = newId
+            anOldId = operation.db_oldId
+            anOldParentId = operation.db_parentObjId
+            if hasattr(operation,'db_moduleId'):
+                aModuleId = operation.db_moduleId
+            else:
+                aModuleId = None
+            operation = convertChangeToAdd(operation)
+            operation.db_oldId = anOldId
+            operation.db_oldParentId = operation.db_parentObjId
+            operation.db_moduleId = aModuleId
+
+        # need to do child deletes first
+        childDict = getChildList(parentList, objectDict)
+        for k,v in childDict.items():
+            (objType, objId) = k
+#            (newId, newDict) = v
+#            print 'creating delete for %s'  % objType
+            newOp = createOperation('delete',
+                                    objId,
+                                    objType,
+                                    object.getPrimaryKey(),
+                                    object.vtType)
+            # hack to get moduleId at parameter level
+            if objType == 'parameter':
+                newOp.db_moduleId = operation.db_parentObjId
+            newOps.extend(convertOperation(vistrail,
+                                           objectDict,
+                                           'delete',
+                                           newOp))
+            newOp.db_parentObjId = newId
+        # don't reverse -- ordering is correct
+        # newOps.reverse()
+
+        # set new object id
+        captureObject(object, objectDict, newId, parentList[:-1])
+#        operation.db_objectId = newId
+        oldId = object.getPrimaryKey()
+        if object.vtType == 'annotation':
+            oldId = object.db_key
+        elif object.vtType == 'port':
+            oldId = object.db_type
+        if hasattr(object, 'db_id'):
+            object.db_id = newId
+
+        # set parent ids correctly...
+        operation.db_id = vistrail.idScope.getNewId('operation')
+        if operation.db_parentObjId is not None:
+            oldParentObjId = operation.db_parentObjId
+            operation.db_parentObjId = findNewId(parentList[:-1], objectDict)[0]
+        if object.vtType == 'port':
+            object.db_moduleId = \
+                findNewId([('module', object.db_moduleId)], objectDict)[0]
+#         if object.vtType == 'connection':
+#             for port in object.db_ports.itervalues():
+#                 port.db_moduleId = \
+#                     findNewId([('module', port.db_moduleId)], objectDict)[0]
+        newOps.append(operation)
+
+        # set child operations
+        children = getChildren(operation.db_data)
+        for child in children:
+#            print 'creating add for %s' % child.vtType
+            newOp = createOperation('add',
+                                    child.getPrimaryKey(),
+                                    child.vtType,
+                                    oldId,
+                                    object.vtType,
+                                    child)
+            # hack to get moduleId at parameter level
+            if child.vtType == 'parameter':
+                newOp.db_moduleId = oldParentObjId
+            newOps.extend(convertOperation(vistrail, 
+                                           objectDict, 
+                                           'add',
+                                           newOp))
+            newOp.db_parentObjId = newId
+    elif actionType == 'delete':
+        operation.db_oldId = operation.db_objectId
+#         if operation.db_what == 'annotation':
+#             operation.db_oldId = object.db_key
+#         elif operation.db_what == 'port':
+#             operation.db_oldId = object.db_type
+        operation.db_oldParentId = operation.db_parentObjId
+        parentList = getTypeIdList(operation)
+
+        # get new id for delete operation
+        (newId, _) = findNewId(parentList, objectDict)
+#        print 'found new id:  %s' % newId
+        if newId is None:
+            msg = "Cannot find id: %s" % parentList
+            print msg
+#            raise Exception(msg)
+            return []
+
+        # need to do child deletes first
+        childDict = getChildList(parentList, objectDict)
+        for k,v in childDict.items():
+            (objType, objId) = k
+#            (newId, newDict) = v
+            newOp = createOperation('delete',
+                                    objId,
+                                    objType,
+                                    operation.db_objectId,
+                                    operation.db_what)
+            # hack to get moduleId at parameter level
+            if objType == 'parameter':
+                newOp.db_moduleId = operation.db_parentObjId
+            newOps.extend(convertOperation(vistrail,
+                                           objectDict,
+                                           'delete',
+                                           newOp))
+            newOp.db_parentObjId = newId
+#        newOps.reverse()
+
+        captureDelete(operation.db_what, operation.db_objectId, objectDict, 
+                      parentList[:-1])
+        operation.db_objectId = newId
+        
+        # set parent ids correctly
+        operation.db_id = vistrail.idScope.getNewId('operation')
+        if operation.db_parentObjId is not None:
+            operation.db_parentObjId = findNewId(parentList[:-1], objectDict)[0]
+        newOps.append(operation)
+
+    return newOps
diff --git a/vistrails/db/versions/v0_6_0/translate/v0_5_0.py b/vistrails/db/versions/v0_6_0/translate/v0_5_0.py
new file mode 100644
index 0000000..c267ab2
--- /dev/null
+++ b/vistrails/db/versions/v0_6_0/translate/v0_5_0.py
@@ -0,0 +1,121 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_6_0.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort
+
+def translateVistrail(_vistrail):
+    # FIXME should this be a deepcopy?
+    vistrail = DBVistrail()
+
+    for _action in _vistrail.db_actions.itervalues():
+        ops = []
+        for op in _action.db_operations:
+            if op.vtType == 'add':
+                data = convert_data(op.db_data)
+                ops.append(DBAdd(id=op.db_id,
+                                 what=op.db_what, 
+                                 objectId=op.db_objectId, 
+                                 parentObjId=op.db_parentObjId, 
+                                 parentObjType=op.db_parentObjType, 
+                                 data=data))
+            elif op.vtType == 'change':
+                data = convert_data(op.db_data)
+                ops.append(DBChange(id=op.db_id,
+                                    what=op.db_what, 
+                                    oldObjId=op.db_oldObjId, 
+                                    newObjId=op.db_newObjId,
+                                    parentObjId=op.db_parentObjId, 
+                                    parentObjType=op.db_parentObjType, 
+                                    data=data))
+            elif op.vtType == 'delete':
+                ops.append(DBDelete(id=op.db_id,
+                                    what=op.db_what, 
+                                    objectId=op.db_objectId, 
+                                    parentObjId=op.db_parentObjId, 
+                                    parentObjType=op.db_parentObjType))
+        action = DBAction(id=_action.db_id,
+                          prevId=_action.db_prevId, 
+                          date=_action.db_date, 
+                          user=_action.db_user, 
+                          operations=ops)
+        vistrail.db_add_action(action)
+
+    for _tag in _vistrail.db_tags.itervalues():
+        tag = DBTag(id=_tag.db_time,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    vistrail.db_version = '0.6.0'
+    return vistrail
+
+def convert_data(child):
+    if child.vtType == 'module':
+        return DBModule(id=child.db_id,
+                        cache=child.db_cache, 
+                        name=child.db_name)
+    elif child.vtType == 'connection':
+        return DBConnection(id=child.db_id)
+    elif child.vtType == 'portSpec':
+        return DBPortSpec(id=child.db_id,
+                          name=child.db_name, 
+                          type=child.db_type, 
+                          spec=child.db_spec)
+    elif child.vtType == 'function':
+        return DBFunction(id=child.db_id,
+                          pos=child.db_pos, 
+                          name=child.db_name)
+    elif child.vtType == 'parameter':
+        return DBParameter(id=child.db_id,
+                           pos=child.db_pos,
+                           name=child.db_name, 
+                           type=child.db_type, 
+                           val=child.db_val, 
+                           alias=child.db_alias)
+    elif child.vtType == 'location':
+        return DBLocation(id=child.db_id,
+                          x=child.db_x,
+                          y=child.db_y)
+    elif child.vtType == 'annotation':
+        return DBAnnotation(id=child.db_id,
+                            key=child.db_key,
+                            value=child.db_value)
+    elif child.vtType == 'port':
+        return DBPort(id=child.db_id,
+                      type=child.db_type, 
+                      moduleId=child.db_moduleId, 
+                      moduleName=child.db_moduleName, 
+                      sig=child.db_sig)
diff --git a/vistrails/db/versions/v0_7_0/__init__.py b/vistrails/db/versions/v0_7_0/__init__.py
new file mode 100644
index 0000000..98fe4b0
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.7.0'
diff --git a/vistrails/db/versions/v0_7_0/domain/__init__.py b/vistrails/db/versions/v0_7_0/domain/__init__.py
new file mode 100644
index 0000000..f8bbb47
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/domain/__init__.py
@@ -0,0 +1,40 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from abstraction import DBAbstraction
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_7_0/domain/abstraction.py b/vistrails/db/versions/v0_7_0/domain/abstraction.py
new file mode 100644
index 0000000..5972a93
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/domain/abstraction.py
@@ -0,0 +1,54 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+from auto_gen import DBAbstraction as _DBAbstraction
+from id_scope import IdScope
+
+class DBAbstraction(_DBAbstraction):
+    def __init__(self, *args, **kwargs):
+        _DBAbstraction.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+        self.idScope.setBeginId('action', 1)
+
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBAbstraction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBAbstraction
+        # need to go through and reset the index to the copied objects
+        cp.idScope = copy.copy(self.idScope)
+        return cp
diff --git a/vistrails/db/versions/v0_7_0/domain/auto_gen.py b/vistrails/db/versions/v0_7_0/domain/auto_gen.py
new file mode 100644
index 0000000..ee3f826
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/domain/auto_gen.py
@@ -0,0 +1,4137 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBPortSpec()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_spec = self.db_spec
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_spec = self.db_spec
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, abstraction=None, name=None, package=None, version=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self.__db_id = id
+        self.__db_cache = cache
+        self.__db_abstraction = abstraction
+        self.__db_name = name
+        self.__db_package = package
+        self.__db_version = version
+        self.__db_location = location
+        self.db_functions_id_index = {}
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+            for v in self.__db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self.__db_portSpecs = []
+        else:
+            self.__db_portSpecs = portSpecs
+            for v in self.__db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBModule()
+        cp.db_id = self.db_id
+        cp.db_cache = self.db_cache
+        cp.db_abstraction = self.db_abstraction
+        cp.db_name = self.db_name
+        cp.db_package = self.db_package
+        cp.db_version = self.db_version
+        cp.db_location = self.db_location
+        if self.db_functions is None:
+            cp.db_functions = None
+        else:
+            cp.db_functions = [copy.copy(v) for v in self.db_functions]
+            for v in cp.__db_functions:
+                cp.db_functions_id_index[v.db_id] = v
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+            for v in cp.__db_annotations:
+                cp.db_annotations_id_index[v.db_id] = v
+                cp.db_annotations_key_index[v.db_key] = v
+        if self.db_portSpecs is None:
+            cp.db_portSpecs = None
+        else:
+            cp.db_portSpecs = [copy.copy(v) for v in self.db_portSpecs]
+            for v in cp.__db_portSpecs:
+                cp.db_portSpecs_id_index[v.db_id] = v
+                cp.db_portSpecs_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule()
+        cp.db_id = self.db_id
+        cp.db_cache = self.db_cache
+        cp.db_abstraction = self.db_abstraction
+        cp.db_name = self.db_name
+        cp.db_package = self.db_package
+        cp.db_version = self.db_version
+        if self.db_location is not None:
+            cp.db_location = self.db_location.do_copy(new_ids, id_scope, id_remap)
+        if self.db_functions is None:
+            cp.db_functions = []
+        else:
+            cp.db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_functions]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_portSpecs is None:
+            cp.db_portSpecs = []
+        else:
+            cp.db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_functions:
+            cp.db_functions_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        for v in cp.__db_portSpecs:
+            cp.db_portSpecs_id_index[v.db_id] = v
+            cp.db_portSpecs_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        for child in self.db_functions:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_abstraction(self):
+        return self.__db_abstraction
+    def __set_db_abstraction(self, abstraction):
+        self.__db_abstraction = abstraction
+        self.is_dirty = True
+    db_abstraction = property(__get_db_abstraction, __set_db_abstraction)
+    def db_add_abstraction(self, abstraction):
+        self.__db_abstraction = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.__db_abstraction = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.__db_abstraction = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_package(self):
+        return self.__db_package
+    def __set_db_package(self, package):
+        self.__db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self.__db_package = package
+    def db_change_package(self, package):
+        self.__db_package = package
+    def db_delete_package(self, package):
+        self.__db_package = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                del self.__db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return self.db_functions_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def __get_db_portSpecs(self):
+        return self.__db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self.__db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self.__db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self.__db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[portSpec.db_name] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                self.__db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self.__db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[portSpec.db_name] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                del self.__db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[portSpec.db_name]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == key:
+                return self.__db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return self.db_portSpecs_id_index.has_key(key)
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return self.db_portSpecs_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBTag()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and id_remap.has_key(('action', self.db_id)):
+                cp.db_id = id_remap[('action', self.db_id)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, spec=None):
+        self.__db_id = id
+        self.__db_type = type
+        self.__db_moduleId = moduleId
+        self.__db_moduleName = moduleName
+        self.__db_name = name
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBPort()
+        cp.db_id = self.db_id
+        cp.db_type = self.db_type
+        cp.db_moduleId = self.db_moduleId
+        cp.db_moduleName = self.db_moduleName
+        cp.db_name = self.db_name
+        cp.db_spec = self.db_spec
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort()
+        cp.db_id = self.db_id
+        cp.db_type = self.db_type
+        cp.db_moduleId = self.db_moduleId
+        cp.db_moduleName = self.db_moduleName
+        cp.db_name = self.db_name
+        cp.db_spec = self.db_spec
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and id_remap.has_key(('module', self.db_moduleId)):
+                cp.db_moduleId = id_remap[('module', self.db_moduleId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self.__db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self.__db_moduleName = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, workflow_execs=None, machines=None):
+        self.__db_id = id
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self.__db_workflow_execs = []
+        else:
+            self.__db_workflow_execs = workflow_execs
+            for v in self.__db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_machines_id_index = {}
+        if machines is None:
+            self.__db_machines = []
+        else:
+            self.__db_machines = machines
+            for v in self.__db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBLog()
+        cp.db_id = self.db_id
+        if self.db_workflow_execs is None:
+            cp.db_workflow_execs = None
+        else:
+            cp.db_workflow_execs = [copy.copy(v) for v in self.db_workflow_execs]
+            for v in cp.__db_workflow_execs:
+                cp.db_workflow_execs_id_index[v.db_id] = v
+        if self.db_machines is None:
+            cp.db_machines = None
+        else:
+            cp.db_machines = [copy.copy(v) for v in self.db_machines]
+            for v in cp.__db_machines:
+                cp.db_machines_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog()
+        cp.db_id = self.db_id
+        if self.db_workflow_execs is None:
+            cp.db_workflow_execs = []
+        else:
+            cp.db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_workflow_execs]
+        if self.db_machines is None:
+            cp.db_machines = []
+        else:
+            cp.db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_workflow_execs:
+            cp.db_workflow_execs_id_index[v.db_id] = v
+        for v in cp.__db_machines:
+            cp.db_machines_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self.db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_workflow_execs(self):
+        return self.__db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self.__db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self.__db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self.__db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self.__db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self.__db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == workflow_exec.db_id:
+                del self.__db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == key:
+                return self.__db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return self.db_workflow_execs_id_index.has_key(key)
+    
+    def __get_db_machines(self):
+        return self.__db_machines
+    def __set_db_machines(self, machines):
+        self.__db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self.__db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == machine.db_id:
+                self.__db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self.__db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == machine.db_id:
+                del self.__db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == key:
+                return self.__db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return self.db_machines_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None, module_execs=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_os = os
+        self.__db_architecture = architecture
+        self.__db_processor = processor
+        self.__db_ram = ram
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self.__db_module_execs = []
+        else:
+            self.__db_module_execs = module_execs
+            for v in self.__db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBMachine()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_os = self.db_os
+        cp.db_architecture = self.db_architecture
+        cp.db_processor = self.db_processor
+        cp.db_ram = self.db_ram
+        if self.db_module_execs is None:
+            cp.db_module_execs = None
+        else:
+            cp.db_module_execs = [copy.copy(v) for v in self.db_module_execs]
+            for v in cp.__db_module_execs:
+                cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_os = self.db_os
+        cp.db_architecture = self.db_architecture
+        cp.db_processor = self.db_processor
+        cp.db_ram = self.db_ram
+        if self.db_module_execs is None:
+            cp.db_module_execs = []
+        else:
+            cp.db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_module_execs:
+            cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_os(self):
+        return self.__db_os
+    def __set_db_os(self, os):
+        self.__db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self.__db_os = os
+    def db_change_os(self, os):
+        self.__db_os = os
+    def db_delete_os(self, os):
+        self.__db_os = None
+    
+    def __get_db_architecture(self):
+        return self.__db_architecture
+    def __set_db_architecture(self, architecture):
+        self.__db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self.__db_architecture = None
+    
+    def __get_db_processor(self):
+        return self.__db_processor
+    def __set_db_processor(self, processor):
+        self.__db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self.__db_processor = processor
+    def db_change_processor(self, processor):
+        self.__db_processor = processor
+    def db_delete_processor(self, processor):
+        self.__db_processor = None
+    
+    def __get_db_ram(self):
+        return self.__db_ram
+    def __set_db_ram(self, ram):
+        self.__db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self.__db_ram = ram
+    def db_change_ram(self, ram):
+        self.__db_ram = ram
+    def db_delete_ram(self, ram):
+        self.__db_ram = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                self.__db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                del self.__db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == key:
+                return self.__db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return self.db_module_execs_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None, data=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.__db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAdd()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        cp.db_data = self.db_data
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        if self.db_data is not None:
+            cp.db_data = self.db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and id_remap.has_key((self.db_what, self.db_objectId)):
+                cp.db_objectId = id_remap[(self.db_what, self.db_objectId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        self.__db_data = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBOther()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self.__db_id = id
+        self.__db_x = x
+        self.__db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBLocation()
+        cp.db_id = self.db_id
+        cp.db_x = self.db_x
+        cp.db_y = self.db_y
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation()
+        cp.db_id = self.db_id
+        cp.db_x = self.db_x
+        cp.db_y = self.db_y
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_x(self):
+        return self.__db_x
+    def __set_db_x(self, x):
+        self.__db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self.__db_x = x
+    def db_change_x(self, x):
+        self.__db_x = x
+    def db_delete_x(self, x):
+        self.__db_x = None
+    
+    def __get_db_y(self):
+        return self.__db_y
+    def __set_db_y(self, y):
+        self.__db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self.__db_y = y
+    def db_change_y(self, y):
+        self.__db_y = y
+    def db_delete_y(self, y):
+        self.__db_y = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, name=None, module_execs=None):
+        self.__db_id = id
+        self.__db_user = user
+        self.__db_ip = ip
+        self.__db_vt_version = vt_version
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_parent_id = parent_id
+        self.__db_parent_type = parent_type
+        self.__db_parent_version = parent_version
+        self.__db_name = name
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self.__db_module_execs = []
+        else:
+            self.__db_module_execs = module_execs
+            for v in self.__db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBWorkflowExec()
+        cp.db_id = self.db_id
+        cp.db_user = self.db_user
+        cp.db_ip = self.db_ip
+        cp.db_vt_version = self.db_vt_version
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_parent_id = self.db_parent_id
+        cp.db_parent_type = self.db_parent_type
+        cp.db_parent_version = self.db_parent_version
+        cp.db_name = self.db_name
+        if self.db_module_execs is None:
+            cp.db_module_execs = None
+        else:
+            cp.db_module_execs = [copy.copy(v) for v in self.db_module_execs]
+            for v in cp.__db_module_execs:
+                cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec()
+        cp.db_id = self.db_id
+        cp.db_user = self.db_user
+        cp.db_ip = self.db_ip
+        cp.db_vt_version = self.db_vt_version
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_parent_id = self.db_parent_id
+        cp.db_parent_type = self.db_parent_type
+        cp.db_parent_version = self.db_parent_version
+        cp.db_name = self.db_name
+        if self.db_module_execs is None:
+            cp.db_module_execs = []
+        else:
+            cp.db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_module_execs:
+            cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_ip(self):
+        return self.__db_ip
+    def __set_db_ip(self, ip):
+        self.__db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self.__db_ip = ip
+    def db_change_ip(self, ip):
+        self.__db_ip = ip
+    def db_delete_ip(self, ip):
+        self.__db_ip = None
+    
+    def __get_db_vt_version(self):
+        return self.__db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self.__db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self.__db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self.__db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self.__db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self.__db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self.__db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self.__db_parent_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                self.__db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                del self.__db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == key:
+                return self.__db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return self.db_module_execs_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self.__db_parameters = []
+        else:
+            self.__db_parameters = parameters
+            for v in self.__db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBFunction()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        if self.db_parameters is None:
+            cp.db_parameters = None
+        else:
+            cp.db_parameters = [copy.copy(v) for v in self.db_parameters]
+            for v in cp.__db_parameters:
+                cp.db_parameters_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        if self.db_parameters is None:
+            cp.db_parameters = []
+        else:
+            cp.db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_parameters:
+            cp.db_parameters_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_parameters(self):
+        return self.__db_parameters
+    def __set_db_parameters(self, parameters):
+        self.__db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self.__db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self.__db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                self.__db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self.__db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                del self.__db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == key:
+                return self.__db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return self.db_parameters_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, name=None, actions=None, tags=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.db_actions_id_index = {}
+        if actions is None:
+            self.__db_actions = []
+        else:
+            self.__db_actions = actions
+            for v in self.__db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = []
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAbstraction()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_actions is None:
+            cp.db_actions = None
+        else:
+            cp.db_actions = [copy.copy(v) for v in self.db_actions]
+            for v in cp.__db_actions:
+                cp.db_actions_id_index[v.db_id] = v
+        if self.db_tags is None:
+            cp.db_tags = None
+        else:
+            cp.db_tags = [copy.copy(v) for v in self.db_tags]
+            for v in cp.__db_tags:
+                cp.db_tags_id_index[v.db_id] = v
+                cp.db_tags_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_actions is None:
+            cp.db_actions = []
+        else:
+            cp.db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_actions]
+        if self.db_tags is None:
+            cp.db_tags = []
+        else:
+            cp.db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_tags]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_actions:
+            cp.db_actions_id_index[v.db_id] = v
+        for v in cp.__db_tags:
+            cp.db_tags_id_index[v.db_id] = v
+            cp.db_tags_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions:
+            if child.has_changes():
+                return True
+        for child in self.db_tags:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                self.__db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                del self.__db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == key:
+                return self.__db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return self.db_actions_id_index.has_key(key)
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                self.__db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                del self.__db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == key:
+                return self.__db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return self.db_tags_id_index.has_key(key)
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, id=None, name=None, modules=None, connections=None, annotations=None, others=None, abstractionRefs=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.db_modules_id_index = {}
+        if modules is None:
+            self.__db_modules = []
+        else:
+            self.__db_modules = modules
+            for v in self.__db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self.db_connections_id_index = {}
+        if connections is None:
+            self.__db_connections = []
+        else:
+            self.__db_connections = connections
+            for v in self.__db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_others_id_index = {}
+        if others is None:
+            self.__db_others = []
+        else:
+            self.__db_others = others
+            for v in self.__db_others:
+                self.db_others_id_index[v.db_id] = v
+        self.db_abstractionRefs_id_index = {}
+        if abstractionRefs is None:
+            self.__db_abstractionRefs = []
+        else:
+            self.__db_abstractionRefs = abstractionRefs
+            for v in self.__db_abstractionRefs:
+                self.db_abstractionRefs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBWorkflow()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_modules is None:
+            cp.db_modules = None
+        else:
+            cp.db_modules = [copy.copy(v) for v in self.db_modules]
+            for v in cp.__db_modules:
+                cp.db_modules_id_index[v.db_id] = v
+        if self.db_connections is None:
+            cp.db_connections = None
+        else:
+            cp.db_connections = [copy.copy(v) for v in self.db_connections]
+            for v in cp.__db_connections:
+                cp.db_connections_id_index[v.db_id] = v
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+            for v in cp.__db_annotations:
+                cp.db_annotations_id_index[v.db_id] = v
+        if self.db_others is None:
+            cp.db_others = None
+        else:
+            cp.db_others = [copy.copy(v) for v in self.db_others]
+            for v in cp.__db_others:
+                cp.db_others_id_index[v.db_id] = v
+        if self.db_abstractionRefs is None:
+            cp.db_abstractionRefs = None
+        else:
+            cp.db_abstractionRefs = [copy.copy(v) for v in self.db_abstractionRefs]
+            for v in cp.__db_abstractionRefs:
+                cp.db_abstractionRefs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_modules is None:
+            cp.db_modules = []
+        else:
+            cp.db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_modules]
+        if self.db_connections is None:
+            cp.db_connections = []
+        else:
+            cp.db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_connections]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_others is None:
+            cp.db_others = []
+        else:
+            cp.db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_others]
+        if self.db_abstractionRefs is None:
+            cp.db_abstractionRefs = []
+        else:
+            cp.db_abstractionRefs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_abstractionRefs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_modules:
+            cp.db_modules_id_index[v.db_id] = v
+        for v in cp.__db_connections:
+            cp.db_connections_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        for v in cp.__db_others:
+            cp.db_others_id_index[v.db_id] = v
+        for v in cp.__db_abstractionRefs:
+            cp.db_abstractionRefs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_abstractionRefs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstractionRef(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_modules:
+            if child.has_changes():
+                return True
+        for child in self.db_connections:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_others:
+            if child.has_changes():
+                return True
+        for child in self.db_abstractionRefs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_modules(self):
+        return self.__db_modules
+    def __set_db_modules(self, modules):
+        self.__db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self.__db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self.__db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == module.db_id:
+                self.__db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self.__db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == module.db_id:
+                del self.__db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == key:
+                return self.__db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return self.db_modules_id_index.has_key(key)
+    
+    def __get_db_connections(self):
+        return self.__db_connections
+    def __set_db_connections(self, connections):
+        self.__db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self.__db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == connection.db_id:
+                self.__db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self.__db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == connection.db_id:
+                del self.__db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == key:
+                return self.__db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return self.db_connections_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def __get_db_others(self):
+        return self.__db_others
+    def __set_db_others(self, others):
+        self.__db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self.__db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self.__db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                self.__db_others[i] = other
+                found = True
+                break
+        if not found:
+            self.__db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                del self.__db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == key:
+                return self.__db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return self.db_others_id_index.has_key(key)
+    
+    def __get_db_abstractionRefs(self):
+        return self.__db_abstractionRefs
+    def __set_db_abstractionRefs(self, abstractionRefs):
+        self.__db_abstractionRefs = abstractionRefs
+        self.is_dirty = True
+    db_abstractionRefs = property(__get_db_abstractionRefs, __set_db_abstractionRefs)
+    def db_get_abstractionRefs(self):
+        return self.__db_abstractionRefs
+    def db_add_abstractionRef(self, abstractionRef):
+        self.is_dirty = True
+        self.__db_abstractionRefs.append(abstractionRef)
+        self.db_abstractionRefs_id_index[abstractionRef.db_id] = abstractionRef
+    def db_change_abstractionRef(self, abstractionRef):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_abstractionRefs)):
+            if self.__db_abstractionRefs[i].db_id == abstractionRef.db_id:
+                self.__db_abstractionRefs[i] = abstractionRef
+                found = True
+                break
+        if not found:
+            self.__db_abstractionRefs.append(abstractionRef)
+        self.db_abstractionRefs_id_index[abstractionRef.db_id] = abstractionRef
+    def db_delete_abstractionRef(self, abstractionRef):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_abstractionRefs)):
+            if self.__db_abstractionRefs[i].db_id == abstractionRef.db_id:
+                del self.__db_abstractionRefs[i]
+                break
+        del self.db_abstractionRefs_id_index[abstractionRef.db_id]
+    def db_get_abstractionRef(self, key):
+        for i in xrange(len(self.__db_abstractionRefs)):
+            if self.__db_abstractionRefs[i].db_id == key:
+                return self.__db_abstractionRefs[i]
+        return None
+    def db_get_abstractionRef_by_id(self, key):
+        return self.db_abstractionRefs_id_index[key]
+    def db_has_abstractionRef_with_id(self, key):
+        return self.db_abstractionRefs_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstractionRef(object):
+
+    vtType = 'abstractionRef'
+
+    def __init__(self, id=None, abstraction_id=None, version=None, location=None):
+        self.__db_id = id
+        self.__db_abstraction_id = abstraction_id
+        self.__db_version = version
+        self.__db_location = location
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAbstractionRef()
+        cp.db_id = self.db_id
+        cp.db_abstraction_id = self.db_abstraction_id
+        cp.db_version = self.db_version
+        cp.db_location = self.db_location
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstractionRef()
+        cp.db_id = self.db_id
+        cp.db_abstraction_id = self.db_abstraction_id
+        cp.db_version = self.db_version
+        if self.db_location is not None:
+            cp.db_location = self.db_location.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_abstraction_id(self):
+        return self.__db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        self.__db_location = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAnnotation()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None, data=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_oldObjId = oldObjId
+        self.__db_newObjId = newObjId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.__db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBChange()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_oldObjId = self.db_oldObjId
+        cp.db_newObjId = self.db_newObjId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        cp.db_data = self.db_data
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_oldObjId = self.db_oldObjId
+        cp.db_newObjId = self.db_newObjId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        if self.db_data is not None:
+            cp.db_data = self.db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and id_remap.has_key((self.db_what, self.db_oldObjId)):
+                cp.db_oldObjId = id_remap[(self.db_what, self.db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and id_remap.has_key((self.db_what, self.db_newObjId)):
+                cp.db_newObjId = id_remap[(self.db_what, self.db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self.__db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self.__db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self.__db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self.__db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        self.__db_data = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_val = val
+        self.__db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBParameter()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_val = self.db_val
+        cp.db_alias = self.db_alias
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_val = self.db_val
+        cp.db_alias = self.db_alias
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_val(self):
+        return self.__db_val
+    def __set_db_val(self, val):
+        self.__db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self.__db_val = val
+    def db_change_val(self, val):
+        self.__db_val = val
+    def db_delete_val(self, val):
+        self.__db_val = None
+    
+    def __get_db_alias(self):
+        return self.__db_alias
+    def __set_db_alias(self, alias):
+        self.__db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self.__db_alias = alias
+    def db_change_alias(self, alias):
+        self.__db_alias = alias
+    def db_delete_alias(self, alias):
+        self.__db_alias = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self.__db_id = id
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self.__db_ports = []
+        else:
+            self.__db_ports = ports
+            for v in self.__db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBConnection()
+        cp.db_id = self.db_id
+        if self.db_ports is None:
+            cp.db_ports = None
+        else:
+            cp.db_ports = [copy.copy(v) for v in self.db_ports]
+            for v in cp.__db_ports:
+                cp.db_ports_id_index[v.db_id] = v
+                cp.db_ports_type_index[v.db_type] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection()
+        cp.db_id = self.db_id
+        if self.db_ports is None:
+            cp.db_ports = []
+        else:
+            cp.db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_ports:
+            cp.db_ports_id_index[v.db_id] = v
+            cp.db_ports_type_index[v.db_type] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ports(self):
+        return self.__db_ports
+    def __set_db_ports(self, ports):
+        self.__db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self.__db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self.__db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                self.__db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self.__db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                del self.__db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == key:
+                return self.__db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return self.db_ports_id_index.has_key(key)
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return self.db_ports_type_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None, operations=None):
+        self.__db_id = id
+        self.__db_prevId = prevId
+        self.__db_date = date
+        self.__db_session = session
+        self.__db_user = user
+        self.__db_prune = prune
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_operations_id_index = {}
+        if operations is None:
+            self.__db_operations = []
+        else:
+            self.__db_operations = operations
+            for v in self.__db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBAction()
+        cp.db_id = self.db_id
+        cp.db_prevId = self.db_prevId
+        cp.db_date = self.db_date
+        cp.db_session = self.db_session
+        cp.db_user = self.db_user
+        cp.db_prune = self.db_prune
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+            for v in cp.__db_annotations:
+                cp.db_annotations_id_index[v.db_id] = v
+                cp.db_annotations_key_index[v.db_key] = v
+        if self.db_operations is None:
+            cp.db_operations = None
+        else:
+            cp.db_operations = [copy.copy(v) for v in self.db_operations]
+            for v in cp.__db_operations:
+                cp.db_operations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction()
+        cp.db_id = self.db_id
+        cp.db_prevId = self.db_prevId
+        cp.db_date = self.db_date
+        cp.db_session = self.db_session
+        cp.db_user = self.db_user
+        cp.db_prune = self.db_prune
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_operations is None:
+            cp.db_operations = []
+        else:
+            cp.db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_operations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        for v in cp.__db_operations:
+            cp.db_operations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_prevId(self):
+        return self.__db_prevId
+    def __set_db_prevId(self, prevId):
+        self.__db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self.__db_prevId = None
+    
+    def __get_db_date(self):
+        return self.__db_date
+    def __set_db_date(self, date):
+        self.__db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self.__db_date = date
+    def db_change_date(self, date):
+        self.__db_date = date
+    def db_delete_date(self, date):
+        self.__db_date = None
+    
+    def __get_db_session(self):
+        return self.__db_session
+    def __set_db_session(self, session):
+        self.__db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self.__db_session = session
+    def db_change_session(self, session):
+        self.__db_session = session
+    def db_delete_session(self, session):
+        self.__db_session = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_prune(self):
+        return self.__db_prune
+    def __set_db_prune(self, prune):
+        self.__db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self.__db_prune = prune
+    def db_change_prune(self, prune):
+        self.__db_prune = prune
+    def db_delete_prune(self, prune):
+        self.__db_prune = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def __get_db_operations(self):
+        return self.__db_operations
+    def __set_db_operations(self, operations):
+        self.__db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self.__db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self.__db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                self.__db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self.__db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                del self.__db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == key:
+                return self.__db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return self.db_operations_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBDelete()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and id_remap.has_key((self.db_what, self.db_objectId)):
+                cp.db_objectId = id_remap[(self.db_what, self.db_objectId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, version=None, name=None, dbHost=None, dbPort=None, dbName=None, actions=None, tags=None, abstractions=None):
+        self.__db_id = id
+        self.__db_version = version
+        self.__db_name = name
+        self.__db_dbHost = dbHost
+        self.__db_dbPort = dbPort
+        self.__db_dbName = dbName
+        self.db_actions_id_index = {}
+        if actions is None:
+            self.__db_actions = []
+        else:
+            self.__db_actions = actions
+            for v in self.__db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = []
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self.__db_abstractions = []
+        else:
+            self.__db_abstractions = abstractions
+            for v in self.__db_abstractions:
+                self.db_abstractions_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBVistrail()
+        cp.db_id = self.db_id
+        cp.db_version = self.db_version
+        cp.db_name = self.db_name
+        cp.db_dbHost = self.db_dbHost
+        cp.db_dbPort = self.db_dbPort
+        cp.db_dbName = self.db_dbName
+        if self.db_actions is None:
+            cp.db_actions = None
+        else:
+            cp.db_actions = [copy.copy(v) for v in self.db_actions]
+            for v in cp.__db_actions:
+                cp.db_actions_id_index[v.db_id] = v
+        if self.db_tags is None:
+            cp.db_tags = None
+        else:
+            cp.db_tags = [copy.copy(v) for v in self.db_tags]
+            for v in cp.__db_tags:
+                cp.db_tags_id_index[v.db_id] = v
+                cp.db_tags_name_index[v.db_name] = v
+        if self.db_abstractions is None:
+            cp.db_abstractions = None
+        else:
+            cp.db_abstractions = [copy.copy(v) for v in self.db_abstractions]
+            for v in cp.__db_abstractions:
+                cp.db_abstractions_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail()
+        cp.db_id = self.db_id
+        cp.db_version = self.db_version
+        cp.db_name = self.db_name
+        cp.db_dbHost = self.db_dbHost
+        cp.db_dbPort = self.db_dbPort
+        cp.db_dbName = self.db_dbName
+        if self.db_actions is None:
+            cp.db_actions = []
+        else:
+            cp.db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_actions]
+        if self.db_tags is None:
+            cp.db_tags = []
+        else:
+            cp.db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_tags]
+        if self.db_abstractions is None:
+            cp.db_abstractions = []
+        else:
+            cp.db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_abstractions]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_actions:
+            cp.db_actions_id_index[v.db_id] = v
+        for v in cp.__db_tags:
+            cp.db_tags_id_index[v.db_id] = v
+            cp.db_tags_name_index[v.db_name] = v
+        for v in cp.__db_abstractions:
+            cp.db_abstractions_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_abstractions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions:
+            if child.has_changes():
+                return True
+        for child in self.db_tags:
+            if child.has_changes():
+                return True
+        for child in self.db_abstractions:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_dbHost(self):
+        return self.__db_dbHost
+    def __set_db_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+        self.is_dirty = True
+    db_dbHost = property(__get_db_dbHost, __set_db_dbHost)
+    def db_add_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_change_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_delete_dbHost(self, dbHost):
+        self.__db_dbHost = None
+    
+    def __get_db_dbPort(self):
+        return self.__db_dbPort
+    def __set_db_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+        self.is_dirty = True
+    db_dbPort = property(__get_db_dbPort, __set_db_dbPort)
+    def db_add_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_change_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_delete_dbPort(self, dbPort):
+        self.__db_dbPort = None
+    
+    def __get_db_dbName(self):
+        return self.__db_dbName
+    def __set_db_dbName(self, dbName):
+        self.__db_dbName = dbName
+        self.is_dirty = True
+    db_dbName = property(__get_db_dbName, __set_db_dbName)
+    def db_add_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_change_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_delete_dbName(self, dbName):
+        self.__db_dbName = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                self.__db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                del self.__db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == key:
+                return self.__db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return self.db_actions_id_index.has_key(key)
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                self.__db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                del self.__db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == key:
+                return self.__db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return self.db_tags_id_index.has_key(key)
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def __get_db_abstractions(self):
+        return self.__db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self.__db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self.__db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                self.__db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                del self.__db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == key:
+                return self.__db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return self.db_abstractions_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, module_id=None, module_name=None, annotations=None):
+        self.__db_id = id
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_module_id = module_id
+        self.__db_module_name = module_name
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        cp = DBModuleExec()
+        cp.db_id = self.db_id
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_module_id = self.db_module_id
+        cp.db_module_name = self.db_module_name
+        if self.db_annotations is None:
+            cp.db_annotations = None
+        else:
+            cp.db_annotations = [copy.copy(v) for v in self.db_annotations]
+            for v in cp.__db_annotations:
+                cp.db_annotations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec()
+        cp.db_id = self.db_id
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_module_id = self.db_module_id
+        cp.db_module_name = self.db_module_name
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and id_remap.has_key(('module', self.db_module_id)):
+                cp.db_module_id = id_remap[('module', self.db_module_id)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_module_id(self):
+        return self.__db_module_id
+    def __set_db_module_id(self, module_id):
+        self.__db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self.__db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self.__db_module_name
+    def __set_db_module_name(self, module_name):
+        self.__db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self.__db_module_name = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
diff --git a/vistrails/db/versions/v0_7_0/domain/id_scope.py b/vistrails/db/versions/v0_7_0/domain/id_scope.py
new file mode 100644
index 0000000..c510efa
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/domain/id_scope.py
@@ -0,0 +1,76 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]
+        if self.ids.has_key(objType):
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        else:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]        
+        if not self.ids.has_key(objType) or self.ids[objType] <= beginId:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_7_0/domain/vistrail.py b/vistrails/db/versions/v0_7_0/domain/vistrail.py
new file mode 100644
index 0000000..4fdb6e2
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/domain/vistrail.py
@@ -0,0 +1,46 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation'})
+        self.idScope.setBeginId('action', 1)
diff --git a/vistrails/db/versions/v0_7_0/domain/workflow.py b/vistrails/db/versions/v0_7_0/domain/workflow.py
new file mode 100644
index 0000000..20dacf1
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/domain/workflow.py
@@ -0,0 +1,122 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1)
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.objects = {}
+        for (child, _, _) in cp.db_children():
+            cp.addToIndex(child)
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    def addToIndex(self, object):
+        self.objects[(object.vtType, object.getPrimaryKey())] = object
+
+    def deleteFromIndex(self, object):
+        del self.objects[(object.vtType, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_add_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_change_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_change_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_delete_object(self, objId, objType, 
+                         parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_get_%s' % objType
+        try:
+            object = getattr(parentObj, funname)(objId)
+        except AttributeError:
+            attr_name = 'db_%s' % objType
+            object = getattr(parentObj, attr_name)
+        funname = 'db_delete_%s' % objType
+        getattr(parentObj, funname)(object)
+        self.deleteFromIndex(object)
diff --git a/vistrails/db/versions/v0_7_0/persistence/__init__.py b/vistrails/db/versions/v0_7_0/persistence/__init__.py
new file mode 100644
index 0000000..0a10c9d
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/__init__.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+import xml.io
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def open_from_xml(self, filename, vtType, tree=None):
+        return xml.io.open_from_xml(filename, vtType, self['xml'])
+
+    def save_to_xml(self, obj, filename):
+        xml.io.save_to_xml(obj, filename, self['xml'])
+
+    def serialize(self, obj):
+        return xml.io.serialize(obj, self['xml'])
+
+    def unserialize(self, str, type):
+        return xml.io.unserialize(str, type, self['xml'])
diff --git a/vistrails/db/versions/v0_7_0/persistence/sql/__init__.py b/vistrails/db/versions/v0_7_0/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_7_0/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_7_0/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..9b987f0
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/sql/auto_gen.py
@@ -0,0 +1,4104 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_7_0.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[5], 'long', 'int')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_vistrailId = vistrailId
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'type', 'spec', 'id']
+        table = 'port_spec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[3], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            portSpec = DBPortSpec(id=id,
+                                  name=name,
+                                  type=type,
+                                  spec=spec)
+            portSpec.is_dirty = False
+            list.append(portSpec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'port_spec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_spec is not None:
+                columnMap['spec'] = \
+                    self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'cache', 'abstraction', 'name', 'package', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            abstraction = self.convertFromDB(row[2], 'long', 'int')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              abstraction=abstraction,
+                              name=name,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_vistrailId = vistrailId
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'abstraction', 'name', 'package', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_abstraction') and obj.db_abstraction is not None:
+            columnMap['abstraction'] = \
+                self.convertToDB(obj.db_abstraction, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['cache', 'abstraction', 'name', 'package', 'version', 'id']
+        table = 'module'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            cache = self.convertFromDB(row[0], 'int', 'int')
+            abstraction = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[3], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+            if len(res) > 0:
+                location = res[0]
+            else:
+                location = None
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+            functions = res
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            discStr = self.convertToDB('module','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+            portSpecs = res
+            
+            module = DBModule(id=id,
+                              cache=cache,
+                              abstraction=abstraction,
+                              name=name,
+                              package=package,
+                              version=version,
+                              location=location,
+                              functions=functions,
+                              annotations=annotations,
+                              portSpecs=portSpecs)
+            module.is_dirty = False
+            list.append(module)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'module'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_cache is not None:
+                columnMap['cache'] = \
+                    self.convertToDB(obj.db_cache, 'int', 'int')
+            if obj.db_abstraction is not None:
+                columnMap['abstraction'] = \
+                    self.convertToDB(obj.db_abstraction, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_package is not None:
+                columnMap['package'] = \
+                    self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        child = obj.db_location
+        if child is not None:
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_functions:
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('module','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_portSpecs:
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[3], 'long', 'int')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_parentType = parentType
+            tag.db_vistrailId = vistrailId
+            tag.db_parent = parent
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_tag(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'tag'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'tag'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            tag = DBTag(id=id,
+                        name=name)
+            tag.is_dirty = False
+            list.append(tag)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'tag'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_vistrailId = vistrailId
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['type', 'moduleId', 'moduleName', 'name', 'spec', 'id']
+        table = 'port'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            type = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[1], 'long', 'int')
+            moduleName = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[4], 'str', 'varchar(4095)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            port = DBPort(id=id,
+                          type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec)
+            port.is_dirty = False
+            list.append(port)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'port'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_moduleId is not None:
+                columnMap['moduleId'] = \
+                    self.convertToDB(obj.db_moduleId, 'long', 'int')
+            if obj.db_moduleName is not None:
+                columnMap['moduleName'] = \
+                    self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_spec is not None:
+                columnMap['spec'] = \
+                    self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'vt_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            vistrailId = self.convertFromDB(row[1], 'long', 'int')
+            
+            log = DBLog(id=id)
+            log.db_vistrailId = vistrailId
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'vt_id']
+        table = 'log_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['id']
+        table = 'log_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'log_id': keyStr}
+            res = self.getDao('workflow_exec').fromSQL(db, None, foreignKey, globalProps)
+            workflow_execs = res
+            
+            foreignKey = {'log_id': keyStr}
+            res = self.getDao('machine').fromSQL(db, None, foreignKey, globalProps)
+            machines = res
+            
+            log = DBLog(id=id,
+                        workflow_execs=workflow_execs,
+                        machines=machines)
+            log.is_dirty = False
+            list.append(log)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'log_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'log_id': keyStr}
+        for child in obj.db_workflow_execs:
+            self.getDao('workflow_exec').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = {'log_id': keyStr}
+        for child in obj.db_machines:
+            self.getDao('machine').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'module_exec_id']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            module_execs = self.convertFromDB(row[8], 'long', 'int')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'module_exec_id']
+        table = 'machine'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_module_exec') and obj.db_module_exec is not None:
+            columnMap['module_exec_id'] = \
+                self.convertToDB(obj.db_module_execs, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_machine_id = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'os', 'architecture', 'processor', 'ram', 'id']
+        table = 'machine'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[4], 'int', 'int')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'machine_id': keyStr}
+            res = self.getDao('module_exec').fromSQL(db, None, foreignKey, globalProps)
+            module_execs = res
+            
+            machine = DBMachine(id=id,
+                                name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                module_execs=module_execs)
+            machine.is_dirty = False
+            list.append(machine)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'machine'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_os is not None:
+                columnMap['os'] = \
+                    self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+            if obj.db_architecture is not None:
+                columnMap['architecture'] = \
+                    self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+            if obj.db_processor is not None:
+                columnMap['processor'] = \
+                    self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+            if obj.db_ram is not None:
+                columnMap['ram'] = \
+                    self.convertToDB(obj.db_ram, 'int', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'machine_id': keyStr}
+        for child in obj.db_module_execs:
+            self.getDao('module_exec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_vistrailId = vistrailId
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'add_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'object_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'add_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[1], 'long', 'int')
+            parentObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjType = self.convertFromDB(row[3], 'str', 'char(16)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            data = None
+            if what == 'module':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'location':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'annotation':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'function':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'connection':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'port':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'parameter':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'portSpec':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'abstractionRef':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('abstractionRef').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'other':
+                discStr = self.convertToDB('add','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            
+            add = DBAdd(id=id,
+                        what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        data=data)
+            add.is_dirty = False
+            list.append(add)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'add_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_objectId is not None:
+                columnMap['object_id'] = \
+                    self.convertToDB(obj.db_objectId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        child = obj.db_data
+        if child.vtType == 'module':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'location':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'annotation':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'function':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'connection':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'port':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'parameter':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'portSpec':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'abstractionRef':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('abstractionRef').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'other':
+            discStr = self.convertToDB('add','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'okey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_vistrailId = vistrailId
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['okey', 'value', 'id']
+        table = 'other'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            key = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            other = DBOther(id=id,
+                            key=key,
+                            value=value)
+            other.is_dirty = False
+            list.append(other)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'other'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_key is not None:
+                columnMap['okey'] = \
+                    self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+            if obj.db_value is not None:
+                columnMap['value'] = \
+                    self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'x', 'y', 'parent_type', 'vt_id', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_vistrailId = vistrailId
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'vt_id', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['x', 'y', 'id']
+        table = 'location'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            x = self.convertFromDB(row[0], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            location = DBLocation(id=id,
+                                  x=x,
+                                  y=y)
+            location.is_dirty = False
+            list.append(location)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'location'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_x is not None:
+                columnMap['x'] = \
+                    self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+            if obj.db_y is not None:
+                columnMap['y'] = \
+                    self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'vt_id']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[4], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[5], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[6], 'long', 'int')
+            parent_type = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[8], 'long', 'int')
+            name = self.convertFromDB(row[9], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[10], 'long', 'int')
+            vistrailId = self.convertFromDB(row[11], 'long', 'int')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_vistrailId = vistrailId
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'vt_id']
+        table = 'workflow_exec'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_workflow_exec = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'id']
+        table = 'workflow_exec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            user = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[3], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[4], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[5], 'long', 'int')
+            parent_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[7], 'long', 'int')
+            name = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[9], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            foreignKey = {'wf_exec_id': keyStr}
+            res = self.getDao('module_exec').fromSQL(db, None, foreignKey, globalProps)
+            module_execs = res
+            
+            workflow_exec = DBWorkflowExec(id=id,
+                                           user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           module_execs=module_execs)
+            workflow_exec.is_dirty = False
+            list.append(workflow_exec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'workflow_exec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_user is not None:
+                columnMap['user'] = \
+                    self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+            if obj.db_ip is not None:
+                columnMap['ip'] = \
+                    self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+            if obj.db_vt_version is not None:
+                columnMap['vt_version'] = \
+                    self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+            if obj.db_ts_start is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+            if obj.db_ts_end is not None:
+                columnMap['ts_end'] = \
+                    self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+            if obj.db_parent_id is not None:
+                columnMap['parent_id'] = \
+                    self.convertToDB(obj.db_parent_id, 'long', 'int')
+            if obj.db_parent_type is not None:
+                columnMap['parent_type'] = \
+                    self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+            if obj.db_parent_version is not None:
+                columnMap['parent_version'] = \
+                    self.convertToDB(obj.db_parent_version, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        foreignKey = {'wf_exec_id': keyStr}
+        for child in obj.db_module_execs:
+            self.getDao('module_exec').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'pos', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_vistrailId = vistrailId
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['pos', 'name', 'id']
+        table = 'function'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            pos = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('function','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+            parameters = res
+            
+            function = DBFunction(id=id,
+                                  pos=pos,
+                                  name=name,
+                                  parameters=parameters)
+            function.is_dirty = False
+            list.append(function)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'function'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_pos is not None:
+                columnMap['pos'] = \
+                    self.convertToDB(obj.db_pos, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('function','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_parameters:
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'vt_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            
+            abstraction = DBAbstraction(name=name,
+                                        id=id)
+            abstraction.db_vistrail = vistrail
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('vistrail', obj.db_vistrail)]
+        p.db_add_abstraction(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'vt_id']
+        table = 'abstraction'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'abstraction'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('abstraction','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('action').fromSQL(db, None, foreignKey, globalProps)
+            actions = res
+            
+            discStr = self.convertToDB('abstraction','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('tag').fromSQL(db, None, foreignKey, globalProps)
+            tags = res
+            
+            abstraction = DBAbstraction(id=id,
+                                        name=name,
+                                        actions=actions,
+                                        tags=tags)
+            abstraction.is_dirty = False
+            list.append(abstraction)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'abstraction'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('abstraction','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_actions:
+            self.getDao('action').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('abstraction','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_tags:
+            self.getDao('tag').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'name', 'vt_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrailId = self.convertFromDB(row[2], 'long', 'int')
+            
+            workflow = DBWorkflow(name=name,
+                                  id=id)
+            workflow.db_vistrailId = vistrailId
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'vt_id']
+        table = 'workflow'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_abstractionRefs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['name', 'id']
+        table = 'workflow'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[1], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+            modules = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+            connections = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+            others = res
+            
+            discStr = self.convertToDB('workflow','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('abstractionRef').fromSQL(db, None, foreignKey, globalProps)
+            abstractionRefs = res
+            
+            workflow = DBWorkflow(id=id,
+                                  name=name,
+                                  modules=modules,
+                                  connections=connections,
+                                  annotations=annotations,
+                                  others=others,
+                                  abstractionRefs=abstractionRefs)
+            workflow.is_dirty = False
+            list.append(workflow)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'workflow'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_modules:
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_connections:
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_others:
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('workflow','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_abstractionRefs:
+            self.getDao('abstractionRef').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAbstractionRefSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'abstraction_id', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            abstraction_id = self.convertFromDB(row[1], 'long', 'int')
+            version = self.convertFromDB(row[2], 'long', 'int')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            abstractionRef = DBAbstractionRef(abstraction_id=abstraction_id,
+                                              version=version,
+                                              id=id)
+            abstractionRef.db_parentType = parentType
+            abstractionRef.db_vistrailId = vistrailId
+            abstractionRef.db_parent = parent
+            abstractionRef.is_dirty = False
+            res[('abstractionRef', id)] = abstractionRef
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_abstractionRef(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'abstraction_id', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['abstraction_id', 'version', 'id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            abstraction_id = self.convertFromDB(row[0], 'long', 'int')
+            version = self.convertFromDB(row[1], 'long', 'int')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('abstractionRef','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+            if len(res) > 0:
+                location = res[0]
+            else:
+                location = None
+            
+            abstractionRef = DBAbstractionRef(id=id,
+                                              abstraction_id=abstraction_id,
+                                              version=version,
+                                              location=location)
+            abstractionRef.is_dirty = False
+            list.append(abstractionRef)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'abstraction_ref'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_abstraction_id is not None:
+                columnMap['abstraction_id'] = \
+                    self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'long', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('abstractionRef','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        child = obj.db_location
+        if child is not None:
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'akey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_vistrailId = vistrailId
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['akey', 'value', 'id']
+        table = 'annotation'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            key = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            annotation = DBAnnotation(id=id,
+                                      key=key,
+                                      value=value)
+            annotation.is_dirty = False
+            list.append(annotation)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'annotation'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_key is not None:
+                columnMap['akey'] = \
+                    self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+            if obj.db_value is not None:
+                columnMap['value'] = \
+                    self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_vistrailId = vistrailId
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'change_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'change_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[1], 'long', 'int')
+            newObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            data = None
+            if what == 'module':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('module').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'location':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('location').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'annotation':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'function':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('function').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'connection':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('connection').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'port':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'parameter':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('parameter').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'portSpec':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('portSpec').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'abstractionRef':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('abstractionRef').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            elif what == 'other':
+                discStr = self.convertToDB('change','str','char(16)')
+                foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+                res = self.getDao('other').fromSQL(db, None, foreignKey, globalProps)
+                data = res[0]
+            
+            change = DBChange(id=id,
+                              what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              data=data)
+            change.is_dirty = False
+            list.append(change)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'change_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_oldObjId is not None:
+                columnMap['old_obj_id'] = \
+                    self.convertToDB(obj.db_oldObjId, 'long', 'int')
+            if obj.db_newObjId is not None:
+                columnMap['new_obj_id'] = \
+                    self.convertToDB(obj.db_newObjId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        child = obj.db_data
+        if child.vtType == 'module':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('module').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'location':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('location').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'annotation':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'function':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('function').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'connection':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('connection').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'port':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'parameter':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('parameter').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'portSpec':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('portSpec').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'abstractionRef':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('abstractionRef').toSQL(db, child, foreignKey, globalProps)
+        elif child.vtType == 'other':
+            discStr = self.convertToDB('change','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            self.getDao('other').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'vt_id', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_vistrailId = vistrailId
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'vt_id', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['pos', 'name', 'type', 'val', 'alias', 'id']
+        table = 'parameter'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            pos = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[3], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            parameter = DBParameter(id=id,
+                                    pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias)
+            parameter.is_dirty = False
+            list.append(parameter)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'parameter'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_pos is not None:
+                columnMap['pos'] = \
+                    self.convertToDB(obj.db_pos, 'long', 'int')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if obj.db_type is not None:
+                columnMap['type'] = \
+                    self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+            if obj.db_val is not None:
+                columnMap['val'] = \
+                    self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+            if obj.db_alias is not None:
+                columnMap['alias'] = \
+                    self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'parent_type', 'vt_id', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[2], 'long', 'int')
+            parent = self.convertFromDB(row[3], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_vistrailId = vistrailId
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'vt_id', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['id']
+        table = 'connection_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('connection','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('port').fromSQL(db, None, foreignKey, globalProps)
+            ports = res
+            
+            connection = DBConnection(id=id,
+                                      ports=ports)
+            connection.is_dirty = False
+            list.append(connection)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'connection_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('connection','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_ports:
+            self.getDao('port').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'vt_id', 'parent_id']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_parentType = parentType
+            action.db_vistrailId = vistrailId
+            action.db_parent = parent
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_action(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'vt_id', 'parent_id']
+        table = 'action'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['prev_id', 'date', 'session', 'user', 'prune', 'id']
+        table = 'action'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            prevId = self.convertFromDB(row[0], 'long', 'int')
+            date = self.convertFromDB(row[1], 'datetime', 'datetime')
+            session = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            user = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[4], 'int', 'int')
+            id = self.convertFromDB(row[5], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('action','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            operations = []
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('add').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('delete').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            foreignKey = {'action_id': keyStr}
+            res = self.getDao('change').fromSQL(db, None, foreignKey, globalProps)
+            operations.extend(res)
+            
+            action = DBAction(id=id,
+                              prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              annotations=annotations,
+                              operations=operations)
+            action.is_dirty = False
+            list.append(action)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'action'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_prevId is not None:
+                columnMap['prev_id'] = \
+                    self.convertToDB(obj.db_prevId, 'long', 'int')
+            if obj.db_date is not None:
+                columnMap['date'] = \
+                    self.convertToDB(obj.db_date, 'datetime', 'datetime')
+            if obj.db_session is not None:
+                columnMap['session'] = \
+                    self.convertToDB(obj.db_session, 'str', 'varchar(1023)')
+            if obj.db_user is not None:
+                columnMap['user'] = \
+                    self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+            if obj.db_prune is not None:
+                columnMap['prune'] = \
+                    self.convertToDB(obj.db_prune, 'int', 'int')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('action','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+        for child in obj.db_operations:
+            if child.vtType == 'add':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('add').toSQL(db, child, foreignKey, globalProps)
+            elif child.vtType == 'delete':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('delete').toSQL(db, child, foreignKey, globalProps)
+            elif child.vtType == 'change':
+                foreignKey = {'action_id' : keyStr}
+                self.getDao('change').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_vistrailId = vistrailId
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'delete_tbl'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['what', 'object_id', 'par_obj_id', 'par_obj_type', 'id']
+        table = 'delete_tbl'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            what = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[1], 'long', 'int')
+            parentObjId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjType = self.convertFromDB(row[3], 'str', 'char(16)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            delete = DBDelete(id=id,
+                              what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType)
+            delete.is_dirty = False
+            list.append(delete)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'delete_tbl'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_what is not None:
+                columnMap['what'] = \
+                    self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+            if obj.db_objectId is not None:
+                columnMap['object_id'] = \
+                    self.convertToDB(obj.db_objectId, 'long', 'int')
+            if obj.db_parentObjId is not None:
+                columnMap['par_obj_id'] = \
+                    self.convertToDB(obj.db_parentObjId, 'long', 'int')
+            if obj.db_parentObjType is not None:
+                columnMap['par_obj_type'] = \
+                    self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'version', 'name']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['vt_id'] = self.convertToDB(id, 'long', 'int')
+            version = self.convertFromDB(row[1], 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            
+            vistrail = DBVistrail(version=version,
+                                  name=name,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'version', 'name']
+        table = 'vistrail'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        global_props['vt_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_abstractions:
+            child.db_vistrail = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['version', 'name', 'id']
+        table = 'vistrail'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            version = self.convertFromDB(row[0], 'str', 'char(16)')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[2], 'long', 'int')
+            if globalProps is None:
+                globalProps = {}
+            globalProps['vt_id'] = self.convertToDB(id, 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('vistrail','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('action').fromSQL(db, None, foreignKey, globalProps)
+            actions = res
+            
+            discStr = self.convertToDB('vistrail','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('tag').fromSQL(db, None, foreignKey, globalProps)
+            tags = res
+            
+            foreignKey = {'vt_id': keyStr}
+            res = self.getDao('abstraction').fromSQL(db, None, foreignKey, globalProps)
+            abstractions = res
+            
+            vistrail = DBVistrail(id=id,
+                                  version=version,
+                                  name=name,
+                                  actions=actions,
+                                  tags=tags,
+                                  abstractions=abstractions)
+            vistrail.is_dirty = False
+            list.append(vistrail)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'vistrail'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_version is not None:
+                columnMap['version'] = \
+                    self.convertToDB(obj.db_version, 'str', 'char(16)')
+            if obj.db_name is not None:
+                columnMap['name'] = \
+                    self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                if obj.db_id is not None:
+                    columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+            if obj.db_id is None:
+                obj.db_id = lastId
+                keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            if globalProps is None:
+                globalProps = {}
+            globalProps['vt_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+
+        discStr = self.convertToDB('vistrail','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_actions:
+            self.getDao('action').toSQL(db, child, foreignKey, globalProps)
+        
+        discStr = self.convertToDB('vistrail','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_tags:
+            self.getDao('tag').toSQL(db, child, foreignKey, globalProps)
+        
+        foreignKey = {'vt_id': keyStr}
+        for child in obj.db_abstractions:
+            self.getDao('abstraction').toSQL(db, child, foreignKey, globalProps)
+        
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props):
+        columns = ['id', 'ts_start', 'ts_end', 'module_id', 'module_name', 'machine_id', 'wf_exec_id', 'vt_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            module_id = self.convertFromDB(row[3], 'long', 'int')
+            module_name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            machine_id = self.convertFromDB(row[5], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[6], 'long', 'int')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       id=id)
+            module_exec.db_machine_id = machine_id
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_vistrailId = vistrailId
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('machine', obj.db_machine_id)]
+        p.db_add_module_exec(obj)
+        p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+        p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'module_id', 'module_name', 'machine_id', 'wf_exec_id', 'vt_id']
+        table = 'module_exec'
+        whereMap = {}
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def fromSQL(self, db, id=None, foreignKey=None, globalProps=None):
+        columns = ['ts_start', 'ts_end', 'module_id', 'module_name', 'id']
+        table = 'module_exec'
+        whereMap = {}
+        orderBy = 'id'
+
+        if id is not None:
+            keyStr = self.convertToDB(id, 'long', 'int')
+            whereMap['id'] = keyStr
+        elif foreignKey is not None:
+            whereMap.update(foreignKey)
+        elif globalProps is None:
+            print '***ERROR: need to specify id or foreign key info'
+        if globalProps is not None:
+            whereMap.update(globalProps)
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy)
+        data = self.executeSQL(db, dbCommand, True)
+        list = []
+        for row in data:
+            ts_start = self.convertFromDB(row[0], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[1], 'datetime', 'datetime')
+            module_id = self.convertFromDB(row[2], 'long', 'int')
+            module_name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            id = self.convertFromDB(row[4], 'long', 'int')
+            keyStr = self.convertToDB(id,'long','int')
+
+            discStr = self.convertToDB('module_exec','str','char(16)')
+            foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+            res = self.getDao('annotation').fromSQL(db, None, foreignKey, globalProps)
+            annotations = res
+            
+            module_exec = DBModuleExec(id=id,
+                                       ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       annotations=annotations)
+            module_exec.is_dirty = False
+            list.append(module_exec)
+
+        return list
+
+    def toSQL(self, db, obj, foreignKey=None, globalProps=None):
+        keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if obj.is_dirty:
+            columns = ['id']
+            table = 'module_exec'
+            whereMap = {}
+            columnMap = {}
+
+            whereMap['id'] = keyStr
+            if globalProps is not None:
+                whereMap.update(globalProps)
+            if obj.db_ts_start is not None:
+                columnMap['ts_start'] = \
+                    self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+            if obj.db_ts_end is not None:
+                columnMap['ts_end'] = \
+                    self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+            if obj.db_module_id is not None:
+                columnMap['module_id'] = \
+                    self.convertToDB(obj.db_module_id, 'long', 'int')
+            if obj.db_module_name is not None:
+                columnMap['module_name'] = \
+                    self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+            if foreignKey is not None:
+                columnMap.update(foreignKey)
+
+            dbCommand = self.createSQLSelect(table, columns, whereMap)
+            data = self.executeSQL(db, dbCommand, True)
+            if len(data) <= 0:
+                columnMap['id'] = keyStr
+                if globalProps is not None:
+                    columnMap.update(globalProps)
+                dbCommand = self.createSQLInsert(table, columnMap)
+            else:
+                dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+            lastId = self.executeSQL(db, dbCommand, False)
+        
+
+        discStr = self.convertToDB('module_exec','str','char(16)')
+        foreignKey = {'parent_id' : keyStr, 'parent_type': discStr}
+        for child in obj.db_annotations:
+            self.getDao('annotation').toSQL(db, child, foreignKey, globalProps)
+        
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_7_0/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_7_0/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..7f92a24
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/sql/sql_dao.py
@@ -0,0 +1,141 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return "'" + str(value).replace("'", "''") + "'"
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return "'" + value.isoformat() + "'"
+            elif type == 'datetime':
+                return "'" + value.strftime('%Y-%m-%d %H:%M:%S') + "'"
+            else:
+                return str(value)
+
+        return "''"
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        return dbCommand
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        valueStr = ', '.join(values)
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s)""" % \
+                    (table, columnStr, valueStr)
+        return dbCommand
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            setStr += '%s %s = %s' % (comma, column, value)
+            comma = ','
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """UPDATE %s SET %s WHERE %s""" % \
+                    (table, setStr, whereStr)
+        return dbCommand
+
+    def executeSQL(self, db, dbCommand, isFetch):
+        print 'db: %s' % dbCommand
+        data = None
+        cursor = db.cursor()
+        cursor.execute(dbCommand)
+        if isFetch:
+            data = cursor.fetchall()
+        else:
+            data = cursor.lastrowid
+        cursor.close()
+        return data
diff --git a/vistrails/db/versions/v0_7_0/persistence/xml/__init__.py b/vistrails/db/versions/v0_7_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_7_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_7_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..623548b
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/xml/auto_gen.py
@@ -0,0 +1,1778 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_7_0.domain import *
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'portSpec':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        spec = self.convertFromStr(self.getAttribute(node, 'spec'), 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, doc, node):
+        if node is None:
+            node = doc.createElement('portSpec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.setAttribute('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.setAttribute('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'module':
+            return None
+        
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        cache = self.convertFromStr(self.getAttribute(node, 'cache'), 'int')
+        abstraction = self.convertFromStr(self.getAttribute(node, 'abstraction'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        package = self.convertFromStr(self.getAttribute(node, 'package'), 'str')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'str')
+        
+        location = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'location':
+                location = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'function':
+                function = self.getDao('function').fromXML(child)
+                functions.append(function)
+            elif child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeName == 'portSpec':
+                portSpec = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(portSpec)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       abstraction=abstraction,
+                       name=name,
+                       package=package,
+                       version=version,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, doc, node):
+        if node is None:
+            node = doc.createElement('module')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(module.db_id, 'long'))
+        node.setAttribute('cache',self.convertToStr(module.db_cache, 'int'))
+        node.setAttribute('abstraction',self.convertToStr(module.db_abstraction, 'long'))
+        node.setAttribute('name',self.convertToStr(module.db_name, 'str'))
+        node.setAttribute('package',self.convertToStr(module.db_package, 'str'))
+        node.setAttribute('version',self.convertToStr(module.db_version, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            if nodeMap.has_key(('location', location.db_id)):
+                childNode = nodeMap[('location', location.db_id)]
+                del nodeMap[('location', location.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(location, doc, childNode)
+        functions = module.db_functions
+        for function in functions:
+            if nodeMap.has_key(('function', function.db_id)):
+                childNode = nodeMap[('function', function.db_id)]
+                del nodeMap[('function', function.db_id)]
+            else:
+                childNode = doc.createElement('function')
+                node.appendChild(childNode)
+            self.getDao('function').toXML(function, doc, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            if nodeMap.has_key(('portSpec', portSpec.db_id)):
+                childNode = nodeMap[('portSpec', portSpec.db_id)]
+                del nodeMap[('portSpec', portSpec.db_id)]
+            else:
+                childNode = doc.createElement('portSpec')
+                node.appendChild(childNode)
+            self.getDao('portSpec').toXML(portSpec, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'tag':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, doc, node):
+        if node is None:
+            node = doc.createElement('tag')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(tag.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'port':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        moduleId = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        moduleName = self.convertFromStr(self.getAttribute(node, 'moduleName'), 'str')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        spec = self.convertFromStr(self.getAttribute(node, 'spec'), 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, doc, node):
+        if node is None:
+            node = doc.createElement('port')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(port.db_id, 'long'))
+        node.setAttribute('type',self.convertToStr(port.db_type, 'str'))
+        node.setAttribute('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.setAttribute('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.setAttribute('name',self.convertToStr(port.db_name, 'str'))
+        node.setAttribute('spec',self.convertToStr(port.db_spec, 'str'))
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'log':
+            return None
+        
+        workflow_execs = []
+        machines = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'workflowExec':
+                workflow_exec = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(workflow_exec)
+            elif child.nodeName == 'machine':
+                machine = self.getDao('machine').fromXML(child)
+                machines.append(machine)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBLog(id=id,
+                    workflow_execs=workflow_execs,
+                    machines=machines)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, doc, node):
+        if node is None:
+            node = doc.createElement('log')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(log.db_id, 'long'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            if nodeMap.has_key(('workflow_exec', workflow_exec.db_id)):
+                childNode = nodeMap[('workflow_exec', workflow_exec.db_id)]
+                del nodeMap[('workflow_exec', workflow_exec.db_id)]
+            else:
+                childNode = doc.createElement('workflow_exec')
+                node.appendChild(childNode)
+            self.getDao('workflow_exec').toXML(workflow_exec, doc, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            if nodeMap.has_key(('machine', machine.db_id)):
+                childNode = nodeMap[('machine', machine.db_id)]
+                del nodeMap[('machine', machine.db_id)]
+            else:
+                childNode = doc.createElement('machine')
+                node.appendChild(childNode)
+            self.getDao('machine').toXML(machine, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'machine':
+            return None
+        
+        module_execs = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        os = self.convertFromStr(self.getAttribute(node, 'os'), 'str')
+        architecture = self.convertFromStr(self.getAttribute(node, 'architecture'), 'str')
+        processor = self.convertFromStr(self.getAttribute(node, 'processor'), 'str')
+        ram = self.convertFromStr(self.getAttribute(node, 'ram'), 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram,
+                        module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, doc, node):
+        if node is None:
+            node = doc.createElement('machine')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(machine.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(machine.db_name, 'str'))
+        node.setAttribute('os',self.convertToStr(machine.db_os, 'str'))
+        node.setAttribute('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.setAttribute('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.setAttribute('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'add':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        objectId = self.convertFromStr(self.getAttribute(node, 'objectId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        data = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'module':
+                data = self.getDao('module').fromXML(child)
+            elif child.nodeName == 'location':
+                data = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'annotation':
+                data = self.getDao('annotation').fromXML(child)
+            elif child.nodeName == 'function':
+                data = self.getDao('function').fromXML(child)
+            elif child.nodeName == 'connection':
+                data = self.getDao('connection').fromXML(child)
+            elif child.nodeName == 'port':
+                data = self.getDao('port').fromXML(child)
+            elif child.nodeName == 'parameter':
+                data = self.getDao('parameter').fromXML(child)
+            elif child.nodeName == 'portSpec':
+                data = self.getDao('portSpec').fromXML(child)
+            elif child.nodeName == 'abstractionRef':
+                data = self.getDao('abstractionRef').fromXML(child)
+            elif child.nodeName == 'other':
+                data = self.getDao('other').fromXML(child)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAdd(id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType,
+                    data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, doc, node):
+        if node is None:
+            node = doc.createElement('add')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(add.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(add.db_what, 'str'))
+        node.setAttribute('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        data = add.db_data
+        if data.vtType == 'module':
+            if nodeMap.has_key(('module', data.db_id)):
+                childNode = nodeMap[('module', data.db_id)]
+                del nodeMap[('module', data.db_id)]
+            else:
+                childNode = doc.createElement('module')
+                node.appendChild(childNode)
+            self.getDao('module').toXML(data, doc, childNode)
+        elif data.vtType == 'location':
+            if nodeMap.has_key(('location', data.db_id)):
+                childNode = nodeMap[('location', data.db_id)]
+                del nodeMap[('location', data.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(data, doc, childNode)
+        elif data.vtType == 'annotation':
+            if nodeMap.has_key(('annotation', data.db_id)):
+                childNode = nodeMap[('annotation', data.db_id)]
+                del nodeMap[('annotation', data.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(data, doc, childNode)
+        elif data.vtType == 'function':
+            if nodeMap.has_key(('function', data.db_id)):
+                childNode = nodeMap[('function', data.db_id)]
+                del nodeMap[('function', data.db_id)]
+            else:
+                childNode = doc.createElement('function')
+                node.appendChild(childNode)
+            self.getDao('function').toXML(data, doc, childNode)
+        elif data.vtType == 'connection':
+            if nodeMap.has_key(('connection', data.db_id)):
+                childNode = nodeMap[('connection', data.db_id)]
+                del nodeMap[('connection', data.db_id)]
+            else:
+                childNode = doc.createElement('connection')
+                node.appendChild(childNode)
+            self.getDao('connection').toXML(data, doc, childNode)
+        elif data.vtType == 'port':
+            if nodeMap.has_key(('port', data.db_id)):
+                childNode = nodeMap[('port', data.db_id)]
+                del nodeMap[('port', data.db_id)]
+            else:
+                childNode = doc.createElement('port')
+                node.appendChild(childNode)
+            self.getDao('port').toXML(data, doc, childNode)
+        elif data.vtType == 'parameter':
+            if nodeMap.has_key(('parameter', data.db_id)):
+                childNode = nodeMap[('parameter', data.db_id)]
+                del nodeMap[('parameter', data.db_id)]
+            else:
+                childNode = doc.createElement('parameter')
+                node.appendChild(childNode)
+            self.getDao('parameter').toXML(data, doc, childNode)
+        elif data.vtType == 'portSpec':
+            if nodeMap.has_key(('portSpec', data.db_id)):
+                childNode = nodeMap[('portSpec', data.db_id)]
+                del nodeMap[('portSpec', data.db_id)]
+            else:
+                childNode = doc.createElement('portSpec')
+                node.appendChild(childNode)
+            self.getDao('portSpec').toXML(data, doc, childNode)
+        elif data.vtType == 'abstractionRef':
+            if nodeMap.has_key(('abstractionRef', data.db_id)):
+                childNode = nodeMap[('abstractionRef', data.db_id)]
+                del nodeMap[('abstractionRef', data.db_id)]
+            else:
+                childNode = doc.createElement('abstractionRef')
+                node.appendChild(childNode)
+            self.getDao('abstractionRef').toXML(data, doc, childNode)
+        elif data.vtType == 'other':
+            if nodeMap.has_key(('other', data.db_id)):
+                childNode = nodeMap[('other', data.db_id)]
+                del nodeMap[('other', data.db_id)]
+            else:
+                childNode = doc.createElement('other')
+                node.appendChild(childNode)
+            self.getDao('other').toXML(data, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'other':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        
+        value = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'value':
+                value = self.convertFromStr(child.firstChild.nodeValue,'str')
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, doc, node):
+        if node is None:
+            node = doc.createElement('other')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(other.db_id, 'long'))
+        node.setAttribute('key',self.convertToStr(other.db_key, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        if other.db_value is not None:
+            child = other.db_value
+            if nodeMap.has_key(('value',child.db_id)):
+                childNode = nodeMap[('value',child.db_id)]
+                del nodeMap[('value', child.db_id)]
+                textNode = childNode.firstChild
+                textNode.replaceWholeText(self.convertToStr(child, 'str'))
+            else:
+                childNode = doc.createElement('value')
+                node.appendChild(childNode)
+                textNode = doc.createTextNode(self.convertToStr(child, 'str'))
+                childNode.appendChild(textNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'location':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        x = self.convertFromStr(self.getAttribute(node, 'x'), 'float')
+        y = self.convertFromStr(self.getAttribute(node, 'y'), 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, doc, node):
+        if node is None:
+            node = doc.createElement('location')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(location.db_id, 'long'))
+        node.setAttribute('x',self.convertToStr(location.db_x, 'float'))
+        node.setAttribute('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'workflowExec':
+            return None
+        
+        module_execs = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        ip = self.convertFromStr(self.getAttribute(node, 'ip'), 'str')
+        vt_version = self.convertFromStr(self.getAttribute(node, 'vtVersion'), 'str')
+        ts_start = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        ts_end = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        parent_id = self.convertFromStr(self.getAttribute(node, 'parentId'), 'long')
+        parent_type = self.convertFromStr(self.getAttribute(node, 'parentType'), 'str')
+        parent_version = self.convertFromStr(self.getAttribute(node, 'parentVersion'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'moduleExec':
+                module_exec = self.getDao('module_exec').fromXML(child)
+                module_execs.append(module_exec)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, doc, node):
+        if node is None:
+            node = doc.createElement('workflowExec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.setAttribute('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.setAttribute('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.setAttribute('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.setAttribute('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.setAttribute('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.setAttribute('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.setAttribute('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.setAttribute('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs:
+            if nodeMap.has_key(('module_exec', module_exec.db_id)):
+                childNode = nodeMap[('module_exec', module_exec.db_id)]
+                del nodeMap[('module_exec', module_exec.db_id)]
+            else:
+                childNode = doc.createElement('module_exec')
+                node.appendChild(childNode)
+            self.getDao('module_exec').toXML(module_exec, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'function':
+            return None
+        
+        parameters = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        pos = self.convertFromStr(self.getAttribute(node, 'pos'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'parameter':
+                parameter = self.getDao('parameter').fromXML(child)
+                parameters.append(parameter)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, doc, node):
+        if node is None:
+            node = doc.createElement('function')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(function.db_id, 'long'))
+        node.setAttribute('pos',self.convertToStr(function.db_pos, 'long'))
+        node.setAttribute('name',self.convertToStr(function.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            if nodeMap.has_key(('parameter', parameter.db_id)):
+                childNode = nodeMap[('parameter', parameter.db_id)]
+                del nodeMap[('parameter', parameter.db_id)]
+            else:
+                childNode = doc.createElement('parameter')
+                node.appendChild(childNode)
+            self.getDao('parameter').toXML(parameter, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'abstraction':
+            return None
+        
+        actions = []
+        tags = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions.append(action)
+            elif child.nodeName == 'tag':
+                tag = self.getDao('tag').fromXML(child)
+                tags.append(tag)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAbstraction(id=id,
+                            name=name,
+                            actions=actions,
+                            tags=tags)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, doc, node):
+        if node is None:
+            node = doc.createElement('abstraction')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(abstraction.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        actions = abstraction.db_actions
+        for action in actions:
+            if nodeMap.has_key(('action', action.db_id)):
+                childNode = nodeMap[('action', action.db_id)]
+                del nodeMap[('action', action.db_id)]
+            else:
+                childNode = doc.createElement('action')
+                node.appendChild(childNode)
+            self.getDao('action').toXML(action, doc, childNode)
+        tags = abstraction.db_tags
+        for tag in tags:
+            if nodeMap.has_key(('tag', tag.db_id)):
+                childNode = nodeMap[('tag', tag.db_id)]
+                del nodeMap[('tag', tag.db_id)]
+            else:
+                childNode = doc.createElement('tag')
+                node.appendChild(childNode)
+            self.getDao('tag').toXML(tag, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'workflow':
+            return None
+        
+        modules = []
+        connections = []
+        annotations = []
+        others = []
+        abstractionRefs = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'module':
+                module = self.getDao('module').fromXML(child)
+                modules.append(module)
+            elif child.nodeName == 'connection':
+                connection = self.getDao('connection').fromXML(child)
+                connections.append(connection)
+            elif child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeName == 'other':
+                other = self.getDao('other').fromXML(child)
+                others.append(other)
+            elif child.nodeName == 'abstractionRef':
+                abstractionRef = self.getDao('abstractionRef').fromXML(child)
+                abstractionRefs.append(abstractionRef)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBWorkflow(id=id,
+                         name=name,
+                         modules=modules,
+                         connections=connections,
+                         annotations=annotations,
+                         others=others,
+                         abstractionRefs=abstractionRefs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, doc, node):
+        if node is None:
+            node = doc.createElement('workflow')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(workflow.db_id, 'long'))
+        node.setAttribute('name',self.convertToStr(workflow.db_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        modules = workflow.db_modules
+        for module in modules:
+            if nodeMap.has_key(('module', module.db_id)):
+                childNode = nodeMap[('module', module.db_id)]
+                del nodeMap[('module', module.db_id)]
+            else:
+                childNode = doc.createElement('module')
+                node.appendChild(childNode)
+            self.getDao('module').toXML(module, doc, childNode)
+        connections = workflow.db_connections
+        for connection in connections:
+            if nodeMap.has_key(('connection', connection.db_id)):
+                childNode = nodeMap[('connection', connection.db_id)]
+                del nodeMap[('connection', connection.db_id)]
+            else:
+                childNode = doc.createElement('connection')
+                node.appendChild(childNode)
+            self.getDao('connection').toXML(connection, doc, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        others = workflow.db_others
+        for other in others:
+            if nodeMap.has_key(('other', other.db_id)):
+                childNode = nodeMap[('other', other.db_id)]
+                del nodeMap[('other', other.db_id)]
+            else:
+                childNode = doc.createElement('other')
+                node.appendChild(childNode)
+            self.getDao('other').toXML(other, doc, childNode)
+        abstractionRefs = workflow.db_abstractionRefs
+        for abstractionRef in abstractionRefs:
+            if nodeMap.has_key(('abstractionRef', abstractionRef.db_id)):
+                childNode = nodeMap[('abstractionRef', abstractionRef.db_id)]
+                del nodeMap[('abstractionRef', abstractionRef.db_id)]
+            else:
+                childNode = doc.createElement('abstractionRef')
+                node.appendChild(childNode)
+            self.getDao('abstractionRef').toXML(abstractionRef, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBAbstractionRefXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'abstractionRef':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        abstraction_id = self.convertFromStr(self.getAttribute(node, 'abstractionId'), 'long')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'long')
+        
+        location = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'location':
+                location = self.getDao('location').fromXML(child)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAbstractionRef(id=id,
+                               abstraction_id=abstraction_id,
+                               version=version,
+                               location=location)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstractionRef, doc, node):
+        if node is None:
+            node = doc.createElement('abstractionRef')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(abstractionRef.db_id, 'long'))
+        node.setAttribute('abstractionId',self.convertToStr(abstractionRef.db_abstraction_id, 'long'))
+        node.setAttribute('version',self.convertToStr(abstractionRef.db_version, 'long'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        location = abstractionRef.db_location
+        if location is not None:
+            if nodeMap.has_key(('location', location.db_id)):
+                childNode = nodeMap[('location', location.db_id)]
+                del nodeMap[('location', location.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(location, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'annotation':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        key = self.convertFromStr(self.getAttribute(node, 'key'), 'str')
+        value = self.convertFromStr(self.getAttribute(node, 'value'), 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, doc, node):
+        if node is None:
+            node = doc.createElement('annotation')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(annotation.db_id, 'long'))
+        node.setAttribute('key',self.convertToStr(annotation.db_key, 'str'))
+        node.setAttribute('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'change':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        oldObjId = self.convertFromStr(self.getAttribute(node, 'oldObjId'), 'long')
+        newObjId = self.convertFromStr(self.getAttribute(node, 'newObjId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        data = None
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'module':
+                data = self.getDao('module').fromXML(child)
+            elif child.nodeName == 'location':
+                data = self.getDao('location').fromXML(child)
+            elif child.nodeName == 'annotation':
+                data = self.getDao('annotation').fromXML(child)
+            elif child.nodeName == 'function':
+                data = self.getDao('function').fromXML(child)
+            elif child.nodeName == 'connection':
+                data = self.getDao('connection').fromXML(child)
+            elif child.nodeName == 'port':
+                data = self.getDao('port').fromXML(child)
+            elif child.nodeName == 'parameter':
+                data = self.getDao('parameter').fromXML(child)
+            elif child.nodeName == 'portSpec':
+                data = self.getDao('portSpec').fromXML(child)
+            elif child.nodeName == 'abstractionRef':
+                data = self.getDao('abstractionRef').fromXML(child)
+            elif child.nodeName == 'other':
+                data = self.getDao('other').fromXML(child)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBChange(id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType,
+                       data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, doc, node):
+        if node is None:
+            node = doc.createElement('change')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(change.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(change.db_what, 'str'))
+        node.setAttribute('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.setAttribute('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        data = change.db_data
+        if data.vtType == 'module':
+            if nodeMap.has_key(('module', data.db_id)):
+                childNode = nodeMap[('module', data.db_id)]
+                del nodeMap[('module', data.db_id)]
+            else:
+                childNode = doc.createElement('module')
+                node.appendChild(childNode)
+            self.getDao('module').toXML(data, doc, childNode)
+        elif data.vtType == 'location':
+            if nodeMap.has_key(('location', data.db_id)):
+                childNode = nodeMap[('location', data.db_id)]
+                del nodeMap[('location', data.db_id)]
+            else:
+                childNode = doc.createElement('location')
+                node.appendChild(childNode)
+            self.getDao('location').toXML(data, doc, childNode)
+        elif data.vtType == 'annotation':
+            if nodeMap.has_key(('annotation', data.db_id)):
+                childNode = nodeMap[('annotation', data.db_id)]
+                del nodeMap[('annotation', data.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(data, doc, childNode)
+        elif data.vtType == 'function':
+            if nodeMap.has_key(('function', data.db_id)):
+                childNode = nodeMap[('function', data.db_id)]
+                del nodeMap[('function', data.db_id)]
+            else:
+                childNode = doc.createElement('function')
+                node.appendChild(childNode)
+            self.getDao('function').toXML(data, doc, childNode)
+        elif data.vtType == 'connection':
+            if nodeMap.has_key(('connection', data.db_id)):
+                childNode = nodeMap[('connection', data.db_id)]
+                del nodeMap[('connection', data.db_id)]
+            else:
+                childNode = doc.createElement('connection')
+                node.appendChild(childNode)
+            self.getDao('connection').toXML(data, doc, childNode)
+        elif data.vtType == 'port':
+            if nodeMap.has_key(('port', data.db_id)):
+                childNode = nodeMap[('port', data.db_id)]
+                del nodeMap[('port', data.db_id)]
+            else:
+                childNode = doc.createElement('port')
+                node.appendChild(childNode)
+            self.getDao('port').toXML(data, doc, childNode)
+        elif data.vtType == 'parameter':
+            if nodeMap.has_key(('parameter', data.db_id)):
+                childNode = nodeMap[('parameter', data.db_id)]
+                del nodeMap[('parameter', data.db_id)]
+            else:
+                childNode = doc.createElement('parameter')
+                node.appendChild(childNode)
+            self.getDao('parameter').toXML(data, doc, childNode)
+        elif data.vtType == 'portSpec':
+            if nodeMap.has_key(('portSpec', data.db_id)):
+                childNode = nodeMap[('portSpec', data.db_id)]
+                del nodeMap[('portSpec', data.db_id)]
+            else:
+                childNode = doc.createElement('portSpec')
+                node.appendChild(childNode)
+            self.getDao('portSpec').toXML(data, doc, childNode)
+        elif data.vtType == 'abstractionRef':
+            if nodeMap.has_key(('abstractionRef', data.db_id)):
+                childNode = nodeMap[('abstractionRef', data.db_id)]
+                del nodeMap[('abstractionRef', data.db_id)]
+            else:
+                childNode = doc.createElement('abstractionRef')
+                node.appendChild(childNode)
+            self.getDao('abstractionRef').toXML(data, doc, childNode)
+        elif data.vtType == 'other':
+            if nodeMap.has_key(('other', data.db_id)):
+                childNode = nodeMap[('other', data.db_id)]
+                del nodeMap[('other', data.db_id)]
+            else:
+                childNode = doc.createElement('other')
+                node.appendChild(childNode)
+            self.getDao('other').toXML(data, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'parameter':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        pos = self.convertFromStr(self.getAttribute(node, 'pos'), 'long')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        type = self.convertFromStr(self.getAttribute(node, 'type'), 'str')
+        val = self.convertFromStr(self.getAttribute(node, 'val'), 'str')
+        alias = self.convertFromStr(self.getAttribute(node, 'alias'), 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, doc, node):
+        if node is None:
+            node = doc.createElement('parameter')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(parameter.db_id, 'long'))
+        node.setAttribute('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.setAttribute('name',self.convertToStr(parameter.db_name, 'str'))
+        node.setAttribute('type',self.convertToStr(parameter.db_type, 'str'))
+        node.setAttribute('val',self.convertToStr(parameter.db_val, 'str'))
+        node.setAttribute('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'connection':
+            return None
+        
+        ports = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'port':
+                port = self.getDao('port').fromXML(child)
+                ports.append(port)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, doc, node):
+        if node is None:
+            node = doc.createElement('connection')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            if nodeMap.has_key(('port', port.db_id)):
+                childNode = nodeMap[('port', port.db_id)]
+                del nodeMap[('port', port.db_id)]
+            else:
+                childNode = doc.createElement('port')
+                node.appendChild(childNode)
+            self.getDao('port').toXML(port, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'action':
+            return None
+        
+        annotations = []
+        operations = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        prevId = self.convertFromStr(self.getAttribute(node, 'prevId'), 'long')
+        date = self.convertFromStr(self.getAttribute(node, 'date'), 'datetime')
+        session = self.convertFromStr(self.getAttribute(node, 'session'), 'str')
+        user = self.convertFromStr(self.getAttribute(node, 'user'), 'str')
+        prune = self.convertFromStr(self.getAttribute(node, 'prune'), 'int')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeName == 'add':
+                operation = self.getDao('add').fromXML(child)
+                operations.append(operation)
+            elif child.nodeName == 'delete':
+                operation = self.getDao('delete').fromXML(child)
+                operations.append(operation)
+            elif child.nodeName == 'change':
+                operation = self.getDao('change').fromXML(child)
+                operations.append(operation)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBAction(id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations,
+                       operations=operations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, doc, node):
+        if node is None:
+            node = doc.createElement('action')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(action.db_id, 'long'))
+        node.setAttribute('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.setAttribute('date',self.convertToStr(action.db_date, 'datetime'))
+        node.setAttribute('session',self.convertToStr(action.db_session, 'str'))
+        node.setAttribute('user',self.convertToStr(action.db_user, 'str'))
+        node.setAttribute('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                if nodeMap.has_key(('add', operation.db_id)):
+                    childNode = nodeMap[('add', operation.db_id)]
+                    del nodeMap[('add', operation.db_id)]
+                else:
+                    childNode = doc.createElement('add')
+                    node.appendChild(childNode)
+                self.getDao('add').toXML(operation, doc, childNode)
+            elif operation.vtType == 'delete':
+                if nodeMap.has_key(('delete', operation.db_id)):
+                    childNode = nodeMap[('delete', operation.db_id)]
+                    del nodeMap[('delete', operation.db_id)]
+                else:
+                    childNode = doc.createElement('delete')
+                    node.appendChild(childNode)
+                self.getDao('delete').toXML(operation, doc, childNode)
+            elif operation.vtType == 'change':
+                if nodeMap.has_key(('change', operation.db_id)):
+                    childNode = nodeMap[('change', operation.db_id)]
+                    del nodeMap[('change', operation.db_id)]
+                else:
+                    childNode = doc.createElement('change')
+                    node.appendChild(childNode)
+                self.getDao('change').toXML(operation, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'delete':
+            return None
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        what = self.convertFromStr(self.getAttribute(node, 'what'), 'str')
+        objectId = self.convertFromStr(self.getAttribute(node, 'objectId'), 'long')
+        parentObjId = self.convertFromStr(self.getAttribute(node, 'parentObjId'), 'long')
+        parentObjType = self.convertFromStr(self.getAttribute(node, 'parentObjType'), 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, doc, node):
+        if node is None:
+            node = doc.createElement('delete')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(delete.db_id, 'long'))
+        node.setAttribute('what',self.convertToStr(delete.db_what, 'str'))
+        node.setAttribute('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.setAttribute('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.setAttribute('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'vistrail':
+            return None
+        
+        actions = []
+        tags = []
+        abstractions = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        version = self.convertFromStr(self.getAttribute(node, 'version'), 'str')
+        name = self.convertFromStr(self.getAttribute(node, 'name'), 'str')
+        dbHost = self.convertFromStr(self.getAttribute(node, 'dbHost'), 'str')
+        dbPort = self.convertFromStr(self.getAttribute(node, 'dbPort'), 'int')
+        dbName = self.convertFromStr(self.getAttribute(node, 'dbName'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'action':
+                action = self.getDao('action').fromXML(child)
+                actions.append(action)
+            elif child.nodeName == 'tag':
+                tag = self.getDao('tag').fromXML(child)
+                tags.append(tag)
+            elif child.nodeName == 'abstraction':
+                abstraction = self.getDao('abstraction').fromXML(child)
+                abstractions.append(abstraction)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         dbHost=dbHost,
+                         dbPort=dbPort,
+                         dbName=dbName,
+                         actions=actions,
+                         tags=tags,
+                         abstractions=abstractions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, doc, node):
+        if node is None:
+            node = doc.createElement('vistrail')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.setAttribute('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.setAttribute('name',self.convertToStr(vistrail.db_name, 'str'))
+        node.setAttribute('dbHost',self.convertToStr(vistrail.db_dbHost, 'str'))
+        node.setAttribute('dbPort',self.convertToStr(vistrail.db_dbPort, 'int'))
+        node.setAttribute('dbName',self.convertToStr(vistrail.db_dbName, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            if nodeMap.has_key(('action', action.db_id)):
+                childNode = nodeMap[('action', action.db_id)]
+                del nodeMap[('action', action.db_id)]
+            else:
+                childNode = doc.createElement('action')
+                node.appendChild(childNode)
+            self.getDao('action').toXML(action, doc, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            if nodeMap.has_key(('tag', tag.db_id)):
+                childNode = nodeMap[('tag', tag.db_id)]
+                del nodeMap[('tag', tag.db_id)]
+            else:
+                childNode = doc.createElement('tag')
+                node.appendChild(childNode)
+            self.getDao('tag').toXML(tag, doc, childNode)
+        abstractions = vistrail.db_abstractions
+        for abstraction in abstractions:
+            if nodeMap.has_key(('abstraction', abstraction.db_id)):
+                childNode = nodeMap[('abstraction', abstraction.db_id)]
+                del nodeMap[('abstraction', abstraction.db_id)]
+            else:
+                childNode = doc.createElement('abstraction')
+                node.appendChild(childNode)
+            self.getDao('abstraction').toXML(abstraction, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.nodeName != 'moduleExec':
+            return None
+        
+        annotations = []
+        
+        # read attributes
+        id = self.convertFromStr(self.getAttribute(node, 'id'), 'long')
+        ts_start = self.convertFromStr(self.getAttribute(node, 'tsStart'), 'datetime')
+        ts_end = self.convertFromStr(self.getAttribute(node, 'tsEnd'), 'datetime')
+        module_id = self.convertFromStr(self.getAttribute(node, 'moduleId'), 'long')
+        module_name = self.convertFromStr(self.getAttribute(node, 'moduleName'), 'str')
+        
+        
+        # read children
+        for child in list(node.childNodes):
+            if child.nodeName == 'annotation':
+                annotation = self.getDao('annotation').fromXML(child)
+                annotations.append(annotation)
+            elif child.nodeType == child.TEXT_NODE and child.nodeValue.strip() == '':
+                pass
+            elif child.nodeType != child.TEXT_NODE:
+                print '*** ERROR *** nodeName = %s' % child.nodeName
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           module_id=module_id,
+                           module_name=module_name,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, doc, node):
+        if node is None:
+            node = doc.createElement('moduleExec')
+        
+        # set attributes
+        node.setAttribute('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.setAttribute('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.setAttribute('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.setAttribute('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.setAttribute('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        
+        # load DOM node map
+        nodeMap = {}
+        for childNode in node.childNodes:
+            if childNode.nodeType == childNode.ELEMENT_NODE and self.hasAttribute(childNode, 'id'):
+                nodeId = self.convertFromStr(self.getAttribute(childNode, 'id'), 'long')
+                nodeMap[(childNode.nodeName, nodeId)] = childNode
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            if nodeMap.has_key(('annotation', annotation.db_id)):
+                childNode = nodeMap[('annotation', annotation.db_id)]
+                del nodeMap[('annotation', annotation.db_id)]
+            else:
+                childNode = doc.createElement('annotation')
+                node.appendChild(childNode)
+            self.getDao('annotation').toXML(annotation, doc, childNode)
+        
+        # delete nodes not around anymore
+        for childNode in nodeMap.itervalues():
+            childNode.parentNode.removeChild(childNode)
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_7_0/persistence/xml/io.py b/vistrails/db/versions/v0_7_0/persistence/xml/io.py
new file mode 100644
index 0000000..f01beb5
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/xml/io.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.parsers.expat import ExpatError
+import xml.dom.minidom
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_7_0 import version as my_version
+
+def parse_xml_file(filename):
+    try:
+        return xml.dom.minidom.parse(filename)
+    except xml.parsers.expat.ExpatError, e:
+        msg = 'XML parse error at line %s, col %s: %s' % \
+            (e.lineno, e.offset, e.code)
+        raise VistrailsDBException(msg)
+
+def write_xml_file(filename, dom, prettyprint=True):
+    output = open(filename, 'w')
+    if prettyprint:
+        dom.writexml(output, '','  ','\n')
+    else:
+        dom.writexml(output)
+    output.close()
+
+def read_xml_object(vtType, node, dao_list):
+    return dao_list[vtType].fromXML(node)
+
+def write_xml_object(obj, dom, dao_list, node=None):
+    res_node = dao_list[obj.vtType].toXML(obj, dom, node)
+    return res_node
+
+def open_from_xml(filename, vtType, dao_list):
+    """open_from_xml(filename) -> DBVistrail"""
+    dom = parse_xml_file(filename)
+    vistrail = read_xml_object(vtType, dom.documentElement, dao_list)
+    dom.unlink()
+    return vistrail
+
+def save_to_xml(obj, filename, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(obj, dom, dao_list)
+    dom.appendChild(root)
+    if obj.vtType == 'vistrail':
+        root.setAttribute('version', my_version)
+        root.setAttribute('xmlns:xsi', 
+                          'http://www.w3.org/2001/XMLSchema-instance')
+        root.setAttribute('xsi:schemaLocation', 
+                          'http://www.vistrails.org/vistrail.xsd')
+    write_xml_file(filename, dom)
+    dom.unlink()
+
+def serialize(object, dao_list):
+    dom = xml.dom.minidom.getDOMImplementation().createDocument(None, None,
+                                                                None)
+    root = write_xml_object(object, dom, dao_list)
+    dom.appendChild(root)
+    return dom.toxml()
+
+def unserialize(str, obj_type):
+    dom = xml.dom.minidom.parseString(str)
+    return read_xml_object(obj_type, dom.documentElement, dao_list)
+
diff --git a/vistrails/db/versions/v0_7_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_7_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_7_0/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_7_0/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..494b6b3
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/schemas/sql/vistrails.sql
@@ -0,0 +1,246 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    abstraction int,
+    name varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE log_tbl(
+    id int,
+    vt_id int
+);
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    module_exec_id int
+);
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    vt_id int
+);
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE abstraction(
+    id int,
+    name varchar(255),
+    vt_id int
+);
+
+CREATE TABLE workflow(
+    id int,
+    name varchar(255),
+    vt_id int
+);
+
+CREATE TABLE abstraction_ref(
+    id int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session varchar(1023),
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+);
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+);
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    version char(16),
+    name varchar(255)
+);
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    module_id int,
+    module_name varchar(255),
+    machine_id int,
+    wf_exec_id int,
+    vt_id int
+);
+
diff --git a/vistrails/db/versions/v0_7_0/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_7_0/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..a4fd64c
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, log_tbl, machine, add_tbl, other, location, workflow_exec, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, parameter, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v0_7_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_7_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..2f84013
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,234 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:string"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="abstraction" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_7_0/specs/abstraction.xml b/vistrails/db/versions/v0_7_0/specs/abstraction.xml
new file mode 100644
index 0000000..3cbb63a
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/abstraction.xml
@@ -0,0 +1,65 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstraction">
+  <layout>
+    <xml name="abstraction" nodeType="xs:element"/>
+    <sql table="abstraction"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="vistrail" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/abstractionRef.xml b/vistrails/db/versions/v0_7_0/specs/abstractionRef.xml
new file mode 100644
index 0000000..9cf4d55
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/abstractionRef.xml
@@ -0,0 +1,82 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstractionRef">
+  <layout>
+    <xml name="abstractionRef" nodeType="xs:element"/>
+    <sql table="abstraction_ref"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="abstraction_id" type="long">
+    <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/action.xml b/vistrails/db/versions/v0_7_0/specs/action.xml
new file mode 100644
index 0000000..1c7d3c5
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/action.xml
@@ -0,0 +1,110 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="session" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="prune" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/add.xml b/vistrails/db/versions/v0_7_0/specs/add.xml
new file mode 100644
index 0000000..11f560c
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/add.xml
@@ -0,0 +1,111 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true"
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/annotation.xml b/vistrails/db/versions/v0_7_0/specs/annotation.xml
new file mode 100644
index 0000000..19e9a54
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/annotation.xml
@@ -0,0 +1,93 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="action">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/change.xml b/vistrails/db/versions/v0_7_0/specs/change.xml
new file mode 100644
index 0000000..8135c18
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/change.xml
@@ -0,0 +1,116 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/connection.xml b/vistrails/db/versions/v0_7_0/specs/connection.xml
new file mode 100644
index 0000000..b559fab
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/connection.xml
@@ -0,0 +1,74 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/delete.xml b/vistrails/db/versions/v0_7_0/specs/delete.xml
new file mode 100644
index 0000000..abcdfdb
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/delete.xml
@@ -0,0 +1,78 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/function.xml b/vistrails/db/versions/v0_7_0/specs/function.xml
new file mode 100644
index 0000000..8254645
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/function.xml
@@ -0,0 +1,83 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/location.xml b/vistrails/db/versions/v0_7_0/specs/location.xml
new file mode 100644
index 0000000..99c62f7
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/location.xml
@@ -0,0 +1,83 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_7_0/specs/log.xml b/vistrails/db/versions/v0_7_0/specs/log.xml
new file mode 100644
index 0000000..ca8720e
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/log.xml
@@ -0,0 +1,62 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/machine.xml b/vistrails/db/versions/v0_7_0/specs/machine.xml
new file mode 100644
index 0000000..dea813d
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/machine.xml
@@ -0,0 +1,85 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="long" mapping="one-to-many">
+    <sql column="module_exec_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/module.xml b/vistrails/db/versions/v0_7_0/specs/module.xml
new file mode 100644
index 0000000..263ba14
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/module.xml
@@ -0,0 +1,112 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/module_exec.xml b/vistrails/db/versions/v0_7_0/specs/module_exec.xml
new file mode 100644
index 0000000..465407b
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/module_exec.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module_exec">
+  <layout>
+    <xml name="moduleExec" nodeType="xs:element"/>
+    <sql table="module_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="module_id" type="long" foreignKey="true" object="module">
+    <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="module_name" type="str">
+    <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="machine" name="machine_id" type="long" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="machine_id" type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/other.xml b/vistrails/db/versions/v0_7_0/specs/other.xml
new file mode 100644
index 0000000..40e1388
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/other.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/parameter.xml b/vistrails/db/versions/v0_7_0/specs/parameter.xml
new file mode 100644
index 0000000..78f6cf7
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/parameter.xml
@@ -0,0 +1,94 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/port.xml b/vistrails/db/versions/v0_7_0/specs/port.xml
new file mode 100644
index 0000000..94f7671
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/port.xml
@@ -0,0 +1,95 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(4095)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/portSpec.xml b/vistrails/db/versions/v0_7_0/specs/portSpec.xml
new file mode 100644
index 0000000..e42a5f0
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/portSpec.xml
@@ -0,0 +1,84 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/tag.xml b/vistrails/db/versions/v0_7_0/specs/tag.xml
new file mode 100644
index 0000000..f8412b9
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/tag.xml
@@ -0,0 +1,71 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	    object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+  
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/vistrail.xml b/vistrails/db/versions/v0_7_0/specs/vistrail.xml
new file mode 100644
index 0000000..b7b98d7
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/vistrail.xml
@@ -0,0 +1,81 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="vt_id"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_7_0/specs/workflow.xml b/vistrails/db/versions/v0_7_0/specs/workflow.xml
new file mode 100644
index 0000000..b420aa0
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/workflow.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="module" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="connection" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstractionRef" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+  
diff --git a/vistrails/db/versions/v0_7_0/specs/workflow_exec.xml b/vistrails/db/versions/v0_7_0/specs/workflow_exec.xml
new file mode 100644
index 0000000..b616623
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/specs/workflow_exec.xml
@@ -0,0 +1,106 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow_exec">
+  <layout>
+    <xml name="workflowExec" nodeType="xs:element"/>
+    <sql table="workflow_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="vt_version" type="str">
+    <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="parent_id" type="long">
+    <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent_type" type="str">
+    <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parent_version" type="long">
+    <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_7_0/translate/__init__.py b/vistrails/db/versions/v0_7_0/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_7_0/translate/v0_6_0.py b/vistrails/db/versions/v0_7_0/translate/v0_6_0.py
new file mode 100644
index 0000000..ea4d612
--- /dev/null
+++ b/vistrails/db/versions/v0_7_0/translate/v0_6_0.py
@@ -0,0 +1,218 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_7_0.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+
+    for _action in _vistrail.db_actions.itervalues():
+        ops = []
+        for op in _action.db_operations:
+            if op.vtType == 'add':
+                data = convert_data(op.db_data, op.db_parentObjType,
+                                    op.db_parentObjId)
+                ops.append(DBAdd(id=op.db_id,
+                                 what=op.db_what, 
+                                 objectId=op.db_objectId, 
+                                 parentObjId=op.db_parentObjId, 
+                                 parentObjType=op.db_parentObjType, 
+                                 data=data))
+            elif op.vtType == 'change':
+                data = convert_data(op.db_data, op.db_parentObjType,
+                                    op.db_parentObjId)
+                ops.append(DBChange(id=op.db_id,
+                                    what=op.db_what, 
+                                    oldObjId=op.db_oldObjId, 
+                                    newObjId=op.db_newObjId,
+                                    parentObjId=op.db_parentObjId, 
+                                    parentObjType=op.db_parentObjType, 
+                                    data=data))
+            elif op.vtType == 'delete':
+                ops.append(DBDelete(id=op.db_id,
+                                    what=op.db_what, 
+                                    objectId=op.db_objectId, 
+                                    parentObjId=op.db_parentObjId, 
+                                    parentObjType=op.db_parentObjType))
+        action = DBAction(id=_action.db_id,
+                          prevId=_action.db_prevId, 
+                          date=_action.db_date, 
+                          user=_action.db_user, 
+                          operations=ops,
+                          annotations=_action.db_annotations.values())
+        vistrail.db_add_action(action)
+
+    for _tag in _vistrail.db_tags.itervalues():
+        tag = DBTag(id=_tag.db_id,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    vistrail.db_version = '0.7.0'
+    return vistrail
+
+module_map = {}
+translate_ports = {'SetInputConnection': {None: 'SetInputConnection0'},
+                   'GetOutputPort': {None: 'GetOutputPort0'},
+                   'SetRenderWindow': {None: 'SetVTKCell'},
+                   'SetInteractorStyle': {None: 'InteractorStyle'},
+                   'ResetCamera': {None: 'ResetCamera'},
+                   'AddPoint': {None: 'AddPoint_1'},
+                   'AddRGBPoint': {None: 'AddRGBPoint_1'},
+                   'AddHSVPoint': {None: 'AddHSVPoint_1'},
+                   'AddInput': {None: 'AddInput',
+                                'vtkXYPlotActor': 'AddInput_2'},
+                   'SetInput': {None: 'SetInput',
+                                'vtkPolyDataNormals': 'SetInput_1',
+                                'vtkGlyph3D': 'SetInput_1',
+                                'vtkDelaunay2D': 'SetInput_1',
+                                'vtkDelaunay3D': 'SetInput_1',
+                                'vtkWarpVector': 'SetInput_1',
+                                'vtkContourFilter': 'SetInput_1',
+                                'vtkTubeFilter': 'SetInput_1',
+                                'vtkThresholdPoints': 'SetInput_1',
+                                'vtkProbeFilter': 'SetInput_1',
+                                'vtkTriangleFilter': 'SetInput_1',
+                                'vtkBandedPolyDataContourFilter': \
+                                    'SetInput_1',
+                                'vtkWarpScalar': 'SetInput_1'},
+                   'SetSourceConnection': {None: 'SetSourceConnection',
+                                           'vtkGlyph3D': \
+                                               'SetSourceConnection_2'},
+                   'AddFunction': {None: 'AddFunction',
+                                   ('vtkImplicitSum', 'vtkPlane'): \
+                                       'AddFunction_2',
+                                   ('vtkImplicitSum', 'Tuple'): \
+                                       'AddFunction_1'},
+                   'SetColor': {None: 'SetColor',
+                                ('vtkVolumeProperty', 
+                                 'vtkColorTransferFunction'): \
+                                    'SetColor_4',
+                                ('vtkVolumeProperty', 
+                                 'vtkPiecewiseFunction'): \
+                                    'SetColor_2'},
+                   'SetScalarOpacity': {None: 'SetScalarOpacity',
+                                        'vtkVolumeProperty': \
+                                            'SetScalarOpacity_2'},
+                   'SetGradientOpacity': {None: 'SetGradientOpacity',
+                                          'vtkVolumeProperty':
+                                              'SetGradientOpacity_2'},
+                   'SetSource': {None: 'SetSource',
+                                 'vtkGlyph3D': 'SetSource_1'},
+                   }
+
+def translate_vtk(module_id, port_name, specs=None):
+    global module_map
+    if port_name in translate_ports:
+        if module_id in module_map:
+            (module_name, module_pkg) = module_map[module_id]
+            if module_pkg != 'edu.utah.sci.vistrails.vtk':
+                return port_name
+        if module_name in translate_ports[port_name]:
+            port_name = translate_ports[port_name][module_name]
+        elif (module_name, specs) in translate_ports[port_name]:
+            port_name = translate_ports[port_name][(module_name, specs)]
+        else:
+            port_name = translate_ports[port_name][None]  
+    return port_name
+
+def convert_data(child, parent_type, parent_id):
+    from vistrails.core.vistrail.port_spec import PortSpec
+    from vistrails.core.modules.module_registry import get_module_registry
+    global module_map, translate_ports
+
+    registry = get_module_registry()
+    if child.vtType == 'module':
+        descriptor = registry.get_descriptor_from_name_only(child.db_name)
+        package = descriptor.identifier
+        module_map[child.db_id] = (child.db_name, package)
+        return DBModule(id=child.db_id,
+                        cache=child.db_cache, 
+                        abstraction=0, 
+                        name=child.db_name,
+                        package=package)
+    elif child.vtType == 'connection':
+        return DBConnection(id=child.db_id)
+    elif child.vtType == 'portSpec':
+        return DBPortSpec(id=child.db_id,
+                          name=child.db_name, 
+                          type=child.db_type, 
+                          spec=child.db_spec)
+    elif child.vtType == 'function':
+        if parent_type == 'module':
+            name = translate_vtk(parent_id, child.db_name)
+        else:
+            name = child.db_name
+        return DBFunction(id=child.db_id,
+                          pos=child.db_pos, 
+                          name=name)
+    elif child.vtType == 'parameter':
+        return DBParameter(id=child.db_id,
+                           pos=child.db_pos,
+                           name=child.db_name, 
+                           type=child.db_type, 
+                           val=child.db_val, 
+                           alias=child.db_alias)
+    elif child.vtType == 'location':
+        return DBLocation(id=child.db_id,
+                          x=child.db_x,
+                          y=child.db_y)
+    elif child.vtType == 'annotation':
+        return DBAnnotation(id=child.db_id,
+                            key=child.db_key,
+                            value=child.db_value)
+    elif child.vtType == 'port':
+        sig = child.db_sig
+        if '(' in sig and ')' in sig:
+            name = sig[:sig.find('(')]
+            specs = sig[sig.find('(')+1:sig.find(')')]
+            name = translate_vtk(child.db_moduleId, name, specs)
+
+            new_specs = []
+            for spec_name in specs.split(','):
+                descriptor = registry.get_descriptor_from_name_only(spec_name)
+                spec_str = descriptor.identifier + ':' + spec_name
+                new_specs.append(spec_str)
+            spec = '(' + ','.join(new_specs) + ')'
+        else:
+            name = sig
+            spec = ''
+        return DBPort(id=child.db_id,
+                      type=child.db_type, 
+                      moduleId=child.db_moduleId, 
+                      moduleName=child.db_moduleName, 
+                      name=name,
+                      spec=spec)
diff --git a/vistrails/db/versions/v0_8_0/__init__.py b/vistrails/db/versions/v0_8_0/__init__.py
new file mode 100644
index 0000000..692e9d5
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.8.0'
diff --git a/vistrails/db/versions/v0_8_0/domain/__init__.py b/vistrails/db/versions/v0_8_0/domain/__init__.py
new file mode 100644
index 0000000..f8bbb47
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/domain/__init__.py
@@ -0,0 +1,40 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from abstraction import DBAbstraction
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_8_0/domain/abstraction.py b/vistrails/db/versions/v0_8_0/domain/abstraction.py
new file mode 100644
index 0000000..5972a93
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/domain/abstraction.py
@@ -0,0 +1,54 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+from auto_gen import DBAbstraction as _DBAbstraction
+from id_scope import IdScope
+
+class DBAbstraction(_DBAbstraction):
+    def __init__(self, *args, **kwargs):
+        _DBAbstraction.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+        self.idScope.setBeginId('action', 1)
+
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBAbstraction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBAbstraction
+        # need to go through and reset the index to the copied objects
+        cp.idScope = copy.copy(self.idScope)
+        return cp
diff --git a/vistrails/db/versions/v0_8_0/domain/auto_gen.py b/vistrails/db/versions/v0_8_0/domain/auto_gen.py
new file mode 100644
index 0000000..b17a214
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/domain/auto_gen.py
@@ -0,0 +1,4209 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_spec = self.db_spec
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, package=None, version=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self.__db_id = id
+        self.__db_cache = cache
+        self.__db_name = name
+        self.__db_package = package
+        self.__db_version = version
+        self.db_deleted_location = []
+        self.__db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+            for v in self.__db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self.__db_portSpecs = []
+        else:
+            self.__db_portSpecs = portSpecs
+            for v in self.__db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule()
+        cp.db_id = self.db_id
+        cp.db_cache = self.db_cache
+        cp.db_name = self.db_name
+        cp.db_package = self.db_package
+        cp.db_version = self.db_version
+        if self.db_location is not None:
+            cp.db_location = self.db_location.do_copy(new_ids, id_scope, id_remap)
+        if self.db_functions is None:
+            cp.db_functions = []
+        else:
+            cp.db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_functions]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_portSpecs is None:
+            cp.db_portSpecs = []
+        else:
+            cp.db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_functions:
+            cp.db_functions_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        for v in cp.__db_portSpecs:
+            cp.db_portSpecs_id_index[v.db_id] = v
+            cp.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        for child in self.db_functions:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_package(self):
+        return self.__db_package
+    def __set_db_package(self, package):
+        self.__db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self.__db_package = package
+    def db_change_package(self, package):
+        self.__db_package = package
+    def db_delete_package(self, package):
+        self.__db_package = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self.__db_location)
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                if not self.__db_functions[i].is_new:
+                    self.db_deleted_functions.append(self.__db_functions[i])
+                del self.__db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return self.db_functions_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def __get_db_portSpecs(self):
+        return self.__db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self.__db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self.__db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self.__db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                self.__db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self.__db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                if not self.__db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self.__db_portSpecs[i])
+                del self.__db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == key:
+                return self.__db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return self.db_portSpecs_id_index.has_key(key)
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return self.db_portSpecs_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and id_remap.has_key(('action', self.db_id)):
+                cp.db_id = id_remap[('action', self.db_id)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, spec=None):
+        self.__db_id = id
+        self.__db_type = type
+        self.__db_moduleId = moduleId
+        self.__db_moduleName = moduleName
+        self.__db_name = name
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort()
+        cp.__db_id = self.__db_id
+        cp.__db_type = self.__db_type
+        cp.__db_moduleId = self.__db_moduleId
+        cp.__db_moduleName = self.__db_moduleName
+        cp.__db_name = self.__db_name
+        cp.__db_spec = self.__db_spec
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and id_remap.has_key(('module', self.db_moduleId)):
+                cp.db_moduleId = id_remap[('module', self.db_moduleId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self.__db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self.__db_moduleName = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, workflow_execs=None, machines=None):
+        self.__db_id = id
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self.__db_workflow_execs = []
+        else:
+            self.__db_workflow_execs = workflow_execs
+            for v in self.__db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self.__db_machines = []
+        else:
+            self.__db_machines = machines
+            for v in self.__db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog()
+        cp.db_id = self.db_id
+        if self.db_workflow_execs is None:
+            cp.db_workflow_execs = []
+        else:
+            cp.db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_workflow_execs]
+        if self.db_machines is None:
+            cp.db_machines = []
+        else:
+            cp.db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_workflow_execs:
+            cp.db_workflow_execs_id_index[v.db_id] = v
+        for v in cp.__db_machines:
+            cp.db_machines_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self.db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_workflow_execs(self):
+        return self.__db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self.__db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self.__db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self.__db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self.__db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self.__db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self.__db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self.__db_workflow_execs[i])
+                del self.__db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == key:
+                return self.__db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return self.db_workflow_execs_id_index.has_key(key)
+    
+    def __get_db_machines(self):
+        return self.__db_machines
+    def __set_db_machines(self, machines):
+        self.__db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self.__db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == machine.db_id:
+                self.__db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self.__db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == machine.db_id:
+                if not self.__db_machines[i].is_new:
+                    self.db_deleted_machines.append(self.__db_machines[i])
+                del self.__db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == key:
+                return self.__db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return self.db_machines_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None, module_execs=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_os = os
+        self.__db_architecture = architecture
+        self.__db_processor = processor
+        self.__db_ram = ram
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self.__db_module_execs = []
+        else:
+            self.__db_module_execs = module_execs
+            for v in self.__db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_os = self.db_os
+        cp.db_architecture = self.db_architecture
+        cp.db_processor = self.db_processor
+        cp.db_ram = self.db_ram
+        if self.db_module_execs is None:
+            cp.db_module_execs = []
+        else:
+            cp.db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_module_execs:
+            cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_os(self):
+        return self.__db_os
+    def __set_db_os(self, os):
+        self.__db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self.__db_os = os
+    def db_change_os(self, os):
+        self.__db_os = os
+    def db_delete_os(self, os):
+        self.__db_os = None
+    
+    def __get_db_architecture(self):
+        return self.__db_architecture
+    def __set_db_architecture(self, architecture):
+        self.__db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self.__db_architecture = None
+    
+    def __get_db_processor(self):
+        return self.__db_processor
+    def __set_db_processor(self, processor):
+        self.__db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self.__db_processor = processor
+    def db_change_processor(self, processor):
+        self.__db_processor = processor
+    def db_delete_processor(self, processor):
+        self.__db_processor = None
+    
+    def __get_db_ram(self):
+        return self.__db_ram
+    def __set_db_ram(self, ram):
+        self.__db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self.__db_ram = ram
+    def db_change_ram(self, ram):
+        self.__db_ram = ram
+    def db_delete_ram(self, ram):
+        self.__db_ram = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                self.__db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                if not self.__db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self.__db_module_execs[i])
+                del self.__db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == key:
+                return self.__db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return self.db_module_execs_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self.__db_data = data
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd()
+        if self.db_data is not None:
+            cp.db_data = self.db_data.do_copy(new_ids, id_scope, id_remap)
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and id_remap.has_key((self.db_what, self.db_objectId)):
+                cp.db_objectId = id_remap[(self.db_what, self.db_objectId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self.__db_data)
+        self.__db_data = None
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self.__db_id = id
+        self.__db_x = x
+        self.__db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation()
+        cp.db_id = self.db_id
+        cp.db_x = self.db_x
+        cp.db_y = self.db_y
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_x(self):
+        return self.__db_x
+    def __set_db_x(self, x):
+        self.__db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self.__db_x = x
+    def db_change_x(self, x):
+        self.__db_x = x
+    def db_delete_x(self, x):
+        self.__db_x = None
+    
+    def __get_db_y(self):
+        return self.__db_y
+    def __set_db_y(self, y):
+        self.__db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self.__db_y = y
+    def db_change_y(self, y):
+        self.__db_y = y
+    def db_delete_y(self, y):
+        self.__db_y = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, name=None, module_execs=None):
+        self.__db_id = id
+        self.__db_user = user
+        self.__db_ip = ip
+        self.__db_vt_version = vt_version
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_parent_id = parent_id
+        self.__db_parent_type = parent_type
+        self.__db_parent_version = parent_version
+        self.__db_name = name
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self.__db_module_execs = []
+        else:
+            self.__db_module_execs = module_execs
+            for v in self.__db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec()
+        cp.db_id = self.db_id
+        cp.db_user = self.db_user
+        cp.db_ip = self.db_ip
+        cp.db_vt_version = self.db_vt_version
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_parent_id = self.db_parent_id
+        cp.db_parent_type = self.db_parent_type
+        cp.db_parent_version = self.db_parent_version
+        cp.db_name = self.db_name
+        if self.db_module_execs is None:
+            cp.db_module_execs = []
+        else:
+            cp.db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_module_execs:
+            cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_ip(self):
+        return self.__db_ip
+    def __set_db_ip(self, ip):
+        self.__db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self.__db_ip = ip
+    def db_change_ip(self, ip):
+        self.__db_ip = ip
+    def db_delete_ip(self, ip):
+        self.__db_ip = None
+    
+    def __get_db_vt_version(self):
+        return self.__db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self.__db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self.__db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self.__db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self.__db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self.__db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self.__db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self.__db_parent_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                self.__db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                if not self.__db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self.__db_module_execs[i])
+                del self.__db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == key:
+                return self.__db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return self.db_module_execs_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self.__db_parameters = []
+        else:
+            self.__db_parameters = parameters
+            for v in self.__db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        if self.db_parameters is None:
+            cp.db_parameters = []
+        else:
+            cp.db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_parameters:
+            cp.db_parameters_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_parameters(self):
+        return self.__db_parameters
+    def __set_db_parameters(self, parameters):
+        self.__db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self.__db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self.__db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                self.__db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self.__db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                if not self.__db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self.__db_parameters[i])
+                del self.__db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == key:
+                return self.__db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return self.db_parameters_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, name=None, actions=None, tags=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self.__db_actions = []
+        else:
+            self.__db_actions = actions
+            for v in self.__db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = []
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_actions is None:
+            cp.db_actions = []
+        else:
+            cp.db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_actions]
+        if self.db_tags is None:
+            cp.db_tags = []
+        else:
+            cp.db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_tags]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_actions:
+            cp.db_actions_id_index[v.db_id] = v
+        for v in cp.__db_tags:
+            cp.db_tags_id_index[v.db_id] = v
+            cp.db_tags_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions:
+            if child.has_changes():
+                return True
+        for child in self.db_tags:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                self.__db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                if not self.__db_actions[i].is_new:
+                    self.db_deleted_actions.append(self.__db_actions[i])
+                del self.__db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == key:
+                return self.__db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return self.db_actions_id_index.has_key(key)
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                self.__db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                if not self.__db_tags[i].is_new:
+                    self.db_deleted_tags.append(self.__db_tags[i])
+                del self.__db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == key:
+                return self.__db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return self.db_tags_id_index.has_key(key)
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, name=None, connections=None, annotations=None, others=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self.__db_modules = []
+        else:
+            self.__db_modules = modules
+            for v in self.__db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self.__db_id = id
+        self.__db_name = name
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self.__db_connections = []
+        else:
+            self.__db_connections = connections
+            for v in self.__db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self.__db_others = []
+        else:
+            self.__db_others = others
+            for v in self.__db_others:
+                self.db_others_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow()
+        if self.db_modules is None:
+            cp.db_modules = []
+        else:
+            cp.db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_modules]
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        if self.db_connections is None:
+            cp.db_connections = []
+        else:
+            cp.db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_connections]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_others is None:
+            cp.db_others = []
+        else:
+            cp.db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_modules:
+            cp.db_modules_id_index[v.db_id] = v
+        for v in cp.__db_connections:
+            cp.db_connections_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        for v in cp.__db_others:
+            cp.db_others_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_connections:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_others:
+            if child.has_changes():
+                return True
+        for child in self.db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self.__db_modules
+    def __set_db_modules(self, modules):
+        self.__db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self.__db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self.__db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == module.db_id:
+                self.__db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self.__db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == module.db_id:
+                if not self.__db_modules[i].is_new:
+                    self.db_deleted_modules.append(self.__db_modules[i])
+                del self.__db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == key:
+                return self.__db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return self.db_modules_id_index.has_key(key)
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_connections(self):
+        return self.__db_connections
+    def __set_db_connections(self, connections):
+        self.__db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self.__db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == connection.db_id:
+                self.__db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self.__db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == connection.db_id:
+                if not self.__db_connections[i].is_new:
+                    self.db_deleted_connections.append(self.__db_connections[i])
+                del self.__db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == key:
+                return self.__db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return self.db_connections_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def __get_db_others(self):
+        return self.__db_others
+    def __set_db_others(self, others):
+        self.__db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self.__db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self.__db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                self.__db_others[i] = other
+                found = True
+                break
+        if not found:
+            self.__db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                if not self.__db_others[i].is_new:
+                    self.db_deleted_others.append(self.__db_others[i])
+                del self.__db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == key:
+                return self.__db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return self.db_others_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstractionRef(object):
+
+    vtType = 'abstractionRef'
+
+    def __init__(self, id=None, name=None, cache=None, abstraction_id=None, version=None, location=None, functions=None, annotations=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_cache = cache
+        self.__db_abstraction_id = abstraction_id
+        self.__db_version = version
+        self.db_deleted_location = []
+        self.__db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+            for v in self.__db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstractionRef.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstractionRef()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_cache = self.db_cache
+        cp.db_abstraction_id = self.db_abstraction_id
+        cp.db_version = self.db_version
+        if self.db_location is not None:
+            cp.db_location = self.db_location.do_copy(new_ids, id_scope, id_remap)
+        if self.db_functions is None:
+            cp.db_functions = []
+        else:
+            cp.db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_functions]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_functions:
+            cp.db_functions_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        for child in self.db_functions:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_abstraction_id(self):
+        return self.__db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self.__db_location)
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                if not self.__db_functions[i].is_new:
+                    self.db_deleted_functions.append(self.__db_functions[i])
+                del self.__db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return self.db_functions_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self.__db_data = data
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_oldObjId = oldObjId
+        self.__db_newObjId = newObjId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange()
+        if self.db_data is not None:
+            cp.db_data = self.db_data.do_copy(new_ids, id_scope, id_remap)
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_oldObjId = self.db_oldObjId
+        cp.db_newObjId = self.db_newObjId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and id_remap.has_key((self.db_what, self.db_oldObjId)):
+                cp.db_oldObjId = id_remap[(self.db_what, self.db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and id_remap.has_key((self.db_what, self.db_newObjId)):
+                cp.db_newObjId = id_remap[(self.db_what, self.db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self.__db_data)
+        self.__db_data = None
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self.__db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self.__db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self.__db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self.__db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_val = val
+        self.__db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_val = self.db_val
+        cp.db_alias = self.db_alias
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_val(self):
+        return self.__db_val
+    def __set_db_val(self, val):
+        self.__db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self.__db_val = val
+    def db_change_val(self, val):
+        self.__db_val = val
+    def db_delete_val(self, val):
+        self.__db_val = None
+    
+    def __get_db_alias(self):
+        return self.__db_alias
+    def __set_db_alias(self, alias):
+        self.__db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self.__db_alias = alias
+    def db_change_alias(self, alias):
+        self.__db_alias = alias
+    def db_delete_alias(self, alias):
+        self.__db_alias = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self.__db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self.__db_ports = []
+        else:
+            self.__db_ports = ports
+            for v in self.__db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection()
+        cp.db_id = self.db_id
+        if self.db_ports is None:
+            cp.db_ports = []
+        else:
+            cp.db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_ports:
+            cp.db_ports_id_index[v.db_id] = v
+            cp.db_ports_type_index[v.db_type] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ports(self):
+        return self.__db_ports
+    def __set_db_ports(self, ports):
+        self.__db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self.__db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self.__db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                self.__db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self.__db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                if not self.__db_ports[i].is_new:
+                    self.db_deleted_ports.append(self.__db_ports[i])
+                del self.__db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == key:
+                return self.__db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return self.db_ports_id_index.has_key(key)
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return self.db_ports_type_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self.__db_operations = []
+        else:
+            self.__db_operations = operations
+            for v in self.__db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self.__db_id = id
+        self.__db_prevId = prevId
+        self.__db_date = date
+        self.__db_session = session
+        self.__db_user = user
+        self.__db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction()
+        if self.db_operations is None:
+            cp.db_operations = []
+        else:
+            cp.db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_operations]
+        cp.db_id = self.db_id
+        cp.db_prevId = self.db_prevId
+        cp.db_date = self.db_date
+        cp.db_session = self.db_session
+        cp.db_user = self.db_user
+        cp.db_prune = self.db_prune
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_operations:
+            cp.db_operations_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self.__db_operations
+    def __set_db_operations(self, operations):
+        self.__db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self.__db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self.__db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                self.__db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self.__db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                if not self.__db_operations[i].is_new:
+                    self.db_deleted_operations.append(self.__db_operations[i])
+                del self.__db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == key:
+                return self.__db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return self.db_operations_id_index.has_key(key)
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_prevId(self):
+        return self.__db_prevId
+    def __set_db_prevId(self, prevId):
+        self.__db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self.__db_prevId = None
+    
+    def __get_db_date(self):
+        return self.__db_date
+    def __set_db_date(self, date):
+        self.__db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self.__db_date = date
+    def db_change_date(self, date):
+        self.__db_date = date
+    def db_delete_date(self, date):
+        self.__db_date = None
+    
+    def __get_db_session(self):
+        return self.__db_session
+    def __set_db_session(self, session):
+        self.__db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self.__db_session = session
+    def db_change_session(self, session):
+        self.__db_session = session
+    def db_delete_session(self, session):
+        self.__db_session = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_prune(self):
+        return self.__db_prune
+    def __set_db_prune(self, prune):
+        self.__db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self.__db_prune = prune
+    def db_change_prune(self, prune):
+        self.__db_prune = prune
+    def db_delete_prune(self, prune):
+        self.__db_prune = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and id_remap.has_key((self.db_what, self.db_objectId)):
+                cp.db_objectId = id_remap[(self.db_what, self.db_objectId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, version=None, name=None, last_modified=None, dbHost=None, dbPort=None, dbName=None, actions=None, tags=None, abstractions=None):
+        self.__db_id = id
+        self.__db_version = version
+        self.__db_name = name
+        self.__db_last_modified = last_modified
+        self.__db_dbHost = dbHost
+        self.__db_dbPort = dbPort
+        self.__db_dbName = dbName
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self.__db_actions = []
+        else:
+            self.__db_actions = actions
+            for v in self.__db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = []
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self.__db_abstractions = []
+        else:
+            self.__db_abstractions = abstractions
+            for v in self.__db_abstractions:
+                self.db_abstractions_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail()
+        cp.db_id = self.db_id
+        cp.db_version = self.db_version
+        cp.db_name = self.db_name
+        cp.db_last_modified = self.db_last_modified
+        cp.db_dbHost = self.db_dbHost
+        cp.db_dbPort = self.db_dbPort
+        cp.db_dbName = self.db_dbName
+        if self.db_actions is None:
+            cp.db_actions = []
+        else:
+            cp.db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_actions]
+        if self.db_tags is None:
+            cp.db_tags = []
+        else:
+            cp.db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_tags]
+        if self.db_abstractions is None:
+            cp.db_abstractions = []
+        else:
+            cp.db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_abstractions]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_actions:
+            cp.db_actions_id_index[v.db_id] = v
+        for v in cp.__db_tags:
+            cp.db_tags_id_index[v.db_id] = v
+            cp.db_tags_name_index[v.db_name] = v
+        for v in cp.__db_abstractions:
+            cp.db_abstractions_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_abstractions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_abstractions)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_abstractions = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions:
+            if child.has_changes():
+                return True
+        for child in self.db_tags:
+            if child.has_changes():
+                return True
+        for child in self.db_abstractions:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_last_modified(self):
+        return self.__db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self.__db_last_modified = None
+    
+    def __get_db_dbHost(self):
+        return self.__db_dbHost
+    def __set_db_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+        self.is_dirty = True
+    db_dbHost = property(__get_db_dbHost, __set_db_dbHost)
+    def db_add_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_change_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_delete_dbHost(self, dbHost):
+        self.__db_dbHost = None
+    
+    def __get_db_dbPort(self):
+        return self.__db_dbPort
+    def __set_db_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+        self.is_dirty = True
+    db_dbPort = property(__get_db_dbPort, __set_db_dbPort)
+    def db_add_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_change_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_delete_dbPort(self, dbPort):
+        self.__db_dbPort = None
+    
+    def __get_db_dbName(self):
+        return self.__db_dbName
+    def __set_db_dbName(self, dbName):
+        self.__db_dbName = dbName
+        self.is_dirty = True
+    db_dbName = property(__get_db_dbName, __set_db_dbName)
+    def db_add_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_change_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_delete_dbName(self, dbName):
+        self.__db_dbName = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                self.__db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                if not self.__db_actions[i].is_new:
+                    self.db_deleted_actions.append(self.__db_actions[i])
+                del self.__db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == key:
+                return self.__db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return self.db_actions_id_index.has_key(key)
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                self.__db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                if not self.__db_tags[i].is_new:
+                    self.db_deleted_tags.append(self.__db_tags[i])
+                del self.__db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == key:
+                return self.__db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return self.db_tags_id_index.has_key(key)
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def __get_db_abstractions(self):
+        return self.__db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self.__db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self.__db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                self.__db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                if not self.__db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self.__db_abstractions[i])
+                del self.__db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == key:
+                return self.__db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return self.db_abstractions_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, module_id=None, module_name=None, annotations=None):
+        self.__db_id = id
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_module_id = module_id
+        self.__db_module_name = module_name
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec()
+        cp.db_id = self.db_id
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_module_id = self.db_module_id
+        cp.db_module_name = self.db_module_name
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and id_remap.has_key(('module', self.db_module_id)):
+                cp.db_module_id = id_remap[('module', self.db_module_id)]
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_module_id(self):
+        return self.__db_module_id
+    def __set_db_module_id(self, module_id):
+        self.__db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self.__db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self.__db_module_name
+    def __set_db_module_name(self, module_name):
+        self.__db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self.__db_module_name = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
diff --git a/vistrails/db/versions/v0_8_0/domain/id_scope.py b/vistrails/db/versions/v0_8_0/domain/id_scope.py
new file mode 100644
index 0000000..c510efa
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/domain/id_scope.py
@@ -0,0 +1,76 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]
+        if self.ids.has_key(objType):
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        else:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]        
+        if not self.ids.has_key(objType) or self.ids[objType] <= beginId:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_8_0/domain/vistrail.py b/vistrails/db/versions/v0_8_0/domain/vistrail.py
new file mode 100644
index 0000000..9c9b23c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/domain/vistrail.py
@@ -0,0 +1,48 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstractionRef.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
diff --git a/vistrails/db/versions/v0_8_0/domain/workflow.py b/vistrails/db/versions/v0_8_0/domain/workflow.py
new file mode 100644
index 0000000..2a8f059
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/domain/workflow.py
@@ -0,0 +1,126 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1)
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.objects = {}
+        for (child, _, _) in cp.db_children():
+            cp.addToIndex(child)
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    def addToIndex(self, object):
+        self.objects[(object.vtType, object.getPrimaryKey())] = object
+
+    def deleteFromIndex(self, object):
+        del self.objects[(object.vtType, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_add_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_change_object(self, object, parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_change_%s' % object.vtType
+        objCopy = copy.copy(object)
+        getattr(parentObj, funname)(objCopy)
+        self.addToIndex(objCopy)
+
+    def db_delete_object(self, objId, objType, 
+                         parentObjType=None, parentObjId=None):
+        if parentObjType is None or parentObjId is None:
+            parentObj = self
+        else:
+            try:
+                parentObj = self.objects[(parentObjType, parentObjId)]
+            except KeyError:
+                msg = "Cannot find object of type '%s' with id '%s'" % \
+                    (parentObjType, parentObjId)
+                raise Exception(msg)
+        funname = 'db_get_%s' % objType
+        try:
+            object = getattr(parentObj, funname)(objId)
+        except AttributeError:
+            attr_name = 'db_%s' % objType
+            object = getattr(parentObj, attr_name)
+        funname = 'db_delete_%s' % objType
+        getattr(parentObj, funname)(object)
+        self.deleteFromIndex(object)
diff --git a/vistrails/db/versions/v0_8_0/persistence/__init__.py b/vistrails/db/versions/v0_8_0/persistence/__init__.py
new file mode 100644
index 0000000..37eacf9
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/__init__.py
@@ -0,0 +1,92 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_8_0 import version as my_version
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename):
+        """save_to_xml(obj, filename: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        root.set('version', my_version)
+        root.set('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
+        root.set('xsi:schemaLocation', 'http://www.vistrails.org/vistrail.xsd')
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        try:
+            root = ElementTree.fromstring(str)
+            return self.read_xml_object(obj_type, root)
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v0_8_0/persistence/sql/__init__.py b/vistrails/db/versions/v0_8_0/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_8_0/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_8_0/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..a8c910c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/sql/auto_gen.py
@@ -0,0 +1,2332 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_8_0.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[5], 'long', 'int')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_vistrailId = vistrailId
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'package', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[3], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_vistrailId = vistrailId
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'package', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[3], 'long', 'int')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_parentType = parentType
+            tag.db_vistrailId = vistrailId
+            tag.db_parent = parent
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_tag(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_vistrailId = vistrailId
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'vt_id', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'vt_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            vistrailId = self.convertFromDB(row[1], 'long', 'int')
+            
+            log = DBLog(id=id)
+            log.db_vistrailId = vistrailId
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'vt_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'module_exec_id']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            module_execs = self.convertFromDB(row[8], 'long', 'int')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'module_exec_id']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_module_exec') and obj.db_module_exec is not None:
+            columnMap['module_exec_id'] = \
+                self.convertToDB(obj.db_module_execs, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_machine_id = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_vistrailId = vistrailId
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_vistrailId = vistrailId
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'vt_id', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_vistrailId = vistrailId
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'vt_id', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'vt_id']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[4], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[5], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[6], 'long', 'int')
+            parent_type = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[8], 'long', 'int')
+            name = self.convertFromDB(row[9], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[10], 'long', 'int')
+            vistrailId = self.convertFromDB(row[11], 'long', 'int')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_vistrailId = vistrailId
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'vt_id']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_workflow_exec = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_vistrailId = vistrailId
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'vt_id', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'vt_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            
+            abstraction = DBAbstraction(name=name,
+                                        id=id)
+            abstraction.db_vistrail = vistrail
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('vistrail', obj.db_vistrail)]
+        p.db_add_abstraction(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'vt_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'vt_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrailId = self.convertFromDB(row[2], 'long', 'int')
+            
+            workflow = DBWorkflow(name=name,
+                                  id=id)
+            workflow.db_vistrailId = vistrailId
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'vt_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionRefSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(1023)')
+            cache = self.convertFromDB(row[2], 'int', 'int')
+            abstraction_id = self.convertFromDB(row[3], 'long', 'int')
+            version = self.convertFromDB(row[4], 'long', 'int')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            abstractionRef = DBAbstractionRef(cache=cache,
+                                              abstraction_id=abstraction_id,
+                                              version=version,
+                                              id=id)
+            abstractionRef.db_parentType = parentType
+            abstractionRef.db_vistrailId = vistrailId
+            abstractionRef.db_parent = parent
+            abstractionRef.is_dirty = False
+            res[('abstractionRef', id)] = abstractionRef
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'vt_id', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[4], 'long', 'int')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_vistrailId = vistrailId
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'vt_id', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_vistrailId = vistrailId
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'vt_id', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_vistrailId = vistrailId
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'vt_id', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'vt_id', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[2], 'long', 'int')
+            parent = self.convertFromDB(row[3], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_vistrailId = vistrailId
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'vt_id', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'vt_id', 'parent_id']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_parentType = parentType
+            action.db_vistrailId = vistrailId
+            action.db_parent = parent
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_action(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'vt_id', 'parent_id']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_vistrailId = vistrailId
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'vt_id']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['vt_id'] = self.convertToDB(id, 'long', 'int')
+            version = self.convertFromDB(row[1], 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[3], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        global_props['vt_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_abstractions:
+            child.db_vistrail = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'module_id', 'module_name', 'machine_id', 'wf_exec_id', 'vt_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            module_id = self.convertFromDB(row[3], 'long', 'int')
+            module_name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            machine_id = self.convertFromDB(row[5], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[6], 'long', 'int')
+            vistrailId = self.convertFromDB(row[7], 'long', 'int')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       id=id)
+            module_exec.db_machine_id = machine_id
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_vistrailId = vistrailId
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('machine', obj.db_machine_id)]
+        p.db_add_module_exec(obj)
+        p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+        p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'module_id', 'module_name', 'machine_id', 'wf_exec_id', 'vt_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_8_0/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_8_0/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..c54eb03
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/sql/sql_dao.py
@@ -0,0 +1,165 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return "'" + str(value).replace("'", "''") + "'"
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return "'" + value.isoformat() + "'"
+            elif type == 'datetime':
+                return "'" + value.strftime('%Y-%m-%d %H:%M:%S') + "'"
+            else:
+                return str(value)
+
+        return "''"
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return dbCommand
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        valueStr = ', '.join(values)
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return dbCommand
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            setStr += '%s %s = %s' % (comma, column, value)
+            comma = ','
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return dbCommand
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %s' % \
+                (whereClause, column, value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return dbCommand
+
+    def executeSQL(self, db, dbCommand, isFetch):
+        # print 'db: %s' % dbCommand
+        data = None
+        cursor = db.cursor()
+        cursor.execute(dbCommand)
+        if isFetch:
+            data = cursor.fetchall()
+        else:
+            data = cursor.lastrowid
+        cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v0_8_0/persistence/xml/__init__.py b/vistrails/db/versions/v0_8_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_8_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_8_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..1c4a266
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/xml/auto_gen.py
@@ -0,0 +1,1531 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_8_0.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       package=package,
+                       version=version,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('spec',self.convertToStr(port.db_spec, 'str'))
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child.tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    workflow_execs=workflow_execs,
+                    machines=machines)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflow_exec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'value':
+                _data = self.convertFromStr(child.text,'')
+                value = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        module_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'module_exec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            name=name,
+                            actions=actions,
+                            tags=tags)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        
+        # set elements
+        actions = abstraction.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = abstraction.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        connections = []
+        annotations = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                modules.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         connections=connections,
+                         annotations=annotations,
+                         others=others)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(module, childNode)
+        
+        return node
+
+class DBAbstractionRefXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstractionRef':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('abstractionId', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'long')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstractionRef(id=id,
+                               name=name,
+                               cache=cache,
+                               abstraction_id=abstraction_id,
+                               version=version,
+                               location=location,
+                               functions=functions,
+                               annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstractionRef, node=None):
+        if node is None:
+            node = ElementTree.Element('abstractionRef')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstractionRef.db_id, 'long'))
+        node.set('name',self.convertToStr(abstractionRef.db_name, 'str'))
+        node.set('cache',self.convertToStr(abstractionRef.db_cache, 'int'))
+        node.set('abstractionId',self.convertToStr(abstractionRef.db_abstraction_id, 'long'))
+        node.set('version',self.convertToStr(abstractionRef.db_version, 'long'))
+        
+        # set elements
+        location = abstractionRef.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstractionRef.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstractionRef.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'str')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'str'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('dbHost', None)
+        dbHost = self.convertFromStr(data, 'str')
+        data = node.get('dbPort', None)
+        dbPort = self.convertFromStr(data, 'int')
+        data = node.get('dbName', None)
+        dbName = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        abstractions = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         dbHost=dbHost,
+                         dbPort=dbPort,
+                         dbName=dbName,
+                         actions=actions,
+                         tags=tags,
+                         abstractions=abstractions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        node.set('dbHost',self.convertToStr(vistrail.db_dbHost, 'str'))
+        node.set('dbPort',self.convertToStr(vistrail.db_dbPort, 'int'))
+        node.set('dbName',self.convertToStr(vistrail.db_dbName, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        abstractions = vistrail.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           module_id=module_id,
+                           module_name=module_name,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_8_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_8_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_8_0/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_8_0/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..bbb4a0c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/schemas/sql/vistrails.sql
@@ -0,0 +1,249 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    module_exec_id int
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    name varchar(255),
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int,
+    name varchar(255),
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction_ref(
+    id int,
+    name varchar(1023),
+    cache int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session varchar(1023),
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    module_id int,
+    module_name varchar(255),
+    machine_id int,
+    wf_exec_id int,
+    vt_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_8_0/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_8_0/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..a4fd64c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, log_tbl, machine, add_tbl, other, location, workflow_exec, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, parameter, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v0_8_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_8_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..276a2c0
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,237 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:string"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_8_0/specs/abstraction.xml b/vistrails/db/versions/v0_8_0/specs/abstraction.xml
new file mode 100644
index 0000000..3cbb63a
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/abstraction.xml
@@ -0,0 +1,65 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstraction">
+  <layout>
+    <xml name="abstraction" nodeType="xs:element"/>
+    <sql table="abstraction"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="vistrail" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/abstractionRef.xml b/vistrails/db/versions/v0_8_0/specs/abstractionRef.xml
new file mode 100644
index 0000000..46b61ba
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/abstractionRef.xml
@@ -0,0 +1,100 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstractionRef">
+  <layout>
+    <xml name="abstractionRef" nodeType="xs:element"/>
+    <sql table="abstraction_ref"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml name="cache" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_id" type="long">
+    <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list"  mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/action.xml b/vistrails/db/versions/v0_8_0/specs/action.xml
new file mode 100644
index 0000000..1c7d3c5
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/action.xml
@@ -0,0 +1,110 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="session" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="prune" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/add.xml b/vistrails/db/versions/v0_8_0/specs/add.xml
new file mode 100644
index 0000000..11f560c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/add.xml
@@ -0,0 +1,111 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true"
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/annotation.xml b/vistrails/db/versions/v0_8_0/specs/annotation.xml
new file mode 100644
index 0000000..ba8194f
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/annotation.xml
@@ -0,0 +1,97 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="action">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/change.xml b/vistrails/db/versions/v0_8_0/specs/change.xml
new file mode 100644
index 0000000..8135c18
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/change.xml
@@ -0,0 +1,116 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/connection.xml b/vistrails/db/versions/v0_8_0/specs/connection.xml
new file mode 100644
index 0000000..b559fab
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/connection.xml
@@ -0,0 +1,74 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/delete.xml b/vistrails/db/versions/v0_8_0/specs/delete.xml
new file mode 100644
index 0000000..abcdfdb
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/delete.xml
@@ -0,0 +1,78 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/function.xml b/vistrails/db/versions/v0_8_0/specs/function.xml
new file mode 100644
index 0000000..a95590d
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/function.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/location.xml b/vistrails/db/versions/v0_8_0/specs/location.xml
new file mode 100644
index 0000000..99c62f7
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/location.xml
@@ -0,0 +1,83 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_8_0/specs/log.xml b/vistrails/db/versions/v0_8_0/specs/log.xml
new file mode 100644
index 0000000..ca8720e
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/log.xml
@@ -0,0 +1,62 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/machine.xml b/vistrails/db/versions/v0_8_0/specs/machine.xml
new file mode 100644
index 0000000..dea813d
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/machine.xml
@@ -0,0 +1,85 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="long" mapping="one-to-many">
+    <sql column="module_exec_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/module.xml b/vistrails/db/versions/v0_8_0/specs/module.xml
new file mode 100644
index 0000000..fc9ed2a
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/module.xml
@@ -0,0 +1,107 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	    index="name:type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/module_exec.xml b/vistrails/db/versions/v0_8_0/specs/module_exec.xml
new file mode 100644
index 0000000..465407b
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/module_exec.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module_exec">
+  <layout>
+    <xml name="moduleExec" nodeType="xs:element"/>
+    <sql table="module_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="module_id" type="long" foreignKey="true" object="module">
+    <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="module_name" type="str">
+    <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="machine" name="machine_id" type="long" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="machine_id" type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/other.xml b/vistrails/db/versions/v0_8_0/specs/other.xml
new file mode 100644
index 0000000..40e1388
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/other.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/parameter.xml b/vistrails/db/versions/v0_8_0/specs/parameter.xml
new file mode 100644
index 0000000..78f6cf7
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/parameter.xml
@@ -0,0 +1,94 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/port.xml b/vistrails/db/versions/v0_8_0/specs/port.xml
new file mode 100644
index 0000000..94f7671
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/port.xml
@@ -0,0 +1,95 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(4095)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/portSpec.xml b/vistrails/db/versions/v0_8_0/specs/portSpec.xml
new file mode 100644
index 0000000..e42a5f0
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/portSpec.xml
@@ -0,0 +1,84 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/tag.xml b/vistrails/db/versions/v0_8_0/specs/tag.xml
new file mode 100644
index 0000000..f8412b9
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/tag.xml
@@ -0,0 +1,71 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	    object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+  
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/vistrail.xml b/vistrails/db/versions/v0_8_0/specs/vistrail.xml
new file mode 100644
index 0000000..ccbd34c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/vistrail.xml
@@ -0,0 +1,85 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="vt_id"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_0/specs/workflow.xml b/vistrails/db/versions/v0_8_0/specs/workflow.xml
new file mode 100644
index 0000000..56189f1
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/workflow.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <choice name="module" type="list" mapping="one-to-many">
+    <property name="module" ref="true" object="module">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="abstractionRef" ref="true" object="abstractionRef">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property ref="true" object="connection" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+  
diff --git a/vistrails/db/versions/v0_8_0/specs/workflow_exec.xml b/vistrails/db/versions/v0_8_0/specs/workflow_exec.xml
new file mode 100644
index 0000000..b616623
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/specs/workflow_exec.xml
@@ -0,0 +1,106 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow_exec">
+  <layout>
+    <xml name="workflowExec" nodeType="xs:element"/>
+    <sql table="workflow_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="vt_version" type="str">
+    <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="parent_id" type="long">
+    <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent_type" type="str">
+    <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parent_version" type="long">
+    <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_0/translate/__init__.py b/vistrails/db/versions/v0_8_0/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_8_0/translate/v0_7_0.py b/vistrails/db/versions/v0_8_0/translate/v0_7_0.py
new file mode 100644
index 0000000..67ade06
--- /dev/null
+++ b/vistrails/db/versions/v0_8_0/translate/v0_7_0.py
@@ -0,0 +1,128 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_8_0.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+
+    for _action in _vistrail.db_actions:
+        ops = []
+        for op in _action.db_operations:
+            if op.vtType == 'add':
+                data = convert_data(op.db_data)
+                ops.append(DBAdd(id=op.db_id,
+                                 what=op.db_what, 
+                                 objectId=op.db_objectId, 
+                                 parentObjId=op.db_parentObjId, 
+                                 parentObjType=op.db_parentObjType, 
+                                 data=data))
+            elif op.vtType == 'change':
+                data = convert_data(op.db_data)
+                ops.append(DBChange(id=op.db_id,
+                                    what=op.db_what, 
+                                    oldObjId=op.db_oldObjId, 
+                                    newObjId=op.db_newObjId,
+                                    parentObjId=op.db_parentObjId, 
+                                    parentObjType=op.db_parentObjType, 
+                                    data=data))
+            elif op.vtType == 'delete':
+                ops.append(DBDelete(id=op.db_id,
+                                    what=op.db_what, 
+                                    objectId=op.db_objectId, 
+                                    parentObjId=op.db_parentObjId, 
+                                    parentObjType=op.db_parentObjType))
+        annotations = []
+        for annotation in _action.db_annotations:
+            annotations.append(DBAnnotation(id=annotation.db_id,
+                                            key=annotation.db_key,
+                                            value=annotation.db_value))
+        action = DBAction(id=_action.db_id,
+                          prevId=_action.db_prevId, 
+                          date=_action.db_date, 
+                          user=_action.db_user, 
+                          operations=ops,
+                          annotations=annotations)
+        vistrail.db_add_action(action)
+
+    for _tag in _vistrail.db_tags:
+        tag = DBTag(id=_tag.db_id,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    vistrail.db_version = '0.8.0'
+    return vistrail
+
+def convert_data(child):
+    if child.vtType == 'module':
+        return DBModule(id=child.db_id,
+                        cache=child.db_cache, 
+                        name=child.db_name,
+                        package=child.db_package)
+    elif child.vtType == 'connection':
+        return DBConnection(id=child.db_id)
+    elif child.vtType == 'portSpec':
+        return DBPortSpec(id=child.db_id,
+                          name=child.db_name, 
+                          type=child.db_type, 
+                          spec=child.db_spec)
+    elif child.vtType == 'function':
+        return DBFunction(id=child.db_id,
+                          pos=child.db_pos, 
+                          name=child.db_name)
+    elif child.vtType == 'parameter':
+        return DBParameter(id=child.db_id,
+                           pos=child.db_pos,
+                           name=child.db_name, 
+                           type=child.db_type, 
+                           val=child.db_val, 
+                           alias=child.db_alias)
+    elif child.vtType == 'location':
+        return DBLocation(id=child.db_id,
+                          x=child.db_x,
+                          y=child.db_y)
+    elif child.vtType == 'annotation':
+        return DBAnnotation(id=child.db_id,
+                            key=child.db_key,
+                            value=child.db_value)
+    elif child.vtType == 'port':
+        return DBPort(id=child.db_id,
+                      type=child.db_type, 
+                      moduleId=child.db_moduleId, 
+                      moduleName=child.db_moduleName, 
+                      name=child.db_name,
+                      spec=child.db_spec)
diff --git a/vistrails/db/versions/v0_8_1/__init__.py b/vistrails/db/versions/v0_8_1/__init__.py
new file mode 100644
index 0000000..f5dd2ba
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.8.1'
diff --git a/vistrails/db/versions/v0_8_1/domain/__init__.py b/vistrails/db/versions/v0_8_1/domain/__init__.py
new file mode 100644
index 0000000..5537997
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/domain/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_8_0.domain import *
diff --git a/vistrails/db/versions/v0_8_1/persistence/__init__.py b/vistrails/db/versions/v0_8_1/persistence/__init__.py
new file mode 100644
index 0000000..b24b280
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/persistence/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_8_0.persistence import DAOList
diff --git a/vistrails/db/versions/v0_8_1/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_8_1/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..bbb4a0c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/schemas/sql/vistrails.sql
@@ -0,0 +1,249 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    module_exec_id int
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    name varchar(255),
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int,
+    name varchar(255),
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction_ref(
+    id int,
+    name varchar(1023),
+    cache int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session varchar(1023),
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    module_id int,
+    module_name varchar(255),
+    machine_id int,
+    wf_exec_id int,
+    vt_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_8_1/schemas/sql/vistrails.sql.bkp b/vistrails/db/versions/v0_8_1/schemas/sql/vistrails.sql.bkp
new file mode 100644
index 0000000..4f11895
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/schemas/sql/vistrails.sql.bkp
@@ -0,0 +1,248 @@
+--#############################################################################
+--
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: vistrails at sci.utah.edu
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int,
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    module_exec_id int
+) type=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    name varchar(255),
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE workflow(
+    id int,
+    name varchar(255),
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE abstraction_ref(
+    id int,
+    name varchar(1023),
+    cache int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session varchar(1023),
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    vt_id int,
+    parent_id int
+) type=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    vt_id int
+) type=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) type=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    module_id int,
+    module_name varchar(255),
+    machine_id int,
+    wf_exec_id int,
+    vt_id int
+) type=InnoDB;
+
diff --git a/vistrails/db/versions/v0_8_1/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_8_1/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..a4fd64c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, log_tbl, machine, add_tbl, other, location, workflow_exec, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, parameter, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v0_8_1/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_8_1/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..276a2c0
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/schemas/xml/vistrail.xsd
@@ -0,0 +1,237 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:string"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_8_1/specs/abstraction.xml b/vistrails/db/versions/v0_8_1/specs/abstraction.xml
new file mode 100644
index 0000000..3cbb63a
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/abstraction.xml
@@ -0,0 +1,65 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstraction">
+  <layout>
+    <xml name="abstraction" nodeType="xs:element"/>
+    <sql table="abstraction"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="vistrail" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/abstractionRef.xml b/vistrails/db/versions/v0_8_1/specs/abstractionRef.xml
new file mode 100644
index 0000000..46b61ba
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/abstractionRef.xml
@@ -0,0 +1,100 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstractionRef">
+  <layout>
+    <xml name="abstractionRef" nodeType="xs:element"/>
+    <sql table="abstraction_ref"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml name="cache" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_id" type="long">
+    <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list"  mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/action.xml b/vistrails/db/versions/v0_8_1/specs/action.xml
new file mode 100644
index 0000000..1c7d3c5
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/action.xml
@@ -0,0 +1,110 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="session" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="prune" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/add.xml b/vistrails/db/versions/v0_8_1/specs/add.xml
new file mode 100644
index 0000000..11f560c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/add.xml
@@ -0,0 +1,111 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true"
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/annotation.xml b/vistrails/db/versions/v0_8_1/specs/annotation.xml
new file mode 100644
index 0000000..ba8194f
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/annotation.xml
@@ -0,0 +1,97 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="action">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/change.xml b/vistrails/db/versions/v0_8_1/specs/change.xml
new file mode 100644
index 0000000..8135c18
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/change.xml
@@ -0,0 +1,116 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/connection.xml b/vistrails/db/versions/v0_8_1/specs/connection.xml
new file mode 100644
index 0000000..b559fab
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/connection.xml
@@ -0,0 +1,74 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/delete.xml b/vistrails/db/versions/v0_8_1/specs/delete.xml
new file mode 100644
index 0000000..abcdfdb
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/delete.xml
@@ -0,0 +1,78 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/function.xml b/vistrails/db/versions/v0_8_1/specs/function.xml
new file mode 100644
index 0000000..a95590d
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/function.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/location.xml b/vistrails/db/versions/v0_8_1/specs/location.xml
new file mode 100644
index 0000000..99c62f7
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/location.xml
@@ -0,0 +1,83 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_8_1/specs/log.xml b/vistrails/db/versions/v0_8_1/specs/log.xml
new file mode 100644
index 0000000..ca8720e
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/log.xml
@@ -0,0 +1,62 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/machine.xml b/vistrails/db/versions/v0_8_1/specs/machine.xml
new file mode 100644
index 0000000..dea813d
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/machine.xml
@@ -0,0 +1,85 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="long" mapping="one-to-many">
+    <sql column="module_exec_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/module.xml b/vistrails/db/versions/v0_8_1/specs/module.xml
new file mode 100644
index 0000000..fc9ed2a
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/module.xml
@@ -0,0 +1,107 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	    index="name:type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/module_exec.xml b/vistrails/db/versions/v0_8_1/specs/module_exec.xml
new file mode 100644
index 0000000..465407b
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/module_exec.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module_exec">
+  <layout>
+    <xml name="moduleExec" nodeType="xs:element"/>
+    <sql table="module_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="module_id" type="long" foreignKey="true" object="module">
+    <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="module_name" type="str">
+    <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="machine" name="machine_id" type="long" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="machine_id" type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/other.xml b/vistrails/db/versions/v0_8_1/specs/other.xml
new file mode 100644
index 0000000..40e1388
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/other.xml
@@ -0,0 +1,79 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/parameter.xml b/vistrails/db/versions/v0_8_1/specs/parameter.xml
new file mode 100644
index 0000000..78f6cf7
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/parameter.xml
@@ -0,0 +1,94 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/port.xml b/vistrails/db/versions/v0_8_1/specs/port.xml
new file mode 100644
index 0000000..94f7671
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/port.xml
@@ -0,0 +1,95 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(4095)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/portSpec.xml b/vistrails/db/versions/v0_8_1/specs/portSpec.xml
new file mode 100644
index 0000000..e42a5f0
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/portSpec.xml
@@ -0,0 +1,84 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/tag.xml b/vistrails/db/versions/v0_8_1/specs/tag.xml
new file mode 100644
index 0000000..f8412b9
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/tag.xml
@@ -0,0 +1,71 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	    object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+  
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/vistrail.xml b/vistrails/db/versions/v0_8_1/specs/vistrail.xml
new file mode 100644
index 0000000..ccbd34c
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/vistrail.xml
@@ -0,0 +1,85 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="vt_id"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_8_1/specs/workflow.xml b/vistrails/db/versions/v0_8_1/specs/workflow.xml
new file mode 100644
index 0000000..56189f1
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/workflow.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <choice name="module" type="list" mapping="one-to-many">
+    <property name="module" ref="true" object="module">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="abstractionRef" ref="true" object="abstractionRef">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property ref="true" object="connection" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
+  
diff --git a/vistrails/db/versions/v0_8_1/specs/workflow_exec.xml b/vistrails/db/versions/v0_8_1/specs/workflow_exec.xml
new file mode 100644
index 0000000..b616623
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/specs/workflow_exec.xml
@@ -0,0 +1,106 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow_exec">
+  <layout>
+    <xml name="workflowExec" nodeType="xs:element"/>
+    <sql table="workflow_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="vt_version" type="str">
+    <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="parent_id" type="long">
+    <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent_type" type="str">
+    <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parent_version" type="long">
+    <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_8_1/translate/__init__.py b/vistrails/db/versions/v0_8_1/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_8_1/translate/v0_8_0.py b/vistrails/db/versions/v0_8_1/translate/v0_8_0.py
new file mode 100644
index 0000000..c007351
--- /dev/null
+++ b/vistrails/db/versions/v0_8_1/translate/v0_8_0.py
@@ -0,0 +1,84 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_8_0.domain import DBAdd, DBAnnotation, DBChange, DBDelete
+
+# two step process
+# 1. remap all the old "notes" so that they exist in the id scope
+# 2. remap all the annotations that were numbered correctly
+# note that for 2, we don't need to worry about uniqueness -- they are unique
+# but step 1 may have taken some of their ids...
+
+def translateVistrail(vistrail):
+    id_remap = {}
+    for action in vistrail.db_get_actions():
+        # don't need to change key idx since none of that changes
+        new_action_idx = {}
+        for annotation in action.db_get_annotations():
+            annotation.db_id = vistrail.idScope.getNewId(DBAnnotation.vtType)
+            new_action_idx[annotation.db_id] = annotation
+        action.db_annotations_id_index = new_action_idx
+
+        for operation in action.db_get_operations():
+            # never have annotations as parent objs so 
+            # don't have to worry about those ids
+            if operation.db_what == DBAnnotation.vtType:
+                if operation.vtType == 'add':
+                    new_id = vistrail.idScope.getNewId(DBAnnotation.vtType)
+                    old_id = operation.db_objectId
+                    operation.db_objectId = new_id
+                    operation.db_data.db_id = new_id
+                    id_remap[old_id] = new_id
+                elif operation.vtType == 'change':
+                    changed_id = operation.db_oldObjId
+                    if id_remap.has_key(changed_id):
+                        operation.db_oldObjId = id_remap[changed_id]
+                    else:
+                        raise VistrailsDBException('cannot translate')
+
+                    new_id = vistrail.idScope.getNewId(DBAnnotation.vtType)
+                    old_id = operation.db_newObjId
+                    operation.db_newObjId = new_id
+                    operation.db_data.db_id = new_id
+                    id_remap[old_id] = new_id
+                elif operation.vtType == 'delete':
+                    old_id = operation.db_objectId
+                    if id_remap.has_key(old_id):
+                        operation.db_objectId = id_remap[old_id]
+                    else:
+                        raise VistrailsDBException('cannot translate')
+
+    vistrail.db_version = '0.8.1'
+    return vistrail
diff --git a/vistrails/db/versions/v0_9_0/__init__.py b/vistrails/db/versions/v0_9_0/__init__.py
new file mode 100644
index 0000000..e8a8036
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.0'
diff --git a/vistrails/db/versions/v0_9_0/domain/__init__.py b/vistrails/db/versions/v0_9_0/domain/__init__.py
new file mode 100644
index 0000000..1fd287d
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from abstraction import DBAbstraction
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_9_0/domain/abstraction.py b/vistrails/db/versions/v0_9_0/domain/abstraction.py
new file mode 100644
index 0000000..6c3ecb5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/abstraction.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+from auto_gen import DBAbstraction as _DBAbstraction
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+class DBAbstraction(_DBAbstraction):
+    def __init__(self, *args, **kwargs):
+        _DBAbstraction.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAbstractionRef.vtType: DBModule.vtType})
+        self.idScope.setBeginId('action', 1)
+
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBAbstraction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBAbstraction
+        # need to go through and reset the index to the copied objects
+        cp.idScope = copy.copy(self.idScope)
+        return cp
diff --git a/vistrails/db/versions/v0_9_0/domain/auto_gen.py b/vistrails/db/versions/v0_9_0/domain/auto_gen.py
new file mode 100644
index 0000000..bfc1313
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/auto_gen.py
@@ -0,0 +1,4458 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_spec = self.db_spec
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self.__db_id = id
+        self.__db_cache = cache
+        self.__db_name = name
+        self.__db_package = package
+        self.__db_version = version
+        self.__db_tag = tag
+        self.db_deleted_location = []
+        self.__db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+            for v in self.__db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self.__db_portSpecs = []
+        else:
+            self.__db_portSpecs = portSpecs
+            for v in self.__db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule()
+        cp.db_id = self.db_id
+        cp.db_cache = self.db_cache
+        cp.db_name = self.db_name
+        cp.db_package = self.db_package
+        cp.db_version = self.db_version
+        cp.db_tag = self.db_tag
+        if self.db_location is not None:
+            cp.db_location = self.db_location.do_copy(new_ids, id_scope, id_remap)
+        if self.db_functions is None:
+            cp.db_functions = []
+        else:
+            cp.db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_functions]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_portSpecs is None:
+            cp.db_portSpecs = []
+        else:
+            cp.db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_functions:
+            cp.db_functions_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        for v in cp.__db_portSpecs:
+            cp.db_portSpecs_id_index[v.db_id] = v
+            cp.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        for child in self.db_functions:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_package(self):
+        return self.__db_package
+    def __set_db_package(self, package):
+        self.__db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self.__db_package = package
+    def db_change_package(self, package):
+        self.__db_package = package
+    def db_delete_package(self, package):
+        self.__db_package = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_tag(self):
+        return self.__db_tag
+    def __set_db_tag(self, tag):
+        self.__db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self.__db_tag = tag
+    def db_change_tag(self, tag):
+        self.__db_tag = tag
+    def db_delete_tag(self, tag):
+        self.__db_tag = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self.__db_location)
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                if not self.__db_functions[i].is_new:
+                    self.db_deleted_functions.append(self.__db_functions[i])
+                del self.__db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return self.db_functions_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def __get_db_portSpecs(self):
+        return self.__db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self.__db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self.__db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self.__db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                self.__db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self.__db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == portSpec.db_id:
+                if not self.__db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self.__db_portSpecs[i])
+                del self.__db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self.__db_portSpecs)):
+            if self.__db_portSpecs[i].db_id == key:
+                return self.__db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return self.db_portSpecs_id_index.has_key(key)
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return self.db_portSpecs_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and id_remap.has_key(('action', self.db_id)):
+                cp.db_id = id_remap[('action', self.db_id)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, spec=None):
+        self.__db_id = id
+        self.__db_type = type
+        self.__db_moduleId = moduleId
+        self.__db_moduleName = moduleName
+        self.__db_name = name
+        self.__db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort()
+        cp.db_id = self.db_id
+        cp.db_type = self.db_type
+        cp.db_moduleId = self.db_moduleId
+        cp.db_moduleName = self.db_moduleName
+        cp.db_name = self.db_name
+        cp.db_spec = self.db_spec
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and id_remap.has_key(('module', self.db_moduleId)):
+                cp.db_moduleId = id_remap[('module', self.db_moduleId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_moduleId(self):
+        return self.__db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self.__db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self.__db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self.__db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self.__db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self.__db_moduleName = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_spec(self):
+        return self.__db_spec
+    def __set_db_spec(self, spec):
+        self.__db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self.__db_spec = spec
+    def db_change_spec(self, spec):
+        self.__db_spec = spec
+    def db_delete_spec(self, spec):
+        self.__db_spec = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self.__db_id = id
+        self.__db_entity_type = entity_type
+        self.__db_version = version
+        self.__db_name = name
+        self.__db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self.__db_workflow_execs = []
+        else:
+            self.__db_workflow_execs = workflow_execs
+            for v in self.__db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self.__db_machines = []
+        else:
+            self.__db_machines = machines
+            for v in self.__db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self.__db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog()
+        cp.db_id = self.db_id
+        cp.db_entity_type = self.db_entity_type
+        cp.db_version = self.db_version
+        cp.db_name = self.db_name
+        cp.db_last_modified = self.db_last_modified
+        if self.db_workflow_execs is None:
+            cp.db_workflow_execs = []
+        else:
+            cp.db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_workflow_execs]
+        if self.db_machines is None:
+            cp.db_machines = []
+        else:
+            cp.db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_machines]
+        cp.db_vistrail_id = self.db_vistrail_id
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and id_remap.has_key(('vistrail', self.db_vistrail_id)):
+                cp.db_vistrail_id = id_remap[('vistrail', self.db_vistrail_id)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_workflow_execs:
+            cp.db_workflow_execs_id_index[v.db_id] = v
+        for v in cp.__db_machines:
+            cp.db_machines_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self.db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_entity_type(self):
+        return self.__db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self.__db_entity_type = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_last_modified(self):
+        return self.__db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self.__db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self.__db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self.__db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self.__db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self.__db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self.__db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self.__db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self.__db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self.__db_workflow_execs[i])
+                del self.__db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self.__db_workflow_execs)):
+            if self.__db_workflow_execs[i].db_id == key:
+                return self.__db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return self.db_workflow_execs_id_index.has_key(key)
+    
+    def __get_db_machines(self):
+        return self.__db_machines
+    def __set_db_machines(self, machines):
+        self.__db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self.__db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self.__db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == machine.db_id:
+                self.__db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self.__db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == machine.db_id:
+                if not self.__db_machines[i].is_new:
+                    self.db_deleted_machines.append(self.__db_machines[i])
+                del self.__db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self.__db_machines)):
+            if self.__db_machines[i].db_id == key:
+                return self.__db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return self.db_machines_id_index.has_key(key)
+    
+    def __get_db_vistrail_id(self):
+        return self.__db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_os = os
+        self.__db_architecture = architecture
+        self.__db_processor = processor
+        self.__db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_os = self.db_os
+        cp.db_architecture = self.db_architecture
+        cp.db_processor = self.db_processor
+        cp.db_ram = self.db_ram
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and id_remap.has_key(('vistrail', self.db_vistrailId)):
+                cp.db_vistrailId = id_remap[('vistrail', self.db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_os(self):
+        return self.__db_os
+    def __set_db_os(self, os):
+        self.__db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self.__db_os = os
+    def db_change_os(self, os):
+        self.__db_os = os
+    def db_delete_os(self, os):
+        self.__db_os = None
+    
+    def __get_db_architecture(self):
+        return self.__db_architecture
+    def __set_db_architecture(self, architecture):
+        self.__db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self.__db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self.__db_architecture = None
+    
+    def __get_db_processor(self):
+        return self.__db_processor
+    def __set_db_processor(self, processor):
+        self.__db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self.__db_processor = processor
+    def db_change_processor(self, processor):
+        self.__db_processor = processor
+    def db_delete_processor(self, processor):
+        self.__db_processor = None
+    
+    def __get_db_ram(self):
+        return self.__db_ram
+    def __set_db_ram(self, ram):
+        self.__db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self.__db_ram = ram
+    def db_change_ram(self, ram):
+        self.__db_ram = ram
+    def db_delete_ram(self, ram):
+        self.__db_ram = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self.__db_data = data
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd()
+        if self.db_data is not None:
+            cp.db_data = self.db_data.do_copy(new_ids, id_scope, id_remap)
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and id_remap.has_key((self.db_what, self.db_objectId)):
+                cp.db_objectId = id_remap[(self.db_what, self.db_objectId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self.__db_data)
+        self.__db_data = None
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self.__db_id = id
+        self.__db_x = x
+        self.__db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation()
+        cp.db_id = self.db_id
+        cp.db_x = self.db_x
+        cp.db_y = self.db_y
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_x(self):
+        return self.__db_x
+    def __set_db_x(self, x):
+        self.__db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self.__db_x = x
+    def db_change_x(self, x):
+        self.__db_x = x
+    def db_delete_x(self, x):
+        self.__db_x = None
+    
+    def __get_db_y(self):
+        return self.__db_y
+    def __set_db_y(self, y):
+        self.__db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self.__db_y = y
+    def db_change_y(self, y):
+        self.__db_y = y
+    def db_delete_y(self, y):
+        self.__db_y = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, name=None, module_execs=None):
+        self.__db_id = id
+        self.__db_user = user
+        self.__db_ip = ip
+        self.__db_vt_version = vt_version
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_parent_id = parent_id
+        self.__db_parent_type = parent_type
+        self.__db_parent_version = parent_version
+        self.__db_name = name
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self.__db_module_execs = []
+        else:
+            self.__db_module_execs = module_execs
+            for v in self.__db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec()
+        cp.db_id = self.db_id
+        cp.db_user = self.db_user
+        cp.db_ip = self.db_ip
+        cp.db_vt_version = self.db_vt_version
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_parent_id = self.db_parent_id
+        cp.db_parent_type = self.db_parent_type
+        cp.db_parent_version = self.db_parent_version
+        cp.db_name = self.db_name
+        if self.db_module_execs is None:
+            cp.db_module_execs = []
+        else:
+            cp.db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_module_execs:
+            cp.db_module_execs_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_ip(self):
+        return self.__db_ip
+    def __set_db_ip(self, ip):
+        self.__db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self.__db_ip = ip
+    def db_change_ip(self, ip):
+        self.__db_ip = ip
+    def db_delete_ip(self, ip):
+        self.__db_ip = None
+    
+    def __get_db_vt_version(self):
+        return self.__db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self.__db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self.__db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self.__db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self.__db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self.__db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self.__db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self.__db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self.__db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self.__db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self.__db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self.__db_parent_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_module_execs(self):
+        return self.__db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self.__db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self.__db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                self.__db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self.__db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == module_exec.db_id:
+                if not self.__db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self.__db_module_execs[i])
+                del self.__db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self.__db_module_execs)):
+            if self.__db_module_execs[i].db_id == key:
+                return self.__db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return self.db_module_execs_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self.__db_parameters = []
+        else:
+            self.__db_parameters = parameters
+            for v in self.__db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        if self.db_parameters is None:
+            cp.db_parameters = []
+        else:
+            cp.db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_parameters:
+            cp.db_parameters_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_parameters(self):
+        return self.__db_parameters
+    def __set_db_parameters(self, parameters):
+        self.__db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self.__db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self.__db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                self.__db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self.__db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == parameter.db_id:
+                if not self.__db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self.__db_parameters[i])
+                del self.__db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self.__db_parameters)):
+            if self.__db_parameters[i].db_id == key:
+                return self.__db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return self.db_parameters_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, entity_type=None, name=None, last_modified=None, actions=None, tags=None):
+        self.__db_id = id
+        self.__db_entity_type = entity_type
+        self.__db_name = name
+        self.__db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self.__db_actions = []
+        else:
+            self.__db_actions = actions
+            for v in self.__db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = []
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction()
+        cp.db_id = self.db_id
+        cp.db_entity_type = self.db_entity_type
+        cp.db_name = self.db_name
+        cp.db_last_modified = self.db_last_modified
+        if self.db_actions is None:
+            cp.db_actions = []
+        else:
+            cp.db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_actions]
+        if self.db_tags is None:
+            cp.db_tags = []
+        else:
+            cp.db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_tags]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_actions:
+            cp.db_actions_id_index[v.db_id] = v
+        for v in cp.__db_tags:
+            cp.db_tags_id_index[v.db_id] = v
+            cp.db_tags_name_index[v.db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions:
+            if child.has_changes():
+                return True
+        for child in self.db_tags:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_entity_type(self):
+        return self.__db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self.__db_entity_type = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_last_modified(self):
+        return self.__db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self.__db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                self.__db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                if not self.__db_actions[i].is_new:
+                    self.db_deleted_actions.append(self.__db_actions[i])
+                del self.__db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == key:
+                return self.__db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return self.db_actions_id_index.has_key(key)
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                self.__db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                if not self.__db_tags[i].is_new:
+                    self.db_deleted_tags.append(self.__db_tags[i])
+                del self.__db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == key:
+                return self.__db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return self.db_tags_id_index.has_key(key)
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, abstractions=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self.__db_modules = []
+        else:
+            self.__db_modules = modules
+            for v in self.__db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self.__db_id = id
+        self.__db_entity_type = entity_type
+        self.__db_name = name
+        self.__db_version = version
+        self.__db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self.__db_connections = []
+        else:
+            self.__db_connections = connections
+            for v in self.__db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self.__db_abstractions = []
+        else:
+            self.__db_abstractions = abstractions
+            for v in self.__db_abstractions:
+                self.db_abstractions_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self.__db_others = []
+        else:
+            self.__db_others = others
+            for v in self.__db_others:
+                self.db_others_id_index[v.db_id] = v
+        self.__db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow()
+        if self.db_modules is None:
+            cp.db_modules = []
+        else:
+            cp.db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_modules]
+        cp.db_id = self.db_id
+        cp.db_entity_type = self.db_entity_type
+        cp.db_name = self.db_name
+        cp.db_version = self.db_version
+        cp.db_last_modified = self.db_last_modified
+        if self.db_connections is None:
+            cp.db_connections = []
+        else:
+            cp.db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_connections]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        if self.db_abstractions is None:
+            cp.db_abstractions = []
+        else:
+            cp.db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_abstractions]
+        if self.db_others is None:
+            cp.db_others = []
+        else:
+            cp.db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_others]
+        cp.db_vistrail_id = self.db_vistrail_id
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and id_remap.has_key(('vistrail', self.db_vistrail_id)):
+                cp.db_vistrail_id = id_remap[('vistrail', self.db_vistrail_id)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_modules:
+            cp.db_modules_id_index[v.db_id] = v
+        for v in cp.__db_connections:
+            cp.db_connections_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        for v in cp.__db_abstractions:
+            cp.db_abstractions_id_index[v.db_id] = v
+        for v in cp.__db_others:
+            cp.db_others_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_abstractions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_abstractions)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_abstractions = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_connections:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_abstractions:
+            if child.has_changes():
+                return True
+        for child in self.db_others:
+            if child.has_changes():
+                return True
+        for child in self.db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self.__db_modules
+    def __set_db_modules(self, modules):
+        self.__db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self.__db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self.__db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == module.db_id:
+                self.__db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self.__db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == module.db_id:
+                if not self.__db_modules[i].is_new:
+                    self.db_deleted_modules.append(self.__db_modules[i])
+                del self.__db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self.__db_modules)):
+            if self.__db_modules[i].db_id == key:
+                return self.__db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return self.db_modules_id_index.has_key(key)
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_entity_type(self):
+        return self.__db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self.__db_entity_type = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_last_modified(self):
+        return self.__db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self.__db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self.__db_connections
+    def __set_db_connections(self, connections):
+        self.__db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self.__db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self.__db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == connection.db_id:
+                self.__db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self.__db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == connection.db_id:
+                if not self.__db_connections[i].is_new:
+                    self.db_deleted_connections.append(self.__db_connections[i])
+                del self.__db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self.__db_connections)):
+            if self.__db_connections[i].db_id == key:
+                return self.__db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return self.db_connections_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def __get_db_abstractions(self):
+        return self.__db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self.__db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self.__db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                self.__db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                if not self.__db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self.__db_abstractions[i])
+                del self.__db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == key:
+                return self.__db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return self.db_abstractions_id_index.has_key(key)
+    
+    def __get_db_others(self):
+        return self.__db_others
+    def __set_db_others(self, others):
+        self.__db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self.__db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self.__db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                self.__db_others[i] = other
+                found = True
+                break
+        if not found:
+            self.__db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == other.db_id:
+                if not self.__db_others[i].is_new:
+                    self.db_deleted_others.append(self.__db_others[i])
+                del self.__db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self.__db_others)):
+            if self.__db_others[i].db_id == key:
+                return self.__db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return self.db_others_id_index.has_key(key)
+    
+    def __get_db_vistrail_id(self):
+        return self.__db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self.__db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAbstractionRef(object):
+
+    vtType = 'abstractionRef'
+
+    def __init__(self, id=None, name=None, cache=None, abstraction_id=None, version=None, location=None, functions=None, annotations=None):
+        self.__db_id = id
+        self.__db_name = name
+        self.__db_cache = cache
+        self.__db_abstraction_id = abstraction_id
+        self.__db_version = version
+        self.db_deleted_location = []
+        self.__db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self.__db_functions = []
+        else:
+            self.__db_functions = functions
+            for v in self.__db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstractionRef.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstractionRef()
+        cp.db_id = self.db_id
+        cp.db_name = self.db_name
+        cp.db_cache = self.db_cache
+        cp.db_abstraction_id = self.db_abstraction_id
+        cp.db_version = self.db_version
+        if self.db_location is not None:
+            cp.db_location = self.db_location.do_copy(new_ids, id_scope, id_remap)
+        if self.db_functions is None:
+            cp.db_functions = []
+        else:
+            cp.db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_functions]
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_abstraction_id') and id_remap.has_key(('abstraction', self.db_abstraction_id)):
+                cp.db_abstraction_id = id_remap[('abstraction', self.db_abstraction_id)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_functions:
+            cp.db_functions_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_location is not None:
+            children.extend(self.db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_location is not None and self.db_location.has_changes():
+            return True
+        for child in self.db_functions:
+            if child.has_changes():
+                return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_cache(self):
+        return self.__db_cache
+    def __set_db_cache(self, cache):
+        self.__db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self.__db_cache = cache
+    def db_change_cache(self, cache):
+        self.__db_cache = cache
+    def db_delete_cache(self, cache):
+        self.__db_cache = None
+    
+    def __get_db_abstraction_id(self):
+        return self.__db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_location(self):
+        return self.__db_location
+    def __set_db_location(self, location):
+        self.__db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self.__db_location = location
+    def db_change_location(self, location):
+        self.__db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self.__db_location)
+        self.__db_location = None
+    
+    def __get_db_functions(self):
+        return self.__db_functions
+    def __set_db_functions(self, functions):
+        self.__db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self.__db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                self.__db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self.__db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == function.db_id:
+                if not self.__db_functions[i].is_new:
+                    self.db_deleted_functions.append(self.__db_functions[i])
+                del self.__db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self.__db_functions)):
+            if self.__db_functions[i].db_id == key:
+                return self.__db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return self.db_functions_id_index.has_key(key)
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self.__db_id = id
+        self.__db_key = key
+        self.__db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation()
+        cp.db_id = self.db_id
+        cp.db_key = self.db_key
+        cp.db_value = self.db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_key(self):
+        return self.__db_key
+    def __set_db_key(self, key):
+        self.__db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self.__db_key = key
+    def db_change_key(self, key):
+        self.__db_key = key
+    def db_delete_key(self, key):
+        self.__db_key = None
+    
+    def __get_db_value(self):
+        return self.__db_value
+    def __set_db_value(self, value):
+        self.__db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self.__db_value = value
+    def db_change_value(self, value):
+        self.__db_value = value
+    def db_delete_value(self, value):
+        self.__db_value = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self.__db_data = data
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_oldObjId = oldObjId
+        self.__db_newObjId = newObjId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange()
+        if self.db_data is not None:
+            cp.db_data = self.db_data.do_copy(new_ids, id_scope, id_remap)
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_oldObjId = self.db_oldObjId
+        cp.db_newObjId = self.db_newObjId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and id_remap.has_key((self.db_what, self.db_oldObjId)):
+                cp.db_oldObjId = id_remap[(self.db_what, self.db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and id_remap.has_key((self.db_what, self.db_newObjId)):
+                cp.db_newObjId = id_remap[(self.db_what, self.db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self.db_data is not None:
+            children.extend(self.db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self.db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self.db_data is not None and self.db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self.__db_data
+    def __set_db_data(self, data):
+        self.__db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self.__db_data = data
+    def db_change_data(self, data):
+        self.__db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self.__db_data)
+        self.__db_data = None
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self.__db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self.__db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self.__db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self.__db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self.__db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self.__db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self.__db_id = id
+        self.__db_pos = pos
+        self.__db_name = name
+        self.__db_type = type
+        self.__db_val = val
+        self.__db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter()
+        cp.db_id = self.db_id
+        cp.db_pos = self.db_pos
+        cp.db_name = self.db_name
+        cp.db_type = self.db_type
+        cp.db_val = self.db_val
+        cp.db_alias = self.db_alias
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_pos(self):
+        return self.__db_pos
+    def __set_db_pos(self, pos):
+        self.__db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self.__db_pos = pos
+    def db_change_pos(self, pos):
+        self.__db_pos = pos
+    def db_delete_pos(self, pos):
+        self.__db_pos = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_type(self):
+        return self.__db_type
+    def __set_db_type(self, type):
+        self.__db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self.__db_type = type
+    def db_change_type(self, type):
+        self.__db_type = type
+    def db_delete_type(self, type):
+        self.__db_type = None
+    
+    def __get_db_val(self):
+        return self.__db_val
+    def __set_db_val(self, val):
+        self.__db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self.__db_val = val
+    def db_change_val(self, val):
+        self.__db_val = val
+    def db_delete_val(self, val):
+        self.__db_val = None
+    
+    def __get_db_alias(self):
+        return self.__db_alias
+    def __set_db_alias(self, alias):
+        self.__db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self.__db_alias = alias
+    def db_change_alias(self, alias):
+        self.__db_alias = alias
+    def db_delete_alias(self, alias):
+        self.__db_alias = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self.__db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self.__db_ports = []
+        else:
+            self.__db_ports = ports
+            for v in self.__db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection()
+        cp.db_id = self.db_id
+        if self.db_ports is None:
+            cp.db_ports = []
+        else:
+            cp.db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_ports:
+            cp.db_ports_id_index[v.db_id] = v
+            cp.db_ports_type_index[v.db_type] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ports(self):
+        return self.__db_ports
+    def __set_db_ports(self, ports):
+        self.__db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self.__db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self.__db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                self.__db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self.__db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == port.db_id:
+                if not self.__db_ports[i].is_new:
+                    self.db_deleted_ports.append(self.__db_ports[i])
+                del self.__db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self.__db_ports)):
+            if self.__db_ports[i].db_id == key:
+                return self.__db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return self.db_ports_id_index.has_key(key)
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return self.db_ports_type_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self.__db_operations = []
+        else:
+            self.__db_operations = operations
+            for v in self.__db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self.__db_id = id
+        self.__db_prevId = prevId
+        self.__db_date = date
+        self.__db_session = session
+        self.__db_user = user
+        self.__db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction()
+        if self.db_operations is None:
+            cp.db_operations = []
+        else:
+            cp.db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_operations]
+        cp.db_id = self.db_id
+        cp.db_prevId = self.db_prevId
+        cp.db_date = self.db_date
+        cp.db_session = self.db_session
+        cp.db_user = self.db_user
+        cp.db_prune = self.db_prune
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_operations:
+            cp.db_operations_id_index[v.db_id] = v
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+            cp.db_annotations_key_index[v.db_key] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        for child in self.db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self.__db_operations
+    def __set_db_operations(self, operations):
+        self.__db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self.__db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self.__db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                self.__db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self.__db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == operation.db_id:
+                if not self.__db_operations[i].is_new:
+                    self.db_deleted_operations.append(self.__db_operations[i])
+                del self.__db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self.__db_operations)):
+            if self.__db_operations[i].db_id == key:
+                return self.__db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return self.db_operations_id_index.has_key(key)
+    
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_prevId(self):
+        return self.__db_prevId
+    def __set_db_prevId(self, prevId):
+        self.__db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self.__db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self.__db_prevId = None
+    
+    def __get_db_date(self):
+        return self.__db_date
+    def __set_db_date(self, date):
+        self.__db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self.__db_date = date
+    def db_change_date(self, date):
+        self.__db_date = date
+    def db_delete_date(self, date):
+        self.__db_date = None
+    
+    def __get_db_session(self):
+        return self.__db_session
+    def __set_db_session(self, session):
+        self.__db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self.__db_session = session
+    def db_change_session(self, session):
+        self.__db_session = session
+    def db_delete_session(self, session):
+        self.__db_session = None
+    
+    def __get_db_user(self):
+        return self.__db_user
+    def __set_db_user(self, user):
+        self.__db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self.__db_user = user
+    def db_change_user(self, user):
+        self.__db_user = user
+    def db_delete_user(self, user):
+        self.__db_user = None
+    
+    def __get_db_prune(self):
+        return self.__db_prune
+    def __set_db_prune(self, prune):
+        self.__db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self.__db_prune = prune
+    def db_change_prune(self, prune):
+        self.__db_prune = prune
+    def db_delete_prune(self, prune):
+        self.__db_prune = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return self.db_annotations_key_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.__db_id = id
+        self.__db_what = what
+        self.__db_objectId = objectId
+        self.__db_parentObjId = parentObjId
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete()
+        cp.db_id = self.db_id
+        cp.db_what = self.db_what
+        cp.db_objectId = self.db_objectId
+        cp.db_parentObjId = self.db_parentObjId
+        cp.db_parentObjType = self.db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and id_remap.has_key((self.db_what, self.db_objectId)):
+                cp.db_objectId = id_remap[(self.db_what, self.db_objectId)]
+            if hasattr(self, 'db_parentObjId') and id_remap.has_key((self.db_parentObjType, self.db_parentObjId)):
+                cp.db_parentObjId = id_remap[(self.db_parentObjType, self.db_parentObjId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_what(self):
+        return self.__db_what
+    def __set_db_what(self, what):
+        self.__db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self.__db_what = what
+    def db_change_what(self, what):
+        self.__db_what = what
+    def db_delete_what(self, what):
+        self.__db_what = None
+    
+    def __get_db_objectId(self):
+        return self.__db_objectId
+    def __set_db_objectId(self, objectId):
+        self.__db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self.__db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self.__db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self.__db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self.__db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self.__db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self.__db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self.__db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self.__db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, dbHost=None, dbPort=None, dbName=None, actions=None, tags=None, abstractions=None):
+        self.__db_id = id
+        self.__db_entity_type = entity_type
+        self.__db_version = version
+        self.__db_name = name
+        self.__db_last_modified = last_modified
+        self.__db_dbHost = dbHost
+        self.__db_dbPort = dbPort
+        self.__db_dbName = dbName
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self.__db_actions = []
+        else:
+            self.__db_actions = actions
+            for v in self.__db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self.__db_tags = []
+        else:
+            self.__db_tags = tags
+            for v in self.__db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self.__db_abstractions = []
+        else:
+            self.__db_abstractions = abstractions
+            for v in self.__db_abstractions:
+                self.db_abstractions_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail()
+        cp.db_id = self.db_id
+        cp.db_entity_type = self.db_entity_type
+        cp.db_version = self.db_version
+        cp.db_name = self.db_name
+        cp.db_last_modified = self.db_last_modified
+        cp.db_dbHost = self.db_dbHost
+        cp.db_dbPort = self.db_dbPort
+        cp.db_dbName = self.db_dbName
+        if self.db_actions is None:
+            cp.db_actions = []
+        else:
+            cp.db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_actions]
+        if self.db_tags is None:
+            cp.db_tags = []
+        else:
+            cp.db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_tags]
+        if self.db_abstractions is None:
+            cp.db_abstractions = []
+        else:
+            cp.db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_abstractions]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp.__db_actions:
+            cp.db_actions_id_index[v.db_id] = v
+        for v in cp.__db_tags:
+            cp.db_tags_id_index[v.db_id] = v
+            cp.db_tags_name_index[v.db_name] = v
+        for v in cp.__db_abstractions:
+            cp.db_abstractions_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_abstractions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_abstractions)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_abstractions = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_actions:
+            if child.has_changes():
+                return True
+        for child in self.db_tags:
+            if child.has_changes():
+                return True
+        for child in self.db_abstractions:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_entity_type(self):
+        return self.__db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self.__db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self.__db_entity_type = None
+    
+    def __get_db_version(self):
+        return self.__db_version
+    def __set_db_version(self, version):
+        self.__db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self.__db_version = version
+    def db_change_version(self, version):
+        self.__db_version = version
+    def db_delete_version(self, version):
+        self.__db_version = None
+    
+    def __get_db_name(self):
+        return self.__db_name
+    def __set_db_name(self, name):
+        self.__db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self.__db_name = name
+    def db_change_name(self, name):
+        self.__db_name = name
+    def db_delete_name(self, name):
+        self.__db_name = None
+    
+    def __get_db_last_modified(self):
+        return self.__db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self.__db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self.__db_last_modified = None
+    
+    def __get_db_dbHost(self):
+        return self.__db_dbHost
+    def __set_db_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+        self.is_dirty = True
+    db_dbHost = property(__get_db_dbHost, __set_db_dbHost)
+    def db_add_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_change_dbHost(self, dbHost):
+        self.__db_dbHost = dbHost
+    def db_delete_dbHost(self, dbHost):
+        self.__db_dbHost = None
+    
+    def __get_db_dbPort(self):
+        return self.__db_dbPort
+    def __set_db_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+        self.is_dirty = True
+    db_dbPort = property(__get_db_dbPort, __set_db_dbPort)
+    def db_add_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_change_dbPort(self, dbPort):
+        self.__db_dbPort = dbPort
+    def db_delete_dbPort(self, dbPort):
+        self.__db_dbPort = None
+    
+    def __get_db_dbName(self):
+        return self.__db_dbName
+    def __set_db_dbName(self, dbName):
+        self.__db_dbName = dbName
+        self.is_dirty = True
+    db_dbName = property(__get_db_dbName, __set_db_dbName)
+    def db_add_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_change_dbName(self, dbName):
+        self.__db_dbName = dbName
+    def db_delete_dbName(self, dbName):
+        self.__db_dbName = None
+    
+    def __get_db_actions(self):
+        return self.__db_actions
+    def __set_db_actions(self, actions):
+        self.__db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self.__db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                self.__db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self.__db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == action.db_id:
+                if not self.__db_actions[i].is_new:
+                    self.db_deleted_actions.append(self.__db_actions[i])
+                del self.__db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self.__db_actions)):
+            if self.__db_actions[i].db_id == key:
+                return self.__db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return self.db_actions_id_index.has_key(key)
+    
+    def __get_db_tags(self):
+        return self.__db_tags
+    def __set_db_tags(self, tags):
+        self.__db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self.__db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                self.__db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self.__db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == tag.db_id:
+                if not self.__db_tags[i].is_new:
+                    self.db_deleted_tags.append(self.__db_tags[i])
+                del self.__db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self.__db_tags)):
+            if self.__db_tags[i].db_id == key:
+                return self.__db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return self.db_tags_id_index.has_key(key)
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return self.db_tags_name_index.has_key(key)
+    
+    def __get_db_abstractions(self):
+        return self.__db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self.__db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self.__db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                self.__db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self.__db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == abstraction.db_id:
+                if not self.__db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self.__db_abstractions[i])
+                del self.__db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self.__db_abstractions)):
+            if self.__db_abstractions[i].db_id == key:
+                return self.__db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return self.db_abstractions_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, abstraction_id=None, abstraction_version=None, machine_id=None, annotations=None):
+        self.__db_id = id
+        self.__db_ts_start = ts_start
+        self.__db_ts_end = ts_end
+        self.__db_cached = cached
+        self.__db_module_id = module_id
+        self.__db_module_name = module_name
+        self.__db_completed = completed
+        self.__db_abstraction_id = abstraction_id
+        self.__db_abstraction_version = abstraction_version
+        self.__db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self.__db_annotations = []
+        else:
+            self.__db_annotations = annotations
+            for v in self.__db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec()
+        cp.db_id = self.db_id
+        cp.db_ts_start = self.db_ts_start
+        cp.db_ts_end = self.db_ts_end
+        cp.db_cached = self.db_cached
+        cp.db_module_id = self.db_module_id
+        cp.db_module_name = self.db_module_name
+        cp.db_completed = self.db_completed
+        cp.db_abstraction_id = self.db_abstraction_id
+        cp.db_abstraction_version = self.db_abstraction_version
+        cp.db_machine_id = self.db_machine_id
+        if self.db_annotations is None:
+            cp.db_annotations = []
+        else:
+            cp.db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self.db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if id_scope.remap.has_key(self.vtType):
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and id_remap.has_key(('module', self.db_module_id)):
+                cp.db_module_id = id_remap[('module', self.db_module_id)]
+            if hasattr(self, 'db_machine_id') and id_remap.has_key(('machine', self.db_machine_id)):
+                cp.db_machine_id = id_remap[('machine', self.db_machine_id)]
+        
+        # recreate indices and set flags
+        for v in cp.__db_annotations:
+            cp.db_annotations_id_index[v.db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self.db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self.__db_id
+    def __set_db_id(self, id):
+        self.__db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self.__db_id = id
+    def db_change_id(self, id):
+        self.__db_id = id
+    def db_delete_id(self, id):
+        self.__db_id = None
+    
+    def __get_db_ts_start(self):
+        return self.__db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self.__db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self.__db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self.__db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self.__db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self.__db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self.__db_cached
+    def __set_db_cached(self, cached):
+        self.__db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self.__db_cached = cached
+    def db_change_cached(self, cached):
+        self.__db_cached = cached
+    def db_delete_cached(self, cached):
+        self.__db_cached = None
+    
+    def __get_db_module_id(self):
+        return self.__db_module_id
+    def __set_db_module_id(self, module_id):
+        self.__db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self.__db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self.__db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self.__db_module_name
+    def __set_db_module_name(self, module_name):
+        self.__db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self.__db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self.__db_module_name = None
+    
+    def __get_db_completed(self):
+        return self.__db_completed
+    def __set_db_completed(self, completed):
+        self.__db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self.__db_completed = completed
+    def db_change_completed(self, completed):
+        self.__db_completed = completed
+    def db_delete_completed(self, completed):
+        self.__db_completed = None
+    
+    def __get_db_abstraction_id(self):
+        return self.__db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self.__db_abstraction_id = None
+    
+    def __get_db_abstraction_version(self):
+        return self.__db_abstraction_version
+    def __set_db_abstraction_version(self, abstraction_version):
+        self.__db_abstraction_version = abstraction_version
+        self.is_dirty = True
+    db_abstraction_version = property(__get_db_abstraction_version, __set_db_abstraction_version)
+    def db_add_abstraction_version(self, abstraction_version):
+        self.__db_abstraction_version = abstraction_version
+    def db_change_abstraction_version(self, abstraction_version):
+        self.__db_abstraction_version = abstraction_version
+    def db_delete_abstraction_version(self, abstraction_version):
+        self.__db_abstraction_version = None
+    
+    def __get_db_machine_id(self):
+        return self.__db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self.__db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self.__db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self.__db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self.__db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self.__db_annotations
+    def __set_db_annotations(self, annotations):
+        self.__db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self.__db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                self.__db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self.__db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == annotation.db_id:
+                if not self.__db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self.__db_annotations[i])
+                del self.__db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self.__db_annotations)):
+            if self.__db_annotations[i].db_id == key:
+                return self.__db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return self.db_annotations_id_index.has_key(key)
+    
+    def getPrimaryKey(self):
+        return self.__db_id
+
diff --git a/vistrails/db/versions/v0_9_0/domain/id_scope.py b/vistrails/db/versions/v0_9_0/domain/id_scope.py
new file mode 100644
index 0000000..c510efa
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/id_scope.py
@@ -0,0 +1,76 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]
+        if self.ids.has_key(objType):
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        else:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]        
+        if not self.ids.has_key(objType) or self.ids[objType] <= beginId:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        if self.remap.has_key(objType):
+            objType = self.remap[objType]
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_9_0/domain/log.py b/vistrails/db/versions/v0_9_0/domain/log.py
new file mode 100644
index 0000000..5f56556
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/log.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                              {DBAbstractionRef.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
diff --git a/vistrails/db/versions/v0_9_0/domain/vistrail.py b/vistrails/db/versions/v0_9_0/domain/vistrail.py
new file mode 100644
index 0000000..8edc340
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/vistrail.py
@@ -0,0 +1,64 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstractionRef.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
diff --git a/vistrails/db/versions/v0_9_0/domain/workflow.py b/vistrails/db/versions/v0_9_0/domain/workflow.py
new file mode 100644
index 0000000..04db38e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/domain/workflow.py
@@ -0,0 +1,155 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstractionRef.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.objects = {}
+        for (child, _, _) in cp.db_children():
+            cp.add_to_index(child)
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    def add_to_index(self, object):
+        if object.vtType == 'abstractionRef':
+            obj_type = 'module'
+        else:
+            obj_type = object.vtType
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        if object.vtType == 'abstractionRef':
+            obj_type = 'module'
+        else:
+            obj_type = object.vtType
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return self.objects.has_key((type, id))
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef':
+                    parent_obj_type = 'module'
+                if self.objects.has_key((parent_obj_type, parent_obj_id)):
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                else:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == 'abstractionRef':
+            obj_type = 'module'
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_%s' % obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef':
+                    parent_obj_type = 'module'
+                if self.objects.has_key((parent_obj_type, parent_obj_id)):
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                else:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef':
+                    parent_obj_type = 'module'
+                if self.objects.has_key((parent_obj_type, parent_obj_id)):
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                else:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == 'abstractionRef':
+            obj_type = 'module'
+        funname = 'db_get_%s' % obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_%s' % obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_%s' % obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v0_9_0/persistence/__init__.py b/vistrails/db/versions/v0_9_0/persistence/__init__.py
new file mode 100644
index 0000000..5fc0ad4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/__init__.py
@@ -0,0 +1,98 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_9_0 import version as my_version
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags):
+        """save_to_xml(obj : object, filename: str, tags: dict) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        root.set('version', my_version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id, lock=False):
+        pass
+
+    def save_to_db(self, db_connection, obj, doCopy=False):
+        pass
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        try:
+            root = ElementTree.fromstring(str)
+            return self.read_xml_object(obj_type, root)
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v0_9_0/persistence/sql/__init__.py b/vistrails/db/versions/v0_9_0/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_0/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_9_0/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..50d5fcd
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/sql/auto_gen.py
@@ -0,0 +1,2525 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_9_0.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[5], 'long', 'int')
+            entity_type = self.convertFromDB(row[6], 'str', 'char(16)')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[3], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_parentType = parentType
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.db_parent = parent
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_tag(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if not global_props.has_key('entity_type'):
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if not global_props.has_key('entity_id'):
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[4], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[5], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[6], 'long', 'int')
+            parent_type = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[8], 'long', 'int')
+            name = self.convertFromDB(row[9], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[10], 'long', 'int')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_workflow_exec = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'name', 'last_modified']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[3], 'datetime', 'datetime')
+            
+            abstraction = DBAbstraction(entity_type=entity_type,
+                                        name=name,
+                                        last_modified=last_modified,
+                                        id=id)
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'name', 'last_modified']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if not global_props.has_key('entity_type'):
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if not global_props.has_key('entity_id'):
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[3], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if not global_props.has_key('entity_type'):
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if not global_props.has_key('entity_id'):
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionRefSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(1023)')
+            cache = self.convertFromDB(row[2], 'int', 'int')
+            abstraction_id = self.convertFromDB(row[3], 'long', 'int')
+            version = self.convertFromDB(row[4], 'long', 'int')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            abstractionRef = DBAbstractionRef(name=name,
+                                              cache=cache,
+                                              abstraction_id=abstraction_id,
+                                              version=version,
+                                              id=id)
+            abstractionRef.db_parentType = parentType
+            abstractionRef.db_entity_id = entity_id
+            abstractionRef.db_entity_type = entity_type
+            abstractionRef.db_parent = parent
+            abstractionRef.is_dirty = False
+            res[('abstractionRef', id)] = abstractionRef
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_parentType = parentType
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.db_parent = parent
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_action(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if not global_props.has_key('entity_type'):
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if not global_props.has_key('entity_id'):
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            abstraction_id = self.convertFromDB(row[7], 'long', 'int')
+            abstraction_version = self.convertFromDB(row[8], 'long', 'int')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[10], 'long', 'int')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       abstraction_id=abstraction_id,
+                                       abstraction_version=abstraction_version,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+        p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_version') and obj.db_abstraction_version is not None:
+            columnMap['abstraction_version'] = \
+                self.convertToDB(obj.db_abstraction_version, 'long', 'int')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_0/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_9_0/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..c54eb03
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/sql/sql_dao.py
@@ -0,0 +1,165 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return "'" + str(value).replace("'", "''") + "'"
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return "'" + value.isoformat() + "'"
+            elif type == 'datetime':
+                return "'" + value.strftime('%Y-%m-%d %H:%M:%S') + "'"
+            else:
+                return str(value)
+
+        return "''"
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return dbCommand
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        valueStr = ', '.join(values)
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return dbCommand
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            setStr += '%s %s = %s' % (comma, column, value)
+            comma = ','
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return dbCommand
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %s' % \
+                (whereClause, column, value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return dbCommand
+
+    def executeSQL(self, db, dbCommand, isFetch):
+        # print 'db: %s' % dbCommand
+        data = None
+        cursor = db.cursor()
+        cursor.execute(dbCommand)
+        if isFetch:
+            data = cursor.fetchall()
+        else:
+            data = cursor.lastrowid
+        cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v0_9_0/persistence/xml/__init__.py b/vistrails/db/versions/v0_9_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_9_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..c939ec8
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/xml/auto_gen.py
@@ -0,0 +1,1584 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_9_0.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('spec',self.convertToStr(port.db_spec, 'str'))
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child.tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflow_exec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'value':
+                _data = self.convertFromStr(child.text,'')
+                value = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        module_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'module_exec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            name=name,
+                            actions=actions,
+                            tags=tags)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        
+        # set elements
+        actions = abstraction.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = abstraction.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        abstractions = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                modules.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         abstractions=abstractions,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        abstractions = workflow.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(module, childNode)
+        
+        return node
+
+class DBAbstractionRefXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstractionRef':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('abstractionId', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'long')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstractionRef(id=id,
+                               name=name,
+                               cache=cache,
+                               abstraction_id=abstraction_id,
+                               version=version,
+                               location=location,
+                               functions=functions,
+                               annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstractionRef, node=None):
+        if node is None:
+            node = ElementTree.Element('abstractionRef')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstractionRef.db_id, 'long'))
+        node.set('name',self.convertToStr(abstractionRef.db_name, 'str'))
+        node.set('cache',self.convertToStr(abstractionRef.db_cache, 'int'))
+        node.set('abstractionId',self.convertToStr(abstractionRef.db_abstraction_id, 'long'))
+        node.set('version',self.convertToStr(abstractionRef.db_version, 'long'))
+        
+        # set elements
+        location = abstractionRef.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstractionRef.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstractionRef.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'str')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'str'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('dbHost', None)
+        dbHost = self.convertFromStr(data, 'str')
+        data = node.get('dbPort', None)
+        dbPort = self.convertFromStr(data, 'int')
+        data = node.get('dbName', None)
+        dbName = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        abstractions = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         dbHost=dbHost,
+                         dbPort=dbPort,
+                         dbName=dbName,
+                         actions=actions,
+                         tags=tags,
+                         abstractions=abstractions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        node.set('dbHost',self.convertToStr(vistrail.db_dbHost, 'str'))
+        node.set('dbPort',self.convertToStr(vistrail.db_dbPort, 'int'))
+        node.set('dbName',self.convertToStr(vistrail.db_dbName, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        abstractions = vistrail.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('abstraction_id', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('abstraction_version', None)
+        abstraction_version = self.convertFromStr(data, 'long')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           abstraction_id=abstraction_id,
+                           abstraction_version=abstraction_version,
+                           machine_id=machine_id,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('abstraction_id',self.convertToStr(module_exec.db_abstraction_id, 'long'))
+        node.set('abstraction_version',self.convertToStr(module_exec.db_abstraction_version, 'long'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_9_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_9_0/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_9_0/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..e4ad867
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/schemas/sql/vistrails.sql
@@ -0,0 +1,281 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction_ref(
+    id int,
+    name varchar(1023),
+    cache int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session varchar(1023),
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    abstraction_id int,
+    abstraction_version int,
+    machine_id int,
+    wf_exec_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_9_0/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_9_0/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..a4fd64c
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, log_tbl, machine, add_tbl, other, location, workflow_exec, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, parameter, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v0_9_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_9_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..a6c8708
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,238 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:string"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_9_0/specs/abstraction.xml b/vistrails/db/versions/v0_9_0/specs/abstraction.xml
new file mode 100644
index 0000000..aa63aee
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/abstraction.xml
@@ -0,0 +1,69 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstraction">
+  <layout>
+    <xml name="abstraction" nodeType="xs:element"/>
+    <sql table="abstraction"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+  
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/abstractionRef.xml b/vistrails/db/versions/v0_9_0/specs/abstractionRef.xml
new file mode 100644
index 0000000..f92f174
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/abstractionRef.xml
@@ -0,0 +1,106 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstractionRef">
+  <layout>
+    <xml name="abstractionRef" nodeType="xs:element"/>
+    <sql table="abstraction_ref"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml name="cache" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_id" type="long" foreignKey="true" 
+	    object="abstraction">
+    <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list"  mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/action.xml b/vistrails/db/versions/v0_9_0/specs/action.xml
new file mode 100644
index 0000000..e1048ab
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/action.xml
@@ -0,0 +1,113 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="session" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="prune" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/add.xml b/vistrails/db/versions/v0_9_0/specs/add.xml
new file mode 100644
index 0000000..0236869
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/add.xml
@@ -0,0 +1,114 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true"
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/annotation.xml b/vistrails/db/versions/v0_9_0/specs/annotation.xml
new file mode 100644
index 0000000..ccf678f
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/annotation.xml
@@ -0,0 +1,100 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="action">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/change.xml b/vistrails/db/versions/v0_9_0/specs/change.xml
new file mode 100644
index 0000000..92cff57
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/change.xml
@@ -0,0 +1,119 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/connection.xml b/vistrails/db/versions/v0_9_0/specs/connection.xml
new file mode 100644
index 0000000..2f6cefd
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/connection.xml
@@ -0,0 +1,77 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+  
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/delete.xml b/vistrails/db/versions/v0_9_0/specs/delete.xml
new file mode 100644
index 0000000..86d8855
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/delete.xml
@@ -0,0 +1,81 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/function.xml b/vistrails/db/versions/v0_9_0/specs/function.xml
new file mode 100644
index 0000000..61f349f
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/function.xml
@@ -0,0 +1,89 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/location.xml b/vistrails/db/versions/v0_9_0/specs/location.xml
new file mode 100644
index 0000000..2a7ea61
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/location.xml
@@ -0,0 +1,86 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_9_0/specs/log.xml b/vistrails/db/versions/v0_9_0/specs/log.xml
new file mode 100644
index 0000000..adb6466
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/log.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/machine.xml b/vistrails/db/versions/v0_9_0/specs/machine.xml
new file mode 100644
index 0000000..2cf9416
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/machine.xml
@@ -0,0 +1,90 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/module.xml b/vistrails/db/versions/v0_9_0/specs/module.xml
new file mode 100644
index 0000000..05f8454
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/module.xml
@@ -0,0 +1,115 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="tag" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	    index="name:type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/module_exec.xml b/vistrails/db/versions/v0_9_0/specs/module_exec.xml
new file mode 100644
index 0000000..8b86b73
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/module_exec.xml
@@ -0,0 +1,109 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module_exec">
+  <layout>
+    <xml name="moduleExec" nodeType="xs:element"/>
+    <sql table="module_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="cached" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql nodeType="int"/>
+  </property>
+
+  <property name="module_id" type="long" foreignKey="true" object="module">
+    <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="module_name" type="str">
+    <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="completed" type="int">
+    <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_id" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="machine_id" type="long" foreignKey="true" object="machine">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/other.xml b/vistrails/db/versions/v0_9_0/specs/other.xml
new file mode 100644
index 0000000..a87b179
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/other.xml
@@ -0,0 +1,82 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/parameter.xml b/vistrails/db/versions/v0_9_0/specs/parameter.xml
new file mode 100644
index 0000000..0a3a4b4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/parameter.xml
@@ -0,0 +1,97 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/port.xml b/vistrails/db/versions/v0_9_0/specs/port.xml
new file mode 100644
index 0000000..9073a77
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/port.xml
@@ -0,0 +1,98 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(4095)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/portSpec.xml b/vistrails/db/versions/v0_9_0/specs/portSpec.xml
new file mode 100644
index 0000000..bc52103
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/portSpec.xml
@@ -0,0 +1,87 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/tag.xml b/vistrails/db/versions/v0_9_0/specs/tag.xml
new file mode 100644
index 0000000..a5c380d
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/tag.xml
@@ -0,0 +1,75 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	    object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+  
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/vistrail.xml b/vistrails/db/versions/v0_9_0/specs/vistrail.xml
new file mode 100644
index 0000000..a97310b
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/vistrail.xml
@@ -0,0 +1,89 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+  
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_9_0/specs/workflow.xml b/vistrails/db/versions/v0_9_0/specs/workflow.xml
new file mode 100644
index 0000000..61523ba
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/workflow.xml
@@ -0,0 +1,98 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <choice name="module" type="list" mapping="one-to-many">
+    <property name="module" ref="true" object="module">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="abstractionRef" ref="true" object="abstractionRef">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property ref="true" object="connection" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <!-- only need for copy/paste for no sql bindings -->
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+</object>
+  
diff --git a/vistrails/db/versions/v0_9_0/specs/workflow_exec.xml b/vistrails/db/versions/v0_9_0/specs/workflow_exec.xml
new file mode 100644
index 0000000..d20253c
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/specs/workflow_exec.xml
@@ -0,0 +1,109 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow_exec">
+  <layout>
+    <xml name="workflowExec" nodeType="xs:element"/>
+    <sql table="workflow_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="vt_version" type="str">
+    <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="parent_id" type="long">
+    <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent_type" type="str">
+    <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parent_version" type="long">
+    <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_0/translate/__init__.py b/vistrails/db/versions/v0_9_0/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_9_0/translate/v0_8_1.py b/vistrails/db/versions/v0_9_0/translate/v0_8_1.py
new file mode 100644
index 0000000..23b811e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_0/translate/v0_8_1.py
@@ -0,0 +1,135 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_9_0.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort, DBAbstractionRef
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+
+    for _action in _vistrail.db_actions:
+        ops = []
+        for op in _action.db_operations:
+            if op.vtType == 'add':
+                data = convert_data(op.db_data)
+                ops.append(DBAdd(id=op.db_id,
+                                 what=op.db_what,
+                                 objectId=op.db_objectId,
+                                 parentObjId=op.db_parentObjId,
+                                 parentObjType=op.db_parentObjType,
+                                 data=data))
+            elif op.vtType == 'change':
+                data = convert_data(op.db_data)
+                ops.append(DBChange(id=op.db_id,
+                                    what=op.db_what,
+                                    oldObjId=op.db_oldObjId,
+                                    newObjId=op.db_newObjId,
+                                    parentObjId=op.db_parentObjId,
+                                    parentObjType=op.db_parentObjType,
+                                    data=data))
+            elif op.vtType == 'delete':
+                ops.append(DBDelete(id=op.db_id,
+                                    what=op.db_what,
+                                    objectId=op.db_objectId,
+                                    parentObjId=op.db_parentObjId,
+                                    parentObjType=op.db_parentObjType))
+        annotations = []
+        for annotation in _action.db_annotations:
+            annotations.append(DBAnnotation(id=annotation.db_id,
+                                            key=annotation.db_key,
+                                            value=annotation.db_value))
+        action = DBAction(id=_action.db_id,
+                          prevId=_action.db_prevId,
+                          date=_action.db_date,
+                          user=_action.db_user,
+                          prune=_action.db_prune,
+                          operations=ops,
+                          annotations=annotations)
+        vistrail.db_add_action(action)
+
+    for _tag in _vistrail.db_tags:
+        tag = DBTag(id=_tag.db_id,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    vistrail.db_version = '0.9.0'
+    return vistrail
+
+def convert_data(child):
+    if child.vtType == 'module':
+        return DBModule(id=child.db_id,
+                        cache=child.db_cache,
+                        name=child.db_name,
+                        package=child.db_package)
+    elif child.vtType == 'abstractionRef':
+        return DBAbstractionRef(id=child.db_id,
+                                name=child.db_name,
+                                cache=child.db_cache,
+                                abstraction_id=child.db_abstraction_id,
+                                version=child.db_version)
+    elif child.vtType == 'connection':
+        return DBConnection(id=child.db_id)
+    elif child.vtType == 'portSpec':
+        return DBPortSpec(id=child.db_id,
+                          name=child.db_name,
+                          type=child.db_type,
+                          spec=child.db_spec)
+    elif child.vtType == 'function':
+        return DBFunction(id=child.db_id,
+                          pos=child.db_pos,
+                          name=child.db_name)
+    elif child.vtType == 'parameter':
+        return DBParameter(id=child.db_id,
+                           pos=child.db_pos,
+                           name=child.db_name,
+                           type=child.db_type,
+                           val=child.db_val,
+                           alias=child.db_alias)
+    elif child.vtType == 'location':
+        return DBLocation(id=child.db_id,
+                          x=child.db_x,
+                          y=child.db_y)
+    elif child.vtType == 'annotation':
+        return DBAnnotation(id=child.db_id,
+                            key=child.db_key,
+                            value=child.db_value)
+    elif child.vtType == 'port':
+        return DBPort(id=child.db_id,
+                      type=child.db_type,
+                      moduleId=child.db_moduleId,
+                      moduleName=child.db_moduleName,
+                      name=child.db_name,
+                      spec=child.db_spec)
diff --git a/vistrails/db/versions/v0_9_1/__init__.py b/vistrails/db/versions/v0_9_1/__init__.py
new file mode 100644
index 0000000..b324ecf
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.1'
diff --git a/vistrails/db/versions/v0_9_1/domain/__init__.py b/vistrails/db/versions/v0_9_1/domain/__init__.py
new file mode 100644
index 0000000..1fd287d
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from abstraction import DBAbstraction
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_9_1/domain/abstraction.py b/vistrails/db/versions/v0_9_1/domain/abstraction.py
new file mode 100644
index 0000000..6c3ecb5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/abstraction.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+from auto_gen import DBAbstraction as _DBAbstraction
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+class DBAbstraction(_DBAbstraction):
+    def __init__(self, *args, **kwargs):
+        _DBAbstraction.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAbstractionRef.vtType: DBModule.vtType})
+        self.idScope.setBeginId('action', 1)
+
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBAbstraction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBAbstraction
+        # need to go through and reset the index to the copied objects
+        cp.idScope = copy.copy(self.idScope)
+        return cp
diff --git a/vistrails/db/versions/v0_9_1/domain/auto_gen.py b/vistrails/db/versions/v0_9_1/domain/auto_gen.py
new file mode 100644
index 0000000..c1e54b5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/auto_gen.py
@@ -0,0 +1,4809 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(self._db_id,
+                        self._db_name,
+                        self._db_type,
+                        self._db_spec)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_spec(self):
+        return self._db_spec
+    def __set_db_spec(self, spec):
+        self._db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self._db_spec = spec
+    def db_change_spec(self, spec):
+        self._db_spec = spec
+    def db_delete_spec(self, spec):
+        self._db_spec = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v._db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v._db_id] = v
+                self.db_annotations_key_index[v._db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v._db_id] = v
+                self.db_portSpecs_name_index[(v._db_name,v._db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(self._db_id,
+                      self._db_cache,
+                      self._db_name,
+                      self._db_namespace,
+                      self._db_package,
+                      self._db_version,
+                      self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v._db_id, v) for v in cp._db_functions)
+        for v in cp._db_annotations:
+            cp.db_annotations_id_index[v._db_id] = v
+            cp.db_annotations_key_index[v._db_key] = v
+        for v in cp._db_portSpecs:
+            cp.db_portSpecs_id_index[v._db_id] = v
+            cp.db_portSpecs_name_index[(v._db_name,v._db_type)] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_functions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_annotations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_portSpecs:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        if orphan:
+            for child in self._db_functions[:]:
+                self.db_delete_function(child)
+            for child in self._db_annotations[:]:
+                self.db_delete_annotation(child)
+            for child in self._db_portSpecs[:]:
+                self.db_delete_portSpec(child)
+            self._db_location = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function._db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == function._db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function._db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == function._db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function._db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation._db_id]
+        del self.db_annotations_key_index[annotation._db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec._db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec._db_name,portSpec._db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i]._db_id == portSpec._db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec._db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec._db_name,portSpec._db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i]._db_id == portSpec._db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec._db_id]
+        del self.db_portSpecs_name_index[(portSpec._db_name,portSpec._db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i]._db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(self._db_id,
+                   self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = [(self, parent[0], parent[1])]
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, spec=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(self._db_id,
+                    self._db_type,
+                    self._db_moduleId,
+                    self._db_moduleName,
+                    self._db_name,
+                    self._db_spec)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = [(self, parent[0], parent[1])]
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_spec(self):
+        return self._db_spec
+    def __set_db_spec(self, spec):
+        self._db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self._db_spec = spec
+    def db_change_spec(self, spec):
+        self._db_spec = spec
+    def db_delete_spec(self, spec):
+        self._db_spec = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v._db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v._db_id] = v
+                self.db_annotations_key_index[v._db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(self._db_id,
+                     self._db_workflow and self._db_workflow.do_copy(new_ids, id_scope, id_remap),
+                     self._db_cache,
+                     self._db_name,
+                     self._db_namespace,
+                     self._db_package,
+                     self._db_version,
+                     self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v._db_id, v) for v in cp._db_functions)
+        for v in cp._db_annotations:
+            cp.db_annotations_id_index[v._db_id] = v
+            cp.db_annotations_key_index[v._db_key] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_functions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_annotations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        if orphan:
+            self._db_location = None
+            for child in self._db_functions[:]:
+                self.db_delete_function(child)
+            for child in self._db_annotations[:]:
+                self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function._db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == function._db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function._db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == function._db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function._db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation._db_id]
+        del self.db_annotations_key_index[annotation._db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v._db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v._db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(self._db_id,
+                   self._db_entity_type,
+                   self._db_version,
+                   self._db_name,
+                   self._db_last_modified)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        cp._db_vistrail_id = self._db_vistrail_id
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        for v in cp._db_workflow_execs:
+            cp.db_workflow_execs_id_index[v._db_id] = v
+        for v in cp._db_machines:
+            cp.db_machines_id_index[v._db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self._db_machines:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self._db_deleted_workflow_execs)
+        children.extend(self._db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec._db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i]._db_id == workflow_exec._db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec._db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i]._db_id == workflow_exec._db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec._db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i]._db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine._db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i]._db_id == machine._db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine._db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i]._db_id == machine._db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine._db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i]._db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(self._db_id,
+                       self._db_name,
+                       self._db_os,
+                       self._db_architecture,
+                       self._db_processor,
+                       self._db_ram)
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(self._db_data and self._db_data.do_copy(new_ids, id_scope, id_remap),
+                   self._db_id,
+                   self._db_what,
+                   self._db_objectId,
+                   self._db_parentObjId,
+                   self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(self._db_id,
+                     self._db_key,
+                     self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(self._db_id,
+                        self._db_x,
+                        self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = [(self, parent[0], parent[1])]
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(self._db_id,
+                         self._db_pos,
+                         self._db_name,
+                         self._db_type,
+                         self._db_val,
+                         self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = [(self, parent[0], parent[1])]
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        if parameters is None:
+            self._db_parameters = []
+            self.db_parameters_id_index = {}
+        else:
+            self._db_parameters = parameters
+            self.db_parameters_id_index = dict((v._db_id, v)
+                                               for v in
+                                               self._db_parameters)
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(self._db_id,
+                        self._db_pos,
+                        self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v._db_id, v)
+                                         for v in
+                                         cp._db_parameters)
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self._db_parameters:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        if orphan:
+            for child in self._db_parameters[:]:
+                self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter._db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i]._db_id == parameter._db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter._db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i]._db_id == parameter._db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter._db_id]
+    def db_get_parameter(self, key):
+        try:
+            return self.db_parameters_id_index[key]
+        except KeyError:
+            for i in xrange(len(self._db_parameters)):
+                if self._db_parameters[i]._db_id == key:
+                    return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, entity_type=None, name=None, last_modified=None, actions=None, tags=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v._db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v._db_id] = v
+                self.db_tags_name_index[v._db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(self._db_id,
+                           self._db_entity_type,
+                           self._db_name,
+                           self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp._db_actions:
+            cp.db_actions_id_index[v._db_id] = v
+        for v in cp._db_tags:
+            cp.db_tags_id_index[v._db_id] = v
+            cp.db_tags_name_index[v._db_name] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_actions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self._db_tags:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action._db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i]._db_id == action._db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action._db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i]._db_id == action._db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action._db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i]._db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag._db_id] = tag
+        self.db_tags_name_index[tag._db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i]._db_id == tag._db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag._db_id] = tag
+        self.db_tags_name_index[tag._db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i]._db_id == tag._db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag._db_id]
+        del self.db_tags_name_index[tag._db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i]._db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, abstractions=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        self.db_modules_inverted_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for i, v in enumerate(self._db_modules):
+                self.db_modules_id_index[v._db_id] = v
+                self.db_modules_inverted_id_index[v._db_id] = i
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        self.db_connections_inverted_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for i, v in enumerate(self._db_connections):
+                self.db_connections_id_index[v._db_id] = v
+                self.db_connections_inverted_id_index[v._db_id] = i
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v._db_id] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self._db_abstractions = []
+        else:
+            self._db_abstractions = abstractions
+            for v in self._db_abstractions:
+                self.db_abstractions_id_index[v._db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v._db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow()
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        cp._db_id = self._db_id
+        cp._db_entity_type = self._db_entity_type
+        cp._db_name = self._db_name
+        cp._db_version = self._db_version
+        cp._db_last_modified = self._db_last_modified
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_abstractions is None:
+            cp._db_abstractions = []
+        else:
+            cp._db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_abstractions]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        cp._db_vistrail_id = self._db_vistrail_id
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        for i, v in enumerate(cp._db_modules):
+            cp.db_modules_id_index[v._db_id] = v
+            cp.db_modules_inverted_id_index[v._db_id] = i
+        for i, v in enumerate(cp._db_connections):
+            cp.db_connections_id_index[v._db_id] = v
+            cp.db_connections_inverted_id_index[v._db_id] = i
+        for v in cp._db_annotations:
+            cp.db_annotations_id_index[v._db_id] = v
+        for v in cp._db_abstractions:
+            cp.db_abstractions_id_index[v._db_id] = v
+        for v in cp._db_others:
+            cp.db_others_id_index[v._db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        for child in self._db_connections:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_annotations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_abstractions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_others:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        for child in self._db_modules:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        if orphan:
+            for child in self._db_connections[:]:
+                self.db_delete_connection(child)
+            for child in self._db_annotations[:]:
+                self.db_delete_annotation(child)
+            for child in self._db_abstractions[:]:
+                self.db_delete_abstraction(child)
+            for child in self._db_others[:]:
+                self.db_delete_other(child)
+            for child in self._db_modules[:]:
+                self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_abstractions)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_abstractions = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_abstractions:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        # FIXME INDICES?
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self.db_modules_inverted_id_index[module._db_id] = len(self._db_modules)
+        self._db_modules.append(module)
+        self.db_modules_id_index[module._db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        try:
+            i = self.db_modules_inverted_id_index[module._db_id]
+        except KeyError:
+            found = False
+            for i in xrange(len(self._db_modules)):
+                if self._db_modules[i]._db_id == module._db_id:
+                    found = True
+                    break
+            if not found:
+                self.db_add_module(module)
+                return
+        self._db_modules[i] = module
+        self.db_modules_id_index[module._db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        try:
+            i = self.db_modules_inverted_id_index[module._db_id]
+        except KeyError:
+            for i in xrange(len(self._db_modules)):
+                if self._db_modules[i]._db_id == module._db_id:
+                    break
+        if not self._db_modules[i].is_new:
+            self.db_deleted_modules.append(self._db_modules[i])
+        # update inverted index because things got pulled back on the _db_modules list
+        for m in self._db_modules[i+1:]:
+            self.db_modules_inverted_id_index[m._db_id] -= 1
+        del self._db_modules[i]
+        del self.db_modules_id_index[module._db_id]
+        del self.db_modules_inverted_id_index[module._db_id]
+    def db_get_module(self, key):
+        try:
+            return self.db_modules_id_index[key]
+        except KeyError:
+            for module in self._db_modules:
+                if module._db_id == key:
+                    return module
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        # FIXME INDICES?
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self.db_connections_inverted_id_index[connection._db_id] = len(self._db_connections)
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection._db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        try:
+            i = self.db_connections_inverted_id_index[connection._db_id]
+        except KeyError:
+            found = False
+            for i in xrange(len(self._db_connections)):
+                if self._db_connections[i]._db_id == connection._db_id:
+                    self._db_connections[i] = connection
+                    found = True
+                    break
+            if not found:
+                self.db_add_connection(connection)
+                return
+        self._db_connections[i] = connection
+        self.db_connections_id_index[connection._db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        try:
+            i = self.db_connections_inverted_id_index[connection._db_id]
+        except KeyError:
+            for i in xrange(len(self._db_connections)):
+                if self._db_connections[i]._db_id == connection._db_id:
+                    break
+        if not self._db_connections[i].is_new:
+            self.db_deleted_connections.append(self._db_connections[i])
+        # update inverted index because things got pulled back on the _db_connections list
+        for conn in self._db_connections[i+1:]:
+            self.db_connections_inverted_id_index[conn._db_id] -= 1
+        del self._db_connections[i]
+        del self.db_connections_id_index[connection._db_id]
+        del self.db_connections_inverted_id_index[connection._db_id]
+        
+    def db_get_connection(self, key):
+        try:
+            return self.db_connections_id_index[key]
+        except KeyError:
+            for connection in self._db_connections:
+                if connection._db_id == key:
+                    return connection
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation._db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_abstractions(self):
+        return self._db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self._db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self._db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction._db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i]._db_id == abstraction._db_id:
+                self._db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction._db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i]._db_id == abstraction._db_id:
+                if not self._db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self._db_abstractions[i])
+                del self._db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction._db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i]._db_id == key:
+                return self._db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return key in self.db_abstractions_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other._db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i]._db_id == other._db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other._db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i]._db_id == other._db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other._db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i]._db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstractionRef(object):
+
+    vtType = 'abstractionRef'
+
+    def __init__(self, id=None, name=None, cache=None, abstraction_id=None, version=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_cache = cache
+        self._db_abstraction_id = abstraction_id
+        self._db_version = version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v._db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v._db_id] = v
+                self.db_annotations_key_index[v._db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstractionRef.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstractionRef()
+        cp._db_id = self._db_id
+        cp._db_name = self._db_name
+        cp._db_cache = self._db_cache
+        cp._db_abstraction_id = self._db_abstraction_id
+        cp._db_version = self._db_version
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_abstraction_id') and ('abstraction', self._db_abstraction_id) in id_remap:
+                cp._db_abstraction_id = id_remap[('abstraction', self._db_abstraction_id)]
+        
+        # recreate indices and set flags
+        for v in cp._db_functions:
+            cp.db_functions_id_index[v._db_id] = v
+        for v in cp._db_annotations:
+            cp.db_annotations_id_index[v._db_id] = v
+            cp.db_annotations_key_index[v._db_key] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self._db_functions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self._db_annotations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_abstraction_id(self):
+        return self._db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function._db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == function._db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function._db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == function._db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function._db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i]._db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation._db_id]
+        del self.db_annotations_key_index[annotation._db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation()
+        cp._db_id = self._db_id
+        cp._db_key = self._db_key
+        cp._db_value = self._db_value
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange()
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        cp._db_id = self._db_id
+        cp._db_what = self._db_what
+        cp._db_oldObjId = self._db_oldObjId
+        cp._db_newObjId = self._db_newObjId
+        cp._db_parentObjId = self._db_parentObjId
+        cp._db_parentObjType = self._db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, name=None, module_execs=None):
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_name = name
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self._db_module_execs = []
+        else:
+            self._db_module_execs = module_execs
+            for v in self._db_module_execs:
+                self.db_module_execs_id_index[v._db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec()
+        cp._db_id = self._db_id
+        cp._db_user = self._db_user
+        cp._db_ip = self._db_ip
+        cp._db_vt_version = self._db_vt_version
+        cp._db_ts_start = self._db_ts_start
+        cp._db_ts_end = self._db_ts_end
+        cp._db_parent_id = self._db_parent_id
+        cp._db_parent_type = self._db_parent_type
+        cp._db_parent_version = self._db_parent_version
+        cp._db_name = self._db_name
+        if self._db_module_execs is None:
+            cp._db_module_execs = []
+        else:
+            cp._db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp._db_module_execs:
+            cp.db_module_execs_id_index[v._db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_module_execs:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_module_execs(self):
+        return self._db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self._db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self._db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec._db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i]._db_id == module_exec._db_id:
+                self._db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec._db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i]._db_id == module_exec._db_id:
+                if not self._db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self._db_module_execs[i])
+                del self._db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec._db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i]._db_id == key:
+                return self._db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return key in self.db_module_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v._db_id] = v
+                self.db_ports_type_index[v._db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection()
+        cp._db_id = self._db_id
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp._db_ports:
+            cp.db_ports_id_index[v._db_id] = v
+            cp.db_ports_type_index[v._db_type] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_ports:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+        if orphan:
+            for child in self._db_ports[:]:
+                self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port._db_id] = port
+        self.db_ports_type_index[port._db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i]._db_id == port._db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port._db_id] = port
+        self.db_ports_type_index[port._db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i]._db_id == port._db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port._db_id]
+        del self.db_ports_type_index[port._db_type]
+    def db_get_port(self, key):
+        try:
+            return self.db_ports_id_index[key]
+        except KeyError:
+            for i in xrange(len(self._db_ports)):
+                if self._db_ports[i]._db_id == key:
+                    return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v._db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self._db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v._db_id] = v
+                self.db_annotations_key_index[v._db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction()
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        cp._db_id = self._db_id
+        cp._db_prevId = self._db_prevId
+        cp._db_date = self._db_date
+        cp._db_session = self._db_session
+        cp._db_user = self._db_user
+        cp._db_prune = self._db_prune
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp._db_operations:
+            cp.db_operations_id_index[v._db_id] = v
+        for v in cp._db_annotations:
+            cp.db_annotations_id_index[v._db_id] = v
+            cp.db_annotations_key_index[v._db_key] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_annotations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self._db_operations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation._db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i]._db_id == operation._db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation._db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i]._db_id == operation._db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation._db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i]._db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_prune(self):
+        return self._db_prune
+    def __set_db_prune(self, prune):
+        self._db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self._db_prune = prune
+    def db_change_prune(self, prune):
+        self._db_prune = prune
+    def db_delete_prune(self, prune):
+        self._db_prune = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+        self.db_annotations_key_index[annotation._db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation._db_id]
+        del self.db_annotations_key_index[annotation._db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete()
+        cp._db_id = self._db_id
+        cp._db_what = self._db_what
+        cp._db_objectId = self._db_objectId
+        cp._db_parentObjId = self._db_parentObjId
+        cp._db_parentObjType = self._db_parentObjType
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, dbHost=None, dbPort=None, dbName=None, actions=None, tags=None, abstractions=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self._db_dbHost = dbHost
+        self._db_dbPort = dbPort
+        self._db_dbName = dbName
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v._db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v._db_id] = v
+                self.db_tags_name_index[v._db_name] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self._db_abstractions = []
+        else:
+            self._db_abstractions = abstractions
+            for v in self._db_abstractions:
+                self.db_abstractions_id_index[v._db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail()
+        cp._db_id = self._db_id
+        cp._db_entity_type = self._db_entity_type
+        cp._db_version = self._db_version
+        cp._db_name = self._db_name
+        cp._db_last_modified = self._db_last_modified
+        cp._db_dbHost = self._db_dbHost
+        cp._db_dbPort = self._db_dbPort
+        cp._db_dbName = self._db_dbName
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_abstractions is None:
+            cp._db_abstractions = []
+        else:
+            cp._db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_abstractions]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+        
+        # recreate indices and set flags
+        for v in cp._db_actions:
+            cp.db_actions_id_index[v._db_id] = v
+        for v in cp._db_tags:
+            cp.db_tags_id_index[v._db_id] = v
+            cp.db_tags_name_index[v._db_name] = v
+        for v in cp._db_abstractions:
+            cp.db_abstractions_id_index[v._db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_actions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self._db_tags:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self._db_abstractions:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_abstractions)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_abstractions = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_abstractions:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_dbHost(self):
+        return self._db_dbHost
+    def __set_db_dbHost(self, dbHost):
+        self._db_dbHost = dbHost
+        self.is_dirty = True
+    db_dbHost = property(__get_db_dbHost, __set_db_dbHost)
+    def db_add_dbHost(self, dbHost):
+        self._db_dbHost = dbHost
+    def db_change_dbHost(self, dbHost):
+        self._db_dbHost = dbHost
+    def db_delete_dbHost(self, dbHost):
+        self._db_dbHost = None
+    
+    def __get_db_dbPort(self):
+        return self._db_dbPort
+    def __set_db_dbPort(self, dbPort):
+        self._db_dbPort = dbPort
+        self.is_dirty = True
+    db_dbPort = property(__get_db_dbPort, __set_db_dbPort)
+    def db_add_dbPort(self, dbPort):
+        self._db_dbPort = dbPort
+    def db_change_dbPort(self, dbPort):
+        self._db_dbPort = dbPort
+    def db_delete_dbPort(self, dbPort):
+        self._db_dbPort = None
+    
+    def __get_db_dbName(self):
+        return self._db_dbName
+    def __set_db_dbName(self, dbName):
+        self._db_dbName = dbName
+        self.is_dirty = True
+    db_dbName = property(__get_db_dbName, __set_db_dbName)
+    def db_add_dbName(self, dbName):
+        self._db_dbName = dbName
+    def db_change_dbName(self, dbName):
+        self._db_dbName = dbName
+    def db_delete_dbName(self, dbName):
+        self._db_dbName = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action._db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i]._db_id == action._db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action._db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i]._db_id == action._db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action._db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i]._db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag._db_id] = tag
+        self.db_tags_name_index[tag._db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i]._db_id == tag._db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag._db_id] = tag
+        self.db_tags_name_index[tag._db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i]._db_id == tag._db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag._db_id]
+        del self.db_tags_name_index[tag._db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i]._db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_abstractions(self):
+        return self._db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self._db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self._db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction._db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i]._db_id == abstraction._db_id:
+                self._db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction._db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i]._db_id == abstraction._db_id:
+                if not self._db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self._db_abstractions[i])
+                del self._db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction._db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i]._db_id == key:
+                return self._db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return key in self.db_abstractions_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, abstraction_id=None, abstraction_version=None, machine_id=None, annotations=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_abstraction_id = abstraction_id
+        self._db_abstraction_version = abstraction_version
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v._db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec()
+        cp._db_id = self._db_id
+        cp._db_ts_start = self._db_ts_start
+        cp._db_ts_end = self._db_ts_end
+        cp._db_cached = self._db_cached
+        cp._db_module_id = self._db_module_id
+        cp._db_module_name = self._db_module_name
+        cp._db_completed = self._db_completed
+        cp._db_abstraction_id = self._db_abstraction_id
+        cp._db_abstraction_version = self._db_abstraction_version
+        cp._db_machine_id = self._db_machine_id
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self._db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self._db_id)] = new_id
+            cp._db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        for v in cp._db_annotations:
+            cp.db_annotations_id_index[v._db_id] = v
+        cp.is_dirty = self.is_dirty
+        cp.is_new = self.is_new
+        return cp
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self._db_annotations:
+            children.extend(child.db_children((self.vtType, self._db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_abstraction_id(self):
+        return self._db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = None
+    
+    def __get_db_abstraction_version(self):
+        return self._db_abstraction_version
+    def __set_db_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+        self.is_dirty = True
+    db_abstraction_version = property(__get_db_abstraction_version, __set_db_abstraction_version)
+    def db_add_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_change_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_delete_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation._db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == annotation._db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation._db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i]._db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v0_9_1/domain/id_scope.py b/vistrails/db/versions/v0_9_1/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_9_1/domain/log.py b/vistrails/db/versions/v0_9_1/domain/log.py
new file mode 100644
index 0000000..5f56556
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/log.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                              {DBAbstractionRef.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
diff --git a/vistrails/db/versions/v0_9_1/domain/vistrail.py b/vistrails/db/versions/v0_9_1/domain/vistrail.py
new file mode 100644
index 0000000..fe0f902
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/vistrail.py
@@ -0,0 +1,66 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstractionRef, DBGroup, \
+    DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstractionRef.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
diff --git a/vistrails/db/versions/v0_9_1/domain/workflow.py b/vistrails/db/versions/v0_9_1/domain/workflow.py
new file mode 100644
index 0000000..cb1f6fe
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/domain/workflow.py
@@ -0,0 +1,158 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstractionRef, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstractionRef.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    _vtTypeMap = {'abstractionRef': 'module', 'group': 'module'}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef' or \
+                        parent_obj_type == 'group':
+                    parent_obj_type = 'module'
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == 'abstractionRef' or object.vtType == 'group':
+            obj_type = 'module'
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef' or \
+                        parent_obj_type == 'group':
+                    parent_obj_type = 'module'
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef' or \
+                        parent_obj_type == 'group':
+                    parent_obj_type = 'module'
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == 'abstractionRef' or obj_type == 'group':
+            obj_type = 'module'
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v0_9_1/persistence/__init__.py b/vistrails/db/versions/v0_9_1/persistence/__init__.py
new file mode 100644
index 0000000..d727263
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/__init__.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_9_1 import version as my_version
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        try:
+            root = ElementTree.fromstring(str)
+            return self.read_xml_object(obj_type, root)
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v0_9_1/persistence/sql/__init__.py b/vistrails/db/versions/v0_9_1/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_1/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_9_1/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..d64a45e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/sql/auto_gen.py
@@ -0,0 +1,2693 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_9_1.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[5], 'long', 'int')
+            entity_type = self.convertFromDB(row[6], 'str', 'char(16)')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_parentType = parentType
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.db_parent = parent
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_tag(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            tag=tag,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_parent(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_parent = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'name', 'last_modified']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[3], 'datetime', 'datetime')
+            
+            abstraction = DBAbstraction(entity_type=entity_type,
+                                        name=name,
+                                        last_modified=last_modified,
+                                        id=id)
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'name', 'last_modified']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id', 'parent_type']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'int')
+            parentType = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_parent = parent
+            workflow.db_parentType = parentType
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('group', obj.db_parent)]
+        p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id', 'parent_type']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionRefSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(1023)')
+            cache = self.convertFromDB(row[2], 'int', 'int')
+            abstraction_id = self.convertFromDB(row[3], 'long', 'int')
+            version = self.convertFromDB(row[4], 'long', 'int')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            abstractionRef = DBAbstractionRef(name=name,
+                                              cache=cache,
+                                              abstraction_id=abstraction_id,
+                                              version=version,
+                                              id=id)
+            abstractionRef.db_parentType = parentType
+            abstractionRef.db_entity_id = entity_id
+            abstractionRef.db_entity_type = entity_type
+            abstractionRef.db_parent = parent
+            abstractionRef.is_dirty = False
+            res[('abstractionRef', id)] = abstractionRef
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vt_version = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[4], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[5], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[6], 'long', 'int')
+            parent_type = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[8], 'long', 'int')
+            name = self.convertFromDB(row[9], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[10], 'long', 'int')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('log', obj.db_log)]
+        p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_module_execs:
+            child.db_workflow_exec = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_parentType = parentType
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.db_parent = parent
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_action(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('action', obj.db_action)]
+        p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            if not global_props.has_key('entity_id'):
+                global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            if not global_props.has_key('entity_type'):
+                global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            abstraction_id = self.convertFromDB(row[7], 'long', 'int')
+            abstraction_version = self.convertFromDB(row[8], 'long', 'int')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[10], 'long', 'int')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       abstraction_id=abstraction_id,
+                                       abstraction_version=abstraction_version,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+        p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_version') and obj.db_abstraction_version is not None:
+            columnMap['abstraction_version'] = \
+                self.convertToDB(obj.db_abstraction_version, 'long', 'int')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_1/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_9_1/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..c54eb03
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/sql/sql_dao.py
@@ -0,0 +1,165 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return "'" + str(value).replace("'", "''") + "'"
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return "'" + value.isoformat() + "'"
+            elif type == 'datetime':
+                return "'" + value.strftime('%Y-%m-%d %H:%M:%S') + "'"
+            else:
+                return str(value)
+
+        return "''"
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return dbCommand
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        valueStr = ', '.join(values)
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return dbCommand
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            setStr += '%s %s = %s' % (comma, column, value)
+            comma = ','
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %s' % \
+                        (whereClause, column, value)
+            whereClause = ' AND'
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return dbCommand
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %s' % \
+                (whereClause, column, value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return dbCommand
+
+    def executeSQL(self, db, dbCommand, isFetch):
+        # print 'db: %s' % dbCommand
+        data = None
+        cursor = db.cursor()
+        cursor.execute(dbCommand)
+        if isFetch:
+            data = cursor.fetchall()
+        else:
+            data = cursor.lastrowid
+        cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v0_9_1/persistence/xml/__init__.py b/vistrails/db/versions/v0_9_1/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_1/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_9_1/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..e31a2bf
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/xml/auto_gen.py
@@ -0,0 +1,1707 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_9_1.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('spec',self.convertToStr(port.db_spec, 'str'))
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      tag=tag,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        node.set('tag',self.convertToStr(group.db_tag, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child.tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflow_exec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'value':
+                _data = self.convertFromStr(child.text,'')
+                value = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            name=name,
+                            actions=actions,
+                            tags=tags)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        
+        # set elements
+        actions = abstraction.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = abstraction.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        abstractions = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         abstractions=abstractions,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        abstractions = workflow.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBAbstractionRefXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstractionRef':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('abstractionId', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'long')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstractionRef(id=id,
+                               name=name,
+                               cache=cache,
+                               abstraction_id=abstraction_id,
+                               version=version,
+                               location=location,
+                               functions=functions,
+                               annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstractionRef, node=None):
+        if node is None:
+            node = ElementTree.Element('abstractionRef')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstractionRef.db_id, 'long'))
+        node.set('name',self.convertToStr(abstractionRef.db_name, 'str'))
+        node.set('cache',self.convertToStr(abstractionRef.db_cache, 'int'))
+        node.set('abstractionId',self.convertToStr(abstractionRef.db_abstraction_id, 'long'))
+        node.set('version',self.convertToStr(abstractionRef.db_version, 'long'))
+        
+        # set elements
+        location = abstractionRef.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstractionRef.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstractionRef.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        module_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'module_exec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'str')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'str'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('dbHost', None)
+        dbHost = self.convertFromStr(data, 'str')
+        data = node.get('dbPort', None)
+        dbPort = self.convertFromStr(data, 'int')
+        data = node.get('dbName', None)
+        dbName = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        abstractions = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         dbHost=dbHost,
+                         dbPort=dbPort,
+                         dbName=dbName,
+                         actions=actions,
+                         tags=tags,
+                         abstractions=abstractions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        node.set('dbHost',self.convertToStr(vistrail.db_dbHost, 'str'))
+        node.set('dbPort',self.convertToStr(vistrail.db_dbPort, 'int'))
+        node.set('dbName',self.convertToStr(vistrail.db_dbName, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        abstractions = vistrail.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('abstraction_id', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('abstraction_version', None)
+        abstraction_version = self.convertFromStr(data, 'long')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           abstraction_id=abstraction_id,
+                           abstraction_version=abstraction_version,
+                           machine_id=machine_id,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('abstraction_id',self.convertToStr(module_exec.db_abstraction_id, 'long'))
+        node.set('abstraction_version',self.convertToStr(module_exec.db_abstraction_version, 'long'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_1/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_9_1/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_9_1/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_9_1/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..1e45703
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/schemas/sql/vistrails.sql
@@ -0,0 +1,298 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int,
+    parent_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE abstraction_ref(
+    id int,
+    name varchar(1023),
+    cache int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session varchar(1023),
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    abstraction_id int,
+    abstraction_version int,
+    machine_id int,
+    wf_exec_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_9_1/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_9_1/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..3cb6da4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, workflow_exec, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v0_9_1/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_9_1/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..22bdf2a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/schemas/xml/vistrail.xsd
@@ -0,0 +1,277 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="dbHost" type="xs:string"/>
+      <xs:attribute name="dbPort" type="xs:int"/>
+      <xs:attribute name="dbName" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:string"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_9_1/schemas/xml/vtlink.xsd b/vistrails/db/versions/v0_9_1/schemas/xml/vtlink.xsd
new file mode 100644
index 0000000..e1ec5d0
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/schemas/xml/vtlink.xsd
@@ -0,0 +1,52 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xs:element name="vtlink">
+<xs:complexType>
+<xs:attribute name="host" type="xs:string"></xs:attribute>
+<xs:attribute name="database" type="xs:string"></xs:attribute>
+<xs:attribute name="port" type="xs:int"></xs:attribute>
+<xs:attribute name="vtid" type="xs:int"></xs:attribute>
+<xs:attribute name="version" type="xs:int"></xs:attribute>
+<xs:attribute name="tag" type="xs:string"></xs:attribute>
+<xs:attribute name="execute" type="xs:boolean"></xs:attribute>
+<xs:attribute name="showSpreadsheetOnly" type="xs:boolean"></xs:attribute>
+</xs:complexType>
+</xs:element>
+
+</xs:schema>
diff --git a/vistrails/db/versions/v0_9_1/specs/abstraction.xml b/vistrails/db/versions/v0_9_1/specs/abstraction.xml
new file mode 100644
index 0000000..aa63aee
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/abstraction.xml
@@ -0,0 +1,69 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstraction">
+  <layout>
+    <xml name="abstraction" nodeType="xs:element"/>
+    <sql table="abstraction"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+  
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/abstractionRef.xml b/vistrails/db/versions/v0_9_1/specs/abstractionRef.xml
new file mode 100644
index 0000000..f92f174
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/abstractionRef.xml
@@ -0,0 +1,106 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="abstractionRef">
+  <layout>
+    <xml name="abstractionRef" nodeType="xs:element"/>
+    <sql table="abstraction_ref"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml name="cache" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_id" type="long" foreignKey="true" 
+	    object="abstraction">
+    <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list"  mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/action.xml b/vistrails/db/versions/v0_9_1/specs/action.xml
new file mode 100644
index 0000000..e1048ab
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/action.xml
@@ -0,0 +1,113 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="action">
+  <layout>
+    <xml name="action" nodeType="xs:element"/>
+    <sql table="action"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="prevId" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="prev_id" type="int"/>
+  </property>
+
+  <property name="date" type="datetime">
+    <xml nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="session" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(1023)"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="prune" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <choice name="operation" type="list" mapping="one-to-many">
+    <property name="add" ref="true" object="add">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="delete" ref="true" object="delete">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="change" ref="true" object="change">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/add.xml b/vistrails/db/versions/v0_9_1/specs/add.xml
new file mode 100644
index 0000000..20c1cc6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/add.xml
@@ -0,0 +1,117 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="add">
+  <layout>
+    <xml name="add" nodeType="xs:element"/>
+    <sql table="add_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true"
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+  
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="group" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/annotation.xml b/vistrails/db/versions/v0_9_1/specs/annotation.xml
new file mode 100644
index 0000000..49323ec
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/annotation.xml
@@ -0,0 +1,104 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="annotation">
+  <layout>
+    <xml name="annotation" nodeType="xs:element"/>
+    <sql table="annotation"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="akey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+          mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="action">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property ref="true" object="group">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/change.xml b/vistrails/db/versions/v0_9_1/specs/change.xml
new file mode 100644
index 0000000..e24ac1d
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/change.xml
@@ -0,0 +1,122 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="change">
+  <layout>
+    <xml name="change" nodeType="xs:element"/>
+    <sql table="change_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="old_obj_id" type="int"/>
+  </property>
+
+  <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="new_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <choice name="data" type="object" discriminator="what">
+    <property ref="true" object="module" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="location" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="annotation" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="function" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="connection" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="port" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="parameter" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="portSpec" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="abstractionRef" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="group" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    <property ref="true" object="other" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+  
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/connection.xml b/vistrails/db/versions/v0_9_1/specs/connection.xml
new file mode 100644
index 0000000..2f6cefd
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/connection.xml
@@ -0,0 +1,77 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="connection">
+  <layout>
+    <xml name="connection" nodeType="xs:element"/>
+    <sql table="connection_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="port" type="list" mapping="one-to-many"
+	    index="type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+  
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/delete.xml b/vistrails/db/versions/v0_9_1/specs/delete.xml
new file mode 100644
index 0000000..86d8855
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/delete.xml
@@ -0,0 +1,81 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="delete">
+  <layout>
+    <xml name="delete" nodeType="xs:element"/>
+    <sql table="delete_tbl"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="what" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="objectId" type="long" foreignKey="true" discriminator="what">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="object_id" type="int"/>
+  </property>
+
+  <property name="parentObjId" type="long" foreignKey="true" 
+	    discriminator="parentObjType">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql column="par_obj_id" type="int"/>
+  </property>
+
+  <property name="parentObjType" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="par_obj_type" type="char(16)"/>
+  </property>
+
+  <property name="action" type="long" ref="true" object="action" 
+	    mapping="many-to-one" inverse="true">
+    <sql column="action_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/function.xml b/vistrails/db/versions/v0_9_1/specs/function.xml
new file mode 100644
index 0000000..02710b2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/function.xml
@@ -0,0 +1,92 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="function">
+  <layout>
+    <xml name="function" nodeType="xs:element"/>
+    <sql table="function"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="parameter" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="group">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/group.xml b/vistrails/db/versions/v0_9_1/specs/group.xml
new file mode 100644
index 0000000..f275b60
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/group.xml
@@ -0,0 +1,120 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="group" parentClass="module">
+  <layout>
+    <xml name="group" nodeType="xs:element"/>
+    <sql table="group_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	    expand="false">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="namespace" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="tag" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/location.xml b/vistrails/db/versions/v0_9_1/specs/location.xml
new file mode 100644
index 0000000..6fd8c11
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/location.xml
@@ -0,0 +1,89 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="location">
+  <layout>
+    <xml name="location" nodeType="xs:element"/>
+    <sql table="location"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="x" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="y" type="float">
+    <xml nodeType="xs:attribute" type="xs:float"/>
+    <sql type="DECIMAL(18,12)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="abstractionRef">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="group">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
+		  
diff --git a/vistrails/db/versions/v0_9_1/specs/log.xml b/vistrails/db/versions/v0_9_1/specs/log.xml
new file mode 100644
index 0000000..adb6466
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/log.xml
@@ -0,0 +1,80 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="log">
+  <layout>
+    <xml name="log" nodeType="xs:element"/>
+    <sql table="log_tbl"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="machine" cascade="false" type="list" 
+	    mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/machine.xml b/vistrails/db/versions/v0_9_1/specs/machine.xml
new file mode 100644
index 0000000..2cf9416
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/machine.xml
@@ -0,0 +1,90 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="machine">
+  <layout>
+    <xml name="machine" nodeType="xs:element"/>
+    <sql table="machine"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="os" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="architecture" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="processor" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ram" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="vistrailId" type="long" inverse="true"
+	    foreignKey="true" object="vistrail">
+    <sql column="vt_id" type="int"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/module.xml b/vistrails/db/versions/v0_9_1/specs/module.xml
new file mode 100644
index 0000000..0c70031
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/module.xml
@@ -0,0 +1,120 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module">
+  <layout>
+    <xml name="module" nodeType="xs:element"/>
+    <sql table="module"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="cache" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="namespace" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="package" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(511)"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="tag" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="location" type="object" mapping="one-to-one">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="function" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	    index="key">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	    index="name:type">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/module_exec.xml b/vistrails/db/versions/v0_9_1/specs/module_exec.xml
new file mode 100644
index 0000000..8b86b73
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/module_exec.xml
@@ -0,0 +1,109 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="module_exec">
+  <layout>
+    <xml name="moduleExec" nodeType="xs:element"/>
+    <sql table="module_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="cached" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql nodeType="int"/>
+  </property>
+
+  <property name="module_id" type="long" foreignKey="true" object="module">
+    <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="module_name" type="str">
+    <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="completed" type="int">
+    <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_id" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="abstraction_version" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="machine_id" type="long" foreignKey="true" object="machine">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="wf_exec_id" type="int"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/other.xml b/vistrails/db/versions/v0_9_1/specs/other.xml
new file mode 100644
index 0000000..a87b179
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/other.xml
@@ -0,0 +1,82 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="other">
+  <layout>
+    <xml name="other" nodeType="xs:element"/>
+    <sql table="other"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="key" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql column="okey" type="varchar(255)"/>
+  </property>
+
+  <property name="value" type="str">
+    <xml nodeType="xs:element" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="workflow">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/parameter.xml b/vistrails/db/versions/v0_9_1/specs/parameter.xml
new file mode 100644
index 0000000..0a3a4b4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/parameter.xml
@@ -0,0 +1,97 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="parameter">
+  <layout>
+    <xml name="parameter" nodeType="xs:element"/>
+    <sql table="parameter"/>
+  </layout>
+  
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="pos" type="long">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="val" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(8191)"/>
+  </property>
+
+  <property name="alias" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="function">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/port.xml b/vistrails/db/versions/v0_9_1/specs/port.xml
new file mode 100644
index 0000000..9073a77
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/port.xml
@@ -0,0 +1,98 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="port">
+  <layout>
+    <xml name="port" nodeType="xs:element"/>
+    <sql table="port"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="moduleId" type="long" foreignKey="true" object="module">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="moduleName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(4095)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="connection" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/portSpec.xml b/vistrails/db/versions/v0_9_1/specs/portSpec.xml
new file mode 100644
index 0000000..bc52103
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/portSpec.xml
@@ -0,0 +1,87 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="portSpec">
+  <layout>
+    <xml name="portSpec" nodeType="xs:element"/>
+    <sql table="port_spec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(22)"/>
+  </property>
+
+  <property name="type" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="spec" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" object="module">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="add">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" object="change">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/tag.xml b/vistrails/db/versions/v0_9_1/specs/tag.xml
new file mode 100644
index 0000000..a5c380d
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/tag.xml
@@ -0,0 +1,75 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="tag">
+  <layout>
+    <xml name="tag" nodeType="xs:element"/>
+    <sql table="tag"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	    object="action">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+
+  <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	  mapping="many-to-one">
+    <property ref="true" type="long" object="vistrail">
+      <sql column="parent_id" type="int"/>
+    </property>
+    <property ref="true" type="long" object="abstraction">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </choice>
+  
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/vistrail.xml b/vistrails/db/versions/v0_9_1/specs/vistrail.xml
new file mode 100644
index 0000000..a97310b
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/vistrail.xml
@@ -0,0 +1,89 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="vistrail">
+  <layout>
+    <xml name="vistrail" nodeType="xs:element"/>
+    <sql table="vistrail"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+  
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <property name="dbHost" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property name="dbPort" type="int">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+  </property>
+  
+  <property name="dbName" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+  </property>
+  
+  <property ref="true" object="action" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="tag" type="list" mapping="one-to-many"
+	    index="name">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+</object>
diff --git a/vistrails/db/versions/v0_9_1/specs/workflow.xml b/vistrails/db/versions/v0_9_1/specs/workflow.xml
new file mode 100644
index 0000000..1601ddb
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/workflow.xml
@@ -0,0 +1,113 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow">
+  <layout>
+    <xml name="workflow" nodeType="xs:element"/>
+    <sql table="workflow"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str">
+    <sql type="char(16)" global="true" globalName="entity_type"/>
+  </property>
+
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+  
+  <property name="version" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="char(16)"/>
+  </property>
+
+  <property name="last_modified" type="datetime">
+    <sql type="datetime"/>
+  </property>
+
+  <choice name="module" type="list" mapping="one-to-many">
+    <property name="module" ref="true" object="module">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="abstractionRef" ref="true" object="abstractionRef">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="group" ref="true" object="group">
+      <xml nodeType="xs:element"/>
+    </property>
+  </choice>
+    
+  <property ref="true" object="connection" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="annotation" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <!-- only need for copy/paste for no sql bindings -->
+  <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property ref="true" object="other" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent" ref="true" object="group" type="long" inverse="true">
+    <sql column="parent_id" type="int"/>
+  </property>
+  
+  <property name="parentType" type="str" inverse="true">
+    <sql column="parent_type" type="char(16)"/>
+  </property>
+</object>
+  
diff --git a/vistrails/db/versions/v0_9_1/specs/workflow_exec.xml b/vistrails/db/versions/v0_9_1/specs/workflow_exec.xml
new file mode 100644
index 0000000..d20253c
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/specs/workflow_exec.xml
@@ -0,0 +1,109 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<object name="workflow_exec">
+  <layout>
+    <xml name="workflowExec" nodeType="xs:element"/>
+    <sql table="workflow_exec"/>
+  </layout>
+
+  <property name="id" type="long" primaryKey="true">
+    <xml nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="user" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ip" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="vt_version" type="str">
+    <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="ts_start" type="datetime">
+    <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="ts_end" type="datetime">
+    <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+    <sql type="datetime"/>
+  </property>
+
+  <property name="parent_id" type="long">
+    <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+
+  <property name="parent_type" type="str">
+    <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property name="parent_version" type="long">
+    <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+    <sql type="int"/>
+  </property>
+  
+  <property name="name" type="str">
+    <xml nodeType="xs:attribute" type="xs:string"/>
+    <sql type="varchar(255)"/>
+  </property>
+
+  <property ref="true" object="log" type="long" mapping="many-to-one" 
+	    inverse="true">
+    <sql column="log_id" type="int"/>
+  </property>
+
+  <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+    <xml nodeType="xs:element"/>
+  </property>
+
+  <property name="entity_id" type="long" inverse="true">
+    <sql type="int"/>
+  </property>
+
+  <property name="entity_type" type="str" inverse="true">
+    <sql type="char(16)"/>
+  </property>
+
+</object>
diff --git a/vistrails/db/versions/v0_9_1/translate/__init__.py b/vistrails/db/versions/v0_9_1/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_9_1/translate/v0_9_0.py b/vistrails/db/versions/v0_9_1/translate/v0_9_0.py
new file mode 100644
index 0000000..668247e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_1/translate/v0_9_0.py
@@ -0,0 +1,142 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_9_1.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort, DBAbstractionRef, DBGroup
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+
+    for _action in _vistrail.db_actions:
+        ops = []
+        for op in _action.db_operations:
+            if op.vtType == 'add':
+                data = convert_data(op.db_data)
+                ops.append(DBAdd(id=op.db_id,
+                                 what=op.db_what,
+                                 objectId=op.db_objectId,
+                                 parentObjId=op.db_parentObjId,
+                                 parentObjType=op.db_parentObjType,
+                                 data=data))
+            elif op.vtType == 'change':
+                data = convert_data(op.db_data)
+                ops.append(DBChange(id=op.db_id,
+                                    what=op.db_what,
+                                    oldObjId=op.db_oldObjId,
+                                    newObjId=op.db_newObjId,
+                                    parentObjId=op.db_parentObjId,
+                                    parentObjType=op.db_parentObjType,
+                                    data=data))
+            elif op.vtType == 'delete':
+                ops.append(DBDelete(id=op.db_id,
+                                    what=op.db_what,
+                                    objectId=op.db_objectId,
+                                    parentObjId=op.db_parentObjId,
+                                    parentObjType=op.db_parentObjType))
+        annotations = []
+        for annotation in _action.db_annotations:
+            annotations.append(DBAnnotation(id=annotation.db_id,
+                                            key=annotation.db_key,
+                                            value=annotation.db_value))
+        action = DBAction(id=_action.db_id,
+                          prevId=_action.db_prevId,
+                          date=_action.db_date,
+                          user=_action.db_user,
+                          prune=_action.db_prune,
+                          operations=ops,
+                          annotations=annotations)
+        vistrail.db_add_action(action)
+
+    for _tag in _vistrail.db_tags:
+        tag = DBTag(id=_tag.db_id,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    vistrail.db_version = '0.9.1'
+    return vistrail
+
+def convert_data(child):
+    if child.vtType == 'module':
+        name_str = child.db_name
+        if name_str.rfind('|') != -1:
+            (namespace, name) = name_str.rsplit('|',1)
+        else:
+            name = name_str
+            namespace = None
+        return DBModule(id=child.db_id,
+                        cache=child.db_cache,
+                        name=name,
+                        namespace=namespace,
+                        package=child.db_package)
+    elif child.vtType == 'abstractionRef':
+        return DBAbstractionRef(id=child.db_id,
+                                name=child.db_name,
+                                cache=child.db_cache,
+                                abstraction_id=child.db_abstraction_id,
+                                version=child.db_version)
+    elif child.vtType == 'connection':
+        return DBConnection(id=child.db_id)
+    elif child.vtType == 'portSpec':
+        return DBPortSpec(id=child.db_id,
+                          name=child.db_name,
+                          type=child.db_type,
+                          spec=child.db_spec)
+    elif child.vtType == 'function':
+        return DBFunction(id=child.db_id,
+                          pos=child.db_pos,
+                          name=child.db_name)
+    elif child.vtType == 'parameter':
+        return DBParameter(id=child.db_id,
+                           pos=child.db_pos,
+                           name=child.db_name,
+                           type=child.db_type,
+                           val=child.db_val,
+                           alias=child.db_alias)
+    elif child.vtType == 'location':
+        return DBLocation(id=child.db_id,
+                          x=child.db_x,
+                          y=child.db_y)
+    elif child.vtType == 'annotation':
+        return DBAnnotation(id=child.db_id,
+                            key=child.db_key,
+                            value=child.db_value)
+    elif child.vtType == 'port':
+        return DBPort(id=child.db_id,
+                      type=child.db_type,
+                      moduleId=child.db_moduleId,
+                      moduleName=child.db_moduleName,
+                      name=child.db_name,
+                      spec=child.db_spec)
diff --git a/vistrails/db/versions/v0_9_2/__init__.py b/vistrails/db/versions/v0_9_2/__init__.py
new file mode 100644
index 0000000..75bdbf3
--- /dev/null
+++ b/vistrails/db/versions/v0_9_2/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.2'
diff --git a/vistrails/db/versions/v0_9_2/domain/__init__.py b/vistrails/db/versions/v0_9_2/domain/__init__.py
new file mode 100644
index 0000000..057dce6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_2/domain/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_9_1.domain import *
diff --git a/vistrails/db/versions/v0_9_2/persistence/__init__.py b/vistrails/db/versions/v0_9_2/persistence/__init__.py
new file mode 100644
index 0000000..533a33e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_2/persistence/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_9_1.persistence import DAOList
diff --git a/vistrails/db/versions/v0_9_2/translate/__init__.py b/vistrails/db/versions/v0_9_2/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_9_2/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_9_2/translate/v0_9_1.py b/vistrails/db/versions/v0_9_2/translate/v0_9_1.py
new file mode 100644
index 0000000..a5b0d4c
--- /dev/null
+++ b/vistrails/db/versions/v0_9_2/translate/v0_9_1.py
@@ -0,0 +1,48 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_9_1.domain import DBAdd, DBAnnotation, DBChange, DBDelete
+
+def translateVistrail(vistrail):
+    id_remap = {}
+    for action in vistrail.db_get_actions():
+        for annotation in action.db_get_annotations():
+            if annotation.db_key == 'notes':
+                del action.db_annotations_key_index['notes']
+                annotation.db_key = '__notes__'
+                action.db_annotations_key_index['__notes__'] = annotation
+
+    vistrail.db_version = '0.9.2'
+    return vistrail
diff --git a/vistrails/db/versions/v0_9_3/__init__.py b/vistrails/db/versions/v0_9_3/__init__.py
new file mode 100644
index 0000000..e628fc0
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.3'
diff --git a/vistrails/db/versions/v0_9_3/domain/__init__.py b/vistrails/db/versions/v0_9_3/domain/__init__.py
new file mode 100644
index 0000000..1fd287d
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from abstraction import DBAbstraction
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_9_3/domain/abstraction.py b/vistrails/db/versions/v0_9_3/domain/abstraction.py
new file mode 100644
index 0000000..6c3ecb5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/abstraction.py
@@ -0,0 +1,55 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+from auto_gen import DBAbstraction as _DBAbstraction
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+class DBAbstraction(_DBAbstraction):
+    def __init__(self, *args, **kwargs):
+        _DBAbstraction.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAbstractionRef.vtType: DBModule.vtType})
+        self.idScope.setBeginId('action', 1)
+
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBAbstraction.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBAbstraction
+        # need to go through and reset the index to the copied objects
+        cp.idScope = copy.copy(self.idScope)
+        return cp
diff --git a/vistrails/db/versions/v0_9_3/domain/auto_gen.py b/vistrails/db/versions/v0_9_3/domain/auto_gen.py
new file mode 100644
index 0000000..87512da
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/auto_gen.py
@@ -0,0 +1,6369 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        spec=self._db_spec)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'spec' in class_dict:
+            res = class_dict['spec'](old_obj, trans_dict)
+            new_obj.db_spec = res
+        elif hasattr(old_obj, 'db_spec') and old_obj.db_spec is not None:
+            new_obj.db_spec = old_obj.db_spec
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_spec(self):
+        return self._db_spec
+    def __set_db_spec(self, spec):
+        self._db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self._db_spec = spec
+    def db_change_spec(self, spec):
+        self._db_spec = spec
+    def db_delete_spec(self, spec):
+        self._db_spec = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version,
+                      tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, spec=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    spec=self._db_spec)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'spec' in class_dict:
+            res = class_dict['spec'](old_obj, trans_dict)
+            new_obj.db_spec = res
+        elif hasattr(old_obj, 'db_spec') and old_obj.db_spec is not None:
+            new_obj.db_spec = old_obj.db_spec
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_spec(self):
+        return self._db_spec
+    def __set_db_spec(self, spec):
+        self._db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self._db_spec = spec
+    def db_change_spec(self, spec):
+        self._db_spec = spec
+    def db_delete_spec(self, spec):
+        self._db_spec = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version,
+                     tag=self._db_tag)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstractionRef':
+                new_obj.db_add_data(DBAbstractionRef.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstractionRef':
+                    n_obj = DBAbstractionRef.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, entity_type=None, name=None, last_modified=None, actions=None, tags=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           entity_type=self._db_entity_type,
+                           name=self._db_name,
+                           last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, abstractions=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self._db_abstractions = []
+        else:
+            self._db_abstractions = abstractions
+            for v in self._db_abstractions:
+                self.db_abstractions_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_abstractions is None:
+            cp._db_abstractions = []
+        else:
+            cp._db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_abstractions]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_abstractions_id_index = dict((v.db_id, v) for v in cp._db_abstractions)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstractionRef':
+                    new_obj.db_add_module(DBAbstractionRef.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstractionRef':
+                    n_obj = DBAbstractionRef.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'abstractions' in class_dict:
+            res = class_dict['abstractions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_abstraction(obj)
+        elif hasattr(old_obj, 'db_abstractions') and old_obj.db_abstractions is not None:
+            for obj in old_obj.db_abstractions:
+                new_obj.db_add_abstraction(DBAbstraction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_abstractions') and hasattr(new_obj, 'db_deleted_abstractions'):
+            for obj in old_obj.db_deleted_abstractions:
+                n_obj = DBAbstraction.update_version(obj, trans_dict)
+                new_obj.db_deleted_abstractions.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_abstractions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_abstractions)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_abstractions = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_abstractions:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_abstractions(self):
+        return self._db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self._db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self._db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i].db_id == abstraction.db_id:
+                self._db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i].db_id == abstraction.db_id:
+                if not self._db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self._db_abstractions[i])
+                del self._db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i].db_id == key:
+                return self._db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return key in self.db_abstractions_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstractionRef(object):
+
+    vtType = 'abstractionRef'
+
+    def __init__(self, id=None, name=None, cache=None, abstraction_id=None, version=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_cache = cache
+        self._db_abstraction_id = abstraction_id
+        self._db_version = version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstractionRef.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstractionRef(id=self._db_id,
+                              name=self._db_name,
+                              cache=self._db_cache,
+                              abstraction_id=self._db_abstraction_id,
+                              version=self._db_version)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_abstraction_id') and ('abstraction', self._db_abstraction_id) in id_remap:
+                cp._db_abstraction_id = id_remap[('abstraction', self._db_abstraction_id)]
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstractionRef()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'abstraction_id' in class_dict:
+            res = class_dict['abstraction_id'](old_obj, trans_dict)
+            new_obj.db_abstraction_id = res
+        elif hasattr(old_obj, 'db_abstraction_id') and old_obj.db_abstraction_id is not None:
+            new_obj.db_abstraction_id = old_obj.db_abstraction_id
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_abstraction_id(self):
+        return self._db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstractionRef':
+                new_obj.db_add_data(DBAbstractionRef.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstractionRef':
+                    n_obj = DBAbstractionRef.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None, module_execs=None):
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self._db_module_execs = []
+        else:
+            self._db_module_execs = module_execs
+            for v in self._db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_module_execs is None:
+            cp._db_module_execs = []
+        else:
+            cp._db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_execs_id_index = dict((v.db_id, v) for v in cp._db_module_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'module_execs' in class_dict:
+            res = class_dict['module_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_exec(obj)
+        elif hasattr(old_obj, 'db_module_execs') and old_obj.db_module_execs is not None:
+            for obj in old_obj.db_module_execs:
+                new_obj.db_add_module_exec(DBModuleExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_execs') and hasattr(new_obj, 'db_deleted_module_execs'):
+            for obj in old_obj.db_deleted_module_execs:
+                n_obj = DBModuleExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_module_execs(self):
+        return self._db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self._db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self._db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                self._db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                if not self._db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self._db_module_execs[i])
+                del self._db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == key:
+                return self._db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return key in self.db_module_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self._db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user,
+                      prune=self._db_prune)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'prune' in class_dict:
+            res = class_dict['prune'](old_obj, trans_dict)
+            new_obj.db_prune = res
+        elif hasattr(old_obj, 'db_prune') and old_obj.db_prune is not None:
+            new_obj.db_prune = old_obj.db_prune
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_prune(self):
+        return self._db_prune
+    def __set_db_prune(self, prune):
+        self._db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self._db_prune = prune
+    def db_change_prune(self, prune):
+        self._db_prune = prune
+    def db_delete_prune(self, prune):
+        self._db_prune = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None, abstractions=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_abstractions = []
+        self.db_abstractions_id_index = {}
+        if abstractions is None:
+            self._db_abstractions = []
+        else:
+            self._db_abstractions = abstractions
+            for v in self._db_abstractions:
+                self.db_abstractions_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_abstractions is None:
+            cp._db_abstractions = []
+        else:
+            cp._db_abstractions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_abstractions]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_abstractions_id_index = dict((v.db_id, v) for v in cp._db_abstractions)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'abstractions' in class_dict:
+            res = class_dict['abstractions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_abstraction(obj)
+        elif hasattr(old_obj, 'db_abstractions') and old_obj.db_abstractions is not None:
+            for obj in old_obj.db_abstractions:
+                new_obj.db_add_abstraction(DBAbstraction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_abstractions') and hasattr(new_obj, 'db_deleted_abstractions'):
+            for obj in old_obj.db_deleted_abstractions:
+                n_obj = DBAbstraction.update_version(obj, trans_dict)
+                new_obj.db_deleted_abstractions.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_abstractions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_abstraction(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_abstractions)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+            self.db_deleted_abstractions = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_abstractions:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_abstractions(self):
+        return self._db_abstractions
+    def __set_db_abstractions(self, abstractions):
+        self._db_abstractions = abstractions
+        self.is_dirty = True
+    db_abstractions = property(__get_db_abstractions, __set_db_abstractions)
+    def db_get_abstractions(self):
+        return self._db_abstractions
+    def db_add_abstraction(self, abstraction):
+        self.is_dirty = True
+        self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_change_abstraction(self, abstraction):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i].db_id == abstraction.db_id:
+                self._db_abstractions[i] = abstraction
+                found = True
+                break
+        if not found:
+            self._db_abstractions.append(abstraction)
+        self.db_abstractions_id_index[abstraction.db_id] = abstraction
+    def db_delete_abstraction(self, abstraction):
+        self.is_dirty = True
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i].db_id == abstraction.db_id:
+                if not self._db_abstractions[i].is_new:
+                    self.db_deleted_abstractions.append(self._db_abstractions[i])
+                del self._db_abstractions[i]
+                break
+        del self.db_abstractions_id_index[abstraction.db_id]
+    def db_get_abstraction(self, key):
+        for i in xrange(len(self._db_abstractions)):
+            if self._db_abstractions[i].db_id == key:
+                return self._db_abstractions[i]
+        return None
+    def db_get_abstraction_by_id(self, key):
+        return self.db_abstractions_id_index[key]
+    def db_has_abstraction_with_id(self, key):
+        return key in self.db_abstractions_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, abstraction_id=None, abstraction_version=None, machine_id=None, annotations=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_abstraction_id = abstraction_id
+        self._db_abstraction_version = abstraction_version
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          abstraction_id=self._db_abstraction_id,
+                          abstraction_version=self._db_abstraction_version,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'abstraction_id' in class_dict:
+            res = class_dict['abstraction_id'](old_obj, trans_dict)
+            new_obj.db_abstraction_id = res
+        elif hasattr(old_obj, 'db_abstraction_id') and old_obj.db_abstraction_id is not None:
+            new_obj.db_abstraction_id = old_obj.db_abstraction_id
+        if 'abstraction_version' in class_dict:
+            res = class_dict['abstraction_version'](old_obj, trans_dict)
+            new_obj.db_abstraction_version = res
+        elif hasattr(old_obj, 'db_abstraction_version') and old_obj.db_abstraction_version is not None:
+            new_obj.db_abstraction_version = old_obj.db_abstraction_version
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_abstraction_id(self):
+        return self._db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = None
+    
+    def __get_db_abstraction_version(self):
+        return self._db_abstraction_version
+    def __set_db_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+        self.is_dirty = True
+    db_abstraction_version = property(__get_db_abstraction_version, __set_db_abstraction_version)
+    def db_add_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_change_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_delete_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v0_9_3/domain/id_scope.py b/vistrails/db/versions/v0_9_3/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_9_3/domain/log.py b/vistrails/db/versions/v0_9_3/domain/log.py
new file mode 100644
index 0000000..effb9f1
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/log.py
@@ -0,0 +1,68 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstractionRef, DBModule
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                              {DBAbstractionRef.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v0_9_3/domain/vistrail.py b/vistrails/db/versions/v0_9_3/domain/vistrail.py
new file mode 100644
index 0000000..22eb0ab
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/vistrail.py
@@ -0,0 +1,127 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstractionRef, DBGroup, \
+    DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstractionRef.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.log_filename = self.log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'log_filename'):
+            new_obj.log_filename = old_obj.log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
diff --git a/vistrails/db/versions/v0_9_3/domain/workflow.py b/vistrails/db/versions/v0_9_3/domain/workflow.py
new file mode 100644
index 0000000..cfe0dca
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/domain/workflow.py
@@ -0,0 +1,170 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstractionRef, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstractionRef.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {'abstractionRef': 'module', 'group': 'module'}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef' or \
+                        parent_obj_type == 'group':
+                    parent_obj_type = 'module'
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == 'abstractionRef' or object.vtType == 'group':
+            obj_type = 'module'
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef' or \
+                        parent_obj_type == 'group':
+                    parent_obj_type = 'module'
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == 'abstractionRef' or \
+                        parent_obj_type == 'group':
+                    parent_obj_type = 'module'
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == 'abstractionRef' or obj_type == 'group':
+            obj_type = 'module'
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v0_9_3/persistence/__init__.py b/vistrails/db/versions/v0_9_3/persistence/__init__.py
new file mode 100644
index 0000000..ce764d5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/__init__.py
@@ -0,0 +1,204 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_9_3 import version as my_version
+from vistrails.db.versions.v0_9_3.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBAbstraction, DBGroup
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id, lock=False):
+        all_objects = {}
+        global_props = {'id': id}
+        # print global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        del global_props['id']
+
+        for dao in self['sql'].itervalues():
+            if (dao == self['sql'][DBVistrail.vtType] or
+                # dao == self['sql'][DBWorkflow.vtType] or
+                dao == self['sql'][DBLog.vtType] or
+                dao == self['sql'][DBAbstraction.vtType]):
+                continue
+            current_objs = dao.get_sql_columns(db_connection, global_props, 
+                                               lock)
+            if dao == self['sql'][DBWorkflow.vtType]:
+                for key, obj in current_objs.iteritems():
+                    if key[0] == vtType and key[1] == id:
+                        continue
+                    elif key[0] == DBWorkflow.vtType:
+                        res_obj = self.open_from_db(db_connection, key[0], 
+                                                    key[1], lock)
+                        res_dict = {}
+                        res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                        all_objects.update(res_dict)
+            else:
+                all_objects.update(current_objs)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+        return res
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children() # forSQL=True)
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        (child, _, _) = children[0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                      global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                                c,
+                                                                global_props)
+
+        (child, _, _) = children.pop(0)
+        child.is_dirty = False
+        child.is_new = False
+        for (child, _, _) in children:
+            # print "child:", child.vtType, child.db_id
+            self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                          global_props, do_copy)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    self.save_to_db(db_connection, child.db_workflow,
+                                    do_copy,
+                                    {'entity_id': global_props['entity_id'],
+                                     'entity_type': \
+                                         global_props['entity_type']}
+                                    )
+                                            
+            child.is_dirty = False
+            child.is_new = False
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v0_9_3/persistence/sql/__init__.py b/vistrails/db/versions/v0_9_3/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_3/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_9_3/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..e6ffdd4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/sql/auto_gen.py
@@ -0,0 +1,2811 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_9_3.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[5], 'long', 'int')
+            entity_type = self.convertFromDB(row[6], 'str', 'char(16)')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_parentType = parentType
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.db_parent = parent
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_tag(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            tag=tag,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_parent = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'name', 'last_modified']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[3], 'datetime', 'datetime')
+            
+            abstraction = DBAbstraction(entity_type=entity_type,
+                                        name=name,
+                                        last_modified=last_modified,
+                                        id=id)
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'name', 'last_modified']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id', 'parent_type']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'int')
+            parentType = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_parent = parent
+            workflow.db_parentType = parentType
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_parent) in all_objects:
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id', 'parent_type']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionRefSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction_ref'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(1023)')
+            cache = self.convertFromDB(row[2], 'int', 'int')
+            abstraction_id = self.convertFromDB(row[3], 'long', 'int')
+            version = self.convertFromDB(row[4], 'long', 'int')
+            parentType = self.convertFromDB(row[5], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            abstractionRef = DBAbstractionRef(name=name,
+                                              cache=cache,
+                                              abstraction_id=abstraction_id,
+                                              version=version,
+                                              id=id)
+            abstractionRef.db_parentType = parentType
+            abstractionRef.db_entity_id = entity_id
+            abstractionRef.db_entity_type = entity_type
+            abstractionRef.db_parent = parent
+            abstractionRef.is_dirty = False
+            res[('abstractionRef', id)] = abstractionRef
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'cache', 'abstraction_id', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction_ref'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstractionRef':
+            p = all_objects[('abstractionRef', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_execs:
+            child.db_workflow_exec = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_parentType = parentType
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.db_parent = parent
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_action(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_tags:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            abstraction_id = self.convertFromDB(row[8], 'long', 'int')
+            abstraction_version = self.convertFromDB(row[9], 'long', 'int')
+            machine_id = self.convertFromDB(row[10], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[11], 'long', 'int')
+            entity_id = self.convertFromDB(row[12], 'long', 'int')
+            entity_type = self.convertFromDB(row[13], 'str', 'char(16)')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       abstraction_id=abstraction_id,
+                                       abstraction_version=abstraction_version,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('workflow_exec', obj.db_workflow_exec) in all_objects:
+            p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+            p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_version') and obj.db_abstraction_version is not None:
+            columnMap['abstraction_version'] = \
+                self.convertToDB(obj.db_abstraction_version, 'long', 'int')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_3/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_9_3/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..ad01dc5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/sql/sql_dao.py
@@ -0,0 +1,183 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                # return "'" + str(value).replace("'", "''") + "'"
+                return str(value)
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v0_9_3/persistence/xml/__init__.py b/vistrails/db/versions/v0_9_3/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_3/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_9_3/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..e491b17
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/xml/auto_gen.py
@@ -0,0 +1,1774 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_9_3.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('spec',self.convertToStr(port.db_spec, 'str'))
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      tag=tag,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        node.set('tag',self.convertToStr(group.db_tag, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child.tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflow_exec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'value':
+                _data = self.convertFromStr(child.text,'')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            name=name,
+                            actions=actions,
+                            tags=tags)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        
+        # set elements
+        actions = abstraction.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = abstraction.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        abstractions = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         abstractions=abstractions,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        abstractions = workflow.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            childNode = ElementTree.SubElement(node, 'plugin_data')
+            self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBAbstractionRefXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstractionRef':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('abstractionId', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'long')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstractionRef(id=id,
+                               name=name,
+                               cache=cache,
+                               abstraction_id=abstraction_id,
+                               version=version,
+                               location=location,
+                               functions=functions,
+                               annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstractionRef, node=None):
+        if node is None:
+            node = ElementTree.Element('abstractionRef')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstractionRef.db_id, 'long'))
+        node.set('name',self.convertToStr(abstractionRef.db_name, 'str'))
+        node.set('cache',self.convertToStr(abstractionRef.db_cache, 'int'))
+        node.set('abstractionId',self.convertToStr(abstractionRef.db_abstraction_id, 'long'))
+        node.set('version',self.convertToStr(abstractionRef.db_version, 'long'))
+        
+        # set elements
+        location = abstractionRef.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstractionRef.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstractionRef.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstractionRef':
+                _data = self.getDao('abstractionRef').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstractionRef':
+                childNode = ElementTree.SubElement(node, 'abstractionRef')
+                self.getDao('abstractionRef').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        module_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module_exec':
+                child.tag = 'moduleExec'
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'module_exec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        abstractions = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                abstractions.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations,
+                         abstractions=abstractions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        abstractions = vistrail.db_abstractions
+        for abstraction in abstractions:
+            childNode = ElementTree.SubElement(node, 'abstraction')
+            self.getDao('abstraction').toXML(abstraction, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('abstraction_id', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('abstraction_version', None)
+        abstraction_version = self.convertFromStr(data, 'long')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           abstraction_id=abstraction_id,
+                           abstraction_version=abstraction_version,
+                           machine_id=machine_id,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('abstraction_id',self.convertToStr(module_exec.db_abstraction_id, 'long'))
+        node.set('abstraction_version',self.convertToStr(module_exec.db_abstraction_version, 'long'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'abstractionRef' not in self:
+            self['abstractionRef'] = DBAbstractionRefXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_3/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_9_3/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_9_3/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_9_3/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..633e54e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/schemas/sql/vistrails.sql
@@ -0,0 +1,311 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int,
+    parent_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE abstraction_ref(
+    id int,
+    name varchar(1023),
+    cache int,
+    abstraction_id int,
+    version int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    prune int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    abstraction_id int,
+    abstraction_version int,
+    machine_id int,
+    wf_exec_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_9_3/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_9_3/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..fa131e2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, plugin_data, function, abstraction, workflow, abstraction_ref, annotation, change_tbl, workflow_exec, connection_tbl, action, delete_tbl, vistrail, module_exec;
diff --git a/vistrails/db/versions/v0_9_3/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_9_3/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..911ca0a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/schemas/xml/vistrail.xsd
@@ -0,0 +1,285 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstractionRef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="abstractionId" type="xs:int"/>
+      <xs:attribute name="version" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstractionRef" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_9_3/specs/all.xml b/vistrails/db/versions/v0_9_3/specs/all.xml
new file mode 100644
index 0000000..9adece8
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/specs/all.xml
@@ -0,0 +1,1652 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTIONREF ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstractionRef">
+    <layout>
+      <xml name="abstractionRef" nodeType="xs:element"/>
+      <sql table="abstraction_ref"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml name="cache" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="abstraction_id" type="long" foreignKey="true" 
+	      object="abstraction">
+      <xml name="abstractionId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list"  mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="prune" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" type="long" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" type="long" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstractionRef" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstractionRef">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstractionRef" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstractionRef">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstractionRef">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="abstraction_id" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="abstraction_version" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="spec" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(22)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="spec" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" discriminator="parentType" type="long" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" type="long" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" type="long" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstractionRef" ref="true" object="abstractionRef">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <!-- only need for copy/paste so no sql bindings -->
+    <property ref="true" object="abstraction" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent" ref="true" object="group" type="long" inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+</objects>
diff --git a/vistrails/db/versions/v0_9_3/translate/__init__.py b/vistrails/db/versions/v0_9_3/translate/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/db/versions/v0_9_3/translate/v0_9_1.py b/vistrails/db/versions/v0_9_3/translate/v0_9_1.py
new file mode 100644
index 0000000..437b595
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/translate/v0_9_1.py
@@ -0,0 +1,86 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_9_3.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort, DBAbstractionRef, DBGroup, \
+    DBWorkflow, DBLog
+
+def translateVistrail(_vistrail):
+    def update_key(old_obj, translate_dict):
+        return '__notes__'
+
+    def update_annotation(old_obj, translate_dict):
+        new_dict = {'DBAnnotation': {'key': update_key}}
+        new_list = []
+        for annotation in old_obj.db_annotations:
+            if annotation.db_key == 'notes':
+                new_list.append(DBAnnotation.update_version(annotation, 
+                                                            new_dict))
+            else:
+                new_list.append(DBAnnotation.update_version(annotation,
+                                                            {}))
+        return new_list
+                
+    def update_session(old_obj, translate_dict):
+        if not old_obj.db_session:
+            session = None
+        else:
+            session = long(old_obj.db_session)
+        return session
+
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    translate_dict = {'DBAction': {'annotations': update_annotation,
+                                   'session': update_session},
+                      'DBGroup': {'workflow': update_workflow}}
+    # pass DBVistrail because domain contains enriched version of the auto_gen
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '0.9.3'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    workflow = update_workflow(_workflow, translate_dict)
+    workflow.db_version = '0.9.3'
+    return workflow
+
+def translateLog(_log):
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '0.9.3'
+    return log
diff --git a/vistrails/db/versions/v0_9_3/translate/v0_9_2.py b/vistrails/db/versions/v0_9_3/translate/v0_9_2.py
new file mode 100644
index 0000000..848c2ab
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/translate/v0_9_2.py
@@ -0,0 +1,155 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_9_3.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort, DBAbstractionRef, DBGroup
+
+def translateVistrail(_vistrail):
+    vistrail = DBVistrail()
+
+    for _action in _vistrail.db_actions:
+        ops = []
+        for op in _action.db_operations:
+            if op.vtType == 'add':
+                data = convert_data(op.db_data)
+                ops.append(DBAdd(id=op.db_id,
+                                 what=op.db_what,
+                                 objectId=op.db_objectId,
+                                 parentObjId=op.db_parentObjId,
+                                 parentObjType=op.db_parentObjType,
+                                 data=data))
+            elif op.vtType == 'change':
+                data = convert_data(op.db_data)
+                ops.append(DBChange(id=op.db_id,
+                                    what=op.db_what,
+                                    oldObjId=op.db_oldObjId,
+                                    newObjId=op.db_newObjId,
+                                    parentObjId=op.db_parentObjId,
+                                    parentObjType=op.db_parentObjType,
+                                    data=data))
+            elif op.vtType == 'delete':
+                ops.append(DBDelete(id=op.db_id,
+                                    what=op.db_what,
+                                    objectId=op.db_objectId,
+                                    parentObjId=op.db_parentObjId,
+                                    parentObjType=op.db_parentObjType))
+        annotations = []
+        for annotation in _action.db_annotations:
+            annotations.append(DBAnnotation(id=annotation.db_id,
+                                            key=annotation.db_key,
+                                            value=annotation.db_value))
+        session = _action.db_session
+        if not session:
+            session = None
+        else:
+            session = long(_action.db_session)
+
+        action = DBAction(id=_action.db_id,
+                          prevId=_action.db_prevId,
+                          date=_action.db_date,
+                          user=_action.db_user,
+                          prune=_action.db_prune,
+                          session=session,
+                          operations=ops,
+                          annotations=annotations)
+        vistrail.db_add_action(action)
+
+    for _tag in _vistrail.db_tags:
+        tag = DBTag(id=_tag.db_id,
+                    name=_tag.db_name)
+        vistrail.db_add_tag(tag)
+
+    vistrail.db_version = '0.9.3'
+    return vistrail
+
+def convert_data(child):
+    if child.vtType == 'module':
+        return DBModule(id=child.db_id,
+                        cache=child.db_cache,
+                        name=child.db_name,
+                        namespace=child.db_namespace,
+                        package=child.db_package,
+                        version=child.db_version,
+                        tag=child.db_tag)
+    elif child.vtType == 'abstractionRef':
+        return DBAbstractionRef(id=child.db_id,
+                                name=child.db_name,
+                                cache=child.db_cache,
+                                abstraction_id=child.db_abstraction_id,
+                                version=child.db_version)
+    elif child.vtType == 'connection':
+        return DBConnection(id=child.db_id)
+    elif child.vtType == 'portSpec':
+        return DBPortSpec(id=child.db_id,
+                          name=child.db_name,
+                          type=child.db_type,
+                          spec=child.db_spec)
+    elif child.vtType == 'function':
+        return DBFunction(id=child.db_id,
+                          pos=child.db_pos,
+                          name=child.db_name)
+    elif child.vtType == 'parameter':
+        return DBParameter(id=child.db_id,
+                           pos=child.db_pos,
+                           name=child.db_name,
+                           type=child.db_type,
+                           val=child.db_val,
+                           alias=child.db_alias)
+    elif child.vtType == 'location':
+        return DBLocation(id=child.db_id,
+                          x=child.db_x,
+                          y=child.db_y)
+    elif child.vtType == 'annotation':
+        return DBAnnotation(id=child.db_id,
+                            key=child.db_key,
+                            value=child.db_value)
+    elif child.vtType == 'port':
+        return DBPort(id=child.db_id,
+                      type=child.db_type,
+                      moduleId=child.db_moduleId,
+                      moduleName=child.db_moduleName,
+                      name=child.db_name,
+                      spec=child.db_spec)
+    elif child.vtType == 'group':
+        return DBGroup(id=child.db_id,
+                       workflow=child.db_workflow,
+                       cache=child.db_cache,
+                       name=child.db_name,
+                       namespace=child.db_namespace,
+                       package=child.db_package,
+                       version=child.db_version,
+                       tag=child.db_tag)
+                       
diff --git a/vistrails/db/versions/v0_9_3/translate/v0_9_4.py b/vistrails/db/versions/v0_9_3/translate/v0_9_4.py
new file mode 100644
index 0000000..7a32422
--- /dev/null
+++ b/vistrails/db/versions/v0_9_3/translate/v0_9_4.py
@@ -0,0 +1,113 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v0_9_3.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBAbstractionRef, DBAdd, DBChange, DBDelete, DBAbstractionRef, DBGroup, \
+    DBModule
+
+def update_workflow(old_obj, translate_dict):
+    return DBWorkflow.update_version(old_obj.db_workflow, 
+                                     translate_dict, DBWorkflow())
+
+def update_modules(old_obj, trans_dict):
+    new_modules = []
+    for obj in old_obj.db_modules:
+        if obj.vtType == 'module':
+            new_modules.append(DBModule.update_version(obj, trans_dict))
+        elif obj.vtType == 'abstraction':
+            new_modules.append(DBAbstractionRef.update_version(obj,
+                                                               trans_dict))
+        elif obj.vtType == 'group':
+            new_modules.append(DBGroup.update_version(obj, trans_dict))
+    return new_modules
+
+def translateVistrail(_vistrail):
+    def update_operations(old_obj, trans_dict):
+        def update_abstraction(old_obj, trans_dict):
+            def get_version(old_obj, trans_dict):
+                return long(old_obj.db_internal_version)
+            new_dict = {'DBAbstractionRef': {'version': get_version}}
+            new_dict.update(trans_dict)
+            return DBAbstractionRef.update_version(old_obj.db_data, new_dict)
+        new_ops = []
+        for obj in old_obj.db_operations:
+            if obj.vtType == 'add':
+                if obj.db_what == 'abstraction':
+                    trans_dict['DBAdd'] = {'data': update_abstraction}
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    new_op.db_what = 'abstractionRef'
+                    new_ops.append(new_op)
+                    del trans_dict['DBAdd']
+                else:
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    if obj.db_parentObjType == 'abstraction':
+                        new_op.db_parentObjType = 'abstractionRef'
+                    new_ops.append(new_op)
+            elif obj.vtType == 'delete':
+                new_ops.append(DBDelete.update_version(obj, trans_dict))
+            elif obj.vtType == 'change':
+                if obj.db_what == 'abstraction':
+                    trans_dict['DBChange'] = {'data': update_abstraction}
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    new_op.db_what = 'abstractionRef'
+                    new_ops.append(new_op)
+                    del trans_dict['DBChange']
+                else:
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    if obj.db_parentObjType == 'abstraction':
+                        new_op.db_parentObjType = 'abstractionRef'
+                    new_ops.append(new_op)
+        return new_ops
+
+    translate_dict = {'DBGroup': {'workflow': update_workflow},
+                      'DBAction': {'operations': update_operations},
+                      'DBWorkflow': {'modules': update_modules}}
+    # pass DBVistrail because domain contains enriched version of the auto_gen
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '0.9.3'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    translate_dict = {'DBGroup': {'workflow': update_workflow},
+                      'DBWorkflow': {'modules': update_modules}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '0.9.3'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '0.9.3'
+    return log
+
diff --git a/vistrails/db/versions/v0_9_4/__init__.py b/vistrails/db/versions/v0_9_4/__init__.py
new file mode 100644
index 0000000..5cf1ec6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.4'
diff --git a/vistrails/db/versions/v0_9_4/domain/__init__.py b/vistrails/db/versions/v0_9_4/domain/__init__.py
new file mode 100644
index 0000000..370b564
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/domain/__init__.py
@@ -0,0 +1,40 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_9_4/domain/auto_gen.py b/vistrails/db/versions/v0_9_4/domain/auto_gen.py
new file mode 100644
index 0000000..7a9a33c
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/domain/auto_gen.py
@@ -0,0 +1,5971 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, spec=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        spec=self._db_spec)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'spec' in class_dict:
+            res = class_dict['spec'](old_obj, trans_dict)
+            new_obj.db_spec = res
+        elif hasattr(old_obj, 'db_spec') and old_obj.db_spec is not None:
+            new_obj.db_spec = old_obj.db_spec
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_spec(self):
+        return self._db_spec
+    def __set_db_spec(self, spec):
+        self._db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self._db_spec = spec
+    def db_change_spec(self, spec):
+        self._db_spec = spec
+    def db_delete_spec(self, spec):
+        self._db_spec = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version,
+                      tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, spec=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_spec = spec
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    spec=self._db_spec)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'spec' in class_dict:
+            res = class_dict['spec'](old_obj, trans_dict)
+            new_obj.db_spec = res
+        elif hasattr(old_obj, 'db_spec') and old_obj.db_spec is not None:
+            new_obj.db_spec = old_obj.db_spec
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_spec(self):
+        return self._db_spec
+    def __set_db_spec(self, spec):
+        self._db_spec = spec
+        self.is_dirty = True
+    db_spec = property(__get_db_spec, __set_db_spec)
+    def db_add_spec(self, spec):
+        self._db_spec = spec
+    def db_change_spec(self, spec):
+        self._db_spec = spec
+    def db_delete_spec(self, spec):
+        self._db_spec = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version,
+                     tag=self._db_tag)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, internal_version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_internal_version = internal_version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           cache=self._db_cache,
+                           name=self._db_name,
+                           namespace=self._db_namespace,
+                           package=self._db_package,
+                           version=self._db_version,
+                           internal_version=self._db_internal_version,
+                           tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'internal_version' in class_dict:
+            res = class_dict['internal_version'](old_obj, trans_dict)
+            new_obj.db_internal_version = res
+        elif hasattr(old_obj, 'db_internal_version') and old_obj.db_internal_version is not None:
+            new_obj.db_internal_version = old_obj.db_internal_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_internal_version(self):
+        return self._db_internal_version
+    def __set_db_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+        self.is_dirty = True
+    db_internal_version = property(__get_db_internal_version, __set_db_internal_version)
+    def db_add_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_change_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_delete_internal_version(self, internal_version):
+        self._db_internal_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstraction':
+                    new_obj.db_add_module(DBAbstraction.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None, module_execs=None):
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self._db_module_execs = []
+        else:
+            self._db_module_execs = module_execs
+            for v in self._db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_module_execs is None:
+            cp._db_module_execs = []
+        else:
+            cp._db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_execs_id_index = dict((v.db_id, v) for v in cp._db_module_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'module_execs' in class_dict:
+            res = class_dict['module_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_exec(obj)
+        elif hasattr(old_obj, 'db_module_execs') and old_obj.db_module_execs is not None:
+            for obj in old_obj.db_module_execs:
+                new_obj.db_add_module_exec(DBModuleExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_execs') and hasattr(new_obj, 'db_deleted_module_execs'):
+            for obj in old_obj.db_deleted_module_execs:
+                n_obj = DBModuleExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_module_execs(self):
+        return self._db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self._db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self._db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                self._db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                if not self._db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self._db_module_execs[i])
+                del self._db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == key:
+                return self._db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return key in self.db_module_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self._db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user,
+                      prune=self._db_prune)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'prune' in class_dict:
+            res = class_dict['prune'](old_obj, trans_dict)
+            new_obj.db_prune = res
+        elif hasattr(old_obj, 'db_prune') and old_obj.db_prune is not None:
+            new_obj.db_prune = old_obj.db_prune
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_prune(self):
+        return self._db_prune
+    def __set_db_prune(self, prune):
+        self._db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self._db_prune = prune
+    def db_change_prune(self, prune):
+        self._db_prune = prune
+    def db_delete_prune(self, prune):
+        self._db_prune = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, abstraction_id=None, abstraction_version=None, machine_id=None, annotations=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_abstraction_id = abstraction_id
+        self._db_abstraction_version = abstraction_version
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          abstraction_id=self._db_abstraction_id,
+                          abstraction_version=self._db_abstraction_version,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'abstraction_id' in class_dict:
+            res = class_dict['abstraction_id'](old_obj, trans_dict)
+            new_obj.db_abstraction_id = res
+        elif hasattr(old_obj, 'db_abstraction_id') and old_obj.db_abstraction_id is not None:
+            new_obj.db_abstraction_id = old_obj.db_abstraction_id
+        if 'abstraction_version' in class_dict:
+            res = class_dict['abstraction_version'](old_obj, trans_dict)
+            new_obj.db_abstraction_version = res
+        elif hasattr(old_obj, 'db_abstraction_version') and old_obj.db_abstraction_version is not None:
+            new_obj.db_abstraction_version = old_obj.db_abstraction_version
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_abstraction_id(self):
+        return self._db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = None
+    
+    def __get_db_abstraction_version(self):
+        return self._db_abstraction_version
+    def __set_db_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+        self.is_dirty = True
+    db_abstraction_version = property(__get_db_abstraction_version, __set_db_abstraction_version)
+    def db_add_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_change_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_delete_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v0_9_4/domain/id_scope.py b/vistrails/db/versions/v0_9_4/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_9_4/domain/log.py b/vistrails/db/versions/v0_9_4/domain/log.py
new file mode 100644
index 0000000..0328b80
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/domain/log.py
@@ -0,0 +1,69 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v0_9_4/domain/vistrail.py b/vistrails/db/versions/v0_9_4/domain/vistrail.py
new file mode 100644
index 0000000..eaac9d4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/domain/vistrail.py
@@ -0,0 +1,127 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstraction, DBGroup, \
+    DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstraction.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.log_filename = self.log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'log_filename'):
+            new_obj.log_filename = old_obj.log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
diff --git a/vistrails/db/versions/v0_9_4/domain/workflow.py b/vistrails/db/versions/v0_9_4/domain/workflow.py
new file mode 100644
index 0000000..af484e6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/domain/workflow.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {DBAbstraction.vtType: DBModule.vtType, 
+                  DBGroup.vtType: DBModule.vtType}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == DBAbstraction.vtType or \
+                object.vtType == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == DBAbstraction.vtType or obj_type == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v0_9_4/persistence/__init__.py b/vistrails/db/versions/v0_9_4/persistence/__init__.py
new file mode 100644
index 0000000..d0234ba
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/__init__.py
@@ -0,0 +1,204 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_9_4 import version as my_version
+from vistrails.db.versions.v0_9_4.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBAbstraction, DBGroup
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id, lock=False):
+        all_objects = {}
+        global_props = {'id': id}
+        # print global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        del global_props['id']
+
+        for dao in self['sql'].itervalues():
+            if (dao == self['sql'][DBVistrail.vtType] or
+                # dao == self['sql'][DBWorkflow.vtType] or
+                dao == self['sql'][DBLog.vtType] or
+                dao == self['sql'][DBAbstraction.vtType]):
+                continue
+            current_objs = dao.get_sql_columns(db_connection, global_props, 
+                                               lock)
+            if dao == self['sql'][DBWorkflow.vtType]:
+                for key, obj in current_objs.iteritems():
+                    if key[0] == vtType and key[1] == id:
+                        continue
+                    elif key[0] == DBWorkflow.vtType:
+                        res_obj = self.open_from_db(db_connection, key[0], 
+                                                    key[1], lock)
+                        res_dict = {}
+                        res_dict[(res_obj.db_id, res_obj.vtType)] = res_obj
+                        all_objects.update(res_dict)
+            else:
+                all_objects.update(current_objs)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+        return res
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children() # forSQL=True)
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        (child, _, _) = children[0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                      global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                                c,
+                                                                global_props)
+
+        (child, _, _) = children.pop(0)
+        child.is_dirty = False
+        child.is_new = False
+        for (child, _, _) in children:
+            # print "child:", child.vtType, child.db_id
+            self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                          global_props, do_copy)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    self.save_to_db(db_connection, child.db_workflow,
+                                    do_copy,
+                                    {'entity_id': global_props['entity_id'],
+                                     'entity_type': \
+                                         global_props['entity_type']}
+                                    )
+                                            
+            child.is_dirty = False
+            child.is_new = False
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v0_9_4/persistence/sql/__init__.py b/vistrails/db/versions/v0_9_4/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_4/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_9_4/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..96b999b
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/sql/auto_gen.py
@@ -0,0 +1,2712 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_9_4.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(22)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[4], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[5], 'long', 'int')
+            entity_type = self.convertFromDB(row[6], 'str', 'char(16)')
+            parent = self.convertFromDB(row[7], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  spec=spec,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(22)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            spec = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          spec=spec,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'spec', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_spec') and obj.db_spec is not None:
+            columnMap['spec'] = \
+                self.convertToDB(obj.db_spec, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            tag=tag,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_parent = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        tag=tag,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id', 'parent_type']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            parent = self.convertFromDB(row[7], 'long', 'int')
+            parentType = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_parent = parent
+            workflow.db_parentType = parentType
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_parent) in all_objects:
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id', 'parent_type']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_execs:
+            child.db_workflow_exec = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(16)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(16)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_tags:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            abstraction_id = self.convertFromDB(row[8], 'long', 'int')
+            abstraction_version = self.convertFromDB(row[9], 'long', 'int')
+            machine_id = self.convertFromDB(row[10], 'long', 'int')
+            workflow_exec = self.convertFromDB(row[11], 'long', 'int')
+            entity_id = self.convertFromDB(row[12], 'long', 'int')
+            entity_type = self.convertFromDB(row[13], 'str', 'char(16)')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       abstraction_id=abstraction_id,
+                                       abstraction_version=abstraction_version,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_workflow_exec = workflow_exec
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('workflow_exec', obj.db_workflow_exec) in all_objects:
+            p = all_objects[('workflow_exec', obj.db_workflow_exec)]
+            p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'abstraction_id', 'abstraction_version', 'machine_id', 'wf_exec_id', 'entity_id', 'entity_type']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_version') and obj.db_abstraction_version is not None:
+            columnMap['abstraction_version'] = \
+                self.convertToDB(obj.db_abstraction_version, 'long', 'int')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_workflow_exec') and obj.db_workflow_exec is not None:
+            columnMap['wf_exec_id'] = \
+                self.convertToDB(obj.db_workflow_exec, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_4/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_9_4/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..ad01dc5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/sql/sql_dao.py
@@ -0,0 +1,183 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                # return "'" + str(value).replace("'", "''") + "'"
+                return str(value)
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v0_9_4/persistence/xml/__init__.py b/vistrails/db/versions/v0_9_4/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_4/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_9_4/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..7f93e6c
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/xml/auto_gen.py
@@ -0,0 +1,1703 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_9_4.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('spec',self.convertToStr(portSpec.db_spec, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('spec', None)
+        spec = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     spec=spec)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('spec',self.convertToStr(port.db_spec, 'str'))
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      tag=tag,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        node.set('tag',self.convertToStr(group.db_tag, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child.tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflow_exec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'value':
+                _data = self.convertFromStr(child.text,'')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('internalVersion', None)
+        internal_version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            internal_version=internal_version,
+                            tag=tag,
+                            location=location,
+                            functions=functions,
+                            annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('cache',self.convertToStr(abstraction.db_cache, 'int'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        node.set('namespace',self.convertToStr(abstraction.db_namespace, 'str'))
+        node.set('package',self.convertToStr(abstraction.db_package, 'str'))
+        node.set('version',self.convertToStr(abstraction.db_version, 'str'))
+        node.set('internalVersion',self.convertToStr(abstraction.db_internal_version, 'str'))
+        node.set('tag',self.convertToStr(abstraction.db_tag, 'str'))
+        
+        # set elements
+        location = abstraction.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstraction.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstraction.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            childNode = ElementTree.SubElement(node, 'plugin_data')
+            self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        module_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name,
+                             module_execs=module_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        module_execs = workflow_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'module_exec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('abstraction_id', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('abstraction_version', None)
+        abstraction_version = self.convertFromStr(data, 'long')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           abstraction_id=abstraction_id,
+                           abstraction_version=abstraction_version,
+                           machine_id=machine_id,
+                           annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('abstraction_id',self.convertToStr(module_exec.db_abstraction_id, 'long'))
+        node.set('abstraction_version',self.convertToStr(module_exec.db_abstraction_version, 'long'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_4/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_9_4/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_9_4/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_9_4/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..3cb4dc2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/schemas/sql/vistrails.sql
@@ -0,0 +1,305 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(22),
+    type varchar(255),
+    spec varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    spec varchar(4095),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    internal_version varchar(255),
+    tag varchar(255),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int,
+    parent_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(16),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    prune int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    abstraction_id int,
+    abstraction_version int,
+    machine_id int,
+    wf_exec_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_9_4/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_9_4/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..6b29819
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,38 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, plugin_data, function, abstraction, workflow, annotation, change_tbl, workflow_exec, connection_tbl, action, delete_tbl, vistrail, module_exec;
diff --git a/vistrails/db/versions/v0_9_4/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_9_4/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..42ceda0
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/schemas/xml/vistrail.xsd
@@ -0,0 +1,276 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="spec" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_9_4/specs/all.xml b/vistrails/db/versions/v0_9_4/specs/all.xml
new file mode 100644
index 0000000..c1863b0
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/specs/all.xml
@@ -0,0 +1,1601 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="prune" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="abstraction_id" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="abstraction_version" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="spec" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(22)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="spec" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent" ref="true" object="group" type="long" inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+</objects>
diff --git a/vistrails/db/versions/v0_9_4/translate/__init__.py b/vistrails/db/versions/v0_9_4/translate/__init__.py
new file mode 100644
index 0000000..5cf1ec6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.4'
diff --git a/vistrails/db/versions/v0_9_4/translate/v0_9_3.py b/vistrails/db/versions/v0_9_4/translate/v0_9_3.py
new file mode 100644
index 0000000..8bde2da
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/translate/v0_9_3.py
@@ -0,0 +1,117 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_9_4.domain import DBVistrail, DBAction, DBTag, DBModule, \
+    DBConnection, DBPortSpec, DBFunction, DBParameter, DBLocation, DBAdd, \
+    DBChange, DBDelete, DBAnnotation, DBPort, DBGroup, \
+    DBWorkflow, DBLog, DBAbstraction
+
+def update_workflow(old_obj, translate_dict):
+    return DBWorkflow.update_version(old_obj.db_workflow, 
+                                     translate_dict, DBWorkflow())
+
+def update_modules(old_obj, trans_dict):
+    new_modules = []
+    for obj in old_obj.db_modules:
+        if obj.vtType == 'module':
+            new_modules.append(DBModule.update_version(obj, trans_dict))
+        elif obj.vtType == 'abstractionRef':
+            new_modules.append(DBAbstraction.update_version(obj,
+                                                               trans_dict))
+        elif obj.vtType == 'group':
+            new_modules.append(DBGroup.update_version(obj, trans_dict))
+    return new_modules
+
+def translateVistrail(_vistrail):
+    def update_operations(old_obj, trans_dict):
+        def update_abstractionRef(old_obj, trans_dict):
+            def get_internal_version(old_obj, trans_dict):
+                return str(old_obj.db_version)
+            def get_version(old_obj, trans_dict):
+                return ''
+            new_dict = {'DBAbstraction':
+                        {'internal_version': get_internal_version,
+                         'version': get_version}}
+            new_dict.update(trans_dict)
+            return DBAbstraction.update_version(old_obj.db_data, new_dict)
+        new_ops = []
+        for obj in old_obj.db_operations:
+            if obj.vtType == 'add':
+                if obj.db_what == 'abstractionRef':
+                    trans_dict['DBAdd'] = {'data': update_abstractionRef}
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    new_op.db_what = 'abstraction'
+                    new_ops.append(new_op)
+                    del trans_dict['DBAdd']
+                else:
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    if obj.db_parentObjType == 'abstractionRef':
+                        new_op.db_parentObjType = 'abstraction'
+                    new_ops.append(new_op)
+            elif obj.vtType == 'delete':
+                new_ops.append(DBDelete.update_version(obj, trans_dict))
+            elif obj.vtType == 'change':
+                if obj.db_what == 'abstractionRef':
+                    trans_dict['DBChange'] = {'data': update_abstractionRef}
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    new_op.db_what = 'abstraction'
+                    new_ops.append(new_op)
+                    del trans_dict['DBChange']
+                else:
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    if obj.db_parentObjType == 'abstractionRef':
+                        new_op.db_parentObjType = 'abstraction'
+                    new_ops.append(new_op)
+        return new_ops
+
+    translate_dict = {'DBGroup': {'workflow': update_workflow},
+                      'DBAction': {'operations': update_operations},
+                      'DBWorkflow': {'modules': update_modules}}
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '0.9.4'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    translate_dict = {'DBGroup': {'workflow': update_workflow},
+                      'DBWorkflow': {'modules': update_modules}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '0.9.4'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '0.9.4'
+    return log
diff --git a/vistrails/db/versions/v0_9_4/translate/v0_9_5.py b/vistrails/db/versions/v0_9_4/translate/v0_9_5.py
new file mode 100644
index 0000000..46837d4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_4/translate/v0_9_5.py
@@ -0,0 +1,87 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.core import debug
+from vistrails.db.versions.v0_9_4.domain import DBVistrail, DBWorkflow, DBLog, DBGroup, DBModuleExec
+
+def translateVistrail(_vistrail):
+    def update_port_spec_spec(new_obj, translate_dict):
+        return new_obj.db_sigstring
+    def update_port_spec(new_obj, translate_dict):
+        return new_obj.db_signature
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    translate_dict = {'DBPortSpec': {'spec': update_port_spec_spec},
+                      'DBPort': {'spec': update_port_spec},
+                      'DBGroup': {'workflow': update_workflow}}
+
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '0.9.4'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_port_spec_spec(new_obj, translate_dict):
+        return new_obj.db_sigstring
+    def update_port_spec(new_obj, translate_dict):
+        return new_obj.db_signature
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    translate_dict = {'DBPortSpec': {'spec': update_port_spec_spec},
+                      'DBPort': {'spec': update_port_spec},
+                      'DBGroup': {'workflow': update_workflow}}
+
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '0.9.4'
+    return workflow
+
+def translateLog(_log):
+    def update_module_execs(old_obj, translate_dict):
+        new_module_execs = []
+        for obj in old_obj.db_items:
+            if obj.vtType == 'module_exec':
+                new_module_execs.append(DBModuleExec.update_version(obj, 
+                                                            translate_dict))
+            elif obj.vtType == 'group_exec':
+                # cannot handle group execs
+                debug.warning('Cannot translate group exec')
+            elif obj.vtType == 'loop_exec':
+                debug.warning('Cannot translate loop exec')
+        return new_module_execs
+    translate_dict = {'DBWorkflowExec': {'module_execs': update_module_execs}}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '0.9.4'
+    return log
diff --git a/vistrails/db/versions/v0_9_5/__init__.py b/vistrails/db/versions/v0_9_5/__init__.py
new file mode 100644
index 0000000..89c7f9a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.5'
diff --git a/vistrails/db/versions/v0_9_5/domain/__init__.py b/vistrails/db/versions/v0_9_5/domain/__init__.py
new file mode 100644
index 0000000..a8208f6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from registry import DBRegistry
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v0_9_5/domain/auto_gen.py b/vistrails/db/versions/v0_9_5/domain/auto_gen.py
new file mode 100644
index 0000000..c78266f
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/auto_gen.py
@@ -0,0 +1,7786 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, optional=None, sort_key=None, sigstring=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_optional = optional
+        self._db_sort_key = sort_key
+        self._db_sigstring = sigstring
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        optional=self._db_optional,
+                        sort_key=self._db_sort_key,
+                        sigstring=self._db_sigstring)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'optional' in class_dict:
+            res = class_dict['optional'](old_obj, trans_dict)
+            new_obj.db_optional = res
+        elif hasattr(old_obj, 'db_optional') and old_obj.db_optional is not None:
+            new_obj.db_optional = old_obj.db_optional
+        if 'sort_key' in class_dict:
+            res = class_dict['sort_key'](old_obj, trans_dict)
+            new_obj.db_sort_key = res
+        elif hasattr(old_obj, 'db_sort_key') and old_obj.db_sort_key is not None:
+            new_obj.db_sort_key = old_obj.db_sort_key
+        if 'sigstring' in class_dict:
+            res = class_dict['sigstring'](old_obj, trans_dict)
+            new_obj.db_sigstring = res
+        elif hasattr(old_obj, 'db_sigstring') and old_obj.db_sigstring is not None:
+            new_obj.db_sigstring = old_obj.db_sigstring
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_optional(self):
+        return self._db_optional
+    def __set_db_optional(self, optional):
+        self._db_optional = optional
+        self.is_dirty = True
+    db_optional = property(__get_db_optional, __set_db_optional)
+    def db_add_optional(self, optional):
+        self._db_optional = optional
+    def db_change_optional(self, optional):
+        self._db_optional = optional
+    def db_delete_optional(self, optional):
+        self._db_optional = None
+    
+    def __get_db_sort_key(self):
+        return self._db_sort_key
+    def __set_db_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+        self.is_dirty = True
+    db_sort_key = property(__get_db_sort_key, __set_db_sort_key)
+    def db_add_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_change_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_delete_sort_key(self, sort_key):
+        self._db_sort_key = None
+    
+    def __get_db_sigstring(self):
+        return self._db_sigstring
+    def __set_db_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+        self.is_dirty = True
+    db_sigstring = property(__get_db_sigstring, __set_db_sigstring)
+    def db_add_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_change_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_delete_sigstring(self, sigstring):
+        self._db_sigstring = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version,
+                      tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleDescriptor(object):
+
+    vtType = 'module_descriptor'
+
+    def __init__(self, id=None, name=None, package=None, namespace=None, version=None, base_descriptor_id=None, portSpecs=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_package = package
+        self._db_namespace = namespace
+        self._db_version = version
+        self._db_base_descriptor_id = base_descriptor_id
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleDescriptor.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleDescriptor(id=self._db_id,
+                                name=self._db_name,
+                                package=self._db_package,
+                                namespace=self._db_namespace,
+                                version=self._db_version,
+                                base_descriptor_id=self._db_base_descriptor_id)
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_base_descriptor_id') and ('module_descriptor', self._db_base_descriptor_id) in id_remap:
+                cp._db_base_descriptor_id = id_remap[('module_descriptor', self._db_base_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleDescriptor()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'base_descriptor_id' in class_dict:
+            res = class_dict['base_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_base_descriptor_id = res
+        elif hasattr(old_obj, 'db_base_descriptor_id') and old_obj.db_base_descriptor_id is not None:
+            new_obj.db_base_descriptor_id = old_obj.db_base_descriptor_id
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_base_descriptor_id(self):
+        return self._db_base_descriptor_id
+    def __set_db_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+        self.is_dirty = True
+    db_base_descriptor_id = property(__get_db_base_descriptor_id, __set_db_base_descriptor_id)
+    def db_add_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_change_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_delete_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = None
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, signature=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_signature = signature
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    signature=self._db_signature)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'signature' in class_dict:
+            res = class_dict['signature'](old_obj, trans_dict)
+            new_obj.db_signature = res
+        elif hasattr(old_obj, 'db_signature') and old_obj.db_signature is not None:
+            new_obj.db_signature = old_obj.db_signature
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_signature(self):
+        return self._db_signature
+    def __set_db_signature(self, signature):
+        self._db_signature = signature
+        self.is_dirty = True
+    db_signature = property(__get_db_signature, __set_db_signature)
+    def db_add_signature(self, signature):
+        self._db_signature = signature
+    def db_change_signature(self, signature):
+        self._db_signature = signature
+    def db_delete_signature(self, signature):
+        self._db_signature = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version,
+                     tag=self._db_tag)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, internal_version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_internal_version = internal_version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           cache=self._db_cache,
+                           name=self._db_name,
+                           namespace=self._db_namespace,
+                           package=self._db_package,
+                           version=self._db_version,
+                           internal_version=self._db_internal_version,
+                           tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'internal_version' in class_dict:
+            res = class_dict['internal_version'](old_obj, trans_dict)
+            new_obj.db_internal_version = res
+        elif hasattr(old_obj, 'db_internal_version') and old_obj.db_internal_version is not None:
+            new_obj.db_internal_version = old_obj.db_internal_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_internal_version(self):
+        return self._db_internal_version
+    def __set_db_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+        self.is_dirty = True
+    db_internal_version = property(__get_db_internal_version, __set_db_internal_version)
+    def db_add_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_change_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_delete_internal_version(self, internal_version):
+        self._db_internal_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstraction':
+                    new_obj.db_add_module(DBAbstraction.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBRegistry(object):
+
+    vtType = 'registry'
+
+    def __init__(self, id=None, entity_type=None, version=None, root_descriptor_id=None, name=None, last_modified=None, packages=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_root_descriptor_id = root_descriptor_id
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_packages = []
+        self.db_packages_id_index = {}
+        self.db_packages_identifier_index = {}
+        if packages is None:
+            self._db_packages = []
+        else:
+            self._db_packages = packages
+            for v in self._db_packages:
+                self.db_packages_id_index[v.db_id] = v
+                self.db_packages_identifier_index[(v.db_identifier,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRegistry.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRegistry(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        root_descriptor_id=self._db_root_descriptor_id,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_packages is None:
+            cp._db_packages = []
+        else:
+            cp._db_packages = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_packages]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_root_descriptor_id') and ('module_descriptor', self._db_root_descriptor_id) in id_remap:
+                cp._db_root_descriptor_id = id_remap[('module_descriptor', self._db_root_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_packages_id_index = dict((v.db_id, v) for v in cp._db_packages)
+        cp.db_packages_identifier_index = dict(((v.db_identifier,v.db_version), v) for v in cp._db_packages)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'root_descriptor_id' in class_dict:
+            res = class_dict['root_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_root_descriptor_id = res
+        elif hasattr(old_obj, 'db_root_descriptor_id') and old_obj.db_root_descriptor_id is not None:
+            new_obj.db_root_descriptor_id = old_obj.db_root_descriptor_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'packages' in class_dict:
+            res = class_dict['packages'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_package(obj)
+        elif hasattr(old_obj, 'db_packages') and old_obj.db_packages is not None:
+            for obj in old_obj.db_packages:
+                new_obj.db_add_package(DBPackage.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_packages') and hasattr(new_obj, 'db_deleted_packages'):
+            for obj in old_obj.db_deleted_packages:
+                n_obj = DBPackage.update_version(obj, trans_dict)
+                new_obj.db_deleted_packages.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_packages:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_package(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_packages)
+        if remove:
+            self.db_deleted_packages = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_packages:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_root_descriptor_id(self):
+        return self._db_root_descriptor_id
+    def __set_db_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+        self.is_dirty = True
+    db_root_descriptor_id = property(__get_db_root_descriptor_id, __set_db_root_descriptor_id)
+    def db_add_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_change_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_delete_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_packages(self):
+        return self._db_packages
+    def __set_db_packages(self, packages):
+        self._db_packages = packages
+        self.is_dirty = True
+    db_packages = property(__get_db_packages, __set_db_packages)
+    def db_get_packages(self):
+        return self._db_packages
+    def db_add_package(self, package):
+        self.is_dirty = True
+        self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_change_package(self, package):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                self._db_packages[i] = package
+                found = True
+                break
+        if not found:
+            self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_delete_package(self, package):
+        self.is_dirty = True
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                if not self._db_packages[i].is_new:
+                    self.db_deleted_packages.append(self._db_packages[i])
+                del self._db_packages[i]
+                break
+        del self.db_packages_id_index[package.db_id]
+        del self.db_packages_identifier_index[(package.db_identifier,package.db_version)]
+    def db_get_package(self, key):
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == key:
+                return self._db_packages[i]
+        return None
+    def db_get_package_by_id(self, key):
+        return self.db_packages_id_index[key]
+    def db_has_package_with_id(self, key):
+        return key in self.db_packages_id_index
+    def db_get_package_by_identifier(self, key):
+        return self.db_packages_identifier_index[key]
+    def db_has_package_with_identifier(self, key):
+        return key in self.db_packages_identifier_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroupExec(object):
+
+    vtType = 'group_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, group_name=None, group_type=None, completed=None, error=None, machine_id=None, annotations=None, loop_execs=None, module_execs=None, group_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_group_name = group_name
+        self._db_group_type = group_type
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_loop_execs = []
+        self.db_loop_execs_id_index = {}
+        if loop_execs is None:
+            self._db_loop_execs = []
+        else:
+            self._db_loop_execs = loop_execs
+            for v in self._db_loop_execs:
+                self.db_loop_execs_id_index[v.db_id] = v
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self._db_module_execs = []
+        else:
+            self._db_module_execs = module_execs
+            for v in self._db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.db_deleted_group_execs = []
+        self.db_group_execs_id_index = {}
+        if group_execs is None:
+            self._db_group_execs = []
+        else:
+            self._db_group_execs = group_execs
+            for v in self._db_group_execs:
+                self.db_group_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroupExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroupExec(id=self._db_id,
+                         ts_start=self._db_ts_start,
+                         ts_end=self._db_ts_end,
+                         cached=self._db_cached,
+                         module_id=self._db_module_id,
+                         group_name=self._db_group_name,
+                         group_type=self._db_group_type,
+                         completed=self._db_completed,
+                         error=self._db_error,
+                         machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_loop_execs is None:
+            cp._db_loop_execs = []
+        else:
+            cp._db_loop_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_loop_execs]
+        if self._db_module_execs is None:
+            cp._db_module_execs = []
+        else:
+            cp._db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_execs]
+        if self._db_group_execs is None:
+            cp._db_group_execs = []
+        else:
+            cp._db_group_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_group_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_loop_execs_id_index = dict((v.db_id, v) for v in cp._db_loop_execs)
+        cp.db_module_execs_id_index = dict((v.db_id, v) for v in cp._db_module_execs)
+        cp.db_group_execs_id_index = dict((v.db_id, v) for v in cp._db_group_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroupExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'group_name' in class_dict:
+            res = class_dict['group_name'](old_obj, trans_dict)
+            new_obj.db_group_name = res
+        elif hasattr(old_obj, 'db_group_name') and old_obj.db_group_name is not None:
+            new_obj.db_group_name = old_obj.db_group_name
+        if 'group_type' in class_dict:
+            res = class_dict['group_type'](old_obj, trans_dict)
+            new_obj.db_group_type = res
+        elif hasattr(old_obj, 'db_group_type') and old_obj.db_group_type is not None:
+            new_obj.db_group_type = old_obj.db_group_type
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'loop_execs' in class_dict:
+            res = class_dict['loop_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_loop_exec(obj)
+        elif hasattr(old_obj, 'db_loop_execs') and old_obj.db_loop_execs is not None:
+            for obj in old_obj.db_loop_execs:
+                new_obj.db_add_loop_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_loop_execs') and hasattr(new_obj, 'db_deleted_loop_execs'):
+            for obj in old_obj.db_deleted_loop_execs:
+                n_obj = DBLoopExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_loop_execs.append(n_obj)
+        if 'module_execs' in class_dict:
+            res = class_dict['module_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_exec(obj)
+        elif hasattr(old_obj, 'db_module_execs') and old_obj.db_module_execs is not None:
+            for obj in old_obj.db_module_execs:
+                new_obj.db_add_module_exec(DBModuleExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_execs') and hasattr(new_obj, 'db_deleted_module_execs'):
+            for obj in old_obj.db_deleted_module_execs:
+                n_obj = DBModuleExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_execs.append(n_obj)
+        if 'group_execs' in class_dict:
+            res = class_dict['group_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_group_exec(obj)
+        elif hasattr(old_obj, 'db_group_execs') and old_obj.db_group_execs is not None:
+            for obj in old_obj.db_group_execs:
+                new_obj.db_add_group_exec(DBGroupExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_group_execs') and hasattr(new_obj, 'db_deleted_group_execs'):
+            for obj in old_obj.db_deleted_group_execs:
+                n_obj = DBGroupExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_group_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_loop_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_loop_exec(child)
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        to_del = []
+        for child in self.db_group_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_group_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_loop_execs)
+        children.extend(self.db_deleted_module_execs)
+        children.extend(self.db_deleted_group_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_loop_execs = []
+            self.db_deleted_module_execs = []
+            self.db_deleted_group_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_loop_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_module_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_group_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_group_name(self):
+        return self._db_group_name
+    def __set_db_group_name(self, group_name):
+        self._db_group_name = group_name
+        self.is_dirty = True
+    db_group_name = property(__get_db_group_name, __set_db_group_name)
+    def db_add_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_change_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_delete_group_name(self, group_name):
+        self._db_group_name = None
+    
+    def __get_db_group_type(self):
+        return self._db_group_type
+    def __set_db_group_type(self, group_type):
+        self._db_group_type = group_type
+        self.is_dirty = True
+    db_group_type = property(__get_db_group_type, __set_db_group_type)
+    def db_add_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_change_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_delete_group_type(self, group_type):
+        self._db_group_type = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_loop_execs(self):
+        return self._db_loop_execs
+    def __set_db_loop_execs(self, loop_execs):
+        self._db_loop_execs = loop_execs
+        self.is_dirty = True
+    db_loop_execs = property(__get_db_loop_execs, __set_db_loop_execs)
+    def db_get_loop_execs(self):
+        return self._db_loop_execs
+    def db_add_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_change_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                self._db_loop_execs[i] = loop_exec
+                found = True
+                break
+        if not found:
+            self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_delete_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                if not self._db_loop_execs[i].is_new:
+                    self.db_deleted_loop_execs.append(self._db_loop_execs[i])
+                del self._db_loop_execs[i]
+                break
+        del self.db_loop_execs_id_index[loop_exec.db_id]
+    def db_get_loop_exec(self, key):
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == key:
+                return self._db_loop_execs[i]
+        return None
+    def db_get_loop_exec_by_id(self, key):
+        return self.db_loop_execs_id_index[key]
+    def db_has_loop_exec_with_id(self, key):
+        return key in self.db_loop_execs_id_index
+    
+    def __get_db_module_execs(self):
+        return self._db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self._db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self._db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                self._db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                if not self._db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self._db_module_execs[i])
+                del self._db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == key:
+                return self._db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return key in self.db_module_execs_id_index
+    
+    def __get_db_group_execs(self):
+        return self._db_group_execs
+    def __set_db_group_execs(self, group_execs):
+        self._db_group_execs = group_execs
+        self.is_dirty = True
+    db_group_execs = property(__get_db_group_execs, __set_db_group_execs)
+    def db_get_group_execs(self):
+        return self._db_group_execs
+    def db_add_group_exec(self, group_exec):
+        self.is_dirty = True
+        self._db_group_execs.append(group_exec)
+        self.db_group_execs_id_index[group_exec.db_id] = group_exec
+    def db_change_group_exec(self, group_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_group_execs)):
+            if self._db_group_execs[i].db_id == group_exec.db_id:
+                self._db_group_execs[i] = group_exec
+                found = True
+                break
+        if not found:
+            self._db_group_execs.append(group_exec)
+        self.db_group_execs_id_index[group_exec.db_id] = group_exec
+    def db_delete_group_exec(self, group_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_group_execs)):
+            if self._db_group_execs[i].db_id == group_exec.db_id:
+                if not self._db_group_execs[i].is_new:
+                    self.db_deleted_group_execs.append(self._db_group_execs[i])
+                del self._db_group_execs[i]
+                break
+        del self.db_group_execs_id_index[group_exec.db_id]
+    def db_get_group_exec(self, key):
+        for i in xrange(len(self._db_group_execs)):
+            if self._db_group_execs[i].db_id == key:
+                return self._db_group_execs[i]
+        return None
+    def db_get_group_exec_by_id(self, key):
+        return self.db_group_execs_id_index[key]
+    def db_has_group_exec_with_id(self, key):
+        return key in self.db_group_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBPackage(object):
+
+    vtType = 'package'
+
+    def __init__(self, id=None, name=None, identifier=None, codepath=None, load_configuration=None, version=None, description=None, module_descriptors=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_identifier = identifier
+        self._db_codepath = codepath
+        self._db_load_configuration = load_configuration
+        self._db_version = version
+        self._db_description = description
+        self.db_deleted_module_descriptors = []
+        self.db_module_descriptors_id_index = {}
+        self.db_module_descriptors_name_index = {}
+        if module_descriptors is None:
+            self._db_module_descriptors = []
+        else:
+            self._db_module_descriptors = module_descriptors
+            for v in self._db_module_descriptors:
+                self.db_module_descriptors_id_index[v.db_id] = v
+                self.db_module_descriptors_name_index[(v.db_name,v.db_namespace,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPackage.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPackage(id=self._db_id,
+                       name=self._db_name,
+                       identifier=self._db_identifier,
+                       codepath=self._db_codepath,
+                       load_configuration=self._db_load_configuration,
+                       version=self._db_version,
+                       description=self._db_description)
+        if self._db_module_descriptors is None:
+            cp._db_module_descriptors = []
+        else:
+            cp._db_module_descriptors = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_descriptors]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_descriptors_id_index = dict((v.db_id, v) for v in cp._db_module_descriptors)
+        cp.db_module_descriptors_name_index = dict(((v.db_name,v.db_namespace,v.db_version), v) for v in cp._db_module_descriptors)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPackage()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'identifier' in class_dict:
+            res = class_dict['identifier'](old_obj, trans_dict)
+            new_obj.db_identifier = res
+        elif hasattr(old_obj, 'db_identifier') and old_obj.db_identifier is not None:
+            new_obj.db_identifier = old_obj.db_identifier
+        if 'codepath' in class_dict:
+            res = class_dict['codepath'](old_obj, trans_dict)
+            new_obj.db_codepath = res
+        elif hasattr(old_obj, 'db_codepath') and old_obj.db_codepath is not None:
+            new_obj.db_codepath = old_obj.db_codepath
+        if 'load_configuration' in class_dict:
+            res = class_dict['load_configuration'](old_obj, trans_dict)
+            new_obj.db_load_configuration = res
+        elif hasattr(old_obj, 'db_load_configuration') and old_obj.db_load_configuration is not None:
+            new_obj.db_load_configuration = old_obj.db_load_configuration
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'description' in class_dict:
+            res = class_dict['description'](old_obj, trans_dict)
+            new_obj.db_description = res
+        elif hasattr(old_obj, 'db_description') and old_obj.db_description is not None:
+            new_obj.db_description = old_obj.db_description
+        if 'module_descriptors' in class_dict:
+            res = class_dict['module_descriptors'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_descriptor(obj)
+        elif hasattr(old_obj, 'db_module_descriptors') and old_obj.db_module_descriptors is not None:
+            for obj in old_obj.db_module_descriptors:
+                new_obj.db_add_module_descriptor(DBModuleDescriptor.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_descriptors') and hasattr(new_obj, 'db_deleted_module_descriptors'):
+            for obj in old_obj.db_deleted_module_descriptors:
+                n_obj = DBModuleDescriptor.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_descriptors.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_descriptors:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_descriptor(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_descriptors)
+        if remove:
+            self.db_deleted_module_descriptors = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_descriptors:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_identifier(self):
+        return self._db_identifier
+    def __set_db_identifier(self, identifier):
+        self._db_identifier = identifier
+        self.is_dirty = True
+    db_identifier = property(__get_db_identifier, __set_db_identifier)
+    def db_add_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_change_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_delete_identifier(self, identifier):
+        self._db_identifier = None
+    
+    def __get_db_codepath(self):
+        return self._db_codepath
+    def __set_db_codepath(self, codepath):
+        self._db_codepath = codepath
+        self.is_dirty = True
+    db_codepath = property(__get_db_codepath, __set_db_codepath)
+    def db_add_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_change_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_delete_codepath(self, codepath):
+        self._db_codepath = None
+    
+    def __get_db_load_configuration(self):
+        return self._db_load_configuration
+    def __set_db_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+        self.is_dirty = True
+    db_load_configuration = property(__get_db_load_configuration, __set_db_load_configuration)
+    def db_add_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_change_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_delete_load_configuration(self, load_configuration):
+        self._db_load_configuration = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_description(self):
+        return self._db_description
+    def __set_db_description(self, description):
+        self._db_description = description
+        self.is_dirty = True
+    db_description = property(__get_db_description, __set_db_description)
+    def db_add_description(self, description):
+        self._db_description = description
+    def db_change_description(self, description):
+        self._db_description = description
+    def db_delete_description(self, description):
+        self._db_description = None
+    
+    def __get_db_module_descriptors(self):
+        return self._db_module_descriptors
+    def __set_db_module_descriptors(self, module_descriptors):
+        self._db_module_descriptors = module_descriptors
+        self.is_dirty = True
+    db_module_descriptors = property(__get_db_module_descriptors, __set_db_module_descriptors)
+    def db_get_module_descriptors(self):
+        return self._db_module_descriptors
+    def db_add_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_change_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                self._db_module_descriptors[i] = module_descriptor
+                found = True
+                break
+        if not found:
+            self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_delete_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                if not self._db_module_descriptors[i].is_new:
+                    self.db_deleted_module_descriptors.append(self._db_module_descriptors[i])
+                del self._db_module_descriptors[i]
+                break
+        del self.db_module_descriptors_id_index[module_descriptor.db_id]
+        del self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)]
+    def db_get_module_descriptor(self, key):
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == key:
+                return self._db_module_descriptors[i]
+        return None
+    def db_get_module_descriptor_by_id(self, key):
+        return self.db_module_descriptors_id_index[key]
+    def db_has_module_descriptor_with_id(self, key):
+        return key in self.db_module_descriptors_id_index
+    def db_get_module_descriptor_by_name(self, key):
+        return self.db_module_descriptors_name_index[key]
+    def db_has_module_descriptor_with_name(self, key):
+        return key in self.db_module_descriptors_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, items=None, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None):
+        self.db_deleted_items = []
+        self.db_items_id_index = {}
+        if items is None:
+            self._db_items = []
+        else:
+            self._db_items = items
+            for v in self._db_items:
+                self.db_items_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_items is None:
+            cp._db_items = []
+        else:
+            cp._db_items = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_items]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_items_id_index = dict((v.db_id, v) for v in cp._db_items)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'items' in class_dict:
+            res = class_dict['items'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item(obj)
+        elif hasattr(old_obj, 'db_items') and old_obj.db_items is not None:
+            for obj in old_obj.db_items:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item(DBGroupExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_items') and hasattr(new_obj, 'db_deleted_items'):
+            for obj in old_obj.db_deleted_items:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_items.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_items.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_items:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_items)
+        if remove:
+            self.db_deleted_items = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_items:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_items(self):
+        return self._db_items
+    def __set_db_items(self, items):
+        self._db_items = items
+        self.is_dirty = True
+    db_items = property(__get_db_items, __set_db_items)
+    def db_get_items(self):
+        return self._db_items
+    def db_add_item(self, item):
+        self.is_dirty = True
+        self._db_items.append(item)
+        self.db_items_id_index[item.db_id] = item
+    def db_change_item(self, item):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_items)):
+            if self._db_items[i].db_id == item.db_id:
+                self._db_items[i] = item
+                found = True
+                break
+        if not found:
+            self._db_items.append(item)
+        self.db_items_id_index[item.db_id] = item
+    def db_delete_item(self, item):
+        self.is_dirty = True
+        for i in xrange(len(self._db_items)):
+            if self._db_items[i].db_id == item.db_id:
+                if not self._db_items[i].is_new:
+                    self.db_deleted_items.append(self._db_items[i])
+                del self._db_items[i]
+                break
+        del self.db_items_id_index[item.db_id]
+    def db_get_item(self, key):
+        for i in xrange(len(self._db_items)):
+            if self._db_items[i].db_id == key:
+                return self._db_items[i]
+        return None
+    def db_get_item_by_id(self, key):
+        return self.db_items_id_index[key]
+    def db_has_item_with_id(self, key):
+        return key in self.db_items_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLoopExec(object):
+
+    vtType = 'loop_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, completed=None, error=None, module_execs=None, group_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_completed = completed
+        self._db_error = error
+        self.db_deleted_module_execs = []
+        self.db_module_execs_id_index = {}
+        if module_execs is None:
+            self._db_module_execs = []
+        else:
+            self._db_module_execs = module_execs
+            for v in self._db_module_execs:
+                self.db_module_execs_id_index[v.db_id] = v
+        self.db_deleted_group_execs = []
+        self.db_group_execs_id_index = {}
+        if group_execs is None:
+            self._db_group_execs = []
+        else:
+            self._db_group_execs = group_execs
+            for v in self._db_group_execs:
+                self.db_group_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLoopExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLoopExec(id=self._db_id,
+                        ts_start=self._db_ts_start,
+                        ts_end=self._db_ts_end,
+                        completed=self._db_completed,
+                        error=self._db_error)
+        if self._db_module_execs is None:
+            cp._db_module_execs = []
+        else:
+            cp._db_module_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_execs]
+        if self._db_group_execs is None:
+            cp._db_group_execs = []
+        else:
+            cp._db_group_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_group_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_execs_id_index = dict((v.db_id, v) for v in cp._db_module_execs)
+        cp.db_group_execs_id_index = dict((v.db_id, v) for v in cp._db_group_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLoopExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'module_execs' in class_dict:
+            res = class_dict['module_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_exec(obj)
+        elif hasattr(old_obj, 'db_module_execs') and old_obj.db_module_execs is not None:
+            for obj in old_obj.db_module_execs:
+                new_obj.db_add_module_exec(DBModuleExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_execs') and hasattr(new_obj, 'db_deleted_module_execs'):
+            for obj in old_obj.db_deleted_module_execs:
+                n_obj = DBModuleExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_execs.append(n_obj)
+        if 'group_execs' in class_dict:
+            res = class_dict['group_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_group_exec(obj)
+        elif hasattr(old_obj, 'db_group_execs') and old_obj.db_group_execs is not None:
+            for obj in old_obj.db_group_execs:
+                new_obj.db_add_group_exec(DBGroupExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_group_execs') and hasattr(new_obj, 'db_deleted_group_execs'):
+            for obj in old_obj.db_deleted_group_execs:
+                n_obj = DBGroupExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_group_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_exec(child)
+        to_del = []
+        for child in self.db_group_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_group_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_execs)
+        children.extend(self.db_deleted_group_execs)
+        if remove:
+            self.db_deleted_module_execs = []
+            self.db_deleted_group_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_group_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_module_execs(self):
+        return self._db_module_execs
+    def __set_db_module_execs(self, module_execs):
+        self._db_module_execs = module_execs
+        self.is_dirty = True
+    db_module_execs = property(__get_db_module_execs, __set_db_module_execs)
+    def db_get_module_execs(self):
+        return self._db_module_execs
+    def db_add_module_exec(self, module_exec):
+        self.is_dirty = True
+        self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_change_module_exec(self, module_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                self._db_module_execs[i] = module_exec
+                found = True
+                break
+        if not found:
+            self._db_module_execs.append(module_exec)
+        self.db_module_execs_id_index[module_exec.db_id] = module_exec
+    def db_delete_module_exec(self, module_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == module_exec.db_id:
+                if not self._db_module_execs[i].is_new:
+                    self.db_deleted_module_execs.append(self._db_module_execs[i])
+                del self._db_module_execs[i]
+                break
+        del self.db_module_execs_id_index[module_exec.db_id]
+    def db_get_module_exec(self, key):
+        for i in xrange(len(self._db_module_execs)):
+            if self._db_module_execs[i].db_id == key:
+                return self._db_module_execs[i]
+        return None
+    def db_get_module_exec_by_id(self, key):
+        return self.db_module_execs_id_index[key]
+    def db_has_module_exec_with_id(self, key):
+        return key in self.db_module_execs_id_index
+    
+    def __get_db_group_execs(self):
+        return self._db_group_execs
+    def __set_db_group_execs(self, group_execs):
+        self._db_group_execs = group_execs
+        self.is_dirty = True
+    db_group_execs = property(__get_db_group_execs, __set_db_group_execs)
+    def db_get_group_execs(self):
+        return self._db_group_execs
+    def db_add_group_exec(self, group_exec):
+        self.is_dirty = True
+        self._db_group_execs.append(group_exec)
+        self.db_group_execs_id_index[group_exec.db_id] = group_exec
+    def db_change_group_exec(self, group_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_group_execs)):
+            if self._db_group_execs[i].db_id == group_exec.db_id:
+                self._db_group_execs[i] = group_exec
+                found = True
+                break
+        if not found:
+            self._db_group_execs.append(group_exec)
+        self.db_group_execs_id_index[group_exec.db_id] = group_exec
+    def db_delete_group_exec(self, group_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_group_execs)):
+            if self._db_group_execs[i].db_id == group_exec.db_id:
+                if not self._db_group_execs[i].is_new:
+                    self.db_deleted_group_execs.append(self._db_group_execs[i])
+                del self._db_group_execs[i]
+                break
+        del self.db_group_execs_id_index[group_exec.db_id]
+    def db_get_group_exec(self, key):
+        for i in xrange(len(self._db_group_execs)):
+            if self._db_group_execs[i].db_id == key:
+                return self._db_group_execs[i]
+        return None
+    def db_get_group_exec_by_id(self, key):
+        return self.db_group_execs_id_index[key]
+    def db_has_group_exec_with_id(self, key):
+        return key in self.db_group_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self._db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user,
+                      prune=self._db_prune)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'prune' in class_dict:
+            res = class_dict['prune'](old_obj, trans_dict)
+            new_obj.db_prune = res
+        elif hasattr(old_obj, 'db_prune') and old_obj.db_prune is not None:
+            new_obj.db_prune = old_obj.db_prune
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_prune(self):
+        return self._db_prune
+    def __set_db_prune(self, prune):
+        self._db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self._db_prune = prune
+    def db_change_prune(self, prune):
+        self._db_prune = prune
+    def db_delete_prune(self, prune):
+        self._db_prune = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, abstraction_id=None, abstraction_version=None, machine_id=None, annotations=None, loop_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_abstraction_id = abstraction_id
+        self._db_abstraction_version = abstraction_version
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_loop_execs = []
+        self.db_loop_execs_id_index = {}
+        if loop_execs is None:
+            self._db_loop_execs = []
+        else:
+            self._db_loop_execs = loop_execs
+            for v in self._db_loop_execs:
+                self.db_loop_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          abstraction_id=self._db_abstraction_id,
+                          abstraction_version=self._db_abstraction_version,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_loop_execs is None:
+            cp._db_loop_execs = []
+        else:
+            cp._db_loop_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_loop_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_loop_execs_id_index = dict((v.db_id, v) for v in cp._db_loop_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'abstraction_id' in class_dict:
+            res = class_dict['abstraction_id'](old_obj, trans_dict)
+            new_obj.db_abstraction_id = res
+        elif hasattr(old_obj, 'db_abstraction_id') and old_obj.db_abstraction_id is not None:
+            new_obj.db_abstraction_id = old_obj.db_abstraction_id
+        if 'abstraction_version' in class_dict:
+            res = class_dict['abstraction_version'](old_obj, trans_dict)
+            new_obj.db_abstraction_version = res
+        elif hasattr(old_obj, 'db_abstraction_version') and old_obj.db_abstraction_version is not None:
+            new_obj.db_abstraction_version = old_obj.db_abstraction_version
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'loop_execs' in class_dict:
+            res = class_dict['loop_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_loop_exec(obj)
+        elif hasattr(old_obj, 'db_loop_execs') and old_obj.db_loop_execs is not None:
+            for obj in old_obj.db_loop_execs:
+                new_obj.db_add_loop_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_loop_execs') and hasattr(new_obj, 'db_deleted_loop_execs'):
+            for obj in old_obj.db_deleted_loop_execs:
+                n_obj = DBLoopExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_loop_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_loop_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_loop_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_loop_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_loop_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_loop_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_abstraction_id(self):
+        return self._db_abstraction_id
+    def __set_db_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+        self.is_dirty = True
+    db_abstraction_id = property(__get_db_abstraction_id, __set_db_abstraction_id)
+    def db_add_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_change_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = abstraction_id
+    def db_delete_abstraction_id(self, abstraction_id):
+        self._db_abstraction_id = None
+    
+    def __get_db_abstraction_version(self):
+        return self._db_abstraction_version
+    def __set_db_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+        self.is_dirty = True
+    db_abstraction_version = property(__get_db_abstraction_version, __set_db_abstraction_version)
+    def db_add_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_change_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = abstraction_version
+    def db_delete_abstraction_version(self, abstraction_version):
+        self._db_abstraction_version = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_loop_execs(self):
+        return self._db_loop_execs
+    def __set_db_loop_execs(self, loop_execs):
+        self._db_loop_execs = loop_execs
+        self.is_dirty = True
+    db_loop_execs = property(__get_db_loop_execs, __set_db_loop_execs)
+    def db_get_loop_execs(self):
+        return self._db_loop_execs
+    def db_add_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_change_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                self._db_loop_execs[i] = loop_exec
+                found = True
+                break
+        if not found:
+            self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_delete_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                if not self._db_loop_execs[i].is_new:
+                    self.db_deleted_loop_execs.append(self._db_loop_execs[i])
+                del self._db_loop_execs[i]
+                break
+        del self.db_loop_execs_id_index[loop_exec.db_id]
+    def db_get_loop_exec(self, key):
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == key:
+                return self._db_loop_execs[i]
+        return None
+    def db_get_loop_exec_by_id(self, key):
+        return self.db_loop_execs_id_index[key]
+    def db_has_loop_exec_with_id(self, key):
+        return key in self.db_loop_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v0_9_5/domain/id_scope.py b/vistrails/db/versions/v0_9_5/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v0_9_5/domain/log.py b/vistrails/db/versions/v0_9_5/domain/log.py
new file mode 100644
index 0000000..0328b80
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/log.py
@@ -0,0 +1,69 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v0_9_5/domain/registry.py b/vistrails/db/versions/v0_9_5/domain/registry.py
new file mode 100644
index 0000000..70e47ab
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/registry.py
@@ -0,0 +1,61 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBRegistry as _DBRegistry, DBPackage, DBModuleDescriptor, \
+    DBPortSpec
+from id_scope import IdScope
+
+class DBRegistry(_DBRegistry):
+    def __init__(self, *args, **kwargs):
+        _DBRegistry.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        new_obj = _DBRegistry.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+    
+    def update_id_scope(self):
+        for package in self.db_packages:
+            self.idScope.updateBeginId(DBPackage.vtType, package.db_id+1)
+            for descriptor in package.db_module_descriptors:
+                self.idScope.updateBeginId(DBModuleDescriptor.vtType,
+                                           descriptor.db_id+1)
+                for port_spec in descriptor.db_portSpecs:
+                    self.idScope.updateBeginId(DBPortSpec.vtType, 
+                                               port_spec.db_id+1)
diff --git a/vistrails/db/versions/v0_9_5/domain/vistrail.py b/vistrails/db/versions/v0_9_5/domain/vistrail.py
new file mode 100644
index 0000000..a007a32
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/vistrail.py
@@ -0,0 +1,127 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstraction, DBGroup, \
+    DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstraction.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.db_log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.db_log_filename = self.db_log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'db_log_filename'):
+            new_obj.db_log_filename = old_obj.db_log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
diff --git a/vistrails/db/versions/v0_9_5/domain/workflow.py b/vistrails/db/versions/v0_9_5/domain/workflow.py
new file mode 100644
index 0000000..af484e6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/domain/workflow.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {DBAbstraction.vtType: DBModule.vtType, 
+                  DBGroup.vtType: DBModule.vtType}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == DBAbstraction.vtType or \
+                object.vtType == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == DBAbstraction.vtType or obj_type == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v0_9_5/persistence/__init__.py b/vistrails/db/versions/v0_9_5/persistence/__init__.py
new file mode 100644
index 0000000..d005047
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/__init__.py
@@ -0,0 +1,230 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v0_9_5 import version as my_version
+from vistrails.db.versions.v0_9_5.domain import DBGroup, DBWorkflow, DBVistrail, DBLog, \
+    DBRegistry
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        def indent(elem, level=0):
+            i = "\n" + level*"  "
+            if len(elem):
+                if not elem.text or not elem.text.strip():
+                    elem.text = i + "  "
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+                for elem in elem:
+                    indent(elem, level+1)
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        indent(tree.getroot())
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id=None, lock=False, 
+                     global_props=None):
+        all_objects = {}
+        if global_props is None:
+            global_props = {}
+        if id is not None:
+            global_props['id'] = id
+        # print global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        global_props = {'entity_id': res.db_id,
+                        'entity_type': res.vtType}
+
+        for dao_type, dao in self['sql'].iteritems():
+            if (dao_type == DBVistrail.vtType or
+                dao_type == DBWorkflow.vtType or
+                dao_type == DBLog.vtType or
+                dao_type == DBRegistry.vtType):
+                continue
+                
+            current_objs = dao.get_sql_columns(db_connection, global_props, 
+                                               lock)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+
+        return res
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children()
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        child = children[0][0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                  global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        # do deletes
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                            c,
+                                                            global_props)
+
+        child = children.pop(0)[0]
+        child.is_dirty = False
+        child.is_new = False
+
+        # process remaining children
+        for (child, _, _) in children:
+            # print "child:", child.vtType, child.db_id
+            self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                      global_props, do_copy)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    new_props = {'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    is_dirty = child.db_workflow.is_dirty
+                    child.db_workflow.db_entity_type = DBWorkflow.vtType
+                    child.db_workflow.is_dirty = is_dirty
+                    self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                    new_props)
+                                            
+            child.is_dirty = False
+            child.is_new = False
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v0_9_5/persistence/sql/__init__.py b/vistrails/db/versions/v0_9_5/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_5/persistence/sql/auto_gen.py b/vistrails/db/versions/v0_9_5/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..4fec1b4
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/sql/auto_gen.py
@@ -0,0 +1,3340 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v0_9_5.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            sigstring = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  sigstring=sigstring,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'module_descriptor':
+            p = all_objects[('module_descriptor', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_sigstring') and obj.db_sigstring is not None:
+            columnMap['sigstring'] = \
+                self.convertToDB(obj.db_sigstring, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleDescriptorSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_descriptor'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[5], 'long', 'int')
+            package = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('package', obj.db_package) in all_objects:
+            p = all_objects[('package', obj.db_package)]
+            p.db_add_module_descriptor(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'package', 'namespace', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            tag=tag,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_group = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        tag=tag,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_group) in all_objects:
+            p = all_objects[('group', obj.db_group)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBRegistrySQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'registry'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_packages:
+            child.db_registry = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_group_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_group_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_loop_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_module_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_group_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPackageSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'package'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('registry', obj.db_registry) in all_objects:
+            p = all_objects[('registry', obj.db_registry)]
+            p.db_add_package(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_descriptors:
+            child.db_package = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_items:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLoopExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'loop_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            completed = self.convertFromDB(row[3], 'int', 'int')
+            error = self.convertFromDB(row[4], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[5], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            parent = self.convertFromDB(row[8], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_loop_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_loop_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_group_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_tags:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'abstraction_id', 'abstraction_version', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            abstraction_id = self.convertFromDB(row[8], 'long', 'int')
+            abstraction_version = self.convertFromDB(row[9], 'long', 'int')
+            machine_id = self.convertFromDB(row[10], 'long', 'int')
+            parentType = self.convertFromDB(row[11], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[12], 'long', 'int')
+            entity_type = self.convertFromDB(row[13], 'str', 'char(16)')
+            parent = self.convertFromDB(row[14], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       abstraction_id=abstraction_id,
+                                       abstraction_version=abstraction_version,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_module_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_module_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'abstraction_id', 'abstraction_version', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_abstraction_id') and obj.db_abstraction_id is not None:
+            columnMap['abstraction_id'] = \
+                self.convertToDB(obj.db_abstraction_id, 'long', 'int')
+        if hasattr(obj, 'db_abstraction_version') and obj.db_abstraction_version is not None:
+            columnMap['abstraction_version'] = \
+                self.convertToDB(obj.db_abstraction_version, 'long', 'int')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_loop_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistrySQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecSQLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_5/persistence/sql/sql_dao.py b/vistrails/db/versions/v0_9_5/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..ad01dc5
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/sql/sql_dao.py
@@ -0,0 +1,183 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                # return "'" + str(value).replace("'", "''") + "'"
+                return str(value)
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v0_9_5/persistence/xml/__init__.py b/vistrails/db/versions/v0_9_5/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v0_9_5/persistence/xml/auto_gen.py b/vistrails/db/versions/v0_9_5/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..016e5fa
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/xml/auto_gen.py
@@ -0,0 +1,2117 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v0_9_5.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('optional', None)
+        optional = self.convertFromStr(data, 'int')
+        data = node.get('sortKey', None)
+        sort_key = self.convertFromStr(data, 'int')
+        data = node.get('sigstring', None)
+        sigstring = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         optional=optional,
+                         sort_key=sort_key,
+                         sigstring=sigstring)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('optional',self.convertToStr(portSpec.db_optional, 'int'))
+        node.set('sortKey',self.convertToStr(portSpec.db_sort_key, 'int'))
+        node.set('sigstring',self.convertToStr(portSpec.db_sigstring, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBModuleDescriptorXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleDescriptor':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('baseDescriptorId', None)
+        base_descriptor_id = self.convertFromStr(data, 'long')
+        
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleDescriptor(id=id,
+                                 name=name,
+                                 package=package,
+                                 namespace=namespace,
+                                 version=version,
+                                 base_descriptor_id=base_descriptor_id,
+                                 portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_descriptor, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleDescriptor')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_descriptor.db_id, 'long'))
+        node.set('name',self.convertToStr(module_descriptor.db_name, 'str'))
+        node.set('package',self.convertToStr(module_descriptor.db_package, 'str'))
+        node.set('namespace',self.convertToStr(module_descriptor.db_namespace, 'str'))
+        node.set('version',self.convertToStr(module_descriptor.db_version, 'str'))
+        node.set('baseDescriptorId',self.convertToStr(module_descriptor.db_base_descriptor_id, 'long'))
+        
+        # set elements
+        portSpecs = module_descriptor.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('signature', None)
+        signature = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     signature=signature)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('signature',self.convertToStr(port.db_signature, 'str'))
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      tag=tag,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        node.set('tag',self.convertToStr(group.db_tag, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child.tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflowExec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'value':
+                _data = self.convertFromStr(child.text,'')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('internalVersion', None)
+        internal_version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            internal_version=internal_version,
+                            tag=tag,
+                            location=location,
+                            functions=functions,
+                            annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('cache',self.convertToStr(abstraction.db_cache, 'int'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        node.set('namespace',self.convertToStr(abstraction.db_namespace, 'str'))
+        node.set('package',self.convertToStr(abstraction.db_package, 'str'))
+        node.set('version',self.convertToStr(abstraction.db_version, 'str'))
+        node.set('internalVersion',self.convertToStr(abstraction.db_internal_version, 'str'))
+        node.set('tag',self.convertToStr(abstraction.db_tag, 'str'))
+        
+        # set elements
+        location = abstraction.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstraction.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstraction.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                modules.append(_data)
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            childNode = ElementTree.SubElement(node, 'plugin_data')
+            self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBRegistryXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'registry':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('rootDescriptorId', None)
+        root_descriptor_id = self.convertFromStr(data, 'long')
+        
+        packages = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'package':
+                _data = self.getDao('package').fromXML(child)
+                packages.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBRegistry(id=id,
+                         version=version,
+                         root_descriptor_id=root_descriptor_id,
+                         packages=packages)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, registry, node=None):
+        if node is None:
+            node = ElementTree.Element('registry')
+        
+        # set attributes
+        node.set('id',self.convertToStr(registry.db_id, 'long'))
+        node.set('version',self.convertToStr(registry.db_version, 'str'))
+        node.set('rootDescriptorId',self.convertToStr(registry.db_root_descriptor_id, 'long'))
+        
+        # set elements
+        packages = registry.db_packages
+        for package in packages:
+            childNode = ElementTree.SubElement(node, 'package')
+            self.getDao('package').toXML(package, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child.tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child.tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child.tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child.tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child.tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child.tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child.tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child.tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child.tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBGroupExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'groupExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('groupName', None)
+        group_name = self.convertFromStr(data, 'str')
+        data = node.get('groupType', None)
+        group_type = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        loop_execs = []
+        module_execs = []
+        group_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                loop_execs.append(_data)
+            elif child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                group_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroupExec(id=id,
+                          ts_start=ts_start,
+                          ts_end=ts_end,
+                          cached=cached,
+                          module_id=module_id,
+                          group_name=group_name,
+                          group_type=group_type,
+                          completed=completed,
+                          error=error,
+                          machine_id=machine_id,
+                          annotations=annotations,
+                          loop_execs=loop_execs,
+                          module_execs=module_execs,
+                          group_execs=group_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('groupExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(group_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(group_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(group_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(group_exec.db_module_id, 'long'))
+        node.set('groupName',self.convertToStr(group_exec.db_group_name, 'str'))
+        node.set('groupType',self.convertToStr(group_exec.db_group_type, 'str'))
+        node.set('completed',self.convertToStr(group_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(group_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(group_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = group_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        loop_execs = group_exec.db_loop_execs
+        for loop_exec in loop_execs:
+            childNode = ElementTree.SubElement(node, 'loopExec')
+            self.getDao('loop_exec').toXML(loop_exec, childNode)
+        module_execs = group_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'moduleExec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        group_execs = group_exec.db_group_execs
+        for group_exec in group_execs:
+            childNode = ElementTree.SubElement(node, 'groupExec')
+            self.getDao('group_exec').toXML(group_exec, childNode)
+        
+        return node
+
+class DBPackageXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'package':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('identifier', None)
+        identifier = self.convertFromStr(data, 'str')
+        data = node.get('codepath', None)
+        codepath = self.convertFromStr(data, 'str')
+        data = node.get('loadConfiguration', None)
+        load_configuration = self.convertFromStr(data, 'int')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('description', None)
+        description = self.convertFromStr(data, 'str')
+        
+        module_descriptors = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleDescriptor':
+                _data = self.getDao('module_descriptor').fromXML(child)
+                module_descriptors.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPackage(id=id,
+                        name=name,
+                        identifier=identifier,
+                        codepath=codepath,
+                        load_configuration=load_configuration,
+                        version=version,
+                        description=description,
+                        module_descriptors=module_descriptors)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, package, node=None):
+        if node is None:
+            node = ElementTree.Element('package')
+        
+        # set attributes
+        node.set('id',self.convertToStr(package.db_id, 'long'))
+        node.set('name',self.convertToStr(package.db_name, 'str'))
+        node.set('identifier',self.convertToStr(package.db_identifier, 'str'))
+        node.set('codepath',self.convertToStr(package.db_codepath, 'str'))
+        node.set('loadConfiguration',self.convertToStr(package.db_load_configuration, 'int'))
+        node.set('version',self.convertToStr(package.db_version, 'str'))
+        node.set('description',self.convertToStr(package.db_description, 'str'))
+        
+        # set elements
+        module_descriptors = package.db_module_descriptors
+        for module_descriptor in module_descriptors:
+            childNode = ElementTree.SubElement(node, 'moduleDescriptor')
+            self.getDao('module_descriptor').toXML(module_descriptor, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        items = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                items.append(_data)
+            elif child.tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                items.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(items=items,
+                             id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        items = workflow_exec.db_items
+        for item in items:
+            if item.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item, childNode)
+            elif item.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item, childNode)
+        
+        return node
+
+class DBLoopExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'loopExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        
+        module_execs = []
+        group_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                module_execs.append(_data)
+            elif child.tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                group_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLoopExec(id=id,
+                         ts_start=ts_start,
+                         ts_end=ts_end,
+                         completed=completed,
+                         error=error,
+                         module_execs=module_execs,
+                         group_execs=group_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, loop_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('loopExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(loop_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(loop_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(loop_exec.db_ts_end, 'datetime'))
+        node.set('completed',self.convertToStr(loop_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(loop_exec.db_error, 'str'))
+        
+        # set elements
+        module_execs = loop_exec.db_module_execs
+        for module_exec in module_execs:
+            childNode = ElementTree.SubElement(node, 'moduleExec')
+            self.getDao('module_exec').toXML(module_exec, childNode)
+        group_execs = loop_exec.db_group_execs
+        for group_exec in group_execs:
+            childNode = ElementTree.SubElement(node, 'groupExec')
+            self.getDao('group_exec').toXML(group_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child.tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child.tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('abstraction_id', None)
+        abstraction_id = self.convertFromStr(data, 'long')
+        data = node.get('abstraction_version', None)
+        abstraction_version = self.convertFromStr(data, 'long')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        loop_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                loop_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           abstraction_id=abstraction_id,
+                           abstraction_version=abstraction_version,
+                           machine_id=machine_id,
+                           annotations=annotations,
+                           loop_execs=loop_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('abstraction_id',self.convertToStr(module_exec.db_abstraction_id, 'long'))
+        node.set('abstraction_version',self.convertToStr(module_exec.db_abstraction_version, 'long'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        loop_execs = module_exec.db_loop_execs
+        for loop_exec in loop_execs:
+            childNode = ElementTree.SubElement(node, 'loopExec')
+            self.getDao('loop_exec').toXML(loop_exec, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistryXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecXMLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v0_9_5/persistence/xml/xml_dao.py b/vistrails/db/versions/v0_9_5/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v0_9_5/schemas/sql/vistrails.sql b/vistrails/db/versions/v0_9_5/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..2019bdc
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/schemas/sql/vistrails.sql
@@ -0,0 +1,373 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+CREATE TABLE `vistrails_version`(`version` char(16)) engine=InnoDB;
+INSERT INTO `vistrails_version`(`version`) VALUES ('0.9.5');
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(255),
+    type varchar(255),
+    optional int,
+    sort_key int,
+    sigstring varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module_descriptor(
+    id int,
+    name varchar(255),
+    package varchar(255),
+    namespace varchar(255),
+    version varchar(255),
+    base_descriptor_id int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    signature varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    internal_version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE registry(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    root_descriptor_id int,
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE group_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    group_name varchar(255),
+    group_type varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE package(
+    id int not null auto_increment primary key,
+    name varchar(255),
+    identifier varchar(1023),
+    codepath varchar(1023),
+    load_configuration int,
+    version varchar(255),
+    description varchar(1023),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE loop_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    completed int,
+    error varchar(1023),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    prune int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    abstraction_id int,
+    abstraction_version int,
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v0_9_5/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v0_9_5/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..558226e
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,40 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+DROP TABLE IF EXISTS `vistrails_version`;
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, module_descriptor, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, plugin_data, function, abstraction, workflow, registry, annotation, change_tbl, group_exec, package, workflow_exec, loop_exec, connection_tbl, action, delete_tbl, vistrail, module_exec;
diff --git a/vistrails/db/versions/v0_9_5/schemas/xml/vistrail.xsd b/vistrails/db/versions/v0_9_5/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..51f02b3
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/schemas/xml/vistrail.xsd
@@ -0,0 +1,278 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="sigstring" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v0_9_5/specs/all.xml b/vistrails/db/versions/v0_9_5/specs/all.xml
new file mode 100644
index 0000000..d7b5e5a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/specs/all.xml
@@ -0,0 +1,2017 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="prune" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOOP_EXEC +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="loop_exec">
+    <layout>
+      <xml name="loopExec" nodeType="xs:element"/>
+      <sql table="loop_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <!--<property name="input" type="str">
+      <xml name="input" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>-->
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="group_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="module_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP_EXEC ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group_exec">
+    <layout>
+      <xml name="groupExec" nodeType="xs:element"/>
+      <sql table="group_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="group_name" type="str">
+      <xml name="groupName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="group_type" type="str">
+      <xml name="groupType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="module_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="group_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <!--<property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>-->
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="abstraction_id" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="abstraction_version" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="signature" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="optional" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sort_key" type="int">
+      <xml name="sortKey" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sigstring" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="module_descriptor">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_DESCRIPTOR +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_descriptor">
+    <layout>
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+      <sql table="module_descriptor"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+	   
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="base_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="baseDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="package" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+    <!--
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="registry">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="package">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    -->
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PACKAGE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="package">
+    <layout>
+      <xml name="package" nodeType="xs:element"/>
+      <sql table="package"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="identifier" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="codepath" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+      
+    <property name="load_configuration" type="int">
+      <xml name="loadConfiguration" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>      
+
+    <property name="description" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_descriptor" type="list" 
+	      mapping="one-to-many" index="name:namespace:version">
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="registry" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- REGISTRY ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="registry">
+    <layout>
+      <xml name="registry" nodeType="xs:element"/>
+      <sql table="registry"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="root_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="rootDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <!-- <xml nodeType="xs:attribute" type="xs:string"/> -->
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="package" type="list"
+	      mapping="one-to-many" index="identifier:version">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="group" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <choice name="item" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+</objects>
diff --git a/vistrails/db/versions/v0_9_5/translate/__init__.py b/vistrails/db/versions/v0_9_5/translate/__init__.py
new file mode 100644
index 0000000..89c7f9a
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '0.9.5'
diff --git a/vistrails/db/versions/v0_9_5/translate/v0_9_4.py b/vistrails/db/versions/v0_9_5/translate/v0_9_4.py
new file mode 100644
index 0000000..0ed2be6
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/translate/v0_9_4.py
@@ -0,0 +1,99 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v0_9_5.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry, DBModuleExec
+
+def translateVistrail(_vistrail):
+    def update_signature(old_obj, translate_dict):
+        return old_obj.db_spec
+    def update_optional(old_obj, translate_dict):
+        return 0
+    def update_sort_key(old_obj, translate_dict):
+        return -1
+    def update_sigstring(old_obj, translate_dict):
+        return old_obj.db_spec
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    translate_dict = {'DBPortSpec': {'sigstring': update_sigstring,
+                                     'optional': update_optional,
+                                     'sort_key': update_sort_key},
+                      'DBPort': {'signature': update_signature},
+                      'DBGroup': {'workflow': update_workflow}}
+
+    # pass DBVistrail because domain contains enriched version of the auto_gen
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '0.9.5'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_signature(old_obj, translate_dict):
+        return old_obj.db_spec
+    def update_optional(old_obj, translate_dict):
+        return 0
+    def update_sort_key(old_obj, translate_dict):
+        return -1
+    def update_sigstring(old_obj, translate_dict):
+        return old_obj.db_spec
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    translate_dict = {'DBPortSpec': {'sigstring': update_sigstring,
+                                     'optional': update_optional,
+                                     'sort_key': update_sort_key},
+                      'DBPort': {'signature': update_signature},
+                      'DBGroup': {'workflow': update_workflow}}
+
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '0.9.5'
+    return workflow
+
+def translateLog(_log):
+    def update_items(old_obj, translate_dict):
+        new_items = []
+        for obj in old_obj.db_module_execs:
+            new_items.append(DBModuleExec.update_version(obj, translate_dict))
+        return new_items
+    translate_dict = {'DBWorkflowExec': {'items': update_items}}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '0.9.5'
+    return log
+
+def translateRegistry(_registry):
+    translate_dict = {}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '0.9.5'
+    return registry
diff --git a/vistrails/db/versions/v0_9_5/translate/v1_0_0.py b/vistrails/db/versions/v0_9_5/translate/v1_0_0.py
new file mode 100644
index 0000000..fe40509
--- /dev/null
+++ b/vistrails/db/versions/v0_9_5/translate/v1_0_0.py
@@ -0,0 +1,113 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.core import debug
+
+from vistrails.db.versions.v0_9_5.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry, DBModuleExec, DBGroupExec
+
+def translateVistrail(_vistrail):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '0.9.5'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '0.9.5'
+    return workflow
+
+def translateLog(_log):
+    def update_items(old_obj, translate_dict):
+        new_items = []
+        for obj in old_obj.db_item_execs:
+            if obj.vtType == 'module_exec':
+                new_items.append(DBModuleExec.update_version(obj, translate_dict))
+            elif obj.vtType == 'group_exec':
+                new_items.append(DBGroupExec.update_version(obj, translate_dict))
+            elif obj.vtType == 'loop_exec':
+                new_items.append(DBLoopExec.update_version(obj, translate_dict))
+
+        return new_items
+
+    def update_exec_items(which, old_obj, translate_dict, catch_loops=False):
+        new_items = []
+        for obj in old_obj.db_item_execs:
+            if catch_loops and obj.vtType == 'loop_exec':
+                debug.warning("Cannot translate loop_exec inside of loop_exec")
+            if obj.vtType == which:
+                if obj.vtType == 'module_exec':
+                    new_items.append(DBModuleExec.update_version(obj, translate_dict))
+                elif obj.vtType == 'group_exec':
+                    new_items.append(DBGroupExec.update_version(obj, translate_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_items.append(DBLoopExec.update_version(obj, translate_dict))
+        return new_items
+
+    def update_group_module_execs(old_obj, translate_dict):
+        return update_exec_items('module_exec', old_obj, translate_dict)
+
+    def update_group_group_execs(old_obj, translate_dict):
+        return update_exec_items('group_exec', old_obj, translate_dict)
+
+    def update_group_loop_execs(old_obj, translate_dict):
+        return update_exec_items('loop_exec', old_obj, translate_dict)
+
+    def update_loop_module_execs(old_obj, translate_dict):
+        return update_exec_tems('module_exec', old_obj, translate_dict, True)
+
+    def update_loop_group_execs(old_obj, translate_dict):
+        return update_exec_items('group_exec', old_obj, translate_dict)
+
+    translate_dict = {'DBWorkflowExec': {'items': update_items},
+                      'DBGroupExec': {'group_execs': update_group_group_execs,
+                                      'module_execs': update_group_module_execs,
+                                      'loop_execs': update_group_loop_execs},
+                      'DBLoopExec': {'group_execs': update_loop_group_execs,
+                                     'module_execs': update_loop_module_execs}}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '0.9.5'
+    return log
+
+def translateRegistry(_registry):
+    translate_dict = {}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '0.9.5'
+    return registry
diff --git a/vistrails/db/versions/v1_0_0/__init__.py b/vistrails/db/versions/v1_0_0/__init__.py
new file mode 100644
index 0000000..85cbe3f
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.0'
diff --git a/vistrails/db/versions/v1_0_0/domain/__init__.py b/vistrails/db/versions/v1_0_0/domain/__init__.py
new file mode 100644
index 0000000..a8208f6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from registry import DBRegistry
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v1_0_0/domain/auto_gen.py b/vistrails/db/versions/v1_0_0/domain/auto_gen.py
new file mode 100644
index 0000000..c2aa908
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/auto_gen.py
@@ -0,0 +1,11387 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBOpmProcessIdEffect(object):
+
+    vtType = 'opm_process_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmWasGeneratedBy(object):
+
+    vtType = 'opm_was_generated_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasGeneratedBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasGeneratedBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasGeneratedBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmAccounts(object):
+
+    vtType = 'opm_accounts'
+
+    def __init__(self, accounts=None, opm_overlapss=None):
+        self.db_deleted_accounts = []
+        self.db_accounts_id_index = {}
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+            for v in self._db_accounts:
+                self.db_accounts_id_index[v.db_id] = v
+        self.db_deleted_opm_overlapss = []
+        if opm_overlapss is None:
+            self._db_opm_overlapss = []
+        else:
+            self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccounts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccounts()
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_overlapss is None:
+            cp._db_opm_overlapss = []
+        else:
+            cp._db_opm_overlapss = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_overlapss]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_accounts_id_index = dict((v.db_id, v) for v in cp._db_accounts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccounts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccount.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccount.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_overlapss' in class_dict:
+            res = class_dict['opm_overlapss'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_overlaps(obj)
+        elif hasattr(old_obj, 'db_opm_overlapss') and old_obj.db_opm_overlapss is not None:
+            for obj in old_obj.db_opm_overlapss:
+                new_obj.db_add_opm_overlaps(DBOpmOverlaps.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_overlapss') and hasattr(new_obj, 'db_deleted_opm_overlapss'):
+            for obj in old_obj.db_deleted_opm_overlapss:
+                n_obj = DBOpmOverlaps.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_overlapss.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_overlapss:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_overlaps(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_overlapss)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_overlapss = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_overlapss:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_change_account(self, account):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                self._db_accounts[i] = account
+                found = True
+                break
+        if not found:
+            self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                if not self._db_accounts[i].is_new:
+                    self.db_deleted_accounts.append(self._db_accounts[i])
+                del self._db_accounts[i]
+                break
+        del self.db_accounts_id_index[account.db_id]
+    def db_get_account(self, key):
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == key:
+                return self._db_accounts[i]
+        return None
+    def db_get_account_by_id(self, key):
+        return self.db_accounts_id_index[key]
+    def db_has_account_with_id(self, key):
+        return key in self.db_accounts_id_index
+    
+    def __get_db_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def __set_db_opm_overlapss(self, opm_overlapss):
+        self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+    db_opm_overlapss = property(__get_db_opm_overlapss, __set_db_opm_overlapss)
+    def db_get_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def db_add_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_change_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_delete_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_overlaps(self, key):
+        return None
+    
+
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, optional=None, sort_key=None, sigstring=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_optional = optional
+        self._db_sort_key = sort_key
+        self._db_sigstring = sigstring
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        optional=self._db_optional,
+                        sort_key=self._db_sort_key,
+                        sigstring=self._db_sigstring)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'optional' in class_dict:
+            res = class_dict['optional'](old_obj, trans_dict)
+            new_obj.db_optional = res
+        elif hasattr(old_obj, 'db_optional') and old_obj.db_optional is not None:
+            new_obj.db_optional = old_obj.db_optional
+        if 'sort_key' in class_dict:
+            res = class_dict['sort_key'](old_obj, trans_dict)
+            new_obj.db_sort_key = res
+        elif hasattr(old_obj, 'db_sort_key') and old_obj.db_sort_key is not None:
+            new_obj.db_sort_key = old_obj.db_sort_key
+        if 'sigstring' in class_dict:
+            res = class_dict['sigstring'](old_obj, trans_dict)
+            new_obj.db_sigstring = res
+        elif hasattr(old_obj, 'db_sigstring') and old_obj.db_sigstring is not None:
+            new_obj.db_sigstring = old_obj.db_sigstring
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_optional(self):
+        return self._db_optional
+    def __set_db_optional(self, optional):
+        self._db_optional = optional
+        self.is_dirty = True
+    db_optional = property(__get_db_optional, __set_db_optional)
+    def db_add_optional(self, optional):
+        self._db_optional = optional
+    def db_change_optional(self, optional):
+        self._db_optional = optional
+    def db_delete_optional(self, optional):
+        self._db_optional = None
+    
+    def __get_db_sort_key(self):
+        return self._db_sort_key
+    def __set_db_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+        self.is_dirty = True
+    db_sort_key = property(__get_db_sort_key, __set_db_sort_key)
+    def db_add_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_change_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_delete_sort_key(self, sort_key):
+        self._db_sort_key = None
+    
+    def __get_db_sigstring(self):
+        return self._db_sigstring
+    def __set_db_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+        self.is_dirty = True
+    db_sigstring = property(__get_db_sigstring, __set_db_sigstring)
+    def db_add_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_change_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_delete_sigstring(self, sigstring):
+        self._db_sigstring = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version,
+                      tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleDescriptor(object):
+
+    vtType = 'module_descriptor'
+
+    def __init__(self, id=None, name=None, package=None, namespace=None, version=None, base_descriptor_id=None, portSpecs=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_package = package
+        self._db_namespace = namespace
+        self._db_version = version
+        self._db_base_descriptor_id = base_descriptor_id
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleDescriptor.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleDescriptor(id=self._db_id,
+                                name=self._db_name,
+                                package=self._db_package,
+                                namespace=self._db_namespace,
+                                version=self._db_version,
+                                base_descriptor_id=self._db_base_descriptor_id)
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_base_descriptor_id') and ('module_descriptor', self._db_base_descriptor_id) in id_remap:
+                cp._db_base_descriptor_id = id_remap[('module_descriptor', self._db_base_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleDescriptor()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'base_descriptor_id' in class_dict:
+            res = class_dict['base_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_base_descriptor_id = res
+        elif hasattr(old_obj, 'db_base_descriptor_id') and old_obj.db_base_descriptor_id is not None:
+            new_obj.db_base_descriptor_id = old_obj.db_base_descriptor_id
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_base_descriptor_id(self):
+        return self._db_base_descriptor_id
+    def __set_db_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+        self.is_dirty = True
+    db_base_descriptor_id = property(__get_db_base_descriptor_id, __set_db_base_descriptor_id)
+    def db_add_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_change_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_delete_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = None
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmRole(object):
+
+    vtType = 'opm_role'
+
+    def __init__(self, value=None):
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmRole.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmRole(value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmRole()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+
+
+class DBOpmProcesses(object):
+
+    vtType = 'opm_processes'
+
+    def __init__(self, processs=None):
+        self.db_deleted_processs = []
+        self.db_processs_id_index = {}
+        if processs is None:
+            self._db_processs = []
+        else:
+            self._db_processs = processs
+            for v in self._db_processs:
+                self.db_processs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcesses.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcesses()
+        if self._db_processs is None:
+            cp._db_processs = []
+        else:
+            cp._db_processs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_processs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_processs_id_index = dict((v.db_id, v) for v in cp._db_processs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcesses()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'processs' in class_dict:
+            res = class_dict['processs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_process(obj)
+        elif hasattr(old_obj, 'db_processs') and old_obj.db_processs is not None:
+            for obj in old_obj.db_processs:
+                new_obj.db_add_process(DBOpmProcess.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processs') and hasattr(new_obj, 'db_deleted_processs'):
+            for obj in old_obj.db_deleted_processs:
+                n_obj = DBOpmProcess.update_version(obj, trans_dict)
+                new_obj.db_deleted_processs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_processs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_process(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_processs)
+        if remove:
+            self.db_deleted_processs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_processs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_processs(self):
+        return self._db_processs
+    def __set_db_processs(self, processs):
+        self._db_processs = processs
+        self.is_dirty = True
+    db_processs = property(__get_db_processs, __set_db_processs)
+    def db_get_processs(self):
+        return self._db_processs
+    def db_add_process(self, process):
+        self.is_dirty = True
+        self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_change_process(self, process):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                self._db_processs[i] = process
+                found = True
+                break
+        if not found:
+            self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_delete_process(self, process):
+        self.is_dirty = True
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                if not self._db_processs[i].is_new:
+                    self.db_deleted_processs.append(self._db_processs[i])
+                del self._db_processs[i]
+                break
+        del self.db_processs_id_index[process.db_id]
+    def db_get_process(self, key):
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == key:
+                return self._db_processs[i]
+        return None
+    def db_get_process_by_id(self, key):
+        return self.db_processs_id_index[key]
+    def db_has_process_with_id(self, key):
+        return key in self.db_processs_id_index
+    
+
+
+class DBOpmAccountId(object):
+
+    vtType = 'opm_account_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccountId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccountId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_account', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_account', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccountId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, signature=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_signature = signature
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    signature=self._db_signature)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'signature' in class_dict:
+            res = class_dict['signature'](old_obj, trans_dict)
+            new_obj.db_signature = res
+        elif hasattr(old_obj, 'db_signature') and old_obj.db_signature is not None:
+            new_obj.db_signature = old_obj.db_signature
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_signature(self):
+        return self._db_signature
+    def __set_db_signature(self, signature):
+        self._db_signature = signature
+        self.is_dirty = True
+    db_signature = property(__get_db_signature, __set_db_signature)
+    def db_add_signature(self, signature):
+        self._db_signature = signature
+    def db_change_signature(self, signature):
+        self._db_signature = signature
+    def db_delete_signature(self, signature):
+        self._db_signature = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifact(object):
+
+    vtType = 'opm_artifact'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifact.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifact(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifact()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmArtifactValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmArtifactValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version,
+                     tag=self._db_tag)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgents(object):
+
+    vtType = 'opm_agents'
+
+    def __init__(self, agents=None):
+        self.db_deleted_agents = []
+        self.db_agents_id_index = {}
+        if agents is None:
+            self._db_agents = []
+        else:
+            self._db_agents = agents
+            for v in self._db_agents:
+                self.db_agents_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgents.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgents()
+        if self._db_agents is None:
+            cp._db_agents = []
+        else:
+            cp._db_agents = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_agents]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_agents_id_index = dict((v.db_id, v) for v in cp._db_agents)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgents()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_agent(obj)
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            for obj in old_obj.db_agents:
+                new_obj.db_add_agent(DBOpmAgent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgent.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_agents:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_agent(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_agents)
+        if remove:
+            self.db_deleted_agents = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_agents:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_get_agents(self):
+        return self._db_agents
+    def db_add_agent(self, agent):
+        self.is_dirty = True
+        self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_change_agent(self, agent):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                self._db_agents[i] = agent
+                found = True
+                break
+        if not found:
+            self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_delete_agent(self, agent):
+        self.is_dirty = True
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                if not self._db_agents[i].is_new:
+                    self.db_deleted_agents.append(self._db_agents[i])
+                del self._db_agents[i]
+                break
+        del self.db_agents_id_index[agent.db_id]
+    def db_get_agent(self, key):
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == key:
+                return self._db_agents[i]
+        return None
+    def db_get_agent_by_id(self, key):
+        return self.db_agents_id_index[key]
+    def db_has_agent_with_id(self, key):
+        return key in self.db_agents_id_index
+    
+
+
+class DBOpmProcessIdCause(object):
+
+    vtType = 'opm_process_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmOverlaps(object):
+
+    vtType = 'opm_overlaps'
+
+    def __init__(self, opm_account_ids=None):
+        self.db_deleted_opm_account_ids = []
+        if opm_account_ids is None:
+            self._db_opm_account_ids = []
+        else:
+            self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmOverlaps.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmOverlaps()
+        if self._db_opm_account_ids is None:
+            cp._db_opm_account_ids = []
+        else:
+            cp._db_opm_account_ids = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_account_ids]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmOverlaps()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'opm_account_ids' in class_dict:
+            res = class_dict['opm_account_ids'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_account_id(obj)
+        elif hasattr(old_obj, 'db_opm_account_ids') and old_obj.db_opm_account_ids is not None:
+            for obj in old_obj.db_opm_account_ids:
+                new_obj.db_add_opm_account_id(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_account_ids') and hasattr(new_obj, 'db_deleted_opm_account_ids'):
+            for obj in old_obj.db_deleted_opm_account_ids:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_account_ids.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_opm_account_ids:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_account_id(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_opm_account_ids)
+        if remove:
+            self.db_deleted_opm_account_ids = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_opm_account_ids:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def __set_db_opm_account_ids(self, opm_account_ids):
+        self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+    db_opm_account_ids = property(__get_db_opm_account_ids, __set_db_opm_account_ids)
+    def db_get_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def db_add_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_change_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_delete_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_account_id(self, key):
+        return None
+    
+
+
+class DBOpmArtifacts(object):
+
+    vtType = 'opm_artifacts'
+
+    def __init__(self, artifacts=None):
+        self.db_deleted_artifacts = []
+        self.db_artifacts_id_index = {}
+        if artifacts is None:
+            self._db_artifacts = []
+        else:
+            self._db_artifacts = artifacts
+            for v in self._db_artifacts:
+                self.db_artifacts_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifacts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifacts()
+        if self._db_artifacts is None:
+            cp._db_artifacts = []
+        else:
+            cp._db_artifacts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_artifacts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_artifacts_id_index = dict((v.db_id, v) for v in cp._db_artifacts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifacts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_artifact(obj)
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            for obj in old_obj.db_artifacts:
+                new_obj.db_add_artifact(DBOpmArtifact.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifact.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_artifacts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_artifact(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_artifacts)
+        if remove:
+            self.db_deleted_artifacts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_artifacts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_get_artifacts(self):
+        return self._db_artifacts
+    def db_add_artifact(self, artifact):
+        self.is_dirty = True
+        self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_change_artifact(self, artifact):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                self._db_artifacts[i] = artifact
+                found = True
+                break
+        if not found:
+            self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_delete_artifact(self, artifact):
+        self.is_dirty = True
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                if not self._db_artifacts[i].is_new:
+                    self.db_deleted_artifacts.append(self._db_artifacts[i])
+                del self._db_artifacts[i]
+                break
+        del self.db_artifacts_id_index[artifact.db_id]
+    def db_get_artifact(self, key):
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == key:
+                return self._db_artifacts[i]
+        return None
+    def db_get_artifact_by_id(self, key):
+        return self.db_artifacts_id_index[key]
+    def db_has_artifact_with_id(self, key):
+        return key in self.db_artifacts_id_index
+    
+
+
+class DBOpmDependencies(object):
+
+    vtType = 'opm_dependencies'
+
+    def __init__(self, dependencys=None):
+        self.db_deleted_dependencys = []
+        if dependencys is None:
+            self._db_dependencys = []
+        else:
+            self._db_dependencys = dependencys
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmDependencies.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmDependencies()
+        if self._db_dependencys is None:
+            cp._db_dependencys = []
+        else:
+            cp._db_dependencys = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_dependencys]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmDependencies()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'dependencys' in class_dict:
+            res = class_dict['dependencys'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_dependency(obj)
+        elif hasattr(old_obj, 'db_dependencys') and old_obj.db_dependencys is not None:
+            for obj in old_obj.db_dependencys:
+                if obj.vtType == 'opm_used':
+                    new_obj.db_add_dependency(DBOpmUsed.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_generated_by':
+                    new_obj.db_add_dependency(DBOpmWasGeneratedBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_triggered_by':
+                    new_obj.db_add_dependency(DBOpmWasTriggeredBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_derived_from':
+                    new_obj.db_add_dependency(DBOpmWasDerivedFrom.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_controlled_by':
+                    new_obj.db_add_dependency(DBOpmWasControlledBy.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencys') and hasattr(new_obj, 'db_deleted_dependencys'):
+            for obj in old_obj.db_deleted_dependencys:
+                if obj.vtType == 'opm_used':
+                    n_obj = DBOpmUsed.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_generated_by':
+                    n_obj = DBOpmWasGeneratedBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_triggered_by':
+                    n_obj = DBOpmWasTriggeredBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_derived_from':
+                    n_obj = DBOpmWasDerivedFrom.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_controlled_by':
+                    n_obj = DBOpmWasControlledBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_dependencys:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_dependency(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_dependencys)
+        if remove:
+            self.db_deleted_dependencys = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_dependencys:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_dependencys(self):
+        return self._db_dependencys
+    def __set_db_dependencys(self, dependencys):
+        self._db_dependencys = dependencys
+        self.is_dirty = True
+    db_dependencys = property(__get_db_dependencys, __set_db_dependencys)
+    def db_get_dependencys(self):
+        return self._db_dependencys
+    def db_add_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_change_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_delete_dependency(self, dependency):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_dependency(self, key):
+        return None
+    
+
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmUsed(object):
+
+    vtType = 'opm_used'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmUsed.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmUsed()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmUsed()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, internal_version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_internal_version = internal_version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           cache=self._db_cache,
+                           name=self._db_name,
+                           namespace=self._db_namespace,
+                           package=self._db_package,
+                           version=self._db_version,
+                           internal_version=self._db_internal_version,
+                           tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'internal_version' in class_dict:
+            res = class_dict['internal_version'](old_obj, trans_dict)
+            new_obj.db_internal_version = res
+        elif hasattr(old_obj, 'db_internal_version') and old_obj.db_internal_version is not None:
+            new_obj.db_internal_version = old_obj.db_internal_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_internal_version(self):
+        return self._db_internal_version
+    def __set_db_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+        self.is_dirty = True
+    db_internal_version = property(__get_db_internal_version, __set_db_internal_version)
+    def db_add_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_change_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_delete_internal_version(self, internal_version):
+        self._db_internal_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstraction':
+                    new_obj.db_add_module(DBAbstraction.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifactIdCause(object):
+
+    vtType = 'opm_artifact_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmArtifactValue(object):
+
+    vtType = 'opm_artifact_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'portSpec':
+                new_obj.db_add_value(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_value(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBOpmArtifactIdEffect(object):
+
+    vtType = 'opm_artifact_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmGraph(object):
+
+    vtType = 'opm_graph'
+
+    def __init__(self, accounts=None, processes=None, artifacts=None, agents=None, dependencies=None):
+        self.db_deleted_accounts = []
+        self._db_accounts = accounts
+        self.db_deleted_processes = []
+        self._db_processes = processes
+        self.db_deleted_artifacts = []
+        self._db_artifacts = artifacts
+        self.db_deleted_agents = []
+        self._db_agents = agents
+        self.db_deleted_dependencies = []
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmGraph.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmGraph()
+        if self._db_accounts is not None:
+            cp._db_accounts = self._db_accounts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_processes is not None:
+            cp._db_processes = self._db_processes.do_copy(new_ids, id_scope, id_remap)
+        if self._db_artifacts is not None:
+            cp._db_artifacts = self._db_artifacts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_agents is not None:
+            cp._db_agents = self._db_agents.do_copy(new_ids, id_scope, id_remap)
+        if self._db_dependencies is not None:
+            cp._db_dependencies = self._db_dependencies.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmGraph()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            new_obj.db_accounts = res
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            obj = old_obj.db_accounts
+            new_obj.db_add_accounts(DBOpmAccounts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccounts.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'processes' in class_dict:
+            res = class_dict['processes'](old_obj, trans_dict)
+            new_obj.db_processes = res
+        elif hasattr(old_obj, 'db_processes') and old_obj.db_processes is not None:
+            obj = old_obj.db_processes
+            new_obj.db_add_processes(DBOpmProcesses.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processes') and hasattr(new_obj, 'db_deleted_processes'):
+            for obj in old_obj.db_deleted_processes:
+                n_obj = DBOpmProcesses.update_version(obj, trans_dict)
+                new_obj.db_deleted_processes.append(n_obj)
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            new_obj.db_artifacts = res
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            obj = old_obj.db_artifacts
+            new_obj.db_add_artifacts(DBOpmArtifacts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifacts.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            new_obj.db_agents = res
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            obj = old_obj.db_agents
+            new_obj.db_add_agents(DBOpmAgents.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgents.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        if 'dependencies' in class_dict:
+            res = class_dict['dependencies'](old_obj, trans_dict)
+            new_obj.db_dependencies = res
+        elif hasattr(old_obj, 'db_dependencies') and old_obj.db_dependencies is not None:
+            obj = old_obj.db_dependencies
+            new_obj.db_add_dependencies(DBOpmDependencies.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencies') and hasattr(new_obj, 'db_deleted_dependencies'):
+            for obj in old_obj.db_deleted_dependencies:
+                n_obj = DBOpmDependencies.update_version(obj, trans_dict)
+                new_obj.db_deleted_dependencies.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_accounts is not None:
+            children.extend(self._db_accounts.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_accounts = None
+        if self._db_processes is not None:
+            children.extend(self._db_processes.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_processes = None
+        if self._db_artifacts is not None:
+            children.extend(self._db_artifacts.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_artifacts = None
+        if self._db_agents is not None:
+            children.extend(self._db_agents.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_agents = None
+        if self._db_dependencies is not None:
+            children.extend(self._db_dependencies.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_dependencies = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_processes)
+        children.extend(self.db_deleted_artifacts)
+        children.extend(self.db_deleted_agents)
+        children.extend(self.db_deleted_dependencies)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_processes = []
+            self.db_deleted_artifacts = []
+            self.db_deleted_agents = []
+            self.db_deleted_dependencies = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_accounts is not None and self._db_accounts.has_changes():
+            return True
+        if self._db_processes is not None and self._db_processes.has_changes():
+            return True
+        if self._db_artifacts is not None and self._db_artifacts.has_changes():
+            return True
+        if self._db_agents is not None and self._db_agents.has_changes():
+            return True
+        if self._db_dependencies is not None and self._db_dependencies.has_changes():
+            return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_add_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_change_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_delete_accounts(self, accounts):
+        if not self.is_new:
+            self.db_deleted_accounts.append(self._db_accounts)
+        self._db_accounts = None
+    
+    def __get_db_processes(self):
+        return self._db_processes
+    def __set_db_processes(self, processes):
+        self._db_processes = processes
+        self.is_dirty = True
+    db_processes = property(__get_db_processes, __set_db_processes)
+    def db_add_processes(self, processes):
+        self._db_processes = processes
+    def db_change_processes(self, processes):
+        self._db_processes = processes
+    def db_delete_processes(self, processes):
+        if not self.is_new:
+            self.db_deleted_processes.append(self._db_processes)
+        self._db_processes = None
+    
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_add_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_change_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_delete_artifacts(self, artifacts):
+        if not self.is_new:
+            self.db_deleted_artifacts.append(self._db_artifacts)
+        self._db_artifacts = None
+    
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_add_agents(self, agents):
+        self._db_agents = agents
+    def db_change_agents(self, agents):
+        self._db_agents = agents
+    def db_delete_agents(self, agents):
+        if not self.is_new:
+            self.db_deleted_agents.append(self._db_agents)
+        self._db_agents = None
+    
+    def __get_db_dependencies(self):
+        return self._db_dependencies
+    def __set_db_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+    db_dependencies = property(__get_db_dependencies, __set_db_dependencies)
+    def db_add_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_change_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_delete_dependencies(self, dependencies):
+        if not self.is_new:
+            self.db_deleted_dependencies.append(self._db_dependencies)
+        self._db_dependencies = None
+    
+
+
+class DBRegistry(object):
+
+    vtType = 'registry'
+
+    def __init__(self, id=None, entity_type=None, version=None, root_descriptor_id=None, name=None, last_modified=None, packages=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_root_descriptor_id = root_descriptor_id
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_packages = []
+        self.db_packages_id_index = {}
+        self.db_packages_identifier_index = {}
+        if packages is None:
+            self._db_packages = []
+        else:
+            self._db_packages = packages
+            for v in self._db_packages:
+                self.db_packages_id_index[v.db_id] = v
+                self.db_packages_identifier_index[(v.db_identifier,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRegistry.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRegistry(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        root_descriptor_id=self._db_root_descriptor_id,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_packages is None:
+            cp._db_packages = []
+        else:
+            cp._db_packages = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_packages]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_root_descriptor_id') and ('module_descriptor', self._db_root_descriptor_id) in id_remap:
+                cp._db_root_descriptor_id = id_remap[('module_descriptor', self._db_root_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_packages_id_index = dict((v.db_id, v) for v in cp._db_packages)
+        cp.db_packages_identifier_index = dict(((v.db_identifier,v.db_version), v) for v in cp._db_packages)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'root_descriptor_id' in class_dict:
+            res = class_dict['root_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_root_descriptor_id = res
+        elif hasattr(old_obj, 'db_root_descriptor_id') and old_obj.db_root_descriptor_id is not None:
+            new_obj.db_root_descriptor_id = old_obj.db_root_descriptor_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'packages' in class_dict:
+            res = class_dict['packages'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_package(obj)
+        elif hasattr(old_obj, 'db_packages') and old_obj.db_packages is not None:
+            for obj in old_obj.db_packages:
+                new_obj.db_add_package(DBPackage.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_packages') and hasattr(new_obj, 'db_deleted_packages'):
+            for obj in old_obj.db_deleted_packages:
+                n_obj = DBPackage.update_version(obj, trans_dict)
+                new_obj.db_deleted_packages.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_packages:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_package(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_packages)
+        if remove:
+            self.db_deleted_packages = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_packages:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_root_descriptor_id(self):
+        return self._db_root_descriptor_id
+    def __set_db_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+        self.is_dirty = True
+    db_root_descriptor_id = property(__get_db_root_descriptor_id, __set_db_root_descriptor_id)
+    def db_add_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_change_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_delete_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_packages(self):
+        return self._db_packages
+    def __set_db_packages(self, packages):
+        self._db_packages = packages
+        self.is_dirty = True
+    db_packages = property(__get_db_packages, __set_db_packages)
+    def db_get_packages(self):
+        return self._db_packages
+    def db_add_package(self, package):
+        self.is_dirty = True
+        self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_change_package(self, package):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                self._db_packages[i] = package
+                found = True
+                break
+        if not found:
+            self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_delete_package(self, package):
+        self.is_dirty = True
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                if not self._db_packages[i].is_new:
+                    self.db_deleted_packages.append(self._db_packages[i])
+                del self._db_packages[i]
+                break
+        del self.db_packages_id_index[package.db_id]
+        del self.db_packages_identifier_index[(package.db_identifier,package.db_version)]
+    def db_get_package(self, key):
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == key:
+                return self._db_packages[i]
+        return None
+    def db_get_package_by_id(self, key):
+        return self.db_packages_id_index[key]
+    def db_has_package_with_id(self, key):
+        return key in self.db_packages_id_index
+    def db_get_package_by_identifier(self, key):
+        return self.db_packages_identifier_index[key]
+    def db_has_package_with_identifier(self, key):
+        return key in self.db_packages_identifier_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAccount(object):
+
+    vtType = 'opm_account'
+
+    def __init__(self, id=None, value=None):
+        self._db_id = id
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccount.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccount(id=self._db_id,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccount()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasDerivedFrom(object):
+
+    vtType = 'opm_was_derived_from'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasDerivedFrom.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasDerivedFrom()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasDerivedFrom()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmWasControlledBy(object):
+
+    vtType = 'opm_was_controlled_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, starts=None, ends=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_starts = []
+        if starts is None:
+            self._db_starts = []
+        else:
+            self._db_starts = starts
+        self.db_deleted_ends = []
+        if ends is None:
+            self._db_ends = []
+        else:
+            self._db_ends = ends
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasControlledBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasControlledBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_starts is None:
+            cp._db_starts = []
+        else:
+            cp._db_starts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_starts]
+        if self._db_ends is None:
+            cp._db_ends = []
+        else:
+            cp._db_ends = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ends]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasControlledBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmAgentId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmAgentId.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'starts' in class_dict:
+            res = class_dict['starts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_start(obj)
+        elif hasattr(old_obj, 'db_starts') and old_obj.db_starts is not None:
+            for obj in old_obj.db_starts:
+                new_obj.db_add_start(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_starts') and hasattr(new_obj, 'db_deleted_starts'):
+            for obj in old_obj.db_deleted_starts:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_starts.append(n_obj)
+        if 'ends' in class_dict:
+            res = class_dict['ends'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_end(obj)
+        elif hasattr(old_obj, 'db_ends') and old_obj.db_ends is not None:
+            for obj in old_obj.db_ends:
+                new_obj.db_add_end(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ends') and hasattr(new_obj, 'db_deleted_ends'):
+            for obj in old_obj.db_deleted_ends:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_ends.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_starts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_start(child)
+        to_del = []
+        for child in self.db_ends:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_end(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_starts)
+        children.extend(self.db_deleted_ends)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_starts = []
+            self.db_deleted_ends = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_starts:
+            if child.has_changes():
+                return True
+        for child in self._db_ends:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_starts(self):
+        return self._db_starts
+    def __set_db_starts(self, starts):
+        self._db_starts = starts
+        self.is_dirty = True
+    db_starts = property(__get_db_starts, __set_db_starts)
+    def db_get_starts(self):
+        return self._db_starts
+    def db_add_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_change_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_delete_start(self, start):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_start(self, key):
+        return None
+    
+    def __get_db_ends(self):
+        return self._db_ends
+    def __set_db_ends(self, ends):
+        self._db_ends = ends
+        self.is_dirty = True
+    db_ends = property(__get_db_ends, __set_db_ends)
+    def db_get_ends(self):
+        return self._db_ends
+    def db_add_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_change_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_delete_end(self, end):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_end(self, key):
+        return None
+    
+
+
+class DBOpmAgentId(object):
+
+    vtType = 'opm_agent_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgentId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgentId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_agent', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_agent', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgentId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBGroupExec(object):
+
+    vtType = 'group_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, group_name=None, group_type=None, completed=None, error=None, machine_id=None, annotations=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_group_name = group_name
+        self._db_group_type = group_type
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroupExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroupExec(id=self._db_id,
+                         ts_start=self._db_ts_start,
+                         ts_end=self._db_ts_end,
+                         cached=self._db_cached,
+                         module_id=self._db_module_id,
+                         group_name=self._db_group_name,
+                         group_type=self._db_group_type,
+                         completed=self._db_completed,
+                         error=self._db_error,
+                         machine_id=self._db_machine_id)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroupExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'group_name' in class_dict:
+            res = class_dict['group_name'](old_obj, trans_dict)
+            new_obj.db_group_name = res
+        elif hasattr(old_obj, 'db_group_name') and old_obj.db_group_name is not None:
+            new_obj.db_group_name = old_obj.db_group_name
+        if 'group_type' in class_dict:
+            res = class_dict['group_type'](old_obj, trans_dict)
+            new_obj.db_group_type = res
+        elif hasattr(old_obj, 'db_group_type') and old_obj.db_group_type is not None:
+            new_obj.db_group_type = old_obj.db_group_type
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_group_name(self):
+        return self._db_group_name
+    def __set_db_group_name(self, group_name):
+        self._db_group_name = group_name
+        self.is_dirty = True
+    db_group_name = property(__get_db_group_name, __set_db_group_name)
+    def db_add_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_change_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_delete_group_name(self, group_name):
+        self._db_group_name = None
+    
+    def __get_db_group_type(self):
+        return self._db_group_type
+    def __set_db_group_type(self, group_type):
+        self._db_group_type = group_type
+        self.is_dirty = True
+    db_group_type = property(__get_db_group_type, __set_db_group_type)
+    def db_add_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_change_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_delete_group_type(self, group_type):
+        self._db_group_type = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmTime(object):
+
+    vtType = 'opm_time'
+
+    def __init__(self, no_later_than=None, no_earlier_than=None, clock_id=None):
+        self._db_no_later_than = no_later_than
+        self._db_no_earlier_than = no_earlier_than
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmTime.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmTime(no_later_than=self._db_no_later_than,
+                       no_earlier_than=self._db_no_earlier_than,
+                       clock_id=self._db_clock_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmTime()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'no_later_than' in class_dict:
+            res = class_dict['no_later_than'](old_obj, trans_dict)
+            new_obj.db_no_later_than = res
+        elif hasattr(old_obj, 'db_no_later_than') and old_obj.db_no_later_than is not None:
+            new_obj.db_no_later_than = old_obj.db_no_later_than
+        if 'no_earlier_than' in class_dict:
+            res = class_dict['no_earlier_than'](old_obj, trans_dict)
+            new_obj.db_no_earlier_than = res
+        elif hasattr(old_obj, 'db_no_earlier_than') and old_obj.db_no_earlier_than is not None:
+            new_obj.db_no_earlier_than = old_obj.db_no_earlier_than
+        if 'clock_id' in class_dict:
+            res = class_dict['clock_id'](old_obj, trans_dict)
+            new_obj.db_clock_id = res
+        elif hasattr(old_obj, 'db_clock_id') and old_obj.db_clock_id is not None:
+            new_obj.db_clock_id = old_obj.db_clock_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_no_later_than(self):
+        return self._db_no_later_than
+    def __set_db_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+        self.is_dirty = True
+    db_no_later_than = property(__get_db_no_later_than, __set_db_no_later_than)
+    def db_add_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_change_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_delete_no_later_than(self, no_later_than):
+        self._db_no_later_than = None
+    
+    def __get_db_no_earlier_than(self):
+        return self._db_no_earlier_than
+    def __set_db_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+        self.is_dirty = True
+    db_no_earlier_than = property(__get_db_no_earlier_than, __set_db_no_earlier_than)
+    def db_add_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_change_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_delete_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = None
+    
+    def __get_db_clock_id(self):
+        return self._db_clock_id
+    def __set_db_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+    db_clock_id = property(__get_db_clock_id, __set_db_clock_id)
+    def db_add_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_change_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_delete_clock_id(self, clock_id):
+        self._db_clock_id = None
+    
+
+
+class DBPackage(object):
+
+    vtType = 'package'
+
+    def __init__(self, id=None, name=None, identifier=None, codepath=None, load_configuration=None, version=None, description=None, module_descriptors=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_identifier = identifier
+        self._db_codepath = codepath
+        self._db_load_configuration = load_configuration
+        self._db_version = version
+        self._db_description = description
+        self.db_deleted_module_descriptors = []
+        self.db_module_descriptors_id_index = {}
+        self.db_module_descriptors_name_index = {}
+        if module_descriptors is None:
+            self._db_module_descriptors = []
+        else:
+            self._db_module_descriptors = module_descriptors
+            for v in self._db_module_descriptors:
+                self.db_module_descriptors_id_index[v.db_id] = v
+                self.db_module_descriptors_name_index[(v.db_name,v.db_namespace,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPackage.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPackage(id=self._db_id,
+                       name=self._db_name,
+                       identifier=self._db_identifier,
+                       codepath=self._db_codepath,
+                       load_configuration=self._db_load_configuration,
+                       version=self._db_version,
+                       description=self._db_description)
+        if self._db_module_descriptors is None:
+            cp._db_module_descriptors = []
+        else:
+            cp._db_module_descriptors = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_descriptors]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_descriptors_id_index = dict((v.db_id, v) for v in cp._db_module_descriptors)
+        cp.db_module_descriptors_name_index = dict(((v.db_name,v.db_namespace,v.db_version), v) for v in cp._db_module_descriptors)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPackage()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'identifier' in class_dict:
+            res = class_dict['identifier'](old_obj, trans_dict)
+            new_obj.db_identifier = res
+        elif hasattr(old_obj, 'db_identifier') and old_obj.db_identifier is not None:
+            new_obj.db_identifier = old_obj.db_identifier
+        if 'codepath' in class_dict:
+            res = class_dict['codepath'](old_obj, trans_dict)
+            new_obj.db_codepath = res
+        elif hasattr(old_obj, 'db_codepath') and old_obj.db_codepath is not None:
+            new_obj.db_codepath = old_obj.db_codepath
+        if 'load_configuration' in class_dict:
+            res = class_dict['load_configuration'](old_obj, trans_dict)
+            new_obj.db_load_configuration = res
+        elif hasattr(old_obj, 'db_load_configuration') and old_obj.db_load_configuration is not None:
+            new_obj.db_load_configuration = old_obj.db_load_configuration
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'description' in class_dict:
+            res = class_dict['description'](old_obj, trans_dict)
+            new_obj.db_description = res
+        elif hasattr(old_obj, 'db_description') and old_obj.db_description is not None:
+            new_obj.db_description = old_obj.db_description
+        if 'module_descriptors' in class_dict:
+            res = class_dict['module_descriptors'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_descriptor(obj)
+        elif hasattr(old_obj, 'db_module_descriptors') and old_obj.db_module_descriptors is not None:
+            for obj in old_obj.db_module_descriptors:
+                new_obj.db_add_module_descriptor(DBModuleDescriptor.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_descriptors') and hasattr(new_obj, 'db_deleted_module_descriptors'):
+            for obj in old_obj.db_deleted_module_descriptors:
+                n_obj = DBModuleDescriptor.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_descriptors.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_descriptors:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_descriptor(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_descriptors)
+        if remove:
+            self.db_deleted_module_descriptors = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_descriptors:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_identifier(self):
+        return self._db_identifier
+    def __set_db_identifier(self, identifier):
+        self._db_identifier = identifier
+        self.is_dirty = True
+    db_identifier = property(__get_db_identifier, __set_db_identifier)
+    def db_add_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_change_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_delete_identifier(self, identifier):
+        self._db_identifier = None
+    
+    def __get_db_codepath(self):
+        return self._db_codepath
+    def __set_db_codepath(self, codepath):
+        self._db_codepath = codepath
+        self.is_dirty = True
+    db_codepath = property(__get_db_codepath, __set_db_codepath)
+    def db_add_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_change_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_delete_codepath(self, codepath):
+        self._db_codepath = None
+    
+    def __get_db_load_configuration(self):
+        return self._db_load_configuration
+    def __set_db_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+        self.is_dirty = True
+    db_load_configuration = property(__get_db_load_configuration, __set_db_load_configuration)
+    def db_add_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_change_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_delete_load_configuration(self, load_configuration):
+        self._db_load_configuration = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_description(self):
+        return self._db_description
+    def __set_db_description(self, description):
+        self._db_description = description
+        self.is_dirty = True
+    db_description = property(__get_db_description, __set_db_description)
+    def db_add_description(self, description):
+        self._db_description = description
+    def db_change_description(self, description):
+        self._db_description = description
+    def db_delete_description(self, description):
+        self._db_description = None
+    
+    def __get_db_module_descriptors(self):
+        return self._db_module_descriptors
+    def __set_db_module_descriptors(self, module_descriptors):
+        self._db_module_descriptors = module_descriptors
+        self.is_dirty = True
+    db_module_descriptors = property(__get_db_module_descriptors, __set_db_module_descriptors)
+    def db_get_module_descriptors(self):
+        return self._db_module_descriptors
+    def db_add_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_change_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                self._db_module_descriptors[i] = module_descriptor
+                found = True
+                break
+        if not found:
+            self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_delete_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                if not self._db_module_descriptors[i].is_new:
+                    self.db_deleted_module_descriptors.append(self._db_module_descriptors[i])
+                del self._db_module_descriptors[i]
+                break
+        del self.db_module_descriptors_id_index[module_descriptor.db_id]
+        del self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)]
+    def db_get_module_descriptor(self, key):
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == key:
+                return self._db_module_descriptors[i]
+        return None
+    def db_get_module_descriptor_by_id(self, key):
+        return self.db_module_descriptors_id_index[key]
+    def db_has_module_descriptor_with_id(self, key):
+        return key in self.db_module_descriptors_id_index
+    def db_get_module_descriptor_by_name(self, key):
+        return self.db_module_descriptors_name_index[key]
+    def db_has_module_descriptor_with_name(self, key):
+        return key in self.db_module_descriptors_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, item_execs=None, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLoopExec(object):
+
+    vtType = 'loop_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, iteration=None, completed=None, error=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_iteration = iteration
+        self._db_completed = completed
+        self._db_error = error
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLoopExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLoopExec(id=self._db_id,
+                        ts_start=self._db_ts_start,
+                        ts_end=self._db_ts_end,
+                        iteration=self._db_iteration,
+                        completed=self._db_completed,
+                        error=self._db_error)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLoopExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'iteration' in class_dict:
+            res = class_dict['iteration'](old_obj, trans_dict)
+            new_obj.db_iteration = res
+        elif hasattr(old_obj, 'db_iteration') and old_obj.db_iteration is not None:
+            new_obj.db_iteration = old_obj.db_iteration
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_iteration(self):
+        return self._db_iteration
+    def __set_db_iteration(self, iteration):
+        self._db_iteration = iteration
+        self.is_dirty = True
+    db_iteration = property(__get_db_iteration, __set_db_iteration)
+    def db_add_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_change_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_delete_iteration(self, iteration):
+        self._db_iteration = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcess(object):
+
+    vtType = 'opm_process'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcess.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcess(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcess()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmProcessValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmProcessValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasTriggeredBy(object):
+
+    vtType = 'opm_was_triggered_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasTriggeredBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasTriggeredBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasTriggeredBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmProcessValue(object):
+
+    vtType = 'opm_process_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'module_exec':
+                new_obj.db_add_value(DBModuleExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'group_exec':
+                new_obj.db_add_value(DBGroupExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'loop_exec':
+                new_obj.db_add_value(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self._db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user,
+                      prune=self._db_prune)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'prune' in class_dict:
+            res = class_dict['prune'](old_obj, trans_dict)
+            new_obj.db_prune = res
+        elif hasattr(old_obj, 'db_prune') and old_obj.db_prune is not None:
+            new_obj.db_prune = old_obj.db_prune
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_prune(self):
+        return self._db_prune
+    def __set_db_prune(self, prune):
+        self._db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self._db_prune = prune
+    def db_change_prune(self, prune):
+        self._db_prune = prune
+    def db_delete_prune(self, prune):
+        self._db_prune = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgent(object):
+
+    vtType = 'opm_agent'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgent(id=self._db_id,
+                        value=self._db_value)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, machine_id=None, annotations=None, loop_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_loop_execs = []
+        self.db_loop_execs_id_index = {}
+        if loop_execs is None:
+            self._db_loop_execs = []
+        else:
+            self._db_loop_execs = loop_execs
+            for v in self._db_loop_execs:
+                self.db_loop_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_loop_execs is None:
+            cp._db_loop_execs = []
+        else:
+            cp._db_loop_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_loop_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_loop_execs_id_index = dict((v.db_id, v) for v in cp._db_loop_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'loop_execs' in class_dict:
+            res = class_dict['loop_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_loop_exec(obj)
+        elif hasattr(old_obj, 'db_loop_execs') and old_obj.db_loop_execs is not None:
+            for obj in old_obj.db_loop_execs:
+                new_obj.db_add_loop_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_loop_execs') and hasattr(new_obj, 'db_deleted_loop_execs'):
+            for obj in old_obj.db_deleted_loop_execs:
+                n_obj = DBLoopExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_loop_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_loop_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_loop_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_loop_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_loop_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_loop_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_loop_execs(self):
+        return self._db_loop_execs
+    def __set_db_loop_execs(self, loop_execs):
+        self._db_loop_execs = loop_execs
+        self.is_dirty = True
+    db_loop_execs = property(__get_db_loop_execs, __set_db_loop_execs)
+    def db_get_loop_execs(self):
+        return self._db_loop_execs
+    def db_add_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_change_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                self._db_loop_execs[i] = loop_exec
+                found = True
+                break
+        if not found:
+            self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_delete_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                if not self._db_loop_execs[i].is_new:
+                    self.db_deleted_loop_execs.append(self._db_loop_execs[i])
+                del self._db_loop_execs[i]
+                break
+        del self.db_loop_execs_id_index[loop_exec.db_id]
+    def db_get_loop_exec(self, key):
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == key:
+                return self._db_loop_execs[i]
+        return None
+    def db_get_loop_exec_by_id(self, key):
+        return self.db_loop_execs_id_index[key]
+    def db_has_loop_exec_with_id(self, key):
+        return key in self.db_loop_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v1_0_0/domain/id_scope.py b/vistrails/db/versions/v1_0_0/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v1_0_0/domain/log.py b/vistrails/db/versions/v1_0_0/domain/log.py
new file mode 100644
index 0000000..eedf100
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/log.py
@@ -0,0 +1,72 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstraction, DBModule, DBGroup, DBLoopExec, \
+    DBGroupExec, DBModuleExec
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                                {DBLoopExec.vtType: 'item_exec',
+                                 DBModuleExec.vtType: 'item_exec',
+                                 DBGroupExec.vtType: 'item_exec',
+                                 DBAbstraction.vtType: DBModule.vtType,
+                                 DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        return cps
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v1_0_0/domain/registry.py b/vistrails/db/versions/v1_0_0/domain/registry.py
new file mode 100644
index 0000000..323ebbd
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/registry.py
@@ -0,0 +1,63 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBRegistry as _DBRegistry, DBPackage, DBModuleDescriptor, \
+    DBPortSpec
+from id_scope import IdScope
+
+class DBRegistry(_DBRegistry):
+    def __init__(self, *args, **kwargs):
+        _DBRegistry.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        new_obj = _DBRegistry.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+    
+    def update_id_scope(self):
+        for package in self.db_packages:
+            self.idScope.updateBeginId(DBPackage.vtType, package.db_id+1)
+            for descriptor in package.db_module_descriptors:
+                self.idScope.updateBeginId(DBModuleDescriptor.vtType,
+                                           descriptor.db_id+1)
+                for port_spec in descriptor.db_portSpecs:
+                    self.idScope.updateBeginId(DBPortSpec.vtType, 
+                                               port_spec.db_id+1)
+
+
diff --git a/vistrails/db/versions/v1_0_0/domain/vistrail.py b/vistrails/db/versions/v1_0_0/domain/vistrail.py
new file mode 100644
index 0000000..8c4177e
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/vistrail.py
@@ -0,0 +1,127 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstraction, DBGroup, \
+    DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstraction.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.db_log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.db_log_filename = self.db_log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'db_log_filename'):
+            new_obj.db_log_filename = old_obj.db_log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                                   getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
diff --git a/vistrails/db/versions/v1_0_0/domain/workflow.py b/vistrails/db/versions/v1_0_0/domain/workflow.py
new file mode 100644
index 0000000..af484e6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/domain/workflow.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {DBAbstraction.vtType: DBModule.vtType, 
+                  DBGroup.vtType: DBModule.vtType}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == DBAbstraction.vtType or \
+                object.vtType == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == DBAbstraction.vtType or obj_type == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v1_0_0/persistence/__init__.py b/vistrails/db/versions/v1_0_0/persistence/__init__.py
new file mode 100644
index 0000000..1144a31
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/__init__.py
@@ -0,0 +1,248 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v1_0_0 import version as my_version
+from vistrails.db.versions.v1_0_0.domain import DBGroup, DBWorkflow, DBVistrail, DBLog, \
+    DBRegistry
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        def indent(elem, level=0):
+            i = "\n" + level*"  "
+            if len(elem):
+                if not elem.text or not elem.text.strip():
+                    elem.text = i + "  "
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+                for elem in elem:
+                    indent(elem, level+1)
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        indent(tree.getroot())
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id=None, lock=False, 
+                     global_props=None):
+        all_objects = {}
+        if global_props is None:
+            global_props = {}
+        if id is not None:
+            global_props['id'] = id
+        # print global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        global_props = {'entity_id': res.db_id,
+                        'entity_type': res.vtType}
+
+        for dao_type, dao in self['sql'].iteritems():
+            if (dao_type == DBVistrail.vtType or
+                dao_type == DBWorkflow.vtType or
+                dao_type == DBLog.vtType or
+                dao_type == DBRegistry.vtType):
+                continue
+                
+            current_objs = dao.get_sql_columns(db_connection, global_props, 
+                                               lock)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+
+        return res
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children()
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        child = children[0][0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                  global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        # do deletes
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                            c,
+                                                            global_props)
+
+        child = children.pop(0)[0]
+        child.is_dirty = False
+        child.is_new = False
+
+        # process remaining children
+        for (child, _, _) in children:
+            self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                      global_props, do_copy)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    new_props = {'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    is_dirty = child.db_workflow.is_dirty
+                    child.db_workflow.db_entity_type = DBWorkflow.vtType
+                    child.db_workflow.is_dirty = is_dirty
+                    self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                    new_props)
+                                            
+            child.is_dirty = False
+            child.is_new = False
+
+    def delete_from_db(self, db_connection, type, obj_id):
+        root_set = set([DBVistrail.vtType, DBWorkflow.vtType, 
+                        DBLog.vtType, DBRegistry.vtType])
+        if type not in root_set:
+            raise VistrailsDBException("Cannot delete entity of type '%s'" \
+                                           % type)
+
+        id_str = str(obj_id)
+        for (dao_type, dao) in self['sql'].iteritems():
+            if dao_type not in root_set:
+                db_cmd = \
+                    self['sql'][type].createSQLDelete(dao.table,
+                                                      {'entity_type': type,
+                                                       'entity_id': id_str})
+                self['sql'][type].executeSQL(db_connection, db_cmd, False)
+        db_cmd = self['sql'][type].createSQLDelete(self['sql'][type].table,
+                                                   {'id': id_str})
+        self['sql'][type].executeSQL(db_connection, db_cmd, False)
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v1_0_0/persistence/sql/__init__.py b/vistrails/db/versions/v1_0_0/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_0/persistence/sql/auto_gen.py b/vistrails/db/versions/v1_0_0/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..34e919c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/sql/auto_gen.py
@@ -0,0 +1,3332 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v1_0_0.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            sigstring = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  sigstring=sigstring,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'module_descriptor':
+            p = all_objects[('module_descriptor', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_sigstring') and obj.db_sigstring is not None:
+            columnMap['sigstring'] = \
+                self.convertToDB(obj.db_sigstring, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleDescriptorSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_descriptor'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[5], 'long', 'int')
+            package = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('package', obj.db_package) in all_objects:
+            p = all_objects[('package', obj.db_package)]
+            p.db_add_module_descriptor(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'package', 'namespace', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            tag=tag,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_group = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        tag=tag,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_group) in all_objects:
+            p = all_objects[('group', obj.db_group)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBRegistrySQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'registry'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_packages:
+            child.db_registry = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPackageSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'package'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('registry', obj.db_registry) in all_objects:
+            p = all_objects[('registry', obj.db_registry)]
+            p.db_add_package(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_descriptors:
+            child.db_package = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLoopExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'loop_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            iteration = self.convertFromDB(row[3], 'int', 'int')
+            completed = self.convertFromDB(row[4], 'int', 'int')
+            error = self.convertFromDB(row[5], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   iteration=iteration,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_loop_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_iteration') and obj.db_iteration is not None:
+            columnMap['iteration'] = \
+                self.convertToDB(obj.db_iteration, 'int', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_tags:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[8], 'long', 'int')
+            parentType = self.convertFromDB(row[9], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            parent = self.convertFromDB(row[12], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_loop_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistrySQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecSQLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_0/persistence/sql/sql_dao.py b/vistrails/db/versions/v1_0_0/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..ad01dc5
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/sql/sql_dao.py
@@ -0,0 +1,183 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                # return "'" + str(value).replace("'", "''") + "'"
+                return str(value)
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v1_0_0/persistence/xml/__init__.py b/vistrails/db/versions/v1_0_0/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_0/persistence/xml/auto_gen.py b/vistrails/db/versions/v1_0_0/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..d7fbe3c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/xml/auto_gen.py
@@ -0,0 +1,3833 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v1_0_0.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBOpmProcessIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmWasGeneratedByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasGeneratedBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasGeneratedBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_generated_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasGeneratedBy')
+        
+        # set elements
+        effect = opm_was_generated_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_generated_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_generated_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_generated_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_generated_by.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmAccountsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'accounts':
+            return None
+        
+        accounts = []
+        opm_overlapss = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'overlaps':
+                _data = self.getDao('opm_overlaps').fromXML(child)
+                opm_overlapss.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccounts(accounts=accounts,
+                            opm_overlapss=opm_overlapss)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_accounts, node=None):
+        if node is None:
+            node = ElementTree.Element('accounts')
+        
+        # set elements
+        accounts = opm_accounts.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account').toXML(account, childNode)
+        opm_overlapss = opm_accounts.db_opm_overlapss
+        for opm_overlaps in opm_overlapss:
+            childNode = ElementTree.SubElement(node, 'overlaps')
+            self.getDao('opm_overlaps').toXML(opm_overlaps, childNode)
+        
+        return node
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('optional', None)
+        optional = self.convertFromStr(data, 'int')
+        data = node.get('sortKey', None)
+        sort_key = self.convertFromStr(data, 'int')
+        data = node.get('sigstring', None)
+        sigstring = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         optional=optional,
+                         sort_key=sort_key,
+                         sigstring=sigstring)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('optional',self.convertToStr(portSpec.db_optional, 'int'))
+        node.set('sortKey',self.convertToStr(portSpec.db_sort_key, 'int'))
+        node.set('sigstring',self.convertToStr(portSpec.db_sigstring, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBModuleDescriptorXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleDescriptor':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('baseDescriptorId', None)
+        base_descriptor_id = self.convertFromStr(data, 'long')
+        
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleDescriptor(id=id,
+                                 name=name,
+                                 package=package,
+                                 namespace=namespace,
+                                 version=version,
+                                 base_descriptor_id=base_descriptor_id,
+                                 portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_descriptor, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleDescriptor')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_descriptor.db_id, 'long'))
+        node.set('name',self.convertToStr(module_descriptor.db_name, 'str'))
+        node.set('package',self.convertToStr(module_descriptor.db_package, 'str'))
+        node.set('namespace',self.convertToStr(module_descriptor.db_namespace, 'str'))
+        node.set('version',self.convertToStr(module_descriptor.db_version, 'str'))
+        node.set('baseDescriptorId',self.convertToStr(module_descriptor.db_base_descriptor_id, 'long'))
+        
+        # set elements
+        portSpecs = module_descriptor.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBOpmRoleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'role':
+            return None
+        
+        # read attributes
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmRole(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_role, node=None):
+        if node is None:
+            node = ElementTree.Element('role')
+        
+        # set attributes
+        node.set('value',self.convertToStr(opm_role.db_value, 'str'))
+        
+        return node
+
+class DBOpmProcessesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'processes':
+            return None
+        
+        processs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'process':
+                _data = self.getDao('opm_process').fromXML(child)
+                processs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcesses(processs=processs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_processes, node=None):
+        if node is None:
+            node = ElementTree.Element('processes')
+        
+        # set elements
+        processs = opm_processes.db_processs
+        for process in processs:
+            childNode = ElementTree.SubElement(node, 'process')
+            self.getDao('opm_process').toXML(process, childNode)
+        
+        return node
+
+class DBOpmAccountIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAccountId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account_id, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account_id.db_id, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('signature', None)
+        signature = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     signature=signature)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('signature',self.convertToStr(port.db_signature, 'str'))
+        
+        return node
+
+class DBOpmArtifactXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifact':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_artifact_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifact(id=id,
+                            value=value,
+                            accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact, node=None):
+        if node is None:
+            node = ElementTree.Element('artifact')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact.db_id, 'str'))
+        
+        # set elements
+        value = opm_artifact.db_value
+        if value is not None:
+            childNode = ElementTree.SubElement(node, 'value')
+            self.getDao('opm_artifact_value').toXML(value, childNode)
+        accounts = opm_artifact.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      tag=tag,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        node.set('tag',self.convertToStr(group.db_tag, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child_tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflowExec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBOpmAgentsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agents':
+            return None
+        
+        agents = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'agent':
+                _data = self.getDao('opm_agent').fromXML(child)
+                agents.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgents(agents=agents)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agents, node=None):
+        if node is None:
+            node = ElementTree.Element('agents')
+        
+        # set elements
+        agents = opm_agents.db_agents
+        for agent in agents:
+            childNode = ElementTree.SubElement(node, 'agent')
+            self.getDao('opm_agent').toXML(agent, childNode)
+        
+        return node
+
+class DBOpmProcessIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        value = other.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBOpmOverlapsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'overlaps':
+            return None
+        
+        opm_account_ids = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                opm_account_ids.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmOverlaps(opm_account_ids=opm_account_ids)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_overlaps, node=None):
+        if node is None:
+            node = ElementTree.Element('overlaps')
+        
+        # set elements
+        opm_account_ids = opm_overlaps.db_opm_account_ids
+        for opm_account_id in opm_account_ids:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(opm_account_id, childNode)
+        
+        return node
+
+class DBOpmArtifactsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifacts':
+            return None
+        
+        artifacts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'artifact':
+                _data = self.getDao('opm_artifact').fromXML(child)
+                artifacts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifacts(artifacts=artifacts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifacts, node=None):
+        if node is None:
+            node = ElementTree.Element('artifacts')
+        
+        # set elements
+        artifacts = opm_artifacts.db_artifacts
+        for artifact in artifacts:
+            childNode = ElementTree.SubElement(node, 'artifact')
+            self.getDao('opm_artifact').toXML(artifact, childNode)
+        
+        return node
+
+class DBOpmDependenciesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'causalDependencies':
+            return None
+        
+        dependencys = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'used':
+                _data = self.getDao('opm_used').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasGeneratedBy':
+                _data = self.getDao('opm_was_generated_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasTriggeredBy':
+                _data = self.getDao('opm_was_triggered_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasDerivedFrom':
+                _data = self.getDao('opm_was_derived_from').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasControlledBy':
+                _data = self.getDao('opm_was_controlled_by').fromXML(child)
+                dependencys.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmDependencies(dependencys=dependencys)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_dependencies, node=None):
+        if node is None:
+            node = ElementTree.Element('causalDependencies')
+        
+        # set elements
+        dependencys = opm_dependencies.db_dependencys
+        for dependency in dependencys:
+            if dependency.vtType == 'opm_used':
+                childNode = ElementTree.SubElement(node, 'used')
+                self.getDao('opm_used').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_generated_by':
+                childNode = ElementTree.SubElement(node, 'wasGeneratedBy')
+                self.getDao('opm_was_generated_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_triggered_by':
+                childNode = ElementTree.SubElement(node, 'wasTriggeredBy')
+                self.getDao('opm_was_triggered_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_derived_from':
+                childNode = ElementTree.SubElement(node, 'wasDerivedFrom')
+                self.getDao('opm_was_derived_from').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_controlled_by':
+                childNode = ElementTree.SubElement(node, 'wasControlledBy')
+                self.getDao('opm_was_controlled_by').toXML(dependency, childNode)
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBOpmUsedXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'used':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmUsed(effect=effect,
+                        role=role,
+                        cause=cause,
+                        accounts=accounts,
+                        opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_used, node=None):
+        if node is None:
+            node = ElementTree.Element('used')
+        
+        # set elements
+        effect = opm_used.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_used.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_used.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_used.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_used.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('internalVersion', None)
+        internal_version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            internal_version=internal_version,
+                            tag=tag,
+                            location=location,
+                            functions=functions,
+                            annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('cache',self.convertToStr(abstraction.db_cache, 'int'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        node.set('namespace',self.convertToStr(abstraction.db_namespace, 'str'))
+        node.set('package',self.convertToStr(abstraction.db_package, 'str'))
+        node.set('version',self.convertToStr(abstraction.db_version, 'str'))
+        node.set('internalVersion',self.convertToStr(abstraction.db_internal_version, 'str'))
+        node.set('tag',self.convertToStr(abstraction.db_tag, 'str'))
+        
+        # set elements
+        location = abstraction.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstraction.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstraction.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            childNode = ElementTree.SubElement(node, 'plugin_data')
+            self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBOpmArtifactIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBOpmArtifactValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                value = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifactValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_artifact_value.db_value
+        if value is not None:
+            if value.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(value, childNode)
+            elif value.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(value, childNode)
+        
+        return node
+
+class DBOpmArtifactIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmGraphXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'opmGraph':
+            return None
+        
+        accounts = None
+        processes = None
+        artifacts = None
+        agents = None
+        dependencies = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'accounts':
+                _data = self.getDao('opm_accounts').fromXML(child)
+                accounts = _data
+            elif child_tag == 'processes':
+                _data = self.getDao('opm_processes').fromXML(child)
+                processes = _data
+            elif child_tag == 'artifacts':
+                _data = self.getDao('opm_artifacts').fromXML(child)
+                artifacts = _data
+            elif child_tag == 'agents':
+                _data = self.getDao('opm_agents').fromXML(child)
+                agents = _data
+            elif child_tag == 'causalDependencies':
+                _data = self.getDao('opm_dependencies').fromXML(child)
+                dependencies = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmGraph(accounts=accounts,
+                         processes=processes,
+                         artifacts=artifacts,
+                         agents=agents,
+                         dependencies=dependencies)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_graph, node=None):
+        if node is None:
+            node = ElementTree.Element('opmGraph')
+        
+        # set elements
+        accounts = opm_graph.db_accounts
+        if accounts is not None:
+            childNode = ElementTree.SubElement(node, 'accounts')
+            self.getDao('opm_accounts').toXML(accounts, childNode)
+        processes = opm_graph.db_processes
+        if processes is not None:
+            childNode = ElementTree.SubElement(node, 'processes')
+            self.getDao('opm_processes').toXML(processes, childNode)
+        artifacts = opm_graph.db_artifacts
+        if artifacts is not None:
+            childNode = ElementTree.SubElement(node, 'artifacts')
+            self.getDao('opm_artifacts').toXML(artifacts, childNode)
+        agents = opm_graph.db_agents
+        if agents is not None:
+            childNode = ElementTree.SubElement(node, 'agents')
+            self.getDao('opm_agents').toXML(agents, childNode)
+        dependencies = opm_graph.db_dependencies
+        if dependencies is not None:
+            childNode = ElementTree.SubElement(node, 'causalDependencies')
+            self.getDao('opm_dependencies').toXML(dependencies, childNode)
+        
+        return node
+
+class DBRegistryXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'registry':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('rootDescriptorId', None)
+        root_descriptor_id = self.convertFromStr(data, 'long')
+        
+        packages = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'package':
+                _data = self.getDao('package').fromXML(child)
+                packages.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBRegistry(id=id,
+                         version=version,
+                         root_descriptor_id=root_descriptor_id,
+                         packages=packages)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, registry, node=None):
+        if node is None:
+            node = ElementTree.Element('registry')
+        
+        # set attributes
+        node.set('id',self.convertToStr(registry.db_id, 'long'))
+        node.set('version',self.convertToStr(registry.db_version, 'str'))
+        node.set('rootDescriptorId',self.convertToStr(registry.db_root_descriptor_id, 'long'))
+        
+        # set elements
+        packages = registry.db_packages
+        for package in packages:
+            childNode = ElementTree.SubElement(node, 'package')
+            self.getDao('package').toXML(package, childNode)
+        
+        return node
+
+class DBOpmAccountXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccount(id=id,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account.db_id, 'str'))
+        
+        # set elements
+        value = opm_account.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOpmWasDerivedFromXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasDerivedFrom':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasDerivedFrom(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_derived_from, node=None):
+        if node is None:
+            node = ElementTree.Element('wasDerivedFrom')
+        
+        # set elements
+        effect = opm_was_derived_from.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_derived_from.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_derived_from.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_was_derived_from.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_derived_from.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmWasControlledByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasControlledBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        starts = []
+        ends = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'agent':
+                _data = self.getDao('opm_agent_id').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                starts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                ends.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasControlledBy(effect=effect,
+                                   role=role,
+                                   cause=cause,
+                                   accounts=accounts,
+                                   starts=starts,
+                                   ends=ends)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_controlled_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasControlledBy')
+        
+        # set elements
+        effect = opm_was_controlled_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_controlled_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_controlled_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'agent')
+            self.getDao('opm_agent_id').toXML(cause, childNode)
+        accounts = opm_was_controlled_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        starts = opm_was_controlled_by.db_starts
+        for start in starts:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(start, childNode)
+        ends = opm_was_controlled_by.db_ends
+        for end in ends:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(end, childNode)
+        
+        return node
+
+class DBOpmAgentIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAgentId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent_id, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent_id.db_id, 'str'))
+        
+        return node
+
+class DBGroupExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'groupExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('groupName', None)
+        group_name = self.convertFromStr(data, 'str')
+        data = node.get('groupType', None)
+        group_type = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroupExec(item_execs=item_execs,
+                          id=id,
+                          ts_start=ts_start,
+                          ts_end=ts_end,
+                          cached=cached,
+                          module_id=module_id,
+                          group_name=group_name,
+                          group_type=group_type,
+                          completed=completed,
+                          error=error,
+                          machine_id=machine_id,
+                          annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('groupExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(group_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(group_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(group_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(group_exec.db_module_id, 'long'))
+        node.set('groupName',self.convertToStr(group_exec.db_group_name, 'str'))
+        node.set('groupType',self.convertToStr(group_exec.db_group_type, 'str'))
+        node.set('completed',self.convertToStr(group_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(group_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(group_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = group_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        item_execs = group_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBOpmTimeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'time':
+            return None
+        
+        # read attributes
+        data = node.get('noLaterThan', None)
+        no_later_than = self.convertFromStr(data, 'datetime')
+        data = node.get('noEarlierThan', None)
+        no_earlier_than = self.convertFromStr(data, 'datetime')
+        data = node.get('clockId', None)
+        clock_id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmTime(no_later_than=no_later_than,
+                        no_earlier_than=no_earlier_than,
+                        clock_id=clock_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_time, node=None):
+        if node is None:
+            node = ElementTree.Element('time')
+        
+        # set attributes
+        node.set('noLaterThan',self.convertToStr(opm_time.db_no_later_than, 'datetime'))
+        node.set('noEarlierThan',self.convertToStr(opm_time.db_no_earlier_than, 'datetime'))
+        node.set('clockId',self.convertToStr(opm_time.db_clock_id, 'str'))
+        
+        return node
+
+class DBPackageXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'package':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('identifier', None)
+        identifier = self.convertFromStr(data, 'str')
+        data = node.get('codepath', None)
+        codepath = self.convertFromStr(data, 'str')
+        data = node.get('loadConfiguration', None)
+        load_configuration = self.convertFromStr(data, 'int')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('description', None)
+        description = self.convertFromStr(data, 'str')
+        
+        module_descriptors = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleDescriptor':
+                _data = self.getDao('module_descriptor').fromXML(child)
+                module_descriptors.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPackage(id=id,
+                        name=name,
+                        identifier=identifier,
+                        codepath=codepath,
+                        load_configuration=load_configuration,
+                        version=version,
+                        description=description,
+                        module_descriptors=module_descriptors)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, package, node=None):
+        if node is None:
+            node = ElementTree.Element('package')
+        
+        # set attributes
+        node.set('id',self.convertToStr(package.db_id, 'long'))
+        node.set('name',self.convertToStr(package.db_name, 'str'))
+        node.set('identifier',self.convertToStr(package.db_identifier, 'str'))
+        node.set('codepath',self.convertToStr(package.db_codepath, 'str'))
+        node.set('loadConfiguration',self.convertToStr(package.db_load_configuration, 'int'))
+        node.set('version',self.convertToStr(package.db_version, 'str'))
+        node.set('description',self.convertToStr(package.db_description, 'str'))
+        
+        # set elements
+        module_descriptors = package.db_module_descriptors
+        for module_descriptor in module_descriptors:
+            childNode = ElementTree.SubElement(node, 'moduleDescriptor')
+            self.getDao('module_descriptor').toXML(module_descriptor, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(item_execs=item_execs,
+                             id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        item_execs = workflow_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBLoopExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'loopExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('iteration', None)
+        iteration = self.convertFromStr(data, 'int')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLoopExec(item_execs=item_execs,
+                         id=id,
+                         ts_start=ts_start,
+                         ts_end=ts_end,
+                         iteration=iteration,
+                         completed=completed,
+                         error=error)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, loop_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('loopExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(loop_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(loop_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(loop_exec.db_ts_end, 'datetime'))
+        node.set('iteration',self.convertToStr(loop_exec.db_iteration, 'int'))
+        node.set('completed',self.convertToStr(loop_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(loop_exec.db_error, 'str'))
+        
+        # set elements
+        item_execs = loop_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBOpmProcessXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'process':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_process_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcess(id=id,
+                           value=value,
+                           accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process, node=None):
+        if node is None:
+            node = ElementTree.Element('process')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process.db_id, 'str'))
+        
+        # set elements
+        value = opm_process.db_value
+        if value is not None:
+            childNode = ElementTree.SubElement(node, 'value')
+            self.getDao('opm_process_value').toXML(value, childNode)
+        accounts = opm_process.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBOpmWasTriggeredByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasTriggeredBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasTriggeredBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_triggered_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasTriggeredBy')
+        
+        # set elements
+        effect = opm_was_triggered_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_triggered_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_triggered_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_triggered_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_triggered_by.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmProcessValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcessValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_process_value.db_value
+        if value is not None:
+            if value.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(value, childNode)
+            elif value.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(value, childNode)
+            elif value.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(value, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBOpmAgentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgent(id=id,
+                         value=value,
+                         accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent.db_id, 'str'))
+        
+        # set elements
+        value = opm_agent.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        accounts = opm_agent.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child_tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        loop_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                loop_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           machine_id=machine_id,
+                           annotations=annotations,
+                           loop_execs=loop_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        loop_execs = module_exec.db_loop_execs
+        for loop_exec in loop_execs:
+            childNode = ElementTree.SubElement(node, 'loopExec')
+            self.getDao('loop_exec').toXML(loop_exec, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'opm_process_id_effect' not in self:
+            self['opm_process_id_effect'] = DBOpmProcessIdEffectXMLDAOBase(self)
+        if 'opm_was_generated_by' not in self:
+            self['opm_was_generated_by'] = DBOpmWasGeneratedByXMLDAOBase(self)
+        if 'opm_accounts' not in self:
+            self['opm_accounts'] = DBOpmAccountsXMLDAOBase(self)
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'opm_role' not in self:
+            self['opm_role'] = DBOpmRoleXMLDAOBase(self)
+        if 'opm_processes' not in self:
+            self['opm_processes'] = DBOpmProcessesXMLDAOBase(self)
+        if 'opm_account_id' not in self:
+            self['opm_account_id'] = DBOpmAccountIdXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'opm_artifact' not in self:
+            self['opm_artifact'] = DBOpmArtifactXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'opm_agents' not in self:
+            self['opm_agents'] = DBOpmAgentsXMLDAOBase(self)
+        if 'opm_process_id_cause' not in self:
+            self['opm_process_id_cause'] = DBOpmProcessIdCauseXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'opm_overlaps' not in self:
+            self['opm_overlaps'] = DBOpmOverlapsXMLDAOBase(self)
+        if 'opm_artifacts' not in self:
+            self['opm_artifacts'] = DBOpmArtifactsXMLDAOBase(self)
+        if 'opm_dependencies' not in self:
+            self['opm_dependencies'] = DBOpmDependenciesXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'opm_used' not in self:
+            self['opm_used'] = DBOpmUsedXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'opm_artifact_id_cause' not in self:
+            self['opm_artifact_id_cause'] = DBOpmArtifactIdCauseXMLDAOBase(self)
+        if 'opm_artifact_value' not in self:
+            self['opm_artifact_value'] = DBOpmArtifactValueXMLDAOBase(self)
+        if 'opm_artifact_id_effect' not in self:
+            self['opm_artifact_id_effect'] = DBOpmArtifactIdEffectXMLDAOBase(self)
+        if 'opm_graph' not in self:
+            self['opm_graph'] = DBOpmGraphXMLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistryXMLDAOBase(self)
+        if 'opm_account' not in self:
+            self['opm_account'] = DBOpmAccountXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'opm_was_derived_from' not in self:
+            self['opm_was_derived_from'] = DBOpmWasDerivedFromXMLDAOBase(self)
+        if 'opm_was_controlled_by' not in self:
+            self['opm_was_controlled_by'] = DBOpmWasControlledByXMLDAOBase(self)
+        if 'opm_agent_id' not in self:
+            self['opm_agent_id'] = DBOpmAgentIdXMLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecXMLDAOBase(self)
+        if 'opm_time' not in self:
+            self['opm_time'] = DBOpmTimeXMLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'opm_process' not in self:
+            self['opm_process'] = DBOpmProcessXMLDAOBase(self)
+        if 'opm_was_triggered_by' not in self:
+            self['opm_was_triggered_by'] = DBOpmWasTriggeredByXMLDAOBase(self)
+        if 'opm_process_value' not in self:
+            self['opm_process_value'] = DBOpmProcessValueXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'opm_agent' not in self:
+            self['opm_agent'] = DBOpmAgentXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_0/persistence/xml/xml_dao.py b/vistrails/db/versions/v1_0_0/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v1_0_0/schemas/sql/vistrails.sql b/vistrails/db/versions/v1_0_0/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..b3f5adb
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/schemas/sql/vistrails.sql
@@ -0,0 +1,372 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+CREATE TABLE `vistrails_version`(`version` char(16)) engine=InnoDB;
+INSERT INTO `vistrails_version`(`version`) VALUES ('1.0.0');
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(255),
+    type varchar(255),
+    optional int,
+    sort_key int,
+    sigstring varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module_descriptor(
+    id int,
+    name varchar(255),
+    package varchar(255),
+    namespace varchar(255),
+    version varchar(255),
+    base_descriptor_id int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    signature varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    internal_version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE registry(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    root_descriptor_id int,
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE group_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    group_name varchar(255),
+    group_type varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE package(
+    id int not null auto_increment primary key,
+    name varchar(255),
+    identifier varchar(1023),
+    codepath varchar(1023),
+    load_configuration int,
+    version varchar(255),
+    description varchar(1023),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE loop_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    iteration int,
+    completed int,
+    error varchar(1023),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    prune int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v1_0_0/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v1_0_0/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..0a71def
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,40 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+DROP TABLE IF EXISTS `vistrails_version`;
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, module_descriptor, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, plugin_data, function, abstraction, workflow, registry, annotation, change_tbl, group_exec, package, workflow_exec, loop_exec, connection_tbl, action, delete_tbl, vistrail, module_exec
diff --git a/vistrails/db/versions/v1_0_0/schemas/xml/vistrail.xsd b/vistrails/db/versions/v1_0_0/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..51f02b3
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/schemas/xml/vistrail.xsd
@@ -0,0 +1,278 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="sigstring" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_0/specs/all.xml b/vistrails/db/versions/v1_0_0/specs/all.xml
new file mode 100644
index 0000000..d9560c3
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/specs/all.xml
@@ -0,0 +1,2684 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="prune" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOOP_EXEC +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="loop_exec">
+    <layout>
+      <xml name="loopExec" nodeType="xs:element"/>
+      <sql table="loop_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <!--<property name="input" type="str">
+      <xml name="input" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>-->
+
+    <property name="iteration" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+      
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP_EXEC ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group_exec">
+    <layout>
+      <xml name="groupExec" nodeType="xs:element"/>
+      <sql table="group_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="group_name" type="str">
+      <xml name="groupName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="group_type" type="str">
+      <xml name="groupType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <!--<property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>-->
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="signature" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="optional" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sort_key" type="int">
+      <xml name="sortKey" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sigstring" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="module_descriptor">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_DESCRIPTOR +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_descriptor">
+    <layout>
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+      <sql table="module_descriptor"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+	   
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="base_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="baseDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="package" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+    <!--
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="registry">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="package">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    -->
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PACKAGE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="package">
+    <layout>
+      <xml name="package" nodeType="xs:element"/>
+      <sql table="package"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="identifier" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="codepath" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+      
+    <property name="load_configuration" type="int">
+      <xml name="loadConfiguration" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>      
+
+    <property name="description" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_descriptor" type="list" 
+	      mapping="one-to-many" index="name:namespace:version">
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="registry" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- REGISTRY ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="registry">
+    <layout>
+      <xml name="registry" nodeType="xs:element"/>
+      <sql table="registry"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="root_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="rootDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <!-- <xml nodeType="xs:attribute" type="xs:string"/> -->
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="package" type="list"
+	      mapping="one-to-many" index="identifier:version">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="group" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_GRAPH +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_graph">
+    <layout>
+      <xml name="opmGraph" nodeType="xs:element"/>
+      <!-- <sql table="opm_graph"/> -->
+    </layout>
+
+    <property name="accounts" ref="true" object="opm_accounts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="processes" ref="true" object="opm_processes" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="artifacts" ref="true" object="opm_artifacts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="agents" ref="true" object="opm_agents" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="dependencies" ref="true" object="opm_dependencies" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNTS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_accounts">
+    <layout>
+      <xml name="accounts" nodeType="xs:element"/>
+      <!-- <sql table="accounts"/> -->
+    </layout>
+
+    <property name="account" ref="true" object="opm_account" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="opm_overlaps" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_account">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_OVERLAPS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_overlaps">
+    <layout>
+      <xml name="overlaps" nodeType="xs:element"/>
+      <!-- <sql table="overlaps"/> -->
+    </layout>
+
+    <property ref="true" object="opm_account_id" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACTS +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifacts">
+    <layout>
+      <xml name="artifacts" nodeType="xs:element"/>
+      <!-- <sql table="artifacts"/> -->
+    </layout>
+
+    <property name="artifact" ref="true" object="opm_artifact" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_VALUE ++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="artifact_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="portSpec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="function" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact">
+    <layout>
+      <xml name="artifact" nodeType="xs:element"/>
+      <!-- <sql table="artifact"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" ref="true" object="opm_artifact_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESSES +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_processes">
+    <layout>
+      <xml name="processes" nodeType="xs:element"/>
+      <!-- <sql table="processes"/> -->
+    </layout>
+
+    <property name="process" ref="true" object="opm_process" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_VALUE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="process_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="module_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process">
+    <layout>
+      <xml name="process" nodeType="xs:element"/>
+      <!-- <sql table="process"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="value" ref="true" object="opm_process_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENTS ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agents">
+    <layout>
+      <xml name="agents" nodeType="xs:element"/>
+      <!-- <sql table="agents"/> -->
+    </layout>
+
+    <property name="agent" ref="true" object="opm_agent" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agent">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type=""/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_DEPENDENCIES ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_dependencies">
+    <layout>
+      <xml name="causalDependencies" nodeType="xs:element"/>
+      <!-- <sql table="causal_dependencies"/> -->
+    </layout>
+
+    <choice name="dependency" type="list" mapping="one-to-many">
+      <property name="used" ref="true" object="opm_used">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_generated_by" ref="true" 
+		object="opm_was_generated_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_triggered_by" ref="true" 
+		object="opm_was_triggered_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_derived_from" ref="true" 
+		object="opm_was_derived_from">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_controlled_by" ref="true" 
+		object="opm_was_controlled_by">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_TIME ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_time">
+    <layout>
+      <xml name="time" nodeType="xs:element"/>
+      <!-- <sql table="time"/> -->
+    </layout>
+
+    <property name="no_later_than" type="datetime">
+      <xml name="noLaterThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="no_earlier_than" type="datetime">
+      <xml name="noEarlierThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="clock_id" type="str">
+      <xml name="clockId" nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT_ID ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_account_id">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_account">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_CAUSE ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="process_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_EFFECT +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="process_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_CAUSE +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_EFFECT ++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT_ID ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_agent_id">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_agent">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ROLE ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_role">
+    <layout>
+      <xml name="role" nodeType="xs:element"/>
+      <!-- <sql table="role"/> -->
+    </layout>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(4095)"/> -->
+    </property>
+  </object>
+  
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_USED ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_used">
+    <layout>
+      <xml name="used" nodeType="xs:element"/>
+      <!-- <sql table="used"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_GENERATED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_generated_by">
+    <layout>
+      <xml name="wasGeneratedBy" nodeType="xs:element"/>
+      <!-- <sql table="was_generated_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_CONTROLLED_BY +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_controlled_by">
+    <layout>
+      <xml name="wasControlledBy" nodeType="xs:element"/>
+      <!-- <sql table="was_controlled_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_agent_id"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="start" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="end" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_DERIVED_FROM ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_derived_from">
+    <layout>
+      <xml name="wasDerivedFrom" nodeType="xs:element"/>
+      <!-- <sql table="was_derived_from"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_TRIGGERED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_triggered_by">
+    <layout>
+      <xml name="wasTriggeredBy" nodeType="xs:element"/>
+      <!-- <sql table="was_triggered_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+</objects>
diff --git a/vistrails/db/versions/v1_0_0/translate/__init__.py b/vistrails/db/versions/v1_0_0/translate/__init__.py
new file mode 100644
index 0000000..85cbe3f
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.0'
diff --git a/vistrails/db/versions/v1_0_0/translate/v0_9_5.py b/vistrails/db/versions/v1_0_0/translate/v0_9_5.py
new file mode 100644
index 0000000..71e3d60
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/translate/v0_9_5.py
@@ -0,0 +1,95 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v1_0_0.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry, DBModuleExec, DBGroupExec, DBLoopExec, DBGroup
+
+def translateVistrail(_vistrail):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '1.0.0'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '1.0.0'
+    return workflow
+
+def translateLog(_log):
+    def update_item_execs(old_obj, translate_dict):
+        new_item_execs = []
+        for obj in old_obj.db_items:
+            if obj.vtType == 'module_exec':
+                new_item_execs.append(DBModuleExec.update_version(obj, translate_dict))
+            elif obj.vtType == 'group_exec':
+                new_item_execs.append(DBGroupExec.update_version(obj, translate_dict))
+            elif obj.vtType == 'loop_exec':
+                new_item_execs.append(DBLoopExec.update_version(obj, translate_dict))
+        return new_item_execs
+
+    def update_sub_item_execs(old_obj, translate_dict, do_loop_execs=True):
+        new_item_execs = []
+        for obj in old_obj.db_module_execs:
+            new_item_execs.append(DBModuleExec.update_version(obj, translate_dict))
+        for obj in old_obj.db_group_execs:
+            new_item_execs.append(DBGroupExec.update_version(obj, translate_dict))
+        if do_loop_execs:
+            for obj in old_obj.db_loop_execs:
+                new_item_execs.append(DBLoopExec.update_version(obj, translate_dict))
+        return new_item_execs
+
+    def update_group_item_execs(old_obj, translate_dict):
+        return update_sub_item_execs(old_obj, translate_dict)
+
+    def update_loop_item_execs(old_obj, translate_dict):
+        return update_sub_item_execs(old_obj, translate_dict, False)
+
+    translate_dict = {'DBWorkflowExec': {'item_execs': update_item_execs},
+                      'DBGroupExec': {'item_execs': update_group_item_execs},
+                      'DBLoopExec': {'item_execs': update_loop_item_execs}}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.0'
+    return log
+
+def translateRegistry(_registry):
+    translate_dict = {}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '1.0.0'
+    return registry
diff --git a/vistrails/db/versions/v1_0_0/translate/v1_0_1.py b/vistrails/db/versions/v1_0_0/translate/v1_0_1.py
new file mode 100644
index 0000000..ab1aa8e
--- /dev/null
+++ b/vistrails/db/versions/v1_0_0/translate/v1_0_1.py
@@ -0,0 +1,65 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v1_0_0.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry
+
+def translateVistrail(_vistrail):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '1.0.0'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}    
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '1.0.0'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.0'
+    return log
+
+def translateRegistry(_registry):
+    translate_dict = {}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '1.0.0'
+    return registry
diff --git a/vistrails/db/versions/v1_0_1/__init__.py b/vistrails/db/versions/v1_0_1/__init__.py
new file mode 100644
index 0000000..ecda317
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.1'
diff --git a/vistrails/db/versions/v1_0_1/domain/__init__.py b/vistrails/db/versions/v1_0_1/domain/__init__.py
new file mode 100644
index 0000000..a8208f6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from registry import DBRegistry
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v1_0_1/domain/auto_gen.py b/vistrails/db/versions/v1_0_1/domain/auto_gen.py
new file mode 100644
index 0000000..451d158
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/auto_gen.py
@@ -0,0 +1,11447 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBOpmProcessIdEffect(object):
+
+    vtType = 'opm_process_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmWasGeneratedBy(object):
+
+    vtType = 'opm_was_generated_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasGeneratedBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasGeneratedBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasGeneratedBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmAccounts(object):
+
+    vtType = 'opm_accounts'
+
+    def __init__(self, accounts=None, opm_overlapss=None):
+        self.db_deleted_accounts = []
+        self.db_accounts_id_index = {}
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+            for v in self._db_accounts:
+                self.db_accounts_id_index[v.db_id] = v
+        self.db_deleted_opm_overlapss = []
+        if opm_overlapss is None:
+            self._db_opm_overlapss = []
+        else:
+            self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccounts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccounts()
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_overlapss is None:
+            cp._db_opm_overlapss = []
+        else:
+            cp._db_opm_overlapss = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_overlapss]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_accounts_id_index = dict((v.db_id, v) for v in cp._db_accounts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccounts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccount.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccount.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_overlapss' in class_dict:
+            res = class_dict['opm_overlapss'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_overlaps(obj)
+        elif hasattr(old_obj, 'db_opm_overlapss') and old_obj.db_opm_overlapss is not None:
+            for obj in old_obj.db_opm_overlapss:
+                new_obj.db_add_opm_overlaps(DBOpmOverlaps.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_overlapss') and hasattr(new_obj, 'db_deleted_opm_overlapss'):
+            for obj in old_obj.db_deleted_opm_overlapss:
+                n_obj = DBOpmOverlaps.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_overlapss.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_overlapss:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_overlaps(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_overlapss)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_overlapss = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_overlapss:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_change_account(self, account):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                self._db_accounts[i] = account
+                found = True
+                break
+        if not found:
+            self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                if not self._db_accounts[i].is_new:
+                    self.db_deleted_accounts.append(self._db_accounts[i])
+                del self._db_accounts[i]
+                break
+        del self.db_accounts_id_index[account.db_id]
+    def db_get_account(self, key):
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == key:
+                return self._db_accounts[i]
+        return None
+    def db_get_account_by_id(self, key):
+        return self.db_accounts_id_index[key]
+    def db_has_account_with_id(self, key):
+        return key in self.db_accounts_id_index
+    
+    def __get_db_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def __set_db_opm_overlapss(self, opm_overlapss):
+        self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+    db_opm_overlapss = property(__get_db_opm_overlapss, __set_db_opm_overlapss)
+    def db_get_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def db_add_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_change_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_delete_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_overlaps(self, key):
+        return None
+    
+
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, optional=None, sort_key=None, sigstring=None, labels=None, defaults=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_optional = optional
+        self._db_sort_key = sort_key
+        self._db_sigstring = sigstring
+        self._db_labels = labels
+        self._db_defaults = defaults
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        optional=self._db_optional,
+                        sort_key=self._db_sort_key,
+                        sigstring=self._db_sigstring,
+                        labels=self._db_labels,
+                        defaults=self._db_defaults)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'optional' in class_dict:
+            res = class_dict['optional'](old_obj, trans_dict)
+            new_obj.db_optional = res
+        elif hasattr(old_obj, 'db_optional') and old_obj.db_optional is not None:
+            new_obj.db_optional = old_obj.db_optional
+        if 'sort_key' in class_dict:
+            res = class_dict['sort_key'](old_obj, trans_dict)
+            new_obj.db_sort_key = res
+        elif hasattr(old_obj, 'db_sort_key') and old_obj.db_sort_key is not None:
+            new_obj.db_sort_key = old_obj.db_sort_key
+        if 'sigstring' in class_dict:
+            res = class_dict['sigstring'](old_obj, trans_dict)
+            new_obj.db_sigstring = res
+        elif hasattr(old_obj, 'db_sigstring') and old_obj.db_sigstring is not None:
+            new_obj.db_sigstring = old_obj.db_sigstring
+        if 'labels' in class_dict:
+            res = class_dict['labels'](old_obj, trans_dict)
+            new_obj.db_labels = res
+        elif hasattr(old_obj, 'db_labels') and old_obj.db_labels is not None:
+            new_obj.db_labels = old_obj.db_labels
+        if 'defaults' in class_dict:
+            res = class_dict['defaults'](old_obj, trans_dict)
+            new_obj.db_defaults = res
+        elif hasattr(old_obj, 'db_defaults') and old_obj.db_defaults is not None:
+            new_obj.db_defaults = old_obj.db_defaults
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_optional(self):
+        return self._db_optional
+    def __set_db_optional(self, optional):
+        self._db_optional = optional
+        self.is_dirty = True
+    db_optional = property(__get_db_optional, __set_db_optional)
+    def db_add_optional(self, optional):
+        self._db_optional = optional
+    def db_change_optional(self, optional):
+        self._db_optional = optional
+    def db_delete_optional(self, optional):
+        self._db_optional = None
+    
+    def __get_db_sort_key(self):
+        return self._db_sort_key
+    def __set_db_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+        self.is_dirty = True
+    db_sort_key = property(__get_db_sort_key, __set_db_sort_key)
+    def db_add_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_change_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_delete_sort_key(self, sort_key):
+        self._db_sort_key = None
+    
+    def __get_db_sigstring(self):
+        return self._db_sigstring
+    def __set_db_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+        self.is_dirty = True
+    db_sigstring = property(__get_db_sigstring, __set_db_sigstring)
+    def db_add_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_change_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_delete_sigstring(self, sigstring):
+        self._db_sigstring = None
+    
+    def __get_db_labels(self):
+        return self._db_labels
+    def __set_db_labels(self, labels):
+        self._db_labels = labels
+        self.is_dirty = True
+    db_labels = property(__get_db_labels, __set_db_labels)
+    def db_add_labels(self, labels):
+        self._db_labels = labels
+    def db_change_labels(self, labels):
+        self._db_labels = labels
+    def db_delete_labels(self, labels):
+        self._db_labels = None
+    
+    def __get_db_defaults(self):
+        return self._db_defaults
+    def __set_db_defaults(self, defaults):
+        self._db_defaults = defaults
+        self.is_dirty = True
+    db_defaults = property(__get_db_defaults, __set_db_defaults)
+    def db_add_defaults(self, defaults):
+        self._db_defaults = defaults
+    def db_change_defaults(self, defaults):
+        self._db_defaults = defaults
+    def db_delete_defaults(self, defaults):
+        self._db_defaults = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version,
+                      tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleDescriptor(object):
+
+    vtType = 'module_descriptor'
+
+    def __init__(self, id=None, name=None, package=None, namespace=None, package_version=None, version=None, base_descriptor_id=None, portSpecs=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_package = package
+        self._db_namespace = namespace
+        self._db_package_version = package_version
+        self._db_version = version
+        self._db_base_descriptor_id = base_descriptor_id
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleDescriptor.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleDescriptor(id=self._db_id,
+                                name=self._db_name,
+                                package=self._db_package,
+                                namespace=self._db_namespace,
+                                package_version=self._db_package_version,
+                                version=self._db_version,
+                                base_descriptor_id=self._db_base_descriptor_id)
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_base_descriptor_id') and ('module_descriptor', self._db_base_descriptor_id) in id_remap:
+                cp._db_base_descriptor_id = id_remap[('module_descriptor', self._db_base_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleDescriptor()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package_version' in class_dict:
+            res = class_dict['package_version'](old_obj, trans_dict)
+            new_obj.db_package_version = res
+        elif hasattr(old_obj, 'db_package_version') and old_obj.db_package_version is not None:
+            new_obj.db_package_version = old_obj.db_package_version
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'base_descriptor_id' in class_dict:
+            res = class_dict['base_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_base_descriptor_id = res
+        elif hasattr(old_obj, 'db_base_descriptor_id') and old_obj.db_base_descriptor_id is not None:
+            new_obj.db_base_descriptor_id = old_obj.db_base_descriptor_id
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package_version(self):
+        return self._db_package_version
+    def __set_db_package_version(self, package_version):
+        self._db_package_version = package_version
+        self.is_dirty = True
+    db_package_version = property(__get_db_package_version, __set_db_package_version)
+    def db_add_package_version(self, package_version):
+        self._db_package_version = package_version
+    def db_change_package_version(self, package_version):
+        self._db_package_version = package_version
+    def db_delete_package_version(self, package_version):
+        self._db_package_version = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_base_descriptor_id(self):
+        return self._db_base_descriptor_id
+    def __set_db_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+        self.is_dirty = True
+    db_base_descriptor_id = property(__get_db_base_descriptor_id, __set_db_base_descriptor_id)
+    def db_add_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_change_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_delete_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = None
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmRole(object):
+
+    vtType = 'opm_role'
+
+    def __init__(self, value=None):
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmRole.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmRole(value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmRole()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+
+
+class DBOpmProcesses(object):
+
+    vtType = 'opm_processes'
+
+    def __init__(self, processs=None):
+        self.db_deleted_processs = []
+        self.db_processs_id_index = {}
+        if processs is None:
+            self._db_processs = []
+        else:
+            self._db_processs = processs
+            for v in self._db_processs:
+                self.db_processs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcesses.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcesses()
+        if self._db_processs is None:
+            cp._db_processs = []
+        else:
+            cp._db_processs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_processs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_processs_id_index = dict((v.db_id, v) for v in cp._db_processs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcesses()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'processs' in class_dict:
+            res = class_dict['processs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_process(obj)
+        elif hasattr(old_obj, 'db_processs') and old_obj.db_processs is not None:
+            for obj in old_obj.db_processs:
+                new_obj.db_add_process(DBOpmProcess.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processs') and hasattr(new_obj, 'db_deleted_processs'):
+            for obj in old_obj.db_deleted_processs:
+                n_obj = DBOpmProcess.update_version(obj, trans_dict)
+                new_obj.db_deleted_processs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_processs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_process(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_processs)
+        if remove:
+            self.db_deleted_processs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_processs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_processs(self):
+        return self._db_processs
+    def __set_db_processs(self, processs):
+        self._db_processs = processs
+        self.is_dirty = True
+    db_processs = property(__get_db_processs, __set_db_processs)
+    def db_get_processs(self):
+        return self._db_processs
+    def db_add_process(self, process):
+        self.is_dirty = True
+        self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_change_process(self, process):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                self._db_processs[i] = process
+                found = True
+                break
+        if not found:
+            self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_delete_process(self, process):
+        self.is_dirty = True
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                if not self._db_processs[i].is_new:
+                    self.db_deleted_processs.append(self._db_processs[i])
+                del self._db_processs[i]
+                break
+        del self.db_processs_id_index[process.db_id]
+    def db_get_process(self, key):
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == key:
+                return self._db_processs[i]
+        return None
+    def db_get_process_by_id(self, key):
+        return self.db_processs_id_index[key]
+    def db_has_process_with_id(self, key):
+        return key in self.db_processs_id_index
+    
+
+
+class DBOpmAccountId(object):
+
+    vtType = 'opm_account_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccountId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccountId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_account', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_account', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccountId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, signature=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_signature = signature
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    signature=self._db_signature)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'signature' in class_dict:
+            res = class_dict['signature'](old_obj, trans_dict)
+            new_obj.db_signature = res
+        elif hasattr(old_obj, 'db_signature') and old_obj.db_signature is not None:
+            new_obj.db_signature = old_obj.db_signature
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_signature(self):
+        return self._db_signature
+    def __set_db_signature(self, signature):
+        self._db_signature = signature
+        self.is_dirty = True
+    db_signature = property(__get_db_signature, __set_db_signature)
+    def db_add_signature(self, signature):
+        self._db_signature = signature
+    def db_change_signature(self, signature):
+        self._db_signature = signature
+    def db_delete_signature(self, signature):
+        self._db_signature = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifact(object):
+
+    vtType = 'opm_artifact'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifact.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifact(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifact()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmArtifactValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmArtifactValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version,
+                     tag=self._db_tag)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgents(object):
+
+    vtType = 'opm_agents'
+
+    def __init__(self, agents=None):
+        self.db_deleted_agents = []
+        self.db_agents_id_index = {}
+        if agents is None:
+            self._db_agents = []
+        else:
+            self._db_agents = agents
+            for v in self._db_agents:
+                self.db_agents_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgents.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgents()
+        if self._db_agents is None:
+            cp._db_agents = []
+        else:
+            cp._db_agents = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_agents]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_agents_id_index = dict((v.db_id, v) for v in cp._db_agents)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgents()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_agent(obj)
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            for obj in old_obj.db_agents:
+                new_obj.db_add_agent(DBOpmAgent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgent.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_agents:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_agent(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_agents)
+        if remove:
+            self.db_deleted_agents = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_agents:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_get_agents(self):
+        return self._db_agents
+    def db_add_agent(self, agent):
+        self.is_dirty = True
+        self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_change_agent(self, agent):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                self._db_agents[i] = agent
+                found = True
+                break
+        if not found:
+            self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_delete_agent(self, agent):
+        self.is_dirty = True
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                if not self._db_agents[i].is_new:
+                    self.db_deleted_agents.append(self._db_agents[i])
+                del self._db_agents[i]
+                break
+        del self.db_agents_id_index[agent.db_id]
+    def db_get_agent(self, key):
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == key:
+                return self._db_agents[i]
+        return None
+    def db_get_agent_by_id(self, key):
+        return self.db_agents_id_index[key]
+    def db_has_agent_with_id(self, key):
+        return key in self.db_agents_id_index
+    
+
+
+class DBOpmProcessIdCause(object):
+
+    vtType = 'opm_process_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmOverlaps(object):
+
+    vtType = 'opm_overlaps'
+
+    def __init__(self, opm_account_ids=None):
+        self.db_deleted_opm_account_ids = []
+        if opm_account_ids is None:
+            self._db_opm_account_ids = []
+        else:
+            self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmOverlaps.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmOverlaps()
+        if self._db_opm_account_ids is None:
+            cp._db_opm_account_ids = []
+        else:
+            cp._db_opm_account_ids = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_account_ids]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmOverlaps()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'opm_account_ids' in class_dict:
+            res = class_dict['opm_account_ids'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_account_id(obj)
+        elif hasattr(old_obj, 'db_opm_account_ids') and old_obj.db_opm_account_ids is not None:
+            for obj in old_obj.db_opm_account_ids:
+                new_obj.db_add_opm_account_id(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_account_ids') and hasattr(new_obj, 'db_deleted_opm_account_ids'):
+            for obj in old_obj.db_deleted_opm_account_ids:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_account_ids.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_opm_account_ids:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_account_id(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_opm_account_ids)
+        if remove:
+            self.db_deleted_opm_account_ids = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_opm_account_ids:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def __set_db_opm_account_ids(self, opm_account_ids):
+        self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+    db_opm_account_ids = property(__get_db_opm_account_ids, __set_db_opm_account_ids)
+    def db_get_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def db_add_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_change_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_delete_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_account_id(self, key):
+        return None
+    
+
+
+class DBOpmArtifacts(object):
+
+    vtType = 'opm_artifacts'
+
+    def __init__(self, artifacts=None):
+        self.db_deleted_artifacts = []
+        self.db_artifacts_id_index = {}
+        if artifacts is None:
+            self._db_artifacts = []
+        else:
+            self._db_artifacts = artifacts
+            for v in self._db_artifacts:
+                self.db_artifacts_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifacts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifacts()
+        if self._db_artifacts is None:
+            cp._db_artifacts = []
+        else:
+            cp._db_artifacts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_artifacts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_artifacts_id_index = dict((v.db_id, v) for v in cp._db_artifacts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifacts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_artifact(obj)
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            for obj in old_obj.db_artifacts:
+                new_obj.db_add_artifact(DBOpmArtifact.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifact.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_artifacts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_artifact(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_artifacts)
+        if remove:
+            self.db_deleted_artifacts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_artifacts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_get_artifacts(self):
+        return self._db_artifacts
+    def db_add_artifact(self, artifact):
+        self.is_dirty = True
+        self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_change_artifact(self, artifact):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                self._db_artifacts[i] = artifact
+                found = True
+                break
+        if not found:
+            self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_delete_artifact(self, artifact):
+        self.is_dirty = True
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                if not self._db_artifacts[i].is_new:
+                    self.db_deleted_artifacts.append(self._db_artifacts[i])
+                del self._db_artifacts[i]
+                break
+        del self.db_artifacts_id_index[artifact.db_id]
+    def db_get_artifact(self, key):
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == key:
+                return self._db_artifacts[i]
+        return None
+    def db_get_artifact_by_id(self, key):
+        return self.db_artifacts_id_index[key]
+    def db_has_artifact_with_id(self, key):
+        return key in self.db_artifacts_id_index
+    
+
+
+class DBOpmDependencies(object):
+
+    vtType = 'opm_dependencies'
+
+    def __init__(self, dependencys=None):
+        self.db_deleted_dependencys = []
+        if dependencys is None:
+            self._db_dependencys = []
+        else:
+            self._db_dependencys = dependencys
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmDependencies.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmDependencies()
+        if self._db_dependencys is None:
+            cp._db_dependencys = []
+        else:
+            cp._db_dependencys = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_dependencys]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmDependencies()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'dependencys' in class_dict:
+            res = class_dict['dependencys'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_dependency(obj)
+        elif hasattr(old_obj, 'db_dependencys') and old_obj.db_dependencys is not None:
+            for obj in old_obj.db_dependencys:
+                if obj.vtType == 'opm_used':
+                    new_obj.db_add_dependency(DBOpmUsed.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_generated_by':
+                    new_obj.db_add_dependency(DBOpmWasGeneratedBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_triggered_by':
+                    new_obj.db_add_dependency(DBOpmWasTriggeredBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_derived_from':
+                    new_obj.db_add_dependency(DBOpmWasDerivedFrom.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_controlled_by':
+                    new_obj.db_add_dependency(DBOpmWasControlledBy.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencys') and hasattr(new_obj, 'db_deleted_dependencys'):
+            for obj in old_obj.db_deleted_dependencys:
+                if obj.vtType == 'opm_used':
+                    n_obj = DBOpmUsed.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_generated_by':
+                    n_obj = DBOpmWasGeneratedBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_triggered_by':
+                    n_obj = DBOpmWasTriggeredBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_derived_from':
+                    n_obj = DBOpmWasDerivedFrom.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_controlled_by':
+                    n_obj = DBOpmWasControlledBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_dependencys:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_dependency(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_dependencys)
+        if remove:
+            self.db_deleted_dependencys = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_dependencys:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_dependencys(self):
+        return self._db_dependencys
+    def __set_db_dependencys(self, dependencys):
+        self._db_dependencys = dependencys
+        self.is_dirty = True
+    db_dependencys = property(__get_db_dependencys, __set_db_dependencys)
+    def db_get_dependencys(self):
+        return self._db_dependencys
+    def db_add_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_change_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_delete_dependency(self, dependency):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_dependency(self, key):
+        return None
+    
+
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmUsed(object):
+
+    vtType = 'opm_used'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmUsed.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmUsed()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmUsed()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, internal_version=None, tag=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_internal_version = internal_version
+        self._db_tag = tag
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           cache=self._db_cache,
+                           name=self._db_name,
+                           namespace=self._db_namespace,
+                           package=self._db_package,
+                           version=self._db_version,
+                           internal_version=self._db_internal_version,
+                           tag=self._db_tag)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'internal_version' in class_dict:
+            res = class_dict['internal_version'](old_obj, trans_dict)
+            new_obj.db_internal_version = res
+        elif hasattr(old_obj, 'db_internal_version') and old_obj.db_internal_version is not None:
+            new_obj.db_internal_version = old_obj.db_internal_version
+        if 'tag' in class_dict:
+            res = class_dict['tag'](old_obj, trans_dict)
+            new_obj.db_tag = res
+        elif hasattr(old_obj, 'db_tag') and old_obj.db_tag is not None:
+            new_obj.db_tag = old_obj.db_tag
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_internal_version(self):
+        return self._db_internal_version
+    def __set_db_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+        self.is_dirty = True
+    db_internal_version = property(__get_db_internal_version, __set_db_internal_version)
+    def db_add_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_change_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_delete_internal_version(self, internal_version):
+        self._db_internal_version = None
+    
+    def __get_db_tag(self):
+        return self._db_tag
+    def __set_db_tag(self, tag):
+        self._db_tag = tag
+        self.is_dirty = True
+    db_tag = property(__get_db_tag, __set_db_tag)
+    def db_add_tag(self, tag):
+        self._db_tag = tag
+    def db_change_tag(self, tag):
+        self._db_tag = tag
+    def db_delete_tag(self, tag):
+        self._db_tag = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstraction':
+                    new_obj.db_add_module(DBAbstraction.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifactIdCause(object):
+
+    vtType = 'opm_artifact_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmArtifactValue(object):
+
+    vtType = 'opm_artifact_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'portSpec':
+                new_obj.db_add_value(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_value(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBOpmArtifactIdEffect(object):
+
+    vtType = 'opm_artifact_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmGraph(object):
+
+    vtType = 'opm_graph'
+
+    def __init__(self, accounts=None, processes=None, artifacts=None, agents=None, dependencies=None):
+        self.db_deleted_accounts = []
+        self._db_accounts = accounts
+        self.db_deleted_processes = []
+        self._db_processes = processes
+        self.db_deleted_artifacts = []
+        self._db_artifacts = artifacts
+        self.db_deleted_agents = []
+        self._db_agents = agents
+        self.db_deleted_dependencies = []
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmGraph.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmGraph()
+        if self._db_accounts is not None:
+            cp._db_accounts = self._db_accounts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_processes is not None:
+            cp._db_processes = self._db_processes.do_copy(new_ids, id_scope, id_remap)
+        if self._db_artifacts is not None:
+            cp._db_artifacts = self._db_artifacts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_agents is not None:
+            cp._db_agents = self._db_agents.do_copy(new_ids, id_scope, id_remap)
+        if self._db_dependencies is not None:
+            cp._db_dependencies = self._db_dependencies.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmGraph()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            new_obj.db_accounts = res
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            obj = old_obj.db_accounts
+            new_obj.db_add_accounts(DBOpmAccounts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccounts.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'processes' in class_dict:
+            res = class_dict['processes'](old_obj, trans_dict)
+            new_obj.db_processes = res
+        elif hasattr(old_obj, 'db_processes') and old_obj.db_processes is not None:
+            obj = old_obj.db_processes
+            new_obj.db_add_processes(DBOpmProcesses.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processes') and hasattr(new_obj, 'db_deleted_processes'):
+            for obj in old_obj.db_deleted_processes:
+                n_obj = DBOpmProcesses.update_version(obj, trans_dict)
+                new_obj.db_deleted_processes.append(n_obj)
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            new_obj.db_artifacts = res
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            obj = old_obj.db_artifacts
+            new_obj.db_add_artifacts(DBOpmArtifacts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifacts.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            new_obj.db_agents = res
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            obj = old_obj.db_agents
+            new_obj.db_add_agents(DBOpmAgents.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgents.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        if 'dependencies' in class_dict:
+            res = class_dict['dependencies'](old_obj, trans_dict)
+            new_obj.db_dependencies = res
+        elif hasattr(old_obj, 'db_dependencies') and old_obj.db_dependencies is not None:
+            obj = old_obj.db_dependencies
+            new_obj.db_add_dependencies(DBOpmDependencies.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencies') and hasattr(new_obj, 'db_deleted_dependencies'):
+            for obj in old_obj.db_deleted_dependencies:
+                n_obj = DBOpmDependencies.update_version(obj, trans_dict)
+                new_obj.db_deleted_dependencies.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_accounts is not None:
+            children.extend(self._db_accounts.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_accounts = None
+        if self._db_processes is not None:
+            children.extend(self._db_processes.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_processes = None
+        if self._db_artifacts is not None:
+            children.extend(self._db_artifacts.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_artifacts = None
+        if self._db_agents is not None:
+            children.extend(self._db_agents.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_agents = None
+        if self._db_dependencies is not None:
+            children.extend(self._db_dependencies.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_dependencies = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_processes)
+        children.extend(self.db_deleted_artifacts)
+        children.extend(self.db_deleted_agents)
+        children.extend(self.db_deleted_dependencies)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_processes = []
+            self.db_deleted_artifacts = []
+            self.db_deleted_agents = []
+            self.db_deleted_dependencies = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_accounts is not None and self._db_accounts.has_changes():
+            return True
+        if self._db_processes is not None and self._db_processes.has_changes():
+            return True
+        if self._db_artifacts is not None and self._db_artifacts.has_changes():
+            return True
+        if self._db_agents is not None and self._db_agents.has_changes():
+            return True
+        if self._db_dependencies is not None and self._db_dependencies.has_changes():
+            return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_add_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_change_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_delete_accounts(self, accounts):
+        if not self.is_new:
+            self.db_deleted_accounts.append(self._db_accounts)
+        self._db_accounts = None
+    
+    def __get_db_processes(self):
+        return self._db_processes
+    def __set_db_processes(self, processes):
+        self._db_processes = processes
+        self.is_dirty = True
+    db_processes = property(__get_db_processes, __set_db_processes)
+    def db_add_processes(self, processes):
+        self._db_processes = processes
+    def db_change_processes(self, processes):
+        self._db_processes = processes
+    def db_delete_processes(self, processes):
+        if not self.is_new:
+            self.db_deleted_processes.append(self._db_processes)
+        self._db_processes = None
+    
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_add_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_change_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_delete_artifacts(self, artifacts):
+        if not self.is_new:
+            self.db_deleted_artifacts.append(self._db_artifacts)
+        self._db_artifacts = None
+    
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_add_agents(self, agents):
+        self._db_agents = agents
+    def db_change_agents(self, agents):
+        self._db_agents = agents
+    def db_delete_agents(self, agents):
+        if not self.is_new:
+            self.db_deleted_agents.append(self._db_agents)
+        self._db_agents = None
+    
+    def __get_db_dependencies(self):
+        return self._db_dependencies
+    def __set_db_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+    db_dependencies = property(__get_db_dependencies, __set_db_dependencies)
+    def db_add_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_change_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_delete_dependencies(self, dependencies):
+        if not self.is_new:
+            self.db_deleted_dependencies.append(self._db_dependencies)
+        self._db_dependencies = None
+    
+
+
+class DBRegistry(object):
+
+    vtType = 'registry'
+
+    def __init__(self, id=None, entity_type=None, version=None, root_descriptor_id=None, name=None, last_modified=None, packages=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_root_descriptor_id = root_descriptor_id
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_packages = []
+        self.db_packages_id_index = {}
+        self.db_packages_identifier_index = {}
+        if packages is None:
+            self._db_packages = []
+        else:
+            self._db_packages = packages
+            for v in self._db_packages:
+                self.db_packages_id_index[v.db_id] = v
+                self.db_packages_identifier_index[(v.db_identifier,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRegistry.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRegistry(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        root_descriptor_id=self._db_root_descriptor_id,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_packages is None:
+            cp._db_packages = []
+        else:
+            cp._db_packages = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_packages]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_root_descriptor_id') and ('module_descriptor', self._db_root_descriptor_id) in id_remap:
+                cp._db_root_descriptor_id = id_remap[('module_descriptor', self._db_root_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_packages_id_index = dict((v.db_id, v) for v in cp._db_packages)
+        cp.db_packages_identifier_index = dict(((v.db_identifier,v.db_version), v) for v in cp._db_packages)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'root_descriptor_id' in class_dict:
+            res = class_dict['root_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_root_descriptor_id = res
+        elif hasattr(old_obj, 'db_root_descriptor_id') and old_obj.db_root_descriptor_id is not None:
+            new_obj.db_root_descriptor_id = old_obj.db_root_descriptor_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'packages' in class_dict:
+            res = class_dict['packages'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_package(obj)
+        elif hasattr(old_obj, 'db_packages') and old_obj.db_packages is not None:
+            for obj in old_obj.db_packages:
+                new_obj.db_add_package(DBPackage.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_packages') and hasattr(new_obj, 'db_deleted_packages'):
+            for obj in old_obj.db_deleted_packages:
+                n_obj = DBPackage.update_version(obj, trans_dict)
+                new_obj.db_deleted_packages.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_packages:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_package(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_packages)
+        if remove:
+            self.db_deleted_packages = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_packages:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_root_descriptor_id(self):
+        return self._db_root_descriptor_id
+    def __set_db_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+        self.is_dirty = True
+    db_root_descriptor_id = property(__get_db_root_descriptor_id, __set_db_root_descriptor_id)
+    def db_add_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_change_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_delete_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_packages(self):
+        return self._db_packages
+    def __set_db_packages(self, packages):
+        self._db_packages = packages
+        self.is_dirty = True
+    db_packages = property(__get_db_packages, __set_db_packages)
+    def db_get_packages(self):
+        return self._db_packages
+    def db_add_package(self, package):
+        self.is_dirty = True
+        self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_change_package(self, package):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                self._db_packages[i] = package
+                found = True
+                break
+        if not found:
+            self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_delete_package(self, package):
+        self.is_dirty = True
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                if not self._db_packages[i].is_new:
+                    self.db_deleted_packages.append(self._db_packages[i])
+                del self._db_packages[i]
+                break
+        del self.db_packages_id_index[package.db_id]
+        del self.db_packages_identifier_index[(package.db_identifier,package.db_version)]
+    def db_get_package(self, key):
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == key:
+                return self._db_packages[i]
+        return None
+    def db_get_package_by_id(self, key):
+        return self.db_packages_id_index[key]
+    def db_has_package_with_id(self, key):
+        return key in self.db_packages_id_index
+    def db_get_package_by_identifier(self, key):
+        return self.db_packages_identifier_index[key]
+    def db_has_package_with_identifier(self, key):
+        return key in self.db_packages_identifier_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAccount(object):
+
+    vtType = 'opm_account'
+
+    def __init__(self, id=None, value=None):
+        self._db_id = id
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccount.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccount(id=self._db_id,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccount()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasDerivedFrom(object):
+
+    vtType = 'opm_was_derived_from'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasDerivedFrom.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasDerivedFrom()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasDerivedFrom()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmWasControlledBy(object):
+
+    vtType = 'opm_was_controlled_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, starts=None, ends=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_starts = []
+        if starts is None:
+            self._db_starts = []
+        else:
+            self._db_starts = starts
+        self.db_deleted_ends = []
+        if ends is None:
+            self._db_ends = []
+        else:
+            self._db_ends = ends
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasControlledBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasControlledBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_starts is None:
+            cp._db_starts = []
+        else:
+            cp._db_starts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_starts]
+        if self._db_ends is None:
+            cp._db_ends = []
+        else:
+            cp._db_ends = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ends]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasControlledBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmAgentId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmAgentId.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'starts' in class_dict:
+            res = class_dict['starts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_start(obj)
+        elif hasattr(old_obj, 'db_starts') and old_obj.db_starts is not None:
+            for obj in old_obj.db_starts:
+                new_obj.db_add_start(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_starts') and hasattr(new_obj, 'db_deleted_starts'):
+            for obj in old_obj.db_deleted_starts:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_starts.append(n_obj)
+        if 'ends' in class_dict:
+            res = class_dict['ends'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_end(obj)
+        elif hasattr(old_obj, 'db_ends') and old_obj.db_ends is not None:
+            for obj in old_obj.db_ends:
+                new_obj.db_add_end(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ends') and hasattr(new_obj, 'db_deleted_ends'):
+            for obj in old_obj.db_deleted_ends:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_ends.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_starts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_start(child)
+        to_del = []
+        for child in self.db_ends:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_end(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_starts)
+        children.extend(self.db_deleted_ends)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_starts = []
+            self.db_deleted_ends = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_starts:
+            if child.has_changes():
+                return True
+        for child in self._db_ends:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_starts(self):
+        return self._db_starts
+    def __set_db_starts(self, starts):
+        self._db_starts = starts
+        self.is_dirty = True
+    db_starts = property(__get_db_starts, __set_db_starts)
+    def db_get_starts(self):
+        return self._db_starts
+    def db_add_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_change_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_delete_start(self, start):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_start(self, key):
+        return None
+    
+    def __get_db_ends(self):
+        return self._db_ends
+    def __set_db_ends(self, ends):
+        self._db_ends = ends
+        self.is_dirty = True
+    db_ends = property(__get_db_ends, __set_db_ends)
+    def db_get_ends(self):
+        return self._db_ends
+    def db_add_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_change_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_delete_end(self, end):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_end(self, key):
+        return None
+    
+
+
+class DBOpmAgentId(object):
+
+    vtType = 'opm_agent_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgentId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgentId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_agent', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_agent', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgentId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBGroupExec(object):
+
+    vtType = 'group_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, group_name=None, group_type=None, completed=None, error=None, machine_id=None, annotations=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_group_name = group_name
+        self._db_group_type = group_type
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroupExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroupExec(id=self._db_id,
+                         ts_start=self._db_ts_start,
+                         ts_end=self._db_ts_end,
+                         cached=self._db_cached,
+                         module_id=self._db_module_id,
+                         group_name=self._db_group_name,
+                         group_type=self._db_group_type,
+                         completed=self._db_completed,
+                         error=self._db_error,
+                         machine_id=self._db_machine_id)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroupExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'group_name' in class_dict:
+            res = class_dict['group_name'](old_obj, trans_dict)
+            new_obj.db_group_name = res
+        elif hasattr(old_obj, 'db_group_name') and old_obj.db_group_name is not None:
+            new_obj.db_group_name = old_obj.db_group_name
+        if 'group_type' in class_dict:
+            res = class_dict['group_type'](old_obj, trans_dict)
+            new_obj.db_group_type = res
+        elif hasattr(old_obj, 'db_group_type') and old_obj.db_group_type is not None:
+            new_obj.db_group_type = old_obj.db_group_type
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_group_name(self):
+        return self._db_group_name
+    def __set_db_group_name(self, group_name):
+        self._db_group_name = group_name
+        self.is_dirty = True
+    db_group_name = property(__get_db_group_name, __set_db_group_name)
+    def db_add_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_change_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_delete_group_name(self, group_name):
+        self._db_group_name = None
+    
+    def __get_db_group_type(self):
+        return self._db_group_type
+    def __set_db_group_type(self, group_type):
+        self._db_group_type = group_type
+        self.is_dirty = True
+    db_group_type = property(__get_db_group_type, __set_db_group_type)
+    def db_add_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_change_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_delete_group_type(self, group_type):
+        self._db_group_type = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmTime(object):
+
+    vtType = 'opm_time'
+
+    def __init__(self, no_later_than=None, no_earlier_than=None, clock_id=None):
+        self._db_no_later_than = no_later_than
+        self._db_no_earlier_than = no_earlier_than
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmTime.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmTime(no_later_than=self._db_no_later_than,
+                       no_earlier_than=self._db_no_earlier_than,
+                       clock_id=self._db_clock_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmTime()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'no_later_than' in class_dict:
+            res = class_dict['no_later_than'](old_obj, trans_dict)
+            new_obj.db_no_later_than = res
+        elif hasattr(old_obj, 'db_no_later_than') and old_obj.db_no_later_than is not None:
+            new_obj.db_no_later_than = old_obj.db_no_later_than
+        if 'no_earlier_than' in class_dict:
+            res = class_dict['no_earlier_than'](old_obj, trans_dict)
+            new_obj.db_no_earlier_than = res
+        elif hasattr(old_obj, 'db_no_earlier_than') and old_obj.db_no_earlier_than is not None:
+            new_obj.db_no_earlier_than = old_obj.db_no_earlier_than
+        if 'clock_id' in class_dict:
+            res = class_dict['clock_id'](old_obj, trans_dict)
+            new_obj.db_clock_id = res
+        elif hasattr(old_obj, 'db_clock_id') and old_obj.db_clock_id is not None:
+            new_obj.db_clock_id = old_obj.db_clock_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_no_later_than(self):
+        return self._db_no_later_than
+    def __set_db_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+        self.is_dirty = True
+    db_no_later_than = property(__get_db_no_later_than, __set_db_no_later_than)
+    def db_add_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_change_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_delete_no_later_than(self, no_later_than):
+        self._db_no_later_than = None
+    
+    def __get_db_no_earlier_than(self):
+        return self._db_no_earlier_than
+    def __set_db_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+        self.is_dirty = True
+    db_no_earlier_than = property(__get_db_no_earlier_than, __set_db_no_earlier_than)
+    def db_add_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_change_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_delete_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = None
+    
+    def __get_db_clock_id(self):
+        return self._db_clock_id
+    def __set_db_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+    db_clock_id = property(__get_db_clock_id, __set_db_clock_id)
+    def db_add_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_change_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_delete_clock_id(self, clock_id):
+        self._db_clock_id = None
+    
+
+
+class DBPackage(object):
+
+    vtType = 'package'
+
+    def __init__(self, id=None, name=None, identifier=None, codepath=None, load_configuration=None, version=None, description=None, module_descriptors=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_identifier = identifier
+        self._db_codepath = codepath
+        self._db_load_configuration = load_configuration
+        self._db_version = version
+        self._db_description = description
+        self.db_deleted_module_descriptors = []
+        self.db_module_descriptors_id_index = {}
+        self.db_module_descriptors_name_index = {}
+        if module_descriptors is None:
+            self._db_module_descriptors = []
+        else:
+            self._db_module_descriptors = module_descriptors
+            for v in self._db_module_descriptors:
+                self.db_module_descriptors_id_index[v.db_id] = v
+                self.db_module_descriptors_name_index[(v.db_name,v.db_namespace,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPackage.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPackage(id=self._db_id,
+                       name=self._db_name,
+                       identifier=self._db_identifier,
+                       codepath=self._db_codepath,
+                       load_configuration=self._db_load_configuration,
+                       version=self._db_version,
+                       description=self._db_description)
+        if self._db_module_descriptors is None:
+            cp._db_module_descriptors = []
+        else:
+            cp._db_module_descriptors = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_descriptors]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_descriptors_id_index = dict((v.db_id, v) for v in cp._db_module_descriptors)
+        cp.db_module_descriptors_name_index = dict(((v.db_name,v.db_namespace,v.db_version), v) for v in cp._db_module_descriptors)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPackage()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'identifier' in class_dict:
+            res = class_dict['identifier'](old_obj, trans_dict)
+            new_obj.db_identifier = res
+        elif hasattr(old_obj, 'db_identifier') and old_obj.db_identifier is not None:
+            new_obj.db_identifier = old_obj.db_identifier
+        if 'codepath' in class_dict:
+            res = class_dict['codepath'](old_obj, trans_dict)
+            new_obj.db_codepath = res
+        elif hasattr(old_obj, 'db_codepath') and old_obj.db_codepath is not None:
+            new_obj.db_codepath = old_obj.db_codepath
+        if 'load_configuration' in class_dict:
+            res = class_dict['load_configuration'](old_obj, trans_dict)
+            new_obj.db_load_configuration = res
+        elif hasattr(old_obj, 'db_load_configuration') and old_obj.db_load_configuration is not None:
+            new_obj.db_load_configuration = old_obj.db_load_configuration
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'description' in class_dict:
+            res = class_dict['description'](old_obj, trans_dict)
+            new_obj.db_description = res
+        elif hasattr(old_obj, 'db_description') and old_obj.db_description is not None:
+            new_obj.db_description = old_obj.db_description
+        if 'module_descriptors' in class_dict:
+            res = class_dict['module_descriptors'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_descriptor(obj)
+        elif hasattr(old_obj, 'db_module_descriptors') and old_obj.db_module_descriptors is not None:
+            for obj in old_obj.db_module_descriptors:
+                new_obj.db_add_module_descriptor(DBModuleDescriptor.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_descriptors') and hasattr(new_obj, 'db_deleted_module_descriptors'):
+            for obj in old_obj.db_deleted_module_descriptors:
+                n_obj = DBModuleDescriptor.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_descriptors.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_descriptors:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_descriptor(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_descriptors)
+        if remove:
+            self.db_deleted_module_descriptors = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_descriptors:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_identifier(self):
+        return self._db_identifier
+    def __set_db_identifier(self, identifier):
+        self._db_identifier = identifier
+        self.is_dirty = True
+    db_identifier = property(__get_db_identifier, __set_db_identifier)
+    def db_add_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_change_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_delete_identifier(self, identifier):
+        self._db_identifier = None
+    
+    def __get_db_codepath(self):
+        return self._db_codepath
+    def __set_db_codepath(self, codepath):
+        self._db_codepath = codepath
+        self.is_dirty = True
+    db_codepath = property(__get_db_codepath, __set_db_codepath)
+    def db_add_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_change_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_delete_codepath(self, codepath):
+        self._db_codepath = None
+    
+    def __get_db_load_configuration(self):
+        return self._db_load_configuration
+    def __set_db_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+        self.is_dirty = True
+    db_load_configuration = property(__get_db_load_configuration, __set_db_load_configuration)
+    def db_add_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_change_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_delete_load_configuration(self, load_configuration):
+        self._db_load_configuration = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_description(self):
+        return self._db_description
+    def __set_db_description(self, description):
+        self._db_description = description
+        self.is_dirty = True
+    db_description = property(__get_db_description, __set_db_description)
+    def db_add_description(self, description):
+        self._db_description = description
+    def db_change_description(self, description):
+        self._db_description = description
+    def db_delete_description(self, description):
+        self._db_description = None
+    
+    def __get_db_module_descriptors(self):
+        return self._db_module_descriptors
+    def __set_db_module_descriptors(self, module_descriptors):
+        self._db_module_descriptors = module_descriptors
+        self.is_dirty = True
+    db_module_descriptors = property(__get_db_module_descriptors, __set_db_module_descriptors)
+    def db_get_module_descriptors(self):
+        return self._db_module_descriptors
+    def db_add_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_change_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                self._db_module_descriptors[i] = module_descriptor
+                found = True
+                break
+        if not found:
+            self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_delete_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                if not self._db_module_descriptors[i].is_new:
+                    self.db_deleted_module_descriptors.append(self._db_module_descriptors[i])
+                del self._db_module_descriptors[i]
+                break
+        del self.db_module_descriptors_id_index[module_descriptor.db_id]
+        del self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)]
+    def db_get_module_descriptor(self, key):
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == key:
+                return self._db_module_descriptors[i]
+        return None
+    def db_get_module_descriptor_by_id(self, key):
+        return self.db_module_descriptors_id_index[key]
+    def db_has_module_descriptor_with_id(self, key):
+        return key in self.db_module_descriptors_id_index
+    def db_get_module_descriptor_by_name(self, key):
+        return self.db_module_descriptors_name_index[key]
+    def db_has_module_descriptor_with_name(self, key):
+        return key in self.db_module_descriptors_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, item_execs=None, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLoopExec(object):
+
+    vtType = 'loop_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, iteration=None, completed=None, error=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_iteration = iteration
+        self._db_completed = completed
+        self._db_error = error
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLoopExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLoopExec(id=self._db_id,
+                        ts_start=self._db_ts_start,
+                        ts_end=self._db_ts_end,
+                        iteration=self._db_iteration,
+                        completed=self._db_completed,
+                        error=self._db_error)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLoopExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'iteration' in class_dict:
+            res = class_dict['iteration'](old_obj, trans_dict)
+            new_obj.db_iteration = res
+        elif hasattr(old_obj, 'db_iteration') and old_obj.db_iteration is not None:
+            new_obj.db_iteration = old_obj.db_iteration
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_iteration(self):
+        return self._db_iteration
+    def __set_db_iteration(self, iteration):
+        self._db_iteration = iteration
+        self.is_dirty = True
+    db_iteration = property(__get_db_iteration, __set_db_iteration)
+    def db_add_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_change_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_delete_iteration(self, iteration):
+        self._db_iteration = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcess(object):
+
+    vtType = 'opm_process'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcess.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcess(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcess()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmProcessValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmProcessValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasTriggeredBy(object):
+
+    vtType = 'opm_was_triggered_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasTriggeredBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasTriggeredBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasTriggeredBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmProcessValue(object):
+
+    vtType = 'opm_process_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'module_exec':
+                new_obj.db_add_value(DBModuleExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'group_exec':
+                new_obj.db_add_value(DBGroupExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'loop_exec':
+                new_obj.db_add_value(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, prune=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self._db_prune = prune
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user,
+                      prune=self._db_prune)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'prune' in class_dict:
+            res = class_dict['prune'](old_obj, trans_dict)
+            new_obj.db_prune = res
+        elif hasattr(old_obj, 'db_prune') and old_obj.db_prune is not None:
+            new_obj.db_prune = old_obj.db_prune
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_prune(self):
+        return self._db_prune
+    def __set_db_prune(self, prune):
+        self._db_prune = prune
+        self.is_dirty = True
+    db_prune = property(__get_db_prune, __set_db_prune)
+    def db_add_prune(self, prune):
+        self._db_prune = prune
+    def db_change_prune(self, prune):
+        self._db_prune = prune
+    def db_delete_prune(self, prune):
+        self._db_prune = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgent(object):
+
+    vtType = 'opm_agent'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgent(id=self._db_id,
+                        value=self._db_value)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, machine_id=None, annotations=None, loop_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_loop_execs = []
+        self.db_loop_execs_id_index = {}
+        if loop_execs is None:
+            self._db_loop_execs = []
+        else:
+            self._db_loop_execs = loop_execs
+            for v in self._db_loop_execs:
+                self.db_loop_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_loop_execs is None:
+            cp._db_loop_execs = []
+        else:
+            cp._db_loop_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_loop_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_loop_execs_id_index = dict((v.db_id, v) for v in cp._db_loop_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'loop_execs' in class_dict:
+            res = class_dict['loop_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_loop_exec(obj)
+        elif hasattr(old_obj, 'db_loop_execs') and old_obj.db_loop_execs is not None:
+            for obj in old_obj.db_loop_execs:
+                new_obj.db_add_loop_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_loop_execs') and hasattr(new_obj, 'db_deleted_loop_execs'):
+            for obj in old_obj.db_deleted_loop_execs:
+                n_obj = DBLoopExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_loop_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_loop_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_loop_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_loop_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_loop_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_loop_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_loop_execs(self):
+        return self._db_loop_execs
+    def __set_db_loop_execs(self, loop_execs):
+        self._db_loop_execs = loop_execs
+        self.is_dirty = True
+    db_loop_execs = property(__get_db_loop_execs, __set_db_loop_execs)
+    def db_get_loop_execs(self):
+        return self._db_loop_execs
+    def db_add_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_change_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                self._db_loop_execs[i] = loop_exec
+                found = True
+                break
+        if not found:
+            self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_delete_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                if not self._db_loop_execs[i].is_new:
+                    self.db_deleted_loop_execs.append(self._db_loop_execs[i])
+                del self._db_loop_execs[i]
+                break
+        del self.db_loop_execs_id_index[loop_exec.db_id]
+    def db_get_loop_exec(self, key):
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == key:
+                return self._db_loop_execs[i]
+        return None
+    def db_get_loop_exec_by_id(self, key):
+        return self.db_loop_execs_id_index[key]
+    def db_has_loop_exec_with_id(self, key):
+        return key in self.db_loop_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v1_0_1/domain/id_scope.py b/vistrails/db/versions/v1_0_1/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v1_0_1/domain/log.py b/vistrails/db/versions/v1_0_1/domain/log.py
new file mode 100644
index 0000000..a127726
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/log.py
@@ -0,0 +1,72 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstraction, DBModule, DBGroup, DBLoopExec, \
+    DBGroupExec, DBModuleExec
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                                {DBLoopExec.vtType: 'item_exec',
+                                 DBModuleExec.vtType: 'item_exec',
+                                 DBGroupExec.vtType: 'item_exec',
+                                 DBAbstraction.vtType: DBModule.vtType,
+                                 DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v1_0_1/domain/registry.py b/vistrails/db/versions/v1_0_1/domain/registry.py
new file mode 100644
index 0000000..323ebbd
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/registry.py
@@ -0,0 +1,63 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBRegistry as _DBRegistry, DBPackage, DBModuleDescriptor, \
+    DBPortSpec
+from id_scope import IdScope
+
+class DBRegistry(_DBRegistry):
+    def __init__(self, *args, **kwargs):
+        _DBRegistry.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        new_obj = _DBRegistry.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+    
+    def update_id_scope(self):
+        for package in self.db_packages:
+            self.idScope.updateBeginId(DBPackage.vtType, package.db_id+1)
+            for descriptor in package.db_module_descriptors:
+                self.idScope.updateBeginId(DBModuleDescriptor.vtType,
+                                           descriptor.db_id+1)
+                for port_spec in descriptor.db_portSpecs:
+                    self.idScope.updateBeginId(DBPortSpec.vtType, 
+                                               port_spec.db_id+1)
+
+
diff --git a/vistrails/db/versions/v1_0_1/domain/vistrail.py b/vistrails/db/versions/v1_0_1/domain/vistrail.py
new file mode 100644
index 0000000..c76edd7
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/vistrail.py
@@ -0,0 +1,203 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+import hashlib
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstraction, DBGroup, \
+    DBModule
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstraction.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.db_log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.db_log_filename = self.db_log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'db_log_filename'):
+            new_obj.db_log_filename = old_obj.db_log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
+
+    def update_checkout_version(self, app=''):
+        checkout_key = "__checkout_version_"
+        action_key = checkout_key + app
+        tag_key = action_key + '_taghash'
+        annotation_key = action_key + '_annotationhash'
+        action_annotation_key = action_key + '_actionannotationhash'
+
+        # delete previous checkout annotations
+        deletekeys = [action_key,tag_key,annotation_key,action_annotation_key]
+        for key in deletekeys:
+            while self.db_has_annotation_with_key(key):
+                a = self.db_get_annotation_by_key(key)
+                self.db_delete_annotation(a)
+        
+        # annotation hash - requires annotations to be clean
+        value = self.hashAnnotations()
+        self.set_annotation(annotation_key, value)
+        # action annotation hash
+        value = self.hashActionAnnotations()
+        self.set_annotation(action_annotation_key, value)
+        # last action id hash
+        if len(self.db_actions) == 0:
+            value = 0
+        else:
+            value = max(v.db_id for v in self.db_actions)
+        self.set_annotation(action_key, value)
+        # tag hash
+        self.set_annotation(tag_key, self.hashTags())
+
+    def hashTags(self):
+        tagKeys = [tag.db_id for tag in self.db_tags]
+        tagKeys.sort()
+        m = hashlib.md5()
+        for k in tagKeys:
+            m.update(str(k))
+            m.update(self.db_get_tag_by_id(k).db_name)
+        return m.hexdigest()
+
+    def hashAnnotations(self):
+        annotations = {}
+        for annotation in self.db_annotations:
+            if annotation._db_key not in annotations:
+                annotations[annotation._db_key] = []
+            if annotation._db_value not in annotations[annotation._db_key]:
+                annotations[annotation._db_key].append(annotation._db_value)
+        keys = annotations.keys()
+        keys.sort()
+        m = hashlib.md5()
+        for k in keys:
+            m.update(k)
+            annotations[k].sort()
+            for v in annotations[k]:
+                m.update(v)
+        return m.hexdigest()
+
+    def hashActionAnnotations(self):
+        action_annotations = {}
+        for id, annotations in [[action.db_id, action.db_annotations] for action in self.db_actions]:
+            for annotation in annotations:
+                index = (str(id), annotation.db_key)
+                if index not in action_annotations:
+                    action_annotations[index] = []
+                if annotation.db_value not in action_annotations[index]:
+                    action_annotations[index].append(annotation.db_value)
+        keys = action_annotations.keys()
+        keys.sort()
+        m = hashlib.md5()
+        for k in keys:
+            m.update(k[0] + k[1])
+            action_annotations[k].sort()
+            for v in action_annotations[k]:
+                m.update(v)
+        return m.hexdigest()
diff --git a/vistrails/db/versions/v1_0_1/domain/workflow.py b/vistrails/db/versions/v1_0_1/domain/workflow.py
new file mode 100644
index 0000000..af484e6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/domain/workflow.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {DBAbstraction.vtType: DBModule.vtType, 
+                  DBGroup.vtType: DBModule.vtType}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == DBAbstraction.vtType or \
+                object.vtType == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == DBAbstraction.vtType or obj_type == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v1_0_1/persistence/__init__.py b/vistrails/db/versions/v1_0_1/persistence/__init__.py
new file mode 100644
index 0000000..f7c0477
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/__init__.py
@@ -0,0 +1,248 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v1_0_1 import version as my_version
+from vistrails.db.versions.v1_0_1.domain import DBGroup, DBWorkflow, DBVistrail, DBLog, \
+    DBRegistry
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        def indent(elem, level=0):
+            i = "\n" + level*"  "
+            if len(elem):
+                if not elem.text or not elem.text.strip():
+                    elem.text = i + "  "
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+                for elem in elem:
+                    indent(elem, level+1)
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        indent(tree.getroot())
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id=None, lock=False, 
+                     global_props=None):
+        all_objects = {}
+        if global_props is None:
+            global_props = {}
+        if id is not None:
+            global_props['id'] = id
+        # print global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        global_props = {'entity_id': res.db_id,
+                        'entity_type': res.vtType}
+
+        for dao_type, dao in self['sql'].iteritems():
+            if (dao_type == DBVistrail.vtType or
+                dao_type == DBWorkflow.vtType or
+                dao_type == DBLog.vtType or
+                dao_type == DBRegistry.vtType):
+                continue
+                
+            current_objs = dao.get_sql_columns(db_connection, global_props, 
+                                               lock)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+
+        return res
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children()
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        child = children[0][0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                  global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        # do deletes
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                            c,
+                                                            global_props)
+
+        child = children.pop(0)[0]
+        child.is_dirty = False
+        child.is_new = False
+
+        # process remaining children
+        for (child, _, _) in children:
+            self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                      global_props, do_copy)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    new_props = {'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    is_dirty = child.db_workflow.is_dirty
+                    child.db_workflow.db_entity_type = DBWorkflow.vtType
+                    child.db_workflow.is_dirty = is_dirty
+                    self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                    new_props)
+                                            
+            child.is_dirty = False
+            child.is_new = False
+
+    def delete_from_db(self, db_connection, type, obj_id):
+        root_set = set([DBVistrail.vtType, DBWorkflow.vtType, 
+                        DBLog.vtType, DBRegistry.vtType])
+        if type not in root_set:
+            raise VistrailsDBException("Cannot delete entity of type '%s'" \
+                                           % type)
+
+        id_str = str(obj_id)
+        for (dao_type, dao) in self['sql'].iteritems():
+            if dao_type not in root_set:
+                db_cmd = \
+                    self['sql'][type].createSQLDelete(dao.table,
+                                                      {'entity_type': type,
+                                                       'entity_id': id_str})
+                self['sql'][type].executeSQL(db_connection, db_cmd, False)
+        db_cmd = self['sql'][type].createSQLDelete(self['sql'][type].table,
+                                                   {'id': id_str})
+        self['sql'][type].executeSQL(db_connection, db_cmd, False)
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v1_0_1/persistence/sql/__init__.py b/vistrails/db/versions/v1_0_1/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_1/persistence/sql/auto_gen.py b/vistrails/db/versions/v1_0_1/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..a083843
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/sql/auto_gen.py
@@ -0,0 +1,3344 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v1_0_1.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'labels', 'defaults', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            sigstring = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            labels = self.convertFromDB(row[6], 'str', 'varchar(4095)')
+            defaults = self.convertFromDB(row[7], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  sigstring=sigstring,
+                                  labels=labels,
+                                  defaults=defaults,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'module_descriptor':
+            p = all_objects[('module_descriptor', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'labels', 'defaults', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_sigstring') and obj.db_sigstring is not None:
+            columnMap['sigstring'] = \
+                self.convertToDB(obj.db_sigstring, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_labels') and obj.db_labels is not None:
+            columnMap['labels'] = \
+                self.convertToDB(obj.db_labels, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_defaults') and obj.db_defaults is not None:
+            columnMap['defaults'] = \
+                self.convertToDB(obj.db_defaults, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              tag=tag,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleDescriptorSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_descriptor'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[6], 'long', 'int')
+            package = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   package_version=package_version,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('package', obj.db_package) in all_objects:
+            p = all_objects[('package', obj.db_package)]
+            p.db_add_module_descriptor(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package_version') and obj.db_package_version is not None:
+            columnMap['package_version'] = \
+                self.convertToDB(obj.db_package_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            tag=tag,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_group = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            tag = self.convertFromDB(row[7], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        tag=tag,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'tag', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_tag') and obj.db_tag is not None:
+            columnMap['tag'] = \
+                self.convertToDB(obj.db_tag, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_group) in all_objects:
+            p = all_objects[('group', obj.db_group)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBRegistrySQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'registry'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_packages:
+            child.db_registry = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPackageSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'package'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('registry', obj.db_registry) in all_objects:
+            p = all_objects[('registry', obj.db_registry)]
+            p.db_add_package(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_descriptors:
+            child.db_package = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLoopExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'loop_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            iteration = self.convertFromDB(row[3], 'int', 'int')
+            completed = self.convertFromDB(row[4], 'int', 'int')
+            error = self.convertFromDB(row[5], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   iteration=iteration,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_loop_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_iteration') and obj.db_iteration is not None:
+            columnMap['iteration'] = \
+                self.convertToDB(obj.db_iteration, 'int', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            prune = self.convertFromDB(row[5], 'int', 'int')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              prune=prune,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'prune', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_prune') and obj.db_prune is not None:
+            columnMap['prune'] = \
+                self.convertToDB(obj.db_prune, 'int', 'int')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_tags:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[8], 'long', 'int')
+            parentType = self.convertFromDB(row[9], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            parent = self.convertFromDB(row[12], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_loop_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistrySQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecSQLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_1/persistence/sql/sql_dao.py b/vistrails/db/versions/v1_0_1/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..ad01dc5
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/sql/sql_dao.py
@@ -0,0 +1,183 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                # return "'" + str(value).replace("'", "''") + "'"
+                return str(value)
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                return str(value)
+            elif type == 'int':
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v1_0_1/persistence/xml/__init__.py b/vistrails/db/versions/v1_0_1/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_1/persistence/xml/auto_gen.py b/vistrails/db/versions/v1_0_1/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..95973ad
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/xml/auto_gen.py
@@ -0,0 +1,3845 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v1_0_1.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBOpmProcessIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmWasGeneratedByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasGeneratedBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasGeneratedBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_generated_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasGeneratedBy')
+        
+        # set elements
+        effect = opm_was_generated_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_generated_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_generated_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_generated_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_generated_by.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmAccountsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'accounts':
+            return None
+        
+        accounts = []
+        opm_overlapss = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'overlaps':
+                _data = self.getDao('opm_overlaps').fromXML(child)
+                opm_overlapss.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccounts(accounts=accounts,
+                            opm_overlapss=opm_overlapss)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_accounts, node=None):
+        if node is None:
+            node = ElementTree.Element('accounts')
+        
+        # set elements
+        accounts = opm_accounts.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account').toXML(account, childNode)
+        opm_overlapss = opm_accounts.db_opm_overlapss
+        for opm_overlaps in opm_overlapss:
+            childNode = ElementTree.SubElement(node, 'overlaps')
+            self.getDao('opm_overlaps').toXML(opm_overlaps, childNode)
+        
+        return node
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('optional', None)
+        optional = self.convertFromStr(data, 'int')
+        data = node.get('sortKey', None)
+        sort_key = self.convertFromStr(data, 'int')
+        data = node.get('sigstring', None)
+        sigstring = self.convertFromStr(data, 'str')
+        data = node.get('labels', None)
+        labels = self.convertFromStr(data, 'str')
+        data = node.get('defaults', None)
+        defaults = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         optional=optional,
+                         sort_key=sort_key,
+                         sigstring=sigstring,
+                         labels=labels,
+                         defaults=defaults)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('optional',self.convertToStr(portSpec.db_optional, 'int'))
+        node.set('sortKey',self.convertToStr(portSpec.db_sort_key, 'int'))
+        node.set('sigstring',self.convertToStr(portSpec.db_sigstring, 'str'))
+        node.set('labels',self.convertToStr(portSpec.db_labels, 'str'))
+        node.set('defaults',self.convertToStr(portSpec.db_defaults, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       tag=tag,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        node.set('tag',self.convertToStr(module.db_tag, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBModuleDescriptorXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleDescriptor':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('packageVersion', None)
+        package_version = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('baseDescriptorId', None)
+        base_descriptor_id = self.convertFromStr(data, 'long')
+        
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleDescriptor(id=id,
+                                 name=name,
+                                 package=package,
+                                 namespace=namespace,
+                                 package_version=package_version,
+                                 version=version,
+                                 base_descriptor_id=base_descriptor_id,
+                                 portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_descriptor, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleDescriptor')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_descriptor.db_id, 'long'))
+        node.set('name',self.convertToStr(module_descriptor.db_name, 'str'))
+        node.set('package',self.convertToStr(module_descriptor.db_package, 'str'))
+        node.set('namespace',self.convertToStr(module_descriptor.db_namespace, 'str'))
+        node.set('packageVersion',self.convertToStr(module_descriptor.db_package_version, 'str'))
+        node.set('version',self.convertToStr(module_descriptor.db_version, 'str'))
+        node.set('baseDescriptorId',self.convertToStr(module_descriptor.db_base_descriptor_id, 'long'))
+        
+        # set elements
+        portSpecs = module_descriptor.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBOpmRoleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'role':
+            return None
+        
+        # read attributes
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmRole(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_role, node=None):
+        if node is None:
+            node = ElementTree.Element('role')
+        
+        # set attributes
+        node.set('value',self.convertToStr(opm_role.db_value, 'str'))
+        
+        return node
+
+class DBOpmProcessesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'processes':
+            return None
+        
+        processs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'process':
+                _data = self.getDao('opm_process').fromXML(child)
+                processs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcesses(processs=processs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_processes, node=None):
+        if node is None:
+            node = ElementTree.Element('processes')
+        
+        # set elements
+        processs = opm_processes.db_processs
+        for process in processs:
+            childNode = ElementTree.SubElement(node, 'process')
+            self.getDao('opm_process').toXML(process, childNode)
+        
+        return node
+
+class DBOpmAccountIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAccountId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account_id, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account_id.db_id, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('signature', None)
+        signature = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     signature=signature)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('signature',self.convertToStr(port.db_signature, 'str'))
+        
+        return node
+
+class DBOpmArtifactXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifact':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_artifact_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifact(id=id,
+                            value=value,
+                            accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact, node=None):
+        if node is None:
+            node = ElementTree.Element('artifact')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact.db_id, 'str'))
+        
+        # set elements
+        value = opm_artifact.db_value
+        if value is not None:
+            childNode = ElementTree.SubElement(node, 'value')
+            self.getDao('opm_artifact_value').toXML(value, childNode)
+        accounts = opm_artifact.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      tag=tag,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        node.set('tag',self.convertToStr(group.db_tag, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child_tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflowExec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBOpmAgentsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agents':
+            return None
+        
+        agents = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'agent':
+                _data = self.getDao('opm_agent').fromXML(child)
+                agents.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgents(agents=agents)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agents, node=None):
+        if node is None:
+            node = ElementTree.Element('agents')
+        
+        # set elements
+        agents = opm_agents.db_agents
+        for agent in agents:
+            childNode = ElementTree.SubElement(node, 'agent')
+            self.getDao('opm_agent').toXML(agent, childNode)
+        
+        return node
+
+class DBOpmProcessIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        value = other.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBOpmOverlapsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'overlaps':
+            return None
+        
+        opm_account_ids = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                opm_account_ids.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmOverlaps(opm_account_ids=opm_account_ids)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_overlaps, node=None):
+        if node is None:
+            node = ElementTree.Element('overlaps')
+        
+        # set elements
+        opm_account_ids = opm_overlaps.db_opm_account_ids
+        for opm_account_id in opm_account_ids:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(opm_account_id, childNode)
+        
+        return node
+
+class DBOpmArtifactsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifacts':
+            return None
+        
+        artifacts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'artifact':
+                _data = self.getDao('opm_artifact').fromXML(child)
+                artifacts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifacts(artifacts=artifacts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifacts, node=None):
+        if node is None:
+            node = ElementTree.Element('artifacts')
+        
+        # set elements
+        artifacts = opm_artifacts.db_artifacts
+        for artifact in artifacts:
+            childNode = ElementTree.SubElement(node, 'artifact')
+            self.getDao('opm_artifact').toXML(artifact, childNode)
+        
+        return node
+
+class DBOpmDependenciesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'causalDependencies':
+            return None
+        
+        dependencys = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'used':
+                _data = self.getDao('opm_used').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasGeneratedBy':
+                _data = self.getDao('opm_was_generated_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasTriggeredBy':
+                _data = self.getDao('opm_was_triggered_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasDerivedFrom':
+                _data = self.getDao('opm_was_derived_from').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasControlledBy':
+                _data = self.getDao('opm_was_controlled_by').fromXML(child)
+                dependencys.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmDependencies(dependencys=dependencys)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_dependencies, node=None):
+        if node is None:
+            node = ElementTree.Element('causalDependencies')
+        
+        # set elements
+        dependencys = opm_dependencies.db_dependencys
+        for dependency in dependencys:
+            if dependency.vtType == 'opm_used':
+                childNode = ElementTree.SubElement(node, 'used')
+                self.getDao('opm_used').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_generated_by':
+                childNode = ElementTree.SubElement(node, 'wasGeneratedBy')
+                self.getDao('opm_was_generated_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_triggered_by':
+                childNode = ElementTree.SubElement(node, 'wasTriggeredBy')
+                self.getDao('opm_was_triggered_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_derived_from':
+                childNode = ElementTree.SubElement(node, 'wasDerivedFrom')
+                self.getDao('opm_was_derived_from').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_controlled_by':
+                childNode = ElementTree.SubElement(node, 'wasControlledBy')
+                self.getDao('opm_was_controlled_by').toXML(dependency, childNode)
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBOpmUsedXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'used':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmUsed(effect=effect,
+                        role=role,
+                        cause=cause,
+                        accounts=accounts,
+                        opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_used, node=None):
+        if node is None:
+            node = ElementTree.Element('used')
+        
+        # set elements
+        effect = opm_used.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_used.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_used.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_used.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_used.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('internalVersion', None)
+        internal_version = self.convertFromStr(data, 'str')
+        data = node.get('tag', None)
+        tag = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            internal_version=internal_version,
+                            tag=tag,
+                            location=location,
+                            functions=functions,
+                            annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('cache',self.convertToStr(abstraction.db_cache, 'int'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        node.set('namespace',self.convertToStr(abstraction.db_namespace, 'str'))
+        node.set('package',self.convertToStr(abstraction.db_package, 'str'))
+        node.set('version',self.convertToStr(abstraction.db_version, 'str'))
+        node.set('internalVersion',self.convertToStr(abstraction.db_internal_version, 'str'))
+        node.set('tag',self.convertToStr(abstraction.db_tag, 'str'))
+        
+        # set elements
+        location = abstraction.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstraction.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstraction.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            childNode = ElementTree.SubElement(node, 'plugin_data')
+            self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBOpmArtifactIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBOpmArtifactValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                value = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifactValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_artifact_value.db_value
+        if value is not None:
+            if value.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(value, childNode)
+            elif value.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(value, childNode)
+        
+        return node
+
+class DBOpmArtifactIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmGraphXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'opmGraph':
+            return None
+        
+        accounts = None
+        processes = None
+        artifacts = None
+        agents = None
+        dependencies = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'accounts':
+                _data = self.getDao('opm_accounts').fromXML(child)
+                accounts = _data
+            elif child_tag == 'processes':
+                _data = self.getDao('opm_processes').fromXML(child)
+                processes = _data
+            elif child_tag == 'artifacts':
+                _data = self.getDao('opm_artifacts').fromXML(child)
+                artifacts = _data
+            elif child_tag == 'agents':
+                _data = self.getDao('opm_agents').fromXML(child)
+                agents = _data
+            elif child_tag == 'causalDependencies':
+                _data = self.getDao('opm_dependencies').fromXML(child)
+                dependencies = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmGraph(accounts=accounts,
+                         processes=processes,
+                         artifacts=artifacts,
+                         agents=agents,
+                         dependencies=dependencies)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_graph, node=None):
+        if node is None:
+            node = ElementTree.Element('opmGraph')
+        
+        # set elements
+        accounts = opm_graph.db_accounts
+        if accounts is not None:
+            childNode = ElementTree.SubElement(node, 'accounts')
+            self.getDao('opm_accounts').toXML(accounts, childNode)
+        processes = opm_graph.db_processes
+        if processes is not None:
+            childNode = ElementTree.SubElement(node, 'processes')
+            self.getDao('opm_processes').toXML(processes, childNode)
+        artifacts = opm_graph.db_artifacts
+        if artifacts is not None:
+            childNode = ElementTree.SubElement(node, 'artifacts')
+            self.getDao('opm_artifacts').toXML(artifacts, childNode)
+        agents = opm_graph.db_agents
+        if agents is not None:
+            childNode = ElementTree.SubElement(node, 'agents')
+            self.getDao('opm_agents').toXML(agents, childNode)
+        dependencies = opm_graph.db_dependencies
+        if dependencies is not None:
+            childNode = ElementTree.SubElement(node, 'causalDependencies')
+            self.getDao('opm_dependencies').toXML(dependencies, childNode)
+        
+        return node
+
+class DBRegistryXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'registry':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('rootDescriptorId', None)
+        root_descriptor_id = self.convertFromStr(data, 'long')
+        
+        packages = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'package':
+                _data = self.getDao('package').fromXML(child)
+                packages.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBRegistry(id=id,
+                         version=version,
+                         root_descriptor_id=root_descriptor_id,
+                         packages=packages)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, registry, node=None):
+        if node is None:
+            node = ElementTree.Element('registry')
+        
+        # set attributes
+        node.set('id',self.convertToStr(registry.db_id, 'long'))
+        node.set('version',self.convertToStr(registry.db_version, 'str'))
+        node.set('rootDescriptorId',self.convertToStr(registry.db_root_descriptor_id, 'long'))
+        
+        # set elements
+        packages = registry.db_packages
+        for package in packages:
+            childNode = ElementTree.SubElement(node, 'package')
+            self.getDao('package').toXML(package, childNode)
+        
+        return node
+
+class DBOpmAccountXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccount(id=id,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account.db_id, 'str'))
+        
+        # set elements
+        value = opm_account.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOpmWasDerivedFromXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasDerivedFrom':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasDerivedFrom(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_derived_from, node=None):
+        if node is None:
+            node = ElementTree.Element('wasDerivedFrom')
+        
+        # set elements
+        effect = opm_was_derived_from.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_derived_from.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_derived_from.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_was_derived_from.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_derived_from.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmWasControlledByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasControlledBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        starts = []
+        ends = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'agent':
+                _data = self.getDao('opm_agent_id').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                starts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                ends.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasControlledBy(effect=effect,
+                                   role=role,
+                                   cause=cause,
+                                   accounts=accounts,
+                                   starts=starts,
+                                   ends=ends)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_controlled_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasControlledBy')
+        
+        # set elements
+        effect = opm_was_controlled_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_controlled_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_controlled_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'agent')
+            self.getDao('opm_agent_id').toXML(cause, childNode)
+        accounts = opm_was_controlled_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        starts = opm_was_controlled_by.db_starts
+        for start in starts:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(start, childNode)
+        ends = opm_was_controlled_by.db_ends
+        for end in ends:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(end, childNode)
+        
+        return node
+
+class DBOpmAgentIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAgentId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent_id, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent_id.db_id, 'str'))
+        
+        return node
+
+class DBGroupExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'groupExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('groupName', None)
+        group_name = self.convertFromStr(data, 'str')
+        data = node.get('groupType', None)
+        group_type = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroupExec(item_execs=item_execs,
+                          id=id,
+                          ts_start=ts_start,
+                          ts_end=ts_end,
+                          cached=cached,
+                          module_id=module_id,
+                          group_name=group_name,
+                          group_type=group_type,
+                          completed=completed,
+                          error=error,
+                          machine_id=machine_id,
+                          annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('groupExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(group_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(group_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(group_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(group_exec.db_module_id, 'long'))
+        node.set('groupName',self.convertToStr(group_exec.db_group_name, 'str'))
+        node.set('groupType',self.convertToStr(group_exec.db_group_type, 'str'))
+        node.set('completed',self.convertToStr(group_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(group_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(group_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = group_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        item_execs = group_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBOpmTimeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'time':
+            return None
+        
+        # read attributes
+        data = node.get('noLaterThan', None)
+        no_later_than = self.convertFromStr(data, 'datetime')
+        data = node.get('noEarlierThan', None)
+        no_earlier_than = self.convertFromStr(data, 'datetime')
+        data = node.get('clockId', None)
+        clock_id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmTime(no_later_than=no_later_than,
+                        no_earlier_than=no_earlier_than,
+                        clock_id=clock_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_time, node=None):
+        if node is None:
+            node = ElementTree.Element('time')
+        
+        # set attributes
+        node.set('noLaterThan',self.convertToStr(opm_time.db_no_later_than, 'datetime'))
+        node.set('noEarlierThan',self.convertToStr(opm_time.db_no_earlier_than, 'datetime'))
+        node.set('clockId',self.convertToStr(opm_time.db_clock_id, 'str'))
+        
+        return node
+
+class DBPackageXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'package':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('identifier', None)
+        identifier = self.convertFromStr(data, 'str')
+        data = node.get('codepath', None)
+        codepath = self.convertFromStr(data, 'str')
+        data = node.get('loadConfiguration', None)
+        load_configuration = self.convertFromStr(data, 'int')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('description', None)
+        description = self.convertFromStr(data, 'str')
+        
+        module_descriptors = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleDescriptor':
+                _data = self.getDao('module_descriptor').fromXML(child)
+                module_descriptors.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPackage(id=id,
+                        name=name,
+                        identifier=identifier,
+                        codepath=codepath,
+                        load_configuration=load_configuration,
+                        version=version,
+                        description=description,
+                        module_descriptors=module_descriptors)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, package, node=None):
+        if node is None:
+            node = ElementTree.Element('package')
+        
+        # set attributes
+        node.set('id',self.convertToStr(package.db_id, 'long'))
+        node.set('name',self.convertToStr(package.db_name, 'str'))
+        node.set('identifier',self.convertToStr(package.db_identifier, 'str'))
+        node.set('codepath',self.convertToStr(package.db_codepath, 'str'))
+        node.set('loadConfiguration',self.convertToStr(package.db_load_configuration, 'int'))
+        node.set('version',self.convertToStr(package.db_version, 'str'))
+        node.set('description',self.convertToStr(package.db_description, 'str'))
+        
+        # set elements
+        module_descriptors = package.db_module_descriptors
+        for module_descriptor in module_descriptors:
+            childNode = ElementTree.SubElement(node, 'moduleDescriptor')
+            self.getDao('module_descriptor').toXML(module_descriptor, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(item_execs=item_execs,
+                             id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        item_execs = workflow_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBLoopExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'loopExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('iteration', None)
+        iteration = self.convertFromStr(data, 'int')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLoopExec(item_execs=item_execs,
+                         id=id,
+                         ts_start=ts_start,
+                         ts_end=ts_end,
+                         iteration=iteration,
+                         completed=completed,
+                         error=error)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, loop_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('loopExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(loop_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(loop_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(loop_exec.db_ts_end, 'datetime'))
+        node.set('iteration',self.convertToStr(loop_exec.db_iteration, 'int'))
+        node.set('completed',self.convertToStr(loop_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(loop_exec.db_error, 'str'))
+        
+        # set elements
+        item_execs = loop_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBOpmProcessXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'process':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_process_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcess(id=id,
+                           value=value,
+                           accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process, node=None):
+        if node is None:
+            node = ElementTree.Element('process')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process.db_id, 'str'))
+        
+        # set elements
+        value = opm_process.db_value
+        if value is not None:
+            childNode = ElementTree.SubElement(node, 'value')
+            self.getDao('opm_process_value').toXML(value, childNode)
+        accounts = opm_process.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBOpmWasTriggeredByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasTriggeredBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasTriggeredBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_triggered_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasTriggeredBy')
+        
+        # set elements
+        effect = opm_was_triggered_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_triggered_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_triggered_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_triggered_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_triggered_by.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmProcessValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcessValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_process_value.db_value
+        if value is not None:
+            if value.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(value, childNode)
+            elif value.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(value, childNode)
+            elif value.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(value, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('prune', None)
+        prune = self.convertFromStr(data, 'int')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       prune=prune,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        node.set('prune',self.convertToStr(action.db_prune, 'int'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBOpmAgentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgent(id=id,
+                         value=value,
+                         accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent.db_id, 'str'))
+        
+        # set elements
+        value = opm_agent.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        accounts = opm_agent.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child_tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        loop_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                loop_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           machine_id=machine_id,
+                           annotations=annotations,
+                           loop_execs=loop_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        loop_execs = module_exec.db_loop_execs
+        for loop_exec in loop_execs:
+            childNode = ElementTree.SubElement(node, 'loopExec')
+            self.getDao('loop_exec').toXML(loop_exec, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'opm_process_id_effect' not in self:
+            self['opm_process_id_effect'] = DBOpmProcessIdEffectXMLDAOBase(self)
+        if 'opm_was_generated_by' not in self:
+            self['opm_was_generated_by'] = DBOpmWasGeneratedByXMLDAOBase(self)
+        if 'opm_accounts' not in self:
+            self['opm_accounts'] = DBOpmAccountsXMLDAOBase(self)
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'opm_role' not in self:
+            self['opm_role'] = DBOpmRoleXMLDAOBase(self)
+        if 'opm_processes' not in self:
+            self['opm_processes'] = DBOpmProcessesXMLDAOBase(self)
+        if 'opm_account_id' not in self:
+            self['opm_account_id'] = DBOpmAccountIdXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'opm_artifact' not in self:
+            self['opm_artifact'] = DBOpmArtifactXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'opm_agents' not in self:
+            self['opm_agents'] = DBOpmAgentsXMLDAOBase(self)
+        if 'opm_process_id_cause' not in self:
+            self['opm_process_id_cause'] = DBOpmProcessIdCauseXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'opm_overlaps' not in self:
+            self['opm_overlaps'] = DBOpmOverlapsXMLDAOBase(self)
+        if 'opm_artifacts' not in self:
+            self['opm_artifacts'] = DBOpmArtifactsXMLDAOBase(self)
+        if 'opm_dependencies' not in self:
+            self['opm_dependencies'] = DBOpmDependenciesXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'opm_used' not in self:
+            self['opm_used'] = DBOpmUsedXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'opm_artifact_id_cause' not in self:
+            self['opm_artifact_id_cause'] = DBOpmArtifactIdCauseXMLDAOBase(self)
+        if 'opm_artifact_value' not in self:
+            self['opm_artifact_value'] = DBOpmArtifactValueXMLDAOBase(self)
+        if 'opm_artifact_id_effect' not in self:
+            self['opm_artifact_id_effect'] = DBOpmArtifactIdEffectXMLDAOBase(self)
+        if 'opm_graph' not in self:
+            self['opm_graph'] = DBOpmGraphXMLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistryXMLDAOBase(self)
+        if 'opm_account' not in self:
+            self['opm_account'] = DBOpmAccountXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'opm_was_derived_from' not in self:
+            self['opm_was_derived_from'] = DBOpmWasDerivedFromXMLDAOBase(self)
+        if 'opm_was_controlled_by' not in self:
+            self['opm_was_controlled_by'] = DBOpmWasControlledByXMLDAOBase(self)
+        if 'opm_agent_id' not in self:
+            self['opm_agent_id'] = DBOpmAgentIdXMLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecXMLDAOBase(self)
+        if 'opm_time' not in self:
+            self['opm_time'] = DBOpmTimeXMLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'opm_process' not in self:
+            self['opm_process'] = DBOpmProcessXMLDAOBase(self)
+        if 'opm_was_triggered_by' not in self:
+            self['opm_was_triggered_by'] = DBOpmWasTriggeredByXMLDAOBase(self)
+        if 'opm_process_value' not in self:
+            self['opm_process_value'] = DBOpmProcessValueXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'opm_agent' not in self:
+            self['opm_agent'] = DBOpmAgentXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_1/persistence/xml/xml_dao.py b/vistrails/db/versions/v1_0_1/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..955c01a
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/persistence/xml/xml_dao.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v1_0_1/schemas/sql/vistrails.sql b/vistrails/db/versions/v1_0_1/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..badb7af
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/schemas/sql/vistrails.sql
@@ -0,0 +1,382 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+CREATE TABLE `vistrails_version`(`version` char(16)) engine=InnoDB;
+INSERT INTO `vistrails_version`(`version`) VALUES ('1.0.1');
+
+CREATE TABLE thumbnail(
+    id int not null auto_increment primary key,
+    file_name varchar(255),
+    image_bytes mediumblob,
+    last_modified datetime
+) engine=InnoDB;
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(255),
+    type varchar(255),
+    optional int,
+    sort_key int,
+    sigstring varchar(4095),
+    labels varchar(4095),
+    defaults varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module_descriptor(
+    id int,
+    name varchar(255),
+    package varchar(255),
+    namespace varchar(255),
+    package_version varchar(255),
+    version varchar(255),
+    base_descriptor_id int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    signature varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    internal_version varchar(255),
+    tag varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE registry(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    root_descriptor_id int,
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE group_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    group_name varchar(255),
+    group_type varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE package(
+    id int not null auto_increment primary key,
+    name varchar(255),
+    identifier varchar(1023),
+    codepath varchar(1023),
+    load_configuration int,
+    version varchar(255),
+    description varchar(1023),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE loop_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    iteration int,
+    completed int,
+    error varchar(1023),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    prune int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v1_0_1/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v1_0_1/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..47043c1
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,42 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+DROP TABLE IF EXISTS `vistrails_version`;
+
+DROP TABLE IF EXISTS thumbnail;
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, module_descriptor, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, plugin_data, function, abstraction, workflow, registry, annotation, change_tbl, group_exec, package, workflow_exec, loop_exec, connection_tbl, action, delete_tbl, vistrail, module_exec;
diff --git a/vistrails/db/versions/v1_0_1/schemas/xml/vistrail.xsd b/vistrails/db/versions/v1_0_1/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..997f9da
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/schemas/xml/vistrail.xsd
@@ -0,0 +1,280 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="prune" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="sigstring" type="xs:string"/>
+      <xs:attribute name="labels" type="xs:string"/>
+      <xs:attribute name="defaults" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="tag" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_1/schemas/xml/vtlink.xsd b/vistrails/db/versions/v1_0_1/schemas/xml/vtlink.xsd
new file mode 100644
index 0000000..6ae8bca
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/schemas/xml/vtlink.xsd
@@ -0,0 +1,55 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xs:element name="vtlink">
+<xs:complexType>
+<xs:attribute name="host" type="xs:string"></xs:attribute>
+<xs:attribute name="database" type="xs:string"></xs:attribute>
+<xs:attribute name="port" type="xs:int"></xs:attribute>
+<xs:attribute name="vtid" type="xs:int"></xs:attribute>
+<xs:attribute name="version" type="xs:int"></xs:attribute>
+<xs:attribute name="tag" type="xs:string"></xs:attribute>
+<xs:attribute name="url" type="xs:string"></xs:attribute>
+<xs:attribute name="vtcontent" type="xs:string"></xs:attribute>
+<xs:attribute name="execute" type="xs:boolean"></xs:attribute>
+<xs:attribute name="showSpreadsheetOnly" type="xs:boolean"></xs:attribute>
+<xs:attribute name="forceDB" type="xs:boolean"></xs:attribute>
+</xs:complexType>
+</xs:element>
+
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_1/specs/all.xml b/vistrails/db/versions/v1_0_1/specs/all.xml
new file mode 100644
index 0000000..60a5dba
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/specs/all.xml
@@ -0,0 +1,2699 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="prune" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="tag" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOOP_EXEC +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="loop_exec">
+    <layout>
+      <xml name="loopExec" nodeType="xs:element"/>
+      <sql table="loop_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <!--<property name="input" type="str">
+      <xml name="input" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>-->
+
+    <property name="iteration" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+      
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP_EXEC ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group_exec">
+    <layout>
+      <xml name="groupExec" nodeType="xs:element"/>
+      <sql table="group_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="group_name" type="str">
+      <xml name="groupName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="group_type" type="str">
+      <xml name="groupType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <!--<property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>-->
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="signature" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="optional" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sort_key" type="int">
+      <xml name="sortKey" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sigstring" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="labels" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="defaults" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="module_descriptor">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_DESCRIPTOR +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_descriptor">
+    <layout>
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+      <sql table="module_descriptor"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+	   
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package_version" type="str">
+      <xml name="packageVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="base_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="baseDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="package" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+    <!--
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="registry">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="package">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    -->
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PACKAGE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="package">
+    <layout>
+      <xml name="package" nodeType="xs:element"/>
+      <sql table="package"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="identifier" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="codepath" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+      
+    <property name="load_configuration" type="int">
+      <xml name="loadConfiguration" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>      
+
+    <property name="description" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_descriptor" type="list" 
+	      mapping="one-to-many" index="name:namespace:version">
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="registry" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- REGISTRY ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="registry">
+    <layout>
+      <xml name="registry" nodeType="xs:element"/>
+      <sql table="registry"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="root_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="rootDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <!-- <xml nodeType="xs:attribute" type="xs:string"/> -->
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="package" type="list"
+	      mapping="one-to-many" index="identifier:version">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="group" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_GRAPH +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_graph">
+    <layout>
+      <xml name="opmGraph" nodeType="xs:element"/>
+      <!-- <sql table="opm_graph"/> -->
+    </layout>
+
+    <property name="accounts" ref="true" object="opm_accounts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="processes" ref="true" object="opm_processes" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="artifacts" ref="true" object="opm_artifacts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="agents" ref="true" object="opm_agents" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="dependencies" ref="true" object="opm_dependencies" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNTS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_accounts">
+    <layout>
+      <xml name="accounts" nodeType="xs:element"/>
+      <!-- <sql table="accounts"/> -->
+    </layout>
+
+    <property name="account" ref="true" object="opm_account" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="opm_overlaps" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_account">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_OVERLAPS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_overlaps">
+    <layout>
+      <xml name="overlaps" nodeType="xs:element"/>
+      <!-- <sql table="overlaps"/> -->
+    </layout>
+
+    <property ref="true" object="opm_account_id" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACTS +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifacts">
+    <layout>
+      <xml name="artifacts" nodeType="xs:element"/>
+      <!-- <sql table="artifacts"/> -->
+    </layout>
+
+    <property name="artifact" ref="true" object="opm_artifact" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_VALUE ++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="artifact_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="portSpec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="function" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact">
+    <layout>
+      <xml name="artifact" nodeType="xs:element"/>
+      <!-- <sql table="artifact"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" ref="true" object="opm_artifact_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESSES +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_processes">
+    <layout>
+      <xml name="processes" nodeType="xs:element"/>
+      <!-- <sql table="processes"/> -->
+    </layout>
+
+    <property name="process" ref="true" object="opm_process" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_VALUE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="process_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="module_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process">
+    <layout>
+      <xml name="process" nodeType="xs:element"/>
+      <!-- <sql table="process"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="value" ref="true" object="opm_process_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENTS ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agents">
+    <layout>
+      <xml name="agents" nodeType="xs:element"/>
+      <!-- <sql table="agents"/> -->
+    </layout>
+
+    <property name="agent" ref="true" object="opm_agent" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agent">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type=""/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_DEPENDENCIES ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_dependencies">
+    <layout>
+      <xml name="causalDependencies" nodeType="xs:element"/>
+      <!-- <sql table="causal_dependencies"/> -->
+    </layout>
+
+    <choice name="dependency" type="list" mapping="one-to-many">
+      <property name="used" ref="true" object="opm_used">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_generated_by" ref="true" 
+		object="opm_was_generated_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_triggered_by" ref="true" 
+		object="opm_was_triggered_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_derived_from" ref="true" 
+		object="opm_was_derived_from">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_controlled_by" ref="true" 
+		object="opm_was_controlled_by">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_TIME ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_time">
+    <layout>
+      <xml name="time" nodeType="xs:element"/>
+      <!-- <sql table="time"/> -->
+    </layout>
+
+    <property name="no_later_than" type="datetime">
+      <xml name="noLaterThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="no_earlier_than" type="datetime">
+      <xml name="noEarlierThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="clock_id" type="str">
+      <xml name="clockId" nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT_ID ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_account_id">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_account">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_CAUSE ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="process_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_EFFECT +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="process_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_CAUSE +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_EFFECT ++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT_ID ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_agent_id">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_agent">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ROLE ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_role">
+    <layout>
+      <xml name="role" nodeType="xs:element"/>
+      <!-- <sql table="role"/> -->
+    </layout>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(4095)"/> -->
+    </property>
+  </object>
+  
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_USED ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_used">
+    <layout>
+      <xml name="used" nodeType="xs:element"/>
+      <!-- <sql table="used"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_GENERATED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_generated_by">
+    <layout>
+      <xml name="wasGeneratedBy" nodeType="xs:element"/>
+      <!-- <sql table="was_generated_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_CONTROLLED_BY +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_controlled_by">
+    <layout>
+      <xml name="wasControlledBy" nodeType="xs:element"/>
+      <!-- <sql table="was_controlled_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_agent_id"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="start" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="end" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_DERIVED_FROM ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_derived_from">
+    <layout>
+      <xml name="wasDerivedFrom" nodeType="xs:element"/>
+      <!-- <sql table="was_derived_from"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_TRIGGERED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_triggered_by">
+    <layout>
+      <xml name="wasTriggeredBy" nodeType="xs:element"/>
+      <!-- <sql table="was_triggered_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+</objects>
diff --git a/vistrails/db/versions/v1_0_1/translate/__init__.py b/vistrails/db/versions/v1_0_1/translate/__init__.py
new file mode 100644
index 0000000..ecda317
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.1'
diff --git a/vistrails/db/versions/v1_0_1/translate/v1_0_0.py b/vistrails/db/versions/v1_0_1/translate/v1_0_0.py
new file mode 100644
index 0000000..8cc7274
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/translate/v1_0_0.py
@@ -0,0 +1,80 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v1_0_1.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry, DBModuleDescriptor, DBGroup
+
+def translateVistrail(_vistrail):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    vistrail.db_version = '1.0.1'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '1.0.1'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.1'
+    return log
+
+def translateRegistry(_registry):
+    def update_descriptors(old_obj, translate_dict):
+        def get_update_method(package_version):
+            def update_package_version(old_desc, t_dict):
+                return package_version
+            return update_package_version
+
+        descriptors = []
+        for descriptor in old_obj.db_module_descriptors:
+            new_t_dict = {'DBModuleDescriptor': 
+                          {'package_version': \
+                               get_update_method(old_obj.db_version)}}
+            d = DBModuleDescriptor.update_version(descriptor, new_t_dict)
+            descriptors.append(d)
+        return descriptors
+
+    translate_dict = {'DBPackage': {'module_descriptors': update_descriptors}}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '1.0.1'
+    return registry
diff --git a/vistrails/db/versions/v1_0_1/translate/v1_0_2.py b/vistrails/db/versions/v1_0_1/translate/v1_0_2.py
new file mode 100644
index 0000000..6f16c1c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_1/translate/v1_0_2.py
@@ -0,0 +1,193 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v1_0_1.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry, DBGroup, DBTag, DBAnnotation, DBAction, IdScope
+
+def translateVistrail(_vistrail):
+    tag_annotations = {}
+    notes_annotations = {}
+    thumb_annotations = {}
+    upgrade_annotations = {}
+    prune_annotations = {}
+
+    del_tag_annotations = {}
+    del_notes_annotations = {}
+    del_thumb_annotations = {}
+    del_upgrade_annotations = {}
+    del_prune_annotations = {}
+
+    key_lists = {'__tag__': tag_annotations,
+                 '__notes__': notes_annotations,
+                 '__thumb__': thumb_annotations,
+                 '__upgrade__': upgrade_annotations,
+                 '__prune__': prune_annotations}
+
+    del_key_lists = {'__tag__': del_tag_annotations,
+                     '__notes__': del_notes_annotations,
+                     '__thumb__': del_thumb_annotations,
+                     '__upgrade__': del_upgrade_annotations,
+                     '__prune__': del_prune_annotations}
+
+    _vistrail.update_id_scope()
+    id_scope = _vistrail.idScope
+
+    def update_tags(old_obj, translate_dict):
+        new_tags = []
+        for (id, (_, tag, is_new, is_dirty)) in tag_annotations.iteritems():
+            new_tag = DBTag(id=id, name=tag)
+            new_tag.is_new = is_new
+            new_tag.is_dirty = is_dirty
+            new_tags.append(new_tag)
+        return new_tags
+
+    def update_prune(old_obj, translate_dict):
+        if old_obj.db_id in prune_annotations:
+            (_, prune_val, _, _) = prune_annotations[old_obj.db_id]
+            if prune_val == str(True):
+                return 1
+            elif prune_val == str(False):
+                return 0
+        return None
+
+    def update_annotations(old_obj, translate_dict):
+        new_annotations = [DBAnnotation.update_version(a, translate_dict)
+                           for a in old_obj.db_annotations]
+        if old_obj.db_id in notes_annotations:
+            (id, notes, is_new, is_dirty) = notes_annotations[old_obj.db_id]
+            ann = DBAnnotation(id=id,
+                               key='__notes__',
+                               value=notes)
+            ann.is_new = is_new
+            ann.is_dirty = is_dirty
+            new_annotations.append(ann)
+        if old_obj.db_id in upgrade_annotations:
+            (id, upgrade, is_new, is_dirty) = \
+                upgrade_annotations[old_obj.db_id]
+            ann =  DBAnnotation(id=id,
+                                key='__upgrade__',
+                                value=upgrade)
+            ann.is_new = is_new
+            ann.is_dirty = is_dirty
+            new_annotations.append(ann)
+        if old_obj.db_id in thumb_annotations:
+            (id, thumb, is_new, is_dirty) = thumb_annotations[old_obj.db_id]
+            ann = DBAnnotation(id=id,
+                               key='__thumb__',
+                               value=thumb)
+            ann.is_new = is_new
+            ann.is_dirty = is_dirty
+            new_annotations.append(ann)
+        return new_annotations
+
+    def update_actions(old_obj, translate_dict):
+        new_actions = []
+        for action in old_obj.db_actions:
+            if action.db_id in del_notes_annotations:
+                (id, notes, is_new, is_dirty) = \
+                    del_notes_annotations[action.db_id]
+                ann = DBAnnotation(id=id,
+                                   key='__notes__',
+                                   value=notes)
+                ann.is_new = is_new
+                ann.is_dirty = is_dirty
+                action.db_deleted_annotations.append(ann)
+            if action.db_id in del_upgrade_annotations:
+                (id, upgrade, is_new, is_dirty) = \
+                    del_upgrade_annotations[action.db_id]
+                ann = DBAnnotation(id=id,
+                                   key='__upgrade__',
+                                   value=upgrade)
+                ann.is_new = is_new
+                ann.is_dirty = is_dirty
+                action.db_deleted_annotations.append(ann)
+            if action.db_id in del_thumb_annotations:
+                (id, thumb, is_new, is_dirty) = \
+                    del_thumb_annotations[action.db_id]
+                ann = DBAnnotation(id=id,
+                                   key='__thumb__',
+                                   value=thumb)
+                ann.is_new = is_new
+                ann.is_dirty = is_dirty
+                action.db_deleted_annotations.append(ann)                
+            new_actions.append(DBAction.update_version(action, translate_dict))
+        return new_actions
+
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    for a in _vistrail.db_actionAnnotations:
+        if a.db_key in key_lists:
+            key_lists[a.db_key][a.db_action_id] = \
+                (a.db_id, a.db_value, a.is_new, a.is_dirty)
+    for a in _vistrail.db_deleted_actionAnnotations:
+        if a.db_key in del_key_lists:
+            del_key_lists[a.db_key][a.db_action_id] = \
+                (a.db_id, a.db_value, a.is_new, a.is_dirty)
+
+    translate_dict = {'DBGroup': {'workflow': update_workflow},
+                      'DBVistrail': {'tags': update_tags,
+                                     'actions': update_actions},
+                      'DBAction': {'annotations': update_annotations,
+                                   'prune': update_prune}}
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+    for (id, (_, tag, is_new, is_dirty)) in del_tag_annotations.iteritems():
+        new_tag = DBTag(id=id, name=tag)
+        new_tag.is_new = is_new
+        new_tag.is_dirty = is_dirty
+        vistrail.db_deleted_tags.append(new_tag)
+    
+    vistrail.db_version = '1.0.1'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '1.0.1'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.1'
+    return log
+
+def translateRegistry(_registry):
+    translate_dict = {}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '1.0.1'
+    return registry
diff --git a/vistrails/db/versions/v1_0_2/__init__.py b/vistrails/db/versions/v1_0_2/__init__.py
new file mode 100644
index 0000000..0e024b6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.2'
diff --git a/vistrails/db/versions/v1_0_2/domain/__init__.py b/vistrails/db/versions/v1_0_2/domain/__init__.py
new file mode 100644
index 0000000..a8208f6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from registry import DBRegistry
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v1_0_2/domain/auto_gen.py b/vistrails/db/versions/v1_0_2/domain/auto_gen.py
new file mode 100644
index 0000000..3934e4f
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/auto_gen.py
@@ -0,0 +1,11719 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBOpmProcessIdEffect(object):
+
+    vtType = 'opm_process_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmWasGeneratedBy(object):
+
+    vtType = 'opm_was_generated_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasGeneratedBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasGeneratedBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasGeneratedBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmAccounts(object):
+
+    vtType = 'opm_accounts'
+
+    def __init__(self, accounts=None, opm_overlapss=None):
+        self.db_deleted_accounts = []
+        self.db_accounts_id_index = {}
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+            for v in self._db_accounts:
+                self.db_accounts_id_index[v.db_id] = v
+        self.db_deleted_opm_overlapss = []
+        if opm_overlapss is None:
+            self._db_opm_overlapss = []
+        else:
+            self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccounts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccounts()
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_overlapss is None:
+            cp._db_opm_overlapss = []
+        else:
+            cp._db_opm_overlapss = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_overlapss]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_accounts_id_index = dict((v.db_id, v) for v in cp._db_accounts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccounts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccount.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccount.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_overlapss' in class_dict:
+            res = class_dict['opm_overlapss'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_overlaps(obj)
+        elif hasattr(old_obj, 'db_opm_overlapss') and old_obj.db_opm_overlapss is not None:
+            for obj in old_obj.db_opm_overlapss:
+                new_obj.db_add_opm_overlaps(DBOpmOverlaps.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_overlapss') and hasattr(new_obj, 'db_deleted_opm_overlapss'):
+            for obj in old_obj.db_deleted_opm_overlapss:
+                n_obj = DBOpmOverlaps.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_overlapss.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_overlapss:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_overlaps(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_overlapss)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_overlapss = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_overlapss:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_change_account(self, account):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                self._db_accounts[i] = account
+                found = True
+                break
+        if not found:
+            self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                if not self._db_accounts[i].is_new:
+                    self.db_deleted_accounts.append(self._db_accounts[i])
+                del self._db_accounts[i]
+                break
+        del self.db_accounts_id_index[account.db_id]
+    def db_get_account(self, key):
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == key:
+                return self._db_accounts[i]
+        return None
+    def db_get_account_by_id(self, key):
+        return self.db_accounts_id_index[key]
+    def db_has_account_with_id(self, key):
+        return key in self.db_accounts_id_index
+    
+    def __get_db_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def __set_db_opm_overlapss(self, opm_overlapss):
+        self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+    db_opm_overlapss = property(__get_db_opm_overlapss, __set_db_opm_overlapss)
+    def db_get_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def db_add_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_change_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_delete_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_overlaps(self, key):
+        return None
+    
+
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, optional=None, sort_key=None, sigstring=None, labels=None, defaults=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_optional = optional
+        self._db_sort_key = sort_key
+        self._db_sigstring = sigstring
+        self._db_labels = labels
+        self._db_defaults = defaults
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        optional=self._db_optional,
+                        sort_key=self._db_sort_key,
+                        sigstring=self._db_sigstring,
+                        labels=self._db_labels,
+                        defaults=self._db_defaults)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'optional' in class_dict:
+            res = class_dict['optional'](old_obj, trans_dict)
+            new_obj.db_optional = res
+        elif hasattr(old_obj, 'db_optional') and old_obj.db_optional is not None:
+            new_obj.db_optional = old_obj.db_optional
+        if 'sort_key' in class_dict:
+            res = class_dict['sort_key'](old_obj, trans_dict)
+            new_obj.db_sort_key = res
+        elif hasattr(old_obj, 'db_sort_key') and old_obj.db_sort_key is not None:
+            new_obj.db_sort_key = old_obj.db_sort_key
+        if 'sigstring' in class_dict:
+            res = class_dict['sigstring'](old_obj, trans_dict)
+            new_obj.db_sigstring = res
+        elif hasattr(old_obj, 'db_sigstring') and old_obj.db_sigstring is not None:
+            new_obj.db_sigstring = old_obj.db_sigstring
+        if 'labels' in class_dict:
+            res = class_dict['labels'](old_obj, trans_dict)
+            new_obj.db_labels = res
+        elif hasattr(old_obj, 'db_labels') and old_obj.db_labels is not None:
+            new_obj.db_labels = old_obj.db_labels
+        if 'defaults' in class_dict:
+            res = class_dict['defaults'](old_obj, trans_dict)
+            new_obj.db_defaults = res
+        elif hasattr(old_obj, 'db_defaults') and old_obj.db_defaults is not None:
+            new_obj.db_defaults = old_obj.db_defaults
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_optional(self):
+        return self._db_optional
+    def __set_db_optional(self, optional):
+        self._db_optional = optional
+        self.is_dirty = True
+    db_optional = property(__get_db_optional, __set_db_optional)
+    def db_add_optional(self, optional):
+        self._db_optional = optional
+    def db_change_optional(self, optional):
+        self._db_optional = optional
+    def db_delete_optional(self, optional):
+        self._db_optional = None
+    
+    def __get_db_sort_key(self):
+        return self._db_sort_key
+    def __set_db_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+        self.is_dirty = True
+    db_sort_key = property(__get_db_sort_key, __set_db_sort_key)
+    def db_add_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_change_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_delete_sort_key(self, sort_key):
+        self._db_sort_key = None
+    
+    def __get_db_sigstring(self):
+        return self._db_sigstring
+    def __set_db_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+        self.is_dirty = True
+    db_sigstring = property(__get_db_sigstring, __set_db_sigstring)
+    def db_add_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_change_sigstring(self, sigstring):
+        self._db_sigstring = sigstring
+    def db_delete_sigstring(self, sigstring):
+        self._db_sigstring = None
+    
+    def __get_db_labels(self):
+        return self._db_labels
+    def __set_db_labels(self, labels):
+        self._db_labels = labels
+        self.is_dirty = True
+    db_labels = property(__get_db_labels, __set_db_labels)
+    def db_add_labels(self, labels):
+        self._db_labels = labels
+    def db_change_labels(self, labels):
+        self._db_labels = labels
+    def db_delete_labels(self, labels):
+        self._db_labels = None
+    
+    def __get_db_defaults(self):
+        return self._db_defaults
+    def __set_db_defaults(self, defaults):
+        self._db_defaults = defaults
+        self.is_dirty = True
+    db_defaults = property(__get_db_defaults, __set_db_defaults)
+    def db_add_defaults(self, defaults):
+        self._db_defaults = defaults
+    def db_change_defaults(self, defaults):
+        self._db_defaults = defaults
+    def db_delete_defaults(self, defaults):
+        self._db_defaults = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleDescriptor(object):
+
+    vtType = 'module_descriptor'
+
+    def __init__(self, id=None, name=None, package=None, namespace=None, package_version=None, version=None, base_descriptor_id=None, portSpecs=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_package = package
+        self._db_namespace = namespace
+        self._db_package_version = package_version
+        self._db_version = version
+        self._db_base_descriptor_id = base_descriptor_id
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleDescriptor.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleDescriptor(id=self._db_id,
+                                name=self._db_name,
+                                package=self._db_package,
+                                namespace=self._db_namespace,
+                                package_version=self._db_package_version,
+                                version=self._db_version,
+                                base_descriptor_id=self._db_base_descriptor_id)
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_base_descriptor_id') and ('module_descriptor', self._db_base_descriptor_id) in id_remap:
+                cp._db_base_descriptor_id = id_remap[('module_descriptor', self._db_base_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleDescriptor()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package_version' in class_dict:
+            res = class_dict['package_version'](old_obj, trans_dict)
+            new_obj.db_package_version = res
+        elif hasattr(old_obj, 'db_package_version') and old_obj.db_package_version is not None:
+            new_obj.db_package_version = old_obj.db_package_version
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'base_descriptor_id' in class_dict:
+            res = class_dict['base_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_base_descriptor_id = res
+        elif hasattr(old_obj, 'db_base_descriptor_id') and old_obj.db_base_descriptor_id is not None:
+            new_obj.db_base_descriptor_id = old_obj.db_base_descriptor_id
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package_version(self):
+        return self._db_package_version
+    def __set_db_package_version(self, package_version):
+        self._db_package_version = package_version
+        self.is_dirty = True
+    db_package_version = property(__get_db_package_version, __set_db_package_version)
+    def db_add_package_version(self, package_version):
+        self._db_package_version = package_version
+    def db_change_package_version(self, package_version):
+        self._db_package_version = package_version
+    def db_delete_package_version(self, package_version):
+        self._db_package_version = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_base_descriptor_id(self):
+        return self._db_base_descriptor_id
+    def __set_db_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+        self.is_dirty = True
+    db_base_descriptor_id = property(__get_db_base_descriptor_id, __set_db_base_descriptor_id)
+    def db_add_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_change_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_delete_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = None
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmRole(object):
+
+    vtType = 'opm_role'
+
+    def __init__(self, value=None):
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmRole.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmRole(value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmRole()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+
+
+class DBOpmProcesses(object):
+
+    vtType = 'opm_processes'
+
+    def __init__(self, processs=None):
+        self.db_deleted_processs = []
+        self.db_processs_id_index = {}
+        if processs is None:
+            self._db_processs = []
+        else:
+            self._db_processs = processs
+            for v in self._db_processs:
+                self.db_processs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcesses.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcesses()
+        if self._db_processs is None:
+            cp._db_processs = []
+        else:
+            cp._db_processs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_processs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_processs_id_index = dict((v.db_id, v) for v in cp._db_processs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcesses()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'processs' in class_dict:
+            res = class_dict['processs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_process(obj)
+        elif hasattr(old_obj, 'db_processs') and old_obj.db_processs is not None:
+            for obj in old_obj.db_processs:
+                new_obj.db_add_process(DBOpmProcess.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processs') and hasattr(new_obj, 'db_deleted_processs'):
+            for obj in old_obj.db_deleted_processs:
+                n_obj = DBOpmProcess.update_version(obj, trans_dict)
+                new_obj.db_deleted_processs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_processs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_process(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_processs)
+        if remove:
+            self.db_deleted_processs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_processs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_processs(self):
+        return self._db_processs
+    def __set_db_processs(self, processs):
+        self._db_processs = processs
+        self.is_dirty = True
+    db_processs = property(__get_db_processs, __set_db_processs)
+    def db_get_processs(self):
+        return self._db_processs
+    def db_add_process(self, process):
+        self.is_dirty = True
+        self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_change_process(self, process):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                self._db_processs[i] = process
+                found = True
+                break
+        if not found:
+            self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_delete_process(self, process):
+        self.is_dirty = True
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                if not self._db_processs[i].is_new:
+                    self.db_deleted_processs.append(self._db_processs[i])
+                del self._db_processs[i]
+                break
+        del self.db_processs_id_index[process.db_id]
+    def db_get_process(self, key):
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == key:
+                return self._db_processs[i]
+        return None
+    def db_get_process_by_id(self, key):
+        return self.db_processs_id_index[key]
+    def db_has_process_with_id(self, key):
+        return key in self.db_processs_id_index
+    
+
+
+class DBOpmAccountId(object):
+
+    vtType = 'opm_account_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccountId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccountId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_account', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_account', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccountId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, signature=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_signature = signature
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    signature=self._db_signature)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'signature' in class_dict:
+            res = class_dict['signature'](old_obj, trans_dict)
+            new_obj.db_signature = res
+        elif hasattr(old_obj, 'db_signature') and old_obj.db_signature is not None:
+            new_obj.db_signature = old_obj.db_signature
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_signature(self):
+        return self._db_signature
+    def __set_db_signature(self, signature):
+        self._db_signature = signature
+        self.is_dirty = True
+    db_signature = property(__get_db_signature, __set_db_signature)
+    def db_add_signature(self, signature):
+        self._db_signature = signature
+    def db_change_signature(self, signature):
+        self._db_signature = signature
+    def db_delete_signature(self, signature):
+        self._db_signature = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifact(object):
+
+    vtType = 'opm_artifact'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifact.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifact(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifact()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmArtifactValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmArtifactValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgents(object):
+
+    vtType = 'opm_agents'
+
+    def __init__(self, agents=None):
+        self.db_deleted_agents = []
+        self.db_agents_id_index = {}
+        if agents is None:
+            self._db_agents = []
+        else:
+            self._db_agents = agents
+            for v in self._db_agents:
+                self.db_agents_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgents.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgents()
+        if self._db_agents is None:
+            cp._db_agents = []
+        else:
+            cp._db_agents = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_agents]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_agents_id_index = dict((v.db_id, v) for v in cp._db_agents)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgents()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_agent(obj)
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            for obj in old_obj.db_agents:
+                new_obj.db_add_agent(DBOpmAgent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgent.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_agents:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_agent(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_agents)
+        if remove:
+            self.db_deleted_agents = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_agents:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_get_agents(self):
+        return self._db_agents
+    def db_add_agent(self, agent):
+        self.is_dirty = True
+        self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_change_agent(self, agent):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                self._db_agents[i] = agent
+                found = True
+                break
+        if not found:
+            self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_delete_agent(self, agent):
+        self.is_dirty = True
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                if not self._db_agents[i].is_new:
+                    self.db_deleted_agents.append(self._db_agents[i])
+                del self._db_agents[i]
+                break
+        del self.db_agents_id_index[agent.db_id]
+    def db_get_agent(self, key):
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == key:
+                return self._db_agents[i]
+        return None
+    def db_get_agent_by_id(self, key):
+        return self.db_agents_id_index[key]
+    def db_has_agent_with_id(self, key):
+        return key in self.db_agents_id_index
+    
+
+
+class DBOpmProcessIdCause(object):
+
+    vtType = 'opm_process_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmOverlaps(object):
+
+    vtType = 'opm_overlaps'
+
+    def __init__(self, opm_account_ids=None):
+        self.db_deleted_opm_account_ids = []
+        if opm_account_ids is None:
+            self._db_opm_account_ids = []
+        else:
+            self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmOverlaps.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmOverlaps()
+        if self._db_opm_account_ids is None:
+            cp._db_opm_account_ids = []
+        else:
+            cp._db_opm_account_ids = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_account_ids]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmOverlaps()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'opm_account_ids' in class_dict:
+            res = class_dict['opm_account_ids'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_account_id(obj)
+        elif hasattr(old_obj, 'db_opm_account_ids') and old_obj.db_opm_account_ids is not None:
+            for obj in old_obj.db_opm_account_ids:
+                new_obj.db_add_opm_account_id(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_account_ids') and hasattr(new_obj, 'db_deleted_opm_account_ids'):
+            for obj in old_obj.db_deleted_opm_account_ids:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_account_ids.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_opm_account_ids:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_account_id(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_opm_account_ids)
+        if remove:
+            self.db_deleted_opm_account_ids = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_opm_account_ids:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def __set_db_opm_account_ids(self, opm_account_ids):
+        self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+    db_opm_account_ids = property(__get_db_opm_account_ids, __set_db_opm_account_ids)
+    def db_get_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def db_add_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_change_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_delete_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_account_id(self, key):
+        return None
+    
+
+
+class DBOpmArtifacts(object):
+
+    vtType = 'opm_artifacts'
+
+    def __init__(self, artifacts=None):
+        self.db_deleted_artifacts = []
+        self.db_artifacts_id_index = {}
+        if artifacts is None:
+            self._db_artifacts = []
+        else:
+            self._db_artifacts = artifacts
+            for v in self._db_artifacts:
+                self.db_artifacts_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifacts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifacts()
+        if self._db_artifacts is None:
+            cp._db_artifacts = []
+        else:
+            cp._db_artifacts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_artifacts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_artifacts_id_index = dict((v.db_id, v) for v in cp._db_artifacts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifacts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_artifact(obj)
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            for obj in old_obj.db_artifacts:
+                new_obj.db_add_artifact(DBOpmArtifact.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifact.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_artifacts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_artifact(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_artifacts)
+        if remove:
+            self.db_deleted_artifacts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_artifacts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_get_artifacts(self):
+        return self._db_artifacts
+    def db_add_artifact(self, artifact):
+        self.is_dirty = True
+        self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_change_artifact(self, artifact):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                self._db_artifacts[i] = artifact
+                found = True
+                break
+        if not found:
+            self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_delete_artifact(self, artifact):
+        self.is_dirty = True
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                if not self._db_artifacts[i].is_new:
+                    self.db_deleted_artifacts.append(self._db_artifacts[i])
+                del self._db_artifacts[i]
+                break
+        del self.db_artifacts_id_index[artifact.db_id]
+    def db_get_artifact(self, key):
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == key:
+                return self._db_artifacts[i]
+        return None
+    def db_get_artifact_by_id(self, key):
+        return self.db_artifacts_id_index[key]
+    def db_has_artifact_with_id(self, key):
+        return key in self.db_artifacts_id_index
+    
+
+
+class DBOpmDependencies(object):
+
+    vtType = 'opm_dependencies'
+
+    def __init__(self, dependencys=None):
+        self.db_deleted_dependencys = []
+        if dependencys is None:
+            self._db_dependencys = []
+        else:
+            self._db_dependencys = dependencys
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmDependencies.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmDependencies()
+        if self._db_dependencys is None:
+            cp._db_dependencys = []
+        else:
+            cp._db_dependencys = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_dependencys]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmDependencies()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'dependencys' in class_dict:
+            res = class_dict['dependencys'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_dependency(obj)
+        elif hasattr(old_obj, 'db_dependencys') and old_obj.db_dependencys is not None:
+            for obj in old_obj.db_dependencys:
+                if obj.vtType == 'opm_used':
+                    new_obj.db_add_dependency(DBOpmUsed.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_generated_by':
+                    new_obj.db_add_dependency(DBOpmWasGeneratedBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_triggered_by':
+                    new_obj.db_add_dependency(DBOpmWasTriggeredBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_derived_from':
+                    new_obj.db_add_dependency(DBOpmWasDerivedFrom.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_controlled_by':
+                    new_obj.db_add_dependency(DBOpmWasControlledBy.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencys') and hasattr(new_obj, 'db_deleted_dependencys'):
+            for obj in old_obj.db_deleted_dependencys:
+                if obj.vtType == 'opm_used':
+                    n_obj = DBOpmUsed.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_generated_by':
+                    n_obj = DBOpmWasGeneratedBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_triggered_by':
+                    n_obj = DBOpmWasTriggeredBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_derived_from':
+                    n_obj = DBOpmWasDerivedFrom.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_controlled_by':
+                    n_obj = DBOpmWasControlledBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_dependencys:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_dependency(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_dependencys)
+        if remove:
+            self.db_deleted_dependencys = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_dependencys:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_dependencys(self):
+        return self._db_dependencys
+    def __set_db_dependencys(self, dependencys):
+        self._db_dependencys = dependencys
+        self.is_dirty = True
+    db_dependencys = property(__get_db_dependencys, __set_db_dependencys)
+    def db_get_dependencys(self):
+        return self._db_dependencys
+    def db_add_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_change_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_delete_dependency(self, dependency):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_dependency(self, key):
+        return None
+    
+
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmUsed(object):
+
+    vtType = 'opm_used'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmUsed.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmUsed()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmUsed()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBActionAnnotation(object):
+
+    vtType = 'actionAnnotation'
+
+    def __init__(self, id=None, key=None, value=None, action_id=None, date=None, user=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self._db_action_id = action_id
+        self._db_date = date
+        self._db_user = user
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBActionAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBActionAnnotation(id=self._db_id,
+                                key=self._db_key,
+                                value=self._db_value,
+                                action_id=self._db_action_id,
+                                date=self._db_date,
+                                user=self._db_user)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_action_id') and ('action', self._db_action_id) in id_remap:
+                cp._db_action_id = id_remap[('action', self._db_action_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBActionAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'action_id' in class_dict:
+            res = class_dict['action_id'](old_obj, trans_dict)
+            new_obj.db_action_id = res
+        elif hasattr(old_obj, 'db_action_id') and old_obj.db_action_id is not None:
+            new_obj.db_action_id = old_obj.db_action_id
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_action_id(self):
+        return self._db_action_id
+    def __set_db_action_id(self, action_id):
+        self._db_action_id = action_id
+        self.is_dirty = True
+    db_action_id = property(__get_db_action_id, __set_db_action_id)
+    def db_add_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_change_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_delete_action_id(self, action_id):
+        self._db_action_id = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, internal_version=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_internal_version = internal_version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           cache=self._db_cache,
+                           name=self._db_name,
+                           namespace=self._db_namespace,
+                           package=self._db_package,
+                           version=self._db_version,
+                           internal_version=self._db_internal_version)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'internal_version' in class_dict:
+            res = class_dict['internal_version'](old_obj, trans_dict)
+            new_obj.db_internal_version = res
+        elif hasattr(old_obj, 'db_internal_version') and old_obj.db_internal_version is not None:
+            new_obj.db_internal_version = old_obj.db_internal_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_internal_version(self):
+        return self._db_internal_version
+    def __set_db_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+        self.is_dirty = True
+    db_internal_version = property(__get_db_internal_version, __set_db_internal_version)
+    def db_add_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_change_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_delete_internal_version(self, internal_version):
+        self._db_internal_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstraction':
+                    new_obj.db_add_module(DBAbstraction.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifactIdCause(object):
+
+    vtType = 'opm_artifact_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmArtifactValue(object):
+
+    vtType = 'opm_artifact_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'portSpec':
+                new_obj.db_add_value(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_value(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBOpmArtifactIdEffect(object):
+
+    vtType = 'opm_artifact_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmGraph(object):
+
+    vtType = 'opm_graph'
+
+    def __init__(self, accounts=None, processes=None, artifacts=None, agents=None, dependencies=None):
+        self.db_deleted_accounts = []
+        self._db_accounts = accounts
+        self.db_deleted_processes = []
+        self._db_processes = processes
+        self.db_deleted_artifacts = []
+        self._db_artifacts = artifacts
+        self.db_deleted_agents = []
+        self._db_agents = agents
+        self.db_deleted_dependencies = []
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmGraph.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmGraph()
+        if self._db_accounts is not None:
+            cp._db_accounts = self._db_accounts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_processes is not None:
+            cp._db_processes = self._db_processes.do_copy(new_ids, id_scope, id_remap)
+        if self._db_artifacts is not None:
+            cp._db_artifacts = self._db_artifacts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_agents is not None:
+            cp._db_agents = self._db_agents.do_copy(new_ids, id_scope, id_remap)
+        if self._db_dependencies is not None:
+            cp._db_dependencies = self._db_dependencies.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmGraph()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            new_obj.db_accounts = res
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            obj = old_obj.db_accounts
+            new_obj.db_add_accounts(DBOpmAccounts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccounts.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'processes' in class_dict:
+            res = class_dict['processes'](old_obj, trans_dict)
+            new_obj.db_processes = res
+        elif hasattr(old_obj, 'db_processes') and old_obj.db_processes is not None:
+            obj = old_obj.db_processes
+            new_obj.db_add_processes(DBOpmProcesses.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processes') and hasattr(new_obj, 'db_deleted_processes'):
+            for obj in old_obj.db_deleted_processes:
+                n_obj = DBOpmProcesses.update_version(obj, trans_dict)
+                new_obj.db_deleted_processes.append(n_obj)
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            new_obj.db_artifacts = res
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            obj = old_obj.db_artifacts
+            new_obj.db_add_artifacts(DBOpmArtifacts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifacts.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            new_obj.db_agents = res
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            obj = old_obj.db_agents
+            new_obj.db_add_agents(DBOpmAgents.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgents.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        if 'dependencies' in class_dict:
+            res = class_dict['dependencies'](old_obj, trans_dict)
+            new_obj.db_dependencies = res
+        elif hasattr(old_obj, 'db_dependencies') and old_obj.db_dependencies is not None:
+            obj = old_obj.db_dependencies
+            new_obj.db_add_dependencies(DBOpmDependencies.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencies') and hasattr(new_obj, 'db_deleted_dependencies'):
+            for obj in old_obj.db_deleted_dependencies:
+                n_obj = DBOpmDependencies.update_version(obj, trans_dict)
+                new_obj.db_deleted_dependencies.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_accounts is not None:
+            children.extend(self._db_accounts.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_accounts = None
+        if self._db_processes is not None:
+            children.extend(self._db_processes.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_processes = None
+        if self._db_artifacts is not None:
+            children.extend(self._db_artifacts.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_artifacts = None
+        if self._db_agents is not None:
+            children.extend(self._db_agents.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_agents = None
+        if self._db_dependencies is not None:
+            children.extend(self._db_dependencies.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_dependencies = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_processes)
+        children.extend(self.db_deleted_artifacts)
+        children.extend(self.db_deleted_agents)
+        children.extend(self.db_deleted_dependencies)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_processes = []
+            self.db_deleted_artifacts = []
+            self.db_deleted_agents = []
+            self.db_deleted_dependencies = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_accounts is not None and self._db_accounts.has_changes():
+            return True
+        if self._db_processes is not None and self._db_processes.has_changes():
+            return True
+        if self._db_artifacts is not None and self._db_artifacts.has_changes():
+            return True
+        if self._db_agents is not None and self._db_agents.has_changes():
+            return True
+        if self._db_dependencies is not None and self._db_dependencies.has_changes():
+            return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_add_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_change_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_delete_accounts(self, accounts):
+        if not self.is_new:
+            self.db_deleted_accounts.append(self._db_accounts)
+        self._db_accounts = None
+    
+    def __get_db_processes(self):
+        return self._db_processes
+    def __set_db_processes(self, processes):
+        self._db_processes = processes
+        self.is_dirty = True
+    db_processes = property(__get_db_processes, __set_db_processes)
+    def db_add_processes(self, processes):
+        self._db_processes = processes
+    def db_change_processes(self, processes):
+        self._db_processes = processes
+    def db_delete_processes(self, processes):
+        if not self.is_new:
+            self.db_deleted_processes.append(self._db_processes)
+        self._db_processes = None
+    
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_add_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_change_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_delete_artifacts(self, artifacts):
+        if not self.is_new:
+            self.db_deleted_artifacts.append(self._db_artifacts)
+        self._db_artifacts = None
+    
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_add_agents(self, agents):
+        self._db_agents = agents
+    def db_change_agents(self, agents):
+        self._db_agents = agents
+    def db_delete_agents(self, agents):
+        if not self.is_new:
+            self.db_deleted_agents.append(self._db_agents)
+        self._db_agents = None
+    
+    def __get_db_dependencies(self):
+        return self._db_dependencies
+    def __set_db_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+    db_dependencies = property(__get_db_dependencies, __set_db_dependencies)
+    def db_add_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_change_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_delete_dependencies(self, dependencies):
+        if not self.is_new:
+            self.db_deleted_dependencies.append(self._db_dependencies)
+        self._db_dependencies = None
+    
+
+
+class DBRegistry(object):
+
+    vtType = 'registry'
+
+    def __init__(self, id=None, entity_type=None, version=None, root_descriptor_id=None, name=None, last_modified=None, packages=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_root_descriptor_id = root_descriptor_id
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_packages = []
+        self.db_packages_id_index = {}
+        self.db_packages_identifier_index = {}
+        if packages is None:
+            self._db_packages = []
+        else:
+            self._db_packages = packages
+            for v in self._db_packages:
+                self.db_packages_id_index[v.db_id] = v
+                self.db_packages_identifier_index[(v.db_identifier,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRegistry.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRegistry(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        root_descriptor_id=self._db_root_descriptor_id,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_packages is None:
+            cp._db_packages = []
+        else:
+            cp._db_packages = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_packages]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_root_descriptor_id') and ('module_descriptor', self._db_root_descriptor_id) in id_remap:
+                cp._db_root_descriptor_id = id_remap[('module_descriptor', self._db_root_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_packages_id_index = dict((v.db_id, v) for v in cp._db_packages)
+        cp.db_packages_identifier_index = dict(((v.db_identifier,v.db_version), v) for v in cp._db_packages)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'root_descriptor_id' in class_dict:
+            res = class_dict['root_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_root_descriptor_id = res
+        elif hasattr(old_obj, 'db_root_descriptor_id') and old_obj.db_root_descriptor_id is not None:
+            new_obj.db_root_descriptor_id = old_obj.db_root_descriptor_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'packages' in class_dict:
+            res = class_dict['packages'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_package(obj)
+        elif hasattr(old_obj, 'db_packages') and old_obj.db_packages is not None:
+            for obj in old_obj.db_packages:
+                new_obj.db_add_package(DBPackage.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_packages') and hasattr(new_obj, 'db_deleted_packages'):
+            for obj in old_obj.db_deleted_packages:
+                n_obj = DBPackage.update_version(obj, trans_dict)
+                new_obj.db_deleted_packages.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_packages:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_package(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_packages)
+        if remove:
+            self.db_deleted_packages = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_packages:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_root_descriptor_id(self):
+        return self._db_root_descriptor_id
+    def __set_db_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+        self.is_dirty = True
+    db_root_descriptor_id = property(__get_db_root_descriptor_id, __set_db_root_descriptor_id)
+    def db_add_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_change_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_delete_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_packages(self):
+        return self._db_packages
+    def __set_db_packages(self, packages):
+        self._db_packages = packages
+        self.is_dirty = True
+    db_packages = property(__get_db_packages, __set_db_packages)
+    def db_get_packages(self):
+        return self._db_packages
+    def db_add_package(self, package):
+        self.is_dirty = True
+        self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_change_package(self, package):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                self._db_packages[i] = package
+                found = True
+                break
+        if not found:
+            self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_delete_package(self, package):
+        self.is_dirty = True
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                if not self._db_packages[i].is_new:
+                    self.db_deleted_packages.append(self._db_packages[i])
+                del self._db_packages[i]
+                break
+        del self.db_packages_id_index[package.db_id]
+        del self.db_packages_identifier_index[(package.db_identifier,package.db_version)]
+    def db_get_package(self, key):
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == key:
+                return self._db_packages[i]
+        return None
+    def db_get_package_by_id(self, key):
+        return self.db_packages_id_index[key]
+    def db_has_package_with_id(self, key):
+        return key in self.db_packages_id_index
+    def db_get_package_by_identifier(self, key):
+        return self.db_packages_identifier_index[key]
+    def db_has_package_with_identifier(self, key):
+        return key in self.db_packages_identifier_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAccount(object):
+
+    vtType = 'opm_account'
+
+    def __init__(self, id=None, value=None):
+        self._db_id = id
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccount.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccount(id=self._db_id,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccount()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasDerivedFrom(object):
+
+    vtType = 'opm_was_derived_from'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasDerivedFrom.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasDerivedFrom()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasDerivedFrom()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmWasControlledBy(object):
+
+    vtType = 'opm_was_controlled_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, starts=None, ends=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_starts = []
+        if starts is None:
+            self._db_starts = []
+        else:
+            self._db_starts = starts
+        self.db_deleted_ends = []
+        if ends is None:
+            self._db_ends = []
+        else:
+            self._db_ends = ends
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasControlledBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasControlledBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_starts is None:
+            cp._db_starts = []
+        else:
+            cp._db_starts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_starts]
+        if self._db_ends is None:
+            cp._db_ends = []
+        else:
+            cp._db_ends = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ends]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasControlledBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmAgentId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmAgentId.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'starts' in class_dict:
+            res = class_dict['starts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_start(obj)
+        elif hasattr(old_obj, 'db_starts') and old_obj.db_starts is not None:
+            for obj in old_obj.db_starts:
+                new_obj.db_add_start(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_starts') and hasattr(new_obj, 'db_deleted_starts'):
+            for obj in old_obj.db_deleted_starts:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_starts.append(n_obj)
+        if 'ends' in class_dict:
+            res = class_dict['ends'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_end(obj)
+        elif hasattr(old_obj, 'db_ends') and old_obj.db_ends is not None:
+            for obj in old_obj.db_ends:
+                new_obj.db_add_end(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ends') and hasattr(new_obj, 'db_deleted_ends'):
+            for obj in old_obj.db_deleted_ends:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_ends.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_starts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_start(child)
+        to_del = []
+        for child in self.db_ends:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_end(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_starts)
+        children.extend(self.db_deleted_ends)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_starts = []
+            self.db_deleted_ends = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_starts:
+            if child.has_changes():
+                return True
+        for child in self._db_ends:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_starts(self):
+        return self._db_starts
+    def __set_db_starts(self, starts):
+        self._db_starts = starts
+        self.is_dirty = True
+    db_starts = property(__get_db_starts, __set_db_starts)
+    def db_get_starts(self):
+        return self._db_starts
+    def db_add_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_change_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_delete_start(self, start):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_start(self, key):
+        return None
+    
+    def __get_db_ends(self):
+        return self._db_ends
+    def __set_db_ends(self, ends):
+        self._db_ends = ends
+        self.is_dirty = True
+    db_ends = property(__get_db_ends, __set_db_ends)
+    def db_get_ends(self):
+        return self._db_ends
+    def db_add_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_change_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_delete_end(self, end):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_end(self, key):
+        return None
+    
+
+
+class DBOpmAgentId(object):
+
+    vtType = 'opm_agent_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgentId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgentId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_agent', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_agent', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgentId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBGroupExec(object):
+
+    vtType = 'group_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, group_name=None, group_type=None, completed=None, error=None, machine_id=None, annotations=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_group_name = group_name
+        self._db_group_type = group_type
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroupExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroupExec(id=self._db_id,
+                         ts_start=self._db_ts_start,
+                         ts_end=self._db_ts_end,
+                         cached=self._db_cached,
+                         module_id=self._db_module_id,
+                         group_name=self._db_group_name,
+                         group_type=self._db_group_type,
+                         completed=self._db_completed,
+                         error=self._db_error,
+                         machine_id=self._db_machine_id)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroupExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'group_name' in class_dict:
+            res = class_dict['group_name'](old_obj, trans_dict)
+            new_obj.db_group_name = res
+        elif hasattr(old_obj, 'db_group_name') and old_obj.db_group_name is not None:
+            new_obj.db_group_name = old_obj.db_group_name
+        if 'group_type' in class_dict:
+            res = class_dict['group_type'](old_obj, trans_dict)
+            new_obj.db_group_type = res
+        elif hasattr(old_obj, 'db_group_type') and old_obj.db_group_type is not None:
+            new_obj.db_group_type = old_obj.db_group_type
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_group_name(self):
+        return self._db_group_name
+    def __set_db_group_name(self, group_name):
+        self._db_group_name = group_name
+        self.is_dirty = True
+    db_group_name = property(__get_db_group_name, __set_db_group_name)
+    def db_add_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_change_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_delete_group_name(self, group_name):
+        self._db_group_name = None
+    
+    def __get_db_group_type(self):
+        return self._db_group_type
+    def __set_db_group_type(self, group_type):
+        self._db_group_type = group_type
+        self.is_dirty = True
+    db_group_type = property(__get_db_group_type, __set_db_group_type)
+    def db_add_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_change_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_delete_group_type(self, group_type):
+        self._db_group_type = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmTime(object):
+
+    vtType = 'opm_time'
+
+    def __init__(self, no_later_than=None, no_earlier_than=None, clock_id=None):
+        self._db_no_later_than = no_later_than
+        self._db_no_earlier_than = no_earlier_than
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmTime.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmTime(no_later_than=self._db_no_later_than,
+                       no_earlier_than=self._db_no_earlier_than,
+                       clock_id=self._db_clock_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmTime()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'no_later_than' in class_dict:
+            res = class_dict['no_later_than'](old_obj, trans_dict)
+            new_obj.db_no_later_than = res
+        elif hasattr(old_obj, 'db_no_later_than') and old_obj.db_no_later_than is not None:
+            new_obj.db_no_later_than = old_obj.db_no_later_than
+        if 'no_earlier_than' in class_dict:
+            res = class_dict['no_earlier_than'](old_obj, trans_dict)
+            new_obj.db_no_earlier_than = res
+        elif hasattr(old_obj, 'db_no_earlier_than') and old_obj.db_no_earlier_than is not None:
+            new_obj.db_no_earlier_than = old_obj.db_no_earlier_than
+        if 'clock_id' in class_dict:
+            res = class_dict['clock_id'](old_obj, trans_dict)
+            new_obj.db_clock_id = res
+        elif hasattr(old_obj, 'db_clock_id') and old_obj.db_clock_id is not None:
+            new_obj.db_clock_id = old_obj.db_clock_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_no_later_than(self):
+        return self._db_no_later_than
+    def __set_db_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+        self.is_dirty = True
+    db_no_later_than = property(__get_db_no_later_than, __set_db_no_later_than)
+    def db_add_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_change_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_delete_no_later_than(self, no_later_than):
+        self._db_no_later_than = None
+    
+    def __get_db_no_earlier_than(self):
+        return self._db_no_earlier_than
+    def __set_db_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+        self.is_dirty = True
+    db_no_earlier_than = property(__get_db_no_earlier_than, __set_db_no_earlier_than)
+    def db_add_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_change_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_delete_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = None
+    
+    def __get_db_clock_id(self):
+        return self._db_clock_id
+    def __set_db_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+    db_clock_id = property(__get_db_clock_id, __set_db_clock_id)
+    def db_add_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_change_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_delete_clock_id(self, clock_id):
+        self._db_clock_id = None
+    
+
+
+class DBPackage(object):
+
+    vtType = 'package'
+
+    def __init__(self, id=None, name=None, identifier=None, codepath=None, load_configuration=None, version=None, description=None, module_descriptors=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_identifier = identifier
+        self._db_codepath = codepath
+        self._db_load_configuration = load_configuration
+        self._db_version = version
+        self._db_description = description
+        self.db_deleted_module_descriptors = []
+        self.db_module_descriptors_id_index = {}
+        self.db_module_descriptors_name_index = {}
+        if module_descriptors is None:
+            self._db_module_descriptors = []
+        else:
+            self._db_module_descriptors = module_descriptors
+            for v in self._db_module_descriptors:
+                self.db_module_descriptors_id_index[v.db_id] = v
+                self.db_module_descriptors_name_index[(v.db_name,v.db_namespace,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPackage.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPackage(id=self._db_id,
+                       name=self._db_name,
+                       identifier=self._db_identifier,
+                       codepath=self._db_codepath,
+                       load_configuration=self._db_load_configuration,
+                       version=self._db_version,
+                       description=self._db_description)
+        if self._db_module_descriptors is None:
+            cp._db_module_descriptors = []
+        else:
+            cp._db_module_descriptors = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_descriptors]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_descriptors_id_index = dict((v.db_id, v) for v in cp._db_module_descriptors)
+        cp.db_module_descriptors_name_index = dict(((v.db_name,v.db_namespace,v.db_version), v) for v in cp._db_module_descriptors)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPackage()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'identifier' in class_dict:
+            res = class_dict['identifier'](old_obj, trans_dict)
+            new_obj.db_identifier = res
+        elif hasattr(old_obj, 'db_identifier') and old_obj.db_identifier is not None:
+            new_obj.db_identifier = old_obj.db_identifier
+        if 'codepath' in class_dict:
+            res = class_dict['codepath'](old_obj, trans_dict)
+            new_obj.db_codepath = res
+        elif hasattr(old_obj, 'db_codepath') and old_obj.db_codepath is not None:
+            new_obj.db_codepath = old_obj.db_codepath
+        if 'load_configuration' in class_dict:
+            res = class_dict['load_configuration'](old_obj, trans_dict)
+            new_obj.db_load_configuration = res
+        elif hasattr(old_obj, 'db_load_configuration') and old_obj.db_load_configuration is not None:
+            new_obj.db_load_configuration = old_obj.db_load_configuration
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'description' in class_dict:
+            res = class_dict['description'](old_obj, trans_dict)
+            new_obj.db_description = res
+        elif hasattr(old_obj, 'db_description') and old_obj.db_description is not None:
+            new_obj.db_description = old_obj.db_description
+        if 'module_descriptors' in class_dict:
+            res = class_dict['module_descriptors'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_descriptor(obj)
+        elif hasattr(old_obj, 'db_module_descriptors') and old_obj.db_module_descriptors is not None:
+            for obj in old_obj.db_module_descriptors:
+                new_obj.db_add_module_descriptor(DBModuleDescriptor.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_descriptors') and hasattr(new_obj, 'db_deleted_module_descriptors'):
+            for obj in old_obj.db_deleted_module_descriptors:
+                n_obj = DBModuleDescriptor.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_descriptors.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_module_descriptors:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_descriptor(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_descriptors)
+        if remove:
+            self.db_deleted_module_descriptors = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_descriptors:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_identifier(self):
+        return self._db_identifier
+    def __set_db_identifier(self, identifier):
+        self._db_identifier = identifier
+        self.is_dirty = True
+    db_identifier = property(__get_db_identifier, __set_db_identifier)
+    def db_add_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_change_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_delete_identifier(self, identifier):
+        self._db_identifier = None
+    
+    def __get_db_codepath(self):
+        return self._db_codepath
+    def __set_db_codepath(self, codepath):
+        self._db_codepath = codepath
+        self.is_dirty = True
+    db_codepath = property(__get_db_codepath, __set_db_codepath)
+    def db_add_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_change_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_delete_codepath(self, codepath):
+        self._db_codepath = None
+    
+    def __get_db_load_configuration(self):
+        return self._db_load_configuration
+    def __set_db_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+        self.is_dirty = True
+    db_load_configuration = property(__get_db_load_configuration, __set_db_load_configuration)
+    def db_add_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_change_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_delete_load_configuration(self, load_configuration):
+        self._db_load_configuration = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_description(self):
+        return self._db_description
+    def __set_db_description(self, description):
+        self._db_description = description
+        self.is_dirty = True
+    db_description = property(__get_db_description, __set_db_description)
+    def db_add_description(self, description):
+        self._db_description = description
+    def db_change_description(self, description):
+        self._db_description = description
+    def db_delete_description(self, description):
+        self._db_description = None
+    
+    def __get_db_module_descriptors(self):
+        return self._db_module_descriptors
+    def __set_db_module_descriptors(self, module_descriptors):
+        self._db_module_descriptors = module_descriptors
+        self.is_dirty = True
+    db_module_descriptors = property(__get_db_module_descriptors, __set_db_module_descriptors)
+    def db_get_module_descriptors(self):
+        return self._db_module_descriptors
+    def db_add_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_change_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                self._db_module_descriptors[i] = module_descriptor
+                found = True
+                break
+        if not found:
+            self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_delete_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                if not self._db_module_descriptors[i].is_new:
+                    self.db_deleted_module_descriptors.append(self._db_module_descriptors[i])
+                del self._db_module_descriptors[i]
+                break
+        del self.db_module_descriptors_id_index[module_descriptor.db_id]
+        del self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)]
+    def db_get_module_descriptor(self, key):
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == key:
+                return self._db_module_descriptors[i]
+        return None
+    def db_get_module_descriptor_by_id(self, key):
+        return self.db_module_descriptors_id_index[key]
+    def db_has_module_descriptor_with_id(self, key):
+        return key in self.db_module_descriptors_id_index
+    def db_get_module_descriptor_by_name(self, key):
+        return self.db_module_descriptors_name_index[key]
+    def db_has_module_descriptor_with_name(self, key):
+        return key in self.db_module_descriptors_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, item_execs=None, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None, annotations=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLoopExec(object):
+
+    vtType = 'loop_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, iteration=None, completed=None, error=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_iteration = iteration
+        self._db_completed = completed
+        self._db_error = error
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLoopExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLoopExec(id=self._db_id,
+                        ts_start=self._db_ts_start,
+                        ts_end=self._db_ts_end,
+                        iteration=self._db_iteration,
+                        completed=self._db_completed,
+                        error=self._db_error)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLoopExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'iteration' in class_dict:
+            res = class_dict['iteration'](old_obj, trans_dict)
+            new_obj.db_iteration = res
+        elif hasattr(old_obj, 'db_iteration') and old_obj.db_iteration is not None:
+            new_obj.db_iteration = old_obj.db_iteration
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_iteration(self):
+        return self._db_iteration
+    def __set_db_iteration(self, iteration):
+        self._db_iteration = iteration
+        self.is_dirty = True
+    db_iteration = property(__get_db_iteration, __set_db_iteration)
+    def db_add_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_change_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_delete_iteration(self, iteration):
+        self._db_iteration = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcess(object):
+
+    vtType = 'opm_process'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcess.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcess(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcess()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmProcessValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmProcessValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasTriggeredBy(object):
+
+    vtType = 'opm_was_triggered_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasTriggeredBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasTriggeredBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasTriggeredBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmProcessValue(object):
+
+    vtType = 'opm_process_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'module_exec':
+                new_obj.db_add_value(DBModuleExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'group_exec':
+                new_obj.db_add_value(DBGroupExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'loop_exec':
+                new_obj.db_add_value(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgent(object):
+
+    vtType = 'opm_agent'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgent(id=self._db_id,
+                        value=self._db_value)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None, actionAnnotations=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_actionAnnotations = []
+        self.db_actionAnnotations_id_index = {}
+        self.db_actionAnnotations_action_id_index = {}
+        self.db_actionAnnotations_key_index = {}
+        if actionAnnotations is None:
+            self._db_actionAnnotations = []
+        else:
+            self._db_actionAnnotations = actionAnnotations
+            for v in self._db_actionAnnotations:
+                self.db_actionAnnotations_id_index[v.db_id] = v
+                self.db_actionAnnotations_action_id_index[(v.db_action_id,v.db_key)] = v
+                self.db_actionAnnotations_key_index[(v.db_key,v.db_value)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_actionAnnotations is None:
+            cp._db_actionAnnotations = []
+        else:
+            cp._db_actionAnnotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actionAnnotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_actionAnnotations_id_index = dict((v.db_id, v) for v in cp._db_actionAnnotations)
+        cp.db_actionAnnotations_action_id_index = dict(((v.db_action_id,v.db_key), v) for v in cp._db_actionAnnotations)
+        cp.db_actionAnnotations_key_index = dict(((v.db_key,v.db_value), v) for v in cp._db_actionAnnotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'actionAnnotations' in class_dict:
+            res = class_dict['actionAnnotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_actionAnnotation(obj)
+        elif hasattr(old_obj, 'db_actionAnnotations') and old_obj.db_actionAnnotations is not None:
+            for obj in old_obj.db_actionAnnotations:
+                new_obj.db_add_actionAnnotation(DBActionAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actionAnnotations') and hasattr(new_obj, 'db_deleted_actionAnnotations'):
+            for obj in old_obj.db_deleted_actionAnnotations:
+                n_obj = DBActionAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_actionAnnotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_actionAnnotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_actionAnnotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_actionAnnotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+            self.db_deleted_actionAnnotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_actionAnnotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_actionAnnotations(self):
+        return self._db_actionAnnotations
+    def __set_db_actionAnnotations(self, actionAnnotations):
+        self._db_actionAnnotations = actionAnnotations
+        self.is_dirty = True
+    db_actionAnnotations = property(__get_db_actionAnnotations, __set_db_actionAnnotations)
+    def db_get_actionAnnotations(self):
+        return self._db_actionAnnotations
+    def db_add_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        self._db_actionAnnotations.append(actionAnnotation)
+        self.db_actionAnnotations_id_index[actionAnnotation.db_id] = actionAnnotation
+        self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)] = actionAnnotation
+        self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)] = actionAnnotation
+    def db_change_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == actionAnnotation.db_id:
+                self._db_actionAnnotations[i] = actionAnnotation
+                found = True
+                break
+        if not found:
+            self._db_actionAnnotations.append(actionAnnotation)
+        self.db_actionAnnotations_id_index[actionAnnotation.db_id] = actionAnnotation
+        self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)] = actionAnnotation
+        self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)] = actionAnnotation
+    def db_delete_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == actionAnnotation.db_id:
+                if not self._db_actionAnnotations[i].is_new:
+                    self.db_deleted_actionAnnotations.append(self._db_actionAnnotations[i])
+                del self._db_actionAnnotations[i]
+                break
+        del self.db_actionAnnotations_id_index[actionAnnotation.db_id]
+        del self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)]
+        try:
+            del self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)]
+        except KeyError:
+            pass
+    def db_get_actionAnnotation(self, key):
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == key:
+                return self._db_actionAnnotations[i]
+        return None
+    def db_get_actionAnnotation_by_id(self, key):
+        return self.db_actionAnnotations_id_index[key]
+    def db_has_actionAnnotation_with_id(self, key):
+        return key in self.db_actionAnnotations_id_index
+    def db_get_actionAnnotation_by_action_id(self, key):
+        return self.db_actionAnnotations_action_id_index[key]
+    def db_has_actionAnnotation_with_action_id(self, key):
+        return key in self.db_actionAnnotations_action_id_index
+    def db_get_actionAnnotation_by_key(self, key):
+        return self.db_actionAnnotations_key_index[key]
+    def db_has_actionAnnotation_with_key(self, key):
+        return key in self.db_actionAnnotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, machine_id=None, annotations=None, loop_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_loop_execs = []
+        self.db_loop_execs_id_index = {}
+        if loop_execs is None:
+            self._db_loop_execs = []
+        else:
+            self._db_loop_execs = loop_execs
+            for v in self._db_loop_execs:
+                self.db_loop_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_loop_execs is None:
+            cp._db_loop_execs = []
+        else:
+            cp._db_loop_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_loop_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_loop_execs_id_index = dict((v.db_id, v) for v in cp._db_loop_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'loop_execs' in class_dict:
+            res = class_dict['loop_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_loop_exec(obj)
+        elif hasattr(old_obj, 'db_loop_execs') and old_obj.db_loop_execs is not None:
+            for obj in old_obj.db_loop_execs:
+                new_obj.db_add_loop_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_loop_execs') and hasattr(new_obj, 'db_deleted_loop_execs'):
+            for obj in old_obj.db_deleted_loop_execs:
+                n_obj = DBLoopExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_loop_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_loop_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_loop_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_loop_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_loop_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_loop_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_loop_execs(self):
+        return self._db_loop_execs
+    def __set_db_loop_execs(self, loop_execs):
+        self._db_loop_execs = loop_execs
+        self.is_dirty = True
+    db_loop_execs = property(__get_db_loop_execs, __set_db_loop_execs)
+    def db_get_loop_execs(self):
+        return self._db_loop_execs
+    def db_add_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_change_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                self._db_loop_execs[i] = loop_exec
+                found = True
+                break
+        if not found:
+            self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_delete_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                if not self._db_loop_execs[i].is_new:
+                    self.db_deleted_loop_execs.append(self._db_loop_execs[i])
+                del self._db_loop_execs[i]
+                break
+        del self.db_loop_execs_id_index[loop_exec.db_id]
+    def db_get_loop_exec(self, key):
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == key:
+                return self._db_loop_execs[i]
+        return None
+    def db_get_loop_exec_by_id(self, key):
+        return self.db_loop_execs_id_index[key]
+    def db_has_loop_exec_with_id(self, key):
+        return key in self.db_loop_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v1_0_2/domain/id_scope.py b/vistrails/db/versions/v1_0_2/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v1_0_2/domain/log.py b/vistrails/db/versions/v1_0_2/domain/log.py
new file mode 100644
index 0000000..a127726
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/log.py
@@ -0,0 +1,72 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstraction, DBModule, DBGroup, DBLoopExec, \
+    DBGroupExec, DBModuleExec
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                                {DBLoopExec.vtType: 'item_exec',
+                                 DBModuleExec.vtType: 'item_exec',
+                                 DBGroupExec.vtType: 'item_exec',
+                                 DBAbstraction.vtType: DBModule.vtType,
+                                 DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v1_0_2/domain/registry.py b/vistrails/db/versions/v1_0_2/domain/registry.py
new file mode 100644
index 0000000..323ebbd
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/registry.py
@@ -0,0 +1,63 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBRegistry as _DBRegistry, DBPackage, DBModuleDescriptor, \
+    DBPortSpec
+from id_scope import IdScope
+
+class DBRegistry(_DBRegistry):
+    def __init__(self, *args, **kwargs):
+        _DBRegistry.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        new_obj = _DBRegistry.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+    
+    def update_id_scope(self):
+        for package in self.db_packages:
+            self.idScope.updateBeginId(DBPackage.vtType, package.db_id+1)
+            for descriptor in package.db_module_descriptors:
+                self.idScope.updateBeginId(DBModuleDescriptor.vtType,
+                                           descriptor.db_id+1)
+                for port_spec in descriptor.db_portSpecs:
+                    self.idScope.updateBeginId(DBPortSpec.vtType, 
+                                               port_spec.db_id+1)
+
+
diff --git a/vistrails/db/versions/v1_0_2/domain/vistrail.py b/vistrails/db/versions/v1_0_2/domain/vistrail.py
new file mode 100644
index 0000000..29962da
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/vistrail.py
@@ -0,0 +1,216 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+import hashlib
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstraction, DBGroup, \
+    DBModule, DBAnnotation, DBActionAnnotation
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstraction.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType,
+                                      DBActionAnnotation.vtType: \
+                                          DBAnnotation.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.db_log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.db_log_filename = self.db_log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'db_log_filename'):
+            new_obj.db_log_filename = old_obj.db_log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+        
+        for annotation in self.db_annotations:
+            self.idScope.updateBeginId('annotation', annotation.db_id+1)
+        for annotation in self.db_actionAnnotations:
+            self.idScope.updateBeginId('annotation', annotation.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
+
+    def update_checkout_version(self, app=''):
+        checkout_key = "__checkout_version_"
+        action_key = checkout_key + app
+        annotation_key = action_key + '_annotationhash'
+        action_annotation_key = action_key + '_actionannotationhash'
+
+        # delete previous checkout annotations
+        deletekeys = [action_key,annotation_key,action_annotation_key]
+        for key in deletekeys:
+            while self.db_has_annotation_with_key(key):
+                a = self.db_get_annotation_by_key(key)
+                self.db_delete_annotation(a)
+        
+        # annotation hash - requires annotations to be clean
+        value = self.hashAnnotations()
+        if self.db_has_annotation_with_key(annotation_key):
+            annotation = self.db_get_annotation_by_key(annotation_key)
+            annotation.db_value = value
+        else:
+            annotation=DBAnnotation(self.idScope.getNewId(DBAnnotation.vtType), 
+                                  annotation_key, value)
+            self.db_add_annotation(annotation)
+        # action annotation hash
+        value = self.hashActionAnnotations()
+        if self.db_has_annotation_with_key(action_annotation_key):
+            annotation = self.db_get_annotation_by_key(action_annotation_key)
+            annotation.db_value = value
+        else:
+            annotation=DBAnnotation(self.idScope.getNewId(DBAnnotation.vtType), 
+                                    action_annotation_key, value)
+            self.db_add_annotation(annotation)
+        # last action id hash
+        if len(self.db_actions) == 0:
+            value = 0
+        else:
+            value = max(v.db_id for v in self.db_actions)
+        if self.db_has_annotation_with_key(action_key):
+            annotation = self.db_get_annotation_by_key(action_key)
+            annotation.db_value = str(value)
+        else:
+            annotation=DBAnnotation(self.idScope.getNewId(DBAnnotation.vtType), 
+                                    action_key, str(value))
+            self.db_add_annotation(annotation)
+
+    def hashAnnotations(self):
+        annotations = {}
+        for annotation in self.db_annotations:
+            if annotation._db_key not in annotations:
+                annotations[annotation._db_key] = []
+            if annotation._db_value not in annotations[annotation._db_key]:
+                annotations[annotation._db_key].append(annotation._db_value)
+        keys = annotations.keys()
+        keys.sort()
+        m = hashlib.md5()
+        for k in keys:
+            m.update(str(k))
+            annotations[k].sort()
+            for v in annotations[k]:
+                m.update(str(v))
+        return m.hexdigest()
+
+    def hashActionAnnotations(self):
+        action_annotations = {}
+        for action_id, key, value in [[aa.db_action_id, aa.db_key, 
+                         aa.db_value] for aa in self.db_actionAnnotations]:
+            index = (str(action_id), key)
+            if index not in action_annotations:
+                action_annotations[index] = []
+            if value not in action_annotations[index]:
+                action_annotations[index].append(value)
+        keys = action_annotations.keys()
+        keys.sort()
+        m = hashlib.md5()
+        for k in keys:
+            m.update(k[0] + k[1])
+            action_annotations[k].sort()
+            for v in action_annotations[k]:
+                m.update(str(v))
+        return m.hexdigest()
diff --git a/vistrails/db/versions/v1_0_2/domain/workflow.py b/vistrails/db/versions/v1_0_2/domain/workflow.py
new file mode 100644
index 0000000..af484e6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/domain/workflow.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {DBAbstraction.vtType: DBModule.vtType, 
+                  DBGroup.vtType: DBModule.vtType}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == DBAbstraction.vtType or \
+                object.vtType == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == DBAbstraction.vtType or obj_type == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v1_0_2/persistence/__init__.py b/vistrails/db/versions/v1_0_2/persistence/__init__.py
new file mode 100644
index 0000000..d992cd3
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/__init__.py
@@ -0,0 +1,473 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v1_0_2 import version as my_version
+from vistrails.db.versions.v1_0_2.domain import DBGroup, DBWorkflow, DBVistrail, DBLog, \
+    DBRegistry
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        def indent(elem, level=0):
+            i = "\n" + level*"  "
+            if len(elem):
+                if not elem.text or not elem.text.strip():
+                    elem.text = i + "  "
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+                for elem in elem:
+                    indent(elem, level+1)
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        indent(tree.getroot())
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id=None, lock=False, 
+                     global_props=None):
+        all_objects = {}
+        if global_props is None:
+            global_props = {}
+        if id is not None:
+            global_props['id'] = id
+        # print global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        global_props = {'entity_id': res.db_id,
+                        'entity_type': res.vtType}
+
+        # collect all commands so that they can be executed together
+        # daoList should contain (dao_type, dao, dbCommand) values
+        daoList = []
+        # dbCommandList should contain dbCommand values
+        dbCommandList = []
+        
+        # generate SELECT statements
+        for dao_type, dao in self['sql'].iteritems():
+            if (dao_type == DBVistrail.vtType or
+                dao_type == DBWorkflow.vtType or
+                dao_type == DBLog.vtType or
+                dao_type == DBRegistry.vtType):
+                continue
+
+            daoList.append([dao_type, dao, None])
+            dbCommand = dao.get_sql_select(db_connection, global_props, lock)
+            dbCommandList.append(dbCommand)
+            
+        # Exacute all select statements
+        results = self['sql'][vtType].executeSQLGroup(db_connection,
+                                                      dbCommandList, True)
+
+        # add result to correct dao
+        for i in xrange(len(daoList)):
+            daoList[i][2] = results[i]
+        
+        # process results
+        for dao_type, dao, data in daoList:
+            current_objs = dao.process_sql_columns(data, global_props)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+
+        return res
+
+    def open_many_from_db(self, db_connection, vtType, ids, lock=False):
+        """ Loads multiple objects. They need to be loaded as one single
+            multiple select statement command for performance reasons.
+        """
+
+        log_dao = self['sql'][vtType]
+        # loop through ids and build SELECT statements
+        selects = [log_dao.get_sql_select(db_connection, {'id': id}, lock)
+                   for id in ids]
+        # Execute all SELECT statements for main objects
+        results = log_dao.executeSQLGroup(db_connection, selects, True)
+
+        # list of final objects
+        objects = []
+        # list of selects
+        selects = []
+        # list of children id:all_objects_dict
+        all_objects_dict = {}
+        # process each result and extract child SELECTS
+        # daoList should contain (id, dao_type, dao, result) values
+        daoList = []
+        # selects should contain dbCommand values
+        selects = []
+        global_props = {}
+        for id, data in zip(ids, results):
+            res_objects = log_dao.process_sql_columns(data, global_props)
+            if len(res_objects) > 1:
+                raise VistrailsDBException("More than object of type '%s' and "
+                                           "id '%s' exist in the database" % \
+                                               (vtType, id))
+            elif len(res_objects) <= 0:
+                raise VistrailsDBException("No objects of type '%s' and "
+                                           "id '%s' exist in the database" % \
+                                               (vtType, id))
+            all_objects = {}
+            all_objects_dict[id] = all_objects
+            all_objects.update(res_objects)
+            objects.append(res_objects.values()[0])
+            # collect all commands so that they can be executed together
+        
+            # generate SELECT statements for children
+            for dao_type, dao in self['sql'].iteritems():
+                if (dao_type == DBVistrail.vtType or
+                    dao_type == DBWorkflow.vtType or
+                    dao_type == DBLog.vtType or
+                    dao_type == DBRegistry.vtType):
+                    continue
+    
+                daoList.append([id, dao_type, dao, None])
+                dbCommand = dao.get_sql_select(db_connection, global_props, lock)
+                selects.append(dbCommand)
+
+        # Execute all child select statements
+        results = self['sql'][vtType].executeSQLGroup(db_connection,
+                                                      selects, True)
+        for i in xrange(len(daoList)):
+            daoList[i][3] = results[i]
+
+        # process results
+        for id, dao_type, dao, data in daoList:
+            all_objects = all_objects_dict[id]
+            current_objs = dao.process_sql_columns(data, global_props)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        
+        for id, all_objects in all_objects_dict.iteritems():
+            for key, obj in all_objects.iteritems():
+                if key[0] == vtType and key[1] == id:
+                    continue
+                self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for id, dao_type, dao, data in daoList:
+            all_objects = all_objects_dict[id]
+            for obj in all_objects.itervalues():
+                obj.is_dirty = False
+                obj.is_new = False
+    
+        return objects
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy == 'with_ids':
+            do_copy = True
+        elif do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children()
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        child = children[0][0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                  global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        # do deletes
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                            c,
+                                                            global_props)
+        child = children.pop(0)[0]
+        child.is_dirty = False
+        child.is_new = False
+        
+        if not len(children):
+            return
+
+        # list of all children
+        dbCommandList = []
+        writtenChildren = []
+        # process remaining children
+        for (child, _, _) in children:
+            dbCommand = self['sql'][child.vtType].set_sql_command(
+                            db_connection, child, global_props, do_copy)
+            if dbCommand is not None:
+                dbCommandList.append(dbCommand)
+                writtenChildren.append(child)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        # Execute all insert/update statements
+        results = self['sql'][children[0][0].vtType].executeSQLGroup(
+                                                    db_connection,
+                                                    dbCommandList, False)
+        resultDict = dict(zip(writtenChildren, results))
+        # process remaining children
+        for (child, _, _) in children:
+            if child in resultDict:
+                lastId = resultDict[child]
+                self['sql'][child.vtType].set_sql_process(child, 
+                                                          global_props,
+                                                          lastId)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    new_props = {'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    is_dirty = child.db_workflow.is_dirty
+                    child.db_workflow.db_entity_type = DBWorkflow.vtType
+                    child.db_workflow.is_dirty = is_dirty
+                    self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                    new_props)
+
+    def save_many_to_db(self, db_connection, objList, do_copy=False):
+        if do_copy == 'with_ids':
+            do_copy = True
+        if not len(objList):
+            return
+        childrenDict = {}
+        global_propsDict = {}
+        dbCommandList = []
+        writtenChildren = []
+        for obj in objList:
+            if do_copy and obj.db_id is not None:
+                obj.db_id = None
+
+            children = obj.db_children()
+            children.reverse()
+            global_props = {'entity_type': obj.vtType}
+
+            child = children[0][0]
+            dbCommand = self['sql'][child.vtType].set_sql_command(
+                db_connection, child, global_props, do_copy)
+            if dbCommand is not None:
+                dbCommandList.append(dbCommand)
+                writtenChildren.append(child)
+            
+            childrenDict[child] = children
+            global_propsDict[child] = global_props
+
+        # Execute all insert/update statements for the main objects
+        results = self['sql'][children[0][0].vtType].executeSQLGroup(
+                                                    db_connection,
+                                                    dbCommandList, False)
+        resultDict = dict(zip(writtenChildren, results))
+        dbCommandList = []
+        writtenChildren = []
+        for child, children in childrenDict.iteritems():
+            # process objects
+            if child in resultDict:
+                lastId = resultDict[child]
+                self['sql'][child.vtType].set_sql_process(
+                    child, global_propsDict[child], lastId)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+            # process children
+            global_props = {'entity_id': child.db_id,
+                                       'entity_type': child.vtType}
+            global_propsDict[child] = global_props
+            # do deletes
+            if not do_copy:
+                for (child, _, _) in childrenDict[child]:
+                    for c in child.db_deleted_children(True):
+                        self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                                c,
+                                                                global_props)
+            child = children.pop(0)[0]
+            child.is_dirty = False
+            child.is_new = False
+            
+            # list of all children
+            # process remaining children
+            for (child, _, _) in children:
+                dbCommand = self['sql'][child.vtType].set_sql_command(
+                                db_connection, child, global_props, do_copy)
+                if dbCommand is not None:
+                    dbCommandList.append(dbCommand)
+                    writtenChildren.append(child)
+                self['sql'][child.vtType].to_sql_fast(child, do_copy)
+    
+        # Execute all child insert/update statements
+        results = self['sql'][children[0][0].vtType].executeSQLGroup(
+                                                        db_connection,
+                                                        dbCommandList, False)
+        resultDict = dict(zip(writtenChildren, results))
+
+        for child, children in childrenDict.iteritems():
+            global_props = global_propsDict[child]
+            # process remaining children
+            for (child, _, _) in children:
+                if child in resultDict:
+                    lastId = resultDict[child]
+                    self['sql'][child.vtType].set_sql_process(child, 
+                                                              global_props,
+                                                              lastId)
+                self['sql'][child.vtType].to_sql_fast(child, do_copy)
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        # print '*** entity_type:', global_props['entity_type']
+                        new_props = {'entity_id': global_props['entity_id'],
+                                     'entity_type': global_props['entity_type']}
+                        is_dirty = child.db_workflow.is_dirty
+                        child.db_workflow.db_entity_type = DBWorkflow.vtType
+                        child.db_workflow.is_dirty = is_dirty
+                        self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                        new_props)
+
+    def delete_from_db(self, db_connection, type, obj_id):
+        root_set = set([DBVistrail.vtType, DBWorkflow.vtType, 
+                        DBLog.vtType, DBRegistry.vtType])
+        if type not in root_set:
+            raise VistrailsDBException("Cannot delete entity of type '%s'" \
+                                           % type)
+
+        id_str = str(obj_id)
+        for (dao_type, dao) in self['sql'].iteritems():
+            if dao_type not in root_set:
+                db_cmd = \
+                    self['sql'][type].createSQLDelete(dao.table,
+                                                      {'entity_type': type,
+                                                       'entity_id': id_str})
+                self['sql'][type].executeSQL(db_connection, db_cmd, False)
+        db_cmd = self['sql'][type].createSQLDelete(self['sql'][type].table,
+                                                   {'id': id_str})
+        self['sql'][type].executeSQL(db_connection, db_cmd, False)
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v1_0_2/persistence/sql/__init__.py b/vistrails/db/versions/v1_0_2/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_2/persistence/sql/auto_gen.py b/vistrails/db/versions/v1_0_2/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..95ec735
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/sql/auto_gen.py
@@ -0,0 +1,5804 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from sql_dao import SQLDAO
+from vistrails.db.versions.v1_0_2.domain import *
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'labels', 'defaults', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            sigstring = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            labels = self.convertFromDB(row[6], 'str', 'varchar(4095)')
+            defaults = self.convertFromDB(row[7], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  sigstring=sigstring,
+                                  labels=labels,
+                                  defaults=defaults,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'labels', 'defaults', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            sigstring = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            labels = self.convertFromDB(row[6], 'str', 'varchar(4095)')
+            defaults = self.convertFromDB(row[7], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[8], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            parent = self.convertFromDB(row[11], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  sigstring=sigstring,
+                                  labels=labels,
+                                  defaults=defaults,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'module_descriptor':
+            p = all_objects[('module_descriptor', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'labels', 'defaults', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_sigstring') and obj.db_sigstring is not None:
+            columnMap['sigstring'] = \
+                self.convertToDB(obj.db_sigstring, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_labels') and obj.db_labels is not None:
+            columnMap['labels'] = \
+                self.convertToDB(obj.db_labels, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_defaults') and obj.db_defaults is not None:
+            columnMap['defaults'] = \
+                self.convertToDB(obj.db_defaults, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'sigstring', 'labels', 'defaults', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_sigstring') and obj.db_sigstring is not None:
+            columnMap['sigstring'] = \
+                self.convertToDB(obj.db_sigstring, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_labels') and obj.db_labels is not None:
+            columnMap['labels'] = \
+                self.convertToDB(obj.db_labels, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_defaults') and obj.db_defaults is not None:
+            columnMap['defaults'] = \
+                self.convertToDB(obj.db_defaults, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleDescriptorSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_descriptor'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[6], 'long', 'int')
+            package = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   package_version=package_version,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[6], 'long', 'int')
+            package = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   package_version=package_version,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('package', obj.db_package) in all_objects:
+            p = all_objects[('package', obj.db_package)]
+            p.db_add_module_descriptor(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package_version') and obj.db_package_version is not None:
+            columnMap['package_version'] = \
+                self.convertToDB(obj.db_package_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package_version') and obj.db_package_version is not None:
+            columnMap['package_version'] = \
+                self.convertToDB(obj.db_package_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_group = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'int')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'int')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'varchar(8191)')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action_annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            action_id = self.convertFromDB(row[3], 'long', 'int')
+            date = self.convertFromDB(row[4], 'datetime', 'datetime')
+            user = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            actionAnnotation = DBActionAnnotation(key=key,
+                                                  value=value,
+                                                  action_id=action_id,
+                                                  date=date,
+                                                  user=user,
+                                                  id=id)
+            actionAnnotation.db_vistrail = vistrail
+            actionAnnotation.db_entity_id = entity_id
+            actionAnnotation.db_entity_type = entity_type
+            actionAnnotation.is_dirty = False
+            res[('actionAnnotation', id)] = actionAnnotation
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            action_id = self.convertFromDB(row[3], 'long', 'int')
+            date = self.convertFromDB(row[4], 'datetime', 'datetime')
+            user = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            actionAnnotation = DBActionAnnotation(key=key,
+                                                  value=value,
+                                                  action_id=action_id,
+                                                  date=date,
+                                                  user=user,
+                                                  id=id)
+            actionAnnotation.db_vistrail = vistrail
+            actionAnnotation.db_entity_id = entity_id
+            actionAnnotation.db_entity_type = entity_type
+            actionAnnotation.is_dirty = False
+            res[('actionAnnotation', id)] = actionAnnotation
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_actionAnnotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_group) in all_objects:
+            p = all_objects[('group', obj.db_group)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBRegistrySQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'registry'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_packages:
+            child.db_registry = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPackageSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'package'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('registry', obj.db_registry) in all_objects:
+            p = all_objects[('registry', obj.db_registry)]
+            p.db_add_package(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_descriptors:
+            child.db_package = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLoopExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'loop_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            iteration = self.convertFromDB(row[3], 'int', 'int')
+            completed = self.convertFromDB(row[4], 'int', 'int')
+            error = self.convertFromDB(row[5], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   iteration=iteration,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            iteration = self.convertFromDB(row[3], 'int', 'int')
+            completed = self.convertFromDB(row[4], 'int', 'int')
+            error = self.convertFromDB(row[5], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   iteration=iteration,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_loop_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_iteration') and obj.db_iteration is not None:
+            columnMap['iteration'] = \
+                self.convertToDB(obj.db_iteration, 'int', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_iteration') and obj.db_iteration is not None:
+            columnMap['iteration'] = \
+                self.convertToDB(obj.db_iteration, 'int', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_tags:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_actionAnnotations:
+            child.db_vistrail = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[8], 'long', 'int')
+            parentType = self.convertFromDB(row[9], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            parent = self.convertFromDB(row[12], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[8], 'long', 'int')
+            parentType = self.convertFromDB(row[9], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            parent = self.convertFromDB(row[12], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_loop_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'actionAnnotation' not in self:
+            self['actionAnnotation'] = DBActionAnnotationSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistrySQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecSQLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_2/persistence/sql/sql_dao.py b/vistrails/db/versions/v1_0_2/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..eab1acc
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/sql/sql_dao.py
@@ -0,0 +1,259 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.services.io import get_db_lib
+from vistrails.core import debug
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertWarning(self, before, after, _from, to):
+        text = ["Value truncated when saving to database",
+                "%s truncated to %s\nwhile converting '%s' to '%s'"]
+        debug.warning(text[0], text[1] % (before, after, _from, to))
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                value = str(value)
+                if db_type.startswith('varchar'):
+                    try:
+                        length = int(db_type[8:-1])
+                        if len(value) > length:
+                            self.convertWarning(value, value[:length],
+                                                type, db_type)
+                            value = value[:length]
+                    except Exception, e:
+                        pass
+                if db_type.startswith('char'):
+                    try:
+                        length = int(db_type[5:-1])
+                        if len(value) > length:
+                            self.convertWarning(value, value[:length],
+                                                type, db_type)
+                            value = value[:length]
+                    except Exception, e:
+                        pass
+                # return "'" + str(value).replace("'", "''") + "'"
+                return value
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                # necessary to avoid conversion warnings in MySQL
+                if db_type.startswith('DECIMAL'):
+                    try:
+                        value="%%.%sf"%str(db_type[8:-1].split(',')[1])%value
+                    except Exception, e:
+                        pass
+                return str(value)
+            elif type == 'int':
+                # note: on 64-bit machines int:s are 64-bit
+                MIN_INT = -2147483648
+                MAX_INT =  2147483647
+                if db_type == 'int':
+                    if int(value) < MIN_INT:
+                        self.convertWarning(value, MIN_INT, type, db_type)
+                        value = MIN_INT
+                    if int(value) > MAX_INT:
+                        self.convertWarning(value, MAX_INT, type, db_type)
+                        value = MAX_INT
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def executeSQLGroup(self, db, dbCommandList, isFetch):
+        """ Executes a command consisting of multiple SELECT statements
+            It returns a list of results from the SELECT statements
+        """
+        data = []
+        # break up into bundles
+        BUNDLE_SIZE = 10000
+        num_commands = len(dbCommandList)
+        n = 0
+        while n<num_commands:
+            dbCommands = dbCommandList[n:(n+BUNDLE_SIZE)]
+            commandString = ''
+            for prepared, values in dbCommands:
+                command = prepared % \
+                              db.escape(values, get_db_lib().converters.conversions)
+                commandString += command
+            cur = db.cursor()
+            try:
+                result = cur.execute(commandString)
+                while True:
+                    r = cur.fetchall() if isFetch else cur.lastrowid
+                    data.append(r)
+                    next = cur.nextset()
+                    if not next:
+                        break
+            except Exception, e:
+                raise VistrailsDBException('Command failed: %s -- """ %s """' % 
+                                           (e, commandString))
+            finally:
+                cur.close()
+            
+            n += BUNDLE_SIZE
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v1_0_2/persistence/xml/__init__.py b/vistrails/db/versions/v1_0_2/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_2/persistence/xml/auto_gen.py b/vistrails/db/versions/v1_0_2/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..d17b767
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/xml/auto_gen.py
@@ -0,0 +1,3902 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+from vistrails.core.system import get_elementtree_library
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v1_0_2.domain import *
+
+ElementTree = get_elementtree_library()
+
+
+class DBOpmProcessIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmWasGeneratedByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasGeneratedBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasGeneratedBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_generated_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasGeneratedBy')
+        
+        # set elements
+        effect = opm_was_generated_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_generated_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_generated_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_generated_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_generated_by.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmAccountsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'accounts':
+            return None
+        
+        accounts = []
+        opm_overlapss = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'overlaps':
+                _data = self.getDao('opm_overlaps').fromXML(child)
+                opm_overlapss.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccounts(accounts=accounts,
+                            opm_overlapss=opm_overlapss)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_accounts, node=None):
+        if node is None:
+            node = ElementTree.Element('accounts')
+        
+        # set elements
+        accounts = opm_accounts.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account').toXML(account, childNode)
+        opm_overlapss = opm_accounts.db_opm_overlapss
+        for opm_overlaps in opm_overlapss:
+            childNode = ElementTree.SubElement(node, 'overlaps')
+            self.getDao('opm_overlaps').toXML(opm_overlaps, childNode)
+        
+        return node
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('optional', None)
+        optional = self.convertFromStr(data, 'int')
+        data = node.get('sortKey', None)
+        sort_key = self.convertFromStr(data, 'int')
+        data = node.get('sigstring', None)
+        sigstring = self.convertFromStr(data, 'str')
+        data = node.get('labels', None)
+        labels = self.convertFromStr(data, 'str')
+        data = node.get('defaults', None)
+        defaults = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         optional=optional,
+                         sort_key=sort_key,
+                         sigstring=sigstring,
+                         labels=labels,
+                         defaults=defaults)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('optional',self.convertToStr(portSpec.db_optional, 'int'))
+        node.set('sortKey',self.convertToStr(portSpec.db_sort_key, 'int'))
+        node.set('sigstring',self.convertToStr(portSpec.db_sigstring, 'str'))
+        node.set('labels',self.convertToStr(portSpec.db_labels, 'str'))
+        node.set('defaults',self.convertToStr(portSpec.db_defaults, 'str'))
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBModuleDescriptorXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleDescriptor':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('packageVersion', None)
+        package_version = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('baseDescriptorId', None)
+        base_descriptor_id = self.convertFromStr(data, 'long')
+        
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleDescriptor(id=id,
+                                 name=name,
+                                 package=package,
+                                 namespace=namespace,
+                                 package_version=package_version,
+                                 version=version,
+                                 base_descriptor_id=base_descriptor_id,
+                                 portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_descriptor, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleDescriptor')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_descriptor.db_id, 'long'))
+        node.set('name',self.convertToStr(module_descriptor.db_name, 'str'))
+        node.set('package',self.convertToStr(module_descriptor.db_package, 'str'))
+        node.set('namespace',self.convertToStr(module_descriptor.db_namespace, 'str'))
+        node.set('packageVersion',self.convertToStr(module_descriptor.db_package_version, 'str'))
+        node.set('version',self.convertToStr(module_descriptor.db_version, 'str'))
+        node.set('baseDescriptorId',self.convertToStr(module_descriptor.db_base_descriptor_id, 'long'))
+        
+        # set elements
+        portSpecs = module_descriptor.db_portSpecs
+        for portSpec in portSpecs:
+            childNode = ElementTree.SubElement(node, 'portSpec')
+            self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBOpmRoleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'role':
+            return None
+        
+        # read attributes
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmRole(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_role, node=None):
+        if node is None:
+            node = ElementTree.Element('role')
+        
+        # set attributes
+        node.set('value',self.convertToStr(opm_role.db_value, 'str'))
+        
+        return node
+
+class DBOpmProcessesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'processes':
+            return None
+        
+        processs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'process':
+                _data = self.getDao('opm_process').fromXML(child)
+                processs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcesses(processs=processs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_processes, node=None):
+        if node is None:
+            node = ElementTree.Element('processes')
+        
+        # set elements
+        processs = opm_processes.db_processs
+        for process in processs:
+            childNode = ElementTree.SubElement(node, 'process')
+            self.getDao('opm_process').toXML(process, childNode)
+        
+        return node
+
+class DBOpmAccountIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAccountId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account_id, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account_id.db_id, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('signature', None)
+        signature = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     signature=signature)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('signature',self.convertToStr(port.db_signature, 'str'))
+        
+        return node
+
+class DBOpmArtifactXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifact':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_artifact_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifact(id=id,
+                            value=value,
+                            accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact, node=None):
+        if node is None:
+            node = ElementTree.Element('artifact')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact.db_id, 'str'))
+        
+        # set elements
+        value = opm_artifact.db_value
+        if value is not None:
+            childNode = ElementTree.SubElement(node, 'value')
+            self.getDao('opm_artifact_value').toXML(value, childNode)
+        accounts = opm_artifact.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            childNode = ElementTree.SubElement(node, 'workflow')
+            self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child_tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            childNode = ElementTree.SubElement(node, 'workflowExec')
+            self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            childNode = ElementTree.SubElement(node, 'machine')
+            self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBOpmAgentsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agents':
+            return None
+        
+        agents = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'agent':
+                _data = self.getDao('opm_agent').fromXML(child)
+                agents.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgents(agents=agents)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agents, node=None):
+        if node is None:
+            node = ElementTree.Element('agents')
+        
+        # set elements
+        agents = opm_agents.db_agents
+        for agent in agents:
+            childNode = ElementTree.SubElement(node, 'agent')
+            self.getDao('opm_agent').toXML(agent, childNode)
+        
+        return node
+
+class DBOpmProcessIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        value = other.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBOpmOverlapsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'overlaps':
+            return None
+        
+        opm_account_ids = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                opm_account_ids.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmOverlaps(opm_account_ids=opm_account_ids)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_overlaps, node=None):
+        if node is None:
+            node = ElementTree.Element('overlaps')
+        
+        # set elements
+        opm_account_ids = opm_overlaps.db_opm_account_ids
+        for opm_account_id in opm_account_ids:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(opm_account_id, childNode)
+        
+        return node
+
+class DBOpmArtifactsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifacts':
+            return None
+        
+        artifacts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'artifact':
+                _data = self.getDao('opm_artifact').fromXML(child)
+                artifacts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifacts(artifacts=artifacts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifacts, node=None):
+        if node is None:
+            node = ElementTree.Element('artifacts')
+        
+        # set elements
+        artifacts = opm_artifacts.db_artifacts
+        for artifact in artifacts:
+            childNode = ElementTree.SubElement(node, 'artifact')
+            self.getDao('opm_artifact').toXML(artifact, childNode)
+        
+        return node
+
+class DBOpmDependenciesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'causalDependencies':
+            return None
+        
+        dependencys = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'used':
+                _data = self.getDao('opm_used').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasGeneratedBy':
+                _data = self.getDao('opm_was_generated_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasTriggeredBy':
+                _data = self.getDao('opm_was_triggered_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasDerivedFrom':
+                _data = self.getDao('opm_was_derived_from').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasControlledBy':
+                _data = self.getDao('opm_was_controlled_by').fromXML(child)
+                dependencys.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmDependencies(dependencys=dependencys)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_dependencies, node=None):
+        if node is None:
+            node = ElementTree.Element('causalDependencies')
+        
+        # set elements
+        dependencys = opm_dependencies.db_dependencys
+        for dependency in dependencys:
+            if dependency.vtType == 'opm_used':
+                childNode = ElementTree.SubElement(node, 'used')
+                self.getDao('opm_used').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_generated_by':
+                childNode = ElementTree.SubElement(node, 'wasGeneratedBy')
+                self.getDao('opm_was_generated_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_triggered_by':
+                childNode = ElementTree.SubElement(node, 'wasTriggeredBy')
+                self.getDao('opm_was_triggered_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_derived_from':
+                childNode = ElementTree.SubElement(node, 'wasDerivedFrom')
+                self.getDao('opm_was_derived_from').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_controlled_by':
+                childNode = ElementTree.SubElement(node, 'wasControlledBy')
+                self.getDao('opm_was_controlled_by').toXML(dependency, childNode)
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBOpmUsedXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'used':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmUsed(effect=effect,
+                        role=role,
+                        cause=cause,
+                        accounts=accounts,
+                        opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_used, node=None):
+        if node is None:
+            node = ElementTree.Element('used')
+        
+        # set elements
+        effect = opm_used.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_used.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_used.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_used.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_used.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            childNode = ElementTree.SubElement(node, 'parameter')
+            self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBActionAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'actionAnnotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        data = node.get('actionId', None)
+        action_id = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        
+        obj = DBActionAnnotation(id=id,
+                                 key=key,
+                                 value=value,
+                                 action_id=action_id,
+                                 date=date,
+                                 user=user)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, actionAnnotation, node=None):
+        if node is None:
+            node = ElementTree.Element('actionAnnotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(actionAnnotation.db_id, 'long'))
+        node.set('key',self.convertToStr(actionAnnotation.db_key, 'str'))
+        node.set('value',self.convertToStr(actionAnnotation.db_value, 'str'))
+        node.set('actionId',self.convertToStr(actionAnnotation.db_action_id, 'long'))
+        node.set('date',self.convertToStr(actionAnnotation.db_date, 'datetime'))
+        node.set('user',self.convertToStr(actionAnnotation.db_user, 'str'))
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('internalVersion', None)
+        internal_version = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            internal_version=internal_version,
+                            location=location,
+                            functions=functions,
+                            annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('cache',self.convertToStr(abstraction.db_cache, 'int'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        node.set('namespace',self.convertToStr(abstraction.db_namespace, 'str'))
+        node.set('package',self.convertToStr(abstraction.db_package, 'str'))
+        node.set('version',self.convertToStr(abstraction.db_version, 'str'))
+        node.set('internalVersion',self.convertToStr(abstraction.db_internal_version, 'str'))
+        
+        # set elements
+        location = abstraction.db_location
+        if location is not None:
+            childNode = ElementTree.SubElement(node, 'location')
+            self.getDao('location').toXML(location, childNode)
+        functions = abstraction.db_functions
+        for function in functions:
+            childNode = ElementTree.SubElement(node, 'function')
+            self.getDao('function').toXML(function, childNode)
+        annotations = abstraction.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            childNode = ElementTree.SubElement(node, 'connection')
+            self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            childNode = ElementTree.SubElement(node, 'plugin_data')
+            self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            childNode = ElementTree.SubElement(node, 'other')
+            self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBOpmArtifactIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBOpmArtifactValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                value = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifactValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_artifact_value.db_value
+        if value is not None:
+            if value.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(value, childNode)
+            elif value.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(value, childNode)
+        
+        return node
+
+class DBOpmArtifactIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmGraphXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'opmGraph':
+            return None
+        
+        accounts = None
+        processes = None
+        artifacts = None
+        agents = None
+        dependencies = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'accounts':
+                _data = self.getDao('opm_accounts').fromXML(child)
+                accounts = _data
+            elif child_tag == 'processes':
+                _data = self.getDao('opm_processes').fromXML(child)
+                processes = _data
+            elif child_tag == 'artifacts':
+                _data = self.getDao('opm_artifacts').fromXML(child)
+                artifacts = _data
+            elif child_tag == 'agents':
+                _data = self.getDao('opm_agents').fromXML(child)
+                agents = _data
+            elif child_tag == 'causalDependencies':
+                _data = self.getDao('opm_dependencies').fromXML(child)
+                dependencies = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmGraph(accounts=accounts,
+                         processes=processes,
+                         artifacts=artifacts,
+                         agents=agents,
+                         dependencies=dependencies)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_graph, node=None):
+        if node is None:
+            node = ElementTree.Element('opmGraph')
+        
+        # set elements
+        accounts = opm_graph.db_accounts
+        if accounts is not None:
+            childNode = ElementTree.SubElement(node, 'accounts')
+            self.getDao('opm_accounts').toXML(accounts, childNode)
+        processes = opm_graph.db_processes
+        if processes is not None:
+            childNode = ElementTree.SubElement(node, 'processes')
+            self.getDao('opm_processes').toXML(processes, childNode)
+        artifacts = opm_graph.db_artifacts
+        if artifacts is not None:
+            childNode = ElementTree.SubElement(node, 'artifacts')
+            self.getDao('opm_artifacts').toXML(artifacts, childNode)
+        agents = opm_graph.db_agents
+        if agents is not None:
+            childNode = ElementTree.SubElement(node, 'agents')
+            self.getDao('opm_agents').toXML(agents, childNode)
+        dependencies = opm_graph.db_dependencies
+        if dependencies is not None:
+            childNode = ElementTree.SubElement(node, 'causalDependencies')
+            self.getDao('opm_dependencies').toXML(dependencies, childNode)
+        
+        return node
+
+class DBRegistryXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'registry':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('rootDescriptorId', None)
+        root_descriptor_id = self.convertFromStr(data, 'long')
+        
+        packages = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'package':
+                _data = self.getDao('package').fromXML(child)
+                packages.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBRegistry(id=id,
+                         version=version,
+                         root_descriptor_id=root_descriptor_id,
+                         packages=packages)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, registry, node=None):
+        if node is None:
+            node = ElementTree.Element('registry')
+        
+        # set attributes
+        node.set('id',self.convertToStr(registry.db_id, 'long'))
+        node.set('version',self.convertToStr(registry.db_version, 'str'))
+        node.set('rootDescriptorId',self.convertToStr(registry.db_root_descriptor_id, 'long'))
+        
+        # set elements
+        packages = registry.db_packages
+        for package in packages:
+            childNode = ElementTree.SubElement(node, 'package')
+            self.getDao('package').toXML(package, childNode)
+        
+        return node
+
+class DBOpmAccountXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccount(id=id,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account.db_id, 'str'))
+        
+        # set elements
+        value = opm_account.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOpmWasDerivedFromXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasDerivedFrom':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasDerivedFrom(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_derived_from, node=None):
+        if node is None:
+            node = ElementTree.Element('wasDerivedFrom')
+        
+        # set elements
+        effect = opm_was_derived_from.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_derived_from.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_derived_from.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_was_derived_from.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_derived_from.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmWasControlledByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasControlledBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        starts = []
+        ends = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'agent':
+                _data = self.getDao('opm_agent_id').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                starts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                ends.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasControlledBy(effect=effect,
+                                   role=role,
+                                   cause=cause,
+                                   accounts=accounts,
+                                   starts=starts,
+                                   ends=ends)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_controlled_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasControlledBy')
+        
+        # set elements
+        effect = opm_was_controlled_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_controlled_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_controlled_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'agent')
+            self.getDao('opm_agent_id').toXML(cause, childNode)
+        accounts = opm_was_controlled_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        starts = opm_was_controlled_by.db_starts
+        for start in starts:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(start, childNode)
+        ends = opm_was_controlled_by.db_ends
+        for end in ends:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(end, childNode)
+        
+        return node
+
+class DBOpmAgentIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAgentId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent_id, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent_id.db_id, 'str'))
+        
+        return node
+
+class DBGroupExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'groupExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('groupName', None)
+        group_name = self.convertFromStr(data, 'str')
+        data = node.get('groupType', None)
+        group_type = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroupExec(item_execs=item_execs,
+                          id=id,
+                          ts_start=ts_start,
+                          ts_end=ts_end,
+                          cached=cached,
+                          module_id=module_id,
+                          group_name=group_name,
+                          group_type=group_type,
+                          completed=completed,
+                          error=error,
+                          machine_id=machine_id,
+                          annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('groupExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(group_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(group_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(group_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(group_exec.db_module_id, 'long'))
+        node.set('groupName',self.convertToStr(group_exec.db_group_name, 'str'))
+        node.set('groupType',self.convertToStr(group_exec.db_group_type, 'str'))
+        node.set('completed',self.convertToStr(group_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(group_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(group_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = group_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        item_execs = group_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBOpmTimeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'time':
+            return None
+        
+        # read attributes
+        data = node.get('noLaterThan', None)
+        no_later_than = self.convertFromStr(data, 'datetime')
+        data = node.get('noEarlierThan', None)
+        no_earlier_than = self.convertFromStr(data, 'datetime')
+        data = node.get('clockId', None)
+        clock_id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmTime(no_later_than=no_later_than,
+                        no_earlier_than=no_earlier_than,
+                        clock_id=clock_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_time, node=None):
+        if node is None:
+            node = ElementTree.Element('time')
+        
+        # set attributes
+        node.set('noLaterThan',self.convertToStr(opm_time.db_no_later_than, 'datetime'))
+        node.set('noEarlierThan',self.convertToStr(opm_time.db_no_earlier_than, 'datetime'))
+        node.set('clockId',self.convertToStr(opm_time.db_clock_id, 'str'))
+        
+        return node
+
+class DBPackageXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'package':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('identifier', None)
+        identifier = self.convertFromStr(data, 'str')
+        data = node.get('codepath', None)
+        codepath = self.convertFromStr(data, 'str')
+        data = node.get('loadConfiguration', None)
+        load_configuration = self.convertFromStr(data, 'int')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('description', None)
+        description = self.convertFromStr(data, 'str')
+        
+        module_descriptors = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleDescriptor':
+                _data = self.getDao('module_descriptor').fromXML(child)
+                module_descriptors.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPackage(id=id,
+                        name=name,
+                        identifier=identifier,
+                        codepath=codepath,
+                        load_configuration=load_configuration,
+                        version=version,
+                        description=description,
+                        module_descriptors=module_descriptors)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, package, node=None):
+        if node is None:
+            node = ElementTree.Element('package')
+        
+        # set attributes
+        node.set('id',self.convertToStr(package.db_id, 'long'))
+        node.set('name',self.convertToStr(package.db_name, 'str'))
+        node.set('identifier',self.convertToStr(package.db_identifier, 'str'))
+        node.set('codepath',self.convertToStr(package.db_codepath, 'str'))
+        node.set('loadConfiguration',self.convertToStr(package.db_load_configuration, 'int'))
+        node.set('version',self.convertToStr(package.db_version, 'str'))
+        node.set('description',self.convertToStr(package.db_description, 'str'))
+        
+        # set elements
+        module_descriptors = package.db_module_descriptors
+        for module_descriptor in module_descriptors:
+            childNode = ElementTree.SubElement(node, 'moduleDescriptor')
+            self.getDao('module_descriptor').toXML(module_descriptor, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        annotations = []
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(item_execs=item_execs,
+                             id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name,
+                             annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        annotations = workflow_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        item_execs = workflow_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBLoopExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'loopExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('iteration', None)
+        iteration = self.convertFromStr(data, 'int')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLoopExec(item_execs=item_execs,
+                         id=id,
+                         ts_start=ts_start,
+                         ts_end=ts_end,
+                         iteration=iteration,
+                         completed=completed,
+                         error=error)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, loop_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('loopExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(loop_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(loop_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(loop_exec.db_ts_end, 'datetime'))
+        node.set('iteration',self.convertToStr(loop_exec.db_iteration, 'int'))
+        node.set('completed',self.convertToStr(loop_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(loop_exec.db_error, 'str'))
+        
+        # set elements
+        item_execs = loop_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            childNode = ElementTree.SubElement(node, 'port')
+            self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBOpmProcessXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'process':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_process_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcess(id=id,
+                           value=value,
+                           accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process, node=None):
+        if node is None:
+            node = ElementTree.Element('process')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process.db_id, 'str'))
+        
+        # set elements
+        value = opm_process.db_value
+        if value is not None:
+            childNode = ElementTree.SubElement(node, 'value')
+            self.getDao('opm_process_value').toXML(value, childNode)
+        accounts = opm_process.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBOpmWasTriggeredByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasTriggeredBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasTriggeredBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_triggered_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasTriggeredBy')
+        
+        # set elements
+        effect = opm_was_triggered_by.db_effect
+        if effect is not None:
+            childNode = ElementTree.SubElement(node, 'effect')
+            self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_triggered_by.db_role
+        if role is not None:
+            childNode = ElementTree.SubElement(node, 'role')
+            self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_triggered_by.db_cause
+        if cause is not None:
+            childNode = ElementTree.SubElement(node, 'cause')
+            self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_triggered_by.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_triggered_by.db_opm_times
+        for opm_time in opm_times:
+            childNode = ElementTree.SubElement(node, 'time')
+            self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmProcessValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcessValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_process_value.db_value
+        if value is not None:
+            if value.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(value, childNode)
+            elif value.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(value, childNode)
+            elif value.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(value, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBOpmAgentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgent(id=id,
+                         value=value,
+                         accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent.db_id, 'str'))
+        
+        # set elements
+        value = opm_agent.db_value
+        childNode = ElementTree.SubElement(node, 'value')
+        childNode.text = self.convertToStr(value, 'str')
+        accounts = opm_agent.db_accounts
+        for account in accounts:
+            childNode = ElementTree.SubElement(node, 'account')
+            self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        actionAnnotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child_tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'actionAnnotation':
+                _data = self.getDao('actionAnnotation').fromXML(child)
+                actionAnnotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations,
+                         actionAnnotations=actionAnnotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            childNode = ElementTree.SubElement(node, 'action')
+            self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            childNode = ElementTree.SubElement(node, 'tag')
+            self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        actionAnnotations = vistrail.db_actionAnnotations
+        for actionAnnotation in actionAnnotations:
+            childNode = ElementTree.SubElement(node, 'actionAnnotation')
+            self.getDao('actionAnnotation').toXML(actionAnnotation, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        loop_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                loop_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           machine_id=machine_id,
+                           annotations=annotations,
+                           loop_execs=loop_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            childNode = ElementTree.SubElement(node, 'annotation')
+            self.getDao('annotation').toXML(annotation, childNode)
+        loop_execs = module_exec.db_loop_execs
+        for loop_exec in loop_execs:
+            childNode = ElementTree.SubElement(node, 'loopExec')
+            self.getDao('loop_exec').toXML(loop_exec, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'opm_process_id_effect' not in self:
+            self['opm_process_id_effect'] = DBOpmProcessIdEffectXMLDAOBase(self)
+        if 'opm_was_generated_by' not in self:
+            self['opm_was_generated_by'] = DBOpmWasGeneratedByXMLDAOBase(self)
+        if 'opm_accounts' not in self:
+            self['opm_accounts'] = DBOpmAccountsXMLDAOBase(self)
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'opm_role' not in self:
+            self['opm_role'] = DBOpmRoleXMLDAOBase(self)
+        if 'opm_processes' not in self:
+            self['opm_processes'] = DBOpmProcessesXMLDAOBase(self)
+        if 'opm_account_id' not in self:
+            self['opm_account_id'] = DBOpmAccountIdXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'opm_artifact' not in self:
+            self['opm_artifact'] = DBOpmArtifactXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'opm_agents' not in self:
+            self['opm_agents'] = DBOpmAgentsXMLDAOBase(self)
+        if 'opm_process_id_cause' not in self:
+            self['opm_process_id_cause'] = DBOpmProcessIdCauseXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'opm_overlaps' not in self:
+            self['opm_overlaps'] = DBOpmOverlapsXMLDAOBase(self)
+        if 'opm_artifacts' not in self:
+            self['opm_artifacts'] = DBOpmArtifactsXMLDAOBase(self)
+        if 'opm_dependencies' not in self:
+            self['opm_dependencies'] = DBOpmDependenciesXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'opm_used' not in self:
+            self['opm_used'] = DBOpmUsedXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'actionAnnotation' not in self:
+            self['actionAnnotation'] = DBActionAnnotationXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'opm_artifact_id_cause' not in self:
+            self['opm_artifact_id_cause'] = DBOpmArtifactIdCauseXMLDAOBase(self)
+        if 'opm_artifact_value' not in self:
+            self['opm_artifact_value'] = DBOpmArtifactValueXMLDAOBase(self)
+        if 'opm_artifact_id_effect' not in self:
+            self['opm_artifact_id_effect'] = DBOpmArtifactIdEffectXMLDAOBase(self)
+        if 'opm_graph' not in self:
+            self['opm_graph'] = DBOpmGraphXMLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistryXMLDAOBase(self)
+        if 'opm_account' not in self:
+            self['opm_account'] = DBOpmAccountXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'opm_was_derived_from' not in self:
+            self['opm_was_derived_from'] = DBOpmWasDerivedFromXMLDAOBase(self)
+        if 'opm_was_controlled_by' not in self:
+            self['opm_was_controlled_by'] = DBOpmWasControlledByXMLDAOBase(self)
+        if 'opm_agent_id' not in self:
+            self['opm_agent_id'] = DBOpmAgentIdXMLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecXMLDAOBase(self)
+        if 'opm_time' not in self:
+            self['opm_time'] = DBOpmTimeXMLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'opm_process' not in self:
+            self['opm_process'] = DBOpmProcessXMLDAOBase(self)
+        if 'opm_was_triggered_by' not in self:
+            self['opm_was_triggered_by'] = DBOpmWasTriggeredByXMLDAOBase(self)
+        if 'opm_process_value' not in self:
+            self['opm_process_value'] = DBOpmProcessValueXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'opm_agent' not in self:
+            self['opm_agent'] = DBOpmAgentXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_2/persistence/xml/xml_dao.py b/vistrails/db/versions/v1_0_2/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..c7a78ca
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/persistence/xml/xml_dao.py
@@ -0,0 +1,86 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    try:
+                        return int(value)
+                    except ValueError:
+                        if 'False' == value:
+                            return -1
+                        else:
+                            return 0
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                   return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v1_0_2/schemas/sql/vistrails.sql b/vistrails/db/versions/v1_0_2/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..a6e8e43
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/schemas/sql/vistrails.sql
@@ -0,0 +1,390 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+CREATE TABLE `vistrails_version`(`version` char(16)) engine=InnoDB;
+INSERT INTO `vistrails_version`(`version`) VALUES ('1.0.2');
+
+CREATE TABLE thumbnail(
+    id int not null auto_increment primary key,
+    file_name varchar(255),
+    image_bytes mediumblob,
+    last_modified datetime
+) engine=InnoDB;
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(255),
+    type varchar(255),
+    optional int,
+    sort_key int,
+    sigstring varchar(4095),
+    labels varchar(4095),
+    defaults varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module_descriptor(
+    id int,
+    name varchar(255),
+    package varchar(255),
+    namespace varchar(255),
+    package_version varchar(255),
+    version varchar(255),
+    base_descriptor_id int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    signature varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram int,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val varchar(8191),
+    alias varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action_annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    action_id int,
+    date datetime,
+    user varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    internal_version varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE registry(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    root_descriptor_id int,
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE group_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    group_name varchar(255),
+    group_type varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE package(
+    id int not null auto_increment primary key,
+    name varchar(255),
+    identifier varchar(1023),
+    codepath varchar(1023),
+    load_configuration int,
+    version varchar(255),
+    description varchar(1023),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE loop_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    iteration int,
+    completed int,
+    error varchar(1023),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v1_0_2/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v1_0_2/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..42c5b42
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,42 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+DROP TABLE IF EXISTS `vistrails_version`;
+
+DROP TABLE IF EXISTS thumbnail;
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS port_spec, module, module_descriptor, tag, port, group_tbl, log_tbl, machine, add_tbl, other, location, parameter, plugin_data, function, action_annotation, abstraction, workflow, registry, annotation, change_tbl, group_exec, package, workflow_exec, loop_exec, connection_tbl, action, delete_tbl, vistrail, module_exec;
diff --git a/vistrails/db/versions/v1_0_2/schemas/xml/log.xsd b/vistrails/db/versions/v1_0_2/schemas/xml/log.xsd
new file mode 100644
index 0000000..2f6a6af
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/schemas/xml/log.xsd
@@ -0,0 +1,146 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="log">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="workflow_exec" ref="workflowExec" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="machine" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflowExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element name="module_exec" ref="moduleExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="group_exec" ref="groupExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="ip" type="xs:string"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="vtVersion" type="xs:string"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="parentId" type="xs:int"/>
+      <xs:attribute name="parentType" type="xs:string"/>
+      <xs:attribute name="parentVersion" type="xs:int"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="machine">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="os" type="xs:string"/>
+      <xs:attribute name="architecture" type="xs:string"/>
+      <xs:attribute name="processor" type="xs:string"/>
+      <xs:attribute name="ram" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="moduleExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="cached" type="xs:int"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="error" type="xs:string"/>
+      <xs:attribute name="machine_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="groupExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element name="module_exec" ref="moduleExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="group_exec" ref="groupExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="cached" type="xs:int"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="groupName" type="xs:string"/>
+      <xs:attribute name="groupType" type="xs:string"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="error" type="xs:string"/>
+      <xs:attribute name="machine_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="loopExec">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element name="module_exec" ref="moduleExec" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="group_exec" ref="groupExec" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="iteration" type="xs:int"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="error" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_2/schemas/xml/vistrail.xsd b/vistrails/db/versions/v1_0_2/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..5174ac7
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/schemas/xml/vistrail.xsd
@@ -0,0 +1,287 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="actionAnnotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="actionAnnotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+      <xs:attribute name="actionId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="user" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="sigstring" type="xs:string"/>
+      <xs:attribute name="labels" type="xs:string"/>
+      <xs:attribute name="defaults" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_2/schemas/xml/vtlink.xsd b/vistrails/db/versions/v1_0_2/schemas/xml/vtlink.xsd
new file mode 100644
index 0000000..011b59c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/schemas/xml/vtlink.xsd
@@ -0,0 +1,69 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xs:element name="vtlink">
+<xs:complexType>
+<!-- if the vistrail is in a DB use host, database, port and vtid -->
+<xs:attribute name="host" type="xs:string"></xs:attribute>
+<xs:attribute name="database" type="xs:string"></xs:attribute>
+<xs:attribute name="port" type="xs:int"></xs:attribute>
+<xs:attribute name="vtid" type="xs:int"></xs:attribute>
+<!-- if the vistrail is a file use filename below -->
+<xs:attribute name="filename" type="xs:string"></xs:attribute>
+<!-- this is the workflow version -->
+<xs:attribute name="version" type="xs:int"></xs:attribute>
+<!-- this is the workflow tag -->
+<xs:attribute name="tag" type="xs:string"></xs:attribute>
+<xs:attribute name="url" type="xs:string"></xs:attribute>
+<!--  vtcontent can be a workflow in xml or a .vt file base64 encoded -->
+<xs:attribute name="vtcontent" type="xs:string"></xs:attribute>
+<!--  if execute is true the workflow will be executed -->
+<xs:attribute name="execute" type="xs:boolean"></xs:attribute>
+<!--  if showSpreadsheetOnly is True we will hide the builder -->
+<xs:attribute name="showSpreadsheetOnly" type="xs:boolean"></xs:attribute>
+<!--  if there's database information and a workflow is embedded, it will
+force loading from the db instead of using the emebedded version -->
+<xs:attribute name="forceDB" type="xs:boolean"></xs:attribute>
+<!--  if mashuptrail and mashupVersion are set, VisTrails will execute the
+mashup -->
+<xs:attribute name="mashuptrail" type="xs:string"></xs:attribute>
+<xs:attribute name="mashupVersion" type="xs:int"></xs:attribute>
+</xs:complexType>
+</xs:element>
+
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_2/schemas/xml/workflow.xsd b/vistrails/db/versions/v1_0_2/schemas/xml/workflow.xsd
new file mode 100644
index 0000000..9f7fbda
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/schemas/xml/workflow.xsd
@@ -0,0 +1,185 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="sigstring" type="xs:string"/>
+      <xs:attribute name="labels" type="xs:string"/>
+      <xs:attribute name="defaults" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_2/specs/all.xml b/vistrails/db/versions/v1_0_2/specs/all.xml
new file mode 100644
index 0000000..6fba3a2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/specs/all.xml
@@ -0,0 +1,2746 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION_ANNOTATION +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="actionAnnotation">
+    <layout>
+      <xml nodeType="xs:element"/>
+      <sql table="action_annotation"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="action_id" type="long" foreignKey="true" object="action">
+      <xml name="actionId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>    
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOOP_EXEC +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="loop_exec">
+    <layout>
+      <xml name="loopExec" nodeType="xs:element"/>
+      <sql table="loop_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <!--<property name="input" type="str">
+      <xml name="input" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>-->
+
+    <property name="iteration" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+      
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP_EXEC ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group_exec">
+    <layout>
+      <xml name="groupExec" nodeType="xs:element"/>
+      <sql table="group_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="group_name" type="str">
+      <xml name="groupName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="group_type" type="str">
+      <xml name="groupType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <!--<property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>-->
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="signature" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="optional" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sort_key" type="int">
+      <xml name="sortKey" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sigstring" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="labels" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="defaults" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="module_descriptor">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_DESCRIPTOR +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_descriptor">
+    <layout>
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+      <sql table="module_descriptor"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+	   
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package_version" type="str">
+      <xml name="packageVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="base_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="baseDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="package" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+    <!--
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="registry">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="package">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    -->
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PACKAGE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="package">
+    <layout>
+      <xml name="package" nodeType="xs:element"/>
+      <sql table="package"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="identifier" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="codepath" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+      
+    <property name="load_configuration" type="int">
+      <xml name="loadConfiguration" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>      
+
+    <property name="description" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_descriptor" type="list" 
+	      mapping="one-to-many" index="name:namespace:version">
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="registry" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- REGISTRY ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="registry">
+    <layout>
+      <xml name="registry" nodeType="xs:element"/>
+      <sql table="registry"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="root_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="rootDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <!-- <xml nodeType="xs:attribute" type="xs:string"/> -->
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="package" type="list"
+	      mapping="one-to-many" index="identifier:version">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="actionAnnotation" type="list" 
+	      mapping="one-to-many" index="action_id:key !key:value">
+      <xml nodeType="xs:element"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="group" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_GRAPH +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_graph">
+    <layout>
+      <xml name="opmGraph" nodeType="xs:element"/>
+      <!-- <sql table="opm_graph"/> -->
+    </layout>
+
+    <property name="accounts" ref="true" object="opm_accounts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="processes" ref="true" object="opm_processes" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="artifacts" ref="true" object="opm_artifacts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="agents" ref="true" object="opm_agents" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="dependencies" ref="true" object="opm_dependencies" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNTS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_accounts">
+    <layout>
+      <xml name="accounts" nodeType="xs:element"/>
+      <!-- <sql table="accounts"/> -->
+    </layout>
+
+    <property name="account" ref="true" object="opm_account" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="opm_overlaps" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_account">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_OVERLAPS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_overlaps">
+    <layout>
+      <xml name="overlaps" nodeType="xs:element"/>
+      <!-- <sql table="overlaps"/> -->
+    </layout>
+
+    <property ref="true" object="opm_account_id" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACTS +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifacts">
+    <layout>
+      <xml name="artifacts" nodeType="xs:element"/>
+      <!-- <sql table="artifacts"/> -->
+    </layout>
+
+    <property name="artifact" ref="true" object="opm_artifact" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_VALUE ++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="artifact_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="portSpec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="function" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact">
+    <layout>
+      <xml name="artifact" nodeType="xs:element"/>
+      <!-- <sql table="artifact"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" ref="true" object="opm_artifact_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESSES +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_processes">
+    <layout>
+      <xml name="processes" nodeType="xs:element"/>
+      <!-- <sql table="processes"/> -->
+    </layout>
+
+    <property name="process" ref="true" object="opm_process" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_VALUE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="process_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="module_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process">
+    <layout>
+      <xml name="process" nodeType="xs:element"/>
+      <!-- <sql table="process"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="value" ref="true" object="opm_process_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENTS ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agents">
+    <layout>
+      <xml name="agents" nodeType="xs:element"/>
+      <!-- <sql table="agents"/> -->
+    </layout>
+
+    <property name="agent" ref="true" object="opm_agent" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agent">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type=""/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_DEPENDENCIES ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_dependencies">
+    <layout>
+      <xml name="causalDependencies" nodeType="xs:element"/>
+      <!-- <sql table="causal_dependencies"/> -->
+    </layout>
+
+    <choice name="dependency" type="list" mapping="one-to-many">
+      <property name="used" ref="true" object="opm_used">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_generated_by" ref="true" 
+		object="opm_was_generated_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_triggered_by" ref="true" 
+		object="opm_was_triggered_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_derived_from" ref="true" 
+		object="opm_was_derived_from">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_controlled_by" ref="true" 
+		object="opm_was_controlled_by">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_TIME ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_time">
+    <layout>
+      <xml name="time" nodeType="xs:element"/>
+      <!-- <sql table="time"/> -->
+    </layout>
+
+    <property name="no_later_than" type="datetime">
+      <xml name="noLaterThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="no_earlier_than" type="datetime">
+      <xml name="noEarlierThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="clock_id" type="str">
+      <xml name="clockId" nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT_ID ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_account_id">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_account">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_CAUSE ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="process_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_EFFECT +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="process_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_CAUSE +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_EFFECT ++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT_ID ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_agent_id">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_agent">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ROLE ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_role">
+    <layout>
+      <xml name="role" nodeType="xs:element"/>
+      <!-- <sql table="role"/> -->
+    </layout>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(4095)"/> -->
+    </property>
+  </object>
+  
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_USED ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_used">
+    <layout>
+      <xml name="used" nodeType="xs:element"/>
+      <!-- <sql table="used"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_GENERATED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_generated_by">
+    <layout>
+      <xml name="wasGeneratedBy" nodeType="xs:element"/>
+      <!-- <sql table="was_generated_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_CONTROLLED_BY +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_controlled_by">
+    <layout>
+      <xml name="wasControlledBy" nodeType="xs:element"/>
+      <!-- <sql table="was_controlled_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_agent_id"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="start" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="end" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_DERIVED_FROM ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_derived_from">
+    <layout>
+      <xml name="wasDerivedFrom" nodeType="xs:element"/>
+      <!-- <sql table="was_derived_from"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_TRIGGERED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_triggered_by">
+    <layout>
+      <xml name="wasTriggeredBy" nodeType="xs:element"/>
+      <!-- <sql table="was_triggered_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+</objects>
diff --git a/vistrails/db/versions/v1_0_2/translate/__init__.py b/vistrails/db/versions/v1_0_2/translate/__init__.py
new file mode 100644
index 0000000..0e024b6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.2'
diff --git a/vistrails/db/versions/v1_0_2/translate/v1_0_1.py b/vistrails/db/versions/v1_0_2/translate/v1_0_1.py
new file mode 100644
index 0000000..375c11f
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/translate/v1_0_1.py
@@ -0,0 +1,145 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+from vistrails.db.versions.v1_0_2.domain import DBVistrail, DBWorkflow, DBLog, \
+    DBRegistry, DBGroup, DBActionAnnotation, DBAnnotation, DBAction, IdScope
+
+def translateVistrail(_vistrail):
+    tag_annotations = []
+    notes_annotations = []
+    thumb_annotations = []
+    upgrade_annotations = []
+    prune_annotations = []
+
+    def update_type(old_obj, translate_dict):
+        if old_obj.db_type.find('|') >= 0:
+            [identifier, m_and_ns] = old_obj.db_type.split(':', 1)
+            # this second check is fragile but should be ok
+            if m_and_ns.find(':') == -1 or m_and_ns.startswith('http://'):
+                # need to move module name
+                try:
+                    [namespace, module] = m_and_ns.rsplit('|', 1)
+                    new_type = ':'.join([identifier, module, namespace])
+                    return new_type
+                except Exception, e:
+                    # just bail for now
+                    print e
+                    pass
+        return old_obj.db_type
+
+    def update_tags(old_obj, translate_dict):
+        for tag in old_obj.db_tags:
+            tag_annotations.append((tag.db_id, tag.db_name, None))
+        return []
+
+    def update_actions(old_obj, translate_dict):
+        new_actions = []
+        for action in old_obj.db_actions:
+            if action.db_prune == 1:
+                prune_annotations.append((action.db_id, str(True), None))
+            new_actions.append(DBAction.update_version(action, translate_dict))
+        return new_actions
+
+    def update_annotations(old_obj, translate_dict):
+        same_annotations = []
+        for annotation in old_obj.db_annotations:
+            if annotation.db_key == '__notes__':
+                notes_annotations.append((old_obj.db_id, annotation.db_value,
+                                          annotation.db_id))
+            elif annotation.db_key == '__thumb__':
+                thumb_annotations.append((old_obj.db_id, annotation.db_value,
+                                          annotation.db_id))
+            elif annotation.db_key == '__upgrade__':
+                upgrade_annotations.append((old_obj.db_id, 
+                                            annotation.db_value,
+                                            annotation.db_id))
+            else:
+                same_annotations.append(
+                    DBAnnotation.update_version(annotation, translate_dict))
+        return same_annotations
+
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+
+    translate_dict = {'DBGroup': {'workflow': update_workflow},
+                      'DBVistrail': {'tags': update_tags,
+                                     'actions': update_actions},
+                      'DBAction': {'annotations': update_annotations},
+                      'DBParameter': {'type': update_type},
+                      }
+    _vistrail.update_id_scope()
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict)
+
+    id_scope = vistrail.idScope
+    id_scope.setBeginId('annotation', _vistrail.idScope.getNewId('annotation'))
+    key_lists = {'__tag__': tag_annotations,
+                 '__notes__': notes_annotations,
+                 '__thumb__': thumb_annotations,
+                 '__upgrade__': upgrade_annotations,
+                 '__prune__': prune_annotations}
+    for key, annotations in key_lists.iteritems():
+        for action_id, value, new_id in annotations:
+            if new_id is None:
+                new_id = id_scope.getNewId(DBActionAnnotation.vtType)
+            annotation = DBActionAnnotation(id=new_id,
+                                            action_id=action_id,
+                                            key=key,
+                                            value=value)
+            annotation.is_new = False
+            annotation.is_dirty = False
+            vistrail.db_add_actionAnnotation(annotation)
+
+    vistrail.db_version = '1.0.2'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBGroup': {'workflow': update_workflow}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+    workflow.db_version = '1.0.2'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.2'
+    return log
+
+def translateRegistry(_registry):
+    translate_dict = {}
+    registry = DBRegistry.update_version(_registry, translate_dict)
+    registry.db_version = '1.0.2'
+    return registry
diff --git a/vistrails/db/versions/v1_0_2/translate/v1_0_3.py b/vistrails/db/versions/v1_0_2/translate/v1_0_3.py
new file mode 100644
index 0000000..d4d7a8c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_2/translate/v1_0_3.py
@@ -0,0 +1,207 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v1_0_2.domain import DBVistrail, DBAnnotation, \
+                                      DBWorkflow, DBLog, DBRegistry, \
+                                      DBPortSpec, DBAdd, DBChange, DBDelete
+from vistrails.core import debug
+from vistrails.core.system import get_elementtree_library
+ElementTree = get_elementtree_library()
+
+import unittest
+
+id_scope = None
+
+def update_portSpec(old_obj, translate_dict):
+    global id_scope
+    
+    sigs = []
+    defaults = []
+    labels = []
+    for psi in sorted(old_obj.db_portSpecItems, key=lambda x: x.db_pos):
+        sigs.append((psi.db_package, psi.db_module, psi.db_namespace))
+        defaults.append(psi.db_default)
+        labels.append(psi.db_label)
+    new_obj = DBPortSpec.update_version(old_obj, translate_dict)
+    sigstring = '(' + ','.join('%s:%s%s' %
+                               (s[0], s[1], ":%s" % s[2] if s[2] else "")
+                               for s in sigs) + ')'
+    new_obj.db_sigstring = sigstring
+    if all(not d for d in defaults):
+        new_obj.db_defaults = None
+    else:
+        new_obj.db_defaults = unicode(defaults)
+    if all(not label for label in labels):
+        new_obj.db_labels = None
+    else:
+        new_obj.db_labels = unicode(labels)
+        
+    return new_obj
+
+def update_portSpecs(old_obj, translate_dict):
+    new_port_specs = []
+    for port_spec in old_obj.db_portSpecs:
+        new_port_specs.append(update_portSpec(port_spec, translate_dict))
+    return new_port_specs
+
+def update_portSpec_op(old_obj, translate_dict):
+    return update_portSpec(old_obj.db_data, translate_dict)
+
+def translateVistrail(_vistrail):
+    """ Translate new DBVistrailVariable based vistrail variables to old
+         annotation based type """
+    global id_scope
+    
+    def update_workflow(old_obj, trans_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, 
+                                         trans_dict, DBWorkflow())
+
+    def update_operations(old_obj, trans_dict):
+        new_ops = []
+        for obj in old_obj.db_operations:
+            if obj.vtType == 'delete':
+                new_ops.append(DBDelete.update_version(obj, trans_dict))
+            elif obj.vtType == 'add':
+                if obj.db_what == 'portSpec':
+                    trans_dict['DBAdd'] = {'data': update_portSpec_op}
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+                    del trans_dict['DBAdd']
+                else:
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+            elif obj.vtType == 'change':
+                if obj.db_what == 'portSpec':
+                    trans_dict['DBChange'] = {'data': update_portSpec_op}
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+                    del trans_dict['DBChange']
+                else:
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+        return new_ops
+
+    vistrail = DBVistrail()
+    id_scope = vistrail.idScope
+
+    def update_annotations(old_obj, trans_dict):
+        new_annotations = []
+        for a in old_obj.db_annotations:
+            new_annotations.append(DBAnnotation.update_version(a, 
+                                                               translate_dict))
+            id_scope.updateBeginId(DBAnnotation.vtType, a.db_id)
+        vars = {}
+        for var in old_obj.db_vistrailVariables:
+            descriptor = (var.db_package, var.db_module, var.db_namespace)
+            vars[var.db_name] = (var.db_uuid, descriptor, var.db_value)
+        if vars:
+            new_id = id_scope.getNewId(DBAnnotation.vtType)
+            annotation = DBAnnotation(id=new_id, key='__vistrail_vars__', 
+                                      value=str(vars))
+            new_annotations.append(annotation)
+
+        return new_annotations
+
+    translate_dict = {'DBModule': {'portSpecs': update_portSpecs},
+                      'DBModuleDescriptor': {'portSpecs': update_portSpecs},
+                      'DBAction': {'operations': update_operations},
+                      'DBGroup': {'workflow': update_workflow},
+                      'DBVistrail': {'annotations': update_annotations},
+                      }
+
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict, vistrail)
+
+    if _vistrail.db_parameter_explorations:
+        debug.warning(("Vistrail contains %s parameter explorations that "
+                      "cannot be converted") % len(_vistrail.db_parameter_explorations))
+
+    vistrail.db_version = '1.0.2'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBModule': {'portSpecs': update_portSpecs},
+                      'DBGroup': {'workflow': update_workflow}}
+    workflow = DBWorkflow.update_version(_workflow, translate_dict)
+
+    workflow.db_version = '1.0.2'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.2'
+    return log
+
+def translateRegistry(_registry):
+    global id_scope
+    translate_dict = {'DBModuleDescriptor': {'portSpecs': update_portSpecs}}
+    registry = DBRegistry()
+    id_scope = registry.idScope
+    vistrail = DBRegistry.update_version(_registry, translate_dict, registry)
+    registry.db_version = '1.0.2'
+    return registry
+
+class TestTranslate(unittest.TestCase):
+    def testParamexp(self):
+        """test translating parameter explorations from 1.0.3 to 1.0.2"""
+        from vistrails.db.services.io import open_bundle_from_zip_xml
+        from vistrails.core.system import vistrails_root_directory
+        import os
+        (save_bundle, vt_save_dir) = open_bundle_from_zip_xml(DBVistrail.vtType, \
+                        os.path.join(vistrails_root_directory(),
+                        'tests/resources/paramexp-1.0.3.vt'))
+        vistrail = translateVistrail(save_bundle.vistrail)
+        # paramexps cannot be downgraded but should produce a warning
+        
+    def testVistrailvars(self):
+        """test translating vistrail variables from 1.0.3 to 1.0.2"""
+        from vistrails.db.services.io import open_bundle_from_zip_xml
+        from vistrails.core.system import vistrails_root_directory
+        import os
+        (save_bundle, vt_save_dir) = open_bundle_from_zip_xml(DBVistrail.vtType, \
+                        os.path.join(vistrails_root_directory(),
+                        'tests/resources/visvar-1.0.3.vt'))
+        vistrail = translateVistrail(save_bundle.vistrail)
+        visvars = vistrail.db_annotations_key_index['__vistrail_vars__']
+        self.assertTrue(visvars.db_value)
+
+if __name__ == '__main__':
+    from vistrails.gui.application import start_application
+    v = start_application({'interactiveMode': False,
+                           'nologger': True,
+                           'singleInstance': False,
+                           'fixedSpreadsheetCells': True})
+    unittest.main()
diff --git a/vistrails/db/versions/v1_0_3/__init__.py b/vistrails/db/versions/v1_0_3/__init__.py
new file mode 100644
index 0000000..aee1abc
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.3'
diff --git a/vistrails/db/versions/v1_0_3/domain/__init__.py b/vistrails/db/versions/v1_0_3/domain/__init__.py
new file mode 100644
index 0000000..a8208f6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import *
+from registry import DBRegistry
+from workflow import DBWorkflow
+from vistrail import DBVistrail
+from log import DBLog
+from id_scope import IdScope
diff --git a/vistrails/db/versions/v1_0_3/domain/auto_gen.py b/vistrails/db/versions/v1_0_3/domain/auto_gen.py
new file mode 100644
index 0000000..57be93c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/auto_gen.py
@@ -0,0 +1,16928 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+import copy
+
+class DBOpmProcessIdEffect(object):
+
+    vtType = 'opm_process_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBVistrailVariable(object):
+
+    vtType = 'vistrailVariable'
+
+    def __init__(self, name=None, uuid=None, package=None, module=None, namespace=None, value=None):
+        self._db_name = name
+        self._db_uuid = uuid
+        self._db_package = package
+        self._db_module = module
+        self._db_namespace = namespace
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrailVariable.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrailVariable(name=self._db_name,
+                                uuid=self._db_uuid,
+                                package=self._db_package,
+                                module=self._db_module,
+                                namespace=self._db_namespace,
+                                value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrailVariable()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'uuid' in class_dict:
+            res = class_dict['uuid'](old_obj, trans_dict)
+            new_obj.db_uuid = res
+        elif hasattr(old_obj, 'db_uuid') and old_obj.db_uuid is not None:
+            new_obj.db_uuid = old_obj.db_uuid
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'module' in class_dict:
+            res = class_dict['module'](old_obj, trans_dict)
+            new_obj.db_module = res
+        elif hasattr(old_obj, 'db_module') and old_obj.db_module is not None:
+            new_obj.db_module = old_obj.db_module
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_uuid(self):
+        return self._db_uuid
+    def __set_db_uuid(self, uuid):
+        self._db_uuid = uuid
+        self.is_dirty = True
+    db_uuid = property(__get_db_uuid, __set_db_uuid)
+    def db_add_uuid(self, uuid):
+        self._db_uuid = uuid
+    def db_change_uuid(self, uuid):
+        self._db_uuid = uuid
+    def db_delete_uuid(self, uuid):
+        self._db_uuid = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_module(self):
+        return self._db_module
+    def __set_db_module(self, module):
+        self._db_module = module
+        self.is_dirty = True
+    db_module = property(__get_db_module, __set_db_module)
+    def db_add_module(self, module):
+        self._db_module = module
+    def db_change_module(self, module):
+        self._db_module = module
+    def db_delete_module(self, module):
+        self._db_module = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_name
+
+class DBProvAgent(object):
+
+    vtType = 'prov_agent'
+
+    def __init__(self, id=None, vt_id=None, prov_type=None, prov_label=None, vt_machine_os=None, vt_machine_architecture=None, vt_machine_processor=None, vt_machine_ram=None):
+        self._db_id = id
+        self._db_vt_id = vt_id
+        self._db_prov_type = prov_type
+        self._db_prov_label = prov_label
+        self._db_vt_machine_os = vt_machine_os
+        self._db_vt_machine_architecture = vt_machine_architecture
+        self._db_vt_machine_processor = vt_machine_processor
+        self._db_vt_machine_ram = vt_machine_ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvAgent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvAgent(id=self._db_id,
+                         vt_id=self._db_vt_id,
+                         prov_type=self._db_prov_type,
+                         prov_label=self._db_prov_label,
+                         vt_machine_os=self._db_vt_machine_os,
+                         vt_machine_architecture=self._db_vt_machine_architecture,
+                         vt_machine_processor=self._db_vt_machine_processor,
+                         vt_machine_ram=self._db_vt_machine_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvAgent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'vt_id' in class_dict:
+            res = class_dict['vt_id'](old_obj, trans_dict)
+            new_obj.db_vt_id = res
+        elif hasattr(old_obj, 'db_vt_id') and old_obj.db_vt_id is not None:
+            new_obj.db_vt_id = old_obj.db_vt_id
+        if 'prov_type' in class_dict:
+            res = class_dict['prov_type'](old_obj, trans_dict)
+            new_obj.db_prov_type = res
+        elif hasattr(old_obj, 'db_prov_type') and old_obj.db_prov_type is not None:
+            new_obj.db_prov_type = old_obj.db_prov_type
+        if 'prov_label' in class_dict:
+            res = class_dict['prov_label'](old_obj, trans_dict)
+            new_obj.db_prov_label = res
+        elif hasattr(old_obj, 'db_prov_label') and old_obj.db_prov_label is not None:
+            new_obj.db_prov_label = old_obj.db_prov_label
+        if 'vt_machine_os' in class_dict:
+            res = class_dict['vt_machine_os'](old_obj, trans_dict)
+            new_obj.db_vt_machine_os = res
+        elif hasattr(old_obj, 'db_vt_machine_os') and old_obj.db_vt_machine_os is not None:
+            new_obj.db_vt_machine_os = old_obj.db_vt_machine_os
+        if 'vt_machine_architecture' in class_dict:
+            res = class_dict['vt_machine_architecture'](old_obj, trans_dict)
+            new_obj.db_vt_machine_architecture = res
+        elif hasattr(old_obj, 'db_vt_machine_architecture') and old_obj.db_vt_machine_architecture is not None:
+            new_obj.db_vt_machine_architecture = old_obj.db_vt_machine_architecture
+        if 'vt_machine_processor' in class_dict:
+            res = class_dict['vt_machine_processor'](old_obj, trans_dict)
+            new_obj.db_vt_machine_processor = res
+        elif hasattr(old_obj, 'db_vt_machine_processor') and old_obj.db_vt_machine_processor is not None:
+            new_obj.db_vt_machine_processor = old_obj.db_vt_machine_processor
+        if 'vt_machine_ram' in class_dict:
+            res = class_dict['vt_machine_ram'](old_obj, trans_dict)
+            new_obj.db_vt_machine_ram = res
+        elif hasattr(old_obj, 'db_vt_machine_ram') and old_obj.db_vt_machine_ram is not None:
+            new_obj.db_vt_machine_ram = old_obj.db_vt_machine_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_vt_id(self):
+        return self._db_vt_id
+    def __set_db_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+        self.is_dirty = True
+    db_vt_id = property(__get_db_vt_id, __set_db_vt_id)
+    def db_add_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+    def db_change_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+    def db_delete_vt_id(self, vt_id):
+        self._db_vt_id = None
+    
+    def __get_db_prov_type(self):
+        return self._db_prov_type
+    def __set_db_prov_type(self, prov_type):
+        self._db_prov_type = prov_type
+        self.is_dirty = True
+    db_prov_type = property(__get_db_prov_type, __set_db_prov_type)
+    def db_add_prov_type(self, prov_type):
+        self._db_prov_type = prov_type
+    def db_change_prov_type(self, prov_type):
+        self._db_prov_type = prov_type
+    def db_delete_prov_type(self, prov_type):
+        self._db_prov_type = None
+    
+    def __get_db_prov_label(self):
+        return self._db_prov_label
+    def __set_db_prov_label(self, prov_label):
+        self._db_prov_label = prov_label
+        self.is_dirty = True
+    db_prov_label = property(__get_db_prov_label, __set_db_prov_label)
+    def db_add_prov_label(self, prov_label):
+        self._db_prov_label = prov_label
+    def db_change_prov_label(self, prov_label):
+        self._db_prov_label = prov_label
+    def db_delete_prov_label(self, prov_label):
+        self._db_prov_label = None
+    
+    def __get_db_vt_machine_os(self):
+        return self._db_vt_machine_os
+    def __set_db_vt_machine_os(self, vt_machine_os):
+        self._db_vt_machine_os = vt_machine_os
+        self.is_dirty = True
+    db_vt_machine_os = property(__get_db_vt_machine_os, __set_db_vt_machine_os)
+    def db_add_vt_machine_os(self, vt_machine_os):
+        self._db_vt_machine_os = vt_machine_os
+    def db_change_vt_machine_os(self, vt_machine_os):
+        self._db_vt_machine_os = vt_machine_os
+    def db_delete_vt_machine_os(self, vt_machine_os):
+        self._db_vt_machine_os = None
+    
+    def __get_db_vt_machine_architecture(self):
+        return self._db_vt_machine_architecture
+    def __set_db_vt_machine_architecture(self, vt_machine_architecture):
+        self._db_vt_machine_architecture = vt_machine_architecture
+        self.is_dirty = True
+    db_vt_machine_architecture = property(__get_db_vt_machine_architecture, __set_db_vt_machine_architecture)
+    def db_add_vt_machine_architecture(self, vt_machine_architecture):
+        self._db_vt_machine_architecture = vt_machine_architecture
+    def db_change_vt_machine_architecture(self, vt_machine_architecture):
+        self._db_vt_machine_architecture = vt_machine_architecture
+    def db_delete_vt_machine_architecture(self, vt_machine_architecture):
+        self._db_vt_machine_architecture = None
+    
+    def __get_db_vt_machine_processor(self):
+        return self._db_vt_machine_processor
+    def __set_db_vt_machine_processor(self, vt_machine_processor):
+        self._db_vt_machine_processor = vt_machine_processor
+        self.is_dirty = True
+    db_vt_machine_processor = property(__get_db_vt_machine_processor, __set_db_vt_machine_processor)
+    def db_add_vt_machine_processor(self, vt_machine_processor):
+        self._db_vt_machine_processor = vt_machine_processor
+    def db_change_vt_machine_processor(self, vt_machine_processor):
+        self._db_vt_machine_processor = vt_machine_processor
+    def db_delete_vt_machine_processor(self, vt_machine_processor):
+        self._db_vt_machine_processor = None
+    
+    def __get_db_vt_machine_ram(self):
+        return self._db_vt_machine_ram
+    def __set_db_vt_machine_ram(self, vt_machine_ram):
+        self._db_vt_machine_ram = vt_machine_ram
+        self.is_dirty = True
+    db_vt_machine_ram = property(__get_db_vt_machine_ram, __set_db_vt_machine_ram)
+    def db_add_vt_machine_ram(self, vt_machine_ram):
+        self._db_vt_machine_ram = vt_machine_ram
+    def db_change_vt_machine_ram(self, vt_machine_ram):
+        self._db_vt_machine_ram = vt_machine_ram
+    def db_delete_vt_machine_ram(self, vt_machine_ram):
+        self._db_vt_machine_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasGeneratedBy(object):
+
+    vtType = 'opm_was_generated_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasGeneratedBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasGeneratedBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasGeneratedBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmAccounts(object):
+
+    vtType = 'opm_accounts'
+
+    def __init__(self, accounts=None, opm_overlapss=None):
+        self.db_deleted_accounts = []
+        self.db_accounts_id_index = {}
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+            for v in self._db_accounts:
+                self.db_accounts_id_index[v.db_id] = v
+        self.db_deleted_opm_overlapss = []
+        if opm_overlapss is None:
+            self._db_opm_overlapss = []
+        else:
+            self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccounts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccounts()
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_overlapss is None:
+            cp._db_opm_overlapss = []
+        else:
+            cp._db_opm_overlapss = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_overlapss]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_accounts_id_index = dict((v.db_id, v) for v in cp._db_accounts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccounts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccount.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccount.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_overlapss' in class_dict:
+            res = class_dict['opm_overlapss'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_overlaps(obj)
+        elif hasattr(old_obj, 'db_opm_overlapss') and old_obj.db_opm_overlapss is not None:
+            for obj in old_obj.db_opm_overlapss:
+                new_obj.db_add_opm_overlaps(DBOpmOverlaps.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_overlapss') and hasattr(new_obj, 'db_deleted_opm_overlapss'):
+            for obj in old_obj.db_deleted_opm_overlapss:
+                n_obj = DBOpmOverlaps.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_overlapss.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_overlapss:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_overlaps(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_overlapss)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_overlapss = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_overlapss:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_change_account(self, account):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                self._db_accounts[i] = account
+                found = True
+                break
+        if not found:
+            self._db_accounts.append(account)
+        self.db_accounts_id_index[account.db_id] = account
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == account.db_id:
+                if not self._db_accounts[i].is_new:
+                    self.db_deleted_accounts.append(self._db_accounts[i])
+                del self._db_accounts[i]
+                break
+        del self.db_accounts_id_index[account.db_id]
+    def db_get_account(self, key):
+        for i in xrange(len(self._db_accounts)):
+            if self._db_accounts[i].db_id == key:
+                return self._db_accounts[i]
+        return None
+    def db_get_account_by_id(self, key):
+        return self.db_accounts_id_index[key]
+    def db_has_account_with_id(self, key):
+        return key in self.db_accounts_id_index
+    
+    def __get_db_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def __set_db_opm_overlapss(self, opm_overlapss):
+        self._db_opm_overlapss = opm_overlapss
+        self.is_dirty = True
+    db_opm_overlapss = property(__get_db_opm_overlapss, __set_db_opm_overlapss)
+    def db_get_opm_overlapss(self):
+        return self._db_opm_overlapss
+    def db_add_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_change_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        self._db_opm_overlapss.append(opm_overlaps)
+    def db_delete_opm_overlaps(self, opm_overlaps):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_overlaps(self, key):
+        return None
+    
+
+
+class DBRefProvAgent(object):
+
+    vtType = 'ref_prov_agent'
+
+    def __init__(self, prov_ref=None):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRefProvAgent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRefProvAgent(prov_ref=self._db_prov_ref)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prov_ref') and ('prov_agent', self._db_prov_ref) in id_remap:
+                cp._db_prov_ref = id_remap[('prov_agent', self._db_prov_ref)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRefProvAgent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_ref' in class_dict:
+            res = class_dict['prov_ref'](old_obj, trans_dict)
+            new_obj.db_prov_ref = res
+        elif hasattr(old_obj, 'db_prov_ref') and old_obj.db_prov_ref is not None:
+            new_obj.db_prov_ref = old_obj.db_prov_ref
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_prov_ref(self):
+        return self._db_prov_ref
+    def __set_db_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+    db_prov_ref = property(__get_db_prov_ref, __set_db_prov_ref)
+    def db_add_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_change_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_delete_prov_ref(self, prov_ref):
+        self._db_prov_ref = None
+    
+
+
+class DBPortSpec(object):
+
+    vtType = 'portSpec'
+
+    def __init__(self, id=None, name=None, type=None, optional=None, sort_key=None, portSpecItems=None, min_conns=None, max_conns=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_type = type
+        self._db_optional = optional
+        self._db_sort_key = sort_key
+        self.db_deleted_portSpecItems = []
+        self.db_portSpecItems_id_index = {}
+        if portSpecItems is None:
+            self._db_portSpecItems = []
+        else:
+            self._db_portSpecItems = portSpecItems
+            for v in self._db_portSpecItems:
+                self.db_portSpecItems_id_index[v.db_id] = v
+        self._db_min_conns = min_conns
+        self._db_max_conns = max_conns
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpec(id=self._db_id,
+                        name=self._db_name,
+                        type=self._db_type,
+                        optional=self._db_optional,
+                        sort_key=self._db_sort_key,
+                        min_conns=self._db_min_conns,
+                        max_conns=self._db_max_conns)
+        if self._db_portSpecItems is None:
+            cp._db_portSpecItems = []
+        else:
+            cp._db_portSpecItems = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecItems]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_portSpecItems_id_index = dict((v.db_id, v) for v in cp._db_portSpecItems)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'optional' in class_dict:
+            res = class_dict['optional'](old_obj, trans_dict)
+            new_obj.db_optional = res
+        elif hasattr(old_obj, 'db_optional') and old_obj.db_optional is not None:
+            new_obj.db_optional = old_obj.db_optional
+        if 'sort_key' in class_dict:
+            res = class_dict['sort_key'](old_obj, trans_dict)
+            new_obj.db_sort_key = res
+        elif hasattr(old_obj, 'db_sort_key') and old_obj.db_sort_key is not None:
+            new_obj.db_sort_key = old_obj.db_sort_key
+        if 'portSpecItems' in class_dict:
+            res = class_dict['portSpecItems'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpecItem(obj)
+        elif hasattr(old_obj, 'db_portSpecItems') and old_obj.db_portSpecItems is not None:
+            for obj in old_obj.db_portSpecItems:
+                new_obj.db_add_portSpecItem(DBPortSpecItem.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecItems') and hasattr(new_obj, 'db_deleted_portSpecItems'):
+            for obj in old_obj.db_deleted_portSpecItems:
+                n_obj = DBPortSpecItem.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecItems.append(n_obj)
+        if 'min_conns' in class_dict:
+            res = class_dict['min_conns'](old_obj, trans_dict)
+            new_obj.db_min_conns = res
+        elif hasattr(old_obj, 'db_min_conns') and old_obj.db_min_conns is not None:
+            new_obj.db_min_conns = old_obj.db_min_conns
+        if 'max_conns' in class_dict:
+            res = class_dict['max_conns'](old_obj, trans_dict)
+            new_obj.db_max_conns = res
+        elif hasattr(old_obj, 'db_max_conns') and old_obj.db_max_conns is not None:
+            new_obj.db_max_conns = old_obj.db_max_conns
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if not for_action:
+            for child in self.db_portSpecItems:
+                children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_portSpecItems)
+        if remove:
+            self.db_deleted_portSpecItems = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_portSpecItems:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_optional(self):
+        return self._db_optional
+    def __set_db_optional(self, optional):
+        self._db_optional = optional
+        self.is_dirty = True
+    db_optional = property(__get_db_optional, __set_db_optional)
+    def db_add_optional(self, optional):
+        self._db_optional = optional
+    def db_change_optional(self, optional):
+        self._db_optional = optional
+    def db_delete_optional(self, optional):
+        self._db_optional = None
+    
+    def __get_db_sort_key(self):
+        return self._db_sort_key
+    def __set_db_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+        self.is_dirty = True
+    db_sort_key = property(__get_db_sort_key, __set_db_sort_key)
+    def db_add_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_change_sort_key(self, sort_key):
+        self._db_sort_key = sort_key
+    def db_delete_sort_key(self, sort_key):
+        self._db_sort_key = None
+    
+    def __get_db_portSpecItems(self):
+        return self._db_portSpecItems
+    def __set_db_portSpecItems(self, portSpecItems):
+        self._db_portSpecItems = portSpecItems
+        self.is_dirty = True
+    db_portSpecItems = property(__get_db_portSpecItems, __set_db_portSpecItems)
+    def db_get_portSpecItems(self):
+        return self._db_portSpecItems
+    def db_add_portSpecItem(self, portSpecItem):
+        self.is_dirty = True
+        self._db_portSpecItems.append(portSpecItem)
+        self.db_portSpecItems_id_index[portSpecItem.db_id] = portSpecItem
+    def db_change_portSpecItem(self, portSpecItem):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecItems)):
+            if self._db_portSpecItems[i].db_id == portSpecItem.db_id:
+                self._db_portSpecItems[i] = portSpecItem
+                found = True
+                break
+        if not found:
+            self._db_portSpecItems.append(portSpecItem)
+        self.db_portSpecItems_id_index[portSpecItem.db_id] = portSpecItem
+    def db_delete_portSpecItem(self, portSpecItem):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecItems)):
+            if self._db_portSpecItems[i].db_id == portSpecItem.db_id:
+                if not self._db_portSpecItems[i].is_new:
+                    self.db_deleted_portSpecItems.append(self._db_portSpecItems[i])
+                del self._db_portSpecItems[i]
+                break
+        del self.db_portSpecItems_id_index[portSpecItem.db_id]
+    def db_get_portSpecItem(self, key):
+        for i in xrange(len(self._db_portSpecItems)):
+            if self._db_portSpecItems[i].db_id == key:
+                return self._db_portSpecItems[i]
+        return None
+    def db_get_portSpecItem_by_id(self, key):
+        return self.db_portSpecItems_id_index[key]
+    def db_has_portSpecItem_with_id(self, key):
+        return key in self.db_portSpecItems_id_index
+    
+    def __get_db_min_conns(self):
+        return self._db_min_conns
+    def __set_db_min_conns(self, min_conns):
+        self._db_min_conns = min_conns
+        self.is_dirty = True
+    db_min_conns = property(__get_db_min_conns, __set_db_min_conns)
+    def db_add_min_conns(self, min_conns):
+        self._db_min_conns = min_conns
+    def db_change_min_conns(self, min_conns):
+        self._db_min_conns = min_conns
+    def db_delete_min_conns(self, min_conns):
+        self._db_min_conns = None
+    
+    def __get_db_max_conns(self):
+        return self._db_max_conns
+    def __set_db_max_conns(self, max_conns):
+        self._db_max_conns = max_conns
+        self.is_dirty = True
+    db_max_conns = property(__get_db_max_conns, __set_db_max_conns)
+    def db_add_max_conns(self, max_conns):
+        self._db_max_conns = max_conns
+    def db_change_max_conns(self, max_conns):
+        self._db_max_conns = max_conns
+    def db_delete_max_conns(self, max_conns):
+        self._db_max_conns = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModule(object):
+
+    vtType = 'module'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, location=None, functions=None, annotations=None, portSpecs=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModule.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModule(id=self._db_id,
+                      cache=self._db_cache,
+                      name=self._db_name,
+                      namespace=self._db_namespace,
+                      package=self._db_package,
+                      version=self._db_version)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModule()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleDescriptor(object):
+
+    vtType = 'module_descriptor'
+
+    def __init__(self, id=None, name=None, package=None, namespace=None, package_version=None, version=None, base_descriptor_id=None, portSpecs=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_package = package
+        self._db_namespace = namespace
+        self._db_package_version = package_version
+        self._db_version = version
+        self._db_base_descriptor_id = base_descriptor_id
+        self.db_deleted_portSpecs = []
+        self.db_portSpecs_id_index = {}
+        self.db_portSpecs_name_index = {}
+        if portSpecs is None:
+            self._db_portSpecs = []
+        else:
+            self._db_portSpecs = portSpecs
+            for v in self._db_portSpecs:
+                self.db_portSpecs_id_index[v.db_id] = v
+                self.db_portSpecs_name_index[(v.db_name,v.db_type)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleDescriptor.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleDescriptor(id=self._db_id,
+                                name=self._db_name,
+                                package=self._db_package,
+                                namespace=self._db_namespace,
+                                package_version=self._db_package_version,
+                                version=self._db_version,
+                                base_descriptor_id=self._db_base_descriptor_id)
+        if self._db_portSpecs is None:
+            cp._db_portSpecs = []
+        else:
+            cp._db_portSpecs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_portSpecs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_base_descriptor_id') and ('module_descriptor', self._db_base_descriptor_id) in id_remap:
+                cp._db_base_descriptor_id = id_remap[('module_descriptor', self._db_base_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_portSpecs_id_index = dict((v.db_id, v) for v in cp._db_portSpecs)
+        cp.db_portSpecs_name_index = dict(((v.db_name,v.db_type), v) for v in cp._db_portSpecs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleDescriptor()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package_version' in class_dict:
+            res = class_dict['package_version'](old_obj, trans_dict)
+            new_obj.db_package_version = res
+        elif hasattr(old_obj, 'db_package_version') and old_obj.db_package_version is not None:
+            new_obj.db_package_version = old_obj.db_package_version
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'base_descriptor_id' in class_dict:
+            res = class_dict['base_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_base_descriptor_id = res
+        elif hasattr(old_obj, 'db_base_descriptor_id') and old_obj.db_base_descriptor_id is not None:
+            new_obj.db_base_descriptor_id = old_obj.db_base_descriptor_id
+        if 'portSpecs' in class_dict:
+            res = class_dict['portSpecs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_portSpec(obj)
+        elif hasattr(old_obj, 'db_portSpecs') and old_obj.db_portSpecs is not None:
+            for obj in old_obj.db_portSpecs:
+                new_obj.db_add_portSpec(DBPortSpec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_portSpecs') and hasattr(new_obj, 'db_deleted_portSpecs'):
+            for obj in old_obj.db_deleted_portSpecs:
+                n_obj = DBPortSpec.update_version(obj, trans_dict)
+                new_obj.db_deleted_portSpecs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_portSpecs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_portSpec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_portSpecs)
+        if remove:
+            self.db_deleted_portSpecs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_portSpecs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package_version(self):
+        return self._db_package_version
+    def __set_db_package_version(self, package_version):
+        self._db_package_version = package_version
+        self.is_dirty = True
+    db_package_version = property(__get_db_package_version, __set_db_package_version)
+    def db_add_package_version(self, package_version):
+        self._db_package_version = package_version
+    def db_change_package_version(self, package_version):
+        self._db_package_version = package_version
+    def db_delete_package_version(self, package_version):
+        self._db_package_version = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_base_descriptor_id(self):
+        return self._db_base_descriptor_id
+    def __set_db_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+        self.is_dirty = True
+    db_base_descriptor_id = property(__get_db_base_descriptor_id, __set_db_base_descriptor_id)
+    def db_add_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_change_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = base_descriptor_id
+    def db_delete_base_descriptor_id(self, base_descriptor_id):
+        self._db_base_descriptor_id = None
+    
+    def __get_db_portSpecs(self):
+        return self._db_portSpecs
+    def __set_db_portSpecs(self, portSpecs):
+        self._db_portSpecs = portSpecs
+        self.is_dirty = True
+    db_portSpecs = property(__get_db_portSpecs, __set_db_portSpecs)
+    def db_get_portSpecs(self):
+        return self._db_portSpecs
+    def db_add_portSpec(self, portSpec):
+        self.is_dirty = True
+        self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_change_portSpec(self, portSpec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                self._db_portSpecs[i] = portSpec
+                found = True
+                break
+        if not found:
+            self._db_portSpecs.append(portSpec)
+        self.db_portSpecs_id_index[portSpec.db_id] = portSpec
+        self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)] = portSpec
+    def db_delete_portSpec(self, portSpec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == portSpec.db_id:
+                if not self._db_portSpecs[i].is_new:
+                    self.db_deleted_portSpecs.append(self._db_portSpecs[i])
+                del self._db_portSpecs[i]
+                break
+        del self.db_portSpecs_id_index[portSpec.db_id]
+        del self.db_portSpecs_name_index[(portSpec.db_name,portSpec.db_type)]
+    def db_get_portSpec(self, key):
+        for i in xrange(len(self._db_portSpecs)):
+            if self._db_portSpecs[i].db_id == key:
+                return self._db_portSpecs[i]
+        return None
+    def db_get_portSpec_by_id(self, key):
+        return self.db_portSpecs_id_index[key]
+    def db_has_portSpec_with_id(self, key):
+        return key in self.db_portSpecs_id_index
+    def db_get_portSpec_by_name(self, key):
+        return self.db_portSpecs_name_index[key]
+    def db_has_portSpec_with_name(self, key):
+        return key in self.db_portSpecs_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBTag(object):
+
+    vtType = 'tag'
+
+    def __init__(self, id=None, name=None):
+        self._db_id = id
+        self._db_name = name
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBTag.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBTag(id=self._db_id,
+                   name=self._db_name)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('action', self._db_id) in id_remap:
+                cp._db_id = id_remap[('action', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBTag()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmRole(object):
+
+    vtType = 'opm_role'
+
+    def __init__(self, value=None):
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmRole.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmRole(value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmRole()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+
+
+class DBProvDocument(object):
+
+    vtType = 'prov_document'
+
+    def __init__(self, prov_entitys=None, prov_activitys=None, prov_agents=None, vt_connections=None, prov_usages=None, prov_generations=None, prov_associations=None):
+        self.db_deleted_prov_entitys = []
+        self.db_prov_entitys_id_index = {}
+        if prov_entitys is None:
+            self._db_prov_entitys = []
+        else:
+            self._db_prov_entitys = prov_entitys
+            for v in self._db_prov_entitys:
+                self.db_prov_entitys_id_index[v.db_id] = v
+        self.db_deleted_prov_activitys = []
+        self.db_prov_activitys_id_index = {}
+        if prov_activitys is None:
+            self._db_prov_activitys = []
+        else:
+            self._db_prov_activitys = prov_activitys
+            for v in self._db_prov_activitys:
+                self.db_prov_activitys_id_index[v.db_id] = v
+        self.db_deleted_prov_agents = []
+        self.db_prov_agents_id_index = {}
+        if prov_agents is None:
+            self._db_prov_agents = []
+        else:
+            self._db_prov_agents = prov_agents
+            for v in self._db_prov_agents:
+                self.db_prov_agents_id_index[v.db_id] = v
+        self.db_deleted_vt_connections = []
+        self.db_vt_connections_id_index = {}
+        if vt_connections is None:
+            self._db_vt_connections = []
+        else:
+            self._db_vt_connections = vt_connections
+            for v in self._db_vt_connections:
+                self.db_vt_connections_id_index[v.db_id] = v
+        self.db_deleted_prov_usages = []
+        if prov_usages is None:
+            self._db_prov_usages = []
+        else:
+            self._db_prov_usages = prov_usages
+        self.db_deleted_prov_generations = []
+        if prov_generations is None:
+            self._db_prov_generations = []
+        else:
+            self._db_prov_generations = prov_generations
+        self.db_deleted_prov_associations = []
+        if prov_associations is None:
+            self._db_prov_associations = []
+        else:
+            self._db_prov_associations = prov_associations
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvDocument.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvDocument()
+        if self._db_prov_entitys is None:
+            cp._db_prov_entitys = []
+        else:
+            cp._db_prov_entitys = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_prov_entitys]
+        if self._db_prov_activitys is None:
+            cp._db_prov_activitys = []
+        else:
+            cp._db_prov_activitys = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_prov_activitys]
+        if self._db_prov_agents is None:
+            cp._db_prov_agents = []
+        else:
+            cp._db_prov_agents = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_prov_agents]
+        if self._db_vt_connections is None:
+            cp._db_vt_connections = []
+        else:
+            cp._db_vt_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_vt_connections]
+        if self._db_prov_usages is None:
+            cp._db_prov_usages = []
+        else:
+            cp._db_prov_usages = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_prov_usages]
+        if self._db_prov_generations is None:
+            cp._db_prov_generations = []
+        else:
+            cp._db_prov_generations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_prov_generations]
+        if self._db_prov_associations is None:
+            cp._db_prov_associations = []
+        else:
+            cp._db_prov_associations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_prov_associations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_prov_entitys_id_index = dict((v.db_id, v) for v in cp._db_prov_entitys)
+        cp.db_prov_activitys_id_index = dict((v.db_id, v) for v in cp._db_prov_activitys)
+        cp.db_prov_agents_id_index = dict((v.db_id, v) for v in cp._db_prov_agents)
+        cp.db_vt_connections_id_index = dict((v.db_id, v) for v in cp._db_vt_connections)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvDocument()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_entitys' in class_dict:
+            res = class_dict['prov_entitys'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_prov_entity(obj)
+        elif hasattr(old_obj, 'db_prov_entitys') and old_obj.db_prov_entitys is not None:
+            for obj in old_obj.db_prov_entitys:
+                new_obj.db_add_prov_entity(DBProvEntity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_entitys') and hasattr(new_obj, 'db_deleted_prov_entitys'):
+            for obj in old_obj.db_deleted_prov_entitys:
+                n_obj = DBProvEntity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_entitys.append(n_obj)
+        if 'prov_activitys' in class_dict:
+            res = class_dict['prov_activitys'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_prov_activity(obj)
+        elif hasattr(old_obj, 'db_prov_activitys') and old_obj.db_prov_activitys is not None:
+            for obj in old_obj.db_prov_activitys:
+                new_obj.db_add_prov_activity(DBProvActivity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_activitys') and hasattr(new_obj, 'db_deleted_prov_activitys'):
+            for obj in old_obj.db_deleted_prov_activitys:
+                n_obj = DBProvActivity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_activitys.append(n_obj)
+        if 'prov_agents' in class_dict:
+            res = class_dict['prov_agents'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_prov_agent(obj)
+        elif hasattr(old_obj, 'db_prov_agents') and old_obj.db_prov_agents is not None:
+            for obj in old_obj.db_prov_agents:
+                new_obj.db_add_prov_agent(DBProvAgent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_agents') and hasattr(new_obj, 'db_deleted_prov_agents'):
+            for obj in old_obj.db_deleted_prov_agents:
+                n_obj = DBProvAgent.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_agents.append(n_obj)
+        if 'vt_connections' in class_dict:
+            res = class_dict['vt_connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_vt_connection(obj)
+        elif hasattr(old_obj, 'db_vt_connections') and old_obj.db_vt_connections is not None:
+            for obj in old_obj.db_vt_connections:
+                new_obj.db_add_vt_connection(DBVtConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_vt_connections') and hasattr(new_obj, 'db_deleted_vt_connections'):
+            for obj in old_obj.db_deleted_vt_connections:
+                n_obj = DBVtConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_vt_connections.append(n_obj)
+        if 'prov_usages' in class_dict:
+            res = class_dict['prov_usages'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_prov_usage(obj)
+        elif hasattr(old_obj, 'db_prov_usages') and old_obj.db_prov_usages is not None:
+            for obj in old_obj.db_prov_usages:
+                new_obj.db_add_prov_usage(DBProvUsage.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_usages') and hasattr(new_obj, 'db_deleted_prov_usages'):
+            for obj in old_obj.db_deleted_prov_usages:
+                n_obj = DBProvUsage.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_usages.append(n_obj)
+        if 'prov_generations' in class_dict:
+            res = class_dict['prov_generations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_prov_generation(obj)
+        elif hasattr(old_obj, 'db_prov_generations') and old_obj.db_prov_generations is not None:
+            for obj in old_obj.db_prov_generations:
+                new_obj.db_add_prov_generation(DBProvGeneration.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_generations') and hasattr(new_obj, 'db_deleted_prov_generations'):
+            for obj in old_obj.db_deleted_prov_generations:
+                n_obj = DBProvGeneration.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_generations.append(n_obj)
+        if 'prov_associations' in class_dict:
+            res = class_dict['prov_associations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_prov_association(obj)
+        elif hasattr(old_obj, 'db_prov_associations') and old_obj.db_prov_associations is not None:
+            for obj in old_obj.db_prov_associations:
+                new_obj.db_add_prov_association(DBProvAssociation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_associations') and hasattr(new_obj, 'db_deleted_prov_associations'):
+            for obj in old_obj.db_deleted_prov_associations:
+                n_obj = DBProvAssociation.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_associations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_prov_entitys:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_prov_entity(child)
+        to_del = []
+        for child in self.db_prov_activitys:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_prov_activity(child)
+        to_del = []
+        for child in self.db_prov_agents:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_prov_agent(child)
+        to_del = []
+        for child in self.db_vt_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_vt_connection(child)
+        to_del = []
+        for child in self.db_prov_usages:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_prov_usage(child)
+        to_del = []
+        for child in self.db_prov_generations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_prov_generation(child)
+        to_del = []
+        for child in self.db_prov_associations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_prov_association(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_prov_entitys)
+        children.extend(self.db_deleted_prov_activitys)
+        children.extend(self.db_deleted_prov_agents)
+        children.extend(self.db_deleted_vt_connections)
+        children.extend(self.db_deleted_prov_usages)
+        children.extend(self.db_deleted_prov_generations)
+        children.extend(self.db_deleted_prov_associations)
+        if remove:
+            self.db_deleted_prov_entitys = []
+            self.db_deleted_prov_activitys = []
+            self.db_deleted_prov_agents = []
+            self.db_deleted_vt_connections = []
+            self.db_deleted_prov_usages = []
+            self.db_deleted_prov_generations = []
+            self.db_deleted_prov_associations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_prov_entitys:
+            if child.has_changes():
+                return True
+        for child in self._db_prov_activitys:
+            if child.has_changes():
+                return True
+        for child in self._db_prov_agents:
+            if child.has_changes():
+                return True
+        for child in self._db_vt_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_prov_usages:
+            if child.has_changes():
+                return True
+        for child in self._db_prov_generations:
+            if child.has_changes():
+                return True
+        for child in self._db_prov_associations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_prov_entitys(self):
+        return self._db_prov_entitys
+    def __set_db_prov_entitys(self, prov_entitys):
+        self._db_prov_entitys = prov_entitys
+        self.is_dirty = True
+    db_prov_entitys = property(__get_db_prov_entitys, __set_db_prov_entitys)
+    def db_get_prov_entitys(self):
+        return self._db_prov_entitys
+    def db_add_prov_entity(self, prov_entity):
+        self.is_dirty = True
+        self._db_prov_entitys.append(prov_entity)
+        self.db_prov_entitys_id_index[prov_entity.db_id] = prov_entity
+    def db_change_prov_entity(self, prov_entity):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_prov_entitys)):
+            if self._db_prov_entitys[i].db_id == prov_entity.db_id:
+                self._db_prov_entitys[i] = prov_entity
+                found = True
+                break
+        if not found:
+            self._db_prov_entitys.append(prov_entity)
+        self.db_prov_entitys_id_index[prov_entity.db_id] = prov_entity
+    def db_delete_prov_entity(self, prov_entity):
+        self.is_dirty = True
+        for i in xrange(len(self._db_prov_entitys)):
+            if self._db_prov_entitys[i].db_id == prov_entity.db_id:
+                if not self._db_prov_entitys[i].is_new:
+                    self.db_deleted_prov_entitys.append(self._db_prov_entitys[i])
+                del self._db_prov_entitys[i]
+                break
+        del self.db_prov_entitys_id_index[prov_entity.db_id]
+    def db_get_prov_entity(self, key):
+        for i in xrange(len(self._db_prov_entitys)):
+            if self._db_prov_entitys[i].db_id == key:
+                return self._db_prov_entitys[i]
+        return None
+    def db_get_prov_entity_by_id(self, key):
+        return self.db_prov_entitys_id_index[key]
+    def db_has_prov_entity_with_id(self, key):
+        return key in self.db_prov_entitys_id_index
+    
+    def __get_db_prov_activitys(self):
+        return self._db_prov_activitys
+    def __set_db_prov_activitys(self, prov_activitys):
+        self._db_prov_activitys = prov_activitys
+        self.is_dirty = True
+    db_prov_activitys = property(__get_db_prov_activitys, __set_db_prov_activitys)
+    def db_get_prov_activitys(self):
+        return self._db_prov_activitys
+    def db_add_prov_activity(self, prov_activity):
+        self.is_dirty = True
+        self._db_prov_activitys.append(prov_activity)
+        self.db_prov_activitys_id_index[prov_activity.db_id] = prov_activity
+    def db_change_prov_activity(self, prov_activity):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_prov_activitys)):
+            if self._db_prov_activitys[i].db_id == prov_activity.db_id:
+                self._db_prov_activitys[i] = prov_activity
+                found = True
+                break
+        if not found:
+            self._db_prov_activitys.append(prov_activity)
+        self.db_prov_activitys_id_index[prov_activity.db_id] = prov_activity
+    def db_delete_prov_activity(self, prov_activity):
+        self.is_dirty = True
+        for i in xrange(len(self._db_prov_activitys)):
+            if self._db_prov_activitys[i].db_id == prov_activity.db_id:
+                if not self._db_prov_activitys[i].is_new:
+                    self.db_deleted_prov_activitys.append(self._db_prov_activitys[i])
+                del self._db_prov_activitys[i]
+                break
+        del self.db_prov_activitys_id_index[prov_activity.db_id]
+    def db_get_prov_activity(self, key):
+        for i in xrange(len(self._db_prov_activitys)):
+            if self._db_prov_activitys[i].db_id == key:
+                return self._db_prov_activitys[i]
+        return None
+    def db_get_prov_activity_by_id(self, key):
+        return self.db_prov_activitys_id_index[key]
+    def db_has_prov_activity_with_id(self, key):
+        return key in self.db_prov_activitys_id_index
+    
+    def __get_db_prov_agents(self):
+        return self._db_prov_agents
+    def __set_db_prov_agents(self, prov_agents):
+        self._db_prov_agents = prov_agents
+        self.is_dirty = True
+    db_prov_agents = property(__get_db_prov_agents, __set_db_prov_agents)
+    def db_get_prov_agents(self):
+        return self._db_prov_agents
+    def db_add_prov_agent(self, prov_agent):
+        self.is_dirty = True
+        self._db_prov_agents.append(prov_agent)
+        self.db_prov_agents_id_index[prov_agent.db_id] = prov_agent
+    def db_change_prov_agent(self, prov_agent):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_prov_agents)):
+            if self._db_prov_agents[i].db_id == prov_agent.db_id:
+                self._db_prov_agents[i] = prov_agent
+                found = True
+                break
+        if not found:
+            self._db_prov_agents.append(prov_agent)
+        self.db_prov_agents_id_index[prov_agent.db_id] = prov_agent
+    def db_delete_prov_agent(self, prov_agent):
+        self.is_dirty = True
+        for i in xrange(len(self._db_prov_agents)):
+            if self._db_prov_agents[i].db_id == prov_agent.db_id:
+                if not self._db_prov_agents[i].is_new:
+                    self.db_deleted_prov_agents.append(self._db_prov_agents[i])
+                del self._db_prov_agents[i]
+                break
+        del self.db_prov_agents_id_index[prov_agent.db_id]
+    def db_get_prov_agent(self, key):
+        for i in xrange(len(self._db_prov_agents)):
+            if self._db_prov_agents[i].db_id == key:
+                return self._db_prov_agents[i]
+        return None
+    def db_get_prov_agent_by_id(self, key):
+        return self.db_prov_agents_id_index[key]
+    def db_has_prov_agent_with_id(self, key):
+        return key in self.db_prov_agents_id_index
+    
+    def __get_db_vt_connections(self):
+        return self._db_vt_connections
+    def __set_db_vt_connections(self, vt_connections):
+        self._db_vt_connections = vt_connections
+        self.is_dirty = True
+    db_vt_connections = property(__get_db_vt_connections, __set_db_vt_connections)
+    def db_get_vt_connections(self):
+        return self._db_vt_connections
+    def db_add_vt_connection(self, vt_connection):
+        self.is_dirty = True
+        self._db_vt_connections.append(vt_connection)
+        self.db_vt_connections_id_index[vt_connection.db_id] = vt_connection
+    def db_change_vt_connection(self, vt_connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_vt_connections)):
+            if self._db_vt_connections[i].db_id == vt_connection.db_id:
+                self._db_vt_connections[i] = vt_connection
+                found = True
+                break
+        if not found:
+            self._db_vt_connections.append(vt_connection)
+        self.db_vt_connections_id_index[vt_connection.db_id] = vt_connection
+    def db_delete_vt_connection(self, vt_connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_vt_connections)):
+            if self._db_vt_connections[i].db_id == vt_connection.db_id:
+                if not self._db_vt_connections[i].is_new:
+                    self.db_deleted_vt_connections.append(self._db_vt_connections[i])
+                del self._db_vt_connections[i]
+                break
+        del self.db_vt_connections_id_index[vt_connection.db_id]
+    def db_get_vt_connection(self, key):
+        for i in xrange(len(self._db_vt_connections)):
+            if self._db_vt_connections[i].db_id == key:
+                return self._db_vt_connections[i]
+        return None
+    def db_get_vt_connection_by_id(self, key):
+        return self.db_vt_connections_id_index[key]
+    def db_has_vt_connection_with_id(self, key):
+        return key in self.db_vt_connections_id_index
+    
+    def __get_db_prov_usages(self):
+        return self._db_prov_usages
+    def __set_db_prov_usages(self, prov_usages):
+        self._db_prov_usages = prov_usages
+        self.is_dirty = True
+    db_prov_usages = property(__get_db_prov_usages, __set_db_prov_usages)
+    def db_get_prov_usages(self):
+        return self._db_prov_usages
+    def db_add_prov_usage(self, prov_usage):
+        self.is_dirty = True
+        self._db_prov_usages.append(prov_usage)
+    def db_change_prov_usage(self, prov_usage):
+        self.is_dirty = True
+        self._db_prov_usages.append(prov_usage)
+    def db_delete_prov_usage(self, prov_usage):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_prov_usage(self, key):
+        return None
+    
+    def __get_db_prov_generations(self):
+        return self._db_prov_generations
+    def __set_db_prov_generations(self, prov_generations):
+        self._db_prov_generations = prov_generations
+        self.is_dirty = True
+    db_prov_generations = property(__get_db_prov_generations, __set_db_prov_generations)
+    def db_get_prov_generations(self):
+        return self._db_prov_generations
+    def db_add_prov_generation(self, prov_generation):
+        self.is_dirty = True
+        self._db_prov_generations.append(prov_generation)
+    def db_change_prov_generation(self, prov_generation):
+        self.is_dirty = True
+        self._db_prov_generations.append(prov_generation)
+    def db_delete_prov_generation(self, prov_generation):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_prov_generation(self, key):
+        return None
+    
+    def __get_db_prov_associations(self):
+        return self._db_prov_associations
+    def __set_db_prov_associations(self, prov_associations):
+        self._db_prov_associations = prov_associations
+        self.is_dirty = True
+    db_prov_associations = property(__get_db_prov_associations, __set_db_prov_associations)
+    def db_get_prov_associations(self):
+        return self._db_prov_associations
+    def db_add_prov_association(self, prov_association):
+        self.is_dirty = True
+        self._db_prov_associations.append(prov_association)
+    def db_change_prov_association(self, prov_association):
+        self.is_dirty = True
+        self._db_prov_associations.append(prov_association)
+    def db_delete_prov_association(self, prov_association):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_prov_association(self, key):
+        return None
+    
+
+
+class DBOpmAccount(object):
+
+    vtType = 'opm_account'
+
+    def __init__(self, id=None, value=None):
+        self._db_id = id
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccount.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccount(id=self._db_id,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccount()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcesses(object):
+
+    vtType = 'opm_processes'
+
+    def __init__(self, processs=None):
+        self.db_deleted_processs = []
+        self.db_processs_id_index = {}
+        if processs is None:
+            self._db_processs = []
+        else:
+            self._db_processs = processs
+            for v in self._db_processs:
+                self.db_processs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcesses.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcesses()
+        if self._db_processs is None:
+            cp._db_processs = []
+        else:
+            cp._db_processs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_processs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_processs_id_index = dict((v.db_id, v) for v in cp._db_processs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcesses()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'processs' in class_dict:
+            res = class_dict['processs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_process(obj)
+        elif hasattr(old_obj, 'db_processs') and old_obj.db_processs is not None:
+            for obj in old_obj.db_processs:
+                new_obj.db_add_process(DBOpmProcess.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processs') and hasattr(new_obj, 'db_deleted_processs'):
+            for obj in old_obj.db_deleted_processs:
+                n_obj = DBOpmProcess.update_version(obj, trans_dict)
+                new_obj.db_deleted_processs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_processs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_process(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_processs)
+        if remove:
+            self.db_deleted_processs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_processs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_processs(self):
+        return self._db_processs
+    def __set_db_processs(self, processs):
+        self._db_processs = processs
+        self.is_dirty = True
+    db_processs = property(__get_db_processs, __set_db_processs)
+    def db_get_processs(self):
+        return self._db_processs
+    def db_add_process(self, process):
+        self.is_dirty = True
+        self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_change_process(self, process):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                self._db_processs[i] = process
+                found = True
+                break
+        if not found:
+            self._db_processs.append(process)
+        self.db_processs_id_index[process.db_id] = process
+    def db_delete_process(self, process):
+        self.is_dirty = True
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == process.db_id:
+                if not self._db_processs[i].is_new:
+                    self.db_deleted_processs.append(self._db_processs[i])
+                del self._db_processs[i]
+                break
+        del self.db_processs_id_index[process.db_id]
+    def db_get_process(self, key):
+        for i in xrange(len(self._db_processs)):
+            if self._db_processs[i].db_id == key:
+                return self._db_processs[i]
+        return None
+    def db_get_process_by_id(self, key):
+        return self.db_processs_id_index[key]
+    def db_has_process_with_id(self, key):
+        return key in self.db_processs_id_index
+    
+
+
+class DBRefProvActivity(object):
+
+    vtType = 'ref_prov_activity'
+
+    def __init__(self, prov_ref=None):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRefProvActivity.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRefProvActivity(prov_ref=self._db_prov_ref)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prov_ref') and ('prov_activity', self._db_prov_ref) in id_remap:
+                cp._db_prov_ref = id_remap[('prov_activity', self._db_prov_ref)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRefProvActivity()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_ref' in class_dict:
+            res = class_dict['prov_ref'](old_obj, trans_dict)
+            new_obj.db_prov_ref = res
+        elif hasattr(old_obj, 'db_prov_ref') and old_obj.db_prov_ref is not None:
+            new_obj.db_prov_ref = old_obj.db_prov_ref
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_prov_ref(self):
+        return self._db_prov_ref
+    def __set_db_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+    db_prov_ref = property(__get_db_prov_ref, __set_db_prov_ref)
+    def db_add_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_change_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_delete_prov_ref(self, prov_ref):
+        self._db_prov_ref = None
+    
+
+
+class DBOpmAccountId(object):
+
+    vtType = 'opm_account_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAccountId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAccountId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_account', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_account', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAccountId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBPort(object):
+
+    vtType = 'port'
+
+    def __init__(self, id=None, type=None, moduleId=None, moduleName=None, name=None, signature=None):
+        self._db_id = id
+        self._db_type = type
+        self._db_moduleId = moduleId
+        self._db_moduleName = moduleName
+        self._db_name = name
+        self._db_signature = signature
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPort.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPort(id=self._db_id,
+                    type=self._db_type,
+                    moduleId=self._db_moduleId,
+                    moduleName=self._db_moduleName,
+                    name=self._db_name,
+                    signature=self._db_signature)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_moduleId') and ('module', self._db_moduleId) in id_remap:
+                cp._db_moduleId = id_remap[('module', self._db_moduleId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPort()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'moduleId' in class_dict:
+            res = class_dict['moduleId'](old_obj, trans_dict)
+            new_obj.db_moduleId = res
+        elif hasattr(old_obj, 'db_moduleId') and old_obj.db_moduleId is not None:
+            new_obj.db_moduleId = old_obj.db_moduleId
+        if 'moduleName' in class_dict:
+            res = class_dict['moduleName'](old_obj, trans_dict)
+            new_obj.db_moduleName = res
+        elif hasattr(old_obj, 'db_moduleName') and old_obj.db_moduleName is not None:
+            new_obj.db_moduleName = old_obj.db_moduleName
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'signature' in class_dict:
+            res = class_dict['signature'](old_obj, trans_dict)
+            new_obj.db_signature = res
+        elif hasattr(old_obj, 'db_signature') and old_obj.db_signature is not None:
+            new_obj.db_signature = old_obj.db_signature
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_moduleId(self):
+        return self._db_moduleId
+    def __set_db_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+        self.is_dirty = True
+    db_moduleId = property(__get_db_moduleId, __set_db_moduleId)
+    def db_add_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_change_moduleId(self, moduleId):
+        self._db_moduleId = moduleId
+    def db_delete_moduleId(self, moduleId):
+        self._db_moduleId = None
+    
+    def __get_db_moduleName(self):
+        return self._db_moduleName
+    def __set_db_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+        self.is_dirty = True
+    db_moduleName = property(__get_db_moduleName, __set_db_moduleName)
+    def db_add_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_change_moduleName(self, moduleName):
+        self._db_moduleName = moduleName
+    def db_delete_moduleName(self, moduleName):
+        self._db_moduleName = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_signature(self):
+        return self._db_signature
+    def __set_db_signature(self, signature):
+        self._db_signature = signature
+        self.is_dirty = True
+    db_signature = property(__get_db_signature, __set_db_signature)
+    def db_add_signature(self, signature):
+        self._db_signature = signature
+    def db_change_signature(self, signature):
+        self._db_signature = signature
+    def db_delete_signature(self, signature):
+        self._db_signature = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBRefProvPlan(object):
+
+    vtType = 'ref_prov_plan'
+
+    def __init__(self, prov_ref=None):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRefProvPlan.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRefProvPlan(prov_ref=self._db_prov_ref)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prov_ref') and ('prov_entity', self._db_prov_ref) in id_remap:
+                cp._db_prov_ref = id_remap[('prov_entity', self._db_prov_ref)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRefProvPlan()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_ref' in class_dict:
+            res = class_dict['prov_ref'](old_obj, trans_dict)
+            new_obj.db_prov_ref = res
+        elif hasattr(old_obj, 'db_prov_ref') and old_obj.db_prov_ref is not None:
+            new_obj.db_prov_ref = old_obj.db_prov_ref
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_prov_ref(self):
+        return self._db_prov_ref
+    def __set_db_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+    db_prov_ref = property(__get_db_prov_ref, __set_db_prov_ref)
+    def db_add_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_change_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_delete_prov_ref(self, prov_ref):
+        self._db_prov_ref = None
+    
+
+
+class DBOpmArtifact(object):
+
+    vtType = 'opm_artifact'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifact.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifact(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifact()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmArtifactValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmArtifactValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBGroup(object):
+
+    vtType = 'group'
+
+    def __init__(self, id=None, workflow=None, cache=None, name=None, namespace=None, package=None, version=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self.db_deleted_workflow = []
+        self._db_workflow = workflow
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroup(id=self._db_id,
+                     cache=self._db_cache,
+                     name=self._db_name,
+                     namespace=self._db_namespace,
+                     package=self._db_package,
+                     version=self._db_version)
+        if self._db_workflow is not None:
+            cp._db_workflow = self._db_workflow.do_copy()
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'workflow' in class_dict:
+            res = class_dict['workflow'](old_obj, trans_dict)
+            new_obj.db_workflow = res
+        elif hasattr(old_obj, 'db_workflow') and old_obj.db_workflow is not None:
+            obj = old_obj.db_workflow
+            new_obj.db_add_workflow(DBWorkflow.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow') and hasattr(new_obj, 'db_deleted_workflow'):
+            for obj in old_obj.db_deleted_workflow:
+                n_obj = DBWorkflow.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow.append(n_obj)
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow)
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_workflow = []
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_workflow is not None and self._db_workflow.has_changes():
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_workflow(self):
+        return self._db_workflow
+    def __set_db_workflow(self, workflow):
+        self._db_workflow = workflow
+        self.is_dirty = True
+    db_workflow = property(__get_db_workflow, __set_db_workflow)
+    def db_add_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_change_workflow(self, workflow):
+        self._db_workflow = workflow
+    def db_delete_workflow(self, workflow):
+        if not self.is_new:
+            self.db_deleted_workflow.append(self._db_workflow)
+        self._db_workflow = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLog(object):
+
+    vtType = 'log'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, workflow_execs=None, machines=None, vistrail_id=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_workflow_execs = []
+        self.db_workflow_execs_id_index = {}
+        if workflow_execs is None:
+            self._db_workflow_execs = []
+        else:
+            self._db_workflow_execs = workflow_execs
+            for v in self._db_workflow_execs:
+                self.db_workflow_execs_id_index[v.db_id] = v
+        self.db_deleted_machines = []
+        self.db_machines_id_index = {}
+        if machines is None:
+            self._db_machines = []
+        else:
+            self._db_machines = machines
+            for v in self._db_machines:
+                self.db_machines_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLog(id=self._db_id,
+                   entity_type=self._db_entity_type,
+                   version=self._db_version,
+                   name=self._db_name,
+                   last_modified=self._db_last_modified,
+                   vistrail_id=self._db_vistrail_id)
+        if self._db_workflow_execs is None:
+            cp._db_workflow_execs = []
+        else:
+            cp._db_workflow_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_workflow_execs]
+        if self._db_machines is None:
+            cp._db_machines = []
+        else:
+            cp._db_machines = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_machines]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_workflow_execs_id_index = dict((v.db_id, v) for v in cp._db_workflow_execs)
+        cp.db_machines_id_index = dict((v.db_id, v) for v in cp._db_machines)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'workflow_execs' in class_dict:
+            res = class_dict['workflow_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_workflow_exec(obj)
+        elif hasattr(old_obj, 'db_workflow_execs') and old_obj.db_workflow_execs is not None:
+            for obj in old_obj.db_workflow_execs:
+                new_obj.db_add_workflow_exec(DBWorkflowExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_workflow_execs') and hasattr(new_obj, 'db_deleted_workflow_execs'):
+            for obj in old_obj.db_deleted_workflow_execs:
+                n_obj = DBWorkflowExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_workflow_execs.append(n_obj)
+        if 'machines' in class_dict:
+            res = class_dict['machines'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_machine(obj)
+        elif hasattr(old_obj, 'db_machines') and old_obj.db_machines is not None:
+            for obj in old_obj.db_machines:
+                new_obj.db_add_machine(DBMachine.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_machines') and hasattr(new_obj, 'db_deleted_machines'):
+            for obj in old_obj.db_deleted_machines:
+                n_obj = DBMachine.update_version(obj, trans_dict)
+                new_obj.db_deleted_machines.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_workflow_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_workflow_exec(child)
+        to_del = []
+        for child in self.db_machines:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_machine(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_workflow_execs)
+        children.extend(self.db_deleted_machines)
+        if remove:
+            self.db_deleted_workflow_execs = []
+            self.db_deleted_machines = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_workflow_execs:
+            if child.has_changes():
+                return True
+        for child in self._db_machines:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_workflow_execs(self):
+        return self._db_workflow_execs
+    def __set_db_workflow_execs(self, workflow_execs):
+        self._db_workflow_execs = workflow_execs
+        self.is_dirty = True
+    db_workflow_execs = property(__get_db_workflow_execs, __set_db_workflow_execs)
+    def db_get_workflow_execs(self):
+        return self._db_workflow_execs
+    def db_add_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_change_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                self._db_workflow_execs[i] = workflow_exec
+                found = True
+                break
+        if not found:
+            self._db_workflow_execs.append(workflow_exec)
+        self.db_workflow_execs_id_index[workflow_exec.db_id] = workflow_exec
+    def db_delete_workflow_exec(self, workflow_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == workflow_exec.db_id:
+                if not self._db_workflow_execs[i].is_new:
+                    self.db_deleted_workflow_execs.append(self._db_workflow_execs[i])
+                del self._db_workflow_execs[i]
+                break
+        del self.db_workflow_execs_id_index[workflow_exec.db_id]
+    def db_get_workflow_exec(self, key):
+        for i in xrange(len(self._db_workflow_execs)):
+            if self._db_workflow_execs[i].db_id == key:
+                return self._db_workflow_execs[i]
+        return None
+    def db_get_workflow_exec_by_id(self, key):
+        return self.db_workflow_execs_id_index[key]
+    def db_has_workflow_exec_with_id(self, key):
+        return key in self.db_workflow_execs_id_index
+    
+    def __get_db_machines(self):
+        return self._db_machines
+    def __set_db_machines(self, machines):
+        self._db_machines = machines
+        self.is_dirty = True
+    db_machines = property(__get_db_machines, __set_db_machines)
+    def db_get_machines(self):
+        return self._db_machines
+    def db_add_machine(self, machine):
+        self.is_dirty = True
+        self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_change_machine(self, machine):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                self._db_machines[i] = machine
+                found = True
+                break
+        if not found:
+            self._db_machines.append(machine)
+        self.db_machines_id_index[machine.db_id] = machine
+    def db_delete_machine(self, machine):
+        self.is_dirty = True
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == machine.db_id:
+                if not self._db_machines[i].is_new:
+                    self.db_deleted_machines.append(self._db_machines[i])
+                del self._db_machines[i]
+                break
+        del self.db_machines_id_index[machine.db_id]
+    def db_get_machine(self, key):
+        for i in xrange(len(self._db_machines)):
+            if self._db_machines[i].db_id == key:
+                return self._db_machines[i]
+        return None
+    def db_get_machine_by_id(self, key):
+        return self.db_machines_id_index[key]
+    def db_has_machine_with_id(self, key):
+        return key in self.db_machines_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMashupAlias(object):
+
+    vtType = 'mashup_alias'
+
+    def __init__(self, id=None, name=None, component=None):
+        self._db_id = id
+        self._db_name = name
+        self.db_deleted_component = []
+        self._db_component = component
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMashupAlias.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupAlias(id=self._db_id,
+                           name=self._db_name)
+        if self._db_component is not None:
+            cp._db_component = self._db_component.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMashupAlias()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'component' in class_dict:
+            res = class_dict['component'](old_obj, trans_dict)
+            new_obj.db_component = res
+        elif hasattr(old_obj, 'db_component') and old_obj.db_component is not None:
+            obj = old_obj.db_component
+            new_obj.db_add_component(DBMashupComponent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_component') and hasattr(new_obj, 'db_deleted_component'):
+            for obj in old_obj.db_deleted_component:
+                n_obj = DBMashupComponent.update_version(obj, trans_dict)
+                new_obj.db_deleted_component.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_component is not None:
+            children.extend(self._db_component.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_component = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_component)
+        if remove:
+            self.db_deleted_component = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_component is not None and self._db_component.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_component(self):
+        return self._db_component
+    def __set_db_component(self, component):
+        self._db_component = component
+        self.is_dirty = True
+    db_component = property(__get_db_component, __set_db_component)
+    def db_add_component(self, component):
+        self._db_component = component
+    def db_change_component(self, component):
+        self._db_component = component
+    def db_delete_component(self, component):
+        if not self.is_new:
+            self.db_deleted_component.append(self._db_component)
+        self._db_component = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgents(object):
+
+    vtType = 'opm_agents'
+
+    def __init__(self, agents=None):
+        self.db_deleted_agents = []
+        self.db_agents_id_index = {}
+        if agents is None:
+            self._db_agents = []
+        else:
+            self._db_agents = agents
+            for v in self._db_agents:
+                self.db_agents_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgents.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgents()
+        if self._db_agents is None:
+            cp._db_agents = []
+        else:
+            cp._db_agents = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_agents]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_agents_id_index = dict((v.db_id, v) for v in cp._db_agents)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgents()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_agent(obj)
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            for obj in old_obj.db_agents:
+                new_obj.db_add_agent(DBOpmAgent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgent.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_agents:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_agent(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_agents)
+        if remove:
+            self.db_deleted_agents = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_agents:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_get_agents(self):
+        return self._db_agents
+    def db_add_agent(self, agent):
+        self.is_dirty = True
+        self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_change_agent(self, agent):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                self._db_agents[i] = agent
+                found = True
+                break
+        if not found:
+            self._db_agents.append(agent)
+        self.db_agents_id_index[agent.db_id] = agent
+    def db_delete_agent(self, agent):
+        self.is_dirty = True
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == agent.db_id:
+                if not self._db_agents[i].is_new:
+                    self.db_deleted_agents.append(self._db_agents[i])
+                del self._db_agents[i]
+                break
+        del self.db_agents_id_index[agent.db_id]
+    def db_get_agent(self, key):
+        for i in xrange(len(self._db_agents)):
+            if self._db_agents[i].db_id == key:
+                return self._db_agents[i]
+        return None
+    def db_get_agent_by_id(self, key):
+        return self.db_agents_id_index[key]
+    def db_has_agent_with_id(self, key):
+        return key in self.db_agents_id_index
+    
+
+
+class DBMashup(object):
+
+    vtType = 'mashup'
+
+    def __init__(self, id=None, name=None, version=None, aliases=None, type=None, vtid=None, layout=None, geometry=None, has_seq=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_version = version
+        self.db_deleted_aliases = []
+        self.db_aliases_id_index = {}
+        if aliases is None:
+            self._db_aliases = []
+        else:
+            self._db_aliases = aliases
+            for v in self._db_aliases:
+                self.db_aliases_id_index[v.db_id] = v
+        self._db_type = type
+        self._db_vtid = vtid
+        self._db_layout = layout
+        self._db_geometry = geometry
+        self._db_has_seq = has_seq
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMashup.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashup(id=self._db_id,
+                      name=self._db_name,
+                      version=self._db_version,
+                      type=self._db_type,
+                      vtid=self._db_vtid,
+                      layout=self._db_layout,
+                      geometry=self._db_geometry,
+                      has_seq=self._db_has_seq)
+        if self._db_aliases is None:
+            cp._db_aliases = []
+        else:
+            cp._db_aliases = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_aliases]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vtid') and ('vistrail', self._db_vtid) in id_remap:
+                cp._db_vtid = id_remap[('vistrail', self._db_vtid)]
+        
+        # recreate indices and set flags
+        cp.db_aliases_id_index = dict((v.db_id, v) for v in cp._db_aliases)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMashup()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'aliases' in class_dict:
+            res = class_dict['aliases'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_alias(obj)
+        elif hasattr(old_obj, 'db_aliases') and old_obj.db_aliases is not None:
+            for obj in old_obj.db_aliases:
+                new_obj.db_add_alias(DBMashupAlias.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_aliases') and hasattr(new_obj, 'db_deleted_aliases'):
+            for obj in old_obj.db_deleted_aliases:
+                n_obj = DBMashupAlias.update_version(obj, trans_dict)
+                new_obj.db_deleted_aliases.append(n_obj)
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'vtid' in class_dict:
+            res = class_dict['vtid'](old_obj, trans_dict)
+            new_obj.db_vtid = res
+        elif hasattr(old_obj, 'db_vtid') and old_obj.db_vtid is not None:
+            new_obj.db_vtid = old_obj.db_vtid
+        if 'layout' in class_dict:
+            res = class_dict['layout'](old_obj, trans_dict)
+            new_obj.db_layout = res
+        elif hasattr(old_obj, 'db_layout') and old_obj.db_layout is not None:
+            new_obj.db_layout = old_obj.db_layout
+        if 'geometry' in class_dict:
+            res = class_dict['geometry'](old_obj, trans_dict)
+            new_obj.db_geometry = res
+        elif hasattr(old_obj, 'db_geometry') and old_obj.db_geometry is not None:
+            new_obj.db_geometry = old_obj.db_geometry
+        if 'has_seq' in class_dict:
+            res = class_dict['has_seq'](old_obj, trans_dict)
+            new_obj.db_has_seq = res
+        elif hasattr(old_obj, 'db_has_seq') and old_obj.db_has_seq is not None:
+            new_obj.db_has_seq = old_obj.db_has_seq
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_aliases:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_alias(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_aliases)
+        if remove:
+            self.db_deleted_aliases = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_aliases:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_aliases(self):
+        return self._db_aliases
+    def __set_db_aliases(self, aliases):
+        self._db_aliases = aliases
+        self.is_dirty = True
+    db_aliases = property(__get_db_aliases, __set_db_aliases)
+    def db_get_aliases(self):
+        return self._db_aliases
+    def db_add_alias(self, alias):
+        self.is_dirty = True
+        self._db_aliases.append(alias)
+        self.db_aliases_id_index[alias.db_id] = alias
+    def db_change_alias(self, alias):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_aliases)):
+            if self._db_aliases[i].db_id == alias.db_id:
+                self._db_aliases[i] = alias
+                found = True
+                break
+        if not found:
+            self._db_aliases.append(alias)
+        self.db_aliases_id_index[alias.db_id] = alias
+    def db_delete_alias(self, alias):
+        self.is_dirty = True
+        for i in xrange(len(self._db_aliases)):
+            if self._db_aliases[i].db_id == alias.db_id:
+                if not self._db_aliases[i].is_new:
+                    self.db_deleted_aliases.append(self._db_aliases[i])
+                del self._db_aliases[i]
+                break
+        del self.db_aliases_id_index[alias.db_id]
+    def db_get_alias(self, key):
+        for i in xrange(len(self._db_aliases)):
+            if self._db_aliases[i].db_id == key:
+                return self._db_aliases[i]
+        return None
+    def db_get_alias_by_id(self, key):
+        return self.db_aliases_id_index[key]
+    def db_has_alias_with_id(self, key):
+        return key in self.db_aliases_id_index
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_vtid(self):
+        return self._db_vtid
+    def __set_db_vtid(self, vtid):
+        self._db_vtid = vtid
+        self.is_dirty = True
+    db_vtid = property(__get_db_vtid, __set_db_vtid)
+    def db_add_vtid(self, vtid):
+        self._db_vtid = vtid
+    def db_change_vtid(self, vtid):
+        self._db_vtid = vtid
+    def db_delete_vtid(self, vtid):
+        self._db_vtid = None
+    
+    def __get_db_layout(self):
+        return self._db_layout
+    def __set_db_layout(self, layout):
+        self._db_layout = layout
+        self.is_dirty = True
+    db_layout = property(__get_db_layout, __set_db_layout)
+    def db_add_layout(self, layout):
+        self._db_layout = layout
+    def db_change_layout(self, layout):
+        self._db_layout = layout
+    def db_delete_layout(self, layout):
+        self._db_layout = None
+    
+    def __get_db_geometry(self):
+        return self._db_geometry
+    def __set_db_geometry(self, geometry):
+        self._db_geometry = geometry
+        self.is_dirty = True
+    db_geometry = property(__get_db_geometry, __set_db_geometry)
+    def db_add_geometry(self, geometry):
+        self._db_geometry = geometry
+    def db_change_geometry(self, geometry):
+        self._db_geometry = geometry
+    def db_delete_geometry(self, geometry):
+        self._db_geometry = None
+    
+    def __get_db_has_seq(self):
+        return self._db_has_seq
+    def __set_db_has_seq(self, has_seq):
+        self._db_has_seq = has_seq
+        self.is_dirty = True
+    db_has_seq = property(__get_db_has_seq, __set_db_has_seq)
+    def db_add_has_seq(self, has_seq):
+        self._db_has_seq = has_seq
+    def db_change_has_seq(self, has_seq):
+        self._db_has_seq = has_seq
+    def db_delete_has_seq(self, has_seq):
+        self._db_has_seq = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcessIdCause(object):
+
+    vtType = 'opm_process_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_process', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_process', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBProvGeneration(object):
+
+    vtType = 'prov_generation'
+
+    def __init__(self, prov_entity=None, prov_activity=None, prov_role=None):
+        self.db_deleted_prov_entity = []
+        self._db_prov_entity = prov_entity
+        self.db_deleted_prov_activity = []
+        self._db_prov_activity = prov_activity
+        self._db_prov_role = prov_role
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvGeneration.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvGeneration(prov_role=self._db_prov_role)
+        if self._db_prov_entity is not None:
+            cp._db_prov_entity = self._db_prov_entity.do_copy(new_ids, id_scope, id_remap)
+        if self._db_prov_activity is not None:
+            cp._db_prov_activity = self._db_prov_activity.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvGeneration()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_entity' in class_dict:
+            res = class_dict['prov_entity'](old_obj, trans_dict)
+            new_obj.db_prov_entity = res
+        elif hasattr(old_obj, 'db_prov_entity') and old_obj.db_prov_entity is not None:
+            obj = old_obj.db_prov_entity
+            new_obj.db_add_prov_entity(DBRefProvEntity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_entity') and hasattr(new_obj, 'db_deleted_prov_entity'):
+            for obj in old_obj.db_deleted_prov_entity:
+                n_obj = DBRefProvEntity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_entity.append(n_obj)
+        if 'prov_activity' in class_dict:
+            res = class_dict['prov_activity'](old_obj, trans_dict)
+            new_obj.db_prov_activity = res
+        elif hasattr(old_obj, 'db_prov_activity') and old_obj.db_prov_activity is not None:
+            obj = old_obj.db_prov_activity
+            new_obj.db_add_prov_activity(DBRefProvActivity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_activity') and hasattr(new_obj, 'db_deleted_prov_activity'):
+            for obj in old_obj.db_deleted_prov_activity:
+                n_obj = DBRefProvActivity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_activity.append(n_obj)
+        if 'prov_role' in class_dict:
+            res = class_dict['prov_role'](old_obj, trans_dict)
+            new_obj.db_prov_role = res
+        elif hasattr(old_obj, 'db_prov_role') and old_obj.db_prov_role is not None:
+            new_obj.db_prov_role = old_obj.db_prov_role
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_prov_entity is not None:
+            children.extend(self._db_prov_entity.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_entity = None
+        if self._db_prov_activity is not None:
+            children.extend(self._db_prov_activity.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_activity = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_prov_entity)
+        children.extend(self.db_deleted_prov_activity)
+        if remove:
+            self.db_deleted_prov_entity = []
+            self.db_deleted_prov_activity = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_prov_entity is not None and self._db_prov_entity.has_changes():
+            return True
+        if self._db_prov_activity is not None and self._db_prov_activity.has_changes():
+            return True
+        return False
+    def __get_db_prov_entity(self):
+        return self._db_prov_entity
+    def __set_db_prov_entity(self, prov_entity):
+        self._db_prov_entity = prov_entity
+        self.is_dirty = True
+    db_prov_entity = property(__get_db_prov_entity, __set_db_prov_entity)
+    def db_add_prov_entity(self, prov_entity):
+        self._db_prov_entity = prov_entity
+    def db_change_prov_entity(self, prov_entity):
+        self._db_prov_entity = prov_entity
+    def db_delete_prov_entity(self, prov_entity):
+        if not self.is_new:
+            self.db_deleted_prov_entity.append(self._db_prov_entity)
+        self._db_prov_entity = None
+    
+    def __get_db_prov_activity(self):
+        return self._db_prov_activity
+    def __set_db_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+        self.is_dirty = True
+    db_prov_activity = property(__get_db_prov_activity, __set_db_prov_activity)
+    def db_add_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+    def db_change_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+    def db_delete_prov_activity(self, prov_activity):
+        if not self.is_new:
+            self.db_deleted_prov_activity.append(self._db_prov_activity)
+        self._db_prov_activity = None
+    
+    def __get_db_prov_role(self):
+        return self._db_prov_role
+    def __set_db_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+        self.is_dirty = True
+    db_prov_role = property(__get_db_prov_role, __set_db_prov_role)
+    def db_add_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+    def db_change_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+    def db_delete_prov_role(self, prov_role):
+        self._db_prov_role = None
+    
+
+
+class DBPortSpecItem(object):
+
+    vtType = 'portSpecItem'
+
+    def __init__(self, id=None, pos=None, module=None, package=None, namespace=None, label=None, default=None, values=None, entry_type=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_module = module
+        self._db_package = package
+        self._db_namespace = namespace
+        self._db_label = label
+        self._db_default = default
+        self._db_values = values
+        self._db_entry_type = entry_type
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPortSpecItem.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPortSpecItem(id=self._db_id,
+                            pos=self._db_pos,
+                            module=self._db_module,
+                            package=self._db_package,
+                            namespace=self._db_namespace,
+                            label=self._db_label,
+                            default=self._db_default,
+                            values=self._db_values,
+                            entry_type=self._db_entry_type)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPortSpecItem()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'module' in class_dict:
+            res = class_dict['module'](old_obj, trans_dict)
+            new_obj.db_module = res
+        elif hasattr(old_obj, 'db_module') and old_obj.db_module is not None:
+            new_obj.db_module = old_obj.db_module
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'label' in class_dict:
+            res = class_dict['label'](old_obj, trans_dict)
+            new_obj.db_label = res
+        elif hasattr(old_obj, 'db_label') and old_obj.db_label is not None:
+            new_obj.db_label = old_obj.db_label
+        if 'default' in class_dict:
+            res = class_dict['default'](old_obj, trans_dict)
+            new_obj.db_default = res
+        elif hasattr(old_obj, 'db_default') and old_obj.db_default is not None:
+            new_obj.db_default = old_obj.db_default
+        if 'values' in class_dict:
+            res = class_dict['values'](old_obj, trans_dict)
+            new_obj.db_values = res
+        elif hasattr(old_obj, 'db_values') and old_obj.db_values is not None:
+            new_obj.db_values = old_obj.db_values
+        if 'entry_type' in class_dict:
+            res = class_dict['entry_type'](old_obj, trans_dict)
+            new_obj.db_entry_type = res
+        elif hasattr(old_obj, 'db_entry_type') and old_obj.db_entry_type is not None:
+            new_obj.db_entry_type = old_obj.db_entry_type
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_module(self):
+        return self._db_module
+    def __set_db_module(self, module):
+        self._db_module = module
+        self.is_dirty = True
+    db_module = property(__get_db_module, __set_db_module)
+    def db_add_module(self, module):
+        self._db_module = module
+    def db_change_module(self, module):
+        self._db_module = module
+    def db_delete_module(self, module):
+        self._db_module = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_label(self):
+        return self._db_label
+    def __set_db_label(self, label):
+        self._db_label = label
+        self.is_dirty = True
+    db_label = property(__get_db_label, __set_db_label)
+    def db_add_label(self, label):
+        self._db_label = label
+    def db_change_label(self, label):
+        self._db_label = label
+    def db_delete_label(self, label):
+        self._db_label = None
+    
+    def __get_db_default(self):
+        return self._db_default
+    def __set_db_default(self, default):
+        self._db_default = default
+        self.is_dirty = True
+    db_default = property(__get_db_default, __set_db_default)
+    def db_add_default(self, default):
+        self._db_default = default
+    def db_change_default(self, default):
+        self._db_default = default
+    def db_delete_default(self, default):
+        self._db_default = None
+    
+    def __get_db_values(self):
+        return self._db_values
+    def __set_db_values(self, values):
+        self._db_values = values
+        self.is_dirty = True
+    db_values = property(__get_db_values, __set_db_values)
+    def db_add_values(self, values):
+        self._db_values = values
+    def db_change_values(self, values):
+        self._db_values = values
+    def db_delete_values(self, values):
+        self._db_values = None
+    
+    def __get_db_entry_type(self):
+        return self._db_entry_type
+    def __set_db_entry_type(self, entry_type):
+        self._db_entry_type = entry_type
+        self.is_dirty = True
+    db_entry_type = property(__get_db_entry_type, __set_db_entry_type)
+    def db_add_entry_type(self, entry_type):
+        self._db_entry_type = entry_type
+    def db_change_entry_type(self, entry_type):
+        self._db_entry_type = entry_type
+    def db_delete_entry_type(self, entry_type):
+        self._db_entry_type = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMachine(object):
+
+    vtType = 'machine'
+
+    def __init__(self, id=None, name=None, os=None, architecture=None, processor=None, ram=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_os = os
+        self._db_architecture = architecture
+        self._db_processor = processor
+        self._db_ram = ram
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMachine.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMachine(id=self._db_id,
+                       name=self._db_name,
+                       os=self._db_os,
+                       architecture=self._db_architecture,
+                       processor=self._db_processor,
+                       ram=self._db_ram)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrailId') and ('vistrail', self._db_vistrailId) in id_remap:
+                cp._db_vistrailId = id_remap[('vistrail', self._db_vistrailId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMachine()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'os' in class_dict:
+            res = class_dict['os'](old_obj, trans_dict)
+            new_obj.db_os = res
+        elif hasattr(old_obj, 'db_os') and old_obj.db_os is not None:
+            new_obj.db_os = old_obj.db_os
+        if 'architecture' in class_dict:
+            res = class_dict['architecture'](old_obj, trans_dict)
+            new_obj.db_architecture = res
+        elif hasattr(old_obj, 'db_architecture') and old_obj.db_architecture is not None:
+            new_obj.db_architecture = old_obj.db_architecture
+        if 'processor' in class_dict:
+            res = class_dict['processor'](old_obj, trans_dict)
+            new_obj.db_processor = res
+        elif hasattr(old_obj, 'db_processor') and old_obj.db_processor is not None:
+            new_obj.db_processor = old_obj.db_processor
+        if 'ram' in class_dict:
+            res = class_dict['ram'](old_obj, trans_dict)
+            new_obj.db_ram = res
+        elif hasattr(old_obj, 'db_ram') and old_obj.db_ram is not None:
+            new_obj.db_ram = old_obj.db_ram
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_os(self):
+        return self._db_os
+    def __set_db_os(self, os):
+        self._db_os = os
+        self.is_dirty = True
+    db_os = property(__get_db_os, __set_db_os)
+    def db_add_os(self, os):
+        self._db_os = os
+    def db_change_os(self, os):
+        self._db_os = os
+    def db_delete_os(self, os):
+        self._db_os = None
+    
+    def __get_db_architecture(self):
+        return self._db_architecture
+    def __set_db_architecture(self, architecture):
+        self._db_architecture = architecture
+        self.is_dirty = True
+    db_architecture = property(__get_db_architecture, __set_db_architecture)
+    def db_add_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_change_architecture(self, architecture):
+        self._db_architecture = architecture
+    def db_delete_architecture(self, architecture):
+        self._db_architecture = None
+    
+    def __get_db_processor(self):
+        return self._db_processor
+    def __set_db_processor(self, processor):
+        self._db_processor = processor
+        self.is_dirty = True
+    db_processor = property(__get_db_processor, __set_db_processor)
+    def db_add_processor(self, processor):
+        self._db_processor = processor
+    def db_change_processor(self, processor):
+        self._db_processor = processor
+    def db_delete_processor(self, processor):
+        self._db_processor = None
+    
+    def __get_db_ram(self):
+        return self._db_ram
+    def __set_db_ram(self, ram):
+        self._db_ram = ram
+        self.is_dirty = True
+    db_ram = property(__get_db_ram, __set_db_ram)
+    def db_add_ram(self, ram):
+        self._db_ram = ram
+    def db_change_ram(self, ram):
+        self._db_ram = ram
+    def db_delete_ram(self, ram):
+        self._db_ram = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAdd(object):
+
+    vtType = 'add'
+
+    def __init__(self, data=None, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAdd.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAdd(id=self._db_id,
+                   what=self._db_what,
+                   objectId=self._db_objectId,
+                   parentObjId=self._db_parentObjId,
+                   parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAdd()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOther(object):
+
+    vtType = 'other'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOther.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOther(id=self._db_id,
+                     key=self._db_key,
+                     value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOther()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLocation(object):
+
+    vtType = 'location'
+
+    def __init__(self, id=None, x=None, y=None):
+        self._db_id = id
+        self._db_x = x
+        self._db_y = y
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLocation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLocation(id=self._db_id,
+                        x=self._db_x,
+                        y=self._db_y)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLocation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'x' in class_dict:
+            res = class_dict['x'](old_obj, trans_dict)
+            new_obj.db_x = res
+        elif hasattr(old_obj, 'db_x') and old_obj.db_x is not None:
+            new_obj.db_x = old_obj.db_x
+        if 'y' in class_dict:
+            res = class_dict['y'](old_obj, trans_dict)
+            new_obj.db_y = res
+        elif hasattr(old_obj, 'db_y') and old_obj.db_y is not None:
+            new_obj.db_y = old_obj.db_y
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_x(self):
+        return self._db_x
+    def __set_db_x(self, x):
+        self._db_x = x
+        self.is_dirty = True
+    db_x = property(__get_db_x, __set_db_x)
+    def db_add_x(self, x):
+        self._db_x = x
+    def db_change_x(self, x):
+        self._db_x = x
+    def db_delete_x(self, x):
+        self._db_x = None
+    
+    def __get_db_y(self):
+        return self._db_y
+    def __set_db_y(self, y):
+        self._db_y = y
+        self.is_dirty = True
+    db_y = property(__get_db_y, __set_db_y)
+    def db_add_y(self, y):
+        self._db_y = y
+    def db_change_y(self, y):
+        self._db_y = y
+    def db_delete_y(self, y):
+        self._db_y = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmOverlaps(object):
+
+    vtType = 'opm_overlaps'
+
+    def __init__(self, opm_account_ids=None):
+        self.db_deleted_opm_account_ids = []
+        if opm_account_ids is None:
+            self._db_opm_account_ids = []
+        else:
+            self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmOverlaps.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmOverlaps()
+        if self._db_opm_account_ids is None:
+            cp._db_opm_account_ids = []
+        else:
+            cp._db_opm_account_ids = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_account_ids]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmOverlaps()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'opm_account_ids' in class_dict:
+            res = class_dict['opm_account_ids'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_account_id(obj)
+        elif hasattr(old_obj, 'db_opm_account_ids') and old_obj.db_opm_account_ids is not None:
+            for obj in old_obj.db_opm_account_ids:
+                new_obj.db_add_opm_account_id(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_account_ids') and hasattr(new_obj, 'db_deleted_opm_account_ids'):
+            for obj in old_obj.db_deleted_opm_account_ids:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_account_ids.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_opm_account_ids:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_account_id(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_opm_account_ids)
+        if remove:
+            self.db_deleted_opm_account_ids = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_opm_account_ids:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def __set_db_opm_account_ids(self, opm_account_ids):
+        self._db_opm_account_ids = opm_account_ids
+        self.is_dirty = True
+    db_opm_account_ids = property(__get_db_opm_account_ids, __set_db_opm_account_ids)
+    def db_get_opm_account_ids(self):
+        return self._db_opm_account_ids
+    def db_add_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_change_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        self._db_opm_account_ids.append(opm_account_id)
+    def db_delete_opm_account_id(self, opm_account_id):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_account_id(self, key):
+        return None
+    
+
+
+class DBPEParameter(object):
+
+    vtType = 'pe_parameter'
+
+    def __init__(self, id=None, pos=None, interpolator=None, value=None, dimension=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_interpolator = interpolator
+        self._db_value = value
+        self._db_dimension = dimension
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPEParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPEParameter(id=self._db_id,
+                           pos=self._db_pos,
+                           interpolator=self._db_interpolator,
+                           value=self._db_value,
+                           dimension=self._db_dimension)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPEParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'interpolator' in class_dict:
+            res = class_dict['interpolator'](old_obj, trans_dict)
+            new_obj.db_interpolator = res
+        elif hasattr(old_obj, 'db_interpolator') and old_obj.db_interpolator is not None:
+            new_obj.db_interpolator = old_obj.db_interpolator
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'dimension' in class_dict:
+            res = class_dict['dimension'](old_obj, trans_dict)
+            new_obj.db_dimension = res
+        elif hasattr(old_obj, 'db_dimension') and old_obj.db_dimension is not None:
+            new_obj.db_dimension = old_obj.db_dimension
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_interpolator(self):
+        return self._db_interpolator
+    def __set_db_interpolator(self, interpolator):
+        self._db_interpolator = interpolator
+        self.is_dirty = True
+    db_interpolator = property(__get_db_interpolator, __set_db_interpolator)
+    def db_add_interpolator(self, interpolator):
+        self._db_interpolator = interpolator
+    def db_change_interpolator(self, interpolator):
+        self._db_interpolator = interpolator
+    def db_delete_interpolator(self, interpolator):
+        self._db_interpolator = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_dimension(self):
+        return self._db_dimension
+    def __set_db_dimension(self, dimension):
+        self._db_dimension = dimension
+        self.is_dirty = True
+    db_dimension = property(__get_db_dimension, __set_db_dimension)
+    def db_add_dimension(self, dimension):
+        self._db_dimension = dimension
+    def db_change_dimension(self, dimension):
+        self._db_dimension = dimension
+    def db_delete_dimension(self, dimension):
+        self._db_dimension = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmDependencies(object):
+
+    vtType = 'opm_dependencies'
+
+    def __init__(self, dependencys=None):
+        self.db_deleted_dependencys = []
+        if dependencys is None:
+            self._db_dependencys = []
+        else:
+            self._db_dependencys = dependencys
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmDependencies.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmDependencies()
+        if self._db_dependencys is None:
+            cp._db_dependencys = []
+        else:
+            cp._db_dependencys = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_dependencys]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmDependencies()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'dependencys' in class_dict:
+            res = class_dict['dependencys'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_dependency(obj)
+        elif hasattr(old_obj, 'db_dependencys') and old_obj.db_dependencys is not None:
+            for obj in old_obj.db_dependencys:
+                if obj.vtType == 'opm_used':
+                    new_obj.db_add_dependency(DBOpmUsed.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_generated_by':
+                    new_obj.db_add_dependency(DBOpmWasGeneratedBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_triggered_by':
+                    new_obj.db_add_dependency(DBOpmWasTriggeredBy.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_derived_from':
+                    new_obj.db_add_dependency(DBOpmWasDerivedFrom.update_version(obj, trans_dict))
+                elif obj.vtType == 'opm_was_controlled_by':
+                    new_obj.db_add_dependency(DBOpmWasControlledBy.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencys') and hasattr(new_obj, 'db_deleted_dependencys'):
+            for obj in old_obj.db_deleted_dependencys:
+                if obj.vtType == 'opm_used':
+                    n_obj = DBOpmUsed.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_generated_by':
+                    n_obj = DBOpmWasGeneratedBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_triggered_by':
+                    n_obj = DBOpmWasTriggeredBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_derived_from':
+                    n_obj = DBOpmWasDerivedFrom.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+                elif obj.vtType == 'opm_was_controlled_by':
+                    n_obj = DBOpmWasControlledBy.update_version(obj, trans_dict)
+                    new_obj.db_deleted_dependencys.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_dependencys:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_dependency(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_dependencys)
+        if remove:
+            self.db_deleted_dependencys = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_dependencys:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_dependencys(self):
+        return self._db_dependencys
+    def __set_db_dependencys(self, dependencys):
+        self._db_dependencys = dependencys
+        self.is_dirty = True
+    db_dependencys = property(__get_db_dependencys, __set_db_dependencys)
+    def db_get_dependencys(self):
+        return self._db_dependencys
+    def db_add_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_change_dependency(self, dependency):
+        self.is_dirty = True
+        self._db_dependencys.append(dependency)
+    def db_delete_dependency(self, dependency):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_dependency(self, key):
+        return None
+    
+
+
+class DBParameter(object):
+
+    vtType = 'parameter'
+
+    def __init__(self, id=None, pos=None, name=None, type=None, val=None, alias=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self._db_type = type
+        self._db_val = val
+        self._db_alias = alias
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameter.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameter(id=self._db_id,
+                         pos=self._db_pos,
+                         name=self._db_name,
+                         type=self._db_type,
+                         val=self._db_val,
+                         alias=self._db_alias)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameter()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'alias' in class_dict:
+            res = class_dict['alias'](old_obj, trans_dict)
+            new_obj.db_alias = res
+        elif hasattr(old_obj, 'db_alias') and old_obj.db_alias is not None:
+            new_obj.db_alias = old_obj.db_alias
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_alias(self):
+        return self._db_alias
+    def __set_db_alias(self, alias):
+        self._db_alias = alias
+        self.is_dirty = True
+    db_alias = property(__get_db_alias, __set_db_alias)
+    def db_add_alias(self, alias):
+        self._db_alias = alias
+    def db_change_alias(self, alias):
+        self._db_alias = alias
+    def db_delete_alias(self, alias):
+        self._db_alias = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmUsed(object):
+
+    vtType = 'opm_used'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmUsed.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmUsed()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmUsed()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBPluginData(object):
+
+    vtType = 'plugin_data'
+
+    def __init__(self, id=None, data=None):
+        self._db_id = id
+        self._db_data = data
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPluginData.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPluginData(id=self._db_id,
+                          data=self._db_data)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPluginData()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            new_obj.db_data = old_obj.db_data
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        self._db_data = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBFunction(object):
+
+    vtType = 'function'
+
+    def __init__(self, id=None, pos=None, name=None, parameters=None):
+        self._db_id = id
+        self._db_pos = pos
+        self._db_name = name
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBFunction(id=self._db_id,
+                        pos=self._db_pos,
+                        name=self._db_name)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBActionAnnotation(object):
+
+    vtType = 'actionAnnotation'
+
+    def __init__(self, id=None, key=None, value=None, action_id=None, date=None, user=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self._db_action_id = action_id
+        self._db_date = date
+        self._db_user = user
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBActionAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBActionAnnotation(id=self._db_id,
+                                key=self._db_key,
+                                value=self._db_value,
+                                action_id=self._db_action_id,
+                                date=self._db_date,
+                                user=self._db_user)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_action_id') and ('action', self._db_action_id) in id_remap:
+                cp._db_action_id = id_remap[('action', self._db_action_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBActionAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'action_id' in class_dict:
+            res = class_dict['action_id'](old_obj, trans_dict)
+            new_obj.db_action_id = res
+        elif hasattr(old_obj, 'db_action_id') and old_obj.db_action_id is not None:
+            new_obj.db_action_id = old_obj.db_action_id
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_action_id(self):
+        return self._db_action_id
+    def __set_db_action_id(self, action_id):
+        self._db_action_id = action_id
+        self.is_dirty = True
+    db_action_id = property(__get_db_action_id, __set_db_action_id)
+    def db_add_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_change_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_delete_action_id(self, action_id):
+        self._db_action_id = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAbstraction(object):
+
+    vtType = 'abstraction'
+
+    def __init__(self, id=None, cache=None, name=None, namespace=None, package=None, version=None, internal_version=None, location=None, functions=None, annotations=None):
+        self._db_id = id
+        self._db_cache = cache
+        self._db_name = name
+        self._db_namespace = namespace
+        self._db_package = package
+        self._db_version = version
+        self._db_internal_version = internal_version
+        self.db_deleted_location = []
+        self._db_location = location
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAbstraction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAbstraction(id=self._db_id,
+                           cache=self._db_cache,
+                           name=self._db_name,
+                           namespace=self._db_namespace,
+                           package=self._db_package,
+                           version=self._db_version,
+                           internal_version=self._db_internal_version)
+        if self._db_location is not None:
+            cp._db_location = self._db_location.do_copy(new_ids, id_scope, id_remap)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAbstraction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'cache' in class_dict:
+            res = class_dict['cache'](old_obj, trans_dict)
+            new_obj.db_cache = res
+        elif hasattr(old_obj, 'db_cache') and old_obj.db_cache is not None:
+            new_obj.db_cache = old_obj.db_cache
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'namespace' in class_dict:
+            res = class_dict['namespace'](old_obj, trans_dict)
+            new_obj.db_namespace = res
+        elif hasattr(old_obj, 'db_namespace') and old_obj.db_namespace is not None:
+            new_obj.db_namespace = old_obj.db_namespace
+        if 'package' in class_dict:
+            res = class_dict['package'](old_obj, trans_dict)
+            new_obj.db_package = res
+        elif hasattr(old_obj, 'db_package') and old_obj.db_package is not None:
+            new_obj.db_package = old_obj.db_package
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'internal_version' in class_dict:
+            res = class_dict['internal_version'](old_obj, trans_dict)
+            new_obj.db_internal_version = res
+        elif hasattr(old_obj, 'db_internal_version') and old_obj.db_internal_version is not None:
+            new_obj.db_internal_version = old_obj.db_internal_version
+        if 'location' in class_dict:
+            res = class_dict['location'](old_obj, trans_dict)
+            new_obj.db_location = res
+        elif hasattr(old_obj, 'db_location') and old_obj.db_location is not None:
+            obj = old_obj.db_location
+            new_obj.db_add_location(DBLocation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_location') and hasattr(new_obj, 'db_deleted_location'):
+            for obj in old_obj.db_deleted_location:
+                n_obj = DBLocation.update_version(obj, trans_dict)
+                new_obj.db_deleted_location.append(n_obj)
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_location is not None:
+            children.extend(self._db_location.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_location = None
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_location)
+        children.extend(self.db_deleted_functions)
+        children.extend(self.db_deleted_annotations)
+        if remove:
+            self.db_deleted_location = []
+            self.db_deleted_functions = []
+            self.db_deleted_annotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_location is not None and self._db_location.has_changes():
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_cache(self):
+        return self._db_cache
+    def __set_db_cache(self, cache):
+        self._db_cache = cache
+        self.is_dirty = True
+    db_cache = property(__get_db_cache, __set_db_cache)
+    def db_add_cache(self, cache):
+        self._db_cache = cache
+    def db_change_cache(self, cache):
+        self._db_cache = cache
+    def db_delete_cache(self, cache):
+        self._db_cache = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_namespace(self):
+        return self._db_namespace
+    def __set_db_namespace(self, namespace):
+        self._db_namespace = namespace
+        self.is_dirty = True
+    db_namespace = property(__get_db_namespace, __set_db_namespace)
+    def db_add_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_change_namespace(self, namespace):
+        self._db_namespace = namespace
+    def db_delete_namespace(self, namespace):
+        self._db_namespace = None
+    
+    def __get_db_package(self):
+        return self._db_package
+    def __set_db_package(self, package):
+        self._db_package = package
+        self.is_dirty = True
+    db_package = property(__get_db_package, __set_db_package)
+    def db_add_package(self, package):
+        self._db_package = package
+    def db_change_package(self, package):
+        self._db_package = package
+    def db_delete_package(self, package):
+        self._db_package = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_internal_version(self):
+        return self._db_internal_version
+    def __set_db_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+        self.is_dirty = True
+    db_internal_version = property(__get_db_internal_version, __set_db_internal_version)
+    def db_add_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_change_internal_version(self, internal_version):
+        self._db_internal_version = internal_version
+    def db_delete_internal_version(self, internal_version):
+        self._db_internal_version = None
+    
+    def __get_db_location(self):
+        return self._db_location
+    def __set_db_location(self, location):
+        self._db_location = location
+        self.is_dirty = True
+    db_location = property(__get_db_location, __set_db_location)
+    def db_add_location(self, location):
+        self._db_location = location
+    def db_change_location(self, location):
+        self._db_location = location
+    def db_delete_location(self, location):
+        if not self.is_new:
+            self.db_deleted_location.append(self._db_location)
+        self._db_location = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflow(object):
+
+    vtType = 'workflow'
+
+    def __init__(self, modules=None, id=None, entity_type=None, name=None, version=None, last_modified=None, connections=None, annotations=None, plugin_datas=None, others=None, vistrail_id=None):
+        self.db_deleted_modules = []
+        self.db_modules_id_index = {}
+        if modules is None:
+            self._db_modules = []
+        else:
+            self._db_modules = modules
+            for v in self._db_modules:
+                self.db_modules_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_name = name
+        self._db_version = version
+        self._db_last_modified = last_modified
+        self.db_deleted_connections = []
+        self.db_connections_id_index = {}
+        if connections is None:
+            self._db_connections = []
+        else:
+            self._db_connections = connections
+            for v in self._db_connections:
+                self.db_connections_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_plugin_datas = []
+        self.db_plugin_datas_id_index = {}
+        if plugin_datas is None:
+            self._db_plugin_datas = []
+        else:
+            self._db_plugin_datas = plugin_datas
+            for v in self._db_plugin_datas:
+                self.db_plugin_datas_id_index[v.db_id] = v
+        self.db_deleted_others = []
+        self.db_others_id_index = {}
+        if others is None:
+            self._db_others = []
+        else:
+            self._db_others = others
+            for v in self._db_others:
+                self.db_others_id_index[v.db_id] = v
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflow(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        name=self._db_name,
+                        version=self._db_version,
+                        last_modified=self._db_last_modified,
+                        vistrail_id=self._db_vistrail_id)
+        if self._db_modules is None:
+            cp._db_modules = []
+        else:
+            cp._db_modules = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_modules]
+        if self._db_connections is None:
+            cp._db_connections = []
+        else:
+            cp._db_connections = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_connections]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_plugin_datas is None:
+            cp._db_plugin_datas = []
+        else:
+            cp._db_plugin_datas = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_plugin_datas]
+        if self._db_others is None:
+            cp._db_others = []
+        else:
+            cp._db_others = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_others]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_vistrail_id') and ('vistrail', self._db_vistrail_id) in id_remap:
+                cp._db_vistrail_id = id_remap[('vistrail', self._db_vistrail_id)]
+        
+        # recreate indices and set flags
+        cp.db_modules_id_index = dict((v.db_id, v) for v in cp._db_modules)
+        cp.db_connections_id_index = dict((v.db_id, v) for v in cp._db_connections)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_plugin_datas_id_index = dict((v.db_id, v) for v in cp._db_plugin_datas)
+        cp.db_others_id_index = dict((v.db_id, v) for v in cp._db_others)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'modules' in class_dict:
+            res = class_dict['modules'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module(obj)
+        elif hasattr(old_obj, 'db_modules') and old_obj.db_modules is not None:
+            for obj in old_obj.db_modules:
+                if obj.vtType == 'module':
+                    new_obj.db_add_module(DBModule.update_version(obj, trans_dict))
+                elif obj.vtType == 'abstraction':
+                    new_obj.db_add_module(DBAbstraction.update_version(obj, trans_dict))
+                elif obj.vtType == 'group':
+                    new_obj.db_add_module(DBGroup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_modules') and hasattr(new_obj, 'db_deleted_modules'):
+            for obj in old_obj.db_deleted_modules:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_modules.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'connections' in class_dict:
+            res = class_dict['connections'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_connection(obj)
+        elif hasattr(old_obj, 'db_connections') and old_obj.db_connections is not None:
+            for obj in old_obj.db_connections:
+                new_obj.db_add_connection(DBConnection.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_connections') and hasattr(new_obj, 'db_deleted_connections'):
+            for obj in old_obj.db_deleted_connections:
+                n_obj = DBConnection.update_version(obj, trans_dict)
+                new_obj.db_deleted_connections.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'plugin_datas' in class_dict:
+            res = class_dict['plugin_datas'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_plugin_data(obj)
+        elif hasattr(old_obj, 'db_plugin_datas') and old_obj.db_plugin_datas is not None:
+            for obj in old_obj.db_plugin_datas:
+                new_obj.db_add_plugin_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_plugin_datas') and hasattr(new_obj, 'db_deleted_plugin_datas'):
+            for obj in old_obj.db_deleted_plugin_datas:
+                n_obj = DBPluginData.update_version(obj, trans_dict)
+                new_obj.db_deleted_plugin_datas.append(n_obj)
+        if 'others' in class_dict:
+            res = class_dict['others'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_other(obj)
+        elif hasattr(old_obj, 'db_others') and old_obj.db_others is not None:
+            for obj in old_obj.db_others:
+                new_obj.db_add_other(DBOther.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_others') and hasattr(new_obj, 'db_deleted_others'):
+            for obj in old_obj.db_deleted_others:
+                n_obj = DBOther.update_version(obj, trans_dict)
+                new_obj.db_deleted_others.append(n_obj)
+        if 'vistrail_id' in class_dict:
+            res = class_dict['vistrail_id'](old_obj, trans_dict)
+            new_obj.db_vistrail_id = res
+        elif hasattr(old_obj, 'db_vistrail_id') and old_obj.db_vistrail_id is not None:
+            new_obj.db_vistrail_id = old_obj.db_vistrail_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_connections:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_connection(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_plugin_datas:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_plugin_data(child)
+        to_del = []
+        for child in self.db_others:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_other(child)
+        to_del = []
+        for child in self.db_modules:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_connections)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_plugin_datas)
+        children.extend(self.db_deleted_others)
+        children.extend(self.db_deleted_modules)
+        if remove:
+            self.db_deleted_connections = []
+            self.db_deleted_annotations = []
+            self.db_deleted_plugin_datas = []
+            self.db_deleted_others = []
+            self.db_deleted_modules = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_connections:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_plugin_datas:
+            if child.has_changes():
+                return True
+        for child in self._db_others:
+            if child.has_changes():
+                return True
+        for child in self._db_modules:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_modules(self):
+        return self._db_modules
+    def __set_db_modules(self, modules):
+        self._db_modules = modules
+        self.is_dirty = True
+    db_modules = property(__get_db_modules, __set_db_modules)
+    def db_get_modules(self):
+        return self._db_modules
+    def db_add_module(self, module):
+        self.is_dirty = True
+        self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_change_module(self, module):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                self._db_modules[i] = module
+                found = True
+                break
+        if not found:
+            self._db_modules.append(module)
+        self.db_modules_id_index[module.db_id] = module
+    def db_delete_module(self, module):
+        self.is_dirty = True
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == module.db_id:
+                if not self._db_modules[i].is_new:
+                    self.db_deleted_modules.append(self._db_modules[i])
+                del self._db_modules[i]
+                break
+        del self.db_modules_id_index[module.db_id]
+    def db_get_module(self, key):
+        for i in xrange(len(self._db_modules)):
+            if self._db_modules[i].db_id == key:
+                return self._db_modules[i]
+        return None
+    def db_get_module_by_id(self, key):
+        return self.db_modules_id_index[key]
+    def db_has_module_with_id(self, key):
+        return key in self.db_modules_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_connections(self):
+        return self._db_connections
+    def __set_db_connections(self, connections):
+        self._db_connections = connections
+        self.is_dirty = True
+    db_connections = property(__get_db_connections, __set_db_connections)
+    def db_get_connections(self):
+        return self._db_connections
+    def db_add_connection(self, connection):
+        self.is_dirty = True
+        self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_change_connection(self, connection):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                self._db_connections[i] = connection
+                found = True
+                break
+        if not found:
+            self._db_connections.append(connection)
+        self.db_connections_id_index[connection.db_id] = connection
+    def db_delete_connection(self, connection):
+        self.is_dirty = True
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == connection.db_id:
+                if not self._db_connections[i].is_new:
+                    self.db_deleted_connections.append(self._db_connections[i])
+                del self._db_connections[i]
+                break
+        del self.db_connections_id_index[connection.db_id]
+    def db_get_connection(self, key):
+        for i in xrange(len(self._db_connections)):
+            if self._db_connections[i].db_id == key:
+                return self._db_connections[i]
+        return None
+    def db_get_connection_by_id(self, key):
+        return self.db_connections_id_index[key]
+    def db_has_connection_with_id(self, key):
+        return key in self.db_connections_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_plugin_datas(self):
+        return self._db_plugin_datas
+    def __set_db_plugin_datas(self, plugin_datas):
+        self._db_plugin_datas = plugin_datas
+        self.is_dirty = True
+    db_plugin_datas = property(__get_db_plugin_datas, __set_db_plugin_datas)
+    def db_get_plugin_datas(self):
+        return self._db_plugin_datas
+    def db_add_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_change_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                self._db_plugin_datas[i] = plugin_data
+                found = True
+                break
+        if not found:
+            self._db_plugin_datas.append(plugin_data)
+        self.db_plugin_datas_id_index[plugin_data.db_id] = plugin_data
+    def db_delete_plugin_data(self, plugin_data):
+        self.is_dirty = True
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == plugin_data.db_id:
+                if not self._db_plugin_datas[i].is_new:
+                    self.db_deleted_plugin_datas.append(self._db_plugin_datas[i])
+                del self._db_plugin_datas[i]
+                break
+        del self.db_plugin_datas_id_index[plugin_data.db_id]
+    def db_get_plugin_data(self, key):
+        for i in xrange(len(self._db_plugin_datas)):
+            if self._db_plugin_datas[i].db_id == key:
+                return self._db_plugin_datas[i]
+        return None
+    def db_get_plugin_data_by_id(self, key):
+        return self.db_plugin_datas_id_index[key]
+    def db_has_plugin_data_with_id(self, key):
+        return key in self.db_plugin_datas_id_index
+    
+    def __get_db_others(self):
+        return self._db_others
+    def __set_db_others(self, others):
+        self._db_others = others
+        self.is_dirty = True
+    db_others = property(__get_db_others, __set_db_others)
+    def db_get_others(self):
+        return self._db_others
+    def db_add_other(self, other):
+        self.is_dirty = True
+        self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_change_other(self, other):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                self._db_others[i] = other
+                found = True
+                break
+        if not found:
+            self._db_others.append(other)
+        self.db_others_id_index[other.db_id] = other
+    def db_delete_other(self, other):
+        self.is_dirty = True
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == other.db_id:
+                if not self._db_others[i].is_new:
+                    self.db_deleted_others.append(self._db_others[i])
+                del self._db_others[i]
+                break
+        del self.db_others_id_index[other.db_id]
+    def db_get_other(self, key):
+        for i in xrange(len(self._db_others)):
+            if self._db_others[i].db_id == key:
+                return self._db_others[i]
+        return None
+    def db_get_other_by_id(self, key):
+        return self.db_others_id_index[key]
+    def db_has_other_with_id(self, key):
+        return key in self.db_others_id_index
+    
+    def __get_db_vistrail_id(self):
+        return self._db_vistrail_id
+    def __set_db_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+        self.is_dirty = True
+    db_vistrail_id = property(__get_db_vistrail_id, __set_db_vistrail_id)
+    def db_add_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_change_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = vistrail_id
+    def db_delete_vistrail_id(self, vistrail_id):
+        self._db_vistrail_id = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmArtifactIdCause(object):
+
+    vtType = 'opm_artifact_id_cause'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdCause.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdCause(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdCause()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBRefProvEntity(object):
+
+    vtType = 'ref_prov_entity'
+
+    def __init__(self, prov_ref=None):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRefProvEntity.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRefProvEntity(prov_ref=self._db_prov_ref)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prov_ref') and ('prov_entity', self._db_prov_ref) in id_remap:
+                cp._db_prov_ref = id_remap[('prov_entity', self._db_prov_ref)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRefProvEntity()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_ref' in class_dict:
+            res = class_dict['prov_ref'](old_obj, trans_dict)
+            new_obj.db_prov_ref = res
+        elif hasattr(old_obj, 'db_prov_ref') and old_obj.db_prov_ref is not None:
+            new_obj.db_prov_ref = old_obj.db_prov_ref
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_prov_ref(self):
+        return self._db_prov_ref
+    def __set_db_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+    db_prov_ref = property(__get_db_prov_ref, __set_db_prov_ref)
+    def db_add_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_change_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_delete_prov_ref(self, prov_ref):
+        self._db_prov_ref = None
+    
+
+
+class DBProvActivity(object):
+
+    vtType = 'prov_activity'
+
+    def __init__(self, id=None, startTime=None, endTime=None, vt_id=None, vt_type=None, vt_cached=None, vt_completed=None, vt_machine_id=None, vt_error=None, is_part_of=None):
+        self._db_id = id
+        self._db_startTime = startTime
+        self._db_endTime = endTime
+        self._db_vt_id = vt_id
+        self._db_vt_type = vt_type
+        self._db_vt_cached = vt_cached
+        self._db_vt_completed = vt_completed
+        self._db_vt_machine_id = vt_machine_id
+        self._db_vt_error = vt_error
+        self.db_deleted_is_part_of = []
+        self._db_is_part_of = is_part_of
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvActivity.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvActivity(id=self._db_id,
+                            startTime=self._db_startTime,
+                            endTime=self._db_endTime,
+                            vt_id=self._db_vt_id,
+                            vt_type=self._db_vt_type,
+                            vt_cached=self._db_vt_cached,
+                            vt_completed=self._db_vt_completed,
+                            vt_machine_id=self._db_vt_machine_id,
+                            vt_error=self._db_vt_error)
+        if self._db_is_part_of is not None:
+            cp._db_is_part_of = self._db_is_part_of.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvActivity()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'startTime' in class_dict:
+            res = class_dict['startTime'](old_obj, trans_dict)
+            new_obj.db_startTime = res
+        elif hasattr(old_obj, 'db_startTime') and old_obj.db_startTime is not None:
+            new_obj.db_startTime = old_obj.db_startTime
+        if 'endTime' in class_dict:
+            res = class_dict['endTime'](old_obj, trans_dict)
+            new_obj.db_endTime = res
+        elif hasattr(old_obj, 'db_endTime') and old_obj.db_endTime is not None:
+            new_obj.db_endTime = old_obj.db_endTime
+        if 'vt_id' in class_dict:
+            res = class_dict['vt_id'](old_obj, trans_dict)
+            new_obj.db_vt_id = res
+        elif hasattr(old_obj, 'db_vt_id') and old_obj.db_vt_id is not None:
+            new_obj.db_vt_id = old_obj.db_vt_id
+        if 'vt_type' in class_dict:
+            res = class_dict['vt_type'](old_obj, trans_dict)
+            new_obj.db_vt_type = res
+        elif hasattr(old_obj, 'db_vt_type') and old_obj.db_vt_type is not None:
+            new_obj.db_vt_type = old_obj.db_vt_type
+        if 'vt_cached' in class_dict:
+            res = class_dict['vt_cached'](old_obj, trans_dict)
+            new_obj.db_vt_cached = res
+        elif hasattr(old_obj, 'db_vt_cached') and old_obj.db_vt_cached is not None:
+            new_obj.db_vt_cached = old_obj.db_vt_cached
+        if 'vt_completed' in class_dict:
+            res = class_dict['vt_completed'](old_obj, trans_dict)
+            new_obj.db_vt_completed = res
+        elif hasattr(old_obj, 'db_vt_completed') and old_obj.db_vt_completed is not None:
+            new_obj.db_vt_completed = old_obj.db_vt_completed
+        if 'vt_machine_id' in class_dict:
+            res = class_dict['vt_machine_id'](old_obj, trans_dict)
+            new_obj.db_vt_machine_id = res
+        elif hasattr(old_obj, 'db_vt_machine_id') and old_obj.db_vt_machine_id is not None:
+            new_obj.db_vt_machine_id = old_obj.db_vt_machine_id
+        if 'vt_error' in class_dict:
+            res = class_dict['vt_error'](old_obj, trans_dict)
+            new_obj.db_vt_error = res
+        elif hasattr(old_obj, 'db_vt_error') and old_obj.db_vt_error is not None:
+            new_obj.db_vt_error = old_obj.db_vt_error
+        if 'is_part_of' in class_dict:
+            res = class_dict['is_part_of'](old_obj, trans_dict)
+            new_obj.db_is_part_of = res
+        elif hasattr(old_obj, 'db_is_part_of') and old_obj.db_is_part_of is not None:
+            obj = old_obj.db_is_part_of
+            new_obj.db_add_is_part_of(DBIsPartOf.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_is_part_of') and hasattr(new_obj, 'db_deleted_is_part_of'):
+            for obj in old_obj.db_deleted_is_part_of:
+                n_obj = DBIsPartOf.update_version(obj, trans_dict)
+                new_obj.db_deleted_is_part_of.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_is_part_of is not None:
+            children.extend(self._db_is_part_of.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_is_part_of = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_is_part_of)
+        if remove:
+            self.db_deleted_is_part_of = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_is_part_of is not None and self._db_is_part_of.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_startTime(self):
+        return self._db_startTime
+    def __set_db_startTime(self, startTime):
+        self._db_startTime = startTime
+        self.is_dirty = True
+    db_startTime = property(__get_db_startTime, __set_db_startTime)
+    def db_add_startTime(self, startTime):
+        self._db_startTime = startTime
+    def db_change_startTime(self, startTime):
+        self._db_startTime = startTime
+    def db_delete_startTime(self, startTime):
+        self._db_startTime = None
+    
+    def __get_db_endTime(self):
+        return self._db_endTime
+    def __set_db_endTime(self, endTime):
+        self._db_endTime = endTime
+        self.is_dirty = True
+    db_endTime = property(__get_db_endTime, __set_db_endTime)
+    def db_add_endTime(self, endTime):
+        self._db_endTime = endTime
+    def db_change_endTime(self, endTime):
+        self._db_endTime = endTime
+    def db_delete_endTime(self, endTime):
+        self._db_endTime = None
+    
+    def __get_db_vt_id(self):
+        return self._db_vt_id
+    def __set_db_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+        self.is_dirty = True
+    db_vt_id = property(__get_db_vt_id, __set_db_vt_id)
+    def db_add_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+    def db_change_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+    def db_delete_vt_id(self, vt_id):
+        self._db_vt_id = None
+    
+    def __get_db_vt_type(self):
+        return self._db_vt_type
+    def __set_db_vt_type(self, vt_type):
+        self._db_vt_type = vt_type
+        self.is_dirty = True
+    db_vt_type = property(__get_db_vt_type, __set_db_vt_type)
+    def db_add_vt_type(self, vt_type):
+        self._db_vt_type = vt_type
+    def db_change_vt_type(self, vt_type):
+        self._db_vt_type = vt_type
+    def db_delete_vt_type(self, vt_type):
+        self._db_vt_type = None
+    
+    def __get_db_vt_cached(self):
+        return self._db_vt_cached
+    def __set_db_vt_cached(self, vt_cached):
+        self._db_vt_cached = vt_cached
+        self.is_dirty = True
+    db_vt_cached = property(__get_db_vt_cached, __set_db_vt_cached)
+    def db_add_vt_cached(self, vt_cached):
+        self._db_vt_cached = vt_cached
+    def db_change_vt_cached(self, vt_cached):
+        self._db_vt_cached = vt_cached
+    def db_delete_vt_cached(self, vt_cached):
+        self._db_vt_cached = None
+    
+    def __get_db_vt_completed(self):
+        return self._db_vt_completed
+    def __set_db_vt_completed(self, vt_completed):
+        self._db_vt_completed = vt_completed
+        self.is_dirty = True
+    db_vt_completed = property(__get_db_vt_completed, __set_db_vt_completed)
+    def db_add_vt_completed(self, vt_completed):
+        self._db_vt_completed = vt_completed
+    def db_change_vt_completed(self, vt_completed):
+        self._db_vt_completed = vt_completed
+    def db_delete_vt_completed(self, vt_completed):
+        self._db_vt_completed = None
+    
+    def __get_db_vt_machine_id(self):
+        return self._db_vt_machine_id
+    def __set_db_vt_machine_id(self, vt_machine_id):
+        self._db_vt_machine_id = vt_machine_id
+        self.is_dirty = True
+    db_vt_machine_id = property(__get_db_vt_machine_id, __set_db_vt_machine_id)
+    def db_add_vt_machine_id(self, vt_machine_id):
+        self._db_vt_machine_id = vt_machine_id
+    def db_change_vt_machine_id(self, vt_machine_id):
+        self._db_vt_machine_id = vt_machine_id
+    def db_delete_vt_machine_id(self, vt_machine_id):
+        self._db_vt_machine_id = None
+    
+    def __get_db_vt_error(self):
+        return self._db_vt_error
+    def __set_db_vt_error(self, vt_error):
+        self._db_vt_error = vt_error
+        self.is_dirty = True
+    db_vt_error = property(__get_db_vt_error, __set_db_vt_error)
+    def db_add_vt_error(self, vt_error):
+        self._db_vt_error = vt_error
+    def db_change_vt_error(self, vt_error):
+        self._db_vt_error = vt_error
+    def db_delete_vt_error(self, vt_error):
+        self._db_vt_error = None
+    
+    def __get_db_is_part_of(self):
+        return self._db_is_part_of
+    def __set_db_is_part_of(self, is_part_of):
+        self._db_is_part_of = is_part_of
+        self.is_dirty = True
+    db_is_part_of = property(__get_db_is_part_of, __set_db_is_part_of)
+    def db_add_is_part_of(self, is_part_of):
+        self._db_is_part_of = is_part_of
+    def db_change_is_part_of(self, is_part_of):
+        self._db_is_part_of = is_part_of
+    def db_delete_is_part_of(self, is_part_of):
+        if not self.is_new:
+            self.db_deleted_is_part_of.append(self._db_is_part_of)
+        self._db_is_part_of = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMashupAction(object):
+
+    vtType = 'mashup_action'
+
+    def __init__(self, id=None, prevId=None, date=None, user=None, mashup=None):
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_user = user
+        self.db_deleted_mashup = []
+        self._db_mashup = mashup
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMashupAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupAction(id=self._db_id,
+                            prevId=self._db_prevId,
+                            date=self._db_date,
+                            user=self._db_user)
+        if self._db_mashup is not None:
+            cp._db_mashup = self._db_mashup.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('mashup_action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('mashup_action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMashupAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'mashup' in class_dict:
+            res = class_dict['mashup'](old_obj, trans_dict)
+            new_obj.db_mashup = res
+        elif hasattr(old_obj, 'db_mashup') and old_obj.db_mashup is not None:
+            obj = old_obj.db_mashup
+            new_obj.db_add_mashup(DBMashup.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_mashup') and hasattr(new_obj, 'db_deleted_mashup'):
+            for obj in old_obj.db_deleted_mashup:
+                n_obj = DBMashup.update_version(obj, trans_dict)
+                new_obj.db_deleted_mashup.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_mashup is not None:
+            children.extend(self._db_mashup.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_mashup = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_mashup)
+        if remove:
+            self.db_deleted_mashup = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_mashup is not None and self._db_mashup.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_mashup(self):
+        return self._db_mashup
+    def __set_db_mashup(self, mashup):
+        self._db_mashup = mashup
+        self.is_dirty = True
+    db_mashup = property(__get_db_mashup, __set_db_mashup)
+    def db_add_mashup(self, mashup):
+        self._db_mashup = mashup
+    def db_change_mashup(self, mashup):
+        self._db_mashup = mashup
+    def db_delete_mashup(self, mashup):
+        if not self.is_new:
+            self.db_deleted_mashup.append(self._db_mashup)
+        self._db_mashup = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBProvUsage(object):
+
+    vtType = 'prov_usage'
+
+    def __init__(self, prov_activity=None, prov_entity=None, prov_role=None):
+        self.db_deleted_prov_activity = []
+        self._db_prov_activity = prov_activity
+        self.db_deleted_prov_entity = []
+        self._db_prov_entity = prov_entity
+        self._db_prov_role = prov_role
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvUsage.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvUsage(prov_role=self._db_prov_role)
+        if self._db_prov_activity is not None:
+            cp._db_prov_activity = self._db_prov_activity.do_copy(new_ids, id_scope, id_remap)
+        if self._db_prov_entity is not None:
+            cp._db_prov_entity = self._db_prov_entity.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvUsage()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_activity' in class_dict:
+            res = class_dict['prov_activity'](old_obj, trans_dict)
+            new_obj.db_prov_activity = res
+        elif hasattr(old_obj, 'db_prov_activity') and old_obj.db_prov_activity is not None:
+            obj = old_obj.db_prov_activity
+            new_obj.db_add_prov_activity(DBRefProvActivity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_activity') and hasattr(new_obj, 'db_deleted_prov_activity'):
+            for obj in old_obj.db_deleted_prov_activity:
+                n_obj = DBRefProvActivity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_activity.append(n_obj)
+        if 'prov_entity' in class_dict:
+            res = class_dict['prov_entity'](old_obj, trans_dict)
+            new_obj.db_prov_entity = res
+        elif hasattr(old_obj, 'db_prov_entity') and old_obj.db_prov_entity is not None:
+            obj = old_obj.db_prov_entity
+            new_obj.db_add_prov_entity(DBRefProvEntity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_entity') and hasattr(new_obj, 'db_deleted_prov_entity'):
+            for obj in old_obj.db_deleted_prov_entity:
+                n_obj = DBRefProvEntity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_entity.append(n_obj)
+        if 'prov_role' in class_dict:
+            res = class_dict['prov_role'](old_obj, trans_dict)
+            new_obj.db_prov_role = res
+        elif hasattr(old_obj, 'db_prov_role') and old_obj.db_prov_role is not None:
+            new_obj.db_prov_role = old_obj.db_prov_role
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_prov_activity is not None:
+            children.extend(self._db_prov_activity.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_activity = None
+        if self._db_prov_entity is not None:
+            children.extend(self._db_prov_entity.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_entity = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_prov_activity)
+        children.extend(self.db_deleted_prov_entity)
+        if remove:
+            self.db_deleted_prov_activity = []
+            self.db_deleted_prov_entity = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_prov_activity is not None and self._db_prov_activity.has_changes():
+            return True
+        if self._db_prov_entity is not None and self._db_prov_entity.has_changes():
+            return True
+        return False
+    def __get_db_prov_activity(self):
+        return self._db_prov_activity
+    def __set_db_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+        self.is_dirty = True
+    db_prov_activity = property(__get_db_prov_activity, __set_db_prov_activity)
+    def db_add_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+    def db_change_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+    def db_delete_prov_activity(self, prov_activity):
+        if not self.is_new:
+            self.db_deleted_prov_activity.append(self._db_prov_activity)
+        self._db_prov_activity = None
+    
+    def __get_db_prov_entity(self):
+        return self._db_prov_entity
+    def __set_db_prov_entity(self, prov_entity):
+        self._db_prov_entity = prov_entity
+        self.is_dirty = True
+    db_prov_entity = property(__get_db_prov_entity, __set_db_prov_entity)
+    def db_add_prov_entity(self, prov_entity):
+        self._db_prov_entity = prov_entity
+    def db_change_prov_entity(self, prov_entity):
+        self._db_prov_entity = prov_entity
+    def db_delete_prov_entity(self, prov_entity):
+        if not self.is_new:
+            self.db_deleted_prov_entity.append(self._db_prov_entity)
+        self._db_prov_entity = None
+    
+    def __get_db_prov_role(self):
+        return self._db_prov_role
+    def __set_db_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+        self.is_dirty = True
+    db_prov_role = property(__get_db_prov_role, __set_db_prov_role)
+    def db_add_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+    def db_change_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+    def db_delete_prov_role(self, prov_role):
+        self._db_prov_role = None
+    
+
+
+class DBOpmArtifactValue(object):
+
+    vtType = 'opm_artifact_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'portSpec':
+                new_obj.db_add_value(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_value(DBFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBOpmArtifactIdEffect(object):
+
+    vtType = 'opm_artifact_id_effect'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifactIdEffect.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifactIdEffect(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_artifact', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_artifact', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifactIdEffect()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBOpmGraph(object):
+
+    vtType = 'opm_graph'
+
+    def __init__(self, accounts=None, processes=None, artifacts=None, agents=None, dependencies=None):
+        self.db_deleted_accounts = []
+        self._db_accounts = accounts
+        self.db_deleted_processes = []
+        self._db_processes = processes
+        self.db_deleted_artifacts = []
+        self._db_artifacts = artifacts
+        self.db_deleted_agents = []
+        self._db_agents = agents
+        self.db_deleted_dependencies = []
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmGraph.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmGraph()
+        if self._db_accounts is not None:
+            cp._db_accounts = self._db_accounts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_processes is not None:
+            cp._db_processes = self._db_processes.do_copy(new_ids, id_scope, id_remap)
+        if self._db_artifacts is not None:
+            cp._db_artifacts = self._db_artifacts.do_copy(new_ids, id_scope, id_remap)
+        if self._db_agents is not None:
+            cp._db_agents = self._db_agents.do_copy(new_ids, id_scope, id_remap)
+        if self._db_dependencies is not None:
+            cp._db_dependencies = self._db_dependencies.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmGraph()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            new_obj.db_accounts = res
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            obj = old_obj.db_accounts
+            new_obj.db_add_accounts(DBOpmAccounts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccounts.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'processes' in class_dict:
+            res = class_dict['processes'](old_obj, trans_dict)
+            new_obj.db_processes = res
+        elif hasattr(old_obj, 'db_processes') and old_obj.db_processes is not None:
+            obj = old_obj.db_processes
+            new_obj.db_add_processes(DBOpmProcesses.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_processes') and hasattr(new_obj, 'db_deleted_processes'):
+            for obj in old_obj.db_deleted_processes:
+                n_obj = DBOpmProcesses.update_version(obj, trans_dict)
+                new_obj.db_deleted_processes.append(n_obj)
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            new_obj.db_artifacts = res
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            obj = old_obj.db_artifacts
+            new_obj.db_add_artifacts(DBOpmArtifacts.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifacts.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        if 'agents' in class_dict:
+            res = class_dict['agents'](old_obj, trans_dict)
+            new_obj.db_agents = res
+        elif hasattr(old_obj, 'db_agents') and old_obj.db_agents is not None:
+            obj = old_obj.db_agents
+            new_obj.db_add_agents(DBOpmAgents.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_agents') and hasattr(new_obj, 'db_deleted_agents'):
+            for obj in old_obj.db_deleted_agents:
+                n_obj = DBOpmAgents.update_version(obj, trans_dict)
+                new_obj.db_deleted_agents.append(n_obj)
+        if 'dependencies' in class_dict:
+            res = class_dict['dependencies'](old_obj, trans_dict)
+            new_obj.db_dependencies = res
+        elif hasattr(old_obj, 'db_dependencies') and old_obj.db_dependencies is not None:
+            obj = old_obj.db_dependencies
+            new_obj.db_add_dependencies(DBOpmDependencies.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_dependencies') and hasattr(new_obj, 'db_deleted_dependencies'):
+            for obj in old_obj.db_deleted_dependencies:
+                n_obj = DBOpmDependencies.update_version(obj, trans_dict)
+                new_obj.db_deleted_dependencies.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_accounts is not None:
+            children.extend(self._db_accounts.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_accounts = None
+        if self._db_processes is not None:
+            children.extend(self._db_processes.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_processes = None
+        if self._db_artifacts is not None:
+            children.extend(self._db_artifacts.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_artifacts = None
+        if self._db_agents is not None:
+            children.extend(self._db_agents.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_agents = None
+        if self._db_dependencies is not None:
+            children.extend(self._db_dependencies.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_dependencies = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_processes)
+        children.extend(self.db_deleted_artifacts)
+        children.extend(self.db_deleted_agents)
+        children.extend(self.db_deleted_dependencies)
+        if remove:
+            self.db_deleted_accounts = []
+            self.db_deleted_processes = []
+            self.db_deleted_artifacts = []
+            self.db_deleted_agents = []
+            self.db_deleted_dependencies = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_accounts is not None and self._db_accounts.has_changes():
+            return True
+        if self._db_processes is not None and self._db_processes.has_changes():
+            return True
+        if self._db_artifacts is not None and self._db_artifacts.has_changes():
+            return True
+        if self._db_agents is not None and self._db_agents.has_changes():
+            return True
+        if self._db_dependencies is not None and self._db_dependencies.has_changes():
+            return True
+        return False
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_add_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_change_accounts(self, accounts):
+        self._db_accounts = accounts
+    def db_delete_accounts(self, accounts):
+        if not self.is_new:
+            self.db_deleted_accounts.append(self._db_accounts)
+        self._db_accounts = None
+    
+    def __get_db_processes(self):
+        return self._db_processes
+    def __set_db_processes(self, processes):
+        self._db_processes = processes
+        self.is_dirty = True
+    db_processes = property(__get_db_processes, __set_db_processes)
+    def db_add_processes(self, processes):
+        self._db_processes = processes
+    def db_change_processes(self, processes):
+        self._db_processes = processes
+    def db_delete_processes(self, processes):
+        if not self.is_new:
+            self.db_deleted_processes.append(self._db_processes)
+        self._db_processes = None
+    
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_add_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_change_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+    def db_delete_artifacts(self, artifacts):
+        if not self.is_new:
+            self.db_deleted_artifacts.append(self._db_artifacts)
+        self._db_artifacts = None
+    
+    def __get_db_agents(self):
+        return self._db_agents
+    def __set_db_agents(self, agents):
+        self._db_agents = agents
+        self.is_dirty = True
+    db_agents = property(__get_db_agents, __set_db_agents)
+    def db_add_agents(self, agents):
+        self._db_agents = agents
+    def db_change_agents(self, agents):
+        self._db_agents = agents
+    def db_delete_agents(self, agents):
+        if not self.is_new:
+            self.db_deleted_agents.append(self._db_agents)
+        self._db_agents = None
+    
+    def __get_db_dependencies(self):
+        return self._db_dependencies
+    def __set_db_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+        self.is_dirty = True
+    db_dependencies = property(__get_db_dependencies, __set_db_dependencies)
+    def db_add_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_change_dependencies(self, dependencies):
+        self._db_dependencies = dependencies
+    def db_delete_dependencies(self, dependencies):
+        if not self.is_new:
+            self.db_deleted_dependencies.append(self._db_dependencies)
+        self._db_dependencies = None
+    
+
+
+class DBMashuptrail(object):
+
+    vtType = 'mashuptrail'
+
+    def __init__(self, id=None, name=None, version=None, vtVersion=None, last_modified=None, actions=None, annotations=None, actionAnnotations=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_version = version
+        self._db_vtVersion = vtVersion
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_actionAnnotations = []
+        self.db_actionAnnotations_id_index = {}
+        self.db_actionAnnotations_action_id_index = {}
+        self.db_actionAnnotations_key_index = {}
+        if actionAnnotations is None:
+            self._db_actionAnnotations = []
+        else:
+            self._db_actionAnnotations = actionAnnotations
+            for v in self._db_actionAnnotations:
+                self.db_actionAnnotations_id_index[v.db_id] = v
+                self.db_actionAnnotations_action_id_index[(v.db_action_id,v.db_key)] = v
+                self.db_actionAnnotations_key_index[(v.db_key,v.db_value)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMashuptrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashuptrail(id=self._db_id,
+                           name=self._db_name,
+                           version=self._db_version,
+                           vtVersion=self._db_vtVersion,
+                           last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_actionAnnotations is None:
+            cp._db_actionAnnotations = []
+        else:
+            cp._db_actionAnnotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actionAnnotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_actionAnnotations_id_index = dict((v.db_id, v) for v in cp._db_actionAnnotations)
+        cp.db_actionAnnotations_action_id_index = dict(((v.db_action_id,v.db_key), v) for v in cp._db_actionAnnotations)
+        cp.db_actionAnnotations_key_index = dict(((v.db_key,v.db_value), v) for v in cp._db_actionAnnotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMashuptrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'vtVersion' in class_dict:
+            res = class_dict['vtVersion'](old_obj, trans_dict)
+            new_obj.db_vtVersion = res
+        elif hasattr(old_obj, 'db_vtVersion') and old_obj.db_vtVersion is not None:
+            new_obj.db_vtVersion = old_obj.db_vtVersion
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBMashupAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBMashupAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'actionAnnotations' in class_dict:
+            res = class_dict['actionAnnotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_actionAnnotation(obj)
+        elif hasattr(old_obj, 'db_actionAnnotations') and old_obj.db_actionAnnotations is not None:
+            for obj in old_obj.db_actionAnnotations:
+                new_obj.db_add_actionAnnotation(DBMashupActionAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actionAnnotations') and hasattr(new_obj, 'db_deleted_actionAnnotations'):
+            for obj in old_obj.db_deleted_actionAnnotations:
+                n_obj = DBMashupActionAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_actionAnnotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_actionAnnotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_actionAnnotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_actionAnnotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_annotations = []
+            self.db_deleted_actionAnnotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_actionAnnotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_vtVersion(self):
+        return self._db_vtVersion
+    def __set_db_vtVersion(self, vtVersion):
+        self._db_vtVersion = vtVersion
+        self.is_dirty = True
+    db_vtVersion = property(__get_db_vtVersion, __set_db_vtVersion)
+    def db_add_vtVersion(self, vtVersion):
+        self._db_vtVersion = vtVersion
+    def db_change_vtVersion(self, vtVersion):
+        self._db_vtVersion = vtVersion
+    def db_delete_vtVersion(self, vtVersion):
+        self._db_vtVersion = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_actionAnnotations(self):
+        return self._db_actionAnnotations
+    def __set_db_actionAnnotations(self, actionAnnotations):
+        self._db_actionAnnotations = actionAnnotations
+        self.is_dirty = True
+    db_actionAnnotations = property(__get_db_actionAnnotations, __set_db_actionAnnotations)
+    def db_get_actionAnnotations(self):
+        return self._db_actionAnnotations
+    def db_add_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        self._db_actionAnnotations.append(actionAnnotation)
+        self.db_actionAnnotations_id_index[actionAnnotation.db_id] = actionAnnotation
+        self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)] = actionAnnotation
+        self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)] = actionAnnotation
+    def db_change_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == actionAnnotation.db_id:
+                self._db_actionAnnotations[i] = actionAnnotation
+                found = True
+                break
+        if not found:
+            self._db_actionAnnotations.append(actionAnnotation)
+        self.db_actionAnnotations_id_index[actionAnnotation.db_id] = actionAnnotation
+        self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)] = actionAnnotation
+        self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)] = actionAnnotation
+    def db_delete_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == actionAnnotation.db_id:
+                if not self._db_actionAnnotations[i].is_new:
+                    self.db_deleted_actionAnnotations.append(self._db_actionAnnotations[i])
+                del self._db_actionAnnotations[i]
+                break
+        del self.db_actionAnnotations_id_index[actionAnnotation.db_id]
+        del self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)]
+        try:
+            del self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)]
+        except KeyError:
+            pass
+    def db_get_actionAnnotation(self, key):
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == key:
+                return self._db_actionAnnotations[i]
+        return None
+    def db_get_actionAnnotation_by_id(self, key):
+        return self.db_actionAnnotations_id_index[key]
+    def db_has_actionAnnotation_with_id(self, key):
+        return key in self.db_actionAnnotations_id_index
+    def db_get_actionAnnotation_by_action_id(self, key):
+        return self.db_actionAnnotations_action_id_index[key]
+    def db_has_actionAnnotation_with_action_id(self, key):
+        return key in self.db_actionAnnotations_action_id_index
+    def db_get_actionAnnotation_by_key(self, key):
+        return self.db_actionAnnotations_key_index[key]
+    def db_has_actionAnnotation_with_key(self, key):
+        return key in self.db_actionAnnotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBRegistry(object):
+
+    vtType = 'registry'
+
+    def __init__(self, id=None, entity_type=None, version=None, root_descriptor_id=None, name=None, last_modified=None, packages=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_root_descriptor_id = root_descriptor_id
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_packages = []
+        self.db_packages_id_index = {}
+        self.db_packages_identifier_index = {}
+        if packages is None:
+            self._db_packages = []
+        else:
+            self._db_packages = packages
+            for v in self._db_packages:
+                self.db_packages_id_index[v.db_id] = v
+                self.db_packages_identifier_index[(v.db_identifier,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBRegistry.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBRegistry(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        root_descriptor_id=self._db_root_descriptor_id,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_packages is None:
+            cp._db_packages = []
+        else:
+            cp._db_packages = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_packages]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_root_descriptor_id') and ('module_descriptor', self._db_root_descriptor_id) in id_remap:
+                cp._db_root_descriptor_id = id_remap[('module_descriptor', self._db_root_descriptor_id)]
+        
+        # recreate indices and set flags
+        cp.db_packages_id_index = dict((v.db_id, v) for v in cp._db_packages)
+        cp.db_packages_identifier_index = dict(((v.db_identifier,v.db_version), v) for v in cp._db_packages)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'root_descriptor_id' in class_dict:
+            res = class_dict['root_descriptor_id'](old_obj, trans_dict)
+            new_obj.db_root_descriptor_id = res
+        elif hasattr(old_obj, 'db_root_descriptor_id') and old_obj.db_root_descriptor_id is not None:
+            new_obj.db_root_descriptor_id = old_obj.db_root_descriptor_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'packages' in class_dict:
+            res = class_dict['packages'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_package(obj)
+        elif hasattr(old_obj, 'db_packages') and old_obj.db_packages is not None:
+            for obj in old_obj.db_packages:
+                new_obj.db_add_package(DBPackage.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_packages') and hasattr(new_obj, 'db_deleted_packages'):
+            for obj in old_obj.db_deleted_packages:
+                n_obj = DBPackage.update_version(obj, trans_dict)
+                new_obj.db_deleted_packages.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_packages:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_package(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_packages)
+        if remove:
+            self.db_deleted_packages = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_packages:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_root_descriptor_id(self):
+        return self._db_root_descriptor_id
+    def __set_db_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+        self.is_dirty = True
+    db_root_descriptor_id = property(__get_db_root_descriptor_id, __set_db_root_descriptor_id)
+    def db_add_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_change_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = root_descriptor_id
+    def db_delete_root_descriptor_id(self, root_descriptor_id):
+        self._db_root_descriptor_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_packages(self):
+        return self._db_packages
+    def __set_db_packages(self, packages):
+        self._db_packages = packages
+        self.is_dirty = True
+    db_packages = property(__get_db_packages, __set_db_packages)
+    def db_get_packages(self):
+        return self._db_packages
+    def db_add_package(self, package):
+        self.is_dirty = True
+        self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_change_package(self, package):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                self._db_packages[i] = package
+                found = True
+                break
+        if not found:
+            self._db_packages.append(package)
+        self.db_packages_id_index[package.db_id] = package
+        self.db_packages_identifier_index[(package.db_identifier,package.db_version)] = package
+    def db_delete_package(self, package):
+        self.is_dirty = True
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == package.db_id:
+                if not self._db_packages[i].is_new:
+                    self.db_deleted_packages.append(self._db_packages[i])
+                del self._db_packages[i]
+                break
+        del self.db_packages_id_index[package.db_id]
+        del self.db_packages_identifier_index[(package.db_identifier,package.db_version)]
+    def db_get_package(self, key):
+        for i in xrange(len(self._db_packages)):
+            if self._db_packages[i].db_id == key:
+                return self._db_packages[i]
+        return None
+    def db_get_package_by_id(self, key):
+        return self.db_packages_id_index[key]
+    def db_has_package_with_id(self, key):
+        return key in self.db_packages_id_index
+    def db_get_package_by_identifier(self, key):
+        return self.db_packages_identifier_index[key]
+    def db_has_package_with_identifier(self, key):
+        return key in self.db_packages_identifier_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBVtConnection(object):
+
+    vtType = 'vt_connection'
+
+    def __init__(self, id=None, vt_source=None, vt_dest=None, vt_source_port=None, vt_dest_port=None, vt_source_signature=None, vt_dest_signature=None):
+        self._db_id = id
+        self._db_vt_source = vt_source
+        self._db_vt_dest = vt_dest
+        self._db_vt_source_port = vt_source_port
+        self._db_vt_dest_port = vt_dest_port
+        self._db_vt_source_signature = vt_source_signature
+        self._db_vt_dest_signature = vt_dest_signature
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVtConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVtConnection(id=self._db_id,
+                            vt_source=self._db_vt_source,
+                            vt_dest=self._db_vt_dest,
+                            vt_source_port=self._db_vt_source_port,
+                            vt_dest_port=self._db_vt_dest_port,
+                            vt_source_signature=self._db_vt_source_signature,
+                            vt_dest_signature=self._db_vt_dest_signature)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVtConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'vt_source' in class_dict:
+            res = class_dict['vt_source'](old_obj, trans_dict)
+            new_obj.db_vt_source = res
+        elif hasattr(old_obj, 'db_vt_source') and old_obj.db_vt_source is not None:
+            new_obj.db_vt_source = old_obj.db_vt_source
+        if 'vt_dest' in class_dict:
+            res = class_dict['vt_dest'](old_obj, trans_dict)
+            new_obj.db_vt_dest = res
+        elif hasattr(old_obj, 'db_vt_dest') and old_obj.db_vt_dest is not None:
+            new_obj.db_vt_dest = old_obj.db_vt_dest
+        if 'vt_source_port' in class_dict:
+            res = class_dict['vt_source_port'](old_obj, trans_dict)
+            new_obj.db_vt_source_port = res
+        elif hasattr(old_obj, 'db_vt_source_port') and old_obj.db_vt_source_port is not None:
+            new_obj.db_vt_source_port = old_obj.db_vt_source_port
+        if 'vt_dest_port' in class_dict:
+            res = class_dict['vt_dest_port'](old_obj, trans_dict)
+            new_obj.db_vt_dest_port = res
+        elif hasattr(old_obj, 'db_vt_dest_port') and old_obj.db_vt_dest_port is not None:
+            new_obj.db_vt_dest_port = old_obj.db_vt_dest_port
+        if 'vt_source_signature' in class_dict:
+            res = class_dict['vt_source_signature'](old_obj, trans_dict)
+            new_obj.db_vt_source_signature = res
+        elif hasattr(old_obj, 'db_vt_source_signature') and old_obj.db_vt_source_signature is not None:
+            new_obj.db_vt_source_signature = old_obj.db_vt_source_signature
+        if 'vt_dest_signature' in class_dict:
+            res = class_dict['vt_dest_signature'](old_obj, trans_dict)
+            new_obj.db_vt_dest_signature = res
+        elif hasattr(old_obj, 'db_vt_dest_signature') and old_obj.db_vt_dest_signature is not None:
+            new_obj.db_vt_dest_signature = old_obj.db_vt_dest_signature
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_vt_source(self):
+        return self._db_vt_source
+    def __set_db_vt_source(self, vt_source):
+        self._db_vt_source = vt_source
+        self.is_dirty = True
+    db_vt_source = property(__get_db_vt_source, __set_db_vt_source)
+    def db_add_vt_source(self, vt_source):
+        self._db_vt_source = vt_source
+    def db_change_vt_source(self, vt_source):
+        self._db_vt_source = vt_source
+    def db_delete_vt_source(self, vt_source):
+        self._db_vt_source = None
+    
+    def __get_db_vt_dest(self):
+        return self._db_vt_dest
+    def __set_db_vt_dest(self, vt_dest):
+        self._db_vt_dest = vt_dest
+        self.is_dirty = True
+    db_vt_dest = property(__get_db_vt_dest, __set_db_vt_dest)
+    def db_add_vt_dest(self, vt_dest):
+        self._db_vt_dest = vt_dest
+    def db_change_vt_dest(self, vt_dest):
+        self._db_vt_dest = vt_dest
+    def db_delete_vt_dest(self, vt_dest):
+        self._db_vt_dest = None
+    
+    def __get_db_vt_source_port(self):
+        return self._db_vt_source_port
+    def __set_db_vt_source_port(self, vt_source_port):
+        self._db_vt_source_port = vt_source_port
+        self.is_dirty = True
+    db_vt_source_port = property(__get_db_vt_source_port, __set_db_vt_source_port)
+    def db_add_vt_source_port(self, vt_source_port):
+        self._db_vt_source_port = vt_source_port
+    def db_change_vt_source_port(self, vt_source_port):
+        self._db_vt_source_port = vt_source_port
+    def db_delete_vt_source_port(self, vt_source_port):
+        self._db_vt_source_port = None
+    
+    def __get_db_vt_dest_port(self):
+        return self._db_vt_dest_port
+    def __set_db_vt_dest_port(self, vt_dest_port):
+        self._db_vt_dest_port = vt_dest_port
+        self.is_dirty = True
+    db_vt_dest_port = property(__get_db_vt_dest_port, __set_db_vt_dest_port)
+    def db_add_vt_dest_port(self, vt_dest_port):
+        self._db_vt_dest_port = vt_dest_port
+    def db_change_vt_dest_port(self, vt_dest_port):
+        self._db_vt_dest_port = vt_dest_port
+    def db_delete_vt_dest_port(self, vt_dest_port):
+        self._db_vt_dest_port = None
+    
+    def __get_db_vt_source_signature(self):
+        return self._db_vt_source_signature
+    def __set_db_vt_source_signature(self, vt_source_signature):
+        self._db_vt_source_signature = vt_source_signature
+        self.is_dirty = True
+    db_vt_source_signature = property(__get_db_vt_source_signature, __set_db_vt_source_signature)
+    def db_add_vt_source_signature(self, vt_source_signature):
+        self._db_vt_source_signature = vt_source_signature
+    def db_change_vt_source_signature(self, vt_source_signature):
+        self._db_vt_source_signature = vt_source_signature
+    def db_delete_vt_source_signature(self, vt_source_signature):
+        self._db_vt_source_signature = None
+    
+    def __get_db_vt_dest_signature(self):
+        return self._db_vt_dest_signature
+    def __set_db_vt_dest_signature(self, vt_dest_signature):
+        self._db_vt_dest_signature = vt_dest_signature
+        self.is_dirty = True
+    db_vt_dest_signature = property(__get_db_vt_dest_signature, __set_db_vt_dest_signature)
+    def db_add_vt_dest_signature(self, vt_dest_signature):
+        self._db_vt_dest_signature = vt_dest_signature
+    def db_change_vt_dest_signature(self, vt_dest_signature):
+        self._db_vt_dest_signature = vt_dest_signature
+    def db_delete_vt_dest_signature(self, vt_dest_signature):
+        self._db_vt_dest_signature = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBMashupComponent(object):
+
+    vtType = 'mashup_component'
+
+    def __init__(self, id=None, vtid=None, vttype=None, vtparent_type=None, vtparent_id=None, vtpos=None, vtmid=None, pos=None, type=None, val=None, minVal=None, maxVal=None, stepSize=None, strvaluelist=None, widget=None, seq=None, parent=None):
+        self._db_id = id
+        self._db_vtid = vtid
+        self._db_vttype = vttype
+        self._db_vtparent_type = vtparent_type
+        self._db_vtparent_id = vtparent_id
+        self._db_vtpos = vtpos
+        self._db_vtmid = vtmid
+        self._db_pos = pos
+        self._db_type = type
+        self._db_val = val
+        self._db_minVal = minVal
+        self._db_maxVal = maxVal
+        self._db_stepSize = stepSize
+        self._db_strvaluelist = strvaluelist
+        self._db_widget = widget
+        self._db_seq = seq
+        self._db_parent = parent
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMashupComponent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupComponent(id=self._db_id,
+                               vtid=self._db_vtid,
+                               vttype=self._db_vttype,
+                               vtparent_type=self._db_vtparent_type,
+                               vtparent_id=self._db_vtparent_id,
+                               vtpos=self._db_vtpos,
+                               vtmid=self._db_vtmid,
+                               pos=self._db_pos,
+                               type=self._db_type,
+                               val=self._db_val,
+                               minVal=self._db_minVal,
+                               maxVal=self._db_maxVal,
+                               stepSize=self._db_stepSize,
+                               strvaluelist=self._db_strvaluelist,
+                               widget=self._db_widget,
+                               seq=self._db_seq,
+                               parent=self._db_parent)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMashupComponent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'vtid' in class_dict:
+            res = class_dict['vtid'](old_obj, trans_dict)
+            new_obj.db_vtid = res
+        elif hasattr(old_obj, 'db_vtid') and old_obj.db_vtid is not None:
+            new_obj.db_vtid = old_obj.db_vtid
+        if 'vttype' in class_dict:
+            res = class_dict['vttype'](old_obj, trans_dict)
+            new_obj.db_vttype = res
+        elif hasattr(old_obj, 'db_vttype') and old_obj.db_vttype is not None:
+            new_obj.db_vttype = old_obj.db_vttype
+        if 'vtparent_type' in class_dict:
+            res = class_dict['vtparent_type'](old_obj, trans_dict)
+            new_obj.db_vtparent_type = res
+        elif hasattr(old_obj, 'db_vtparent_type') and old_obj.db_vtparent_type is not None:
+            new_obj.db_vtparent_type = old_obj.db_vtparent_type
+        if 'vtparent_id' in class_dict:
+            res = class_dict['vtparent_id'](old_obj, trans_dict)
+            new_obj.db_vtparent_id = res
+        elif hasattr(old_obj, 'db_vtparent_id') and old_obj.db_vtparent_id is not None:
+            new_obj.db_vtparent_id = old_obj.db_vtparent_id
+        if 'vtpos' in class_dict:
+            res = class_dict['vtpos'](old_obj, trans_dict)
+            new_obj.db_vtpos = res
+        elif hasattr(old_obj, 'db_vtpos') and old_obj.db_vtpos is not None:
+            new_obj.db_vtpos = old_obj.db_vtpos
+        if 'vtmid' in class_dict:
+            res = class_dict['vtmid'](old_obj, trans_dict)
+            new_obj.db_vtmid = res
+        elif hasattr(old_obj, 'db_vtmid') and old_obj.db_vtmid is not None:
+            new_obj.db_vtmid = old_obj.db_vtmid
+        if 'pos' in class_dict:
+            res = class_dict['pos'](old_obj, trans_dict)
+            new_obj.db_pos = res
+        elif hasattr(old_obj, 'db_pos') and old_obj.db_pos is not None:
+            new_obj.db_pos = old_obj.db_pos
+        if 'type' in class_dict:
+            res = class_dict['type'](old_obj, trans_dict)
+            new_obj.db_type = res
+        elif hasattr(old_obj, 'db_type') and old_obj.db_type is not None:
+            new_obj.db_type = old_obj.db_type
+        if 'val' in class_dict:
+            res = class_dict['val'](old_obj, trans_dict)
+            new_obj.db_val = res
+        elif hasattr(old_obj, 'db_val') and old_obj.db_val is not None:
+            new_obj.db_val = old_obj.db_val
+        if 'minVal' in class_dict:
+            res = class_dict['minVal'](old_obj, trans_dict)
+            new_obj.db_minVal = res
+        elif hasattr(old_obj, 'db_minVal') and old_obj.db_minVal is not None:
+            new_obj.db_minVal = old_obj.db_minVal
+        if 'maxVal' in class_dict:
+            res = class_dict['maxVal'](old_obj, trans_dict)
+            new_obj.db_maxVal = res
+        elif hasattr(old_obj, 'db_maxVal') and old_obj.db_maxVal is not None:
+            new_obj.db_maxVal = old_obj.db_maxVal
+        if 'stepSize' in class_dict:
+            res = class_dict['stepSize'](old_obj, trans_dict)
+            new_obj.db_stepSize = res
+        elif hasattr(old_obj, 'db_stepSize') and old_obj.db_stepSize is not None:
+            new_obj.db_stepSize = old_obj.db_stepSize
+        if 'strvaluelist' in class_dict:
+            res = class_dict['strvaluelist'](old_obj, trans_dict)
+            new_obj.db_strvaluelist = res
+        elif hasattr(old_obj, 'db_strvaluelist') and old_obj.db_strvaluelist is not None:
+            new_obj.db_strvaluelist = old_obj.db_strvaluelist
+        if 'widget' in class_dict:
+            res = class_dict['widget'](old_obj, trans_dict)
+            new_obj.db_widget = res
+        elif hasattr(old_obj, 'db_widget') and old_obj.db_widget is not None:
+            new_obj.db_widget = old_obj.db_widget
+        if 'seq' in class_dict:
+            res = class_dict['seq'](old_obj, trans_dict)
+            new_obj.db_seq = res
+        elif hasattr(old_obj, 'db_seq') and old_obj.db_seq is not None:
+            new_obj.db_seq = old_obj.db_seq
+        if 'parent' in class_dict:
+            res = class_dict['parent'](old_obj, trans_dict)
+            new_obj.db_parent = res
+        elif hasattr(old_obj, 'db_parent') and old_obj.db_parent is not None:
+            new_obj.db_parent = old_obj.db_parent
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_vtid(self):
+        return self._db_vtid
+    def __set_db_vtid(self, vtid):
+        self._db_vtid = vtid
+        self.is_dirty = True
+    db_vtid = property(__get_db_vtid, __set_db_vtid)
+    def db_add_vtid(self, vtid):
+        self._db_vtid = vtid
+    def db_change_vtid(self, vtid):
+        self._db_vtid = vtid
+    def db_delete_vtid(self, vtid):
+        self._db_vtid = None
+    
+    def __get_db_vttype(self):
+        return self._db_vttype
+    def __set_db_vttype(self, vttype):
+        self._db_vttype = vttype
+        self.is_dirty = True
+    db_vttype = property(__get_db_vttype, __set_db_vttype)
+    def db_add_vttype(self, vttype):
+        self._db_vttype = vttype
+    def db_change_vttype(self, vttype):
+        self._db_vttype = vttype
+    def db_delete_vttype(self, vttype):
+        self._db_vttype = None
+    
+    def __get_db_vtparent_type(self):
+        return self._db_vtparent_type
+    def __set_db_vtparent_type(self, vtparent_type):
+        self._db_vtparent_type = vtparent_type
+        self.is_dirty = True
+    db_vtparent_type = property(__get_db_vtparent_type, __set_db_vtparent_type)
+    def db_add_vtparent_type(self, vtparent_type):
+        self._db_vtparent_type = vtparent_type
+    def db_change_vtparent_type(self, vtparent_type):
+        self._db_vtparent_type = vtparent_type
+    def db_delete_vtparent_type(self, vtparent_type):
+        self._db_vtparent_type = None
+    
+    def __get_db_vtparent_id(self):
+        return self._db_vtparent_id
+    def __set_db_vtparent_id(self, vtparent_id):
+        self._db_vtparent_id = vtparent_id
+        self.is_dirty = True
+    db_vtparent_id = property(__get_db_vtparent_id, __set_db_vtparent_id)
+    def db_add_vtparent_id(self, vtparent_id):
+        self._db_vtparent_id = vtparent_id
+    def db_change_vtparent_id(self, vtparent_id):
+        self._db_vtparent_id = vtparent_id
+    def db_delete_vtparent_id(self, vtparent_id):
+        self._db_vtparent_id = None
+    
+    def __get_db_vtpos(self):
+        return self._db_vtpos
+    def __set_db_vtpos(self, vtpos):
+        self._db_vtpos = vtpos
+        self.is_dirty = True
+    db_vtpos = property(__get_db_vtpos, __set_db_vtpos)
+    def db_add_vtpos(self, vtpos):
+        self._db_vtpos = vtpos
+    def db_change_vtpos(self, vtpos):
+        self._db_vtpos = vtpos
+    def db_delete_vtpos(self, vtpos):
+        self._db_vtpos = None
+    
+    def __get_db_vtmid(self):
+        return self._db_vtmid
+    def __set_db_vtmid(self, vtmid):
+        self._db_vtmid = vtmid
+        self.is_dirty = True
+    db_vtmid = property(__get_db_vtmid, __set_db_vtmid)
+    def db_add_vtmid(self, vtmid):
+        self._db_vtmid = vtmid
+    def db_change_vtmid(self, vtmid):
+        self._db_vtmid = vtmid
+    def db_delete_vtmid(self, vtmid):
+        self._db_vtmid = None
+    
+    def __get_db_pos(self):
+        return self._db_pos
+    def __set_db_pos(self, pos):
+        self._db_pos = pos
+        self.is_dirty = True
+    db_pos = property(__get_db_pos, __set_db_pos)
+    def db_add_pos(self, pos):
+        self._db_pos = pos
+    def db_change_pos(self, pos):
+        self._db_pos = pos
+    def db_delete_pos(self, pos):
+        self._db_pos = None
+    
+    def __get_db_type(self):
+        return self._db_type
+    def __set_db_type(self, type):
+        self._db_type = type
+        self.is_dirty = True
+    db_type = property(__get_db_type, __set_db_type)
+    def db_add_type(self, type):
+        self._db_type = type
+    def db_change_type(self, type):
+        self._db_type = type
+    def db_delete_type(self, type):
+        self._db_type = None
+    
+    def __get_db_val(self):
+        return self._db_val
+    def __set_db_val(self, val):
+        self._db_val = val
+        self.is_dirty = True
+    db_val = property(__get_db_val, __set_db_val)
+    def db_add_val(self, val):
+        self._db_val = val
+    def db_change_val(self, val):
+        self._db_val = val
+    def db_delete_val(self, val):
+        self._db_val = None
+    
+    def __get_db_minVal(self):
+        return self._db_minVal
+    def __set_db_minVal(self, minVal):
+        self._db_minVal = minVal
+        self.is_dirty = True
+    db_minVal = property(__get_db_minVal, __set_db_minVal)
+    def db_add_minVal(self, minVal):
+        self._db_minVal = minVal
+    def db_change_minVal(self, minVal):
+        self._db_minVal = minVal
+    def db_delete_minVal(self, minVal):
+        self._db_minVal = None
+    
+    def __get_db_maxVal(self):
+        return self._db_maxVal
+    def __set_db_maxVal(self, maxVal):
+        self._db_maxVal = maxVal
+        self.is_dirty = True
+    db_maxVal = property(__get_db_maxVal, __set_db_maxVal)
+    def db_add_maxVal(self, maxVal):
+        self._db_maxVal = maxVal
+    def db_change_maxVal(self, maxVal):
+        self._db_maxVal = maxVal
+    def db_delete_maxVal(self, maxVal):
+        self._db_maxVal = None
+    
+    def __get_db_stepSize(self):
+        return self._db_stepSize
+    def __set_db_stepSize(self, stepSize):
+        self._db_stepSize = stepSize
+        self.is_dirty = True
+    db_stepSize = property(__get_db_stepSize, __set_db_stepSize)
+    def db_add_stepSize(self, stepSize):
+        self._db_stepSize = stepSize
+    def db_change_stepSize(self, stepSize):
+        self._db_stepSize = stepSize
+    def db_delete_stepSize(self, stepSize):
+        self._db_stepSize = None
+    
+    def __get_db_strvaluelist(self):
+        return self._db_strvaluelist
+    def __set_db_strvaluelist(self, strvaluelist):
+        self._db_strvaluelist = strvaluelist
+        self.is_dirty = True
+    db_strvaluelist = property(__get_db_strvaluelist, __set_db_strvaluelist)
+    def db_add_strvaluelist(self, strvaluelist):
+        self._db_strvaluelist = strvaluelist
+    def db_change_strvaluelist(self, strvaluelist):
+        self._db_strvaluelist = strvaluelist
+    def db_delete_strvaluelist(self, strvaluelist):
+        self._db_strvaluelist = None
+    
+    def __get_db_widget(self):
+        return self._db_widget
+    def __set_db_widget(self, widget):
+        self._db_widget = widget
+        self.is_dirty = True
+    db_widget = property(__get_db_widget, __set_db_widget)
+    def db_add_widget(self, widget):
+        self._db_widget = widget
+    def db_change_widget(self, widget):
+        self._db_widget = widget
+    def db_delete_widget(self, widget):
+        self._db_widget = None
+    
+    def __get_db_seq(self):
+        return self._db_seq
+    def __set_db_seq(self, seq):
+        self._db_seq = seq
+        self.is_dirty = True
+    db_seq = property(__get_db_seq, __set_db_seq)
+    def db_add_seq(self, seq):
+        self._db_seq = seq
+    def db_change_seq(self, seq):
+        self._db_seq = seq
+    def db_delete_seq(self, seq):
+        self._db_seq = None
+    
+    def __get_db_parent(self):
+        return self._db_parent
+    def __set_db_parent(self, parent):
+        self._db_parent = parent
+        self.is_dirty = True
+    db_parent = property(__get_db_parent, __set_db_parent)
+    def db_add_parent(self, parent):
+        self._db_parent = parent
+    def db_change_parent(self, parent):
+        self._db_parent = parent
+    def db_delete_parent(self, parent):
+        self._db_parent = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBProvEntity(object):
+
+    vtType = 'prov_entity'
+
+    def __init__(self, id=None, prov_type=None, prov_label=None, prov_value=None, vt_id=None, vt_type=None, vt_desc=None, vt_package=None, vt_version=None, vt_cache=None, vt_location_x=None, vt_location_y=None, is_part_of=None):
+        self._db_id = id
+        self._db_prov_type = prov_type
+        self._db_prov_label = prov_label
+        self._db_prov_value = prov_value
+        self._db_vt_id = vt_id
+        self._db_vt_type = vt_type
+        self._db_vt_desc = vt_desc
+        self._db_vt_package = vt_package
+        self._db_vt_version = vt_version
+        self._db_vt_cache = vt_cache
+        self._db_vt_location_x = vt_location_x
+        self._db_vt_location_y = vt_location_y
+        self.db_deleted_is_part_of = []
+        self._db_is_part_of = is_part_of
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvEntity.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvEntity(id=self._db_id,
+                          prov_type=self._db_prov_type,
+                          prov_label=self._db_prov_label,
+                          prov_value=self._db_prov_value,
+                          vt_id=self._db_vt_id,
+                          vt_type=self._db_vt_type,
+                          vt_desc=self._db_vt_desc,
+                          vt_package=self._db_vt_package,
+                          vt_version=self._db_vt_version,
+                          vt_cache=self._db_vt_cache,
+                          vt_location_x=self._db_vt_location_x,
+                          vt_location_y=self._db_vt_location_y)
+        if self._db_is_part_of is not None:
+            cp._db_is_part_of = self._db_is_part_of.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvEntity()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prov_type' in class_dict:
+            res = class_dict['prov_type'](old_obj, trans_dict)
+            new_obj.db_prov_type = res
+        elif hasattr(old_obj, 'db_prov_type') and old_obj.db_prov_type is not None:
+            new_obj.db_prov_type = old_obj.db_prov_type
+        if 'prov_label' in class_dict:
+            res = class_dict['prov_label'](old_obj, trans_dict)
+            new_obj.db_prov_label = res
+        elif hasattr(old_obj, 'db_prov_label') and old_obj.db_prov_label is not None:
+            new_obj.db_prov_label = old_obj.db_prov_label
+        if 'prov_value' in class_dict:
+            res = class_dict['prov_value'](old_obj, trans_dict)
+            new_obj.db_prov_value = res
+        elif hasattr(old_obj, 'db_prov_value') and old_obj.db_prov_value is not None:
+            new_obj.db_prov_value = old_obj.db_prov_value
+        if 'vt_id' in class_dict:
+            res = class_dict['vt_id'](old_obj, trans_dict)
+            new_obj.db_vt_id = res
+        elif hasattr(old_obj, 'db_vt_id') and old_obj.db_vt_id is not None:
+            new_obj.db_vt_id = old_obj.db_vt_id
+        if 'vt_type' in class_dict:
+            res = class_dict['vt_type'](old_obj, trans_dict)
+            new_obj.db_vt_type = res
+        elif hasattr(old_obj, 'db_vt_type') and old_obj.db_vt_type is not None:
+            new_obj.db_vt_type = old_obj.db_vt_type
+        if 'vt_desc' in class_dict:
+            res = class_dict['vt_desc'](old_obj, trans_dict)
+            new_obj.db_vt_desc = res
+        elif hasattr(old_obj, 'db_vt_desc') and old_obj.db_vt_desc is not None:
+            new_obj.db_vt_desc = old_obj.db_vt_desc
+        if 'vt_package' in class_dict:
+            res = class_dict['vt_package'](old_obj, trans_dict)
+            new_obj.db_vt_package = res
+        elif hasattr(old_obj, 'db_vt_package') and old_obj.db_vt_package is not None:
+            new_obj.db_vt_package = old_obj.db_vt_package
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'vt_cache' in class_dict:
+            res = class_dict['vt_cache'](old_obj, trans_dict)
+            new_obj.db_vt_cache = res
+        elif hasattr(old_obj, 'db_vt_cache') and old_obj.db_vt_cache is not None:
+            new_obj.db_vt_cache = old_obj.db_vt_cache
+        if 'vt_location_x' in class_dict:
+            res = class_dict['vt_location_x'](old_obj, trans_dict)
+            new_obj.db_vt_location_x = res
+        elif hasattr(old_obj, 'db_vt_location_x') and old_obj.db_vt_location_x is not None:
+            new_obj.db_vt_location_x = old_obj.db_vt_location_x
+        if 'vt_location_y' in class_dict:
+            res = class_dict['vt_location_y'](old_obj, trans_dict)
+            new_obj.db_vt_location_y = res
+        elif hasattr(old_obj, 'db_vt_location_y') and old_obj.db_vt_location_y is not None:
+            new_obj.db_vt_location_y = old_obj.db_vt_location_y
+        if 'is_part_of' in class_dict:
+            res = class_dict['is_part_of'](old_obj, trans_dict)
+            new_obj.db_is_part_of = res
+        elif hasattr(old_obj, 'db_is_part_of') and old_obj.db_is_part_of is not None:
+            obj = old_obj.db_is_part_of
+            new_obj.db_add_is_part_of(DBIsPartOf.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_is_part_of') and hasattr(new_obj, 'db_deleted_is_part_of'):
+            for obj in old_obj.db_deleted_is_part_of:
+                n_obj = DBIsPartOf.update_version(obj, trans_dict)
+                new_obj.db_deleted_is_part_of.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_is_part_of is not None:
+            children.extend(self._db_is_part_of.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_is_part_of = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_is_part_of)
+        if remove:
+            self.db_deleted_is_part_of = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_is_part_of is not None and self._db_is_part_of.has_changes():
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prov_type(self):
+        return self._db_prov_type
+    def __set_db_prov_type(self, prov_type):
+        self._db_prov_type = prov_type
+        self.is_dirty = True
+    db_prov_type = property(__get_db_prov_type, __set_db_prov_type)
+    def db_add_prov_type(self, prov_type):
+        self._db_prov_type = prov_type
+    def db_change_prov_type(self, prov_type):
+        self._db_prov_type = prov_type
+    def db_delete_prov_type(self, prov_type):
+        self._db_prov_type = None
+    
+    def __get_db_prov_label(self):
+        return self._db_prov_label
+    def __set_db_prov_label(self, prov_label):
+        self._db_prov_label = prov_label
+        self.is_dirty = True
+    db_prov_label = property(__get_db_prov_label, __set_db_prov_label)
+    def db_add_prov_label(self, prov_label):
+        self._db_prov_label = prov_label
+    def db_change_prov_label(self, prov_label):
+        self._db_prov_label = prov_label
+    def db_delete_prov_label(self, prov_label):
+        self._db_prov_label = None
+    
+    def __get_db_prov_value(self):
+        return self._db_prov_value
+    def __set_db_prov_value(self, prov_value):
+        self._db_prov_value = prov_value
+        self.is_dirty = True
+    db_prov_value = property(__get_db_prov_value, __set_db_prov_value)
+    def db_add_prov_value(self, prov_value):
+        self._db_prov_value = prov_value
+    def db_change_prov_value(self, prov_value):
+        self._db_prov_value = prov_value
+    def db_delete_prov_value(self, prov_value):
+        self._db_prov_value = None
+    
+    def __get_db_vt_id(self):
+        return self._db_vt_id
+    def __set_db_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+        self.is_dirty = True
+    db_vt_id = property(__get_db_vt_id, __set_db_vt_id)
+    def db_add_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+    def db_change_vt_id(self, vt_id):
+        self._db_vt_id = vt_id
+    def db_delete_vt_id(self, vt_id):
+        self._db_vt_id = None
+    
+    def __get_db_vt_type(self):
+        return self._db_vt_type
+    def __set_db_vt_type(self, vt_type):
+        self._db_vt_type = vt_type
+        self.is_dirty = True
+    db_vt_type = property(__get_db_vt_type, __set_db_vt_type)
+    def db_add_vt_type(self, vt_type):
+        self._db_vt_type = vt_type
+    def db_change_vt_type(self, vt_type):
+        self._db_vt_type = vt_type
+    def db_delete_vt_type(self, vt_type):
+        self._db_vt_type = None
+    
+    def __get_db_vt_desc(self):
+        return self._db_vt_desc
+    def __set_db_vt_desc(self, vt_desc):
+        self._db_vt_desc = vt_desc
+        self.is_dirty = True
+    db_vt_desc = property(__get_db_vt_desc, __set_db_vt_desc)
+    def db_add_vt_desc(self, vt_desc):
+        self._db_vt_desc = vt_desc
+    def db_change_vt_desc(self, vt_desc):
+        self._db_vt_desc = vt_desc
+    def db_delete_vt_desc(self, vt_desc):
+        self._db_vt_desc = None
+    
+    def __get_db_vt_package(self):
+        return self._db_vt_package
+    def __set_db_vt_package(self, vt_package):
+        self._db_vt_package = vt_package
+        self.is_dirty = True
+    db_vt_package = property(__get_db_vt_package, __set_db_vt_package)
+    def db_add_vt_package(self, vt_package):
+        self._db_vt_package = vt_package
+    def db_change_vt_package(self, vt_package):
+        self._db_vt_package = vt_package
+    def db_delete_vt_package(self, vt_package):
+        self._db_vt_package = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_vt_cache(self):
+        return self._db_vt_cache
+    def __set_db_vt_cache(self, vt_cache):
+        self._db_vt_cache = vt_cache
+        self.is_dirty = True
+    db_vt_cache = property(__get_db_vt_cache, __set_db_vt_cache)
+    def db_add_vt_cache(self, vt_cache):
+        self._db_vt_cache = vt_cache
+    def db_change_vt_cache(self, vt_cache):
+        self._db_vt_cache = vt_cache
+    def db_delete_vt_cache(self, vt_cache):
+        self._db_vt_cache = None
+    
+    def __get_db_vt_location_x(self):
+        return self._db_vt_location_x
+    def __set_db_vt_location_x(self, vt_location_x):
+        self._db_vt_location_x = vt_location_x
+        self.is_dirty = True
+    db_vt_location_x = property(__get_db_vt_location_x, __set_db_vt_location_x)
+    def db_add_vt_location_x(self, vt_location_x):
+        self._db_vt_location_x = vt_location_x
+    def db_change_vt_location_x(self, vt_location_x):
+        self._db_vt_location_x = vt_location_x
+    def db_delete_vt_location_x(self, vt_location_x):
+        self._db_vt_location_x = None
+    
+    def __get_db_vt_location_y(self):
+        return self._db_vt_location_y
+    def __set_db_vt_location_y(self, vt_location_y):
+        self._db_vt_location_y = vt_location_y
+        self.is_dirty = True
+    db_vt_location_y = property(__get_db_vt_location_y, __set_db_vt_location_y)
+    def db_add_vt_location_y(self, vt_location_y):
+        self._db_vt_location_y = vt_location_y
+    def db_change_vt_location_y(self, vt_location_y):
+        self._db_vt_location_y = vt_location_y
+    def db_delete_vt_location_y(self, vt_location_y):
+        self._db_vt_location_y = None
+    
+    def __get_db_is_part_of(self):
+        return self._db_is_part_of
+    def __set_db_is_part_of(self, is_part_of):
+        self._db_is_part_of = is_part_of
+        self.is_dirty = True
+    db_is_part_of = property(__get_db_is_part_of, __set_db_is_part_of)
+    def db_add_is_part_of(self, is_part_of):
+        self._db_is_part_of = is_part_of
+    def db_change_is_part_of(self, is_part_of):
+        self._db_is_part_of = is_part_of
+    def db_delete_is_part_of(self, is_part_of):
+        if not self.is_new:
+            self.db_deleted_is_part_of.append(self._db_is_part_of)
+        self._db_is_part_of = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBAnnotation(object):
+
+    vtType = 'annotation'
+
+    def __init__(self, id=None, key=None, value=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAnnotation(id=self._db_id,
+                          key=self._db_key,
+                          value=self._db_value)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBChange(object):
+
+    vtType = 'change'
+
+    def __init__(self, data=None, id=None, what=None, oldObjId=None, newObjId=None, parentObjId=None, parentObjType=None):
+        self.db_deleted_data = []
+        self._db_data = data
+        self._db_id = id
+        self._db_what = what
+        self._db_oldObjId = oldObjId
+        self._db_newObjId = newObjId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBChange.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBChange(id=self._db_id,
+                      what=self._db_what,
+                      oldObjId=self._db_oldObjId,
+                      newObjId=self._db_newObjId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        if self._db_data is not None:
+            cp._db_data = self._db_data.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_oldObjId') and (self._db_what, self._db_oldObjId) in id_remap:
+                cp._db_oldObjId = id_remap[(self._db_what, self._db_oldObjId)]
+            if hasattr(self, 'db_newObjId') and (self._db_what, self._db_newObjId) in id_remap:
+                cp._db_newObjId = id_remap[(self._db_what, self._db_newObjId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBChange()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'data' in class_dict:
+            res = class_dict['data'](old_obj, trans_dict)
+            new_obj.db_data = res
+        elif hasattr(old_obj, 'db_data') and old_obj.db_data is not None:
+            obj = old_obj.db_data
+            if obj.vtType == 'module':
+                new_obj.db_add_data(DBModule.update_version(obj, trans_dict))
+            elif obj.vtType == 'location':
+                new_obj.db_add_data(DBLocation.update_version(obj, trans_dict))
+            elif obj.vtType == 'annotation':
+                new_obj.db_add_data(DBAnnotation.update_version(obj, trans_dict))
+            elif obj.vtType == 'function':
+                new_obj.db_add_data(DBFunction.update_version(obj, trans_dict))
+            elif obj.vtType == 'connection':
+                new_obj.db_add_data(DBConnection.update_version(obj, trans_dict))
+            elif obj.vtType == 'port':
+                new_obj.db_add_data(DBPort.update_version(obj, trans_dict))
+            elif obj.vtType == 'parameter':
+                new_obj.db_add_data(DBParameter.update_version(obj, trans_dict))
+            elif obj.vtType == 'portSpec':
+                new_obj.db_add_data(DBPortSpec.update_version(obj, trans_dict))
+            elif obj.vtType == 'abstraction':
+                new_obj.db_add_data(DBAbstraction.update_version(obj, trans_dict))
+            elif obj.vtType == 'group':
+                new_obj.db_add_data(DBGroup.update_version(obj, trans_dict))
+            elif obj.vtType == 'other':
+                new_obj.db_add_data(DBOther.update_version(obj, trans_dict))
+            elif obj.vtType == 'plugin_data':
+                new_obj.db_add_data(DBPluginData.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_data') and hasattr(new_obj, 'db_deleted_data'):
+            for obj in old_obj.db_deleted_data:
+                if obj.vtType == 'module':
+                    n_obj = DBModule.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'location':
+                    n_obj = DBLocation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'annotation':
+                    n_obj = DBAnnotation.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'function':
+                    n_obj = DBFunction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'connection':
+                    n_obj = DBConnection.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'port':
+                    n_obj = DBPort.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'parameter':
+                    n_obj = DBParameter.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'portSpec':
+                    n_obj = DBPortSpec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'abstraction':
+                    n_obj = DBAbstraction.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'group':
+                    n_obj = DBGroup.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'other':
+                    n_obj = DBOther.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+                elif obj.vtType == 'plugin_data':
+                    n_obj = DBPluginData.update_version(obj, trans_dict)
+                    new_obj.db_deleted_data.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'oldObjId' in class_dict:
+            res = class_dict['oldObjId'](old_obj, trans_dict)
+            new_obj.db_oldObjId = res
+        elif hasattr(old_obj, 'db_oldObjId') and old_obj.db_oldObjId is not None:
+            new_obj.db_oldObjId = old_obj.db_oldObjId
+        if 'newObjId' in class_dict:
+            res = class_dict['newObjId'](old_obj, trans_dict)
+            new_obj.db_newObjId = res
+        elif hasattr(old_obj, 'db_newObjId') and old_obj.db_newObjId is not None:
+            new_obj.db_newObjId = old_obj.db_newObjId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_data is not None:
+            children.extend(self._db_data.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_data = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_data)
+        if remove:
+            self.db_deleted_data = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_data is not None and self._db_data.has_changes():
+            return True
+        return False
+    def __get_db_data(self):
+        return self._db_data
+    def __set_db_data(self, data):
+        self._db_data = data
+        self.is_dirty = True
+    db_data = property(__get_db_data, __set_db_data)
+    def db_add_data(self, data):
+        self._db_data = data
+    def db_change_data(self, data):
+        self._db_data = data
+    def db_delete_data(self, data):
+        if not self.is_new:
+            self.db_deleted_data.append(self._db_data)
+        self._db_data = None
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_oldObjId(self):
+        return self._db_oldObjId
+    def __set_db_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+        self.is_dirty = True
+    db_oldObjId = property(__get_db_oldObjId, __set_db_oldObjId)
+    def db_add_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_change_oldObjId(self, oldObjId):
+        self._db_oldObjId = oldObjId
+    def db_delete_oldObjId(self, oldObjId):
+        self._db_oldObjId = None
+    
+    def __get_db_newObjId(self):
+        return self._db_newObjId
+    def __set_db_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+        self.is_dirty = True
+    db_newObjId = property(__get_db_newObjId, __set_db_newObjId)
+    def db_add_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_change_newObjId(self, newObjId):
+        self._db_newObjId = newObjId
+    def db_delete_newObjId(self, newObjId):
+        self._db_newObjId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasDerivedFrom(object):
+
+    vtType = 'opm_was_derived_from'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasDerivedFrom.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasDerivedFrom()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasDerivedFrom()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmArtifactIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmArtifactIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmArtifactIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmArtifactIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBOpmArtifacts(object):
+
+    vtType = 'opm_artifacts'
+
+    def __init__(self, artifacts=None):
+        self.db_deleted_artifacts = []
+        self.db_artifacts_id_index = {}
+        if artifacts is None:
+            self._db_artifacts = []
+        else:
+            self._db_artifacts = artifacts
+            for v in self._db_artifacts:
+                self.db_artifacts_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmArtifacts.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmArtifacts()
+        if self._db_artifacts is None:
+            cp._db_artifacts = []
+        else:
+            cp._db_artifacts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_artifacts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_artifacts_id_index = dict((v.db_id, v) for v in cp._db_artifacts)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmArtifacts()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'artifacts' in class_dict:
+            res = class_dict['artifacts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_artifact(obj)
+        elif hasattr(old_obj, 'db_artifacts') and old_obj.db_artifacts is not None:
+            for obj in old_obj.db_artifacts:
+                new_obj.db_add_artifact(DBOpmArtifact.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_artifacts') and hasattr(new_obj, 'db_deleted_artifacts'):
+            for obj in old_obj.db_deleted_artifacts:
+                n_obj = DBOpmArtifact.update_version(obj, trans_dict)
+                new_obj.db_deleted_artifacts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_artifacts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_artifact(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_artifacts)
+        if remove:
+            self.db_deleted_artifacts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_artifacts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_artifacts(self):
+        return self._db_artifacts
+    def __set_db_artifacts(self, artifacts):
+        self._db_artifacts = artifacts
+        self.is_dirty = True
+    db_artifacts = property(__get_db_artifacts, __set_db_artifacts)
+    def db_get_artifacts(self):
+        return self._db_artifacts
+    def db_add_artifact(self, artifact):
+        self.is_dirty = True
+        self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_change_artifact(self, artifact):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                self._db_artifacts[i] = artifact
+                found = True
+                break
+        if not found:
+            self._db_artifacts.append(artifact)
+        self.db_artifacts_id_index[artifact.db_id] = artifact
+    def db_delete_artifact(self, artifact):
+        self.is_dirty = True
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == artifact.db_id:
+                if not self._db_artifacts[i].is_new:
+                    self.db_deleted_artifacts.append(self._db_artifacts[i])
+                del self._db_artifacts[i]
+                break
+        del self.db_artifacts_id_index[artifact.db_id]
+    def db_get_artifact(self, key):
+        for i in xrange(len(self._db_artifacts)):
+            if self._db_artifacts[i].db_id == key:
+                return self._db_artifacts[i]
+        return None
+    def db_get_artifact_by_id(self, key):
+        return self.db_artifacts_id_index[key]
+    def db_has_artifact_with_id(self, key):
+        return key in self.db_artifacts_id_index
+    
+
+
+class DBOpmWasControlledBy(object):
+
+    vtType = 'opm_was_controlled_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, starts=None, ends=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_starts = []
+        if starts is None:
+            self._db_starts = []
+        else:
+            self._db_starts = starts
+        self.db_deleted_ends = []
+        if ends is None:
+            self._db_ends = []
+        else:
+            self._db_ends = ends
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasControlledBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasControlledBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_starts is None:
+            cp._db_starts = []
+        else:
+            cp._db_starts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_starts]
+        if self._db_ends is None:
+            cp._db_ends = []
+        else:
+            cp._db_ends = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ends]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasControlledBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmAgentId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmAgentId.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'starts' in class_dict:
+            res = class_dict['starts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_start(obj)
+        elif hasattr(old_obj, 'db_starts') and old_obj.db_starts is not None:
+            for obj in old_obj.db_starts:
+                new_obj.db_add_start(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_starts') and hasattr(new_obj, 'db_deleted_starts'):
+            for obj in old_obj.db_deleted_starts:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_starts.append(n_obj)
+        if 'ends' in class_dict:
+            res = class_dict['ends'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_end(obj)
+        elif hasattr(old_obj, 'db_ends') and old_obj.db_ends is not None:
+            for obj in old_obj.db_ends:
+                new_obj.db_add_end(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ends') and hasattr(new_obj, 'db_deleted_ends'):
+            for obj in old_obj.db_deleted_ends:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_ends.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_starts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_start(child)
+        to_del = []
+        for child in self.db_ends:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_end(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_starts)
+        children.extend(self.db_deleted_ends)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_starts = []
+            self.db_deleted_ends = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_starts:
+            if child.has_changes():
+                return True
+        for child in self._db_ends:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_starts(self):
+        return self._db_starts
+    def __set_db_starts(self, starts):
+        self._db_starts = starts
+        self.is_dirty = True
+    db_starts = property(__get_db_starts, __set_db_starts)
+    def db_get_starts(self):
+        return self._db_starts
+    def db_add_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_change_start(self, start):
+        self.is_dirty = True
+        self._db_starts.append(start)
+    def db_delete_start(self, start):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_start(self, key):
+        return None
+    
+    def __get_db_ends(self):
+        return self._db_ends
+    def __set_db_ends(self, ends):
+        self._db_ends = ends
+        self.is_dirty = True
+    db_ends = property(__get_db_ends, __set_db_ends)
+    def db_get_ends(self):
+        return self._db_ends
+    def db_add_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_change_end(self, end):
+        self.is_dirty = True
+        self._db_ends.append(end)
+    def db_delete_end(self, end):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_end(self, key):
+        return None
+    
+
+
+class DBOpmAgentId(object):
+
+    vtType = 'opm_agent_id'
+
+    def __init__(self, id=None):
+        self._db_id = id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgentId.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgentId(id=self._db_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_id') and ('opm_agent', self._db_id) in id_remap:
+                cp._db_id = id_remap[('opm_agent', self._db_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgentId()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+
+
+class DBGroupExec(object):
+
+    vtType = 'group_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, group_name=None, group_type=None, completed=None, error=None, machine_id=None, annotations=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_group_name = group_name
+        self._db_group_type = group_type
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBGroupExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBGroupExec(id=self._db_id,
+                         ts_start=self._db_ts_start,
+                         ts_end=self._db_ts_end,
+                         cached=self._db_cached,
+                         module_id=self._db_module_id,
+                         group_name=self._db_group_name,
+                         group_type=self._db_group_type,
+                         completed=self._db_completed,
+                         error=self._db_error,
+                         machine_id=self._db_machine_id)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBGroupExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'group_name' in class_dict:
+            res = class_dict['group_name'](old_obj, trans_dict)
+            new_obj.db_group_name = res
+        elif hasattr(old_obj, 'db_group_name') and old_obj.db_group_name is not None:
+            new_obj.db_group_name = old_obj.db_group_name
+        if 'group_type' in class_dict:
+            res = class_dict['group_type'](old_obj, trans_dict)
+            new_obj.db_group_type = res
+        elif hasattr(old_obj, 'db_group_type') and old_obj.db_group_type is not None:
+            new_obj.db_group_type = old_obj.db_group_type
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_group_name(self):
+        return self._db_group_name
+    def __set_db_group_name(self, group_name):
+        self._db_group_name = group_name
+        self.is_dirty = True
+    db_group_name = property(__get_db_group_name, __set_db_group_name)
+    def db_add_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_change_group_name(self, group_name):
+        self._db_group_name = group_name
+    def db_delete_group_name(self, group_name):
+        self._db_group_name = None
+    
+    def __get_db_group_type(self):
+        return self._db_group_type
+    def __set_db_group_type(self, group_type):
+        self._db_group_type = group_type
+        self.is_dirty = True
+    db_group_type = property(__get_db_group_type, __set_db_group_type)
+    def db_add_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_change_group_type(self, group_type):
+        self._db_group_type = group_type
+    def db_delete_group_type(self, group_type):
+        self._db_group_type = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmTime(object):
+
+    vtType = 'opm_time'
+
+    def __init__(self, no_later_than=None, no_earlier_than=None, clock_id=None):
+        self._db_no_later_than = no_later_than
+        self._db_no_earlier_than = no_earlier_than
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmTime.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmTime(no_later_than=self._db_no_later_than,
+                       no_earlier_than=self._db_no_earlier_than,
+                       clock_id=self._db_clock_id)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmTime()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'no_later_than' in class_dict:
+            res = class_dict['no_later_than'](old_obj, trans_dict)
+            new_obj.db_no_later_than = res
+        elif hasattr(old_obj, 'db_no_later_than') and old_obj.db_no_later_than is not None:
+            new_obj.db_no_later_than = old_obj.db_no_later_than
+        if 'no_earlier_than' in class_dict:
+            res = class_dict['no_earlier_than'](old_obj, trans_dict)
+            new_obj.db_no_earlier_than = res
+        elif hasattr(old_obj, 'db_no_earlier_than') and old_obj.db_no_earlier_than is not None:
+            new_obj.db_no_earlier_than = old_obj.db_no_earlier_than
+        if 'clock_id' in class_dict:
+            res = class_dict['clock_id'](old_obj, trans_dict)
+            new_obj.db_clock_id = res
+        elif hasattr(old_obj, 'db_clock_id') and old_obj.db_clock_id is not None:
+            new_obj.db_clock_id = old_obj.db_clock_id
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_no_later_than(self):
+        return self._db_no_later_than
+    def __set_db_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+        self.is_dirty = True
+    db_no_later_than = property(__get_db_no_later_than, __set_db_no_later_than)
+    def db_add_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_change_no_later_than(self, no_later_than):
+        self._db_no_later_than = no_later_than
+    def db_delete_no_later_than(self, no_later_than):
+        self._db_no_later_than = None
+    
+    def __get_db_no_earlier_than(self):
+        return self._db_no_earlier_than
+    def __set_db_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+        self.is_dirty = True
+    db_no_earlier_than = property(__get_db_no_earlier_than, __set_db_no_earlier_than)
+    def db_add_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_change_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = no_earlier_than
+    def db_delete_no_earlier_than(self, no_earlier_than):
+        self._db_no_earlier_than = None
+    
+    def __get_db_clock_id(self):
+        return self._db_clock_id
+    def __set_db_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+        self.is_dirty = True
+    db_clock_id = property(__get_db_clock_id, __set_db_clock_id)
+    def db_add_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_change_clock_id(self, clock_id):
+        self._db_clock_id = clock_id
+    def db_delete_clock_id(self, clock_id):
+        self._db_clock_id = None
+    
+
+
+class DBPackage(object):
+
+    vtType = 'package'
+
+    def __init__(self, id=None, name=None, identifier=None, codepath=None, load_configuration=None, version=None, description=None, module_descriptors=None):
+        self._db_id = id
+        self._db_name = name
+        self._db_identifier = identifier
+        self._db_codepath = codepath
+        self._db_load_configuration = load_configuration
+        self._db_version = version
+        self._db_description = description
+        self.db_deleted_module_descriptors = []
+        self.db_module_descriptors_id_index = {}
+        self.db_module_descriptors_name_index = {}
+        if module_descriptors is None:
+            self._db_module_descriptors = []
+        else:
+            self._db_module_descriptors = module_descriptors
+            for v in self._db_module_descriptors:
+                self.db_module_descriptors_id_index[v.db_id] = v
+                self.db_module_descriptors_name_index[(v.db_name,v.db_namespace,v.db_version)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPackage.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPackage(id=self._db_id,
+                       name=self._db_name,
+                       identifier=self._db_identifier,
+                       codepath=self._db_codepath,
+                       load_configuration=self._db_load_configuration,
+                       version=self._db_version,
+                       description=self._db_description)
+        if self._db_module_descriptors is None:
+            cp._db_module_descriptors = []
+        else:
+            cp._db_module_descriptors = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_module_descriptors]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_module_descriptors_id_index = dict((v.db_id, v) for v in cp._db_module_descriptors)
+        cp.db_module_descriptors_name_index = dict(((v.db_name,v.db_namespace,v.db_version), v) for v in cp._db_module_descriptors)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPackage()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'identifier' in class_dict:
+            res = class_dict['identifier'](old_obj, trans_dict)
+            new_obj.db_identifier = res
+        elif hasattr(old_obj, 'db_identifier') and old_obj.db_identifier is not None:
+            new_obj.db_identifier = old_obj.db_identifier
+        if 'codepath' in class_dict:
+            res = class_dict['codepath'](old_obj, trans_dict)
+            new_obj.db_codepath = res
+        elif hasattr(old_obj, 'db_codepath') and old_obj.db_codepath is not None:
+            new_obj.db_codepath = old_obj.db_codepath
+        if 'load_configuration' in class_dict:
+            res = class_dict['load_configuration'](old_obj, trans_dict)
+            new_obj.db_load_configuration = res
+        elif hasattr(old_obj, 'db_load_configuration') and old_obj.db_load_configuration is not None:
+            new_obj.db_load_configuration = old_obj.db_load_configuration
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'description' in class_dict:
+            res = class_dict['description'](old_obj, trans_dict)
+            new_obj.db_description = res
+        elif hasattr(old_obj, 'db_description') and old_obj.db_description is not None:
+            new_obj.db_description = old_obj.db_description
+        if 'module_descriptors' in class_dict:
+            res = class_dict['module_descriptors'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_module_descriptor(obj)
+        elif hasattr(old_obj, 'db_module_descriptors') and old_obj.db_module_descriptors is not None:
+            for obj in old_obj.db_module_descriptors:
+                new_obj.db_add_module_descriptor(DBModuleDescriptor.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_module_descriptors') and hasattr(new_obj, 'db_deleted_module_descriptors'):
+            for obj in old_obj.db_deleted_module_descriptors:
+                n_obj = DBModuleDescriptor.update_version(obj, trans_dict)
+                new_obj.db_deleted_module_descriptors.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_module_descriptors:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_module_descriptor(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_module_descriptors)
+        if remove:
+            self.db_deleted_module_descriptors = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_module_descriptors:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_identifier(self):
+        return self._db_identifier
+    def __set_db_identifier(self, identifier):
+        self._db_identifier = identifier
+        self.is_dirty = True
+    db_identifier = property(__get_db_identifier, __set_db_identifier)
+    def db_add_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_change_identifier(self, identifier):
+        self._db_identifier = identifier
+    def db_delete_identifier(self, identifier):
+        self._db_identifier = None
+    
+    def __get_db_codepath(self):
+        return self._db_codepath
+    def __set_db_codepath(self, codepath):
+        self._db_codepath = codepath
+        self.is_dirty = True
+    db_codepath = property(__get_db_codepath, __set_db_codepath)
+    def db_add_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_change_codepath(self, codepath):
+        self._db_codepath = codepath
+    def db_delete_codepath(self, codepath):
+        self._db_codepath = None
+    
+    def __get_db_load_configuration(self):
+        return self._db_load_configuration
+    def __set_db_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+        self.is_dirty = True
+    db_load_configuration = property(__get_db_load_configuration, __set_db_load_configuration)
+    def db_add_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_change_load_configuration(self, load_configuration):
+        self._db_load_configuration = load_configuration
+    def db_delete_load_configuration(self, load_configuration):
+        self._db_load_configuration = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_description(self):
+        return self._db_description
+    def __set_db_description(self, description):
+        self._db_description = description
+        self.is_dirty = True
+    db_description = property(__get_db_description, __set_db_description)
+    def db_add_description(self, description):
+        self._db_description = description
+    def db_change_description(self, description):
+        self._db_description = description
+    def db_delete_description(self, description):
+        self._db_description = None
+    
+    def __get_db_module_descriptors(self):
+        return self._db_module_descriptors
+    def __set_db_module_descriptors(self, module_descriptors):
+        self._db_module_descriptors = module_descriptors
+        self.is_dirty = True
+    db_module_descriptors = property(__get_db_module_descriptors, __set_db_module_descriptors)
+    def db_get_module_descriptors(self):
+        return self._db_module_descriptors
+    def db_add_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_change_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                self._db_module_descriptors[i] = module_descriptor
+                found = True
+                break
+        if not found:
+            self._db_module_descriptors.append(module_descriptor)
+        self.db_module_descriptors_id_index[module_descriptor.db_id] = module_descriptor
+        self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)] = module_descriptor
+    def db_delete_module_descriptor(self, module_descriptor):
+        self.is_dirty = True
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == module_descriptor.db_id:
+                if not self._db_module_descriptors[i].is_new:
+                    self.db_deleted_module_descriptors.append(self._db_module_descriptors[i])
+                del self._db_module_descriptors[i]
+                break
+        del self.db_module_descriptors_id_index[module_descriptor.db_id]
+        del self.db_module_descriptors_name_index[(module_descriptor.db_name,module_descriptor.db_namespace,module_descriptor.db_version)]
+    def db_get_module_descriptor(self, key):
+        for i in xrange(len(self._db_module_descriptors)):
+            if self._db_module_descriptors[i].db_id == key:
+                return self._db_module_descriptors[i]
+        return None
+    def db_get_module_descriptor_by_id(self, key):
+        return self.db_module_descriptors_id_index[key]
+    def db_has_module_descriptor_with_id(self, key):
+        return key in self.db_module_descriptors_id_index
+    def db_get_module_descriptor_by_name(self, key):
+        return self.db_module_descriptors_name_index[key]
+    def db_has_module_descriptor_with_name(self, key):
+        return key in self.db_module_descriptors_name_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBWorkflowExec(object):
+
+    vtType = 'workflow_exec'
+
+    def __init__(self, item_execs=None, id=None, user=None, ip=None, session=None, vt_version=None, ts_start=None, ts_end=None, parent_id=None, parent_type=None, parent_version=None, completed=None, name=None, annotations=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_user = user
+        self._db_ip = ip
+        self._db_session = session
+        self._db_vt_version = vt_version
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_parent_id = parent_id
+        self._db_parent_type = parent_type
+        self._db_parent_version = parent_version
+        self._db_completed = completed
+        self._db_name = name
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBWorkflowExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBWorkflowExec(id=self._db_id,
+                            user=self._db_user,
+                            ip=self._db_ip,
+                            session=self._db_session,
+                            vt_version=self._db_vt_version,
+                            ts_start=self._db_ts_start,
+                            ts_end=self._db_ts_end,
+                            parent_id=self._db_parent_id,
+                            parent_type=self._db_parent_type,
+                            parent_version=self._db_parent_version,
+                            completed=self._db_completed,
+                            name=self._db_name)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflowExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'ip' in class_dict:
+            res = class_dict['ip'](old_obj, trans_dict)
+            new_obj.db_ip = res
+        elif hasattr(old_obj, 'db_ip') and old_obj.db_ip is not None:
+            new_obj.db_ip = old_obj.db_ip
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'vt_version' in class_dict:
+            res = class_dict['vt_version'](old_obj, trans_dict)
+            new_obj.db_vt_version = res
+        elif hasattr(old_obj, 'db_vt_version') and old_obj.db_vt_version is not None:
+            new_obj.db_vt_version = old_obj.db_vt_version
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'parent_id' in class_dict:
+            res = class_dict['parent_id'](old_obj, trans_dict)
+            new_obj.db_parent_id = res
+        elif hasattr(old_obj, 'db_parent_id') and old_obj.db_parent_id is not None:
+            new_obj.db_parent_id = old_obj.db_parent_id
+        if 'parent_type' in class_dict:
+            res = class_dict['parent_type'](old_obj, trans_dict)
+            new_obj.db_parent_type = res
+        elif hasattr(old_obj, 'db_parent_type') and old_obj.db_parent_type is not None:
+            new_obj.db_parent_type = old_obj.db_parent_type
+        if 'parent_version' in class_dict:
+            res = class_dict['parent_version'](old_obj, trans_dict)
+            new_obj.db_parent_version = res
+        elif hasattr(old_obj, 'db_parent_version') and old_obj.db_parent_version is not None:
+            new_obj.db_parent_version = old_obj.db_parent_version
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_ip(self):
+        return self._db_ip
+    def __set_db_ip(self, ip):
+        self._db_ip = ip
+        self.is_dirty = True
+    db_ip = property(__get_db_ip, __set_db_ip)
+    def db_add_ip(self, ip):
+        self._db_ip = ip
+    def db_change_ip(self, ip):
+        self._db_ip = ip
+    def db_delete_ip(self, ip):
+        self._db_ip = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_vt_version(self):
+        return self._db_vt_version
+    def __set_db_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+        self.is_dirty = True
+    db_vt_version = property(__get_db_vt_version, __set_db_vt_version)
+    def db_add_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_change_vt_version(self, vt_version):
+        self._db_vt_version = vt_version
+    def db_delete_vt_version(self, vt_version):
+        self._db_vt_version = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_parent_id(self):
+        return self._db_parent_id
+    def __set_db_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+        self.is_dirty = True
+    db_parent_id = property(__get_db_parent_id, __set_db_parent_id)
+    def db_add_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_change_parent_id(self, parent_id):
+        self._db_parent_id = parent_id
+    def db_delete_parent_id(self, parent_id):
+        self._db_parent_id = None
+    
+    def __get_db_parent_type(self):
+        return self._db_parent_type
+    def __set_db_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+        self.is_dirty = True
+    db_parent_type = property(__get_db_parent_type, __set_db_parent_type)
+    def db_add_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_change_parent_type(self, parent_type):
+        self._db_parent_type = parent_type
+    def db_delete_parent_type(self, parent_type):
+        self._db_parent_type = None
+    
+    def __get_db_parent_version(self):
+        return self._db_parent_version
+    def __set_db_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+        self.is_dirty = True
+    db_parent_version = property(__get_db_parent_version, __set_db_parent_version)
+    def db_add_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_change_parent_version(self, parent_version):
+        self._db_parent_version = parent_version
+    def db_delete_parent_version(self, parent_version):
+        self._db_parent_version = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBParameterExploration(object):
+
+    vtType = 'parameter_exploration'
+
+    def __init__(self, id=None, action_id=None, name=None, date=None, user=None, dims=None, layout=None, functions=None):
+        self._db_id = id
+        self._db_action_id = action_id
+        self._db_name = name
+        self._db_date = date
+        self._db_user = user
+        self._db_dims = dims
+        self._db_layout = layout
+        self.db_deleted_functions = []
+        self.db_functions_id_index = {}
+        if functions is None:
+            self._db_functions = []
+        else:
+            self._db_functions = functions
+            for v in self._db_functions:
+                self.db_functions_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBParameterExploration.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBParameterExploration(id=self._db_id,
+                                    action_id=self._db_action_id,
+                                    name=self._db_name,
+                                    date=self._db_date,
+                                    user=self._db_user,
+                                    dims=self._db_dims,
+                                    layout=self._db_layout)
+        if self._db_functions is None:
+            cp._db_functions = []
+        else:
+            cp._db_functions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_functions]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_action_id') and ('action', self._db_action_id) in id_remap:
+                cp._db_action_id = id_remap[('action', self._db_action_id)]
+        
+        # recreate indices and set flags
+        cp.db_functions_id_index = dict((v.db_id, v) for v in cp._db_functions)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBParameterExploration()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'action_id' in class_dict:
+            res = class_dict['action_id'](old_obj, trans_dict)
+            new_obj.db_action_id = res
+        elif hasattr(old_obj, 'db_action_id') and old_obj.db_action_id is not None:
+            new_obj.db_action_id = old_obj.db_action_id
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'dims' in class_dict:
+            res = class_dict['dims'](old_obj, trans_dict)
+            new_obj.db_dims = res
+        elif hasattr(old_obj, 'db_dims') and old_obj.db_dims is not None:
+            new_obj.db_dims = old_obj.db_dims
+        if 'layout' in class_dict:
+            res = class_dict['layout'](old_obj, trans_dict)
+            new_obj.db_layout = res
+        elif hasattr(old_obj, 'db_layout') and old_obj.db_layout is not None:
+            new_obj.db_layout = old_obj.db_layout
+        if 'functions' in class_dict:
+            res = class_dict['functions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_function(obj)
+        elif hasattr(old_obj, 'db_functions') and old_obj.db_functions is not None:
+            for obj in old_obj.db_functions:
+                new_obj.db_add_function(DBPEFunction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_functions') and hasattr(new_obj, 'db_deleted_functions'):
+            for obj in old_obj.db_deleted_functions:
+                n_obj = DBPEFunction.update_version(obj, trans_dict)
+                new_obj.db_deleted_functions.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_functions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_function(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_functions)
+        if remove:
+            self.db_deleted_functions = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_functions:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_action_id(self):
+        return self._db_action_id
+    def __set_db_action_id(self, action_id):
+        self._db_action_id = action_id
+        self.is_dirty = True
+    db_action_id = property(__get_db_action_id, __set_db_action_id)
+    def db_add_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_change_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_delete_action_id(self, action_id):
+        self._db_action_id = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_dims(self):
+        return self._db_dims
+    def __set_db_dims(self, dims):
+        self._db_dims = dims
+        self.is_dirty = True
+    db_dims = property(__get_db_dims, __set_db_dims)
+    def db_add_dims(self, dims):
+        self._db_dims = dims
+    def db_change_dims(self, dims):
+        self._db_dims = dims
+    def db_delete_dims(self, dims):
+        self._db_dims = None
+    
+    def __get_db_layout(self):
+        return self._db_layout
+    def __set_db_layout(self, layout):
+        self._db_layout = layout
+        self.is_dirty = True
+    db_layout = property(__get_db_layout, __set_db_layout)
+    def db_add_layout(self, layout):
+        self._db_layout = layout
+    def db_change_layout(self, layout):
+        self._db_layout = layout
+    def db_delete_layout(self, layout):
+        self._db_layout = None
+    
+    def __get_db_functions(self):
+        return self._db_functions
+    def __set_db_functions(self, functions):
+        self._db_functions = functions
+        self.is_dirty = True
+    db_functions = property(__get_db_functions, __set_db_functions)
+    def db_get_functions(self):
+        return self._db_functions
+    def db_add_function(self, function):
+        self.is_dirty = True
+        self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_change_function(self, function):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                self._db_functions[i] = function
+                found = True
+                break
+        if not found:
+            self._db_functions.append(function)
+        self.db_functions_id_index[function.db_id] = function
+    def db_delete_function(self, function):
+        self.is_dirty = True
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == function.db_id:
+                if not self._db_functions[i].is_new:
+                    self.db_deleted_functions.append(self._db_functions[i])
+                del self._db_functions[i]
+                break
+        del self.db_functions_id_index[function.db_id]
+    def db_get_function(self, key):
+        for i in xrange(len(self._db_functions)):
+            if self._db_functions[i].db_id == key:
+                return self._db_functions[i]
+        return None
+    def db_get_function_by_id(self, key):
+        return self.db_functions_id_index[key]
+    def db_has_function_with_id(self, key):
+        return key in self.db_functions_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBLoopExec(object):
+
+    vtType = 'loop_exec'
+
+    def __init__(self, item_execs=None, id=None, ts_start=None, ts_end=None, iteration=None, completed=None, error=None):
+        self.db_deleted_item_execs = []
+        self.db_item_execs_id_index = {}
+        if item_execs is None:
+            self._db_item_execs = []
+        else:
+            self._db_item_execs = item_execs
+            for v in self._db_item_execs:
+                self.db_item_execs_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_iteration = iteration
+        self._db_completed = completed
+        self._db_error = error
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBLoopExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBLoopExec(id=self._db_id,
+                        ts_start=self._db_ts_start,
+                        ts_end=self._db_ts_end,
+                        iteration=self._db_iteration,
+                        completed=self._db_completed,
+                        error=self._db_error)
+        if self._db_item_execs is None:
+            cp._db_item_execs = []
+        else:
+            cp._db_item_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_item_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_item_execs_id_index = dict((v.db_id, v) for v in cp._db_item_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLoopExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'item_execs' in class_dict:
+            res = class_dict['item_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_item_exec(obj)
+        elif hasattr(old_obj, 'db_item_execs') and old_obj.db_item_execs is not None:
+            for obj in old_obj.db_item_execs:
+                if obj.vtType == 'module_exec':
+                    new_obj.db_add_item_exec(DBModuleExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'group_exec':
+                    new_obj.db_add_item_exec(DBGroupExec.update_version(obj, trans_dict))
+                elif obj.vtType == 'loop_exec':
+                    new_obj.db_add_item_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_item_execs') and hasattr(new_obj, 'db_deleted_item_execs'):
+            for obj in old_obj.db_deleted_item_execs:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_item_execs.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'iteration' in class_dict:
+            res = class_dict['iteration'](old_obj, trans_dict)
+            new_obj.db_iteration = res
+        elif hasattr(old_obj, 'db_iteration') and old_obj.db_iteration is not None:
+            new_obj.db_iteration = old_obj.db_iteration
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_item_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_item_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_item_execs)
+        if remove:
+            self.db_deleted_item_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_item_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_item_execs(self):
+        return self._db_item_execs
+    def __set_db_item_execs(self, item_execs):
+        self._db_item_execs = item_execs
+        self.is_dirty = True
+    db_item_execs = property(__get_db_item_execs, __set_db_item_execs)
+    def db_get_item_execs(self):
+        return self._db_item_execs
+    def db_add_item_exec(self, item_exec):
+        self.is_dirty = True
+        self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_change_item_exec(self, item_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                self._db_item_execs[i] = item_exec
+                found = True
+                break
+        if not found:
+            self._db_item_execs.append(item_exec)
+        self.db_item_execs_id_index[item_exec.db_id] = item_exec
+    def db_delete_item_exec(self, item_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == item_exec.db_id:
+                if not self._db_item_execs[i].is_new:
+                    self.db_deleted_item_execs.append(self._db_item_execs[i])
+                del self._db_item_execs[i]
+                break
+        del self.db_item_execs_id_index[item_exec.db_id]
+    def db_get_item_exec(self, key):
+        for i in xrange(len(self._db_item_execs)):
+            if self._db_item_execs[i].db_id == key:
+                return self._db_item_execs[i]
+        return None
+    def db_get_item_exec_by_id(self, key):
+        return self.db_item_execs_id_index[key]
+    def db_has_item_exec_with_id(self, key):
+        return key in self.db_item_execs_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_iteration(self):
+        return self._db_iteration
+    def __set_db_iteration(self, iteration):
+        self._db_iteration = iteration
+        self.is_dirty = True
+    db_iteration = property(__get_db_iteration, __set_db_iteration)
+    def db_add_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_change_iteration(self, iteration):
+        self._db_iteration = iteration
+    def db_delete_iteration(self, iteration):
+        self._db_iteration = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmWasTriggeredBy(object):
+
+    vtType = 'opm_was_triggered_by'
+
+    def __init__(self, effect=None, role=None, cause=None, accounts=None, opm_times=None):
+        self.db_deleted_effect = []
+        self._db_effect = effect
+        self.db_deleted_role = []
+        self._db_role = role
+        self.db_deleted_cause = []
+        self._db_cause = cause
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.db_deleted_opm_times = []
+        if opm_times is None:
+            self._db_opm_times = []
+        else:
+            self._db_opm_times = opm_times
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmWasTriggeredBy.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmWasTriggeredBy()
+        if self._db_effect is not None:
+            cp._db_effect = self._db_effect.do_copy(new_ids, id_scope, id_remap)
+        if self._db_role is not None:
+            cp._db_role = self._db_role.do_copy(new_ids, id_scope, id_remap)
+        if self._db_cause is not None:
+            cp._db_cause = self._db_cause.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        if self._db_opm_times is None:
+            cp._db_opm_times = []
+        else:
+            cp._db_opm_times = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_opm_times]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmWasTriggeredBy()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'effect' in class_dict:
+            res = class_dict['effect'](old_obj, trans_dict)
+            new_obj.db_effect = res
+        elif hasattr(old_obj, 'db_effect') and old_obj.db_effect is not None:
+            obj = old_obj.db_effect
+            new_obj.db_add_effect(DBOpmProcessIdEffect.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_effect') and hasattr(new_obj, 'db_deleted_effect'):
+            for obj in old_obj.db_deleted_effect:
+                n_obj = DBOpmProcessIdEffect.update_version(obj, trans_dict)
+                new_obj.db_deleted_effect.append(n_obj)
+        if 'role' in class_dict:
+            res = class_dict['role'](old_obj, trans_dict)
+            new_obj.db_role = res
+        elif hasattr(old_obj, 'db_role') and old_obj.db_role is not None:
+            obj = old_obj.db_role
+            new_obj.db_add_role(DBOpmRole.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_role') and hasattr(new_obj, 'db_deleted_role'):
+            for obj in old_obj.db_deleted_role:
+                n_obj = DBOpmRole.update_version(obj, trans_dict)
+                new_obj.db_deleted_role.append(n_obj)
+        if 'cause' in class_dict:
+            res = class_dict['cause'](old_obj, trans_dict)
+            new_obj.db_cause = res
+        elif hasattr(old_obj, 'db_cause') and old_obj.db_cause is not None:
+            obj = old_obj.db_cause
+            new_obj.db_add_cause(DBOpmProcessIdCause.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_cause') and hasattr(new_obj, 'db_deleted_cause'):
+            for obj in old_obj.db_deleted_cause:
+                n_obj = DBOpmProcessIdCause.update_version(obj, trans_dict)
+                new_obj.db_deleted_cause.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        if 'opm_times' in class_dict:
+            res = class_dict['opm_times'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_opm_time(obj)
+        elif hasattr(old_obj, 'db_opm_times') and old_obj.db_opm_times is not None:
+            for obj in old_obj.db_opm_times:
+                new_obj.db_add_opm_time(DBOpmTime.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_opm_times') and hasattr(new_obj, 'db_deleted_opm_times'):
+            for obj in old_obj.db_deleted_opm_times:
+                n_obj = DBOpmTime.update_version(obj, trans_dict)
+                new_obj.db_deleted_opm_times.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_effect is not None:
+            children.extend(self._db_effect.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_effect = None
+        if self._db_role is not None:
+            children.extend(self._db_role.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_role = None
+        if self._db_cause is not None:
+            children.extend(self._db_cause.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_cause = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        to_del = []
+        for child in self.db_opm_times:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_opm_time(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_effect)
+        children.extend(self.db_deleted_role)
+        children.extend(self.db_deleted_cause)
+        children.extend(self.db_deleted_accounts)
+        children.extend(self.db_deleted_opm_times)
+        if remove:
+            self.db_deleted_effect = []
+            self.db_deleted_role = []
+            self.db_deleted_cause = []
+            self.db_deleted_accounts = []
+            self.db_deleted_opm_times = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_effect is not None and self._db_effect.has_changes():
+            return True
+        if self._db_role is not None and self._db_role.has_changes():
+            return True
+        if self._db_cause is not None and self._db_cause.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        for child in self._db_opm_times:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_effect(self):
+        return self._db_effect
+    def __set_db_effect(self, effect):
+        self._db_effect = effect
+        self.is_dirty = True
+    db_effect = property(__get_db_effect, __set_db_effect)
+    def db_add_effect(self, effect):
+        self._db_effect = effect
+    def db_change_effect(self, effect):
+        self._db_effect = effect
+    def db_delete_effect(self, effect):
+        if not self.is_new:
+            self.db_deleted_effect.append(self._db_effect)
+        self._db_effect = None
+    
+    def __get_db_role(self):
+        return self._db_role
+    def __set_db_role(self, role):
+        self._db_role = role
+        self.is_dirty = True
+    db_role = property(__get_db_role, __set_db_role)
+    def db_add_role(self, role):
+        self._db_role = role
+    def db_change_role(self, role):
+        self._db_role = role
+    def db_delete_role(self, role):
+        if not self.is_new:
+            self.db_deleted_role.append(self._db_role)
+        self._db_role = None
+    
+    def __get_db_cause(self):
+        return self._db_cause
+    def __set_db_cause(self, cause):
+        self._db_cause = cause
+        self.is_dirty = True
+    db_cause = property(__get_db_cause, __set_db_cause)
+    def db_add_cause(self, cause):
+        self._db_cause = cause
+    def db_change_cause(self, cause):
+        self._db_cause = cause
+    def db_delete_cause(self, cause):
+        if not self.is_new:
+            self.db_deleted_cause.append(self._db_cause)
+        self._db_cause = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def __get_db_opm_times(self):
+        return self._db_opm_times
+    def __set_db_opm_times(self, opm_times):
+        self._db_opm_times = opm_times
+        self.is_dirty = True
+    db_opm_times = property(__get_db_opm_times, __set_db_opm_times)
+    def db_get_opm_times(self):
+        return self._db_opm_times
+    def db_add_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_change_opm_time(self, opm_time):
+        self.is_dirty = True
+        self._db_opm_times.append(opm_time)
+    def db_delete_opm_time(self, opm_time):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_opm_time(self, key):
+        return None
+    
+
+
+class DBMashupActionAnnotation(object):
+
+    vtType = 'mashup_actionAnnotation'
+
+    def __init__(self, id=None, key=None, value=None, action_id=None, date=None, user=None):
+        self._db_id = id
+        self._db_key = key
+        self._db_value = value
+        self._db_action_id = action_id
+        self._db_date = date
+        self._db_user = user
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBMashupActionAnnotation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBMashupActionAnnotation(id=self._db_id,
+                                      key=self._db_key,
+                                      value=self._db_value,
+                                      action_id=self._db_action_id,
+                                      date=self._db_date,
+                                      user=self._db_user)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_action_id') and ('mashup_action', self._db_action_id) in id_remap:
+                cp._db_action_id = id_remap[('mashup_action', self._db_action_id)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBMashupActionAnnotation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'key' in class_dict:
+            res = class_dict['key'](old_obj, trans_dict)
+            new_obj.db_key = res
+        elif hasattr(old_obj, 'db_key') and old_obj.db_key is not None:
+            new_obj.db_key = old_obj.db_key
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'action_id' in class_dict:
+            res = class_dict['action_id'](old_obj, trans_dict)
+            new_obj.db_action_id = res
+        elif hasattr(old_obj, 'db_action_id') and old_obj.db_action_id is not None:
+            new_obj.db_action_id = old_obj.db_action_id
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_key(self):
+        return self._db_key
+    def __set_db_key(self, key):
+        self._db_key = key
+        self.is_dirty = True
+    db_key = property(__get_db_key, __set_db_key)
+    def db_add_key(self, key):
+        self._db_key = key
+    def db_change_key(self, key):
+        self._db_key = key
+    def db_delete_key(self, key):
+        self._db_key = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_action_id(self):
+        return self._db_action_id
+    def __set_db_action_id(self, action_id):
+        self._db_action_id = action_id
+        self.is_dirty = True
+    db_action_id = property(__get_db_action_id, __set_db_action_id)
+    def db_add_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_change_action_id(self, action_id):
+        self._db_action_id = action_id
+    def db_delete_action_id(self, action_id):
+        self._db_action_id = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBConnection(object):
+
+    vtType = 'connection'
+
+    def __init__(self, id=None, ports=None):
+        self._db_id = id
+        self.db_deleted_ports = []
+        self.db_ports_id_index = {}
+        self.db_ports_type_index = {}
+        if ports is None:
+            self._db_ports = []
+        else:
+            self._db_ports = ports
+            for v in self._db_ports:
+                self.db_ports_id_index[v.db_id] = v
+                self.db_ports_type_index[v.db_type] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBConnection.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBConnection(id=self._db_id)
+        if self._db_ports is None:
+            cp._db_ports = []
+        else:
+            cp._db_ports = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_ports]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_ports_id_index = dict((v.db_id, v) for v in cp._db_ports)
+        cp.db_ports_type_index = dict((v.db_type, v) for v in cp._db_ports)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBConnection()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ports' in class_dict:
+            res = class_dict['ports'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_port(obj)
+        elif hasattr(old_obj, 'db_ports') and old_obj.db_ports is not None:
+            for obj in old_obj.db_ports:
+                new_obj.db_add_port(DBPort.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_ports') and hasattr(new_obj, 'db_deleted_ports'):
+            for obj in old_obj.db_deleted_ports:
+                n_obj = DBPort.update_version(obj, trans_dict)
+                new_obj.db_deleted_ports.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_ports:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_port(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_ports)
+        if remove:
+            self.db_deleted_ports = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_ports:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ports(self):
+        return self._db_ports
+    def __set_db_ports(self, ports):
+        self._db_ports = ports
+        self.is_dirty = True
+    db_ports = property(__get_db_ports, __set_db_ports)
+    def db_get_ports(self):
+        return self._db_ports
+    def db_add_port(self, port):
+        self.is_dirty = True
+        self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_change_port(self, port):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                self._db_ports[i] = port
+                found = True
+                break
+        if not found:
+            self._db_ports.append(port)
+        self.db_ports_id_index[port.db_id] = port
+        self.db_ports_type_index[port.db_type] = port
+    def db_delete_port(self, port):
+        self.is_dirty = True
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == port.db_id:
+                if not self._db_ports[i].is_new:
+                    self.db_deleted_ports.append(self._db_ports[i])
+                del self._db_ports[i]
+                break
+        del self.db_ports_id_index[port.db_id]
+        del self.db_ports_type_index[port.db_type]
+    def db_get_port(self, key):
+        for i in xrange(len(self._db_ports)):
+            if self._db_ports[i].db_id == key:
+                return self._db_ports[i]
+        return None
+    def db_get_port_by_id(self, key):
+        return self.db_ports_id_index[key]
+    def db_has_port_with_id(self, key):
+        return key in self.db_ports_id_index
+    def db_get_port_by_type(self, key):
+        return self.db_ports_type_index[key]
+    def db_has_port_with_type(self, key):
+        return key in self.db_ports_type_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcess(object):
+
+    vtType = 'opm_process'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self.db_deleted_value = []
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcess.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcess(id=self._db_id)
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcess()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            new_obj.db_add_value(DBOpmProcessValue.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                n_obj = DBOpmProcessValue.update_version(obj, trans_dict)
+                new_obj.db_deleted_value.append(n_obj)
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_value = None
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_value = []
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBIsPartOf(object):
+
+    vtType = 'is_part_of'
+
+    def __init__(self, prov_ref=None):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBIsPartOf.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBIsPartOf(prov_ref=self._db_prov_ref)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBIsPartOf()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_ref' in class_dict:
+            res = class_dict['prov_ref'](old_obj, trans_dict)
+            new_obj.db_prov_ref = res
+        elif hasattr(old_obj, 'db_prov_ref') and old_obj.db_prov_ref is not None:
+            new_obj.db_prov_ref = old_obj.db_prov_ref
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_prov_ref(self):
+        return self._db_prov_ref
+    def __set_db_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+        self.is_dirty = True
+    db_prov_ref = property(__get_db_prov_ref, __set_db_prov_ref)
+    def db_add_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_change_prov_ref(self, prov_ref):
+        self._db_prov_ref = prov_ref
+    def db_delete_prov_ref(self, prov_ref):
+        self._db_prov_ref = None
+    
+
+
+class DBPEFunction(object):
+
+    vtType = 'pe_function'
+
+    def __init__(self, id=None, module_id=None, port_name=None, is_alias=None, parameters=None):
+        self._db_id = id
+        self._db_module_id = module_id
+        self._db_port_name = port_name
+        self._db_is_alias = is_alias
+        self.db_deleted_parameters = []
+        self.db_parameters_id_index = {}
+        if parameters is None:
+            self._db_parameters = []
+        else:
+            self._db_parameters = parameters
+            for v in self._db_parameters:
+                self.db_parameters_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBPEFunction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBPEFunction(id=self._db_id,
+                          module_id=self._db_module_id,
+                          port_name=self._db_port_name,
+                          is_alias=self._db_is_alias)
+        if self._db_parameters is None:
+            cp._db_parameters = []
+        else:
+            cp._db_parameters = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameters]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+        
+        # recreate indices and set flags
+        cp.db_parameters_id_index = dict((v.db_id, v) for v in cp._db_parameters)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBPEFunction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'port_name' in class_dict:
+            res = class_dict['port_name'](old_obj, trans_dict)
+            new_obj.db_port_name = res
+        elif hasattr(old_obj, 'db_port_name') and old_obj.db_port_name is not None:
+            new_obj.db_port_name = old_obj.db_port_name
+        if 'is_alias' in class_dict:
+            res = class_dict['is_alias'](old_obj, trans_dict)
+            new_obj.db_is_alias = res
+        elif hasattr(old_obj, 'db_is_alias') and old_obj.db_is_alias is not None:
+            new_obj.db_is_alias = old_obj.db_is_alias
+        if 'parameters' in class_dict:
+            res = class_dict['parameters'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter(obj)
+        elif hasattr(old_obj, 'db_parameters') and old_obj.db_parameters is not None:
+            for obj in old_obj.db_parameters:
+                new_obj.db_add_parameter(DBPEParameter.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameters') and hasattr(new_obj, 'db_deleted_parameters'):
+            for obj in old_obj.db_deleted_parameters:
+                n_obj = DBPEParameter.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameters.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_parameters:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_parameters)
+        if remove:
+            self.db_deleted_parameters = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_parameters:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_port_name(self):
+        return self._db_port_name
+    def __set_db_port_name(self, port_name):
+        self._db_port_name = port_name
+        self.is_dirty = True
+    db_port_name = property(__get_db_port_name, __set_db_port_name)
+    def db_add_port_name(self, port_name):
+        self._db_port_name = port_name
+    def db_change_port_name(self, port_name):
+        self._db_port_name = port_name
+    def db_delete_port_name(self, port_name):
+        self._db_port_name = None
+    
+    def __get_db_is_alias(self):
+        return self._db_is_alias
+    def __set_db_is_alias(self, is_alias):
+        self._db_is_alias = is_alias
+        self.is_dirty = True
+    db_is_alias = property(__get_db_is_alias, __set_db_is_alias)
+    def db_add_is_alias(self, is_alias):
+        self._db_is_alias = is_alias
+    def db_change_is_alias(self, is_alias):
+        self._db_is_alias = is_alias
+    def db_delete_is_alias(self, is_alias):
+        self._db_is_alias = None
+    
+    def __get_db_parameters(self):
+        return self._db_parameters
+    def __set_db_parameters(self, parameters):
+        self._db_parameters = parameters
+        self.is_dirty = True
+    db_parameters = property(__get_db_parameters, __set_db_parameters)
+    def db_get_parameters(self):
+        return self._db_parameters
+    def db_add_parameter(self, parameter):
+        self.is_dirty = True
+        self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_change_parameter(self, parameter):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                self._db_parameters[i] = parameter
+                found = True
+                break
+        if not found:
+            self._db_parameters.append(parameter)
+        self.db_parameters_id_index[parameter.db_id] = parameter
+    def db_delete_parameter(self, parameter):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == parameter.db_id:
+                if not self._db_parameters[i].is_new:
+                    self.db_deleted_parameters.append(self._db_parameters[i])
+                del self._db_parameters[i]
+                break
+        del self.db_parameters_id_index[parameter.db_id]
+    def db_get_parameter(self, key):
+        for i in xrange(len(self._db_parameters)):
+            if self._db_parameters[i].db_id == key:
+                return self._db_parameters[i]
+        return None
+    def db_get_parameter_by_id(self, key):
+        return self.db_parameters_id_index[key]
+    def db_has_parameter_with_id(self, key):
+        return key in self.db_parameters_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmProcessValue(object):
+
+    vtType = 'opm_process_value'
+
+    def __init__(self, value=None):
+        self.db_deleted_value = []
+        self._db_value = value
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmProcessValue.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmProcessValue()
+        if self._db_value is not None:
+            cp._db_value = self._db_value.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmProcessValue()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            obj = old_obj.db_value
+            if obj.vtType == 'module_exec':
+                new_obj.db_add_value(DBModuleExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'group_exec':
+                new_obj.db_add_value(DBGroupExec.update_version(obj, trans_dict))
+            elif obj.vtType == 'loop_exec':
+                new_obj.db_add_value(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_value') and hasattr(new_obj, 'db_deleted_value'):
+            for obj in old_obj.db_deleted_value:
+                if obj.vtType == 'module_exec':
+                    n_obj = DBModuleExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'group_exec':
+                    n_obj = DBGroupExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+                elif obj.vtType == 'loop_exec':
+                    n_obj = DBLoopExec.update_version(obj, trans_dict)
+                    new_obj.db_deleted_value.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_value is not None:
+            children.extend(self._db_value.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_value = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_value)
+        if remove:
+            self.db_deleted_value = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_value is not None and self._db_value.has_changes():
+            return True
+        return False
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        if not self.is_new:
+            self.db_deleted_value.append(self._db_value)
+        self._db_value = None
+    
+
+
+class DBAction(object):
+
+    vtType = 'action'
+
+    def __init__(self, operations=None, id=None, prevId=None, date=None, session=None, user=None, annotations=None):
+        self.db_deleted_operations = []
+        self.db_operations_id_index = {}
+        if operations is None:
+            self._db_operations = []
+        else:
+            self._db_operations = operations
+            for v in self._db_operations:
+                self.db_operations_id_index[v.db_id] = v
+        self._db_id = id
+        self._db_prevId = prevId
+        self._db_date = date
+        self._db_session = session
+        self._db_user = user
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBAction.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBAction(id=self._db_id,
+                      prevId=self._db_prevId,
+                      date=self._db_date,
+                      session=self._db_session,
+                      user=self._db_user)
+        if self._db_operations is None:
+            cp._db_operations = []
+        else:
+            cp._db_operations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_operations]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_prevId') and ('action', self._db_prevId) in id_remap:
+                cp._db_prevId = id_remap[('action', self._db_prevId)]
+        
+        # recreate indices and set flags
+        cp.db_operations_id_index = dict((v.db_id, v) for v in cp._db_operations)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBAction()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'operations' in class_dict:
+            res = class_dict['operations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_operation(obj)
+        elif hasattr(old_obj, 'db_operations') and old_obj.db_operations is not None:
+            for obj in old_obj.db_operations:
+                if obj.vtType == 'add':
+                    new_obj.db_add_operation(DBAdd.update_version(obj, trans_dict))
+                elif obj.vtType == 'delete':
+                    new_obj.db_add_operation(DBDelete.update_version(obj, trans_dict))
+                elif obj.vtType == 'change':
+                    new_obj.db_add_operation(DBChange.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_operations') and hasattr(new_obj, 'db_deleted_operations'):
+            for obj in old_obj.db_deleted_operations:
+                if obj.vtType == 'add':
+                    n_obj = DBAdd.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'delete':
+                    n_obj = DBDelete.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+                elif obj.vtType == 'change':
+                    n_obj = DBChange.update_version(obj, trans_dict)
+                    new_obj.db_deleted_operations.append(n_obj)
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'prevId' in class_dict:
+            res = class_dict['prevId'](old_obj, trans_dict)
+            new_obj.db_prevId = res
+        elif hasattr(old_obj, 'db_prevId') and old_obj.db_prevId is not None:
+            new_obj.db_prevId = old_obj.db_prevId
+        if 'date' in class_dict:
+            res = class_dict['date'](old_obj, trans_dict)
+            new_obj.db_date = res
+        elif hasattr(old_obj, 'db_date') and old_obj.db_date is not None:
+            new_obj.db_date = old_obj.db_date
+        if 'session' in class_dict:
+            res = class_dict['session'](old_obj, trans_dict)
+            new_obj.db_session = res
+        elif hasattr(old_obj, 'db_session') and old_obj.db_session is not None:
+            new_obj.db_session = old_obj.db_session
+        if 'user' in class_dict:
+            res = class_dict['user'](old_obj, trans_dict)
+            new_obj.db_user = res
+        elif hasattr(old_obj, 'db_user') and old_obj.db_user is not None:
+            new_obj.db_user = old_obj.db_user
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_operations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_operation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_operations)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_operations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_operations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_operations(self):
+        return self._db_operations
+    def __set_db_operations(self, operations):
+        self._db_operations = operations
+        self.is_dirty = True
+    db_operations = property(__get_db_operations, __set_db_operations)
+    def db_get_operations(self):
+        return self._db_operations
+    def db_add_operation(self, operation):
+        self.is_dirty = True
+        self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_change_operation(self, operation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                self._db_operations[i] = operation
+                found = True
+                break
+        if not found:
+            self._db_operations.append(operation)
+        self.db_operations_id_index[operation.db_id] = operation
+    def db_delete_operation(self, operation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == operation.db_id:
+                if not self._db_operations[i].is_new:
+                    self.db_deleted_operations.append(self._db_operations[i])
+                del self._db_operations[i]
+                break
+        del self.db_operations_id_index[operation.db_id]
+    def db_get_operation(self, key):
+        for i in xrange(len(self._db_operations)):
+            if self._db_operations[i].db_id == key:
+                return self._db_operations[i]
+        return None
+    def db_get_operation_by_id(self, key):
+        return self.db_operations_id_index[key]
+    def db_has_operation_with_id(self, key):
+        return key in self.db_operations_id_index
+    
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_prevId(self):
+        return self._db_prevId
+    def __set_db_prevId(self, prevId):
+        self._db_prevId = prevId
+        self.is_dirty = True
+    db_prevId = property(__get_db_prevId, __set_db_prevId)
+    def db_add_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_change_prevId(self, prevId):
+        self._db_prevId = prevId
+    def db_delete_prevId(self, prevId):
+        self._db_prevId = None
+    
+    def __get_db_date(self):
+        return self._db_date
+    def __set_db_date(self, date):
+        self._db_date = date
+        self.is_dirty = True
+    db_date = property(__get_db_date, __set_db_date)
+    def db_add_date(self, date):
+        self._db_date = date
+    def db_change_date(self, date):
+        self._db_date = date
+    def db_delete_date(self, date):
+        self._db_date = None
+    
+    def __get_db_session(self):
+        return self._db_session
+    def __set_db_session(self, session):
+        self._db_session = session
+        self.is_dirty = True
+    db_session = property(__get_db_session, __set_db_session)
+    def db_add_session(self, session):
+        self._db_session = session
+    def db_change_session(self, session):
+        self._db_session = session
+    def db_delete_session(self, session):
+        self._db_session = None
+    
+    def __get_db_user(self):
+        return self._db_user
+    def __set_db_user(self, user):
+        self._db_user = user
+        self.is_dirty = True
+    db_user = property(__get_db_user, __set_db_user)
+    def db_add_user(self, user):
+        self._db_user = user
+    def db_change_user(self, user):
+        self._db_user = user
+    def db_delete_user(self, user):
+        self._db_user = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBOpmAgent(object):
+
+    vtType = 'opm_agent'
+
+    def __init__(self, id=None, value=None, accounts=None):
+        self._db_id = id
+        self._db_value = value
+        self.db_deleted_accounts = []
+        if accounts is None:
+            self._db_accounts = []
+        else:
+            self._db_accounts = accounts
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBOpmAgent.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBOpmAgent(id=self._db_id,
+                        value=self._db_value)
+        if self._db_accounts is None:
+            cp._db_accounts = []
+        else:
+            cp._db_accounts = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_accounts]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBOpmAgent()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'value' in class_dict:
+            res = class_dict['value'](old_obj, trans_dict)
+            new_obj.db_value = res
+        elif hasattr(old_obj, 'db_value') and old_obj.db_value is not None:
+            new_obj.db_value = old_obj.db_value
+        if 'accounts' in class_dict:
+            res = class_dict['accounts'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_account(obj)
+        elif hasattr(old_obj, 'db_accounts') and old_obj.db_accounts is not None:
+            for obj in old_obj.db_accounts:
+                new_obj.db_add_account(DBOpmAccountId.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_accounts') and hasattr(new_obj, 'db_deleted_accounts'):
+            for obj in old_obj.db_deleted_accounts:
+                n_obj = DBOpmAccountId.update_version(obj, trans_dict)
+                new_obj.db_deleted_accounts.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_accounts:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_account(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_accounts)
+        if remove:
+            self.db_deleted_accounts = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_accounts:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_value(self):
+        return self._db_value
+    def __set_db_value(self, value):
+        self._db_value = value
+        self.is_dirty = True
+    db_value = property(__get_db_value, __set_db_value)
+    def db_add_value(self, value):
+        self._db_value = value
+    def db_change_value(self, value):
+        self._db_value = value
+    def db_delete_value(self, value):
+        self._db_value = None
+    
+    def __get_db_accounts(self):
+        return self._db_accounts
+    def __set_db_accounts(self, accounts):
+        self._db_accounts = accounts
+        self.is_dirty = True
+    db_accounts = property(__get_db_accounts, __set_db_accounts)
+    def db_get_accounts(self):
+        return self._db_accounts
+    def db_add_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_change_account(self, account):
+        self.is_dirty = True
+        self._db_accounts.append(account)
+    def db_delete_account(self, account):
+        self.is_dirty = True
+        raise Exception('Cannot delete a non-keyed object')
+    def db_get_account(self, key):
+        return None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBDelete(object):
+
+    vtType = 'delete'
+
+    def __init__(self, id=None, what=None, objectId=None, parentObjId=None, parentObjType=None):
+        self._db_id = id
+        self._db_what = what
+        self._db_objectId = objectId
+        self._db_parentObjId = parentObjId
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBDelete.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBDelete(id=self._db_id,
+                      what=self._db_what,
+                      objectId=self._db_objectId,
+                      parentObjId=self._db_parentObjId,
+                      parentObjType=self._db_parentObjType)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_objectId') and (self._db_what, self._db_objectId) in id_remap:
+                cp._db_objectId = id_remap[(self._db_what, self._db_objectId)]
+            if hasattr(self, 'db_parentObjId') and (self._db_parentObjType, self._db_parentObjId) in id_remap:
+                cp._db_parentObjId = id_remap[(self._db_parentObjType, self._db_parentObjId)]
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBDelete()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'what' in class_dict:
+            res = class_dict['what'](old_obj, trans_dict)
+            new_obj.db_what = res
+        elif hasattr(old_obj, 'db_what') and old_obj.db_what is not None:
+            new_obj.db_what = old_obj.db_what
+        if 'objectId' in class_dict:
+            res = class_dict['objectId'](old_obj, trans_dict)
+            new_obj.db_objectId = res
+        elif hasattr(old_obj, 'db_objectId') and old_obj.db_objectId is not None:
+            new_obj.db_objectId = old_obj.db_objectId
+        if 'parentObjId' in class_dict:
+            res = class_dict['parentObjId'](old_obj, trans_dict)
+            new_obj.db_parentObjId = res
+        elif hasattr(old_obj, 'db_parentObjId') and old_obj.db_parentObjId is not None:
+            new_obj.db_parentObjId = old_obj.db_parentObjId
+        if 'parentObjType' in class_dict:
+            res = class_dict['parentObjType'](old_obj, trans_dict)
+            new_obj.db_parentObjType = res
+        elif hasattr(old_obj, 'db_parentObjType') and old_obj.db_parentObjType is not None:
+            new_obj.db_parentObjType = old_obj.db_parentObjType
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        return [(self, parent[0], parent[1])]
+    def db_deleted_children(self, remove=False):
+        children = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_what(self):
+        return self._db_what
+    def __set_db_what(self, what):
+        self._db_what = what
+        self.is_dirty = True
+    db_what = property(__get_db_what, __set_db_what)
+    def db_add_what(self, what):
+        self._db_what = what
+    def db_change_what(self, what):
+        self._db_what = what
+    def db_delete_what(self, what):
+        self._db_what = None
+    
+    def __get_db_objectId(self):
+        return self._db_objectId
+    def __set_db_objectId(self, objectId):
+        self._db_objectId = objectId
+        self.is_dirty = True
+    db_objectId = property(__get_db_objectId, __set_db_objectId)
+    def db_add_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_change_objectId(self, objectId):
+        self._db_objectId = objectId
+    def db_delete_objectId(self, objectId):
+        self._db_objectId = None
+    
+    def __get_db_parentObjId(self):
+        return self._db_parentObjId
+    def __set_db_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+        self.is_dirty = True
+    db_parentObjId = property(__get_db_parentObjId, __set_db_parentObjId)
+    def db_add_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_change_parentObjId(self, parentObjId):
+        self._db_parentObjId = parentObjId
+    def db_delete_parentObjId(self, parentObjId):
+        self._db_parentObjId = None
+    
+    def __get_db_parentObjType(self):
+        return self._db_parentObjType
+    def __set_db_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+        self.is_dirty = True
+    db_parentObjType = property(__get_db_parentObjType, __set_db_parentObjType)
+    def db_add_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_change_parentObjType(self, parentObjType):
+        self._db_parentObjType = parentObjType
+    def db_delete_parentObjType(self, parentObjType):
+        self._db_parentObjType = None
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBProvAssociation(object):
+
+    vtType = 'prov_association'
+
+    def __init__(self, prov_activity=None, prov_agent=None, prov_plan=None, prov_role=None):
+        self.db_deleted_prov_activity = []
+        self._db_prov_activity = prov_activity
+        self.db_deleted_prov_agent = []
+        self._db_prov_agent = prov_agent
+        self.db_deleted_prov_plan = []
+        self._db_prov_plan = prov_plan
+        self._db_prov_role = prov_role
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBProvAssociation.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBProvAssociation(prov_role=self._db_prov_role)
+        if self._db_prov_activity is not None:
+            cp._db_prov_activity = self._db_prov_activity.do_copy(new_ids, id_scope, id_remap)
+        if self._db_prov_agent is not None:
+            cp._db_prov_agent = self._db_prov_agent.do_copy(new_ids, id_scope, id_remap)
+        if self._db_prov_plan is not None:
+            cp._db_prov_plan = self._db_prov_plan.do_copy(new_ids, id_scope, id_remap)
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBProvAssociation()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'prov_activity' in class_dict:
+            res = class_dict['prov_activity'](old_obj, trans_dict)
+            new_obj.db_prov_activity = res
+        elif hasattr(old_obj, 'db_prov_activity') and old_obj.db_prov_activity is not None:
+            obj = old_obj.db_prov_activity
+            new_obj.db_add_prov_activity(DBRefProvActivity.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_activity') and hasattr(new_obj, 'db_deleted_prov_activity'):
+            for obj in old_obj.db_deleted_prov_activity:
+                n_obj = DBRefProvActivity.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_activity.append(n_obj)
+        if 'prov_agent' in class_dict:
+            res = class_dict['prov_agent'](old_obj, trans_dict)
+            new_obj.db_prov_agent = res
+        elif hasattr(old_obj, 'db_prov_agent') and old_obj.db_prov_agent is not None:
+            obj = old_obj.db_prov_agent
+            new_obj.db_add_prov_agent(DBRefProvAgent.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_agent') and hasattr(new_obj, 'db_deleted_prov_agent'):
+            for obj in old_obj.db_deleted_prov_agent:
+                n_obj = DBRefProvAgent.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_agent.append(n_obj)
+        if 'prov_plan' in class_dict:
+            res = class_dict['prov_plan'](old_obj, trans_dict)
+            new_obj.db_prov_plan = res
+        elif hasattr(old_obj, 'db_prov_plan') and old_obj.db_prov_plan is not None:
+            obj = old_obj.db_prov_plan
+            new_obj.db_add_prov_plan(DBRefProvPlan.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_prov_plan') and hasattr(new_obj, 'db_deleted_prov_plan'):
+            for obj in old_obj.db_deleted_prov_plan:
+                n_obj = DBRefProvPlan.update_version(obj, trans_dict)
+                new_obj.db_deleted_prov_plan.append(n_obj)
+        if 'prov_role' in class_dict:
+            res = class_dict['prov_role'](old_obj, trans_dict)
+            new_obj.db_prov_role = res
+        elif hasattr(old_obj, 'db_prov_role') and old_obj.db_prov_role is not None:
+            new_obj.db_prov_role = old_obj.db_prov_role
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        if self._db_prov_activity is not None:
+            children.extend(self._db_prov_activity.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_activity = None
+        if self._db_prov_agent is not None:
+            children.extend(self._db_prov_agent.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_agent = None
+        if self._db_prov_plan is not None:
+            children.extend(self._db_prov_plan.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                self._db_prov_plan = None
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_prov_activity)
+        children.extend(self.db_deleted_prov_agent)
+        children.extend(self.db_deleted_prov_plan)
+        if remove:
+            self.db_deleted_prov_activity = []
+            self.db_deleted_prov_agent = []
+            self.db_deleted_prov_plan = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        if self._db_prov_activity is not None and self._db_prov_activity.has_changes():
+            return True
+        if self._db_prov_agent is not None and self._db_prov_agent.has_changes():
+            return True
+        if self._db_prov_plan is not None and self._db_prov_plan.has_changes():
+            return True
+        return False
+    def __get_db_prov_activity(self):
+        return self._db_prov_activity
+    def __set_db_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+        self.is_dirty = True
+    db_prov_activity = property(__get_db_prov_activity, __set_db_prov_activity)
+    def db_add_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+    def db_change_prov_activity(self, prov_activity):
+        self._db_prov_activity = prov_activity
+    def db_delete_prov_activity(self, prov_activity):
+        if not self.is_new:
+            self.db_deleted_prov_activity.append(self._db_prov_activity)
+        self._db_prov_activity = None
+    
+    def __get_db_prov_agent(self):
+        return self._db_prov_agent
+    def __set_db_prov_agent(self, prov_agent):
+        self._db_prov_agent = prov_agent
+        self.is_dirty = True
+    db_prov_agent = property(__get_db_prov_agent, __set_db_prov_agent)
+    def db_add_prov_agent(self, prov_agent):
+        self._db_prov_agent = prov_agent
+    def db_change_prov_agent(self, prov_agent):
+        self._db_prov_agent = prov_agent
+    def db_delete_prov_agent(self, prov_agent):
+        if not self.is_new:
+            self.db_deleted_prov_agent.append(self._db_prov_agent)
+        self._db_prov_agent = None
+    
+    def __get_db_prov_plan(self):
+        return self._db_prov_plan
+    def __set_db_prov_plan(self, prov_plan):
+        self._db_prov_plan = prov_plan
+        self.is_dirty = True
+    db_prov_plan = property(__get_db_prov_plan, __set_db_prov_plan)
+    def db_add_prov_plan(self, prov_plan):
+        self._db_prov_plan = prov_plan
+    def db_change_prov_plan(self, prov_plan):
+        self._db_prov_plan = prov_plan
+    def db_delete_prov_plan(self, prov_plan):
+        if not self.is_new:
+            self.db_deleted_prov_plan.append(self._db_prov_plan)
+        self._db_prov_plan = None
+    
+    def __get_db_prov_role(self):
+        return self._db_prov_role
+    def __set_db_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+        self.is_dirty = True
+    db_prov_role = property(__get_db_prov_role, __set_db_prov_role)
+    def db_add_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+    def db_change_prov_role(self, prov_role):
+        self._db_prov_role = prov_role
+    def db_delete_prov_role(self, prov_role):
+        self._db_prov_role = None
+    
+
+
+class DBVistrail(object):
+
+    vtType = 'vistrail'
+
+    def __init__(self, id=None, entity_type=None, version=None, name=None, last_modified=None, actions=None, tags=None, annotations=None, vistrailVariables=None, parameter_explorations=None, actionAnnotations=None):
+        self._db_id = id
+        self._db_entity_type = entity_type
+        self._db_version = version
+        self._db_name = name
+        self._db_last_modified = last_modified
+        self.db_deleted_actions = []
+        self.db_actions_id_index = {}
+        if actions is None:
+            self._db_actions = []
+        else:
+            self._db_actions = actions
+            for v in self._db_actions:
+                self.db_actions_id_index[v.db_id] = v
+        self.db_deleted_tags = []
+        self.db_tags_id_index = {}
+        self.db_tags_name_index = {}
+        if tags is None:
+            self._db_tags = []
+        else:
+            self._db_tags = tags
+            for v in self._db_tags:
+                self.db_tags_id_index[v.db_id] = v
+                self.db_tags_name_index[v.db_name] = v
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        self.db_annotations_key_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+                self.db_annotations_key_index[v.db_key] = v
+        self.db_deleted_vistrailVariables = []
+        self.db_vistrailVariables_name_index = {}
+        self.db_vistrailVariables_uuid_index = {}
+        if vistrailVariables is None:
+            self._db_vistrailVariables = []
+        else:
+            self._db_vistrailVariables = vistrailVariables
+            for v in self._db_vistrailVariables:
+                self.db_vistrailVariables_name_index[v.db_name] = v
+                self.db_vistrailVariables_uuid_index[v.db_uuid] = v
+        self.db_deleted_parameter_explorations = []
+        self.db_parameter_explorations_id_index = {}
+        if parameter_explorations is None:
+            self._db_parameter_explorations = []
+        else:
+            self._db_parameter_explorations = parameter_explorations
+            for v in self._db_parameter_explorations:
+                self.db_parameter_explorations_id_index[v.db_id] = v
+        self.db_deleted_actionAnnotations = []
+        self.db_actionAnnotations_id_index = {}
+        self.db_actionAnnotations_action_id_index = {}
+        self.db_actionAnnotations_key_index = {}
+        if actionAnnotations is None:
+            self._db_actionAnnotations = []
+        else:
+            self._db_actionAnnotations = actionAnnotations
+            for v in self._db_actionAnnotations:
+                self.db_actionAnnotations_id_index[v.db_id] = v
+                self.db_actionAnnotations_action_id_index[(v.db_action_id,v.db_key)] = v
+                self.db_actionAnnotations_key_index[(v.db_key,v.db_value)] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBVistrail(id=self._db_id,
+                        entity_type=self._db_entity_type,
+                        version=self._db_version,
+                        name=self._db_name,
+                        last_modified=self._db_last_modified)
+        if self._db_actions is None:
+            cp._db_actions = []
+        else:
+            cp._db_actions = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actions]
+        if self._db_tags is None:
+            cp._db_tags = []
+        else:
+            cp._db_tags = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_tags]
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_vistrailVariables is None:
+            cp._db_vistrailVariables = []
+        else:
+            cp._db_vistrailVariables = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_vistrailVariables]
+        if self._db_parameter_explorations is None:
+            cp._db_parameter_explorations = []
+        else:
+            cp._db_parameter_explorations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_parameter_explorations]
+        if self._db_actionAnnotations is None:
+            cp._db_actionAnnotations = []
+        else:
+            cp._db_actionAnnotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_actionAnnotations]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+        
+        # recreate indices and set flags
+        cp.db_actions_id_index = dict((v.db_id, v) for v in cp._db_actions)
+        cp.db_tags_id_index = dict((v.db_id, v) for v in cp._db_tags)
+        cp.db_tags_name_index = dict((v.db_name, v) for v in cp._db_tags)
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_annotations_key_index = dict((v.db_key, v) for v in cp._db_annotations)
+        cp.db_vistrailVariables_name_index = dict((v.db_name, v) for v in cp._db_vistrailVariables)
+        cp.db_vistrailVariables_uuid_index = dict((v.db_uuid, v) for v in cp._db_vistrailVariables)
+        cp.db_parameter_explorations_id_index = dict((v.db_id, v) for v in cp._db_parameter_explorations)
+        cp.db_actionAnnotations_id_index = dict((v.db_id, v) for v in cp._db_actionAnnotations)
+        cp.db_actionAnnotations_action_id_index = dict(((v.db_action_id,v.db_key), v) for v in cp._db_actionAnnotations)
+        cp.db_actionAnnotations_key_index = dict(((v.db_key,v.db_value), v) for v in cp._db_actionAnnotations)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'entity_type' in class_dict:
+            res = class_dict['entity_type'](old_obj, trans_dict)
+            new_obj.db_entity_type = res
+        elif hasattr(old_obj, 'db_entity_type') and old_obj.db_entity_type is not None:
+            new_obj.db_entity_type = old_obj.db_entity_type
+        if 'version' in class_dict:
+            res = class_dict['version'](old_obj, trans_dict)
+            new_obj.db_version = res
+        elif hasattr(old_obj, 'db_version') and old_obj.db_version is not None:
+            new_obj.db_version = old_obj.db_version
+        if 'name' in class_dict:
+            res = class_dict['name'](old_obj, trans_dict)
+            new_obj.db_name = res
+        elif hasattr(old_obj, 'db_name') and old_obj.db_name is not None:
+            new_obj.db_name = old_obj.db_name
+        if 'last_modified' in class_dict:
+            res = class_dict['last_modified'](old_obj, trans_dict)
+            new_obj.db_last_modified = res
+        elif hasattr(old_obj, 'db_last_modified') and old_obj.db_last_modified is not None:
+            new_obj.db_last_modified = old_obj.db_last_modified
+        if 'actions' in class_dict:
+            res = class_dict['actions'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_action(obj)
+        elif hasattr(old_obj, 'db_actions') and old_obj.db_actions is not None:
+            for obj in old_obj.db_actions:
+                new_obj.db_add_action(DBAction.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actions') and hasattr(new_obj, 'db_deleted_actions'):
+            for obj in old_obj.db_deleted_actions:
+                n_obj = DBAction.update_version(obj, trans_dict)
+                new_obj.db_deleted_actions.append(n_obj)
+        if 'tags' in class_dict:
+            res = class_dict['tags'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_tag(obj)
+        elif hasattr(old_obj, 'db_tags') and old_obj.db_tags is not None:
+            for obj in old_obj.db_tags:
+                new_obj.db_add_tag(DBTag.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_tags') and hasattr(new_obj, 'db_deleted_tags'):
+            for obj in old_obj.db_deleted_tags:
+                n_obj = DBTag.update_version(obj, trans_dict)
+                new_obj.db_deleted_tags.append(n_obj)
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'vistrailVariables' in class_dict:
+            res = class_dict['vistrailVariables'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_vistrailVariable(obj)
+        elif hasattr(old_obj, 'db_vistrailVariables') and old_obj.db_vistrailVariables is not None:
+            for obj in old_obj.db_vistrailVariables:
+                new_obj.db_add_vistrailVariable(DBVistrailVariable.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_vistrailVariables') and hasattr(new_obj, 'db_deleted_vistrailVariables'):
+            for obj in old_obj.db_deleted_vistrailVariables:
+                n_obj = DBVistrailVariable.update_version(obj, trans_dict)
+                new_obj.db_deleted_vistrailVariables.append(n_obj)
+        if 'parameter_explorations' in class_dict:
+            res = class_dict['parameter_explorations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_parameter_exploration(obj)
+        elif hasattr(old_obj, 'db_parameter_explorations') and old_obj.db_parameter_explorations is not None:
+            for obj in old_obj.db_parameter_explorations:
+                new_obj.db_add_parameter_exploration(DBParameterExploration.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_parameter_explorations') and hasattr(new_obj, 'db_deleted_parameter_explorations'):
+            for obj in old_obj.db_deleted_parameter_explorations:
+                n_obj = DBParameterExploration.update_version(obj, trans_dict)
+                new_obj.db_deleted_parameter_explorations.append(n_obj)
+        if 'actionAnnotations' in class_dict:
+            res = class_dict['actionAnnotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_actionAnnotation(obj)
+        elif hasattr(old_obj, 'db_actionAnnotations') and old_obj.db_actionAnnotations is not None:
+            for obj in old_obj.db_actionAnnotations:
+                new_obj.db_add_actionAnnotation(DBActionAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_actionAnnotations') and hasattr(new_obj, 'db_deleted_actionAnnotations'):
+            for obj in old_obj.db_deleted_actionAnnotations:
+                n_obj = DBActionAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_actionAnnotations.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_actions:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_action(child)
+        to_del = []
+        for child in self.db_tags:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_tag(child)
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_vistrailVariables:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_vistrailVariable(child)
+        to_del = []
+        for child in self.db_parameter_explorations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_parameter_exploration(child)
+        to_del = []
+        for child in self.db_actionAnnotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_actionAnnotation(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_actions)
+        children.extend(self.db_deleted_tags)
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_vistrailVariables)
+        children.extend(self.db_deleted_parameter_explorations)
+        children.extend(self.db_deleted_actionAnnotations)
+        if remove:
+            self.db_deleted_actions = []
+            self.db_deleted_tags = []
+            self.db_deleted_annotations = []
+            self.db_deleted_vistrailVariables = []
+            self.db_deleted_parameter_explorations = []
+            self.db_deleted_actionAnnotations = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_actions:
+            if child.has_changes():
+                return True
+        for child in self._db_tags:
+            if child.has_changes():
+                return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_vistrailVariables:
+            if child.has_changes():
+                return True
+        for child in self._db_parameter_explorations:
+            if child.has_changes():
+                return True
+        for child in self._db_actionAnnotations:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_entity_type(self):
+        return self._db_entity_type
+    def __set_db_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+        self.is_dirty = True
+    db_entity_type = property(__get_db_entity_type, __set_db_entity_type)
+    def db_add_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_change_entity_type(self, entity_type):
+        self._db_entity_type = entity_type
+    def db_delete_entity_type(self, entity_type):
+        self._db_entity_type = None
+    
+    def __get_db_version(self):
+        return self._db_version
+    def __set_db_version(self, version):
+        self._db_version = version
+        self.is_dirty = True
+    db_version = property(__get_db_version, __set_db_version)
+    def db_add_version(self, version):
+        self._db_version = version
+    def db_change_version(self, version):
+        self._db_version = version
+    def db_delete_version(self, version):
+        self._db_version = None
+    
+    def __get_db_name(self):
+        return self._db_name
+    def __set_db_name(self, name):
+        self._db_name = name
+        self.is_dirty = True
+    db_name = property(__get_db_name, __set_db_name)
+    def db_add_name(self, name):
+        self._db_name = name
+    def db_change_name(self, name):
+        self._db_name = name
+    def db_delete_name(self, name):
+        self._db_name = None
+    
+    def __get_db_last_modified(self):
+        return self._db_last_modified
+    def __set_db_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+        self.is_dirty = True
+    db_last_modified = property(__get_db_last_modified, __set_db_last_modified)
+    def db_add_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_change_last_modified(self, last_modified):
+        self._db_last_modified = last_modified
+    def db_delete_last_modified(self, last_modified):
+        self._db_last_modified = None
+    
+    def __get_db_actions(self):
+        return self._db_actions
+    def __set_db_actions(self, actions):
+        self._db_actions = actions
+        self.is_dirty = True
+    db_actions = property(__get_db_actions, __set_db_actions)
+    def db_get_actions(self):
+        return self._db_actions
+    def db_add_action(self, action):
+        self.is_dirty = True
+        self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_change_action(self, action):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                self._db_actions[i] = action
+                found = True
+                break
+        if not found:
+            self._db_actions.append(action)
+        self.db_actions_id_index[action.db_id] = action
+    def db_delete_action(self, action):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == action.db_id:
+                if not self._db_actions[i].is_new:
+                    self.db_deleted_actions.append(self._db_actions[i])
+                del self._db_actions[i]
+                break
+        del self.db_actions_id_index[action.db_id]
+    def db_get_action(self, key):
+        for i in xrange(len(self._db_actions)):
+            if self._db_actions[i].db_id == key:
+                return self._db_actions[i]
+        return None
+    def db_get_action_by_id(self, key):
+        return self.db_actions_id_index[key]
+    def db_has_action_with_id(self, key):
+        return key in self.db_actions_id_index
+    
+    def __get_db_tags(self):
+        return self._db_tags
+    def __set_db_tags(self, tags):
+        self._db_tags = tags
+        self.is_dirty = True
+    db_tags = property(__get_db_tags, __set_db_tags)
+    def db_get_tags(self):
+        return self._db_tags
+    def db_add_tag(self, tag):
+        self.is_dirty = True
+        self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_change_tag(self, tag):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                self._db_tags[i] = tag
+                found = True
+                break
+        if not found:
+            self._db_tags.append(tag)
+        self.db_tags_id_index[tag.db_id] = tag
+        self.db_tags_name_index[tag.db_name] = tag
+    def db_delete_tag(self, tag):
+        self.is_dirty = True
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == tag.db_id:
+                if not self._db_tags[i].is_new:
+                    self.db_deleted_tags.append(self._db_tags[i])
+                del self._db_tags[i]
+                break
+        del self.db_tags_id_index[tag.db_id]
+        del self.db_tags_name_index[tag.db_name]
+    def db_get_tag(self, key):
+        for i in xrange(len(self._db_tags)):
+            if self._db_tags[i].db_id == key:
+                return self._db_tags[i]
+        return None
+    def db_get_tag_by_id(self, key):
+        return self.db_tags_id_index[key]
+    def db_has_tag_with_id(self, key):
+        return key in self.db_tags_id_index
+    def db_get_tag_by_name(self, key):
+        return self.db_tags_name_index[key]
+    def db_has_tag_with_name(self, key):
+        return key in self.db_tags_name_index
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+        self.db_annotations_key_index[annotation.db_key] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+        del self.db_annotations_key_index[annotation.db_key]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    def db_get_annotation_by_key(self, key):
+        return self.db_annotations_key_index[key]
+    def db_has_annotation_with_key(self, key):
+        return key in self.db_annotations_key_index
+    
+    def __get_db_vistrailVariables(self):
+        return self._db_vistrailVariables
+    def __set_db_vistrailVariables(self, vistrailVariables):
+        self._db_vistrailVariables = vistrailVariables
+        self.is_dirty = True
+    db_vistrailVariables = property(__get_db_vistrailVariables, __set_db_vistrailVariables)
+    def db_get_vistrailVariables(self):
+        return self._db_vistrailVariables
+    def db_add_vistrailVariable(self, vistrailVariable):
+        self.is_dirty = True
+        self._db_vistrailVariables.append(vistrailVariable)
+        self.db_vistrailVariables_name_index[vistrailVariable.db_name] = vistrailVariable
+        self.db_vistrailVariables_uuid_index[vistrailVariable.db_uuid] = vistrailVariable
+    def db_change_vistrailVariable(self, vistrailVariable):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_vistrailVariables)):
+            if self._db_vistrailVariables[i].db_name == vistrailVariable.db_name:
+                self._db_vistrailVariables[i] = vistrailVariable
+                found = True
+                break
+        if not found:
+            self._db_vistrailVariables.append(vistrailVariable)
+        self.db_vistrailVariables_name_index[vistrailVariable.db_name] = vistrailVariable
+        self.db_vistrailVariables_uuid_index[vistrailVariable.db_uuid] = vistrailVariable
+    def db_delete_vistrailVariable(self, vistrailVariable):
+        self.is_dirty = True
+        for i in xrange(len(self._db_vistrailVariables)):
+            if self._db_vistrailVariables[i].db_name == vistrailVariable.db_name:
+                if not self._db_vistrailVariables[i].is_new:
+                    self.db_deleted_vistrailVariables.append(self._db_vistrailVariables[i])
+                del self._db_vistrailVariables[i]
+                break
+        del self.db_vistrailVariables_name_index[vistrailVariable.db_name]
+        del self.db_vistrailVariables_uuid_index[vistrailVariable.db_uuid]
+    def db_get_vistrailVariable(self, key):
+        for i in xrange(len(self._db_vistrailVariables)):
+            if self._db_vistrailVariables[i].db_name == key:
+                return self._db_vistrailVariables[i]
+        return None
+    def db_get_vistrailVariable_by_name(self, key):
+        return self.db_vistrailVariables_name_index[key]
+    def db_has_vistrailVariable_with_name(self, key):
+        return key in self.db_vistrailVariables_name_index
+    def db_get_vistrailVariable_by_uuid(self, key):
+        return self.db_vistrailVariables_uuid_index[key]
+    def db_has_vistrailVariable_with_uuid(self, key):
+        return key in self.db_vistrailVariables_uuid_index
+    
+    def __get_db_parameter_explorations(self):
+        return self._db_parameter_explorations
+    def __set_db_parameter_explorations(self, parameter_explorations):
+        self._db_parameter_explorations = parameter_explorations
+        self.is_dirty = True
+    db_parameter_explorations = property(__get_db_parameter_explorations, __set_db_parameter_explorations)
+    def db_get_parameter_explorations(self):
+        return self._db_parameter_explorations
+    def db_add_parameter_exploration(self, parameter_exploration):
+        self.is_dirty = True
+        self._db_parameter_explorations.append(parameter_exploration)
+        self.db_parameter_explorations_id_index[parameter_exploration.db_id] = parameter_exploration
+    def db_change_parameter_exploration(self, parameter_exploration):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_parameter_explorations)):
+            if self._db_parameter_explorations[i].db_id == parameter_exploration.db_id:
+                self._db_parameter_explorations[i] = parameter_exploration
+                found = True
+                break
+        if not found:
+            self._db_parameter_explorations.append(parameter_exploration)
+        self.db_parameter_explorations_id_index[parameter_exploration.db_id] = parameter_exploration
+    def db_delete_parameter_exploration(self, parameter_exploration):
+        self.is_dirty = True
+        for i in xrange(len(self._db_parameter_explorations)):
+            if self._db_parameter_explorations[i].db_id == parameter_exploration.db_id:
+                if not self._db_parameter_explorations[i].is_new:
+                    self.db_deleted_parameter_explorations.append(self._db_parameter_explorations[i])
+                del self._db_parameter_explorations[i]
+                break
+        del self.db_parameter_explorations_id_index[parameter_exploration.db_id]
+    def db_get_parameter_exploration(self, key):
+        for i in xrange(len(self._db_parameter_explorations)):
+            if self._db_parameter_explorations[i].db_id == key:
+                return self._db_parameter_explorations[i]
+        return None
+    def db_get_parameter_exploration_by_id(self, key):
+        return self.db_parameter_explorations_id_index[key]
+    def db_has_parameter_exploration_with_id(self, key):
+        return key in self.db_parameter_explorations_id_index
+    
+    def __get_db_actionAnnotations(self):
+        return self._db_actionAnnotations
+    def __set_db_actionAnnotations(self, actionAnnotations):
+        self._db_actionAnnotations = actionAnnotations
+        self.is_dirty = True
+    db_actionAnnotations = property(__get_db_actionAnnotations, __set_db_actionAnnotations)
+    def db_get_actionAnnotations(self):
+        return self._db_actionAnnotations
+    def db_add_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        self._db_actionAnnotations.append(actionAnnotation)
+        self.db_actionAnnotations_id_index[actionAnnotation.db_id] = actionAnnotation
+        self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)] = actionAnnotation
+        self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)] = actionAnnotation
+    def db_change_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == actionAnnotation.db_id:
+                self._db_actionAnnotations[i] = actionAnnotation
+                found = True
+                break
+        if not found:
+            self._db_actionAnnotations.append(actionAnnotation)
+        self.db_actionAnnotations_id_index[actionAnnotation.db_id] = actionAnnotation
+        self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)] = actionAnnotation
+        self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)] = actionAnnotation
+    def db_delete_actionAnnotation(self, actionAnnotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == actionAnnotation.db_id:
+                if not self._db_actionAnnotations[i].is_new:
+                    self.db_deleted_actionAnnotations.append(self._db_actionAnnotations[i])
+                del self._db_actionAnnotations[i]
+                break
+        del self.db_actionAnnotations_id_index[actionAnnotation.db_id]
+        del self.db_actionAnnotations_action_id_index[(actionAnnotation.db_action_id,actionAnnotation.db_key)]
+        try:
+            del self.db_actionAnnotations_key_index[(actionAnnotation.db_key,actionAnnotation.db_value)]
+        except KeyError:
+            pass
+    def db_get_actionAnnotation(self, key):
+        for i in xrange(len(self._db_actionAnnotations)):
+            if self._db_actionAnnotations[i].db_id == key:
+                return self._db_actionAnnotations[i]
+        return None
+    def db_get_actionAnnotation_by_id(self, key):
+        return self.db_actionAnnotations_id_index[key]
+    def db_has_actionAnnotation_with_id(self, key):
+        return key in self.db_actionAnnotations_id_index
+    def db_get_actionAnnotation_by_action_id(self, key):
+        return self.db_actionAnnotations_action_id_index[key]
+    def db_has_actionAnnotation_with_action_id(self, key):
+        return key in self.db_actionAnnotations_action_id_index
+    def db_get_actionAnnotation_by_key(self, key):
+        return self.db_actionAnnotations_key_index[key]
+    def db_has_actionAnnotation_with_key(self, key):
+        return key in self.db_actionAnnotations_key_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
+class DBModuleExec(object):
+
+    vtType = 'module_exec'
+
+    def __init__(self, id=None, ts_start=None, ts_end=None, cached=None, module_id=None, module_name=None, completed=None, error=None, machine_id=None, annotations=None, loop_execs=None):
+        self._db_id = id
+        self._db_ts_start = ts_start
+        self._db_ts_end = ts_end
+        self._db_cached = cached
+        self._db_module_id = module_id
+        self._db_module_name = module_name
+        self._db_completed = completed
+        self._db_error = error
+        self._db_machine_id = machine_id
+        self.db_deleted_annotations = []
+        self.db_annotations_id_index = {}
+        if annotations is None:
+            self._db_annotations = []
+        else:
+            self._db_annotations = annotations
+            for v in self._db_annotations:
+                self.db_annotations_id_index[v.db_id] = v
+        self.db_deleted_loop_execs = []
+        self.db_loop_execs_id_index = {}
+        if loop_execs is None:
+            self._db_loop_execs = []
+        else:
+            self._db_loop_execs = loop_execs
+            for v in self._db_loop_execs:
+                self.db_loop_execs_id_index[v.db_id] = v
+        self.is_dirty = True
+        self.is_new = True
+    
+    def __copy__(self):
+        return DBModuleExec.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = DBModuleExec(id=self._db_id,
+                          ts_start=self._db_ts_start,
+                          ts_end=self._db_ts_end,
+                          cached=self._db_cached,
+                          module_id=self._db_module_id,
+                          module_name=self._db_module_name,
+                          completed=self._db_completed,
+                          error=self._db_error,
+                          machine_id=self._db_machine_id)
+        if self._db_annotations is None:
+            cp._db_annotations = []
+        else:
+            cp._db_annotations = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_annotations]
+        if self._db_loop_execs is None:
+            cp._db_loop_execs = []
+        else:
+            cp._db_loop_execs = [v.do_copy(new_ids, id_scope, id_remap) for v in self._db_loop_execs]
+        
+        # set new ids
+        if new_ids:
+            new_id = id_scope.getNewId(self.vtType)
+            if self.vtType in id_scope.remap:
+                id_remap[(id_scope.remap[self.vtType], self.db_id)] = new_id
+            else:
+                id_remap[(self.vtType, self.db_id)] = new_id
+            cp.db_id = new_id
+            if hasattr(self, 'db_module_id') and ('module', self._db_module_id) in id_remap:
+                cp._db_module_id = id_remap[('module', self._db_module_id)]
+            if hasattr(self, 'db_machine_id') and ('machine', self._db_machine_id) in id_remap:
+                cp._db_machine_id = id_remap[('machine', self._db_machine_id)]
+        
+        # recreate indices and set flags
+        cp.db_annotations_id_index = dict((v.db_id, v) for v in cp._db_annotations)
+        cp.db_loop_execs_id_index = dict((v.db_id, v) for v in cp._db_loop_execs)
+        if not new_ids:
+            cp.is_dirty = self.is_dirty
+            cp.is_new = self.is_new
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBModuleExec()
+        class_dict = {}
+        if new_obj.__class__.__name__ in trans_dict:
+            class_dict = trans_dict[new_obj.__class__.__name__]
+        if 'id' in class_dict:
+            res = class_dict['id'](old_obj, trans_dict)
+            new_obj.db_id = res
+        elif hasattr(old_obj, 'db_id') and old_obj.db_id is not None:
+            new_obj.db_id = old_obj.db_id
+        if 'ts_start' in class_dict:
+            res = class_dict['ts_start'](old_obj, trans_dict)
+            new_obj.db_ts_start = res
+        elif hasattr(old_obj, 'db_ts_start') and old_obj.db_ts_start is not None:
+            new_obj.db_ts_start = old_obj.db_ts_start
+        if 'ts_end' in class_dict:
+            res = class_dict['ts_end'](old_obj, trans_dict)
+            new_obj.db_ts_end = res
+        elif hasattr(old_obj, 'db_ts_end') and old_obj.db_ts_end is not None:
+            new_obj.db_ts_end = old_obj.db_ts_end
+        if 'cached' in class_dict:
+            res = class_dict['cached'](old_obj, trans_dict)
+            new_obj.db_cached = res
+        elif hasattr(old_obj, 'db_cached') and old_obj.db_cached is not None:
+            new_obj.db_cached = old_obj.db_cached
+        if 'module_id' in class_dict:
+            res = class_dict['module_id'](old_obj, trans_dict)
+            new_obj.db_module_id = res
+        elif hasattr(old_obj, 'db_module_id') and old_obj.db_module_id is not None:
+            new_obj.db_module_id = old_obj.db_module_id
+        if 'module_name' in class_dict:
+            res = class_dict['module_name'](old_obj, trans_dict)
+            new_obj.db_module_name = res
+        elif hasattr(old_obj, 'db_module_name') and old_obj.db_module_name is not None:
+            new_obj.db_module_name = old_obj.db_module_name
+        if 'completed' in class_dict:
+            res = class_dict['completed'](old_obj, trans_dict)
+            new_obj.db_completed = res
+        elif hasattr(old_obj, 'db_completed') and old_obj.db_completed is not None:
+            new_obj.db_completed = old_obj.db_completed
+        if 'error' in class_dict:
+            res = class_dict['error'](old_obj, trans_dict)
+            new_obj.db_error = res
+        elif hasattr(old_obj, 'db_error') and old_obj.db_error is not None:
+            new_obj.db_error = old_obj.db_error
+        if 'machine_id' in class_dict:
+            res = class_dict['machine_id'](old_obj, trans_dict)
+            new_obj.db_machine_id = res
+        elif hasattr(old_obj, 'db_machine_id') and old_obj.db_machine_id is not None:
+            new_obj.db_machine_id = old_obj.db_machine_id
+        if 'annotations' in class_dict:
+            res = class_dict['annotations'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_annotation(obj)
+        elif hasattr(old_obj, 'db_annotations') and old_obj.db_annotations is not None:
+            for obj in old_obj.db_annotations:
+                new_obj.db_add_annotation(DBAnnotation.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_annotations') and hasattr(new_obj, 'db_deleted_annotations'):
+            for obj in old_obj.db_deleted_annotations:
+                n_obj = DBAnnotation.update_version(obj, trans_dict)
+                new_obj.db_deleted_annotations.append(n_obj)
+        if 'loop_execs' in class_dict:
+            res = class_dict['loop_execs'](old_obj, trans_dict)
+            for obj in res:
+                new_obj.db_add_loop_exec(obj)
+        elif hasattr(old_obj, 'db_loop_execs') and old_obj.db_loop_execs is not None:
+            for obj in old_obj.db_loop_execs:
+                new_obj.db_add_loop_exec(DBLoopExec.update_version(obj, trans_dict))
+        if hasattr(old_obj, 'db_deleted_loop_execs') and hasattr(new_obj, 'db_deleted_loop_execs'):
+            for obj in old_obj.db_deleted_loop_execs:
+                n_obj = DBLoopExec.update_version(obj, trans_dict)
+                new_obj.db_deleted_loop_execs.append(n_obj)
+        new_obj.is_new = old_obj.is_new
+        new_obj.is_dirty = old_obj.is_dirty
+        return new_obj
+
+    def db_children(self, parent=(None,None), orphan=False, for_action=False):
+        children = []
+        to_del = []
+        for child in self.db_annotations:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_annotation(child)
+        to_del = []
+        for child in self.db_loop_execs:
+            children.extend(child.db_children((self.vtType, self.db_id), orphan, for_action))
+            if orphan:
+                to_del.append(child)
+        for child in to_del:
+            self.db_delete_loop_exec(child)
+        children.append((self, parent[0], parent[1]))
+        return children
+    def db_deleted_children(self, remove=False):
+        children = []
+        children.extend(self.db_deleted_annotations)
+        children.extend(self.db_deleted_loop_execs)
+        if remove:
+            self.db_deleted_annotations = []
+            self.db_deleted_loop_execs = []
+        return children
+    def has_changes(self):
+        if self.is_dirty:
+            return True
+        for child in self._db_annotations:
+            if child.has_changes():
+                return True
+        for child in self._db_loop_execs:
+            if child.has_changes():
+                return True
+        return False
+    def __get_db_id(self):
+        return self._db_id
+    def __set_db_id(self, id):
+        self._db_id = id
+        self.is_dirty = True
+    db_id = property(__get_db_id, __set_db_id)
+    def db_add_id(self, id):
+        self._db_id = id
+    def db_change_id(self, id):
+        self._db_id = id
+    def db_delete_id(self, id):
+        self._db_id = None
+    
+    def __get_db_ts_start(self):
+        return self._db_ts_start
+    def __set_db_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+        self.is_dirty = True
+    db_ts_start = property(__get_db_ts_start, __set_db_ts_start)
+    def db_add_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_change_ts_start(self, ts_start):
+        self._db_ts_start = ts_start
+    def db_delete_ts_start(self, ts_start):
+        self._db_ts_start = None
+    
+    def __get_db_ts_end(self):
+        return self._db_ts_end
+    def __set_db_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+        self.is_dirty = True
+    db_ts_end = property(__get_db_ts_end, __set_db_ts_end)
+    def db_add_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_change_ts_end(self, ts_end):
+        self._db_ts_end = ts_end
+    def db_delete_ts_end(self, ts_end):
+        self._db_ts_end = None
+    
+    def __get_db_cached(self):
+        return self._db_cached
+    def __set_db_cached(self, cached):
+        self._db_cached = cached
+        self.is_dirty = True
+    db_cached = property(__get_db_cached, __set_db_cached)
+    def db_add_cached(self, cached):
+        self._db_cached = cached
+    def db_change_cached(self, cached):
+        self._db_cached = cached
+    def db_delete_cached(self, cached):
+        self._db_cached = None
+    
+    def __get_db_module_id(self):
+        return self._db_module_id
+    def __set_db_module_id(self, module_id):
+        self._db_module_id = module_id
+        self.is_dirty = True
+    db_module_id = property(__get_db_module_id, __set_db_module_id)
+    def db_add_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_change_module_id(self, module_id):
+        self._db_module_id = module_id
+    def db_delete_module_id(self, module_id):
+        self._db_module_id = None
+    
+    def __get_db_module_name(self):
+        return self._db_module_name
+    def __set_db_module_name(self, module_name):
+        self._db_module_name = module_name
+        self.is_dirty = True
+    db_module_name = property(__get_db_module_name, __set_db_module_name)
+    def db_add_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_change_module_name(self, module_name):
+        self._db_module_name = module_name
+    def db_delete_module_name(self, module_name):
+        self._db_module_name = None
+    
+    def __get_db_completed(self):
+        return self._db_completed
+    def __set_db_completed(self, completed):
+        self._db_completed = completed
+        self.is_dirty = True
+    db_completed = property(__get_db_completed, __set_db_completed)
+    def db_add_completed(self, completed):
+        self._db_completed = completed
+    def db_change_completed(self, completed):
+        self._db_completed = completed
+    def db_delete_completed(self, completed):
+        self._db_completed = None
+    
+    def __get_db_error(self):
+        return self._db_error
+    def __set_db_error(self, error):
+        self._db_error = error
+        self.is_dirty = True
+    db_error = property(__get_db_error, __set_db_error)
+    def db_add_error(self, error):
+        self._db_error = error
+    def db_change_error(self, error):
+        self._db_error = error
+    def db_delete_error(self, error):
+        self._db_error = None
+    
+    def __get_db_machine_id(self):
+        return self._db_machine_id
+    def __set_db_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+        self.is_dirty = True
+    db_machine_id = property(__get_db_machine_id, __set_db_machine_id)
+    def db_add_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_change_machine_id(self, machine_id):
+        self._db_machine_id = machine_id
+    def db_delete_machine_id(self, machine_id):
+        self._db_machine_id = None
+    
+    def __get_db_annotations(self):
+        return self._db_annotations
+    def __set_db_annotations(self, annotations):
+        self._db_annotations = annotations
+        self.is_dirty = True
+    db_annotations = property(__get_db_annotations, __set_db_annotations)
+    def db_get_annotations(self):
+        return self._db_annotations
+    def db_add_annotation(self, annotation):
+        self.is_dirty = True
+        self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_change_annotation(self, annotation):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                self._db_annotations[i] = annotation
+                found = True
+                break
+        if not found:
+            self._db_annotations.append(annotation)
+        self.db_annotations_id_index[annotation.db_id] = annotation
+    def db_delete_annotation(self, annotation):
+        self.is_dirty = True
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == annotation.db_id:
+                if not self._db_annotations[i].is_new:
+                    self.db_deleted_annotations.append(self._db_annotations[i])
+                del self._db_annotations[i]
+                break
+        del self.db_annotations_id_index[annotation.db_id]
+    def db_get_annotation(self, key):
+        for i in xrange(len(self._db_annotations)):
+            if self._db_annotations[i].db_id == key:
+                return self._db_annotations[i]
+        return None
+    def db_get_annotation_by_id(self, key):
+        return self.db_annotations_id_index[key]
+    def db_has_annotation_with_id(self, key):
+        return key in self.db_annotations_id_index
+    
+    def __get_db_loop_execs(self):
+        return self._db_loop_execs
+    def __set_db_loop_execs(self, loop_execs):
+        self._db_loop_execs = loop_execs
+        self.is_dirty = True
+    db_loop_execs = property(__get_db_loop_execs, __set_db_loop_execs)
+    def db_get_loop_execs(self):
+        return self._db_loop_execs
+    def db_add_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_change_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        found = False
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                self._db_loop_execs[i] = loop_exec
+                found = True
+                break
+        if not found:
+            self._db_loop_execs.append(loop_exec)
+        self.db_loop_execs_id_index[loop_exec.db_id] = loop_exec
+    def db_delete_loop_exec(self, loop_exec):
+        self.is_dirty = True
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == loop_exec.db_id:
+                if not self._db_loop_execs[i].is_new:
+                    self.db_deleted_loop_execs.append(self._db_loop_execs[i])
+                del self._db_loop_execs[i]
+                break
+        del self.db_loop_execs_id_index[loop_exec.db_id]
+    def db_get_loop_exec(self, key):
+        for i in xrange(len(self._db_loop_execs)):
+            if self._db_loop_execs[i].db_id == key:
+                return self._db_loop_execs[i]
+        return None
+    def db_get_loop_exec_by_id(self, key):
+        return self.db_loop_execs_id_index[key]
+    def db_has_loop_exec_with_id(self, key):
+        return key in self.db_loop_execs_id_index
+    
+    def getPrimaryKey(self):
+        return self._db_id
+
diff --git a/vistrails/db/versions/v1_0_3/domain/id_scope.py b/vistrails/db/versions/v1_0_3/domain/id_scope.py
new file mode 100644
index 0000000..0e07f02
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/id_scope.py
@@ -0,0 +1,85 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+
+class IdScope:
+    def __init__(self, beginId=0L, remap=None):
+        self.ids = {}
+        self.beginId = beginId
+        if remap is None:
+            self.remap = {}
+        else:
+            self.remap = remap
+
+    def __copy__(self):
+        cp = IdScope(beginId=self.beginId)
+        cp.ids = copy.copy(self.ids)
+        cp.remap = copy.copy(self.remap)
+        return cp
+
+    def __str__(self):
+        return str(self.ids)
+
+    def getNewId(self, objType):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            id = self.ids[objType]
+            self.ids[objType] += 1
+            return id
+        except KeyError:
+            self.ids[objType] = self.beginId + 1
+            return self.beginId
+
+    def updateBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        try:
+            if self.ids[objType] <= beginId:
+                self.ids[objType] = beginId
+        except KeyError:
+            self.ids[objType] = beginId
+        
+    def setBeginId(self, objType, beginId):
+        try:
+            objType = self.remap[objType]
+        except KeyError:
+            pass
+        self.ids[objType] = beginId
diff --git a/vistrails/db/versions/v1_0_3/domain/log.py b/vistrails/db/versions/v1_0_3/domain/log.py
new file mode 100644
index 0000000..a127726
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/log.py
@@ -0,0 +1,72 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBLog as _DBLog
+from auto_gen import DBAbstraction, DBModule, DBGroup, DBLoopExec, \
+    DBGroupExec, DBModuleExec
+from id_scope import IdScope
+
+import copy
+
+class DBLog(_DBLog):
+
+    def __init__(self, *args, **kwargs):
+        _DBLog.__init__(self, *args, **kwargs)
+        self.id_scope = IdScope(1,
+                                {DBLoopExec.vtType: 'item_exec',
+                                 DBModuleExec.vtType: 'item_exec',
+                                 DBGroupExec.vtType: 'item_exec',
+                                 DBAbstraction.vtType: DBModule.vtType,
+                                 DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBLog.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBLog.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBLog
+        cp.id_scope = copy.copy(self.id_scope)
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBLog()
+        new_obj = _DBLog.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+
+    def update_id_scope(self):
+        pass
diff --git a/vistrails/db/versions/v1_0_3/domain/registry.py b/vistrails/db/versions/v1_0_3/domain/registry.py
new file mode 100644
index 0000000..323ebbd
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/registry.py
@@ -0,0 +1,63 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBRegistry as _DBRegistry, DBPackage, DBModuleDescriptor, \
+    DBPortSpec
+from id_scope import IdScope
+
+class DBRegistry(_DBRegistry):
+    def __init__(self, *args, **kwargs):
+        _DBRegistry.__init__(self, *args, **kwargs)
+        self.idScope = IdScope()
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBRegistry()
+        new_obj = _DBRegistry.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        return new_obj
+    
+    def update_id_scope(self):
+        for package in self.db_packages:
+            self.idScope.updateBeginId(DBPackage.vtType, package.db_id+1)
+            for descriptor in package.db_module_descriptors:
+                self.idScope.updateBeginId(DBModuleDescriptor.vtType,
+                                           descriptor.db_id+1)
+                for port_spec in descriptor.db_portSpecs:
+                    self.idScope.updateBeginId(DBPortSpec.vtType, 
+                                               port_spec.db_id+1)
+
+
diff --git a/vistrails/db/versions/v1_0_3/domain/vistrail.py b/vistrails/db/versions/v1_0_3/domain/vistrail.py
new file mode 100644
index 0000000..4c1e5a2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/vistrail.py
@@ -0,0 +1,220 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import copy
+import hashlib
+from auto_gen import DBVistrail as _DBVistrail
+from auto_gen import DBAdd, DBChange, DBDelete, DBAbstraction, DBGroup, \
+    DBModule, DBAnnotation, DBActionAnnotation, DBParameterExploration
+from id_scope import IdScope
+
+class DBVistrail(_DBVistrail):
+    def __init__(self, *args, **kwargs):
+        _DBVistrail.__init__(self, *args, **kwargs)
+        self.idScope = IdScope(remap={DBAdd.vtType: 'operation',
+                                      DBChange.vtType: 'operation',
+                                      DBDelete.vtType: 'operation',
+                                      DBAbstraction.vtType: DBModule.vtType,
+                                      DBGroup.vtType: DBModule.vtType,
+                                      DBActionAnnotation.vtType: \
+                                          DBAnnotation.vtType})
+
+        self.idScope.setBeginId('action', 1)
+        self.idScope.setBeginId(DBParameterExploration.vtType, 1)
+        self.db_objects = {}
+
+        # keep a reference to the current logging information here
+        self.db_log_filename = None
+        self.log = None
+
+    def __copy__(self):
+        return DBVistrail.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBVistrail.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBVistrail
+        
+        cp.idScope = copy.copy(self.idScope)
+        cp.db_objects = copy.copy(self.db_objects)
+        cp.db_log_filename = self.db_log_filename
+        if self.log is not None:
+            cp.log = copy.copy(self.log)
+        else:
+            cp.log = None
+        
+        return cp
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBVistrail()
+        new_obj = _DBVistrail.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        if hasattr(old_obj, 'db_log_filename'):
+            new_obj.db_log_filename = old_obj.db_log_filename
+        if hasattr(old_obj, 'log'):
+            new_obj.log = old_obj.log
+        return new_obj
+
+    def update_id_scope(self):
+        def getOldObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_oldObjId
+            return operation.db_objectId
+
+        def getNewObjId(operation):
+            if operation.vtType == 'change':
+                return operation.db_newObjId
+            return operation.db_objectId
+
+        for action in self.db_actions:
+            self.idScope.updateBeginId('action', action.db_id+1)
+            if action.db_session is not None:
+                self.idScope.updateBeginId('session', action.db_session + 1)
+            for operation in action.db_operations:
+                self.idScope.updateBeginId('operation', operation.db_id+1)
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    # update ids of data
+                    self.idScope.updateBeginId(operation.db_what, 
+                                               getNewObjId(operation)+1)
+                    if operation.db_data is None:
+                        if operation.vtType == 'change':
+                            operation.db_objectId = operation.db_oldObjId
+                    self.db_add_object(operation.db_data)
+            for annotation in action.db_annotations:
+                self.idScope.updateBeginId('annotation', annotation.db_id+1)
+        
+        for annotation in self.db_annotations:
+            self.idScope.updateBeginId('annotation', annotation.db_id+1)
+        for annotation in self.db_actionAnnotations:
+            self.idScope.updateBeginId('annotation', annotation.db_id+1)
+        for paramexp in self.db_parameter_explorations:
+            self.idScope.updateBeginId('parameter_exploration',
+                                       paramexp.db_id+1)
+
+    def db_add_object(self, obj):
+        self.db_objects[(obj.vtType, obj.db_id)] = obj
+
+    def db_get_object(self, type, id):
+        return self.db_objects.get((type, id), None)
+
+    def db_update_object(self, obj, **kwargs):
+        # want to swap out old object with a new version
+        # need this for updating aliases...
+        # hack it using setattr...
+        real_obj = self.db_objects[(obj.vtType, obj.db_id)]
+        for (k, v) in kwargs.iteritems():
+            if hasattr(real_obj, k):
+                setattr(real_obj, k, v)
+
+    def update_checkout_version(self, app=''):
+        checkout_key = "__checkout_version_"
+        action_key = checkout_key + app
+        annotation_key = action_key + '_annotationhash'
+        action_annotation_key = action_key + '_actionannotationhash'
+
+        # delete previous checkout annotations
+        deletekeys = [action_key,annotation_key,action_annotation_key]
+        for key in deletekeys:
+            while self.db_has_annotation_with_key(key):
+                a = self.db_get_annotation_by_key(key)
+                self.db_delete_annotation(a)
+        
+        # annotation hash - requires annotations to be clean
+        value = self.hashAnnotations()
+        if self.db_has_annotation_with_key(annotation_key):
+            annotation = self.db_get_annotation_by_key(annotation_key)
+            annotation.db_value = value
+        else:
+            annotation=DBAnnotation(self.idScope.getNewId(DBAnnotation.vtType), 
+                                  annotation_key, value)
+            self.db_add_annotation(annotation)
+        # action annotation hash
+        value = self.hashActionAnnotations()
+        if self.db_has_annotation_with_key(action_annotation_key):
+            annotation = self.db_get_annotation_by_key(action_annotation_key)
+            annotation.db_value = value
+        else:
+            annotation=DBAnnotation(self.idScope.getNewId(DBAnnotation.vtType), 
+                                    action_annotation_key, value)
+            self.db_add_annotation(annotation)
+        # last action id hash
+        if len(self.db_actions) == 0:
+            value = 0
+        else:
+            value = max(v.db_id for v in self.db_actions)
+        if self.db_has_annotation_with_key(action_key):
+            annotation = self.db_get_annotation_by_key(action_key)
+            annotation.db_value = str(value)
+        else:
+            annotation=DBAnnotation(self.idScope.getNewId(DBAnnotation.vtType), 
+                                    action_key, str(value))
+            self.db_add_annotation(annotation)
+
+    def hashAnnotations(self):
+        annotations = {}
+        for annotation in self.db_annotations:
+            if annotation._db_key not in annotations:
+                annotations[annotation._db_key] = []
+            if annotation._db_value not in annotations[annotation._db_key]:
+                annotations[annotation._db_key].append(annotation._db_value)
+        keys = annotations.keys()
+        keys.sort()
+        m = hashlib.md5()
+        for k in keys:
+            m.update(str(k))
+            annotations[k].sort()
+            for v in annotations[k]:
+                m.update(str(v))
+        return m.hexdigest()
+
+    def hashActionAnnotations(self):
+        action_annotations = {}
+        for action_id, key, value in [[aa.db_action_id, aa.db_key, 
+                         aa.db_value] for aa in self.db_actionAnnotations]:
+            index = (str(action_id), key)
+            if index not in action_annotations:
+                action_annotations[index] = []
+            if value not in action_annotations[index]:
+                action_annotations[index].append(value)
+        keys = action_annotations.keys()
+        keys.sort()
+        m = hashlib.md5()
+        for k in keys:
+            m.update(k[0] + k[1])
+            action_annotations[k].sort()
+            for v in action_annotations[k]:
+                m.update(str(v))
+        return m.hexdigest()
diff --git a/vistrails/db/versions/v1_0_3/domain/workflow.py b/vistrails/db/versions/v1_0_3/domain/workflow.py
new file mode 100644
index 0000000..af484e6
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/domain/workflow.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from auto_gen import DBWorkflow as _DBWorkflow
+from auto_gen import DBAbstraction, DBModule, DBGroup
+from id_scope import IdScope
+
+import copy
+
+class DBWorkflow(_DBWorkflow):
+
+    def __init__(self, *args, **kwargs):
+        _DBWorkflow.__init__(self, *args, **kwargs)
+        self.objects = {}
+        self.tmp_id = IdScope(1,
+                              {DBAbstraction.vtType: DBModule.vtType,
+                               DBGroup.vtType: DBModule.vtType})
+
+    def __copy__(self):
+        return DBWorkflow.do_copy(self)
+
+    def do_copy(self, new_ids=False, id_scope=None, id_remap=None):
+        cp = _DBWorkflow.do_copy(self, new_ids, id_scope, id_remap)
+        cp.__class__ = DBWorkflow
+        # need to go through and reset the index to the copied objects
+        cp.build_index()
+        cp.tmp_id = copy.copy(self.tmp_id)
+        return cp        
+
+    @staticmethod
+    def update_version(old_obj, trans_dict, new_obj=None):
+        if new_obj is None:
+            new_obj = DBWorkflow()
+        new_obj = _DBWorkflow.update_version(old_obj, trans_dict, new_obj)
+        new_obj.update_id_scope()
+        new_obj.build_index()
+        return new_obj
+    
+    def update_id_scope(self):
+        pass
+
+    _vtTypeMap = {DBAbstraction.vtType: DBModule.vtType, 
+                  DBGroup.vtType: DBModule.vtType}
+
+    def build_index(self):
+        g = self._vtTypeMap.get
+        self.objects = dict(((g(o.vtType, o.vtType), o._db_id), o)
+                            for (o,_,_) in self.db_children())
+
+    def add_to_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        self.objects[(obj_type, object.getPrimaryKey())] = object
+
+    def delete_from_index(self, object):
+        obj_type = self._vtTypeMap.get(object.vtType, object.vtType)
+        del self.objects[(obj_type, object.getPrimaryKey())]
+
+    def capitalizeOne(self, str):
+        return str[0].upper() + str[1:]
+
+    def db_print_objects(self):
+        for k,v in self.objects.iteritems():
+            print '%s: %s' % (k, v)
+
+    def db_has_object(self, type, id):
+        return (type, id) in self.objects
+
+    def db_get_object(self, type, id):
+        return self.objects[(type, id)]
+
+    def db_add_object(self, object, parent_obj_type=None,
+                      parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if object.vtType == DBAbstraction.vtType or \
+                object.vtType == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        else:
+            obj_type = object.vtType
+        funname = 'db_add_' + obj_type
+        obj_copy = copy.copy(object)
+        getattr(parent_obj, funname)(obj_copy)
+        self.add_to_index(obj_copy)
+
+    def db_change_object(self, old_id, object, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+
+        self.db_delete_object(old_id, object.vtType, None, None, parent_obj)
+        self.db_add_object(object, None, None, parent_obj)
+
+    def db_delete_object(self, obj_id, obj_type, parent_obj_type=None, 
+                         parent_obj_id=None, parent_obj=None):
+        if parent_obj is None:
+            if parent_obj_type is None or parent_obj_id is None:
+                parent_obj = self
+            else:
+                if parent_obj_type == DBAbstraction.vtType or \
+                        parent_obj_type == DBGroup.vtType:
+                    parent_obj_type = DBModule.vtType
+                try:
+                    parent_obj = self.objects[(parent_obj_type, parent_obj_id)]
+                except KeyError:
+                    msg = "Cannot find object of type '%s' with id '%s'" % \
+                        (parent_obj_type, parent_obj_id)
+                    raise Exception(msg)
+        if obj_type == DBAbstraction.vtType or obj_type == DBGroup.vtType:
+            obj_type = DBModule.vtType
+        funname = 'db_get_' + obj_type
+        if hasattr(parent_obj, funname):
+            object = getattr(parent_obj, funname)(obj_id)
+        else:
+            attr_name = 'db_' + obj_type
+            object = getattr(parent_obj, attr_name)
+        funname = 'db_delete_' + obj_type
+        getattr(parent_obj, funname)(object)
+        self.delete_from_index(object)
diff --git a/vistrails/db/versions/v1_0_3/persistence/__init__.py b/vistrails/db/versions/v1_0_3/persistence/__init__.py
new file mode 100644
index 0000000..0a7bec1
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/__init__.py
@@ -0,0 +1,472 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from xml.auto_gen import XMLDAOListBase
+from sql.auto_gen import SQLDAOListBase
+from vistrails.core.system import get_elementtree_library
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.versions.v1_0_3 import version as my_version
+from vistrails.db.versions.v1_0_3.domain import DBGroup, DBWorkflow, DBVistrail, DBLog, \
+    DBRegistry, DBMashuptrail
+
+root_set = set([DBVistrail.vtType, DBWorkflow.vtType, 
+                DBLog.vtType, DBRegistry.vtType, DBMashuptrail.vtType])
+
+ElementTree = get_elementtree_library()
+
+
+class DAOList(dict):
+    def __init__(self):
+        self['xml'] = XMLDAOListBase()
+        self['sql'] = SQLDAOListBase()
+
+    def parse_xml_file(self, filename):
+        return ElementTree.parse(filename)
+
+    def write_xml_file(self, filename, tree):
+        def indent(elem, level=0):
+            i = "\n" + level*"  "
+            if len(elem):
+                if not elem.text or not elem.text.strip():
+                    elem.text = i + "  "
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+                for elem in elem:
+                    indent(elem, level+1)
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        indent(tree.getroot())
+        tree.write(filename)
+
+    def read_xml_object(self, vtType, node):
+        return self['xml'][vtType].fromXML(node)
+
+    def write_xml_object(self, obj, node=None):
+        res_node = self['xml'][obj.vtType].toXML(obj, node)
+        return res_node
+        
+    def open_from_xml(self, filename, vtType, tree=None):
+        """open_from_xml(filename) -> DBVistrail"""
+        if tree is None:
+            tree = self.parse_xml_file(filename)
+        vistrail = self.read_xml_object(vtType, tree.getroot())
+        return vistrail
+
+    def save_to_xml(self, obj, filename, tags, version=None):
+        """save_to_xml(obj : object, filename: str, tags: dict,
+                       version: str) -> None
+    
+        """
+        root = self.write_xml_object(obj)
+        if version is None:
+            version = my_version
+        root.set('version', version)
+        for k, v in tags.iteritems():
+            root.set(k, v)
+        tree = ElementTree.ElementTree(root)
+        self.write_xml_file(filename, tree)
+
+    def open_from_db(self, db_connection, vtType, id=None, lock=False, 
+                     global_props=None):
+        all_objects = {}
+        if global_props is None:
+            global_props = {}
+        if id is not None:
+            global_props['id'] = id
+        #  global_props
+        res_objects = self['sql'][vtType].get_sql_columns(db_connection, 
+                                                          global_props,
+                                                          lock)
+        if len(res_objects) > 1:
+            raise VistrailsDBException("More than object of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        elif len(res_objects) <= 0:
+            raise VistrailsDBException("No objects of type '%s' and "
+                                       "id '%s' exist in the database" % \
+                                           (vtType, id))
+        
+        all_objects.update(res_objects)
+        res = res_objects.values()[0]
+        global_props = {'entity_id': res.db_id,
+                        'entity_type': res.vtType}
+
+        # collect all commands so that they can be executed together
+        # daoList should contain (dao_type, dao, dbCommand) values
+        daoList = []
+        # dbCommandList should contain dbCommand values
+        dbCommandList = []
+        
+        # generate SELECT statements
+        for dao_type, dao in self['sql'].iteritems():
+            if dao_type in root_set:
+                continue
+
+            daoList.append([dao_type, dao, None])
+            dbCommand = dao.get_sql_select(db_connection, global_props, lock)
+            dbCommandList.append(dbCommand)
+            
+        # Exacute all select statements
+        results = self['sql'][vtType].executeSQLGroup(db_connection,
+                                                      dbCommandList, True)
+
+        # add result to correct dao
+        for i in xrange(len(daoList)):
+            daoList[i][2] = results[i]
+        
+        # process results
+        for dao_type, dao, data in daoList:
+            current_objs = dao.process_sql_columns(data, global_props)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        for key, obj in all_objects.iteritems():
+            if key[0] == vtType and key[1] == id:
+                continue
+            self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for obj in all_objects.itervalues():
+            obj.is_dirty = False
+            obj.is_new = False
+
+        return res
+
+    def open_many_from_db(self, db_connection, vtType, ids, lock=False):
+        """ Loads multiple objects. They need to be loaded as one single
+            multiple select statement command for performance reasons.
+        """
+
+        log_dao = self['sql'][vtType]
+        # loop through ids and build SELECT statements
+        selects = [log_dao.get_sql_select(db_connection, {'id': id}, lock)
+                   for id in ids]
+        # Execute all SELECT statements for main objects
+        results = log_dao.executeSQLGroup(db_connection, selects, True)
+
+        # list of final objects
+        objects = []
+        # list of selects
+        selects = []
+        # list of children id:all_objects_dict
+        all_objects_dict = {}
+        # process each result and extract child SELECTS
+        # daoList should contain (id, dao_type, dao, result) values
+        daoList = []
+        # selects should contain dbCommand values
+        selects = []
+        global_props = {}
+        for id, data in zip(ids, results):
+            res_objects = log_dao.process_sql_columns(data, global_props)
+            if len(res_objects) > 1:
+                raise VistrailsDBException("More than object of type '%s' and "
+                                           "id '%s' exist in the database" % \
+                                               (vtType, id))
+            elif len(res_objects) <= 0:
+                raise VistrailsDBException("No objects of type '%s' and "
+                                           "id '%s' exist in the database" % \
+                                               (vtType, id))
+            all_objects = {}
+            all_objects_dict[id] = all_objects
+            all_objects.update(res_objects)
+            objects.append(res_objects.values()[0])
+            # collect all commands so that they can be executed together
+        
+            # generate SELECT statements for children
+            for dao_type, dao in self['sql'].iteritems():
+                if dao_type in root_set:
+                    continue
+    
+                daoList.append([id, dao_type, dao, None])
+                dbCommand = dao.get_sql_select(db_connection, global_props, lock)
+                selects.append(dbCommand)
+
+        # Execute all child select statements
+        results = self['sql'][vtType].executeSQLGroup(db_connection,
+                                                      selects, True)
+        for i in xrange(len(daoList)):
+            daoList[i][3] = results[i]
+
+        # process results
+        for id, dao_type, dao, data in daoList:
+            all_objects = all_objects_dict[id]
+            current_objs = dao.process_sql_columns(data, global_props)
+            all_objects.update(current_objs)
+
+            if dao_type == DBGroup.vtType:
+                for key, obj in current_objs.iteritems():
+                    new_props = {'parent_id': key[1],
+                                 'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    res_obj = self.open_from_db(db_connection, 
+                                                DBWorkflow.vtType, 
+                                                None, lock, new_props)
+                    res_dict = {}
+                    res_dict[(res_obj.vtType, res_obj.db_id)] = res_obj
+                    all_objects.update(res_dict)
+
+        
+        for id, all_objects in all_objects_dict.iteritems():
+            for key, obj in all_objects.iteritems():
+                if key[0] == vtType and key[1] == id:
+                    continue
+                self['sql'][obj.vtType].from_sql_fast(obj, all_objects)
+        for id, dao_type, dao, data in daoList:
+            all_objects = all_objects_dict[id]
+            for obj in all_objects.itervalues():
+                obj.is_dirty = False
+                obj.is_new = False
+    
+        return objects
+
+    def save_to_db(self, db_connection, obj, do_copy=False, global_props=None):
+        if do_copy == 'with_ids':
+            do_copy = True
+        elif do_copy and obj.db_id is not None:
+            obj.db_id = None
+
+        children = obj.db_children()
+        children.reverse()
+        if global_props is None:
+            global_props = {'entity_type': obj.vtType}
+        # print 'global_props:', global_props
+
+        # assumes not deleting entire thing
+        child = children[0][0]
+        self['sql'][child.vtType].set_sql_columns(db_connection, child, 
+                                                  global_props, do_copy)
+        self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        global_props = {'entity_id': child.db_id,
+                        'entity_type': child.vtType}
+
+        # do deletes
+        if not do_copy:
+            for (child, _, _) in children:
+                for c in child.db_deleted_children(True):
+                    self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                            c,
+                                                            global_props)
+        child = children.pop(0)[0]
+        child.is_dirty = False
+        child.is_new = False
+        
+        if not len(children):
+            return
+
+        # list of all children
+        dbCommandList = []
+        writtenChildren = []
+        # process remaining children
+        for (child, _, _) in children:
+            dbCommand = self['sql'][child.vtType].set_sql_command(
+                            db_connection, child, global_props, do_copy)
+            if dbCommand is not None:
+                dbCommandList.append(dbCommand)
+                writtenChildren.append(child)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+        # Debug version of Execute all insert/update statements
+        #results = [self['sql'][children[0][0].vtType].executeSQL(
+        #                      db_connection, c, False) for c in dbCommandList]
+
+        # Execute all insert/update statements
+        results = self['sql'][children[0][0].vtType].executeSQLGroup(
+                                                    db_connection,
+                                                    dbCommandList, False)
+        resultDict = dict(zip(writtenChildren, results))
+        # process remaining children
+        for (child, _, _) in children:
+            if child in resultDict:
+                lastId = resultDict[child]
+                self['sql'][child.vtType].set_sql_process(child, 
+                                                          global_props,
+                                                          lastId)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+            if child.vtType == DBGroup.vtType:
+                if child.db_workflow:
+                    # print '*** entity_type:', global_props['entity_type']
+                    new_props = {'entity_id': global_props['entity_id'],
+                                 'entity_type': global_props['entity_type']}
+                    is_dirty = child.db_workflow.is_dirty
+                    child.db_workflow.db_entity_type = DBWorkflow.vtType
+                    child.db_workflow.is_dirty = is_dirty
+                    self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                    new_props)
+
+    def save_many_to_db(self, db_connection, objList, do_copy=False):
+        if do_copy == 'with_ids':
+            do_copy = True
+        if not len(objList):
+            return
+        childrenDict = {}
+        global_propsDict = {}
+        dbCommandList = []
+        writtenChildren = []
+        for obj in objList:
+            if do_copy and obj.db_id is not None:
+                obj.db_id = None
+
+            children = obj.db_children()
+            children.reverse()
+            global_props = {'entity_type': obj.vtType}
+
+            child = children[0][0]
+            dbCommand = self['sql'][child.vtType].set_sql_command(
+                db_connection, child, global_props, do_copy)
+            if dbCommand is not None:
+                dbCommandList.append(dbCommand)
+                writtenChildren.append(child)
+            
+            childrenDict[child] = children
+            global_propsDict[child] = global_props
+
+        # Execute all insert/update statements for the main objects
+        results = self['sql'][children[0][0].vtType].executeSQLGroup(
+                                                    db_connection,
+                                                    dbCommandList, False)
+        resultDict = dict(zip(writtenChildren, results))
+        dbCommandList = []
+        writtenChildren = []
+        for child, children in childrenDict.iteritems():
+            # process objects
+            if child in resultDict:
+                lastId = resultDict[child]
+                self['sql'][child.vtType].set_sql_process(
+                    child, global_propsDict[child], lastId)
+            self['sql'][child.vtType].to_sql_fast(child, do_copy)
+
+            # process children
+            global_props = {'entity_id': child.db_id,
+                                       'entity_type': child.vtType}
+            global_propsDict[child] = global_props
+            # do deletes
+            if not do_copy:
+                for (child, _, _) in childrenDict[child]:
+                    for c in child.db_deleted_children(True):
+                        self['sql'][c.vtType].delete_sql_column(db_connection,
+                                                                c,
+                                                                global_props)
+            child = children.pop(0)[0]
+            child.is_dirty = False
+            child.is_new = False
+            
+            # list of all children
+            # process remaining children
+            for (child, _, _) in children:
+                dbCommand = self['sql'][child.vtType].set_sql_command(
+                                db_connection, child, global_props, do_copy)
+                if dbCommand is not None:
+                    dbCommandList.append(dbCommand)
+                    writtenChildren.append(child)
+                self['sql'][child.vtType].to_sql_fast(child, do_copy)
+    
+        # Execute all child insert/update statements
+        results = self['sql'][children[0][0].vtType].executeSQLGroup(
+                                                        db_connection,
+                                                        dbCommandList, False)
+        resultDict = dict(zip(writtenChildren, results))
+
+        for child, children in childrenDict.iteritems():
+            global_props = global_propsDict[child]
+            # process remaining children
+            for (child, _, _) in children:
+                if child in resultDict:
+                    lastId = resultDict[child]
+                    self['sql'][child.vtType].set_sql_process(child, 
+                                                              global_props,
+                                                              lastId)
+                self['sql'][child.vtType].to_sql_fast(child, do_copy)
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        # print '*** entity_type:', global_props['entity_type']
+                        new_props = {'entity_id': global_props['entity_id'],
+                                     'entity_type': global_props['entity_type']}
+                        is_dirty = child.db_workflow.is_dirty
+                        child.db_workflow.db_entity_type = DBWorkflow.vtType
+                        child.db_workflow.is_dirty = is_dirty
+                        self.save_to_db(db_connection, child.db_workflow, do_copy,
+                                        new_props)
+
+    def delete_from_db(self, db_connection, type, obj_id):
+        if type not in root_set:
+            raise VistrailsDBException("Cannot delete entity of type '%s'" \
+                                           % type)
+
+        id_str = str(obj_id)
+        for (dao_type, dao) in self['sql'].iteritems():
+            if dao_type not in root_set:
+                db_cmd = \
+                    self['sql'][type].createSQLDelete(dao.table,
+                                                      {'entity_type': type,
+                                                       'entity_id': id_str})
+                self['sql'][type].executeSQL(db_connection, db_cmd, False)
+        db_cmd = self['sql'][type].createSQLDelete(self['sql'][type].table,
+                                                   {'id': id_str})
+        self['sql'][type].executeSQL(db_connection, db_cmd, False)
+
+    def serialize(self, object):
+        root = self.write_xml_object(object)
+        return ElementTree.tostring(root)
+
+    def unserialize(self, str, obj_type):
+        def set_dirty(obj):
+            for child, _, _ in obj.db_children():
+                if child.vtType == DBGroup.vtType:
+                    if child.db_workflow:
+                        set_dirty(child.db_workflow)
+                child.is_dirty = True
+                child.is_new = True
+        try:
+            root = ElementTree.fromstring(str)
+            obj = self.read_xml_object(obj_type, root)
+            set_dirty(obj)
+            return obj
+        except SyntaxError, e:
+            msg = "Invalid VisTrails serialized object %s" % str
+            raise VistrailsDBException(msg)
+            return None
diff --git a/vistrails/db/versions/v1_0_3/persistence/sql/__init__.py b/vistrails/db/versions/v1_0_3/persistence/sql/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/sql/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_3/persistence/sql/auto_gen.py b/vistrails/db/versions/v1_0_3/persistence/sql/auto_gen.py
new file mode 100644
index 0000000..db939f3
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/sql/auto_gen.py
@@ -0,0 +1,7984 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+from sql_dao import SQLDAO
+from vistrails.db.versions.v1_0_3.domain import *
+
+class DBVistrailVariableSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail_variable'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['name', 'uuid', 'package', 'module', 'namespace', 'value', 'parent_id', 'entity_id', 'entity_type']
+        table = 'vistrail_variable'
+        whereMap = global_props
+        orderBy = 'name'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            uuid = self.convertFromDB(row[1], 'str', 'char(36)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            module = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[5], 'str', 'varchar(8191)')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            vistrailVariable = DBVistrailVariable(uuid=uuid,
+                                                  package=package,
+                                                  module=module,
+                                                  namespace=namespace,
+                                                  value=value,
+                                                  name=name)
+            vistrailVariable.db_vistrail = vistrail
+            vistrailVariable.db_entity_id = entity_id
+            vistrailVariable.db_entity_type = entity_type
+            vistrailVariable.is_dirty = False
+            res[('vistrailVariable', name)] = vistrailVariable
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['name', 'uuid', 'package', 'module', 'namespace', 'value', 'parent_id', 'entity_id', 'entity_type']
+        table = 'vistrail_variable'
+        whereMap = global_props
+        orderBy = 'name'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            name = self.convertFromDB(row[0], 'str', 'varchar(255)')
+            uuid = self.convertFromDB(row[1], 'str', 'char(36)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            module = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[5], 'str', 'varchar(8191)')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            vistrailVariable = DBVistrailVariable(uuid=uuid,
+                                                  package=package,
+                                                  module=module,
+                                                  namespace=namespace,
+                                                  value=value,
+                                                  name=name)
+            vistrailVariable.db_vistrail = vistrail
+            vistrailVariable.db_entity_id = entity_id
+            vistrailVariable.db_entity_type = entity_type
+            vistrailVariable.is_dirty = False
+            res[('vistrailVariable', name)] = vistrailVariable
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_vistrailVariable(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['name', 'uuid', 'package', 'module', 'namespace', 'value', 'parent_id', 'entity_id', 'entity_type']
+        table = 'vistrail_variable'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_name is not None:
+            keyStr = self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            whereMap['name'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_uuid') and obj.db_uuid is not None:
+            columnMap['uuid'] = \
+                self.convertToDB(obj.db_uuid, 'str', 'char(36)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_module') and obj.db_module is not None:
+            columnMap['module'] = \
+                self.convertToDB(obj.db_module, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['name', 'uuid', 'package', 'module', 'namespace', 'value', 'parent_id', 'entity_id', 'entity_type']
+        table = 'vistrail_variable'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_name is not None:
+            keyStr = self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            whereMap['name'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_uuid') and obj.db_uuid is not None:
+            columnMap['uuid'] = \
+                self.convertToDB(obj.db_uuid, 'str', 'char(36)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_module') and obj.db_module is not None:
+            columnMap['module'] = \
+                self.convertToDB(obj.db_module, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail_variable'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_name is not None:
+            keyStr = self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+            whereMap['name'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSpecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'min_conns', 'max_conns', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            min_conns = self.convertFromDB(row[5], 'int', 'int')
+            max_conns = self.convertFromDB(row[6], 'int', 'int')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  min_conns=min_conns,
+                                  max_conns=max_conns,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'min_conns', 'max_conns', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            optional = self.convertFromDB(row[3], 'int', 'int')
+            sort_key = self.convertFromDB(row[4], 'int', 'int')
+            min_conns = self.convertFromDB(row[5], 'int', 'int')
+            max_conns = self.convertFromDB(row[6], 'int', 'int')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            portSpec = DBPortSpec(name=name,
+                                  type=type,
+                                  optional=optional,
+                                  sort_key=sort_key,
+                                  min_conns=min_conns,
+                                  max_conns=max_conns,
+                                  id=id)
+            portSpec.db_parentType = parentType
+            portSpec.db_entity_id = entity_id
+            portSpec.db_entity_type = entity_type
+            portSpec.db_parent = parent
+            portSpec.is_dirty = False
+            res[('portSpec', id)] = portSpec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'module_descriptor':
+            p = all_objects[('module_descriptor', obj.db_parent)]
+            p.db_add_portSpec(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'min_conns', 'max_conns', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_min_conns') and obj.db_min_conns is not None:
+            columnMap['min_conns'] = \
+                self.convertToDB(obj.db_min_conns, 'int', 'int')
+        if hasattr(obj, 'db_max_conns') and obj.db_max_conns is not None:
+            columnMap['max_conns'] = \
+                self.convertToDB(obj.db_max_conns, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'type', 'optional', 'sort_key', 'min_conns', 'max_conns', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_optional') and obj.db_optional is not None:
+            columnMap['optional'] = \
+                self.convertToDB(obj.db_optional, 'int', 'int')
+        if hasattr(obj, 'db_sort_key') and obj.db_sort_key is not None:
+            columnMap['sort_key'] = \
+                self.convertToDB(obj.db_sort_key, 'int', 'int')
+        if hasattr(obj, 'db_min_conns') and obj.db_min_conns is not None:
+            columnMap['min_conns'] = \
+                self.convertToDB(obj.db_min_conns, 'int', 'int')
+        if hasattr(obj, 'db_max_conns') and obj.db_max_conns is not None:
+            columnMap['max_conns'] = \
+                self.convertToDB(obj.db_max_conns, 'int', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_portSpecItems:
+            child.db_portSpec = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            module = DBModule(cache=cache,
+                              name=name,
+                              namespace=namespace,
+                              package=package,
+                              version=version,
+                              id=id)
+            module.db_parentType = parentType
+            module.db_entity_id = entity_id
+            module.db_entity_type = entity_type
+            module.db_parent = parent
+            module.is_dirty = False
+            res[('module', id)] = module
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleDescriptorSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_descriptor'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[6], 'long', 'int')
+            package = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   package_version=package_version,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            base_descriptor_id = self.convertFromDB(row[6], 'long', 'int')
+            package = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            module_descriptor = DBModuleDescriptor(name=name,
+                                                   package=package,
+                                                   namespace=namespace,
+                                                   package_version=package_version,
+                                                   version=version,
+                                                   base_descriptor_id=base_descriptor_id,
+                                                   id=id)
+            module_descriptor.db_package = package
+            module_descriptor.db_entity_id = entity_id
+            module_descriptor.db_entity_type = entity_type
+            module_descriptor.is_dirty = False
+            res[('module_descriptor', id)] = module_descriptor
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('package', obj.db_package) in all_objects:
+            p = all_objects[('package', obj.db_package)]
+            p.db_add_module_descriptor(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package_version') and obj.db_package_version is not None:
+            columnMap['package_version'] = \
+                self.convertToDB(obj.db_package_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'package', 'namespace', 'package_version', 'version', 'base_descriptor_id', 'parent_id', 'entity_id', 'entity_type']
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package_version') and obj.db_package_version is not None:
+            columnMap['package_version'] = \
+                self.convertToDB(obj.db_package_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_base_descriptor_id') and obj.db_base_descriptor_id is not None:
+            columnMap['base_descriptor_id'] = \
+                self.convertToDB(obj.db_base_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_package, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_portSpecs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_descriptor'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBTagSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'tag'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            tag = DBTag(name=name,
+                        id=id)
+            tag.db_vistrail = vistrail
+            tag.db_entity_id = entity_id
+            tag.db_entity_type = entity_type
+            tag.is_dirty = False
+            res[('tag', id)] = tag
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_tag(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'tag'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            type = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            moduleId = self.convertFromDB(row[2], 'long', 'int')
+            moduleName = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            signature = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            port = DBPort(type=type,
+                          moduleId=moduleId,
+                          moduleName=moduleName,
+                          name=name,
+                          signature=signature,
+                          id=id)
+            port.db_parentType = parentType
+            port.db_entity_id = entity_id
+            port.db_entity_type = entity_type
+            port.db_parent = parent
+            port.is_dirty = False
+            res[('port', id)] = port
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'connection':
+            p = all_objects[('connection', obj.db_parent)]
+            p.db_add_port(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'type', 'moduleId', 'moduleName', 'name', 'signature', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_moduleId') and obj.db_moduleId is not None:
+            columnMap['moduleId'] = \
+                self.convertToDB(obj.db_moduleId, 'long', 'int')
+        if hasattr(obj, 'db_moduleName') and obj.db_moduleName is not None:
+            columnMap['moduleName'] = \
+                self.convertToDB(obj.db_moduleName, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_signature') and obj.db_signature is not None:
+            columnMap['signature'] = \
+                self.convertToDB(obj.db_signature, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            group = DBGroup(cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            id=id)
+            group.db_parentType = parentType
+            group.db_entity_id = entity_id
+            group.db_entity_type = entity_type
+            group.db_parent = parent
+            group.is_dirty = False
+            res[('group', id)] = group
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_workflow is not None:
+            child = obj.db_workflow
+            child.db_group = obj.db_id
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLogSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'log_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[5], 'long', 'int')
+            
+            log = DBLog(entity_type=entity_type,
+                        version=version,
+                        name=name,
+                        last_modified=last_modified,
+                        vistrail_id=vistrail_id,
+                        id=id)
+            log.is_dirty = False
+            res[('log', id)] = log
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified', 'vistrail_id']
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_workflow_execs:
+            child.db_log = obj.db_id
+        for child in obj.db_machines:
+            child.db_log = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'log_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMashupAliasSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'mashup_alias'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_alias'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parent = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            mashup_alias = DBMashupAlias(name=name,
+                                         id=id)
+            mashup_alias.db_parent = parent
+            mashup_alias.db_entity_id = entity_id
+            mashup_alias.db_entity_type = entity_type
+            mashup_alias.is_dirty = False
+            res[('mashup_alias', id)] = mashup_alias
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_alias'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            parent = self.convertFromDB(row[2], 'long', 'int')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            
+            mashup_alias = DBMashupAlias(name=name,
+                                         id=id)
+            mashup_alias.db_parent = parent
+            mashup_alias.db_entity_id = entity_id
+            mashup_alias.db_entity_type = entity_type
+            mashup_alias.is_dirty = False
+            res[('mashup_alias', id)] = mashup_alias
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('mashup', obj.db_parent) in all_objects:
+            p = all_objects[('mashup', obj.db_parent)]
+            p.db_add_alias(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_alias'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_alias'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_component is not None:
+            child = obj.db_component
+            child.db_mashup_alias = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'mashup_alias'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMashupSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'mashup'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'version', 'type', 'vtid', 'layout', 'geometry', 'has_seq', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[2], 'long', 'int')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            vtid = self.convertFromDB(row[4], 'long', 'int')
+            layout = self.convertFromDB(row[5], 'str', 'mediumtext')
+            geometry = self.convertFromDB(row[6], 'str', 'mediumtext')
+            has_seq = self.convertFromDB(row[7], 'int', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'int')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            
+            mashup = DBMashup(name=name,
+                              version=version,
+                              type=type,
+                              vtid=vtid,
+                              layout=layout,
+                              geometry=geometry,
+                              has_seq=has_seq,
+                              id=id)
+            mashup.db_parent = parent
+            mashup.db_entity_id = entity_id
+            mashup.db_entity_type = entity_type
+            mashup.is_dirty = False
+            res[('mashup', id)] = mashup
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'version', 'type', 'vtid', 'layout', 'geometry', 'has_seq', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[2], 'long', 'int')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            vtid = self.convertFromDB(row[4], 'long', 'int')
+            layout = self.convertFromDB(row[5], 'str', 'mediumtext')
+            geometry = self.convertFromDB(row[6], 'str', 'mediumtext')
+            has_seq = self.convertFromDB(row[7], 'int', 'int')
+            parent = self.convertFromDB(row[8], 'long', 'int')
+            entity_id = self.convertFromDB(row[9], 'long', 'int')
+            entity_type = self.convertFromDB(row[10], 'str', 'char(16)')
+            
+            mashup = DBMashup(name=name,
+                              version=version,
+                              type=type,
+                              vtid=vtid,
+                              layout=layout,
+                              geometry=geometry,
+                              has_seq=has_seq,
+                              id=id)
+            mashup.db_parent = parent
+            mashup.db_entity_id = entity_id
+            mashup.db_entity_type = entity_type
+            mashup.is_dirty = False
+            res[('mashup', id)] = mashup
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('mashup_action', obj.db_parent) in all_objects:
+            p = all_objects[('mashup_action', obj.db_parent)]
+            p.db_add_mashup(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'version', 'type', 'vtid', 'layout', 'geometry', 'has_seq', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vtid') and obj.db_vtid is not None:
+            columnMap['vtid'] = \
+                self.convertToDB(obj.db_vtid, 'long', 'int')
+        if hasattr(obj, 'db_layout') and obj.db_layout is not None:
+            columnMap['layout'] = \
+                self.convertToDB(obj.db_layout, 'str', 'mediumtext')
+        if hasattr(obj, 'db_geometry') and obj.db_geometry is not None:
+            columnMap['geometry'] = \
+                self.convertToDB(obj.db_geometry, 'str', 'mediumtext')
+        if hasattr(obj, 'db_has_seq') and obj.db_has_seq is not None:
+            columnMap['has_seq'] = \
+                self.convertToDB(obj.db_has_seq, 'int', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'version', 'type', 'vtid', 'layout', 'geometry', 'has_seq', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vtid') and obj.db_vtid is not None:
+            columnMap['vtid'] = \
+                self.convertToDB(obj.db_vtid, 'long', 'int')
+        if hasattr(obj, 'db_layout') and obj.db_layout is not None:
+            columnMap['layout'] = \
+                self.convertToDB(obj.db_layout, 'str', 'mediumtext')
+        if hasattr(obj, 'db_geometry') and obj.db_geometry is not None:
+            columnMap['geometry'] = \
+                self.convertToDB(obj.db_geometry, 'str', 'mediumtext')
+        if hasattr(obj, 'db_has_seq') and obj.db_has_seq is not None:
+            columnMap['has_seq'] = \
+                self.convertToDB(obj.db_has_seq, 'int', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_aliases:
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'mashup'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPortSpecItemSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'port_spec_item'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'module', 'package', 'namespace', 'label', '_default', '_values', 'entry_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'port_spec_item'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            module = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            label = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            default = self.convertFromDB(row[6], 'str', 'varchar(4095)')
+            values = self.convertFromDB(row[7], 'str', 'mediumtext')
+            entry_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            portSpec = self.convertFromDB(row[9], 'long', 'int')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            
+            portSpecItem = DBPortSpecItem(pos=pos,
+                                          module=module,
+                                          package=package,
+                                          namespace=namespace,
+                                          label=label,
+                                          default=default,
+                                          values=values,
+                                          entry_type=entry_type,
+                                          id=id)
+            portSpecItem.db_portSpec = portSpec
+            portSpecItem.db_entity_id = entity_id
+            portSpecItem.db_entity_type = entity_type
+            portSpecItem.is_dirty = False
+            res[('portSpecItem', id)] = portSpecItem
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'module', 'package', 'namespace', 'label', '_default', '_values', 'entry_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'port_spec_item'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            module = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            label = self.convertFromDB(row[5], 'str', 'varchar(4095)')
+            default = self.convertFromDB(row[6], 'str', 'varchar(4095)')
+            values = self.convertFromDB(row[7], 'str', 'mediumtext')
+            entry_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            portSpec = self.convertFromDB(row[9], 'long', 'int')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            
+            portSpecItem = DBPortSpecItem(pos=pos,
+                                          module=module,
+                                          package=package,
+                                          namespace=namespace,
+                                          label=label,
+                                          default=default,
+                                          values=values,
+                                          entry_type=entry_type,
+                                          id=id)
+            portSpecItem.db_portSpec = portSpec
+            portSpecItem.db_entity_id = entity_id
+            portSpecItem.db_entity_type = entity_type
+            portSpecItem.is_dirty = False
+            res[('portSpecItem', id)] = portSpecItem
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('portSpec', obj.db_portSpec) in all_objects:
+            p = all_objects[('portSpec', obj.db_portSpec)]
+            p.db_add_portSpecItem(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'module', 'package', 'namespace', 'label', '_default', '_values', 'entry_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'port_spec_item'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_module') and obj.db_module is not None:
+            columnMap['module'] = \
+                self.convertToDB(obj.db_module, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_label') and obj.db_label is not None:
+            columnMap['label'] = \
+                self.convertToDB(obj.db_label, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_default') and obj.db_default is not None:
+            columnMap['_default'] = \
+                self.convertToDB(obj.db_default, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_values') and obj.db_values is not None:
+            columnMap['_values'] = \
+                self.convertToDB(obj.db_values, 'str', 'mediumtext')
+        if hasattr(obj, 'db_entry_type') and obj.db_entry_type is not None:
+            columnMap['entry_type'] = \
+                self.convertToDB(obj.db_entry_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_portSpec') and obj.db_portSpec is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_portSpec, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'pos', 'module', 'package', 'namespace', 'label', '_default', '_values', 'entry_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'port_spec_item'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_module') and obj.db_module is not None:
+            columnMap['module'] = \
+                self.convertToDB(obj.db_module, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_label') and obj.db_label is not None:
+            columnMap['label'] = \
+                self.convertToDB(obj.db_label, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_default') and obj.db_default is not None:
+            columnMap['_default'] = \
+                self.convertToDB(obj.db_default, 'str', 'varchar(4095)')
+        if hasattr(obj, 'db_values') and obj.db_values is not None:
+            columnMap['_values'] = \
+                self.convertToDB(obj.db_values, 'str', 'mediumtext')
+        if hasattr(obj, 'db_entry_type') and obj.db_entry_type is not None:
+            columnMap['entry_type'] = \
+                self.convertToDB(obj.db_entry_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_portSpec') and obj.db_portSpec is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_portSpec, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'port_spec_item'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMachineSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'machine'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'bigint')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            os = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            architecture = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            processor = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ram = self.convertFromDB(row[5], 'int', 'bigint')
+            vistrailId = self.convertFromDB(row[6], 'long', 'int')
+            log = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            machine = DBMachine(name=name,
+                                os=os,
+                                architecture=architecture,
+                                processor=processor,
+                                ram=ram,
+                                id=id)
+            machine.db_vistrailId = vistrailId
+            machine.db_log = log
+            machine.db_entity_id = entity_id
+            machine.db_entity_type = entity_type
+            machine.is_dirty = False
+            res[('machine', id)] = machine
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_machine(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'bigint')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'os', 'architecture', 'processor', 'ram', 'vt_id', 'log_id', 'entity_id', 'entity_type']
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_os') and obj.db_os is not None:
+            columnMap['os'] = \
+                self.convertToDB(obj.db_os, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_architecture') and obj.db_architecture is not None:
+            columnMap['architecture'] = \
+                self.convertToDB(obj.db_architecture, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_processor') and obj.db_processor is not None:
+            columnMap['processor'] = \
+                self.convertToDB(obj.db_processor, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ram') and obj.db_ram is not None:
+            columnMap['ram'] = \
+                self.convertToDB(obj.db_ram, 'int', 'bigint')
+        if hasattr(obj, 'db_vistrailId') and obj.db_vistrailId is not None:
+            columnMap['vt_id'] = \
+                self.convertToDB(obj.db_vistrailId, 'long', 'int')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'machine'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAddSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'add_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            add = DBAdd(what=what,
+                        objectId=objectId,
+                        parentObjId=parentObjId,
+                        parentObjType=parentObjType,
+                        id=id)
+            add.db_action = action
+            add.db_entity_id = entity_id
+            add.db_entity_type = entity_type
+            add.is_dirty = False
+            res[('add', id)] = add
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'add_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBOtherSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'other'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            other = DBOther(key=key,
+                            value=value,
+                            id=id)
+            other.db_parentType = parentType
+            other.db_entity_id = entity_id
+            other.db_entity_type = entity_type
+            other.db_parent = parent
+            other.is_dirty = False
+            res[('other', id)] = other
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_other(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'okey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['okey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'other'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLocationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'location'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            x = self.convertFromDB(row[1], 'float', 'DECIMAL(18,12)')
+            y = self.convertFromDB(row[2], 'float', 'DECIMAL(18,12)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            location = DBLocation(x=x,
+                                  y=y,
+                                  id=id)
+            location.db_parentType = parentType
+            location.db_entity_id = entity_id
+            location.db_entity_type = entity_type
+            location.db_parent = parent
+            location.is_dirty = False
+            res[('location', id)] = location
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_location(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'x', 'y', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_x') and obj.db_x is not None:
+            columnMap['x'] = \
+                self.convertToDB(obj.db_x, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_y') and obj.db_y is not None:
+            columnMap['y'] = \
+                self.convertToDB(obj.db_y, 'float', 'DECIMAL(18,12)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'location'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPEParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'pe_parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'interpolator', 'value', 'dimension', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            interpolator = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[3], 'str', 'mediumtext')
+            dimension = self.convertFromDB(row[4], 'long', 'int')
+            parentType = self.convertFromDB(row[5], 'str', 'char(32)')
+            pe_function = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            pe_parameter = DBPEParameter(pos=pos,
+                                         interpolator=interpolator,
+                                         value=value,
+                                         dimension=dimension,
+                                         id=id)
+            pe_parameter.db_parentType = parentType
+            pe_parameter.db_pe_function = pe_function
+            pe_parameter.db_entity_id = entity_id
+            pe_parameter.db_entity_type = entity_type
+            pe_parameter.is_dirty = False
+            res[('pe_parameter', id)] = pe_parameter
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'interpolator', 'value', 'dimension', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_parameter'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            interpolator = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[3], 'str', 'mediumtext')
+            dimension = self.convertFromDB(row[4], 'long', 'int')
+            parentType = self.convertFromDB(row[5], 'str', 'char(32)')
+            pe_function = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            pe_parameter = DBPEParameter(pos=pos,
+                                         interpolator=interpolator,
+                                         value=value,
+                                         dimension=dimension,
+                                         id=id)
+            pe_parameter.db_parentType = parentType
+            pe_parameter.db_pe_function = pe_function
+            pe_parameter.db_entity_id = entity_id
+            pe_parameter.db_entity_type = entity_type
+            pe_parameter.is_dirty = False
+            res[('pe_parameter', id)] = pe_parameter
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('pe_function', obj.db_pe_function) in all_objects:
+            p = all_objects[('pe_function', obj.db_pe_function)]
+            p.db_add_parameter(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'interpolator', 'value', 'dimension', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_interpolator') and obj.db_interpolator is not None:
+            columnMap['interpolator'] = \
+                self.convertToDB(obj.db_interpolator, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'mediumtext')
+        if hasattr(obj, 'db_dimension') and obj.db_dimension is not None:
+            columnMap['dimension'] = \
+                self.convertToDB(obj.db_dimension, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_pe_function') and obj.db_pe_function is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_pe_function, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'pos', 'interpolator', 'value', 'dimension', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_interpolator') and obj.db_interpolator is not None:
+            columnMap['interpolator'] = \
+                self.convertToDB(obj.db_interpolator, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'mediumtext')
+        if hasattr(obj, 'db_dimension') and obj.db_dimension is not None:
+            columnMap['dimension'] = \
+                self.convertToDB(obj.db_dimension, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_pe_function') and obj.db_pe_function is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_pe_function, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'pe_parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'mediumtext')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            type = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[4], 'str', 'mediumtext')
+            alias = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            parameter = DBParameter(pos=pos,
+                                    name=name,
+                                    type=type,
+                                    val=val,
+                                    alias=alias,
+                                    id=id)
+            parameter.db_parentType = parentType
+            parameter.db_entity_id = entity_id
+            parameter.db_entity_type = entity_type
+            parameter.db_parent = parent
+            parameter.is_dirty = False
+            res[('parameter', id)] = parameter
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'function':
+            p = all_objects[('function', obj.db_parent)]
+            p.db_add_parameter(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'mediumtext')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'pos', 'name', 'type', 'val', 'alias', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'mediumtext')
+        if hasattr(obj, 'db_alias') and obj.db_alias is not None:
+            columnMap['alias'] = \
+                self.convertToDB(obj.db_alias, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPluginDataSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'plugin_data'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            data = self.convertFromDB(row[1], 'str', 'varchar(8191)')
+            parentType = self.convertFromDB(row[2], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[3], 'long', 'int')
+            entity_type = self.convertFromDB(row[4], 'str', 'char(16)')
+            parent = self.convertFromDB(row[5], 'long', 'long')
+            
+            plugin_data = DBPluginData(data=data,
+                                       id=id)
+            plugin_data.db_parentType = parentType
+            plugin_data.db_entity_id = entity_id
+            plugin_data.db_entity_type = entity_type
+            plugin_data.db_parent = parent
+            plugin_data.is_dirty = False
+            res[('plugin_data', id)] = plugin_data
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_plugin_data(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'data', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_data') and obj.db_data is not None:
+            columnMap['data'] = \
+                self.convertToDB(obj.db_data, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'plugin_data'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            pos = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            function = DBFunction(pos=pos,
+                                  name=name,
+                                  id=id)
+            function.db_parentType = parentType
+            function.db_entity_id = entity_id
+            function.db_entity_type = entity_type
+            function.db_parent = parent
+            function.is_dirty = False
+            res[('function', id)] = function
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_function(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'pos', 'name', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action_annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            action_id = self.convertFromDB(row[3], 'long', 'int')
+            date = self.convertFromDB(row[4], 'datetime', 'datetime')
+            user = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            actionAnnotation = DBActionAnnotation(key=key,
+                                                  value=value,
+                                                  action_id=action_id,
+                                                  date=date,
+                                                  user=user,
+                                                  id=id)
+            actionAnnotation.db_vistrail = vistrail
+            actionAnnotation.db_entity_id = entity_id
+            actionAnnotation.db_entity_type = entity_type
+            actionAnnotation.is_dirty = False
+            res[('actionAnnotation', id)] = actionAnnotation
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            action_id = self.convertFromDB(row[3], 'long', 'int')
+            date = self.convertFromDB(row[4], 'datetime', 'datetime')
+            user = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            actionAnnotation = DBActionAnnotation(key=key,
+                                                  value=value,
+                                                  action_id=action_id,
+                                                  date=date,
+                                                  user=user,
+                                                  id=id)
+            actionAnnotation.db_vistrail = vistrail
+            actionAnnotation.db_entity_id = entity_id
+            actionAnnotation.db_entity_type = entity_type
+            actionAnnotation.is_dirty = False
+            res[('actionAnnotation', id)] = actionAnnotation
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_actionAnnotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAbstractionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'abstraction'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            cache = self.convertFromDB(row[1], 'int', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            namespace = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            package = self.convertFromDB(row[4], 'str', 'varchar(511)')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            internal_version = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            parentType = self.convertFromDB(row[7], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            parent = self.convertFromDB(row[10], 'long', 'long')
+            
+            abstraction = DBAbstraction(cache=cache,
+                                        name=name,
+                                        namespace=namespace,
+                                        package=package,
+                                        version=version,
+                                        internal_version=internal_version,
+                                        id=id)
+            abstraction.db_parentType = parentType
+            abstraction.db_entity_id = entity_id
+            abstraction.db_entity_type = entity_type
+            abstraction.db_parent = parent
+            abstraction.is_dirty = False
+            res[('abstraction', id)] = abstraction
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_module(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'cache', 'name', 'namespace', 'package', 'version', 'internal_version', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_cache') and obj.db_cache is not None:
+            columnMap['cache'] = \
+                self.convertToDB(obj.db_cache, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_namespace') and obj.db_namespace is not None:
+            columnMap['namespace'] = \
+                self.convertToDB(obj.db_namespace, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_package') and obj.db_package is not None:
+            columnMap['package'] = \
+                self.convertToDB(obj.db_package, 'str', 'varchar(511)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_internal_version') and obj.db_internal_version is not None:
+            columnMap['internal_version'] = \
+                self.convertToDB(obj.db_internal_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_location is not None:
+            child = obj.db_location
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_functions:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'abstraction'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_id = self.convertFromDB(row[1], 'long', 'int')
+            entity_type = self.convertFromDB(row[2], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            version = self.convertFromDB(row[4], 'str', 'char(16)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            vistrail_id = self.convertFromDB(row[6], 'long', 'int')
+            group = self.convertFromDB(row[7], 'long', 'int')
+            
+            workflow = DBWorkflow(entity_type=entity_type,
+                                  name=name,
+                                  version=version,
+                                  last_modified=last_modified,
+                                  vistrail_id=vistrail_id,
+                                  id=id)
+            workflow.db_entity_id = entity_id
+            workflow.db_group = group
+            workflow.is_dirty = False
+            res[('workflow', id)] = workflow
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('group', obj.db_group) in all_objects:
+            p = all_objects[('group', obj.db_group)]
+            p.db_add_workflow(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_id', 'entity_type', 'name', 'version', 'last_modified', 'vistrail_id', 'parent_id']
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_vistrail_id') and obj.db_vistrail_id is not None:
+            columnMap['vistrail_id'] = \
+                self.convertToDB(obj.db_vistrail_id, 'long', 'int')
+        if hasattr(obj, 'db_group') and obj.db_group is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_group, 'long', 'int')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_connections:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_plugin_datas:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_others:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_modules:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMashupActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'mashup_action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            user = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            mashuptrail = self.convertFromDB(row[4], 'long', 'int')
+            entity_id = self.convertFromDB(row[5], 'long', 'int')
+            entity_type = self.convertFromDB(row[6], 'str', 'char(16)')
+            
+            mashup_action = DBMashupAction(prevId=prevId,
+                                           date=date,
+                                           user=user,
+                                           id=id)
+            mashup_action.db_mashuptrail = mashuptrail
+            mashup_action.db_entity_id = entity_id
+            mashup_action.db_entity_type = entity_type
+            mashup_action.is_dirty = False
+            res[('mashup_action', id)] = mashup_action
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            user = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            mashuptrail = self.convertFromDB(row[4], 'long', 'int')
+            entity_id = self.convertFromDB(row[5], 'long', 'int')
+            entity_type = self.convertFromDB(row[6], 'str', 'char(16)')
+            
+            mashup_action = DBMashupAction(prevId=prevId,
+                                           date=date,
+                                           user=user,
+                                           id=id)
+            mashup_action.db_mashuptrail = mashuptrail
+            mashup_action.db_entity_id = entity_id
+            mashup_action.db_entity_type = entity_type
+            mashup_action.is_dirty = False
+            res[('mashup_action', id)] = mashup_action
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('mashuptrail', obj.db_mashuptrail) in all_objects:
+            p = all_objects[('mashuptrail', obj.db_mashuptrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_mashuptrail') and obj.db_mashuptrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_mashuptrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'prev_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_mashuptrail') and obj.db_mashuptrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_mashuptrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_mashup is not None:
+            child = obj.db_mashup
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'mashup_action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMashuptrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'mashuptrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'version', 'vt_version', 'last_modified', 'entity_type']
+        table = 'mashuptrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'char(36)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            vtVersion = self.convertFromDB(row[3], 'long', 'int')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            
+            mashuptrail = DBMashuptrail(name=name,
+                                        version=version,
+                                        vtVersion=vtVersion,
+                                        last_modified=last_modified,
+                                        id=id)
+            mashuptrail.db_entity_type = entity_type
+            mashuptrail.is_dirty = False
+            res[('mashuptrail', id)] = mashuptrail
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'version', 'vt_version', 'last_modified', 'entity_type']
+        table = 'mashuptrail'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'char(36)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            vtVersion = self.convertFromDB(row[3], 'long', 'int')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            
+            mashuptrail = DBMashuptrail(name=name,
+                                        version=version,
+                                        vtVersion=vtVersion,
+                                        last_modified=last_modified,
+                                        id=id)
+            mashuptrail.db_entity_type = entity_type
+            mashuptrail.is_dirty = False
+            res[('mashuptrail', id)] = mashuptrail
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'version', 'vt_version', 'last_modified', 'entity_type']
+        table = 'mashuptrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'char(36)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_vtVersion') and obj.db_vtVersion is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vtVersion, 'long', 'int')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'version', 'vt_version', 'last_modified', 'entity_type']
+        table = 'mashuptrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'char(36)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_vtVersion') and obj.db_vtVersion is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vtVersion, 'long', 'int')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_mashuptrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_actionAnnotations:
+            child.db_mashuptrail = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'mashuptrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBRegistrySQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'registry'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            root_descriptor_id = self.convertFromDB(row[3], 'long', 'int')
+            name = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[5], 'datetime', 'datetime')
+            
+            registry = DBRegistry(entity_type=entity_type,
+                                  version=version,
+                                  root_descriptor_id=root_descriptor_id,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            registry.is_dirty = False
+            res[('registry', id)] = registry
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_type', 'version', 'root_descriptor_id', 'name', 'last_modified']
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_root_descriptor_id') and obj.db_root_descriptor_id is not None:
+            columnMap['root_descriptor_id'] = \
+                self.convertToDB(obj.db_root_descriptor_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_packages:
+            child.db_registry = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'registry'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMashupComponentSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'mashup_component'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'vtid', 'vttype', 'vtparent_type', 'vtparent_id', 'vtpos', 'vtmid', 'pos', 'type', 'val', 'minVal', 'maxVal', 'stepSize', 'strvaluelist', 'widget', 'seq', 'parent', 'alias_id', 'entity_id', 'entity_type']
+        table = 'mashup_component'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            vtid = self.convertFromDB(row[1], 'long', 'int')
+            vttype = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vtparent_type = self.convertFromDB(row[3], 'str', 'char(32)')
+            vtparent_id = self.convertFromDB(row[4], 'long', 'int')
+            vtpos = self.convertFromDB(row[5], 'long', 'int')
+            vtmid = self.convertFromDB(row[6], 'long', 'int')
+            pos = self.convertFromDB(row[7], 'long', 'int')
+            type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[9], 'str', 'mediumtext')
+            minVal = self.convertFromDB(row[10], 'str', 'varchar(255)')
+            maxVal = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            stepSize = self.convertFromDB(row[12], 'str', 'varchar(255)')
+            strvaluelist = self.convertFromDB(row[13], 'str', 'mediumtext')
+            widget = self.convertFromDB(row[14], 'str', 'varchar(255)')
+            seq = self.convertFromDB(row[15], 'int', 'int')
+            parent = self.convertFromDB(row[16], 'str', 'varchar(255)')
+            mashup_alias = self.convertFromDB(row[17], 'long', 'int')
+            entity_id = self.convertFromDB(row[18], 'long', 'int')
+            entity_type = self.convertFromDB(row[19], 'str', 'char(16)')
+            
+            mashup_component = DBMashupComponent(vtid=vtid,
+                                                 vttype=vttype,
+                                                 vtparent_type=vtparent_type,
+                                                 vtparent_id=vtparent_id,
+                                                 vtpos=vtpos,
+                                                 vtmid=vtmid,
+                                                 pos=pos,
+                                                 type=type,
+                                                 val=val,
+                                                 minVal=minVal,
+                                                 maxVal=maxVal,
+                                                 stepSize=stepSize,
+                                                 strvaluelist=strvaluelist,
+                                                 widget=widget,
+                                                 seq=seq,
+                                                 parent=parent,
+                                                 id=id)
+            mashup_component.db_mashup_alias = mashup_alias
+            mashup_component.db_entity_id = entity_id
+            mashup_component.db_entity_type = entity_type
+            mashup_component.is_dirty = False
+            res[('mashup_component', id)] = mashup_component
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'vtid', 'vttype', 'vtparent_type', 'vtparent_id', 'vtpos', 'vtmid', 'pos', 'type', 'val', 'minVal', 'maxVal', 'stepSize', 'strvaluelist', 'widget', 'seq', 'parent', 'alias_id', 'entity_id', 'entity_type']
+        table = 'mashup_component'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            vtid = self.convertFromDB(row[1], 'long', 'int')
+            vttype = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            vtparent_type = self.convertFromDB(row[3], 'str', 'char(32)')
+            vtparent_id = self.convertFromDB(row[4], 'long', 'int')
+            vtpos = self.convertFromDB(row[5], 'long', 'int')
+            vtmid = self.convertFromDB(row[6], 'long', 'int')
+            pos = self.convertFromDB(row[7], 'long', 'int')
+            type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            val = self.convertFromDB(row[9], 'str', 'mediumtext')
+            minVal = self.convertFromDB(row[10], 'str', 'varchar(255)')
+            maxVal = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            stepSize = self.convertFromDB(row[12], 'str', 'varchar(255)')
+            strvaluelist = self.convertFromDB(row[13], 'str', 'mediumtext')
+            widget = self.convertFromDB(row[14], 'str', 'varchar(255)')
+            seq = self.convertFromDB(row[15], 'int', 'int')
+            parent = self.convertFromDB(row[16], 'str', 'varchar(255)')
+            mashup_alias = self.convertFromDB(row[17], 'long', 'int')
+            entity_id = self.convertFromDB(row[18], 'long', 'int')
+            entity_type = self.convertFromDB(row[19], 'str', 'char(16)')
+            
+            mashup_component = DBMashupComponent(vtid=vtid,
+                                                 vttype=vttype,
+                                                 vtparent_type=vtparent_type,
+                                                 vtparent_id=vtparent_id,
+                                                 vtpos=vtpos,
+                                                 vtmid=vtmid,
+                                                 pos=pos,
+                                                 type=type,
+                                                 val=val,
+                                                 minVal=minVal,
+                                                 maxVal=maxVal,
+                                                 stepSize=stepSize,
+                                                 strvaluelist=strvaluelist,
+                                                 widget=widget,
+                                                 seq=seq,
+                                                 parent=parent,
+                                                 id=id)
+            mashup_component.db_mashup_alias = mashup_alias
+            mashup_component.db_entity_id = entity_id
+            mashup_component.db_entity_type = entity_type
+            mashup_component.is_dirty = False
+            res[('mashup_component', id)] = mashup_component
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('mashup_alias', obj.db_mashup_alias) in all_objects:
+            p = all_objects[('mashup_alias', obj.db_mashup_alias)]
+            p.db_add_component(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'vtid', 'vttype', 'vtparent_type', 'vtparent_id', 'vtpos', 'vtmid', 'pos', 'type', 'val', 'minVal', 'maxVal', 'stepSize', 'strvaluelist', 'widget', 'seq', 'parent', 'alias_id', 'entity_id', 'entity_type']
+        table = 'mashup_component'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_vtid') and obj.db_vtid is not None:
+            columnMap['vtid'] = \
+                self.convertToDB(obj.db_vtid, 'long', 'int')
+        if hasattr(obj, 'db_vttype') and obj.db_vttype is not None:
+            columnMap['vttype'] = \
+                self.convertToDB(obj.db_vttype, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vtparent_type') and obj.db_vtparent_type is not None:
+            columnMap['vtparent_type'] = \
+                self.convertToDB(obj.db_vtparent_type, 'str', 'char(32)')
+        if hasattr(obj, 'db_vtparent_id') and obj.db_vtparent_id is not None:
+            columnMap['vtparent_id'] = \
+                self.convertToDB(obj.db_vtparent_id, 'long', 'int')
+        if hasattr(obj, 'db_vtpos') and obj.db_vtpos is not None:
+            columnMap['vtpos'] = \
+                self.convertToDB(obj.db_vtpos, 'long', 'int')
+        if hasattr(obj, 'db_vtmid') and obj.db_vtmid is not None:
+            columnMap['vtmid'] = \
+                self.convertToDB(obj.db_vtmid, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'mediumtext')
+        if hasattr(obj, 'db_minVal') and obj.db_minVal is not None:
+            columnMap['minVal'] = \
+                self.convertToDB(obj.db_minVal, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_maxVal') and obj.db_maxVal is not None:
+            columnMap['maxVal'] = \
+                self.convertToDB(obj.db_maxVal, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_stepSize') and obj.db_stepSize is not None:
+            columnMap['stepSize'] = \
+                self.convertToDB(obj.db_stepSize, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_strvaluelist') and obj.db_strvaluelist is not None:
+            columnMap['strvaluelist'] = \
+                self.convertToDB(obj.db_strvaluelist, 'str', 'mediumtext')
+        if hasattr(obj, 'db_widget') and obj.db_widget is not None:
+            columnMap['widget'] = \
+                self.convertToDB(obj.db_widget, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_seq') and obj.db_seq is not None:
+            columnMap['seq'] = \
+                self.convertToDB(obj.db_seq, 'int', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent'] = \
+                self.convertToDB(obj.db_parent, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_mashup_alias') and obj.db_mashup_alias is not None:
+            columnMap['alias_id'] = \
+                self.convertToDB(obj.db_mashup_alias, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'vtid', 'vttype', 'vtparent_type', 'vtparent_id', 'vtpos', 'vtmid', 'pos', 'type', 'val', 'minVal', 'maxVal', 'stepSize', 'strvaluelist', 'widget', 'seq', 'parent', 'alias_id', 'entity_id', 'entity_type']
+        table = 'mashup_component'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_vtid') and obj.db_vtid is not None:
+            columnMap['vtid'] = \
+                self.convertToDB(obj.db_vtid, 'long', 'int')
+        if hasattr(obj, 'db_vttype') and obj.db_vttype is not None:
+            columnMap['vttype'] = \
+                self.convertToDB(obj.db_vttype, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vtparent_type') and obj.db_vtparent_type is not None:
+            columnMap['vtparent_type'] = \
+                self.convertToDB(obj.db_vtparent_type, 'str', 'char(32)')
+        if hasattr(obj, 'db_vtparent_id') and obj.db_vtparent_id is not None:
+            columnMap['vtparent_id'] = \
+                self.convertToDB(obj.db_vtparent_id, 'long', 'int')
+        if hasattr(obj, 'db_vtpos') and obj.db_vtpos is not None:
+            columnMap['vtpos'] = \
+                self.convertToDB(obj.db_vtpos, 'long', 'int')
+        if hasattr(obj, 'db_vtmid') and obj.db_vtmid is not None:
+            columnMap['vtmid'] = \
+                self.convertToDB(obj.db_vtmid, 'long', 'int')
+        if hasattr(obj, 'db_pos') and obj.db_pos is not None:
+            columnMap['pos'] = \
+                self.convertToDB(obj.db_pos, 'long', 'int')
+        if hasattr(obj, 'db_type') and obj.db_type is not None:
+            columnMap['type'] = \
+                self.convertToDB(obj.db_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_val') and obj.db_val is not None:
+            columnMap['val'] = \
+                self.convertToDB(obj.db_val, 'str', 'mediumtext')
+        if hasattr(obj, 'db_minVal') and obj.db_minVal is not None:
+            columnMap['minVal'] = \
+                self.convertToDB(obj.db_minVal, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_maxVal') and obj.db_maxVal is not None:
+            columnMap['maxVal'] = \
+                self.convertToDB(obj.db_maxVal, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_stepSize') and obj.db_stepSize is not None:
+            columnMap['stepSize'] = \
+                self.convertToDB(obj.db_stepSize, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_strvaluelist') and obj.db_strvaluelist is not None:
+            columnMap['strvaluelist'] = \
+                self.convertToDB(obj.db_strvaluelist, 'str', 'mediumtext')
+        if hasattr(obj, 'db_widget') and obj.db_widget is not None:
+            columnMap['widget'] = \
+                self.convertToDB(obj.db_widget, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_seq') and obj.db_seq is not None:
+            columnMap['seq'] = \
+                self.convertToDB(obj.db_seq, 'int', 'int')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent'] = \
+                self.convertToDB(obj.db_parent, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_mashup_alias') and obj.db_mashup_alias is not None:
+            columnMap['alias_id'] = \
+                self.convertToDB(obj.db_mashup_alias, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'mashup_component'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'mediumtext')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'mediumtext')
+            parentType = self.convertFromDB(row[3], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[4], 'long', 'int')
+            entity_type = self.convertFromDB(row[5], 'str', 'char(16)')
+            parent = self.convertFromDB(row[6], 'long', 'long')
+            
+            annotation = DBAnnotation(key=key,
+                                      value=value,
+                                      id=id)
+            annotation.db_parentType = parentType
+            annotation.db_entity_id = entity_id
+            annotation.db_entity_type = entity_type
+            annotation.db_parent = parent
+            annotation.is_dirty = False
+            res[('annotation', id)] = annotation
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'vistrail':
+            p = all_objects[('vistrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module':
+            p = all_objects[('module', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'action':
+            p = all_objects[('action', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'abstraction':
+            p = all_objects[('abstraction', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'mashuptrail':
+            p = all_objects[('mashuptrail', obj.db_parent)]
+            p.db_add_annotation(obj)
+        elif obj.db_parentType == 'group':
+            p = all_objects[('group', obj.db_parent)]
+            p.db_add_annotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'mediumtext')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'akey', 'value', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'mediumtext')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBChangeSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'change_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            oldObjId = self.convertFromDB(row[2], 'long', 'int')
+            newObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjId = self.convertFromDB(row[4], 'long', 'int')
+            parentObjType = self.convertFromDB(row[5], 'str', 'char(16)')
+            action = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            change = DBChange(what=what,
+                              oldObjId=oldObjId,
+                              newObjId=newObjId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            change.db_action = action
+            change.db_entity_id = entity_id
+            change.db_entity_type = entity_type
+            change.is_dirty = False
+            res[('change', id)] = change
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'what', 'old_obj_id', 'new_obj_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_oldObjId') and obj.db_oldObjId is not None:
+            columnMap['old_obj_id'] = \
+                self.convertToDB(obj.db_oldObjId, 'long', 'int')
+        if hasattr(obj, 'db_newObjId') and obj.db_newObjId is not None:
+            columnMap['new_obj_id'] = \
+                self.convertToDB(obj.db_newObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        if obj.db_data is not None:
+            child = obj.db_data
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'change_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBGroupExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'group_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            group_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            group_type = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[7], 'int', 'int')
+            error = self.convertFromDB(row[8], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[9], 'long', 'int')
+            parentType = self.convertFromDB(row[10], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[11], 'long', 'int')
+            entity_type = self.convertFromDB(row[12], 'str', 'char(16)')
+            parent = self.convertFromDB(row[13], 'long', 'long')
+            
+            group_exec = DBGroupExec(ts_start=ts_start,
+                                     ts_end=ts_end,
+                                     cached=cached,
+                                     module_id=module_id,
+                                     group_name=group_name,
+                                     group_type=group_type,
+                                     completed=completed,
+                                     error=error,
+                                     machine_id=machine_id,
+                                     id=id)
+            group_exec.db_parentType = parentType
+            group_exec.db_entity_id = entity_id
+            group_exec.db_entity_type = entity_type
+            group_exec.db_parent = parent
+            group_exec.is_dirty = False
+            res[('group_exec', id)] = group_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'group_name', 'group_type', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_group_name') and obj.db_group_name is not None:
+            columnMap['group_name'] = \
+                self.convertToDB(obj.db_group_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_group_type') and obj.db_group_type is not None:
+            columnMap['group_type'] = \
+                self.convertToDB(obj.db_group_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'group_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPackageSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'package'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            name = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            identifier = self.convertFromDB(row[2], 'str', 'varchar(1023)')
+            codepath = self.convertFromDB(row[3], 'str', 'varchar(1023)')
+            load_configuration = self.convertFromDB(row[4], 'int', 'int')
+            version = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            description = self.convertFromDB(row[6], 'str', 'varchar(1023)')
+            registry = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            package = DBPackage(name=name,
+                                identifier=identifier,
+                                codepath=codepath,
+                                load_configuration=load_configuration,
+                                version=version,
+                                description=description,
+                                id=id)
+            package.db_registry = registry
+            package.db_entity_id = entity_id
+            package.db_entity_type = entity_type
+            package.is_dirty = False
+            res[('package', id)] = package
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('registry', obj.db_registry) in all_objects:
+            p = all_objects[('registry', obj.db_registry)]
+            p.db_add_package(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'name', 'identifier', 'codepath', 'load_configuration', 'version', 'description', 'parent_id', 'entity_id', 'entity_type']
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_identifier') and obj.db_identifier is not None:
+            columnMap['identifier'] = \
+                self.convertToDB(obj.db_identifier, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_codepath') and obj.db_codepath is not None:
+            columnMap['codepath'] = \
+                self.convertToDB(obj.db_codepath, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_load_configuration') and obj.db_load_configuration is not None:
+            columnMap['load_configuration'] = \
+                self.convertToDB(obj.db_load_configuration, 'int', 'int')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_description') and obj.db_description is not None:
+            columnMap['description'] = \
+                self.convertToDB(obj.db_description, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_registry') and obj.db_registry is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_registry, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_module_descriptors:
+            child.db_package = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'package'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBWorkflowExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'workflow_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            user = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            ip = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            vt_version = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            ts_start = self.convertFromDB(row[5], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[6], 'datetime', 'datetime')
+            parent_id = self.convertFromDB(row[7], 'long', 'int')
+            parent_type = self.convertFromDB(row[8], 'str', 'varchar(255)')
+            parent_version = self.convertFromDB(row[9], 'long', 'int')
+            completed = self.convertFromDB(row[10], 'int', 'int')
+            name = self.convertFromDB(row[11], 'str', 'varchar(255)')
+            log = self.convertFromDB(row[12], 'long', 'int')
+            entity_id = self.convertFromDB(row[13], 'long', 'int')
+            entity_type = self.convertFromDB(row[14], 'str', 'char(16)')
+            
+            workflow_exec = DBWorkflowExec(user=user,
+                                           ip=ip,
+                                           session=session,
+                                           vt_version=vt_version,
+                                           ts_start=ts_start,
+                                           ts_end=ts_end,
+                                           parent_id=parent_id,
+                                           parent_type=parent_type,
+                                           parent_version=parent_version,
+                                           completed=completed,
+                                           name=name,
+                                           id=id)
+            workflow_exec.db_log = log
+            workflow_exec.db_entity_id = entity_id
+            workflow_exec.db_entity_type = entity_type
+            workflow_exec.is_dirty = False
+            res[('workflow_exec', id)] = workflow_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('log', obj.db_log) in all_objects:
+            p = all_objects[('log', obj.db_log)]
+            p.db_add_workflow_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'user', 'ip', 'session', 'vt_version', 'ts_start', 'ts_end', 'parent_id', 'parent_type', 'parent_version', 'completed', 'name', 'log_id', 'entity_id', 'entity_type']
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ip') and obj.db_ip is not None:
+            columnMap['ip'] = \
+                self.convertToDB(obj.db_ip, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_vt_version') and obj.db_vt_version is not None:
+            columnMap['vt_version'] = \
+                self.convertToDB(obj.db_vt_version, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_parent_id') and obj.db_parent_id is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent_id, 'long', 'int')
+        if hasattr(obj, 'db_parent_type') and obj.db_parent_type is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parent_type, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_parent_version') and obj.db_parent_version is not None:
+            columnMap['parent_version'] = \
+                self.convertToDB(obj.db_parent_version, 'long', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_log') and obj.db_log is not None:
+            columnMap['log_id'] = \
+                self.convertToDB(obj.db_log, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'workflow_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBParameterExplorationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'parameter_exploration'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'action_id', 'name', 'date', 'user', 'dims', 'layout', 'parent_id', 'entity_id', 'entity_type']
+        table = 'parameter_exploration'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            action_id = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            date = self.convertFromDB(row[3], 'datetime', 'datetime')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            dims = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            layout = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            parameter_exploration = DBParameterExploration(action_id=action_id,
+                                                           name=name,
+                                                           date=date,
+                                                           user=user,
+                                                           dims=dims,
+                                                           layout=layout,
+                                                           id=id)
+            parameter_exploration.db_vistrail = vistrail
+            parameter_exploration.db_entity_id = entity_id
+            parameter_exploration.db_entity_type = entity_type
+            parameter_exploration.is_dirty = False
+            res[('parameter_exploration', id)] = parameter_exploration
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'action_id', 'name', 'date', 'user', 'dims', 'layout', 'parent_id', 'entity_id', 'entity_type']
+        table = 'parameter_exploration'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            action_id = self.convertFromDB(row[1], 'long', 'int')
+            name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            date = self.convertFromDB(row[3], 'datetime', 'datetime')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            dims = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            layout = self.convertFromDB(row[6], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[7], 'long', 'int')
+            entity_id = self.convertFromDB(row[8], 'long', 'int')
+            entity_type = self.convertFromDB(row[9], 'str', 'char(16)')
+            
+            parameter_exploration = DBParameterExploration(action_id=action_id,
+                                                           name=name,
+                                                           date=date,
+                                                           user=user,
+                                                           dims=dims,
+                                                           layout=layout,
+                                                           id=id)
+            parameter_exploration.db_vistrail = vistrail
+            parameter_exploration.db_entity_id = entity_id
+            parameter_exploration.db_entity_type = entity_type
+            parameter_exploration.is_dirty = False
+            res[('parameter_exploration', id)] = parameter_exploration
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_parameter_exploration(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'action_id', 'name', 'date', 'user', 'dims', 'layout', 'parent_id', 'entity_id', 'entity_type']
+        table = 'parameter_exploration'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_dims') and obj.db_dims is not None:
+            columnMap['dims'] = \
+                self.convertToDB(obj.db_dims, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_layout') and obj.db_layout is not None:
+            columnMap['layout'] = \
+                self.convertToDB(obj.db_layout, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'action_id', 'name', 'date', 'user', 'dims', 'layout', 'parent_id', 'entity_id', 'entity_type']
+        table = 'parameter_exploration'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_dims') and obj.db_dims is not None:
+            columnMap['dims'] = \
+                self.convertToDB(obj.db_dims, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_layout') and obj.db_layout is not None:
+            columnMap['layout'] = \
+                self.convertToDB(obj.db_layout, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_functions:
+            child.db_parameter_exploration = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'parameter_exploration'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBLoopExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'loop_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            iteration = self.convertFromDB(row[3], 'int', 'int')
+            completed = self.convertFromDB(row[4], 'int', 'int')
+            error = self.convertFromDB(row[5], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   iteration=iteration,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            iteration = self.convertFromDB(row[3], 'int', 'int')
+            completed = self.convertFromDB(row[4], 'int', 'int')
+            error = self.convertFromDB(row[5], 'str', 'varchar(1023)')
+            parentType = self.convertFromDB(row[6], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            parent = self.convertFromDB(row[9], 'long', 'long')
+            
+            loop_exec = DBLoopExec(ts_start=ts_start,
+                                   ts_end=ts_end,
+                                   iteration=iteration,
+                                   completed=completed,
+                                   error=error,
+                                   id=id)
+            loop_exec.db_parentType = parentType
+            loop_exec.db_entity_id = entity_id
+            loop_exec.db_entity_type = entity_type
+            loop_exec.db_parent = parent
+            loop_exec.is_dirty = False
+            res[('loop_exec', id)] = loop_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'module_exec':
+            p = all_objects[('module_exec', obj.db_parent)]
+            p.db_add_loop_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_iteration') and obj.db_iteration is not None:
+            columnMap['iteration'] = \
+                self.convertToDB(obj.db_iteration, 'int', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'ts_start', 'ts_end', 'iteration', 'completed', 'error', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_iteration') and obj.db_iteration is not None:
+            columnMap['iteration'] = \
+                self.convertToDB(obj.db_iteration, 'int', 'int')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_item_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'loop_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBMashupActionAnnotationSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'mashup_action_annotation'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action_annotation'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            action_id = self.convertFromDB(row[3], 'long', 'int')
+            date = self.convertFromDB(row[4], 'datetime', 'datetime')
+            user = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            mashuptrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            mashup_actionAnnotation = DBMashupActionAnnotation(key=key,
+                                                               value=value,
+                                                               action_id=action_id,
+                                                               date=date,
+                                                               user=user,
+                                                               id=id)
+            mashup_actionAnnotation.db_mashuptrail = mashuptrail
+            mashup_actionAnnotation.db_entity_id = entity_id
+            mashup_actionAnnotation.db_entity_type = entity_type
+            mashup_actionAnnotation.is_dirty = False
+            res[('mashup_actionAnnotation', id)] = mashup_actionAnnotation
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action_annotation'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            key = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            value = self.convertFromDB(row[2], 'str', 'varchar(8191)')
+            action_id = self.convertFromDB(row[3], 'long', 'int')
+            date = self.convertFromDB(row[4], 'datetime', 'datetime')
+            user = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            mashuptrail = self.convertFromDB(row[6], 'long', 'int')
+            entity_id = self.convertFromDB(row[7], 'long', 'int')
+            entity_type = self.convertFromDB(row[8], 'str', 'char(16)')
+            
+            mashup_actionAnnotation = DBMashupActionAnnotation(key=key,
+                                                               value=value,
+                                                               action_id=action_id,
+                                                               date=date,
+                                                               user=user,
+                                                               id=id)
+            mashup_actionAnnotation.db_mashuptrail = mashuptrail
+            mashup_actionAnnotation.db_entity_id = entity_id
+            mashup_actionAnnotation.db_entity_type = entity_type
+            mashup_actionAnnotation.is_dirty = False
+            res[('mashup_actionAnnotation', id)] = mashup_actionAnnotation
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('mashuptrail', obj.db_mashuptrail) in all_objects:
+            p = all_objects[('mashuptrail', obj.db_mashuptrail)]
+            p.db_add_actionAnnotation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_mashuptrail') and obj.db_mashuptrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_mashuptrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'akey', 'value', 'action_id', 'date', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'mashup_action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_key') and obj.db_key is not None:
+            columnMap['akey'] = \
+                self.convertToDB(obj.db_key, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_value') and obj.db_value is not None:
+            columnMap['value'] = \
+                self.convertToDB(obj.db_value, 'str', 'varchar(8191)')
+        if hasattr(obj, 'db_action_id') and obj.db_action_id is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action_id, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_mashuptrail') and obj.db_mashuptrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_mashuptrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'mashup_action_annotation'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBConnectionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'connection_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            parentType = self.convertFromDB(row[1], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[2], 'long', 'int')
+            entity_type = self.convertFromDB(row[3], 'str', 'char(16)')
+            parent = self.convertFromDB(row[4], 'long', 'long')
+            
+            connection = DBConnection(id=id)
+            connection.db_parentType = parentType
+            connection.db_entity_id = entity_id
+            connection.db_entity_type = entity_type
+            connection.db_parent = parent
+            connection.is_dirty = False
+            res[('connection', id)] = connection
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow':
+            p = all_objects[('workflow', obj.db_parent)]
+            p.db_add_connection(obj)
+        elif obj.db_parentType == 'add':
+            p = all_objects[('add', obj.db_parent)]
+            p.db_add_data(obj)
+        elif obj.db_parentType == 'change':
+            p = all_objects[('change', obj.db_parent)]
+            p.db_add_data(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_ports:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'connection_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBPEFunctionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'pe_function'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'module_id', 'port_name', 'is_alias', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_function'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            module_id = self.convertFromDB(row[1], 'long', 'int')
+            port_name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            is_alias = self.convertFromDB(row[3], 'long', 'int')
+            parentType = self.convertFromDB(row[4], 'str', 'char(32)')
+            parameter_exploration = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            pe_function = DBPEFunction(module_id=module_id,
+                                       port_name=port_name,
+                                       id=id)
+            pe_function.db_parentType = parentType
+            pe_function.db_parameter_exploration = parameter_exploration
+            pe_function.db_entity_id = entity_id
+            pe_function.db_entity_type = entity_type
+            pe_function.is_dirty = False
+            res[('pe_function', id)] = pe_function
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'module_id', 'port_name', 'is_alias', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_function'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            module_id = self.convertFromDB(row[1], 'long', 'int')
+            port_name = self.convertFromDB(row[2], 'str', 'varchar(255)')
+            is_alias = self.convertFromDB(row[3], 'long', 'int')
+            parentType = self.convertFromDB(row[4], 'str', 'char(32)')
+            parameter_exploration = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            pe_function = DBPEFunction(module_id=module_id,
+                                       port_name=port_name,
+                                       id=id)
+            pe_function.db_parentType = parentType
+            pe_function.db_parameter_exploration = parameter_exploration
+            pe_function.db_entity_id = entity_id
+            pe_function.db_entity_type = entity_type
+            pe_function.is_dirty = False
+            res[('pe_function', id)] = pe_function
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('parameter_exploration', obj.db_parameter_exploration) in all_objects:
+            p = all_objects[('parameter_exploration', obj.db_parameter_exploration)]
+            p.db_add_function(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'module_id', 'port_name', 'is_alias', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_port_name') and obj.db_port_name is not None:
+            columnMap['port_name'] = \
+                self.convertToDB(obj.db_port_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_is_alias') and obj.db_is_alias is not None:
+            columnMap['is_alias'] = \
+                self.convertToDB(obj.db_is_alias, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_parameter_exploration') and obj.db_parameter_exploration is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parameter_exploration, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'module_id', 'port_name', 'is_alias', 'parent_type', 'parent_id', 'entity_id', 'entity_type']
+        table = 'pe_function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_port_name') and obj.db_port_name is not None:
+            columnMap['port_name'] = \
+                self.convertToDB(obj.db_port_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_is_alias') and obj.db_is_alias is not None:
+            columnMap['is_alias'] = \
+                self.convertToDB(obj.db_is_alias, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_parameter_exploration') and obj.db_parameter_exploration is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parameter_exploration, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_parameters:
+            child.db_pe_function = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'pe_function'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBActionSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'action'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            prevId = self.convertFromDB(row[1], 'long', 'int')
+            date = self.convertFromDB(row[2], 'datetime', 'datetime')
+            session = self.convertFromDB(row[3], 'long', 'int')
+            user = self.convertFromDB(row[4], 'str', 'varchar(255)')
+            vistrail = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            action = DBAction(prevId=prevId,
+                              date=date,
+                              session=session,
+                              user=user,
+                              id=id)
+            action.db_vistrail = vistrail
+            action.db_entity_id = entity_id
+            action.db_entity_type = entity_type
+            action.is_dirty = False
+            res[('action', id)] = action
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('vistrail', obj.db_vistrail) in all_objects:
+            p = all_objects[('vistrail', obj.db_vistrail)]
+            p.db_add_action(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'prev_id', 'date', 'session', 'user', 'parent_id', 'entity_id', 'entity_type']
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_prevId') and obj.db_prevId is not None:
+            columnMap['prev_id'] = \
+                self.convertToDB(obj.db_prevId, 'long', 'int')
+        if hasattr(obj, 'db_date') and obj.db_date is not None:
+            columnMap['date'] = \
+                self.convertToDB(obj.db_date, 'datetime', 'datetime')
+        if hasattr(obj, 'db_session') and obj.db_session is not None:
+            columnMap['session'] = \
+                self.convertToDB(obj.db_session, 'long', 'int')
+        if hasattr(obj, 'db_user') and obj.db_user is not None:
+            columnMap['user'] = \
+                self.convertToDB(obj.db_user, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_vistrail') and obj.db_vistrail is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_vistrail, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_operations:
+            child.db_action = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'action'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBDeleteSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'delete_tbl'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            what = self.convertFromDB(row[1], 'str', 'varchar(255)')
+            objectId = self.convertFromDB(row[2], 'long', 'int')
+            parentObjId = self.convertFromDB(row[3], 'long', 'int')
+            parentObjType = self.convertFromDB(row[4], 'str', 'char(16)')
+            action = self.convertFromDB(row[5], 'long', 'int')
+            entity_id = self.convertFromDB(row[6], 'long', 'int')
+            entity_type = self.convertFromDB(row[7], 'str', 'char(16)')
+            
+            delete = DBDelete(what=what,
+                              objectId=objectId,
+                              parentObjId=parentObjId,
+                              parentObjType=parentObjType,
+                              id=id)
+            delete.db_action = action
+            delete.db_entity_id = entity_id
+            delete.db_entity_type = entity_type
+            delete.is_dirty = False
+            res[('delete', id)] = delete
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if ('action', obj.db_action) in all_objects:
+            p = all_objects[('action', obj.db_action)]
+            p.db_add_operation(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'what', 'object_id', 'par_obj_id', 'par_obj_type', 'action_id', 'entity_id', 'entity_type']
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_what') and obj.db_what is not None:
+            columnMap['what'] = \
+                self.convertToDB(obj.db_what, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_objectId') and obj.db_objectId is not None:
+            columnMap['object_id'] = \
+                self.convertToDB(obj.db_objectId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjId') and obj.db_parentObjId is not None:
+            columnMap['par_obj_id'] = \
+                self.convertToDB(obj.db_parentObjId, 'long', 'int')
+        if hasattr(obj, 'db_parentObjType') and obj.db_parentObjType is not None:
+            columnMap['par_obj_type'] = \
+                self.convertToDB(obj.db_parentObjType, 'str', 'char(16)')
+        if hasattr(obj, 'db_action') and obj.db_action is not None:
+            columnMap['action_id'] = \
+                self.convertToDB(obj.db_action, 'long', 'int')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        pass
+    
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'delete_tbl'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBVistrailSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'vistrail'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            global_props['entity_id'] = self.convertToDB(id, 'long', 'int')
+            entity_type = self.convertFromDB(row[1], 'str', 'char(16)')
+            global_props['entity_type'] = self.convertToDB(entity_type, 'str', 'char(16)')
+            version = self.convertFromDB(row[2], 'str', 'char(16)')
+            name = self.convertFromDB(row[3], 'str', 'varchar(255)')
+            last_modified = self.convertFromDB(row[4], 'datetime', 'datetime')
+            
+            vistrail = DBVistrail(entity_type=entity_type,
+                                  version=version,
+                                  name=name,
+                                  last_modified=last_modified,
+                                  id=id)
+            vistrail.is_dirty = False
+            res[('vistrail', id)] = vistrail
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        pass
+    
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'entity_type', 'version', 'name', 'last_modified']
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_version') and obj.db_version is not None:
+            columnMap['version'] = \
+                self.convertToDB(obj.db_version, 'str', 'char(16)')
+        if hasattr(obj, 'db_name') and obj.db_name is not None:
+            columnMap['name'] = \
+                self.convertToDB(obj.db_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_last_modified') and obj.db_last_modified is not None:
+            columnMap['last_modified'] = \
+                self.convertToDB(obj.db_last_modified, 'datetime', 'datetime')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        if obj.db_id is None:
+            obj.db_id = lastId
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            global_props['entity_type'] = self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            global_props['entity_id'] = self.convertToDB(obj.db_id, 'long', 'int')
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_actions:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_tags:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_vistrailVariables:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_parameter_explorations:
+            child.db_vistrail = obj.db_id
+        for child in obj.db_actionAnnotations:
+            child.db_vistrail = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'vistrail'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+class DBModuleExecSQLDAOBase(SQLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+        self.table = 'module_exec'
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def get_sql_columns(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+
+        dbCommand = self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+        data = self.executeSQL(db, dbCommand, True)
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[8], 'long', 'int')
+            parentType = self.convertFromDB(row[9], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            parent = self.convertFromDB(row[12], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+        return res
+
+    def get_sql_select(self, db, global_props,lock=False):
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = global_props
+        orderBy = 'id'
+        return self.createSQLSelect(table, columns, whereMap, orderBy, lock)
+
+    def process_sql_columns(self, data, global_props):
+        res = {}
+        for row in data:
+            id = self.convertFromDB(row[0], 'long', 'int')
+            ts_start = self.convertFromDB(row[1], 'datetime', 'datetime')
+            ts_end = self.convertFromDB(row[2], 'datetime', 'datetime')
+            cached = self.convertFromDB(row[3], 'int', 'int')
+            module_id = self.convertFromDB(row[4], 'long', 'int')
+            module_name = self.convertFromDB(row[5], 'str', 'varchar(255)')
+            completed = self.convertFromDB(row[6], 'int', 'int')
+            error = self.convertFromDB(row[7], 'str', 'varchar(1023)')
+            machine_id = self.convertFromDB(row[8], 'long', 'int')
+            parentType = self.convertFromDB(row[9], 'str', 'char(32)')
+            entity_id = self.convertFromDB(row[10], 'long', 'int')
+            entity_type = self.convertFromDB(row[11], 'str', 'char(16)')
+            parent = self.convertFromDB(row[12], 'long', 'long')
+            
+            module_exec = DBModuleExec(ts_start=ts_start,
+                                       ts_end=ts_end,
+                                       cached=cached,
+                                       module_id=module_id,
+                                       module_name=module_name,
+                                       completed=completed,
+                                       error=error,
+                                       machine_id=machine_id,
+                                       id=id)
+            module_exec.db_parentType = parentType
+            module_exec.db_entity_id = entity_id
+            module_exec.db_entity_type = entity_type
+            module_exec.db_parent = parent
+            module_exec.is_dirty = False
+            res[('module_exec', id)] = module_exec
+        return res
+
+    def from_sql_fast(self, obj, all_objects):
+        if obj.db_parentType == 'workflow_exec':
+            p = all_objects[('workflow_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'group_exec':
+            p = all_objects[('group_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        elif obj.db_parentType == 'loop_exec':
+            p = all_objects[('loop_exec', obj.db_parent)]
+            p.db_add_item_exec(obj)
+        
+    def set_sql_columns(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        lastId = self.executeSQL(db, dbCommand, False)
+        
+    def set_sql_command(self, db, obj, global_props, do_copy=True):
+        if not do_copy and not obj.is_dirty:
+            return None
+        columns = ['id', 'ts_start', 'ts_end', 'cached', 'module_id', 'module_name', 'completed', 'error', 'machine_id', 'parent_type', 'entity_id', 'entity_type', 'parent_id']
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        columnMap = {}
+        if hasattr(obj, 'db_id') and obj.db_id is not None:
+            columnMap['id'] = \
+                self.convertToDB(obj.db_id, 'long', 'int')
+        if hasattr(obj, 'db_ts_start') and obj.db_ts_start is not None:
+            columnMap['ts_start'] = \
+                self.convertToDB(obj.db_ts_start, 'datetime', 'datetime')
+        if hasattr(obj, 'db_ts_end') and obj.db_ts_end is not None:
+            columnMap['ts_end'] = \
+                self.convertToDB(obj.db_ts_end, 'datetime', 'datetime')
+        if hasattr(obj, 'db_cached') and obj.db_cached is not None:
+            columnMap['cached'] = \
+                self.convertToDB(obj.db_cached, 'int', 'int')
+        if hasattr(obj, 'db_module_id') and obj.db_module_id is not None:
+            columnMap['module_id'] = \
+                self.convertToDB(obj.db_module_id, 'long', 'int')
+        if hasattr(obj, 'db_module_name') and obj.db_module_name is not None:
+            columnMap['module_name'] = \
+                self.convertToDB(obj.db_module_name, 'str', 'varchar(255)')
+        if hasattr(obj, 'db_completed') and obj.db_completed is not None:
+            columnMap['completed'] = \
+                self.convertToDB(obj.db_completed, 'int', 'int')
+        if hasattr(obj, 'db_error') and obj.db_error is not None:
+            columnMap['error'] = \
+                self.convertToDB(obj.db_error, 'str', 'varchar(1023)')
+        if hasattr(obj, 'db_machine_id') and obj.db_machine_id is not None:
+            columnMap['machine_id'] = \
+                self.convertToDB(obj.db_machine_id, 'long', 'int')
+        if hasattr(obj, 'db_parentType') and obj.db_parentType is not None:
+            columnMap['parent_type'] = \
+                self.convertToDB(obj.db_parentType, 'str', 'char(32)')
+        if hasattr(obj, 'db_entity_id') and obj.db_entity_id is not None:
+            columnMap['entity_id'] = \
+                self.convertToDB(obj.db_entity_id, 'long', 'int')
+        if hasattr(obj, 'db_entity_type') and obj.db_entity_type is not None:
+            columnMap['entity_type'] = \
+                self.convertToDB(obj.db_entity_type, 'str', 'char(16)')
+        if hasattr(obj, 'db_parent') and obj.db_parent is not None:
+            columnMap['parent_id'] = \
+                self.convertToDB(obj.db_parent, 'long', 'long')
+        columnMap.update(global_props)
+
+        if obj.is_new or do_copy:
+            dbCommand = self.createSQLInsert(table, columnMap)
+        else:
+            dbCommand = self.createSQLUpdate(table, columnMap, whereMap)
+        return dbCommand
+
+    def set_sql_process(self, obj, global_props, lastId):
+        pass
+
+    def to_sql_fast(self, obj, do_copy=True):
+        for child in obj.db_annotations:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        for child in obj.db_loop_execs:
+            child.db_parentType = obj.vtType
+            child.db_parent = obj.db_id
+        
+    def delete_sql_column(self, db, obj, global_props):
+        table = 'module_exec'
+        whereMap = {}
+        whereMap.update(global_props)
+        if obj.db_id is not None:
+            keyStr = self.convertToDB(obj.db_id, 'long', 'int')
+            whereMap['id'] = keyStr
+        dbCommand = self.createSQLDelete(table, whereMap)
+        self.executeSQL(db, dbCommand, False)
+
+"""generated automatically by auto_dao.py"""
+
+class SQLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'vistrailVariable' not in self:
+            self['vistrailVariable'] = DBVistrailVariableSQLDAOBase(self)
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecSQLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleSQLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorSQLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagSQLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortSQLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupSQLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogSQLDAOBase(self)
+        if 'mashup_alias' not in self:
+            self['mashup_alias'] = DBMashupAliasSQLDAOBase(self)
+        if 'mashup' not in self:
+            self['mashup'] = DBMashupSQLDAOBase(self)
+        if 'portSpecItem' not in self:
+            self['portSpecItem'] = DBPortSpecItemSQLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineSQLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddSQLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherSQLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationSQLDAOBase(self)
+        if 'pe_parameter' not in self:
+            self['pe_parameter'] = DBPEParameterSQLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterSQLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataSQLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionSQLDAOBase(self)
+        if 'actionAnnotation' not in self:
+            self['actionAnnotation'] = DBActionAnnotationSQLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionSQLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowSQLDAOBase(self)
+        if 'mashup_action' not in self:
+            self['mashup_action'] = DBMashupActionSQLDAOBase(self)
+        if 'mashuptrail' not in self:
+            self['mashuptrail'] = DBMashuptrailSQLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistrySQLDAOBase(self)
+        if 'mashup_component' not in self:
+            self['mashup_component'] = DBMashupComponentSQLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationSQLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeSQLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecSQLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageSQLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecSQLDAOBase(self)
+        if 'parameter_exploration' not in self:
+            self['parameter_exploration'] = DBParameterExplorationSQLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecSQLDAOBase(self)
+        if 'mashup_actionAnnotation' not in self:
+            self['mashup_actionAnnotation'] = DBMashupActionAnnotationSQLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionSQLDAOBase(self)
+        if 'pe_function' not in self:
+            self['pe_function'] = DBPEFunctionSQLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionSQLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteSQLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailSQLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecSQLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_3/persistence/sql/sql_dao.py b/vistrails/db/versions/v1_0_3/persistence/sql/sql_dao.py
new file mode 100644
index 0000000..eab1acc
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/sql/sql_dao.py
@@ -0,0 +1,259 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.db import VistrailsDBException
+from vistrails.db.services.io import get_db_lib
+from vistrails.core import debug
+
+class SQLDAO:
+    def __init__(self):
+        pass
+
+    def convertFromDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif type == 'long':
+                return long(value)
+            elif type == 'float':
+                return float(value)
+            elif type == 'int':
+                return int(value)
+            elif type == 'date':
+                if db_type == 'date':
+                    return value
+                else:
+                    return date(*strptime(str(value), '%Y-%m-%d')[0:3])
+            elif type == 'datetime':
+                if db_type == 'datetime':
+                    return value
+                else:
+                    return datetime(*strptime(str(value), 
+                                              '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertWarning(self, before, after, _from, to):
+        text = ["Value truncated when saving to database",
+                "%s truncated to %s\nwhile converting '%s' to '%s'"]
+        debug.warning(text[0], text[1] % (before, after, _from, to))
+
+    def convertToDB(self, value, type, db_type):
+        if value is not None:
+            if type == 'str':
+                value = str(value)
+                if db_type.startswith('varchar'):
+                    try:
+                        length = int(db_type[8:-1])
+                        if len(value) > length:
+                            self.convertWarning(value, value[:length],
+                                                type, db_type)
+                            value = value[:length]
+                    except Exception, e:
+                        pass
+                if db_type.startswith('char'):
+                    try:
+                        length = int(db_type[5:-1])
+                        if len(value) > length:
+                            self.convertWarning(value, value[:length],
+                                                type, db_type)
+                            value = value[:length]
+                    except Exception, e:
+                        pass
+                # return "'" + str(value).replace("'", "''") + "'"
+                return value
+            elif type == 'long':
+                return str(value)
+            elif type == 'float':
+                # necessary to avoid conversion warnings in MySQL
+                if db_type.startswith('DECIMAL'):
+                    try:
+                        value="%%.%sf"%str(db_type[8:-1].split(',')[1])%value
+                    except Exception, e:
+                        pass
+                return str(value)
+            elif type == 'int':
+                # note: on 64-bit machines int:s are 64-bit
+                MIN_INT = -2147483648
+                MAX_INT =  2147483647
+                if db_type == 'int':
+                    if int(value) < MIN_INT:
+                        self.convertWarning(value, MIN_INT, type, db_type)
+                        value = MIN_INT
+                    if int(value) > MAX_INT:
+                        self.convertWarning(value, MAX_INT, type, db_type)
+                        value = MAX_INT
+                return str(value)
+            elif type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+
+        return None
+
+    def createSQLSelect(self, table, columns, whereMap, orderBy=None, 
+                        forUpdate=False):
+        columnStr = ', '.join(columns)
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % \
+                        (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """SELECT %s FROM %s WHERE %s""" % \
+                    (columnStr, table, whereStr)
+        if orderBy is not None:
+            dbCommand += " ORDER BY " + orderBy
+        if forUpdate:
+            dbCommand += " FOR UPDATE"
+        dbCommand += ";"
+        return (dbCommand, tuple(values))
+
+    def createSQLInsert(self, table, columnMap):
+        columns = []
+        values = []
+        for column, value in columnMap.iteritems():
+            if value is None:
+                value = 'NULL'
+            columns.append(column)
+            values.append(value)
+        columnStr = ', '.join(columns)
+        # valueStr = '%s, '.join(values)
+        valueStr = ''
+        if len(values) > 1:
+            valueStr = '%s,' * (len(values) - 1) + '%s'
+        dbCommand = """INSERT INTO %s(%s) VALUES (%s);""" % \
+                    (table, columnStr, valueStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLUpdate(self, table, columnMap, whereMap):
+        setStr = ''
+        comma = ''
+        values = []
+        for column, value in columnMap.iteritems():
+#            if value is None:
+#                value = 'NULL'
+            setStr += '%s%s = %%s' % (comma, column)
+            comma = ', '
+            values.append(value)
+        whereStr = ''
+        whereClause = ''
+        for column, value in whereMap.iteritems():
+            whereStr += '%s%s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """UPDATE %s SET %s WHERE %s;""" % \
+                    (table, setStr, whereStr)
+        return (dbCommand, tuple(values))
+
+    def createSQLDelete(self, table, whereMap):
+        whereStr = ''
+        whereClause = ''
+        values = []
+        for column, value in whereMap.iteritems():
+            whereStr += '%s %s = %%s' % (whereClause, column)
+            values.append(value)
+            whereClause = ' AND '
+        dbCommand = """DELETE FROM %s WHERE %s;""" % \
+            (table, whereStr)
+        return (dbCommand, tuple(values))
+
+    def executeSQL(self, db, cmd_tuple, isFetch):
+        dbCommand, values = cmd_tuple
+        # print 'db: %s' % dbCommand
+        # print 'values:', values
+        data = None
+        cursor = db.cursor()
+        try:
+            cursor.execute(dbCommand, values)
+            if isFetch:
+                data = cursor.fetchall()
+            else:
+                data = cursor.lastrowid
+        except Exception, e:
+            raise VistrailsDBException('Command "%s" with values "%s" '
+                                       'failed: %s' % (dbCommand, values, e))
+        finally:
+            cursor.close()
+        return data
+
+    def executeSQLGroup(self, db, dbCommandList, isFetch):
+        """ Executes a command consisting of multiple SELECT statements
+            It returns a list of results from the SELECT statements
+        """
+        data = []
+        # break up into bundles
+        BUNDLE_SIZE = 10000
+        num_commands = len(dbCommandList)
+        n = 0
+        while n<num_commands:
+            dbCommands = dbCommandList[n:(n+BUNDLE_SIZE)]
+            commandString = ''
+            for prepared, values in dbCommands:
+                command = prepared % \
+                              db.escape(values, get_db_lib().converters.conversions)
+                commandString += command
+            cur = db.cursor()
+            try:
+                result = cur.execute(commandString)
+                while True:
+                    r = cur.fetchall() if isFetch else cur.lastrowid
+                    data.append(r)
+                    next = cur.nextset()
+                    if not next:
+                        break
+            except Exception, e:
+                raise VistrailsDBException('Command failed: %s -- """ %s """' % 
+                                           (e, commandString))
+            finally:
+                cur.close()
+            
+            n += BUNDLE_SIZE
+        return data
+
+    def start_transaction(self, db):
+        db.begin()
+
+    def commit_transaction(self, db):
+        db.commit()
+
+    def rollback_transaction(self, db):
+        db.rollback()
diff --git a/vistrails/db/versions/v1_0_3/persistence/xml/__init__.py b/vistrails/db/versions/v1_0_3/persistence/xml/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/xml/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/db/versions/v1_0_3/persistence/xml/auto_gen.py b/vistrails/db/versions/v1_0_3/persistence/xml/auto_gen.py
new file mode 100644
index 0000000..d1b6ebf
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/xml/auto_gen.py
@@ -0,0 +1,5822 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""generated automatically by auto_dao.py"""
+
+from vistrails.core.system import get_elementtree_library
+ElementTree = get_elementtree_library()
+
+from xml_dao import XMLDAO
+from vistrails.db.versions.v1_0_3.domain import *
+
+class DBOpmProcessIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBVistrailVariableXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'vistrailVariable':
+            return None
+        
+        # read attributes
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('uuid', None)
+        uuid = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('module', None)
+        module = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBVistrailVariable(name=name,
+                                 uuid=uuid,
+                                 package=package,
+                                 module=module,
+                                 namespace=namespace,
+                                 value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrailVariable, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrailVariable')
+        
+        # set attributes
+        node.set('name',self.convertToStr(vistrailVariable.db_name, 'str'))
+        node.set('uuid',self.convertToStr(vistrailVariable.db_uuid, 'str'))
+        node.set('package',self.convertToStr(vistrailVariable.db_package, 'str'))
+        node.set('module',self.convertToStr(vistrailVariable.db_module, 'str'))
+        node.set('namespace',self.convertToStr(vistrailVariable.db_namespace, 'str'))
+        node.set('value',self.convertToStr(vistrailVariable.db_value, 'str'))
+        
+        return node
+
+class DBProvAgentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:agent':
+            return None
+        
+        # read attributes
+        data = node.get('prov:id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        vt_id = None
+        prov_type = None
+        prov_label = None
+        vt_machine_os = None
+        vt_machine_architecture = None
+        vt_machine_processor = None
+        vt_machine_ram = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'vt:id':
+                _data = self.convertFromStr(child.text,'str')
+                vt_id = _data
+            elif child_tag == 'prov:type':
+                _data = self.convertFromStr(child.text,'str')
+                prov_type = _data
+            elif child_tag == 'prov:label':
+                _data = self.convertFromStr(child.text,'str')
+                prov_label = _data
+            elif child_tag == 'vt:machine_os':
+                _data = self.convertFromStr(child.text,'str')
+                vt_machine_os = _data
+            elif child_tag == 'vt:machine_architecture':
+                _data = self.convertFromStr(child.text,'str')
+                vt_machine_architecture = _data
+            elif child_tag == 'vt:machine_processor':
+                _data = self.convertFromStr(child.text,'str')
+                vt_machine_processor = _data
+            elif child_tag == 'vt:machine_ram':
+                _data = self.convertFromStr(child.text,'str')
+                vt_machine_ram = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvAgent(id=id,
+                          vt_id=vt_id,
+                          prov_type=prov_type,
+                          prov_label=prov_label,
+                          vt_machine_os=vt_machine_os,
+                          vt_machine_architecture=vt_machine_architecture,
+                          vt_machine_processor=vt_machine_processor,
+                          vt_machine_ram=vt_machine_ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_agent, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:agent')
+        
+        # set attributes
+        node.set('prov:id',self.convertToStr(prov_agent.db_id, 'str'))
+        
+        # set elements
+        vt_id = prov_agent.db_vt_id
+        if (vt_id is not None) and (vt_id != ""):
+            childNode = ElementTree.SubElement(node, 'vt:id')
+            childNode.text = self.convertToStr(vt_id, 'str')
+        prov_type = prov_agent.db_prov_type
+        if (prov_type is not None) and (prov_type != ""):
+            childNode = ElementTree.SubElement(node, 'prov:type')
+            childNode.text = self.convertToStr(prov_type, 'str')
+        prov_label = prov_agent.db_prov_label
+        if (prov_label is not None) and (prov_label != ""):
+            childNode = ElementTree.SubElement(node, 'prov:label')
+            childNode.text = self.convertToStr(prov_label, 'str')
+        vt_machine_os = prov_agent.db_vt_machine_os
+        if (vt_machine_os is not None) and (vt_machine_os != ""):
+            childNode = ElementTree.SubElement(node, 'vt:machine_os')
+            childNode.text = self.convertToStr(vt_machine_os, 'str')
+        vt_machine_architecture = prov_agent.db_vt_machine_architecture
+        if (vt_machine_architecture is not None) and (vt_machine_architecture != ""):
+            childNode = ElementTree.SubElement(node, 'vt:machine_architecture')
+            childNode.text = self.convertToStr(vt_machine_architecture, 'str')
+        vt_machine_processor = prov_agent.db_vt_machine_processor
+        if (vt_machine_processor is not None) and (vt_machine_processor != ""):
+            childNode = ElementTree.SubElement(node, 'vt:machine_processor')
+            childNode.text = self.convertToStr(vt_machine_processor, 'str')
+        vt_machine_ram = prov_agent.db_vt_machine_ram
+        if (vt_machine_ram is not None) and (vt_machine_ram != ""):
+            childNode = ElementTree.SubElement(node, 'vt:machine_ram')
+            childNode.text = self.convertToStr(vt_machine_ram, 'str')
+        
+        return node
+
+class DBOpmWasGeneratedByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasGeneratedBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasGeneratedBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_generated_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasGeneratedBy')
+        
+        # set elements
+        effect = opm_was_generated_by.db_effect
+        if effect is not None:
+            if (effect is not None) and (effect != ""):
+                childNode = ElementTree.SubElement(node, 'effect')
+                self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_generated_by.db_role
+        if role is not None:
+            if (role is not None) and (role != ""):
+                childNode = ElementTree.SubElement(node, 'role')
+                self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_generated_by.db_cause
+        if cause is not None:
+            if (cause is not None) and (cause != ""):
+                childNode = ElementTree.SubElement(node, 'cause')
+                self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_generated_by.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_generated_by.db_opm_times
+        for opm_time in opm_times:
+            if (opm_times is not None) and (opm_times != ""):
+                childNode = ElementTree.SubElement(node, 'time')
+                self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmAccountsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'accounts':
+            return None
+        
+        accounts = []
+        opm_overlapss = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'overlaps':
+                _data = self.getDao('opm_overlaps').fromXML(child)
+                opm_overlapss.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccounts(accounts=accounts,
+                            opm_overlapss=opm_overlapss)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_accounts, node=None):
+        if node is None:
+            node = ElementTree.Element('accounts')
+        
+        # set elements
+        accounts = opm_accounts.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account').toXML(account, childNode)
+        opm_overlapss = opm_accounts.db_opm_overlapss
+        for opm_overlaps in opm_overlapss:
+            if (opm_overlapss is not None) and (opm_overlapss != ""):
+                childNode = ElementTree.SubElement(node, 'overlaps')
+                self.getDao('opm_overlaps').toXML(opm_overlaps, childNode)
+        
+        return node
+
+class DBRefProvAgentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:agent':
+            return None
+        
+        # read attributes
+        data = node.get('prov:ref', None)
+        prov_ref = self.convertFromStr(data, 'str')
+        
+        obj = DBRefProvAgent(prov_ref=prov_ref)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, ref_prov_agent, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:agent')
+        
+        # set attributes
+        node.set('prov:ref',self.convertToStr(ref_prov_agent.db_prov_ref, 'str'))
+        
+        return node
+
+class DBPortSpecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'portSpec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('optional', None)
+        optional = self.convertFromStr(data, 'int')
+        data = node.get('sortKey', None)
+        sort_key = self.convertFromStr(data, 'int')
+        data = node.get('minConns', None)
+        min_conns = self.convertFromStr(data, 'int')
+        data = node.get('maxConns', None)
+        max_conns = self.convertFromStr(data, 'int')
+        
+        portSpecItems = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpecItem':
+                _data = self.getDao('portSpecItem').fromXML(child)
+                portSpecItems.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPortSpec(id=id,
+                         name=name,
+                         type=type,
+                         optional=optional,
+                         sort_key=sort_key,
+                         portSpecItems=portSpecItems,
+                         min_conns=min_conns,
+                         max_conns=max_conns)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpec, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpec.db_id, 'long'))
+        node.set('name',self.convertToStr(portSpec.db_name, 'str'))
+        node.set('type',self.convertToStr(portSpec.db_type, 'str'))
+        node.set('optional',self.convertToStr(portSpec.db_optional, 'int'))
+        node.set('sortKey',self.convertToStr(portSpec.db_sort_key, 'int'))
+        node.set('minConns',self.convertToStr(portSpec.db_min_conns, 'int'))
+        node.set('maxConns',self.convertToStr(portSpec.db_max_conns, 'int'))
+        
+        # set elements
+        portSpecItems = portSpec.db_portSpecItems
+        for portSpecItem in portSpecItems:
+            if (portSpecItems is not None) and (portSpecItems != ""):
+                childNode = ElementTree.SubElement(node, 'portSpecItem')
+                self.getDao('portSpecItem').toXML(portSpecItem, childNode)
+        
+        return node
+
+class DBModuleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'module':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModule(id=id,
+                       cache=cache,
+                       name=name,
+                       namespace=namespace,
+                       package=package,
+                       version=version,
+                       location=location,
+                       functions=functions,
+                       annotations=annotations,
+                       portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module, node=None):
+        if node is None:
+            node = ElementTree.Element('module')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module.db_id, 'long'))
+        node.set('cache',self.convertToStr(module.db_cache, 'int'))
+        node.set('name',self.convertToStr(module.db_name, 'str'))
+        node.set('namespace',self.convertToStr(module.db_namespace, 'str'))
+        node.set('package',self.convertToStr(module.db_package, 'str'))
+        node.set('version',self.convertToStr(module.db_version, 'str'))
+        
+        # set elements
+        location = module.db_location
+        if location is not None:
+            if (location is not None) and (location != ""):
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(location, childNode)
+        functions = module.db_functions
+        for function in functions:
+            if (functions is not None) and (functions != ""):
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(function, childNode)
+        annotations = module.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        portSpecs = module.db_portSpecs
+        for portSpec in portSpecs:
+            if (portSpecs is not None) and (portSpecs != ""):
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBModuleDescriptorXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleDescriptor':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('packageVersion', None)
+        package_version = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('baseDescriptorId', None)
+        base_descriptor_id = self.convertFromStr(data, 'long')
+        
+        portSpecs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                portSpecs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleDescriptor(id=id,
+                                 name=name,
+                                 package=package,
+                                 namespace=namespace,
+                                 package_version=package_version,
+                                 version=version,
+                                 base_descriptor_id=base_descriptor_id,
+                                 portSpecs=portSpecs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_descriptor, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleDescriptor')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_descriptor.db_id, 'long'))
+        node.set('name',self.convertToStr(module_descriptor.db_name, 'str'))
+        node.set('package',self.convertToStr(module_descriptor.db_package, 'str'))
+        node.set('namespace',self.convertToStr(module_descriptor.db_namespace, 'str'))
+        node.set('packageVersion',self.convertToStr(module_descriptor.db_package_version, 'str'))
+        node.set('version',self.convertToStr(module_descriptor.db_version, 'str'))
+        node.set('baseDescriptorId',self.convertToStr(module_descriptor.db_base_descriptor_id, 'long'))
+        
+        # set elements
+        portSpecs = module_descriptor.db_portSpecs
+        for portSpec in portSpecs:
+            if (portSpecs is not None) and (portSpecs != ""):
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(portSpec, childNode)
+        
+        return node
+
+class DBTagXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'tag':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        obj = DBTag(id=id,
+                    name=name)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, tag, node=None):
+        if node is None:
+            node = ElementTree.Element('tag')
+        
+        # set attributes
+        node.set('id',self.convertToStr(tag.db_id, 'long'))
+        node.set('name',self.convertToStr(tag.db_name, 'str'))
+        
+        return node
+
+class DBOpmRoleXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'role':
+            return None
+        
+        # read attributes
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmRole(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_role, node=None):
+        if node is None:
+            node = ElementTree.Element('role')
+        
+        # set attributes
+        node.set('value',self.convertToStr(opm_role.db_value, 'str'))
+        
+        return node
+
+class DBProvDocumentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:document':
+            return None
+        
+        prov_entitys = []
+        prov_activitys = []
+        prov_agents = []
+        vt_connections = []
+        prov_usages = []
+        prov_generations = []
+        prov_associations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'prov:entity':
+                _data = self.getDao('prov_entity').fromXML(child)
+                prov_entitys.append(_data)
+            elif child_tag == 'prov:activity':
+                _data = self.getDao('prov_activity').fromXML(child)
+                prov_activitys.append(_data)
+            elif child_tag == 'prov:agent':
+                _data = self.getDao('prov_agent').fromXML(child)
+                prov_agents.append(_data)
+            elif child_tag == 'vt:connection':
+                _data = self.getDao('vt_connection').fromXML(child)
+                vt_connections.append(_data)
+            elif child_tag == 'prov:used':
+                _data = self.getDao('prov_usage').fromXML(child)
+                prov_usages.append(_data)
+            elif child_tag == 'prov:wasGeneratedBy':
+                _data = self.getDao('prov_generation').fromXML(child)
+                prov_generations.append(_data)
+            elif child_tag == 'prov:wasAssociatedWith':
+                _data = self.getDao('prov_association').fromXML(child)
+                prov_associations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvDocument(prov_entitys=prov_entitys,
+                             prov_activitys=prov_activitys,
+                             prov_agents=prov_agents,
+                             vt_connections=vt_connections,
+                             prov_usages=prov_usages,
+                             prov_generations=prov_generations,
+                             prov_associations=prov_associations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_document, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:document')
+        
+        # set elements
+        prov_entitys = prov_document.db_prov_entitys
+        for prov_entity in prov_entitys:
+            if (prov_entitys is not None) and (prov_entitys != ""):
+                childNode = ElementTree.SubElement(node, 'prov:entity')
+                self.getDao('prov_entity').toXML(prov_entity, childNode)
+        prov_activitys = prov_document.db_prov_activitys
+        for prov_activity in prov_activitys:
+            if (prov_activitys is not None) and (prov_activitys != ""):
+                childNode = ElementTree.SubElement(node, 'prov:activity')
+                self.getDao('prov_activity').toXML(prov_activity, childNode)
+        prov_agents = prov_document.db_prov_agents
+        for prov_agent in prov_agents:
+            if (prov_agents is not None) and (prov_agents != ""):
+                childNode = ElementTree.SubElement(node, 'prov:agent')
+                self.getDao('prov_agent').toXML(prov_agent, childNode)
+        vt_connections = prov_document.db_vt_connections
+        for vt_connection in vt_connections:
+            if (vt_connections is not None) and (vt_connections != ""):
+                childNode = ElementTree.SubElement(node, 'vt:connection')
+                self.getDao('vt_connection').toXML(vt_connection, childNode)
+        prov_usages = prov_document.db_prov_usages
+        for prov_usage in prov_usages:
+            if (prov_usages is not None) and (prov_usages != ""):
+                childNode = ElementTree.SubElement(node, 'prov:used')
+                self.getDao('prov_usage').toXML(prov_usage, childNode)
+        prov_generations = prov_document.db_prov_generations
+        for prov_generation in prov_generations:
+            if (prov_generations is not None) and (prov_generations != ""):
+                childNode = ElementTree.SubElement(node, 'prov:wasGeneratedBy')
+                self.getDao('prov_generation').toXML(prov_generation, childNode)
+        prov_associations = prov_document.db_prov_associations
+        for prov_association in prov_associations:
+            if (prov_associations is not None) and (prov_associations != ""):
+                childNode = ElementTree.SubElement(node, 'prov:wasAssociatedWith')
+                self.getDao('prov_association').toXML(prov_association, childNode)
+        
+        return node
+
+class DBOpmAccountXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAccount(id=id,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account.db_id, 'str'))
+        
+        # set elements
+        value = opm_account.db_value
+        if (value is not None) and (value != ""):
+            childNode = ElementTree.SubElement(node, 'value')
+            childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBOpmProcessesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'processes':
+            return None
+        
+        processs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'process':
+                _data = self.getDao('opm_process').fromXML(child)
+                processs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcesses(processs=processs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_processes, node=None):
+        if node is None:
+            node = ElementTree.Element('processes')
+        
+        # set elements
+        processs = opm_processes.db_processs
+        for process in processs:
+            if (processs is not None) and (processs != ""):
+                childNode = ElementTree.SubElement(node, 'process')
+                self.getDao('opm_process').toXML(process, childNode)
+        
+        return node
+
+class DBRefProvActivityXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:activity':
+            return None
+        
+        # read attributes
+        data = node.get('prov:ref', None)
+        prov_ref = self.convertFromStr(data, 'str')
+        
+        obj = DBRefProvActivity(prov_ref=prov_ref)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, ref_prov_activity, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:activity')
+        
+        # set attributes
+        node.set('prov:ref',self.convertToStr(ref_prov_activity.db_prov_ref, 'str'))
+        
+        return node
+
+class DBOpmAccountIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'account':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAccountId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_account_id, node=None):
+        if node is None:
+            node = ElementTree.Element('account')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_account_id.db_id, 'str'))
+        
+        return node
+
+class DBPortXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'port':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('moduleId', None)
+        moduleId = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        moduleName = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('signature', None)
+        signature = self.convertFromStr(data, 'str')
+        
+        obj = DBPort(id=id,
+                     type=type,
+                     moduleId=moduleId,
+                     moduleName=moduleName,
+                     name=name,
+                     signature=signature)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, port, node=None):
+        if node is None:
+            node = ElementTree.Element('port')
+        
+        # set attributes
+        node.set('id',self.convertToStr(port.db_id, 'long'))
+        node.set('type',self.convertToStr(port.db_type, 'str'))
+        node.set('moduleId',self.convertToStr(port.db_moduleId, 'long'))
+        node.set('moduleName',self.convertToStr(port.db_moduleName, 'str'))
+        node.set('name',self.convertToStr(port.db_name, 'str'))
+        node.set('signature',self.convertToStr(port.db_signature, 'str'))
+        
+        return node
+
+class DBRefProvPlanXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:plan':
+            return None
+        
+        # read attributes
+        data = node.get('prov:ref', None)
+        prov_ref = self.convertFromStr(data, 'str')
+        
+        obj = DBRefProvPlan(prov_ref=prov_ref)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, ref_prov_plan, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:plan')
+        
+        # set attributes
+        node.set('prov:ref',self.convertToStr(ref_prov_plan.db_prov_ref, 'str'))
+        
+        return node
+
+class DBOpmArtifactXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifact':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_artifact_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifact(id=id,
+                            value=value,
+                            accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact, node=None):
+        if node is None:
+            node = ElementTree.Element('artifact')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact.db_id, 'str'))
+        
+        # set elements
+        value = opm_artifact.db_value
+        if value is not None:
+            if (value is not None) and (value != ""):
+                childNode = ElementTree.SubElement(node, 'value')
+                self.getDao('opm_artifact_value').toXML(value, childNode)
+        accounts = opm_artifact.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBGroupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'group':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        
+        workflow = None
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflow':
+                _data = self.getDao('workflow').fromXML(child)
+                workflow = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroup(id=id,
+                      workflow=workflow,
+                      cache=cache,
+                      name=name,
+                      namespace=namespace,
+                      package=package,
+                      version=version,
+                      location=location,
+                      functions=functions,
+                      annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group, node=None):
+        if node is None:
+            node = ElementTree.Element('group')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group.db_id, 'long'))
+        node.set('cache',self.convertToStr(group.db_cache, 'int'))
+        node.set('name',self.convertToStr(group.db_name, 'str'))
+        node.set('namespace',self.convertToStr(group.db_namespace, 'str'))
+        node.set('package',self.convertToStr(group.db_package, 'str'))
+        node.set('version',self.convertToStr(group.db_version, 'str'))
+        
+        # set elements
+        workflow = group.db_workflow
+        if workflow is not None:
+            if (workflow is not None) and (workflow != ""):
+                childNode = ElementTree.SubElement(node, 'workflow')
+                self.getDao('workflow').toXML(workflow, childNode)
+        location = group.db_location
+        if location is not None:
+            if (location is not None) and (location != ""):
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(location, childNode)
+        functions = group.db_functions
+        for function in functions:
+            if (functions is not None) and (functions != ""):
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(function, childNode)
+        annotations = group.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBLogXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'log':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        workflow_execs = []
+        machines = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'workflowExec':
+                _data = self.getDao('workflow_exec').fromXML(child)
+                workflow_execs.append(_data)
+            elif child_tag == 'machine':
+                _data = self.getDao('machine').fromXML(child)
+                machines.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLog(id=id,
+                    version=version,
+                    name=name,
+                    workflow_execs=workflow_execs,
+                    machines=machines,
+                    vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, log, node=None):
+        if node is None:
+            node = ElementTree.Element('log')
+        
+        # set attributes
+        node.set('id',self.convertToStr(log.db_id, 'long'))
+        node.set('version',self.convertToStr(log.db_version, 'str'))
+        node.set('name',self.convertToStr(log.db_name, 'str'))
+        node.set('vistrail_id',self.convertToStr(log.db_vistrail_id, 'long'))
+        
+        # set elements
+        workflow_execs = log.db_workflow_execs
+        for workflow_exec in workflow_execs:
+            if (workflow_execs is not None) and (workflow_execs != ""):
+                childNode = ElementTree.SubElement(node, 'workflowExec')
+                self.getDao('workflow_exec').toXML(workflow_exec, childNode)
+        machines = log.db_machines
+        for machine in machines:
+            if (machines is not None) and (machines != ""):
+                childNode = ElementTree.SubElement(node, 'machine')
+                self.getDao('machine').toXML(machine, childNode)
+        
+        return node
+
+class DBMashupAliasXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'alias':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        component = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'component':
+                _data = self.getDao('mashup_component').fromXML(child)
+                component = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBMashupAlias(id=id,
+                            name=name,
+                            component=component)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, mashup_alias, node=None):
+        if node is None:
+            node = ElementTree.Element('alias')
+        
+        # set attributes
+        node.set('id',self.convertToStr(mashup_alias.db_id, 'long'))
+        node.set('name',self.convertToStr(mashup_alias.db_name, 'str'))
+        
+        # set elements
+        component = mashup_alias.db_component
+        if component is not None:
+            if (component is not None) and (component != ""):
+                childNode = ElementTree.SubElement(node, 'component')
+                self.getDao('mashup_component').toXML(component, childNode)
+        
+        return node
+
+class DBOpmAgentsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agents':
+            return None
+        
+        agents = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'agent':
+                _data = self.getDao('opm_agent').fromXML(child)
+                agents.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgents(agents=agents)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agents, node=None):
+        if node is None:
+            node = ElementTree.Element('agents')
+        
+        # set elements
+        agents = opm_agents.db_agents
+        for agent in agents:
+            if (agents is not None) and (agents != ""):
+                childNode = ElementTree.SubElement(node, 'agent')
+                self.getDao('opm_agent').toXML(agent, childNode)
+        
+        return node
+
+class DBMashupXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'mashup':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('vtid', None)
+        vtid = self.convertFromStr(data, 'long')
+        data = node.get('has_seq', None)
+        has_seq = self.convertFromStr(data, 'int')
+        
+        aliases = []
+        layout = None
+        geometry = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'alias':
+                _data = self.getDao('mashup_alias').fromXML(child)
+                aliases.append(_data)
+            elif child_tag == 'layout':
+                _data = self.convertFromStr(child.text,'str')
+                layout = _data
+            elif child_tag == 'geometry':
+                _data = self.convertFromStr(child.text,'str')
+                geometry = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBMashup(id=id,
+                       name=name,
+                       version=version,
+                       aliases=aliases,
+                       type=type,
+                       vtid=vtid,
+                       layout=layout,
+                       geometry=geometry,
+                       has_seq=has_seq)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, mashup, node=None):
+        if node is None:
+            node = ElementTree.Element('mashup')
+        
+        # set attributes
+        node.set('id',self.convertToStr(mashup.db_id, 'long'))
+        node.set('name',self.convertToStr(mashup.db_name, 'str'))
+        node.set('version',self.convertToStr(mashup.db_version, 'long'))
+        node.set('type',self.convertToStr(mashup.db_type, 'str'))
+        node.set('vtid',self.convertToStr(mashup.db_vtid, 'long'))
+        node.set('has_seq',self.convertToStr(mashup.db_has_seq, 'int'))
+        
+        # set elements
+        aliases = mashup.db_aliases
+        for alias in aliases:
+            if (aliases is not None) and (aliases != ""):
+                childNode = ElementTree.SubElement(node, 'alias')
+                self.getDao('mashup_alias').toXML(alias, childNode)
+        layout = mashup.db_layout
+        if (layout is not None) and (layout != ""):
+            childNode = ElementTree.SubElement(node, 'layout')
+            childNode.text = self.convertToStr(layout, 'str')
+        geometry = mashup.db_geometry
+        if (geometry is not None) and (geometry != ""):
+            childNode = ElementTree.SubElement(node, 'geometry')
+            childNode.text = self.convertToStr(geometry, 'str')
+        
+        return node
+
+class DBOpmProcessIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmProcessIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBProvGenerationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:wasGeneratedBy':
+            return None
+        
+        prov_entity = None
+        prov_activity = None
+        prov_role = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'prov:entity':
+                _data = self.getDao('ref_prov_entity').fromXML(child)
+                prov_entity = _data
+            elif child_tag == 'prov:activity':
+                _data = self.getDao('ref_prov_activity').fromXML(child)
+                prov_activity = _data
+            elif child_tag == 'prov:role':
+                _data = self.convertFromStr(child.text,'str')
+                prov_role = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvGeneration(prov_entity=prov_entity,
+                               prov_activity=prov_activity,
+                               prov_role=prov_role)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_generation, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:wasGeneratedBy')
+        
+        # set elements
+        prov_entity = prov_generation.db_prov_entity
+        if prov_entity is not None:
+            if (prov_entity is not None) and (prov_entity != ""):
+                childNode = ElementTree.SubElement(node, 'prov:entity')
+                self.getDao('ref_prov_entity').toXML(prov_entity, childNode)
+        prov_activity = prov_generation.db_prov_activity
+        if prov_activity is not None:
+            if (prov_activity is not None) and (prov_activity != ""):
+                childNode = ElementTree.SubElement(node, 'prov:activity')
+                self.getDao('ref_prov_activity').toXML(prov_activity, childNode)
+        prov_role = prov_generation.db_prov_role
+        if (prov_role is not None) and (prov_role != ""):
+            childNode = ElementTree.SubElement(node, 'prov:role')
+            childNode.text = self.convertToStr(prov_role, 'str')
+        
+        return node
+
+class DBPortSpecItemXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'portSpecItem':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('module', None)
+        module = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('label', None)
+        label = self.convertFromStr(data, 'str')
+        data = node.get('default', None)
+        default = self.convertFromStr(data, 'str')
+        data = node.get('values', None)
+        values = self.convertFromStr(data, 'str')
+        data = node.get('entryType', None)
+        entry_type = self.convertFromStr(data, 'str')
+        
+        obj = DBPortSpecItem(id=id,
+                             pos=pos,
+                             module=module,
+                             package=package,
+                             namespace=namespace,
+                             label=label,
+                             default=default,
+                             values=values,
+                             entry_type=entry_type)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, portSpecItem, node=None):
+        if node is None:
+            node = ElementTree.Element('portSpecItem')
+        
+        # set attributes
+        node.set('id',self.convertToStr(portSpecItem.db_id, 'long'))
+        node.set('pos',self.convertToStr(portSpecItem.db_pos, 'long'))
+        node.set('module',self.convertToStr(portSpecItem.db_module, 'str'))
+        node.set('package',self.convertToStr(portSpecItem.db_package, 'str'))
+        node.set('namespace',self.convertToStr(portSpecItem.db_namespace, 'str'))
+        node.set('label',self.convertToStr(portSpecItem.db_label, 'str'))
+        node.set('default',self.convertToStr(portSpecItem.db_default, 'str'))
+        node.set('values',self.convertToStr(portSpecItem.db_values, 'str'))
+        node.set('entryType',self.convertToStr(portSpecItem.db_entry_type, 'str'))
+        
+        return node
+
+class DBMachineXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'machine':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('os', None)
+        os = self.convertFromStr(data, 'str')
+        data = node.get('architecture', None)
+        architecture = self.convertFromStr(data, 'str')
+        data = node.get('processor', None)
+        processor = self.convertFromStr(data, 'str')
+        data = node.get('ram', None)
+        ram = self.convertFromStr(data, 'int')
+        
+        obj = DBMachine(id=id,
+                        name=name,
+                        os=os,
+                        architecture=architecture,
+                        processor=processor,
+                        ram=ram)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, machine, node=None):
+        if node is None:
+            node = ElementTree.Element('machine')
+        
+        # set attributes
+        node.set('id',self.convertToStr(machine.db_id, 'long'))
+        node.set('name',self.convertToStr(machine.db_name, 'str'))
+        node.set('os',self.convertToStr(machine.db_os, 'str'))
+        node.set('architecture',self.convertToStr(machine.db_architecture, 'str'))
+        node.set('processor',self.convertToStr(machine.db_processor, 'str'))
+        node.set('ram',self.convertToStr(machine.db_ram, 'int'))
+        
+        return node
+
+class DBAddXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'add':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAdd(data=data,
+                    id=id,
+                    what=what,
+                    objectId=objectId,
+                    parentObjId=parentObjId,
+                    parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, add, node=None):
+        if node is None:
+            node = ElementTree.Element('add')
+        
+        # set attributes
+        node.set('id',self.convertToStr(add.db_id, 'long'))
+        node.set('what',self.convertToStr(add.db_what, 'str'))
+        node.set('objectId',self.convertToStr(add.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(add.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(add.db_parentObjType, 'str'))
+        
+        # set elements
+        data = add.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOtherXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'other':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOther(id=id,
+                      key=key,
+                      value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, other, node=None):
+        if node is None:
+            node = ElementTree.Element('other')
+        
+        # set attributes
+        node.set('id',self.convertToStr(other.db_id, 'long'))
+        node.set('key',self.convertToStr(other.db_key, 'str'))
+        
+        # set elements
+        value = other.db_value
+        if (value is not None) and (value != ""):
+            childNode = ElementTree.SubElement(node, 'value')
+            childNode.text = self.convertToStr(value, 'str')
+        
+        return node
+
+class DBLocationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'location':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('x', None)
+        x = self.convertFromStr(data, 'float')
+        data = node.get('y', None)
+        y = self.convertFromStr(data, 'float')
+        
+        obj = DBLocation(id=id,
+                         x=x,
+                         y=y)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, location, node=None):
+        if node is None:
+            node = ElementTree.Element('location')
+        
+        # set attributes
+        node.set('id',self.convertToStr(location.db_id, 'long'))
+        node.set('x',self.convertToStr(location.db_x, 'float'))
+        node.set('y',self.convertToStr(location.db_y, 'float'))
+        
+        return node
+
+class DBOpmOverlapsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'overlaps':
+            return None
+        
+        opm_account_ids = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                opm_account_ids.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmOverlaps(opm_account_ids=opm_account_ids)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_overlaps, node=None):
+        if node is None:
+            node = ElementTree.Element('overlaps')
+        
+        # set elements
+        opm_account_ids = opm_overlaps.db_opm_account_ids
+        for opm_account_id in opm_account_ids:
+            if (opm_account_ids is not None) and (opm_account_ids != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(opm_account_id, childNode)
+        
+        return node
+
+class DBPEParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'peParameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('interpolator', None)
+        interpolator = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        data = node.get('dimension', None)
+        dimension = self.convertFromStr(data, 'long')
+        
+        obj = DBPEParameter(id=id,
+                            pos=pos,
+                            interpolator=interpolator,
+                            value=value,
+                            dimension=dimension)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, pe_parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('peParameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(pe_parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(pe_parameter.db_pos, 'long'))
+        node.set('interpolator',self.convertToStr(pe_parameter.db_interpolator, 'str'))
+        node.set('value',self.convertToStr(pe_parameter.db_value, 'str'))
+        node.set('dimension',self.convertToStr(pe_parameter.db_dimension, 'long'))
+        
+        return node
+
+class DBOpmDependenciesXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'causalDependencies':
+            return None
+        
+        dependencys = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'used':
+                _data = self.getDao('opm_used').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasGeneratedBy':
+                _data = self.getDao('opm_was_generated_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasTriggeredBy':
+                _data = self.getDao('opm_was_triggered_by').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasDerivedFrom':
+                _data = self.getDao('opm_was_derived_from').fromXML(child)
+                dependencys.append(_data)
+            elif child_tag == 'wasControlledBy':
+                _data = self.getDao('opm_was_controlled_by').fromXML(child)
+                dependencys.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmDependencies(dependencys=dependencys)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_dependencies, node=None):
+        if node is None:
+            node = ElementTree.Element('causalDependencies')
+        
+        # set elements
+        dependencys = opm_dependencies.db_dependencys
+        for dependency in dependencys:
+            if dependency.vtType == 'opm_used':
+                childNode = ElementTree.SubElement(node, 'used')
+                self.getDao('opm_used').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_generated_by':
+                childNode = ElementTree.SubElement(node, 'wasGeneratedBy')
+                self.getDao('opm_was_generated_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_triggered_by':
+                childNode = ElementTree.SubElement(node, 'wasTriggeredBy')
+                self.getDao('opm_was_triggered_by').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_derived_from':
+                childNode = ElementTree.SubElement(node, 'wasDerivedFrom')
+                self.getDao('opm_was_derived_from').toXML(dependency, childNode)
+            elif dependency.vtType == 'opm_was_controlled_by':
+                childNode = ElementTree.SubElement(node, 'wasControlledBy')
+                self.getDao('opm_was_controlled_by').toXML(dependency, childNode)
+        
+        return node
+
+class DBParameterXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'parameter':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('alias', None)
+        alias = self.convertFromStr(data, 'str')
+        
+        obj = DBParameter(id=id,
+                          pos=pos,
+                          name=name,
+                          type=type,
+                          val=val,
+                          alias=alias)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter, node=None):
+        if node is None:
+            node = ElementTree.Element('parameter')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter.db_id, 'long'))
+        node.set('pos',self.convertToStr(parameter.db_pos, 'long'))
+        node.set('name',self.convertToStr(parameter.db_name, 'str'))
+        node.set('type',self.convertToStr(parameter.db_type, 'str'))
+        node.set('val',self.convertToStr(parameter.db_val, 'str'))
+        node.set('alias',self.convertToStr(parameter.db_alias, 'str'))
+        
+        return node
+
+class DBOpmUsedXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'used':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmUsed(effect=effect,
+                        role=role,
+                        cause=cause,
+                        accounts=accounts,
+                        opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_used, node=None):
+        if node is None:
+            node = ElementTree.Element('used')
+        
+        # set elements
+        effect = opm_used.db_effect
+        if effect is not None:
+            if (effect is not None) and (effect != ""):
+                childNode = ElementTree.SubElement(node, 'effect')
+                self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_used.db_role
+        if role is not None:
+            if (role is not None) and (role != ""):
+                childNode = ElementTree.SubElement(node, 'role')
+                self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_used.db_cause
+        if cause is not None:
+            if (cause is not None) and (cause != ""):
+                childNode = ElementTree.SubElement(node, 'cause')
+                self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_used.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_used.db_opm_times
+        for opm_time in opm_times:
+            if (opm_times is not None) and (opm_times != ""):
+                childNode = ElementTree.SubElement(node, 'time')
+                self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBPluginDataXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'plugin_data':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('data', None)
+        data = self.convertFromStr(data, 'str')
+        
+        obj = DBPluginData(id=id,
+                           data=data)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, plugin_data, node=None):
+        if node is None:
+            node = ElementTree.Element('plugin_data')
+        
+        # set attributes
+        node.set('id',self.convertToStr(plugin_data.db_id, 'long'))
+        node.set('data',self.convertToStr(plugin_data.db_data, 'str'))
+        
+        return node
+
+class DBFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'function':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBFunction(id=id,
+                         pos=pos,
+                         name=name,
+                         parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, function, node=None):
+        if node is None:
+            node = ElementTree.Element('function')
+        
+        # set attributes
+        node.set('id',self.convertToStr(function.db_id, 'long'))
+        node.set('pos',self.convertToStr(function.db_pos, 'long'))
+        node.set('name',self.convertToStr(function.db_name, 'str'))
+        
+        # set elements
+        parameters = function.db_parameters
+        for parameter in parameters:
+            if (parameters is not None) and (parameters != ""):
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBActionAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'actionAnnotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        data = node.get('actionId', None)
+        action_id = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        
+        obj = DBActionAnnotation(id=id,
+                                 key=key,
+                                 value=value,
+                                 action_id=action_id,
+                                 date=date,
+                                 user=user)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, actionAnnotation, node=None):
+        if node is None:
+            node = ElementTree.Element('actionAnnotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(actionAnnotation.db_id, 'long'))
+        node.set('key',self.convertToStr(actionAnnotation.db_key, 'str'))
+        node.set('value',self.convertToStr(actionAnnotation.db_value, 'str'))
+        node.set('actionId',self.convertToStr(actionAnnotation.db_action_id, 'long'))
+        node.set('date',self.convertToStr(actionAnnotation.db_date, 'datetime'))
+        node.set('user',self.convertToStr(actionAnnotation.db_user, 'str'))
+        
+        return node
+
+class DBAbstractionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'abstraction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('cache', None)
+        cache = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('namespace', None)
+        namespace = self.convertFromStr(data, 'str')
+        data = node.get('package', None)
+        package = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('internalVersion', None)
+        internal_version = self.convertFromStr(data, 'str')
+        
+        location = None
+        functions = []
+        annotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                location = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                functions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAbstraction(id=id,
+                            cache=cache,
+                            name=name,
+                            namespace=namespace,
+                            package=package,
+                            version=version,
+                            internal_version=internal_version,
+                            location=location,
+                            functions=functions,
+                            annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, abstraction, node=None):
+        if node is None:
+            node = ElementTree.Element('abstraction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(abstraction.db_id, 'long'))
+        node.set('cache',self.convertToStr(abstraction.db_cache, 'int'))
+        node.set('name',self.convertToStr(abstraction.db_name, 'str'))
+        node.set('namespace',self.convertToStr(abstraction.db_namespace, 'str'))
+        node.set('package',self.convertToStr(abstraction.db_package, 'str'))
+        node.set('version',self.convertToStr(abstraction.db_version, 'str'))
+        node.set('internalVersion',self.convertToStr(abstraction.db_internal_version, 'str'))
+        
+        # set elements
+        location = abstraction.db_location
+        if location is not None:
+            if (location is not None) and (location != ""):
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(location, childNode)
+        functions = abstraction.db_functions
+        for function in functions:
+            if (functions is not None) and (functions != ""):
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(function, childNode)
+        annotations = abstraction.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        
+        return node
+
+class DBWorkflowXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflow':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vistrail_id', None)
+        vistrail_id = self.convertFromStr(data, 'long')
+        
+        connections = []
+        annotations = []
+        plugin_datas = []
+        others = []
+        modules = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                connections.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                plugin_datas.append(_data)
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                others.append(_data)
+            elif child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                modules.append(_data)
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                modules.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflow(modules=modules,
+                         id=id,
+                         name=name,
+                         version=version,
+                         connections=connections,
+                         annotations=annotations,
+                         plugin_datas=plugin_datas,
+                         others=others,
+                         vistrail_id=vistrail_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow, node=None):
+        if node is None:
+            node = ElementTree.Element('workflow')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow.db_id, 'long'))
+        node.set('name',self.convertToStr(workflow.db_name, 'str'))
+        node.set('version',self.convertToStr(workflow.db_version, 'str'))
+        node.set('vistrail_id',self.convertToStr(workflow.db_vistrail_id, 'long'))
+        
+        # set elements
+        connections = workflow.db_connections
+        for connection in connections:
+            if (connections is not None) and (connections != ""):
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(connection, childNode)
+        annotations = workflow.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        plugin_datas = workflow.db_plugin_datas
+        for plugin_data in plugin_datas:
+            if (plugin_datas is not None) and (plugin_datas != ""):
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(plugin_data, childNode)
+        others = workflow.db_others
+        for other in others:
+            if (others is not None) and (others != ""):
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(other, childNode)
+        modules = workflow.db_modules
+        for module in modules:
+            if module.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(module, childNode)
+            elif module.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(module, childNode)
+            elif module.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(module, childNode)
+        
+        return node
+
+class DBOpmArtifactIdCauseXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'cause':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdCause(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_cause, node=None):
+        if node is None:
+            node = ElementTree.Element('cause')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_cause.db_id, 'str'))
+        
+        return node
+
+class DBRefProvEntityXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:entity':
+            return None
+        
+        # read attributes
+        data = node.get('prov:ref', None)
+        prov_ref = self.convertFromStr(data, 'str')
+        
+        obj = DBRefProvEntity(prov_ref=prov_ref)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, ref_prov_entity, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:entity')
+        
+        # set attributes
+        node.set('prov:ref',self.convertToStr(ref_prov_entity.db_prov_ref, 'str'))
+        
+        return node
+
+class DBProvActivityXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:activity':
+            return None
+        
+        # read attributes
+        data = node.get('prov:id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        startTime = None
+        endTime = None
+        vt_id = None
+        vt_type = None
+        vt_cached = None
+        vt_completed = None
+        vt_machine_id = None
+        vt_error = None
+        is_part_of = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'prov:startTime':
+                _data = self.convertFromStr(child.text,'str')
+                startTime = _data
+            elif child_tag == 'prov:endTime':
+                _data = self.convertFromStr(child.text,'str')
+                endTime = _data
+            elif child_tag == 'vt:id':
+                _data = self.convertFromStr(child.text,'str')
+                vt_id = _data
+            elif child_tag == 'vt:type':
+                _data = self.convertFromStr(child.text,'str')
+                vt_type = _data
+            elif child_tag == 'vt:cached':
+                _data = self.convertFromStr(child.text,'str')
+                vt_cached = _data
+            elif child_tag == 'vt:completed':
+                _data = self.convertFromStr(child.text,'str')
+                vt_completed = _data
+            elif child_tag == 'vt:machine_id':
+                _data = self.convertFromStr(child.text,'str')
+                vt_machine_id = _data
+            elif child_tag == 'vt:error':
+                _data = self.convertFromStr(child.text,'str')
+                vt_error = _data
+            elif child_tag == 'dcterms:isPartOf':
+                _data = self.getDao('is_part_of').fromXML(child)
+                is_part_of = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvActivity(id=id,
+                             startTime=startTime,
+                             endTime=endTime,
+                             vt_id=vt_id,
+                             vt_type=vt_type,
+                             vt_cached=vt_cached,
+                             vt_completed=vt_completed,
+                             vt_machine_id=vt_machine_id,
+                             vt_error=vt_error,
+                             is_part_of=is_part_of)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_activity, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:activity')
+        
+        # set attributes
+        node.set('prov:id',self.convertToStr(prov_activity.db_id, 'str'))
+        
+        # set elements
+        startTime = prov_activity.db_startTime
+        if (startTime is not None) and (startTime != ""):
+            childNode = ElementTree.SubElement(node, 'prov:startTime')
+            childNode.text = self.convertToStr(startTime, 'str')
+        endTime = prov_activity.db_endTime
+        if (endTime is not None) and (endTime != ""):
+            childNode = ElementTree.SubElement(node, 'prov:endTime')
+            childNode.text = self.convertToStr(endTime, 'str')
+        vt_id = prov_activity.db_vt_id
+        if (vt_id is not None) and (vt_id != ""):
+            childNode = ElementTree.SubElement(node, 'vt:id')
+            childNode.text = self.convertToStr(vt_id, 'str')
+        vt_type = prov_activity.db_vt_type
+        if (vt_type is not None) and (vt_type != ""):
+            childNode = ElementTree.SubElement(node, 'vt:type')
+            childNode.text = self.convertToStr(vt_type, 'str')
+        vt_cached = prov_activity.db_vt_cached
+        if (vt_cached is not None) and (vt_cached != ""):
+            childNode = ElementTree.SubElement(node, 'vt:cached')
+            childNode.text = self.convertToStr(vt_cached, 'str')
+        vt_completed = prov_activity.db_vt_completed
+        if (vt_completed is not None) and (vt_completed != ""):
+            childNode = ElementTree.SubElement(node, 'vt:completed')
+            childNode.text = self.convertToStr(vt_completed, 'str')
+        vt_machine_id = prov_activity.db_vt_machine_id
+        if (vt_machine_id is not None) and (vt_machine_id != ""):
+            childNode = ElementTree.SubElement(node, 'vt:machine_id')
+            childNode.text = self.convertToStr(vt_machine_id, 'str')
+        vt_error = prov_activity.db_vt_error
+        if (vt_error is not None) and (vt_error != ""):
+            childNode = ElementTree.SubElement(node, 'vt:error')
+            childNode.text = self.convertToStr(vt_error, 'str')
+        is_part_of = prov_activity.db_is_part_of
+        if is_part_of is not None:
+            if (is_part_of is not None) and (is_part_of != ""):
+                childNode = ElementTree.SubElement(node, 'dcterms:isPartOf')
+                self.getDao('is_part_of').toXML(is_part_of, childNode)
+        
+        return node
+
+class DBMashupActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        
+        mashup = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'mashup':
+                _data = self.getDao('mashup').fromXML(child)
+                mashup = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBMashupAction(id=id,
+                             prevId=prevId,
+                             date=date,
+                             user=user,
+                             mashup=mashup)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, mashup_action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(mashup_action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(mashup_action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(mashup_action.db_date, 'datetime'))
+        node.set('user',self.convertToStr(mashup_action.db_user, 'str'))
+        
+        # set elements
+        mashup = mashup_action.db_mashup
+        if mashup is not None:
+            if (mashup is not None) and (mashup != ""):
+                childNode = ElementTree.SubElement(node, 'mashup')
+                self.getDao('mashup').toXML(mashup, childNode)
+        
+        return node
+
+class DBProvUsageXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:used':
+            return None
+        
+        prov_activity = None
+        prov_entity = None
+        prov_role = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'prov:activity':
+                _data = self.getDao('ref_prov_activity').fromXML(child)
+                prov_activity = _data
+            elif child_tag == 'prov:entity':
+                _data = self.getDao('ref_prov_entity').fromXML(child)
+                prov_entity = _data
+            elif child_tag == 'prov:role':
+                _data = self.convertFromStr(child.text,'str')
+                prov_role = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvUsage(prov_activity=prov_activity,
+                          prov_entity=prov_entity,
+                          prov_role=prov_role)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_usage, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:used')
+        
+        # set elements
+        prov_activity = prov_usage.db_prov_activity
+        if prov_activity is not None:
+            if (prov_activity is not None) and (prov_activity != ""):
+                childNode = ElementTree.SubElement(node, 'prov:activity')
+                self.getDao('ref_prov_activity').toXML(prov_activity, childNode)
+        prov_entity = prov_usage.db_prov_entity
+        if prov_entity is not None:
+            if (prov_entity is not None) and (prov_entity != ""):
+                childNode = ElementTree.SubElement(node, 'prov:entity')
+                self.getDao('ref_prov_entity').toXML(prov_entity, childNode)
+        prov_role = prov_usage.db_prov_role
+        if (prov_role is not None) and (prov_role != ""):
+            childNode = ElementTree.SubElement(node, 'prov:role')
+            childNode.text = self.convertToStr(prov_role, 'str')
+        
+        return node
+
+class DBOpmArtifactValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                value = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifactValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_artifact_value.db_value
+        if value is not None:
+            if value.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(value, childNode)
+            elif value.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(value, childNode)
+        
+        return node
+
+class DBOpmArtifactIdEffectXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'effect':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmArtifactIdEffect(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifact_id_effect, node=None):
+        if node is None:
+            node = ElementTree.Element('effect')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_artifact_id_effect.db_id, 'str'))
+        
+        return node
+
+class DBOpmGraphXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'opmGraph':
+            return None
+        
+        accounts = None
+        processes = None
+        artifacts = None
+        agents = None
+        dependencies = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'accounts':
+                _data = self.getDao('opm_accounts').fromXML(child)
+                accounts = _data
+            elif child_tag == 'processes':
+                _data = self.getDao('opm_processes').fromXML(child)
+                processes = _data
+            elif child_tag == 'artifacts':
+                _data = self.getDao('opm_artifacts').fromXML(child)
+                artifacts = _data
+            elif child_tag == 'agents':
+                _data = self.getDao('opm_agents').fromXML(child)
+                agents = _data
+            elif child_tag == 'causalDependencies':
+                _data = self.getDao('opm_dependencies').fromXML(child)
+                dependencies = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmGraph(accounts=accounts,
+                         processes=processes,
+                         artifacts=artifacts,
+                         agents=agents,
+                         dependencies=dependencies)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_graph, node=None):
+        if node is None:
+            node = ElementTree.Element('opmGraph')
+        
+        # set elements
+        accounts = opm_graph.db_accounts
+        if accounts is not None:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'accounts')
+                self.getDao('opm_accounts').toXML(accounts, childNode)
+        processes = opm_graph.db_processes
+        if processes is not None:
+            if (processes is not None) and (processes != ""):
+                childNode = ElementTree.SubElement(node, 'processes')
+                self.getDao('opm_processes').toXML(processes, childNode)
+        artifacts = opm_graph.db_artifacts
+        if artifacts is not None:
+            if (artifacts is not None) and (artifacts != ""):
+                childNode = ElementTree.SubElement(node, 'artifacts')
+                self.getDao('opm_artifacts').toXML(artifacts, childNode)
+        agents = opm_graph.db_agents
+        if agents is not None:
+            if (agents is not None) and (agents != ""):
+                childNode = ElementTree.SubElement(node, 'agents')
+                self.getDao('opm_agents').toXML(agents, childNode)
+        dependencies = opm_graph.db_dependencies
+        if dependencies is not None:
+            if (dependencies is not None) and (dependencies != ""):
+                childNode = ElementTree.SubElement(node, 'causalDependencies')
+                self.getDao('opm_dependencies').toXML(dependencies, childNode)
+        
+        return node
+
+class DBMashuptrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'mashuptrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('vtVersion', None)
+        vtVersion = self.convertFromStr(data, 'long')
+        
+        actions = []
+        annotations = []
+        actionAnnotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'action':
+                _data = self.getDao('mashup_action').fromXML(child)
+                actions.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'actionAnnotation':
+                _data = self.getDao('mashup_actionAnnotation').fromXML(child)
+                actionAnnotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBMashuptrail(name=name,
+                            version=version,
+                            vtVersion=vtVersion,
+                            actions=actions,
+                            annotations=annotations,
+                            actionAnnotations=actionAnnotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, mashuptrail, node=None):
+        if node is None:
+            node = ElementTree.Element('mashuptrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(mashuptrail.db_name, 'str'))
+        node.set('version',self.convertToStr(mashuptrail.db_version, 'str'))
+        node.set('vtVersion',self.convertToStr(mashuptrail.db_vtVersion, 'long'))
+        
+        # set elements
+        actions = mashuptrail.db_actions
+        for action in actions:
+            if (actions is not None) and (actions != ""):
+                childNode = ElementTree.SubElement(node, 'action')
+                self.getDao('mashup_action').toXML(action, childNode)
+        annotations = mashuptrail.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        actionAnnotations = mashuptrail.db_actionAnnotations
+        for actionAnnotation in actionAnnotations:
+            if (actionAnnotations is not None) and (actionAnnotations != ""):
+                childNode = ElementTree.SubElement(node, 'actionAnnotation')
+                self.getDao('mashup_actionAnnotation').toXML(actionAnnotation, childNode)
+        
+        return node
+
+class DBRegistryXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'registry':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('rootDescriptorId', None)
+        root_descriptor_id = self.convertFromStr(data, 'long')
+        
+        packages = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'package':
+                _data = self.getDao('package').fromXML(child)
+                packages.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBRegistry(id=id,
+                         version=version,
+                         root_descriptor_id=root_descriptor_id,
+                         packages=packages)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, registry, node=None):
+        if node is None:
+            node = ElementTree.Element('registry')
+        
+        # set attributes
+        node.set('id',self.convertToStr(registry.db_id, 'long'))
+        node.set('version',self.convertToStr(registry.db_version, 'str'))
+        node.set('rootDescriptorId',self.convertToStr(registry.db_root_descriptor_id, 'long'))
+        
+        # set elements
+        packages = registry.db_packages
+        for package in packages:
+            if (packages is not None) and (packages != ""):
+                childNode = ElementTree.SubElement(node, 'package')
+                self.getDao('package').toXML(package, childNode)
+        
+        return node
+
+class DBVtConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'vt:connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        vt_source = None
+        vt_dest = None
+        vt_source_port = None
+        vt_dest_port = None
+        vt_source_signature = None
+        vt_dest_signature = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'vt:source':
+                _data = self.convertFromStr(child.text,'str')
+                vt_source = _data
+            elif child_tag == 'vt:dest':
+                _data = self.convertFromStr(child.text,'str')
+                vt_dest = _data
+            elif child_tag == 'vt:source_port':
+                _data = self.convertFromStr(child.text,'str')
+                vt_source_port = _data
+            elif child_tag == 'vt:dest_port':
+                _data = self.convertFromStr(child.text,'str')
+                vt_dest_port = _data
+            elif child_tag == 'vt:source_signature':
+                _data = self.convertFromStr(child.text,'str')
+                vt_source_signature = _data
+            elif child_tag == 'vt:dest_signature':
+                _data = self.convertFromStr(child.text,'str')
+                vt_dest_signature = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVtConnection(id=id,
+                             vt_source=vt_source,
+                             vt_dest=vt_dest,
+                             vt_source_port=vt_source_port,
+                             vt_dest_port=vt_dest_port,
+                             vt_source_signature=vt_source_signature,
+                             vt_dest_signature=vt_dest_signature)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vt_connection, node=None):
+        if node is None:
+            node = ElementTree.Element('vt:connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vt_connection.db_id, 'str'))
+        
+        # set elements
+        vt_source = vt_connection.db_vt_source
+        if (vt_source is not None) and (vt_source != ""):
+            childNode = ElementTree.SubElement(node, 'vt:source')
+            childNode.text = self.convertToStr(vt_source, 'str')
+        vt_dest = vt_connection.db_vt_dest
+        if (vt_dest is not None) and (vt_dest != ""):
+            childNode = ElementTree.SubElement(node, 'vt:dest')
+            childNode.text = self.convertToStr(vt_dest, 'str')
+        vt_source_port = vt_connection.db_vt_source_port
+        if (vt_source_port is not None) and (vt_source_port != ""):
+            childNode = ElementTree.SubElement(node, 'vt:source_port')
+            childNode.text = self.convertToStr(vt_source_port, 'str')
+        vt_dest_port = vt_connection.db_vt_dest_port
+        if (vt_dest_port is not None) and (vt_dest_port != ""):
+            childNode = ElementTree.SubElement(node, 'vt:dest_port')
+            childNode.text = self.convertToStr(vt_dest_port, 'str')
+        vt_source_signature = vt_connection.db_vt_source_signature
+        if (vt_source_signature is not None) and (vt_source_signature != ""):
+            childNode = ElementTree.SubElement(node, 'vt:source_signature')
+            childNode.text = self.convertToStr(vt_source_signature, 'str')
+        vt_dest_signature = vt_connection.db_vt_dest_signature
+        if (vt_dest_signature is not None) and (vt_dest_signature != ""):
+            childNode = ElementTree.SubElement(node, 'vt:dest_signature')
+            childNode.text = self.convertToStr(vt_dest_signature, 'str')
+        
+        return node
+
+class DBMashupComponentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'component':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('vtid', None)
+        vtid = self.convertFromStr(data, 'long')
+        data = node.get('vttype', None)
+        vttype = self.convertFromStr(data, 'str')
+        data = node.get('vtparent_type', None)
+        vtparent_type = self.convertFromStr(data, 'str')
+        data = node.get('vtparent_id', None)
+        vtparent_id = self.convertFromStr(data, 'long')
+        data = node.get('vtpos', None)
+        vtpos = self.convertFromStr(data, 'long')
+        data = node.get('vtmid', None)
+        vtmid = self.convertFromStr(data, 'long')
+        data = node.get('pos', None)
+        pos = self.convertFromStr(data, 'long')
+        data = node.get('type', None)
+        type = self.convertFromStr(data, 'str')
+        data = node.get('val', None)
+        val = self.convertFromStr(data, 'str')
+        data = node.get('minVal', None)
+        minVal = self.convertFromStr(data, 'str')
+        data = node.get('maxVal', None)
+        maxVal = self.convertFromStr(data, 'str')
+        data = node.get('stepSize', None)
+        stepSize = self.convertFromStr(data, 'str')
+        data = node.get('valueList', None)
+        strvaluelist = self.convertFromStr(data, 'str')
+        data = node.get('widget', None)
+        widget = self.convertFromStr(data, 'str')
+        data = node.get('seq', None)
+        seq = self.convertFromStr(data, 'int')
+        data = node.get('parent', None)
+        parent = self.convertFromStr(data, 'str')
+        
+        obj = DBMashupComponent(id=id,
+                                vtid=vtid,
+                                vttype=vttype,
+                                vtparent_type=vtparent_type,
+                                vtparent_id=vtparent_id,
+                                vtpos=vtpos,
+                                vtmid=vtmid,
+                                pos=pos,
+                                type=type,
+                                val=val,
+                                minVal=minVal,
+                                maxVal=maxVal,
+                                stepSize=stepSize,
+                                strvaluelist=strvaluelist,
+                                widget=widget,
+                                seq=seq,
+                                parent=parent)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, mashup_component, node=None):
+        if node is None:
+            node = ElementTree.Element('component')
+        
+        # set attributes
+        node.set('id',self.convertToStr(mashup_component.db_id, 'long'))
+        node.set('vtid',self.convertToStr(mashup_component.db_vtid, 'long'))
+        node.set('vttype',self.convertToStr(mashup_component.db_vttype, 'str'))
+        node.set('vtparent_type',self.convertToStr(mashup_component.db_vtparent_type, 'str'))
+        node.set('vtparent_id',self.convertToStr(mashup_component.db_vtparent_id, 'long'))
+        node.set('vtpos',self.convertToStr(mashup_component.db_vtpos, 'long'))
+        node.set('vtmid',self.convertToStr(mashup_component.db_vtmid, 'long'))
+        node.set('pos',self.convertToStr(mashup_component.db_pos, 'long'))
+        node.set('type',self.convertToStr(mashup_component.db_type, 'str'))
+        node.set('val',self.convertToStr(mashup_component.db_val, 'str'))
+        node.set('minVal',self.convertToStr(mashup_component.db_minVal, 'str'))
+        node.set('maxVal',self.convertToStr(mashup_component.db_maxVal, 'str'))
+        node.set('stepSize',self.convertToStr(mashup_component.db_stepSize, 'str'))
+        node.set('valueList',self.convertToStr(mashup_component.db_strvaluelist, 'str'))
+        node.set('widget',self.convertToStr(mashup_component.db_widget, 'str'))
+        node.set('seq',self.convertToStr(mashup_component.db_seq, 'int'))
+        node.set('parent',self.convertToStr(mashup_component.db_parent, 'str'))
+        
+        return node
+
+class DBProvEntityXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:entity':
+            return None
+        
+        # read attributes
+        data = node.get('prov:id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        prov_type = None
+        prov_label = None
+        prov_value = None
+        vt_id = None
+        vt_type = None
+        vt_desc = None
+        vt_package = None
+        vt_version = None
+        vt_cache = None
+        vt_location_x = None
+        vt_location_y = None
+        is_part_of = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'prov:type':
+                _data = self.convertFromStr(child.text,'str')
+                prov_type = _data
+            elif child_tag == 'prov:label':
+                _data = self.convertFromStr(child.text,'str')
+                prov_label = _data
+            elif child_tag == 'prov:value':
+                _data = self.convertFromStr(child.text,'str')
+                prov_value = _data
+            elif child_tag == 'vt:id':
+                _data = self.convertFromStr(child.text,'str')
+                vt_id = _data
+            elif child_tag == 'vt:type':
+                _data = self.convertFromStr(child.text,'str')
+                vt_type = _data
+            elif child_tag == 'vt:desc':
+                _data = self.convertFromStr(child.text,'str')
+                vt_desc = _data
+            elif child_tag == 'vt:package':
+                _data = self.convertFromStr(child.text,'str')
+                vt_package = _data
+            elif child_tag == 'vt:version':
+                _data = self.convertFromStr(child.text,'str')
+                vt_version = _data
+            elif child_tag == 'vt:cache':
+                _data = self.convertFromStr(child.text,'str')
+                vt_cache = _data
+            elif child_tag == 'vt:location_x':
+                _data = self.convertFromStr(child.text,'str')
+                vt_location_x = _data
+            elif child_tag == 'vt:location_y':
+                _data = self.convertFromStr(child.text,'str')
+                vt_location_y = _data
+            elif child_tag == 'dcterms:isPartOf':
+                _data = self.getDao('is_part_of').fromXML(child)
+                is_part_of = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvEntity(id=id,
+                           prov_type=prov_type,
+                           prov_label=prov_label,
+                           prov_value=prov_value,
+                           vt_id=vt_id,
+                           vt_type=vt_type,
+                           vt_desc=vt_desc,
+                           vt_package=vt_package,
+                           vt_version=vt_version,
+                           vt_cache=vt_cache,
+                           vt_location_x=vt_location_x,
+                           vt_location_y=vt_location_y,
+                           is_part_of=is_part_of)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_entity, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:entity')
+        
+        # set attributes
+        node.set('prov:id',self.convertToStr(prov_entity.db_id, 'str'))
+        
+        # set elements
+        prov_type = prov_entity.db_prov_type
+        if (prov_type is not None) and (prov_type != ""):
+            childNode = ElementTree.SubElement(node, 'prov:type')
+            childNode.text = self.convertToStr(prov_type, 'str')
+        prov_label = prov_entity.db_prov_label
+        if (prov_label is not None) and (prov_label != ""):
+            childNode = ElementTree.SubElement(node, 'prov:label')
+            childNode.text = self.convertToStr(prov_label, 'str')
+        prov_value = prov_entity.db_prov_value
+        if (prov_value is not None) and (prov_value != ""):
+            childNode = ElementTree.SubElement(node, 'prov:value')
+            childNode.text = self.convertToStr(prov_value, 'str')
+        vt_id = prov_entity.db_vt_id
+        if (vt_id is not None) and (vt_id != ""):
+            childNode = ElementTree.SubElement(node, 'vt:id')
+            childNode.text = self.convertToStr(vt_id, 'str')
+        vt_type = prov_entity.db_vt_type
+        if (vt_type is not None) and (vt_type != ""):
+            childNode = ElementTree.SubElement(node, 'vt:type')
+            childNode.text = self.convertToStr(vt_type, 'str')
+        vt_desc = prov_entity.db_vt_desc
+        if (vt_desc is not None) and (vt_desc != ""):
+            childNode = ElementTree.SubElement(node, 'vt:desc')
+            childNode.text = self.convertToStr(vt_desc, 'str')
+        vt_package = prov_entity.db_vt_package
+        if (vt_package is not None) and (vt_package != ""):
+            childNode = ElementTree.SubElement(node, 'vt:package')
+            childNode.text = self.convertToStr(vt_package, 'str')
+        vt_version = prov_entity.db_vt_version
+        if (vt_version is not None) and (vt_version != ""):
+            childNode = ElementTree.SubElement(node, 'vt:version')
+            childNode.text = self.convertToStr(vt_version, 'str')
+        vt_cache = prov_entity.db_vt_cache
+        if (vt_cache is not None) and (vt_cache != ""):
+            childNode = ElementTree.SubElement(node, 'vt:cache')
+            childNode.text = self.convertToStr(vt_cache, 'str')
+        vt_location_x = prov_entity.db_vt_location_x
+        if (vt_location_x is not None) and (vt_location_x != ""):
+            childNode = ElementTree.SubElement(node, 'vt:location_x')
+            childNode.text = self.convertToStr(vt_location_x, 'str')
+        vt_location_y = prov_entity.db_vt_location_y
+        if (vt_location_y is not None) and (vt_location_y != ""):
+            childNode = ElementTree.SubElement(node, 'vt:location_y')
+            childNode.text = self.convertToStr(vt_location_y, 'str')
+        is_part_of = prov_entity.db_is_part_of
+        if is_part_of is not None:
+            if (is_part_of is not None) and (is_part_of != ""):
+                childNode = ElementTree.SubElement(node, 'dcterms:isPartOf')
+                self.getDao('is_part_of').toXML(is_part_of, childNode)
+        
+        return node
+
+class DBAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'annotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        
+        obj = DBAnnotation(id=id,
+                           key=key,
+                           value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, annotation, node=None):
+        if node is None:
+            node = ElementTree.Element('annotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(annotation.db_id, 'long'))
+        node.set('key',self.convertToStr(annotation.db_key, 'str'))
+        node.set('value',self.convertToStr(annotation.db_value, 'str'))
+        
+        return node
+
+class DBChangeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'change':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('oldObjId', None)
+        oldObjId = self.convertFromStr(data, 'long')
+        data = node.get('newObjId', None)
+        newObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        data = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'module':
+                _data = self.getDao('module').fromXML(child)
+                data = _data
+            elif child_tag == 'location':
+                _data = self.getDao('location').fromXML(child)
+                data = _data
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                data = _data
+            elif child_tag == 'function':
+                _data = self.getDao('function').fromXML(child)
+                data = _data
+            elif child_tag == 'connection':
+                _data = self.getDao('connection').fromXML(child)
+                data = _data
+            elif child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                data = _data
+            elif child_tag == 'parameter':
+                _data = self.getDao('parameter').fromXML(child)
+                data = _data
+            elif child_tag == 'portSpec':
+                _data = self.getDao('portSpec').fromXML(child)
+                data = _data
+            elif child_tag == 'abstraction':
+                _data = self.getDao('abstraction').fromXML(child)
+                data = _data
+            elif child_tag == 'group':
+                _data = self.getDao('group').fromXML(child)
+                data = _data
+            elif child_tag == 'other':
+                _data = self.getDao('other').fromXML(child)
+                data = _data
+            elif child_tag == 'plugin_data':
+                _data = self.getDao('plugin_data').fromXML(child)
+                data = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBChange(data=data,
+                       id=id,
+                       what=what,
+                       oldObjId=oldObjId,
+                       newObjId=newObjId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, change, node=None):
+        if node is None:
+            node = ElementTree.Element('change')
+        
+        # set attributes
+        node.set('id',self.convertToStr(change.db_id, 'long'))
+        node.set('what',self.convertToStr(change.db_what, 'str'))
+        node.set('oldObjId',self.convertToStr(change.db_oldObjId, 'long'))
+        node.set('newObjId',self.convertToStr(change.db_newObjId, 'long'))
+        node.set('parentObjId',self.convertToStr(change.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(change.db_parentObjType, 'str'))
+        
+        # set elements
+        data = change.db_data
+        if data is not None:
+            if data.vtType == 'module':
+                childNode = ElementTree.SubElement(node, 'module')
+                self.getDao('module').toXML(data, childNode)
+            elif data.vtType == 'location':
+                childNode = ElementTree.SubElement(node, 'location')
+                self.getDao('location').toXML(data, childNode)
+            elif data.vtType == 'annotation':
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(data, childNode)
+            elif data.vtType == 'function':
+                childNode = ElementTree.SubElement(node, 'function')
+                self.getDao('function').toXML(data, childNode)
+            elif data.vtType == 'connection':
+                childNode = ElementTree.SubElement(node, 'connection')
+                self.getDao('connection').toXML(data, childNode)
+            elif data.vtType == 'port':
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(data, childNode)
+            elif data.vtType == 'parameter':
+                childNode = ElementTree.SubElement(node, 'parameter')
+                self.getDao('parameter').toXML(data, childNode)
+            elif data.vtType == 'portSpec':
+                childNode = ElementTree.SubElement(node, 'portSpec')
+                self.getDao('portSpec').toXML(data, childNode)
+            elif data.vtType == 'abstraction':
+                childNode = ElementTree.SubElement(node, 'abstraction')
+                self.getDao('abstraction').toXML(data, childNode)
+            elif data.vtType == 'group':
+                childNode = ElementTree.SubElement(node, 'group')
+                self.getDao('group').toXML(data, childNode)
+            elif data.vtType == 'other':
+                childNode = ElementTree.SubElement(node, 'other')
+                self.getDao('other').toXML(data, childNode)
+            elif data.vtType == 'plugin_data':
+                childNode = ElementTree.SubElement(node, 'plugin_data')
+                self.getDao('plugin_data').toXML(data, childNode)
+        
+        return node
+
+class DBOpmWasDerivedFromXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasDerivedFrom':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_artifact_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_artifact_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasDerivedFrom(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_derived_from, node=None):
+        if node is None:
+            node = ElementTree.Element('wasDerivedFrom')
+        
+        # set elements
+        effect = opm_was_derived_from.db_effect
+        if effect is not None:
+            if (effect is not None) and (effect != ""):
+                childNode = ElementTree.SubElement(node, 'effect')
+                self.getDao('opm_artifact_id_effect').toXML(effect, childNode)
+        role = opm_was_derived_from.db_role
+        if role is not None:
+            if (role is not None) and (role != ""):
+                childNode = ElementTree.SubElement(node, 'role')
+                self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_derived_from.db_cause
+        if cause is not None:
+            if (cause is not None) and (cause != ""):
+                childNode = ElementTree.SubElement(node, 'cause')
+                self.getDao('opm_artifact_id_cause').toXML(cause, childNode)
+        accounts = opm_was_derived_from.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_derived_from.db_opm_times
+        for opm_time in opm_times:
+            if (opm_times is not None) and (opm_times != ""):
+                childNode = ElementTree.SubElement(node, 'time')
+                self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBOpmArtifactsXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'artifacts':
+            return None
+        
+        artifacts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'artifact':
+                _data = self.getDao('opm_artifact').fromXML(child)
+                artifacts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmArtifacts(artifacts=artifacts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_artifacts, node=None):
+        if node is None:
+            node = ElementTree.Element('artifacts')
+        
+        # set elements
+        artifacts = opm_artifacts.db_artifacts
+        for artifact in artifacts:
+            if (artifacts is not None) and (artifacts != ""):
+                childNode = ElementTree.SubElement(node, 'artifact')
+                self.getDao('opm_artifact').toXML(artifact, childNode)
+        
+        return node
+
+class DBOpmWasControlledByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasControlledBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        starts = []
+        ends = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'agent':
+                _data = self.getDao('opm_agent_id').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                starts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                ends.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasControlledBy(effect=effect,
+                                   role=role,
+                                   cause=cause,
+                                   accounts=accounts,
+                                   starts=starts,
+                                   ends=ends)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_controlled_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasControlledBy')
+        
+        # set elements
+        effect = opm_was_controlled_by.db_effect
+        if effect is not None:
+            if (effect is not None) and (effect != ""):
+                childNode = ElementTree.SubElement(node, 'effect')
+                self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_controlled_by.db_role
+        if role is not None:
+            if (role is not None) and (role != ""):
+                childNode = ElementTree.SubElement(node, 'role')
+                self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_controlled_by.db_cause
+        if cause is not None:
+            if (cause is not None) and (cause != ""):
+                childNode = ElementTree.SubElement(node, 'agent')
+                self.getDao('opm_agent_id').toXML(cause, childNode)
+        accounts = opm_was_controlled_by.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        starts = opm_was_controlled_by.db_starts
+        for start in starts:
+            if (starts is not None) and (starts != ""):
+                childNode = ElementTree.SubElement(node, 'time')
+                self.getDao('opm_time').toXML(start, childNode)
+        ends = opm_was_controlled_by.db_ends
+        for end in ends:
+            if (ends is not None) and (ends != ""):
+                childNode = ElementTree.SubElement(node, 'time')
+                self.getDao('opm_time').toXML(end, childNode)
+        
+        return node
+
+class DBOpmAgentIdXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmAgentId(id=id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent_id, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent_id.db_id, 'str'))
+        
+        return node
+
+class DBGroupExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'groupExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('groupName', None)
+        group_name = self.convertFromStr(data, 'str')
+        data = node.get('groupType', None)
+        group_type = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBGroupExec(item_execs=item_execs,
+                          id=id,
+                          ts_start=ts_start,
+                          ts_end=ts_end,
+                          cached=cached,
+                          module_id=module_id,
+                          group_name=group_name,
+                          group_type=group_type,
+                          completed=completed,
+                          error=error,
+                          machine_id=machine_id,
+                          annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, group_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('groupExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(group_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(group_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(group_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(group_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(group_exec.db_module_id, 'long'))
+        node.set('groupName',self.convertToStr(group_exec.db_group_name, 'str'))
+        node.set('groupType',self.convertToStr(group_exec.db_group_type, 'str'))
+        node.set('completed',self.convertToStr(group_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(group_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(group_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = group_exec.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        item_execs = group_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBOpmTimeXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'time':
+            return None
+        
+        # read attributes
+        data = node.get('noLaterThan', None)
+        no_later_than = self.convertFromStr(data, 'datetime')
+        data = node.get('noEarlierThan', None)
+        no_earlier_than = self.convertFromStr(data, 'datetime')
+        data = node.get('clockId', None)
+        clock_id = self.convertFromStr(data, 'str')
+        
+        obj = DBOpmTime(no_later_than=no_later_than,
+                        no_earlier_than=no_earlier_than,
+                        clock_id=clock_id)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_time, node=None):
+        if node is None:
+            node = ElementTree.Element('time')
+        
+        # set attributes
+        node.set('noLaterThan',self.convertToStr(opm_time.db_no_later_than, 'datetime'))
+        node.set('noEarlierThan',self.convertToStr(opm_time.db_no_earlier_than, 'datetime'))
+        node.set('clockId',self.convertToStr(opm_time.db_clock_id, 'str'))
+        
+        return node
+
+class DBPackageXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'package':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('identifier', None)
+        identifier = self.convertFromStr(data, 'str')
+        data = node.get('codepath', None)
+        codepath = self.convertFromStr(data, 'str')
+        data = node.get('loadConfiguration', None)
+        load_configuration = self.convertFromStr(data, 'int')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('description', None)
+        description = self.convertFromStr(data, 'str')
+        
+        module_descriptors = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleDescriptor':
+                _data = self.getDao('module_descriptor').fromXML(child)
+                module_descriptors.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPackage(id=id,
+                        name=name,
+                        identifier=identifier,
+                        codepath=codepath,
+                        load_configuration=load_configuration,
+                        version=version,
+                        description=description,
+                        module_descriptors=module_descriptors)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, package, node=None):
+        if node is None:
+            node = ElementTree.Element('package')
+        
+        # set attributes
+        node.set('id',self.convertToStr(package.db_id, 'long'))
+        node.set('name',self.convertToStr(package.db_name, 'str'))
+        node.set('identifier',self.convertToStr(package.db_identifier, 'str'))
+        node.set('codepath',self.convertToStr(package.db_codepath, 'str'))
+        node.set('loadConfiguration',self.convertToStr(package.db_load_configuration, 'int'))
+        node.set('version',self.convertToStr(package.db_version, 'str'))
+        node.set('description',self.convertToStr(package.db_description, 'str'))
+        
+        # set elements
+        module_descriptors = package.db_module_descriptors
+        for module_descriptor in module_descriptors:
+            if (module_descriptors is not None) and (module_descriptors != ""):
+                childNode = ElementTree.SubElement(node, 'moduleDescriptor')
+                self.getDao('module_descriptor').toXML(module_descriptor, childNode)
+        
+        return node
+
+class DBWorkflowExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'workflowExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('ip', None)
+        ip = self.convertFromStr(data, 'str')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('vtVersion', None)
+        vt_version = self.convertFromStr(data, 'str')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('parentId', None)
+        parent_id = self.convertFromStr(data, 'long')
+        data = node.get('parentType', None)
+        parent_type = self.convertFromStr(data, 'str')
+        data = node.get('parentVersion', None)
+        parent_version = self.convertFromStr(data, 'long')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        annotations = []
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBWorkflowExec(item_execs=item_execs,
+                             id=id,
+                             user=user,
+                             ip=ip,
+                             session=session,
+                             vt_version=vt_version,
+                             ts_start=ts_start,
+                             ts_end=ts_end,
+                             parent_id=parent_id,
+                             parent_type=parent_type,
+                             parent_version=parent_version,
+                             completed=completed,
+                             name=name,
+                             annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, workflow_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('workflowExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(workflow_exec.db_id, 'long'))
+        node.set('user',self.convertToStr(workflow_exec.db_user, 'str'))
+        node.set('ip',self.convertToStr(workflow_exec.db_ip, 'str'))
+        node.set('session',self.convertToStr(workflow_exec.db_session, 'long'))
+        node.set('vtVersion',self.convertToStr(workflow_exec.db_vt_version, 'str'))
+        node.set('tsStart',self.convertToStr(workflow_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(workflow_exec.db_ts_end, 'datetime'))
+        node.set('parentId',self.convertToStr(workflow_exec.db_parent_id, 'long'))
+        node.set('parentType',self.convertToStr(workflow_exec.db_parent_type, 'str'))
+        node.set('parentVersion',self.convertToStr(workflow_exec.db_parent_version, 'long'))
+        node.set('completed',self.convertToStr(workflow_exec.db_completed, 'int'))
+        node.set('name',self.convertToStr(workflow_exec.db_name, 'str'))
+        
+        # set elements
+        annotations = workflow_exec.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        item_execs = workflow_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBParameterExplorationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'parameterExploration':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('actionId', None)
+        action_id = self.convertFromStr(data, 'long')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        data = node.get('dims', None)
+        dims = self.convertFromStr(data, 'str')
+        data = node.get('layout', None)
+        layout = self.convertFromStr(data, 'str')
+        
+        functions = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'peFunction':
+                _data = self.getDao('pe_function').fromXML(child)
+                functions.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBParameterExploration(id=id,
+                                     action_id=action_id,
+                                     name=name,
+                                     user=user,
+                                     dims=dims,
+                                     layout=layout,
+                                     functions=functions)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, parameter_exploration, node=None):
+        if node is None:
+            node = ElementTree.Element('parameterExploration')
+        
+        # set attributes
+        node.set('id',self.convertToStr(parameter_exploration.db_id, 'long'))
+        node.set('actionId',self.convertToStr(parameter_exploration.db_action_id, 'long'))
+        node.set('name',self.convertToStr(parameter_exploration.db_name, 'str'))
+        node.set('user',self.convertToStr(parameter_exploration.db_user, 'str'))
+        node.set('dims',self.convertToStr(parameter_exploration.db_dims, 'str'))
+        node.set('layout',self.convertToStr(parameter_exploration.db_layout, 'str'))
+        
+        # set elements
+        functions = parameter_exploration.db_functions
+        for function in functions:
+            if (functions is not None) and (functions != ""):
+                childNode = ElementTree.SubElement(node, 'peFunction')
+                self.getDao('pe_function').toXML(function, childNode)
+        
+        return node
+
+class DBLoopExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'loopExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('iteration', None)
+        iteration = self.convertFromStr(data, 'int')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        
+        item_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                item_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBLoopExec(item_execs=item_execs,
+                         id=id,
+                         ts_start=ts_start,
+                         ts_end=ts_end,
+                         iteration=iteration,
+                         completed=completed,
+                         error=error)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, loop_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('loopExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(loop_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(loop_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(loop_exec.db_ts_end, 'datetime'))
+        node.set('iteration',self.convertToStr(loop_exec.db_iteration, 'int'))
+        node.set('completed',self.convertToStr(loop_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(loop_exec.db_error, 'str'))
+        
+        # set elements
+        item_execs = loop_exec.db_item_execs
+        for item_exec in item_execs:
+            if item_exec.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(item_exec, childNode)
+            elif item_exec.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(item_exec, childNode)
+        
+        return node
+
+class DBOpmWasTriggeredByXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'wasTriggeredBy':
+            return None
+        
+        effect = None
+        role = None
+        cause = None
+        accounts = []
+        opm_times = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'effect':
+                _data = self.getDao('opm_process_id_effect').fromXML(child)
+                effect = _data
+            elif child_tag == 'role':
+                _data = self.getDao('opm_role').fromXML(child)
+                role = _data
+            elif child_tag == 'cause':
+                _data = self.getDao('opm_process_id_cause').fromXML(child)
+                cause = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child_tag == 'time':
+                _data = self.getDao('opm_time').fromXML(child)
+                opm_times.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmWasTriggeredBy(effect=effect,
+                                  role=role,
+                                  cause=cause,
+                                  accounts=accounts,
+                                  opm_times=opm_times)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_was_triggered_by, node=None):
+        if node is None:
+            node = ElementTree.Element('wasTriggeredBy')
+        
+        # set elements
+        effect = opm_was_triggered_by.db_effect
+        if effect is not None:
+            if (effect is not None) and (effect != ""):
+                childNode = ElementTree.SubElement(node, 'effect')
+                self.getDao('opm_process_id_effect').toXML(effect, childNode)
+        role = opm_was_triggered_by.db_role
+        if role is not None:
+            if (role is not None) and (role != ""):
+                childNode = ElementTree.SubElement(node, 'role')
+                self.getDao('opm_role').toXML(role, childNode)
+        cause = opm_was_triggered_by.db_cause
+        if cause is not None:
+            if (cause is not None) and (cause != ""):
+                childNode = ElementTree.SubElement(node, 'cause')
+                self.getDao('opm_process_id_cause').toXML(cause, childNode)
+        accounts = opm_was_triggered_by.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        opm_times = opm_was_triggered_by.db_opm_times
+        for opm_time in opm_times:
+            if (opm_times is not None) and (opm_times != ""):
+                childNode = ElementTree.SubElement(node, 'time')
+                self.getDao('opm_time').toXML(opm_time, childNode)
+        
+        return node
+
+class DBMashupActionAnnotationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'actionAnnotation':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('key', None)
+        key = self.convertFromStr(data, 'str')
+        data = node.get('value', None)
+        value = self.convertFromStr(data, 'str')
+        data = node.get('action_id', None)
+        action_id = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        
+        obj = DBMashupActionAnnotation(id=id,
+                                       key=key,
+                                       value=value,
+                                       action_id=action_id,
+                                       date=date,
+                                       user=user)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, mashup_actionAnnotation, node=None):
+        if node is None:
+            node = ElementTree.Element('actionAnnotation')
+        
+        # set attributes
+        node.set('id',self.convertToStr(mashup_actionAnnotation.db_id, 'long'))
+        node.set('key',self.convertToStr(mashup_actionAnnotation.db_key, 'str'))
+        node.set('value',self.convertToStr(mashup_actionAnnotation.db_value, 'str'))
+        node.set('action_id',self.convertToStr(mashup_actionAnnotation.db_action_id, 'long'))
+        node.set('date',self.convertToStr(mashup_actionAnnotation.db_date, 'datetime'))
+        node.set('user',self.convertToStr(mashup_actionAnnotation.db_user, 'str'))
+        
+        return node
+
+class DBConnectionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'connection':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        
+        ports = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'port':
+                _data = self.getDao('port').fromXML(child)
+                ports.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBConnection(id=id,
+                           ports=ports)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, connection, node=None):
+        if node is None:
+            node = ElementTree.Element('connection')
+        
+        # set attributes
+        node.set('id',self.convertToStr(connection.db_id, 'long'))
+        
+        # set elements
+        ports = connection.db_ports
+        for port in ports:
+            if (ports is not None) and (ports != ""):
+                childNode = ElementTree.SubElement(node, 'port')
+                self.getDao('port').toXML(port, childNode)
+        
+        return node
+
+class DBOpmProcessXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'process':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.getDao('opm_process_value').fromXML(child)
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcess(id=id,
+                           value=value,
+                           accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process, node=None):
+        if node is None:
+            node = ElementTree.Element('process')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_process.db_id, 'str'))
+        
+        # set elements
+        value = opm_process.db_value
+        if value is not None:
+            if (value is not None) and (value != ""):
+                childNode = ElementTree.SubElement(node, 'value')
+                self.getDao('opm_process_value').toXML(value, childNode)
+        accounts = opm_process.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBIsPartOfXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'dcterms:isPartOf':
+            return None
+        
+        # read attributes
+        data = node.get('prov:ref', None)
+        prov_ref = self.convertFromStr(data, 'str')
+        
+        obj = DBIsPartOf(prov_ref=prov_ref)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, is_part_of, node=None):
+        if node is None:
+            node = ElementTree.Element('dcterms:isPartOf')
+        
+        # set attributes
+        node.set('prov:ref',self.convertToStr(is_part_of.db_prov_ref, 'str'))
+        
+        return node
+
+class DBPEFunctionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'peFunction':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('port_name', None)
+        port_name = self.convertFromStr(data, 'str')
+        data = node.get('is_alias', None)
+        is_alias = self.convertFromStr(data, 'long')
+        
+        parameters = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'peParameter':
+                _data = self.getDao('pe_parameter').fromXML(child)
+                parameters.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBPEFunction(id=id,
+                           module_id=module_id,
+                           port_name=port_name,
+                           is_alias=is_alias,
+                           parameters=parameters)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, pe_function, node=None):
+        if node is None:
+            node = ElementTree.Element('peFunction')
+        
+        # set attributes
+        node.set('id',self.convertToStr(pe_function.db_id, 'long'))
+        node.set('moduleId',self.convertToStr(pe_function.db_module_id, 'long'))
+        node.set('port_name',self.convertToStr(pe_function.db_port_name, 'str'))
+        node.set('is_alias',self.convertToStr(pe_function.db_is_alias, 'long'))
+        
+        # set elements
+        parameters = pe_function.db_parameters
+        for parameter in parameters:
+            if (parameters is not None) and (parameters != ""):
+                childNode = ElementTree.SubElement(node, 'peParameter')
+                self.getDao('pe_parameter').toXML(parameter, childNode)
+        
+        return node
+
+class DBOpmProcessValueXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'value':
+            return None
+        
+        value = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'moduleExec':
+                _data = self.getDao('module_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'groupExec':
+                _data = self.getDao('group_exec').fromXML(child)
+                value = _data
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                value = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmProcessValue(value=value)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_process_value, node=None):
+        if node is None:
+            node = ElementTree.Element('value')
+        
+        # set elements
+        value = opm_process_value.db_value
+        if value is not None:
+            if value.vtType == 'module_exec':
+                childNode = ElementTree.SubElement(node, 'moduleExec')
+                self.getDao('module_exec').toXML(value, childNode)
+            elif value.vtType == 'group_exec':
+                childNode = ElementTree.SubElement(node, 'groupExec')
+                self.getDao('group_exec').toXML(value, childNode)
+            elif value.vtType == 'loop_exec':
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(value, childNode)
+        
+        return node
+
+class DBActionXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'action':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('prevId', None)
+        prevId = self.convertFromStr(data, 'long')
+        data = node.get('date', None)
+        date = self.convertFromStr(data, 'datetime')
+        data = node.get('session', None)
+        session = self.convertFromStr(data, 'long')
+        data = node.get('user', None)
+        user = self.convertFromStr(data, 'str')
+        
+        annotations = []
+        operations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'add':
+                _data = self.getDao('add').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'delete':
+                _data = self.getDao('delete').fromXML(child)
+                operations.append(_data)
+            elif child_tag == 'change':
+                _data = self.getDao('change').fromXML(child)
+                operations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBAction(operations=operations,
+                       id=id,
+                       prevId=prevId,
+                       date=date,
+                       session=session,
+                       user=user,
+                       annotations=annotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, action, node=None):
+        if node is None:
+            node = ElementTree.Element('action')
+        
+        # set attributes
+        node.set('id',self.convertToStr(action.db_id, 'long'))
+        node.set('prevId',self.convertToStr(action.db_prevId, 'long'))
+        node.set('date',self.convertToStr(action.db_date, 'datetime'))
+        node.set('session',self.convertToStr(action.db_session, 'long'))
+        node.set('user',self.convertToStr(action.db_user, 'str'))
+        
+        # set elements
+        annotations = action.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        operations = action.db_operations
+        for operation in operations:
+            if operation.vtType == 'add':
+                childNode = ElementTree.SubElement(node, 'add')
+                self.getDao('add').toXML(operation, childNode)
+            elif operation.vtType == 'delete':
+                childNode = ElementTree.SubElement(node, 'delete')
+                self.getDao('delete').toXML(operation, childNode)
+            elif operation.vtType == 'change':
+                childNode = ElementTree.SubElement(node, 'change')
+                self.getDao('change').toXML(operation, childNode)
+        
+        return node
+
+class DBOpmAgentXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'agent':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'str')
+        
+        value = None
+        accounts = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'value':
+                _data = self.convertFromStr(child.text,'str')
+                value = _data
+            elif child_tag == 'account':
+                _data = self.getDao('opm_account_id').fromXML(child)
+                accounts.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBOpmAgent(id=id,
+                         value=value,
+                         accounts=accounts)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, opm_agent, node=None):
+        if node is None:
+            node = ElementTree.Element('agent')
+        
+        # set attributes
+        node.set('id',self.convertToStr(opm_agent.db_id, 'str'))
+        
+        # set elements
+        value = opm_agent.db_value
+        if (value is not None) and (value != ""):
+            childNode = ElementTree.SubElement(node, 'value')
+            childNode.text = self.convertToStr(value, 'str')
+        accounts = opm_agent.db_accounts
+        for account in accounts:
+            if (accounts is not None) and (accounts != ""):
+                childNode = ElementTree.SubElement(node, 'account')
+                self.getDao('opm_account_id').toXML(account, childNode)
+        
+        return node
+
+class DBDeleteXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'delete':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('what', None)
+        what = self.convertFromStr(data, 'str')
+        data = node.get('objectId', None)
+        objectId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjId', None)
+        parentObjId = self.convertFromStr(data, 'long')
+        data = node.get('parentObjType', None)
+        parentObjType = self.convertFromStr(data, 'str')
+        
+        obj = DBDelete(id=id,
+                       what=what,
+                       objectId=objectId,
+                       parentObjId=parentObjId,
+                       parentObjType=parentObjType)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, delete, node=None):
+        if node is None:
+            node = ElementTree.Element('delete')
+        
+        # set attributes
+        node.set('id',self.convertToStr(delete.db_id, 'long'))
+        node.set('what',self.convertToStr(delete.db_what, 'str'))
+        node.set('objectId',self.convertToStr(delete.db_objectId, 'long'))
+        node.set('parentObjId',self.convertToStr(delete.db_parentObjId, 'long'))
+        node.set('parentObjType',self.convertToStr(delete.db_parentObjType, 'str'))
+        
+        return node
+
+class DBProvAssociationXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'prov:wasAssociatedWith':
+            return None
+        
+        prov_activity = None
+        prov_agent = None
+        prov_plan = None
+        prov_role = None
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'prov:activity':
+                _data = self.getDao('ref_prov_activity').fromXML(child)
+                prov_activity = _data
+            elif child_tag == 'prov:agent':
+                _data = self.getDao('ref_prov_agent').fromXML(child)
+                prov_agent = _data
+            elif child_tag == 'prov:plan':
+                _data = self.getDao('ref_prov_plan').fromXML(child)
+                prov_plan = _data
+            elif child_tag == 'prov:role':
+                _data = self.convertFromStr(child.text,'str')
+                prov_role = _data
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBProvAssociation(prov_activity=prov_activity,
+                                prov_agent=prov_agent,
+                                prov_plan=prov_plan,
+                                prov_role=prov_role)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, prov_association, node=None):
+        if node is None:
+            node = ElementTree.Element('prov:wasAssociatedWith')
+        
+        # set elements
+        prov_activity = prov_association.db_prov_activity
+        if prov_activity is not None:
+            if (prov_activity is not None) and (prov_activity != ""):
+                childNode = ElementTree.SubElement(node, 'prov:activity')
+                self.getDao('ref_prov_activity').toXML(prov_activity, childNode)
+        prov_agent = prov_association.db_prov_agent
+        if prov_agent is not None:
+            if (prov_agent is not None) and (prov_agent != ""):
+                childNode = ElementTree.SubElement(node, 'prov:agent')
+                self.getDao('ref_prov_agent').toXML(prov_agent, childNode)
+        prov_plan = prov_association.db_prov_plan
+        if prov_plan is not None:
+            if (prov_plan is not None) and (prov_plan != ""):
+                childNode = ElementTree.SubElement(node, 'prov:plan')
+                self.getDao('ref_prov_plan').toXML(prov_plan, childNode)
+        prov_role = prov_association.db_prov_role
+        if (prov_role is not None) and (prov_role != ""):
+            childNode = ElementTree.SubElement(node, 'prov:role')
+            childNode.text = self.convertToStr(prov_role, 'str')
+        
+        return node
+
+class DBVistrailXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'vistrail':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('version', None)
+        version = self.convertFromStr(data, 'str')
+        data = node.get('name', None)
+        name = self.convertFromStr(data, 'str')
+        
+        actions = []
+        tags = []
+        annotations = []
+        vistrailVariables = []
+        parameter_explorations = []
+        actionAnnotations = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'action':
+                _data = self.getDao('action').fromXML(child)
+                actions.append(_data)
+            elif child_tag == 'tag':
+                _data = self.getDao('tag').fromXML(child)
+                tags.append(_data)
+            elif child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'vistrailVariable':
+                _data = self.getDao('vistrailVariable').fromXML(child)
+                vistrailVariables.append(_data)
+            elif child_tag == 'parameterExploration':
+                _data = self.getDao('parameter_exploration').fromXML(child)
+                parameter_explorations.append(_data)
+            elif child_tag == 'actionAnnotation':
+                _data = self.getDao('actionAnnotation').fromXML(child)
+                actionAnnotations.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBVistrail(id=id,
+                         version=version,
+                         name=name,
+                         actions=actions,
+                         tags=tags,
+                         annotations=annotations,
+                         vistrailVariables=vistrailVariables,
+                         parameter_explorations=parameter_explorations,
+                         actionAnnotations=actionAnnotations)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, vistrail, node=None):
+        if node is None:
+            node = ElementTree.Element('vistrail')
+        
+        # set attributes
+        node.set('id',self.convertToStr(vistrail.db_id, 'long'))
+        node.set('version',self.convertToStr(vistrail.db_version, 'str'))
+        node.set('name',self.convertToStr(vistrail.db_name, 'str'))
+        
+        # set elements
+        actions = vistrail.db_actions
+        for action in actions:
+            if (actions is not None) and (actions != ""):
+                childNode = ElementTree.SubElement(node, 'action')
+                self.getDao('action').toXML(action, childNode)
+        tags = vistrail.db_tags
+        for tag in tags:
+            if (tags is not None) and (tags != ""):
+                childNode = ElementTree.SubElement(node, 'tag')
+                self.getDao('tag').toXML(tag, childNode)
+        annotations = vistrail.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        vistrailVariables = vistrail.db_vistrailVariables
+        for vistrailVariable in vistrailVariables:
+            if (vistrailVariables is not None) and (vistrailVariables != ""):
+                childNode = ElementTree.SubElement(node, 'vistrailVariable')
+                self.getDao('vistrailVariable').toXML(vistrailVariable, childNode)
+        parameter_explorations = vistrail.db_parameter_explorations
+        for parameter_exploration in parameter_explorations:
+            if (parameter_explorations is not None) and (parameter_explorations != ""):
+                childNode = ElementTree.SubElement(node, 'parameterExploration')
+                self.getDao('parameter_exploration').toXML(parameter_exploration, childNode)
+        actionAnnotations = vistrail.db_actionAnnotations
+        for actionAnnotation in actionAnnotations:
+            if (actionAnnotations is not None) and (actionAnnotations != ""):
+                childNode = ElementTree.SubElement(node, 'actionAnnotation')
+                self.getDao('actionAnnotation').toXML(actionAnnotation, childNode)
+        
+        return node
+
+class DBModuleExecXMLDAOBase(XMLDAO):
+
+    def __init__(self, daoList):
+        self.daoList = daoList
+
+    def getDao(self, dao):
+        return self.daoList[dao]
+
+    def fromXML(self, node):
+        if node.tag[0] == "{":
+            node_tag = node.tag.split("}")[1]
+        else:
+            node_tag = node.tag
+        if node_tag != 'moduleExec':
+            return None
+        
+        # read attributes
+        data = node.get('id', None)
+        id = self.convertFromStr(data, 'long')
+        data = node.get('tsStart', None)
+        ts_start = self.convertFromStr(data, 'datetime')
+        data = node.get('tsEnd', None)
+        ts_end = self.convertFromStr(data, 'datetime')
+        data = node.get('cached', None)
+        cached = self.convertFromStr(data, 'int')
+        data = node.get('moduleId', None)
+        module_id = self.convertFromStr(data, 'long')
+        data = node.get('moduleName', None)
+        module_name = self.convertFromStr(data, 'str')
+        data = node.get('completed', None)
+        completed = self.convertFromStr(data, 'int')
+        data = node.get('error', None)
+        error = self.convertFromStr(data, 'str')
+        data = node.get('machine_id', None)
+        machine_id = self.convertFromStr(data, 'long')
+        
+        annotations = []
+        loop_execs = []
+        
+        # read children
+        for child in node.getchildren():
+            if child.tag[0] == "{":
+                child_tag = child.tag.split("}")[1]
+            else:
+                child_tag = child.tag
+            if child_tag == 'annotation':
+                _data = self.getDao('annotation').fromXML(child)
+                annotations.append(_data)
+            elif child_tag == 'loopExec':
+                _data = self.getDao('loop_exec').fromXML(child)
+                loop_execs.append(_data)
+            elif child.text is None or child.text.strip() == '':
+                pass
+            else:
+                print '*** ERROR *** tag = %s' % child.tag
+        
+        obj = DBModuleExec(id=id,
+                           ts_start=ts_start,
+                           ts_end=ts_end,
+                           cached=cached,
+                           module_id=module_id,
+                           module_name=module_name,
+                           completed=completed,
+                           error=error,
+                           machine_id=machine_id,
+                           annotations=annotations,
+                           loop_execs=loop_execs)
+        obj.is_dirty = False
+        return obj
+    
+    def toXML(self, module_exec, node=None):
+        if node is None:
+            node = ElementTree.Element('moduleExec')
+        
+        # set attributes
+        node.set('id',self.convertToStr(module_exec.db_id, 'long'))
+        node.set('tsStart',self.convertToStr(module_exec.db_ts_start, 'datetime'))
+        node.set('tsEnd',self.convertToStr(module_exec.db_ts_end, 'datetime'))
+        node.set('cached',self.convertToStr(module_exec.db_cached, 'int'))
+        node.set('moduleId',self.convertToStr(module_exec.db_module_id, 'long'))
+        node.set('moduleName',self.convertToStr(module_exec.db_module_name, 'str'))
+        node.set('completed',self.convertToStr(module_exec.db_completed, 'int'))
+        node.set('error',self.convertToStr(module_exec.db_error, 'str'))
+        node.set('machine_id',self.convertToStr(module_exec.db_machine_id, 'long'))
+        
+        # set elements
+        annotations = module_exec.db_annotations
+        for annotation in annotations:
+            if (annotations is not None) and (annotations != ""):
+                childNode = ElementTree.SubElement(node, 'annotation')
+                self.getDao('annotation').toXML(annotation, childNode)
+        loop_execs = module_exec.db_loop_execs
+        for loop_exec in loop_execs:
+            if (loop_execs is not None) and (loop_execs != ""):
+                childNode = ElementTree.SubElement(node, 'loopExec')
+                self.getDao('loop_exec').toXML(loop_exec, childNode)
+        
+        return node
+
+"""generated automatically by auto_dao.py"""
+
+class XMLDAOListBase(dict):
+
+    def __init__(self, daos=None):
+        if daos is not None:
+            dict.update(self, daos)
+
+        if 'opm_process_id_effect' not in self:
+            self['opm_process_id_effect'] = DBOpmProcessIdEffectXMLDAOBase(self)
+        if 'vistrailVariable' not in self:
+            self['vistrailVariable'] = DBVistrailVariableXMLDAOBase(self)
+        if 'prov_agent' not in self:
+            self['prov_agent'] = DBProvAgentXMLDAOBase(self)
+        if 'opm_was_generated_by' not in self:
+            self['opm_was_generated_by'] = DBOpmWasGeneratedByXMLDAOBase(self)
+        if 'opm_accounts' not in self:
+            self['opm_accounts'] = DBOpmAccountsXMLDAOBase(self)
+        if 'ref_prov_agent' not in self:
+            self['ref_prov_agent'] = DBRefProvAgentXMLDAOBase(self)
+        if 'portSpec' not in self:
+            self['portSpec'] = DBPortSpecXMLDAOBase(self)
+        if 'module' not in self:
+            self['module'] = DBModuleXMLDAOBase(self)
+        if 'module_descriptor' not in self:
+            self['module_descriptor'] = DBModuleDescriptorXMLDAOBase(self)
+        if 'tag' not in self:
+            self['tag'] = DBTagXMLDAOBase(self)
+        if 'opm_role' not in self:
+            self['opm_role'] = DBOpmRoleXMLDAOBase(self)
+        if 'prov_document' not in self:
+            self['prov_document'] = DBProvDocumentXMLDAOBase(self)
+        if 'opm_account' not in self:
+            self['opm_account'] = DBOpmAccountXMLDAOBase(self)
+        if 'opm_processes' not in self:
+            self['opm_processes'] = DBOpmProcessesXMLDAOBase(self)
+        if 'ref_prov_activity' not in self:
+            self['ref_prov_activity'] = DBRefProvActivityXMLDAOBase(self)
+        if 'opm_account_id' not in self:
+            self['opm_account_id'] = DBOpmAccountIdXMLDAOBase(self)
+        if 'port' not in self:
+            self['port'] = DBPortXMLDAOBase(self)
+        if 'ref_prov_plan' not in self:
+            self['ref_prov_plan'] = DBRefProvPlanXMLDAOBase(self)
+        if 'opm_artifact' not in self:
+            self['opm_artifact'] = DBOpmArtifactXMLDAOBase(self)
+        if 'group' not in self:
+            self['group'] = DBGroupXMLDAOBase(self)
+        if 'log' not in self:
+            self['log'] = DBLogXMLDAOBase(self)
+        if 'mashup_alias' not in self:
+            self['mashup_alias'] = DBMashupAliasXMLDAOBase(self)
+        if 'opm_agents' not in self:
+            self['opm_agents'] = DBOpmAgentsXMLDAOBase(self)
+        if 'mashup' not in self:
+            self['mashup'] = DBMashupXMLDAOBase(self)
+        if 'opm_process_id_cause' not in self:
+            self['opm_process_id_cause'] = DBOpmProcessIdCauseXMLDAOBase(self)
+        if 'prov_generation' not in self:
+            self['prov_generation'] = DBProvGenerationXMLDAOBase(self)
+        if 'portSpecItem' not in self:
+            self['portSpecItem'] = DBPortSpecItemXMLDAOBase(self)
+        if 'machine' not in self:
+            self['machine'] = DBMachineXMLDAOBase(self)
+        if 'add' not in self:
+            self['add'] = DBAddXMLDAOBase(self)
+        if 'other' not in self:
+            self['other'] = DBOtherXMLDAOBase(self)
+        if 'location' not in self:
+            self['location'] = DBLocationXMLDAOBase(self)
+        if 'opm_overlaps' not in self:
+            self['opm_overlaps'] = DBOpmOverlapsXMLDAOBase(self)
+        if 'pe_parameter' not in self:
+            self['pe_parameter'] = DBPEParameterXMLDAOBase(self)
+        if 'opm_dependencies' not in self:
+            self['opm_dependencies'] = DBOpmDependenciesXMLDAOBase(self)
+        if 'parameter' not in self:
+            self['parameter'] = DBParameterXMLDAOBase(self)
+        if 'opm_used' not in self:
+            self['opm_used'] = DBOpmUsedXMLDAOBase(self)
+        if 'plugin_data' not in self:
+            self['plugin_data'] = DBPluginDataXMLDAOBase(self)
+        if 'function' not in self:
+            self['function'] = DBFunctionXMLDAOBase(self)
+        if 'actionAnnotation' not in self:
+            self['actionAnnotation'] = DBActionAnnotationXMLDAOBase(self)
+        if 'abstraction' not in self:
+            self['abstraction'] = DBAbstractionXMLDAOBase(self)
+        if 'workflow' not in self:
+            self['workflow'] = DBWorkflowXMLDAOBase(self)
+        if 'opm_artifact_id_cause' not in self:
+            self['opm_artifact_id_cause'] = DBOpmArtifactIdCauseXMLDAOBase(self)
+        if 'ref_prov_entity' not in self:
+            self['ref_prov_entity'] = DBRefProvEntityXMLDAOBase(self)
+        if 'prov_activity' not in self:
+            self['prov_activity'] = DBProvActivityXMLDAOBase(self)
+        if 'mashup_action' not in self:
+            self['mashup_action'] = DBMashupActionXMLDAOBase(self)
+        if 'prov_usage' not in self:
+            self['prov_usage'] = DBProvUsageXMLDAOBase(self)
+        if 'opm_artifact_value' not in self:
+            self['opm_artifact_value'] = DBOpmArtifactValueXMLDAOBase(self)
+        if 'opm_artifact_id_effect' not in self:
+            self['opm_artifact_id_effect'] = DBOpmArtifactIdEffectXMLDAOBase(self)
+        if 'opm_graph' not in self:
+            self['opm_graph'] = DBOpmGraphXMLDAOBase(self)
+        if 'mashuptrail' not in self:
+            self['mashuptrail'] = DBMashuptrailXMLDAOBase(self)
+        if 'registry' not in self:
+            self['registry'] = DBRegistryXMLDAOBase(self)
+        if 'vt_connection' not in self:
+            self['vt_connection'] = DBVtConnectionXMLDAOBase(self)
+        if 'mashup_component' not in self:
+            self['mashup_component'] = DBMashupComponentXMLDAOBase(self)
+        if 'prov_entity' not in self:
+            self['prov_entity'] = DBProvEntityXMLDAOBase(self)
+        if 'annotation' not in self:
+            self['annotation'] = DBAnnotationXMLDAOBase(self)
+        if 'change' not in self:
+            self['change'] = DBChangeXMLDAOBase(self)
+        if 'opm_was_derived_from' not in self:
+            self['opm_was_derived_from'] = DBOpmWasDerivedFromXMLDAOBase(self)
+        if 'opm_artifacts' not in self:
+            self['opm_artifacts'] = DBOpmArtifactsXMLDAOBase(self)
+        if 'opm_was_controlled_by' not in self:
+            self['opm_was_controlled_by'] = DBOpmWasControlledByXMLDAOBase(self)
+        if 'opm_agent_id' not in self:
+            self['opm_agent_id'] = DBOpmAgentIdXMLDAOBase(self)
+        if 'group_exec' not in self:
+            self['group_exec'] = DBGroupExecXMLDAOBase(self)
+        if 'opm_time' not in self:
+            self['opm_time'] = DBOpmTimeXMLDAOBase(self)
+        if 'package' not in self:
+            self['package'] = DBPackageXMLDAOBase(self)
+        if 'workflow_exec' not in self:
+            self['workflow_exec'] = DBWorkflowExecXMLDAOBase(self)
+        if 'parameter_exploration' not in self:
+            self['parameter_exploration'] = DBParameterExplorationXMLDAOBase(self)
+        if 'loop_exec' not in self:
+            self['loop_exec'] = DBLoopExecXMLDAOBase(self)
+        if 'opm_was_triggered_by' not in self:
+            self['opm_was_triggered_by'] = DBOpmWasTriggeredByXMLDAOBase(self)
+        if 'mashup_actionAnnotation' not in self:
+            self['mashup_actionAnnotation'] = DBMashupActionAnnotationXMLDAOBase(self)
+        if 'connection' not in self:
+            self['connection'] = DBConnectionXMLDAOBase(self)
+        if 'opm_process' not in self:
+            self['opm_process'] = DBOpmProcessXMLDAOBase(self)
+        if 'is_part_of' not in self:
+            self['is_part_of'] = DBIsPartOfXMLDAOBase(self)
+        if 'pe_function' not in self:
+            self['pe_function'] = DBPEFunctionXMLDAOBase(self)
+        if 'opm_process_value' not in self:
+            self['opm_process_value'] = DBOpmProcessValueXMLDAOBase(self)
+        if 'action' not in self:
+            self['action'] = DBActionXMLDAOBase(self)
+        if 'opm_agent' not in self:
+            self['opm_agent'] = DBOpmAgentXMLDAOBase(self)
+        if 'delete' not in self:
+            self['delete'] = DBDeleteXMLDAOBase(self)
+        if 'prov_association' not in self:
+            self['prov_association'] = DBProvAssociationXMLDAOBase(self)
+        if 'vistrail' not in self:
+            self['vistrail'] = DBVistrailXMLDAOBase(self)
+        if 'module_exec' not in self:
+            self['module_exec'] = DBModuleExecXMLDAOBase(self)
diff --git a/vistrails/db/versions/v1_0_3/persistence/xml/xml_dao.py b/vistrails/db/versions/v1_0_3/persistence/xml/xml_dao.py
new file mode 100644
index 0000000..dea8449
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/persistence/xml/xml_dao.py
@@ -0,0 +1,89 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from datetime import date, datetime
+from time import strptime
+
+class XMLDAO:
+    def __init__(self):
+        pass
+
+    def hasAttribute(self, node, attr):
+        return node.hasAttribute(attr)
+
+    def getAttribute(self, node, attr):
+        try:
+            attribute = node.attributes.get(attr)
+            if attribute is not None:
+                return attribute.value
+        except KeyError:
+            pass
+        return None
+
+    def convertFromStr(self, value, type):
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    try:
+                        return long(value)
+                    except ValueError:
+                        return -1
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    try:
+                        return int(value)
+                    except ValueError:
+                        if 'False' == value:
+                            return -1
+                        else:
+                            return 0
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    def convertToStr(self, value, type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
diff --git a/vistrails/db/versions/v1_0_3/schemas/sql/vistrails.sql b/vistrails/db/versions/v1_0_3/schemas/sql/vistrails.sql
new file mode 100644
index 0000000..b3031dd
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/schemas/sql/vistrails.sql
@@ -0,0 +1,528 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+CREATE TABLE `vistrails_version`(`version` char(16)) engine=InnoDB;
+INSERT INTO `vistrails_version`(`version`) VALUES ('1.0.3');
+
+CREATE TABLE thumbnail(
+    id int not null auto_increment primary key,
+    file_name varchar(255),
+    image_bytes mediumblob,
+    last_modified datetime
+) engine=InnoDB;
+
+-- generated automatically by auto_dao.py
+
+CREATE TABLE vistrail_variable(
+    name varchar(255),
+    uuid char(36),
+    package varchar(255),
+    module varchar(255),
+    namespace varchar(255),
+    value varchar(8191),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port_spec(
+    id int,
+    name varchar(255),
+    type varchar(255),
+    optional int,
+    sort_key int,
+    min_conns int,
+    max_conns int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE module_descriptor(
+    id int,
+    name varchar(255),
+    package varchar(255),
+    namespace varchar(255),
+    package_version varchar(255),
+    version varchar(255),
+    base_descriptor_id int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE tag(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port(
+    id int,
+    type varchar(255),
+    moduleId int,
+    moduleName varchar(255),
+    name varchar(255),
+    signature varchar(4095),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE group_tbl(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE log_tbl(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime,
+    vistrail_id int
+) engine=InnoDB;
+
+CREATE TABLE mashup_alias(
+    id int,
+    name varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE mashup(
+    id int,
+    name varchar(255),
+    version int,
+    type varchar(255),
+    vtid int,
+    layout mediumtext,
+    geometry mediumtext,
+    has_seq int,
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE port_spec_item(
+    id int,
+    pos int,
+    module varchar(255),
+    package varchar(255),
+    namespace varchar(255),
+    label varchar(4095),
+    _default varchar(4095),
+    _values mediumtext,
+    entry_type varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE machine(
+    id int,
+    name varchar(255),
+    os varchar(255),
+    architecture varchar(255),
+    processor varchar(255),
+    ram bigint,
+    vt_id int,
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE add_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE other(
+    id int,
+    okey varchar(255),
+    value varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE location(
+    id int,
+    x DECIMAL(18,12),
+    y DECIMAL(18,12),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE pe_parameter(
+    id int,
+    pos int,
+    interpolator varchar(255),
+    value mediumtext,
+    dimension int,
+    parent_type char(32),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE parameter(
+    id int,
+    pos int,
+    name varchar(255),
+    type varchar(255),
+    val mediumtext,
+    alias varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE plugin_data(
+    id int,
+    data varchar(8191),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE function(
+    id int,
+    pos int,
+    name varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE action_annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    action_id int,
+    date datetime,
+    user varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE abstraction(
+    id int,
+    cache int,
+    name varchar(255),
+    namespace varchar(255),
+    package varchar(511),
+    version varchar(255),
+    internal_version varchar(255),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE workflow(
+    id int not null auto_increment primary key,
+    entity_id int,
+    entity_type char(16),
+    name varchar(255),
+    version char(16),
+    last_modified datetime,
+    vistrail_id int,
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE mashup_action(
+    id int,
+    prev_id int,
+    date datetime,
+    user varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE mashuptrail(
+    id int not null auto_increment primary key,
+    name char(36),
+    version char(16),
+    vt_version int,
+    last_modified datetime,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE registry(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    root_descriptor_id int,
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE mashup_component(
+    id int,
+    vtid int,
+    vttype varchar(255),
+    vtparent_type char(32),
+    vtparent_id int,
+    vtpos int,
+    vtmid int,
+    pos int,
+    type varchar(255),
+    val mediumtext,
+    minVal varchar(255),
+    maxVal varchar(255),
+    stepSize varchar(255),
+    strvaluelist mediumtext,
+    widget varchar(255),
+    seq int,
+    parent varchar(255),
+    alias_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE annotation(
+    id int,
+    akey varchar(255),
+    value mediumtext,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE change_tbl(
+    id int,
+    what varchar(255),
+    old_obj_id int,
+    new_obj_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE group_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    group_name varchar(255),
+    group_type varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE package(
+    id int not null auto_increment primary key,
+    name varchar(255),
+    identifier varchar(1023),
+    codepath varchar(1023),
+    load_configuration int,
+    version varchar(255),
+    description varchar(1023),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE workflow_exec(
+    id int,
+    user varchar(255),
+    ip varchar(255),
+    session int,
+    vt_version varchar(255),
+    ts_start datetime,
+    ts_end datetime,
+    parent_id int,
+    parent_type varchar(255),
+    parent_version int,
+    completed int,
+    name varchar(255),
+    log_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE parameter_exploration(
+    id int,
+    action_id int,
+    name varchar(255),
+    date datetime,
+    user varchar(255),
+    dims varchar(255),
+    layout varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE loop_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    iteration int,
+    completed int,
+    error varchar(1023),
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE mashup_action_annotation(
+    id int,
+    akey varchar(255),
+    value varchar(8191),
+    action_id int,
+    date datetime,
+    user varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE connection_tbl(
+    id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
+CREATE TABLE pe_function(
+    id int,
+    module_id int,
+    port_name varchar(255),
+    is_alias int,
+    parent_type char(32),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE action(
+    id int,
+    prev_id int,
+    date datetime,
+    session int,
+    user varchar(255),
+    parent_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE delete_tbl(
+    id int,
+    what varchar(255),
+    object_id int,
+    par_obj_id int,
+    par_obj_type char(16),
+    action_id int,
+    entity_id int,
+    entity_type char(16)
+) engine=InnoDB;
+
+CREATE TABLE vistrail(
+    id int not null auto_increment primary key,
+    entity_type char(16),
+    version char(16),
+    name varchar(255),
+    last_modified datetime
+) engine=InnoDB;
+
+CREATE TABLE module_exec(
+    id int,
+    ts_start datetime,
+    ts_end datetime,
+    cached int,
+    module_id int,
+    module_name varchar(255),
+    completed int,
+    error varchar(1023),
+    machine_id int,
+    parent_type char(32),
+    entity_id int,
+    entity_type char(16),
+    parent_id int
+) engine=InnoDB;
+
diff --git a/vistrails/db/versions/v1_0_3/schemas/sql/vistrails_drop.sql b/vistrails/db/versions/v1_0_3/schemas/sql/vistrails_drop.sql
new file mode 100644
index 0000000..5fc87bb
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/schemas/sql/vistrails_drop.sql
@@ -0,0 +1,42 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+DROP TABLE IF EXISTS `vistrails_version`;
+
+DROP TABLE IF EXISTS thumbnail;
+
+-- genereated automatically by generate.py
+
+DROP TABLE IF EXISTS vistrail_variable, port_spec, module, module_descriptor, tag, port, group_tbl, log_tbl, mashup_alias, mashup, port_spec_item, machine, add_tbl, other, location, pe_parameter, parameter, plugin_data, function, action_annotation, abstraction, workflow, mashup_action, mashuptrail, registry, mashup_component, annotation, change_tbl, group_exec, package, workflow_exec, parameter_exploration, loop_exec, mashup_action_annotation, connection_tbl, pe_function, action, delete_ [...]
diff --git a/vistrails/db/versions/v1_0_3/schemas/xml/log.xsd b/vistrails/db/versions/v1_0_3/schemas/xml/log.xsd
new file mode 100644
index 0000000..effdfa5
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/schemas/xml/log.xsd
@@ -0,0 +1,146 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="log">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="workflow_exec" ref="workflowExec" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="machine" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflowExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element name="module_exec" ref="moduleExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="group_exec" ref="groupExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="ip" type="xs:string"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="vtVersion" type="xs:string"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="parentId" type="xs:int"/>
+      <xs:attribute name="parentType" type="xs:string"/>
+      <xs:attribute name="parentVersion" type="xs:int"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="machine">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="os" type="xs:string"/>
+      <xs:attribute name="architecture" type="xs:string"/>
+      <xs:attribute name="processor" type="xs:string"/>
+      <xs:attribute name="ram" type="xs:long"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="moduleExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="cached" type="xs:int"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="error" type="xs:string"/>
+      <xs:attribute name="machine_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="groupExec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element name="module_exec" ref="moduleExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="group_exec" ref="groupExec" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="cached" type="xs:int"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="groupName" type="xs:string"/>
+      <xs:attribute name="groupType" type="xs:string"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="error" type="xs:string"/>
+      <xs:attribute name="machine_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="loopExec">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element name="module_exec" ref="moduleExec" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="group_exec" ref="groupExec" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="loop_exec" ref="loopExec" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="tsStart" type="xs:dateTime"/>
+      <xs:attribute name="tsEnd" type="xs:dateTime"/>
+      <xs:attribute name="iteration" type="xs:int"/>
+      <xs:attribute name="completed" type="xs:int"/>
+      <xs:attribute name="error" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_3/schemas/xml/vistrail.xsd b/vistrails/db/versions/v1_0_3/schemas/xml/vistrail.xsd
new file mode 100644
index 0000000..29a043d
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/schemas/xml/vistrail.xsd
@@ -0,0 +1,347 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="vistrail">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="vistrailVariable" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element name="parameter_exploration" ref="parameterExploration" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="actionAnnotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="add" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="delete" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="change" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="prevId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="session" type="xs:int"/>
+      <xs:attribute name="user" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="vistrailVariable">
+    <xs:complexType>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="uuid" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="module" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameterExploration">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="function" ref="peFunction" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="actionId" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="user" type="xs:string"/>
+      <xs:attribute name="dims" type="xs:string"/>
+      <xs:attribute name="layout" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="actionAnnotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+      <xs:attribute name="actionId" type="xs:int"/>
+      <xs:attribute name="date" type="xs:dateTime"/>
+      <xs:attribute name="user" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="add">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="delete">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="objectId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="change">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="port" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="1"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="what" type="xs:string"/>
+      <xs:attribute name="oldObjId" type="xs:int"/>
+      <xs:attribute name="newObjId" type="xs:int"/>
+      <xs:attribute name="parentObjId" type="xs:int"/>
+      <xs:attribute name="parentObjType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="peFunction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="parameter" ref="peParameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="port_name" type="xs:string"/>
+      <xs:attribute name="is_alias" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="portSpecItem" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="minConns" type="xs:int"/>
+      <xs:attribute name="maxConns" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="peParameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="interpolator" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+      <xs:attribute name="dimension" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpecItem">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="module" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="label" type="xs:string"/>
+      <xs:attribute name="default" type="xs:string"/>
+      <xs:attribute name="values" type="xs:string"/>
+      <xs:attribute name="entryType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_3/schemas/xml/vtlink.xsd b/vistrails/db/versions/v1_0_3/schemas/xml/vtlink.xsd
new file mode 100644
index 0000000..011b59c
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/schemas/xml/vtlink.xsd
@@ -0,0 +1,69 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah.
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xs:element name="vtlink">
+<xs:complexType>
+<!-- if the vistrail is in a DB use host, database, port and vtid -->
+<xs:attribute name="host" type="xs:string"></xs:attribute>
+<xs:attribute name="database" type="xs:string"></xs:attribute>
+<xs:attribute name="port" type="xs:int"></xs:attribute>
+<xs:attribute name="vtid" type="xs:int"></xs:attribute>
+<!-- if the vistrail is a file use filename below -->
+<xs:attribute name="filename" type="xs:string"></xs:attribute>
+<!-- this is the workflow version -->
+<xs:attribute name="version" type="xs:int"></xs:attribute>
+<!-- this is the workflow tag -->
+<xs:attribute name="tag" type="xs:string"></xs:attribute>
+<xs:attribute name="url" type="xs:string"></xs:attribute>
+<!--  vtcontent can be a workflow in xml or a .vt file base64 encoded -->
+<xs:attribute name="vtcontent" type="xs:string"></xs:attribute>
+<!--  if execute is true the workflow will be executed -->
+<xs:attribute name="execute" type="xs:boolean"></xs:attribute>
+<!--  if showSpreadsheetOnly is True we will hide the builder -->
+<xs:attribute name="showSpreadsheetOnly" type="xs:boolean"></xs:attribute>
+<!--  if there's database information and a workflow is embedded, it will
+force loading from the db instead of using the emebedded version -->
+<xs:attribute name="forceDB" type="xs:boolean"></xs:attribute>
+<!--  if mashuptrail and mashupVersion are set, VisTrails will execute the
+mashup -->
+<xs:attribute name="mashuptrail" type="xs:string"></xs:attribute>
+<xs:attribute name="mashupVersion" type="xs:int"></xs:attribute>
+</xs:complexType>
+</xs:element>
+
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_3/schemas/xml/workflow.xsd b/vistrails/db/versions/v1_0_3/schemas/xml/workflow.xsd
new file mode 100644
index 0000000..840847f
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/schemas/xml/workflow.xsd
@@ -0,0 +1,200 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:element name="workflow">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="connection" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="plugin_data" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="other" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:choice>
+          <xs:element ref="module" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="abstraction" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="group" minOccurs="0" maxOccurs="1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="vistrail_id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="connection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="port" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="plugin_data">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="data" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="other">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="key" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="module">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="portSpec" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstraction">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+      <xs:attribute name="internalVersion" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="workflow" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="location" minOccurs="0" maxOccurs="1"/>
+        <xs:element ref="function" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element ref="annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="cache" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="version" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="port">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="moduleId" type="xs:int"/>
+      <xs:attribute name="moduleName" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="signature" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="x" type="xs:float"/>
+      <xs:attribute name="y" type="xs:float"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpec">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="portSpecItem" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="optional" type="xs:int"/>
+      <xs:attribute name="sortKey" type="xs:int"/>
+      <xs:attribute name="minConns" type="xs:int"/>
+      <xs:attribute name="maxConns" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="type" type="xs:string"/>
+      <xs:attribute name="val" type="xs:string"/>
+      <xs:attribute name="alias" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="portSpecItem">
+    <xs:complexType>
+      <xs:attribute name="id" type="xs:int"/>
+      <xs:attribute name="pos" type="xs:int"/>
+      <xs:attribute name="module" type="xs:string"/>
+      <xs:attribute name="package" type="xs:string"/>
+      <xs:attribute name="namespace" type="xs:string"/>
+      <xs:attribute name="label" type="xs:string"/>
+      <xs:attribute name="default" type="xs:string"/>
+      <xs:attribute name="values" type="xs:string"/>
+      <xs:attribute name="entryType" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/vistrails/db/versions/v1_0_3/specs/all.xml b/vistrails/db/versions/v1_0_3/specs/all.xml
new file mode 100644
index 0000000..ab07b76
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/specs/all.xml
@@ -0,0 +1,3823 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<objects>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ABSTRACTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="abstraction">
+    <layout>
+      <xml name="abstraction" nodeType="xs:element"/>
+      <sql table="abstraction"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="internal_version" type="str">
+      <xml name="internalVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="operation" type="list" mapping="one-to-many">
+      <property name="add" ref="true" object="add">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="delete" ref="true" object="delete">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="change" ref="true" object="change">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="vistrail" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ADD +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="add">
+    <layout>
+      <xml name="add" nodeType="xs:element"/>
+      <sql table="add_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true"
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+    
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ACTION_ANNOTATION +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="actionAnnotation">
+    <layout>
+      <xml nodeType="xs:element"/>
+      <sql table="action_annotation"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="action_id" type="long" foreignKey="true" object="action">
+      <xml name="actionId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>    
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- ANNOTATION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="annotation">
+    <layout>
+      <xml name="annotation" nodeType="xs:element"/>
+      <sql table="annotation"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="vistrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="workflow_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="module_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="action">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="mashuptrail">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL_VARIABLE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrailVariable">
+    <layout>
+      <xml nodeType="xs:element"/>
+      <sql table="vistrail_variable"/>
+    </layout>
+
+    <property name="name" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="name" type="varchar(255)"/>
+    </property>
+
+    <property name="uuid" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="uuid" type="char(36)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="package" type="varchar(255)"/>
+    </property>
+
+    <property name="module" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="module" type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="namespace" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="value" type="varchar(8191)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CHANGE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="change">
+    <layout>
+      <xml name="change" nodeType="xs:element"/>
+      <sql table="change_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="oldObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="old_obj_id" type="int"/>
+    </property>
+
+    <property name="newObjId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="new_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <choice name="data" type="object" discriminator="what">
+      <property ref="true" object="module" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="location" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="annotation" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="function" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="connection" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="port" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="parameter" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="portSpec" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="abstraction" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="group" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="other" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+      <property ref="true" object="plugin_data" mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- CONNECTION ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="connection">
+    <layout>
+      <xml name="connection" nodeType="xs:element"/>
+      <sql table="connection_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="port" type="list" mapping="one-to-many"
+	      index="type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- DELETE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="delete">
+    <layout>
+      <xml name="delete" nodeType="xs:element"/>
+      <sql table="delete_tbl"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="what" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="objectId" type="long" foreignKey="true" discriminator="what">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="object_id" type="int"/>
+    </property>
+
+    <property name="parentObjId" type="long" foreignKey="true" 
+	      discriminator="parentObjType">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="par_obj_id" type="int"/>
+    </property>
+
+    <property name="parentObjType" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="par_obj_type" type="char(16)"/>
+    </property>
+
+    <property name="action" type="long" ref="true" object="action" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="action_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- FUNCTION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="function">
+    <layout>
+      <xml name="function" nodeType="xs:element"/>
+      <sql table="function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="parameter" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group" parentClass="module">
+    <layout>
+      <xml name="group" nodeType="xs:element"/>
+      <sql table="group_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="workflow" type="object" mapping="one-to-one" 
+	      expand="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOCATION ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="location">
+    <layout>
+      <xml name="location" nodeType="xs:element"/>
+      <sql table="location"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="x" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="y" type="float">
+      <xml nodeType="xs:attribute" type="xs:float"/>
+      <sql type="DECIMAL(18,12)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="abstraction">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="group">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="log">
+    <layout>
+      <xml name="log" nodeType="xs:element"/>
+      <sql table="log_tbl"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="workflow_exec" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="machine" cascade="false" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MACHINE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="machine">
+    <layout>
+      <xml name="machine" nodeType="xs:element"/>
+      <sql table="machine"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="os" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="architecture" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="processor" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ram" type="int">
+      <xml nodeType="xs:attribute" type="xs:long"/>
+      <sql type="bigint"/>
+    </property>
+
+    <property name="vistrailId" type="long" inverse="true"
+	      foreignKey="true" object="vistrail">
+      <sql column="vt_id" type="int"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module">
+    <layout>
+      <xml name="module" nodeType="xs:element"/>
+      <sql table="module"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="cache" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(511)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="location" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="function" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- LOOP_EXEC +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="loop_exec">
+    <layout>
+      <xml name="loopExec" nodeType="xs:element"/>
+      <sql table="loop_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <!--<property name="input" type="str">
+      <xml name="input" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>-->
+
+    <property name="iteration" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+      
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="module_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- GROUP_EXEC ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="group_exec">
+    <layout>
+      <xml name="groupExec" nodeType="xs:element"/>
+      <sql table="group_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="group_name" type="str">
+      <xml name="groupName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="group_type" type="str">
+      <xml name="groupType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <!--<property ref="true" object="workflow_exec" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="wf_exec_id" type="int"/>
+    </property>-->
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_EXEC +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_exec">
+    <layout>
+      <xml name="moduleExec" nodeType="xs:element"/>
+      <sql table="module_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="cached" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql nodeType="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_name" type="str">
+      <xml name="moduleName" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="error" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="machine_id" type="long" foreignKey="true" object="machine">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="loop_exec" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="workflow_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="long" 
+		mapping="many-to-one" inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OTHER +++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="other">
+    <layout>
+      <xml name="other" nodeType="xs:element"/>
+      <sql table="other"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="okey" type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter">
+    <layout>
+      <xml name="parameter" nodeType="xs:element"/>
+      <sql table="parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="alias" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="function">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PLUGIN DATA +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="plugin_data">
+    <layout>
+      <xml name="plugin_data" nodeType="xs:element"/>
+      <sql table="plugin_data"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="data" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="workflow">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORT ++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="port">
+    <layout>
+      <xml name="port" nodeType="xs:element"/>
+      <sql table="port"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="moduleId" type="long" foreignKey="true" object="module">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="moduleName" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="signature" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="connection" type="long" mapping="many-to-one" 
+		inverse="true">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPEC ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpec">
+    <layout>
+      <xml name="portSpec" nodeType="xs:element"/>
+      <sql table="port_spec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="optional" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="sort_key" type="int">
+      <xml name="sortKey" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpecItem" type="list" 
+	      mapping="one-to-many" expandAction="false">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="min_conns" type="int">
+      <xml name="minConns" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="max_conns" type="int">
+      <xml name="maxConns" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+	    mapping="many-to-one">
+      <property ref="true" object="module">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="module_descriptor">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="add">
+	<sql column="parent_id" type="int"/>
+      </property>
+      <property ref="true" object="change">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PORTSPECITEM ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="portSpecItem">
+    <layout>
+      <xml name="portSpecItem" nodeType="xs:element"/>
+      <sql table="port_spec_item"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="label" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(4095)"/>
+    </property>
+
+    <property name="default" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="_default" type="varchar(4095)"/>
+    </property>
+
+    <property name="values" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="_values" type="mediumtext"/>
+    </property>
+
+    <property name="entry_type" type="str">
+      <xml name="entryType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="portSpec" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MODULE_DESCRIPTOR +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="module_descriptor">
+    <layout>
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+      <sql table="module_descriptor"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+	   
+    <property name="namespace" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="package_version" type="str">
+      <xml name="packageVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="base_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="baseDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="portSpec" type="list" mapping="one-to-many"
+	      index="name:type">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="package" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+    <!--
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <choice name="parent" type="long" discriminator="parentType" inverse="true" 
+            mapping="many-to-one">
+      <property ref="true" object="registry">
+	<sql column="parent_id" type="int"/>
+      </property>
+      
+      <property ref="true" object="package">
+	<sql column="parent_id" type="int"/>
+      </property>
+    </choice>
+    -->
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PACKAGE +++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="package">
+    <layout>
+      <xml name="package" nodeType="xs:element"/>
+      <sql table="package"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="identifier" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property name="codepath" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+      
+    <property name="load_configuration" type="int">
+      <xml name="loadConfiguration" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>      
+
+    <property name="description" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(1023)"/>
+    </property>
+
+    <property ref="true" object="module_descriptor" type="list" 
+	      mapping="one-to-many" index="name:namespace:version">
+      <xml name="moduleDescriptor" nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="registry" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- REGISTRY ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="registry">
+    <layout>
+      <xml name="registry" nodeType="xs:element"/>
+      <sql table="registry"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="root_descriptor_id" type="long" foreignKey="true" 
+	      object="module_descriptor">
+      <xml name="rootDescriptorId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <!-- <xml nodeType="xs:attribute" type="xs:string"/> -->
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="package" type="list"
+	      mapping="one-to-many" index="identifier:version">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- TAG +++++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="tag">
+    <layout>
+      <xml name="tag" nodeType="xs:element"/>
+      <sql table="tag"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true" foreignKey="true" 
+	      object="action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VISTRAIL ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vistrail">
+    <layout>
+      <xml name="vistrail" nodeType="xs:element"/>
+      <sql table="vistrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+    
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property ref="true" object="action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="tag" type="list" mapping="one-to-many"
+	      index="name">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="vistrailVariable" type="list" mapping="one-to-many"
+	      index="uuid">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="parameter_exploration" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+    <property ref="true" object="actionAnnotation" type="list" 
+	      mapping="one-to-many" index="action_id:key !key:value">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow">
+    <layout>
+      <xml name="workflow" nodeType="xs:element"/>
+      <sql table="workflow"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str">
+      <sql type="char(16)" global="true" globalName="entity_type"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <choice name="module" type="list" mapping="one-to-many">
+      <property name="module" ref="true" object="module">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="abstraction" ref="true" object="abstraction">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group" ref="true" object="group">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+    
+    <property ref="true" object="connection" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="plugin_data" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="other" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="vistrail_id" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" object="group" type="long" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- WORKFLOW_EXEC +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="workflow_exec">
+    <layout>
+      <xml name="workflowExec" nodeType="xs:element"/>
+      <sql table="workflow_exec"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ip" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="session" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="vt_version" type="str">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="ts_start" type="datetime">
+      <xml name="tsStart" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="ts_end" type="datetime">
+      <xml name="tsEnd" nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="parent_id" type="long">
+      <xml name="parentId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent_type" type="str">
+      <xml name="parentType" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="parent_version" type="long">
+      <xml name="parentVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="completed" type="int">
+      <xml name="completed" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="log" type="long" mapping="many-to-one" 
+	      inverse="true">
+      <sql column="log_id" type="int"/>
+    </property>
+    
+    <property ref="true" object="annotation" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <choice name="item_exec" type="list" mapping="one-to-many">
+      <property name="module_exec" ref="true" object="module_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="group_exec" ref="true" object="group_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="loop_exec" ref="true" object="loop_exec">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PE_PARAMETER ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="pe_parameter" className="DBPEParameter">
+    <layout>
+      <xml name="peParameter" nodeType="xs:element"/>
+      <sql table="pe_parameter"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="interpolator" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="dimension" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <property ref="true" type="long" object="pe_function" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PE_FUNCTION +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="pe_function" className="DBPEFunction">
+    <layout>
+      <xml name="peFunction" nodeType="xs:element"/>
+      <sql table="pe_function"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="module_id" type="long" foreignKey="true" object="module">
+      <xml name="moduleId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="port_name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="is_alias" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property ref="true" name="parameter" object="pe_parameter" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="parentType" type="str" inverse="true">
+      <sql column="parent_type" type="char(32)"/>
+    </property>
+
+    <property ref="true" type="long" object="parameter_exploration" 
+	      inverse="true" mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PARAMETER_EXPLORATION +++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="parameter_exploration">
+    <layout>
+      <xml name="parameterExploration" nodeType="xs:element"/>
+      <sql table="parameter_exploration"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="action_id" type="long" foreignKey="true" object="action">
+      <xml name="actionId" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="dims" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="layout" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" name="function" object="pe_function" type="list" 
+	      mapping="one-to-many" index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="vistrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUP_ACTION +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashup_action">
+    <layout>
+      <xml name="action" nodeType="xs:element"/>
+      <sql table="mashup_action"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="prevId" type="long" foreignKey="true" object="mashup_action">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql column="prev_id" type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property ref="true" object="mashup" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" type="long" object="mashuptrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+	<property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+    
+  </object>
+
+  <!--+++++++++++++++++++++++++++++-->
+  <!-- MASHUP_ACTION_ANNOTATION +++-->
+  <!--+++++++++++++++++++++++++++++-->
+
+  <object name="mashup_actionAnnotation">
+    <layout>
+      <xml name="actionAnnotation" nodeType="xs:element"/>
+      <sql table="mashup_action_annotation"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="key" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql column="akey" type="varchar(255)"/>
+     </property>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(8191)"/>
+    </property>
+
+    <property name="action_id" type="long" foreignKey="true" object="mashup_action">
+      <xml name="action_id" nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="date" type="datetime">
+      <xml nodeType="xs:attribute" type="xs:dateTime"/>
+      <sql type="datetime"/>
+    </property>
+
+    <property name="user" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>    
+
+    <property ref="true" type="long" object="mashuptrail" inverse="true" 
+	      mapping="many-to-one">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUPTRAIL +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashuptrail">
+    <layout>
+      <xml name="mashuptrail" nodeType="xs:element"/>
+      <sql table="mashuptrail"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <sql type="int" autoInc="true" global="true" globalName="entity_id"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(36)"/>
+    </property>
+    
+    <property name="version" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(16)"/>
+    </property>
+    
+    <property name="vtVersion" type="long">
+      <xml name="vtVersion" nodeType="xs:attribute" type="xs:int"/>
+      <sql column="vt_version" type="int"/>
+    </property>
+
+    <property name="last_modified" type="datetime">
+      <sql type="datetime"/>
+    </property>
+
+    <property name="action" ref="true" object="mashup_action" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="annotation" type="list" mapping="one-to-many"
+	      index="key">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="actionAnnotation" ref="true" object="mashup_actionAnnotation" type="list" 
+	      mapping="one-to-many" index="action_id:key !key:value">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--+++++++++++++++++++++++++++++-->
+  <!-- MASHUP_ALIAS +++++++++++++++-->
+  <!--+++++++++++++++++++++++++++++-->
+
+  <object name="mashup_alias">
+    <layout>
+      <xml name="alias" nodeType="xs:element"/>
+      <sql table="mashup_alias"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="component" ref="true" object="mashup_component" type="object" mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+    
+    <property name="parent" ref="true" object="mashup" type="long" 
+	      mapping="many-to-one" inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUP_COMPONENT ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashup_component">
+    <layout>
+      <xml name="component" nodeType="xs:element"/>
+      <sql table="mashup_component"/>
+    </layout>
+    
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="vtid" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+     <property name="vttype" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="vtparent_type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="char(32)"/>
+    </property>
+    
+    <property name="vtparent_id" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="vtpos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="vtmid" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="pos" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="val" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+    
+    <property name="minVal" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="maxVal" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="stepSize" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="strvaluelist" type="str">
+      <xml name="valueList" nodeType="xs:attribute" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+    
+    <property name="widget" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="seq" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="parent" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property ref="true" object="mashup_alias" type="long" mapping="one-to-one" 
+	      inverse="true">
+      <sql column="alias_id" type="int"/>
+    </property>
+
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- MASHUP ++++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="mashup">
+    <layout>
+      <xml name="mashup" nodeType="xs:element"/>
+      <sql table="mashup"/>
+    </layout>
+
+    <property name="id" type="long" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="name" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+    
+    <property name="version" type="long">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+
+    <property name="alias" pluralName="aliases" type= "list" ref="true" 
+              object="mashup_alias" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="type" type="str">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="varchar(255)"/>
+    </property>
+
+    <property name="vtid" type="long" foreignKey="true" object="vistrail">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="layout" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="geometry" type="str">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <sql type="mediumtext"/>
+    </property>
+
+    <property name="has_seq" type="int">
+      <xml nodeType="xs:attribute" type="xs:int"/>
+      <sql type="int"/>
+    </property>
+    
+    <property name="parent" ref="true" object="mashup_action" type="long" 
+		mapping="one-to-one" inverse="true">
+      <sql column="parent_id" type="int"/>
+    </property>
+    
+    <property name="entity_id" type="long" inverse="true">
+      <sql type="int"/>
+    </property>
+
+    <property name="entity_type" type="str" inverse="true">
+      <sql type="char(16)"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_GRAPH +++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_graph">
+    <layout>
+      <xml name="opmGraph" nodeType="xs:element"/>
+      <!-- <sql table="opm_graph"/> -->
+    </layout>
+
+    <property name="accounts" ref="true" object="opm_accounts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="processes" ref="true" object="opm_processes" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="artifacts" ref="true" object="opm_artifacts" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="agents" ref="true" object="opm_agents" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="dependencies" ref="true" object="opm_dependencies" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNTS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_accounts">
+    <layout>
+      <xml name="accounts" nodeType="xs:element"/>
+      <!-- <sql table="accounts"/> -->
+    </layout>
+
+    <property name="account" ref="true" object="opm_account" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property ref="true" object="opm_overlaps" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_account">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_OVERLAPS ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_overlaps">
+    <layout>
+      <xml name="overlaps" nodeType="xs:element"/>
+      <!-- <sql table="overlaps"/> -->
+    </layout>
+
+    <property ref="true" object="opm_account_id" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACTS +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifacts">
+    <layout>
+      <xml name="artifacts" nodeType="xs:element"/>
+      <!-- <sql table="artifacts"/> -->
+    </layout>
+
+    <property name="artifact" ref="true" object="opm_artifact" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_VALUE ++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="artifact_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="portSpec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="function" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_artifact">
+    <layout>
+      <xml name="artifact" nodeType="xs:element"/>
+      <!-- <sql table="artifact"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" ref="true" object="opm_artifact_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESSES +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_processes">
+    <layout>
+      <xml name="processes" nodeType="xs:element"/>
+      <!-- <sql table="processes"/> -->
+    </layout>
+
+    <property name="process" ref="true" object="opm_process" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_VALUE +++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process_value">
+    <layout>
+      <xml name="value" nodeType="xs:element"/>
+      <!-- <sql table="process_value"/> -->
+    </layout>
+    
+    <choice name="value" type="object" mapping="one-to-one">
+      <property ref="true" object="module_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="group_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property ref="true" object="loop_exec" type="object" 
+		mapping="one-to-one">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_process">
+    <layout>
+      <xml name="process" nodeType="xs:element"/>
+      <!-- <sql table="process"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="value" ref="true" object="opm_process_value" type="object" 
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENTS ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agents">
+    <layout>
+      <xml name="agents" nodeType="xs:element"/>
+      <!-- <sql table="agents"/> -->
+    </layout>
+
+    <property name="agent" ref="true" object="opm_agent" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_agent">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent"/> -->
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+    
+    <property name="value" type="str">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type=""/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_DEPENDENCIES ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="opm_dependencies">
+    <layout>
+      <xml name="causalDependencies" nodeType="xs:element"/>
+      <!-- <sql table="causal_dependencies"/> -->
+    </layout>
+
+    <choice name="dependency" type="list" mapping="one-to-many">
+      <property name="used" ref="true" object="opm_used">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_generated_by" ref="true" 
+		object="opm_was_generated_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_triggered_by" ref="true" 
+		object="opm_was_triggered_by">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_derived_from" ref="true" 
+		object="opm_was_derived_from">
+	<xml nodeType="xs:element"/>
+      </property>
+
+      <property name="was_controlled_by" ref="true" 
+		object="opm_was_controlled_by">
+	<xml nodeType="xs:element"/>
+      </property>
+    </choice>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_TIME ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_time">
+    <layout>
+      <xml name="time" nodeType="xs:element"/>
+      <!-- <sql table="time"/> -->
+    </layout>
+
+    <property name="no_later_than" type="datetime">
+      <xml name="noLaterThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="no_earlier_than" type="datetime">
+      <xml name="noEarlierThan" nodeType="xs:attribute" type="xs:dateTime"/>
+      <!-- <sql type="datetime"/> -->
+    </property>
+
+    <property name="clock_id" type="str">
+      <xml name="clockId" nodeType="xs:attribute" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ACCOUNT_ID ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_account_id">
+    <layout>
+      <xml name="account" nodeType="xs:element"/>
+      <!-- <sql table="account_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_account">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_CAUSE ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="process_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_PROCESS_ID_EFFECT +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_process_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="process_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_process">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_CAUSE +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_cause">
+    <layout>
+      <xml name="cause" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_cause"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ARTIFACT_ID_EFFECT ++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_artifact_id_effect">
+    <layout>
+      <xml name="effect" nodeType="xs:element"/>
+      <!-- <sql table="artifact_id_effect"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_artifact">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_AGENT_ID ++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_agent_id">
+    <layout>
+      <xml name="agent" nodeType="xs:element"/>
+      <!-- <sql table="agent_id"/> -->
+    </layout>
+
+    <property name="id" type="str" foreignKey="true" object="opm_agent">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_ROLE ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_role">
+    <layout>
+      <xml name="role" nodeType="xs:element"/>
+      <!-- <sql table="role"/> -->
+    </layout>
+
+    <property name="value" type="str">
+      <xml nodeType="xs:attribute"/>
+      <!-- <sql type="varchar(4095)"/> -->
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_USED ++++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_used">
+    <layout>
+      <xml name="used" nodeType="xs:element"/>
+      <!-- <sql table="used"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_GENERATED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_generated_by">
+    <layout>
+      <xml name="wasGeneratedBy" nodeType="xs:element"/>
+      <!-- <sql table="was_generated_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_CONTROLLED_BY +++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_controlled_by">
+    <layout>
+      <xml name="wasControlledBy" nodeType="xs:element"/>
+      <!-- <sql table="was_controlled_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_agent_id"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="start" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+
+    <property name="end" ref="true" object="opm_time" type="list" 
+	      mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_DERIVED_FROM ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_derived_from">
+    <layout>
+      <xml name="wasDerivedFrom" nodeType="xs:element"/>
+      <!-- <sql table="was_derived_from"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_artifact_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_artifact_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- OPM_WAS_TRIGGERED_BY ++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="opm_was_triggered_by">
+    <layout>
+      <xml name="wasTriggeredBy" nodeType="xs:element"/>
+      <!-- <sql table="was_triggered_by"/> -->
+    </layout>
+
+    <property name="effect" ref="true" object="opm_process_id_effect"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="role" ref="true" object="opm_role" type="str"
+	      mapping="one-to-one">
+      <xml nodeType="xs:element"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="cause" ref="true" object="opm_process_id_cause"
+	      type="str" mapping="one-to-one">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property name="account" ref="true" object="opm_account_id"
+	      type="list" mapping="one-to-many">
+      <xml nodeType="xs:element" type="xs:string"/>
+      <!-- <sql type="varchar(255)"/> -->
+    </property>
+
+    <property ref="true" object="opm_time" type="list" mapping="one-to-many">
+      <xml nodeType="xs:element"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_DOCUMENT +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_document">
+    <layout>
+      <xml name="prov:document" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_entity" ref="true" object="prov_entity" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_activity" ref="true" object="prov_activity" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_agent" ref="true" object="prov_agent" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </property>
+    
+    <property name="vt_connection" ref="true" object="vt_connection" type="list" 
+          mapping="one-to-many">
+      <xml name="vt:connection" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_usage" ref="true" object="prov_usage" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:used" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_generation" ref="true" object="prov_generation" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:wasGeneratedBy" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_association" ref="true" object="prov_association" type="list" 
+          mapping="one-to-many">
+      <xml name="prov:wasAssociatedWith" nodeType="xs:element"/>
+    </property>
+    
+    <!--<property name="vt_part" ref="true" object="vt_part" type="list" 
+          mapping="one-to-many">
+      <xml name="vt:isPartOf" nodeType="xs:element"/>
+    </property>-->
+    
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_ENTITY +++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_entity">
+    <layout>
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="prov:id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+    
+    <property name="prov_type" type="str">
+      <xml name="prov:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_label" type="str">
+      <xml name="prov:label" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_value" type="str">
+      <xml name="prov:value" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_id" type="str">
+      <xml name="vt:id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_type" type="str">
+      <xml name="vt:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_desc" type="str">
+      <xml name="vt:desc" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_package" type="str">
+      <xml name="vt:package" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_version" type="str">
+      <xml name="vt:version" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_cache" type="str">
+      <xml name="vt:cache" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_location_x" type="str">
+      <xml name="vt:location_x" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_location_y" type="str">
+      <xml name="vt:location_y" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="is_part_of" ref="true" object="is_part_of" type="str">
+      <xml name="dcterms:isPartOf" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_ENTITY +++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_entity">
+    <layout>
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_entity">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_PLAN +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_plan">
+    <layout>
+      <xml name="prov:plan" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_entity">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_ACTIVITY +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_activity">
+    <layout>
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="prov:id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+    
+    <property name="startTime" type="str">
+      <xml name="prov:startTime" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="endTime" type="str">
+      <xml name="prov:endTime" nodeType="xs:element" type="xs:string"/>
+    </property>
+
+    <property name="vt_id" type="str" primaryKey="true">
+      <xml name="vt:id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_type" type="str">
+      <xml name="vt:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_cached" type="str">
+      <xml name="vt:cached" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_completed" type="str">
+      <xml name="vt:completed" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_id" type="str">
+      <xml name="vt:machine_id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_error" type="str">
+      <xml name="vt:error" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="is_part_of" ref="true" object="is_part_of" type="str">
+      <xml name="dcterms:isPartOf" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_ACTIVITY +++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_activity">
+    <layout>
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_activity">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_AGENT ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_agent">
+    <layout>
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="prov:id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+
+    <property name="vt_id" type="str">
+      <xml name="vt:id" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_type" type="str">
+      <xml name="prov:type" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="prov_label" type="str">
+      <xml name="prov:label" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_os" type="str">
+      <xml name="vt:machine_os" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_architecture" type="str">
+      <xml name="vt:machine_architecture" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_processor" type="str">
+      <xml name="vt:machine_processor" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_machine_ram" type="str">
+      <xml name="vt:machine_ram" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- REF_PROV_AGENT ++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+  
+  <object name="ref_prov_agent">
+    <layout>
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str" foreignKey="true" object="prov_agent">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- VT_CONNECTION +++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="vt_connection">
+    <layout>
+      <xml name="vt:connection" nodeType="xs:element"/>
+    </layout>
+
+    <property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+
+    <property name="vt_source" type="str">
+      <xml name="vt:source" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_dest" type="str">
+      <xml name="vt:dest" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_source_port" type="str">
+      <xml name="vt:source_port" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_dest_port" type="str">
+      <xml name="vt:dest_port" nodeType="xs:element" type="xs:string"/>
+    </property>
+      
+    <property name="vt_source_signature" type="str">
+      <xml name="vt:source_signature" nodeType="xs:element" type="xs:string"/>
+    </property>
+    
+    <property name="vt_dest_signature" type="str">
+      <xml name="vt:dest_signature" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_USAGE ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_usage">
+    <layout>
+      <xml name="prov:used" nodeType="xs:element"/>
+    </layout>
+
+    <!--<property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>-->
+    
+    <property name="prov_activity" ref="true" object="ref_prov_activity" type="str">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_entity" ref="true" object="ref_prov_entity" type="str">
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_role" type="str">
+      <xml name="prov:role" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_GENERATION +++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_generation">
+    <layout>
+      <xml name="prov:wasGeneratedBy" nodeType="xs:element"/>
+    </layout>
+
+    <!--<property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>-->
+    
+    <property name="prov_entity" ref="true" object="ref_prov_entity" type="str">
+      <xml name="prov:entity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_activity" ref="true" object="ref_prov_activity" type="str">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_role" type="str">
+      <xml name="prov:role" nodeType="xs:element" type="xs:string"/>
+    </property>
+  </object>
+
+  <!--++++++++++++++++++++++++++-->
+  <!-- PROV_ASSOCIATION ++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="prov_association">
+    <layout>
+      <xml name="prov:wasAssociatedWith" nodeType="xs:element"/>
+    </layout>
+
+    <!--<property name="id" type="str" primaryKey="true">
+      <xml name="id" nodeType="xs:attribute" type="xs:string"/>
+    </property>-->
+    
+    <property name="prov_activity" ref="true" object="ref_prov_activity" type="str">
+      <xml name="prov:activity" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_agent" ref="true" object="ref_prov_agent" type="str">
+      <xml name="prov:agent" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_plan" ref="true" object="ref_prov_plan" type="str">
+      <xml name="prov:plan" nodeType="xs:element"/>
+    </property>
+    
+    <property name="prov_role" type="str">
+      <xml name="prov:role" nodeType="xs:element" type="xs:string"/>
+    </property>  
+  </object>
+  
+  <!--++++++++++++++++++++++++++-->
+  <!-- IS_PART_OF ++++++++++++++-->
+  <!--++++++++++++++++++++++++++-->
+
+  <object name="is_part_of">
+    <layout>
+      <xml name="dcterms:isPartOf" nodeType="xs:element"/>
+    </layout>
+    
+    <property name="prov_ref" type="str">
+      <xml name="prov:ref" nodeType="xs:attribute" type="xs:string"/>
+    </property>
+  </object>
+
+</objects>
diff --git a/vistrails/db/versions/v1_0_3/translate/__init__.py b/vistrails/db/versions/v1_0_3/translate/__init__.py
new file mode 100644
index 0000000..aee1abc
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/translate/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+version = '1.0.3'
diff --git a/vistrails/db/versions/v1_0_3/translate/v1_0_2.py b/vistrails/db/versions/v1_0_3/translate/v1_0_2.py
new file mode 100644
index 0000000..a16c5d1
--- /dev/null
+++ b/vistrails/db/versions/v1_0_3/translate/v1_0_2.py
@@ -0,0 +1,342 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.db.versions.v1_0_3.domain import DBVistrail, DBVistrailVariable, \
+                                      DBWorkflow, DBLog, DBRegistry, \
+                                      DBAdd, DBChange, DBDelete, \
+                                      DBPortSpec, DBPortSpecItem, \
+                                      DBParameterExploration, \
+                                      DBPEParameter, DBPEFunction, \
+                                      IdScope, DBAbstraction, \
+                                      DBModule, DBGroup, DBAnnotation, \
+                                      DBActionAnnotation
+
+from vistrails.db.services.vistrail import materializeWorkflow
+from xml.dom.minidom import parseString
+from itertools import izip
+
+import unittest
+
+id_scope = None
+
+def update_portSpec(old_obj, translate_dict):
+    global id_scope
+    sigstring = old_obj.db_sigstring
+    sigs = []
+    if sigstring and sigstring != '()':
+        for sig in sigstring[1:-1].split(','):
+            sigs.append(sig.split(':', 2))
+    # not great to use eval...
+    defaults = eval(old_obj.db_defaults) if old_obj.db_defaults else []
+    if isinstance(defaults, basestring):
+        defaults = (defaults,)
+    else:
+        try:
+            it = iter(defaults)
+        except TypeError:
+            defaults = (defaults,)
+    # not great to use eval...
+    labels = eval(old_obj.db_labels) if old_obj.db_labels else []
+    if isinstance(labels, basestring):
+        labels = (labels,)
+    else:
+        try:
+            it = iter(labels)
+        except TypeError:
+            labels = (labels,)
+    new_obj = DBPortSpec.update_version(old_obj, translate_dict)
+    total_len = len(sigs)
+    if len(defaults) < total_len:
+        defaults.extend("" for i in xrange(total_len-len(defaults)))
+    if len(labels) < total_len:
+        labels.extend("" for i in xrange(total_len-len(labels)))
+    for i, (sig, default, label) in enumerate(izip(sigs, defaults, labels)):
+        module = None
+        package = None
+        namespace = ''
+        if len(sig) == 1:
+            module = sig[0]
+        else:
+            package = sig[0]
+            module = sig[1]
+        if len(sig) > 2:
+            namespace = sig[2]
+        item = DBPortSpecItem(id=id_scope.getNewId(DBPortSpecItem.vtType),
+                              pos=i, 
+                              module=module, 
+                              package=package,
+                              namespace=namespace, 
+                              label=label, 
+                              default=default)
+        item.db_values = ''
+        item.db_entry_type = ''
+        new_obj.db_add_portSpecItem(item)
+    return new_obj
+
+def update_portSpecs(old_obj, translate_dict):
+    new_port_specs = []
+    for port_spec in old_obj.db_portSpecs:
+        new_port_specs.append(update_portSpec(port_spec, translate_dict))
+    return new_port_specs
+
+def update_portSpec_op(old_obj, translate_dict):
+    return update_portSpec(old_obj.db_data, translate_dict)
+
+def createParameterExploration(action_id, xmlString, vistrail):
+    if not xmlString:
+        return
+    # Parse/validate the xml
+
+    try:
+        striplen = len("<paramexps>")
+        xmlString = xmlString[striplen:-(striplen+1)].strip()
+        xmlDoc = parseString(xmlString).documentElement
+    except:
+        return None
+    # we need the pipeline to look up function/paramater id:s
+    pipeline = materializeWorkflow(vistrail, action_id)
+    # Populate parameter exploration window with stored functions and aliases
+    functions = []
+    for f in xmlDoc.getElementsByTagName('function'):
+        f_id = long(f.attributes['id'].value)
+        # we need to convert function id:s to (module_id, port_name)
+        module_id = None
+        f_name = None
+        for m in pipeline.db_modules:
+            for _f in m.db_functions:
+                if _f.db_id == f_id:
+                    module_id = m.db_id
+                    f_name = _f.db_name
+                    continue
+        if not (module_id and f_name):
+            break
+        parameters = []
+        for p in f.getElementsByTagName('param'):
+            # we need to convert function id:s to (module_id, port_name)
+            p_id = long(p.attributes['id'].value)
+            p_pos = None
+            for m in pipeline.db_modules:
+                for _f in m.db_functions:
+                    for _p in _f.db_parameters:
+                        if _p.db_id == p_id:
+                            p_pos = _p.db_pos
+                        continue
+            if p_pos is None:
+                break
+            p_intType = str(p.attributes['interp'].value)
+            if p_intType in ['Linear Interpolation']:
+                p_min = str(p.attributes['min'].value)
+                p_max = str(p.attributes['max'].value)
+                value = "[%s, %s]" % (p_min, p_max)
+            if p_intType in ['RGB Interpolation', 'HSV Interpolation']:
+                p_min = str(p.attributes['min'].value)
+                p_max = str(p.attributes['max'].value)
+                value = '["%s", "%s"]' % (p_min, p_max)
+            elif p_intType == 'List':
+                value = str(p.attributes['values'].value)
+            elif p_intType == 'User-defined Function':
+                # Set function code
+                value = str(p.attributes['code'].value)
+            param = DBPEParameter(id=vistrail.idScope.getNewId(DBPEParameter.vtType),
+                                  pos=p_pos,
+                                  interpolator=p_intType,
+                                  value=value,
+                                  dimension=int(p.attributes['dim'].value))
+            parameters.append(param)
+        f_is_alias = (str(f.attributes['alias'].value) == 'True')
+        function = DBPEFunction(id=vistrail.idScope.getNewId(DBPEFunction.vtType),
+                                module_id=module_id,
+                                port_name=f_name,
+                                is_alias=1 if f_is_alias else 0,
+                                parameters=parameters)
+        functions.append(function)
+    pe = DBParameterExploration(id=vistrail.idScope.getNewId(DBParameterExploration.vtType),
+                                action_id=action_id,
+                                dims=str(xmlDoc.attributes['dims'].value),
+                                layout=str(xmlDoc.attributes['layout'].value),
+                                date=str(xmlDoc.attributes['date'].value),
+                                functions = functions)
+    return pe
+
+
+def translateVistrail(_vistrail):
+    """ Translate old annotation based vistrail variables to new
+        DBVistrailVariable class """
+    global id_scope
+
+    new_vistrail_vars = []
+    new_param_exps = []
+
+    def update_workflow(old_obj, trans_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, 
+                                         trans_dict, DBWorkflow())
+
+    def update_operations(old_obj, trans_dict):
+        new_ops = []
+        for obj in old_obj.db_operations:
+            if obj.vtType == 'delete':
+                new_ops.append(DBDelete.update_version(obj, trans_dict))
+            elif obj.vtType == 'add':
+                if obj.db_what == 'portSpec':
+                    trans_dict['DBAdd'] = {'data': update_portSpec_op}
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+                    del trans_dict['DBAdd']
+                else:
+                    new_op = DBAdd.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+            elif obj.vtType == 'change':
+                if obj.db_what == 'portSpec':
+                    trans_dict['DBChange'] = {'data': update_portSpec_op}
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+                    del trans_dict['DBChange']
+                else:
+                    new_op = DBChange.update_version(obj, trans_dict)
+                    new_ops.append(new_op)
+        return new_ops
+    
+    def update_annotations(old_obj, trans_dict):
+        new_annotations = []
+        for a in old_obj.db_annotations:
+            if a.db_key == '__vistrail_vars__':
+                for name, data in dict(eval(a.db_value)).iteritems():
+                    uuid, identifier, value = data
+                    package, module, namespace = identifier
+                    var = DBVistrailVariable(name, uuid, package, module, 
+                                             namespace, value)
+                    new_vistrail_vars.append(var)
+            else:
+                new_a = DBAnnotation.update_version(a, trans_dict)
+                new_annotations.append(new_a)
+
+        return new_annotations
+
+    def update_actionAnnotations(old_obj, trans_dict):
+        new_actionAnnotations = []
+        for aa in old_obj.db_actionAnnotations:
+            if aa.db_key == '__paramexp__':
+                pe = createParameterExploration(aa.db_action_id, aa.db_value, 
+                                                vistrail)
+                new_param_exps.append(pe)
+            else:
+                new_aa = DBActionAnnotation.update_version(aa, trans_dict)
+                new_actionAnnotations.append(new_aa)
+        return new_actionAnnotations
+
+    translate_dict = {'DBModule': {'portSpecs': update_portSpecs},
+                      'DBModuleDescriptor': {'portSpecs': update_portSpecs},
+                      'DBAction': {'operations': update_operations},
+                      'DBGroup': {'workflow': update_workflow},
+                      'DBVistrail': {'annotations': update_annotations,
+                                     'actionAnnotations': \
+                                         update_actionAnnotations}
+                      }
+    vistrail = DBVistrail()
+    id_scope = vistrail.idScope
+    vistrail = DBVistrail.update_version(_vistrail, translate_dict, vistrail)
+    for v in new_vistrail_vars:
+        vistrail.db_add_vistrailVariable(v)
+    for pe in new_param_exps:
+        vistrail.db_add_parameter_exploration(pe)
+
+    vistrail.db_version = '1.0.3'
+    return vistrail
+
+def translateWorkflow(_workflow):
+    global id_scope
+    def update_workflow(old_obj, translate_dict):
+        return DBWorkflow.update_version(old_obj.db_workflow, translate_dict)
+    translate_dict = {'DBModule': {'portSpecs': update_portSpecs},
+                      'DBGroup': {'workflow': update_workflow}}
+
+    workflow = DBWorkflow()
+    id_scope = IdScope(remap={DBAbstraction.vtType: DBModule.vtType, DBGroup.vtType: DBModule.vtType})
+    workflow = DBWorkflow.update_version(_workflow, translate_dict, workflow)
+    workflow.db_version = '1.0.3'
+    return workflow
+
+def translateLog(_log):
+    translate_dict = {}
+    log = DBLog.update_version(_log, translate_dict)
+    log.db_version = '1.0.3'
+    return log
+
+def translateRegistry(_registry):
+    global id_scope
+    translate_dict = {'DBModuleDescriptor': {'portSpecs': update_portSpecs}}
+    registry = DBRegistry()
+    id_scope = registry.idScope
+    registry = DBRegistry.update_version(_registry, translate_dict, registry)
+    registry.db_version = '1.0.3'
+    return registry
+
+class TestTranslate(unittest.TestCase):
+    def testParamexp(self):
+        """test translating parameter explorations from 1.0.2 to 1.0.3"""
+        from vistrails.db.services.io import open_bundle_from_zip_xml
+        from vistrails.core.system import vistrails_root_directory
+        import os
+        (save_bundle, vt_save_dir) = open_bundle_from_zip_xml(DBVistrail.vtType, \
+                        os.path.join(vistrails_root_directory(),
+                        'tests/resources/paramexp-1.0.2.vt'))
+        vistrail = translateVistrail(save_bundle.vistrail)
+        pes = vistrail.db_get_parameter_explorations()
+        self.assertEqual(len(pes), 1)
+        funs = pes[0].db_functions
+        self.assertEqual(set([f.db_port_name for f in funs]),
+                         set(['SetCoefficients', 'SetBackgroundWidget']))
+        parameters = funs[0].db_parameters
+        self.assertEqual(len(parameters), 10)
+        
+    def testVistrailvars(self):
+        """test translating vistrail variables from 1.0.2 to 1.0.3"""
+        from vistrails.db.services.io import open_bundle_from_zip_xml
+        from vistrails.core.system import vistrails_root_directory
+        import os
+        (save_bundle, vt_save_dir) = open_bundle_from_zip_xml(DBVistrail.vtType, \
+                        os.path.join(vistrails_root_directory(),
+                        'tests/resources/visvar-1.0.2.vt'))
+        vistrail = translateVistrail(save_bundle.vistrail)
+        visvars = vistrail.db_vistrailVariables
+        self.assertEqual(len(visvars), 2)
+        self.assertNotEqual(visvars[0].db_name, visvars[1].db_name)
+
+if __name__ == '__main__':
+    from vistrails.gui.application import start_application
+    v = start_application({'interactiveMode': False,
+                           'nologger': True,
+                           'singleInstance': False,
+                           'fixedSpreadsheetCells': True})
+    unittest.main()
diff --git a/vistrails/gui/__init__.py b/vistrails/gui/__init__.py
new file mode 100644
index 0000000..fac3164
--- /dev/null
+++ b/vistrails/gui/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
diff --git a/vistrails/gui/application.py b/vistrails/gui/application.py
new file mode 100644
index 0000000..48a71d8
--- /dev/null
+++ b/vistrails/gui/application.py
@@ -0,0 +1,853 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This is the main application of vistrail, it will calls for
+initializations to the theme, packages and the builder...
+
+"""
+from PyQt4 import QtGui, QtCore, QtNetwork
+from vistrails.core.application import VistrailsApplicationInterface, \
+    get_vistrails_application, set_vistrails_application
+from vistrails.core import command_line
+from vistrails.core import debug
+from vistrails.core import system
+from vistrails.core.application import APP_SUCCESS, APP_FAIL, APP_DONE
+from vistrails.core.db.locator import FileLocator, DBLocator
+import vistrails.core.requirements
+from vistrails.db import VistrailsDBException
+import vistrails.db.services.io
+from vistrails.gui import qt
+import vistrails.gui.theme
+import os.path
+import getpass
+import re
+import sys
+
+################################################################################
+
+class VistrailsApplicationSingleton(VistrailsApplicationInterface,
+                                    QtGui.QApplication):
+    """
+    VistrailsApplicationSingleton is the singleton of the application,
+    there will be only one instance of the application during VisTrails
+    
+    """
+    
+    def __call__(self):
+        """ __call__() -> VistrailsApplicationSingleton
+        Return self for calling method
+        
+        """
+        if not self._initialized and not self._is_running:
+            self.init()
+        return self
+
+    def __init__(self):
+        # font bugfix for Qt 4.8 and OS X 10.9
+        import platform
+        if platform.system()=='Darwin':
+            release = platform.mac_ver()[0].split('.')
+            if len(release)>=2 and int(release[0])*100+int(release[1])>=1009:
+                QtGui.QFont.insertSubstitution(".Lucida Grande UI", "Lucida Grande")
+        QtGui.QApplication.__init__(self, sys.argv)
+        VistrailsApplicationInterface.__init__(self)
+
+        if system.systemType in ['Darwin']:
+            self.installEventFilter(self)
+        self.builderWindow = None
+        # local notifications
+        self.window_notifications = {}
+        self.view_notifications = {}
+
+        if QtCore.QT_VERSION < 0x40200: # 0x40200 = 4.2.0
+            raise vistrails.core.requirements.MissingRequirement("Qt version >= 4.2")
+        self._is_running = False
+        self.shared_memory = None
+        self.local_server = None
+        self.setAttribute(QtCore.Qt.AA_DontShowIconsInMenus)
+        qt.allowQObjects()
+
+    def run_single_instance(self):
+        # code for single instance of the application
+        # based on the C++ solution available at
+        # http://wiki.qtcentre.org/index.php?title=SingleApplication
+        if QtCore.QT_VERSION >= 0x40400:
+            self.timeout = 600000
+            self._unique_key = os.path.join(system.home_directory(),
+                       "vistrails-single-instance-check-%s"%getpass.getuser())
+            self.shared_memory = QtCore.QSharedMemory(self._unique_key)
+            self.local_server = None
+            if self.shared_memory.attach():
+                self._is_running = True
+
+                local_socket = QtNetwork.QLocalSocket(self)
+                local_socket.connectToServer(self._unique_key)
+                if not local_socket.waitForConnected(self.timeout):
+                    debug.critical(
+                            "Connection failed: %s\n"
+                            "Removing socket" % (local_socket.errorString()))
+                    try:
+                        os.remove(self._unique_key)
+                    except OSError, e:
+                        debug.critical("Couldn't remove socket: %s (%s)" % (
+                                       self._unique_key, e))
+
+                else:
+                    if self.found_another_instance_running(local_socket):
+                        return APP_DONE # success, we should shut down
+                    else:
+                        return APP_FAIL  # error, we should shut down
+
+            if not self.shared_memory.create(1):
+                debug.critical("Unable to create single instance "
+                               "of vistrails application")
+                return
+            self.local_server = QtNetwork.QLocalServer(self)
+            self.connect(self.local_server, QtCore.SIGNAL("newConnection()"),
+                         self.message_received)
+            if self.local_server.listen(self._unique_key):
+                debug.log("Listening on %s"%self.local_server.fullServerName())
+            else:
+                # This usually happens when vistrails have crashed
+                # Delete the key and try again
+                self.shared_memory.detach()
+                self.local_server.close()
+                if os.path.exists(self._unique_key):
+                    os.remove(self._unique_key)
+
+                self.shared_memory = QtCore.QSharedMemory(self._unique_key)
+                self.local_server = None
+
+                if not self.shared_memory.create(1):
+                    debug.critical("Unable to create single instance "
+                                   "of vistrails application")
+                    return
+                self.local_server = QtNetwork.QLocalServer(self)
+                self.connect(self.local_server, QtCore.SIGNAL("newConnection()"),
+                             self.message_received)
+                if self.local_server.listen(self._unique_key):
+                    debug.log("Listening on %s"%self.local_server.fullServerName())
+                else:
+                    debug.warning(
+                            "Server is not listening. This means it "
+                            "will not accept parameters from other "
+                            "instances")
+
+        return None
+
+    def found_another_instance_running(self, local_socket):
+        debug.critical("Found another instance of VisTrails running")
+        msg = bytes(sys.argv[1:])
+        debug.critical("Will send parameters to main instance %s" % msg)
+        res = self.send_message(local_socket, msg)
+        if res is True:
+            debug.critical("Main instance succeeded")
+            return True
+        elif res is False:
+            return False
+        else:
+            debug.critical("Main instance reports: %s" % res)
+            return False
+
+    def init(self, optionsDict=None):
+        """ VistrailsApplicationSingleton(optionDict: dict)
+                                          -> VistrailsApplicationSingleton
+        Create the application with a dict of settings
+        
+        """
+        vistrails.gui.theme.initializeCurrentTheme()
+        VistrailsApplicationInterface.init(self, optionsDict)
+
+        # singleInstance configuration
+        singleInstance = self.temp_configuration.check('singleInstance')
+        if singleInstance:
+            finished = self.run_single_instance()
+            if finished is not None:
+                return finished
+
+        interactive = self.temp_configuration.check('interactiveMode')
+        if interactive:
+            self.setIcon()
+            self.createWindows()
+            self.processEvents()
+
+        self.vistrailsStartup.init()
+        # ugly workaround for configuration initialization order issue
+        # If we go through the configuration too late,
+        # The window does not get maximized. If we do it too early,
+        # there are no created windows during spreadsheet initialization.
+        if interactive:
+            if  self.temp_configuration.check('maximizeWindows'):
+                self.builderWindow.showMaximized()
+            if self.temp_configuration.check('dbDefault'):
+                self.builderWindow.setDBDefault(True)
+        self._python_environment = self.vistrailsStartup.get_python_environment()
+        self._initialized = True
+
+        # default handler installation
+        if system.systemType == 'Linux':
+            if not (self.temp_configuration.check('handlerDontAsk') or
+                    self.configuration.check('handlerDontAsk')):
+                if not linux_default_application_set():
+                    self.ask_update_default_application()
+
+        if interactive:
+            self.interactiveMode()
+        else:
+            r = self.noninteractiveMode()
+            return APP_SUCCESS if r is True else APP_FAIL
+        return APP_SUCCESS
+
+    def ask_update_default_application(self, dont_ask_checkbox=True):
+        dialog = QtGui.QDialog()
+        dialog.setWindowTitle(u"Install .vt .vtl handler")
+        layout = QtGui.QVBoxLayout()
+        dialog.setLayout(layout)
+        layout.addWidget(QtGui.QLabel(u"Install VisTrails as default handler "
+                                      u"to open .vt and .vtl files?"))
+        if dont_ask_checkbox:
+            dont_ask = QtGui.QCheckBox(u"Don't ask on startup")
+            dont_ask_setting = self.configuration.check('handlerDontAsk')
+            dont_ask.setChecked(dont_ask_setting)
+            layout.addWidget(dont_ask)
+        buttons = QtGui.QDialogButtonBox(
+                QtGui.QDialogButtonBox.Yes | QtGui.QDialogButtonBox.No)
+        layout.addWidget(buttons)
+        QtCore.QObject.connect(buttons, QtCore.SIGNAL('accepted()'),
+                     dialog, QtCore.SLOT('accept()'))
+        QtCore.QObject.connect(buttons, QtCore.SIGNAL('rejected()'),
+                     dialog, QtCore.SLOT('reject()'))
+
+        res = dialog.exec_()
+        if dont_ask_checkbox:
+            if dont_ask.isChecked() != dont_ask_setting:
+                self.configuration.handlerDontAsk = dont_ask.isChecked()
+                self.configuration.handlerDontAsk = dont_ask.isChecked()
+        if res != QtGui.QDialog.Accepted:
+            return False
+        if system.systemType == 'Linux':
+            if not linux_update_default_application():
+                QtGui.QMessageBox.warning(
+                        None,
+                        u"Install .vt .vtl handler",
+                        u"Couldn't set VisTrails as default handler "
+                        u"to open .vt and .vtl files")
+                return False
+        else:
+            QtGui.QMessageBox.warning(
+                    None,
+                    u"Install .vt .vtl handler",
+                    u"Can't install a default handler on this platform")
+            return False
+        return True
+
+    def is_running_gui(self):
+        return True
+
+    def get_current_controller(self):
+        return self.builderWindow.get_current_controller()
+    get_controller = get_current_controller
+
+    def get_vistrail(self):
+        if self.get_controller():
+            return self.get_controller().vistrail
+        return None
+
+    def ensure_vistrail(self, locator):
+        view = self.builderWindow.ensureVistrail(locator)
+        if view is not None:
+            return view.controller
+        return None
+
+    def add_vistrail(self, *objs):
+        return self.builderWindow.add_vistrail(*objs)
+
+    def remove_vistrail(self, locator=None):
+        return self.builderWindow.remove_vistrail(locator)
+
+    def select_version(self, version):
+        return self.builderWindow.select_version(version)
+
+    def update_locator(self, old_locator, new_locator):
+        pass
+
+    def create_notification(self, notification_id, window=None, view=None):
+        if view is not None:
+            if view not in self.view_notifications:
+                self.view_notifications[view] = {}
+            notifications = self.view_notifications[view]
+        elif window is not None:
+            if window not in self.window_notifications:
+                self.window_notifications[window] = {}
+            notifications = self.window_notifications[window]
+        else:
+            notifications = self.notifications
+        if notification_id not in notifications:
+            notifications[notification_id] = set()
+        # else:
+        #     print "already added notification", notification_id
+
+    def register_notification(self, notification_id, method, window=None,
+                              view=None):
+        if view is not None:
+            if view not in self.view_notifications:
+                self.view_notifications[view] = {}
+            notifications = self.view_notifications[view]
+            #print '>>> LOCAL adding notification', notification_id, view, method
+            #print id(notifications), notifications
+            #for n, o in notifications.iteritems():
+            #    print "    ", n , "(%s)"%len(o)
+            #    for m in o:
+            #        print "        ", m
+        elif window is not None:
+            if window not in self.window_notifications:
+                self.window_notifications[window] = {}
+            notifications = self.window_notifications[window]
+        else:
+            notifications = self.notifications     
+            #print '>>> GLOBAL adding notification', notification_id, method  
+            #print id(notifications), notifications
+        if notification_id not in notifications:
+            self.create_notification(notification_id, window, view)
+        notifications[notification_id].add(method)
+
+    def unregister_notification(self, notification_id, method, window=None,
+                                view=None):
+        if view is not None:
+            if view in self.view_notifications:
+                notifications = self.view_notifications[view]
+            else:
+                notifications = {}
+                #print '>>> LOCAL remove notification', notification_id, view
+            
+            #print id(notifications), notifications
+#            for n, o in notifications.iteritems():
+#                print "    ", n , "(%s)"%len(o)
+#                for m in o:
+#                    print "        ", m
+        elif window is not None:
+            if window in self.window_notifications:
+                notifications = self.window_notifications[window]
+            else:
+                notifications = {}
+        else:
+            notifications = self.notifications    
+            #print '>>> GLOBAL remove notification', notification_id, method   
+            #print id(notifications), notifications           
+        if notification_id in notifications:
+            notifications[notification_id].remove(method)
+
+    def send_notification(self, notification_id, *args):
+        # do global notifications
+        if notification_id in self.notifications:
+            for m in self.notifications[notification_id]:
+                try:
+                    m(*args)
+                except Exception:
+                    import traceback
+                    traceback.print_exc()
+        notifications = {}
+
+        current_window = self.builderWindow
+
+        # do window notifications
+        if current_window in self.window_notifications:
+            notifications = self.window_notifications[current_window]
+
+            if notification_id in notifications:
+                for m in notifications[notification_id]:
+                    try:
+                        m(*args)
+                    except Exception:
+                        import traceback
+                        traceback.print_exc()
+
+        if current_window is not None:
+            current_view = current_window.current_view
+        else:
+            current_view = None
+        # do local notifications
+        if current_view in self.view_notifications:
+            notifications = self.view_notifications[current_view]
+
+            if notification_id in notifications:
+                for m in notifications[notification_id]:
+                    try:
+                        m(*args)
+                    except Exception:
+                        import traceback
+                        traceback.print_exc()
+
+    def showBuilderWindow(self):
+        # in some systems (Linux and Tiger) we need to make both calls
+        # so builderWindow is activated
+        self.setActiveWindow(self.builderWindow)
+        self.builderWindow.activateWindow()
+        self.builderWindow.show()
+        self.builderWindow.raise_()
+    
+    def interactiveMode(self):
+        """ interactiveMode() -> None
+        Instantiate the GUI for interactive mode
+        
+        """
+        if self.temp_configuration.check('showSplash'):
+            self.splashScreen.finish(self.builderWindow)
+            debug.DebugPrint.getInstance().register_splash(None)
+            self.splashScreen = None
+        # self.builderWindow.modulePalette.updateFromModuleRegistry()
+        # self.builderWindow.modulePalette.connect_registry_signals()
+        self.builderWindow.link_registry()
+        
+        self.process_interactive_input()
+        if not self.temp_configuration.showSpreadsheetOnly:
+            self.showBuilderWindow()
+        else:
+            self.builderWindow.hide()
+        self.builderWindow.create_first_vistrail()
+        self.builderWindow.check_running_jobs()
+
+    def noninteractiveMode(self):
+        """ noninteractiveMode() -> None
+        Run the console in non-interactive mode
+        
+        """
+        usedb = False
+        if self.temp_db_options.host:
+            usedb = True
+            passwd = ''
+        if usedb and self.temp_db_options.user:
+            if self.temp_db_options.user:
+                db_config = dict((x, self.temp_db_options.__dict__[x])
+                                 for x in ['host', 'port', 
+                                           'db', 'user'])
+                try:
+                    vistrails.db.services.io.test_db_connection(db_config)
+                except VistrailsDBException:
+                    passwd = \
+                        getpass.getpass("Connecting to %s:%s. Password for user '%s':" % (
+                                        self.temp_db_options.host,
+                                        self.temp_db_options.db,
+                                        self.temp_db_options.user))
+                    db_config['passwd'] = passwd
+                    try:
+                        vistrails.db.services.io.test_db_connection(db_config)
+                    except VistrailsDBException:
+                        debug.critical("Cannot login to database")
+                        return False
+    
+        if self.input:
+            w_list = []
+            vt_list = []
+            for filename in self.input:
+                f_name, version = self._parse_vtinfo(filename, not usedb)
+                if not f_name:
+                    debug.critical("File not found: %s" % filename)
+                    return False
+                if not usedb:
+                    locator = FileLocator(os.path.abspath(f_name))
+                else:
+                    locator = DBLocator(host=self.temp_db_options.host,
+                                        port=self.temp_db_options.port,
+                                        database=self.temp_db_options.db,
+                                        user=self.temp_db_options.user,
+                                        passwd=passwd,
+                                        obj_id=f_name,
+                                        obj_type=None,
+                                        connection_id=None)
+                    if not locator.is_valid():
+                        #here there is a problem: as we allow execution from 
+                        #command line with VisTrails already running, we need
+                        #to update from the gui
+                        if hasattr(self, 'builderWindow'):
+                            ok = locator.update_from_gui(self.builderWindow)
+                        else:
+                            ok = locator.update_from_console()
+                        if not ok:
+                            debug.critical("Cannot login to database")
+                w_list.append((locator, version))
+                vt_list.append(locator)
+            import vistrails.core.console_mode
+            if self.temp_db_options.parameters == None:
+                self.temp_db_options.parameters = ''
+            
+            errs = []
+            if self.temp_configuration.check('workflowGraph'):
+                workflow_graph = self.temp_configuration.workflowGraph
+                results = vistrails.core.console_mode.get_wf_graph(w_list, workflow_graph,
+                                     self.temp_configuration.spreadsheetDumpPDF)
+                for r in results:
+                    if r[0] == False:
+                        errs.append("Error generating workflow graph: %s" % \
+                                    r[1])
+                        debug.critical("*** Error in get_wf_graph: %s" % r[1])
+            
+            if self.temp_configuration.check('evolutionGraph'):
+                evolution_graph = self.temp_configuration.evolutionGraph
+                results = vistrails.core.console_mode.get_vt_graph(vt_list, evolution_graph,
+                                     self.temp_configuration.spreadsheetDumpPDF)
+                for r in results:
+                    if r[0] == False:
+                        errs.append("Error generating vistrail graph: %s" % \
+                                    r[1])
+                        debug.critical("*** Error in get_vt_graph: %s" % r[1])
+                
+            if self.temp_configuration.check('workflowInfo'):
+                workflow_info = self.temp_configuration.workflowInfo
+            else:
+                workflow_info = None
+
+            extra_info = None
+            if self.temp_configuration.check('spreadsheetDumpCells'):
+                extra_info = \
+                {'pathDumpCells': self.temp_configuration.spreadsheetDumpCells}
+            if self.temp_configuration.check('spreadsheetDumpPDF'):
+                if extra_info is None:
+                    extra_info = {}
+                extra_info['pdf'] = self.temp_configuration.spreadsheetDumpPDF
+
+            if self.temp_configuration.check('parameterExploration'):
+                errs.extend(
+                    vistrails.core.console_mode.run_parameter_explorations(
+                        w_list, extra_info=extra_info))
+            else:
+                errs.extend(vistrails.core.console_mode.run(w_list,
+                                      self.temp_db_options.parameters,
+                                      workflow_info, update_vistrail=True,
+                                      extra_info=extra_info))
+            if len(errs) > 0:
+                for err in errs:
+                    debug.critical("*** Error in %s:%s:%s -- %s" % err)
+                return [False, ["*** Error in %s:%s:%s -- %s" % err for err in errs]]
+            return True
+        else:
+            debug.warning("no input vistrails provided")
+            return True
+
+    def setIcon(self):
+        """ setIcon() -> None
+        Setup Vistrail Icon
+        """
+        self.setWindowIcon(vistrails.gui.theme.CurrentTheme.APPLICATION_ICON)
+        
+    def setupSplashScreen(self):
+        """ setupSplashScreen() -> None
+        Create the splash-screen at startup
+        
+        """
+        if self.temp_configuration.check('showSplash'):
+            splashPath = (system.vistrails_root_directory() +
+                          "/gui/resources/images/vistrails_splash.png")
+            pixmap = QtGui.QPixmap(splashPath)
+            self.splashScreen = QtGui.QSplashScreen(pixmap, QtCore.Qt.WindowStaysOnTopHint)
+            self.splashScreen.setFont(vistrails.gui.theme.CurrentTheme.SPLASH_SCREEN_FONT)
+            debug.DebugPrint.getInstance().register_splash(self)
+            self.splashScreen.show()
+            
+    def splashMessage(self, msg):
+        if hasattr(self, "splashScreen"):
+            self.splashScreen.showMessage(msg,
+                        QtCore.Qt.AlignBottom|QtCore.Qt.AlignLeft,
+                        QtCore.Qt.white)
+            self.processEvents()
+
+    def createWindows(self):
+        """ createWindows() -> None
+        Create and configure all GUI widgets including the builder
+        
+        """
+        self.setupSplashScreen()
+
+        # This is so that we don't import too many things before we
+        # have to. Otherwise, requirements are checked too late.
+        # from gui.builder_window import QBuilderWindow
+        from vistrails.gui.vistrails_window import QVistrailsWindow
+
+        # self.builderWindow = QBuilderWindow()
+        self.builderWindow = QVistrailsWindow()
+        if not self.temp_configuration.showSpreadsheetOnly:
+            # self.builderWindow.show()
+            # self.setActiveWindow(self.builderWindow)
+            pass
+
+    def finishSession(self):
+        if QtCore.QT_VERSION >= 0x40400 and self.shared_memory is not None:
+            self.shared_memory.detach()
+            if self.local_server:
+                self.local_server.close()
+        if system.systemType in ['Darwin']:
+            self.removeEventFilter(self)
+        VistrailsApplicationInterface.finishSession(self)
+   
+    def eventFilter(self, o, event):
+        """eventFilter(obj,event)-> boolean
+        This will filter all create events and will set on the WA_MacMetalStyle
+        attribute of a QWidget. It will also filter the FileOpen events on a Mac
+        
+        """
+        metalstyle = self.temp_configuration.check('useMacBrushedMetalStyle')
+        if metalstyle:
+            if QtCore.QT_VERSION < 0x40500:    
+                create_event = QtCore.QEvent.Create
+                mac_attribute = QtCore.Qt.WA_MacMetalStyle
+            else:
+                create_event = 15
+                mac_attribute = QtCore.Qt.WA_MacBrushedMetal
+            if (event.type() == create_event and
+                    isinstance(o, QtGui.QWidget) and
+                    not isinstance(o, QtGui.QSplashScreen) and
+                    not (o.windowFlags() & QtCore.Qt.Popup)):
+                o.setAttribute(mac_attribute)
+        if event.type() == QtCore.QEvent.FileOpen:
+            self.input = [str(event.file())]
+            self.process_interactive_input()
+        return QtGui.QApplication.eventFilter(self,o,event)
+    
+    def is_running(self):
+        return self._is_running
+
+    def message_received(self):
+        if QtCore.QT_VERSION >= 0x40400:
+            local_socket = self.local_server.nextPendingConnection()
+            if not local_socket.waitForReadyRead(self.timeout):
+                debug.critical("Read error: %s" %
+                               local_socket.errorString())
+                return
+            byte_array = local_socket.readAll()
+            self.temp_db_options = None
+            self.temp_configuration.workflowGraph = None
+            self.temp_configuration.workflowInfo = None
+            self.temp_configuration.evolutionGraph = None
+            self.temp_configuration.spreadsheetDumpPDF = False
+            self.temp_configuration.spreadsheetDumpCells = None
+            self.temp_configuration.executeWorkflows = False
+            self.temp_configuration.interactiveMode = True
+            
+            try:
+                result = self.parse_input_args_from_other_instance(str(byte_array))
+            except Exception, e:
+                import traceback
+                debug.critical("Unknown error: %s" % str(e))
+                result = traceback.format_exc()
+            if None == result:
+                result = True
+            if True == result:
+                result = "Command Completed"
+            elif False == result:
+                result = "Command Failed"
+            elif type(result) == list:
+                result = '\n'.join(result[1])
+            self.shared_memory.lock()
+            local_socket.write(bytes(result))
+            self.shared_memory.unlock()
+            if not local_socket.waitForBytesWritten(self.timeout):
+                debug.critical("Writing failed: %s" %
+                            local_socket.errorString())
+                return
+            local_socket.disconnectFromServer()
+
+    def send_message(self, local_socket, message):
+        self.shared_memory.lock()
+        local_socket.write(message)
+        self.shared_memory.unlock()
+        if not local_socket.waitForBytesWritten(self.timeout):
+            debug.critical("Writing failed: %s" %
+                           local_socket.errorString())
+            return False
+        if not local_socket.waitForReadyRead(self.timeout):
+            debug.critical("Read error: %s" %
+                           local_socket.errorString())
+            return False
+        byte_array = local_socket.readAll()
+        result = str(byte_array)
+        debug.log("Other instance processed input (%s)"%result)
+        if result != 'Command Completed':
+            debug.critical(result)
+        else:
+            local_socket.disconnectFromServer()
+            return True
+        local_socket.disconnectFromServer()
+        return False
+
+    def parse_input_args_from_other_instance(self, msg):
+        options_re = re.compile(r"^(\[('([^'])*', ?)*'([^']*)'\])|(\[\s?\])$")
+        if options_re.match(msg):
+            #it's safe to eval as a list
+            args = eval(msg)
+            if isinstance(args, list):
+                #print "args from another instance %s"%args
+                try:
+                    command_line.CommandLineParser.init_options(args)
+                except SystemExit:
+                    debug.critical("Invalid options: %s" % ' '.join(args))
+                    return False
+                self.readOptions()
+                interactive = self.temp_configuration.check('interactiveMode')
+                if interactive:
+                    result = self.process_interactive_input()
+                    if not self.temp_configuration.showSpreadsheetOnly:
+                        # in some systems (Linux and Tiger) we need to make both calls
+                        # so builderWindow is activated
+                        self.builderWindow.raise_()
+                        self.builderWindow.activateWindow()
+                    return result
+                else:
+                    return self.noninteractiveMode()
+            else:
+                debug.critical("Invalid string: %s" % msg)
+        else:
+            debug.critical("Invalid input: %s" % msg)
+        return False
+
+def linux_default_application_set():
+    """linux_default_application_set() -> True|False|None
+    For Linux - checks if a handler is set for .vt and .vtl files.
+    """
+    command = ['xdg-mime', 'query', 'filetype',
+               os.path.join(system.vistrails_examples_directory(),
+                            'terminator.vt')]
+    try:
+        output = []
+        result = system.execute_cmdline(command, output)
+        if result != 0:
+            # something is wrong, abort
+            debug.warning("Error checking mimetypes: %s" % output[0])
+            return None
+    except OSError, e:
+        debug.warning("Error checking mimetypes: %s" % e.message)
+        return None
+    if 'application/x-vistrails' == output[0].strip():
+        return True
+    return False
+
+def linux_update_default_application():
+    """ update_default_application() -> None
+    For Linux - checks if we should install vistrails as the default
+    application for .vt and .vtl files.
+    If replace is False, don't replace an existing handler.
+
+    Returns True if installation succeeded.
+    """
+    root = system.vistrails_root_directory()
+    home = os.path.expanduser('~')
+
+    # install mime type
+    command = ['xdg-mime', 'install', 
+               os.path.join(system.vistrails_root_directory(),
+                            'gui/resources/vistrails-mime.xml')]
+    output = []
+    try:
+        result = system.execute_cmdline(command, output)
+    except OSError, e:
+        result = None
+    if result != 0:
+        debug.warning("Error running xdg-mime")
+        return False
+
+    command = ['update-mime-database', home + '/.local/share/mime']
+    output = []
+    try:
+        result = system.execute_cmdline(command, output)
+    except OSError, e:
+        result = None
+    if result != 0:
+        debug.warning("Error running update-mime-database")
+        return False
+
+    # install icon
+    command = ['xdg-icon-resource', 'install',
+               '--context', 'mimetypes',
+               '--size', '48',
+               os.path.join(system.vistrails_root_directory(),
+                            'gui/resources/images/vistrails_icon_small.png'),
+               'application-x-vistrails']
+    output = []
+    try:
+        result = system.execute_cmdline(command, output)
+    except OSError, e:
+        result = None
+    if result != 0:
+        debug.warning("Error running xdg-icon-resource")
+        return True # the handler is set anyway
+
+    # install desktop file
+    dirs = [home + '/.local', home + '/.local/share',
+            home + '/.local/share/applications']
+
+    for d in dirs:
+        if not os.path.isdir(d):
+            os.mkdir(d)
+    desktop = """[Desktop Entry]
+Name=VisTrails
+Exec=python {root}/run.py %f
+Icon={root}/gui/resources/images/vistrails_icon_small.png
+Type=Application
+MimeType=application/x-vistrails
+""".format(root=root)
+    f = open(os.path.join(dirs[2], 'vistrails.desktop'), 'w')
+    f.write(desktop)
+    f.close()
+
+    command = ['update-desktop-database', dirs[2]]
+    output = []
+    try:
+        result = system.execute_cmdline(command, output)
+    except OSError, e:
+        result = None
+    if result != 0:
+        debug.warning("Error running update-desktop-database")
+    return True
+
+# The initialization must be explicitly signalled. Otherwise, any
+# modules importing vis_application will try to initialize the entire
+# app.
+def start_application(optionsDict=None):
+    """Initializes the application singleton."""
+    VistrailsApplication = get_vistrails_application()
+    if VistrailsApplication:
+        debug.critical("Application already started.")
+        return
+    VistrailsApplication = VistrailsApplicationSingleton()
+    set_vistrails_application(VistrailsApplication)
+    x = VistrailsApplication.init(optionsDict)
+    return x
+
+def stop_application():
+    """Stop and finalize the application singleton."""
+    VistrailsApplication = get_vistrails_application()
+    VistrailsApplication.finishSession()
+    VistrailsApplication.save_configuration()
+    VistrailsApplication.destroy()
+    VistrailsApplication.deleteLater()
+
diff --git a/vistrails/gui/application_server.py b/vistrails/gui/application_server.py
new file mode 100644
index 0000000..6acb922
--- /dev/null
+++ b/vistrails/gui/application_server.py
@@ -0,0 +1,2229 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This is the application for vistrails when running as a server. """
+import Queue
+import base64
+import hashlib
+import inspect
+import sys
+import logging
+import logging.handlers
+import os
+import re
+import shutil
+import subprocess
+import tempfile
+import time
+import traceback
+import urllib
+import xmlrpclib
+import ConfigParser
+
+from PyQt4 import QtGui, QtCore
+import SocketServer
+from SimpleXMLRPCServer import SimpleXMLRPCServer
+from datetime import date, datetime
+from time import strptime
+
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core.application import VistrailsApplicationInterface
+import vistrails.gui.theme
+import vistrails.core.application
+from vistrails.gui import qt
+from vistrails.core.db.locator import DBLocator, ZIPFileLocator, FileLocator
+from vistrails.core.db import io
+import vistrails.core.db.action
+
+from vistrails.core.utils import InstanceObject
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core import command_line
+from vistrails.core import system
+from vistrails.core.modules.module_registry import get_module_registry as module_registry
+from vistrails.core import interpreter
+from vistrails.core.packagemanager import get_package_manager
+import vistrails.core.system
+import vistrails.db.services.io
+import gc
+
+import vistrails.core.requirements
+import vistrails.core.console_mode
+
+from vistrails.db.versions import currentVersion
+
+ElementTree = vistrails.core.system.get_elementtree_library()
+
+
+
+################################################################################
+class StoppableXMLRPCServer(SimpleXMLRPCServer):
+    """This class allows a server to be stopped by a external request"""
+    #accessList contains the list of ip addresses and hostnames that can send
+    #request to this server. Change this according to your server
+    global accessList
+
+    allow_reuse_address = True
+    def __init__(self, addr, logger):
+        self.logger = logger
+        SimpleXMLRPCServer.__init__(self, addr)
+
+    def serve_forever(self):
+        self.stop = False
+        while not self.stop:
+            self.handle_request()
+
+    def verify_request(self, request, client_address):
+        if client_address[0] in accessList:
+            self.logger.info("Request from %s allowed!"%str(client_address))
+            return 1
+        else:
+            self.logger.info("Request from %s denied!"%str(client_address))
+            return 0
+
+################################################################################
+
+class ThreadedXMLRPCServer(SocketServer.ThreadingMixIn,
+                           StoppableXMLRPCServer): pass
+"""This is a multithreaded version of the RPC Server. For each request, the
+    server will spawn a thread. Notice that these threads cannot use any Qt
+    related objects because they won't be in the main thread."""
+################################################################################
+
+class RequestHandler(object):
+    """This class will handle all the requests sent to the server.
+    Add new methods here and they will be exposed through the XML-RPC interface
+    """
+    def __init__(self, logger, instances):
+        self.server_logger = logger
+        self.instances = instances
+        self.proxies_queue = None
+        self.instantiate_proxies()
+
+    #proxies
+    def instantiate_proxies(self):
+        """instantiate_proxies() -> None
+        If this server started other instances of VisTrails, this will create
+        the client proxies to connect to them.
+        """
+        if len(self.instances) > 0:
+            self.proxies_queue = Queue.Queue()
+            for uri in self.instances:
+                try:
+                    proxy = xmlrpclib.ServerProxy(uri)
+                    self.proxies_queue.put(proxy)
+                    self.server_logger.info("Instantiated client for %s" % uri)
+                except Exception, e:
+                    self.server_logger.error("Error when instantiating proxy %s" % uri)
+                    self.server_logger.error(str(e))
+    #utils
+    def memory_usage(self):
+        """memory_usage() -> dict
+        Memory usage of the current process in kilobytes. We plan to
+        use this to clear cache on demand later.
+        I believe this works on Linux only.
+        """
+        status = None
+        result = {'peak': 0, 'rss': 0}
+        try:
+            # This will only work on systems with a /proc file system
+            # (like Linux).
+            status = open('/proc/self/status')
+            for line in status:
+                parts = line.split()
+                key = parts[0][2:-1].lower()
+                if key in result:
+                    result[key] = int(parts[1])
+        finally:
+            if status is not None:
+                status.close()
+        return result
+
+    def path_exists_and_not_empty(self, path):
+        """path_exists_and_not_empty(path:str) -> boolean
+        Returns True if given path exists and it's not empty, otherwise returns
+        False.
+        """
+        if os.path.exists(path):
+            n = 0
+            for root, dirs, file_names in os.walk(path):
+                n += len(file_names)
+            if n > 0:
+                return True
+        return False
+
+    def try_ping(self):
+        return 1
+
+    #crowdlabs
+    def get_wf_modules(self, host, port, db_name, vt_id, version):
+        """get_wf_modules(host:str, port:int, db_name:str, vt_id:int,
+                          version:int) -> (return_status, list of dict)
+           Returns a list of information about the modules used in a workflow
+           in a list of dictionaries. The dictionary has the following keys:
+           name, package, documentation.
+        """
+        self.server_logger.info("Request: get_wf_modules(%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id, version))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            v = locator.load().vistrail
+            p = v.getPipeline(long(version))
+
+            if p:
+                result = []
+                for module in p.module_list:
+                    descriptor = module_registry().get_descriptor_by_name(
+                            module.package,
+                            module.name,
+                            module.namespace)
+                    documentation = descriptor.module_documentation(module)
+                    result.append({'name':module.name,
+                                              'package':module.package,
+                                              'documentation':documentation})
+                return (result, 1)
+            else:
+                result = "Pipeline was not materialized"
+                self.server_logger.error(str(result))
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            result = str(e)
+            self.server_logger.error(result)
+            self.server_logger.error(traceback.format_exc())
+        return (result, 0)
+
+    def get_packages(self):
+        """get_packages()-> dict
+        This returns a dictionary with all the packages available in the
+        VisTrails registry.
+        The keys are the package identifier and for each identifier there's a
+        dictionary with modules and description.
+        """
+        self.server_logger.info("Request: get_packages()")
+        try:
+            package_dic = {}
+
+            for package in module_registry().package_list:
+                package_dic[package.identifier] = {}
+                package_dic[package.identifier]['modules'] = []
+                for module in package._db_module_descriptors:
+                    documentation = inspect.getdoc(module.module)
+                    if documentation:
+                        documentation = re.sub('^ *\n', '', documentation.rstrip())
+                    else:
+                        documentation = "(No documentation available)"
+                    package_dic[package.identifier]['modules'].append({'name':module.name,
+                                                                       'package':module.package,
+                                                                       'documentation':documentation})
+                package_dic[package.identifier]['description'] = \
+                        package.description if package.description else "(No description available)"
+            return (package_dic, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_server_packages(self, codepath=None, status=None):
+        """get_server_packages()-> dict
+        This returns a dictionary with all the packages to vistrails with status indicating wether it is loaded.
+        It is also possible to enable/disable a package by passing a package codepath and the desired status on/off
+        The keys are the package identifier.
+        """
+        self.server_logger.info("Request: get_server_packages()")
+
+        messages = []
+        if self.proxies_queue is not None:
+            # collect all proxies:
+            proxies = []
+            while len(proxies) < len(self.instances):
+                self.server_logger.info("Proxies: %s Instances: %s" % (len(proxies), len(self.instances)))
+                if self.proxies_queue.empty():
+                    for p in  proxies:
+                        self.proxies_queue.put(p)
+                    return [[[],
+                        "Not all vistrail instances are free, please try again."], 1]
+                proxies.append(self.proxies_queue.get())
+            for proxy in proxies:
+                try:
+                    if codepath and status is not None:
+                        result, s = proxy.get_server_packages(codepath, status)
+                    else:
+                        result, s = proxy.get_server_packages()
+                except xmlrpclib.ProtocolError, err:
+                    err_msg = ("A protocol error occurred\n"
+                           "URL: %s\n"
+                           "HTTP/HTTPS headers: %s\n"
+                           "Error code: %d\n"
+                           "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+                    self.server_logger.error(err_msg)
+                if s == 0:
+                    messages.append('An error occurred: %s' % result)
+                else:
+                    messages.append(result[1])
+                self.proxies_queue.put(proxy)
+
+        try:
+            pkg_manager = get_package_manager()
+            message = ''
+            if codepath and status is not None:
+                if int(status):
+                    # Try to enable package
+                    try:
+                        pkg_manager.late_enable_package(codepath)
+                        message = "Successfully enabled package '%s'" % codepath
+                    except Exception, e:
+                        message = "Could not enable package '%s': %s %s" % \
+                                         (codepath, str(e), traceback.format_exc())
+                else:
+                    # Try to disable package
+                    if codepath in ["basic_modules", 'abstraction']:
+                        message = "Package '%s' cannot be disabled" % codepath
+                    elif not pkg_manager.can_be_disabled(
+                             pkg_manager.get_package_by_codepath(codepath).identifier):
+                        message = "Package '%s' cannot be disabled because other packages depends on it." % codepath
+                    else:
+                        try:
+                            pkg_manager.remove_package(codepath)
+                            message = "Successfully disabled package '%s'" % codepath
+                        except Exception, e:
+                            message = "Could not disable package '%s': %s %s" % \
+                                      (codepath, str(e), traceback.format_exc())
+            packages = []
+            enabled_pkgs = sorted(pkg_manager.enabled_package_list())
+            enabled_pkg_dict = dict([(pkg.codepath, pkg) for
+                                      pkg in enabled_pkgs])
+            for pkg in sorted([pkg.codepath for pkg in enabled_pkgs]):
+                packages.append([pkg, True])
+            available_pkg_names = [pkg for pkg in 
+                                   sorted(pkg_manager.available_package_names_list())
+                                   if pkg not in enabled_pkg_dict]
+            for pkg in available_pkg_names:
+                packages.append([pkg, False])
+
+            if codepath and messages:
+                # we are the main instance so assemble messages
+                message = ''.join(["Main instance: %s" % message] + \
+                   ["<br/>Instance %s: %s" % (i+1, m) for i, m in
+                                              zip(xrange(len(messages)), messages)])
+            return [[packages, message], 1]
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def add_vt_to_db(self, host, port, db_name, user, vt_filepath, filename,
+                     repository_vt_id, repository_creator, is_local=True):
+        """add_vt_to_db(host:str, port:int, db_name:str, user:str,
+                        vt_filepath:str(or datastream), filename:str,
+                        repository_vt_id:int, repository_creator:str) -> 
+                        (return_status, int)
+        This will add a vistrail in vt_filepath to the the database. If running
+        on a remote machine, vt_filepath will contain vt file data stream.
+        Before adding it it will annotate the vistrail with the 
+        repository_vt_id and repository_creator.
+
+        """
+        try:
+            if is_local:
+                locator = ZIPFileLocator(vt_filepath).load()
+            else:
+                # vt_filepath contains vt file datastream
+                # write to tmp file, read into FileLocator
+                # TODO: can we just read the file stream directly in?
+                (fd, fname) = tempfile.mkstemp(prefix='vt_tmp',
+                                              suffix='.vt')
+                os.close(fd)
+                try:
+                    vt_file = open(fname, "wb")
+                    vt_file.write(vt_filepath.data)
+                    vt_file.close()
+                    locator = ZIPFileLocator(fname).load()
+                finally:
+                    os.unlink(fname)
+
+            # set some crowdlabs id info
+            if repository_vt_id != -1:
+                vistrail = locator.vistrail
+                vistrail.set_annotation('repository_vt_id', repository_vt_id)
+                vistrail.set_annotation('repository_creator', repository_creator)
+
+            db_locator = DBLocator(host=host, port=int(port), database=db_name,
+                                   name=filename, user=db_write_user, passwd=db_write_pass)
+            db_locator.save_as(locator)
+            return (db_locator.obj_id, 1)
+
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def merge_vt(self, host, port, db_name, user, new_vt_filepath,
+                 old_db_vt_id, is_local=True):
+        """
+        Merge new_vt (new_vt_filepath) with current vt (old_db_vt_id)
+
+        new_vt_filepath is either filepath to vt, or datastream of vt,
+        depending on if the server is on a remote machine
+        """
+        self.server_logger.info("Request: merge_vt(%s,%s,%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, user, new_vt_filepath,
+                                 old_db_vt_id, is_local))
+        try:
+            tmp_file = None
+            if is_local:
+                new_locator = ZIPFileLocator(new_vt_filepath)
+            else:
+                # vt_filepath contains vt file datastream
+                # write to tmp file, read into FileLocator
+                # TODO: can we just read the file stream directly in?
+                (fd, tmp_file) = tempfile.mkstemp(prefix='vt_tmp',
+                                              suffix='.vt')
+                os.close(fd)
+                vt_file = open(tmp_file, "wb")
+                vt_file.write(new_vt_filepath.data)
+                vt_file.close()
+                new_locator = ZIPFileLocator(tmp_file)
+
+            new_bundle = new_locator.load()
+            new_locator.save(new_bundle)
+            old_db_locator = DBLocator(host=host, port=int(port), database=db_name,
+                                       obj_id=int(old_db_vt_id), user=db_write_user, passwd=db_write_pass)
+            old_db_bundle = old_db_locator.load()
+            vistrails.db.services.vistrail.merge(old_db_bundle, new_bundle, 'vistrails')
+            old_db_locator.save(old_db_bundle)
+            new_locator.save(old_db_bundle)
+            if tmp_file is not None:
+                os.unlink(tmp_file)
+            return (1, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def remove_vt_from_db(self, host, port, db_name, user, vt_id):
+        """remove_vt_from_db(host:str, port:int, db_name:str, user:str,
+                             vt_id:int) -> (return_status, 0 or 1)
+        Remove a vistrail from the repository
+        """
+        config = {}
+        config['host'] = host
+        config['port'] = int(port)
+        config['db'] = db_name
+        config['user'] = db_write_user
+        config['passwd'] = db_write_pass
+        try:
+            conn = vistrails.db.services.io.open_db_connection(config)
+            vistrails.db.services.io.delete_entity_from_db(conn,'vistrail', vt_id)
+            vistrails.db.services.io.close_db_connection(conn)
+            return (1, 1)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            if conn:
+                vistrails.db.services.io.close_db_connection(conn)
+            return (str(e), 0)
+
+    def get_runnable_workflows(self, host, port, db_name, vt_id):
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+            (vistrail, _, _, _)  = io.load_vistrail(locator)
+
+            # get server packages
+            local_packages = [x.identifier for x in \
+                              module_registry().package_list]
+
+            runnable_workflows = []
+            py_source_workflows = []
+            local_data_modules = ['File', 'FileSink', 'Path']
+
+            # find runnable workflows
+            for version_id, version_tag in vistrail.get_tagMap().iteritems():
+                pipeline = vistrail.getPipeline(version_id)
+                workflow_packages = set()
+                on_repo = True
+                has_python_source = False
+                for module in pipeline.module_list:
+                    # count modules that use data unavailable to web repo
+                    if module.name[-6:] == 'Reader' or \
+                       module.name in local_data_modules:
+                        has_accessible_data = False
+                        for edge in pipeline.graph.edges_to(module.id):
+                            # TODO check for RepoSync checksum param
+                            if pipeline.modules[edge[0]].name in \
+                               ['HTTPFile', 'RepoSync']:
+                                has_accessible_data = True
+
+                        if not has_accessible_data:
+                            on_repo = False
+
+                    elif module.name == "PythonSource":
+                        has_python_source = True
+
+                    # get packages used in tagged versions of this VisTrail
+                    workflow_packages.add(module.package)
+
+                # ensure workflow doesn't use unsupported packages
+                if not filter(lambda p: p not in local_packages,
+                              workflow_packages):
+                    if has_python_source and on_repo and \
+                       version_id not in py_source_workflows:
+                        py_source_workflows.append(version_id)
+
+                    elif not has_python_source and on_repo and \
+                            version_id not in runnable_workflows:
+                        runnable_workflows.append(version_id)
+
+            return ((runnable_workflows, py_source_workflows), 1)
+
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            return (str(e), 0)
+
+    #medleys
+    
+    def executeMedley(self, xml_medley, extra_info=None):
+        self.server_logger.info("executeMedley request received")
+        try:
+            self.server_logger.info(xml_medley)
+            xml_string = xml_medley.replace('\\"','"')
+            root = ElementTree.fromstring(xml_string)
+            try:
+                medley = MedleySimpleGUI.from_xml(root)
+            except:
+                #even if this error occurred there's still a chance of
+                # recovering from it... (the server can find cached images)
+                self.server_logger.error("couldn't instantiate medley")
+
+            self.server_logger.debug("%s medley: %s"%(medley._type, medley._name))
+            result = ""
+            subdir = hashlib.sha224(xml_string).hexdigest()
+            path_to_images = \
+               os.path.join(media_dir, 'medleys/images', subdir)
+            if (not self.path_exists_and_not_empty(path_to_images) and
+                self.proxies_queue is not None):
+                #this server can send requests to other instances
+                proxy = self.proxies_queue.get()
+                try:
+                    self.server_logger.info("Sending request to %s" % proxy)
+                    if extra_info is not None:
+                        result = proxy.executeMedley(xml_medley, extra_info)
+                    else:
+                        result = proxy.executeMedley(xml_medley)
+                    self.proxies_queue.put(proxy)
+                    self.server_logger.info("returning %s"% result)
+                    return result
+                except Exception, e:
+                    self.server_logger.error(str(e))
+                    return (str(e), 0)
+
+            if extra_info is None:
+                extra_info = {}
+
+            if extra_info.has_key('pathDumpCells'):
+                if extra_info['pathDumpCells']:
+                    extra_path = extra_info['pathDumpCells']
+            else:
+                extra_info['pathDumpCells'] = path_to_images
+
+            if not self.path_exists_and_not_empty(extra_info['pathDumpCells']):
+                if not os.path.exists(extra_info['pathDumpCells']):
+                    os.mkdir(extra_info['pathDumpCells'])
+                
+                if medley._type == 'vistrail':
+                    locator = DBLocator(host=db_host,
+                                        port=3306,
+                                        database='vistrails',
+                                        user=db_write_user,
+                                        passwd=db_write_pass,
+                                        obj_id=medley._vtid,
+                                        obj_type=None,
+                                        connection_id=None)
+
+                    workflow = medley._version
+                    sequence = False
+                    for (k,v) in medley._alias_list.iteritems():
+                        if v._component._seq == True:
+                            sequence = True
+                            val = XMLObject.convert_from_str(v._component._minVal,
+                                                             v._component._spec)
+                            maxval = XMLObject.convert_from_str(v._component._maxVal,
+                                                             v._component._spec)
+                            #making sure the filenames are generated in order
+                            mask = '%s'
+                            if isinstance(maxval, (int, long)):
+                                mask = '%0' + str(len(v._component._maxVal)) + 'd'
+
+                            while val <= maxval:
+                                s_alias = "%s=%s$&$" % (k,val)
+                                for (k2,v2) in medley._alias_list.iteritems():
+                                    if k2 != k and v2._component._val != '':
+                                        s_alias += "%s=%s$&$" % (k2,v2._component._val)
+                                if s_alias != '':
+                                    s_alias = s_alias[:-3]
+                                    self.server_logger.info("Aliases: %s" % s_alias)
+                                try:
+                                    gc.collect()
+                                    results = \
+                                      vistrails.core.console_mode.run_and_get_results( \
+                                                    [(locator,int(workflow))],
+                                                    s_alias,
+                                                    extra_info=extra_info)
+                                    self.server_logger.info("Memory usage: %s"% self.memory_usage())
+                                    interpreter.cached.CachedInterpreter.flush()
+                                except Exception, e:
+                                    self.server_logger.error(str(e))
+                                    return (str(e), 0)
+                                ok = True
+                                for r in results:
+                                    (objs, errors, _) = (r.objects, r.errors, r.executed)
+                                    for e in errors.itervalues():
+                                        self.server_logger.error("Module failed: %s"% str(e))
+                                    for i in objs.iterkeys():
+                                        if errors.has_key(long(i)):
+                                            ok = False
+                                            result += str(errors[i])
+                                if ok:
+                                    self.server_logger.info("renaming files")
+                                    for root, dirs, file_names in os.walk(extra_info['pathDumpCells']):
+                                        break
+                                    s = []
+                                    for f in file_names:
+                                        if f.lower().endswith(".png"):
+                                            fmask = "%s_"+mask+"%s"
+                                            os.renames(os.path.join(root,f),
+                                                       os.path.join(root,"%s" % f[:-4],
+                                                                    fmask% (f[:-4],val,f[-4:])))
+                                if val < maxval:
+                                    val += XMLObject.convert_from_str(v._component._stepSize,
+                                                                      v._component._spec)
+                                    if val > maxval:
+                                        val = maxval
+                                else:
+                                    break
+
+                    if not sequence:
+                        s_alias = ''
+                        for (k,v) in medley._alias_list.iteritems():
+                            if v._component._val != '':
+                                s_alias += "%s=%s$&$" % (k,v._component._val)
+                        if s_alias != '':
+                            s_alias = s_alias[:-3]
+                            self.server_logger.info("Not sequence aliases: %s"% s_alias)
+                        try:
+                            results = \
+                               vistrails.core.console_mode.run_and_get_results( \
+                                                [(locator,int(workflow))],
+                                                    s_alias,
+                                                    extra_info=extra_info)
+                        except Exception, e:
+                            self.server_logger.error(str(e))
+                            return (str(e), 0)
+                        ok = True
+                        for r in results:
+                            (objs, errors, _) = (r.objects, r.errors, r.executed)
+                            for e in errors.itervalues():
+                                self.server_logger.error(str(e))
+                            for i in objs.iterkeys():
+                                if errors.has_key(long(i)):
+                                    ok = False
+                                    result += str(errors[i])
+
+                    self.server_logger.info( "success?  %s"% ok)
+
+                elif medley._type == 'visit':
+                    cur_dir = os.getcwd()
+                    os.chdir(self.temp_configuration.spreadsheetDumpCells)
+                    if medley._id == 6:
+                        session_file = 'crotamine.session'
+                    elif medley._id == 7:
+                        session_file = '1NTS.session'
+                    else:
+                        session_file = 'head.session'
+                    session_file = '/server/code/visit/saved_sessions/' + session_file
+                    self.server_logger.info("session_file: %s" % session_file)
+                    ok = os.system('/server/code/visit/vistrails_plugin/visit/render-session.sh ' + \
+                                   session_file) == 0
+                    self.server_logger.info( "success?  %s" % ok)
+                    os.chdir(cur_dir)
+            else:
+                self.server_logger.info("Found cached images.")
+                ok = True
+
+            if ok:
+                s = []
+                self.server_logger.info("images path: %s"%extra_info['pathDumpCells'])
+                for root, dirs, file_names in os.walk(extra_info['pathDumpCells']):
+                    sub = []
+                    #n = len(file_names)
+                    #print "%s file(s) generated" % n
+                    file_names.sort()
+                    for f in file_names:
+                        sub.append(os.path.join(root[root.find(subdir):],
+                                              f))
+                    s.append(";".join(sub))
+                result = ":::".join(s)
+                # FIXME: copy images to extra_path
+            self.server_logger.info("returning %s" % result)
+            return (result, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            return (str(e), 0)
+
+    #vistrails
+    def run_from_db(self, host, port, db_name, vt_id, path_to_figures,
+                    version=None,  pdf=False, vt_tag='', build_always=False,
+                    parameters='', is_local=True):
+        self.server_logger.info("Request: run_vistrail_from_db(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id,
+                                 path_to_figures, version, pdf,
+                                 vt_tag, build_always, parameters, is_local))
+
+        self.server_logger.info("path_exists_and_not_empty? %s" % self.path_exists_and_not_empty(path_to_figures))
+        self.server_logger.info("build_always? %s" % build_always)
+        self.server_logger.info(str(self.proxies_queue))
+
+        if not is_local:
+            # use same hashing as on crowdlabs webserver
+            dest_version = "%s_%s_%d_%d_%d" % (host, db_name, int(port), int(vt_id), int(version))
+            dest_version = hashlib.sha1(dest_version).hexdigest()
+            path_to_figures = os.path.join(media_dir, "wf_execution", dest_version)
+
+        if ((not self.path_exists_and_not_empty(path_to_figures) or 
+             build_always) and self.proxies_queue is not None):
+            self.server_logger.info("will forward request")
+            #this server can send requests to other instances
+            proxy = self.proxies_queue.get()
+            try:
+                self.server_logger.info("Sending request to %s" % proxy)
+                result = proxy.run_from_db(host, port, db_name, vt_id,
+                                           path_to_figures, version, pdf, vt_tag,
+                                           build_always, parameters, is_local)
+                self.proxies_queue.put(proxy)
+                self.server_logger.info("returning %s" % result)
+                return result
+            except xmlrpclib.ProtocolError, err:
+                    err_msg = ("A protocol error occurred\n"
+                               "URL: %s\n"
+                               "HTTP/HTTPS headers: %s\n"
+                               "Error code: %d\n"
+                               "Error message: %s\n") % (err.url, err.headers,
+                                                         err.errcode, err.errmsg)
+                    self.server_logger.error(err_msg)
+                    return (str(err), 0)
+            except Exception, e:
+                self.server_logger.error(str(e))
+                return (str(e), 0)
+
+        extra_info = {}
+        extra_info['pathDumpCells'] = path_to_figures
+        self.server_logger.debug(path_to_figures)
+        extra_info['pdf'] = pdf
+        self.server_logger.debug("pdf: %s" % pdf)
+        # execute workflow
+        ok = True
+        if (not self.path_exists_and_not_empty(extra_info['pathDumpCells'])
+            or build_always):
+            if os.path.exists(extra_info['pathDumpCells']):
+                shutil.rmtree(extra_info['pathDumpCells'])
+            os.mkdir(extra_info['pathDumpCells'])
+            
+            result = ''
+            if vt_tag !='':
+                version = vt_tag;
+            try:
+                locator = DBLocator(host=host,
+                                    port=int(port),
+                                    database=db_name,
+                                    user=db_write_user,
+                                    passwd=db_write_pass,
+                                    obj_id=int(vt_id),
+                                    obj_type=None,
+                                    connection_id=None)
+                results = []
+                try:
+                    results = \
+                    vistrails.core.console_mode.run_and_get_results([(locator,
+                                                          int(version))],
+                                                          parameters,
+                                                          update_vistrail=True,
+                                                          extra_info=extra_info,
+                                                          reason="Server Pipeline Execution")
+                except Exception, e:
+                    self.server_logger.error(str(e))
+                    self.server_logger.error(traceback.format_exc())
+                    return (str(e), 0)
+                ok = True
+
+                for r in results:
+                    (objs, errors, _) = (r.objects, r.errors, r.executed)
+
+                    for i in objs.iterkeys():
+                        if errors.has_key(i):
+                            ok = False
+                            result += str(errors[i])
+            except Exception, e:
+                self.server_logger.error(str(e))
+                self.server_logger.error(traceback.format_exc())
+                return (str(e), 0)
+
+        if ok:
+            if is_local:
+                return (1, 1)
+            else:
+                # TODO pdf version
+                images = [im for im in os.listdir(path_to_figures) if im[-3:] == "png"]
+                results = {}
+                for image in images:
+                    handler = open(os.path.join(path_to_figures, image), "rb")
+                    image_data = handler.read()
+                    handler.close()
+                    results[image] = xmlrpclib.Binary(image_data)
+                return (results, 1)
+        else:
+            self.server_logger.error(result)
+            return (result, 0)
+
+    def get_package_list(self):
+        """ get_package_list() -> str
+         Returns a list of supported packages identifiers delimited by || """
+        self.server_logger.info("Request: get_package_list()")
+        try:
+            packages = [x.identifier for x in module_registry().package_list]
+            return (packages, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_wf_datasets(self, host, port, db_name, vt_id, version):
+        self.server_logger.info("Request: get_wf_datasets(%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id, version))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            v = locator.load().vistrail
+            p = v.getPipeline(long(version))
+
+            if p:
+                result = []
+                for module in p.module_list:
+                    if module.name == "RepoSync":
+                        for function in module.functions:
+                            if function.name == 'checksum':
+                                result.append(function.parameters[0].value())
+                return (result, 1)
+            else:
+                result = "Pipeline was not materialized"
+                self.server_logger.error(result)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            result = str(e)
+            self.server_logger.error(result)
+            self.server_logger.error(traceback.format_exc())
+        return (result, 0)
+
+    def get_tag_version(self, host, port, db_name, vt_id, vt_tag):
+        self.server_logger.info("Request: get_tag_version(%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id, vt_tag))
+        version = -1
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            (v, _ , _, _)  = io.load_vistrail(locator)
+            if v.has_tag_str(vt_tag):
+                version = v.get_tag_str(vt_tag).action_id
+            self.server_logger.info("Answer: %s" % version)
+            return (version, 1)
+
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+
+    def get_vt_xml(self, host, port, db_name, vt_id):
+        self.server_logger.info("Request: get_vt_xml(%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            (v, _ , _, _)  = io.load_vistrail(locator)
+            result = io.serialize(v)
+            return (result, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_wf_xml(self, host, port, db_name, vt_id, version):
+        self.server_logger.info("Request: get_wf_xml(%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id, version))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            (v, _ , _, _)  = io.load_vistrail(locator)
+            p = v.getPipeline(long(version))
+            if p:
+                result = io.serialize(p)
+                self.server_logger.info("success")
+                return (result, 1)
+            else:
+                result = "Pipeline was not materialized"
+                self.server_logger.info(result)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            result = str(e)
+            self.server_logger.error(result)
+            self.server_logger.error(traceback.format_exc())
+        return (result, 0)
+
+    def get_wf_graph_pdf(self, host, port, db_name, vt_id, version, is_local=True):
+        """get_wf_graph_pdf(host:str, port:int, db_name:str, vt_id:int,
+                          version:int) -> str
+         Returns the relative url to the generated PDF
+         """
+        self.server_logger.info("get_wf_graph_pdf(%s,%s,%s,%s,%s) request received" % \
+                                (host, port, db_name, vt_id, version))
+        try:
+            vt_id = long(vt_id)
+            version = long(version)
+            subdir = 'workflows'
+            filepath = os.path.join(media_dir, 'graphs', subdir)
+            base_fname = "graph_%s_%s.pdf" % (vt_id, version)
+            filename = os.path.join(filepath,base_fname)
+            if ((not os.path.exists(filepath) or
+                os.path.exists(filepath) and not os.path.exists(filename))
+                and self.proxies_queue is not None):
+                #this server can send requests to other instances
+                proxy = self.proxies_queue.get()
+                try:
+                    result = proxy.get_wf_graph_pdf(host,port,db_name, vt_id, version, is_local)
+                    self.proxies_queue.put(proxy)
+                    self.server_logger.info("get_wf_graph_pdf returning %s"% result)
+                    return result
+                except xmlrpclib.ProtocolError, err:
+                    err_msg = ("A protocol error occurred\n"
+                               "URL: %s\n"
+                               "HTTP/HTTPS headers: %s\n"
+                               "Error code: %d\n"
+                               "Error message: %s\n") % (err.url, err.headers,
+                                                         err.errcode, err.errmsg)
+                    self.server_logger.error(err_msg)
+                    return (str(err), 0)
+                except Exception, e:
+                    self.server_logger.error(str(e))
+                    self.server_logger.error(traceback.format_exc())
+                    return (str(e), 0)
+
+            if not os.path.exists(filepath):
+                os.mkdir(filepath)
+
+            if not os.path.exists(filename):
+                from vistrails.gui.vistrail_controller import VistrailController
+
+                locator = DBLocator(host=host,
+                                    port=int(port),
+                                    database=db_name,
+                                    user=db_read_user,
+                                    passwd=db_read_pass,
+                                    obj_id=int(vt_id),
+                                    obj_type=None,
+                                    connection_id=None)
+
+                (v, abstractions , thumbnails, mashups)  = io.load_vistrail(locator)
+                controller = VistrailController(v, locator, abstractions, 
+                                                thumbnails, mashups)
+                controller.change_selected_version(version)
+                controller.updatePipelineScene()
+                controller.current_pipeline_scene.saveToPDF(filename)
+            else:
+                self.server_logger.info("found cached pdf: %s" % filename)
+
+            if is_local:
+                return (os.path.join(subdir,base_fname), 1)
+            else:
+                f = open(filename, 'rb')
+                contents = f.read()
+                f.close()
+                return (xmlrpclib.Binary(contents), 1)
+
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error("Error when saving pdf: %s" % str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_wf_graph_png(self, host, port, db_name, vt_id, version, is_local=True):
+        """get_wf_graph_png(host:str, port:int, db_name:str, vt_id:int,
+                          version:int) -> str
+         Returns the relative url to the generated image
+         """
+        self.server_logger.info("get_wf_graph_png(%s,%s,%s,%s,%s) request received" % \
+                                (host, port, db_name, vt_id, version))
+        try:
+            vt_id = long(vt_id)
+            version = long(version)
+            subdir = 'workflows'
+            filepath = os.path.join(media_dir, 'graphs', subdir)
+            base_fname = "graph_%s_%s.png" % (vt_id, version)
+            filename = os.path.join(filepath,base_fname)
+            if ((not os.path.exists(filepath) or
+                os.path.exists(filepath) and not os.path.exists(filename))
+                and self.proxies_queue is not None):
+                #this server can send requests to other instances
+                proxy = self.proxies_queue.get()
+                try:
+                    self.server_logger.info("Sending request to %s" % proxy)
+                    result = proxy.get_wf_graph_png(host, port, db_name, vt_id, version, is_local)
+                    self.proxies_queue.put(proxy)
+                    self.server_logger.info("returning %s" % result)
+                    return result
+                except xmlrpclib.ProtocolError, err:
+                    err_msg = ("A protocol error occurred\n"
+                               "URL: %s\n"
+                               "HTTP/HTTPS headers: %s\n"
+                               "Error code: %d\n"
+                               "Error message: %s\n") % (err.url, err.headers,
+                                                         err.errcode, err.errmsg)
+                    self.server_logger.error(err_msg)
+                    return (str(err), 0)
+                except Exception, e:
+                    self.server_logger.error(str(e))
+                    self.server_logger.error(traceback.format_exc())
+                    return (str(e), 0)
+            #if it gets here, this means that we will execute on this instance
+            if not os.path.exists(filepath):
+                os.mkdir(filepath)
+
+            if not os.path.exists(filename):
+                from vistrails.gui.vistrail_controller import VistrailController
+
+                locator = DBLocator(host=host,
+                                    port=port,
+                                    database=db_name,
+                                    user=db_read_user,
+                                    passwd=db_read_pass,
+                                    obj_id=int(vt_id),
+                                    obj_type=None,
+                                    connection_id=None)
+                (v, abstractions , thumbnails, mashups)  = io.load_vistrail(locator)
+                controller = VistrailController(v, locator, abstractions, 
+                                                thumbnails, mashups)
+                controller.change_selected_version(version)
+                controller.updatePipelineScene()
+                controller.current_pipeline_scene.saveToPNG(filename)
+            else:
+                self.server_logger.info("found cached image: %s" % filename)
+            if is_local:
+                return (os.path.join(subdir,base_fname), 1)
+            else:
+                f = open(filename, 'rb')
+                contents = f.read()
+                f.close()
+                return (xmlrpclib.Binary(contents), 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error("Error when saving png %s" % str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def _is_image_stale(self, filename, host, port, db_name, vt_id):
+        statinfo = os.stat(filename)
+        image_time = datetime.fromtimestamp(statinfo.st_mtime)
+        locator = DBLocator(host=host,
+                            port=int(port),
+                            database=db_name,
+                            user=db_read_user,
+                            passwd=db_read_pass,
+                            obj_id=int(vt_id),
+                            obj_type=None,
+                            connection_id=None)
+        vt_mod_time = locator.get_db_modification_time()
+        self.server_logger.info("image time: %s, vt time: %s"%(image_time,
+                                                               vt_mod_time))
+        if image_time < vt_mod_time:
+            return True
+        else:
+            return False
+
+    def get_vt_graph_png(self, host, port, db_name, vt_id, is_local=True):
+        """get_vt_graph_png(host:str, port: str, db_name: str, vt_id:str) -> str
+        Returns the relative url of the generated image
+        """
+        
+        self.server_logger.info("get_vt_graph_png(%s, %s, %s, %s)" % (host, port, db_name, vt_id))
+        try:
+            vt_id = long(vt_id)
+            subdir = 'vistrails'
+            filepath = os.path.join(media_dir, 'graphs', subdir)
+            base_fname = "graph_%s.png" % (vt_id)
+            filename = os.path.join(filepath,base_fname)
+            if ((not os.path.exists(filepath) or
+                (os.path.exists(filepath) and not os.path.exists(filename)) or
+                 self._is_image_stale(filename, host, port, db_name, vt_id)) and 
+                self.proxies_queue is not None):
+                #this server can send requests to other instances
+                proxy = self.proxies_queue.get()
+                try:
+                    self.server_logger.info("Sending request to %s" % proxy)
+                    result = proxy.get_vt_graph_png(host, port, db_name, vt_id, is_local)
+                    self.proxies_queue.put(proxy)
+                    self.server_logger.info("returning %s" % result)
+                    return result
+                except xmlrpclib.ProtocolError, err:
+                    err_msg = ("A protocol error occurred\n"
+                               "URL: %s\n"
+                               "HTTP/HTTPS headers: %s\n"
+                               "Error code: %d\n"
+                               "Error message: %s\n") % (err.url, err.headers,
+                                                         err.errcode, err.errmsg)
+                    self.server_logger.error(err_msg)
+                    return (str(err), 0)
+                except Exception, e:
+                    self.server_logger.error(str(e))
+                    self.server_logger.error(traceback.format_exc())
+                    return (str(e), 0)
+
+            #if it gets here, this means that we will execute on this instance
+            if (not os.path.exists(filepath) or
+                (os.path.exists(filepath) and not os.path.exists(filename)) or
+                 self._is_image_stale(filename, host, port, db_name, vt_id)):
+
+                from vistrails.gui.vistrail_controller import VistrailController
+
+                if os.path.exists(filepath):
+                    shutil.rmtree(filepath)
+
+                os.mkdir(filepath)
+            
+                locator = DBLocator(host=host,
+                                    port=int(port),
+                                    database=db_name,
+                                    user=db_read_user,
+                                    passwd=db_read_pass,
+                                    obj_id=int(vt_id),
+                                    obj_type=None,
+                                    connection_id=None)
+                (v, abstractions , thumbnails, mashups)  = io.load_vistrail(locator)
+                controller = VistrailController(v, locator, abstractions, 
+                                                thumbnails, mashups)
+                from vistrails.gui.version_view import QVersionTreeView
+                version_view = QVersionTreeView()
+                version_view.scene().setupScene(controller)
+                version_view.scene().saveToPNG(filename)
+                del version_view
+            else:
+                self.server_logger.info("Found cached image: %s" % filename)
+            if is_local:
+                return (os.path.join(subdir,base_fname), 1)
+            else:
+                f = open(filename, 'rb')
+                contents = f.read()
+                f.close()
+                return (xmlrpclib.Binary(contents), 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error("Error when saving png: %s" % str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_vt_graph_pdf(self, host, port, db_name, vt_id, is_local=True):
+        """get_vt_graph_pdf(host:str, port: str, db_name: str, vt_id:str) -> str
+        Returns the relative url of the generated image
+        """
+
+        self.server_logger.info("get_vt_graph_pdf(%s, %s, %s, %s)" % (host, port, db_name, vt_id))
+        try:
+            vt_id = long(vt_id)
+            subdir = 'vistrails'
+            filepath = os.path.join(media_dir, 'graphs', subdir)
+            base_fname = "graph_%s.pdf" % (vt_id)
+            filename = os.path.join(filepath,base_fname)
+            if ((not os.path.exists(filepath) or
+                (os.path.exists(filepath) and not os.path.exists(filename)) or
+                 self._is_image_stale(filename, host, port, db_name, vt_id)) and 
+                self.proxies_queue is not None):
+                #this server can send requests to other instances
+                proxy = self.proxies_queue.get()
+                try:
+                    self.server_logger.info("Sending request to %s" % proxy)
+                    result = proxy.get_vt_graph_pdf(host, port, db_name, vt_id, is_local)
+                    self.proxies_queue.put(proxy)
+                    self.server_logger.info("returning %s" % result)
+                    return result
+                except xmlrpclib.ProtocolError, err:
+                    err_msg = ("A protocol error occurred\n"
+                               "URL: %s\n"
+                               "HTTP/HTTPS headers: %s\n"
+                               "Error code: %d\n"
+                               "Error message: %s\n") % (err.url, err.headers,
+                                                         err.errcode, err.errmsg)
+                    self.server_logger.error(err_msg)
+                    return (str(err), 0)
+                except Exception, e:
+                    self.server_logger.error(str(e))
+                    self.server_logger.error(traceback.format_exc())
+                    return (str(e), 0)
+
+
+            #if it gets here, this means that we will execute on this instance
+            if (not os.path.exists(filepath) or
+                (os.path.exists(filepath) and not os.path.exists(filename)) or
+                 self._is_image_stale(filename, host, port, db_name, vt_id)):
+
+                from vistrails.gui.vistrail_controller import VistrailController
+
+                if os.path.exists(filepath):
+                    shutil.rmtree(filepath)
+
+                os.mkdir(filepath)
+
+                locator = DBLocator(host=host,
+                                    port=int(port),
+                                    database=db_name,
+                                    user=db_read_user,
+                                    passwd=db_read_pass,
+                                    obj_id=int(vt_id),
+                                    obj_type=None,
+                                    connection_id=None)
+                (v, abstractions , thumbnails, mashups)  = io.load_vistrail(locator)
+                controller = VistrailController(v, locator, abstractions, 
+                                                thumbnails, mashups)
+                from vistrails.gui.version_view import QVersionTreeView
+                version_view = QVersionTreeView()
+                version_view.scene().setupScene(controller)
+                version_view.scene().saveToPDF(filename)
+                del version_view
+            else:
+                self.server_logger.info("Found cached pdf: %s" % filename)
+            if is_local:
+                return (os.path.join(subdir,base_fname), 1)
+            else:
+                f = open(filename, 'rb')
+                contents = f.read()
+                f.close()
+                return (xmlrpclib.Binary(contents), 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error("Error when saving pdf: %s" % str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+        
+    def get_vt_zip(self, host, port, db_name, vt_id):
+        """get_vt_zip(host:str, port: str, db_name: str, vt_id:str) -> str
+        Returns a .vt file encoded as base64 string
+        """
+
+        self.server_logger.info("Request: get_vt_zip(%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+            save_bundle = locator.load()
+            #annotate the vistrail
+            save_bundle.vistrail.update_checkout_version('vistrails')
+            #create temporary file
+            (fd, name) = tempfile.mkstemp(prefix='vt_tmp',
+                                          suffix='.vt')
+            os.close(fd)
+            try:
+                fileLocator = FileLocator(name)
+                fileLocator.save(save_bundle)
+                contents = open(name).read()
+                result = base64.b64encode(contents)
+            finally:
+                os.unlink(name)
+            return (result, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_wf_vt_zip(self, host, port, db_name, vt_id, version):
+        """get_wf_vt_zip(host:str, port:str, db_name:str, vt_id:str,
+                         version:str) -> str
+        Returns a vt file containing the single workflow defined by version
+        encoded as base64 string
+
+        """
+        self.server_logger.info("Request: get_wf_vt_zip(%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id, version))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            (v, _ , _, _)  = io.load_vistrail(locator)
+            p = v.getPipeline(long(version))
+            if p:
+                vistrail = Vistrail()
+                action_list = []
+                for module in p.module_list:
+                    action_list.append(('add', module))
+                for connection in p.connection_list:
+                    action_list.append(('add', connection))
+                action = vistrails.core.db.action.create_action(action_list)
+                vistrail.add_action(action, 0L)
+                vistrail.addTag("Imported workflow", action.id)
+                if not vistrail.db_version:
+                    vistrail.db_version = currentVersion
+                pipxmlstr = io.serialize(vistrail)
+                result = base64.b64encode(pipxmlstr)
+                return (result, 1)
+            else:
+                result = "Error: Pipeline was not materialized"
+                self.server_logger.info(result)
+                return (result, 0)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.info(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_db_vt_list(self, host, port, db_name):
+        self.server_logger.info("Request: get_db_vistrail_list(%s,%s,%s)" % \
+                                (host, port, db_name))
+        config = {}
+        config['host'] = host
+        config['port'] = int(port)
+        config['db'] = db_name
+        config['user'] = db_read_user
+        config['passwd'] = db_read_pass
+        try:
+            rows = io.get_db_vistrail_list(config)
+            self.server_logger.info("returning %s" % str(rows))
+            return (rows, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            return (str(e), 0)
+
+    def get_db_vt_list_xml(self, host, port, db_name):
+        self.server_logger.info("Request: get_db_vistrail_list(%s,%s,%s)" % \
+                                (host, port, db_name))
+        config = {}
+        config['host'] = host
+        config['port'] = int(port)
+        config['db'] = db_name
+        config['user'] = db_read_user
+        config['passwd'] = db_read_pass
+        try:
+            rows = io.get_db_vistrail_list(config)
+            result = '<vistrails>'
+            for (id, name, mod_time) in rows:
+                result += '<vistrail id="%s" name="%s" mod_time="%s" />'%(id,name,mod_time)
+            result += '</vistrails>'
+            return (result, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+    def get_vt_tagged_versions(self, host, port, db_name, vt_id, is_local=True):
+        self.server_logger.info("Request: get_vt_tagged_versions(%s,%s,%s,%s,%s)" % \
+                                (host, port, db_name, vt_id, is_local))
+        try:
+            locator = DBLocator(host=host,
+                                port=int(port),
+                                database=db_name,
+                                user=db_read_user,
+                                passwd=db_read_pass,
+                                obj_id=int(vt_id),
+                                obj_type=None,
+                                connection_id=None)
+
+            result = []
+            v = locator.load().vistrail
+            for elem, tag in v.get_tagMap().iteritems():
+                action_map = v.actionMap[long(elem)]
+                if v.get_thumbnail(elem):
+                    thumbnail_fname = os.path.join(
+                        get_vistrails_configuration().thumbs.cacheDirectory,
+                        v.get_thumbnail(elem))
+                else:
+                    thumbnail_fname = ""
+                if not thumbnail_fname or is_local:
+                    result.append({'id': elem, 'name': tag,
+                                   'notes': v.get_notes(elem) or '',
+                                   'user':action_map.user or '',
+                                   'date':action_map.date,
+                                   'thumbnail': thumbnail_fname})
+                else:
+                    handler = open(thumbnail_fname, "rb")
+                    thumbnail_data = handler.read()
+                    handler.close()
+                    result.append({'id': elem, 'name': tag,
+                                   'notes': v.get_notes(elem) or '',
+                                   'user':action_map.user or '',
+                                   'date':action_map.date,
+                                   'thumbnail': xmlrpclib.Binary(thumbnail_data)})
+            return (result, 1)
+        except xmlrpclib.ProtocolError, err:
+            err_msg = ("A protocol error occurred\n"
+                       "URL: %s\n"
+                       "HTTP/HTTPS headers: %s\n"
+                       "Error code: %d\n"
+                       "Error message: %s\n") % (err.url, err.headers,
+                                                 err.errcode, err.errmsg)
+            self.server_logger.error(err_msg)
+            return (str(err), 0)
+        except Exception, e:
+            self.server_logger.error(str(e))
+            self.server_logger.error(traceback.format_exc())
+            return (str(e), 0)
+
+################################################################################
+# Some Medley code
+class XMLObject(object):
+    @staticmethod
+    def convert_from_str(value, type):
+        def bool_conv(x):
+            s = str(x).upper()
+            if s == 'TRUE':
+                return True
+            if s == 'FALSE':
+                return False
+
+        if value is not None:
+            if type == 'str':
+                return str(value)
+            elif value.strip() != '':
+                if type == 'long':
+                    return long(value)
+                elif type == 'float':
+                    return float(value)
+                elif type == 'int':
+                    return int(value)
+                elif type == 'bool':
+                    return bool_conv(value)
+                elif type == 'date':
+                    return date(*strptime(value, '%Y-%m-%d')[0:3])
+                elif type == 'datetime':
+                    return datetime(*strptime(value, '%Y-%m-%d %H:%M:%S')[0:6])
+        return None
+
+    @staticmethod
+    def convert_to_str(value,type):
+        if value is not None:
+            if type == 'date':
+                return value.isoformat()
+            elif type == 'datetime':
+                return value.strftime('%Y-%m-%d %H:%M:%S')
+            else:
+                return str(value)
+        return ''
+
+################################################################################
+
+class MedleySimpleGUI(XMLObject):
+    def __init__(self, id, name, vtid=None, version=None, alias_list=None,
+                 t='vistrail', has_seq=None):
+        self._id = id
+        self._name = name
+        self._version = version
+        self._alias_list = alias_list
+        self._vtid = vtid
+        self._type = t
+
+        if has_seq == None:
+            self._has_seq = False
+            if isinstance(self._alias_list, dict):
+                for v in self._alias_list.itervalues():
+                    if v._component._seq == True:
+                        self._has_seq = True
+        else:
+            self._has_seq = has_seq
+
+    def to_xml(self, node=None):
+        """to_xml(node: ElementTree.Element) -> ElementTree.Element
+           writes itself to xml
+        """
+
+        if node is None:
+            node = ElementTree.Element('medley_simple_gui')
+
+        #set attributes
+        node.set('id', self.convert_to_str(self._id,'long'))
+        node.set('version', self.convert_to_str(self._version,'long'))
+        node.set('vtid', self.convert_to_str(self._vtid,'long'))
+        node.set('name', self.convert_to_str(self._name,'str'))
+        node.set('type', self.convert_to_str(self._type,'str'))
+        node.set('has_seq', self.convert_to_str(self._has_seq,'bool'))
+        for (k,v) in self._alias_list.iteritems():
+            child_ = ElementTree.SubElement(node, 'alias')
+            v.to_xml(child_)
+        return node
+
+    @staticmethod
+    def from_xml(node):
+        if node.tag != 'medley_simple_gui':
+            print "node.tag != 'medley_simple_gui'"
+            return None
+        #read attributes
+        data = node.get('id', None)
+        id = MedleySimpleGUI.convert_from_str(data, 'long')
+        data = node.get('name', None)
+        name = MedleySimpleGUI.convert_from_str(data, 'str')
+        data = node.get('version', None)
+        version = MedleySimpleGUI.convert_from_str(data, 'long')
+        data = node.get('vtid', None)
+        vtid = MedleySimpleGUI.convert_from_str(data, 'long')
+        data = node.get('type', None)
+        type = MedleySimpleGUI.convert_from_str(data, 'str')
+        data = node.get('has_seq', None)
+        seq = ComponentSimpleGUI.convert_from_str(data, 'bool')
+        alias_list = {}
+        for child in node.getchildren():
+            if child.tag == "alias":
+                alias = AliasSimpleGUI.from_xml(child)
+                alias_list[alias._name] = alias
+        return MedleySimpleGUI(id=id, name=name, vtid=vtid, version=version,
+                               alias_list=alias_list, t=type, has_seq=seq)
+
+################################################################################
+
+class AliasSimpleGUI(XMLObject):
+    def __init__(self, id, name, component=None):
+        self._id = id
+        self._name = name
+        self._component = component
+
+    def to_xml(self, node=None):
+        """to_xml(node: ElementTree.Element) -> ElementTree.Element
+            writes itself to xml
+        """
+        if node is None:
+            node = ElementTree.Element('alias')
+
+        #set attributes
+        node.set('id', self.convert_to_str(self._id,'long'))
+        node.set('name', self.convert_to_str(self._name,'str'))
+        child_ = ElementTree.SubElement(node, 'component')
+        self._component.to_xml(child_)
+
+        return node
+
+    @staticmethod
+    def from_xml(node):
+        if node.tag != 'alias':
+            return None
+
+        #read attributes
+        data = node.get('id', None)
+        id = AliasSimpleGUI.convert_from_str(data, 'long')
+        data = node.get('name', None)
+        name = AliasSimpleGUI.convert_from_str(data, 'str')
+        for child in node.getchildren():
+            if child.tag == "component":
+                component = ComponentSimpleGUI.from_xml(child)
+        alias = AliasSimpleGUI(id,name,component)
+        return alias
+
+################################################################################
+
+class ComponentSimpleGUI(XMLObject):
+    def __init__(self, id, pos, ctype, spec, val=None, minVal=None, maxVal=None,
+                 stepSize=None, strvalueList="", parent=None, seq=False,
+                 widget="text"):
+        """ComponentSimpleGUI()
+        widget can be: text, slider, combobox, numericstepper, checkbox
+
+        """
+        self._id = id
+        self._pos = pos
+        self._spec = spec
+        self._ctype = ctype
+        self._val = val
+        self._minVal = minVal
+        self._maxVal = maxVal
+        self._stepSize = stepSize
+        self._strvaluelist = strvalueList
+        self._parent = parent
+        self._seq = seq
+        self._widget = widget
+
+    def _get_valuelist(self):
+        data = self._strvaluelist.split(',')
+        result = []
+        for d in data:
+            result.append(urllib.unquote_plus(d))
+        return result
+    def _set_valuelist(self, valuelist):
+        q = []
+        for v in valuelist:
+            q.append(urllib.quote_plus(v))
+        self._strvaluelist = ",".join(q)
+
+    _valueList = property(_get_valuelist,_set_valuelist)
+
+    def to_xml(self, node=None):
+        """to_xml(node: ElementTree.Element) -> ElementTree.Element
+             writes itself to xml
+        """
+        if node is None:
+            node = ElementTree.Element('component')
+
+        #set attributes
+        node.set('id', self.convert_to_str(self._id,'long'))
+        node.set('pos', self.convert_to_str(self._pos,'long'))
+        node.set('spec', self.convert_to_str(self._spec,'str'))
+        node.set('ctype', self.convert_to_str(self._ctype,'str'))
+        node.set('val', self.convert_to_str(self._val, 'str'))
+        node.set('minVal', self.convert_to_str(self._minVal,'str'))
+        node.set('maxVal', self.convert_to_str(self._maxVal,'str'))
+        node.set('stepSize', self.convert_to_str(self._stepSize,'str'))
+        node.set('valueList',self.convert_to_str(self._strvaluelist,'str'))
+        node.set('parent', self.convert_to_str(self._parent,'str'))
+        node.set('seq', self.convert_to_str(self._seq,'bool'))
+        node.set('widget',self.convert_to_str(self._widget,'str'))
+        return node
+
+    @staticmethod
+    def from_xml(node):
+        if node.tag != 'component':
+            return None
+
+        #read attributes
+        data = node.get('id', None)
+        id = ComponentSimpleGUI.convert_from_str(data, 'long')
+        data = node.get('pos', None)
+        pos = ComponentSimpleGUI.convert_from_str(data, 'long')
+        data = node.get('ctype', None)
+        ctype = ComponentSimpleGUI.convert_from_str(data, 'str')
+        data = node.get('spec', None)
+        spec = ComponentSimpleGUI.convert_from_str(data, 'str')
+        data = node.get('val', None)
+        val = ComponentSimpleGUI.convert_from_str(data, 'str')
+        val = val.replace("<", "<")
+        val = val.replace(">", ">")
+        val = val.replace("&","&")
+        data = node.get('minVal', None)
+        minVal = ComponentSimpleGUI.convert_from_str(data, 'str')
+        data = node.get('maxVal', None)
+        maxVal = ComponentSimpleGUI.convert_from_str(data, 'str')
+        data = node.get('stepSize', None)
+        stepSize = ComponentSimpleGUI.convert_from_str(data, 'str')
+        data = node.get('valueList', None)
+        values = ComponentSimpleGUI.convert_from_str(data, 'str')
+        values = values.replace("<", "<")
+        values = values.replace(">", ">")
+        values = values.replace("&","&")
+        data = node.get('parent', None)
+        parent = ComponentSimpleGUI.convert_from_str(data, 'str')
+        data = node.get('seq', None)
+        seq = ComponentSimpleGUI.convert_from_str(data, 'bool')
+        data = node.get('widget', None)
+        widget = ComponentSimpleGUI.convert_from_str(data, 'str')
+        component = ComponentSimpleGUI(id=id,
+                                       pos=pos,
+                                       ctype=ctype,
+                                       spec=spec,
+                                       val=val,
+                                       minVal=minVal,
+                                       maxVal=maxVal,
+                                       stepSize=stepSize,
+                                       strvalueList=values,
+                                       parent=parent,
+                                       seq=seq,
+                                       widget=widget)
+        return component
+
+################################################################################
+################################################################################
+
+class VistrailsServerSingleton(VistrailsApplicationInterface,
+                               QtGui.QApplication):
+    """
+    VistrailsServerSingleton is the singleton of the application,
+    there will be only one instance of the application during VisTrails
+
+    """
+    def __call__(self):
+        """ __call__() -> VistrailsServerSingleton
+        Return self for calling method
+
+        """
+        if not self._initialized:
+            self.init()
+        return self
+
+    def __init__(self):
+        QtGui.QApplication.__init__(self, sys.argv)
+        VistrailsApplicationInterface.__init__(self)
+        if QtCore.QT_VERSION < 0x40200: # 0x40200 = 4.2.0
+            raise vistrails.core.requirements.MissingRequirement("Qt version >= 4.2")
+
+        self.rpcserver = None
+        self.pingserver = None
+        self.images_url = "http://vistrails.sci.utah.edu/medleys/images/"
+        self.temp_xml_rpc_options = InstanceObject(server=None,
+                                                   port=None,
+                                                   log_file=None)
+        qt.allowQObjects()
+
+    def is_running_gui(self):
+        return True
+
+    def make_logger(self, filename, label):
+        """self.make_logger(filename:str) -> logger. Creates a logging object to
+        be used for the server so we can log requests in file f."""
+        logger = logging.getLogger("VistrailsRPC[%s]"%label)
+        handler = logging.handlers.RotatingFileHandler(filename, maxBytes = 1024*1024,
+                                                       backupCount=5)
+        handler.setFormatter(logging.Formatter('%(name)s - %(asctime)s %(levelname)-8s %(message)s'))
+        handler.setLevel(logging.DEBUG)
+        logger.setLevel(logging.DEBUG)
+        logger.addHandler(handler)
+        return logger
+
+    def load_config(self, filename):
+        """ Load in server parameters from config file.
+        If parameters are missing, write them in and raise error.
+        If file doesn't exist, create one and raise error. """
+
+        global accessList, db_host, db_read_user, db_read_pass, db_write_user, db_write_pass, media_dir, script_file, virtual_display
+        accessList = []
+        db_host = ''
+        db_read_user = ''
+        db_read_pass = ''
+        db_write_user = ''
+        db_write_pass = ''
+        media_dir = ''
+        script_file = ''
+        virtual_display = ''
+
+        config = ConfigParser.ConfigParser()
+        file_opened = config.read(filename)
+        has_changed = False
+
+        if not file_opened:
+            # new file to store default (empt) config
+            new_filename = os.path.join(system.vistrails_root_directory(), 'server.cfg')
+
+        # load or create access fields
+        if config.has_option("access", "permitted_addresses"):
+            read_accessList = config.get("access", "permitted_addresses")
+            accessList = [elem.strip() for elem in read_accessList.split(',')]
+        else:
+            if not config.has_section("access"):
+                config.add_section("access")
+            config.set("access", "permitted_addresses", "localhost,")
+            accessList = []
+            has_changed = True
+
+        # load or create database fields
+        if not config.has_section("database"):
+            config.add_section("database")
+            has_changed = True
+
+        if config.has_option("database", "host"):
+            db_host = config.get("database", "host")
+        else:
+            config.set("database", "host", "")
+            has_changed = True
+
+        if config.has_option("database", "read_user"):
+            db_read_user = config.get("database", "read_user")
+        else:
+            config.set("database", "read_user", "")
+            has_changed = True
+
+        if config.has_option("database", "read_password"):
+            db_read_pass = config.get("database", "read_password")
+        else:
+            config.set("database", "read_password", "")
+            has_changed = True
+
+        if config.has_option("database", "write_user"):
+            db_write_user = config.get("database", "write_user")
+        else:
+            config.set("database", "write_user", "")
+            has_changed = True
+
+        if config.has_option("database", "write_password"):
+            db_write_pass = config.get("database", "write_password")
+        else:
+            config.set("database", "write_password", "")
+            has_changed = True
+
+        if not config.has_section("media"):
+            config.add_section("media")
+            has_changed = True
+
+        if config.has_option("media", "media_dir"):
+            media_dir = config.get("media", "media_dir")
+            if not os.path.exists(media_dir):
+                raise ValueError("media_dir %s doesn't exist." % media_dir)
+
+        if not config.has_section("script"):
+            config.add_section("script")
+            has_changed = True
+
+        if config.has_option("script", "script_file"):
+            script_file = config.get("script", "script_file")
+            if not os.path.exists(script_file):
+                raise ValueError("script_file %s doesn't exist." % script_file)
+        else:
+            config.set("script", "script_file", "")
+            has_changed = True
+
+        if config.has_option("script", "virtual_display"):
+            virtual_display = config.get("script", "virtual_display")
+        
+        if virtual_display == "":
+            virtual_display = "0"
+
+        # check if all required parameters are present
+        missing_req_fields = [y for (x,y) in ((db_host,"host"),
+                                              (db_read_user,"read_user"),
+                                              (db_write_user,"write_user"),
+                                              (media_dir,"media_dir"),
+                                              (script_file,"script_file"),
+                                              (accessList,"permission_addresses")) if not x]
+        if missing_req_fields:
+            self.server_logger.error(("Following required parameters where missing "
+                                      "from %s config file: %s ") % \
+                                     (filename, ", ".join(missing_req_fields)))
+            if not has_changed:
+                raise ValueError("Following required parameters where missing from %s config file: %s " %
+                                 (filename, ", ".join(missing_req_fields)))
+
+        if has_changed:
+            # save changes to passed config file
+            if file_opened:
+                config.write(open(filename, "wb"))
+                self.server_logger.error("Invalid config file, the missing fields have been "
+                                         "added to your config, please populate them")
+                raise RuntimeError("Invalid config file, the missing fields have been "
+                                   "added to your config, please populate them")
+            else:
+                # save changes to default config file
+                config.write(open(new_filename, "wb"))
+                self.server_logger.error("Config file %s doesn't exist. Creating new file at %s. "
+                                         "Please populated it with the correct values and use it" %
+                                         (filename, new_filename))
+                raise RuntimeError("Config file %s doesn't exist. Creating new file at %s. "
+                                   "Please populate it with the correct values and use it" %
+                                   (filename, new_filename))
+
+    def init(self, optionsDict=None):
+        """ init(optionDict: dict) -> boolean
+        Create the application with a dict of settings
+
+        """
+        VistrailsApplicationInterface.init(self,optionsDict)
+
+        self.vistrailsStartup.init()
+        self.server_logger = self.make_logger(self.temp_xml_rpc_options.log_file,
+                                              self.temp_xml_rpc_options.port)
+        self.load_config(self.temp_xml_rpc_options.config_file)
+        self.start_other_instances(self.temp_xml_rpc_options.instances)
+        self._python_environment = self.vistrailsStartup.get_python_environment()
+        self._initialized = True
+        return True
+
+    def start_other_instances(self, number):
+        global virtual_display, script_file
+        self.others = []
+        host = self.temp_xml_rpc_options.server
+        port = self.temp_xml_rpc_options.port
+        virt_disp = int(virtual_display)
+        for x in xrange(number):
+            port += 1   # each instance needs one port space for now
+                        #later we might need 2 (normal requests and status requests)
+            virt_disp += 1
+            args = [script_file,":%s"%virt_disp,host,str(port),'0', '0']
+            try:
+                p = subprocess.Popen(args)
+                time.sleep(20)
+                self.others.append("http://%s:%s"%(host,port))
+            except Exception, e:
+                self.server_logger.error(("Couldn't start the instance on display:"
+                                          "%s port: %s") % (virtual_display, port))
+                self.server_logger.error(str(e))
+
+    def stop_other_instances(self):
+        script = os.path.join(system.vistrails_root_directory(), "stop_vistrails_server.py")
+        for o in self.others:
+            args = ['python', script, o]
+            try:
+                subprocess.Popen(args)
+                time.sleep(15)
+            except Exception, e:
+                self.server_logger.error("Couldn't stop instance: %s" % o)
+                self.server_logger.error(str(e))
+
+    def run_server(self):
+        """run_server() -> None
+        This will run forever until the server receives a quit request, done
+        via xml-rpc.
+        """
+
+        self.server_logger.info("Server is running on http://%s:%s"%(self.temp_xml_rpc_options.server,
+                                                   self.temp_xml_rpc_options.port))
+        if self.temp_xml_rpc_options.multithread:
+            self.rpcserver = ThreadedXMLRPCServer((self.temp_xml_rpc_options.server,
+                                                   self.temp_xml_rpc_options.port),
+                                                  self.server_logger)
+            self.server_logger.info("    multithreaded instance")
+        else:
+            self.rpcserver = StoppableXMLRPCServer((self.temp_xml_rpc_options.server,
+                                                   self.temp_xml_rpc_options.port),
+                                                   self.server_logger)
+            """
+            self.pingserver = StoppableXMLRPCServer((self.temp_xml_rpc_options.server,
+                                                    self.temp_xml_rpc_options.port-1),
+                                                    self.server_logger)
+            """
+            self.server_logger.info("    singlethreaded instance")
+        #self.rpcserver.register_introspection_functions()
+        self.rpcserver.register_instance(RequestHandler(self.server_logger,
+                                                        self.others))
+        if self.pingserver:
+            self.pingserver.register_instance(RequestHandler(self.server_logger, []))
+            self.server_logger.info("Status XML RPC Server is listening on http://%s:%s"% \
+                            (self.temp_xml_rpc_options.server,
+                             self.temp_xml_rpc_options.port-1))
+            self.pingserver.register_function(self.quit_server, "quit")
+            self.pingserver.serve_forever()
+            self.pingserver.serve_close()
+
+        self.rpcserver.register_function(self.quit_server, "quit")
+        self.server_logger.info("Vistrails XML RPC Server is listening on http://%s:%s"% \
+                        (self.temp_xml_rpc_options.server,
+                         self.temp_xml_rpc_options.port))
+        self.rpcserver.serve_forever()
+        self.rpcserver.server_close()
+        return 0
+
+    def quit_server(self):
+        result = "Vistrails XML RPC Server is quitting."
+        self.stop_other_instances()
+        self.server_logger.info(result)
+        self.rpcserver.stop = True
+        return result
+
+    def setupOptions(self, args=None):
+        """ setupOptions() -> None
+        Check and store all command-line arguments
+
+        """
+        add = command_line.CommandLineParser.add_option
+
+        add("-T", "--xml_rpc_server", action="store", dest="rpcserver",
+            help="hostname or ip address where this xml rpc server will work")
+        add("-R", "--xml_rpc_port", action="store", type="int", default=8080,
+            dest="rpcport", help="database port")
+        add("-L", "--xml_rpc_log_file", action="store", dest="rpclogfile",
+            default=os.path.join(system.vistrails_root_directory(),
+                                 'rpcserver.log'),
+            help="log file for XML RPC server")
+        add("-O", "--xml_rpc_instances", action="store", type='int', default=0,
+            dest="rpcinstances",
+            help="number of other instances that vistrails should start")
+        add("-M", "--multithreaded", action="store_true",
+            default = None, dest='multithread',
+            help="server will start a thread for each request")
+        add("-C", "--config-file", action="store", dest = "rpcconfig",
+            default=os.path.join(system.vistrails_root_directory(),
+                                 'server.cfg'),
+            help="config file for server connection options")
+        VistrailsApplicationInterface.setupOptions(self, args)
+
+    def readOptions(self):
+        """ readOptions() -> None
+        Read arguments from the command line
+
+        """
+        get = command_line.CommandLineParser().get_option
+        self.temp_xml_rpc_options = InstanceObject(server=get('rpcserver'),
+                                                   port=get('rpcport'),
+                                                   log_file=get('rpclogfile'),
+                                                   instances=get('rpcinstances'),
+                                                   multithread=get('multithread'),
+                                                   config_file=get('rpcconfig'))
+        VistrailsApplicationInterface.readOptions(self)
+
+
+
+# The initialization must be explicitly signalled. Otherwise, any
+# modules importing vis_application will try to initialize the entire
+# app.
+def start_server(optionsDict=None):
+    """Initializes the application singleton."""
+    global VistrailsServer
+    if VistrailsServer:
+        print "Server already started."
+        return
+    VistrailsServer = VistrailsServerSingleton()
+    vistrails.gui.theme.initializeCurrentTheme()
+    vistrails.core.application.set_vistrails_application(VistrailsServer)
+    x = VistrailsServer.init(optionsDict)
+    if x == True:
+        return 0
+    else:
+        return 1
+
+VistrailsServer = None
+
+def stop_server():
+    """Stop and finalize the application singleton."""
+    global VistrailsServer
+    VistrailsServer.save_configuration()
+    VistrailsServer.destroy()
+    VistrailsServer.deleteLater()
diff --git a/vistrails/gui/base_view.py b/vistrails/gui/base_view.py
new file mode 100644
index 0000000..29fbcd5
--- /dev/null
+++ b/vistrails/gui/base_view.py
@@ -0,0 +1,114 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from PyQt4 import QtCore, QtGui
+
+class BaseView(object):
+    """ BaseView is the base class for the views in VisTrails.
+
+
+    """
+
+    def __init__(self):
+        self.controller = None
+        self.title = None
+        self.index = -1
+        self.tab_idx = -1
+
+        self.palette_layout = {}
+        self.set_default_layout()
+        self.action_links = {}
+        self.action_defaults = {}
+        BaseView.set_action_defaults(self)
+        self.set_action_defaults()
+        self.set_action_links()
+        self.detachable = False
+        self.vistrail_view = None
+
+    def set_default_layout(self):
+        raise NotImplementedError("Class must define the layout as self.palette_layout")
+
+    def set_palette_layout(self, layout):
+        self.palette_layout = layout
+
+    def set_action_links(self):
+        raise NotImplementedError("Class must define the action links")
+
+    def set_action_defaults(self):
+        self.action_defaults.update(
+            {'history'    : [('setEnabled', False, True)],
+             'search'     : [('setEnabled', False, True)],
+             'explore'    : [('setEnabled', False, True)],
+             'provenance' : [('setEnabled', False, True)],
+             'mashup'     : [('setEnabled', False, True)]
+             })
+
+    def set_title(self, title):
+        self.title = title
+
+    def get_title(self):
+        return self.title
+
+    def set_long_title(self, title):
+        self.long_title = title
+        
+    def get_long_title(self):
+        return self.title
+    
+    def get_index(self):
+        return self.index
+
+    def set_index(self, index):
+        self.index = index
+
+    def get_tab_idx(self):
+        return self.tab_idx
+
+    def set_tab_idx(self, tab_idx):
+        self.tab_idx = tab_idx
+
+    def set_controller(self, controller):
+        pass
+    
+    def set_vistrail_view(self, view):
+        self.vistrail_view = view
+        
+    def get_vistrail_view(self):
+        return self.vistrail_view
+    
+    def changeEvent(self, event):
+        if event.type() == QtCore.QEvent.WindowTitleChange:
+            self.emit(QtCore.SIGNAL("windowTitleChanged"), self)
+        QtGui.QWidget.changeEvent(self, event)
diff --git a/vistrails/gui/bundles/__init__.py b/vistrails/gui/bundles/__init__.py
new file mode 100644
index 0000000..fac3164
--- /dev/null
+++ b/vistrails/gui/bundles/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
diff --git a/vistrails/gui/bundles/installbundle.py b/vistrails/gui/bundles/installbundle.py
new file mode 100644
index 0000000..a0e52de
--- /dev/null
+++ b/vistrails/gui/bundles/installbundle.py
@@ -0,0 +1,270 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Module with utilities to try and install a bundle if possible."""
+from vistrails.core import get_vistrails_application
+from vistrails.core.configuration import get_vistrails_configuration, \
+    get_vistrails_persistent_configuration
+from vistrails.core import debug
+from vistrails.core.system import get_executable_path
+from vistrails.core.system import vistrails_root_directory, systemType
+from vistrails.gui.bundles.utils import guess_system, guess_graphical_sudo
+import vistrails.gui.bundles.installbundle # this is on purpose
+import subprocess
+import sys
+
+##############################################################################
+
+def has_qt():
+    try:
+        import PyQt4.QtGui
+        return True
+    except ImportError:
+        return False
+
+pip_installed = True
+try:
+    import pip
+except ImportError:
+    pip_installed = False
+
+def hide_splash_if_necessary():
+    """Disables the splashscreen, otherwise it sits in front of windows.
+    """
+    app = get_vistrails_application()
+    if hasattr(app, 'splashScreen') and app.splashScreen:
+        app.splashScreen.hide()
+
+
+def shell_escape(arg):
+    return '"%s"' % arg.replace('\\', '\\\\').replace('"', '\\"')
+
+
+def run_install_command_as_root(graphical, cmd, args):
+    if isinstance(args, str):
+        cmd += ' %s' % shell_escape(args)
+    elif isinstance(args, list):
+        for package in args:
+            if not isinstance(package, str):
+                raise TypeError("Expected string or list of strings")
+            cmd += ' %s' % shell_escape(package)
+    else:
+        raise TypeError("Expected string or list of strings")
+
+    if graphical:
+        sucmd, escape = guess_graphical_sudo()
+    else:
+        debug.warning("VisTrails wants to install package(s) %r" %
+                      args)
+        if get_executable_path('sudo'):
+            sucmd, escape = "sudo %s", False
+        elif systemType not in ['Darwin', 'Windows']:
+            sucmd, escape = "su -c %s", True
+        else:
+            sucmd, escape = '%s', False
+
+    if escape:
+        sucmd = sucmd % shell_escape(cmd)
+    else:
+        sucmd = sucmd % cmd
+
+    print "about to run: %s" % sucmd
+    p = subprocess.Popen(sucmd, stdout=subprocess.PIPE,
+                                stderr=subprocess.STDOUT,
+                                shell=True)
+    lines = []
+    try:
+        for line in iter(p.stdout.readline, ''):
+            print line,
+            lines.append(line)
+    except IOError, e:
+        print "Ignoring IOError:", str(e)
+    result = p.wait()
+
+    if result != 0:
+        debug.critical("Error running: %s" % cmd, ''.join(lines))
+
+    return result == 0 # 0 indicates success
+
+
+def linux_debian_install(package_name):
+    qt = has_qt()
+    try:
+        import apt
+        import apt_pkg
+    except ImportError:
+        qt = False
+    hide_splash_if_necessary()
+
+    if qt:
+        cmd = shell_escape(vistrails_root_directory() +
+                           '/gui/bundles/linux_debian_install.py')
+    else:
+        cmd = '%s install -y' % ('aptitude'
+                                 if get_executable_path('aptitude')
+                                 else 'apt-get')
+
+    return run_install_command_as_root(qt, cmd, package_name)
+
+linux_ubuntu_install = linux_debian_install
+
+
+def linux_fedora_install(package_name):
+    qt = has_qt()
+    hide_splash_if_necessary()
+
+    if qt:
+        cmd = shell_escape(vistrails_root_directory() +
+                           '/gui/bundles/linux_fedora_install.py')
+    else:
+        cmd = 'yum -y install'
+
+    return run_install_command_as_root(qt, cmd, package_name)
+
+
+def pip_install(package_name):
+    hide_splash_if_necessary()
+
+    if get_executable_path('pip'):
+        cmd = '%s install' % shell_escape(get_executable_path('pip'))
+    else:
+        cmd = shell_escape(sys.executable) + ' -m pip install'
+    return run_install_command_as_root(has_qt(), cmd, package_name)
+
+def show_question(which_files, has_distro_pkg, has_pip):
+    if has_qt():
+        from PyQt4 import QtCore, QtGui
+        if isinstance(which_files, str):
+            which_files = [which_files]
+        dialog = QtGui.QDialog()
+        dialog.setWindowTitle("Required packages missing")
+        layout = QtGui.QVBoxLayout()
+
+        label = QtGui.QLabel(
+                "One or more required packages are missing: %s. VisTrails can "
+                "automatically install them. If you click OK, VisTrails will "
+                "need administrator privileges, and you might be asked for "
+                "the administrator password." % (" ".join(which_files)))
+        label.setWordWrap(True)
+        layout.addWidget(label)
+
+        if pip_installed and has_pip:
+            use_pip = QtGui.QCheckBox("Use pip")
+            use_pip.setChecked(
+                not has_distro_pkg or (
+                    has_pip and
+                    getattr(get_vistrails_configuration(),
+                            'installBundlesWithPip')))
+            use_pip.setEnabled(has_distro_pkg and has_pip)
+            layout.addWidget(use_pip)
+
+            remember_align = QtGui.QHBoxLayout()
+            remember_align.addSpacing(20)
+            remember_pip = QtGui.QCheckBox("Remember my choice")
+            remember_pip.setChecked(False)
+            remember_pip.setEnabled(use_pip.isEnabled())
+            remember_align.addWidget(remember_pip)
+            layout.addLayout(remember_align)
+        elif has_pip:
+            label = QtGui.QLabel("pip package is available but pip is not installed")
+            layout.addWidget(label)
+        buttons = QtGui.QDialogButtonBox(
+                QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)
+        QtCore.QObject.connect(buttons, QtCore.SIGNAL('accepted()'),
+                               dialog, QtCore.SLOT('accept()'))
+        QtCore.QObject.connect(buttons, QtCore.SIGNAL('rejected()'),
+                               dialog, QtCore.SLOT('reject()'))
+        layout.addWidget(buttons)
+
+        dialog.setLayout(layout)
+        hide_splash_if_necessary()
+        if dialog.exec_() != QtGui.QDialog.Accepted:
+            return False
+        else:
+            if pip_installed and has_pip:
+                if remember_pip.isChecked():
+                    setattr(get_vistrails_persistent_configuration(),
+                            'installBundlesWithPip',
+                            use_pip.isChecked())
+
+                if use_pip.isChecked():
+                    return 'pip'
+            return 'distro'
+    else:
+        print "\nRequired package missing"
+        print ("A required package is missing, but VisTrails can " +
+               "automatically install it. " +
+               "If you say Yes, VisTrails will need "+
+               "administrator privileges, and you" +
+               "might be asked for the administrator password.")
+        if has_distro_pkg:
+            print "(VisTrails will use your distribution's package manager)"
+        else:
+            print "(VisTrails will use the 'pip' installer)"
+        print "Give VisTrails permission to try to install package? (y/N)"
+        v = raw_input().upper()
+        if v == 'Y' or v == 'YES':
+            if has_distro_pkg:
+                return 'distro'
+            else:
+                return 'pip'
+
+
+def install(dependency_dictionary):
+    """Tries to install a bundle after a py_import() failed.."""
+
+    distro = guess_system()
+    files = (dependency_dictionary.get(distro) or
+             dependency_dictionary.get('pip'))
+    if not files:
+        return None
+    can_install = (('pip' in dependency_dictionary and pip_installed) or
+                   distro in dependency_dictionary)
+    if can_install:
+        action = show_question(
+                files,
+                distro in dependency_dictionary,
+                'pip' in dependency_dictionary)
+        if action == 'distro':
+            callable_ = getattr(vistrails.gui.bundles.installbundle,
+                                distro.replace('-', '_') + '_install')
+            return callable_(files)
+        elif action == 'pip':
+            if not pip_installed:
+                debug.warning("Attempted to use pip, but it is not installed.")
+                return False
+            return pip_install(dependency_dictionary.get('pip'))
+        else:
+            return False
diff --git a/vistrails/gui/bundles/linux_debian_install.py b/vistrails/gui/bundles/linux_debian_install.py
new file mode 100755
index 0000000..3bfc8b9
--- /dev/null
+++ b/vistrails/gui/bundles/linux_debian_install.py
@@ -0,0 +1,255 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Installs a package through APT, showing progress.
+import apt
+import apt_pkg
+import sys
+import time
+
+from apt_pkg import gettext as _
+from apt.progress.base import InstallProgress, OpProgress, AcquireProgress
+
+from PyQt4 import QtCore, QtGui
+
+if __name__ != '__main__':
+    import vistrails.tests
+    raise vistrails.tests.NotModule('This should not be imported as a module')
+
+
+package_name = sys.argv[1]
+
+##############################################################################
+
+class GuiOpProgress(OpProgress):
+    def __init__(self, pbar):
+        OpProgress.__init__(self)
+        self.pbar = pbar
+
+    def update(self, percent):
+        self.pbar.setValue(int(percent))
+        QtGui.qApp.processEvents()
+        OpProgress.update(self, percent)
+
+    def done(self):
+        OpProgress.done(self)
+
+class GUIAcquireProgress(AcquireProgress):
+    def __init__(self, pbar, status_label):
+        AcquireProgress.__init__(self)
+        self.pbar = pbar
+        self.status_label = status_label
+        self.percent = 0.0
+
+    def pulse(self, owner):
+        current_item = self.current_items + 1
+        if current_item > self.total_items:
+            current_item = self.total_items
+        if self.current_cps > 0:
+            text = (_("Downloading file %(current)li of %(total)li with "
+                      "%(speed)s/s") % \
+                      {"current": current_item,
+                       "total": self.total_items,
+                       "speed": apt_pkg.size_to_str(self.current_cps)})
+        else:
+            text = (_("Downloading file %(current)li of %(total)li") % \
+                      {"current": current_item,
+                       "total": self.total_items})
+        self.status_label.setText(text)
+        percent = (((self.current_bytes + self.current_items) * 100.0) /
+                        float(self.total_bytes + self.total_items))
+        self.pbar.setValue(int(percent))
+        QtGui.qApp.processEvents()
+        return True
+
+    def start(self):
+        self.status_label.setText("Started downloading.")
+        QtGui.qApp.processEvents()
+
+    def stop(self):
+        self.status_label.setText("Finished downloading.")
+        QtGui.qApp.processEvents()
+
+    def done(self, item):
+        print "[Fetched] %s" % item.shortdesc
+        self.status_label.setText("[Fetched] %s" % item.shortdesc)
+        QtGui.qApp.processEvents()
+
+    def fail(self, item):
+        print "[Failed] %s" % item.shortdesc
+
+    def ims_hit(self, item):
+        print "[Hit] %s" % item.shortdesc
+        self.status_label.setText("[Hit] %s" % item.shortdesc)
+        QtGui.qApp.processEvents()
+
+    def media_change(self, media, drive):
+        print "[Waiting] Please insert media '%s' in drive '%s'" % (
+                media, drive)
+
+class GUIInstallProgress(InstallProgress):
+    def __init__(self, pbar, status_label):
+        InstallProgress.__init__(self)
+        self.pbar = pbar
+        self.status_label = status_label
+        self.last = 0.0
+
+    def status_change(self, pkg, percent, status):
+        if self.last >= percent:
+            return
+        self.status_label.setText(status)
+        self.pbar.setValue(int(percent))
+        self.last = percent
+        QtGui.qApp.processEvents()
+
+    def pulse(self):
+        QtGui.qApp.processEvents()
+        return InstallProgress.pulse(self)
+
+    def finish_update(self):
+        pass
+
+    def processing(self, pkg, stage):
+        print "starting '%s' stage for %s" % (stage, pkg)
+
+    def conffile(self,current,new):
+        print "WARNING: conffile prompt: %s %s" % (current, new)
+
+    def error(self, errorstr):
+        print "ERROR: got dpkg error: '%s'" % errorstr
+
+##############################################################################
+
+class Window(QtGui.QWidget):
+    def __init__(self, parent=None):
+        QtGui.QMainWindow.__init__(self, parent)
+
+        mainlayout = QtGui.QVBoxLayout()
+        self.setLayout(mainlayout)
+        desktop = QtGui.qApp.desktop()
+        geometry = desktop.screenGeometry(self)
+        h = 200
+        w = 300
+        self.setGeometry(geometry.left() + (geometry.width() - w)/2,
+                         geometry.top() + (geometry.height() - h)/2,
+                         w, h)
+        self.setWindowTitle('VisTrails APT interface')
+        lbl = QtGui.QLabel(self)
+        mainlayout.addWidget(lbl)
+        lbl.setText("VisTrails is about to install '%s'."
+                    "Continue?" % package_name)
+        lbl.resize(self.width(), 150)
+        lbl.setAlignment(QtCore.Qt.AlignHCenter)
+        lbl.setWordWrap(True)
+        layout = QtGui.QHBoxLayout()
+        self.allowBtn = QtGui.QPushButton("Install")
+        self.denyBtn = QtGui.QPushButton("Cancel")
+        layout.addWidget(self.allowBtn)
+        layout.addWidget(self.denyBtn)
+        self.layout().addLayout(layout)
+
+        self.connect(self.allowBtn, QtCore.SIGNAL("clicked()"),
+                     self.perform_install)
+        self.connect(self.denyBtn, QtCore.SIGNAL("clicked()"),
+                    self.fail_quit)
+        pbarlayout = QtGui.QVBoxLayout()
+        pbar = QtGui.QProgressBar()
+        pbar.setMinimum(0)
+        pbar.setMaximum(100)
+        pbarlayout.addWidget(pbar)
+        self.layout().addLayout(pbarlayout)
+        pbar.show()
+        self.pbar = pbar
+        self.pbar.setValue(0)
+        self.status_label = QtGui.QLabel(self)
+        mainlayout.addWidget(self.status_label)
+        self.layout().addStretch()
+
+        self.op_progress = None #GuiOpProgress(self.pbar)
+        self.status_label.setText('Waiting for decision...')
+
+    def fail_quit(self):
+        sys.exit(-1)
+
+    def perform_install(self):
+        self.allowBtn.setEnabled(False)
+        self.denyBtn.setEnabled(False)
+
+        self.status_label.setText('Reading package cache')
+        QtGui.qApp.processEvents()
+        apt_pkg.init()
+        cache = apt.cache.Cache(self.op_progress)
+        pkg = None
+        try:
+            pkg = cache[package_name]
+        except KeyError:
+            self.status_label.setText('Package not found: updating cache')
+            QtGui.qApp.processEvents()
+            cache.update(self.op_progress)
+            try:
+                pkg = cache[package_name]
+            except KeyError:
+                self.show_quit('Package not found!')
+        if pkg.is_installed:
+            self.show_quit('Package already installed!', result=0)
+        self.status_label.setText('Marking for install')
+        pkg.mark_install()
+        self.status_label.setText('Installing')
+        QtGui.qApp.processEvents()
+        try:
+            aprogress = GUIAcquireProgress(self.pbar, self.status_label)
+            iprogress = GUIInstallProgress(self.pbar, self.status_label)
+            cache.commit(aprogress, iprogress)
+        except Exception:
+            import traceback; traceback.print_exc()
+            self.show_quit('Error installing package!')
+        print "Installation successful, back to VisTrails..."
+        self.show_quit("Success, exiting...", result=0)
+
+    def show_quit(self, message, t=2, result=1):
+        self.status_label.setText(message)
+        QtGui.qApp.processEvents()
+        time.sleep(t)
+        sys.exit(result)
+
+##############################################################################
+
+app = QtGui.QApplication(sys.argv)
+
+window = Window()
+window.show()
+app.exec_()
+sys.exit(0)
diff --git a/vistrails/gui/bundles/linux_fedora_install.py b/vistrails/gui/bundles/linux_fedora_install.py
new file mode 100755
index 0000000..a950763
--- /dev/null
+++ b/vistrails/gui/bundles/linux_fedora_install.py
@@ -0,0 +1,198 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Installs a package through YUM
+
+# import yum
+# import apt_pkg
+# import sys, os
+# import copy
+# import time
+
+# package_name = sys.argv[1]
+
+# from apt.progress import InstallProgress
+# from apt.progress import FetchProgress
+
+# cache = apt.Cache(apt.progress.OpTextProgress())
+
+# try:
+#     pkg = cache[package_name]
+# except KeyError:
+#     sys.exit(1)
+
+# if pkg.isInstalled:
+#     print "Package '%s' already installed" % package_name
+#     sys.exit(0)
+
+
+# ##############################################################################
+
+# from PyQt4 import Qt, QtCore, QtGui
+
+# class GUIInstallProgress(InstallProgress):
+#     def __init__(self, pbar, status_label):
+#         apt.progress.InstallProgress.__init__(self)
+#         self.pbar = pbar
+#         self.status_label = status_label
+#         self.last = 0.0
+#     def updateInterface(self):
+#         InstallProgress.updateInterface(self)
+#         if self.last >= self.percent:
+#             return
+#         self.status_label.setText(self.status)
+#         self.pbar.setValue(int(self.percent))
+#         self.last = self.percent
+#         QtGui.qApp.processEvents()
+#     def pulse(self):
+#         QtGui.qApp.processEvents()
+#         return InstallProgress.pulse(self)
+#     def conffile(self,current,new):
+#         print "conffile prompt: %s %s" % (current,new)
+#     def error(self, errorstr):
+#         print "got dpkg error: '%s'" % errorstr
+
+# class GUIFetchProgress(FetchProgress):
+
+#     def __init__(self, pbar, status_label):
+#         apt.progress.FetchProgress.__init__(self)
+#         self.pbar = pbar
+#         self.status_label = status_label
+
+#     def pulse(self):
+#         FetchProgress.pulse(self)
+#         if self.currentCPS > 0:
+#             s = "%sB/s %s" % (apt_pkg.SizeToStr(int(self.currentCPS)),
+#                               apt_pkg.TimeToStr(int(self.eta)))
+#         else:
+#             s = "[Working..]"
+#         self.status_label.setText(s)
+#         self.pbar.setValue(int(self.percent))
+#         QtGui.qApp.processEvents()
+#         return True
+
+#     def stop(self):
+#         self.status_label.setText("Finished downloading.")
+#         QtGui.qApp.processEvents()
+    
+#     def updateStatus(self, uri, descr, shortDescr, status):
+#         if status != self.dlQueued:
+#             print "\r%s %s" % (self.dlStatusStr[status], descr)
+    
+        
+# class Window(QtGui.QWidget):
+
+#     def __init__(self, parent=None):
+#         QtGui.QMainWindow.__init__(self, parent)
+        
+#         mainlayout = QtGui.QVBoxLayout()
+#         self.setLayout(mainlayout)
+#         desktop = QtGui.qApp.desktop()
+#         print desktop.isVirtualDesktop()
+#         geometry = desktop.screenGeometry(self)
+#         h = 200
+#         w = 300
+#         self.setGeometry(geometry.left() + (geometry.width() - w)/2,
+#                          geometry.top() + (geometry.height() - h)/2,
+#                          w, h)
+#         self.setWindowTitle('VisTrails APT interface')
+#         lbl = QtGui.QLabel(self)
+#         mainlayout.addWidget(lbl)
+#         lbl.setText("VisTrails wants to use APT to install\
+#  package '%s'. Do you want to allow this?" % package_name) 
+#         lbl.resize(self.width(), 150)
+#         lbl.setAlignment(QtCore.Qt.AlignHCenter)
+#         lbl.setWordWrap(True)
+#         layout = QtGui.QHBoxLayout()
+#         self.allowBtn = QtGui.QPushButton("Yes, allow")
+#         self.denyBtn = QtGui.QPushButton("No, deny")
+#         layout.addWidget(self.allowBtn)
+#         layout.addWidget(self.denyBtn)
+#         self.layout().addLayout(layout)
+
+#         self.connect(self.allowBtn, QtCore.SIGNAL("clicked()"),
+#                      self.perform_install)
+#         self.connect(self.denyBtn, QtCore.SIGNAL("clicked()"),
+#                      QtGui.qApp, QtCore.SLOT("quit()"))
+
+#         pbarlayout = QtGui.QVBoxLayout()
+#         pbar = QtGui.QProgressBar()
+#         pbar.setMinimum(0)
+#         pbar.setMaximum(100)
+#         pbarlayout.addWidget(pbar)
+#         self.layout().addLayout(pbarlayout)
+#         pbar.show()
+#         self.pbar = pbar
+#         self.pbar.setValue(0)
+#         self.status_label = QtGui.QLabel(self)
+#         mainlayout.addWidget(self.status_label)
+#         self.status_label.setText('Waiting for decision...')
+#         self.layout().addStretch()
+
+#     def perform_install(self):
+#         pkg.markInstall()
+#         self.allowBtn.setEnabled(False)
+#         self.denyBtn.setEnabled(False)
+#         fprogress = GUIFetchProgress(self.pbar, self.status_label)
+#         iprogress = GUIInstallProgress(self.pbar, self.status_label)
+#         try:
+#             cache.commit(fprogress, iprogress)
+#         except OSError, e:
+#             pass
+#         except Exception, e:
+            
+#             self._timeout = QtCore.QTimer()
+#             self.connect(self._timeout, QtCore.SIGNAL("timeout()"),
+#                          QtGui.qApp, QtCore.SLOT("quit()"))
+#             self._timeout.start(3000)
+#             self.status_label.setText("Success, exiting in 3 seconds.")
+
+# app = QtGui.QApplication(sys.argv)
+
+# window = Window()
+# window.show()
+# print app.exec_()
+# sys.exit(0)
+import os
+import sys
+
+if __name__ != '__main__':
+    from vistrails.tests import NotModule
+    raise NotModule('This should not be imported as a module')
+
+sys.exit(os.system('yum -y install ' + ' '.join(sys.argv[1:])))
+
+################################################################################
diff --git a/vistrails/gui/bundles/utils.py b/vistrails/gui/bundles/utils.py
new file mode 100644
index 0000000..0209958
--- /dev/null
+++ b/vistrails/gui/bundles/utils.py
@@ -0,0 +1,150 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Utility functions for core.bundles"""
+from vistrails.core import debug
+import vistrails.core.system
+import os
+import platform
+import sys
+
+##############################################################################
+
+def guess_graphical_sudo():
+    """Tries to guess what to call to run a shell with elevated privileges.
+
+    Returns: (sudo, escape)
+    Where:
+      sudo is the command to be used to gain root privileges, it 
+           should contain %s where the actual command will be inserted
+      escape is True if the rest of the line needs to be escaped
+    """
+    if sys.platform == 'win32':
+        return '%s', False
+    # sudo needs -E so that the Xauthority file is found and root can connect
+    # to the user's X server
+    if vistrails.core.system.executable_is_in_path('kdesudo'):
+        return 'kdesudo %s', True
+    elif vistrails.core.system.executable_is_in_path('kdesu'):
+        return 'kdesu %s', False
+    elif vistrails.core.system.executable_is_in_path('gksu'):
+        return 'gksu %s', False
+    elif (vistrails.core.system.executable_is_in_path('sudo') and
+          vistrails.core.system.executable_is_in_path('zenity')):
+        # This is a reasonably convoluted hack to only prompt for the password
+        # if user has not recently entered it
+        return ('((echo "" | sudo -v -S -p "") || '
+                '(zenity --entry --title "sudo password prompt" --text '
+                '"Please enter your password to give the system install '
+                'authorization." --hide-text="" | sudo -v -S -p "")); '
+                'sudo -E -S -p "" %s',
+               False)
+        # graphical sudo for osx
+    elif vistrails.core.system.executable_is_in_path('osascript'):
+        return "osascript -e " \
+               "'do shell script %s with administrator privileges'", True
+    else:
+        debug.warning("Could not find a graphical sudo-like command.")
+
+        if vistrails.core.system.get_executable_path('sudo'):
+            debug.warning("Will use regular sudo")
+            return "sudo -E %s", False
+        else:
+            debug.warning("Will use regular su")
+            return "su --preserve-environment -c %s", True
+
+##############################################################################
+
+class System_guesser(object):
+
+    def __init__(self):
+        self._callable_dict = {}
+
+    def add_test(self, test, system_name):
+        if self._callable_dict.has_key(system_name):
+            raise ValueError("test for '%s' already present." % system_name)
+        if system_name == 'UNKNOWN':
+            raise ValueError("Invalid system name")
+        assert isinstance(system_name, str)
+        self._callable_dict[system_name] = test
+
+    def guess_system(self):
+        for (name, callable_) in self._callable_dict.iteritems():
+            if callable_():
+                return name
+        else:
+            return 'UNKNOWN'
+
+_system_guesser = System_guesser()
+
+##############################################################################
+# System tests
+
+def _guess_suse():
+    try:
+        tokens = open('/etc/SuSE-release').readline()[-1].split()
+        return tokens[0] == 'SUSE'
+    except:
+        return False
+_system_guesser.add_test(_guess_suse, 'linux-suse')
+
+def _guess_ubuntu():
+    return platform.linux_distribution()[0]=='Ubuntu' or \
+           platform.linux_distribution()[0]=='LinuxMint'
+_system_guesser.add_test(_guess_ubuntu, 'linux-ubuntu')
+
+def _guess_debian():
+    return platform.linux_distribution()[0].lower() == 'debian'
+_system_guesser.add_test(_guess_debian, 'linux-debian')
+
+def _guess_fedora():
+    return os.path.isfile('/etc/fedora-release')
+_system_guesser.add_test(_guess_fedora, 'linux-fedora')
+
+def _guess_windows():
+    return vistrails.core.system.systemType == 'Windows'
+_system_guesser.add_test(_guess_windows, 'windows')
+
+##############################################################################
+
+def guess_system():
+    """guess_system will try to identify which system you're running. Result
+will be a string describing the system. This is more discriminating than
+Linux/OSX/Windows: We'll try to figure out whether you're running SuSE, Debian,
+Ubuntu, RedHat, fink, darwinports, etc.
+
+Currently, we only support SuSE, Debian, Ubuntu and Fedora. However, we only
+have actual bundle installing for Debian, Ubuntu and Fedora."""
+    return _system_guesser.guess_system()
diff --git a/vistrails/gui/collection/__init__.py b/vistrails/gui/collection/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/gui/collection/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/gui/collection/explorer.py b/vistrails/gui/collection/explorer.py
new file mode 100644
index 0000000..a02724e
--- /dev/null
+++ b/vistrails/gui/collection/explorer.py
@@ -0,0 +1,758 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core import debug
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core.collection.search import SearchCompiler, SearchParseError
+from vistrails.core.db.locator import FileLocator, DBLocator
+from vistrails.core.system import default_connections_file
+from vistrails.core.external_connection import ExtConnectionList
+from vistrails.db import VistrailsDBException
+from vistrails.db.services.io import test_db_connection
+from vistrails.db.services.query import runLogQuery, runWorkflowQuery
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.open_db_window import QDBConnectionList, QConnectionDBSetupWindow
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+import vistrails.gui
+
+class QExplorerWindow(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        
+        self.layout = QtGui.QVBoxLayout()
+        self.layout.setContentsMargins(0, 0, 0, 0)
+
+        self.splitter = QtGui.QSplitter()
+        self.splitter.setContentsMargins(0, 0, 0, 0)
+        self.layout.addWidget(self.splitter)
+        self.connectionList = QDBConnectionList(self)
+        dbGrid = QtGui.QGridLayout(self)
+        dbGrid.setMargin(0)
+        dbGrid.setSpacing(0)
+        dbGrid.addWidget(self.connectionList, 2, 1, QtCore.Qt.AlignLeft)
+        self.addAct = QtGui.QAction("Add Database", self)
+        self.removeAct = QtGui.QAction("Remove Database", self)
+        self.addButton = QtGui.QToolButton()
+        self.addButton.setToolTip("Create a new database connection")
+        self.addButton.setDefaultAction(self.addAct)
+        self.addButton.setAutoRaise(True)
+        self.removeButton = QtGui.QToolButton()
+        self.removeButton.setToolTip("Remove the selected connection from list")
+        self.removeButton.setDefaultAction(self.removeAct)
+        self.removeButton.setAutoRaise(True)
+        self.removeButton.setEnabled(False)
+        panelButtonsLayout = QtGui.QHBoxLayout()
+        panelButtonsLayout.setMargin(0)
+        panelButtonsLayout.setSpacing(0)
+        panelButtonsLayout.addWidget(self.addButton)
+        panelButtonsLayout.addWidget(self.removeButton)
+        dbGrid.addLayout(panelButtonsLayout, 1, 1, QtCore.Qt.AlignLeft)
+        dbWidget = QDBWidget(parent, self.connectionList)
+        dbWidget.setLayout(dbGrid)
+        self.splitter.addWidget(dbWidget)
+        self.connect(self.addAct,
+                     QtCore.SIGNAL('triggered()'),
+                     self.showConnConfig)
+        self.connect(self.removeAct,
+                     QtCore.SIGNAL('triggered()'),
+                     self.connectionList.removeConnection)
+        self.connect(self.connectionList,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.updateEditButtons)
+        self.connect(self.connectionList,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.checkConnection)
+        self.tabView = QtGui.QTabWidget()
+        self.tabView.setContentsMargins(0, 0, 0, 0)
+        self.splitter.addWidget(self.tabView)
+#        self.workflowSearch = WorkflowSearchWidget(self.connectionList)
+#        self.tabView.addTab(self.workflowSearch, "Search for Workflows")
+        self.executionSearch = ExecutionSearchWidget(self.connectionList)
+        self.tabView.addTab(self.executionSearch, "Search for Workflow Executions")
+        self.setLayout(self.layout)
+        self.setWindowTitle('Provenance Browser')
+        self.resize(QtCore.QSize(800, 600))
+#        self.workflowSearch.setup_results()
+        self.executionSearch.setup_results()
+
+    def showConnConfig(self, *args, **keywords):
+        return showConnConfig(self.connectionList, *args, **keywords)
+
+    def updateEditButtons(self):
+        """updateEditButtons() -> None
+        It will enable/disable the connections buttons according to the
+        selection
+
+        """
+        self.workflowSearch.setup_results()
+        self.executionSearch.setup_results()
+        id = self.connectionList.getCurrentItemId()
+        if id != -1:
+            self.removeButton.setEnabled(True)
+        else:
+            self.removeButton.setEnabled(False)
+
+    def checkConnection(self):
+        checkConnection(self.connectionList)
+
+        
+    def getConnectionInfo(self, id):
+        return getConnectionInfo(self.connectionList, id)
+
+def showConnConfig(connectionList, *args, **keywords):
+    """showConnConfig(*args, **keywords) -> None
+    shows a window to configure the connection. The valid keywords
+    are defined in QConnectionDBSetupWindow.__init__()
+    
+    """
+    dialog = QConnectionDBSetupWindow(**keywords)
+    if dialog.exec_() == QtGui.QDialog.Accepted:
+        config = {'id': int(dialog.id),
+                  'name': str(dialog.nameEdt.text()),
+                  'host': str(dialog.hostEdt.text()),
+                  'port': int(dialog.portEdt.value()),
+                  'user': str(dialog.userEdt.text()),
+                  'passwd': str(dialog.passwdEdt.text()),
+                  'db': str(dialog.databaseEdt.text())}
+        id = connectionList.setConnectionInfo(**config)
+        connectionList.setCurrentId(id)
+        return True
+    else:
+        return False
+
+def getConnectionInfo(connectionList, id):
+    """getConnectionInfo(connectionList: QDBConnectionList, id: int) -> dict
+    Returns info of ExtConnection """
+    conn = connectionList.get_connection(id)
+    key = str(conn.id) + "." + conn.name + "." + conn.host
+    passwd = DBLocator.keyChain.get_key(key)
+    if conn != None:
+        config = {'id': conn.id,
+                  'name': conn.name,
+                  'host': conn.host,
+                  'port': conn.port,
+                  'user': conn.user,
+                  'passwd': passwd,
+                  'db': conn.database}
+    else:
+        config = None
+    return config
+
+def checkConnection(connectionList):
+    """checkConnection() -> None
+    It will try if the connection works or if a password is necessary
+
+    """
+    conn_id = connectionList.getCurrentItemId()
+    if conn_id != -1:
+        conn = connectionList.get_connection(conn_id)
+        config = getConnectionInfo(connectionList, conn_id)
+        if config != None:
+            try:
+                config_name = config['name']
+                del config['name']
+                config_id = config['id']
+                del config['id']
+                test_db_connection(config)
+            except VistrailsDBException:
+                # assume connection is wrong
+                config['name'] = config_name
+                config['id'] = config_id
+                config["create"] = False
+                showConnConfig(connectionList, **config)
+
+class QDBWidget(QtGui.QWidget):
+    """ Custom widget for handling the showConnConfig """
+
+    def __init__(self, parent, connectionList):
+        QtGui.QWidget.__init__(self, parent)
+        self.connectionList = connectionList
+
+    def showConnConfig(self, *args, **keywords):
+        return showConnConfig(self.connectionList, *args, **keywords)
+
+class ExecutionSearchWidget(QtGui.QSplitter):
+    def __init__(self, connectionList):
+        QtGui.QSplitter.__init__(self)
+        self.connectionList = connectionList
+        self.conn = None
+        self.config = None
+        self.offset = 0
+        self.limit = 50
+        self.numRows = None
+        self.vistrail = None
+        self.version = None
+        self.fromTime = None
+        self.toTime = None
+        self.user = None
+        self.thumbs = None
+        self.completed = None
+        self.modules = []
+        self.setOrientation(QtCore.Qt.Vertical)
+        self.searchLayout = QtGui.QGridLayout()
+        self.vistrailEditCheckBox = QtGui.QCheckBox()
+        self.vistrailEditCheckBox.setToolTip('Check to enable this search option')
+        self.vistrailEdit = QtGui.QLineEdit()
+        self.searchLayout.addWidget(self.vistrailEditCheckBox, 0,0)
+        self.searchLayout.addWidget(QtGui.QLabel('Vistrail:'), 0,1)
+        self.searchLayout.addWidget(self.vistrailEdit,         0,2)
+        self.versionEditCheckBox = QtGui.QCheckBox()
+        self.versionEditCheckBox.setToolTip('Check to enable this search option')
+        self.versionEdit = QtGui.QLineEdit()
+        self.searchLayout.addWidget(self.versionEditCheckBox, 0,3)
+        self.searchLayout.addWidget(QtGui.QLabel('Version:'), 0,4)
+        self.searchLayout.addWidget(self.versionEdit,         0,5)
+        self.fromTimeEditCheckBox = QtGui.QCheckBox()
+        self.fromTimeEditCheckBox.setToolTip('Check to enable this search option')
+        self.fromTimeEdit = QtGui.QDateTimeEdit(QtCore.QDateTime.currentDateTime().addDays(-1))
+        self.fromTimeEdit.setDisplayFormat('yyyy-MM-d H:mm:ss')
+        self.fromTimeEdit.setCalendarPopup(True)
+        self.searchLayout.addWidget(self.fromTimeEditCheckBox,  1,0)
+        self.searchLayout.addWidget(QtGui.QLabel('From time:'), 1,1)
+        self.searchLayout.addWidget(self.fromTimeEdit,          1,2)
+        self.toTimeEditCheckBox = QtGui.QCheckBox()
+        self.toTimeEditCheckBox.setToolTip('Check to enable this search option')
+        self.toTimeEdit = QtGui.QDateTimeEdit(QtCore.QDateTime.currentDateTime())
+        self.toTimeEdit.setDisplayFormat('yyyy-MM-d H:mm:ss')
+        self.toTimeEdit.setCalendarPopup(True)
+        self.searchLayout.addWidget(self.toTimeEditCheckBox,  1,3)
+        self.searchLayout.addWidget(QtGui.QLabel('To time:'), 1,4)
+        self.searchLayout.addWidget(self.toTimeEdit,          1,5)
+        self.userEditCheckBox = QtGui.QCheckBox()
+        self.userEditCheckBox.setToolTip('Check to enable this search option')
+        self.userEdit = QtGui.QLineEdit()
+        self.searchLayout.addWidget(self.userEditCheckBox, 2,0)
+        self.searchLayout.addWidget(QtGui.QLabel('User:'), 2,1)
+        self.searchLayout.addWidget(self.userEdit,         2,2)
+        self.completedEditCheckBox = QtGui.QCheckBox()
+        self.completedEditCheckBox.setToolTip('Check to enable this search option')
+        self.completedEdit = QtGui.QComboBox()
+        self.completedEdit.addItems(['Yes', 'No', 'Error'])
+        self.searchLayout.addWidget(self.completedEditCheckBox, 2,3)
+        self.searchLayout.addWidget(QtGui.QLabel('Completed:'), 2,4)
+        self.searchLayout.addWidget(self.completedEdit,         2,5)
+        
+        self.moduleEditCheckBox = QtGui.QCheckBox()
+        self.moduleEditCheckBox.setToolTip('Check to enable this search option')
+        self.moduleEdit = QtGui.QLineEdit()
+        self.moduleEdit.setToolTip('Add module names separated by ,\nResult type can be specified by using: ModuleName:Yes/No/Error')
+        self.searchLayout.addWidget(self.moduleEditCheckBox,  3,0)
+        self.searchLayout.addWidget(QtGui.QLabel('Modules:'), 3,1)
+        self.searchLayout.addWidget(self.moduleEdit,          3,2)
+        self.thumbsCheckBox = QtGui.QCheckBox()
+        self.thumbsCheckBox.setToolTip('Check to view result thumbnails (may be slow)')
+        self.searchLayout.addWidget(self.thumbsCheckBox,  3,3)
+        self.searchLayout.addWidget(QtGui.QLabel('View thumbs'), 3,4)
+        self.searchButton = QtGui.QPushButton("Search")
+        self.searchButton.setStatusTip("Search the database for executions")
+        self.searchLayout.addWidget(self.searchButton, 3, 5)
+        self.searchWidget = QtGui.QWidget()
+        self.searchWidget.setLayout(self.searchLayout)
+        self.addWidget(self.searchWidget)
+        self.itemView = QtGui.QTreeWidget(self.parent())
+        self.addWidget(self.itemView)
+        statusGrid = QtGui.QGridLayout()
+        statusGrid.setMargin(0)
+        statusGrid.setSpacing(0)
+        statusWidget = QtGui.QWidget()
+        statusWidget.setLayout(statusGrid)
+        self.addWidget(statusWidget)
+        self.setStretchFactor(0, 0)
+        self.setStretchFactor(1, 1)
+        self.setStretchFactor(2, 0)
+        statusLayout = QtGui.QHBoxLayout()
+        statusLayout.setSpacing(5)
+        statusGrid.addLayout(statusLayout, 2, 1, QtCore.Qt.AlignLeft)
+        
+        self.prevButton = QtGui.QPushButton("Previous")
+        self.prevButton.setStatusTip("Show previous results")
+        self.prevButton.hide()
+        statusLayout.addWidget(self.prevButton)
+
+        self.nextButton = QtGui.QPushButton("Next")
+        self.nextButton.setStatusTip("Show next results")
+        self.nextButton.hide()
+        statusLayout.addWidget(self.nextButton)
+
+        self.statusText = QtGui.QLabel('No query specified')
+        statusLayout.addWidget(self.statusText)
+        self.connect(self.searchButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.newQuery)
+        self.connect(self.prevButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.gotoPrevious)
+        self.connect(self.nextButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.gotoNext)
+        self.connect(self.itemView,
+                     QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *,int)'),
+                     self.showItem)
+
+    def newQuery(self):
+        self.offset = 0
+        self.vistrail = None
+        if self.vistrailEditCheckBox.isChecked():
+            self.vistrail = str(self.vistrailEdit.text()).strip()
+        self.version = None
+        if self.versionEditCheckBox.isChecked():
+            self.version = str(self.versionEdit.text()).strip()
+        self.fromTime = None
+        if self.fromTimeEditCheckBox.isChecked():
+            self.fromTime = str(
+                self.fromTimeEdit.dateTime().toString('yyyy-MM-d H:mm:ss'))
+        self.toTime = None
+        if self.toTimeEditCheckBox.isChecked():
+            self.toTime = str(
+                self.toTimeEdit.dateTime().toString('yyyy-MM-d H:mm:ss'))
+        self.user = None
+        if self.userEditCheckBox.isChecked():
+            self.user = str(self.userEdit.text()).strip()
+        self.completed = None
+        if self.completedEditCheckBox.isChecked():
+            self.completed = str(self.completedEdit.currentText()).strip()
+        self.modules = []
+        if self.moduleEditCheckBox.isChecked():
+            # create list of [moduleType, completed] pairs
+            modules = str(self.moduleEdit.text()).strip()
+            for k in [i.strip() for i in modules.split(',')]:
+                v = k.split(':')
+                if len(v)>1:
+                    self.modules.append((v[0].strip(), v[1].strip()))
+                else:
+                    self.modules.append((v[0].strip(), None))
+        self.thumbs = self.thumbsCheckBox.isChecked()
+        conn_id = self.connectionList.getCurrentItemId()
+        self.conn = self.connectionList.get_connection(conn_id)
+        self.config = getConnectionInfo(self.connectionList, conn_id)
+        
+        self.searchDatabase()
+
+    def searchDatabase(self):
+        self.statusText.setText("Running query...")
+        self.repaint()
+        # create connection
+        conn = self.conn
+        config = self.config
+        if conn.dbtype == 'MySQL':
+            #removing extra keyword arguments for MySQldb
+            config_name = config['name']
+            del config['name']
+            config_id = config['id']
+            del config['id']
+            
+        wf_exec_list = runLogQuery(config,
+                                vistrail=self.vistrail, version=self.version,
+                                fromTime=self.fromTime, toTime=self.toTime,
+                                user=self.user, completed=self.completed,
+                                offset=self.offset, limit=self.limit,
+                                modules=self.modules, thumbs=self.thumbs)
+        if 0 == self.offset:
+            wf_exec_list, self.numRows = wf_exec_list
+        if conn.dbtype == 'MySQL':
+            config['name'] = config_name
+            config['id'] = config_id
+        self.setup_results(wf_exec_list)
+        self.updateStatus()
+
+    def gotoPrevious(self):
+        self.offset = max(self.offset - self.limit, 0)
+        self.searchDatabase()
+
+    def gotoNext(self):
+        self.offset = min(self.offset + self.limit, self.numRows)
+        self.searchDatabase()
+        
+    def updateStatus(self):
+        if self.offset > 0:
+            self.prevButton.show()
+        else:
+            self.prevButton.hide()
+        last = self.offset + self.limit
+        if last < self.numRows:
+            self.nextButton.show()
+        else:
+            self.nextButton.hide()
+            last = self.numRows
+        if self.numRows:
+            self.statusText.setText("Showing %s-%s out of %s results" %
+                                    (self.offset+1, last, self.numRows))
+        else:
+            self.statusText.setText("No matching results found")
+
+    def setup_results(self, wf_exec_list=[]):
+        self.itemView.clear()
+        self.itemView.setIconSize(QtCore.QSize(32,32))
+        columns = ['Vistrail', 'Version', 'Start time', 'End time', 'Completed']
+        self.itemView.setColumnCount(len(columns))
+        self.itemView.setHeaderLabels(columns)
+        self.itemView.setSortingEnabled(True)
+        for wf_exec in wf_exec_list:
+            item = QExecutionItem(wf_exec)
+            self.itemView.addTopLevelItem(item)
+        self.itemView.header().setResizeMode(4, QtGui.QHeaderView.ResizeToContents)
+        self.itemView.header().setResizeMode(3, QtGui.QHeaderView.ResizeToContents)
+        self.itemView.header().setResizeMode(2, QtGui.QHeaderView.ResizeToContents)
+        self.itemView.header().setResizeMode(1, QtGui.QHeaderView.Interactive)
+        self.itemView.header().setResizeMode(0, QtGui.QHeaderView.Interactive)
+        self.itemView.header().resizeSections(QtGui.QHeaderView.Stretch)
+        conn_id = self.connectionList.getCurrentItemId()
+        if conn_id < 0:
+            self.statusText.setText("Select a database")
+            
+    def showItem(self, item, col):
+        (v_name, v_id, log_id, v_version, version_name, e_id,
+         ts_start, ts_end, user, completed, thumb) = item.wf_exec
+        config = self.config
+        locator = \
+           DBLocator(config['host'],
+                     config['port'],
+                     config['db'],
+                     config['user'],
+                     config['passwd'],
+                     config['name'],
+                     obj_id=v_id,
+                     obj_type='vistrail',
+                     workflow_exec=ts_start,
+                     connection_id=config.get('id', None))
+        #print "url:", locator.to_url()
+        import vistrails.gui.application
+        app = vistrails.gui.application.get_vistrails_application()
+        open_vistrail = app.builderWindow.open_vistrail_without_prompt
+
+        workflow_exec = locator.kwargs.get('workflow_exec', None)
+        args = {}
+        if workflow_exec:
+            args['workflow_exec'] = workflow_exec
+        args['version'] = version_name if version_name else v_version
+        open_vistrail(locator, **args)
+
+class QExecutionItem(QtGui.QTreeWidgetItem):
+    def __init__(self, wf_exec, parent=None):
+        (v_name, v_id, log_id, v_version, version_name, e_id,
+         ts_start, ts_end, user, completed, thumb) = wf_exec
+        version = version_name if version_name else v_version
+        completed = {'-1':'Error', '0':'No', '1':'Yes'}.get(str(completed), 'Unknown')
+        labels = (str(v_name), str(version),
+                  str(ts_start), str(ts_end), str(completed))
+        QtGui.QTreeWidgetItem.__init__(self, labels)
+        self.wf_exec = wf_exec
+        self.setToolTip(0, 'vistrail:%s version:%s log:%s wf_exec:%s user:%s' %
+                           (v_id, v_version, log_id, e_id, user))
+        if thumb:
+            pixmap = QtGui.QPixmap()
+            pixmap.loadFromData(thumb)
+            self.setIcon(1, QtGui.QIcon(pixmap))
+            tooltip = """<img border=0 src="data:image/png;base64,%s">""" % thumb.encode('base64')
+            self.setToolTip(1, tooltip)
+            
+    def __lt__(self, other):
+        sort_col = self.treeWidget().sortColumn()
+        if sort_col in set([1]):
+            try:
+                return int(self.text(sort_col)) < int(other.text(sort_col))
+            except ValueError:
+                pass
+        return QtGui.QTreeWidgetItem.__lt__(self, other)
+
+class WorkflowSearchWidget(QtGui.QSplitter):
+    def __init__(self, connectionList):
+        QtGui.QSplitter.__init__(self)
+        self.connectionList = connectionList
+        self.conn = None
+        self.config = None
+        self.offset = 0
+        self.limit = 50
+        self.numRows = None
+        self.vistrail = None
+        self.version = None
+        self.fromTime = None
+        self.toTime = None
+        self.user = None
+        self.thumbs = None
+        self.modules = []
+        self.setOrientation(QtCore.Qt.Vertical)
+        self.searchLayout = QtGui.QGridLayout()
+        self.vistrailEditCheckBox = QtGui.QCheckBox()
+        self.vistrailEditCheckBox.setToolTip('Check to enable this search option')
+        self.vistrailEdit = QtGui.QLineEdit()
+        self.searchLayout.addWidget(self.vistrailEditCheckBox, 0,0)
+        self.searchLayout.addWidget(QtGui.QLabel('Vistrail:'), 0,1)
+        self.searchLayout.addWidget(self.vistrailEdit,         0,2)
+        self.versionEditCheckBox = QtGui.QCheckBox()
+        self.versionEditCheckBox.setToolTip('Check to enable this search option')
+        self.versionEdit = QtGui.QLineEdit()
+        self.searchLayout.addWidget(self.versionEditCheckBox, 0,3)
+        self.searchLayout.addWidget(QtGui.QLabel('Version:'), 0,4)
+        self.searchLayout.addWidget(self.versionEdit,         0,5)
+        self.fromTimeEditCheckBox = QtGui.QCheckBox()
+        self.fromTimeEditCheckBox.setToolTip('Check to enable this search option')
+        self.fromTimeEdit = QtGui.QDateTimeEdit(QtCore.QDateTime.currentDateTime().addDays(-1))
+        self.fromTimeEdit.setDisplayFormat('yyyy-MM-d H:mm:ss')
+        self.fromTimeEdit.setCalendarPopup(True)
+        self.searchLayout.addWidget(self.fromTimeEditCheckBox,  1,0)
+        self.searchLayout.addWidget(QtGui.QLabel('From time:'), 1,1)
+        self.searchLayout.addWidget(self.fromTimeEdit,          1,2)
+        self.toTimeEditCheckBox = QtGui.QCheckBox()
+        self.toTimeEditCheckBox.setToolTip('Check to enable this search option')
+        self.toTimeEdit = QtGui.QDateTimeEdit(QtCore.QDateTime.currentDateTime())
+        self.toTimeEdit.setDisplayFormat('yyyy-MM-d H:mm:ss')
+        self.toTimeEdit.setCalendarPopup(True)
+        self.searchLayout.addWidget(self.toTimeEditCheckBox,  1,3)
+        self.searchLayout.addWidget(QtGui.QLabel('To time:'), 1,4)
+        self.searchLayout.addWidget(self.toTimeEdit,          1,5)
+        self.userEditCheckBox = QtGui.QCheckBox()
+        self.userEditCheckBox.setToolTip('Check to enable this search option')
+        self.userEdit = QtGui.QLineEdit()
+        self.searchLayout.addWidget(self.userEditCheckBox, 2,0)
+        self.searchLayout.addWidget(QtGui.QLabel('User:'), 2,1)
+        self.searchLayout.addWidget(self.userEdit,         2,2)
+      
+        self.moduleEditCheckBox = QtGui.QCheckBox()
+        self.moduleEditCheckBox.setToolTip('Check to enable this search option')
+        self.moduleEdit = QtGui.QLineEdit()
+        self.moduleEdit.setToolTip('Add module names separated by ,\nConnected modules can be specified by using: ModuleA->ModuleB')
+        self.searchLayout.addWidget(self.moduleEditCheckBox,  3,0)
+        self.searchLayout.addWidget(QtGui.QLabel('Modules:'), 3,1)
+        self.searchLayout.addWidget(self.moduleEdit,          3,2)
+        self.thumbsCheckBox = QtGui.QCheckBox()
+        self.thumbsCheckBox.setToolTip('Check to view result thumbnails (may be slow)')
+        self.searchLayout.addWidget(self.thumbsCheckBox,  3,3)
+        self.searchLayout.addWidget(QtGui.QLabel('View thumbs'), 3,4)
+        self.searchButton = QtGui.QPushButton("Search")
+        self.searchButton.setStatusTip("Search the database for executions")
+        self.searchLayout.addWidget(self.searchButton, 3, 5)
+        self.searchWidget = QtGui.QWidget()
+        self.searchWidget.setLayout(self.searchLayout)
+        self.addWidget(self.searchWidget)
+        self.itemView = QtGui.QTreeWidget(self.parent())
+        self.addWidget(self.itemView)
+        statusGrid = QtGui.QGridLayout()
+        statusGrid.setMargin(0)
+        statusGrid.setSpacing(0)
+        statusWidget = QtGui.QWidget()
+        statusWidget.setLayout(statusGrid)
+        self.addWidget(statusWidget)
+        self.setStretchFactor(0, 0)
+        self.setStretchFactor(1, 1)
+        self.setStretchFactor(2, 0)
+        statusLayout = QtGui.QHBoxLayout()
+        statusLayout.setSpacing(5)
+        statusGrid.addLayout(statusLayout, 2, 1, QtCore.Qt.AlignLeft)
+        
+        self.prevButton = QtGui.QPushButton("Previous")
+        self.prevButton.setStatusTip("Show previous results")
+        self.prevButton.hide()
+        statusLayout.addWidget(self.prevButton)
+
+        self.nextButton = QtGui.QPushButton("Next")
+        self.nextButton.setStatusTip("Show next results")
+        self.nextButton.hide()
+        statusLayout.addWidget(self.nextButton)
+
+        self.statusText = QtGui.QLabel('No query specified')
+        statusLayout.addWidget(self.statusText)
+        self.connect(self.searchButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.newQuery)
+        self.connect(self.prevButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.gotoPrevious)
+        self.connect(self.nextButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.gotoNext)
+        self.connect(self.itemView,
+                     QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *,int)'),
+                     self.showItem)
+
+    def newQuery(self):
+        self.offset = 0
+        self.vistrail = None
+        if self.vistrailEditCheckBox.isChecked():
+            self.vistrail = str(self.vistrailEdit.text()).strip()
+        self.version = None
+        if self.versionEditCheckBox.isChecked():
+            self.version = str(self.versionEdit.text()).strip()
+        self.fromTime = None
+        if self.fromTimeEditCheckBox.isChecked():
+            self.fromTime = str(
+                self.fromTimeEdit.dateTime().toString('yyyy-MM-d H:mm:ss'))
+        self.toTime = None
+        if self.toTimeEditCheckBox.isChecked():
+            self.toTime = str(
+                self.toTimeEdit.dateTime().toString('yyyy-MM-d H:mm:ss'))
+        self.user = None
+        if self.userEditCheckBox.isChecked():
+            self.user = str(self.userEdit.text()).strip()
+        self.modules = []
+        if self.moduleEditCheckBox.isChecked():
+            # create list of [moduleType, connected to previous] pairs
+            groups = str(self.moduleEdit.text()).strip()
+            groups = [i.strip() for i in groups.split(',')]
+            for group in [i.split('->') for i in groups]:
+                if len(group):
+                    module = group.pop(0).strip()
+                    if len(module):
+                        self.modules.append((module, False))
+                while len(group):
+                    module = group.pop(0).strip()
+                    if len(module):
+                        self.modules.append((module, True))
+        self.thumbs = self.thumbsCheckBox.isChecked()
+        conn_id = self.connectionList.getCurrentItemId()
+        self.conn = self.connectionList.get_connection(conn_id)
+        self.config = getConnectionInfo(self.connectionList, conn_id)
+        
+        self.searchDatabase()
+
+    def searchDatabase(self):
+        self.statusText.setText("Running query...")
+        self.repaint()
+        # create connection
+        conn = self.conn
+        config = self.config
+        if conn.dbtype == 'MySQL':
+            #removing extra keyword arguments for MySQldb
+            config_name = config['name']
+            del config['name']
+            config_id = config['id']
+            del config['id']
+            
+        workflow_list = runWorkflowQuery(config,
+                                vistrail=self.vistrail, version=self.version,
+                                fromTime=self.fromTime, toTime=self.toTime,
+                                user=self.user,
+                                offset=self.offset, limit=self.limit,
+                                modules=self.modules,
+                                thumbs=self.thumbs)
+        if 0 == self.offset:
+            workflow_list, self.numRows = workflow_list
+        if conn.dbtype == 'MySQL':
+            config['name'] = config_name
+            config['id'] = config_id
+        self.setup_results(workflow_list)
+        self.updateStatus()
+
+    def gotoPrevious(self):
+        self.offset = max(self.offset - self.limit, 0)
+        self.searchDatabase()
+
+    def gotoNext(self):
+        self.offset = min(self.offset + self.limit, self.numRows)
+        self.searchDatabase()
+        
+    def updateStatus(self):
+        if self.offset > 0:
+            self.prevButton.show()
+        else:
+            self.prevButton.hide()
+        last = self.offset + self.limit
+        if last < self.numRows:
+            self.nextButton.show()
+        else:
+            self.nextButton.hide()
+            last = self.numRows
+        if self.numRows:
+            self.statusText.setText("Showing %s-%s out of %s results" %
+                                    (self.offset+1, last, self.numRows))
+        else:
+            self.statusText.setText("No matching results found")
+
+    def setup_results(self, workflow_list=[]):
+        self.itemView.clear()
+        self.itemView.setIconSize(QtCore.QSize(32,32))
+        columns = ['Vistrail', 'Version', 'Time', 'User']
+        self.itemView.setColumnCount(len(columns))
+        self.itemView.setHeaderLabels(columns)
+        self.itemView.setSortingEnabled(True)
+        for workflow in workflow_list:
+            item = QWorkflowItem(workflow)
+            self.itemView.addTopLevelItem(item)
+        self.itemView.header().setResizeMode(3, QtGui.QHeaderView.ResizeToContents)
+        self.itemView.header().setResizeMode(2, QtGui.QHeaderView.ResizeToContents)
+        self.itemView.header().setResizeMode(1, QtGui.QHeaderView.Interactive)
+        self.itemView.header().setResizeMode(0, QtGui.QHeaderView.Interactive)
+        self.itemView.header().resizeSections(QtGui.QHeaderView.Stretch)
+        conn_id = self.connectionList.getCurrentItemId()
+        if conn_id < 0:
+            self.statusText.setText("Select a database")
+
+    def showItem(self, item, col):
+        (v_name, v_id, v_version, version_name, time, user, thumb) = \
+         item.workflow
+        config = self.config
+        locator = \
+           DBLocator(config['host'],
+                     config['port'],
+                     config['db'],
+                     config['user'],
+                     config['passwd'],
+                     config['name'],
+                     obj_id=v_id,
+                     obj_type='vistrail',
+                     connection_id=config.get('id', None))
+        #print "url:", locator.to_url()
+        import vistrails.gui.application
+        app = vistrails.gui.application.get_vistrails_application()
+        open_vistrail = app.builderWindow.open_vistrail_without_prompt
+        args = {}
+        args['version'] = version_name if version_name else v_version
+        #print "args", args
+        open_vistrail(locator, **args)
+
+class QWorkflowItem(QtGui.QTreeWidgetItem):
+    def __init__(self, workflow, parent=None):
+        (v_name, v_id, v_version, version_name, time, user, thumb) = workflow
+        version = version_name if version_name else v_version
+        labels = (str(v_name), str(version), str(time), str(user))
+        QtGui.QTreeWidgetItem.__init__(self, labels)
+        self.workflow = workflow
+        self.setToolTip(0, 'vistrail:%s version:%s' % (v_id, v_version))
+        if thumb:
+            pixmap = QtGui.QPixmap()
+            pixmap.loadFromData(thumb)
+            self.setIcon(1, QtGui.QIcon(pixmap))
+            tooltip = """<img border=0 src="data:image/png;base64,%s">""" % thumb.encode('base64')
+            self.setToolTip(1, tooltip)
+            
+    def __lt__(self, other):
+        sort_col = self.treeWidget().sortColumn()
+        if sort_col in set([1]):
+            try:
+                return int(self.text(sort_col)) < int(other.text(sort_col))
+            except ValueError:
+                pass
+        return QtGui.QTreeWidgetItem.__lt__(self, other)
diff --git a/vistrails/gui/collection/vis_log.py b/vistrails/gui/collection/vis_log.py
new file mode 100644
index 0000000..69cf5a4
--- /dev/null
+++ b/vistrails/gui/collection/vis_log.py
@@ -0,0 +1,582 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This modules builds a widget to visualize workflow execution logs """
+from PyQt4 import QtCore, QtGui
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.log.module_exec import ModuleExec
+from vistrails.core.log.group_exec import GroupExec
+from vistrails.core.log.loop_exec import LoopExec
+from vistrails.core.log.workflow_exec import WorkflowExec
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.gui.collection.workspace import QWorkspaceWindow
+from vistrails.core import system, debug
+import vistrails.core.db.io
+
+
+##############################################################################
+
+
+class QExecutionItem(QtGui.QTreeWidgetItem):
+    """
+    QExecutionListWidget is a widget containing a list of workflow executions.
+    
+    """
+    def __init__(self, execution, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent)
+        self.execution = execution
+        execution.item = self
+
+        # find parent workflow or group
+        if parent is not None:
+            while (parent.parent() is not None and
+                   not isinstance(parent.execution, GroupExec)):
+                parent = parent.parent()
+            self.wf_execution = parent.execution
+        else:
+            self.wf_execution = execution
+
+        if isinstance(execution, WorkflowExec):
+            for item_exec in execution.item_execs:
+                QExecutionItem(item_exec, self)
+            if execution.completed == -2:
+                brush = CurrentTheme.SUSPENDED_MODULE_BRUSH
+            elif execution.completed == 1:
+                brush = CurrentTheme.SUCCESS_MODULE_BRUSH
+            else:
+                brush = CurrentTheme.ERROR_MODULE_BRUSH
+                
+            if execution.db_name:
+                self.setText(0, execution.db_name)
+            else:
+                self.setText(0, 'Version #%s' % execution.parent_version )
+        if isinstance(execution, ModuleExec):
+            for loop_exec in execution.loop_execs:
+                QExecutionItem(loop_exec, self)
+            if execution.completed == 1:
+                if execution.error:
+                    brush = CurrentTheme.ERROR_MODULE_BRUSH
+                    self.wf_execution.completed = -1
+                elif execution.cached:
+                    brush = CurrentTheme.NOT_EXECUTED_MODULE_BRUSH
+                else:
+                    brush = CurrentTheme.SUCCESS_MODULE_BRUSH
+            elif execution.completed == -2:
+                brush = CurrentTheme.SUSPENDED_MODULE_BRUSH
+            else:
+                brush = CurrentTheme.ERROR_MODULE_BRUSH
+            self.setText(0, '%s' % execution.module_name)
+        if isinstance(execution, GroupExec):
+            for item_exec in execution.item_execs:
+                QExecutionItem(item_exec, self)
+            if execution.completed == 1:
+                if execution.error:
+                    self.wf_execution.completed = -1
+                    brush = CurrentTheme.ERROR_MODULE_BRUSH
+                elif execution.cached:
+                    brush = CurrentTheme.NOT_EXECUTED_MODULE_BRUSH
+                else:
+                    brush = CurrentTheme.SUCCESS_MODULE_BRUSH
+            elif execution.completed == -2:
+                brush = CurrentTheme.SUSPENDED_MODULE_BRUSH
+            else:
+                brush = CurrentTheme.ERROR_MODULE_BRUSH
+            self.setText(0, 'Group')
+        if isinstance(execution, LoopExec):
+            for item_exec in execution.item_execs:
+                QExecutionItem(item_exec, self)
+            if execution.completed == 1:
+                if execution.error:
+                    self.wf_execution.completed = -1
+                    brush = CurrentTheme.ERROR_MODULE_BRUSH
+                else:
+                    brush = CurrentTheme.SUCCESS_MODULE_BRUSH
+            elif execution.completed == -2:
+                brush = CurrentTheme.SUSPENDED_MODULE_BRUSH
+            else:
+                brush = CurrentTheme.ERROR_MODULE_BRUSH
+            self.setText(0, 'Loop #%s' % execution.db_iteration)
+        self.setText(1, '%s' % execution.ts_start)
+        self.setText(2, '%s' % execution.ts_end)
+        pixmap = QtGui.QPixmap(10,10)
+        pixmap.fill(brush.color())
+        icon = QtGui.QIcon(pixmap)
+        self.setIcon(0, icon)
+
+class QExecutionListWidget(QtGui.QTreeWidget):
+    """
+    QExecutionListWidget is a widget containing a list of workflow executions.
+    
+    """
+    def __init__(self, parent=None):
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+        self.setColumnCount(3)
+        self.setHeaderLabels(['Pipeline', 'Start', 'End'])
+        self.sortByColumn(1, QtCore.Qt.AscendingOrder)
+        self.setSortingEnabled(True)
+
+    def set_log(self, log=None):
+        self.clear()
+        for execution in log:
+            self.addTopLevelItem(QExecutionItem(execution))
+
+    def add_workflow_exec(self, workflow_exec):
+        # mark as recent
+        workflow_exec.db_name = workflow_exec.db_name + '*' \
+                             if workflow_exec.db_name \
+          else '%s*' % self.controller.get_pipeline_name(
+                  workflow_exec.parent_version)
+        
+        self.addTopLevelItem(QExecutionItem(workflow_exec))
+       
+    
+class QLegendBox(QtGui.QFrame):
+    """
+    QLegendBox is just a rectangular box with a solid color
+    
+    """
+    def __init__(self, brush, size, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QLegendBox(color: QBrush, size: (int,int), parent: QWidget,
+                      f: WindowFlags) -> QLegendBox
+        Initialize the widget with a color and fixed size
+        
+        """
+        QtGui.QFrame.__init__(self, parent, f)
+        self.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setAutoFillBackground(True)
+        palette = QtGui.QPalette(self.palette())
+        palette.setBrush(QtGui.QPalette.Window, brush)
+        self.setPalette(palette)
+        self.setFixedSize(*size)
+        if system.systemType in ['Darwin']:
+            #the mac's nice looking messes up with the colors
+            if QtCore.QT_VERSION < 0x40500:
+                self.setAttribute(QtCore.Qt.WA_MacMetalStyle, False)
+            else:
+                self.setAttribute(QtCore.Qt.WA_MacBrushedMetal, False)
+        
+
+class QLegendWidget(QtGui.QWidget):
+    """
+    QLegendWindow contains a list of QLegendBox and its description
+    
+    """
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.gridLayout = QtGui.QGridLayout(self)
+        self.gridLayout.setMargin(10)
+        self.gridLayout.setSpacing(10)
+        self.setFont(CurrentTheme.VISUAL_DIFF_LEGEND_FONT)
+        
+        data = [[0, 0, "Successful",      CurrentTheme.SUCCESS_MODULE_BRUSH],
+                [0, 1, "Error",             CurrentTheme.ERROR_MODULE_BRUSH],
+                [0, 2, "Cached",     CurrentTheme.NOT_EXECUTED_MODULE_BRUSH],
+                [1, 0, "Not executed", CurrentTheme.PERSISTENT_MODULE_BRUSH],
+                [1, 1, "Suspended",     CurrentTheme.SUSPENDED_MODULE_BRUSH]]
+
+        for x, y, text, brush in data:         
+            self.gridLayout.addWidget(
+                QLegendBox(brush, CurrentTheme.VISUAL_DIFF_LEGEND_SIZE, self),
+                x*2, y*2)
+            self.gridLayout.addWidget(QtGui.QLabel(text, self), x*2, y*2+1)
+
+class QLogDetails(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.execution = None
+        self.parentExecution = None
+        self.set_title("Log Details")
+        self.legend = QLegendWidget()
+        self.executionList = QExecutionListWidget()
+        self.executionList.setExpandsOnDoubleClick(False)
+        self.isDoubling = False
+        self.isUpdating = False
+        layout = QtGui.QVBoxLayout()
+
+        self.backButton = QtGui.QPushButton('Go back')
+        self.backButton.setToolTip("Go back to parent workflow")
+        layout.addWidget(self.backButton)
+        self.backButton.hide()
+
+        layout.addWidget(self.legend)
+        layout.addWidget(self.executionList)
+        self.detailsWidget = QtGui.QTextEdit()
+        layout.addWidget(self.detailsWidget)
+        self.setLayout(layout)
+        self.connect(self.executionList, 
+                     QtCore.SIGNAL("itemSelectionChanged()"),
+                     self.set_execution)
+        self.connect(self.backButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.goBack)
+#        self.connect(self.executionList, QtCore.SIGNAL(
+#         "itemClicked(QTreeWidgetItem *, int)"),
+#         self.singleClick)
+        self.connect(self.executionList, QtCore.SIGNAL(
+         "itemDoubleClicked(QTreeWidgetItem *, int)"),
+         self.doubleClick)
+        self.addButtonsToToolbar()
+
+    def addButtonsToToolbar(self):
+        # Add the open version action
+        self.openVersionAction = QtGui.QAction(
+            QtGui.QIcon.fromTheme('go-next'),
+            'Go to this pipeline', None, triggered=self.openVersion)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.openVersionAction)
+
+    def openVersion(self):
+        if not hasattr(self.parentExecution, 'item'):
+            return
+        version = self.parentExecution.item.wf_execution.parent_version
+        from vistrails.gui.vistrails_window import _app
+        _app.get_current_view().version_selected(version, True)
+        self.controller.recompute_terse_graph()
+        _app.get_current_view().version_view.select_current_version()
+        _app.get_current_view().version_view.scene().setupScene(self.controller)
+        _app.qactions['pipeline'].trigger()
+
+    def execution_updated(self):
+        for e in self.controller.log.workflow_execs:
+            if e not in self.log:
+                self.log[e] = e
+                wf_id = e.parent_version
+                tagMap = self.controller.vistrail.get_tagMap()
+                if wf_id in tagMap:
+                    e.db_name = tagMap[wf_id]
+                self.executionList.add_workflow_exec(e)
+                       
+    def set_execution(self):
+        item = self.executionList.selectedItems()
+        if not item:
+            return
+        item = item[0]
+        if self.isDoubling:
+            self.isDoubling = False
+            return
+        if isinstance(item.wf_execution, GroupExec):
+            self.backButton.show()
+        else:
+            self.backButton.hide()
+        self.notify_app(item.wf_execution, item.execution)
+
+    def notify_app(self, wf_execution, execution):
+        # make sure it is only called once
+        if self.isUpdating:
+            return
+        self.isUpdating = True
+        from vistrails.gui.vistrails_window import _app
+        _app.notify("execution_changed", wf_execution, execution)
+        self.isUpdating = False
+
+    def set_controller(self, controller):
+        #print '@@@@ QLogDetails calling set_controller'
+        self.controller = controller
+        self.executionList.controller = self.controller
+        if not hasattr(self.controller, 'loaded_workflow_execs'):
+            self.controller.loaded_workflow_execs = {}
+            for e in self.controller.read_log().workflow_execs:
+                # set workflow names
+                e.db_name = controller.get_pipeline_name(e.parent_version)
+                self.controller.loaded_workflow_execs[e] = e
+        self.log = self.controller.loaded_workflow_execs
+        self.executionList.set_log(self.log)
+
+    def execution_changed(self, wf_execution, execution):
+        if not execution:
+            return
+        self.execution = execution
+        self.parentExecution = wf_execution
+        text = ''
+        if hasattr(execution, 'item') and \
+           not execution.item == self.executionList.currentItem():
+            self.executionList.setCurrentItem(execution.item)
+        if hasattr(execution, 'item'):
+            text += '%s\n' % execution.item.text(0)
+        text += 'Start: %s\n' % execution.ts_start
+        text += 'End: %s\n' % execution.ts_end
+        if hasattr(execution, 'user'):
+            text += 'User: %s\n' % execution.user
+        if hasattr(execution, 'cached'):
+            text += 'Cached: %s\n' % ("Yes" if execution.cached else 'No')
+        text += 'Completed: %s\n' % {'0':'No', '1':'Yes'}.get(
+                                    str(execution.completed), 'No')
+        if hasattr(execution, 'error') and execution.error:
+            text += 'Error: %s\n' % execution.error
+        annotations = execution.db_annotations \
+                      if hasattr(execution, 'db_annotations') else []
+        if len(annotations):
+            text += '\n\nAnnotations:'
+            for annotation in annotations:
+                text += "\n  %s: %s" % (annotation.key, annotation.value)
+        self.detailsWidget.setText(text)
+        self.update_selection()
+        
+    def singleClick(self, item, col):
+        if self.isDoubling:
+            self.isDoubling = False
+            return
+        if isinstance(item.wf_execution, GroupExec):
+            self.backButton.show()
+        else:
+            self.backButton.hide()
+        self.notify_app(item.wf_execution, item.execution)
+
+    def doubleClick(self, item, col):
+        # only difference here is that we should show contents of GroupExecs 
+        self.isDoubling = True
+        if isinstance(item.wf_execution, GroupExec):
+            self.backButton.show()
+        else:
+            self.backButton.hide()
+        if isinstance(item.execution, GroupExec):
+            # use itself as the workflow
+            self.notify_app(item.execution, item.execution)
+        else:
+            self.notify_app(item.wf_execution, item.execution)
+
+    def goBack(self):
+        if not isinstance(self.parentExecution, GroupExec):
+            self.backButton.hide()
+        self.notify_app(self.parentExecution.item.wf_execution,
+                        self.parentExecution)
+
+    def update_selection(self):
+        if hasattr(self.execution, 'item') and \
+          not self.execution.item.isSelected():
+            self.execution.item.setSelected(True)
+
+class QLogView(QPipelineView):
+    def __init__(self, parent=None):
+        QPipelineView.__init__(self, parent)
+        self.setReadOnlyMode(True)
+        self.set_title("Provenance")
+        self.log = None
+        self.execution = None
+        self.parentExecution = None
+        self.isUpdating = False
+        # self.exec_to_wf_map = {}
+        # self.workflow_execs = []
+        # Hook shape selecting functions
+        self.connect(self.scene(), QtCore.SIGNAL("moduleSelected"),
+                     self.moduleSelected)
+
+    def set_default_layout(self):
+        self.set_palette_layout({QtCore.Qt.RightDockWidgetArea: QLogDetails})
+            
+    def set_action_links(self):
+        self.action_links = { }
+        
+    def set_action_defaults(self):
+        self.action_defaults.update(
+            {'execute' : [('setEnabled', False, False)],
+             'publishWeb': [('setEnabled', False, False)],
+             'publishPaper': [('setEnabled', False, False)],
+            })
+
+    def notify_app(self, wf_execution, execution):
+        # make sure it is only called once
+        if self.isUpdating:
+            return
+        self.isUpdating = True
+        from vistrails.gui.vistrails_window import _app
+        _app.notify("execution_changed", wf_execution, execution)
+        self.isUpdating = False
+
+
+    def set_controller(self, controller):
+        QPipelineView.set_controller(self, controller)
+        #print "@@@ set_controller called", id(self.controller), len(self.controller.vistrail.actions)
+        if not hasattr(self.controller, 'loaded_workflow_execs'):
+            self.controller.loaded_workflow_execs = {}
+            for e in self.controller.read_log().workflow_execs:
+                # set workflow names
+                e.db_name = controller.get_pipeline_name(e.parent_version)
+                self.controller.loaded_workflow_execs[e] = e
+        self.log = self.controller.loaded_workflow_execs
+
+    def set_to_current(self):
+        self.controller.set_pipeline_view(self)
+
+    def version_changed(self):
+        pass
+
+    def moduleSelected(self, id, selectedItems):
+        """ moduleSelected(id: int, selectedItems: [QGraphicsItem]) -> None
+        """
+        if len(selectedItems)!=1 or id==-1:
+            if self.execution != self.parentExecution:
+                self.notify_app(self.parentExecution, self.parentExecution)
+#            self.moduleUnselected()
+            return
+
+        item = selectedItems[0]
+        if hasattr(item,'execution') and item.execution:
+            if self.execution != item.execution:
+                item = self.scene().selectedItems()[0]
+                self.notify_app(self.parentExecution, item.execution)
+        elif self.execution != self.parentExecution:
+                self.notify_app(self.parentExecution, self.parentExecution)
+
+    def set_exec_by_id(self, exec_id):
+        if not self.log:
+            return False
+        try:
+            workflow_execs = [e for e in self.log 
+                                if e.id == int(str(exec_id))]
+        except ValueError:
+            return False
+        if len(workflow_execs):
+            self.notify_app(workflow_execs[0], workflow_execs[0])
+            return True
+        return False
+
+    def set_exec_by_date(self, exec_date):
+        if not self.log:
+            return False
+        workflow_execs = [e for e in self.log
+                          if str(e.ts_start) == str(exec_date)]
+        if len(workflow_execs):
+            self.notify_app(workflow_execs[0], workflow_execs[0])
+            return True
+        return False
+
+    def get_execution_pipeline(self, execution):
+        """ Recursively finds pipeline through layers of groupExecs """
+        if isinstance(execution, WorkflowExec):
+            version = execution.parent_version
+            # change the current version to this as well
+
+            return self.controller.vistrail.getPipeline(version)
+        if isinstance(execution, GroupExec):
+            parent = execution.item.wf_execution
+            parent_pipeline = self.get_execution_pipeline(parent)
+            return parent_pipeline.db_get_module_by_id(
+                                   execution.db_module_id).pipeline
+
+    def execution_changed(self, wf_execution, execution):
+        self.execution = execution
+        if self.parentExecution != wf_execution:
+            self.parentExecution = wf_execution
+            self.pipeline = self.get_execution_pipeline(wf_execution)
+            self.update_pipeline()
+        self.update_selection()
+
+        # if idx < len(self.workflow_execs) and idx >= 0:
+        #     self.execution = self.workflow_execs[idx]
+        # else:
+        #     self.execution = None
+
+        # self.currentItem = self.workflow_execs[idx]
+        # self.execution = item.execution
+        # self.workflowExecution = item
+        # while self.workflowExecution.parent():
+        #     self.workflowExecution = self.workflowExecution.parent()
+        # self.workflowExecution = self.workflowExecution.execution
+        # self.parentExecution = item
+        # while self.parentExecution.execution.__class__ not in \
+        #         [WorkflowExec, LoopExec, GroupExec]:
+        #     self.parentExecution = self.parentExecution.parent()
+        # self.parentExecution = self.parentExecution.execution
+        # self.showExecution()
+
+    def update_pipeline(self):
+        #print "ACTIONS!"
+        #print "#### controller", id(self.controller)
+        scene = self.scene()
+        scene.clearItems()
+        self.pipeline.validate(False)
+        
+        module_execs = dict([(e.module_id, e) 
+                             for e in self.parentExecution.item_execs])
+        # controller = DummyController(self.pipeline)
+        scene.controller = self.controller
+        self.moduleItems = {}
+        for m_id in self.pipeline.modules:
+            module = self.pipeline.modules[m_id]
+            brush = CurrentTheme.PERSISTENT_MODULE_BRUSH
+            if m_id in module_execs:
+                e = module_execs[m_id]
+                if e.completed == 1:
+                    if e.error:
+                        brush = CurrentTheme.ERROR_MODULE_BRUSH
+                    elif e.cached:
+                        brush = CurrentTheme.NOT_EXECUTED_MODULE_BRUSH
+                    else:
+                        brush = CurrentTheme.SUCCESS_MODULE_BRUSH
+                elif e.completed == -2:
+                    brush = CurrentTheme.SUSPENDED_MODULE_BRUSH
+                else:
+                    brush = CurrentTheme.ERROR_MODULE_BRUSH
+            module.is_valid = True
+            item = scene.addModule(module, brush)
+            item.controller = self.controller
+            self.moduleItems[m_id] = item
+            if m_id in module_execs:
+                e = module_execs[m_id]
+                item.execution = e
+                e.module = item
+            else:
+                item.execution = None
+        connectionItems = []
+        for c in self.pipeline.connections.values():
+            connectionItems.append(scene.addConnection(c))
+
+        # Color Code connections
+        for c in connectionItems:
+            pen = QtGui.QPen(CurrentTheme.CONNECTION_PEN)
+            pen.setBrush(QtGui.QBrush(QtGui.QColor(0, 0, 0, 128+64)))
+            c.connectionPen = pen
+
+        scene.updateSceneBoundingRect()
+        scene.fitToView(self, True)
+
+    def update_selection(self):
+        # avoid module update signal
+        self.isUpdating = True
+        module = None
+        if (isinstance(self.execution, ModuleExec) or \
+            (isinstance(self.execution, GroupExec) and
+             self.execution == self.parentExecution)) and \
+          not self.execution.module.isSelected():
+            self.execution.module.setSelected(True)
+            module = self.execution.module
+        for m in self.scene().selectedItems():
+            if m.isSelected() and m != module:
+                m.setSelected(False)
+        self.isUpdating = False
diff --git a/vistrails/gui/collection/workspace.py b/vistrails/gui/collection/workspace.py
new file mode 100644
index 0000000..538d647
--- /dev/null
+++ b/vistrails/gui/collection/workspace.py
@@ -0,0 +1,1631 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+
+import glob
+from itertools import chain
+import os
+from datetime import datetime
+from time import strptime
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core import debug
+from vistrails.core.collection import Collection, MashupEntity, ThumbnailEntity, \
+    VistrailEntity, WorkflowEntity, WorkflowExecEntity, ParameterExplorationEntity
+from vistrails.core.collection.search import SearchCompiler, SearchParseError
+from vistrails.core.db.locator import FileLocator
+from vistrails.db.services.locator import UntitledLocator
+from vistrails.gui.common_widgets import QToolWindowInterface, QToolWindow, QSearchBox
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.module_palette import QModuleTreeWidgetItemDelegate
+from vistrails.gui.vis_diff import QDiffView
+
+class QCollectionWidget(QtGui.QTreeWidget):
+    """ This is an abstract class that contains functions for handling
+    a core.collection.Collection object
+    a subclass should provide a view of the collection
+    """
+    def __init__(self, collection, parent=None):
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.collection = collection
+        self.collection.add_listener(self)
+        self.setExpandsOnDoubleClick(False)
+        self.connect(self,
+                     QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'),
+                     self.item_selected)
+        self.setIconSize(QtCore.QSize(16,16))
+
+    def setup_widget(self, workspace=None):
+        """ Adds the items from the current workspace """
+        pass
+
+    def updated(self):
+        """ Called from the collection when committed """
+        self.setup_widget()
+            
+    def run_search(self, search, items=None):
+        # FIXME only uses top level items
+        if items is None:
+            items = [self.topLevelItem(i) 
+                     for i in xrange(self.topLevelItemCount())]
+        for item in items:
+            if search.match(item.entity):
+                item.setHidden(False)
+                parent = item.parent()
+                while parent is not None:
+                    if parent.isHidden():
+                        parent.setHidden(False)
+                    parent = parent.parent()
+            else:
+                item.setHidden(True)
+            self.run_search(search, [item.child(i) 
+                                     for i in xrange(item.childCount())])
+            
+    def reset_search(self, items=None):
+        if items is None:
+            items = [self.topLevelItem(i) 
+                     for i in xrange(self.topLevelItemCount())]
+        for item in items:
+            item.setHidden(False)
+            self.reset_search([item.child(i) 
+                               for i in xrange(item.childCount())])
+
+    def item_selected(self, widget_item, column):
+        #print 'item_selected'
+        locator = widget_item.entity.locator()
+        #print "locator", locator
+        import vistrails.gui.application
+#        if not locator.is_valid():
+#            debug.critical("Locator is not valid:" % locator.to_url())
+#            return
+        app = vistrails.gui.application.get_vistrails_application()
+        open_vistrail = app.builderWindow.open_vistrail_without_prompt
+        args = {}
+        args['version'] = locator.kwargs.get('version_node', None) or \
+                          locator.kwargs.get('version_tag', None)
+        if args['version']:
+            # set vistrail name
+            locator = widget_item.entity.parent.locator()
+            pass
+            #locator._name = widget_item.entity.parent.name
+
+        workflow_exec = locator.kwargs.get('workflow_exec', None)
+        if workflow_exec:
+            args['workflow_exec'] = workflow_exec
+            locator = widget_item.entity.parent.parent.locator()
+            locator.update_from_gui(self)
+            # set vistrail name
+            #locator._name = widget_item.entity.parent.parent.name
+            
+        locator.update_from_gui(self)
+#        print '*** opening'
+#        print locator.to_url()
+#        print locator.name
+#        print '***'
+        open_vistrail(locator, **args)
+                                                       
+    def contextMenuEvent(self, event):
+        item = self.itemAt(event.pos())
+        menu = QtGui.QMenu(self)
+        if item:
+            # find top level
+            p = item
+            while p.parent():
+                p = p.parent()
+            act = QtGui.QAction("&Update", self)
+            act.setStatusTip("Update this object")
+            QtCore.QObject.connect(act,
+                                   QtCore.SIGNAL("triggered()"),
+                                   p.refresh_object)
+            menu.addAction(act)
+            act = QtGui.QAction("&Remove", self)
+            act.setStatusTip("Remove from this list")
+            QtCore.QObject.connect(act,
+                                   QtCore.SIGNAL("triggered()"),
+                                   p.remove_object)
+            menu.addAction(act)
+            act = QtGui.QAction("", self)
+            act.setSeparator(True)
+            menu.addAction(act)
+        act = QtGui.QAction("Check &All", self)
+        act.setStatusTip("Removes deleted files")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.check_objects)
+        menu.addAction(act)
+        act = QtGui.QAction("Remove All", self)
+        act.setStatusTip("Removes all files")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.remove_all)
+        menu.addAction(act)
+        act = QtGui.QAction("Add &File", self)
+        act.setStatusTip("Add specified vistrail file")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.add_file)
+        menu.addAction(act)
+        act = QtGui.QAction("Add from &Directory", self)
+        act.setStatusTip("Add all vistrail files in a directory")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.add_dir)
+        menu.addAction(act)
+        act = QtGui.QAction("", self)
+        act.setSeparator(True)
+        menu.addAction(act)
+        act = QtGui.QAction("Add a new Workspace", self)
+        act.setStatusTip("Create a new workspace")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.add_workspace)
+        menu.addAction(act)
+        if self.collection.currentWorkspace != 'Default':
+            act = QtGui.QAction("Delete Workspace", self)
+            act.setStatusTip("Remove current workspace")
+            QtCore.QObject.connect(act,
+                                   QtCore.SIGNAL("triggered()"),
+                                   self.delete_workspace)
+            menu.addAction(act)
+        menu.exec_(event.globalPos())
+
+    def check_objects(self):
+        items = [self.topLevelItem(i) 
+                 for i in xrange(self.topLevelItemCount())]
+        for item in items:
+            item.entity.locator().update_from_gui(self)
+            if not self.collection.urlExists(item.entity.url):
+                self.collection.delete_entity(item.entity) 
+        self.collection.commit()
+
+    def remove_all(self):
+        items = [self.topLevelItem(i) 
+                 for i in xrange(self.topLevelItemCount())]
+        for item in items:
+            self.collection.del_from_workspace(item.entity) 
+        self.collection.commit()
+
+    def add_file(self):
+        s = QtGui.QFileDialog.getOpenFileName(
+                    self, "Choose a file",
+                    "", "Vistrail files (*.vt *.xml)");
+        if str(s):
+            locator = FileLocator(str(s))
+            url = locator.to_url()
+            entity = self.collection.updateVistrail(url)
+            # add to relevant workspace categories
+            self.collection.add_to_workspace(entity)
+            self.collection.commit()
+        
+    def add_dir(self):
+        s = QtGui.QFileDialog.getExistingDirectory(
+                    self, "Choose a directory",
+                    "", QtGui.QFileDialog.ShowDirsOnly);
+        if str(s):
+            self.update_from_directory(str(s))
+        
+    def update_from_directory(self, s):
+        filenames = glob.glob(os.path.join(s, '*.vt,*.xml'))
+        
+        progress = QtGui.QProgressDialog('', '', 0, len(filenames))
+        progress.setWindowTitle('Adding files')
+        progress.setMinimumDuration(500)
+        progress.setWindowModality(QtCore.Qt.WindowModal)
+        i = 0
+        for filename in filenames:
+            progress.setValue(i)
+            progress.setLabelText(filename)
+            i += 1
+            try:
+                locator = FileLocator(filename)
+                url = locator.to_url()
+                entity = self.collection.updateVistrail(url)
+                self.collection.add_to_workspace(entity)
+            except:
+                debug.critical("Failed to add file '%s'" % filename)
+        progress.setValue(len(filenames))
+        self.collection.commit()
+
+    def add_workspace(self):
+        text, ok = QtGui.QInputDialog.getText(self, 'Create workspace',
+                      'Enter new workspace name:')
+        workspace = str(text).strip()
+        if ok and workspace != '':
+            self.collection.currentWorkspace = workspace
+            if workspace not in self.collection.workspaces:
+                self.collection.add_workspace(workspace)
+                self.collection.commit()
+            self.emit(QtCore.SIGNAL("workspaceListUpdated()"))
+                
+    def delete_workspace(self):
+        if self.collection.currentWorkspace != 'Default':
+            self.collection.delete_workspace(self.collection.currentWorkspace)
+            self.collection.currentWorkspace = 'Default'
+            self.collection.commit()
+            self.emit(QtCore.SIGNAL("workspaceListUpdated()"))
+
+class QWorkspaceWidget(QCollectionWidget):
+    """ This class implements QCollectionWidget as a side bar browser widget
+    """
+    def __init__(self, collection, parent=None):
+        QCollectionWidget.__init__(self, collection, parent)
+        self.setColumnCount(1)
+        self.setHeaderHidden(True)
+
+    def setup_widget(self, workspace=None):
+        """ Adds the items from the current workspace """
+        while self.topLevelItemCount():
+            self.takeTopLevelItem(0)
+        if workspace:
+            self.collection.currentWorkspace = workspace
+        for entity in self.collection.workspaces[self.collection.currentWorkspace]:
+            item = QBrowserWidgetItem(entity, self)
+            self.addTopLevelItem(item)
+#        if self.collection.currentWorkspace != 'Default':
+        self.setSortingEnabled(True)
+        self.sortItems(0, QtCore.Qt.AscendingOrder)
+
+class QWorkflowsItem(QtGui.QTreeWidgetItem):
+    def __init__(self, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent, ['Workflows'])
+
+class QMashupsItem(QtGui.QTreeWidgetItem):
+    def __init__(self, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent, ['Mashups'])
+
+class QParamExplorationsItem(QtGui.QTreeWidgetItem):
+    def __init__(self, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent, ['Parameter Explorations'])
+
+class QBrowserWidgetItem(QtGui.QTreeWidgetItem):
+    def __init__(self, entity, parent=None):
+        if not entity:
+            # assuming an unsaved item
+            QtGui.QTreeWidgetItem.__init__(self, parent)
+            self.tag_to_item = {}
+            self.workflowsItem = QWorkflowsItem()
+            self.addChild(self.workflowsItem)
+            self.mshp_to_item = {}
+            self.mashupsItem = QMashupsItem()
+            self.addChild(self.mashupsItem)
+            self.pe_to_item = {}
+            self.paramExplorationsItem = QParamExplorationsItem()
+            self.addChild(self.paramExplorationsItem)
+            self.setIcon(0, CurrentTheme.HISTORY_ICON)
+            return
+        
+        # # old, esoteric code
+        #
+        # l = list(str(x) for x in entity.save())
+        # l.pop(0) # remove identifier
+        # type = l.pop(0)
+        # desc = l[5]
+        # if len(desc) > 20:
+        #     l[5] = desc[:20] + '...'
+        klass = self.__class__
+        self.entity = entity
+        QtGui.QTreeWidgetItem.__init__(self, parent, [entity.name])
+        if entity.type_id == VistrailEntity.type_id:
+            # vistrail - create Workflows and Mashups item
+            self.workflowsItem = QWorkflowsItem()
+            self.addChild(self.workflowsItem)
+            self.mashupsItem = QMashupsItem()
+            self.addChild(self.mashupsItem)
+            self.mashupsItem.setHidden(True)
+            self.paramExplorationsItem = QParamExplorationsItem()
+            self.addChild(self.paramExplorationsItem)
+            self.paramExplorationsItem.setHidden(True)
+            self.setIcon(0, CurrentTheme.HISTORY_ICON)
+            self.tag_to_item = {}
+            self.mshp_to_item = {}
+            self.pe_to_item = {}
+        elif entity.type_id == WorkflowEntity.type_id:
+            self.setIcon(0, CurrentTheme.PIPELINE_ICON)
+            self.executionList = []
+        elif entity.type_id == WorkflowExecEntity.type_id:
+            self.setIcon(0, CurrentTheme.EXECUTE_PIPELINE_ICON)
+
+        tooltip = '<html>%s' % entity.url
+            
+        for child in entity.children:
+            # l = child.save()
+            if child.type_id == ThumbnailEntity.type_id:
+                # is a thumbnail
+                # add to parent workflow item
+                cache = ThumbnailCache.getInstance()
+                path = cache.get_abs_name_entry(child.name)
+                if path:
+                    pixmap = QtGui.QPixmap(path)
+                    if pixmap and not pixmap.isNull():
+                        self.setIcon(0, QtGui.QIcon(pixmap.scaled(16, 16)))
+                    tooltip += """<br/><img border=0 src='%(path)s'/>
+                        """ % {'path':path}
+            elif child.type_id == WorkflowEntity.type_id:
+                # is a pipeline
+                # only show tagged items
+                # Add to 'Workflows' item
+
+                if not child.name.startswith('Version #'):
+                    childItem = QWorkflowEntityItem(child)
+                    self.workflowsItem.addChild(childItem)
+                    # keep list of tagged workflows
+                    self.tag_to_item[child.name] = childItem
+            elif child.type_id == WorkflowExecEntity.type_id:
+                # is an execution
+                childItem = QWorkflowExecEntityItem(child)
+                # hidden by default
+                self.executionList.append(childItem)
+                self.addChild(childItem)
+                childItem.setHidden(True)
+            elif child.type_id == MashupEntity.type_id:
+                # is a mashup
+                childItem = QMashupEntityItem(child)
+                self.mashupsItem.addChild(childItem)
+                # keep list of tagged mashups
+                self.mshp_to_item[child.name] = childItem
+            elif child.type_id == ParameterExplorationEntity.type_id:
+                # is a parameter exploration
+                childItem = QParamExplorationEntityItem(child)
+                self.paramExplorationsItem.addChild(childItem)
+                # keep list of tagged pe:s
+                self.pe_to_item[child.url] = childItem
+            else:
+                self.addChild(QBrowserWidgetItem(child))
+        if entity.description:
+            tooltip += '<br/>%s' % entity.description
+        tooltip += '</html>'
+        self.setToolTip(0, tooltip)
+
+    #def __lt__(self, other):
+    #    sort_col = self.treeWidget().sortColumn()
+    #    if sort_col in set([4]):
+    #        return int(self.text(sort_col)) < int(other.text(sort_col))
+    #    elif sort_col in set([2,3]):
+    #        return datetime(*strptime(str(self.text(sort_col)), '%d %b %Y %H:%M:%S')[0:6]) < datetime(*strptime(str(other.text(sort_col)), '%d %b %Y %H:%M:%S')[0:6])
+    #    return QtGui.QTreeWidgetItem.__lt__(self, other)
+
+    def refresh_object(self):
+        Collection.getInstance().updateVistrail(self.entity.url)
+        Collection.getInstance().commit()
+
+    def remove_object(self):
+        Collection.getInstance().del_from_workspace(self.entity)
+        Collection.getInstance().commit()
+        
+class QWorkflowEntityItem(QBrowserWidgetItem):
+    def get_vistrail(self):
+        parent = self.parent()
+        QVistrailEntityItem
+        while parent and type(parent) != QVistrailEntityItem:
+            parent = parent.parent()
+        return parent
+    
+    def open_workflow(self):
+        self.treeWidget().item_selected(self, 0)
+
+    def open_workflow_in_new_tab(self):
+        self.get_vistrail().window.add_pipeline_view()
+        self.open_workflow()
+
+    def open_workflow_in_new_window(self):
+        self.open_workflow_in_new_tab()
+        self.get_vistrail().window.detach_view(
+                                self.get_vistrail().window.tabs.currentIndex())
+
+class QWorkflowExecEntityItem(QBrowserWidgetItem):
+    pass
+
+class QMashupEntityItem(QBrowserWidgetItem):
+    def open_mashup(self):
+        self.treeWidget().open_mashup(self.entity)
+        
+    def edit_mashup(self):
+        self.treeWidget().edit_mashup(self.entity)
+
+class QParamExplorationEntityItem(QBrowserWidgetItem):
+    pass
+
+class QExplorerWidget(QCollectionWidget):
+    """ This class implements QCollectionWidget as a full-screen explorer widget
+    """
+    def __init__(self, collection, parent=None):
+        QCollectionWidget.__init__(self, collection, parent)
+        self.setColumnCount(6)
+        self.setHeaderLabels(['name', 'user', 'mod_date', 'create_date', 'size', 'url'])
+
+    def setup_widget(self, workspace=None):
+        """ Adds the items from the current workspace """
+        self.clear()
+        if workspace:
+            self.collection.currentWorkspace = workspace
+        for entity in self.collection.workspaces[self.collection.currentWorkspace]:
+            item = QExplorerWidgetItem(entity)
+            self.addTopLevelItem(item)
+#        if self.collection.currentWorkspace != 'Default':
+        self.setSortingEnabled(True)
+        self.sortItems(0, QtCore.Qt.AscendingOrder)
+
+class QExplorerWidgetItem(QtGui.QTreeWidgetItem):
+    def __init__(self, entity, parent=None):
+        l = list(str(x) for x in entity.save())
+        l.pop(0) # remove identifier
+        type = l.pop(0)
+        desc = l.pop(5)
+#        l.pop(7)
+#        if len(desc) > 20:
+#            l[5] = desc[:20] + '...'
+        QtGui.QTreeWidgetItem.__init__(self, parent, l)
+        self.entity = entity
+        if type == '1':
+            self.setIcon(0, CurrentTheme.HISTORY_ICON)
+        elif type == '2':
+            self.setIcon(0, CurrentTheme.PIPELINE_ICON)
+        elif type == '3':
+            self.setIcon(0, CurrentTheme.EXECUTE_PIPELINE_ICON)
+
+        self.setToolTip(0, entity.url)
+            
+        for child in entity.children:
+            l = child.save()
+            if l[1] == 4:
+                cache = ThumbnailCache.getInstance()
+                path = cache.get_abs_name_entry(l[2])
+                if path:
+                    self.setIcon(0, QtGui.QIcon(path))
+                continue
+            else:
+                self.addChild(QExplorerWidgetItem(child))
+
+    def __lt__(self, other):
+        sort_col = self.treeWidget().sortColumn()
+        if sort_col in set([4]):
+            return int(self.text(sort_col)) < int(other.text(sort_col))
+        elif sort_col in set([2,3]):
+            return datetime(*strptime(str(self.text(sort_col)), '%d %b %Y %H:%M:%S')[0:6]) < datetime(*strptime(str(other.text(sort_col)), '%d %b %Y %H:%M:%S')[0:6])
+        return QtGui.QTreeWidgetItem.__lt__(self, other)
+
+    def refresh_object(self):
+        Collection.getInstance().updateVistrail(self.entity.url)
+        Collection.getInstance().commit()
+
+    def remove_object(self):
+        Collection.getInstance().del_from_workspace(self.entity)
+        Collection.getInstance().commit()
+
+class QWorkspaceWindow(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+#        self.workspace_list = QtGui.QComboBox()
+#        self.titleWidget = QtGui.QWidget()
+#        self.titleLayout = QtGui.QHBoxLayout()
+#        self.titleLayout.setMargin(0)
+#        self.titleLayout.setSpacing(5)
+#        self.titleLayout.addWidget(QtGui.QLabel('Project:'), 0)
+#        self.titleLayout.addWidget(self.workspace_list, 1)
+#        self.titleWidget.setLayout(self.titleLayout)
+#        self.setTitleBarWidget(self.titleWidget)
+        self.setWindowTitle('Workspace')
+        # make it possible to ignore updates during updating of workspace list
+        self.updatingWorkspaceList = False
+#        self.connect(self.workspace_list,
+#                     QtCore.SIGNAL("currentIndexChanged(QString)"),
+#                     self.workspace_changed)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(5)
+#        self.search_box = QSearchBox(True, False, self)
+#        layout.addWidget(self.search_box)
+
+        self.collection = Collection.getInstance()
+
+        self.open_list = QVistrailList()
+        self.open_list.collection = self.collection
+        layout.addWidget(self.open_list)
+#        layout.addWidget(self.titleWidget)
+
+#        self.browser = QWorkspaceWidget(self.collection)
+#        layout.addWidget(self.browser)
+#        self.browser.setup_widget('Default')
+#        self.connect(self.search_box, QtCore.SIGNAL('resetSearch()'),
+#                     self.reset_search)
+#        self.connect(self.search_box, QtCore.SIGNAL('executeSearch(QString)'),
+#                     self.execute_search)
+#        self.connect(self.search_box, QtCore.SIGNAL('refineMode(bool)'),
+#                     self.refine_mode)
+#        self.connect(self.browser, QtCore.SIGNAL('workspaceListUpdated()'),
+#                     self.update_workspace_list)
+        self.setLayout(layout)
+#        self.update_workspace_list()
+
+        self.addButtonsToToolbar()
+
+    def addButtonsToToolbar(self):
+        # button for toggling executions
+        self.execAction = QtGui.QAction(CurrentTheme.EXECUTE_PIPELINE_ICON,
+                                        "Show/hide workflow executions",
+                                        None,
+                                        triggered=self.showWorkflowExecutions)
+        self.execAction.setCheckable(True)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.execAction)
+        # buttons for toggling list/tree views of workflows
+        self.listAction = QtGui.QAction(CurrentTheme.LIST_VIEW_ICON,
+                                        "View workflows in a list",
+                                        None,
+                                        triggered=self.viewAsList)
+        self.listAction.setCheckable(True)
+        self.listAction.setChecked(True)
+        self.treeAction = QtGui.QAction(CurrentTheme.TREE_VIEW_ICON,
+                                            "View workflows in a tree",
+                                            None,
+                                            triggered=self.viewAsTree)
+        self.treeAction.setCheckable(True)
+        self.workflowDisplayGroup = QtGui.QActionGroup(self)
+        self.workflowDisplayGroup.setExclusive(True)
+        self.workflowDisplayGroup.addAction(self.listAction)
+        self.workflowDisplayGroup.addAction(self.treeAction)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.listAction)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.treeAction)
+        # buttons for going to the search view to search all vistrails
+        self.searchAction = QtGui.QAction("Search", self.toolWindow().toolbar,
+                                          triggered=self.gotoSearch)
+        self.searchAction.searchMode = False
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.searchAction)
+
+    def state_changed(self, view):
+        self.open_list.state_changed(view)
+        
+    def gotoSearch(self):
+        if self.searchAction.searchMode:
+            self.open_list.hide_search_results()
+            self.searchAction.searchMode = False
+            self.open_list.searchMode = False
+            self.searchAction.setText("Search")
+
+            from vistrails.gui.vistrails_window import _app
+            _app.notify('query_changed', None)
+        else:
+            from vistrails.gui.vistrails_window import _app
+            _app.qactions['search'].trigger()
+ 
+    def updateSearchResults(self, search=None, result_list=None):
+        if search is None:
+            self.gotoSearch()
+        elif not self.searchAction.searchMode:
+            self.open_list.show_search_results()
+            self.searchAction.searchMode = True
+            self.open_list.searchMode = True
+            self.searchAction.setText("Clear Search")
+        self.open_list.update_search_results(search, result_list)
+
+    def execution_updated(self):
+        self.open_list.execution_updated()
+       
+    def showWorkflowExecutions(self, state):
+        """ toggle show executions on/off """
+        self.open_list.hideExecutions(not state)
+
+    def viewAsList(self):
+        """ Order workflow items as a flat list """
+        self.open_list.isTreeView = False
+        for i in xrange(self.open_list.openFilesItem.childCount()):
+            item = self.open_list.openFilesItem.child(i)
+            self.open_list.make_list(item)
+
+    def viewAsTree(self):
+        """ Order workflow items as a history tree """
+        self.open_list.isTreeView = True
+        for i in xrange(self.open_list.openFilesItem.childCount()):
+            item = self.open_list.openFilesItem.child(i)
+            self.open_list.make_tree(item)
+
+    def update_workspace_list(self):
+        """ Updates workspace list and highlights currentWorkspace
+            Keeps 'Recent files' on top
+        """
+        self.updatingWorkspaceList = True
+        self.workspace_list.clear()
+        self.workspace_list.addItem('Default')
+        if 'Default' == self.browser.collection.currentWorkspace:
+            self.workspace_list.setCurrentIndex(self.workspace_list.count()-1)
+        locations = self.browser.collection.workspaces.keys()
+        
+        workspaces = [ l for l in locations \
+                         if not l.startswith('file') and \
+                            not l.startswith('db') and \
+                            not l == 'Default']
+        workspaces.sort()
+        for w in workspaces:
+            self.workspace_list.addItem(w)
+            if w == self.browser.collection.currentWorkspace:
+                self.workspace_list.setCurrentIndex(self.workspace_list.count()-1)
+        self.updatingWorkspaceList = False
+
+    def workspace_changed(self, workspace):
+        if not self.updatingWorkspaceList:
+            self.browser.setup_widget(str(workspace))
+    
+    def reset_search(self):
+        self.browser.reset_search()
+
+    def set_results(self, results):
+        pass
+
+    def execute_search(self, text):
+        s = str(text)
+        try:
+            search = SearchCompiler(s).searchStmt
+        except SearchParseError, e:
+            debug.warning("Search Parse Error", str(e))
+            search = None
+
+        self.browser.run_search(search)
+
+    def refine_mode(self, on):
+        pass
+
+    def change_vt_window(self, vistrail_window):
+        self.open_list.change_vt_window(vistrail_window)
+
+    def add_vt_window(self, vistrail_window):
+        self.open_list.add_vt_window(vistrail_window)
+
+    def remove_vt_window(self, vistrail_window):
+        self.open_list.remove_vt_window(vistrail_window)
+
+class QExplorerDialog(QToolWindow, QToolWindowInterface):
+    def __init__(self, parent=None):
+        QToolWindow.__init__(self, parent=parent)
+
+        self.widget = QtGui.QWidget()
+        self.setWidget(self.widget)
+        self.workspace_list = QtGui.QComboBox()
+        self.setTitleBarWidget(self.workspace_list)
+        # make it possible to ignore updates during updating of workspace list
+        self.updatingWorkspaceList = False
+        self.connect(self.workspace_list,
+                     QtCore.SIGNAL("currentIndexChanged(QString)"),
+                     self.workspace_changed)
+        layout = QtGui.QVBoxLayout()
+#        layout.setMargin(0)
+#        layout.setSpacing(5)
+        self.search_box = QSearchBox(True, False, self)
+        layout.addWidget(self.search_box)
+
+        self.collection = Collection.getInstance()
+        self.browser = QExplorerWidget(self.collection, self)
+        layout.addWidget(self.browser)
+        self.browser.setup_widget('Recent files')
+        self.connect(self.search_box, QtCore.SIGNAL('resetSearch()'),
+                     self.reset_search)
+        self.connect(self.search_box, QtCore.SIGNAL('executeSearch(QString)'),
+                     self.execute_search)
+        self.connect(self.search_box, QtCore.SIGNAL('refineMode(bool)'),
+                     self.refine_mode)
+        self.connect(self.browser, QtCore.SIGNAL('workspaceListUpdated()'),
+                     self.update_workspace_list)
+        self.widget.setLayout(layout)
+        self.update_workspace_list()
+ 
+    def update_workspace_list(self):
+        """ Updates workspace list and highlights currentWorkspace
+            Keeps 'Default' on top
+        """
+        self.updatingWorkspaceList = True
+        self.workspace_list.clear()
+        self.workspace_list.addItem('Default')
+        if 'Default' == self.browser.collection.currentWorkspace:
+            self.workspace_list.setCurrentIndex(self.workspace_list.count()-1)
+        sorted_workspaces = self.browser.collection.workspaces.keys()
+        if 'Default' in sorted_workspaces:
+            sorted_workspaces.remove('Default')
+        sorted_workspaces.sort()
+        for p in sorted_workspaces:
+            self.workspace_list.addItem(p)
+            if p == self.browser.collection.currentWorkspace:
+                self.workspace_list.setCurrentIndex(self.workspace_list.count()-1)
+        self.updatingWorkspaceList = False
+
+    def workspace_changed(self, workspace):
+        if not self.updatingWorkspaceList:
+            self.browser.setup_widget(str(workspace))
+    
+    def reset_search(self):
+        self.browser.reset_search()
+
+    def set_results(self, results):
+        pass
+
+    def execute_search(self, text):
+        s = str(text)
+        try:
+            search = SearchCompiler(s).searchStmt
+        except SearchParseError, e:
+            debug.warning("Search Parse Error", str(e))
+            search = None
+
+        self.browser.run_search(search)
+
+    def refine_mode(self, on):
+        pass
+
+class QVistrailEntityItem(QBrowserWidgetItem):
+    def __init__(self, entity, window=None):
+        QBrowserWidgetItem.__init__(self, entity)
+        if window:
+            self.window = window
+        self.entity = entity
+        if not entity:
+            self.setText(0, self.window.get_name())
+        # make them draggable
+        self.setFlags(self.flags() | QtCore.Qt.ItemIsDragEnabled
+                                   | QtCore.Qt.ItemIsDropEnabled
+#                                   | QtCore.Qt.ItemIsSelectable
+                                   )
+
+    def open_in_new_window(self):
+        if hasattr(self, "window"):
+            self.treeWidget().setSelected(self.window)
+            self.treeWidget().parent().emit(QtCore.SIGNAL("detachVistrail"),
+                                   self.window)
+
+    def open_workflow(self):
+        self.treeWidget().item_selected(self, 0)
+
+    def open_workflow_in_new_tab(self):
+        self.parent().parent().window.add_pipeline_view()
+        self.open_workflow()
+
+    def open_workflow_in_new_window(self):
+        self.open_workflow_in_new_tab()
+        self.parent().parent().window.detach_view(
+                              self.parent().parent().window.tabs.currentIndex())
+        
+    def open_parameter_exploration(self):
+        self.treeWidget().open_parameter_exploration(self.entity)
+        
+class QVistrailListLatestItem(QtGui.QTreeWidgetItem):
+    def __init__(self):
+        QtGui.QTreeWidgetItem.__init__(self)
+        self.setIcon(0, CurrentTheme.PIPELINE_ICON)
+        self.setText(0, '(latest)')
+
+    def get_vistrail(self):
+        return self.parent().parent()
+
+    def open_workflow(self):
+        self.treeWidget().item_selected(self, 0)
+
+    def open_workflow_in_new_tab(self):
+        self.parent().parent().window.add_pipeline_view()
+        self.open_workflow()
+
+    def open_workflow_in_new_window(self):
+        self.open_workflow_in_new_tab()
+        self.parent().parent().window.detach_view(
+                                self.parent().parent().window.tabs.currentIndex())
+
+class QVistrailList(QtGui.QTreeWidget):
+    def __init__(self, parent=None):
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.searchMode = False
+        self.search = None
+        self.setColumnCount(1)
+        self.setHeaderHidden(True)
+        self.setSelectionMode(self.SingleSelection)
+        self.setSelectionBehavior(self.SelectItems)
+        self.setDragEnabled(True)
+        self.setAcceptDrops(True)
+        self.setDropIndicatorShown(True)
+        self.setExpandsOnDoubleClick(False)
+        self.setRootIsDecorated(False)
+
+        self.isTreeView = False
+        self.executionsHidden = True
+
+        self.collection = Collection.getInstance()
+        self.items = {}
+
+        self.delegate = QModuleTreeWidgetItemDelegate(self, self)
+        self.setItemDelegate(self.delegate)
+
+        self.openFilesItem = QtGui.QTreeWidgetItem(['Current Vistrails'])
+        self.addTopLevelItem(self.openFilesItem)
+
+        self.setup_closed_files()
+
+        self.openFilesItem.setExpanded(True)
+        self.closedFilesItem.setExpanded(True)
+
+        self.setSortingEnabled(True)
+        self.sortItems(0, QtCore.Qt.AscendingOrder)
+
+        self.connect(self,
+                     QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'),
+                     self.item_selected)
+        
+        self.setIconSize(QtCore.QSize(16,16))
+
+        self.connect(self,
+                     QtCore.SIGNAL('itemPressed(QTreeWidgetItem *,int)'),
+                     self.onItemPressed)
+        self.updateHideExecutions()
+        self.connect_current_changed()
+
+    def setup_closed_files(self):
+        self.closedFilesItem = QtGui.QTreeWidgetItem(['My Vistrails'])
+        self.addTopLevelItem(self.closedFilesItem)
+        closed_entities = self.collection.workspaces['Default']
+        for entity in closed_entities:
+            if entity.url.startswith('file://'):
+                if not entity.locator().is_valid():
+                    self.collection.del_from_workspace(entity)
+                    self.collection.delete_entity(entity)
+                    continue
+            item = QVistrailEntityItem(entity)
+            self.closedFilesItem.addChild(item)
+            item.mashupsItem.setHidden(not item.mashupsItem.childCount())
+            item.paramExplorationsItem.setHidden(
+                             not item.paramExplorationsItem.childCount())
+
+    def connect_current_changed(self):
+        # using currentItemChanged makes sure a drag selects the dragged-from
+        # vistrail
+        self.connect(self, 
+                     QtCore.SIGNAL("currentItemChanged(QTreeWidgetItem*,"
+                                   "QTreeWidgetItem*)"),
+                     self.item_changed)
+        # using item_clicked makes sure even selected items can be clicked
+        self.connect(self, 
+                     QtCore.SIGNAL("itemClicked(QTreeWidgetItem*,int)"),
+                     self.item_changed)
+
+    def disconnect_current_changed(self):
+        self.disconnect(self, 
+                        QtCore.SIGNAL("currentItemChanged(QTreeWidgetItem*,"
+                                      "QTreeWidgetItem*)"),
+                        self.item_changed)
+        self.disconnect(self, 
+                        QtCore.SIGNAL("itemClicked(QTreeWidgetItem*,int)"),
+                        self.item_changed)
+    
+    def show_search_results(self):
+        self.searchResultsItem = QtGui.QTreeWidgetItem(['Search Results'])
+        self.addTopLevelItem(self.searchResultsItem)
+        self.openFilesItem.setHidden(True)
+        self.closedFilesItem.setHidden(True)
+
+    def hide_search_results(self):
+        self.takeTopLevelItem(self.indexOfTopLevelItem(self.searchResultsItem))
+        self.openFilesItem.setHidden(False)
+        self.closedFilesItem.setHidden(False)
+
+    def update_search_results(self, search=None, result_list=None):
+        self.search = search
+        self.searchResultsItem.takeChildren()
+        if result_list is not None:
+            for entity in result_list:
+                item = QVistrailEntityItem(entity)
+                self.searchResultsItem.addChild(item)
+                item.setExpanded(True)
+            self.searchResultsItem.setExpanded(True)
+
+    def onItemPressed(self, item, column):
+        """ onItemPressed(item: QTreeWidgetItem, column: int) -> None
+        Expand/Collapse top-level item when the mouse is pressed
+        
+        """
+        if item and item.parent() == None:
+            self.setItemExpanded(item, not self.isItemExpanded(item))
+            
+    def search_result_selected(self, view, version):
+        # need to signal the query view to change its version and vistrail
+        from vistrails.gui.vistrails_window import _app
+        _app.change_view(view)
+        view.query_version_selected(self.search, version)
+
+    def item_selected(self, widget_item, column):
+        """ opens or displays the selected item if possible """            
+        locator = None
+        entity = None
+        if hasattr(widget_item, 'entity') and widget_item.entity is not None:
+            entity = widget_item.entity
+            locator = entity.locator()
+        elif isinstance(widget_item, QVistrailListLatestItem) and \
+             hasattr(widget_item.parent().parent(), 'entity') and \
+             widget_item.parent().parent().entity is not None:
+            entity = widget_item.parent().parent().entity
+            locator = entity.locator()
+        elif not isinstance(widget_item, QVistrailListLatestItem):
+            # no valid item selected
+            return
+        from vistrails.gui.vistrails_window import _app
+        open_vistrail = _app.open_vistrail_without_prompt
+        set_current_locator = _app.set_current_locator
+
+        if not locator or isinstance(locator, UntitledLocator):
+            # assuming an unsaved vistrail - need to use view
+            vistrail_widget = widget_item
+            view = None
+            while view is None and vistrail_widget is not None:
+                if hasattr(vistrail_widget, 'window'):
+                    view = vistrail_widget.window
+                    break
+                elif (hasattr(vistrail_widget, 'entity') and
+                      hasattr(vistrail_widget.entity, '_window')):
+                    view = vistrail_widget.entity._window
+                    break
+                vistrail_widget = vistrail_widget.parent()
+
+            if vistrail_widget == widget_item:
+                # do nothing - view is already selected
+                return
+            is_execution = False
+            version = None
+            if isinstance(widget_item, QVistrailListLatestItem):
+                version = view.controller.vistrail.get_latest_version()
+            elif hasattr(widget_item, 'entity'):
+                if hasattr(widget_item, 'executionList'):
+                    version = widget_item.entity.name
+                else:
+                    is_execution = True
+                    version = widget_item.parent().entity.name
+            if not version:
+                # assume execution
+                version = str(widget_item.parent().text(0))
+            if isinstance(version, str):
+                try:
+                    version = \
+                        view.controller.vistrail.get_version_number(version)
+                except:
+                    version = None
+            if self.searchMode:
+                self.search_result_selected(view, version)
+            else:
+                # _app.view_changed(view)
+                _app.change_view(view)
+                if version:
+                    view.version_selected(version, True, double_click=True)
+
+            if is_execution:
+                _app.qactions['provenance'].trigger()
+                workflow_exec = widget_item.entity.name
+                view.log_view.set_exec_by_id(workflow_exec) or \
+                 view.log_view.set_exec_by_date(workflow_exec)
+            return
+
+        args = {}
+        args['version'] = locator.kwargs.get('version_node', None) or \
+                          locator.kwargs.get('version_tag', None)
+        args['parameterExploration']=locator.kwargs.get('parameterExploration',
+                                                        None)
+        vistrail_widget = widget_item
+        vistrail_entity = entity
+        version = None
+        if args['version']:
+            vistrail_widget = widget_item.parent()
+            vistrail_entity = entity.parent
+            locator = vistrail_entity.locator()
+            version = args['version']
+
+        if args['parameterExploration']:
+            args['parameterExploration'] = int(args['parameterExploration'])
+            vistrail_widget = widget_item.parent().parent()
+            vistrail_entity = entity.parent
+            locator = vistrail_entity.locator()
+
+        workflow_exec = locator.kwargs.get('workflow_exec', None)
+        if workflow_exec:
+            args['workflow_exec'] = workflow_exec
+            vistrail_widget = widget_item.parent().parent()
+            vistrail_entity = entity.parent.parent
+            locator = vistrail_entity.locator()
+            locator.update_from_gui(self)
+            # set vistrail name
+            #locator._name = widget_item.entity.parent.parent.name
+            
+        if isinstance(widget_item, QVistrailListLatestItem):
+            # find the latest item (max action id)
+            vistrail = widget_item.parent().parent().window.controller.vistrail
+            args['version'] = vistrail.get_latest_version()
+            version = vistrail.get_latest_version()
+        locator.update_from_gui(self)
+        if not locator.is_valid():
+            debug.critical("File not found: '%s'. Entry will be deleted." % locator.to_url())
+            vistrail_widget.parent().removeChild(vistrail_widget)
+            self.collection.delete_entity(vistrail_entity)
+            self.collection.commit()
+
+        view = _app.ensureVistrail(locator)
+        if self.searchMode:
+            self.search_result_selected(view, version)
+        else:
+            if view:
+                self.ensureNotDiffView()
+            open_vistrail(locator, **args)
+            if view is None or not view.is_abstraction:
+                set_current_locator(locator)
+            if view and isinstance(entity, MashupEntity):
+                # I am assuming that double-clicking a mashup, the user wants to
+                # run the mashup
+                # if it is doubele-clicked without the vistrail being open we 
+                #should open the vistrail
+                self.open_mashup(entity)
+            if view and isinstance(entity, ParameterExplorationEntity):
+                # I am assuming that double-clicking a p.e., the user wants to
+                # run it
+                # if it is double-clicked without the vistrail being open we 
+                #should open the vistrail
+                self.open_parameter_exploration(entity)
+
+    def ensureNotDiffView(self):
+        """ If current tab is a diff, create a new tab """
+        from vistrails.gui.vistrails_window import _app
+        view = _app.get_current_view()
+        tab = view.get_current_tab()
+        if isinstance(tab, QDiffView):
+            view.add_pipeline_view()
+
+    def open_mashup(self, entity):
+        """open_mashup(entity:MashupEntity) -> None
+        It will ask the Vistrail view to execute the mashup
+        """
+        self.ensureNotDiffView()
+        from vistrails.gui.vistrails_window import _app
+        _app.open_vistrail_without_prompt(entity.locator(),
+                                          execute_workflow=True)
+        
+    def edit_mashup(self, entity):
+        """open_mashup(entity:MashupEntity) -> None
+        It will ask the Vistrail view to execute the mashup
+        """
+        from vistrails.gui.vistrails_window import _app
+        _app.open_vistrail_without_prompt(entity.locator())
+
+    def open_parameter_exploration(self, entity):
+        """open_parameter_exploration(entity:ParameterExplorationEntity) -> None
+        It will switch to the correct pipeline and pe, and open the pe
+        """
+        self.ensureNotDiffView()
+        from vistrails.gui.vistrails_window import _app
+        view = _app.get_current_view()
+        if view.controller.current_version != entity.pe.action_id:
+            view.version_selected(entity.pe.action_id, True)
+        if entity.pe != view.controller.current_parameter_exploration:
+            view.controller.current_parameter_exploration = entity.pe
+            view.pe_view.setParameterExploration(entity.pe)
+        _app.qactions['explore'].trigger()
+        
+    def mimeData(self, itemList):
+        """ mimeData(itemList) -> None        
+        Setup the mime data to contain itemList because Qt 4.2.2
+        implementation doesn't instantiate QTreeWidgetMimeData
+        anywhere as it's supposed to. It must have been a bug...
+        
+        """
+        data = QtGui.QTreeWidget.mimeData(self, itemList)
+        data.items = itemList
+        return data
+
+    def dropEvent( self, event):
+        event.accept()
+        destination = self.itemAt(event.pos())
+        if not destination:
+            return
+        if isinstance(event.source(), QVistrailList):
+            data = event.mimeData()
+            if hasattr(data, 'items'):
+                assert len(data.items) == 1
+                source = data.items[0]
+                if not source or source == destination:
+                    return
+
+                if hasattr(source, 'window') and hasattr(destination, 'window'):
+                    # both are vistrails
+                    self.merge_vistrails(source, destination)
+                elif (isinstance(source, QVistrailListLatestItem) or
+                      hasattr(source, 'executionList')) and \
+                     (isinstance(destination, QVistrailListLatestItem) or
+                      hasattr(destination, 'executionList')):
+                    # workflows can be from diff vistrails
+                    self.visual_diff(source, destination)
+
+    def merge_vistrails(self, source, destination):
+        if source.window.controller.changed or destination.window.controller.changed:
+            text = ('Both Vistrails need to be saved before they can be merged.')
+            QtGui.QMessageBox.information(None, 'Cannot perform merge',
+                              text, '&OK')
+            return
+        res = QtGui.QMessageBox.question(None, 'Merge the histories of these 2 vistrails into a new vistrail?',
+                          source.window.get_name() + '\n' + destination.window.get_name(),
+                          buttons=QtGui.QMessageBox.Yes,
+                          defaultButton=QtGui.QMessageBox.No)
+        if res == QtGui.QMessageBox.Yes:
+            from vistrails.gui.vistrails_window import _app
+            _app.merge_vistrails(destination.window.controller, source.window.controller)
+
+    def visual_diff(self, source, destination):
+        source_parent = source.parent()
+        while not hasattr(source_parent, 'window'):
+            source_parent = source_parent.parent()
+        destination_parent = destination.parent()
+        while not hasattr(destination_parent, 'window'):
+            destination_parent = destination_parent.parent()
+        vistrail_1 = source_parent.window.controller.vistrail
+        vistrail_2 = destination_parent.window.controller.vistrail
+        if hasattr(source, 'entity'):
+            v1 = source.entity.locator().kwargs.get('version_node', None)
+        else:
+            v1 = vistrail_1.get_latest_version()
+        if hasattr(destination, 'entity'):
+            v2 = destination.entity.locator().kwargs.get('version_node', None)
+        else:
+            v2 = vistrail_2.get_latest_version()
+        
+        # if we don't have the same vistrail, pass the second vistrail
+        if id(vistrail_1) == id(vistrail_2):
+            source_parent.window.diff_requested(v1, v2)
+        else:
+            source_parent.window.diff_requested(v1, v2, vistrail_2)
+            
+    def hideExecutions(self, hidden):
+        self.executionsHidden = hidden
+        self.updateHideExecutions()
+        
+    def updateHideExecutions(self):            
+        for i in xrange(self.openFilesItem.childCount()):
+            vt = self.openFilesItem.child(i)
+            if not hasattr(vt, 'tag_to_item'):
+                continue
+            for item in vt.tag_to_item.itervalues():
+                if not hasattr(item, 'executionList'):
+                    continue
+                for exec_item in item.executionList:
+                    exec_item.setHidden(self.executionsHidden)
+        for i in xrange(self.closedFilesItem.childCount()):
+            vt = self.closedFilesItem.child(i)
+            if not hasattr(vt, 'tag_to_item'):
+                continue
+            for item in vt.tag_to_item.itervalues():
+                if not hasattr(item, 'executionList'):
+                    continue
+                for exec_item in item.executionList:
+                    exec_item.setHidden(self.executionsHidden)
+
+    def make_list(self, item):
+        """ construct a list from the tagged workflows in a loaded vistrail
+        """
+        self.setSortingEnabled(False)
+        if not (hasattr(item, 'tag_to_item') or hasattr(item, 'mshp_to_item')): 
+            return
+        for tag, wf in item.tag_to_item.iteritems():
+            index = wf.parent().indexOfChild(wf)
+            wf = wf.parent().takeChild(index)
+            item.workflowsItem.addChild(wf)
+        self.updateHideExecutions()
+        self.setSortingEnabled(True)
+
+    def make_tree(self, item):
+        """ construct a tree from the tagged workflows in a loaded vistrail
+        """
+        self.setSortingEnabled(False)
+        if not hasattr(item, 'window'):
+            return
+        am = item.window.controller.vistrail.actionMap
+        tm = item.window.controller.vistrail.get_tagMap()
+        vm = dict((v,k) for k, v in tm.iteritems())
+        # loop through tagged workflows and add to parent workflow
+        if not hasattr(item, 'tag_to_item'):
+            return
+        for tag, wf in item.tag_to_item.iteritems():
+            if tag not in vm:
+                continue
+            # find parent
+            version = vm[tag]
+            action = am[version]
+            while action.parent in am:
+                action = am[action.parent]
+                if action.timestep in tm:
+                    break
+            if action.timestep not in tm or action.timestep == version:
+                continue
+            parent_tag = tm[action.timestep]
+            if parent_tag in item.tag_to_item:
+                parent_wf = item.tag_to_item[parent_tag]
+                index = wf.parent().indexOfChild(wf)
+                wf = wf.parent().takeChild(index)
+                parent_wf.addChild(wf)
+        self.updateHideExecutions()
+        self.setSortingEnabled(True)
+
+
+    def state_changed(self, view):
+        """ update tags, mashups and parameter explorations """
+        # sometimes references to closed views trigger a state_changed event
+        if id(view) not in self.items:
+            return
+        item = self.items[id(view)]
+        entity = item.entity
+        
+        (new_entity, was_updated) = \
+            entity.update_vistrail(view.controller.vistrail)
+        #if new_entity:
+        #    Collection.getInstance().create_vistrail_entity(
+        #        view.controller.vistrail)
+        #    self.add_vt_window(view)
+        #    return
+        if was_updated:
+            item.setText(0, entity.name)
+        (added_wfs, deleted_wfs) = entity.update_workflows()
+        (more_added_wfs, added_wf_execs) = entity.update_log()
+        (added_mshps, deleted_mshps) = entity.update_mashups()
+        (added_pes, deleted_pes) = entity.update_parameter_explorations()
+
+        for wf_entity in deleted_wfs:
+            assert(wf_entity.name in item.tag_to_item)
+            child = item.tag_to_item[wf_entity.name]
+            child_idx = child.parent().indexOfChild(child)
+            child.parent().takeChild(child_idx)
+            del item.tag_to_item[wf_entity.name]
+        for wf_entity in chain(added_wfs, more_added_wfs):
+            if not wf_entity.name.startswith('Version #'):
+                childItem = QWorkflowEntityItem(wf_entity)
+                item.workflowsItem.addChild(childItem)
+                item.tag_to_item[wf_entity.name] = childItem
+
+        for wf_exec_entity in added_wf_execs:
+            parent_version = wf_exec_entity.workflow_exec.parent_version
+            wf_entity = entity.wf_entity_map[parent_version]
+            if not wf_entity.name.startswith('Version #'):
+                assert(wf_entity.name in item.tag_to_item)
+                wf_item = item.tag_to_item[wf_entity.name]
+                child = QWorkflowExecEntityItem(wf_exec_entity)
+                wf_item.addChild(child)
+                wf_item.executionList.append(child)
+        self.updateHideExecutions()
+    
+        for mshp_entity in deleted_mshps:
+            assert(mshp_entity.name in item.mshp_to_item)
+            child = item.mshp_to_item[mshp_entity.name]
+            child_idx = child.parent().indexOfChild(child)
+            child.parent().takeChild(child_idx)
+            del item.mshp_to_item[mshp_entity.name]
+            item.mashupsItem.setHidden(not len(item.mshp_to_item))
+        for mshp_entity in added_mshps:
+            childItem = QMashupEntityItem(mshp_entity)
+            item.mashupsItem.addChild(childItem)
+            item.mshp_to_item[mshp_entity.name] = childItem
+            item.mashupsItem.setHidden(not len(item.mshp_to_item))
+
+        for pe_entity in deleted_pes:
+            assert(pe_entity.url in item.pe_to_item)
+            child = item.pe_to_item[pe_entity.url]
+            child_idx = child.parent().indexOfChild(child)
+            child.parent().takeChild(child_idx)
+            del item.pe_to_item[pe_entity.url]
+            item.paramExplorationsItem.setHidden(not len(item.pe_to_item))
+        for pe_entity in added_pes:
+            childItem = QParamExplorationEntityItem(pe_entity)
+            item.paramExplorationsItem.addChild(childItem)
+            # keep list of tagged workflows
+            item.pe_to_item[pe_entity.url] = childItem
+            item.paramExplorationsItem.setHidden(not len(item.pe_to_item))
+
+        self.make_tree(item) if self.isTreeView else self.make_list(item)
+
+    def execution_updated(self):
+        """ Add new executions to workflow """
+        # get view and item
+        from vistrails.gui.vistrails_window import _app
+        view = _app.get_current_view()
+        if id(view) not in self.items:
+            return
+        item = self.items[id(view)]
+
+        entity = item.entity
+        entity.set_vistrail(view.controller.vistrail)
+        (added_wfs, added_wf_execs) = entity.update_log()
+        for wf_entity in added_wfs:
+            if not wf_entity.name.startswith('Version #'):
+                childItem = QWorkflowEntityItem(wf_entity)
+                item.workflowsItem.addChild(childItem)
+                # keep list of tagged workflows
+                item.tag_to_item[wf_entity.name] = childItem
+            
+        for wf_exec_entity in added_wf_execs:
+            parent_version = wf_exec_entity.workflow_exec.parent_version
+            wf_entity = entity.wf_entity_map[parent_version]
+            if not wf_entity.name.startswith('Version #'):
+                assert(wf_entity.name in item.tag_to_item)
+                wf_item = item.tag_to_item[wf_entity.name]
+                child = QWorkflowExecEntityItem(wf_exec_entity)
+                wf_item.addChild(child)
+                wf_item.executionList.append(child)
+        self.updateHideExecutions()
+
+    def add_vt_window(self, vistrail_window):
+        locator = vistrail_window.controller.locator
+        entity = None
+        entity_was_none = False
+        item_reused = False
+        if locator:
+            entity = self.collection.fromUrl(locator.to_url())
+        if entity is None:
+            entity = VistrailEntity(vistrail_window.controller.vistrail)
+            entity_was_none = True
+
+        # remove item from recent list
+        for i in xrange(self.closedFilesItem.childCount()):
+            recent = self.closedFilesItem.child(i)
+            if entity and recent and recent.entity and \
+                recent.entity.url == entity.url:
+                self.setSelected(None)
+                index = self.closedFilesItem.indexOfChild(recent)
+                item = self.closedFilesItem.takeChild(index)
+        item = QVistrailEntityItem(entity, vistrail_window)
+        item.current_item = QVistrailListLatestItem()
+        item.workflowsItem.addChild(item.current_item)
+        if id(vistrail_window) in self.items:
+            # window already exists  
+            old_item = self.items[id(vistrail_window)]
+            url = None
+            if old_item.entity is not None:
+                url = old_item.entity.url
+            # if there was a change in the locator, we need to remove the old 
+            # item and put in the closed vistrails area
+            
+            if url != vistrail_window.controller.locator.to_url():
+                self.remove_vt_window(vistrail_window)
+            else:
+                # we will reuse the item
+                if hasattr(item, 'entity'):
+                    old_item.entity = item.entity
+                old_item.window = item.window
+                old_item.current_item = item.current_item
+                old_item.workflowsItem = item.workflowsItem
+                old_item.mashupsItem = item.mashupsItem
+                old_item.paramExplorationsItem = item.paramExplorationsItem
+                old_item.tag_to_item = item.tag_to_item
+                old_item.mshp_to_item = item.mshp_to_item
+                old_item.pe_to_item = item.pe_to_item
+                old_item.setText(0, item.text(0))
+                while old_item.childCount():
+                    child = old_item.child(0)
+                    index = old_item.indexOfChild(child)
+                    old_item.takeChild(index)
+                while item.childCount():
+                    child = item.child(0)
+                    index = item.indexOfChild(child)
+                    child = item.takeChild(index)
+                    old_item.addChild(child)
+                item = old_item
+                item_reused = True
+        
+        if not item_reused:
+            self.items[id(vistrail_window)] = item        
+            if entity_was_none:
+                self.collection.add_temp_entity(entity)
+            entity.is_open = True
+            entity._window = vistrail_window
+            self.openFilesItem.addChild(item)
+            item.setExpanded(True)
+            item.workflowsItem.setExpanded(True)
+            item.mashupsItem.setExpanded(True)
+            item.paramExplorationsItem.setExpanded(True)
+        item.mashupsItem.setHidden(not item.mashupsItem.childCount())
+        item.paramExplorationsItem.setHidden(
+                             not item.paramExplorationsItem.childCount())
+        self.make_tree(item) if self.isTreeView else self.make_list(item)
+        self.setSelected(vistrail_window)
+        self.updateHideExecutions()
+
+    def remove_vt_window(self, vistrail_window):
+        if id(vistrail_window) not in self.items:
+            return
+        self.setSelected(None)
+        item = self.items[id(vistrail_window)]
+        del self.items[id(vistrail_window)]
+        delattr(item, 'window')
+        index = self.openFilesItem.indexOfChild(item)
+        item = self.openFilesItem.takeChild(index)
+        url = None
+        if item.entity is not None:
+            item.entity.is_open = False
+            item.entity._window = None 
+            url = item.entity.url
+        item.current_item.parent().removeChild(item.current_item)
+        # entity may have changed
+        entity = None
+        if url is None:
+            locator = vistrail_window.controller.locator
+            if locator and not isinstance(locator, UntitledLocator):
+                entity = self.collection.fromUrl(locator.to_url())
+        else:
+            entity = self.collection.fromUrl(url)
+            
+        if entity and not self.collection.is_temp_entity(entity) and \
+                not vistrail_window.is_abstraction:
+            item = QVistrailEntityItem(entity)
+            self.make_tree(item) if self.isTreeView else self.make_list(item)
+            self.closedFilesItem.addChild(item)
+            item.setText(0, entity.name)
+        self.updateHideExecutions()
+
+    def change_vt_window(self, vistrail_window):
+        self.setSelected(vistrail_window)
+
+    def setSelected(self, view):
+        """ Highlights the vistrail item for the selected item"""
+        self.disconnect_current_changed()
+
+        def setBold(parent_item):
+            """ """
+            for i in xrange(parent_item.childCount()):
+                item = parent_item.child(i)
+                font = item.font(0)
+                window = item.window if hasattr(item, 'window') else None
+                font.setBold(view == window if window and view else False)
+                item.setFont(0, font)
+                if window:
+                    item.setText(0, window.get_name())
+                
+        if not self.openFilesItem.isHidden():
+            setBold(self.openFilesItem)
+        elif self.searchMode:
+            setBold(self.searchResultsItem)
+        self.connect_current_changed()
+            
+    def item_changed(self, item, prev_item):
+        if not item:
+            return
+        vistrail = item
+        while not hasattr(vistrail, 'window'):
+            if not vistrail or not vistrail.parent:
+                # parent node
+                return
+            vistrail = vistrail.parent()
+        #print "*** item clicked", id(vistrail.window)
+
+        self.setSelected(vistrail.window)
+        self.parent().emit(QtCore.SIGNAL("vistrailChanged(PyQt_PyObject)"), 
+                           vistrail.window)
+
+    def keyPressEvent(self, event):
+        if event.key() in [QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace]:
+            items = self.selectedItems()
+            if len(items) == 1:
+                item = items[0]
+                if item.parent() == self.openFilesItem:
+                    # close current vistrail
+                    from vistrails.gui.vistrails_window import _app
+                    if hasattr(item, 'window'):
+                        _app.close_vistrail(item.window)
+                    else:
+                        _app.close_vistrail()
+                elif item.parent() == self.closedFilesItem:
+                    # remove from closed list
+                    self.closedFilesItem.removeChild(item)
+                    self.collection.del_from_workspace(item.entity)
+                    self.collection.delete_entity(item.entity)
+                    self.collection.commit()
+                elif isinstance(item,QParamExplorationEntityItem):
+                    parent = item.parent()
+                    while parent and not hasattr(parent, 'window'):
+                        parent = parent.parent()
+                    if parent:
+                        # delete this parameter exploration
+                        parent.window.controller.vistrail.delete_paramexp(
+                                                               item.entity.pe)
+                        parent.window.controller.set_changed(True)
+
+        else:
+            QtGui.QTreeWidget.keyPressEvent(self, event)
+
+    def contextMenuEvent(self, event):
+        item = self.itemAt(event.pos())
+        if isinstance(item, QVistrailEntityItem):
+            if item and self.openFilesItem.indexOfChild(item) == -1:
+                # vistrail is not open
+                return
+            # item is vistrail
+            menu = QtGui.QMenu(self)
+            act = QtGui.QAction("Open in New Window", self,
+                                triggered=item.open_in_new_window)
+            act.setStatusTip("Open specified vistrail file in another window")
+            menu.addAction(act)
+            menu.exec_(event.globalPos())
+        elif (isinstance(item, QWorkflowEntityItem) or 
+              isinstance(item, QVistrailListLatestItem)):
+            if item and self.openFilesItem.indexOfChild(item.get_vistrail()) == -1:
+                # vistrail is not open
+                return
+            # item is workflow
+            menu = QtGui.QMenu(self)
+            act = QtGui.QAction("Open", self,
+                                triggered=item.open_workflow)
+            act.setStatusTip("Open specified workflow in this window")
+            menu.addAction(act)
+            act = QtGui.QAction("Open in new Tab", self,
+                                triggered=item.open_workflow_in_new_tab)
+            act.setStatusTip("Open specified workflow in a new tab")
+            menu.addAction(act)
+            act = QtGui.QAction("Open in new Window", self,
+                                triggered=item.open_workflow_in_new_window)
+            act.setStatusTip("Open specified workflow in a new window")
+            menu.addAction(act)
+            menu.exec_(event.globalPos())
+        elif isinstance(item,QMashupEntityItem):
+            if item and self.openFilesItem.indexOfChild(item.parent().parent()) == -1:
+                # vistrail is not open
+                return
+            # item is mashup
+            menu = QtGui.QMenu(self)
+            act = QtGui.QAction("Edit", self,
+                                triggered=item.edit_mashup)
+            act.setStatusTip("Edit the mashup")
+            menu.addAction(act)
+            act = QtGui.QAction("Execute", self,
+                                triggered=item.open_mashup)
+            act.setStatusTip("Execute the mashup")
+            menu.addAction(act)
+            menu.exec_(event.globalPos())
+
+if __name__ == '__main__':
+    import sys
+    sys.path.append('/vistrails/src/query/vistrails')
+    from vistrails.core.collection import Collection
+    
+#     vt_1 = load_vistrail(ZIPFileLocator('/vistrails/examples/spx.vt'))[0]
+#     vt_2 = load_vistrail(DBLocator('vistrails.sci.utah.edu', 3306,
+#                                    'vistrails', 'vistrails', '8edLj4',
+#                                    obj_id=9, obj_type='vistrail'))[0]
+
+    c = Collection('test.db')
+    # c.clear()
+    # e_1 = c.create_vistrail_entity(vt_1)
+    # e_2 = c.create_vistrail_entity(vt_2)
+    
+    c.entities = {}
+    c.load_entities()
+
+    app = QtGui.QApplication(sys.argv)
+    widget = QBrowserWidget(c)
+    widget.setup_widget('Recent items')
+    widget.show()
+    sys.exit(app.exec_())
diff --git a/vistrails/gui/common_widgets.py b/vistrails/gui/common_widgets.py
new file mode 100644
index 0000000..228e489
--- /dev/null
+++ b/vistrails/gui/common_widgets.py
@@ -0,0 +1,833 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This common widgets using on the interface of VisTrails. These are
+only simple widgets in term of coding and additional features. It
+should have no interaction with VisTrail core"""
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSlot, pyqtSignal
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.modules.constant_configuration import StandardConstantWidget
+from vistrails.core.system import systemType
+################################################################################
+
+class QToolWindow(QtGui.QDockWidget):
+    """
+    QToolWindow is a floating-dockable widget. It also keeps track of
+    its widget window title to update the tool window accordingly
+    
+    """
+    def __init__(self, widget=None, parent=None):
+        """ QToolWindow(parent: QWidget) -> QToolWindow
+        Construct a floating, dockable widget
+        
+        """
+        QtGui.QDockWidget.__init__(self, parent)
+        self.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures)  
+        self.mwindow = QtGui.QMainWindow(self)
+        self.centralwidget = widget
+        self.mwindow.setWindowFlags(QtCore.Qt.Widget) 
+        self.mwindow.setCentralWidget(widget)     
+        self.setWidget(self.mwindow)
+        self.createToolBar()
+        if widget:
+            self.setWindowTitle(widget.windowTitle())
+        self.pinStatus = False
+        self.monitorWindowTitle(widget)
+        
+        self.connect(self, QtCore.SIGNAL("topLevelChanged(bool)"),
+                     self.setDefaultPinStatus)
+             
+    def createToolBar(self):
+        self.toolbar = QtGui.QToolBar(self.mwindow)
+        self.pinButton = QtGui.QAction(CurrentTheme.UNPINNED_PALETTE_ICON,
+                                       "", self.toolbar,checkable=True,
+                                       checked=False,
+                                       toggled=self.pinStatusChanged)
+        
+        self.pinButton.setToolTip("Pin this on the Tab Bar")
+        spacer = QtGui.QWidget()
+        spacer.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, 
+                             QtGui.QSizePolicy.Preferred)
+        self.toolbar.addWidget(spacer)
+        self.toolbar.addAction(self.pinButton)
+        self.pinAction = self.pinButton
+        self.toolbar.setFloatable(False)
+        self.toolbar.setMovable(False)
+        self.toolbar.setIconSize(QtCore.QSize(16,16))
+        self.mwindow.addToolBar(self.toolbar)
+                   
+    def setDefaultPinStatus(self, topLevel):
+        if topLevel:
+            self.setPinStatus(False)
+            self.pinButton.setEnabled(False)
+        else:
+            self.pinButton.setEnabled(True)
+        
+    def pinStatusChanged(self, pinStatus):
+        self.pinStatus = pinStatus
+        self.updateButtonIcon(pinStatus)
+        
+    def updateButtonIcon(self, on):
+        if on:
+            self.pinButton.setIcon(CurrentTheme.PINNED_PALETTE_ICON)
+            self.pinButton.setToolTip("Unpin this from the the Tab Bar")
+        else:
+            self.pinButton.setIcon(CurrentTheme.UNPINNED_PALETTE_ICON)
+            self.pinButton.setToolTip("Pin this on the Tab Bar")
+            
+    def setPinStatus(self, pinStatus):
+        self.pinStatus = pinStatus
+        self.pinButton.setChecked(pinStatus)
+        self.updateButtonIcon(pinStatus)
+        
+    def monitorWindowTitle(self, widget):
+        """ monitorWindowTitle(widget: QWidget) -> None        
+        Watching window title changed on widget and use it as a window
+        title on this tool window
+        
+        """
+        if widget:
+            widget.installEventFilter(self)
+
+    def eventFilter(self, object, event):
+        """ eventFilter(object: QObject, event: QEvent) -> bool
+        Filter window title change event to change the tool window title
+        
+        """
+        if event.type()==QtCore.QEvent.WindowTitleChange:
+            self.setWindowTitle(object.windowTitle())
+        elif event.type()==QtCore.QEvent.Close:
+            object.removeEventFilter(self)
+        return QtGui.QDockWidget.eventFilter(self, object, event)
+        # return super(QToolWindow, self).eventFilter(object, event)                    
+            
+        
+class QToolWindowInterface(object):
+    """
+    QToolWindowInterface can be co-inherited in any class to allow the
+    inherited class to switch to be contained in a window
+    
+    """
+    def toolWindow(self):
+        """ toolWindow() -> None        
+        Return the tool window and set its parent to self.parent()
+        while having self as its contained widget
+        
+        """
+        if not hasattr(self, '_toolWindow'):
+            self._toolWindow = QToolWindow(self, self.parent and self.parent())
+        elif self._toolWindow.centralwidget!=self:
+            self._toolWindow.window.setCentralWidget(self)
+        return self._toolWindow
+
+    def changeEvent(self, event):
+        """ changeEvent(event: QEvent) -> None        
+        Make sure to update the tool parent when to match the widget's
+        real parent
+        
+        """
+        if (event.type()==QtCore.QEvent.ParentChange and
+            hasattr(self, '_toolWindow')):
+            if self.parent()!=self._toolWindow:
+                self._toolWindow.setParent(self.parent())
+
+    def setToolWindowAcceptDrops(self, value):
+        self.toolWindow().setAcceptDrops(value)
+
+###############################################################################
+
+class QDockContainer(QtGui.QMainWindow):
+    """
+    QDockContainer is a window that can contain dock widgets while
+    still be contained in a tool window. It is just a straight
+    inheritance from QMainWindow
+    
+    """
+    def __init__(self, parent=None):
+        """ QMainWindow(parent: QWidget) -> QMainWindow
+        Setup window to have its widget dockable everywhere
+        
+        """
+        QtGui.QMainWindow.__init__(self, parent)
+        self.setDockNestingEnabled(True)
+
+###############################################################################
+
+class QSearchTreeWidget(QtGui.QTreeWidget):
+    """
+    QSearchTreeWidget is just a QTreeWidget with a support function to
+    refine itself when searching for some text
+
+    """
+    def __init__(self, parent=None):
+        """ QSearchTreeWidget(parent: QWidget) -> QSearchTreeWidget
+        Set up size policy and header
+
+        """
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        self.setRootIsDecorated(True)
+        self.setDragEnabled(True)
+        self.flags = QtCore.Qt.ItemIsDragEnabled
+
+        self._search_was_empty = True
+
+    def searchItemName(self, name):
+        """ searchItemName(name: QString) -> None
+        Search and refine the module tree widget to contain only items
+        whose name is 'name'
+        
+        """
+        matchedItems = []
+        
+        def recursiveSetVisible(item, testFunction):
+            """ recursiveSetVisible
+            Pass through all items of a item
+            
+            """
+            enabled = testFunction(item)
+
+            visible = enabled
+            child = item.child
+            for childIndex in xrange(item.childCount()):
+                visible |= recursiveSetVisible(child(childIndex),
+                                               testFunction)
+
+            # if item is hidden or has changed visibility
+            if not visible or (item.isHidden() != (not visible)):
+                item.setHidden(not visible)
+            
+            if visible:
+                f = item.flags()
+                b = f & self.flags
+                if enabled:
+                    if not b:
+                        item.setFlags(f | self.flags)
+                elif b:
+                    item.setFlags(f & ~self.flags)
+                
+            return visible
+
+        if str(name)=='':
+            testFunction = lambda x: (not hasattr(x, 'is_hidden') or
+                                      not x.is_hidden)
+            if not self._search_was_empty:
+                self.collapseAll()
+                self._search_was_empty = True
+        else:
+            matchedItems = set(self.findItems(name,
+                                              QtCore.Qt.MatchContains |
+                                              QtCore.Qt.MatchWrap |
+                                              QtCore.Qt.MatchRecursive))
+            testFunction = matchedItems.__contains__
+            if self._search_was_empty:
+                self.expandAll()
+                self._search_was_empty = False
+        for itemIndex in xrange(self.topLevelItemCount()):
+            recursiveSetVisible(self.topLevelItem(itemIndex),
+                                testFunction)
+    
+    def mimeData(self, itemList):
+        """ mimeData(itemList) -> None        
+        Setup the mime data to contain itemList because Qt 4.2.2
+        implementation doesn't instantiate QTreeWidgetMimeData
+        anywhere as it's supposed to. It must have been a bug...
+        
+        """
+        data = QtGui.QTreeWidget.mimeData(self, itemList)
+        data.items = itemList
+        return data
+
+    def setMatchedFlags(self, flags):
+        """ setMatchedFlags(flags: QItemFlags) -> None Set the flags
+        for matched item in the search tree. Parents of matched node
+        will be visible with these flags off.
+        
+        """
+        self.flags = flags
+    
+class QSearchTreeWindow(QtGui.QWidget):
+    """
+    QSearchTreeWindow contains a search box on top of a tree widget
+    for easy search and refine. The subclass has to implement
+    createTreeWidget() method to return a tree widget that is also 
+    needs to expose searchItemName method
+
+    """
+    def __init__(self, parent=None):
+        """ QSearchTreeWindow(parent: QWidget) -> QSearchTreeWindow
+        Intialize all GUI components
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setWindowTitle('Search Tree')
+        
+        vLayout = QtGui.QVBoxLayout(self)
+        vLayout.setMargin(0)
+        vLayout.setSpacing(0)
+        self.setLayout(vLayout)
+        
+        self.searchBox = QSearchBox(False, True, self)
+        vLayout.addWidget(self.searchBox)
+
+        self.treeWidget = self.createTreeWidget()
+        vLayout.addWidget(self.treeWidget)
+        
+        self.connect(self.searchBox,
+                     QtCore.SIGNAL('executeIncrementalSearch(QString)'),
+                     self.treeWidget.searchItemName)
+        self.connect(self.searchBox,
+                     QtCore.SIGNAL('executeSearch(QString)'),
+                     self.treeWidget.searchItemName)
+        self.connect(self.searchBox,
+                     QtCore.SIGNAL('resetSearch()'),
+                     self.clearTreeWidget)
+                     
+    def clearTreeWidget(self):
+        """ clearTreeWidget():
+        Return the default search tree
+
+        """
+        self.treeWidget.searchItemName('')
+
+    def createTreeWidget(self):
+        """ createTreeWidget() -> QSearchTreeWidget
+        Return a default searchable tree widget
+        
+        """
+        return QSearchTreeWidget(self)
+
+class QPromptWidget(QtGui.QLabel):
+    """
+    QPromptWidget is a widget that will display a prompt text when it
+    doesn't have any child visible, or else, it will disappear. This
+    is good for drag and drop prompt. The inheritance should call
+    setPromptText and showPrompt in appropriate time to show/hide the
+    prompt text
+    """
+    def __init__(self, parent=None):
+        """ QPromptWidget(parent: QWidget) -> QPromptWidget
+        Set up the font and alignment for the prompt
+        
+        """
+        QtGui.QLabel.__init__(self, parent)        
+        self.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
+        self.setWordWrap(True)
+        self.regularFont = self.font()
+        self.promptFont = QtGui.QFont(self.font())
+        self.promptFont.setItalic(True)
+        self.promptText = ''
+        self.promptVisible = False
+
+    def setPromptText(self, text):
+        """ setPromptText(text: str) -> None
+        Set the prompt text string
+        
+        """
+        self.promptText = text
+
+    def showPrompt(self, show=True):
+        """ showPrompt(show: boolean) -> None
+        Show/Hide the prompt
+        
+        """
+        if show!=self.promptVisible:
+            self.promptVisible = show
+            self.repaint(self.rect())
+            
+    def showPromptByChildren(self):
+        """ showPromptByChildren()
+        Show/Hide the prompt based on the current state of children
+        
+        """
+        if self.promptText=='':
+            self.showPrompt(False)
+        else:
+            self.showPrompt(self.layout()==None or
+                            self.layout().count()==0)            
+
+    def paintEvent(self, event):
+        """ paintEvent(event: QPaintEvent) -> None
+        Paint the prompt in the center if neccesary
+        
+        """
+        if self.promptVisible:
+            painter = QtGui.QPainter(self)
+            painter.setFont(self.promptFont)
+            painter.drawText(self.rect(),
+                             QtCore.Qt.AlignCenter | QtCore.Qt.TextWordWrap,
+                             self.promptText)
+            painter.end()
+        QtGui.QLabel.paintEvent(self, event)
+        # super(QPromptWidget, self).paintEvent(event)
+
+class QStringEdit(QtGui.QFrame):
+    """
+    QStringEdit is a line edit that has an extra button to allow user
+    to use a file as the value
+    
+    """
+    def __init__(self, parent=None):
+        """ QStringEdit(parent: QWidget) -> QStringEdit
+        Create a hbox layout to contain a line edit and a button
+
+        """
+        QtGui.QFrame.__init__(self, parent)        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)        
+        self.setLayout(hLayout)
+
+        self.lineEdit = QtGui.QLineEdit()
+        self.lineEdit.setFrame(False)
+        self.lineEdit.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                    QtGui.QSizePolicy.Expanding)
+        hLayout.addWidget(self.lineEdit)
+        self.setFocusProxy(self.lineEdit)
+
+        self.fileButton = QtGui.QToolButton()
+        self.fileButton.setText('...')
+        self.fileButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                      QtGui.QSizePolicy.Expanding)
+        self.fileButton.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.fileButton.setAutoFillBackground(True)
+        self.connect(self.fileButton, QtCore.SIGNAL('clicked()'),
+                     self.insertFileNameDialog)
+        hLayout.addWidget(self.fileButton)
+
+    def setText(self, text):
+        """ setText(text: QString) -> None
+        Overloaded function for setting the line edit text
+        
+        """
+        self.lineEdit.setText(text)
+
+    def text(self):
+        """ text() -> QString
+        Overloaded function for getting the line edit text
+        
+        """
+        return self.lineEdit.text()
+
+    def selectAll(self):
+        """ selectAll() -> None
+        Overloaded function for selecting all the text
+        
+        """
+        self.lineEdit.selectAll()
+
+    def setFrame(self, frame):
+        """ setFrame(frame: bool) -> None
+        Show/Hide the frame of this widget
+        
+        """
+        if frame:
+            self.setFrameStyle(QtGui.QFrame.StyledPanel |
+                               QtGui.QFrame.Plain)
+        else:
+            self.setFrameStyle(QtGui.QFrame.NoFrame)
+
+    def insertFileNameDialog(self):
+        """ insertFileNameDialog() -> None
+        Allow user to insert a file name as a value to the string
+        
+        """
+        fileName = QtGui.QFileDialog.getOpenFileName(self,
+                                                     'Use Filename '
+                                                     'as Value...',
+                                                     self.text(),
+                                                     'All files '
+                                                     '(*.*)')
+        if fileName:
+            self.setText(fileName)
+        
+###############################################################################
+
+class MultiLineWidget(StandardConstantWidget):
+    def __init__(self, contents, contentType, parent=None):
+        """__init__(contents: str, contentType: str, parent: QWidget) ->
+                                             StandardConstantWidget
+        Initialize the line edit with its contents. Content type is limited
+        to 'int', 'float', and 'string'
+        
+        """
+        StandardConstantWidget.__init__(self, parent)
+
+    def update_parent(self):
+        pass
+     
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event) -> None       
+        If this is a string line edit, we can use Ctrl+Enter to enter
+        the file name
+
+        """
+        k = event.key()
+        s = event.modifiers()
+        if ((k == QtCore.Qt.Key_Enter or k == QtCore.Qt.Key_Return) and
+            s & QtCore.Qt.ShiftModifier):
+            event.accept()
+            if self.contentIsString and self.multiLines:
+                fileNames = QtGui.QFileDialog.getOpenFileNames(self,
+                                                               'Use Filename '
+                                                               'as Value...',
+                                                               self.text(),
+                                                               'All files '
+                                                               '(*.*)')
+                fileName = fileNames.join(',')
+                if fileName:
+                    self.setText(fileName)
+                    return
+        QtGui.QLineEdit.keyPressEvent(self,event)
+        
+###############################################################################
+
+class QSearchEditBox(QtGui.QComboBox):
+    def __init__(self, incremental=True, parent=None):
+        QtGui.QComboBox.__init__(self, parent)
+        self.setEditable(True)
+        self.setInsertPolicy(QtGui.QComboBox.InsertAtTop)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Fixed)
+        regexp = QtCore.QRegExp("\S.*")
+        self.setDuplicatesEnabled(False)
+        validator = QtGui.QRegExpValidator(regexp, self)
+        self.setValidator(validator)
+        self.addItem('Clear Recent Searches')
+        item = self.model().item(0, 0)
+        font = QtGui.QFont(item.font())
+        font.setItalic(True)
+        item.setFont(font)
+        self.is_incremental = incremental
+
+    def keyPressEvent(self, e):
+        if e.key() in (QtCore.Qt.Key_Return,QtCore.Qt.Key_Enter):
+            if self.currentText():
+                if not self.is_incremental:
+                    self.emit(QtCore.SIGNAL('executeSearch(QString)'),  
+                              self.currentText())
+                self.insertItem(0, self.currentText())
+            else:
+                self.emit(QtCore.SIGNAL('resetText()'))
+            return
+        QtGui.QComboBox.keyPressEvent(self, e)
+        
+###############################################################################
+
+class QSearchBox(QtGui.QWidget):
+    """ 
+    QSearchBox contains a search combo box with a clear button and
+    a search icon.
+
+    """
+    def __init__(self, refine=True, incremental=True, parent=None):
+        """ QSearchBox(parent: QWidget) -> QSearchBox
+        Intialize all GUI components
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setWindowTitle('Search')
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(2)
+        self.setLayout(hLayout)
+
+        self.searchEdit = QSearchEditBox(incremental, self)
+        #TODO: Add separator!
+        self.searchEdit.clearEditText()
+
+        if refine:
+            self.actionGroup = QtGui.QActionGroup(self)
+            self.searchAction = QtGui.QAction('Search', self)
+            self.searchAction.setCheckable(True)
+            self.actionGroup.addAction(self.searchAction)
+            self.refineAction = QtGui.QAction('Refine', self)
+            self.refineAction.setCheckable(True)
+            self.actionGroup.addAction(self.refineAction)
+            self.searchAction.setChecked(True)
+
+            self.searchMenu = QtGui.QMenu()
+            self.searchMenu.addAction(self.searchAction)
+            self.searchMenu.addAction(self.refineAction)
+
+            self.searchButton = QtGui.QToolButton(self)
+            self.searchButton.setIcon(CurrentTheme.QUERY_ARROW_ICON)
+            self.searchButton.setAutoRaise(True)
+            self.searchButton.setPopupMode(QtGui.QToolButton.InstantPopup)
+            self.searchButton.setMenu(self.searchMenu)
+            hLayout.addWidget(self.searchButton)
+            self.connect(self.searchAction, QtCore.SIGNAL('triggered()'),
+                         self.searchMode)
+            self.connect(self.refineAction, QtCore.SIGNAL('triggered()'),
+                         self.refineMode)
+        else:
+            self.searchLabel = QtGui.QLabel(self)
+            pix = CurrentTheme.QUERY_VIEW_ICON.pixmap(QtCore.QSize(16,16))
+            self.searchLabel.setPixmap(pix)
+            self.searchLabel.setAlignment(QtCore.Qt.AlignCenter)
+            self.searchLabel.setMargin(4)
+            hLayout.addWidget(self.searchLabel)
+        
+        hLayout.addWidget(self.searchEdit)
+
+        self.resetButton = QtGui.QToolButton(self)
+        self.resetButton.setIcon(QtGui.QIcon(
+                self.style().standardPixmap(QtGui.QStyle.SP_DialogCloseButton)))
+        self.resetButton.setIconSize(QtCore.QSize(12,12))
+        self.resetButton.setAutoRaise(True)
+        self.resetButton.setEnabled(False)
+        hLayout.addWidget(self.resetButton)
+        self.manualResetEnabled = False
+
+        self.connect(self.resetButton, QtCore.SIGNAL('clicked()'),
+                     self.resetSearch)
+        self.connect(self.searchEdit, QtCore.SIGNAL('activated(int)'),
+                     self.executeSearch)
+        self.connect(self.searchEdit, QtCore.SIGNAL('resetText'),
+                     self.resetSearch)
+        self.connect(self.searchEdit, QtCore.SIGNAL('executeSearch(QString)'),
+                     self.executeTextSearch)
+        if incremental:
+            self.connect(self.searchEdit, 
+                         QtCore.SIGNAL('editTextChanged(QString)'),
+                         self.executeIncrementalSearch)
+        else:
+            self.connect(self.searchEdit,
+                         QtCore.SIGNAL('editTextChanged(QString)'),
+                         self.resetToggle)
+
+    def resetSearch(self):
+        """
+        resetSearch() -> None
+        Emit a signal to clear the search.
+
+        """
+        self.searchEdit.clearEditText()
+        self.resetButton.setEnabled(False)
+        self.manualResetEnabled = False
+        self.emit(QtCore.SIGNAL('resetSearch()'))
+
+    def clearSearch(self):
+        """ clearSearch() -> None
+        Clear the edit text without emitting resetSearch() signal
+        This is for when the search is rest from the version view and
+        the signal are already taken care of
+
+        """
+        self.searchEdit.clearEditText()
+        self.resetButton.setEnabled(False)
+        self.manualResetEnabled = False
+
+    def searchMode(self):
+        """
+        searchMode() -> None
+
+        """
+        self.emit(QtCore.SIGNAL('refineMode(bool)'), False) 
+    
+    def refineMode(self):
+        """
+        refineMode() -> None
+
+        """
+        self.emit(QtCore.SIGNAL('refineMode(bool)'), True) 
+
+    def resetToggle(self, text):
+        self.resetButton.setEnabled((str(text) != '') or 
+                                    self.manualResetEnabled)
+
+    def executeIncrementalSearch(self, text):
+        """
+        executeIncrementalSearch(text: QString) -> None
+        The text is changing, so update the search.
+
+        """
+        self.resetButton.setEnabled((str(text)!='') or
+                                    self.manualResetEnabled)
+        self.emit(QtCore.SIGNAL('executeIncrementalSearch(QString)'), text)
+
+    def executeTextSearch(self, text):
+        self.emit(QtCore.SIGNAL('executeSearch(QString)'),
+                  text)
+
+    def executeSearch(self, index):
+        """
+        executeSearch(index: int) -> None
+        The text is finished changing or a different item was selected.
+
+        """
+        count = self.searchEdit.count() 
+        if index == count-1: 
+            for i in xrange(count-1): 
+                self.searchEdit.removeItem(0) 
+            self.resetSearch() 
+        else: 
+            self.resetButton.setEnabled(True) 
+            self.emit(QtCore.SIGNAL('executeSearch(QString)'),  
+                      self.searchEdit.currentText())
+
+    def getCurrentText(self):
+        return str(self.searchEdit.currentText())
+
+    def setManualResetEnabled(self, boolVal):
+        self.manualResetEnabled = boolVal
+        self.resetButton.setEnabled((self.getCurrentText() != '') or
+                                    self.manualResetEnabled)
+
+###############################################################################
+
+class QTabBarDetachButton(QtGui.QAbstractButton):
+    """QTabBarDetachButton is a special button to be added to a tab
+    
+    """
+    def __init__(self, parent):
+        QtGui.QAbstractButton.__init__(self)
+        self.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.setCursor(QtCore.Qt.ArrowCursor)
+        self.setToolTip("Detach Tab")
+        self.setIcon(CurrentTheme.DETACH_TAB_ICON)
+        self.activePixmap = self.icon().pixmap(self.sizeHint(),
+                                               mode=QtGui.QIcon.Active)
+        self.normalPixmap = self.icon().pixmap(self.sizeHint(),
+                                               mode=QtGui.QIcon.Normal)
+        
+        self.resize(self.sizeHint())
+        
+    def sizeHint(self):
+        self.ensurePolished()
+        size = QtCore.QSize()
+        if not self.icon().isNull():
+            iconSize = self.style().pixelMetric(QtGui.QStyle.PM_SmallIconSize, 
+                                                None, self)
+            sz = self.icon().actualSize(QtCore.QSize(iconSize, iconSize))
+            size = max(sz.width(), sz.height())
+        
+        return QtCore.QSize(size, size)
+    
+    def enterEvent(self, event):
+        if self.isEnabled():
+            icon = QtGui.QIcon(self.activePixmap)
+            self.setIcon(icon)
+            self.update()
+        else:
+            icon = QtGui.QIcon(self.normalPixmap)
+            self.setIcon(icon)
+        QtGui.QAbstractButton.enterEvent(self, event)
+        
+    def leaveEvent(self, event):
+        icon = QtGui.QIcon(self.normalPixmap)
+        self.setIcon(icon)
+        if self.isEnabled():
+            self.update()
+        QtGui.QAbstractButton.leaveEvent(self, event)
+        
+    def closePosition(self):
+        tb = self.parent()
+        if isinstance(tb, QtGui.QTabBar):
+            close_position = self.style().styleHint(QtGui.QStyle.SH_TabBar_CloseButtonPosition,
+                                                  None, tb)
+            return close_position
+        return -1
+    
+    def otherPosition(self):
+        tb = self.parent()
+        if isinstance(tb, QtGui.QTabBar):
+            close_position = self.closePosition()
+            if close_position == QtGui.QTabBar.LeftSide:
+                position = QtGui.QTabBar.RightSide
+            else:
+                position = QtGui.QTabBar.LeftSide
+            return position
+        return -1
+            
+    def paintEvent(self, event):
+        p = QtGui.QPainter(self)
+        opt = QtGui.QStyleOptionToolButton()
+        opt.init(self)
+        opt.state |= QtGui.QStyle.State_AutoRaise
+        if (self.isEnabled() and self.underMouse() and 
+            not self.isChecked() and not self.isDown()):
+            opt.state |= QtGui.QStyle.State_Raised
+        if self.isChecked():
+            opt.state |= QtGui.QStyle.State_On
+        if self.isDown():
+            opt.state |= QtGui.QStyle.State_Sunken
+        tb = self.parent()
+        if isinstance(tb, QtGui.QTabBar):
+            index = tb.currentIndex()
+            position = self.otherPosition()
+            if tb.tabButton(index, position) == self:
+                opt.state |= QtGui.QStyle.State_Selected
+            opt.icon = self.icon()
+            opt.subControls = QtGui.QStyle.SC_None
+            opt.activeSubControls = QtGui.QStyle.SC_None
+            opt.features = QtGui.QStyleOptionToolButton.None
+            opt.arrowType = QtCore.Qt.NoArrow
+            size = self.style().pixelMetric(QtGui.QStyle.PM_SmallIconSize, 
+                                                None, self)
+            opt.iconSize = QtCore.QSize(size,size)
+            self.style().drawComplexControl(QtGui.QStyle.CC_ToolButton, opt, p, 
+                                            self)
+
+###############################################################################
+
+class QMouseTabBar(QtGui.QTabBar):
+    """QMouseTabBar is a QTabBar that emits a signal when a tab
+    receives a mouse event. For now only doubleclick events are
+    emitted."""
+    #signals
+    tabDoubleClicked = pyqtSignal(int,QtCore.QPoint)
+    
+    def __init__(self, parent=None):
+        QtGui.QTabBar.__init__(self, parent)
+        
+    def mouseDoubleClickEvent(self, event):
+        if event.button() == QtCore.Qt.LeftButton:
+            tab_idx = self.tabAt(event.pos())
+            if tab_idx != -1:
+                self.tabDoubleClicked.emit(tab_idx, event.pos())
+        QtGui.QTabBar.mouseDoubleClickEvent(self, event)
+
+###############################################################################
+
+class QDockPushButton(QtGui.QPushButton):
+    """QDockPushButton is a button to be used inside QDockWidgets. It will 
+    set the minimum height on Mac so it looks nice on both Mac and Windows"""
+    def __init__(self, text, parent=None):
+        QtGui.QPushButton.__init__(self, text, parent) 
+        if systemType in ['Darwin']:
+            self.setMinimumHeight(32)
diff --git a/vistrails/gui/configuration.py b/vistrails/gui/configuration.py
new file mode 100644
index 0000000..bd6ee61
--- /dev/null
+++ b/vistrails/gui/configuration.py
@@ -0,0 +1,979 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Widgets to display/edit configuration objects."""
+import os
+import os.path
+from PyQt4 import QtGui, QtCore
+
+from vistrails.core import debug
+from vistrails.core.configuration import ConfigurationObject, \
+                               get_vistrails_configuration
+
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.gui.common_widgets import QSearchTreeWindow, QSearchTreeWidget
+from vistrails.gui.utils import YES_BUTTON, NO_BUTTON, show_question, show_warning
+
+import vistrails.core.system
+
+##############################################################################
+
+def bool_conv(st):
+    if st == 'True':
+        return True
+    elif st == 'False':
+        return False
+    else:
+        raise TypeError('Bogus value for bool_conv ' + str(st))
+
+class QConfigurationTreeWidgetItem(QtGui.QTreeWidgetItem):
+
+    def __init__(self, parent, obj, parent_obj, name, temp_obj, temp_parent_obj):
+        lst = [name]
+        t = type(obj)
+        if t == bool:
+            self._obj_type = bool_conv
+        else:
+            self._obj_type = t
+        self._parent_obj = parent_obj
+        self._temp_parent_obj = temp_parent_obj
+        
+        self._name = name
+        if t == ConfigurationObject:
+            lst.extend(['', ''])
+            QtGui.QTreeWidgetItem.__init__(self, parent, lst)
+            self.setFlags(self.flags() & ~(QtCore.Qt.ItemIsDragEnabled |
+                                           QtCore.Qt.ItemIsSelectable ))
+        elif t == tuple and obj[0] is None and isinstance(obj[1], type):
+            self._obj_type = obj[1]
+            lst.extend(['', obj[1].__name__])
+            QtGui.QTreeWidgetItem.__init__(self, parent, lst)
+            self.setFlags((self.flags() & ~QtCore.Qt.ItemIsDragEnabled) |
+                          QtCore.Qt.ItemIsEditable)
+        else:
+            lst.extend([str(obj), type(obj).__name__])
+            QtGui.QTreeWidgetItem.__init__(self, parent, lst)
+            self.setFlags((self.flags() & ~QtCore.Qt.ItemIsDragEnabled) |
+                          QtCore.Qt.ItemIsEditable)
+
+    def change_value(self, new_value):
+        # if this is a parent ConfigurationObject, do nothing
+        if self._parent_obj and not self._obj_type == ConfigurationObject:
+            setattr(self._parent_obj, self._name, self._obj_type(new_value))
+            setattr(self._temp_parent_obj, self._name, self._obj_type(new_value))
+
+    def _get_name(self):
+        return self._name
+    name = property(_get_name)
+
+class QConfigurationTreeWidgetItemDelegate(QtGui.QItemDelegate):
+    """
+    QConfigurationTreeWidgetItemDelegate allows a custom editor for
+    each column of the QConfigurationTreeWidget    
+    """
+    
+    def createEditor(self, parent, option, index):
+        """ createEditor(parent: QWidget,
+                         option: QStyleOptionViewItem,
+                         index: QModelIndex) -> QWidget
+        Return the editing widget depending on columns
+        
+        """
+        # We only allow users to edit the  second column
+        if index.column()==1:
+            dataType = str(index.sibling(index.row(), 2).data())
+            
+            # Create the editor based on dataType
+            if dataType=='int':
+                editor = QtGui.QLineEdit(parent)
+                editor.setValidator(QtGui.QIntValidator(parent))
+            elif dataType=='bool':
+                editor = QtGui.QComboBox(parent)
+                editor.addItem('True')
+                editor.addItem('False')
+            else:
+                editor = QtGui.QItemDelegate.createEditor(self, parent,
+                                                          option, index)
+            return editor            
+        return None
+
+    def setEditorData(self, editor, index):
+        """ setEditorData(editor: QWidget, index: QModelIndex) -> None
+        Set the editor to reflects data at index
+        
+        """
+        if isinstance(editor, QtGui.QComboBox):
+            editor.setCurrentIndex(editor.findText(index.data()))
+        else:
+            QtGui.QItemDelegate.setEditorData(self, editor, index)
+
+    def setModelData(self, editor, model, index):
+        """ setModelData(editor: QStringEdit,
+                         model: QAbstractItemModel,
+                         index: QModelIndex) -> None
+        Set the text of the editor back to the item model
+        
+        """
+        if isinstance(editor, QtGui.QComboBox):
+            model.setData(index, editor.currentText())
+        elif isinstance(editor, QtGui.QLineEdit):
+            model.setData(index, editor.text())
+        else:
+            # Should never get here
+            assert False
+    
+
+class QConfigurationTreeWidget(QSearchTreeWidget):
+
+    def __init__(self, parent, persistent_config, temp_config):
+        QSearchTreeWidget.__init__(self, parent)
+        self.setMatchedFlags(QtCore.Qt.ItemIsEditable)
+        self.setColumnCount(3)
+        lst = ['Name', 'Value', 'Type']
+        self.setHeaderLabels(lst)
+        self.create_tree(persistent_config, temp_config)
+
+    def create_tree(self, persistent_config, temp_config):
+        def create_item(parent, obj, parent_obj, name, temp_obj, temp_parent_obj):
+            item = QConfigurationTreeWidgetItem(parent, obj, parent_obj, 
+                                                name, temp_obj, temp_parent_obj)
+            if isinstance(obj, ConfigurationObject):
+                for key in sorted(obj.keys()):
+                    create_item(item, getattr(obj, key), obj, key, 
+                                getattr(temp_obj, key), temp_obj)
+
+        # disconnect() and clear() are here because create_tree might
+        # also be called when an entirely new configuration object is set.
+
+        self.disconnect(self, QtCore.SIGNAL('itemChanged(QTreeWidgetItem *, int)'),
+                        self.change_configuration)
+        self.clear()
+        self._configuration = persistent_config
+        self._temp_configuration = temp_config
+        create_item(self, self._configuration, None, 'configuration', 
+                    self._temp_configuration, None)
+
+        self.expandAll()
+        self.resizeColumnToContents(0)
+        self.connect(self,
+                     QtCore.SIGNAL('itemChanged(QTreeWidgetItem *, int)'),
+                     self.change_configuration)
+
+    def change_configuration(self, item, col):
+        if item.flags() & QtCore.Qt.ItemIsEditable:
+            new_value = self.indexFromItem(item, col).data()
+            item.change_value(new_value)
+            # option-specific code
+            if item._name == 'dbDefault':
+                # Update the state of the icons if changing between db and
+                # file support
+                dbState = getattr(get_vistrails_configuration(), 'dbDefault')
+                if new_value != dbState:
+                    from vistrails.gui.vistrails_window import _app
+                    _app.setDBDefault(dbState)
+
+            self.emit(QtCore.SIGNAL('configuration_changed'),
+                      item, new_value)
+        
+class QConfigurationTreeWindow(QSearchTreeWindow):
+
+    def __init__(self, parent, persistent_config, temp_config):
+        self._configuration_object = persistent_config
+        self._temp_configuration = temp_config
+        QSearchTreeWindow.__init__(self, parent)
+
+    def createTreeWidget(self):
+        self.setWindowTitle('Configuration')
+        treeWidget = QConfigurationTreeWidget(self, self._configuration_object,
+                                              self._temp_configuration)
+        
+        # The delegate has to be around (self._delegate) to
+        # work, else the instance will be clean by Python...
+        self._delegate = QConfigurationTreeWidgetItemDelegate()
+        treeWidget.setItemDelegate(self._delegate)
+        return treeWidget
+
+
+class QConfigurationWidget(QtGui.QWidget):
+
+    def __init__(self, parent, persistent_config, temp_config, status_bar):
+        QtGui.QWidget.__init__(self, parent)
+        layout = QtGui.QVBoxLayout(self)
+        self.setLayout(layout)
+        self._status_bar = status_bar
+
+        self._tree = QConfigurationTreeWindow(self, persistent_config,
+                                              temp_config)
+        lbl = QtGui.QLabel("Set configuration variables for VisTrails here.", self)
+        layout.addWidget(lbl)
+        layout.addWidget(self._tree)
+
+    def configuration_changed(self, persistent_config, temp_config):
+        self._tree.treeWidget.create_tree(persistent_config, temp_config)
+
+class QGeneralConfiguration(QtGui.QWidget):
+    """
+    QGeneralConfiguration is a widget for showing a few general preferences
+    that can be set with widgets.
+
+    """
+    def __init__(self, parent, persistent_config, temp_config):
+        """
+        QGeneralConfiguration(parent: QWidget, 
+        configuration_object: ConfigurationObject) -> None
+
+        """
+        QtGui.QWidget.__init__(self, parent)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(10)
+        layout.setSpacing(10)
+        self.setLayout(layout)
+        self._configuration = None
+        self._temp_configuration = None
+        self.create_default_widgets(self, layout)
+        self.create_default_handler_button(self, layout)
+        self.create_other_widgets(self, layout)
+        self.update_state(persistent_config, temp_config)
+        self.connect_default_signals()
+        self.connect_other_signals()
+        
+    def connect_default_signals(self):
+        
+        # We need to connect only one of the radio buttons signal because
+        # only one of them will be checked at a time
+        
+        #Auto save signals
+        self.connect(self._autosave_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.temp_autosave_changed)
+        self.connect(self._autosave_always,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.autosave_changed)
+        
+        #Read and Write to database signals
+        self.connect(self._db_connect_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.temp_db_connect_changed)
+        self.connect(self._db_connect_always,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.db_connect_changed)
+        
+        #Caching signals
+        self.connect(self._use_cache_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.temp_use_cache_changed)
+        self.connect(self._use_cache_always,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.use_cache_changed)
+        
+        #Other signals
+        self.connect(self._splash_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.splash_changed)
+        self.connect(self._maximize_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.maximize_changed)
+        self.connect(self._multi_head_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.multi_head_changed)
+
+    def connect_other_signals(self):
+        if vistrails.core.system.systemType in ['Darwin']:
+            self.connect(self._use_metal_style_cb,
+                         QtCore.SIGNAL('stateChanged(int)'),
+                         self.metalstyle_changed)
+
+    def create_default_widgets(self, parent, layout):
+        """create_default_widgets(parent: QWidget, layout: QLayout)-> None
+        Creates default widgets in parent
+        
+        """
+        #Auto save
+        autosave_gb = QtGui.QGroupBox(parent)
+        autosave_gb.setTitle('Automatically save vistrails')
+        glayout = QtGui.QHBoxLayout()
+        parent._autosave_always = QtGui.QRadioButton("Always")
+        parent._autosave_never = QtGui.QRadioButton("Never")
+        parent._autosave_cb = QtGui.QCheckBox("Yes (for this session only)")
+        glayout.addWidget(parent._autosave_always)
+        glayout.addWidget(parent._autosave_never)
+        glayout.addWidget(parent._autosave_cb)
+        autosave_gb.setLayout(glayout)
+        layout.addWidget(autosave_gb)
+
+        #Read and Write to database
+        db_connect_gb = QtGui.QGroupBox(parent)
+        db_connect_gb.setTitle('Read/Write to database by default')
+        glayout = QtGui.QHBoxLayout()
+        parent._db_connect_always = QtGui.QRadioButton("Always")
+        parent._db_connect_never = QtGui.QRadioButton("Never")
+        parent._db_connect_cb = QtGui.QCheckBox("Yes (for this session only)")
+        glayout.addWidget(parent._db_connect_always)
+        glayout.addWidget(parent._db_connect_never)
+        glayout.addWidget(parent._db_connect_cb)
+        db_connect_gb.setLayout(glayout)
+        layout.addWidget(db_connect_gb)
+        
+        #Caching
+        use_cache_gb = QtGui.QGroupBox(parent)
+        use_cache_gb.setTitle('Cache execution results')
+        glayout = QtGui.QHBoxLayout()
+        parent._use_cache_always = QtGui.QRadioButton("Always")
+        parent._use_cache_never = QtGui.QRadioButton("Never")
+        parent._use_cache_cb = QtGui.QCheckBox("Yes (for this session only)")
+        glayout.addWidget(parent._use_cache_always)
+        glayout.addWidget(parent._use_cache_never)
+        glayout.addWidget(parent._use_cache_cb)
+        use_cache_gb.setLayout(glayout)
+        layout.addWidget(use_cache_gb)
+
+        parent._splash_cb = QtGui.QCheckBox(parent)
+        parent._splash_cb.setText('Show splash dialog on startup*')
+        layout.addWidget(parent._splash_cb)
+
+        parent._maximize_cb = QtGui.QCheckBox(parent)
+        parent._maximize_cb.setText('Maximize windows on startup*')
+        layout.addWidget(parent._maximize_cb)
+
+        parent._multi_head_cb = QtGui.QCheckBox(parent)
+        parent._multi_head_cb.setText('Use multiple displays on startup*')
+        layout.addWidget(parent._multi_head_cb)
+
+    def create_default_handler_button(self, parent, layout):
+        if vistrails.core.system.systemType == 'Linux':
+            from vistrails.gui.application import linux_default_application_set
+            from vistrails.core.application import get_vistrails_application
+
+            group = QtGui.QGroupBox(u"Open .vt .vtl files with VisTrails")
+            layout.addWidget(group)
+            layout2 = QtGui.QHBoxLayout()
+            group.setLayout(layout2)
+
+            if linux_default_application_set():
+                label = u".vt .vtl has a handler set"
+            else:
+                label = u".vt .vtl has no handler"
+            self._handler_status = QtGui.QLabel(label)
+
+            def set_dont_ask(state):
+                self._configuration.handlerDontAsk = bool(state)
+                self._temp_configuration.handlerDontAsk = bool(state)
+                self.emit(QtCore.SIGNAL('configuration_changed'),
+                        'handlerDontAsk', bool(state))
+            self._handler_dont_ask = QtGui.QCheckBox(u"Don't ask at startup")
+            self.connect(self._handler_dont_ask,
+                         QtCore.SIGNAL('stateChanged(int)'),
+                         set_dont_ask)
+
+            def install():
+                app = get_vistrails_application()
+                if app.ask_update_default_application(False):
+                    self._handler_status.setText(u".vt .vtl has a handler set")
+            install_button = QtGui.QPushButton(u"Install handler")
+            self.connect(install_button, QtCore.SIGNAL('clicked()'),
+                         install)
+
+            layout2.addWidget(self._handler_status)
+            layout2.addWidget(self._handler_dont_ask)
+            layout2.addWidget(install_button)
+
+    def create_other_widgets(self, parent, layout):
+        """create_other_widgets(parent: QWidget, layout: QLayout)-> None
+        Creates system specific widgets in parent
+        
+        """
+        if vistrails.core.system.systemType in ['Darwin']:
+            parent._use_metal_style_cb = QtGui.QCheckBox(parent)
+            parent._use_metal_style_cb.setText('Use brushed metal appearance*')
+            layout.addWidget(parent._use_metal_style_cb)
+
+        layout.addStretch()
+        label = QtGui.QLabel("* It requires restarting VisTrails for these \
+changes to take effect")
+        layout.addWidget(label)
+
+    def update_state(self, persistent_config, temp_config):
+        """ update_state(configuration: VistrailConfiguration) -> None
+        
+        Update the dialog state based on a new configuration
+        """
+        
+        self._configuration = persistent_config
+        self._temp_configuration = temp_config
+
+        #Autosave
+        if self._configuration.has('autosave'):
+            if self._configuration.autosave == True:
+                self._autosave_always.setChecked(True)
+                self._autosave_never.setChecked(False)
+                self._autosave_cb.setText("No (for this session only)")
+                self._autosave_cb.setChecked(
+                                     not self._temp_configuration.autosave)
+                    
+            else:
+                self._autosave_always.setChecked(False)
+                self._autosave_never.setChecked(True)
+                self._autosave_cb.setText("Yes (for this session only)")        
+                self._autosave_cb.setChecked(self._temp_configuration.autosave)
+        
+        #Read/Write from DB by default   
+        if self._configuration.has('dbDefault'):
+            if self._configuration.dbDefault == True:
+                self._db_connect_always.setChecked(True)
+                self._db_connect_never.setChecked(False)
+                self._db_connect_cb.setText("No (for this session only)")
+                self._db_connect_cb.setChecked(
+                                        not self._temp_configuration.dbDefault)
+                    
+            else:
+                self._db_connect_always.setChecked(False)
+                self._db_connect_never.setChecked(True)
+                self._db_connect_cb.setText("Yes (for this session only)")        
+                self._db_connect_cb.setChecked(
+                                        self._temp_configuration.dbDefault)
+        #Caching 
+        if self._configuration.has('useCache'):
+            if self._configuration.useCache == True:
+                self._use_cache_always.setChecked(True)
+                self._use_cache_never.setChecked(False)
+                self._use_cache_cb.setText("No (for this session only)")
+                self._use_cache_cb.setChecked(
+                                        not self._temp_configuration.useCache)
+                    
+            else:
+                self._use_cache_always.setChecked(False)
+                self._use_cache_never.setChecked(True)
+                self._use_cache_cb.setText("Yes (for this session only)")        
+                self._use_cache_cb.setChecked(self._temp_configuration.useCache)
+        
+        if self._configuration.has('showSplash'):
+            self._splash_cb.setChecked(self._configuration.showSplash)
+        if self._configuration.has('maximizeWindows'):
+            self._maximize_cb.setChecked(self._configuration.maximizeWindows)
+        if self._configuration.has('multiHeads'):
+            self._multi_head_cb.setChecked(self._configuration.multiHeads)
+
+        #Default handler
+        if vistrails.core.system.systemType == 'Linux':
+            from vistrails.gui.application import \
+                linux_default_application_set, linux_update_default_application
+
+            if linux_default_application_set():
+                self._handler_status.setText(u".vt .vtl has a handler set")
+            else:
+                self._handler_status.setText(u".vt .vtl has no handler")
+
+            self._handler_dont_ask.setChecked(
+                    self._configuration.check('handlerDontAsk'))
+
+        #other widgets
+        self.update_other_state()
+
+    def update_other_state(self):
+        """ update_state(configuration: VistrailConfiguration) -> None
+        
+        Update the dialog state based on a new configuration
+        """
+        if vistrails.core.system.systemType in ['Darwin']:
+            self._use_metal_style_cb.setChecked(
+                self._configuration.check('useMacBrushedMetalStyle'))
+            
+    def autosave_changed(self, on):
+        """ autosave_changed(on: bool) -> None
+        
+        """
+        debug.log("auto_save_changed")
+        if self._autosave_always.isChecked() == True:
+            value = True
+            self._autosave_cb.setText("No (for this session only)")
+            self._autosave_cb.setChecked(False)
+        else:
+            value = False
+            self._autosave_cb.setText("Yes (for this session only)")
+            self._autosave_cb.setChecked(False)
+            
+        self._configuration.autosave = value
+        self._temp_configuration.autosave = value
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+        
+    def temp_autosave_changed(self, on):
+        """ temp_autosave_changed(on: int) -> None
+        
+        """
+        debug.log("temp_auto_save_changed")
+        value = bool(on)
+        if self._autosave_cb.text() == "No (for this session only)":
+            value = not bool(on)
+        
+        self._temp_configuration.autosave = value
+
+    def db_connect_changed(self, on):
+        """ db_connect_changed(on: int) -> None
+
+        """
+        if self._db_connect_always.isChecked() == True:
+            value = True
+            self._db_connect_cb.setText("No (for this session only)")
+            self._db_connect_cb.setChecked(False)
+        else:
+            value = False
+            self._db_connect_cb.setText("Yes (for this session only)")
+            self._db_connect_cb.setChecked(False)
+            
+        self._configuration.dbDefault = value
+        self._temp_configuration.dbDefault = value
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+        
+    def temp_db_connect_changed(self, on):
+        """ temp_db_connect_changed(on: int) -> None
+
+        """
+        debug.log("temp_db_connect_changed")
+        value = bool(on)
+        if self._db_connect_cb.text() == "No (for this session only)":
+            value = not bool(on)
+        
+        self._temp_configuration.dbDefault = value
+
+    def use_cache_changed(self, on):
+        """ use_cache_changed(on: int) -> None
+
+        """
+        if self._use_cache_always.isChecked() == True:
+            value = True
+            self._use_cache_cb.setText("No (for this session only)")
+            self._use_cache_cb.setChecked(False)
+        else:
+            value = False
+            self._use_cache_cb.setText("Yes (for this session only)")
+            self._use_cache_cb.setChecked(False)
+            
+        self._configuration.useCache = value
+        self._temp_configuration.useCache = value
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+        
+    def temp_use_cache_changed(self, on):
+        """ temp_use_cache_changed(on: int) -> None
+
+        """
+        debug.log("temp_use_cache_changed")
+        value = bool(on)
+        if self._use_cache_cb.text() == "No (for this session only)":
+            value = not bool(on)
+        
+        self._temp_configuration.useCache = value
+
+    def splash_changed(self, on):
+        """ splash_changed(on: int) -> None
+
+        """
+        self._configuration.showSplash = bool(on)
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+
+    def maximize_changed(self, on):
+        """ maximize_changed(on: int) -> None
+
+        """
+        self._configuration.maximizeWindows = bool(on)
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+
+    def multi_head_changed(self, on):
+        """ multi_head_changed(on: int) -> None
+
+        """
+        self._configuration.multiHeads = bool(on)
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+
+    def metalstyle_changed(self, on):
+        """ metalstyle_changed(on: int) -> None
+        
+        """
+        self._configuration.useMacBrushedMetalStyle = bool(on)
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+
+class QThumbnailConfiguration(QtGui.QWidget):
+    """
+    QThumbnailConfiguration is a widget for showing a few thumbnail related 
+    preferences that can be set with widgets.
+
+    """
+    def __init__(self, parent, persistent_config, temp_config):
+        """
+        QThumbnailConfiguration(parent: QWidget, 
+        configuration_object: ConfigurationObject) -> None
+
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self._configuration = None
+        self._temp_configuration = None
+        self._cache = ThumbnailCache.getInstance()
+        self.create_widgets()
+        self.update_state(persistent_config, temp_config)
+        self.connect_signals()
+    
+    def create_widgets(self):
+        """create_widgets()-> None
+        Creates widgets
+        
+        """
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(10)
+        layout.setSpacing(10)
+        self.setLayout(layout)
+        
+        #Auto save
+        autosave_gb = QtGui.QGroupBox(self)
+        autosave_gb.setTitle('Automatically save thumbnails in .vt files')
+        glayout = QtGui.QHBoxLayout()
+        self._autosave_always = QtGui.QRadioButton("Always")
+        self._autosave_never = QtGui.QRadioButton("Never")
+        self._autosave_cb = QtGui.QCheckBox("Yes (for this session only)")
+        glayout.addWidget(self._autosave_always)
+        glayout.addWidget(self._autosave_never)
+        glayout.addWidget(self._autosave_cb)
+        autosave_gb.setLayout(glayout)
+        layout.addWidget(autosave_gb)
+        
+        #Thumbnails for tagged versions only
+        tagsonly_gb = QtGui.QGroupBox(self)
+        tagsonly_gb.setTitle('Keep thumbnails of tagged versions only')
+        glayout = QtGui.QHBoxLayout()
+        self._tagsonly_always = QtGui.QRadioButton("Always")
+        self._tagsonly_never = QtGui.QRadioButton("Never")
+        self._tagsonly_cb = QtGui.QCheckBox("Yes (for this session only)")
+        glayout.addWidget(self._tagsonly_always)
+        glayout.addWidget(self._tagsonly_never)
+        glayout.addWidget(self._tagsonly_cb)
+        tagsonly_gb.setLayout(glayout)
+        layout.addWidget(tagsonly_gb)
+        
+        #Show thumbnails on mouser hover events
+        mouse_hover_gb = QtGui.QGroupBox(self)
+        mouse_hover_gb.setTitle('Show thumbnails as tooltips on mouse \
+hovering tree nodes')
+        glayout = QtGui.QHBoxLayout()
+        self._mouse_hover_always = QtGui.QRadioButton("Always")
+        self._mouse_hover_never = QtGui.QRadioButton("Never")
+        self._mouse_hover_cb = QtGui.QCheckBox("Yes (for this session only)")
+        glayout.addWidget(self._mouse_hover_always)
+        glayout.addWidget(self._mouse_hover_never)
+        glayout.addWidget(self._mouse_hover_cb)
+        mouse_hover_gb.setLayout(glayout)
+        layout.addWidget(mouse_hover_gb)
+        
+        hlayout = QtGui.QHBoxLayout()
+        cache_label = QtGui.QLabel(self)
+        cache_label.setText('Limit thumbnail cache size to ')
+        
+        self._thumbs_cache_sb = QtGui.QSpinBox(self)
+        self._thumbs_cache_sb.setRange(10,128)
+        self._thumbs_cache_sb.setValue(10)
+        self._thumbs_cache_sb.setSuffix('MB')
+        self._thumbs_cache_sb.stepBy(5)
+        
+        self._clear_thumbs_cache_btn = QtGui.QPushButton(self)
+        self._clear_thumbs_cache_btn.setText("Clear Cache")
+        
+        hlayout.addWidget(cache_label)
+        hlayout.addWidget(self._thumbs_cache_sb)
+        hlayout.addWidget(self._clear_thumbs_cache_btn)
+        layout.addLayout(hlayout)
+        
+        hlayout = QtGui.QHBoxLayout()
+        cache_label2 = QtGui.QLabel(self)
+        cache_label2.setText("Cache Directory:")
+        self._thumbs_cache_directory_edt = QtGui.QLineEdit(self)
+        self._thumbs_cache_directory_btn = QtGui.QPushButton("...", self)
+        hlayout.addWidget(cache_label2)
+        hlayout.addWidget(self._thumbs_cache_directory_edt)
+        hlayout.addWidget(self._thumbs_cache_directory_btn)
+        layout.addLayout(hlayout)
+        layout.addStretch()
+
+    def connect_signals(self):
+        # We need to connect only one of the radio buttons signal because
+        # only one of them will be checked at a time
+        
+        #Auto save signals
+        self.connect(self._autosave_always,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.autosave_changed)
+        self.connect(self._autosave_cb,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.temp_autosave_changed)
+        
+        #Thumbnails for tagged versions only signals
+        self.connect(self._tagsonly_always,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.tagsonly_changed)
+        self.connect(self._tagsonly_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.temp_tagsonly_changed)
+        
+        #Show thumbnails on mouser hover events signals
+        self.connect(self._mouse_hover_always,
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.mouse_hover_changed)
+        self.connect(self._mouse_hover_cb,
+                     QtCore.SIGNAL('stateChanged(int)'),
+                     self.temp_mouse_hover_changed)
+        
+        #Other widget signals
+        self.connect(self._thumbs_cache_sb,
+                     QtCore.SIGNAL('valueChanged(int)'),
+                     self.thumbs_cache_changed)
+        self.connect(self._clear_thumbs_cache_btn,
+                     QtCore.SIGNAL('clicked()'),
+                     self.clear_thumbs_cache_pressed)
+        self.connect(self._thumbs_cache_directory_edt,
+                     QtCore.SIGNAL('editingFinished()'),
+                     self.thumbs_cache_directory_changed)
+        self.connect(self._thumbs_cache_directory_btn,
+                     QtCore.SIGNAL('clicked()'),
+                     self.show_directory_chooser)
+        
+    def update_state(self, persistent_config, temp_config):
+        """ update_state(persistent_config, temp_config: VistrailConfiguration) 
+                                     -> None
+        Update the dialog state based on a new configuration
+        
+        """
+        self._configuration = persistent_config
+        self._temp_configuration = temp_config
+        #Auto save
+        if self._configuration.has('thumbs'):
+            if self._configuration.thumbs.has('autoSave'):
+                if self._configuration.autosave == True:
+                    self._autosave_always.setChecked(True)
+                    self._autosave_never.setChecked(False)
+                    self._autosave_cb.setText("No (for this session only)")
+                    self._autosave_cb.setChecked(
+                                not self._temp_configuration.thumbs.autoSave)
+                    
+                else:
+                    self._autosave_always.setChecked(False)
+                    self._autosave_never.setChecked(True)
+                    self._autosave_cb.setText("Yes (for this session only)")        
+                    self._autosave_cb.setChecked(
+                                self._temp_configuration.thumbs.autoSave)
+            #Thumbnails for tagged versions only    
+            if self._configuration.thumbs.has('tagsOnly'):
+                if self._configuration.thumbs.tagsOnly == True:
+                    self._tagsonly_always.setChecked(True)
+                    self._tagsonly_never.setChecked(False)
+                    self._tagsonly_cb.setText("No (for this session only)")
+                    self._tagsonly_cb.setChecked(
+                                not self._temp_configuration.thumbs.tagsOnly)
+                    
+                else:
+                    self._tagsonly_always.setChecked(False)
+                    self._tagsonly_never.setChecked(True)
+                    self._tagsonly_cb.setText("Yes (for this session only)")        
+                    self._tagsonly_cb.setChecked(
+                                    self._temp_configuration.thumbs.tagsOnly)
+            #Show thumbnails on mouser hover events
+            if self._configuration.thumbs.has('mouseHover'):
+                if self._configuration.thumbs.mouseHover == True:
+                    self._mouse_hover_always.setChecked(True)
+                    self._mouse_hover_never.setChecked(False)
+                    self._mouse_hover_cb.setText("No (for this session only)")
+                    self._mouse_hover_cb.setChecked(
+                                not self._temp_configuration.thumbs.mouseHover)
+                    
+                else:
+                    self._mouse_hover_always.setChecked(False)
+                    self._mouse_hover_never.setChecked(True)
+                    self._mouse_hover_cb.setText("Yes (for this session only)")        
+                    self._mouse_hover_cb.setChecked(
+                                self._temp_configuration.thumbs.mouseHover)
+            # Other widgets
+            if self._configuration.thumbs.has('cacheSize'):
+                self._thumbs_cache_sb.setValue(
+                    self._configuration.thumbs.cacheSize)
+            if self._configuration.thumbs.has('cacheDirectory'):
+                self._thumbs_cache_directory_edt.setText(
+                    self._configuration.thumbs.cacheDirectory)
+                
+    def autosave_changed(self, on):
+        """ autosave_changed(on: bool) -> None
+        
+        """
+        debug.log("thumbs_auto_save_changed")
+        if self._autosave_always.isChecked() == True:
+            value = True
+            self._autosave_cb.setText("No (for this session only)")
+            self._autosave_cb.setChecked(False)
+        else:
+            value = False
+            self._autosave_cb.setText("Yes (for this session only)")
+            self._autosave_cb.setChecked(False)
+            
+        self._configuration.thumbs.autoSave = value
+        self._temp_configuration.thumbs.autoSave = value
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+        
+    def temp_autosave_changed(self, on):
+        """ temp_autosave_changed(on: int) -> None
+        
+        """
+        debug.log("thumbs_temp_auto_save_changed")
+        value = bool(on)
+        if self._autosave_cb.text() == "No (for this session only)":
+            value = not bool(on)
+        
+        self._temp_configuration.thumbs.autoSave = value
+
+    def tagsonly_changed(self, on):
+        """ tagsonly_changed(on: bool) -> None
+        
+        """
+        debug.log("thumbs_tagsonly_changed")
+        if self._tagsonly_always.isChecked() == True:
+            value = True
+            self._tagsonly_cb.setText("No (for this session only)")
+            self._tagsonly_cb.setChecked(False)
+        else:
+            value = False
+            self._tagsonly_cb.setText("Yes (for this session only)")
+            self._tagsonly_cb.setChecked(False)
+            
+        self._configuration.thumbs.tagsOnly = value
+        self._temp_configuration.thumbs.tagsOnly = value
+        
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+        
+    def temp_tagsonly_changed(self, on):
+        """ temp_tagsonly_changed(on: int) -> None
+        
+        """
+        debug.log("thumbs_temp_tagsonly_changed")
+        value = bool(on)
+        if self._tagsonly_cb.text() == "No (for this session only)":
+            value = not bool(on)
+        
+        self._temp_configuration.thumbs.tagsOnly = value
+        
+    def mouse_hover_changed(self, on):
+        """ mouse_hover_changed(on: bool) -> None
+        
+        """
+        debug.log("thumbs_mouse_hover_changed")
+        if self._mouse_hover_always.isChecked() == True:
+            value = True
+            self._mouse_hover_cb.setText("No (for this session only)")
+            self._mouse_hover_cb.setChecked(False)
+        else:
+            value = False
+            self._mouse_hover_cb.setText("Yes (for this session only)")
+            self._mouse_hover_cb.setChecked(False)
+            
+        self._configuration.thumbs.mouseHover = value
+        self._temp_configuration.thumbs.mouseHover = value
+        
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, bool(on))
+        
+    def temp_mouse_hover_changed(self, on):
+        """ temp_mouse_hover_changed(on: int) -> None
+        
+        """
+        debug.log("thumbs_temp_mouse_hover_changed")
+        value = bool(on)
+        if self._mouse_hover_cb.text() == "No (for this session only)":
+            value = not bool(on)
+        
+        self._temp_configuration.thumbs.mouseHover = value
+        
+    def thumbs_cache_changed(self, v):
+        """ thumbs_cache_changed(v: int) -> None
+        
+        """
+        self._configuration.thumbs.cacheSize = v
+        self._temp_configuration.thumbs.cacheSize = v
+        self.emit(QtCore.SIGNAL('configuration_changed'),
+                  None, v)
+        
+    def thumbs_cache_directory_changed(self):
+        """ thumbs_cache_changed(v: int) -> None
+        
+        """
+        value = str(self._thumbs_cache_directory_edt.text())
+        old_folder = self._configuration.thumbs.cacheDirectory
+        if os.path.exists(value):
+            self._configuration.thumbs.cacheDirectory = value
+            self._temp_configuration.thumbs.cacheDirectory = value
+            self.emit(QtCore.SIGNAL('configuration_changed'),
+                      None, value)
+            self._cache.move_cache_directory(old_folder,value)
+        else:
+            show_warning('VisTrails', 'The directory specified does not exist.')
+            self._thumbs_cache_directory_edt.setText(old_folder)
+            
+    def show_directory_chooser(self):
+        """show_directory_chooser() -> None
+        Shows a dialog for choosing a directory 
+        
+        """
+        dir = QtGui.QFileDialog.getExistingDirectory(
+                  self,
+                  "Choose a new directory for storing thumbnail chache files",
+                  "",
+                  QtGui.QFileDialog.ShowDirsOnly)
+        if dir:
+            self._thumbs_cache_directory_edt.setText(dir)
+            self.thumbs_cache_directory_changed()
+            
+    def clear_thumbs_cache_pressed(self):
+        """clear_thumbs_cache_pressed() -> None
+        Will delete all files in thumbs.cacheDirectory if user clicks yes
+        
+        """
+        res = show_question('VisTrails',
+                  "All files in %s will be removed. Are you sure? " % (
+                            self._temp_configuration.thumbs.cacheDirectory),
+                  buttons = [YES_BUTTON,NO_BUTTON],
+                  default = NO_BUTTON)
+        if res == YES_BUTTON:
+            self._cache.clear()
+ 
diff --git a/vistrails/gui/controlflow_assist.py b/vistrails/gui/controlflow_assist.py
new file mode 100644
index 0000000..4662d2d
--- /dev/null
+++ b/vistrails/gui/controlflow_assist.py
@@ -0,0 +1,325 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This contains the dialog/logic for the Control Flow Assistant.
+
+QControlFlowAssistDialog
+"""
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core import debug
+from vistrails.core.modules.module_registry import MissingPackage
+from vistrails.core.packagemanager import get_package_manager
+from vistrails.gui.utils import show_info
+
+################################################################################
+
+class QControlFlowAssistDialog(QtGui.QDialog):
+    def __init__(self, parent, selected_module_ids, selected_connection_ids, scene):
+        """ QControlFlowAssistDialog(selected_module_ids: list,
+                                     selected_connection_ids: list,
+                                     scene: QGraphicsScene)
+                                     -> None
+        Creates the control flow assistant dialog
+        
+        """
+
+        # FIXME do this here to avoid circular refs
+        from pipeline_view_select import QReadOnlyPortSelectPipelineView
+
+        QtGui.QDialog.__init__(self, parent)
+        self.module_ids = selected_module_ids
+        self.connection_ids = selected_connection_ids
+        
+        self.setWindowTitle('Control Flow Assistant')
+        layout = QtGui.QVBoxLayout(self)
+        self.setLayout(layout)
+        
+        # Add instruction label
+        self.instructionLabel = QtGui.QLabel('Select one or more Input Ports to receive Lists, and one Output Port to produce a List')
+        layout.addWidget(self.instructionLabel)
+        
+        # Add pipeline view
+        self.pipelineView = QReadOnlyPortSelectPipelineView(self, scene, True, selected_module_ids)
+        self.controller = self.pipelineView.scene().controller
+        layout.addWidget(self.pipelineView)
+
+        self.enablePackage()
+
+        # Add ok/cancel buttons
+        buttonLayout = QtGui.QHBoxLayout()
+        buttonLayout.setMargin(5)
+        self.okButton = QtGui.QPushButton('&OK', self)
+        self.okButton.setAutoDefault(False)
+        self.okButton.setFixedWidth(100)
+        buttonLayout.addWidget(self.okButton)
+        self.cancelButton = QtGui.QPushButton('&Cancel', self)
+        self.cancelButton.setAutoDefault(False)
+        self.cancelButton.setShortcut('Esc')
+        self.cancelButton.setFixedWidth(100)
+        buttonLayout.addWidget(self.cancelButton)
+        layout.addLayout(buttonLayout)
+        self.connect(self.okButton, QtCore.SIGNAL('clicked(bool)'), self.okClicked)
+        self.connect(self.cancelButton, QtCore.SIGNAL('clicked(bool)'), self.close)
+
+    def enablePackage(self):
+        """ enablePackge() -> None
+        Tries to enable the controlflow package through the controller.
+        """
+        pm = get_package_manager()
+        cf_pkg_id = 'org.vistrails.vistrails.control_flow'
+        if not pm.has_package(cf_pkg_id):
+            dep_graph = pm.build_dependency_graph([cf_pkg_id])
+            if not self.controller.try_to_enable_package(cf_pkg_id, dep_graph):
+                raise MissingPackage(cf_pkg_id)
+
+    def getInputPortsInfo(self):
+        """ getInputPortsInfo() -> list
+        Gets a list of tuples from the selected input port (QGraphicsPortItem) objects
+        containing: (module, portspec, incoming_connections, halfwidth)
+        
+        """
+        return [(gport.parentItem().module, gport.port, gport.controller.get_connections_to(gport.controller.current_pipeline, [gport.parentItem().module.id], gport.port.name), (gport.parentItem().boundingRect().right()-gport.parentItem().boundingRect().left())/2) for gport in self.pipelineView.getSelectedInputPorts()]
+    
+    def getOutputPortsInfo(self):
+        """ getOutputPortsInfo() -> list
+        Gets a list of tuples from the selected output port (QGraphicsPortItem) objects
+        containing: (module, portspec, outgoing_connections, halfwidth)
+        
+        """
+        return [(gport.parentItem().module, gport.port, gport.controller.get_connections_from(gport.controller.current_pipeline, [gport.parentItem().module.id], gport.port.name), (gport.parentItem().boundingRect().right()-gport.parentItem().boundingRect().left())/2) for gport in self.pipelineView.getSelectedOutputPorts()]
+
+    def okClicked(self):
+        """ okClicked() -> None
+        Verify selected ports and initiate control flow creation
+        
+        """
+        try:
+            self.enablePackage()
+        except MissingPackage:
+            debug.critical("The controlflow package is not available")
+            return
+
+        # Verify that at least one input and one output have been chosen
+        input_ports_info = self.getInputPortsInfo()
+        output_ports_info = self.getOutputPortsInfo()
+        if len(input_ports_info) == 0:
+            show_info('No Input Ports Selected', 'No Input Ports have been selected.  You must select at least one to proceed.')
+        elif len(output_ports_info) == 0:
+            show_info('No Output Port Selected', 'No Output Port has been selected.  You must select one to proceed.')
+        else:
+            self.createControlFlow(input_ports_info, output_ports_info)
+            self.close()
+        
+    def createControlFlow(self, input_ports_info, output_ports_info):
+        """ createControlFlow(input_ports_info: list,
+                              output_ports_info: list)
+                              -> None
+        Create a control flow from input and output port information.
+        input_ports_info is a list of tuples containing: (module, portspec, incoming_connections, halfwidth)
+        input_ports_info is a list of tuples containing: (module, portspec, outgoing_connections, halfwidth)
+        
+        """
+        from vistrails.core.modules.basic_modules import identifier as bm_identifier
+        from vistrails.packages.controlflow import identifier as cf_identifier
+        
+        io_modules = []
+        io_connections = []
+        
+        # Create and connect InputPort for each of the inputs to force it to exist on group
+        offset = {}
+        [offset.__setitem__(module, halfwidth+65) for module, portspec, connections, halfwidth in input_ports_info]
+        for input_module, input_portspec, input_connections, halfwidth in input_ports_info:
+            # Remove function calls to selected input ports
+            try:
+                function_pos = [f.name for f in input_module.functions].index(input_portspec.name)
+                self.controller.delete_method(function_pos, input_module.id)
+            except:
+                pass
+            # Disconnect connections to selected input ports
+            for connection in input_connections:
+                self.connection_ids.remove(connection.id)
+                self.controller.delete_connection(connection.id)
+            group_inport_module = self.controller.add_module(input_module.location.x-offset[input_module], input_module.location.y, bm_identifier, 'InputPort')
+            io_modules.append(group_inport_module)
+            offset[input_module] += 130
+            for p in group_inport_module.sourcePorts():
+                if p.name == 'InternalPipe':
+                    group_inport_conn = self.controller.add_connection(input_module.id, input_portspec, group_inport_module.id, p)
+                    io_connections.append(group_inport_conn)
+                    break
+        
+        # Create and connect OutputPort for desired output to force it to exist on group
+        output_module, output_portspec, output_connections, halfwidth = output_ports_info[0]
+        # Disconnect connections to selected output port
+        for connection in output_connections:
+            self.connection_ids.remove(connection.id)
+            self.controller.delete_connection(connection.id)
+        group_outport_module = self.controller.add_module(output_module.location.x+halfwidth+75, output_module.location.y, bm_identifier, 'OutputPort')
+        io_modules.append(group_outport_module)
+        for p in group_outport_module.destinationPorts():
+            if p.name == 'InternalPipe':
+                group_outport_conn = self.controller.add_connection(output_module.id, output_portspec, group_outport_module.id, p)
+                io_connections.append(group_outport_conn)
+                break
+        
+        # Create inner group from selected modules and their connections (plus newly created input/output connections)
+        inner_group = self.controller.create_group(self.module_ids + [m.id for m in io_modules], self.connection_ids + [c.id for c in io_connections])
+        self.controller.updatePipelineScene()
+        del io_modules[:]
+        del io_connections[:]
+        io_modules.append(inner_group)
+        io_connections.extend(self.controller.get_connections_to_and_from(self.controller.current_pipeline, [inner_group.id]))
+        
+        # Add Map module
+        map_module = self.controller.add_module(inner_group.location.x-120, inner_group.location.y, cf_identifier, 'Map')
+        io_modules.append(map_module)
+        
+        # Get group 'self' port object
+        for p in inner_group.sourcePorts():
+            if p.name == 'self':
+                inner_group_selfport = p
+                break
+        
+        # Add PythonSource
+        py_source_module = self.controller.add_module(inner_group.location.x, inner_group.location.y+75, bm_identifier, 'PythonSource')
+        io_modules.append(py_source_module)
+        group_type = '('+bm_identifier+':Group)'
+        bool_type = '('+bm_identifier+':Boolean)'
+        list_type = '('+bm_identifier+':List)'
+        string_type = '('+bm_identifier+':String)'
+        base_input_ports = []
+        base_output_ports = [('output', 'InputList', list_type, 0),
+                             ('output', 'InputPort', list_type, 1),
+                             ('output', 'OutputPort', string_type, 2)]
+        add_input_ports = [('input', 'UseCartesianProduct', bool_type, 1),
+                           ('input', 'UserDefinedInputList', list_type, 2)]
+        # Add List port to PythonSource module for each input port selected
+        sortkey = len(base_input_ports) + len(add_input_ports)
+        input_port_names_used = dict([(p[1], 1) for p in base_input_ports])
+        for input_module, input_portspec, input_connections, halfwidth in input_ports_info:
+            port_name = input_portspec.name
+            if port_name not in input_port_names_used:
+                input_port_names_used[port_name] = 1
+            else:
+                input_port_names_used[port_name] += 1
+                port_name += '_%d' % input_port_names_used[port_name]
+            add_input_ports.append(('input', port_name, list_type, sortkey))
+            sortkey += 1
+        # Generate the source
+        source_code = '''
+psrc_module = self.moduleInfo['pipeline'].modules[self.moduleInfo['moduleId']]
+input_ports = [p.name for p in psrc_module.input_port_specs if p.name not in ['UseCartesianProduct', 'UserDefinedInputList']]
+InputPort = input_ports
+OutputPort = '%s'
+custom_input_list = self.forceGetInputFromPort('UserDefinedInputList', [])
+if custom_input_list:
+    InputList = custom_input_list
+else:
+    cartesian_product = self.forceGetInputFromPort('UseCartesianProduct', False)
+    if cartesian_product:
+        input_lists = [self.getInputFromPort(input_ports[x]) for x in xrange(len(input_ports))]
+        InputList = [[]]
+        pools = map(tuple, input_lists)
+        for pool in pools:
+            InputList = [x+[y] for x in InputList for y in pool]
+    else:
+        # Dot Product
+        InputList = []
+        length = len(self.getInputFromPort(input_ports[0]))
+        if len(input_ports) > 1:
+            for p in input_ports[1:]:
+                if len(self.getInputFromPort(p)) != length:
+                    fail('One or more of the input lists have different lengths.')
+        for x in xrange(length):
+            element_list = []
+            for p in input_ports:
+                element_list.append(self.getInputFromPort(p)[x])
+            InputList.append(element_list)
+    # Compact list format used when only one input port present
+    if len(input_ports) == 1:
+        InputList = [x[0] for x in InputList]
+print 'InputList: %%s' %% InputList
+''' % output_portspec.name
+        functions = [('source', [source_code])]
+        self.controller.update_ports_and_functions(py_source_module.id, [], base_input_ports + add_input_ports + base_output_ports, functions)
+        
+        # Create connections to Map
+        map_module = self.controller.current_pipeline.modules[map_module.id]
+        py_source_module = self.controller.current_pipeline.modules[py_source_module.id]
+        psrc_inputlist = py_source_module.get_port_spec('InputList', 'output')
+        psrc_inputport = py_source_module.get_port_spec('InputPort', 'output')
+        psrc_outputport = py_source_module.get_port_spec('OutputPort', 'output')
+        for map_port in map_module.destinationPorts():
+            # Connect Group 'self' port to Map's FunctionPort
+            if map_port.name == 'FunctionPort':
+                map_conn = self.controller.add_connection(inner_group.id, inner_group_selfport, map_module.id, map_port)
+            # Connect PythonSource output ports to Map input ports
+            elif map_port.name == 'InputList':
+                map_conn = self.controller.add_connection(py_source_module.id, psrc_inputlist, map_module.id, map_port)
+            elif map_port.name == 'InputPort':
+                map_conn = self.controller.add_connection(py_source_module.id, psrc_inputport, map_module.id, map_port)
+            elif map_port.name == 'OutputPort':
+                map_conn = self.controller.add_connection(py_source_module.id, psrc_outputport, map_module.id, map_port)
+            io_connections.append(map_conn)
+        
+        # Create and connect InputPort for each of the PythonSource inputs to force it to exist on group
+        offset = 165
+        for port_type, port_name, list_type, sortkey in add_input_ports:
+            group_inport_module = self.controller.add_module(py_source_module.location.x-offset, py_source_module.location.y+75, bm_identifier, 'InputPort')
+            if (port_type, port_name) in [('input', 'UseCartesianProduct'), ('input', 'UserDefinedInputList')]:
+                self.controller.update_ports_and_functions(group_inport_module.id, [], [], [('optional', [True])])
+            io_modules.append(group_inport_module)
+            offset += 130
+            input_portspec = py_source_module.get_port_spec(port_name, port_type)
+            for p in group_inport_module.sourcePorts():
+                if p.name == 'InternalPipe':
+                    group_inport_conn = self.controller.add_connection(py_source_module.id, input_portspec, group_inport_module.id, p)
+                    io_connections.append(group_inport_conn)
+                    break
+        
+        # Create and connect OutputPort from Map to force it to exist on group
+        group_outport_module = self.controller.add_module(map_module.location.x, map_module.location.y-75, bm_identifier, 'OutputPort')
+        io_modules.append(group_outport_module)
+        output_portspec = map_module.get_port_spec('Result', 'output')
+        for p in group_outport_module.destinationPorts():
+            if p.name == 'InternalPipe':
+                group_outport_conn = self.controller.add_connection(map_module.id, output_portspec, group_outport_module.id, p)
+                io_connections.append(group_outport_conn)
+                break
+        
+        # Create outer group from PythonSource, Map, and inner Group, along with their connections and IO modules
+        outer_group = self.controller.create_group([m.id for m in io_modules], [c.id for c in io_connections])
+        self.controller.updatePipelineScene()
+        
diff --git a/vistrails/gui/debug.py b/vistrails/gui/debug.py
new file mode 100644
index 0000000..cc67d13
--- /dev/null
+++ b/vistrails/gui/debug.py
@@ -0,0 +1,375 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import cgi
+import logging
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core.configuration import get_vistrails_configuration
+import vistrails.core.debug
+from vistrails.gui.application import get_vistrails_application
+from vistrails.gui.common_widgets import QDockPushButton
+from vistrails.gui.theme import CurrentTheme
+import vistrails.gui.utils
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+################################################################################
+
+
+class DebugView(QtGui.QWidget, QVistrailsPaletteInterface):
+    """ Class used for showing error messages and
+        debugging QT signals.
+
+        Example of usage:
+           import gui.debug
+           gui.debug.watch_signal(my_signal)
+     """
+    #Singleton technique
+    # _instance = None
+    # class DebugViewSingleton():
+    #     def __call__(self, *args, **kw):
+    #         if DebugView._instance is None:
+    #             obj = DebugView(*args, **kw)
+    #             DebugView._instance = obj
+    #         return DebugView._instance
+        
+    # getInstance = DebugViewSingleton()
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        ui = logging.StreamHandler(debugStream(self.write))
+        ui.setFormatter(logging.Formatter(
+                '%(levelname)s\n%(asctime)s\n%(message)s'))
+        ui.setLevel(logging.DEBUG)
+        vistrails.core.debug.DebugPrint.getInstance().logger.addHandler(ui)
+        self.setWindowTitle('VisTrails Messages')
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+
+        # top message filter buttons
+        filters = QtGui.QHBoxLayout()
+        layout.addLayout(filters)
+
+        filterLabel = QtGui.QLabel('Filter:')
+        filterLabel.setFixedWidth(40)
+        filters.addWidget(filterLabel)
+
+        self.levels = {}
+        for i, name in enumerate(('DEBUG', 'INFO', 'WARNING', 'CRITICAL')):
+            box = QtGui.QCheckBox(name, self)
+            box.setCheckable(True)
+            box.setChecked(name != 'DEBUG')
+            box.setStyleSheet(
+                    'color: %s;\n'
+                    'background-color: %s' % (
+                    CurrentTheme.DEBUG_COLORS[name].name(),
+                    CurrentTheme.DEBUG_FILTER_BACKGROUND_COLOR.name()))
+            self.connect(box, QtCore.SIGNAL('toggled(bool)'), self.refresh)
+            filters.addWidget(box)
+            self.levels[name] = box
+
+        filters.addStretch()
+
+        # message list
+        self.list = QtGui.QListWidget()
+        self.connect(self.list,
+                     QtCore.SIGNAL('currentItemChanged(QListWidgetItem *, QListWidgetItem *)'),
+                     self.showMessage)
+        layout.addWidget(self.list)
+
+        # message details field
+        self.text = QtGui.QTextEdit()
+        self.text.setReadOnly(True)
+        self.text.hide()
+        layout.addWidget(self.text)
+
+        # bottom buttons
+        buttons = QtGui.QGridLayout()
+        layout.addLayout(buttons)
+        leftbuttons = QtGui.QGridLayout()
+        buttons.addLayout(leftbuttons, 0, 0, QtCore.Qt.AlignLeft)
+        rightbuttons = QtGui.QGridLayout()
+        buttons.addLayout(rightbuttons, 0, 1, QtCore.Qt.AlignRight)
+
+        copy = QDockPushButton('Copy &Message', self)
+        copy.setToolTip('Copy selected message to clipboard')
+        copy.setFixedWidth(125)
+        rightbuttons.addWidget(copy, 0, 0)
+        self.connect(copy, QtCore.SIGNAL('clicked()'),
+                     self.copyMessage)
+
+        copyAll = QDockPushButton('Copy &All', self)
+        copyAll.setToolTip('Copy all messages to clipboard (Can be a lot)')
+        copyAll.setFixedWidth(125)
+        rightbuttons.addWidget(copyAll, 0, 1)
+        self.connect(copyAll, QtCore.SIGNAL('clicked()'),
+                     self.copyAll)
+        self.msg_box = None
+        self.itemQueue = []
+        self.resize(700, 400)
+
+    def refresh(self):
+        for i in xrange(self.list.count()):
+            item = self.list.item(i)
+            level = item.data(32).split('\n')[0]
+            self.list.setItemHidden(item, not self.levels[level].isChecked())
+
+    def copyMessage(self):
+        """ copy selected message to clipboard """
+        items = self.list.selectedItems()
+        if len(items)>0:
+            text = items[0].data(32)
+            get_vistrails_application().clipboard().setText(text)
+
+    def copyAll(self):
+        """ copy all messages to clipboard """
+        texts = []
+        for i in range(self.list.count()):
+            texts.append(self.list.item(i).data(32))
+        text = '\n'.join(texts)
+        get_vistrails_application().clipboard().setText(text)
+
+    def showMessage(self, item, olditem):
+        """ show item data in a messagebox """
+        s = item.data(32)
+        msgs = s.split('\n')
+        msgs = [cgi.escape(i) for i in msgs]
+        format = {'INFO': 'Message:',
+                  'WARNING': 'Warning message:',
+                  'CRITICAL': 'Critical message:'}
+        
+        text = '<HTML><BODY BGCOLOR="#FFFFFF">'
+        text += '<H4>%s</H4>' % format.get(msgs[0], 'Message:')
+        text += '<H4>%s<br></H4>' % msgs[3]
+        text += '<table border="0">'
+        if len(msgs)>4:
+            text += '<tr><td> </td><td align=left>%s</td></tr>' % '<br>'.join(msgs[4:])
+            text += '<tr><td> </td><td> </td></tr>'
+        text += '<tr><td align=right><b>Time:</b></td><td>%s</td></tr>' % msgs[1]
+        text += '<tr><td align=right><b>Location:</b></td><td>%s</td></tr>' % msgs[2]
+        text += '</table></BODY></HTML>'
+
+        self.text.setHtml(text)
+        self.text.show()
+
+    def watch_signal(self, obj, sig):
+        """self.watch_signal(QObject, QSignal) -> None. Connects a debugging
+        call to a signal so that every time signal is emitted, it gets
+        registered on the log.
+        """
+        self.connect(obj, sig, self.__debugSignal)
+
+    def __debugSignal(self, *args):
+        """ Receives debug signal """
+        debug(str(args))
+
+    def updateMessageBox(self, item):
+        self.currentItem = item
+        msg_box = self.msg_box
+        # update messagebox with data from item
+        s = item.data(32)
+        msgs = s.split('\n')
+        if msgs[0] == "INFO":
+            msg_box.setIcon(QtGui.QMessageBox.Information)
+            msg_box.setWindowTitle("Information")
+        elif msgs[0] == "WARNING":
+            msg_box.setIcon(QtGui.QMessageBox.Warning)
+            msg_box.setWindowTitle("Warning")
+        elif msgs[0] == "CRITICAL":
+            msg_box.setIcon(QtGui.QMessageBox.Critical)
+            msg_box.setWindowTitle("Critical error")
+        msg_box.setText(msgs[3])
+
+    def showMessageBox(self, item):
+        """ Displays the current message in a messagebox
+            if a message is already shown the same message is shown again
+            but with a "next message"-button
+        """
+        msg_box = self.msg_box
+        if not msg_box or not msg_box.isVisible():
+            # create messagebox
+            # app segfaults if the handle to the old messagebox is removed
+            self.old_msg_box = msg_box
+            msg_box = QtGui.QMessageBox(self.parent())
+            self.msg_box = msg_box
+            msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
+            msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
+            msg_box.setEscapeButton(QtGui.QMessageBox.Ok)
+            msg_box.addButton('&Show Messages', msg_box.RejectRole)
+            self.manyButton = None
+            self.connect(msg_box,
+                         QtCore.SIGNAL('buttonClicked(QAbstractButton *)'),
+                         self.messageButtonClicked)
+            self.connect(msg_box,
+                         QtCore.SIGNAL('rejected()'),
+                         self.rejectMessage)
+            self.updateMessageBox(item)
+        else:
+            self.itemQueue.append(item)
+
+        # check queue
+        if self.itemQueue:
+            # need to set nextmessage-button
+            many = len(self.itemQueue)
+            text = '&Next Message (%s more)' % many
+            if not self.manyButton:
+                # create button
+                self.manyButton=QtGui.QPushButton(text)
+                msg_box.addButton(self.manyButton, msg_box.DestructiveRole)
+            else:
+                self.manyButton.setText(text)
+        else:
+            # remove button if it exist
+            if self.manyButton:
+                msg_box.removeButton(self.manyButton)
+                self.manyButton = None
+        if not msg_box.isVisible():
+            msg_box.show()
+        msg_box.resize(msg_box.sizeHint())
+        msg_box.updateGeometry()
+        msg_box.activateWindow()
+        msg_box.raise_()
+
+    def messageButtonClicked(self, button):
+        role = self.msg_box.buttonRole(button)
+        if role == self.msg_box.RejectRole:
+            self.itemQueue = []
+            self.set_visible(True)
+            self.list.setCurrentItem(self.currentItem)
+            self.list.scrollToItem(self.currentItem)
+        elif role == self.msg_box.DestructiveRole:
+            # show next message
+            item = self.itemQueue[0]
+            del self.itemQueue[0]
+            self.showMessageBox(item)
+        else:
+            self.itemQueue = []
+        
+    def write(self, s):
+        """write(s) -> None
+        adds the string s to the message list and displays it
+        """
+        # adds the string s to the list and 
+        s = s.strip()
+        msgs = s.split('\n')
+
+        if len(msgs)<=3:
+            msgs.append('Error logging message: invalid log format')
+            s += '\n' + msgs[3]
+        if not len(msgs[3].strip()):
+            msgs[3] = "Unknown Error"
+            s = '\n'.join(msgs)
+        text = msgs[3]
+        item = QtGui.QListWidgetItem(text)
+        item.setData(32, s)
+        item.setFlags(item.flags()&~QtCore.Qt.ItemIsEditable)
+        self.list.addItem(item)
+        item.setForeground(CurrentTheme.DEBUG_COLORS[msgs[0]])
+        self.list.setItemHidden(item, not self.levels[msgs[0]].isChecked())
+        alwaysShowDebugPopup = getattr(get_vistrails_configuration(),
+                                       'alwaysShowDebugPopup',
+                                       False)
+        if msgs[0] == 'CRITICAL':
+            if self.isVisible() and not alwaysShowDebugPopup:
+                self.raise_()
+                self.activateWindow()
+                modal = get_vistrails_application().activeModalWidget()
+                if modal:
+                    # need to beat modal window
+                    self.showMessageBox(item)
+            else:
+                self.showMessageBox(item)
+
+    def closeEvent(self, e):
+        """closeEvent(e) -> None
+        Event handler called when the dialog is about to close."""
+        self.emit(QtCore.SIGNAL("messagesView(bool)"), False)
+
+    def showEvent(self, e):
+        """closeEvent(e) -> None
+        Event handler called when the dialog is about to close."""
+        self.emit(QtCore.SIGNAL("messagesView(bool)"), True)
+
+    def reject(self):
+        """ Captures Escape key and closes window correctly """
+        self.close()
+
+    def rejectMessage(self):
+        """ Captures Escape key and closes messageBox correctly """
+        self.itemQueue = []
+        self.msg_box.close()
+
+class debugStream(object):
+    def __init__(self, write):
+        self._write = write
+
+    def write(self, *args, **kwargs):
+        return self._write(*args, **kwargs)
+
+def watch_signal(obj, sig):
+    DebugView.getInstance().watch_signal(obj, sig)
+
+
+critical     = vistrails.core.debug.critical
+warning      = vistrails.core.debug.warning
+log          = vistrails.core.debug.log
+debug        = vistrails.core.debug.debug
+
+class TestDebugView(vistrails.gui.utils.TestVisTrailsGUI):
+
+    def test_messages(self):
+        debugview = DebugView.instance()
+        # test message types
+        examples = ["INFO\ntime\nplace\nShort test message\n"
+                    "Full test message\nmulti-line",
+                    "INFO\ntime\nplace\nShort test message only",
+                    "INFO\ntime\nplace\n", # empty message
+                    "INFO\ntime\nplace" # no message
+                    ]
+        examples += ["%s\ntime\nplace\nShort test message\nFull test message"\
+                     % m for m in ['INFO', 'WARNING', 'CRITICAL', 'DEBUG']]
+        for m in examples:
+            debugview.write(m)
+            item = debugview.list.item(debugview.list.count()-1)
+            debugview.showMessageBox(item)
+        # test message copying
+        debugview.copyMessage()
+        debugview.copyAll()
+        # test button toggling
+        debugview.levels['INFO'].setChecked(False)
+        debugview.levels['INFO'].setChecked(True)
+        debugview.levels['WARNING'].setChecked(False)
+        debugview.levels['WARNING'].setChecked(True)
+        debugview.levels['CRITICAL'].setChecked(False)
+        debugview.levels['CRITICAL'].setChecked(True)
diff --git a/vistrails/gui/debugger.py b/vistrails/gui/debugger.py
new file mode 100644
index 0000000..00d4a98
--- /dev/null
+++ b/vistrails/gui/debugger.py
@@ -0,0 +1,247 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtGui, QtCore
+import vistrails.core.system
+import copy
+import sys
+import time
+import os.path
+import vistrails.gui.application
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+############################################################################
+
+class QDebugger(QtGui.QWidget, QVistrailsPaletteInterface):
+    """
+    This class provides a dockable interface to the debugger tree.
+    """
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent=parent)
+        self.app = vistrails.gui.application.get_vistrails_application()
+        self.inspector = QObjectInspector()
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        layout.addWidget(self.inspector)
+        self.setLayout(layout)
+        # self.setTitleBarWidget(QtGui.QLabel("Debugger"))
+        self.setWindowTitle("Debugger")
+        self.controller = None
+        self.vistrails_interpreter = get_default_interpreter()
+        self.vistrails_interpreter.debugger = self
+
+    def set_controller(self, c):
+        """
+        set_controller(c) -> None
+        Set the current vistrails controller to be used by the debugger
+        """
+        self.controller = c
+        self.update()
+
+    def update_values(self):
+        """
+        update_vals() -> None
+        Update the debugger after an execution with any values that become
+        available on its input ports.
+        """
+        self.update(update_vals=True)
+        
+    def update(self, update_vals=False):
+        """
+        update(update_vals=False) -> None
+        Update the debugger.  If the update requires querying modules for input
+        changes, update_vals should be set to True
+        """
+        pipeline = self.controller.current_pipeline
+        if pipeline is None:
+            return
+
+        self.inspector.clear_modules()
+        for module in pipeline.module_list:
+            if module.is_breakpoint or module.is_watched:
+                self.inspector.add_module(module)
+        if update_vals:
+            (module_objects, _, _) = \
+                self.vistrails_interpreter.find_persistent_entities(pipeline)
+            for m_id in self.inspector.modules:
+                if m_id in module_objects and module_objects[m_id] is not None:
+                    self.inspector.update_values(m_id, module_objects[m_id])
+                elif module_objects[m_id] is None:
+                    edges = pipeline.graph.edges_to(m_id)
+                    self.inspector.update_inputs(m_id, module_objects, edges,
+                                                  pipeline.connections)
+
+    def closeEvent(self, e):
+        """closeEvent(e) -> None
+        Event handler called when the dialog is about to close."""
+        self.emit(QtCore.SIGNAL("debuggerHidden()"))
+                        
+###############################################################################
+#  QObjectInspector
+
+class QObjectInspector(QtGui.QTreeWidget):
+    """
+    This class provides the ability to track and inspect breakpoints added to a pipeline.
+    It is meant to be embedded in the QDebugger object to allow debugging of workflows in
+    VisTrails
+    """
+    def __init__(self, parent=None):
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.setColumnCount(2)
+        self.modules = {}
+
+    def clear_modules(self):
+        """
+        clear_modules() -> None
+        Clear the current list of module breakpoints
+        """
+        self.modules = {}
+        self.clear()
+     
+    def add_module(self, m):
+        """
+        add_module(m : core.vistrail.module.Module) -> None
+        Add the give module, m, as a breakpoint.
+        """
+        # !!! This uses the core.vistrail.module.Module item
+        item = QDebugModuleItem(self)
+        item.setText(0, "%s (%d)" % (m.name, m.id))
+        item.setText(1, "Module Type")
+        self.modules[m.id] = item
+#         self.add_dict(m, item)
+#         self.add_ports(m, item, display_vals=get_vals)
+        
+    def update_values(self, m_id, persistent_module):
+        """
+        update_values(m_id: long, 
+          persistent_module : subclass of core.modules.vistrails_module.Module)
+        """
+        module_item = self.modules[m_id]
+        module_item.takeChildren()
+        self.add_dict(persistent_module, module_item)
+        self.add_ports(persistent_module, module_item, True)
+
+    def update_inputs(self, m_id, persistent_map, edges, connections):
+        input_ports = {}
+        for upstream_id, c_id in edges:
+            if upstream_id in persistent_map and \
+                    persistent_map[upstream_id] is not None:
+                persistent_module = persistent_map[upstream_id]
+                connection = connections[c_id]
+                try:
+                    output_port = \
+                        persistent_module.get_output(connection.source.name)
+                    input_ports[connection.destination.name] = output_port
+                except ModuleError:
+                    input_ports[connection.destination.name] = None
+        if len(input_ports) > 0:
+            module_item = self.modules[m_id]
+            module_item.takeChildren()
+            inputs_item = QDebugModuleItem(module_item)
+            inputs_item.setText(0, "inputPorts")
+            inputs_item.setText(1, "")   
+            for port_name, port_val in input_ports.iteritems():
+                self.create_port_item(port_name, port_val, True, 
+                                      inputs_item)
+                
+    def add_dict(self, m, parent_item):
+        """
+        add_dict(m, parent_item) -> None
+        Add the dictionary associated with module m to be displayed 
+        as part of the debug information for that breakpoint.
+        """
+        dict_item = QDebugModuleItem(parent_item)
+        dict_item.setText(0, "__dict__")
+        dict_item.setText(1, "")
+        for k in m.__dict__.keys():
+            d_val = QDebugModuleItem(dict_item)
+            d_val.setText(0, str(k))
+            d_val.setText(1, str(m.__dict__[k]))
+
+
+    def create_port_item(self, port_name, port_value, display_vals=False,
+                         parent=None):
+        p_item = QDebugModuleItem(parent)
+        p_item.setText(0, str(port_name))
+        if display_vals:
+            p_item.setText(1, str(port_value))
+        else:
+            typestr = str(port_val.__class__)
+            typestr = typestr.split('.')
+            typestr = typestr[len(typestr)-1]
+            typestr = typestr[0:len(typestr)-2]
+            p_item.setText(1, typestr)            
+            
+    def add_ports(self, m, parent_item, display_vals=False):
+        """
+        add_ports(m, item, display_vals=False) -> None
+        Add port information from module m to the item being displayed in the debugger.
+        If display_vals is True, fetch the appropriate values from the module's input ports.
+        """
+        inputs_item = QDebugModuleItem(parent_item)
+        inputs_item.setText(0, "inputPorts")
+        inputs_item.setText(1, "")
+        for port_name in m.inputPorts:
+            try:
+                port_val = m.getInputListFromPort(port_name)
+                if len(port_val) == 1:
+                    port_val = port_val[0]
+            except ModuleError:
+                port_val = None
+            self.create_port_item(port_name, port_val, display_vals, 
+                                  inputs_item)
+        outputs_item = QDebugModuleItem(parent_item)
+        outputs_item.setText(0, "outputPorts")
+        outputs_item.setText(1, "")
+        for port_name in m.outputPorts:
+            try:
+                port_val = m.get_output(port_name)
+            except ModuleError:
+                port_val = None
+            self.create_port_item(port_name, port_val, display_vals, 
+                                  outputs_item)
+
+########################################################################
+# QDebugModuleItem
+
+class QDebugModuleItem(QtGui.QTreeWidgetItem):
+    """
+    This class provides a unique container for adding breakpoints in a workflow
+    to the debugger.
+    """
+    def __init__(self, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent)
+        
diff --git a/vistrails/gui/extras/__init__.py b/vistrails/gui/extras/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/gui/extras/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/gui/extras/core/__init__.py b/vistrails/gui/extras/core/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/gui/extras/core/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/gui/extras/core/db/__init__.py b/vistrails/gui/extras/core/db/__init__.py
new file mode 100644
index 0000000..acfc9d2
--- /dev/null
+++ b/vistrails/gui/extras/core/db/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
\ No newline at end of file
diff --git a/vistrails/gui/extras/core/db/locator.py b/vistrails/gui/extras/core/db/locator.py
new file mode 100644
index 0000000..8413fd7
--- /dev/null
+++ b/vistrails/gui/extras/core/db/locator.py
@@ -0,0 +1,221 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.configuration import get_vistrails_persistent_configuration, \
+    get_vistrails_configuration
+from vistrails.gui.open_db_window import QOpenDBWindow, QConnectionDBSetupWindow
+from vistrails.core.db.locator import DBLocator, FileLocator
+from vistrails.db import VistrailsDBException
+from vistrails.core import debug
+import vistrails.db.services.io
+from PyQt4 import QtGui, QtCore
+import vistrails.core.system
+import os
+
+##############################################################################
+# DB dialogs
+
+def get_load_db_locator_from_gui(parent, obj_type):
+    config, obj_id, obj_name = QOpenDBWindow.getOpenDBObject(obj_type)
+    if config == {} or obj_id == -1:
+        return None
+    return DBLocator(config['host'],
+                     config['port'],
+                     config['db'],
+                     config['user'],
+                     config['passwd'],
+                     obj_name,
+                     obj_id=obj_id,
+                     obj_type=obj_type,
+                     connection_id=config.get('id', None))
+
+def get_save_db_locator_from_gui(parent, obj_type, locator=None):
+    config, name = QOpenDBWindow.getSaveDBObject(obj_type)
+    if config == {} or name == '':
+        return None
+    return DBLocator(config['host'],
+                     config['port'],
+                     config['db'],
+                     config['user'],
+                     config['passwd'],
+                     name,
+                     obj_id=None,
+                     obj_type=obj_type,
+                     connection_id=config.get('id', None))
+
+##############################################################################
+
+def get_db_connection_from_gui(parent, id, name, host, port, user, passwd,
+                               database):
+    def show_dialog(parent, id, name, host, port, user,
+                    passwd, databaseb, create):
+        dialog = QConnectionDBSetupWindow(parent, id, name, host, port, user,
+                                          passwd, database, create)
+        config = None
+        if dialog.exec_() == QtGui.QDialog.Accepted:
+            config = {'host': str(dialog.hostEdt.text()),
+                      'port': int(dialog.portEdt.value()),
+                      'user': unicode(dialog.userEdt.text()),
+                      'passwd': unicode(dialog.passwdEdt.text()),
+                      'db': str(dialog.databaseEdt.text())
+                      }
+            try:
+                vistrails.db.services.io.test_db_connection(config)
+                config['succeeded'] = True
+                config['name'] = str(dialog.nameEdt.text())
+                config['id'] = dialog.id
+            except VistrailsDBException, e:
+                debug.critical('VisTrails DB Exception',  str(e))
+                config['succeeded'] = False
+        return config
+    #check if the information is already there
+    dbwindow = QOpenDBWindow.getInstance()
+        
+    config = dbwindow.connectionList.findConnectionInfo(host,port,database)
+
+    if config:
+        testconfig = dict(config)
+        del testconfig['id']
+        del testconfig['name']
+        try:
+            vistrails.db.services.io.test_db_connection(testconfig)
+            config['succeeded'] = True
+        except VistrailsDBException, e:
+            config = show_dialog(parent, config['id'],
+                                 config['name'], host, port, config['user'],
+                                 passwd, database, create = False)
+            
+    elif config is None:
+        config = show_dialog(parent, -1,"",
+                             host, port, user, passwd,
+                             database, create = True)
+        if config['succeeded'] == True:
+            #add to connection list
+            dbwindow.connectionList.setConnectionInfo(**config)
+    return config
+
+##############################################################################
+# File dialogs
+
+suffix_map = {'vistrail': ['.vt', '.xml', '.vtl'],
+              'workflow': ['.xml'],
+              'log': ['.xml'],
+              'registry': ['.xml'],
+              'opm_graph': ['.xml'],
+              'prov_document': ['.xml']
+              }
+
+def get_load_file_locator_from_gui(parent, obj_type):
+    suffixes = "*" + " *".join(suffix_map[obj_type])
+    fileName = QtGui.QFileDialog.getOpenFileName(
+        parent,
+        "Open %s..." % obj_type.capitalize(),
+        vistrails.core.system.vistrails_file_directory(),
+        "VisTrails files (%s)\nOther files (*)" % suffixes)
+    if not fileName:
+        return None
+    filename = os.path.abspath(str(QtCore.QFile.encodeName(fileName)))
+    dirName = os.path.dirname(filename)
+    setattr(get_vistrails_persistent_configuration(), 'fileDirectory', dirName)
+    setattr(get_vistrails_configuration(), 'fileDirectory', dirName)
+    vistrails.core.system.set_vistrails_file_directory(dirName)
+    return FileLocator(filename)
+
+def get_save_file_locator_from_gui(parent, obj_type, locator=None):
+    # Ignore current locator for now
+    # In the future, use locator to guide GUI for better starting directory
+
+    suffixes = "*" + " *".join(suffix_map[obj_type])
+    fileName = QtGui.QFileDialog.getSaveFileName(
+        parent,
+        "Save Vistrail...",
+        vistrails.core.system.vistrails_file_directory(),
+        filter="VisTrails files (%s)" % suffixes, # filetypes.strip()
+        options=QtGui.QFileDialog.DontConfirmOverwrite)
+    if not fileName:
+        return None
+    f = str(QtCore.QFile.encodeName(fileName))
+
+    # check for proper suffix
+    found_suffix = False
+    for suffix in suffix_map[obj_type]:
+        if f.endswith(suffix):
+            found_suffix = True
+            break
+    if not found_suffix:
+        if obj_type == 'vistrail':
+            f += get_vistrails_configuration().defaultFileType
+        else:
+            f += suffix_map[obj_type][0]
+
+    if os.path.isfile(f):
+        msg = QtGui.QMessageBox(QtGui.QMessageBox.Question,
+                                "VisTrails",
+                                "File exists. Overwrite?",
+                                (QtGui.QMessageBox.Yes |
+                                 QtGui.QMessageBox.No),
+                                parent)
+        if msg.exec_() == QtGui.QMessageBox.No:
+            return None
+    dirName = os.path.dirname(f)
+    setattr(get_vistrails_persistent_configuration(), 'fileDirectory', dirName)
+    setattr(get_vistrails_configuration(), 'fileDirectory', dirName)
+    vistrails.core.system.set_vistrails_file_directory(dirName)
+    return FileLocator(f)
+   
+def get_autosave_prompt(parent):
+    """ get_autosave_prompt(parent: QWidget) -> bool
+    
+    """
+    result = QtGui.QMessageBox.question(parent, 
+                                        "AutoSave",
+                                        "Autosave data has been found.\nDo you want to open autosave data?",
+                                        QtGui.QMessageBox.Open,
+                                        QtGui.QMessageBox.Ignore)
+    return result == QtGui.QMessageBox.Open
+
+def ask_to_overwrite_file(parent=None, obj_type='vistrail'):
+    overwrite = True
+    fname = None
+    msg = QtGui.QMessageBox(QtGui.QMessageBox.Question,
+                            "VisTrails",
+                            "File exists and contains changes. Overwrite?",
+                            (QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
+                            parent)
+    if msg.exec_() == QtGui.QMessageBox.No:
+        overwrite = False
+        locator = get_save_file_locator_from_gui(parent, obj_type)
+        if locator:
+            fname = locator._name
+    return (overwrite, fname)
diff --git a/vistrails/gui/graphics_view.py b/vistrails/gui/graphics_view.py
new file mode 100644
index 0000000..5ea2abc
--- /dev/null
+++ b/vistrails/gui/graphics_view.py
@@ -0,0 +1,850 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This containing a subclassed QGraphicsView that allows
+zoom/pan/select inside the graphics view and supports PIP as well
+
+QInteractiveGraphicsScene
+QInteractiveGraphicsView
+QPIPGraphicsView
+"""
+from vistrails.core import debug
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.theme import CurrentTheme
+from vistrails.core.configuration import get_vistrails_configuration
+import vistrails.core.system
+import math
+from vistrails.gui.qt import qt_super
+################################################################################
+
+class QGraphicsItemInterface(object):
+    """
+    QGraphicsItem will override the default QGraphicsItem mouseRelease
+    event to let it fires only 1 ItemSelectionChanged event. This is
+    due to the clearSelection() in
+    qgraphicsitem.cpp::QGrahpicsItem::mouseReleaseEvent
+    
+    """
+    pass
+
+class QGraphicsRubberBandItem(QtGui.QGraphicsRectItem):
+    """
+    QGraphicsRubberBandItem try to replace QRubberBand to have a
+    unified look and feel on all platform. In the end, it mimics the
+    Windows look. It is just a rectangle with a 50% transparency
+    
+    """
+    def paint(self, painter, option, widget=None):
+        """ paint(painter: QPainter, option: QStyleOptionGraphicsItem,
+                  widget: QWidget) -> None
+        Peform actual painting of the rubber band
+        
+        """
+        painter.setOpacity(0.5)
+        painter.fillRect(self.rect(),
+                         CurrentTheme.SELECTION_BOX_BRUSH)
+        painter.setOpacity(1.0)
+        painter.setPen(CurrentTheme.SELECTION_BOX_PEN)
+        painter.drawRect(self.rect())
+
+class QInteractiveGraphicsScene(QtGui.QGraphicsScene):
+    """
+    QInteractiveGraphicsScene expands QGraphicsScene to allow panning
+    freely over the view are
+    
+    """
+    def __init__(self, parent=None):
+        """ QInteractiveGraphicsScene(parent: QWidget)
+                                      -> QInteractiveGraphicsScene
+        Initialize the actual scene bounding rect
+        """
+        QtGui.QGraphicsScene.__init__(self, parent)
+        self.sceneBoundingRect = QtCore.QRectF()
+        self.multiSelecting = False
+        
+    def updateSceneBoundingRect(self, keep_square=True):
+        """ updateSceneBoundingRect() -> None        
+        Compute the actual bounding rect of all shapes, then update
+        the scene rect to be much wider for panning
+        
+        """
+        self.sceneBoundingRect = QtCore.QRectF()
+        for item in self.items():
+            rect = item.sceneBoundingRect()
+            self.sceneBoundingRect = self.sceneBoundingRect.united(rect)
+
+        # Keep a minimum size
+        minWDiff = 0
+        minHDiff = 0
+        min = CurrentTheme.BOUNDING_RECT_MINIMUM
+        if self.sceneBoundingRect.width() < min:
+            minWDiff = min-self.sceneBoundingRect.width()
+        if self.sceneBoundingRect.height() < min:
+            minHDiff = min-self.sceneBoundingRect.height()
+        self.sceneBoundingRect.adjust(-minWDiff/2, -minHDiff/2, 
+                                       minWDiff/2, minHDiff/2)
+
+        if keep_square:
+            diff = abs(self.sceneBoundingRect.width()-
+                       self.sceneBoundingRect.height())
+            if self.sceneBoundingRect.width()<self.sceneBoundingRect.height():
+                self.sceneBoundingRect.adjust(-diff/2, 0, diff/2, 0)
+            else:
+                self.sceneBoundingRect.adjust(0, -diff/2, 0, diff/2)
+        panRect = self.sceneBoundingRect.adjusted(
+            -self.sceneBoundingRect.width()*100,
+            -self.sceneBoundingRect.height()*100,
+            self.sceneBoundingRect.width()*100,
+            self.sceneBoundingRect.height()*100)
+        if panRect.width()<1e-6 and panRect.height()<1e-6:
+            panRect = QtCore.QRectF(-1000,-1000,2000,2000)
+        self.setSceneRect(panRect)
+
+        # Reset cache
+        for view in self.views():
+            view.resetCachedContent()
+
+
+    def fitToView(self, view, recompute_bounding_rect=False):
+        """ fitToView(view: QGraphicsView,
+                      recompute_bounding_rect=False) -> None
+        Adjust view to fit and center the whole scene. If recompute_bounding_rect is
+        False, does not recompute bounds, and instead uses previous one.
+        
+        """
+        if recompute_bounding_rect:
+            self.updateSceneBoundingRect()
+        view.centerOn(self.sceneBoundingRect.center())
+        view.fitInView(self.sceneBoundingRect, QtCore.Qt.KeepAspectRatio)
+            
+    def fitToAllViews(self, recompute_bounding_rect=False):
+        """ fitToAllViews(recompute_bounding_rect=False) -> None
+        Adjust all views using this scene to fit and center the whole scene
+
+        if recompute_bounding_rect is False, uses previous bounding rect.
+        
+        """
+        if recompute_bounding_rect:
+            self.updateSceneBoundingRect()
+        for view in self.views():
+            self.fitToView(view, False)
+
+    def clearItems(self):
+        """ clearShapes() -> None
+        Remove and delete all items belonging to this scene
+        
+        """
+        self.removeItems(self.items())
+
+    def removeItems(self, itemList):
+        """ removeItems(itemList: sequence of [QGraphicsItem]) -> None
+        Remove all items in itemList
+        
+        """
+        for item in itemList:
+            if item.scene():
+                self.removeItem(item)
+
+    def saveToPDF(self, filename):
+        self.updateSceneBoundingRect(False)
+        printer = QtGui.QPrinter()
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        b_rect = self.sceneBoundingRect
+        debug.debug("%sx%s" % (b_rect.width(), b_rect.height()))
+        printer.setPaperSize(QtCore.QSizeF(b_rect.width(), b_rect.height()),
+                             QtGui.QPrinter.Point)
+        painter = QtGui.QPainter(printer)
+        brush = self.backgroundBrush()
+        self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(255,255,255)))
+        self.render(painter, QtCore.QRectF(), b_rect)
+        painter.end()
+        self.setBackgroundBrush(brush)
+    
+    def saveToPNG(self, filename, width=None):
+        try:
+            self.updateSceneBoundingRect(False)
+            b_rect = QtCore.QRectF(self.sceneBoundingRect)
+            b_rect.setWidth(math.floor(b_rect.width()))
+            b_rect.setHeight(math.floor(b_rect.height()))
+            debug.debug("PNG bounding box %sx%s" % (b_rect.width(), b_rect.height()))
+            pixmap = QtGui.QPixmap(QtCore.QSize(int(math.floor(b_rect.width())),
+                                                int(math.floor(b_rect.height()))))
+            debug.debug("PNG pixmap size: %s"%str(pixmap.size()))
+            painter = QtGui.QPainter(pixmap)
+            painter.setRenderHint(QtGui.QPainter.Antialiasing)
+            brush = self.backgroundBrush()
+            self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(255,255,255)))
+            self.render(painter, QtCore.QRectF(), b_rect)
+            painter.end()
+            if width is not None:
+                pixmap = pixmap.scaledToWidth(width, QtCore.Qt.SmoothTransformation)
+            pixmap.save(filename)
+            self.setBackgroundBrush(brush)
+        except Exception, e:
+            debug.critical("Exception: %s"%str(e))
+
+class QInteractiveGraphicsView(QtGui.QGraphicsView):
+    """
+    QInteractiveGraphicsView is QGraphicsView with abilities to
+    zoom/span with right/mid click
+    
+    """
+    def __init__(self, parent=None):
+        """ QInteractiveGraphicsView(parent: QWidget)
+                                     -> QInteractiveGraphicsView
+        Initialize the graphics view with interactive options
+        
+        """
+        QtGui.QGraphicsView.__init__(self, parent)
+        self.setInteractive(True)
+#        self.setCacheMode(QtGui.QGraphicsView.CacheBackground)
+        self.setResizeAnchor(QtGui.QGraphicsView.AnchorViewCenter)
+        self.setRenderHints (QtGui.QPainter.Antialiasing |
+                             QtGui.QPainter.TextAntialiasing |
+                             QtGui.QPainter.SmoothPixmapTransform)
+        self.scaleMax = 2000
+        self.scaleRatio = self.scaleMax/10
+        self.currentScale = self.scaleMax/2
+        self.startScroll = (0,0)
+        self.lastPos = QtCore.QPoint(0,0)
+        self.pipScene = None
+        self.pipFrame = None
+        self.resetButton = None
+        self.selectionBox = QGraphicsRubberBandItem(None)
+        self.startSelectingPos = None
+        self.setProperty('captureModifiers', 1)
+        self.defaultCursorState = 0
+        self.setCursorState(self.defaultCursorState)
+        self.canSelectBackground = True
+        self.canSelectRectangle = True
+        
+        if QtCore.QT_VERSION >= 0x40600:
+            self.viewport().grabGesture(QtCore.Qt.PinchGesture)
+        self.gestureStartScale = None
+
+        conf = get_vistrails_configuration()
+        conf.subscribe('showScrollbars', self.setScrollbarPolicy)
+        self.setScrollbarPolicy('showScrollbars', conf.showScrollbars)
+
+    def setScrollbarPolicy(self, field, value):
+        if value:
+            self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
+            self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
+        else:
+            self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+            self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+
+    def viewportEvent(self, event):
+        if QtCore.QT_VERSION >= 0x40600 and event.type() == QtCore.QEvent.Gesture:
+            pinch = event.gesture(QtCore.Qt.PinchGesture)
+            if pinch:
+                changeFlags = pinch.changeFlags()
+                if changeFlags & QtGui.QPinchGesture.ScaleFactorChanged:
+                    if self.gestureStartScale is None:
+                        self.gestureStartScale = self.currentScale
+                    newScale = self.gestureStartScale * \
+                        pinch.property("scaleFactor").toReal()[0]
+                    # Clamp the scale
+                    if newScale<0: newScale = 0
+                    if newScale>self.scaleMax: newScale = self.scaleMax
+                    self.currentScale = newScale
+                    self.updateMatrix()
+                if pinch.state() == QtCore.Qt.GestureFinished:
+                    self.gestureStartScale = None
+                return True
+        return QtGui.QGraphicsView.viewportEvent(self, event)
+
+    def modifiersPressed(self, modifiers):
+        """ modifiersPressed(modifiers: QtCore.Qt.KeyboardModifiers) -> None
+        Notification when one of the modifier keys has been pressed
+        
+        """
+        self.validateCursorState(modifiers)
+        
+    def modifiersReleased(self):
+        """ modifiersReleased() -> None
+        Notification when one of the modifier keys has been released
+        
+        """
+        self.validateCursorState()
+
+    def findCursorState(self, modifiers=None):
+        """ findCursorState(modifiers: QtCore.Qt.KeyboardModifiers) -> None
+        Check the keyboard modifiers and return the cursor state
+
+        """
+        if not self.isActiveWindow():
+            return self.defaultCursorState
+        if modifiers==None:
+            modifiers = QtGui.QApplication.keyboardModifiers()
+        shift = modifiers & QtCore.Qt.ShiftModifier
+        alt = modifiers & QtCore.Qt.AltModifier
+        meta = modifiers & QtCore.Qt.MetaModifier or (alt and shift)
+        ctrl = modifiers & QtCore.Qt.ControlModifier
+        if shift and (not alt) and (not ctrl) and (not meta):
+            return 1
+        elif meta and (not ctrl):
+            return 2
+        else:
+            return self.defaultCursorState
+
+    def validateCursorState(self, modifiers=None):
+        """ validateCursorState(modifiers: QtCore.Qt.KeyboardModifiers) -> None
+        Check the keyboard modifiers to change the cursor shape correspondingly
+        
+        """        
+        self.setCursorState(self.findCursorState(modifiers))
+
+    def enterEvent(self, event):
+        """ enterEvent(event: QEnterEvent) -> None        
+        Check the modifiers state when the mouse enter the
+        canvas. Then update the mouse functionality appropriately
+        
+        """
+        self.validateCursorState()
+        return QtGui.QGraphicsView.enterEvent(self, event)
+        # super(QInteractiveGraphicsView, self).enterEvent(event)
+
+    def setCursorState(self, state):
+        """ setCursorState(state: int) -> None        
+        Update the cursor shape
+
+        Keyword arguments:
+        state - 0: selecting (default)
+                1: pan
+                2: zoom
+                3: panning
+        
+        """
+        if state==0:
+            self.viewport().setCursor(CurrentTheme.SELECT_CURSOR)
+        elif state==1:
+            self.viewport().setCursor(CurrentTheme.OPEN_HAND_CURSOR)
+        elif state==2:
+            self.viewport().setCursor(CurrentTheme.ZOOM_CURSOR)
+        elif state==3:
+            self.viewport().setCursor(CurrentTheme.CLOSE_HAND_CURSOR)
+        
+    def setDefaultCursorState(self, state):
+        """ setDefaultCursorState(state: int) -> None
+        Set the default cursor state when no modifier key is pressed
+        
+        """
+        self.defaultCursorState = state
+        self.validateCursorState()
+
+    def translateButton(self, event):
+        """ translateButton(event: QInputEvent) -> None
+        Translate mouse button and modifiers into a virtual mouse button
+        
+        """
+        if event.buttons() & QtCore.Qt.LeftButton:
+            state = self.findCursorState(event.modifiers())
+            state2Button = {0: QtCore.Qt.LeftButton,
+                            1: QtCore.Qt.MidButton,
+                            2: QtCore.Qt.RightButton}
+            if state2Button.has_key(state):
+                return state2Button[state]
+        return event.buttons()
+
+    def mousePressEvent(self, e):
+        """ mousePressEvent(e: QMouseEvent) -> None        
+        Handle mouse click event, use Qt rubber band for left-click
+        selection and prepare for zoom/pan on right/mid click
+        
+        """
+        scenePos = self.mapToScene(e.pos())
+        item = self.scene().itemAt(scenePos)
+        buttons = self.translateButton(e)
+        if buttons == QtCore.Qt.LeftButton:
+            if item is None:
+                if self.scene():
+                    self.scene().multiSelecting = True
+                    self.scene().addItem(self.selectionBox)
+                    self.selectionBox.setZValue(1000)
+                    
+                    self.startSelectingPos = self.mapToScene(e.pos())
+                    rect = QtCore.QRectF(self.startSelectingPos,
+                                         QtCore.QSizeF(0,0))
+                    self.selectionBox.setRect(rect)
+                    self.selectionBox.setVisible(self.canSelectRectangle)
+            else:
+                QtGui.QGraphicsView.mousePressEvent(self, e)
+                # super(QInteractiveGraphicsView, self).mousePressEvent(e)
+        else:
+            if buttons & QtCore.Qt.RightButton:
+                if item is None:
+                    self.setCursorState(2)
+                    self.computeScale()
+                else:
+                    QtGui.QGraphicsView.mousePressEvent(self, e)
+            elif buttons & QtCore.Qt.MidButton:
+                self.setCursorState(3)
+                self.startScroll = (self.horizontalScrollBar().value(),
+                                    self.verticalScrollBar().value())
+            self.lastPos = QtCore.QPoint(QtGui.QCursor.pos())
+            self.setDragMode(QtGui.QGraphicsView.NoDrag)
+
+    def mouseMoveEvent(self, e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None        
+        Handle right click (zoom) and mid click (pan). This function
+        uses QCursor globalPos instead of e.globalX() and e.globalY()
+        because of their flaky values during transformation
+        
+        """
+        self.setUpdatesEnabled(False)
+        buttons = self.translateButton(e)
+        if buttons == QtCore.Qt.LeftButton:
+            if self.startSelectingPos:
+                dis = self.mapToScene(e.pos())-self.startSelectingPos
+                rect = QtCore.QRectF(self.startSelectingPos,
+                                 QtCore.QSizeF(dis.x(), dis.y()))
+                self.selectionBox.prepareGeometryChange()
+                self.selectionBox.setRect(rect)
+                self.selectModules()
+            else:
+                QtGui.QGraphicsView.mouseMoveEvent(self, e)
+                # super(QInteractiveGraphicsView, self).mousePressEvent(e)
+        elif self.lastPos:
+            if buttons == QtCore.Qt.RightButton:
+                globalPos = QtGui.QCursor.pos()
+            
+                # Set up new scale based on pixels moved
+                newScale = self.currentScale + globalPos.y() - self.lastPos.y()
+
+                # Clamp the scale
+                if newScale<0: newScale = 0
+                if newScale>self.scaleMax: newScale = self.scaleMax
+
+                # Update the scale and transformation matrix
+                self.currentScale = newScale
+                self.updateMatrix()
+
+                # Need to update last position
+                self.lastPos = QtCore.QPoint(globalPos)
+                
+            elif buttons == QtCore.Qt.MidButton:
+                globalPos = QtGui.QCursor.pos()
+                
+                # Just need to pan the scroll bar
+                self.horizontalScrollBar().setValue(self.startScroll[0] -
+                                                    globalPos.x() +
+                                                    self.lastPos.x())
+                self.verticalScrollBar().setValue(self.startScroll[1] -
+                                                  globalPos.y() +
+                                                  self.lastPos.y())
+        else:
+            self.validateCursorState(e.modifiers())
+            QtGui.QGraphicsView.mouseMoveEvent(self, e)
+        self.setUpdatesEnabled(True)
+
+    def mouseReleaseEvent(self, e):
+        """ mouseReleaseEvent(self, e: QMouseEvent) -> None
+        Mark box selecting as off
+        """
+        if self.startSelectingPos:
+            self.selectModules()
+            self.startSelectingPos = None
+            self.selectionBox.setVisible(False)
+            self.scene().removeItem(self.selectionBox)
+            self.scene().multiSelecting = False
+        self.lastPos = None
+        self.validateCursorState(e.modifiers())
+        self.setUpdatesEnabled(True)
+        QtGui.QGraphicsView.mouseReleaseEvent(self, e)
+        # super(QInteractiveGraphicsView, self).mouseReleaseEvent(e)
+
+    def mouseDoubleClickEvent(self, e):
+        """ mouseDoubleClickEvent(self, e: QMouseEvent) -> None
+        Try to avoid unselect if double-click on the background        
+        """
+        if not self.canSelectBackground:
+            return
+        else:
+            qt_super(QInteractiveGraphicsView, self).mouseDoubleClickEvent(e)
+
+    def selectModules(self):
+        """ selectModules() -> None
+        Select all modules inside the self.selectionBox
+        
+        """
+        if self.canSelectRectangle:
+            br = self.selectionBox.sceneBoundingRect()
+        else:
+            br = QtCore.QRectF(self.startSelectingPos,
+                              self.startSelectingPos)
+        if not self.canSelectBackground:
+            items = self.scene().items(br) 
+            if len(items)==0 or items==[self.selectionBox]:
+                return
+        path = QtGui.QPainterPath()
+        path.addRect(br)
+        self.scene().setSelectionArea(path)
+        
+    def updateMatrix(self):
+        """ updateMatrix() -> None
+        Update the view matrix with the current scale
+        
+        """        
+        matrix = QtGui.QMatrix()
+        power = float(self.currentScale-self.scaleMax/2)/self.scaleRatio
+        scale = pow(2.0, power)
+        matrix.scale(scale, scale)
+        self.setMatrix(matrix)
+
+    def computeScale(self):
+        """ computeScale() -> None
+        Compute the current scale based on the view matrix
+        
+        """
+        self.currentScale = (math.log(self.matrix().m11(), 2.0)*
+                             self.scaleRatio + self.scaleMax/2)
+
+    def setPIPScene(self, scene):
+        """ setPIPScene(scene: QGraphicsScene) -> None        
+        Set the Picture-In-Picture scene fo the current GraphicsView
+        to 'scene'
+        
+        """
+        self.pipScene = scene
+
+    def setPIPEnabled(self, enabled=True):
+        """ setPIPEnabled(enabled: boolean) -> None        
+        Enable/Disable PIP view
+        
+        """
+        if self.pipScene:
+            if enabled:
+                if self.pipFrame==None:
+                    self.pipFrame = QPIPGraphicsView(self)
+                    self.pipFrame.graphicsView.setScene(self.pipScene)
+                    self.pipFrame.move(self.width(), 0)
+                self.pipFrame.show()
+                self.pipFrame.updateGeometry()
+            elif self.pipFrame!=None:
+                self.pipFrame.hide()
+
+    def setQueryEnabled(self, enabled=True):
+        """ setQueryEnabled(enabled: bool) -> None
+        Enable/Disable the query reset button
+
+        """
+        if enabled:
+            if not self.resetButton:
+                self.resetButton = QResetQueryButton(self)
+                self.connect(self.resetButton,
+                             QtCore.SIGNAL('resetQuery()'),
+                             self.resetQuery)
+            self.resetButton.show()
+            self.resetButton.updateGeometry()
+        else:
+            if self.resetButton:
+                self.resetButton.hide()
+            self.scene().update()
+
+    def resetQuery(self):
+        """ resetQuery() -> None
+        pass the signal along
+        
+        """
+        self.emit(QtCore.SIGNAL('resetQuery()'))
+
+    def resizeEvent(self, event):
+        """ resizeEvent(event: QResizeEvent) -> None
+        Make sure the pip frame is inside the graphics view
+        """
+        if self.pipFrame:
+            self.pipFrame.updateGeometry()
+        if self.resetButton:
+            self.resetButton.updateGeometry()
+        return QtGui.QGraphicsView.resizeEvent(self, event)
+        # super(QInteractiveGraphicsView, self).resizeEvent(event)
+
+    def zoomToFit(self):
+        self.scene().fitToView(self, True)
+
+    def zoomIn(self):
+        self.setUpdatesEnabled(False)
+        newScale = self.currentScale + 100.0
+
+        # Clamp the scale
+        if newScale<0: newScale = 0
+        if newScale>self.scaleMax: newScale = self.scaleMax
+        
+        # Update the scale and transformation matrix
+        self.currentScale = newScale
+        self.updateMatrix()
+        self.setUpdatesEnabled(True)
+
+    def zoomOut(self):
+        self.setUpdatesEnabled(False)
+        newScale = self.currentScale - 100.0
+
+        # Clamp the scale
+        if newScale<0: newScale = 0
+        if newScale>self.scaleMax: newScale = self.scaleMax
+        
+        # Update the scale and transformation matrix
+        self.currentScale = newScale
+        self.updateMatrix()
+        self.setUpdatesEnabled(True)
+
+    def sizeHint(self):
+        """ sizeHint(self) -> QSize
+        Return recommended size of the widget
+        
+        """
+        return QtCore.QSize(512, 512)
+
+    def save_pdf(self, filename=None):
+        if filename is None:
+            fileName = QtGui.QFileDialog.getSaveFileName(self.window(),
+                "Save PDF...",
+                vistrails.core.system.vistrails_file_directory(),
+                "PDF files (*.pdf)")
+
+            if not fileName:
+                return None
+            f = str(fileName)
+        else:
+            f = str(filename)
+            
+        self.scene().saveToPDF(f)
+
+    # Workaround for border aliasing on OSX
+    # However, it breaks things on Linux, because it
+    # makes zooming _extremely_ slow, so we check it
+    # before we run.
+    if vistrails.core.system.systemType == 'Darwin':
+        def setScene(self, scene):
+            """ setScene(scene: QGraphicsScene) -> None
+            Make sure the viewport background brush the same as the scene
+            one. This is only neccessary on the Mac to work around Qt/Mac
+            bug. We can remove this if any future release of Qt fixes
+            this.
+
+            """
+            QtGui.QGraphicsView.setScene(self, scene)
+            if self.scene():
+                palette = QtGui.QPalette(self.viewport().palette())
+                palette.setBrush(QtGui.QPalette.Base, 
+                                 self.scene().backgroundBrush())
+                self.viewport().setPalette(palette)
+
+class QPIPGraphicsView(QtGui.QWidget):
+    """
+    QPIPGraphicsView is a tool window contain a
+    QInteractiveGraphicsView for PIP display
+
+    """
+    def __init__(self, parent=None):
+        """ QPIPGraphicsView(parent: QWidget) -> QPIPGraphicsView
+        Initialize a layout with some margin and a central widget
+        """
+        QtGui.QWidget.__init__(self, parent, QtCore.Qt.FramelessWindowHint)
+        self.setMouseTracking(True)
+        self.setAutoFillBackground(True)
+        self.palette().setColor(QtGui.QPalette.Base,
+                                CurrentTheme.PIP_FRAME_COLOR)
+        self.setLayout(QtGui.QHBoxLayout(self))
+        self.layout().setMargin(CurrentTheme.PIP_OUT_FRAME_WIDTH)
+        self.graphicsView = QInteractiveGraphicsView()
+        self.layout().addWidget(self.graphicsView)
+        self.firstShow = True
+        self.anchorCorner = [QtCore.Qt.AlignRight, QtCore.Qt.AlignTop]
+
+    def sizeHint(self):
+        """ sizeHint(self) -> QSize
+        Return recommended size of the widget
+        
+        """        
+        return QtCore.QSize(*CurrentTheme.PIP_DEFAULT_SIZE)
+        
+    def mousePressEvent(self, e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Capture mouse press event on the frame to move the widget
+        
+        """
+        if e.buttons() & QtCore.Qt.LeftButton:
+            self.resizing = False
+            self.lastPos = QtCore.QPoint(e.globalX(), e.globalY())
+            gvRect = self.graphicsView.geometry()
+            if ((e.x()<gvRect.left() or e.x()>gvRect.right()) and
+                (e.y()<gvRect.top() or e.y()>gvRect.bottom())):
+                self.direction = [1,1]
+                if e.x()<gvRect.left():
+                    self.direction[0] = -1
+                if e.y()<gvRect.top():
+                    self.direction[1] = -1
+                self.resizing = True
+
+    def mouseMoveEvent(self, e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Move widget as the mouse moving
+        
+        """
+        if e.buttons() & QtCore.Qt.LeftButton:
+            (dx, dy) = (e.globalX()-self.lastPos.x(),
+                        e.globalY()-self.lastPos.y())
+            parentGeometry = self.parent().geometry()
+            newGeometry = QtCore.QRect(self.geometry())
+            if self.resizing:
+                if self.direction[0]==1:
+                    if newGeometry.right()+dx>parentGeometry.width()-1:
+                        dx = parentGeometry.width()-1-newGeometry.right()
+                    newGeometry.adjust(0, 0, dx, 0)
+                else:
+                    if newGeometry.left()+dx<0:
+                        dx = -newGeometry.left()
+                    newGeometry.adjust(dx, 0, 0, 0)
+                    
+                if self.direction[1]==1:
+                    if newGeometry.bottom()+dy>parentGeometry.height()-1:
+                        dy = parentGeometry.height()-1-newGeometry.bottom()
+                    newGeometry.adjust(0, 0, 0, dy)
+                else:
+                    if newGeometry.top()+dy<0:
+                        dy = -newGeometry.top()
+                    newGeometry.adjust(0, dy, 0, 0)
+            else:
+                newGeometry.translate(dx, dy)
+            if (newGeometry.left()>0 and
+                newGeometry.right()<parentGeometry.width()-1):
+                self.anchorCorner[0] = None
+            if (newGeometry.top()>0 and
+                newGeometry.bottom()<parentGeometry.height()-1):
+                self.anchorCorner[1] = None
+            self.updateGeometry(newGeometry)
+            self.lastPos = QtCore.QPoint(e.globalX(), e.globalY())
+
+    def updateGeometry(self, newGeometry=None):
+        """ updateGeometry() -> None
+        Make sure the widget is inside the parent graphics view
+        
+        """
+        parentGeometry = self.parent().geometry()
+        if newGeometry==None:
+            newGeometry = QtCore.QRect(self.geometry())
+            
+        if self.anchorCorner[0]==None:
+            if newGeometry.left()<0:
+                newGeometry.moveLeft(0)
+            if newGeometry.right()>=parentGeometry.width():
+                newGeometry.moveRight(parentGeometry.width()-1)
+            if newGeometry.left()==0:
+                self.anchorCorner[0] = QtCore.Qt.AlignLeft
+            if newGeometry.right()==parentGeometry.width()-1:
+                self.anchorCorner[0] = QtCore.Qt.AlignRight
+        else:
+            if self.anchorCorner[0]==QtCore.Qt.AlignLeft:
+                newGeometry.moveLeft(0)
+            if self.anchorCorner[0]==QtCore.Qt.AlignRight:
+                newGeometry.moveRight(parentGeometry.width()-1)
+                
+        if self.anchorCorner[1]==None:
+            if newGeometry.top()<0:
+                newGeometry.moveTop(0)
+            if newGeometry.bottom()>=parentGeometry.height():
+                newGeometry.moveBottom(parentGeometry.height()-1)
+            if newGeometry.top()==0:
+                self.anchorCorner[1] = QtCore.Qt.AlignTop
+            if newGeometry.bottom()==parentGeometry.height()-1:
+                self.anchorCorner[1] = QtCore.Qt.AlignBottom
+        else:
+            if self.anchorCorner[1]==QtCore.Qt.AlignTop:
+                newGeometry.moveTop(0)
+            if self.anchorCorner[1]==QtCore.Qt.AlignBottom:
+                newGeometry.moveBottom(parentGeometry.height()-1)
+                
+        self.setGeometry(newGeometry)
+
+    def showEvent(self, event):
+        """ showEvent(event: QShowEvent) -> None
+        Fit the scene to view for the show event only
+        
+        """
+        if self.firstShow:
+            self.firstShow = False
+            self.graphicsView.scene().fitToView(self.graphicsView, True)
+        return QtGui.QWidget.showEvent(self, event)        
+        # super(QPIPGraphicsView, self).showEvent(event)
+
+    def enterEvent(self, event):
+        """ enterEvent(event: QEnterEvent) -> None        
+        Show a larger frame when the mouse enter to facilitate
+        resizing
+        
+        """
+        self.layout().setMargin(CurrentTheme.PIP_IN_FRAME_WIDTH)
+
+    def leaveEvent(self, event):
+        """ leaveEvent(event: QLeaveEvent) -> None        
+        Show a smaller frame when the mouse exit the widget to get
+        more view
+        
+        """
+        self.layout().setMargin(CurrentTheme.PIP_OUT_FRAME_WIDTH)
+
+
+class QResetQueryButton(QtGui.QLabel):
+    """
+    
+    """
+    def __init__(self, parent=None):
+        QtGui.QLabel.__init__(self, parent)
+
+        self.setText('Reset Query')
+        self.setFrameStyle(QtGui.QFrame.StyledPanel)
+        self.setFrameShadow(QtGui.QFrame.Raised)
+        self.marginPad = 10
+
+    def mousePressEvent(self, e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Capture mouse press event on the frame to move the widget
+        
+        """
+        if e.buttons() & QtCore.Qt.LeftButton:
+            self.setFrameShadow(QtGui.QFrame.Sunken)
+    
+    def mouseReleaseEvent(self, e):
+        self.setFrameShadow(QtGui.QFrame.Raised)
+        self.emit(QtCore.SIGNAL('resetQuery()'))
+
+    def updateGeometry(self):
+        parentGeometry = self.parent().geometry()
+        self.move(self.marginPad, 
+                  parentGeometry.height()-self.height()-self.marginPad)
+
+
diff --git a/vistrails/gui/job_monitor.py b/vistrails/gui/job_monitor.py
new file mode 100644
index 0000000..5e61032
--- /dev/null
+++ b/vistrails/gui/job_monitor.py
@@ -0,0 +1,387 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core import debug, configuration
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.gui import theme
+from vistrails.core.db.locator import BaseLocator
+from vistrails.gui.common_widgets import QDockPushButton
+
+refresh_states = [('Off', 0), ('10 sec', 10),
+                  ('1 min', 60), ('10 min', 600),
+                  ('1 hour', 3600)]
+
+class QNumberValidator(QtGui.QIntValidator):
+    def validate(self, input, pos):
+        result = QtGui.QIntValidator.validate(self, input, pos)
+        if len(input) and result[0] == QtGui.QIntValidator.Intermediate:
+            return (QtGui.QIntValidator.Invalid, pos)
+        return result
+
+class QJobView(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.timer_id = None
+
+        self.workflowItems = {}
+        self.layout = QtGui.QVBoxLayout()
+#        self.layout.setContentsMargins(5, 5, 0, 0)
+
+        buttonsLayout = QtGui.QHBoxLayout()
+        #buttonsLayout.setMargin(5)
+        #buttonsLayout.setSpacing(5)
+        run_now = QDockPushButton("Check now")
+        run_now.setToolTip("Check all jobs now")
+        run_now.clicked.connect(self.timerEvent)
+        buttonsLayout.addWidget(run_now)
+        label = QtGui.QLabel('Refresh interval (seconds):')
+        buttonsLayout.addWidget(label)
+
+        self.interval = QtGui.QComboBox()
+        for text, seconds in refresh_states:
+            self.interval.addItem(text, seconds)
+            self.interval.editTextChanged.connect(self.set_refresh)
+        self.interval.setEditable(True)
+        self.interval.setCurrentIndex(self.interval.findText('10 min'))
+        self.interval.setCompleter(None)
+        self.interval.setValidator(QNumberValidator())
+        buttonsLayout.addWidget(self.interval)
+
+        self.autorun = QtGui.QCheckBox("Run When Ready")
+        self.autorun.setToolTip("Automatically re-execute the workflow when jobs have completed")
+        buttonsLayout.addWidget(self.autorun)
+
+        self.rerun = QtGui.QCheckBox("Run To Check")
+        self.rerun.setToolTip("Automatically re-execute workflows that does not provide a status check method")
+        buttonsLayout.addWidget(self.rerun)
+
+        buttonsLayout.addStretch(1)
+        self.layout.addLayout(buttonsLayout)
+
+        self.jobView = QtGui.QTreeWidget()
+        self.jobView.setContentsMargins(0, 0, 0, 0)
+        self.jobView.setColumnCount(2)
+        self.jobView.setHeaderLabels(['Job', 'Message'])
+        self.jobView.header().setResizeMode(0, QtGui.QHeaderView.ResizeToContents)
+        self.jobView.header().setResizeMode(1, QtGui.QHeaderView.Stretch)
+        self.jobView.setExpandsOnDoubleClick(False)
+        self.connect(self.jobView,
+                     QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'),
+                     self.item_selected)
+        self.layout.addWidget(self.jobView)
+
+        self.setLayout(self.layout)
+        self.setWindowTitle('Running Jobs')
+        self.resize(QtCore.QSize(800, 600))
+        self.updating_now = False
+
+
+    def set_refresh(self, refresh=0):
+        self.updating_now = True
+        refresh = str(refresh) if refresh else '0'
+        # changes the timer time
+        if refresh in dict(refresh_states):
+            refresh = dict(refresh_states)[refresh]
+            self.interval.setEditText(str(refresh))
+        else:
+            refresh = int(refresh)
+        if refresh:
+            if self.timer_id is not None:
+                self.killTimer(self.timer_id)
+            self.timer_id = self.startTimer(refresh*1000)
+        else:
+            if self.timer_id:
+                self.killTimer(self.timer_id)
+                self.timer_id = None
+        self.updating_now = False
+                
+    def update_jobs(self):
+        # check all jobs
+        for workflow in self.workflowItems.values():
+            # jobs without a queue can also be checked
+            if not workflow.has_queue:
+                if self.rerun.isChecked():
+                    workflow.execute()
+                continue
+            if workflow.workflowFinished:
+                continue
+            for job in workflow.jobs.itervalues():
+                if job.jobFinished:
+                    continue
+                try:
+                    # call queue
+                    job.jobFinished = job.queue.finished()
+                    # old version of BatchQ needs to call .val()
+                    if not isinstance(job.jobFinished, bool):
+                        job.jobFinished = job.jobFinished.val()
+                    if job.jobFinished:
+                        job.setText(1, "Finished")
+                except Exception, e:
+                    debug.critical("Error checking job %s: %s" %
+                                   (workflow.name, str(e)))
+                if job.jobFinished:
+                    job.setIcon(0, theme.get_current_theme().JOB_FINISHED)
+                workflow.countJobs()
+            workflow.workflowFinished = len(workflow.jobs) == \
+                         sum(j.jobFinished for j in workflow.jobs.itervalues())
+            if workflow.workflowFinished:
+                workflow.setIcon(0, theme.get_current_theme().JOB_FINISHED)
+                workflow.setText(1, "Finished")
+            workflow.countJobs()
+            if workflow.workflowFinished:
+                if self.autorun.isChecked():
+                    self.updating_now = False
+                    workflow.execute()
+                    self.updating_now = True
+                    continue
+                ret = QtGui.QMessageBox.information(self, "Job Ready",
+                        'Pending Jobs in workflow "%s" have finished, '
+                        'continue execution now?' % workflow.name,
+                        QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel)
+                if ret == QtGui.QMessageBox.Ok:
+                    self.updating_now = False
+                    workflow.execute()
+                    self.updating_now = True
+
+    def timerEvent(self, id=None):
+        if self.updating_now:
+            return
+        self.updating_now = True
+        self.update_jobs()
+        self.updating_now = False
+
+    def keyPressEvent(self, event):
+        if event.key() in [QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace]:
+            items = self.jobView.selectedItems()
+            if len(items) == 1:
+                index = self.jobView.indexOfTopLevelItem(items[0])
+                if index>=0:
+                    self.delete_job(items[0].controller, items[0].version)
+        else:
+            QtGui.QWidget.keyPressEvent(self, event)
+
+    def add_job(self, controller, error, prev='', workflow=None):
+        """ Adds job recursively """
+        added = False
+        if not prev:
+            if controller.vistrail.locator:
+                name = controller.vistrail.locator.short_name
+            else:
+                name = 'Untitled.vt'
+            version_id = controller.current_version
+            if (name, version_id) not in self.workflowItems:
+                workflow = QWorkflowItem(controller, error, self.jobView)
+                self.jobView.addTopLevelItem(workflow)
+                self.workflowItems[(name, version_id)] = workflow
+
+                # save job to configuration
+                if controller.vistrail.locator:
+                    conf = configuration.get_vistrails_configuration()
+                    if not conf.has('runningJobsList') or not conf.runningJobsList:
+                        conf_jobs = []
+                    else:
+                        conf_jobs = conf.runningJobsList.split(';')
+                    if not conf_jobs:
+                        conf_jobs = []
+                    url = controller.vistrail.locator.to_url()
+                    if '?' in url:
+                        url += '&workflow=%d' % version_id
+                    else:
+                        url += '?workflow=%d' % version_id
+                    if not url in conf_jobs:
+                        conf_jobs.append(str(url))
+                        conf.runningJobsList = ';'.join(conf_jobs)
+                        configuration.get_vistrails_persistent_configuration(
+                                      ).runningJobsList = conf.runningJobsList
+            else:
+                workflow = self.workflowItems[(name, version_id)]
+        job_name = ((prev+'.') if prev else '') + error.module.__class__.__name__
+
+        if not error.children:
+            if not error.queue:
+                # We allow jobs without queue objects, but they will
+                # have to be checked by re-executing the entire workflow
+                workflow.has_queue = False
+                workflow.setIcon(0, theme.get_current_theme().JOB_SCHEDULED)
+                workflow.setToolTip(0, 'To check this workflow it must be re-executed. Make sure "Run To Check" is checked.')
+
+                #return False
+            # remove any previous instance of this job, if name is shorter
+            if id(error) in workflow.jobs and \
+               len(job_name) > len(workflow.jobs[id(error)].text(0)):
+                workflow.takeChild(workflow.indexOfChild(
+                  workflow.jobs[id(error)]))
+                del workflow.jobs[id(error)]
+            # if we did not keep an already existing job, add it
+            if id(error) not in workflow.jobs:
+                job = QJobItem(job_name, error)
+                workflow.addChild(job)
+                workflow.jobs[id(error)] = job
+                workflow.countJobs()
+                return True
+        else:
+            for child in error.children:
+                result = self.add_job(controller, child, job_name, workflow)
+                if result:
+                    added = True
+        return added
+                        
+    def delete_job(self, controller, version_id=None, all=False):
+        if all:
+            for k in self.workflowItems.keys():
+                workflow = self.workflowItems[k]
+                if workflow.controller is controller:
+                    self.jobView.takeTopLevelItem(
+                        self.jobView.indexOfTopLevelItem(
+                            self.workflowItems[k]))
+                    del self.workflowItems[k]
+            return
+        if not version_id:
+            version_id = controller.current_version
+        if controller.locator:
+            conf = configuration.get_vistrails_configuration()
+            if not conf.has('runningJobsList') or not conf.runningJobsList:
+                conf_jobs = []
+            else:
+                conf_jobs = conf.runningJobsList.split(';')
+            if not conf_jobs:
+                conf_jobs = []
+            url = controller.locator.to_url()
+            if '?' in url:
+                url += '&workflow=%s' % version_id
+            else:
+                url += '?workflow=%s' % version_id
+            if url in conf_jobs:
+                conf_jobs.remove(url)
+                conf.runningJobsList = ';'.join(conf_jobs)
+                configuration.get_vistrails_persistent_configuration(
+                    ).runningJobsList = conf.runningJobsList
+            name = controller.vistrail.locator.short_name
+        else:
+            name = 'Untitled.vt'
+        if (name, version_id) in self.workflowItems:
+            self.jobView.takeTopLevelItem(
+                self.jobView.indexOfTopLevelItem(
+                    self.workflowItems[(name, version_id)]))
+            del self.workflowItems[(name, version_id)]
+
+    def item_selected(self, item):
+        if isinstance(item, QWorkflowItem):
+            item.goto()
+
+    def load_running_jobs(self):
+        conf = configuration.get_vistrails_configuration()
+        if conf.has('runningJobsList') and conf.runningJobsList:
+            for url in conf.runningJobsList.split(';'):
+                loc, version = url.split('?')
+                locator = BaseLocator.from_url(loc)
+                msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Question,
+                                           "Running Job Found",
+                                           "Running Job Found:\n    %s\n"
+                                           "Continue now?" % url)
+                msgBox.addButton("Later", msgBox.ActionRole)
+                delete = msgBox.addButton("Delete", msgBox.ActionRole)
+                yes = msgBox.addButton("Yes", msgBox.ActionRole)
+                msgBox.exec_()
+                if msgBox.clickedButton() == yes:
+                    from vistrails.gui.vistrails_window import _app
+                    _app.open_vistrail_without_prompt(locator,
+                                                   int(version.split('=')[1]))
+                    _app.get_current_view().execute()
+                if msgBox.clickedButton() == delete:
+                    conf_jobs = conf.runningJobsList.split(';')
+                    conf_jobs.remove(url)
+                    conf.runningJobsList = ';'.join(conf_jobs)
+                    configuration.get_vistrails_persistent_configuration(
+                                      ).runningJobsList = conf.runningJobsList
+        else:
+            conf.runningJobsList = ''
+            configuration.get_vistrails_persistent_configuration(
+                                      ).runningJobsList = conf.runningJobsList
+
+
+class QWorkflowItem(QtGui.QTreeWidgetItem):
+    """ The workflow that was suspended """
+    def __init__(self, controller, error, parent):
+        if controller.vistrail.locator:
+            self.name = "%s:%s" % (controller.vistrail.locator.short_name,
+                                    controller.get_pipeline_name())
+        else:
+            self.name = "Untitled.vt:%s" % controller.get_pipeline_name()
+            
+        QtGui.QTreeWidgetItem.__init__(self, parent,
+                    [self.name, error if isinstance(error, str) else error.msg])
+        self.setToolTip(0, "Double-Click to View Pipeline")
+        self.setToolTip(1, error if isinstance(error, str) else error.msg)
+        
+        self.controller = controller
+        self.version = controller.current_version
+        self.has_queue = True
+        self.setIcon(0, theme.get_current_theme().JOB_CHECKING)
+        self.workflowFinished = False
+        self.jobs = {}
+        from vistrails.gui.vistrails_window import _app
+        self.view = _app.get_current_view()
+    
+    def countJobs(self):
+        count = self.childCount()
+        finished = sum([self.child(i).jobFinished for i in xrange(count)])
+        self.setText(0, "%s (%s/%s)" % (self.name, finished, count))
+
+    def goto(self):
+        from vistrails.gui.vistrails_window import _app
+        _app.change_view(self.view)
+        self.view.version_selected(self.version, True, double_click=True)
+    
+    def execute(self):
+        self.goto()
+        self.view.execute()
+
+class QJobItem(QtGui.QTreeWidgetItem):
+    """ The module that was suspended """
+    def __init__(self, name, error, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent, [name, error.msg])
+        self.setToolTip(1, error.msg)
+        self.queue = error.queue
+        if self.queue:
+            self.setIcon(0, theme.get_current_theme().JOB_CHECKING)
+            self.setToolTip(0, "This Job has a method to check if it has finished.")
+        else:
+            self.setIcon(0, theme.get_current_theme().JOB_SCHEDULED)
+            self.setToolTip(0, 'To check this job the workflow must be re-executed. Make sure "Run To Check" is checked.')
+        self.jobFinished = False
diff --git a/vistrails/gui/mashups/__init__.py b/vistrails/gui/mashups/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/gui/mashups/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/gui/mashups/alias_inspector.py b/vistrails/gui/mashups/alias_inspector.py
new file mode 100644
index 0000000..c017488
--- /dev/null
+++ b/vistrails/gui/mashups/alias_inspector.py
@@ -0,0 +1,759 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""This file contains the widget for displaying the properties panel for a
+selected alias in the list
+
+Classes defined in this file:
+
+QAliasInspector
+QAliasDetailsWidget
+QValuesListEditor
+QListEditDialog
+QListEditItemDelegate
+
+"""
+import copy
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSignal, pyqtSlot
+from vistrails.core.mashup.alias import Alias
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.gui.modules import get_widget_class
+from vistrails.gui.modules.constant_configuration import StandardConstantWidget
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import show_warning
+################################################################################
+class QAliasInspector(QtGui.QScrollArea):
+    """
+    QAliasInspector is a widget to display the details of an alias.
+    """
+    #signals
+    aliasChanged = pyqtSignal(Alias)
+    
+    def __init__(self, alias_list, parent=None):
+        QtGui.QScrollArea.__init__(self,parent)
+        self.setAcceptDrops(False)
+        self.setWidgetResizable(True)
+        self.vWidget = QAliasDetailsWidget(alias_list)
+        self.setWidget(self.vWidget)
+        
+        #connecting signals
+        self.vWidget.aliasChanged.connect(self.aliasChanged)
+        
+    def updateContents(self, alias_item=None, controller=None):
+        self.vWidget.updateContents(alias_item, controller)
+ 
+################################################################################       
+class QAliasDetailsWidget(QtGui.QWidget):
+    #signals
+    aliasChanged = pyqtSignal(Alias)
+    
+    def __init__(self, table, parent=None):
+        QtGui.QWidget.__init__(self,parent)
+        self.alias = None
+        self.table = table
+        self.createWidgets()
+        self.updateContents()
+        
+    def createWidgets(self):
+        self.main_layout = QtGui.QVBoxLayout()
+        self.label = QtGui.QLabel("Alias Details")
+        self.main_layout.addWidget(self.label)
+        
+        self.name_label = QtGui.QLabel("Name")
+        self.name_edit = QtGui.QLineEdit()
+        l1 = QtGui.QVBoxLayout()
+        l1.setContentsMargins(0, 11, 0, 0)
+        l1.setSpacing(3)
+        l1.addWidget(self.name_label)
+        l1.addWidget(self.name_edit)
+        
+        self.order_label = QtGui.QLabel("Order")
+        self.order_spinbox = QtGui.QSpinBox()
+        self.order_spinbox.setRange(0,self.table.topLevelItemCount()-1)
+        if self.alias:
+            self.order_spinbox.setValue(self.alias.component.pos)
+        l2 = QtGui.QVBoxLayout()
+        l2.setContentsMargins(0, 11, 0, 0)
+        l2.setSpacing(3)
+        l2.addWidget(self.order_label)
+        l2.addWidget(self.order_spinbox)
+        
+        l3 = QtGui.QHBoxLayout()
+        l3.addLayout(l1)
+        l3.addLayout(l2)
+        self.main_layout.addLayout(l3)
+        
+        #Display Widget
+        self.dw_groupbox = QtGui.QGroupBox()
+        self.dw_groupbox.setFlat(True)
+        self.dw_label = QtGui.QLabel("Display Widget")
+        self.dw_combobox = QtGui.QComboBox()
+        self.dw_combobox.addItem("combobox")
+        self.dw_combobox.addItem("slider")
+        self.dw_combobox.addItem("numericstepper")
+        
+        self.dw_layout = QtGui.QVBoxLayout()
+        self.dw_layout.setContentsMargins(0, 11, 0, 0)
+        self.dw_slider_layout = QtGui.QHBoxLayout()
+        self.dw_minval_label = QtGui.QLabel("Min Val")
+        self.dw_maxval_label = QtGui.QLabel("Max Val")
+        self.dw_stepsize_label = QtGui.QLabel("Step Size")
+        self.dw_minval_edit = QtGui.QLineEdit()
+        self.dw_maxval_edit = QtGui.QLineEdit()
+        self.dw_stepsize_edit = QtGui.QLineEdit()
+        
+        l = QtGui.QVBoxLayout()
+        l.setMargin(0)
+        l.setSpacing(0)
+        l.addWidget(self.dw_minval_label)
+        l.addWidget(self.dw_minval_edit)
+        self.dw_slider_layout.addLayout(l)
+        l = QtGui.QVBoxLayout()
+        l.setMargin(0)
+        l.setSpacing(0)
+        l.addWidget(self.dw_maxval_label)
+        l.addWidget(self.dw_maxval_edit)
+        self.dw_slider_layout.addLayout(l)
+        l = QtGui.QVBoxLayout()
+        l.setMargin(0)
+        l.setSpacing(0)
+        l.addWidget(self.dw_stepsize_label)
+        l.addWidget(self.dw_stepsize_edit)
+        self.dw_slider_layout.addLayout(l)
+        self.dw_seq_toggle = QtGui.QCheckBox("Loop")
+        self.dw_seq_toggle.setToolTip("Enable option to loop through all steps")
+        self.dw_slider_layout.addWidget(self.dw_seq_toggle)
+        self.dw_layout.addWidget(self.dw_label)
+        self.dw_layout.addWidget(self.dw_combobox)
+        self.dw_layout.addLayout(self.dw_slider_layout)
+        self.dw_groupbox.setLayout(self.dw_layout)
+        self.toggle_dw_combobox(0)
+        
+        #Default Value
+        self.dv_groupbox = QtGui.QGroupBox()
+        self.dv_groupbox.setFlat(True)
+        self.dv_label = QtGui.QLabel("Default Value")
+        self.dv_layout = QtGui.QVBoxLayout()
+        self.dv_layout.setContentsMargins(0, 11, 0, 0)
+        self.dv_layout.addWidget(self.dv_label)
+        self.dv_groupbox.setLayout(self.dv_layout)
+        self.dv_widget = None
+        
+        #Values List
+        self.vl_groupbox = QtGui.QGroupBox()
+        self.vl_groupbox.setFlat(True)
+        self.vl_label = QtGui.QLabel("Values List")
+        self.vl_layout = QtGui.QVBoxLayout()
+        self.vl_layout.setContentsMargins(0, 11, 0, 0)
+        self.vl_layout.addWidget(self.vl_label)
+        self.vl_editor = None
+        self.vl_groupbox.setLayout(self.vl_layout)
+        
+        self.main_layout.addWidget(self.dw_groupbox)
+        self.main_layout.addWidget(self.dv_groupbox)
+        self.main_layout.addWidget(self.vl_groupbox)
+        self.main_layout.addStretch(1)
+        
+        self.deleteButton = QtGui.QPushButton("Delete Alias")
+        self.deleteButton.clicked.connect(self.table.removeCurrentAlias)
+        self.deleteButton.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
+                                                           QtGui.QSizePolicy.Fixed))
+        self.main_layout.addWidget(self.deleteButton)
+        
+        self.setLayout(self.main_layout)
+        
+        #connect signals
+        self.plugSignals()
+        
+    def plugSignals(self):
+        self.dw_combobox.currentIndexChanged.connect(self.toggle_dw_combobox)
+        self.name_edit.editingFinished.connect(self.nameChanged)
+        self.order_spinbox.valueChanged.connect(self.orderChanged)
+        self.dw_minval_edit.editingFinished.connect(self.minvalChanged)
+        self.dw_stepsize_edit.editingFinished.connect(self.stepsizeChanged)
+        self.dw_seq_toggle.clicked.connect(self.seqToggled)
+        self.dw_maxval_edit.editingFinished.connect(self.maxvalChanged)
+        
+    def unplugSignals(self):
+        self.dw_combobox.currentIndexChanged.disconnect(self.toggle_dw_combobox)
+        self.name_edit.editingFinished.disconnect(self.nameChanged)
+        self.order_spinbox.valueChanged.disconnect(self.orderChanged)
+        self.dw_minval_edit.editingFinished.disconnect(self.minvalChanged)
+        self.dw_stepsize_edit.editingFinished.disconnect(self.stepsizeChanged)
+        self.dw_maxval_edit.editingFinished.disconnect(self.maxvalChanged)
+        
+    def valuesListChanged(self):
+        self.aliasChanged.emit(self.alias)
+        
+    @pyqtSlot()
+    def minvalChanged(self):
+        if self.alias:
+            old_minval = self.alias.component.minVal
+            new_minval = str(self.dw_minval_edit.text())
+            if old_minval == new_minval:
+                return
+            self.alias.component.minVal = new_minval
+            self.aliasChanged.emit(self.alias)
+    
+    @pyqtSlot()
+    def maxvalChanged(self):
+        if self.alias:
+            old_maxval = self.alias.component.maxVal
+            new_maxval = str(self.dw_maxval_edit.text())
+            if old_maxval == new_maxval:
+                return
+            self.alias.component.maxVal = new_maxval
+            self.aliasChanged.emit(self.alias)
+        
+    @pyqtSlot()
+    def stepsizeChanged(self):
+        if self.alias:
+            old_stepsize = self.alias.component.stepSize
+            new_stepsize = str(self.dw_stepsize_edit.text())
+            if old_stepsize == new_stepsize:
+                return
+            self.alias.component.stepSize = new_stepsize
+            self.aliasChanged.emit(self.alias)
+        
+
+    @pyqtSlot()
+    def seqToggled(self):
+        if self.alias:
+            old_seq = self.alias.component.seq
+            new_seq = self.dw_seq_toggle.isChecked()
+            if old_seq == new_seq:
+                return
+            self.alias.component.seq = new_seq
+            self.aliasChanged.emit(self.alias)
+
+    @pyqtSlot()
+    def nameChanged(self):
+        old_alias = self.alias.name
+        new_alias = str(self.name_edit.text())
+        if old_alias == new_alias:
+            return
+        if new_alias in self.table.aliases.keys():
+            show_warning("Mashup",
+                         """Label name %s already exists. 
+Please type a different name. """ % new_alias)
+            self.name_edit.setText(old_alias)
+            self.name_edit.setFocus()
+        elif new_alias == '':
+            show_warning("Mashup",
+                         """Variables with empty name are not allowed. 
+Please type a unique name. """ % new_alias)
+            self.name_edit.setText(old_alias)
+            self.name_edit.setFocus()
+        else:
+            self.table.aliases[new_alias] = self.table.aliases[old_alias]
+            #self.table.alias_cache[new_alias] = self.table.alias_cache[old_alias]
+            del self.table.aliases[old_alias]
+            #del self.table.alias_cache[old_alias]
+            self.alias.name = new_alias
+            self.aliasChanged.emit(self.alias)
+         
+    @pyqtSlot(int)   
+    def orderChanged(self, neworder):
+        if self.alias.component.pos == neworder:
+            return
+        oldorder = self.alias.component.pos
+        self.alias.component.pos = neworder
+        self.table.moveItemToNewPos(oldorder, neworder)
+        
+    @pyqtSlot(int)
+    def toggle_dw_combobox(self, index):
+        if index == 0:
+            self.show_dw_contents(False)
+        elif index in [1,2]:
+            self.show_dw_contents(True)
+            if self.alias and self.alias.component.type == "Integer":
+                self.set_int_validators()
+            elif self.alias and self.alias.component.type == "Float":
+                self.set_float_validators()
+        # show loop option for stepper
+        self.dw_seq_toggle.setVisible(index == 1)
+        if self.alias:
+            self.alias.component.widget = str(self.dw_combobox.currentText())
+            self.aliasChanged.emit(self.alias)
+            
+    def set_int_validators(self):
+        validator = QtGui.QIntValidator(self)
+        self.dw_minval_edit.setValidator(validator)
+        self.dw_maxval_edit.setValidator(validator)
+        self.dw_stepsize_edit.setValidator(validator)
+        
+    def set_float_validators(self):
+        validator = QtGui.QDoubleValidator(self)
+        self.dw_minval_edit.setValidator(validator)
+        self.dw_maxval_edit.setValidator(validator)
+        self.dw_stepsize_edit.setValidator(validator)
+        
+    def show_dw_contents(self, on=True):
+        self.dw_minval_label.setVisible(on)
+        self.dw_minval_edit.setVisible(on)
+        self.dw_maxval_label.setVisible(on)
+        self.dw_maxval_edit.setVisible(on)
+        self.dw_stepsize_label.setVisible(on)
+        self.dw_stepsize_edit.setVisible(on)
+        self.dw_seq_toggle.setVisible(on)
+        
+    def populate_dw_combobox(self):
+        self.dw_combobox.currentIndexChanged.disconnect(self.toggle_dw_combobox)
+        self.dw_combobox.clear()
+        if self.alias is not None:
+            self.dw_combobox.addItem("combobox")
+            if self.alias.component.type in ["Float", "Integer"]:
+                self.dw_combobox.addItem("slider")
+                self.dw_combobox.addItem("numericstepper")
+        self.dw_combobox.currentIndexChanged.connect(self.toggle_dw_combobox)
+        
+    def updateContents(self, alias=None, controller=None):
+        self.alias = copy.copy(alias)
+        self.controller = controller
+        self.populate_dw_combobox()
+        self.unplugSignals()
+        if alias is not None and controller is not None:
+            self.name_edit.setText(self.alias.name)
+            #print "widget:", self.alias.component.widget
+            wtype = self.alias.component.widget
+            if wtype == 'text':
+                wtype = "combobox"
+            index = self.dw_combobox.findText(wtype)
+            if index < 0:
+                index = 0
+            self.dw_combobox.setCurrentIndex(index)
+            self.order_spinbox.setRange(0,self.table.topLevelItemCount()-1)
+            self.order_spinbox.setValue(self.alias.component.pos)
+                
+            self.dw_minval_edit.setText(self.alias.component.minVal)
+            self.dw_maxval_edit.setText(self.alias.component.maxVal)
+            self.dw_stepsize_edit.setText(self.alias.component.stepSize)
+            self.dw_seq_toggle.setChecked(self.alias.component.seq)
+                
+            if self.dw_combobox.currentIndex() == 0:
+                self.show_dw_contents(False)
+            else:
+                self.show_dw_contents(True)
+            # show loop option for stepper
+            self.dw_seq_toggle.setVisible(index == 1)
+                
+            if self.dv_widget:
+                self.dv_layout.removeWidget(self.dv_widget)
+                self.disconnect(self.dv_widget,
+                                QtCore.SIGNAL("contentsChanged"),
+                                self.widgetContentsChanged)
+                self.dv_widget.deleteLater()
+            
+            self.dv_widget = QAliasDetailsWidget.createAliasWidget(self.alias, self.controller, self)
+            self.dv_layout.addWidget(self.dv_widget)
+            self.connect(self.dv_widget,
+                         QtCore.SIGNAL("contentsChanged"),
+                         self.widgetContentsChanged)
+        
+            if self.vl_editor:
+                self.vl_layout.removeWidget(self.vl_editor)
+                self.disconnect(self.vl_editor,
+                                QtCore.SIGNAL("valuesChanged"),
+                                self.valuesListChanged)
+                self.vl_editor.deleteLater()
+                self.vl_editor = None
+           
+            self.vl_editor = QValuesListEditor(self.alias,self.controller)
+            self.vl_layout.addWidget(self.vl_editor)
+        
+            #capturing widget changes to update alias
+            self.connect(self.vl_editor,
+                         QtCore.SIGNAL("valuesChanged"),
+                         self.valuesListChanged)
+            self.setEnabled(True)
+        else:
+            self.name_edit.setText("")
+            
+            if self.dv_widget:
+                self.dv_layout.removeWidget(self.dv_widget)
+                self.disconnect(self.dv_widget,
+                                QtCore.SIGNAL("contentsChanged"),
+                                self.widgetContentsChanged)
+                self.dv_widget.deleteLater()
+                self.dv_widget = None
+                
+            if self.vl_editor:
+                self.vl_layout.removeWidget(self.vl_editor)
+                self.disconnect(self.vl_editor,
+                                QtCore.SIGNAL("valuesChanged"),
+                                self.valuesListChanged)
+                self.vl_editor.deleteLater()
+                self.vl_editor = None
+                
+            self.setEnabled(False)
+        self.plugSignals()
+        
+    @staticmethod
+    def createAliasWidget(alias, controller, parent=None):
+        v = controller.vtController.vistrail
+        p = v.db_get_object(alias.component.vttype, alias.component.vtid)
+        if p.identifier == '':
+            idn = get_vistrails_basic_pkg_id()
+        else:
+            idn = p.identifier
+        reg = get_module_registry()
+        p_module = reg.get_module_by_name(idn, p.type, p.namespace)
+        widget_type = get_widget_class(p_module)
+        p.strValue = alias.component.val
+        return widget_type(p, parent)
+    
+    def widgetContentsChanged(self, info):
+        self.alias.component.val = info[0].contents()
+        if self.alias.component.val not in self.alias.component.valueList:
+            self.alias.component.valueList.append(self.alias.component.val)
+            self.alias.component.valueList.sort()
+            self.vl_editor.alias_item_updated()
+        self.aliasChanged.emit(self.alias)
+        
+################################################################################
+
+class QValuesListEditor(QtGui.QWidget):
+    """
+    QValuesListEditor is the actual widget allowing users to
+    enter a list of values
+    
+    """
+    def __init__(self, alias, controller, parent=None):
+        """ QValuesListEditor(alias_item: AliasTableItem, parent: QWidget)
+                                     -> QValuesListEditor
+        Construct an edit box with a button for bringing up the dialog
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self._alias = alias
+        self.type = alias.component.type
+        self.controller = controller
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        self.setLayout(hLayout)
+        
+        self.listValues = QtGui.QLineEdit()
+    
+        self.listValues.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                      QtGui.QSizePolicy.Maximum)
+        self.alias_item_updated()
+        
+        hLayout.addWidget(self.listValues)
+        
+        self.connect(self.listValues, QtCore.SIGNAL('editingFinished()'),
+                     self.values_were_edited)
+
+        inputButton = QtGui.QToolButton()
+        inputButton.setText('...')
+        self.connect(inputButton, QtCore.SIGNAL('clicked()'),
+                     self.editListValues)
+        hLayout.addWidget(inputButton)
+        
+    def alias_item_updated(self):
+        if self._alias.component.type not in ['Float', 'Integer']:
+            values = []
+            for v in self._alias.component.valueList:
+                values.append("'%s'"% v.replace("'", "\'"))
+                
+            self.listValues.setText("[%s]" % ", ".join(values))
+        else:
+            self.listValues.setText('[%s]' % ", ".join(self._alias.component.valueList))
+        if self._alias.component.type in ['String','Integer','Float']:
+            self.listValues.setReadOnly(False)
+        else:
+            self.listValues.setReadOnly(True)
+        self.listValues.home(False)
+        
+    def values_were_edited(self):
+        """values_were_edited(): None
+
+        Connected to self.listValues.textEdited. 
+        Updates self._alias.valueList.
+        
+        NB: Allowing the user to edit the LineEdit field directly is
+        not a very good idea, because we don't know what are the
+        syntactic rules for the translate_to_python() calls in
+        arbitrary classes.  Right now, I'm assuming removing the
+        leading and trailing brackets and splitting on ',' is
+        enough. (in passing, The previous call to eval() is just
+        broken is a general scenario like we have now)
+
+        For example, this will break horribly if the user manually edits
+        a list of strings with commas in them."""
+
+        #print "values_were_edited"
+        new_text = self.listValues.text()
+        t = str(new_text)
+        if len(t) < 2:
+            self._alias.component.valueList = []
+            return
+        if not (t[0] == '[' and t[-1] == ']'):
+            self._alias.valueList = []
+        else: 
+            self._alias.component.valueList = t[1:-1].split(',')
+            if self._alias.component.type not in ['Float', 'Integer']:
+                for i, val in enumerate(self._alias.component.valueList):
+                    val = val.strip()
+                    if len(val) >= 2 and  \
+                            ((val[0] == "'" and val[-1] == "'") or 
+                             (val[0] == '"' and val[-1] == '"')):
+                        self._alias.component.valueList[i] = val.strip()[1:-1]
+
+    def editListValues(self):
+        """ editListValues() -> None
+        Show a dialog for editing the values
+        
+        """
+        dialog = QListEditDialog(self._alias, self.controller, None)
+        if dialog.exec_() == QtGui.QDialog.Accepted:
+            values = dialog.getList()
+            #print values
+            self._alias.component.valueList = copy.copy(values)
+            self._str_values = [str(v) for v in values]
+            values2 = values
+            if self.type not in ['Float', 'Integer']:
+                values2 = ["'%s'" % v.replace("'", "\'")
+                          for v in values]
+            self.listValues.setText('[%s]' % ', '.join(values2))
+            self.listValues.home(False)
+            self.emit(QtCore.SIGNAL("valuesChanged"))
+        dialog.deleteLater()
+
+##############################################################################
+
+class QListEditDialog(QtGui.QDialog):
+    """
+    QListEditDialog provides an interface for user to edit a list of
+    values and export to a string
+    
+    """
+    def __init__(self, alias, controller, parent=None):
+        """ QListEditDialog(pType: str, strValues: list, parent: QWidget)
+                            -> QListEditDialog
+        Parse values and setup the table
+        
+        """
+        QtGui.QDialog.__init__(self, parent)
+        self._alias = alias
+        vLayout = QtGui.QVBoxLayout()
+        vLayout.setMargin(0)
+        vLayout.setSpacing(0)
+        self.controller = controller
+        self.setLayout(vLayout)
+        
+        label = QtGui.QLabel("Please enter values in boxes below. "
+                             "'Add' appends an empty value to the list. "
+                             "And 'Del' removes the selected values.")
+        label.setMargin(5)
+        label.setWordWrap(True)
+        vLayout.addWidget(label)
+
+        self.table = QtGui.QTableWidget(0, 1, parent)
+        self.table.setHorizontalHeaderLabels(['Values'])
+        self.table.horizontalHeader().setStretchLastSection(True)
+        self.table.verticalHeader().setMovable(True)
+        
+        self.delegate = QListEditItemDelegate(alias, controller)
+        self.table.setItemDelegate(self.delegate)
+        self.table.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
+        for v in alias.component.valueList:
+            self.addRow(v)
+        self.connect(self.table.verticalHeader(),
+                     QtCore.SIGNAL('sectionMoved(int,int,int)'),
+                     self.rowMoved)
+        
+        vLayout.addWidget(self.table)
+
+        hLayout = QtGui.QHBoxLayout()        
+        vLayout.addLayout(hLayout)
+
+        okButton = QtGui.QPushButton('&OK')
+        okButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                               QtGui.QSizePolicy.Maximum)
+        self.connect(okButton, QtCore.SIGNAL('clicked()'), self.okButtonPressed)
+        hLayout.addWidget(okButton)
+
+        cancelButton = QtGui.QPushButton('&Cancel')
+        cancelButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                   QtGui.QSizePolicy.Maximum)
+        self.connect(cancelButton, QtCore.SIGNAL('clicked()'), self.reject)
+        hLayout.addWidget(cancelButton)
+
+        addButton = QtGui.QPushButton('&Add')
+        addButton.setIcon(CurrentTheme.ADD_STRING_ICON)
+        addButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                QtGui.QSizePolicy.Maximum)
+        self.connect(addButton, QtCore.SIGNAL('clicked()'), self.addRow)
+        hLayout.addWidget(addButton)
+        
+        removeButton = QtGui.QPushButton('&Del')
+        removeButton.setIcon(QtGui.QIcon(
+            self.style().standardPixmap(QtGui.QStyle.SP_DialogCancelButton)))
+        removeButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                   QtGui.QSizePolicy.Maximum)
+        self.connect(removeButton, QtCore.SIGNAL('clicked()'),
+                     self.removeSelection)
+        hLayout.addWidget(removeButton)
+        
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return the recommended size for the widget
+        
+        """
+        return QtCore.QSize(256, 384)
+        
+    def okButtonPressed(self):
+        """ okButtonPressed() -> None
+        Make sure to commit the editor data before accepting
+        
+        """
+        self.table.itemDelegate().finishEditing()
+        self.accept()
+
+    def getList(self):
+        """ getList() -> list of str values
+        Return a list of values
+        
+        """
+        result = []
+        for i in xrange(self.table.rowCount()):
+            logicalIndex = self.table.verticalHeader().logicalIndex(i)
+            value = self.table.cellWidget(logicalIndex, 0).contents()            
+            result.append(str(value))
+        return result
+
+    def rowMoved(self, row, old, new):
+        """ rowMove(row: int, old: int, new: int) -> None
+        Renumber the vertical header labels when row moved
+        
+        """
+        vHeader = self.table.verticalHeader()
+        labels = []        
+        for i in xrange(self.table.rowCount()):
+            labels.append(str(vHeader.visualIndex(i)+1))
+        self.table.setVerticalHeaderLabels(labels)
+
+    def addRow(self, text=''):
+        """ addRow(text: str) -> QListStringEdit
+        Add an extra row to the end of the table
+        
+        """    
+        self.table.setRowCount(self.table.rowCount()+1)
+        alias = copy.copy(self._alias)
+        alias.component.val = text
+        widget = \
+          QAliasDetailsWidget.createAliasWidget(alias, self.controller, None)
+        if not isinstance(widget, StandardConstantWidget):
+            item = QtGui.QTableWidgetItem()
+        else:
+            item = QtGui.QTableWidgetItem(text)
+        row = self.table.rowCount()-1
+        
+        self.table.setItem(row, 0, item)
+        self.table.setCellWidget(row,
+                                 0,
+                                 widget)
+        h = widget.sizeHint().height()
+        self.table.setRowHeight(row,h)
+        
+    def removeSelection(self):
+        """ removeSelection() -> None
+        Remove selected rows on the table
+        
+        """
+        for item in self.table.selectedItems():
+            self.table.removeRow(item.row())
+
+##############################################################################
+
+class QListEditItemDelegate(QtGui.QItemDelegate):
+    """
+    QListEditItemDelegate sets up the editor for the QListEditDialog
+    table
+    
+    """
+
+    def __init__(self, alias_item, controller, parent=None):
+        """ QListEditItemDelegate(parent: QWidget) -> QListEditItemDelegate
+        Store the uncommit editor for commit later
+        
+        """
+        QtGui.QItemDelegate.__init__(self, parent)
+        self.controller = controller
+        self.alias_item = alias_item
+        self.editor = None
+        
+    def createEditor(self, parent, option, index):
+        """ createEditor(parent: QWidget,
+                         option: QStyleOptionViewItem,
+                         index: QModelIndex) -> QStringEdit
+        Return the editor widget for the index
+        
+        """        
+        self.editor = QAliasDetailsWidget.createAliasWidget(self.alias_item, 
+                                                            self.controller, 
+                                                            parent)
+        #print "editor created"
+        return self.editor
+
+    def updateEditorGeometry(self, editor, option, index):
+        """ updateEditorGeometry(editor: QStringEdit,
+                                 option: QStyleOptionViewItem,
+                                 index: QModelIndex) -> None
+        Update the geometry of the editor based on the style option
+        
+        """
+        editor.setGeometry(option.rect)
+
+    def setModelData(self, editor, model, index):
+        """ setModelData(editor: QStringEdit,
+                         model: QAbstractItemModel,
+                         index: QModelIndex) -> None
+        Set the text of the editor back to the item model
+        
+        """
+        model.setData(index, editor.contents())        
+        self.editor = None
+
+    def finishEditing(self):
+        #print "finishEditing"
+        if self.editor:
+            self.emit(QtCore.SIGNAL('commitData(QWidget*)'), self.editor)
+
+##############################################################################
diff --git a/vistrails/gui/mashups/alias_list.py b/vistrails/gui/mashups/alias_list.py
new file mode 100644
index 0000000..98e3e3a
--- /dev/null
+++ b/vistrails/gui/mashups/alias_list.py
@@ -0,0 +1,352 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+""" This file contains widgets for displaying a list of aliases.
+
+Classes defined in this file:
+
+QAliasListPanel
+QAliasListItem
+QAliasList
+
+"""
+import copy
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSlot, pyqtSignal
+
+
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core.mashup.alias import Alias
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.mashups.alias_inspector import QAliasInspector
+from vistrails.gui.utils import show_question, YES_BUTTON, NO_BUTTON
+
+###############################################################################
+class QAliasListPanel(QtGui.QWidget, BaseView):
+    """
+    QAliasListPanel shows list of aliases in pipeline.
+    
+    """
+    #signals
+    highlightModule = pyqtSignal(int)
+    aliasesChanged = pyqtSignal()
+    aliasChanged = pyqtSignal(Alias)
+    aliasRemoved = pyqtSignal(str)
+    
+    def __init__(self, controller=None, parent=None):
+        """ QAliasListPanel(controller: MashupController,
+                            parent: QWidget) -> QAliasListPanel
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.controller = None
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        layout = QtGui.QVBoxLayout()
+        self.aliases = QAliasList(controller, self)
+        self.inspector = QAliasInspector(self.aliases)
+        self.updateController(controller)
+        self.setLayout(layout)
+        #self.layout().setMargin(0)
+        #self.layout().setSpacing(1)
+        self.splitter = QtGui.QSplitter()
+        layout.addWidget(self.splitter)
+        self.splitter.setOrientation(QtCore.Qt.Vertical)
+        self.splitter.addWidget(self.aliases)
+        self.splitter.addWidget(self.inspector)
+        self.splitter.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        self.splitter.setStretchFactor(0,0)
+        self.splitter.setStretchFactor(1,1)
+
+        #connecting signals        
+        self.aliases.itemSelectionChanged.connect(self.updateInspector)
+        self.aliases.highlightModule.connect(self.highlightModule)
+        self.aliases.aliasUpdated.connect(self.updateAlias)
+        self.aliases.aliasRemoved.connect(self.aliasRemoved)
+        
+        self.inspector.aliasChanged.connect(self.updateAlias)
+        
+    def updateController(self, controller, other_dict=None):
+        if self.controller:
+            self.aliasRemoved.disconnect(self.controller.removeAlias)
+            self.aliasChanged.disconnect(self.controller.updateAlias)
+        self.controller = controller
+        if self.controller:
+            self.aliases.controller = self.controller
+            if (self.controller.currentMashup.alias_list and
+                len(self.controller.currentMashup.alias_list) > 0):
+                self.aliases.populateFromMashup(self.controller)
+            else:
+                self.aliases.clear()
+            self.aliasRemoved.connect(self.controller.removeAlias)
+            self.aliasChanged.connect(self.controller.updateAlias)
+
+    def updateVersion(self, versionId):    
+        #print "AliasPanel.updateVersion "
+        if self.controller:
+            if (self.controller.currentMashup.alias_list and
+                len(self.controller.currentMashup.alias_list) > 0):
+                self.aliases.populateFromMashup(self.controller)
+            else:
+                self.aliases.clear()
+                
+    @pyqtSlot()
+    def updateInspector(self):
+        if len(self.aliases.selectedItems()) == 1:
+            item = self.aliases.selectedItems()[0]
+            self.inspector.updateContents(item.alias, self.controller)
+        else:
+            self.inspector.updateContents()
+       
+    @pyqtSlot(Alias) 
+    def updateAlias(self, alias):
+        #make sure the module is highlighted in the pipeline view 
+        # or method_drop box is empty
+        self.aliasChanged.emit(alias)
+        self.aliasesChanged.emit()
+        
+    def set_default_layout(self):
+        from vistrails.gui.mashups.mashups_inspector import QMashupsInspector
+        from vistrails.gui.mashups.alias_parameter_view import QAliasParameterView
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QMashupsInspector,
+             QtCore.Qt.RightDockWidgetArea: QAliasParameterView,
+             })
+            
+    def set_action_links(self):
+        self.action_links = \
+            {
+            }
+        
+###############################################################################
+
+class QAliasList(QtGui.QTreeWidget):
+    """
+    QAliasList just inherits from QListView to have a customized
+    list and items
+
+    """
+    #signals
+    aliasUpdated = pyqtSignal(Alias)
+    aliasRemoved = pyqtSignal(str)
+    highlightModule = pyqtSignal(int)
+    
+    def __init__(self, controller, panel, parent=None):
+        """ QAliasList(parent: QWidget) -> QAliasTable
+
+        """
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        self.setRootIsDecorated(False)
+        self.panel = panel
+        self.aliases = Bidict()
+        self.alias_widgets = {}
+        self.controller = controller
+        self.header().setStretchLastSection(True)
+        self.setHeaderLabels(["Position", "Name", "Type"])
+        self.itemSelectionChanged.connect(self.setPreviousSelected)
+        self.connect(self,
+                     QtCore.SIGNAL("currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)"),
+                     self.currentAliasChanged)
+        self.previousSelected = -1
+    
+    @pyqtSlot() 
+    def setPreviousSelected(self):
+        if len(self.selectedItems()) == 1:
+            item = self.selectedItems()[0]
+            self.previousSelected = self.indexOfTopLevelItem(item)
+        else:
+            self.previousSelected = -1      
+    
+    def processCellChanges(self, row, col):
+        """ processCellChanges(row: int, col: int) -> None
+        Event handler for capturing when the contents in a cell changes
+
+        """
+        item = self.item(row, col)
+        if col == 0:
+            old_alias = item.alias.alias
+            new_alias = str(item.text())
+            if new_alias in self.aliases.keys():
+                QtGui.QMessageBox.warning(self,
+                                          "VisMashup",
+                                          """Label name %s already exists. 
+                                          Please type a different name. """ % 
+                                          new_alias)
+                item.setText(old_alias)
+                return
+            elif new_alias == '':
+                del self.aliases[old_alias]
+                wdgt = self.cellWidget(row, 1)
+                del self.alias_widgets[wdgt]
+                item.alias.alias = ''
+                self.removeRow(row)
+                wdgt.deleteLater()
+                self.updateRowNumbers()
+            else:
+                self.aliases[new_alias] = self.aliases[old_alias]
+                del self.aliases[old_alias]
+                item.alias.alias = new_alias
+                
+        elif col == 1:
+            wdgt = self.cellWidget(row,col)
+            if wdgt is not None:
+                item.alias.value = wdgt.contents()
+        self.aliasUpdated.emit(item.alias)
+        
+    def currentAliasChanged(self, current, previous):
+        if current:
+            if ((previous is not None and current.alias != previous.alias) or
+                previous is None):
+                self.highlightModule.emit(current.alias.component.vtmid)
+        else:
+            self.highlightModule.emit(-1)
+        
+    def _getOtherParameterInfo(self, pipeline, id, ptype):
+        parameter = pipeline.db_get_object(ptype,id)
+        return (parameter.type, parameter.strValue, 1, parameter.pos)
+        
+    def createAliasItem(self, alias):
+        """ createAliasRow( alias: core.mashup.Alias) -> AliasItem
+            Creates a row in the list
+            
+        """
+        
+        alias.pos = self.topLevelItemCount()
+        labels = [str(alias.component.pos), str(alias.name), \
+                  str(alias.component.type)]
+        item = QAliasListItem(self, alias, labels)
+        item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable )
+        
+        return alias
+     
+    def populateFromMashup(self, mashupController):
+        #print "populateFromMashup ", self , self.previousSelected    
+        if self.controller != mashupController:
+            self.controller = mashupController
+        self.itemSelectionChanged.disconnect(self.setPreviousSelected)
+        self.aliases = {}
+        self.alias_cache = {}
+        self.alias_widgets = {}
+        self.clear()
+        mashup = self.controller.currentMashup
+        if len(mashup.alias_list) > 0:
+            for alias in mashup.alias_list:
+                alias = self.createAliasItem(copy.copy(alias))
+                self.aliases[alias.name] = alias
+        
+        if self.previousSelected > -1:
+            if self.previousSelected >= self.topLevelItemCount():
+                self.previousSelected = self.topLevelItemCount()-1
+            item = self.topLevelItem(self.previousSelected)
+            self.setItemSelected(item, True)
+            self.setCurrentItem(item)
+        self.itemSelectionChanged.connect(self.setPreviousSelected)
+            
+    def updatePosNumbers(self):
+        new_order = []
+        for idx in range(self.topLevelItemCount()):
+            item = self.topLevelItem(idx)
+            new_order.append(item.alias.component.pos)
+            item.setText(0,str(idx))
+        return new_order
+            
+    def moveItemToNewPos(self, old, new):
+        """moveItemToNewPos(old:int, new:int) -> None
+        Move item from pos old to pos new
+        
+        """
+        self.itemSelectionChanged.disconnect(self.panel.updateInspector)
+        item = self.takeTopLevelItem(old)
+        self.insertTopLevelItem(new,item)
+        self.clearSelection()
+        new_order = self.updatePosNumbers()
+        self.setItemSelected(item, True)
+        self.itemSelectionChanged.connect(self.panel.updateInspector)
+        self.controller.reorderAliases(new_order)
+            
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QKeyEvent) -> None
+         Capture 'Del', 'Backspace' for deleting aliases
+       
+        """       
+        if (event.key() in [QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete]):
+            self.removeCurrentAlias()
+                
+    @pyqtSlot(bool)
+    def removeCurrentAlias(self, checked=False):
+        item = self.currentItem()
+        if not item:
+            return
+        name = item.alias.name
+        # item will get recreated after question dialog shows so keep only index
+        pos = self.indexOfTopLevelItem(item)
+        res = show_question("Mashups", 
+                "Are you sure do you want to remove '%s' from the mashup?"%name,
+                [YES_BUTTON, NO_BUTTON], NO_BUTTON)
+        if res == YES_BUTTON:
+            self.previousSelected = pos 
+            self.takeTopLevelItem(pos)
+            del self.aliases[name]
+
+            self.updatePosNumbers()
+            if pos >= self.topLevelItemCount() - 1:
+                pos = self.topLevelItemCount() - 1
+            self.previousSelected = pos
+            if pos != -1:
+                new_item = self.topLevelItem(pos)
+                self.setCurrentItem(new_item)
+                self.setItemSelected(new_item, True)
+            self.aliasRemoved.emit(name)        
+################################################################################
+
+class QAliasListItem (QtGui.QTreeWidgetItem):
+    """
+    QAliasListtItem represents alias on QAliasList
+    
+    """
+    def __init__(self, parent, alias, labels):
+        """ QAliasListItem(alias: AliasItem, labels: string): 
+        Create a new item with alias and text
+
+        """
+        QtGui.QTreeWidgetItem.__init__(self, parent, labels)
+        self.alias = alias
+
+###############################################################################    
+
+        
diff --git a/vistrails/gui/mashups/alias_parameter_view.py b/vistrails/gui/mashups/alias_parameter_view.py
new file mode 100644
index 0000000..888b254
--- /dev/null
+++ b/vistrails/gui/mashups/alias_parameter_view.py
@@ -0,0 +1,389 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+""" The file describes the parameter tree view that allows changing the alias
+of parameters
+
+QAliasParameterView
+"""
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSignal, pyqtSlot
+from vistrails.core.inspector import PipelineInspector
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.gui.common_widgets import QSearchTreeWindow, QSearchTreeWidget
+from vistrails.gui.paramexplore.pe_pipeline import QAnnotatedPipelineView
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.gui.theme import CurrentTheme
+from vistrails.core.utils import InstanceObject
+
+################################################################################
+class QAliasParameterView(QtGui.QWidget, QVistrailsPaletteInterface):
+    
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.set_title("Mashup Pipeline")
+        layout = QtGui.QVBoxLayout()
+        self.parameter_panel = QAliasParameterPanel()
+        font = QtGui.QFont("Arial", 11, QtGui.QFont.Normal)
+        font.setItalic(True)
+        label = QtGui.QLabel("Double-click a parameter to change alias")
+        label.setFont(font)
+        param_group = QtGui.QGroupBox(self.parameter_panel.windowTitle())
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(0)
+        g_layout.setSpacing(2)
+        g_layout.addWidget(label)
+        g_layout.addWidget(self.parameter_panel)
+        param_group.setLayout(g_layout)
+        layout.addWidget(param_group)
+        
+        self.pipeline_view = QAnnotatedPipelineView()
+        self.pipeline_view.setReadOnlyMode(True)
+        p_view_group = QtGui.QGroupBox(self.pipeline_view.windowTitle())
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(0)
+        g_layout.setSpacing(0)
+        g_layout.addWidget(self.pipeline_view)
+        p_view_group.setLayout(g_layout)
+        layout.addWidget(p_view_group)
+        self.setLayout(layout)
+        
+        self.parameter_panel.treeWidget.aliasChanged.connect(self.aliasChanged)
+        
+    def updateMshpController(self, mshpController):
+        from vistrails.gui.vistrails_window import _app
+        self.mshpController = mshpController
+        self.parameter_panel.set_pipeline(
+                        self.mshpController.vtPipeline)
+        self.pipeline_view.set_controller(self.mshpController.vtController)
+        self.mshpController.vtController.current_pipeline_view = \
+                                                            self.pipeline_view
+        self.pipeline_view.scene().current_pipeline = self.mshpController.vtPipeline
+        self.mshpController.vtController.current_pipeline = self.mshpController.vtPipeline
+        
+        #print "**** should update mashup pipeline view "
+        
+        #self.pipeline_view.scene().setupScene(self.mshpController.vtPipeline)
+        self.pipeline_view.scene().clear()
+        self.pipeline_view.version_changed()
+        self.pipeline_view.zoomToFit()
+        self.pipeline_view.updateAnnotatedIds(
+                        self.mshpController.vtPipeline)
+        #_app.notify('mashup_pipeline_view_set')
+        
+    def updateMshpVersion(self, version):
+        #print "will update alias param view"
+        self.parameter_panel.set_pipeline(
+                        self.mshpController.vtPipeline)
+        self.pipeline_view.version_changed()
+        
+    def zoomToFit(self):
+        if self.pipeline_view:
+            self.pipeline_view.zoomToFit()
+            
+    def aliasChanged(self, param):
+        from vistrails.gui.vistrails_window import _app
+        _app.notify('alias_changed', param)
+        
+################################################################################
+
+class QAliasParameterPanel(QSearchTreeWindow):
+    """
+    QAliasParameterPanel is a special widget for displaying methods and 
+    parameters inside a pipeline that allow changing aliases
+    
+    """
+    def createTreeWidget(self):
+        """ createTreeWidget() -> QModuleTreeWidget
+        Return the search tree widget for this window
+        
+        """
+        self.setWindowTitle("Parameter Aliases")
+        return QAliasParameterTreeWidget(self)
+
+    def set_pipeline(self, pipeline):
+        self.pipeline = pipeline
+        self.treeWidget.updateFromPipeline(pipeline)
+        
+################################################################################
+class QAliasParameterTreeWidget(QSearchTreeWidget):
+    """
+    QAliasParameterTreeWidget is a subclass of QSearchTreeWidget to display all
+    Vistrails Module
+    
+    """
+    #signals
+    aliasChanged = pyqtSignal(InstanceObject)
+    
+    def __init__(self, parent=None):
+        """ QAliasParameterTreeWidget(parent: QWidget) -> QParameterTreeWidget
+        Set up size policy and header
+
+        """
+        QSearchTreeWidget.__init__(self, parent)
+        self.header().hide()
+        self.setRootIsDecorated(False)
+        self.delegate = QAliasParameterTreeWidgetItemDelegate(self, self)
+        self.setItemDelegate(self.delegate)
+        self.aliasNames = []
+        self.itemDoubleClicked.connect(self.changeAlias)
+    def updateFromPipeline(self, pipeline):
+        """ updateFromPipeline(pipeline: Pipeline) -> None
+        Read the list of aliases and parameters from the pipeline
+        
+        """
+        self.clear()
+        if not pipeline:
+            return
+
+        # Update the aliases
+#        if len(pipeline.aliases)>0:
+#            aliasRoot = QParameterTreeWidgetItem(None, self, ['Aliases'])
+#            aliasRoot.setFlags(QtCore.Qt.ItemIsEnabled,
+#                               )
+#            for (alias, info) in pipeline.aliases.iteritems():
+#                ptype, pId, parentType, parentId, _ = info
+#                parameter = pipeline.db_get_object(ptype, pId)
+#                v = parameter.strValue
+#                aType = parameter.type
+#                aIdentifier = parameter.identifier
+#                aNamespace = parameter.namespace
+#                label = ['%s = %s' % (alias, v)]
+#                pInfo = InstanceObject(type=aType,
+#                                      identifier=aIdentifier,
+#                                      namespace=aNamespace,
+#                                      value=v,
+#                                      id=pId,
+#                                      dbtype=ptype,
+#                                      parent_dbtype=parentType,
+#                                      parent_id=parentId,
+#                                      is_alias=True)
+#                aliasItem = QParameterTreeWidgetItem((alias, [pInfo]),
+#                                                     aliasRoot, label)
+#            aliasRoot.setExpanded(True)
+            
+        # Now go through all modules and functions
+        self.aliasNames = pipeline.aliases.keys()
+        inspector = PipelineInspector()
+        inspector.inspect_ambiguous_modules(pipeline)
+        sortedModules = sorted(pipeline.modules.iteritems(),
+                               key=lambda item: item[1].name)
+        for mId, module in sortedModules:
+            if len(module.functions)>0:
+                mLabel = [module.name]
+                moduleItem = None
+                for fId in xrange(len(module.functions)):
+                    function = module.functions[fId]
+                    if len(function.params)==0: continue
+                    if moduleItem==None:
+                        if inspector.annotated_modules.has_key(mId):
+                            annotatedId = inspector.annotated_modules[mId]
+                            moduleItem = QAliasParameterTreeWidgetItem(annotatedId,
+                                                                       self, mLabel)
+                        else:
+                            moduleItem = QAliasParameterTreeWidgetItem(None,
+                                                                  self, mLabel)
+                    #v = ', '.join([p.strValue for p in function.params])
+                    label = ['%s'%function.name]
+                    
+                    pList = [InstanceObject(type=function.params[pId].type,
+                                           identifier=function.params[pId].identifier,
+                                           namespace=function.params[pId].namespace,
+                                           value=function.params[pId].strValue,
+                                           id=function.params[pId].real_id,
+                                           dbtype=ModuleParam.vtType,
+                                           parent_dbtype=function.vtType,
+                                           parent_id=function.real_id,
+                                           alias=function.params[pId].alias,
+                                           mId=mId)
+                             for pId in xrange(len(function.params))]
+                    mName = module.name
+                    if moduleItem.parameter!=None:
+                        mName += '(%d)' % moduleItem.parameter
+                    fName = '%s :: %s' % (mName, function.name)
+                    mItem = QAliasParameterTreeWidgetItem((fName, pList),
+                                                     moduleItem,
+                                                     label)
+                if moduleItem:
+                    moduleItem.setExpanded(True)
+                    
+    @pyqtSlot(QtGui.QTreeWidgetItem, int)    
+    def changeAlias(self, item, column ):
+        """ itemClicked(item:  , column: int) -> None        
+        If mouse click on the item, show up a dialog to change/add
+        the alias name
+        
+        """
+        if isinstance(item.parameter, InstanceObject):
+            (text, ok) = QtGui.QInputDialog.getText(self,
+                                                    'Set Parameter Alias',
+                                                    'Enter the parameter alias',
+                                                    QtGui.QLineEdit.Normal,
+                                                    item.parameter.alias)
+            while ok and str(text) in self.aliasNames:
+                msg =" This alias is already being used.\
+ Please enter a different parameter alias "
+                (text, ok) = QtGui.QInputDialog.getText(self,
+                                                        'Set Parameter Alias',
+                                                        msg,
+                                                        QtGui.QLineEdit.Normal,
+                                                        text)
+            if ok and item.parameter.alias != str(text):
+                item.parameter.alias = str(text)
+                item.updateAlias()
+                self.aliasChanged.emit(item.parameter)
+            
+            
+        
+class QAliasParameterTreeWidgetItemDelegate(QtGui.QItemDelegate):
+    """    
+    QAliasParameterTreeWidgetItemDelegate will override the original
+    QTreeWidget paint function to draw buttons for top-level item
+    similar to QtDesigner. This mimics
+    Qt/tools/designer/src/lib/shared/sheet_delegate, which is only a
+    private class from QtDesigned.
+    
+    """
+    def __init__(self, view, parent):
+        """ QParameterTreeWidgetItemDelegate(view: QTreeView,
+                                          parent: QWidget)
+                                          -> QParameterTreeWidgetItemDelegate
+        Create the item delegate given the tree view
+        
+        """
+        QtGui.QItemDelegate.__init__(self, parent)
+        self.treeView = view
+
+    def paint(self, painter, option, index):
+        """ painter(painter: QPainter, option QStyleOptionViewItem,
+                    index: QModelIndex) -> None
+        Repaint the top-level item to have a button-look style
+        
+        """
+        model = index.model()
+        if (model.parent(index).isValid()==False or 
+            model.parent(index).parent().isValid()==False):
+            style = self.treeView.style()
+            r = option.rect
+            textrect = QtCore.QRect(r.left() + 10,
+                                    r.top(),
+                                    r.width() - 10,
+                                    r.height())
+            font = painter.font()
+            font.setBold(True)
+            painter.setFont(font)
+            text = option.fontMetrics.elidedText(
+                model.data(index, QtCore.Qt.DisplayRole),
+                QtCore.Qt.ElideMiddle, 
+                textrect.width()-10)
+            style.drawItemText(painter,
+                               textrect,
+                               QtCore.Qt.AlignLeft,
+                               option.palette,
+                               self.treeView.isEnabled(),
+                               text)
+            painter.setPen(QtGui.QPen(QtCore.Qt.black))
+            fm = QtGui.QFontMetrics(font)
+            size = fm.size(QtCore.Qt.TextSingleLine, text)
+            #painter.drawLine(textrect.left()-5,
+            #                 textrect.bottom()-1,
+            #                 textrect.left()+size.width()+5,
+            #                 textrect.bottom()-1)
+
+            annotatedId = model.data(index, QtCore.Qt.UserRole+1)            
+            if annotatedId:
+                idRect = QtCore.QRect(
+                    QtCore.QPoint(textrect.left()+size.width()+5,
+                                  textrect.top()),
+                    textrect.bottomRight())
+                QAnnotatedPipelineView.drawId(painter, idRect,
+                                              annotatedId,
+                                              QtCore.Qt.AlignLeft |
+                                              QtCore.Qt.AlignVCenter)
+        else:
+            QtGui.QItemDelegate.paint(self, painter, option, index)
+
+    def sizeHint(self, option, index):
+        """ sizeHint(option: QStyleOptionViewItem, index: QModelIndex) -> None
+        Take into account the size of the top-level button
+        
+        """
+        return (QtGui.QItemDelegate.sizeHint(self, option, index) +
+                QtCore.QSize(2, 2))
+            
+
+class QAliasParameterTreeWidgetItem(QtGui.QTreeWidgetItem):
+    """
+    QParameterTreeWidgetItem represents module on QParameterTreeWidget
+    
+    """
+    def __init__(self, info, parent, labelList):
+        """ QAliasParameterTreeWidgetItem(info: (str, []),
+                                     parent: QTreeWidgetItem
+                                     labelList: string)
+                                     -> QParameterTreeWidget
+                                     
+        Create a new tree widget item with a specific parent and
+        labels. info describing a set of parameters as follow:
+        (name, [InstanceObject]):
+           name  = Name of the parameter set (alias or function)
+        If this item is a top-level item, info can either be None or
+        an integer specifying the annotated id of this module
+
+        """
+        self.parameter = info
+        QtGui.QTreeWidgetItem.__init__(self, parent, labelList)
+        if isinstance(self.parameter, int):
+            self.setData(0, QtCore.Qt.UserRole+1, self.parameter)
+        elif isinstance(self.parameter, tuple):
+            for param in self.parameter[1]:
+                label = ['']
+                item = QAliasParameterTreeWidgetItem(param, self, label)
+                item.setFlags(QtCore.Qt.ItemIsEnabled|
+                              QtCore.Qt.ItemIsSelectable)
+                item.updateAlias()
+            self.setExpanded(True)
+    
+    def updateAlias(self):    
+        if isinstance(self.parameter, InstanceObject):
+            if self.parameter.alias != '':
+                self.setText(0,'%s(%s):%s'%(self.parameter.alias, 
+                                          self.parameter.type,
+                                          self.parameter.value))
+                self.setIcon(0,CurrentTheme.MASHUP_ALIAS_ICON)
+            else:
+                self.setText(0,'%s:%s'%(self.parameter.type,
+                                      self.parameter.value))
+                self.setIcon(0,QtGui.QIcon())
diff --git a/vistrails/gui/mashups/controller.py b/vistrails/gui/mashups/controller.py
new file mode 100644
index 0000000..17a12b0
--- /dev/null
+++ b/vistrails/gui/mashups/controller.py
@@ -0,0 +1,87 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4.QtCore import QObject, pyqtSignal, pyqtSlot
+
+from vistrails.core.mashup.controller import MashupController as BaseController
+from vistrails.core.mashup.alias import Alias
+from vistrails.gui.utils import show_warning
+
+class MashupController(BaseController, QObject):
+    #signals
+    stateChanged = pyqtSignal()
+    versionChanged = pyqtSignal(int)
+    
+    def __init__(self, originalController, vt_controller, vt_version, mshptrail=None):
+        QObject.__init__(self)
+        BaseController.__init__(self, originalController, vt_controller, vt_version, mshptrail)
+        self.name = ''
+        self.currentMashupView = None
+        
+    def setChanged(self, on):
+        BaseController.setChanged(self, on)
+        self.stateChanged.emit()
+        
+    def setCurrentVersion(self, version, quiet=True):
+        BaseController.setCurrentVersion(self, version)
+        if not quiet:
+            self.stateChanged.emit()
+            self.versionChanged.emit(version)
+            
+    def updateCurrentTag(self, name):
+        if BaseController.updateCurrentTag(self, name) == False:
+            show_warning('Name Exists',
+                         "There is already another version named '%s'.\n"
+                         "Please enter a different one." % name)
+            return False
+        else:
+            return True
+        
+    @pyqtSlot(str)
+    def removeAlias(self, name):
+        BaseController.removeAlias(self, name)
+    
+    @pyqtSlot(Alias)
+    def updateAlias(self, alias):
+        BaseController.updateAlias(self, alias)
+        
+    def moveTag(self, from_version, to_version, name):
+        BaseController.moveTag(self, from_version, to_version, name)
+        self.stateChanged.emit()
+        
+    def execute(self, params):
+        from vistrails.gui.vistrails_window import _app
+        result = BaseController.execute(self, params)
+        _app.notify('execution_updated')
+        return result
\ No newline at end of file
diff --git a/vistrails/gui/mashups/mashup_app.py b/vistrails/gui/mashups/mashup_app.py
new file mode 100644
index 0000000..6f8bf17
--- /dev/null
+++ b/vistrails/gui/mashups/mashup_app.py
@@ -0,0 +1,624 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSignal
+
+from vistrails.gui.mashups.mashups_widgets import (QAliasSliderWidget, QDropDownWidget,
+                                         QAliasNumericStepperWidget)
+from vistrails.gui.utils import show_warning, TestVisTrailsGUI
+
+spreadsheet = __import__('vistrails.packages.spreadsheet', globals(), locals(), 
+                         ['spreadsheet_controller'], -1) 
+spreadsheetController = spreadsheet.spreadsheet_controller.spreadsheetController
+
+
+class QMashupAppMainWindow(QtGui.QMainWindow):
+    #signals
+    appWasClosed = pyqtSignal(QtGui.QMainWindow)
+    
+    def __init__(self, parent=None, vistrail_view=None, dumpcells=False, 
+                 controller=None, version=-1):
+        """ QMashupAppMainWindow()
+        Initialize an app window from a mashup.
+
+        """
+        # Constructing the main widget
+        QtGui.QMainWindow.__init__(self, parent)
+        self.vtkCells = []
+        self.setStatusBar(QtGui.QStatusBar(self))
+    
+        # Central widget
+        centralWidget = QtGui.QWidget()
+        self.mainLayout = QtGui.QVBoxLayout()
+        self.mainLayout.setMargin(0)
+        self.mainLayout.setSpacing(5)
+        centralWidget.setLayout(self.mainLayout)
+        self.setCentralWidget(centralWidget)
+        self.numberOfCells = 0
+        self.is_executing = False
+        self.sequenceOption = False
+        self.steps = []
+        self.isLooping = False
+        #self.resize(100,100)
+        self.dumpcells = dumpcells
+        self.view = vistrail_view
+        if controller:
+            self.controller = controller
+            self.mshptrail = controller.mshptrail
+            if version == -1:
+                self.currentMashup = self.controller.currentMashup
+            else:
+                self.currentMashup = self.mshptrail.getMashup(version)
+            self.setWindowTitle('%s Mashup'%self.controller.getMashupName(version))
+        else:
+            self.setWindowTitle('Mashup')
+
+        # Assign "hidden" shortcut
+        self.editingModeAct = QtGui.QAction("Chang&e Layout",
+                                 self, shortcut="Ctrl+E",
+                                 statusTip="Change the layout of the widgets",
+                                 triggered=self.toggleEditingMode)
+        #self.editingModeShortcut = QtGui.QShortcut(QtGui.QKeySequence('Ctrl+E'), self)
+        #self.connect(self.editingModeShortcut, QtCore.SIGNAL('activated()'),
+        #             self.toggleEditingMode)
+        self.editing = False
+        # Constructing alias controls
+        self.controlDocks = []
+        # Show here to make sure XDisplay info is correct (for VTKCell)
+        self.show()
+
+        spreadsheetController.setEchoMode(True)        
+        #will run to get Spreadsheet Cell events
+        (cellEvents, errors) = self.runAndGetCellEvents(useDefaultValues=True)
+        if cellEvents:
+            self.numberOfCells = len(cellEvents)
+            self.initCells(cellEvents)
+        if len(errors) > 0:
+            show_warning("VisTrails::Mashup Preview", 
+                         "There was a problem executing the pipeline: %s." %
+                         errors)
+        # Construct the controllers for aliases
+        self.controlDocks = {}
+        self.cellControls = {}
+        self.aliasWidgets = {}
+        self.initControls()
+        
+        if self.currentMashup.layout != None:
+            self.restoreState(QtCore.QByteArray.fromPercentEncoding(
+                                QtCore.QByteArray(self.currentMashup.layout)))
+        
+        if self.currentMashup.geometry != None:
+            self.restoreGeometry(QtCore.QByteArray.fromPercentEncoding(
+                              QtCore.QByteArray(self.currentMashup.geometry)))
+        else:
+            self.resize(self.sizeHint())
+                    
+        # Constructing buttons
+        buttonDock = QCustomDockWidget('Control Buttons', self)
+        buttonWidget = QtGui.QWidget(buttonDock)
+        buttonWidget.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                                   QtGui.QSizePolicy.Preferred)
+        buttonLayout = QtGui.QGridLayout()
+        buttonWidget.setLayout(buttonLayout)
+        buttonLayout.setMargin(5)
+        self.cb_auto_update = QtGui.QCheckBox("Turn on auto-update",
+                                              self.centralWidget())
+        self.cb_auto_update.setChecked(False)
+        self.cb_loop_sequence = QtGui.QCheckBox("Render all steps in '%s'" % \
+           (self.sequenceOption.alias.name if self.sequenceOption else 'None'),
+            self.centralWidget())
+        self.cb_loop_sequence.setChecked(False)
+        self.cb_loop_sequence.setVisible(self.sequenceOption is not False)
+        self.cb_loop_sequence.setToolTip(
+                        "Render each step of this stepper for fast switching")
+        self.cb_loop_int = QtGui.QCheckBox("Interactive Steps",
+                                           self.centralWidget())
+        self.cb_loop_int.setChecked(False)
+        self.cb_loop_int.setVisible(False)
+        self.cb_loop_int.setToolTip(
+                 "Show complete result of each step instead of static images")
+        self.cb_loop_sequence.clicked.connect(self.cb_loop_int.setVisible)
+        self.cb_keep_camera = QtGui.QCheckBox("Keep camera position",
+                                              self.centralWidget())
+        self.cb_keep_camera.setChecked(True)
+        self.connect(self.cb_auto_update,
+                     QtCore.SIGNAL("stateChanged(int)"),
+                     self.auto_update_changed)
+        self.connect(self.cb_loop_int,
+                     QtCore.SIGNAL("stateChanged(int)"),
+                     self.loop_int_changed)
+        self.loopButton = QtGui.QPushButton("&Loop", self.centralWidget())
+        self.loopButton.setToolTip("Loop automatically through steps")
+        self.loopButton.setCheckable(True)
+        self.loopButton.setVisible(self.sequenceOption is not False)
+        self.updateButton = QtGui.QPushButton("&Update", self.centralWidget())
+        if self.dumpcells:
+            self.quitButton = QtGui.QPushButton("&Save", self.centralWidget())
+            self.connect(self.quitButton,
+                         QtCore.SIGNAL('clicked(bool)'),
+                         self.saveAndExport)
+        else:
+            self.quitButton = QtGui.QPushButton("&Quit", self.centralWidget())
+            self.connect(self.quitButton,
+                         QtCore.SIGNAL('clicked(bool)'),
+                         self.close)
+        buttonLayout.setColumnStretch(0, 1)
+        if self.sequenceOption:
+            sequenceLayout = QtGui.QHBoxLayout()
+            sequenceLayout.setMargin(5)
+            sequenceLayout.addWidget(self.cb_loop_int)
+            sequenceLayout.addWidget(self.cb_loop_sequence)
+            buttonLayout.addLayout(sequenceLayout, 0, 0, QtCore.Qt.AlignRight)
+        buttonLayout.addWidget(self.cb_auto_update, 0, 1, QtCore.Qt.AlignLeft)
+        buttonLayout.addWidget(self.cb_keep_camera, 0, 2, 1, 2, QtCore.Qt.AlignLeft) 
+        if self.sequenceOption:
+            buttonLayout.addWidget(self.loopButton, 1, 1, QtCore.Qt.AlignRight)
+            self.loopButton.setEnabled(False)
+        buttonLayout.addWidget(self.updateButton, 1, 2, QtCore.Qt.AlignRight)
+        buttonLayout.addWidget(self.quitButton, 1, 3, QtCore.Qt.AlignRight)
+        self.connect(self.updateButton,
+                     QtCore.SIGNAL('clicked(bool)'),
+                     self.updateButtonClick)
+        if self.sequenceOption:
+            self.connect(self.loopButton,
+                         QtCore.SIGNAL('clicked(bool)'),
+                         self.loopButtonClick)
+        buttonDock.setWidget(buttonWidget)
+        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, buttonDock)
+        self.controlDocks["__buttons__"] = buttonDock
+        
+        self.saveAllAct = QtGui.QAction("S&ave Combined", self, 
+                                        shortcut=QtGui.QKeySequence.SelectAll,
+                                        statusTip="Save combined images to disk", 
+                                        triggered=self.saveAllEvent)
+        self.saveAct = QtGui.QAction("&Save Each", self, 
+                                     shortcut=QtGui.QKeySequence.Save,
+                                     statusTip="Save separate images to disk", 
+                                     triggered=self.saveEventAction)
+        self.showBuilderAct = QtGui.QAction("VisTrails Main Window", self,
+                                            statusTip="Show VisTrails Main Window",
+                                            triggered=self.showBuilderWindow)
+        self.createMenus()
+        self.lastExportPath = ''
+                    
+    def createMenus(self):
+        self.fileMenu = self.menuBar().addMenu("&File")
+        self.fileMenu.addAction(self.saveAct)
+        self.fileMenu.addAction(self.saveAllAct)
+        
+        self.viewMenu = self.menuBar().addMenu("&View")
+        self.viewMenu.addAction(self.editingModeAct)
+        
+        self.windowMenu = self.menuBar().addMenu("&Window")
+        self.windowMenu.addAction(self.showBuilderAct)
+        
+    def runAndGetCellEvents(self, useDefaultValues=False):
+        spreadsheetController.setEchoMode(True)        
+        #will run to get Spreadsheet Cell events
+        cellEvents = []
+        errors = []
+        try:
+            (res, errors) = self.run(useDefaultValues)
+            if res:
+                cellEvents = spreadsheetController.getEchoCellEvents()
+        except Exception, e:
+            import traceback
+            print "Executing pipeline failed:", str(e), traceback.format_exc()
+        finally:
+            spreadsheetController.setEchoMode(False)
+            
+        return (cellEvents, errors)
+    
+    def updateCells(self, info=None):
+        # check if we should create a sequence
+        if self.cb_loop_sequence.isChecked():
+            return self.updateCellsLoop(info)
+        self.is_executing = True
+        (cellEvents, errors) = self.runAndGetCellEvents()
+        self.is_executing = False
+        if len(cellEvents) != self.numberOfCells:
+            raise RuntimeError(
+                    "The number of cells has changed (unexpectedly) "
+                    "(%d vs. %d)!\n"
+                    "Pipeline results: %s" % (len(cellEvents),
+                                              self.numberOfCells,
+                                              errors))
+        #self.SaveCamera()
+        for i in xrange(self.numberOfCells):
+            camera = []
+            if (hasattr(self.cellWidgets[i],"getRendererList") and 
+                self.cb_keep_camera.isChecked()):
+                for ren in self.cellWidgets[i].getRendererList():
+                    camera.append(ren.GetActiveCamera())
+                self.cellWidgets[i].updateContents(cellEvents[i].inputPorts, camera)
+                #self.cellWidgets[i].updateContents(cellEvents[i].inputPorts)
+            else:
+                self.cellWidgets[i].updateContents(cellEvents[i].inputPorts)
+
+    def updateCellsLoop(self, info=None):
+        """ Run workflow for each step in the loop sequence and collect results.
+        """
+        interactive = self.cb_loop_int.isChecked()
+        slider = self.sequenceOption.value
+        if info and info[1][0] == slider:
+            # User is moving the slider, so we use the existing result
+            if interactive:
+                if slider.value() < len(self.steps):
+                    self.updateRenderedCells(slider.value())
+            else:
+                for i in xrange(self.numberOfCells):
+                    self.cellWidgets[i].setPlayerFrame(slider.value())
+            return
+        
+        if not interactive:
+            for i in xrange(self.numberOfCells):
+                self.cellWidgets[i].clearHistory()
+
+        self.is_executing = True
+        self.steps = []
+        old_value = slider.value()
+        value = slider.minimum()
+        slider.setValue(value)
+
+        while True:
+            (cellEvents, errors) = self.runAndGetCellEvents()
+            if len(cellEvents) != self.numberOfCells:
+                raise RuntimeError(
+                        "The number of cells has changed (unexpectedly) "
+                        "(%d vs. %d)!\n"
+                        "Pipeline results: %s" % (len(cellEvents),
+                                                  self.numberOfCells,
+                                                  errors))
+            if interactive:
+                self.steps.append([])
+            else:
+                self.steps = [[]]
+            for i in xrange(self.numberOfCells):
+                self.steps[-1].append(cellEvents[i].inputPorts)
+
+            # show the result
+            self.updateRenderedCells(value if interactive else 0)
+            self.is_executing = True
+                
+            if value >= slider.maximum():
+                break
+            value += slider.singleStep()
+            slider.setValue(value)
+        self.is_executing = False
+        slider.setValue(old_value)
+        self.loopButton.setEnabled(True)
+        
+    def updateRenderedCells(self, value):
+        """ Show the cell specified by slider info
+        """
+        self.is_executing = True
+        for i in xrange(self.numberOfCells):
+            camera = []
+            if (hasattr(self.cellWidgets[i],"getRendererList") and 
+                self.cb_keep_camera.isChecked()):
+                for ren in self.cellWidgets[i].getRendererList():
+                    camera.append(ren.GetActiveCamera())
+                self.cellWidgets[i].updateContents(self.steps[value][i], camera)
+            else:
+                self.cellWidgets[i].updateContents(self.steps[value][i])
+        self.is_executing = False
+
+    def updateButtonClick(self):
+        self.updateButton.setEnabled(False)
+        try:
+            self.updateCells()
+        finally:
+            self.updateButton.setEnabled(True)
+
+    def loopButtonClick(self, toggled):
+        self.updateButton.setEnabled(not toggled)
+        self.cb_loop_int.setEnabled(not toggled)
+        self.cb_loop_sequence.setEnabled(not toggled)
+        self.cb_auto_update.setEnabled(not toggled)
+        if self.cb_loop_int.isChecked():
+            if toggled:
+                if self.isLooping:
+                    self.killTimer(self.isLooping)
+                self.isLooping = self.startTimer(200)
+            elif self.isLooping:
+                self.killTimer(self.isLooping)
+                self.isLooping = None
+        else:
+            for cell in self.cellWidgets:
+                if toggled:
+                    cell.startPlayer()
+                else:
+                    cell.stopPlayer()
+            
+
+    def timerEvent(self, event):
+        if self.steps:
+            stepper = self.sequenceOption.value
+            if stepper.value() == stepper.maximum():
+                stepper.setValue(stepper.minimum())
+            else:
+                stepper.setValue(stepper.value() + stepper.singleStep())
+            if stepper.value() >= len(self.steps):
+                self.loopButton.setChecked(False)
+                return
+
+            for i in xrange(self.numberOfCells):
+                self.cellWidgets[i].setAnimationEnabled(False)
+
+            self.updateRenderedCells(stepper.value())
+
+            for i in xrange(self.numberOfCells):
+                self.cellWidgets[i].setAnimationEnabled(True)
+
+    def toggleEditingMode(self):
+        if len(self.controlDocks) > 0:
+            for dock in self.controlDocks.itervalues():
+                dock.toggleTitleBar()
+            self.editing = not self.editing
+        if not self.editing:
+            self.saveSettings()
+               
+    def saveSettings(self):
+        layout = self.saveState().toPercentEncoding()
+        geom = self.saveGeometry().toPercentEncoding()
+            
+        self.currentMashup.layout = layout
+        self.currentMashup.geometry = geom
+        
+        self.controller.setChanged(True)
+        
+        #self.controller.writeMashuptrail()
+   
+    def closeEvent(self, event):
+        self.saveSettings()
+        self.appWasClosed.emit(self)
+        event.accept()
+        
+    def auto_update_changed(self, state):
+        if state == QtCore.Qt.Unchecked:
+            self.updateButton.setEnabled(True)
+            self.cb_loop_int.setEnabled(True)
+            self.cb_loop_sequence.setEnabled(True)
+            self.loopButton.setEnabled(True)
+            if self.cb_loop_sequence.isChecked() and not self.cb_loop_int.isChecked():
+                for i in xrange(self.numberOfCells):
+                    cell = self.cellWidgets[i]
+                    cell._player.hide()
+                    cell.show()
+
+        elif state == QtCore.Qt.Checked:
+            self.updateButton.setEnabled(False)
+            self.cb_loop_int.setEnabled(False)
+            self.cb_loop_sequence.setEnabled(False)
+            self.loopButton.setEnabled(False)
+            if self.cb_loop_sequence.isChecked() and not self.cb_loop_int.isChecked():
+                for i in xrange(self.numberOfCells):
+                    cell = self.cellWidgets[i]
+                    cell._player.setParent(cell.parent())
+                    cell._player.setGeometry(cell.geometry())
+                    self.cellWidgets[i].setPlayerFrame(self.sequenceOption.value.value())
+                    cell._player.raise_()
+                    cell._player.show()
+                    cell.hide()
+        
+    def loop_int_changed(self, state):
+            self.loopButton.setEnabled(False)
+            
+    def saveAll(self):
+        for w in self.widgets:
+            w.saveAll(self.dumpcells)
+            
+    def saveEach(self):
+        for w in self.widgets:
+            w.saveEach(self.dumpcells, self.frameNo)
+        
+    def saveEventAction(self, checked):
+        self.saveEvent()
+          
+    def saveEvent(self, folder=None):
+        if folder == None:
+            folder = QtGui.QFileDialog.getExistingDirectory(self,
+                                                        "Save images to...",
+                                                        self.lastExportPath,
+                                                        QtGui.QFileDialog.ShowDirsOnly)
+        if folder:
+            self.dumpcells = str(folder)
+            self.saveEach()
+            self.lastExportPath = str(folder)
+            
+    def saveAllEvent(self, folder=None):
+        if folder == None:
+            folder = QtGui.QFileDialog.getExistingDirectory(self,
+                                                        "Save images to...",
+                                                        self.lastExportPath,
+                                                        QtGui.QFileDialog.ShowDirsOnly)
+        if folder:
+            self.dumpcells = str(folder)
+            self.saveAll()
+            self.lastExportPath
+    
+    def saveAndExport(self, clicked=True):
+        self.saveAll()
+        
+    def initCells(self, cellEvents):
+        cellLayout = QtGui.QHBoxLayout()
+        self.mainLayout.addLayout(cellLayout, self.numberOfCells * 2)
+        self.cellWidgets = []
+        vtkCells = []
+        for event in cellEvents:
+            cellWidget = event.cellType(self.centralWidget())
+            if event.cellType.__name__ == 'QVTKWidget':
+                vtkCells.append(cellWidget)
+            cellWidget.updateContents(event.inputPorts)
+            cellWidget.show()
+            cellWidget.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                      QtGui.QSizePolicy.Expanding)
+            cellWidget.setMinimumSize(300, 100)
+            cellLayout.addWidget(cellWidget)
+            self.cellWidgets.append(cellWidget)
+        def getSelectedCellWidgets():
+            return vtkCells
+        for cellWidget in self.vtkCells:
+            cellWidget.getSelectedCellWidgets = getSelectedCellWidgets
+      
+    def initControls(self):
+        if len(self.currentMashup.alias_list) == 0:
+            return
+        
+        #Constructing alias controls
+        self.controlDocks = {}
+        self.cellControls = {}
+        self.toolbuttons = {}
+        
+        row = 0
+        for alias in self.currentMashup.alias_list:
+            dock = QCustomDockWidget(alias.name, #"Control for '%s'" % aliasName,
+                                      self)
+            vtparam = self.controller.getVistrailParam(alias)
+            
+            if alias.component.widget == 'slider':
+                aliasWidget = QAliasSliderWidget(alias, vtparam, dock)
+                # enables looping of 
+                if alias.component.seq:
+                    self.sequenceOption = aliasWidget
+
+
+            elif alias.component.widget == 'numericstepper':
+                aliasWidget = QAliasNumericStepperWidget(alias, vtparam, dock)
+            else:
+                aliasWidget = QDropDownWidget(alias, vtparam, dock)
+            
+            aliasWidget.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                                          QtGui.QSizePolicy.Maximum)
+            self.connect(aliasWidget,
+                             QtCore.SIGNAL("contentsChanged"),
+                             self.widget_changed)
+                
+            dock.setWidget(aliasWidget)
+            self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dock)
+            self.controlDocks[alias.name] = dock
+            self.cellControls[alias.name] = aliasWidget.value
+            row += 1
+            self.aliasWidgets[alias.name] = aliasWidget
+        
+        # Added a stretch space
+        stretchDock = QCustomDockWidget('Stretch Space', self)
+        stretch = QtGui.QWidget()
+        stretch.setLayout(QtGui.QVBoxLayout())
+        stretch.layout().addStretch()
+        stretchDock.setWidget(stretch)
+        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, stretchDock)
+        self.controlDocks["_stretch_"] = stretchDock
+            
+    def widget_changed(self, info):
+        if self.cb_auto_update.isChecked() and not self.is_executing:
+            self.updateCells(info)
+        
+            
+    def run(self, useDefaultValues=False):
+        
+        # Building the list of parameter values
+        params = []
+        if useDefaultValues:
+            for alias in self.currentMashup.alias_list:
+                params.append((alias.component.vttype, alias.component.vtid,
+                              alias.component.val))
+        else:
+            for (aliasName, edit) in self.cellControls.iteritems():
+                alias = self.currentMashup.getAliasByName(aliasName)
+                if hasattr(edit, 'contents'):
+                    val = str(edit.contents())
+                else:
+                    val =str(edit.text())
+                params.append((alias.component.vttype, alias.component.vtid,
+                              val))    
+        results = self.controller.execute(params)[0]
+        result = results[0]
+        (objs, errors, executed) = (result.objects, result.errors,
+                                                   result.executed)
+        if len(errors) > 0:
+            print '=== ERROR EXECUTING PIPELINE ==='
+            print errors
+            return (False, errors)
+        return (True, [])
+    
+    def showBuilderWindow(self):
+        from vistrails.gui.vistrails_window import _app
+        _app.show()
+            
+class QCustomDockWidget(QtGui.QDockWidget):
+    def __init__(self, title, parent=None):
+        QtGui.QDockWidget.__init__(self, title, parent)
+        self.setObjectName(title)
+        self.setFeatures(QtGui.QDockWidget.DockWidgetClosable | 
+                         QtGui.QDockWidget.DockWidgetMovable)
+        self.emptyTitleBar = QtGui.QWidget()
+        self.titleBarVisible = True
+        self.hideTitleBar()
+
+    def showTitleBar(self):
+        self.titleBarVisible = True
+        self.setFeatures(QtGui.QDockWidget.DockWidgetClosable | 
+                         QtGui.QDockWidget.DockWidgetMovable)
+        self.setMaximumHeight(524287)
+        self.setTitleBarWidget(None)
+
+    def hideTitleBar(self):
+        self.titleBarVisible = False
+        self.setFeatures(QtGui.QDockWidget.NoDockWidgetFeatures)
+        self.setTitleBarWidget(self.emptyTitleBar)
+
+    def toggleTitleBar(self):
+        if self.titleBarVisible:
+            self.hideTitleBar()
+        else:
+            self.showTitleBar()
+
+################################################################################
+# Testing
+
+
+class TestMashupApp(TestVisTrailsGUI):
+
+    def test_load_mashup(self):
+        import vistrails.core.system
+        filename = (vistrails.core.system.vistrails_root_directory() + 
+                    '/tests/resources/spx_loop.vt')
+        view = vistrails.api.open_vistrail_from_file(filename)
+        id = "d5026457-de6c-11e2-b074-3c07543dba07"
+        mashup = view.get_mashup_from_mashuptrail_id(id, "loop")
+        view.open_mashup(mashup)
+        mashup = view.get_mashup_from_mashuptrail_id(id, "no loop")
+        view.open_mashup(mashup)
diff --git a/vistrails/gui/mashups/mashup_view.py b/vistrails/gui/mashups/mashup_view.py
new file mode 100644
index 0000000..29a3367
--- /dev/null
+++ b/vistrails/gui/mashups/mashup_view.py
@@ -0,0 +1,401 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSignal, pyqtSlot
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.mashups.mashups_manager import MashupsManager
+from vistrails.gui.mashups.alias_list import QAliasListPanel
+from vistrails.gui.utils import show_question, YES_BUTTON, NO_BUTTON, CANCEL_BUTTON
+
+class QMashupView(QtGui.QMainWindow, BaseView):
+    #signals
+    #mashupChanged = pyqtSignal()
+    
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        QtGui.QMainWindow.__init__(self, parent, f)
+        BaseView.__init__(self)
+        self.set_title("Mashup")
+        
+        self.controller = None
+        self.mshpController = None
+        self.createActions()
+        #Setting up a toolbar
+        self.createToolBar()
+        self.tab_to_stack_idx = {}
+        self.button_to_tab_idx = Bidict()
+        widget = QtGui.QWidget(self)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        self.tabBar = QtGui.QTabBar(self)
+        self.tabBar.setDocumentMode(True)
+        self.tabBar.setTabsClosable(False)
+        self.tabBar.setExpanding(False)
+        self.tabBar.currentChanged.connect(self.switchTab)
+        self.stack = QtGui.QStackedWidget(self)
+        layout.addWidget(self.tabBar)
+        layout.addWidget(self.stack)
+        widget.setLayout(layout)
+        self.setCentralWidget(widget)
+        self.createAliasPanelTab()
+        widget.setVisible(True)
+        #self.createPipelineTab()
+        self.setWindowTitle("Mashup Builder")
+        self.vtversion = -1
+        self.manager = MashupsManager.getInstance()
+        
+    def set_default_layout(self):
+        from vistrails.gui.mashups.mashups_inspector import QMashupsInspector
+        from vistrails.gui.mashups.alias_parameter_view import QAliasParameterView
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QMashupsInspector,
+             QtCore.Qt.RightDockWidgetArea: QAliasParameterView,
+             })
+            
+    def set_action_links(self):
+        self.action_links = \
+            {
+            }
+            
+    def set_action_defaults(self):
+        self.action_defaults['execute'] = [('setEnabled', False, False)]
+        
+    def set_controller(self, controller):
+        """set_controller(controller:VistrailController) -> None
+         This will set vistrail controller"""
+        if controller == self.controller:
+            return
+#        if self.controller is not None:
+#            self.disconnect(self.controller,
+#                             QtCore.SIGNAL('versionWasChanged'),
+#                             self.versionChanged)
+        self.controller = controller
+#        if self.controller:
+#            self.connect(self.controller,
+#                         QtCore.SIGNAL('versionWasChanged'),
+#                         self.versionChanged)
+        #print "      *** mashup view set vtController: ", controller
+        
+    def versionChanged(self, version):
+        window = self.window()
+        self.vtversion = version
+        if self.vtversion > -1:
+            window.qactions['mashup'].setEnabled(True)
+        else:
+            window.qactions['mashup'].setEnabled(False)
+        #print "      *** mashup view versionChanged ", self.vtversion
+        
+    def controllerChanged(self, controller):
+        if controller is self.controller:
+            return
+        from vistrails.gui.vistrails_window import _app
+        self.set_controller(controller)
+        self.versionChanged(self.controller.current_version)
+        if _app.get_current_tab() == self:
+            self.updateView()
+        
+    def updateView(self):
+        from vistrails.gui.vistrails_window import _app
+        if self.vtversion > 0:
+            if self.mshpController is not None:
+                try:
+                    self.mshpController.versionChanged.disconnect(self.mshpVersionChanged)
+                    self.mshpController.stateChanged.disconnect(self.mshpStateChanged)
+                    if self.mshpController.vtController is not None:
+                        self.disconnect(self.mshpController.vtController,
+                                        QtCore.SIGNAL('vistrailChanged()'),
+                                        self.mshpControllerVistrailChanged)
+                except Exception, e:
+                    print str(e)
+            self.controller.flush_delayed_actions()
+            self.vtversion = self.controller.current_version
+            self.mshpController = self.manager.createMashupController(self.controller,
+                                                                 self.vtversion)
+            #self.pipelineTab.set_controller(self.mshpController.vtController)
+            #self.pipelineTab.set_to_current()
+            self.mshpController.vtController.change_selected_version(self.vtversion)
+            self.connect(self.mshpController.vtController,
+                         QtCore.SIGNAL('vistrailChanged()'),
+                         self.mshpControllerVistrailChanged)
+            self.mshpController.versionChanged.connect(self.mshpVersionChanged)
+            self.mshpController.stateChanged.connect(self.mshpStateChanged)
+            self.aliasPanel.updateController(self.mshpController)
+            self.clearPreviewTabs()
+            _app.notify('mshpcontroller_changed', self.mshpController)
+    
+    def createActions(self):
+        self.saveAction = QtGui.QAction("Tag", self,
+                                        triggered=self.saveTriggered)
+        self.saveAction.setToolTip("Tag current mashup")
+        self.saveAction.setEnabled(False)
+        self.previewAction = QtGui.QAction("Preview",  self,
+                                           triggered=self.previewTriggered,
+                                           checkable=False)
+        self.previewAction.setToolTip("Preview current mashup")
+        
+    def createToolBar(self):
+        self.toolbar = QtGui.QToolBar(self)
+        
+        self.toolbar.addAction(self.previewAction)
+        self.toolbar.addSeparator()
+        self.toolbar.addAction(self.saveAction)
+        self.addToolBar(self.toolbar)
+        
+    def createAliasPanelTab(self):
+        self.aliasPanel = QAliasListPanel(parent=self)
+        
+        idx = self.stack.addWidget(self.aliasPanel)
+        self.aliasPanel.set_index(idx)
+        tab_idx = self.tabBar.addTab("Aliases")
+        self.aliasPanel.set_tab_idx(tab_idx)
+        self.tab_to_stack_idx[tab_idx] = idx
+        
+    def createPreviewTab(self, version):
+        
+        previewTab = QMashupViewTab(self.mshpController, version)
+#        self.refreshButton = QtGui.QPushButton("Refresh", self)
+#        self.refreshButton.setFlat(True)
+#        self.refreshButton.setEnabled(False)
+#        self.refreshButton.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
+#                                                           QtGui.QSizePolicy.Fixed))
+        previewApp = self.manager.createMashupApp(self.controller,
+                                                  self.mshpController.mshptrail,
+                                                  version)
+        previewApp.appWasClosed.connect(self.previewTabWasClosed)
+        
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(5)
+        #layout.addWidget(self.refreshButton, QtCore.Qt.AlignLeft)
+        layout.addWidget(previewApp)
+        previewTab.setLayout(layout)
+        idx = self.stack.addWidget(previewTab)
+        previewTab.set_index(idx)
+        tab_idx = self.tabBar.addTab("Preview: %s"%self.mshpController.getMashupName(version))
+        previewTab.set_tab_idx(tab_idx)
+        self.tab_to_stack_idx[tab_idx] = idx
+        closeButton = QMashupViewCloseButton(self.tabBar)
+        closeSide = self.tabBar.style().styleHint(
+                                   QtGui.QStyle.SH_TabBar_CloseButtonPosition,
+                                   None, self.tabBar)
+        closeButton.clicked.connect(self.closePreviewTab)
+        self.tabBar.setTabButton(tab_idx, closeSide, closeButton)
+        self.button_to_tab_idx[closeButton] = tab_idx
+        self.tabBar.setCurrentIndex(tab_idx)
+        
+    @pyqtSlot()
+    def closePreviewTab(self):
+        closeButton = self.sender()
+        tab_idx = self.button_to_tab_idx[closeButton]
+        self.tabBar.removeTab(tab_idx)
+        stack_idx = self.tab_to_stack_idx[tab_idx]
+        if stack_idx >= 0:
+            self.stack.removeWidget(self.stack.widget(stack_idx))
+        del self.button_to_tab_idx[closeButton]
+        self.updateIndexes(tab_idx, stack_idx)
+    
+    def previewTabWasClosed(self, previewApp):
+        previewTab = previewApp.parent()
+        tab_idx = previewTab.get_tab_idx()
+        stack_idx = self.tab_to_stack_idx[tab_idx]
+        if previewTab == self.stack.widget(stack_idx):
+            #this means the quit button was pressed 
+            closeButton = self.button_to_tab_idx.inverse[tab_idx]
+            self.tabBar.removeTab(tab_idx)
+            self.stack.removeWidget(self.stack.widget(stack_idx))
+            del self.button_to_tab_idx[closeButton]
+            self.updateIndexes(tab_idx, stack_idx)
+        
+    def updateIndexes(self, rm_tab_idx, rm_stack_idx):
+        for (b,tab_idx) in self.button_to_tab_idx.iteritems():
+            if tab_idx > rm_tab_idx:
+                self.button_to_tab_idx[b] -= 1
+        for idx in range(self.stack.count()):
+            if idx >= rm_stack_idx:
+                view = self.stack.widget(idx)
+                view.set_index(idx)
+                view.set_tab_idx(view.tab_idx-1)
+                
+    def clearPreviewTabs(self):
+        tab_idx = self.tabBar.count()-1
+        while self.tabBar.count() > 1:
+            idx = self.tab_to_stack_idx[tab_idx]
+            if isinstance(self.stack.widget(idx), QMashupViewTab):
+                self.tabBar.removeTab(tab_idx)
+                if idx >= 0:
+                    self.stack.removeWidget(self.stack.widget(idx))
+            tab_idx -= 1
+        
+    @pyqtSlot(int)    
+    def switchTab(self, index):
+        try:
+            self.stack.setCurrentIndex(self.tab_to_stack_idx[index])
+        except KeyError:
+            pass
+            
+    def previewTriggered(self):
+        self.createPreviewTab(self.mshpController.currentVersion)
+                
+    def saveTriggered(self):
+        (pid, pname) = self.mshpController.findFirstTaggedParent(self.mshpController.currentVersion)
+        if pid >= 1:
+            res = show_question("VisTrails::Mashups", 
+                """You've decided to keep a modified version of '%s'.
+Would you like to update it (this will move the tag to the current version)?
+Click on No to create a new tag.""" %pname,
+                [CANCEL_BUTTON, YES_BUTTON, NO_BUTTON], 0)
+            if res == YES_BUTTON:
+                #move tag
+                self.mshpController.moveTag(pid, 
+                                            self.mshpController.currentVersion,
+                                            pname)
+            elif res == NO_BUTTON:
+                # show createNewtag dialog
+                tag_exists = True
+                ok = True
+                while ok and tag_exists:
+                    (text, ok) = QtGui.QInputDialog.getText(self, "VisTrails::Mashups",
+                                                            "Enter a new tag:",
+                                                            text="")
+                    if ok and text:
+                        tag = str(text)
+                        if self.mshpController.updateCurrentTag(tag):
+                            tag_exists = False
+        
+    def mshpControllerVistrailChanged(self):
+        #print "*** vistrailChanged mashup view ", self.mshpController.vtController.current_version
+        pipeline = self.mshpController.vtController.current_pipeline
+        self.mshpController.updateAliasesFromPipeline(pipeline)
+        
+    def mshpVersionChanged(self, versionId):
+        from vistrails.gui.vistrails_window import _app
+        #print "*** mshpVersionChanged ", versionId
+        self.aliasPanel.updateVersion(versionId)
+        if not self.mshpController.versionHasTag(versionId):
+            self.saveAction.setEnabled(True)
+        else:
+            self.saveAction.setEnabled(False)
+        _app.notify('mshpversion_changed', versionId)
+            
+    def mshpStateChanged(self):
+        for idx in range(self.stack.count()):
+            view = self.stack.widget(idx)
+            if isinstance(view, QMashupViewTab):
+                tab_idx = view.tab_idx
+                self.tabBar.setTabText(tab_idx,
+                  "Preview: %s"%self.mshpController.getMashupName(view.version))
+                
+    def aliasChanged(self, param):
+        #print "mashupView aliasChanged", param
+        self.mshpController.updateAliasFromParam(param)
+        
+###############################################################################
+
+class QMashupViewTab(QtGui.QWidget, BaseView):
+    def __init__(self, mshpController, version, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        BaseView.__init__(self)
+        self.mshpController = mshpController
+        self.version = version
+    
+    def set_default_layout(self):
+        from vistrails.gui.mashups.mashups_inspector import QMashupsInspector
+        from vistrails.gui.mashups.alias_parameter_view import QAliasParameterView
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QMashupsInspector,
+             QtCore.Qt.RightDockWidgetArea: QAliasParameterView,
+             })
+    
+    def set_action_links(self):
+        self.action_links = \
+            {
+            }
+            
+    def set_action_defaults(self):
+        self.action_defaults = \
+            {#'execute' : [('setEnabled', False, False)],
+             }
+        
+###############################################################################
+
+class QMashupViewCloseButton(QtGui.QAbstractButton):
+    def __init__(self, parent):
+        QtGui.QAbstractButton.__init__(self)
+        self.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.setCursor(QtCore.Qt.ArrowCursor)
+        self.setToolTip("Close Tab")
+        self.resize(self.sizeHint())
+        
+    def sizeHint(self):
+        self.ensurePolished()
+        width = self.style().pixelMetric(QtGui.QStyle.PM_TabCloseIndicatorWidth, 
+                                         None, self)
+        height = self.style().pixelMetric(QtGui.QStyle.PM_TabCloseIndicatorHeight,
+                                          None, self)
+        return QtCore.QSize(width, height)
+    
+    def enterEvent(self, event):
+        if self.isEnabled():
+            self.update()
+        QtGui.QAbstractButton.enterEvent(self, event)
+        
+    def leaveEvent(self, event):
+        if self.isEnabled():
+            self.update()
+        QtGui.QAbstractButton.leaveEvent(self, event)
+        
+    def paintEvent(self, event):
+        p = QtGui.QPainter(self)
+        opt = QtGui.QStyleOption()
+        opt.init(self)
+        opt.state |= QtGui.QStyle.State_AutoRaise
+        if (self.isEnabled() and self.underMouse() and 
+            not self.isChecked() and not self.isDown()):
+            opt.state |= QtGui.QStyle.State_Raised
+        if self.isChecked():
+            opt.state |= QtGui.QStyle.State_On
+        if self.isDown():
+            opt.state |= QtGui.QStyle.State_Sunken
+        tb = self.parent()
+        if isinstance(tb, QtGui.QTabBar):
+            index = tb.currentIndex()
+            position = self.style().styleHint(QtGui.QStyle.SH_TabBar_CloseButtonPosition,
+                                              None, tb)
+            if tb.tabButton(index, position) == self:
+                opt.state |= QtGui.QStyle.State_Selected
+        self.style().drawPrimitive(QtGui.QStyle.PE_IndicatorTabClose, opt, p, 
+                                   self)
+        
diff --git a/vistrails/gui/mashups/mashups_inspector.py b/vistrails/gui/mashups/mashups_inspector.py
new file mode 100644
index 0000000..2590210
--- /dev/null
+++ b/vistrails/gui/mashups/mashups_inspector.py
@@ -0,0 +1,408 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import pyqtSignal, pyqtSlot
+import vistrails.core.system
+from vistrails.gui.common_widgets import QDockPushButton
+from vistrails.gui.mashups.mashups_manager import MashupsManager
+from vistrails.gui.utils import show_warning
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+class QMashupsInspector(QtGui.QFrame, QVistrailsPaletteInterface):
+    """
+    QMashupsInspector is a widget with tabs showing properties of the selected
+    mashuptrail. It contains a list of tagged mashups, and when a mashup is
+    selected, it shows the list of aliases in the mashup.
+    
+    """
+    #signals
+    mashupChanged = pyqtSignal()
+    def __init__(self, controller=None, parent=None):
+        """ QMashupsInspector(controller: MashupController,
+                            parent: QWidget) -> QMashupsInspector
+        
+        """
+        QtGui.QFrame.__init__(self, parent)
+        QVistrailsPaletteInterface.__init__(self)
+        #print "****** Inspector INIT"
+        self.set_title("Mashups Inspector")
+        self.setFrameStyle(QtGui.QFrame.Panel|QtGui.QFrame.Sunken)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        
+        #ok, this will store the original vistrail controller
+        self.controller = controller
+        self.mshpController = None #MashupController
+        self.manager = MashupsManager.getInstance()
+        
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(2)
+        layout.setSpacing(3)
+        self.workflowLabel = QtGui.QLabel("Workflow: ")
+        layout.addWidget(self.workflowLabel)
+        self.mashupsList = QMashupsListPanel(parent=self)
+        listLabel = QtGui.QLabel("Available Mashups:")
+        layout.addWidget(listLabel)
+        layout.addWidget(self.mashupsList)
+        
+        self.mashupInspector = QMashupProp(parent=self)
+        inspector_group = QtGui.QGroupBox("Mashup properties")
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(1)
+        g_layout.setSpacing(3)
+        g_layout.addWidget(self.mashupInspector)
+        inspector_group.setLayout(g_layout)
+        layout.addWidget(inspector_group)
+        self.setLayout(layout)
+                    
+    def updateVistrailController(self, controller):
+        self.controller = controller
+        #print "         *** Mashup Inspector: controller changed ", controller
+    
+    def updateVistrailVersion(self, version):
+        if self.controller:
+            self.vt_version = version
+                
+        #print "         *** Mashup Inspector: version changed ", version
+    
+    def updateMshpController(self, mshpController):
+        #print "     **** updateMshpController", mshpController
+        if (self.mshpController is not None and 
+            self.mshpController != mshpController):
+            self.mshpController.stateChanged.disconnect(self.stateChanged)
+        self.mshpController = mshpController
+        self.workflowLabel.setText(
+          "Workflow: <b>%s</b>"%self.mshpController.getVistrailWorkflowTag())
+        self.mshpController.stateChanged.connect(self.stateChanged)
+        self.mashupInspector.updateController(mshpController)
+        self.mashupsList.updateController(mshpController)
+        
+    def updateMshpVersion(self, version):
+        pass
+        #print "updateMshpVersion", version
+        
+    def stateChanged(self):
+        versionId = self.mshpController.currentVersion
+        self.mashupInspector.updateVersion(versionId)
+        self.mashupsList.stateChanged()
+        
+################################################################################        
+
+class QMashupProp(QtGui.QWidget):
+    def __init__(self, controller=None, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.controller = controller
+        self.versionNumber = -1
+        vLayout = QtGui.QVBoxLayout()
+        vLayout.setMargin(0)
+        vLayout.setSpacing(5)
+        self.setLayout(vLayout)
+        gLayout = QtGui.QGridLayout()
+        gLayout.setMargin(0)
+        gLayout.setSpacing(5)
+        gLayout.setColumnMinimumWidth(1,5)
+        gLayout.setRowMinimumHeight(0,24)
+        gLayout.setRowMinimumHeight(1,24)
+        gLayout.setRowMinimumHeight(2,24)
+        gLayout.setRowMinimumHeight(3,24)        
+        vLayout.addLayout(gLayout)
+        
+        #vtVersionLabel = QtGui.QLabel('Workflow:', self)
+        #gLayout.addWidget(vtVersionLabel, 0, 0, 1, 1)
+        
+        #self.vtVersionEdit = QtGui.QLabel('', self)
+        #gLayout.addWidget(self.vtVersionEdit, 0, 2, 1, 1)
+        
+        tagLabel = QtGui.QLabel('Mashup Tag:', self)
+        gLayout.addWidget(tagLabel, 0, 0, 1, 1)
+
+        editLayout = QtGui.QHBoxLayout()
+        editLayout.setMargin(0)
+        editLayout.setSpacing(2)
+        self.tagEdit = QtGui.QLineEdit()
+        tagLabel.setBuddy(self.tagEdit)
+        editLayout.addWidget(self.tagEdit)
+        self.tagEdit.setEnabled(False)
+
+        self.tagReset = QtGui.QToolButton(self)
+        self.tagReset.setIcon(QtGui.QIcon(
+                self.style().standardPixmap(QtGui.QStyle.SP_DialogCloseButton)))
+        self.tagReset.setIconSize(QtCore.QSize(12,12))
+        self.tagReset.setAutoRaise(True)
+        self.tagReset.setEnabled(False)
+        editLayout.addWidget(self.tagReset)
+
+        gLayout.addLayout(editLayout, 0, 2, 1, 1)
+
+        userLabel = QtGui.QLabel('User:', self)
+        gLayout.addWidget(userLabel, 1, 0, 1, 1)
+        
+        self.userEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.userEdit, 1, 2, 1, 1)
+
+        dateLabel = QtGui.QLabel('Date:', self)
+        gLayout.addWidget(dateLabel, 2, 0, 1, 1)
+
+        self.dateEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.dateEdit, 2, 2, 1, 1)
+        
+        self.btnExport = QDockPushButton("Export...")
+        gLayout.addWidget(self.btnExport, 3,0,1,3, QtCore.Qt.AlignHCenter)
+        
+        vLayout.addStretch()
+        
+        self.connect(self.tagEdit, QtCore.SIGNAL('editingFinished()'),
+                     self.tagFinished)
+        self.connect(self.tagEdit, QtCore.SIGNAL('textChanged(QString)'),
+                     self.tagChanged)
+        self.connect(self.tagReset, QtCore.SIGNAL('clicked()'),
+                     self.tagCleared)
+        self.connect(self.btnExport, QtCore.SIGNAL("clicked()"),
+                     self.exportMashupGUI)
+        
+    def updateController(self, mshpController):
+        self.controller = mshpController
+       
+        #print "QMashupProp.updateController ", self.controller, self.controller.currentVersion
+        if self.controller and self.controller.currentVersion > -1:
+            self.versionNumber = self.controller.currentVersion
+            self.tagEdit.setText(self.controller.mshptrail.getTagForActionId(
+                                            self.controller.currentVersion))
+            self.tagEdit.setEnabled(True)
+            action = self.controller.mshptrail.actionMap[self.controller.currentVersion]
+            self.userEdit.setText(action.user)
+            self.dateEdit.setText(action.date)
+            #self.vtEdit.setText(self.controller.getVistrailName())
+            #self.vtVersionEdit.setText(self.controller.getVistrailWorkflowTag())
+            return
+        else:
+            self.tagEdit.setEnabled(False)
+            self.tagReset.setEnabled(False)
+            self.tagEdit.setText('')
+            self.userEdit.setText('')
+            self.dateEdit.setText('')  
+            #self.vtEdit.setText('')
+            #self.vtVersionEdit.setText('')
+        
+    def updateVersion(self, versionNumber):
+        self.versionNumber = versionNumber
+        if self.controller and self.versionNumber > -1:
+            tagtext = self.controller.mshptrail.getTagForActionId(
+                                    self.versionNumber)
+            #print "updateVersion", versionNumber, tagtext
+            self.tagEdit.setText(tagtext)
+            action = self.controller.mshptrail.actionMap[self.versionNumber]
+            self.userEdit.setText(action.user)
+            self.dateEdit.setText(action.date)
+            #self.vtEdit.setText(self.controller.getVistrailName())
+            #self.vtVersionEdit.setText(self.controller.getVistrailWorkflowTag())
+        else:
+            self.tagEdit.setEnabled(False)
+            self.tagReset.setEnabled(False)
+            self.tagEdit.setText('')
+            self.userEdit.setText('')
+            self.dateEdit.setText('')  
+            #self.vtEdit.setText('')
+            #self.vtVersionEdit.setText('')
+            
+    def tagFinished(self):
+        """ tagFinished() -> None
+        Update the new tag to mashup
+        
+        """
+        if self.controller:
+            name = self.controller.mshptrail.getTagForActionId(self.versionNumber)
+            currentText = str(self.tagEdit.text())
+            if name != currentText:    
+                #print "will update current tag", currentText
+                self.controller.updateCurrentTag(currentText)
+                
+                
+    def tagChanged(self, text):
+        """ tagChanged(text: QString) -> None
+        Update the button state if there is text
+
+        """
+        self.tagReset.setEnabled(text != '')
+
+    def tagCleared(self):
+        """ tagCleared() -> None
+        Remove the tag
+        
+        """ 
+        self.tagEdit.setText('')
+        self.tagFinished()
+        
+    def exportMashupGUI(self):
+        if self.controller:
+            dialog = QMashupExportDialog(self)
+            if dialog.exec_() == QtGui.QDialog.Accepted:
+                result = dialog.btnPressed
+                fileName = QtGui.QFileDialog.getSaveFileName(
+                           self,
+                           "Export Mashup...",
+                           vistrails.core.system.vistrails_file_directory(),
+                           "VisTrail link files (*.vtl)")
+                if fileName:
+                    filename = str(fileName)
+                    res = MashupsManager.exportMashup(filename, 
+                                                      self.controller.originalController, 
+                                                      self.controller.mshptrail,
+                                                      self.controller.currentVersion,
+                                                      result)
+                    if not res:
+                        show_warning('VisTrails - Exporting Mashup',
+                    'There was an error and the mashup could not be exported.')
+                        
+################################################################################
+            
+class QMashupsListPanel(QtGui.QWidget):
+    def __init__(self, controller=None, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.controller = controller
+        self.mashupsList = QtGui.QListWidget()
+        self.mashupsList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+        self.mashupsList.itemSelectionChanged.connect(self.changeSelection)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(5)
+        layout.addWidget(self.mashupsList)
+        self.setLayout(layout)
+            
+    def updateController(self, mshpController):
+        self.controller = mshpController
+        self.stateChanged()
+                    
+    def stateChanged(self):
+        self.mashupsList.itemSelectionChanged.disconnect(self.changeSelection)
+        self.mashupsList.clear()
+        if self.controller:
+            self.tagMap = self.controller.mshptrail.getTagMap()
+            currentTag = self.controller.getCurrentTag()
+            tags = self.tagMap.keys()
+            latestversion = self.controller.mshptrail.getLatestVersion()
+            if not self.controller.versionHasTag(latestversion):
+                item = QMashupListPanelItem("<latest>",
+                                            latestversion,
+                                            self.mashupsList)
+                if latestversion == self.controller.currentVersion:
+                    item.setSelected(True)
+
+            if len(tags) > 0:
+                tags.sort()
+                for tag in tags:
+                    item = QMashupListPanelItem(str(tag),
+                                                self.tagMap[tag],
+                                                self.mashupsList)
+                    if tag == currentTag:
+                        item.setSelected(True)
+                        
+        self.mashupsList.itemSelectionChanged.connect(self.changeSelection)
+    
+    @pyqtSlot()
+    def changeSelection(self):
+        items = self.mashupsList.selectedItems()
+        if len(items) == 1:
+            version = items[0].version
+            if version != self.controller.currentVersion:
+                self.controller.setCurrentVersion(version, quiet=False)
+            
+    def selectMashup(self, name):
+        itemlist = self.mashupsList.findItems(name,
+                                              QtCore.Qt.MatchExactly)
+        if len(itemlist) == 1:
+            item = itemlist[0]
+            self.mashupsList.setCurrentItem(item)
+            
+################################################################################
+
+class QMashupListPanelItem(QtGui.QListWidgetItem):
+    def __init__(self, tag, version, parent=None):
+        QtGui.QListWidgetItem.__init__(self, tag, parent)
+        self.tag = tag
+        self.version = version
+        
+################################################################################
+
+class QMashupExportDialog(QtGui.QDialog):
+    FULLTREE = 0
+    MINIMAL = 1
+    LINK = 2
+    def __init__(self, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        self.setWindowTitle('VisTrails - Exporting Mashup')
+        dlgLayout = QtGui.QVBoxLayout()
+        gb = QtGui.QGroupBox("This will export the mashup as a file:")
+        gblayout = QtGui.QVBoxLayout()
+        self.rbMinimal = QtGui.QRadioButton("Include only this mashup\
+ and its original workflow")
+        self.rbMinimal.setChecked(True)
+        self.rbFullTree = QtGui.QRadioButton("Include full tree (this will also\
+ include other mashups)")
+        self.rbLink = QtGui.QRadioButton("As a link (this will work only on\
+ this machine)")
+        gblayout.addWidget(self.rbMinimal)
+        gblayout.addWidget(self.rbFullTree)
+        gblayout.addWidget(self.rbLink)
+        gb.setLayout(gblayout)
+        
+        btnOk = QtGui.QPushButton("OK")
+        btnCancel = QtGui.QPushButton("Cancel")
+        btnLayout = QtGui.QHBoxLayout()
+        btnLayout.addStretch()
+        btnLayout.addWidget(btnOk)
+        btnLayout.addWidget(btnCancel)
+        btnLayout.addStretch()
+        
+        dlgLayout.addWidget(gb)
+        dlgLayout.addLayout(btnLayout)
+        self.setLayout(dlgLayout)
+        
+        self.btnPressed = -1
+        self.connect(btnOk, QtCore.SIGNAL("clicked()"), self.btnOkPressed) 
+        self.connect(btnCancel, QtCore.SIGNAL("clicked()"), self.btnCancelPressed)
+        
+    def btnOkPressed(self):
+        if self.rbFullTree.isChecked():
+            self.btnPressed = self.FULLTREE
+        elif self.rbMinimal.isChecked():
+            self.btnPressed = self.MINIMAL
+        elif self.rbLink.isChecked():
+            self.btnPressed = self.LINK
+        self.accept()
+        
+    def btnCancelPressed(self):
+        self.btnPressed = -1
+        self.reject()
\ No newline at end of file
diff --git a/vistrails/gui/mashups/mashups_manager.py b/vistrails/gui/mashups/mashups_manager.py
new file mode 100644
index 0000000..80df3e4
--- /dev/null
+++ b/vistrails/gui/mashups/mashups_manager.py
@@ -0,0 +1,450 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import base64
+import copy
+import os
+import tempfile
+import uuid
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.vistrail_controller import VistrailController
+import vistrails.core.db.action
+from vistrails.core.vistrail.controller import VistrailController as BaseVistrailController
+from vistrails.gui.mashups.controller import MashupController
+from vistrails.core.mashup.mashup_trail import Mashuptrail
+from vistrails.core.mashup.mashup import Mashup
+from vistrails.core.utils import DummyView
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.db.services.locator import DBLocator
+from vistrails.core.db.locator import FileLocator
+import vistrails.core.system
+from vistrails.db.domain import IdScope
+from vistrails.core.system import get_elementtree_library
+from vistrails.db.services import io
+from vistrails.db.versions import currentVersion
+
+ElementTree = get_elementtree_library()
+
+############################################################################
+
+class MashupsManager(object):
+    _instance = None
+    class MashupsManagerSingleton(object):
+        def __call__(self, *args, **kw):
+            if MashupsManager._instance is None:
+                obj = MashupsManager(*args, **kw)
+                MashupsManager._instance = obj
+            return MashupsManager._instance
+    
+    getInstance = MashupsManagerSingleton()
+
+    def __init__(self):
+        if not MashupsManager._instance:
+            MashupsManager._instance = self
+        else:
+            raise RuntimeError, 'Only one instance of MashupsManager is allowed'
+
+    def createMashupController(self, vt_controller, version, view=DummyView()):
+        #print "Manager creating mashup controller ", vt_controller, version
+        newvt_controller = MashupsManager.copyVistrailController(vt_controller,
+                                                                view)
+        mashuptrail = \
+         MashupsManager.getMashuptrailforVersionInVistrailController(vt_controller,
+                                                                     version)
+        if mashuptrail is None:
+            (p_mashuptrail, p_version) = \
+                     MashupsManager.findClosestParentMashuptrail(vt_controller, 
+                                                                 version)
+            id_scope = IdScope(1L)
+            if p_mashuptrail is not None:
+                version_name = vt_controller.get_pipeline_name(p_version)
+                (res, mshpv) = MashupsManager.showFoundMashupsDialog(p_mashuptrail, 
+                                                            version_name)
+                if res in ['Copy', 'Move']:
+                    pipeline = newvt_controller.vistrail.getPipeline(version)
+                    if res == 'Copy':
+                        # we will copy the mashup from the parent trail and 
+                        # validate it to the current pipeline before adding
+                        # to the current mashup trail
+                        mashuptrail = Mashuptrail(self.getNewMashuptrailId(), 
+                                                  version, id_scope)
+                        p_mashup = p_mashuptrail.getMashup(mshpv)
+                        mashup = p_mashup.do_copy()
+                        mashup.id_scope = id_scope
+                        mashup.version = version
+                        mashup.validateForPipeline(pipeline)
+                        currVersion = mashuptrail.addVersion(
+                                      parent_id=mashuptrail.getLatestVersion(),
+                                      mashup=mashup, 
+                                      user=vistrails.core.system.current_user(),
+                                      date=vistrails.core.system.current_time())
+                        mashuptrail.currentVersion = currVersion
+                        mashuptrail.updateIdScope()
+                        p_tag = p_mashuptrail.getTagForActionId(mshpv)
+                        if p_tag == '':
+                            tag = "<latest>"
+                        tag = "Copy from %s"%p_tag
+                        MashupsManager.addMashuptrailtoVistrailController(vt_controller,
+                                                                          mashuptrail)    
+                        
+                    elif res == 'Move':
+                        # we will move the parent trail and validate all mashups
+                        # for the current pipeline to make sure they will be 
+                        # executable for the current version
+
+                        mashuptrail = p_mashuptrail
+                        currVersion = mashuptrail.getLatestVersion()
+                        mashuptrail.currentVersion = currVersion
+                        mashuptrail.validateMashupsForPipeline(version, pipeline)
+                        tag = None
+                        
+                    mashuptrail.vtVersion = version
+                    mshpController = MashupController(vt_controller, 
+                                                      newvt_controller, 
+                                                      version, mashuptrail)
+                    mshpController.setCurrentVersion(mashuptrail.currentVersion)
+                    # this is to make sure the pipeline displayed in the mashup
+                    # view is consistent with the list of aliases in the central
+                    # panel
+                    mshpController.updatePipelineAliasesFromCurrentMashup()
+                    if tag is not None:
+                        mshpController.updateCurrentTag(tag)
+                    return mshpController
+                
+            mashuptrail = Mashuptrail(self.getNewMashuptrailId(), version, 
+                                      id_scope)
+            pipeline = newvt_controller.vistrail.getPipeline(version)
+            id = id_scope.getNewId('mashup')
+            mashup = Mashup(id=id, name="mashup%s"%id, vtid=vt_controller.locator, 
+                        version=version)
+            mashup.loadAliasesFromPipeline(pipeline, id_scope)
+            currVersion = mashuptrail.addVersion(parent_id=mashuptrail.getLatestVersion(),
+                                             mashup=mashup, 
+                                             user=vistrails.core.system.current_user(),
+                                             date=vistrails.core.system.current_time())
+    
+            mashuptrail.currentVersion = currVersion
+            
+            MashupsManager.addMashuptrailtoVistrailController(vt_controller,
+                                                              mashuptrail)
+            mshpController = MashupController(vt_controller,
+                                              newvt_controller, 
+                                              version, mashuptrail)
+            mshpController.setCurrentVersion(mashuptrail.currentVersion)
+            if mshpController.currentVersion == 1L:
+                mshpController.updateCurrentTag("ROOT")
+        else:
+            #print "----> found mashuptrail ", mashuptrail.currentVersion
+            mshpController = MashupController(vt_controller, 
+                                              newvt_controller, 
+                                              version, mashuptrail)
+            mshpController.setCurrentVersion(mashuptrail.currentVersion)
+            mshpController.updatePipelineAliasesFromCurrentMashup()
+        
+        return mshpController
+            
+    @staticmethod
+    def getNewMashuptrailId():  
+        return uuid.uuid1()
+    
+    @staticmethod
+    def copyVistrailController(vt_controller, view=DummyView()):
+        vistrail = vt_controller.vistrail
+        newvt_controller = VistrailController(vistrail, None, 
+                                              pipeline_view=view)
+        current_log = vt_controller.log
+        newvt_controller.log = current_log
+        newvt_controller.disable_autosave()
+        return newvt_controller
+    
+    @staticmethod
+    def copyBaseVistrailController(vt_controller):
+        vistrail = vt_controller.vistrail
+        newvt_controller = BaseVistrailController(vistrail, None)
+        current_log = vt_controller.log
+        newvt_controller.log = current_log
+        # DAK: why does the base version copy the _mashups but the non-base
+        # version doesn't??
+        for m in vt_controller._mashups:
+            newvt_controller._mashups.append(copy.copy(m))
+        return newvt_controller
+    
+    @staticmethod
+    def getMashuptrailforVersionInVistrailController(controller, version):
+        #print version, controller
+        res = None
+        if hasattr(controller, "_mashups"):
+            for mashuptrail in controller._mashups:
+                #print mashuptrail.vtVersion
+                if mashuptrail.vtVersion == version:
+                    return mashuptrail
+        return res
+    
+    @staticmethod
+    def findClosestParentMashuptrail(vt_controller, version):
+        res = None
+        mashuptrails = {}
+        if hasattr(vt_controller, "_mashups"):
+            for mashuptrail in vt_controller._mashups:
+                #print mashuptrail.vtVersion
+                mashuptrails[mashuptrail.vtVersion] = mashuptrail
+        action_map = vt_controller.vistrail.actionMap
+        if version > 0 and len(mashuptrails) > 0:
+            v = action_map[version].parent
+            while True:
+                if v in mashuptrails or v <= 0:
+                    if v in mashuptrails:
+                        res = mashuptrails[v]
+                    else:
+                        res = None
+                    return (res, v)
+                v = action_map[v].parent
+        return (res, -1)
+    
+    @staticmethod
+    def showFoundMashupsDialog(mashup_trail, version_name, parent=None):
+        class FoundMashupDialog(QtGui.QDialog):
+            
+            def __init__(self, mashup_trail, version_name, parent=None):
+                QtGui.QDialog.__init__(self, parent)
+                self.setWindowTitle('VisTrails - Mashup')
+                dlgLayout = QtGui.QVBoxLayout()
+                str_label = "VisTrails found mashup(s) already created in parent %s."
+                label = QtGui.QLabel(str_label%str(version_name))
+                label.setWordWrap(True)
+                gb = QtGui.QGroupBox("What would you like to do?")
+                gblayout = QtGui.QVBoxLayout()
+                
+                self.btnNew = QtGui.QRadioButton("Create new mashup (starting from current pipeline's aliases)")
+                self.btnNew.setChecked(True)
+                self.btnCopy = QtGui.QRadioButton("Copy selected mashup (aliases will be merged)")
+                self.btnMove = QtGui.QRadioButton("Move all mashups to current pipeline")
+                self.mashupsList = QtGui.QListWidget()
+                self.mashupsList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+                self.mashupsList.setMaximumSize(100, 120)
+                self.mashupsList.setEnabled(False)
+                self.setMashupsList(mashup_trail)
+                
+                hlayout = QtGui.QHBoxLayout()
+                hlayout.setMargin(5)
+                hlayout.setSpacing(5)
+                hlayout.addWidget(self.mashupsList)
+                hlayout.addStretch()
+                
+                gblayout.addWidget(self.btnNew)
+                gblayout.addWidget(self.btnMove)
+                gblayout.addWidget(self.btnCopy)
+                gblayout.addLayout(hlayout)
+                
+                gb.setLayout(gblayout)
+                btnOk = QtGui.QPushButton("OK")
+                btnLayout = QtGui.QHBoxLayout()
+                btnLayout.addStretch()
+                btnLayout.addWidget(btnOk)
+                btnLayout.addStretch()
+                self.btnPressed = 0
+                self.mashup_version = -1
+                
+                dlgLayout.addWidget(label)
+                dlgLayout.addWidget(gb)
+                dlgLayout.addLayout(btnLayout)
+                self.setLayout(dlgLayout)
+                self.connect(self.btnCopy, QtCore.SIGNAL("toggled(bool)"),
+                             self.mashupsList.setEnabled)
+                self.connect(btnOk, QtCore.SIGNAL("clicked()"), 
+                             self.btnOkPressed)      
+                
+            def btnOkPressed(self):
+                if self.btnNew.isChecked():
+                    self.btnPressed = 'New'
+                elif self.btnMove.isChecked():
+                    self.btnPressed = 'Move'
+                elif self.btnCopy.isChecked():
+                    self.btnPressed = 'Copy'
+                    self.mashup_version = self.getMashupVersion()
+                self.accept()
+                
+            def setMashupsList(self, mshptrail):
+                from vistrails.gui.mashups.mashups_inspector import QMashupListPanelItem
+                self.mashupsList.clear()
+                tagMap = mshptrail.getTagMap()
+                tags = tagMap.keys()
+                latestversion = mshptrail.getLatestVersion()
+                item_selected = False
+                if not mshptrail.hasTagForActionId(latestversion):
+                    item = QMashupListPanelItem("<latest>",
+                                                latestversion,
+                                                self.mashupsList)
+                    item.setSelected(True)
+                    item_selected = True
+                if len(tags) > 0:
+                    tags.sort()
+                    i = 0
+                    for tag in tags:
+                        item = QMashupListPanelItem(str(tag),
+                                                    tagMap[tag],
+                                                    self.mashupsList)
+                        if i == 0 and not item_selected:
+                            item.setSelected(True)
+                        i+=1
+                        
+            def getMashupVersion(self):
+                items = self.mashupsList.selectedItems()
+                if len(items) == 1:
+                    return items[0].version
+            
+        dialog = FoundMashupDialog(mashup_trail, version_name, parent)
+        if dialog.exec_() == QtGui.QDialog.Accepted:
+            return (dialog.btnPressed,dialog.mashup_version) 
+        else:
+            return ('New', -1)                
+    
+    @staticmethod
+    def addMashuptrailtoVistrailController(controller, mashuptrail):
+        controller._mashups.append(mashuptrail)
+        controller.set_changed(True)    
+        
+    @staticmethod
+    def createMashupApp(vtcontroller, mashuptrail, version):
+        from vistrails.gui.mashups.mashup_app import QMashupAppMainWindow
+        vistrail_view = vtcontroller.vistrail_view
+        vtVersion = mashuptrail.vtVersion
+        view = DummyView()
+        view.scene().current_pipeline = vtcontroller.vistrail.getPipeline(vtVersion)
+        view.scene().current_pipeline.validate()
+        new_vtcontroller = MashupsManager.copyBaseVistrailController(vtcontroller)
+        new_vtcontroller.change_selected_version(vtVersion)
+        mshpController = MashupController(vtcontroller,
+                                          new_vtcontroller, 
+                                          vtVersion, mashuptrail)
+        mshpController.setCurrentVersion(version)
+        app = QMashupAppMainWindow(parent=None,
+                                   vistrail_view=vistrail_view, 
+                                   controller=mshpController,
+                                   version=version)
+        return app
+    
+    @staticmethod
+    def exportMashup(filename, vtcontroller, mashuptrail, mashupversion, etype):
+        """exportMashup(filename: str, vtcontroller: VistrailController, 
+                        mashuptrail: Mashuptrail, type: int) -> bool 
+            where etype is 
+              0: include full tree 
+              1: include only workflow and mashup identified by version
+              2: as a link, it will point to a local file.
+        """
+        result = False
+        if vtcontroller is not None and mashuptrail is not None:
+            locator = vtcontroller.locator
+            version = mashuptrail.vtVersion
+            
+            node = ElementTree.Element('vtlink')
+        
+            if isinstance(locator, DBLocator):
+                node.set('host', str(locator.host))
+                node.set('port', str(locator.port))
+                node.set('database', str(locator.db))
+                node.set('vtid', str(locator.obj_id))
+            else:
+                node.set('filename', str(locator.name))
+                
+            node.set('version', str(version))    
+            node.set('execute', "True")
+            node.set('forceDB', "False")
+            node.set('showSpreadsheetOnly', "True")
+            node.set('mashuptrail', str(mashuptrail.id))
+            node.set('mashupVersion', str(mashupversion))
+                
+            if etype in [0,1]:
+                if etype == 1: #minimal
+                    pip = vtcontroller.vistrail.getPipeline(version)
+                    vistrail = Vistrail()
+                    id_remap = {}
+                    action = vistrails.core.db.action.create_paste_action(pip, 
+                                                        vistrail.idScope,
+                                                        id_remap)
+                    vistrail.add_action(action, 0L, 0)
+                   
+                    tag = vtcontroller.vistrail.get_tag(version)
+                    if tag is None:
+                        tag = "Imported workflow"
+                    vistrail.addTag(tag, action.id)
+                    node.set('version', str(action.id))
+                    id_scope = IdScope(1L)
+                    newmashuptrail = Mashuptrail(
+                                     MashupsManager.getNewMashuptrailId(), 
+                                     action.id, 
+                                     id_scope)
+                    
+                    maction = mashuptrail.actionMap[mashupversion]
+                    mtag = mashuptrail.getTagForActionId(mashupversion)
+                    newmashup = copy.copy(maction.mashup)
+                    newmashup.remapPipelineObjects(id_remap)
+                    currVersion = newmashuptrail.addVersion(
+                                            newmashuptrail.getLatestVersion(),
+                                            newmashup, maction.user, 
+                                            maction.date)
+                    newmashuptrail.currentVersion = currVersion
+                    newmashuptrail.changeTag(currVersion, mtag, maction.user,
+                                             maction.date)
+                    newvtcontroller = BaseVistrailController(vistrail, None)
+                    MashupsManager.addMashuptrailtoVistrailController(newvtcontroller,
+                                                                      newmashuptrail)
+                    node.set('mashuptrail', str(newmashuptrail.id))
+                    node.set('mashupVersion', str(newmashuptrail.currentVersion))
+                else:
+                    vistrail = vtcontroller.vistrail
+                    newvtcontroller = MashupsManager.copyBaseVistrailController(vtcontroller)
+                
+                #create temporary file
+                (fd, name) = tempfile.mkstemp(prefix='vt_tmp',
+                                          suffix='.vt')
+                os.close(fd)
+                try:
+                    fileLocator = FileLocator(name)
+                    newvtcontroller.write_vistrail(fileLocator)
+                    contents = open(name).read()
+                    vtcontent = base64.b64encode(contents)
+                finally:
+                    os.unlink(name)
+                #if not vistrail.db_version:
+                #    vistrail.db_version = currentVersion
+                node.set('vtcontent',vtcontent)
+                
+            xmlstring = ElementTree.tostring(node)
+            file_ = open(filename,'w')
+            file_.write(xmlstring)
+            file_.close()
+            result = True
+        return result
diff --git a/vistrails/gui/mashups/mashups_widgets.py b/vistrails/gui/mashups/mashups_widgets.py
new file mode 100644
index 0000000..ff7c002
--- /dev/null
+++ b/vistrails/gui/mashups/mashups_widgets.py
@@ -0,0 +1,387 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.modules import get_widget_class
+from vistrails.gui.modules.constant_configuration import ConstantWidgetMixin, \
+    StandardConstantWidget
+from vistrails.core.modules.module_registry import get_module_registry
+
+class QAliasSliderWidget(QtGui.QWidget):
+    def __init__(self, alias, vtparam, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.alias = alias
+        self.vtparam = vtparam
+        self.palette().setColor(QtGui.QPalette.Window,
+                                CurrentTheme.METHOD_SELECT_COLOR)
+        label = QtGui.QLabel(alias.name)
+        label.font().setBold(True)
+        self.value = QSliderWidget(param=vtparam, parent=self)
+        self.value.setRange(alias.component.minVal, alias.component.maxVal)
+        self.value.setSingleStep(alias.component.stepSize)
+        self.value.setContents(self.alias.component.val)
+        
+        self.connect(self.value,
+                     QtCore.SIGNAL("contentsChanged"),
+                     self.contents_changed)
+        
+        hbox = QtGui.QHBoxLayout()
+        hbox.setMargin(8)
+        hbox.addWidget(label)
+        hbox.addWidget(self.value)
+        self.setLayout(hbox)
+   
+    def contents_changed(self, info):
+        #print "drop down emitting"
+        self.emit(QtCore.SIGNAL('contentsChanged'), (self, info))
+             
+    def focusInEvent(self, event):
+        self.emit(QtCore.SIGNAL("receivedfocus"), self)
+        
+    def focusOutEvent(self, event):
+        self.emit(QtCore.SIGNAL("removedfocus"), self)
+        
+###############################################################################        
+
+class QSliderWidget(ConstantWidgetMixin, QtGui.QSlider):
+    def __init__(self, param, parent=None):
+        QtGui.QSlider.__init__(self, QtCore.Qt.Horizontal, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        assert param.type in['Integer', 'Float']
+        self.sliderType = int if param.type == 'Integer' else float
+        assert param.identifier == get_vistrails_basic_pkg_id()
+        
+        self.connect(self, QtCore.SIGNAL('valueChanged(int)'),self.change_val)
+        QtGui.QSlider.setSingleStep(self, 1)
+        QtGui.QSlider.setPageStep(self, 5)
+        self.floatMinVal = 0.0
+        self.floatMaxVal = 1.0
+        self.floatStepSize = 1
+        self.numSteps = 1
+        self.setContents(param.strValue)
+        self.setTickPosition(QtGui.QSlider.TicksAbove)        
+    
+    def contents(self):
+        floatVal = float(self.value()) * self.floatStepSize + self.floatMinVal
+        return self.sliderType(floatVal)
+
+    def setContents(self, strValue, silent=True):
+        """ encodes a number to a scaled integer """
+        if strValue:
+            value = strValue
+        else:
+            value = "0.0"
+        floatVal = float(value)
+        value = int((floatVal-self.floatMinVal)/self.floatStepSize)
+        self.setValue(int(value))
+        self.setToolTip("%g" % floatVal)
+        
+        if not silent:
+            self.update_parent()
+            
+    def change_val(self, newval):
+        """ decodes a scaled integer to the correct number """
+        floatVal = float(newval) * self.floatStepSize + self.floatMinVal
+        self.setToolTip("%g" % floatVal)
+        self.update_parent()
+
+    def setRange(self, minVal, maxVal):
+        self.floatMinVal = float(minVal)
+        self.floatMaxVal = float(maxVal)
+        QtGui.QSlider.setRange(self, 0, 1)
+        self.setSingleStep(self.floatStepSize)
+        
+    def setSingleStep(self, stepSize):
+        """ stepSize tells the step between values. We need to calculate the
+            number of steps """
+        self.floatStepSize = float(stepSize)
+        self.numSteps = int((self.floatMaxVal - self.floatMinVal)/self.floatStepSize)
+        QtGui.QSlider.setRange(self, 0, self.numSteps)
+
+        
+###############################################################################
+
+class QAliasNumericStepperWidget(QtGui.QWidget):
+    def __init__(self, alias, vtparam, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.alias = alias
+        self.vtparam = vtparam
+        self.palette().setColor(QtGui.QPalette.Window,
+                                CurrentTheme.METHOD_SELECT_COLOR)
+        label = QtGui.QLabel(alias.name)
+        label.font().setBold(True)
+        if self.alias.component.type == "Integer":
+            self.value = QNumericStepperIntegerWidget(param=vtparam,
+                                                      parent=self)
+            self.value.setRange(int(alias.component.minVal), 
+                                int(alias.component.maxVal))
+            self.value.setSingleStep(int(alias.component.stepSize))
+            self.value.setContents(self.alias.component.val)            
+        elif self.alias.component.type == "Float":
+            self.value = QNumericStepperFloatWidget(param=vtparam,
+                                                    parent=self)
+            self.value.setRange(float(alias.component.minVal), 
+                                float(alias.component.maxVal))
+            self.value.setSingleStep(float(alias.component.stepSize))
+            self.value.setContents(self.alias.component.val)
+
+        self.connect(self.value,
+                     QtCore.SIGNAL("contentsChanged"),
+                     self.contents_changed)
+        
+        hbox = QtGui.QHBoxLayout()
+        hbox.setMargin(8)
+        hbox.addWidget(label)
+        hbox.addWidget(self.value)
+        self.setLayout(hbox)    
+   
+    def contents_changed(self, info):
+        #print "drop down emitting"
+        self.emit(QtCore.SIGNAL('contentsChanged'), (self, info))
+             
+    def focusInEvent(self, event):
+        self.emit(QtCore.SIGNAL("receivedfocus"), self)
+        
+    def focusOutEvent(self, event):
+        self.emit(QtCore.SIGNAL("removedfocus"), self)
+        
+###############################################################################
+class QNumericStepperIntegerWidget(ConstantWidgetMixin, QtGui.QSpinBox):
+    def __init__(self, param, parent=None):
+        QtGui.QSpinBox.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        assert param.type == 'Integer'
+        assert param.identifier == get_vistrails_basic_pkg_id()
+        
+        self.connect(self, QtCore.SIGNAL('valueChanged(int)'),
+                     self.change_val)
+        self.setContents(param.strValue)
+        
+    def contents(self):
+        return self.value()
+
+    def setContents(self, strValue, silent=True):
+        if strValue:
+            value = strValue
+        else:
+            value = "0"
+        self.setValue(int(value))
+        
+        if not silent:
+            self.update_parent()
+            
+    def change_val(self, newval):
+        self.update_parent()
+###############################################################################
+
+class QNumericStepperFloatWidget(ConstantWidgetMixin, QtGui.QDoubleSpinBox):
+    def __init__(self, param, parent=None):
+        QtGui.QDoubleSpinBox.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        assert param.type == 'Float'
+        assert param.identifier == get_vistrails_basic_pkg_id()
+        
+        self.connect(self, QtCore.SIGNAL('valueChanged(double)'),
+                     self.change_val)
+        self.setContents(param.strValue)
+        
+    def contents(self):
+        return self.value()
+
+    def setContents(self, strValue, silent=True):
+        if strValue:
+            value = strValue
+        else:
+            value = "0"
+        self.setValue(float(value))
+        
+        if not silent:
+            self.update_parent()
+            
+    def change_val(self, newval):
+        self.update_parent()
+
+###############################################################################
+
+class QDropDownWidget(QtGui.QWidget):
+    def __init__(self, alias, vtparam, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.alias = alias
+        self.vtparam = vtparam
+        self.palette().setColor(QtGui.QPalette.Window,
+                                CurrentTheme.METHOD_SELECT_COLOR)
+        label = QtGui.QLabel(alias.name)
+        label.font().setBold(True)
+        self.value = self.createAliasWidget(val=self.alias.component.val,
+                                            parent=self)
+        self.connect(self.value,
+                     QtCore.SIGNAL("contentsChanged"),
+                     self.contents_changed)
+        self.dropdownbtn = QtGui.QToolButton(self)
+        self.dropdownbtn.setArrowType(QtCore.Qt.DownArrow)
+        self.dropdownbtn.setAutoRaise(True)
+            
+        #menu button
+        self.createMenu()
+        self.dropdownbtn.setPopupMode(QtGui.QToolButton.InstantPopup)
+            
+        hbox = QtGui.QHBoxLayout()
+        hbox.setMargin(8)
+        hbox.addWidget(label)
+        hbox.addWidget(self.value)
+        hbox.addWidget(self.dropdownbtn)
+        self.setLayout(hbox)    
+        
+    def createMenu(self):
+        self.menu = QMenuValue(self)
+        self.menu.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                                QtGui.QSizePolicy.Maximum)
+        mbox = QtGui.QVBoxLayout()
+        mbox.setSpacing(1)
+        mbox.setMargin(2)
+        self.menu_widgets = {}   
+        valuelist = self.alias.component.valueList
+       
+        for v in valuelist:
+            hbox = QtGui.QHBoxLayout()
+            rb = QMenuRadioButton()
+            rb.setChecked(False)
+            vw = self.createMenuAliasWidget(val=v, parent=self)
+            vw.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                                QtGui.QSizePolicy.Maximum)
+            vw.setReadOnly(True)
+            
+            self.menu_widgets[rb] = vw
+            hbox.addWidget(rb)
+            hbox.addWidget(vw)
+            mbox.addLayout(hbox)
+           
+            self.connect(rb,
+                         QtCore.SIGNAL("clicked(bool)"),
+                         self.menu.hide)
+            self.connect(vw,
+                         QtCore.SIGNAL("clicked(bool)"),
+                         rb.setChecked)
+        self.menu.setLayout(mbox)
+        self.dropdownbtn.setMenu(self.menu)
+        
+        #there's a bug on a mac that causes the menu to be always displayed
+        #where it was shown for the first time... We need to ensure
+        #the right position.
+        self.connect(self.menu,
+                     QtCore.SIGNAL("aboutToShow()"),
+                     self.ensure_menu_position)
+        self.connect(self.menu,
+                     QtCore.SIGNAL("aboutToHide()"),
+                     self.value_selected)
+        
+    def contents_changed(self, info):
+        #print "drop down emitting"
+        self.emit(QtCore.SIGNAL('contentsChanged'), (self, info))
+        
+    def ensure_menu_position(self):
+        #print self.dropdownbtn.pos(), 
+        newpos = QtCore.QPoint(self.dropdownbtn.pos().x(),
+                               self.dropdownbtn.pos().y() + self.dropdownbtn.frameSize().height())
+        self.menu.move(self.mapToGlobal(newpos))  
+        #print self.menu.pos()
+        
+    def createAliasWidget(self, val=None, parent=None):
+        if self.vtparam.identifier == '':
+            idn = get_vistrails_basic_pkg_id()
+        else:
+            idn = self.vtparam.identifier
+        reg = get_module_registry()
+        p_module = reg.get_module_by_name(idn, self.vtparam.type, 
+                                          self.vtparam.namespace)
+        widget_type = get_widget_class(p_module)
+        if val:
+            self.vtparam.strValue = val
+        return widget_type(self.vtparam, parent)
+    
+    def createMenuAliasWidget(self, val=None, parent=None):
+        widget = self.createAliasWidget(val)
+        return QMenuValueItem(widget, parent)
+    
+    def value_selected(self):
+        #print "value_selected", self.menu.pos()
+        for rb, vw in self.menu_widgets.iteritems():
+            if rb.isChecked():
+                self.value.setContents(vw.contents(), silent=False)
+                vw.setFocus()
+                rb.setChecked(False)
+                self.menu.hide()
+                break
+                
+    def focusInEvent(self, event):
+        self.emit(QtCore.SIGNAL("receivedfocus"), self)
+        
+    def focusOutEvent(self, event):
+        self.emit(QtCore.SIGNAL("removedfocus"), self)
+        
+class QMenuRadioButton(QtGui.QRadioButton):
+    def focusInEvent(self, event):
+        self.setChecked(True)
+        #self.emit(QtCore.SIGNAL("clicked(bool)"), True)
+        QtGui.QRadioButton.focusInEvent(self, event)
+        
+class QMenuValue(QtGui.QMenu):    
+    def mousePressEvent(self, e):
+        vw = self.childAt(e.pos())
+        while vw is not None and not isinstance(vw, QMenuValueItem):
+            vw = vw.parent()
+        if vw is not None:
+            vw.emit(QtCore.SIGNAL("clicked(bool)"), True)
+        QtGui.QMenu.mousePressEvent(self, e)
+        
+class QMenuValueItem(QtGui.QWidget):
+    def __init__(self, widget, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.widget = widget
+        vlayout = QtGui.QVBoxLayout()
+        vlayout.setMargin(0)
+        vlayout.setSpacing(0)
+        vlayout.addWidget(self.widget)
+        self.setLayout(vlayout)
+        
+    def setReadOnly(self, on):
+        self.setEnabled(not on)
+        
+    def contents(self):
+        return self.widget.contents()
+    
+    def mousePressEvent(self, e):
+        self.emit(QtCore.SIGNAL("clicked(bool)"), True)
diff --git a/vistrails/gui/merge_gui.py b/vistrails/gui/merge_gui.py
new file mode 100644
index 0000000..49ee8a1
--- /dev/null
+++ b/vistrails/gui/merge_gui.py
@@ -0,0 +1,322 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtGui, QtCore
+import os
+import vistrails.api
+
+CHOICE_OTHER_ALL = 0
+CHOICE_OTHER = 1
+CHOICE_RESOLVED = 2
+CHOICE_OWN = 3
+CHOICE_OWN_ALL = 4
+
+class resolve_tags(QtGui.QWidget):
+    def __init__(self, a, b, text, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.value = 4
+        self.a = a
+        self.b = b
+        self.text = text
+
+        self.initUI()
+
+    def initUI(self):
+
+        self.setWindowTitle("Tag conflict!")
+        self.move(250, 200)
+
+        # main layout
+        vbox = QtGui.QVBoxLayout()
+        self.setLayout(vbox)
+
+        # info boxes
+        hbox = QtGui.QHBoxLayout()
+        vbox.addLayout(hbox)
+
+        otherLabel = QtGui.QLabel(self)
+        otherLabel.setAlignment(QtCore.Qt.AlignHCenter)
+        otherLabel.setText("Other version")
+        hbox.addWidget(otherLabel)
+
+        ownLabel = QtGui.QLabel(self)
+        ownLabel.setAlignment(QtCore.Qt.AlignHCenter)
+        ownLabel.setText("Your version")
+        hbox.addWidget(ownLabel)
+
+        # tags
+        self.tedit = QtGui.QLineEdit(self.text)
+        self.tedit.setAlignment(QtCore.Qt.AlignHCenter)
+        vbox.addWidget(self.tedit)
+
+        # info boxes
+        hbox = QtGui.QHBoxLayout()
+        vbox.addLayout(hbox)
+
+        # info boxes
+        vbox1 = QtGui.QVBoxLayout()
+        vbox1.setAlignment(QtCore.Qt.AlignHCenter)
+        hbox.addLayout(vbox1)
+        userLabel = QtGui.QLabel(self)
+        userLabel.setText("User: " + self.a.db_user)
+        vbox1.addWidget(userLabel)
+        timeLabel = QtGui.QLabel(self)
+        timeLabel.setText("Time: " + str(self.a.db_date))
+        vbox1.addWidget(timeLabel)
+
+        vbox2 = QtGui.QVBoxLayout()
+        vbox2.setAlignment(QtCore.Qt.AlignHCenter)
+        hbox.addLayout(vbox2)
+        userLabel = QtGui.QLabel(self)
+        userLabel.setText("User: " + self.b.db_user)
+        vbox2.addWidget(userLabel)
+        timeLabel = QtGui.QLabel(self)
+        timeLabel.setText("Time: " + str(self.b.db_date))
+        vbox2.addWidget(timeLabel)
+
+        buttons = QtGui.QHBoxLayout()
+        vbox.addLayout(buttons)
+
+        self.otherAll = QtGui.QPushButton('Keep other (for all)', self)
+        self.connect(self.otherAll, QtCore.SIGNAL('clicked()'), self.setOtherAll)
+        buttons.addWidget(self.otherAll)
+        self.other = QtGui.QPushButton('Keep other', self)
+        self.connect(self.other, QtCore.SIGNAL('clicked()'), self.setOther)
+        buttons.addWidget(self.other)
+        self.resolve = QtGui.QPushButton('Resolved', self)
+        self.connect(self.resolve, QtCore.SIGNAL('clicked()'), self.setResolved)
+        buttons.addWidget(self.resolve)
+        self.own = QtGui.QPushButton('Keep yours', self)
+        self.connect(self.own, QtCore.SIGNAL('clicked()'), self.setOwn)
+        buttons.addWidget(self.own)
+        self.ownAll = QtGui.QPushButton('Keep yours (for all)', self)
+        self.connect(self.ownAll, QtCore.SIGNAL('clicked()'), self.setOwnAll)
+        buttons.addWidget(self.ownAll)
+
+    def setOtherAll(self):
+        self.value = CHOICE_OTHER_ALL
+        self.close()
+    def setOther(self):
+        self.value = CHOICE_OTHER
+        self.close()
+    def setResolved(self):
+        self.value = CHOICE_RESOLVED
+        self.text = str(self.tedit.text())
+        self.close()
+    def setOwn(self):
+        self.value = CHOICE_OWN
+        self.close()
+    def setOwnAll(self):
+        self.value = CHOICE_OWN_ALL
+        self.close()
+
+class resolve_notes(QtGui.QWidget):
+    def __init__(self, a, b, text, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.value = 4
+        self.a = a
+        self.b = b
+        self.text = text
+
+        self.initUI()
+
+    def initUI(self):
+
+        self.setWindowTitle("Notes conflict!")
+        self.move(250, 200)
+
+        # main layout
+        vbox = QtGui.QVBoxLayout()
+        self.setLayout(vbox)
+
+        # thumbs layout
+        self.tedit = QtGui.QTextEdit(self.text)
+        vbox.addWidget(self.tedit)
+
+        buttons = QtGui.QHBoxLayout()
+        vbox.addLayout(buttons)
+
+        self.otherAll = QtGui.QPushButton('Keep other (for all)', self)
+        self.connect(self.otherAll, QtCore.SIGNAL('clicked()'), self.setOtherAll)
+        buttons.addWidget(self.otherAll)
+        self.other = QtGui.QPushButton('Keep other', self)
+        self.connect(self.other, QtCore.SIGNAL('clicked()'), self.setOther)
+        buttons.addWidget(self.other)
+        self.resolve = QtGui.QPushButton('Resolved', self)
+        self.connect(self.resolve, QtCore.SIGNAL('clicked()'), self.setResolved)
+        buttons.addWidget(self.resolve)
+        self.own = QtGui.QPushButton('Keep yours', self)
+        self.connect(self.own, QtCore.SIGNAL('clicked()'), self.setOwn)
+        buttons.addWidget(self.own)
+        self.ownAll = QtGui.QPushButton('Keep yours (for all)', self)
+        self.connect(self.ownAll, QtCore.SIGNAL('clicked()'), self.setOwnAll)
+        buttons.addWidget(self.ownAll)
+
+    def setOtherAll(self):
+        self.value = CHOICE_OTHER_ALL
+        self.close()
+    def setOther(self):
+        self.value = CHOICE_OTHER
+        self.close()
+    def setResolved(self):
+        self.value = CHOICE_RESOLVED
+        self.text = str(self.tedit.toHtml())
+        self.close()
+    def setOwn(self):
+        self.value = CHOICE_OWN
+        self.close()
+    def setOwnAll(self):
+        self.value = CHOICE_OWN_ALL
+        self.close()
+
+class resolve_thumbs(QtGui.QWidget):
+    def __init__(self, a, b, old_tmp_dir, new_tmp_dir, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.value = 4
+        self.a = a
+        self.b = b
+
+        self.old_tmp_dir = old_tmp_dir
+        self.new_tmp_dir = new_tmp_dir
+        self.initUI()
+
+    def initUI(self):
+
+        self.setWindowTitle("Thumbnail conflict!")
+        self.move(250, 200)
+
+        # main layout
+        vbox = QtGui.QVBoxLayout()
+        self.setLayout(vbox)
+
+        # thumbs layout
+        hbox = QtGui.QHBoxLayout()
+        vbox.addLayout(hbox)
+
+        other = QtGui.QVBoxLayout()
+        hbox.addLayout(other)
+        otherLabel = QtGui.QLabel(self)
+        otherLabel.setText("Other version")
+        other.addWidget(otherLabel)
+        path = os.path.join(self.old_tmp_dir, 'thumbs', self.a.db_value)
+        pixmap = QtGui.QPixmap(path)
+        thumb1 = QtGui.QLabel(self)
+        thumb1.setPixmap(pixmap)
+        other.addWidget(thumb1)
+        userLabel = QtGui.QLabel(self)
+        userLabel.setText("User: " + self.a.db_user)
+        other.addWidget(userLabel)
+        timeLabel = QtGui.QLabel(self)
+        timeLabel.setText("Time: " + str(self.a.db_date))
+        other.addWidget(timeLabel)
+
+        own = QtGui.QVBoxLayout()
+        hbox.addLayout(own)
+        ownLabel = QtGui.QLabel(self)
+        ownLabel.setText("Your version")
+        own.addWidget(ownLabel)
+        path = os.path.join(self.old_tmp_dir, 'thumbs', self.b.db_value)
+        pixmap = QtGui.QPixmap(path)
+        thumb2 = QtGui.QLabel(self)
+        thumb2.setPixmap(pixmap)
+        own.addWidget(thumb2)
+        userLabel = QtGui.QLabel(self)
+        userLabel.setText("User: " + self.b.db_user)
+        own.addWidget(userLabel)
+        timeLabel = QtGui.QLabel(self)
+        timeLabel.setText("Time: " + str(self.b.db_date))
+        own.addWidget(timeLabel)
+
+        buttons = QtGui.QHBoxLayout()
+        vbox.addLayout(buttons)
+
+        self.otherAll = QtGui.QPushButton('Keep other (for all)', self)
+        self.connect(self.otherAll, QtCore.SIGNAL('clicked()'), self.setOtherAll)
+        buttons.addWidget(self.otherAll)
+        self.other = QtGui.QPushButton('Keep other', self)
+        self.connect(self.other, QtCore.SIGNAL('clicked()'), self.setOther)
+        buttons.addWidget(self.other)
+        self.own = QtGui.QPushButton('Keep yours', self)
+        self.connect(self.own, QtCore.SIGNAL('clicked()'), self.setOwn)
+        buttons.addWidget(self.own)
+        self.ownAll = QtGui.QPushButton('Keep yours (for all)', self)
+        self.connect(self.ownAll, QtCore.SIGNAL('clicked()'), self.setOwnAll)
+        buttons.addWidget(self.ownAll)
+
+    def setOtherAll(self):
+        self.value = CHOICE_OTHER_ALL
+        self.close()
+    def setOther(self):
+        self.value = CHOICE_OTHER
+        self.close()
+    def setOwn(self):
+        self.value = CHOICE_OWN
+        self.close()
+    def setOwnAll(self):
+        self.value = CHOICE_OWN_ALL
+        self.close()
+
+class MergeGUI:
+    @staticmethod
+    def resolveTags(a, b, text):
+        exm = resolve_tags(a, b, text)
+        exm.show()
+        app = vistrails.api.get_builder_window()
+        if not app:
+            app = QtGui.QApplication([])
+            app.exec_()
+        return exm.value, exm.text
+
+    @staticmethod
+    def resolveNotes(a, b, text):
+        exm = resolve_notes(a, b, text)
+        exm.show()
+        app = vistrails.api.get_builder_window()
+        if not app:
+            app = QtGui.QApplication([])
+            app.exec_()
+        return exm.value, exm.text
+
+    @staticmethod
+    def resolveThumbs(a, b, old_tmp_dir, new_tmp_dir):
+        exm = resolve_thumbs(a, b, old_tmp_dir, new_tmp_dir)
+        exm.show()
+        app = vistrails.api.get_builder_window()
+        if not app:
+            app = QtGui.QApplication([])
+            app.exec_()
+        return exm.value
diff --git a/vistrails/gui/module_annotation.py b/vistrails/gui/module_annotation.py
new file mode 100644
index 0000000..fb6ec4a
--- /dev/null
+++ b/vistrails/gui/module_annotation.py
@@ -0,0 +1,295 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains a dialog and widgets related to the module annotation
+displaying a list of all pairs (key,value) for a module
+
+QKeyValueDelegate
+QModuleAnnotation
+QModuleAnnotationTable
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.common_widgets import QToolWindowInterface
+from vistrails.core import debug
+
+################################################################################
+
+class QModuleAnnotation(QtGui.QDialog):
+    """
+    QModuleAnnotation is a dialog for annotating modules
+
+    """
+    def __init__(self, module, controller, parent=None):
+        """ 
+        QModuleAnnotation(module: Module, controller: VistrailController)
+        -> None
+
+        """
+        QtGui.QDialog.__init__(self, parent)
+        self.module = module
+        self.controller = controller
+        self.setModal(True)
+        self.setWindowTitle('Module Annotations')
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().setMargin(0)
+        self.layout().setSpacing(0)
+        self.scrollArea = QtGui.QScrollArea(self)
+        self.layout().addWidget(self.scrollArea)
+        self.scrollArea.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.annotationTable = QModuleAnnotationTable(self.module,
+                                                      self.controller,
+                                                      self)
+        self.scrollArea.setWidget(self.annotationTable)
+        self.scrollArea.setWidgetResizable(True)
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.closeButton = QtGui.QPushButton('Close', self)
+        self.closeButton.setFixedWidth(100)
+        self.buttonLayout.addWidget(self.closeButton)
+        self.closeButton.setShortcut('Esc')
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.closeButton, QtCore.SIGNAL('clicked(bool)'), self.close)
+
+        
+class QModuleAnnotationTable(QtGui.QTableWidget):
+    """
+    QModuleAnnotationTable is a table widget that can be dock inside a
+    window. It has two columns for key and value pairs to view/edit at
+    run-time
+    
+    """    
+    def __init__(self, module=None, controller=None, parent=None):
+        """ QModuleAnnotationTable(module: Module, controller: 
+        VistrailController, parent: QWidget) -> QModuleAnnotationTable
+        Construct the 1x2 table
+        
+        """
+        QtGui.QTableWidget.__init__(self, 1, 2, parent)
+        self.read_only = False
+        self.setHorizontalHeaderLabels(['Key', 'Value'])
+        self.horizontalHeader().setResizeMode(QtGui.QHeaderView.Interactive)
+        self.horizontalHeader().setMovable(False)
+        self.horizontalHeader().setStretchLastSection(True)
+        self.setSortingEnabled(True)
+        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+        self.verticalHeader().hide()
+        self.delegate = QKeyValueDelegate(self)
+        self.setItemDelegate(self.delegate)
+        self.module = module
+        self.controller = controller
+        self.updateLocked = False
+        self.updateModule()
+
+    def set_controller(self, controller):
+        self.controller = controller
+
+    def setReadOnly(self, read_only):
+        if read_only != self.read_only:
+            self.read_only = read_only
+            self.setEnabled(not read_only and self.module is not None)
+
+    def updateModule(self, module=None):
+        """ updateModule() -> None
+        Update the widget to view the module annotations
+        """
+
+        self.module = module
+        self.setSortingEnabled(False)
+        if self.updateLocked: return
+        self.clearContents()
+        self.setRowCount(0)
+        if self.module:
+            self.setRowCount(len(self.module.annotations)+1)
+            curRow = 0
+            for annotation in self.module.annotations:
+                if annotation.key == '__desc__':
+                    # We don't display the '__desc__' annotation in the list
+                    # anymore. If it's present we decrease the rowcount by 1
+                    self.setRowCount(len(self.module.annotations))
+                else:
+                    self.setItem(curRow, 0, QtGui.QTableWidgetItem(annotation.key))
+                    item = QtGui.QTableWidgetItem(annotation.value)
+                    self.setItem(curRow, 1, item)
+                    curRow += 1
+            self.setEnabled(not self.read_only)
+        else:
+            self.setRowCount(1)
+            self.setEnabled(False)
+        self.setItem(self.rowCount()-1, 0, QtGui.QTableWidgetItem(''))
+        self.setItem(self.rowCount()-1, 1, QtGui.QTableWidgetItem(''))
+        self.setSortingEnabled(True)
+
+    def makeItemBold(self, index):
+        """ makeItemBold(index: QModelIndex) -> None
+        Make the item at index to have a bold face
+        
+        """
+        oldFont = QtGui.QFont(self.model().data(index, QtCore.Qt.FontRole))
+        oldFont.setBold(True)
+        oldFont.setPointSize(20)
+        self.model().setData(index, oldFont, QtCore.Qt.FontRole)
+
+    def lockUpdate(self):
+        """ lockUpdate() -> None
+        Do not allow updateModule()
+        
+        """
+        self.updateLocked = True
+        
+    def unlockUpdate(self):
+        """ unlockUpdate() -> None
+        Allow updateModule()
+        
+        """
+        self.updateLocked = False
+
+    def addRow(self):
+        """ addRow() -> None
+        Adds a new empty row to the table
+
+        """
+        self.setSortingEnabled(False)
+        self.resizeRowsToContents()
+        self.insertRow(self.rowCount())
+        self.setItem(self.rowCount()-1, 0,
+                     QtGui.QTableWidgetItem(''))
+        self.setItem(self.rowCount()-1, 1,
+                     QtGui.QTableWidgetItem(''))
+        self.setSortingEnabled(False)
+
+    def editNextAvailableCell(self):
+        item = self.item(self.rowCount()-1, 0)
+        self.editItem(item)
+        
+class QKeyValueDelegate(QtGui.QItemDelegate):
+    """    
+    QKeyValueDelegate tries to create a special control widget
+    providing a simple interface for adding/deleting module
+    annotations
+    
+    """
+
+    def __init__(self, table):
+        """ QKeyValueDelegate(table: QModuleAnnotationTable) -> QKeyValueDelegate
+        Save a reference to table and perform a default initialization
+        
+        """
+        self.table = table
+        QtGui.QItemDelegate.__init__(self, None)
+    
+    def setEditorData(self, editor, index):
+        """ setEditorData(editor: QWidget, index: QModelIndex) -> None
+        Set the current item (at index) data into editor for editting
+        
+        """
+        text = index.data(QtCore.Qt.DisplayRole)
+        editor.setText(text)
+
+    def setModelData(self, editor, model, index):
+        """ setModelData(editor: QWidget, model: QAbstractItemModel,
+                         index: QModelIndex) -> None                         
+        Assign the value of the editor back into the model and emit a
+        signal to update vistrail
+        
+        """
+        text = str(editor.text())
+        row = index.row()
+        col = index.column()
+        keyItem = self.table.item(row, 0)
+        if keyItem:
+            key = str(keyItem.text())
+        else:
+            key = ''
+            
+        valueItem = self.table.item(row, 1)
+        if valueItem:
+            value = str(valueItem.text())
+        else:
+            value = ''
+            
+        if col==0:
+            if text=='' and row<self.table.rowCount()-1:
+                self.table.removeRow(row)
+                if self.table.controller and self.table.module:
+                    self.table.lockUpdate()
+                    self.table.controller.delete_annotation(key,
+                                                            self.table.module.id)
+                    self.table.unlockUpdate()
+                return
+            if text!='' and text!=key:
+                if (self.table.module and
+                    self.table.module.has_annotation_with_key(text)):
+                    if text == '__desc__':
+                        QtGui.QMessageBox.information(None,
+                                                      "VisTrails",
+                                    'Please use "Set Module Label..." menu option'
+                                    ' to set the label for this module.')
+                    else:
+                        QtGui.QMessageBox.information(None,
+                                                  "VisTrails",
+                                                  text + ' already exists in '
+                                                  'the annotations.')
+                    return
+
+        if col==1 and key=='':
+            QtGui.QMessageBox.information(None,
+                                          "VisTrails",
+                                          "Must provide a key first.")
+            return
+            
+            
+        if col==0 and key=='' and text!='' and value!='':
+            self.table.addRow()
+                    
+        if col==1:
+            if text!=value:
+                if self.table.controller and self.table.module:
+                    self.table.lockUpdate()
+                    self.table.controller.add_annotation((key, text),
+                                                         self.table.module.id)
+                    self.table.unlockUpdate()
+            if row == self.table.rowCount()-1:
+                self.table.addRow()
+            
+        elif text!='' and self.table.controller and self.table.module:
+            moduleId = self.table.module.id
+            self.table.lockUpdate()
+            self.table.controller.previousModuleIds = [moduleId]
+            if key!=text and key!='':
+                self.table.controller.delete_annotation(key, moduleId)
+            self.table.controller.add_annotation((text, value),
+                                                 moduleId)
+            self.table.unlockUpdate()
+        
+        model.setData(index, text)        
diff --git a/vistrails/gui/module_configuration.py b/vistrails/gui/module_configuration.py
new file mode 100644
index 0000000..b34f4c3
--- /dev/null
+++ b/vistrails/gui/module_configuration.py
@@ -0,0 +1,193 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file describe the module configuration box that is displayed when
+the user selects a module's "Edit Configuration"
+
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.modules.module_registry import get_module_registry, \
+    ModuleRegistryException
+from vistrails.gui.modules.module_configure import DefaultModuleConfigurationWidget
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+################################################################################
+
+class QConfigurationWidget(QtGui.QWidget):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.setLayout(QtGui.QVBoxLayout())
+        self.widget = None
+        #self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        
+    def setUpWidget(self, widget):
+        self.widget = widget
+        self.layout().addWidget(self.widget)
+        
+    def clear(self):
+        """ clear() -> None
+        Clear and delete widget in the layout
+        
+        """
+        if self.widget:
+            self.widget.setVisible(False)
+            self.layout().removeWidget(self.widget)
+            self.widget.deleteLater()
+        self.widget = None
+        
+    def askToSaveChanges(self):
+        if self.widget:
+            return self.widget.askToSaveChanges()
+        
+    def activate(self):
+        if self.widget:
+            self.widget.activate()
+            
+################################################################################
+        
+class QModuleConfiguration(QtGui.QScrollArea, QVistrailsPaletteInterface):
+    def __init__(self, parent=None, scene=None):
+        """QModuleConfiguration(parent: QWidget) -> QModuleConfiguration
+        Initialize widget constraints
+        
+        """
+        QtGui.QScrollArea.__init__(self, parent)
+        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
+        self.setWindowTitle('Module Configuration')
+        self.setWidgetResizable(True)
+        self.confWidget = QConfigurationWidget()
+        self.setWidget(self.confWidget)
+        self.module = None
+        self.controller = None
+        self.scene = scene
+        self.updateLocked = False
+        self.hasChanges = False
+        
+    def set_controller(self, controller):
+        self.controller = controller
+        self.scene = controller.current_pipeline_scene
+
+        selected_ids = self.scene.get_selected_module_ids() 
+        modules = [controller.current_pipeline.modules[i] 
+                   for i in selected_ids]
+        if len(modules) == 1:
+            self.updateModule(modules[0])
+        else:
+            self.updateModule(None)
+
+    def updateModule(self, module):
+        if self.updateLocked: return
+        self.check_need_save_changes()
+        self.module = module
+        self.confWidget.setUpdatesEnabled(False)    
+        self.confWidget.setVisible(False)
+        self.confWidget.clear()
+        if module and self.controller:
+            # if module.has_annotation_with_key('__desc__'):
+            #     label = module.get_annotation_by_key('__desc__').value.strip()
+            #     title = '%s (%s) Module Configuration'%(label,
+            #                                             module.name)
+            # else:
+            #     title = '%s Module Configuration'%module.name
+            # self.setWindowTitle(title)
+            registry = get_module_registry()
+            getter = registry.get_configuration_widget
+            widgetType = None
+            try:
+                widgetType = \
+                    getter(module.package, module.name, module.namespace)
+            except ModuleRegistryException:
+                pass
+            if not widgetType:
+                widgetType = DefaultModuleConfigurationWidget
+            widget = widgetType(module, self.controller)
+        
+            self.confWidget.setUpWidget(widget)
+            self.connect(widget, QtCore.SIGNAL("doneConfigure"),
+                         self.configureDone)
+            self.connect(widget, QtCore.SIGNAL("stateChanged"),
+                         self.stateChanged)
+        self.confWidget.setUpdatesEnabled(True)
+        self.confWidget.setVisible(True)
+        self.hasChanges = False
+        # we need to reset the title in case there were changes
+        self.setWindowTitle("Module Configuration")
+    
+    def configureDone(self):
+        from vistrails.gui.vistrails_window import _app
+        self.emit(QtCore.SIGNAL('doneConfigure'), self.module.id)  
+        _app.notify('module_done_configure', self.module.id)
+        
+    def stateChanged(self):
+        self.hasChanges = self.confWidget.widget.state_changed
+        # self.setWindowModified seems not to work here
+        # self.setWindowModified(self.hasChanges)
+        title = str(self.windowTitle())
+        if self.hasChanges:
+            if not title.endswith("*"):
+                self.setWindowTitle(title + "*")
+        else:
+            if title.endswith("*"):
+                self.setWindowTitle(title[:-1])
+        
+    def lockUpdate(self):
+        """ lockUpdate() -> None
+        Do not allow updateModule()
+        
+        """
+        self.updateLocked = True
+        
+    def unlockUpdate(self):
+        """ unlockUpdate() -> None
+        Allow updateModule()
+        
+        """
+        self.updateLocked = False
+        
+    def closeEvent(self, event):
+        self.confWidget.askToSaveChanges()
+        event.accept()
+        
+    def activate(self):
+        if self.isVisible() == False:
+            # self.toolWindow().show()
+            self.show()
+        self.activateWindow()
+        self.confWidget.activate()
+        
+    def check_need_save_changes(self):
+        if self.confWidget:
+            self.lockUpdate()
+            self.confWidget.askToSaveChanges()
+            self.unlockUpdate()
diff --git a/vistrails/gui/module_documentation.py b/vistrails/gui/module_documentation.py
new file mode 100644
index 0000000..ef5df24
--- /dev/null
+++ b/vistrails/gui/module_documentation.py
@@ -0,0 +1,113 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains a dialog and widgets related to the module documentation
+dialog, which displays the available documentation for a given VisTrails module.
+
+QModuleDocumentation
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.modules.module_registry import ModuleRegistryException
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+################################################################################
+
+class QModuleDocumentation(QtGui.QDialog, QVistrailsPaletteInterface):
+    """
+    QModuleDocumentation is a dialog for showing module documentation. duh.
+
+    """
+    def __init__(self, parent=None):
+        """ 
+        QModuleAnnotation(parent)
+        -> None
+
+        """
+        QtGui.QDialog.__init__(self, parent)
+        # self.setModal(True)
+        self.setWindowTitle("Module Documentation")
+        self.setLayout(QtGui.QVBoxLayout())
+        # self.layout().addStrut()
+        self.name_label = QtGui.QLabel("")
+        self.layout().addWidget(self.name_label)
+        self.package_label = QtGui.QLabel("")
+        self.layout().addWidget(self.package_label)
+        # self.closeButton = QtGui.QPushButton('Ok', self)
+        self.textEdit = QtGui.QTextEdit(self)
+        self.layout().addWidget(self.textEdit, 1)
+        self.textEdit.setReadOnly(True)
+        self.textEdit.setTextCursor(QtGui.QTextCursor(self.textEdit.document()))
+        # self.layout().addWidget(self.closeButton)
+        # self.connect(self.closeButton, QtCore.SIGNAL('clicked(bool)'), 
+        #              self.close)
+        # self.closeButton.setShortcut('Enter')
+
+        self.update_descriptor()
+
+    def set_controller(self, controller):
+        scene = controller.current_pipeline_scene
+        selected_ids = scene.get_selected_module_ids() 
+        modules = [controller.current_pipeline.modules[i] 
+                   for i in selected_ids]
+        if len(modules) == 1:
+            self.update_module(modules[0])
+        else:
+            self.update_module(None)
+
+    def update_module(self, module=None):
+        descriptor = None
+        try:
+            if module and module.module_descriptor:
+                descriptor = module.module_descriptor
+        except ModuleRegistryException:
+            pass
+        self.update_descriptor(descriptor, module)
+
+    def update_descriptor(self, descriptor=None, module=None):
+        if descriptor is None:
+            # self.setWindowTitle("Module Documentation")
+            self.name_label.setText("Module name:")
+            self.package_label.setText("Module package:")
+            self.textEdit.setText("")
+        else:
+            # self.setWindowTitle('%s Documentation' % descriptor.name)
+            self.name_label.setText("Module name: %s" % descriptor.name)
+            self.package_label.setText("Module package: %s" % \
+                                           descriptor.module_package())
+            self.textEdit.setText(descriptor.module_documentation(module))
+
+    def activate(self):
+        if self.isVisible() == False:
+            self.show()
+        self.activateWindow()
diff --git a/vistrails/gui/module_info.py b/vistrails/gui/module_info.py
new file mode 100644
index 0000000..b35c1a7
--- /dev/null
+++ b/vistrails/gui/module_info.py
@@ -0,0 +1,211 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core.utils import versions_increasing
+from vistrails.gui.common_widgets import QDockPushButton
+from vistrails.gui.module_annotation import QModuleAnnotationTable
+from vistrails.gui.ports_pane import PortsList
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+class QModuleInfo(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None, flags=QtCore.Qt.Widget):
+        QtGui.QWidget.__init__(self, parent, flags)
+        self.build_widget()
+        self.controller = None
+        self.module = None
+        self.pipeline_view = None # pipeline_view
+        self.read_only = False
+        self.is_updating = False
+
+    def build_widget(self):
+        name_label = QtGui.QLabel("Name:")
+        self.name_edit = QtGui.QLineEdit()
+        self.connect(self.name_edit, QtCore.SIGNAL('editingFinished()'),
+                     self.name_editing_finished)
+        self.name_edit.setMinimumSize(50, 22)
+        type_label = QtGui.QLabel("Type:")
+        self.type_edit = QtGui.QLabel("")
+        # self.type_edit.setReadOnly(True)
+        package_label = QtGui.QLabel("Package:")
+        self.package_edit = QtGui.QLabel("")
+        # self.package_edit.setReadOnly(True)
+        id = QtGui.QLabel("Id:")
+        self.module_id = QtGui.QLabel("")
+        # self.module_id.setReadOnly(True)
+        self.configure_button = QDockPushButton("Configure")
+        self.connect(self.configure_button, QtCore.SIGNAL('clicked()'),
+                     self.configure)
+        self.doc_button = QDockPushButton("Documentation")
+        self.connect(self.doc_button, QtCore.SIGNAL('clicked()'),
+                     self.documentation)
+
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(2)
+        layout.setSpacing(4)
+        def add_line(left, right):
+            h_layout = QtGui.QHBoxLayout()
+            h_layout.setMargin(2)
+            h_layout.setSpacing(2)
+            h_layout.setAlignment(QtCore.Qt.AlignLeft)
+            h_layout.addWidget(left)
+            h_layout.addWidget(right)
+            h_widget = QtGui.QWidget()
+            h_widget.setLayout(h_layout)
+            h_widget.setSizePolicy(QtGui.QSizePolicy.Ignored,
+                                   QtGui.QSizePolicy.Preferred)
+            layout.addWidget(h_widget)
+        add_line(name_label, self.name_edit)
+        add_line(type_label, self.type_edit)
+        add_line(package_label, self.package_edit)
+        add_line(id, self.module_id)
+        h_layout = QtGui.QHBoxLayout()
+        h_layout.setMargin(2)
+        h_layout.setSpacing(5)
+        h_layout.setAlignment(QtCore.Qt.AlignCenter)
+        h_layout.addWidget(self.configure_button)
+        h_layout.addWidget(self.doc_button)
+        layout.addLayout(h_layout)
+        
+        self.tab_widget = QtGui.QTabWidget()
+        # this causes a crash when undocking the palette in Mac OS X
+        # see https://bugreports.qt-project.org/browse/QTBUG-16851
+        # self.tab_widget.setDocumentMode(True)
+        self.input_ports_list = PortsList('input')
+        self.tab_widget.addTab(self.input_ports_list, 'Inputs')
+        self.output_ports_list = PortsList('output')
+        self.tab_widget.addTab(self.output_ports_list, 'Outputs')
+        self.ports_lists = [self.input_ports_list,
+                            self.output_ports_list]
+        self.annotations = QModuleAnnotationTable()
+        self.tab_widget.addTab(self.annotations, 'Annotations')
+        layout.addWidget(self.tab_widget, 1)
+
+        layout.setAlignment(QtCore.Qt.AlignTop)
+        self.setLayout(layout)
+        self.setWindowTitle('Module Information')
+
+    def setReadOnly(self, read_only):
+        if read_only != self.read_only:
+            self.read_only = read_only
+            for widget in self.ports_lists + [self.annotations]:
+                widget.setReadOnly(read_only)
+
+    def set_controller(self, controller):
+        self.controller = controller
+        for ports_list in self.ports_lists:
+            ports_list.set_controller(controller)
+        self.annotations.set_controller(controller)
+
+        scene = self.controller.current_pipeline_scene
+        selected_ids = scene.get_selected_module_ids() 
+        modules = [self.controller.current_pipeline.modules[i] 
+                   for i in selected_ids]
+        if len(modules) == 1:
+            self.update_module(modules[0])
+        else:
+            self.update_module(None)
+
+    def update_module(self, module=None):
+        self.module = module
+        for ports_list in self.ports_lists:
+            ports_list.update_module(module)
+        self.annotations.updateModule(module)
+
+        if module is None:
+            self.name_edit.setText("")
+            if not versions_increasing(QtCore.QT_VERSION_STR, '4.7.0'):
+                self.name_edit.setPlaceholderText("")
+            # self.name_edit.setEnabled(False)
+            self.type_edit.setText("")
+            # self.type_edit.setEnabled(False)
+            self.package_edit.setText("")
+            self.module_id.setText("")
+        else:
+            if module.has_annotation_with_key('__desc__'):
+                label = module.get_annotation_by_key('__desc__').value.strip()
+            else:
+                label = ''
+            self.name_edit.setText(label)
+            if not label and not versions_increasing(QtCore.QT_VERSION_STR, 
+                                                     '4.7.0'):
+                self.name_edit.setPlaceholderText(self.module.name)
+
+            # self.name_edit.setEnabled(True)
+            self.type_edit.setText(self.module.name)
+            # self.type_edit.setEnabled(True)
+            self.package_edit.setText(self.module.package)
+            # self.package_edit.setEnabled(True)
+            self.module_id.setText('%d' % self.module.id)
+            # self.module_id.setEnabled(True)
+
+    def name_editing_finished(self):
+        # updating module may trigger a second call so we check for that
+        if self.is_updating or self.module is None:
+            return
+        try:
+            self.is_updating = True
+            old_text = ''
+            if self.module.has_annotation_with_key('__desc__'):
+                old_text = self.module.get_annotation_by_key('__desc__').value
+            new_text = str(self.name_edit.text()).strip()
+            if not new_text:
+                if old_text:
+                    self.controller.delete_annotation('__desc__', 
+                                                      self.module.id)
+            elif old_text != new_text:
+                self.controller.add_annotation(('__desc__', new_text), 
+                                               self.module.id)
+            scene = self.controller.current_pipeline_scene
+            scene.recreate_module(self.controller.current_pipeline, 
+                                  self.module.id)
+        finally:
+            self.is_updating = False
+            
+    def configure(self):
+        from vistrails.gui.vistrails_window import _app
+        _app.configure_module()
+
+    def documentation(self):
+        from vistrails.gui.vistrails_window import _app
+        _app.show_documentation()
+        
+    def update_entry_klass(self, entry_klass):
+        self.input_ports_list.set_entry_klass(entry_klass)
+        
+    def show_annotations(self):
+        if self.module is not None:
+            self.tab_widget.setCurrentWidget(self.annotations)
+            self.annotations.editNextAvailableCell()
diff --git a/vistrails/gui/module_palette.py b/vistrails/gui/module_palette.py
new file mode 100644
index 0000000..36668f0
--- /dev/null
+++ b/vistrails/gui/module_palette.py
@@ -0,0 +1,544 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains widgets related to the module palette
+displaying a list of all modules in Vistrails
+
+QModulePalette
+QModuleTreeWidget
+QModuleTreeWidgetItem
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core import get_vistrails_application
+from vistrails.core import debug
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.system import systemType
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.gui.common_widgets import (QSearchTreeWindow,
+                                QSearchTreeWidget)
+from vistrails.gui.module_documentation import QModuleDocumentation
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+import weakref
+
+################################################################################
+                
+class QModulePalette(QSearchTreeWindow, QVistrailsPaletteInterface):
+    """
+    QModulePalette just inherits from QSearchTreeWindow to have its
+    own type of tree widget
+
+    """
+    def __init__(self, parent=None):
+        QSearchTreeWindow.__init__(self, parent)
+        self.setContentsMargins(0,5,0,0)
+        self.packages = {}
+        self.namespaces = {}
+        self.addButtonsToToolBar()
+        
+    def addButtonsToToolBar(self):
+        self.expandAction = QtGui.QAction(CurrentTheme.EXPAND_ALL_ICON,
+                                           "Expand All", self.toolWindow().toolbar,
+                                           triggered=self.expandAll)
+        
+        self.collapseAction = QtGui.QAction(CurrentTheme.COLLAPSE_ALL_ICON,
+                                           "Collapse All", self.toolWindow().toolbar,
+                                           triggered=self.collapseAll)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.collapseAction)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.expandAction)
+        
+    def expandAll(self):
+        self.treeWidget.expandAll()
+    
+    def collapseAll(self):
+        self.treeWidget.collapseAll()
+
+    def link_registry(self):
+        self.updateFromModuleRegistry()
+        self.connect_registry_signals()
+        
+
+    def connect_registry_signals(self):
+        app = get_vistrails_application()
+        app.register_notification("reg_new_module", self.newModule)
+        app.register_notification("reg_new_package", self.newPackage)
+        app.register_notification("reg_deleted_module", self.deletedModule)
+        app.register_notification("reg_deleted_package", self.deletedPackage)
+        app.register_notification("reg_show_module", self.showModule)
+        app.register_notification("reg_hide_module", self.hideModule)
+        app.register_notification("reg_module_updated", self.switchDescriptors)
+
+        # registry = get_module_registry()
+        # self.connect(registry.signals, registry.signals.new_package_signal,
+        #              self.newPackage)
+        # self.connect(registry.signals, registry.signals.new_module_signal,
+        #              self.newModule)
+        # self.connect(registry.signals, registry.signals.deleted_module_signal,
+        #              self.deletedModule)
+        # self.connect(registry.signals, registry.signals.deleted_package_signal,
+        #              self.deletedPackage)        
+        # self.connect(registry.signals, registry.signals.show_module_signal,
+        #              self.showModule)
+        # self.connect(registry.signals, registry.signals.hide_module_signal,
+        #              self.hideModule)
+        # self.connect(registry.signals, registry.signals.module_updated_signal,
+        #              self.switchDescriptors)
+    
+    def createTreeWidget(self):
+        """ createTreeWidget() -> QModuleTreeWidget
+        Return the search tree widget for this window
+        
+        """
+        self.setWindowTitle('Modules')
+        return QModuleTreeWidget(self)
+
+    def findModule(self, descriptor):
+        moduleName = descriptor.name
+        
+        items = [x for x in
+                 self.treeWidget.findItems(moduleName,
+                                           QtCore.Qt.MatchExactly | 
+                                           QtCore.Qt.MatchWrap | 
+                                           QtCore.Qt.MatchRecursive)
+                 if not x.is_top_level() and x.descriptor == descriptor]
+        if len(items) <> 1:
+            raise VistrailsInternalError("Expected one item (%s), got %d: %s" % 
+                                         (moduleName,
+                                          len(items),
+                                          ";".join(x.descriptor.name 
+                                                   for x in items)))
+        item = items[0]
+        return item
+
+    def showModule(self, descriptor):
+        item = self.findModule(descriptor)
+        item.setHidden(False)
+
+    def hideModule(self, descriptor):
+        item = self.findModule(descriptor)
+        item.setHidden(True)
+
+    def switchDescriptors(self, old_descriptor, new_descriptor):
+        old_item = self.findModule(old_descriptor)
+        new_item = self.findModule(new_descriptor)
+        old_item.set_descriptor(new_descriptor)
+        new_item.set_descriptor(old_descriptor)
+
+    def deletedModule(self, descriptor):
+        """ deletedModule(descriptor: core.modules.module_registry.ModuleDescriptor)
+        A module has been removed from VisTrails
+
+        """
+        if descriptor.module_abstract():
+            # skip abstract and hidden modules, they're not in the tree
+            return
+
+        item = self.findModule(descriptor)
+        parent = item.parent()
+        parent.takeChild(parent.indexOfChild(item))
+        del item.descriptor
+
+    def deletedPackage(self, package):
+        """ deletedPackage(package):
+        A package has been deleted from VisTrails
+        """
+        item = self.packages[package.identifier]()        
+        index = self.treeWidget.indexOfTopLevelItem(item)
+        self.treeWidget.takeTopLevelItem(index)
+        del self.packages[package.identifier]
+
+    def newPackage(self, package_identifier, prepend=False):
+        # prepend places at the front of the list of packages,
+        # by default adds to the end of the list of packages
+        # Right now the list is sorted so prepend has no effect
+        if package_identifier in self.packages:
+            return self.packages[package_identifier]
+        registry = get_module_registry()
+        package_name = registry.packages[package_identifier].name
+        package_item = \
+            QPackageTreeWidgetItem(None, [package_name])
+        self.packages[package_identifier] = weakref.ref(package_item)
+        if prepend:
+            self.treeWidget.insertTopLevelItem(0, package_item)
+        else:
+            self.treeWidget.addTopLevelItem(package_item)
+        return package_item
+            
+    def newModule(self, descriptor, recurse=False):
+        """ newModule(descriptor: core.modules.module_registry.ModuleDescriptor)
+        A new module has been added to VisTrails
+        
+        """
+        if not descriptor.module_abstract(): # and not descriptor.is_hidden:
+            # skip abstract modules, they're no longer in the tree
+
+            # NB: only looks for toplevel matches
+            package_identifier = descriptor.ghost_identifier or descriptor.identifier
+            if package_identifier not in self.packages:
+                package_item = self.newPackage(package_identifier, True)
+            else:
+                package_item = self.packages[package_identifier]()
+
+            if descriptor.ghost_namespace is not None:
+                namespace = descriptor.ghost_namespace
+            else:
+                namespace = descriptor.namespace
+            if descriptor.namespace_hidden or not namespace:
+                parent_item = package_item
+            else:
+                parent_item = \
+                    package_item.get_namespace(namespace.split('|'))
+
+            item = QModuleTreeWidgetItem(descriptor, parent_item,
+                                         [descriptor.name],
+                                         descriptor.is_hidden)
+            if descriptor.is_hidden:
+                item.setHidden(True)
+        if recurse:
+            for child in descriptor.children:
+                self.newModule(child, recurse)
+
+    def updateFromModuleRegistry(self):
+        """ updateFromModuleRegistry(packageName: str) -> None
+        Setup this tree widget to show modules currently inside
+        module_registry.registry
+        
+        """
+
+        self.treeWidget.setSortingEnabled(False)
+        registry = get_module_registry()
+        for package in registry.package_list:
+            self.newPackage(package.identifier)
+        self.newModule(registry.root_descriptor, True)
+        self.treeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
+        self.treeWidget.setSortingEnabled(True)
+#        self.treeWidget.expandAll()
+
+    def sizeHint(self):
+        return QtCore.QSize(256, 760)
+
+class QModuleTreeWidget(QSearchTreeWidget):
+    """
+    QModuleTreeWidget is a subclass of QSearchTreeWidget to display all
+    Vistrails Module
+    
+    """
+    def __init__(self, parent=None):
+        """ QModuleTreeWidget(parent: QWidget) -> QModuleTreeWidget
+        Set up size policy and header
+
+        """
+        QSearchTreeWidget.__init__(self, parent)
+        self.header().hide()
+        self.setRootIsDecorated(False)
+        self.delegate = QModuleTreeWidgetItemDelegate(self, self)
+        self.setItemDelegate(self.delegate)
+        self.connect(self,
+                     QtCore.SIGNAL('itemPressed(QTreeWidgetItem *,int)'),
+                     self.onItemPressed)
+
+    def onItemPressed(self, item, column):
+        """ onItemPressed(item: QTreeWidgetItem, column: int) -> None
+        Expand/Collapse top-level item when the mouse is pressed
+        
+        """
+        if item and item.parent() == None:
+            self.setItemExpanded(item, not self.isItemExpanded(item))
+
+    def contextMenuEvent(self, event):
+        # Just dispatches the menu event to the widget item
+        item = self.itemAt(event.pos())
+        if item:
+            # find top level
+            p = item
+            while p.parent():
+                p = p.parent()
+            # get package identifier
+            identifiers = [i for i, j in self.parent().packages.iteritems()
+                           if j == weakref.ref(p)]
+            if identifiers:
+                try:
+                    identifier = identifiers[0]
+                    registry = get_module_registry()
+                    package = registry.packages[identifier]
+                    if package.has_contextMenuName():
+                        name = package.contextMenuName(str(item.text(0)))
+                        if name:
+                            act = QtGui.QAction(name, self)
+                            act.setStatusTip(name)
+                            def callMenu():
+                                if package.has_callContextMenu():
+                                    name = package.callContextMenu(str(item.text(0)))
+
+                            QtCore.QObject.connect(act,
+                                                   QtCore.SIGNAL("triggered()"),
+                                                   callMenu)
+                            menu = QtGui.QMenu(self)
+                            menu.addAction(act)
+                            menu.exec_(event.globalPos())
+                        return
+                except Exception, e:
+                    debug.warning("Got exception trying to display %s's "
+                                  "context menu in the palette: %s: %s" % (
+                                  package.name,
+                                  type(e).__name__, ', '.join(e.args)))
+
+            item.contextMenuEvent(event, self)
+
+    def startDrag(self, actions):
+        indexes = self.selectedIndexes()
+        if len(indexes) > 0:
+            mime_data = self.model().mimeData(indexes)
+            drag = QtGui.QDrag(self)
+            drag.setMimeData(mime_data)
+            item = mime_data.items[0]
+            
+            app = get_vistrails_application()
+            pipeline_view = app.builderWindow.get_current_controller().current_pipeline_view
+            if hasattr(pipeline_view.scene(), 'add_tmp_module'):
+                module_item = \
+                    pipeline_view.scene().add_tmp_module(item.descriptor)
+                pixmap = pipeline_view.paintModuleToPixmap(module_item)
+
+                drag.setPixmap(pixmap)
+                drag.setHotSpot(QtCore.QPoint(pixmap.width()/2, 
+                                              pixmap.height()/2))
+                drag.exec_(actions)
+                pipeline_view.scene().delete_tmp_module()
+
+
+class QModuleTreeWidgetItemDelegate(QtGui.QItemDelegate):
+    """    
+    QModuleTreeWidgetItemDelegate will override the original
+    QTreeWidget paint function to draw buttons for top-level item
+    similar to QtDesigner. This mimics
+    Qt/tools/designer/src/lib/shared/sheet_delegate, which is only a
+    private class from QtDesigned.
+    
+    """
+    def __init__(self, view, parent):
+        """ QModuleTreeWidgetItemDelegate(view: QTreeView,
+                                          parent: QWidget)
+                                          -> QModuleTreeWidgetItemDelegate
+        Create the item delegate given the tree view
+        
+        """
+        QtGui.QItemDelegate.__init__(self, parent)
+        self.treeView = view
+        self.isMac = systemType in ['Darwin']
+
+    def paint(self, painter, option, index):
+        """ painter(painter: QPainter, option QStyleOptionViewItem,
+                    index: QModelIndex) -> None
+        Repaint the top-level item to have a button-look style
+        
+        """
+        model = index.model()
+        if not model.parent(index).isValid():
+            buttonOption = QtGui.QStyleOptionButton()            
+            buttonOption.state = option.state
+            if self.isMac:
+                buttonOption.state |= QtGui.QStyle.State_Raised
+            buttonOption.state &= ~QtGui.QStyle.State_HasFocus
+
+            buttonOption.rect = option.rect
+            buttonOption.palette = option.palette
+            buttonOption.features = QtGui.QStyleOptionButton.None
+
+            style = self.treeView.style()
+            
+            style.drawControl(QtGui.QStyle.CE_PushButton,
+                              buttonOption,
+                              painter,
+                              self.treeView)
+
+            branchOption = QtGui.QStyleOption()
+            i = 9 ### hardcoded in qcommonstyle.cpp
+            r = option.rect
+            branchOption.rect = QtCore.QRect(r.left() + i / 2,
+                                             r.top() + (r.height() - i) / 2,
+                                             i, i)
+            branchOption.palette = option.palette
+            branchOption.state = QtGui.QStyle.State_Children
+
+            if self.treeView.isExpanded(index):
+                branchOption.state |= QtGui.QStyle.State_Open
+                
+            style.drawPrimitive(QtGui.QStyle.PE_IndicatorBranch,
+                                branchOption,
+                                painter, self.treeView)
+
+            textrect = QtCore.QRect(r.left() + i * 2,
+                                    r.top(),
+                                    r.width() - ((5 * i) / 2),
+                                    r.height())
+            text = option.fontMetrics.elidedText(
+                model.data(index,
+                           QtCore.Qt.DisplayRole),
+                QtCore.Qt.ElideMiddle,
+                textrect.width())
+            style.drawItemText(painter,
+                               textrect,
+                               QtCore.Qt.AlignCenter,
+                               option.palette,
+                               self.treeView.isEnabled(),
+                               text)
+        else:
+            QtGui.QItemDelegate.paint(self, painter, option, index)
+
+    def sizeHint(self, option, index):
+        """ sizeHint(option: QStyleOptionViewItem, index: QModelIndex) -> None
+        Take into account the size of the top-level button
+        
+        """
+        return (QtGui.QItemDelegate.sizeHint(self, option, index) + 
+                QtCore.QSize(2, 2))
+
+
+
+class QModuleTreeWidgetItem(QtGui.QTreeWidgetItem):
+    """
+    QModuleTreeWidgetItem represents module on QModuleTreeWidget
+    
+    """
+    
+    def __init__(self, descriptor, parent, labelList, is_hidden):
+        """ QModuleTreeWidgetItem(descriptor: ModuleDescriptor
+                                    (or None for top-level),
+                                  parent: QTreeWidgetItem
+                                  labelList: string)
+                                  -> QModuleTreeWidget                                  
+        Create a new tree widget item with a specific parent and
+        labels
+
+        """
+        QtGui.QTreeWidgetItem.__init__(self, parent, labelList)
+        self.set_descriptor(descriptor)
+
+        # Real flags store the widget's flags prior to masking related
+        # to abstract modules, etc.
+        self._real_flags = self.flags()
+
+        # This is necessary since we override setFlags
+        self.setFlags(self._real_flags)
+
+        self.is_hidden = is_hidden
+
+    def added_input_port(self):
+        self.setFlags(self._real_flags)
+
+    def added_output_port(self):
+        self.setFlags(self._real_flags)
+
+    def setFlags(self, flags):
+        self._real_flags = flags
+        d = self.descriptor
+        if d is None:
+            # toplevel moduletree widgets are never draggable
+            flags = flags & ~QtCore.Qt.ItemIsDragEnabled
+        elif d.module_abstract():
+            # moduletree widgets for abstract modules are never
+            # draggable or enabled
+            flags = flags & ~(QtCore.Qt.ItemIsDragEnabled | 
+                              QtCore.Qt.ItemIsSelectable)
+        QtGui.QTreeWidgetItem.setFlags(self, flags)
+            
+    def is_top_level(self):
+        return self.descriptor is None
+
+    def contextMenuEvent(self, event, widget):
+        if self.is_top_level():
+            return
+        menu = QtGui.QMenu(widget)
+        act = QtGui.QAction("View Documentation", widget)
+        act.setStatusTip("View module documentation")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.view_documentation)
+        menu.addAction(act)
+        if self.descriptor.package == 'local.abstractions':
+            act = QtGui.QAction("Edit Subworkflow", widget)
+            act.setStatusTip("Edit this Subworkflow")
+            QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.edit_subworkflow)
+            menu.addAction(act)
+        menu.exec_(event.globalPos())
+
+    def view_documentation(self):
+        from vistrails_window import _app
+        _app.show_documentation()
+        widget = QModuleDocumentation.instance()
+        widget.update_descriptor(self.descriptor)
+
+    def edit_subworkflow(self):
+        from vistrails_window import _app
+        filename = self.descriptor.module.vt_fname
+        _app.openAbstraction(filename)
+        
+    def set_descriptor(self, descriptor):
+        self.descriptor = descriptor
+        if descriptor:
+            descriptor.set_widget(self)
+
+class QNamespaceTreeWidgetItem(QModuleTreeWidgetItem):
+    def __init__(self, parent, labelList):
+        QModuleTreeWidgetItem.__init__(self, None, parent, labelList, False)
+        self.setFlags(self.flags() & ~QtCore.Qt.ItemIsDragEnabled)
+        self.namespaces = {}
+
+    def get_namespace(self, namespace_items):
+        if len(namespace_items) <= 0:
+            return self
+        namespace_item = namespace_items.pop(0)
+        if namespace_item in self.namespaces and self.namespaces[namespace_item]():
+            item = self.namespaces[namespace_item]()
+        else:
+            item = QNamespaceTreeWidgetItem(self, [namespace_item])
+            self.namespaces[namespace_item] = weakref.ref(item)
+        return item.get_namespace(namespace_items)
+
+    def takeChild(self, index):
+        child = self.child(index)
+        if hasattr(self, "namespaces"):
+            if str(child.text(0)) in self.namespaces:
+                del self.namespaces[str(child.text(0))]
+        QModuleTreeWidgetItem.takeChild(self, index)
+        if self.childCount() < 1 and self.parent():
+            self.parent().takeChild(self.parent().indexOfChild(self))
+
+class QPackageTreeWidgetItem(QNamespaceTreeWidgetItem):
+    pass
diff --git a/vistrails/gui/modules/__init__.py b/vistrails/gui/modules/__init__.py
new file mode 100644
index 0000000..e2481ce
--- /dev/null
+++ b/vistrails/gui/modules/__init__.py
@@ -0,0 +1,63 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from constant_configuration import StandardConstantWidgetBase
+from query_configuration import BaseQueryWidget
+
+def get_widget_class(module_klass):
+    klass = module_klass.get_widget_class()
+    if klass is None:
+        return StandardConstantWidgetBase
+    if isinstance(klass, tuple):
+        (path, klass_name) = klass
+        module = __import__(path, globals(), locals(), [klass_name])
+        return getattr(module, klass_name)
+    return klass
+
+def get_query_widget_class(module_klass):
+    klass = module_klass.get_query_widget_class()
+    if klass is None:
+        class DefaultQueryWidget(BaseQueryWidget):
+            def __init__(self, param, parent=None):
+                BaseQueryWidget.__init__(self, get_widget_class(module_klass), 
+                                         ["==", "!="],
+                                         param, parent)
+        return DefaultQueryWidget
+    if isinstance(klass, tuple):
+        (path, klass_name) = klass
+        module = __import__(path, globals(), locals(), [klass_name])
+        return getattr(module, klass_name)
+    return klass
+
diff --git a/vistrails/gui/modules/constant_configuration.py b/vistrails/gui/modules/constant_configuration.py
new file mode 100644
index 0000000..88d517a
--- /dev/null
+++ b/vistrails/gui/modules/constant_configuration.py
@@ -0,0 +1,775 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file specifies the configuration widget for Constant
+modules. Please notice that this is different from the module configuration
+widget described in module_configure.py. We present a Color constant to be
+used as a template for creating a configuration widget for other custom
+constants.
+
+"""
+
+from PyQt4 import QtCore, QtGui
+from vistrails.core.utils import any, expression, versions_increasing
+from vistrails.core import system
+from vistrails.gui.theme import CurrentTheme
+
+############################################################################
+
+def setPlaceholderTextCompat(self, value):
+    """ Qt pre 4.7.0 does not have setPlaceholderText
+    """
+    if versions_increasing(QtCore.QT_VERSION_STR, '4.7.0'):
+        self.setText(value)
+    else:
+        self.setPlaceholderText(value)
+
+class ConstantWidgetMixin(object):
+
+    def __init__(self, contents=None):
+        self._last_contents = contents
+
+    def update_parent(self):
+        newContents = self.contents()
+        if newContents != self._last_contents:
+            if self.parent() and hasattr(self.parent(), 'updateMethod'):
+                self.parent().updateMethod()
+            self._last_contents = newContents
+            self.emit(QtCore.SIGNAL('contentsChanged'), (self, newContents))
+
+    def setDefault(self, strValue):
+        pass
+
+class StandardConstantWidgetBase(ConstantWidgetMixin):
+    """
+    StandardConstantWidget is a basic widget to be used
+    to edit int/float/string values in VisTrails.
+
+    When creating your own widget, you can subclass from this widget if you
+    need only a QLineEdit or use your own QT widget. There are two things you
+    need to pay attention to:
+
+    1) Re-implement the contents() method so we can get the current value
+       stored in the widget.
+
+    2) When the user is done with configuration, make sure to call
+       update_parent() so VisTrails can pass that information to the Provenance
+       System. In this example we do that on focusOutEvent and when the user
+       presses the return key.
+
+    """
+    def __new__(cls, *args, **kwargs):
+        param = None
+        if len(args) > 0:
+            param = args[0]
+        if 'param' in kwargs:
+            param = kwargs['param']
+        if param is None:
+            raise ValueError("Must pass param as first argument.")
+        if param.port_spec_item and param.port_spec_item.entry_type and \
+                param.port_spec_item.entry_type.startswith("enum"):
+            return StandardConstantEnumWidget.__new__(StandardConstantEnumWidget, *args, **kwargs)
+        return StandardConstantWidget.__new__(StandardConstantWidget, *args, **kwargs)
+
+    def __init__(self, param, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+                    parent: QWidget)
+
+        Initialize the line edit with its contents. Content type is limited
+        to 'int', 'float', and 'string'
+
+        """
+
+        psi = param.port_spec_item
+        if param.strValue:
+            value = param.strValue
+        elif psi and psi.default:
+            value = psi.default
+        else:
+            value = param.strValue
+        ConstantWidgetMixin.__init__(self, value)
+
+        # assert param.namespace == None
+        # assert param.identifier == 'org.vistrails.vistrails.basic'
+        if psi and psi.default:
+            self.setDefault(psi.default)
+        contents = param.strValue
+        contentType = param.type
+        if contents: # do not replace old default value with empty value
+            self.setText(contents)
+        self._contentType = contentType
+
+    def setDefault(self, default):
+        # Implement this in a subclass!
+        pass
+
+    def contents(self):
+        """contents() -> str
+        Re-implement this method to make sure that it will return a string
+        representation of the value that it will be passed to the module
+        As this is a QLineEdit, we just call text()
+
+        """
+        self.update_text()
+        return str(self.text())
+
+    def setContents(self, strValue, silent=True):
+        """setContents(strValue: str) -> None
+        Re-implement this method so the widget can change its value after 
+        constructed. If silent is False, it will propagate the event back 
+        to the parent.
+        As this is a QLineEdit, we just call setText(strValue)
+        """
+        self.setText(strValue)
+        self.update_text()
+        if not silent:
+            self.update_parent()
+            
+    def update_text(self):
+        """ update_text() -> None
+        Update the text to the result of the evaluation
+
+        """
+        # FIXME: eval should pretty much never be used
+        base = expression.evaluate_expressions(self.text())
+        if self._contentType == 'String':
+            self.setText(base)
+        else:
+            try:
+                self.setText(str(eval(str(base), None, None)))
+            except:
+                self.setText(base)
+
+
+class StandardConstantWidget(QtGui.QLineEdit, StandardConstantWidgetBase):
+    def __init__(self, param, parent=None):
+        QtGui.QLineEdit.__init__(self, parent)
+        StandardConstantWidgetBase.__init__(self, param, parent)
+        self.connect(self,
+                     QtCore.SIGNAL('returnPressed()'),
+                     self.update_parent)
+
+    def setDefault(self, value):
+        setPlaceholderTextCompat(self, value)
+
+    def sizeHint(self):
+        metrics = QtGui.QFontMetrics(self.font())
+        width = min(metrics.width(self.text())+10,70)
+        return QtCore.QSize(width, 
+                            metrics.height()+6)
+    
+    def minimumSizeHint(self):
+        return self.sizeHint()
+
+    ###########################################################################
+    # event handlers
+
+    def focusInEvent(self, event):
+        """ focusInEvent(event: QEvent) -> None
+        Pass the event to the parent
+
+        """
+        self._contents = str(self.text())
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+        QtGui.QLineEdit.focusInEvent(self, event)
+
+    def focusOutEvent(self, event):
+        self.update_parent()
+        QtGui.QLineEdit.focusOutEvent(self, event)
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+
+
+class BaseStringWidget(object): # < virtual QtGui.QWidget
+    def focusInEvent(self, event):
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+        super(BaseStringWidget, self).focusInEvent(event)
+
+    def focusOutEvent(self, event):
+        self.parent().update_parent()
+        super(BaseStringWidget, self).focusOutEvent(event)
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+
+
+class SingleLineStringWidget(BaseStringWidget, QtGui.QLineEdit):
+    def __init__(self, parent, contents="", default=""):
+        QtGui.QLineEdit.__init__(self, contents, parent)
+        self.setDefault(default)
+
+        self.connect(self,
+                     QtCore.SIGNAL('returnPressed()'),
+                     parent.update_parent)
+
+    def setContents(self, contents):
+        self.setText(expression.evaluate_expressions(contents))
+
+    def contents(self):
+        contents = expression.evaluate_expressions(unicode(self.text()))
+        self.setText(contents)
+        return contents
+
+    def setDefault(self, value):
+        setPlaceholderTextCompat(self, value)
+
+    def sizeHint(self):
+        metrics = QtGui.QFontMetrics(self.font())
+        width = min(metrics.width(self.text()) + 10, 70)
+        return QtCore.QSize(width,
+                            metrics.height() + 6)
+
+    def minimumSizeHint(self):
+        return self.sizeHint()
+
+
+class MultiLineStringWidget(BaseStringWidget, QtGui.QTextEdit):
+    def __init__(self, parent, contents="", default=""):
+        QtGui.QTextEdit.__init__(self, parent)
+        self.setPlainText(contents)
+        self.setAcceptRichText(False)
+        self.setDefault(default)
+
+    def setContents(self, contents):
+        self.setPlainText(expression.evaluate_expressions(contents))
+
+    def contents(self):
+        contents = expression.evaluate_expressions(unicode(self.toPlainText()))
+        self.setPlainText(contents)
+        return contents
+
+    def setDefault(self, value):
+        pass # TODO : some magic will be required for this
+
+    def sizeHint(self):
+        metrics = QtGui.QFontMetrics(self.font())
+        width = 70
+        return QtCore.QSize(width,
+                            (metrics.height() + 1) * 3 + 5)
+
+    def minimumSizeHint(self):
+        return self.sizeHint()
+
+
+class StringWidget(QtGui.QWidget, ConstantWidgetMixin):
+    def __new__(cls, *args, **kwargs):
+        param = None
+        if len(args) > 0:
+            param = args[0]
+        if 'param' in kwargs:
+            param = kwargs['param']
+        if param is None:
+            raise ValueError("Must pass param as first argument.")
+        if param.port_spec_item and param.port_spec_item.entry_type and \
+                param.port_spec_item.entry_type.startswith("enum"):
+            # StandardConstantEnumWidget is not related to StringWidget, so
+            # we have to call __init__ as well before returning
+            # That's why there's no __new__ here
+            return StandardConstantEnumWidget(*args, **kwargs)
+        return QtGui.QWidget.__new__(cls, *args, **kwargs)
+
+    def __init__(self, param, parent=None):
+        QtGui.QWidget.__init__(self)
+        self.setLayout(QtGui.QHBoxLayout())
+        self.layout().setMargin(5)
+        self.layout().setSpacing(5)
+
+        self._widget = None
+        self._multiline = None
+        self._default = ""
+
+        self._button = QtGui.QToolButton()
+        self._button.setIcon(CurrentTheme.MULTILINE_STRING_ICON)
+        self._button.setIconSize(QtCore.QSize(12, 12))
+        self._button.setToolTip("Toggle multi-line editor")
+        self._button.setAutoRaise(True)
+        self._button.setSizePolicy(QtGui.QSizePolicy(
+                QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed))
+        self._button.setCheckable(True)
+        self.connect(self._button, QtCore.SIGNAL('toggled(bool)'),
+                     self.switch_multiline)
+        self.layout().addWidget(self._button)
+
+        psi = param.port_spec_item
+        if param.strValue:
+            value = param.strValue
+        elif psi and psi.default:
+            value = psi.default
+        else:
+            value = param.strValue
+        ConstantWidgetMixin.__init__(self, value)
+
+        # assert param.namespace == None
+        # assert param.identifier == 'edu.utah.sci.vistrails.basic'
+        if psi and psi.default:
+            self.setDefault(psi.default)
+        contents = param.strValue
+        self.setContents(contents)
+
+    def switch_multiline(self, multiline):
+        if multiline != self._multiline:
+            # Doing multiline -> not multiline while the widget contains
+            # line-returns is weird but won't cause loss of data, so I'm not
+            # explicitely disabling it
+            # Not that the multiline widget will pop up again next time if the
+            # user doesn't change the contents
+            self.setContents(self.contents(), multiline=multiline)
+
+    def setDefault(self, value):
+        self._default = value
+        if self._widget is not None:
+            self._widget.setDefault(value)
+
+    def contents(self):
+        return self._widget.contents()
+
+    def setContents(self, strValue, silent=True, multiline=None):
+        if multiline is None:
+            multiline = '\n' in strValue
+        if self._multiline is not multiline:
+            self._multiline = multiline
+            if self._widget is not None:
+                self._widget.deleteLater()
+            if not multiline:
+                self._widget = SingleLineStringWidget(self,
+                                                      strValue, self._default)
+            else:
+                self._widget = MultiLineStringWidget(self,
+                                                     strValue, self._default)
+            self._button.setChecked(multiline)
+            self.layout().insertWidget(0, self._widget)
+            self.updateGeometry()
+        else:
+            self._widget.setContents(strValue)
+
+        if not silent:
+            self.update_parent()
+
+    def changeEvent(self, event):
+        """ Hide button when in read-only mode
+        
+        """
+        if event.type() == QtCore.QEvent.EnabledChange:
+            self._button.setVisible(self.isEnabled())
+        return QtGui.QWidget.changeEvent(self, event)
+
+    ###########################################################################
+    # event handlers
+
+    def focusInEvent(self, event):
+        #self._contents = str(self.contents())
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+        super(StringWidget, self).focusInEvent(event)
+
+    def focusOutEvent(self, event):
+        self.update_parent()
+        super(StringWidget, self).focusOutEvent(event)
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+
+
+class StandardConstantEnumWidget(QtGui.QComboBox, StandardConstantWidgetBase):
+    def __init__(self, param, parent=None):
+        QtGui.QComboBox.__init__(self, parent)
+        psi = param.port_spec_item
+        if psi and psi.entry_type == 'enumFree':
+            self.setEditable(True)
+            self.setInsertPolicy(QtGui.QComboBox.NoInsert)
+            self.connect(self.lineEdit(),
+                         QtCore.SIGNAL('returnPressed()'),
+                         self.update_parent)
+        self.addItems(psi.values)
+        if psi and (psi.entry_type == "enumEmpty" or 
+                    psi.entry_type == 'enumFree'):
+            self.setCurrentIndex(-1)
+        StandardConstantWidgetBase.__init__(self, param, parent)
+        self.connect(self,
+                     QtCore.SIGNAL('currentIndexChanged(int)'),
+                     self.update_parent)
+
+    def text(self):
+        return self.currentText()
+
+    def setText(self, text):
+        idx = self.findText(text)
+        if idx > -1:
+            self.setCurrentIndex(idx)
+            if self.isEditable():
+                self.lineEdit().setText(text)
+        elif self.isEditable():
+            self.lineEdit().setText(text)
+
+    def setDefault(self, value):
+        idx = self.findText(value)
+        if idx > -1:
+            self.setCurrentIndex(idx)
+            if self.isEditable():
+                setPlaceholderTextCompat(self.lineEdit(), value)
+        elif self.isEditable():
+            setPlaceholderTextCompat(self.lineEdit(), value)
+
+
+    ###########################################################################
+    # event handlers
+
+    def focusInEvent(self, event):
+        """ focusInEvent(event: QEvent) -> None
+        Pass the event to the parent
+
+        """
+        self._contents = str(self.text())
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+        QtGui.QComboBox.focusInEvent(self, event)
+
+    def focusOutEvent(self, event):
+        self.update_parent()
+        QtGui.QComboBox.focusOutEvent(self, event)
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+
+
+###############################################################################
+# File Constant Widgets
+
+class PathChooserToolButton(QtGui.QToolButton):
+    """
+    PathChooserToolButton is a toolbar button that opens a browser for
+    paths.  The lineEdit is updated with the pathname that is selected.
+
+    """
+    def __init__(self, parent=None, lineEdit=None, toolTip=None):
+        """
+        PathChooserToolButton(parent: QWidget, 
+                              lineEdit: StandardConstantWidget) ->
+                 PathChooserToolButton
+
+        """
+        QtGui.QToolButton.__init__(self, parent)
+        self.setIcon(QtGui.QIcon(
+                self.style().standardPixmap(QtGui.QStyle.SP_DirOpenIcon)))
+        self.setIconSize(QtCore.QSize(12,12))
+        if toolTip is None:
+            toolTip = 'Open a file chooser'
+        self.setToolTip(toolTip)
+        self.setAutoRaise(True)
+        self.lineEdit = lineEdit
+        self.connect(self,
+                     QtCore.SIGNAL('clicked()'),
+                     self.runDialog)
+
+    def setPath(self, path):
+        """
+        setPath() -> None
+
+        """
+        if self.lineEdit and path:
+            self.lineEdit.setText(path)
+            self.lineEdit.update_parent()
+            self.parent().update_parent()
+    
+    def openChooser(self):
+        text = self.lineEdit.text() or system.vistrails_data_directory()
+        return QtGui.QFileDialog.getOpenFileName(self,
+                                                 'Use Filename '
+                                                 'as Value...',
+                                                 text,
+                                                 'All files '
+                                                 '(*.*)')
+
+    def runDialog(self):
+        path = self.openChooser()
+        self.setPath(path)
+
+class PathChooserWidget(QtGui.QWidget, ConstantWidgetMixin):
+    """
+    PathChooserWidget is a widget containing a line edit and a button that
+    opens a browser for paths. The lineEdit is updated with the pathname that is
+    selected.
+
+    """    
+    def __init__(self, param, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+        parent: QWidget)
+        Initializes the line edit with contents
+
+        """
+        QtGui.QWidget.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        layout = QtGui.QHBoxLayout()
+        self.line_edit = StandardConstantWidget(param, self)
+        self.browse_button = self.create_browse_button()
+        layout.setMargin(5)
+        layout.setSpacing(5)
+        layout.addWidget(self.line_edit)
+        layout.addWidget(self.browse_button)
+        self.setLayout(layout)
+
+    def create_browse_button(self):
+        return PathChooserToolButton(self, self.line_edit)
+
+    def updateMethod(self):
+        if self.parent() and hasattr(self.parent(), 'updateMethod'):
+            self.parent().updateMethod()
+
+    def contents(self):
+        """contents() -> str
+        Return the contents of the line_edit
+
+        """
+        return self.line_edit.contents()
+    
+    def setContents(self, strValue, silent=True):
+        """setContents(strValue: str) -> None
+        Updates the contents of the line_edit 
+        """
+        self.line_edit.setContents(strValue, silent)
+        if not silent:
+            self.update_parent()
+ 
+        
+    def focusInEvent(self, event):
+        """ focusInEvent(event: QEvent) -> None
+        Pass the event to the parent
+
+        """
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+        QtGui.QWidget.focusInEvent(self, event)   
+        
+    def focusOutEvent(self, event):
+        self.update_parent()
+        QtGui.QWidget.focusOutEvent(self, event)
+        if self.parent():
+            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+
+class FileChooserToolButton(PathChooserToolButton):
+    def __init__(self, parent=None, lineEdit=None):
+        PathChooserToolButton.__init__(self, parent, lineEdit, 
+                                       "Open a file chooser")
+        
+    def openChooser(self):
+        text = self.lineEdit.text() or system.vistrails_data_directory()
+        return QtGui.QFileDialog.getOpenFileName(self,
+                                                 'Use Filename '
+                                                 'as Value...',
+                                                 text,
+                                                 'All files '
+                                                 '(*.*)')
+
+class FileChooserWidget(PathChooserWidget):
+    def create_browse_button(self):
+        return FileChooserToolButton(self, self.line_edit)
+
+
+class DirectoryChooserToolButton(PathChooserToolButton):
+    def __init__(self, parent=None, lineEdit=None):
+        PathChooserToolButton.__init__(self, parent, lineEdit, 
+                                       "Open a directory chooser")
+
+    def openChooser(self):
+        text = self.lineEdit.text() or system.vistrails_data_directory()
+        return QtGui.QFileDialog.getExistingDirectory(self,
+                                                      'Use Directory '
+                                                      'as Value...',
+                                                      text)
+
+class DirectoryChooserWidget(PathChooserWidget):
+    def create_browse_button(self):
+        return DirectoryChooserToolButton(self, self.line_edit)
+
+class OutputPathChooserToolButton(PathChooserToolButton):
+    def __init__(self, parent=None, lineEdit=None):
+        PathChooserToolButton.__init__(self, parent, lineEdit,
+                                       "Open a path chooser")
+    
+    def openChooser(self):
+        text = self.lineEdit.text() or system.vistrails_data_directory()
+        return QtGui.QFileDialog.getSaveFileName(self,
+                                                 'Save Path',
+                                                 text,
+                                                 'All files (*.*)')
+
+class OutputPathChooserWidget(PathChooserWidget):
+    def create_browse_button(self):
+        return OutputPathChooserToolButton(self, self.line_edit)
+
+class BooleanWidget(QtGui.QCheckBox, ConstantWidgetMixin):
+
+    _values = ['True', 'False']
+    _states = [QtCore.Qt.Checked, QtCore.Qt.Unchecked]
+
+    def __init__(self, param, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+                    parent: QWidget)
+        Initializes the line edit with contents
+        """
+        QtGui.QCheckBox.__init__(self, parent)
+
+        psi = param.port_spec_item
+        if param.strValue:
+            value = param.strValue
+        elif psi and psi.default:
+            value = psi.default
+        else:
+            value = param.strValue
+        ConstantWidgetMixin.__init__(self, value)
+
+        if psi and psi.default:
+            self.setDefault(psi.default)
+        if param.strValue:
+            self.setContents(param.strValue)
+
+        self._silent= False
+        self.connect(self, QtCore.SIGNAL('stateChanged(int)'),
+                     self.change_state)
+        
+    def contents(self):
+        return self._values[self._states.index(self.checkState())]
+
+    def setContents(self, strValue, silent=True):
+        if not strValue:
+            return
+
+        assert strValue in self._values
+        if silent:
+            self._silent = True
+        self.setCheckState(self._states[self._values.index(strValue)])
+        if not silent:
+            self.update_parent()
+        self._silent = False
+
+    def setDefault(self, strValue):
+        self.setContents(strValue)
+
+    def change_state(self, state):
+        if not self._silent:
+            self.update_parent()
+
+###############################################################################
+# Constant Color widgets
+
+class ColorChooserButton(QtGui.QPushButton):
+    def __init__(self, parent=None):
+        QtGui.QPushButton.__init__(self, parent)
+        # self.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
+        # self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setFlat(True)
+        self.setAutoFillBackground(True)
+        self.setColor(QtGui.QColor(255,255,255))
+        self.setFixedSize(30,22)
+        if system.systemType == 'Darwin':
+            #the mac's nice look messes up with the colors
+            self.setAttribute(QtCore.Qt.WA_MacMetalStyle, False)
+        self.clicked.connect(self.openChooser)
+
+    def setColor(self, qcolor, silent=True):
+        self.qcolor = qcolor
+        self.setStyleSheet("border: 1px solid black; "
+                           "background-color: rgb(%d, %d, %d);" %
+                           (qcolor.red(), qcolor.green(), qcolor.blue()))
+        self.repaint()
+        if not silent:
+            self.emit(QtCore.SIGNAL("color_selected"))
+
+    def sizeHint(self):
+        return QtCore.QSize(24,24)
+
+    def openChooser(self):
+        """
+        openChooser() -> None
+
+        """
+        color = QtGui.QColorDialog.getColor(self.qcolor, self.parent())
+        if color.isValid():
+            self.setColor(color, silent=False)
+        else:
+            self.setColor(self.qcolor)
+
+
+class ColorWidget(QtGui.QWidget, ConstantWidgetMixin):
+    def __init__(self, param, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+                    parent: QWidget)
+        """
+        psi = param.port_spec_item
+        if not param.strValue and psi and psi.default:
+            contents = psi.default
+            self._is_default = True
+        else:
+            contents = param.strValue
+            self._is_default = not contents
+        QtGui.QWidget.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        layout = QtGui.QHBoxLayout()
+        self.color_indicator = ColorChooserButton(self)
+        self.connect(self.color_indicator,
+                     QtCore.SIGNAL("color_selected"),
+                     self.update_parent)
+        self._last_contents = contents
+        layout.setMargin(5)
+        layout.setSpacing(5)
+        layout.addWidget(self.color_indicator)
+        layout.addStretch(1)
+        self.setLayout(layout)
+        self.setContents(contents)
+        
+    def contents(self):
+        """contents() -> str
+        Return the string representation of color_indicator
+
+        """
+        return "%s,%s,%s" % (self.color_indicator.qcolor.redF(),
+                             self.color_indicator.qcolor.greenF(),
+                             self.color_indicator.qcolor.blueF())
+        
+    def setContents(self, strValue, silent=True):
+        """setContents(strValue: str) -> None
+        Updates the color_indicator to display the color in strValue
+        
+        """
+        if strValue != '':
+            color = strValue.split(',')
+            qcolor = QtGui.QColor(float(color[0])*255,
+                                  float(color[1])*255,
+                                  float(color[2])*255)
+            self.color_indicator.setColor(qcolor, silent)
+        self._is_default = False
+
+    def setDefault(self, strValue):
+        if self._is_default:
+            self.setContents(strValue, True)
+            self._is_default = True
diff --git a/vistrails/gui/modules/list_configuration.py b/vistrails/gui/modules/list_configuration.py
new file mode 100644
index 0000000..6b8cd75
--- /dev/null
+++ b/vistrails/gui/modules/list_configuration.py
@@ -0,0 +1,132 @@
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.gui.modules.module_configure import StandardModuleConfigurationWidget
+
+class ListConfigurationWidget(StandardModuleConfigurationWidget):
+    """
+    Configuration widget allowing to choose the number of ports.
+
+    This is used to build a List from several modules while ensuring a given
+    order. If no particular ordering is needed, connecting multiple ports to
+    the 'head' input ports should be sufficient.
+
+    """
+    def __init__(self, module, controller, parent=None):
+        """ ListConfigurationWidget(module: Module,
+                                     controller: VistrailController,
+                                     parent: QWidget)
+                                     -> TupleConfigurationWidget
+
+        Let StandardModuleConfigurationWidget constructor store the
+        controller/module object from the builder and set up the
+        configuration widget.
+        After StandardModuleConfigurationWidget constructor, all of
+        these will be available:
+        self.module : the Module object int the pipeline
+        self.controller: the current vistrail controller
+
+        """
+        StandardModuleConfigurationWidget.__init__(self, module,
+                                                   controller, parent)
+
+        # Give it a nice window title
+        self.setWindowTitle("List Configuration")
+
+        # Add an empty vertical layout
+        centralLayout = QtGui.QVBoxLayout()
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)
+        self.setLayout(centralLayout)
+
+        # Add the configuration widget
+        config_layout = QtGui.QFormLayout()
+        self.number = QtGui.QSpinBox()
+        self.number.setValue(self.countAdditionalPorts())
+        self.connect(self.number, QtCore.SIGNAL('valueChanged(int)'),
+                     lambda r: self.updateState())
+        config_layout.addRow("Number of additional connections:", self.number)
+        centralLayout.addLayout(config_layout)
+
+        self.createButtons()
+
+    def activate(self):
+        self.number.focusWidget(QtCore.Qt.ActiveWindowFocusReason)
+
+    def createButtons(self):
+        """ createButtons() -> None
+        Create and connect signals to Ok & Cancel button
+
+        """
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.saveButton = QtGui.QPushButton("&Save", self)
+        self.saveButton.setFixedWidth(100)
+        self.saveButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.saveButton)
+        self.resetButton = QtGui.QPushButton("&Reset", self)
+        self.resetButton.setFixedWidth(100)
+        self.resetButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.resetButton)
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.saveButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.saveTriggered)
+        self.connect(self.resetButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.resetTriggered)
+
+    def saveTriggered(self, checked = False):
+        """ saveTriggered(checked: bool) -> None
+        Update vistrail controller and module when the user click Ok
+
+        """
+        if self.updateVistrail():
+            self.saveButton.setEnabled(False)
+            self.resetButton.setEnabled(False)
+            self.state_changed = False
+            self.emit(QtCore.SIGNAL('stateChanged'))
+            self.emit(QtCore.SIGNAL('doneConfigure'), self.module.id)
+
+    def closeEvent(self, event):
+        self.askToSaveChanges()
+        event.accept()
+
+    def updateVistrail(self):
+        """ updateVistrail() -> None
+        Update Vistrail to contain changes in the port table
+
+        """
+        requested = self.number.value()
+        current = self.countAdditionalPorts()
+
+        if requested == current:
+            # Nothing changed
+            return
+
+        if requested > current:
+            sigstring = '(%s:Module)' % get_vistrails_basic_pkg_id()
+            add_ports = [('input', 'item%d' % i, sigstring, -1)
+                           for i in xrange(current, requested)]
+            self.controller.update_ports(self.module.id, [], add_ports)
+        elif requested < current:
+            delete_ports = [('input', p.name) for p in self.module.input_port_specs[requested-current:]]
+            self.controller.update_ports(self.module.id, delete_ports, [])
+        return True
+
+    def countAdditionalPorts(self):
+        return len(self.module.input_port_specs)
+
+    def resetTriggered(self, checked = False):
+        self.number.setValue(self.countAdditionalPorts())
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL('stateChanged'))
+
+    def updateState(self):
+        if not self.hasFocus():
+            self.setFocus(QtCore.Qt.TabFocusReason)
+        self.saveButton.setEnabled(True)
+        self.resetButton.setEnabled(True)
+        if not self.state_changed:
+            self.state_changed = True
+            self.emit(QtCore.SIGNAL('stateChanged'))
diff --git a/vistrails/gui/modules/module_configure.py b/vistrails/gui/modules/module_configure.py
new file mode 100644
index 0000000..686533e
--- /dev/null
+++ b/vistrails/gui/modules/module_configure.py
@@ -0,0 +1,272 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.vistrail.port import PortEndPoint
+from vistrails.gui.utils import show_question, SAVE_BUTTON, DISCARD_BUTTON
+from vistrails.gui.common_widgets import QPromptWidget
+
+class StandardModuleConfigurationWidget(QtGui.QWidget):
+
+    def __init__(self, module, controller, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.module = module
+        self.controller = controller
+        self.state_changed = False
+        
+    def activate(self):
+        #reimplement this to set the focus to a certain widget when activated
+        pass
+    
+    def askToSaveChanges(self):
+        if self.state_changed:
+            message = ('Configuration panel contains unsaved changes. '
+                      'Do you want to save changes before proceeding?' )
+            res = show_question('VisTrails',
+                                message,
+                                buttons = [SAVE_BUTTON, DISCARD_BUTTON])
+            if res == SAVE_BUTTON:
+                self.saveTriggered()
+                return True
+            else:
+                self.resetTriggered()
+                return False
+            
+    def saveTriggered(self):
+        msg = "Must implement saveTriggered in subclass"
+        raise VistrailsInternalError(msg)
+    
+    def resetTriggered(self):
+        msg = "Must implement saveTriggered in subclass"
+        raise VistrailsInternalError(msg)
+
+class DefaultModuleConfigurationWidget(StandardModuleConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        StandardModuleConfigurationWidget.__init__(self, module, controller, 
+                                                   parent)
+        self.prompt = QPromptWidget()
+        self.prompt.setPromptText("Please use the visibility icon (an eye) in" 
+                                  " the Module Information panel to show or"
+                                  " hide a port.")
+        layout = QtGui.QVBoxLayout()
+        layout.addWidget(self.prompt)
+        self.setLayout(layout)
+        self.prompt.showPrompt()
+        
+    def saveTriggered(self):
+        pass
+    
+    def resetTriggered(self):
+        pass
+    
+class _DefaultModuleConfigurationWidget(StandardModuleConfigurationWidget):
+    """ This is the Default ModuleConfigurationWidget that shows a list of
+        ports to be enabled or disabled """
+    def __init__(self, module, controller, parent=None):
+        StandardModuleConfigurationWidget.__init__(self, module, controller, 
+                                                   parent)
+       
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().setMargin(0)
+        self.layout().setSpacing(0)
+        self.scrollArea = QtGui.QScrollArea(self)
+        self.layout().addWidget(self.scrollArea)
+        self.scrollArea.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.listContainer = QtGui.QWidget(self.scrollArea)
+        self.listContainer.setLayout(QtGui.QGridLayout(self.listContainer))
+        self.listContainer.setFocusPolicy(QtCore.Qt.WheelFocus)
+        self.inputPorts = self.module.destinationPorts()
+        self.inputDict = {}
+        self.outputPorts = self.module.sourcePorts()
+        self.outputDict = {}
+        self.constructList()
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.saveButton = QtGui.QPushButton('&Save', self)
+        self.saveButton.setFixedWidth(100)
+        self.saveButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.saveButton)
+        self.resetButton = QtGui.QPushButton('&Reset', self)
+        self.resetButton.setFixedWidth(100)
+        self.resetButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.resetButton)
+        
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.saveButton, QtCore.SIGNAL('clicked(bool)'), 
+                     self.saveTriggered)
+        self.connect(self.resetButton, QtCore.SIGNAL('clicked(bool)'), 
+                     self.resetTriggered)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.WheelFocus)
+        self.adjustSize()
+#        self.mouseOver = False
+        self.state_changed = False
+        
+    ###########################################################################
+    # Focus event handlers
+    # There is something wrong with focus on this widget, because I couldn't
+    # get it to work with just self.setFocusPolicy() and reimplementing 
+    # focusOutEvent. No focus events were being generated at all
+    # I had to force calling setFocus(reason) when something changed
+    # and as this was also generating focusOutEvents when it shouldn't. 
+    # So I also had to force to emit focusOutEvent only when the mouse is not 
+    # over this panel.
+    # I already spent a lot of time trying fix and I couldn't.
+    # If anybody has the time to fix this, please do it. (Emanuele)     
+    #
+    # DAK -- seems to be ok when in the palette window...
+
+#    def focusOutEvent(self, event):
+#        #self.askToSaveChanges()
+#        QtGui.QWidget.focusOutEvent(self, event)
+#        
+#    def enterEvent(self, event):
+#        self.mouseOver = True
+#        
+#    def leaveEvent(self, event):
+#        self.mouseOver = False
+        
+    def checkBoxFromPort(self, port, input_=False):
+        checkBox = QtGui.QCheckBox(port.name)
+        if input_:
+            port_visible = port.name in self.module.visible_input_ports
+        else:
+            port_visible = port.name in self.module.visible_output_ports
+        if not port.optional or port_visible:
+            checkBox.setCheckState(QtCore.Qt.Checked)
+        else:
+            checkBox.setCheckState(QtCore.Qt.Unchecked)
+        if not port.optional or (input_ and port.sigstring=='()'):
+            checkBox.setEnabled(False)
+        return checkBox
+
+    def constructList(self):
+        label = QtGui.QLabel('Input Ports')
+        label.setAlignment(QtCore.Qt.AlignHCenter)
+        label.font().setBold(True)
+        label.font().setPointSize(12)
+        self.listContainer.layout().addWidget(label, 0, 0)
+        label = QtGui.QLabel('Output Ports')
+        label.setAlignment(QtCore.Qt.AlignHCenter)
+        label.font().setBold(True)
+        label.font().setPointSize(12)
+        self.listContainer.layout().addWidget(label, 0, 1)
+
+        for i in xrange(len(self.inputPorts)):
+            port = self.inputPorts[i]
+            checkBox = self.checkBoxFromPort(port, True)
+            checkBox.setFocusPolicy(QtCore.Qt.StrongFocus)
+            self.connect(checkBox, QtCore.SIGNAL("stateChanged(int)"),
+                         self.updateState)
+            self.inputDict[port.name] = checkBox
+            self.listContainer.layout().addWidget(checkBox, i+1, 0)
+        
+        for i in xrange(len(self.outputPorts)):
+            port = self.outputPorts[i]
+            checkBox = self.checkBoxFromPort(port)
+            checkBox.setFocusPolicy(QtCore.Qt.StrongFocus)
+            self.connect(checkBox, QtCore.SIGNAL("stateChanged(int)"),
+                         self.updateState)
+            self.outputDict[port.name] = checkBox
+            self.listContainer.layout().addWidget(checkBox, i+1, 1)
+        
+        self.listContainer.adjustSize()
+        self.listContainer.setFixedHeight(self.listContainer.height())
+        self.scrollArea.setWidget(self.listContainer)
+        self.scrollArea.setWidgetResizable(True)
+
+    def sizeHint(self):
+        return QtCore.QSize(384, 512)
+        
+    def saveTriggered(self, checked = False):
+        for port in self.inputPorts:
+            if (port.optional and
+                self.inputDict[port.name].checkState()==QtCore.Qt.Checked):
+                self.module.visible_input_ports.add(port.name)
+            else:
+                self.module.visible_input_ports.discard(port.name)
+            
+        for port in self.outputPorts:
+            if (port.optional and
+                self.outputDict[port.name].checkState()==QtCore.Qt.Checked):
+                self.module.visible_output_ports.add(port.name)
+            else:
+                self.module.visible_output_ports.discard(port.name)
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL("stateChanged"))
+        self.emit(QtCore.SIGNAL('doneConfigure'), self.module.id)
+        
+    def closeEvent(self, event):
+        self.askToSaveChanges()
+        event.accept()
+                
+    def resetTriggered(self):
+        self.setFocus(QtCore.Qt.MouseFocusReason)
+        self.setUpdatesEnabled(False)
+        for i in xrange(len(self.inputPorts)):
+            port = self.inputPorts[i]
+            entry = (PortEndPoint.Destination, port.name)
+            checkBox = self.inputDict[port.name]
+            if not port.optional or entry in self.module.portVisible:
+                checkBox.setCheckState(QtCore.Qt.Checked)
+            else:
+                checkBox.setCheckState(QtCore.Qt.Unchecked)
+            if not port.optional or port.sigstring=='()':
+                checkBox.setEnabled(False)
+        for i in xrange(len(self.outputPorts)):
+            port = self.outputPorts[i]
+            entry = (PortEndPoint.Source, port.name)
+            checkBox = self.outputDict[port.name]
+            if not port.optional or entry in self.module.portVisible:
+                checkBox.setCheckState(QtCore.Qt.Checked)
+            else:
+                checkBox.setCheckState(QtCore.Qt.Unchecked)
+            if not port.optional:
+                checkBox.setEnabled(False)
+        self.setUpdatesEnabled(True)
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL("stateChanged"))
+        
+    def updateState(self, state):
+        self.setFocus(QtCore.Qt.MouseFocusReason)
+        self.saveButton.setEnabled(True)
+        self.resetButton.setEnabled(True)
+        if not self.state_changed:
+            self.state_changed = True
+            self.emit(QtCore.SIGNAL("stateChanged"))
diff --git a/vistrails/gui/modules/paramexplore.py b/vistrails/gui/modules/paramexplore.py
new file mode 100644
index 0000000..4c130e5
--- /dev/null
+++ b/vistrails/gui/modules/paramexplore.py
@@ -0,0 +1,798 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file provides the basic infrastructure for extensible parameter
+exploration. This allows user-defined constants to be used as dimensions
+in parameter exploration, provided the user implements the appropriate
+API in the classes.
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.modules.basic_modules import Color
+from vistrails.core.modules.paramexplore import IntegerLinearInterpolator, \
+   FloatLinearInterpolator, RGBColorInterpolator, HSVColorInterpolator
+
+from vistrails.gui.common_widgets import QStringEdit
+from vistrails.gui.modules.constant_configuration import ColorChooserButton
+from vistrails.gui.modules.python_source_configure import PythonEditor
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import show_warning
+from vistrails.core.utils import all, unimplemented
+
+##############################################################################
+
+def get_param_explore_widget_list(module_klass):
+    widget_list = []
+    klass_list = module_klass.get_param_explore_widget_list()
+    for klass in klass_list:
+        if klass is None:
+            pass
+        elif isinstance(klass, tuple):
+            (path, klass_name) = klass
+            module = __import__(path, globals(), locals(), [klass_name])
+            widget_list.append(getattr(module, klass_name))
+        else:
+            widget_list.append(klass)
+    return widget_list
+
+class QParameterEditor(QtGui.QWidget):
+    """
+    QParameterEditor specifies the method used for interpolating
+    parameter values. It suppports Linear Interpolation, List and
+    User-define function.
+    
+    """
+    def __init__(self, param_info, size, parent=None):
+        """ QParameterEditor(param_info: ParameterInfo,
+                             size: int, parent=None: QWidget) -> QParameterEditor
+        Put a stacked widget and a popup button
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self._param_info = param_info
+        self.type = param_info.spec.descriptor.name
+        self.defaultValue = param_info.value
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        self.setLayout(hLayout)
+
+        module = param_info.spec.descriptor.module
+
+        self.stackedEditors = QtGui.QStackedWidget()
+        self.stackedEditors.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                          QtGui.QSizePolicy.Maximum)
+        self._exploration_widgets = []
+
+        def add_exploration_widget(wd):
+            self._exploration_widgets.append(wd)
+            self.stackedEditors.addWidget(wd)
+
+        for widget_class in get_param_explore_widget_list(module):
+            new_widget = widget_class(param_info, size)
+            add_exploration_widget(new_widget)
+
+        add_exploration_widget(QListInterpolationEditor(param_info, size))
+        add_exploration_widget(QUserFunctionEditor(param_info, size))
+
+        hLayout.addWidget(self.stackedEditors)
+
+        self.selector = QParameterEditorSelector(param_info, self._exploration_widgets)
+        self.connect(self.selector.actionGroup,
+                     QtCore.SIGNAL('triggered(QAction*)'),
+                     self.changeInterpolator)
+        hLayout.addWidget(self.selector)
+        self.selector.initAction()
+
+    def changeInterpolator(self, action):
+        """ changeInterpolator(action: QAction) -> None        
+        Bring the correct interpolation editing widget to front in the
+        stacked widget
+        
+        """
+        widgetIdx = action.data()
+        if widgetIdx < self.stackedEditors.count():
+            self.stackedEditors.setCurrentIndex(widgetIdx)
+
+    def selectInterpolator(self, type):
+        """ selectInterpolator(type: string) -> None
+        Programatically (without requiring a user action) selects
+        the interpolator specified by the name 'type'.  If no
+        matching 'type' is found, no action is taken.
+        
+        """
+        types = [widget.exploration_name for widget in self._exploration_widgets]
+        if type in types:
+            type_idx = types.index(type)
+            self.selector._actions[type_idx].trigger()
+
+class QParameterEditorSelector(QtGui.QToolButton):
+    """
+    QParameterEditorSelector is a button with a down arrow allowing
+    users to select which type of interpolator he/she wants to use
+    
+    """
+    def __init__(self, param_info, widget_list, parent=None):
+        """ QParameterEditorSelector(param_info: ParameterInfo,
+        widget_list: list of widgets that conform to the parameter
+        exploration widget interface.
+        """
+        QtGui.QToolButton.__init__(self, parent)
+        self._param_info = param_info
+        self.type = param_info.spec.descriptor.name
+        self.setAutoRaise(True)
+        self.setToolButtonStyle(QtCore.Qt.ToolButtonTextOnly)
+        self.setPopupMode(QtGui.QToolButton.InstantPopup)
+        
+        self.setText(unichr(0x25bc)) # Down triangle
+
+        self.actionGroup = QtGui.QActionGroup(self)
+
+        self._actions = []
+        for widget in widget_list:
+            action = QtGui.QAction(widget.exploration_name, self.actionGroup)
+            self._actions.append(action)
+
+        aId = 0
+        for action in self.actionGroup.actions():
+            action.setCheckable(True)
+            action.setData(aId)
+            aId += 1
+
+        menu = QtGui.QMenu(self)
+        menu.addActions(self.actionGroup.actions())
+        self.setMenu(menu)
+
+    def initAction(self):
+        """ initAction() -> None
+        Select the first choice of selector based on self.type
+        
+        """
+        self._actions[0].trigger()
+
+##############################################################################
+
+class BasePEWidget(object):
+    def get_value(self):
+        unimplemented()
+    def set_value(self):
+        unimplemented()
+        
+class QIntegerLineEdit(QtGui.QLineEdit, BasePEWidget):
+    def __init__(self, param_info, parent=None):
+        QtGui.QLineEdit.__init__(self, param_info.value, parent)
+        self.setValidator(QtGui.QIntValidator(self))
+    def get_value(self):
+        return int(str(self.text()))
+    def set_value(self, str_value):
+        self.setText(str_value)
+        
+class QFloatLineEdit(QtGui.QLineEdit, BasePEWidget):
+    def __init__(self, param_info, parent=None):
+        QtGui.QLineEdit.__init__(self, param_info.value, parent)
+        self.setValidator(QtGui.QDoubleValidator(self))
+    def get_value(self):
+        return float(str(self.text()))
+    def set_value(self, str_value):
+        self.setText(str_value)
+##############################################################################
+
+def make_interpolator(widget_class, interpolator_class, name):
+    class InterpolationEditor(QtGui.QWidget):
+        """
+        QLinearInterpolationEditor is the actual widget allowing users to
+        edit his/her linear interpolation parameters.
+
+        """
+        def __init__(self, param_info, size, parent=None):
+            QtGui.QWidget.__init__(self, parent)
+            self._param_info = param_info
+            self.type = param_info.spec.descriptor.name
+
+            hLayout = QtGui.QHBoxLayout(self)
+            hLayout.setMargin(0)
+            hLayout.setSpacing(0)
+            self.setLayout(hLayout)
+
+            self.fromEdit = widget_class(param_info)
+            hLayout.addWidget(self.fromEdit)
+
+            hLayout.addSpacing(5)
+
+            rightArrow = QtGui.QLabel()
+            pixmap = self.style().standardPixmap(QtGui.QStyle.SP_ArrowRight)
+            rightArrow.setPixmap(CurrentTheme.RIGHT_ARROW_PIXMAP)
+            hLayout.addWidget(rightArrow)
+
+            hLayout.addSpacing(5)
+
+            self.toEdit = widget_class(param_info)
+            hLayout.addWidget(self.toEdit)
+            self.exploration_name = name
+
+        def get_values(self, size):
+            """ get_values(size: int) -> tuple
+            Return the interpolated list containing 'size' values
+
+            """
+            begin = self.fromEdit.get_value()
+            end = self.toEdit.get_value()
+            lerp = interpolator_class(begin, end, size)
+            return lerp.get_values()
+    return InterpolationEditor
+
+FloatExploreWidget = make_interpolator(QFloatLineEdit,
+                                       FloatLinearInterpolator,
+                                       'Linear Interpolation')
+IntegerExploreWidget = make_interpolator(QIntegerLineEdit,
+                                         IntegerLinearInterpolator,
+                                         'Linear Interpolation')
+
+class PEColorChooserButton(ColorChooserButton, BasePEWidget):
+
+    def __init__(self, param_info, parent=None):
+        ColorChooserButton.__init__(self, parent)
+        try:
+            r,g,b = [int(float(i) * 255) for i in param_info.value.split(',')]
+        except ValueError:
+            r,g,b = (0.0, 0.0, 0.0)
+        self.setColor(QtGui.QColor(r,g,b))
+        self.setFixedHeight(22)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Fixed)
+
+    def get_value(self):
+        return Color.to_string(self.qcolor.redF(),
+                               self.qcolor.greenF(),
+                               self.qcolor.blueF())
+        
+    def set_value(self, str_value):
+        color = str_value.split(',')
+        qcolor = QtGui.QColor(float(color[0])*255,
+                              float(color[1])*255,
+                              float(color[2])*255)
+        self.setColor(qcolor)
+
+RGBExploreWidget = make_interpolator(PEColorChooserButton,
+                                     RGBColorInterpolator,
+                                     'RGB Interpolation')
+HSVExploreWidget = make_interpolator(PEColorChooserButton,
+                                     HSVColorInterpolator,
+                                     'HSV Interpolation')
+
+##############################################################################
+
+class QListInterpolationEditor(QtGui.QWidget):
+    """
+    QListInterpolationEditor is the actual widget allowing users to
+    enter a list of values for interpolation
+    
+    """
+    def __init__(self, param_info, size, parent=None):
+        """ QListInterpolationEditor(param_info: ParameterInfo, parent: QWidget)
+                                     -> QListInterpolationEditor
+        Construct an edit box with a button for bringing up the dialog
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self._param_info = param_info
+        self.type = param_info.spec.descriptor.name
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        self.setLayout(hLayout)
+        
+        self.listValues = QtGui.QLineEdit()
+        if self.type=='String':
+            self.listValues.setText("['%s']" % param_info.value.replace("'", "\'"))
+        else:
+            self.listValues.setText('[%s]' % param_info.value)
+        self.listValues.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                      QtGui.QSizePolicy.Maximum)
+        self.listValues.home(False)
+        hLayout.addWidget(self.listValues)
+
+        self.connect(self.listValues, QtCore.SIGNAL('textEdited(QString)'),
+                     self.values_were_edited)
+
+        inputButton = QtGui.QToolButton()
+        inputButton.setText('...')
+        self.connect(inputButton, QtCore.SIGNAL('clicked()'),
+                     self.editListValues)
+        hLayout.addWidget(inputButton)
+        self.exploration_name = 'List'
+        self._str_values = [param_info.value]
+
+    def values_were_edited(self, new_text):
+        """values_were_edited(new_text): None
+
+        Connected to self.listValues.textEdited. Updates self._str_values.
+        
+        NB: Allowing the user to edit the LineEdit field directly is
+        not a very good idea, because we don't know what are the
+        syntactic rules for the translate_to_python() calls in
+        arbitrary classes.  Right now, I'm assuming removing the
+        leading and trailing brackets and splitting on ',' is
+        enough. (in passing, The previous call to eval() is just
+        broken is a general scenario like we have now)
+
+        For example, this will break horribly if the user manually edits
+        a list of strings with commas in them."""
+
+        t = str(new_text)
+        if len(t) < 2:
+            self._str_values = []
+            return
+        if not (t[0] == '[' and t[-1] == ']'):
+            self._str_values = []
+        else: 
+            self._str_values = t[1:-1].split(',')
+            if self._param_info.spec.descriptor.name=='String':
+                for i, val in enumerate(self._str_values):
+                    val = val.strip()
+                    if len(val) >= 2 and  \
+                            ((val[0] == "'" and val[-1] == "'") or 
+                             (val[0] == '"' and val[-1] == '"')):
+                        self._str_values[i] = val.strip()[1:-1]
+
+    def get_values(self, count):
+        """ get_values(count) -> []        
+        Convert the list values into a list
+
+        count should be an integer with the expected size of the list (given
+        by the dimension 'size' in the exploration)
+        
+        """
+
+        param_info = self._param_info
+        module = param_info.spec.descriptor.module
+        result = [module.translate_to_python(m)
+                  for m in self._str_values]
+        if len(result) != count:
+            show_warning('Inconsistent Size',
+                         'One of the <i>%s</i>\'s list '
+                         'interpolated '
+                         'values has a different '
+                         'size from the step count. '
+                         'Expected %d, got %d instead. '
+                         'Parameter Exploration aborted.'
+                         % (self.type, count, len(result)))
+            return None
+        return result
+
+    def editListValues(self):
+        """ editListValues() -> None
+        Show a dialog for editing the values
+        
+        """
+        dialog = QListEditDialog(self.type, self._str_values, None)
+        if dialog.exec_() == QtGui.QDialog.Accepted:
+            values = dialog.getList()
+            self._str_values = [str(v) for v in values]
+            if self.type == 'String':
+                values = ["'%s'" % v.replace("'", "\'")
+                          for v in values]
+            self.listValues.setText('[%s]' % ', '.join(values))
+            self.listValues.home(False)
+        dialog.deleteLater()
+
+##############################################################################
+
+class QListEditDialog(QtGui.QDialog):
+    """
+    QListEditDialog provides an interface for user to edit a list of
+    values and export to a string
+    
+    """
+    def __init__(self, pType, strValues, parent=None):
+        """ QListEditDialog(pType: str, strValues: list, parent: QWidget)
+                            -> QListEditDialog
+        Parse values and setup the table
+        
+        """
+        QtGui.QDialog.__init__(self, parent)
+        self.pType = pType
+        vLayout = QtGui.QVBoxLayout()
+        vLayout.setMargin(0)
+        vLayout.setSpacing(0)
+        self.setLayout(vLayout)
+        
+        label = QtGui.QLabel("Please enter values in boxes below. Drag "
+                             "rows up and down to arrange your list values. "
+                             "'Add' appends an empty value to the list. "
+                             "And 'Del' removes the selected values.")
+        label.setMargin(5)
+        label.setWordWrap(True)
+        vLayout.addWidget(label)
+
+        self.table = QtGui.QTableWidget(0, 1, parent)
+        self.table.setHorizontalHeaderLabels(['Values'])
+        self.table.horizontalHeader().setStretchLastSection(True)
+        self.table.verticalHeader().setMovable(True)
+        self.table.verticalHeader().setResizeMode(
+            QtGui.QHeaderView.ResizeToContents)
+        self.delegate = QListEditItemDelegate()
+        self.table.setItemDelegate(self.delegate)
+        self.table.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
+        for v in strValues:
+            self.addRow(v)
+        self.connect(self.table.verticalHeader(),
+                     QtCore.SIGNAL('sectionMoved(int,int,int)'),
+                     self.rowMoved)
+        vLayout.addWidget(self.table)
+
+        hLayout = QtGui.QHBoxLayout()        
+        vLayout.addLayout(hLayout)
+
+        okButton = QtGui.QPushButton('&OK')
+        okButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                               QtGui.QSizePolicy.Maximum)
+        self.connect(okButton, QtCore.SIGNAL('clicked()'), self.okButtonPressed)
+        hLayout.addWidget(okButton)
+
+        cancelButton = QtGui.QPushButton('&Cancel')
+        cancelButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                   QtGui.QSizePolicy.Maximum)
+        self.connect(cancelButton, QtCore.SIGNAL('clicked()'), self.reject)
+        hLayout.addWidget(cancelButton)
+
+        addButton = QtGui.QPushButton('&Add')
+        addButton.setIcon(CurrentTheme.ADD_STRING_ICON)
+        addButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                QtGui.QSizePolicy.Maximum)
+        self.connect(addButton, QtCore.SIGNAL('clicked()'), self.addRow)
+        hLayout.addWidget(addButton)
+        
+        removeButton = QtGui.QPushButton('&Del')
+        removeButton.setIcon(QtGui.QIcon(
+            self.style().standardPixmap(QtGui.QStyle.SP_DialogCancelButton)))
+        removeButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                   QtGui.QSizePolicy.Maximum)
+        self.connect(removeButton, QtCore.SIGNAL('clicked()'),
+                     self.removeSelection)
+        hLayout.addWidget(removeButton)
+        
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return the recommended size for the widget
+        
+        """
+        return QtCore.QSize(256, 384)
+
+    def okButtonPressed(self):
+        """ okButtonPressed() -> None
+        Make sure to commit the editor data before accepting
+        
+        """
+        self.table.itemDelegate().finishEditing()
+        self.accept()
+
+    def getList(self):
+        """ getList() -> list of str values
+        Return a list of values
+        
+        """
+        result = []
+        for i in xrange(self.table.rowCount()):
+            logicalIndex = self.table.verticalHeader().logicalIndex(i)
+            value = self.table.item(logicalIndex, 0).text()            
+            result.append(str(value))
+        return result
+
+    def rowMoved(self, row, old, new):
+        """ rowMove(row: int, old: int, new: int) -> None
+        Renumber the vertical header labels when row moved
+        
+        """
+        vHeader = self.table.verticalHeader()
+        labels = []        
+        for i in xrange(self.table.rowCount()):
+            labels.append(str(vHeader.visualIndex(i)+1))
+        self.table.setVerticalHeaderLabels(labels)
+
+    def addRow(self, text=None):
+        """ addRow(text: str) -> QListStringEdit
+        Add an extra row to the end of the table
+        
+        """
+        self.table.setRowCount(self.table.rowCount()+1)
+        if text:
+            item = QtGui.QTableWidgetItem(text)
+        else:
+            item = QtGui.QTableWidgetItem()
+        row = self.table.rowCount()-1
+        self.table.setItem(row, 0, item)
+
+    def removeSelection(self):
+        """ removeSelection() -> None
+        Remove selected rows on the table
+        
+        """
+        for item in self.table.selectedItems():
+            self.table.removeRow(item.row())
+
+##############################################################################
+
+class QListEditItemDelegate(QtGui.QItemDelegate):
+    """
+    QListEditItemDelegate sets up the editor for the QListEditDialog
+    table
+    
+    """
+
+    def __init__(self, parent=None):
+        """ QListEditItemDelegate(parent: QWidget) -> QListEditItemDelegate
+        Store the uncommit editor for commit later
+        
+        """
+        QtGui.QItemDelegate.__init__(self, parent)
+        self.editor = None
+        
+    def createEditor(self, parent, option, index):
+        """ createEditor(parent: QWidget,
+                         option: QStyleOptionViewItem,
+                         index: QModelIndex) -> QStringEdit
+        Return the editor widget for the index
+        
+        """
+        self.editor = QStringEdit(parent)
+        return self.editor
+
+    def setEditorData(self, editor, index):
+        """ setEditorData(editor: QWidget, index: QModelIndex) -> None
+        Set the editor to reflects data at index
+        
+        """
+        editor.setText(index.data())
+        editor.selectAll()
+
+    def updateEditorGeometry(self, editor, option, index):
+        """ updateEditorGeometry(editor: QStringEdit,
+                                 option: QStyleOptionViewItem,
+                                 index: QModelIndex) -> None
+        Update the geometry of the editor based on the style option
+        
+        """
+        editor.setGeometry(option.rect)
+
+    def setModelData(self, editor, model, index):
+        """ setModelData(editor: QStringEdit,
+                         model: QAbstractItemModel,
+                         index: QModelIndex) -> None
+        Set the text of the editor back to the item model
+        
+        """
+        model.setData(index, editor.text())
+        self.editor = None
+
+    def finishEditing(self):
+        if self.editor:
+            self.emit(QtCore.SIGNAL('commitData(QWidget*)'), self.editor)
+
+##############################################################################
+
+class QUserFunctionEditor(QtGui.QFrame):
+    """
+    QUserFunctionEditor shows user-defined interpolation function
+    
+    """
+    def __init__(self, param_info, size, parent=None):
+        """ QUserFunctionEditor(param_info: ParameterInfo, parent: QWidget)
+                                -> QUserFunctionEditor
+        Create a read-only line edit widget and a button for
+        customizing the user-defined function
+        
+        """
+        QtGui.QFrame.__init__(self, parent)
+        self.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Sunken)
+        self.size = -1
+        self._param_info = param_info
+        self.type = param_info.spec.descriptor.name
+        self.defaultValue = param_info.value
+        self.function = self.defaultFunction()
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        self.setLayout(hLayout)
+        
+        hLayout.addSpacing(2)
+        self.label = QtGui.QLabel()
+        hLayout.addWidget(self.label)
+
+        self.listValues = QtGui.QLineEdit()
+        self.listValues.setFrame(False)        
+        self.listValues.palette().setBrush(QtGui.QPalette.Base,
+                                           QtGui.QBrush(QtCore.Qt.NoBrush))
+        self.listValues.setReadOnly(True)
+        self.listValues.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                      QtGui.QSizePolicy.Maximum)
+        self.listValues.home(False)
+        hLayout.addWidget(self.listValues)
+
+        self.size_was_updated(size)
+
+        inputButton = QtGui.QToolButton()
+        inputButton.setText('...')
+        self.connect(inputButton, QtCore.SIGNAL('clicked()'),
+                     self.editFunction)
+        hLayout.addWidget(inputButton)
+        self.exploration_name = 'User-defined Function'
+
+    def defaultFunction(self):
+        """ defaultFunction() -> str
+        Return the default function definition
+        
+        """
+        if self.type=='String':
+            quote = '"'
+        else:
+            quote = ''
+        return 'def value(i):\n    """ value(i: int) -> value\n'\
+               '    Returns the i-th value\n'\
+               '    i is from 0 to <step count>-1.\n'\
+               '    If this function has an error, the value will be\n'\
+               '    the default constant value\n'\
+               '    """\n'\
+               '    # Define your function here\n'
+
+    def get_values(self, count):
+        """ get_values() -> []        
+        Convert the user define function into a list. Size specifies the size
+        request.
+        
+        """
+        param_info = self._param_info
+        module = param_info.spec.descriptor.module
+        def get():
+            import code
+            values = []
+            d = {}
+            try:
+                exec(self.function) in {}, d
+            except Exception, e:
+                return [module.default_value] * count
+            def evaluate(i):
+                try:
+                    v = d['value'](i)
+                    if v == None:
+                        return module.default_value
+                    return v
+                except Exception, e:
+                    return str(e)
+            return [evaluate(i) for i in xrange(self.size)]
+        result = get()
+        
+        if not all(module.validate(x) for x in result):
+            show_warning('Failed Validation',
+                         'One of the <i>%s</i>\'s user defined '
+                         'functions has failed validation, '
+                         'which usually means it generated a '
+                         'value of a type different '
+                         'than that specified by the '
+                         'parameter. Parameter Exploration '
+                         'aborted.' % param_info.spec.descriptor.name)
+            return None
+        return result
+        
+
+    def getValuesString(self):
+        """ getValuesString() -> str
+        Return a string representation of the parameter list
+        
+        """
+        r = self.get_values(self.size)
+        if r is None:
+            return '{ERROR}'
+        else:
+            return '{%s}' % ','.join([str(v) for v in r])
+
+    def editFunction(self):
+        """ editFunction() -> None
+        Pop up a dialog for editing user-defined function
+        
+        """
+        dialog = QUserFunctionDialog(self.function)        
+        if dialog.exec_()==QtGui.QDialog.Accepted:
+            self.function = str(dialog.editor.toPlainText())
+            self.listValues.setText(self.getValuesString())
+        dialog.deleteLater()
+
+    def size_was_updated(self, size):
+        """ size_was_updated(size: int) -> None
+
+        This is called whenever the size of the interpolation is changed.
+        Values are re-calculated."""
+        if size!=self.size:
+            self.size = size
+            htmlText = '<html><big>ƒ</big>(n) <b>:</b> ' \
+                       '[0,%d) → </html>' % size
+            self.label.setText(htmlText)
+            self.listValues.setText(self.getValuesString())
+
+##############################################################################
+
+class QUserFunctionDialog(QtGui.QDialog):
+    """
+    QUserFunctionDialog provides an interface for user to edit a
+    python function
+    
+    """
+    def __init__(self, function, parent=None):
+        """ QUserFunctionDialog(function: str, parent: QWidget)
+                                -> QUserFunctionDialog
+        Set up a python source editor
+        
+        """
+        QtGui.QDialog.__init__(self, parent)
+        vLayout = QtGui.QVBoxLayout()
+        vLayout.setMargin(0)
+        vLayout.setSpacing(0)
+        self.setLayout(vLayout)
+        self.setWindowTitle('User-defined Function')
+        
+        label = QtGui.QLabel("Please define your function below. This "
+                             "'value(i)' function will be iteratively called "
+                             "for <step count> numbers. For each step, "
+                             "it should return a value of parameter type.")
+        label.setMargin(5)
+        label.setWordWrap(True)
+        vLayout.addWidget(label)
+
+        self.editor = PythonEditor(self)
+        self.editor.setPlainText(function)
+        vLayout.addWidget(self.editor)
+
+        hLayout = QtGui.QHBoxLayout()        
+        vLayout.addLayout(hLayout)
+
+        okButton = QtGui.QPushButton('&OK')
+        okButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                               QtGui.QSizePolicy.Maximum)
+        self.connect(okButton, QtCore.SIGNAL('clicked()'), self.accept)
+        hLayout.addWidget(okButton)
+
+        cancelButton = QtGui.QPushButton('&Cancel')
+        cancelButton.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                   QtGui.QSizePolicy.Maximum)
+        self.connect(cancelButton, QtCore.SIGNAL('clicked()'), self.reject)
+        hLayout.addWidget(cancelButton)
+        
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return the recommended size for the widget
+        
+        """
+        return QtCore.QSize(512, 512)
diff --git a/vistrails/gui/modules/python_source_configure.py b/vistrails/gui/modules/python_source_configure.py
new file mode 100644
index 0000000..45546af
--- /dev/null
+++ b/vistrails/gui/modules/python_source_configure.py
@@ -0,0 +1,244 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.bundles.pyimport import py_import
+import vistrails.core.requirements
+from vistrails.gui.modules.source_configure import SourceConfigurationWidget
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.theme import CurrentTheme
+
+class PythonHighlighter(QtGui.QSyntaxHighlighter):
+    def __init__( self, document ):
+        QtGui.QSyntaxHighlighter.__init__( self, document )
+        self.rules = []
+        
+        keywordFormat = QtGui.QTextCharFormat()
+        keywordFormat.setForeground(QtCore.Qt.blue)
+        self.rules += [(r"\b%s\b"%w, keywordFormat, -1, -1, False)
+                       for w in ["def","from", 
+                                 "import","for","in", 
+                                 "while","True","None",
+                                 "False","pass","return",
+                                 "self","tuple","list",
+                                 "print","if","else",
+                                 "elif","len","string"
+                                 "assert","try","except",
+                                 "exec", "break", "continue",
+                                 "not", "and", "or", "as",
+                                 "type", "int", "float",
+                                 ]]
+        
+        defclassFormat = QtGui.QTextCharFormat()
+        defclassFormat.setForeground(QtCore.Qt.blue)
+        self.rules += [(r"\bclass\b\s*(\w+)", defclassFormat, -1, -1, False)]
+
+        commentFormat = QtGui.QTextCharFormat()
+        commentFormat.setFontItalic(True)
+        commentFormat.setForeground(QtCore.Qt.darkGreen)
+        self.rules += [(r"#[^\n]*", commentFormat, -1, -1, False)]
+
+        literalFormat = QtGui.QTextCharFormat()
+        literalFormat.setForeground(QtGui.QColor(65, 105, 225)) #royalblue
+        self.rules += [
+            # Whole docstring
+            (r"'''.*'''", literalFormat, -1, -1, True),
+            (r'""".*"""', literalFormat, -1, -1, True),
+            # Hanging docstring (single quote)
+            (r"'''.*$", literalFormat, -1, 2, False),
+            (r"^.*'''", literalFormat, 2, -1, True),
+            (r"^.*$", literalFormat, 2, 2, False),
+            # Hanging docstring (double quote)
+            (r'""".*$', literalFormat, -1, 3, False),
+            (r'^.*"""', literalFormat, 3, -1, True),
+            (r'^.*$', literalFormat, 3, 3, False),
+            # Whole string
+            (r"'[^']*'", literalFormat, -1, -1, False),
+            (r'"[^"]*"', literalFormat, -1, -1, False),
+            # Hanging string (single quote)
+            (r"'[^']*$", literalFormat, -1,  0, False),
+            (r"^[^']*$", literalFormat,  0,  0, False),
+            (r"^[^']*'", literalFormat,  0, -1, False),
+            # Hanging string (double quotes)
+            (r'"[^"]*$', literalFormat, -1,  1, False),
+            (r'^[^"]*$', literalFormat,  1,  1, False),
+            (r'^[^"]*"', literalFormat,  1, -1, False),
+            ]
+        
+    def highlightBlock(self, text):
+        baseFormat = self.format(0)
+        prevState = self.previousBlockState()
+        self.setCurrentBlockState(prevState)        
+        shift = 0
+        while True:
+            matchedRule = (None, -1, -1, -1, -1)
+            for rule in self.rules:
+                if rule[2]==self.currentBlockState():
+                    RE = QtCore.QRegExp(rule[0])
+                    RE.setMinimal(rule[4])
+                    pos = RE.indexIn(text, shift)
+                    if (pos!=-1 and (matchedRule[0]==None or pos<matchedRule[1]) and
+                        RE.matchedLength()>0):
+                        matchedRule = (rule[1], pos, RE.matchedLength(), rule[3])
+            if matchedRule[0]!=None:
+                self.setFormat(matchedRule[1], matchedRule[2], matchedRule[0])
+                self.setCurrentBlockState(matchedRule[3])
+                shift = matchedRule[1]+matchedRule[2]
+            else:
+                break
+
+def PythonEditor(parent=None):
+    try:
+        py_import('PyQt4.Qsci', {'linux-ubuntu': 'python-qscintilla2'})
+    except ImportError:
+        return OldPythonEditor(parent)
+    else:
+        return NewPythonEditor(parent)
+
+def NewPythonEditor(parent):
+    vistrails.core.requirements.require_python_module('PyQt4.Qsci')
+    from PyQt4.Qsci import QsciScintilla, QsciLexerPython
+    class _PythonEditor(QsciScintilla):
+    
+        def __init__(self, parent=None):
+            QsciScintilla.__init__(self, parent)
+            ## set the default font of the editor
+            ## and take the same font for line numbers
+            font = CurrentTheme.PYTHON_SOURCE_EDITOR_FONT
+            self.setFont(font)
+            fm = QtGui.QFontMetrics(font)
+        
+            ## Line numbers
+            # conventionally, margin 0 is for line numbers
+            self.setMarginWidth(0, fm.width( "0000" ) + 4)
+            self.setMarginLineNumbers(0, True)
+
+            self.setAutoIndent(True)
+
+            ## Edge Mode shows a red vetical bar at 80 chars
+            self.setEdgeMode(QsciScintilla.EdgeLine)
+            self.setEdgeColumn(80)
+            self.setEdgeColor(QtGui.QColor("#CCCCCC"))
+        
+            ## Folding visual : we will use boxes
+            self.setFolding(QsciScintilla.BoxedTreeFoldStyle)
+        
+            ## Braces matching
+            self.setBraceMatching(QsciScintilla.SloppyBraceMatch)
+        
+            ## Editing line color
+        #    self.setCaretLineVisible(True)
+        #    self.setCaretLineBackgroundColor(QtGui.QColor("#CDA869"))
+            
+            
+                    ## Margins colors
+            # line numbers margin
+            self.setMarginsBackgroundColor(QtGui.QColor("#FFFFFF"))
+            self.setMarginsForegroundColor(QtGui.QColor("#000000"))
+        
+            # folding margin colors (foreground,background)
+            self.setFoldMarginColors(QtGui.QColor("#DDDDDD"),QtGui.QColor("#DDDDDD"))
+            # do not use tabs
+            self.setIndentationsUseTabs(False)
+            self.setTabWidth(4)
+            self.setTabIndents(True)
+        
+            ## Choose a lexer
+            lexer = QsciLexerPython()
+            lexer.setDefaultFont(font)
+            lexer.setFont(font)
+            self.setLexer(lexer)
+        
+            # set autocompletion
+            self.setAutoCompletionThreshold(2)
+            self.setAutoCompletionSource(QsciScintilla.AcsDocument)
+            self.setAutoCompletionCaseSensitivity(True)
+            self.setAutoCompletionReplaceWord(True)
+            self.setAutoCompletionFillupsEnabled(True)
+            
+        def setPlainText(self, text):
+            """ setPlainText(text: str) -> None
+            redirect to setText
+            
+            """
+            self.setText(text)
+        
+        def toPlainText(self):
+            """ setPlainText(text: str) -> None
+            redirect to self.text()
+            
+            """
+            return self.text()
+    
+#        def focusOutEvent(self, event):
+#            if self.parent():
+#                QtCore.QCoreApplication.sendEvent(self.parent(), event)
+#            QsciScintilla.focusOutEvent(self, event)
+
+    return _PythonEditor(parent)
+
+class OldPythonEditor(QtGui.QTextEdit):
+
+    def __init__(self, parent=None):
+        QtGui.QTextEdit.__init__(self, parent)
+        self.setLineWrapMode(QtGui.QTextEdit.NoWrap)
+        self.formatChanged(None)
+        self.setCursorWidth(8)
+        self.highlighter = PythonHighlighter(self.document())
+        self.connect(self,
+                     QtCore.SIGNAL('currentCharFormatChanged(QTextCharFormat)'),
+                     self.formatChanged)
+
+    def formatChanged(self, f):
+        self.setFont(CurrentTheme.PYTHON_SOURCE_EDITOR_FONT)
+
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QKeyEvent) -> Nont
+        Handle tab with 4 spaces
+        
+        """
+        if event.key()==QtCore.Qt.Key_Tab:
+            self.insertPlainText('    ')
+        else:
+            # super(PythonEditor, self).keyPressEvent(event)
+            QtGui.QTextEdit.keyPressEvent(self, event)
+            
+#    def focusOutEvent(self, event):
+#        if self.parent():
+#            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+#        QtGui.QTextEdit.focusOutEvent(self, event)
+
+class PythonSourceConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, 
+                                           PythonEditor, True, True, parent)
diff --git a/vistrails/gui/modules/query_configuration.py b/vistrails/gui/modules/query_configuration.py
new file mode 100644
index 0000000..bab5610
--- /dev/null
+++ b/vistrails/gui/modules/query_configuration.py
@@ -0,0 +1,146 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: vistrails at sci.utah.edu
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.utils import any, expression
+from vistrails.core import system
+
+from constant_configuration import StandardConstantWidget, ColorWidget
+
+############################################################################
+
+class QueryWidgetMixin(object):
+
+    def __init__(self, contents=None, query_method=None):
+        self._last_contents = contents
+        self._last_query_method = query_method
+
+    # updateMethod intercepts calls from a child widget like the
+    # contents_widget
+    def updateMethod(self):
+        self.update_parent()
+
+    def update_parent(self):
+        new_contents = self.contents()
+        new_query_method = self.query_method()
+        if (new_contents != self._last_contents or 
+            new_query_method != self._last_query_method):
+            if self.parent() and hasattr(self.parent(), 'updateMethod'):
+                self.parent().updateMethod()
+            self._last_contents = new_contents
+            self._last_query_method = new_query_method
+            self.emit(QtCore.SIGNAL('contentsChanged'), (self,new_contents))
+
+class BaseQueryWidget(QtGui.QWidget, QueryWidgetMixin):
+    def __init__(self, contents_klass, query_methods, param, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        QueryWidgetMixin.__init__(self, param.strValue, param.queryMethod)
+
+        contents = param.strValue
+        queryMethod = param.queryMethod
+
+        layout = QtGui.QHBoxLayout()
+        self.op_button = QtGui.QToolButton()
+        self.op_button.setPopupMode(QtGui.QToolButton.InstantPopup)
+        self.op_button.setArrowType(QtCore.Qt.NoArrow)
+        action_group = QtGui.QActionGroup(self.op_button)
+        actions = []
+        checked_exists = False
+        for method in query_methods:
+            action = QtGui.QAction(method, self)
+            action.setCheckable(True)
+            action_group.addAction(action)
+            if method == queryMethod:
+                action.setChecked(True)
+                checked_exists = True
+            actions.append(action)
+        if not checked_exists:
+            actions[0].setChecked(True)
+            self._last_query_method = str(actions[0].text())
+            
+        menu = QtGui.QMenu(self.op_button)
+        menu.addActions(actions)
+        self.op_button.setMenu(menu)
+        self.op_button.setText(action_group.checkedAction().text())
+
+        self.contents_widget = contents_klass(param)
+        self.contents_widget.setContents(contents)
+
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        layout.addWidget(self.op_button)
+        layout.addWidget(self.contents_widget)
+        self.setLayout(layout)
+
+        self.connect(self.op_button, QtCore.SIGNAL('triggered(QAction*)'),
+                     self.update_action)
+
+    def contents(self):
+        return self.contents_widget.contents()
+
+    def setContents(self, strValue, silent=True):
+        self.contents_widget.setContents(strValue)
+        if not silent:
+            self.update_parent()
+
+    def update_action(self, action):
+        self.op_button.setText(action.text())
+        self.update_parent()
+
+    def query_method(self):
+        for action in self.op_button.menu().actions():
+            if action.isChecked():
+                return str(action.text())
+
+class StandardQueryWidget(BaseQueryWidget):
+    def __init__(self, param, parent=None):
+        BaseQueryWidget.__init__(self, StandardConstantWidget, ["==", "!="],
+                                 param, parent)
+
+class StringQueryWidget(StandardQueryWidget):
+    def __init__(self, param, parent=None):
+        BaseQueryWidget.__init__(self, StandardConstantWidget, 
+                                 ["*[]*", "==", "=~"],
+                                 param, parent)
+    
+class NumericQueryWidget(StandardQueryWidget):
+    def __init__(self, param, parent=None):
+        BaseQueryWidget.__init__(self, StandardConstantWidget,
+                                 ["==", "<", ">", "<=", ">="], 
+                                 param, parent)
+    
+class ColorQueryWidget(StandardQueryWidget):
+    def __init__(self, param, parent=None):
+        BaseQueryWidget.__init__(self, ColorWidget, ["2.3", "5", "10", "50"],
+                                 param, parent)
diff --git a/vistrails/gui/modules/resources/__init__.py b/vistrails/gui/modules/resources/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/gui/modules/resources/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/gui/modules/resources/colorconfig_rc.py b/vistrails/gui/modules/resources/colorconfig_rc.py
new file mode 100644
index 0000000..eda280c
--- /dev/null
+++ b/vistrails/gui/modules/resources/colorconfig_rc.py
@@ -0,0 +1,1850 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Resource object code
+#
+# Created: Thu Oct 5 21:38:17 2006
+#      by: The Resource Compiler for PyQt (Qt v4.1.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x6f\x6e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5c\x72\xa8\x66\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd4\x0c\x18\x14\x26\x34\xec\x63\x1a\xd5\x00\x00\x20\x00\x49\x44\
+\x41\x54\x78\xda\xec\xbd\xdd\x76\xe4\x38\xec\x3c\x06\x80\x6a\xcf\
+\xe4\xe4\x2a\x27\xb7\x79\x9c\x3c\xf2\xff\x85\xf2\x0a\x39\xf9\xed\
+\xae\xdd\x22\x90\x0b\x11\x64\x11\xa2\xd4\x52\x7f\xd8\xf3\xe1\xd9\
+\xd3\xa7\xd5\x72\x7b\xc6\x6b\xbb\x0a\x55\x05\x90\x64\x33\xa3\xef\
+\x3f\xdf\x7f\xbe\xff\xfc\x9d\x7f\xa6\xef\x6f\xc1\x1f\xf8\xc7\x56\
+\xaf\xef\x67\x79\x26\x0e\xaf\xbf\xff\x7c\x13\xc0\xf7\x9f\x5f\x02\
+\xe0\x0e\x6c\x5b\xdd\xdf\x27\x84\x73\x04\x60\x43\x02\x58\x3f\xf3\
+\x37\x41\x7c\x13\xc0\xf7\x9f\x57\x01\x1d\xc1\xbd\x05\xf8\xd7\x10\
+\x00\x1d\x24\x00\xab\xaf\xf1\x63\xdf\xc4\xf0\x4d\x00\xdf\x7f\x4e\
+\x00\xde\xc1\x1e\x81\xfe\xeb\x13\x00\x6d\x10\x40\x4f\x0c\x4e\x0a\
+\xdf\x84\xf0\x4d\x00\xdf\x80\x1f\x00\x7e\x0b\xfc\xbf\x2f\x01\x8c\
+\x5e\xdb\x37\x21\x7c\x13\xc0\x37\xe0\x6f\x3d\xfe\x5c\x02\x88\x8f\
+\x6f\x42\xf8\x26\x80\xbf\x04\xf4\x7a\x27\xf8\x7f\x77\x02\xb8\x4d\
+\x02\xed\x21\x1d\x21\x7c\x93\xc1\x37\x01\xfc\xc6\xa0\xdf\x02\xbc\
+\x3e\x00\xfe\x23\xc0\xb7\x17\x10\x00\x1f\x24\x82\x7b\x49\x40\xca\
+\xb3\x06\x75\x20\xdf\x64\xf0\xaa\x3f\xfc\x3d\x08\xf4\xc4\x3f\xba\
+\x51\xe9\xcf\x92\xc0\xd1\xea\xff\xab\x11\xc0\x23\x2a\x40\x0e\xdc\
+\xef\xaf\xbf\xa9\xe0\x9b\x00\x7e\xa1\x6a\xaf\x37\x80\x7f\x54\xfa\
+\x1f\x51\x05\xbf\x33\x01\x9c\x79\xc8\x8d\x6b\xf9\x56\x05\xdf\x04\
+\xf0\xd5\xd5\x7e\x0f\xf8\x7a\x42\xf6\x7f\x13\xc0\xbe\x22\x90\x9b\
+\x44\xf0\xad\x0a\xbe\x09\xe0\x93\x80\xaf\x1b\x40\xbf\xa5\x02\xee\
+\x25\x01\xa2\x73\x61\xe0\xaf\x42\x00\xf7\x92\x80\x1c\x50\x02\x7b\
+\xcf\xdf\x44\xf0\x4d\x00\x2f\x93\xf9\x23\xb0\x9f\x95\xff\xfa\x4d\
+\x00\x0f\x81\x7f\x0d\xf8\xad\x7b\xdf\xf6\xe0\x9b\x00\x9e\x08\xfc\
+\x3d\xd0\x9f\x51\x01\x67\x49\x60\x8b\x00\xb6\x88\xe0\xb3\x09\xe0\
+\x6c\x27\xe0\x28\xf8\xef\xab\xfe\xfd\xf5\x37\x11\x7c\x13\xc0\x53\
+\x80\x7f\x0f\xf8\x9f\x41\x02\x47\xaa\xff\xaf\x44\x00\xf7\x92\xc0\
+\x33\xc0\xbf\x47\x02\xdf\x44\xf0\x4d\x00\xa7\x3c\xfe\x16\xf0\xcf\
+\x10\xc1\xa3\x24\x40\xf4\x9c\x61\xa0\x67\x13\xc0\xb3\x87\x80\x8e\
+\x82\xff\xbe\xea\xbf\x26\x82\xef\x8c\xe0\x9b\x00\x1e\x06\xfe\x3d\
+\x2a\xe0\x0c\x09\x10\x1d\xef\x06\xfc\x0e\x04\xb0\x75\x5f\xe8\x7c\
+\x07\xe0\x16\x09\x7c\x13\xc1\xe1\x3f\xdf\x93\x80\xb6\x01\x7e\x3d\
+\x09\xfe\x47\x54\xc0\xa3\xed\xc0\xdf\x85\x00\x46\x0f\x3d\x50\xfd\
+\xf5\x06\xe0\x35\x3c\xcb\xc6\xeb\xf5\xf7\xd3\x48\xfe\x6e\x5b\xf0\
+\xf7\x2a\x80\x23\xc0\xb7\x1b\xf7\x9e\x69\x05\x9e\x11\x06\xfe\x2a\
+\x04\xf0\xc8\x0c\xc0\x33\xa4\xff\xd8\xff\x8f\x14\x40\xaf\x06\xfe\
+\x42\x22\xf8\x3b\x15\xc0\x91\x8a\xaf\x0f\x80\xff\x55\x43\x41\x7f\
+\x3a\x01\x48\x50\x04\xb2\xa1\x02\xb6\xaa\xbe\xee\x54\x7f\xb9\xf9\
+\xfd\xb5\xbf\xd1\x16\xfc\x5d\x0a\xc0\xab\x7e\xbe\x13\xf4\xcf\x54\
+\x01\x8f\xce\x03\x1c\xb5\x02\x9f\x45\x00\x8f\x4e\x01\xde\x3b\xfc\
+\xf3\x9c\xea\xdf\x1e\xe9\xef\x52\x03\x7f\x8f\x02\x38\x0b\xfc\x33\
+\x39\xc0\x67\x4c\x06\xd2\x9d\x59\xc0\x57\x11\xc0\xb9\xe5\xbf\xeb\
+\xca\xaf\xe1\x7a\xef\x39\x5e\xdb\x21\xff\xbf\xfd\x10\xb2\x4a\x04\
+\xdf\x04\xf0\x87\xfc\x99\x07\x80\xce\x74\x9f\x02\x38\xab\x02\x9e\
+\x41\x02\x7f\x2a\x01\x1c\x01\xff\x91\x00\x70\x2f\xf4\xd3\x83\x95\
+\x3f\x7e\xcf\xd3\x9f\x1f\x12\xfe\x3d\x04\x70\x21\xa6\x7f\x8a\xf7\
+\x7f\x44\x09\xbc\x42\x05\xbc\x72\x1e\xe0\x2b\x09\xe0\x48\xff\x5f\
+\x0f\x4a\xff\x47\xaa\xff\x51\x05\x30\x22\x82\x3f\x5c\x0d\xfc\x3d\
+\x04\x90\xc9\x68\x22\xa2\x7f\xee\x50\x02\x67\x54\xc0\xbd\xeb\x03\
+\xb6\xee\x13\x3d\xd6\x0e\xfc\x6a\x02\x18\xdd\x1f\x6f\xfc\x71\xac\
+\xfa\x1f\x21\x81\x33\xd5\x3f\x1d\x24\x82\x3f\x54\x0d\xfc\x7d\x16\
+\x20\x9f\x90\xff\xcf\x56\x01\x5f\xd1\x0e\xfc\x4c\x02\x38\x2a\xfb\
+\xf5\x86\x1a\xb8\x95\x01\xf0\x93\xab\xbf\x6c\x82\x3e\x7e\x8f\xff\
+\xb8\x4e\xc1\xdf\x41\x00\x46\x44\x97\x52\xfd\x2f\x44\xf4\x3f\x44\
+\xa6\x44\x7c\x54\x09\x18\xdd\x37\x1c\x74\xef\x64\xe0\x2b\xf7\x06\
+\x78\x36\x01\x3c\x63\x0f\x80\x5b\xed\xbf\x5b\x16\xc0\x06\xaf\x6f\
+\x29\x80\xb4\xf1\xbd\xdd\x23\x81\x54\xbf\x97\xf6\xa7\x90\xc0\xdf\
+\x41\x00\xb9\x78\xff\x62\x01\xf4\x42\xa4\xff\x10\x65\x25\xba\x64\
+\x22\x55\xa2\x49\x7b\x52\x18\x12\xc4\x91\xd6\xe0\x67\x4c\x06\xfe\
+\x89\x04\xf0\x8c\xc9\xbf\xb3\x0a\x40\x36\x7d\xff\x16\xf0\xff\x38\
+\x4b\xf0\x77\x10\xc0\xb4\x04\x80\x96\x89\xb4\x00\x7e\x9e\x97\xe7\
+\x0f\x25\xba\xc0\xb3\x2a\xd1\x54\xde\xe3\xaf\xc5\x76\x48\xe1\x1e\
+\x15\xf0\x08\x09\x1c\xed\x06\x6c\x91\xc1\xbd\x04\x70\x74\x25\xe0\
+\x3d\x4b\x80\x8f\x4a\xff\x91\x05\xb8\xd5\xf2\xd3\x83\x95\x7f\xcf\
+\x02\xd0\xe6\x3d\xa3\xf4\x7b\x93\xc0\x5f\xa3\x00\x74\x22\xd2\x0f\
+\xa2\x3c\x11\x65\x50\x01\xaa\x44\xa2\x44\x39\xaf\xc9\x00\x49\xe1\
+\xa2\x45\x31\x94\xd7\xa9\xfc\x72\xf9\xe7\x1f\x6a\x0b\x3e\xc3\x0a\
+\xfc\x49\x04\x70\x74\xf2\x6f\x54\xfd\xed\xa0\xff\x97\x13\x95\x7f\
+\xec\xfb\xc7\x64\x40\x9d\x1d\xf8\x6d\x73\x81\xbf\x82\x00\x72\xa9\
+\xf6\xf9\x42\x94\xff\x87\x48\x27\x22\xfd\x77\x21\x81\xfc\x3f\x3d\
+\xd0\x39\x3c\x8b\xf6\x4a\xe1\x5a\xec\xc2\x07\x90\xc2\x9b\x2d\xcf\
+\x93\x12\x99\x81\x4a\x78\xc5\x50\xd0\xad\x00\xf0\x99\x7b\x02\xec\
+\xed\x05\xf0\x68\x10\x78\xab\xff\xcf\x74\xdf\xc8\xef\x59\x3b\x75\
+\x2b\xfc\xdb\x53\x01\xf8\xfc\x9b\xe6\x02\x7f\x34\x01\xb8\x72\x9f\
+\x0b\xe0\x33\x58\x00\x27\x05\xcd\x0b\x78\x3f\x8a\xf4\x7f\x0f\xd5\
+\xff\x1d\xc8\x81\xe0\x39\x2b\x11\xdb\xf2\xfa\xff\xf3\xcf\xb1\x35\
+\x29\x5c\x2c\xa8\x84\x47\x66\x02\x68\xe7\xde\xaf\x44\x00\x47\xb6\
+\xff\x3e\x3a\xfc\xf3\x48\xef\xff\x4c\xfb\x4f\x4e\x00\x7f\x3b\x6b\
+\x59\x2c\xc1\x37\x01\x7c\xfd\x9f\x62\xd9\x97\xee\x5f\x5e\xaa\x7e\
+\x7e\x2f\xcf\xff\x0c\x9e\x07\x55\xdf\x5f\xc7\xaa\xef\xcf\xff\x53\
+\xee\x2b\x90\x01\x15\x15\x70\x05\x92\x40\x22\x30\x23\x4a\xfe\xfc\
+\xe8\x3c\xc0\xad\x00\xf0\x15\x04\xf0\xc8\x10\xd0\x68\xf0\xe7\xc8\
+\xf0\xcf\xd9\xc9\xbf\x67\x54\xff\xa3\xc0\xc7\x67\x54\x02\xfc\x4d\
+\x00\x5f\x0a\xfe\x4c\x4b\x57\x2f\x17\x02\xc8\xb9\x49\xff\x3c\x11\
+\x65\xb0\x00\x7e\xff\xea\x55\x3f\xf7\xd5\x3f\x87\xea\x8f\x40\x27\
+\xb0\x08\x53\x51\x01\x93\x7f\xae\x15\x75\x60\x85\x34\x9c\x24\x0a\
+\x29\x90\xf5\x84\x20\xaf\xda\x1b\xe0\xab\x08\xe0\xde\xfe\xff\xd9\
+\xc9\xbf\x33\x0a\xe0\x39\xbe\xff\x98\x12\xe0\x6f\x02\xf8\x12\xc9\
+\x1f\xc1\x5f\xab\x7f\x91\xfe\xd9\xa5\xff\xdc\x2c\x81\x93\xc4\x3b\
+\x78\x7d\xf4\xfc\x5b\x2a\xa0\x5a\x04\x20\x03\x0b\xe4\x40\x36\x78\
+\xb6\x46\x22\x06\xea\x60\x2a\xaf\x2f\xe5\x3d\xf2\x27\x11\xc0\x99\
+\x0e\xc0\xad\xb9\xff\x47\x16\xfc\x3c\xcf\xf7\xef\x7d\xaf\x7f\x0b\
+\x12\x98\xfe\x24\xf0\x67\x00\x7f\x9d\xeb\x49\x44\xf9\xa3\x90\x40\
+\xa9\xfe\xfa\x2f\x51\x96\x46\x0e\xfa\x2f\x51\xf6\xf7\x81\x05\xa0\
+\xbc\xae\xfa\x23\x15\xe0\x56\xe1\x7d\x43\x05\xbc\x07\x15\x10\xef\
+\xbf\x5b\x6f\x11\xf0\xe1\x44\x30\xfd\x69\x04\x70\xcf\xf0\xcf\x99\
+\xde\xff\xd9\xca\x7f\xbf\xef\xdf\xfb\xfe\xfe\xf2\x24\x30\xfd\x49\
+\xe0\x1f\x4e\xfb\x6a\x91\xfc\x1f\x0b\xc8\xf5\xa3\xcf\x03\xf4\x5f\
+\xa2\x19\xee\xeb\xbf\x44\x1f\xc1\x02\x60\xf5\x1f\x3d\xbf\x87\x0e\
+\x40\x0e\x2a\x20\xaa\x01\x94\xff\xe4\xea\xa1\x00\xdd\x06\x24\x60\
+\xf0\x71\x27\x84\x74\xab\x1b\xf0\xd9\x04\xf0\xcc\xe5\xbf\xb7\x02\
+\xc0\x7b\xab\xff\xb1\x71\xdf\xe3\xf2\x7f\x8f\x00\xec\xf7\x20\x81\
+\xdf\x9e\x00\x30\xec\xcb\x23\x02\xc8\x65\xe8\xc7\x73\x80\xb9\xef\
+\x06\xcc\x73\x6f\x01\x74\x5e\x07\x82\x73\xde\x56\x01\x1e\xf2\xa1\
+\xfc\xc7\xfb\x15\xd0\xda\xcb\xfe\x28\xff\xab\x2d\xf0\xcf\xb3\xfd\
+\x07\x51\x6f\x19\xf8\x77\x21\x80\xb3\x6b\xff\x99\x1e\x5b\xf0\x73\
+\x64\xb1\x4f\xba\xd3\xf7\xef\x7d\x5f\xed\xf7\x50\x02\xbf\xf5\x8e\
+\x40\xd1\xef\x23\xf0\xeb\x23\x43\x0b\xb0\xa4\xfd\xb9\x8c\x01\x7b\
+\xfa\x5f\x3f\xfe\x6f\x7b\x3d\x67\x98\x0c\x3c\xf3\x6c\xe3\xd7\x18\
+\xf6\x6d\xde\xb7\xf6\xac\xda\xbf\x46\x3b\xf0\x46\xbd\x1a\xc0\xd7\
+\x44\x25\x37\xf8\x0c\x02\x38\x4b\x02\x7b\x3b\x00\x3f\xb2\xe3\xef\
+\xb9\xdd\x7e\xc6\xaf\xd3\x81\x7b\xe9\xc4\xf5\xe8\xf5\x2f\x48\x02\
+\xd3\xef\x0e\xfe\x39\x80\xde\xaf\xeb\xfd\x41\x0b\x30\x43\x37\xa0\
+\xe6\x01\x98\x13\x14\x4b\xd0\x49\x7f\x08\x08\xf1\x19\x3d\xff\x07\
+\xac\x29\x18\x85\x80\xae\x02\xf0\x39\x86\x80\xdd\x43\xf7\xab\xff\
+\xe8\x35\x51\xc9\x0b\xe0\xf9\x97\x20\x80\xad\xb5\xff\x47\x83\x3f\
+\xbb\x23\xfd\x7f\xb5\xef\xbf\x45\xb2\xf6\xeb\x67\x02\xbf\x25\x01\
+\xe4\x0d\xd9\xef\xd7\xdd\xfd\xa9\x2c\xfc\x71\xbf\x8f\xa0\x7f\x2f\
+\x21\xe1\x7b\x0b\x0b\x2b\x19\xe4\x71\x10\xc8\x1b\xcf\x06\xcf\x1f\
+\xa5\xaa\x63\xd8\x37\xc1\x7d\x7c\x9e\xb4\x85\x80\x23\xc0\x3b\x31\
+\xa8\xdf\x23\xc8\x0b\xdc\x36\x50\xff\xf1\xf8\xfc\x46\x60\x13\x5e\
+\x4d\x00\x47\xfb\xff\x47\xdb\x7f\x8f\x6e\xf6\xf9\x4a\xdf\x7f\x9f\
+\xca\xfa\xa5\x48\x60\xfa\xdd\xc1\x3f\x94\xfd\x78\x7f\x5e\x2a\xfb\
+\xfc\x11\xc0\x8e\x8a\x60\x34\x1d\x58\x54\xc0\x47\x6c\x03\xe6\x3e\
+\xf8\xc3\x84\x3f\xaa\x00\x1d\xa8\x00\x8d\x99\x00\x84\x82\xef\x4e\
+\x1c\x45\xf6\xfb\xf3\x07\x74\x01\x6e\x29\x02\xbf\xc6\x67\xbf\xbe\
+\x94\x6b\x79\x35\x01\xdc\xea\xff\x9f\xdd\xf8\x63\xab\xf7\xbf\xa5\
+\x00\x3e\xd3\xf7\xdb\xc9\xef\xe3\x2f\x46\x02\xd3\xef\x0e\xfe\xa1\
+\xec\x0f\x0a\xc0\x65\x7d\x7e\x87\xb0\xcf\x43\xc0\xdc\x4f\x05\xa2\
+\x25\xc8\x89\x48\xaf\xcb\x60\x10\x82\x7e\xa4\x06\x72\x08\x00\x3f\
+\x06\x04\x81\xd5\x1f\x81\x9f\x6f\x59\x81\xf2\xf8\x08\xc4\x50\x95\
+\x01\xad\xd5\x00\x3e\xa3\x1a\x20\x6a\x44\x90\x3e\x8b\x00\xce\x4e\
+\xfe\x3d\x63\xbb\xaf\x23\x9b\x7c\xdc\xea\xf7\x3f\x8b\x00\x68\xf0\
+\x3d\xfb\x45\x48\x60\xfa\x93\xc0\x3f\xb4\x03\x73\xeb\xf9\xe7\xdc\
+\xab\x80\xb9\x3c\x23\xd8\x3b\xf0\x7f\x34\x55\x80\x60\x47\x35\x80\
+\x52\xfe\xea\x20\xdf\xc8\x02\x10\xe0\x48\x08\x93\x13\xc6\x06\x09\
+\xa0\xdc\xd7\x40\x08\x17\x2a\xcf\x00\xfa\x5b\x04\x80\x44\x30\xdd\
+\x43\x00\x8f\x90\xc0\xa3\x73\xff\x5b\x0a\x20\xed\xd8\x80\x47\x7c\
+\x7f\x7a\x52\xa0\x3a\x26\x83\x2f\x5f\x3b\x30\xfd\xce\xe0\x8f\x9e\
+\x7f\x68\x07\xca\x0c\x80\xce\x00\xea\x38\x14\xe4\x73\x00\x85\x1c\
+\x3a\x4b\x50\x88\xe1\xaa\x44\x29\xaf\x7b\xff\x9d\xe4\x2f\xcf\x5e\
+\xd9\x1d\xe4\xef\xda\x40\x9e\x42\xd5\xef\xc0\x0e\x84\xe0\x9f\x83\
+\xd5\x7e\x95\x0f\xa0\xd7\x37\xa2\x0f\x82\xf7\x62\x16\xb0\x41\x00\
+\x76\xeb\x17\xe1\xd9\x04\x70\x64\xed\xff\xd9\xed\xbe\x64\x50\xf5\
+\x3f\xd3\xf7\x3f\x4e\x08\x5f\x4a\x02\xbf\x3c\x01\xe8\x09\xf0\x0f\
+\xed\xc0\xdc\x72\x00\x1f\x06\xca\xef\x83\x3c\x20\x95\x9c\x20\xf7\
+\xd3\x83\x68\x09\xb6\x2c\x00\x0d\x86\x83\x5c\x0d\x60\x16\x90\xa1\
+\xfa\x4f\x83\x67\x24\x83\xd8\x25\xf8\x08\xb2\x5f\xc1\xf3\xc7\xaa\
+\xff\x5e\x94\x01\x66\x00\x6a\xfb\x8b\x07\xa3\x3d\x78\x3a\x01\x3c\
+\x73\xf2\xef\xde\x91\xdf\xcf\xf4\xfd\xb4\xd1\x21\xd9\x52\x02\x5f\
+\xb4\x94\x78\xfa\xd5\xc1\x9f\xef\x04\x7f\x86\x36\xa0\x77\x02\xe6\
+\x14\x36\x05\xf1\xe7\xb2\x24\xd8\x2b\x7e\xfe\x00\x6b\x20\xe5\x75\
+\x6e\xa0\xf7\x20\xb0\xab\xf0\x41\x05\xa0\xd4\x9f\x40\x05\x20\x11\
+\xac\x6c\x01\xcc\x04\xe8\xa0\x0b\xa0\x51\x11\x0c\xda\x81\xd8\x0d\
+\xb8\x65\x01\x22\x01\x70\x20\x02\x7e\xd6\x26\x20\x47\x27\xff\xee\
+\xa9\xfe\x67\x5b\x7f\xcf\xf0\xfd\x8f\x4b\xff\xf6\xc8\xf0\x2f\x7c\
+\x01\x09\x4c\xbf\x1b\xf8\x75\x03\xfc\x9b\x76\xc0\x65\xfd\x04\x6d\
+\xbe\x77\xb0\x03\x19\xd6\x01\xa0\x25\xb8\x06\xf0\x97\xf7\xc4\x0a\
+\x4f\x41\x05\xa4\x81\x1a\x20\x58\x2a\xdc\x75\x0d\xac\x9f\x14\x74\
+\x20\x57\xcb\x60\x6b\x65\xe0\x64\x80\x72\x1f\x15\xc0\x04\x1d\x80\
+\xfa\x9e\x68\x07\x76\x14\x80\x02\x11\x30\x07\x22\xb8\x67\x0f\x80\
+\x7b\x4f\xfd\xb9\xb5\xd9\xe7\x2b\x97\xf9\x1e\xf1\xfd\x76\x38\xf1\
+\x7f\x8e\x52\xf8\x9b\x08\xc0\x68\x7b\x93\xde\xd3\x8a\x20\x41\xe5\
+\x8f\x3d\xff\x04\x44\x00\x15\xbf\x7b\x6f\x0e\xaa\xa0\xe4\x01\x52\
+\x82\x89\xa8\x02\xde\x07\x01\x60\xcc\x02\x08\x06\x81\x10\xec\xa9\
+\xdc\x5f\x59\x01\x6b\x64\xa1\x20\xef\x47\x8a\x00\x89\xc0\x28\xe4\
+\x04\x07\x2c\x00\x12\x81\x70\x99\x23\x28\xbf\x94\x7c\x8b\x00\xf0\
+\xfe\xde\xde\xff\x67\x02\xc0\x47\x16\xfc\xbc\xd2\xf7\x9f\xad\xf4\
+\xb7\x1e\xf9\x6b\x3a\x03\xd3\xaf\x08\x7e\x5f\xd8\x33\xea\xed\x9f\
+\xb6\x03\x21\xfd\x77\xa0\xcf\x98\xf2\x8f\x88\x61\x03\xfc\xbe\x76\
+\x60\x94\xfa\x8f\xd4\xc0\xbb\x82\xac\xd7\x1e\xf4\xef\x41\x05\x28\
+\xcc\x00\x38\xd8\x31\x00\x7c\x87\x79\x00\x0d\x99\x80\xfb\xfe\x51\
+\x2b\x10\x95\x80\x83\xfb\x16\x01\x38\xf0\xdf\x01\xf0\x6f\x5c\x2e\
+\x8f\xf8\xfe\x23\x6b\xff\xf7\x02\xc0\x67\x2d\xf8\x79\xc5\x9c\xff\
+\x2b\xfe\xf0\xd7\x74\x06\xa6\xdf\x19\xfc\x87\xec\x40\xa8\xf2\x4e\
+\x02\xf9\xbd\x75\x06\x1c\xe0\xb8\x62\x30\x6f\x81\x1f\x54\xc0\xa4\
+\x6d\x46\xc0\x00\xec\xef\x21\x00\x44\xa5\x50\x7d\x3e\x7e\x0c\xbc\
+\x7f\x86\x3c\x40\xa0\x2b\xa0\x03\x22\x30\x5c\x2a\x0c\x79\xc0\x65\
+\x47\x09\x9c\x21\x00\x04\xba\x03\xdf\x2d\x01\x3f\xa3\xfd\x37\x7a\
+\x3e\xb3\xd9\xe7\x67\xfb\xfe\x67\xca\xfe\xed\x2c\xe0\x53\x43\xc1\
+\x5f\x8a\x00\xdc\xf7\x2b\x1d\x3b\xbd\xeb\x90\x22\xf0\x0e\x40\x01\
+\x3d\xda\x01\x1c\xff\xcd\xb1\xf7\xef\x39\x40\x22\xca\xd7\xfe\x1e\
+\xe6\x01\xc9\x83\xc1\x41\x36\x80\x0a\x01\xdb\x7f\x3a\x20\x02\xbf\
+\x27\x20\xff\x13\xd8\x81\xf7\x1d\x22\x40\xb0\x3b\xd0\xd3\x40\x09\
+\x3c\x42\x00\x44\x44\xc6\xcd\x1a\x74\x6a\xe0\x91\x0e\xc0\xb3\xb6\
+\xfb\x7a\xc4\xf7\x6f\x11\xc0\xa3\xa0\xbe\x2d\xf9\xc7\x9f\x9b\x3f\
+\x2f\x14\x9c\x7e\x35\xf0\x1f\x95\xfd\x87\xed\x00\x80\x7a\x8e\x52\
+\x7f\xee\x07\x82\xea\xa4\xa0\x83\x9f\xcb\x7b\x66\x58\x23\x00\xc1\
+\x60\x06\xa0\x7b\x26\xa0\xb0\x39\x48\x94\xfe\x1f\xe1\x5e\x04\xbd\
+\x6f\x37\x5e\xdb\x82\xfe\xbe\x8d\xa1\xa0\xa8\x00\xb0\x03\x30\x05\
+\x02\x48\x37\x08\x40\x41\xb9\x5f\x68\x91\xfe\x06\xc0\xbf\x10\xd1\
+\x07\xb7\x70\x70\xa5\x06\xce\x1e\xfc\xf1\x8c\xed\xbe\x9e\xb9\xbd\
+\x57\x7a\x49\x8f\xff\xbc\x02\xd8\xca\x55\xfe\x64\x02\xd0\xb0\x93\
+\xcf\xad\x0a\x7f\xca\x0e\x38\xc8\x5d\xfe\x0b\xb4\xf7\xa2\xec\x4f\
+\x40\x04\x52\xc6\x84\x13\x80\xdf\x2d\x81\x94\x7b\xd7\xd6\x12\x4c\
+\x50\xf1\xa3\x0a\x90\x40\x08\x1f\xda\xe4\x7d\x0a\xd7\x98\x01\xbc\
+\x87\x2e\x80\x82\x32\x98\x00\xfc\xd7\x02\xf0\x04\x04\xe0\x99\x40\
+\x02\x75\xf0\x51\xc0\xbd\x45\x00\xfe\x6c\x83\xd6\x9f\x03\xdf\x15\
+\x00\xf1\x42\x0c\xec\xd9\xc0\x23\xdb\x7e\x3d\xb2\xe0\xe7\xec\xb8\
+\xef\x59\xdf\xff\x2c\xd9\xbf\x2f\xf9\xb7\x88\xe0\xe5\x79\xc0\x97\
+\x13\x00\x26\xfe\x5b\x0b\x7a\xee\xb6\x03\x56\x16\x02\xfd\x13\xb2\
+\x00\x59\x3c\xfe\x2c\x83\x00\xf0\xda\xe7\x02\x7a\x5d\xe7\x01\xd5\
+\x12\xf0\xa2\x04\xba\xd0\xaf\x8c\x07\x47\x15\x90\x82\x0a\x98\xc0\
+\x0e\x18\xa8\x00\xcf\x00\xde\xb5\x01\x5a\xa1\x43\x50\xdb\x80\x6e\
+\x11\xb0\xc2\xdb\xba\xed\x97\x06\x63\xc1\x4a\xeb\xeb\x11\x29\x8c\
+\x08\xa0\x86\x83\xdc\x5b\x83\x1f\x23\x12\x38\x33\xfc\x73\xa6\xfa\
+\x9f\x59\xec\x73\xd6\xf7\xbf\x4a\xf6\xdf\x96\xfc\x5b\xf7\x5e\x6a\
+\x05\xa6\x5f\xa1\xfa\xcf\x3b\xa0\x7e\xc8\x0e\x70\xe9\x02\x60\xf5\
+\xf7\x2c\x40\x60\x93\x50\x20\x86\x39\xae\x09\xb8\x2e\x15\x5f\x3f\
+\xca\xe7\xc4\x3c\x20\xc3\x9a\x80\x81\xff\xf7\xc1\x1f\x97\xfc\x29\
+\xac\x05\x18\x49\x7f\xec\x0a\x44\xd0\x8b\xf6\xd5\x1f\x17\x02\xd5\
+\x99\x00\xbf\x17\x42\x40\x82\xef\xed\x88\x0c\x56\xf7\x8a\xcc\x7f\
+\x2f\x95\xdf\x15\x80\x71\x53\x01\x6f\xbc\x28\x0b\xe2\x96\x0d\xec\
+\xee\xfd\x7f\x76\xf2\xef\xde\xc5\x3e\x67\x7c\x3f\x7d\x82\xec\xe7\
+\x53\xa0\xef\xef\xbd\xd0\x0a\x7c\x29\x01\xe0\x3e\x7e\x11\xf4\xf3\
+\x41\x42\x88\xe0\xd7\x68\x07\x64\x00\xf2\xa2\x00\x54\xfa\xd9\x80\
+\xd9\xe7\x00\x04\xaa\xbe\x77\x00\xdc\x06\xcc\x4d\xfe\x6b\x2a\x39\
+\x41\xee\xc1\xff\x51\x32\x01\x85\x96\x9f\x5b\x01\x57\x01\x32\xb0\
+\x03\xa8\x02\x26\x6b\xa4\x90\x82\xfc\xf7\x7b\x46\x4d\x09\x54\x05\
+\x40\xfd\x3a\x81\x3a\x16\x0c\xa4\x10\xd7\xd2\xc4\xfe\xbf\x42\xcf\
+\x1f\x2b\x3f\xc3\x2f\x22\x17\x0b\x40\xdc\x3e\xfe\x83\x89\x3e\x84\
+\xe8\xed\x91\x8d\x3f\xf6\x96\xfb\x1e\x39\xd1\xf7\xa8\xef\xbf\xa7\
+\xe5\x77\x14\x88\xb7\x14\xc0\x19\xd0\x2f\x44\xfa\x32\x2b\x30\x7d\
+\x65\xe5\x1f\x81\x3b\xee\xe9\x17\x41\x7e\xcb\x0e\xac\x48\x21\x01\
+\xc8\xa5\xac\x0e\x4c\x1b\x59\x80\xb4\xa5\xc2\xf5\xe3\x19\x26\x02\
+\x65\x1d\x06\x3a\x91\xe8\x75\x09\x32\x9c\x08\xd2\xa0\x0b\x80\xc3\
+\x40\xdd\x7d\x50\x01\xd8\x1e\xc4\x0c\x60\xd4\x05\xb0\xd1\x2a\x41\
+\x20\x05\xb4\x02\x7a\x82\x00\xd0\xef\x63\xe5\x77\xe9\xef\xd7\x1f\
+\x40\x00\xfe\x2c\xda\x94\xc1\xc3\x93\x7f\x23\x42\xb8\x67\x99\xef\
+\x3d\x04\x60\x77\x80\x7c\x4b\xee\xd3\x1d\xd5\x3f\xaf\xae\x5f\x62\
+\x05\xbe\x84\x00\x46\xbe\x5f\x77\xee\x6d\x29\x80\x43\x76\xc0\xe5\
+\xba\x57\x78\x1c\x08\x8a\x59\x40\x50\x00\xb3\x5f\xbf\x37\x1b\x90\
+\xe7\x42\x24\x45\x0d\xd4\xae\xc0\xdc\x24\xbe\x03\x5f\x74\xad\x0c\
+\x52\x98\x19\x40\x15\xa0\xe0\xfd\x51\xfe\x0b\x5c\xbf\x87\x8a\x1f\
+\xaf\x1d\xe8\x29\x58\x81\x5b\x04\x80\x5d\x00\x0f\xfa\x34\x28\x00\
+\x97\xfe\xde\x22\x74\x15\xe0\xc4\x80\xd7\x14\xed\xc0\xd1\xea\xff\
+\xc8\xc8\xef\x19\xdf\x7f\x44\x01\x3c\x02\xb7\x67\x48\xfe\xfc\x7a\
+\x2b\x30\x7d\x55\xf5\xcf\x3b\xd5\x7b\x2b\xdc\x1b\x55\xfe\x9b\x76\
+\x00\xfa\xff\xd5\x0e\x48\xb0\x03\x73\xab\xee\x5e\xd1\x67\x00\x7e\
+\x7d\x3f\x43\x08\x28\x7d\x57\xc0\x55\x00\x86\x80\x4e\x08\x18\x08\
+\xfa\xfd\xc9\x7a\x3b\xd0\x49\x7b\xb0\x04\x23\x12\x50\xdb\xbe\x76\
+\xbf\x7f\x0f\x01\x44\x0b\xb0\x22\x03\x1e\xe7\x00\x48\x06\xa8\x08\
+\x48\x4a\x66\xf1\x48\xf5\x3f\x33\xf2\x7b\xd6\xf7\xdb\x09\x30\x7f\
+\xae\xe4\xdf\xba\x7e\xba\x15\x98\xbe\x02\xfc\x7a\xa0\xea\xdf\xba\
+\x97\x77\x48\xa1\x7b\x7f\x68\x01\x66\x0f\xff\x4a\x9b\xaf\xcb\x07\
+\x66\x18\x0a\xca\xcd\xeb\xd7\xbc\xc0\xdf\x53\xd2\xff\x2e\x0f\xc8\
+\x44\x33\x74\x05\xba\xe5\xc0\x3b\xd7\x11\xfc\x95\x2c\x82\xdf\x8f\
+\x79\xc0\x96\x12\xf8\xa0\xf6\x9e\x2b\xf4\xff\xeb\x7d\x6a\xed\xc0\
+\x48\x00\x53\xe9\xff\x2b\x11\x5d\xb8\xbf\x76\xd0\x7b\xe8\x37\xaa\
+\xfc\x1f\x18\x0c\x16\x80\xff\xe0\xe5\x7b\x94\xce\xcc\xfd\x1f\x79\
+\x7c\x96\xef\x3f\x22\xfb\x5f\x23\xf9\x3f\xc5\x0a\x7c\x2a\x01\x18\
+\x84\x73\xa3\x4a\x7e\x2b\x0b\xd0\x03\x19\xc1\x4a\x11\xcc\x0d\xf8\
+\x75\x2a\x50\xc2\x7d\xa8\xf4\xf3\xfb\x5a\x0d\x54\x52\x10\x90\xfc\
+\xd2\x88\x20\xc3\xb5\xe6\x36\x18\x14\x55\xc0\xea\xda\x9a\x4d\x10\
+\x98\x08\x4c\x61\x32\x50\xc3\xf2\x60\xb5\xfe\x31\xaa\xfe\x53\xb0\
+\x02\x75\x50\x28\x54\xff\x58\xf9\x2b\x96\xb8\xbf\xe6\x28\xfd\x83\
+\x0d\xa8\xf6\xa0\x80\xfc\x4d\x9b\x15\xf8\x51\x24\x7f\x3a\x33\xf7\
+\x7f\x76\xb1\xcf\x67\x2c\xf0\xf9\x2a\xc9\xbf\xa5\x08\x7e\x37\x02\
+\xd8\x1a\xf5\xcd\x37\x02\x3d\xdd\x18\xf4\x39\x12\x04\x6a\x6a\xbb\
+\xff\xfa\xfa\xff\x59\x06\xad\xc1\xd2\xe6\xeb\xc2\x41\x6c\xff\x81\
+\x02\xd0\x51\x40\x98\x81\x14\x66\xa8\xee\x3b\x95\x1f\x89\xa0\x86\
+\x82\x81\x04\x90\x0c\x52\x39\x2b\xf0\x7d\x43\x09\x28\x61\x2b\xd0\
+\xc8\xcc\x28\x99\x16\x60\x1b\x25\x33\x00\xb9\x0d\x08\x80\x5b\x10\
+\x58\x74\xfc\x72\x2d\xc4\xcc\xa4\xc4\xad\xf2\x6f\xa9\x00\x08\xfd\
+\x84\x89\xb8\xbc\xfe\x59\x9e\xd3\x91\xad\xbe\x9f\xe1\xfb\x8f\x0e\
+\xfa\x1c\x01\xf4\x59\x15\xf0\x3c\xc9\xbf\x45\x06\x4f\xb3\x02\xd3\
+\x67\x82\x5f\x77\x80\x3b\x02\xfa\x28\x0b\x38\xd2\x16\xec\x48\x65\
+\x6e\xd5\xbc\x7a\x7e\x19\xd8\x01\x78\x8f\x07\x7f\xa8\x10\x7c\xf0\
+\x07\xf3\x80\x6a\x11\xa4\x1f\x11\x56\x59\x72\x82\x54\x36\x0f\x11\
+\xe8\x06\x08\x10\x83\x5a\x08\x05\x8b\xff\x97\x8d\x0c\x20\x87\x35\
+\x02\x4d\x05\x28\x19\x19\x7d\x98\x52\x2a\xa0\x77\xc0\xe7\x4a\x00\
+\x04\x64\xd0\x7f\x1f\x69\x70\x6d\x2c\xdd\xf5\xa5\x12\x80\x90\x31\
+\x93\xb0\x90\x95\xd7\x9e\x05\xb0\x94\x75\x11\x50\xf9\xdf\xb5\x28\
+\x08\x59\x08\xe1\xa7\x10\xc9\x59\xff\xbf\x37\xf2\xbb\x27\xff\x9f\
+\xb9\x9f\xdf\x9e\xdc\xbf\x07\xf4\xf7\x56\xfe\xd8\x4e\xfd\x1d\x08\
+\xe0\xd6\xfa\xfe\x3d\xf0\xef\x65\x01\x5b\x59\x42\x5c\x0b\x90\x2d\
+\xc8\xfe\x19\x2a\x7f\xb0\x03\x4e\x08\xd5\x0e\xcc\xbd\xc4\xcf\xd2\
+\x57\xfd\x4c\xa5\xe2\x7b\x36\xc0\x6d\x1b\x32\x4c\xfd\xaf\x41\x11\
+\x5c\x07\x2a\xa0\xae\x25\xb0\x75\x36\x20\xba\x54\xff\xa5\xc2\x1b\
+\x89\x69\x01\xbc\x92\x99\x92\x9a\x95\xe7\xe5\xda\xab\xfc\x44\x44\
+\xb9\xfc\xd6\x33\x59\x07\xf2\x4c\xe3\x95\xbd\x4a\x44\xd9\x98\x26\
+\x22\x9a\xeb\xf2\x74\x2e\xc3\x41\x0b\xe8\xdf\x0a\x11\x50\xb9\xfe\
+\xe0\x85\x05\x8d\xb9\x75\x02\xa4\xa9\x02\xd6\x85\x10\x72\x01\xba\
+\x9c\xf5\xff\xf2\x24\xdf\xff\x95\x92\x7f\x8f\x04\x8e\x55\x7e\x7c\
+\x7e\x8a\x0a\x98\x3e\xab\xfa\x1f\x91\xf7\xb7\x54\xc1\xad\x50\x70\
+\x48\x32\x02\x0b\x7c\xd0\x0e\x7c\x04\x45\xf0\xde\x03\xb8\xda\x81\
+\xe0\xff\x31\x23\x50\x86\x9c\x80\x61\x86\x80\xdb\x98\xf0\x55\x89\
+\x38\xf7\x6d\x41\x81\x47\x4d\xf8\x43\x2e\xc0\x41\x05\x88\x19\xa9\
+\xe6\xa5\x8a\x97\x47\xea\x00\x6f\x34\x2d\x35\xb9\xec\xfb\x6f\xa4\
+\x55\xe6\x1b\xa5\xfa\x3d\xb1\x55\xdb\x2f\x2a\x00\x2e\xa0\x97\xf2\
+\x2a\xd7\x7b\x4c\xd9\x88\xc4\x98\xae\xe5\x35\x12\xc2\x3b\x4b\x51\
+\x08\x42\x49\x12\x91\x2e\x96\xe1\xa7\x34\x42\x60\x21\xfa\xa1\x45\
+\x2d\xdc\x53\xfd\x1f\xf5\xfd\x7b\x84\x70\xef\x6a\xbe\x7b\x7d\xfe\
+\x2d\xb0\x8f\x81\xdf\x5b\x81\x07\x03\xc1\xe9\xb3\xaa\xbf\x1e\x04\
+\x7c\xbe\x71\x3f\x66\x01\x37\x2d\x41\x6e\xad\xbe\x1c\xe4\xff\x3c\
+\x37\x29\xbf\xb2\x03\xef\x40\x00\x05\xdc\x19\x2d\x80\x57\xfc\x62\
+\x03\xe6\xdc\x07\x83\xa8\x0e\x04\x2a\xfe\xc8\x0e\x88\xf6\x7e\x5f\
+\x3a\x15\x90\x49\x35\x17\xc0\x2f\xd7\x1f\xd6\xc0\xce\x05\xe8\xa9\
+\x3c\x0b\x11\x7d\x14\x32\x10\x00\xbc\x74\x9e\xdf\x76\x08\x80\xe1\
+\xfb\xc9\xe5\x73\xb9\x74\x09\x16\x1b\x90\xcb\xbd\x89\x98\xb2\x71\
+\x25\x84\x0b\x31\xbd\x33\x13\x49\xa2\x37\x4d\xf4\xce\x42\x24\x89\
+\x58\x53\xb5\x03\x0e\xfc\x37\x25\x9a\xee\xad\xfe\xaf\xf2\xfd\xf7\
+\x2a\x80\x67\x4b\xfe\x7c\x98\x00\x4e\x9c\xf2\xf2\x45\x04\x70\x2b\
+\xf8\x3b\x72\xef\x16\x19\xec\xb5\x05\x3b\xf0\xc3\xf3\xcc\x90\xf4\
+\xa7\x36\xd6\xdb\xd9\x01\x68\x0d\x7a\x8b\x0f\x81\xef\x36\x60\xa6\
+\x52\xf1\xfd\xe4\x61\x06\xcb\x90\x21\xfd\xcf\x6b\x15\x90\xac\xb7\
+\x03\x8b\x2a\x30\x12\xcd\x24\x05\xf0\x66\x99\xa4\x1c\x2f\xc4\x25\
+\xbe\xb3\x0a\x78\x2b\x62\x9f\xea\x3d\x82\xca\xcf\x5d\xc5\xb7\x30\
+\xf8\x83\xaf\xb9\xb6\x02\x35\xbc\xce\xa5\xda\x4b\x47\x02\x8b\x4a\
+\xb8\x94\x6b\x29\xcf\x17\x13\xba\xe6\x85\xa2\xdf\x44\x48\x35\xd1\
+\x87\x2c\xdf\xe0\x9f\x92\x28\x2b\xd3\x7b\x01\xbd\x94\x50\xf3\xf0\
+\x82\x9f\x7b\x7d\xff\xbd\xfd\xfd\x67\x4b\x7e\x3d\x58\xe5\x8f\x00\
+\x1f\xad\xc0\x03\x2a\x60\x7a\x35\xf8\xf5\x0e\xf0\xdf\xba\x3e\xd2\
+\x32\xc4\x05\x41\x9a\x4a\x58\x96\xfa\x0d\x41\x35\x41\xe0\xc7\x03\
+\x3b\x00\x59\x40\x95\xfc\x0e\x7c\x2e\xa4\x10\x6c\x80\x4b\xff\xd9\
+\xd5\x01\xc3\x91\x63\x83\xaa\xdf\xbf\x56\x12\xcb\x0b\xf8\x75\x26\
+\x2b\x32\xdf\xab\xfd\xb5\x00\x3f\x91\xd5\xff\xae\xe5\xb5\x54\xc9\
+\x6f\xe5\x60\xda\x66\x01\xa6\xf2\x2c\x64\xcb\xf6\x60\x1b\x16\xa0\
+\x2f\x4c\x5c\xae\xb9\xbc\x8f\xc3\xbd\x06\x7a\xbf\x5e\x9e\xb5\x90\
+\x82\xd0\xac\x4a\x42\xcb\x37\x67\x51\x03\x53\x55\x04\xef\x22\xc4\
+\xb2\xd8\x03\x96\x4f\xf0\xfd\x76\x47\x7f\xff\xd9\x92\xff\x99\x95\
+\x5f\x9f\xd3\x16\x7c\x35\x01\xd0\x23\xd5\xff\xd6\xbc\xc0\x11\x05\
+\x90\xb5\x6d\xec\xd1\x81\x9c\x7b\x5b\x30\x43\xd8\x57\xed\x00\x83\
+\x52\x78\x07\x3b\x00\x96\xa0\x56\x7b\xa8\xfe\x33\x0e\x0a\x15\x12\
+\xba\x66\x58\x0c\x94\x03\xf0\xcd\x48\x74\xae\xc0\x17\xcd\xc5\xd3\
+\x6b\x81\xb9\xd2\xdc\x01\x5f\x2b\xd8\xa7\x7a\x67\x0d\x7e\x01\x55\
+\xc0\x41\xfe\x8f\x08\x80\xc1\x06\x70\xd7\x1a\xf4\x4c\x60\xa9\xfe\
+\x13\x10\x42\xb5\x02\x95\x10\x84\x84\x98\x2e\xa4\x94\xfd\xb5\x29\
+\x89\x09\x7d\x68\x26\x96\x44\x24\x13\xfd\xb4\x44\x6a\x13\xbd\x2b\
+\x2f\x2d\xc2\x7b\xb7\xf7\xfa\x2c\xd9\xff\x2c\xc9\xff\xbc\xca\xdf\
+\x9e\x97\x86\x0c\xff\x52\x04\xf0\x68\xf5\x3f\x3a\x2f\xb0\x37\x3e\
+\x8c\x21\xa0\x6f\xf0\xd1\x01\x9f\x83\x1d\x78\x07\x55\xc0\x3d\x29\
+\xe0\x5a\x81\xae\xf2\xe3\x20\x90\x13\xc3\xdc\xdb\x00\x7f\xbc\x43\
+\x18\xd8\x14\xc1\x0c\x8f\x06\xfc\x54\xc0\x4f\xa4\x74\xad\x40\xd7\
+\x4a\x01\x0b\x21\x68\xb5\x01\xd7\x52\xe9\xd1\x1a\x7c\x40\xf5\x47\
+\xb9\xcf\x83\x0c\x20\xd7\xd7\xdc\xcd\x05\xe4\x2a\xfb\x9b\x15\xe0\
+\xe2\xf7\x3d\x0b\x58\x5e\x2f\x57\x5a\x80\x2f\x24\xe5\x3d\x4a\x42\
+\x52\x94\x81\x10\xa9\x55\x22\x60\xc9\xf4\x53\x26\xca\x36\x2d\xfb\
+\x16\xdc\xb3\xbd\xd7\x16\x01\x3c\x2a\xfb\x5f\x25\xf9\xf3\x13\x08\
+\x20\x4e\x52\x3e\xa0\x02\x5e\x49\x00\x4f\x7b\xe4\x03\xa1\xe1\x66\
+\xcb\x10\x7c\xbf\x96\xca\x5e\x49\x21\xb5\x73\x03\x55\x82\x1d\xe0\
+\x41\x77\xc0\x49\x01\x7d\xbe\x93\x88\x83\x9e\x5a\x30\x58\x15\x81\
+\x7f\x3d\x19\x07\x81\x96\x6a\xaf\xf9\x4a\xc9\x94\x66\x53\x9a\x48\
+\x6b\xd5\x5f\x80\xef\x92\x5f\x41\xf2\x6b\x0d\xfd\x24\xd8\x00\x85\
+\x7b\x11\xfc\x42\x54\xde\xd7\x87\xc8\x98\xfc\xfb\xf7\x70\x0a\x16\
+\xc0\x03\xc0\x0c\x2a\x20\x43\xe5\x77\xe9\xdf\xd4\x80\xd4\xd7\x52\
+\x3e\x63\xb9\x67\x94\x91\x08\x4c\x89\x74\x26\x4e\x17\xfa\x69\x13\
+\xb1\xa5\x6d\x0b\xb0\x25\xff\xf7\x08\xe0\x11\xd9\xff\x6c\xc9\x7f\
+\x04\xe4\x67\x01\xff\x04\x15\x30\xbd\xaa\xfa\x23\x08\x2d\x00\xfa\
+\x48\x67\xe0\x68\x0b\xf0\x66\x3e\x50\xfc\x7f\x4e\x60\x07\x64\x1d\
+\xf8\x65\x90\xf7\x73\x78\x5d\xed\x80\xf4\x01\xa0\x13\xc0\x1c\x43\
+\x3f\x6e\xd2\x3f\xc3\x3d\x65\xa2\x8f\x59\xbb\xaa\x6f\x01\xf8\x8b\
+\xdc\xd7\xd2\xc3\xd7\xae\xea\x5f\x49\x6b\x95\xf7\xfb\xd7\x40\x06\
+\x2e\xf7\x09\xae\xa5\x02\xdd\x86\xbf\x67\x34\xbc\xc7\x9d\x0a\xe0\
+\x0a\xee\x3e\x03\xc0\x50\x50\x8a\x0a\xb8\x90\x12\x93\x94\x7b\x4a\
+\x33\x09\xbd\x91\xad\x88\x40\x4c\x88\x4c\x28\x9b\xd2\x7b\x51\x03\
+\x24\xd3\x32\x2e\x78\xd4\xf7\xff\xea\x29\xff\x19\x7f\x2f\x27\x00\
+\xcf\xcf\x51\x01\x4f\x27\x00\x7b\x41\xf5\xcf\x27\x15\x42\xf7\x7e\
+\xee\x4f\x08\xee\x82\x40\xf4\xf4\x73\x68\x01\x32\xa8\x02\x86\x96\
+\x21\xa8\x81\x9c\xa1\xf2\xcb\x3a\x0f\xc8\x40\x04\x4b\x07\x61\x26\
+\xcd\x33\x5d\x8b\xdc\x77\xe0\x53\x01\xfa\x5c\xe8\x31\xd5\x7b\xcd\
+\xff\x5b\x05\xbf\xae\x02\xc0\x06\x7c\xb7\x03\x4e\x0a\x6d\xe4\x97\
+\x61\x18\x28\xfe\x5e\x52\xf8\x1d\xcd\xc5\xe7\x47\x15\xa0\x2b\xbf\
+\xcf\x95\x18\xb8\xca\xfd\xa6\x00\xdc\x16\x64\x07\x7c\x01\x3f\x97\
+\xdf\xdc\xe5\xbe\x51\x36\xa3\x94\x8d\xd4\x94\xc4\x94\xc8\x26\xa2\
+\xc4\x00\x7c\x5f\x7c\x20\xfb\x1b\x7a\x6e\x91\xc1\x23\xab\xf9\x5e\
+\x29\xf9\x1f\x79\x1e\x91\xc3\x1d\x2a\xe0\x15\x04\x60\x79\x40\x04\
+\x8f\x84\x81\x7b\xa4\x90\x6f\x8d\x0f\x6b\x9f\x03\x78\x18\x98\xe7\
+\x81\xfc\x87\x6b\x1f\xe8\xc9\x50\xe1\xf3\x1c\xec\x00\xaa\x01\x82\
+\xfb\xab\xb6\xa0\x51\xa6\x2b\x29\xcf\xa4\x3c\x93\xa9\x96\xca\xd8\
+\xc0\x6f\x55\x05\x2c\x8f\x2b\x80\x3d\x01\x19\x38\xf0\x8d\xb4\xeb\
+\x06\x78\x2e\xd0\xba\x04\xad\x0d\xc8\x30\x0c\x84\x8a\x00\x0b\x86\
+\x42\x06\x10\x55\x40\xf3\xfe\xa8\x04\x78\xd5\x0d\xb8\x94\xaa\xcf\
+\xe0\xfb\x97\x2c\xc0\x01\xbf\xbc\x76\x15\x90\x6a\x9b\x72\x21\x82\
+\x59\x8d\xde\x4c\x89\xec\x03\x80\x3f\x51\xdd\x94\xd0\xef\x11\x97\
+\x63\x97\x2e\xb4\x3a\xc1\xb4\x9e\x88\xca\xc7\x65\x7f\x7e\xa0\xfa\
+\x3f\x22\xf9\xef\x01\x3c\x02\x7f\xeb\xde\x57\x12\x80\xee\xc8\xfd\
+\x33\x5e\xff\x56\xf0\xb7\xd7\x31\xe8\xde\x23\xb0\x75\x97\xb4\x6d\
+\xc0\x22\x19\x44\x90\xaf\xee\x47\x3b\x30\x50\x03\x3a\x87\xfb\x44\
+\xa4\xac\xa4\xf9\x4a\x39\x5f\x49\x7d\x24\xd0\x94\xe6\x39\x57\xc0\
+\xfb\x77\xea\xba\x22\x83\x06\xfa\xb9\xf6\xfe\x23\xf0\x7b\x2b\xc0\
+\x55\xe6\x8f\xc0\x6f\x9d\xff\x5f\x13\x00\x6f\xaa\x00\x85\x21\x20\
+\x5e\xf9\x7f\xa9\x39\xc0\x54\x29\x41\x21\x0b\x68\xcf\x08\xf8\x5c\
+\xec\x81\x90\x50\x2a\x86\x7f\xb6\x2b\xa5\xac\x4b\x1e\x40\x1c\xc8\
+\xc0\x91\x78\x29\xd7\x33\x54\x7d\x0e\xbf\xd6\xf8\xfa\xf2\x5a\xc9\
+\xff\xca\xca\x3f\xae\xf4\x7b\xf7\x4e\xcd\x05\x4c\x4f\x06\xff\x66\
+\xf5\xb7\x40\x08\x99\x9e\x1b\x0e\xee\x6e\x16\x32\x43\x55\x97\x30\
+\xc5\x17\x82\x40\x04\x7b\x05\xb3\x80\x4a\x20\xb0\x03\xfe\xef\x70\
+\xb0\x12\x35\x24\x5c\x2a\x7e\xa6\x0f\x32\x81\x73\xc3\xca\x67\xce\
+\xdd\xb0\x6e\x1f\x00\x62\x16\xd0\xaa\xbd\x76\x6d\x40\xee\xda\x7f\
+\x36\xf8\x8f\xa0\x7d\x48\xf5\x5e\xdc\xb2\x8f\x86\x85\xac\x75\x00\
+\x62\xff\x5f\x6b\x3b\xb0\x4d\x09\xe4\x3a\x0b\xd0\xc0\x3e\xc1\x6f\
+\xa6\x57\xfd\x99\xac\x7e\x9c\x0a\x21\xf8\x23\xc3\x57\x28\x7a\x5d\
+\xec\x00\x02\xdf\x1c\xc8\x57\x00\xbd\x57\x7d\x06\xb0\xcf\xe5\x43\
+\x7e\xcc\xe9\xdc\x93\x01\x33\x11\xa7\xe7\x49\xfe\x67\x56\x7e\xb9\
+\x1b\xf8\xfd\xe7\x7e\x11\x01\x74\xe0\xb7\x1d\x80\x3e\xd3\x22\xcc\
+\x3b\xe0\x57\x6b\xe0\x9f\xb9\x27\x83\x4e\x05\x20\xd8\x61\x55\xa0\
+\x57\xfc\x91\x1d\xa8\x84\x41\xd0\x1a\xac\x39\x40\xa9\xfa\x79\x26\
+\x4b\x79\xb0\x03\xa2\x2e\xfe\x04\xfe\x4f\x7a\x42\x70\xe9\xdf\x2b\
+\x01\xaa\x99\xc0\xd8\x06\xf4\x7d\x7f\x57\x05\x14\x94\xc1\xf8\x3c\
+\xcf\xf6\x7b\xcc\x2b\x12\xe0\x10\x00\xc6\xff\x2e\x65\x79\x1a\x56\
+\x7e\xee\x14\x80\x15\xda\x68\xc0\xf7\x0c\x60\x2e\xd9\x45\xa2\xb9\
+\x52\x5a\xa2\x65\x91\x53\xca\x06\x36\xe0\x0a\xa0\x8f\xa5\xdb\x1a\
+\xf8\x3b\x0b\x70\x21\x62\x27\x84\x72\x9d\x51\x15\x5c\xca\xc7\xd2\
+\x73\x24\xff\xbd\x04\xb0\x9f\xf0\xdf\x96\xfd\xfd\xf5\x61\x15\x30\
+\x3d\xb3\xfa\x8f\xc0\x3f\xaa\xfe\x23\x8b\x60\x74\x5f\x20\x78\x93\
+\x24\x38\x00\x5a\x42\xa5\x1f\x90\xc1\x8c\x56\x80\xe0\x3e\xf5\x44\
+\xe1\x9d\x80\xb9\x53\x03\xcd\xef\x67\x2e\x6b\x82\x67\xf8\x8a\xa6\
+\x5c\x2b\x3c\x91\xd2\x3c\xf7\x0a\x00\x33\x81\x26\xfd\x7b\x12\xc0\
+\xb6\xa0\x85\xd1\x60\x97\xfb\x06\xad\xc1\x35\xf0\x6d\xf3\x54\xef\
+\x56\xed\xdb\x75\x1f\xf6\xf5\xf3\x00\x6e\x00\x72\x49\x0f\xb0\xf2\
+\x73\xed\x06\x58\xed\x06\x48\x01\x7b\x86\x31\xe6\x85\x0c\xae\xf0\
+\xff\x26\x95\x04\xc9\x94\x24\x5f\x97\xaf\xb3\xab\xfa\x14\xfe\x0f\
+\x1c\xfc\x51\xfa\xcf\xe3\x6b\xce\x44\x6c\x40\x08\x53\x51\x06\x97\
+\xe5\x7e\x4e\xf7\x8d\xf1\x1e\x95\xfe\x47\x2a\xfd\x3e\xc8\xd7\xf7\
+\xec\x0b\x15\x80\x01\xf0\xf6\x54\xc0\xad\xea\x6f\xf4\xe4\x79\x01\
+\x58\xde\x8b\x16\x00\x4f\x00\x8a\xd5\x5f\x03\x59\x78\x27\x01\x5f\
+\x77\x3b\x0e\x55\xdf\xbf\xfc\x22\x67\xfe\x58\xfc\xfe\x04\x7a\xc4\
+\xca\x68\xd4\x9c\xc1\xf7\xeb\xd0\x0a\x58\x97\x05\xf4\xdf\x4d\xeb\
+\xc0\xdf\xfc\xbf\x57\xfb\xd8\x15\xe0\xd0\x09\x18\x91\x00\x41\xe5\
+\x47\x0b\xc0\x21\x03\x88\xa9\x3f\xd7\x8a\xcf\x60\x00\xfa\xca\xcf\
+\x64\xb5\x2d\xc8\x61\xc4\x0f\xf3\x00\xeb\xec\xcf\xdc\x54\x40\x51\
+\x39\x4b\x2e\x60\x03\x02\x08\xe0\x47\xe9\xcf\xb9\xbd\xe6\xb9\x3c\
+\x53\xaf\x02\x38\x13\xf1\x54\xee\x5d\x16\x7b\xc1\x6f\xed\x35\xd3\
+\x32\xab\xfc\x68\xe5\x97\x93\x95\x9e\x4f\x90\x80\x6d\xdc\xe7\x4f\
+\x22\x80\x23\xb2\xdf\xee\x0c\x08\xef\x99\x21\xe8\x5e\x43\x95\xaf\
+\x93\x79\x02\x6d\xba\x60\x09\xe6\xe8\xe7\x31\xed\xd7\x02\xfc\x91\
+\x1d\x40\xf0\xcb\x5c\x8e\x0c\x76\xe0\x37\x0b\x60\xfe\x15\xa2\x25\
+\x98\x97\xaf\xdc\x06\xff\xc7\xd8\x06\x34\xd2\xd2\xef\xef\x49\x40\
+\x56\xf2\xdf\x17\x0d\xad\x3b\x01\xeb\x10\xdc\xea\xa8\x2f\x6f\xac\
+\x05\xc8\xb0\x27\xc0\xe8\xbf\x69\x73\xef\xef\xd6\xfe\x73\x99\x2f\
+\x45\x0d\x64\x12\x9a\x29\x95\xaf\xfd\xda\x65\x1c\xa9\x12\xa2\x75\
+\x64\x29\xea\xaa\x61\x24\xfb\x23\x9d\x5d\x88\xf2\xbf\x40\x10\xd7\
+\x60\x09\x0a\xf8\xf3\xd4\x83\x9e\xcb\xe7\x55\xbb\x70\x69\xf6\x41\
+\xf9\x73\x7a\xf9\x47\x80\x7f\xeb\xda\x8e\xb5\x04\xa7\x67\xc9\xff\
+\xbc\x43\x04\xb6\x23\xf9\x5f\x11\x10\x8e\x2c\x40\xac\xee\xab\x70\
+\x0f\x80\xae\xb9\x6f\xe9\x45\x2b\xb0\xda\x7d\x98\x8d\x72\xfe\xa0\
+\xcc\xd7\x35\xf8\x4b\xf5\xb7\x01\x19\xe0\x3e\x49\xf3\xdc\x83\xde\
+\xba\x00\xb0\x5d\xd3\x40\x01\x44\xf0\x47\x22\xd0\xae\x03\xb0\x9d\
+\x01\xac\x95\x40\x83\x7d\xae\x39\xc0\x88\x02\x74\xa0\x00\xac\x8d\
+\xff\x42\xef\x1f\xd7\xff\x62\xf0\x87\x41\x27\x85\xff\x57\xfc\xbe\
+\x90\x2a\x28\xdc\x08\x7e\x1e\xc8\xfd\xd2\x2d\xa8\xf2\xbe\xac\xd3\
+\xae\xf7\xa6\xc2\x78\xae\x16\x8a\x35\x50\x57\x06\x99\x48\x91\x0c\
+\x8a\x45\x70\x32\x78\x75\x4b\xef\x18\xd8\xb7\xd5\xc0\xab\x09\x20\
+\x6e\x32\x69\x3b\x76\xe0\x5e\x65\xf0\xd0\x72\x62\x5b\x03\x7e\x9e\
+\x43\xaf\x1f\x67\x02\xb8\x55\xf9\x4a\x1e\xb0\xb2\x4f\x39\xe6\x09\
+\x46\x99\xaf\x8b\xef\xd7\xb9\xc9\x7d\x6a\x80\xb7\x91\x41\x89\x8a\
+\xa0\x6b\x09\xea\x40\xf6\x6b\x90\xc9\xad\x1f\xc0\xc3\x10\xb0\xf7\
+\xff\xda\x4d\x01\xf6\xf2\x3f\x75\x24\xd0\xf7\xd5\xb1\xf6\x13\x4c\
+\x03\x8c\x8e\xfe\xe1\x55\x09\x8c\xe0\xef\x2d\xc0\x4c\x73\x57\xf9\
+\x69\xe7\xb9\xfb\xfe\xa8\x92\x50\x02\xd9\x8f\x0f\x07\x31\x43\xf0\
+\x17\x41\x3f\xaa\xfe\xe5\xb5\x5b\x82\xaa\x02\x2e\x40\x06\x73\xbb\
+\x56\x82\xe7\x97\xb5\xf4\xce\x81\x7d\xfd\xbe\x9b\x61\xe0\x33\x08\
+\xc0\xb6\xbc\xbf\xdd\xb8\xd6\x8d\xd0\xf0\x59\x33\x04\x75\x20\x07\
+\x25\xbe\x83\x1f\x86\x7a\x3a\x5f\x1f\x5b\x86\x4e\x10\x04\x13\x81\
+\xb5\xfa\x17\xd9\x4f\x45\xf6\x7b\xda\xaf\x00\xfe\x58\xf9\xad\x0d\
+\x4a\x47\x62\xc8\xf3\x38\x07\x48\x2b\xff\xdf\xac\x40\x1a\x58\x81\
+\xf6\xdc\x3e\x2b\xc1\xbf\x88\xd7\x97\x0e\xca\xbc\xba\xce\xb0\x1a\
+\x10\x2d\x40\xee\x16\x01\x2b\x4c\x03\x58\xf9\x88\x55\x35\xe0\xfe\
+\x5f\xe0\x91\x81\xb0\xda\xc2\xa7\xa8\x00\x6c\x60\x8b\x3e\x96\xd7\
+\x9a\x8b\x1d\x88\x91\x7d\x0c\x03\xcf\x54\xff\x4b\xa9\xf2\x33\x00\
+\x7f\x1e\xdf\xd3\xcb\x92\x0d\x28\xc1\xf3\x83\x12\x7f\x0b\xe0\xc7\
+\xc0\x3e\x3e\x54\xf5\xd5\x0a\x60\x04\xea\x5b\xdd\x00\x3d\x78\xfd\
+\x34\x8b\x90\x77\x02\xbe\x1c\x16\x0b\x49\x5b\xc0\x93\xa9\x27\x88\
+\xce\x0e\x10\x05\xf0\x17\x70\xa7\x5c\x09\xc0\xac\xec\x06\x12\x48\
+\xa0\xcf\x01\x7a\x4b\x90\x87\x56\x60\x79\xbc\x05\x12\x88\x1d\x00\
+\xde\x7c\xa6\xd5\x73\x5c\x15\xc8\x9d\x61\x64\x50\x00\x63\x0b\x40\
+\x15\xf8\x6d\xf0\x07\x9f\x2f\x83\xaa\x6f\xab\xea\xaf\x40\x02\x8d\
+\xd0\xb6\x09\xe0\xa3\xff\xed\x56\x1d\x90\x40\x91\xfe\x2c\x37\xaa\
+\x7f\xc8\x02\xd4\x03\x41\xb8\x76\xe9\x8f\xd7\x55\x01\x38\x11\xbc\
+\x11\xf1\xb5\x3c\xf3\xb9\x5e\xfe\xe3\x3e\xff\xf6\x6b\xdb\x0f\x03\
+\xa7\x67\xc8\x7f\x1d\xc8\xff\x5b\xa4\x70\xcb\x22\xd8\x13\x2d\x42\
+\x8e\xad\xc0\x1c\x36\xf9\x9c\xd7\x83\x3e\xdd\xac\x00\xc1\x71\xe0\
+\x65\x1a\x50\xb9\x8c\xf6\x4a\x6e\xdb\xfd\x38\xd0\x7f\x44\xcf\x8f\
+\x8a\x20\x74\x05\x3a\x3b\xb0\x04\x82\x36\xb0\x03\x3e\x18\x94\x06\
+\x83\x41\x8b\xd7\xde\x9a\x07\xe8\x17\x02\x51\x47\x00\xed\x77\x93\
+\x06\xc2\xdf\x7b\xff\x04\xe0\xf7\xeb\x74\xe3\xd8\xdf\x0c\x43\x3e\
+\x58\xf9\x97\x60\x70\x86\xc0\xcf\x56\xd5\x7f\x0d\x7c\x0b\xe0\x07\
+\xb2\x51\x2d\x27\x11\x71\xf3\xec\xcc\xdb\xa0\xaf\xf7\x0a\x31\x70\
+\x2e\x95\x3f\x03\x19\x14\x45\x90\xe7\x70\xef\x42\xa4\xff\x15\x02\
+\x40\x42\x28\xca\x40\x68\xd9\x7b\xfe\x9e\x96\xde\x23\xd2\x7f\x0b\
+\xf8\x07\xd6\x07\x4c\x0f\x56\x7f\xbb\x25\xf1\xb7\x6c\x81\x1e\x54\
+\x0d\x47\xee\xdd\xb4\x0a\xa1\xe2\x63\xa5\xc7\xe7\x7a\x14\x78\x68\
+\xf5\x75\x8b\x7d\x96\xc8\x6e\xf1\xfd\x7c\x6d\x15\x5f\x9b\xbc\x37\
+\xcd\xcb\xce\x97\x0e\x7e\x0d\x76\x60\x40\x00\x96\xcb\x57\x9b\x32\
+\xe5\x1c\xc1\xdf\x16\x08\xc9\xc0\x0e\x18\xb4\xd2\x5c\xfe\x5f\xc0\
+\x45\xd3\x40\x05\x8c\x08\x80\x83\xeb\x47\xd1\x9f\x89\x00\xf4\xcb\
+\xb4\x7f\xee\x02\xc0\xd6\xfe\x9b\xca\x57\x31\xda\xf1\x73\x26\x01\
+\xdb\x32\x77\xca\xc0\xe0\x27\x6a\x3b\xe0\x8f\x08\x49\xd9\x77\x31\
+\xb8\x40\x26\xe0\xa0\x2f\xaa\x80\xa5\xb5\x05\xf3\xa5\x01\x5f\x73\
+\xbb\x8f\x60\xe6\x01\xc0\x6b\xc5\x2f\xf7\xe5\x52\xd6\x76\xff\x57\
+\x7e\x07\x2e\x4d\x0d\x48\xba\xbf\xfa\x1f\x01\xfb\x48\xee\xdb\xc6\
+\xfb\xe9\x85\x0a\x40\x77\xc2\xbf\x23\x44\x60\x07\x66\x08\xec\x60\
+\xf5\x1f\x12\x81\x41\xf5\xcf\x7d\x26\xd0\x55\x7f\x68\x0f\x2a\x0f\
+\xb2\x80\x1a\x0c\xea\x52\xf9\xf3\xdc\x1f\xf3\x53\x14\x40\x27\xfb\
+\xdf\x7c\x43\xc0\x90\x05\x10\xd8\x82\x5c\x42\x42\x3f\x41\xb4\x7c\
+\xdc\x49\x40\x3a\x3b\xb0\xb4\xd5\x1c\xe8\x69\xd8\x16\xb4\xda\x49\
+\x97\x4a\x04\x51\x05\x10\x90\x42\x5f\xf9\xe3\x2b\xec\x19\xf4\x36\
+\x60\xf9\xcd\x9e\x42\x89\xb3\x32\xf8\xc3\x75\x21\x50\x6f\x03\x72\
+\x69\x6a\xa6\x6e\x58\x39\x5a\x04\x0c\xff\xae\x1b\xbf\x09\x42\xb8\
+\x7b\x61\x52\x85\xea\x8f\xa0\x47\xc9\x0f\x49\xbf\xc6\xe0\x0f\xc8\
+\x40\x61\x3e\x00\xef\xf9\x71\x4f\x72\x69\xbb\xbc\x54\x52\xf8\x17\
+\x48\xa1\x2c\x0c\x91\xb7\xe5\x97\xe9\x79\xa1\xde\xd1\xaa\xbf\x7e\
+\xcd\x4f\x26\x00\x9f\xfc\x1b\x81\xf9\xd6\xeb\x23\xa1\xa1\x3e\x60\
+\x11\xba\xf7\xf8\x9e\x80\xff\x41\x75\x0f\xa9\x7f\x4c\xfe\x33\x6f\
+\x64\x01\xd9\x48\x79\xf1\xfd\x96\x72\x93\x86\x45\x01\x98\x57\x75\
+\xbf\x97\x94\xe8\x47\x1e\xdb\x81\x54\xec\x80\x5b\x08\x82\x0c\x81\
+\x16\x45\x60\xa4\x94\x43\x02\x6e\x65\xb0\x86\x60\x52\x30\xd5\xaa\
+\xaf\x1d\x09\x50\x25\x02\x2a\xfb\x0a\xc6\xea\xdf\x6f\x08\x12\x2d\
+\x40\x82\xd5\x80\x14\xe4\xbf\x95\xdf\xaa\x1c\x14\xc0\x54\xe9\x46\
+\xea\xbf\xcf\x65\x47\xa3\x96\xfa\xb7\x8d\x4c\xa9\xcc\x01\xc4\x8c\
+\xc0\x36\xc0\x5f\x8e\x27\xf1\x4d\xc9\x89\x29\x2f\xdf\x23\x13\x4a\
+\xf9\xbf\x85\xf5\x59\x97\x00\x00\x20\x00\x49\x44\x41\x54\x02\xfa\
+\x69\xe0\xfd\x5d\xf2\x3b\xf0\x73\x53\x0a\xca\x40\x0a\xff\x2d\x20\
+\xe7\xa9\x00\xfe\x52\xb6\x70\xfa\xaf\x91\x46\xcd\x01\xde\x88\xe4\
+\x7d\x4d\x0a\x72\x29\x56\x20\x2f\xbb\x9e\xea\xd4\x8e\x55\x7e\x34\
+\xd4\x3b\x5a\xf5\x6d\x35\x13\x20\xa3\x05\xd3\xd3\x23\xd5\x3f\xd3\
+\xf8\xac\x39\x1b\x84\x7f\x7b\x56\x40\x4f\x86\x83\x47\x2d\xc2\x2a\
+\x04\x44\x0b\xc0\x83\x7b\xb9\x6f\xf7\x55\x82\xa8\xed\xc1\xa5\xdd\
+\x67\x5e\xf9\xb9\x29\x00\xf3\x1f\xbe\xc1\xf1\xc0\x6e\x07\xde\x36\
+\xb2\x80\xe4\xe0\x77\x52\x28\x03\x41\x79\xb9\x76\x15\xe0\x9d\x00\
+\x57\x03\x19\x6c\x81\x74\x2b\x06\x0d\xfa\xef\xbd\x05\x98\x21\x03\
+\xa0\xb0\x0a\x90\x56\xf3\x00\xcb\x6f\x4b\x0e\xfd\x75\x07\x7e\x86\
+\x85\xc3\x4c\xd2\x8d\xef\xe6\x92\xfa\x4f\x01\xd0\xb9\xab\xf8\xd4\
+\xa9\x80\xd4\x59\x01\xff\x69\x5e\x77\xca\xc2\x5a\x01\x30\x09\xb1\
+\x29\x49\x2e\xbd\x8d\x4a\x04\x5a\x00\xae\x85\xf5\x74\x1d\xfc\x55\
+\x59\x5f\x80\x5f\x7d\xbe\x13\xc2\xc0\xff\x8b\x13\x3f\x90\x42\x05\
+\xbe\x10\xc9\xdc\x6c\x81\x14\x19\xaa\xd3\xe3\xa1\xde\x91\xaa\x3f\
+\xba\x47\xe5\x9c\x97\x36\x41\xf5\x38\x01\xd8\x4e\xf5\xb6\x03\xd9\
+\xc0\x99\xec\x20\x1f\x54\x07\x43\x8b\x10\x80\xde\x55\xff\xdc\xcf\
+\x09\x64\x6a\x1f\x9b\x09\xf3\x80\x65\x65\x9f\x7a\x65\xcf\x3d\x01\
+\xd4\x87\x2b\x80\x54\xc0\x9f\x82\x1d\x90\xdc\x16\x07\x19\x7c\x3c\
+\xc1\x5c\x40\x82\xae\x40\xee\x81\x4f\xd5\x02\x34\x05\x20\x83\x20\
+\x70\x06\xf9\x8f\xd0\x9b\x68\xbd\x3d\x78\x8c\x00\xb1\xab\xcf\x50\
+\xf5\x33\x8c\xfe\x26\xd8\x59\x20\x17\x05\x80\xde\xdf\x67\xfd\x9d\
+\x08\x72\x5d\xc2\x94\x83\x0a\xf0\xd5\x7a\x48\x18\x57\x18\x17\xf6\
+\x8a\x8f\xcf\xa8\x3a\xfc\xfb\x52\x76\x25\x50\x21\xe6\x77\xa8\xf6\
+\xc1\xf3\x67\xf4\xfc\x08\xf8\x0b\x3c\x3b\x31\xe8\x86\x0d\x70\xe0\
+\x17\x65\xd0\x01\x3f\x03\xf0\x95\x48\xff\x05\x3b\x60\xcd\x12\xdc\
+\x5b\xe5\x6f\x01\x7d\xeb\x9e\xd1\x75\x64\x03\xa6\x47\xc0\x7f\x14\
+\xd4\xb7\x82\xc0\x7b\x42\xc3\x53\xc3\x44\xb2\xa1\x02\xf6\xaa\x3d\
+\xa3\x3d\x50\xd2\xbc\x10\x40\x6b\xf7\xe9\xb2\xd5\xaf\x03\x1d\x83\
+\x40\x55\xb2\x7a\x1a\x68\x6e\x07\x02\xbc\x81\x1d\x48\x45\x11\x48\
+\xb1\x03\xd4\xd6\x0a\x90\xc0\xff\x49\xce\x01\xf8\x56\xad\x81\xd5\
+\x21\x20\xad\xa0\xe3\xb0\x71\xe8\x14\xf6\xd5\x6a\x47\x82\x5b\x5d\
+\x06\xbc\x06\x7f\x8b\x04\x7d\x94\xc7\xd5\x80\x03\xdf\xc9\x20\x41\
+\x06\x90\x61\xf3\x52\x2a\xb4\xb4\xdc\xf7\x8a\x4f\x21\xf8\x6b\xaf\
+\x69\x00\xfe\x71\x59\xe9\xcb\x67\x23\x83\x2b\xe5\xb2\x6b\xe1\xa4\
+\xa5\xda\x67\x2d\x32\x7f\x43\x05\xe8\x7b\x01\x76\xb4\x00\xb9\x1f\
+\x00\xaa\x52\xdf\x81\x9d\x02\xf0\xd1\xfb\x5f\x96\x73\xcf\xf4\xbf\
+\x76\xdf\x6c\x21\x02\xb9\x2c\x4b\x9a\xbd\x53\xf0\xa8\xb7\x3f\x47\
+\x08\xc3\x6e\xc0\x74\xaf\xff\xd7\x0d\x22\xb0\x9d\x40\xf0\xc8\x7b\
+\x6e\xad\x01\xb0\x13\x2a\xa0\xce\x10\x64\x22\x4b\xfd\xd6\xdd\xca\
+\xeb\xe0\x0f\x1f\x5d\x38\xe8\x3b\xf9\x24\x38\xe1\x23\xe5\x06\xf4\
+\xba\xc7\x77\x09\x02\x13\x64\x03\xd2\x88\xc0\x2c\xd8\x01\x27\x85\
+\x77\x50\x01\x09\x4c\x8c\x65\xb2\xd4\x07\x82\x19\x02\xc1\x0b\xd8\
+\x01\x81\x6e\x80\x42\xf5\xcf\x30\x1e\x8c\x2a\xc0\x49\x41\xc3\x04\
+\xa0\xc2\x75\x82\x4e\x7f\x54\x01\x52\xed\x80\x16\x1b\x60\x55\x0d\
+\xa4\xa0\x04\xac\x9e\x4e\xe8\xc9\x3f\x1e\x65\x32\x03\x41\x5d\x77\
+\x7e\xab\x14\x14\x81\xc2\xa6\x23\xb8\xf2\xb0\xec\x42\x68\x4a\xa2\
+\xe5\x40\x42\xbd\x2c\xcf\x5d\xd8\xa7\x00\xfc\x51\xc5\xf7\xad\x9b\
+\x2f\x44\xf2\x51\xd4\xdd\xa5\x3f\xf3\x9d\xa7\x81\xec\x87\x41\x30\
+\xb9\x94\xeb\xff\xfa\x8e\x81\xea\x42\x26\x76\x29\xbf\x60\x0f\x79\
+\xfb\x23\x95\xbf\xdf\x5f\xf1\x59\x0a\x40\x6f\xf0\xf4\x11\x0e\xbf\
+\xf5\x9e\x33\x9d\x84\xdd\xdc\x40\x1a\xe0\x4d\xd6\xf3\xfe\x1a\xef\
+\xa1\x32\xe0\xdc\xfa\xfd\xa5\x4d\x47\xc5\xa3\x9b\x0e\x6c\x00\x9e\
+\xff\x0d\x0a\xc0\x90\x24\x2e\xa1\x3b\xf0\x56\x0e\x0b\x30\x5d\x3e\
+\x86\x63\xc2\xb9\xb7\x02\x06\x16\xc0\x5b\x7f\x5c\x16\x0c\x49\xd9\
+\x48\x54\xba\xea\x6f\x00\xfa\x76\x6a\x10\x6d\x58\x80\x1c\xaa\x7f\
+\xbb\x46\x15\xd0\x2b\x00\xef\x4e\x4c\xf5\xba\x49\xff\x99\x32\x25\
+\x98\xfb\x4b\x55\x0f\x50\x95\xfe\x04\x36\x00\x57\x0a\xf2\xc0\x02\
+\x64\x40\x04\x92\x41\x06\x02\xc8\xa4\xc4\xca\xcb\x7c\x80\x6a\x0b\
+\x01\x5d\x05\x68\xcc\x00\x22\xf0\x27\x20\x09\x04\x3e\x04\x82\xb5\
+\x9a\x3b\xa0\xfd\xf3\x12\xa8\x05\x24\x02\x57\x00\xb9\x7c\x5e\x5e\
+\x94\x82\xd9\x72\x7c\xb2\x3e\x20\xf9\x8f\xde\x7f\x06\x01\xec\x55\
+\x73\x3b\x40\x02\xcf\xb0\x09\x47\x42\xc3\xee\x3d\xb2\x1e\x04\xb2\
+\x04\xdb\x74\x73\x08\x05\x61\x5c\xb8\x6b\xf9\x15\xe0\x57\x1b\xe0\
+\x39\x40\x6e\x80\x37\x04\x7f\xb9\xb6\x7a\x2e\x98\x3f\xbc\xf2\xfb\
+\x69\x21\x19\xba\x01\x4b\xd5\xaf\x2d\x41\xbf\xce\x0a\x2d\xc0\xde\
+\x02\xf4\xd7\xcd\x06\x64\x58\x15\x88\x76\x00\x55\x00\x12\x80\x8b\
+\x6a\x02\x78\x51\x73\xd7\x65\xac\x7c\x01\x58\x0b\x04\xdb\x1a\xfe\
+\x39\x0c\xf6\xe4\x1a\xf8\xe5\xba\x47\x01\x0d\x08\xa0\x57\x01\xfb\
+\x09\xd1\x1a\xf4\x4d\x0d\x2c\x6a\xe5\x5a\xf7\x22\x4e\xb5\x5a\x23\
+\xe0\xfd\x5e\x21\x07\x79\x2b\x80\x7e\x3b\x06\x7c\xcd\xe5\xbd\xba\
+\x58\x08\x24\x8c\x0a\xfc\x37\x38\xca\x39\x5a\x01\x24\x10\x2d\x64\
+\xc0\x8f\x78\xfb\x73\xf7\xf9\x71\x02\xd8\x1c\xfe\xb1\x8d\x69\xc0\
+\x23\x80\x7e\x24\x34\xbc\x39\x66\x5c\xa4\xbe\x61\x3b\x10\x8e\xf4\
+\x52\x06\x22\x50\xec\x12\xcc\x2d\xf5\x67\x00\x75\x02\x8f\x7f\x6d\
+\xf7\x4d\x43\x6b\xd0\xad\xc0\x25\x2f\x9f\x5f\x4f\x01\x2d\x95\xff\
+\x02\x76\xe0\x02\xdd\x01\x81\x90\x50\xda\x02\x18\xb7\x02\x48\x04\
+\x0a\x16\x20\xd7\xad\xb7\xad\x74\x7e\x9a\x12\x10\x10\xe2\x44\xfd\
+\x29\xc1\xad\xfa\x73\x25\x82\x0c\x95\x5f\x8b\xfc\x57\x38\xe8\x23\
+\x97\x79\xff\x26\xfb\x31\x6e\xf4\x83\x4b\x72\x25\x80\x06\x7a\xbf\
+\xce\x84\xdb\x75\xf1\x4a\x09\x28\xa8\x00\xae\x2a\x20\x57\x35\xc0\
+\x95\xfc\x18\x76\x22\xaa\x36\x80\x32\xb1\x09\x49\xfe\xaf\xf7\xfe\
+\x22\xd0\xb6\x7b\x1f\xe4\x01\x17\x38\xb9\xe5\x02\xa0\x0e\x9f\x13\
+\xfd\xbf\x2b\x00\x31\x22\xfb\xaf\x28\xbf\x19\x80\xfe\x0e\xaf\x2f\
+\xd0\x2e\xc6\x7b\x7c\xce\xdb\x1f\x91\xfd\x16\xa6\xb1\x43\x0e\x30\
+\x3d\x1a\x00\x1e\x55\x02\x7a\x40\x0d\xe8\x09\xb2\xb8\xb5\xe8\x68\
+\x65\x01\x1c\xfc\xdc\x14\x81\x49\x08\x00\xe1\x61\xd9\x16\xdf\xef\
+\xd5\x9c\xdb\x73\x95\xfe\x5e\xf9\x49\x5b\x65\xb7\xfe\xc0\x3f\x7b\
+\xf3\xa3\x81\x4b\x95\x7f\xcb\x64\xb3\xd6\x8e\x40\xb5\x03\x96\xc9\
+\x2e\xd1\x06\x34\x0b\x60\x45\x29\x64\xc5\xae\x80\xd5\x9d\x84\xbc\
+\x12\xa3\x02\x70\xf0\x67\x30\x81\x02\x13\x05\x91\x00\xb4\x5b\xf9\
+\xd7\x57\xfe\x46\x08\xae\x00\xda\xb3\x85\xe0\xcf\x6a\xf0\x17\x97\
+\xf8\xe6\x4a\x35\xd6\xed\xd5\xd7\xc0\xdf\xef\x11\xe8\x3f\x45\x01\
+\x42\xd0\xd5\xec\x81\xd2\x0c\xd7\x5a\x4f\x28\x62\xe2\x65\x5f\x41\
+\xb5\x02\xd8\x8f\x20\xfb\x0b\xa0\x6b\xaf\x5e\x07\x7e\xdf\xdb\x78\
+\xff\xad\xbd\x7d\xb5\x01\x39\x64\x00\xae\x08\xac\x00\x1f\xc2\x41\
+\x83\x7b\x15\xf8\xa5\xac\x6a\x7a\xbc\xc2\xdf\x7a\x3c\xd3\x02\xdc\
+\x22\x80\x57\xd9\x84\x5b\x6a\x61\x95\x23\x68\x03\xb9\xab\x80\x95\
+\x1d\x88\x01\xa1\xcc\x8b\xb3\x76\x49\xef\xf2\x9f\xad\xec\x0c\x02\
+\x8a\x80\xf3\xf2\x3e\xed\xfd\xbf\x71\xd9\xec\x03\x09\x01\x73\x00\
+\x6e\x80\xaf\xdd\x01\xc9\x7d\xe5\xf7\x0e\x81\x14\x42\x50\xad\xd2\
+\x37\x83\x05\xe0\xba\x51\xa8\x56\xe9\x4f\x75\xa1\x10\x75\x87\x87\
+\x0a\xe1\x99\x80\xd6\xa5\xff\xd2\x4f\xda\x57\x35\xe0\xbb\xfa\xb5\
+\xf3\x87\x34\x1c\x47\x22\xd0\x7d\xc8\xdd\xd1\x66\xfd\x73\x6e\xab\
+\xf4\xea\x6f\xd4\x3c\x6c\x2e\xf7\x39\x80\xd4\xff\xdf\xb6\x0b\x51\
+\xb4\x02\xbc\x22\x00\x35\x21\xa9\x95\x9e\x83\xdf\x2f\xc0\xdf\xac\
+\xfe\x0a\x60\x7d\x5b\x76\x28\xae\x3f\x63\x97\xf4\xef\x7e\xa4\xf3\
+\x3a\x13\xe8\x54\xc1\xe8\x9e\x8f\x8f\xff\x57\xee\x5d\x96\xfd\x0f\
+\x4d\x1e\x03\xf9\xab\x08\xe0\xe8\xbf\xa1\x07\xdf\xa3\x07\x55\xc3\
+\x5e\x56\xa0\x07\xda\x86\xb9\xc8\x7f\x07\xbf\xa5\xb1\x0a\x68\xd7\
+\xba\x84\x7f\xee\xcb\x1d\xf4\x65\x42\xaf\xe6\x01\x05\x98\x15\xa0\
+\x15\xb4\x45\x25\x50\x38\xfe\x77\xf4\x98\x4a\x1b\xd1\x37\x11\x99\
+\x80\x14\xae\xda\x5e\x4f\xa5\x45\x38\x29\xe9\xbc\x48\x7f\xaa\x16\
+\xa0\x6f\x07\xfa\xeb\x54\xaa\x7f\x02\x35\x30\x97\xa9\xc0\x18\x02\
+\xe6\x6a\x11\xb9\xd4\xdc\x66\x01\x08\x8e\xfe\xf2\x0d\x3f\xf1\x39\
+\xd5\x2c\xc0\x28\x57\xa3\x91\x6b\xe4\x98\xba\xaa\xaf\x1d\xe0\x17\
+\x6d\x61\xc3\x47\xee\xac\x00\x77\x64\xd7\xaa\xbd\x74\x47\x92\x68\
+\x3d\xa2\x04\x9e\x35\x13\xab\xad\x13\x7e\xf4\xf0\x0e\xe2\xee\x7a\
+\xd4\x09\x10\xa8\xea\x1b\x69\xbf\x57\xf5\xe8\xf5\xcd\x20\xfc\xfb\
+\x0f\xac\x00\x12\x82\x11\xd9\x5c\x88\x80\x5e\xf3\xe0\xfb\x09\xc0\
+\xf4\x8e\x7f\x4f\x4f\xbe\x67\x8b\x18\xf2\x01\x35\x90\x47\x1f\x4f\
+\xed\xe7\xe3\xd5\x7e\xd5\x11\xe8\xee\x2f\x3b\xd6\x93\x19\xc8\x7f\
+\x6b\xb2\x9f\xe0\x7e\x06\x82\x10\xe8\x0a\x78\xc5\x96\xf6\x30\xc9\
+\x6d\xc9\x69\xbd\x57\xc0\xad\x05\xfc\x5a\x48\xc1\x80\x14\xaa\xb5\
+\x28\x0b\x87\x44\x29\xab\xd6\x0e\x80\x67\x01\x0c\x1b\x84\xe4\xf0\
+\xdd\x49\x00\x7e\x0d\x6b\x01\x0c\x5a\x81\x6d\xa4\xa6\x5f\x06\x6c\
+\x01\xfc\x29\x54\x7d\xab\x6d\x47\x0d\xc1\x9f\xd6\xaa\x6f\x75\x79\
+\x15\x85\x9f\x14\x05\xff\x2f\xab\xe4\x9f\xcb\x34\x2b\xd7\xff\x57\
+\xe9\xfc\xbf\xae\x88\x40\x60\x50\x59\x88\x2b\xd8\xcb\x02\x11\xb1\
+\xb6\x69\x64\x17\xe4\x29\x78\xfb\x37\x20\x05\x03\x05\x70\x69\xaf\
+\x9d\x28\x3a\xaf\x9f\xfb\xe0\xaf\x56\xf9\x79\x4d\x08\x06\x99\x81\
+\x41\x97\xc0\x6c\x1c\x0e\x3e\xfe\xb0\x72\xe4\x03\x13\xd1\xcf\x97\
+\x28\x80\x57\x59\x84\x23\x9d\x83\xa1\x2d\x28\x60\x47\xa9\x5f\x89\
+\x80\xa1\xf2\x33\x91\x89\x8d\xab\xbf\x4b\x7a\x04\x3e\x69\x1b\x0b\
+\x86\x85\x41\x26\xba\x84\x7a\x57\x90\xfe\x17\xd0\x2a\x5c\xb2\x04\
+\x07\x07\x06\x85\x3a\x00\xff\xd4\xec\x81\x95\x8c\x41\xb5\x29\x80\
+\x66\x07\x7a\xc0\x18\xf8\x7f\xa9\xf5\xb8\x5f\x16\x9c\x61\x22\x35\
+\x6e\xfd\xdd\xb6\xf2\x6c\xd1\x9a\xcb\x7f\x0d\xe0\xe7\x5a\xfd\x7d\
+\x0b\x33\x82\x7d\x0e\x09\x36\x50\xc3\xf1\xa3\x3e\x2e\x5e\xfb\x7f\
+\x09\xe1\x1f\x03\xc9\x21\xf0\x75\x68\x00\xa4\x9e\xbf\x04\x2a\x60\
+\x15\xe4\xbd\x8f\x49\xc0\x2e\x83\x2a\x3f\x41\x40\xab\xeb\xfe\xff\
+\xaa\x9a\xbf\x43\xdb\x6f\x6a\x9d\x01\x1b\x05\x85\xa8\x00\xfc\xe3\
+\x53\x21\x83\x07\xe5\xfe\xfa\xfe\xff\x4e\x44\xff\x07\x11\xfd\x5f\
+\xd3\x33\xfc\x3f\x3d\x48\x08\x7a\xc2\x22\xec\xcd\x0a\xd8\x56\x1e\
+\x90\xfa\xb4\xdf\xc1\xef\x3f\x33\x9f\xfa\x5b\x3a\x01\x4b\xdf\x7f\
+\x5c\xfd\x0d\x64\xbe\x75\x44\x50\x81\x4e\x18\x0c\x82\xef\xb7\x3d\
+\x1b\xd0\x42\x41\x9b\xa0\x03\x00\xd7\x36\xc1\x9a\x81\xf2\x39\x3a\
+\xe7\x0a\x76\x1c\x15\x16\x50\x00\x09\x48\x20\xad\xd6\x03\x18\x1c\
+\x0c\xc2\x9d\x0a\x88\x1b\x80\xe0\xe0\x8f\x40\xbf\x5f\x0a\x08\x67\
+\x62\xa8\xf8\x0a\x3a\x03\x4f\x6a\x20\xe8\x2f\xe4\xee\xf4\x22\x86\
+\xaf\x13\xab\xbf\xd6\x34\xc2\x0a\xb8\x1b\x01\xf8\xbf\xdd\xcc\x80\
+\x86\x11\xa1\xfe\x1e\x0f\x81\x0f\xde\x5e\x94\xc8\xde\x7a\x52\x70\
+\x5f\x5f\xbd\xfe\x86\xf7\x37\x68\xf5\x56\x6f\x3f\x81\x42\x78\xef\
+\x77\x84\xaa\x79\x01\x02\xfe\xd2\x7f\xbc\x92\x01\x6f\x03\xfc\x28\
+\x11\xf4\xaf\xff\xdf\xf2\xf8\x7f\xa6\x47\xab\x3f\xdd\x21\xf7\xef\
+\x21\x8b\x23\xa4\x91\xf7\xc8\xc6\xc1\x2e\x45\x0d\x40\xbb\xcf\x52\
+\x7b\x6d\x92\x5b\x8b\x0f\xa4\xbd\x91\x83\x7f\x74\xaf\xfc\x20\x11\
+\xf8\xe8\xff\x83\x1a\x20\xce\x64\xc1\x0a\xd0\x54\x14\x46\xb1\x00\
+\xb5\xf5\x84\x4b\x89\x39\x37\xc2\x98\x17\xc2\x50\xed\x73\x00\xef\
+\x93\x1b\x78\xe8\x04\x0d\xba\x0c\xfb\x03\x8c\x0f\x06\xe1\xba\x8b\
+\x9f\x76\x9b\x79\x31\x40\x2a\xa6\xfe\xed\xdf\x6a\xc0\x8f\x2b\x32\
+\x28\xac\xec\xa0\xee\x37\x28\x7a\xff\xa6\x66\xb6\x09\xa0\xc1\x3e\
+\xd7\xed\x48\x39\x00\x7f\xb9\xb7\xa8\x80\xe5\x34\xe2\x6b\xeb\x0a\
+\xf8\x75\x95\xf4\xf8\x31\x0b\xc4\x70\xd9\x90\xfc\x18\x14\x2a\x80\
+\x58\xb7\xd3\x7e\xef\x04\xd4\x05\x62\x79\xf0\x71\xb4\x06\x3b\x4a\
+\x80\xee\x54\x03\x7c\x32\x03\x18\xf9\xff\x7b\x09\xe8\x6c\x46\x70\
+\xb6\x93\xb0\x22\x0b\x6b\x21\xa0\xc1\x5a\x00\xc3\xd9\x00\x2e\xde\
+\x3f\xfb\x20\x8e\xb5\xea\x4f\x9e\xfa\xb7\x7b\xc6\xe1\x5e\x56\x32\
+\xb1\x15\x01\x18\x87\x6a\xcf\x79\xb1\x03\x0c\x0f\x82\x25\xc4\x35\
+\x07\x80\xf1\xe1\x04\xfb\x0c\x52\x5e\xc8\x84\x97\xfc\xc0\xd4\x77\
+\x0a\xd2\x2e\x25\x47\xe0\xe7\x90\x05\x8c\xce\x06\xe4\x81\x05\xb0\
+\x2a\xff\xb5\xee\xf9\xdb\xb6\x22\xc5\x71\xdf\xdc\xed\x60\xdc\x6f\
+\xe7\x8d\xe0\xcf\x00\x78\x1d\x80\xde\xaa\xd7\xd7\x4e\x05\xf0\x0e\
+\x01\xf8\x60\xf2\x1c\x80\xef\xd4\x21\x6d\x87\x02\x63\x12\xb5\x41\
+\xd2\x6f\xeb\xd7\xd5\xfb\x7f\xf4\xaf\x6b\x88\xf7\xde\xc0\xba\x92\
+\xfd\xd1\x0e\x60\x17\x20\x0f\x32\x80\xa8\x02\x0a\x29\x50\x7c\xcf\
+\x83\x4a\xe0\x91\x2e\xc0\xe8\xf3\x5f\x15\x52\xea\x03\xca\x60\x48\
+\x04\x30\xfb\x6f\x06\x44\x50\xba\x42\xe5\x98\x7a\x52\x2e\x41\x5d\
+\x05\xbd\xb5\x4a\x9f\xe0\x5f\x13\x7c\x06\x6b\xb0\x52\x00\xd6\x57\
+\xff\xa9\xdc\xbf\x06\x02\x60\x2d\x12\x1f\x4e\x0f\x62\x5f\x64\x34\
+\xb0\x03\x06\x0b\x9f\x4d\x49\xb3\x86\x95\x71\xd6\xf5\xcd\x65\x70\
+\x58\x88\xee\x1e\x0c\x12\xb7\xfd\x16\x48\x15\x5a\xf8\xa7\x00\xfe\
+\xb4\xb5\x83\x6f\x05\xbf\x76\xd2\x3f\x77\x95\x9f\x02\x09\x5c\x61\
+\x4b\xb1\xe8\xf3\xad\x03\xfe\x62\x4a\x34\x00\x5f\xea\x80\x34\xae\
+\x19\x14\xf2\xc0\xe7\xa3\x00\x93\x8a\x14\xff\x08\xad\xbc\x60\x01\
+\xcc\x2d\x40\x86\x0a\x3d\x4a\xfa\x51\x01\x84\xd6\x5f\x77\xff\x88\
+\xec\x2f\x0f\x7a\x2f\x5d\x01\xff\xf8\x74\x1b\xd8\x27\x06\x82\x5e\
+\x32\x0a\x6c\x37\x56\x0e\x3e\x42\x60\x46\x77\xce\x15\x58\x4b\xfa\
+\xdd\x02\x78\xd0\xba\xd8\x00\x23\x53\x25\x75\x70\xcf\x0e\x7a\x03\
+\xef\x6f\xad\xea\x13\x3c\x3b\x49\xe4\x9e\x18\x0c\x09\x81\x07\x8a\
+\x80\x17\x52\xf0\xfd\xee\xeb\xb4\xa0\xb7\x11\xa7\xb0\xad\x98\xb8\
+\x75\xf0\xf7\xb6\x0e\x81\x2a\x8e\xc9\xb6\x5c\x60\xfd\x9d\xa0\x6e\
+\x33\x8e\x76\xc4\x06\x87\xf3\x7a\xb8\xeb\x31\x58\xed\x35\x48\x77\
+\x6a\x41\xde\xd8\xc0\xd3\xea\xd2\xf3\x1c\x88\xc0\x02\x11\x18\x24\
+\xfc\x48\x52\x78\x00\xaa\x56\x22\x68\x5f\x45\xfb\xda\xa4\xa3\x89\
+\x06\x7c\x83\x91\x21\xf3\xfb\xca\xc4\x32\x0d\x7a\xfa\xd7\x26\x17\
+\x2b\xa0\x3f\xa0\x75\x87\xe0\xfc\x00\xb9\x3e\xc1\x7d\x04\xfc\xe8\
+\x63\x71\x67\xe8\x28\xfb\x63\x37\x20\xc3\x81\xa8\x04\xef\xe3\x53\
+\x55\x7e\xef\x3d\xd3\x33\x3b\x00\xf7\xa8\x03\x7a\x82\x22\x38\x94\
+\x3b\xa0\xe4\xcf\x4d\x05\xd4\x3c\x20\x43\xf5\x47\x90\x7b\xcb\x0f\
+\x2c\x41\xfd\x45\xcf\xf8\x0c\x95\xff\x62\xad\xea\x3b\x21\x5c\x74\
+\xe9\xeb\x03\xf0\xc9\x74\x99\x0a\xe4\x32\x36\xec\x49\x79\x86\xd7\
+\xfe\x4b\x4a\x83\x2d\xc6\x61\x43\xd1\x35\x01\xe8\x4a\x6a\xe3\x4e\
+\xc1\xb8\x27\xe0\x68\x4b\xd0\xdc\x41\x12\x49\x00\x77\x1b\xba\x6e\
+\x6c\xea\x39\x03\xd0\x75\xb0\xa0\x07\xc9\xc7\x49\x60\xee\x64\xbe\
+\x5f\x4b\xf7\x7c\x05\xf1\xdf\xc8\x20\x86\x7d\x06\xfe\x5f\xca\x56\
+\x28\xed\x63\xf3\x72\xc4\x98\x4e\x44\x72\x85\x5f\x90\x0b\xf8\x78\
+\x07\xed\x04\xdf\x6f\xac\xcc\xa8\x0a\x14\x40\x1c\x49\x22\x6f\x90\
+\x01\x90\x02\xe1\x46\x31\xa3\xf7\x68\x23\x06\xba\x94\x9f\xd8\xa5\
+\xfc\x02\xdf\x27\xfb\x4f\x5b\x80\xa3\x7f\xaf\xde\xf1\xf5\xe8\x93\
+\x48\xe2\xa6\x45\x48\xf0\xfd\x4c\x6d\xc1\x8f\xbf\x36\x59\x86\x7f\
+\x96\xf4\x1f\xb4\x52\x2e\x52\x3e\xca\x7f\xb8\xdf\xbc\x3f\xec\x69\
+\x27\xb6\x80\xfc\xaa\xcd\x1f\x4a\x09\x16\xa7\xf5\x84\x60\xf5\xa5\
+\x68\x07\xb4\x6d\x33\x6e\x54\xd6\x0b\xf8\x1a\x03\x6b\x93\x81\xa6\
+\x6d\x33\xd1\xa8\x00\xbc\x69\xd7\x9f\xc7\xd7\x36\x05\xd1\x60\x01\
+\x70\x12\x30\xd7\x56\x5a\x13\xd9\x54\xd7\xf8\x33\xc4\x8a\xeb\xcd\
+\x3d\xa2\xfc\xa7\xa0\x38\x96\xad\xbc\x38\x58\x12\x83\x06\x9e\xd5\
+\xba\xdf\x88\x61\x1b\xf8\xbd\x02\xd0\x6e\x92\xa0\x29\x82\x62\x05\
+\x7c\xab\x2e\x83\x4a\x5f\x95\x40\xac\xfe\xda\x87\x82\x66\x03\x50\
+\xeb\xe0\x63\xa5\x72\x77\x84\x10\xba\x00\x4e\x18\x1d\xd8\x46\x33\
+\x01\xd3\x3a\x20\x7c\xb4\x47\xff\xac\x4d\x41\xed\xc5\xea\xe0\x88\
+\x8d\x38\x12\x32\xa2\xd7\xaf\x53\x81\x55\x09\xd8\x12\xa8\xd5\xd6\
+\x5f\xf9\xac\xb9\x27\x03\x9a\x8d\x2c\x21\xd8\x37\x32\x01\x57\x0b\
+\xde\x19\x98\xca\x7e\x81\x0c\x09\x3e\x97\x19\x02\xeb\x1f\x66\xb0\
+\x3f\x60\xe9\xf5\xd7\xa9\x42\x9f\x17\xb0\xb0\x70\x28\xc1\x98\xb0\
+\xb5\x6d\xb2\x68\x05\x7e\xad\x06\x80\xc3\x5a\x00\xdc\xff\x7f\x59\
+\x07\x20\x35\x53\x17\x18\xfd\xd5\xea\xfd\xb5\x3b\xd8\x63\x3c\x86\
+\x45\xc1\xfb\x7b\xa7\xc1\x06\xc0\xe7\xa0\x52\x74\xa0\x02\xb4\xfe\
+\xb7\x06\xbb\x74\x40\xef\xe5\x7f\xee\x0e\x27\x37\x23\x62\xfb\xd8\
+\x0e\xfb\x6a\x16\x10\x15\x01\xfa\xf8\x8f\x16\x8d\x0f\x3d\xfe\x3b\
+\x9c\xf7\x60\x50\x81\x6c\xc3\x16\xb8\xdc\x9f\x20\x76\xdf\x7a\x3f\
+\x76\x06\xd2\x7e\x95\xbf\x31\x11\x78\x54\x01\x9c\x9a\x00\xa4\xc1\
+\xee\x83\x67\x2a\xf7\x59\xdb\x71\xe8\x6b\x4b\xf0\xd0\x30\x0f\x20\
+\x5e\x45\xcb\xbb\xb9\x3c\x27\x0b\x64\xa0\xed\x07\xe3\xd5\x1e\x15\
+\x83\x80\x14\x96\x40\x14\x02\x95\x1f\x55\x00\x06\x81\x09\x2a\x3f\
+\x2b\x00\x3b\xb7\xfb\x06\x93\x82\xde\x7b\x76\x72\x48\x8b\xa5\xf0\
+\xff\x7c\xc1\x10\x55\x30\xe1\xd9\x81\xad\x4b\x8f\x1b\x81\xc6\xe8\
+\x8d\xc2\xdc\x3f\xee\xeb\x9f\x3a\xd9\x9f\x07\xdb\x78\x51\xa9\xb9\
+\x7d\xf2\xdf\x48\x40\xc2\x01\x26\x5c\x9e\xe7\x0e\xf8\x0d\xf0\xd6\
+\x49\x7c\x59\x25\x04\xb9\x4b\x10\x1a\x19\xf8\x6e\x85\x2d\x76\x64\
+\x4b\xd0\xf6\x43\xf9\xfe\x11\x2c\xc0\x34\xa8\xfe\x40\x06\x94\x42\
+\x75\xb7\x31\x21\xf8\x66\x27\x5d\x27\x60\x24\xf9\x83\x3d\xe8\x76\
+\xba\x8c\x4a\x40\x6f\x5b\x01\x7a\x91\x05\x78\xe6\xc4\x20\xbd\x30\
+\x3f\xe8\xde\xe7\x3f\x23\x81\x36\xa0\x10\x99\x4f\xef\x39\xe0\xb3\
+\x57\x7b\xa0\x16\x54\x02\xb9\x91\x81\x79\x17\xc0\x20\x37\xb0\x5e\
+\x15\x98\x81\x22\xf0\xe0\xef\xda\xae\xbb\x4a\xc2\xb0\x91\x08\xb5\
+\xc9\xbf\xba\x67\x80\xe4\xa6\x1c\x14\xba\x03\xe5\x28\x72\xd3\x65\
+\x4c\x98\x07\x4b\xa3\x6c\xf5\x1d\x89\xc7\x6a\xf6\x27\x01\x49\x08\
+\xfe\xda\x2e\xc4\x1a\x0e\xee\xd8\x1a\xd2\xa6\xba\xab\xc0\xf8\x90\
+\xd2\xb9\x3c\xe3\x8c\x61\x04\xbe\x6c\xca\xfd\x35\xd0\xd1\xfb\xe3\
+\x26\x69\xd4\x29\x01\x23\x06\x90\x3a\xb0\xa9\x4f\xf7\x6b\x85\xb7\
+\x70\x7f\x40\x06\x5d\xbb\x4e\x03\x21\x04\xbb\xb0\xfa\x65\x7f\x1f\
+\x48\xfe\x8d\x8e\x40\xf7\xf9\xef\x3d\x31\x50\xa2\x3b\x46\x82\xf9\
+\x91\x6d\xc1\x9f\xb1\x18\xe9\xf4\x8c\xc0\x91\xcf\xd3\x2d\x92\x48\
+\xe1\xe1\xdf\xd7\xa4\x0d\xec\xef\xb6\xca\x01\x16\xc0\xc3\xae\xb5\
+\xde\xdb\xc5\x0e\x81\x01\xd8\x0d\x7c\x3f\xbb\x0d\xb0\x75\x1e\x90\
+\xac\x82\xbe\x66\x06\x14\xec\x00\xc3\x99\x01\x1a\x06\x85\x00\xfc\
+\x9d\x1d\xb0\xde\x0a\x58\x89\xf0\x70\xe0\x86\x36\xda\x80\xfd\x1a\
+\xbc\x7e\xe4\x57\xbb\x36\x9f\xad\x26\xfc\xfa\xb6\x9e\x16\xc9\xbf\
+\x47\x00\x5c\x4f\x12\xd0\x5a\xfd\xfb\xe9\xbe\xde\xbf\x6b\xd7\x2b\
+\xd0\x4e\x43\x30\xec\x4c\x88\xff\x1f\x73\xe8\x70\x94\xfd\x91\x8d\
+\xa1\xca\xdb\x36\x11\xd0\x35\x48\xfb\x51\xd8\xe7\xa7\x2c\xba\x2a\
+\x1c\x55\xf6\x98\x01\x40\x27\x60\x08\x0a\xdb\x21\x87\x69\x40\x10\
+\x77\xc1\xf8\xff\x9e\x1e\xf5\xfa\xaf\x5c\x4b\xf0\x08\xf1\x0c\xff\
+\xcd\x68\x01\xa4\xc8\x7f\xd1\xc5\xdb\x47\xcf\xef\xed\x40\x09\xf7\
+\x20\xec\xeb\xe6\xbb\xbb\xeb\xf2\x4b\x73\x51\xa2\x0f\x9f\x13\x58\
+\x94\x43\xcd\x1a\x9c\x20\x30\x0b\x20\x18\x3f\xce\xda\x7f\x4c\x4a\
+\x40\x38\xc3\x4c\x81\x0f\x0b\x09\xb4\x05\x45\xc9\xca\x81\x23\xda\
+\xcd\xf5\xad\x8f\x0c\xeb\x8f\xbb\xef\x77\xdc\x8b\xcb\x7d\x33\x6c\
+\xdd\xbd\xee\xf3\xb7\x99\x7d\x5a\xf9\x7c\x05\xd0\x4b\x67\x2a\x74\
+\x55\xfd\x15\x46\x8d\x18\x36\x3d\xc3\xf1\x20\xb4\x00\x34\xf4\xfb\
+\xfd\x42\xe2\x79\x4d\x7f\x76\x5d\xba\x01\xab\x0a\x3f\xc8\x02\xea\
+\x2f\xd3\x47\x90\xdf\x1b\x03\x3d\xf5\x24\x23\xbb\x41\x0a\xb6\x0d\
+\x74\x1a\x91\xc3\x06\x2a\xba\x75\x03\xa7\xba\x03\x3f\x9f\x76\x3c\
+\xf8\x33\x15\xc1\x33\x08\x63\x6f\x1c\x18\xa7\x02\x29\x19\x99\x62\
+\xd5\xa7\x96\x68\xcf\xd4\x13\x82\xf5\x24\x61\x2b\xd0\x83\x2c\x2c\
+\xf7\xbb\xf7\xa0\x0d\x18\xd9\x01\x69\x64\xd0\x76\x15\xd6\xda\xeb\
+\x37\xb4\x02\x0c\x76\x40\xc3\xd9\x84\xa5\x43\xd0\x1f\x31\x36\xd6\
+\x46\xa3\xd3\x80\xa5\x5b\x63\x28\xc5\x5d\xe7\xba\x97\x7f\x3b\xd6\
+\xdc\xc2\x76\x5d\x04\x59\x7b\x24\x17\x27\x9c\x0c\x04\x24\x5d\xf5\
+\x17\xb0\x1b\x0d\xec\x36\xa8\xfa\xb1\xca\x47\x7d\x33\x87\x8f\xd3\
+\x8a\x18\x8c\x88\xd8\xae\x20\xf3\xa3\x05\xb8\x86\xaa\x6f\x3d\x20\
+\x57\x55\x5d\x37\x02\x41\x05\x52\xd8\xda\x1d\xf3\xb2\x43\x0e\x71\
+\x61\x90\x2b\x00\x78\xbe\x3f\xcb\xff\x5f\xd3\xa3\x55\xfb\xb3\xba\
+\x08\x7b\x79\xc1\xe1\xbf\x2f\xb5\x85\x41\x65\x91\x3a\x99\xf9\x8a\
+\xbe\x41\xe5\x3f\xa5\x06\x8c\x2c\xc3\x0f\x6d\x42\x32\xd0\x7a\xcf\
+\xae\xe5\x63\xd7\xf2\xf7\x57\x35\x50\x5a\x4e\xc9\xfa\x40\xc9\x07\
+\x83\xac\xcd\x0e\x54\x62\x20\xd8\x76\x3c\x1e\x3a\x52\x5e\xe3\x7c\
+\x00\x8e\xf9\x60\x1f\x3e\x9e\x03\xd8\xb6\x17\x91\x6a\x20\xf2\x20\
+\xf0\xeb\xc3\xbe\x7e\x7b\xae\xfe\x84\xec\x26\xfb\x5b\x9b\xd1\x60\
+\xc1\x8e\x01\xd8\x0d\xc0\x6e\x50\xe5\x0d\xbc\xbd\x86\x2a\x8f\x47\
+\x91\x22\xe0\x51\x8b\xd0\xca\x0e\x2c\x12\x10\x36\x24\x19\x12\xc1\
+\x96\xef\x9f\x36\xe4\xfb\x75\x87\x14\x6c\x4d\x2a\x2b\xd5\x30\x3a\
+\xe6\xf6\x72\x03\x48\xc1\x0a\x58\x3e\xa6\x04\xe8\x09\xc7\x83\x3f\
+\x73\x93\x12\x7b\x35\x69\x74\xc0\x77\x0b\x60\x65\x4d\xbe\x95\xd3\
+\xa5\x1d\x94\xfd\xbf\x66\x91\x10\x82\x1a\x58\x59\x00\x7c\x3d\x0d\
+\xac\x41\x82\x67\x85\x75\x07\xa6\x64\x9d\x2d\xb0\x4e\x05\xd4\x67\
+\x6c\x23\xe2\xc1\xa4\xe8\x2f\xb5\x75\x03\xd0\x06\xf4\x5e\x9d\x60\
+\x28\x08\x8f\xdb\x10\x58\xd9\x1f\x77\xf4\x59\xeb\x3e\xdf\xb4\xa3\
+\x79\xfe\xbe\xf2\x4b\x35\x0e\x0c\x16\x00\x25\x7e\x7c\x4d\x95\x18\
+\xd6\x55\x5e\x3b\xb0\x8f\xd6\x12\x1a\xec\x8b\x44\xab\x0c\x80\x42\
+\x0e\x80\xfd\xf8\xeb\x06\xb8\xa6\x7d\x42\xa8\xcf\x5b\x90\xfa\x18\
+\x2b\xb1\xae\x23\xa0\x37\x94\x00\xaa\x01\x57\x00\x73\x21\x88\x0c\
+\x64\x71\x1c\xd6\x0f\x13\xc0\x1e\x50\x3f\x83\x44\x8e\xfc\xbb\x16\
+\x46\x82\xfb\x79\x80\xe2\xff\xa9\x80\x7f\x1a\xf4\x17\x3a\x2b\x40\
+\x20\xff\x69\x0c\xf8\xf2\x30\x7c\xcd\xde\xfe\xeb\xef\x99\xb7\x04\
+\x51\x01\xa8\xb6\xf6\x94\x94\x80\x50\xa0\xfa\x2b\x80\x5f\xc2\xf8\
+\x30\xee\x40\x9c\xda\x98\x70\xee\x08\x40\xbb\x3d\x01\x18\xa6\x04\
+\xb4\x9b\xfb\x6f\xb3\xfe\x23\xd9\x8f\xe7\xf4\x29\x28\x01\xdc\x76\
+\xac\x07\x7e\x4f\x02\xd6\x5d\xb7\x4d\xcc\x64\x35\xbb\xe8\x01\x60\
+\x24\x00\xda\x58\x4e\x34\x00\x3b\x50\x5d\x55\x03\x46\x21\x07\xa0\
+\x00\xf4\x0f\xa8\xbe\x16\x9e\xa7\x01\x49\xbc\x6f\x54\xff\x51\xcb\
+\x4f\x07\x5d\x81\xa8\x02\xf2\xe0\x7a\x7a\x6a\x95\x3e\x62\x01\xec\
+\xd9\x4b\x7c\x9f\x49\x22\xa7\xff\xfd\x62\x03\x96\x93\xd2\xb0\xb5\
+\xd2\x67\x00\x9b\xe0\xc7\x76\x0c\x56\xff\x91\x02\x98\xac\x54\xf7\
+\x22\xff\x0d\xb2\x06\x85\x67\x2e\x8f\x64\xe5\xcc\xc0\x60\x1f\x04\
+\xbb\x07\xd6\x9f\x4e\x84\xa7\x0c\xa5\xbc\x3a\x83\x70\xe9\x26\x64\
+\x52\xc3\x95\x82\x58\x57\x29\xc8\x7f\x85\xf9\x41\xa9\x03\x3f\x7d\
+\xca\x8f\x90\x23\x80\x64\x7f\xdc\x1d\x77\xfb\x11\x62\x3b\xce\x3a\
+\x52\x68\x5b\x8a\x18\x80\xd7\xba\x8a\xdf\x4b\xf9\x35\x01\xb4\x11\
+\xa3\xd1\xba\x86\x20\xfd\xab\xe6\xf1\x3f\x65\xdd\xc2\xaa\xda\xc6\
+\xaa\xfc\x31\xa8\xf8\x98\xb1\x4c\x3b\xbf\xa5\x1f\x74\x7b\x27\xcb\
+\xa3\x2a\x60\x4b\x15\x14\x45\x50\xa7\x07\xa7\xf2\xcb\xfe\x05\x0a\
+\xe0\x21\xaf\xfe\x02\x32\xa9\x7f\x12\xae\xab\x28\x93\x7d\xb1\xba\
+\xfb\x75\x1e\x80\xdf\x49\x02\xc1\x9e\xca\xf2\x1a\x41\x0f\x59\xae\
+\x05\xae\xa7\x98\x11\x60\x1e\x00\x43\x46\xbe\x65\x95\x00\xb1\x48\
+\x53\x05\x86\x24\x20\x78\xf6\x00\x76\x0d\xe0\xa8\x72\xc9\xb0\x62\
+\x10\x17\xda\x50\x1d\x09\xd3\xda\x06\x14\x48\xfd\xe7\x6e\x89\xef\
+\xe8\xe0\x8e\x36\xc1\xd7\x64\xbf\x74\xe7\x03\x63\x95\x27\xf0\xf6\
+\x08\xf4\xf5\x70\x8f\x0d\x00\x4f\x9b\x04\xd0\x2a\x7e\x3c\xe6\x74\
+\x4c\x02\x04\x41\xa0\x85\x1e\xfd\x75\xa7\x04\x6d\xc0\x65\x35\x06\
+\x7c\x42\x01\x6c\xf6\xf9\x3f\x6e\x28\x01\x0d\xb2\xff\xbe\x3f\x9f\
+\x46\x00\xaf\x24\x96\x53\x0b\x85\x70\x6f\x80\x54\x92\xf5\x09\xfe\
+\xb6\x19\x40\x9c\xb0\xbf\x0a\x3f\xa0\xce\xfb\x53\x47\x04\xab\x11\
+\xce\xa8\x0a\xb8\x3d\x6c\xa4\x04\x04\xfe\x6e\xd5\xa5\x43\x21\xda\
+\x93\x40\x1a\x58\x84\x4e\x11\xe0\x36\x65\x4d\x0d\xb4\x01\xa1\x9e\
+\x42\xf1\xac\x5f\xad\x87\x7c\xe4\x92\xf8\xaf\x2b\x3f\xd6\xe4\xd6\
+\x3e\xd4\xee\xbc\x5e\x81\xe5\x41\xd2\x01\x1d\x57\x0e\xf4\x52\x9f\
+\x86\xf2\x5e\x07\xd5\x5b\xef\xac\xf6\x56\x95\xc2\x7a\x85\xdd\x2d\
+\xaf\x6f\x83\x79\x00\x57\x00\xd3\x81\xd2\x77\xa5\x73\x27\x5f\x5e\
+\x9e\x84\x90\x8f\xf2\xf5\xc9\x7d\x04\x60\x2f\x7c\xbc\x32\x57\xd8\
+\xfc\xe3\x41\xa0\x1f\x96\x3c\xd1\x52\x81\xfd\x6f\x4f\x61\xf7\x03\
+\x03\x45\x60\x08\xfe\xf2\x1a\x89\xa0\x56\x6c\x9f\x13\xb2\x65\x65\
+\x60\x5d\x8f\x5c\x4c\x17\x2a\x84\x4a\x02\x45\x45\xd4\x0d\x2b\x81\
+\x18\xac\x91\x80\xa5\x51\x88\x18\xf2\x00\xd3\x76\x3e\xe1\xd4\x1f\
+\x4d\xde\x06\x84\x7a\x77\x1c\xdb\x7f\x71\xbc\x37\xee\x24\xa4\xdd\
+\x8a\xbd\x36\x1e\x24\x84\x67\xf8\xd8\x0a\xfc\x71\x78\xc7\xc2\xf5\
+\xba\x72\x8f\xaa\xbd\x02\xb8\x69\x55\xf5\x69\x35\xfc\x43\xe1\xda\
+\x40\x31\xc8\xe0\xef\x39\x0a\x91\xeb\x89\xd2\x33\x9d\x48\xf2\xb7\
+\xe6\x04\xa6\x10\x00\x6e\xc9\xfe\xf8\xda\x36\xa7\x01\xef\x3e\x1b\
+\xf0\x33\xaa\xf7\x2b\x88\xc6\xba\x0b\x0b\x3f\x1b\x0b\x59\x0f\x7c\
+\xf6\xec\x23\xc1\xb4\xb6\x03\x0e\x64\x01\x50\xe3\x37\x7d\x6a\xc4\
+\x50\x65\x3f\x51\x03\x3b\x66\x05\x09\x48\x00\x27\x12\x15\xda\x86\
+\x4e\x10\xa2\x83\xce\x82\xb6\xf1\x61\x58\x4b\xe0\xdd\x01\x9b\x63\
+\x5b\x90\xea\x1a\x00\x85\x73\xfe\x6c\x95\xf0\x1b\x48\x7c\x82\x94\
+\xfe\xcc\xd6\xf5\x06\x95\xdb\x0e\x57\x7a\x5a\x25\xf9\x79\x03\xd8\
+\x0c\x3f\xf3\x39\x00\x9a\x6f\x00\x1d\xf3\x00\x1a\x2c\xc8\xd1\x63\
+\x43\x40\x9b\x8f\x0f\xc8\x65\x72\xb8\xce\x41\xda\x3f\x21\xf8\x3b\
+\x88\xd2\x2f\xb3\x00\xf6\xc9\xff\xd6\x78\x61\x10\xce\xfb\xc7\x77\
+\xef\x00\xbf\x23\x0a\xb0\x0a\x09\x7a\xc9\x09\x58\x5d\x4a\x77\xc8\
+\xab\xb9\x52\x00\x7e\x21\x09\x2a\x1f\xf3\x41\x23\xa5\x3e\x07\xf0\
+\xe7\xd4\xa4\xa8\x29\x0c\x20\x69\x08\x0d\x25\x84\x85\x65\x75\x9b\
+\x6a\x0e\x11\x5a\xdb\x7c\x2b\x77\x93\x7d\xfd\xee\x41\x02\x33\x80\
+\x52\x87\x8c\x8f\x80\xdf\x02\xb8\x2d\xf8\x74\x1b\x54\xeb\x75\xe5\
+\x6f\x9f\x93\x4f\x81\xbb\xdf\x14\x2d\x10\x85\xf1\x60\xad\xbf\x6d\
+\x2c\xbb\x9d\x07\xbf\x23\x47\x4d\xe8\x2b\xa1\xf6\x1e\x32\x01\x7c\
+\x4c\xd0\x1a\x5c\x5b\x81\xdf\x3e\x03\xb8\xeb\x8f\x5b\x80\x1c\xaa\
+\x3f\xc1\x68\x7b\x67\x09\xa8\xfd\x32\x38\xf6\x3b\xa0\xbb\x02\x58\
+\x03\xbf\xb3\x06\x53\x78\x5d\xc9\xdd\x2b\x7a\x08\x1d\xb5\x0f\x1a\
+\x1b\x11\x50\xcb\x0b\xa4\x57\x0b\x95\x10\xa0\x73\x60\xa2\xab\x63\
+\xca\xd5\x34\x48\x7a\x5f\xb0\xab\xab\x41\xa1\x3e\xe0\xdb\x02\xb6\
+\x75\xa1\x5e\x4f\xa7\xb1\x6a\xf7\x15\xbf\x07\xae\x1e\x00\xb7\x6e\
+\x02\x7a\xf4\xba\xff\x3b\x72\xf8\x65\xe0\x13\xe5\xea\x11\xb8\x7c\
+\xd0\xb1\xe3\x6e\x75\x43\x09\xe4\x8d\x7b\x0f\x4d\x02\xfe\xde\x04\
+\x60\xcf\xfc\x0b\x5c\xf2\xa7\xe0\xcb\x46\x96\x01\x2b\x3c\x16\x81\
+\x34\x20\x05\xa3\x9e\x08\xca\x77\xdc\xb8\x00\x5c\x71\x40\xc9\x00\
+\x03\x5e\xed\xa9\x92\x81\x09\x10\x41\x82\xce\x84\x42\xf7\x20\x41\
+\xbb\x50\xfa\x69\x42\x97\x9b\x66\x99\xf2\x8c\xfb\xf4\x51\x5d\x92\
+\x43\x9b\x72\x7f\xaf\xb2\xdb\x06\x08\x2d\x00\x6d\xbb\x72\x1b\xac\
+\x55\xbc\x0d\x6a\x1d\xfc\x30\xf9\x81\x7b\xb7\xaa\xfc\x96\x96\xa4\
+\xa3\xd1\xf3\x2f\x0b\xb5\xbf\x53\x01\xf8\xff\xf9\x64\x7d\x41\xe0\
+\x3d\x72\xd8\x20\x85\x5a\x9d\xa9\x55\x70\x24\x01\x09\x1f\x77\x65\
+\x80\xd5\x9f\x0d\x82\xe0\x90\x2d\x10\xa8\x09\x04\xbf\x82\x22\x48\
+\x21\x7b\x10\xaa\xca\xa0\xae\x45\x50\x20\x05\x69\x5b\x8a\xb7\x09\
+\xbe\xb6\x8d\x17\x02\x1e\xbd\x7e\xac\xf6\xfd\x39\x53\xb6\x02\xf7\
+\x18\xd4\xfd\xfe\x41\x3d\xcc\x8e\x02\x56\x4f\x02\xfb\xcc\xc7\x5e\
+\x05\x89\x2b\x6d\x9f\x5c\x71\xa4\xe2\xeb\x8e\xcc\x8f\x72\x7f\xeb\
+\x63\xd3\xca\x0a\xfc\xbd\x04\x80\x36\x80\x36\x00\x3e\x04\xfc\x80\
+\xf8\x89\xb6\x2b\x7f\xa2\x00\x60\x07\x27\xe1\xc1\xb7\xdd\x46\x30\
+\x9d\xd7\xf0\xbf\x57\x83\x9a\x48\xb6\x7c\x69\x89\x5a\x6e\x80\xef\
+\x4d\xd0\x7d\x90\x16\x20\xd6\xa9\xc2\x84\x03\x42\xad\x36\x4b\x90\
+\xf6\x11\xdc\xb7\x83\x3e\x0c\xe2\xec\x09\x80\x1c\x7d\x2c\xdf\xf9\
+\xf9\xf7\xbe\xff\xde\xfd\xad\x5e\xd1\xd6\xfb\x56\x00\xbf\xa0\x17\
+\x81\xbc\xc0\x02\x19\x74\x44\x40\xbe\xa5\xde\xfa\xb5\x67\x00\x02\
+\x36\x58\x82\x06\xdf\xfa\x3b\x91\x58\xb6\xd4\xc7\xea\xf5\x42\x04\
+\x4a\x44\x9c\xf3\xe1\x23\xe8\xfe\xbc\x3f\x7c\xef\x0f\xfd\x8e\x87\
+\xde\xf1\xc8\x77\x3c\xa6\xc3\x8f\xbf\x98\x00\x72\xf1\x7b\xf1\x91\
+\xc3\x75\x0e\xd7\x83\xd7\x8c\x3f\xa8\xeb\xe0\xef\xca\x3b\x7f\x7f\
+\xb9\xe6\xd1\xbf\x33\xfa\x37\x77\xbe\x2e\xce\x3b\x5f\x57\x78\x5d\
+\xb6\x20\x17\x35\x92\x04\x3b\x03\x59\xbf\x4b\x50\x7c\xac\xb0\xb3\
+\x57\xe4\xf5\x41\x9c\xf1\x8d\x1f\xdf\xf7\x9f\x6f\x05\x70\xff\x9f\
+\x0d\xf0\x73\x00\x27\x6f\x91\xc0\xce\x83\x43\x1f\x97\x83\x9f\xe3\
+\xc8\xf2\xb8\xbb\xce\x3c\x00\xb3\x02\x78\xb5\xfe\x1b\x5c\x17\xe8\
+\x68\xff\x6f\x32\x80\x1d\xcf\x11\x60\x25\xe6\xb6\xaf\x00\x93\x91\
+\x08\x91\x70\x1b\x63\xe8\x00\x6f\x63\x4c\x1e\x7d\x0c\xc7\xee\xb7\
+\x08\xe2\x51\x77\xf0\x88\x03\x98\x4e\x3e\x2e\x77\x7e\x8e\x7e\x13\
+\xc0\xaf\x05\x7e\x9e\x6f\x54\xe6\x41\xc5\xdd\xad\xb2\x11\xa8\x03\
+\xb0\x77\xaf\xcb\xd7\xc0\xf8\xf9\xb6\xae\xd4\x1c\xfe\x7e\xc6\x8f\
+\x0d\x5e\x13\x02\xde\xda\x61\x24\x0a\xcb\x89\x49\x49\x18\x1c\x89\
+\xc0\xf8\x00\x10\x81\x18\x11\xf3\x58\x19\x0c\x22\x82\xee\xba\x7e\
+\x0e\x0f\x14\x06\x13\xb1\xc0\xdf\xa5\x0f\x06\xf9\x8f\xc4\x0a\x08\
+\xd4\x57\xfe\x79\xfb\x24\xa2\x39\xf2\x3e\xf9\x03\x08\x80\x1f\xfe\
+\x4c\x1e\xdc\xe6\xa0\x06\xb6\xaa\xf2\xa8\x4a\xe7\x55\x95\x5e\xbf\
+\x5e\x80\xcf\x94\x17\x60\xa2\x37\xc4\xbf\x8f\x6d\x05\x7c\xf6\x23\
+\xc5\x59\x37\x2b\x3c\x45\xb0\x6b\x86\x81\xa0\xe5\xef\x63\xca\x0b\
+\xf8\xa5\x11\x00\x33\x51\x9a\x96\x6e\x21\x8e\x17\x78\x14\x51\xc1\
+\xcb\xb7\x6d\x42\xa7\x20\x38\x84\x9b\x1b\x9d\x16\x46\x1b\xa2\x81\
+\x34\x22\x89\xdc\x4b\x0a\x0c\xfc\xbf\x57\x12\x8f\x82\xe9\x72\xf2\
+\x63\xbf\x60\x88\xf2\x77\x2b\x80\x95\xf4\x77\xb0\x33\x90\xc1\x1a\
+\xec\x0b\x78\xf3\xb6\xcc\xe7\xdc\x57\xfa\x0a\x58\x57\x1e\xfe\xda\
+\x9a\xaa\xe0\x32\x77\xcf\xf0\x6f\x31\xbe\xc6\x6a\x6f\x6b\xd0\x97\
+\x8f\x31\xeb\xaa\xe2\x73\xdd\x28\xc4\xbf\xfe\x22\xfd\x1d\xe8\x5c\
+\x6c\x00\x2f\x19\x61\xd2\x66\x09\x04\xbb\x8a\x48\x02\xa3\xcc\x00\
+\x08\xc2\xf3\x81\xfa\xde\x78\x0d\xa0\x5e\x8d\x0b\x24\xea\x0f\x2c\
+\x18\x00\x7a\x93\x1c\x06\xaf\x57\x79\xc1\x74\xc3\x02\x5c\x76\xee\
+\x3d\x02\xe2\xcb\x9d\xc4\x71\xeb\x63\xf9\x37\x24\x00\xfe\xe4\x7f\
+\xab\x7f\x2c\x20\x66\xce\xc4\x92\xc9\x38\x78\xfe\xee\x35\x96\x9c\
+\xe0\xaf\x3b\x89\x0e\x15\x79\x40\x04\x4c\xf3\x02\x4c\x3f\x67\x80\
+\xb5\xc8\x7f\x03\x40\xf7\x36\x80\xa9\x80\x79\x55\xe1\x73\x3d\x3b\
+\xa0\x97\xf8\x30\xfe\x8b\x72\x1f\xf6\x09\x24\x2e\xd2\x5f\xdb\xf0\
+\xa2\xd0\x42\x00\x2c\x8b\x15\x48\x61\x9a\xd8\x09\x80\xe1\xfd\xb5\
+\x49\x81\x60\xb6\x81\x52\xe0\x35\xf8\xa3\x2a\x60\x1e\x54\xfd\x54\
+\xee\x21\x51\x6c\x89\xb7\xad\xeb\x02\x0c\x9e\x76\xc8\x41\x98\x68\
+\x82\x07\x71\x79\x13\x8f\xa5\xc6\xe5\x20\x51\x8c\xee\xbd\x2a\x03\
+\xf8\x71\x82\x38\xe4\x09\x04\xc0\x2f\x03\xe6\x6b\x1e\xfd\xbf\x09\
+\xa5\x85\x83\x2e\x8c\x49\x3c\x07\xef\xcf\xbc\xe3\xcd\xf3\xca\x7f\
+\x37\x22\xb8\x86\x8f\x59\xf0\xf0\xf3\x40\xca\x6f\xc8\x7b\xfc\x38\
+\x4a\xfc\xb2\xee\x9f\x2c\x13\x9b\x2e\xe7\x1c\x1a\xaa\x96\xb9\x82\
+\x3f\xb9\xfc\x87\xf1\x04\x57\x01\x22\x44\x29\xb5\x25\x07\xc9\x06\
+\x44\x40\x83\x9c\x20\x56\x60\x1b\x13\x01\x71\x50\x00\x0e\xfc\xd4\
+\xcb\xff\xda\x56\x0d\x3f\x2e\xe6\xb1\x25\xe8\x9e\xf3\x46\xa5\x1f\
+\x5d\xeb\x0e\xc0\x27\x22\xba\x00\x39\x5c\x6e\x90\xc5\xad\xc7\x8f\
+\x9d\xbf\x2b\xdd\x20\x8f\x17\x75\x3d\xa6\xaf\x04\xe9\xd7\x10\xcf\
+\x20\xf8\xe3\xdc\x97\x18\x54\x01\xbc\x28\x05\xab\xc0\xe7\x01\xf0\
+\xf3\x0a\xf8\xd5\xe3\xb3\xf6\x92\x9d\x1c\xf0\x0a\x92\xbf\x8c\xd0\
+\xb0\x7f\x4e\x6e\x61\xa0\x3f\x17\xb0\xb3\x68\x9b\xf7\x47\x7f\x2f\
+\xfd\x6a\x35\x4e\xbe\x54\xa7\x7d\xad\xcc\xd6\xbc\x3f\xca\x7b\x20\
+\x00\x76\x12\x70\x2b\xa0\x6d\x8e\x28\x39\x09\x28\x7c\x9e\x05\x35\
+\xc0\x8d\x14\x64\x40\x06\x12\xad\x40\x02\x12\x00\xf9\x5f\x71\x93\
+\x82\x3a\xe0\x20\xca\x22\xb0\xf3\xf2\x77\xec\x12\x45\x86\xdf\xc1\
+\xad\x4a\x79\x39\x10\x0c\x5e\x6e\x54\xff\xcb\x89\x2e\xc0\x2d\xf2\
+\xf8\xb9\x43\x1e\xf1\x75\xbc\x97\x51\xd1\xf4\x54\xfd\xdb\x67\x00\
+\xb7\x48\x46\x56\xf7\xb8\x59\x00\x59\x00\xd5\x85\x7c\x3c\xc3\x0f\
+\x24\x04\x7e\x1c\x48\x60\x05\x7c\x50\x06\x5d\x75\x57\x40\x41\x7b\
+\xbd\x00\x1e\x7c\xfe\x0a\xf4\x99\xd8\x4f\x2d\xea\x42\xbd\xb2\xd6\
+\xbf\x2c\xf6\xa9\xef\xc1\xe5\xa5\xd6\x2b\x80\x9a\xfa\x63\xda\x0f\
+\xa0\x75\xb0\x8a\x2c\xcf\x93\xb4\xca\xdf\x59\x82\x51\x36\x60\xc1\
+\x16\x40\x26\x20\x5b\xca\x00\x5f\x17\x90\xaf\x0a\x2a\xad\xaf\xf1\
+\x87\xbe\xaa\xfe\xb9\xfc\x5d\xa3\xf7\xcf\x1b\x65\x2f\x05\xc0\x8c\
+\xaa\xfa\x96\x0a\xb8\x40\xf5\x3e\x92\x0d\xbc\x1d\x24\x8b\xe9\x64\
+\x57\xe4\x88\x45\x90\x2f\xce\x00\xf8\x45\xaa\xe2\xdc\x1f\xab\x21\
+\x1f\x93\x10\x33\x13\x33\x82\x7b\x0e\x15\x9f\x06\x3d\x75\x24\x81\
+\x66\x03\x6a\xf5\xde\x68\xc7\xb5\xca\x1f\x89\x60\x6e\x0b\x7f\x14\
+\xfe\x8d\x5a\xa6\x62\xb2\x6f\x05\xf0\xd6\x40\x5e\x83\x3e\xed\x80\
+\xef\xb2\xdf\x4a\xea\x5f\x5b\x7d\xa0\x00\x12\x58\x80\xc4\x3d\x09\
+\x24\x9f\x0f\xd0\xa6\x06\x7c\x07\xb5\x11\x01\x60\x50\xd8\x91\x40\
+\x08\x02\x57\xad\xc5\x42\x02\xa2\xfb\x55\x9f\x36\x48\x21\xbe\x07\
+\x7f\xe1\x2a\x31\x4c\x63\x55\xd0\x81\x9e\x02\x18\x47\x8a\x60\xab\
+\x7a\xbf\xdd\x20\x89\xa9\xec\x42\x7c\xab\xd2\x23\x68\xcf\x90\xc5\
+\x0b\x2d\x00\x4b\x59\xbc\xf6\xd9\xa0\xe5\x27\x28\x80\x61\xf8\xb7\
+\xf2\xf5\x04\xe6\x31\x80\x90\xa0\x37\xd5\x49\xfe\x5b\x1e\x1d\xab\
+\xff\x72\x5d\x13\xfa\x8e\x08\xac\xf3\xfc\x2c\xb6\xec\xee\x8b\xd5\
+\xbe\xee\xed\xd7\x7b\xfd\x2a\xf9\xd3\xce\xe4\x20\xcf\x0b\xb8\x15\
+\xc0\xaf\x3d\x60\xab\x05\xf0\x79\x00\xb7\x01\xd2\xc0\x9e\x34\x6c\
+\x35\x60\x8d\x1c\x3c\x54\x94\xc2\x89\x68\x0f\x04\x48\x40\x02\x09\
+\x54\x22\x70\x2e\x4d\x40\x0a\xa9\x57\x0a\xa4\xdb\xaa\xa0\x46\x33\
+\xd3\x09\x55\x90\x47\xad\x3f\x00\xec\x65\x43\x0d\xc4\xf7\xa0\x7f\
+\xb7\x3b\x15\x00\x5e\xeb\xc9\x5c\x21\xda\x83\x48\x3a\xc2\x5f\xd3\
+\x05\xe0\x27\xca\xf8\x33\x64\xc2\xbb\x7f\x3f\xc3\xce\xf7\x60\x03\
+\xbc\xe2\xd7\x32\x12\x49\x20\x03\x41\x6c\xf4\xe4\x07\x8f\x06\x78\
+\x48\xe9\x11\xf4\x32\x13\xab\x2d\x81\x5d\xe7\xeb\xad\x4b\xf4\x9b\
+\xc4\x6f\x5e\x9f\x7d\xe7\x1f\x38\x0d\xa8\xde\xeb\x86\x86\xac\x05\
+\x7c\x0e\xbc\x02\xec\x04\x92\xbd\x76\x02\x18\x86\x74\xa4\xa9\x86\
+\x91\x12\xc0\x6d\x07\x24\xf5\xcf\xa8\x02\x30\x0f\xe8\x80\x1f\x49\
+\x80\x1b\x89\x74\x01\x21\xe4\x13\x4c\x1b\x36\x61\x44\x0c\xb9\x75\
+\x00\x50\x19\x34\x45\xc0\xfb\xa0\x9f\x78\x5c\x79\x23\xd8\xd1\x2a\
+\x8c\xaa\xff\x65\x47\x01\x8c\xe4\xfa\x4d\x92\x78\x9e\x51\x9e\x9e\
+\x01\xf4\x67\x29\x02\x7e\xd1\xbf\xb7\x0e\x00\xa9\x10\x81\x10\xb3\
+\x2e\xc1\x1a\x63\x0e\x40\x7d\x7f\xde\x6d\x01\x8f\x24\xfa\x96\x0a\
+\xb0\x70\xdd\x40\x5f\xab\xb8\x5a\x78\xce\x45\xe2\xe7\x96\xe2\xc7\
+\x76\x9e\xe4\x12\xf4\xe5\xbe\xbf\x0f\xb2\xdf\x60\x32\x30\x41\x8f\
+\x5f\x64\xa3\xbf\xcf\x7d\x10\xd8\x59\x81\xd2\x15\xa8\x04\x60\xc1\
+\x0e\x84\x99\x81\x44\x83\x80\xd1\xc6\x44\xd0\xa9\x01\x00\x7c\x0d\
+\x24\xa7\x9e\x04\x86\x04\x50\xaa\xff\x4a\xe2\x07\xf0\x33\x17\xe1\
+\x05\x6d\xc1\xda\x02\xbc\xc0\x6f\xca\xca\x02\x6c\xa8\x81\xcb\x00\
+\xe0\x97\x02\xf2\xbd\xd0\x70\x65\x2f\xca\xe7\xe9\x03\x15\xff\x81\
+\xae\xc1\xc3\x5d\x80\xcf\x26\x8f\xc7\xb2\x05\x3f\xf3\x26\x97\xf5\
+\xef\x33\xb1\x30\xb1\x70\x00\x36\x06\x7d\x08\x6a\xde\x6e\xc9\xe1\
+\x10\x4e\xac\xfa\x0e\xfa\x6a\x03\xac\x0f\x0b\x57\x0a\x20\x43\x2f\
+\x3f\x97\xea\x8e\x47\x85\xcf\x70\xba\xec\x5a\xf6\x33\xf7\xa9\x7f\
+\x0a\xe1\x5f\x0a\x5e\x3d\x95\x2c\xac\x23\x01\x81\x8e\x00\x5a\x01\
+\x1b\xcc\x09\x44\x4b\xb0\x41\x02\xf5\xdf\x84\xe0\xb1\x2a\x00\x5d\
+\xd4\x03\xb6\x0c\x3b\x45\x32\x41\x46\x40\x03\xd5\x80\xf7\x46\xe0\
+\x47\x92\x70\xa1\x97\xe0\xb7\xea\x42\xb7\xd5\x00\x7e\x2c\xed\x81\
+\x7c\x43\x05\xec\x81\xfc\x6d\xa7\xe2\xef\x75\x10\xf0\x7f\x1c\xbf\
+\x61\x6f\xc7\xd0\xf4\x34\x05\x20\x2f\xc8\x03\x1e\xeb\xf7\xc7\xaf\
+\xcd\xea\xe1\x17\xed\x0c\xdc\x36\x3d\xd7\xa5\xfe\x35\x08\x1c\x11\
+\x03\x6d\x03\x1e\xc3\x3a\xbe\x96\xa4\x7f\x60\x03\x64\x06\x89\x9f\
+\xc1\x06\x38\xf8\x97\xfd\xea\xeb\x76\xdf\xe6\x24\x30\x97\x3d\x0c\
+\x9b\xcc\x67\x2a\x2a\x80\xd6\xad\x48\x4c\xfd\x19\xc2\x3f\x0e\xe0\
+\xc4\x94\x7e\x64\x03\x98\xc7\x79\x40\xda\xb2\x04\x0c\x2d\x43\x83\
+\xd6\x21\x07\x72\x88\x0a\x00\xaf\x6d\xf0\xf5\xe0\x6b\x1d\xa5\x32\
+\xce\x53\x00\x00\x20\x00\x49\x44\x41\x54\xab\x01\x04\xff\xee\xbd\
+\xb9\xbc\x88\xde\x7f\xe4\xf7\x2f\x50\x69\x0d\x64\xff\x65\x43\xea\
+\xd3\x00\x90\x9e\x01\x5c\x06\x2a\x43\x77\xda\x80\x02\x33\x04\x5b\
+\xc4\x32\xbf\x78\x12\xf0\x59\x0a\xe0\x19\xe4\x20\x77\xd8\x0a\xac\
+\xfe\xed\xf0\x6b\xe9\x5a\x81\x8b\xc4\xe7\xbe\xc5\x17\x00\x3f\x9e\
+\xc8\xe3\xb1\xfc\xef\x5a\x77\x0a\xbe\xde\x0a\xe0\x67\x38\x04\x24\
+\xf7\xfb\xfd\x19\x92\x41\x7f\xe0\x44\x4b\xfb\x5d\x01\x68\x90\xfd\
+\xcb\xc3\x41\x98\x34\x0c\xfe\x40\x8a\x8f\x19\x80\xab\x00\x7f\xe0\
+\x60\x90\x3f\x5c\xde\x77\x04\x60\xb0\x7e\x20\x97\xcf\xd7\x30\x2b\
+\xa0\xb0\xee\xc0\xed\x00\xf7\xdb\x1a\xc6\xee\x40\xbd\x9e\x20\x60\
+\xe4\x60\x11\xe0\xc7\x25\x1b\x36\x41\xb6\xec\x41\x04\x13\x71\x6f\
+\x09\x3a\x59\x1f\x40\x7f\x19\xc8\x7e\x81\x2f\x2e\x8d\x80\xbe\xa3\
+\x00\x7e\x6c\x28\x0c\x3d\x18\xb0\xfd\x84\xcf\x93\x73\x08\xbb\x5b\
+\x01\x3c\xb3\xe2\x9f\xe9\xe3\x1f\xf9\x3c\x09\xef\x5f\xf5\xff\xeb\
+\xa3\x10\x81\xf8\x48\x70\x94\xff\xb9\x93\xfe\xcc\xc5\x9b\x77\xa0\
+\xcf\xfd\xdc\xfd\xaa\x6f\x3f\x17\xf0\xcf\xfd\x6b\xb3\xd0\xcb\x9f\
+\x9b\xef\x2f\x47\x80\x73\x39\xd6\xab\xdf\x4a\x7a\xb4\x82\xd1\x3b\
+\x1b\xcb\xff\x83\x00\x88\xab\x8c\xd7\x50\xf9\xad\x07\x7f\x0d\x01\
+\x41\x09\xf8\x52\xe1\x2e\x10\x44\x02\xa0\xa5\x01\x51\xa7\x06\xa7\
+\xf5\x08\x71\x52\x08\x08\x69\xd0\x3e\x0c\x5d\x01\xe1\xb1\x32\xd8\
+\x54\x03\xda\x00\x5e\x9d\xdc\x96\xec\xcf\x2d\x03\xa8\x60\xa7\x8d\
+\x6a\xdf\x55\xee\x1b\xb3\x02\x17\xee\xe5\xfa\x65\x23\xf0\xfb\x31\
+\x50\x0b\xba\x01\x6a\xf4\xfa\x97\x41\xba\xaf\x83\x6f\xc6\x67\x2a\
+\x80\x57\x56\xfa\x33\x9f\x77\xfc\x7d\xb9\xab\xfc\x82\x8a\x40\x64\
+\x19\x08\xaa\x6d\xbb\xe5\xb7\x68\x99\xba\x1b\x05\x7e\xb9\xce\xe3\
+\xd7\xf7\xac\xc6\x72\x47\xa4\x60\xd5\xc3\x2f\x2a\xa0\x00\xba\x12\
+\x01\xee\x02\x5c\x42\xbd\x9a\xec\xa3\xec\xf7\x7b\x73\xbf\x10\x89\
+\x61\xda\x0f\x41\xac\x05\xc0\x1b\x0b\x7c\x6a\x30\x17\x27\x02\x0b\
+\xf8\x91\x04\x26\xcc\x12\x94\x48\xa6\x60\x05\x30\x1c\xa4\x41\xcb\
+\x31\xc3\xbf\x13\x06\x8b\xd8\xbf\xd6\x48\x04\xe1\x6b\xe9\x02\x43\
+\xcc\x05\xca\xd7\x33\x24\x8a\x60\x03\x6a\xd2\x99\x42\x55\x47\x25\
+\x80\xa3\xc0\x28\xeb\x57\xa0\xa4\x5e\x05\x8c\x42\x42\x57\x00\xab\
+\xd4\x7f\x03\xe4\xba\x33\x27\xc0\xd0\x2d\x70\x85\x91\x4e\x23\x8f\
+\xcf\x10\xc0\xa9\x59\x80\x47\x86\x7f\x04\x02\xcc\xa3\xff\xd6\x6d\
+\x35\x62\x7d\xeb\x8f\xa4\x2a\x02\x21\x25\x95\x85\x04\xfa\xaa\x0f\
+\xa0\x97\xdc\x4f\xe2\x75\xe1\xdf\xa0\xfd\x27\x70\xa4\x57\x47\x06\
+\x73\x3b\x05\xd8\xaf\xab\xf4\xf7\x54\x7f\x2e\xd5\xde\xda\x81\x9f\
+\x1e\xf2\x41\xf0\x57\x17\x17\xe1\x1e\x05\x9c\x57\xa9\xff\x84\x83\
+\x3f\x0a\x32\xde\xfa\xea\x8f\x16\x00\xe7\x01\x18\x94\x40\xb5\x02\
+\x53\xa9\xfc\xfe\x77\x65\xb0\x02\x39\xac\x1d\x40\xa5\x40\xbd\x95\
+\x58\x75\x22\x0c\xfe\x2d\x6f\x9a\xc0\x60\x92\xe8\x58\x0d\x44\x52\
+\x58\x49\x7f\x5e\x5b\x04\x22\x07\xa6\xf4\x00\x1f\xf9\xf9\x91\x35\
+\x20\xa8\xba\x23\x6b\x60\xe1\x1f\xae\x19\xc0\x80\x14\x36\x93\xfe\
+\xc1\x62\x22\xde\x90\x44\x77\x9a\xf4\xe9\x19\x01\xe0\x23\x01\xdd\
+\x39\x1f\xbf\x6d\x0b\xf6\x49\xc5\x21\xef\x04\xe0\xdd\x80\xb4\x1c\
+\x49\xc9\x9e\x03\x30\x99\x30\x8c\xdb\x6a\x20\x04\x2e\x3b\xea\x14\
+\x1b\x30\xa8\xf6\xdd\x4a\xbc\x7a\x68\xc7\xbc\x0c\xf8\xd4\x56\x9e\
+\xb5\x50\xcf\x66\x20\x83\xd8\xda\x0b\xf7\x62\xda\x5f\x8e\xee\xf2\
+\x09\x44\x81\xa2\x86\x95\xbf\xf6\xf1\xa5\x1c\x3e\x14\x87\x80\x40\
+\x05\xf0\x60\x5d\x80\x83\xd0\xbf\xf9\x93\x34\x59\x9f\x4a\xef\x3f\
+\x81\x2a\x48\xb9\x29\x80\x1a\x06\xa6\xd0\x26\xa4\xc1\x68\xb1\x05\
+\x65\x30\xf5\x44\x10\x15\x80\x44\x52\xd0\x5e\xfa\x0b\x6f\xbd\x0e\
+\x40\x67\xe9\xf3\x80\xaa\x04\x36\xee\x77\xb2\x7f\xa3\x4d\xf8\x06\
+\x5e\xfe\xb2\x93\x01\xfc\x18\x78\x7f\xdb\x58\x1f\x30\xb2\x04\x72\
+\xa3\xf5\xf8\x8c\x0c\xe0\x28\xb7\xc8\x1d\x64\x20\x4f\x94\xfa\x23\
+\x92\xf0\xd3\x6c\x62\xf8\x27\xe5\x14\xbc\x96\x03\x28\x49\x32\xca\
+\xdd\x38\xae\x12\x0b\x17\x89\x9f\xa1\x7f\xdf\x3f\x77\xbe\x9f\x51\
+\xf6\x5f\xc3\xd2\x5c\xc8\x02\x56\x07\x88\xce\x75\xb2\xaf\xf3\xfe\
+\xb8\x07\xc1\x68\x73\x92\xda\x8d\xb0\xb6\x78\xc7\x3d\x3a\x92\x00\
+\x84\x7f\x1c\xc0\x9f\xf0\x11\xf3\x2c\x04\x5e\x51\x00\xe4\x79\x40\
+\xee\xe7\x03\x04\x67\x04\x72\xbf\xa0\xa8\x0e\x1e\xa1\x72\xd8\x52\
+\x01\x06\x5d\x0b\x6d\x44\x80\x61\x60\x55\x06\x4e\x04\x65\xe2\x2f\
+\x06\x84\x92\x97\xcf\xc7\xd7\xf4\x26\x3d\x70\xb7\x94\x80\xdf\xb7\
+\x0d\x69\x8f\xb2\xff\xb2\x31\x0f\x30\x02\x7b\x54\x09\x1d\x20\x0e\
+\x5a\x82\x55\x28\x78\x9f\xf1\x9e\x9e\x59\xed\x5f\xe5\xe3\x71\xa3\
+\xdc\x63\x0b\x7e\x76\x16\x00\xd5\xca\x2f\xbd\x1a\x48\x42\x9a\x94\
+\x68\x2e\x91\x72\xe7\xeb\xb9\x03\x3d\x4b\x2e\xe3\xba\x38\xa8\x03\
+\x2b\xf3\xf4\x3a\x58\x97\x3f\x97\x65\xba\x0e\xf6\xb9\x4d\xef\xd5\
+\xd3\x80\x36\xf6\x1e\xac\xb2\xff\xda\x48\xa0\x12\xc0\x72\x3d\x71\
+\x3f\xc8\x23\x30\xf7\x9f\xb4\x5f\x84\x33\xca\x00\x70\x18\xa8\xb3\
+\x03\x12\xaa\x2f\x74\x05\xa6\x04\x9d\x05\xed\x09\x40\xa0\x33\x50\
+\xed\x40\x2e\x6a\x01\xc9\xc0\x60\x06\x01\x17\x1c\x5d\x80\xbc\xbc\
+\xe2\x5f\xfa\xd1\xe3\xd8\x11\xc0\x16\xa1\x0c\x6c\x82\x2b\x81\x25\
+\xe4\x93\xb5\x74\x27\xd9\xa9\xf6\xa3\x9c\x20\xbc\x1f\x09\x21\xae\
+\x0d\x18\x29\x80\xb7\x41\x1b\xd2\x36\x5a\x81\x6f\xc1\x12\x24\xbe\
+\xc3\x94\x3f\xc1\x02\x1c\x05\xde\x51\xf9\x7e\x6f\x85\x3f\xf2\xf7\
+\x36\xe2\x58\x2a\xfd\xf2\x9f\x92\x56\xe0\x4b\x51\x02\x46\xca\x4b\
+\x0e\x20\xe5\xec\xbc\x7e\x10\x08\x15\x00\x0f\x64\xff\x60\xd5\x9e\
+\x83\x5b\xfa\x03\x25\x59\x74\x39\xac\xc3\xda\x62\x9e\x6a\x05\xe0\
+\xfe\xa2\x02\x3c\xed\xb7\x3e\x00\x64\xdc\x46\x2c\x84\x7e\x90\xfa\
+\xfb\x73\x02\x05\x90\xe0\x04\xb2\x44\x1b\x3b\xe9\xc4\xdf\x41\x0c\
+\x02\x07\x5d\x81\xd1\xa8\x70\xfd\xf7\x12\xa8\x80\x14\xb6\x1c\x4b\
+\x21\x98\x8c\xbb\x14\x49\x58\xbf\xc0\x81\x10\x90\x08\xe0\xb9\x56\
+\xfc\xbc\x90\x46\x77\xed\x5e\xc6\xab\x3b\x56\xf8\xa8\x04\x6e\xa9\
+\x80\x08\xea\xcb\xce\xc7\xa2\x02\xb8\x70\x39\x8c\x21\x00\x7d\x34\
+\x3c\x34\x5a\x32\x4c\x7b\xde\xff\x78\x8c\x7f\x5a\x01\x7c\xc6\x5e\
+\x01\x72\x5a\xe2\x8f\x3f\x2e\xb0\x08\xc8\x81\x8e\x6b\x01\x84\x8c\
+\xa4\xbe\x5e\x2c\x80\x26\x21\xca\x1f\xad\xc7\x2f\x79\x19\xcd\x75\
+\xfd\x38\xaa\xfc\x9e\x07\x58\x18\xdb\x5d\xed\xca\x33\xaf\x77\xe9\
+\xa9\xfd\x7d\x2b\x24\x30\xd7\xc4\x7f\x91\xfd\x46\xfd\xd6\xe1\x3e\
+\xe9\xe7\x6d\x4b\x1d\xa6\xfe\xbe\xd3\x2f\x0b\xf4\xd5\x51\xfe\x0f\
+\x96\xf0\x26\xde\x9e\x07\x60\xac\xfe\x38\x26\x2c\x30\x01\xa8\xfd\
+\xa4\x60\xd2\xed\xc9\xc1\x44\x44\x69\xee\xb3\x80\x04\x36\xa0\xfe\
+\x9d\x17\x20\x01\x0e\x84\xa0\xe0\xed\x47\xca\x40\xd6\x36\xa0\x7a\
+\x9a\xea\xff\x79\x6d\x09\x44\x1a\x11\xf8\xbd\x37\x59\xcf\x0d\x30\
+\x13\xfd\x94\xbe\x93\x60\x1b\xfd\xfd\x51\x6b\x70\xcb\x12\x74\x03\
+\x40\x21\x38\xdc\xac\xfc\xa7\x90\xc9\xf7\x10\xc0\xaa\x13\x40\x4f\
+\x92\xf9\xf7\x4a\xfc\xd1\xe7\xc9\xe0\xfe\x22\xf9\x5b\xff\x5f\x28\
+\x2d\x55\xbf\x5a\x02\x59\x5e\xa7\xbc\x90\x80\xe4\x75\x6b\xcf\x72\
+\xb0\x01\x4a\x66\xdc\x57\x7c\x5c\xb4\x63\xbe\x1f\xdf\x0c\x83\x3b\
+\x4a\x94\x66\xa8\xf8\xf0\xc0\xcd\x43\xa9\x11\x01\xd3\x5c\xce\xb1\
+\xcf\xd0\xf6\x2b\xdd\x86\xac\xab\xa1\x1d\x1f\xfc\x71\xe0\xe3\x12\
+\x5e\x1e\x8c\xe8\x72\x98\x05\x48\x61\x98\xa6\x2e\x23\x0e\xd3\x81\
+\x52\x3e\x71\x35\x20\x44\xeb\x49\xc1\x2e\x1c\x84\xd9\x01\x49\xeb\
+\xe1\xa4\xee\xa1\x61\xff\x82\x01\x01\x08\x54\xfd\x15\x11\x84\x96\
+\xa0\x08\x82\x5f\x7a\x22\xb8\xc8\xc0\x02\xc8\x3a\x0f\x20\x59\x77\
+\x05\xfc\x7d\x18\xfe\x5d\x98\xc8\x64\x3d\x9e\x3b\x1a\x1e\xe2\x8d\
+\x4e\x43\x1e\x2d\x7c\x18\x55\x7e\xa2\x7b\x9b\xee\x0f\x67\x00\x74\
+\x47\xf5\x3e\xab\x06\x74\xf0\xf7\x8e\xfe\x9d\xb4\x41\x08\x0a\x33\
+\x00\xa9\x02\x5f\x2a\x11\x34\x3b\x60\xa4\x69\xb1\x02\x26\x1f\x4d\
+\xf2\x57\x89\x9f\x07\xf7\x76\xf6\xe0\xeb\x5e\xc3\x44\x5f\x52\x38\
+\x5c\xbb\xed\x0c\x5c\xc9\xa2\xa4\xfb\x5e\xf9\xbb\x1d\x84\x79\xae\
+\xf3\x0a\xee\xd9\xa7\x12\x86\x25\x90\xc9\x15\xf8\xd2\x2a\x7f\x1a\
+\xa4\xf0\x8c\xfb\x01\x94\x1f\xa6\x50\xaf\x00\xea\xde\x00\xd2\x2f\
+\x12\x12\x18\x13\xae\x09\xbf\xf6\x83\x42\x92\xc3\x6c\x40\x2e\x56\
+\x80\xa0\x7d\x18\x80\x9f\xc0\x06\x24\x3b\x48\x00\x48\x04\xd2\xa6\
+\x03\xab\x8a\xe0\xb2\xd4\xb6\x02\x39\xd8\x00\x1a\xc8\xfd\xcd\x70\
+\x70\xe7\x9e\x45\xc0\xcb\x18\xf4\x6f\x37\x56\x0a\x4a\xb0\x0b\xbb\
+\x95\xff\x9e\x9e\xda\x1d\x19\xc0\x5e\xdf\xfe\x11\x89\x2f\x3b\x12\
+\x5e\x0f\x92\xc2\xba\xea\x63\x95\x73\xb9\xaf\x25\xfc\xd3\x72\xad\
+\x40\x0a\xb6\x68\x81\x64\x24\x93\x91\x66\x86\x45\x39\xae\x06\x38\
+\x2c\xd4\xd1\xd6\xae\x2b\x63\xbb\x6d\x99\x2e\x66\x01\x57\xf0\xfd\
+\x51\xfe\x43\x28\x48\x56\x2a\x3e\xee\x20\x5c\xc8\x81\x97\xea\x8f\
+\x6b\x0f\x7c\xdc\x97\x14\xc0\x0a\xbe\x19\x81\xbf\xda\xea\x7b\x60\
+\x01\x08\x2c\x00\x03\xf0\x99\xd7\xb2\x9a\x81\x04\x04\x07\x84\x02\
+\xf0\x65\x82\xb6\xa0\xd5\x73\x49\x9b\x02\xc8\x3d\xf0\xd3\xa8\x25\
+\xb8\x41\x00\x8c\x7b\x10\x38\xe8\xfd\x39\x10\x01\x67\x22\xfa\x81\
+\x60\x87\x6b\x09\xa0\x7e\x03\x0b\xe0\x0c\x77\x91\xb6\x78\x88\xa1\
+\x45\xd8\x05\x80\x1b\xa1\xa0\x33\xe7\x5b\xc8\x07\xaa\x47\x09\xd5\
+\x7f\x94\x1f\x3c\x54\xf9\x69\x53\x05\x3c\x4c\x00\xfc\x60\x8a\xbf\
+\x07\xf2\x23\xef\x97\x8d\x7b\xfd\xf1\x7a\xcd\x02\x08\x29\xa5\xd2\
+\xff\x47\x52\x68\x61\x60\x21\x81\xa4\xa4\x16\x2a\xbe\x20\xb8\x73\
+\xbf\x06\x5f\xda\x7c\xfe\xfa\x1e\xf4\xfc\x21\x0f\x60\x73\x79\xef\
+\x4a\xe0\x0a\xb2\xff\xda\xa9\x00\xdf\x56\xdc\x17\x17\x4d\x31\xf8\
+\x83\x1d\x7f\x92\x2b\x02\xeb\x57\xf1\x39\xf0\x13\x8d\x5b\x81\xae\
+\x02\x24\x10\x41\x82\x76\x20\xb6\x05\x93\xc0\x82\x21\x81\x90\x0f\
+\x07\x7e\xca\xd7\x53\x49\xc1\x7a\x2b\x90\xa6\x6d\x15\x90\x20\x37\
+\x48\x23\x2b\x10\x02\xc2\x6e\x60\x09\x82\x3f\x61\x22\x4e\x08\x6a\
+\x69\x9e\x9e\xe1\x3e\x05\xef\xcf\x31\x0b\x88\x00\x07\x19\xf4\x06\
+\x4a\x40\x07\x76\x60\x92\x1e\xd4\x3f\xc3\x7d\xd9\xd9\x40\xf4\x29\
+\x0b\xed\x9f\x43\x00\x77\xed\x0e\x24\x27\xdf\xb3\xe5\xed\xd3\x00\
+\xe8\x7b\xef\x69\x33\x00\x1e\x02\x26\x52\xfa\x2f\x5c\x5b\x25\x02\
+\xbf\xd6\xa4\x03\x15\xa0\x21\x0b\xd8\x0b\xfb\xf2\x52\xd1\x53\x7f\
+\x2a\xd0\x22\xfb\xe7\xe6\xe5\xeb\x58\xef\x35\xc8\xfe\x6b\x49\xfb\
+\xaf\x83\x6d\xc5\xb4\x93\xe7\x09\x8a\x54\xad\x84\xda\xc2\x39\x57\
+\x00\x6c\xcb\x69\xe8\xb8\x8b\xaf\x8c\x1e\x30\x0c\x14\x87\xcd\x22\
+\x09\x74\x2b\x06\x51\x05\xf8\x24\xa1\x83\xde\x27\x07\x27\x00\xbd\
+\x3f\xcf\x8d\x00\x52\x54\x01\xba\x0e\x07\x2b\xd8\xad\x59\x1e\xd9\
+\x7a\x96\x50\xfd\x23\xe0\xfd\xfa\x12\xc0\xef\xe9\xe6\x34\xca\x02\
+\xa4\xbd\x1e\x81\xde\x83\xc1\x68\x09\x84\x97\xaf\x21\x85\x40\x50\
+\x36\xba\x07\xdd\xf4\xd5\x53\x1f\xfc\x72\x05\x70\x14\xf0\xb2\xe9\
+\xd9\xf7\x93\xfe\x78\x68\xee\xfe\xa1\xba\x5c\xea\x3d\xce\x00\xbc\
+\xd7\x30\x10\x09\x81\xe9\x7d\x21\x01\x49\x64\x9d\x0a\xb0\xa6\x02\
+\x8c\xcb\xa2\x1d\x6e\x6d\x3c\xf1\xc1\x1d\x0b\xab\xf6\x6c\x98\xf8\
+\xf7\x7b\xf5\xcf\x90\x07\x5c\x7b\xc2\x28\xa0\xb7\xb0\xe9\xa8\xe0\
+\x24\xaa\xf7\xf9\xb1\xf2\x0b\x0c\xd3\x20\xe8\x47\x1b\x78\x96\x3e\
+\xbc\x67\x01\x71\x4c\x1e\x83\xf3\x6e\x99\x70\x58\x2e\x5c\x55\x40\
+\x49\xed\xd3\xa5\x80\x3f\x3e\x03\xf8\x7d\x2e\x00\x6d\x40\x04\x7e\
+\x55\x01\x02\xf9\xc2\x28\x03\x10\xb0\x17\x97\x36\x1c\x24\x02\xd5\
+\x7f\x04\xfe\x29\x76\x05\x06\xc1\x60\x6c\x19\xe2\x6b\xdd\x03\xfd\
+\xc0\x12\xa4\x41\x88\x68\xb2\x9e\xf8\x4b\x9f\xb3\x1f\xf7\x43\x73\
+\x00\xcf\x96\xf8\xb7\x08\x61\xeb\xf5\xd8\xf7\xa3\x02\xf0\xc0\x4f\
+\x8b\xe0\x4f\x94\xc8\xc8\xc8\x48\x68\x22\x2d\xc0\x5f\xee\x7e\x90\
+\x90\x91\x4d\x46\x92\x8d\x4c\x4b\x20\x68\x1b\xd5\xdf\x43\x3d\xf4\
+\xfe\x9d\xec\x8f\xf7\x10\xec\xa8\x04\xae\x3d\x09\xf0\x5c\x6d\xc1\
+\xb2\x54\xf9\x5a\xd7\xf8\xa7\x28\xf9\x71\xc5\x9f\x34\xd0\x70\xd8\
+\xc8\x43\xa8\xa9\x80\xc9\xc6\xd5\x5f\xa2\x15\x40\x0b\x00\x76\xb6\
+\x7b\x0e\x85\x33\xa5\x60\x03\xf0\xd9\x20\x34\x9c\x82\x0d\x08\x6a\
+\x40\x46\xe0\x37\x5a\xed\x71\x58\xaf\xa7\xd0\x2e\xbc\x10\x89\x32\
+\x78\xff\x22\xfd\x69\x44\x04\xb2\xee\x10\xc8\x20\x18\x7c\x0b\xb3\
+\x03\x3f\x63\xc8\x27\xdb\xe0\x8e\x8a\x01\x03\x41\xff\x7a\x34\x7a\
+\x7d\x79\x19\xf8\x9f\x4a\x00\xb7\xc0\x2f\x07\xdb\x77\xb7\x5e\xcb\
+\x86\x82\xd8\x53\x00\x8b\xb4\xcf\x40\x02\xb9\x54\xfc\x56\xfd\x1d\
+\xf8\xf5\x3d\x2c\x8b\x0d\x98\xfd\x90\x0d\x9f\xf6\xb3\xb0\x03\x2f\
+\xb7\x45\x3b\x30\xdc\xd3\xf2\x00\x0b\xab\xf9\xca\x44\x9f\xe9\xc0\
+\xfb\x5f\x4b\xda\x7f\x1d\x1c\xf2\x09\x27\xfa\x40\x9b\x0d\x53\x7f\
+\x7c\xae\x92\x3f\xf8\x6b\xa6\xc1\x14\x20\x85\x29\x40\xea\xd3\x7f\
+\xde\x20\x81\x69\x60\x03\xba\x65\xc3\x09\xf6\x20\xa4\xde\x02\xd4\
+\x3c\x60\x6a\xdd\x80\x3a\xf2\x7b\x05\x05\x20\x21\x40\xc4\x3c\xc0\
+\x2b\x7f\x0e\xd7\xf0\x4c\x5a\x40\xeb\xc1\x1f\x12\x00\x8d\x54\x40\
+\x20\x02\x07\xfb\x5b\xf9\x5c\x0b\xa1\x21\x66\x01\x68\x19\x52\x20\
+\x90\x8b\xf4\xfb\xf3\x23\x71\x28\x28\x86\xcb\x59\x84\x7d\x3e\x01\
+\x74\x39\xc0\x56\x85\x4f\x07\x7a\xf4\x72\x38\xc4\xdb\xff\x78\x0a\
+\x76\xa0\xbf\x36\x68\xf7\x35\x12\xb0\x12\x06\x3a\xf0\x5b\x10\x98\
+\x6b\x16\x60\x93\x51\xba\x10\x99\x72\x9b\xcd\xaf\x2b\xf7\x6c\x2d\
+\xfb\x93\x41\x6b\xcf\xfb\xfa\x73\xab\xf6\xd0\xf3\x5f\xcb\xfe\x2b\
+\xe4\x04\x3a\xd8\x79\x38\x6c\xd4\x51\xbe\x19\x75\xde\x1f\x07\x7f\
+\xb4\xf7\xfd\xbe\x15\x57\xb2\x1d\xf0\x23\xf0\xa1\x0d\xe8\xe3\xe9\
+\x04\xff\x1e\xe6\x01\x5d\x26\x10\xf3\x00\x9f\xfb\x9f\x61\x56\xc0\
+\x55\xc9\xa5\x55\x7c\x41\x42\x50\xd8\x83\xd0\x06\x03\x44\xda\xe7\
+\x01\x09\x86\x85\x92\xf4\xa3\xca\x4b\xdf\x3f\xf5\x60\xa7\x40\x08\
+\x1d\x11\x6c\xa9\x80\x40\x04\x18\x1a\x46\xe0\x4b\x98\x1b\xc0\x6c\
+\xe0\x7f\x1b\x58\x04\x91\xa6\x0c\x86\xa5\xef\xa9\x24\xc0\x4f\x1f\
+\x05\xd6\x13\x52\xfe\x48\x3b\x70\x04\xfe\x91\x0a\x18\x83\x7d\xf4\
+\x9e\x56\xf1\x17\xd9\xdf\x72\x00\xa9\xf6\x40\x0b\x29\x18\xa8\x00\
+\x23\xa3\x44\x36\x5d\x49\xb2\x51\xf6\x6a\x2f\x73\xa9\xfa\x73\x08\
+\xfd\xbc\x0d\x98\x83\xec\xcf\x20\xfb\xf1\x81\xb3\xfd\x78\x74\xb8\
+\x6f\x51\x86\xbb\x0e\xe7\x75\xe8\xe7\x19\x11\x58\x00\xb6\xb6\xfc\
+\x17\x15\x00\x5b\x39\x16\xae\x80\x6a\x1a\x01\xbf\xfc\x7c\xb1\xfa\
+\x0b\xed\x2b\x00\x02\x0b\x40\xa1\x2b\x90\x70\xc5\x20\x1e\x43\x86\
+\x64\xc0\x60\x51\x46\x81\xa0\x86\xeb\xd0\x05\x48\x5b\x9d\x80\x42\
+\x0a\xab\x4a\xef\xcc\xf4\x16\x08\xe1\x96\x1d\xa0\x01\x11\xa4\x40\
+\x04\x29\xa8\x86\xad\x6c\x20\x4e\x19\xda\x56\xd8\xf7\x0c\x12\x90\
+\xe7\x2b\x00\xba\xe1\xc5\xf7\x7c\xbc\x1c\xa8\xea\x72\x53\xd2\x8f\
+\xed\xc4\xd6\x7b\xb0\xe2\x2f\xb2\x5f\x2b\xc8\x8d\xde\x29\x91\x92\
+\x01\xe0\x97\x2c\xc0\x0a\x1d\x18\x59\xe9\x08\x98\x2a\xa9\x1f\xb1\
+\xdd\x2d\xd3\x1d\x05\x7d\xb9\xdb\xb2\x6b\xb8\x77\x1f\x5d\x9b\x12\
+\xe0\x2b\x75\x07\x8b\xfa\x9e\x83\xa4\x64\x00\x7e\xe6\xbe\xdf\x3f\
+\x81\x05\xa8\x55\x3f\x80\x5f\x76\x36\x01\x19\x2e\x06\x82\x0d\x42\
+\x57\xc0\x87\x6b\x54\x03\x8e\x2b\xbf\x26\x1c\x13\x2e\x0a\xc0\xd7\
+\x1f\xb8\x0d\x70\xd0\x0b\x0c\x03\x39\x09\xc8\x46\xf5\xaf\xd3\x85\
+\x12\xce\x29\x10\xd8\x8b\xe0\xe2\x36\x08\x42\xbf\x48\x00\x35\xfd\
+\x1f\xd8\x01\xec\x08\x74\xd3\x81\x00\xfe\x1f\x00\xe8\x34\xb0\x02\
+\x08\x7c\x9c\x05\x98\x06\x33\x00\x6f\x7b\x95\xff\xd9\x24\xf0\xa4\
+\xfd\x00\x64\xa3\x1d\x18\x41\x9d\xa0\xde\x1d\x7d\xcf\x56\x35\x3f\
+\x42\x0a\xf1\x5e\x2a\x53\x80\x98\xf6\xa7\x02\x7c\x01\xe0\x2f\x80\
+\x77\x05\xb0\xd8\x82\x44\x13\x19\x7d\x90\xd1\x44\x32\x7d\x90\x69\
+\x22\xd3\xeb\x02\xe2\x64\x75\x95\x5e\xb3\x02\xb9\x2e\xda\x69\x4b\
+\x77\x15\x56\xf3\xe1\xf4\xdf\x47\x37\xfa\xbb\xbc\x3f\x1e\x2f\x56\
+\x36\x2c\xcd\x7d\xcb\x8f\xe0\x97\x9f\xf0\xb5\xb4\x9d\xc7\x93\xf5\
+\xe7\x8e\x4c\x3b\xbb\xf4\x4a\x58\x0b\x40\x48\x02\xe5\xf5\x08\xf8\
+\x09\x3a\x02\x09\x7e\x20\x0c\x45\xb1\x2a\x01\xe9\xf7\x02\x48\x48\
+\x08\x21\xfc\x13\x54\x02\xba\x7e\x8e\x93\x80\x49\xc3\x89\x47\x52\
+\x82\xbf\x09\xe4\xc8\x45\x16\x2b\x30\x0d\x88\x60\x0a\xca\xc0\x60\
+\x46\xc0\xc1\xff\x36\x52\x01\x40\x18\xfe\xda\x01\xfe\x06\x21\xdf\
+\x05\x15\x40\x90\xfc\x7c\x04\xf4\x47\x89\xe1\x88\x1d\xa0\xe7\x29\
+\x80\x23\x5f\xa2\x1e\x08\xf5\xf6\x00\x7d\x04\xec\xb7\x48\x00\xab\
+\xbf\x03\xbf\xa9\x02\x83\x8f\x4f\xad\x03\xd0\xa9\x00\xa5\x24\x44\
+\x36\x19\x99\xba\x15\x28\x55\x3f\x71\x1b\xd5\xf5\x3e\xbe\xe1\x36\
+\xde\xb9\x0b\xff\x16\xb0\x7f\xf4\xe4\x50\xaa\xbf\x1f\x51\x66\x78\
+\xfa\x50\xa9\xfe\x5d\xe8\x57\xbe\x29\x31\xf9\x67\xed\x13\x76\x71\
+\xff\x6f\xfd\x11\x5c\xd3\xc6\x7e\x80\x29\x2c\x08\xc2\x61\x20\xe2\
+\xbe\x23\x40\x30\x1a\x8c\x2d\xc2\xa9\x00\x9e\x06\x56\xa0\x7a\xfa\
+\xdc\xaf\x4e\x5c\x59\x01\xb4\x03\x03\x02\x40\x05\xd0\xa9\x80\x4b\
+\xc9\x0e\x98\xda\x6f\xc1\x5b\xda\xae\xfe\x58\xe5\x23\x11\xc4\x5c\
+\x00\x5b\x81\x48\x04\x31\x07\x70\x02\x41\x05\x10\x03\xbe\x0b\x13\
+\x29\xf8\xa6\x43\x11\xf8\x51\x62\xd8\x55\x0d\xfc\xd4\x1d\x81\xce\
+\xf6\xed\xcf\x84\x7a\x23\xab\x80\x4a\x61\xf4\x1e\xdb\xb8\xb7\xae\
+\xf8\x5a\xe6\x02\x1c\xf0\x5e\xf1\xb5\x02\xdf\xca\xbd\xa9\xaa\x00\
+\xa3\x34\x11\x99\x2e\x6d\x41\xb5\x8f\x5e\xe6\x77\x3b\xf8\x84\x2d\
+\xbb\xd1\xe3\xd3\x07\x2c\xe9\xcd\x61\x3f\x3f\x97\xfd\x6d\x73\x52\
+\x04\x1c\xc7\xe1\x1f\xec\xf9\x87\x2d\xbf\xab\x0a\x08\xbb\xee\x4c\
+\x3b\x01\xa0\x6c\x8c\x04\xa7\x30\x0f\xd0\x55\x7f\x57\x20\xe5\x3e\
+\x85\xca\x9f\x30\x10\xb4\xbe\xfa\x77\x04\x20\x61\x09\xb1\xdb\x83\
+\x39\xd8\x80\x81\x02\x88\x2a\x80\x15\x2a\xfe\x25\x10\x81\x5f\x4f\
+\x83\x96\xe0\x2a\x08\x04\x45\xb0\x45\x04\x69\x2b\x10\x04\xa2\xf8\
+\x31\x50\x00\x72\x74\x28\xfe\x5e\x4b\x20\xaf\x55\x00\xb4\x91\xf4\
+\xcb\x4e\x42\xff\x68\xa8\xa7\x1b\x12\xdf\x76\xee\x59\x51\x00\x31\
+\x07\x58\x80\xbf\xf6\xfe\xfd\xc7\x5a\x28\xe8\x84\x90\x2e\xcb\xb6\
+\xdd\xa6\xbe\x6d\x57\x23\x00\x2e\xef\xef\x37\xf1\x40\x12\xf8\x08\
+\xad\x40\x38\x72\x1c\x4f\x15\xa6\x4c\xec\xf6\x32\x80\x9e\xa0\xe5\
+\x87\x23\xbf\x1c\xe4\x3f\xaa\x00\x0e\x7d\x7f\x1e\xd8\x80\x6e\x0c\
+\x98\x9a\xf4\xef\xe6\x02\xe0\xf7\x88\x81\x08\x12\xfc\xbe\x39\x6e\
+\x12\xaa\x5b\xdc\x41\x68\x1e\x54\x7f\x5c\xf4\x13\x86\x7f\x3a\x25\
+\x80\x2a\x40\xfa\x4d\x48\x6b\xeb\x4f\x79\x91\x1b\x53\x6a\x5f\xc0\
+\x65\x50\xf5\x47\xa1\xa0\x45\x0b\x10\x54\x82\x6d\xe4\x02\x23\x22\
+\xc0\x40\xd0\xc2\xc0\xc4\x66\x99\xe3\x3b\x5f\x1f\x25\x81\x27\xef\
+\x09\x58\x7e\xf7\xec\xcc\xc0\x8e\x0e\x7c\xff\x99\x50\x6f\x44\x14\
+\x23\x15\xd0\xbf\x27\x91\xd0\x7f\x9d\x05\xb0\xb2\x1a\xc0\x6a\xfa\
+\xaf\xb5\x43\xb0\x7c\x8c\x8a\x11\xd0\xf2\x0d\x2a\x81\x20\x27\xb2\
+\xcb\x95\x92\x11\xe5\x0f\xee\x01\x4c\x90\x07\xc4\xfb\x55\xf6\xe7\
+\x2e\xec\x5b\xd6\xf5\x73\x7f\xe4\x58\xf9\x38\x8e\x80\x4f\x61\xf0\
+\x87\x41\x01\xd4\x30\xd0\x82\x0a\x80\x10\x70\xba\x15\x00\x0e\xe6\
+\x00\x12\xac\x21\x49\xbc\x1e\x0a\x22\x20\xa4\x89\x1b\xf0\x09\x7e\
+\xcf\xd1\x06\x4c\xb2\x71\x36\x01\x9c\x55\x28\xda\x0f\x01\x55\x3b\
+\x70\xed\xe7\x00\x56\x0a\x20\x11\x25\x29\xbf\x59\x08\x7c\x24\x83\
+\x29\xa8\x82\x4b\xda\x26\x84\x15\xc8\x83\xf7\x47\x82\x98\xf8\x76\
+\x67\x20\xc9\x8d\xd1\xb5\x2d\xa0\x9f\x55\x07\x9b\xef\xe1\x97\x6d\
+\x0a\x2a\x3b\xe0\x3e\xe2\xed\x6f\x91\x82\xdc\x90\xfd\x23\x15\x20\
+\xdd\x7b\x7c\xf2\xef\x1d\x2a\xbe\xdf\x5b\x42\xbe\x45\xe6\x7b\x20\
+\xe8\x84\xd0\xee\xa7\x62\x03\x88\x88\x4c\xac\xe4\x01\x5a\xf2\x00\
+\xdc\xbb\xcf\x5a\xa0\x57\x01\xff\x31\xae\xf8\xb0\xaf\xdf\x52\xf1\
+\xdb\xeb\x14\xc1\x26\x6d\x2e\x68\x1a\xec\xf8\x53\x37\xfd\x80\xad\
+\xbf\x26\xeb\x83\xb6\xcd\xad\xc0\x06\x67\x03\xc8\x20\x03\xe0\x60\
+\x09\x46\x0a\x80\xa0\x1d\x58\x1f\xa0\x06\x62\xf5\x97\x19\x08\x60\
+\x30\xfe\x9b\xf0\xbc\x81\x2b\xa8\x00\xee\x97\x17\x8b\x86\x96\x9f\
+\xa4\x06\x70\x1a\x58\x82\x69\x10\x0e\xd2\xa0\x33\x60\x50\xdd\xd1\
+\xfb\x77\x60\x87\xbf\x73\x44\x04\x26\x27\xc1\xfe\x88\x3a\xd8\x23\
+\x8a\x17\x10\x80\xec\x0c\x05\x9d\x0d\xf5\xee\x91\xf8\x47\x54\x40\
+\xab\xf2\x89\x84\xde\x83\x12\x50\x98\x04\x7c\xaf\xa0\x77\x92\x48\
+\x50\xfd\x97\x2c\xe1\xba\xdc\x9b\xca\x09\x3e\x64\x94\xbb\xbd\xfb\
+\x62\x17\xe0\x3d\x28\x81\xbc\x3a\xc1\xa7\x6d\xec\xd9\xbe\x91\xab\
+\x7d\xf6\x75\xed\xfd\x57\xcf\xd6\x7b\x6d\x89\x1b\x80\x86\x3d\x00\
+\xb6\x06\x81\x52\xdc\x19\x08\x3b\x02\xe1\xd1\x11\x41\x79\x9e\xa0\
+\xfa\x8f\xfe\x91\x49\xda\xa4\x9f\xc4\xe3\xc6\x22\x01\xe0\x56\x63\
+\xae\x04\xa2\x05\x48\x44\x4c\xa9\x00\xb9\x3c\x63\x45\x67\x20\x83\
+\x09\xee\x4d\x1b\xb6\x60\x24\xfb\x57\x55\x1f\xa6\x02\x53\xb0\x03\
+\x48\x04\x55\x0e\x6d\x81\xfa\x1e\x52\xb8\x47\x0d\xbc\x78\x5b\xf0\
+\x2d\x15\x70\x36\xd4\x3b\x2a\xf1\xf7\x54\x80\x85\xec\xc1\x60\x00\
+\x28\x95\xb5\x00\xed\x9e\x2b\x03\xab\x92\x3f\x91\x11\x41\xf5\x5f\
+\x02\xc2\xa5\xfa\x2b\xd8\x04\xbb\x2c\x6b\xfc\x97\xf9\x00\xdf\xad\
+\x87\x0a\x11\xcc\xc4\xf4\x3e\x90\xfd\x78\x14\xb9\x6f\xf1\x35\x77\
+\x27\x10\xa7\xc1\x32\xf0\x7a\x78\x8d\xf4\xa3\xb0\xdd\x73\x90\xfd\
+\xdd\x35\x0d\x54\x00\x85\xb3\x01\x78\xbc\x26\x20\x6e\x0e\x32\xb2\
+\x01\x51\x01\x10\x90\x01\xaa\x81\x09\xdb\x82\xf1\x54\xe1\x0d\x02\
+\xe8\x76\x1a\x2e\x24\xd0\x6d\x09\x66\xa1\xed\x80\x2a\x60\x95\x05\
+\x94\x7b\x34\xa8\xfe\x6f\xa9\xf7\xf9\x06\xf7\x62\x20\x78\x19\x5c\
+\x77\x72\x5f\x42\x8b\xef\x0c\xf8\x1f\x21\x05\x39\x9c\xfe\x3f\x85\
+\x00\x68\xa7\xb5\x37\xee\xc9\xdf\xae\xfe\x23\x70\xeb\xcd\xa0\x6f\
+\x4d\x12\x06\x0a\xc0\x6a\x08\xb8\xa8\x00\xeb\xae\xd7\x56\x60\xe9\
+\x00\x58\xa9\xfe\x05\xf0\x74\x2d\xf7\xe0\xcf\xc5\x2f\x94\x74\x6e\
+\x0a\x80\xe8\xbd\x25\xfa\x75\x2b\xaf\xb6\x9d\x37\x97\xe7\x5e\x0d\
+\xcc\x2b\xe9\x1f\x25\x37\xe9\x86\x02\xb0\x70\x0a\x39\x54\x7e\x3e\
+\x32\x04\x14\x2b\xff\xa0\xfa\xa7\x11\x11\x48\xff\xf5\x4d\x70\x8f\
+\x82\x12\xe0\x10\x08\xa6\xb8\xdc\x77\x03\xf8\x1d\x01\xf8\x06\x23\
+\xf5\x63\xe5\x2b\x67\x78\x44\x15\x80\x64\x80\xf7\xdc\x12\xd8\xc6\
+\x50\xd0\xa8\x2d\xe8\x44\xa0\x03\x45\x30\x8d\x2a\xfd\x48\x6b\xf1\
+\x13\xaf\x8f\x12\xc1\x0b\x09\xa0\x4c\x5b\xdb\xad\x50\x8f\x77\xd6\
+\x01\xdc\x92\xf8\x72\x00\xf0\x09\x36\xd7\xf2\xfb\x53\x11\xe9\x38\
+\x07\xb0\xb4\xf6\xde\xa1\xe5\x67\xd5\x0a\x78\xa5\x6f\xa2\xff\x0a\
+\x90\x37\xf8\x96\x95\x9d\x7a\xd9\x88\x2e\xd6\x48\xa0\x7a\xff\xf6\
+\x8d\x67\xa2\x65\x43\x51\x37\xd2\x10\xae\xb1\x9f\x3b\x19\x2a\x7d\
+\xdc\x91\xb7\x4e\x0a\x73\x7f\x7c\x36\xca\x7f\x09\x9b\x7f\x46\xf9\
+\xcf\x3b\xe0\x37\x7c\x70\x7f\x7d\x78\x53\x47\xde\xfe\xbd\xe7\xc1\
+\x0f\xbc\xcb\x03\xf4\x18\x01\xf4\xfb\x0c\x4a\x0f\x7c\x4e\x8d\x0c\
+\x2e\x70\xed\xc0\xef\x82\xc0\xd4\xfb\xfc\x37\xb4\x08\x45\x15\xa0\
+\xec\xf7\x7b\x0e\xf2\x1f\x21\xfd\xbf\xd9\x58\x3d\x4a\x04\x7c\xe0\
+\xfa\x6c\x68\x48\x2f\x27\x80\xc3\x49\xbf\x1c\x90\xf3\xe7\x25\xfe\
+\xf6\xfb\x70\x0e\x60\xdc\xdf\x5f\xaa\xff\x96\xe4\xc7\xb6\xa1\x55\
+\x35\xa0\x75\x66\x60\xe9\x0c\x14\x12\xb0\x89\x88\xfe\x23\xa5\x20\
+\xed\x3b\xd9\x1f\x2c\x01\xcf\x4b\x27\x20\xcf\x9b\x55\xdf\x37\xf9\
+\xec\x86\x5f\xa4\x6f\x89\xc5\x54\x7d\x75\x4d\xfd\x7e\x80\x78\x10\
+\x08\xd1\x78\x22\x30\xc1\x48\x70\x77\xdc\xd8\x8e\x42\xf1\xeb\x49\
+\x42\x36\x10\xae\x27\xe9\x8f\x1b\xaf\x1b\x7c\xe0\xb3\xc2\x73\x18\
+\x54\x12\x2e\x29\x3e\xa7\x5e\xfe\x53\xb0\x01\x08\x7c\x54\x01\x5b\
+\x96\x80\x12\xcc\x02\x04\x22\x70\x99\x8f\x56\x80\x8f\x80\xff\x0c\
+\x11\x3c\x6a\x05\x56\xef\xe3\x97\x13\x00\x35\x41\x65\x67\x24\xfe\
+\xc8\x1a\xdc\x27\xf1\xd7\xef\x4b\x40\x00\xb2\xea\xfd\x67\x00\xb1\
+\x02\xa8\xa3\xe4\xff\xa8\xf7\x9a\x02\x98\xc0\xeb\xc3\xc7\x38\x11\
+\xbd\xb5\xfd\xfb\x74\xc6\xc3\x3d\x7c\x63\xcf\x65\x33\x4f\xa3\xb9\
+\xf9\x7f\x90\xfe\x53\x5e\x03\xdd\xc1\xef\x5d\x80\xae\xfd\x17\x14\
+\xc0\xc8\xfb\x47\x0b\xc0\x83\xf4\x9f\x2c\x48\x7f\x5a\x77\x01\x64\
+\x30\x18\xb4\x05\xfe\x08\xf6\xbd\xdf\xef\x94\xd6\xd5\x5f\xc2\x4e\
+\xc2\xb8\xbd\xb8\x60\xe5\xa7\xd4\x80\x1a\x15\x00\x0d\x54\x00\x4b\
+\x5f\xe5\x47\x2a\x20\x86\x7e\x16\xe5\x7f\x6a\xc3\x3c\xf4\xc8\x83\
+\x6f\xa8\x80\x67\xe5\x03\x44\x9f\x42\x00\x67\xc7\x75\xcf\x48\x7c\
+\xdd\x78\xbd\xa7\x0c\x7a\x55\xe0\x92\x3f\x75\x2a\xc0\x97\x02\x13\
+\x7c\xdc\xd5\x01\xd5\xfd\xf8\xda\xb5\x51\x6a\xd2\xbf\xcb\x02\x52\
+\x59\xbf\x6f\x25\x13\x28\x24\x90\xfb\xbd\xfc\xd7\x93\x7e\x4e\x04\
+\xf0\x73\x43\xa9\x8f\xb3\xf6\x51\x05\xc0\x31\xdd\x34\x08\x00\x47\
+\x67\x00\xf0\x46\x06\x40\xb4\xbf\x20\x68\x45\x04\x3b\x41\xa0\x0d\
+\x6c\xc0\x4a\x09\x84\x87\x2f\xde\x89\xe0\x8f\x44\x90\x3c\xf0\x63\
+\xa8\xfc\x0e\xf4\x11\x01\x78\xd5\xa7\x40\x08\x0e\x7c\xdb\x50\x01\
+\x91\x0c\x2e\xa9\x55\x7f\x3a\x52\xf5\xf9\x40\x0e\xf0\xa8\x0a\x38\
+\x44\x0a\xfc\x69\x04\x40\x07\x7a\xf9\xa3\x50\xef\x78\x2f\x7f\xec\
+\x59\x65\xe7\xef\x69\x2a\xc0\x87\x7c\x72\x25\x01\x07\x7d\x82\x85\
+\x3f\x54\x76\xe4\xc1\xe1\xa0\xb6\x26\x70\x19\x1c\x9e\xe1\xf5\x48\
+\x11\x30\x90\x00\xcf\x46\xd9\xab\x7d\xad\xfa\xcb\x7b\xb1\xe5\x37\
+\xb9\x6c\x06\x50\x4d\x31\xf8\xe3\x71\xdb\x8f\x65\xbd\x6c\xd6\x06\
+\x23\xc0\xbc\x13\x00\xd2\xc6\x30\x90\x8c\x82\x40\x3f\xbb\x92\xdb\
+\x63\x92\x0d\x35\x80\x23\xc2\x3b\x38\x98\xe0\x34\x60\x3c\xd6\x0c\
+\x4f\x1a\x12\x2d\xad\x3e\x0a\x04\x80\xd5\x9e\x53\x2f\xfb\x29\xf5\
+\x56\x20\x5e\x73\xb0\x04\x53\xb8\x37\x49\xff\x71\xda\xba\x7e\xa4\
+\xea\x3f\x83\x08\x78\xe7\xfe\x27\x12\x80\x4f\x06\xca\x01\x89\x2f\
+\xa7\x7b\xf9\x6b\x69\x3f\xca\x02\xc6\x2a\xa0\x01\x5f\x37\x25\x7f\
+\x1b\xfe\x19\x55\xff\xfe\xda\xa0\xf2\xcf\xdd\x57\xb4\x9c\xd1\x68\
+\x44\x6f\xb4\x90\x01\x19\xe9\xcc\x21\xe8\x9b\x89\xf2\x4c\xec\xd2\
+\x7f\x30\x66\x4b\x20\xfb\x63\xe5\xf7\x6f\x58\x97\xfc\x4b\x3f\x00\
+\x94\xca\x98\x02\x6f\xcc\x01\x08\x8d\x09\x20\xd1\x78\x77\x60\x9f\
+\x01\xf0\x60\x70\xe2\x71\x47\xc0\xa7\x17\x6d\x6b\x30\x28\x2c\x18\
+\xf2\x42\x5c\xf7\x11\xb4\x7e\xbe\x5f\x98\x28\xd5\x4d\x39\x03\x01\
+\x74\x6a\x20\xd8\x01\x0a\x95\xbf\xbe\x07\xef\x0f\x2c\x81\x61\x9a\
+\x9f\xee\x94\xf7\xe9\x09\x84\xc0\x27\xc0\xbf\x65\x05\xe8\xff\x04\
+\xf8\x70\xc0\xfc\x1b\x2d\x67\x0e\xbd\x3d\x8d\x00\x68\xa3\xdf\x3f\
+\x92\xf8\xb7\x54\xc0\xad\xa0\x6f\x9c\xf6\xf7\x7f\x4f\x23\x8b\x54\
+\x25\xfe\x44\xef\x2b\xc9\xef\xc3\x3f\x14\x32\x80\x54\x83\xbf\x22\
+\xf1\x3b\xdf\x9f\x60\x27\x9f\x46\x00\x19\xc9\xa0\xfc\xe2\xb1\x64\
+\xca\x1f\x99\x8c\x51\x05\xcc\x1d\xd8\x19\x2b\x7f\x01\xfb\xa4\x30\
+\x4b\xa2\xfd\xe2\x1f\xaf\xf8\x26\xeb\xd6\x5f\x47\x04\xe5\x4b\xde\
+\x9b\x00\xa4\xad\xfa\x16\xc0\x2f\x3b\x19\x80\xab\x99\x4e\x11\x84\
+\x67\x04\x3c\x85\x40\x70\x2a\x56\x40\x42\xd5\x17\xe5\x1e\xf8\xd3\
+\x86\x02\x88\x76\x00\xad\x80\xed\x55\x7f\x20\x8f\x35\x0d\x1e\xa8\
+\xfe\xe9\xc1\x2c\xe0\x56\xf5\x97\x7b\xb3\x02\xde\x11\xea\x86\xcf\
+\xcf\x26\x80\x55\x18\xf8\x9c\x5e\xfe\x5a\xfa\xdb\x2a\xec\x1b\x91\
+\x80\x95\x11\xde\x38\xd6\xeb\x92\xbf\xdf\x14\x04\xed\x40\xaf\x35\
+\x9a\x4a\x88\x6a\x80\x41\x15\x30\xd8\x02\xa6\x4c\x34\x19\xb1\x18\
+\x31\x13\xe5\xab\x92\x42\x87\x70\xca\x41\xfe\x87\x76\x1f\xf9\xa1\
+\x32\xba\x31\x03\xe0\x20\x2f\x64\x40\xa3\x8d\x3f\x90\x04\x0e\x66\
+\x00\x29\x64\x00\x16\x03\x40\x5a\xfb\xff\xb4\x61\x03\x08\x06\xe2\
+\x62\x0e\xe0\x1f\x33\x08\xd8\xd1\x06\xf0\x9b\x04\x59\x0f\xa0\xbf\
+\x00\xe8\x51\x0d\x50\x18\x01\xa6\x01\xd8\x2f\xe9\xc6\x1c\xe4\xde\
+\xbd\xf4\x60\xd5\x7f\x96\x32\xb8\x45\x0e\x9b\x7f\x2c\x3e\x3f\x95\
+\x00\xe8\xce\xa0\xef\x48\x6b\x2f\x0d\x00\xbe\xa5\x02\xda\x7b\x98\
+\x04\x52\x7f\x2a\x59\x40\x82\x76\xde\x58\xe2\xc7\x4a\x6f\xf0\xbe\
+\xff\x82\xec\x6f\xef\x65\xb0\x05\x5c\x2c\x41\x16\x23\x7e\x2b\x6a\
+\x60\xce\xa4\x73\xae\xa0\xa7\x7e\xbb\xff\xde\x12\xf8\xfc\x7f\xac\
+\xfc\xe5\x7f\x38\xca\x7f\x27\x01\x0e\xeb\xff\x7d\x0f\x00\xdb\xd8\
+\x10\x94\xe2\xaf\x2f\x04\x81\x56\x4e\xa4\x46\xf0\x0b\x54\xfd\x51\
+\x37\x00\x83\xc0\x14\x14\x81\x93\x81\xc5\x76\xa0\x34\xf5\x2d\xca\
+\x01\xbc\x81\x08\x08\x07\x7d\x06\x04\x60\xd2\x2b\x81\xc3\x8f\x33\
+\x2a\xe0\x08\xe8\xd3\x0b\x95\xc1\xee\x3d\x3e\x83\xd7\xa7\x13\x00\
+\xef\xa8\x80\x7b\x7a\xf9\x5b\x16\x62\x44\x06\x23\x12\xe8\x25\xff\
+\x3b\x04\x7e\x89\x08\x7a\xff\xb8\x49\xa8\xdb\x80\x1e\xfc\xed\x35\
+\xc3\xbf\x32\x53\x82\xaa\xdf\xb2\x80\x4c\x89\xb2\xdf\xe7\x4c\xfc\
+\x56\xc8\x40\x12\xc9\xac\x44\x59\xeb\xc1\x2f\xb8\x4f\x24\xc1\x39\
+\x7f\x93\x2c\xdf\xc8\x18\x00\x4e\x20\xff\xe3\x69\x3a\x23\x25\xc0\
+\x34\xc8\x02\x36\x32\x00\xaf\xfe\x46\x85\x8c\xc2\x68\x70\x95\xfa\
+\x03\x1b\x60\xdc\x4f\x03\x26\xac\xf2\x65\x5c\x3e\xc1\x1a\x19\x8b\
+\x61\x60\x02\x0f\x1e\xab\xbf\x13\x81\x49\xdf\x05\x60\x19\x00\xf9\
+\x16\xc0\x37\x57\x41\xdc\x41\x06\xaf\xb2\x04\xf7\xb6\x0e\xcf\xfd\
+\x79\x05\x01\x1c\xae\xf8\x76\xe0\x7d\x5b\x32\x5f\x76\x08\x81\x82\
+\x33\x5f\x5a\x7b\x08\x76\x01\x15\x60\xb0\x3a\xc1\xd7\xec\x4f\xd5\
+\xe3\x2f\xa3\xbc\xa8\x10\x14\x08\x60\x22\xa6\x4c\x73\xa7\x06\x9a\
+\x12\x58\x0e\x1d\x25\xca\x64\xc4\x94\x88\xa7\x89\x58\x32\x89\x30\
+\xc9\xcc\xa4\xb3\xd6\x72\x7d\xf1\x20\xad\x78\x7f\x9f\x00\xbc\x94\
+\x95\x6f\x14\xe5\xbf\x0e\xaa\xbe\xb5\x75\x4a\x71\x04\xd8\xad\x00\
+\x87\x5f\x57\xda\xf8\xd5\xa6\x41\x1b\xd0\x36\x8e\x0f\x5f\x01\x1f\
+\x40\x3f\x85\x10\xd0\x81\x7f\x61\xac\xfe\x4c\x3c\x41\x20\x80\x03\
+\x3e\x11\x60\x2c\x03\xa0\xcb\x0e\x01\xc8\x0e\x29\xa4\x1b\xb2\xfe\
+\x5e\x4b\x20\x9f\x40\x0a\x43\x15\xc0\x5f\x4e\x00\x98\x05\xd8\x83\
+\xbd\x7c\xdb\xb9\xb7\xf5\x3a\xad\x88\x20\xf6\xfd\xdb\x69\xbc\x0d\
+\xf4\xa3\xc4\x1f\xed\xc1\xbf\xab\x4c\x20\x56\xfd\x85\x00\xda\x3d\
+\x04\xfe\x42\x0a\x99\x2e\x94\x48\x84\x49\xdf\x94\x24\x2d\x0f\xbe\
+\x66\x4a\xba\x6c\x37\xc6\xda\x96\x9e\x23\x11\xf8\x46\x1f\x55\x11\
+\x84\xcd\x3f\x2d\xf4\xff\x27\x9f\x4f\x0a\x55\x9f\x62\x08\x68\x10\
+\x02\x72\x20\x86\xb0\x22\x10\xb7\x0b\x1f\x6e\x0f\xc6\x3d\xf8\xa7\
+\x51\x1e\x10\x80\xef\xfb\x9b\xff\xb8\x24\x9a\x62\x7b\x60\x73\xd3\
+\xb2\x3d\x02\x38\xaa\x06\x5e\x6d\x09\xd2\x9d\x44\xf0\xe8\x0c\x01\
+\xd3\x2f\x41\x00\xf4\x40\x2f\x5f\x76\x2a\xbc\xec\xc8\xff\x71\xf5\
+\x37\xa8\xf0\xcb\xb1\xe0\xd8\x15\x68\x5b\x81\x61\xc8\x67\x3b\xb2\
+\xdf\x81\x9f\x96\xc9\xbe\xb2\xbd\x97\xff\x82\x28\xcd\x43\xe0\x2f\
+\x76\x7f\x2a\xe7\x12\x94\x83\xca\x13\x53\x4e\xcb\xb3\xcc\xba\x3c\
+\xb2\x36\xef\xef\x92\x39\xb4\xfd\x26\x69\x55\xdf\xd7\xff\x77\x80\
+\x47\x3b\x10\x48\xa0\x56\x7c\xdb\xb1\x00\xdc\xfe\xcf\x3b\xe9\x3f\
+\xaa\xfc\x14\x16\x2b\x0d\xd4\xc0\x28\x04\x34\x26\xa2\x24\xf4\x36\
+\x09\xfd\x9c\x84\x2e\xd3\x91\xca\xb9\x45\x04\xf7\x10\xc0\xd1\x76\
+\xde\xaf\x62\x09\x0e\xcd\x10\xf0\x3d\x38\x7d\x25\x01\x30\xda\xbc\
+\x5b\x7d\x7b\x1d\x54\xf0\xad\xfe\xfe\x1e\x09\xf4\x44\xc0\x75\x0e\
+\xc0\x17\x02\xf5\x15\x3f\x4a\x7f\xcf\x05\xf2\x40\x09\xf4\x56\x20\
+\x83\x05\xa0\x1d\xe0\xe7\x62\x09\x2e\x0e\x7c\x52\xca\x85\x08\x2e\
+\xc4\x24\x13\x93\x25\x21\x4e\x0b\x01\x44\x22\xf0\x1d\x7f\xcc\x06\
+\xf2\x1f\x72\x80\x6a\x07\x06\x1d\x00\x1c\x01\xa6\x9d\x0c\x60\x55\
+\xfd\x83\xf4\x17\x18\x0b\x8e\x39\x80\x0d\xc6\x82\x6d\x14\x02\x26\
+\xa1\x1f\x93\xd0\x8f\xf2\x2c\xab\x95\x42\xb7\xaa\x67\x3a\xf0\x9c\
+\x6e\x78\xfb\xb3\x0a\xe0\x57\xb3\x04\xfc\x94\xea\xff\x52\x02\xa0\
+\x03\x41\xdf\xad\x7b\xd3\x0d\x89\x1f\x3f\x46\x1b\x21\x60\x03\xfd\
+\x07\xf5\x87\x73\xec\x0d\xfe\xfc\x1b\xec\xc2\x44\x0c\x1d\x00\x2e\
+\xea\x80\xeb\xbe\xff\xa9\x2a\x83\x65\xaf\xe0\x05\xf8\x0b\x11\xa4\
+\x72\x22\xc1\x42\x02\x6f\x95\x08\xca\x86\x24\xac\x24\x17\x26\x4d\
+\x4c\x29\x09\x71\x21\x82\xc5\x16\xd8\x42\x02\xe5\xcb\x90\x20\xff\
+\xc9\xf6\x49\x80\xc2\x10\x10\x0d\xe6\x00\xd2\x68\x36\x80\xfb\xd3\
+\x82\x53\x98\x04\x8c\xe0\x9f\x76\x6d\x40\x91\xfa\x05\xf8\x6f\x89\
+\x49\x44\x48\x48\x68\x3a\x05\x98\xa3\x44\xf0\x6c\x3b\xf0\x0a\x4b\
+\xf0\xd4\x3c\x80\xef\xc5\xe8\xab\x09\x80\x4b\x60\x7d\x73\x98\x67\
+\xa4\x02\xb6\xae\xd3\x40\xf2\xc7\x7b\xd4\x8d\xe7\xe0\xc3\x67\x01\
+\xdc\x0a\xe4\xa1\x0a\xc0\x50\xcf\xc9\xa1\xbd\x76\x0b\xe0\xbb\x06\
+\x4e\xc4\xf4\x5e\x2a\xbe\xab\x82\x6b\x89\x10\x17\xf0\x4b\xd9\x20\
+\x54\xab\x12\x58\x14\x80\xc1\xc9\x44\x22\x4a\x59\x94\xd2\x24\x24\
+\x93\x92\x64\x23\xcd\xcb\x33\xab\x36\xf9\xaf\xcd\xef\x53\x68\xfb\
+\x51\x18\xff\x35\x1b\x7b\xfe\xad\x0c\xc0\xe9\xaf\x82\x1d\x7c\x7f\
+\x9d\x0b\xe0\x7e\x4e\x60\x82\x5c\x00\xc3\xbf\x49\x84\xa4\x90\xda\
+\x5b\x62\xfa\x91\x96\x8a\x9f\x48\xe8\x07\x09\x5d\x76\x03\xad\x74\
+\x47\x1e\x70\x0f\x01\xc8\x17\x59\x82\xf4\x44\x75\x70\x37\xfe\x5f\
+\x4b\x00\xa3\x40\xd0\x76\x97\xee\xee\x2b\x03\x04\xb8\xee\x7a\x7f\
+\xbc\xaf\x03\x15\x30\x55\x90\x53\x6d\x0b\xae\xd3\xfe\xf6\x55\x68\
+\xa1\x12\xaf\xfa\x44\xb9\x90\x05\x97\xd0\x6f\xae\x2a\xe0\x0a\xe9\
+\xff\x22\xfd\x9b\x0e\xe0\x0a\x76\xad\xdb\x91\x29\x49\xfd\xb8\xd0\
+\x5b\x51\x04\x36\x09\xf1\xa4\x94\xb2\x90\x64\x25\x55\xa1\x94\x8d\
+\x24\x2b\x99\xd8\xba\xea\xc3\xd6\xdf\x06\x24\x70\x09\x59\xc0\x14\
+\x6c\x00\x0d\xe4\xbf\xd0\xc0\xfb\x13\x9c\x10\x44\xe3\x13\x83\x96\
+\xd7\x4c\x97\x5a\xe5\xb9\x56\xfc\x1f\x24\x24\xb4\x3c\xff\x20\xa1\
+\xb7\x43\x01\xd7\x51\x1b\x70\x2b\x0f\x78\xd4\x0e\xbc\xd2\x12\x3c\
+\xfc\xe0\x47\xf0\xf9\x72\x02\x88\x6d\xa7\x18\xfe\xdd\xaa\xf6\x5b\
+\x3e\x7f\xda\x90\xfc\xb6\x1a\x7c\xda\xb3\x00\xb1\xf5\xf7\xef\xca\
+\x1e\x30\xbc\xb7\x05\x7f\xa9\x54\xfd\xb9\xd4\xf4\xe5\x07\x9f\x0b\
+\x19\xb8\xef\x7f\x2b\x35\x5f\x28\xd7\x0c\xa0\xb7\x01\x5c\x0f\x25\
+\x7d\x2b\xa4\x90\x40\x11\x28\x09\x49\x52\x4a\x49\x28\x99\x51\xce\
+\x4a\x49\x85\x92\x1a\xa9\x1a\x49\x79\x24\xb3\xae\x1d\x78\x01\x12\
+\x58\xf9\xfe\xa0\x02\x68\x47\xfe\xa7\xd0\x0e\xb4\xb0\x38\x68\xa9\
+\xf4\x4c\x49\x98\x2e\xb2\x00\xfe\xad\x3c\x52\x12\x7a\xe3\xe5\xff\
+\xf3\x36\xf8\xf9\x84\x67\x7e\x46\x1e\xf0\xa8\x1d\x78\xa6\x25\x78\
+\x54\x09\x3c\xf6\xe7\xe5\x04\xb0\xa5\x02\xf6\xc6\x78\x75\xe3\x3d\
+\x69\x30\x91\x6f\x01\xee\x69\x35\xa7\x97\x61\xef\xbf\x0c\xb3\x00\
+\x23\xd9\xef\xa9\x7e\x0b\x00\xb9\xb3\x00\xcb\xc7\x32\xfd\x57\x3e\
+\x36\xd5\x6c\x80\x4b\x2e\xe0\x69\xbf\x4b\x7f\x57\x00\x58\xf1\xfb\
+\xea\xaf\xe5\x5f\x91\xfa\xb1\x46\x02\x56\x5e\xdb\x92\x13\x4c\xcb\
+\xce\x06\xc9\xac\x92\x40\x2a\x0f\x2d\xf7\x44\x8d\xd8\xac\x5b\x01\
+\x68\xb6\x1e\xff\x4d\x3b\x04\xe0\x20\x57\x18\x06\x4a\x55\x0d\x2c\
+\x80\x67\x61\x7a\xe3\x05\xf8\x6f\x08\x7e\x6e\x04\xb7\x00\xde\x95\
+\x4d\x23\x82\x63\xc0\xff\xec\x3c\xe0\x9e\x45\x3f\x8f\x5a\x82\x87\
+\xe5\x3f\xff\x16\x04\xc0\x07\x56\xee\xd9\xc6\x44\x5f\xda\x0c\xf7\
+\xb6\x87\x80\xd6\x94\xf0\x11\xac\x80\xdf\xcb\x03\x65\x90\xba\x0e\
+\x41\x2e\x55\x9f\x56\x12\x1f\x2b\x3e\x76\x03\xb4\x56\xff\x04\x89\
+\xff\x5b\x67\x03\x96\x87\x75\xd5\xbe\xaf\xfe\x56\xf4\x81\x6f\x64\
+\xee\x5b\x96\x29\x19\x25\xb6\xa2\x0c\xca\x6b\xb5\x65\x1e\x40\x8d\
+\xa4\x10\x01\x19\x51\xb2\x85\x10\xfc\x87\x2c\x6a\xab\x05\x40\x44\
+\xe3\x1d\x82\x52\xf9\xdd\x9a\x88\x68\x2a\xc0\x5e\x5a\x93\x05\xe4\
+\xc2\xe5\x34\xac\x1e\xf0\x6f\xd4\xbf\x8e\xd7\xdb\xbe\xff\x8c\x0a\
+\x78\x24\x0f\xd8\x02\xff\x23\x0a\xe0\x5e\x4b\xf0\xd0\x38\x31\x3f\
+\x03\x9b\x9f\x42\x00\x18\x08\xa6\x8d\x1c\x20\xed\x90\xc0\x11\x22\
+\xa0\xa1\x12\xc0\xb3\xf9\xd2\x46\x17\x60\x4b\xf6\x2f\xef\xe7\x2a\
+\xff\x2f\x94\xe9\xdf\x72\x3d\x15\xef\xaf\x90\x0b\x2c\x8a\x20\xd3\
+\xdc\x81\xdd\x6d\x40\x2a\x32\x3f\x95\xf4\x3f\xdd\xa8\xfe\x0a\xa0\
+\x77\x42\x48\x45\xbf\xe4\xf2\x3e\x5f\xec\x94\x64\x39\xc1\x88\x12\
+\xd5\xf7\x4c\x46\x55\x15\xb8\xef\x4f\xd6\xc8\x60\xb2\xf6\xc3\x9f\
+\xfc\xc1\xed\xb5\x03\x7e\xa2\x05\xe4\xcc\xbc\x9c\x8a\x55\x00\xbe\
+\xac\x29\xe5\x0e\xf0\x6f\xe5\xb0\xf5\x1f\x70\x1f\x55\xc0\xe5\xe6\
+\x4a\xb6\xaf\xc8\x03\xe4\x4e\xb9\xff\x99\x96\xe0\xb9\xc1\xdf\x97\
+\x10\x00\x5a\x81\x23\xfd\xfd\x2d\xd0\x4f\xab\x94\x7f\xfb\xf3\x88\
+\x26\x9a\xbb\xc4\x7f\x1e\xa8\x00\x0d\x3d\x7e\xaf\xf4\x1f\xdd\x75\
+\xae\xad\xc0\xde\xf7\x2f\x44\x30\x15\x35\xb0\x5c\x2f\x60\xcf\xd5\
+\xf3\xbf\x0d\xfc\x7f\x26\xa6\x09\x80\x2f\x05\x24\x3d\x09\x48\x21\
+\x81\x76\x40\x99\x90\xd2\x8f\xba\xc7\x71\xdb\xd8\x34\x95\x35\x8e\
+\x7e\x7f\x59\x5f\xb0\x90\xc3\x54\x2b\xbd\xad\x40\xdf\x11\x40\x79\
+\x7d\x21\x2a\x60\x6d\xd7\x08\x7a\x26\xa6\x0b\x5c\x47\x22\xf8\x41\
+\x42\x4c\x5c\x89\xc0\x5f\xef\x0f\xb5\x30\x9d\xef\xa1\x3f\x9a\x07\
+\xc8\xc9\xea\x9e\x5e\x60\x09\xee\xda\x63\x80\x9f\x85\xc9\x4f\x25\
+\x00\xff\x11\xdf\xea\xef\xd3\xce\xbd\xad\x96\xdf\xf8\x8f\x06\x89\
+\x3f\x11\xd1\x3f\xe1\x5e\x86\x1e\xbf\xcb\xfe\x6b\xe8\xfd\x6b\xa9\
+\xe7\x57\x48\xff\xaf\x10\xf8\xcd\x24\x65\x61\xd0\x5b\xf5\xfc\x0c\
+\x55\x5e\xbb\xeb\x05\xc4\xae\x04\x10\xf8\xd6\x29\x01\xaf\xf6\xd3\
+\x56\xe5\x87\x53\x8c\x53\x9d\x7a\xa4\xd5\xf5\x51\x02\xb8\xc0\xeb\
+\x4b\x81\xac\x83\x9e\xca\xb3\xdf\x77\xd0\xed\xc9\x68\x63\x00\x00\
+\x0e\xd7\x49\x44\x41\x54\x8f\x08\xe0\x42\xde\xea\xf3\xf7\xdc\xda\
+\xb9\x46\x9e\xa4\x02\x9e\x41\x00\xf7\x06\x84\xf7\x58\x82\x7b\x95\
+\xc0\xd3\xf0\xff\xb9\x04\xb0\x67\x05\xe8\x84\xe4\xa7\x9d\xc1\x1f\
+\x7c\xbd\x7c\xb3\x72\xf0\xfa\x28\xfb\x31\xe0\x4b\x20\xfb\xa7\x70\
+\xdf\x89\xc0\x87\x7b\xe6\xe2\xfb\xe7\xfa\x9e\x96\xfa\x37\xcf\xaf\
+\xe0\xf9\xd7\xd7\x02\x24\xa0\xab\xea\x6f\x50\xed\x6d\x50\xf9\xa7\
+\x00\x7c\x54\x01\xf1\x7a\xaa\xa4\x6b\x2b\xe0\xd3\x00\xfc\x13\x51\
+\xad\xf8\x17\xa2\x5a\xf1\xa3\x12\x90\x01\xf8\x47\x4a\x60\x7b\xc6\
+\xfd\x1e\x15\x70\x66\x4c\xf8\x9e\x85\x43\x67\x16\x0c\xc9\x41\x15\
+\x71\x36\x1f\xd8\xbd\xe6\x67\xe2\xf1\xd3\x09\x20\x76\x05\xec\xe0\
+\x58\xef\x16\xd8\xd3\x0d\x05\x60\x2b\xf0\x7f\x0c\x32\x81\xa5\xa2\
+\xf7\xd7\xb9\xbb\x6e\xc0\x6f\xb6\xa0\xf9\xfe\xff\xea\xb4\xdf\x5b\
+\x49\xfc\x63\xf5\x5f\x7b\x7f\xad\x1e\x59\xeb\xb9\x04\x91\x04\xa4\
+\x6e\x65\x36\xaa\xfc\x51\x05\x4c\xc1\x06\x5c\xca\xb5\x03\x59\xcb\
+\xbd\x5b\x04\xe0\xa0\x8f\x04\x10\xe5\x3f\x82\x1e\x25\xbf\xc0\xbd\
+\xed\x43\x03\x1e\xcd\x01\xce\xe4\x01\x47\x08\xe0\x16\x90\xef\x5d\
+\x4d\xf8\x54\x4b\xc0\xcf\xc6\xe2\x97\x10\x00\x07\xef\x4f\x07\xc6\
+\x7a\xe5\x90\xe4\x8f\x7f\x32\xcc\xf7\x27\x9a\x42\xf2\x8f\x61\x5f\
+\x5e\x05\x7f\x13\x54\xfa\x25\x00\xec\x7d\xff\x85\x32\xcd\xc5\xfb\
+\x4f\x05\xd8\xb9\x7a\x7e\xad\xba\x20\x06\x82\x8b\xf7\x4f\xc3\xea\
+\x6f\x9d\x15\x40\xdf\xbf\x05\x7c\x3b\xa8\x00\xf6\x08\xe0\x32\xb8\
+\x6e\x55\x7f\xad\x00\xfc\xde\x56\xf5\xff\x51\xc1\x7f\x84\x00\x9e\
+\xad\x02\x9e\x95\x07\x9c\x1d\x14\xfa\x0c\x4b\xf0\x74\xfc\x7f\x0d\
+\x01\x8c\xc6\x84\x6f\x8d\xf5\xd2\xce\xb4\x5f\x2f\xfb\xe3\xff\x9e\
+\x07\x7e\xef\xa5\x55\x37\xad\x02\x3e\xaf\xf0\xfe\xde\x56\xe1\xfd\
+\x39\x0f\x7c\xff\xb5\x76\x03\x52\x07\x78\x2d\xd9\x7e\xae\xf7\xb1\
+\xca\xff\x08\xd5\x3f\xd7\x33\x0a\x64\xa5\x02\xa6\x9a\x01\xf4\xd5\
+\xdf\x73\x01\x04\xbb\x7f\x7c\x22\xea\xae\xa3\x05\x38\x4a\x00\x23\
+\x0b\xc0\xd5\xe3\xd3\x0a\xf4\xae\x0a\x52\x27\xfb\x8f\x92\xc0\x1e\
+\xf0\xf9\x64\x0f\xfd\x59\x79\xc0\xbd\x76\xe0\x65\x96\x80\x5f\x81\
+\xc3\xe9\x0b\x8a\xbf\xff\x44\x2d\x2d\xff\x67\xf9\x88\xe4\x1f\x4f\
+\xfa\x8d\xff\xb4\x8e\x41\xec\xf3\x8f\x64\xbf\x7b\xfc\x7f\x07\x0a\
+\xe0\xbf\xae\xed\x37\x57\xdf\xff\x51\x2d\xc1\x52\xcf\x73\x57\xf5\
+\xdf\x20\x04\x74\xe0\xf7\xaa\x40\xc0\x26\x48\x51\x01\xad\xfa\xa7\
+\x7a\x84\xa9\x96\x05\x33\x0d\xe0\x98\x0b\xf4\x41\x5f\x6f\x03\x22\
+\x01\xf8\x7b\xf7\x08\x80\x83\x1d\xe8\xc3\xbf\xb5\x15\xf8\x01\x96\
+\xc0\xaf\x79\x78\x4c\xd5\xad\xea\xff\xac\xe1\xa0\x67\xe5\x01\x47\
+\x77\x09\xfa\x34\x4b\xc0\xaf\x02\xe4\x67\x13\x00\xee\xa8\x51\x95\
+\xc0\x54\x0f\xdb\xde\xf6\xff\xf7\xfd\x41\xd9\xef\x2a\xa0\x11\xc1\
+\x5c\xb7\x27\xc9\xa5\xde\x2d\x7e\x3f\x83\x02\x58\x92\xff\xa6\x10\
+\xb4\x10\x82\xfb\xfe\xb7\x42\x0f\x0e\x68\x37\x0d\x2e\xfd\xdf\xca\
+\xc0\x4f\xcc\x01\xa6\x41\xf5\xf7\x7b\xf8\x8c\xc0\x9f\xca\xa9\x05\
+\x08\x76\x24\x01\x0b\xde\xff\x02\xc0\xbf\x45\x00\x97\x41\x1e\x10\
+\x09\x40\x06\xed\x3f\xae\x95\xff\xd6\xa1\x81\xf7\x82\xff\xe8\x42\
+\xa1\x47\xf2\x80\x5b\xd5\xff\xd9\xa3\xc3\x67\x2d\xc1\xcb\xf0\xff\
+\x75\x16\x60\x2f\x0f\xd8\x52\x00\x7b\x61\xe1\x76\x06\x30\xd3\x54\
+\xc0\xdf\x16\xf8\x34\x42\xc8\xb5\x0d\xf8\x6f\x1d\xf8\x61\xfa\x97\
+\x84\x26\x9a\x3b\xdf\x7f\x05\xe0\x4f\xc4\x34\xd1\x54\x26\xfd\xb0\
+\xea\x63\x08\xf8\x03\x42\x40\xcf\x01\xd0\x0e\x78\xf5\x6f\x81\x5f\
+\xab\xf8\x3f\x8a\xef\x9f\xc2\x20\x90\x85\x2e\xc0\x04\xfb\x1e\x8f\
+\xa5\xff\x36\x01\x8c\x40\x8f\x6a\x60\x4b\x01\xf4\xe1\x1f\x95\xf1\
+\xde\x33\x27\x87\x9e\x39\x06\xeb\x33\xf2\x80\x57\x59\x81\x47\xf7\
+\x1d\x4c\x2f\xad\xfe\xbf\x04\x01\xb8\x0a\xa0\x8d\xae\xc0\x59\x79\
+\x31\xad\x08\x60\x2a\x52\x7f\x02\x15\xd0\xba\x02\xdc\xb5\xfe\x3e\
+\x3a\xc0\x13\x00\x3e\x77\x43\x3f\xff\xd6\xd4\xff\x47\x9d\xf4\xcb\
+\x45\x47\x70\x97\x09\x68\x01\x36\x92\x81\x82\x22\x30\x68\xfb\xa1\
+\x15\x98\x6a\xcb\xaf\x1f\x04\x32\xa8\xfc\x16\x40\xef\xa4\x70\x79\
+\x90\x00\xfc\x19\x09\x80\x8a\xcc\xc7\x2c\xe0\x36\xf8\xef\x09\x02\
+\x8f\xaa\x80\x33\x9b\x87\x3c\x9b\x00\xee\x09\x08\xef\xb2\x04\xfc\
+\x6a\xec\xfd\x12\x04\x10\x5b\x83\xcf\xfb\x9f\x42\x50\xbf\x03\x21\
+\xfc\x5b\x89\x21\x77\xc3\x3f\xfe\xb1\x5c\xe5\x3f\xc3\x60\x10\x83\
+\x12\x48\xd5\x18\xb4\xea\xff\x23\xb4\xfd\x1a\xe0\xb9\x18\x87\x56\
+\xfd\xd1\x16\x68\xdd\xa4\xb4\x59\x01\xab\xed\x3d\xbd\x01\xfc\xb5\
+\x0d\x40\xe9\x8f\x0a\xe1\x32\x90\xfe\x5b\xa4\xd0\xa4\xfe\xd8\x0a\
+\xc8\xa1\x73\xc3\xcf\x58\x81\x67\x8f\x08\xdf\x9b\x07\x7c\x86\x1d\
+\x38\x6a\x09\x5e\x8e\xff\x5f\x87\x00\xf6\xe6\x03\xce\xc9\x7e\xfc\
+\x1f\x6b\x52\x1f\xdb\x7f\xb9\x12\x03\x66\x03\x89\xb8\x7c\x0c\xab\
+\xbc\x13\x08\x5a\x82\x1f\x00\xf8\x0c\x9e\x5f\xc3\x73\x02\xff\xbf\
+\x55\xfd\x31\xf0\x9b\x20\xe1\x37\x90\xfe\x53\x00\xbc\x06\x32\x40\
+\x90\x6f\x55\xfe\x5b\x04\x70\x54\x01\x48\x07\xfa\xa3\x04\xf0\xa8\
+\x0a\x60\x3a\xbf\x68\xe6\x19\x79\xc0\xab\xec\xc0\x11\x4b\xf0\xfa\
+\xea\xff\xcb\x11\x40\x39\x60\x94\x0f\x86\xfd\x1b\xb2\xbf\xfd\x5d\
+\x08\x7e\x86\x96\xa0\xa7\xff\x4d\xf6\x5f\x28\xd3\x3f\x45\xc0\xff\
+\x5b\x42\x40\xf4\xfd\xff\xd6\x1a\x3e\x17\x33\xd0\x48\xa0\x79\xfe\
+\xa9\x84\x7c\xeb\x67\xee\x42\x3f\x05\x35\x90\xa0\xfa\x63\x06\xa0\
+\x21\x04\xec\x53\x7e\xf4\xff\xb6\x59\xf9\x47\x04\x60\x1b\x60\xdf\
+\x23\x80\x1f\xe5\xb9\xaf\xfa\x67\xc0\xff\xea\x99\x80\x67\xda\x80\
+\xcf\xb0\x03\x37\x2d\x01\x7f\x16\xe6\x7e\x29\x02\xb8\x97\x04\xb6\
+\xff\x47\xbc\xea\x63\x9b\xef\xbd\x5a\x82\xdc\xf9\xfd\xfe\xb9\xf9\
+\xfe\x9e\x04\xd0\xf3\xff\x28\x49\xff\x0f\xa8\xfa\x5c\xc3\xbe\xc5\
+\xff\xff\x84\xe4\x9f\x61\x08\xc8\x3d\x7f\xee\x24\xbf\x76\xbd\xff\
+\x75\xc5\xd7\xe0\xf1\x7b\x52\x30\x00\x7e\x94\xfe\x76\x07\x01\x08\
+\x48\xfe\x35\xf0\xb7\x08\x80\x36\x64\xff\x16\xf0\x8f\xae\x0f\x78\
+\xd6\x62\xa1\x67\x2e\x1c\x7a\x96\x1d\x48\x9f\xd2\xf2\xfb\x2d\x08\
+\x60\xd4\x19\x38\x27\xfb\xf1\xef\x99\x8a\x02\x98\x0b\xd8\xdf\x43\
+\xe2\xdf\x80\xde\x6c\xc0\xb5\x00\xff\xa3\xf8\xff\xde\xf7\x6b\x0d\
+\xfe\x98\xa6\x3a\xc2\xbb\x54\x7b\x5d\x79\x7f\xed\x92\x7f\xbf\xe7\
+\xd5\x7f\xaa\x9e\xdf\xaa\x0a\x98\xa0\xe5\x67\x01\xf8\x48\x0a\x28\
+\xf9\xbd\x2b\xb0\x5f\xf9\x8f\x13\x00\xc3\x00\x10\x6f\x02\x9f\x76\
+\xc0\x7f\xc4\xff\x7f\xa6\x0a\x38\x93\x07\x7c\xc6\xa0\xd0\xa6\x25\
+\xe0\xcf\xf0\xfd\xbf\x3c\x01\x60\x67\xe0\xbc\xec\xc7\xd7\xf3\x4a\
+\x01\x2c\x3e\xbf\x57\x02\x5c\xd7\xfb\xff\xd3\x75\x05\x5a\x08\x98\
+\x4a\xf5\xe6\xda\xfa\xdb\xaa\xfe\x98\x07\x4c\x1d\xf0\xfb\xd7\x7e\
+\xfd\x13\x7a\xfe\x06\xa9\xff\x04\x21\xe0\x34\xe8\x02\xa0\xe4\xb7\
+\x40\x00\x1a\x40\x7f\x84\x00\xde\xc2\x3d\x5e\x7d\x47\x23\xc0\xe9\
+\x00\xf8\xef\x25\x81\x67\x8e\x08\x7f\x66\x1e\xf0\xc8\xf8\xf0\xe7\
+\x84\x7e\xbf\x0d\x01\xdc\x22\x81\x23\x5f\x7c\xf3\xfd\x33\xc8\xfe\
+\xe8\xfb\x11\xf8\xa8\x0a\xfe\xe9\x3a\x01\x13\xcc\xf4\xbb\xef\xff\
+\xb9\x51\xf5\x31\x03\x88\x41\x60\xab\xfe\x56\x9f\x47\x2a\xc0\x6a\
+\xe5\x97\x4e\x0d\x44\xff\x8f\x76\x00\x55\xc1\x05\xd4\xc0\x2d\x02\
+\x78\x83\xeb\x6d\x4a\xdd\x23\x80\x23\x79\xc0\x99\xa1\xa0\x67\x2d\
+\x14\x7a\x55\x1e\x70\xaf\x1d\xd8\x3d\x82\x8c\xbf\x02\x63\xbf\x34\
+\x01\x38\x09\xd8\xce\x31\xc6\xd3\xce\xaf\xec\xb2\x9d\x57\x5a\x29\
+\x80\xa5\xaa\x7f\xd4\xd7\xd1\x0e\xe4\xa2\x00\x72\x97\xfa\x2b\xfd\
+\x28\x16\x00\xc9\x60\x5d\xf5\x97\x8f\xb5\xca\xde\x03\x3f\x05\x0b\
+\xe0\x2a\x60\x01\xb5\x56\x70\x6b\xc8\x01\x22\xf0\x11\xe8\x1a\x14\
+\x40\xb4\x03\xfe\x9e\xb7\x42\x00\xf8\xbc\xff\x4b\xf0\x4c\x02\x38\
+\x3a\x14\xf4\x0c\x15\xf0\xd9\x79\xc0\x3d\x1b\x8b\x7c\x6e\xbf\xff\
+\xb7\x25\x00\x82\x50\xf0\x98\xec\x1f\x29\x80\x04\x72\x7f\x0a\x83\
+\x3f\x53\xe7\xfb\xa9\x8e\xfa\xe6\xfa\x8c\xa9\xbf\x03\xfa\x27\x4c\
+\x01\x2e\x55\xbb\xdf\xf8\x63\x19\xfe\xd9\xaf\xfe\x58\xf1\x33\x29\
+\x5d\x60\xf8\xe7\x52\x49\xa1\x07\xfc\x9e\x02\xc0\x6b\x0c\x02\x51\
+\x01\x10\x10\xc0\xed\x1f\xfe\xb3\x09\xe0\x16\x09\xdc\xa3\x02\x98\
+\x6e\x2f\xa9\xfd\x8a\x3c\xe0\xb0\x15\xe0\xaf\xc4\xd6\x6f\x41\x00\
+\xb7\x48\x60\xfb\x57\x76\x0e\xbe\x3f\x95\x58\xcb\x95\xc0\x44\x73\
+\x95\xff\xeb\x10\x30\x53\xa2\x9f\x65\x93\x8f\xa9\x06\x7f\x6b\x2b\
+\x30\x95\x51\xdf\x1f\xc1\xfb\xbb\x15\xb8\x40\xf5\xb7\xd0\xf6\x73\
+\x32\xf8\x09\x19\x80\xc1\xbc\xff\x65\xa3\xf2\xe3\x73\xb4\x01\x97\
+\xd0\x11\x88\x04\x70\x7c\xc2\x72\x8b\x00\xee\x05\xff\x67\xcc\x04\
+\x3c\x32\x26\x7c\x4f\x1e\x70\x0f\xf8\xe5\xcb\x2b\xff\x6f\x47\x00\
+\x7b\x24\xc0\xa1\xf1\x17\xbb\x00\x0d\xe0\x17\xca\xf4\x3f\xd0\xe2\
+\x5b\xc8\x20\x4a\x7e\x07\x7f\xec\xf5\xff\x84\x00\x10\xe5\x7e\x4b\
+\xf3\x9b\xf7\x9f\xa0\x0d\x18\x2d\x00\x92\x00\x66\x01\x8d\x00\xc6\
+\x40\x8f\x2a\xe0\xb2\x1a\xfd\xed\xa5\x7f\x24\x80\xf3\xbb\xc8\x7f\
+\x26\x01\xdc\x3b\x19\xf8\xe8\x62\xa1\x67\xe7\x01\x87\x97\x03\xf3\
+\x57\x84\x7e\xbf\x35\x01\x6c\x91\x00\xef\x2a\x80\x89\x98\xfe\xa1\
+\xe5\xf4\xde\x0f\xea\x47\x81\xff\x85\x6c\x5f\x41\xfa\x7b\xea\xaf\
+\xf5\xce\xcf\xea\xed\xb9\xf3\xf6\x0d\xe0\xad\x2b\x80\xb2\xff\x02\
+\x59\x80\x85\x19\x80\x75\xc5\x5f\x88\xe2\x02\x00\xcf\xa1\x25\x48\
+\x44\xc3\x1c\x60\x8f\x00\x96\xef\xc5\x3d\x43\xd6\xf7\x12\x00\xdd\
+\x08\x00\x1f\x51\x01\xcf\x1c\x11\x7e\x76\x1e\x70\xb8\x33\xf0\x4b\
+\x80\xff\xb7\x24\x00\x27\x01\x86\xee\xc0\x36\x01\xa0\xef\xef\x07\
+\x80\xbc\xca\x33\x84\x81\x1c\xa4\xbf\x57\x79\x29\x83\x3f\x1c\x82\
+\x3f\xad\xcf\x52\x67\x02\xa6\x4a\x0e\x02\x24\x21\xc1\xf3\xe3\xc7\
+\xa5\x02\xdd\x7d\xff\x05\xd4\x80\x04\x42\xf0\x30\x6f\xeb\xf5\x12\
+\x9c\xe2\x9e\x4a\x34\xb8\x7e\x25\x01\xd0\xc1\x2e\xc0\x3d\x41\xe0\
+\xd9\x01\xa1\x44\x9f\x9b\x07\x1c\x52\x03\xbf\x0c\xf8\x7f\x5b\x02\
+\x88\x2d\xc2\x7c\xa3\x0b\xc0\xb5\xf2\xfb\xb8\xef\x3f\x61\xf8\xe7\
+\xa3\x1b\xfe\x71\xdf\xef\x52\xdf\xab\xff\xa5\x7a\x7a\x0d\x09\xbf\
+\xae\xc8\x40\xc1\x06\xc4\xea\xdf\xd2\xfe\xf6\x9c\x42\xbb\x2f\x76\
+\x01\x6c\xb3\xf5\xd7\x5e\xf3\x0a\xf8\xbf\x12\x01\x3c\xb2\x51\xc8\
+\xab\x87\x83\x5e\xb5\x91\x88\xfc\xd2\xe0\xff\xad\x09\x00\x49\x60\
+\x3b\xab\x5e\xdc\xf9\x4c\x1f\xc4\xc4\x70\x82\x4f\x2a\x9b\x55\x2f\
+\xb3\xfd\x5e\xd7\x3d\x17\x48\x75\xa7\x1b\x4f\xf6\xfb\xea\x8f\x2a\
+\xc0\x2b\x7a\x4f\x08\x6b\x1b\x80\x39\x80\xdb\x82\x0b\xb4\xff\xac\
+\x9b\xed\xef\xe7\x01\x2e\x2b\xcf\x6f\x65\x81\x14\x1e\x82\x36\x02\
+\xfe\xab\x09\xe0\x0c\xf8\x9f\x31\x19\x78\x26\x07\xf8\xea\x3c\xe0\
+\xd7\x07\xff\x6f\x4f\x00\x4e\x02\x0c\xbf\xe1\xfd\xaf\x67\x93\xf8\
+\xb9\x93\xfa\x38\xe8\xf3\x51\x76\xf5\x5b\xee\x5f\x60\x85\x5f\xac\
+\xfe\x1a\xaa\x7e\x53\x03\xcd\xfb\xf7\xaa\x40\x00\xdc\x7d\x47\xe0\
+\x67\xad\xee\xcd\x06\x34\x32\x90\x55\xd5\x4f\xc3\xa1\xe8\xd1\xeb\
+\x5f\x9d\x00\xce\x90\xc0\x57\xa9\x80\x7b\x08\x60\xb7\xfa\xff\x92\
+\xe0\xff\x23\x08\xc0\x7f\xe5\x3c\x1c\xcc\xdd\xaf\xa7\x4f\x00\xfe\
+\xb7\x92\xfa\x23\xdf\x8f\xa0\xf7\xca\xaf\xd0\xde\xeb\x83\x40\x7f\
+\x5f\x4b\xfa\xa3\xec\x8f\xd5\x5f\x48\x0b\xd0\x5b\xfb\x0f\x7d\xff\
+\x48\xf6\xf3\xe6\xbe\x48\x91\x04\xbe\x9a\x00\xce\x76\x03\x9e\x39\
+\x19\x78\xcf\x42\xa1\x67\xe7\x01\x9b\x04\xf0\xcb\x82\xff\x8f\x21\
+\x00\x24\x81\x72\x6a\x75\xc9\x05\x1c\xe4\xde\xfe\x4b\xc4\x35\x04\
+\x7c\xff\xff\xdb\x3b\xb7\xdd\xd6\x41\x20\x8a\xce\xe0\x44\x6a\xff\
+\xff\x5b\x7b\xa4\x4a\x0d\x9c\x07\x83\x8d\x09\x86\xe1\xe6\x18\x18\
+\xa4\x28\x4a\x15\x55\xaa\xea\xbd\x66\xcf\x05\x38\xe4\xfd\xf8\xd6\
+\x03\x58\x0f\x07\x33\x51\xde\x44\x75\xe1\xbc\xdb\x96\xdf\x76\x05\
+\x2e\x04\xec\xe8\xef\x5a\x7f\x3b\xf2\x0b\xe7\x6e\x63\x18\x16\x00\
+\x57\x4f\x06\xb6\xae\x07\x88\xee\xc4\x3f\x14\x00\x7c\x10\xc0\x6d\
+\x56\xef\x77\xcb\xfb\xd1\xba\xbe\xdb\xce\xfb\x4d\xd5\xff\x5b\x1f\
+\xec\xf9\x75\x98\x01\xc0\x43\x57\x40\x3a\xf9\xbf\xb4\xf6\xfd\x0b\
+\x4f\xf4\x7f\xea\x79\x7f\x37\xfa\x0b\x7d\x31\xfa\xa2\xcf\x2a\x8c\
+\x0b\x7e\x34\x00\xa4\xd4\x00\x6a\xb8\x80\x16\xc7\x88\x9d\x02\xe0\
+\xf6\xe2\x1f\x0e\x00\xef\xc5\xc1\x45\x3f\x96\x0f\x2d\xf6\x7f\x87\
+\xd6\xa0\x39\x04\xe4\xa1\xad\xfe\xd7\xc1\xea\x1b\x11\xbf\xe7\xfe\
+\xf2\xd0\x09\x58\xd3\x81\x6f\xa7\xdf\xff\xb0\xee\xf8\x03\x2d\x76\
+\xb1\x89\x7e\x17\xff\x7e\x50\xa9\x2b\x6e\x19\xc9\xf9\x7b\x00\x00\
+\x10\xba\x00\x57\xcf\x04\xd4\x4e\x03\xbc\x00\xe8\x42\xfc\xc3\x02\
+\x60\x2f\x0e\x22\x20\xbc\xd4\xdf\xc1\x05\x98\x22\xe0\x8f\x3e\xb9\
+\x7f\xb7\xfa\x6e\xb5\xff\x79\xc8\xf5\xf7\xe8\xff\x74\x44\x2f\x9c\
+\x33\xfe\x95\xbe\x07\x78\xd9\x44\xbc\x7e\x07\x0e\xa2\x3f\x13\x7a\
+\x08\x0a\x21\x08\xb8\x30\x68\x05\x00\x9f\xe8\x29\xe2\x4f\x9d\x07\
+\x48\xdd\x1f\x50\x3a\x22\x9c\x9b\x06\xf8\x22\x7f\x3f\x6b\x58\x00\
+\xac\x8f\x9f\x54\x8b\x2e\x02\x4a\xc7\xf2\x9b\xe9\x3f\x37\xfa\x3f\
+\x0f\x79\xbc\x84\x6f\xfd\x59\x7a\x6a\x01\xa8\x1d\x00\x6c\xf7\x0b\
+\x18\x2b\x2f\x2d\x11\xdb\xef\xae\xb8\x5d\xa1\x9b\xef\x08\xa2\xed\
+\xbf\x2b\x00\xae\x6c\x07\xb6\x74\x01\xc9\xf5\x00\xec\x4d\x23\x43\
+\x03\xc0\x58\xb1\x05\x9e\x6a\x3d\xd2\xfb\x18\xfd\x8f\xa2\x7f\x9f\
+\xf4\x7b\xe9\xd3\x6f\xd1\xba\xeb\x4e\x6c\xef\xb6\xe8\xe5\x1b\x04\
+\xc0\x0b\x01\x75\x02\x82\x50\xd4\xa7\x02\x20\x64\xfb\x55\x11\x46\
+\xc3\xe9\x40\x8b\x76\x60\xee\xfe\x80\x56\x2e\x80\x62\xff\xfb\x13\
+\xff\x04\x00\x00\x00\xf8\x53\x00\x0b\x88\xad\x15\xf8\xbb\x0d\x00\
+\xd9\x3b\xfc\x50\x27\x04\xe6\xa6\x20\x53\x39\x80\xed\x7e\x7b\xe9\
+\x79\xb9\xd1\x1f\x03\x51\x5f\x9d\x80\x20\x45\xfc\xa3\x01\x20\xb5\
+\x13\x90\x33\x13\x80\x40\x1b\x0c\xca\xae\x07\x74\x93\xef\x4f\x0a\
+\x00\xfb\x2c\xc0\x97\xbe\xce\x63\xcd\xe3\x41\xe7\xfd\xe0\xbd\xda\
+\xca\x27\x76\xf4\x88\xde\x15\xbe\x3a\x89\xfe\x67\xd6\x3f\x45\xfc\
+\x21\xd1\xd7\x2e\x00\x52\x0b\x81\x9f\x6c\x07\x96\x74\x03\xaa\xd4\
+\x03\xba\x16\xff\x24\x00\x10\x08\xb0\xa8\xf5\x1f\xb5\x82\x40\x68\
+\xd1\xbf\x8b\xfd\x15\x78\x40\x63\xd1\x5f\x12\xa2\x7f\x28\xef\x67\
+\x00\xb4\xd9\x1f\x90\x72\xab\x50\x52\x3d\x00\x47\x50\xc7\x04\x00\
+\x78\xa9\xf5\xcf\xfc\x81\xfd\xa2\x45\x0c\x88\x5d\x06\xec\x3e\x46\
+\x6c\xff\x59\xd4\xaf\x61\xfd\xaf\x1e\x03\xa6\x02\xa0\xc4\xfe\x97\
+\xa6\x02\x9f\x18\x0e\x12\xc3\x88\x7f\x96\x14\x00\xd7\x63\x05\x1f\
+\x1e\xd1\xc7\x22\x7f\x8a\x03\x88\xa5\x00\x54\xeb\x4f\xe9\xff\x5f\
+\x31\x03\x90\x03\x80\x33\xf1\x03\xe4\xcf\x03\x50\x53\x80\x9c\x8d\
+\x42\xc9\x4e\xa0\x7b\xcb\x3f\x21\x00\x00\x40\x5f\xf8\xb1\x8b\xfe\
+\x95\x10\xf9\x5d\x07\x40\xa9\xfe\x53\x0a\x80\xe2\x44\xf8\xa9\xfd\
+\xff\xbb\x03\x00\x20\x6f\x7b\x70\xc9\x64\x60\x4d\x17\x30\x96\xe5\
+\x9f\x10\x00\xe6\xf8\x4b\x5f\xf4\x8f\x45\xfe\xd4\xe8\x9f\x62\xfd\
+\x29\x83\x3f\x39\xd5\xff\x3b\x01\x00\xa0\xce\x3c\x40\xe9\x4c\x00\
+\x16\x0a\x1f\x87\x55\x07\xaa\x2a\xf7\xf1\xf6\xb0\xa4\x5a\x05\x2f\
+\x0b\x5e\x2a\xf0\x59\x11\xde\xcf\xc4\x5f\xb3\xfd\xd7\x1b\x00\x4a\
+\x86\x82\x5a\xb9\x80\xb1\xa3\xfe\x84\x29\x00\x58\x24\x37\x20\x48\
+\x29\x4e\x95\x44\xff\xd8\xe4\x5f\x4a\x11\x10\x3a\x02\x40\x6a\x31\
+\xb0\xe5\x64\x20\x66\x08\x1f\xa7\x50\xc5\x44\x0e\xc0\x75\x03\xa5\
+\x0e\x20\x14\xfd\x7d\x11\x3f\x37\xf2\xe7\x56\xff\xaf\x06\x40\x8d\
+\x6e\x00\x75\x32\xb0\xe9\x88\x30\xce\xa4\x84\x07\x4c\xb9\x0c\xe1\
+\x51\xa5\xe7\xff\xd4\xe8\x5f\x6b\xf2\x6f\x26\x00\xd4\x6a\x07\x66\
+\xb9\x80\x69\xa2\x3e\x3b\x80\xb7\x22\x21\xc5\x11\x9c\xe5\xff\xb1\
+\x3a\x00\x65\xf7\x5f\x8b\x33\x00\x3e\x09\x80\x5c\xf1\xd7\x9e\x0c\
+\x24\xb9\x80\x29\x85\xcf\x00\x20\xa5\x05\x2a\x11\x02\xb1\x02\x60\
+\x68\xfb\x2f\xa5\xf5\xd7\x3b\x00\x00\xd2\x5b\x81\xb5\x26\x03\x71\
+\x7a\xbb\xcf\x00\x68\x02\x82\x94\xaa\x3f\x55\xfc\x35\xfa\xff\x77\
+\x03\x00\x40\xf9\x3c\x40\xb5\x6e\x00\xf2\x73\xce\x00\x88\xa4\x05\
+\x4a\xd1\x8a\x80\xb9\xed\x3f\x6a\x3a\x00\x90\xde\x09\x68\x0d\x80\
+\x98\xe8\x73\xea\x01\x35\x86\x82\xa2\x75\x80\xa9\xed\x3e\x03\xa0\
+\x0a\x08\x6a\xf4\xfe\x53\x6b\x01\xb1\xe2\xdf\x9d\x00\x50\x52\x0c\
+\x6c\x36\x19\xc8\xc2\x67\x00\xd4\x04\x41\xac\x00\x58\x6b\xf8\x27\
+\x77\x08\xe8\x6a\x00\x94\x46\xff\xd2\xc9\xc0\x53\x10\xb0\xf0\x19\
+\x00\xad\x6a\x04\xad\x27\xff\x66\x05\x40\x95\xc9\x40\x56\x3d\x03\
+\xe0\x0a\x10\xc4\x44\x5f\x43\xfc\x35\xce\x00\xf8\x14\x00\x72\xc4\
+\x9f\x7b\x5c\x18\xb2\xf0\x19\x00\x9f\x4e\x0f\xae\xee\xff\x8f\x0c\
+\x00\x72\x27\x80\x6d\x3e\x03\xe0\x6e\xae\x80\x2a\x7e\x09\x65\xed\
+\xbf\x1e\x01\x00\x09\x05\xc0\x20\x04\x58\xf5\x0c\x80\xbb\xbb\x82\
+\x1c\xf1\x53\x00\x90\xda\xfb\xbf\x0a\x00\x94\xfc\x1f\x20\xad\x0b\
+\x70\xf8\x39\x47\x7b\x06\x40\xcf\x30\x28\xd9\xfe\x9b\x3b\x04\x54\
+\x13\x00\x31\xe1\x43\x81\xf8\x4f\x41\xc0\xa2\x67\x00\x8c\x0a\x83\
+\x56\x67\x00\xdc\x11\x00\x49\xf5\x00\x16\x3d\x03\x80\x81\x30\x11\
+\x00\x58\xf0\x0c\x00\x5e\x7e\x20\xc0\x00\x00\x00\x16\x3c\x03\x80\
+\x57\x1e\x10\xc0\x82\x42\x97\x00\x40\xff\xef\xe1\xc5\x00\xe0\x55\
+\x01\x0c\xb7\x01\x00\x0b\x9d\x01\xc0\xeb\x5e\x80\x00\x07\x14\x59\
+\x8f\x08\x86\x81\xc0\xab\xe7\xf5\x1f\xc8\x06\x4b\x79\x1a\xb1\xd2\
+\x6b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x0e\
+\x07\xd2\x76\x07\
+\x00\x63\
+\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x77\x00\x68\x00\x65\x00\x65\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/gui/modules/source_configure.py b/vistrails/gui/modules/source_configure.py
new file mode 100644
index 0000000..46ffa62
--- /dev/null
+++ b/vistrails/gui/modules/source_configure.py
@@ -0,0 +1,413 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core import system, debug
+from vistrails.core.utils import PortAlreadyExists
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.gui.modules.module_configure import StandardModuleConfigurationWidget
+from vistrails.gui.modules.tuple_configuration import PortTableConfigurationWidget, \
+    PortTable
+from vistrails.gui.theme import CurrentTheme
+import urllib
+
+class SourceEditor(QtGui.QTextEdit):
+
+    def __init__(self, parent=None):
+        QtGui.QTextEdit.__init__(self, parent)
+        self.setLineWrapMode(QtGui.QTextEdit.NoWrap)
+        self.formatChanged(None)
+        self.setCursorWidth(8)
+        self.connect(self,
+                     QtCore.SIGNAL('currentCharFormatChanged(QTextCharFormat)'),
+                     self.formatChanged)
+
+        self.setFocusPolicy(QtCore.Qt.WheelFocus)
+        
+    def formatChanged(self, f):
+        self.setFont(CurrentTheme.PYTHON_SOURCE_EDITOR_FONT)
+        
+#    def focusOutEvent(self, event):
+#        if self.parent():
+#            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+#        QtGui.QTextEdit.focusOutEvent(self, event)
+    
+class SourceWidget(PortTableConfigurationWidget):
+    def __init__(self, module, controller, editor_class=None,
+                 has_inputs=True, has_outputs=True, parent=None,
+                 encode=True, portName='source'):
+        PortTableConfigurationWidget.__init__(self, module, controller, parent)
+        if editor_class is None:
+            editor_class = SourceEditor
+        self.codeEditor = editor_class(parent)
+        self.setWindowTitle('%s Configuration' % module.name)
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().setMargin(0)
+        self.layout().setSpacing(0)
+        self.has_inputs = has_inputs
+        self.has_outputs = has_outputs
+        self.sourcePortName = portName
+        self.sourceEncode = encode
+        self.createPortTable(has_inputs, has_outputs)
+        self.setupEditor()
+        self.adjustSize()
+        
+    def createPortTable(self, has_inputs=True, has_outputs=True):
+        if has_inputs:
+            self.inputPortTable = PortTable(self)
+            labels = ["Input Port Name", "Type"]
+            self.inputPortTable.setHorizontalHeaderLabels(labels)
+            self.inputPortTable.initializePorts(self.module.input_port_specs)
+            self.layout().addWidget(self.inputPortTable)
+        if has_outputs:
+            self.outputPortTable = PortTable(self)
+            labels = ["Output Port Name", "Type"]
+            self.outputPortTable.setHorizontalHeaderLabels(labels)
+            self.outputPortTable.initializePorts(self.module.output_port_specs, 
+                                                 True)
+            self.layout().addWidget(self.outputPortTable)
+        if has_inputs and has_outputs:
+            self.performPortConnection(self.connect)
+        if has_inputs:
+            self.inputPortTable.fixGeometry()
+        if has_outputs:
+            self.outputPortTable.fixGeometry()
+            
+    def initializeCode(self):
+        self.codeEditor.clear()
+        fid = self.findSourceFunction()
+        code = None
+        # Get code from a function
+        if fid!=-1:
+            f = self.module.functions[fid]
+            code = f.params[0].strValue
+        # Get code from the default on the port
+        else:
+            port = self.module.get_port_spec(self.sourcePortName, 'input')
+            if port.defaults:
+                code, = port.defaults
+        if code is not None:
+            if self.sourceEncode:
+                code = urllib.unquote(code)
+            self.codeEditor.setPlainText(code)
+        if self.codeEditor.__class__.__name__ not in ['_PythonEditor', '_TextEditor']:
+            self.codeEditor.document().setModified(False)
+        else:
+            self.codeEditor.setModified(False)
+        self.codeEditor.setFocus()
+        
+    def findSourceFunction(self):
+        fid = -1
+        for i in xrange(self.module.getNumFunctions()):
+            if self.module.functions[i].name==self.sourcePortName:
+                fid = i
+                break
+        return fid
+    
+    def setupEditor(self):
+        self.initializeCode()
+        self.layout().addWidget(self.codeEditor, 1)
+        
+        self.cursorLabel = QtGui.QLabel()
+        self.layout().addWidget(self.cursorLabel)
+        if self.codeEditor.__class__.__name__ not in ['_PythonEditor', '_TextEditor']:
+            self.connect(self.codeEditor,
+                         QtCore.SIGNAL('cursorPositionChanged()'),
+                         self.updateCursorLabel)
+        else:
+            self.connect(self.codeEditor,
+                         QtCore.SIGNAL('cursorPositionChanged(int, int)'),
+                         self.updateCursorLabel)
+        self.updateCursorLabel()
+            
+    def updateCursorLabel(self, x=0, y=0):
+        if self.codeEditor.__class__.__name__ not in ['_PythonEditor', '_TextEditor']:
+            cursor = self.codeEditor.textCursor()
+            x = cursor.blockNumber()
+            y = cursor.columnNumber()
+            
+        self.cursorLabel.setText('Line: %d / Col: %d' % (x+1, y+1))
+    
+    def sizeHint(self):
+        return QtCore.QSize(512, 512)
+    
+    def performPortConnection(self, operation):
+        operation(self.inputPortTable.horizontalHeader(),
+                  QtCore.SIGNAL('sectionResized(int,int,int)'),
+                  self.portTableResize)
+        operation(self.outputPortTable.horizontalHeader(),
+                  QtCore.SIGNAL('sectionResized(int,int,int)'),
+                  self.portTableResize)
+
+    def portTableResize(self, logicalIndex, oldSize, newSize):
+        self.performPortConnection(self.disconnect)
+        if self.inputPortTable.horizontalHeader().sectionSize(logicalIndex)!=newSize:
+            self.inputPortTable.horizontalHeader().resizeSection(logicalIndex,newSize)
+        if self.outputPortTable.horizontalHeader().sectionSize(logicalIndex)!=newSize:
+            self.outputPortTable.horizontalHeader().resizeSection(logicalIndex,newSize)
+        self.performPortConnection(self.connect)
+    
+    def activate(self):
+        self.codeEditor.setFocus(QtCore.Qt.MouseFocusReason)
+            
+class SourceViewerWidget(SourceWidget):
+    def __init__(self, module, controller, editor_class=None,
+                 has_inputs=True, has_outputs=True, parent=None,
+                 encode=True, portName='source'):
+        SourceWidget.__init__(self, module, controller, editor_class,
+                              has_inputs, has_outputs, parent, encode, 
+                              portName)
+        self.codeEditor.setReadOnly(True)
+        self.createCloseButton()
+        self.setWindowTitle('%s Configuration (Read-Only)' % module.name)
+        self.setWindowFlags(QtCore.Qt.Window)
+        self.adjustSize()
+        
+    def createPortTable(self, has_inputs=True, has_outputs=True):
+        if has_inputs:
+            self.inputPortTable = QtGui.QTableWidget(1, 2, self)
+            labels = ["Input Port Name", "Type"]
+            self.inputPortTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Interactive)
+            self.inputPortTable.horizontalHeader().setMovable(False)
+            self.inputPortTable.horizontalHeader().setStretchLastSection(True)
+            self.inputPortTable.setHorizontalHeaderLabels(labels)
+            self.initializePorts(self.inputPortTable, 
+                                 self.module.input_port_specs)
+            self.layout().addWidget(self.inputPortTable)
+        if has_outputs:
+            self.outputPortTable = QtGui.QTableWidget(1, 2, self)
+            labels = ["Output Port Name", "Type"]
+            self.outputPortTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Interactive)
+            self.outputPortTable.horizontalHeader().setMovable(False)
+            self.outputPortTable.horizontalHeader().setStretchLastSection(True)
+            
+            self.outputPortTable.setHorizontalHeaderLabels(labels)
+            self.initializePorts(self.outputPortTable, 
+                                 self.module.output_port_specs, True)
+            self.layout().addWidget(self.outputPortTable)
+        if has_inputs and has_outputs:
+            self.performPortConnection(self.connect)
+            
+        if has_inputs:
+            self.fixTableGeometry(self.inputPortTable)
+        if has_outputs:
+            self.fixTableGeometry(self.outputPortTable)
+            
+    def initializePorts(self, table, port_specs, reverse_order=False):
+        if reverse_order:
+            port_specs_iter = reversed(port_specs)
+        else:
+            port_specs_iter = port_specs
+        for p in port_specs_iter:
+            row = table.rowCount()-1
+            sigstring = p.sigstring[1:-1]
+            siglist = sigstring.split(':')
+            short_name = "%s (%s)" % (siglist[1], siglist[0])
+            item = QtGui.QTableWidgetItem(p.name)
+            item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
+            table.setItem(row, 0, item)
+            item = QtGui.QTableWidgetItem(short_name)
+            item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
+            table.setItem(row, 1, item)
+            table.setRowCount(table.rowCount()+1)
+        
+    def fixTableGeometry(self, table):
+        rect = table.visualRect(table.model().index(table.rowCount()-1,
+                                                    table.columnCount()-1))
+        table.setFixedHeight(table.horizontalHeader().height()+
+                             rect.y()+rect.height()+1)
+    def createCloseButton(self):
+        hboxlayout = QtGui.QHBoxLayout()
+        self.closeButton = QtGui.QPushButton("Close")
+        self.connect(self.closeButton, QtCore.SIGNAL("clicked()"),
+                     self.closeWidget)
+        hboxlayout.addStretch()
+        hboxlayout.addWidget(self.closeButton)
+        hboxlayout.addStretch()
+        self.layout().addLayout(hboxlayout) 
+        
+    def closeWidget(self):
+        self.emit(QtCore.SIGNAL("widgetClosed"))
+        self.close()
+        
+class SourceConfigurationWidget(SourceWidget):
+
+    def __init__(self, module, controller, editor_class=None,
+                 has_inputs=True, has_outputs=True, parent=None,
+                 encode=True, portName='source'):
+        SourceWidget.__init__(self, module, controller, editor_class,
+                              has_inputs, has_outputs, parent, encode, 
+                              portName)
+        self.detached_windows = []
+        self.createButtons()
+        #connect signals
+        if has_inputs:
+            self.connect(self.inputPortTable, QtCore.SIGNAL("contentsChanged"),
+                         self.updateState)
+        if has_outputs:
+            self.connect(self.outputPortTable, QtCore.SIGNAL("contentsChanged"),
+                         self.updateState)
+        self.connect(self.codeEditor, QtCore.SIGNAL("textChanged()"),
+                     self.updateState)
+        self.adjustSize()
+        self.setMouseTracking(True)
+        self.mouseOver = False
+    
+    def enterEvent(self, event):
+        self.mouseOver = True
+        
+    def leaveEvent(self, event):
+        self.mouseOver = False
+         
+    def createButtons(self):
+        """ createButtons() -> None
+        Create and connect signals to Save & Reset button
+        
+        """
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.detachButton = QtGui.QPushButton("Show read-only window")
+        self.buttonLayout.addWidget(self.detachButton)
+        self.buttonLayout.addStretch()
+        self.saveButton = QtGui.QPushButton('&Save', self)
+        self.saveButton.setFixedWidth(100)
+        self.saveButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.saveButton)
+        self.resetButton = QtGui.QPushButton('&Reset', self)
+        self.resetButton.setFixedWidth(100)
+        self.resetButton.setEnabled(False)
+        self.buttonLayout.addSpacing(10)
+        self.buttonLayout.addWidget(self.resetButton)
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.detachButton, QtCore.SIGNAL("clicked()"),
+                     self.detachReadOnlyWindow)
+        self.connect(self.saveButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.saveTriggered)
+        self.connect(self.resetButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.resetTriggered)        
+        
+    def detachReadOnlyWindow(self):
+        from vistrails.gui.vistrails_window import _app
+        widget = SourceViewerWidget(self.module, self.controller,
+                                           type(self.codeEditor), 
+                                           self.has_inputs, self.has_outputs,
+                                           None, self.sourceEncode, 
+                                           self.sourcePortName)
+        window = QtGui.QMainWindow()
+        window.setCentralWidget(widget)
+        window.setWindowTitle(widget.windowTitle())
+        self.connect(widget, QtCore.SIGNAL("widgetClosed"),
+                    window.close)
+        widget.setVisible(True)
+        _app.palette_window.windows.append(window)
+        window.show()
+        
+    def updateVistrail(self):
+        """updateVistrail() -> None
+        Update vistrail to contain changes to the python source
+
+        """
+        deleted_ports = []
+        added_ports = []
+        if self.has_inputs:
+            (input_deleted_ports, input_added_ports) = \
+                self.getPortDiff('input', self.inputPortTable)
+            deleted_ports.extend(input_deleted_ports)
+            added_ports.extend(input_added_ports)
+        if self.has_outputs:
+            (output_deleted_ports, output_added_ports) = \
+                self.getPortDiff('output', self.outputPortTable)
+            deleted_ports.extend(output_deleted_ports)
+            added_ports.extend(output_added_ports)
+
+        functions = []
+        modified = False
+        if self.codeEditor.__class__.__name__ not in ['_PythonEditor', '_TextEditor']:
+            modified = self.codeEditor.document().isModified()
+        else:
+            modified = self.codeEditor.isModified()
+        
+        if (self.codeEditor is not None and modified):
+            try:
+                code = str(self.codeEditor.toPlainText())
+            except UnicodeEncodeError, e:
+                debug.critical('Source Code Editor does not support non-ascii characters', str(e)) 
+                return False
+            if self.sourceEncode:
+                code = urllib.quote(code)
+            functions.append((self.sourcePortName, [code]))
+        if len(deleted_ports) + len(added_ports) + len(functions) == 0:
+            # nothing changed
+            return True
+        try:
+            self.controller.update_ports_and_functions(self.module.id, 
+                                                       deleted_ports, 
+                                                       added_ports,
+                                                       functions)
+        except PortAlreadyExists, e:
+            debug.critical('Port Already Exists %s' % str(e))
+            return False
+        return True
+    
+    def resetTriggered(self, checked = False):
+        if self.has_inputs:
+            self.inputPortTable.clearContents()
+            self.inputPortTable.setRowCount(1)
+            self.inputPortTable.initializePorts(self.module.input_port_specs)
+            self.inputPortTable.fixGeometry()
+        if self.has_outputs:
+            self.outputPortTable.clearContents()
+            self.outputPortTable.setRowCount(1)
+            self.outputPortTable.initializePorts(self.module.output_port_specs, 
+                                             True)
+            self.outputPortTable.fixGeometry()
+            
+        self.initializeCode()
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL("stateChanged"))
+        
+    def updateState(self):
+        self.saveButton.setEnabled(True)
+        self.resetButton.setEnabled(True)
+        if not self.state_changed:
+            self.state_changed = True
+            self.emit(QtCore.SIGNAL("stateChanged"))
+    
+#    def focusOutEvent(self, event):
+        #if not self.mouseOver:
+        #    self.askToSaveChanges()
+#        QtGui.QWidget.focusOutEvent(self, event)  
diff --git a/vistrails/gui/modules/string_configure.py b/vistrails/gui/modules/string_configure.py
new file mode 100644
index 0000000..059ef5e
--- /dev/null
+++ b/vistrails/gui/modules/string_configure.py
@@ -0,0 +1,154 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.bundles.pyimport import py_import
+import vistrails.core.requirements
+from vistrails.gui.modules.source_configure import SourceConfigurationWidget
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.theme import CurrentTheme
+
+def TextEditor(parent=None):
+    try:
+        py_import('PyQt4.Qsci', {'linux-ubuntu': 'python-qscintilla2'})
+    except ImportError:
+        return OldTextEditor(parent)
+    else:
+        return NewTextEditor(parent)
+
+def NewTextEditor(parent):
+    vistrails.core.requirements.require_python_module('PyQt4.Qsci')
+    from PyQt4.Qsci import QsciScintilla
+    class _TextEditor(QsciScintilla):
+    
+        def __init__(self, parent=None):
+            QsciScintilla.__init__(self, parent)
+            ## set the default font of the editor
+            ## and take the same font for line numbers
+            font = CurrentTheme.PYTHON_SOURCE_EDITOR_FONT
+            self.setFont(font)
+            fm = QtGui.QFontMetrics(font)
+        
+            ## Line numbers
+            # conventionally, margin 0 is for line numbers
+            self.setMarginWidth(0, fm.width( "0000" ) + 4)
+            self.setMarginLineNumbers(0, True)
+
+            self.setAutoIndent(True)
+
+            ## Edge Mode shows a red vetical bar at 80 chars
+            self.setEdgeMode(QsciScintilla.EdgeLine)
+            self.setEdgeColumn(80)
+            self.setEdgeColor(QtGui.QColor("#CCCCCC"))
+        
+            ## Folding visual : we will use boxes
+            self.setFolding(QsciScintilla.BoxedTreeFoldStyle)
+        
+            ## Braces matching
+            self.setBraceMatching(QsciScintilla.SloppyBraceMatch)
+        
+            ## Editing line color
+        #    self.setCaretLineVisible(True)
+        #    self.setCaretLineBackgroundColor(QtGui.QColor("#CDA869"))
+            
+            
+                    ## Margins colors
+            # line numbers margin
+            self.setMarginsBackgroundColor(QtGui.QColor("#FFFFFF"))
+            self.setMarginsForegroundColor(QtGui.QColor("#000000"))
+        
+            # folding margin colors (foreground,background)
+            self.setFoldMarginColors(QtGui.QColor("#DDDDDD"),QtGui.QColor("#DDDDDD"))
+            # do not use tabs
+            self.setIndentationsUseTabs(False)
+            self.setTabWidth(4)
+            self.setTabIndents(True)
+        
+            # set autocompletion
+            self.setAutoCompletionThreshold(2)
+            self.setAutoCompletionSource(QsciScintilla.AcsDocument)
+            self.setAutoCompletionCaseSensitivity(True)
+            self.setAutoCompletionReplaceWord(True)
+            self.setAutoCompletionFillupsEnabled(True)
+            
+        def setPlainText(self, text):
+            """ setPlainText(text: str) -> None
+            redirect to setText
+            
+            """
+            self.setText(text)
+        
+        def toPlainText(self):
+            """ setPlainText(text: str) -> None
+            redirect to self.text()
+            
+            """
+            text = self.text()
+            return text.replace('\r', '\n')
+    
+#        def focusOutEvent(self, event):
+#            if self.parent():
+#                QtCore.QCoreApplication.sendEvent(self.parent(), event)
+#            QsciScintilla.focusOutEvent(self, event)
+
+    return _TextEditor(parent)
+
+class OldTextEditor(QtGui.QTextEdit):
+
+    def __init__(self, parent=None):
+        QtGui.QTextEdit.__init__(self, parent)
+        self.setLineWrapMode(QtGui.QTextEdit.NoWrap)
+        self.formatChanged(None)
+        self.setCursorWidth(8)
+        self.connect(self,
+                     QtCore.SIGNAL('currentCharFormatChanged(QTextCharFormat)'),
+                     self.formatChanged)
+
+    def formatChanged(self, f):
+        self.setFont(CurrentTheme.PYTHON_SOURCE_EDITOR_FONT)
+
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QKeyEvent) -> Nont
+        Handle tab with 4 spaces
+        
+        """
+        if event.key()==QtCore.Qt.Key_Tab:
+            self.insertPlainText('    ')
+        else:
+            # super(PythonEditor, self).keyPressEvent(event)
+            QtGui.QTextEdit.keyPressEvent(self, event)
+            
+class TextConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, 
+                                           TextEditor, False, False, parent, False, portName='value')
diff --git a/vistrails/gui/modules/tuple_configuration.py b/vistrails/gui/modules/tuple_configuration.py
new file mode 100644
index 0000000..7e42352
--- /dev/null
+++ b/vistrails/gui/modules/tuple_configuration.py
@@ -0,0 +1,578 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file specifies the configuration widget for Tuple
+module. This should be used as a template for creating a configuration
+for other modules. The widget here should inherit from
+vistrails.gui.modules.module_configure.StandardModuleConfigurationWidget,
+which is also a QWidget.
+
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core import debug
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.modules.module_registry import get_module_registry, \
+    ModuleRegistryException
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.core.utils import PortAlreadyExists
+from vistrails.gui.modules.module_configure import StandardModuleConfigurationWidget
+from vistrails.gui.utils import show_question, SAVE_BUTTON, DISCARD_BUTTON
+
+############################################################################
+
+class PortTable(QtGui.QTableWidget):
+    def __init__(self, parent=None):
+        QtGui.QTableWidget.__init__(self,1,2,parent)
+        self.horizontalHeader().setResizeMode(QtGui.QHeaderView.Interactive)
+        self.horizontalHeader().setMovable(False)
+        self.horizontalHeader().setStretchLastSection(True)
+        self.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
+        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        self.delegate = PortTableItemDelegate(self)
+        self.setItemDelegate(self.delegate)
+        self.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.connect(self.model(),
+                     QtCore.SIGNAL('dataChanged(QModelIndex,QModelIndex)'),
+                     self.handleDataChanged)
+        self.connect(self.delegate, QtCore.SIGNAL("modelDataChanged"),
+                     self, QtCore.SIGNAL("contentsChanged"))
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        #self.setMouseTracking(True)
+        #self.mouseOver = False
+        
+    def sizeHint(self):
+        return QtCore.QSize()
+
+    def fixGeometry(self):
+        rect = self.visualRect(self.model().index(self.rowCount()-1,
+                                                  self.columnCount()-1))
+        self.setFixedHeight(self.horizontalHeader().height()+
+                            rect.y()+rect.height()+1)
+
+    def handleDataChanged(self, topLeft, bottomRight):
+        if topLeft.column()==0:
+            text = str(self.model().data(topLeft, QtCore.Qt.DisplayRole))
+            changedGeometry = False
+            if text!='' and topLeft.row()==self.rowCount()-1:
+                self.setRowCount(self.rowCount()+1)
+                changedGeometry = True
+            if text=='' and topLeft.row()<self.rowCount()-1:
+                self.removeRow(topLeft.row())
+                changedGeometry = True
+            if changedGeometry:
+                self.fixGeometry()
+            self.emit(QtCore.SIGNAL("contentsChanged"))
+
+    def initializePorts(self, port_specs, reverse_order=False):
+        self.disconnect(self.model(),
+                        QtCore.SIGNAL('dataChanged(QModelIndex,QModelIndex)'),
+                        self.handleDataChanged)
+        if reverse_order:
+            port_specs_iter = reversed(port_specs)
+        else:
+            port_specs_iter = port_specs
+        for p in port_specs_iter:
+            model = self.model()
+            sigstring = p.sigstring[1:-1]
+            siglist = sigstring.split(':')
+            short_name = "%s (%s)" % (siglist[1], siglist[0])
+            model.setData(model.index(self.rowCount()-1, 1),
+                          sigstring,
+                          QtCore.Qt.UserRole)
+            model.setData(model.index(self.rowCount()-1, 1),
+                          short_name,
+                          QtCore.Qt.DisplayRole)
+            model.setData(model.index(self.rowCount()-1, 0),
+                          p.name,
+                          QtCore.Qt.DisplayRole)
+            self.setRowCount(self.rowCount()+1)
+        self.connect(self.model(),
+                     QtCore.SIGNAL('dataChanged(QModelIndex,QModelIndex)'),
+                     self.handleDataChanged)
+            
+    def getPorts(self):
+        ports = []
+        model = self.model()
+        for i in xrange(self.rowCount()):
+            name = model.data(model.index(i, 0),
+                              QtCore.Qt.DisplayRole)
+            sigstring = model.data(model.index(i, 1),
+                                   QtCore.Qt.UserRole)
+            if name is not None and sigstring is not None:
+                ports.append((name, '(%s)' % sigstring, i))
+        return ports
+
+#    def focusOutEvent(self, event):
+#        if self.parent():
+#            QtCore.QCoreApplication.sendEvent(self.parent(), event)
+#        QtGui.QTableWidget.focusOutEvent(self, event)
+
+
+class CompletingComboBox(QtGui.QComboBox):
+    def __init__(self, parent):
+        QtGui.QComboBox.__init__(self, parent)
+        self.setEditable(True)
+        self.setInsertPolicy(QtGui.QComboBox.NoInsert)
+        self._last_good_index = -1
+
+    def select_default_item(self, initial_idx):
+        self.setCurrentIndex(initial_idx)
+        self._last_good_index = initial_idx
+
+    def validate_input(self):
+        invalid = (self.currentIndex() == -1 or
+                   self.itemData(self.currentIndex()) == '')
+        completion = self.completer().currentCompletion()
+        if completion:
+            idx = self.findText(completion)
+            if idx:
+                invalid = False
+                self.setCurrentIndex(idx)
+        if invalid and self._last_good_index != -1:
+            self.setCurrentIndex(self._last_good_index)
+        elif invalid:
+            self.setEditText('')
+        else:
+            self._last_good_index = self.currentIndex()
+            self.setEditText(self.itemText(self.currentIndex()))
+
+
+class PortTableItemDelegate(QtGui.QItemDelegate):
+
+    def createEditor(self, parent, option, index):
+        registry = get_module_registry()
+        if index.column()==1: #Port type
+            combo = CompletingComboBox(parent)
+            # FIXME just use descriptors here!!
+            variant_desc = registry.get_descriptor_by_name(
+                get_vistrails_basic_pkg_id(), 'Variant')
+            for _, pkg in sorted(registry.packages.iteritems()):
+                pkg_item = QtGui.QStandardItem("----- %s -----" % pkg.name)
+                pkg_item.setData('', QtCore.Qt.UserRole)
+                pkg_item.setFlags(pkg_item.flags() & ~(
+                        QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable))
+                font = pkg_item.font()
+                font.setBold(True)
+                pkg_item.setFont(font)
+                combo.model().appendRow(pkg_item)
+                for _, descriptor in sorted(pkg.descriptors.iteritems()):
+                    if descriptor is variant_desc:
+                        variant_index = combo.count()
+                    combo.addItem("%s (%s)" % (descriptor.name,
+                                               descriptor.identifier),
+                                  descriptor.sigstring)
+
+            combo.select_default_item(variant_index)
+            return combo
+        else:
+            return QtGui.QItemDelegate.createEditor(self, parent, option, index)
+
+    def setEditorData(self, editor, index):
+        if index.column()==1:
+            data = index.model().data(index, QtCore.Qt.UserRole)
+            editor.setCurrentIndex(editor.findData(data))
+        else:
+            QtGui.QItemDelegate.setEditorData(self, editor, index)
+
+    def setModelData(self, editor, model, index):
+        if index.column()==1:
+            editor.validate_input()
+            model.setData(index, editor.itemData(editor.currentIndex()), 
+                          QtCore.Qt.UserRole)
+            model.setData(index, editor.currentText(), 
+                          QtCore.Qt.DisplayRole)
+        else:
+            QtGui.QItemDelegate.setModelData(self, editor, model, index)
+        self.emit(QtCore.SIGNAL("modelDataChanged"))
+
+############################################################################
+
+class PortTableConfigurationWidget(StandardModuleConfigurationWidget):
+    """
+    PortTableConfigurationWidget is the configuration widget for a
+    tuple-like module, we want to build an interface for specifying a
+    number of input (output) ports and the type of each port. Then
+    compose (decompose) a tuple of those input as a result.
+
+    When subclassing StandardModuleConfigurationWidget, there are
+    only two things we need to care about:
+    
+    1) The builder will provide the VistrailController (through the
+       constructor) associated with the pipeline the module is in. The
+       configuration widget can use the controller to change the
+       current vistrail such as delete connections, add/delete module
+       port...
+
+    2) The builder also provide the current Module object (through the
+       constructor) of the module. This is the instance of the module
+       in the pipeline. Changes to this Module object usually will not
+       result a new version in the current Vistrail. Such changes are
+       change the visibility of input/output ports on the builder,
+       change module color.
+
+       Each module has a local set of input and output ports that may
+       change, unlike those stored by the global registry. The same
+       module can have different types of input ports at two different
+       time in the same vistrail.
+
+    That's it, the rest of the widget will be just like a regular Qt
+    widget.
+    
+    """
+    def __init__(self, module, controller, parent=None):
+        """ PortTableConfigurationWidget(module: Module,
+                                         controller: VistrailController,
+                                         parent: QWidget)
+                                         -> PortTableConfigurationWidget                                       
+        Let StandardModuleConfigurationWidget constructor store the
+        controller/module object from the builder and set up the
+        configuration widget.        
+        After StandardModuleConfigurationWidget constructor, all of
+        these will be available:
+        self.module : the Module object int the pipeline        
+        self.controller: the current vistrail controller
+                                       
+        """
+        StandardModuleConfigurationWidget.__init__(self, module,
+                                                   controller, parent)
+
+    def updateVistrail(self):
+        msg = "Must implement updateVistrail in subclass"
+        raise VistrailsInternalError(msg)
+
+    def createButtons(self):
+        """ createButtons() -> None
+        Create and connect signals to Ok & Cancel button
+        
+        """
+        self.buttonLayout = QtGui.QHBoxLayout()
+        self.buttonLayout.setMargin(5)
+        self.saveButton = QtGui.QPushButton('&Save', self)
+        self.saveButton.setFixedWidth(100)
+        self.saveButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.saveButton)
+        self.resetButton = QtGui.QPushButton('&Reset', self)
+        self.resetButton.setFixedWidth(100)
+        self.resetButton.setEnabled(False)
+        self.buttonLayout.addWidget(self.resetButton)
+        self.layout().addLayout(self.buttonLayout)
+        self.connect(self.saveButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.saveTriggered)
+        self.connect(self.resetButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.resetTriggered)        
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return the recommended size of the configuration window
+        
+        """
+        return QtCore.QSize(512, 256)
+
+    def saveTriggered(self, checked = False):
+        """ saveTriggered(checked: bool) -> None
+        Update vistrail controller and module when the user click Ok
+        
+        """
+        if self.updateVistrail():
+            self.saveButton.setEnabled(False)
+            self.resetButton.setEnabled(False)
+            self.state_changed = False
+            self.emit(QtCore.SIGNAL("stateChanged"))
+            self.emit(QtCore.SIGNAL('doneConfigure'), self.module.id)
+            
+    def resetTriggered(self, checked = False):
+        self.state_changed = False
+    
+    def closeEvent(self, event):
+        self.askToSaveChanges()
+        event.accept()
+        
+    def getRegistryPorts(self, registry, type):
+        if not registry:
+            return []
+        if type == 'input':
+            getter = registry.destination_ports_from_descriptor
+        elif type == 'output':
+            getter = registry.source_ports_from_descriptor
+        else:
+            raise VistrailsInternalError("Unrecognized port type '%s'", type)
+
+        ports = []
+        try:
+            ports = [(p.name, p.sigstring) 
+                     for p in getter(self.module.module_descriptor)] 
+        except ModuleRegistryException:
+            pass
+        return ports
+        
+    def registryChanges(self, old_ports, new_ports):
+        deleted_ports = [p for p in old_ports if p not in new_ports]
+        added_ports = [p for p in new_ports if p not in old_ports]
+        return (deleted_ports, added_ports)
+    
+    def getPortDiff(self, p_type, port_table):
+        if p_type == 'input':
+            old_ports = [(p.name, p.sigstring, p.sort_key)
+                         for p in self.module.input_port_specs]
+        elif p_type == 'output':
+            old_ports = [(p.name, p.sigstring, p.sort_key) 
+                         for p in self.module.output_port_specs]
+        else:
+            old_ports = []
+        # old_ports = self.getRegistryPorts(self.module.registry, p_type)
+        new_ports = port_table.getPorts()
+        (deleted_ports, added_ports) = \
+            self.registryChanges(old_ports, new_ports)
+        deleted_ports = [(p_type,) + p for p in deleted_ports]
+        added_ports = [(p_type,) + p for p in added_ports]
+        return (deleted_ports, added_ports)
+    
+class TupleConfigurationWidget(PortTableConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        """ TupleConfigurationWidget(module: Module,
+                                     controller: VistrailController,
+                                     parent: QWidget)
+                                     -> TupleConfigurationWidget
+
+        Let StandardModuleConfigurationWidget constructor store the
+        controller/module object from the builder and set up the
+        configuration widget.        
+        After StandardModuleConfigurationWidget constructor, all of
+        these will be available:
+        self.module : the Module object int the pipeline        
+        self.controller: the current vistrail controller
+                                       
+        """
+        PortTableConfigurationWidget.__init__(self, module,
+                                              controller, parent)
+
+        # Give it a nice window title
+        self.setWindowTitle('Tuple Configuration')
+
+        # Add an empty vertical layout
+        centralLayout = QtGui.QVBoxLayout()
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)
+        self.setLayout(centralLayout)
+        
+        # Then add a PortTable to our configuration widget
+        self.portTable = PortTable(self)
+        self.portTable.setHorizontalHeaderLabels(
+            ['Input Port Name', 'Type'])
+        
+        # We know that the Tuple module initially doesn't have any
+        # input port, we just use the local registry to see what ports
+        # it has at the time of configuration.
+        self.portTable.initializePorts(self.module.input_port_specs)
+        self.portTable.fixGeometry()
+        centralLayout.addWidget(self.portTable)
+
+        # We need a padded widget to take all vertical white space away
+        paddedWidget = QtGui.QWidget(self)
+        paddedWidget.setSizePolicy(QtGui.QSizePolicy.Ignored,
+                                   QtGui.QSizePolicy.Expanding)
+        centralLayout.addWidget(paddedWidget, 1)
+
+        # Then we definitely need a Save & Reset button
+        self.createButtons()
+        
+        #Connect signals
+        self.connect(self.portTable, QtCore.SIGNAL("contentsChanged"),
+                     self.updateState)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        #self.setMouseTracking(True)
+        #self.mouseOver = False
+#        
+#    def enterEvent(self, event):
+#        self.mouseOver = True
+#        
+#    def leaveEvent(self, event):
+#        self.mouseOver = False
+        
+
+    def updateVistrail(self):
+        """ updateVistrail() -> None
+        Update Vistrail to contain changes in the port table
+        
+        """
+        (deleted_ports, added_ports) = self.getPortDiff('input', self.portTable)
+        if len(deleted_ports) + len(added_ports) == 0:
+            # nothing changed
+            return
+        current_ports = self.portTable.getPorts()
+        # note that the sigstring and sort_key for deletion doesn't matter
+        deleted_ports.append(('output', 'value'))
+        if len(current_ports) > 0:
+            spec = "(" + ','.join(p[1][1:-1] for p in current_ports) + ")"
+            added_ports.append(('output', 'value', spec, -1))
+        try:
+            self.controller.update_ports(self.module.id, deleted_ports, 
+                                         added_ports)
+        except PortAlreadyExists, e:
+            debug.critical('Port Already Exists %s' % str(e))
+            return False
+        return True            
+    
+    def resetTriggered(self, checked = False):
+        self.portTable.clearContents()
+        self.portTable.setRowCount(1)
+        self.portTable.initializePorts(self.module.input_port_specs)
+        self.portTable.fixGeometry()
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL("stateChanged"))
+
+    def updateState(self):
+        if not self.hasFocus():
+            self.setFocus(QtCore.Qt.TabFocusReason)
+        self.saveButton.setEnabled(True)
+        self.resetButton.setEnabled(True)
+        if not self.state_changed:
+            self.state_changed = True
+            self.emit(QtCore.SIGNAL("stateChanged"))
+            
+#    def focusOutEvent(self, event):
+        #if not self.mouseOver:
+        #    self.askToSaveChanges()
+#        QtGui.QWidget.focusOutEvent(self, event)
+                
+class UntupleConfigurationWidget(PortTableConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        """ UntupleConfigurationWidget(module: Module,
+                                     controller: VistrailController,
+                                     parent: QWidget)
+                                     -> UntupleConfigurationWidget                                       
+        Let StandardModuleConfigurationWidget constructor store the
+        controller/module object from the builder and set up the
+        configuration widget.        
+        After StandardModuleConfigurationWidget constructor, all of
+        these will be available:
+        self.module : the Module object int the pipeline        
+        self.controller: the current vistrail controller
+                                       
+        """
+        PortTableConfigurationWidget.__init__(self, module,
+                                              controller, parent)
+
+        # Give it a nice window title
+        self.setWindowTitle('Untuple Configuration')
+
+        # Add an empty vertical layout
+        centralLayout = QtGui.QVBoxLayout()
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)
+        self.setLayout(centralLayout)
+        
+        # Then add a PortTable to our configuration widget
+        self.portTable = PortTable(self)
+        self.portTable.setHorizontalHeaderLabels(
+            ['Output Port Name', 'Type'])
+        
+        # We know that the Tuple module initially doesn't have any
+        # input port, we just use the local registry to see what ports
+        # it has at the time of configuration.
+        self.portTable.initializePorts(self.module.output_port_specs, True)
+        self.portTable.fixGeometry()
+        centralLayout.addWidget(self.portTable)
+
+        # We need a padded widget to take all vertical white space away
+        paddedWidget = QtGui.QWidget(self)
+        paddedWidget.setSizePolicy(QtGui.QSizePolicy.Ignored,
+                                   QtGui.QSizePolicy.Expanding)
+        centralLayout.addWidget(paddedWidget, 1)
+
+        # Then we definitely need a Save & Reset button
+        self.createButtons()
+        
+        #Connect signals
+        self.connect(self.portTable, QtCore.SIGNAL("contentsChanged"),
+                     self.updateState)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        #self.setMouseTracking(True)
+        #self.mouseOver = False
+        
+    def updateVistrail(self):
+        """ updateVistrail() -> None
+        Update Vistrail to contain changes in the port table
+        
+        """
+        (deleted_ports, added_ports) = self.getPortDiff('output', 
+                                                        self.portTable)
+        if len(deleted_ports) + len(added_ports) == 0:
+            # nothing changed
+            return
+        current_ports = self.portTable.getPorts()
+        # note that the sigstring for deletion doesn't matter
+        deleted_ports.append(('input', 'value'))
+        if len(current_ports) > 0:
+            spec = "(" + ','.join(p[1][1:-1] for p in current_ports) + ")"
+            added_ports.append(('input', 'value', spec, -1))
+        try:
+            self.controller.update_ports(self.module.id, deleted_ports, 
+                                         added_ports)
+        except PortAlreadyExists, e:
+            debug.critical('Port Already Exists %s' % str(e))
+            return False
+        return True
+
+    def updateState(self):
+        if not self.hasFocus():
+            self.setFocus(QtCore.Qt.TabFocusReason)
+        self.saveButton.setEnabled(True)
+        self.resetButton.setEnabled(True)
+        if not self.state_changed:
+            self.state_changed = True
+            self.emit(QtCore.SIGNAL("stateChanged"))
+            
+#    def focusOutEvent(self, event):
+#        #if not self.mouseOver:
+#        #    self.askToSaveChanges()
+#        QtGui.QWidget.focusOutEvent(self, event)
+#        
+#    def enterEvent(self, event):
+#        self.mouseOver = True
+#        
+#    def leaveEvent(self, event):
+#        self.mouseOver = False
+    
+    def resetTriggered(self, checked = False):
+        self.portTable.clearContents()
+        self.portTable.setRowCount(1)
+        self.portTable.initializePorts(self.module.input_port_specs)
+        self.portTable.fixGeometry()
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL("stateChanged"))
diff --git a/vistrails/gui/open_db_window.py b/vistrails/gui/open_db_window.py
new file mode 100644
index 0000000..3a03b49
--- /dev/null
+++ b/vistrails/gui/open_db_window.py
@@ -0,0 +1,775 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" File for the window used when opening VisTrails objects from the database
+
+QOpenDBWindow
+QDBConnectionList
+QDBConnectionListItem
+QDBObjectList
+QDBObjectListItem
+QConnectionDBSetupWindow
+
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.db import VistrailsDBException
+import vistrails.db.services.io
+from vistrails.core.external_connection import ExtConnectionList, DBConnection
+from vistrails.core.db.locator import DBLocator
+from vistrails.core.system import default_connections_file
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import show_info, show_warning, show_question, \
+NO_BUTTON, YES_BUTTON
+from vistrails.core import debug
+
+class QOpenDBWindow(QtGui.QDialog):
+    """
+    QOpenDBWindow is a dialog containing two panels. the left panel shows all
+    the stored database connections and the right paanel shows the vistrails
+    available on the selected database connection.
+
+    """
+    _instance = None
+    def __init__(self, parent=None):
+        """ __init__(parent: QWidget) -> QOpenDBWindow
+        Construct the dialog with the two panels
+
+        """
+        QtGui.QDialog.__init__(self,parent)
+        self.setWindowTitle("Choose a vistrail")
+        self.save = False
+        mainLayout = QtGui.QVBoxLayout()
+        panelsLayout = QtGui.QGridLayout()
+
+        self.createActions()
+        self.saveasLayout = QtGui.QHBoxLayout()
+        self.saveasLabel = QtGui.QLabel("Save As:")
+        self.saveasEdt = QtGui.QLineEdit("")
+        self.saveasEdt.setFixedWidth(200)
+        self.saveasEdt.setSizePolicy(QtGui.QSizePolicy.Fixed,
+                                     QtGui.QSizePolicy.Fixed)
+        self.saveasLayout.addWidget(self.saveasLabel)
+        self.saveasLayout.addWidget(self.saveasEdt)
+        self.saveasLabel.setVisible(False)
+        self.saveasEdt.setVisible(False)
+        self.connectionList = QDBConnectionList(self)
+        self.objectList = QDBObjectList(self)
+
+        dbLabel = QtGui.QLabel("Databases:")
+        self.vtLabel = QtGui.QLabel("Vistrails: ")
+        
+        panelsLayout.addWidget(dbLabel,0,0,1,1)
+        panelsLayout.setColumnMinimumWidth(1,10)
+        panelsLayout.addWidget(self.vtLabel,0,2,1,2)
+        panelsLayout.addWidget(self.connectionList,1,0,1,1)
+        panelsLayout.addWidget(self.objectList,1,2,1,2)
+
+        self.addButton = QtGui.QToolButton()
+        self.addButton.setDefaultAction(self.addAct)
+        self.addButton.setAutoRaise(True)
+
+        self.removeButton = QtGui.QToolButton()
+        self.removeButton.setDefaultAction(self.removeAct)
+        self.removeButton.setAutoRaise(True)
+        self.removeButton.setEnabled(False)
+        
+        panelButtonsLayout = QtGui.QHBoxLayout()
+        panelButtonsLayout.setMargin(0)
+        panelButtonsLayout.setSpacing(0)
+        panelButtonsLayout.addWidget(self.addButton)
+        panelButtonsLayout.addWidget(self.removeButton)
+        panelsLayout.addLayout(panelButtonsLayout,2,0,1,1,
+                               QtCore.Qt.AlignLeft)
+        buttonsLayout = QtGui.QHBoxLayout()
+        self.cancelButton = QtGui.QPushButton('Cancel')
+        self.cancelButton.setAutoDefault(False)
+        self.openButton = QtGui.QPushButton('Open')
+        self.openButton.setEnabled(False)
+        self.openButton.setAutoDefault(True)
+        
+        buttonsLayout.addStretch(1)
+        buttonsLayout.addWidget(self.cancelButton)
+        buttonsLayout.addWidget(self.openButton)
+
+        mainLayout.addLayout(self.saveasLayout)
+        mainLayout.addLayout(panelsLayout)
+        mainLayout.addLayout(buttonsLayout)
+        mainLayout.setAlignment(self.saveasLayout, QtCore.Qt.AlignHCenter)
+        self.setLayout(mainLayout)
+        self.connectSignals()
+        QOpenDBWindow._instance = self
+
+    def createActions(self):
+        """ createActions() -> None
+        Create actions related to context menu 
+
+        """
+        self.addAct = QtGui.QAction("+", self)
+        self.addAct.setStatusTip("Create a new connection")
+        self.removeAct = QtGui.QAction("-", self)
+        self.removeAct.setStatusTip("Remove the selected connection from list")
+        
+    def showEvent(self, e):
+        """showEvent(e: QShowEvent) -> None
+        If the use doesn't have any connection set up, we will ask him
+        to create one.
+        
+        """
+        if self.connectionList.count() == 0:
+            text = "You don't seem to have any connection available. \
+Would you like to create one?"
+            res = show_question('Vistrails',
+                                text, 
+                                [NO_BUTTON, YES_BUTTON],
+                                NO_BUTTON)
+            if res == YES_BUTTON:
+                self.showConnConfig()
+        else:
+            self.updateDBObjectsList()
+
+    def connectSignals(self):
+        """ connectSignals() -> None
+        Map signals between GUI components        
+        
+        """
+        self.connect(self.cancelButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.reject)
+        self.connect(self.openButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.accept)
+        self.connect(self.addAct,
+                     QtCore.SIGNAL('triggered()'),
+                     self.showConnConfig)
+        self.connect(self.removeAct,
+                     QtCore.SIGNAL('triggered()'),
+                     self.connectionList.removeConnection)
+        self.connect(self.connectionList,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.updateDBObjectsList)
+        self.connect(self.connectionList,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.updateButtons)
+        self.connect(self.connectionList,
+                     QtCore.SIGNAL("reloadConnections"),
+                     self.updateDBObjectsList)
+        self.connect(self.objectList,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.updateButtons)
+        self.connect(self.saveasEdt,
+                     QtCore.SIGNAL('textChanged(QString)'),
+                     self.updateButtons)
+        self.connect(self.objectList,
+                     QtCore.SIGNAL('itemDoubleClicked(QListWidgetItem *)'),
+                     self.accept)
+
+    def updateDBObjectsList(self):
+        """ updateDBObjectsList() -> None
+        It reloads the vistrails object list for the selected connection. 
+        If nothing is selected, it will clear the list.
+
+        """
+        conn = self.connectionList.getCurrentItemId()
+        try:
+            self.objectList.updateContents(conn)
+        except VistrailsDBException, e:
+            self.connectionList.setCurrentItem(None)
+        self.updateEditButtons(conn)
+
+    def updateButtons(self):
+        """updateButtons() -> None
+        It will enable the open button if a vistrail is selected or in case
+        of saving a vistrail, if a connection is selected and the name is valid
+
+        """
+        vtlist = self.objectList
+        if not self.save:
+            if len(vtlist.selectedItems()) > 0:
+                self.openButton.setEnabled(True)
+            else:
+                self.openButton.setEnabled(False)
+        else:
+            if (len(self.connectionList.selectedItems()) > 0 and
+                self.saveasEdt.text() != '' and
+                len(vtlist.findItems(self.saveasEdt.text(),
+                                     QtCore.Qt.MatchFixedString)) == 0):
+                self.openButton.setEnabled(True)
+            else:
+                self.openButton.setEnabled(False)
+                
+    def updateEditButtons(self, id):
+        """updateEditButtons(id: int) -> None
+        It will enable/disable the connections buttons according to the
+        selection
+
+        """
+        if id != -1:
+            self.removeButton.setEnabled(True)
+        else:
+            self.removeButton.setEnabled(False)
+
+    def showConnConfig(self, *args, **keywords):
+        """showConnConfig(*args, **keywords) -> None
+        shows a window to configure the connection. The valid keywords
+        are defined in QConnectionDBSetupWindow.__init__()
+        
+        """
+        keywords["parent"] = self
+        
+        dialog = QConnectionDBSetupWindow(**keywords)
+        if dialog.exec_() == QtGui.QDialog.Accepted:
+            config = {'id': int(dialog.id),
+                      'name': str(dialog.nameEdt.text()),
+                      'host': str(dialog.hostEdt.text()),
+                      'port': int(dialog.portEdt.value()),
+                      'user': str(dialog.userEdt.text()),
+                      'passwd': str(dialog.passwdEdt.text()),
+                      'db': str(dialog.databaseEdt.text())}
+            id = self.connectionList.setConnectionInfo(**config)
+            self.connectionList.setCurrentId(id)
+            return True
+        else:
+            return False
+
+    def prepareForOpening(self, obj_type):
+        """prepareForOpening() -> None
+        It will prepare the dialog to be a Open Dialog
+        
+        """
+        self.setWindowTitle("Choose a %s" % obj_type.capitalize())
+        if obj_type != 'vistrail':
+            self.vtLabel.text = 'VisTrails %ss' % obj_type.capitalize()
+        else:
+            self.vtLabel.text = 'Vistrails'
+        self.save = False
+        self.objectList.obj_type = obj_type
+        self.objectList.setEnabled(True)
+        self.saveasLabel.setVisible(False)
+        self.saveasEdt.setVisible(False)
+        self.openButton.setEnabled(False)
+        self.openButton.setText("Open")
+
+    def prepareForSaving(self, obj_type):
+        """prepareForSaving() -> None
+        It will prepare the dialog to be a save as dialog 
+        
+        """
+        self.setWindowTitle("Save %s..." % obj_type.capitalize())
+        if obj_type != 'vistrail':
+            self.vtLabel.text = 'VisTrails %ss' % obj_type.capitalize()
+        else:
+            self.vtLabel.text = 'Vistrails'
+        self.save = True
+        self.objectList.obj_type = obj_type
+        self.objectList.setEnabled(False)
+        self.saveasLabel.setVisible(True)
+        self.saveasEdt.setVisible(True)
+        self.openButton.setText("Save")
+        self.openButton.setEnabled(False)
+        
+    @staticmethod
+    def getInstance():
+        """getInstance() -> QOpenDBWindow
+        Returns the current instance of the QOpenDBWindow
+
+        """
+        if QOpenDBWindow._instance is None:
+            QOpenDBWindow._instance = QOpenDBWindow()
+        return QOpenDBWindow._instance
+    
+    @staticmethod
+    def getOpenDBObject(obj_type):
+        """getOpenDBObject(obj_type : str) -> (dict,int)
+        Creates a dialog for opening a vistrails object from the database. 
+        It will return the selected connection configuration information and
+        the object id.
+        
+        """
+        if QOpenDBWindow._instance:
+            dlg = QOpenDBWindow._instance
+        else:
+            dlg = QOpenDBWindow()
+
+        dlg.prepareForOpening(obj_type)
+        
+        if dlg.exec_() == QtGui.QDialog.Accepted:
+            return (dlg.connectionList.getCurrentConnConfig(),
+                    dlg.objectList.currentItem().id,
+                    dlg.objectList.currentItem().name)
+        else:
+            return({},-1,'')
+
+    @staticmethod
+    def getSaveDBObject(obj_type):
+        """getSaveDBObject(obj_type : str) -> (dict, str)
+        Creates a dialog for saving a vistrails object to the database. 
+        It will return the selected connection configuration information 
+        and the object name
+
+        """
+        if QOpenDBWindow._instance:
+            dlg = QOpenDBWindow._instance
+        else:
+            dlg = QOpenDBWindow()
+
+        dlg.prepareForSaving(obj_type)
+
+        if dlg.exec_() == QtGui.QDialog.Accepted:
+            return (dlg.connectionList.getCurrentConnConfig(),
+                    str(dlg.saveasEdt.text()).strip(' \n\t'))
+        else:
+            return({},'')
+        
+################################################################################
+
+class QDBConnectionList(QtGui.QListWidget):
+    """
+    QDBConnection list is a widget to show the available databases
+
+    """
+    def __init__(self, parent=None):
+        QtGui.QListWidget.__init__(self,parent)
+        self.__list = ExtConnectionList.getInstance(default_connections_file())
+        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+        self.setIconSize(QtCore.QSize(32,32))
+        self.loadConnections()
+        self.editAct = QtGui.QAction("Edit", self)
+        self.editAct.setStatusTip("Edit the selected connection")
+        self.connect(self.editAct,
+                     QtCore.SIGNAL("triggered()"),
+                     self.editConnection)
+        
+    def getCurrentItemId(self):
+        """getCurrentItemId() -> int
+        Returns the id of the selected item. If there is no item selected,
+        it will return -1.
+
+        """
+        item = None
+        if len(self.selectedItems()) > 0:
+            item  = self.selectedItems()[0]
+        if item != None:
+            return int(item.id)
+        else:
+            return -1
+        
+    def contextMenuEvent(self, e):
+        """contextMenuEvent(e: QContextMenuEvent) -> None
+        Shows a popup menu for the connection
+
+        """
+        item = self.currentItem()
+        if item:
+            menu = QtGui.QMenu()
+            menu.addAction(self.editAct)
+            menu.exec_(e.globalPos())
+
+    def editConnection(self):
+        """editConnection() -> None
+        Method called to edit a connection. It will get the information
+        from the selected connection and show the dialog so the user can
+        update the fields
+        
+        """
+        conn_id = self.getCurrentItemId()
+        config = self.getConnectionInfo(conn_id)
+        if config != None:
+            config["create"] = False
+            self.parent().showConnConfig(**config)
+            
+    def updateGUI(self):
+        """updateGUI() -> None
+        Update GUI list to be consistent with the the list of connections
+
+        """
+        self.clear()
+        for (id, c) in self.__list.items():
+            cItem = QDBConnectionListItem(CurrentTheme.DB_ICON,
+                                          int(id),
+                                          str(c.name))
+            self.addItem(cItem)
+        self.emit(QtCore.SIGNAL("reloadConnections"))
+        
+    def loadConnections(self):
+        """loadConnections() -> None
+        Loads the internal connections and updates the GUI
+
+        """
+        self.__list.clear()
+        self.__list.load_connections()
+        self.updateGUI()
+
+    def getConnectionInfo(self, id):
+        """getConnectionInfo(id: int) -> dict
+        Returns info of ExtConnection """
+        conn = self.__list.get_connection(id)
+        key = str(conn.id) + "." + conn.name + "." + conn.host
+        passwd = DBLocator.keyChain.get_key(key)
+        if conn != None:
+            config = {'id': conn.id,
+                      'name': conn.name,
+                      'host': conn.host,
+                      'port': conn.port,
+                      'user': conn.user,
+                      'passwd': passwd,
+                      'db': conn.database}
+        else:
+            config = None
+        return config
+
+    def findConnectionInfo(self, host, port, db):
+        """findConnection(host:str, port: int, db: str) -> dict
+        Returns complete info of a connection with the given parameters
+
+        """
+        id = self.__list.find_db_connection(host,port,db)
+        if id != -1:
+            return self.getConnectionInfo(id)
+        else:
+            return None
+        
+    def removeConnection(self):
+        """removeConnection() -> None
+        Removes the selected connection
+
+        """
+        id = self.getCurrentItemId()
+        self.takeItem(self.currentRow())
+        self.__list.remove_connection(id)
+        
+    def get_connection(self, id):
+        """get_connection() -> None
+        Returns the selected connection
+
+        """
+        return self.__list.get_connection(id)
+
+    def setConnectionInfo(self, *args, **kwargs):
+        """setConnectionInfo(id: int, name: str, host: str, port:int,
+                     user:str, passwd:str, db:str) -> None
+        If the connection exists it will update it, else it will add it
+
+        """
+        if kwargs.has_key("id"):
+            id = kwargs["id"]
+        if kwargs.has_key("name"):
+            name = kwargs["name"]
+        if kwargs.has_key("host"):
+            host = kwargs["host"]
+        if kwargs.has_key("port"):
+            port = kwargs["port"]
+        if kwargs.has_key("user"):
+            user = kwargs["user"]
+        if kwargs.has_key("passwd"):
+            passwd = kwargs["passwd"]
+        if kwargs.has_key("db"):
+            db = kwargs["db"]
+
+        conn = DBConnection(id=id,
+                            name=name,
+                            host=host,
+                            port=port,
+                            user=user,
+                            passwd='',
+                            database=db,
+                            dbtype='MySQL')
+        
+        if self.__list.has_connection(id):    
+            self.__list.set_connection(id,conn)
+        else:
+            if conn.id == -1:
+                conn.id = self.__list.get_fresh_id()
+            self.__list.add_connection(conn)
+        self.updateGUI()
+        key = str(conn.id) + "." + conn.name + "." + conn.host
+        DBLocator.keyChain.set_key(key,passwd)
+        return conn.id
+            
+    def setCurrentId(self, id):
+        """setCurrentId(id: int) -> None
+        set the connection with id 'id' to be the current selected connection
+
+        """
+        conn = self.__list.get_connection(id)
+        
+        for i in self.findItems(conn.name, QtCore.Qt.MatchFixedString):
+            if i.id == id:
+                self.setCurrentItem(i)
+                break
+        self.emit(QtCore.SIGNAL("reloadConnections"), id)
+
+    def getCurrentConnConfig(self):
+        """getCurrentConnConfig() -> dict
+        Return dictionary of parameters of the current connection to pass
+        to MySQLdb
+
+        """
+        conn_id = self.currentItem().id
+        conn = self.__list.get_connection(conn_id)
+        config = self.getConnectionInfo(conn_id)
+        if conn.dbtype == 'MySQL':
+            #removing extra keyword arguments for MySQldb
+            del config['name']
+        return config
+    
+    def getDBObjectList(self, conn_id, obj_type):
+        """getDBObjectList(conn_id: int, obj_type : str) -> list
+        Returns list of vistrails objects
+
+        """
+        conn = self.__list.get_connection(conn_id)
+        config = self.getConnectionInfo(conn_id)
+        if conn.dbtype == 'MySQL':
+            #removing extra keyword arguments for MySQldb
+            config_name = config['name']
+            del config['name']
+            config_id = config['id']
+            del config['id']
+        vt_list = vistrails.db.services.io.get_db_object_list(config, obj_type)
+        if conn.dbtype == 'MySQL':
+            config['name'] = config_name
+            config['id'] = config_id
+        return vt_list
+    
+################################################################################
+    
+class QDBConnectionListItem(QtGui.QListWidgetItem):
+    
+    def __init__(self, icon, id, text, parent=None):
+        """__init__(icon: QIcon, id: int, text: QString, parent: QListWidget)
+                         -> QDBConnectionListItem
+        Creates an item with id
+        
+        """
+        QtGui.QListWidgetItem.__init__(self,icon, text, parent)
+        self.id = id
+
+################################################################################
+
+class QDBObjectList(QtGui.QListWidget):
+    """
+    QDBObjectList is a widget to show the vistrails available in the selected
+    database
+
+    """
+    def __init__(self, parent=None, obj_type='vistrail'):
+        QtGui.QListWidget.__init__(self, parent)
+        self.obj_type = obj_type
+
+    def updateContents(self, conn_id=-1):
+        """updateContents(connection_id: int) -> None
+        Reloads vistrails from the given connection
+        
+        """
+        self.clear()
+        if conn_id != -1:
+            parent = self.parent()
+            try:
+                objs = parent.connectionList.getDBObjectList(int(conn_id),
+                                                             self.obj_type)
+                
+                for (id,obj,date) in objs:
+                    item = QDBObjectListItem(CurrentTheme.FILE_ICON,
+                                             int(id),
+                                             str(obj),
+                                             str(date))
+                    self.addItem(item)
+            except VistrailsDBException, e:
+                #show connection setup
+                error = str(e)
+                if "Couldn't get list of vistrails objects" in error:
+                    debug.critical('An error has occurred', error)
+                    raise e
+                config = parent.connectionList.getConnectionInfo(int(conn_id))
+                if config != None:
+                    config["create"] = False
+                    if not parent.showConnConfig(**config):
+                        raise e
+                else:
+                    raise e
+            
+################################################################################
+
+class QDBObjectListItem(QtGui.QListWidgetItem):
+    
+    def __init__(self, icon, id, name, date, parent=None):
+        """__init__(icon: QIcon, id: int, name: QString,
+                    date: QString, user: QString, parent: QListWidget)
+                         -> QDBObjectListItem
+        Creates an item with id
+        
+        """
+        QtGui.QListWidgetItem.__init__(self, icon, name, parent)
+        self.id = id
+        self.name = name
+        self.date = date
+        self.setToolTip("Last Modified on %s" % date)
+
+################################################################################
+
+class QConnectionDBSetupWindow(QtGui.QDialog):
+    """
+    QConnectionDBSetupWindow is a dialog for creating a DB connection.
+    
+    """
+    def __init__(self, parent=None, id=-1, name ='', host="", port=3306,
+                 user="", passwd="", db="", create=True):
+        """ __init__(parent: QWidget, id: int, name: str, host:str, port:int,
+                     user:str, passwd:str, db:str, create:Boolean)
+                                -> QConnectionDBSetupWindow
+        Construct the dialog with the information provided
+        create tells if the caption of the button is Create or Update
+
+        """
+        QtGui.QDialog.__init__(self,parent)
+        if create:
+            self.setWindowTitle("Create a new connection")
+        else:
+            self.setWindowTitle("Update a connection")
+            
+        mainLayout = QtGui.QVBoxLayout()
+        infoLayout = QtGui.QGridLayout()
+        self.id = id
+        nameLabel = QtGui.QLabel("Save as Connection Name:", self)
+        self.nameEdt = QtGui.QLineEdit(name, self)
+        hostLabel = QtGui.QLabel("Server Hostname:", self)
+        self.hostEdt = QtGui.QLineEdit(host, self)
+        portLabel = QtGui.QLabel("Port:", self)
+        self.portEdt = QtGui.QSpinBox(self)
+        self.portEdt.setMaximum(65535)
+        self.portEdt.setValue(port)
+        userLabel = QtGui.QLabel("Username:", self)
+        self.userEdt = QtGui.QLineEdit(user, self)
+        passwdLabel = QtGui.QLabel("Password:", self)
+        self.passwdEdt = QtGui.QLineEdit(passwd,self)
+        self.passwdEdt.setEchoMode(QtGui.QLineEdit.Password)
+        self.passwdEdt.setToolTip("For your protection, your "
+                                  "password will not be saved.")
+        databaseLabel = QtGui.QLabel("Database:", self)
+        self.databaseEdt = QtGui.QLineEdit(db,self)
+        mainLayout.addLayout(infoLayout)
+        infoLayout.addWidget(nameLabel,0,0,1,1)
+        infoLayout.addWidget(self.nameEdt,0,1,1,1)
+        infoLayout.addWidget(hostLabel,1,0,1,1)
+        infoLayout.addWidget(self.hostEdt,1,1,1,1)
+        infoLayout.addWidget(portLabel,1,2,1,1)
+        infoLayout.addWidget(self.portEdt,1,3,1,1)
+        infoLayout.addWidget(userLabel,2,0,1,1)
+        infoLayout.addWidget(self.userEdt,2,1,1,3)
+        infoLayout.addWidget(passwdLabel,3,0,1,1)
+        infoLayout.addWidget(self.passwdEdt,3,1,1,3)
+        infoLayout.addWidget(databaseLabel,4,0,1,1)
+        infoLayout.addWidget(self.databaseEdt,4,1,1,3)
+        
+        buttonsLayout = QtGui.QHBoxLayout()
+        if create:
+            caption = 'Create'
+        else:
+            caption = 'Update'
+        self.createButton = QtGui.QPushButton(caption, self)
+        self.createButton.setDefault(True)
+        self.cancelButton = QtGui.QPushButton('Cancel', self)
+        self.testButton = QtGui.QPushButton('Test', self)
+        
+        buttonsLayout.addStretch(1)
+        buttonsLayout.addWidget(self.cancelButton)
+        buttonsLayout.addWidget(self.testButton)
+        buttonsLayout.addWidget(self.createButton)
+
+        mainLayout.addLayout(buttonsLayout)
+
+        self.setLayout(mainLayout)
+        self.connectSignals()
+        self.updateButtons()
+        
+    def connectSignals(self):
+        """ connectSignals() -> None
+        Map signals between GUI components        
+        
+        """
+        self.connect(self.cancelButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.reject)
+        self.connect(self.createButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.accept)
+        self.connect(self.testButton,
+                     QtCore.SIGNAL('clicked()'),
+                     self.testConnection)
+        self.connect(self.nameEdt,
+                     QtCore.SIGNAL('textChanged(QString)'),
+                     self.updateButtons)
+        self.connect(self.hostEdt,
+                     QtCore.SIGNAL('textChanged(QString)'),
+                     self.updateButtons)
+        self.connect(self.userEdt,
+                     QtCore.SIGNAL('textChanged(QString)'),
+                     self.updateButtons)
+        self.connect(self.passwdEdt,
+                     QtCore.SIGNAL('textChanged(QString)'),
+                     self.updateButtons)
+        self.connect(self.databaseEdt,
+                     QtCore.SIGNAL('textChanged(QString)'),
+                     self.updateButtons)
+        self.connect(self.portEdt,
+                     QtCore.SIGNAL('valueChanged(int)'),
+                     self.updateButtons)
+
+    def testConnection(self):
+        """testConnection() -> None """
+        config = {'host': str(self.hostEdt.text()),
+                  'port': int(self.portEdt.value()),
+                  'user': str(self.userEdt.text()),
+                  'passwd': str(self.passwdEdt.text()),
+                  'db': str(self.databaseEdt.text())}
+        try:
+            vistrails.db.services.io.test_db_connection(config)
+            show_info('Vistrails',"Connection succeeded!")
+            
+        except Exception, e:
+            debug.critical('An error has occurred', str(e))
+
+    def updateButtons(self):
+        """updateButtons() -> None
+        enables button if there's enough information in the dialog
+
+        """
+        if (self.nameEdt.text() != "" and
+            self.hostEdt.text() != "" and
+            self.portEdt.value() != 0 and
+            self.userEdt.text() != "" and
+            self.databaseEdt.text() != ""):
+            self.createButton.setEnabled(True)
+        else:
+            self.createButton.setEnabled(False)
diff --git a/vistrails/gui/paramexplore/__init__.py b/vistrails/gui/paramexplore/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/gui/paramexplore/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/gui/paramexplore/param_view.py b/vistrails/gui/paramexplore/param_view.py
new file mode 100644
index 0000000..2f51b34
--- /dev/null
+++ b/vistrails/gui/paramexplore/param_view.py
@@ -0,0 +1,410 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" The file describes the parameter tree view
+
+QParameterView
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.inspector import PipelineInspector
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.basic_modules import Constant
+from vistrails.gui.common_widgets import QSearchTreeWindow, QSearchTreeWidget
+from vistrails.gui.paramexplore.pe_pipeline import QAnnotatedPipelineView
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.core.utils import InstanceObject
+from vistrails.core.debug import debug
+
+################################################################################
+
+class ParameterInfo(InstanceObject):
+    #     ParameterInfo(type=,
+    #                   identifier=,
+    #                   namespace=,
+    #                   value=,
+    #                   id=,
+    #                   dbtype=,
+    #                   parent_dbtype=,
+    #                   parent_id=,
+    #                   is_alias=)
+    #new: ParameterInfo(module_id=,
+    #                   name=,
+    #                   pos=,
+    #                   value=,
+    #                   spec=,
+    #                   is_alias=)
+    pass
+
+################################################################################
+
+class QParameterView(QtGui.QWidget, QVistrailsPaletteInterface):
+    """
+    QParameterView contains the parameter exploration properties and the
+    parameter palette
+    
+    """
+    def __init__(self, controller=None, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.set_title('Pipeline Methods')
+        
+        self.controller = controller
+        vLayout = QtGui.QVBoxLayout()
+        vLayout.setMargin(0)
+        vLayout.setSpacing(5)
+        self.setLayout(vLayout)
+
+        self.toggleUnsetParameters = QtGui.QCheckBox('Show Unset Parameters')
+        vLayout.addWidget(self.toggleUnsetParameters, 0, QtCore.Qt.AlignRight)
+
+        self.parameterWidget = QParameterWidget()
+        vLayout.addWidget(self.parameterWidget)
+        self.treeWidget = self.parameterWidget.treeWidget
+
+        self.pipeline_view = QAnnotatedPipelineView()
+        vLayout.addWidget(self.pipeline_view)
+
+        vLayout.setStretch(0,0)
+        vLayout.setStretch(1,1)
+        vLayout.setStretch(2,0)
+
+        self.connect(self.toggleUnsetParameters, QtCore.SIGNAL("toggled(bool)"),
+                     self.parameterWidget.treeWidget.toggleUnsetParameters)
+
+    def set_controller(self, controller):
+        self.controller = controller
+        self.set_pipeline(self.controller.current_pipeline)
+        self.pipeline_view.setScene(self.controller.current_pipeline_scene)
+
+    def set_pipeline(self, pipeline):
+        self.pipeline = pipeline
+        self.parameterWidget.set_pipeline(pipeline, self.controller)
+        self.pipeline_view.updateAnnotatedIds(pipeline)
+
+class QParameterWidget(QSearchTreeWindow):
+    """
+    QParameterWidget is a special widget for displaying aliases and
+    parameters inside a pipeline
+    
+    """
+    def createTreeWidget(self):
+        """ createTreeWidget() -> QModuleTreeWidget
+        Return the search tree widget for this window
+        
+        """
+        treeWidget = QParameterTreeWidget(self)
+        return treeWidget
+
+    def set_pipeline(self, pipeline, controller):
+        self.pipeline = pipeline
+        self.treeWidget.updateFromPipeline(pipeline, controller)
+
+
+class QParameterTreeWidget(QSearchTreeWidget):
+    """
+    QParameterTreeWidget is a subclass of QSearchTreeWidget to display all
+    Vistrails Module
+    
+    """
+    def __init__(self, parent=None):
+        """ QParameterTreeWidget(parent: QWidget) -> QParameterTreeWidget
+        Set up size policy and header
+
+        """
+        QSearchTreeWidget.__init__(self, parent)
+        self.header().hide()
+        self.setRootIsDecorated(False)
+        self.delegate = QParameterTreeWidgetItemDelegate(self, self)
+        self.setItemDelegate(self.delegate)
+        self.showUnsetParameters = False
+
+    def updateFromPipeline(self, pipeline, controller):
+        """ updateFromPipeline(pipeline: Pipeline) -> None
+        Read the list of aliases and parameters from the pipeline
+        
+        """
+        self.clear()
+        if not pipeline:
+            return
+
+        # Update the aliases
+        if len(pipeline.aliases)>0:
+            aliasRoot = QParameterTreeWidgetItem(None, self, ['Aliases'])
+            aliasRoot.setFlags(QtCore.Qt.ItemIsEnabled)
+            for (alias, info) in pipeline.aliases.iteritems():
+                ptype, pId, parentType, parentId, mId = info
+                parameter = pipeline.db_get_object(ptype, pId)
+                function = pipeline.db_get_object(parentType, parentId)
+                v = parameter.strValue
+                port_spec = function.get_spec('input')
+                port_spec_item = port_spec.port_spec_items[parameter.pos]
+                label = ['%s = %s' % (alias, v)]
+                pInfo = ParameterInfo(module_id=mId,
+                                      name=function.name,
+                                      pos=parameter.pos,
+                                      value=v,
+                                      spec=port_spec_item,
+                                      is_alias=True)
+                aliasItem = QParameterTreeWidgetItem((alias, [pInfo]),
+                                                     aliasRoot, label)
+            aliasRoot.setExpanded(True)
+
+        vistrailVarsRoot = QParameterTreeWidgetItem(None, self,
+                                      ['Vistrail Variables'])
+        vistrailVarsRoot.setHidden(True)
+
+        # Now go through all modules and functions
+
+        inspector = PipelineInspector()
+        inspector.inspect_ambiguous_modules(pipeline)
+        sortedModules = sorted(pipeline.modules.iteritems(),
+                               key=lambda item: item[1].name)
+
+        reg = get_module_registry()
+
+        for mId, module in sortedModules:
+            if module.is_vistrail_var():
+                vistrailVarsRoot.setHidden(False)
+                vistrailVarsRoot.setExpanded(True)
+                port_spec = module.get_port_spec('value', 'input')
+                if not port_spec:
+                    debug.critical("Not port_spec for value in module %s" % module)
+                    continue
+                port_spec_items = port_spec.port_spec_items
+
+                vv = controller.get_vistrail_variable_by_uuid(
+                                        module.get_vistrail_var())
+
+                label = ['%s = %s' % (vv.name, vv.value)]
+                pList = [ParameterInfo(module_id=mId,
+                                       name=port_spec.name,
+                                       pos=port_spec.port_spec_items[pId].pos,
+                                       value="",
+                                       spec=port_spec.port_spec_items[pId],
+                                       is_alias=False)
+                         for pId in xrange(len(port_spec.port_spec_items))]
+                mItem = QParameterTreeWidgetItem((vv.name, pList),
+                                                 vistrailVarsRoot,
+                                                 label)
+                continue
+                
+            function_names = {}
+            # Add existing parameters
+            mLabel = [module.name]
+            moduleItem = None
+            if len(module.functions)>0:
+                for fId in xrange(len(module.functions)):
+                    function = module.functions[fId]
+                    function_names[function.name] = function
+                    if len(function.params)==0: continue
+                    if moduleItem==None:
+                        if inspector.annotated_modules.has_key(mId):
+                            annotatedId = inspector.annotated_modules[mId]
+                            moduleItem = QParameterTreeWidgetItem(annotatedId,
+                                                                  self, mLabel)
+                        else:
+                            moduleItem = QParameterTreeWidgetItem(None,
+                                                                  self, mLabel)
+                    v = ', '.join([p.strValue for p in function.params])
+                    label = ['%s(%s)' % (function.name, v)]
+                    
+                    try:
+                        port_spec = function.get_spec('input')
+                    except Exception, e:
+                        debug.critical("get_spec failed: %s %s %s" % \
+                                       (module, function, function.sigstring))
+                        continue
+                    port_spec_items = port_spec.port_spec_items
+                    pList = [ParameterInfo(module_id=mId,
+                                           name=function.name,
+                                           pos=function.params[pId].pos,
+                                           value=function.params[pId].strValue,
+                                           spec=port_spec_items[pId],
+                                           is_alias=False)
+                             for pId in xrange(len(function.params))]
+                    mName = module.name
+                    if moduleItem.parameter!=None:
+                        mName += '(%d)' % moduleItem.parameter
+                    fName = '%s :: %s' % (mName, function.name)
+                    mItem = QParameterTreeWidgetItem((fName, pList),
+                                                     moduleItem,
+                                                     label)
+            # Add available parameters
+            if module.is_valid:
+                for port_spec in module.destinationPorts():
+                    if (port_spec.name in function_names or
+                        not port_spec.is_valid or 
+                        not len(port_spec.port_spec_items) or
+                        not reg.is_constant(port_spec)):
+                        # The function already exists or is empty
+                        # or contains non-constant modules
+                        continue
+                    if moduleItem==None:
+                        if inspector.annotated_modules.has_key(mId):
+                            annotatedId = inspector.annotated_modules[mId]
+                            moduleItem = QParameterTreeWidgetItem(annotatedId,
+                                                                  self, 
+                                                                  mLabel, 
+                                                                  False)
+                        else:
+                            moduleItem = QParameterTreeWidgetItem(None, self,
+                                                                  mLabel, False)
+                    v = ', '.join([p.module for p in port_spec.port_spec_items])
+                    label = ['%s(%s)' % (port_spec.name, v)]
+                    pList = [ParameterInfo(module_id=mId,
+                                           name=port_spec.name,
+                                           pos=port_spec.port_spec_items[pId].pos,
+                                           value="",
+                                           spec=port_spec.port_spec_items[pId],
+                                           is_alias=False)
+                             for pId in xrange(len(port_spec.port_spec_items))]
+                    mName = module.name
+                    if moduleItem.parameter!=None:
+                        mName += '(%d)' % moduleItem.parameter
+                    fName = '%s :: %s' % (mName, port_spec.name)
+                    mItem = QParameterTreeWidgetItem((fName, pList),
+                                                     moduleItem,
+                                                     label, False)
+            if moduleItem:
+                moduleItem.setExpanded(True)
+        self.toggleUnsetParameters(self.showUnsetParameters)
+
+    def toggleUnsetParameters(self, state):
+        self.showUnsetParameters = state
+        for item in self.findItems("*", QtCore.Qt.MatchWildcard | QtCore.Qt.MatchRecursive):
+            if not item.isSet:
+                item.setHidden(not state)
+            
+class QParameterTreeWidgetItemDelegate(QtGui.QItemDelegate):
+    """    
+    QParameterTreeWidgetItemDelegate will override the original
+    QTreeWidget paint function to draw buttons for top-level item
+    similar to QtDesigner. This mimics
+    Qt/tools/designer/src/lib/shared/sheet_delegate, which is only a
+    private class from QtDesigned.
+    
+    """
+    def __init__(self, view, parent):
+        """ QParameterTreeWidgetItemDelegate(view: QTreeView,
+                                          parent: QWidget)
+                                          -> QParameterTreeWidgetItemDelegate
+        Create the item delegate given the tree view
+        
+        """
+        QtGui.QItemDelegate.__init__(self, parent)
+        self.treeView = view
+
+    def paint(self, painter, option, index):
+        """ painter(painter: QPainter, option QStyleOptionViewItem,
+                    index: QModelIndex) -> None
+        Repaint the top-level item to have a button-look style
+        
+        """
+        model = index.model()
+        if model.parent(index).isValid()==False:
+            style = self.treeView.style()
+            r = option.rect
+            textrect = QtCore.QRect(r.left() + 10,
+                                    r.top(),
+                                    r.width() - 10,
+                                    r.height())
+            font = painter.font()
+            font.setBold(True)
+            painter.setFont(font)
+            text = option.fontMetrics.elidedText(
+                model.data(index, QtCore.Qt.DisplayRole),
+                QtCore.Qt.ElideMiddle, 
+                textrect.width()-10)
+            style.drawItemText(painter,
+                               textrect,
+                               QtCore.Qt.AlignLeft,
+                               option.palette,
+                               self.treeView.isEnabled(),
+                               text)
+            painter.setPen(QtGui.QPen(QtCore.Qt.black))
+            fm = QtGui.QFontMetrics(font)
+            size = fm.size(QtCore.Qt.TextSingleLine, text)
+            painter.drawLine(textrect.left()-5,
+                             textrect.bottom()-1,
+                             textrect.left()+size.width()+5,
+                             textrect.bottom()-1)
+
+            annotatedId = model.data(index, QtCore.Qt.UserRole+1)            
+            if annotatedId:
+                idRect = QtCore.QRect(
+                    QtCore.QPoint(textrect.left()+size.width()+5,
+                                  textrect.top()),
+                    textrect.bottomRight())
+                QAnnotatedPipelineView.drawId(painter, idRect,
+                                              annotatedId,
+                                              QtCore.Qt.AlignLeft |
+                                              QtCore.Qt.AlignVCenter)
+        else:
+            QtGui.QItemDelegate.paint(self, painter, option, index)
+
+    def sizeHint(self, option, index):
+        """ sizeHint(option: QStyleOptionViewItem, index: QModelIndex) -> None
+        Take into account the size of the top-level button
+        
+        """
+        return (QtGui.QItemDelegate.sizeHint(self, option, index) +
+                QtCore.QSize(2, 2))
+            
+
+class QParameterTreeWidgetItem(QtGui.QTreeWidgetItem):
+    """
+    QParameterTreeWidgetItem represents module on QParameterTreeWidget
+    
+    """
+    def __init__(self, info, parent, labelList, isSet=True):
+        """ QParameterTreeWidgetItem(info: (str, []),
+                                     parent: QTreeWidgetItem
+                                     labelList: string,
+                                     isSet: bool)
+                                     -> QParameterTreeWidget
+                                     
+        Create a new tree widget item with a specific parent and
+        labels. info describing a set of paramters as follow:
+        (name, [ParameterInfo]):
+           name  = Name of the parameter set (alias or function)
+        If this item is a top-level item, info can either be None or
+        an integer specifying the annotated id of this module
+        isSet indicates if it represents a set or unset parameter
+        """
+        self.parameter = info
+        QtGui.QTreeWidgetItem.__init__(self, parent, labelList)
+        if isinstance(self.parameter, int):
+            self.setData(0, QtCore.Qt.UserRole+1,
+                         self.parameter)
+        self.isSet = isSet
+
diff --git a/vistrails/gui/paramexplore/pe_inspector.py b/vistrails/gui/paramexplore/pe_inspector.py
new file mode 100644
index 0000000..c2e4c3a
--- /dev/null
+++ b/vistrails/gui/paramexplore/pe_inspector.py
@@ -0,0 +1,291 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtGui, QtCore
+
+from vistrails.gui.paramexplore.virtual_cell import QVirtualCellWindow
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.gui.theme import CurrentTheme
+from pe_view import QParamExploreView 
+
+import weakref
+
+class QParamExploreInspector(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.set_title("Explore Inspector")
+
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(2)
+        layout.setSpacing(3)
+
+        self.pe_properties = QParamExpProperties()
+        p_prop_group = QtGui.QGroupBox(self.pe_properties.windowTitle())
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(0)
+        g_layout.setSpacing(0)
+        g_layout.addWidget(self.pe_properties)
+        p_prop_group.setLayout(g_layout)
+        layout.addWidget(p_prop_group)
+        self.virtual_cell = QVirtualCellWindow()
+        v_cell_group = QtGui.QGroupBox(self.virtual_cell.windowTitle())
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(0)
+        g_layout.setSpacing(0)
+        g_layout.addWidget(self.virtual_cell)
+        v_cell_group.setLayout(g_layout)
+        layout.addWidget(v_cell_group)
+        self.setLayout(layout)
+        self.addButtonsToToolbar()
+
+    def addButtonsToToolbar(self):
+        # Add the back/forward exploration buttons
+        self.versionsLabel = QtGui.QLabel('Exploration: 0/0')
+        self.toolWindow().toolbar.insertWidget(self.toolWindow().pinAction,
+                                               self.versionsLabel)
+        self.pe_properties.versionsLabel = weakref.proxy(self.versionsLabel)
+        self.backAction = QtGui.QAction(
+            QtGui.QIcon(CurrentTheme.LEFT_ARROW_PIXMAP),
+            'Go to Previous Exploration', None, triggered=self.backPressed)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.backAction)
+        self.pe_properties.backAction = weakref.proxy(self.backAction)
+        self.forwardAction = QtGui.QAction(
+            QtGui.QIcon(CurrentTheme.RIGHT_ARROW_PIXMAP),
+            'Got to Next Exploration', None, triggered=self.forwardPressed)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.forwardAction)
+        self.pe_properties.forwardAction = weakref.proxy(self.forwardAction)
+
+    def set_controller(self, controller):
+        self.controller = controller
+        self.pe_properties.updateController(controller)
+        self.set_pipeline(self.controller.current_pipeline)
+
+    def set_pipeline(self, pipeline):
+        self.pipeline = pipeline
+        self.virtual_cell.updateVirtualCell(pipeline)
+        self.stateChanged()
+
+    def stateChanged(self):
+        self.pe_properties.updateVersion()
+
+    def set_exploration(self, pe = None):
+        self.stateChanged()
+
+    def backPressed(self):
+        self.pe_properties.goBack()
+
+    def forwardPressed(self):
+        self.pe_properties.goForward()
+        
+
+class QParamExpProperties(QtGui.QWidget):
+    def __init__(self, controller=None, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.controller = controller
+        self.versionNumber = -1
+        self.versionsLabel = None
+        self.backAction = None
+        self.forwardAction = None
+        vLayout = QtGui.QVBoxLayout()
+        self.setLayout(vLayout)
+        vLayout.setMargin(3)
+        vLayout.setSpacing(3)
+        gLayout = QtGui.QGridLayout()
+        gLayout.setColumnMinimumWidth(1,5)
+        gLayout.setRowMinimumHeight(0,24)
+        gLayout.setRowMinimumHeight(1,24)
+        gLayout.setRowMinimumHeight(2,24)
+        gLayout.setRowMinimumHeight(3,24)        
+        vLayout.addLayout(gLayout)
+        gLayout.setMargin(3)
+        gLayout.setSpacing(3)
+        
+        #vtVersionLabel = QtGui.QLabel('Workflow:', self)
+        #gLayout.addWidget(vtVersionLabel, 0, 0, 1, 1)
+        
+        #self.vtVersionEdit = QtGui.QLabel('', self)
+        #gLayout.addWidget(self.vtVersionEdit, 0, 2, 1, 1)
+        
+        tagLabel = QtGui.QLabel('Exploration Tag:', self)
+        gLayout.addWidget(tagLabel, 0, 0, 1, 1)
+
+        editLayout = QtGui.QHBoxLayout()
+        self.tagEdit = QtGui.QLineEdit()
+        tagLabel.setBuddy(self.tagEdit)
+        editLayout.addWidget(self.tagEdit)
+        self.tagEdit.setEnabled(False)
+
+        self.tagReset = QtGui.QToolButton(self)
+        self.tagReset.setIcon(QtGui.QIcon(
+              self.style().standardPixmap(QtGui.QStyle.SP_DialogCloseButton)))
+        self.tagReset.setIconSize(QtCore.QSize(12,12))
+        self.tagReset.setAutoRaise(True)
+        self.tagReset.setEnabled(False)
+        editLayout.addWidget(self.tagReset)
+
+        gLayout.addLayout(editLayout, 0, 2, 1, 1)
+
+        userLabel = QtGui.QLabel('User:', self)
+        gLayout.addWidget(userLabel, 1, 0, 1, 1)
+        
+        self.userEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.userEdit, 1, 2, 1, 1)
+
+        dateLabel = QtGui.QLabel('Date:', self)
+        gLayout.addWidget(dateLabel, 2, 0, 1, 1)
+
+        self.dateEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.dateEdit, 2, 2, 1, 1)
+        
+        self.connect(self.tagEdit, QtCore.SIGNAL('editingFinished()'),
+                     self.tagFinished)
+        self.connect(self.tagEdit, QtCore.SIGNAL('textChanged(QString)'),
+                     self.tagChanged)
+        self.connect(self.tagReset, QtCore.SIGNAL('clicked()'),
+                     self.tagCleared)
+        
+    def updateController(self, controller):
+        self.controller = controller
+
+    def updateVersion(self):
+        self.pe = None
+        if self.controller:
+            # Check if version changed
+            version_changed = False
+            if self.controller.current_parameter_exploration and \
+               self.controller.current_parameter_exploration.action_id !=\
+                self.controller.current_version:
+                # we need to remove it
+                version_changed = True
+                self.controller.current_parameter_exploration=None
+            
+            if not self.controller.current_parameter_exploration and \
+                self.controller.vistrail.has_paramexp(
+                                             self.controller.current_version):
+                version_changed = True
+                # load latest version
+                self.controller.current_parameter_exploration = \
+                            self.controller.vistrail.get_paramexp(
+                                              self.controller.current_version)
+
+            if version_changed:
+                from vistrails.gui.vistrails_window import _app
+                _app.notify('exploration_changed')
+                return
+
+            self.pe = self.controller.current_parameter_exploration
+        if self.controller and self.pe:
+            # get all pe for this action
+            self.peDict = dict([(pe.id, pe) for pe in
+                            self.controller.vistrail.parameter_explorations
+                            if pe.action_id==self.pe.action_id])
+            count = len(self.peDict)
+            ids = self.peDict.keys()
+            ids.sort()
+            index = ids.index(self.pe.id) + 1
+            
+            text = 'Exploration: %s/%s' % (index, count)
+            self.versionsLabel.setText(text)
+            self.backAction.setEnabled(index>1)
+            self.forwardAction.setEnabled(index<count)
+            self.tagEdit.setEnabled(True)
+            self.tagReset.setEnabled(True)
+            self.tagEdit.setText(self.pe.name or "")
+            self.userEdit.setText(self.pe.user or "")
+            self.dateEdit.setText(self.pe.date or "")
+        else:
+            self.versionsLabel.setText('Exploration: 0/0')
+            self.backAction.setEnabled(False)
+            self.forwardAction.setEnabled(False)
+            self.tagEdit.setEnabled(False)
+            self.tagReset.setEnabled(False)
+            self.tagEdit.setText('')
+            self.userEdit.setText('')
+            self.dateEdit.setText('')  
+            
+    def tagFinished(self):
+        """ tagFinished() -> None
+        Update the new tag to pe
+        
+        """
+        if self.pe:
+            currentText = str(self.tagEdit.text())
+            if self.pe.name != currentText and \
+               not self.controller.vistrail.has_named_paramexp(currentText):
+                #print "will update current tag", currentText
+                self.pe.name = currentText
+                self.controller.set_changed(True)
+            else:
+                self.tagEdit.setText(self.pe.name)
+                
+    def tagChanged(self, text):
+        """ tagChanged(text: QString) -> None
+        Update the button state if there is text
+
+        """
+        self.tagReset.setEnabled(text != '')
+
+    def tagCleared(self):
+        """ tagCleared() -> None
+        Remove the tag
+        
+        """ 
+        self.tagEdit.setText('')
+        self.tagFinished()
+        
+    def goBack(self):
+        """ Goes to the previous PE for this pipeline"""
+        ids = self.peDict.keys()
+        ids.sort()
+        index = ids.index(self.pe.id)
+        if index>0:
+            pe = self.peDict[ids[index-1]]
+            self.controller.current_parameter_exploration = pe
+            from vistrails.gui.vistrails_window import _app
+            _app.notify('exploration_changed')
+
+
+    def goForward(self):
+        """ Goes to the next PE for this pipeline"""
+        count = len(self.peDict)
+        ids = self.peDict.keys()
+        ids.sort()
+        index = ids.index(self.pe.id)
+        if index<count-1:
+            pe = self.peDict[ids[index+1]]
+            self.controller.current_parameter_exploration = pe
+            from vistrails.gui.vistrails_window import _app
+            _app.notify('exploration_changed')
diff --git a/vistrails/gui/paramexplore/pe_pipeline.py b/vistrails/gui/paramexplore/pe_pipeline.py
new file mode 100644
index 0000000..951e042
--- /dev/null
+++ b/vistrails/gui/paramexplore/pe_pipeline.py
@@ -0,0 +1,131 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This containing a subclassed QGraphicsView that allows View the
+pipeline in a specific way in the parameter exploration window
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.inspector import PipelineInspector
+from vistrails.gui.common_widgets import QToolWindowInterface
+from vistrails.gui.pipeline_view import QPipelineView, QGraphicsModuleItem
+from vistrails.gui.theme import CurrentTheme
+
+################################################################################
+class QAnnotatedPipelineView(QPipelineView, QToolWindowInterface):
+    """
+    QAnnotatedPipelineView subclass QPipelineView to perform some overlay
+    marking on a pipeline view
+    
+    """
+    def __init__(self, parent=None):
+        """ QPipelineView(parent: QWidget) -> QPipelineView
+        Initialize the graphics view and its properties
+        
+        """
+        QPipelineView.__init__(self, parent)
+        self.setWindowTitle('Annotated Pipeline')
+        self.inspector = PipelineInspector()
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Prefer the view not so large
+        
+        """
+        return QtCore.QSize(256, 256)
+
+    def paintEvent(self, event):
+        """ paintEvent(event: QPaintEvent) -> None
+        Paint an overlay annotation on spreadsheet cell modules
+        
+        """
+        QPipelineView.paintEvent(self, event)
+        # super(QAnnotatedPipelineView, self).paintEvent(event)
+        if self.scene():
+            painter = QtGui.QPainter(self.viewport())
+            for mId, annotatedId in \
+                    self.inspector.annotated_modules.iteritems():
+                if mId not in self.scene().modules:
+                    # faulty annotated_modules entry
+                    continue
+                item = self.scene().modules[mId]
+                br = item.sceneBoundingRect()
+                rect = QtCore.QRect(self.mapFromScene(br.topLeft()),
+                                    self.mapFromScene(br.bottomRight()))
+                QAnnotatedPipelineView.drawId(painter, rect, annotatedId)
+            painter.end()
+
+    def updateAnnotatedIds(self, pipeline):
+        """ updateAnnotatedIds(pipeline: Pipeline) -> None
+        Re-inspect the pipeline to get annotated ids
+        
+        """
+        if pipeline and self.scene():
+            self.inspector.inspect_ambiguous_modules(pipeline)
+            self.scene().fitToView(self)
+
+    @staticmethod
+    def drawId(painter, rect, id, align=QtCore.Qt.AlignCenter):
+        """ drawId(painter: QPainter, rect: QRect, id: int,
+                   align: QtCore.Qt.Align) -> None
+        Draw the rounded id number on a rectangular area
+        
+        """
+        painter.save()
+        painter.setRenderHints(QtGui.QPainter.Antialiasing)
+        painter.setPen(CurrentTheme.ANNOTATED_ID_BRUSH.color())
+        painter.setBrush(CurrentTheme.ANNOTATED_ID_BRUSH)
+        font = QtGui.QFont()
+        font.setStyleStrategy(QtGui.QFont.ForceOutline)
+        font.setBold(True)
+        painter.setFont(font)
+        fm = QtGui.QFontMetrics(font)
+        size = fm.size(QtCore.Qt.TextSingleLine, str(id))
+        size = max(size.width(), size.height())
+        
+        x = rect.left()
+        if align & QtCore.Qt.AlignHCenter:
+            x = rect.left() + rect.width()/2-size/2
+        if align & QtCore.Qt.AlignRight:
+            x = rect.left() + rect.width()-size
+        y = rect.top()
+        if align & QtCore.Qt.AlignVCenter:
+            y = rect.top() + rect.height()/2-size/2
+        if align & QtCore.Qt.AlignBottom:
+            y = rect.top() + rect.height()-size
+            
+        newRect = QtCore.QRect(x, y, size, size)
+        painter.drawEllipse(newRect)
+        painter.setPen(CurrentTheme.ANNOTATED_ID_PEN)
+        painter.drawText(newRect, QtCore.Qt.AlignCenter, str(id))
+        painter.restore()
diff --git a/vistrails/gui/paramexplore/pe_tab.py b/vistrails/gui/paramexplore/pe_tab.py
new file mode 100644
index 0000000..2fd6e48
--- /dev/null
+++ b/vistrails/gui/paramexplore/pe_tab.py
@@ -0,0 +1,337 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" The file describes the parameter exploration tab for VisTrails
+
+QParameterExplorationTab
+"""
+from PyQt4 import QtCore, QtGui
+from xml.dom.minidom import parseString
+from xml.sax.saxutils import escape
+from vistrails.core import debug
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.param_explore import ActionBasedParameterExploration
+from vistrails.core.system import current_time, get_vistrails_default_pkg_prefix
+from vistrails.gui.common_widgets import QDockContainer, QToolWindowInterface
+from vistrails.gui.paramexplore.pe_table import QParameterExplorationWidget, QParameterSetEditor
+from vistrails.gui.paramexplore.virtual_cell import QVirtualCellWindow
+from vistrails.gui.paramexplore.param_view import QParameterView
+from vistrails.gui.paramexplore.pe_pipeline import QAnnotatedPipelineView
+
+################################################################################
+
+class QParameterExplorationTab(QDockContainer, QToolWindowInterface):
+    """
+    QParameterExplorationTab is a tab containing different widgets
+    related to parameter exploration
+    
+    """
+    explorationId = 0
+    
+    def __init__(self, parent=None):
+        """ QParameterExplorationTab(parent: QWidget)
+                                    -> QParameterExplorationTab
+        Make it a main window with dockable area and a
+        QParameterExplorationTable
+        
+        """
+        QDockContainer.__init__(self, parent)
+        self.setWindowTitle('Parameter Exploration')
+        self.toolWindow().setFeatures(QtGui.QDockWidget.NoDockWidgetFeatures)
+        self.toolWindow().hide()
+
+        self.peWidget = QParameterExplorationWidget()
+        self.setCentralWidget(self.peWidget)
+        self.connect(self.peWidget.table,
+                     QtCore.SIGNAL('exploreChange(bool)'),
+                     self.exploreChange)
+
+        self.paramView = QParameterView(self)
+        self.addDockWidget(QtCore.Qt.RightDockWidgetArea,
+                           self.paramView.toolWindow())
+        
+        self.annotatedPipelineView = QAnnotatedPipelineView(self)
+        self.addDockWidget(QtCore.Qt.RightDockWidgetArea,
+                           self.annotatedPipelineView.toolWindow())
+        
+        self.virtualCell = QVirtualCellWindow(self)
+        self.addDockWidget(QtCore.Qt.RightDockWidgetArea,
+                           self.virtualCell.toolWindow())
+        
+        self.controller = None
+        self.currentVersion = -1
+
+    def addViewActionsToMenu(self, menu):
+        """addViewActionsToMenu(menu: QMenu) -> None
+        Add toggle view actions to menu
+        
+        """
+        menu.addAction(self.paramView.toolWindow().toggleViewAction())
+        menu.addAction(self.annotatedPipelineView.toolWindow().toggleViewAction())
+        menu.addAction(self.virtualCell.toolWindow().toggleViewAction())
+
+    def removeViewActionsFromMenu(self, menu):
+        """removeViewActionsFromMenu(menu: QMenu) -> None
+        Remove toggle view actions from menu
+        
+        """
+        menu.removeAction(self.paramView.toolWindow().toggleViewAction())
+        menu.removeAction(self.annotatedPipelineView.toolWindow().toggleViewAction())
+        menu.removeAction(self.virtualCell.toolWindow().toggleViewAction())
+        
+    def setController(self, controller):
+        """ setController(controller: VistrailController) -> None
+        Assign a controller to the parameter exploration tab
+        
+        """
+        self.controller = controller
+
+    def getParameterExploration(self):
+        """ getParameterExploration() -> string
+        Generates an XML string that represents the current
+        parameter exploration, and which can be loaded with
+        setParameterExploration().
+        
+        """
+        # Construct xml for persisting parameter exploration
+        escape_dict = { "'":"'", '"':'"', '\n':'&#xa;' }
+        timestamp = current_time().strftime('%Y-%m-%d %H:%M:%S')
+        # TODO: For now, we use the timestamp as the 'name' - Later, we should set 'name' based on a UI input field
+        xml = '\t<paramexp dims="%s" layout="%s" date="%s" name="%s">' % (str(self.peWidget.table.label.getCounts()), str(self.virtualCell.getConfiguration()[2]), timestamp, timestamp)
+        for i in xrange(self.peWidget.table.layout().count()):
+            pEditor = self.peWidget.table.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                firstParam = True
+                for paramWidget in pEditor.paramWidgets:
+                    paramInfo = paramWidget.param
+                    interpolator = paramWidget.editor.stackedEditors.currentWidget()
+                    intType = interpolator.exploration_name
+                    # Write function tag prior to the first parameter of the function
+                    if firstParam:
+                        xml += '\n\t\t<function id="%s" alias="%s" name="%s">' % (paramInfo.parent_id, paramInfo.is_alias, pEditor.info[0])
+                        firstParam = False
+                    # Write parameter tag
+                    xml += '\n\t\t\t<param id="%s" dim="%s" interp="%s"' % (paramInfo.id, paramWidget.getDimension(), intType)
+                    if intType == 'Linear Interpolation':
+                        xml += ' min="%s" max="%s"' % (interpolator.fromEdit.get_value(), interpolator.toEdit.get_value())
+                    elif intType == 'List':
+                        xml += ' values="%s"' % escape(str(interpolator._str_values), escape_dict)
+                    elif intType == 'User-defined Function':
+                        xml += ' code="%s"' % escape(interpolator.function, escape_dict)
+                    xml += '/>'
+                xml += '\n\t\t</function>'
+        xml += '\n\t</paramexp>'
+        return xml
+
+    def setParameterExploration(self, xmlString):
+        """ setParameterExploration(xmlString: string) -> None
+        Sets the current parameter exploration to the one
+        defined by 'xmlString'.
+        
+        """
+        if not xmlString:
+            return
+        # Parse/validate the xml
+        try:
+            xmlDoc = parseString(xmlString).documentElement
+        except:
+            debug.critical("Parameter Exploration load failed because of "
+                           "invalid XML:\n\n%s" % xmlString)
+            return
+        # Set the exploration dimensions
+        dims = eval(str(xmlDoc.attributes['dims'].value))
+        self.peWidget.table.label.setCounts(dims)
+        # Set the virtual cell layout
+        layout = eval(str(xmlDoc.attributes['layout'].value))
+        self.virtualCell.setConfiguration(layout)
+        # Populate parameter exploration window with stored functions and aliases
+        for f in xmlDoc.getElementsByTagName('function'):
+            # Retrieve function attributes
+            f_id = long(f.attributes['id'].value)
+            f_name = str(f.attributes['name'].value)
+            f_is_alias = (str(f.attributes['alias'].value) == 'True')
+            # Search the parameter treeWidget for this function and add it directly
+            newEditor = None
+            for tidx in xrange(self.paramView.treeWidget.topLevelItemCount()):
+                moduleItem = self.paramView.treeWidget.topLevelItem(tidx)
+                for cidx in xrange(moduleItem.childCount()):
+                    paramInfo = moduleItem.child(cidx).parameter
+                    name, params = paramInfo
+                    if params[0].parent_id == f_id and params[0].is_alias == f_is_alias:
+                        newEditor = self.peWidget.table.addParameter(paramInfo)
+            # Retrieve params for this function and set their values in the UI
+            if newEditor:
+                for p in f.getElementsByTagName('param'):
+                    # Locate the param in the newly added param editor and set values
+                    p_id = long(p.attributes['id'].value)
+                    for paramWidget in newEditor.paramWidgets:
+                        if paramWidget.param.id == p_id:
+                            # Set Parameter Dimension (radio button)
+                            p_dim = int(p.attributes['dim'].value)
+                            paramWidget.setDimension(p_dim)
+                            # Set Interpolator Type (dropdown list)
+                            p_intType = str(p.attributes['interp'].value)
+                            paramWidget.editor.selectInterpolator(p_intType)
+                            # Set Interpolator Value(s)
+                            interpolator = paramWidget.editor.stackedEditors.currentWidget()
+                            if p_intType == 'Linear Interpolation':
+                                # Set min/max
+                                p_min = str(p.attributes['min'].value)
+                                p_max = str(p.attributes['max'].value)
+                                interpolator.fromEdit.setText(p_min)
+                                interpolator.toEdit.setText(p_max)
+                            elif p_intType == 'List':
+                                p_values = str(p.attributes['values'].value)
+                                # Set internal list structure
+                                interpolator._str_values = eval(p_values)
+                                # Update UI list
+                                if interpolator.type == 'String':
+                                    interpolator.listValues.setText(p_values)
+                                else:
+                                    interpolator.listValues.setText(p_values.replace("'", "").replace('"', ''))
+                            elif p_intType == 'User-defined Function':
+                                # Set function code
+                                p_code = str(p.attributes['code'].value)
+                                interpolator.function = p_code
+
+    def showEvent(self, event):
+        """ showEvent(event: QShowEvent) -> None
+        Update the tab when it is shown
+        
+        """
+        if self.currentVersion!=self.controller.current_version:
+            self.currentVersion = self.controller.current_version
+            # Update the virtual cell
+            pipeline = self.controller.current_pipeline
+            self.virtualCell.updateVirtualCell(pipeline)
+
+            # Now we need to inspect the parameter list
+            self.paramView.treeWidget.updateFromPipeline(pipeline)
+
+            # Update the annotated ids
+            self.annotatedPipelineView.updateAnnotatedIds(pipeline)
+
+            # Update the parameter exploration table
+            self.peWidget.updatePipeline(pipeline)
+
+            # Update the UI with the most recent parameter exploration
+            # TODO: For now, we just strip the root tags since there's only one
+            #       exploration - Later we should parse the root tree and select
+            #       the active exploration based on date, or user choice
+            xmlString = self.controller.vistrail.get_paramexp(self.currentVersion)
+            if xmlString is not None:
+                striplen = len("<paramexps>")
+                xmlString = xmlString[striplen:-(striplen+1)].strip()
+                self.setParameterExploration(xmlString)
+
+    def performParameterExploration(self):
+        """ performParameterExploration() -> None        
+        Perform the exploration by collecting a list of actions
+        corresponding to each dimension
+        
+        """
+        registry = get_module_registry()
+        actions = self.peWidget.table.collectParameterActions()
+        spreadsheet_pkg = '%s.spreadsheet' % get_vistrails_default_pkg_prefix()
+        # Set the annotation to persist the parameter exploration
+        # TODO: For now, we just replace the existing exploration - Later we should append them.
+        xmlString = "<paramexps>\n" + self.getParameterExploration() + "\n</paramexps>"
+        self.controller.vistrail.set_paramexp(self.currentVersion, xmlString)
+        self.controller.set_changed(True)
+
+        if self.controller.current_pipeline and actions:
+            explorer = ActionBasedParameterExploration()
+            (pipelines, performedActions) = explorer.explore(
+                self.controller.current_pipeline, actions)
+            
+            dim = [max(1, len(a)) for a in actions]
+            if (registry.has_module(spreadsheet_pkg, 'CellLocation') and
+                registry.has_module(spreadsheet_pkg, 'SheetReference')):
+                modifiedPipelines = self.virtualCell.positionPipelines(
+                    'PE#%d %s' % (QParameterExplorationTab.explorationId,
+                                  self.controller.name),
+                    dim[2], dim[1], dim[0], pipelines, self.controller)
+            else:
+                modifiedPipelines = pipelines
+
+            mCount = []
+            for p in modifiedPipelines:
+                if len(mCount)==0:
+                    mCount.append(0)
+                else:
+                    mCount.append(len(p.modules)+mCount[len(mCount)-1])
+                
+            # Now execute the pipelines
+            totalProgress = sum([len(p.modules) for p in modifiedPipelines])
+            progress = QtGui.QProgressDialog('Performing Parameter '
+                                             'Exploration...',
+                                             '&Cancel',
+                                             0, totalProgress)
+            progress.setWindowTitle('Parameter Exploration')
+            progress.setWindowModality(QtCore.Qt.WindowModal)
+            progress.show()
+
+            QParameterExplorationTab.explorationId += 1
+            interpreter = get_default_interpreter()
+            for pi in xrange(len(modifiedPipelines)):
+                progress.setValue(mCount[pi])
+                QtCore.QCoreApplication.processEvents()
+                if progress.wasCanceled():
+                    break
+                def moduleExecuted(objId):
+                    if not progress.wasCanceled():
+                        #progress.setValue(progress.value()+1)
+                        #the call above was crashing when used by multithreaded
+                        #code, replacing with the call below (thanks to Terence
+                        #for submitting this fix). 
+                        QtCore.QMetaObject.invokeMethod(progress, "setValue", 
+                                        QtCore.Q_ARG(int,progress.value()+1))
+                        QtCore.QCoreApplication.processEvents()
+                kwargs = {'locator': self.controller.locator,
+                          'current_version': self.controller.current_version,
+                          'view': self.controller.current_pipeline_scene,
+                          'module_executed_hook': [moduleExecuted],
+                          'reason': 'Parameter Exploration',
+                          'actions': performedActions[pi],
+                          }
+                interpreter.execute(modifiedPipelines[pi], **kwargs)
+            progress.setValue(totalProgress)
+
+    def exploreChange(self, notEmpty):
+        """ exploreChange(notEmpty: bool) -> None
+        echo the signal
+        
+        """
+        self.emit(QtCore.SIGNAL('exploreChange(bool)'), notEmpty)
diff --git a/vistrails/gui/paramexplore/pe_table.py b/vistrails/gui/paramexplore/pe_table.py
new file mode 100644
index 0000000..786778e
--- /dev/null
+++ b/vistrails/gui/paramexplore/pe_table.py
@@ -0,0 +1,1015 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from getpass import getuser
+
+from PyQt4 import QtCore, QtGui
+from xml.dom.minidom import parseString
+from xml.sax.saxutils import escape, unescape
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.common_widgets import QPromptWidget
+from vistrails.gui.modules.paramexplore import QParameterEditor
+from vistrails.gui.paramexplore.param_view import QParameterTreeWidget
+from vistrails.gui.utils import show_warning
+from vistrails.core import debug
+from vistrails.core.modules.basic_modules import Constant
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.system import current_time
+from vistrails.core.paramexplore.param import PEParam
+from vistrails.core.paramexplore.function import PEFunction
+from vistrails.core.vistrail.module import Module as VistrailModule
+from vistrails.core.paramexplore.paramexplore import ParameterExploration
+import vistrails.core.db.action
+
+""" The file describes the parameter exploration table for VisTrails
+
+QParameterExplorationTable
+"""
+
+
+################################################################################
+class QParameterExplorationWidget(QtGui.QScrollArea):
+    """
+    QParameterExplorationWidget is a place holder for
+    QParameterExplorationTable
+
+    is a grid layout widget having 4 comlumns corresponding to 4
+    dimensions of exploration. It accept method/alias drops and can be
+    fully configured onto any dimension. For each parameter, 3
+    different approach can be chosen to assign the value of that
+    parameter during the exploration: linear interpolation (for int,
+    float), list (for int, float, string and boolean) and user-define
+    function (for int, float, string and boolean)
+    
+    """
+    def __init__(self, parent=None):
+        """ QParameterExplorationWidget(parent: QWidget)
+                                       -> QParameterExplorationWidget
+        Put the QParameterExplorationTable as a main widget
+        
+        """
+        QtGui.QScrollArea.__init__(self, parent)
+        self.setAcceptDrops(True)
+        self.setWidgetResizable(True)
+        self.table = QParameterExplorationTable()
+        self.setWidget(self.table)
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the parameter list
+        
+        """
+        if isinstance(event.source(), QParameterTreeWidget):
+            data = event.mimeData()
+            if hasattr(data, 'items'):
+                event.accept()
+                return
+        event.ignore()
+        
+    def dropEvent(self, event):
+        """ dropEvent(event: QDragMoveEvent) -> None
+        Accept drop event to add a new method
+        
+        """
+        if isinstance(event.source(), QParameterTreeWidget):
+            data = event.mimeData()
+            if hasattr(data, 'items'):
+                event.accept()
+                self.setFocus()
+                for item in data.items:
+                    self.table.addParameter(item.parameter)
+            vsb = self.verticalScrollBar()
+            vsb.setValue(vsb.maximum())
+
+    def updatePipeline(self, pipeline):
+        """ updatePipeline(pipeline: Pipeline) -> None
+        Assign a pipeline to the table
+        
+        """
+        self.table.setPipeline(pipeline)
+        # Update the UI with the most recent parameter exploration
+        if self.controller:
+            currentVersion = self.controller.current_version
+            pe = self.controller.vistrail.get_paramexp(currentVersion)
+            self.controller.current_parameter_exploration = pe
+            self.setParameterExploration(pe)
+
+    def getParameterExplorationOld(self):
+        """ getParameterExploration() -> string
+        Generates an XML string that represents the current
+        parameter exploration, and which can be loaded with
+        setParameterExploration().
+        
+        """
+        # Construct xml for persisting parameter exploration
+        escape_dict = { "'":"'", '"':'"', '\n':'&#xa;' }
+        timestamp = current_time().strftime('%Y-%m-%d %H:%M:%S')
+        palette = self.get_palette()
+        # TODO: For now, we use the timestamp as the 'name' - Later, we should set 'name' based on a UI input field
+        xml = '\t<paramexp dims="%s" layout="%s" date="%s" name="%s">' % (str(self.table.label.getCounts()), str(palette.virtual_cell.getConfiguration()[2]), timestamp, timestamp)
+        for i in xrange(self.table.layout().count()):
+            pEditor = self.table.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                firstParam = True
+                for paramWidget in pEditor.paramWidgets:
+                    paramInfo = paramWidget.param
+                    interpolator = paramWidget.editor.stackedEditors.currentWidget()
+                    intType = interpolator.exploration_name
+                    # Write function tag prior to the first parameter of the function
+                    if firstParam:
+                        xml += '\n\t\t<function id="%s" alias="%s" name="%s">' % (paramInfo.parent_id, paramInfo.is_alias, pEditor.info[0])
+                        firstParam = False
+                    # Write parameter tag
+                    xml += '\n\t\t\t<param id="%s" dim="%s" interp="%s"' % (paramInfo.id, paramWidget.getDimension(), intType)
+                    if intType in ['Linear Interpolation', 'RGB Interpolation',
+                                   'HSV Interpolation']:
+                        xml += ' min="%s" max="%s"' % (interpolator.fromEdit.get_value(), interpolator.toEdit.get_value())
+                    elif intType == 'List':
+                        xml += ' values="%s"' % escape(str(interpolator._str_values), escape_dict)
+                    elif intType == 'User-defined Function':
+                        xml += ' code="%s"' % escape(interpolator.function, escape_dict)
+                    xml += '/>'
+                xml += '\n\t\t</function>'
+        xml += '\n\t</paramexp>'
+        return xml
+    
+    def getParameterExploration(self):
+        """ getParameterExploration() -> ParameterExploration
+        Generates a ParameterExploration object hat represents the current
+        parameter exploration, and which can be loaded with
+        setParameterExploration().
+        
+        """
+        # Construct xml for persisting parameter exploration
+        escape_dict = { "'":"'", '"':'"', '\n':'&#xa;' }
+        palette = self.get_palette()
+        id_scope = self.controller.id_scope
+        functions = []
+        for i in xrange(self.table.layout().count()):
+            pEditor = self.table.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                function = None
+                firstParam = True
+                for paramWidget in pEditor.paramWidgets:
+                    paramInfo = paramWidget.param
+                    interpolator = paramWidget.editor.stackedEditors.currentWidget()
+                    intType = interpolator.exploration_name
+                    # Write function tag prior to the first parameter of the function
+                    if firstParam:
+                        function = PEFunction(id=id_scope.getNewId(PEFunction.vtType),
+                                              module_id=paramInfo.module_id,
+                                              port_name=paramInfo.name,
+                                              is_alias = 1 if paramInfo.is_alias else 0)
+                        firstParam = False
+
+                    if intType in ['Linear Interpolation', 'RGB Interpolation',
+                                   'HSV Interpolation']:
+                        value = '["%s", "%s"]' % (interpolator.fromEdit.get_value(),
+                                                  interpolator.toEdit.get_value())
+                    elif intType == 'List':
+                        value = '%s' % escape(str(interpolator._str_values), escape_dict)
+                    elif intType == 'User-defined Function':
+                        value ='%s' % escape(interpolator.function, escape_dict)
+                    # Write parameter tag
+                    param = PEParam(id=id_scope.getNewId(PEParam.vtType),
+                                    pos=paramInfo.pos,
+                                    interpolator=intType,
+                                    value=value,
+                                    dimension=paramWidget.getDimension())
+                    function.addParameter(param)
+                functions.append(function)
+        pe = ParameterExploration(dims=str(self.table.label.getCounts()),
+                      layout=repr(palette.virtual_cell.getConfiguration()[2]),
+                      date=current_time().strftime('%Y-%m-%d %H:%M:%S'),
+                      user=getuser(),
+                      functions=functions)
+        return pe
+
+    def setParameterExploration(self, pe, update_inspector=True):
+        """ setParameterExploration(pe: ParameterExploration) -> None
+        Sets the current parameter exploration to the one defined by pe
+        
+        """
+        self.table.clear()
+        palette = self.get_palette()
+        if update_inspector:
+            palette.stateChanged()
+        if not pe:
+            return
+        unescape_dict = { "'":"'", '"':'"', '&#xa;':'\n' }
+        paramView = self.get_param_view()
+        # Set the exploration dimensions
+        self.table.label.setCounts(pe.dims)
+        # Set the virtual cell layout
+        palette.virtual_cell.setConfiguration(pe.layout)
+        # Populate parameter exploration window with stored functions and aliases
+        for f in pe.functions:
+            # Search the parameter treeWidget for this function and add it directly
+            newEditor = None
+            for tidx in xrange(paramView.treeWidget.topLevelItemCount()):
+                moduleItem = paramView.treeWidget.topLevelItem(tidx)
+                for cidx in xrange(moduleItem.childCount()):
+                    paramInfo = moduleItem.child(cidx).parameter
+                    name, params = paramInfo
+                    if params[0].module_id == f.module_id and \
+                       params[0].name == f.port_name and \
+                       params[0].is_alias == f.is_alias:
+                        newEditor = self.table.addParameter(paramInfo)
+                        
+            # Retrieve params for this function and set their values in the UI
+            if newEditor:
+                for p in f.parameters:
+                    # Locate the param in the newly added param editor and set values
+                    for paramWidget in newEditor.paramWidgets:
+                        if paramWidget.param.pos == p.pos:
+                            # Set Parameter Dimension (radio button)
+                            paramWidget.setDimension(p.dimension)
+                            # Set Interpolator Type (dropdown list)
+                            paramWidget.editor.selectInterpolator(p.interpolator)
+                            # Set Interpolator Value(s)
+                            interpolator = paramWidget.editor.stackedEditors.currentWidget()
+                            if p.interpolator in ['Linear Interpolation',
+                                                  'RGB Interpolation',
+                                                  'HSV Interpolation']:
+                                try:
+                                    # Set min/max
+                                    i_range = eval('%s' % unescape(p.value,
+                                                               unescape_dict))
+                                    p_min = str(i_range[0])
+                                    p_max =str(i_range[1])
+                                    interpolator.fromEdit.set_value(p_min)
+                                    interpolator.toEdit.set_value(p_max)
+                                except:
+                                    pass
+                            elif p.interpolator == 'List':
+                                p_values = '%s' % unescape(p.value,
+                                                        unescape_dict)
+                                # Set internal list structure
+                                interpolator._str_values = eval(p_values)
+                                # Update UI list
+                                if interpolator.type == 'String':
+                                    interpolator.listValues.setText(p_values)
+                                else:
+                                    interpolator.listValues.setText(
+                                     p_values.replace("'","").replace('"',''))
+                            elif p.interpolator == 'User-defined Function':
+                                # Set function code
+                                interpolator.function = '%s' % unescape(
+                                                  str(p.value), unescape_dict)
+
+    def setParameterExplorationOld(self, xmlString):
+        """ setParameterExploration(xmlString: string) -> None
+        Sets the current parameter exploration to the one
+        defined by 'xmlString'.
+        
+        """
+        if not xmlString:
+            return
+        # Parse/validate the xml
+        try:
+            xmlDoc = parseString(xmlString).documentElement
+        except:
+            debug.critical("Parameter Exploration load failed because of "
+                           "invalid XML:\n\n%s" % xmlString)
+            return
+        palette = self.get_palette()
+        paramView = self.get_param_view()
+        # Set the exploration dimensions
+        dims = eval(str(xmlDoc.attributes['dims'].value))
+        self.table.label.setCounts(dims)
+        # Set the virtual cell layout
+        layout = eval(str(xmlDoc.attributes['layout'].value))
+        palette.virtual_cell.setConfiguration(layout)
+        # Populate parameter exploration window with stored functions and aliases
+        for f in xmlDoc.getElementsByTagName('function'):
+            # Retrieve function attributes
+            f_id = long(f.attributes['id'].value)
+            f_name = str(f.attributes['name'].value)
+            f_is_alias = (str(f.attributes['alias'].value) == 'True')
+            # Search the parameter treeWidget for this function and add it directly
+            newEditor = None
+            for tidx in xrange(paramView.treeWidget.topLevelItemCount()):
+                moduleItem = paramView.treeWidget.topLevelItem(tidx)
+                for cidx in xrange(moduleItem.childCount()):
+                    paramInfo = moduleItem.child(cidx).parameter
+                    name, params = paramInfo
+                    if params[0].parent_id == f_id and params[0].is_alias == f_is_alias:
+                        newEditor = self.table.addParameter(paramInfo)
+            # Retrieve params for this function and set their values in the UI
+            if newEditor:
+                for p in f.getElementsByTagName('param'):
+                    # Locate the param in the newly added param editor and set values
+                    p_id = long(p.attributes['id'].value)
+                    for paramWidget in newEditor.paramWidgets:
+                        if paramWidget.param.id == p_id:
+                            # Set Parameter Dimension (radio button)
+                            p_dim = int(p.attributes['dim'].value)
+                            paramWidget.setDimension(p_dim)
+                            # Set Interpolator Type (dropdown list)
+                            p_intType = str(p.attributes['interp'].value)
+                            paramWidget.editor.selectInterpolator(p_intType)
+                            # Set Interpolator Value(s)
+                            interpolator = paramWidget.editor.stackedEditors.currentWidget()
+                            if p_intType in ['Linear Interpolation', 'RGB Interpolation',
+                                             'HSV Interpolation']:
+                                try:
+                                    # Set min/max
+                                    p_min = str(p.attributes['min'].value)
+                                    p_max = str(p.attributes['max'].value)
+                                    interpolator.fromEdit.set_value(p_min)
+                                    interpolator.toEdit.set_value(p_max)
+                                except:
+                                    pass
+                            elif p_intType == 'List':
+                                p_values = str(p.attributes['values'].value)
+                                # Set internal list structure
+                                interpolator._str_values = eval(p_values)
+                                # Update UI list
+                                if interpolator.type == 'String':
+                                    interpolator.listValues.setText(p_values)
+                                else:
+                                    interpolator.listValues.setText(p_values.replace("'", "").replace('"', ''))
+                            elif p_intType == 'User-defined Function':
+                                # Set function code
+                                p_code = str(p.attributes['code'].value)
+                                interpolator.function = p_code
+
+    def get_palette(self):
+        from vistrails.gui.paramexplore.pe_inspector import QParamExploreInspector
+        return QParamExploreInspector.instance()
+    
+    def get_param_view(self):
+        from vistrails.gui.paramexplore.param_view import QParameterView
+        return QParameterView.instance()
+    
+class QParameterExplorationTable(QPromptWidget):
+    """
+    QParameterExplorationTable is a grid layout widget having 4
+    comlumns corresponding to 4 dimensions of exploration. It accept
+    method/alias drops and can be fully configured onto any
+    dimension. For each parameter, 3 different approach can be chosen
+    to assign the value of that parameter during the exploration:
+    linear interpolation (for int, float), list (for int, float,
+    string and boolean) and user-define function (for int, float,
+    string and boolean)
+    
+    """
+    def __init__(self, parent=None):
+        """ QParameterExplorationTable(parent: QWidget)
+                                       -> QParameterExplorationTable
+        Create an grid layout and accept drops
+        
+        """
+        QPromptWidget.__init__(self, parent)
+        self.pipeline = None
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        self.setPromptText('Drag aliases/parameters here for a parameter '
+                           'exploration')
+        self.showPrompt()
+        
+        vLayout = QtGui.QVBoxLayout(self)
+        vLayout.setSpacing(0)
+        vLayout.setMargin(0)
+        vLayout.setAlignment(QtCore.Qt.AlignTop)
+        self.setLayout(vLayout)
+
+        self.label = QDimensionLabel()
+
+        for labelIcon in self.label.labelIcons:
+            self.connect(labelIcon.countWidget,
+                         QtCore.SIGNAL('editingFinished()'),
+                         self.updateWidgets)
+        vLayout.addWidget(self.label)
+
+        for i in xrange(2):
+            hBar = QtGui.QFrame()
+            hBar.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Sunken)
+            vLayout.addWidget(hBar)
+        self._parameterCount = 0
+
+    def addParameter(self, paramInfo):
+        """ addParameter(paramInfo: (str, [ParameterInfo]) -> None
+        Add a parameter to the table. The parameter info is specified
+        in QParameterTreeWidgetItem
+        
+        """
+        # Check to see paramInfo is not a subset of some other parameter set
+        params = paramInfo[1]
+        for i in xrange(self.layout().count()):
+            pEditor = self.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                subset = True
+                for p in params:
+                    if not (p in pEditor.info[1]):
+                        subset = False
+                        break                    
+                if subset:
+                    show_warning('Parameter Exists',
+                                 'The parameter you are trying to add is '
+                                 'already in the list.')
+                    return
+        self.showPrompt(False)
+        newEditor = QParameterSetEditor(paramInfo, self)
+
+        # Make sure to disable all duplicated parameter
+        for p in xrange(len(params)):
+            for i in xrange(self.layout().count()):
+                pEditor = self.layout().itemAt(i).widget()
+                if pEditor and isinstance(pEditor, QParameterSetEditor):
+                    if params[p] in pEditor.info[1]:
+                        widget = newEditor.paramWidgets[p]
+                        widget.setDimension(4)
+                        widget.setDuplicate(True)
+                        widget.setEnabled(False)
+                        break
+        
+        self.layout().addWidget(newEditor)
+        newEditor.show()
+        self.setMinimumHeight(self.layout().minimumSize().height())
+        self.emit(QtCore.SIGNAL('exploreChange(bool)'), self.layout().count() > 3)
+        return newEditor
+
+    def removeParameter(self, ps):
+        """ removeParameterSet(ps: QParameterSetEditor) -> None
+        Remove a parameter set from the table and validate the rest
+        
+        """
+        self.layout().removeWidget(ps)
+        # Restore disabled parameter
+        for i in xrange(self.layout().count()):
+            pEditor = self.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                for p in xrange(len(pEditor.info[1])):
+                    param = pEditor.info[1][p]
+                    widget = pEditor.paramWidgets[p]                    
+                    if (param in ps.info[1] and (not widget.isEnabled())):
+                        widget.setDimension(0)
+                        widget.setDuplicate(False)
+                        widget.setEnabled(True)
+                        break
+        self.showPrompt(self.layout().count()<=3)
+        self.emit(QtCore.SIGNAL('exploreChange(bool)'), self.layout().count() > 3)
+
+    def updateWidgets(self):
+        """ updateWidgets() -> None
+        Update all widgets to reflect the step count
+        
+        """
+        # Go through all possible parameter widgets
+        counts = self.label.getCounts()
+        for i in xrange(self.layout().count()):
+            pEditor = self.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                for paramWidget in pEditor.paramWidgets:
+                    dim = paramWidget.getDimension()
+                    if dim in [0, 1, 2, 3]:
+                        se = paramWidget.editor.stackedEditors
+                        # Notifies editor widgets of size update 
+                        for i in xrange(se.count()):
+                            wd = se.widget(i)
+                            if hasattr(wd, 'size_was_updated'):
+                                wd.size_was_updated(counts[dim])
+
+    def clear(self):
+        """ clear() -> None
+        Clear all widgets
+        
+        """
+        for i in reversed(range(self.layout().count())):
+            pEditor = self.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                pEditor.table = None
+                self.layout().removeWidget(pEditor)
+                pEditor.hide()
+                pEditor.deleteLater()
+        self.label.resetCounts()
+        self.showPrompt()
+        self.emit(QtCore.SIGNAL('exploreChange(bool)'), self.layout().count() > 3)
+
+    def setPipeline(self, pipeline):
+        """ setPipeline(pipeline: Pipeline) -> None
+        Assign a pipeline to the current table
+        
+        """
+        if pipeline:
+            to_be_deleted = []
+            for i in xrange(self.layout().count()):
+                pEditor = self.layout().itemAt(i).widget()
+                if pEditor and isinstance(pEditor, QParameterSetEditor):
+                    for param in pEditor.info[1]:
+                        # We no longer require the parameter to exist
+                        # we check if the module still exists
+                        if not pipeline.db_has_object(VistrailModule.vtType,
+                                                      param.module_id):
+                            to_be_deleted.append(pEditor)
+            for pEditor in to_be_deleted:
+                pEditor.removeSelf()
+        else:
+            self.clear()
+        self.pipeline = pipeline
+        self.label.setEnabled(self.pipeline!=None)
+
+    def collectParameterActions(self):
+        """ collectParameterActions() -> list
+        Return a list of action lists corresponding to each dimension
+        
+        """
+        if not self.pipeline:
+            return None
+
+        reg = get_module_registry()
+        parameterValues = [[], [], [], []]
+        counts = self.label.getCounts()
+        for i in xrange(self.layout().count()):
+            pEditor = self.layout().itemAt(i).widget()
+            if pEditor and isinstance(pEditor, QParameterSetEditor):
+                for paramWidget in pEditor.paramWidgets:
+                    editor = paramWidget.editor
+                    interpolator = editor.stackedEditors.currentWidget()
+                    paramInfo = paramWidget.param
+                    dim = paramWidget.getDimension()
+                    if dim in [0, 1, 2, 3]:
+                        count = counts[dim]
+                        values = interpolator.get_values(count)
+                        if not values:
+                            return None
+                        pId = paramInfo.id
+                        pType = paramInfo.dbtype
+                        parentType = paramInfo.parent_dbtype
+                        parentId = paramInfo.parent_id
+                        function = self.pipeline.db_get_object(parentType,
+                                                               parentId)  
+                        fName = function.name
+                        old_param = self.pipeline.db_get_object(pType,pId)
+                        pName = old_param.name
+                        pAlias = old_param.alias
+                        pIdentifier = old_param.identifier
+                        actions = []
+                        tmp_id = -1L
+                        for v in values:
+                            getter = reg.get_descriptor_by_name
+                            desc = getter(paramInfo.identifier,
+                                          paramInfo.type,
+                                          paramInfo.namespace)
+                            if not isinstance(v, str):
+                                str_value = desc.module.translate_to_string(v)
+                            else:
+                                str_value = v
+                            new_param = ModuleParam(id=tmp_id,
+                                                    pos=old_param.pos,
+                                                    name=pName,
+                                                    alias=pAlias,
+                                                    val=str_value,
+                                                    type=paramInfo.type,
+                                                    identifier=pIdentifier
+                                                    )
+                            action_spec = ('change', old_param, new_param,
+                                           parentType, function.real_id)
+                            action = vistrails.core.db.action.create_action([action_spec])
+                            actions.append(action)
+                        parameterValues[dim].append(actions)
+                        tmp_id -= 1
+        return [zip(*p) for p in parameterValues]
+
+class QDimensionLabel(QtGui.QWidget):
+    """
+    QDimensionLabel represents a horizontal header item of the
+    parameter window. It has 4 small icons represents the dimensions
+    and a Skip label. It represents a group box.
+    
+    """
+    def __init__(self, parent=None):
+        """ QDimensionLabel(parent: QWidget) -> None
+        Initialize icons and labels
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setAutoFillBackground(True)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Maximum)
+
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        self.setLayout(hLayout)        
+
+        self.params = QDimensionLabelText('Parameters')
+        hLayout.addWidget(self.params)
+        self.params.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                  QtGui.QSizePolicy.Expanding)
+        hLayout.addWidget(QDimensionLabelSeparator())
+        
+        pixes = [CurrentTheme.EXPLORE_COLUMN_PIXMAP,
+                 CurrentTheme.EXPLORE_ROW_PIXMAP,
+                 CurrentTheme.EXPLORE_SHEET_PIXMAP,
+                 CurrentTheme.EXPLORE_TIME_PIXMAP]
+        self.labelIcons = []
+        for pix in pixes:
+            labelIcon = QDimensionLabelIcon(pix)
+            hLayout.addWidget(labelIcon)
+            self.labelIcons.append(labelIcon)            
+            hLayout.addWidget(QDimensionLabelSeparator())
+
+        hLayout.addWidget(QDimensionLabelIcon(CurrentTheme.EXPLORE_SKIP_PIXMAP,
+                                              False))
+
+    def getCounts(self):
+        """ getCounts() -> [int]        
+        Return a list of 4 ints denoting the step count desired for
+        each dimension
+        
+        """
+        return [l.countWidget.value() for l in self.labelIcons]
+
+    def setCounts(self, counts):
+        """ setCounts(counts:list) -> None
+        Set the 4 step counts for each dimension from a list of 4 ints
+
+        """
+        dim = len(self.getCounts())
+        if len(counts) != dim:
+            return
+        for i in xrange(0, dim):
+            self.labelIcons[i].countWidget.setValue(counts[i])
+
+    def resetCounts(self):
+        """ resetCounts() -> None
+        Reset all counts to 1
+        
+        """
+        for l in self.labelIcons:
+            l.countWidget.setValue(1)
+    
+class QDimensionSpinBox(QtGui.QSpinBox):
+    """
+    QDimensionSpinBox is just an overrided spin box that will also emit
+    'editingFinished()' signal when the user interact with mouse
+    
+    """    
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(event: QMouseEvent) -> None
+        Emit 'editingFinished()' signal when the user release a mouse button
+        
+        """
+        QtGui.QSpinBox.mouseReleaseEvent(self, event)
+        # super(QDimensionSpinBox, self).mouseReleaseEvent(event)
+        self.emit(QtCore.SIGNAL("editingFinished()"))
+
+class QDimensionLabelIcon(QtGui.QWidget):
+    """
+    QDimensionLabelIcon describes those icons staying on the header
+    view of the table
+    
+    """
+    def __init__(self, pix, hasCount = True, parent=None):
+        """ QDimensionalLabelIcon(pix: QPixmap, hasCount: bool, parent: QWidget)
+                                  -> QDimensionalLabelIcon
+        Using size 32x32 and a margin of 2
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        self.setLayout(layout)
+
+        label = QtGui.QLabel()
+        label.setAlignment(QtCore.Qt.AlignCenter)
+        label.setPixmap(pix.scaled(32, 32, QtCore.Qt.KeepAspectRatio,
+                                  QtCore.Qt.SmoothTransformation))
+        layout.addWidget(label)
+
+        if hasCount:
+            self.countWidget = QDimensionSpinBox()
+            self.countWidget.setFixedWidth(32)
+            self.countWidget.setRange(1, 10000000)
+            self.countWidget.setAlignment(QtCore.Qt.AlignRight)
+            self.countWidget.setFrame(False)
+            pal = QtGui.QPalette(self.countWidget.lineEdit().palette())
+            pal.setBrush(QtGui.QPalette.Base,
+                         QtGui.QBrush(QtCore.Qt.NoBrush))
+            self.countWidget.lineEdit().setPalette(pal)
+            layout.addWidget(self.countWidget)
+            
+        self.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                            QtGui.QSizePolicy.Maximum)        
+                
+class QDimensionLabelText(QtGui.QWidget):
+    """
+    QDimensionLabelText describes those texts staying on the header
+    view of the table. It also has a button to perform exploration
+    
+    """
+    def __init__(self, text, parent=None):
+        """ QDimensionalLabelText(text: str, parent: QWidget)
+                                   -> QDimensionalLabelText
+        Putting the text bold in the center
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        hLayout = QtGui.QHBoxLayout()
+        self.setLayout(hLayout)
+
+        hLayout.addStretch()
+        
+        hLayout.addWidget(QtGui.QLabel('<b>Parameters</b>'))
+
+        hLayout.addStretch()
+        
+        
+class QDimensionLabelSeparator(QtGui.QFrame):
+    """
+    QDimensionLabelSeparator is acting as a vertical separator which
+    has an appropriate style to go with the QDimensionalLabel
+    
+    """
+    def __init__(self, parent=None):
+        """ QDimensionalLabelSeparator(parent: QWidget)
+                                       -> QDimensionalLabelSeparator
+        Make sure the frame only has a width of 2
+        
+        """
+        QtGui.QFrame.__init__(self, parent)
+        self.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Sunken)
+        self.setFixedWidth(2)
+
+class QParameterSetEditor(QtGui.QWidget):
+    """
+    QParameterSetEditor is a widget controlling a set of
+    parameters. The set can contain a single parameter (aliases) or
+    multiple of them (module methods).
+    
+    """
+    def __init__(self, info, table=None, parent=None):
+        """ QParameterSetEditor(info: paraminfo,
+                                table: QParameterExplorationTable,
+                                parent: QWidget)
+                                -> QParameterSetEditor
+        Construct a parameter editing widget based on the paraminfo
+        (described in QParameterTreeWidgetItem)
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.info = info
+        self.table = table
+        (name, paramList) = info
+        if table:
+            size = table.label.getCounts()[0]
+        else:
+            size = 1
+        
+        vLayout = QtGui.QVBoxLayout(self)
+        vLayout.setMargin(0)
+        vLayout.setSpacing(0)
+        self.setLayout(vLayout)
+
+        label = QParameterSetLabel(name)
+        self.connect(label.removeButton, QtCore.SIGNAL('clicked()'),
+                     self.removeSelf)
+        vLayout.addWidget(label)
+        
+        self.paramWidgets = []
+        for param in paramList:
+            paramWidget = QParameterWidget(param, size)
+            vLayout.addWidget(paramWidget)
+            self.paramWidgets.append(paramWidget)
+
+        vLayout.addSpacing(10)
+
+        hBar = QtGui.QFrame()
+        hBar.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Sunken)
+        vLayout.addWidget(hBar)
+
+    def removeSelf(self):
+        """ removeSelf() -> None
+        Remove itself out of the parent layout()
+        
+        """
+        if self.table:
+            self.table.removeParameter(self)            
+            self.table = None
+            self.close()
+            self.deleteLater()
+
+class QParameterSetLabel(QtGui.QWidget):
+    """
+    QParameterSetLabel is the label bar showing at the top of the
+    parameter set editor. It also has a Remove button to remove the
+    parameter
+    
+    """
+    def __init__(self, text, parent=None):
+        """ QParameterSetLabel(text: str, parent: QWidget) -> QParameterSetLabel
+        Init a label and a button
+        
+        """
+        QtGui.QWidget.__init__(self, parent)        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        self.setLayout(hLayout)
+
+        hLayout.addSpacing(5)
+
+        label = QtGui.QLabel(text)
+        font = QtGui.QFont(label.font())
+        font.setBold(True)
+        label.setFont(font)
+        hLayout.addWidget(label)
+
+        hLayout.addSpacing(5)
+        
+        self.removeButton = QtGui.QToolButton()
+        self.removeButton.setAutoRaise(True)
+        self.removeButton.setIcon(QtGui.QIcon(
+            self.style().standardPixmap(QtGui.QStyle.SP_DialogCloseButton)))
+        self.removeButton.setIconSize(QtCore.QSize(12, 12))
+        self.removeButton.setFixedWidth(16)
+        hLayout.addWidget(self.removeButton)
+
+        hLayout.addStretch()
+        
+class QParameterWidget(QtGui.QWidget):
+    """
+    QParameterWidget is a row widget containing a label, a parameter
+    editor and a radio group.
+    
+    """
+    def __init__(self, param, size, parent=None):
+        """ QParameterWidget(param: ParameterInfo, size: int, parent: QWidget)
+                             -> QParameterWidget
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.param = param
+        self.prevWidget = 0
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)        
+        self.setLayout(hLayout)
+
+        hLayout.addSpacing(5+16+5)
+
+        self.label = QtGui.QLabel(param.spec.module)
+        self.label.setFixedWidth(50)
+        hLayout.addWidget(self.label)
+
+        registry = get_module_registry()
+        module = param.spec.descriptor.module
+        assert issubclass(module, Constant)
+
+        self.editor = QParameterEditor(param, size)
+        hLayout.addWidget(self.editor)
+
+        self.selector = QDimensionSelector()
+        self.connect(self.selector.radioButtons[4],
+                     QtCore.SIGNAL('toggled(bool)'),
+                     self.disableParameter)
+        hLayout.addWidget(self.selector)
+
+    def getDimension(self):
+        """ getDimension() -> int        
+        Return a number 0-4 indicating which radio button is
+        selected. If none is selected (should not be in this case),
+        return -1
+        
+        """
+        for i in xrange(5):
+            if self.selector.radioButtons[i].isChecked():
+                return i
+        return -1
+
+    def disableParameter(self, disabled=True):
+        """ disableParameter(disabled: bool) -> None
+        Disable/Enable this parameter when disabled is True/False
+        
+        """
+        self.label.setEnabled(not disabled)
+        self.editor.setEnabled(not disabled)
+
+    def setDimension(self, dim):
+        """ setDimension(dim: int) -> None
+        Select a dimension for this parameter
+        
+        """
+        if dim in xrange(5):
+            self.selector.radioButtons[dim].setChecked(True)
+
+    def setDuplicate(self, duplicate):
+        """ setDuplicate(duplicate: True) -> None
+        Set if this parameter is a duplicate parameter
+        
+        """
+        if duplicate:
+            self.prevWidget = self.editor.stackedEditors.currentIndex()
+            self.editor.stackedEditors.setCurrentIndex(3)
+        else:
+            self.editor.stackedEditors.setCurrentIndex(self.prevWidget)
+
+class QDimensionSelector(QtGui.QWidget):
+    """
+    QDimensionSelector provides 5 radio buttons to select dimension of
+    exploration or just skipping it.
+    
+    """
+    def __init__(self, parent=None):
+        """ QDimensionSelector(parent: QWidget) -> QDimensionSelector
+        Initialize the horizontal layout and set the width to be fixed
+        equal to the QDimensionLabel
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                           QtGui.QSizePolicy.Maximum)
+        
+        hLayout = QtGui.QHBoxLayout(self)
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)        
+        self.setLayout(hLayout)
+
+        self.radioButtons = []
+        for i in xrange(5):
+            hLayout.addSpacing(2)
+            button = QDimensionRadioButton()
+            self.radioButtons.append(button)
+            button.setFixedWidth(32)
+            hLayout.addWidget(button)
+        self.radioButtons[0].setChecked(True)
+
+class QDimensionRadioButton(QtGui.QRadioButton):
+    """
+    QDimensionRadioButton is a replacement of QRadioButton with
+    simpler appearance. We just need to override the paint event
+    
+    """
+    def paintEvent(self, event):
+        """ paintEvent(event: QPaintEvent) -> None
+        Draw an outer circle and another solid one in side
+        
+        """
+        painter = QtGui.QPainter(self)
+        painter.setRenderHint(QtGui.QPainter.Antialiasing)
+        painter.setPen(self.palette().color(QtGui.QPalette.Dark))
+        painter.setBrush(QtCore.Qt.NoBrush)
+        l = min(self.width()-2, self.height()-2, 12)
+        r = QtCore.QRect(0, 0, l, l)
+        r.moveCenter(self.rect().center())
+        painter.drawEllipse(r)
+
+        if self.isChecked():
+            r.adjust(3, 3, -3, -3)
+            painter.setPen(QtCore.Qt.NoPen)
+            painter.setBrush(self.palette().color(QtGui.QPalette.WindowText))
+            painter.drawEllipse(r)
+        
+        painter.end()
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Force toggling the radio button
+        
+        """
+        self.click()
+
+################################################################################
+
+if __name__=="__main__":        
+    import sys
+    import vistrails.gui.theme
+    app = QtGui.QApplication(sys.argv)
+    vistrails.gui.theme.initializeCurrentTheme()
+    vc = QDimensionLabel(CurrentTheme.EXPLORE_SHEET_PIXMAP, 'Hello World')
+    vc.show()
+    sys.exit(app.exec_())
diff --git a/vistrails/gui/paramexplore/pe_view.py b/vistrails/gui/paramexplore/pe_view.py
new file mode 100644
index 0000000..04a88e5
--- /dev/null
+++ b/vistrails/gui/paramexplore/pe_view.py
@@ -0,0 +1,135 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.paramexplore.pe_table import QParameterExplorationWidget
+from vistrails.gui.theme import CurrentTheme
+from vistrails.core import debug
+
+class QParamExploreView(QParameterExplorationWidget, BaseView):
+    explorationId = 0
+    
+    def __init__(self, parent=None):
+        QParameterExplorationWidget.__init__(self, parent)
+        BaseView.__init__(self)
+
+        self.set_title("Explore")
+        self.connect(self.table,
+                     QtCore.SIGNAL('exploreChange(bool)'),
+                     self.exploreChange)
+
+    def set_controller(self, controller):
+        if self.controller == controller:
+            return
+        self.controller = controller
+        self.set_exploration()
+        
+    def updatePipeline(self, pipeline):
+        name = self.controller.get_pipeline_name()
+        self.set_title("Explore: %s" % name)
+
+    def set_exploration(self, pe=None):
+        if not pe:
+            pe = self.controller.current_parameter_exploration
+        self.setParameterExploration(pe)
+
+    def set_default_layout(self):
+        from vistrails.gui.paramexplore.pe_inspector import QParamExploreInspector
+        from vistrails.gui.paramexplore.param_view import QParameterView
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QParamExploreInspector,
+             QtCore.Qt.RightDockWidgetArea: QParameterView,
+             })
+            
+    def set_action_links(self):
+        self.action_links = \
+            {
+              'execute': ('explore_changed', self.explore_non_empty),
+            }
+
+    def set_action_defaults(self):
+        self.action_defaults.update(
+            { 'execute': [('setEnabled', True, self.set_execute_action),
+                          ('setIcon', False, CurrentTheme.EXECUTE_EXPLORE_ICON),
+                          ('setToolTip', False, 'Execute the parameter exploration')],
+              'publishWeb': [('setEnabled', False, False)],
+              'publishPaper': [('setEnabled', False, False)],
+            })
+            
+    def set_execute_action(self):
+        if self.controller and self.controller.vistrail:
+            versionId = self.controller.current_version
+            return self.controller.vistrail.get_paramexp(versionId) != None
+        return False
+    
+    def explore_non_empty(self, on):
+        return on
+    
+    def exploreChange(self, on):
+        from vistrails.gui.vistrails_window import _app
+        _app.notify('explore_changed', on)
+        
+    def execute(self):
+        """ execute() -> None        
+        Perform the exploration by collecting a list of actions
+        corresponding to each dimension
+        
+        """
+        # persist the parameter exploration
+        pe = self.getParameterExploration()
+        pe.action_id = self.controller.current_version
+
+        # check if pe has changed
+        changed = False
+        if not self.controller.current_parameter_exploration or \
+         pe != self.controller.current_parameter_exploration:
+            changed = True
+            pe.name = ''
+            self.controller.current_parameter_exploration = pe
+            self.controller.vistrail.add_paramexp(pe)
+            self.controller.set_changed(True)
+        else:
+            pe = self.controller.current_parameter_exploration
+
+        errors = self.controller.executeParameterExploration(pe,
+                                     self.get_param_view().pipeline_view.scene())
+        if errors:
+            errors = '\n'.join(['Position %s: %s' % (error[0], error[1]) for error in errors])
+            debug.critical("Parameter Exploration Execution had errors", errors)
+        if changed:
+            from vistrails.gui.vistrails_window import _app
+            _app.notify('exploration_changed')
diff --git a/vistrails/gui/paramexplore/virtual_cell.py b/vistrails/gui/paramexplore/virtual_cell.py
new file mode 100644
index 0000000..ec515e6
--- /dev/null
+++ b/vistrails/gui/paramexplore/virtual_cell.py
@@ -0,0 +1,673 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file describe the virtual cell layout widget used in
+Parameter Exploration Tab """
+from PyQt4 import QtCore, QtGui
+from vistrails.core.inspector import PipelineInspector
+from vistrails.gui.common_widgets import QToolWindowInterface
+from vistrails.gui.paramexplore.pe_pipeline import QAnnotatedPipelineView
+from vistrails.gui.theme import CurrentTheme
+import copy
+import os.path
+
+# FIXME broke this as Actions have been changed around
+#
+# from core.vistrail.action import AddModuleAction, AddConnectionAction, \
+#      DeleteConnectionAction, ChangeParameterAction
+
+###############################################################################
+
+def split_camel_case(text):
+    if not text:
+        return u''
+    lines = []
+    # State machine!
+    #                                 empty?
+    #          initial ------------------------>
+    #           |    \             return empty
+    #           |      \
+    #           |        \
+    #           |          \
+    #           |            \
+    #         U | mark       L \ mark
+    #           |                \
+    #          \/        L       \/
+    #          1  ---------------> 2 ----\
+    #       /  /\ |\             / |\    | L
+    #     /    |   \      U     /   \___/
+    #    /     |    \-----------
+    #   |      |      emit, mark
+    #   |      |
+    # U |    L | emit -1
+    #   |      | mark -1
+    #   |     /
+    #   |   /
+    #  \/ /
+    #    3 ----\
+    #    |\    | U
+    #     \___/
+    #
+    state = 0
+    for i, c in enumerate(text):
+        u = c.isupper()
+        if state == 1:
+            state = 3 if u else 2
+        elif state == 2 and u:
+            state = 1
+            lines.append(text[mark:i])
+            mark = i
+        elif state == 3 and not u:
+            lines.append(text[mark:i-1])
+            mark = i-1
+            state = 1
+        elif state == 0:
+            state = 1 if u else 2
+            mark = i
+    lines.append(text[mark:])
+
+    return u'\n'.join(lines)
+
+###############################################################################
+
+def decodeConfiguration(pipeline, cells):
+    """ decodeConfiguration(pipeline: Pipeline,
+        cells: configuration) -> decoded cells
+    Convert cells of type [{(type,id): (row, column)}) to
+    (mId, row, col) in a particular pipeline
+
+    """
+    decodedCells = []
+    inspector = PipelineInspector()
+    inspector.inspect_spreadsheet_cells(pipeline)
+    inspector.inspect_ambiguous_modules(pipeline)
+    orig_pipeline = pipeline
+
+    for id_list in inspector.spreadsheet_cells:
+        pipeline = orig_pipeline
+        id_iter = iter(id_list)
+        m = pipeline.modules[id_iter.next()]
+        m_id = m.id
+        for m_id in id_iter:
+            pipeline = m.pipeline
+            m = pipeline.modules[m_id]
+        name = m.name
+
+        if len(id_list) == 1 and m_id in inspector.annotated_modules:
+            idx = inspector.annotated_modules[m_id]
+        elif tuple(id_list) in inspector.annotated_modules:
+            idx = inspector.annotated_modules[tuple(id_list)]
+        else:
+            idx = -1
+        (vRow, vCol) = cells[(name, idx)]
+        if len(id_list) == 1:
+            decodedCells.append((m_id, vRow, vCol))
+        else:
+            decodedCells.append((tuple(id_list), vRow, vCol))
+    return decodedCells
+
+def positionPipelines(sheetPrefix, sheetCount, rowCount, colCount,
+                       pipelines, cells, controller):
+    """ _positionPipelines(sheetPrefix: str, sheetCount: int, rowCount: int,
+                           colCount: int, pipelines: list of Pipeline,
+                           cells: List, controller: VistrailCintroller)
+                           -> list of Pipelines
+    Apply the virtual cell location to a list of pipelines in a
+    parameter exploration given that pipelines has multiple chunk
+    of sheetCount x rowCount x colCount cells
+
+    """
+
+    # at this point, we know that we have the spreadsheet loaded
+    from vistrails.packages.spreadsheet.spreadsheet_execute import \
+        assignPipelineCellLocations
+
+    modifiedPipelines = []
+    pipelinePositions = []
+    for pId in xrange(len(pipelines)):
+        root_pipeline = copy.copy(pipelines[pId])
+        col = pId % colCount
+        row = (pId / colCount) % rowCount
+        sheet = (pId / (colCount*rowCount)) % sheetCount
+
+        decodedCells = decodeConfiguration(root_pipeline, cells)
+        vRCount = (max(c[1] for c in decodedCells) + 1) if len(decodedCells) else 1
+        vCCount = (max(c[2] for c in decodedCells) + 1) if len(decodedCells) else 1
+        # still need to go through each separately
+        for (id_list, vRow, vCol) in decodedCells:
+            sheet_name = "%s %d" % (sheetPrefix, sheet)
+            min_row_count = rowCount * vRCount
+            min_col_count = colCount * vCCount
+            real_row = row*vRCount+vRow+1
+            real_col = col*vCCount+vCol+1
+            root_pipeline = \
+                assignPipelineCellLocations(root_pipeline, sheet_name,
+                                            real_row, real_col,
+                                            [id_list], min_row_count,
+                                            min_col_count)
+
+        modifiedPipelines.append(root_pipeline)
+        pipelinePositions.append((row, col, sheet))
+    return modifiedPipelines, pipelinePositions
+
+def assembleThumbnails(images, name, background='#000000'):
+    """ assembleThumbnails(images {(sheet, row, col):filename}, name: 'str',
+                           background: str)"""
+                           
+    bgcolor = QtGui.QColor()
+    bgcolor.setNamedColor(background)
+    maxRow = max(i[0] for i in images) + 1
+    maxCol = max(i[1] for i in images) + 1
+    maxSheet = max(i[2] for i in images) + 1
+    
+    w = h = 0
+    sizeX = sizeY = 0
+    sheets = []
+    painter = QtGui.QPainter()
+    
+    # paint thumbnails on correct positions
+    for pos, filename in images.iteritems():
+        row, col, sheet = pos
+
+        if not os.path.exists(filename + '.png'):
+            continue
+        pixmap = QtGui.QPixmap(filename)
+
+        # use first pixmap to calculate spreadsheet size
+        # this assumes all pixmaps have same size
+        if not w:
+            w, h = pixmap.width(), pixmap.height()
+            sizeX = w*maxCol
+            sizeY = h*maxRow
+            # init sheets with correct background
+            for i in xrange(maxSheet):
+                _sheet = QtGui.QPixmap(sizeX, sizeY)
+                sheets.append(_sheet)
+                painter.begin(_sheet)
+                painter.fillRect(0, 0, sizeX, sizeY, bgcolor)
+                painter.end()
+
+        sheet = sheets[sheet]
+        painter.begin(sheet)
+        painter.drawPixmap(col*w, h*row, w, h, pixmap.scaled(w, h,
+                                transformMode=QtCore.Qt.SmoothTransformation))
+        painter.end()
+        # draw spreadsheet grid
+        #painter.setPen(QtCore.Qt.black)
+        #for x in xrange(rows+1):
+        #    painter.drawLine(x*h-0.01, 0, x*h-0.01, size)
+        #for y in xrange(cols+1):
+        #    painter.drawLine(0, y*w-0.01, size, y*w-0.01)
+        #self.setIcon(0, QtGui.QIcon(pic))
+    
+    for i in xrange(len(sheets)):
+        sheet = sheets[i]
+        filename = '%s_%s.png' % (name, i)
+        sheet.save(filename)
+        
+class QVirtualCellWindow(QtGui.QFrame, QToolWindowInterface):
+    """
+    QVirtualCellWindow contains a caption, a virtual cell
+    configuration
+    
+    """
+    def __init__(self, parent=None):
+        """ QVirtualCellWindow(parent: QWidget) -> QVirtualCellWindow
+        Initialize the widget
+
+        """
+        QtGui.QFrame.__init__(self, parent)
+        self.setFrameShape(QtGui.QFrame.StyledPanel)
+        self.setWindowTitle('Spreadsheet Virtual Cell')
+        vLayout = QtGui.QVBoxLayout(self)
+        vLayout.setMargin(2)
+        vLayout.setSpacing(0)
+        self.setLayout(vLayout)
+        
+        label = QtGui.QLabel('Arrange the cell(s) below to construct'
+                             ' a virtual cell')
+        font = QtGui.QFont(label.font())
+        label.setFont(font)
+        label.setWordWrap(True)        
+        vLayout.addWidget(label)
+
+        hLayout = QtGui.QVBoxLayout()
+        hLayout.setMargin(0)
+        hLayout.setSpacing(0)
+        vLayout.addLayout(hLayout)
+        self.config = QVirtualCellConfiguration()
+        self.config.setSizePolicy(QtGui.QSizePolicy.Maximum,
+                                  QtGui.QSizePolicy.Maximum)
+        hLayout.addWidget(self.config)
+        hPadWidget = QtGui.QWidget()
+        hLayout.addWidget(hPadWidget)
+        hPadWidget.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                 QtGui.QSizePolicy.Ignored)
+
+        vPadWidget = QtGui.QWidget()
+        vLayout.addWidget(vPadWidget)
+        vPadWidget.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                QtGui.QSizePolicy.Expanding)
+
+        self.inspector = PipelineInspector()
+        self.pipeline = None
+
+    def updateVirtualCell(self, pipeline):        
+        """ updateVirtualCell(pipeline: QPipeline) -> None
+        Setup the virtual cells given a pipeline
+        
+        """
+        self.pipeline = pipeline
+        if self.pipeline and self.pipeline.is_valid:
+            self.inspector.inspect_spreadsheet_cells(self.pipeline)
+            self.inspector.inspect_ambiguous_modules(self.pipeline)
+            cells = []
+            for id_list in self.inspector.spreadsheet_cells:
+                pipeline = self.pipeline
+                id_iter = iter(id_list)
+                m = pipeline.modules[id_iter.next()]
+                m_id = m.id
+                for m_id in id_iter:
+                    pipeline = m.pipeline
+                    m = pipeline.modules[m_id]
+                    
+                name = m.name
+                if len(id_list) == 1 and \
+                        m_id in self.inspector.annotated_modules:
+                    cells.append((name, self.inspector.annotated_modules[m_id]))
+                elif tuple(id_list) in self.inspector.annotated_modules:
+                    cells.append((name, self.inspector.annotated_modules[ \
+                                tuple(id_list)]))
+                else:
+                    cells.append((name, -1))
+            self.config.configVirtualCells(cells)
+        else:
+
+            self.config.clear()
+
+    def getConfiguration(self):
+        """ getConfiguration() -> info (see below)
+        Return the current configuration of the virtual cell. The
+        information is:
+        info = (rowCount, columnCount,
+                {(type,id): (row, column)})
+        """
+        return self.config.getConfiguration()
+                
+    def setConfiguration(self, info):
+        """ setConfiguration(info) -> None (see below)
+        Set the configuration of the virtual cell. The
+        information is:
+        info = {(type, id): (row, column)}
+          or
+        info = (rowCount, columnCount,
+                {(type, id): (row, column)})
+        The second form is allowed so that the output of
+        getConfiguration could be passed directly to
+        setConfiguration (the dimensions aren't used).
+        """
+        self.config.setConfiguration(info)
+
+class QVirtualCellConfiguration(QtGui.QWidget):
+    """
+    QVirtualCellConfiguration is a widget provide a virtual layout of
+    the spreadsheet cell. Given a number of cells want to layout, it
+    will let users interactively select where to put a cell in a table
+    layout to construct a virtual cell out of that.
+    
+    """
+    def __init__(self, parent=None):
+        """ QVirtualCellConfiguration(parent: QWidget)
+                                      -> QVirtualCellConfiguration
+        Initialize the widget
+
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.rowCount = 1
+        self.colCount = 1
+        gridLayout = QtGui.QGridLayout(self)
+        gridLayout.setSpacing(0)
+        self.setLayout(gridLayout)
+        label = QVirtualCellLabel('')
+        self.layout().addWidget(label, 0, 0, 1, 1, QtCore.Qt.AlignCenter)
+        self.cells = [[label]]
+        self.numCell = 1
+
+    def clear(self):
+        """ clear() -> None
+        Remove and delete all widgets in self.gridLayout
+        
+        """
+        while True:
+            item = self.layout().takeAt(0)
+            if item==None:
+                break
+            self.disconnect(item.widget(),
+                            QtCore.SIGNAL('finishedDragAndDrop'),
+                            self.compressCells)
+            item.widget().deleteLater()
+            del item
+        self.cells = []
+        self.numCell = 0
+
+    def configVirtualCells(self, cells):
+        """ configVirtualCells(cells: [(str, int)]) -> None        
+        Given a list of cell types and ids, this will clear old
+        configuration and start a fresh one.
+        
+        """
+        self.clear()
+        self.numCell = len(cells)
+        row = []
+        for i in xrange(self.numCell):
+            label = QVirtualCellLabel(*cells[i])
+            row.append(label)
+            self.layout().addWidget(label, 0, i, 1, 1, QtCore.Qt.AlignCenter)
+            self.connect(label, QtCore.SIGNAL('finishedDragAndDrop'),
+                         self.compressCells)
+        self.cells.append(row)
+
+        for r in xrange(self.numCell-1):
+            row = []
+            for c in xrange(self.numCell):
+                label = QVirtualCellLabel()
+                row.append(label)
+                self.layout().addWidget(label, r+1, c, 1, 1,
+                                        QtCore.Qt.AlignCenter)
+                self.connect(label, QtCore.SIGNAL('finishedDragAndDrop'),
+                             self.compressCells)
+            self.cells.append(row)
+
+    def compressCells(self):
+        """ compressCells() -> None
+        Eliminate all blank cells
+        
+        """
+        # Check row by row first
+        visibleRows = []
+        for r in xrange(self.numCell):
+            row = self.cells[r]
+            hasRealCell = [True for label in row if label.type]!=[]
+            if hasRealCell:                
+                visibleRows.append(r)
+
+        # Move rows up
+        for i in xrange(len(visibleRows)):
+            for c in xrange(self.numCell):
+                label = self.cells[visibleRows[i]][c]
+                if label.type==None:
+                    label.type = ''
+                self.cells[i][c].setCellData(label.type, label.id)
+
+        # Now check column by column        
+        visibleCols = []
+        for c in xrange(self.numCell):
+            hasRealCell = [True
+                           for r in xrange(self.numCell)
+                           if self.cells[r][c].type]!=[]
+            if hasRealCell:
+                visibleCols.append(c)
+                    
+        # Move columns left
+        for i in xrange(len(visibleCols)):
+            for r in xrange(self.numCell):
+                label = self.cells[r][visibleCols[i]]
+                if label.type==None:
+                    label.type = ''
+                self.cells[r][i].setCellData(label.type, label.id)
+
+        # Clear redundant rows
+        for i in xrange(self.numCell-len(visibleRows)):
+            for label in self.cells[i+len(visibleRows)]:
+                label.setCellData(None, -1)
+                
+        # Clear redundant columns
+        for i in xrange(self.numCell-len(visibleCols)):
+            for r in xrange(self.numCell):
+                self.cells[r][i+len(visibleCols)].setCellData(None, -1)
+
+    def getConfiguration(self):
+        """ getConfiguration() -> info (see below)
+        Return the current configuration of the virtual cell. The
+        information is:
+        info = (rowCount, columnCount,
+                {(type, id): (row, column)})
+        """
+        result = {}
+        rCount = 0
+        cCount = 0
+        for r in xrange(self.numCell):
+            for c in xrange(self.numCell):
+                cell = self.cells[r][c]
+                if cell.type:
+                    result[(cell.type, cell.id)] = (r, c)
+                    if r+1>rCount: rCount = r+1
+                    if c+1>cCount: cCount = c+1
+        return (rCount, cCount, result)
+
+    def setConfiguration(self, info):
+        """ setConfiguration(info) -> None (see below)
+        Set the configuration of the virtual cell. The
+        information is:
+        info = {(type, id): (row, column)}
+          or
+        info = (rowCount, columnCount,
+                {(type, id): (row, column)})
+        The second form is allowed so that the output of
+        getConfiguration could be passed directly to
+        setConfiguration (the dimensions aren't used).
+        """
+        if isinstance(info, dict):
+            result = info
+        else:
+            rCount, cCount, result = info
+        # Reset the layout of the virtual cell to default state
+        config_cells = []
+        for cell_type, cell_id in result.iterkeys():
+            config_cells.append((cell_type, cell_id))
+        self.configVirtualCells(config_cells)
+        # Unset the 0th row types/ids, since they're auto-set for the default state
+        for c in xrange(len(config_cells)):
+            self.cells[0][c].setCellData('', -1)
+        # Set the new types/ids
+        for cell_type, cell_id in config_cells:
+            row, col = result[(cell_type, cell_id)]
+            self.cells[row][col].setCellData(cell_type, cell_id)
+        # Compress to properly reset newly empty cells
+        self.compressCells()
+
+class QVirtualCellLabel(QtGui.QLabel):
+    """
+    QVirtualCellLabel is a label represent a cell inside a cell. It
+    has rounded shape with a caption text
+    
+    """
+    def __init__(self, label=None, id=-1, parent=None):
+        """ QVirtualCellLabel(text: QString, id: int,
+                              parent: QWidget)
+                              -> QVirtualCellLabel
+        Construct the label image
+
+        """
+        QtGui.QLabel.__init__(self, parent)
+        self.setMargin(2)
+        self.cellType = None
+        self.setCellData(label, id)
+        self.setAcceptDrops(True)
+        self.setFrameStyle(QtGui.QFrame.Panel)
+        self.palette().setColor(QtGui.QPalette.WindowText,
+                                CurrentTheme.HOVER_SELECT_COLOR)
+
+    def setCellData(self, cellType, cellId):
+        """ setCellData(cellType: str, cellId: int) -> None Create an
+        image based on the cell type and id. Then assign it to the
+        label. If cellType is None, the cell will be drawn with
+        transparent background. If cellType is '', the cell will be
+        drawn with the caption 'Empty'. Otherwise, the cell will be
+        drawn with white background containing cellType as caption and
+        a small rounded shape on the lower right painted with cellId
+        
+        """
+        self.type = cellType
+        self.id = cellId
+        size = QtCore.QSize(*CurrentTheme.VIRTUAL_CELL_LABEL_SIZE)
+        image = QtGui.QImage(size.width() + 12,
+                             size.height()+ 12,
+                             QtGui.QImage.Format_ARGB32_Premultiplied)
+        image.fill(0)
+
+        font = QtGui.QFont()
+        font.setStyleStrategy(QtGui.QFont.ForceOutline)
+        painter = QtGui.QPainter()
+        painter.begin(image)
+        painter.setRenderHint(QtGui.QPainter.Antialiasing)
+        if self.type==None:
+            painter.setPen(QtCore.Qt.NoPen)
+            painter.setBrush(QtCore.Qt.NoBrush)
+        else:
+            if self.type=='':
+                painter.setPen(QtCore.Qt.gray)
+                painter.setBrush(QtCore.Qt.NoBrush)
+            else:
+                painter.setPen(QtCore.Qt.black)
+                painter.setBrush(QtCore.Qt.lightGray)
+        painter.drawRoundRect(QtCore.QRectF(0.5, 0.5, image.width()-1,
+                                            image.height()-1), 25, 25)
+
+        painter.setFont(font)
+        if self.type!=None:
+            painter.drawText(QtCore.QRect(QtCore.QPoint(6, 6), size),
+                             QtCore.Qt.AlignCenter | QtCore.Qt.TextWrapAnywhere,
+                             split_camel_case(self.type))
+            # Draw the lower right corner number if there is an id
+            if self.id>=0 and self.type:
+                QAnnotatedPipelineView.drawId(painter, image.rect(), self.id,
+                                              QtCore.Qt.AlignRight |
+                                              QtCore.Qt.AlignBottom)
+
+        painter.end()
+
+        self.setPixmap(QtGui.QPixmap.fromImage(image))
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Start the drag and drop when the user click on the label
+        
+        """
+        if self.type:
+            mimeData = QtCore.QMimeData()
+            mimeData.cellData = (self.type, self.id)
+
+            drag = QtGui.QDrag(self)
+            drag.setMimeData(mimeData)
+            drag.setHotSpot(self.pixmap().rect().center())
+            drag.setPixmap(self.pixmap())
+            
+            self.setCellData('', -1)
+            
+            drag.start(QtCore.Qt.MoveAction)
+            if mimeData.cellData!=('', -1):
+                self.setCellData(*mimeData.cellData)
+            self.emit(QtCore.SIGNAL('finishedDragAndDrop'))
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the other cell info
+        
+        """
+        mimeData = event.mimeData()
+        if hasattr(mimeData, 'cellData'):
+            event.setDropAction(QtCore.Qt.MoveAction)
+            event.accept()
+            self.highlight()
+        else:
+            event.ignore()
+
+    def dropEvent(self, event):        
+        """ dropEvent(event: QDragMoveEvent) -> None
+        Accept drop event to set the current cell
+        
+        """
+        mimeData = event.mimeData()
+        if hasattr(mimeData, 'cellData'):
+            event.setDropAction(QtCore.Qt.MoveAction)
+            event.accept()            
+            if (self.type,self.id)!=(mimeData.cellData[0],mimeData.cellData[1]):
+                oldCellData = (self.type, self.id)
+                self.setCellData(*mimeData.cellData)
+                mimeData.cellData = oldCellData
+        else:
+            event.ignore()
+        self.highlight(False)
+
+    def dragLeaveEvent(self, event):
+        """ dragLeaveEvent(event: QDragLeaveEvent) -> None
+        Un highlight the current cell
+        
+        """
+        self.highlight(False)
+
+    def highlight(self, on=True):
+        """ highlight(on: bool) -> None
+        Highlight the cell as if being selected
+        
+        """
+        if on:
+            self.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Plain)
+        else:
+            self.setFrameStyle(QtGui.QFrame.Panel)
+
+###############################################################################
+
+import unittest
+
+class TestCamelCase(unittest.TestCase):
+    def test_simple(self):
+        self.assertEqual(split_camel_case('camelCaseH'), 'camel\nCase\nH')
+        self.assertEqual(split_camel_case('CamelCase'), 'Camel\nCase')
+
+    def test_long(self):
+        self.assertEqual(split_camel_case('parseHTML'), 'parse\nHTML')
+        self.assertEqual(split_camel_case('HTMLParser'), 'HTML\nParser')
+        self.assertEqual(split_camel_case('vHTMLParser'), 'v\nHTML\nParser')
+
+if __name__=="__main__":
+    import sys
+    import vistrails.gui.theme
+    app = QtGui.QApplication(sys.argv)
+    vistrails.gui.theme.initializeCurrentTheme()
+    vc = QVirtualCellConfiguration()
+    vc.configVirtualCells(['VTKCell', 'ImageViewerCell', 'RichTextCell'])
+    vc.show()
+    sys.exit(app.exec_())
diff --git a/vistrails/gui/pipeline_view.py b/vistrails/gui/pipeline_view.py
new file mode 100644
index 0000000..53e1214
--- /dev/null
+++ b/vistrails/gui/pipeline_view.py
@@ -0,0 +1,3405 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This is a QGraphicsView for pipeline view, it also holds different
+types of graphics items that are only available in the pipeline
+view. It only handles GUI-related actions, the rest of the
+functionalities are implemented at somewhere else,
+e.g. core.vistrails
+
+QGraphicsConnectionItem
+QGraphicsPortItem
+QGraphicsConfigureItem
+QGraphicsModuleItem
+QPipelineScene
+QPipelineView
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core import debug
+from vistrails.core.db.action import create_action
+from vistrails.core.system import systemType
+from vistrails.core.modules.module_registry import get_module_registry, \
+    ModuleRegistryException, MissingPackage
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.port import PortEndPoint
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.interpreter.base import AbortExecution
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.controlflow_assist import QControlFlowAssistDialog
+from vistrails.gui.graphics_view import (QInteractiveGraphicsScene,
+                               QInteractiveGraphicsView,
+                               QGraphicsItemInterface)
+from vistrails.gui.module_info import QModuleInfo
+from vistrails.gui.module_palette import QModuleTreeWidget
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import getBuilderWindow
+from vistrails.gui.variable_dropbox import QDragVariableLabel
+
+import copy
+import math
+import operator
+
+import vistrails.api
+import vistrails.gui.utils
+
+##############################################################################
+# 2008-06-24 cscheid
+#
+#   - Profiling has shown that calling setPen and setBrush takes a longer
+#   time than we expected. Watch out for that in the future.
+
+##############################################################################
+# QAbstractGraphicsPortItem
+
+class QAbstractGraphicsPortItem(QtGui.QAbstractGraphicsShapeItem):
+    """
+    QAbstractGraphicsPortItem represents a port shape drawing on top
+    (a child) of QGraphicsModuleItem, it must be implemented by a
+    specific qgraphicsitem type.
+    
+    """
+    def __init__(self, port, x, y, ghosted=False, parent=None):
+        """ QAbstractGraphicsPortItem(port: PortSpec,
+                                      x: float,
+                                      y: float,
+                                      ghosted: bool,
+                                      parent: QGraphicsItem)
+                                      -> QAbstractGraphicsPortItem
+        Create the shape, initialize its pen and brush accordingly
+        
+        """
+        # local lookups are faster than global lookups..
+        self._rect = CurrentTheme.PORT_RECT.translated(x,y)
+        QtGui.QAbstractGraphicsShapeItem.__init__(self, parent)
+        self.setZValue(1)
+        self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable)
+        self.controller = None
+        self.port = port
+        self.dragging = False
+        self.tmp_connection_item = None
+
+        self.vistrail_vars = {}
+        self.removeVarActions = []
+
+        if port is not None:
+            self._min_conns = port.min_conns
+            self._max_conns = port.max_conns
+            self.optional = port.optional
+        else:
+            self._min_conns = 0
+            self._max_conns = -1
+            self.optional = False
+        self._connected = 0
+        self._selected = False
+        self.ghosted = ghosted
+        self.invalid = False
+        self.setPainterState()
+
+        self.updateToolTip()
+        self.updateActions()
+
+    def getRect(self):
+        return self._rect
+
+    def boundingRect(self):
+        return self._boundingRect
+
+    def computeBoundingRect(self):
+        halfpw = self.pen().widthF() / 2
+        self._boundingRect = self.getRect().adjusted(-halfpw, -halfpw, 
+                                                      halfpw, halfpw)
+
+    def getPosition(self):
+        return self.sceneBoundingRect().center()
+
+    def setPainterState(self):
+        if self._selected:
+            self._pen_color = CurrentTheme.PORT_PEN_COLOR_SELECTED
+        elif self.ghosted:
+            self._pen_color = CurrentTheme.PORT_PEN_COLOR_GHOSTED
+            # self.setPen(CurrentTheme.GHOSTED_PORT_PEN)
+            self.setBrush(CurrentTheme.GHOSTED_PORT_BRUSH)
+        elif self.invalid:
+            self._pen_color = CurrentTheme.PORT_PEN_COLOR_INVALID
+            # self.setPen(CurrentTheme.INVALID_PORT_PEN)
+            self.setBrush(CurrentTheme.INVALID_PORT_BRUSH)
+        elif self._max_conns >= 0 and self._connected >= self._max_conns:
+            self._pen_color = CurrentTheme.PORT_PEN_COLOR_FULL
+            self.setBrush(CurrentTheme.PORT_BRUSH)
+        else:
+            self._pen_color = CurrentTheme.PORT_PEN_COLOR_NORMAL
+            # self.setPen(CurrentTheme.PORT_PEN)
+            self.setBrush(CurrentTheme.PORT_BRUSH)
+        if self.brush() == CurrentTheme.PORT_BRUSH:
+            if self._connected > 0:
+                self.setBrush(CurrentTheme.PORT_CONNECTED_BRUSH)
+            elif self._connected < self._min_conns:
+                self.setBrush(CurrentTheme.PORT_MANDATORY_BRUSH)
+        if self._selected:
+            self._pen_width = CurrentTheme.PORT_PEN_WIDTH_SELECTED
+        elif self._min_conns > 0 and self._connected < self._min_conns:
+            self._pen_width = CurrentTheme.PORT_PEN_WIDTH_MANDATORY
+        else:
+            self._pen_width = CurrentTheme.PORT_PEN_WIDTH_NORMAL
+        self.setPen(CurrentTheme.PORT_PENS[(self._pen_color, 
+                                            self._pen_width)])
+        self.computeBoundingRect()
+
+    def setGhosted(self, ghosted):
+        """ setGhosted(ghosted: True) -> None
+        Set this link to be ghosted or not
+        
+        """
+        if self.ghosted <> ghosted:
+            self.ghosted = ghosted
+            self.setPainterState()
+
+    def setInvalid(self, invalid):
+        if self.invalid != invalid:
+            self.invalid = invalid
+            self.setPainterState()
+
+    def setOptional(self, optional):
+        if self.optional != optional:
+            self.optional = optional
+            self.setPainterState()
+
+    def setSelected(self, selected):
+        # QtGui.QAbstractGraphicsShapeItem.setSelected(self, selected)
+        if self._selected != selected:
+            self._selected = selected
+            self.setPainterState()
+
+    def disconnect(self):
+        self._connected -= 1
+        # print "disconnecting", self._connected, self._min_conns, self._max_conns
+        if self._connected == 0 or self._connected+1 == self._min_conns or \
+                (self._max_conns >= 0 and self._connected+1 == self._max_conns):
+            self.setPainterState()
+    
+    def connect(self):
+        self._connected += 1
+        # print "connecting", self._connected, self._min_conns, self._max_conns
+        if self._connected == 1 or self._connected == self._min_conns or \
+                (self._max_conns >= 0 and self._connected == self._max_conns):
+            self.setPainterState()
+
+    def draw(self, painter, option, widget=None):
+        raise NotImplementedError("Must implement draw method")
+
+    def paint(self, painter, option, widget=None):
+        painter.setPen(self.pen())
+        painter.setBrush(self.brush())
+        self.draw(painter, option, widget)
+
+    def addVistrailVar(self, vistrail_var):
+        self.vistrail_vars[vistrail_var.uuid] = vistrail_var
+        self.updateActions()
+        self.updateToolTip()
+        
+    def deleteVistrailVar(self, var_uuid):
+        del self.vistrail_vars[var_uuid]
+        self.updateActions()
+        self.updateToolTip()
+
+    def deleteAllVistrailVars(self):
+        self.vistrail_vars = {}
+        self.updateActions()
+        self.updateToolTip()
+
+    def updateToolTip(self):
+        tooltip = ""
+        if (self.port is not None and self.port.is_valid and
+            hasattr(self.port, 'toolTip')):
+            tooltip = self.port.toolTip()
+        for vistrail_var in self.vistrail_vars.itervalues():
+            tooltip += '\nConnected to vistrail var "%s"' % vistrail_var.name
+        self.setToolTip(tooltip)
+        
+    def contextMenuEvent(self, event):
+        if len(self.removeVarActions) > 0:
+            menu = QtGui.QMenu()
+            for (action, _) in self.removeVarActions:
+                menu.addAction(action)
+            menu.exec_(event.screenPos())
+        event.accept()
+
+    def updateActions(self):
+        def gen_action(var_uuid):
+            def remove_action():
+                self.removeVar(var_uuid)
+            return remove_action
+
+        for (action, callback) in self.removeVarActions:
+            action.disconnect(action, QtCore.SIGNAL("triggered()"), callback)
+        self.removeVarActions = []
+        if len(self.vistrail_vars) > 1:
+            removeAllVarsAct = \
+                QtGui.QAction("Disconnect all vistrail variables", 
+                              self.scene())
+            removeAllVarsAct.setStatusTip("Disconnects all vistrail"
+                                          " variables from the port")
+            QtCore.QObject.connect(removeAllVarsAct, 
+                                   QtCore.SIGNAL("triggered()"),
+                                   self.removeAllVars)
+            self.removeVarActions.append((removeAllVarsAct, self.removeAllVars))
+        for vistrail_var in sorted(self.vistrail_vars.itervalues(),
+                                   key=lambda x: x.name):
+            removeVarAction = QtGui.QAction('Disconnect vistrail var "%s"' % \
+                                                vistrail_var.name, self.scene())
+            removeVarAction.setStatusTip('Disconnects vistrail variable "%s"'
+                                         ' from the port' % vistrail_var.name)
+            callback = gen_action(vistrail_var.uuid)
+            QtCore.QObject.connect(removeVarAction,
+                                   QtCore.SIGNAL("triggered()"),
+                                   callback)
+            self.removeVarActions.append((removeVarAction, callback))
+
+    def removeVar(self, var_uuid):
+        (to_delete_modules, to_delete_conns) = \
+            self.controller.get_disconnect_vistrail_vars( \
+                self.parentItem().module, self.port.name, var_uuid)
+        for conn in to_delete_conns:
+            self.scene().remove_connection(conn.id)
+        for module in to_delete_modules:
+            self.scene().remove_module(module.id)
+        self.deleteVistrailVar(var_uuid)
+        self.controller.disconnect_vistrail_vars(to_delete_modules,
+                                                 to_delete_conns)
+        
+
+    def removeAllVars(self):
+        # Get all connections to vistrail variables for this port
+        (to_delete_modules, to_delete_conns) = \
+            self.controller.get_disconnect_vistrail_vars( \
+                self.parentItem().module, self.port.name)
+        for conn in to_delete_conns:
+            self.scene().remove_connection(conn.id)
+        for module in to_delete_modules:
+            self.scene().remove_module(module.id)
+        self.deleteAllVistrailVars()
+        self.controller.disconnect_vistrail_vars(to_delete_modules,
+                                                 to_delete_conns)
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Prepare for dragging a connection
+        
+        """
+        if (self.controller and event.buttons() & QtCore.Qt.LeftButton
+            and not self.scene().read_only_mode):
+            self.dragging = True
+            self.setSelected(True)
+            event.accept()
+        QtGui.QAbstractGraphicsShapeItem.mousePressEvent(self, event)
+
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(event: QMouseEvent) -> None
+        Apply the connection
+        
+        """
+        if self.tmp_connection_item:
+            if self.tmp_connection_item.snapPortItem is not None:
+                self.scene().addConnectionFromTmp(self.tmp_connection_item,
+                                                  self.parentItem().module,
+                                                  self.port.type == "output")
+            self.tmp_connection_item.disconnect(True)
+            self.scene().removeItem(self.tmp_connection_item)
+            self.tmp_connection_item = None
+        self.dragging = False
+        self.setSelected(False)
+        QtGui.QAbstractGraphicsShapeItem.mouseReleaseEvent(self, event)
+        
+    def mouseMoveEvent(self, event):
+        """ mouseMoveEvent(event: QMouseEvent) -> None
+        Change the connection
+        
+        """
+        if self.dragging:
+            if not self.tmp_connection_item:
+                z_val = max(self.controller.current_pipeline.modules) + 1
+                self.tmp_connection_item = QGraphicsTmpConnItem(self, z_val,
+                                                                True)
+                self.scene().addItem(self.tmp_connection_item)
+            self.tmp_connection_item.setCurrentPos(event.scenePos())
+            snapPort = None
+            snapModule = self.scene().findModuleUnder(event.scenePos())
+            converters = []
+            if snapModule and snapModule != self.parentItem():
+                if self.port.type == 'output':
+                    portMatch = self.scene().findPortMatch(
+                        [self], snapModule.inputPorts.values(),
+                        fixed_out_pos=event.scenePos(),
+                        allow_conversion=True, out_converters=converters)
+                    if portMatch[1] is not None:
+                        snapPort = portMatch[1]
+                elif self.port.type == 'input':
+                    portMatch = self.scene().findPortMatch(
+                        snapModule.outputPorts.values(), [self],
+                        fixed_in_pos=event.scenePos(),
+                        allow_conversion=True, out_converters=converters)
+                    if portMatch[0] is not None:
+                        snapPort = portMatch[0]
+            self.tmp_connection_item.setSnapPort(snapPort)
+            if snapPort:
+                tooltip = self.tmp_connection_item.snapPortItem.toolTip()
+                if converters:
+                    tooltip = ('<strong>conversion required</strong><br/>\n'
+                               '%s' % tooltip)
+                QtGui.QToolTip.showText(event.screenPos(), tooltip)
+            else:
+                QtGui.QToolTip.hideText()
+            self.tmp_connection_item.setConverting(snapPort and converters)
+        QtGui.QAbstractGraphicsShapeItem.mouseMoveEvent(self, event)
+        
+    def findSnappedPort(self, pos):
+        """ findSnappedPort(pos: QPoint) -> Port        
+        Search all ports of the module under mouse cursor (if any) to
+        find the closest matched port
+        
+        """
+        # FIXME don't hardcode input/output strings...
+        snapModule = self.scene().findModuleUnder(pos)
+        if snapModule and snapModule!=self.parentItem():
+            if self.port.type == 'output':
+                return snapModule.getDestPort(pos, self.port)
+            elif self.port.type == 'input':
+                return snapModule.getSourcePort(pos, self.port)
+        else:
+            return None
+        
+    def itemChange(self, change, value):
+        """ itemChange(change: GraphicsItemChange, value: value) -> value
+        Do not allow port to be selected
+
+        """
+        if change==QtGui.QGraphicsItem.ItemSelectedChange and value:
+            return False
+        return QtGui.QAbstractGraphicsShapeItem.itemChange(self, change, value)
+
+##############################################################################
+# QGraphicsPortItem
+
+class QGraphicsPortRectItem(QAbstractGraphicsPortItem):
+    def draw(self, painter, option, widget=None):
+        painter.drawRect(self.getRect())
+
+class QGraphicsPortEllipseItem(QAbstractGraphicsPortItem):
+    def draw(self, painter, option, widget=None):
+        painter.drawEllipse(self.getRect())
+
+class QGraphicsPortTriangleItem(QAbstractGraphicsPortItem):
+    def __init__(self, *args, **kwargs):
+        if 'angle' in kwargs:
+            angle = kwargs['angle']
+            del kwargs['angle']
+        else:
+            angle = 0
+            
+        QAbstractGraphicsPortItem.__init__(self, *args, **kwargs)
+        angle = angle % 360
+        if angle not in set([0,90,180,270]):
+            raise ValueError("Triangle item limited to angles 0,90,180,270.")
+        rect = self.getRect()
+        if angle == 0 or angle == 180:
+            width = rect.width()
+            height = width * math.sqrt(3)/2.0
+            if height > rect.height():
+                height = rect.height()
+                width = height * 2.0/math.sqrt(3)
+        else:
+            height = rect.height()
+            width = height * math.sqrt(3)/2.0
+            if width > rect.width():
+                width = rect.width()
+                height = width * 2.0/math.sqrt(3)
+        left_x = (rect.width() - width)/2.0 + rect.x()
+        right_x = (rect.width() + width) / 2.0 + rect.x()
+        mid_x = rect.width() / 2.0 + rect.x()
+        top_y = (rect.height() - height)/2.0 + rect.y()
+        bot_y = (rect.height() + height)/2.0 + rect.y()
+        mid_y = rect.height() / 2.0 + rect.y()
+        if angle == 0:
+            self._polygon = QtGui.QPolygonF([QtCore.QPointF(left_x, bot_y),
+                                             QtCore.QPointF(mid_x, top_y),
+                                             QtCore.QPointF(right_x, bot_y)])
+        elif angle == 90:
+            self._polygon = QtGui.QPolygonF([QtCore.QPointF(left_x, bot_y),
+                                             QtCore.QPointF(left_x, top_y),
+                                             QtCore.QPointF(right_x, mid_y)])
+        elif angle == 180:
+            self._polygon = QtGui.QPolygonF([QtCore.QPointF(left_x, top_y),
+                                             QtCore.QPointF(right_x, top_y),
+                                             QtCore.QPointF(mid_x, bot_y)])
+        elif angle == 270:
+            self._polygon = QtGui.QPolygonF([QtCore.QPointF(left_x, mid_y),
+                                             QtCore.QPointF(right_x, top_y),
+                                             QtCore.QPointF(right_x, bot_y)])
+
+    def draw(self, painter, option, widget=None):
+        painter.drawConvexPolygon(self._polygon)
+
+class QGraphicsPortPolygonItem(QAbstractGraphicsPortItem):
+    def __init__(self, *args, **kwargs):
+        if 'points' in kwargs:
+            points = kwargs['points']
+            del kwargs['points']
+        else:
+            points = None
+        if points is None or len(points) < 3:
+            raise ValueError("Must have at least three points")
+        QAbstractGraphicsPortItem.__init__(self, *args, **kwargs)
+        rect = self.getRect()
+        new_points = []
+        for p in points:
+            if p[0] is None:
+                x = rect.x() + rect.width()
+            elif p[0] != 0 and p[0] != 1 and p[0] > 0 and p[0] < 1:
+                x = rect.x() + rect.width() * p[0]
+            elif p[0] < 0:
+                x = rect.x() + rect.width() + p[0]
+            else:
+                x = rect.x() + p[0]
+            if p[1] is None:
+                y = rect.y() + rect.height()
+            elif p[1] != 0 and p[1] != 1 and p[1] > 0 and p[1] < 1:
+                y = rect.y() + rect.height() * p[1]
+            elif p[1] < 0:
+                y = rect.y() + rect.height() + p[1]
+            else:
+                y = rect.y() + p[1]
+
+            print "adding point", x, y
+            if x < rect.x():
+                x = rect.x()
+            elif x > (rect.x() + rect.width()):
+                x = rect.x() + rect.width()
+            if y < rect.y():
+                y = rect.y()
+            elif y > (rect.y() + rect.height()):
+                y = rect.y() + rect.height()
+            print "Adding point", x, y
+            new_points.append(QtCore.QPointF(x,y))
+        self._polygon = QtGui.QPolygonF(new_points)
+    
+    def draw(self, painter, option, widget=None):
+        painter.drawPolygon(self._polygon)
+
+class QGraphicsPortDiamondItem(QGraphicsPortPolygonItem):
+    def __init__(self, *args, **kwargs):
+        kwargs['points'] = [(0, 0.5), (0.5, 0.999999), 
+                            (0.999999, 0.5), (0.5, 0)]
+        QGraphicsPortPolygonItem.__init__(self, *args, **kwargs)
+
+################################################################################
+# QGraphicsConfigureItem
+
+class QGraphicsConfigureItem(QtGui.QGraphicsPolygonItem):
+    """
+    QGraphicsConfigureItem is a small triangle shape drawing on top (a child)
+    of QGraphicsModuleItem
+    
+    """
+    def __init__(self, parent=None, scene=None):
+        """ QGraphicsConfigureItem(parent: QGraphicsItem, scene: QGraphicsScene)
+                              -> QGraphicsConfigureItem
+        Create the shape, initialize its pen and brush accordingly
+        
+        """
+        _pen = CurrentTheme.CONFIGURE_PEN
+        _brush = CurrentTheme.CONFIGURE_BRUSH
+        _shape = CurrentTheme.CONFIGURE_SHAPE
+        QtGui.QGraphicsPolygonItem.__init__(self, _shape, parent, scene)
+        self.setZValue(1)
+        self.setPen(_pen)
+        self.setBrush(_brush)
+        self.ghosted = False
+        self.controller = None
+        self.moduleId = None
+        self.is_breakpoint = False
+        self.createActions()
+
+    def setGhosted(self, ghosted):
+        """ setGhosted(ghosted: Bool) -> None
+        Set this link to be ghosted or not
+        
+        """
+        if ghosted <> self.ghosted:
+            self.ghosted = ghosted
+            if ghosted:
+                self.setPen(CurrentTheme.GHOSTED_CONFIGURE_PEN)
+                self.setBrush(CurrentTheme.GHOSTED_CONFIGURE_BRUSH)
+            else:
+                self.setPen(CurrentTheme.CONFIGURE_PEN)
+                self.setBrush(CurrentTheme.CONFIGURE_BRUSH)
+
+    def setBreakpoint(self, breakpoint):
+        if self.is_breakpoint != breakpoint:
+            if breakpoint:
+                self.setBreakpointAct.setText("Remove Breakpoint")
+                self.setBreakpointAct.setStatusTip("Remove Breakpoint")
+            else:
+                self.setBreakpointAct.setText("Set Breakpoint")
+                self.setBreakpointAct.setStatusTip("Set Breakpoint")
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Open the context menu
+        
+        """
+        self.scene().clearSelection()
+        self.parentItem().setSelected(True)
+        self.contextMenuEvent(event)
+        event.accept()
+        self.ungrabMouse()
+        
+    def contextMenuEvent(self, event):
+        """contextMenuEvent(event: QGraphicsSceneContextMenuEvent) -> None
+        Captures context menu event.
+
+        """
+        module = self.controller.current_pipeline.modules[self.moduleId]
+        menu = QtGui.QMenu()
+        menu.addAction(self.configureAct)
+        menu.addAction(self.annotateAct)
+        menu.addAction(self.viewDocumentationAct)
+        menu.addAction(self.changeModuleLabelAct)
+        menu.addAction(self.setBreakpointAct)
+        menu.addAction(self.setWatchedAct)
+        menu.addAction(self.runModuleAct)
+        menu.addAction(self.setErrorAct)
+        if module.is_abstraction() and not module.is_latest_version():
+            menu.addAction(self.upgradeAbstractionAct)
+        menu.exec_(event.screenPos())
+
+    def createActions(self):
+        """ createActions() -> None
+        Create actions related to context menu 
+
+        """
+        self.configureAct = QtGui.QAction("Edit Configuration\tCtrl+E", self.scene())
+        self.configureAct.setStatusTip("Edit the Configure of the module")
+        QtCore.QObject.connect(self.configureAct, 
+                               QtCore.SIGNAL("triggered()"),
+                               self.configure)
+        self.annotateAct = QtGui.QAction("Annotate", self.scene())
+        self.annotateAct.setStatusTip("Annotate the module")
+        QtCore.QObject.connect(self.annotateAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.annotate)
+        self.viewDocumentationAct = QtGui.QAction("View Documentation", self.scene())
+        self.viewDocumentationAct.setStatusTip("View module documentation")
+        QtCore.QObject.connect(self.viewDocumentationAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.viewDocumentation)
+        self.changeModuleLabelAct = QtGui.QAction("Set Module Label...", self.scene())
+        self.changeModuleLabelAct.setStatusTip("Set or remove module label")
+        QtCore.QObject.connect(self.changeModuleLabelAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.changeModuleLabel)
+        self.setBreakpointAct = QtGui.QAction("Set Breakpoint", self.scene())
+        self.setBreakpointAct.setStatusTip("Set Breakpoint")
+        QtCore.QObject.connect(self.setBreakpointAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.set_breakpoint)
+        self.setWatchedAct = QtGui.QAction("Watch Module", self.scene())
+        self.setWatchedAct.setStatusTip("Watch Module")
+        QtCore.QObject.connect(self.setWatchedAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.set_watched)
+        self.runModuleAct = QtGui.QAction("Run this module", self.scene())
+        self.runModuleAct.setStatusTip("Run this module")
+        QtCore.QObject.connect(self.runModuleAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.run_module)
+        self.setErrorAct = QtGui.QAction("Show Error", self.scene())
+        self.setErrorAct.setStatusTip("Show Error")
+        QtCore.QObject.connect(self.setErrorAct,
+                               QtCore.SIGNAL("triggered()"),
+                               self.set_error)
+        self.upgradeAbstractionAct = QtGui.QAction("Upgrade Module", self.scene())
+        self.upgradeAbstractionAct.setStatusTip("Upgrade the subworkflow module")
+        QtCore.QObject.connect(self.upgradeAbstractionAct,
+                   QtCore.SIGNAL("triggered()"),
+                   self.upgradeAbstraction)
+
+    def run_module(self):
+        self.scene().parent().execute(target=self.moduleId)
+
+    def set_breakpoint(self):
+        """ set_breakpoint() -> None
+        Sets this module as a breakpoint for execution
+        """
+        if self.moduleId >= 0:
+            self.scene().toggle_breakpoint(self.moduleId)
+            self.setBreakpoint(not self.is_breakpoint)
+        debug = get_default_interpreter().debugger
+        if debug:
+            debug.update()
+
+    def set_watched(self):
+        if self.moduleId >= 0:
+            self.scene().toggle_watched(self.moduleId)
+        debug = get_default_interpreter().debugger
+        if debug:
+            debug.update()
+
+    def set_error(self):
+        if self.moduleId >= 0:
+            self.scene().print_error(self.moduleId)
+
+    def configure(self):
+        """ configure() -> None
+        Open the modal configuration window
+        """
+        if self.moduleId>=0:
+            self.scene().open_configure_window(self.moduleId)
+
+    def annotate(self):
+        """ anotate() -> None
+        Open the annotations window
+        """
+        if self.moduleId>=0:
+            self.scene().open_annotations_window(self.moduleId)
+
+    def viewDocumentation(self):
+        """ viewDocumentation() -> None
+        Show the documentation for the module
+        """
+        assert self.moduleId >= 0
+        self.scene().open_documentation_window(self.moduleId)
+
+    def changeModuleLabel(self):
+        """ changeModuleLabel() -> None
+        Show the module label configuration widget
+        """
+        if self.moduleId>=0:
+            self.scene().open_module_label_window(self.moduleId)
+
+    def upgradeAbstraction(self):
+        """ upgradeAbstraction() -> None
+        Upgrade the abstraction to the latest version
+        """
+        if self.moduleId>=0:
+            (connections_preserved, missing_ports) = self.controller.upgrade_abstraction_module(self.moduleId, test_only=True)
+            upgrade_fail_prompt = getattr(get_vistrails_configuration(), 'upgradeModuleFailPrompt', True)
+            do_upgrade = True
+            if not connections_preserved and upgrade_fail_prompt:
+                ports_msg = '\n'.join(["  - %s port '%s'" % (p[0].capitalize(), p[1]) for p in missing_ports])
+                r = QtGui.QMessageBox.question(getBuilderWindow(), 'Modify Pipeline',
+                                       'Upgrading this module will change the pipeline because the following ports no longer exist in the upgraded module:\n\n'
+                                       + ports_msg +
+                                       '\n\nIf you proceed, function calls or connections to these ports will no longer exist and the pipeline may not execute properly.\n\n'
+                                       'Are you sure you want to proceed?',
+                                       QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                                       QtGui.QMessageBox.No)
+                do_upgrade = (r==QtGui.QMessageBox.Yes)
+            if do_upgrade:
+                self.controller.upgrade_abstraction_module(self.moduleId)
+                self.scene().setupScene(self.controller.current_pipeline)
+                self.controller.invalidate_version_tree()
+        
+class QGraphicsTmpConnItem(QtGui.QGraphicsLineItem):
+    def __init__(self, startPortItem, zValue=1, alwaysDraw=False, parent=None):
+        QtGui.QGraphicsLineItem.__init__(self, parent)
+        self.startPortItem = startPortItem
+        self.setPen(CurrentTheme.CONNECTION_SELECTED_PEN)
+        self.setZValue(zValue)
+        self.snapPortItem = None
+        self.alwaysDraw = alwaysDraw
+        self.currentPos = None
+
+    def updateLine(self):
+        if self.startPortItem is not None:
+            if self.snapPortItem is not None:
+                self.prepareGeometryChange()
+                self.setLine(QtCore.QLineF(self.startPortItem.getPosition(),
+                                           self.snapPortItem.getPosition()))
+                return
+            elif self.alwaysDraw and self.currentPos is not None:
+                self.prepareGeometryChange()
+                self.setLine(QtCore.QLineF(self.startPortItem.getPosition(),
+                                           self.currentPos))
+                return
+        self.disconnect()
+
+    def setStartPort(self, port):
+        self.startPortItem = port
+        self.updateLine()
+
+    def setSnapPort(self, port):
+        self.snapPortItem = port
+        self.updateLine()
+
+    def setCurrentPos(self, pos):
+        self.currentPos = pos
+        self.updateLine()
+
+    def disconnect(self, override=False):
+        if (not self.alwaysDraw or override) and self.startPortItem:
+            self.startPortItem.setSelected(False)
+        if self.snapPortItem:
+            self.snapPortItem.setSelected(False)
+
+    def hide(self):
+        self.disconnect(True)
+        QtGui.QGraphicsLineItem.hide(self)
+
+    def setConverting(self, converting):
+        if converting:
+            self.setPen(CurrentTheme.CONNECTION_SELECTED_CONVERTING_PEN)
+        else:
+            self.setPen(CurrentTheme.CONNECTION_SELECTED_PEN)
+
+##############################################################################
+# QGraphicsConnectionItem
+
+class QGraphicsConnectionItem(QGraphicsItemInterface,
+                              QtGui.QGraphicsPathItem):
+    """
+    QGraphicsConnectionItem is a connection shape connecting two port items
+
+    """
+
+    def __init__(self,
+                 srcPortItem, dstPortItem,
+                 srcModule, dstModule,
+                 connection,
+                 parent=None):
+        """ QGraphicsConnectionItem(
+                srcPortItem, dstPortItem: QAbstractGraphicsPortItem
+                srcModule, dstModule: QGraphicsModuleItem
+                connection: core.vistrail.connection.Connection
+                parent: QGraphicsItem
+                ) -> QGraphicsConnectionItem
+        Create the shape, initialize its pen and brush accordingly
+
+        """
+        path = self.create_path(srcPortItem.getPosition(), 
+                                dstPortItem.getPosition())
+        QtGui.QGraphicsPathItem.__init__(self, path, parent)
+        self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable)
+        # Bump it slightly higher than the highest module
+        self.setZValue(max(srcModule.id,
+                           dstModule.id) + 0.1)
+        self.srcPortItem = srcPortItem
+        self.dstPortItem = dstPortItem
+        self.connectionPen = CurrentTheme.CONNECTION_PEN
+        self.connectingModules = (srcModule, dstModule)
+        self.ghosted = False
+        self.connection = connection
+        self.id = connection.id
+        # Keep a flag for changing selection state during module selection
+        self.useSelectionRules = True
+
+    def setGhosted(self, ghosted):
+        """ setGhosted(ghosted: True) -> None
+        Set this link to be ghosted or not
+
+        """
+        self.ghosted = ghosted
+        if ghosted:
+            self.connectionPen = CurrentTheme.GHOSTED_CONNECTION_PEN
+        else:
+            self.connectionPen = CurrentTheme.CONNECTION_PEN
+
+    def set_custom_brush(self, brush):
+        self.connectionPen = QtGui.QPen(CurrentTheme.CONNECTION_PEN)
+        self.connectionPen.setBrush(brush)
+
+    def paint(self, painter, option, widget=None):
+        """ paint(painter: QPainter, option: QStyleOptionGraphicsItem,
+                  widget: QWidget) -> None
+        Peform actual painting of the connection
+
+        """
+        if self.isSelected():
+            painter.setPen(CurrentTheme.CONNECTION_SELECTED_PEN)
+        else:
+            painter.setPen(self.connectionPen)
+        painter.drawPath(self.path())
+
+    def setupConnection(self, startPos, endPos):
+        path = self.create_path(startPos, endPos)
+        self.setPath(path)
+
+    def create_path(self, startPos, endPos):
+        self.startPos = startPos
+        self.endPos = endPos
+
+        dx = abs(self.endPos.x() - self.startPos.x())
+        dy = (self.startPos.y() - self.endPos.y())
+
+        # This is reasonably ugly logic to get reasonably nice
+        # curves. Here goes: we use a cubic bezier p0,p1,p2,p3, where:
+
+        # p0 is the source port center
+        # p3 is the destination port center
+        # p1 is a control point displaced vertically from p0
+        # p2 is a control point displaced vertically from p3
+
+        # We want most curves to be "straight": they shouldn't bend
+        # much.  However, we want "inverted" connections (connections
+        # that go against the natural up-down flow) to bend a little
+        # as they go out of the ports. So the logic is:
+
+        # As dy/dx -> oo, we want the control point displacement to go
+        # to max(dy/2, m) (m is described below)
+
+        # As dy/dx -> 0, we want the control point displacement to go
+        # to m 
+
+        # As dy/dx -> -oo, we want the control point displacement to go
+        # to max(-dy/2, m)
+
+        # On points away from infinity, we want some smooth transition.
+        # I'm using f(x) = 2/pi arctan (x) as the mapping, since:
+
+        # f(-oo) = -1
+        # f(0) = 0
+        # f(oo) = 1
+
+        # m is the monotonicity breakdown point: this is the minimum
+        # displacement when dy/dx is low
+        m = float(CurrentTheme.MODULE_LABEL_MARGIN[0]) * 3.0
+
+        # positive_d and negative_d are the displacements when dy/dx is
+        # large positive and large negative
+        positive_d = max(m/3.0, dy / 2.0)
+        negative_d = max(m/3.0, -dy / 4.0)
+
+        if dx == 0.0:
+            v = 0.0
+        else:
+            w = math.atan(dy/dx) * (2 / math.pi)
+            if w < 0:
+                w = -w
+                v = w * negative_d + (1.0 - w) * m
+            else:
+                v = w * positive_d + (1.0 - w) * m
+
+        displacement = QtCore.QPointF(0.0, v)
+        self._control_1 = startPos + displacement
+        # !!! MAC OS X BUG !!!
+        # the difference between startPos.y and control_1.y cannot be
+        # equal to the difference between control_2.y and endPos.y
+        self._control_2 = self.endPos - displacement + QtCore.QPointF(0.0, 1e-11)
+        # self._control_2 = endPos - displacement
+
+
+        path = QtGui.QPainterPath(self.startPos)
+        path.cubicTo(self._control_1, self._control_2, self.endPos)
+        return path
+
+    def itemChange(self, change, value):
+        """ itemChange(change: GraphicsItemChange, value: value) -> value
+        If modules are selected, only allow connections between 
+        selected modules 
+
+        """
+        # Selection rules to be used only when a module isn't forcing 
+        # the update
+        if (change==QtGui.QGraphicsItem.ItemSelectedChange and 
+            self.useSelectionRules):
+            # Check for a selected module
+            selectedItems = self.scene().selectedItems()
+            selectedModules = False
+            for item in selectedItems:
+                if isinstance(item, QGraphicsModuleItem):
+                    selectedModules = True
+                    break
+            if selectedModules:
+                # Don't allow a connection between selected
+                # modules to be deselected
+                if (self.connectingModules[0].isSelected() and
+                    self.connectingModules[1].isSelected()):
+                    if not value:
+                        return True
+                # Don't allow a connection to be selected if
+                # it is not between selected modules
+                else:
+                    if value:
+                        return False
+        self.useSelectionRules = True
+        return QtGui.QGraphicsPathItem.itemChange(self, change, value)    
+
+##############################################################################
+# QGraphicsModuleItem
+
+class QGraphicsModuleItem(QGraphicsItemInterface, QtGui.QGraphicsItem):
+    """
+    QGraphicsModuleItem knows how to draw a Vistrail Module into the
+    pipeline view. It is usually a rectangular shape with a bold text
+    in the center. It also has its input/output port shapes as its
+    children. Another remark is that connections are also children of
+    module shapes. Each connection belongs to its source module
+    ('output port' end of the connection)
+    
+    """
+    def __init__(self, parent=None, scene=None):
+        """ QGraphicsModuleItem(parent: QGraphicsItem, scene: QGraphicsScene)
+                                -> QGraphicsModuleItem
+        Create the shape, initialize its pen and brush accordingly
+        
+        """
+        QtGui.QGraphicsItem.__init__(self, parent, scene)
+        self.paddedRect = QtCore.QRectF()
+        if QtCore.QT_VERSION >= 0x40600:
+            #Qt 4.6 specific flags
+            self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable |
+                          QtGui.QGraphicsItem.ItemIsMovable |
+                          QtGui.QGraphicsItem.ItemSendsGeometryChanges)
+        else:
+            self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable |
+                          QtGui.QGraphicsItem.ItemIsMovable)
+        self.setZValue(0)
+        self.labelFont = CurrentTheme.MODULE_FONT
+        self.labelFontMetric = CurrentTheme.MODULE_FONT_METRIC
+        self.descFont = CurrentTheme.MODULE_DESC_FONT
+        self.descFontMetric = CurrentTheme.MODULE_DESC_FONT_METRIC
+        self.modulePen = CurrentTheme.MODULE_PEN
+        self.moduleBrush = CurrentTheme.MODULE_BRUSH
+        self.labelPen = CurrentTheme.MODULE_LABEL_PEN
+        self.customBrush = None
+        self.statusBrush = None
+        self.labelRect = QtCore.QRectF()
+        self.descRect = QtCore.QRectF()
+        self.abstRect = QtCore.QRectF()
+        self.id = -1
+        self.label = ''
+        self.description = ''
+        self.inputPorts = {}
+        self.outputPorts = {}
+        self.controller = None
+        self.module = None
+        self.ghosted = False
+        self.invalid = False
+        self._module_shape = None
+        self._original_module_shape = None
+        self._old_connection_ids = None
+        self.errorTrace = None
+        self.is_breakpoint = False
+        self._needs_state_updated = True
+        self.progress = 0.0
+        self.progressBrush = CurrentTheme.SUCCESS_MODULE_BRUSH
+        self.connectionItems = {}
+        self._cur_function_names = set()
+        self.handlePositionChanges = True
+
+    def moduleHasChanged(self, core_module):
+        def module_text_has_changed(m1, m2):
+            m1_has = '__desc__' in m1.db_annotations_key_index
+            if m1_has != ('__desc__' in m2.db_annotations_key_index):
+                return True
+            if (m1_has and
+                # m2_has, since m1_has and previous condition
+                m1.db_annotations_key_index['__desc__'].value.strip()!=
+                m2.db_annotations_key_index['__desc__'].value.strip()):
+                return True            
+            return False
+
+        # def module_functions_have_changed(m1, m2):
+        #     f1_names = set([f.name for f in m1.functions])
+        #     f2_names = set([f.name for f in m2.functions])
+        #     return (len(f1_names ^ f2_names) > 0)
+
+        if self.scenePos().x() != core_module.center.x or \
+                -self.scenePos().y() != core_module.center.y:
+            return True
+        elif module_text_has_changed(self.module, core_module):
+            return True
+        # elif module_functions_have_changed(self.module, core_module):
+        #     return True
+        else:
+            # Check for changed ports
+            # _db_name because this shows up in the profile.
+            cip = sorted([x.key_no_id() for x in self.inputPorts])
+            cop = sorted([x.key_no_id() for x in self.outputPorts])
+            d = PortEndPoint.Destination
+            s = PortEndPoint.Source
+            pv = core_module.portVisible
+            new_ip = []
+            new_op = []
+            try:
+                new_ip = sorted([x.key_no_id() 
+                                 for x in core_module.destinationPorts()
+                                 if (not x.optional or (d, x._db_name) in pv)])
+                new_op = sorted([x.key_no_id() 
+                                 for x in core_module.sourcePorts()
+                                 if (not x.optional or (s, x._db_name) in pv)])
+            except ModuleRegistryException, e:
+                debug.critical("MODULE REGISTRY EXCEPTION: %s" % e)
+            if cip <> new_ip or cop <> new_op:
+                return True
+        return False
+
+    def moduleFunctionsHaveChanged(self, core_module):
+        m1 = self.module
+        m2 = core_module
+        f1_names = set([f.name for f in m1.functions])
+        f2_names = set([f.name for f in m2.functions])
+        return (len(f1_names ^ f2_names) > 0)
+
+    def update_function_ports(self, core_module=None):
+        if core_module is None:
+            core_module = self.module
+            added_functions = set(f.name for f in self.module.functions)
+            deleted_functions = set()
+            self._cur_function_names = copy.copy(added_functions)
+        else:
+            before_names = self._cur_function_names
+            after_names = set([f.name for f in core_module.functions])
+            # print "before_names:", before_names
+            # print "after_names:", after_names
+            added_functions = after_names - before_names
+            deleted_functions = before_names - after_names
+            self._cur_function_names = copy.copy(after_names)
+
+        # print "added_functions:", added_functions
+        # print "deleted_functions:", deleted_functions
+        if len(deleted_functions) > 0:
+            for function_name in deleted_functions:
+                try:
+                    r_spec = self.module.get_port_spec(function_name, 'input')
+                    f_spec = PortSpec(id=-1,
+                                      name=function_name,
+                                      type=PortSpec.port_type_map['input'],
+                                      sigstring=r_spec.sigstring)
+                    item = self.getInputPortItem(f_spec)
+                    if item is not None:
+                        item.disconnect()
+                except:
+                    # import traceback
+                    # traceback.print_exc()
+                    pass
+
+        if len(added_functions) > 0:
+            for function in core_module.functions:
+                if function.name not in added_functions:
+                    continue
+                added_functions.remove(function.name)
+                f_spec = PortSpec(id=-1,
+                                  name=function.name,
+                                  type=PortSpec.port_type_map['input'],
+                                  sigstring=function.sigstring)
+                item = self.getInputPortItem(f_spec)
+                if item is not None:
+                    item.connect()
+        
+        self.module = core_module
+
+    def setProgress(self, progress):
+        self.progress = progress
+        
+    def computeBoundingRect(self):
+        """ computeBoundingRect() -> None
+        Adjust the module size according to the text size
+        
+        """
+        labelRect = self.labelFontMetric.boundingRect(self.label)
+        if self.description:
+            self.description = '(' + self.description + ')'
+            descRect = self.descFontMetric.boundingRect(self.description)
+            # adjust labelRect in case descRect is wider
+            labelRect = labelRect.united(descRect)
+            descRect.adjust(0, 0, 0, CurrentTheme.MODULE_PORT_MARGIN[3])
+        else:
+            descRect = QtCore.QRectF(0, 0, 0, 0)
+
+        labelRect.translate(-labelRect.center().x(), -labelRect.center().y())
+        self.paddedRect = QtCore.QRectF(
+            labelRect.adjusted(-CurrentTheme.MODULE_LABEL_MARGIN[0],
+                                -CurrentTheme.MODULE_LABEL_MARGIN[1]
+                                -descRect.height()/2,
+                                CurrentTheme.MODULE_LABEL_MARGIN[2],
+                                CurrentTheme.MODULE_LABEL_MARGIN[3]
+                                +descRect.height()/2))
+        
+        self.labelRect = QtCore.QRectF(
+            self.paddedRect.left(),
+            -(labelRect.height()+descRect.height())/2,
+            self.paddedRect.width(),
+            labelRect.height())
+        self.descRect = QtCore.QRectF(
+            self.paddedRect.left(),
+            self.labelRect.bottom(),
+            self.paddedRect.width(),
+            descRect.height())
+        self.abstRect = QtCore.QRectF(
+            self.paddedRect.left(),
+            -self.labelRect.top()-CurrentTheme.MODULE_PORT_MARGIN[3],
+            labelRect.left()-self.paddedRect.left(),
+            self.paddedRect.bottom()+self.labelRect.top())
+
+    def boundingRect(self):
+        """ boundingRect() -> QRectF
+        Returns the bounding box of the module
+        
+        """
+        try:
+            r = self.paddedRect.adjusted(-2, -2, 2, 2)
+        except:
+            r = QtCore.QRectF()
+        return r
+
+    def setPainterState(self, is_selected=None):
+        if is_selected is None:
+            is_selected = self.isSelected()
+        if is_selected:
+            self.modulePen = CurrentTheme.MODULE_SELECTED_PEN
+            self.labelPen = CurrentTheme.MODULE_LABEL_SELECTED_PEN
+        elif self.is_breakpoint:
+            self.modulePen = CurrentTheme.BREAKPOINT_MODULE_PEN
+            self.labelPen = CurrentTheme.BREAKPOINT_MODULE_LABEL_PEN
+        elif self.ghosted:
+            self.modulePen = CurrentTheme.GHOSTED_MODULE_PEN
+            self.labelPen = CurrentTheme.GHOSTED_MODULE_LABEL_PEN
+        elif self.invalid:
+            self.modulePen = CurrentTheme.INVALID_MODULE_PEN
+            self.labelPen = CurrentTheme.INVALID_MODULE_LABEL_PEN
+        else:
+            self.labelPen = CurrentTheme.MODULE_LABEL_PEN
+            if self.module is not None and self.module.is_abstraction():
+                self.modulePen = CurrentTheme.ABSTRACTION_PEN
+            elif self.module is not None and self.module.is_group():
+                self.modulePen = CurrentTheme.GROUP_PEN
+            else:
+                self.modulePen = CurrentTheme.MODULE_PEN
+
+        if self.statusBrush:
+            self.moduleBrush = self.statusBrush
+        elif self.customBrush:
+            self.moduleBrush = self.customBrush
+        elif self.is_breakpoint:
+            self.moduleBrush = CurrentTheme.BREAKPOINT_MODULE_BRUSH
+        elif self.ghosted:
+            self.moduleBrush = CurrentTheme.GHOSTED_MODULE_BRUSH
+        elif self.invalid:
+            self.moduleBrush = CurrentTheme.INVALID_MODULE_BRUSH
+        else:
+            self.moduleBrush = CurrentTheme.MODULE_BRUSH
+            
+    def setGhosted(self, ghosted):
+        """ setGhosted(ghosted: True) -> None
+        Set this link to be ghosted or not
+        
+        """
+        if self.ghosted != ghosted:
+            self.ghosted = ghosted
+            for port in self.inputPorts.itervalues():
+                port.setGhosted(ghosted)
+            for port in self.outputPorts.itervalues():
+                port.setGhosted(ghosted)
+            self._needs_state_udpated = True
+
+#             if ghosted:
+#                 self.modulePen = CurrentTheme.GHOSTED_MODULE_PEN
+#                 self.moduleBrush = CurrentTheme.GHOSTED_MODULE_BRUSH
+#                 self.labelPen = CurrentTheme.GHOSTED_MODULE_LABEL_PEN
+#             else:
+#                 self.modulePen = CurrentTheme.MODULE_PEN
+#                 self.moduleBrush = CurrentTheme.MODULE_BRUSH
+#                 self.labelPen = CurrentTheme.MODULE_LABEL_PEN
+
+    def setInvalid(self, invalid):
+        if self.invalid != invalid:
+            self.invalid = invalid
+            for port in self.inputPorts.itervalues():
+                port.setInvalid(invalid)
+            for port in self.outputPorts.itervalues():
+                port.setInvalid(invalid)
+            self._needs_state_updated = True
+
+    def setBreakpoint(self, breakpoint):
+        if self.is_breakpoint != breakpoint:
+            self.is_breakpoint = breakpoint
+            if breakpoint:
+                self._original_module_shape = self._module_shape
+                self.set_module_shape(self.create_shape_from_fringe(
+                        CurrentTheme.BREAKPOINT_FRINGE))
+            else:
+                self._module_shape = self._original_module_shape
+            self._needs_state_updated = True
+
+#             if breakpoint:
+#                 self.modulePen = CurrentTheme.BREAKPOINT_MODULE_PEN
+#                 self.moduleBrush = CurrentTheme.BREAKPOINT_MODULE_BRUSH
+#                 self.labelPen = CurrentTheme.BREAKPOINT_MODULE_LABEL_PEN
+            
+    def set_module_shape(self, module_shape=None):
+        self._module_shape = module_shape
+        if self._module_shape is not None:
+            self.paddedRect = self._module_shape.boundingRect()
+
+    def set_custom_brush(self, brush):
+        self.customBrush = brush
+        self._needs_state_updated = True
+
+    def paint(self, painter, option, widget=None):
+        """ paint(painter: QPainter, option: QStyleOptionGraphicsItem,
+                  widget: QWidget) -> None
+        Peform actual painting of the module
+        
+        """
+        if self.progress>0.0:
+            width = (self.progress-1.0)*self.paddedRect.width()
+            progressRect = self.paddedRect.adjusted(0, 0, width, 0)
+            
+        if self._needs_state_updated:
+            self.setPainterState()
+            self._needs_state_updated = False
+            
+        # draw module shape
+        painter.setBrush(self.moduleBrush)
+        painter.setPen(self.modulePen)
+        if self._module_shape:
+            painter.drawPolygon(self._module_shape)
+            if self.progress>0.0:
+                painter.setClipRect(progressRect)
+                painter.setBrush(self.progressBrush)
+                painter.drawPolygon(self._module_shape)
+                painter.setClipping(False)
+            painter.drawPolyline(self._module_shape)
+        else:
+            painter.fillRect(self.paddedRect, painter.brush())
+            if self.progress>0.0:
+                painter.fillRect(progressRect, self.progressBrush)
+            painter.setBrush(QtCore.Qt.NoBrush)
+            painter.drawRect(self.paddedRect)
+    
+        # draw module labels
+        painter.setPen(self.labelPen)
+        painter.setFont(self.labelFont)
+        painter.drawText(self.labelRect, QtCore.Qt.AlignCenter, self.label)
+        if self.module.is_abstraction() and not self.module.is_latest_version():
+            painter.drawText(self.abstRect, QtCore.Qt.AlignCenter, '!')
+        if self.descRect:
+            painter.setFont(self.descFont)
+            painter.drawText(self.descRect, QtCore.Qt.AlignCenter,
+                             self.description)
+
+    def paintToPixmap(self, scale_x, scale_y):
+        bounding_rect = self.paddedRect.adjusted(-6,-6,6,6)
+        center_x = (bounding_rect.width() / 2.0) #* m.m11()
+        center_y = (bounding_rect.height() / 2.0) #* m.m22()
+        pixmap = QtGui.QPixmap(int(bounding_rect.width() * scale_x),
+                         int(bounding_rect.height() * scale_y))
+        pixmap.fill(QtGui.QColor(255,255,255,0))
+        painter = QtGui.QPainter(pixmap)
+        painter.setOpacity(0.5)
+        painter.scale(scale_x, scale_y)
+        painter.setRenderHints(QtGui.QPainter.Antialiasing |
+                               QtGui.QPainter.SmoothPixmapTransform)
+        painter.translate(center_x, center_y)
+        self.paint(painter, QtGui.QStyleOptionGraphicsItem())
+        for port in self.inputPorts.itervalues():
+            m = port.matrix()
+            painter.save()
+            painter.translate(m.dx(), m.dy())
+            port.paint(painter, QtGui.QStyleOptionGraphicsItem())
+            painter.restore()
+        for port in self.outputPorts.itervalues():
+            m = port.matrix()
+            painter.save()
+            painter.translate(m.dx(), m.dy())
+            port.paint(painter, QtGui.QStyleOptionGraphicsItem())
+            painter.restore()
+        painter.end()
+        return pixmap
+
+    def adjustWidthToMin(self, minWidth):
+        """ adjustWidthToContain(minWidth: int) -> None
+        Resize the module width to at least be minWidth
+        
+        """
+        if minWidth>self.paddedRect.width():
+            diff = minWidth - self.paddedRect.width() + 1
+            self.paddedRect.adjust(-diff/2, 0, diff/2, 0)
+
+    def setupModule(self, module):
+        """ setupModule(module: Module) -> None
+        Set up the item to reflect the info in 'module'
+        
+        """
+        # Update module info and visual
+        self.id = module.id
+        self.setZValue(float(self.id))
+        self.module = module
+        self.center = copy.copy(module.center)
+        if '__desc__' in module.db_annotations_key_index:
+            self.label = module.get_annotation_by_key('__desc__').value.strip()
+            self.description = module.label
+        else:
+            self.label = module.label
+            self.description = ''
+        self.setToolTip(self.description)
+        self.computeBoundingRect()
+        self.setPos(module.center.x, -module.center.y)
+
+        # Check to see which ports will be shown on the screen
+        # setupModule is in a hotpath, performance-wise, which is the
+        # reason for the strange ._db_name lookup - we're
+        # avoiding property calls
+        inputPorts = []
+        self.inputPorts = {}
+        visibleOptionalInputPorts = []
+        self.optionalInputPorts = []
+
+        outputPorts = []
+        self.outputPorts = {}
+        visibleOptionalOutputPorts = []
+        self.optionalOutputPorts = []
+
+        error = None
+        if module.is_valid:
+            try:
+                d = PortEndPoint.Destination
+                for p in module.destinationPorts():
+                    if not p.optional:
+                        inputPorts.append(p)
+                    # elif (d, p.name) in module.portVisible:
+                    elif p.name in module.visible_input_ports:
+                        visibleOptionalInputPorts.append(p)
+                    else:
+                        self.optionalInputPorts.append(p)
+                inputPorts += visibleOptionalInputPorts
+
+                s = PortEndPoint.Source
+                for p in module.sourcePorts():
+                    if not p.optional:
+                        outputPorts.append(p)
+                    # elif (s, p.name) in module.portVisible:
+                    elif p.name in module.visible_output_ports:
+                        visibleOptionalOutputPorts.append(p)
+                    else:
+                        self.optionalOutputPorts.append(p)
+                outputPorts += visibleOptionalOutputPorts
+            except ModuleRegistryException, e:
+                error = e
+
+        # Local dictionary lookups are faster than global ones..
+        t = CurrentTheme
+        (mpm0, mpm1, mpm2, mpm3) = t.MODULE_PORT_MARGIN
+
+        # Adjust the width to fit all ports
+        maxPortCount = max(len(inputPorts), len(outputPorts))
+        minWidth = (mpm0 +
+                    t.PORT_WIDTH*maxPortCount +
+                    t.MODULE_PORT_SPACE*(maxPortCount-1) +
+                    mpm2 +
+                    t.MODULE_PORT_PADDED_SPACE)
+        self.adjustWidthToMin(minWidth)
+
+        self.nextInputPortPos = [self.paddedRect.x() + mpm0,
+                                 self.paddedRect.y() + mpm1]
+        self.nextOutputPortPos = [self.paddedRect.right() - \
+                                      t.PORT_WIDTH - mpm2,
+                                  self.paddedRect.bottom() - \
+                                      t.PORT_HEIGHT - mpm3]
+
+        # Update input ports
+        [x, y] = self.nextInputPortPos
+        for port in inputPorts:
+            self.inputPorts[port] = self.createPortItem(port, x, y)
+            x += t.PORT_WIDTH + t.MODULE_PORT_SPACE
+        self.nextInputPortPos = [x,y]
+
+        # Update output ports
+        [x, y] = self.nextOutputPortPos
+        for port in outputPorts:            
+            self.outputPorts[port] = self.createPortItem(port, x, y)
+            x -= t.PORT_WIDTH + t.MODULE_PORT_SPACE
+        self.nextOutputPortPos = [x, y]
+
+        # Add a configure button
+        y = self.paddedRect.y() + mpm1
+        x = (self.paddedRect.right() - t.CONFIGURE_WIDTH
+             - mpm2)
+        self.createConfigureItem(x, y)
+
+        if module.is_valid:
+            try:
+                # update module color and shape
+                descriptor = module.module_descriptor
+    #             c = registry.get_module_color(module.package, module.name, 
+    #                                       module.namespace)
+                c = descriptor.module_color()
+                if c:
+                    ic = [int(cl*255) for cl in c]
+                    b = QtGui.QBrush(QtGui.QColor(ic[0], ic[1], ic[2]))
+                    self.set_custom_brush(b)
+    #             fringe = registry.get_module_fringe(module.package,
+    #                                                 module.name,
+    #                                                 module.namespace)
+                fringe = descriptor.module_fringe()
+                if fringe:
+                    self.set_module_shape(self.create_shape_from_fringe(fringe))
+            except ModuleRegistryException, e:
+                error = e
+
+            self.update_function_ports()
+        else:
+            self.setInvalid(True)
+            
+    def create_shape_from_fringe(self, fringe):
+        left_fringe, right_fringe = fringe
+        if left_fringe[0] != (0.0, 0.0):
+            left_fringe = [(0.0, 0.0)] + left_fringe
+        if left_fringe[-1] != (0.0, 1.0):
+            left_fringe = left_fringe + [(0.0, 1.0)]
+
+        if right_fringe[0] != (0.0, 0.0):
+            right_fringe = [(0.0, 0.0)] + right_fringe
+        if right_fringe[-1] != (0.0, 1.0):
+            right_fringe = right_fringe + [(0.0, 1.0)]
+
+        P = QtCore.QPointF
+        module_shape = QtGui.QPolygonF()
+        height = self.paddedRect.height()
+
+        # right side of shape
+        for (px, py) in right_fringe:
+            p = P(px, -py)
+            p *= height
+            p += self.paddedRect.bottomRight()
+            module_shape.append(p)
+
+        # left side of shape
+        for (px, py) in reversed(left_fringe):
+            p = P(px, -py)
+            p *= height
+            p += self.paddedRect.bottomLeft()
+            module_shape.append(p)
+        # close polygon
+        module_shape.append(module_shape[0])
+        return module_shape
+
+    def createPortItem(self, port, x, y):
+        """ createPortItem(port: Port, x: int, y: int) -> QGraphicsPortItem
+        Create a item from the port spec
+        
+        """
+        # pts = [(0,2),(0,-2), (2,None), (-2,None),
+        #        (None,-2), (None,2), (-2,0), (2,0)]
+        # pts = [(0,0.2), (0, 0.8), (0.2, None), (0.8, None), 
+        #        (None, 0.8), (None, 0.2), (0.8,0), (0.2, 0)]
+        # portShape = QGraphicsPortPolygonItem(x, y, self.ghosted, self, 
+        #                                      port.optional, port.min_conns,
+        #                                      port.max_conns, points=pts)
+        # portShape = QGraphicsPortTriangleItem(x, y, self.ghosted, self, 
+        #                                       port.optional, port.min_conns,
+        #                                       port.max_conns, angle=0)
+        # portShape = QGraphicsPortDiamondItem(x, y, self.ghosted, self, 
+        #                                      port.optional, port.min_conns,
+        #                                      port.max_conns)
+    
+        port_klass = QGraphicsPortRectItem
+        kwargs = {}
+        shape = port.shape()
+        if shape is not None:
+            if isinstance(shape, basestring):
+                if shape.startswith("triangle"):
+                    port_klass = QGraphicsPortTriangleItem
+                    try:
+                        kwargs['angle'] = int(shape[8:])
+                    except:
+                        kwargs['angle'] = 0
+                elif shape == "diamond":
+                    port_klass = QGraphicsPortDiamondItem
+                elif shape == "circle" or shape == "ellipse":
+                    port_klass = QGraphicsPortEllipseItem
+            else:
+                is_iterable = False
+                try:
+                    shape.__iter__()
+                    is_iterable = True
+                    port_klass = QGraphicsPortPolygonItem
+                    kwargs['points'] = shape
+                except:
+                    pass
+
+        portShape = port_klass(port, x, y, self.ghosted, self, **kwargs)
+        # portShape = QGraphicsPortRectItem(port, x, y, self.ghosted, self)
+
+        portShape.controller = self.controller
+        portShape.port = port
+        if not port.is_valid:
+            portShape.setInvalid(True)
+        return portShape
+
+    def createConfigureItem(self, x, y):
+        """ createConfigureItem(x: int, y: int) -> QGraphicsConfigureItem
+        Create a item from the configure spec
+        
+        """
+        if self.module.is_valid:
+            configureShape = QGraphicsConfigureItem(self, self.scene())
+            configureShape.controller = self.controller
+            configureShape.moduleId = self.id
+            configureShape.setGhosted(self.ghosted)
+            configureShape.setBreakpoint(self.module.is_breakpoint)
+            configureShape.translate(x, y)
+            return configureShape
+        return None
+
+    def getPortItem(self, port, port_dict=None):
+        # print 'looking for port', port.name, port.type, port_type
+            
+        registry = get_module_registry()
+
+        # if we haven't validated pipeline, don't try to use the registry
+        if self.module.is_valid:
+            # check enabled ports
+            for (p, item) in port_dict.iteritems():
+                if registry.port_and_port_spec_match(port, p):
+                    return item
+                        
+        # FIXME Raise Error!
+        # else not available for some reason, just draw port and raise error?
+        # can also decide to use Variant/Module types
+        # or use types from the signature
+        # port_descs = port.descriptors()
+                
+        # first, check if we've already added the port
+        for (p, item) in port_dict.iteritems():
+            if (PortSpec.port_type_map.inverse[port.type] == p.type and
+                port.name == p.name and 
+                port.sigstring == p.sigstring):
+                return item
+
+        return None
+
+    def buildPortItem(self, port, port_dict, optional_ports, visible_ports,
+                      next_pos, next_op, default_sig):
+        """buildPortItem(port: Port,
+                         port_dict: {PortSpec: QGraphicsPortItem},
+                         optional_ports: [PortSpec],
+                         visible_ports: set(string),
+                         next_pos: [float, float],
+                         next_op: operator (operator.add, operator.sub),
+                         default_sig: str
+                         ) -> QPointF
+        Return the scene position of a port matched 'port' in port_dict
+        
+        """
+        registry = get_module_registry()
+        
+        # check optional ports
+        if self.module.is_valid:
+            for p in optional_ports:
+                if registry.port_and_port_spec_match(port, p):
+                    item = self.createPortItem(p, *next_pos)
+                    visible_ports.add(port.name)
+                    port_dict[p] = item
+                    next_pos[0] = next_op(next_pos[0], 
+                                          (CurrentTheme.PORT_WIDTH +
+                                           CurrentTheme.MODULE_PORT_SPACE))
+                    return item
+
+        debug.log("PORT SIG:" + port.signature)
+        if not port.signature or port.signature == '()':
+            # or len(port_descs) == 0:
+            sigstring = default_sig
+        else:
+            sigstring = port.signature
+        port_type = PortSpec.port_type_map.inverse[port.type]
+        names = []
+        for sig in sigstring[1:-1].split(','):
+            k = sig.split(':', 2)
+            if len(k) < 2:
+                names.append(k[0])
+            else:
+                names.append(k[1])
+        short_sigstring = '(' + ','.join(names) + ')'
+        tooltip = "%s port %s\n%s" % (port_type.capitalize(),
+                                      port.name,
+                                      short_sigstring)
+        new_spec = PortSpec(id=-1,
+                            name=port.name,
+                            type=port_type,
+                            sigstring=sigstring,
+                            tooltip=tooltip,
+                            optional=True)
+
+        item = self.createPortItem(new_spec, *next_pos)
+        item.setInvalid(True)
+        port_dict[new_spec] = item
+        next_pos[0] = next_op(next_pos[0], 
+                              (CurrentTheme.PORT_WIDTH +
+                               CurrentTheme.MODULE_PORT_SPACE))
+        return item
+
+    def getInputPortItem(self, port, do_create=False):
+        item = self.getPortItem(port, self.inputPorts)
+        if not item and do_create:
+            item = self.buildPortItem(port,
+                                      self.inputPorts,
+                                      self.optionalInputPorts,
+                                      self.module.visible_input_ports,
+                                      self.nextInputPortPos,
+                                      operator.add,
+                                      '(%s:Variant)' % \
+                                          get_vistrails_basic_pkg_id())
+        return item
+
+    def getOutputPortItem(self, port, do_create=False):
+        item = self.getPortItem(port, self.outputPorts)
+        if not item and do_create:
+            item = self.buildPortItem(port,
+                                      self.outputPorts,
+                                      self.optionalOutputPorts,
+                                      self.module.visible_output_ports,
+                                      self.nextOutputPortPos,
+                                      operator.sub,
+                                      '(%s:Module)' % \
+                                          get_vistrails_basic_pkg_id())
+        return item
+
+    def addConnectionItem(self, item):
+        self.connectionItems[item.connection.id] = item
+
+    def removeConnectionItem(self, item):
+        if item.connectingModules[0].id == self.module.id:
+            if item.srcPortItem is not None:
+                item.srcPortItem.disconnect()
+        if item.connectingModules[1].id == self.module.id:
+            if item.dstPortItem is not None:
+                item.dstPortItem.disconnect()
+        del self.connectionItems[item.connection.id]
+
+    # returns a dictionary of (id, connection) key-value pairs!
+    def dependingConnectionItems(self):
+        return self.connectionItems
+
+    # this is a generator that yields (connection, is_source [bool]) pairs
+    def dependingConnectionItemsWithDir(self):
+        for item in self.connectionItems.itervalues():
+            if item.connectingModules[0].id == self.id:
+                yield (item, False)
+            else:
+                yield (item, True)
+
+    def itemChange(self, change, value):
+        """ itemChange(change: GraphicsItemChange, value: value) -> value
+        Capture move event to also move the connections.  Also unselect any
+        connections between unselected modules
+        
+        """
+        # Move connections with modules
+        if change==QtGui.QGraphicsItem.ItemPositionChange and \
+                self.handlePositionChanges:
+            oldPos = self.pos()
+            newPos = value
+            dis = newPos - oldPos
+            for connectionItem, s in self.dependingConnectionItemsWithDir():
+                # If both modules are selected, both of them will
+                # trigger itemChange events.
+
+                # If we just add 'dis' to both connection endpoints, we'll
+                # end up moving each endpoint twice.
+
+                # But we also don't want to call setupConnection twice on these
+                # connections, so we ignore one of the endpoint dependencies and
+                # perform the change on the other one
+
+                (srcModule, dstModule) = connectionItem.connectingModules
+                start_s = srcModule.isSelected()
+                end_s = dstModule.isSelected()
+
+                if start_s and end_s and s:
+                    continue
+
+                start = connectionItem.startPos
+                end = connectionItem.endPos
+                
+                if start_s: start += dis
+                if end_s: end += dis
+                
+                connectionItem.prepareGeometryChange()
+                connectionItem.setupConnection(start, end)
+        # Do not allow lone connections to be selected with modules.
+        # Also autoselect connections between selected modules.  Thus the
+        # selection is always the subgraph
+        elif change==QtGui.QGraphicsItem.ItemSelectedHasChanged:
+            # Unselect any connections between modules that are not selected
+            for item in self.scene().selectedItems():
+                if isinstance(item,QGraphicsConnectionItem):
+                    (srcModule, dstModule) = item.connectingModules
+                    if (not srcModule.isSelected() or 
+                        not dstModule.isSelected()):
+                        item.useSelectionRules = False
+                        item.setSelected(False)
+            # Handle connections from self
+            for item in self.dependingConnectionItems().itervalues():
+                # Select any connections between self and other selected modules
+                (srcModule, dstModule) = item.connectingModules
+                if value:
+                    if (srcModule==self and dstModule.isSelected() or
+                        dstModule==self and srcModule.isSelected()):
+                        # Because we are setting a state variable in the
+                        # connection, do not make the change unless it is
+                        # actually going to be performed
+                        if not item.isSelected():
+                            item.useSelectionRules = False
+                            item.setSelected(True)
+                # Unselect any connections between self and other modules
+                else:
+                    if item.isSelected():
+                        item.useSelectionRules = False
+                        item.setSelected(False)
+            # Capture only selected modules + or - self for selection signal
+            selectedItems = [m for m in self.scene().selectedItems()
+                             if isinstance(m, QGraphicsModuleItem)]
+            #print "selectedItems", selectedItems
+            selectedId = -1
+            if len(selectedItems)==1:
+                selectedId = selectedItems[0].id
+            self.scene().emit(QtCore.SIGNAL('moduleSelected'),
+                              selectedId, selectedItems)
+            self._needs_state_updated = True
+        return QtGui.QGraphicsItem.itemChange(self, change, value)
+
+def choose_converter(converters, parent=None):
+    """Chooses a converter among a list.
+    """
+    if len(converters) == 1:
+        return converters[0]
+
+    class ConverterItem(QtGui.QListWidgetItem):
+        def __init__(self, converter):
+            QtGui.QListWidgetItem.__init__(self, converter.name)
+            self.converter = converter
+
+    dialog = QtGui.QDialog(parent)
+    dialog.setWindowTitle("Automatic conversion")
+    layout = QtGui.QVBoxLayout()
+
+    label = QtGui.QLabel(
+            "You are connecting two incompatible ports, however there are "
+            "matching Converter modules. Please choose which Converter should "
+            "be inserted on this connection:")
+    label.setWordWrap(True)
+    layout.addWidget(label)
+    list_widget = QtGui.QListWidget()
+    list_widget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+    for converter in sorted(converters, key=lambda c: c.name):
+        list_widget.addItem(ConverterItem(converter))
+    layout.addWidget(list_widget)
+
+    buttons = QtGui.QDialogButtonBox(
+            QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel,
+            QtCore.Qt.Horizontal)
+    QtCore.QObject.connect(buttons, QtCore.SIGNAL('accepted()'),
+                           dialog, QtCore.SLOT('accept()'))
+    QtCore.QObject.connect(buttons, QtCore.SIGNAL('rejected()'),
+                           dialog, QtCore.SLOT('reject()'))
+    layout.addWidget(buttons)
+
+    ok = buttons.button(QtGui.QDialogButtonBox.Ok)
+    ok.setEnabled(False)
+    QtCore.QObject.connect(
+            list_widget, QtCore.SIGNAL('itemSelectionChanged()'),
+            lambda: ok.setEnabled(True))
+
+    dialog.setLayout(layout)
+    if dialog.exec_() == QtGui.QDialog.Accepted:
+        return list_widget.selectedItems()[0].converter
+    else:
+        return None
+
+##############################################################################
+# QPipelineScene
+
+class QPipelineScene(QInteractiveGraphicsScene):
+    """
+    QPipelineScene inherits from QInteractiveGraphicsScene to keep track of the
+    pipeline scenes, i.e. modules, connections, selection
+    
+    """
+
+    def __init__(self, parent=None):
+        """ QPipelineScene(parent: QWidget) -> QPipelineScene
+        Initialize the graphics scene with no shapes
+        
+        """
+        QInteractiveGraphicsScene.__init__(self, parent)
+        self.setBackgroundBrush(CurrentTheme.PIPELINE_VIEW_BACKGROUND_BRUSH)
+        self.setSceneRect(QtCore.QRectF(-5000, -5000, 10000, 10000))
+        self.controller = None
+        self.modules = {}
+        self.connections = {}
+        self.noUpdate = False
+        self.installEventFilter(self)
+        self.pipeline_tab = None
+        self._old_module_ids = set()
+        self._old_connection_ids = set()
+        self._var_selected_port = None
+        self.pipeline = None
+        self.read_only_mode = False
+        self.current_pipeline = None
+        self.current_version = -1
+        self.progress = None
+
+        self.tmp_module_item = None
+        self.tmp_input_conn = None
+        self.tmp_output_conn = None
+
+    def addModule(self, module, moduleBrush=None):
+        """ addModule(module: Module, moduleBrush: QBrush) -> QGraphicsModuleItem
+        Add a module to the scene
+        
+        """
+        moduleItem = QGraphicsModuleItem(None)
+        if self.controller and self.controller.search:
+            moduleQuery = (self.controller.current_version, module)
+            matched = self.controller.search.matchModule(*moduleQuery)
+            moduleItem.setGhosted(not matched)
+        moduleItem.controller = self.controller
+        moduleItem.setupModule(module)
+        moduleItem.setBreakpoint(module.is_breakpoint)
+        if moduleBrush:
+            moduleItem.set_custom_brush(moduleBrush)
+        self.addItem(moduleItem)
+        self.modules[module.id] = moduleItem
+        self._old_module_ids.add(module.id)
+        # Hide vistrail variable modules
+        if module.is_vistrail_var():
+            moduleItem.hide()
+
+        return moduleItem
+
+    def addConnection(self, connection, connectionBrush=None):
+        """ addConnection(connection: Connection) -> QGraphicsConnectionItem
+        Add a connection to the scene
+        
+        """
+        srcModule = self.modules[connection.source.moduleId]
+        dstModule = self.modules[connection.destination.moduleId]
+        srcPortItem = srcModule.getOutputPortItem(connection.source, True)
+        dstPortItem = dstModule.getInputPortItem(connection.destination, True)
+        connectionItem = QGraphicsConnectionItem(srcPortItem, dstPortItem,
+                                                 srcModule, dstModule,
+                                                 connection)
+        srcPortItem.connect()
+        dstPortItem.connect()
+        connectionItem.id = connection.id
+        connectionItem.connection = connection
+        if connectionBrush:
+            connectionItem.set_custom_brush(connectionBrush)
+        self.addItem(connectionItem)
+        self.connections[connection.id] = connectionItem
+        self._old_connection_ids.add(connection.id)
+        srcModule.addConnectionItem(connectionItem)
+        dstModule.addConnectionItem(connectionItem)
+        if srcModule.module.is_vistrail_var():
+            connectionItem.hide()
+            var_uuid = srcModule.module.get_vistrail_var()
+            dstPortItem.addVistrailVar(
+                self.controller.get_vistrail_variable_by_uuid(var_uuid))
+        return connectionItem
+
+    def selected_subgraph(self):
+        """Returns the subgraph containing the selected modules and its
+        mutual connections.
+        
+        """
+        items = self.selectedItems()
+        modules = [x.id
+                   for x in items
+                   if isinstance(x, QGraphicsModuleItem)]
+        return self.controller.current_pipeline.graph.subgraph(modules)
+
+#    def contextMenuEvent(self, event):
+#        selectedItems = self.selectedItems()
+#        if len(selectedItems) == 0:
+#            return QInteractiveGraphicsScene.contextMenuEvent(self, event)
+#        else:
+#            self._context_menu.exec_(event.screenPos())
+
+    def clear(self):
+        """ clear() -> None
+        Clear the whole scene
+        
+        """
+        self.modules = {}
+        self.connections = {}
+        self._old_module_ids = set()
+        self._old_connection_ids = set()
+        self.unselect_all()
+        self.clearItems()
+        
+    def remove_module(self, m_id):
+        """remove_module(m_id): None
+
+        Removes module from scene, updating appropriate data structures.
+
+        """
+        core_module = self.modules[m_id].module
+        if not core_module.has_annotation_with_key('__vistrail_var__'):
+            self.removeItem(self.modules[m_id])
+        del self.modules[m_id]
+        self._old_module_ids.remove(m_id)
+
+    def remove_connection(self, c_id):
+        """remove_connection(c_id): None
+
+        Removes connection from scene, updating appropriate data structures.
+
+        """
+        # if c_id in self.connections:
+        connItem = self.connections[c_id]
+        (srcModule, dstModule) = connItem.connectingModules
+        srcModule.removeConnectionItem(connItem)
+        dstModule.removeConnectionItem(connItem)
+        if not srcModule.module.has_annotation_with_key('__vistrail_var__'):
+            self.removeItem(self.connections[c_id])
+        del self.connections[c_id]
+        self._old_connection_ids.remove(c_id)
+        
+
+    def recreate_module(self, pipeline, m_id):
+        """recreate_module(pipeline, m_id): None
+
+        Recreates a module on the scene."""
+        selected = self.modules[m_id].isSelected()
+
+        depending_connections = \
+            [c_id for c_id in self.modules[m_id].dependingConnectionItems()]
+        # old_depending_connections = self.modules[m_id]._old_connection_ids
+        
+        #when configuring a python source, maybe connections were deleted
+        # but are not in the current pipeline. So we need to check the depending
+        # connections of the module just before the configure. 
+        for c_id in depending_connections:
+            self.remove_connection(c_id)
+
+        self.remove_module(m_id)
+        
+        self.addModule(pipeline.modules[m_id])
+        for c_id in depending_connections:
+            # only add back those connections that are in the pipeline
+            if c_id in pipeline.connections:
+                self.addConnection(pipeline.connections[c_id])
+                               
+        if selected:
+            self.modules[m_id].setSelected(True)
+            
+    def update_module_functions(self, pipeline, m_id):
+        self.modules[m_id].update_function_ports(pipeline.modules[m_id])
+
+    def setupScene(self, pipeline):
+        """ setupScene(pipeline: Pipeline) -> None
+        Construct the scene to view a pipeline
+        
+        """
+        old_pipeline = self.pipeline
+        self.pipeline = pipeline
+
+        if self.noUpdate: return
+        if (pipeline is None or 
+            (old_pipeline and not old_pipeline.is_valid) or 
+            (pipeline and not pipeline.is_valid)):
+            # clear things
+            self.clear()
+        if not pipeline: return 
+            
+        needReset = len(self.items())==0
+        try:
+            new_modules = set(pipeline.modules)
+            modules_to_be_added = new_modules - self._old_module_ids
+            modules_to_be_deleted = self._old_module_ids - new_modules
+            common_modules = new_modules.intersection(self._old_module_ids)
+
+            new_connections = set(pipeline.connections)
+            connections_to_be_added = new_connections - self._old_connection_ids
+            connections_to_be_deleted = self._old_connection_ids - new_connections
+            common_connections = new_connections.intersection(self._old_connection_ids)
+
+            # Check if connections to be added require 
+            # optional ports in modules to be visible
+            for c_id in connections_to_be_added:
+                connection = pipeline.connections[c_id]
+                smid = connection.source.moduleId
+                s = connection.source.spec
+                if s and s.optional:
+                    smm = pipeline.modules[smid]
+                    smm.portVisible.add((PortEndPoint.Source,s.name))
+                dmid = connection.destination.moduleId   
+                d = connection.destination.spec
+                if d and d.optional:
+                    dmm = pipeline.modules[dmid]
+                    dmm.portVisible.add((PortEndPoint.Destination,d.name))
+
+            # remove old connection shapes
+            for c_id in connections_to_be_deleted:
+                self.remove_connection(c_id)
+            # remove old module shapes
+            for m_id in modules_to_be_deleted:
+                self.remove_module(m_id)
+
+            selected_modules = []
+            # create new module shapes
+            for m_id in modules_to_be_added:
+                self.addModule(pipeline.modules[m_id])
+                if self.modules[m_id].isSelected():
+                    selected_modules.append(m_id)
+
+            moved = set()
+            # Update common modules
+            for m_id in common_modules:
+                tm_item = self.modules[m_id]
+                tm = tm_item.module
+                nm = pipeline.modules[m_id]
+                if tm_item.moduleHasChanged(nm):
+                    self.recreate_module(pipeline, m_id)
+                elif tm_item.moduleFunctionsHaveChanged(nm):
+                    tm_item.update_function_ports(pipeline.modules[m_id])
+                if tm_item.isSelected():
+                    selected_modules.append(m_id)
+                if self.controller and self.controller.search:
+                    moduleQuery = (self.controller.current_version, nm)
+                    matched = \
+                        self.controller.search.matchModule(*moduleQuery)
+                    tm_item.setGhosted(not matched)
+                else:
+                    tm_item.setGhosted(False)
+                tm_item.setBreakpoint(nm.is_breakpoint)
+
+            # create new connection shapes
+            for c_id in connections_to_be_added:
+                self.addConnection(pipeline.connections[c_id])
+
+            # Update common connections
+            for c_id in common_connections:
+                connection = pipeline.connections[c_id]
+                pip_c = self.connections[c_id]
+                pip_c.connectingModules = (self.modules[connection.source.moduleId],
+                                           self.modules[connection.destination.moduleId])
+                (srcModule, dstModule) = pip_c.connectingModules
+
+            self._old_module_ids = new_modules
+            self._old_connection_ids = new_connections
+            self.unselect_all()
+            self.reset_module_colors()
+            for m_id in selected_modules:
+                self.modules[m_id].setSelected(True)
+        except ModuleRegistryException, e:
+            import traceback
+            traceback.print_exc()
+            views = self.views()
+            assert len(views) > 0
+            debug.critical("Missing package/module",
+                ("Package '%s' is missing (or module '%s' is not present " +
+                "in that package)") % (e._identifier, e._name))
+            self.clear()
+            self.controller.change_selected_version(0)
+
+        if needReset and len(self.items())>0:
+            self.fitToAllViews()
+
+    def findModuleUnder(self, pos):
+        """ findModuleUnder(pos: QPoint) -> QGraphicsItem
+        Search all items under pos and return the top-most module item if any
+        
+        """
+        for item in self.items(pos):
+            if isinstance(item, QGraphicsModuleItem):
+                return item
+        return None
+
+    def findModulesNear(self, pos, where_mult):
+        rect = QtCore.QRectF(pos.x()-50+25*where_mult, 
+                             (pos.y()-50) + 50*where_mult,
+                             100, 100)
+        ### code to display target rectangle
+        #
+        # if where_mult < 0:
+        #     if not hasattr(self, 'tmp_rect'):
+        #         self.tmp_rect = QtGui.QGraphicsRectItem(rect)
+        #         self.tmp_rect.setPen(QtGui.QColor("red"))
+        #         self.addItem(self.tmp_rect)
+        #     else:
+        #         self.tmp_rect.setRect(rect)
+        # else:
+        #     if not hasattr(self, 'tmp_rect2'):
+        #         self.tmp_rect2 = QtGui.QGraphicsRectItem(rect)
+        #         self.tmp_rect2.setPen(QtGui.QColor("red"))
+        #         self.addItem(self.tmp_rect2)
+        #     else:
+        #         self.tmp_rect2.setRect(rect)
+            
+        closest_item = None
+        min_dis = None
+        for item in self.items(rect):
+            if isinstance(item, QGraphicsModuleItem) and item.isVisible():
+                vector = item.scenePos() - pos
+                dis = vector.x() * vector.x() + vector.y() * vector.y()
+                if min_dis is None or dis < min_dis:
+                    min_dis = dis
+                    closest_item = item
+        return closest_item
+
+    def findPortsNear(self, pos, where_mult):
+        width = self.tmp_module_item.paddedRect.width() + 50
+        rect = QtCore.QRectF(pos.x()-width/2+25*where_mult,
+                             pos.y()-50 + 50*where_mult,
+                             width, 100)
+        ### code to display target rectangle
+        #
+        # rect = QtCore.QRectF(pos.x()-50+25*where_mult, 
+        #                      (pos.y()-50) + 50*where_mult,
+        #                      100, 100)
+        # if where_mult < 0:
+        #     if not hasattr(self, 'tmp_rect'):
+        #         self.tmp_rect = QtGui.QGraphicsRectItem(rect)
+        #         self.tmp_rect.setPen(QtGui.QColor("red"))
+        #         self.addItem(self.tmp_rect)
+        #     else:
+        #         self.tmp_rect.setRect(rect)
+        # else:
+        #     if not hasattr(self, 'tmp_rect2'):
+        #         self.tmp_rect2 = QtGui.QGraphicsRectItem(rect)
+        #         self.tmp_rect2.setPen(QtGui.QColor("red"))
+        #         self.addItem(self.tmp_rect2)
+        #     else:
+        #         self.tmp_rect2.setRect(rect)
+
+        # if not hasattr(self, 'tmp_rect'):
+        #     self.tmp_rect = QtGui.QGraphicsRectItem(rect)
+        #     self.tmp_rect.setPen(QtGui.QColor("red"))
+        #     self.addItem(self.tmp_rect)
+        # else:
+        #     self.tmp_rect.setRect(rect)
+        near_ports = []
+        for item in self.items(rect):
+            if isinstance(item, QAbstractGraphicsPortItem) and item.isVisible():
+                near_ports.append(item)
+        return near_ports
+
+    def findPortMatch(self, output_ports, input_ports, x_trans=0, 
+                      fixed_out_pos=None, fixed_in_pos=None,
+                      allow_conversion=False, out_converters=None):
+        """findPortMatch(output_ports:  list(QAbstractGraphicsPortItem),
+                         input_ports:   list(QAbstractGraphicsPortItem),
+                         x_trans:       int,
+                         fixed_out_pos: QPointF | None,
+                         fixed_in_pos:  QPointF | None,
+                         ) -> tuple(QAbstractGraphicsPortItem, 
+                                    QAbstractGraphicsPortItem)
+        findPortMatch returns a port from output_ports and a port from
+        input_ports where the ports are compatible and the distance
+        between these ports is minimal with respect to compatible
+        ports
+
+        If allow_conversion is True, we also search for ports that are not
+        directly matched but can be connected if a Converter module is used. In
+        this case, we extend the optional 'out_converters' list with the
+        possible Converters' ModuleDescriptors.
+        """
+
+        reg = get_module_registry()
+        result = (None, None)
+        min_dis = None
+        selected_convs = None
+        for o_item in output_ports:
+            if o_item.invalid:
+                continue
+            for i_item in input_ports:
+                if i_item.invalid:
+                    continue
+                convs = []
+                if reg.ports_can_connect(o_item.port, i_item.port,
+                                         allow_conversion=True,
+                                         out_converters=convs):
+                    if fixed_out_pos is not None:
+                        out_pos = fixed_out_pos
+                    else:
+                        out_pos = o_item.getPosition()
+                    if fixed_in_pos is not None:
+                        in_pos = fixed_in_pos
+                    else:
+                        in_pos = i_item.getPosition()
+                    vector = (out_pos - in_pos)
+                    dis = (vector.x()-x_trans)*(vector.x()-x_trans) + \
+                        vector.y()*vector.y()
+                    if result[0] is None or dis < min_dis:
+                        min_dis = dis
+                        result = (o_item, i_item)
+                        selected_convs = convs
+        if selected_convs and out_converters is not None:
+            out_converters.extend(selected_convs)
+        return result
+
+    def updateTmpConnection(self, pos, tmp_connection_item, tmp_module_ports, 
+                            where_mult, order_f):
+        near_ports = self.findPortsNear(pos, where_mult)
+        if len(near_ports) > 0:
+            (src_item, dst_item) = \
+                self.findPortMatch(*order_f([near_ports,tmp_module_ports]),
+                                    x_trans=-50)
+            if src_item is not None:
+                if tmp_connection_item is None:
+                    tmp_connection_item = QGraphicsTmpConnItem(dst_item, 1000)
+                    self.addItem(tmp_connection_item)
+                # We are assuming the first view is the real pipeline view
+                v = self.views()[0]
+                tmp_connection_item.setStartPort(dst_item)
+                tmp_connection_item.setSnapPort(src_item)
+                tooltip = "%s %s\n  -> %s %s" % (src_item.port.name, 
+                                              src_item.port.short_sigstring,
+                                              dst_item.port.name, 
+                                              dst_item.port.short_sigstring)
+                QtGui.QToolTip.showText(v.mapToGlobal(
+                        v.mapFromScene((dst_item.getPosition() + 
+                                        src_item.getPosition())/2.0)),
+                                        tooltip)
+                tmp_connection_item.show()
+                return tmp_connection_item
+
+        if tmp_connection_item is not None:
+            tmp_connection_item.hide()
+            QtGui.QToolTip.hideText()
+        return tmp_connection_item
+            
+    def updateTmpInputConnection(self, pos):
+        self.tmp_input_conn = \
+            self.updateTmpConnection(pos, self.tmp_input_conn, 
+                                     self.tmp_module_item.inputPorts.values(), 
+                                     -1, lambda x: x)
+            
+    def updateTmpOutputConnection(self, pos):
+        self.tmp_output_conn = \
+            self.updateTmpConnection(pos, self.tmp_output_conn, 
+                                     self.tmp_module_item.outputPorts.values(), 
+                                     1, reversed)
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the module palette
+        
+        """
+        if (self.controller and (
+                isinstance(event.source(), QModuleTreeWidget) or
+                isinstance(event.source(), QDragVariableLabel))):
+            data = event.mimeData()
+            if not self.read_only_mode:
+                if hasattr(data, 'items'):
+                    if self.tmp_module_item and \
+                       get_vistrails_configuration().check('autoConnect'):
+                        self.tmp_module_item.setPos(event.scenePos())
+                        self.updateTmpInputConnection(event.scenePos())
+                        self.updateTmpOutputConnection(event.scenePos())
+                    event.accept()
+                    return
+                elif hasattr(data, 'variableData'):
+                    event.accept()
+                    return
+        # Ignore if not accepted and returned by this point
+        event.ignore()
+        
+    def dragMoveEvent(self, event):
+        """ dragMoveEvent(event: QDragMoveEvent) -> None
+        Set to accept drag move event from the module palette
+        
+        """
+        if (self.controller and (
+                isinstance(event.source(), QModuleTreeWidget) or
+                isinstance(event.source(), QDragVariableLabel))):
+            data = event.mimeData()
+            if hasattr(data, 'items') and not self.read_only_mode:
+                if self.tmp_module_item and \
+                   get_vistrails_configuration().check('autoConnect'):
+                    self.tmp_module_item.setPos(event.scenePos())
+                    self.updateTmpInputConnection(event.scenePos())
+                    self.updateTmpOutputConnection(event.scenePos())
+                event.accept()
+                return
+            elif hasattr(data, 'variableData'):
+                # Find nearest suitable port
+                snapModule = self.findModuleUnder(event.scenePos())
+                nearest_port = None
+                if snapModule is not None:
+                    tmp_port = QAbstractGraphicsPortItem(None, 0, 0)
+                    tmp_port.port = data.variableData[0]
+                    (_, nearest_port) = \
+                        self.findPortMatch([tmp_port], \
+                                               snapModule.inputPorts.values(), \
+                                               fixed_out_pos=event.scenePos())
+                    del tmp_port
+                # Unhighlight previous nearest port
+                if self._var_selected_port is not None:
+                    self._var_selected_port.setSelected(False)
+                self._var_selected_port = nearest_port
+                # Highlight new nearest port
+                if nearest_port is not None:
+                    nearest_port.setSelected(True)
+                    QtGui.QToolTip.showText(event.screenPos(), nearest_port.toolTip())
+                    event.accept()
+                    return
+                else:
+                    QtGui.QToolTip.hideText()
+        # Ignore if not accepted and returned by this point
+        if not systemType in ['Darwin']:
+            # Workaround: On a Mac, dropEvent isn't called if dragMoveEvent is ignored
+            event.ignore()
+
+    def dragLeaveEvent(self, event):
+        if (self.controller and isinstance(event.source(), QModuleTreeWidget)):
+            if self.tmp_output_conn:
+                self.tmp_output_conn.disconnect(True)
+                self.removeItem(self.tmp_output_conn)
+                self.tmp_output_conn = None
+            if self.tmp_input_conn:
+                self.tmp_input_conn.disconnect(True)
+                self.removeItem(self.tmp_input_conn)
+                self.tmp_input_conn = None
+        elif isinstance(event.source(), QDragVariableLabel):
+            data = event.mimeData()
+            if hasattr(data, 'variableData'):
+                if self._var_selected_port is not None:
+                    self._var_selected_port.setPen(CurrentTheme.PORT_PEN)
+                    self._var_selected_port = None
+                event.accept()
+
+    def unselect_all(self):
+        self.clearSelection()
+        if self.pipeline_tab:
+            self.pipeline_tab.moduleSelected(-1)
+
+    def createConnectionFromTmp(self, tmp_connection_item, module, 
+                                start_is_src=False):
+        if start_is_src:
+            src_port_item = tmp_connection_item.startPortItem
+            dst_port_item = tmp_connection_item.snapPortItem
+        else:
+            src_port_item = tmp_connection_item.snapPortItem
+            dst_port_item = tmp_connection_item.startPortItem
+        
+        if src_port_item.parentItem().id < 0 or start_is_src:
+            src_module_id = module.id
+            dst_module_id = dst_port_item.parentItem().id
+        else:
+            src_module_id = src_port_item.parentItem().id
+            dst_module_id = module.id
+
+        reg = get_module_registry()
+
+        if reg.ports_can_connect(src_port_item.port, dst_port_item.port):
+            # Direct connection
+            conn = self.controller.add_connection(src_module_id,
+                                                  src_port_item.port,
+                                                  dst_module_id,
+                                                  dst_port_item.port)
+            self.addConnection(conn)
+        else:
+            # Add a converter module
+            converters = reg.get_converters(src_port_item.port.descriptors(),
+                                            dst_port_item.port.descriptors())
+            converter = choose_converter(converters)
+            if converter is None:
+                return
+
+            src_pos = src_port_item.getPosition()
+            dst_pos = dst_port_item.getPosition()
+            mod_x = (src_pos.x() + dst_pos.x())/2.0
+            mod_y = (src_pos.y() + dst_pos.y())/2.0
+            mod = self.controller.create_module_from_descriptor(
+                    converter,
+                    x=mod_x,
+                    y=-mod_y)
+            conn1 = self.controller.create_connection(
+                    self.controller.current_pipeline.modules[src_module_id],
+                    src_port_item.port,
+                    mod,
+                    'in_value')
+            conn2 = self.controller.create_connection(
+                    mod, 'out_value',
+                    self.controller.current_pipeline.modules[dst_module_id],
+                    dst_port_item.port)
+            operations = [('add', mod), ('add', conn1), ('add', conn2)]
+
+            action = create_action(operations)
+            self.controller.add_new_action(action)
+            self.controller.perform_action(action)
+
+            graphics_mod = self.addModule(mod)
+            graphics_mod.update()
+            self.addConnection(conn1)
+            self.addConnection(conn2)
+
+    def addConnectionFromTmp(self, tmp_connection_item, module, start_is_src):
+        self.createConnectionFromTmp(tmp_connection_item, module, start_is_src)
+        self.reset_module_colors()
+        self._old_connection_ids = \
+            set(self.controller.current_pipeline.connections)
+        self._old_module_ids = set(self.controller.current_pipeline.modules)
+
+    def add_module_event(self, event, data):
+        """Adds a new module from a drop event"""
+        item = data.items[0]
+        self.controller.reset_pipeline_view = False
+        self.noUpdate = True
+        internal_version = -1L
+        reg = get_module_registry()
+        if reg.is_abstraction(item.descriptor):
+            internal_version = item.descriptor.module.internal_version
+        adder = self.controller.add_module_from_descriptor
+        module = adder(item.descriptor, 
+                       event.scenePos().x(),
+                       -event.scenePos().y(),
+                       internal_version)
+        self.reset_module_colors()
+        graphics_item = self.addModule(module)
+        graphics_item.update()
+
+        if get_vistrails_configuration().check('autoConnect'):
+            if self.tmp_output_conn is not None:
+                if self.tmp_output_conn.isVisible():
+                    self.createConnectionFromTmp(self.tmp_output_conn, module)
+                self.tmp_output_conn.disconnect()
+                self.removeItem(self.tmp_output_conn)
+                self.tmp_output_conn = None
+
+            if self.tmp_input_conn is not None:
+                if self.tmp_input_conn.isVisible():
+                    self.createConnectionFromTmp(self.tmp_input_conn, module)
+                self.tmp_input_conn.disconnect()
+                self.removeItem(self.tmp_input_conn)
+                self.tmp_input_conn = None
+        
+        self.unselect_all()
+        # Change selection
+        graphics_item.setSelected(True)
+
+        # controller changed pipeline: update ids
+        self._old_connection_ids = \
+            set(self.controller.current_pipeline.connections)
+        self._old_module_ids = set(self.controller.current_pipeline.modules)
+
+        # We are assuming the first view is the real pipeline view
+        self.views()[0].setFocus()
+
+        self.noUpdate = False
+
+    def add_tmp_module(self, desc):
+        self.noUpdate = True
+        self.tmp_module_item = QGraphicsModuleItem(None)
+        module = Module(id=-1,
+                        name=desc.name,
+                        package=desc.identifier,
+                        location=Location(id=-1,x=0.0,y=0.0),
+                        namespace=desc.namespace,
+                        )
+        module.is_valid = True
+        self.tmp_module_item.setupModule(module)
+        self.addItem(self.tmp_module_item)
+        self.tmp_module_item.hide()
+        self.tmp_module_item.update()
+        self.noUpdate = False
+        
+        return self.tmp_module_item
+
+    def delete_tmp_module(self):
+        if self.tmp_module_item is not None:
+            self.removeItem(self.tmp_module_item)
+            self.tmp_module_item = None
+
+    def dropEvent(self, event):
+        """ dropEvent(event: QDragMoveEvent) -> None
+        Accept drop event to add a new module
+        
+        """
+        if (self.controller and (
+                isinstance(event.source(), QModuleTreeWidget) or
+                isinstance(event.source(), QDragVariableLabel))):
+            data = event.mimeData()
+            if hasattr(data, 'items') and not self.read_only_mode and \
+                self.controller.current_pipeline == self.current_pipeline:
+                assert len(data.items) == 1
+                self.add_module_event(event, data)
+                event.accept()
+                return
+            elif hasattr(data, 'variableData'):
+                if self._var_selected_port is not None:
+                    # Unhighlight selected port and get var data
+                    self._var_selected_port.setSelected(False)
+                    output_portspec = data.variableData[0]
+                    var_uuid = data.variableData[1]
+                    var_name = data.variableData[2]
+                    descriptor = output_portspec.descriptors()[0]
+                    input_module = self._var_selected_port.parentItem().module
+                    #input_portspec = self._var_selected_port.port
+                    input_port = self._var_selected_port.port.name
+                    m_pos_x = event.scenePos().x()
+                    m_pos_y = -event.scenePos().y()
+                    
+                    (new_conn, new_module) = \
+                        self.controller.connect_vistrail_var(descriptor,
+                                                             var_uuid,
+                                                             input_module,
+                                                             input_port,
+                                                             m_pos_x, 
+                                                             m_pos_y)
+                    if new_module is not None:
+                        self.addModule(new_module)
+                    if new_conn is not None:
+                        self.addConnection(new_conn)
+                    else:
+                        msg = 'Vistrail Variable "%s" is already connected' \
+                            ' to this port.' % var_name
+                        QtGui.QMessageBox.information(None, 
+                                                      "Already Connected",
+                                                      msg)
+                    event.accept()
+                    return
+        # Ignore if not accepted and returned by this point
+        event.ignore()
+
+    def delete_selected_items(self):
+        selectedItems = self.selectedItems()
+        if len(selectedItems)>0:
+            modules = []
+            module_ids = []
+            connection_ids = []
+            for it in selectedItems:
+                if isinstance(it, QGraphicsModuleItem):
+                    modules.append(it)
+                    module_ids.append(it.id)
+                elif isinstance(it, QGraphicsConnectionItem):
+                    connection_ids.append(it.id)
+            if len(modules)>0:
+                self.noUpdate = True
+                dep_connection_ids = set()
+                for m in modules:
+                    dep_connection_ids.update(
+                        m.dependingConnectionItems().iterkeys())
+                # remove_connection updates the dependency list on the
+                # other side of connections, cannot use removeItem
+                for c_id in dep_connection_ids:
+                    self.remove_connection(c_id)
+                for m_id in module_ids:
+                    self.remove_module(m_id)
+                self.controller.delete_module_list(module_ids)
+                self.updateSceneBoundingRect()
+                self.reset_module_colors()
+                self.update()
+                self.noUpdate = False
+                # Notify that no module is selected
+                self.emit(QtCore.SIGNAL('moduleSelected'),
+                          -1, selectedItems)
+                # Current pipeline changed, so we need to change the
+                # _old_*_ids. However, remove_module takes care of
+                # module ids, and the for loop above takes care of
+                # connection ids. So we don't need to call anything.
+            else:
+                for c_id in connection_ids:
+                    self.remove_connection(c_id)
+                self.controller.reset_pipeline_view = False
+                self.controller.delete_connection_list(connection_ids)
+                self.reset_module_colors()
+                self.controller.reset_pipeline_view = True
+                # Current pipeline changed, so we need to change the
+                # _old_connection_ids. However, remove_connection
+                # above takes care of connection ids, so we don't need
+                # to call anything.        
+
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QKeyEvent) -> None
+        Capture 'Del', 'Backspace' for deleting modules.
+        Ctrl+C, Ctrl+V, Ctrl+A for copy, paste and select all
+        
+        """        
+        if (self.controller and
+            event.key() in [QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete]):
+            if not self.read_only_mode:
+                self.delete_selected_items()
+        else:
+            QInteractiveGraphicsScene.keyPressEvent(self, event)
+            # super(QPipelineScene, self).keyPressEvent(event)
+
+    def get_selected_module_ids(self):
+        module_ids = []
+        for item in self.selectedItems():
+            if isinstance(item, QGraphicsModuleItem):
+                module_ids.append(item.module.id)
+        return module_ids
+
+    def get_selected_item_ids(self, dangling=False):
+        """get_selected_item_ids( self, dangling: bool) -> 
+             (module_ids : list, connection_ids : list)
+           returns the list of selected modules and the connections
+           between them.  If dangling is true, it includes connections
+           for which only one end point is selected, otherwise it only
+           includes connectiosn where both end points are selected
+
+        """
+        selectedItems = self.selectedItems()
+        if len(selectedItems) <= 0:
+            return None
+        
+        connection_ids = {}
+        module_ids = {}
+        for item in selectedItems:
+            if isinstance(item, QGraphicsModuleItem):
+                module_ids[item.module.id] = 1
+        for item in selectedItems:
+            if isinstance(item, QGraphicsModuleItem):
+                for connItem in item.dependingConnectionItems().itervalues():
+                    conn = connItem.connection
+                    if not conn.id in connection_ids:
+                        source_exists = conn.sourceId in module_ids
+                        dest_exists = conn.destinationId in module_ids
+                        if source_exists and dest_exists:
+                            connection_ids[conn.id] = 1
+                        elif dangling and (source_exists or dest_exists):
+                            connection_ids[conn.id] = 1
+        return (module_ids.keys(), connection_ids.keys())
+
+    def group(self):
+        items = self.get_selected_item_ids(True)
+        if items is not None:
+            # self.clear()
+            self.controller.create_group(items[0], items[1])
+            self.setupScene(self.controller.current_pipeline)
+
+    def ungroup(self):
+        items = self.get_selected_item_ids(True)
+        if items is not None:
+            # self.clear()
+            self.controller.ungroup_set(items[0])
+            self.setupScene(self.controller.current_pipeline)
+        
+    def layout(self):
+        if len(self.items()) <= 0:
+            return
+        
+        def _func(module):
+            rect = self.modules[module.shortname].boundingRect()
+            return (rect.width(), rect.height())
+        
+        selected = [self.modules[i].module for i in self.get_selected_module_ids()]
+        self.controller.layout_modules(selected,
+                                       module_size_func=_func)
+
+    def makeAbstraction(self):
+        items = self.get_selected_item_ids(True)
+        if items is not None:
+            # self.clear()
+            self.controller.create_abstraction_with_prompt(items[0], items[1])
+            self.setupScene(self.controller.current_pipeline)
+
+    def convertToAbstraction(self):
+        items = self.get_selected_item_ids(False)
+        if items is not None:
+            # self.clear()
+            self.controller.create_abstractions_from_groups(items[0])
+            self.setupScene(self.controller.current_pipeline)
+
+    def importAbstraction(self):
+        items = self.get_selected_item_ids(False)
+        if items is not None:
+            self.controller.import_abstractions(items[0])
+
+    def exportAbstraction(self):
+        items = self.get_selected_item_ids(False)
+        if items is not None:
+            self.controller.export_abstractions(items[0])
+
+    def copySelection(self):
+        """ copySelection() -> None
+        Copy the current selected modules into clipboard
+        
+        """
+        items = self.get_selected_item_ids(False)
+        if items is not None:
+            cb = QtGui.QApplication.clipboard()
+            text = self.controller.copy_modules_and_connections(items[0],items[1])
+            cb.setText(text)
+            
+    def pasteFromClipboard(self, center):
+        """ pasteFromClipboard(center: (float, float)) -> None
+        Paste modules/connections from the clipboard into this pipeline view
+        
+        """
+        if self.controller and not self.read_only_mode:
+            cb = QtGui.QApplication.clipboard()        
+            text = cb.text()
+            if text=='' or not text.startswith("<workflow"): return
+            ids = self.controller.paste_modules_and_connections(text, center)
+            self.setupScene(self.controller.current_pipeline)
+            self.reset_module_colors()
+            if len(ids) > 0:
+                self.unselect_all()
+            for moduleId in ids:
+                self.modules[moduleId].setSelected(True)
+            
+    def event(self, e):
+        """ event(e: QEvent) -> None        
+        Process the set module color events
+        
+        """
+        if e.type()==QModuleStatusEvent.TYPE:
+            if e.moduleId>=0:
+                item = self.modules.get(e.moduleId, None)
+                if not item:
+                    return True
+                item.setToolTip(e.toolTip)
+                item.errorTrace = e.errorTrace
+                statusMap =  {
+                    0: CurrentTheme.SUCCESS_MODULE_BRUSH,
+                    1: CurrentTheme.ERROR_MODULE_BRUSH,
+                    2: CurrentTheme.NOT_EXECUTED_MODULE_BRUSH,
+                    3: CurrentTheme.ACTIVE_MODULE_BRUSH,
+                    4: CurrentTheme.COMPUTING_MODULE_BRUSH,
+                    6: CurrentTheme.PERSISTENT_MODULE_BRUSH,
+                    7: CurrentTheme.SUSPENDED_MODULE_BRUSH,
+                    }
+                item.setProgress(e.progress)
+                if item.statusBrush is not None and e.status == 3:
+                    # do not update, already in cache
+                    pass
+                elif e.status in statusMap:
+                    item.statusBrush = statusMap[e.status]
+                else:
+                    item.statusBrush = None
+                item._needs_state_updated = True
+                item.update()
+            return True
+        return QInteractiveGraphicsScene.event(self, e)
+
+    def selectAll(self):
+        """ selectAll() -> None
+        Select all module items in the scene
+        
+        """
+        for item in self.items():
+            if isinstance(item, QGraphicsModuleItem) or \
+                    isinstance(item, QGraphicsConnectionItem):
+                item.setSelected(True)
+
+    def open_configure_window(self, id):
+        """ open_configure_window(int) -> None
+        Open the modal configuration window for module with given id
+        """
+        from vistrails.gui.vistrails_window import _app
+        _app.configure_module()
+            
+    def perform_configure_done_actions(self, module_id):
+        if self.controller:
+            self.reset_module_colors()
+            self.flushMoveActions()
+            self.recreate_module(self.controller.current_pipeline, module_id)
+             
+    def open_documentation_window(self, id):
+        """ open_documentation_window(int) -> None
+        Opens the modal module documentation window for module with given id
+        """
+        from vistrails.gui.vistrails_window import _app
+        _app.show_documentation()
+
+    def toggle_breakpoint(self, id):
+        """ toggle_breakpoint(int) -> None
+        Toggles the breakpoint attribute for the module with given id
+        """
+        if self.controller:
+            module = self.controller.current_pipeline.modules[id]
+            module.toggle_breakpoint()
+            self.recreate_module(self.controller.current_pipeline, id)
+
+    def toggle_watched(self, id):
+        if self.controller:
+            module = self.controller.current_pipeline.modules[id]
+            module.toggle_watched()
+
+    def print_error(self, id):
+        toolTip = str(self.modules[id].toolTip())
+        errorTrace = self.modules[id].errorTrace
+        if not toolTip and not errorTrace:
+            return
+        text = toolTip
+        if errorTrace and errorTrace.strip() != 'None':
+            text += '\n\n' + errorTrace
+        class StackPopup(QtGui.QDialog):
+            def __init__(self, errorTrace='', parent=None):
+                QtGui.QDialog.__init__(self, parent)
+                self.resize(700, 400)
+                self.setWindowTitle('Module Error')
+                layout = QtGui.QVBoxLayout()
+                self.setLayout(layout)
+                text = QtGui.QTextEdit('')
+                text.insertPlainText(errorTrace)
+                text.setReadOnly(True)
+                text.setLineWrapMode(QtGui.QTextEdit.NoWrap)
+                layout.addWidget(text)
+                close = QtGui.QPushButton('Close', self)
+                close.setFixedWidth(100)
+                layout.addWidget(close)
+                self.connect(close, QtCore.SIGNAL('clicked()'),
+                             self, QtCore.SLOT('close()'))
+        sp = StackPopup(text)
+        sp.exec_()
+
+    def open_annotations_window(self, id):
+        """ open_annotations_window(int) -> None
+        Opens the modal annotations window for module with given id
+        """
+        if self.controller:
+            from vistrails.gui.module_info import QModuleInfo
+            module_info = QModuleInfo.instance()
+            module_info.show_annotations()
+
+    def open_module_label_window(self, id):
+        """ open_module_label_window(int) -> None
+        Opens the modal module label window for setting module label
+        """
+        if self.controller:
+            module = self.controller.current_pipeline.modules[id]
+            if module.has_annotation_with_key('__desc__'):
+                currentLabel = module.get_annotation_by_key('__desc__').value.strip()
+            else:
+                currentLabel = ''
+            (text, ok) = QtGui.QInputDialog.getText(None, 'Set Module Label',
+                                                    'Enter the module label',
+                                                    QtGui.QLineEdit.Normal,
+                                                    currentLabel)
+            if ok:
+                if not text:
+                    if module.has_annotation_with_key('__desc__'):
+                        self.controller.delete_annotation('__desc__', id)
+                        self.recreate_module(self.controller.current_pipeline, id)
+                else:
+                    self.controller.add_annotation(('__desc__', str(text)), id)
+                    self.recreate_module(self.controller.current_pipeline, id)
+
+    ##########################################################################
+    # Execution reporting API
+
+    def cancel_progress(self):
+        """Checks if the user have canceled the execution and takes
+           appropriate action
+        """
+        if self.progress.wasCanceled():
+            if self.progress._progress_canceled:
+                # It has already been confirmed in a progress update
+                self.progress._progress_canceled = False
+                raise AbortExecution("Execution aborted by user")
+            r = QtGui.QMessageBox.question(self.parent(),
+                'Execution Paused',
+                'Are you sure you want to abort the execution?',
+                QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+                QtGui.QMessageBox.No)
+            if r == QtGui.QMessageBox.Yes:
+                raise AbortExecution("Execution aborted by user")
+            else:
+                self.progress.goOn()
+
+    def set_module_success(self, moduleId):
+        """ set_module_success(moduleId: int) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 0, ''))
+        QtCore.QCoreApplication.processEvents()
+
+    def set_module_error(self, moduleId, error, errorTrace=None):
+        """ set_module_error(moduleId: int, error: str) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 1, error,
+                                                      errorTrace = errorTrace))
+        QtCore.QCoreApplication.processEvents()
+
+    def set_module_not_executed(self, moduleId):
+        """ set_module_not_executed(moduleId: int) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 2, ''))
+        QtCore.QCoreApplication.processEvents()
+
+    def set_module_active(self, moduleId):
+        """ set_module_active(moduleId: int) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 3, ''))
+        QtCore.QCoreApplication.processEvents()
+
+    def set_module_computing(self, moduleId):
+        """ set_module_computing(moduleId: int) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        if self.progress:
+            self.cancel_progress()
+            self.progress.setValue(self.progress.value() + 1)
+            self.progress.setLabelText(self.controller.current_pipeline.get_module_by_id(moduleId).name)
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 4, ''))
+        QtCore.QCoreApplication.processEvents()
+        
+    def set_module_progress(self, moduleId, progress=0.0):
+        """ set_module_computing(moduleId: int, progress: float) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        if self.progress:
+            try:
+                self.cancel_progress()
+            except AbortExecution:
+                self.progress._progress_canceled = True
+                raise
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 5,
+                                                        '%d%% Completed' % int(progress*100),
+                                                        progress))
+        QtCore.QCoreApplication.processEvents()
+
+    def set_module_persistent(self, moduleId):
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 6, ''))
+        QtCore.QCoreApplication.processEvents()
+
+    def set_module_suspended(self, moduleId, error):
+        """ set_module_suspended(moduleId: int, error: str) -> None
+        Post an event to the scene (self) for updating the module color
+        
+        """
+        msg = error if isinstance(error, str) else error.msg
+        text = "Module is suspended, reason: %s" % msg
+        QtGui.QApplication.postEvent(self,
+                                     QModuleStatusEvent(moduleId, 7, text))
+        QtCore.QCoreApplication.processEvents()
+        # add to suspended modules dialog
+        if isinstance(error, str):
+            return
+        from vistrails.gui.job_monitor import QJobView
+        jobView = QJobView.instance()
+        try:
+            result = jobView.add_job(self.controller, error)
+            if result:
+                jobView.set_visible(True)
+        except Exception, e:
+            import traceback
+            debug.critical("Error Monitoring Job: %s" % str(e), traceback.format_exc())
+            
+    def reset_module_colors(self):
+        for module in self.modules.itervalues():
+            module.statusBrush = None
+            module._needs_state_updated = True
+
+    def hasMoveActions(self):
+        controller = self.controller
+        for (mId, item) in self.modules.iteritems():
+            module = controller.current_pipeline.modules[mId]
+            (dx,dy) = (item.scenePos().x(), -item.scenePos().y())
+            if (dx != module.center.x or dy != module.center.y):
+                return True
+        return False
+
+    def flushMoveActions(self):
+        """ flushMoveActions() -> None
+        Update all move actions into vistrail
+        
+        """
+        controller = self.controller
+        moves = []
+        for (mId, item) in self.modules.iteritems():
+            module = controller.current_pipeline.modules[mId]
+            (dx,dy) = (item.scenePos().x(), -item.scenePos().y())
+            if (dx != module.center.x or dy != module.center.y):
+                moves.append((mId, dx, dy))
+        if len(moves)>0:
+            controller.quiet = True
+            controller.move_module_list(moves)
+            controller.quiet = False
+            return True
+        return False
+
+    def set_read_only_mode(self, on):
+        """set_read_only_mode(on: bool) -> None
+        This will prevent user to add/remove modules and connections."""
+        self.read_only_mode = on
+
+class QModuleStatusEvent(QtCore.QEvent):
+    """
+    QModuleStatusEvent is trying to handle thread-safe real-time
+    module updates in the scene through post-event
+    
+    """
+    TYPE = QtCore.QEvent.Type(QtCore.QEvent.User)
+    def __init__(self, moduleId, status, toolTip, progress=0.0,
+                 errorTrace=None):
+        """ QModuleStatusEvent(type: int) -> None        
+        Initialize the specific event with the module status. Status 0
+        for success, 1 for error and 2 for not execute, 3 for active,
+        and 4 for computing
+        
+        """
+        QtCore.QEvent.__init__(self, QModuleStatusEvent.TYPE)
+        self.moduleId = moduleId
+        self.status = status
+        self.toolTip = toolTip
+        self.progress = progress
+        self.errorTrace = errorTrace
+            
+class QPipelineView(QInteractiveGraphicsView, BaseView):
+    """
+    QPipelineView inherits from QInteractiveGraphicsView that will
+    handle drawing of module, connection shapes and selecting
+    mechanism.
+    
+    """
+
+    def __init__(self, parent=None):
+        """ QPipelineView(parent: QWidget) -> QPipelineView
+        Initialize the graphics view and its properties
+        
+        """
+        QInteractiveGraphicsView.__init__(self, parent)
+        BaseView.__init__(self)
+        self.setScene(QPipelineScene(self))
+        self.set_title('Pipeline')
+        self.controller = None
+        self.detachable = True
+
+    def set_default_layout(self):
+        from vistrails.gui.module_palette import QModulePalette
+        from vistrails.gui.module_info import QModuleInfo
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QModulePalette,
+             QtCore.Qt.RightDockWidgetArea: QModuleInfo,
+             })
+            
+    def set_action_links(self):
+        # FIXME execute should be tied to a pipleine_changed signal...
+        self.action_links = \
+            {'copy': ('module_changed', self.has_selected_modules),
+             'paste': ('clipboard_changed', self.clipboard_non_empty),
+             'layout': ('pipeline_changed', self.pipeline_non_empty),
+             'group': ('module_changed', self.has_selected_modules),
+             'ungroup': ('module_changed', self.has_selected_groups),
+             'showGroup': ('module_changed', self.has_selected_group),
+             'makeAbstraction': ('module_changed', self.has_selected_modules),
+             'execute': ('pipeline_changed', self.pipeline_non_empty),
+             'configureModule': ('module_changed', self.has_selected_module),
+             'documentModule': ('module_changed', self.has_selected_module),
+             'makeAbstraction': ('module_changed', self.has_selected_modules),
+             'convertToAbstraction': ('module_changed', 
+                                      self.has_selected_group),
+             'editAbstraction': ('module_changed', self.has_selected_abs),
+             'importAbstraction': ('module_changed', self.has_selected_abs),
+             'exportAbstraction': ('module_changed', self.has_selected_abs),
+             'publishWeb' : ('pipeline_changed', self.check_publish_db),
+             'publishPaper' : ('pipeline_changed', self.pipeline_non_empty),
+             'controlFlowAssist': ('pipeline_changed', self.pipeline_non_empty),
+             'redo': ('version_changed', self.can_redo),
+             'undo': ('version_changed', self.can_undo),
+             }
+
+    def can_redo(self, versionId):
+        return self.controller and self.controller.can_redo()
+
+    def can_undo(self, versionId):
+        return self.controller and self.controller.can_undo()
+    
+    def set_action_defaults(self):
+        self.action_defaults.update(
+        { 'execute': [('setEnabled', True, self.set_execute_action),
+                      ('setIcon', False, CurrentTheme.EXECUTE_PIPELINE_ICON),
+                      ('setToolTip', False, 'Execute the current pipeline')],
+        })
+        
+    def set_execute_action(self):
+        if self.controller:
+            return self.pipeline_non_empty(self.controller.current_pipeline)
+        return False
+    
+    def execute(self, target=None):
+        # view.checkModuleConfigPanel()
+        # reset job view
+        from vistrails.gui.job_monitor import QJobView
+        jobView = QJobView.instance()
+        if jobView.updating_now:
+            debug.critical("Execution Aborted: Job Monitor is updating. Please wait a few seconds and try again.")
+            return
+        jobView.delete_job(self.controller)
+        jobView.updating_now = True
+
+        try:
+            modules = len(self.controller.current_pipeline.modules)
+            progress = ExecutionProgressDialog(modules)
+            self.scene().progress = progress
+            progress.show()
+
+            if target is not None:
+                self.controller.execute_current_workflow(
+                        sinks=[target],
+                        reason="Execute specific module")
+            else:
+                self.controller.execute_current_workflow()
+
+            progress.setValue(modules)
+            #progress.hide()
+            self.scene().progress = None
+        except Exception, e:
+            import traceback
+            debug.critical(str(e) or e.__class__.__name__,
+                           traceback.format_exc())
+        finally:
+            self.scene().progress = None
+            jobView.updating_now = False
+            from vistrails.gui.vistrails_window import _app
+            _app.notify('execution_updated')
+        
+    def publish_to_web(self):
+        from vistrails.gui.publishing import QVersionEmbed
+        panel = QVersionEmbed.instance()
+        panel.switchType('Wiki')
+        panel.set_visible(True)
+        
+    def publish_to_paper(self):
+        from vistrails.gui.publishing import QVersionEmbed
+        panel = QVersionEmbed.instance()
+        panel.switchType('Latex')
+        panel.set_visible(True)
+        
+    def check_publish_db(self, pipeline):
+        loc = self.controller.locator
+        result = False
+        if hasattr(loc,'host'):
+            result = True    
+        return result and self.pipeline_non_empty(pipeline)
+    
+    def has_selected_modules(self, module, only_one=False):
+        module_ids_len = len(self.scene().get_selected_module_ids())
+        #print '  module_ids_len:', module_ids_len
+        if only_one and module_ids_len != 1:
+            return False
+        return module_ids_len > 0
+
+    def has_selected_module(self, module):
+        #print 'calling has_selected_module'
+        return self.has_selected_modules(module, True)
+
+    def has_selected_groups(self, module, only_one=False):
+        module_ids = self.scene().get_selected_module_ids()
+        if len(module_ids) <= 0:
+            return False
+        if only_one and len(module_ids) != 1:
+            return False
+        for m_id in module_ids:
+            if not self.scene().current_pipeline.modules[m_id].is_group():
+                return False
+        return True
+
+    def has_selected_group(self, module):
+        return self.has_selected_groups(True)
+
+    def has_selected_abs(self, module):
+        module_ids = self.scene().get_selected_module_ids()
+        if len(module_ids) != 1:
+            return False
+        for m_id in module_ids:
+            if not self.scene().current_pipeline.modules[m_id].is_abstraction():
+                return False
+        return True        
+
+    def clipboard_non_empty(self):
+        clipboard = QtGui.QApplication.clipboard()
+        clipboard_text = clipboard.text()
+        return bool(clipboard_text) #and \
+        #    str(clipboard_text).startswith("<workflow")
+
+    def pipeline_non_empty(self, pipeline):
+        return pipeline is not None and len(pipeline.modules) > 0
+
+    def pasteFromClipboard(self):
+        center = self.mapToScene(self.width()/2.0, self.height()/2.0)
+        self.scene().pasteFromClipboard((center.x(), -center.y()))
+
+    def setQueryEnabled(self, on):
+        QInteractiveGraphicsView.setQueryEnabled(self, on)
+        if not self.scene().noUpdate and self.scene().controller:
+            self.scene().setupScene(self.scene().controller.current_pipeline)
+            
+    def setReadOnlyMode(self, on):
+        self.scene().set_read_only_mode(on)
+
+    def set_title(self, title):
+        BaseView.set_title(self, title)
+        self.setWindowTitle(title)
+
+    def set_controller(self, controller):
+        oldController = self.controller
+        if oldController != controller:
+            if oldController != None:
+                # self.disconnect(oldController,
+                #                 QtCore.SIGNAL('versionWasChanged'),
+                #                 self.version_changed)
+                oldController.current_pipeline_view = None
+            self.controller = controller
+            self.scene().controller = controller
+            # self.connect(controller,
+            #              QtCore.SIGNAL('versionWasChanged'),
+            #              self.version_changed)
+            # self.module_info.set_controller(controller)
+            # self.moduleConfig.controller = controller
+            # controller.current_pipeline_view = self.scene()
+
+    def set_to_current(self):
+        QModuleInfo.instance().setReadOnly(self.scene().read_only_mode)
+        self.controller.set_pipeline_view(self)
+
+    def get_long_title(self):
+        pip_name = self.controller.get_pipeline_name()
+        vt_name = self.controller.name
+        self.long_title = "Pipeline %s from %s" % (pip_name,vt_name)
+        return self.long_title
+    
+    def get_controller(self):
+        return self.controller
+
+    def version_changed(self):
+        self.scene().setupScene(self.controller.current_pipeline)
+
+    def run_control_flow_assist(self):
+        currentScene = self.scene()
+        if currentScene.controller:
+            selected_items = currentScene.get_selected_item_ids(True)
+            if selected_items is None:
+                selected_items = ([],[])
+            selected_module_ids = selected_items[0]
+            selected_connection_ids = selected_items[1]
+            if len(selected_module_ids) > 0:
+                try:
+                    dialog = QControlFlowAssistDialog(
+                            self,
+                            selected_module_ids, selected_connection_ids,
+                            currentScene)
+                except MissingPackage:
+                    debug.critical("The controlflow package is not available")
+                else:
+                    dialog.exec_()
+            else:
+                QtGui.QMessageBox.warning(
+                        self,
+                        'No modules selected',
+                        'You must select at least one module to use the '
+                        'Control Flow Assistant')
+                
+    def done_configure(self, mid):
+        self.scene().perform_configure_done_actions(mid)
+
+    def paintModuleToPixmap(self, module_item):
+        m = self.matrix()
+        return module_item.paintToPixmap(m.m11(), m.m22())
+
+class ExecutionProgressDialog(QtGui.QProgressDialog):
+    def __init__(self, modules):
+        QtGui.QProgressDialog.__init__(self, 'Executing Workflow',
+                                       '&Cancel',
+                                       0, modules)
+        self.setWindowTitle('Executing')
+        self.setWindowModality(QtCore.Qt.WindowModal)
+        self._last_set_value = 0
+        self._progress_canceled = False
+
+    def setValue(self, value):
+        self._last_set_value = value
+        super(ExecutionProgressDialog, self).setValue(value)
+
+    def goOn(self):
+        self.reset()
+        self.show()
+        super(ExecutionProgressDialog, self).setValue(self._last_set_value)
+
+################################################################################
+# Testing
+
+
+class TestPipelineView(vistrails.gui.utils.TestVisTrailsGUI):
+
+    def test_quick_change_version_with_ports(self):
+        import vistrails.core.system
+        filename = (vistrails.core.system.vistrails_root_directory() + 
+                    '/tests/resources/triangle_count.vt')
+        view = vistrails.api.open_vistrail_from_file(filename)
+        vistrails.api.select_version(-1, view.controller)
+        vistrails.api.select_version('count + area', view.controller)
+        vistrails.api.select_version('writing to file', view.controller)
+
+    def test_change_version_with_common_connections(self):
+        import vistrails.core.system
+        filename = (vistrails.core.system.vistrails_root_directory() + 
+                    '/tests/resources/terminator.vt')
+        view = vistrails.api.open_vistrail_from_file(filename)
+        vistrails.api.select_version('Image Slices HW', view.controller)
+        vistrails.api.select_version('Combined Rendering HW', view.controller)
+
+    def test_switch_mode(self):
+        vistrails.api.switch_to_pipeline_view()
+        vistrails.api.switch_to_history_view()
+        vistrails.api.switch_to_query_view()
+        vistrails.api.switch_to_pipeline_view()
+        vistrails.api.switch_to_history_view()
+        vistrails.api.switch_to_query_view()
+
+    def test_group(self):
+        vistrails.api.new_vistrail()
+        basic_pkg = get_vistrails_basic_pkg_id()
+        m1 = vistrails.api.add_module(0, 0,    basic_pkg, 'File', '')
+        m2 = vistrails.api.add_module(0, -100, basic_pkg, 'File', '')
+        m3 = vistrails.api.add_module(0, -100, basic_pkg, 'File', '')
+        r = vistrails.api.get_module_registry()
+        src = r.get_port_spec(basic_pkg, 'File', None, 'value_as_string', 
+                              'output')
+        dst = r.get_port_spec(basic_pkg, 'File', None, 'name', 'input')
+#         src = r.module_source_ports(True, basic_pkg, 'File', '')[1]
+#         assert src.name == 'value_as_string'
+#         dst = r.module_destination_ports(True, basic_pkg, 'File', '')[1]
+#         assert dst.name == 'name'
+        vistrails.api.add_connection(m1.id, src, m2.id, dst)
+        vistrails.api.add_connection(m2.id, src, m3.id, dst)
+        vistrails.api.create_group([0, 1, 2], [0, 1])
+
diff --git a/vistrails/gui/pipeline_view_select.py b/vistrails/gui/pipeline_view_select.py
new file mode 100644
index 0000000..732ba69
--- /dev/null
+++ b/vistrails/gui/pipeline_view_select.py
@@ -0,0 +1,186 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This contains a customized pipeline view for read-only selection
+
+QReadOnlyPortSelectPipelineView
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.pipeline_view import QGraphicsConfigureItem, QGraphicsModuleItem, \
+    QAbstractGraphicsPortItem, QPipelineScene, QPipelineView
+from vistrails.gui.theme import CurrentTheme
+
+class QReadOnlyPortSelectPipelineView(QPipelineView):
+    def __init__(self, parent, scene, single_output=False, include_module_ids=[]):
+        """ QReadOnlyPortSelectPipelineView(parent: QPipelineView,
+                                            scene: QGraphicsScene,
+                                            single_output: bool,
+                                            include_module_ids: list)
+                                            -> QReadOnlyPortSelectPipelineView
+        Create a read only pipeline view that only allows selection of ports from
+        the modules in include_module_ids.  If single_output is True, only one
+        output port can be selected at a time.
+        
+        """
+        QPipelineView.__init__(self, parent)
+        self.single_output = single_output
+        self._shown = False
+        self._selected_input_ports = []
+        self._selected_output_ports = []
+        # Create custom scene
+        scene_copy = QPipelineScene(self)
+        scene_copy.controller = scene.controller
+        scene_copy.setupScene(scene.pipeline)
+        scene_copy.selectAll()
+        if include_module_ids:
+            # Remove modules not in the include list and associated connections
+            sel_modules, sel_connections = scene_copy.get_selected_item_ids()
+            [scene_copy.remove_module(m_id) for m_id in sel_modules if m_id not in include_module_ids]
+            [scene_copy.remove_connection(c_id) for c_id in sel_connections if c_id not in scene_copy.get_selected_item_ids()[1]]
+        # Hide configure button on modules
+        for item in scene_copy.selectedItems():
+            if isinstance(item, QGraphicsModuleItem):
+                for c_item in item.childItems():
+                    if isinstance(c_item, QGraphicsConfigureItem):
+                        c_item.setVisible(False)
+        # Unselect everything and use the newly created scene
+        scene_copy.clearSelection()
+        scene_copy.updateSceneBoundingRect()
+        self.setScene(scene_copy)
+    
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Toggle port selection
+        
+        """
+        buttons = self.translateButton(event)
+        if buttons == QtCore.Qt.LeftButton:
+            scenePos = self.mapToScene(event.pos())
+            item = self.scene().itemAt(scenePos)
+            if isinstance(item, QAbstractGraphicsPortItem):
+                is_input = item.port.type == 'input'
+                if self.single_output and not is_input and len(self._selected_output_ports) > 0 and item != self._selected_output_ports[0]:
+                    # Deselect current output port if another port selected in single output mode
+                    self._selected_output_ports[0].setSelected(False)
+                    del self._selected_output_ports[:]
+                if is_input:
+                    port_set = self._selected_input_ports
+                else:
+                    port_set = self._selected_output_ports
+                if item in port_set:
+                    port_set.remove(item)
+                else:
+                    port_set.append(item)
+                self._clicked_port = item
+            else:
+                self._clicked_port = None
+            event.accept()
+        else:
+            QPipelineView.mousePressEvent(self, event)
+            
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(event: QMouseEvent) -> None
+        Update port highlighting
+        
+        """
+        if event.button() == QtCore.Qt.LeftButton:
+            port = self._clicked_port
+            if port is not None:
+                port.setSelected(port in self._selected_input_ports or
+                                 port in self._selected_output_ports)
+            event.accept()
+        else:
+            QPipelineView.mouseReleaseEvent(self, event)
+        
+    def mouseDoubleClickEvent(self, event):
+        """ mouseDoubleClickEvent(event: QMouseEvent) -> None
+        Disallow left button double clicks
+        
+        """
+        buttons = self.translateButton(event)
+        if buttons == QtCore.Qt.LeftButton:
+            event.accept()
+        else:
+            QPipelineView.mouseDoubleClickEvent(self, event)
+        
+    def mouseMoveEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Disallow left click and drag
+        
+        """
+        buttons = self.translateButton(event)
+        if buttons == QtCore.Qt.LeftButton:
+            event.accept()
+        else:
+            QPipelineView.mouseMoveEvent(self, event)
+            
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QKeyEvent) -> None
+        Disallow key presses
+        
+        """
+        event.accept()
+        
+    def paintEvent(self, event):
+        """ paintEvent(event: QPaintEvent) -> None
+        Fit pipeline to view on first paint
+        
+        """
+        if not self._shown:
+            self._shown = True
+            self.scene().fitToView(self)
+        QPipelineView.paintEvent(self, event)
+        
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Set smaller pipeline view size
+
+        """
+        return QtCore.QSize(512, 512)
+    
+    def getSelectedInputPorts(self):
+        """ getSelectedInputPorts() -> list
+        Get list of selected input port (QGraphicsPortItem) objects
+        
+        """
+        return self._selected_input_ports
+    
+    def getSelectedOutputPorts(self):
+        """ getSelectedOutputPorts() -> list
+        Get list of selected output port (QGraphicsPortItem) objects
+        
+        """
+        return self._selected_output_ports
+
+
diff --git a/vistrails/gui/port_documentation.py b/vistrails/gui/port_documentation.py
new file mode 100644
index 0000000..a484fb4
--- /dev/null
+++ b/vistrails/gui/port_documentation.py
@@ -0,0 +1,89 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains a dialog and widgets related to the module documentation
+dialog, which displays the available documentation for a given VisTrails module.
+
+QMethodDocumentation
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.vistrail.port import PortEndPoint
+from vistrails.core.utils import VistrailsInternalError
+
+class QPortDocumentation(QtGui.QDialog):
+    """
+    QPortDocumentation is a dialog for showing port documentation. duh.
+
+    """
+    def __init__(self, module, port_type, port_name, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+
+        if not module.has_port_spec(port_name, port_type):
+            doc = None
+        else:
+            port_spec = module.get_port_spec(port_name, port_type)
+            doc = port_spec.docstring()
+            if doc is None:
+                descriptor = module.module_descriptor
+                # try the old method of accessing documentation
+                if port_type == 'output':
+                    call_ = descriptor.module.provide_output_port_documentation
+                elif port_type == 'input':
+                    call_ = descriptor.module.provide_input_port_documentation
+                else:
+                    raise VistrailsInternalError("Invalid port type")
+                doc = call_(port_name)
+                
+        self.setWindowTitle('Documentation for %s port %s in "%s"' %
+                            (port_type, port_name, module.name))
+
+
+        layout = QtGui.QVBoxLayout()
+        layout.addStrut(600)
+        layout.addWidget(QtGui.QLabel("Port name: %s" % port_name))
+        layout.addWidget(QtGui.QLabel("Module name: %s" % module.name))
+        layout.addWidget(QtGui.QLabel("Module package: %s" % \
+                                                 module.package))
+        self.textEdit = QtGui.QTextEdit(self)
+        layout.addWidget(self.textEdit, 1)
+        if doc:
+            self.textEdit.insertPlainText(doc)
+        else:
+            self.textEdit.insertPlainText("(Documentation not available)")
+        self.textEdit.setReadOnly(True)
+        self.textEdit.setTextCursor(QtGui.QTextCursor(self.textEdit.document()))
+        self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok)
+        layout.addWidget(self.buttonBox)
+        self.setLayout(layout)
+        self.connect(self.buttonBox, QtCore.SIGNAL('accepted()'), self.accept)
diff --git a/vistrails/gui/ports_pane.py b/vistrails/gui/ports_pane.py
new file mode 100644
index 0000000..5de8234
--- /dev/null
+++ b/vistrails/gui/ports_pane.py
@@ -0,0 +1,613 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from itertools import izip
+import os
+
+from vistrails.core import debug
+from vistrails.core.modules.basic_modules import identifier as basic_identifier
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.utils import create_port_spec_string
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.system import vistrails_root_directory
+from vistrails.gui.modules import get_widget_class
+from vistrails.gui.common_widgets import QToolWindowInterface
+from vistrails.gui.port_documentation import QPortDocumentation
+from vistrails.gui.theme import CurrentTheme
+
+class AliasLabel(QtGui.QLabel):
+    """
+    AliasLabel is a QLabel that supports hover actions similar
+    to a hot link
+    """
+    def __init__(self, alias='', text='', default_label='', parent=None):
+        """ AliasLabel(alias:str , text: str, default_label: str,
+                             parent: QWidget) -> QHoverAliasLabel
+        Initialize the label with a text
+        
+        """
+        QtGui.QLabel.__init__(self, parent)
+        self.alias = alias
+        self.caption = text
+        # catch None
+        if default_label:
+            self.default_label = default_label
+        else:
+            self.default_label = ""
+        self.updateText()
+        self.setAttribute(QtCore.Qt.WA_Hover)
+        self.setCursor(QtCore.Qt.PointingHandCursor)
+        self.setToolTip(alias)
+        self.palette().setColor(QtGui.QPalette.WindowText,
+                                CurrentTheme.HOVER_DEFAULT_COLOR)
+
+    def updateText(self):
+        """ updateText() -> None
+        Update the label text to contain the alias name when appropriate
+        
+        """
+        if self.alias != '':
+            self.setText(self.alias + ': ' + self.caption)
+        elif self.default_label != '':
+            self.setText(self.default_label + ': ' + self.caption)
+        else:
+            self.setText(self.caption)
+
+    def event(self, event):
+        """ event(event: QEvent) -> Event Result
+        Override to handle hover enter and leave events for hot links
+        
+        """
+        if event.type()==QtCore.QEvent.HoverEnter:
+            self.palette().setColor(QtGui.QPalette.WindowText,
+                                    CurrentTheme.HOVER_SELECT_COLOR)
+        if event.type()==QtCore.QEvent.HoverLeave:
+            self.palette().setColor(QtGui.QPalette.WindowText,
+                                    CurrentTheme.HOVER_DEFAULT_COLOR)
+        return QtGui.QLabel.event(self, event)
+        # return super(QHoverAliasLabel, self).event(event)
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None        
+        If mouse click on the label, show up a dialog to change/add
+        the alias name
+        
+        """
+        if event.button()==QtCore.Qt.LeftButton:
+            (text, ok) = QtGui.QInputDialog.getText(self,
+                                                    'Set Parameter Alias',
+                                                    'Enter the parameter alias',
+                                                    QtGui.QLineEdit.Normal,
+                                                    self.alias)
+            while ok and self.parent().check_alias(str(text)):
+                msg =" This alias is already being used.\
+ Please enter a different parameter alias "
+                (text, ok) = QtGui.QInputDialog.getText(self,
+                                                        'Set Parameter Alias',
+                                                        msg,
+                                                        QtGui.QLineEdit.Normal,
+                                                        text)
+            if ok and str(text)!=self.alias:
+                if not self.parent().check_alias(str(text)):
+                    self.alias = str(text).strip()
+                    self.updateText()
+                    self.parent().updateMethod()
+
+class Parameter(object):
+    def __init__(self, desc):
+        self.type = desc.name
+        self.identifier = desc.identifier
+        self.namespace = None if not desc.namespace else desc.namespace
+        self.strValue = ''
+        self.alias = ''
+        self.queryMethod = None
+        self.port_spec_item = None
+        self.param_exists = False
+        
+class ParameterEntry(QtGui.QTreeWidgetItem):
+    plus_icon = QtGui.QIcon(os.path.join(vistrails_root_directory(),
+                                         'gui/resources/images/plus.png'))
+    minus_icon = QtGui.QIcon(os.path.join(vistrails_root_directory(),
+                                          'gui/resources/images/minus.png'))
+    def __init__(self, port_spec, function=None, parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent)
+        self.setFirstColumnSpanned(True)
+        self.port_spec = port_spec
+        self.function = function
+
+    def build_widget(self, widget_accessor, with_alias=True):
+        reg = get_module_registry()
+
+        # widget = QtGui.QDockWidget()
+        # widget.setFeatures(QtGui.QDockWidget.DockWidgetClosable |
+        #                    QtGui.QDockWidget.DockWidgetVerticalTitleBar)
+        widget = QtGui.QWidget()
+
+        h_layout = QtGui.QHBoxLayout()
+        h_layout.insertSpacing(0, 10)
+        h_layout.setMargin(2)
+        h_layout.setSpacing(2)
+
+        v_layout = QtGui.QVBoxLayout()
+        v_layout.setAlignment(QtCore.Qt.AlignVCenter)
+        delete_button = QtGui.QToolButton()
+        delete_button.setIconSize(QtCore.QSize(8,8))
+        delete_button.setIcon(ParameterEntry.minus_icon)
+        def delete_method():
+            if self.function is not None:
+                self.group_box.parent().parent().parent().delete_method(
+                    self, self.port_spec.name, self.function.real_id)
+            else:
+                self.group_box.parent().parent().parent().delete_method(
+                    self, self.port_spec.name, None)
+                
+        QtCore.QObject.connect(delete_button, QtCore.SIGNAL("clicked()"), 
+                               delete_method)
+        v_layout.addWidget(delete_button)
+        
+        add_button = QtGui.QToolButton()
+        add_button.setIcon(ParameterEntry.plus_icon)
+        add_button.setIconSize(QtCore.QSize(8,8))
+        def add_method():
+            self.group_box.parent().parent().parent().add_method(
+                self.port_spec.name)
+        QtCore.QObject.connect(add_button, QtCore.SIGNAL("clicked()"), 
+                               add_method)
+        v_layout.addWidget(add_button)
+        h_layout.addLayout(v_layout)
+        
+        self.my_widgets = []
+        self.my_labels = []
+        self.group_box = QtGui.QGroupBox()
+        layout = QtGui.QGridLayout()
+        layout.setMargin(5)
+        layout.setSpacing(5)
+        layout.setColumnStretch(1,1)
+        self.group_box.setFocusPolicy(QtCore.Qt.ClickFocus)
+        self.group_box.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                                     QtGui.QSizePolicy.Fixed)
+        self.group_box.palette().setColor(QtGui.QPalette.Window,
+                                     CurrentTheme.METHOD_SELECT_COLOR)
+
+        if self.function is not None:
+            params = self.function.parameters
+        else:
+            params = [None,] * len(self.port_spec.descriptors())
+
+        for i, (psi, param) in enumerate(izip(self.port_spec.port_spec_items, 
+                                              params)):
+            widget_class = widget_accessor(psi.descriptor.module)
+            if param is not None:
+                obj = param
+            else:
+                obj = Parameter(psi.descriptor)
+            obj.port_spec_item = psi
+            if with_alias:
+                label = AliasLabel(obj.alias, obj.type, psi.label)
+                self.my_labels.append(label)
+            else:
+                label = QtGui.QLabel(obj.type)
+            param_widget = widget_class(obj, self.group_box)
+            self.my_widgets.append(param_widget)
+            layout.addWidget(label, i, 0)
+            layout.addWidget(param_widget, i, 1)
+
+        self.group_box.setLayout(layout)
+        def updateMethod():
+            if self.function is not None:
+                real_id = self.function.real_id
+            else:
+                real_id = -1
+            self.group_box.parent().parent().parent().update_method(
+                self, self.port_spec.name, self.my_widgets, self.my_labels, real_id)
+        def check_alias(name):
+            controller = self.group_box.parent().parent().parent().controller
+            if controller:
+                return controller.check_alias(name)
+            return False
+        self.group_box.updateMethod = updateMethod
+        self.group_box.check_alias = check_alias
+        h_layout.addWidget(self.group_box)
+        widget.setLayout(h_layout)
+        return widget
+
+    def get_widget(self):
+        return self.build_widget(get_widget_class, True)
+
+class PortItem(QtGui.QTreeWidgetItem):
+    null_icon = QtGui.QIcon()
+    eye_icon = QtGui.QIcon(os.path.join(vistrails_root_directory(),
+                                        'gui/resources/images/eye.png'))
+    eye_disabled_icon = \
+        QtGui.QIcon(os.path.join(vistrails_root_directory(),
+                                 'gui/resources/images/eye_gray.png'))
+    conn_icon = \
+        QtGui.QIcon(os.path.join(vistrails_root_directory(),
+                                 'gui/resources/images/connection.png'))
+
+    def __init__(self, port_spec, is_connected, is_optional, is_visible,
+                 parent=None):
+        QtGui.QTreeWidgetItem.__init__(self, parent)
+        # self.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
+        self.setFlags(QtCore.Qt.ItemIsEnabled)
+        # self.setCheckState(0, QtCore.Qt.Unchecked)
+        self.port_spec = port_spec
+        self.is_connected = is_connected
+        self.is_optional = is_optional
+        self.is_visible = is_visible
+        self.build_item(port_spec, is_connected, is_optional, is_visible)
+
+    def visible(self):
+        return not self.is_optional or self.is_visible
+
+    def set_visible(self, visible):
+        self.is_visible = visible
+        if visible:
+            self.setIcon(0, PortItem.eye_icon)
+        else:
+            self.setIcon(0, PortItem.null_icon)
+
+    def get_visible(self):
+        return self.visible_checkbox
+
+    def get_connected(self):
+        return self.connected_checkbox
+
+    def is_constant(self):
+        return (self.port_spec.is_valid and 
+                get_module_registry().is_constant(self.port_spec))
+
+    def build_item(self, port_spec, is_connected, is_optional, is_visible):
+        if not is_optional:
+            self.setIcon(0, PortItem.eye_disabled_icon)
+        elif is_visible:
+            self.setIcon(0, PortItem.eye_icon)
+            
+        if is_connected:
+            self.setIcon(1, PortItem.conn_icon)
+        self.setText(2, port_spec.name)
+
+        # if port_spec is not a method, make it gray
+        if not self.is_constant():
+            self.setForeground(2, 
+                               QtGui.QBrush(QtGui.QColor.fromRgb(128,128,128)))
+
+        self.visible_checkbox = QtGui.QCheckBox()
+        self.connected_checkbox = QtGui.QCheckBox()
+        
+    def contextMenuEvent(self, event, widget):
+        if self.port_spec is None:
+            return
+        act = QtGui.QAction("View Documentation", widget)
+        act.setStatusTip("View method documentation")
+        QtCore.QObject.connect(act,
+                               QtCore.SIGNAL("triggered()"),
+                               self.view_documentation)
+        menu = QtGui.QMenu(widget)
+        menu.addAction(act)
+        menu.exec_(event.globalPos())
+        
+    def view_documentation(self):
+        # descriptor = self.treeWidget().module.module_descriptor
+        module = self.treeWidget().module
+        port_type = self.treeWidget().port_type
+        widget = QPortDocumentation(module,
+                                    port_type,
+                                    self.port_spec.name)
+        widget.setAttribute(QtCore.Qt.WA_DeleteOnClose)
+        widget.exec_()
+
+class PortsList(QtGui.QTreeWidget):
+    def __init__(self, port_type, parent=None):
+        QtGui.QTreeWidget.__init__(self, parent)
+        self.port_type = port_type
+        self.setColumnCount(3)
+        self.setColumnWidth(0,24)
+        self.setColumnWidth(1,24)
+        self.setRootIsDecorated(False)
+        self.setIndentation(0)
+        self.setHeaderHidden(True)
+        self.connect(self, QtCore.SIGNAL("itemClicked(QTreeWidgetItem*, int)"),
+                     self.item_clicked)
+        self.module = None
+        self.port_spec_items = {}
+        self.entry_klass = ParameterEntry
+
+    def setReadOnly(self, read_only):
+        self.setEnabled(not read_only)
+
+    def set_entry_klass(self, entry_klass):
+        self.entry_klass = entry_klass
+        self.update_module(self.module)
+
+    def update_module(self, module):
+        """ update_module(module: Module) -> None        
+        Setup this tree widget to show functions of module
+        
+        """
+        # this is strange but if you try to clear the widget when the focus is 
+        # in one of the items (after setting a parameter for example), 
+        # VisTrails crashes on a Mac (Emanuele) This is probably a Qt bug
+        w =  QtGui.QApplication.focusWidget()
+        if self.isAncestorOf(w):
+            w.clearFocus()
+        self.clear()
+        self.module = module
+        self.port_spec_items = {}
+        self.function_map = {}
+        if module and module.is_valid:
+            reg = get_module_registry()
+            descriptor = module.module_descriptor
+            if self.port_type == 'input':
+                port_specs = module.destinationPorts()
+                connected_ports = module.connected_input_ports
+                visible_ports = module.visible_input_ports
+            elif self.port_type == 'output':
+                port_specs = module.sourcePorts()
+                connected_ports = module.connected_output_ports
+                visible_ports = module.visible_output_ports
+            else:
+                raise TypeError("Unknown port type: '%s'" % self.port_type)
+            
+            for port_spec in sorted(port_specs, key=lambda x: x.name):
+                connected = port_spec.name in connected_ports and \
+                    connected_ports[port_spec.name] > 0
+                item = PortItem(port_spec, 
+                                connected,
+                                port_spec.optional,
+                                port_spec.name in visible_ports)
+                self.addTopLevelItem(item)
+                self.port_spec_items[port_spec.name] = (port_spec, item)
+
+            if self.port_type == 'input':
+                for function in module.functions:
+                    if not function.is_valid:
+                        continue
+                    port_spec, item = self.port_spec_items[function.name]
+                    subitem = self.entry_klass(port_spec, function)
+                    self.function_map[function.real_id] = subitem
+                    item.addChild(subitem)
+                    subitem.setFirstColumnSpanned(True)
+                    self.setItemWidget(subitem, 0, subitem.get_widget())
+                    item.setExpanded(True)
+                
+                    # self.setItemWidget(item, 0, item.get_visible())
+                    # self.setItemWidget(item, 1, item.get_connected())
+
+                    # i = QTreeWidgetItem(self)
+                    # self.addTopLevelItem(i)
+                    # i.setText(2, port_spec.name)
+                    # visible_checkbox = QtGui.QCheckBox()
+                    # self.setItemWidget(i, 0, visible_checkbox)
+                    # connceted_checkbox = QtGui.QCheckBox()
+                    # connected_checkbox.setEnabled(False)
+                    # self.setItemWidget(i, 1, connected_checkbox)
+                
+
+            # base_items = {}
+            # # Create the base widget item for each descriptor
+            # for descriptor in moduleHierarchy:
+            #     baseName = descriptor.name
+            #     base_package = descriptor.identifier
+            #     baseItem = QMethodTreeWidgetItem(None,
+            #                                      None,
+            #                                      self,
+            #                                      ([]
+            #                                       <<  baseName
+            #                                       << ''))
+            #     base_items[descriptor] = baseItem
+
+            # method_specs = {}
+            # # do this in reverse to ensure proper overloading
+            # # !!! NOTE: we have to use ***all*** input ports !!!
+            # # because a subclass can overload a port with a 
+            # # type that isn't a method
+            # for descriptor in reversed(moduleHierarchy):
+            #     method_specs.update((name, (descriptor, spec))
+            #                         for name, spec in \
+            #                             registry.module_ports('input', 
+            #                                                   descriptor))
+
+            # # add local registry last so that it takes precedence
+            # method_specs.update((spec.name, (descriptor, spec))
+            #                     for spec in module.port_spec_list
+            #                     if spec.type == 'input')
+
+            # for _, (desc, method_spec) in sorted(method_specs.iteritems()):
+            #     if registry.is_method(method_spec):
+            #         baseItem = base_items[desc]
+            #         sig = method_spec.short_sigstring
+            #         QMethodTreeWidgetItem(module,
+            #                               method_spec,
+            #                               baseItem,
+            #                               ([]
+            #                                << method_spec.name
+            #                                << sig))
+
+            # self.expandAll()
+            # self.resizeColumnToContents(2) 
+        # show invalid module attributes
+        if module and not module.is_valid and self.port_type == 'input':
+            for function in module.functions:
+                if function.name in self.port_spec_items:
+                    port_spec, item = self.port_spec_items[function.name]
+                else:
+                    sigstring = create_port_spec_string(
+                        [(basic_identifier, "String")
+                         for i in xrange(len(function.parameters))])
+                    port_spec = PortSpec(name=function.name, type='input',
+                                         sigstring=sigstring)
+                    item = PortItem(port_spec,  False, False, False)
+                self.addTopLevelItem(item)
+                self.port_spec_items[port_spec.name] = (port_spec, item)
+                subitem = self.entry_klass(port_spec, function)
+                self.function_map[function.real_id] = subitem
+                item.addChild(subitem)
+                subitem.setFirstColumnSpanned(True)
+                self.setItemWidget(subitem, 0, subitem.get_widget())
+                item.setExpanded(True)
+
+    def item_clicked(self, item, col):
+        if item.parent() is not None:
+            return
+
+        if self.port_type == 'input':
+            visible_ports = self.module.visible_input_ports
+        elif self.port_type == 'output':
+            visible_ports = self.module.visible_output_ports
+        else:
+            raise TypeError("Unknown port type: '%s'" % self.port_type)
+
+        if col == 0:
+            if item.is_optional:
+                item.set_visible(not item.is_visible)
+                if item.is_visible:
+                    visible_ports.add(item.port_spec.name)
+                else:
+                    visible_ports.discard(item.port_spec.name)
+                self.controller.flush_delayed_actions()
+                self.controller.current_pipeline_scene.recreate_module(
+                    self.controller.current_pipeline, self.module.id)
+        if col == 2:
+            if item.isExpanded():
+                item.setExpanded(False)
+            elif item.childCount() > 0:
+                item.setExpanded(True)
+            elif item.childCount() == 0 and item.is_constant():
+                self.do_add_method(item.port_spec, item)
+        
+    def set_controller(self, controller):
+        self.controller = controller
+
+    def update_method(self, subitem, port_name, widgets, labels, real_id=-1):
+        #print 'updateMethod called', port_name
+        if self.controller:
+            _, item = self.port_spec_items[port_name]
+            str_values = []
+            query_methods = []
+            for w in widgets:
+                str_values.append(str(w.contents()))
+                if hasattr(w, 'query_method'):
+                    query_methods.append(w.query_method())
+            if real_id < 0:
+                should_replace = False
+            else:
+                should_replace = True
+            self.controller.update_function(self.module,
+                                            port_name,
+                                            str_values,
+                                            real_id,
+                                            [str(label.alias)
+                                             for label in labels],
+                                            query_methods,
+                                            should_replace)
+
+            # FIXME need to get the function set on the item somehow
+            # HACK for now
+            for function in self.module.functions:
+                if function.real_id not in self.function_map:
+                    self.function_map[function.real_id] = subitem
+                    subitem.function = function
+
+            # make the scene display the fact that we have a parameter
+            # by dimming the port
+            # self.controller.flush_delayed_actions()
+            self.controller.current_pipeline_scene.update_module_functions(
+                self.controller.current_pipeline, self.module.id)
+                                            
+    def delete_method(self, subitem, port_name, real_id=None):
+        _, item = self.port_spec_items[port_name]
+        item.removeChild(subitem)
+
+        if real_id is not None and self.controller:
+            #print "got to delete"
+            self.controller.delete_function(real_id, self.module.id)
+
+            # make the scene display the fact that we have lost the
+            # parameter by undimming the port
+            # self.controller.flush_delayed_actions()
+            self.controller.current_pipeline_scene.update_module_functions(
+                self.controller.current_pipeline, self.module.id)
+
+        # how to delete items...x
+        # subitem.deleteLater()
+            
+    def do_add_method(self, port_spec, item):
+        """do_add_method(port_spec: PortSpec,
+                         item:      PortItem) -> None
+
+        Displays a new method for the port.
+        """
+
+        subitem = self.entry_klass(port_spec)
+        item.addChild(subitem)
+        subitem.setFirstColumnSpanned(True)
+        self.setItemWidget(subitem, 0, subitem.get_widget())
+        item.setExpanded(True)
+        if len(port_spec.descriptors()) == 0:
+            self.update_method(subitem, port_spec.name, [], [])
+
+    def add_method(self, port_name):
+        port_spec, item = self.port_spec_items[port_name]
+        self.do_add_method(port_spec, item)
+        
+    def contextMenuEvent(self, event):
+        # Just dispatches the menu event to the widget item
+        item = self.itemAt(event.pos())
+        if item:
+            item.contextMenuEvent(event, self)
+
+class QPortsPane(QtGui.QWidget, QToolWindowInterface):
+    def __init__(self, port_type, parent=None, flags=QtCore.Qt.Widget):
+        QtGui.QWidget.__init__(self, parent, flags)
+        self.port_type = port_type
+        self.build_widget()
+        self.controller = None
+
+    def build_widget(self):
+        self.tree_widget = PortsList(self.port_type)
+        layout = QtGui.QHBoxLayout()
+        layout.setMargin(0)
+        layout.addWidget(self.tree_widget)
+        self.setLayout(layout)
+        self.setWindowTitle('%s Ports' % self.port_type.capitalize())
+
+    def set_controller(self, controller):
+        self.controller = controller
+        self.tree_widget.set_controller(controller)
+
+    def update_module(self, module):
+        self.tree_widget.update_module(module)
+    
diff --git a/vistrails/gui/preferences.py b/vistrails/gui/preferences.py
new file mode 100644
index 0000000..ed08003
--- /dev/null
+++ b/vistrails/gui/preferences.py
@@ -0,0 +1,696 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtGui, QtCore
+from vistrails.core import get_vistrails_application
+from vistrails.core.packagemanager import get_package_manager
+from vistrails.core.modules.package import Package
+from vistrails.core.utils import InvalidPipeline
+from vistrails.core.utils.uxml import (named_elements,
+                             elements_filter, enter_named_element)
+from vistrails.gui.configuration import (QConfigurationWidget, QGeneralConfiguration,
+                               QThumbnailConfiguration)
+from vistrails.gui.module_palette import QModulePalette
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.core.configuration import get_vistrails_persistent_configuration, \
+    get_vistrails_configuration
+from vistrails.core import debug
+import os.path
+
+##############################################################################
+
+class QPackageConfigurationDialog(QtGui.QDialog):
+
+    def __init__(self, parent, package):
+        QtGui.QDialog.__init__(self, parent)
+
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+
+        
+        self.setWindowTitle('Configuration for package "%s"' % package.name)
+        self._package = package
+        c = package.configuration
+        self._configuration_object = c
+        assert c is not None
+
+        layout = QtGui.QVBoxLayout(self)
+        self.setLayout(layout)
+        self._status_bar = QtGui.QStatusBar(self)
+
+        self._configuration_widget = QConfigurationWidget(self, c, c,
+                                                          self._status_bar)
+        layout.addWidget(self._configuration_widget)
+
+        btns = (QtGui.QDialogButtonBox.Close |
+                QtGui.QDialogButtonBox.RestoreDefaults)
+        self._button_box = QtGui.QDialogButtonBox(btns,
+                                                  QtCore.Qt.Horizontal,
+                                                  self)
+        self.connect(self._button_box,
+                     QtCore.SIGNAL('clicked(QAbstractButton *)'),
+                     self.button_clicked)
+
+        self.connect(self._configuration_widget._tree.treeWidget,
+                     QtCore.SIGNAL('configuration_changed'),
+                     self.configuration_changed)
+                     
+        layout.addWidget(self._status_bar)
+        layout.addWidget(self._button_box)
+
+    def button_clicked(self, button):
+        role = self._button_box.buttonRole(button)
+        if role == QtGui.QDialogButtonBox.ResetRole:
+            txt = ("This will reset all configuration values of " +
+                   "this package to their default values. Do you " +
+                   "want to proceed?")
+            msg_box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
+                                        "Really reset?", txt,
+                                        (QtGui.QMessageBox.Yes |
+                                         QtGui.QMessageBox.No))
+            if msg_box.exec_() == QtGui.QMessageBox.Yes:
+                self.reset_configuration()
+        else:
+            assert role == QtGui.QDialogButtonBox.RejectRole
+            self.close_dialog()
+
+    def reset_configuration(self):
+        self._package.reset_configuration()
+        conf = self._package.configuration
+        self._configuration_widget.configuration_changed(conf)
+
+    def close_dialog(self):
+        self.done(0)
+
+    def configuration_changed(self, item, new_value):
+        self._package.set_persistent_configuration()
+
+##############################################################################
+
+class QPackagesWidget(QtGui.QWidget):
+
+    # Signals that a package should be selected after the event loop updates (to remove old references)
+    select_package_after_update_signal = QtCore.SIGNAL("select_package_after_update_signal")
+
+    ##########################################################################
+    # Initialization
+
+    def __init__(self, parent, status_bar):
+        QtGui.QWidget.__init__(self, parent)
+        self._status_bar = status_bar
+
+        base_layout = QtGui.QHBoxLayout(self)
+        
+        left = QtGui.QFrame(self)
+        right = QtGui.QFrame(self)
+
+        base_layout.addWidget(left)
+        base_layout.addWidget(right, 1)
+        
+        ######################################################################
+        left_layout = QtGui.QVBoxLayout(left)
+        left_layout.addWidget(QtGui.QLabel("Disabled packages:", left))
+        self._available_packages_list = QtGui.QListWidget(left)
+        left_layout.addWidget(self._available_packages_list)
+        left_layout.addWidget(QtGui.QLabel("Enabled packages:", left))
+        self._enabled_packages_list = QtGui.QListWidget(left)
+        left_layout.addWidget(self._enabled_packages_list)
+        self.update_button = QtGui.QPushButton("Refresh Lists", left)
+        left_layout.addWidget(self.update_button, 0, QtCore.Qt.AlignLeft)
+        
+        self.update_button.clicked.connect(self.populate_lists)
+
+        self.connect(self._available_packages_list,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.selected_available_list,
+                     QtCore.Qt.QueuedConnection)
+
+        self.connect(self._enabled_packages_list,
+                     QtCore.SIGNAL('itemSelectionChanged()'),
+                     self.selected_enabled_list,
+                     QtCore.Qt.QueuedConnection)
+
+        sm = QtGui.QAbstractItemView.SingleSelection
+        self._available_packages_list.setSelectionMode(sm)
+        self._enabled_packages_list.setSelectionMode(sm)
+
+
+        ######################################################################
+        right_layout = QtGui.QVBoxLayout(right)
+        info_frame = QtGui.QFrame(right)
+
+        info_layout = QtGui.QVBoxLayout(info_frame)
+        grid_frame = QtGui.QFrame(info_frame)
+        grid_frame.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                 QtGui.QSizePolicy.Expanding)
+
+        info_layout.addWidget(grid_frame)
+        grid_layout = QtGui.QGridLayout(grid_frame)
+        l1 = QtGui.QLabel("Package Name:", grid_frame)
+        grid_layout.addWidget(l1, 0, 0)
+        l2 = QtGui.QLabel("Identifier:", grid_frame)
+        grid_layout.addWidget(l2, 1, 0)
+        l3 = QtGui.QLabel("Version:", grid_frame)
+        grid_layout.addWidget(l3, 2, 0)
+        l4 = QtGui.QLabel("Dependencies:", grid_frame)
+        grid_layout.addWidget(l4, 3, 0)
+        l5 = QtGui.QLabel("Reverse Dependencies:", grid_frame)
+        grid_layout.addWidget(l5, 4, 0)
+        l6 = QtGui.QLabel("Description:", grid_frame)
+        grid_layout.addWidget(l6, 5, 0)
+
+        self._name_label = QtGui.QLabel("", grid_frame)
+        grid_layout.addWidget(self._name_label, 0, 1)
+
+        self._identifier_label = QtGui.QLabel("", grid_frame)
+        grid_layout.addWidget(self._identifier_label, 1, 1)
+
+        self._version_label = QtGui.QLabel("", grid_frame)
+        grid_layout.addWidget(self._version_label, 2, 1)
+
+        self._dependencies_label = QtGui.QLabel("", grid_frame)
+        grid_layout.addWidget(self._dependencies_label, 3, 1)
+
+        self._reverse_dependencies_label = QtGui.QLabel("", grid_frame)
+        grid_layout.addWidget(self._reverse_dependencies_label, 4, 1)
+
+        self._description_label = QtGui.QLabel("", grid_frame)
+        grid_layout.addWidget(self._description_label, 5, 1)
+
+        for lbl in [l1, l2, l3, l4, l5, l6,
+                    self._name_label,
+                    self._version_label,
+                    self._dependencies_label,
+                    self._identifier_label,
+                    self._reverse_dependencies_label,
+                    self._description_label]:
+            lbl.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
+            lbl.setWordWrap(True)
+
+        grid_layout.setRowStretch(4, 1)
+        grid_layout.setColumnStretch(1, 1)
+
+        right_layout.addWidget(info_frame)
+        
+        self._enable_button = QtGui.QPushButton("&Enable")
+        self._enable_button.setEnabled(False)
+        self.connect(self._enable_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.enable_current_package)
+        self._disable_button = QtGui.QPushButton("&Disable")
+        self._disable_button.setEnabled(False)
+        self.connect(self._disable_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.disable_current_package)
+        self._configure_button = QtGui.QPushButton("&Configure...")
+        self._configure_button.setEnabled(False)
+        self.connect(self._configure_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.configure_current_package)
+        self._reload_button = QtGui.QPushButton("&Reload")
+        self._reload_button.setEnabled(False)
+        self.connect(self._reload_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.reload_current_package)
+        button_box = QtGui.QDialogButtonBox()
+        button_box.addButton(self._enable_button, QtGui.QDialogButtonBox.ActionRole)
+        button_box.addButton(self._disable_button, QtGui.QDialogButtonBox.ActionRole)
+        button_box.addButton(self._configure_button, QtGui.QDialogButtonBox.ActionRole)
+        button_box.addButton(self._reload_button, QtGui.QDialogButtonBox.ActionRole)
+        right_layout.addWidget(button_box)
+
+        self.connect(self,
+                     self.select_package_after_update_signal,
+                     self.select_package_after_update_slot,
+                     QtCore.Qt.QueuedConnection)
+
+        # pm = get_package_manager()
+        # self.connect(pm,
+        #              pm.reloading_package_signal,
+        #              self.reload_current_package_finisher,
+        #              QtCore.Qt.QueuedConnection)
+        app = get_vistrails_application()
+        app.register_notification("pm_reloading_package", 
+                                  self.reload_current_package_finisher)
+        app.register_notification("package_added", self.package_added)
+        app.register_notification("package_removed", self.package_removed)
+        
+        self.populate_lists()
+
+        self._current_package = None
+
+    def populate_lists(self):
+        pkg_manager = get_package_manager()
+        enabled_pkgs = sorted(pkg_manager.enabled_package_list())
+        enabled_pkg_dict = dict([(pkg.codepath, pkg) for
+                                   pkg in enabled_pkgs])
+        self._enabled_packages_list.clear()
+        for pkg in enabled_pkgs:
+            self._enabled_packages_list.addItem(pkg.codepath)
+        self._enabled_packages_list.sortItems()
+        available_pkg_names = [pkg for pkg in 
+                               sorted(pkg_manager.available_package_names_list())
+                               if pkg not in enabled_pkg_dict]
+        self._available_packages_list.clear()
+        for pkg in available_pkg_names:
+            self._available_packages_list.addItem(pkg)
+        self._available_packages_list.sortItems()
+
+    ##########################################################################
+
+    def enable_current_package(self):
+        av = self._available_packages_list
+        item = av.currentItem()
+        codepath = str(item.text())
+        pm = get_package_manager()
+
+        try:
+            new_deps = self._current_package.dependencies()
+        except Exception, e:
+            debug.critical("Failed getting dependencies of package %s, "
+                           "so it will not be enabled" % \
+                            self._current_package.name, str(e))
+            return
+        from vistrails.core.modules.basic_modules import identifier as basic_modules_identifier
+        if self._current_package.identifier != basic_modules_identifier:
+            new_deps.append(basic_modules_identifier)
+
+        try:
+            pm.check_dependencies(self._current_package, new_deps)
+        except Package.MissingDependency, e:
+            debug.critical("Missing dependencies", str(e))
+        else:
+            palette = QModulePalette.instance()
+            palette.setUpdatesEnabled(False)
+            try:
+                pm.late_enable_package(codepath)
+            except Package.InitializationFailed, e:
+                debug.critical("Initialization of package '%s' failed" %
+                               codepath, str(e))
+                raise
+            finally:
+                palette.setUpdatesEnabled(True)
+            # the old code that used to be here to update the lists
+            # has been moved to package_added
+            self.invalidate_current_pipeline()
+
+    def disable_current_package(self):
+        inst = self._enabled_packages_list
+        item = inst.currentItem()
+        codepath = str(item.text())
+        pm = get_package_manager()
+
+        dependency_graph = pm.dependency_graph()
+        identifier = pm.get_package_by_codepath(codepath).identifier
+
+        if dependency_graph.in_degree(identifier) > 0:
+            rev_deps = dependency_graph.inverse_adjacency_list[identifier]
+            debug.critical("Missing dependency",
+                           ("There are other packages that depend on this:\n %s" +
+                            "Please disable those first.") % rev_deps)
+        else:
+            pm.late_disable_package(codepath)
+            self.invalidate_current_pipeline()
+            # the old code that used to be here to update the lists
+            # has been moved to package_removed
+
+    def configure_current_package(self):
+        dlg = QPackageConfigurationDialog(self, self._current_package)
+        dlg.exec_()
+
+    def reload_current_package(self):
+        # DISABLES the current package and all reverse dependencies
+        inst = self._enabled_packages_list
+        item = inst.currentItem()
+        pm = get_package_manager()
+        codepath = str(item.text())
+        
+        palette = QModulePalette.instance()
+        palette.setUpdatesEnabled(False)
+        pm.reload_package_disable(codepath)
+
+    def reload_current_package_finisher(self, codepath, reverse_deps, prefix_dictionary):
+        # REENABLES the current package and all reverse dependencies
+        pm = get_package_manager()
+        try:
+            pm.reload_package_enable(reverse_deps, prefix_dictionary)
+        except Package.InitializationFailed, e:
+            debug.critical("Re-initialization of package '%s' failed" % 
+                            codepath, str(e))
+            raise
+        finally:
+            self.populate_lists()
+            palette = QModulePalette.instance()
+            palette.setUpdatesEnabled(True)
+            self.select_package_after_update(codepath)
+            self.invalidate_current_pipeline()
+
+    def package_added(self, codepath):
+        # package was added, we need to update list
+        av = self._available_packages_list
+        inst = self._enabled_packages_list
+        items = av.findItems(codepath, QtCore.Qt.MatchExactly)
+        if len(items) < 1:
+            # this is required for basic_modules and abstraction since
+            # they are not in available_package_names_list initially
+            self.populate_lists()
+            items = av.findItems(codepath, QtCore.Qt.MatchExactly)
+        for item in items:
+            pos = av.indexFromItem(item).row()
+            av.takeItem(pos)
+            inst.addItem(item)
+            inst.sortItems()
+            self.select_package_after_update(codepath)
+
+    def package_removed(self, codepath):
+        # package was removed, we need to update list
+        # if we run a late-enable with a prefix (console_mode_test),
+        # we don't actually have the package later
+        self.populate_lists()
+        self.select_package_after_update(codepath)
+
+    def select_package_after_update(self, codepath):
+        # Selecting the package causes self._current_package to be set,
+        # which reference prevents the package from being freed, so we
+        # queue it to select after the event loop completes.
+        self.emit(self.select_package_after_update_signal, codepath)
+
+    def select_package_after_update_slot(self, codepath):
+        inst = self._enabled_packages_list
+        av = self._available_packages_list
+        for item in av.findItems(codepath, QtCore.Qt.MatchExactly):
+            av.setCurrentItem(item)
+        for item in inst.findItems(codepath, QtCore.Qt.MatchExactly):
+            inst.setCurrentItem(item)
+
+    def set_buttons_to_enabled_package(self):
+        self._enable_button.setEnabled(False)
+        assert self._current_package
+        pm = get_package_manager()
+        from vistrails.core.modules.basic_modules import identifier as basic_modules_identifier
+        from vistrails.core.modules.abstraction import identifier as abstraction_identifier
+        is_not_basic_modules = (self._current_package.identifier != basic_modules_identifier)
+        is_not_abstraction = (self._current_package.identifier != abstraction_identifier)
+        can_disable = (pm.can_be_disabled(self._current_package.identifier) and
+                       is_not_basic_modules and
+                       is_not_abstraction)
+        self._disable_button.setEnabled(can_disable)
+        if not can_disable and is_not_basic_modules and is_not_abstraction:
+            msg = ("Module has reverse dependencies that must\n"+
+                   "be first disabled.")
+            self._disable_button.setToolTip(msg)
+        else:
+            self._disable_button.setToolTip("")
+        conf = self._current_package.configuration is not None
+        self._configure_button.setEnabled(conf)
+        self._reload_button.setEnabled(is_not_basic_modules)
+
+    def set_buttons_to_available_package(self):
+        self._configure_button.setEnabled(False)
+        self._disable_button.setEnabled(False)
+        self._enable_button.setEnabled(True)
+        self._reload_button.setEnabled(False)
+
+    def set_package_information(self):
+        """Looks at current package and sets all labels (name,
+        dependencies, etc.) appropriately.
+
+        """
+        assert self._current_package
+        p = self._current_package
+
+        try:
+            p.load()
+        except Exception, e:
+            msg = 'ERROR: Could not load package.'
+            self._name_label.setText(msg)
+            self._version_label.setText(msg)
+            self._identifier_label.setText(msg)
+            self._dependencies_label.setText(msg)
+            self._description_label.setText(msg)
+            self._reverse_dependencies_label.setText(msg)
+            debug.critical('Cannot load package', str(e))
+        else:
+            self._name_label.setText(p.name)
+            try:
+                deps = ', '.join(str(d) for d in p.dependencies()) or \
+                    'No package dependencies.'
+            except Exception, e:
+                debug.critical("Failed getting dependencies of package %s "
+                               "" % p.name, str(e))
+                deps = "ERROR: Failed getting dependencies"
+            try:
+                pm = get_package_manager()
+                reverse_deps = \
+                    (', '.join(pm.reverse_dependencies(p.identifier)) or
+                     'No reverse dependencies.')
+            except KeyError:
+                reverse_deps = ("Reverse dependencies only " +
+                                "available for enabled packages.")
+            self._identifier_label.setText(p.identifier)
+            self._version_label.setText(p.version)
+            self._dependencies_label.setText(deps)
+            self._description_label.setText(p.description)
+            self._reverse_dependencies_label.setText(reverse_deps)
+
+
+    ##########################################################################
+    # Signal handling
+
+    def selected_enabled_list(self):
+        item = self._enabled_packages_list.currentItem()
+        if item is None:
+            return # prevent back and forth looping when clearing selection
+        self._available_packages_list.setCurrentItem(None)
+        codepath = str(item.text())
+        pm = get_package_manager()
+        self._current_package = pm.get_package_by_codepath(codepath)
+        self.set_buttons_to_enabled_package()
+        # A delayed signal can result in the package already has been removed
+        if not pm.has_package(self._current_package.identifier):
+            return
+        self.set_package_information()
+        self._enabled_packages_list.setFocus()
+
+    def selected_available_list(self):
+        item = self._available_packages_list.currentItem()
+        if item is None:
+            return # prevent back and forth looping when clearing selection
+        self._enabled_packages_list.setCurrentItem(None)
+        codepath = str(item.text())
+        pm = get_package_manager()
+        self._current_package = pm.look_at_available_package(codepath)
+        self.set_buttons_to_available_package()
+        self.set_package_information()
+        self._available_packages_list.setFocus()
+
+    def invalidate_current_pipeline(self):
+        from vistrails.gui.vistrails_window import _app
+        _app.invalidate_pipelines()
+        
+class QPreferencesDialog(QtGui.QDialog):
+
+    def __init__(self, parent):
+        QtGui.QDialog.__init__(self, parent)
+        self._status_bar = QtGui.QStatusBar(self)
+        self.setWindowTitle('VisTrails Preferences')
+        layout = QtGui.QHBoxLayout(self)
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        self.setLayout(layout)
+
+        f = QtGui.QFrame()
+        layout.addWidget(f)
+        
+        l = QtGui.QVBoxLayout(f)
+        f.setLayout(l)
+        
+        self._tab_widget = QtGui.QTabWidget(f)
+        l.addWidget(self._tab_widget)
+        self._tab_widget.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                       QtGui.QSizePolicy.Expanding)
+
+        self._general_tab = self.create_general_tab()
+        self._tab_widget.addTab(self._general_tab, 'General Configuration')
+
+        self._thumbs_tab = self.create_thumbs_tab()
+        self._tab_widget.addTab(self._thumbs_tab, 'Thumbnails Configuration')
+        
+        self._packages_tab = self.create_packages_tab()
+        self._tab_widget.addTab(self._packages_tab, 'Module Packages')
+        
+        self._configuration_tab = self.create_configuration_tab()
+        self._tab_widget.addTab(self._configuration_tab, 'Expert Configuration')
+
+        self._button_box = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Close,
+                                                  QtCore.Qt.Horizontal,
+                                                  f)
+        self.connect(self._tab_widget,
+                     QtCore.SIGNAL('currentChanged(int)'),
+                     self.tab_changed)
+
+        self.connect(self._button_box,
+                     QtCore.SIGNAL('clicked(QAbstractButton *)'),
+                     self.close_dialog)
+
+        self.connect(self._configuration_tab._tree.treeWidget,
+                     QtCore.SIGNAL('configuration_changed'),
+                     self.configuration_changed)
+
+        self.connect(self._general_tab,
+                     QtCore.SIGNAL('configuration_changed'),
+                     self.configuration_changed)
+        
+        self.connect(self._thumbs_tab,
+                     QtCore.SIGNAL('configuration_changed'),
+                     self.configuration_changed)
+
+        l.addWidget(self._button_box)
+        l.addWidget(self._status_bar)
+
+    def close_dialog(self):
+        self.done(0)
+
+    def create_general_tab(self):
+        """ create_general_tab() -> QGeneralConfiguration
+        
+        """
+        return QGeneralConfiguration(self,
+                                     get_vistrails_persistent_configuration(),
+                                     get_vistrails_configuration())
+        
+    def create_thumbs_tab(self):
+        """ create_thumbs_tab() -> QThumbnailConfiguration
+        
+        """
+        return QThumbnailConfiguration(self,
+                                       get_vistrails_persistent_configuration(),
+                                       get_vistrails_configuration())
+
+    def create_configuration_tab(self):
+        return QConfigurationWidget(self,
+                                    get_vistrails_persistent_configuration(),
+                                    get_vistrails_configuration(),
+                                    self._status_bar)
+
+    def create_packages_tab(self):
+        return QPackagesWidget(self, self._status_bar)
+
+    def sizeHint(self):
+        return QtCore.QSize(800, 600)
+
+    def tab_changed(self, index):
+        """ tab_changed(index: int) -> None
+        Keep general and advanced configurations in sync
+        
+        """
+        self._configuration_tab.configuration_changed(
+                                       get_vistrails_persistent_configuration(),
+                                       get_vistrails_configuration())
+        self._general_tab.update_state(
+                                       get_vistrails_persistent_configuration(),
+                                       get_vistrails_configuration())
+    
+    def configuration_changed(self, item, new_value):
+        """ configuration_changed(item: QTreeWidgetItem *, 
+        new_value: QString) -> None
+        Write the current session configuration to startup.xml.
+        Note:  This is already happening on close to capture configuration
+        items that are not set in preferences.  We are doing this here too, so
+        we guarantee the changes were saved before VisTrails crashes.
+        
+        """
+        from PyQt4 import QtCore
+        from vistrails.gui.application import get_vistrails_application
+        get_vistrails_application().save_configuration()
+
+
+#############################################################################
+
+import unittest
+
+class TestPreferencesDialog(unittest.TestCase):
+    def test_remove_package(self):
+        """ Tests if the package really gets deleted, and that it gets
+            selected again in the available packages list.
+        """
+        
+        pkg = "dialogs"
+        _app = get_vistrails_application()
+        builder = _app.builderWindow
+        builder.showPreferences()
+        prefs = builder.preferencesDialog
+        packages = prefs._packages_tab
+        prefs._tab_widget.setCurrentWidget(packages)
+
+        # check if package is loaded
+        av = packages._available_packages_list
+        for item in av.findItems(pkg, QtCore.Qt.MatchExactly):
+            av.setCurrentItem(item)
+            packages.enable_current_package()
+            QtCore.QCoreApplication.processEvents()
+
+        inst = packages._enabled_packages_list
+        for item in inst.findItems(pkg, QtCore.Qt.MatchExactly):
+            inst.setCurrentItem(item)
+            packages.disable_current_package()
+            QtCore.QCoreApplication.processEvents()
+
+        # force delayed calls
+        packages.populate_lists()
+        packages.select_package_after_update_slot(pkg)
+        QtCore.QCoreApplication.processEvents()
+
+        # This does not work because the selection is delayed
+        av = packages._available_packages_list
+        items = av.selectedItems()
+        self.assertEqual(len(items), 1, "No available items selected!")
+        self.assertEqual(items[0].text(), unicode(pkg),
+                         "Wrong available item selected: %s" % items[0].text())
+        # check if configuration has been written correctly
+        startup = _app.vistrailsStartup
+        doc = startup.startup_dom().documentElement
+        disabledpackages = enter_named_element(doc, 'disabledpackages')
+        dpackage = None
+        for package_node in named_elements(disabledpackages, 'package'):
+            if str(package_node.attributes['name'].value) == pkg:
+                dpackage = package_node
+        self.assertIsNotNone(dpackage, "Removed package '%s' is not in unloaded packages list!" % pkg)
+
+        epackages = enter_named_element(doc, 'packages')
+        apackage = None
+        for package_node in named_elements(epackages, 'package'):
+            if str(package_node.attributes['name'].value) == pkg:
+                apackage = package_node
+        self.assertIsNone(apackage, "Removed package '%s' is still in loaded packages list!" % pkg)
diff --git a/vistrails/gui/publishing.py b/vistrails/gui/publishing.py
new file mode 100644
index 0000000..0f6edb1
--- /dev/null
+++ b/vistrails/gui/publishing.py
@@ -0,0 +1,857 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+import os
+
+from vistrails.core.db.locator import FileLocator, DBLocator, UntitledLocator
+from vistrails.core.publishing.parse_latex import parse_latex_file, \
+     parse_vt_command, build_vt_command
+from vistrails.gui.common_widgets import QDockPushButton
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+class QLatexFigureItem(QtGui.QListWidgetItem):
+    def __init__(self, opt_dict, parent=None):
+        QtGui.QListWidgetItem.__init__(self, parent)
+        self.opt_dict = opt_dict
+
+    def update_opt_dict(self, opt_dict):
+        self.opt_dict = opt_dict
+
+    def get_opt_dict(self):
+        return self.opt_dict
+
+
+class QLatexAssistant(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        QtGui.QWidget.__init__(self, parent, f)
+        
+        self.set_title("Export To LaTeX")
+
+        # add button to select tex source
+        # listview to select figure 
+        # thumbnail display
+        # set figure specific options (show workflow, show execution, show
+        # set includegraphics options
+        source_label = QtGui.QLabel("LaTeX Source:")
+        self.source_edit = QtGui.QLineEdit()
+        source_selector = QDockPushButton("Select...")
+        # source_selector = QtGui.QToolButton()
+        # source_selector.setIcon(QtGui.QIcon(
+        #         self.style().standardPixmap(QtGui.QStyle.SP_DirOpenIcon)))
+        # source_selector.setIconSize(QtCore.QSize(12,12))
+        source_selector.setToolTip("Open a file chooser")
+        # source_selector.setAutoRaise(True)
+        self.connect(source_selector,
+                     QtCore.SIGNAL('clicked()'),
+                     self.selectSource)
+
+        source_group = QtGui.QGroupBox("LaTeX Source")
+        s_layout = QtGui.QHBoxLayout()
+        s_layout.addWidget(source_label)
+        s_layout.addWidget(self.source_edit)
+        s_layout.addWidget(source_selector)
+        s_layout.setStretch(1,1)
+        source_group.setLayout(s_layout)
+
+        self.figure_list = QtGui.QListWidget()
+        self.figure_list.setSelectionMode(self.figure_list.SingleSelection)
+        self.preview_image = QtGui.QLabel()
+        self.preview_image.setScaledContents(False)
+        self.preview_image.setMinimumSize(240, 240)
+        add_figure = QDockPushButton("Add Figure")
+        delete_figure = QDockPushButton("Delete Figure")
+        
+        self.connect(add_figure,
+                     QtCore.SIGNAL("clicked()"),
+                     self.addFigure)
+        self.connect(delete_figure,
+                     QtCore.SIGNAL("clicked()"),
+                     self.deleteFigure)
+        self.connect(self.figure_list,
+                     QtCore.SIGNAL("itemSelectionChanged()"),
+                     self.figureSelected)
+        
+        figure_group = QtGui.QGroupBox("Figures")
+        figure_layout = QtGui.QGridLayout()
+        figure_layout.addWidget(self.figure_list,0,0,1,2)
+        figure_layout.addWidget(self.preview_image,0,2)
+        figure_layout.addWidget(add_figure,1,0,QtCore.Qt.AlignRight)
+        figure_layout.addWidget(delete_figure,1,1,QtCore.Qt.AlignRight)
+        figure_group.setLayout(figure_layout)
+        
+        # figure type, vistrail reference (vt_locator), version (smart tag)
+        # use current version
+        self.figure_type = QtGui.QComboBox()
+        self.figure_type.setEditable(False)
+        # items = []
+        # items << "Workflow Results" << "Workflow Graph" << "History Tree Graph";
+        self.figure_type.addItems(["Workflow Results", "Workflow Graph",
+                                   "Version Tree"])
+        self.figure_ref = QtGui.QLineEdit()
+        version_label = QtGui.QLabel("Version:")
+        self.figure_version = QtGui.QLineEdit()
+        tag_label = QtGui.QLabel("Tag:")
+        self.figure_tag = QtGui.QComboBox()
+        self.figure_tag.setEditable(True)
+        self.figure_smart = QtGui.QCheckBox("Smart Tag")
+        current_button = QDockPushButton("Use Current")
+        
+        self.connect(current_button, QtCore.SIGNAL("clicked()"),
+                     self.useCurrent)
+
+        graphicx_label = QtGui.QLabel("Arguments for includegraphics:")
+        self.graphicx_edit = QtGui.QLineEdit()
+
+        self.def_group = QtGui.QGroupBox("Figure Definition")
+        def_layout = QtGui.QVBoxLayout()
+        def_h_layout = QtGui.QHBoxLayout()
+        def_h_layout.addWidget(self.figure_ref)
+        def_h_layout.addWidget(self.figure_type)
+        def_h_layout.setStretch(0,1)
+        def_layout.addLayout(def_h_layout)
+        def_h_layout = QtGui.QHBoxLayout()        
+        def_h_layout.addWidget(version_label)
+        def_h_layout.addWidget(self.figure_version)
+        def_h_layout.addWidget(tag_label)
+        def_h_layout.addWidget(self.figure_tag)
+        def_h_layout.addWidget(self.figure_smart)
+        def_h_layout.addWidget(current_button)
+        def_h_layout.setStretch(3,1)
+        def_layout.addLayout(def_h_layout)
+        def_h_layout = QtGui.QHBoxLayout()
+        def_h_layout.addWidget(graphicx_label)
+        def_h_layout.addWidget(self.graphicx_edit)
+        def_h_layout.setStretch(1,1)
+        def_layout.addLayout(def_h_layout)
+        self.def_group.setLayout(def_layout)
+
+        self.chbPdf = QtGui.QCheckBox("As PDF")
+        self.chbCache = QtGui.QCheckBox("Cache Images")
+        self.chbLatexVTL = QtGui.QCheckBox("Include .vtl")
+
+        self.chbWorkflow = QtGui.QCheckBox("Include Workflow")
+        self.chbFullTree = QtGui.QCheckBox("Include Full Tree")
+        self.chbFullTree.setEnabled(False)
+        self.chbExecute = QtGui.QCheckBox("Execute Workflow")
+        self.chbSpreadsheet = QtGui.QCheckBox("Show Spreadsheet Only")
+
+        self.gbEmbedOpt = QtGui.QGroupBox("Embed Options")
+        gblayout = QtGui.QGridLayout()
+        gblayout.addWidget(self.chbPdf, 0, 0)
+        gblayout.addWidget(self.chbCache, 0, 1)
+        gblayout.addWidget(self.chbLatexVTL, 1, 0)
+        self.gbEmbedOpt.setLayout(gblayout)
+
+        self.gbDownOpt = QtGui.QGroupBox("Download Options")
+        gblayout = QtGui.QGridLayout()
+        gblayout.addWidget(self.chbWorkflow, 0, 0)
+        gblayout.addWidget(self.chbFullTree, 0, 1)
+        gblayout.addWidget(self.chbExecute, 1, 0)
+        gblayout.addWidget(self.chbSpreadsheet, 1, 1)
+        self.gbDownOpt.setLayout(gblayout)
+
+        revert_button = QDockPushButton("Revert...")
+        save_button = QDockPushButton("Save...")
+        save_button.setAutoDefault(True)
+
+        self.connect(save_button, QtCore.SIGNAL("clicked()"),
+                     self.saveLatex)
+        
+        main_layout = QtGui.QVBoxLayout()
+        main_layout.addWidget(source_group)
+        main_layout.addWidget(figure_group)
+        main_layout.addWidget(self.def_group)
+        main_h_layout = QtGui.QHBoxLayout()
+        main_h_layout.addWidget(self.gbEmbedOpt)
+        main_h_layout.addWidget(self.gbDownOpt)
+        main_layout.addLayout(main_h_layout)
+        main_h_layout = QtGui.QHBoxLayout()
+        main_h_layout.setAlignment(QtCore.Qt.AlignRight)
+        main_h_layout.addWidget(revert_button)
+        main_h_layout.addWidget(save_button)
+        main_layout.addLayout(main_h_layout)
+        
+        self.setLayout(main_layout)
+
+        self.texts = None
+        self.selected_item = None
+
+    def selectSource(self):
+        fname = QtGui.QFileDialog.getOpenFileName(self,
+                                                  'Load LaTeX File...',
+                                                  self.source_edit.text(),
+                                                  'LaTeX files (*.tex)')
+        if fname:
+            self.source_edit.setText(fname)
+            self.texts = parse_latex_file(fname)
+            for cmd_tuple in self.texts[1]:
+                if cmd_tuple:
+                    opt_dict = parse_vt_command(*cmd_tuple)
+                    item = QLatexFigureItem(opt_dict)
+                    item.setText("Figure %d" % (self.figure_list.count() + 1))
+                    self.figure_list.addItem(item)
+
+    def readImage(self, opt_dict):
+        if 'pdf' in opt_dict:
+            out_type = 'pdf'
+        else:
+            out_type = 'png'
+        if 'showtree' in opt_dict:
+            version_str = ''
+        else:
+            version_str = '_%s' % opt_dict['version']
+        if 'showworkflow' in opt_dict:
+            graph_str = '_graph'
+        else:
+            graph_str = ''
+
+        if 'filename' in opt_dict:
+            figure_name = "%s%s_%s%s" % (opt_dict['filename'], version_str,
+                                         out_type, graph_str)
+        else:
+            figure_name = "%s_%s_%s_%s%s_%s%s" % (opt_dict['host'],
+                                                  opt_dict['db'],
+                                                  opt_dict['port'],
+                                                  opt_dict['vtid'],
+                                                  version_str,
+                                                  out_type,
+                                                  graph_str)
+        
+        source_dir = os.path.dirname(str(self.source_edit.text()))
+        path_to_figure = os.path.join(source_dir, 'vistrails_images',
+                                      figure_name)
+
+        #print 'LOOKING FOR %s' % path_to_figure
+        if os.path.exists(path_to_figure):
+            fnames = os.listdir(path_to_figure)
+            for fname in fnames:
+                #print "FOUND", fname
+                if fname.endswith('png'):
+                    pixmap = QtGui.QPixmap(os.path.join(path_to_figure, fname))
+                    if pixmap.width() > pixmap.height():
+                        pixmap = pixmap.scaledToWidth(240,
+                                                      QtCore.Qt.SmoothTransformation)
+                    else:
+                        pixmap = pixmap.scaledToHeight(240, 
+                                                       QtCore.Qt.SmoothTransformation)
+                    self.preview_image.setPixmap(pixmap)
+            
+
+    def doCheckLink(self, do_set=False, opt_dict=None):
+        check_links = {'pdf': self.chbPdf,
+                       'buildalways': (self.chbCache, True, True),
+                       'getvtl': self.chbLatexVTL,
+                       'execute': self.chbExecute,
+                       'showspreadsheetonly': self.chbSpreadsheet,
+                       'embedworkflow': self.chbWorkflow,
+                       'includefulltree': self.chbFullTree,
+                       'tag': self.figure_smart}
+
+        if opt_dict is None:
+            opt_dict = {}
+        for k, v in check_links.iteritems():
+            opt_set = k in opt_dict
+            if isinstance(v, tuple):
+                chb = v[0]
+                chb_default = v[1]
+                if len(v) > 2:
+                    chb_rev = v[2]
+                else:
+                    chb_rev = False
+            else:
+                chb = v
+                chb_rev = False
+                chb_default = False
+
+            if do_set:
+                if opt_set:
+                    chb.setChecked(not chb_rev)
+                else:
+                    chb.setChecked(chb_default)
+            else:
+                if not chb_rev and chb.isChecked():
+                    opt_dict[k] = None
+                elif chb_rev and not chb.isChecked():
+                    opt_dict[k] = None
+
+        return opt_dict
+
+    def setFigureInfo(self, opt_dict):
+        self.doCheckLink(True, opt_dict)
+
+        if 'showworkflow' in opt_dict:
+            self.figure_type.setCurrentIndex(1)
+        elif 'showtree' in opt_dict:
+            self.figure_type.setCurrentIndex(2)
+        else:
+            self.figure_type.setCurrentIndex(0)
+            
+        if 'version' in opt_dict:
+            self.figure_version.setText(str(opt_dict['version']))
+        else:
+            self.figure_version.setText("")
+        if 'tag' in opt_dict:
+            self.figure_tag.setEditText(str(opt_dict['tag'])[1:-1])
+        else:
+            self.figure_tag.setEditText("")
+        
+        if '_args' in opt_dict:
+            self.graphicx_edit.setText(opt_dict['_args'])
+
+        # build locator
+        if 'filename' in opt_dict:
+            # set using basedir of tex file
+            fname = opt_dict['filename']
+            if not os.path.isabs(fname):
+                source_dir = os.path.dirname(str(self.source_edit.text()))
+                #print 'source_dir:', str(self.source_edit.text()), source_dir
+                fname = os.path.join(source_dir, fname)
+            
+            locator = FileLocator(fname)
+        elif 'host' in opt_dict:
+            if 'port' not in opt_dict:
+                opt_dict['port'] = '3306'
+            port = int(opt_dict['port'])
+            locator = DBLocator(opt_dict['host'], port,
+                                opt_dict['db'], '', '', 
+                                obj_id=opt_dict['vtid'])
+        else:
+            locator = None
+        if locator is not None:
+            self.figure_ref.setText(locator.to_url())
+        else:
+            self.figure_ref.setText("")
+        self.figure_ref.locator = locator
+
+        self.readImage(opt_dict)
+
+    def getFigureInfo(self):
+        # return an opt_dict here...
+        opt_dict = self.doCheckLink(False)
+        if self.figure_type.currentIndex() == 1:
+            opt_dict['showworkflow'] = None
+        elif self.figure_type.currentIndex() == 2:
+            opt_dict['showtree'] = None
+
+        version_text = str(self.figure_version.text())
+        if version_text:
+            opt_dict['version'] = version_text
+        tag_text = str(self.figure_tag.currentText())
+        if self.figure_smart.isChecked() and tag_text:
+            opt_dict['tag'] = '{%s}' % tag_text
+
+        graphicx_text = str(self.graphicx_edit.text())
+        if graphicx_text:
+            opt_dict['_args'] = graphicx_text
+
+        locator = self.figure_ref.locator
+        if isinstance(locator, DBLocator):
+            opt_dict['host'] = locator.host
+            opt_dict['port'] = locator.port
+            opt_dict['db'] = locator.db
+            opt_dict['vtid'] = locator.obj_id
+        else:
+            fname = str(self.source_edit.text())
+            if os.path.dirname(fname) == os.path.dirname(locator.name):
+                # do relative
+                # FIXME do relative via a checkbox!
+                opt_dict['filename'] = os.path.basename(locator.name)
+            else:
+                opt_dict['filename'] = locator.name
+
+        return opt_dict
+
+    def figureSelected(self):
+        selected_items = self.figure_list.selectedItems()
+        if self.selected_item is not None:
+            self.selected_item.update_opt_dict(self.getFigureInfo())
+            #print "NEW OPTIONS:", self.selected_item.opt_dict
+        if len(selected_items) < 1:
+            self.gbEmbedOpt.setEnabled(False)
+            self.gbDownOpt.setEnabled(False)
+            self.def_group.setEnabled(False)
+            self.selected_item = None
+        else:
+            self.gbEmbedOpt.setEnabled(True)
+            self.gbDownOpt.setEnabled(True)
+            self.def_group.setEnabled(True)
+            item = selected_items[0]
+            #print "OPTIONS:", item.opt_dict
+            self.setFigureInfo(item.opt_dict)
+            self.selected_item = item
+
+    def addFigure(self):
+        item = QLatexFigureItem({})
+        item.setText("Figure %d" % (self.figure_list.count() + 1))
+        self.figure_list.addItem(item)
+
+    def deleteFigure(self):
+        selected_items = self.figure_list.selectedItems()
+        if len(selected_items) < 1:
+            return
+        idx = self.figure_list.row(selected_items[0])
+        self.figure_list.takeItem(idx)
+
+    def saveLatex(self):
+        fname = '/vistrails/src/git/extensions/latex/head2.tex'
+        f = open(fname, 'w')
+        raw_texts = self.texts[0]
+        figure_items = [self.figure_list.item(i) 
+                        for i in xrange(self.figure_list.count())]
+        for i in xrange(len(raw_texts)):
+            f.write(raw_texts[i])
+            if i < len(figure_items):
+                f.write(build_vt_command(figure_items[i].get_opt_dict()))
+        f.close()
+
+    def openVersion(self):
+        pass
+
+    def useCurrent(self):
+        pass
+
+class QVersionEmbed(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        QtGui.QWidget.__init__(self, parent, 
+                               f | QtCore.Qt.Tool | QtCore.Qt.WindowStaysOnTopHint)
+        self.setWindowTitle('Publish Workflow')
+        self.setFocusPolicy(QtCore.Qt.ClickFocus)
+        self.versionNumber = None
+        self.versionTag = ''
+        label1 = QtGui.QLabel("Embed:")
+        self.cbcontent = QtGui.QComboBox()
+        self.cbcontent.setEditable(False)
+        items = ["Workflow Results", "Workflow Graph", "History Tree Graph"];
+        self.cbcontent.addItems(items)
+        label2 = QtGui.QLabel("In:")
+        
+        self.cbtype = QtGui.QComboBox()
+        self.cbtype.setEditable(False)
+        items = ["Wiki", "Latex", "Shared Memory"];
+        self.cbtype.addItems(items)
+        
+        self.controller = None
+        self.pptag = 'Image(s) from (%s,%s,%s,%s,%s)'
+        
+        #options
+        self.gbEmbedOpt = QtGui.QGroupBox("Embed Options")
+        self.chbPdf = QtGui.QCheckBox("As PDF")
+        self.chbSmartTag = QtGui.QCheckBox("Smart Tag")
+        self.chbCache = QtGui.QCheckBox("Cache Images")
+        self.chbLatexVTL = QtGui.QCheckBox("Include .vtl")
+        self.chbLatexVTL.setEnabled(False)
+        
+        gblayout = QtGui.QGridLayout()
+        gblayout.addWidget(self.chbPdf, 0, 0)
+        gblayout.addWidget(self.chbSmartTag, 0, 1)
+        gblayout.addWidget(self.chbCache, 1, 0)
+        gblayout.addWidget(self.chbLatexVTL, 1, 1)
+        self.gbEmbedOpt.setLayout(gblayout)
+        
+        self.gbDownOpt = QtGui.QGroupBox("Download Options")
+        self.chbWorkflow = QtGui.QCheckBox("Include Workflow")
+        self.chbFullTree = QtGui.QCheckBox("Include Full Tree")
+        self.chbFullTree.setEnabled(False)
+        self.chbExecute = QtGui.QCheckBox("Execute Workflow")
+        self.chbSpreadsheet = QtGui.QCheckBox("Show Spreadsheet Only")
+        
+        gblayout = QtGui.QGridLayout()
+        gblayout.addWidget(self.chbWorkflow, 0, 0)
+        gblayout.addWidget(self.chbFullTree, 0, 1)
+        gblayout.addWidget(self.chbExecute, 1, 0)
+        gblayout.addWidget(self.chbSpreadsheet, 1, 1)
+        self.gbDownOpt.setLayout(gblayout)
+        
+        self.embededt = QtGui.QTextEdit(self)
+        self.embededt.setAcceptRichText(False)
+        self.embededt.setReadOnly(False)
+        # self.exportHtml = '<a href="export">Export...</a>'
+        # self.copyHtml = '<a href="copy">Copy to Clipboard</a>'
+        # self.copylabel = QtGui.QLabel(self.copyHtml)
+        # self.copylabel.setCursor(QtCore.Qt.PointingHandCursor)
+        self.copyButton = QtGui.QPushButton() # "Copy to Clipboard")
+        self.copyButton.setMinimumSize(50, 30)
+        self.link = "copy"
+        
+        self.helpLabel = QtGui.QLabel()
+        # "After making your selection, "
+        #                               "click on 'Copy To Clipboard'. "
+        #                               "The code changes based on your "
+        #                               "selection.")
+        self.helpLabel.setWordWrap(True)
+        
+        font = QtGui.QFont("Arial", 10, QtGui.QFont.Normal)
+        font.setItalic(True)
+        self.helpLabel.setFont(font)
+        
+        layout = QtGui.QGridLayout()
+        layout.addWidget(label1,0,0)
+        layout.addWidget(self.cbcontent,0,1)
+        layout.addWidget(label2,1,0)
+        layout.addWidget(self.cbtype,1,1)
+        layout.addWidget(self.gbEmbedOpt,2,0,1,2)
+        layout.addWidget(self.gbDownOpt,3,0,1,2)
+        layout.addWidget(self.embededt,4,0,1,-1)
+        layout.addWidget(self.helpLabel,5,0,1,2)
+        layout.addWidget(self.copyButton,6,1,QtCore.Qt.AlignRight)
+
+        self.setLayout(layout)
+        self.changeEmbedType("Wiki")
+        
+        #connect signals
+        self.connect(self.cbtype,
+                     QtCore.SIGNAL("activated(const QString &)"),
+                     self.changeEmbedType)
+        
+        # self.connect(self.copylabel,
+        #              QtCore.SIGNAL("linkActivated(const QString &)"),
+        #              self.linkActivated)
+
+        self.connect(self.copyButton,
+                     QtCore.SIGNAL("clicked()"),
+                     self.copyClicked)
+        
+        self.connect(self.cbcontent,
+                     QtCore.SIGNAL("activated(const QString &)"),
+                     self.changeOption)
+        
+        optlist = [self.cbcontent,
+                   self.chbPdf,
+                   self.chbSmartTag,
+                   self.chbCache,
+                   self.chbLatexVTL,
+                   self.chbWorkflow,
+                   self.chbFullTree,
+                   self.chbExecute,
+                   self.chbSpreadsheet]
+        for cb in optlist:
+            self.connect(cb, QtCore.SIGNAL("toggled(bool)"),
+                         self.changeOption)
+        #special cases
+        self.connect(self.chbWorkflow, QtCore.SIGNAL("toggled(bool)"),
+                     self.changeIncludeWorkflow)
+        self.connect(self.chbSpreadsheet, QtCore.SIGNAL("toggled(bool)"),
+                     self.changeShowSpreadsheet)
+        self.connect(self.chbExecute, QtCore.SIGNAL("toggled(bool)"),
+                     self.changeExecute)
+        self.connect(self.cbcontent,
+                     QtCore.SIGNAL("activated(const QString &)"),
+                     self.changeContent)
+        self.connect(self.chbSmartTag, QtCore.SIGNAL("toggled(bool)"),
+                     self.changeSmartTag)
+        self.connect(self.chbCache, QtCore.SIGNAL("toggled(bool)"),
+                     self.changeCache)
+        
+    def set_controller(self, controller):
+        self.controller = controller
+        
+    def closeEvent(self,e):
+        """ closeEvent(e: QCloseEvent) -> None
+        Doesn't allow the Legend widget to close, but just hide
+        instead
+        
+        """
+        e.ignore()
+        self.hide()
+    
+    def focusInEvent(self, event):
+        if self.controller:
+            if self.controller.locator and \
+               not isinstance(self.controller.locator, UntitledLocator):
+                from vistrails.gui.vistrails_window import _app
+                _app.ensureVistrail(self.controller.locator)
+                    
+                    
+    def checkLocator(self):
+        """checkLocator() -> bool
+        Only vistrails on a database are allowed to embed a tag"""
+        result = False
+        if self.controller:
+            if self.controller.locator and \
+               not isinstance(self.controller.locator, UntitledLocator):
+                title = "Embed Options for %s"%self.controller.locator.name
+                self.setWindowTitle(title)
+                result = True
+        return result
+
+    def checkControllerStatus(self):
+        """checkControllerStatus() -> bool
+        this checks if the controller has saved the latest changes """
+        result = False
+        if self.controller:
+            result = not self.controller.changed
+        return result
+    
+    def updateEmbedText(self):
+        ok = (self.checkLocator() and self.checkControllerStatus() and
+              self.versionNumber > 0)
+        self.embededt.setEnabled(ok)
+        self.copyButton.setEnabled(ok)
+        self.embededt.setText('')
+
+        if self.controller and self.versionNumber > 0:
+            if self.controller.locator and \
+               not isinstance(self.controller.locator, UntitledLocator) and \
+               not self.controller.changed:
+                loc = self.controller.locator
+                if hasattr(loc,'host'):
+                    self.updateCbtype('db')    
+                elif hasattr(loc, 'name'):
+                    self.updateCbtype('file')
+                        
+                if self.versionTag != "":
+                    self.chbSmartTag.setEnabled(True)
+                else:
+                    self.chbSmartTag.setChecked(False)
+                    self.chbSmartTag.setEnabled(False)
+                    
+                self.setEmbedText()
+            elif self.controller.changed:
+                self.embededt.setPlainText('You must save your vistrail to proceed')
+            else:
+                self.embededt.setPlainText('')
+                
+    def setEmbedText(self):
+        #check options
+        options = {}
+        options['content'] = str(self.cbcontent.currentText())
+        options['pdf'] = self.chbPdf.isChecked()
+        options['smartTag'] = self.chbSmartTag.isChecked()
+        options['buildalways'] = not self.chbCache.isChecked()
+        options['includeWorkflow'] = self.chbWorkflow.isChecked()
+        options['includeFullTree'] = self.chbFullTree.isChecked()
+        options['execute'] = self.chbExecute.isChecked()
+        options['showspreadsheetonly'] = self.chbSpreadsheet.isChecked()
+        
+        if str(self.cbtype.currentText()) == "Wiki":
+            text = self.buildWikiTag(options)
+        elif str(self.cbtype.currentText()) == "Latex":
+            options['getvtl'] = self.chbLatexVTL.isChecked()
+            text = self.buildLatexCommand(options)
+        elif str(self.cbtype.currentText()) == "Shared Memory":
+            text = self.pptag
+        self.embededt.setPlainText(text)
+            
+    def updateVersion(self, versionNumber):
+        self.versionNumber = versionNumber
+        if versionNumber > 0:
+            self.versionTag = self.controller.vistrail.getVersionName(self.versionNumber)
+        self.updateEmbedText()
+
+    def copyClicked(self):
+        if self.link == 'copy':
+            clipboard = QtGui.QApplication.clipboard()
+            clipboard.setText(self.embededt.toPlainText())
+        elif self.link=='export':
+            app = QtCore.QCoreApplication.instance()
+            app.builderWindow.interactiveExportCurrentPipeline()
+
+    # def linkActivated(self, link):
+    #     if link=='copy':
+    #         clipboard = QtGui.QApplication.clipboard()
+    #         clipboard.setText(self.embededt.toPlainText())
+    #     elif link=='export':
+    #         app = QtCore.QCoreApplication.instance()
+    #         app.builderWindow.interactiveExportCurrentPipeline()
+    
+    def switchType(self, text):
+        if text == 'Wiki':
+            index = 0
+        elif text == "Latex":
+            if self.cbtype.count() > 1:
+                index = 1
+            else:
+                index = 0
+        else:
+            index = 2
+        self.cbtype.setCurrentIndex(index)
+        self.changeEmbedType(text)
+        
+    def changeEmbedType(self, text):
+        """changeEmbedType(text) -> None
+        This is called when the combobox is activated so the proper gui elements
+        are enabled.
+        
+        """
+        if text!='Shared Memory':
+            # self.copylabel.setText(self.copyHtml)
+            self.link = 'copy'
+            self.copyButton.setText("Copy to Clipboard")
+            self.helpLabel.setText("After making your selections, "
+                                   "click on 'Copy To Clipboard'. "
+                                   "The code changes based on your "
+                                   "selections.")
+        else:
+            # self.copylabel.setText(self.exportHtml)
+            self.link = 'export'
+            self.copyButton.setText("Export...")
+            self.helpLabel.setText("After making your selections, "
+                                   "click 'Export...'. The code changes "
+                                   "based on your selections.")
+        self.chbLatexVTL.setEnabled(text == 'Latex')
+        self.chbPdf.setEnabled(text == 'Latex')
+        if self.controller is not None:
+            self.updateEmbedText()
+        
+    def changeOption(self, value):
+        self.updateEmbedText()
+        
+    def changeContent(self, text):
+        if text == "Workflow Results":
+            self.chbExecute.setEnabled(True)
+            self.chbSpreadsheet.setEnabled(True)
+            self.chbCache.setEnabled(True)
+            self.chbSmartTag.setEnabled(True)
+        else:
+            self.chbExecute.setChecked(False)
+            self.chbSpreadsheet.setChecked(False)
+            self.chbExecute.setEnabled(False)
+            self.chbSpreadsheet.setEnabled(False)
+            if text == "History Tree Graph":
+                self.chbCache.setChecked(False)
+                self.chbCache.setEnabled(False)
+                self.chbSmartTag.setChecked(False)
+                self.chbSmartTag.setEnabled(False)
+            else:
+                self.chbCache.setEnabled(True)
+                self.chbSmartTag.setEnabled(True)
+                
+    def updateCbtype(self, type):
+        currentText = self.cbtype.currentText()
+        self.cbtype.clear()
+        items = []
+        if type == 'db':
+            items = ["Wiki", "Latex", "Shared Memory"]
+        elif type == 'file':
+            items = ["Latex"]
+        self.cbtype.addItems(items)
+        try:
+            index = items.index(currentText)
+        except ValueError:
+            index = -1
+        if index > 0:
+            self.cbtype.setCurrentIndex(index)
+        text = str(self.cbtype.currentText())
+        self.chbLatexVTL.setVisible(text == 'Latex')
+        self.chbPdf.setEnabled(text == 'Latex')
+            
+    def buildLatexCommand(self, options):
+        text = '\\vistrail['
+        loc = self.controller.locator
+        if hasattr(loc, 'host'):
+            text += 'host=%s,\ndb=%s,\nport=%s,\nvtid=%s,\n'% (loc.host,
+                                                               loc.db,
+                                                               loc.port,
+                                                               loc.obj_id)
+        else:
+            text += 'filename=%s,\n' % os.path.basename(loc.name)
+        if options['content'] != "History Tree Graph":    
+            text += 'version=%s,\n'%self.versionNumber
+            if options['smartTag']:
+                text += 'tag={%s},\n'%self.versionTag
+        if options['pdf']:
+            text += 'pdf,\n'
+        if options['buildalways']:
+            text+= 'buildalways,\n'
+        if options['getvtl']:
+            text += 'getvtl,\n'
+        if options['includeWorkflow']:
+            text+= 'embedworkflow,\n'
+            if options['includeFullTree']:
+                text += 'includefulltree,\n'
+        if options['content'] == "Workflow Graph":
+            text += 'showworkflow,\n'
+        elif options['content'] == "History Tree Graph":
+            text += 'showtree,\n'
+        else:
+            if options['execute']:
+                text += 'execute,\n'
+            if options['showspreadsheetonly']:
+                text += 'showspreadsheetonly,\n'
+        
+        text = text[0:-2] + "]{}"
+        return text        
+
+    def buildWikiTag(self, options):
+        text = '<vistrail '
+        loc = self.controller.locator
+        
+        text += 'host="%s" db="%s" port="%s" vtid="%s" '% (loc.host,
+                                                            loc.db,
+                                                            loc.port,
+                                                            loc.obj_id)
+        if options['content'] != "History Tree Graph":
+            text += 'version="%s" '%self.versionNumber
+            if options['smartTag']:
+                text += 'tag="%s " '%self.versionTag
+        if options['buildalways']:
+            text+= 'buildalways="True" '
+        if options['includeWorkflow']:
+            text+= 'embedworkflow="True" '
+            if options['includeFullTree']:
+                text += 'includefulltree="True" '
+        if options['content'] == "Workflow Graph":
+            text += 'showworkflow="True" ' #"Workflow Results" << "Workflow Graph" << "History Tree Graph";
+        elif options['content'] == "History Tree Graph":
+            text += 'showtree="True" '
+        else:
+            if options['execute']:
+                text += 'execute="True" '
+            if options['showspreadsheetonly']:
+                text += 'showspreadsheetonly="True" '
+        
+        text += "/>"
+        return text        
+
+    def changeIncludeWorkflow(self,checked):
+        self.chbFullTree.setEnabled(checked)
+        if self.cbcontent.currentText() == "History Tree Graph":
+            self.chbFullTree.setChecked(checked)
+        
+    def changeShowSpreadsheet(self, checked):
+        if checked:
+            self.chbExecute.setChecked(True)
+            
+    def changeExecute(self, checked):
+        if not checked:
+            self.chbSpreadsheet.setChecked(False)
+            
+    def changeSmartTag(self, checked):
+        if checked and self.cbtype.currentText() == 'Latex':
+            self.chbCache.setChecked(False)
+            
+    def changeCache(self, checked):
+        if checked and self.cbtype.currentText() == 'Latex':
+            self.chbSmartTag.setChecked(False)
diff --git a/vistrails/gui/qt.py b/vistrails/gui/qt.py
new file mode 100644
index 0000000..3f8d217
--- /dev/null
+++ b/vistrails/gui/qt.py
@@ -0,0 +1,220 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""The only reason this module exists is to try to prevent QObjects
+from being created before a QApplication gets constructed. The problem
+with a QObject being constructed before a QApplication is that signals
+and slots do not get connected, leading to hard-to-spot bugs.
+
+Notice that there is no hard enforcement - if the client code does not
+ask for permission, nothing stops it from creating QObjects (which
+won't work correctly). Even worse, nothing stops a malicious object
+from setting okToCreateQObjects directly.
+
+As the python saying goes, 'we are all consenting adults here'."""
+
+import inspect
+from PyQt4 import QtGui, QtCore
+import types
+
+################################################################################
+
+class qt_super(object):
+
+    def __init__(self, class_, obj):
+        self._class = class_
+        self._obj = obj
+
+    def __getattr__(self, attr):
+        s = super(self._class, self._obj)
+        try:
+            return getattr(s, attr)
+        except AttributeError, e:
+            mro = type(self._obj).mro()
+            try:
+                ix = mro.index(self._class)
+            except ValueError:
+                raise TypeError("qt_super: obj must be an instance of class")
+            
+            for class_ in mro[ix+1:]:
+                try:
+                    unbound_meth = getattr(class_, attr)
+                    return types.MethodType(unbound_meth, self._obj, class_)
+                except AttributeError:
+                    pass
+            raise e
+
+################################################################################
+
+class DisallowedCaller(Exception):
+    """This expection is raised whenever a caller that's not privileged to
+allow QObject construction tries to do so."""
+    def __str__(self):
+        return "Caller is not allowed to call this function"
+
+class QApplicationNotYetCreated(Exception):
+    """This expection is raised whenever a function asks for permission to
+create a QObject but the QApplication has not granted it yet."""
+    def __str__(self):
+        return "QApplication has not been created yet"
+
+def allowQObjects():
+    """Allows subsequent QObject creation. The constructor for the
+QApplication-derived class must call this so that we know it's alright
+to start creating other QtCore.QObjects."""
+    
+    # tries to check if caller is allowed to call this
+    caller = inspect.currentframe().f_back
+    d = caller.f_locals
+    if (not d.has_key('self') or
+        not isinstance(d['self'], QtCore.QCoreApplication)):
+        raise DisallowedCaller
+    global okToCreateQObjects
+    okToCreateQObjects = True
+
+def askForQObjectCreation():
+    """This function simply throws an exception if it is not yet ok
+to create QObjects."""
+    global okToCreateQObjects
+    if not okToCreateQObjects:
+        raise QApplicationNotYetCreated()
+
+global _appHolder
+_appHolder = None
+
+def createBogusQtGuiApp(argv=["bogus"]):    
+    """createBogusQtGuiApp creates a bogus QtApplication so we can
+    create qobjects during test runs.
+    """    
+    class BogusApplication(QtGui.QApplication):
+        def __init__(self):
+            QtGui.QApplication.__init__(self, argv)
+            allowQObjects()
+    global _appHolder
+    if QtGui.qApp:
+        _appHolder = QtGui.qApp
+    if not _appHolder:
+        _appHolder = BogusApplication()
+    return _appHolder
+
+def destroyBogusQtApp():
+    global _appHolder
+    del _appHolder
+
+def qt_version():
+    return [int(i)
+            for i in
+            QtCore.qVersion().split('.')]
+
+################################################################################
+
+okToCreateQObjects = False
+
+class SignalSet(object):
+    
+    """SignalSet stores a list of (object, signal, method) that can be
+    all connected and disconnected simultaneously. This way, it's
+    harder to forget to disconnect one of many signals. Also, if the
+    SignalSet has already been plugged, it will signal an exception,
+    to avoid multiple connections."""
+    
+    def __init__(self, owner, signalTripleList):
+        self.owner = owner
+        self.signalTripleList = signalTripleList
+        self.plugged = False
+
+    def plug(self):
+        if self.plugged:
+            raise ValueError("SignalSet %s is already plugged" % self)
+        for tupl in self.signalTripleList:
+            self.owner.connect(*tupl)
+        self.plugged = True
+
+    def unplug(self):
+        if not self.plugged:
+            return
+        for tupl in self.signalTripleList:
+            self.owner.disconnect(*tupl)
+        self.plugged = False
+
+        
+################################################################################
+
+_oldConnect = QtCore.QObject.connect
+_oldDisconnect = QtCore.QObject.disconnect
+_oldEmit = QtCore.QObject.emit
+
+def _wrapConnect(callableObject):
+    """Returns a wrapped call to the old version of QtCore.QObject.connect"""
+    @staticmethod
+    def call(*args):
+        callableObject(*args)
+        _oldConnect(*args)
+    return call
+
+def _wrapDisconnect(callableObject):
+    """Returns a wrapped call to the old version of QtCore.QObject.disconnect"""
+    @staticmethod
+    def call(*args):
+        callableObject(*args)
+        _oldDisconnect(*args)
+    return call
+
+def enableSignalDebugging(**kwargs):
+    """Call this to enable Qt Signal debugging. This will trap all
+    connect, disconnect and emit calls. For example:
+
+    enableSignalDebugging(connectCall=callable1, disconnectCall=callable2,
+                          emitCall=callable3)
+
+    will call callable1, 2 and 3 when the respective Qt methods are issued.
+    """
+
+    f = lambda *args: None
+    connectCall = kwargs.get('connectCall', f)
+    disconnectCall = kwargs.get('disconnectCall', f)
+    emitCall = kwargs.get('emitCall', f)
+
+    def printIt(msg):
+        def call(*args):
+            print msg, args
+        return call
+    QtCore.QObject.connect = _wrapConnect(connectCall)
+    QtCore.QObject.disconnect = _wrapDisconnect(disconnectCall)
+
+    def new_emit(self, *args):
+        emitCall(self, *args)
+        _oldEmit(self, *args)
+
+    QtCore.QObject.emit = new_emit
diff --git a/vistrails/gui/query_view.py b/vistrails/gui/query_view.py
new file mode 100644
index 0000000..0b09ef3
--- /dev/null
+++ b/vistrails/gui/query_view.py
@@ -0,0 +1,595 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core.collection import Collection
+from vistrails.core.collection.vistrail import VistrailEntity
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core.query.combined import CombinedSearch
+from vistrails.core.query.multiple import MultipleSearch
+from vistrails.core.query.version import SearchCompiler, SearchParseError, TrueSearch
+from vistrails.core.query.visual import VisualQuery
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.vistrail import Vistrail
+
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.common_widgets import QSearchBox
+from vistrails.gui.modules import get_query_widget_class
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.gui.ports_pane import ParameterEntry
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.version_view import QVersionTreeView
+from vistrails.gui.vistrail_controller import VistrailController
+
+class QueryController(object):
+    LEVEL_ALL = 0
+    LEVEL_VISTRAIL = 1
+    LEVEL_WORKFLOW = 2
+
+    def __init__(self, query_view=None):
+        self.query_view = query_view
+        self.search = None
+        self.search_str = None
+        self.search_pipeline = None
+        self.search_level = 3
+        self.vt_controller = None
+        self.level = QueryController.LEVEL_VISTRAIL
+        self.workflow_version = None
+
+    def set_level(self, level):
+        self.query_view.query_box.setLevel(level)
+        self.level_changed(level)
+
+    def level_changed(self, level):
+        self.query_view.set_result_level(level)
+        if level >= QueryController.LEVEL_VISTRAIL and \
+                self.query_view.query_box.backButton.isEnabled():
+            self.query_view.query_box.editButton.setEnabled(True)
+        else:
+            self.query_view.query_box.editButton.setEnabled(False)
+        self.level = level
+
+    def set_query_view(self, query_view=None):
+        self.query_view = query_view
+    
+    def set_vistrail_controller(self, vt_controller):
+        self.vt_controller = vt_controller
+
+    def set_search(self, search=None):
+        self.search = search
+        self.query_view.version_result_view.controller.search = search
+        self.query_view.workflow_result_view.controller.search = search
+        
+    def run_search(self, search_str=None):
+        """ set_search(search_str: str) -> None
+        Change the currrent version tree search statement
+        
+        """
+        search_pipeline = \
+            self.query_view.pipeline_view.scene().current_pipeline
+        if search_str is None:
+            search_str = self.query_view.query_box.getCurrentText()
+        self.query_view.update_controller()
+        if self.search is None or \
+                self.search.search_str != search_str or \
+                self.search.queryPipeline != search_pipeline or \
+                self.query_view.p_controller.changed or \
+                self.search_level > self.level:
+            self.search_str = search_str
+            self.search_pipeline = search_pipeline
+            self.search_level = self.level
+            # reset changed here
+            self.query_view.p_controller.set_changed(False)
+            vt_controller = self.query_view.vt_controller
+            current_vistrail = self.vt_controller.vistrail
+
+            def do_search(only_current_vistrail=False, 
+                          only_current_workflow=False):
+                entities_to_check = {}
+                open_col = Collection.getInstance()
+                
+                for entity in open_col.get_current_entities():
+                    if entity.type_id == VistrailEntity.type_id and \
+                            entity.is_open:
+                        controller = entity._window.controller
+                        if only_current_vistrail and \
+                                controller.vistrail != vt_controller.vistrail:
+                            continue
+                        if only_current_workflow:
+                            versions_to_check = controller.current_version
+                        else:
+                            graph = controller._current_terse_graph
+                            versions_to_check = set(graph.vertices.iterkeys())
+                        entities_to_check[entity] = versions_to_check
+                self.set_search(MultipleSearch(search_str, search_pipeline,
+                                               entities_to_check))
+                self.search.run()
+                return self.search.getResultEntities()
+                
+            if self.level == QueryController.LEVEL_VISTRAIL:
+                result_entities = do_search(True)                
+                self.show_vistrail_matches()
+            elif self.level == QueryController.LEVEL_WORKFLOW:
+                self.search_level = QueryController.LEVEL_VISTRAIL
+                result_entities = do_search(True)
+                self.update_version_tree()
+                self.show_workflow_matches()
+            elif self.level == QueryController.LEVEL_ALL:
+                result_entities = do_search()
+                self.show_global_matches()
+
+            from vistrails.gui.vistrails_window import _app
+            _app.notify("search_changed", self.search, result_entities)
+        else:
+            self.query_view.set_to_result_mode()
+            
+    def set_refine(self, refine):
+        """ set_refine(refine: bool) -> None
+        Set the refine state to True or False
+        
+        """
+        self.query_view.version_result_view.controller.set_refine(refine)
+
+    def reset_search(self):
+        self.search = None
+        self.search_pipeline = None
+        self.query_view.pipeline_view.controller.change_selected_version(0)
+        self.query_view.pipeline_view.scene().setupScene(
+            self.query_view.pipeline_view.controller.current_pipeline)
+        self.query_view.set_to_search_mode()
+        self.query_view.query_box.searchBox.clearSearch()
+        self.query_view.vistrailChanged()
+
+        from vistrails.gui.vistrails_window import _app
+        _app.notify("search_changed", None, None)
+
+    def back_to_search(self):
+        self.query_view.set_to_search_mode()
+
+    def goto_edit(self):
+        # get the version info and send it to open_vistrail call
+        if self.level == QueryController.LEVEL_VISTRAIL:
+            from vistrails.gui.vistrails_window import _app
+            _app.qactions['history'].trigger()
+        elif self.level == QueryController.LEVEL_WORKFLOW:
+            from vistrails.gui.vistrails_window import _app
+            version = self.query_view.vt_controller.current_version
+            self.query_view.controller.change_selected_version(version, True)
+            _app.qactions['pipeline'].trigger()
+
+    def update_results(self):
+        if self.workflow_version != \
+                self.query_view.vt_controller.current_version:
+            result_view = self.query_view.workflow_result_view
+            result_view.scene().setupScene(
+                result_view.controller.current_pipeline)
+            result_view.scene().fitToView(result_view, True)
+            self.workflow_version = \
+                self.query_view.vt_controller.current_version
+
+    def update_version_tree(self):
+        result_view = self.query_view.version_result_view
+        if result_view.controller.refine:
+            result_view.controller.recompute_terse_graph()
+        result_view.controller.invalidate_version_tree()
+
+    def show_vistrail_matches(self, *args, **kwargs):
+        if self.level != QueryController.LEVEL_VISTRAIL:
+            self.set_level(QueryController.LEVEL_VISTRAIL)
+        self.query_view.set_to_result_mode()
+        result_view = self.query_view.version_result_view
+        if result_view.controller.refine:
+            result_view.controller.recompute_terse_graph()
+        result_view.controller.invalidate_version_tree(*args, **kwargs)        
+
+    def show_workflow_matches(self):
+        if self.level != QueryController.LEVEL_WORKFLOW:
+            self.set_level(QueryController.LEVEL_WORKFLOW)
+        self.query_view.set_to_result_mode()
+        result_view = self.query_view.workflow_result_view
+        result_view.scene().setupScene(result_view.controller.current_pipeline)
+        result_view.scene().fitToView(result_view, True)
+
+    def show_global_matches(self):
+        if self.level != QueryController.LEVEL_ALL:
+            self.set_level(QueryController.LEVEL_ALL)
+        self.query_view.set_to_result_mode()        
+
+    # def invalidate_version_tree(self, *args, **kwargs):
+    #     self.query_view.set_to_result_mode()
+    #     result_view = self.query_view.version_result_view
+    #     result_view.controller.search = self.search
+    #     result_view.controller.search_str = self.search_str
+    #     result_view.controller.invalidate_version_tree(*args, **kwargs)
+
+    # def recompute_terse_graph(self, *args, **kwargs):
+    #     self.query_view.set_to_result_mode()
+    #     result_view = self.query_view.version_result_view
+    #     result_view.controller.search = self.search
+    #     result_view.controller.search_str = self.search_str
+    #     result_view.controller.recompute_terse_graph(*args, **kwargs)
+
+
+class QQueryPipelineView(QPipelineView):
+    def __init__(self, parent=None):
+        QPipelineView.__init__(self, parent)
+        self.setBackgroundBrush(CurrentTheme.QUERY_BACKGROUND_BRUSH)
+        self.scene().current_pipeline = Pipeline()
+        self.query_controller = None
+      
+    def set_query_controller(self, controller):
+        self.query_controller = controller
+  
+    def execute(self):
+        self.query_controller.run_search(None)
+    
+class QQueryResultGlobalView(QtGui.QWidget):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        layout = QtGui.QVBoxLayout()
+        label = QtGui.QLabel("See Workspace Window")
+        label.setAlignment(QtCore.Qt.AlignCenter)
+        layout.addWidget(label, QtCore.Qt.AlignCenter)
+        self.setLayout(layout)
+        # self.setBackgroundBrush(CurrentTheme.QUERY_RESULT_BACKGROUND_BRUSH)
+
+class QQueryResultVersionView(QVersionTreeView):
+    def __init__(self, parent=None):
+        QVersionTreeView.__init__(self, parent)
+        self.setBackgroundBrush(CurrentTheme.QUERY_RESULT_BACKGROUND_BRUSH)
+
+class QQueryResultWorkflowView(QPipelineView):
+    def __init__(self, parent=None):
+        QPipelineView.__init__(self, parent)
+        self.setBackgroundBrush(CurrentTheme.QUERY_RESULT_BACKGROUND_BRUSH)
+        self.scene().set_read_only_mode(True)
+    
+class QQueryBox(QtGui.QWidget):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.build_widget()
+        self.controller = None
+
+    def set_controller(self, controller=None):
+        self.controller = controller
+
+    def build_widget(self):
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(4)
+        layout.setSpacing(2)
+        self.searchBox = QSearchBox(True, False, self)
+        layout.addWidget(self.searchBox)
+        radio_layout = QtGui.QHBoxLayout()
+        radio_layout.setSpacing(5)
+        radio_layout.setAlignment(QtCore.Qt.AlignLeft)
+        radio_layout.addWidget(QtGui.QLabel("Search:"))
+        searchAll = QtGui.QRadioButton("Open Vistrails")
+        searchCurrent = QtGui.QRadioButton("Current Vistrail")
+        searchWorkflow = QtGui.QRadioButton("Current Workflow")
+        self.level_group = QtGui.QButtonGroup()
+        self.level_group.addButton(searchAll)
+        self.level_group.addButton(searchCurrent)
+        self.level_group.addButton(searchWorkflow)
+        self.level_map = \
+            Bidict([(QueryController.LEVEL_ALL, searchAll),
+                    (QueryController.LEVEL_VISTRAIL, searchCurrent),
+                    (QueryController.LEVEL_WORKFLOW, searchWorkflow)])
+        radio_layout.addWidget(searchAll)
+        radio_layout.addWidget(searchCurrent)
+        radio_layout.addWidget(searchWorkflow)
+        searchCurrent.setChecked(True)
+        
+        self.editButton = QtGui.QPushButton("Edit")
+        self.editButton.setEnabled(False)
+        self.backButton = QtGui.QPushButton("Back to Search")
+        self.backButton.setEnabled(False)
+        radio_layout.addStretch(1)
+        radio_layout.addWidget(self.editButton, 0, QtCore.Qt.AlignRight)
+        radio_layout.addWidget(self.backButton, 0, QtCore.Qt.AlignRight)
+        layout.addLayout(radio_layout)
+        self.setLayout(layout)
+
+        self.connect(self.searchBox, QtCore.SIGNAL('resetSearch()'),
+                     self.resetSearch)
+        self.connect(self.searchBox, QtCore.SIGNAL('executeSearch(QString)'),
+                     self.executeSearch)
+        self.connect(self.searchBox, QtCore.SIGNAL('refineMode(bool)'),
+                     self.refineMode)
+        self.connect(self.backButton, QtCore.SIGNAL('clicked()'),
+                     self.backToSearch)
+        self.connect(self.editButton, QtCore.SIGNAL('clicked()'),
+                     self.doEdit)
+        self.connect(self.level_group, 
+                     QtCore.SIGNAL('buttonClicked(QAbstractButton*)'),
+                     self.levelChanged)
+
+    def resetSearch(self, emit_signal=True):
+        """
+        resetSearch() -> None
+
+        """
+        if self.controller and emit_signal:
+            self.controller.reset_search()
+            self.emit(QtCore.SIGNAL('textQueryChange(bool)'), False)
+        else:
+            self.searchBox.clearSearch()
+
+    def backToSearch(self):
+        if self.controller:
+            self.controller.back_to_search()
+
+    def doEdit(self):
+        if self.controller:
+            self.controller.goto_edit()
+
+    def levelChanged(self, button):
+        self.controller.set_level(self.level_map.inverse[button])
+
+    def setLevel(self, level):
+        self.level_map[level].setChecked(True)
+
+    def executeSearch(self, text):
+        """
+        executeSearch(text: QString) -> None
+
+        """
+        s = str(text)
+        if self.controller:
+            self.controller.run_search(s)
+            # try:
+            #     search = CombinedSearch(s, 
+            #     search = SearchCompiler(s).searchStmt
+            # except SearchParseError, e:
+            #     debug.warning("Search Parse Error", str(e))
+            #     search = None
+            # self.controller.set_search(search, s)
+            # self.emit(QtCore.SIGNAL('textQueryChange(bool)'), s!='')
+
+    def refineMode(self, on):
+        """
+        refineMode(on: bool) -> None
+        
+        """
+        if self.controller:
+            self.controller.set_refine(on)
+
+    def getCurrentText(self):
+        return self.searchBox.getCurrentText()
+
+    def setManualResetEnabled(self, boolVal):
+        self.searchBox.setManualResetEnabled(boolVal)
+
+class QQueryView(QtGui.QWidget, BaseView):
+    VISUAL_SEARCH_VIEW = 0
+    GLOBAL_RESULT_VIEW = 1
+    VERSION_RESULT_VIEW = 2
+    WORKFLOW_RESULT_VIEW = 3
+
+    RESULT_LEVEL_MAP = \
+        Bidict([(QueryController.LEVEL_ALL, GLOBAL_RESULT_VIEW),
+                (QueryController.LEVEL_VISTRAIL, VERSION_RESULT_VIEW),
+                (QueryController.LEVEL_WORKFLOW, WORKFLOW_RESULT_VIEW)])
+
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        BaseView.__init__(self)
+        self.build_widget()
+        self.set_title("Search")
+
+    def set_controller(self, controller=None):
+        if self.controller:
+            self.disconnect(self.controller,
+                     QtCore.SIGNAL('stateChanged'),
+                     self.update_controller)
+        self.controller = controller
+        if controller:
+            self.connect(self.controller,
+                         QtCore.SIGNAL('stateChanged'),
+                         self.update_controller)
+        self.vt_controller.vistrail_view = self.version_result_view
+        self.vt_controller.current_pipeline_view = \
+            self.workflow_result_view
+        # self.vt_controller.vistrail_view.set_controller(self.vt_controller)
+        # FIXME Need to figure out how to deal with this !!!
+        self.vt_controller.set_vistrail(controller.vistrail, None,
+                                        set_log_on_vt=False)
+        self.vt_controller.change_selected_version(controller.current_version)
+        self.version_result_view.set_controller(self.vt_controller)
+        self.workflow_result_view.set_controller(self.vt_controller)
+        self.query_controller.set_vistrail_controller(controller)
+
+    def update_controller(self):
+        # FIXME Need to figure out how to deal with this !!!
+        self.vt_controller.set_vistrail(self.controller.vistrail, None,
+                                        set_log_on_vt=False)
+        self.vt_controller.change_selected_version(
+            self.controller.current_version)
+
+    def build_widget(self):
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+
+        self.query_controller = QueryController(self)
+        self.vt_controller = VistrailController(auto_save=False)
+        self.p_controller = VistrailController(Vistrail(), auto_save=False)
+        
+        self.connect(self.p_controller,
+                     QtCore.SIGNAL('vistrailChanged()'),
+                     self.vistrailChanged)
+
+        self.query_box = QQueryBox()
+        self.query_box.set_controller(self.query_controller)
+        layout.addWidget(self.query_box)
+
+        self.stacked_widget = QtGui.QStackedWidget()
+        self.pipeline_view = QQueryPipelineView()
+        self.p_controller.current_pipeline_view = self.pipeline_view
+        self.pipeline_view.set_controller(self.p_controller)
+        self.pipeline_view.set_query_controller(self.query_controller)
+        QQueryView.VISUAL_SEARCH_VIEW = \
+            self.stacked_widget.addWidget(self.pipeline_view)
+        self.global_result_view = QQueryResultGlobalView()
+        QQueryView.GLOBAL_RESULT_VIEW = \
+            self.stacked_widget.addWidget(self.global_result_view)
+        self.version_result_view = QQueryResultVersionView()
+        self.connect(self.version_result_view.scene(), 
+                     QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+                     self.result_version_selected)
+        # self.version_result_view.set_controller(self.vt_controller)
+        QQueryView.VERSION_RESULT_VIEW = \
+            self.stacked_widget.addWidget(self.version_result_view)
+        self.workflow_result_view = QQueryResultWorkflowView()
+        # self.workflow_result_view.set_controller(self.vt_controller)
+        QQueryView.WORKFLOW_RESULT_VIEW = \
+            self.stacked_widget.addWidget(self.workflow_result_view)
+        self.stacked_widget.setCurrentWidget(self.pipeline_view)
+        layout.addWidget(self.stacked_widget)
+
+        self.setLayout(layout)
+        self.current_display = QQueryView.VISUAL_SEARCH_VIEW
+        self.current_result_view = QQueryView.VERSION_RESULT_VIEW
+
+    def set_default_layout(self):
+        from vistrails.gui.module_palette import QModulePalette
+        from vistrails.gui.module_info import QModuleInfo
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QModulePalette,
+             QtCore.Qt.RightDockWidgetArea: QModuleInfo,
+             })
+            
+    def set_action_links(self):
+        self.action_links = \
+            { 'execute': ('query_pipeline_changed', self.set_execute_action) }
+
+        # also add other notification here...
+        from vistrails.gui.vistrails_window import _app
+        _app.register_notification('query_pipeline_changed', 
+                                   self.set_reset_button)
+
+    def set_reset_button(self, pipeline):
+        self.query_box.setManualResetEnabled(self.pipeline_non_empty(pipeline))
+
+    def set_result_level(self, level):
+        view_idx = QQueryView.RESULT_LEVEL_MAP[level]
+        if self.current_display != QQueryView.VISUAL_SEARCH_VIEW:
+            self.set_display_view(view_idx)
+        self.current_result_view = view_idx
+        self.query_controller.update_results()
+            
+    def set_to_search_mode(self):
+        self.set_display_view(QQueryView.VISUAL_SEARCH_VIEW)
+        self.query_box.backButton.setEnabled(False)
+        self.query_box.editButton.setEnabled(False)
+        self.set_reset_button(self.p_controller.current_pipeline)
+
+        from vistrails.gui.vistrails_window import _app
+        _app.notify('query_pipeline_changed', 
+                    self.p_controller.current_pipeline)
+
+    def set_to_result_mode(self):
+        self.set_display_view(self.current_result_view)
+        self.query_box.backButton.setEnabled(True)
+        if self.query_controller.level >= QueryController.LEVEL_VISTRAIL:
+            self.query_box.editButton.setEnabled(True)
+        self.query_box.setManualResetEnabled(True)
+
+        from vistrails.gui.vistrails_window import _app
+        _app.notify('query_pipeline_changed', 
+                    self.p_controller.current_pipeline)
+
+    def set_display_view(self, view_type):
+        self.current_display = view_type
+        self.stacked_widget.setCurrentIndex(view_type)
+
+    def get_current_view(self):
+        return self.stacked_widget.currentWidget()
+    
+    def set_action_defaults(self):
+        self.action_defaults = \
+            {
+             'execute': [('setEnabled', True, self.set_execute_action),
+                          ('setIcon', False, CurrentTheme.VISUAL_QUERY_ICON),
+                          ('setToolTip', False, 'Execute a visual query')],
+             'publishWeb': [('setEnabled', False, False)],
+             'publishPaper': [('setEnabled', False, False)],
+            }
+    
+    def set_execute_action(self, pipeline=None):
+        if not self.vt_controller:
+            return False
+        if pipeline is None:
+            pipeline = self.p_controller.current_pipeline            
+        if self.current_display == QQueryView.VISUAL_SEARCH_VIEW:
+            return self.pipeline_non_empty(pipeline)
+        return False
+
+    def pipeline_non_empty(self, pipeline):
+        return pipeline is not None and len(pipeline.modules) > 0
+    
+    def vistrailChanged(self):
+        from vistrails.gui.vistrails_window import _app
+        self.p_controller.current_pipeline.ensure_connection_specs()
+        _app.notify('query_pipeline_changed', self.p_controller.current_pipeline)
+
+    def query_changed(self, query=None):
+        if query is None:
+            self.query_controller.reset_search()
+        # FIXME add support for changing the query to something specific
+
+    # DAK: removed this call as the query view maintains its own
+    # "current version"
+    # def version_changed(self, version_id):
+    #     self.vt_controller.change_selected_version(version_id)
+    #     self.version_result_view.select_current_version()
+    #     self.query_controller.update_results()
+        
+    def result_version_selected(self, version_id, by_click, do_validate=True,
+                                from_root=False, double_click=False):
+        if by_click:
+            self.query_controller.search.setCurrentVistrail(
+                self.vt_controller.vistrail)
+            self.vt_controller.change_selected_version(version_id, by_click, 
+                                                       do_validate, from_root)
+            if double_click:
+                self.query_controller.set_level(QueryController.LEVEL_WORKFLOW)
+                self.query_controller.show_workflow_matches()
+
+class QueryEntry(ParameterEntry):
+    def __init__(self, port_spec, function=None, parent=None):
+        ParameterEntry.__init__(self, port_spec, function, parent)
+
+    def get_widget(self):
+        return self.build_widget(get_query_widget_class, False)
diff --git a/vistrails/gui/repository.py b/vistrails/gui/repository.py
new file mode 100644
index 0000000..a7f1419
--- /dev/null
+++ b/vistrails/gui/repository.py
@@ -0,0 +1,766 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+Dialog for web repository options
+Includes login and upload tabs
+"""
+from PyQt4 import QtGui, QtCore
+from vistrails.core.configuration import get_vistrails_configuration, get_vistrails_persistent_configuration
+from vistrails.core.repository.poster.encode import multipart_encode
+from vistrails.core.repository.poster.streaminghttp import register_openers
+from vistrails.core.vistrail.controller import VistrailController
+from vistrails.core.db.locator import ZIPFileLocator, FileLocator
+from vistrails.core.db.io import load_vistrail
+from vistrails.core import debug
+import urllib, urllib2, cookielib
+import os
+import tempfile
+import vistrails.api
+import json
+
+##############################################################################
+
+class QRepositoryPushWidget(QtGui.QWidget):
+    """ Tab that shows main repository options
+        Allows users to login and push VisTrails to the Repository """
+
+    def __init__(self, parent, status_bar, dialog):
+        QtGui.QWidget.__init__(self, parent)
+        self._status_bar = status_bar
+        self.dialog = dialog
+
+        base_layout = QtGui.QVBoxLayout(self)
+
+        top = QtGui.QFrame(self)
+        bottom = QtGui.QFrame(self)
+
+        base_layout.addWidget(top)
+        base_layout.addWidget(bottom, 1)
+
+        # TODO: this '/' check should probably be done in core/configuration.py
+        self.config = get_vistrails_configuration()
+        if self.config.webRepositoryURL[-1] == '/':
+            self.config.webRepositoryURL = self.config.webRepositoryURL[:-1]
+
+        # check if the web repository url has changed while logged in
+        if self.dialog.cookie_url and \
+           self.dialog.cookie_url != self.config.webRepositoryURL:
+            self.dialog.cookiejar = None
+
+
+
+        ######################################################################
+        # Detail Table
+        bottom_layout = QtGui.QVBoxLayout(bottom)
+        bottom_layout.setMargin(2)
+        bottom_layout.setSpacing(2)
+
+        # Show what workflows are unrunnble on the repository
+        # and for what reasons
+        self._unrunnable_table = QtGui.QTableWidget(0, 2, top)
+        self._unrunnable_table.horizontalHeader().setStretchLastSection(True)
+
+        bottom_layout.addWidget(self._unrunnable_table)
+
+        self._repository_status = {}
+
+        ######################################################################
+        # Push info
+        top_layout = QtGui.QVBoxLayout(top)
+
+        self._vistrail_status_label = QtGui.QLabel("")
+        self._vistrail_status_label.setWordWrap(True)
+        top_layout.addWidget(self._vistrail_status_label)
+
+        self.serverCombo = QtGui.QComboBox()
+        self.connect(self.serverCombo,
+                     QtCore.SIGNAL("currentIndexChanged(int)"),
+                     self.check_dependencies)
+        top_layout.addWidget(self.serverCombo)
+
+        """
+        self._default_perm_label = QtGui.QLabel("Default Global Permissions:")
+        top_layout.addWidget(self._default_perm_label)
+        self.perm_view = QtGui.QCheckBox("view")
+        self.perm_download = QtGui.QCheckBox("download")
+        self.perm_edit = QtGui.QCheckBox("edit")
+        top_layout.addWidget(self.perm_view)
+        top_layout.addWidget(self.perm_download)
+        top_layout.addWidget(self.perm_edit)
+        self.perm_view.setEnabled(True)
+        """
+
+        self.permission_gb = QtGui.QGroupBox(self)
+        self.permission_gb.setTitle("Default Global Permissions")
+        glayout = QtGui.QHBoxLayout()
+        self.perm_view = QtGui.QCheckBox("view")
+        self.perm_download = QtGui.QCheckBox("download")
+        self.perm_edit = QtGui.QCheckBox("edit")
+        glayout.addWidget(self.perm_view)
+        glayout.addWidget(self.perm_download)
+        glayout.addWidget(self.perm_edit)
+        self.perm_view.setChecked(True)
+        self.perm_download.setChecked(True)
+        self.permission_gb.setLayout(glayout)
+        top_layout.addWidget(self.permission_gb)
+
+        self._details_label = QtGui.QLabel("")
+        self._details_label.setWordWrap(True)
+        top_layout.addWidget(self._details_label)
+
+        for lbl in [self._details_label, self._vistrail_status_label]:
+            lbl.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
+            lbl.setWordWrap(True)
+
+        self._push_button = QtGui.QPushButton("&Push")
+        self._push_button.setEnabled(False)
+        self.connect(self._push_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.push_vistrail_to_repository)
+        self._branch_button = QtGui.QPushButton("&Branch")
+        self._branch_button.hide()
+        self.connect(self._branch_button,
+                     QtCore.SIGNAL("clicked()"),
+                     (lambda branching=True : self.push_vistrail_to_repository(branching)))
+        button_box = QtGui.QDialogButtonBox()
+        button_box.addButton(self._push_button,
+                             QtGui.QDialogButtonBox.ActionRole)
+        button_box.addButton(self._branch_button,
+                             QtGui.QDialogButtonBox.ActionRole)
+        bottom_layout.addWidget(button_box)
+
+    def populate_table(self):
+        self._unrunnable_table.clear()
+
+        # set horizontal headers
+        wf_title = QtGui.QTableWidgetItem('Workflow')
+        wf_title.setTextAlignment(QtCore.Qt.AlignCenter)
+        self._unrunnable_table.setHorizontalHeaderItem(0, wf_title)
+
+        detail_title = QtGui.QTableWidgetItem('Unsupported Modules/Packages')
+        detail_title.setTextAlignment(QtCore.Qt.AlignCenter)
+        self._unrunnable_table.setHorizontalHeaderItem(1, detail_title)
+
+        # populate table
+        count = 0
+        for wf in self._unrunnable_wfs.keys():
+            details = \
+                    QtGui.QTableWidgetItem(', '.join(self._unrunnable_wfs[wf]))
+            details.setTextAlignment(QtCore.Qt.AlignCenter)
+
+            wf_item = QtGui.QTableWidgetItem(str(wf))
+            wf_item.setTextAlignment(QtCore.Qt.AlignCenter)
+
+            if count >= self._unrunnable_table.rowCount():
+                self._unrunnable_table.insertRow(count)
+            self._unrunnable_table.setItem(count, 0, wf_item)
+            self._unrunnable_table.setItem(count, 1, details)
+            count += 1
+
+        # delete vertical headers
+        for i in range(self._unrunnable_table.rowCount()):
+            self._unrunnable_table.setVerticalHeaderItem(i, QtGui.QTableWidgetItem())
+
+    def update_push_information(self):
+        """ display push information text in this widget """
+        self._vistrail_status_label.setText(self._repository_status['support_status'])
+        self._details_label.setText(self._repository_status['details'])
+
+
+    ##########################################################################
+    # Signal handling
+
+    def check_user_projects(self):
+        # are we logged in?
+        if not self.dialog.cookiejar:
+            self._repository_status['support_status'] = "Please login"
+            self._repository_status['details'] = ""
+            self.update_push_information()
+            self._push_button.setEnabled(False)
+            self._branch_button.setEnabled(False)
+            self._branch_button.hide()
+        else:
+            self._branch_button.setEnabled(False)
+            self._branch_button.hide()
+            server_url = "%s/projects/get_user_projects/" % \
+                    self.config.webRepositoryURL
+            register_openers(cookiejar=self.dialog.cookiejar)
+            try:
+                request = urllib2.Request(server_url)
+                get_servers = urllib2.urlopen(request)
+            except urllib2.HTTPError, e:
+                self._repository_status['support_status'] = ""
+                self._repository_status['details'] = ""
+                if e.code == 500:
+                    self._repository_status['support_status'] = \
+                            ("Error checking user projects (server side issues)")
+                    debug.critical("Error checking user projects (server side issues)")
+                else:
+                    debug.critical(str(e))
+
+                self._push_button.setEnabled(False)
+                self.update_push_information()
+                return
+
+            servers = json.loads(get_servers.read())
+            if not self.serverCombo.count():
+                self.serverCombo.addItem("Please Select a Project", 0)
+                for prj, srvr in servers:
+                    self.serverCombo.addItem("%s (%s)" % (prj, srvr), [prj, srvr])
+
+
+
+    def check_dependencies(self, index):
+        """
+        determines if current VisTrail will be
+        supported by the repository's VisTrail server
+        """
+
+        if not index: return
+
+        self._unrunnable_wfs = {}
+
+        # are we logged in?
+        if not self.dialog.cookiejar:
+            self._repository_status['support_status'] = "Please login"
+            self._repository_status['details'] = ""
+            self.update_push_information()
+            self._push_button.setEnabled(False)
+            self._branch_button.hide()
+        else:
+            self.repository_supports_vt = True
+            # get packages supported by VisTrails repository
+            server = self.serverCombo.itemData(index)[1]
+            packages_url = "%s/packages/supported_packages/%s" % \
+                    (self.config.webRepositoryURL, server)
+
+
+            try:
+                get_supported_packages = urllib2.urlopen(url=packages_url)
+            except urllib2.HTTPError, e:
+                self._repository_status['support_status'] = ""
+                self._repository_status['details'] = ""
+                if e.code == 500:
+                    self._repository_status['support_status'] = \
+                            ("Error when checking dependencies (server side issues)")
+                    debug.critical("Error when checking dependencies (server side issues)")
+                else:
+                    debug.critical(str(e))
+
+                self._push_button.setEnabled(False)
+                self.update_push_information()
+                self.populate_table()
+                return
+            server_packages = json.loads(get_supported_packages.read())
+
+            # get local packages and local data modules
+            local_packages = []
+
+            self.local_data_modules = ['File', 'FileSink', 'Path']
+            self.unavailable_data = set()
+            self.unsupported_packages = set()
+            has_python_source = False
+
+            vistrail = vistrails.api.get_current_vistrail()
+
+            for version_id in vistrail.get_tagMap():
+                pipeline = vistrail.getPipeline(version_id)
+                tag = vistrail.get_tagMap()[version_id]
+                workflow_packages = []
+                for module in pipeline.module_list:
+                    # count modules that use data unavailable to web repository
+                    on_repo = False
+                    if module.name[-6:] == 'Reader' or \
+                       module.name in self.local_data_modules:
+                        for edge in pipeline.graph.edges_to(module.id):
+                            if pipeline.modules[edge[0]].name in ['HTTPFile',
+                                                                  'RepoSync']:
+                                on_repo = True
+
+                        if not on_repo:
+                            if tag not in self._unrunnable_wfs.keys():
+                                self._unrunnable_wfs[tag] = []
+                            self._unrunnable_wfs[tag].append(module.name)
+                            self.unavailable_data.add(module.name)
+
+                    if module.name == "PythonSource":
+                        if tag not in self._unrunnable_wfs.keys():
+                            self._unrunnable_wfs[tag] = []
+                        self._unrunnable_wfs[tag].append(module.name)
+                        has_python_source = True
+
+                    # get all packages used in tagged versions of this workflow
+                    if module.package not in workflow_packages:
+                        workflow_packages.append(module.package)
+
+                # find unsupported packages
+                wf_unsupported_packages = filter((lambda p: p not in \
+                                                  server_packages),
+                                                 workflow_packages)
+                if wf_unsupported_packages:
+                    if tag not in self._unrunnable_wfs.keys():
+                        self._unrunnable_wfs[tag] = []
+                    for package in wf_unsupported_packages:
+                        self._unrunnable_wfs[tag].append(package)
+                        self.unsupported_packages.add(package)
+
+            # display unsupported packages
+            self._repository_status['details'] = "Details:\n"
+            if self.unsupported_packages:
+                self.repository_supports_vt = False
+                self._repository_status['details'] += \
+                        "Packages incompatible with web repository: %s\n\n" % \
+                        (', '.join(self.unsupported_packages)[:-2])
+
+            # display unsupported data modules
+            if len(self.unavailable_data):
+                self.repository_supports_vt = False
+                self._repository_status['details'] += \
+                        "Data sources not available on web repository: %s\n"%\
+                        (', '.join(self.unavailable_data)[:-2])
+
+            if has_python_source:
+                self.repository_supports_vt = False
+                self._repository_status['details'] += \
+                        ("This Vistrail contains PythonSource module(s) and "
+                         "will have to be verified by admins before it can be "
+                         "run on the web repository. You will be notified when"
+                         " your workflows have been verfied")
+
+            self._repository_status['support_status'] = ""
+            controller = vistrails.api.get_current_controller()
+            if controller.vistrail.get_annotation('repository_vt_id'):
+                # Since repository_vt_id doesn't mirror crowdlabs vt id
+                # get the crowdlabs vt id for linkage
+                vt_url = "%s/vistrails/details/%s" % \
+                        (self.config.webRepositoryURL,
+                         controller.vistrail.get_annotation('repository_vt_id').value)
+                try:
+                    request = urllib2.urlopen(url=vt_url)
+                    # TODO: check project that vistrail is part of and notify user
+                    # that branching will add it to a different project
+                    if request.code == 200:
+                        # the vistrail exists on the repository, setup merge settings
+                        self.permission_gb.setTitle(("Default Global Permissions "
+                                                     "(only applicable to branching):"))
+                        self._push_button.setText("Commit changes")
+                        self._branch_button.setEnabled(True)
+                        self._branch_button.show()
+
+                        vistrail_link = "%s/vistrails/details/%s" % \
+                                (self.config.webRepositoryURL,
+                                 controller.vistrail.get_annotation('repository_vt_id').value)
+
+                        self._repository_status['support_status'] = \
+                                ("You are attempting to update this Vistrail: "
+                                 "<a href='%s'>%s</a>. This will possibly update your local version with changes from the web repository<br><br>") % \
+                                (vistrail_link, vistrail_link)
+
+                except urllib2.HTTPError:
+                    # the vistrail has *probably* been deleted or doesn't exist
+                    # remove repository_vt_id annotation
+                    repo_annotation = controller.vistrail.get_annotation('repository_vt_id')
+                    if repo_annotation:
+                        controller.vistrail.db_delete_annotation(repo_annotation)
+
+            if self.repository_supports_vt:
+                self._repository_status['support_status'] += \
+                        ("All of this Vistrail's tagged versions are supported"
+                         " by the Repository.")
+            else:
+                self._repository_status['support_status'] += \
+                        ("This Vistrail contains packages or modules that are"
+                         " not supported by the Repository.<br>"
+                         "You may still upload the VisTrail but it will "
+                         "not be run by the Repository.")
+
+
+            self._push_button.setEnabled(True)
+
+            self.update_push_information()
+            self.populate_table()
+
+    def push_vistrail_to_repository(self, branching=False):
+        """ uploads current VisTrail to web repository """
+
+        self._repository_status['details'] = "Pushing to repository..."
+        self._push_button.setEnabled(False)
+        self._branch_button.setEnabled(False)
+        self.update_push_information()
+        try:
+            # create temp file
+            (fd, filename) = tempfile.mkstemp(suffix='.vt', prefix='vt_tmp')
+            os.close(fd)
+
+            # writing tmp vt and switching back to orginal vt
+            locator = ZIPFileLocator(filename)
+            controller = vistrails.api.get_current_controller()
+            tmp_controller = VistrailController(controller.vistrail.do_copy(), 
+                                                locator)
+            tmp_controller.changed = True
+            tmp_controller.write_vistrail(locator)
+
+            # check if this vt is from the repository
+            if controller.vistrail.get_annotation('repository_vt_id'):
+                repository_vt_id = controller.vistrail.get_annotation('repository_vt_id').value
+            else:
+                repository_vt_id = -1
+
+            # upload vistrail temp file to repository
+            register_openers(cookiejar=self.dialog.cookiejar)
+            project = self.serverCombo.itemData(self.serverCombo.currentIndex())[0]
+            if project == "Default": project = ""
+
+            params = {'vistrail_file': open(filename, 'rb'),
+                      'action': 'upload',
+                      'name': controller.locator.short_name,
+                      'repository_vt_id': repository_vt_id if not branching else -1,
+                      'is_runnable': not bool(len(self.unsupported_packages)+ \
+                                              len(self.local_data_modules)),
+                      'vt_id': 0,
+                      'branched_from': "" if not branching else repository_vt_id,
+                      'project': project,
+                      'everyone_can_view': self.perm_view.checkState(),
+                      'everyone_can_edit': self.perm_edit.checkState(),
+                      'everyone_can_download': self.perm_download.checkState()
+                     }
+
+            upload_url = "%s/vistrails/remote_upload/" % \
+                    self.config.webRepositoryURL
+
+            datagen, headers = multipart_encode(params)
+            request = urllib2.Request(upload_url, datagen, headers)
+            result = urllib2.urlopen(request)
+            updated_response = result.read()
+
+            os.unlink(filename)
+
+            if updated_response[:6] == "upload":
+                # No update, just upload
+                if result.code != 200:
+                    self._repository_status['details'] = \
+                            "Push to repository failed"
+                    debug.critical("Push to repository failed (Please contact an administrator)")
+                else:
+                    repository_vt_id = int(updated_response[8:])
+                    controller.vistrail.set_annotation('repository_vt_id',
+                                                       repository_vt_id)
+                    controller.vistrail.set_annotation('repository_creator',
+                                                       self.dialog.loginUser)
+                    # ensure that the annotations get saved
+                    controller.set_changed(True)
+                    self._repository_status['details'] = \
+                            "Push to repository was successful"
+            else:
+                # update, load updated vistrail
+                if result.code != 200:
+                    self._repository_status['details'] = "Update Failed"
+                    debug.critical("Update vistrail in web repository failed (Please contact an administrator)")
+                else:
+                    debug.log("getting version from web")
+                    # request file to download
+                    download_url = "%s/vistrails/download/%s/" % \
+                            (self.config.webRepositoryURL, updated_response)
+
+                    request = urllib2.Request(download_url)
+                    result = urllib2.urlopen(request)
+                    updated_file = result.read()
+
+                    # create temp file of updated vistrail
+                    (fd, updated_filename) = tempfile.mkstemp(suffix='.vtl',
+                                                              prefix='vtl_tmp')
+                    os.close(fd)
+                    updated_vt = open(updated_filename, 'w')
+                    updated_vt.write(updated_file)
+                    updated_vt.close()
+
+                    # switch vistrails to updated one
+                    controller = vistrails.api.get_current_controller()
+
+                    updated_locator = FileLocator(updated_filename)
+
+                    (up_vistrail, abstractions, thumbnails, mashups) = \
+                            load_vistrail(updated_locator)
+
+                    # FIXME need to figure out what to do with this !!!
+                    controller.set_vistrail(up_vistrail,
+                                            controller.vistrail.locator,
+                                            abstractions, thumbnails, mashups)
+
+                    # update version tree drawing
+                    controller.recompute_terse_graph()
+                    controller.invalidate_version_tree()
+
+                    os.remove(updated_filename)
+                    os.remove(updated_filename[:-1])
+
+                    self._repository_status['details'] = \
+                            "Update to repository was successful"
+
+        except Exception, e:
+            debug.critical("An error occurred", str(e))
+            self._repository_status['details'] = "An error occurred"
+        self.update_push_information()
+
+class QRepositoryLoginPopup(QtGui.QDialog):
+    """ Dialog that shows repository authentication """
+
+    def __init__(self, parent, status_bar, dialog):
+        QtGui.QDialog.__init__(self, parent)
+        self._status_bar = status_bar
+        self.dialog = dialog
+        self.dialog.cookiejar = None
+
+        self.config = get_vistrails_configuration()
+        # TODO: this '/' check should probably be done in core/configuration.py
+        if self.config.webRepositoryURL[-1] == '/':
+            self.config.webRepositoryURL = self.config.webRepositoryURL[:-1]
+
+        self.setWindowTitle('Log in to Web Repository')
+
+        grid_layout = QtGui.QGridLayout(self)
+        grid_layout.setSpacing(10)
+
+        l1 = QtGui.QLabel("Repository location: %s" % \
+                          self.config.webRepositoryURL, self)
+        grid_layout.addWidget(l1, 0, 0, 1, 2)
+
+        l2 = QtGui.QLabel("Username:", self)
+        grid_layout.addWidget(l2, 1, 0)
+
+        if self.config.check('webRepositoryLogin'):
+            self.loginUser = QtGui.QLineEdit(self.config.webRepositoryLogin, self)
+        else:
+            self.loginUser = QtGui.QLineEdit("", self)
+
+        self.loginUser.setFixedWidth(200)
+        self.loginUser.setSizePolicy(QtGui.QSizePolicy.Fixed,
+                                     QtGui.QSizePolicy.Fixed)
+        grid_layout.addWidget(self.loginUser, 1, 1)
+
+        l3 = QtGui.QLabel("Password:", self)
+        grid_layout.addWidget(l3, 2, 0)
+
+        self.loginPassword = QtGui.QLineEdit("", self)
+        self.loginPassword.setEchoMode(2)
+        self.loginPassword.setFixedWidth(200)
+        self.loginPassword.setSizePolicy(QtGui.QSizePolicy.Fixed,
+                                     QtGui.QSizePolicy.Fixed)
+        grid_layout.addWidget(self.loginPassword, 2, 1)
+
+        self.saveLogin = QtGui.QCheckBox("Save username", self)
+        if self.config.check('webRepositoryLogin'):
+            self.saveLogin.setChecked(True)
+        grid_layout.addWidget(self.saveLogin, 3, 0)
+
+        self._login_status_label= QtGui.QLabel("", self)
+        grid_layout.addWidget(self._login_status_label, 4, 0)
+
+        self._login_button = QtGui.QPushButton("&Login", self)
+        self._cancel_button = QtGui.QPushButton("&Cancel", self)
+
+        self.connect(self._login_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.clicked_on_login)
+
+        self.connect(self._cancel_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.clicked_on_cancel)
+
+        button_box = QtGui.QDialogButtonBox()
+        button_box.addButton(self._login_button,
+                             QtGui.QDialogButtonBox.ActionRole)
+        button_box.addButton(self._cancel_button,
+                             QtGui.QDialogButtonBox.ActionRole)
+
+        grid_layout.addWidget(button_box, 5, 0)
+
+        for lbl in [l1, l2, l3, self.loginUser, self.loginPassword, self._login_status_label]:
+            lbl.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
+
+        grid_layout.setRowStretch(1, 1)
+        grid_layout.setColumnStretch(1, 1)
+
+        self.loginUser.setEnabled(True)
+        self.loginPassword.setEnabled(True)
+        self._login_button.setEnabled(True)
+        self.saveLogin.setEnabled(True)
+
+
+        if self.dialog.cookiejar and \
+           'sessionid' in [cookie.name for cookie in self.dialog.cookiejar]:
+            self.loginUser.setEnabled(False)
+            self.loginPassword.setEnabled(False)
+            self._login_button.setEnabled(False)
+            self.saveLogin.setEnabled(False)
+
+    def show_login_information(self):
+        """ display/update login info text """
+        self._login_status_label.setText(self._login_status)
+
+
+    ##########################################################################
+    # Signal handling
+    def clicked_on_login(self):
+        """
+        Attempts to log into web repository
+        stores auth cookie for session
+        """
+        from vistrails.gui.application import get_vistrails_application
+
+        self.dialog.loginUser = self.loginUser.text()
+        params = urllib.urlencode({'username':self.dialog.loginUser,
+                                   'password':self.loginPassword.text()})
+        self.dialog.cookiejar = cookielib.CookieJar()
+
+        # set base url used for cookie
+        self.dialog.cookie_url = self.config.webRepositoryURL
+
+        self.loginOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.dialog.cookiejar))
+
+        # FIXME doesn't use https
+        login_url = "%s/account/login/" % self.config.webRepositoryURL
+        request = urllib2.Request(login_url, params)
+        url = self.loginOpener.open(request)
+
+        # login failed
+        if not 'sessionid' in [cookie.name for cookie in self.dialog.cookiejar]:
+            debug.critical("Incorrect username or password")
+            self.dialog.cookiejar = None
+        else: # login successful
+
+            self._login_status = "login successful"
+
+            self.loginUser.setEnabled(False)
+            self.loginPassword.setEnabled(False)
+            self._login_button.setEnabled(False)
+            self.saveLogin.setEnabled(False)
+
+            # add association between VisTrails user and web repository user
+            if self.saveLogin.checkState():
+                if not (self.config.check('webRepositoryLogin') and self.config.webRepositoryLogin == self.loginUser.text()):
+                    self.config.webRepositoryLogin = str(self.loginUser.text())
+                    pers_config = get_vistrails_persistent_configuration()
+                    pers_config.webRepositoryLogin = self.config.webRepositoryLogin
+                    get_vistrails_application().save_configuration()
+
+            # remove association between VisTrails user and web repository user
+            else:
+                if self.config.check('webRepositoryLogin') and self.config.webRepositoryLogin:
+                    self.config.webRepositoryLogin = ""
+                    pers_config = get_vistrails_persistent_configuration()
+                    pers_config.webRepositoryLogin = ""
+                    get_vistrails_application().save_configuration()
+            self.close_dialog(0)
+
+    def clicked_on_cancel(self):
+        self.reject()
+ 
+    def close_dialog(self, status=0):
+        self.accept()
+
+class QRepositoryDialog(QtGui.QDialog):
+    """ Dialog that shows repository options """
+
+    cookiejar = None
+    cookie_url = None
+    loginUser = None
+    def __init__(self, parent):
+        QtGui.QDialog.__init__(self, parent)
+        self._status_bar = QtGui.QStatusBar(self)
+        self.setWindowTitle('Push vistrail to Web Repository')
+
+        l = QtGui.QVBoxLayout(self)
+        l.setMargin(0)
+        l.setSpacing(0)
+
+        widget = QtGui.QWidget(self)
+        user_layout = QtGui.QHBoxLayout(widget)
+        self._user_text = QtGui.QLabel('N/A')
+        user_layout.addWidget(self._user_text)
+        self._logout_button = QtGui.QPushButton('Log out')
+        #self._logout_button.setFixedWidth(100)
+        user_layout.addWidget(self._logout_button)
+        user_layout.addStretch(1)
+        l.addWidget(widget)
+        self._push_widget = QRepositoryPushWidget(self, self._status_bar,
+                                                  self.__class__)
+        l.addWidget(self._push_widget)
+
+        self._button_box = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Close,
+                                                  QtCore.Qt.Horizontal,
+                                                  self)
+        
+        self.connect(self._button_box,
+                     QtCore.SIGNAL('clicked(QAbstractButton *)'),
+                     self.close_dialog)
+
+        self.connect(self._logout_button,
+                     QtCore.SIGNAL('clicked()'),
+                     self.clicked_on_logout)
+
+        l.addWidget(self._button_box)
+        l.addWidget(self._status_bar)
+
+        self.show_login_dialog()
+
+        self._push_widget.check_user_projects()
+
+    def clicked_on_logout(self):
+        """ Reset cookie and show login dialog """
+        self.cookiejar = None
+        self.show_login_dialog()
+
+    def show_login_dialog(self):
+        """ Prompt for login """
+        if not self.cookiejar:
+            loginDialog = QRepositoryLoginPopup(self, self._status_bar, self.__class__)
+            res = loginDialog.exec_()
+            if res == QtGui.QDialog.Rejected:
+                self.close_dialog()
+                return
+        self._user_text.setText('Logged in as: %s@%s' % (self.loginUser, self.cookie_url))
+        self._push_widget.check_user_projects()
+
+    def close_dialog(self):
+        self.done(0)
+
+    def tab_changed(self, index):
+        """ tab_changed(index: int) -> None """
+        if index == 1: # push tab
+            self._push_tab.check_user_projects()
+
+    def sizeHint(self):
+        return QtCore.QSize(800, 600)
diff --git a/vistrails/gui/requirements.py b/vistrails/gui/requirements.py
new file mode 100644
index 0000000..3b59180
--- /dev/null
+++ b/vistrails/gui/requirements.py
@@ -0,0 +1,61 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from vistrails.core.requirements import MissingRequirement, require_python_module
+import vistrails.gui.bundles.installbundle
+
+
+def setNewPyQtAPI():
+    import sip
+    # We now use the new PyQt API - IPython needs it
+    sip.setapi('QString', 2)
+    sip.setapi('QVariant', 2)
+
+
+def require_pyqt4_api2():
+    try:
+        require_python_module('sip')
+        setNewPyQtAPI()
+        require_python_module('PyQt4.QtGui')
+        require_python_module('PyQt4.QtOpenGL')
+    except MissingRequirement:
+        r = vistrails.gui.bundles.installbundle.install({
+            'linux-debian': ['python-qt4', 'python-qt4-gl', 'python-qt4-sql'],
+            'linux-ubuntu': ['python-qt4', 'python-qt4-gl', 'python-qt4-sql'],
+            'linux-fedora': ['PyQt4'],
+            'pip': ['PyQt<5.0']})
+        if not r:
+            raise
+        setNewPyQtAPI()
diff --git a/vistrails/gui/resources/__init__.py b/vistrails/gui/resources/__init__.py
new file mode 100644
index 0000000..cfd644b
--- /dev/null
+++ b/vistrails/gui/resources/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+pass
diff --git a/vistrails/gui/resources/images/alias.png b/vistrails/gui/resources/images/alias.png
new file mode 100644
index 0000000..d12d559
Binary files /dev/null and b/vistrails/gui/resources/images/alias.png differ
diff --git a/vistrails/gui/resources/images/analogy.png b/vistrails/gui/resources/images/analogy.png
new file mode 100644
index 0000000..7a300f6
Binary files /dev/null and b/vistrails/gui/resources/images/analogy.png differ
diff --git a/vistrails/gui/resources/images/appointment-new.png b/vistrails/gui/resources/images/appointment-new.png
new file mode 100644
index 0000000..85daef3
Binary files /dev/null and b/vistrails/gui/resources/images/appointment-new.png differ
diff --git a/vistrails/gui/resources/images/automatch.png b/vistrails/gui/resources/images/automatch.png
new file mode 100644
index 0000000..d2ff367
Binary files /dev/null and b/vistrails/gui/resources/images/automatch.png differ
diff --git a/vistrails/gui/resources/images/bookmarks.png b/vistrails/gui/resources/images/bookmarks.png
new file mode 100644
index 0000000..422d486
Binary files /dev/null and b/vistrails/gui/resources/images/bookmarks.png differ
diff --git a/vistrails/gui/resources/images/camera.png b/vistrails/gui/resources/images/camera.png
new file mode 100644
index 0000000..b41b44c
Binary files /dev/null and b/vistrails/gui/resources/images/camera.png differ
diff --git a/vistrails/gui/resources/images/camera_mount.png b/vistrails/gui/resources/images/camera_mount.png
new file mode 100644
index 0000000..9197fe5
Binary files /dev/null and b/vistrails/gui/resources/images/camera_mount.png differ
diff --git a/vistrails/gui/resources/images/close_hand.png b/vistrails/gui/resources/images/close_hand.png
new file mode 100644
index 0000000..5111a7c
Binary files /dev/null and b/vistrails/gui/resources/images/close_hand.png differ
diff --git a/vistrails/gui/resources/images/closeview.png b/vistrails/gui/resources/images/closeview.png
new file mode 100644
index 0000000..540694e
Binary files /dev/null and b/vistrails/gui/resources/images/closeview.png differ
diff --git a/vistrails/gui/resources/images/collapse_all.png b/vistrails/gui/resources/images/collapse_all.png
new file mode 100644
index 0000000..c63404b
Binary files /dev/null and b/vistrails/gui/resources/images/collapse_all.png differ
diff --git a/vistrails/gui/resources/images/column.png b/vistrails/gui/resources/images/column.png
new file mode 100644
index 0000000..d5ae2e0
Binary files /dev/null and b/vistrails/gui/resources/images/column.png differ
diff --git a/vistrails/gui/resources/images/connection.png b/vistrails/gui/resources/images/connection.png
new file mode 100644
index 0000000..c09fd81
Binary files /dev/null and b/vistrails/gui/resources/images/connection.png differ
diff --git a/vistrails/gui/resources/images/console.png b/vistrails/gui/resources/images/console.png
new file mode 100644
index 0000000..9974868
Binary files /dev/null and b/vistrails/gui/resources/images/console.png differ
diff --git a/vistrails/gui/resources/images/copy.png b/vistrails/gui/resources/images/copy.png
new file mode 100644
index 0000000..6bf9aa9
Binary files /dev/null and b/vistrails/gui/resources/images/copy.png differ
diff --git a/vistrails/gui/resources/images/database.png b/vistrails/gui/resources/images/database.png
new file mode 100644
index 0000000..09c5b88
Binary files /dev/null and b/vistrails/gui/resources/images/database.png differ
diff --git a/vistrails/gui/resources/images/detach.png b/vistrails/gui/resources/images/detach.png
new file mode 100644
index 0000000..ff5f27f
Binary files /dev/null and b/vistrails/gui/resources/images/detach.png differ
diff --git a/vistrails/gui/resources/images/detach_on.png b/vistrails/gui/resources/images/detach_on.png
new file mode 100644
index 0000000..5a16643
Binary files /dev/null and b/vistrails/gui/resources/images/detach_on.png differ
diff --git a/vistrails/gui/resources/images/disclaimer.png b/vistrails/gui/resources/images/disclaimer.png
new file mode 100644
index 0000000..84892ab
Binary files /dev/null and b/vistrails/gui/resources/images/disclaimer.png differ
diff --git a/vistrails/gui/resources/images/dock_view.png b/vistrails/gui/resources/images/dock_view.png
new file mode 100644
index 0000000..2d5a61d
Binary files /dev/null and b/vistrails/gui/resources/images/dock_view.png differ
diff --git a/vistrails/gui/resources/images/dockback.png b/vistrails/gui/resources/images/dockback.png
new file mode 100644
index 0000000..e3822e0
Binary files /dev/null and b/vistrails/gui/resources/images/dockback.png differ
diff --git a/vistrails/gui/resources/images/down.png b/vistrails/gui/resources/images/down.png
new file mode 100644
index 0000000..d78a52c
Binary files /dev/null and b/vistrails/gui/resources/images/down.png differ
diff --git a/vistrails/gui/resources/images/dragging.png b/vistrails/gui/resources/images/dragging.png
new file mode 100644
index 0000000..cf69efe
Binary files /dev/null and b/vistrails/gui/resources/images/dragging.png differ
diff --git a/vistrails/gui/resources/images/edit.png b/vistrails/gui/resources/images/edit.png
new file mode 100644
index 0000000..228ada8
Binary files /dev/null and b/vistrails/gui/resources/images/edit.png differ
diff --git a/vistrails/gui/resources/images/edit_add.png b/vistrails/gui/resources/images/edit_add.png
new file mode 100644
index 0000000..af4bea1
Binary files /dev/null and b/vistrails/gui/resources/images/edit_add.png differ
diff --git a/vistrails/gui/resources/images/editcopy.png b/vistrails/gui/resources/images/editcopy.png
new file mode 100644
index 0000000..18627b7
Binary files /dev/null and b/vistrails/gui/resources/images/editcopy.png differ
diff --git a/vistrails/gui/resources/images/editdelete.png b/vistrails/gui/resources/images/editdelete.png
new file mode 100644
index 0000000..ab71fae
Binary files /dev/null and b/vistrails/gui/resources/images/editdelete.png differ
diff --git a/vistrails/gui/resources/images/edittrash.png b/vistrails/gui/resources/images/edittrash.png
new file mode 100644
index 0000000..edfff15
Binary files /dev/null and b/vistrails/gui/resources/images/edittrash.png differ
diff --git a/vistrails/gui/resources/images/emblem-important.png b/vistrails/gui/resources/images/emblem-important.png
new file mode 100644
index 0000000..263fbd5
Binary files /dev/null and b/vistrails/gui/resources/images/emblem-important.png differ
diff --git a/vistrails/gui/resources/images/execute.png b/vistrails/gui/resources/images/execute.png
new file mode 100644
index 0000000..ad41d58
Binary files /dev/null and b/vistrails/gui/resources/images/execute.png differ
diff --git a/vistrails/gui/resources/images/execute_explore.png b/vistrails/gui/resources/images/execute_explore.png
new file mode 100644
index 0000000..2225fd4
Binary files /dev/null and b/vistrails/gui/resources/images/execute_explore.png differ
diff --git a/vistrails/gui/resources/images/execute_pipeline.png b/vistrails/gui/resources/images/execute_pipeline.png
new file mode 100644
index 0000000..6e5a20a
Binary files /dev/null and b/vistrails/gui/resources/images/execute_pipeline.png differ
diff --git a/vistrails/gui/resources/images/expand_all.png b/vistrails/gui/resources/images/expand_all.png
new file mode 100644
index 0000000..331d9cf
Binary files /dev/null and b/vistrails/gui/resources/images/expand_all.png differ
diff --git a/vistrails/gui/resources/images/explore.png b/vistrails/gui/resources/images/explore.png
new file mode 100644
index 0000000..7582bf1
Binary files /dev/null and b/vistrails/gui/resources/images/explore.png differ
diff --git a/vistrails/gui/resources/images/export.png b/vistrails/gui/resources/images/export.png
new file mode 100644
index 0000000..90bb548
Binary files /dev/null and b/vistrails/gui/resources/images/export.png differ
diff --git a/vistrails/gui/resources/images/eye.png b/vistrails/gui/resources/images/eye.png
new file mode 100644
index 0000000..c3598d6
Binary files /dev/null and b/vistrails/gui/resources/images/eye.png differ
diff --git a/vistrails/gui/resources/images/eye_gray.png b/vistrails/gui/resources/images/eye_gray.png
new file mode 100644
index 0000000..c7c7ac6
Binary files /dev/null and b/vistrails/gui/resources/images/eye_gray.png differ
diff --git a/vistrails/gui/resources/images/file.png b/vistrails/gui/resources/images/file.png
new file mode 100644
index 0000000..dfb7363
Binary files /dev/null and b/vistrails/gui/resources/images/file.png differ
diff --git a/vistrails/gui/resources/images/full_tree.png b/vistrails/gui/resources/images/full_tree.png
new file mode 100644
index 0000000..f554006
Binary files /dev/null and b/vistrails/gui/resources/images/full_tree.png differ
diff --git a/vistrails/gui/resources/images/history.png b/vistrails/gui/resources/images/history.png
new file mode 100644
index 0000000..c71b635
Binary files /dev/null and b/vistrails/gui/resources/images/history.png differ
diff --git a/vistrails/gui/resources/images/hor_view.png b/vistrails/gui/resources/images/hor_view.png
new file mode 100644
index 0000000..0c53489
Binary files /dev/null and b/vistrails/gui/resources/images/hor_view.png differ
diff --git a/vistrails/gui/resources/images/import.png b/vistrails/gui/resources/images/import.png
new file mode 100644
index 0000000..68c921e
Binary files /dev/null and b/vistrails/gui/resources/images/import.png differ
diff --git a/vistrails/gui/resources/images/info.png b/vistrails/gui/resources/images/info.png
new file mode 100644
index 0000000..609bea6
Binary files /dev/null and b/vistrails/gui/resources/images/info.png differ
diff --git a/vistrails/gui/resources/images/left.png b/vistrails/gui/resources/images/left.png
new file mode 100644
index 0000000..7204e37
Binary files /dev/null and b/vistrails/gui/resources/images/left.png differ
diff --git a/vistrails/gui/resources/images/lightcheck.png b/vistrails/gui/resources/images/lightcheck.png
new file mode 100644
index 0000000..151c582
Binary files /dev/null and b/vistrails/gui/resources/images/lightcheck.png differ
diff --git a/vistrails/gui/resources/images/list_view.png b/vistrails/gui/resources/images/list_view.png
new file mode 100644
index 0000000..6c7c967
Binary files /dev/null and b/vistrails/gui/resources/images/list_view.png differ
diff --git a/vistrails/gui/resources/images/mac/closetab.png b/vistrails/gui/resources/images/mac/closetab.png
new file mode 100644
index 0000000..ab9d669
Binary files /dev/null and b/vistrails/gui/resources/images/mac/closetab.png differ
diff --git a/vistrails/gui/resources/images/macro.png b/vistrails/gui/resources/images/macro.png
new file mode 100644
index 0000000..8aed8e1
Binary files /dev/null and b/vistrails/gui/resources/images/macro.png differ
diff --git a/vistrails/gui/resources/images/macro_info.png b/vistrails/gui/resources/images/macro_info.png
new file mode 100644
index 0000000..701f0d4
Binary files /dev/null and b/vistrails/gui/resources/images/macro_info.png differ
diff --git a/vistrails/gui/resources/images/macro_new.png b/vistrails/gui/resources/images/macro_new.png
new file mode 100644
index 0000000..dabc7fd
Binary files /dev/null and b/vistrails/gui/resources/images/macro_new.png differ
diff --git a/vistrails/gui/resources/images/macro_pause.png b/vistrails/gui/resources/images/macro_pause.png
new file mode 100644
index 0000000..4134af4
Binary files /dev/null and b/vistrails/gui/resources/images/macro_pause.png differ
diff --git a/vistrails/gui/resources/images/macro_play.png b/vistrails/gui/resources/images/macro_play.png
new file mode 100644
index 0000000..90c5e7b
Binary files /dev/null and b/vistrails/gui/resources/images/macro_play.png differ
diff --git a/vistrails/gui/resources/images/macro_stop.png b/vistrails/gui/resources/images/macro_stop.png
new file mode 100644
index 0000000..e6b3dda
Binary files /dev/null and b/vistrails/gui/resources/images/macro_stop.png differ
diff --git a/vistrails/gui/resources/images/macro_view.png b/vistrails/gui/resources/images/macro_view.png
new file mode 100644
index 0000000..e16b7e9
Binary files /dev/null and b/vistrails/gui/resources/images/macro_view.png differ
diff --git a/vistrails/gui/resources/images/make_kdevelop.png b/vistrails/gui/resources/images/make_kdevelop.png
new file mode 100644
index 0000000..5676ecd
Binary files /dev/null and b/vistrails/gui/resources/images/make_kdevelop.png differ
diff --git a/vistrails/gui/resources/images/mashup_create.png b/vistrails/gui/resources/images/mashup_create.png
new file mode 100644
index 0000000..166c659
Binary files /dev/null and b/vistrails/gui/resources/images/mashup_create.png differ
diff --git a/vistrails/gui/resources/images/mashup_execute.png b/vistrails/gui/resources/images/mashup_execute.png
new file mode 100644
index 0000000..9808fe3
Binary files /dev/null and b/vistrails/gui/resources/images/mashup_execute.png differ
diff --git a/vistrails/gui/resources/images/match_by_sig.png b/vistrails/gui/resources/images/match_by_sig.png
new file mode 100644
index 0000000..d2ff367
Binary files /dev/null and b/vistrails/gui/resources/images/match_by_sig.png differ
diff --git a/vistrails/gui/resources/images/minus.png b/vistrails/gui/resources/images/minus.png
new file mode 100644
index 0000000..8fe9a8d
Binary files /dev/null and b/vistrails/gui/resources/images/minus.png differ
diff --git a/vistrails/gui/resources/images/multiline_string_icon.png b/vistrails/gui/resources/images/multiline_string_icon.png
new file mode 100644
index 0000000..e47b59a
Binary files /dev/null and b/vistrails/gui/resources/images/multiline_string_icon.png differ
diff --git a/vistrails/gui/resources/images/new_vistrail.png b/vistrails/gui/resources/images/new_vistrail.png
new file mode 100644
index 0000000..31f4e3a
Binary files /dev/null and b/vistrails/gui/resources/images/new_vistrail.png differ
diff --git a/vistrails/gui/resources/images/noatunloopsong.png b/vistrails/gui/resources/images/noatunloopsong.png
new file mode 100644
index 0000000..5d56f72
Binary files /dev/null and b/vistrails/gui/resources/images/noatunloopsong.png differ
diff --git a/vistrails/gui/resources/images/open_hand.png b/vistrails/gui/resources/images/open_hand.png
new file mode 100644
index 0000000..aec48af
Binary files /dev/null and b/vistrails/gui/resources/images/open_hand.png differ
diff --git a/vistrails/gui/resources/images/open_vistrail.png b/vistrails/gui/resources/images/open_vistrail.png
new file mode 100644
index 0000000..1b4d7f5
Binary files /dev/null and b/vistrails/gui/resources/images/open_vistrail.png differ
diff --git a/vistrails/gui/resources/images/openfromdb.png b/vistrails/gui/resources/images/openfromdb.png
new file mode 100644
index 0000000..7711c43
Binary files /dev/null and b/vistrails/gui/resources/images/openfromdb.png differ
diff --git a/vistrails/gui/resources/images/pan_icon.png b/vistrails/gui/resources/images/pan_icon.png
new file mode 100644
index 0000000..83ff304
Binary files /dev/null and b/vistrails/gui/resources/images/pan_icon.png differ
diff --git a/vistrails/gui/resources/images/perform_pe.png b/vistrails/gui/resources/images/perform_pe.png
new file mode 100644
index 0000000..f9318e7
Binary files /dev/null and b/vistrails/gui/resources/images/perform_pe.png differ
diff --git a/vistrails/gui/resources/images/pinned.png b/vistrails/gui/resources/images/pinned.png
new file mode 100644
index 0000000..bc26347
Binary files /dev/null and b/vistrails/gui/resources/images/pinned.png differ
diff --git a/vistrails/gui/resources/images/pipeline.png b/vistrails/gui/resources/images/pipeline.png
new file mode 100644
index 0000000..ac825e5
Binary files /dev/null and b/vistrails/gui/resources/images/pipeline.png differ
diff --git a/vistrails/gui/resources/images/pipeline_bg.png b/vistrails/gui/resources/images/pipeline_bg.png
new file mode 100644
index 0000000..a1f9d22
Binary files /dev/null and b/vistrails/gui/resources/images/pipeline_bg.png differ
diff --git a/vistrails/gui/resources/images/player_eject.png b/vistrails/gui/resources/images/player_eject.png
new file mode 100644
index 0000000..cd7d184
Binary files /dev/null and b/vistrails/gui/resources/images/player_eject.png differ
diff --git a/vistrails/gui/resources/images/player_pause.png b/vistrails/gui/resources/images/player_pause.png
new file mode 100644
index 0000000..95fd2c2
Binary files /dev/null and b/vistrails/gui/resources/images/player_pause.png differ
diff --git a/vistrails/gui/resources/images/player_play.png b/vistrails/gui/resources/images/player_play.png
new file mode 100644
index 0000000..1f7e5e3
Binary files /dev/null and b/vistrails/gui/resources/images/player_play.png differ
diff --git a/vistrails/gui/resources/images/plus.png b/vistrails/gui/resources/images/plus.png
new file mode 100644
index 0000000..c4b2097
Binary files /dev/null and b/vistrails/gui/resources/images/plus.png differ
diff --git a/vistrails/gui/resources/images/query_bg.png b/vistrails/gui/resources/images/query_bg.png
new file mode 100644
index 0000000..5fa4580
Binary files /dev/null and b/vistrails/gui/resources/images/query_bg.png differ
diff --git a/vistrails/gui/resources/images/redo.png b/vistrails/gui/resources/images/redo.png
new file mode 100644
index 0000000..4020fd8
Binary files /dev/null and b/vistrails/gui/resources/images/redo.png differ
diff --git a/vistrails/gui/resources/images/reload.png b/vistrails/gui/resources/images/reload.png
new file mode 100644
index 0000000..96f8085
Binary files /dev/null and b/vistrails/gui/resources/images/reload.png differ
diff --git a/vistrails/gui/resources/images/remove_param.png b/vistrails/gui/resources/images/remove_param.png
new file mode 100644
index 0000000..701e77a
Binary files /dev/null and b/vistrails/gui/resources/images/remove_param.png differ
diff --git a/vistrails/gui/resources/images/right.png b/vistrails/gui/resources/images/right.png
new file mode 100644
index 0000000..7b883fb
Binary files /dev/null and b/vistrails/gui/resources/images/right.png differ
diff --git a/vistrails/gui/resources/images/row.png b/vistrails/gui/resources/images/row.png
new file mode 100644
index 0000000..f675f5d
Binary files /dev/null and b/vistrails/gui/resources/images/row.png differ
diff --git a/vistrails/gui/resources/images/save_vistrail.png b/vistrails/gui/resources/images/save_vistrail.png
new file mode 100644
index 0000000..2cbccf7
Binary files /dev/null and b/vistrails/gui/resources/images/save_vistrail.png differ
diff --git a/vistrails/gui/resources/images/search.png b/vistrails/gui/resources/images/search.png
new file mode 100644
index 0000000..2efb3cd
Binary files /dev/null and b/vistrails/gui/resources/images/search.png differ
diff --git a/vistrails/gui/resources/images/search_database.png b/vistrails/gui/resources/images/search_database.png
new file mode 100644
index 0000000..432fa12
Binary files /dev/null and b/vistrails/gui/resources/images/search_database.png differ
diff --git a/vistrails/gui/resources/images/select_icon.png b/vistrails/gui/resources/images/select_icon.png
new file mode 100644
index 0000000..548bf3b
Binary files /dev/null and b/vistrails/gui/resources/images/select_icon.png differ
diff --git a/vistrails/gui/resources/images/sheet.png b/vistrails/gui/resources/images/sheet.png
new file mode 100644
index 0000000..ab5f26a
Binary files /dev/null and b/vistrails/gui/resources/images/sheet.png differ
diff --git a/vistrails/gui/resources/images/show_legends.png b/vistrails/gui/resources/images/show_legends.png
new file mode 100644
index 0000000..8c315cf
Binary files /dev/null and b/vistrails/gui/resources/images/show_legends.png differ
diff --git a/vistrails/gui/resources/images/show_params.png b/vistrails/gui/resources/images/show_params.png
new file mode 100644
index 0000000..1a3ea5d
Binary files /dev/null and b/vistrails/gui/resources/images/show_params.png differ
diff --git a/vistrails/gui/resources/images/skip.png b/vistrails/gui/resources/images/skip.png
new file mode 100644
index 0000000..c9addc8
Binary files /dev/null and b/vistrails/gui/resources/images/skip.png differ
diff --git a/vistrails/gui/resources/images/tabbed_view.png b/vistrails/gui/resources/images/tabbed_view.png
new file mode 100644
index 0000000..e3822e0
Binary files /dev/null and b/vistrails/gui/resources/images/tabbed_view.png differ
diff --git a/vistrails/gui/resources/images/time.png b/vistrails/gui/resources/images/time.png
new file mode 100644
index 0000000..7f487ef
Binary files /dev/null and b/vistrails/gui/resources/images/time.png differ
diff --git a/vistrails/gui/resources/images/tree_view.png b/vistrails/gui/resources/images/tree_view.png
new file mode 100644
index 0000000..91c9db8
Binary files /dev/null and b/vistrails/gui/resources/images/tree_view.png differ
diff --git a/vistrails/gui/resources/images/undo.png b/vistrails/gui/resources/images/undo.png
new file mode 100644
index 0000000..ced68ac
Binary files /dev/null and b/vistrails/gui/resources/images/undo.png differ
diff --git a/vistrails/gui/resources/images/unpinned.png b/vistrails/gui/resources/images/unpinned.png
new file mode 100644
index 0000000..3dddd8f
Binary files /dev/null and b/vistrails/gui/resources/images/unpinned.png differ
diff --git a/vistrails/gui/resources/images/up.png b/vistrails/gui/resources/images/up.png
new file mode 100644
index 0000000..c38e165
Binary files /dev/null and b/vistrails/gui/resources/images/up.png differ
diff --git a/vistrails/gui/resources/images/ver_view.png b/vistrails/gui/resources/images/ver_view.png
new file mode 100644
index 0000000..7eb56d4
Binary files /dev/null and b/vistrails/gui/resources/images/ver_view.png differ
diff --git a/vistrails/gui/resources/images/version_bg.png b/vistrails/gui/resources/images/version_bg.png
new file mode 100644
index 0000000..f9314d7
Binary files /dev/null and b/vistrails/gui/resources/images/version_bg.png differ
diff --git a/vistrails/gui/resources/images/view-refresh.png b/vistrails/gui/resources/images/view-refresh.png
new file mode 100644
index 0000000..606ea9e
Binary files /dev/null and b/vistrails/gui/resources/images/view-refresh.png differ
diff --git a/vistrails/gui/resources/images/view_fullscreen.png b/vistrails/gui/resources/images/view_fullscreen.png
new file mode 100644
index 0000000..4972989
Binary files /dev/null and b/vistrails/gui/resources/images/view_fullscreen.png differ
diff --git a/vistrails/gui/resources/images/vistrails_icon.png b/vistrails/gui/resources/images/vistrails_icon.png
new file mode 100644
index 0000000..570a273
Binary files /dev/null and b/vistrails/gui/resources/images/vistrails_icon.png differ
diff --git a/vistrails/gui/resources/images/vistrails_icon_small.ico b/vistrails/gui/resources/images/vistrails_icon_small.ico
new file mode 100644
index 0000000..3ac22c4
Binary files /dev/null and b/vistrails/gui/resources/images/vistrails_icon_small.ico differ
diff --git a/vistrails/gui/resources/images/vistrails_icon_small.png b/vistrails/gui/resources/images/vistrails_icon_small.png
new file mode 100644
index 0000000..7382873
Binary files /dev/null and b/vistrails/gui/resources/images/vistrails_icon_small.png differ
diff --git a/vistrails/gui/resources/images/vistrails_splash.png b/vistrails/gui/resources/images/vistrails_splash.png
new file mode 100644
index 0000000..87d44e6
Binary files /dev/null and b/vistrails/gui/resources/images/vistrails_splash.png differ
diff --git a/vistrails/gui/resources/images/visual_query.png b/vistrails/gui/resources/images/visual_query.png
new file mode 100644
index 0000000..0a1562a
Binary files /dev/null and b/vistrails/gui/resources/images/visual_query.png differ
diff --git a/vistrails/gui/resources/images/zoom.png b/vistrails/gui/resources/images/zoom.png
new file mode 100644
index 0000000..dae8fad
Binary files /dev/null and b/vistrails/gui/resources/images/zoom.png differ
diff --git a/vistrails/gui/resources/images/zoom_arrow_icon.png b/vistrails/gui/resources/images/zoom_arrow_icon.png
new file mode 100644
index 0000000..db4d1c4
Binary files /dev/null and b/vistrails/gui/resources/images/zoom_arrow_icon.png differ
diff --git a/vistrails/gui/resources/images/zoom_icon.png b/vistrails/gui/resources/images/zoom_icon.png
new file mode 100644
index 0000000..627521c
Binary files /dev/null and b/vistrails/gui/resources/images/zoom_icon.png differ
diff --git a/vistrails/gui/resources/macroicons.qrc b/vistrails/gui/resources/macroicons.qrc
new file mode 100644
index 0000000..f4fdd08
--- /dev/null
+++ b/vistrails/gui/resources/macroicons.qrc
@@ -0,0 +1,17 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+    <file>images/macro.png</file>
+    <file>images/macro_info.png</file>
+    <file>images/macro_new.png</file>
+    <file>images/macro_pause.png</file>
+    <file>images/macro_play.png</file>
+    <file>images/macro_pause.png</file>
+    <file>images/macro_stop.png</file>
+    <file>images/macro_view.png</file>
+    <file>images/info.png</file> 
+    <file>images/lightcheck.png</file>
+    <file>images/edit_add.png</file>
+    <file>images/down.png</file>
+    <file>images/up.png</file>
+</qresource>
+</RCC>
diff --git a/vistrails/gui/resources/macroicons_rc.py b/vistrails/gui/resources/macroicons_rc.py
new file mode 100644
index 0000000..b3a7f29
--- /dev/null
+++ b/vistrails/gui/resources/macroicons_rc.py
@@ -0,0 +1,1404 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Resource object code
+#
+# Created: Wed Jun 14 12:55:01 2006
+#      by: The Resource Compiler for PyQt (Qt v4.1.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x07\x33\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x06\xc5\x49\x44\x41\x54\x58\x85\x95\
+\x97\x7b\x6c\x53\xd7\x1d\xc7\x3f\xe7\xfa\xed\x24\x4e\x9c\x97\xe3\
+\x38\xd0\x24\x0e\xc5\x2c\x5d\x13\x88\x32\x20\x40\x44\x4b\x9b\x76\
+\xa5\x5d\xbb\x6a\x65\x53\xb3\x4d\x1a\x2d\xd2\xda\x55\xaa\xb4\x8e\
+\x4d\xea\xaa\xf5\x4f\xf6\x96\xaa\x49\xb4\xdb\x24\xaa\x69\xda\x1f\
+\xab\xba\xb2\x4e\x1a\x68\x43\xe2\x11\x32\x54\xb1\xa4\x68\x40\x1e\
+\xa4\x34\x84\x90\xc5\xe4\x61\x9c\xe0\x3c\x7c\xef\xf5\xf5\xd9\x1f\
+\x7e\x70\xe3\xd8\x21\xb3\xf4\xd5\x39\x3e\xfe\xdd\xdf\xf7\xfb\xfb\
+\x9e\x73\x7d\xce\x11\x52\x4a\xd6\xf3\x11\x42\x08\xc0\x0e\x14\x01\
+\x0e\x01\x4e\x3b\x54\x00\x68\x10\x91\x10\x07\x54\x60\x11\xd0\xe4\
+\x3a\x13\x5b\xd7\x41\xac\x00\x65\x0e\x68\xa8\x86\x47\x2b\xe1\x49\
+\x37\xf8\x05\x14\x3b\xc0\x25\x53\xac\x71\x03\x16\xe2\x30\x15\x81\
+\xbf\x4f\xc3\x69\x21\xc4\x0d\x60\x4e\x4a\x99\x5c\x33\x7f\x21\xa1\
+\xe9\x8a\x3d\x4e\xd8\xd2\x04\x6f\x54\x43\x47\xa5\xc3\x51\x13\x0a\
+\x85\x94\xc6\x87\x1e\xa2\xa4\xb4\x14\x67\x71\x31\x49\x5d\x67\x69\
+\x76\x96\xbb\x91\x08\x13\xc3\xc3\x0c\x8d\x8d\x25\x27\x93\xc9\x99\
+\x3b\x70\x61\x14\x7e\x1e\x87\x21\xe0\x6e\x21\x47\xf2\x0a\x48\x57\
+\xed\x7f\x10\xde\x08\xc0\x0b\x8d\x55\x55\x75\xdf\x38\x7c\x98\x07\
+\x5a\x5a\xb0\xdb\xed\x48\x55\xc5\x30\x21\x11\x8f\x67\xfb\x8b\xd1\
+\x28\x63\x7d\x7d\x5c\xec\xe9\xe1\xd2\xd2\x52\x78\x1a\x3e\xbc\x0e\
+\x3f\x03\xc2\xf9\xdc\x58\x25\x40\x08\x61\xb3\x42\xe3\x16\xf8\xe5\
+\x66\x78\xfc\x99\x83\x07\x1d\x3b\x0f\x1c\xa0\xb8\xac\x0c\x23\x1e\
+\x27\x91\x43\x5e\x08\x5a\x2c\xc6\xb5\x0b\x17\x38\xd3\xdf\xaf\x5e\
+\x85\xb3\x23\xf0\x7a\x02\x46\xa5\x94\x7a\x41\x01\x42\x08\xc5\x06\
+\x9b\xbf\x08\xc7\xb6\x55\x57\x6f\x7f\xe9\xc8\x11\xd1\xd0\xd6\x86\
+\x54\xd5\xfb\x13\xa7\x5d\xc8\x8d\x9b\x19\x19\xe1\x5c\x6f\x6f\xf2\
+\x42\x22\xf1\x9f\x61\xe8\xd6\xe1\x9a\xd9\x09\xc5\x3c\xe7\x02\x6a\
+\x43\xf0\xab\x5d\xc1\xe0\xf6\xb7\x3e\xfe\x58\x04\xdb\xdb\x91\xba\
+\x8e\xa1\xeb\x24\x33\xd0\xb4\x7b\xad\x09\x46\x6e\x9c\xae\x63\x68\
+\x1a\xa5\x7e\x3f\x7b\xdb\xdb\x95\x3d\xd0\xda\x04\xbf\x11\x50\x9b\
+\x5e\x5f\x2b\x05\x00\x9e\x07\xe1\x87\x5b\x4b\x4b\xf7\xbd\x7a\xf4\
+\xa8\x28\x2a\x29\xc9\x4b\xb4\x42\x44\x9a\xd4\x30\x8b\xcb\x8d\xd5\
+\x75\x5c\x95\x95\xb4\xd4\xd6\x8a\x76\xd8\x13\x84\x1f\x03\x9e\x15\
+\x02\x84\x10\x8a\x13\x9a\x03\xf0\x7c\xf7\x9b\x6f\xda\x2b\xea\xea\
+\x56\x25\x59\x51\x59\x06\x79\x08\x8d\x5c\x51\xe9\x7e\x69\x63\x23\
+\x2d\x76\xbb\x3d\x00\x5f\x71\x42\x73\x7a\xa1\x67\x1d\x28\x0b\xc2\
+\xf7\x5b\x9b\x9b\x03\xad\x4f\x3f\x0d\x79\xac\x34\x63\x2d\x71\xab\
+\x5c\x48\x03\x29\xf1\xd6\xd7\xb3\x1d\x6a\xeb\xe1\x47\x40\x19\x80\
+\x22\x84\x10\x76\xa8\xf7\xc1\x8e\x67\x5f\x79\x05\x61\x18\xab\x09\
+\xf3\x11\x15\x12\x97\xc7\xa9\x4c\xdf\xea\x74\xb2\xa1\xb8\x98\x00\
+\xb4\xd9\xa1\x5e\xa4\x6d\xb0\x57\xc3\xde\x6a\x97\xcb\x1f\xdc\xb1\
+\xa3\x70\x65\x05\x48\x0b\xc6\xe4\x38\x22\xd3\xb1\x56\xb7\x9b\x10\
+\xf8\xab\xe0\x51\xc0\xae\x00\x45\x55\xf0\x54\x5b\x47\x87\x62\x51\
+\x94\x55\x44\xf7\xab\x32\x9f\xf5\xb9\xd3\x64\x5e\x17\x8a\xcd\x46\
+\x3d\x28\x15\xb0\x1f\x28\x52\x00\x87\x0b\xea\x02\x0d\x0d\x90\x33\
+\x6f\x32\x9d\x58\xea\x7a\x16\x64\xa0\x69\x2b\x91\x2f\x26\x27\x56\
+\x68\x1a\x22\x91\xc0\xae\x28\x14\x83\x1f\x70\x58\x15\x70\xdb\xc0\
+\xed\xf5\x7a\xf3\x26\x10\x19\xa4\x13\x64\x13\xe9\x3a\x8a\x89\x54\
+\xea\x3a\xd6\x35\xc4\x99\x73\x49\x21\x70\x83\x53\x01\xb7\xd5\x06\
+\xe5\x6e\x70\xba\xdd\xee\xec\xc3\x32\x0d\x4c\xad\x30\x8b\xc9\x90\
+\x6b\x1a\x4a\x4e\xbc\x62\x22\x34\x43\x9a\x0a\xb0\x49\x89\x17\x1c\
+\x36\x28\xb7\x0a\x10\x0a\x88\xf9\xa1\x21\xe4\xce\x9d\xab\x2b\xcf\
+\xe3\x42\x06\x4a\x3a\xd6\x88\xc5\x88\xdf\xb8\x41\x3c\x12\x41\x8f\
+\xc5\x48\x26\x93\xdc\x76\xd7\x33\x10\x7c\x86\xb9\xaa\x8d\x6c\x1a\
+\x39\x4e\x70\xbe\x1f\x97\xbe\x88\xc5\x30\x50\x92\x49\xac\x20\x04\
+\x08\xab\x06\x11\x15\xe2\xe3\x27\x4f\x12\xea\xec\xc4\x55\x53\x83\
+\x30\x59\x29\x4c\x56\x66\x2a\xcf\x88\xd4\xc2\x61\x62\x83\x83\x2c\
+\x8d\x8f\x23\x93\xa9\xbf\xf7\x4f\x43\x2f\x72\xfd\xeb\xbf\x60\x57\
+\x5b\x05\x5d\x55\x36\x3c\x2e\xc1\xcd\xa9\x97\x19\x1e\xbf\xcb\xd0\
+\xc9\x53\xbc\xf0\xd7\xef\xe0\xc4\x60\x11\x96\x35\x88\x08\xa0\xf6\
+\x11\x38\xfb\x2c\x6c\x0a\x7a\x3c\x54\x74\x76\x52\xb6\x75\x2b\xae\
+\x40\x80\xa4\xaa\x66\x61\xa8\x2a\x52\x55\xd1\xa3\x51\x62\x03\x03\
+\x2c\x0c\x0d\x91\x98\x9b\x43\x00\x32\x8d\x3f\x3c\x7f\x9c\xce\x83\
+\xfb\xe9\x08\xe5\x3f\xe7\xdc\x59\x90\x1c\xfb\x70\x80\xad\xc7\x5e\
+\xe6\xcc\xe4\xc5\xe1\x7f\xc0\x3e\x01\x94\xef\x82\xe3\x5f\x85\xce\
+\x2f\x64\x36\x26\xc0\xea\xf5\x52\x14\x0c\xa6\xde\x88\x78\x3c\x0b\
+\x7d\x76\x16\x92\x49\x44\x4e\xf2\x8f\x76\x1f\xc1\x79\xf0\x07\x74\
+\x36\x5b\xb2\x63\xed\x41\xa8\xf2\xc0\xf9\x21\x88\xc5\x53\x63\x71\
+\x0d\x7e\xf7\xa7\x4f\x88\xff\xfe\x91\xf3\x9f\x18\xea\x73\x56\x60\
+\xe9\x36\x9c\x98\x84\xdd\x21\x50\x9c\x19\x11\xd1\x28\xcb\x7d\x7d\
+\xf7\xb6\xea\x74\x6b\xcf\x53\xd9\xb4\x2b\xc0\xe9\xd0\x21\x5e\xad\
+\xb6\xf0\xdf\xc8\xbd\xf1\xae\x87\xc1\x61\x13\xa8\xba\x5c\x31\xee\
+\xae\x6b\x23\xbc\xff\xa8\x8f\xbf\xbd\xb4\x64\x05\xd4\x09\x38\x3d\
+\x0a\xb3\x3b\xa0\x3a\xb3\x4d\xe5\x56\x68\x1e\xcb\xfd\xed\x2f\xfb\
+\x7e\xcd\xb4\xe6\x65\x32\xba\x72\xfc\xbd\x53\xe0\x2b\x95\x5c\xbd\
+\x05\xe6\x73\x8f\x21\x6d\x2c\xba\x1f\xae\x57\x5a\x0e\x63\x95\x52\
+\x4a\x21\xc4\xe8\x24\xf4\x87\xe1\xcb\x1b\xd7\x20\x2e\x24\x6c\xa6\
+\xac\x81\x58\x5c\x30\x70\x0b\x3c\xee\xd4\xd8\xa1\x7d\x50\x57\x91\
+\xea\xdf\x5d\x86\xde\xe1\x7b\xf1\x03\x13\x30\xab\xf9\xec\x1e\xaf\
+\xaf\x2d\xb3\x1b\x46\xaf\xc0\x4f\x7b\x60\x66\x8e\x94\xcd\x66\xd8\
+\x0a\xf4\x33\x98\xb1\x56\x02\x70\x6e\x10\xc6\xa6\x61\x22\x02\x6f\
+\x7f\x90\x4a\xbc\xc9\x2f\xb0\x88\xd4\xd8\x44\x04\xfe\x7d\x1d\xc2\
+\x51\xd0\x15\x1f\x35\x3e\xff\xb7\xac\x00\x52\xca\xa4\x10\xe2\xf2\
+\x4d\x38\x71\x09\xba\x9f\x00\xab\x6d\x9d\xd5\x03\x20\x0d\x20\xf5\
+\x5e\xf5\x8f\x82\xc7\x05\xc5\x4e\xd0\x13\xa9\x9f\xe7\x97\x60\x74\
+\x2a\xd5\x2e\x6b\xd9\x87\x40\x26\x56\xdc\x0b\xe6\x3f\x85\xb7\x9d\
+\xd0\x54\x07\xbb\xb6\xaf\x41\x9c\xfb\xbd\x46\x0f\x73\x4d\x04\x49\
+\x4a\x30\x92\x10\x5d\x4c\x41\x4f\xe9\x62\x6e\x09\x6e\xcf\xad\x7c\
+\xc6\xc5\x24\xb7\x27\x47\xfe\x98\x3d\x92\xc9\xd4\x49\x71\xe2\x22\
+\x7c\xef\x7d\x18\xb8\xc2\x4a\xdb\x73\xa7\xc1\x0c\xff\x9d\x6b\x94\
+\x38\xd7\x77\xc3\x02\xa8\x28\x81\x0a\xeb\xb8\x1a\x9b\x9f\xe9\x33\
+\x9f\x09\x91\x52\x1a\x1a\x0c\xf6\x42\xf7\x3b\xf0\xaf\x73\x90\xb0\
+\xae\x21\x24\x83\xd7\x7a\x7e\x42\xb5\xe5\x06\x9b\xfc\xf7\x27\x2f\
+\x72\xc0\x46\x6f\x1c\xb7\xf1\xf9\xf9\xc4\xe5\xdf\xaa\x4a\x6e\x80\
+\x94\x52\xd7\xe0\x6a\x2f\x74\xbf\x0b\x1f\x1c\x81\xd9\x30\xab\x17\
+\xa5\x19\xc1\xa5\x30\x5f\x1b\x78\x97\x84\xb6\xc0\xb6\x06\x50\x04\
+\x7c\xb7\x0b\xfc\xde\x54\xce\x27\x5a\xa1\x63\x33\xf8\x4a\x61\x6f\
+\x33\xcc\x4f\xfc\x33\x3a\x32\xd8\xf3\x1c\xdc\xff\x6a\x56\xe6\x86\
+\x6d\x5f\x82\xb7\x3a\xa0\xf9\x49\xa8\x6a\x2d\x50\x99\x04\x5e\xeb\
+\x7a\x87\x4b\x4d\x07\xd8\x10\xf0\x51\xed\x01\x8b\x25\xb5\x10\x8b\
+\x1c\xb0\xa0\x42\x38\xa2\x31\x79\xfd\xd4\x3c\x4b\x9f\xbf\x38\xf8\
+\xd1\xeb\x27\xd6\x14\x60\x12\x62\x01\xca\x5d\xb0\x25\x04\x4f\x6d\
+\x80\xbd\x55\x50\xe5\x03\x87\x1f\x5c\x02\x98\x86\xe5\x29\x88\xcf\
+\xc0\xf4\x67\x6d\x87\xe6\x97\xb7\x7c\x7b\xb7\x74\xd4\x16\x09\xbb\
+\x4f\xd8\xec\x0e\xd4\xc5\x19\xac\xda\x98\x6e\x89\x7f\xd6\x37\x32\
+\x78\xa6\x2b\x71\xe5\xfd\x85\x6c\xfe\xff\xf3\x7a\xee\x04\x8a\x01\
+\x97\x1d\xbc\x16\x28\x07\x30\xe0\x8e\x06\x51\x60\x19\x58\x10\x81\
+\xc7\x54\xa5\x76\x4f\x53\xe3\x03\x0d\xdf\xb4\x58\x44\xe3\x5c\xe4\
+\xd6\x9f\x67\xa6\x6e\x9e\x4d\x5c\x7e\x2f\x96\x9b\xf7\x7f\x63\xc2\
+\x37\x3a\xc7\x1e\x95\x66\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x71\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x04\x03\x49\x44\x41\x54\x58\x85\xb5\
+\xd6\x4f\x68\x1c\x55\x1c\xc0\xf1\xef\xec\xec\xce\xee\x66\xd3\xa4\
+\x7f\x62\x10\x2c\xf5\x5f\xeb\x9f\x96\x1e\x84\x4a\xa4\x7a\xb2\x07\
+\x0f\x42\x11\x44\xd0\x93\x17\x51\x3c\x14\x0f\x5e\x8a\xff\xa8\x3d\
+\x54\x05\x05\x05\xc1\x20\x62\x73\x14\x7a\x50\xac\x87\x90\x83\xf4\
+\xcf\xa5\x12\xdb\x8a\x54\x6a\x4c\x8c\x31\xc9\x26\xd9\x24\xbb\x3b\
+\xbb\x33\x3b\xf3\x66\xde\xbc\x79\x1e\x66\x4d\xd6\x9e\x66\x62\xf2\
+\xe0\xc7\x5c\x66\x7e\xbf\xcf\x7b\x33\xef\x37\xcf\xd0\x5a\x93\x76\
+\x88\x73\xc6\x13\x6e\xe9\x9e\x77\x03\xeb\xd0\x89\x20\x8c\x0c\xe9\
+\x0b\x84\x1f\x10\x88\x40\x8b\xf6\xfa\x4c\x7b\xb5\xf1\x41\x0c\x17\
+\x4e\x7e\xa7\xc3\xb4\x39\x8d\xb4\x00\xf9\x91\xf9\x92\x73\xf4\xcd\
+\xb1\xe2\xfd\x0f\x59\xa5\x8a\x8f\x19\xb5\x40\xd8\xe0\x35\xd1\xbe\
+\x8d\xbd\xd4\x64\xfa\xe6\x92\xbf\x70\xeb\xcf\xab\xcf\xff\x20\x9f\
+\xd9\x76\x80\x33\x76\x7c\x2e\xff\xf4\x1b\xf7\x96\xcb\x1d\xa8\x8d\
+\xc3\xf2\x65\x68\xd5\x21\x04\x02\x0d\x0a\xe2\x5c\x85\x6f\x2f\xc6\
+\xde\xfa\x72\xe7\xc8\x6b\xd7\xf4\x5c\x9a\xbc\xb9\x34\x37\xc9\x0f\
+\x8d\x03\xd1\xd0\xc8\xdd\xc5\xfe\x1c\xd8\xd7\x60\xf1\x02\xb4\x57\
+\x41\x28\xf0\x14\x88\x18\xfc\x98\x9c\xeb\xb0\x7f\xc8\x37\x15\xbc\
+\x90\x6a\x56\x40\x3e\xcd\x4d\x91\xa2\xae\x84\x6b\xa0\x22\x58\xbf\
+\x02\x01\x49\x88\x6e\x84\x80\x91\x84\x0c\xe2\x30\x52\xd4\xd3\x02\
+\x52\xad\x40\xf9\x6d\xdd\x51\xce\x6a\x1c\x07\x21\x08\xbf\xbb\xec\
+\x3d\x51\x00\xca\x49\x34\x5c\xa2\x48\x32\xbf\xad\x00\x00\x25\x9a\
+\xb6\x12\x12\x18\xf8\x2f\xa0\xd8\x2d\x5e\x4a\xae\xb6\x83\x11\x86\
+\xfc\xbd\xfd\x00\xbf\x59\x55\x22\xdc\x04\x84\x24\x2f\xb0\xb4\x59\
+\x9c\x32\x38\x1d\x8a\xcd\x3a\x8b\xdb\x0e\x88\xda\xeb\x53\xd2\x97\
+\xc0\xae\xa4\xb8\x24\x99\x7d\x0f\x40\x9a\x10\xc5\x04\xad\x55\x82\
+\x6d\x07\x04\xf5\xda\xaf\x91\xe7\x69\x72\xfd\x49\x71\xab\x0b\xe8\
+\x41\x38\x49\xd9\xda\xa8\xd6\xf1\xb6\x03\xe2\x58\xff\x25\xec\x66\
+\x88\x51\x81\x88\xe4\xc3\x2b\xf4\x00\xca\xd0\xf6\x20\x52\x2c\xa4\
+\xcd\x99\x09\x20\x15\xf3\xc2\x6e\x2a\x72\x15\x50\xdd\xe2\x16\x9b\
+\x2b\x51\x02\xdb\x31\x11\x82\x99\x1d\x01\x44\x8a\x79\xbf\x51\xcf\
+\x69\xa3\x94\x7c\x7c\xf9\x1e\x44\x77\x27\x38\xfe\xbe\xd0\xf3\x76\
+\x0e\xb0\xe2\xb7\x1a\xa6\x56\x40\xc1\x02\xb3\x07\x51\x04\x4a\x05\
+\x9c\xd6\x6e\xa1\x54\xfa\x2d\x98\x09\x30\xf2\xb5\x8e\x23\xdf\xf1\
+\x42\x21\xc1\xea\x4b\x00\xbd\x88\x52\x99\x76\xab\x44\x14\xed\x10\
+\x00\x40\x09\xb7\x26\x7c\x09\x56\x39\x69\xbd\xb9\x1e\x44\x71\x00\
+\xc7\x36\xf3\x32\x43\x13\xca\x0c\x90\x9e\x33\x27\xbc\x10\xcc\xd2\
+\x46\xef\xff\x17\x12\x9b\x7b\xf0\x3a\xca\x0c\xd6\xd2\xff\x07\x32\
+\x03\x5c\xbb\x79\x4b\x78\x32\x01\xdc\x31\x7c\x77\x88\x58\xab\x36\
+\x90\xba\x07\x64\x06\x88\x8e\xf8\xc3\x6d\x77\x24\xa6\x05\x9a\xcd\
+\x88\xa1\x63\x0f\x23\x43\xb1\x3c\x9a\xe5\x88\x95\x15\xa0\x62\xae\
+\x54\xe7\x6a\x52\x63\x6d\x14\x46\x01\x11\x2c\xdc\x1e\x90\x2b\x33\
+\xd5\x8b\x59\xf2\x65\x06\xbc\x38\xae\x6f\xb7\x56\x16\x97\xe7\x6b\
+\x15\x50\xc6\x46\x71\x5f\x3c\xcc\x8d\xf1\x05\xe5\xae\x8b\x2f\xb2\
+\x02\x52\x1d\x48\x7a\x47\x63\x69\xf1\xf5\x1f\x27\xf4\x79\x1d\x0f\
+\x0d\x0c\xf4\xaf\x19\xa1\x59\xd1\x8e\x1e\x32\xa7\x27\xaf\x7c\xfa\
+\x65\x4b\x57\xb3\xe6\x4b\x7d\x26\xbc\x73\x9c\x3d\x6c\x1c\x17\x01\
+\x0f\x0a\x49\x10\x06\xfc\xfc\x79\x4d\xcf\x6e\x29\x91\xd6\x7a\xcb\
+\xb1\x7c\x9a\xe2\xff\x79\x5e\x6b\xbd\x85\x15\xf8\xd8\x30\x6c\x87\
+\x53\x6e\xdf\xe1\x33\x72\xef\x63\x83\xee\xf2\xac\xac\x4f\xdf\xbc\
+\xd8\x6e\x89\x57\x4f\x7e\xaf\x9b\x59\x17\x20\x33\xc0\x3e\x63\x8e\
+\x46\x23\x67\x5f\x19\x38\xf0\x88\x69\x15\x0b\x68\x0d\x76\xa3\xcd\
+\xe5\xcf\x4e\xd7\x16\xa6\xaa\x0f\x9c\xba\xae\xbd\x2c\xf9\x32\xed\
+\x82\xf6\xfb\xc6\x11\xa7\x7c\xe4\xe5\xdd\x7d\x9e\x69\x35\x7f\x81\
+\x95\x49\x8c\xda\x24\x7b\xe4\x14\x07\x8f\x3d\x3e\x1c\x9b\x85\x77\
+\x32\xcd\x86\x8c\xbb\xa0\xe5\xf2\x94\xea\x4c\x17\xf2\xab\x3f\x41\
+\xae\xfb\x68\x77\x0a\x7b\x9c\x1b\x86\x36\xcb\xcf\x01\x6f\xed\x18\
+\xc0\x15\x46\x60\x5a\x05\xcd\xc2\x25\xc8\x5b\x30\x5c\x80\x8a\x02\
+\x24\xbe\x19\x92\xdb\x75\x30\xf3\x96\xca\xf4\x0a\x3a\xbe\xbe\xb4\
+\x16\xde\xa5\x7c\x3f\x86\x41\x1f\xf6\xb5\x61\x7f\x07\xee\x0b\xf9\
+\xdd\x3d\xae\x1b\x76\xf4\xcd\x8e\x02\x8e\x7d\xa5\xe7\xec\x95\xea\
+\x7b\x57\xab\x47\xe5\x52\x74\x14\xdf\x1a\x64\x4d\x3f\xca\xc4\xc4\
+\xb3\xfa\xb7\xeb\xf6\xec\xe2\xcd\xb9\x73\x59\x01\x5b\x6a\x44\xa3\
+\x4f\x1a\x27\xcc\xfe\xbd\x9f\xb8\x41\xfe\x50\x94\xcb\xdb\xf5\x35\
+\x31\x56\x9b\x69\x9c\x39\xef\x6b\x99\x35\xd7\x3f\x06\xa7\x82\xfc\
+\xaf\xda\x0c\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x08\xd4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x08\x66\x49\x44\x41\x54\x58\x85\x8d\
+\x97\x6b\x8c\x5d\x55\x19\x86\x9f\xb5\xf7\xda\x7b\x9f\xdb\x5c\xce\
+\xcc\x99\xdb\x99\x69\x67\x3a\xd3\x96\xa9\xad\xb6\x65\x2c\xbd\x08\
+\x63\x41\x2b\x77\x51\x89\x20\x69\x8c\x88\xf1\x07\x6a\x22\x81\x54\
+\x63\xc1\xf0\x4b\xaa\x88\x3f\x84\x04\x12\x13\x21\x06\x88\x18\x35\
+\x88\x99\x52\xc4\x0b\xa6\xc2\x14\x4a\x2f\xd0\xda\xe9\xcc\x30\x69\
+\xcb\x74\xee\xb7\x33\xd7\x7d\xce\xbe\x2e\x7f\x9c\x33\xcd\x74\xe6\
+\x54\xba\x92\x37\x67\x9d\x64\xed\xef\x7d\xd7\xfb\x7d\x7b\x7f\x6b\
+\x09\xa5\x14\x57\x33\x84\x10\x02\x30\x81\x38\x60\x09\x88\x98\x50\
+\x09\xe0\xc2\xa4\x82\x1c\xe0\x00\x0b\x80\xab\xae\x32\xb0\x04\xea\
+\x80\x31\x20\xb8\x02\xb1\x06\x94\x5b\xb0\xa6\x1a\x6e\x4a\xc1\x2d\
+\x31\xa8\x13\x90\xb0\x20\xaa\xf2\xac\xb9\x00\xe6\x73\x30\x3a\x09\
+\x07\xc7\xe0\x5f\x42\x88\xf3\xc0\xb4\x52\x2a\xfc\xbf\x1b\x53\x4a\
+\xb5\x01\xf3\x40\x4f\x91\x1d\x97\x46\x60\xc3\x5a\x78\xa4\x1a\x76\
+\xa5\x2c\xab\xb6\xb5\xb5\x55\x6b\xde\xb4\x89\x92\xb2\x32\x22\x89\
+\x04\xa1\xe7\x61\x4f\x4c\x30\x3b\x39\xc9\x60\x4f\x0f\x5d\xe7\xcf\
+\x87\x43\x61\x38\x3e\x05\x9d\xe7\xe0\xc9\x1c\x9c\x05\x66\xaf\xe4\
+\x88\x50\x4a\xdd\x5c\xb0\xf6\x20\x10\x2e\xd9\x75\xdd\x7a\x78\xa4\
+\x1e\xbe\xde\x5c\x55\xd5\xf0\x8d\x7d\xfb\x68\xdc\xbc\x19\xd3\x34\
+\x51\x8e\x43\xb0\x04\x7e\x2e\x77\x69\xbe\x90\xc9\x70\xe1\xd8\x31\
+\x8e\x1e\x3e\xcc\x49\xdb\x1e\x1e\x83\x3f\xf5\xc1\x2f\x80\xe1\x62\
+\x6e\x08\xa5\xd4\x7d\x40\x04\x78\xa1\x40\x6e\x48\x68\xde\x00\x4f\
+\x5d\x03\x7b\xee\x7c\xe0\x01\x6b\xe7\x3d\xf7\x90\x28\x2f\x27\xc8\
+\xe5\xf0\x97\x91\x5f\x09\xee\xdc\x1c\x3d\x9d\x9d\xbc\x75\xfc\xb8\
+\xf3\x5f\xf8\x77\x2f\xfc\xd0\x87\x73\x4a\x29\x6f\x79\x0d\xc4\x0b\
+\x35\x80\x10\x42\x33\x60\xed\xa7\xe1\xf9\x6b\xab\xab\xb7\x7f\xe7\
+\xc0\x01\xb1\xa6\xad\x0d\xe5\x38\x79\x62\xcf\x23\xbc\x12\x5c\x97\
+\xd0\x75\x09\x0a\x00\x58\xdb\xd6\x46\x59\x49\x89\x95\x7c\xfb\xed\
+\x3d\xba\xef\xff\xbe\x1b\xf6\x0a\x21\x7a\x96\x3a\xa1\x01\x83\xc0\
+\x9b\x22\x9f\xf4\x74\x2b\xfc\xea\x73\x2d\x2d\xdb\x1f\x7b\xed\x35\
+\xd1\xb2\x6d\x1b\xca\xf3\x2e\x27\x76\xdd\xcb\x08\x2f\x11\x2f\x5f\
+\xe7\x79\x04\xae\x4b\x59\x5d\x1d\xbb\xb7\x6d\xd3\x6e\x80\x2d\x6b\
+\xe1\x19\x01\xe9\x42\x7d\x5d\x12\x70\x88\xfc\x2b\x54\xba\x1e\x7e\
+\xb4\xb5\xac\xec\x0b\xdf\x7b\xf6\x59\x11\x2f\x29\x29\x4a\x74\x99\
+\x88\x02\x69\xb0\xcc\x85\xcb\xd6\x7a\x1e\xd1\x54\x8a\xcd\xe9\xb4\
+\xd8\x06\x37\xb4\xc0\xa3\x40\xe9\x52\x01\x08\x21\xb4\x08\x6c\xac\
+\x87\xaf\xed\xdd\xbf\xdf\xac\x6c\x68\x58\x11\x64\x29\x5c\xcf\x67\
+\x42\x8b\x32\x2a\x13\x4c\x62\xb1\x10\x88\x4b\x6b\x83\xe5\xa2\x0a\
+\xf3\xb2\xe6\x66\x36\x9b\xa6\x59\x0f\x5f\x8e\xc0\xc6\x42\xa1\x23\
+\x0b\x42\xca\x5b\xe0\xe1\x2d\x1b\x37\xd6\x6f\xb9\xe3\x0e\x28\x62\
+\x65\xe0\xba\x2c\xb8\x3e\x13\xf1\x6a\xdc\x54\x1c\x4a\x4b\x70\x5c\
+\x0f\xdb\xce\x61\x67\xe6\x10\xc3\x03\x54\x8d\x9c\x27\xee\xce\xad\
+\x74\xc2\x75\x41\x29\x92\x4d\x4d\x6c\xef\xed\x4d\x8f\xc2\x8f\xbb\
+\xe1\xdb\xc0\x94\x14\x42\x08\x13\x9a\x6a\x60\xc7\x5d\x0f\x3e\x88\
+\x08\x82\x4b\x84\x8b\x08\x3d\x8f\x59\x5f\x30\x51\xb5\x86\x48\x6d\
+\x05\xd3\xbd\x7d\xd8\x67\x4f\x13\xda\x36\x7e\xe0\x13\x4a\x13\xb7\
+\x32\xcd\x47\xd6\x26\xca\x2e\xf4\xd2\x30\xd4\xbd\x22\x3d\x81\xe7\
+\x21\x23\x11\x56\x25\x12\xd4\xcf\xcf\xb7\x9d\x83\x26\x21\x44\x46\
+\x03\xcc\x6a\xd8\x5d\x1d\x8d\xd6\xb5\xec\xd8\x51\xd4\xf6\x05\x2f\
+\x64\x3a\xdd\x44\x55\x63\x1d\xe3\x7d\x17\x18\xec\xbb\x88\x97\x75\
+\x30\x3c\x97\x52\xd7\x26\x31\x3d\x4e\xf4\xec\x31\xb4\x89\x41\x86\
+\x53\x0d\x0c\x44\xab\x56\xd4\x85\x2a\xc4\x95\xb1\x18\xad\x50\x57\
+\x05\x37\x01\xa6\x06\xc4\xab\xe0\xb6\xb6\x5d\xbb\x34\x5d\xd3\x56\
+\x58\x1f\x7a\x1e\x23\xb2\x94\x96\xb5\x8d\xa4\xcb\xe2\x34\xd4\x54\
+\x52\x57\x11\x43\xfa\x0e\x61\xe0\xe1\x05\x0a\x43\xd7\x28\x31\x34\
+\x6a\x67\x46\x88\x07\x36\xfd\xa9\x26\xb2\x01\x45\xeb\x42\x33\x0c\
+\x9a\x40\xab\x84\xdb\x81\xb8\x06\x58\x51\x68\xa8\x5f\xb3\x06\x96\
+\xe5\x4d\x79\x1e\x33\x6e\x08\xa9\x4a\x9c\xac\x8d\xe7\x38\xe8\x9e\
+\x43\xe8\x38\xf8\xa1\x22\xa1\x81\xb4\x2c\x2c\xcb\x24\x12\x8d\x12\
+\x8d\xc5\xa8\x9f\x1d\x41\x4f\x55\x30\x9c\xa8\x01\xcf\xcb\xc3\x75\
+\xc1\x75\x11\xae\x8b\xf0\x7d\x4c\x4d\x23\x91\xef\x41\x96\xd4\x20\
+\x66\x40\x2c\x99\x4c\xa2\x3c\x0f\xb5\xf8\x50\x01\x93\xbe\x41\x66\
+\x21\x8b\x77\xba\x87\x98\xa6\x98\x1b\x1f\xc7\x9e\xca\x10\xd7\x35\
+\x22\xba\x85\x89\xc0\xd0\x8c\x7c\x29\xfb\x3e\x96\xe7\x51\x23\x43\
+\x86\x22\xe5\x34\x15\x88\x17\x63\x89\x02\x94\x10\xc4\x20\xa2\x41\
+\x4c\x1a\x50\x11\x83\x48\x2c\x16\xbb\xa4\x56\x15\x80\xeb\x92\xf3\
+\x34\xe6\x67\xe6\x98\xef\x3f\x8f\xe1\xbb\xa8\xc0\x27\x2e\x35\x4a\
+\xb5\x10\x53\x4a\x42\x5d\x62\x69\xf9\xef\x8a\x08\x43\x02\xdf\x27\
+\x29\x7c\x06\x13\xa5\xe8\x4b\x36\xa2\x0a\x0e\xe0\xba\x18\x4a\x91\
+\x04\xcb\x80\x0a\x29\x40\x68\x20\x66\xce\x9e\x45\xed\xdc\xb9\x42\
+\xad\x1b\x18\x78\x0b\x36\x89\xd0\x27\xe2\xbb\xc4\xf0\x30\xd0\x91\
+\xba\x81\x2e\x25\xd2\x34\x31\xa4\x8e\xa6\xeb\xa8\x30\x24\xf4\x7d\
+\x22\x46\x1c\x3d\x97\x25\xdb\xd5\x85\xd2\x34\x00\x54\x41\xa0\x1e\
+\x04\x68\x61\x88\x04\x21\x40\x48\x17\x26\x1d\xc8\xf5\x1f\x3a\x44\
+\x6b\x7b\x3b\xd1\xda\x5a\xc4\x92\xdc\x19\xae\x60\xd6\xb2\xa8\xf0\
+\x1d\xa4\xef\xe0\xeb\x12\x29\x24\x42\x97\x18\x86\x81\x65\x9a\x48\
+\xcb\x44\xd3\x25\x66\x22\x0e\xc0\x5c\x68\xa1\xe6\x67\xd1\x0b\x3d\
+\x61\x51\xc0\xd2\xdf\x05\xc8\xba\x30\x29\x43\xc8\x06\x90\xf5\xe7\
+\xe6\xe8\xd9\xbf\x9f\xca\xf6\x76\xca\xb7\x6e\x25\x5a\x5f\x8f\xf0\
+\x3c\x1a\xdc\x1c\xa7\xc3\x08\x39\x24\x91\x30\x20\xa1\x81\x89\x8e\
+\x14\x60\xe8\x3a\x52\x4a\x0c\xd3\x24\x96\x4c\x12\x29\x2f\x45\x18\
+\x26\xa3\x36\xc8\xbe\x8f\x30\x97\x74\xbd\xe5\x02\x1c\xc8\x85\x90\
+\x95\x40\xce\x85\x61\x1f\xd6\xe9\xb3\xb3\x4c\x77\x74\x30\xd3\xd1\
+\x81\x4c\x26\x49\xac\x5b\x87\x90\x92\xd8\xee\xbb\xe9\x8f\x25\x48\
+\x78\xd3\x68\x5a\x88\xa6\x14\x12\xd0\x3c\x17\xe5\xe4\xd0\x54\x29\
+\x91\xd5\xab\x48\xd4\xa5\xd1\xca\x93\xf4\xbe\xf2\x26\x9b\xba\xdf\
+\xc5\xba\x82\x80\x10\x98\x87\x51\x20\xa7\x01\xf6\x08\xbc\x3e\x04\
+\x61\x48\xfe\x64\x62\x00\x5a\x26\x83\x7d\xf4\x28\x0b\x9d\x9d\x34\
+\xbf\xf4\x1c\xd9\xe9\x79\x3e\x92\x25\xe4\x5c\x1f\x7f\x68\x10\xfb\
+\xcc\x19\x72\xdd\xdd\x84\x99\x0c\x1a\xa0\xeb\x3a\x2a\x16\xe7\xe2\
+\xe8\x14\x33\x13\x53\xd0\x72\x0d\x46\x21\x96\x51\x88\xbb\x88\x31\
+\x08\x47\xe0\x6f\x80\xad\x03\x81\x0d\x4e\x0a\xbe\xd2\x0a\xf1\x32\
+\x40\x2f\x34\x09\xbd\x80\xf8\xcc\x14\xa6\xbd\x40\x4f\xed\x5a\x86\
+\x43\x03\x73\x74\x84\x12\x67\x01\xd3\x8a\x20\x2d\x0b\xa7\xa4\x0c\
+\x3b\x55\x4b\x57\xff\x24\xdd\x1f\xf6\x70\xfd\xe6\x66\xc6\x3f\x38\
+\x8d\x56\x99\x22\x3a\x3c\x80\x54\x0a\xbd\xd0\xf9\x74\xe0\x20\x0c\
+\xfe\x07\x0e\x04\x70\x51\x2a\xa5\x94\x10\xe2\xdc\x10\x1c\x1f\x86\
+\x5b\x57\xb3\x72\x08\x60\xdd\x07\xef\x90\x1c\xb9\xc8\xfb\x3b\x6f\
+\xe7\x58\xf3\x26\xba\x2a\x2b\xa8\x8c\x19\xc4\x62\x51\x72\xb6\x8d\
+\xf3\xca\x1b\x54\x4e\x0c\xb1\x23\xe2\x32\x51\xfa\x55\x46\xbe\x78\
+\x17\xf5\x35\x3e\x25\x73\xed\x0c\xbf\x78\x88\xd5\xef\x9d\x04\x60\
+\x16\x38\x05\x1f\x3a\xf9\xd3\x91\x5a\xec\x86\x99\xd3\xf0\xf3\xc3\
+\xf0\xd9\x6b\xa0\xaa\xfa\x0a\x22\xd2\x23\xfd\xdc\xf5\xea\x73\x0c\
+\xd7\xac\x66\xb4\xa2\x8e\x4c\xac\x8c\x05\x60\x4b\xdf\x49\xaa\x67\
+\xc6\xa1\x90\xdf\x5c\xac\x92\xfb\x1e\xdf\x4b\xb9\x39\x8d\xbc\x38\
+\xc6\xa0\xf9\x19\x8e\x68\x3a\x2d\x47\x8e\xf1\x17\x18\x3c\x05\x4f\
+\x02\x19\x0a\x4e\xa3\x94\x0a\x85\x10\xa7\x3e\x86\xd7\x4f\xc2\xde\
+\x9b\x41\x1a\x4b\x88\x59\x36\x6f\x1c\xed\xa7\x71\xb4\xbf\x88\xcc\
+\xfc\x88\x0f\xf4\x51\x16\x1f\x43\x46\xd7\xc3\xaa\x2c\xf5\xca\x67\
+\x57\xe8\xd1\x41\x18\x1c\x3d\x72\xe2\xef\x59\x38\xb5\x78\x2c\xd3\
+\x96\x3c\x37\x73\x02\x1e\x3f\x08\xef\x9d\x01\xac\x02\xcc\x65\xf3\
+\xa5\xff\x8b\xc1\x04\xaa\x0f\x75\xd0\xfd\xd7\x13\x28\xf7\x24\x94\
+\x6e\x82\xd5\x6d\xa4\x77\xac\xe3\xc6\xdd\x33\xec\xf9\xee\xbd\x39\
+\x60\x66\x91\x74\x31\x05\x14\x6a\x61\xe0\x28\x7c\xdf\x84\x97\x63\
+\xb0\xb1\xad\x48\x1a\xae\x66\x98\x9e\x8b\xfb\xad\x9f\xd2\xe5\x3e\
+\xce\xa7\xee\x35\x10\xa5\x6d\xb0\xda\x67\xdd\xb6\x97\xf4\x07\x8f\
+\x75\x7e\xb3\xe4\xa1\xfb\x1d\xe0\xa1\x45\xe2\xcb\x00\x18\x26\x6c\
+\x6e\x87\xb7\x7f\x07\xde\x00\xa8\xa1\x65\x18\xfe\x04\x2c\xae\xfb\
+\x58\x1a\xea\xf8\xf3\x3f\x0b\xc3\xec\x1b\x4a\x05\x03\x4a\x75\x7d\
+\x5e\xa9\x17\x51\x83\x8f\xa6\xb3\x4f\x3c\x74\xff\xb3\x4a\x29\x44\
+\xb1\x0b\x8b\x10\x42\xd7\xa0\xe1\x3a\x78\xa2\x0d\xbe\xf4\x00\xa4\
+\x1a\xaf\x72\xf7\x8b\x63\x16\x78\x01\x46\xdf\x32\xac\x7f\xfe\xb2\
+\xe3\xd7\x1b\xae\xbb\xde\xda\xaa\x79\x3f\x81\x9e\x11\xe8\x85\xe1\
+\xee\x74\xf0\x72\x70\xf7\x6f\x64\xb1\x87\x95\x52\x81\x10\xa2\xff\
+\x5d\xf8\xc1\x29\xb8\xf6\x0c\x3c\xb6\x0b\x36\xde\x02\x55\x5b\x3e\
+\x81\xb8\x1f\xe8\x80\x91\x7f\xc0\x99\x4e\x38\x60\x7b\xce\x89\xdf\
+\xfe\x71\xc0\xb6\xe7\xe4\xab\xed\xbb\x9c\x5b\xe4\xfa\x7c\x26\x85\
+\x1f\xd7\xe9\x4e\xde\x58\xd4\x81\xe5\x6e\x00\x15\x51\xd8\xd0\x0a\
+\xb7\xad\x82\xdd\x55\x50\x55\x03\x56\x1d\x44\x05\x30\x06\xd9\x51\
+\xc8\x8d\xc3\xd8\x05\x38\x7c\x16\x5e\xcf\xe6\xef\x84\x53\x4a\xa9\
+\x00\x60\xdf\xbe\xa7\x8d\x5b\xb7\x67\xfe\x7c\xfd\xce\x67\xee\x0c\
+\xad\x66\xde\x39\xfa\x30\x47\x4e\xd8\xef\x7f\xa2\x80\x25\x42\x04\
+\xf9\x2b\x5c\x02\x88\x9a\x90\xd4\xa1\x02\x20\x80\x29\x37\xff\x5e\
+\x67\xc9\x5f\x74\x73\xc5\x2e\xa3\xfb\xf6\x3d\xad\xef\xd9\xee\xfe\
+\x21\x9a\x6a\xdc\x9a\x4c\x6d\x9d\xe8\xe8\x78\xe7\xa9\xff\x01\xb8\
+\x0e\x09\x5c\xc7\xee\x20\x79\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x05\x5b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x04\xed\x49\x44\x41\x54\x58\x85\xed\
+\x97\x6d\x4c\x53\x57\x18\xc7\xff\xa7\xbd\x6d\xa1\xd0\xde\x52\xd8\
+\xa0\x50\xcb\xdb\x14\xa8\x9d\x6e\x0b\x53\x19\x5a\xc1\xba\x0c\x1d\
+\x44\x06\x6e\x89\xe0\xcc\xdc\xcc\xa2\x92\x65\x73\x4e\xc1\x64\x73\
+\x9b\x9b\x2e\xa9\x43\xd1\x4d\x93\x1a\x8d\x73\xb8\x28\x18\x8d\x8b\
+\x32\x9d\x52\xf0\x0d\x41\x63\xb6\xa9\x38\x74\xd5\x69\x16\x28\x0e\
+\xda\xc2\x68\xa1\xbd\xe5\xde\x9e\x7d\x40\xc9\x7c\x61\x88\x46\xf8\
+\xb0\x9d\xe4\x7e\x39\xe7\x79\xf2\xfb\xe5\x79\x9e\x93\x93\x4b\x28\
+\xa5\x18\xc9\x25\x1a\x51\xfa\xff\x02\xff\x79\x01\x42\x08\x21\x23\
+\x75\x0b\xc6\x7d\x3e\x6e\x59\x6b\x67\x6b\x27\x33\x12\xf0\xc9\x5f\
+\x4e\x5e\xc5\x05\xb8\x02\x47\xa3\x23\x69\x58\x5b\x40\x08\x21\x53\
+\xd7\x4d\xdd\x60\x4a\x31\x15\x31\x02\xb3\x94\x1e\xa6\x02\x28\xa5\
+\xc3\xf2\x61\x02\x44\x99\xeb\x33\xbf\xa9\xbb\x51\xe7\xcb\xde\x94\
+\x5d\x75\x7b\x7f\x58\x5a\x40\xf2\x08\x33\xbd\x70\xfa\xee\xc2\xac\
+\xc2\xdc\x63\xd7\x8e\xb5\x9f\x6e\xaa\x7b\xef\xf6\xd9\x63\x17\x20\
+\xaf\x92\xe0\x99\xa6\x99\xfb\x52\xa7\xa4\xbe\xa4\x90\x29\xc8\xd1\
+\x9f\x8f\xec\x77\x7e\xe5\xb2\x0d\x8b\x00\x99\x47\x94\xb9\xa6\xdc\
+\x03\x91\xcf\x47\x19\x79\xb1\x80\xda\xd3\x35\x17\x8f\xfd\x74\xbc\
+\xf8\x9f\x31\x8f\x6d\x08\xd9\x22\x56\x97\x6f\xcc\xaf\x16\xc6\x06\
+\x8c\x57\x3c\x57\xa0\xef\x4a\x71\xd4\x34\xd6\xac\xa0\xdf\xd1\xae\
+\x3b\x02\xef\x3b\x30\x8b\x11\xc1\x2e\x63\xb5\x0f\x3b\x70\x86\x95\
+\x86\xd9\x8b\x76\x2d\xb2\xa5\x55\xa5\xd1\xa8\x7d\x1a\x5a\xdb\x54\
+\x2b\xa4\xad\x4e\xdb\x7c\x5f\xd6\xdd\x1b\xa1\x4b\x42\xe3\xca\x6a\
+\xcb\x6c\x73\x77\xcc\x3d\x09\x80\x0c\x69\xd2\xb3\x20\x9e\xb0\x7a\
+\xc2\x06\xf3\x61\xb3\x6b\x4c\xe5\x18\x2a\xfd\x56\x4a\xf7\xfc\xb2\
+\x87\xe6\xac\xcf\xae\x47\x1e\x24\x83\x0a\x44\x16\x47\x8e\xdf\x5e\
+\xb7\xbd\xb9\xdd\xd3\x4e\x1b\x7e\x6f\x10\x92\x3f\x4d\x5e\xfc\xa0\
+\x70\xd9\x5b\x32\x8d\xc9\x6c\xb2\x5a\x6a\x2c\x82\x66\x87\x86\x4a\
+\xb6\x31\x74\xf9\xd1\xe5\xb4\xb8\xbc\xf8\x0f\x4d\x91\xc6\x30\x50\
+\x5e\xff\x0c\x8c\xfa\x70\x54\xc6\xc6\xfc\x8d\xd5\x19\xc9\x19\x31\
+\x2d\x5d\xcd\x90\xc8\x18\x51\xc1\xb3\x05\x2b\xc8\x02\xa2\x1a\xac\
+\xdf\x49\x25\x49\x39\x73\x52\xe7\x58\xd3\x53\x5e\x98\x56\x62\x2b\
+\x16\xb9\xbc\x0e\x18\xe5\x46\x18\x38\x03\x77\xe8\xd7\x1f\x36\xd9\
+\xbf\xb6\x37\x0e\x94\xcb\x00\x40\xdc\x47\x71\xf9\xc5\x53\x8b\x2d\
+\xc9\xd1\x49\xe1\x2d\x5d\xcd\xe0\x78\x0e\x9c\xc0\x21\x35\xf1\x39\
+\x6d\xfa\xe8\xf4\x6d\x84\x90\xd9\xf4\x3e\x8f\x86\x7c\xa1\x3c\xd1\
+\xa0\x31\xac\xcd\x4e\xc9\xce\xac\xef\xad\x53\x55\x5c\xdf\x05\x10\
+\x20\x46\x16\x83\x45\xec\x62\x94\x9e\x29\xad\xb9\xf0\xc5\x45\x33\
+\xd6\x0c\x2c\x4f\x50\x88\x60\xd3\x33\xa6\x8b\x5e\xde\x9d\x58\xf4\
+\xe2\x3b\x08\x95\x29\xe0\x17\xfa\x04\x7c\xbc\x0f\x8c\x97\xe1\xd7\
+\x56\x97\x96\x36\x7e\xd6\x58\xd2\x9f\x34\x9f\x44\x8f\xd7\x8e\x37\
+\x4f\x8c\x9c\x38\x4d\x90\xf7\x6a\xf6\x75\xec\x85\x1f\x7e\x50\x11\
+\x20\x15\x49\xf0\x49\xd4\x2a\x1c\xb8\x72\xf0\x92\xd5\x66\xcd\xa0\
+\xe5\xd4\xf1\x6f\xd5\x23\x94\x52\xe8\x57\xea\x2d\xf9\x31\x79\x6f\
+\x9f\xf0\xd4\x60\x7e\xfa\x02\x70\xbc\x0f\x9c\xe0\x07\x27\x70\xf0\
+\x0b\x1c\x18\xb7\xd4\x6b\xa9\xdf\xb2\xe2\xfa\xcd\xeb\x3b\xf5\x5a\
+\xfd\x1a\x83\xca\x90\xa5\x52\xb2\x3a\xab\xfb\x28\xda\x84\x36\x80\
+\x50\xd0\x5b\xcd\x7c\x43\xfd\x26\xae\xb6\x5c\xfb\xed\xac\xfd\xcc\
+\x2c\xa7\xc5\x75\x79\xb0\xf6\x11\x4a\x29\xc8\x3c\x12\x62\x1c\x6d\
+\xac\x4f\x0c\x8a\x7b\xda\x19\xe2\xc0\xa4\x84\x34\xf8\x78\x1f\xb8\
+\x5b\x95\xe0\x03\x3c\xc4\x1d\x92\x4e\x5b\xab\xcd\xa9\x92\xb3\x89\
+\xa7\xba\x4f\xa2\x8b\x76\xf6\x41\x09\x40\x45\x14\x20\xc0\xac\x90\
+\x3c\x74\xba\xfe\xba\x71\xf6\xe6\x99\x82\x9b\x96\x3f\xeb\x07\x83\
+\xf7\x0b\x00\x40\xcc\xd2\x98\x82\x9c\x88\x9c\xcd\x97\xba\xcf\xb3\
+\x52\xb5\x04\xfa\xe8\xb1\xe0\x7a\xfb\x04\xb8\x00\x07\x8f\xd7\x8d\
+\xf3\x2d\xe7\xd1\x83\x1e\x50\x42\x21\x66\xc4\x10\x10\x00\x45\x00\
+\x54\x04\x64\x05\xbd\x0c\xbf\xdb\xdf\xdc\xd0\xde\xb0\xd0\x6e\x69\
+\xad\x7a\x10\xf8\x1d\x02\x00\x90\xf0\x7e\x42\xd9\x0c\xc5\x8c\xa2\
+\x23\x3d\x55\x8c\x52\xa5\x84\x4e\x1d\x0b\x5e\xe8\x85\x8f\xe7\xe0\
+\xea\x76\xc2\xcb\xf7\x20\x34\x58\x81\x20\x49\x10\xc4\x0c\x03\x81\
+\x0a\xf0\x05\x7c\x30\xf4\x8e\x83\xc7\xd9\xd3\x56\xd7\x71\xea\x83\
+\x16\x8b\xbd\xfc\x41\xe1\xf7\x08\x10\x42\x48\xfc\xbb\xf1\x07\x8d\
+\xb2\x29\x33\xab\xf9\x43\x10\x44\x02\xd4\x21\x6a\x28\x83\x54\x60\
+\xc4\x62\x84\xc9\xc3\xa0\x92\x87\x41\x2e\x0d\x81\x84\x61\xc0\x07\
+\x78\x68\x79\x1d\x9c\x76\x57\xd7\xee\x6b\xbb\x3f\xb6\x6f\x69\x2d\
+\x1b\x0a\x1c\xb8\xeb\x31\xa2\x94\x52\x52\x40\x5e\x43\x18\xaa\x8d\
+\x62\xd3\xa4\x7a\xf1\x49\x78\x38\x0f\x54\xf2\x30\x68\xd8\x68\x68\
+\x58\x0d\x22\x42\x9f\x00\x1b\xcc\x42\x2e\x92\x23\xbc\xf7\x49\x9c\
+\x6b\x3a\xe7\xae\xb0\x55\xae\xb3\x6f\x1d\x3a\xfc\x9e\x0a\xf4\x6f\
+\xce\x21\x21\x1a\xa5\x66\x7f\xaa\x3f\x35\xd3\xad\xed\x10\x2b\xa3\
+\x14\x18\xa5\xd6\x41\xa7\x8e\x45\xb4\x2a\x06\xba\x60\x1d\x14\x94\
+\xc5\xd6\xea\xad\xad\x95\x17\x2a\x96\xb4\xef\x70\x54\x3c\x0c\x7c\
+\x40\x01\x00\x20\xb9\x84\x89\x08\x0f\x2f\x9f\x22\x35\xe6\x3c\x95\
+\x98\x10\x12\x14\x27\x45\x6c\x44\x3c\xf4\xca\xb1\x10\xb8\x00\xd6\
+\xfe\x68\x6e\xb2\x5e\xb5\xe6\x79\x76\x76\x0f\x7a\xd5\x1e\x4a\x00\
+\xe8\x9b\x09\xc5\xbc\xd0\xd7\xe3\x65\xf1\xcb\x5e\x49\xc8\x33\xc4\
+\x6b\xe3\x71\xe2\xc6\xf1\xb6\xfd\x97\xbf\xaf\x74\x79\x5d\x25\x74\
+\x2f\xed\x7e\x14\xf8\xa0\x02\xfd\x41\xf9\x44\xce\x06\x2b\xcd\xb2\
+\x80\x2c\xd2\x41\x1d\x4b\x84\x5d\x81\xe6\x47\x05\x0f\x49\xe0\x71\
+\xae\x11\xff\x35\xfb\x1b\x78\xc6\x1e\x42\x1c\x3d\x05\xe2\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x14\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\x0d\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd6\x06\x0e\x12\x36\x16\x05\x46\x84\x3b\x00\x00\x03\x3e\x49\x44\
+\x41\x54\x78\xda\x7d\x94\x5f\x68\xdb\x55\x14\xc7\x3f\xe7\x26\xeb\
+\xd0\xe9\x56\x5b\x3b\xe7\x64\xd6\xcd\xcd\xaa\xb3\x38\x98\x32\x3b\
+\x1f\xb4\xec\xd1\x7f\x30\x84\x31\xa6\x6e\x2d\xa2\x2f\xbe\xc4\xe1\
+\x8b\xec\x29\x14\xf4\x45\x03\x0a\x83\xc1\xcf\x1a\x84\x3d\x0c\x24\
+\x52\x65\x3e\x08\xb1\x6a\x1f\x9c\x1d\x48\x42\x85\x32\x87\x5d\x96\
+\x6e\xb3\xab\x5d\xfb\x4b\x9a\xa6\xc9\xaf\xbf\xdc\xe3\xc3\x2f\x69\
+\x92\x36\xeb\x85\x03\xf7\xfe\xce\xbd\x9f\xdf\xb9\xe7\x7c\xcf\x95\
+\x42\xc9\x72\x6f\x1b\x2d\x87\x02\x15\x05\x5b\x01\xdf\x57\x3c\xbf\
+\x82\xb7\xe2\x53\x2a\xfb\x64\x6e\xcd\xd1\xbb\xa7\x0b\xcf\x2a\x65\
+\xcf\x52\x2c\x79\x78\xbe\x10\x66\x83\x21\x80\x11\xb0\x12\x2c\x8c\
+\x08\xc6\x08\xe1\x90\xe1\x9e\xcd\x9b\xf8\xfe\x97\x89\x75\x67\x4c\
+\x6d\x72\x63\xc6\xe5\xf4\xd0\x70\x93\xf3\xc6\x8c\xcb\x47\x43\xc3\
+\x08\x20\x22\x88\x80\x20\x18\x63\xd8\xd1\xb5\x8d\x97\x0e\x3d\xcd\
+\xa1\x67\xf7\xb1\xf7\xb1\x9d\x3c\xb2\xa3\x8b\x87\x1f\x7a\x10\xa9\
+\x5d\xf9\xf4\xd0\x30\x9f\x9d\x19\xe4\x87\xd1\x09\x5e\xeb\xef\x65\
+\xf7\x45\xf3\xfb\x53\xb4\xbd\x70\xb7\xe8\x27\xf1\x2e\x25\x0f\x2c\
+\xf4\xb9\xf9\x22\x85\xa2\x87\x55\x8b\xad\x68\x1d\x08\xac\xc2\x00\
+\xee\xbb\x60\x16\xce\xf6\x9d\x6b\xdf\xb3\x65\x2f\x82\x34\xe4\x55\
+\xb9\xe3\xcd\x71\xe2\xb7\x63\xee\xf8\xf3\xb7\x1f\x28\x14\x57\x02\
+\x98\x55\xd4\x6a\x73\x0e\x6b\x30\x80\xe2\x32\xed\x07\xbb\x0f\xb3\
+\x9d\xed\xeb\xa2\x9b\x65\x96\xe2\x32\xed\xbe\xaf\x84\xc3\x82\xad\
+\x84\xb0\x58\xd4\xe8\x06\x45\x29\xc3\x18\x63\x6c\xe4\x37\x21\x21\
+\x2c\x21\xac\x28\x56\x83\xcf\x77\x07\x96\x02\xe0\x34\xd3\xeb\x5c\
+\xbb\xd8\x05\x25\x08\x1b\x83\x15\x65\xeb\xfd\x61\x62\x4e\x82\x93\
+\xc7\x5e\x6d\x0d\xd4\x6a\x04\xe3\x8c\x33\xa5\x53\x4d\xbe\x0e\xe9\
+\x60\x91\x45\x28\x43\x28\x64\x10\x85\x98\x93\x60\xf0\xf8\xeb\x4c\
+\x65\xff\x6d\x06\x9a\xa8\x89\x01\x07\x6a\x22\xcc\xf8\x19\xb4\xac\
+\xab\xa2\x94\x36\x21\x67\x72\xe4\xc8\x41\x19\x7a\xe2\x9d\xa3\xd5\
+\xa3\xa9\x97\xb3\xe9\xc8\xbe\xdd\x3b\x9b\xab\x6c\xce\x18\xe5\x28\
+\xb0\xb9\xba\xed\x51\xa0\x42\xeb\xe4\x5c\x6f\x98\x27\xe0\xef\x53\
+\xf3\x62\x55\xeb\xc2\x06\xa0\xc0\x05\x92\xc0\x16\xa0\x13\x58\x0a\
+\x72\x49\x09\x28\xac\xb1\xce\xaa\x5d\x06\x16\x89\x8b\x40\xc8\x48\
+\x73\xa7\xf0\x05\x6f\x91\xe1\x3c\xdf\x00\x77\x5a\x40\xd6\xda\x77\
+\xc0\x9f\xc4\xb3\x1f\xce\x0f\x9c\x8d\x27\x10\x69\xe8\xe5\x98\x93\
+\xc0\x5a\xeb\x1b\x63\xde\xe6\x5d\x2a\x9c\xe7\x1d\xde\x68\xb8\xfe\
+\xda\xf1\x33\x70\x85\x14\x86\x48\xcc\x49\xf0\xc1\xe0\x9b\xfc\x75\
+\xe5\xfa\xfa\x4e\x39\x72\xf8\x19\xac\x2a\x5b\xdf\x0f\xc7\xe9\xe4\
+\x24\xaf\xb4\x80\xfe\x0a\x5c\x25\x85\xa1\x3f\xf3\x49\xde\x45\x21\
+\x3d\x79\x8d\xfd\x4f\x74\x37\x03\x7d\x05\xcf\x53\xac\x2a\xaa\xca\
+\xb6\xf7\x36\x7d\x4d\x07\xa7\x38\x02\xd4\x9e\xb8\x4b\xc0\x3f\xa4\
+\x80\xfe\xe9\xcf\xf3\xae\x2a\x41\xdb\x69\x20\xb7\xa6\xa2\x54\x2a\
+\xa0\x5a\xef\x59\xf7\x9c\x37\xc0\x3c\x71\x7e\x02\x16\x80\xb1\x3a\
+\xec\x66\xac\xe0\xae\x96\x40\x04\x45\x83\xe7\xae\xb1\x28\x1f\x7f\
+\x3a\x8c\x06\xb2\x46\x10\xf2\xf9\x02\x91\x1e\x67\x80\x1c\x71\x7e\
+\x04\xb2\x01\x2c\xd2\xe3\xb8\xc1\x4f\x6d\x20\x37\xf5\xf9\xf2\xab\
+\x6f\xab\x4a\x29\x59\xac\xb5\x44\xa2\x0e\xc5\xb2\x65\x24\x99\x26\
+\x5f\xf4\xc9\x2d\xad\x10\x89\x3a\xcc\xe7\x3d\x46\x92\x69\xfe\x73\
+\x4b\xcc\x2e\x2c\x13\x89\x3a\xdc\x9a\x5b\x62\x24\x99\x66\xfa\x76\
+\x9e\xec\x4c\x9e\x48\xd4\xe1\xda\xcd\x1c\x23\xc9\x74\x3d\x87\x16\
+\xb8\x38\x3a\x41\x7f\xdf\x7e\x54\x83\x9c\x58\xab\x8c\x5d\x9e\xe4\
+\xc5\x83\x3d\x28\xa0\xaa\x58\xab\xfc\x91\xba\xca\x73\xbd\x8f\x63\
+\xd5\xae\xee\x4b\x4f\x66\xe8\x7d\xb2\x9b\xff\x01\xd3\x50\xa1\x34\
+\xc6\x83\x32\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x03\xa5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x14\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\x0d\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd6\x06\x0e\x12\x36\x2e\x2d\x44\x3c\xa5\x00\x00\x03\x32\x49\x44\
+\x41\x54\x78\xda\x8d\x95\x5f\x68\x9b\x65\x14\xc6\x7f\x6f\x12\x93\
+\xae\x8b\x2e\x6e\x76\x30\x4b\xf1\x4f\x27\x56\x46\x6c\x41\x3b\x94\
+\x59\x58\xf1\x0f\x08\x3a\x41\x26\xbd\x08\x68\x57\x06\x3a\x98\x62\
+\x10\x11\x65\x17\x52\x77\x51\x2f\x46\xe7\xc5\xee\xc2\x5a\x44\xdc\
+\x40\x28\x88\x8a\xde\x68\x06\xa2\x22\x3a\x6c\xcd\x5c\x5b\xbb\xb1\
+\xae\xb5\x32\xc3\xb2\xa5\x25\xcd\xf2\xe7\x7d\xcf\xf1\xe2\xfb\x92\
+\x36\x6d\x37\x3d\xf0\xc0\xcb\x39\xe7\x7d\xbe\xf7\x9c\x87\x87\xcf\
+\x14\x4a\x42\x73\x18\x04\xf8\x2a\x9d\xa1\xf7\xf1\x5d\xa8\x2a\xaa\
+\x20\xa2\x7c\xff\xcb\x24\x7b\x1e\x79\x10\x05\x54\x15\x11\xe5\xe7\
+\xf1\x19\x1e\x8d\xb7\x23\x2a\xf5\xbe\x89\xc9\x59\xe2\x1d\xf7\x10\
+\xc0\x8f\xb7\x8f\x9e\xe4\xe9\x27\xe2\xa4\x7f\xfa\x03\x63\x0c\xc6\
+\xc0\x07\xc7\x3f\xa6\xa7\xfb\x21\x7e\x38\x3b\x5d\x6b\xe3\xc3\x13\
+\x9f\xd2\xdd\xb9\x93\x5f\x33\x17\xeb\xb9\x8f\x52\x9f\xf1\x70\xc7\
+\xbd\x64\xa6\x2e\x43\xa1\x24\x88\x08\x73\x7f\x5f\x23\x39\x98\x62\
+\xa9\x68\x59\x2a\x5a\x16\x97\xab\xf5\x1c\x09\x46\x48\xa0\x24\xf8\
+\x8d\x04\xb1\xe4\x60\x8a\x85\x6c\x81\xf9\x7f\x96\x98\xbb\xb2\x54\
+\xef\xbb\xb4\xb0\x88\xa9\x8d\x0c\x50\xb6\x60\xad\xa2\x28\xa2\x02\
+\x0a\xb1\x57\xc3\x23\x6c\xa1\x9f\x3d\xc0\x39\x60\x8e\x71\xa0\x77\
+\x61\xb8\x90\x57\x05\x51\x41\x14\x44\x04\x83\x59\x19\x19\x20\x18\
+\x04\x63\xbc\xb3\xc1\x78\x64\x5b\xe9\xe7\x19\xe0\x4e\xa0\x07\x68\
+\xa7\x0b\x48\xb7\x26\xa3\x31\x45\xbc\x66\x55\x0c\x06\x85\x46\xc2\
+\xaf\xcf\x64\xea\xe7\x2d\xaf\xdd\x36\x4a\x0b\xfd\xec\x03\xb6\x02\
+\x51\x1f\x4f\x01\x1d\x74\x11\x24\xdd\xf6\xce\x1d\x31\x51\xef\xf3\
+\xbf\x4f\xcd\x22\xa2\x2b\x23\xbf\x75\xf4\x24\xc7\x8e\x0c\x10\x08\
+\x04\x0c\x07\x19\xe5\x2e\x5e\xe6\x05\x20\xc2\xc6\xf1\x1d\x30\xcd\
+\x38\x01\x7a\x93\xad\xa9\xfc\xe1\x81\xfd\x9c\x9b\x5e\x23\x0a\x10\
+\xe2\x10\x9f\xf0\x3e\x4a\x06\xe5\xcf\xff\xc0\x09\x94\xc3\x8c\xd4\
+\x44\xb9\x30\x7f\xbd\x51\x94\xc0\x9b\x81\xd3\xb4\xd2\xc7\x4b\x40\
+\x13\xff\x2f\xbe\x01\xce\x33\x3a\xf3\xc6\xb5\x03\xac\xdd\x21\x51\
+\xfa\x78\x12\x58\x06\x72\xc0\x66\x9f\xb8\x69\xd5\x0e\x6b\xc8\xf9\
+\xe8\x06\x6e\xa7\x5f\x15\x9c\x28\xa1\x06\xc2\x30\xc7\xf9\x92\x2e\
+\x5f\xe6\xbd\xc1\xf7\x82\xb8\xb2\xab\xc9\x8e\x09\x1b\x82\x81\x20\
+\x00\x76\xcc\x82\x72\xc6\xbf\x39\x3e\x79\x61\x9e\x07\xee\xbb\x7b\
+\x65\x87\xab\xe1\x44\x60\x08\x6d\xd7\x76\x35\x62\x1a\xb0\x4d\xb7\
+\x69\xa7\x76\x2a\x43\xe8\xf4\x6c\x8e\xc9\x4b\x39\x92\x83\x29\x32\
+\x33\x59\x3e\xff\x76\x62\xcd\x0b\xa9\x3f\x06\x22\xb0\x9b\xdd\xec\
+\x30\x3b\xd6\xd5\xdb\x68\x63\x22\x32\x81\x73\x82\xa8\x92\x3c\xf8\
+\x22\xc3\xa9\x31\x5e\xe9\x7b\x6e\x63\x42\xf0\xf6\xd6\x43\xcf\x4d\
+\xcb\xa7\x9a\x4e\x61\x45\x10\x51\xae\x2e\x96\x49\xec\x7f\x16\xeb\
+\xdc\x2d\x08\x23\x1e\xe1\x76\xb6\xaf\x2b\x65\xc9\x42\x04\xc4\x29\
+\x56\x1c\xe2\x3c\xeb\x29\x6b\x44\xf9\x22\x9d\xe1\xf9\xde\x38\x00\
+\xcd\x9b\xc8\x9f\xbd\xfc\x63\xec\xfe\xcd\x3b\x31\x98\x7a\x8f\xa2\
+\xe4\x2a\x57\x69\xde\x44\x3e\x14\x32\x94\x8a\x9e\xef\x45\x14\x5d\
+\xad\x72\xcd\x29\x35\xd2\x96\x28\x53\xa7\x33\xaf\x3f\x76\xb3\x01\
+\x5a\xa2\x4c\x35\x45\xc2\x94\xca\x96\x42\xd1\x79\xa4\x6e\x95\xf5\
+\xfe\xba\x92\x67\x38\x35\xc6\xb1\x23\x03\xf5\x4b\xb5\xdc\xd0\xbb\
+\x03\x58\x07\xd6\x3a\x2a\x55\x47\xd5\x0a\x55\x67\x71\x4e\x28\x95\
+\xaa\xe4\x16\x97\xb9\x51\xaa\x22\xaa\x8d\x4e\xd9\x28\x04\x7c\x32\
+\xc5\x5a\xa1\x62\x2d\x95\x8a\x63\x21\x7b\x9d\xf3\x33\xf3\xeb\xfa\
+\x43\xb7\x72\x95\x02\xa2\xfe\x41\x41\xfc\x5f\x80\x75\xc2\x8d\x72\
+\x95\x7d\x7b\xe3\x54\x44\x29\x57\x84\x62\xa9\x42\xc5\x1a\xfe\x05\
+\x8b\x32\xda\x2b\x1a\x37\x6f\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x07\x52\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x06\xe4\x49\x44\x41\x54\x58\x85\x95\
+\x97\x5b\x6c\x54\xd7\x15\x86\xbf\xbd\xe7\x3e\x36\xd8\x63\x6c\x07\
+\x5f\x12\x1b\x4c\xc1\xc8\xb4\xa6\x31\x2e\x86\x84\x0a\x41\xdb\x34\
+\x90\xb6\x6a\xab\xa4\x55\x69\x68\x45\xaa\x4a\x49\x55\x35\x25\x4a\
+\x22\xd1\x4a\x7d\x6b\x4a\x5b\x54\xf5\x92\xbc\x44\x4d\x9e\xda\xbc\
+\xb4\x51\x91\x20\x6e\x44\xc3\xc5\xb5\x10\x01\x13\x42\x9c\x02\xa1\
+\xc4\xb1\x01\xd9\x06\x6c\xcf\x78\xec\xf1\x9c\x73\xf6\x3e\x67\xf7\
+\xc1\x67\x86\xf1\x78\x06\xe8\x96\x7e\xcd\x96\x66\x9d\xf5\xff\xeb\
+\xdf\xeb\x68\x9f\x25\x8c\x31\xdc\xcb\x12\x42\x08\x20\x0c\x54\x00\
+\x11\x01\xd1\x30\x2c\x03\x70\x60\xd2\x80\x05\xd8\x40\x06\x70\xcc\
+\x3d\x26\x0e\xde\x03\xb1\x04\xaa\x23\xb0\xa2\x1e\xb6\xd5\xc2\x97\
+\xe3\xd0\x20\xa0\x32\x02\x31\x33\xcf\x6a\xb9\x30\x6b\xc1\x8d\x49\
+\x38\x7c\x13\x8e\x0a\x21\x3e\x01\x52\xc6\x18\xef\x8e\xf9\xcb\x09\
+\xf5\x2b\x5e\x1a\x85\xb5\xab\xe0\xb9\x7a\xd8\x5c\x1b\x89\x2c\x6f\
+\x6f\x6f\x97\x2b\xd7\xad\x63\x49\x55\x15\xd1\xca\x4a\x3c\xa5\x98\
+\x9b\x98\x20\x3d\x39\xc9\xf5\x4b\x97\xb8\x38\x3c\xec\x8d\x7a\xde\
+\xad\x29\x38\x39\x04\xbf\xb6\xe0\x22\x90\x2e\xe7\x48\x49\x01\x7e\
+\xd5\x0d\xab\xe1\xb9\x26\x78\x7c\x65\x5d\x5d\xf3\xb7\x9f\x7f\x9e\
+\x96\xce\x4e\xc2\xe1\x30\xc6\xb6\x71\x0b\xa0\x2d\x2b\xbf\xcf\x24\
+\x93\x0c\x0f\x0c\x70\xba\xaf\x8f\x73\x73\x73\x63\x37\xe1\x6f\x57\
+\x60\x3f\x30\x56\xca\x8d\x45\x02\x84\x10\xa1\x20\xac\x5c\x0b\xbf\
+\x5d\x03\x5f\xfc\xca\x9e\x3d\x91\x4d\x4f\x3c\x41\x65\x75\x35\xae\
+\x65\xa1\x8b\xc8\xcb\xc1\x99\x99\xe1\xa3\x93\x27\x39\x76\xf6\xac\
+\xfd\x21\x1c\xbf\x0c\x3f\xd1\x30\x64\x8c\x51\x65\x05\x08\x21\x64\
+\x08\xd6\x7c\x1a\x5e\x7b\xb0\xbe\x7e\xe3\x53\x2f\xbd\x24\x56\x74\
+\x75\x61\x6c\xfb\xee\xc4\xbe\x0b\xc5\x71\xb7\x2e\x5f\xe6\x44\x7f\
+\xbf\x77\x52\xeb\xf3\x97\x60\x97\x82\x8f\x0a\x9d\x90\x85\x67\x2e\
+\xa0\xb1\x1d\x0e\x3c\xd4\xd6\xb6\xf1\xe7\x07\x0f\x8a\xb6\xee\x6e\
+\x8c\x52\xb8\x4a\xe1\xe5\xe0\x38\xb7\x7f\x0b\xe0\x16\xc7\x29\x85\
+\xeb\x38\x54\x35\x34\xb0\xb5\xbb\x5b\x6e\x81\xf5\xab\xe0\x8f\x02\
+\x1a\xfd\xfe\x5a\x28\x00\x58\xba\x1a\x5e\xf8\x6c\x55\xd5\xf6\x67\
+\x5e\x79\x45\x54\x2c\x59\x52\x92\x68\x81\x08\x9f\xd4\x2d\x14\x57\
+\x1c\xab\x14\xb1\xda\x5a\x3a\x1b\x1b\x45\x37\x6c\x69\x83\x9f\x01\
+\x4b\x17\x08\x10\x42\xc8\x28\x74\x34\xc1\x37\x76\xed\xdb\x17\x5e\
+\xd6\xdc\xbc\x28\xc9\x82\xca\x72\x28\x41\xe8\x16\x8b\xf2\xf7\x55\
+\x2b\x57\xd2\x19\x0e\x87\x9b\xe0\xab\x51\xe8\xf0\x1b\x3d\xef\x40\
+\x75\x1b\xec\x5d\xdf\xd1\xd1\xb4\xfe\xb1\xc7\xa0\x84\x95\x85\xb8\
+\x93\xb8\x45\x2e\xf8\xc0\x18\x12\xad\xad\x6c\x84\xc6\x56\x78\x11\
+\xa8\x06\x90\x42\x08\x11\x86\xd6\xfb\xa0\xe7\x6b\x4f\x3f\x8d\x70\
+\xdd\xc5\x84\xa5\x88\xca\x89\x2b\xe1\x54\x6e\x1f\x8c\x46\xb9\xbf\
+\xb2\x92\x26\xe8\x0a\x43\xab\xf0\x6d\x08\xd7\xc3\xd6\xfa\x58\xac\
+\xa1\xad\xa7\xa7\x7c\x65\x65\x48\xcb\xc6\x14\x39\x62\xfc\xd8\x60\
+\x3c\x4e\x3b\x34\xd4\xc1\x36\x20\x2c\x81\x8a\x3a\xd8\xd1\xb5\x79\
+\xb3\x0c\x48\xb9\x88\xe8\x6e\x55\x96\xb2\xbe\xf8\x98\x0a\xfb\x42\
+\x86\x42\xb4\x82\x5c\x06\x3b\x81\x0a\x09\x44\x62\xd0\xdc\xb4\x62\
+\x05\x14\x9d\x9b\xf1\x13\x1b\xa5\xf2\x20\x07\xc7\x59\x88\x52\x31\
+\x45\xb1\xc2\x71\x10\x5a\x13\x96\x92\x4a\x68\x00\x22\x52\x42\x3c\
+\x04\xf1\x44\x22\x51\x32\x81\xc8\xc1\x4f\x90\x4f\xa4\x14\xd2\x47\
+\x36\x93\xe1\x8d\xea\xf7\x19\xcb\x4e\x21\x1c\x87\x40\x11\x82\x4a\
+\x11\x50\x8a\xa0\x52\x84\x94\x22\x2a\x04\x71\x88\x4a\x88\xcb\x10\
+\xd4\xc4\x21\x1a\x8f\xc7\xf3\x6a\x8d\x0f\x0a\x7e\x45\xa1\x18\x9f\
+\x58\x38\x0e\xd2\x71\x98\xb1\x66\x38\xf2\x48\x92\xbd\xdf\xe9\xa7\
+\x37\x31\x84\x9d\xcd\x12\xf0\x49\xf3\x28\x10\x14\x32\x86\x04\x44\
+\x42\x50\x13\x14\x20\x24\x88\xe9\x8b\x17\x31\x9b\x36\x2d\xae\xbc\
+\x84\x0b\x39\xc8\x9c\x53\xb3\x19\x76\xd6\x3d\xca\x93\xdb\xbe\xc7\
+\x0b\x35\xcf\xf2\xce\xf1\x53\x3c\xf9\x6a\x90\xd6\xb4\x40\x4a\x89\
+\x31\x06\x03\x08\xcf\x23\xe0\xba\x48\xcf\x23\x08\x42\x80\x90\x0e\
+\x4c\xda\x60\x5d\xed\xed\x25\x73\xe5\x4a\x9e\x3c\xe7\x86\x28\x38\
+\xe7\x42\xdb\xa5\x52\xe8\xb1\x31\xa6\xfb\xfb\x49\xbe\x73\x14\x5c\
+\x43\x4b\xa8\x85\xdf\x7d\xfe\x65\x76\xee\x7e\x96\xdf\x1f\x88\x71\
+\xb0\xc7\x66\x2e\x9b\x25\x60\x59\x04\x2d\x8b\xa0\xe3\x10\x74\x5d\
+\x42\x40\x06\xb2\x0e\x4c\x06\x0c\xc4\x5a\xe0\xbb\xab\x1d\x67\x99\
+\xd7\xdf\x8f\x4a\x26\x09\x84\x42\x84\x2a\x2a\x16\x34\x99\xf1\xc5\
+\xb8\xa9\x14\xb3\xe7\xcf\x93\x3c\x71\x82\xcc\xe0\x20\x26\x95\x22\
+\x2b\x61\x64\x77\x27\x9b\x9a\x37\x93\x72\x53\x54\xc5\xaa\x59\xdb\
+\xb8\x8e\xd3\x2b\x92\x1c\x5e\x73\x83\x07\x2e\x18\xea\x32\xf3\x9f\
+\x53\x01\x1f\xef\xc2\xf8\x15\xf8\x73\x10\xb0\x1c\x18\xd3\xf0\xa9\
+\x40\x3a\x4d\xea\xd0\x21\xa6\x0f\x1d\x22\x98\x48\x50\xd1\xd6\x36\
+\xff\x46\x58\x56\x1e\x6a\x62\x02\x3c\x2f\x9f\x08\xe6\x13\x7b\x5a\
+\x63\x19\x0b\xcb\xb3\xb0\x5d\x0b\x29\x04\x3d\xed\x5b\xb8\xb4\xb4\
+\x96\x3f\x35\x9d\xa2\xe7\x1f\x69\x1e\xef\x35\x24\x3c\x30\xc0\x2c\
+\xdc\x00\xac\x20\x30\x37\x0e\x6f\x8d\xc2\xc3\xed\x20\xa3\xb9\xdb\
+\x31\x99\x24\x3b\x30\x70\xfb\xaa\x2e\x20\x2b\x5e\x21\x40\x69\x8d\
+\xed\xd9\xd8\x9e\xc5\x55\xeb\x2a\x83\xe9\x0f\xc8\x5a\x59\xec\x80\
+\x4d\x64\x59\x05\x27\x76\x58\x0c\xf4\xb8\xfc\xf0\x55\x4d\xfd\x55\
+\xbc\x71\x78\x1b\x98\x0b\x02\xf6\x75\x38\x3a\x04\x13\x3d\x50\xbf\
+\xb4\x88\xb0\x70\x89\x32\xff\x45\x0c\xb8\xda\xc5\xf2\x2c\x46\xec\
+\x11\x7e\x73\x7d\x3f\x3a\xab\x91\x59\x81\xb4\x04\xc2\x16\x04\x62\
+\x11\x32\xb5\x2e\x07\x7e\x2a\xa9\x3f\xe3\x5a\xc3\x6f\xbb\x17\x98\
+\x44\x05\x8d\x31\x46\x08\x31\x34\x0a\x67\xc7\xe0\xd1\x07\xee\x40\
+\x5c\x4e\x58\x08\xf0\xb4\x8b\xed\x5a\xfc\x33\xd9\x8b\x52\x0a\xa9\
+\x25\x42\x8b\x79\x28\x81\xd0\x10\x14\x01\x4c\x54\x72\xe3\x73\x3a\
+\x12\xee\xf6\x5e\xd3\x67\xdd\xdd\xb9\xdb\x30\x39\x08\xbf\xea\x83\
+\x5b\x29\xdf\xe6\x42\x84\xca\xec\xf3\x30\xe0\x2a\x8d\xe5\xd9\x5c\
+\x98\xbd\xe8\x13\x83\xd0\x80\x06\xa1\x05\x2c\xfc\x1a\x74\x85\x8b\
+\x11\xae\x7f\x1d\x1b\x63\xbc\x2c\x7c\x30\x02\x6f\x9d\x03\x9d\xab\
+\xaa\x1c\x71\xa8\x08\x01\xe6\x8f\x60\xcc\x19\x65\x3c\x3b\xea\x93\
+\x0b\xc8\x39\xa0\x7d\x56\xed\x61\x4f\x2b\xad\xc7\xbd\x43\xf6\xeb\
+\x6a\x83\xf3\x86\xee\x2d\x9c\x0b\xa6\xdf\x83\x5f\x44\x61\x55\x33\
+\x3c\xb4\xf1\x0e\xb6\x2f\xea\x01\xc0\x53\x9a\xe3\xa9\xe3\xb7\x6d\
+\xf7\x1d\x10\x1a\x8c\x36\xc8\x94\x0b\x33\x9e\xed\x0c\xe8\x1f\x3b\
+\x47\xf4\x5f\x8d\x31\x19\x28\x18\x4c\xfc\x5e\xb8\x7e\x1a\x7e\x14\
+\x86\xbf\xc4\xa1\xa3\xeb\x2e\xc4\xb9\x15\x02\x46\x26\x46\xb0\x52\
+\x1f\x93\xa0\x9a\xb4\x4e\xe7\xab\x37\x69\x8f\xc0\x94\xc7\x92\x53\
+\x7a\x62\xf8\x84\xfa\x96\x67\xd1\x67\x8c\xd1\xb9\x67\x17\x4c\x46\
+\xc6\x18\x57\x08\x71\xa1\x1f\x76\x69\x78\xf9\x29\xd8\xb8\x1d\x82\
+\xb2\x88\xb0\xd4\x5b\x90\xb5\xe7\xd8\x10\xdf\xcc\x0c\x69\x86\xac\
+\x8f\xb9\x3e\x75\x8d\xf0\x27\x1e\x35\xe3\x9e\x09\xbd\xe9\x0c\xfe\
+\xe7\x86\xf7\x03\x0f\xde\x2f\x24\x5f\x24\xc0\x17\xa1\x84\x10\x1f\
+\xf6\xc3\x2e\x07\x7e\x79\x1a\xbe\xb4\x07\x6a\x5b\xca\x54\x9f\x4b\
+\x52\x1d\xac\x66\x43\x45\x37\x53\x62\x02\x73\xcd\x25\x79\x69\x94\
+\x55\x47\xb2\x99\x99\x33\xea\xf0\x39\x78\xd1\xc0\x35\x63\x8c\xbb\
+\xe8\x61\x63\x4c\x49\xf8\x85\x26\xe2\xb0\x7d\x2b\x1c\xdb\x07\x37\
+\xfb\xc0\xa4\x4b\xe0\x32\x98\x2f\xfc\xe1\x61\xf3\xef\x9b\x7d\x66\
+\xef\x9b\xcf\x98\xcf\x7c\xbf\xca\xe9\xaa\x12\x67\xa2\xf0\x08\x90\
+\xc0\x9f\x3f\x4a\xa1\xec\x6c\x98\xb7\x5b\x88\x00\x50\x13\x83\xb5\
+\xed\xb0\xe3\x7e\xd8\x5a\x07\x75\xf7\x41\xa4\x01\x62\x02\xf8\x2f\
+\x38\xef\xee\x7f\x70\x79\x43\xe5\x72\xef\xf4\xeb\xff\x3a\x76\x73\
+\xc0\x39\xa0\x60\x00\x98\x2a\x59\x75\x61\xfe\xff\x73\x3c\x8f\x02\
+\x95\x40\x2c\x0c\x89\x00\xd4\x00\x38\x60\x57\x7c\x3d\xf6\xcd\xec\
+\x7b\xce\xdf\xd5\x88\x3b\x08\xcc\xde\xeb\x78\xfe\x3f\xf6\xc4\xc4\
+\x8e\xbd\xe1\x4a\xc2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\xe9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x06\x7b\x49\x44\x41\x54\x58\x85\x9d\
+\x97\x5d\x68\x5b\xe7\x19\xc7\x7f\xcf\x7b\x3e\xf4\x69\xcb\xb2\x25\
+\x39\x8e\x9d\xd6\x89\xb3\xc6\xc1\x2d\x49\xea\x85\x7c\x74\x0d\xa1\
+\x65\x5b\xdb\xb5\x1d\x0c\x56\x06\xbe\x4b\x2f\x46\xb6\xc1\x60\xa5\
+\x1b\x64\x85\xdd\xad\x5b\xd9\xae\xc6\x7a\x35\x06\x1d\xdb\xdd\x28\
+\x14\xd2\xe6\x62\x6b\x9a\x85\x10\xb6\x90\xa4\x24\x6d\xec\x24\x1d\
+\x49\x1a\x32\xbb\x76\x2c\xcb\xb6\x6c\xeb\xe8\xbc\x3a\xe7\xdd\x85\
+\x8f\x1c\x59\x96\xdc\x6c\xaf\x78\x78\x0f\xd2\xa3\xe7\xff\x7b\xfe\
+\xef\x7b\xbe\xc4\x18\xc3\xc3\x0c\x11\x11\xc0\x05\x52\x40\x4c\x20\
+\xee\x42\x0f\x80\x0f\x45\x03\x1e\x50\x05\x96\x01\xdf\x3c\x64\x61\
+\xfb\x21\x84\x15\xd0\x15\x83\xed\x05\x78\x26\x07\xcf\x25\xa1\x4f\
+\x20\x1d\x83\x84\x59\x55\xf5\x02\x58\xf2\x60\xba\x08\xef\xcf\xc0\
+\x69\x11\xb9\x0d\xcc\x1b\x63\xc2\x4d\xeb\xb7\x03\x8d\x3a\xee\x8c\
+\xc3\xee\x9d\xf0\x5a\x01\x0e\xe7\x62\xb1\x2d\xc3\xc3\xc3\x6a\xc7\
+\xe3\x8f\xd3\x91\xc9\x10\x4f\xa7\x09\xb5\x66\x65\x76\x96\xc5\x62\
+\x91\x7b\xd7\xaf\x33\x71\xe7\x4e\x38\x19\x86\xf7\xe7\xe0\xfc\x2d\
+\x78\xcb\x83\x09\x60\xb1\x9d\x23\x2d\x01\xa2\xae\xfb\x1e\x83\xd7\
+\xfa\xe1\xbb\x3b\xf2\xf9\x81\xef\xbd\xfe\x3a\x8f\xee\xd9\x83\xeb\
+\xba\x98\x6a\x95\xa0\x21\x6a\x9e\xb7\x76\xbc\x5c\x2a\x71\xe7\xe2\
+\x45\x2e\x9c\x3d\xcb\xc7\x2b\x2b\x53\x33\xf0\xd7\x7f\xc3\xaf\x81\
+\xa9\x56\x6e\x6c\x00\x10\x11\xc7\x86\x1d\xbb\xe1\x37\xbb\xe0\xeb\
+\x2f\x1d\x3b\x16\x3b\xf4\xca\x2b\xa4\xbb\xba\x08\x3c\x8f\x5a\x93\
+\x78\xbb\xf0\xcb\x65\x6e\x9c\x3f\xcf\x47\x97\x2e\x55\x3f\x85\x33\
+\x37\xe1\xc7\x35\xb8\x65\x8c\xd1\x6d\x01\x44\x44\x39\xb0\xeb\x09\
+\xf8\xe3\x93\x85\xc2\x81\x57\xdf\x7c\x53\xb6\x8f\x8e\x62\xaa\xd5\
+\x2f\x17\x8e\x5c\x68\xce\xbb\x7f\xf3\x26\xff\x38\x77\x2e\x3c\x5f\
+\xab\x5d\xb9\x0e\x63\x1a\x6e\x34\x3a\xa1\x1a\xd7\x5c\x60\xeb\x30\
+\xfc\xf6\xa9\xa1\xa1\x03\x6f\xbc\xf7\x9e\x0c\xed\xdf\x8f\xd1\x9a\
+\x40\x6b\xc2\x7a\xf8\xfe\x83\xb9\x21\x82\xe6\x3c\xad\x09\x7c\x9f\
+\x4c\x5f\x1f\x47\xf7\xef\x57\x4f\xc3\xde\x9d\xf0\x3b\x81\xad\xd1\
+\xfe\x5a\x0f\x00\x74\x3e\x06\x3f\xdd\x97\xc9\x3c\xfb\x83\xb7\xdf\
+\x96\x54\x47\x47\x4b\xa1\x75\x10\x91\x68\xd0\x08\xd7\x9c\xab\x35\
+\x89\x5c\x8e\x3d\x5b\xb7\xca\x7e\x78\x7a\x08\x7e\x0e\x74\xae\x03\
+\x10\x11\x15\x87\x91\x7e\xf8\xce\xd8\x89\x13\x6e\xcf\xc0\xc0\x86\
+\x22\xeb\x3a\xab\x47\x0b\xc1\xa0\x19\x2a\x3a\xce\xec\xd8\xc1\x1e\
+\xd7\x75\xfb\xe1\xe5\x38\x8c\x44\x1b\x7d\xcd\x81\xae\x21\xf8\xc9\
+\xde\x91\x91\xfe\xbd\x2f\xbe\x08\x2d\xac\x6c\x8c\xcd\xe0\x36\xb8\
+\x10\x05\xc6\x90\x1d\x1c\xe4\x00\x6c\x1d\x84\x9f\x01\x5d\x00\x4a\
+\x44\xc4\x85\xc1\x5e\x38\xf8\xed\xe3\xc7\x91\x20\xd8\x28\xd8\x4a\
+\xa8\x1d\x5c\x0b\xa7\xea\xc7\x76\x3c\xce\xb6\x74\x9a\x7e\x18\x75\
+\x61\x50\x22\x1b\xdc\x02\x1c\x2d\x24\x12\x7d\x43\x07\x0f\xb6\xef\
+\xac\x8d\x68\xdb\x9c\x26\x47\x4c\x94\x6b\x27\x93\x0c\x43\x5f\x1e\
+\x9e\x01\x5c\x05\xa4\xf2\xf0\xc2\xe8\xe1\xc3\xca\x52\x6a\x83\xd0\
+\x97\x75\xd9\xca\xfa\xe6\x65\x6a\xdc\x17\xca\x71\x18\x04\xd5\x03\
+\xdf\x02\x52\x0a\x88\x25\x60\xa0\x7f\xfb\x76\x68\x5a\x37\x13\x15\
+\x36\x5a\xaf\x05\xf5\xf0\xfd\xf5\xd1\x2a\xa7\x29\x57\x7c\x1f\xa9\
+\xd5\x70\x95\x22\x0d\x7d\x40\xcc\x56\x90\x74\x20\x99\xcd\x66\x5b\
+\x16\x90\x7a\x44\x05\xd6\x0a\x69\x8d\x6a\x10\x35\x5a\x63\x6f\x02\
+\xd7\x58\xcb\x88\x90\x84\xb8\x82\xa4\xed\x40\x77\x12\xe2\xc9\x64\
+\x72\xed\xcf\x26\x0a\x1a\x66\x69\x84\xa9\x8b\xfb\x3e\xaa\x29\x5f\
+\x35\x08\x36\x86\x69\x68\xc0\x31\x86\x2c\xc4\x1c\xe8\xb6\x05\x44\
+\x81\x2c\x4c\x4c\x60\x0e\x1d\xda\xd8\x79\x0b\x17\xea\xa1\xa2\xdc\
+\xa0\x5c\xc6\xbb\x7d\x1b\xaf\x58\x44\x97\xcb\x98\x30\xba\xd2\x1a\
+\x83\x01\x4c\x34\x4b\x18\x62\x05\x01\x2a\x0c\xb1\x41\x04\xc4\xf6\
+\xa1\x58\x05\xef\xee\xa9\x53\x0c\x1f\x39\x42\x62\xcb\x16\xa4\xc1\
+\x4a\x69\xb0\xb2\xde\x79\x1d\xd2\x9f\x9a\xa2\x3c\x3e\xce\xca\xdd\
+\xbb\x6b\xa2\xf5\x0b\x4b\xf3\x3d\xd6\x34\xcd\xcb\x50\xf1\xa1\x68\
+\x87\x50\x09\xa0\x52\x2b\x97\xb9\x71\xe2\x04\x3d\x47\x8e\xd0\xb5\
+\x6f\x1f\x89\xfe\xfe\xf5\x76\x47\x73\xb0\xb0\xc0\xd2\xb5\x6b\x2c\
+\x4d\x4c\x50\x9b\x9f\x47\x00\x07\xf0\x1c\xf8\xe8\x09\xc1\x28\x50\
+\x96\x8d\x28\x1b\xcb\xb6\xb1\x2c\x1b\x65\xd9\x28\x65\x23\xb6\x45\
+\xb9\x38\x0d\x55\x4d\xe5\x13\xaa\x61\x48\xc5\x06\x3c\x1f\xa6\x6a\
+\xf0\x15\x6b\x71\x91\xf9\x93\x27\x59\x38\x79\x12\x3b\x9b\x25\x35\
+\x34\xb4\x7a\x46\x78\xde\x5a\xe8\xd9\x59\x08\x43\x2c\xc0\x6a\xe8\
+\xf0\xfc\xf3\x8f\x70\xfc\x0f\xef\x83\x18\x74\xa8\xa9\x85\x1a\xdf\
+\x68\x56\x3f\x35\x34\x3e\xa5\xa0\xc4\xf1\xf1\xef\xa3\xa7\x42\x06\
+\xde\x0a\x6a\x8c\xe3\xd9\xc0\xca\x17\xf0\xc1\x24\x7c\x6d\x18\x54\
+\xbc\x7e\x77\x2c\x95\xa8\x5c\xbc\xf8\xe0\x56\x1d\xcd\x2e\xad\xc7\
+\xec\xbe\x6d\xac\x04\x4b\xe8\xb0\xb6\x06\xa0\x65\x35\x7c\xd1\x68\
+\xa5\x39\xbd\xfc\x21\x41\x77\x88\xc9\x28\x26\x47\xc3\x25\xc6\xcd\
+\x8a\x0d\x54\xef\xc1\xe9\x5b\x30\x7b\x10\x0a\x9d\x4d\x82\x8d\x43\
+\x36\xf9\x2d\x08\x34\xf3\xd5\xf9\x48\x7c\x15\x42\xb3\x2a\xac\x95\
+\x66\xde\xcc\xf3\xf7\xe2\xdf\x10\x0b\xc4\x08\x2b\x59\xf3\x1f\xa0\
+\x6a\x1b\x63\x8c\x88\xdc\x9a\x84\x4b\x53\xf0\xfc\x23\x9b\x08\xb7\
+\x13\x07\xa8\x45\x00\xb5\x50\x3f\x70\x01\x8d\xaf\x34\x0b\x66\x81\
+\x3f\x7f\xf1\x27\x4a\x32\x07\x91\xc5\x12\xa7\x1c\x1a\x63\xea\x4f\
+\xc5\xa5\x4f\xe0\x57\x67\xe1\xab\xbb\x20\x5f\xf8\x3f\x20\xc2\x40\
+\xb3\xe0\xaf\x3a\xa0\xc3\x5a\x04\xa2\x59\x34\x0b\xbc\x3b\xf5\x2e\
+\xd3\x32\x0d\x71\x21\x41\x1c\x0b\x9b\xa2\x3b\xe7\x43\xf4\x58\x6e\
+\x8c\x09\x45\xe4\xea\xe7\xf0\xc1\xc7\x30\xf6\x4d\xb0\x9d\xff\xa1\
+\xfb\x55\x80\xda\xba\x25\xf0\x6a\x1e\x57\x67\xaf\x70\x79\xe1\x32\
+\x9e\x5b\x21\x9d\x4e\xd1\xe1\x66\x48\x3a\x29\x1c\xe5\xb0\xec\x2c\
+\xb3\x06\x10\x8d\x85\xcb\xf0\x8b\x38\xec\x1c\x80\xa7\x0e\x6c\x22\
+\xdc\x72\x0f\xd4\x7c\xa6\x96\x27\x99\xad\xcc\x32\x5b\xb9\xcf\xf5\
+\xd2\x04\x65\xbf\x0c\x36\x64\x13\x59\x7a\xdc\x1c\x59\x37\x4b\xd2\
+\x49\xe1\x5a\x31\x3e\xb3\x3e\x53\xeb\x00\xa2\xbd\x70\xef\x02\xfc\
+\xd0\x85\xbf\x24\x61\x64\xf4\x21\x84\xeb\x63\xfa\xfe\x1d\x3e\x9c\
+\x78\x67\xc3\xf7\x29\x95\x22\xef\x16\xe8\x8d\xf5\xd2\xed\xf6\xd0\
+\x19\xcb\x10\xb3\xe2\xb8\x2a\xb6\x1e\x20\x82\x08\x44\x64\xfc\x1c\
+\x8c\xd5\xe0\xf7\xaf\xc2\x81\x67\xc1\x56\x4d\x45\x5b\x81\x34\xe7\
+\xd4\x47\xd6\xcd\x92\x73\x73\xe4\x9c\x3c\xbd\x6e\x2f\x59\xb7\x9b\
+\xa4\x9d\xc2\xb5\x63\xb2\x01\x20\x82\xd0\x22\xf2\xe9\x39\x18\xf3\
+\xe1\x97\x17\xe0\x1b\xc7\x20\xf7\xe8\x26\xdd\xb7\x83\x4a\xda\x49\
+\x3a\xdc\x4e\x32\x76\x86\x1e\xa7\x87\x82\xdb\x4b\x3e\x56\xa0\xd3\
+\xe9\xc4\xb5\xdc\x8d\x0e\x34\x40\x04\x22\x72\xf7\x9f\xf0\xa3\xab\
+\xf0\xe4\x35\x78\xe3\x30\x8c\x3c\x07\xf9\xbd\xed\x3a\xf5\xc0\x84\
+\x06\x51\x0f\x50\xe2\x76\x9c\xb8\x15\x27\xa9\x92\x74\xd8\x1d\x64\
+\x9d\x2c\x05\xb7\x40\xb7\xd3\xc3\xe2\xd2\xe2\x74\x5b\x80\x08\xc2\
+\x00\x25\x11\x39\x73\x06\xae\xfe\x0b\x76\x9f\x82\x17\xb6\xc1\xd1\
+\x3c\xe4\x7b\x21\xd6\x07\x09\x01\x66\xa0\xb2\x74\x25\x94\xca\xf6\
+\x95\x9c\x71\xa4\x12\xd8\x54\xb0\xd0\xc4\x6c\xa3\x52\x53\xca\x9b\
+\xd3\xea\xfe\xf4\x9c\x75\x3b\xf9\xb9\xea\x49\xe7\x94\xe7\x79\xf6\
+\xcc\xcc\xcc\x3b\xb0\xc9\xcb\x69\xf3\x88\x5e\x26\xe2\x40\x1a\x48\
+\xb8\x90\xb5\xa0\x1b\x20\x80\x39\x1f\x4a\x40\x05\x58\x02\xbc\x87\
+\x7d\x3d\xff\x2f\x19\x1b\x5f\x00\x19\x79\x99\x0e\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xd7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x05\x69\x49\x44\x41\x54\x58\x85\xa5\
+\x97\x5b\x6c\x14\x55\x1c\xc6\x7f\x67\x3a\x3b\x7b\x69\xa1\xf7\x42\
+\x2f\x48\xdb\x45\x28\x16\xd3\x42\x2d\x2d\x45\x08\x81\x68\x10\x51\
+\x13\x13\x89\x09\x6f\xf0\x84\x3e\x90\x48\xd0\xa4\x62\xf4\x41\x45\
+\x89\xbe\x68\xe4\x51\x9f\x7c\xf3\x41\x92\x0a\x51\xf1\xd6\x90\x62\
+\x48\x81\x50\x85\x42\x63\x4a\x6d\x6a\x4b\x4b\x4b\x2f\x5b\xba\xb3\
+\x33\x3b\x73\x7c\xe8\xcc\x3a\xdd\xce\xee\x96\x78\x92\x2f\xe7\xcc\
+\xcc\x7f\xfe\xdf\xf7\xff\xe6\xcc\xcc\x39\x42\x4a\xc9\x4a\x9a\x10\
+\x42\x00\x1a\x90\x0f\x04\x05\x84\x34\x28\x05\x30\x60\x4a\x82\x0e\
+\x24\x80\x87\x80\x21\x57\x98\x58\x5d\x01\xb1\x02\x14\x05\xa1\xae\
+\x02\xf6\x96\xc1\xfe\x08\x54\x0a\x28\x08\x42\x58\x2e\xb2\xea\x16\
+\xcc\xeb\x30\x3e\x05\xdf\x4d\xc0\xcf\x42\x88\xbb\xc0\x8c\x94\xd2\
+\xce\x9a\x3f\x93\x50\xa7\xe2\xd5\x21\xd8\xbc\x01\x4e\x54\x40\x47\
+\x59\x30\xb8\xb6\xa1\xa1\x41\xa9\xdf\xb2\x85\x55\x85\x85\x84\x0a\
+\x0a\xb0\x4d\x93\x85\xc9\x49\xe6\xa6\xa6\x18\xb9\x7d\x9b\xfe\xa1\
+\x21\x7b\xd4\xb6\xef\x3f\x80\x9e\x41\x38\xa3\x43\x3f\x30\x97\xc9\
+\x11\x5f\x01\x4e\xd5\x95\x1b\xe1\x44\x35\xbc\x52\x5f\x5e\x5e\xf3\
+\xea\xc9\x93\xac\x6f\x6a\x42\xd3\x34\x64\x22\x81\xe5\x41\x52\xd7\
+\x53\xe3\x87\xd3\xd3\x0c\xf5\xf6\x72\xa5\xbb\x9b\xeb\x0b\x0b\x63\
+\x13\xf0\xcd\x5f\xf0\x31\x30\xe6\xe7\xc6\x32\x01\x42\x88\x80\x0a\
+\xf5\x9b\xe1\x93\x4d\xf0\xcc\x0b\x47\x8e\x04\x77\x1c\x3a\x44\x41\
+\x51\x11\x96\xae\x93\x4c\x23\xcf\x04\x23\x16\xe3\x4e\x4f\x0f\xbf\
+\x5c\xbd\x9a\xf8\x13\x7e\x1d\x80\xe3\x49\x18\x94\x52\x9a\x19\x05\
+\x08\x21\x94\x00\x6c\x7a\x12\xbe\xdc\x56\x51\xd1\x76\xf4\xf4\x69\
+\x51\xd7\xd2\x82\x4c\x24\x72\x13\x3b\x2e\xa4\xc7\xdd\x1f\x18\xe0\
+\xb7\x4b\x97\xec\x9e\x64\xf2\xc6\x6d\x38\x6c\xc2\x1d\xaf\x13\x8a\
+\xf7\x99\x0b\xa8\x6a\x80\x4f\x77\x46\xa3\x6d\xa7\xce\x9d\x13\xd1\
+\xd6\x56\xa4\x69\x62\x99\x26\xb6\x0b\xc3\xf8\xaf\xf7\xc0\x4a\x8f\
+\x33\x4d\x2c\xc3\xa0\xb0\xb2\x92\x3d\xad\xad\xca\x2e\x68\xde\x00\
+\x9f\x0b\xa8\x72\xe6\xd7\x52\x01\xc0\xea\x8d\xf0\xe6\xd6\xc2\xc2\
+\x7d\xaf\x9d\x3d\x2b\xf2\x57\xad\xf2\x25\x5a\x22\xc2\x21\xb5\xbc\
+\xe2\xd2\x63\x4d\x93\x70\x59\x19\x4d\x55\x55\xa2\x15\x76\x45\xe1\
+\x6d\x60\xf5\x12\x01\x42\x08\x25\x04\x8d\xd5\xf0\xf2\xe1\xce\x4e\
+\xad\xb4\xa6\x66\x59\x92\x25\x95\xb9\xf0\x21\xb4\xd2\x45\x39\xe3\
+\xc2\xfa\x7a\x9a\x34\x4d\xab\x86\x17\x43\xd0\xe8\x4c\xf4\x94\x03\
+\x45\x51\x78\xa3\xb9\xb1\xb1\xba\xf9\xe0\x41\xf0\xb1\xd2\x8b\x6c\
+\xe2\x96\xb9\xe0\x00\x29\x29\xae\xad\xa5\x0d\xaa\x6a\xe1\x2d\xa0\
+\x08\x40\x11\x42\x08\x0d\x6a\xd7\x40\xfb\x4b\xc7\x8e\x21\x2c\x6b\
+\x39\xa1\x1f\x51\x26\x71\x3e\x4e\xb9\x63\x35\x14\x62\x5d\x41\x01\
+\xd5\xd0\xa2\x41\xad\x70\x6c\xd0\x2a\x60\x4f\x45\x38\x5c\x19\x6d\
+\x6f\xcf\x5c\x59\x06\xd2\x8c\x31\x69\x8e\x48\x27\x56\x8d\x44\x68\
+\x80\xca\x72\xd8\x0b\x68\x0a\x90\x5f\x0e\x07\x5a\x3a\x3a\x94\x3c\
+\x45\x59\x46\x94\xab\x4a\x3f\xeb\xd3\x1f\x93\x77\x5e\x28\x81\x00\
+\xb5\xa0\x94\xc2\xf3\x40\xbe\x02\x04\xc3\x50\x53\x5d\x57\x07\x69\
+\xcf\x4d\x3a\x89\xa5\x69\xa6\x80\x0b\xc3\x58\x0a\xbf\x98\xb4\x58\
+\x61\x18\x88\x64\x12\x4d\x51\x28\x80\x4a\x20\xa8\x2a\x10\x09\x40\
+\xa4\xb8\xb8\xd8\x37\x81\x70\xe1\x24\x48\x25\x32\x4d\x14\x0f\xa9\
+\x34\x4d\xd4\x2c\xe2\xbc\xb9\xa4\x10\x44\x20\xa4\x40\x44\x0d\x40\
+\x49\x04\x42\x91\x48\x24\x75\xb3\x74\x80\xa7\x17\x5e\x31\x2e\xb9\
+\x61\xa0\xa4\xc5\x2b\x1e\x42\x2f\xa4\xa7\x80\x80\x94\x14\x43\x30\
+\x00\x25\xaa\x00\xa1\x80\x98\xed\xef\x47\xee\xd8\xb1\xbc\x72\x1f\
+\x17\x5c\x28\x4e\xac\x15\x8b\xa1\xdf\xbd\x8b\x3e\x35\x85\x19\x8b\
+\x21\x6d\xe7\x4b\x2b\x25\x12\x90\x4e\x2f\x6c\x9b\x3c\xcb\x42\xb1\
+\x6d\x54\x10\x02\x84\x6a\xc0\x54\x02\xf4\xe1\x0b\x17\x68\xd8\xbd\
+\x9b\xf0\xda\xb5\x08\x8f\x95\xc2\x63\xa5\x5b\xb9\x2b\xd2\x18\x1b\
+\x23\x76\xeb\x16\x0b\xc3\xc3\x29\x52\xf7\xc3\x92\xfe\x8f\x95\x69\
+\xfd\x43\x88\x1b\x30\xa5\xda\x10\xb7\x20\x9e\x8c\xc5\xb8\xd3\xd9\
+\x49\xe9\xee\xdd\x14\x6d\xdd\x4a\xb8\xba\x7a\xa9\xdd\x4e\x6f\xcd\
+\xce\x32\x7f\xf3\x26\xf3\xfd\xfd\x24\x67\x66\x10\x40\x20\x0b\x51\
+\xa6\xf3\x09\xd0\x6d\x88\xab\x80\x6e\xc0\x58\x12\x1e\xcf\x9b\x9b\
+\x63\xa6\xab\x8b\xd9\xae\x2e\xd4\xe2\x62\xf2\xa3\xd1\xc5\x37\x42\
+\xd7\x53\x30\x27\x27\xc1\xb6\xc9\x03\xf2\x32\x90\xe4\x12\x60\x03\
+\xf3\x30\x0e\xe8\x2a\xb0\x70\x0f\xce\x8f\xc2\xd3\x0d\xa0\x84\x9c\
+\x40\x31\x3d\x4d\xbc\xb7\x37\x95\xc0\xfd\x7d\x69\xe4\x6e\x99\x5c\
+\x70\xcf\x0d\x83\x7d\x0f\xbe\x07\x16\x54\x20\x31\x02\x3f\x0f\xc2\
+\x64\x3b\x54\xb8\xbf\x29\xe1\x73\xb3\xc8\x72\x2d\x9d\xdc\x4f\x80\
+\x7b\x7c\x19\x46\x47\xe0\x22\x90\x50\xa5\x94\x52\x08\x31\x38\x0a\
+\x57\xc7\xe0\xb9\xc7\xb2\x10\xe7\x22\xf7\x23\x4b\x17\x31\x07\xf4\
+\xc1\x8d\xc4\xe2\xea\x48\xba\xab\xe2\xe9\x3f\xe0\xa3\x6e\x78\x6a\
+\x13\x94\x57\xfc\x0f\x11\xd9\x1c\x00\xf8\x16\xfe\xe9\x83\x33\xc0\
+\x34\x38\x6f\x8d\x94\xd2\x8e\x43\xdf\xdf\x70\xfe\x3a\x24\x61\x71\
+\x66\x07\x58\x7c\xe6\x9a\xcf\x38\x13\xb2\xc5\x0f\x81\x71\x05\x7e\
+\x8c\x43\x9f\xbb\x2c\xf3\xee\x0b\x66\xaf\xc1\xbb\x21\xd8\x50\x03\
+\x3b\xdb\xb2\x54\xbc\x52\x07\xbc\xc7\x93\xc0\x67\x70\xf9\x1a\xbc\
+\x07\xcc\xba\xd7\x53\x02\x9c\xb9\x30\x72\x05\x5e\xd7\xe0\xeb\x08\
+\x34\xb6\x3c\x02\x71\x36\x31\x93\xc0\x07\x70\xbd\x07\x8e\xdb\x30\
+\xe2\xdd\x23\xf8\x2e\xcb\x35\x78\xa2\x1d\xbe\x38\x0a\x6d\xfb\x40\
+\x55\x58\xda\x72\x09\xf1\x66\x1c\x00\xf3\x7d\xe8\xe9\x86\xe3\x06\
+\xdc\xca\xba\x2c\xf7\x88\xc8\x53\xa0\x66\x3b\x7c\xd8\x02\xcf\x1e\
+\x81\xb2\xf5\x39\x48\xd3\xdb\x1c\xf0\x15\x8c\xff\x04\x3f\xfc\x0e\
+\xef\x38\x95\x5b\xcb\xb8\x72\x6c\xcd\x8a\x22\xb0\x6d\x3b\x9c\xea\
+\x80\xc6\xfd\x50\xde\x9c\x83\x78\x18\xe8\x82\x7b\x17\xe1\x66\x0f\
+\x9c\x5e\x80\x6b\x2c\xee\x11\x57\xbe\x35\x4b\x13\x92\x07\x94\x84\
+\x61\x73\x03\x1c\x58\x07\x7b\xca\xa1\x7c\x0d\x04\x2b\x21\x2c\x80\
+\x09\x88\x8f\x83\x7e\x1f\x26\x86\xa0\xbb\x1f\xce\xc7\x17\xf7\x84\
+\x0f\xfc\xaa\x7e\x24\x01\x1e\x21\x02\x08\x01\x05\x40\x58\x83\xe2\
+\x3c\x28\x01\xb0\xe0\x81\xb1\xf8\x5e\xc7\x81\x79\x40\x5f\xe9\xf6\
+\xfc\x5f\xb1\xae\xcc\x93\x21\x02\xc2\xc1\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x0c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
+\x00\x00\x02\xd3\x49\x44\x41\x54\x38\x8d\xa5\x92\x5f\x68\x5b\x65\
+\x18\xc6\x7f\xe7\x3b\x27\xc9\x39\x4d\xd2\x93\xb6\x61\x34\xfd\x93\
+\xae\x94\x8a\x83\xd1\x4e\x37\xac\x60\x8b\xa2\x38\x7b\xd1\x09\xbd\
+\xd1\x8b\x4d\xb6\x81\xa0\x8e\x5e\x4d\xa1\x97\x9b\xbb\xae\x03\x6f\
+\x04\xa7\x32\x41\xba\xa0\x17\xbd\x19\x6c\x0a\x22\xea\x2a\xa8\x65\
+\xca\xb2\xc2\x08\x73\xae\x35\x59\xdb\x75\x5d\x97\x93\x26\x39\x7f\
+\x92\x7c\x9f\x17\xb2\x40\x6d\xbd\xf2\xbd\x7c\xe1\xfd\xbd\xcf\xfb\
+\x3c\xaf\xa6\x94\xe2\xff\x94\xb1\x5b\xf3\x8b\xb5\x53\xda\x2f\xe5\
+\x2f\x0f\x4a\x25\xf7\x03\x08\x4d\x2c\x8e\xc4\x5e\xbf\xfe\x46\xe7\
+\x47\x3b\xb6\x69\xff\x56\xf0\xd6\x62\xe2\x88\xbb\x64\x7d\xd0\xab\
+\x0e\x0d\xda\x2a\x8d\xd0\x04\x25\x91\x67\x99\x5f\x6f\x9b\x7d\xd5\
+\x77\x3f\xde\x5f\xbc\xfc\x9f\x80\x13\x3f\xb5\x9e\x8e\xae\xed\x9b\
+\x79\x29\x7d\x5c\x33\x43\xd1\x6d\x60\x2f\xa8\xf0\xed\xf2\x45\x55\
+\xed\xca\xbd\xf7\xf9\x73\xa5\xf3\x3b\x00\x27\x7f\xb6\x9f\xd7\xf3\
+\xdd\xdf\xbd\x32\xf0\xa6\x88\xb6\x87\xd9\x62\x8d\xc1\x96\x51\x54\
+\x03\x72\xa5\x79\xda\x22\x9d\x6c\x6d\xfa\x5c\xfd\xe3\x82\x24\xbd\
+\xf6\xe2\xc5\x67\x9d\x1f\x00\xc4\x63\x52\x79\x55\x9e\x3b\x94\x7e\
+\x59\xc4\xfb\x02\x8c\x44\x05\x65\xf8\x3c\xbd\x67\x9c\x83\xa9\x71\
+\x94\xe1\xa1\x27\xca\xd8\x7d\x01\x23\x7b\x0f\x8b\xf2\xaa\x3c\xf7\
+\x78\x4e\x00\x1c\xbd\xd2\x9e\xec\x08\x77\x8f\xf6\x0c\xb4\xe2\xc8\
+\x02\x9b\x5e\x81\x6a\x50\x6c\xca\x2f\x6d\x15\x59\xb9\x5f\x60\xf5\
+\x41\x9e\xde\x01\x9b\x8e\x48\xf7\xe8\xd1\x2b\xed\xc9\x66\x0a\x81\
+\x5b\xeb\xef\xea\x4d\x09\x11\x72\x79\xd2\x38\xcc\x70\xf4\xd5\x6d\
+\xf7\xbf\x73\xe0\x53\x00\xe6\xef\xcc\x51\xd4\x7f\xa4\x67\x4f\x4a\
+\xdc\x58\xbe\xd7\x0f\x6c\x08\x80\xba\x87\xaf\x87\x02\x10\x2e\x20\
+\x77\x4b\x16\x00\x89\x4f\x51\xdd\xc2\x08\xd7\xa9\x7b\xf8\x4d\x05\
+\xa6\xb2\x73\xeb\x4e\xbe\x14\xd0\xd9\xba\xe8\x7f\xc6\x8d\xca\x27\
+\x54\x2b\x92\xb7\xfb\xaf\x02\xf0\x61\x76\x9c\x88\x59\x43\xaa\x3a\
+\x1d\xba\xce\x03\xa7\x50\x32\x95\x9d\x6b\x7a\x90\x39\x56\xf0\x97\
+\xee\x3e\xba\xb4\xe5\x6d\x60\x9b\x8a\xf6\x98\x46\xcc\x6a\xfa\x4b\
+\xc2\x16\xf4\xf4\x58\xa4\x7b\xe3\x34\x6a\x8a\x3f\xef\x3c\xbc\x94\
+\x39\x56\xf0\xb7\xa5\xe0\x3d\x14\x67\xbf\x99\xbf\xb9\x52\xf1\x3d\
+\x62\x21\x0b\x33\x24\xf8\x7d\x63\x8e\xeb\xf7\xe7\x30\x43\x3a\xb1\
+\x90\x85\x57\x0b\xf8\xfa\xda\xcd\x95\xea\x86\x76\x76\xd7\x47\x7a\
+\xe1\xfd\xe8\x50\xdb\x13\xda\xe5\xa7\x9e\xe9\x4a\xf7\xb7\xa5\xb0\
+\xc3\x31\x34\x0d\x4a\x7e\x85\xbb\x8f\x56\xf9\x6d\xe1\xde\x5f\x9b\
+\x39\x75\xe4\xfb\x33\x95\xec\x0e\x40\x36\x9b\x25\x93\xc9\x68\xd7\
+\xca\x17\x12\xa1\x94\x7b\xda\xde\xab\xbd\x16\x69\xd5\x06\x01\xfc\
+\x92\xba\xed\x2c\xa9\xaf\x82\x15\xeb\xfc\x48\xf8\xb8\x33\x39\x39\
+\x29\xc7\xc6\xc6\xfe\x01\x4c\x4f\x4f\x6b\xb3\xb3\xb3\x11\xc7\x71\
+\xac\x5a\xad\xd6\x22\xa5\xb4\x94\x52\xa6\x52\xca\x34\x2c\x5a\x00\
+\xea\x2e\x2e\xe0\x0b\x21\x5c\x21\x84\x6b\x18\x86\x1b\x8f\xc7\xab\
+\x13\x13\x13\x9e\xa6\x94\x22\x9f\xcf\x33\x33\x33\x23\x16\x16\x16\
+\xc4\xfa\xfa\xba\x70\x5d\x57\xaf\xd7\xeb\xa2\xd1\x68\x68\x00\xba\
+\xae\x2b\xc3\x30\xa4\x69\x9a\x32\x99\x4c\x36\x86\x87\x87\xe5\xd4\
+\xd4\x94\x1c\x1a\x1a\xe2\x6f\x9d\xd3\x3c\xd4\x2e\x16\x68\x9a\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x07\x16\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x06\xa8\x49\x44\x41\x54\x58\x85\x8d\
+\x97\x5b\x6c\x1c\x57\x1d\xc6\x7f\x67\x76\x66\x76\x76\xbd\xce\x7a\
+\x13\x7b\xed\xdd\x75\x54\xc7\x0e\xad\x23\x07\x25\xa9\x65\x72\x29\
+\x89\xa2\x22\x50\x95\x16\x90\x90\x28\x48\x2e\x48\x84\xa7\x72\x11\
+\x12\x51\x41\x84\x4a\x15\x42\xa2\x5c\x1f\x10\xa8\x12\x0f\xc0\x13\
+\x88\x07\x5e\x2a\x85\x44\x91\xa0\x4d\x23\xd7\xd0\xc8\x26\x22\x24\
+\xf1\x25\xc4\x4e\xdd\x24\xce\xc5\xf6\x5e\xc6\xf6\xce\x65\x67\x0e\
+\x0f\x3b\xbb\x1d\xaf\x77\x5d\x8f\xf4\xe9\x9c\xdd\xf9\xcf\xff\xfb\
+\xfe\xdf\x39\x67\xce\x1c\x21\xa5\x64\x3b\x97\x10\x42\x00\x3a\xd0\
+\x06\x44\x05\x18\x3a\xec\x02\x70\x60\x59\x82\x05\xd8\xc0\x1a\xe0\
+\xc8\x6d\x26\x56\xb7\x41\xac\x00\x1d\x51\xd8\x93\x86\x67\x3b\xe1\
+\xb9\x38\x64\x04\x24\xa2\x10\x93\x55\x56\xcb\x83\x55\x0b\x1e\x2e\
+\xc3\xdf\x1e\xc1\x5b\x42\x88\x79\xa0\x20\xa5\xf4\xb7\xcc\xdf\x4a\
+\x68\x50\xf1\x0e\x03\xf6\xed\x85\x33\x69\x38\xd6\x19\x8d\xf6\x0c\
+\x0e\x0e\x2a\xfd\xfb\xf7\xd3\x9e\x4c\x62\x24\x12\xf8\xae\xcb\xfa\
+\xd2\x12\xa5\xe5\x65\xee\x4e\x4f\x33\x75\xe7\x8e\x7f\xdf\xf7\x1f\
+\xaf\xc0\xf8\x1c\xfc\xdc\x82\x29\xa0\xd4\xca\x91\xa6\x02\x82\xaa\
+\x33\x4f\xc2\x99\x1c\x7c\xb1\xbf\xab\xab\xf7\xcb\xaf\xbc\xc2\x13\
+\x07\x0e\xa0\xeb\x3a\xd2\xb6\xf1\x42\xa8\x58\x56\xbd\xbf\x96\xcf\
+\x73\x67\x62\x82\x2b\x97\x2f\x73\x75\x7d\x7d\xf1\x11\xfc\xf5\x7f\
+\xf0\x33\x60\xb1\x99\x1b\x9b\x04\x08\x21\x34\x15\xfa\xf7\xc1\x2f\
+\x9f\x82\x4f\x7f\xf6\xf4\xe9\xe8\xd1\x17\x5f\x24\xd1\xd1\x81\x67\
+\x59\x54\x1a\xc8\x5b\xc1\x31\x4d\x66\xc6\xc7\x79\x7b\x72\xd2\xbe\
+\x0e\x97\x66\xe1\x3b\x15\x98\x93\x52\xba\x2d\x05\x08\x21\x14\x0d\
+\x9e\xfa\x38\xfc\xe1\xe9\x74\xfa\xf0\xd7\x5f\x7f\x5d\xec\x19\x1e\
+\x46\xda\xf6\x47\x13\x07\x2e\x34\xc6\x3d\x9e\x9d\xe5\x9d\xb1\x31\
+\x7f\xbc\x52\xf9\xcf\x34\x8c\xba\x30\x13\x76\x42\x09\x8f\xb9\x80\
+\xec\x20\xfc\xea\x99\x81\x81\xc3\xaf\xbe\xf9\xa6\x18\x18\x19\x41\
+\xba\x2e\x9e\xeb\xe2\xd7\xe0\x38\x1f\xb6\x21\x78\x8d\x71\xae\x8b\
+\xe7\x38\x24\x33\x19\x4e\x8e\x8c\x28\xc7\xe1\xe0\x5e\xf8\x8d\x80\
+\x6c\x30\xbf\x36\x0a\x00\x76\x3c\x09\xdf\x3b\x94\x4c\x7e\xea\x1b\
+\x6f\xbc\x21\xda\xda\xdb\x9b\x12\x6d\x10\x11\x90\x7a\x61\x71\x8d\
+\xb1\xae\x4b\xac\xb3\x93\x03\xd9\xac\x18\x81\xe3\x03\xf0\x43\x60\
+\xc7\x06\x01\x42\x08\xc5\x80\xa1\x1c\x7c\x61\xf4\xec\x59\x7d\x57\
+\x6f\xef\xa6\x24\x1b\x2a\xab\xa1\x09\xa1\xd7\x28\x2a\xe8\x27\xfb\
+\xfb\x39\xa0\xeb\x7a\x0e\x3e\x67\xc0\x50\x30\xd1\xeb\x0e\x74\x0c\
+\xc0\x77\x0f\x0e\x0d\xe5\x0e\xbe\xf0\x02\x34\xb1\x32\x8c\xad\xc4\
+\x6d\x72\x21\x00\x52\x92\xea\xeb\xe3\x30\x64\xfb\xe0\xfb\x40\x07\
+\x80\x22\x84\x10\x3a\xf4\x75\xc3\x91\xcf\xbf\xfc\x32\xc2\xf3\x36\
+\x13\x36\x23\x6a\x25\xae\x89\x53\xb5\xbe\x6a\x18\xec\x4e\x24\xc8\
+\xc1\xb0\x0e\x7d\x22\xb0\x41\x4f\xc3\xc9\x74\x2c\x96\x19\x38\x72\
+\xa4\x75\x65\x2d\x48\x5b\xc6\x34\x38\x22\x83\x58\x35\x1e\x67\x10\
+\x32\x5d\xf0\x2c\xa0\x2b\x40\x5b\x17\x9c\x1a\x3e\x76\x4c\x89\x28\
+\xca\x26\xa2\x8f\xaa\xb2\x99\xf5\x8d\xc3\x14\x9e\x17\x8a\xa6\xd1\
+\x07\xca\x2e\x78\x1e\x68\x53\x80\x68\x0c\x7a\x73\x7b\xf6\x40\xc3\
+\xb8\xc9\x20\xb1\x74\xdd\x3a\xa8\xc1\x71\x36\xa2\x59\x4c\x43\xac\
+\x70\x1c\x44\xa5\x82\xae\x28\x24\x20\x03\x44\x55\x05\xe2\x1a\xc4\
+\x53\xa9\x54\xd3\x04\xa2\x86\x20\x41\x3d\x91\xeb\xa2\x84\x48\xa5\
+\xeb\xa2\x6e\x21\x2e\x9c\x4b\x0a\x41\x1c\x0c\x05\xe2\xaa\x06\x3b\
+\xe3\x60\xc4\xe3\xf1\xfa\xc3\x32\x00\xa1\x56\x84\xc5\xd4\xc8\x1d\
+\x07\xa5\x21\x5e\x09\x11\x86\x21\x43\x05\x68\x52\x92\x82\xa8\x06\
+\x3b\x55\x01\x42\x01\x51\x9c\x9a\x42\x1e\x3d\xba\xb9\xf2\x26\x2e\
+\xd4\xa0\x04\xb1\x9e\x69\x62\xcd\xcf\x63\x2d\x2f\xe3\x9a\x26\xd2\
+\x0f\xde\xb4\x52\x22\x01\x19\xb4\xc2\xf7\x89\x78\x1e\x8a\xef\xa3\
+\x82\x10\x20\x54\x07\x96\x6d\xb0\x16\x2e\x5c\x60\xf0\xc4\x09\x62\
+\x3d\x3d\x88\x90\x95\x22\x64\x65\xad\xf2\x9a\x48\x67\x71\x11\xf3\
+\xe6\x4d\xd6\x17\x16\xea\xa4\xb5\x17\x4b\xe3\x1e\x2b\x1b\xda\x35\
+\x28\x3b\xb0\xac\xfa\x50\xf6\xa0\x5c\x31\x4d\x66\xce\x9e\x65\xd7\
+\x89\x13\x74\x1c\x3a\x44\x2c\x97\xdb\x68\x77\xd0\x7a\xc5\x22\xab\
+\x37\x6e\xb0\x3a\x35\x45\xa5\x50\x40\x00\x1a\xf0\x20\x05\xf7\x7a\
+\x34\xb4\x78\x1b\x9a\x11\xa7\xf2\xe0\x21\x43\xb7\x3d\x00\x4a\x31\
+\x28\xc6\x6b\x02\x04\x86\x23\xb1\x4d\x2c\x1f\xca\x2a\x60\x39\xb0\
+\x58\x81\x8f\x45\x4a\x25\x0a\xe7\xce\x51\x3c\x77\x0e\x35\x95\xa2\
+\x6d\x60\xa0\xba\x22\x2c\xab\x0e\x77\x69\x09\x7c\x9f\x08\x10\x09\
+\x55\x58\xfc\xf1\x69\x5e\x1a\xfd\x01\xa5\x4a\x89\x12\x25\xbe\xfa\
+\x97\x53\xfc\xee\xdb\x65\x04\xf0\xfe\x2f\xbe\xc2\x27\x9e\x7f\x09\
+\x5f\xf1\x59\x17\x6b\x9c\xf9\xe3\x97\xc8\xbe\xe6\x3d\x04\x2c\x15\
+\x58\x7f\x00\xe7\xef\xc3\x27\x07\x41\x31\x6a\xbb\x63\x3e\x4f\x79\
+\x62\xe2\xc3\xad\x3a\x68\x75\x5a\x5c\x86\x4a\xde\xce\xb3\xea\xaf\
+\x32\x5f\x99\xa3\x9c\x70\x71\x74\x48\x38\xd0\xbe\x33\x8d\xa6\x6a\
+\xac\x4a\x93\xdb\x95\x39\xd6\x53\x82\x07\x70\x11\x58\x57\x01\xfb\
+\x2e\xbc\x35\x07\x4b\x47\x20\x5d\xdb\xa6\x44\x13\x0e\xb1\xc5\x3d\
+\xc7\xb5\x29\x3a\x05\x4c\xcf\xe4\xfa\xda\x75\x84\x0f\x9a\xa8\x0a\
+\xb6\xdd\x32\x45\xbb\x80\x29\x4d\x66\xcb\xd3\x94\x15\xbc\x02\xfc\
+\x1d\xb0\x15\x29\xa5\xb4\x61\xee\x3e\x4c\x2e\x06\x15\xea\xc1\xb8\
+\xd6\x10\xfe\xaf\xf1\x5e\x0d\xae\x6b\x51\xb0\x0b\x14\xad\x22\xe3\
+\x8f\xdf\x45\x48\x51\x8f\xb5\x9d\x75\x0a\x76\x81\x82\x95\x67\x72\
+\x65\x12\x57\xc1\xb1\xab\x5f\x47\xb2\x36\x69\xf3\xff\x85\x9f\x5e\
+\x86\xc7\x85\x10\x61\x23\x71\x63\x3f\x8c\x9a\x80\xfb\xab\xf7\xb8\
+\x55\x9a\x21\x2a\xf4\x7a\xac\xeb\x96\x29\x38\x05\x16\x57\x17\x99\
+\x37\xe7\x50\x0c\xd5\x04\xf2\x10\xac\x1a\x29\xa5\x5f\x86\x6b\xef\
+\xc3\xf9\xab\x50\x61\x8b\xea\x5b\x39\x50\x71\x2c\x8a\x76\x81\xf3\
+\x73\xe7\xf0\x2a\x3e\x99\x58\xae\xfe\x8c\xed\x54\x87\xe0\xed\x0f\
+\xfe\x81\xf4\x7c\xb2\x3b\x7a\xfd\xda\x67\x59\xf8\x5c\x50\xfc\x37\
+\xbc\x66\xc0\xde\x5e\x78\xe6\x70\x93\xb1\x6f\xf5\x1b\xc0\xb6\x4c\
+\x2e\xdf\xbb\xc4\x74\x7e\x8a\x74\x36\x4d\x26\x92\x23\xca\x6c\x55\
+\x80\xbd\xc6\xd4\xc3\x09\x6e\xad\xcc\x92\xde\xdd\x43\x46\xcb\xd4\
+\x53\xd4\x05\x48\x29\xa5\x10\xe2\xee\x15\xf8\xa6\x0e\x7f\x8a\xc3\
+\xd0\xf0\x36\x88\x6b\xd7\xec\xed\x2b\xbc\x97\xa9\x2e\xf6\xb4\x9e\
+\x26\xa3\x64\x51\x03\x07\xae\xce\x8e\x71\x23\x19\x05\xa0\x47\xeb\
+\x26\xab\xe6\xea\x2b\x38\xfc\x4d\x88\x94\xd2\x73\xe0\xe6\x18\x8c\
+\xfe\x1a\xde\x7d\x07\x2a\xb5\x24\x61\xeb\x9b\xcd\x81\x70\xa2\x4e\
+\xad\x8b\x74\x2c\x83\x0e\xdc\x01\x77\x4a\xf7\xf3\xf5\x7b\x7a\x17\
+\x3d\x46\x77\x3d\x7c\xd3\xd1\x4c\x4a\xe9\x0a\x21\xae\x8f\xc1\xa8\
+\x03\x3f\xb9\x02\x9f\x39\x0d\x9d\x4f\x6c\x51\x7d\x63\x25\xc9\x48\
+\x92\x74\xbc\x87\xdf\xc3\xa3\x71\xb8\x68\x76\x8b\xbe\x36\x38\x1e\
+\x11\x11\x52\x6a\x8a\xb4\xd1\x5d\x77\xa0\xe9\xd9\x50\x4a\xe9\x09\
+\x21\x16\xfe\x05\xdf\xba\x06\x4f\xdf\x80\x57\x8f\xc1\xd0\x73\xd0\
+\x75\xb0\x85\x00\xc3\xab\x0e\x90\xae\xe8\x24\x22\x6d\x44\xb5\x76\
+\xef\xb7\x3a\x5f\xb3\x6c\xfe\x19\xd3\xf8\x33\x80\xa1\x1a\x24\x94\
+\x04\x49\x2d\x59\x7f\xae\xe5\xe1\x34\x38\xcb\xe5\x85\x10\x97\x2e\
+\xc1\xb5\xf7\x60\xdf\x05\x38\xb5\x1b\x4e\x76\x41\x57\x37\x44\x33\
+\x10\x13\xc0\x23\x28\x4f\xe7\xfd\x36\x65\xd6\xd2\x9c\x98\xbf\x36\
+\xa3\xdd\xb2\x4a\x1d\x6b\x96\x65\x72\x51\x4a\xe9\x45\x7f\xa4\xaf\
+\x94\x4b\xce\x07\x8a\xaa\x89\x85\xc5\x85\xe8\xda\x4a\xd9\x64\x7f\
+\x95\xa7\xe5\xe1\xb4\xf1\x0a\x0e\x13\x06\x90\x00\x62\x3a\xa4\x22\
+\xb0\x13\xc0\x83\x15\xa7\xba\xae\xcb\xc0\x2a\x60\x6d\xf7\x78\xfe\
+\x7f\x21\x06\x61\xa8\xf9\xcf\x04\xad\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x07\x16\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x06\xa8\x49\x44\x41\x54\x58\x85\x8d\
+\x97\x5b\x6c\x1c\x57\x1d\xc6\x7f\x67\x76\x66\x76\x76\xbd\xce\x7a\
+\x13\x7b\xed\xdd\x75\x54\xc7\x0e\xad\x23\x07\x25\xa9\x65\x72\x29\
+\x89\xa2\x22\x50\x95\x16\x90\x90\x28\x48\x2e\x48\x84\xa7\x72\x11\
+\x12\x51\x41\x84\x4a\x15\x42\xa2\x5c\x1f\x10\xa8\x12\x0f\xc0\x13\
+\x88\x07\x5e\x2a\x85\x44\x91\xa0\x4d\x23\xd7\xd0\xc8\x26\x22\x24\
+\xf1\x25\xc4\x4e\xdd\x24\xce\xc5\xf6\x5e\xc6\xf6\xce\x65\x67\x0e\
+\x0f\x3b\xbb\x1d\xaf\x77\x5d\x8f\xf4\xe9\x9c\xdd\xf9\xcf\xff\xfb\
+\xfe\xdf\x39\x67\xce\x1c\x21\xa5\x64\x3b\x97\x10\x42\x00\x3a\xd0\
+\x06\x44\x05\x18\x3a\xec\x02\x70\x60\x59\x82\x05\xd8\xc0\x1a\xe0\
+\xc8\x6d\x26\x56\xb7\x41\xac\x00\x1d\x51\xd8\x93\x86\x67\x3b\xe1\
+\xb9\x38\x64\x04\x24\xa2\x10\x93\x55\x56\xcb\x83\x55\x0b\x1e\x2e\
+\xc3\xdf\x1e\xc1\x5b\x42\x88\x79\xa0\x20\xa5\xf4\xb7\xcc\xdf\x4a\
+\x68\x50\xf1\x0e\x03\xf6\xed\x85\x33\x69\x38\xd6\x19\x8d\xf6\x0c\
+\x0e\x0e\x2a\xfd\xfb\xf7\xd3\x9e\x4c\x62\x24\x12\xf8\xae\xcb\xfa\
+\xd2\x12\xa5\xe5\x65\xee\x4e\x4f\x33\x75\xe7\x8e\x7f\xdf\xf7\x1f\
+\xaf\xc0\xf8\x1c\xfc\xdc\x82\x29\xa0\xd4\xca\x91\xa6\x02\x82\xaa\
+\x33\x4f\xc2\x99\x1c\x7c\xb1\xbf\xab\xab\xf7\xcb\xaf\xbc\xc2\x13\
+\x07\x0e\xa0\xeb\x3a\xd2\xb6\xf1\x42\xa8\x58\x56\xbd\xbf\x96\xcf\
+\x73\x67\x62\x82\x2b\x97\x2f\x73\x75\x7d\x7d\xf1\x11\xfc\xf5\x7f\
+\xf0\x33\x60\xb1\x99\x1b\x9b\x04\x08\x21\x34\x15\xfa\xf7\xc1\x2f\
+\x9f\x82\x4f\x7f\xf6\xf4\xe9\xe8\xd1\x17\x5f\x24\xd1\xd1\x81\x67\
+\x59\x54\x1a\xc8\x5b\xc1\x31\x4d\x66\xc6\xc7\x79\x7b\x72\xd2\xbe\
+\x0e\x97\x66\xe1\x3b\x15\x98\x93\x52\xba\x2d\x05\x08\x21\x14\x0d\
+\x9e\xfa\x38\xfc\xe1\xe9\x74\xfa\xf0\xd7\x5f\x7f\x5d\xec\x19\x1e\
+\x46\xda\xf6\x47\x13\x07\x2e\x34\xc6\x3d\x9e\x9d\xe5\x9d\xb1\x31\
+\x7f\xbc\x52\xf9\xcf\x34\x8c\xba\x30\x13\x76\x42\x09\x8f\xb9\x80\
+\xec\x20\xfc\xea\x99\x81\x81\xc3\xaf\xbe\xf9\xa6\x18\x18\x19\x41\
+\xba\x2e\x9e\xeb\xe2\xd7\xe0\x38\x1f\xb6\x21\x78\x8d\x71\xae\x8b\
+\xe7\x38\x24\x33\x19\x4e\x8e\x8c\x28\xc7\xe1\xe0\x5e\xf8\x8d\x80\
+\x6c\x30\xbf\x36\x0a\x00\x76\x3c\x09\xdf\x3b\x94\x4c\x7e\xea\x1b\
+\x6f\xbc\x21\xda\xda\xdb\x9b\x12\x6d\x10\x11\x90\x7a\x61\x71\x8d\
+\xb1\xae\x4b\xac\xb3\x93\x03\xd9\xac\x18\x81\xe3\x03\xf0\x43\x60\
+\xc7\x06\x01\x42\x08\xc5\x80\xa1\x1c\x7c\x61\xf4\xec\x59\x7d\x57\
+\x6f\xef\xa6\x24\x1b\x2a\xab\xa1\x09\xa1\xd7\x28\x2a\xe8\x27\xfb\
+\xfb\x39\xa0\xeb\x7a\x0e\x3e\x67\xc0\x50\x30\xd1\xeb\x0e\x74\x0c\
+\xc0\x77\x0f\x0e\x0d\xe5\x0e\xbe\xf0\x02\x34\xb1\x32\x8c\xad\xc4\
+\x6d\x72\x21\x00\x52\x92\xea\xeb\xe3\x30\x64\xfb\xe0\xfb\x40\x07\
+\x80\x22\x84\x10\x3a\xf4\x75\xc3\x91\xcf\xbf\xfc\x32\xc2\xf3\x36\
+\x13\x36\x23\x6a\x25\xae\x89\x53\xb5\xbe\x6a\x18\xec\x4e\x24\xc8\
+\xc1\xb0\x0e\x7d\x22\xb0\x41\x4f\xc3\xc9\x74\x2c\x96\x19\x38\x72\
+\xa4\x75\x65\x2d\x48\x5b\xc6\x34\x38\x22\x83\x58\x35\x1e\x67\x10\
+\x32\x5d\xf0\x2c\xa0\x2b\x40\x5b\x17\x9c\x1a\x3e\x76\x4c\x89\x28\
+\xca\x26\xa2\x8f\xaa\xb2\x99\xf5\x8d\xc3\x14\x9e\x17\x8a\xa6\xd1\
+\x07\xca\x2e\x78\x1e\x68\x53\x80\x68\x0c\x7a\x73\x7b\xf6\x40\xc3\
+\xb8\xc9\x20\xb1\x74\xdd\x3a\xa8\xc1\x71\x36\xa2\x59\x4c\x43\xac\
+\x70\x1c\x44\xa5\x82\xae\x28\x24\x20\x03\x44\x55\x05\xe2\x1a\xc4\
+\x53\xa9\x54\xd3\x04\xa2\x86\x20\x41\x3d\x91\xeb\xa2\x84\x48\xa5\
+\xeb\xa2\x6e\x21\x2e\x9c\x4b\x0a\x41\x1c\x0c\x05\xe2\xaa\x06\x3b\
+\xe3\x60\xc4\xe3\xf1\xfa\xc3\x32\x00\xa1\x56\x84\xc5\xd4\xc8\x1d\
+\x07\xa5\x21\x5e\x09\x11\x86\x21\x43\x05\x68\x52\x92\x82\xa8\x06\
+\x3b\x55\x01\x42\x01\x51\x9c\x9a\x42\x1e\x3d\xba\xb9\xf2\x26\x2e\
+\xd4\xa0\x04\xb1\x9e\x69\x62\xcd\xcf\x63\x2d\x2f\xe3\x9a\x26\xd2\
+\x0f\xde\xb4\x52\x22\x01\x19\xb4\xc2\xf7\x89\x78\x1e\x8a\xef\xa3\
+\x82\x10\x20\x54\x07\x96\x6d\xb0\x16\x2e\x5c\x60\xf0\xc4\x09\x62\
+\x3d\x3d\x88\x90\x95\x22\x64\x65\xad\xf2\x9a\x48\x67\x71\x11\xf3\
+\xe6\x4d\xd6\x17\x16\xea\xa4\xb5\x17\x4b\xe3\x1e\x2b\x1b\xda\x35\
+\x28\x3b\xb0\xac\xfa\x50\xf6\xa0\x5c\x31\x4d\x66\xce\x9e\x65\xd7\
+\x89\x13\x74\x1c\x3a\x44\x2c\x97\xdb\x68\x77\xd0\x7a\xc5\x22\xab\
+\x37\x6e\xb0\x3a\x35\x45\xa5\x50\x40\x00\x1a\xf0\x20\x05\xf7\x7a\
+\x34\xb4\x78\x1b\x9a\x11\xa7\xf2\xe0\x21\x43\xb7\x3d\x00\x4a\x31\
+\x28\xc6\x6b\x02\x04\x86\x23\xb1\x4d\x2c\x1f\xca\x2a\x60\x39\xb0\
+\x58\x81\x8f\x45\x4a\x25\x0a\xe7\xce\x51\x3c\x77\x0e\x35\x95\xa2\
+\x6d\x60\xa0\xba\x22\x2c\xab\x0e\x77\x69\x09\x7c\x9f\x08\x10\x09\
+\x55\x58\xfc\xf1\x69\x5e\x1a\xfd\x01\xa5\x4a\x89\x12\x25\xbe\xfa\
+\x97\x53\xfc\xee\xdb\x65\x04\xf0\xfe\x2f\xbe\xc2\x27\x9e\x7f\x09\
+\x5f\xf1\x59\x17\x6b\x9c\xf9\xe3\x97\xc8\xbe\xe6\x3d\x04\x2c\x15\
+\x58\x7f\x00\xe7\xef\xc3\x27\x07\x41\x31\x6a\xbb\x63\x3e\x4f\x79\
+\x62\xe2\xc3\xad\x3a\x68\x75\x5a\x5c\x86\x4a\xde\xce\xb3\xea\xaf\
+\x32\x5f\x99\xa3\x9c\x70\x71\x74\x48\x38\xd0\xbe\x33\x8d\xa6\x6a\
+\xac\x4a\x93\xdb\x95\x39\xd6\x53\x82\x07\x70\x11\x58\x57\x01\xfb\
+\x2e\xbc\x35\x07\x4b\x47\x20\x5d\xdb\xa6\x44\x13\x0e\xb1\xc5\x3d\
+\xc7\xb5\x29\x3a\x05\x4c\xcf\xe4\xfa\xda\x75\x84\x0f\x9a\xa8\x0a\
+\xb6\xdd\x32\x45\xbb\x80\x29\x4d\x66\xcb\xd3\x94\x15\xbc\x02\xfc\
+\x1d\xb0\x15\x29\xa5\xb4\x61\xee\x3e\x4c\x2e\x06\x15\xea\xc1\xb8\
+\xd6\x10\xfe\xaf\xf1\x5e\x0d\xae\x6b\x51\xb0\x0b\x14\xad\x22\xe3\
+\x8f\xdf\x45\x48\x51\x8f\xb5\x9d\x75\x0a\x76\x81\x82\x95\x67\x72\
+\x65\x12\x57\xc1\xb1\xab\x5f\x47\xb2\x36\x69\xf3\xff\x85\x9f\x5e\
+\x86\xc7\x85\x10\x61\x23\x71\x63\x3f\x8c\x9a\x80\xfb\xab\xf7\xb8\
+\x55\x9a\x21\x2a\xf4\x7a\xac\xeb\x96\x29\x38\x05\x16\x57\x17\x99\
+\x37\xe7\x50\x0c\xd5\x04\xf2\x10\xac\x1a\x29\xa5\x5f\x86\x6b\xef\
+\xc3\xf9\xab\x50\x61\x8b\xea\x5b\x39\x50\x71\x2c\x8a\x76\x81\xf3\
+\x73\xe7\xf0\x2a\x3e\x99\x58\xae\xfe\x8c\xed\x54\x87\xe0\xed\x0f\
+\xfe\x81\xf4\x7c\xb2\x3b\x7a\xfd\xda\x67\x59\xf8\x5c\x50\xfc\x37\
+\xbc\x66\xc0\xde\x5e\x78\xe6\x70\x93\xb1\x6f\xf5\x1b\xc0\xb6\x4c\
+\x2e\xdf\xbb\xc4\x74\x7e\x8a\x74\x36\x4d\x26\x92\x23\xca\x6c\x55\
+\x80\xbd\xc6\xd4\xc3\x09\x6e\xad\xcc\x92\xde\xdd\x43\x46\xcb\xd4\
+\x53\xd4\x05\x48\x29\xa5\x10\xe2\xee\x15\xf8\xa6\x0e\x7f\x8a\xc3\
+\xd0\xf0\x36\x88\x6b\xd7\xec\xed\x2b\xbc\x97\xa9\x2e\xf6\xb4\x9e\
+\x26\xa3\x64\x51\x03\x07\xae\xce\x8e\x71\x23\x19\x05\xa0\x47\xeb\
+\x26\xab\xe6\xea\x2b\x38\xfc\x4d\x88\x94\xd2\x73\xe0\xe6\x18\x8c\
+\xfe\x1a\xde\x7d\x07\x2a\xb5\x24\x61\xeb\x9b\xcd\x81\x70\xa2\x4e\
+\xad\x8b\x74\x2c\x83\x0e\xdc\x01\x77\x4a\xf7\xf3\xf5\x7b\x7a\x17\
+\x3d\x46\x77\x3d\x7c\xd3\xd1\x4c\x4a\xe9\x0a\x21\xae\x8f\xc1\xa8\
+\x03\x3f\xb9\x02\x9f\x39\x0d\x9d\x4f\x6c\x51\x7d\x63\x25\xc9\x48\
+\x92\x74\xbc\x87\xdf\xc3\xa3\x71\xb8\x68\x76\x8b\xbe\x36\x38\x1e\
+\x11\x11\x52\x6a\x8a\xb4\xd1\x5d\x77\xa0\xe9\xd9\x50\x4a\xe9\x09\
+\x21\x16\xfe\x05\xdf\xba\x06\x4f\xdf\x80\x57\x8f\xc1\xd0\x73\xd0\
+\x75\xb0\x85\x00\xc3\xab\x0e\x90\xae\xe8\x24\x22\x6d\x44\xb5\x76\
+\xef\xb7\x3a\x5f\xb3\x6c\xfe\x19\xd3\xf8\x33\x80\xa1\x1a\x24\x94\
+\x04\x49\x2d\x59\x7f\xae\xe5\xe1\x34\x38\xcb\xe5\x85\x10\x97\x2e\
+\xc1\xb5\xf7\x60\xdf\x05\x38\xb5\x1b\x4e\x76\x41\x57\x37\x44\x33\
+\x10\x13\xc0\x23\x28\x4f\xe7\xfd\x36\x65\xd6\xd2\x9c\x98\xbf\x36\
+\xa3\xdd\xb2\x4a\x1d\x6b\x96\x65\x72\x51\x4a\xe9\x45\x7f\xa4\xaf\
+\x94\x4b\xce\x07\x8a\xaa\x89\x85\xc5\x85\xe8\xda\x4a\xd9\x64\x7f\
+\x95\xa7\xe5\xe1\xb4\xf1\x0a\x0e\x13\x06\x90\x00\x62\x3a\xa4\x22\
+\xb0\x13\xc0\x83\x15\xa7\xba\xae\xcb\xc0\x2a\x60\x6d\xf7\x78\xfe\
+\x7f\x21\x06\x61\xa8\xf9\xcf\x04\xad\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x07\x4a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x06\xdc\x49\x44\x41\x54\x58\x85\xa5\
+\x97\x6d\x6c\x1c\x47\x1d\xc6\x7f\xb3\xbb\xb7\x77\xbe\x5c\xea\x97\
+\xc4\x89\xdf\xd2\xb8\xb6\x9b\xba\x71\x1a\xdb\x4d\xd3\xa4\xd0\x86\
+\x50\x10\x34\x44\x42\x40\xa1\x10\x55\xaa\x94\x20\xa8\x14\x40\x41\
+\x8a\x10\xc5\x2a\xa2\x1f\x28\xa5\xfd\x50\x41\x49\xc4\x27\xda\x4a\
+\x81\x0f\x88\xb4\x44\x60\x1c\xa0\x69\x4a\xad\xd6\x01\x27\xb6\x95\
+\xa4\x8e\x1d\x27\xb5\x1d\xbf\x3b\x39\xfb\xec\xbb\xf3\xdd\xed\xce\
+\xed\x0e\x1f\xee\x7c\xdc\x5d\xfc\x92\x8a\x91\x1e\xed\xec\xec\xec\
+\x3c\xcf\x3c\xfb\x9f\xd9\xf9\x0b\xa5\x14\xab\x95\x57\x1f\x10\x75\
+\x75\xcd\x6c\x7d\xf6\x04\xef\x4c\x41\x01\xe0\x15\xe0\x33\x61\x1d\
+\x80\x0d\x33\x0a\x12\x80\x05\x2c\x00\xb6\xba\x93\x81\x01\x63\xb5\
+\x0e\xcf\x57\x89\xba\xc3\x2f\x96\xbe\x65\xf7\x46\xcd\x00\xf1\xc6\
+\x66\xd8\xeb\x87\x72\x01\x01\x2f\x14\xa8\x14\x6b\xc2\x81\x68\x02\
+\xa6\x67\xe0\x6f\x37\xe1\xac\x10\x62\x08\x98\x53\x4a\xb9\x2b\x0a\
+\x78\x46\x08\xc3\x07\x1b\x13\xb0\x50\x04\xe1\xd7\xd2\x2f\x08\x21\
+\xc4\x67\x0c\x6a\x7e\x7b\xac\xf4\x8f\xe5\x4f\x76\x6c\xbf\x1e\xfd\
+\x41\x72\x3b\x7f\x7f\x61\x5b\x63\xa3\x56\xb3\x6d\x1b\x6b\x0b\x0b\
+\xf1\x05\x02\xb8\x52\x12\x0b\x06\x09\xcf\xcc\x30\xd6\xdf\x5f\xdf\
+\x37\x3c\xfc\xd8\x84\xeb\xde\x9a\x85\x8e\x41\x78\x45\x08\xd1\x07\
+\x84\x97\x73\x44\x1c\x80\x8d\xc7\x4f\x72\xce\x2d\xd1\xe6\xa6\x46\
+\xdd\xb3\x17\x5b\x39\x75\xea\x4f\xf4\xf6\x40\xc5\xaf\x5b\xcc\x3f\
+\x3f\x71\xf4\xed\x7b\xb5\xbb\x1e\x65\xba\xed\x10\xb3\xda\x41\xfc\
+\x81\x00\xca\xb2\x70\xb2\x90\x4c\x24\x32\xf5\x85\x50\x88\xe1\x0b\
+\x17\xe8\x6c\x6f\xa7\x27\x16\x9b\xbc\x09\x27\xaf\xc3\xcb\xc0\xe4\
+\x52\x6e\x88\x43\x60\xfe\xe8\x38\xc7\xb6\x1c\x68\xf9\x8e\x58\xfb\
+\x55\xa4\xfc\x8b\x9a\xed\x7f\x77\x70\xe4\xe2\xf9\x92\x07\xf7\xbf\
+\x54\x6c\x14\x7e\x13\x94\x22\x74\xee\x87\x04\xa3\x07\xf1\x98\x66\
+\x0e\xf9\x72\xb0\x23\x11\xae\x76\x74\xf0\x5e\x57\x97\xf5\x11\xfc\
+\x6b\x00\x8e\x24\x61\x50\x29\x25\x73\x04\x28\xa5\x78\x79\x8b\xa8\
+\x3b\x7c\xb2\xea\xfd\xb5\x0d\xa7\x2b\xd0\x3c\xa0\x14\xb8\x49\x70\
+\xf5\x54\x5d\x29\x42\x9d\x47\x99\x0a\x7e\x17\xaf\xd7\xbb\x34\x69\
+\xda\x85\x64\x5e\xfb\xad\x81\x01\xde\xff\xe0\x03\xb7\x23\x99\xbc\
+\xd8\x0f\x4f\x4b\xb8\x9a\xed\x84\x06\x30\x7e\x8d\xc1\x8f\xda\xc6\
+\x7e\xe5\xc4\xdf\x04\xc2\x69\x2c\x64\xd5\x23\xac\xa9\xad\xc0\x8d\
+\x9c\x20\x34\x3a\x88\x1d\x8b\xe1\xda\x76\x0e\x1c\x29\x71\xa4\xc4\
+\xcd\x82\x63\xdb\x14\x96\x97\xb3\x77\xe7\x4e\xed\x31\x68\xaa\x83\
+\xdf\x08\xa8\x10\x42\x88\x1c\x07\x00\x76\x0a\x71\xcf\x9b\x7f\x2d\
+\xe9\x6c\xd8\x77\x62\x3d\x9a\x09\xae\x02\x97\xb4\x03\x00\x0a\xd7\
+\x19\x21\x16\x6c\xe3\x46\x67\x98\xb9\x8f\x77\xe2\xf5\x6c\x40\xc0\
+\x6d\x2e\x64\x62\x23\xab\x3e\xdd\xd5\xc5\x87\x13\x13\x76\x07\xbc\
+\x7e\x1d\x9e\x53\x4a\xcd\x67\x1c\x10\x42\x68\x93\xb0\x25\x3c\x36\
+\xbb\x96\x64\x1f\xb8\x61\xd0\x22\xa0\x85\x73\xa0\x99\x45\x04\xaa\
+\x0e\xb0\xf5\x2b\x4f\xd1\xfc\xd4\x31\x34\xfd\x14\x32\xdb\x8d\xb4\
+\x0b\xf9\x6e\x38\x52\x52\x58\x53\x43\xa3\x69\x9a\x95\xf0\x65\x1f\
+\x34\x08\x21\x34\x48\xef\x03\xa5\x50\x7a\x78\x1f\xaf\x3e\xf4\x79\
+\xbc\xcc\xb7\x80\xbf\x11\xcc\xfb\xc1\xa8\x07\xad\x8c\x94\x05\x0a\
+\x58\xc0\xb1\xfe\x43\x6c\xbc\x8b\xe9\xee\x4d\x44\x6f\x95\x61\x7a\
+\x9c\x1c\xdb\xf3\x3f\xcd\x22\x50\x8a\xe2\xea\x6a\x76\x0d\x0c\x54\
+\x4c\xc3\x8f\xfb\xe1\x20\x30\x6b\x08\x21\xc4\xf7\x9b\x78\xf2\xd9\
+\x23\xd4\x7b\x5c\x20\x61\x83\x3a\x0f\xf6\x79\xf0\x00\x9a\x07\x34\
+\x1d\x6b\x41\xe7\xc6\x87\x5b\x09\x0d\xd6\x90\x98\xfb\x06\xa6\xe9\
+\xc3\x57\x40\x6a\x09\xda\x76\x06\x6e\xde\xcc\x9d\xac\xba\xe1\xf3\
+\xb1\x29\x10\xa0\x32\x1a\xdd\x31\x08\xd5\x42\x88\x90\xfe\xb4\x8f\
+\x9a\xa3\xcf\xf1\xbb\xbb\x6b\x29\x44\xa4\x82\xdf\x8e\x00\x12\x34\
+\x0d\x48\xba\x20\x93\x0c\xbe\xb7\x9d\xe8\xf8\x33\x98\x46\x35\x86\
+\x6e\x80\xe3\xa4\x08\x97\x41\xe6\x99\x65\xe5\xb6\x25\x93\xb8\x0b\
+\x0b\x81\x51\xf8\x38\x02\x5d\xc6\xd7\x1e\xe7\xeb\x55\x45\x54\x0e\
+\x75\x7b\xd1\x4b\x9a\xb0\xec\x4a\xec\xe4\x66\x02\x05\x67\xa8\x6c\
+\xba\x8c\xe1\x4b\xc5\x61\x62\xb6\x08\x5d\xd7\x71\x2c\x2b\xd7\xf2\
+\x25\xac\xcf\x11\x96\x17\x17\x9a\xc7\x43\x35\x68\xeb\x60\xff\x38\
+\xbc\xae\x77\x5d\x23\x78\xfa\x6d\xf6\x17\x15\x7d\xab\xb8\x76\xef\
+\x4f\x30\x0b\x77\xe1\xf1\xdf\x43\x28\x78\x1f\x7a\xa4\x93\x40\xe1\
+\x02\xca\x82\xd1\xbe\x6d\x68\x6c\x46\xd9\x76\x0a\x96\xf5\xbf\x7a\
+\x1a\x8b\xa4\xb7\xb5\x67\xf7\x95\x12\x15\x8f\x73\x4d\x29\x6b\x14\
+\x7e\xaf\x0d\xa5\x4c\xf6\x94\x55\x54\xa0\x0b\x81\x92\x12\xa4\xa4\
+\xb0\x78\x3d\x63\xc3\x07\x88\x8e\x1a\xa8\x28\xb8\xd1\x35\x08\xdb\
+\x06\xdb\x46\xd8\x36\x42\x4a\xb4\x3c\x18\x52\xa2\x4b\x89\x6e\xdb\
+\x39\x58\x6c\x37\xa4\xc4\x23\x25\x3e\x21\xf0\x83\x4f\x03\xbf\xe6\
+\x81\x12\x3f\xf8\xfc\x7e\x3f\x48\x09\x59\xca\x03\x45\x0f\x70\xbd\
+\xe7\xb3\xd8\xf3\xe0\xc4\xfd\x08\x29\x33\xd0\xa4\x44\xd8\x36\xda\
+\x12\xd0\x17\x85\x64\x23\x4b\x90\x47\x29\x8a\xc1\xeb\x81\x12\x43\
+\x80\xd0\x40\xcc\xf7\xf5\xa1\x1e\x79\x24\x25\x22\x4d\x62\x28\x85\
+\xe6\xf9\x22\x97\xcf\xae\xc1\xe7\xad\x4c\xcd\x3c\x0b\x5a\xba\xaf\
+\x13\x89\x90\x18\x1a\x22\x31\x33\x83\x8c\x44\x50\x6e\x7a\xa7\x55\
+\x2a\xb5\x80\xd3\x57\xe1\xba\xe8\x8e\x83\xe6\xba\x18\x20\x04\x08\
+\xc3\x86\x19\x0b\x12\x23\xa7\x4f\x53\xbf\x67\x0f\x05\x65\x65\x88\
+\xf4\xc0\xd8\x36\x05\xba\x8e\x59\xb2\x3b\x15\xcd\x96\x95\x21\x45\
+\x4a\xec\xc9\x49\x22\x57\xae\x10\x1b\x19\xc9\x90\x6a\xe9\x2d\x36\
+\xff\xdf\xab\xf2\xae\x0b\x10\xb7\x61\xc6\x70\x21\xee\x40\x3c\x19\
+\x89\x70\xb5\xa5\x85\x75\x7b\xf6\x50\xd4\xdc\x4c\x41\x65\x65\x8e\
+\xdd\x2a\x7d\x75\xe6\xe7\x89\xf6\xf6\x12\xed\xeb\x23\x39\x37\x87\
+\x20\xb5\x5d\x2c\x47\xb4\x5c\xbb\x05\x09\x17\xe2\x46\x7a\xeb\x99\
+\x4c\xc2\xbd\x7a\x38\xcc\x5c\x6b\x2b\xf3\xad\xad\x18\xc5\xc5\xac\
+\xa9\xad\x4d\x45\x76\x22\x91\x81\x0c\x06\xc1\x75\xd1\x01\x7d\x19\
+\x92\xd5\x04\xb8\x40\x14\xa6\x81\x84\x01\xc4\xa6\xa0\x6d\x02\x1e\
+\xad\x07\xcd\x97\xee\x28\x42\x21\xe2\x17\x2e\x64\x06\x58\xfc\x7d\
+\x99\xac\x5e\x96\x73\x61\xb1\x6d\x04\xdc\x29\xf8\x07\x10\x33\x00\
+\x6b\x0c\xce\x0e\x42\x70\x37\x6c\xb8\x2b\x8f\x30\xbb\x88\x15\x9e\
+\xe5\x93\x2f\x25\x60\xf1\xfe\x1c\x4c\x8c\xc1\x19\xc0\x32\x94\x52\
+\x4a\x08\x31\x38\x01\x5d\x93\xb0\xef\xee\x15\x88\x57\x23\x5f\x8a\
+\x2c\x5f\x44\x18\xb8\x04\x17\xad\xd4\xe9\x48\x2d\x9e\x8a\x43\x97\
+\xe1\x97\xed\xf0\xd0\x7d\x50\xba\xe1\xff\x10\xb1\x92\x03\x00\xa7\
+\x60\xfc\x12\xbc\x02\x84\x20\xbd\x6a\x94\x52\x6e\x1c\x2e\xdd\x80\
+\xb6\x1e\x48\x42\x2a\xb2\x3d\xa4\xbe\xb9\xb9\x44\x7d\x39\xac\xd4\
+\x7f\x18\xec\x4e\x78\x27\x0e\x97\x16\x8f\x65\xd9\x79\xc1\x7c\x37\
+\xfc\xcc\x07\x75\x55\xf0\xe9\x5d\x2b\xcc\xf8\x4e\x1d\xc8\xbe\x0f\
+\x02\xaf\xc1\xb9\x6e\x78\x01\x98\x5f\x7c\x9e\x11\x90\x8e\x85\xb1\
+\x4e\xf8\x9e\x09\x7f\xf0\x43\xc3\x8e\x4f\x40\xbc\x92\x98\x20\xf0\
+\x22\xf4\x74\xc0\x11\x17\xc6\xb2\x73\x04\x91\x9f\x2f\x08\x21\x3c\
+\x26\x6c\xdd\x0d\xc7\xbf\x0d\xbb\x3e\x07\x86\x46\x6e\x59\x4d\x48\
+\xf6\x88\x03\x20\x7f\x0e\x1d\xed\x70\xc4\x86\x2b\x4b\x1e\xcb\xf3\
+\x8b\x10\x42\xd7\xa0\xea\x61\xf8\xc5\x0e\xf8\xc2\x21\x58\xbf\x79\
+\x15\xd2\xfc\x12\x06\xde\x80\xe9\x77\xe1\x9f\xff\x86\x9f\xa6\x67\
+\xee\xdc\xc6\xb5\x5c\x0e\x99\x3e\x3a\x17\xf9\xe1\xc1\x87\xe1\xf9\
+\x4f\x41\xc3\x13\x50\xda\xb4\x0a\xf1\x08\xd0\x0a\x53\x67\xa0\xb7\
+\x03\x5e\x8a\x41\x37\xa9\x1c\x71\xe9\xd4\x6c\xb5\x24\x56\x08\xa1\
+\x03\x25\x05\x70\x7f\x3d\x7c\x69\x13\xec\x2d\x85\xd2\x8d\xe0\x2d\
+\x87\x02\x01\xdc\x84\xf8\x34\x24\x6e\xc1\xcd\x61\x68\xef\x83\xb6\
+\x38\xf4\x01\xb3\x4b\xcd\xfa\x13\x09\xc8\x12\x22\x00\x1f\x10\x00\
+\x0a\x4c\x28\xd6\xa1\x04\xc0\x81\x59\x3b\xb5\xae\xe3\x40\x14\x48\
+\xdc\x69\x7a\xfe\x5f\x9a\xd1\xb8\xe4\x67\xe4\x0f\x62\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x0e\
+\x0b\x84\xe0\x07\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x5f\x00\x69\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x04\xd2\x59\x47\
+\x00\x69\
+\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x00\x9c\xe6\x07\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x5f\x00\x76\x00\x69\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x04\x25\x18\x27\
+\x00\x6c\
+\x00\x69\x00\x67\x00\x68\x00\x74\x00\x63\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xe1\x5a\x27\
+\x00\x64\
+\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x07\xc3\x57\x47\
+\x00\x75\
+\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0d\xda\xe7\x67\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x5f\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x04\x31\xe6\xc7\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x5f\x00\x73\x00\x74\x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\x92\xb1\xa7\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0a\xd1\x43\xe7\
+\x00\x65\
+\x00\x64\x00\x69\x00\x74\x00\x5f\x00\x61\x00\x64\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x09\xbf\x57\xa7\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x5f\x00\x70\x00\x61\x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x02\x3f\x7c\xc7\
+\x00\x6d\
+\x00\x61\x00\x63\x00\x72\x00\x6f\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0d\x00\x00\x00\x02\
+\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xac\
+\x00\x00\x01\x54\x00\x00\x00\x00\x00\x01\x00\x00\x46\xa3\
+\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x14\x84\
+\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x28\x97\
+\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x07\x37\
+\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x19\xe3\
+\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x1d\x98\
+\x00\x00\x01\x30\x00\x00\x00\x00\x00\x01\x00\x00\x3f\x89\
+\x00\x00\x01\x30\x00\x00\x00\x00\x00\x01\x00\x00\x38\x6f\
+\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x2f\x84\
+\x00\x00\x01\x12\x00\x00\x00\x00\x00\x01\x00\x00\x35\x5f\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x21\x41\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/gui/resources/vistrails-mime.xml b/vistrails/gui/resources/vistrails-mime.xml
new file mode 100644
index 0000000..f19b2ef
--- /dev/null
+++ b/vistrails/gui/resources/vistrails-mime.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+  <mime-type type="application/x-vistrails">
+
+    <comment>VisTrails</comment>
+
+    <glob pattern="*.vt"/>
+    <glob pattern="*.vtl"/>
+
+  </mime-type>
+</mime-info>
\ No newline at end of file
diff --git a/vistrails/gui/shell.py b/vistrails/gui/shell.py
new file mode 100644
index 0000000..27587c5
--- /dev/null
+++ b/vistrails/gui/shell.py
@@ -0,0 +1,965 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This module defines the following classes:
+    - QShellDialog
+    - QShell
+
+QShell is based on ideas and code from PyCute developed by Gerard Vermeulen.
+Used with the author's permission.
+More information on PyCute, visit:
+http://gerard.vermeulen.free.fr/html/pycute-intro.html
+
+"""
+from PyQt4 import QtGui, QtCore
+from code import InteractiveInterpreter
+import copy
+import sys
+import time
+import os.path
+
+import vistrails.api
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core.interpreter.default import get_default_interpreter
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.utils import create_port_spec_string
+import vistrails.core.system
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.core.utils import all
+
+################################################################################
+
+class QShellDialog(QtGui.QWidget, QVistrailsPaletteInterface):
+    """This class incorporates the QShell into a dockable widget for use in the
+    VisTrails environment"""
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent=parent)
+        #locals() returns the original dictionary, not a copy as
+        #the docs say
+        self.firstLocals = copy.copy(locals())
+        self.shell = QShell(self.firstLocals,None)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        layout.addWidget(self.shell)
+        self.setLayout(layout)
+        # self.setWidget(self.shell)
+        self.setWindowTitle(self.shell.windowTitle())
+        # self.setTitleBarWidget(QtGui.QLabel(self.shell.windowTitle()))
+        # self.monitorWindowTitle(self.shell)
+        self.vistrails_interpreter = get_default_interpreter()
+    
+    def createMenu(self):
+        """createMenu() -> None
+        Creates a menu bar and adds it to the main layout.
+
+        """
+        self.newSessionAct = QtGui.QAction(self.tr("&Restart"),self)
+        self.newSessionAct.setShortcut(self.tr("Ctrl+R"))
+        self.connect(self.newSessionAct, QtCore.SIGNAL("triggered()"),
+                     self.newSession)
+
+        self.saveSessionAct = QtGui.QAction(self.tr("&Save"), self)
+        self.saveSessionAct.setShortcut(self.tr("Ctrl+S"))
+        self.connect(self.saveSessionAct, QtCore.SIGNAL("triggered()"),
+                     self.saveSession)
+
+        self.closeSessionAct = QtGui.QAction(self.tr("Close"), self)
+        self.closeSessionAct.setShortcut(self.tr("Ctrl+W"))
+        self.connect(self.closeSessionAct,QtCore.SIGNAL("triggered()"), 
+                     self.closeSession)
+        
+        self.menuBar = QtGui.QMenuBar(self)
+        menu = self.menuBar.addMenu(self.tr("&Session"))
+        menu.addAction(self.newSessionAct)
+        menu.addAction(self.saveSessionAct)
+        menu.addAction(self.closeSessionAct)
+
+        self.layout().setMenuBar(self.menuBar)
+
+    def closeEvent(self, e):
+        """closeEvent(e) -> None
+        Event handler called when the dialog is about to close."""
+        self.closeSession()
+        self.emit(QtCore.SIGNAL("shellHidden()"))
+    
+    def showEvent(self, e):
+        """showEvent(e) -> None
+        Event handler called when the dialog acquires focus 
+
+        """
+        self.shell.show()
+
+    def closeSession(self):
+        """closeSession() -> None.
+        Hides the dialog instead of closing it, so the session continues open.
+
+        """
+        self.hide()
+
+    def newSession(self):
+        """newSession() -> None
+        Tells the shell to start a new session passing a copy of the original
+        locals dictionary.
+
+        """
+        self.shell.restart(copy.copy(self.firstLocals))
+
+    def saveSession(self):
+        """saveSession() -> None
+        Opens a File Save dialog and passes the filename to shell's saveSession.
+
+        """
+        default = 'visTrails' + '-' + time.strftime("%Y%m%d-%H%M.log")
+        default = os.path.join(vistrails.core.system.vistrails_file_directory(),default)
+        fileName = QtGui.QFileDialog.getSaveFileName(self,
+                                                     "Save Session As..",
+                                                     default,
+                                                     "Log files (*.log)")
+        if not fileName:
+            return
+
+        self.shell.saveSession(str(fileName))
+
+    def visibility_changed(self, visible):
+        QVistrailsPaletteInterface.visibility_changed(self, visible)
+        if visible:
+            self.shell.show()
+        else:
+            self.shell.hide()
+
+##############################################################################
+# QShell
+        
+
+class vistrails_port(object):
+    def __init__(self, vistrails_module, port_spec):
+        # print 'calling vistrails_port.__init__'
+        self._vistrails_module = vistrails_module
+        self._port_spec = port_spec
+
+    def __call__(self, *args, **kwargs):
+        if len(args) + len(kwargs) > 0:
+            self._vistrails_module._update_func(self._port_spec,
+                                                *args, **kwargs)
+            return None
+        return self
+
+class vistrails_module(object):
+    def __init__(self, *args, **kwargs):
+        if not hasattr(self, '_module'):
+            self._module = \
+                vistrails.api.add_module_from_descriptor(self._module_desc)
+            # FIXME if constant, we can use args
+            module_desc = self._module_desc
+            for attr_name, value in kwargs.iteritems():
+                self._process_attr_value(attr_name, value)
+
+    def _process_attr_value(self, attr_name, value):
+        if self._module.has_port_spec(attr_name, 'input'):
+            port_spec = self._module.get_port_spec(attr_name, 'input')
+
+            args = None
+            # FIXME want this to be any iterable
+            if isinstance(value, tuple):
+                args = value
+            else:
+                args = (value,)
+            self._update_func(port_spec, *args)
+        else:
+            raise AttributeError("type object '%s' has no "
+                                 "attribute '%s'" % \
+                                     (self.__class__.__name__,
+                                      attr_name))                
+
+    def __getattr__(self, attr_name):
+        def create_port(port_spec):
+            return vistrails_port(self, port_spec)
+        try:
+            return self.__dict__[attr_name]
+        except KeyError:
+            if self._module.has_port_spec(attr_name, 'output'):
+                port_spec = \
+                    self._module.get_port_spec(attr_name, 'output')
+                return create_port(port_spec)
+            elif self._module.has_port_spec(attr_name, 'input'):
+                port_spec = \
+                    self._module.get_port_spec(attr_name, 'input')
+                return create_port(port_spec)
+            else:
+                raise AttributeError("type object '%s' has no "
+                                     "attribute '%s'" % \
+                                         (self.__class__.__name__, 
+                                          attr_name))
+
+    def __setattr__(self, attr_name, value):
+        if attr_name.startswith('_'):
+            self.__dict__[attr_name] = value
+        else:
+            self._process_attr_value(attr_name, value)
+
+    def _update_func(self, port_spec, *args, **kwargs):
+        # print 'running _update_func', port_spec.name
+        # print args
+
+        if port_spec.type != 'input':
+            if self._module.has_port_spec(port_spec.name, 'input'):
+                port_spec = \
+                    self._module.get_port_spec(port_spec.name, 'input')
+            else:
+                raise TypeError("cannot update an output port spec")
+
+        # FIXME deal with kwargs
+        num_ports = 0
+        num_params = 0
+        for value in args:
+            # print 'processing', type(value), value
+            if isinstance(value, vistrails_port):
+                # make connection to specified output port
+                # print 'updating port'
+                num_ports += 1
+            elif isinstance(value, vistrails_module):
+                # make connection to 'self' output port of value
+                # print 'updating module'
+                num_ports += 1
+            else:
+                # print 'update literal', type(value), value
+                num_params += 1
+        if num_ports > 1 or (num_ports == 1 and num_params > 0):
+            reg = vistrails.core.modules.module_registry.get_module_registry()
+            tuple_desc = reg.get_descriptor_by_name(
+                vistrails.core.system.get_vistrails_basic_pkg_id(), 'Tuple')
+
+            d = {'_module_desc': tuple_desc,
+                 '_package': self._package,}
+            tuple = type('module', (vistrails_module,), d)()
+
+            output_port_spec = PortSpec(id=-1,
+                                        name='value',
+                                        type='output',
+                                        sigstring=port_spec.sigstring)
+            vistrails.api.add_port_spec(tuple._module.id, output_port_spec)
+            self._update_func(port_spec, *[tuple.value()])
+            assert len(port_spec.descriptors()) == len(args)
+            for i, descriptor in enumerate(port_spec.descriptors()):
+                arg_name = 'arg%d' % i
+                sigstring = create_port_spec_string([descriptor.spec_tuple])
+                tuple_port_spec = PortSpec(id=-1,
+                                           name=arg_name,
+                                           type='input',
+                                           sigstring=sigstring)
+                vistrails.api.add_port_spec(tuple._module.id, tuple_port_spec)
+                tuple._process_attr_value(arg_name, args[i])
+                
+                
+            # create tuple object
+            pass
+        elif num_ports == 1:
+            other = args[0]
+            if isinstance(other, vistrails_port):
+                if other._port_spec.type != 'output':
+                    other_module = other._vistrails_module._module
+                    if other_module.has_port_spec(port_spec.name, 
+                                                   'output'):
+                        other_port_spec = \
+                            other_module.get_port_spec(port_spec.name, 
+                                                        'output')
+                    else:
+                        raise TypeError("cannot update an input "
+                                        "port spec")
+                else:
+                    other_port_spec = other._port_spec
+
+                vistrails.api.add_connection(other._vistrails_module._module.id,
+                                   other_port_spec,
+                                   self._module.id, 
+                                   port_spec)
+            elif isinstance(other, vistrails_module):
+                other_port_spec = \
+                    other._module.get_port_spec('self', 'output')
+                vistrails.api.add_connection(other._module.id, 
+                                   other_port_spec,
+                                   self._module.id,
+                                   port_spec)
+        else:
+            vistrails.api.change_parameter(self._module.id,
+                                 port_spec.name,
+                                 [str(x) for x in args])
+
+class QShell(QtGui.QTextEdit):
+    """This class embeds a python interperter in a QTextEdit Widget
+    It is based on PyCute developed by Gerard Vermeulen.
+    
+    """
+    def __init__(self, locals=None, parent=None):
+        """Constructor.
+
+        The optional 'locals' argument specifies the dictionary in which code
+        will be executed; it defaults to a newly created dictionary with key 
+        "__name__" set to "__console__" and key "__doc__" set to None.
+
+        The optional 'log' argument specifies the file in which the interpreter
+        session is to be logged.
+        
+        The optional 'parent' argument specifies the parent widget. If no parent
+        widget has been specified, it is possible to exit the interpreter 
+        by Ctrl-D.
+
+        """
+
+        QtGui.QTextEdit.__init__(self, parent)
+        self.setReadOnly(False)
+        self.setWindowTitle("Console")
+        # to exit the main interpreter by a Ctrl-D if QShell has no parent
+        if parent is None:
+            self.eofKey = QtCore.Qt.Key_D
+        else:
+            self.eofKey = None
+
+        # flag for knowing when selecting text
+        self.selectMode = False
+        self.interpreter = None
+        self.controller = None
+        # storing current state
+        #this is not working on mac
+        #self.prev_stdout = sys.stdout
+        #self.prev_stdin = sys.stdin
+        #self.prev_stderr = sys.stderr
+        # capture all interactive input/output
+        #sys.stdout   = self
+        #sys.stderr   = self
+        #sys.stdin    = self
+        
+        # user interface setup
+        
+        self.setAcceptRichText(False)
+        self.setWordWrapMode(QtGui.QTextOption.WrapAnywhere)
+        
+        conf = get_vistrails_configuration()
+        shell_conf = conf.shell
+        # font
+        font = QtGui.QFont(shell_conf.font_face, shell_conf.font_size)
+        font.setFixedPitch(1)
+        self.setFont(font)
+        self.reset(locals)
+
+    def load_package(self, pkg_name):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        package = reg.get_package_by_name(pkg_name)
+        
+        def create_dict(modules, ns, m, mdesc):
+            md = {}
+            if len(ns) == 0:
+                d = {'_module_desc': mdesc,
+                     '_package': pkg,}
+                modules[m] = type('module', (vistrails_module,), d)
+            else:
+                if ns[0] in modules:
+                    md = create_dict(modules[ns[0]], ns[1:], m, mdesc)
+                else:
+                    md = create_dict(md, ns[1:], m, mdesc)
+                    modules[ns[0]] = md
+            return modules
+        
+        def create_namespace_path(root, modules):
+            for k,v in modules.iteritems():
+                if isinstance(v, dict):
+                    d = create_namespace_path(k,v)
+                    modules[k] = d
+            
+            if root is not None:
+                modules['_package'] = pkg
+                return type(root, (object,), modules)()
+            else:
+                return modules
+        
+        def get_module_init(module_desc):
+            def init(self, *args, **kwargs):
+                self.__dict__['module'] = \
+                    vistrails.api.add_module_from_descriptor(module_desc)
+            return init
+        
+        def get_module(package):
+            def getter(self, attr_name):
+                desc_tuple = (attr_name, '')
+                if desc_tuple in package.descriptors:
+                    module_desc = package.descriptors[desc_tuple]
+                    d = {'_module_desc': module_desc,
+                         '_package': self,}
+                    return type('module', (vistrails_module,), d)
+                else:
+                    raise AttributeError("type object '%s' has no attribute "
+                                         "'%s'" % (self.__class__.__name__, 
+                                                   attr_name))
+            return getter
+        
+        d = {'__getattr__': get_module(package),}
+        pkg = type(package.name, (object,), d)()
+        
+        modules = {}
+        for (m,ns) in package.descriptors:
+            module_desc = package.descriptors[(m,ns)]
+            modules = create_dict(modules, ns.split('|'), m, module_desc)   
+        
+        modules = create_namespace_path(None, modules)
+        
+        for (k,v) in modules.iteritems():
+            setattr(pkg, k, v)
+        return pkg
+
+    def selected_modules(self):
+        shell_modules = []
+        modules = vistrails.api.get_selected_modules()
+        for module in modules:
+            d = {'_module': module}
+            shell_modules.append(type('module', (vistrails_module,), d)())
+        return shell_modules
+
+    def reset(self, locals):
+        """reset(locals) -> None
+        Reset shell preparing it for a new session.
+        
+        """
+        locals['load_package'] = self.load_package
+        locals['selected_modules'] = self.selected_modules
+        if self.interpreter:
+            del self.interpreter
+        self.interpreter = InteractiveInterpreter(locals)
+ 
+        # last line + last incomplete lines
+        self.line    = ''
+        self.lines   = []
+        # the cursor position in the last line
+        self.point   = 0
+        # flag: the interpreter needs more input to run the last lines. 
+        self.more    = 0
+        # flag: readline() is being used for e.g. raw_input() and input()
+        self.reading = 0
+        # history
+        self.history = []
+        self.pointer = 0
+        self.last   = 0
+                # interpreter prompt.
+        if hasattr(sys, "ps1"):
+            sys.ps1
+        else:
+            sys.ps1 = ">>> "
+        if hasattr(sys, "ps2"):
+            sys.ps2
+        else:
+            sys.ps2 = "... "
+        
+        # interpreter banner
+        
+        self.write('VisTrails shell running Python %s on %s.\n' %
+                   (sys.version, sys.platform))
+        self.write('Type "copyright", "credits" or "license"'
+                   ' for more information on Python.\n')
+        self.write(sys.ps1)
+
+
+    def flush(self):
+        """flush() -> None. 
+        Simulate stdin, stdout, and stderr.
+        
+        """
+        pass
+
+    def isatty(self):
+        """isatty() -> int
+        Simulate stdin, stdout, and stderr.
+        
+        """
+        return 1
+
+    def readline(self):
+        """readline() -> str
+        
+        Simulate stdin, stdout, and stderr.
+        
+        """
+        self.reading = 1
+        self.__clearLine()
+        cursor = self.textCursor()
+        cursor.movePosition(QtGui.QTextCursor.End)
+        self.setTextCursor(cursor)
+      
+        while self.reading:
+            qApp.processOneEvent()
+        if len(self.line) == 0:
+            return '\n'
+        else:
+            return self.line 
+    
+    def write(self, text):
+        """write(text: str) -> None
+        Simulate stdin, stdout, and stderr.
+        
+        """
+                
+        cursor = self.textCursor()
+        cursor.movePosition(QtGui.QTextCursor.End)
+        cursor.clearSelection()
+        self.setTextCursor(cursor)
+        self.insertPlainText(text)
+        cursor = self.textCursor()
+        self.last = cursor.position()
+
+    def insertFromMimeData(self, source):
+        if source.hasText():
+            cursor = self.textCursor()
+            cursor.movePosition(QtGui.QTextCursor.End)
+            cursor.clearSelection()
+            self.setTextCursor(cursor)
+            self.__insertText(source.text())
+        
+    def scroll_bar_at_bottom(self):
+        """Returns true if vertical bar exists and is at bottom, or if
+        vertical bar does not exist."""
+        bar = self.verticalScrollBar()
+        if not bar:
+            return True
+        return bar.value() == bar.maximum()
+        
+    def __run(self):
+        """__run() -> None
+        Append the last line to the history list, let the interpreter execute
+        the last line(s), and clean up accounting for the interpreter results:
+        (1) the interpreter succeeds
+        (2) the interpreter fails, finds no errors and wants more line(s)
+        (3) the interpreter fails, finds errors and writes them to sys.stderr
+        
+        """
+        cursor = self.textCursor()
+        cursor.movePosition(QtGui.QTextCursor.End)
+        self.setTextCursor(cursor)
+        # self.set_controller()
+        should_scroll = self.scroll_bar_at_bottom()
+        self.pointer = 0
+        self.history.append(self.line)
+        self.lines.append(self.line)
+        source = '\n'.join(self.lines)
+        self.write('\n')
+        self.more = self.interpreter.runsource(source)
+        if self.more:
+            self.write(sys.ps2)
+        else:
+            self.write(sys.ps1)
+            self.lines = []
+        self.__clearLine()
+        if should_scroll:
+            bar = self.verticalScrollBar()
+            if bar:
+                bar.setValue(bar.maximum())
+
+    def __clearLine(self):
+        """__clearLine() -> None
+        Clear input line buffer.
+        
+        """
+        self.line = ""
+        self.point = 0
+        
+    def __insertText(self, text):
+        """__insertText(text) -> None
+        Insert text at the current cursor position.
+        
+        """
+        self.insertPlainText(text)
+        self.line = self.line[:self.point] + text + self.line[self.point:]
+        self.point += len(text)
+
+    # def add_pipeline(self, p):
+    #     """
+    #     add_pipeline(p) -> None
+    #     Set the active pipeline in the command shell.  This replaces the modules
+    #     variable with the list of current active modules of the selected pipeline.
+    #     """
+    #     if self.controller:
+    #         self.interpreter.active_pipeline = self.controller.current_pipeline
+    #     else:
+    #         self.interpreter.active_pipeline = p
+    #     cmd = 'active_pipeline = self.shell.interpreter.active_pipeline'
+    #     self.interpreter.runcode(cmd)
+    #     cmd = 'modules = self.vistrails_interpreter.find_persistent_entities(active_pipeline)[0]'
+    #     self.interpreter.runcode(cmd)
+
+    def set_controller(self, controller=None):
+        """set_controller(controller: VistrailController) -> None
+        Set the current VistrailController on the shell.
+        """
+        self.controller = controller
+        if controller:
+            self.interpreter.active_pipeline = self.controller.current_pipeline
+            cmd = 'active_pipeline = self.shell.interpreter.active_pipeline'
+            self.interpreter.runcode(cmd)
+            cmd = 'modules = self.vistrails_interpreter.' \
+                'find_persistent_entities(active_pipeline)[0]'
+            self.interpreter.runcode(cmd)
+
+    # def set_pipeline(self):
+    #     """set_active_pipeline() -> None
+    #     Makes sure that the pipeline being displayed is present in the shell for
+    #     direct inspection and manipulation
+    #     """
+    #     self.add_pipeline(None)
+        
+    def keyPressEvent(self, e):
+        """keyPressEvent(e) -> None
+        Handle user input a key at a time.
+
+        Notice that text might come more than one keypress at a time
+        if user is a fast enough typist!
+        
+        """
+        text  = e.text()
+        key   = e.key()
+
+        # NB: Sometimes len(str(text)) > 1!
+        if len(text) and all(ord(x) >= 32 and
+                             ord(x) < 127
+                             for x in str(text)):
+        # exit select mode and jump to end of text
+            cursor = self.textCursor()
+            if self.selectMode or cursor.hasSelection():
+                self.selectMode = False
+                cursor.movePosition(QtGui.QTextCursor.End)
+                cursor.clearSelection()
+                self.setTextCursor(cursor)
+            self.__insertText(text)
+            return
+ 
+        if e.modifiers() & QtCore.Qt.MetaModifier and key == self.eofKey:
+            self.parent().closeSession()
+        
+        if e.modifiers() & QtCore.Qt.ControlModifier:
+            if key == QtCore.Qt.Key_C or key == QtCore.Qt.Key_Insert:
+                self.copy()
+            elif key == QtCore.Qt.Key_V:
+                cursor = self.textCursor()
+                cursor.movePosition(QtGui.QTextCursor.End)
+                cursor.clearSelection()
+                self.setTextCursor(cursor)
+                self.paste()
+            elif key == QtCore.Qt.Key_A:
+                self.selectAll()
+                self.selectMode = True
+            else:
+                e.ignore()
+            return
+
+        if e.modifiers() & QtCore.Qt.ShiftModifier:
+            if key == QtCore.Qt.Key_Insert:
+                cursor = self.textCursor()
+                cursor.movePosition(QtGui.QTextCursor.End)
+                cursor.clearSelection()
+                self.setTextCursor(cursor)
+                self.paste()
+            else:
+                e.ignore()
+            return
+
+        # exit select mode and jump to end of text
+        cursor = self.textCursor()
+        if self.selectMode or cursor.hasSelection():
+            self.selectMode = False
+            cursor.movePosition(QtGui.QTextCursor.End)
+            cursor.clearSelection()
+            self.setTextCursor(cursor)
+
+        if key == QtCore.Qt.Key_Backspace:
+            if self.point:
+                QtGui.QTextEdit.keyPressEvent(self, e)
+                self.point -= 1
+                self.line = self.line[:self.point] + self.line[self.point+1:]
+        elif key == QtCore.Qt.Key_Delete:
+            QtGui.QTextEdit.keyPressEvent(self, e)
+            self.line = self.line[:self.point] + self.line[self.point+1:]
+        elif key == QtCore.Qt.Key_Return or key == QtCore.Qt.Key_Enter:
+            if self.reading:
+                self.reading = 0
+            else:
+                self.__run()
+        elif key == QtCore.Qt.Key_Tab:
+            self.__insertText(text)
+        elif key == QtCore.Qt.Key_Left:
+            if self.point:
+                QtGui.QTextEdit.keyPressEvent(self, e)
+                self.point -= 1
+        elif key == QtCore.Qt.Key_Right:
+            if self.point < len(self.line):
+                QtGui.QTextEdit.keyPressEvent(self, e)
+                self.point += 1
+        elif key == QtCore.Qt.Key_Home:
+            cursor = self.textCursor()
+            cursor.movePosition(QtGui.QTextCursor.StartOfLine)
+            cursor.setPosition(cursor.position() + 4)
+            self.setTextCursor(cursor)
+            self.point = 0
+        elif key == QtCore.Qt.Key_End:
+            QtGui.QTextEdit.keyPressEvent(self, e)
+            self.point = len(self.line)
+        elif key == QtCore.Qt.Key_Up:
+            if len(self.history):
+                if self.pointer == 0:
+                    self.pointer = len(self.history)
+                self.pointer -= 1
+                self.__recall()
+        elif key == QtCore.Qt.Key_Down:
+            if len(self.history):
+                self.pointer += 1
+                if self.pointer == len(self.history):
+                    self.pointer = 0
+                self.__recall()
+        else:
+            e.ignore()
+
+    def __recall(self):
+        """__recall() -> None
+        Display the current item from the command history.
+        
+        """
+        cursor = self.textCursor()
+        cursor.setPosition(self.last)
+        
+        cursor.select(QtGui.QTextCursor.LineUnderCursor)
+
+        cursor.removeSelectedText()
+        self.setTextCursor(cursor)
+        self.insertPlainText(sys.ps1)
+        self.__clearLine()
+        self.__insertText(self.history[self.pointer])
+
+        
+    def focusNextPrevChild(self, next):
+        """focusNextPrevChild(next) -> None
+        Suppress tabbing to the next window in multi-line commands. 
+        
+        """
+        if next and self.more:
+            return 0
+        return QtGui.QTextEdit.focusNextPrevChild(self, next)
+
+    def mousePressEvent(self, e):
+        """mousePressEvent(e) -> None
+        Keep the cursor after the last prompt.
+        """
+        if e.button() == QtCore.Qt.LeftButton:
+            self.selectMode = True
+            QtGui.QTextEdit.mousePressEvent(self, e)
+#            cursor = self.textCursor()
+#            cursor.movePosition(QtGui.QTextCursor.End)
+#            self.setTextCursor(cursor)
+        return
+
+    def hide(self):
+        """suspend() -> None
+        Called when hiding the parent window in order to recover the previous
+        state.
+
+        """
+        #recovering the state
+        sys.stdout   = sys.__stdout__
+        sys.stderr   = sys.__stderr__
+        sys.stdin    = sys.__stdin__
+
+    def show(self):
+        """show() -> None
+        Store previous state and starts capturing all interactive input and 
+        output.
+        
+        """
+        # capture all interactive input/output
+        sys.stdout   = self
+        sys.stderr   = self
+        sys.stdin    = self
+        self.setFocus()
+
+    def saveSession(self, fileName):
+        """saveSession(fileName: str) -> None 
+        Write its contents to a file """
+        output = open(str(fileName), 'w')
+        output.write(self.toPlainText())
+        output.close()
+
+    def restart(self, locals=None):
+        """restart(locals=None) -> None 
+        Restart a new session 
+
+        """
+        self.clear()
+        self.reset(locals)
+
+    def contentsContextMenuEvent(self,ev):
+        """
+        contentsContextMenuEvent(ev) -> None
+        Suppress the right button context menu.
+        
+        """
+        return
+
+################################################################################
+
+def getIPythonDialog():
+    from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
+    from IPython.qt.inprocess import QtInProcessKernelManager
+#    from IPython.kernel.inprocess.ipkernel import InProcessKernel
+
+    km = QtInProcessKernelManager()
+    km.start_kernel()
+    kernel = km.kernel
+    kernel.gui = 'qt4'
+
+    kernel_client = km.client()
+    kernel_client.start_channels()
+
+    def stop():
+        kernel_client.stop_channels()
+        km.shutdown_kernel()
+
+    class IPythonDialog(RichIPythonWidget, QVistrailsPaletteInterface):
+        """This class incorporates an  IPython shell into a dockable widget for use in the
+        VisTrails environment"""
+        def __init__(self, parent=None):
+            RichIPythonWidget.__init__(self, parent)
+            self.kernel_manager = km
+            self.kernel_client = kernel_client
+            self.exit_requested.connect(stop)
+            #locals() returns the original dictionary, not a copy as
+            #the docs say
+    #        self.firstLocals = copy.copy(locals())
+    #        self.shell = IPythonXXX(self.firstLocals,None)
+    #        layout = QtGui.QVBoxLayout()
+    #        layout.setMargin(0)
+    #        layout.setSpacing(0)
+    #        layout.addWidget(self.shell)
+    #        self.setLayout(layout)
+            # self.setWidget(self.shell)
+            self.setWindowTitle("Console")
+            # self.setTitleBarWidget(QtGui.QLabel(self.shell.windowTitle()))
+            # self.monitorWindowTitle(self.shell)
+            self.vistrails_interpreter = get_default_interpreter()
+
+        def visibility_changed(self, visible):
+            QVistrailsPaletteInterface.visibility_changed(self, visible)
+            if visible:
+                self.show()
+            else:
+                self.hide()
+
+        def hide(self):
+            """suspend() -> None
+            Called when hiding the parent window in order to recover the previous
+            state.
+    
+            """
+            #recovering the state
+            sys.stdout   = sys.__stdout__
+            sys.stderr   = sys.__stderr__
+            sys.stdin    = sys.__stdin__
+            RichIPythonWidget.hide(self)
+    
+        def show(self):
+            """show() -> None
+            Store previous state and starts capturing all interactive input and 
+            output.
+            
+            """
+            # capture all interactive input/output
+            sys.stdout   = self
+            sys.stderr   = self
+            sys.stdin    = self
+            RichIPythonWidget.show(self)
+
+        def showEvent(self, e):
+            """showEvent(e) -> None
+            Event handler called when the dialog acquires focus 
+    
+            """
+            self.show()
+
+        def flush(self):
+            """flush() -> None. 
+            Simulate stdin, stdout, and stderr.
+            
+            """
+            pass
+    
+        def isatty(self):
+            """isatty() -> int
+            Simulate stdin, stdout, and stderr.
+            
+            """
+            return 1
+    
+        def readline(self):
+            """readline() -> str
+            
+            Simulate stdin, stdout, and stderr.
+            
+            """
+            return ""
+        
+        def write(self, text):
+            """write(text: str) -> None
+            Simulate stdin, stdout, and stderr.
+            
+            """
+            self._append_plain_text(text, True)
+
+    return IPythonDialog
+
+#install_attempted = False
+#installed = vistrails.core.requirements.python_module_exists('IPython.frontend.qt')
+#if not installed and not install_attempted:
+#    print "attempt to install"
+#    install_attempted = True
+#    from vistrails.core.bundles import installbundle
+#    installed = installbundle.install({'linux-ubuntu': 'ipython-qtconsole'})
+#if installed:
+#    print "installed!"
+#    QShellDialog = getIPythonDialog()
+
+# This is tested with IPython 1.0.0 and its beta versions
+# TODO: Once IPython 1.0 is included in the distro we should add auto-install
+try:
+    from IPython.qt.inprocess import QtInProcessKernelManager
+    try:
+        QShellDialog = getIPythonDialog()
+    except Exception, e:
+        import traceback; traceback.print_exc()
+        print str(e)
+except:
+    pass
diff --git a/vistrails/gui/theme.py b/vistrails/gui/theme.py
new file mode 100644
index 0000000..9d7b878
--- /dev/null
+++ b/vistrails/gui/theme.py
@@ -0,0 +1,750 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+This module describes a theme structure for VisTrails GUI. It
+specifies colors, background images and other measurements
+"""
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core.utils.color import ColorByName
+from vistrails.core.theme import DefaultCoreTheme
+import vistrails.core.system
+
+import unittest
+import vistrails.gui.qt
+
+################################################################################
+
+def _create_configure_shape(w, h):
+    poly = QtGui.QPolygon(3)
+    poly.setPoint(0, 0, 0)
+    poly.setPoint(1, 0, h)
+    poly.setPoint(2, w, h/2)
+    return QtGui.QPolygonF(poly)
+    
+
+class DefaultTheme(DefaultCoreTheme):
+    """
+    This is the default theme which contains color, images,
+    measurements, etc. for Vistrail. Other themes should derive from
+    this class and change appropriate values
+    
+    """
+    
+    def __init__(self):
+        """ DefaultTheme() -> DefaultTheme
+        This is for initializing all Qt objects
+        
+        """
+        DefaultCoreTheme.__init__(self)
+        ######################
+        #### MEASUREMENTS ####
+
+        # Port shape
+        self.PORT_RECT = QtCore.QRectF(0, 0, self.PORT_WIDTH, self.PORT_HEIGHT)
+
+        # Configure button shape
+        self.CONFIGURE_SHAPE = _create_configure_shape(self.CONFIGURE_WIDTH,
+                                                       self.CONFIGURE_HEIGHT)
+
+        #### BRUSH & PEN ####
+        # Background brush of the pipeline view
+        # self.PIPELINE_VIEW_BACKGROUND_BRUSH = QtGui.QBrush(
+        #     QtGui.QImage(vistrails.core.system.vistrails_root_directory() +
+        #                  '/gui/resources/images/pipeline_bg.png'))
+        #     #QtGui.QColor("white"))
+        # # Background brush of the version tree
+        # self.VERSION_TREE_BACKGROUND_BRUSH = QtGui.QBrush(
+        #     QtGui.QImage(vistrails.core.system.vistrails_root_directory() +
+        #                  '/gui/resources/images/version_bg.png'))
+        # Background brush of the query pipeline view
+        # self.QUERY_BACKGROUND_BRUSH = QtGui.QBrush(
+        #     QtGui.QImage(vistrails.core.system.vistrails_root_directory() +
+        #                  '/gui/resources/images/query_bg.png'))
+        self.PIPELINE_VIEW_BACKGROUND_BRUSH = QtGui.QBrush(
+            QtGui.QColor(128, 128, 128))
+        self.VERSION_TREE_BACKGROUND_BRUSH = QtGui.QBrush(
+            QtGui.QColor(240, 240, 240))
+        self.QUERY_BACKGROUND_BRUSH = QtGui.QBrush(
+            QtGui.QColor(119, 143, 159))
+        self.QUERY_RESULT_BACKGROUND_BRUSH = QtGui.QBrush(
+            QtGui.QColor(208, 226, 239))
+
+        # Pen to draw a module shape at regular state
+        self.MODULE_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2)
+        # Pen to draw a module shape when selected
+        self.MODULE_SELECTED_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))), 3)
+        # Brush and pen to draw a module label
+        self.MODULE_LABEL_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2)
+        self.MODULE_LABEL_SELECTED_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2)
+        # Brush to draw a module shape at different states
+        self.MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_grey'))))
+        self.ERROR_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('salmon'))))
+        self.SUCCESS_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('mint'))))
+        self.ACTIVE_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('navajo_white'))))
+        self.COMPUTING_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('yellow'))))
+        self.NOT_EXECUTED_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_goldenrod'))))
+        self.PERSISTENT_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('slate_blue'))))
+        self.SUSPENDED_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('aureoline_yellow'))))
+
+        self.INVALID_MODULE_PEN = QtGui.QPen(QtGui.QBrush(
+                QtGui.QColor(51, 51, 51, 255)), 2)
+        self.INVALID_MODULE_LABEL_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(51, 51, 51, 255)), 2)
+        self.INVALID_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(125, 92, 92, 255))
+
+        # Pen and brush for un-matched queried modules
+        self.GHOSTED_MODULE_PEN = QtGui.QPen(QtGui.QBrush(
+                QtGui.QColor(*(ColorByName.get_int('dark_dim_grey')))), 2)
+        # Pen to draw module label when it is unmatched due to a query
+        self.GHOSTED_MODULE_LABEL_PEN = QtGui.QPen(QtGui.QBrush(
+                QtGui.QColor(*(ColorByName.get_int('dark_dim_grey')))), 2)
+        self.GHOSTED_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_dim_grey'))))
+
+        # Pen and brush for breakpoint modules
+        self.BREAKPOINT_MODULE_PEN = QtGui.QPen(QtGui.QBrush(
+                QtGui.QColor(*(ColorByName.get_int('dark_dim_grey')))), 2)
+        self.BREAKPOINT_MODULE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_dim_grey'))))
+        self.BREAKPOINT_MODULE_LABEL_PEN = QtGui.QPen(QtGui.QBrush(
+                QtGui.QColor(*(ColorByName.get_int('dark_dim_grey')))), 2)
+
+        # Module pen styles
+        self.ABSTRACTION_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2,
+                                          QtCore.Qt.DotLine)
+        self.GROUP_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2,
+                                          QtCore.Qt.DashLine)
+
+        # Brush and pen to draw a port shape at regular state
+        self.PORT_PEN_WIDTH_MANDATORY = 'mandatory'
+        self.PORT_PEN_WIDTH_NORMAL = 'normal'
+        self.PORT_PEN_WIDTH_SELECTED = 'selected'
+        self.PORT_PEN_WIDTHS = {self.PORT_PEN_WIDTH_MANDATORY: 1.5, 
+                                self.PORT_PEN_WIDTH_NORMAL: 1.0, 
+                                self.PORT_PEN_WIDTH_SELECTED: 3.0}
+        self.PORT_PEN_COLOR_NORMAL = 'normal'
+        self.PORT_PEN_COLOR_FULL = 'full'
+        self.PORT_PEN_COLOR_INVALID = 'invalid'
+        self.PORT_PEN_COLOR_GHOSTED = 'ghosted'
+        self.PORT_PEN_COLOR_SELECTED = 'selected'
+        self.PORT_PEN_COLORS = \
+            {self.PORT_PEN_COLOR_NORMAL: \
+                 QtGui.QColor(*(ColorByName.get_int('black'))),
+             self.PORT_PEN_COLOR_FULL: \
+                 QtGui.QColor(*(ColorByName.get_int('dark_dim_grey'))),
+             self.PORT_PEN_COLOR_INVALID: QtGui.QColor(51, 51, 51, 255),
+             self.PORT_PEN_COLOR_GHOSTED: \
+                 QtGui.QColor(*(ColorByName.get_int('dark_dim_grey'))),
+             self.PORT_PEN_COLOR_SELECTED: \
+                 QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))
+             }
+            
+        self.PORT_PENS = {}
+        for (color_type, color) in self.PORT_PEN_COLORS.iteritems():
+            for (width_type, width) in self.PORT_PEN_WIDTHS.iteritems():
+                self.PORT_PENS[(color_type, width_type)] = \
+                    QtGui.QPen(QtGui.QBrush(color), width)
+
+        self.PORT_CONNECTED_BRUSH = QtGui.QBrush(
+            QtGui.QColor(0,0,0,60))
+        self.PORT_BRUSH = QtGui.QBrush(QtCore.Qt.NoBrush)
+        self.PORT_MANDATORY_BRUSH = QtGui.QBrush(QtGui.QColor(255,255,255,180))
+        self.GHOSTED_PORT_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_dim_grey'))))
+        self.INVALID_PORT_BRUSH = QtGui.QBrush(
+            QtGui.QColor(125, 92, 92, 255))
+
+        # Pen and brush for drawing the configure button
+        self.CONFIGURE_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 1)
+        self.CONFIGURE_BRUSH= QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black'))))
+
+        # Pen and brush for drawing the ghosted configure button
+        self.GHOSTED_CONFIGURE_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('dark_dim_grey')))), 2)
+        self.GHOSTED_CONFIGURE_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('dark_dim_grey'))))
+
+        # Brush and pen to draw connections
+        self.CONNECTION_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2)
+        self.CONNECTION_SELECTED_PEN = QtGui.QPen(
+                QtGui.QBrush(
+                    QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))),
+                3,
+                QtCore.Qt.SolidLine)
+        self.CONNECTION_SELECTED_CONVERTING_PEN = QtGui.QPen(
+                QtGui.QBrush(
+                    QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))),
+                3,
+                QtCore.Qt.DotLine)
+        self.CONNECTION_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black'))))
+
+        # Pen for drawing while connecting any ghosted modules
+        self.GHOSTED_CONNECTION_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('dark_dim_grey')))), 2)
+
+        # Pen to draw version tree node
+        self.VERSION_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 2)    
+        self.GHOSTED_VERSION_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_grey')))), 2)    
+        self.VERSION_SELECTED_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))), 4)
+
+        self.VERSION_LABEL_COLOR = \
+            QtGui.QColor(*(ColorByName.get_int('black')))
+        self.GHOSTED_VERSION_LABEL_COLOR = \
+            QtGui.QColor(*(ColorByName.get_int('light_grey')))
+
+        # Brush to draw version belongs to the current user
+        self.VERSION_USER_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('desatcornflower'))))
+        self.GHOSTED_VERSION_USER_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('very_light_grey'))))
+
+        # Brush to draw version belongs to the other users
+        self.VERSION_OTHER_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('melon'))))
+    
+        # Brush and pen to draw a link between two versions
+        self.LINK_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('black')))), 1.5)
+        self.LINK_SELECTED_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))), 3)
+        self.GHOSTED_LINK_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*(ColorByName.get_int('light_grey')))), 2)
+
+        # Selection box color
+        self.SELECTION_BOX_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('light_grey')))
+        self.SELECTION_BOX_PEN = QtGui.QPen(QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('lamp_black'))), 1)
+        
+        # Color of the version is being diff from in
+        self.VISUAL_DIFF_FROM_VERSION_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('melon')))
+        
+        # Color of the version is being diff to in
+        self.VISUAL_DIFF_TO_VERSION_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('steel_blue_light')))
+        
+        # Color of the paramter changed modules in Visual Diff
+        self.VISUAL_DIFF_PARAMETER_CHANGED_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('light_grey')))
+        
+        # Color of the shared modules in Visual Diff
+        self.VISUAL_DIFF_SHARED_BRUSH = QtGui.QBrush(
+            QtGui.QColor(155, 155, 155, 255))
+
+        # Color of shared modules in Visual Diff matched by heuristic
+        self.VISUAL_DIFF_MATCH_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('white')))
+        
+        # Color of partially shared modules in Visual Diff
+        self.VISUAL_DIFF_SUMMARY_BRUSH = QtGui.QBrush(
+            QtGui.QColor(*ColorByName.get_int('spring_green')))
+
+        # Pen & Brush of the circled id on the right corner of the
+        # virtual cell label
+        self.ANNOTATED_ID_PEN = QtGui.QPen(
+            QtCore.Qt.white)
+        self.ANNOTATED_ID_BRUSH = QtGui.QBrush(
+            QtGui.QColor(157, 0, 0, 255))
+    
+        #### FONTS ####        
+        # Font for module text
+        self.MODULE_FONT = QtGui.QFont("Arial", 14, QtGui.QFont.Bold)
+        self.MODULE_FONT_METRIC = QtGui.QFontMetrics(self.MODULE_FONT)
+        self.MODULE_DESC_FONT = QtGui.QFont("Arial", 12)
+        self.MODULE_DESC_FONT_METRIC = QtGui.QFontMetrics(self.MODULE_DESC_FONT)
+    
+        # Font for version text
+        self.VERSION_FONT = QtGui.QFont("Arial", 15, QtGui.QFont.Bold)
+        self.VERSION_FONT_METRIC = QtGui.QFontMetrics(self.VERSION_FONT)
+        self.VERSION_DESCRIPTION_FONT = QtGui.QFont("Arial", 15, QtGui.QFont.Normal, 
+                                                    True)
+        self.VERSION_DESCRIPTION_FONT_METRIC = \
+            QtGui.QFontMetrics(self.VERSION_DESCRIPTION_FONT)
+        self.VERSION_PROPERTIES_FONT = QtGui.QFont("Arial", 12)
+        self.VERSION_PROPERTIES_FONT_METRIC = \
+            QtGui.QFontMetrics(self.VERSION_PROPERTIES_FONT)
+        self.VERSION_PROPERTIES_PEN =  QtGui.QBrush(
+            QtGui.QColor(20, 100, 20, 255))
+            
+
+        # Font showing on the Parameter Inspector window of Visual Diff
+        self.VISUAL_DIFF_PARAMETER_FONT = QtGui.QFont('Arial', 10)
+        
+        # Font showing on the Legend window of Visual Diff
+        self.VISUAL_DIFF_LEGEND_FONT = QtGui.QFont('Arial', 9)
+
+        # Font for PythonSource
+        self.PYTHON_SOURCE_EDITOR_FONT = QtGui.QFont('Courier', 10, 
+                                                     QtGui.QFont.Normal)
+        # Font for Splash Screen messages
+        self.SPLASH_SCREEN_FONT = QtGui.QFont('Arial', 10,
+                                              QtGui.QFont.Normal)
+        #### ICONS & IMAGES ####
+        #The application disclaimer image
+        self.DISCLAIMER_IMAGE = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/disclaimer.png')
+        #The application icon
+        self.APPLICATION_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/vistrails_icon_small.png')
+
+        #The application pixmap
+        self.APPLICATION_PIXMAP = QtGui.QPixmap(
+             vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/vistrails_icon_small.png')
+
+        # The execute icons in the first spot of vistrail view toolbar
+        self.EXECUTE_PIPELINE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/execute.png')
+        self.EXECUTE_EXPLORE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/execute_explore.png')
+
+        # The undo icons for the vistrail view toolbar
+        self.UNDO_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/undo.png')
+
+        # The redo icons for the vistrail view toolbar
+        self.REDO_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/redo.png')
+
+        # Icon to select the tabbed view
+        self.TABBED_VIEW_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/tabbed_view.png')
+    
+        # Icon to select the horizontal split view
+        self.HORIZONTAL_VIEW_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/hor_view.png')
+    
+        # Icon to select the vertical split view
+        self.VERTICAL_VIEW_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/ver_view.png')
+    
+        # Icon to select the docking-style view
+        self.DOCK_VIEW_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/dock_view.png')
+    
+        # Toolbar icon for creating a new Vistrail
+        self.NEW_VISTRAIL_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/new_vistrail.png')
+        
+        # Toolbar icon for opening a vistrail
+        self.OPEN_VISTRAIL_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/open_vistrail.png')
+
+        #Toolbar icon for opening a vistrail from a database
+        self.OPEN_VISTRAIL_DB_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/openfromdb.png')
+
+        #Icon for database connections
+        self.DB_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/database.png')
+
+        #Icon for vistrails files
+        self.FILE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/file.png')
+        
+        # Toolbar icon for save the current Vistrail
+        self.SAVE_VISTRAIL_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/save_vistrail.png')
+    
+        # Toolbar icon for toggling console mode window
+        self.CONSOLE_MODE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/console.png')
+
+        # Background image of the Visual Diff pipeline view
+        self.VISUAL_DIFF_BACKGROUND_IMAGE = QtGui.QImage(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/pipeline_bg.png')
+        
+        # Toolbar icon for showing the Parameter Inspector window
+        self.VISUAL_DIFF_SHOW_PARAM_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/show_params.png')
+        
+        # Toolbar icon for showing the Legend window
+        self.VISUAL_DIFF_SHOW_LEGEND_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/show_legends.png')
+
+        # Toolbar icon for creating an analogy
+        self.VISUAL_DIFF_CREATE_ANALOGY_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/analogy.png')
+
+        # Toolbar icon for close button on the vistrail tabbar
+        self.VIEW_MANAGER_CLOSE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/closeview.png')
+
+        # Toolbar icon for the dock toolbutton on the splitted window
+        self.DOCK_BACK_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/dockback.png')
+
+        # Icon for adding string in the parameter exploration widget
+        self.ADD_STRING_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/edit_add.png')
+
+        # Icon for moving string up in the parameter exploration widget
+        self.UP_STRING_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/up.png')
+
+        # Icon for moving string up in the parameter exploration widget
+        self.DOWN_STRING_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/down.png')
+
+        # Icon for expand all/collapse all buttons in the Module Palette
+        self.EXPAND_ALL_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/expand_all.png')
+        
+        self.COLLAPSE_ALL_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/collapse_all.png')
+        
+        # Icons for tree/list view buttons in the Workspace
+        self.LIST_VIEW_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/list_view.png')
+        
+        self.TREE_VIEW_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/tree_view.png')
+
+        # Toolbar icons for views
+        self.PIPELINE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/pipeline.png')
+        self.HISTORY_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/history.png')
+        self.QUERY_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/full_tree.png')
+        self.EXPLORE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/explore.png')
+        self.PROVENANCE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/search_database.png')
+
+        # Toolbar icon for visual query on a vistrail
+        self.VISUAL_QUERY_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/visual_query.png')
+        
+        # Toolbar icon for viewing the whole version tree
+        self.VIEW_FULL_TREE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/full_tree.png')
+
+        # Toolbar icon for viewing the whole version tree
+        self.PERFORM_PARAMETER_EXPLORATION_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/perform_pe.png')
+
+        # Toolbar icon for dragging pixmap of VisDiff
+        self.VERSION_DRAG_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/dragging.png')
+
+        #Tabbar icon for detach a tab        
+        self.DETACH_TAB_ICON = QtGui.QIcon()
+        self.DETACH_TAB_ICON.addFile(vistrails.core.system.vistrails_root_directory() +
+                                     '/gui/resources/images/detach.png',
+                                     mode=QtGui.QIcon.Normal)
+        self.DETACH_TAB_ICON.addFile(vistrails.core.system.vistrails_root_directory() +
+                                     '/gui/resources/images/detach_on.png',
+                                     mode=QtGui.QIcon.Active)
+
+        #toolbutton icon for pin/unpin palette
+        self.PINNED_PALETTE_ICON = QtGui.QIcon(
+                                vistrails.core.system.vistrails_root_directory() +
+                                '/gui/resources/images/pinned.png')
+        self.UNPINNED_PALETTE_ICON = QtGui.QIcon(
+                                vistrails.core.system.vistrails_root_directory() +
+                                '/gui/resources/images/unpinned.png')
+        # Parameter Exploration Pixmaps
+        self.EXPLORE_COLUMN_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/column.png')
+        self.EXPLORE_ROW_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/row.png')
+        self.EXPLORE_SHEET_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/sheet.png')
+        self.EXPLORE_TIME_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/time.png')        
+        self.EXPLORE_SKIP_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/skip.png')        
+        self.REMOVE_PARAM_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/remove_param.png')        
+        self.RIGHT_ARROW_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/right.png')        
+        self.LEFT_ARROW_PIXMAP = QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/left.png')
+        
+        # Cursor for zoom in/out graphics views
+        self.SELECT_CURSOR = QtGui.QCursor(QtCore.Qt.ArrowCursor)
+        self.OPEN_HAND_CURSOR = QtGui.QCursor(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/open_hand.png'))
+        self.CLOSE_HAND_CURSOR = QtGui.QCursor(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/close_hand.png'))
+        self.ZOOM_CURSOR = QtGui.QCursor(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/zoom.png'))
+                
+        # Cursor icon for zoom in/out graphics views
+        self.SELECT_ICON = QtGui.QIcon(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/select_icon.png'))
+        self.PAN_ICON = QtGui.QIcon(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/pan_icon.png'))
+        self.ZOOM_ICON = QtGui.QIcon(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/zoom_icon.png'))
+        
+        # Mashup Icons
+        self.EXECUTE_MASHUP_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/mashup_execute.png')
+        self.MASHUP_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/mashup_create.png')
+        self.MASHUP_ALIAS_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/alias.png')
+
+        # Job View Icons
+        self.JOB_SCHEDULED = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/appointment-new.png')
+        self.JOB_FINISHED = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/emblem-important.png')
+        self.JOB_CHECKING = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/view-refresh.png')
+        
+        # Saved Queries icons
+        self.QUERY_VIEW_ICON = self.ZOOM_ICON
+        self.QUERY_ARROW_ICON = QtGui.QIcon(QtGui.QPixmap(
+                vistrails.core.system.vistrails_root_directory() +
+                '/gui/resources/images/zoom_arrow_icon.png'))
+        self.QUERY_EDIT_ICON = QtGui.QIcon(QtGui.QPixmap(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/edit.png'))
+
+        # Icon on the button to switch to single/multi line string edition
+        self.MULTILINE_STRING_ICON = QtGui.QIcon(QtGui.QPixmap(
+                vistrails.core.system.vistrails_root_directory() +
+                '/gui/resources/images/multiline_string_icon.png'))
+
+        #### COLORS ####
+        # Color for the PIP frame
+        self.PIP_FRAME_COLOR = QtGui.QColor(
+            *(ColorByName.get_int('yellow_light')))
+
+        # Color of selected methods in the modules method area
+        self.METHOD_SELECT_COLOR = QtGui.QColor(
+            *ColorByName.get_int('yellow_light'))
+
+        # Color of the hover/unhover alias labels
+        self.HOVER_DEFAULT_COLOR = QtGui.QColor(
+            *ColorByName.get_int('black'))
+        self.HOVER_SELECT_COLOR = QtGui.QColor(
+            *ColorByName.get_int('blue'))
+        
+        # colors for debug messages
+        self.DEBUG_COLORS = {
+                'DEBUG': QtGui.QColor("#777777"),
+                'INFO': QtGui.QColor(QtCore.Qt.black),
+                'WARNING': QtGui.QColor("#707000"),
+                'CRITICAL': QtGui.QColor(QtCore.Qt.red),
+            }
+        class QTransparentColor(QtGui.QColor):
+            def name(self):
+                return 'transparent'
+        self.DEBUG_FILTER_BACKGROUND_COLOR = QTransparentColor("transparent")
+        
+class MacTheme(DefaultTheme):
+    def __init__(self):
+        
+        DefaultTheme.__init__(self)
+        #### ICONS & IMAGES ####
+        #The application icon
+        self.APPLICATION_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/vistrails_icon.png')
+
+        #The application pixmap
+        self.APPLICATION_PIXMAP = QtGui.QPixmap(
+             vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/vistrails_icon.png')
+
+        # Toolbar icon for close button on the vistrail tabbar
+        self.VIEW_MANAGER_CLOSE_ICON = QtGui.QIcon(
+            vistrails.core.system.vistrails_root_directory() +
+            '/gui/resources/images/mac/closetab.png')
+        
+        #### FONTS ####
+        # Font for PythonSource
+        self.PYTHON_SOURCE_EDITOR_FONT = QtGui.QFont('Monaco', 11, 
+                                                     QtGui.QFont.Normal)
+        
+        # Font for Splash Screen messages
+        self.SPLASH_SCREEN_FONT = QtGui.QFont('Helvetica', 10,
+                                              QtGui.QFont.Light)
+        
+class LinuxTheme(DefaultTheme):
+    def __init__(self):
+        DefaultTheme.__init__(self)
+        #### FONTS ####
+        # Font for PythonSource
+        self.PYTHON_SOURCE_EDITOR_FONT = QtGui.QFont('Monospace', 10, 
+                                                     QtGui.QFont.Normal)
+                
+class ThemeHolder(object):
+    """
+    ThemeHolder is a class holding a theme and exposed that theme
+    atrributes as attributes of itself. This is useful for global
+    import of the CurrentTheme variable
+    
+    """
+    def __init__(self):
+        object.__init__(self)
+        self.theme = None
+
+    def setTheme(self, theme):
+        """ setTheme(theme: subclass of DefaultTheme) -> None
+        Set the current theme to theme
+        
+        """
+        # This way, the lookups into the theme are much faster, since
+        # there's no function calls involved
+        self.__dict__.update(theme.__dict__)
+
+def get_current_theme():
+    """get_current_theme() -> subclass of DefaultTheme
+    Instantiates the theme according to the current platform """
+    if vistrails.core.system.systemType in ['Darwin']:
+        return MacTheme()
+    elif vistrails.core.system.systemType in ['Linux']:
+        return LinuxTheme()
+    else:
+        return DefaultTheme()
+    
+def initializeCurrentTheme():
+    """ initializeCurrentTheme() -> None
+    Assign the current theme to the default theme
+    
+    """
+    global CurrentTheme
+    
+    CurrentTheme.setTheme(get_current_theme())
+
+global CurrentTheme
+CurrentTheme = ThemeHolder()
+    
+################################################################################
+
+
+class TestPresetColor(unittest.TestCase):
+    """
+    A few simple tests to make sure Preset is working as expected
+    
+    """
+    def setUp(self):
+        vistrails.gui.qt.createBogusQtGuiApp()
+
+    def testColorValues(self):
+        initializeCurrentTheme()
+        self.assertEquals(CurrentTheme.CONNECTION_CONTROL_POINTS,
+                          20)
+        
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/gui/utils.py b/vistrails/gui/utils.py
new file mode 100644
index 0000000..86edd6a
--- /dev/null
+++ b/vistrails/gui/utils.py
@@ -0,0 +1,243 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+""" Utilities for creating simple dialogs, notifications in Vistrails
+without exposing Qt codes """
+from PyQt4 import QtGui, QtCore
+from vistrails.gui.theme import CurrentTheme
+import vistrails.gui.theme
+from vistrails.core.system import systemType
+
+import unittest
+
+################################################################################
+
+OK_BUTTON              = QtGui.QMessageBox.Ok
+OPEN_BUTTON            = QtGui.QMessageBox.Open
+SAVE_BUTTON            = QtGui.QMessageBox.Save
+CANCEL_BUTTON          = QtGui.QMessageBox.Cancel
+CLOSE_BUTTON           = QtGui.QMessageBox.Close
+DISCARD_BUTTON         = QtGui.QMessageBox.Discard
+APPLY_BUTTON           = QtGui.QMessageBox.Apply
+RESET_BUTTON           = QtGui.QMessageBox.Reset
+RESTOREDEFAULTS_BUTTON = QtGui.QMessageBox.RestoreDefaults
+HELP_BUTTON            = QtGui.QMessageBox.Help
+SAVEALL_BUTTON         = QtGui.QMessageBox.SaveAll
+YES_BUTTON             = QtGui.QMessageBox.Yes
+YESTOALL_BUTTON        = QtGui.QMessageBox.YesToAll
+NO_BUTTON              = QtGui.QMessageBox.No
+NOTOALL_BUTTON         = QtGui.QMessageBox.NoToAll
+ABORT_BUTTON           = QtGui.QMessageBox.Abort
+RETRY_BUTTON           = QtGui.QMessageBox.Retry
+IGNORE_BUTTON          = QtGui.QMessageBox.Ignore
+NOBUTTON_BUTTON        = QtGui.QMessageBox.NoButton
+
+_buttons_captions_dict = { OK_BUTTON   : "Ok",
+                           OPEN_BUTTON : "Open",
+                           SAVE_BUTTON : "Save",
+                           CANCEL_BUTTON : "Cancel",
+                           CLOSE_BUTTON : "Close",
+                           DISCARD_BUTTON : "Discard",
+                           APPLY_BUTTON : "Apply",
+                           RESET_BUTTON : "Reset",
+                           RESTOREDEFAULTS_BUTTON : "Restore Defaults",
+                           HELP_BUTTON : "Help",
+                           SAVEALL_BUTTON : "Save All",
+                           YES_BUTTON : "Yes",
+                           NO_BUTTON : "No",
+                           NOTOALL_BUTTON : "No to All",
+                           ABORT_BUTTON : "Abort",
+                           RETRY_BUTTON : "Retry",
+                           IGNORE_BUTTON : "Ignore",
+                           NOBUTTON_BUTTON : ""}
+
+
+def show_warning(title, message):
+    """ show_warning(title: str, message: str) -> None
+    Show a warning  message box with a specific title and contents
+    Deprecated, consider using core.debug instead!
+    """
+    if systemType not in ['Darwin']:
+        QtGui.QMessageBox.warning(None, title, message)
+    else:
+        show_custom(title,message)
+
+def show_info(title, message):
+    """ show_info(title: str, message: str) -> None
+    Show an information message box with a specific title and contents
+    Deprecated, consider using core.debug instead!
+    """
+    if systemType not in ['Darwin']:
+        QtGui.QMessageBox.information(None, title, message)
+    else:
+        show_custom(title,message)
+
+def show_question(title,
+                  message,
+                  buttons = [OK_BUTTON],
+                  default = NOBUTTON_BUTTON):
+    """ show_question(title: str,
+                      message: str,
+                      buttons: list of buttons (defined above),
+                      default: button (defined above)) -> button
+    Show a question message with a specific title, message and a set
+    of buttons defined by the list buttons. Default button is the
+    button that will take role when the user press 'Enter' without
+    selecting a button. The function returns the button that ends the
+    dialog.
+
+    """
+    qButtons = QtGui.QMessageBox.StandardButtons()
+    for button in buttons:
+        qButtons |= button
+    if systemType not in ['Darwin']:
+        return QtGui.QMessageBox.question(None, title, message,
+                                          qButtons, default)
+    else:
+        return show_custom(title,message,None,buttons)
+
+def build_custom_window(title, message, icon=None,
+                buttons = [OK_BUTTON], default=OK_BUTTON, escape=-1,
+                modal=True, parent=None):
+    """ show_custom(title: str,
+                    message: str,
+                    icon: QPixmap,
+                    buttons: list of buttons (defined above),
+                    default: str,
+                    escape: str,
+                    modal: bool,
+                    parent: QWidget) -> QMessageBox
+    Build a custom dialog box.
+    Default is the button in buttons that will be clicked if
+    the user presses Enter. escape is the button in buttons
+    that will be clicked if Esc is pressed.
+    The function returns the index of the button that was pressed.
+
+    """
+    msgBox = QtGui.QMessageBox(parent)
+    abstractButtons = {}
+    for b in buttons:
+        msgBox.addButton(b)
+        abstractButtons[b] = msgBox.button(b)
+    if abstractButtons.has_key(default):
+        msgBox.setDefaultButton(abstractButtons[default])
+    if escape != -1:
+        msgBox.setEscapeButton(abstractButtons[escape])
+    msgBox.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.WindowStaysOnTopHint)
+    if modal:
+        msgBox.setWindowModality(QtCore.Qt.ApplicationModal)
+    else:
+        msgBox.setWindowModality(QtCore.Qt.NonModal)
+    if icon:
+        msgBox.setIconPixmap(icon)
+    else:
+        pixmap = CurrentTheme.APPLICATION_PIXMAP.scaledToHeight(48)
+        msgBox.setIconPixmap(pixmap)
+
+    #mac doesn't show a window title
+    #we need to include the title as part of the message
+    if systemType not in ['Darwin']:
+        msgBox.setWindowTitle(title)
+        msgBox.setText(message)
+    else:
+        msgBox.setText("%s\n%s"%(title,
+                                 message))
+
+    qButtons = QtGui.QMessageBox.StandardButtons()
+    return msgBox
+
+def show_custom(title, message, icon=None,
+                buttons = [OK_BUTTON], default=OK_BUTTON, escape=-1):
+    """ show_custom(title: str,
+                    message: str,
+                    icon: QPixmap,
+                    buttons: list of buttons (defined above),
+                    default: str,
+                    escape: str) -> int
+    Show a custom dialog box.
+    Default is the button in buttons that will be clicked if
+    the user presses Enter. escape is the button in buttons
+    that will be clicked if Esc is pressed.
+    The function returns the index of the button that was pressed.
+
+    """
+    msgBox = build_custom_window(title,message,icon,
+                          buttons, default,escape)
+    return msgBox.exec_()
+
+def getBuilderWindow():
+    """ getBuilderWindow() -> QMainWindow
+    Return the current builder window of VisTrails if exists    
+    """
+    try:
+        return QtCore.QCoreApplication.instance().builderWindow
+    except:
+        return None
+
+def getCurrentVersion():
+    """ getCurrentVersion() -> int
+    Return the current version on VisTrails, return -1 if the GUI is not available
+    
+    """
+    builderWindow = getBuilderWindow()
+    if builderWindow!=None:
+        current_view = builderWindow.viewManager.currentWidget()
+        if current_view!=None:
+            return current_view.controller.current_version
+    return -1
+
+def initTheme():
+    return vistrails.gui.theme.initializeCurrentTheme()
+
+################################################################################
+# VisTrails GUI unit test class - setUp and teardown ensure no
+# vistrails are open
+
+
+class TestVisTrailsGUI(unittest.TestCase):
+
+    def _close_all(self):
+        import vistrails.api
+        # Close all open vistrails
+        vistrails.api.close_all_vistrails()
+
+    def setUp(self):
+        # we need to call twice because VisTrails will create a new vistrail
+        # by default if we are not closing the first vistrail.
+        self._close_all()
+        self._close_all()
+        
+    def tearDown(self):
+        self._close_all()
diff --git a/vistrails/gui/variable_dropbox.py b/vistrails/gui/variable_dropbox.py
new file mode 100644
index 0000000..748df0d
--- /dev/null
+++ b/vistrails/gui/variable_dropbox.py
@@ -0,0 +1,510 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file contains widgets that can be used for dropping Constant class
+variables. It will construct an input form for the value.
+
+QVariableDropBox
+QVerticalWidget
+QVariableInputWidget
+QVariableInputForm
+QDragVariableLabel
+QHoverVariableLabel
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core import debug
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.modules import module_registry
+from vistrails.core.modules.basic_modules import Constant
+from vistrails.core.vistrail.vistrailvariable import VistrailVariable
+from vistrails.gui.common_widgets import QPromptWidget
+from vistrails.gui.modules import get_widget_class
+from vistrails.gui.modules.constant_configuration import StandardConstantWidget, \
+    FileChooserToolButton
+from vistrails.gui.module_palette import QModuleTreeWidget
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import show_question, YES_BUTTON, NO_BUTTON
+import uuid
+
+################################################################################
+
+class QVariableDropBox(QtGui.QScrollArea):
+    """
+    QVariableDropBox is just a widget such that items that subclass
+    Constant from the module palette can be dropped into its client rect.
+    It then constructs an input form based on the type of handling widget
+    
+    """
+    def __init__(self, parent=None):
+        """ QVariableDropBox(parent: QWidget) -> QVariableDropBox
+        Initialize widget constraints
+        
+        """
+        QtGui.QScrollArea.__init__(self, parent)
+        self.setAcceptDrops(True)
+        self.setWidgetResizable(True)
+        self.vWidget = QVerticalWidget()
+        self.setWidget(self.vWidget)
+        self.updateLocked = False
+        self.controller = None
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the module palette
+        
+        """
+        if isinstance(event.source(), QModuleTreeWidget):
+            data = event.mimeData()
+            if hasattr(data, 'items'):
+                event.accept()
+        else:
+            event.ignore()
+        
+    def dragMoveEvent(self, event):
+        """ dragMoveEvent(event: QDragMoveEvent) -> None
+        Set to accept drag move event from the module palette
+        
+        """
+        if isinstance(event.source(), QModuleTreeWidget):
+            data = event.mimeData()
+            if hasattr(data, 'items'):
+                event.accept()
+
+    def dropEvent(self, event):
+        """ dropEvent(event: QDragMoveEvent) -> None
+        Accept drop event to add a new variable
+        
+        """
+        if isinstance(event.source(), QModuleTreeWidget):
+            data = event.mimeData()
+            if hasattr(data, 'items'):
+                event.accept()
+                assert len(data.items) == 1
+                item = data.items[0]
+                if issubclass(item.descriptor.module, Constant):
+                    if item.descriptor and self.controller:
+                        self.lockUpdate()
+                        (text, ok) = QtGui.QInputDialog.getText(self,
+                                                                'Set Variable Name',
+                                                                'Enter the variable name',
+                                                                QtGui.QLineEdit.Normal,
+                                                                '')
+                        var_name = str(text).strip()
+                        while ok and self.controller.check_vistrail_variable(var_name):
+                            msg =" This variable name is already being used.\
+ Please enter a different variable name "
+                            (text, ok) = QtGui.QInputDialog.getText(self,
+                                                                    'Set Variable Name',
+                                                                    msg,
+                                                                    QtGui.QLineEdit.Normal,
+                                                                    text)
+                            var_name = str(text).strip()
+                        if ok:
+                            self.vWidget.addVariable(str(uuid.uuid1()), var_name, item.descriptor)
+                            self.scrollContentsBy(0, self.viewport().height())
+                        self.unlockUpdate()
+                #self.emit(QtCore.SIGNAL("paramsAreaChanged"))
+
+    def updateController(self, controller):
+        """ updateController(controller: VistrailController) -> None
+        Construct input forms for a controller's variables
+        
+        """
+        # we shouldn't do this whenver the controller changes...
+        if self.controller != controller:
+            self.controller = controller
+            if self.updateLocked: return
+            self.vWidget.clear()
+            if controller:
+                reg = module_registry.get_module_registry()
+                for var in [v for v in controller.vistrail.vistrail_vars]:
+                    try:
+                        descriptor = reg.get_descriptor_by_name(var.package,
+                                                                var.module, 
+                                                                var.namespace)
+                    except module_registry.ModuleRegistryException:
+                        debug.critical("Missing Module Descriptor for vistrail"
+                                       " variable %s\nPackage: %s\nType: %s"
+                                       "\nNamespace: %s" % \
+                                           (var.name, var.package, var.module, 
+                                            var.namespace))
+                        continue
+                    self.vWidget.addVariable(var.uuid, var.name, descriptor, 
+                                             var.value)
+                self.vWidget.showPromptByChildren()
+            else:
+                self.vWidget.showPrompt(False)
+
+    def lockUpdate(self):
+        """ lockUpdate() -> None
+        Do not allow updateModule()
+        
+        """
+        self.updateLocked = True
+        
+    def unlockUpdate(self):
+        """ unlockUpdate() -> None
+        Allow updateModule()
+        
+        """
+        self.updateLocked = False
+
+class QVerticalWidget(QPromptWidget):
+    """
+    QVerticalWidget is a widget holding other variable widgets
+    vertically
+    
+    """
+    def __init__(self, parent=None):
+        """ QVerticalWidget(parent: QWidget) -> QVerticalWidget
+        Initialize with a vertical layout
+        
+        """
+        QPromptWidget.__init__(self, parent)
+        self.setPromptText("Drag a constant from the Modules panel to create a variable")
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().setMargin(0)
+        self.layout().setSpacing(5)
+        self.layout().setAlignment(QtCore.Qt.AlignTop)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                           QtGui.QSizePolicy.Expanding)
+        self.setMinimumHeight(20)
+        self._variable_widgets = []
+        
+    def addVariable(self, uuid, name, descriptor, value=''):
+        """ addVariable(uuid:str, name: str, descriptor: ModuleDescriptor, value: str) -> None
+        Add an input form for the variable
+        
+        """
+        inputForm = QVariableInputWidget(uuid, name, descriptor, value, self)
+        self.connect(inputForm, QtCore.SIGNAL('deleted(QWidget*)'), 
+                     self.delete_form)
+        self.layout().addWidget(inputForm)
+        inputForm.show()
+        self.setMinimumHeight(self.layout().minimumSize().height())
+        self.showPrompt(False)
+        self._variable_widgets.append(inputForm)
+
+    def clear(self):
+        """ clear() -> None
+        Clear and delete all widgets in the layout
+        
+        """
+        self.setEnabled(False)
+        for v in self._variable_widgets:
+            self.disconnect(v, QtCore.SIGNAL('deleted(QWidget*)'), 
+                         self.delete_form)
+            self.layout().removeWidget(v)
+            v.setParent(None)
+            v.deleteLater()
+        self._variable_widgets = []
+        self.setEnabled(True)
+
+    def delete_form(self, input_form):
+        self.disconnect(input_form, QtCore.SIGNAL('deleted(QWidget*)'), 
+                     self.delete_form)
+        var_name = input_form.var_name
+        variableBox = self.parent().parent()
+        self.layout().removeWidget(input_form)
+        self._variable_widgets.remove(input_form)
+        input_form.setParent(None)
+        input_form.deleteLater()
+        self.showPromptByChildren()
+
+        if variableBox.controller:
+            variableBox.lockUpdate()
+            variableBox.controller.set_vistrail_variable(var_name, None)
+            variableBox.unlockUpdate()
+        self.setMinimumHeight(self.layout().minimumSize().height())
+
+
+class QVariableInputWidget(QtGui.QDockWidget):
+    def __init__(self, uuid, name, descriptor, value='', parent=None):
+        QtGui.QDockWidget.__init__(self, parent)
+        self.var_uuid = uuid
+        self.var_name = name
+        self.descriptor = descriptor
+        self.setFeatures(QtGui.QDockWidget.DockWidgetClosable)
+        # Create group and titlebar widgets for input widget
+        self.group_box = QVariableInputForm(descriptor, value, self)
+        self.setWidget(self.group_box)
+        title_widget = QtGui.QWidget()
+        title_layout = QtGui.QHBoxLayout()
+        self.closeButton = QtGui.QToolButton()
+        self.closeButton.setAutoRaise(True)
+        self.closeButton.setIcon(QtGui.QIcon(self.style().standardPixmap(QtGui.QStyle.SP_TitleBarCloseButton)))
+        self.closeButton.setIconSize(QtCore.QSize(13, 13))
+        self.closeButton.setFixedWidth(16)
+        self.label = QHoverVariableLabel(name)
+        title_layout.addWidget(self.label)
+        title_layout.addWidget(self.closeButton)
+        title_widget.setLayout(title_layout)
+        self.setTitleBarWidget(title_widget)
+        self.connect(self.closeButton, QtCore.SIGNAL('clicked()'), self.close)
+        
+    def renameVariable(self, var_name):
+        # First delete old var entry
+        variableBox = self.parent().parent().parent()
+        if variableBox.controller:
+            variableBox.lockUpdate()
+            variableBox.controller.set_vistrail_variable(self.var_name, None, False)
+            variableBox.unlockUpdate()
+        # Create var entry with new name, but keeping the same uuid
+        self.var_name = var_name
+        self.label.setText(var_name)
+        self.group_box.updateMethod()
+        
+    def closeEvent(self, event):
+        choice = show_question('Delete %s?'%self.var_name,
+           'Are you sure you want to permanently delete the VisTrail variable\
+ "%s"?\n\nNote:  Any workflows using this variable will be left in an invalid state.'%self.var_name,
+                               [NO_BUTTON,YES_BUTTON],
+                               NO_BUTTON)
+        if choice == NO_BUTTON:
+            event.ignore()
+            return
+        self.emit(QtCore.SIGNAL('deleted(QWidget*)'), self)
+
+    def keyPressEvent(self, e):
+        if e.key() in [QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace]:
+            self.close()
+        else:
+            QtGui.QDockWidget.keyPressEvent(self, e)
+    
+    def check_variable(self, name):
+        """ check_variable(name: str) -> Boolean
+        Returns True if the vistrail already has the variable name
+
+        """
+        variableBox = self.parent().parent().parent()
+        if variableBox.controller:
+            return variableBox.controller.check_vistrail_variable(name)
+        return False
+
+class QVariableInputForm(QtGui.QGroupBox):
+    """
+    QVariableInputForm is a widget with multiple input lines depends on
+    the method signature
+    
+    """
+    def __init__(self, descriptor, var_strValue="", parent=None):
+        """ QVariableInputForm(descriptor: ModuleDescriptor, var_strValue: str,
+                               parent: QWidget) -> QVariableInputForm
+        Initialize with a vertical layout
+        
+        """
+        QtGui.QGroupBox.__init__(self, parent)
+        self.setLayout(QtGui.QGridLayout())
+        self.layout().setMargin(5)
+        self.layout().setSpacing(5)
+        self.setFocusPolicy(QtCore.Qt.ClickFocus)
+        self.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                           QtGui.QSizePolicy.Fixed)
+        self.palette().setColor(QtGui.QPalette.Window,
+                                CurrentTheme.METHOD_SELECT_COLOR)
+        # Create widget for editing variable
+        p = ModuleParam(type=descriptor.name, identifier=descriptor.identifier,
+                        namespace=descriptor.namespace)
+        p.strValue = var_strValue
+        widget_type = get_widget_class(descriptor.module)
+        self.widget = widget_type(p, self)
+        self.label = QDragVariableLabel(p.type)
+        self.layout().addWidget(self.label, 0, 0)
+        self.layout().addWidget(self.widget, 0, 1)
+        self.updateMethod()
+
+    def focusInEvent(self, event):
+        """ gotFocus() -> None
+        Make sure the form painted as selected
+        
+        """
+        self.setAutoFillBackground(True)
+
+    def focusOutEvent(self, event):
+        """ lostFocus() -> None
+        Make sure the form painted as non-selected and then
+        perform a parameter changes
+        
+        """
+        self.setAutoFillBackground(False)
+
+    def updateMethod(self):
+        """ updateMethod() -> None
+        Update the variable values in vistrail controller
+        
+        """
+        inputWidget = self.parent()
+        variableBox = inputWidget.parent().parent().parent()
+        if variableBox.controller:
+            variableBox.lockUpdate()
+            descriptor = inputWidget.descriptor
+            var = VistrailVariable(inputWidget.var_name, inputWidget.var_uuid,
+                                   descriptor.identifier, descriptor.name,
+                                   descriptor.namespace, str(self.widget.contents()))
+            variableBox.controller.set_vistrail_variable(inputWidget.var_name, var)
+            variableBox.unlockUpdate()
+
+class QDragVariableLabel(QtGui.QLabel):
+    """
+    QDragVariableLabel is a QLabel that can be dragged to connect
+    to an input port
+    """
+    def __init__(self, var_type='', parent=None):
+        """ QDragVariableLabel(var_type:str,
+                                parent: QWidget) -> QDragVariableLabel
+        Initialize the label with a variable type
+        
+        """
+        QtGui.QLabel.__init__(self, parent)
+        self.var_type = var_type
+        self.setText(var_type)
+        self.setAttribute(QtCore.Qt.WA_Hover)
+        self.setCursor(CurrentTheme.OPEN_HAND_CURSOR)
+        self.setToolTip('Drag to an input port')
+        self.palette().setColor(QtGui.QPalette.WindowText,
+                                CurrentTheme.HOVER_DEFAULT_COLOR)
+
+    def event(self, event):
+        """ event(event: QEvent) -> Event Result
+        Override to handle hover enter and leave events for hot links
+        
+        """
+        if event.type()==QtCore.QEvent.HoverEnter:
+            self.palette().setColor(QtGui.QPalette.WindowText,
+                                    CurrentTheme.HOVER_SELECT_COLOR)
+        if event.type()==QtCore.QEvent.HoverLeave:
+            self.palette().setColor(QtGui.QPalette.WindowText,
+                                    CurrentTheme.HOVER_DEFAULT_COLOR)
+        return QtGui.QLabel.event(self, event)
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None        
+        If mouse click on the label, show up a dialog to change/add
+        the variable name
+        
+        """
+        if event.button()==QtCore.Qt.LeftButton:
+            inputWidget = self.parent().parent()
+            var_name = inputWidget.var_name
+            var_uuid = inputWidget.var_uuid
+            # Create pixmap from variable name and type
+            drag_str = var_name + ' : ' + self.var_type
+            drag_label = QDragVariableLabel(drag_str)
+            drag_label.adjustSize()
+            painter = QtGui.QPainter()
+            font = QtGui.QFont()
+            size = drag_label.size()
+            image = QtGui.QImage(size.width()+4, size.height()+4, QtGui.QImage.Format_ARGB32_Premultiplied)
+            image.fill(0)
+            painter.begin(image)
+            painter.setPen(QtCore.Qt.NoPen)
+            painter.setBrush(self.palette().highlight())
+            painter.drawRect(QtCore.QRectF(0, 0, image.width(), image.height()))
+            painter.setFont(font)
+            painter.setPen(QtCore.Qt.black)
+            painter.drawText(QtCore.QRect(QtCore.QPoint(2,2), size), QtCore.Qt.AlignLeft | QtCore.Qt.TextSingleLine, drag_str)
+            painter.end()
+            pixmap = QtGui.QPixmap.fromImage(image)
+            # Create drag action
+            mimeData = QtCore.QMimeData()
+            portspec = inputWidget.descriptor.get_port_spec('value', 'output')
+            mimeData.variableData = (portspec, var_uuid, var_name)
+            drag = QtGui.QDrag(self)
+            drag.setMimeData(mimeData)
+            drag.setHotSpot(pixmap.rect().bottomRight())
+            drag.setPixmap(pixmap)
+            drag.start(QtCore.Qt.MoveAction)
+
+class QHoverVariableLabel(QtGui.QLabel):
+    """
+    QHoverVariableLabel is a QLabel that supports hover actions similar
+    to a hot link
+    """
+    def __init__(self, var_name='', parent=None):
+        """ QHoverVariableLabel(var_name:str,
+                                parent: QWidget) -> QHoverVariableLabel
+        Initialize the label with a variable name
+        
+        """
+        QtGui.QLabel.__init__(self, parent)
+        self.var_name = var_name
+        self.setText(var_name)
+        self.setAttribute(QtCore.Qt.WA_Hover)
+        self.setCursor(QtCore.Qt.PointingHandCursor)
+        self.setToolTip('Click to rename')
+        self.palette().setColor(QtGui.QPalette.WindowText,
+                                CurrentTheme.HOVER_DEFAULT_COLOR)
+
+    def event(self, event):
+        """ event(event: QEvent) -> Event Result
+        Override to handle hover enter and leave events for hot links
+        
+        """
+        if event.type()==QtCore.QEvent.HoverEnter:
+            self.palette().setColor(QtGui.QPalette.WindowText,
+                                    CurrentTheme.HOVER_SELECT_COLOR)
+        if event.type()==QtCore.QEvent.HoverLeave:
+            self.palette().setColor(QtGui.QPalette.WindowText,
+                                    CurrentTheme.HOVER_DEFAULT_COLOR)
+        return QtGui.QLabel.event(self, event)
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None        
+        If mouse click on the label, show up a dialog to change/add
+        the variable name
+        
+        """
+        if event.button()==QtCore.Qt.LeftButton:
+            inputWidget = self.parent().parent()
+            orig_var_name = inputWidget.var_name
+            (text, ok) = QtGui.QInputDialog.getText(self,
+                                                    'Set New Variable Name',
+                                                    'Enter the new variable name',
+                                                    QtGui.QLineEdit.Normal,
+                                                    orig_var_name)
+            var_name = str(text).strip()
+            while ok and self.parent().parent().check_variable(var_name):
+                msg =" This variable name is already being used.\
+ Please enter a different variable name "
+                (text, ok) = QtGui.QInputDialog.getText(self,
+                                                        'Set New Variable Name',
+                                                        msg,
+                                                        QtGui.QLineEdit.Normal,
+                                                        text)
+                var_name = str(text).strip()
+            if ok and var_name != orig_var_name:
+                self.setText(var_name)
+                inputWidget.renameVariable(var_name)
+
diff --git a/vistrails/gui/version_prop.py b/vistrails/gui/version_prop.py
new file mode 100644
index 0000000..14da589
--- /dev/null
+++ b/vistrails/gui/version_prop.py
@@ -0,0 +1,817 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file describe a widget for keeping version notes,info and tag
+name
+
+QVersionProp
+QVersionNotes
+QVersionPropOverlay
+QExpandButton
+QNotesDialog
+QVersionThumbs
+QVersionMashups
+
+"""
+import re
+import os.path
+from PyQt4 import QtCore, QtGui
+from vistrails.core.query.version import SearchCompiler, SearchParseError, TrueSearch
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.common_widgets import QSearchBox
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.core.utils import all
+from vistrails.core import debug
+
+################################################################################
+
+class QVersionProp(QtGui.QWidget, QVistrailsPaletteInterface):
+    """
+    QVersionProp is a widget holding property of a version including
+    tagname and notes
+    
+    """    
+    def __init__(self, parent=None):
+        """ QVersionProp(parent: QWidget) -> QVersionProp
+        Initialize the main layout
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setWindowTitle('Properties')
+
+        vLayout = QtGui.QVBoxLayout()
+        vLayout.setMargin(2)
+        vLayout.setSpacing(2)
+        self.setLayout(vLayout)
+
+        gLayout = QtGui.QGridLayout()
+        gLayout.setMargin(2)
+        gLayout.setSpacing(5)
+        gLayout.setColumnMinimumWidth(1,5)
+        gLayout.setRowMinimumHeight(0,20)
+        gLayout.setRowMinimumHeight(1,20)
+        gLayout.setRowMinimumHeight(2,20)
+        gLayout.setRowMinimumHeight(3,20)        
+        vLayout.addLayout(gLayout)
+        
+        tagLabel = QtGui.QLabel('Tag:', self)
+        gLayout.addWidget(tagLabel, 0, 0, 1, 1)
+
+        editLayout = QtGui.QHBoxLayout()
+        editLayout.setMargin(2)
+        editLayout.setSpacing(2)
+        self.tagEdit = QtGui.QLineEdit()
+        tagLabel.setBuddy(self.tagEdit)
+        editLayout.addWidget(self.tagEdit)
+        self.tagEdit.setEnabled(False)
+        self.tagEdit.setMinimumHeight(22)
+        
+        self.tagReset = QtGui.QToolButton(self)
+        self.tagReset.setIcon(QtGui.QIcon(
+                self.style().standardPixmap(QtGui.QStyle.SP_DialogCloseButton)))
+        self.tagReset.setIconSize(QtCore.QSize(12,12))
+        self.tagReset.setAutoRaise(True)
+        self.tagReset.setEnabled(False)
+        editLayout.addWidget(self.tagReset)
+
+        gLayout.addLayout(editLayout, 0, 2, 1, 1)
+
+        userLabel = QtGui.QLabel('User:', self)
+        gLayout.addWidget(userLabel, 1, 0, 1, 1)
+        
+        self.userEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.userEdit, 1, 2, 1, 1)
+
+        dateLabel = QtGui.QLabel('Date:', self)
+        gLayout.addWidget(dateLabel, 2, 0, 1, 1)
+
+        self.dateEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.dateEdit, 2, 2, 1, 1)
+
+        idLabel = QtGui.QLabel('ID:', self)
+        gLayout.addWidget(idLabel, 3, 0, 1, 1)
+        
+        self.idEdit = QtGui.QLabel('', self)
+        gLayout.addWidget(self.idEdit, 3, 2, 1, 1)
+
+        self.notesLabel = QtGui.QLabel('Notes:')
+        gLayout.addWidget(self.notesLabel, 4, 0, 1, 1)
+
+        self.versionNotes = QVersionNotes()
+        vLayout.addWidget(self.versionNotes)
+        self.versionNotes.setEnabled(False)
+
+        self.versionThumbs = QVersionThumbs()
+        vLayout.addWidget(self.versionThumbs)
+        
+        self.versionMashups = QVersionMashups()
+        vLayout.addWidget(self.versionMashups)
+                
+        self.connect(self.tagEdit, QtCore.SIGNAL('editingFinished()'),
+                     self.tagFinished)
+        self.connect(self.tagEdit, QtCore.SIGNAL('textChanged(QString)'),
+                     self.tagChanged)
+        self.connect(self.tagReset, QtCore.SIGNAL('clicked()'),
+                     self.tagCleared)
+
+        self.controller = None
+        self.versionNumber = -1
+
+    def updateController(self, controller):
+        """ updateController(controller: VistrailController) -> None
+        Assign the controller to the property page
+        
+        """
+        self.controller = controller
+        self.versionNotes.controller = controller
+        self.versionThumbs.controller = controller
+        self.versionMashups.controller = controller
+        self.updateVersion(controller.current_version)
+
+    def updateVersion(self, versionNumber):
+        """ updateVersion(versionNumber: int) -> None
+        Update the property page of the version
+        
+        """
+        self.versionNumber = versionNumber
+        self.versionNotes.updateVersion(versionNumber)
+        self.versionThumbs.updateVersion(versionNumber)
+        self.versionMashups.updateVersion(versionNumber)
+        if self.controller:
+            if self.controller.vistrail.actionMap.has_key(versionNumber):
+                action = self.controller.vistrail.actionMap[versionNumber]
+                name = self.controller.vistrail.getVersionName(versionNumber)
+                self.tagEdit.setText(name)
+                self.userEdit.setText(action.user)
+                self.dateEdit.setText(action.date)
+                self.idEdit.setText(unicode(action.id))
+                self.tagEdit.setEnabled(True)
+                return
+            else:
+                self.tagEdit.setEnabled(False)
+                self.tagReset.setEnabled(False)
+                
+        self.tagEdit.setText('')
+        self.userEdit.setText('')
+        self.dateEdit.setText('')
+        self.idEdit.setText('')
+        
+
+    def tagFinished(self):
+        """ tagFinished() -> None
+        Update the new tag to vistrail
+        
+        """
+        if self.controller:
+            name = self.controller.vistrail.getVersionName(self.versionNumber)
+            currentText = str(self.tagEdit.text())
+            if name != currentText:    
+                self.controller.update_current_tag(currentText)
+
+    def tagChanged(self, text):
+        """ tagChanged(text: QString) -> None
+        Update the button state if there is text
+
+        """
+        self.tagReset.setEnabled(text != '')
+
+    def tagCleared(self):
+        """ tagCleared() -> None
+        Remove the tag
+        
+        """ 
+        self.tagEdit.setText('')
+        self.tagFinished()
+
+class QVersionNotes(QtGui.QTextEdit):
+    """
+    QVersionNotes is text widget that update/change a version notes
+    
+    """    
+    def __init__(self, parent=None):
+        """ QVersionNotes(parent: QWidget) -> QVersionNotes
+        Initialize control variables
+        
+        """
+        QtGui.QTextEdit.__init__(self, parent)
+        self.controller = None
+        self.versionNumber = -1
+        self.update_on_focus_out = True
+        self.setAcceptRichText(False)
+        # Reset text to black, for some reason it is grey by default on the mac
+        self.palette().setBrush(QtGui.QPalette.Text,
+                                QtGui.QBrush(QtGui.QColor(0,0,0,255)))
+        
+
+    def updateVersion(self, versionNumber):
+        """ updateVersion(versionNumber: int) -> None
+        Update the text to be the notes of the vistrail versionNumber
+        
+        """
+        self.versionNumber = versionNumber
+        if self.controller:
+            if self.controller.vistrail.actionMap.has_key(versionNumber):
+                action = self.controller.vistrail.actionMap[versionNumber]
+                notes = self.controller.vistrail.get_notes(versionNumber)
+                if notes:
+                    self.setHtml(notes)
+                    # work around a strange bug where an empty new paragraph gets added every time
+                    self.trim_first_paragraph()
+                else:
+                    self.setHtml('')
+                self.setEnabled(True)
+                return
+            else:
+                self.setEnabled(False)
+        self.setPlainText('')
+
+    def commit_changes(self):
+        if self.controller and self.document().isModified():
+            self.controller.update_notes(str(self.toHtml()))
+
+    def reset_changes(self):
+        """ reset_changes() -> None
+
+        """
+        self.updateVersion(self.versionNumber)
+
+    def focusOutEvent(self, event):
+        """ focusOutEvent(event: QFocusEvent) -> None
+        Update the version notes if the text has been modified
+        
+        """
+        if self.update_on_focus_out:
+            self.commit_changes()
+        QtGui.QTextEdit.focusOutEvent(self,event)
+
+    def trim_first_paragraph(self):
+        doc = self.document()
+        count = doc.blockCount()
+        cursor = QtGui.QTextCursor(doc)
+        cursor.select(QtGui.QTextCursor.LineUnderCursor)
+        sel = cursor.selection().toPlainText()
+        if all(c == ' ' for c in sel):
+            cursor.removeSelectedText()
+            cursor = QtGui.QTextCursor(doc)
+            cursor.deleteChar()
+
+
+################################################################################
+class QVersionPropOverlay(QtGui.QFrame):
+    """
+    QVersionPropOverlay is a transparent widget that sits on top of the version
+    view.  It displays properties of a version: tag, user, date, and notes.
+
+    """
+    propagatingEvent = set([
+        QtCore.QEvent.MouseButtonDblClick,
+        QtCore.QEvent.MouseButtonPress,
+        QtCore.QEvent.MouseButtonRelease,
+        QtCore.QEvent.MouseMove,
+        QtCore.QEvent.Wheel,
+        ])
+    def __init__(self, parent=None, mouseWidget=None):
+        """ QVersionPropOverlay(parent: QWidget) -> QVersionPropOverlay
+        Setup layout
+
+        """
+        QtGui.QFrame.__init__(self, parent)
+        self.propagatingWidget = mouseWidget
+        self.palette = QtGui.QPalette()
+        self.palette.setColor(QtGui.QPalette.Base, QtGui.QColor(0,0,0,0))
+        self.setPalette(self.palette)
+        self.setAutoFillBackground(True)
+        self.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.setFrameShadow(QtGui.QFrame.Plain)
+        self.layout = QtGui.QGridLayout()
+        self.layout.setVerticalSpacing(1)
+
+        self.tag_label = QtGui.QLabel()
+        self.tag_label.palette().setBrush(QtGui.QPalette.Text,
+                                          CurrentTheme.VERSION_PROPERTIES_PEN)
+        self.tag_label.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+        self.tag_label.setText("Tag:")
+
+        self.tag = QtGui.QLabel()
+        self.tag.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+
+        self.description_label = QtGui.QLabel()
+        self.description_label.palette().setBrush(QtGui.QPalette.Text,
+                                                  CurrentTheme.VERSION_PROPERTIES_PEN)
+        self.description_label.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+        self.description_label.setText("Action:")
+
+        self.description = QtGui.QLabel()
+        self.description.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+
+        self.user_label = QtGui.QLabel()
+        self.user_label.palette().setBrush(QtGui.QPalette.Text,
+                                           CurrentTheme.VERSION_PROPERTIES_PEN)
+        self.user_label.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+        self.user_label.setText("User:")
+
+        self.user = QtGui.QLabel()
+        self.user.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+
+        self.date_label = QtGui.QLabel()
+        self.date_label.palette().setBrush(QtGui.QPalette.Text,
+                                           CurrentTheme.VERSION_PROPERTIES_PEN)
+        self.date_label.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+        self.date_label.setText("Date:")
+        
+        self.date = QtGui.QLabel()
+        self.date.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+
+        self.notes_label = QtGui.QLabel()
+        self.notes_label.palette().setBrush(QtGui.QPalette.Text,
+                                           CurrentTheme.VERSION_PROPERTIES_PEN)
+        self.notes_label.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+        self.notes_label.setText("Notes:")
+
+        self.notes = QtGui.QLabel()
+        self.notes.setTextFormat(QtCore.Qt.PlainText)
+        self.notes.setFont(CurrentTheme.VERSION_PROPERTIES_FONT)
+        
+        self.notes_button = QExpandButton()
+        self.notes_button.hide()
+
+        self.notes_layout = QtGui.QHBoxLayout()
+        self.notes_layout.addWidget(self.notes)
+        self.notes_layout.addWidget(self.notes_button)
+        self.notes_layout.addStretch()
+
+        self.layout.addWidget(self.tag_label, 0, 0)
+        self.layout.addWidget(self.tag, 0, 1)
+        self.layout.addWidget(self.description_label, 1, 0)
+        self.layout.addWidget(self.description, 1, 1)
+        self.layout.addWidget(self.user_label, 2, 0)
+        self.layout.addWidget(self.user, 2, 1)
+        self.layout.addWidget(self.date_label, 3, 0)
+        self.layout.addWidget(self.date, 3, 1)
+        self.layout.addWidget(self.notes_label, 4, 0)
+        self.layout.addLayout(self.notes_layout, 4, 1)
+
+        self.layout.setColumnMinimumWidth(0,35)
+        self.layout.setColumnMinimumWidth(1,200)
+        self.layout.setContentsMargins(2,2,2,2)
+        self.layout.setColumnStretch(1,1)
+        self.setLayout(self.layout)
+        self.updateGeometry()
+        self.controller = None
+        
+        self.notes_dialog = QNotesDialog(self)
+        self.notes_dialog.hide()
+
+        QtCore.QObject.connect(self.notes_button,
+                               QtCore.SIGNAL("pressed()"),
+                               self.openNotes)
+
+    def updateGeometry(self):
+        """ updateGeometry() -> None
+        Keep in upper left of screen
+
+        """
+        parentGeometry = self.parent().geometry()
+        self.pos_x = 4
+        self.pos_y = 4
+        self.move(self.pos_x, self.pos_y)
+
+    def updateController(self, controller):
+        """ updateController(controller: VistrailController) -> None
+        Assign the controller to the properties
+        
+        """
+        self.controller = controller
+        self.notes_dialog.updateController(controller)
+
+    def updateVersion(self, versionNumber):
+        """ updateVersion(versionNumber: int) -> None
+        Update the text items
+        
+        """
+        self.notes_dialog.updateVersion(versionNumber)
+        if self.controller:
+            if self.controller.vistrail.actionMap.has_key(versionNumber):
+                action = self.controller.vistrail.actionMap[versionNumber]
+                name = self.controller.vistrail.getVersionName(versionNumber)
+                description = self.controller.vistrail.get_description(versionNumber)
+                self.tag.setText(self.truncate(name))
+                self.description.setText(self.truncate(description))
+                self.user.setText(self.truncate(action.user))
+                self.date.setText(self.truncate(action.date))
+                notes = self.controller.vistrail.get_notes(action.id)
+                if notes:
+                    s = self.convertHtmlToText(notes)
+                    self.notes.setText(self.truncate(s))
+                else:
+                    self.notes.setText('')
+                self.notes_button.show()
+            else:
+                self.tag.setText('')
+                self.description.setText('')
+                self.user.setText('')
+                self.date.setText('')
+                self.notes.setText('')
+                self.notes_button.hide()
+
+    def convertHtmlToText(self, str):
+        """ convertHtmlToText(str: QString) -> QString
+        Remove HTML tags and newlines
+        
+        """
+        # Some text we want to ignore lives outside brackets in the header
+        str = re.sub(r"<head>.*</head>", r"", str)
+        # Remove all other tags
+        str = re.sub(r"<[^>]*>", r"", str)
+        # Remove newlines
+        str = re.sub(r"\n", r"", str)
+        return str
+
+    def truncate(self, str):
+        """ truncate(str: string) -> string
+        Shorten string to fit in smaller space
+        
+        """
+        if len(str) > 24:
+            str = str[:22] + "..."
+        return str
+
+    def openNotes(self):
+        """ openNotes() -> None
+
+        Show notes dialog
+        """
+        self.notes_dialog.show()
+        self.notes_dialog.activateWindow()
+
+    def event(self, e):
+        """ Propagate all mouse events to the right widget """
+        if e.type() in self.propagatingEvent:
+            if self.propagatingWidget!=None:
+                QtCore.QCoreApplication.sendEvent(self.propagatingWidget, e)
+                return False
+        return QtGui.QFrame.event(self, e)
+
+################################################################################
+class QExpandButton(QtGui.QLabel):
+    """
+    A transparent button type with a + draw in 
+    """
+    def __init__(self, parent=None):
+        """
+        QExpandButton(parent: QWidget) -> QExpandButton
+        """
+        QtGui.QLabel.__init__(self, parent)
+        
+        self.drawButton(0)
+        self.setToolTip('Edit Notes')
+        self.setScaledContents(False)
+        self.setFrameShape(QtGui.QFrame.NoFrame)
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        
+        """
+        return QtCore.QSize(10,10)
+        
+
+    def mousePressEvent(self, e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Capture mouse press event on the frame to move the widget
+        
+        """
+        if e.buttons() & QtCore.Qt.LeftButton:
+            self.drawButton(1)
+    
+    def mouseReleaseEvent(self, e):
+        self.drawButton(0)
+        self.emit(QtCore.SIGNAL('pressed()'))
+
+    def drawButton(self, down):
+        """ drawButton(down: bool) -> None
+        Custom draw function
+        
+        """
+        self.picture = QtGui.QPicture()
+        painter = QtGui.QPainter()
+        painter.begin(self.picture)
+        painter.setRenderHints(QtGui.QPainter.Antialiasing, False)
+        pen = QtGui.QPen(QtCore.Qt.SolidLine)
+        pen.setWidth(1)
+        pen.setCapStyle(QtCore.Qt.RoundCap)
+        brush = QtGui.QBrush(QtCore.Qt.NoBrush)
+        if (down):
+            pen.setColor(QtGui.QColor(150,150,150,150))
+        else:
+            pen.setColor(QtGui.QColor(0,0,0,255))
+
+        painter.setPen(pen)
+        painter.setBrush(brush)
+        painter.drawRect(0,0,8,8)
+        painter.drawLine(QtCore.QLine(4,2,4,6))
+        painter.drawLine(QtCore.QLine(2,4,6,4))
+        painter.end()
+        self.setPicture(self.picture)
+
+################################################################################
+class QNotesDialog(QtGui.QDialog):
+    """
+    A small non-modal dialog with text entry to modify and view notes
+
+    """
+    def __init__(self, parent=None):
+        """
+        QNotesDialog(parent: QWidget) -> QNotesDialog
+
+        """
+        QtGui.QDialog.__init__(self, parent)
+        self.setModal(False)
+        self.notes = QVersionNotes(self)
+        self.notes.update_on_focus_out = False
+        layout = QtGui.QVBoxLayout(self)
+        layout.addWidget(self.notes)
+        layout.setMargin(0)
+
+        self.apply_button = QtGui.QPushButton('Apply', self)
+        self.apply_button.setDefault(False)
+        self.apply_button.setAutoDefault(False)
+        self.ok_button = QtGui.QPushButton('Ok', self)
+        self.ok_button.setDefault(False)
+        self.ok_button.setAutoDefault(False)
+        self.cancel_button = QtGui.QPushButton('Cancel', self)
+        self.cancel_button.setDefault(False)
+        self.cancel_button.setAutoDefault(False)
+        self.buttonLayout = QtGui.QHBoxLayout()
+        layout.addLayout(self.buttonLayout)
+        self.buttonLayout.addWidget(self.apply_button)
+        self.buttonLayout.addWidget(self.ok_button)
+        self.buttonLayout.addWidget(self.cancel_button)
+
+        self.setLayout(layout)
+        self.controller = None
+
+        QtCore.QObject.connect(self.apply_button,
+                               QtCore.SIGNAL("released()"),
+                               self.apply_pressed)
+
+        QtCore.QObject.connect(self.ok_button,
+                               QtCore.SIGNAL("released()"),
+                               self.ok_pressed)
+
+        QtCore.QObject.connect(self.cancel_button,
+                               QtCore.SIGNAL("released()"),
+                               self.cancel_pressed)
+    def apply_pressed(self):
+        """ apply_pressed() -> None
+
+        """
+        self.notes.commit_changes()
+
+    def ok_pressed(self):
+        """ ok_pressed() -> None
+        
+        """
+        self.notes.commit_changes()
+        self.close()
+
+    def cancel_pressed(self):
+        """ cancel_pressed() -> None
+        
+        """
+        self.notes.reset_changes()
+        self.close()
+
+    def updateController(self, controller):
+        """ updateController(controller: VistrailController) -> None
+
+        """
+        self.controller = controller
+        self.notes.controller = controller
+
+    def updateVersion(self, versionNumber):
+        """ updateVersion(versionNumber: int) -> None
+
+        """
+        self.notes.updateVersion(versionNumber)
+        if self.controller:
+            if self.controller.vistrail.actionMap.has_key(versionNumber):
+                name = self.controller.vistrail.getVersionName(versionNumber)
+                title = "Notes: "+name
+                self.setWindowTitle(title)
+            else:
+                self.setWindowTitle("Notes")
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        
+        """
+        return QtCore.QSize(250,200)
+        
+################################################################################
+
+class QVersionThumbs(QtGui.QWidget):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.versionNumber = None
+        label = QtGui.QLabel("Preview:")
+        self.thumbs = QtGui.QLabel()
+        self.thumbs.setFrameShape(QtGui.QFrame.NoFrame)
+        self.scrollArea = QtGui.QScrollArea(self)
+        self.scrollArea.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.scrollArea.setWidget(self.thumbs)
+        self.scrollArea.setWidgetResizable(True)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(2)
+        layout.addWidget(label)
+        layout.addWidget(self.scrollArea)
+        self.setLayout(layout)
+        self.controller = None
+        
+    def updateController(self, controller):
+        """ updateController(controller: VistrailController) -> None
+
+        """
+        self.controller = controller
+        
+    def updateVersion(self, versionNumber):
+        """ updateVersion(versionNumber: int) -> None
+
+        """
+        if self.controller:
+            vistrail = self.controller.vistrail
+            if versionNumber in vistrail.actionMap.keys():
+                action = vistrail.actionMap[versionNumber]
+                if action and vistrail.has_thumbnail(action.id):
+                    cache = ThumbnailCache.getInstance()
+                    fname = cache.get_abs_name_entry(
+                        vistrail.get_thumbnail(action.id))
+                    if fname is not None:
+                        pixmap = QtGui.QPixmap(fname)
+                        self.thumbs.setPixmap(pixmap)
+                        self.thumbs.adjustSize()
+                    self.thumbs.setFrameShape(QtGui.QFrame.StyledPanel)
+                    return
+                
+        self.thumbs.setPixmap(QtGui.QPixmap())
+        self.thumbs.setFrameShape(QtGui.QFrame.NoFrame)
+
+################################################################################
+class QVersionMashups(QtGui.QWidget):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.versionNumber = None
+        self.controller = None
+        #label = QtGui.QLabel("Mashups:")
+        self.mashupsButton = QtGui.QToolButton()
+        self.mashupsButton.setText("Mashups")
+        self.mashupsButton.setPopupMode(QtGui.QToolButton.InstantPopup)
+        self.mashupsButton.setArrowType(QtCore.Qt.RightArrow)
+        self.mashupsButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
+        
+#        font = QtGui.QFont("Arial", 11, QtGui.QFont.Normal)
+#        font.setItalic(True)
+#        self.group = QtGui.QGroupBox()
+#        helplabel = QtGui.QLabel("Double-click a mashup to execute it")
+#        helplabel.setFont(font)
+#        self.mashupsList = QtGui.QListWidget()
+#        self.mashupsList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+#        self.mashupsList.itemDoubleClicked.connect(self.mashupDoubleClicked)
+#        glayout = QtGui.QVBoxLayout()
+#        glayout.setMargin(2)
+#        glayout.setSpacing(5)
+#        #layout.addWidget(label)
+#        glayout.addWidget(self.mashupsList)
+#        glayout.addWidget(helplabel)
+#        self.group.setLayout(glayout)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(2)
+        layout.setSpacing(5)
+        #layout.addStretch()
+        layout.addWidget(self.mashupsButton)
+        #layout.addWidget(self.group)
+        self.setLayout(layout)
+        self.apps = {}
+        #self.group.setVisible(False)
+        #self.connect(self.mashupsButton, QtCore.SIGNAL("clicked(bool)"),
+        #             self.showList)
+        
+    def createMashupsMenu(self, tagMap):
+        tags = tagMap.keys()
+        self.mashupsButton.setText("Mashups (%s)"%str(len(tags)))
+        #latestversion = mtrail.getLatestVersion()
+        mashupsMenu = QtGui.QMenu(self)
+        if len(tags) > 0:
+            tags.sort()
+            for tag in tags:
+                action = QtGui.QAction(str(tag), self, 
+                                       triggered=self.mashupSelected)
+                action.setData(tagMap[tag])
+                mashupsMenu.addAction(action)
+            self.mashupsButton.setEnabled(True)
+        return mashupsMenu
+    
+#    def showList(self, on):
+#        self.group.setVisible(on)
+        
+    def updateController(self, controller):
+        """ updateController(controller: VistrailController) -> None
+
+        """
+        self.controller = controller
+
+    def updateVersion(self, versionNumber):
+        """ updateVersion(versionNumber: int) -> None
+
+        """
+        #self.mashupsList.clear()
+        
+        from vistrails.gui.mashups.mashups_manager import MashupsManager
+        from vistrails.gui.mashups.mashups_inspector import QMashupListPanelItem
+        getMshptrail = MashupsManager.getMashuptrailforVersionInVistrailController
+        if self.controller:
+            vistrail = self.controller.vistrail
+            if versionNumber in vistrail.actionMap.keys():
+                self.mtrail = getMshptrail(self.controller, versionNumber)
+                if self.mtrail:
+                    tagMap = self.mtrail.getTagMap()
+                    self.mashupsButton.setMenu(self.createMashupsMenu(tagMap))
+#                    tags = tagMap.keys()
+#                    self.mashupsButton.setText("Mashups (%s)"%str(len(tags)))
+#                    #latestversion = mtrail.getLatestVersion()
+#                    if len(tags) > 0:
+#                        tags.sort()
+#                        for tag in tags:
+#                            item = QMashupListPanelItem(str(tag),
+#                                                        tagMap[tag],
+#                                                        self.mashupsList)
+#                        self.mashupsButton.setEnabled(True)
+#                    else:
+#                        self.mashupsButton.setEnabled(False)
+                else:
+                    self.mashupsButton.setText("Mashups (0)")
+                    self.mashupsButton.setEnabled(False)
+            else:
+                self.mashupsButton.setText("Mashups (0)")
+                self.mashupsButton.setEnabled(False)
+        else:
+            self.mashupsButton.setText("Mashups (0)")
+            self.mashupsButton.setEnabled(False)
+                
+    def mashupSelected(self):
+        action = self.sender()
+        version, ok = action.data()
+        self.openMashup(version)
+
+    def openMashup(self, version):
+        from vistrails.gui.mashups.mashups_manager import MashupsManager
+        item_key = (self.mtrail.id, version)
+        if self.apps.has_key(item_key):
+            app = self.apps[item_key]
+            if app:
+                app.activateWindow()
+                return
+        
+        app = MashupsManager.createMashupApp(self.controller, self.mtrail, 
+                                             version)
+        app.setAttribute(QtCore.Qt.WA_DeleteOnClose)
+        app.appWasClosed.connect(self.appWasClosed)
+        self.apps[item_key] = app
+        app.activateWindow()
+        app.raise_()
+                
+    def appWasClosed(self, app):
+        for (k, a) in self.apps.iteritems():
+            if a == app:
+                self.apps[k] = None
diff --git a/vistrails/gui/version_view.py b/vistrails/gui/version_view.py
new file mode 100644
index 0000000..90784f5
--- /dev/null
+++ b/vistrails/gui/version_view.py
@@ -0,0 +1,1299 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This is a QGraphicsView for pipeline view, it also holds different
+types of graphics items that are only available in the pipeline
+view. It only handles GUI-related actions, the rest of the
+functionalities are implemented at somewhere else,
+e.g. core.vistrails
+
+QGraphicsLinkItem
+QGraphicsVersionTextItem
+QGraphicsVersionItem
+QVersionTreeScene
+QVersionTreeView
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.system import systemType
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.graphics_view import (QInteractiveGraphicsScene,
+                               QInteractiveGraphicsView,
+                               QGraphicsItemInterface,
+                               QGraphicsRubberBandItem)
+from vistrails.gui.qt import qt_super
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.version_prop import QVersionPropOverlay
+from vistrails.gui.vis_diff import QVisualDiff
+from vistrails.gui.collection.workspace import QParamExplorationEntityItem
+import vistrails.gui.utils
+import math
+
+
+################################################################################
+# QGraphicsLinkItem
+
+class QGraphicsLinkItem(QGraphicsItemInterface, QtGui.QGraphicsPolygonItem):
+    """
+    QGraphicsLinkItem is a connection shape connecting two versions
+    
+    """
+    def __init__(self, parent=None, scene=None):
+        """ QGraphicsLinkItem(parent: QGraphicsItem,
+                              scene: QGraphicsScene) -> QGraphicsLinkItem
+        Create the shape, initialize its pen and brush accordingly
+        
+        """
+        QtGui.QGraphicsPolygonItem.__init__(self, parent, scene)
+        self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable)
+        self.setZValue(0)
+        self.linkPen = CurrentTheme.LINK_PEN
+        self.ghosted = False
+        
+        # cache link endpoints to improve performance on scene updates
+        self.c1 = None
+        self.c2 = None
+        self.expand = None
+        self.collapse = None
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+
+        """
+        qt_super(QGraphicsLinkItem, self).mousePressEvent(event)
+        self.setSelected(True)
+
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(event: QMouseEvent) -> None
+        
+        """
+        qt_super(QGraphicsLinkItem, self).mouseReleaseEvent(event)
+        if self.expand:
+            self.scene().controller.expand_versions(self.startVersion, self.endVersion)
+        elif self.collapse:
+            self.scene().controller.collapse_versions(self.endVersion)
+        self.setSelected(False)
+
+    def setGhosted(self, ghosted):
+        """ setGhosted(ghosted: True) -> None
+        Set this link to be ghosted or not
+        
+        """
+        if self.ghosted <> ghosted:
+            self.ghosted = ghosted
+            if ghosted:
+                self.linkPen = CurrentTheme.GHOSTED_LINK_PEN
+            else:
+                self.linkPen = CurrentTheme.LINK_PEN
+
+    def setupLink(self, v1, v2, expand=False, collapse=False):
+        """ setupLink(v1, v2: QGraphicsVersionItem, compact: bool) -> None
+        Setup a line connecting v1 and v2 items
+        
+        """
+        self.startVersion = min(v1.id, v2.id)
+        self.endVersion = max(v1.id, v2.id)
+        
+        c1 = v1.sceneBoundingRect().center()
+        c2 = v2.sceneBoundingRect().center()
+
+        # check if it is the same geometry 
+        # improves performance on updates
+        if self.c1 != None and self.c2 != None and \
+                self.expand != None and self.collapse !=None:
+            isTheSame = self.c1 == c1 and \
+                self.c2 == c2 and \
+                self.expand == expand and \
+                self.collapse == collapse
+            if isTheSame:
+                return
+        
+        # update current state
+        self.c1 = c1
+        self.c2 = c2
+        self.collapse = collapse
+        self.expand = expand
+
+        # Compute the line of the link and its normal line throught
+        # the midpoint
+        mainLine = QtCore.QLineF(c1, c2)
+        normalLine = mainLine.normalVector()        
+        normalLine.setLength(CurrentTheme.LINK_SEGMENT_LENGTH)
+        dis = (mainLine.pointAt(0.5)-mainLine.p1()+
+               normalLine.p1()-normalLine.pointAt(0.5))
+        normalLine.translate(dis.x(), dis.y())
+
+        # Generate 2 segments along the main line and 3 segments along
+        # the normal line
+        if not self.collapse and not self.expand:
+            self.lines = [mainLine]
+            poly = QtGui.QPolygonF()
+            poly.append(self.lines[0].p1())
+            poly.append(self.lines[0].p2())
+            poly.append(self.lines[0].p1())
+            self.setPolygon(poly)
+        else:
+            self.lines = []
+            
+            normalLine = mainLine.normalVector()        
+            normalLine.setLength(CurrentTheme.LINK_SEGMENT_SQUARE_LENGTH)
+            dis = (mainLine.pointAt(0.5)-mainLine.p1()+
+                   normalLine.p1()-normalLine.pointAt(0.5))
+            normalLine.translate(dis.x(), dis.y())
+            
+            gapLine = QtCore.QLineF(mainLine)
+            gapLine.setLength(CurrentTheme.LINK_SEGMENT_SQUARE_LENGTH/2)
+            gapVector = gapLine.p2()-gapLine.p1()
+            
+            # First segment along the main line
+            line = QtCore.QLineF(mainLine)
+            line.setLength(line.length()/2-CurrentTheme.LINK_SEGMENT_SQUARE_LENGTH/2)
+            self.lines.append(QtCore.QLineF(line))
+            
+            # Second segment along the main line
+            line.translate(line.p2()-line.p1()+gapVector*2)
+            self.lines.append(QtCore.QLineF(line))
+            
+            # First normal segment in front
+            line_t = QtCore.QLineF(normalLine)
+            line_t.translate(gapVector*(-1.0))
+            self.lines.append(QtCore.QLineF(line_t))
+        
+            # Second normal segment in back
+            line_b = QtCore.QLineF(normalLine)
+            line_b.translate(gapVector)
+            self.lines.append(QtCore.QLineF(line_b))
+        
+            # Left box
+            line = QtCore.QLineF(line_t.p1(),line_b.p1())
+            self.lines.append(QtCore.QLineF(line))
+        
+            # Right box
+            line = QtCore.QLineF(line_t.p2(),line_b.p2())
+            self.lines.append(QtCore.QLineF(line))
+
+            # Horizontal plus
+            line_h = QtCore.QLineF(normalLine.pointAt(0.2),normalLine.pointAt(0.8))
+            self.lines.append(QtCore.QLineF(line_h))
+            
+            if self.expand:
+                # Vertical plus
+                line = QtCore.QLineF(mainLine)
+                line.translate((line.p2()-line.p1())/2-gapVector)
+                line.setLength(CurrentTheme.LINK_SEGMENT_SQUARE_LENGTH)
+                line_v = QtCore.QLineF(line.pointAt(0.2), line.pointAt(0.8))
+                self.lines.append(QtCore.QLineF(line_v))
+        
+            # Create the poly line for selection and redraw
+            poly = QtGui.QPolygonF()
+            poly.append(self.lines[0].p1())
+            poly.append(self.lines[2].p1())
+            poly.append(self.lines[3].p1())
+            poly.append(self.lines[1].p2())
+            poly.append(self.lines[3].p2())
+            poly.append(self.lines[2].p2())
+            poly.append(self.lines[0].p1())
+            self.setPolygon(poly)
+
+        self.setGhosted(v1.ghosted and v2.ghosted)
+
+    def paint(self, painter, option, widget=None):
+        """ paint(painter: QPainter, option: QStyleOptionGraphicsItem,
+                  widget: QWidget) -> None
+        Peform actual painting of the link
+        
+        """
+        if self.isSelected():
+            painter.setPen(CurrentTheme.LINK_SELECTED_PEN)
+        else:
+            painter.setPen(self.linkPen)
+        for line in self.lines:
+            painter.drawLine(line)
+
+    def itemChange(self, change, value):
+        """ itemChange(change: GraphicsItemChange, value: variant) -> variant
+        Do not allow link to be selected with version shape
+        
+        """
+        if change==QtGui.QGraphicsItem.ItemSelectedChange and value:
+            return False
+        return QtGui.QGraphicsPolygonItem.itemChange(self, change, value)
+
+
+##############################################################################
+# QGraphicsVerstionTextItem
+
+class QGraphicsVersionTextItem(QGraphicsItemInterface, QtGui.QGraphicsTextItem):
+    """
+    QGraphicsVersionTextItem is an editable text item that appears on top of
+    a QGraphicsVersionItem to allow the tag to be changed
+
+    """
+    def __init__(self, parent=None, scene=None):
+        """ QGraphicsVersionTextItem(parent: QGraphicsVersionItem, 
+        scene: QGraphicsScene) -> QGraphicsVersionTextItem
+
+        Create the shape, intialize its drawing style
+
+        """
+        QtGui.QGraphicsTextItem.__init__(self, parent, scene)
+        self.timer = None
+        self.isEditable = None
+        self.setEditable(False)
+        self.setFont(CurrentTheme.VERSION_FONT)
+        self.setTextWidth(CurrentTheme.VERSION_LABEL_MARGIN[0])
+        self.setDefaultTextColor(CurrentTheme.VERSION_LABEL_COLOR)
+        self.centerX = 0.0
+        self.centerY = 0.0
+        self.label = ''
+        self.isTag = True
+        self.updatingTag = False
+
+    def setEditable(self, editable=True):
+        if self.timer:
+            self.timer.stop()
+            self.timer = None
+        if editable == self.isEditable:
+            return
+        self.isEditable = editable
+        if editable:
+            self.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
+        else:
+            if self.textCursor():
+                c = self.textCursor()
+                c.clearSelection()
+                self.setTextCursor(c)
+            self.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+
+    def setEditableLater(self):
+        self.timer = QtCore.QTimer(self)
+        self.timer.setSingleShot(True)
+        self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.setEditable)
+        self.timer.start(QtGui.QApplication.doubleClickInterval() + 5)
+
+    def setGhosted(self, ghosted):
+        if ghosted:
+            self.setDefaultTextColor(CurrentTheme.GHOSTED_VERSION_LABEL_COLOR)
+        else:
+            self.setDefaultTextColor(CurrentTheme.VERSION_LABEL_COLOR)
+
+    def changed(self, x, y, label, tag=True):
+        """ changed(x: float, y: float, label: str) -> None
+        Change the position and text label from outside the editor
+
+        """
+        if self.centerX <> x or self.centerY <> y or self.label <> label:
+            self.centerX = x
+            self.centerY = y
+            self.label = label
+            self.isTag = tag
+            if self.isTag:
+                self.setFont(CurrentTheme.VERSION_FONT)
+            else:
+                self.setFont(CurrentTheme.VERSION_DESCRIPTION_FONT)
+            self.reset()
+
+    def reset(self):
+        """ reset() -> None
+        Resets the text label, width, and positions to the stored values
+
+        """
+        self.setPlainText(self.label)
+        self.setEditable(False)
+        if (len(str(self.label)) > 0):
+            self.setTextWidth(-1)
+        else:
+            self.setTextWidth(CurrentTheme.VERSION_LABEL_MARGIN[0])
+            
+        if self.isTag:
+            self.setFont(CurrentTheme.VERSION_FONT)
+        else:
+            self.setFont(CurrentTheme.VERSION_DESCRIPTION_FONT)  
+        self.updatePos()
+        self.parentItem().updateWidthFromLabel()
+
+    def updatePos(self):
+        """ updatePos() -> None
+        Center the text, by default it uses the upper left corner
+        
+        """
+        self.setPos(self.centerX-self.boundingRect().width()/2.0,
+                    self.centerY-self.boundingRect().height()/2.0)
+
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QEvent) -> None
+        Enter and Return keys signal a change in the label.  Other keys
+        update the position and size of the parent ellipse during key entry.
+
+        """
+        if event.key() in [QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return]:
+            self.updatingTag = True
+            if (self.label == str(self.toPlainText()) or
+                not self.scene().controller.update_current_tag(str(self.toPlainText()))):
+                self.reset()
+            self.updatingTag = False
+            event.ignore()
+            self.clearFocus()
+            return
+        qt_super(QGraphicsVersionTextItem, self).keyPressEvent(event)
+        if (len(str(self.toPlainText())) > 0):
+            self.setTextWidth(-1)
+        self.updatePos()
+        self.parentItem().updateWidthFromLabel()
+
+    def focusOutEvent(self, event):
+        """ focusOutEvent(event: QEvent) -> None
+        Update the tag if the text has changed
+
+        """
+        qt_super(QGraphicsVersionTextItem, self).focusOutEvent(event)
+        if not self.updatingTag and self.label != self.toPlainText():
+            self.updatingTag = True
+            if (self.label == str(self.toPlainText()) or 
+                not self.scene().controller.update_current_tag(str(self.toPlainText()))):
+                self.reset()
+            self.updatingTag = False
+
+##############################################################################
+# QGraphicsVersionItem
+
+
+class QGraphicsVersionItem(QGraphicsItemInterface, QtGui.QGraphicsEllipseItem):
+    """
+    QGraphicsVersionItem is the version shape holding version id and
+    label
+    
+    """
+    def __init__(self, parent=None, scene=None):
+        """ QGraphicsVersionItem(parent: QGraphicsItem, scene: QGraphicsScene)
+                                -> QGraphicsVersionItem
+        Create the shape, initialize its pen and brush accordingly
+        
+        """
+        QtGui.QGraphicsEllipseItem.__init__(self, parent, scene)
+        self.setZValue(1)
+        self.setAcceptDrops(True)
+        self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable)
+        self._versionPenNormal = CurrentTheme.VERSION_PEN
+        self._versionPen = CurrentTheme.VERSION_PEN
+        self._versionBrush = CurrentTheme.VERSION_USER_BRUSH
+        self.id = -1
+        self.label = ''
+        self.descriptionLabel = ''
+        self.dragging = False
+        self.ghosted = False
+        self.updatePainterState()
+
+        # self.rank is a positive number that determines the
+        # saturation of the node. Two version nodes might have the
+        # same rank if they were created by different users
+        # self.max_rank is the maximum rank for that version class
+        self.rank = -1
+        self.max_rank = -1
+        
+        # Editable text item that remains hidden unless the version is selected
+        self.text = QGraphicsVersionTextItem(self)
+
+        # Need a timer to start a drag to avoid stalls on QGraphicsView
+        self.dragTimer = QtCore.QTimer()
+        self.dragTimer.setSingleShot(True)
+        self.dragTimer.connect(self.dragTimer,
+                               QtCore.SIGNAL('timeout()'),
+                               self.startDrag)
+
+        self.dragPos = QtCore.QPoint()
+
+    def _get_versionPen(self):
+        return self._versionPen
+    def _set_versionPen(self, pen):
+        self._versionPen = pen
+        self.updatePainterState()
+    versionPen = property(_get_versionPen, _set_versionPen)
+
+    def _get_versionBrush(self):
+        return self._versionBrush
+    def _set_versionBrush(self, brush):
+        self._versionBrush = brush
+        self.updatePainterState()
+    versionBrush = property(_get_versionBrush, _set_versionBrush)
+
+    def itemChange(self, change, value):
+        if change == QtGui.QGraphicsItem.ItemSelectedHasChanged:
+            if self.isSelected():
+                self.versionPen = CurrentTheme.VERSION_SELECTED_PEN
+                self.text.setEditableLater()
+            else:
+                self.versionPen = self._versionPenNormal
+                self.text.setEditable(False)
+            self.updatePainterState()
+        return QtGui.QGraphicsItem.itemChange(self, change, value)
+
+    def setGhosted(self, ghosted=True):
+        """ setGhosted(ghosted: True) -> None
+        Set this version to be ghosted or not
+        
+        """
+        if self.ghosted <> ghosted:
+            self.ghosted = ghosted
+            self.text.setGhosted(ghosted)
+            if ghosted:
+                self._versionPenNormal = CurrentTheme.GHOSTED_VERSION_PEN
+                self._versionBrush = CurrentTheme.GHOSTED_VERSION_USER_BRUSH
+            else:
+                self._versionPenNormal = CurrentTheme.VERSION_PEN
+                self._versionBrush = CurrentTheme.VERSION_USER_BRUSH
+            if not self.isSelected():
+                self._versionPen = self._versionPenNormal
+            self.updatePainterState()
+
+    def update_color(self, isThisUs, new_rank, new_max_rank, new_ghosted):
+        """ update_color(isThisUs: bool,
+                         new_rank, new_max_rank: int) -> None
+
+        If necessary, update the colors of this version node based on
+        who owns the node and new ranks
+
+        NOTE: if username changes during execution, this might break.
+        """
+        if (new_rank == self.rank and new_max_rank == self.max_rank and
+            new_ghosted == self.ghosted):
+            # nothing changed
+            return
+        self.setGhosted(new_ghosted)
+        self.rank = new_rank
+        self.max_rank = new_max_rank
+        if not self.ghosted:
+            if isThisUs:
+                brush = CurrentTheme.VERSION_USER_BRUSH
+            else:
+                brush = CurrentTheme.VERSION_OTHER_BRUSH
+            sat = float(new_rank+1) / new_max_rank
+            (h, s, v, a) = brush.color().getHsvF()
+            newHsv = (h, s*sat, v+(1.0-v)*(1-sat), a)
+            self.versionBrush = QtGui.QBrush(QtGui.QColor.fromHsvF(*newHsv))
+                
+    def setSaturation(self, isThisUser, sat):
+        """ setSaturation(isThisUser: bool, sat: float) -> None        
+        Set the color of this version depending on whose is the user
+        and its saturation
+        
+        """
+        if not self.ghosted:
+            if isThisUser:
+                brush = CurrentTheme.VERSION_USER_BRUSH
+            else:
+                brush = CurrentTheme.VERSION_OTHER_BRUSH
+
+            (h, s, v, a) = brush.color().getHsvF()
+            newHsv = (h, s*sat, v+(1.0-v)*(1-sat), a)
+            self.versionBrush = QtGui.QBrush(QtGui.QColor.fromHsvF(*newHsv))
+    
+    def updateWidthFromLabel(self):
+        """ updateWidthFromLabel() -> None
+        Change the width of the ellipse based on a temporary change in the label
+
+        """
+        prevWidth = self.rect().width()
+        width = self.text.boundingRect().width() + \
+            CurrentTheme.VERSION_LABEL_MARGIN[0] - 4
+        r = self.rect()
+        r.setX(r.x()+(prevWidth-width)/2.0)
+        r.setWidth(width)
+        self.setRect(r)
+        self.update()
+
+    def setupVersion(self, node, action, tag, description):
+        """ setupPort(node: DotNode,
+                      action: DBAction,
+                      tag: str,
+                      description: str) -> None
+        Update the version dimensions and id
+        
+        """
+        # Lauro:
+        # what was this hacking??? the coordinates inside
+        # the input "node" should come to this point ready. This is
+        # not the point to do layout calculations (e.g. -node.p.y/2)
+
+        # Carlos:
+        # This is not layout as much as dealing with the way Qt
+        # specifies rectangles. Besides, moving this back here reduces
+        # code duplication, and allows customized behavior for
+        # subclasses.
+
+        rect = QtCore.QRectF(node.p.x-node.width/2.0,
+                             node.p.y-node.height/2.0,
+                             node.width,
+                             node.height)
+        validLabel = True
+        if tag is None:
+            label = ''
+            validLabel=False
+        else:
+            label = tag
+
+        self.id = node.id
+        self.label = label
+        if description is None:
+            self.descriptionLabel = ''
+        else:
+            self.descriptionLabel = description
+        if validLabel:
+            textToDraw=self.label
+        else:
+            textToDraw=self.descriptionLabel
+        
+        if (ThumbnailCache.getInstance().conf.mouseHover and
+            action and action.thumbnail is not None):
+            fname = ThumbnailCache.getInstance().get_abs_name_entry(action.thumbnail)
+            self.setToolTip('<img src="%s" height="128" border="1"/>'%fname)
+        else:
+            self.setToolTip('')    
+        self.text.changed(node.p.x, node.p.y, textToDraw, validLabel)
+        self.setRect(rect)
+
+    def boundingRect(self):
+        """ boundingRect() -> QRectF
+        Add a padded space to avoid un-updated area
+        """
+        return self.rect().adjusted(-2, -2, 2, 2)
+
+    def paint(self, painter, option, widget=None):
+        option.state &= ~QtGui.QStyle.State_Selected
+        QtGui.QGraphicsEllipseItem.paint(self, painter, option, widget)
+
+    def updatePainterState(self):
+        self.setPen(self._versionPen)
+        self.setBrush(self._versionBrush)
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Start dragging a version to someplaces...
+        
+        """
+        if event.button()==QtCore.Qt.LeftButton:
+            self.dragging = True
+            self.dragPos = QtCore.QPoint(event.screenPos())
+        return QtGui.QGraphicsEllipseItem.mousePressEvent(self, event)
+        
+    def mouseMoveEvent(self, event):
+        """ mouseMoveEvent(event: QMouseEvent) -> None        
+        Now set the timer preparing for dragging. Must use a timer in
+        junction with QDrag in order to avoid problem updates stall of
+        QGraphicsView, especially on Linux
+        
+        """
+        if (self.dragging and
+            (event.screenPos()-self.dragPos).manhattanLength()>2):
+            self.dragging = False
+            #the timer has undesirable effects on Windows
+            if systemType not in ['Windows', 'Microsoft']:
+                self.dragTimer.start(1)
+            else:
+                self.startDrag()
+        QtGui.QGraphicsEllipseItem.mouseMoveEvent(self, event)
+        # super(QGraphicsVersionItem, self).mouseMoveEvent(event)
+
+    def startDrag(self):
+        """ startDrag() -> None
+        Start the drag of QDrag
+        
+        """
+        data = QtCore.QMimeData()
+        data.versionId = self.id
+        data.controller = self.scene().controller
+        drag = QtGui.QDrag(self.scene().views()[0])
+        drag.setMimeData(data)
+        drag.setPixmap(CurrentTheme.VERSION_DRAG_PIXMAP)
+        drag.start()
+
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(event: QMouseEvent) -> None
+        Cancel the drag
+        
+        """
+        self.dragging = False
+        QtGui.QGraphicsEllipseItem.mouseReleaseEvent(self, event)
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Capture version-to-version drag-and-drop
+        Also capture parameter exploration assignment
+        """
+        data = event.mimeData()
+        if (hasattr(data, 'versionId') and
+            hasattr(data, 'controller') and
+            data.versionId!=self.id) or \
+           (hasattr(data, 'items') and 
+            len(data.items) == 1 and
+            isinstance(data.items[0], QParamExplorationEntityItem)):
+            event.accept()
+        else:
+            event.ignore()
+
+    def dropEvent(self, event):
+        data = event.mimeData()
+        if (hasattr(data, 'versionId') and hasattr(data, 'controller') and
+            data.controller==self.scene().controller):
+            event.accept()
+            self.scene().emit(QtCore.SIGNAL('diffRequested(int,int)'),
+                              data.versionId, self.id)
+            # visDiff = QVisualDiff(self.scene().controller.vistrail,
+            #                       data.versionId,
+            #                       self.id,
+            #                       self.scene().controller,
+            #                       self.scene().views()[0])
+            # visDiff.show()
+        elif (hasattr(data, 'items') and 
+              len(data.items) == 1 and
+              isinstance(data.items[0], QParamExplorationEntityItem)):
+            # apply this parameter exploration to the new version, validate it and switch to PE view
+            from vistrails.gui.vistrails_window import _app
+            view = _app.get_current_view()
+            view.apply_parameter_exploration(self.id, data.items[0].entity.pe)
+            event.accept()
+        else:
+            event.ignore()  
+
+    def perform_analogy(self):
+        sender = self.scene().sender()
+        analogy_name = str(sender.text())
+        # selectedItems = self.scene().selectedItems()
+        controller = self.scene().controller
+        print "calling perform analogy", analogy_name, self.id
+        # for item in selectedItems:
+        controller.perform_analogy(analogy_name, self.id)
+
+    def show_raw_pipeline(self):
+        self.scene().emit_selection = False
+        for item in self.scene().selectedItems():
+            item.setSelected(False)
+        self.setSelected(True)
+        self.scene().emit_selection = True
+        self.scene().emit(
+            QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+            self.id, True, False, True, True)
+            
+    def construct_from_root(self):
+        self.scene().emit_selection = False
+        for item in self.scene().selectedItems():
+            item.setSelected(False)
+        self.setSelected(True)
+        self.scene().emit_selection = True
+        self.scene().emit(
+            QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+            self.id, True, True, True, True)
+
+    def contextMenuEvent(self, event):
+        """contextMenuEvent(event: QGraphicsSceneContextMenuEvent) -> None
+        Captures context menu event.
+
+        """
+        controller = self.scene().controller
+        menu = QtGui.QMenu()
+        raw_action = QtGui.QAction("Display raw pipeline", self.scene())
+        from_root_action = QtGui.QAction("Construct from root", self.scene())
+        QtCore.QObject.connect(raw_action,
+                               QtCore.SIGNAL("triggered()"),
+                               self.show_raw_pipeline)
+        QtCore.QObject.connect(from_root_action,
+                               QtCore.SIGNAL("triggered()"),
+                               self.construct_from_root)
+        menu.addAction(raw_action)
+        menu.addAction(from_root_action)
+        if len(controller.analogy) > 0:
+            analogies = QtGui.QMenu("Perform analogy...")
+            for title in sorted(controller.analogy.keys()):
+                act = QtGui.QAction(title, self.scene())
+                analogies.addAction(act)
+                QtCore.QObject.connect(act,
+                                       QtCore.SIGNAL("triggered()"),
+                                       self.perform_analogy)
+            menu.addMenu(analogies)
+        menu.exec_(event.screenPos())
+
+    def mouseDoubleClickEvent(self, event):
+        # QtGui.QGraphicsEllipseItem.mouseDoubleClickEvent(self, event)
+        event.accept()
+        self.scene().double_click(self.id)
+
+
+class QVersionTreeScene(QInteractiveGraphicsScene):
+    """
+    QVersionTree inherits from QInteractiveGraphicsScene to keep track
+    of the version scenes, i.e. versions, connections, etc.
+    
+    """
+
+    def __init__(self, parent=None):
+        """ QVersionTree(parent: QWidget) -> QVersionTree
+        Initialize the graphics scene with no shapes
+        
+        """
+        QInteractiveGraphicsScene.__init__(self, parent)
+        self.setBackgroundBrush(CurrentTheme.VERSION_TREE_BACKGROUND_BRUSH)
+        self.setSceneRect(QtCore.QRectF(-5000, -5000, 10000, 10000))
+        self.versions = {}  # id -> version gui object
+        self.edges = {}     # (sourceVersion, targetVersion) -> edge gui object
+        self.controller = None
+        self.fullGraph = None
+        self.timer = QtCore.QBasicTimer()
+        self.animation_step = 1
+        self.num_animation_steps = 1
+        self.emit_selection = True
+        self.select_by_click = True
+        self.connect(self, QtCore.SIGNAL("selectionChanged()"),
+                     self.selectionChanged)
+   
+    def addVersion(self, node, action, tag, description):
+        """ addModule(node, action: DBAction, tag: str, description: str) 
+                -> None
+        Add a module to the scene.
+        
+        """
+        versionShape = QGraphicsVersionItem(None)
+        versionShape.setupVersion(node, action, tag, description)
+        self.addItem(versionShape)
+        self.versions[node.id] = versionShape
+
+    def removeVersion(self, v):
+        """ addLink(v: integer) -> None
+        Remove version from scene and mapping
+        
+        """
+        versionShape = self.versions[v]
+        self.removeItem(versionShape)
+        self.versions.pop(v)
+
+    def addLink(self, guiSource, guiTarget, expand, collapse):
+        """ addLink(v1, v2: QGraphicsVersionItem) -> None
+        Add a link to the scene
+        
+        """
+        linkShape = QGraphicsLinkItem()
+        linkShape.setupLink(guiSource, guiTarget, expand, collapse)
+        self.addItem(linkShape)
+        self.edges[(guiSource.id, guiTarget.id)] = linkShape
+        
+    def removeLink(self, source, target):
+        """ removeLink(v1, v2: integers) -> None
+        Remove link from scene and mapping
+        
+        """
+        linkShape = self.edges[(source,target)]
+        self.removeItem(linkShape)
+        self.edges.pop((source, target))
+
+    def clear(self):
+        """ clear() -> None
+        Clear the whole scene
+        
+        """
+        self.versions = {}
+        self.clearItems()
+
+    def adjust_version_colors(self, controller):
+        """ adjust_version_colors(controller: VistrailController) -> None
+        Based on the controller to set version colors
+        
+        """
+        currentUser = controller.vistrail.getUser()
+        ranks = {}
+        ourMaxRank = 0
+        otherMaxRank = 0
+        am = controller.vistrail.actionMap
+        for nodeId in sorted(self.versions.keys()):
+            if nodeId!=0:
+                nodeUser = am[nodeId].user
+                if nodeUser==currentUser:
+                    ranks[nodeId] = ourMaxRank
+                    ourMaxRank += 1
+                else:
+                    ranks[nodeId] = otherMaxRank
+                    otherMaxRank += 1
+        for (nodeId, item) in self.versions.iteritems():
+            if nodeId == 0:
+                item.setGhosted(True)
+                continue
+            nodeUser = am[nodeId].user
+            if controller.search and nodeId!=0:
+                ghosted = not controller.search.match(controller.vistrail, 
+                                                      am[nodeId])
+            else:
+                ghosted = False
+                
+            #item.setGhosted(ghosted) # we won't set it now so we can check if
+                                      # the state changed in update_color
+            if nodeUser==currentUser:
+                max_rank = ourMaxRank
+            else:
+                max_rank = otherMaxRank
+#             max_rank = ourMaxRank if nodeUser==currentUser else otherMaxRank
+            item.update_color(nodeUser==currentUser,
+                              ranks[nodeId],
+                              max_rank, ghosted)
+        for (version_from, version_to), link in self.edges.iteritems():
+            if self.versions[version_from].ghosted and \
+                    self.versions[version_to].ghosted:
+                link.setGhosted(True)
+            else:
+                link.setGhosted(False)
+
+    def update_scene_single_node_change(self, controller, old_version, new_version):
+        """ update_scene_single_node_change(controller: VistrailController,
+        old_version, new_version: int) -> None
+
+        Faster alternative to setup_scene when a single version is
+        changed. When this is called, we know that both old_version
+        and new_version don't have tags associated, so no layout
+        changes happen
+    
+        """
+        # self.setupScene(controller)
+
+        # we need to call this every time because version ranks might
+        # change
+        self.adjust_version_colors(controller)
+
+        # update version item
+        v = self.versions[old_version]
+        old_desc = controller.vistrail.get_description(old_version)
+        new_desc = controller.vistrail.get_description(new_version)
+        if old_desc != new_desc:
+            v.descriptionLabel = new_desc
+            v.text.changed(v.text.centerX, v.text.centerY, new_desc, False)
+            v.updateWidthFromLabel()
+        self.versions[new_version] = v
+        del self.versions[old_version]
+        v.id = new_version
+
+        # update link items
+        dst = controller._current_terse_graph.edges_from(new_version)
+        for eto, _ in dst:
+            edge = self.edges[(old_version, eto)]
+            edge.setupLink(self.versions[new_version],
+                           self.versions[eto],
+                           self.fullGraph.parent(eto) != new_version,
+                           False) # We shouldn't ever need a collapse here
+            self.edges[(new_version, eto)] = edge
+            del self.edges[(old_version, eto)]
+
+        src = controller._current_terse_graph.edges_to(new_version)
+        for efrom, _ in src:
+            edge = self.edges[(efrom, old_version)]
+            edge.setupLink(self.versions[efrom],
+                           self.versions[new_version],
+                           self.fullGraph.parent(new_version) != efrom,
+                           False) # We shouldn't ever need a collapse here
+            self.edges[(efrom, new_version)] = edge
+            del self.edges[(efrom, old_version)]
+
+    def setupScene(self, controller, select_node=True):
+        """ setupScene(controller: VistrailController) -> None
+        Construct the scene to view a version tree
+        
+        """
+        import time
+        t = time.clock()
+
+        tClearRefine = time.clock()
+
+        # Clean the previous scene
+        # self.clear()
+
+        self.select_by_click = False        
+        self.controller = controller
+
+        # perform graph layout
+        (tree, self.fullGraph, layout) = \
+            controller.refine_graph(float(self.animation_step)/
+                                    float(self.num_animation_steps))
+
+        tClearRefine = time.clock() - tClearRefine
+
+        # compute nodes that should be removed
+        # O(n  * (hashmap query key time)) on 
+        # where n is the number of current 
+        # nodes in the scene
+        removeNodeSet = set(i for i in self.versions
+                            if not i in tree.vertices)
+
+        # compute edges to be removed
+        # O(n * (hashmap query key time)) 
+        # where n is the number of current 
+        # edges in the scene
+        removeEdgeSet = set((s, t) for (s, t) in self.edges
+                            if (s in removeNodeSet or
+                                t in removeNodeSet or
+                                not tree.has_edge(s, t)))
+
+        # loop on the nodes of the tree
+        vistrail = controller.vistrail
+        tm = vistrail.get_tagMap()
+        am = vistrail.actionMap
+        last_n = vistrail.getLastActions(controller.num_versions_always_shown)
+
+        self.emit_selection = False
+        for node in layout.nodes.itervalues():
+
+            # version id
+            v = node.id
+
+            # version tag
+            tag = tm.get(v, None)
+            action = am.get(v, None)
+            description = vistrail.get_description(v)
+
+            # if the version gui object already exists...
+            if v in self.versions:
+                versionShape = self.versions[v]
+                versionShape.setupVersion(node, action, tag, description)
+            else:
+                self.addVersion(node, action, tag, description)
+            if select_node:
+                self.versions[v].setSelected(v == controller.current_version)
+
+        self.emit_selection = True
+        self.selectionChanged()
+
+
+        # remove gui edges from scene
+        for (v1, v2) in removeEdgeSet:
+            self.removeLink(v1,v2)
+
+        # remove gui nodes from scene
+        for v in removeNodeSet:
+            self.removeVersion(v)
+
+        tCreate = time.clock()
+
+        # adjust the colors
+        self.adjust_version_colors(controller)
+
+        # Add or update links
+        for source in tree.vertices.iterkeys():
+            eFrom = tree.edges_from(source)
+            for (target, aux) in eFrom:
+                guiSource = self.versions[source]
+                guiTarget = self.versions[target]
+                sourceChildren = [to for (to, _) in 
+                                  self.fullGraph.adjacency_list[source]
+                                  if (to in am) and not vistrail.is_pruned(to)]
+                targetChildren = [to for (to, _) in
+                                  self.fullGraph.adjacency_list[target]
+                                  if (to in am) and not vistrail.is_pruned(to)]
+                expand = self.fullGraph.parent(target)!=source
+                collapse = (self.fullGraph.parent(target)==source and # No in betweens
+                            len(targetChildren) == 1 and # target is not a leaf or branch
+                            target != controller.current_version and # target is not selected
+                            target not in tm and # target has no tag
+                            target not in last_n and # not one of the last n modules
+                            (source in tm or # source has a tag
+                             source == 0 or # source is root node
+                             len(sourceChildren) > 1 or # source is branching node 
+                             source == controller.current_version)) # source is selected
+                if self.edges.has_key((source,target)):
+                    linkShape = self.edges[(source,target)]
+                    linkShape.setupLink(guiSource, guiTarget,
+                                        expand, collapse)
+                else:
+                    #print "add link %d %d" % (source, target)
+                    self.addLink(guiSource, guiTarget, 
+                                 expand, collapse)
+
+        tCreate = time.clock() - tCreate
+
+        # Update bounding rects and fit to all view
+        tUpdate = time.clock()
+        if not self.controller.animate_layout:
+            self.updateSceneBoundingRect()
+        elif not self.timer.isActive():
+            self.timer.start(0, self)
+        tUpdate = time.clock() - tUpdate
+
+        self.select_by_click = True
+
+        t = time.clock() - t
+        # print "time in msec to setupScene total: %f  refine %f  layout %f  create %f" % (t, tClearRefine, tCreate)
+
+    def timerEvent(self, event):
+        """ timerEvent(event: QTimerEvent) -> None
+        
+        Start up a timer for animating tree drawing events
+        """
+        if event.timerId() == self.timer.timerId():
+            self.animation_step += 1
+            if self.animation_step >= self.num_animation_steps:
+                self.animation_step = 1
+                self.timer.stop()
+                self.controller.animate_layout = False
+            self.setupScene(self.controller)
+            self.update()
+        else:
+            qt_super(QVersionTreeScene, self).timerEvent(event)
+
+    def keyPressEvent(self, event):
+        """ keyPressEvent(event: QKeyEvent) -> None
+        Capture 'Del', 'Backspace' for pruning versions when not editing a tag
+       
+        """        
+        selectedItems = self.selectedItems()
+        versions = [item.id for item in selectedItems 
+                    if isinstance(item, QGraphicsVersionItem)
+                    and not item.text.hasFocus()] 
+        if (self.controller and len(versions)>0 and
+            event.key() in [QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete]):
+            event.accept()
+            versions = [item.id for item in selectedItems]
+            res = vistrails.gui.utils.show_question("VisTrails",
+                                           "Are you sure that you want to "
+                                           "prune the selected version(s)?",
+                                           [vistrails.gui.utils.YES_BUTTON,
+                                            vistrails.gui.utils.NO_BUTTON],
+                                           vistrails.gui.utils.NO_BUTTON)
+            if res == vistrails.gui.utils.YES_BUTTON:
+                self.controller.prune_versions(versions)
+        else:
+            qt_super(QVersionTreeScene, self).keyPressEvent(event)
+
+    def selectionChanged(self):
+        if not self.emit_selection:
+            return
+
+        selected_items = self.selectedItems()
+        if len(selected_items) == 1:
+            # emit versionSelected selected_id
+            self.emit(QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+                      selected_items[0].id, self.select_by_click, 
+                      True, False, False)
+        else:
+            # emit versionSelected -1
+            for item in selected_items:
+                if item.text.isEditable:
+                    item.text.setEditable(False)
+            self.emit(QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+                      -1, self.select_by_click, True, False, False)
+
+        if len(selected_items) == 2:
+            self.emit(
+                QtCore.SIGNAL('twoVersionsSelected(int, int)'),
+                selected_items[0].id, selected_items[1].id)
+
+    def double_click(self, version_id):
+        self.mouseGrabberItem().ungrabMouse()
+        self.emit(QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+                  version_id, self.select_by_click, True, False, True)
+
+class QVersionTreeView(QInteractiveGraphicsView, BaseView):
+    """
+    QVersionTreeView inherits from QInteractiveGraphicsView that will
+    handle drawing of versions layout output from Dotty
+    
+    """
+
+    def __init__(self, parent=None):
+        """ QVersionTreeView(parent: QWidget) -> QVersionTreeView
+        Initialize the graphics view and its properties
+        
+        """
+        QInteractiveGraphicsView.__init__(self, parent)
+        BaseView.__init__(self)
+        self.controller = None
+        self.set_title('Version Tree')
+        self.setScene(QVersionTreeScene(self))
+        self.versionProp = QVersionPropOverlay(self, self.viewport())
+        self.versionProp.hide()
+
+    def set_default_layout(self):
+        from vistrails.gui.collection.workspace import QWorkspaceWindow
+        from vistrails.gui.version_prop import QVersionProp
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QWorkspaceWindow,
+             QtCore.Qt.RightDockWidgetArea: QVersionProp,
+             })
+            
+    def set_action_links(self):
+        self.action_links = \
+            {
+             'publishWeb' : ('version_changed', self.check_publish_db),
+             'publishPaper': ('version_changed', self.check_publish),
+             'redo': ('version_changed', self.can_redo),
+             'undo': ('version_changed', self.can_undo),
+             'execute': ('pipeline_changed', self.can_execute)
+            }
+        
+    def set_action_defaults(self):
+        self.action_defaults['execute'] = \
+            [('setEnabled', True, self.set_action_execute_default)]
+
+    def set_action_execute_default(self):
+        if self.controller:
+            if self.controller.current_pipeline:
+                return len(self.controller.current_pipeline.modules) > 0
+        return False
+    
+    def check_publish_db(self, versionId):
+        loc = self.controller.locator
+        result = False
+        if hasattr(loc,'host'):
+            result = True    
+        return result and self.check_publish(versionId)
+    
+    def check_publish(self, versionId):
+        return versionId > 0 
+
+    def can_redo(self, versionId):
+        return self.controller and self.controller.can_redo()
+
+    def can_undo(self, versionId):
+        return self.controller and self.controller.can_undo()
+    
+    def can_execute(self, pipeline):
+        return pipeline is not None and len(pipeline.modules) > 0
+    
+    def execute(self):
+        res = self.controller.execute_current_workflow()
+        from vistrails.gui.vistrails_window import _app
+        if len(res[0][0].errors) > 0:
+            _app.qactions['pipeline'].trigger()
+        _app.notify('execution_updated')
+        
+    def publish_to_web(self):
+        from vistrails.gui.publishing import QVersionEmbed
+        panel = QVersionEmbed.instance()
+        panel.switchType('Wiki')
+        panel.set_visible(True)
+        
+    def publish_to_paper(self):
+        from vistrails.gui.publishing import QVersionEmbed
+        panel = QVersionEmbed.instance()
+        panel.switchType('Latex')
+        panel.set_visible(True)
+        
+    def selectModules(self):
+        """ selectModules() -> None
+        Overrides parent class to disable text items if you click on background
+
+        """
+        if self.canSelectRectangle:
+            br = self.selectionBox.sceneBoundingRect()
+        else:
+            br = QtCore.QRectF(self.startSelectingPos,
+                               self.startSelectingPos)
+        items = self.scene().items(br)
+        if len(items)==0 or items==[self.selectionBox]:
+            for item in self.scene().selectedItems():
+                if isinstance(item, vistrails.gui.version_view.QGraphicsVersionItem):
+                    item.text.clearFocus()
+        qt_super(QVersionTreeView, self).selectModules()
+                
+    def set_title(self, title):
+        BaseView.set_title(self, title)
+        self.setWindowTitle(title)
+
+    def set_controller(self, controller):
+        oldController = self.controller
+        if oldController != controller:
+            if oldController != None:
+                self.disconnect(oldController,
+                                QtCore.SIGNAL('vistrailChanged()'),
+                                self.vistrailChanged)
+                self.disconnect(oldController,
+                                QtCore.SIGNAL('invalidateSingleNodeInVersionTree'),
+                                self.single_node_changed)
+                self.disconnect(oldController,
+                                QtCore.SIGNAL('notesChanged()'),
+                                self.notesChanged)
+            self.controller = controller
+            self.scene().controller = controller
+            self.connect(controller,
+                         QtCore.SIGNAL('vistrailChanged()'),
+                         self.vistrailChanged)
+            self.connect(controller,
+                         QtCore.SIGNAL('invalidateSingleNodeInVersionTree'),
+                         self.single_node_changed)
+            self.connect(controller,
+                         QtCore.SIGNAL("notesChanged()"),
+                         self.notesChanged)
+            if controller:
+                self.versionProp.updateController(controller)
+                self.scene().setupScene(controller)
+                # self.vistrailChanged()
+                # self.versionProp.updateController(controller)
+                # self.versionView.versionProp.updateController(controller)
+
+    def vistrailChanged(self):
+        """ vistrailChanged() -> None
+        An action was performed on the current vistrail
+        
+        """
+        from vistrails.gui.vistrails_window import _app
+        select_node = True
+        if _app._previous_view and _app._previous_view.window() != self.window():
+            select_node = False
+        self.scene().setupScene(self.controller, select_node)
+        if self.controller and self.controller.reset_version_view:
+            self.scene().fitToAllViews()
+        if self.controller:
+            # self.versionProp.updateVersion(self.controller.current_version)
+            self.versionProp.updateVersion(self.controller.current_version)
+        self.emit(QtCore.SIGNAL("vistrailChanged()"))
+
+    def single_node_changed(self, old_version, new_version):
+        """ single_node_changed(old_version, new_version)
+        Handle single node change on version tree by not recomputing
+        entire scene.
+
+        """
+        self.scene().update_scene_single_node_change(self.controller,
+                                                     old_version,
+                                                     new_version)
+        if self.controller and self.controller.reset_version_view:
+            self.scene().fitToAllViews()
+        if self.controller:
+            # self.versionProp.updateVersion(self.controller.current_version)
+            self.versionProp.updateVersion(self.controller.current_version)
+        self.emit(QtCore.SIGNAL("vistrailChanged()"))
+
+    def notesChanged(self):
+        """ notesChanged() -> None
+        The notes for the current vistrail version changed
+
+        """
+        if self.controller:
+            self.versionProp.updateVersion(self.controller.current_version)
+
+    def select_current_version(self):
+        self.scene().setupScene(self.controller)
+################################################################################
diff --git a/vistrails/gui/view_manager.py b/vistrails/gui/view_manager.py
new file mode 100644
index 0000000..105488d
--- /dev/null
+++ b/vistrails/gui/view_manager.py
@@ -0,0 +1,903 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This holds a customized QTabWidget for controlling different
+vistrail views and tools
+
+QViewManager
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import getBuilderWindow
+from vistrails.gui.vistrail_view import QVistrailView
+from vistrails.core import system, debug
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core.db.locator import FileLocator, XMLFileLocator, untitled_locator
+from vistrails.core.db.io import load_vistrail
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core.log.log import Log
+from vistrails.core.log.opm_graph import OpmGraph
+from vistrails.core.collection import Collection
+import vistrails.core.system
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.tag import Tag
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core.modules.module_registry import ModuleRegistry, \
+    ModuleRegistryException
+import copy
+
+################################################################################
+class QDetachedView(QtGui.QStackedWidget):
+    """
+    QDetachedView is a stacked widget holding detached views
+    (e.g. Pipeline, History, etc) from the main view manager.
+    
+    """
+    
+    def __init__(self, title, parent=None):
+        """ QDetachedView(parent: QWidget) -> QDetachedView
+        Create an empty stacked widget
+        
+        """
+        QtGui.QStackedWidget.__init__(self, parent)
+        self.title = title
+        self.setWindowTitle(self.title)
+
+    def sizeHint(self):
+        """ sizeHint() -> QRect
+        Return the recommended size of a detached view
+
+        """
+        return QtCore.QSize(800, 600)
+        
+
+################################################################################
+class QViewManager(QtGui.QTabWidget):
+    """
+    QViewManager is a tabbed widget to containing multiple Vistrail
+    views. It takes care of emiting useful signals to the builder
+    window
+    
+    """
+    def __init__(self, parent=None):
+        """ QViewManager(view: QVistrailView) -> QViewManager
+        Create an empty tab widget
+        
+        """
+        QtGui.QTabWidget.__init__(self, parent)
+        self.closeButton = QtGui.QToolButton(self)
+        self.closeButton.setIcon(CurrentTheme.VIEW_MANAGER_CLOSE_ICON)
+        self.closeButton.setAutoRaise(True)
+        self.setCornerWidget(self.closeButton)
+        self.activeIndex = -1
+        
+        self.connect(self, QtCore.SIGNAL('currentChanged(int)'),
+                     self.currentChanged)
+        self.connect(self.closeButton, QtCore.SIGNAL('clicked()'),
+                     self.closeVistrail)
+        
+        self._views = {}
+        self.single_document_mode = False
+        self.pip_mode = True
+
+        self.createDetachedViews()
+
+    def createDetachedViews(self):
+        """ createDetachedViews() -> None
+        Create a set of QStackedWidget for displaying detached views
+        based on the input configuration
+        
+        """
+        if getattr(get_vistrails_configuration(), 'detachHistoryView'):
+            self.historyView = QDetachedView('History View')
+            self.historyView.show()
+        else:
+            self.historyView = None
+        
+    def set_single_document_mode(self, on):
+        """ set_single_document_mode(on: bool) -> None
+        Toggle single document interface
+        
+        """
+        self.single_document_mode = on
+        if self.single_document_mode:
+            self.tabBar().hide()
+        else:
+            self.tabBar().show()
+
+    def add_vistrail_view(self, view):
+        """ add_vistrail_view(view: QVistrailView) -> None
+        Add a vistrail view to the tab, and connect to the right signals
+        
+        """
+        self._views[view] = view.controller
+        if self.indexOf(view)!=-1:
+            return
+
+        if self.historyView!=None:
+            self.historyView.addWidget(view.versionTab)
+                
+        view.installEventFilter(self)
+        self.connect(view.pipelineTab,
+                     QtCore.SIGNAL('moduleSelectionChange'),
+                     self.moduleSelectionChange)
+        self.connect(view,
+                     QtCore.SIGNAL('versionSelectionChange'),
+                     self.versionSelectionChange)
+        self.connect(view,
+                     QtCore.SIGNAL('execStateChange()'),
+                     self.execStateChange)
+        self.connect(view.versionTab,
+                     QtCore.SIGNAL('vistrailChanged()'),
+                     self.vistrailChanged)
+        self.connect(view.pipelineTab,
+                     QtCore.SIGNAL('resetQuery()'),
+                     self.resetQuery)
+        self.connect(view.versionTab,
+                     QtCore.SIGNAL('resetQuery()'),
+                     self.resetQuery)
+        self.connect(view.queryTab,
+                     QtCore.SIGNAL('resetQuery()'),
+                     self.resetQuery)
+
+        self.emit(QtCore.SIGNAL('vistrailViewAdded'), view)
+        self.addTab(view, view.windowTitle())
+        if self.count()==1:
+            self.emit(QtCore.SIGNAL('currentChanged(int)'), 0)
+
+    def removeVistrailView(self, view):
+        """ removeVistrailView(view: QVistrailView) -> None
+        Remove the current vistrail view and destroy it
+        
+        """
+        if view:
+            del self._views[view]
+            view.removeEventFilter(self)
+            self.disconnect(view.pipelineTab,
+                            QtCore.SIGNAL('moduleSelectionChange'),
+                            self.moduleSelectionChange)
+            self.disconnect(view,
+                            QtCore.SIGNAL('versionSelectionChange'),
+                            self.versionSelectionChange)
+            self.disconnect(view.versionTab,
+                            QtCore.SIGNAL('vistrailChanged()'),
+                            self.vistrailChanged)
+
+            # FIXME move this elsewhere?
+            self.disconnect(view.versionTab.versionView.scene(),
+                            QtCore.SIGNAL('selectionChanged()'),
+                            view.versionTab.versionView.scene().selectionChanged)
+            self.emit(QtCore.SIGNAL('vistrailViewRemoved'), view)
+            index = self.indexOf(view) 
+            if index !=-1:
+                if self.historyView:
+                    self.historyView.removeWidget(self.historyView.widget(self.currentIndex()))
+                self.removeTab(self.currentIndex())
+                self.activeIndex = self.currentIndex()
+            view.controller.cleanup()
+            view.close()
+            view.deleteLater()
+
+    def moduleSelectionChange(self, selection):
+        """ moduleSelectionChange(selection: list[id]) -> None
+        Just echo the signal from the view
+        
+        """
+        self.emit(QtCore.SIGNAL('moduleSelectionChange'), selection)
+
+    def versionSelectionChange(self, versionId):
+        """ versionSelectionChange(versionId: int) -> None
+        Just echo the signal from the view
+        
+        """
+        self.emit(QtCore.SIGNAL('versionSelectionChange'), versionId)
+
+    def execStateChange(self):
+        """ execStateChange() -> None
+        Just echo the signal from the view
+
+        """
+        self.emit(QtCore.SIGNAL('execStateChange()'))
+
+    def vistrailChanged(self):
+        """ vistrailChanged() -> None
+        Just echo the signal from the view
+        
+        """
+        self.emit(QtCore.SIGNAL('vistrailChanged()'))
+
+    def copySelection(self):
+        """ copySelection() -> None
+        Copy the current selected pipeline modules
+        
+        """
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().copySelection()
+
+    def group(self):
+        """group() -> None
+        Creates a group from the selected pipeline modules
+        
+        """
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().group()
+
+    def ungroup(self):
+        """ungroup() -> None
+        Ungroups selected pipeline modules
+        
+        """
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().ungroup()
+
+    def makeAbstraction(self):
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().makeAbstraction()
+    
+    def convertToAbstraction(self):
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().convertToAbstraction()
+
+    def importAbstraction(self):
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().importAbstraction()
+
+    def exportAbstraction(self):
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pipelineTab.pipelineView.scene().exportAbstraction()
+            
+    def currentView(self):
+        """currentView() -> VistrailView. Returns the current vistrail view."""
+        return self.currentWidget()
+
+    def pasteToCurrentPipeline(self):
+        """ pasteToCurrentPipeline() -> None
+        Paste what is on the clipboard to the current pipeline
+        
+        """        
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.pasteToCurrentTab()
+
+    def selectAllModules(self):
+        """ selectAllModules() -> None
+        Select all modules in the current view
+        
+        """
+        vistrailView = self.currentWidget()
+        if vistrailView:
+            vistrailView.selectAll()
+
+    def canSelectAll(self):
+        """ canSelectAll() -> bool        
+        Check to see if there is any module in the pipeline view to be
+        selected
+        
+        """
+        vistrailView = self.currentWidget()
+        if vistrailView and vistrailView.controller.current_pipeline:
+            return len(vistrailView.controller.current_pipeline.modules)>0
+        return False
+
+    def redo(self):
+        """ redo() -> none
+        Performs a redo step.
+
+        """
+        vistrailView = self.currentWidget()
+        if not vistrailView:
+            return
+        new_version = vistrailView.redo()
+        self.emit(QtCore.SIGNAL('versionSelectionChange'), new_version)
+
+    def undo(self):
+        """ undo() -> None
+        Performs an undo step.
+
+        """
+        vistrailView = self.currentWidget()
+        if not vistrailView:
+            return
+        new_version = vistrailView.undo()
+        self.emit(QtCore.SIGNAL('versionSelectionChange'), new_version)
+
+    def newVistrail(self, recover_files=True):
+        """ newVistrail() -> (None or QVistrailView)
+        Create a new vistrail with no name. If user cancels process,
+        returns None.
+
+        FIXME: We should do the interactive parts separately.
+        
+        """
+        if self.single_document_mode and self.currentView():
+            if not self.closeVistrail():
+                return None
+        if recover_files and untitled_locator().has_temporaries():
+            locator = copy.copy(untitled_locator())
+        else:
+            locator = None
+        try:
+            (vistrail, abstraction_files, thumbnail_files, _) = load_vistrail(locator)
+        except ModuleRegistryException, e:
+            debug.critical("Module registry error for %s" %
+                           str(e.__class__.__name__), str(e))
+        except Exception, e:
+            debug.critical('An error has occurred', str(e))
+            raise
+        return self.set_vistrail_view(vistrail, locator, abstraction_files,
+                                      thumbnail_files)
+
+    def close_first_vistrail_if_necessary(self):
+        # Close first vistrail of no change was made
+        if not self._first_view:
+            return
+        vt = self._first_view.controller.vistrail
+        if vt.get_version_count() == 0:
+            self.closeVistrail(self._first_view)
+            self._first_view = None
+        else:
+            # We set it to none, since it's been changed, so
+            # we don't want to ever close it again.
+            self._first_view = None
+
+    def set_vistrail_view(self, vistrail, locator, abstraction_files=None,
+                          thumbnail_files=None, version=None):
+        """set_vistrail_view(vistrail: Vistrail,
+                             locator: VistrailLocator,
+                             abstraction_files: list(str),
+                             thumbnail_files: list(str),
+                             version=None)
+                          -> QVistrailView
+        Sets a new vistrail view for the vistrail object for the given version
+        if version is None, use the latest version
+        """
+
+        if isinstance(version, basestring):
+            try:
+                version = vistrail.get_version_number(version)
+            except:
+                version = None
+
+        vistrailView = QVistrailView()
+        vistrailView.set_vistrail(vistrail, locator, abstraction_files,
+                                  thumbnail_files)
+        self.add_vistrail_view(vistrailView)
+        self.setCurrentWidget(vistrailView)
+        vistrailView.setup_view(version)
+        vistrailView.setPIPMode(self.pip_mode)
+        self.versionSelectionChange(vistrailView.controller.current_version)
+        return vistrailView
+
+    def open_vistrail(self, locator, version=None, is_abstraction=False):
+        """open_vistrail(locator: Locator, version = None: int or str,
+                         is_abstraction: bool)
+
+        opens a new vistrail from the given locator, selecting the
+        given version.
+
+        """
+        self.close_first_vistrail_if_necessary()
+        if self.single_document_mode and self.currentView():
+            self.closeVistrail()
+        view = self.ensureVistrail(locator)
+        if view:
+            if version is not None:
+                if isinstance(version, basestring):
+                    try:
+                        version = view.vistrail.get_version_number(version)
+                    except:
+                        version = None
+                if version is not None:
+                    view.setup_view(version)
+            return view
+        try:
+            (vistrail, abstraction_files, thumbnail_files, _) = \
+                                        load_vistrail(locator, is_abstraction)
+            result = self.set_vistrail_view(vistrail, locator, 
+                                            abstraction_files, thumbnail_files,
+                                            version)
+            # update collection
+            try:
+                vistrail.thumbnails = thumbnail_files
+                vistrail.abstractions = abstraction_files
+                collection = Collection.getInstance()
+                url = locator.to_url()
+                # create index if not exist
+                entity = collection.fromUrl(url)
+                if entity:
+                    # find parent vistrail
+                    while entity.parent:
+                        entity = entity.parent 
+                else:
+                    entity = collection.updateVistrail(url, vistrail)
+                # add to relevant workspace categories
+                collection.add_to_workspace(entity)
+                collection.commit()
+            except Exception, e:
+                import traceback
+                debug.critical('Failed to index vistrail', str(e) + traceback.format_exc())
+            return result
+        except ModuleRegistryException, e:
+            debug.critical("Module registry error for %s" %
+                           str(e.__class__.__name__), str(e))
+        except Exception, e:
+            import traceback
+            debug.critical('An error has occurred', str(e) + traceback.format_exc())
+            raise
+        
+    def save_vistrail(self, locator_class,
+                      vistrailView=None,
+                      force_choose_locator=False):
+        """
+
+        force_choose_locator=True triggers 'save as' behavior
+        """
+        global bobo
+
+        if not vistrailView:
+            vistrailView = self.currentWidget()
+        vistrailView.flush_changes()
+        if vistrailView:
+            gui_get = locator_class.save_from_gui
+            # get a locator to write to
+            if force_choose_locator:
+                locator = gui_get(self, Vistrail.vtType,
+                                  vistrailView.controller.locator)
+            else:
+                locator = (vistrailView.controller.locator or
+                           gui_get(self, Vistrail.vtType,
+                                   vistrailView.controller.locator))
+            if locator == untitled_locator():
+                locator = gui_get(self, Vistrail.vtType,
+                                  vistrailView.controller.locator)
+            # if couldn't get one, ignore the request
+            if not locator:
+                return False
+            # update collection
+            try:
+                vistrailView.controller.write_vistrail(locator)
+            except Exception, e:
+                debug.critical('An error has occurred', str(e))
+                raise
+                return False
+            try:
+                thumb_cache = ThumbnailCache.getInstance()
+                vistrailView.controller.vistrail.thumbnails = \
+                    vistrailView.controller.find_thumbnails(
+                        tags_only=thumb_cache.conf.tagsOnly)
+                vistrailView.controller.vistrail.abstractions = \
+                    vistrailView.controller.find_abstractions(
+                        vistrailView.controller.vistrail, True)
+
+                collection = Collection.getInstance()
+                url = locator.to_url()
+                # create index if not exist
+                entity = collection.fromUrl(url)
+                if entity:
+                    # find parent vistrail
+                    while entity.parent:
+                        entity = entity.parent 
+                else:
+                    entity = collection.updateVistrail(url, vistrailView.controller.vistrail)
+                # add to relevant workspace categories
+                collection.add_to_workspace(entity)
+                collection.commit()
+            except Exception, e:
+                debug.critical('Failed to index vistrail', str(e))
+            return locator
+        return False
+   
+    def open_workflow(self, locator, version=None):
+        self.close_first_vistrail_if_necessary()
+        if self.single_document_mode and self.currentView():
+            self.closeVistrail()
+
+        vistrail = Vistrail()
+        try:
+            if locator is not None:
+                workflow = locator.load(Pipeline)
+                action_list = []
+                for module in workflow.module_list:
+                    action_list.append(('add', module))
+                for connection in workflow.connection_list:
+                    action_list.append(('add', connection))
+                action = vistrails.core.db.action.create_action(action_list)
+                vistrail.add_action(action, 0L)
+                vistrail.update_id_scope()
+                vistrail.addTag("Imported workflow", action.id)
+                # FIXME might need different locator?
+        except ModuleRegistryException, e:
+            msg = ('Cannot find module "%s" in package "%s". '
+                    'Make sure package is ' 
+                   'enabled in the Preferences dialog.' % \
+                       (e._name, e._identifier))
+            debug.critical(msg)
+        except Exception, e:
+            debug.critical('An error has occurred', str(e))
+            raise
+
+        return self.set_vistrail_view(vistrail, None)
+
+    # FIXME normalize workflow/log/registry!!!
+    def save_workflow(self, locator_class, force_choose_locator=True):
+        vistrailView = self.currentWidget()
+
+        if vistrailView:
+            vistrailView.flush_changes()
+            gui_get = locator_class.save_from_gui
+            if force_choose_locator:
+                locator = gui_get(self, Pipeline.vtType,
+                                  vistrailView.controller.locator)
+            else:
+                locator = (vistrailView.controller.locator or
+                           gui_get(self, Pipeline.vtType,
+                                   vistrailView.controller.locator))
+            if locator == untitled_locator():
+                locator = gui_get(self, Pipeline.vtType,
+                                  vistrailView.controller.locator)
+            if not locator:
+                return False
+            vistrailView.controller.write_workflow(locator)
+            return True
+        return False
+
+    def save_log(self, locator_class, force_choose_locator=True):
+        vistrailView = self.currentWidget()
+
+        if vistrailView:
+            vistrailView.flush_changes()
+            gui_get = locator_class.save_from_gui
+            if force_choose_locator:
+                locator = gui_get(self, Log.vtType,
+                                  vistrailView.controller.locator)
+            else:
+                locator = (vistrailView.controller.locator or
+                           gui_get(self, Log.vtType,
+                                   vistrailView.controller.locator))
+            if locator == untitled_locator():
+                locator = gui_get(self, Log.vtType,
+                                  vistrailView.controller.locator)
+            if not locator:
+                return False
+            vistrailView.controller.write_log(locator)
+            return True
+        return False
+
+    def save_registry(self, locator_class, force_choose_locator=True):
+        vistrailView = self.currentWidget()
+
+        if vistrailView:
+            vistrailView.flush_changes()
+            gui_get = locator_class.save_from_gui
+            if force_choose_locator:
+                locator = gui_get(self, ModuleRegistry.vtType,
+                                  vistrailView.controller.locator)
+            else:
+                locator = (vistrailView.controller.locator or
+                           gui_get(self, ModuleRegistry.vtType,
+                                   vistrailView.controller.locator))
+            if locator == untitled_locator():
+                locator = gui_get(self, ModuleRegistry.vtType,
+                                  vistrailView.controller.locator)
+            if not locator:
+                return False
+            vistrailView.controller.write_registry(locator)
+            return True
+        return False
+
+    def save_opm(self, locator_class=XMLFileLocator, 
+                 force_choose_locator=True):
+        vistrailView = self.currentWidget()
+
+        if vistrailView:
+            vistrailView.flush_changes()
+            gui_get = locator_class.save_from_gui
+            if force_choose_locator:
+                locator = gui_get(self, OpmGraph.vtType,
+                                  vistrailView.controller.locator)
+            else:
+                locator = (vistrailView.controller.locator or
+                           gui_get(self, OpmGraph.vtType,
+                                   vistrailView.controller.locator))
+            if locator == untitled_locator():
+                locator = gui_get(self, OpmGraph.vtType,
+                                  vistrailView.controller.locator)
+            if not locator:
+                return False
+            vistrailView.controller.write_opm(locator)
+            return True
+        return False
+             
+    def export_stable(self, locator_class=XMLFileLocator,
+                      force_choose_locator=True):
+        vistrailView = self.currentWidget()
+        vistrailView.flush_changes()
+
+        if vistrailView:
+            vistrailView.flush_changes()
+            gui_get = locator_class.save_from_gui
+            if force_choose_locator:
+                locator = gui_get(self, Vistrail.vtType,
+                                  vistrailView.controller.locator)
+            else:
+                locator = (vistrailView.controller.locator or
+                           gui_get(self, Vistrail.vtType,
+                                   vistrailView.controller.locator))
+            if locator == untitled_locator():
+                locator = gui_get(self, Vistrail.vtType,
+                                  vistrailView.controller.locator)
+            if not locator:
+                return False
+            vistrailView.controller.write_vistrail(locator, '1.0.1')
+            return True
+        return False
+
+    def closeVistrail(self, vistrailView=None, quiet=False):
+        """ closeVistrail(vistrailView: QVistrailView, quiet: bool) -> bool
+        Close the current active vistrail
+        
+        """
+        if not vistrailView:
+            vistrailView = self.currentWidget()
+        vistrailView.flush_changes()
+
+        if vistrailView:
+            if not quiet and vistrailView.controller.changed:
+                text = vistrailView.controller.name
+                if text=='':
+                    text = 'Untitled%s'%vistrails.core.system.vistrails_default_file_type()
+                text = ('Vistrail ' +
+                        QtCore.Qt.escape(text) +
+                        ' contains unsaved changes.\n Do you want to '
+                        'save changes before closing it?')
+                res = QtGui.QMessageBox.information(getBuilderWindow(),
+                                                    'Vistrails',
+                                                    text, 
+                                                    '&Save', 
+                                                    '&Discard',
+                                                    'Cancel',
+                                                    0,
+                                                    2)
+            else:
+                res = 1
+            locator = vistrailView.controller.locator
+            if res == 0:
+                if locator is None:
+                    class_ = FileLocator()
+                else:
+                    class_ = type(locator)
+                locator = self.save_vistrail(class_)
+                if not locator:
+                    return False
+            elif res == 2:
+                return False
+ 
+            vistrailView.controller.close_vistrail(locator)
+            self.removeVistrailView(vistrailView)
+            if self.count()==0:
+                self.emit(QtCore.SIGNAL('currentVistrailChanged'), None)
+                self.emit(QtCore.SIGNAL('versionSelectionChange'), -1)
+        if vistrailView == self._first_view:
+            self._first_view = None
+        return True
+    
+    def closeAllVistrails(self):
+        """ closeAllVistrails() -> bool        
+        Attemps to close every single vistrail, return True if
+        everything is closed correctly
+        
+        """
+        while self.count()>0:
+            if not self.closeVistrail():
+                return False
+        return True
+
+    def currentChanged(self, index):
+        """ currentChanged(index: int):        
+        Emit signal saying a different vistrail has been chosen to the
+        builder
+        
+        """
+        self.activeIndex = index
+        self.emit(QtCore.SIGNAL('currentVistrailChanged'),
+                  self.currentWidget())
+        if index >= 0:
+            self.emit(QtCore.SIGNAL('versionSelectionChange'), 
+                      self.currentWidget().controller.current_version)
+        else:
+            self.emit(QtCore.SIGNAL('versionSelectionChange'), 
+                      -1)
+        if self.historyView:
+            self.historyView.setCurrentIndex(index)
+            if self.currentView()!=None:
+                self.historyView.setWindowTitle('History View - ' +
+                                                self.currentView().windowTitle())
+        
+    def eventFilter(self, object, event):
+        """ eventFilter(object: QVistrailView, event: QEvent) -> None
+        Filter the window title change event for the view widget
+        
+        """
+        if event.type()==QtCore.QEvent.WindowTitleChange:
+            if object==self.currentWidget():
+                self.setTabText(self.currentIndex(), object.windowTitle())
+                self.currentChanged(self.currentIndex())
+        return QtGui.QTabWidget.eventFilter(self, object, event)
+
+    def getCurrentVistrailFileName(self):
+        """ getCurrentVistrailFileName() -> str        
+        Return the filename of the current vistrail or None if it
+        doesn't have one
+        
+        """        
+        vistrailView = self.currentWidget()
+        if vistrailView and vistrailView.controller.name!='':
+            return vistrailView.controller.name
+        else:
+            return None
+
+    def setPIPMode(self, on):
+        """ setPIPMode(on: Bool) -> None
+        Set the picture-in-picture mode for all views
+        
+        """
+        self.pip_mode = on
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setPIPMode(on)
+
+    def setMethodsMode(self, on):
+        """ setMethodsMode(on: Bool) -> None
+        Turn the methods panel on/off for all views
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setMethodsMode(on)
+
+
+    def setSetMethodsMode(self, on):
+        """ setSetMethodsMode(on: Bool) -> None
+        Turn the set methods panel on/off for all views
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setSetMethodsMode(on)
+
+    def setPropertiesMode(self, on):
+        """ setPropertiesMode(on: Bool) -> None
+        Turn the properties panel on/off for all views
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setPropertiesMode(on)
+
+    def setPropertiesOverlayMode(self, on):
+        """ setPropertiesOverlayMode(on: Bool) -> None
+        Turn the properties overlay panel on/off for all views
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setPropertiesOverlayMode(on)
+            
+    def setModuleConfigMode(self, on):
+        """ setModuleConfigMode(on: Bool) -> None
+        Turn the module configuration panel on/off for all views
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setModuleConfigMode(on)
+            
+    def setVistrailVarsMode(self, on):
+        """ setVistrailVarsMode(on: Bool) -> None
+        Turn the vistrail variables panel on/off for all views
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            vistrailView.setVistrailVarsMode(on)
+            
+    def ensureVistrail(self, locator):
+        """ ensureVistrail(locator: VistrailLocator) -> QVistrailView        
+        This will first find among the opened vistrails to see if
+        vistrails from locator has been opened. If not, it will return None.
+        
+        """
+        for i in xrange(self.count()):
+            view = self.widget(i)
+            if view.controller.vistrail.locator == locator:
+                self.setCurrentWidget(view)
+                return view
+        return None
+    
+    def set_first_view(self, view):
+        self._first_view = view
+
+    def viewModeChanged(self, mode):
+        """ viewModeChanged(mode: int) -> None
+        
+        """
+        for viewIndex in xrange(self.count()):
+            vistrailView = self.widget(viewIndex)
+            if self.historyView!=None and mode>1:
+                vistrailView.viewModeChanged(mode-1)
+            else:
+                vistrailView.viewModeChanged(mode)
+    
+    def changeCursor(self, mode):
+        """ changeCursor(mode: Int) -> None
+        
+        """
+        for viewIndex in xrange(self.count()):            
+            vistrailView = self.widget(viewIndex)
+            vistrailView.updateCursorState(mode)            
+        
+    def resetQuery(self):
+        """ resetQwuery() -> None
+        
+        """
+        self.queryVistrail(False)
+
+    def queryVistrail(self, on=True):
+        """ queryVistrail(on: bool) -> None
+        
+        """
+        self.currentView().setFocus(QtCore.Qt.MouseFocusReason)
+        self.currentView().queryVistrail(on)
+
+    def executeCurrentPipeline(self):
+        """ executeCurrentPipeline() -> None
+        
+        """
+        self.currentView().setFocus(QtCore.Qt.MouseFocusReason)
+        self.currentView().checkModuleConfigPanel()
+        self.currentView().controller.execute_current_workflow()
+
+    def executeCurrentExploration(self):
+        """ executeCurrentExploration() -> None
+        
+        """
+        self.currentView().setFocus(QtCore.Qt.MouseFocusReason)
+        self.currentView().executeParameterExploration()
diff --git a/vistrails/gui/vis_diff.py b/vistrails/gui/vis_diff.py
new file mode 100644
index 0000000..c89c548
--- /dev/null
+++ b/vistrails/gui/vis_diff.py
@@ -0,0 +1,1277 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This modules builds a widget to interact with vistrail diff
+operation """
+from PyQt4 import QtCore, QtGui
+from vistrails.core.system import get_vistrails_basic_pkg_id
+from vistrails.core.utils.color import ColorByName
+from vistrails.core.vistrail.abstraction import Abstraction
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.vistrail_controller import VistrailController
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.core import system, debug
+import vistrails.core.db.io
+
+import copy
+from itertools import chain
+
+################################################################################
+
+class QFunctionItemModel(QtGui.QStandardItemModel):
+    """
+    QFunctionItemModel is a item model that will allow item to be
+    show as a disabled one on the table
+    
+    """
+    def __init__(self, row, col, parent=None):
+        """ QFunctionItemModel(row: int, col: int, parent: QWidget)
+                              -> QFunctionItemModel                             
+        Initialize with a number of rows and columns
+        
+        """
+        QtGui.QStandardItemModel.__init__(self, row, col, parent)
+        self.disabledRows = {}
+
+    def flags(self, index):
+        """ flags(index: QModelIndex) -> None
+        Return the current flags of the item with the index 'index'
+        
+        """
+        if index.isValid() and self.disabledRows.has_key(index.row()):
+            return (QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled |
+                    QtCore.Qt.ItemIsSelectable)
+        return QtGui.QStandardItemModel.flags(self,index)
+
+    def clearList(self):
+        """ clearList() -> None
+        Clear all items including the disabled ones
+        
+        """
+        self.disabledRows = {}
+        self.removeRows(0,self.rowCount())
+
+    def disableRow(self,row):
+        """ disableRow(row: int) -> None
+        Disable a specific row on the table
+        
+        """
+        self.disabledRows[row] = None
+
+class QParamTable(QtGui.QTableView):
+    """
+    QParamTable is a widget represents a diff between two version
+    as side-by-side comparisons
+    
+    """
+    def __init__(self, v1Name=None, v2Name=None, parent=None):
+        """ QParamTable(v1Name: str, v2Name: str, parent: QWidget)
+                       -> QParamTable
+        Initialize the table with two version names on the header view
+        
+        """
+        QtGui.QTableView.__init__(self, parent)
+        itemModel = QFunctionItemModel(0, 2, self)
+        itemModel.setHeaderData(0, QtCore.Qt.Horizontal, v1Name)
+        itemModel.setHeaderData(1, QtCore.Qt.Horizontal, v2Name)
+        # self.setHorizontalHeaderLabels([v1Name, v2Name])
+        self.setModel(itemModel)
+        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)        
+        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)        
+        self.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)        
+        self.setFont(CurrentTheme.VISUAL_DIFF_PARAMETER_FONT)
+        self.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
+        
+    def set_names(self, v1_name, v2_name):
+        self.model().setHeaderData(0, QtCore.Qt.Horizontal, v1_name)
+        self.model().setHeaderData(1, QtCore.Qt.Horizontal, v2_name)
+        # self.setHorizontalHeaderLabels([v1_name, v2_name])
+
+class QParamInspector(QtGui.QWidget):
+    """
+    QParamInspector is a widget acting as an inspector vistrail modules
+    in diff mode. It consists of a function inspector and annotation
+    inspector
+    
+    """
+    def __init__(self, v1Name='', v2Name='',
+                 parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QParamInspector(v1Name: str, v2Name: str,
+                            parent: QWidget, f: WindowFlags)
+                            -> QParamInspector
+        Construct a widget containing tabs: Functions and Annotations,
+        each of them is in turn a table of two columns for two
+        corresponding versions.
+        
+        """
+        QtGui.QWidget.__init__(self, parent, f | QtCore.Qt.Tool)
+        self.setWindowTitle('Parameter Inspector - None')
+        self.firstTime = True        
+        self.boxLayout = QtGui.QVBoxLayout()
+        self.boxLayout.setMargin(0)
+        self.boxLayout.setSpacing(0)
+        self.tabWidget = QtGui.QTabWidget()
+        self.tabWidget.setTabPosition(QtGui.QTabWidget.North)
+        self.tabWidget.setTabShape(QtGui.QTabWidget.Triangular)
+        self.functionsTab = QParamTable(v1Name, v2Name)
+        self.tabWidget.addTab(self.functionsTab, 'Functions')        
+# FIXME add annotation support back in
+#         self.annotationsTab = QParamTable(v1Name, v2Name)
+#         self.annotationsTab.horizontalHeader().setStretchLastSection(True)
+#         self.tabWidget.addTab(self.annotationsTab, 'Annotations')        
+        self.boxLayout.addWidget(self.tabWidget)
+        sizeGrip = QtGui.QSizeGrip(self)
+        self.boxLayout.addWidget(sizeGrip)
+        self.boxLayout.setAlignment(sizeGrip, QtCore.Qt.AlignRight)
+        self.setLayout(self.boxLayout)
+
+    def closeEvent(self, e):
+        """ closeEvent(e: QCloseEvent) -> None        
+        Doesn't allow the QParamInspector widget to close, but just hide
+        instead
+        
+        """
+        e.ignore()
+        self.parent().showInspectorAction.setChecked(False)
+        
+
+class QLegendBox(QtGui.QFrame):
+    """
+    QLegendBox is just a rectangular box with a solid color
+    
+    """
+    def __init__(self, brush, size, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QLegendBox(color: QBrush, size: (int,int), parent: QWidget,
+                      f: WindowFlags) -> QLegendBox
+        Initialize the widget with a color and fixed size
+        
+        """
+        QtGui.QFrame.__init__(self, parent, f)
+        self.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setAutoFillBackground(True)
+        palette = QtGui.QPalette(self.palette())
+        palette.setBrush(QtGui.QPalette.Window, brush)
+        self.setPalette(palette)
+        self.setFixedSize(*size)
+        if system.systemType in ['Darwin']:
+            #the mac's nice looking messes up with the colors
+            if QtCore.QT_VERSION < 0x40500:
+                self.setAttribute(QtCore.Qt.WA_MacMetalStyle, False)
+            else:
+                self.setAttribute(QtCore.Qt.WA_MacBrushedMetal, False)
+        
+
+class QLegendWindow(QtGui.QWidget):
+    """
+    QLegendWindow contains a list of QLegendBox and its description
+    
+    """
+    def __init__(self, v1Name='', v2Name='', parent=None,
+                 f=QtCore.Qt.WindowFlags()):
+        """ QLegendWindow(v1Name: str, v2Name: str,
+                          parent: QWidget, f: WindowFlags)
+                          -> QLegendWindow
+        Construct a window by default with 4 QLegendBox and 4 QLabels
+        
+        """
+        QtGui.QWidget.__init__(self, parent, f | QtCore.Qt.Tool)
+        self.setWindowTitle('Visual Diff Legend')
+        self.firstTime = True
+        self.gridLayout = QtGui.QGridLayout(self)
+        self.gridLayout.setMargin(10)
+        self.gridLayout.setSpacing(10)
+        self.setFont(CurrentTheme.VISUAL_DIFF_LEGEND_FONT)
+        
+        parent = self.parent()
+        
+        self.legendV1Box = QLegendBox(
+            CurrentTheme.VISUAL_DIFF_FROM_VERSION_BRUSH,
+            CurrentTheme.VISUAL_DIFF_LEGEND_SIZE,
+            self)        
+        self.gridLayout.addWidget(self.legendV1Box, 0, 0)
+        self.legendV1 = QtGui.QLabel(v1Name, self)
+        self.gridLayout.addWidget(self.legendV1, 0, 1)
+        
+        self.legendV2Box = QLegendBox(
+            CurrentTheme.VISUAL_DIFF_TO_VERSION_BRUSH,            
+            CurrentTheme.VISUAL_DIFF_LEGEND_SIZE,
+            self)        
+        self.gridLayout.addWidget(self.legendV2Box, 1, 0)
+        self.legendV2 = QtGui.QLabel(v2Name, self)
+        self.gridLayout.addWidget(self.legendV2, 1, 1)
+        
+        self.legendV12Box = QLegendBox(CurrentTheme.VISUAL_DIFF_SHARED_BRUSH,
+                                       CurrentTheme.VISUAL_DIFF_LEGEND_SIZE,
+                                       self)
+        self.gridLayout.addWidget(self.legendV12Box, 2, 0)
+        self.legendV12 = QtGui.QLabel("Shared", self)
+        self.gridLayout.addWidget(self.legendV12, 2, 1)
+        
+        self.legendParamBox = QLegendBox(
+            CurrentTheme.VISUAL_DIFF_PARAMETER_CHANGED_BRUSH,
+            CurrentTheme.VISUAL_DIFF_LEGEND_SIZE,
+            self)
+        self.gridLayout.addWidget(self.legendParamBox,3,0)
+        self.legendParam = QtGui.QLabel("Parameter Changes", self)
+        self.gridLayout.addWidget(self.legendParam,3,1)
+
+        # self.legendMatchedBox = \
+        #     QLegendBox(CurrentTheme.VISUAL_DIFF_MATCH_BRUSH,
+        #                CurrentTheme.VISUAL_DIFF_LEGEND_SIZE,
+        #                self)
+        # self.gridLayout.addWidget(self.legendMatchedBox, 4, 0)
+        # self.legendMatched = QtGui.QLabel("Matched", self)
+        # self.gridLayout.addWidget(self.legendMatched, 4, 1)
+
+        self.adjustSize()
+        
+    def set_names(self, v1_name, v2_name):
+        self.legendV1.setText(v1_name)
+        self.legendV2.setText(v2_name)
+
+    def closeEvent(self,e):
+        """ closeEvent(e: QCloseEvent) -> None
+        Doesn't allow the Legend widget to close, but just hide
+        instead
+        
+        """
+        e.ignore()
+        self.parent().showLegendsAction.setChecked(False)
+        
+class QDiffProperties(QtGui.QWidget, QVistrailsPaletteInterface):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.controller = None
+        self.set_title("Diff Properties")
+ 
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        self.legend = QLegendWindow()
+        legend_group = QtGui.QGroupBox("Legend")
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(0)
+        g_layout.setSpacing(0)
+        g_layout.addWidget(self.legend)
+        legend_group.setLayout(g_layout)
+        layout.addWidget(legend_group)
+
+        self.params = QParamTable()
+        params_group = QtGui.QGroupBox("Parameter Changes")
+        g_layout = QtGui.QVBoxLayout()
+        g_layout.setMargin(0)
+        g_layout.setSpacing(0)
+        g_layout.addWidget(self.params)
+        params_group.setLayout(g_layout)
+        layout.addWidget(params_group)
+        self.setLayout(layout)
+        self.addButtonsToToolbar()
+
+    def addButtonsToToolbar(self):
+        # Add the create analogy action
+        self.createAnalogyAction = QtGui.QAction(
+            CurrentTheme.VISUAL_DIFF_CREATE_ANALOGY_ICON,
+            'Create analogy', None, triggered=self.createAnalogy)
+        self.toolWindow().toolbar.insertAction(self.toolWindow().pinAction,
+                                               self.createAnalogyAction)
+        self.toolWindow().toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
+
+    def createAnalogy(self):
+        if not hasattr(self.controller, 'current_diff'):
+            return
+        ((vistrail_a, version_a), (vistrail_b, version_b)) = \
+            self.controller.current_diff_versions
+        # analogy only works on single vistrail
+        if not vistrail_a == vistrail_b:
+            return
+
+
+        default = 'from %s to %s' % (self.v1_name, self.v2_name)
+        (result, ok) = QtGui.QInputDialog.getText(None, "Enter Analogy Name",
+                                                  "Name of analogy:",
+                                                  QtGui.QLineEdit.Normal,
+                                                  default)
+        if not ok:
+            return
+        result = str(result)
+        try:
+            self.controller.add_analogy(result, version_a, version_b)
+        except:
+            debug.critical("Analogy name already exists")
+
+    def set_diff(self):
+        if not hasattr(self.controller, 'current_diff'):
+            return
+        ((vistrail_a, version_a), (vistrail_b, version_b)) = \
+            self.controller.current_diff_versions
+        (p1, p2, v1Andv2, heuristicMatch, v1Only, v2Only, paramChanged) = \
+            self.controller.current_diff
+
+        # Set up the version name correctly
+        v1_name = vistrail_a.getVersionName(version_a)
+        if not v1_name:
+            v1_name = 'Version %d' % version_a
+        v2_name = vistrail_b.getVersionName(version_b)
+        if not v2_name:
+            v2_name = 'Version %d' % version_b
+
+        # Add vistrail name if necessary
+        if id(vistrail_a) != id(vistrail_b):
+            if vistrail_a.locator is not None:
+                v1_name = "%s : %s" % (vistrail_a.locator.short_name, v1_name)
+            else:
+                v1_name = "Vistrail A : %s" % v1_name
+            if vistrail_b.locator is not None:
+                v2_name = "%s : %s" % (vistrail_b.locator.short_name, v2_name)
+            else:
+                v2_name = "Vistrail B : %s" % v2_name
+
+        self.v1_name, self.v2_name = v1_name, v2_name
+        
+        self.legend.set_names(v1_name, v2_name)
+        self.params.set_names(v1_name, v2_name)
+
+    def set_controller(self, controller=None):
+        self.controller = controller
+        self.set_diff()
+        
+    def update_module(self, module=None):
+        """ moduleSelected(id: int, selectedItems: [QGraphicsItem]) -> None
+        When the user click on a module, display its parameter changes
+        in the Inspector
+        
+        """
+        if module is None or not hasattr(self.controller, 'current_diff'):
+            self.params.model().clearList()
+            return
+        
+        # Interprete the diff result and setup item models
+        (p1, p2, v1Andv2, heuristicMatch, v1Only, v2Only, paramChanged) = \
+            self.controller.current_diff
+
+        # # Set the window title
+        # if id>self.maxId1:
+        #     self.inspector.setWindowTitle('Parameter Changes - %s' %
+        #                                   p2.modules[id-self.maxId1-1].name)
+        # else:
+        #     self.inspector.setWindowTitle('Parameter Changes - %s' %
+        #                                   p1.modules[id].name)
+
+        # FIXME set the module name/package info?
+            
+        # Clear the old inspector
+        param_model = self.params.model()
+        # annotations = self.inspector.annotationsTab.model()
+        param_model.clearList()
+        # annotations.clearList()
+
+        # Find the parameter changed module
+        matching = None
+        for ((m1id, m2id), paramMatching) in paramChanged:
+            if m1id == module.id:
+                #print "found match"
+                matching = paramMatching
+                break
+
+        #print "matching:", matching
+        # If the module has no parameter changed, just display nothing
+        if not matching:          
+            return
+        
+        # Else just layout the diff on a table
+        param_model.insertRows(0,len(matching))
+        currentRow = 0
+        for (f1, f2) in matching:
+            if f1[0]!=None:
+                param_model.setData(
+                    param_model.index(currentRow, 0),
+                    '%s(%s)' % (f1[0], ','.join(v[1] for v in f1[1])))
+            if f2[0]!=None:
+                param_model.setData(
+                    param_model.index(currentRow, 1),
+                    '%s(%s)' % (f2[0], ','.join(v[1] for v in f2[1])))
+            if f1==f2:
+                param_model.disableRow(currentRow)
+            currentRow += 1
+
+        self.params.resizeRowsToContents()
+        # self.inspector.annotationsTab.resizeRowsToContents()
+
+class QDiffView(QPipelineView):
+    def __init__(self, parent=None):
+        QPipelineView.__init__(self, parent)
+        self.set_title("Diff")
+        self.diff = None
+        self.diff_versions = None
+        self.controller = None
+        self.setReadOnlyMode(True)
+        
+    def set_action_links(self):
+        self.action_links = \
+            {'copy': ('module_changed', self.has_selected_modules),
+             'showGroup': ('module_changed', self.has_selected_group),
+             'configureModule': ('module_changed', self.has_selected_module),
+             'documentModule': ('module_changed', self.has_selected_module),
+             }
+            
+    def set_action_defaults(self):
+        self.action_defaults.update(
+            {'execute'    : [('setEnabled', False, False)],
+             'history'    : [('setEnabled', False, False)],
+             'search'     : [('setEnabled', False, False)],
+             'explore'    : [('setEnabled', False, False)],
+             'provenance' : [('setEnabled', False, False)],
+             'mashup'     : [('setEnabled', False, False)]
+             })
+            
+    def set_to_current(self):
+        self.controller.set_pipeline_view(self)
+        self.controller.current_diff = self.diff
+        self.controller.current_diff_versions = self.diff_versions
+
+    def set_default_layout(self):
+        from vistrails.gui.module_palette import QModulePalette
+        self.set_palette_layout(
+            {QtCore.Qt.LeftDockWidgetArea: QModulePalette,
+             QtCore.Qt.RightDockWidgetArea: QDiffProperties,
+             })
+        
+    def version_changed(self):
+        pass
+
+    def set_controller(self, controller):
+        self.controller = controller
+        self.scene().controller = controller
+
+    def get_long_title(self):
+        return self.long_title
+    
+    def set_diff_version_names(self):
+        ((vistrail_a, version_a), (vistrail_b, version_b)) = self.diff_versions
+        
+        # Set up the version name correctly
+        v1_name = vistrail_a.getVersionName(version_a)
+        if not v1_name:
+            v1_name = 'Version %d' % version_a
+        v2_name = vistrail_b.getVersionName(version_b)
+        if not v2_name:
+            v2_name = 'Version %d' % version_b
+
+        # Add vistrail name if necessary
+        if id(vistrail_a) != id(vistrail_b):
+            if vistrail_a.locator is not None:
+                v1_name = "%s : %s" % (vistrail_a.locator.short_name, v1_name)
+            else:
+                v1_name = "Vistrail A : %s" % v1_name
+            if vistrail_b.locator is not None:
+                v2_name = "%s : %s" % (vistrail_b.locator.short_name, v2_name)
+            else:
+                v2_name = "Vistrail B : %s" % v2_name
+            title = "Diff: %s x %s"%(v1_name, v2_name)
+        else:
+            title = "Diff: %s x %s from %s" % (v1_name, v2_name,
+                                               self.vistrail_view.get_name())
+        self.v1_name = v1_name
+        self.v2_name = v2_name
+        self.set_long_title(title)
+        
+    def set_diff(self, version_a, version_b, vistrail_b=None):
+        # Interprete the diff result
+        vistrail_a = self.controller.vistrail
+        if vistrail_b is None:
+            vistrail_b = self.controller.vistrail
+        self.diff_versions = ((vistrail_a, version_a), 
+                              (vistrail_b, version_b))
+        self.set_diff_version_names()
+        self.diff = vistrails.core.db.io.get_workflow_diff(*self.diff_versions)
+            # self.controller.vistrail.get_pipeline_diff(version_a, version_b)
+        (p1, p2, v1Andv2, heuristicMatch, v1Only, v2Only, paramChanged) = \
+            self.diff
+        # print "  $$$ v1Andv2:", v1Andv2
+        # print "  $$$ heuristicMatch:", heuristicMatch
+        # print "  $$$ v1Only", v1Only
+        # print "  $$$ v2Only", v2Only
+        # print "  $$$ paramChanged", paramChanged
+        p1.validate(False)
+        p2.validate(False)
+        p_both = Pipeline()
+        # the abstraction map is the same for both p1 and p2
+        # p_both.set_abstraction_map(p1.abstraction_map)
+        
+        scene = self.scene()
+        scene.clearItems()
+
+        basic_pkg = get_vistrails_basic_pkg_id()
+
+#         # FIXME HACK: We will create a dummy object that looks like a
+#         # controller so that the qgraphicsmoduleitems and the scene
+#         # are happy. It will simply store the pipeline will all
+#         # modules and connections of the diff, and know how to copy stuff
+#         class DummyController(object):
+#             def __init__(self, pip):
+#                 self.current_pipeline = pip
+#                 self.search = None
+#             def copy_modules_and_connections(self, module_ids, connection_ids):
+#                 """copy_modules_and_connections(module_ids: [long],
+#                                              connection_ids: [long]) -> str
+#                 Serializes a list of modules and connections
+#                 """
+
+#                 pipeline = Pipeline()
+# #                 pipeline.set_abstraction_map( \
+# #                     self.current_pipeline.abstraction_map)
+#                 for module_id in module_ids:
+#                     module = self.current_pipeline.modules[module_id]
+# #                     if module.vtType == Abstraction.vtType:
+# #                         abstraction = \
+# #                             pipeline.abstraction_map[module.abstraction_id]
+# #                         pipeline.add_abstraction(abstraction)
+#                     pipeline.add_module(module)
+#                 for connection_id in connection_ids:
+#                     connection = self.current_pipeline.connections[connection_id]
+#                     pipeline.add_connection(connection)
+#                 return core.db.io.serialize(pipeline)
+                
+#         controller = DummyController(p_both)
+#         scene.controller = controller
+
+        # Find the max version id from v1 and start the adding process
+        self.maxId1 = 0
+        for m1id in p1.modules.keys():
+            if m1id>self.maxId1:
+                self.maxId1 = m1id
+        shiftId = self.maxId1 + 1
+
+        # First add all shared modules, just use v1 module id
+        sum1_x = 0.0
+        sum1_y = 0.0
+        sum2_x = 0.0
+        sum2_y = 0.0
+        for (m1id, m2id) in chain(v1Andv2, heuristicMatch):
+        #     item = scene.addModule(p1.modules[m1id],
+        #                            CurrentTheme.VISUAL_DIFF_SHARED_BRUSH)
+        #     item.controller = self.controller
+        #     p_both.add_module(copy.copy(p1.modules[m1id]))
+        #     sum1_x += p1.modules[m1id].location.x
+        #     sum1_y += p1.modules[m1id].location.y
+        #     sum2_x += p2.modules[m2id].location.x
+        #     sum2_y += p2.modules[m2id].location.y
+        # for (m1id, m2id) in heuristicMatch:
+            m1 = p1.modules[m1id]
+            m2 = p2.modules[m2id]
+
+            sum1_x += p1.modules[m1id].location.x
+            sum1_y += p1.modules[m1id].location.y
+            sum2_x += p2.modules[m2id].location.x
+            sum2_y += p2.modules[m2id].location.y            
+
+            #this is a hack for modules with a dynamic local registry.
+            #The problem arises when modules have the same name but different
+            #input/output ports. We just make sure that the module we add to
+            # the canvas has the ports from both modules, so we don't have
+            # addconnection errors.
+            port_specs = dict(((p.type, p.name), p) for p in m1.port_spec_list)
+            for p in m2.port_spec_list:
+                p_key = (p.type, p.name)
+                if not p_key in port_specs:
+                    m1.add_port_spec(p)
+                elif port_specs[p_key] != p:
+                    #if we add this port, we will get port overloading.
+                    #To avoid this, just cast the current port to be of
+                    # Module or Variant type.
+                    old_port_spec = port_specs[p_key]
+                    m1.delete_port_spec(old_port_spec)
+                    if old_port_spec.type == 'input':
+                        m_sig = '(%s:Module)' % basic_pkg
+                    else:
+                        m_sig = '(%s:Variant)' % basic_pkg
+                    new_port_spec = PortSpec(id=old_port_spec.id,
+                                             name=old_port_spec.name,
+                                             type=old_port_spec.type,
+                                             sigstring=m_sig)
+                    m1.add_port_spec(new_port_spec)
+
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_SHARED_BRUSH)
+            # item = scene.addModule(p1.modules[m1id],
+            #                        CurrentTheme.VISUAL_DIFF_MATCH_BRUSH)
+            item.controller = self.controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+
+        # Then add parameter changed version
+        for ((m1id, m2id), matching) in paramChanged:
+            m1 = p1.modules[m1id]
+            m2 = p2.modules[m2id]
+            
+            sum1_x += p1.modules[m1id].location.x
+            sum1_y += p1.modules[m1id].location.y
+            sum2_x += p2.modules[m2id].location.x
+            sum2_y += p2.modules[m2id].location.y
+
+            #this is a hack for modules with a dynamic local registry.
+            #The problem arises when modules have the same name but different
+            #input/output ports. We just make sure that the module we add to
+            # the canvas has the ports from both modules, so we don't have
+            # addconnection errors.
+            port_specs = dict(((p.type, p.name), p) for p in m1.port_spec_list)
+            for p in m2.port_spec_list:
+                p_key = (p.type, p.name)
+                if not p_key in port_specs:
+                    m1.add_port_spec(p)
+                elif port_specs[p_key] != p:
+                    #if we add this port, we will get port overloading.
+                    #To avoid this, just cast the current port to be of
+                    # Module or Variant type.
+                    old_port_spec = port_specs[p_key]
+                    m1.delete_port_spec(old_port_spec)
+                    if old_port_spec.type == 'input':
+                        m_sig = '(%s:Module)' % basic_pkg
+                    else:
+                        m_sig = '(%s:Variant)' % basic_pkg
+                    new_port_spec = PortSpec(id=old_port_spec.id,
+                                             name=old_port_spec.name,
+                                             type=old_port_spec.type,
+                                             sigstring=m_sig)
+                    m1.add_port_spec(new_port_spec)
+                            
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_PARAMETER_CHANGED_BRUSH)
+            item.controller = self.controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+
+        total_len = len(v1Andv2) + + len(heuristicMatch) + len(paramChanged)
+        if total_len != 0:
+            avg1_x = sum1_x / total_len
+            avg1_y = sum1_y / total_len
+            avg2_x = sum2_x / total_len
+            avg2_y = sum2_y / total_len
+        else:
+            avg1_x = 0.0
+            avg1_y = 0.0
+            avg2_x = 0.0
+            avg2_y = 0.0
+#         avg1_x = sum1_x / total_len if total_len != 0 else 0.0
+#         avg1_y = sum1_y / total_len if total_len != 0 else 0.0
+#         avg2_x = sum2_x / total_len if total_len != 0 else 0.0
+#         avg2_y = sum2_y / total_len if total_len != 0 else 0.0
+
+        # Now add the ones only applicable for v1, still using v1 ids
+        for m1id in v1Only:
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_FROM_VERSION_BRUSH)
+            item.controller = self.controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+
+        # Now add the ones for v2 only but must shift the ids away from v1
+        for m2id in v2Only:
+            p2_module = copy.copy(p2.modules[m2id])
+            p2_module.id = m2id + shiftId
+            # p2.modules[m2id].id = m2id + shiftId
+            p2_module.location.x -= avg2_x - avg1_x
+            p2_module.location.y -= avg2_y - avg1_y
+            item = scene.addModule(p2_module, #p2.modules[m2id],
+                                   CurrentTheme.VISUAL_DIFF_TO_VERSION_BRUSH)
+            item.controller = self.controller
+            # p_both.add_module(copy.copy(p2.modules[m2id]))
+            p_both.add_module(p2_module)
+            
+
+        # Create a mapping between share modules between v1 and v2
+        v1Tov2 = {}
+        v2Tov1 = {}
+        for (m1id, m2id) in v1Andv2:
+            v1Tov2[m1id] = m2id
+            v2Tov1[m2id] = m1id
+        for (m1id, m2id) in heuristicMatch:
+            v1Tov2[m1id] = m2id
+            v2Tov1[m2id] = m1id
+        for ((m1id, m2id), matching) in paramChanged:
+            v1Tov2[m1id] = m2id
+            v2Tov1[m2id] = m1id
+
+        # Next we're going to add connections, only connections of
+        # v2Only need to shift their ids
+        if p1.connections.keys():
+            connectionShift = max(p1.connections.keys())+1
+        else:
+            connectionShift = 0
+        allConnections = copy.copy(p1.connections)
+        sharedConnections = []
+        v2OnlyConnections = []        
+        for (cid2, connection2) in copy.copy(p2.connections.items()):
+            if connection2.sourceId in v2Only:
+                connection2.sourceId += shiftId
+            else:
+                connection2.sourceId = v2Tov1[connection2.sourceId]
+                
+            if connection2.destinationId in v2Only:
+                connection2.destinationId += shiftId
+            else:
+                connection2.destinationId = v2Tov1[connection2.destinationId]
+
+            # Is this connection also shared by p1?
+            shared = False
+            for (cid1, connection1) in p1.connections.items():
+                if (connection1.sourceId==connection2.sourceId and
+                    connection1.destinationId==connection2.destinationId and
+                    connection1.source.name==connection2.source.name and
+                    connection1.destination.name==connection2.destination.name):
+                    sharedConnections.append(cid1)
+                    shared = True
+                    break
+            if not shared:
+                allConnections[cid2+connectionShift] = connection2
+                connection2.id = cid2+connectionShift
+                v2OnlyConnections.append(cid2+connectionShift)
+
+        connectionItems = []
+        for c in allConnections.values():
+            p_both.add_connection(copy.copy(c))
+            connectionItems.append(scene.addConnection(c))
+
+        # Color Code connections
+        for c in connectionItems:
+            if c.id in sharedConnections:
+                pass
+            elif c.id in v2OnlyConnections:
+                pen = QtGui.QPen(CurrentTheme.CONNECTION_PEN)
+                pen.setBrush(CurrentTheme.VISUAL_DIFF_TO_VERSION_BRUSH)
+                c.connectionPen = pen
+            else:
+                pen = QtGui.QPen(CurrentTheme.CONNECTION_PEN)
+                pen.setBrush(CurrentTheme.VISUAL_DIFF_FROM_VERSION_BRUSH)
+                c.connectionPen = pen
+
+       
+        scene.current_pipeline = p_both
+
+        scene.updateSceneBoundingRect()
+        scene.fitToView(self, True)
+
+class QVisualDiff(QtGui.QMainWindow):
+    """
+    QVisualDiff is a main widget for Visual Diff containing a GL
+    Widget to draw the pipeline
+    
+    """
+    def __init__(self, vistrail, v1, v2,
+                 controller,
+                 parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVisualDiff(vistrail: Vistrail, v1: str, v2: str,
+                        parent: QWidget, f: WindowFlags) -> QVisualDiff
+        Initialize with all
+        
+        """
+        # Set up the version name correctly
+        v1Name = vistrail.getVersionName(v1)
+        if not v1Name: v1Name = 'Version %d' % v1
+        v2Name = vistrail.getVersionName(v2)        
+        if not v2Name: v2Name = 'Version %d' % v2
+        
+        # Actually perform the diff and store its result
+        self.diff = vistrail.get_pipeline_diff(v1, v2)
+
+        self.v1_name = v1Name
+        self.v2_name = v2Name
+        self.v1 = v1
+        self.v2 = v2
+        self.controller = controller
+
+        # Create the top-level Visual Diff window
+        windowDecors = f | QtCore.Qt.Dialog |QtCore.Qt.WindowMaximizeButtonHint
+        QtGui.QMainWindow.__init__(self, parent)
+        self.setWindowTitle('Visual Diff - from %s to %s' % (v1Name, v2Name))
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.createPipelineView()
+        self.createToolBar()
+        self.createToolWindows(v1Name, v2Name)
+
+        self.installEventFilter(self)
+
+    def eventFilter(self, object, event):
+        if event.type() == QtCore.QEvent.ShortcutOverride and \
+                event.key() == QtCore.Qt.Key_W and \
+                event.modifiers() == QtCore.Qt.ControlModifier:
+            event.accept()
+            self.close()
+        return QtGui.QMainWindow.eventFilter(self, object, event)
+
+    def closeEvent(self, event):
+        self.inspector.close()
+        self.legendWindow.close()
+
+    def createPipelineView(self):
+        """ createPipelineView() -> None        
+        Create a center pipeline view for Visual Diff and setup the
+        view based on the diff result self.diff
+        
+        """
+        # Initialize the shape engine
+        self.pipelineView = QPipelineView()
+        self.setCentralWidget(self.pipelineView)
+
+        # Add all the shapes into the view
+        self.createDiffPipeline()
+
+        # Hook shape selecting functions
+        self.connect(self.pipelineView.scene(), QtCore.SIGNAL("moduleSelected"),
+                     self.moduleSelected)
+
+    def createToolBar(self):
+        """ createToolBar() -> None        
+        Create the default toolbar of Visual Diff window with two
+        buttons to toggle the Parameter Inspector and Legend window
+        
+        """
+        # Initialize the Visual Diff toolbar
+        self.toolBar = self.addToolBar('Visual Diff Toolbar')
+        self.toolBar.setMovable(False)
+
+        # Add the Show Parameter Inspector action
+        self.showInspectorAction = self.toolBar.addAction(
+            CurrentTheme.VISUAL_DIFF_SHOW_PARAM_ICON,
+            'Show Parameter Inspector window')
+        self.showInspectorAction.setCheckable(True)
+        self.connect(self.showInspectorAction, QtCore.SIGNAL("toggled(bool)"),
+                     self.toggleShowInspector)
+        
+        # Add the Show Legend window action
+        self.showLegendsAction = self.toolBar.addAction(
+            CurrentTheme.VISUAL_DIFF_SHOW_LEGEND_ICON,
+            'Show Legends')
+        self.showLegendsAction.setCheckable(True)
+        self.connect(self.showLegendsAction, QtCore.SIGNAL("toggled(bool)"),
+                     self.toggleShowLegend)
+
+        # Add the create analogy action
+        self.createAnalogyAction = self.toolBar.addAction(
+            CurrentTheme.VISUAL_DIFF_CREATE_ANALOGY_ICON,
+            'Create analogy')
+        self.connect(self.createAnalogyAction, QtCore.SIGNAL("triggered()"),
+                     self.createAnalogy)
+
+    def createAnalogy(self):
+        default = 'from %s to %s' % (self.v1_name, self.v2_name)
+        (result, ok) = QtGui.QInputDialog.getText(None, "Enter Analogy Name",
+                                                  "Name of analogy:",
+                                                  QtGui.QLineEdit.Normal,
+                                                  default)
+        if not ok:
+            return
+        result = str(result)
+        try:
+            self.controller.add_analogy(result, self.v1, self.v2)
+        except:
+            debug.critical("Analogy name already exists")
+        
+    def createToolWindows(self, v1Name, v2Name):
+        """ createToolWindows(v1Name: str, v2Name: str) -> None
+        Create Inspector and Legend window
+
+        """
+        self.inspector = QParamInspector(v1Name, v2Name, self)
+        self.inspector.resize(QtCore.QSize(
+            *CurrentTheme.VISUAL_DIFF_PARAMETER_WINDOW_SIZE))
+        self.legendWindow = QLegendWindow(v1Name, v2Name,self)
+
+    def moduleSelected(self, id, selectedItems):
+        """ moduleSelected(id: int, selectedItems: [QGraphicsItem]) -> None
+        When the user click on a module, display its parameter changes
+        in the Inspector
+        
+        """
+        if len(selectedItems)!=1 or id==-1:
+            self.moduleUnselected()
+            return
+        
+        # Interprete the diff result and setup item models
+        (p1, p2, v1Andv2, heuristicMatch, v1Only, v2Only, paramChanged) = \
+            self.diff
+
+        # Set the window title
+        if id>self.maxId1:
+            self.inspector.setWindowTitle('Parameter Changes - %s' %
+                                          p2.modules[id-self.maxId1-1].name)
+        else:
+            self.inspector.setWindowTitle('Parameter Changes - %s' %
+                                          p1.modules[id].name)
+            
+        # Clear the old inspector
+        functions = self.inspector.functionsTab.model()
+#         annotations = self.inspector.annotationsTab.model()
+        functions.clearList()
+#         annotations.clearList()
+
+        # Find the parameter changed module
+        matching = None
+        for ((m1id, m2id), paramMatching) in paramChanged:
+            if m1id==id:
+                matching = paramMatching
+                break
+
+        # If the module has no parameter changed, just display nothing
+        if not matching:          
+            return
+        
+        # Else just layout the diff on a table
+        functions.insertRows(0,len(matching))
+        currentRow = 0
+        for (f1, f2) in matching:
+            if f1[0]!=None:
+                functions.setData(
+                    functions.index(currentRow, 0),
+                    '%s(%s)' % (f1[0], ','.join(v[1] for v in f1[1])))
+            if f2[0]!=None:
+                functions.setData(
+                    functions.index(currentRow, 1),
+                    '%s(%s)' % (f2[0], ','.join(v[1] for v in f2[1])))
+            if f1==f2:                
+                functions.disableRow(currentRow)
+            currentRow += 1
+
+        self.inspector.functionsTab.resizeRowsToContents()
+#         self.inspector.annotationsTab.resizeRowsToContents()
+
+    def moduleUnselected(self):
+        """ moduleUnselected() -> None
+        When a user selects nothing, make sure to display nothing as well
+        
+        """
+#         self.inspector.annotationsTab.model().clearList()
+        self.inspector.functionsTab.model().clearList()
+        self.inspector.setWindowTitle('Parameter Changes - None')
+
+    def toggleShowInspector(self):
+        """ toggleShowInspector() -> None
+        Show/Hide the inspector when toggle this button
+        
+        """
+        if self.inspector.firstTime:
+            max_geom = QtGui.QApplication.desktop().screenGeometry(self)
+            if (self.frameSize().width() <
+                max_geom.width() - self.inspector.width()):
+                self.inspector.move(self.pos().x()+self.frameSize().width(),
+                                    self.pos().y())
+            else:
+                self.inspector.move(self.pos().x()+self.frameSize().width()-
+                                   self.inspector.frameSize().width(),
+                                   self.pos().y() +
+                                    self.legendWindow.frameSize().height())
+            self.inspector.firstTime = False
+        self.inspector.setVisible(self.showInspectorAction.isChecked())
+            
+    def toggleShowLegend(self):
+        """ toggleShowLegend() -> None
+        Show/Hide the legend window when toggle this button
+        
+        """
+        if self.legendWindow.firstTime:
+            self.legendWindow.move(self.pos().x()+self.frameSize().width()-
+                                   self.legendWindow.frameSize().width(),
+                                   self.pos().y())
+        self.legendWindow.setVisible(self.showLegendsAction.isChecked())
+        if self.legendWindow.firstTime:
+            self.legendWindow.firstTime = False
+            self.legendWindow.setFixedSize(self.legendWindow.size())            
+                
+    def createDiffPipeline(self):
+        """ createDiffPipeline() -> None        
+        Actually walk through the self.diff result and add all modules
+        into the pipeline view
+        
+        """
+
+        # Interprete the diff result
+        (p1, p2, v1Andv2, heuristicMatch, v1Only, v2Only, paramChanged) = \
+            self.diff
+        self.controller.validate(p1, False)
+        self.controller.validate(p2, False)
+        p_both = Pipeline()
+        # the abstraction map is the same for both p1 and p2
+        # p_both.set_abstraction_map(p1.abstraction_map)
+        
+        scene = self.pipelineView.scene()
+        scene.clearItems()
+
+        basic_pkg = get_vistrails_basic_pkg_id()
+
+        # FIXME HACK: We will create a dummy object that looks like a
+        # controller so that the qgraphicsmoduleitems and the scene
+        # are happy. It will simply store the pipeline will all
+        # modules and connections of the diff, and know how to copy stuff
+        class DummyController(object):
+            def __init__(self, pip):
+                self.current_pipeline = pip
+                self.search = None
+            def copy_modules_and_connections(self, module_ids, connection_ids):
+                """copy_modules_and_connections(module_ids: [long],
+                                             connection_ids: [long]) -> str
+                Serializes a list of modules and connections
+                """
+
+                pipeline = Pipeline()
+#                 pipeline.set_abstraction_map( \
+#                     self.current_pipeline.abstraction_map)
+                for module_id in module_ids:
+                    module = self.current_pipeline.modules[module_id]
+#                     if module.vtType == Abstraction.vtType:
+#                         abstraction = \
+#                             pipeline.abstraction_map[module.abstraction_id]
+#                         pipeline.add_abstraction(abstraction)
+                    pipeline.add_module(module)
+                for connection_id in connection_ids:
+                    connection = self.current_pipeline.connections[connection_id]
+                    pipeline.add_connection(connection)
+                return vistrails.core.db.io.serialize(pipeline)
+                
+        controller = DummyController(p_both)
+        scene.controller = controller
+
+        # Find the max version id from v1 and start the adding process
+        self.maxId1 = 0
+        for m1id in p1.modules.keys():
+            if m1id>self.maxId1:
+                self.maxId1 = m1id
+        shiftId = self.maxId1 + 1
+
+        # First add all shared modules, just use v1 module id
+        sum1_x = 0.0
+        sum1_y = 0.0
+        sum2_x = 0.0
+        sum2_y = 0.0
+        for (m1id, m2id) in v1Andv2:
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_SHARED_BRUSH)
+            item.controller = controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+            sum1_x += p1.modules[m1id].location.x
+            sum1_y += p1.modules[m1id].location.y
+            sum2_x += p2.modules[m2id].location.x
+            sum2_y += p2.modules[m2id].location.y
+        for (m1id, m2id) in heuristicMatch:
+            m1 = p1.modules[m1id]
+            m2 = p2.modules[m2id]
+
+            sum1_x += p1.modules[m1id].location.x
+            sum1_y += p1.modules[m1id].location.y
+            sum2_x += p2.modules[m2id].location.x
+            sum2_y += p2.modules[m2id].location.y            
+
+            #this is a hack for modules with a dynamic local registry.
+            #The problem arises when modules have the same name but different
+            #input/output ports. We just make sure that the module we add to
+            # the canvas has the ports from both modules, so we don't have
+            # addconnection errors.
+            port_specs = dict(((p.type, p.name), p) for p in m1.port_spec_list)
+            for p in m2.port_spec_list:
+                p_key = (p.type, p.name)
+                if not p_key in port_specs:
+                    m1.add_port_spec(p)
+                elif port_specs[p_key] != p:
+                    #if we add this port, we will get port overloading.
+                    #To avoid this, just cast the current port to be of
+                    # Module or Variant type.
+                    old_port_spec = port_specs[p_key]
+                    m1.delete_port_spec(old_port_spec)
+                    if old_port_spec.type == 'input':
+                        m_sig = '(%s:Module)' % basic_pkg
+                    else:
+                        m_sig = '(%s:Variant)' % basic_pkg
+                    new_port_spec = PortSpec(id=old_port_spec.id,
+                                             name=old_port_spec.name,
+                                             type=old_port_spec.type,
+                                             sigstring=m_sig)
+                    m1.add_port_spec(new_port_spec)
+
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_MATCH_BRUSH)
+            item.controller = controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+
+        # Then add parameter changed version
+        for ((m1id, m2id), matching) in paramChanged:
+            m1 = p1.modules[m1id]
+            m2 = p2.modules[m2id]
+            
+            sum1_x += p1.modules[m1id].location.x
+            sum1_y += p1.modules[m1id].location.y
+            sum2_x += p2.modules[m2id].location.x
+            sum2_y += p2.modules[m2id].location.y
+
+            #this is a hack for modules with a dynamic local registry.
+            #The problem arises when modules have the same name but different
+            #input/output ports. We just make sure that the module we add to
+            # the canvas has the ports from both modules, so we don't have
+            # addconnection errors.
+            port_specs = dict(((p.type, p.name), p) for p in m1.port_spec_list)
+            for p in m2.port_spec_list:
+                p_key = (p.type, p.name)
+                if not p_key in port_specs:
+                    m1.add_port_spec(p)
+                elif port_specs[p_key] != p:
+                    #if we add this port, we will get port overloading.
+                    #To avoid this, just cast the current port to be of
+                    # Module or Variant type.
+                    old_port_spec = port_specs[p_key]
+                    m1.delete_port_spec(old_port_spec)
+                    if old_port_spec.type == 'input':
+                        m_sig = '(%s:Module)' % basic_pkg
+                    else:
+                        m_sig = '(%s:Variant)' % basic_pkg
+                    new_port_spec = PortSpec(id=old_port_spec.id,
+                                             name=old_port_spec.name,
+                                             type=old_port_spec.type,
+                                             sigstring=m_sig)
+                    m1.add_port_spec(new_port_spec)
+
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_PARAMETER_CHANGED_BRUSH)
+            item.controller = controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+
+        total_len = len(v1Andv2) + + len(heuristicMatch) + len(paramChanged)
+        if total_len != 0:
+            avg1_x = sum1_x / total_len
+            avg1_y = sum1_y / total_len
+            avg2_x = sum2_x / total_len
+            avg2_y = sum2_y / total_len
+        else:
+            avg1_x = 0.0
+            avg1_y = 0.0
+            avg2_x = 0.0
+            avg2_y = 0.0
+#         avg1_x = sum1_x / total_len if total_len != 0 else 0.0
+#         avg1_y = sum1_y / total_len if total_len != 0 else 0.0
+#         avg2_x = sum2_x / total_len if total_len != 0 else 0.0
+#         avg2_y = sum2_y / total_len if total_len != 0 else 0.0
+
+        # Now add the ones only applicable for v1, still using v1 ids
+        for m1id in v1Only:
+            item = scene.addModule(p1.modules[m1id],
+                                   CurrentTheme.VISUAL_DIFF_FROM_VERSION_BRUSH)
+            item.controller = controller
+            p_both.add_module(copy.copy(p1.modules[m1id]))
+
+        # Now add the ones for v2 only but must shift the ids away from v1
+        for m2id in v2Only:
+            p2_module = copy.copy(p2.modules[m2id])
+            p2_module.id = m2id + shiftId
+            # p2.modules[m2id].id = m2id + shiftId
+            p2_module.location.x -= avg2_x - avg1_x
+            p2_module.location.y -= avg2_y - avg1_y
+            item = scene.addModule(p2_module, #p2.modules[m2id],
+                                   CurrentTheme.VISUAL_DIFF_TO_VERSION_BRUSH)
+            item.controller = controller
+            # p_both.add_module(copy.copy(p2.modules[m2id]))
+            p_both.add_module(p2_module)
+            
+
+        # Create a mapping between share modules between v1 and v2
+        v1Tov2 = {}
+        v2Tov1 = {}
+        for (m1id, m2id) in v1Andv2:
+            v1Tov2[m1id] = m2id
+            v2Tov1[m2id] = m1id
+        for (m1id, m2id) in heuristicMatch:
+            v1Tov2[m1id] = m2id
+            v2Tov1[m2id] = m1id
+        for ((m1id, m2id), matching) in paramChanged:
+            v1Tov2[m1id] = m2id
+            v2Tov1[m2id] = m1id
+
+        # Next we're going to add connections, only connections of
+        # v2Only need to shift their ids
+        if p1.connections.keys():
+            connectionShift = max(p1.connections.keys())+1
+        else:
+            connectionShift = 0
+        allConnections = copy.copy(p1.connections)
+        sharedConnections = []
+        v2OnlyConnections = []        
+        for (cid2, connection2) in copy.copy(p2.connections.items()):
+            if connection2.sourceId in v2Only:
+                connection2.sourceId += shiftId
+            else:
+                connection2.sourceId = v2Tov1[connection2.sourceId]
+                
+            if connection2.destinationId in v2Only:
+                connection2.destinationId += shiftId
+            else:
+                connection2.destinationId = v2Tov1[connection2.destinationId]
+
+            # Is this connection also shared by p1?
+            shared = False
+            for (cid1, connection1) in p1.connections.items():
+                if (connection1.sourceId==connection2.sourceId and
+                    connection1.destinationId==connection2.destinationId and
+                    connection1.source.name==connection2.source.name and
+                    connection1.destination.name==connection2.destination.name):
+                    sharedConnections.append(cid1)
+                    shared = True
+                    break
+            if not shared:
+                allConnections[cid2+connectionShift] = connection2
+                connection2.id = cid2+connectionShift
+                v2OnlyConnections.append(cid2+connectionShift)
+
+        connectionItems = []
+        for c in allConnections.values():
+            p_both.add_connection(copy.copy(c))
+            connectionItems.append(scene.addConnection(c))
+
+        # Color Code connections
+        for c in connectionItems:
+            if c.id in sharedConnections:
+                pass
+            elif c.id in v2OnlyConnections:
+                pen = QtGui.QPen(CurrentTheme.CONNECTION_PEN)
+                pen.setBrush(CurrentTheme.VISUAL_DIFF_TO_VERSION_BRUSH)
+                c.connectionPen = pen
+            else:
+                pen = QtGui.QPen(CurrentTheme.CONNECTION_PEN)
+                pen.setBrush(CurrentTheme.VISUAL_DIFF_FROM_VERSION_BRUSH)
+                c.connectionPen = pen
+
+       
+
+        scene.updateSceneBoundingRect()
+        scene.fitToView(self.pipelineView, True)
diff --git a/vistrails/gui/vistrail_controller.py b/vistrails/gui/vistrail_controller.py
new file mode 100644
index 0000000..c670e3d
--- /dev/null
+++ b/vistrails/gui/vistrail_controller.py
@@ -0,0 +1,1558 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.common import *
+from vistrails.core.configuration import get_vistrails_configuration
+from vistrails.core import debug
+import vistrails.core.db.action
+import vistrails.core.db.locator
+import vistrails.core.modules.vistrails_module
+from vistrails.core.utils import VistrailsInternalError, InvalidPipeline
+from vistrails.core.layout.version_tree_layout import VistrailsTreeLayoutLW
+from vistrails.core.log.opm_graph import OpmGraph
+from vistrails.core.log.prov_document import ProvDocument
+from vistrails.core.modules.abstraction import identifier as abstraction_pkg
+from vistrails.core.modules.module_registry import get_module_registry, MissingPort
+from vistrails.core.modules.package import Package
+from vistrails.core.packagemanager import PackageManager
+from vistrails.core.query.version import TrueSearch
+from vistrails.core.query.visual import VisualQuery
+from vistrails.core.param_explore import ActionBasedParameterExploration
+import vistrails.core.system
+
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.controller import VistrailController as BaseController, \
+    vt_action
+from vistrails.core.vistrail.location import Location
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.port_spec import PortSpec
+from vistrails.core.vistrail.vistrail import Vistrail, TagExists
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import show_warning, show_question, YES_BUTTON, NO_BUTTON
+from vistrails.gui.version_prop import QVersionProp
+
+import vistrails.core.analogy
+import copy
+import os.path
+import math
+
+import unittest
+import vistrails.gui.utils
+import vistrails.api
+import os
+from vistrails.core.utils import DummyView
+
+################################################################################
+
+class VistrailController(QtCore.QObject, BaseController):
+    """
+    VistrailController is the class handling all action control in
+    VisTrails. It updates pipeline, vistrail and emit signals to
+    update the view
+
+    Signals emitted:
+
+    vistrailChanged(): emitted when the version tree needs to be
+    recreated (for example, a node was added/deleted or the layout
+    changed).
+
+    versionWasChanged(): emitted when the current version (the one
+    being displayed by the pipeline view) has changed.
+
+    searchChanged(): emitted when the search statement from the
+    version view has changed.
+
+    stateChanged(): stateChanged is called when a vistrail goes from
+    unsaved to saved or vice-versa.
+    
+    notesChanged(): notesChanged is called when the version notes have
+    been updated
+
+    """
+
+    def __init__(self, vistrail=None, locator=None, abstractions=None,
+                 thumbnails=None, mashups=None, pipeline_view=None, 
+                 id_scope=None, set_log_on_vt=True, auto_save=True, name=''):
+        """ VistrailController(vistrail: Vistrail, 
+                               locator: BaseLocator,
+                               abstractions: [<filename strings>],
+                               thumbnails: [<filename strings>],
+                               mashups: [<filename strings>],
+                               pipeline_view: QPipelineView
+                               id_scope: IdScope,
+                               set_log_on_vt: bool,
+                               auto_save: bool, 
+                               name: str) -> VistrailController
+        Create a controller for a vistrail.
+
+        """
+
+        QtCore.QObject.__init__(self)
+
+        if pipeline_view is None:
+            self.current_pipeline_view = QPipelineView()
+        else:
+            self.current_pipeline_view = pipeline_view
+
+        self.vistrail_view = None
+        self.reset_pipeline_view = False
+        self.reset_version_view = True
+        self.quiet = False
+        
+        self.analogy = {}
+        # if self._auto_save is True, an auto_saving timer will save a temporary
+        # file every 2 minutes
+        self._auto_save = auto_save
+        self.timer = None
+        if self._auto_save:
+            self.setup_timer()
+        
+        self._previous_graph_layout = None
+
+        def width_f(text):
+            return CurrentTheme.VERSION_FONT_METRIC.width(text)
+        self._current_graph_layout = \
+            VistrailsTreeLayoutLW(width_f, 
+                                  CurrentTheme.VERSION_FONT_METRIC.height(), 
+                                  CurrentTheme.VERSION_LABEL_MARGIN[0], 
+                                  CurrentTheme.VERSION_LABEL_MARGIN[1])
+        self.animate_layout = False
+        #this was moved to BaseController
+        #self.num_versions_always_shown = 1
+        BaseController.__init__(self, vistrail, locator, abstractions, 
+                                thumbnails, mashups, id_scope, set_log_on_vt, 
+                                auto_save)
+
+    def _get_current_pipeline_scene(self):
+        return self.current_pipeline_view.scene()
+    current_pipeline_scene = property(_get_current_pipeline_scene)
+
+    # just need to switch current_pipeline_view to update controller to
+    # new version and pipeline...
+    def _get_current_version(self):
+        if self.current_pipeline_view is None:
+            return -1
+        return self.current_pipeline_view.scene().current_version
+    def _set_current_version(self, version):
+        # print "set_current_version:", version, id(self.current_pipeline_view)
+        if self.current_pipeline_view is not None:
+            self.current_pipeline_view.scene().current_version = version
+    current_version = property(_get_current_version, _set_current_version)
+
+    def _get_current_pipeline(self):
+        if self.current_pipeline_view is None:
+            return None
+        return self.current_pipeline_view.scene().current_pipeline
+    def _set_current_pipeline(self, pipeline):
+        if self.current_pipeline_view is not None:
+            self.current_pipeline_view.scene().current_pipeline = pipeline
+    current_pipeline = property(_get_current_pipeline, _set_current_pipeline)
+
+    def set_pipeline_view(self, pipeline_view):
+        if self.current_pipeline_view is not None:
+            self.disconnect(self, QtCore.SIGNAL('versionWasChanged'),
+                            self.current_pipeline_view.version_changed)
+        self.current_pipeline_view = pipeline_view
+        self.connect(self, QtCore.SIGNAL('versionWasChanged'),
+                     self.current_pipeline_view.version_changed)
+    
+    def setup_timer(self):
+        self.timer = QtCore.QTimer(self)
+        self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.write_temporary)
+        self.timer.start(1000 * 60 * 2) # Save every two minutes
+        
+    def stop_timer(self):
+        if self.timer:
+            self.disconnect(self.timer, QtCore.SIGNAL("timeout()"), self.write_temporary)
+            self.timer.stop()
+            
+    ##########################################################################
+    # Signal vistrail relayout / redraw
+
+    def replace_unnamed_node_in_version_tree(self, old_version, new_version):
+        """method analogous to invalidate_version_tree but when only
+        a single unnamed node and links need to be updated. Much faster."""
+        self.reset_version_view = False
+        try:
+            self.emit(QtCore.SIGNAL('invalidateSingleNodeInVersionTree'),
+                                    old_version, new_version)
+        finally:
+            self.reset_version_view = True
+
+    def invalidate_version_tree(self, reset_version_view=True, animate_layout=False):
+        """ invalidate_version_tree(reset_version_tree: bool, animate_layout: bool) -> None
+        
+        """
+        self.reset_version_view = reset_version_view
+        self.animate_layout = animate_layout
+        #FIXME: in the future, rename the signal
+        try:
+            self.emit(QtCore.SIGNAL('vistrailChanged()'))
+        finally:
+            self.reset_version_view = True
+
+    def has_move_actions(self):
+        return self.current_pipeline_scene.hasMoveActions()
+
+    def flush_move_actions(self):
+        return self.current_pipeline_scene.flushMoveActions()
+
+    ##########################################################################
+    # Pipeline View Methods
+
+    def updatePipelineScene(self):
+        self.current_pipeline_scene.setupScene(self.current_pipeline)
+
+    ##########################################################################
+    # Autosave
+
+    def enable_autosave(self):
+        self._auto_save = True
+
+    def disable_autosave(self):
+        self._auto_save = False
+
+    def get_locator(self):
+        from vistrails.gui.application import get_vistrails_application
+        if (self._auto_save and 
+            get_vistrails_application().configuration.check('autosave')):
+            if self.locator is None:
+                raise ValueError("locator is None")
+            return self.locator
+        else:
+            return None
+
+    def cleanup(self):
+        locator = self.get_locator()
+        if locator:
+            locator.clean_temporaries()
+        if self._auto_save or self.timer:
+            self.stop_timer()
+        # close associated mashup apps
+        version_prop = QVersionProp.instance()
+        for app in version_prop.versionMashups.apps.values():
+            if app and app.view == self.vistrail_view:
+                app.close()
+
+
+    ##########################################################################
+    # Actions, etc
+    
+    def perform_action(self, action, quiet=None):
+        """ performAction(action: Action, quiet=None) -> timestep
+
+        performs given action on current pipeline.
+
+        quiet and self.quiet control invalidation of version
+        tree. If quiet is set to any value, it overrides the field
+        value self.quiet.
+
+        If the value is True, then no invalidation happens (gui is not
+        updated.)
+        
+        """
+        if action is not None:
+            BaseController.perform_action(self,action)
+
+            if quiet is None:
+                if not self.quiet:
+                    self.invalidate_version_tree(False)
+            else:
+                if not quiet:
+                    self.invalidate_version_tree(False)
+            return action.db_id
+        return None
+
+    def add_new_action(self, action, description=None):
+        """add_new_action(action) -> None
+
+        Call this function to add a new action to the vistrail being
+        controlled by the vistrailcontroller.
+
+        FIXME: In the future, this function should watch the vistrail
+        and get notified of the change.
+
+        """
+        if action is not None:
+            BaseController.add_new_action(self, action, description)
+            self.emit(QtCore.SIGNAL("new_action"), action)
+            self.recompute_terse_graph()
+
+    ##########################################################################
+
+    def add_module(self, x, y, identifier, name, namespace='', 
+                   internal_version=-1):
+        return BaseController.add_module(self, identifier, name, namespace, x, y,
+                                         internal_version)
+
+    def create_abstraction_with_prompt(self, module_ids, connection_ids, 
+                                       name=""):
+        name = self.get_abstraction_name(name)
+        if name is None:
+            return
+        return self.create_abstraction(module_ids, connection_ids, name)
+
+    def update_notes(self, notes):
+        """
+        Parameters
+        ----------
+
+        - notes : 'string'
+        
+        """
+        self.flush_delayed_actions()
+        
+        if self.vistrail.set_notes(self.current_version, str(notes)):
+            self.emit(QtCore.SIGNAL('notesChanged()'))
+
+    ##########################################################################
+    # Workflow Execution
+    
+    def execute_workflow_list(self, vistrails):
+        old_quiet = self.quiet
+        self.quiet = True
+        self.current_pipeline_scene.reset_module_colors()
+        self.current_pipeline_scene.update()
+        (results, changed) = BaseController.execute_workflow_list(self, 
+                                                                  vistrails)        
+        self.quiet = old_quiet
+        if changed:
+            self.invalidate_version_tree(False)
+        return (results, changed)
+
+    def execute_current_workflow(self, custom_aliases=None, custom_params=None,
+                                 reason='Pipeline Execution', sinks=None):
+        """ execute_current_workflow() -> None
+        Execute the current workflow (if exists)
+        
+        """
+        self.flush_delayed_actions()
+        if self.current_pipeline:
+            locator = self.get_locator()
+            if locator:
+                locator.clean_temporaries()
+                locator.save_temporary(self.vistrail)
+            return self.execute_workflow_list([(self.locator,
+                                         self.current_version,
+                                         self.current_pipeline,
+                                         self.current_pipeline_scene,
+                                         custom_aliases,
+                                         custom_params,
+                                         reason,
+                                         sinks,
+                                         None)])
+        return ([], False)
+    
+    def enable_missing_package(self, identifier, deps):
+        configuration = get_vistrails_configuration()
+        if getattr(configuration, 'enablePackagesSilently', False):
+            return True
+
+        msg = "VisTrails needs to enable package '%s'." % identifier
+        if len(deps) > 0:
+            msg += (" This will also enable the dependencies: %s." 
+                    " Do you want to enable these packages?") % str(deps)
+        else:
+            msg += " Do you want to enable this package?"
+        res = show_question('Enable package?',
+                            msg,
+                            [YES_BUTTON, NO_BUTTON], 
+                            YES_BUTTON)
+        if res == NO_BUTTON:
+#             QtGui.QMessageBox.warning(get_vistrails_application().builderWindow,
+#                                       'Missing modules',
+#                                       'Some necessary modules will be missing.')
+            return False
+        return True
+
+    def install_missing_package(self, identifier):
+        res = show_question('Install package?',
+                            "This pipeline contains a module"
+                            " in package '%s', which"
+                            " is not installed. Do you want to"
+                            " install and enable that package?" % \
+                                identifier, [YES_BUTTON, NO_BUTTON],
+                            YES_BUTTON)
+        return res == YES_BUTTON
+
+    def change_selected_version(self, new_version, report_all_errors=True,
+                                do_validate=True, from_root=False):
+        """change_selected_version(new_version: int,
+                                   report_all_errors: boolean,
+                                   do_validate: boolean,
+                                   from_root: boolean)
+
+        Change the current vistrail version into new_version and emit a
+        notification signal.
+
+        NB: in most situations, the following post-condition holds:
+
+        >>> controller.change_selected_version(v)
+        >>> assert v == controller.current_version
+
+        In some occasions, however, the controller will not be able to
+        switch to the desired version. One example where this can
+        happen is when the selected version has obsolete modules (that
+        is, the currently installed package for those modules has
+        module upgrades). In these cases, change_selected_version will
+        return a new version which corresponds to a workflow that was
+        created by the upgrading mechanism that packages can provide.
+        
+        """
+
+        try:
+            self.do_version_switch(new_version, report_all_errors,
+                                   do_validate, from_root)
+        except InvalidPipeline, e:
+            from vistrails.gui.application import get_vistrails_application
+
+
+#             def process_err(err):
+#                 if isinstance(err, Package.InitializationFailed):
+#                     QtGui.QMessageBox.critical(
+#                         get_vistrails_application().builderWindow,
+#                         'Package load failed',
+#                         'Package "%s" failed during initialization. '
+#                         'Please contact the developer of that package '
+#                         'and report a bug.' % err.package.name)
+#                 elif isinstance(err, MissingPackage):
+#                     QtGui.QMessageBox.critical(
+#                         get_vistrails_application().builderWindow,
+#                         'Unavailable package',
+#                         'Cannot find package "%s" in\n'
+#                         'list of available packages. \n'
+#                         'Please install it first.' % err._identifier)
+#                 elif issubclass(err.__class__, MissingPort):
+#                     msg = ('Cannot find %s port "%s" for module "%s" '
+#                            'in loaded package "%s". A different package '
+#                            'version might be necessary.') % \
+#                            (err._port_type, err._port_name, 
+#                             err._module_name, err._package_name)
+#                     QtGui.QMessageBox.critical(
+#                         get_vistrails_application().builderWindow, 'Missing port',
+#                         msg)
+#                 else:
+#                     QtGui.QMessageBox.critical(
+#                         get_vistrails_application().builderWindow,
+#                         'Invalid Pipeline', str(err))
+
+            # VisTrails will not raise upgrade exceptions unless
+            # configured to do so. To get the upgrade requests,
+            # configuration option upgradeModules must be set to True.
+
+            exception_set = e.get_exception_set()
+            if len(exception_set) > 0:
+#                msg_box = QtGui.QMessageBox(get_vistrails_application().builderWindow)
+#                msg_box.setIcon(QtGui.QMessageBox.Warning)
+#                msg_box.setText("The current workflow could not be validated.")
+#                msg_box.setInformativeText("Errors occurred when trying to "
+#                                           "construct this workflow.")
+#                msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
+#                msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
+#                msg_box.setDetailedText(str(e))
+#                msg_box.exec_()
+                # text = "The current workflow could not be validated."
+                # debug.critical('%s\n%s' % (text, str(e)))
+                debug.critical(str(e))
+
+#                 print 'got to exception set'
+#                 # Process all errors as usual
+#                 if report_all_errors:
+#                     for exc in exception_set:
+#                         print 'processing', exc
+#                         process_err(exc)
+#                 else:
+#                     process_err(exception_set.__iter__().next())
+
+        except Exception, e:
+            import traceback
+            debug.critical('Unexpected Exception\n%s' % str(e), 
+                           traceback.format_exc())
+        
+        # FIXME: this code breaks undo/redo, and seems to be ok with normal
+        # pipeline manipulations so I am leaving it commented out for now
+
+        # if not self._current_terse_graph or \
+        #         new_version not in self._current_terse_graph.vertices:
+        #     self.recompute_terse_graph()
+
+        self.emit(QtCore.SIGNAL('versionWasChanged'), self.current_version)
+
+    def set_search(self, search, text=''):
+        """ set_search(search: SearchStmt, text: str) -> None
+        Change the currrent version tree search statement
+        
+        """
+        if self.search != search or self.search_str != text:
+            self.search = search
+            self.search_str = text
+            if self.search:
+                self.search.run(self.vistrail, '')
+                self.invalidate_version_tree(True)
+            if self.refine:
+                # need to recompute the graph because the refined items might
+                # have changed since last time
+                self.recompute_terse_graph()
+                self.invalidate_version_tree(True)
+            else:
+                self.invalidate_version_tree(False)
+            
+            self.emit(QtCore.SIGNAL('searchChanged'))
+
+    def set_refine(self, refine):
+        """ set_refine(refine: bool) -> None
+        Set the refine state to True or False
+        
+        """
+        if self.refine!=refine:
+            self.refine = refine
+            # need to recompute the graph because the refined items might
+            # have changed since last time
+            self.recompute_terse_graph()
+            self.invalidate_version_tree(True)
+
+    def set_full_tree(self, full):
+        """ set_full_tree(full: bool) -> None        
+        Set if Vistrails should show a complete version tree or just a
+        terse tree
+        
+        """
+        if full != self.full_tree:
+            self.full_tree = full
+            self.invalidate_version_tree(True)
+
+    def recompute_terse_graph(self):
+        BaseController.recompute_terse_graph(self)
+        self._previous_graph_layout = copy.deepcopy(self._current_graph_layout)
+        self._current_graph_layout.layout_from(self.vistrail,
+                                               self._current_terse_graph)
+
+    def refine_graph(self, step=1.0):
+        """ refine_graph(step: float in [0,1]) -> (Graph, Graph)        
+        Refine the graph of the current vistrail based the search
+        status of the controller. It also return the full graph as a
+        reference
+        
+        """
+        if self._current_full_graph is None:
+            self.recompute_terse_graph()
+
+        if not self.animate_layout:
+            return (self._current_terse_graph, self._current_full_graph,
+                    self._current_graph_layout)
+
+        graph_layout = copy.deepcopy(self._current_graph_layout)
+        terse_graph = copy.deepcopy(self._current_terse_graph)
+        am = self.vistrail.actionMap
+        step = 1.0/(1.0+math.exp(-(step*12-6))) # use a logistic sigmoid function
+        
+        # Adding nodes to tree
+        for (c_id, c_node) in self._current_graph_layout.nodes.iteritems():
+            if self._previous_graph_layout.nodes.has_key(c_id):
+                p_node = self._previous_graph_layout.nodes[c_id]
+            else: 
+                p_id = c_id
+                # Find closest child of contained in both graphs
+                while not self._previous_graph_layout.nodes.has_key(p_id):
+                    # Should always have exactly one child
+                    p_id = [to for (to, _) in \
+                                self._current_full_graph.adjacency_list[p_id]
+                            if (to in am) and \
+                                not self.vistrail.is_pruned(to)][0]
+                p_node = self._previous_graph_layout.nodes[p_id]
+
+            # Interpolate position
+            x = p_node.p.x - c_node.p.x
+            y = p_node.p.y - c_node.p.y
+            graph_layout.move_node(c_id, x*(1.0-step), y*(1.0-step))
+            
+        # Removing nodes from tree
+        for (p_id, p_node) in self._previous_graph_layout.nodes.iteritems():
+            if not self._current_graph_layout.nodes.has_key(p_id):
+                # Find closest parent contained in both graphs
+                shared_parent = p_id
+                while (shared_parent > 0 and 
+                       shared_parent not in self._current_graph_layout.nodes):
+                    shared_parent = \
+                        self._current_full_graph.parent(shared_parent)
+
+                # Find closest child contained in both graphs
+                c_id = p_id
+                while not self._current_graph_layout.nodes.has_key(c_id):
+                    # Should always have exactly one child
+                    c_id = [to for (to, _) in \
+                                self._current_full_graph.adjacency_list[c_id]
+                            if (to in am) and \
+                                not self.vistrail.is_pruned(to)][0]
+                    
+                # Don't show edge that skips the disappearing nodes
+                if terse_graph.has_edge(shared_parent, c_id):
+                    terse_graph.delete_edge(shared_parent, c_id)
+
+                # Add the disappearing node to the graph and layout
+                c_node = copy.deepcopy(self._current_graph_layout.nodes[c_id])
+                c_node.id = p_id
+                graph_layout.add_node(p_id, c_node)
+                terse_graph.add_vertex(p_id)
+                p_parent = self._current_full_graph.parent(p_id)
+                if not terse_graph.has_edge(p_id, p_parent):
+                    terse_graph.add_edge(p_parent, p_id)
+                p_child = p_id
+                while p_child not in self._current_graph_layout.nodes:
+                    # Should always have exactly one child
+                    p_child = [to for (to, _) in \
+                                   self._current_full_graph.adjacency_list[p_child]
+                               if (to in am) and \
+                                   not self.vistrail.is_pruned(to)][0]
+                if not terse_graph.has_edge(p_id, p_child):
+                    terse_graph.add_edge(p_id, p_child)
+
+                # Interpolate position
+                x = p_node.p.x - c_node.p.x
+                y = p_node.p.y - c_node.p.y
+                graph_layout.move_node(p_id, x*(1.0-step), y*(1.0-step))
+
+        return (terse_graph, self._current_full_graph,
+                graph_layout)
+
+    ##########################################################################
+    # undo/redo navigation
+
+    def _change_version_short_hop(self, new_version):
+        """_change_version_short_hop is used internally to
+        change versions when we're moving exactly one action up or down.
+        This allows a few optimizations that improve interactivity."""
+        
+        if self.current_version <> new_version:
+            # Instead of recomputing the terse graph, simply update it
+
+            # There are two variables in play:
+            # a) whether or not the destination node is currently on the
+            # terse tree (it will certainly be after the move)
+            # b) whether or not the current node will be visible (it
+            # certainly is now, since it's the current one)
+
+            dest_node_in_terse_tree = new_version in self._current_terse_graph.vertices
+            
+            current = self.current_version
+            tree = self.vistrail.tree.getVersionTree()
+            # same logic as recompute_terse_graph except for current
+            children_count = len([x for (x, _) in tree.adjacency_list[current]
+                                  if (x in self.vistrail.actionMap and
+                                      not self.vistrail.is_pruned(x))])
+            current_node_will_be_visible = \
+                (self.full_tree or
+                 self.vistrail.has_tag(self.current_version) or
+                 children_count <> 1)
+
+            self.change_selected_version(new_version)
+            # case 1:
+            if not dest_node_in_terse_tree and \
+                    not current_node_will_be_visible and not current == 0:
+                # we're going from one boring node to another,
+                # so just rename the node on the terse graph
+                self._current_terse_graph.rename_vertex(current, new_version)
+                self.replace_unnamed_node_in_version_tree(current, new_version)
+            else:
+                # bail, for now
+                self.recompute_terse_graph()
+                self.invalidate_version_tree(False)
+        
+
+    def show_parent_version(self):
+        """ show_parent_version() -> None
+        Go back one from the current version and display it
+
+        """
+        # NOTE cscheid: Slight change in the logic under refined views:
+        # before r1185, undo would back up more than one action in the
+        # presence of non-matching refined nodes. That seems wrong. Undo
+        # should always move one step only.         
+
+        prev = None
+        try:
+            prev = self._current_full_graph.parent(self.current_version)
+        except Graph.VertexHasNoParentError:
+            prev = 0
+
+        self._change_version_short_hop(prev)
+
+    def show_child_version(self, which_child):
+        """ show_child_version(which_child: int) -> None
+        Go forward one version and display it. This is used in redo.
+
+        ONLY CALL THIS FUNCTION IF which_child IS A CHILD OF self.current_version
+
+        """
+        self._change_version_short_hop(which_child)
+        
+
+    def prune_versions(self, versions):
+        """ prune_versions(versions: list of version numbers) -> None
+        Prune all versions in 'versions' out of the view
+        
+        """
+        # We need to go up-stream to the highest invisible node
+        current = self._current_terse_graph
+        if not current:
+            (current, full, layout) = self.refine_graph()
+        else:
+            full = self._current_full_graph
+        changed = False
+        new_current_version = None
+        for v in versions:
+            if v!=0: # not root
+                highest = v
+                while True:
+                    p = full.parent(highest)
+                    if p==-1:
+                        break
+                    if p in current.vertices:
+                        break
+                    highest = p
+                if highest!=0:
+                    changed = True
+                    if highest == self.current_version:
+                        new_current_version = full.parent(highest)
+                self.vistrail.pruneVersion(highest)
+        if changed:
+            self.set_changed(True)
+        if new_current_version is not None:
+            self.change_selected_version(new_current_version)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False)
+
+    def hide_versions_below(self, v=None):
+        """ hide_versions_below(v: int) -> None
+        Hide all versions including and below v
+        
+        """
+        if v is None:
+            v = self.current_version
+        full = self.vistrail.getVersionGraph()
+        x = [v]
+
+        am = self.vistrail.actionMap
+
+        changed = False
+
+        while 1:
+            try:
+                current=x.pop()
+            except IndexError:
+                break
+
+            children = [to for (to, _) in full.adjacency_list[current]
+                        if (to in am) and \
+                            not self.vistrail.is_pruned(to)]
+            self.vistrail.hideVersion(current)
+            changed = True
+
+            for child in children:
+                x.append(child)
+
+        if changed:
+            self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False, False) 
+
+    def show_all_versions(self):
+        """ show_all_versions() -> None
+        Unprune (graft?) all pruned versions
+
+        """
+        full = self.vistrail.getVersionGraph()
+        am = self.vistrail.actionMap
+        for a in am.iterkeys():
+            self.vistrail.showVersion(a)
+        self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False, False)
+
+    def expand_versions(self, v1, v2):
+        """ expand_versions(v1: int, v2: int) -> None
+        Expand all versions between v1 and v2
+        
+        """
+        full = self.vistrail.getVersionGraph()
+        changed = False
+        p = full.parent(v2)
+        while p>v1:
+            self.vistrail.expandVersion(p)
+            changed = True
+            p = full.parent(p)
+        if changed:
+            self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False, True)
+
+    def collapse_versions(self, v):
+        """ collapse_versions(v: int) -> None
+        Collapse all versions including and under version v until the next tag or branch
+        
+        """
+        full = self.vistrail.getVersionGraph()
+        x = [v]
+
+        am = self.vistrail.actionMap
+        tm = self.vistrail.get_tagMap()
+
+        changed = False
+
+        while 1:
+            try:
+                current=x.pop()
+            except IndexError:
+                break
+
+            children = [to for (to, _) in full.adjacency_list[current]
+                        if (to in am) and not self.vistrail.is_pruned(to)]
+            if len(children) > 1:
+                break;
+            self.vistrail.collapseVersion(current)
+            changed = True
+
+            for child in children:
+                if (not child in tm and  # has no Tag
+                    child != self.current_version): # not selected
+                    x.append(child)
+
+        if changed:
+            self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False, True) 
+
+    def expand_or_collapse_all_versions_below(self, v=None, expand=True):
+        """ expand_or_collapse_all_versions_below(v: int) -> None
+        Expand/Collapse all versions including and under version v
+        
+        """
+        if v is None:
+            v = self.current_version
+
+        full = self.vistrail.getVersionGraph()
+        x = [v]
+        
+        am = self.vistrail.actionMap
+
+        changed = False
+
+        while 1:
+            try:
+                current=x.pop()
+            except IndexError:
+                break
+
+            children = [to for (to, _) in full.adjacency_list[current]
+                        if (to in am) and not self.vistrail.is_pruned(to)]
+            if expand:
+                self.vistrail.expandVersion(current)
+            else:
+                self.vistrail.collapseVersion(current)
+            changed = True
+
+            for child in children:
+                x.append(child)
+
+        if changed:
+            self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False, True) 
+
+    def expand_all_versions_below(self, v=None):
+        self.expand_or_collapse_all_versions_below(v, True)
+
+    def collapse_all_versions_below(self, v=None):
+        self.expand_or_collapse_all_versions_below(v, False)
+
+    def collapse_all_versions(self):
+        """ collapse_all_versions() -> None
+        Collapse all expanded versions
+
+        """
+        am = self.vistrail.actionMap
+        for a in am.iterkeys():
+            self.vistrail.collapseVersion(a)
+        self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False, True)
+
+    def set_num_versions_always_shown(self, num):
+        """ set_num_versions_always_shown(num: int) -> None
+
+        """
+        if num <> self.num_versions_always_shown:
+            self.num_versions_always_shown = num
+            self.set_changed(True)
+            self.recompute_terse_graph()
+            self.invalidate_version_tree(False)
+
+    def setSavedQueries(self, queries):
+        """ setSavedQueries(queries: list of (str, str, str)) -> None
+        Set the saved queries of a vistail
+        
+        """
+        self.vistrail.setSavedQueries(queries)
+        self.set_changed(True)
+        
+    def update_current_tag(self,tag):
+        """ update_current_tag(tag: str) -> Bool
+        Update the current vistrail tag and return success predicate
+        
+        """
+        self.flush_delayed_actions()
+        try:
+            if self.vistrail.hasTag(self.current_version):
+                self.vistrail.changeTag(tag, self.current_version)
+            else:
+                self.vistrail.addTag(tag, self.current_version)
+        except TagExists:
+            show_warning('Name Exists',
+                         "There is already another version named '%s'.\n"
+                         "Please enter a different one." % tag)
+            return False
+        self.set_changed(True)
+        self.recompute_terse_graph()
+        self.invalidate_version_tree(False)
+        return True
+
+    def perform_param_changes(self, actions):
+        """perform_param_changes(actions) -> None
+
+        Performs a series of parameter change actions to the current version.
+
+        FIXME: this function seems to be called from a single place in
+        the spreadsheet cell code. Do we need it?
+        """
+        if len(actions) == 0:
+            return
+        for action in actions:
+            for operation in action.operations:
+                if operation.vtType == 'add' or operation.vtType == 'change':
+                    if operation.new_obj_id < 0:
+                        data = operation.data
+                        new_id = self.vistrail.idScope.getNewId(data.vtType)
+                        data.real_id = new_id
+                        operation.new_obj_id = new_id
+            self.add_new_action(action)
+            self.perform_action(action, quiet=True)
+        self.set_changed(True)
+        self.invalidate_version_tree(False)
+
+    def get_pipeline_name(self, version=None):
+        if version == None:
+            version = self.current_version
+        return self.vistrail.get_pipeline_name(version)
+
+    ###########################################################################
+    # Clipboard, copy/paste
+
+    def get_selected_item_ids(self):
+        return self.current_pipeline_scene.get_selected_item_ids()
+
+    def copy_modules_and_connections(self, module_ids, connection_ids):
+        """copy_modules_and_connections(module_ids: [long],
+                                     connection_ids: [long]) -> str
+        Serializes a list of modules and connections
+        """
+        self.flush_delayed_actions()
+
+        def process_group(group):
+            # reset pipeline id for db
+            group.pipeline.id = None
+            # recurse
+            for module in group.pipeline.module_list:
+                if module.is_group():
+                    process_group(module)
+
+        pipeline = Pipeline()
+        sum_x = 0.0
+        sum_y = 0.0
+        for module_id in module_ids:
+            module = self.current_pipeline.modules[module_id]
+            sum_x += module.location.x
+            sum_y += module.location.y
+            if module.is_group():
+                process_group(module)
+
+        center_x = sum_x / len(module_ids)
+        center_y = sum_y / len(module_ids)
+        for module_id in module_ids:
+            module = self.current_pipeline.modules[module_id]
+            module = module.do_copy()
+            module.location.x -= center_x
+            module.location.y -= center_y
+            pipeline.add_module(module)
+        for connection_id in connection_ids:
+            connection = self.current_pipeline.connections[connection_id]
+            pipeline.add_connection(connection)
+        return vistrails.core.db.io.serialize(pipeline)
+        
+    def paste_modules_and_connections(self, str, center):
+        """ paste_modules_and_connections(str,
+                                          center: (float, float)) -> [id list]
+        Paste a list of modules and connections into the current pipeline.
+
+        Returns the list of module ids of added modules
+
+        """
+        def remove_duplicate_aliases(pip):
+            aliases = self.current_pipeline.aliases.keys()
+            for a in aliases:
+                if a in pip.aliases:
+                    (type, oId, parentType, parentId, mid) = pip.aliases[a]
+                    pip.remove_alias_by_name(a)
+                    _mod = pip.modules[mid]
+                    _fun = _mod.function_idx[parentId]
+                    _par = _fun.parameter_idx[oId]
+                    _par.alias = ''
+                                    
+        self.flush_delayed_actions()
+        pipeline = vistrails.core.db.io.unserialize(str, Pipeline)
+        remove_duplicate_aliases(pipeline)
+
+        modules = []
+        connections = []
+        if pipeline:
+            def process_group(group):
+                # reset pipeline id for db
+                group.pipeline.id = None
+                # recurse
+                for module in group.pipeline.module_list:
+                    if module.is_group():
+                        process_group(module)
+
+            for module in pipeline.module_list:
+                module.location.x += center[0]
+                module.location.y += center[1]
+                if module.is_group():
+                    process_group(module)
+
+            id_remap = {}
+            action = vistrails.core.db.action.create_paste_action(pipeline, 
+                                                        self.vistrail.idScope,
+                                                        id_remap)
+
+            modules = [op.objectId
+                       for op in action.operations
+                       if (op.what == 'module' or 
+                           op.what == 'abstraction' or
+                           op.what == 'group')]
+            connections = [op.objectId
+                           for op in action.operations
+                           if op.what == 'connection']
+                
+            self.add_new_action(action)
+            self.vistrail.change_description("Paste", action.id)
+            self.perform_action(action)
+            self.validate(self.current_pipeline, False)
+        return modules
+
+    def get_abstraction_name(self, name="", check_exists=True):
+        name = self.do_abstraction_prompt(name)
+        if name is None:
+            return None
+        while name == "" or (check_exists and self.abstraction_exists(name)):
+            name = self.do_abstraction_prompt(name, name != "")
+            if name is None:
+                return None
+        return name
+
+    def do_abstraction_prompt(self, name="", exists=False):
+        if exists:
+            prompt = "'%s' already exists.  Enter a new subworkflow name" % \
+                name
+        else:
+            prompt = 'Enter subworkflow name'
+            
+        (text, ok) = QtGui.QInputDialog.getText(None, 
+                                                'Set SubWorkflow Name',
+                                                prompt,
+                                                QtGui.QLineEdit.Normal,
+                                                name)
+        if ok and text:
+            return str(text).strip().rstrip()
+        if not ok:
+            return None
+        return ""
+
+    def import_abstractions(self, abstraction_ids):
+        for abstraction_id in abstraction_ids:
+            abstraction = self.current_pipeline.modules[abstraction_id]
+            new_name = self.get_abstraction_name(abstraction.name)
+            if new_name:
+                self.import_abstraction(new_name,
+                                        abstraction.package,
+                                        abstraction.name, 
+                                        abstraction.namespace,
+                                        abstraction.internal_version)
+        
+    def do_export_prompt(self, title, prompt):
+        (text, ok) = QtGui.QInputDialog.getText(None,
+                                                title,
+                                                prompt,
+                                                QtGui.QLineEdit.Normal,
+                                                '')
+        if ok and not text:
+            return str(text).strip().rstrip()
+        return ''
+            
+    def do_save_dir_prompt(self):
+        dialog = QtGui.QFileDialog.getExistingDirectory
+        dir_name = dialog(None, "Save Subworkflows...",
+                          vistrails.core.system.vistrails_file_directory())
+        if dir_name:
+            return None
+        dir_name = os.path.abspath(str(dir_name))
+        setattr(get_vistrails_configuration(), 'fileDirectory', dir_name)
+        vistrails.core.system.set_vistrails_file_directory(dir_name)
+        return dir_name
+    
+    def export_abstractions(self, abstraction_ids):
+        save_dir = self.do_save_dir_prompt()
+        if not save_dir:
+            return 
+
+        def read_init(dir_name):
+            import imp
+            found_attrs = {}
+            found_lists = {}
+            attrs = ['identifier', 'name', 'version']
+            lists = ['_subworkflows', '_dependencies']
+            try:
+                (file, pathname, description) = \
+                    imp.find_module(os.path.basename(dir_name), 
+                                    [os.path.dirname(dir_name)])
+                module = imp.load_module(os.path.basename(dir_name), file,
+                                         pathname, description)
+                for attr in attrs:
+                    if hasattr(module, attr):
+                        found_attrs[attr] = getattr(module, attr)
+                for attr in lists:
+                    if hasattr(module, attr):
+                        found_lists[attr] = getattr(module, attr)
+            except Exception, e:
+                debug.critical("Exception: %s" % e)
+                pass
+            return (found_attrs, found_lists)
+
+        def write_init(save_dir, found_attrs, found_lists, attrs, lists):
+            init_file = os.path.join(save_dir, '__init__.py')
+            if os.path.exists(init_file):
+                f = open(init_file, 'a')
+            else:
+                f = open(init_file, 'w')
+            for attr, val in attrs.iteritems():
+                if attr not in found_attrs:
+                    print >>f, "%s = '%s'" % (attr, val)
+            for attr, val_list in lists.iteritems():
+                if attr not in found_lists:
+                    print >>f, "%s = %s" % (attr, str(val_list))
+                else:
+                    diff_list = []
+                    for val in val_list:
+                        if val not in found_lists[attr]:
+                            diff_list.append(val)
+                    print >>f, '%s.extend(%s)' % (attr, str(diff_list))
+            f.close()
+
+        if os.path.exists(os.path.join(save_dir, '__init__.py')):
+            (found_attrs, found_lists) = read_init(save_dir)
+        else:
+            found_attrs = {}
+            found_lists = {}
+
+        if 'name' in found_attrs:
+            pkg_name = found_attrs['name']
+        else:
+            pkg_name = self.do_export_prompt("Target Package Name",
+                                             "Enter target package name")
+            if not pkg_name:
+                return
+
+        if 'identifier' in found_attrs:
+            pkg_identifier = found_attrs['identifier']
+        else:
+            pkg_identifier = self.do_export_prompt("Target Package Identifier",
+                                                   "Enter target package "
+                                                   "identifier (e.g. "
+                                                   "org.place.user.package)")
+            if not pkg_identifier:
+                return
+
+        abstractions = []
+        for abstraction_id in abstraction_ids:
+            abstraction = self.current_pipeline.modules[abstraction_id]
+            if abstraction.is_abstraction() and \
+                    abstraction.package == abstraction_pkg:
+                abstractions.append(abstraction)
+                [abstractions.extend(v) for v in self.find_abstractions(abstraction.vistrail).itervalues()]
+        pkg_subworkflows = []
+        pkg_dependencies = set()
+        for abstraction in abstractions:
+            new_name = self.get_abstraction_name(abstraction.name, False)
+            if not new_name:
+                break
+            (subworkflow, dependencies) = \
+                self.export_abstraction(new_name,
+                                        pkg_identifier,
+                                        save_dir,
+                                        abstraction.package,
+                                        abstraction.name, 
+                                        abstraction.namespace,
+                                        str(abstraction.internal_version))
+            pkg_subworkflows.append(subworkflow)
+            pkg_dependencies.update(dependencies)
+
+        attrs = {'identifier': pkg_identifier,
+                 'name': pkg_name,
+                 'version': '0.0.1'}
+        lists = {'_subworkflows': pkg_subworkflows,
+                 '_dependencies': list(pkg_dependencies)}
+        write_init(save_dir, found_attrs, found_lists, attrs, lists)
+
+    def set_changed(self, changed):
+        """ set_changed(changed: bool) -> None
+        Set the current state of changed and emit signal accordingly
+        
+        """
+        BaseController.set_changed(self, changed)
+        if changed:
+            # FIXME: emit different signal in the future
+            self.emit(QtCore.SIGNAL('stateChanged'))
+
+    def set_file_name(self, file_name):
+        """ set_file_name(file_name: str) -> None
+        Change the controller file name
+        
+        """
+        old_name = self.file_name
+        BaseController.set_file_name(self, file_name)
+        if old_name!=file_name:
+            self.emit(QtCore.SIGNAL('stateChanged'))
+
+    def write_vistrail(self, locator, version=None, export=False):
+        need_invalidate = BaseController.write_vistrail(self, locator,
+                                                        version, export)
+        if need_invalidate and not export:
+            self.invalidate_version_tree(False)
+            self.set_changed(False)
+
+    def write_opm(self, locator):
+        if self.log:
+            if self.vistrail.db_log_filename is not None:
+                log = vistrails.core.db.io.merge_logs(self.log, 
+                                            self.vistrail.db_log_filename)
+            else:
+                log = self.log
+            opm_graph = OpmGraph(log=log, 
+                                 version=self.current_version,
+                                 workflow=self.current_pipeline,
+                                 registry=get_module_registry())
+            locator.save_as(opm_graph)
+            
+    def write_prov(self, locator):
+        if self.log:
+            if self.vistrail.db_log_filename is not None:
+                log = vistrails.core.db.io.merge_logs(self.log, 
+                                            self.vistrail.db_log_filename)
+            else:
+                log = self.log
+            prov_document = ProvDocument(log=log, 
+                                         version=self.current_version,
+                                         workflow=self.current_pipeline,
+                                         registry=get_module_registry())
+            locator.save_as(prov_document)
+
+    def query_by_example(self, pipeline):
+        """ query_by_example(pipeline: Pipeline) -> None
+        Perform visual query on the current vistrail
+        
+        """
+        if len(pipeline.modules)==0:
+            search = TrueSearch()
+        else:
+            if not self._current_terse_graph:
+                self.recompute_terse_graph()
+            versions_to_check = \
+                set(self._current_terse_graph.vertices.iterkeys())
+            search = VisualQuery(pipeline, versions_to_check)
+
+        self.set_search(search, '') # pipeline.dump_to_string())
+
+    ##########################################################################
+    # analogies
+
+    def add_analogy(self, analogy_name, version_from, version_to):
+        assert isinstance(analogy_name, str)
+        assert isinstance(version_from, (int, long))
+        assert isinstance(version_to, (int, long))
+        if analogy_name in self.analogy:
+            raise VistrailsInternalError("duplicated analogy name '%s'" %
+                                         analogy_name)
+        self.analogy[analogy_name] = (version_from, version_to)
+
+    def remove_analogy(self, analogy_name):
+        if analogy_name not in self.analogy:
+            raise VistrailsInternalError("missing analogy '%s'" %
+                                         analogy_name)
+        del self.analogy[analogy_name]
+
+    def perform_analogy(self, analogy_name, analogy_target):
+        if analogy_name not in self.analogy:
+            raise VistrailsInternalError("missing analogy '%s'" %
+                                         analogy_name)
+
+        # remove delayed actions since we're not necessarily using
+        # current_version
+        self._delayed_actions = []
+
+        (a, b) = self.analogy[analogy_name]
+        c = analogy_target
+        if self.current_version != c:
+            self.change_selected_version(c)
+
+        try:
+            pipeline_a = self.vistrail.getPipeline(a)
+            self.validate(pipeline_a)
+        except InvalidPipeline, e:
+            (_, pipeline_a) = \
+                self.handle_invalid_pipeline(e, a, Vistrail())
+            self._delayed_actions = []
+        try:
+            pipeline_c = self.vistrail.getPipeline(c)
+            self.validate(pipeline_c)
+        except InvalidPipeline, e:
+            (_, pipeline_c) = self.handle_invalid_pipeline(e, a, Vistrail())
+            self._delayed_actions = []
+                                                     
+        action = vistrails.core.analogy.perform_analogy_on_vistrail(self.vistrail,
+                                                          a, b, c, 
+                                                          pipeline_a,
+                                                          pipeline_c)
+        self.add_new_action(action)
+        self.vistrail.change_description("Analogy", action.id)
+        self.vistrail.change_analogy_info("(%s -> %s)(%s)" % (a, b, c), 
+                                          action.id)
+        
+        # make sure that the output from the analogy is as up-to-date
+        # as we can make it
+        self.change_selected_version(action.id, from_root=True)
+        self.flush_delayed_actions()
+        self.invalidate_version_tree()
+        
+    def executeParameterExploration(self, pe, view=None, extra_info={}, showProgress=True):
+        """ execute(pe: ParameterExploration, view: QVistrailView,
+            extra_info: dict, showProgress: bool) -> None
+        Perform the exploration by collecting a list of actions
+        corresponding to each dimension
+        
+        """
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        spreadsheet_pkg = '%s.spreadsheet' % \
+                vistrails.core.system.get_vistrails_default_pkg_prefix()
+        use_spreadsheet = reg.has_module(spreadsheet_pkg, 'CellLocation') and\
+                          reg.has_module(spreadsheet_pkg, 'SheetReference')
+
+        if pe.action_id != self.current_version:
+            self.change_selected_version(pe.action_id)
+        actions, pre_actions, vistrail_vars = \
+                        pe.collectParameterActions(self.current_pipeline)
+
+        if self.current_pipeline and actions:
+            explorer = ActionBasedParameterExploration()
+            (pipelines, performedActions) = explorer.explore(
+                self.current_pipeline, actions, pre_actions)
+            
+            dim = [max(1, len(a)) for a in actions]
+            if use_spreadsheet:
+                from vistrails.gui.paramexplore.virtual_cell import positionPipelines, assembleThumbnails
+                from vistrails.gui.paramexplore.pe_view import QParamExploreView
+                modifiedPipelines, pipelinePositions = positionPipelines(
+                    'PE#%d %s' % (QParamExploreView.explorationId, self.name),
+                    dim[2], dim[1], dim[0], pipelines, pe.layout, self)
+                QParamExploreView.explorationId += 1
+            else:
+                modifiedPipelines = pipelines
+
+            mCount = []
+            for p in modifiedPipelines:
+                if len(mCount)==0:
+                    mCount.append(0)
+                else:
+                    mCount.append(len(p.modules)+mCount[len(mCount)-1])
+                
+            # Now execute the pipelines
+            if showProgress:
+                totalProgress = sum([len(p.modules) for p in modifiedPipelines])
+                progress = QtGui.QProgressDialog('Performing Parameter '
+                                                 'Exploration...',
+                                                 '&Cancel',
+                                                 0, totalProgress)
+                progress.setWindowTitle('Parameter Exploration')
+                progress.setWindowModality(QtCore.Qt.WindowModal)
+                progress.show()
+
+            interpreter = get_default_interpreter()
+            
+            images = {}
+            errors = []
+            for pi in xrange(len(modifiedPipelines)):
+                if showProgress:
+                    progress.setValue(mCount[pi])
+                    QtCore.QCoreApplication.processEvents()
+                    if progress.wasCanceled():
+                        break
+                    def moduleExecuted(objId):
+                        if not progress.wasCanceled():
+                            progress.setValue(progress.value()+1)
+                            QtCore.QCoreApplication.processEvents()
+                if use_spreadsheet:
+                    name = os.path.splitext(self.name)[0] + \
+                                         ("_%s_%s_%s" % pipelinePositions[pi])
+                    extra_info['nameDumpCells'] = name
+                    if 'pathDumpCells' in extra_info:
+                        images[pipelinePositions[pi]] = \
+                                   os.path.join(extra_info['pathDumpCells'], name)
+                kwargs = {'locator': self.locator,
+                          'current_version': self.current_version,
+                          'reason': 'Parameter Exploration',
+                          'actions': performedActions[pi],
+                          'extra_info': extra_info
+                          }
+                if view:
+                    kwargs['view'] = view
+                if showProgress:
+                    kwargs['module_executed_hook'] = [moduleExecuted]
+                if self.get_vistrail_variables():
+                    # remove vars used in pe
+                    vars = dict([(v.uuid, v) for v in self.get_vistrail_variables()
+                            if v.uuid not in vistrail_vars])
+                    kwargs['vistrail_variables'] = lambda x: vars.get(x, None)
+                result = interpreter.execute(modifiedPipelines[pi], **kwargs)
+                for error in result.errors.itervalues():
+                    if use_spreadsheet:
+                        pp = pipelinePositions[pi]
+                        errors.append(((pp[1], pp[0], pp[2]), error))
+                    else:
+                        errors.append(((0,0,0), error))
+
+            if showProgress:
+                progress.setValue(totalProgress)
+            if 'pathDumpCells' in extra_info:
+                filename = os.path.join(extra_info['pathDumpCells'],
+                                        os.path.splitext(self.name)[0])
+                assembleThumbnails(images, filename)
+            return errors
+
+################################################################################
+# Testing
+
+
+class TestVistrailController(vistrails.gui.utils.TestVisTrailsGUI):
+
+    # def test_add_module(self):
+    #     v = api.new_vistrail()
+       
+    def tearDown(self):
+        from vistrails.core.configuration import get_vistrails_configuration
+        vistrails.gui.utils.TestVisTrailsGUI.tearDown(self)
+
+        config = get_vistrails_configuration()
+        filename = os.path.join(config.abstractionsDirectory,
+                                '__TestFloatList.xml')
+        if os.path.exists(filename):
+            os.remove(filename)
+
+    def test_create_functions(self):
+        controller = VistrailController(Vistrail(), None, 
+                                        pipeline_view=DummyView(),
+                                        auto_save=False)
+        controller.change_selected_version(0L)
+        module = controller.add_module(0.0,0.0, 
+                        vistrails.core.system.get_vistrails_basic_pkg_id(), 
+                        'ConcatenateString')
+        functions = [('str1', ['foo'], -1, True),
+                     ('str2', ['bar'], -1, True)]
+        controller.update_functions(module, functions)
+
+        self.assertEquals(len(controller.current_pipeline.module_list), 1)
+        p_module = controller.current_pipeline.modules[module.id]
+        self.assertEquals(len(p_module.functions), 2)
+        self.assertEquals(p_module.functions[0].params[0].strValue, 'foo')
+        self.assertEquals(p_module.functions[1].params[0].strValue, 'bar')
+
+        # make sure updates work correctly
+        # also check that we can add more than one function w/ same name
+        # by passing False as should_replace
+        new_functions = [('str1', ['baz'], -1, True),
+                         ('str2', ['foo'], -1, False),
+                         ('str3', ['bar'], -1, False)]
+        controller.update_functions(p_module, new_functions)
+        self.assertEquals(len(p_module.functions), 4)
+
+    def test_abstraction_create(self):
+        from vistrails.core.db.locator import XMLFileLocator
+        import vistrails.core.db.io
+        from vistrails.core.configuration import get_vistrails_configuration
+        config = get_vistrails_configuration()
+        filename = os.path.join(config.abstractionsDirectory,
+                                '__TestFloatList.xml')
+        locator = XMLFileLocator(vistrails.core.system.vistrails_root_directory() +
+                           '/tests/resources/test_abstraction.xml')
+        v = locator.load()
+        controller = VistrailController(v, locator, pipeline_view=DummyView(),
+                                        auto_save=False)
+        # DAK: version is different because of upgrades
+        # controller.change_selected_version(9L)
+        controller.select_latest_version()
+        self.assertNotEqual(controller.current_pipeline, None)
+        
+        # DAK: changed these because of upgrades...
+        # module_ids = [1, 2, 3]
+        # connection_ids = [1, 2, 3]
+        module_ids = [8, 10, 11]
+        #connection_ids = [6, 8, 9]
+        # TE: changed again because upgrades produced different id:s
+        # also saved upgrade in test_abstraction.xml
+        connection_ids = [13,14,15]
+        controller.create_abstraction(module_ids, connection_ids,
+                                      '__TestFloatList')
+        self.assert_(os.path.exists(filename))
diff --git a/vistrails/gui/vistrail_variables.py b/vistrails/gui/vistrail_variables.py
new file mode 100644
index 0000000..ad59c76
--- /dev/null
+++ b/vistrails/gui/vistrail_variables.py
@@ -0,0 +1,65 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file describes the vistrail variables box into which the user can
+drop constants from the module palette
+
+"""
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.variable_dropbox import QVariableDropBox
+from vistrails.gui.common_widgets import QToolWindowInterface
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+
+################################################################################
+
+class QVistrailVariables(QVariableDropBox, QVistrailsPaletteInterface):
+    """
+    QVistrailVariables shows variables associated with a vistrail, and
+    supports drag/drop actions of constant items from the module palette
+    
+    """
+    def __init__(self, parent=None):
+        """ QVistrailVariables(parent: QWidget) -> QVistrailVariables
+        Initialize widget constraints
+        
+        """
+        QVariableDropBox.__init__(self, parent)
+        self.setWindowTitle('Vistrail Variables')
+        self.setToolWindowAcceptDrops(True)
+
+    def sizeHint(self):
+        """ sizeHint() -> None
+        """
+        return QtCore.QSize(self.size().width(), 300)
+
diff --git a/vistrails/gui/vistrail_view.py b/vistrails/gui/vistrail_view.py
new file mode 100644
index 0000000..b5cb0f3
--- /dev/null
+++ b/vistrails/gui/vistrail_view.py
@@ -0,0 +1,1295 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" The file describes a container widget consisting of a pipeline
+view and a version tree for each opened Vistrail """
+from PyQt4 import QtCore, QtGui
+
+from vistrails.core import debug
+from vistrails.core.collection import Collection
+from vistrails.core.debug import critical
+from vistrails.core.data_structures.bijectivedict import Bidict
+from vistrails.core.system import vistrails_default_file_type
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.log.log import Log
+from vistrails.core.log.opm_graph import OpmGraph
+from vistrails.core.log.prov_document import ProvDocument
+from vistrails.core.db.locator import FileLocator, XMLFileLocator
+from vistrails.core.modules.module_registry import ModuleRegistry
+from vistrails.core.configuration import get_vistrails_configuration
+
+from vistrails.gui.collection.vis_log import QLogView
+from vistrails.gui.common_widgets import QMouseTabBar
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.gui.version_view import QVersionTreeView
+from vistrails.gui.query_view import QQueryView
+from vistrails.gui.paramexplore.pe_view import QParamExploreView
+from vistrails.gui.vis_diff import QDiffView
+from vistrails.gui.paramexplore.param_view import QParameterView
+from vistrails.gui.vistrail_controller import VistrailController
+from vistrails.gui.mashups.mashup_view import QMashupView
+from vistrails.gui.ports_pane import ParameterEntry
+from vistrails.gui.query_view import QueryEntry
+
+################################################################################
+
+class QVistrailView(QtGui.QWidget):
+    """
+    QVistrailView is a widget containing four stacked widgets: Pipeline View,
+    Version Tree View, Query View and Parameter Exploration view
+    for manipulating vistrails.
+    """
+    def __init__(self, vistrail, locator=None, abstraction_files=None,
+                 thumbnail_files=None, mashups=None, parent=None):
+        """ QVistrailView(parent: QWidget) -> QVistrailView
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+
+        layout = QtGui.QVBoxLayout(self)
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        self.is_executing = False
+        self.is_abstraction = False
+        self.notifications = {}
+        self.tabs = QMouseTabBar(self)
+        self.tabs.setDocumentMode(True)
+        self.tabs.setTabsClosable(True)
+        self.tabs.setExpanding(False)
+        #self.tabs.setMovable(True)
+        self.tabs.hide()
+        self.tabs.tabDoubleClicked.connect(self.tabDoubleClicked)
+        layout.addWidget(self.tabs)
+        self.stack = QtGui.QStackedWidget(self)
+        layout.addWidget(self.stack)
+        self.setLayout(layout)
+
+        #this index is for pipeline/diff views
+        self.tab_to_stack_idx = {}
+        self.tab_state = {}
+        self.tab_to_view = {}
+        #self.button_to_tab_idx = Bidict()
+        self.detached_views = {}
+
+        # Create the initial views
+        self.version_view = None
+        pipeline_view = self.create_pipeline_view(set_controller=False)
+        self.version_view = self.create_version_view()
+        self.query_view = self.create_query_view()
+        self.pe_view = self.create_pe_view()
+        self.log_view = self.create_log_view()
+        self.mashup_view = self.create_mashup_view(False)
+
+        # Initialize the vistrail controller
+        self.locator = locator
+        self.controller = VistrailController(vistrail, 
+                                             self.locator, 
+                                             abstractions=abstraction_files, 
+                                             thumbnails=thumbnail_files,
+                                             mashups=mashups,
+                                             pipeline_view=pipeline_view)
+        
+        self.set_controller(self.controller)
+        pipeline_view.set_to_current()
+
+        self.tabs.setCurrentIndex(0)
+        self.current_tab = self.stack.setCurrentIndex(0)
+        self.pipeline_selected()
+        self.connect(self.tabs, QtCore.SIGNAL("currentChanged(int)"),
+                     self.tab_changed)
+        self.connect(self.tabs, QtCore.SIGNAL("tabCloseRequested(int)"),
+                     self.remove_view_by_index)
+       
+        #self.view_changed()
+        #self.tab_changed(0)
+
+        self.connect(self.controller,
+                     QtCore.SIGNAL('stateChanged'),
+                     self.stateChanged)
+
+        from vistrails.gui.vistrails_window import _app
+        _app.register_notification("reg_new_abstraction", 
+                                   self.controller.check_subworkflow_versions)
+        _app.register_notification("reg_deleted_abstraction",
+                                   self.controller.check_subworkflow_versions)
+
+        # self.controller = VistrailController()
+        # self.controller.vistrail_view = self
+        # self.connect(self.controller,
+        #              QtCore.SIGNAL('stateChanged'),
+        #              self.stateChanged)
+        # self.connect(self.controller,
+        #              QtCore.SIGNAL('new_action'),
+        #              self.new_action)
+
+        # # self.versionTab.versionView.scene()._vistrail_view = self
+        # self.connect(self.versionTab.versionView.scene(),
+        #              QtCore.SIGNAL('versionSelected(int,bool,bool,bool)'),
+        #              self.versionSelected,
+        #              QtCore.Qt.QueuedConnection)
+
+        # self.connect(self.versionTab,
+        #              QtCore.SIGNAL('twoVersionsSelected(int,int)'),
+        #              self.twoVersionsSelected)
+        # self.connect(self.queryTab,
+        #              QtCore.SIGNAL('queryPipelineChange'),
+        #              self.queryPipelineChange)
+        # self.connect(self.peTab,
+        #              QtCore.SIGNAL('exploreChange(bool)'),
+        #              self.exploreChange)
+
+        # # We also keep track where this vistrail comes from
+        # # So we can save in the right place
+        # self.locator = None
+        
+        # self.closeEventHandler = None
+
+        # # Keep the state of the execution button and menu items for the view
+        # self.execQueryEnabled = False
+        # self.execDiffEnabled = False
+        # self.execExploreEnabled = False
+        # self.execPipelineEnabled = False
+        # self.execDiffId1 = -1
+        # self.execDiffId2 = -1
+        if get_vistrails_configuration().detachHistoryView:
+            self.detach_history_view()
+
+    def get_notifications(self):
+        return self.notifications
+
+    def set_notification(self, notification_id, method):
+        if notification_id not in self.notifications:
+            self.notifications[notification_id] = []
+        self.notifications[notification_id].append(method)
+
+    def set_controller(self, controller):
+        self.controller = controller
+        self.controller.vistrail_view = self
+        for i in xrange(self.stack.count()):
+            view = self.stack.widget(i)
+            if hasattr(view, 'set_controller'):
+                view.set_controller(controller)
+
+    def get_controller(self):
+        return self.controller
+
+    def get_name(self):
+        title = self.controller.name
+        if title=='':
+            title = 'Untitled%s'%vistrails_default_file_type()
+        if self.controller.changed:
+            title += '*'
+        # self.setWindowTitle(title)
+        return title
+
+    def set_name(self):
+        title = self.get_name()
+        self.setWindowTitle(title)
+
+    def reset_version_view(self):
+        from vistrails.gui.vistrails_window import _app
+        if self.version_view is not None:
+            select_node = True
+            if _app._previous_view and _app._previous_view in self.detached_views:
+                select_node = False
+            self.version_view.scene().setupScene(self.controller, select_node)
+
+    def reset_tab_state(self):
+        try:
+            qaction = self.tab_state[self.tabs.currentIndex()]
+            qaction.trigger()
+        except:
+            pass
+        
+    def reset_tab_view_to_current(self):
+        index = self.tabs.currentIndex()
+        view = self.stack.widget(self.tab_to_stack_idx[index])
+        #print "view changed: ", view
+        self.set_to_current(view)
+         
+    def pipeline_selected(self):
+        from vistrails.gui.vistrails_window import _app
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print "PIPELINE"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(),
+                             self.stack.currentWidget().get_title())
+        self.tab_state[self.tabs.currentIndex()] = window.qactions['pipeline']
+        self.tab_to_view[self.tabs.currentIndex()] = self.get_current_tab()
+
+    def pipeline_unselected(self):
+        #print "PIPELINE UN"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(),
+                             self.stack.currentWidget().get_title())
+
+    def history_selected(self):
+        from vistrails.gui.vistrails_window import _app
+        if get_vistrails_configuration().detachHistoryView:
+            _app.history_view.raise_()
+            return
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print "VERSION"
+        self.stack.setCurrentIndex(self.stack.indexOf(self.version_view))
+        self.tabs.setTabText(self.tabs.currentIndex(), "History")
+        self.tab_state[self.tabs.currentIndex()] = window.qactions['history']
+        self.tab_to_view[self.tabs.currentIndex()] = self.get_current_tab()
+
+    def history_unselected(self):
+        #print "VERSION UN"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(), 
+                             self.stack.currentWidget().get_title())
+
+    def query_selected(self):
+        from vistrails.gui.vistrails_window import _app
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print "QUERY"
+        self.stack.setCurrentIndex(self.stack.indexOf(self.query_view))
+        self.tabs.setTabText(self.tabs.currentIndex(), "Search")
+        self.tab_state[self.tabs.currentIndex()] = window.qactions['search']
+        self.tab_to_view[self.tabs.currentIndex()] = self.get_current_tab()
+
+    def query_unselected(self):
+        #print "QUERY UN"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(), 
+                             self.stack.currentWidget().get_title())
+
+    def explore_selected(self):
+        from vistrails.gui.vistrails_window import _app
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print "EXPLORE"
+        self.stack.setCurrentIndex(self.stack.indexOf(self.pe_view))
+        self.tabs.setTabText(self.tabs.currentIndex(),
+                             self.stack.currentWidget().get_title())
+        self.tab_state[self.tabs.currentIndex()] = window.qactions['explore']
+        self.tab_to_view[self.tabs.currentIndex()] = self.get_current_tab()
+
+    def explore_unselected(self):
+        #print "EXPLORE UN"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(), 
+                             self.stack.currentWidget().get_title())
+
+    def provenance_selected(self):
+        from vistrails.gui.vistrails_window import _app
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print "PROVENANCE"
+        self.stack.setCurrentIndex(self.stack.indexOf(self.log_view))
+        self.tabs.setTabText(self.tabs.currentIndex(), "Provenance")
+        self.tab_state[self.tabs.currentIndex()] = window.qactions['provenance']
+        self.tab_to_view[self.tabs.currentIndex()] = self.get_current_tab()
+
+    def provenance_unselected(self):
+        #print "PROVENANCE UN"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(), 
+                             self.stack.currentWidget().get_title())
+
+    def mashup_selected(self):
+        from vistrails.gui.vistrails_window import _app
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print "MASHUP"
+        #print self.stack.count(), self.stack.indexOf(self.mashup_view)
+        try:
+            self.stack.setCurrentIndex(self.stack.indexOf(self.mashup_view))
+            self.tabs.setTabText(self.tabs.currentIndex(), "Mashup")
+            self.tab_state[self.tabs.currentIndex()] = window.qactions['mashup']
+            self.mashup_view.updateView()
+            self.tab_to_view[self.tabs.currentIndex()] = self.get_current_tab()
+        except Exception, e:
+            print "EXCEPTION: ", str(e)
+    def mashup_unselected(self):
+        #print "MASHUP UN"
+        self.stack.setCurrentIndex(
+            self.tab_to_stack_idx[self.tabs.currentIndex()])
+        self.tabs.setTabText(self.tabs.currentIndex(), 
+                             self.stack.currentWidget().get_title())
+        
+    def pipeline_change(self, checked):
+        if checked:
+            #print "PIPELINE SELECTED"
+            self.pipeline_selected()
+        else:
+            #print "PIPELINE UNSELECTED"
+            self.pipeline_unselected()
+        self.view_changed()
+
+    def history_change(self, checked):
+        from vistrails_window import _app
+        if checked:
+            #print "HISTORY SELECTED"
+            self.history_selected()
+        else:
+            #print "HISTORY UNSELECTED"
+            self.history_unselected()
+        self.view_changed()
+
+    def search_change(self, checked):
+        if checked:
+            self.query_selected()
+        else:
+            self.query_unselected()
+        self.view_changed()
+
+    def explore_change(self, checked):
+        if checked:
+            self.explore_selected()
+        else:
+            self.explore_unselected()
+        self.view_changed()
+
+    def provenance_change(self, checked):
+        if checked:
+            self.provenance_selected()
+        else:
+            self.provenance_unselected()
+        self.view_changed()
+
+    def mashup_change(self, checked):
+        if checked:
+            self.mashup_selected()
+        else:
+            self.mashup_unselected()
+        self.view_changed()
+    
+    def show_group(self):
+        pipelineScene = self.controller.current_pipeline_scene
+        items = pipelineScene.get_selected_item_ids(True)
+        if items is not None:
+            for m_id in items[0]:
+                module = pipelineScene.current_pipeline.modules[m_id]
+                if module.is_group() or module.is_abstraction():
+                    newPipelineView = self.add_pipeline_view(True)
+                    newPipelineView.controller.current_pipeline_view = \
+                        newPipelineView
+                    module.pipeline.ensure_connection_specs()
+                    newPipelineView.scene().setupScene(module.pipeline)
+                    newPipelineView.scene().current_pipeline = module.pipeline
+
+    def create_view(self, klass, add_tab=True):
+        view = klass(self)
+        view.set_vistrail_view(self)
+        idx = self.stack.addWidget(view)
+        view.set_index(idx)
+        if add_tab:
+            tab_idx = self.tabs.addTab(view.get_title())
+            view.set_tab_idx(tab_idx)
+            self.tab_to_stack_idx[tab_idx] = idx
+            self.tab_to_view[tab_idx] = view
+            if self.isTabDetachable(tab_idx):
+                self.tabs.setTabToolTip(tab_idx, "Double-click to detach it")
+            
+        self.connect(view, QtCore.SIGNAL("windowTitleChanged"),
+                     self.view_title_changed)
+        if self.tabs.count() == 1:
+            #self.tabs.hide()
+            self.tabs.setTabsClosable(False)
+        else:
+            self.tabs.setTabsClosable(True)
+        self.updateTabsTooTip()
+        self.tabs.show()
+        return view
+
+    def detach_history_view(self):
+        from vistrails.gui.vistrails_window import _app
+        view = self.version_view
+        window = _app.history_view
+        self.version_index = window.stack.addWidget(view)
+        window.stack.setCurrentIndex(self.version_index)
+        window.view = view
+
+    def detach_view(self, tab_idx):
+        from vistrails.gui.vistrails_window import QBaseViewWindow
+        if self.tab_to_stack_idx.has_key(tab_idx):
+            stack_index = self.tab_to_stack_idx[tab_idx]
+            view = self.stack.widget(stack_index)
+            title = view.get_long_title()
+            self.remove_view_by_index(tab_idx)
+            window = QBaseViewWindow(view=view, parent=None)
+            view.set_title(title)
+            window.setWindowTitle(title)
+            self.connect(window, QtCore.SIGNAL("viewWasClosed"),
+                         self.detachedViewWasClosed)
+            self.detached_views[view] = window
+            window.move(self.rect().center())
+            window.show()
+        else:
+            print "Error detach_view: ", tab_idx, self.tab_to_stack_idx
+    
+    def isTabDetachable(self, index):
+        if self.tab_to_view.has_key(index):
+            return self.tabs.count() > 1 and self.tab_to_view[index].detachable
+        return False
+    
+    def closeDetachedViews(self):
+        windows = self.detached_views.values()
+        for w in windows:
+            if w:
+                w.close()
+            
+    def detachedViewWasClosed(self, view):
+        if self.controller.current_pipeline_view == view:
+            self.controller.current_pipeline_view = None
+            self.activateWindow()
+            self.reset_tab_view_to_current()
+            self.view_changed()
+        del self.detached_views[view]
+        
+    def updateTabsTooTip(self):
+        for i in range(self.tabs.count()):
+            if self.isTabDetachable(i):
+                self.tabs.setTabToolTip(i, "Double-click to detach it")
+            else:
+                self.tabs.setTabToolTip(i, "")
+    
+    def tabDoubleClicked(self, index, pos):
+        if self.isTabDetachable(index):
+            self.detach_view(index)
+            
+    def view_title_changed(self, view):
+        if self.stack.currentWidget() == view:
+            self.tabs.setTabText(self.tabs.currentIndex(), view.windowTitle())
+
+    def update_indexes(self, rm_tab_idx, rm_stack_idx):
+        for (t,s) in self.tab_to_stack_idx.iteritems():
+            if s > rm_stack_idx:
+                self.tab_to_stack_idx[t] -= 1
+        tabs = self.tab_to_stack_idx.keys()
+        tabs.sort()
+        for t in tabs:
+            if t > rm_tab_idx:
+                self.tab_to_stack_idx[t-1] = self.tab_to_stack_idx[t]
+                self.tab_state[t-1] = self.tab_state[t]
+        del self.tab_to_stack_idx[tabs[-1]]
+        del self.tab_state[tabs[-1]]
+        for idx in range(self.stack.count()):
+            if idx >= rm_stack_idx:
+                view = self.get_tab(idx)
+                view.set_index(idx)
+                if view.tab_idx > rm_tab_idx:
+                    view.set_tab_idx(view.tab_idx-1)
+    
+    def remove_view_by_index(self, index):
+        self.disconnect(self.tabs, QtCore.SIGNAL("currentChanged(int)"),
+                     self.tab_changed)
+        close_current = False
+        if index == self.tabs.currentIndex():
+            close_current = True
+        stack_idx = self.tab_to_stack_idx[index]
+        #print "\n\n >>>>> remove_view_by_index ", index, stack_idx, self.tabs.currentIndex()
+        self.tabs.removeTab(index)
+        del self.tab_to_view[index]
+        if stack_idx >= 0:
+            view = self.stack.widget(stack_idx)
+            self.disconnect(view, QtCore.SIGNAL("windowTitleChanged"),
+                     self.view_title_changed)
+            self.stack.removeWidget(view)
+        self.update_indexes(index, stack_idx)
+        if self.tabs.count() == 1:
+            self.tabs.setTabsClosable(False)
+            self.updateTabsTooTip()
+        if close_current:
+            if index >= self.tabs.count():
+                new_index = index - 1
+            else:
+                new_index = index
+        
+            self.tab_changed(new_index)
+        self.connect(self.tabs, QtCore.SIGNAL("currentChanged(int)"),
+                     self.tab_changed)
+#        self.tabs.setCurrentIndex(new_index)
+#        print self.current_tab
+        
+#        self.view_changed()
+        
+
+    def switch_to_tab(self, index):
+#        if index < 0:
+#            index = self.tabs.count() + index
+        self.tabs.setCurrentIndex(index)
+        self.tab_changed(index)
+
+    def get_current_tab(self, query_top_level=False):
+        window = QtGui.QApplication.activeWindow()
+        if window in self.detached_views.values():
+            return window.view   
+        else:
+            #if none of the detached views is active we will assume that the
+            #window containing this vistrail has focus
+            widget = self.stack.currentWidget()
+            if not query_top_level and isinstance(widget, QQueryView):
+                widget = widget.get_current_view()
+            return widget
+        
+    def get_current_outer_tab(self):
+        window = QtGui.QApplication.activeWindow()
+        if window in self.detached_views.values():
+            return window.view   
+        else:
+            #if none of the detached views is active we will assume that the
+            #window containing this vistrail has focus
+            return self.stack.currentWidget()
+        
+    def get_tab(self, stack_idx):
+        widget = self.stack.widget(stack_idx)
+        if isinstance(widget, QQueryView):
+            widget = widget.get_current_view()
+        return widget
+
+    def view_changed(self):
+        from vistrails.gui.vistrails_window import _app
+        _app.closeNotPinPalettes()
+        #view = self.stack.currentWidget()
+        view = self.get_current_outer_tab()
+        #print "changing tab from: ",self.current_tab, " to ", view
+        #print self.tab_to_stack_idx
+        if view != self.current_tab:
+            #print "!!unset_action_links of ", self.current_tab
+            _app.unset_action_links(self.current_tab)
+            self.current_tab = view
+#            print "\n!! _app.notifications: "
+#            for (k, v) in _app.notifications.iteritems():
+#                print "   ", k, "  (%s) "%len(v)
+#                for m in v: 
+#                    print "     ", m
+#            print "\n!!set_action_defaults of ", self.current_tab
+            _app.set_action_defaults(self.current_tab)
+            #print "\n!!set_action_links of ", self.current_tab 
+            _app.set_action_links(self.current_tab.action_links, self.current_tab,
+                                  self)
+
+        #else:
+           # print "tabs the same. do nothing"
+        self.showCurrentViewPalettes()
+        if isinstance(view, QQueryView):
+            _app.notify("controller_changed", view.p_controller)
+            _app.notify("entry_klass_changed", QueryEntry)
+        else:
+            _app.notify("entry_klass_changed", ParameterEntry)
+            _app.notify("controller_changed", self.controller)
+
+        if self.window().isActiveWindow():
+            if self.isTabDetachable(self.tabs.currentIndex()):
+                self.tabs.setTabToolTip(self.tabs.currentIndex(),
+                                        "Double-click to detach it")
+            else:
+                self.tabs.setTabToolTip(self.tabs.currentIndex(),
+                                        "")
+        if get_vistrails_configuration().detachHistoryView:
+            if hasattr(self.window(), 'qactions'):
+                _app = self.window()
+            _app.history_view.stack.setCurrentIndex(self.version_index)
+
+    def showCurrentViewPalettes(self):
+        current_tab = self.get_current_tab(True)
+        for dock_loc, palette_klass in current_tab.palette_layout.iteritems():
+            palette_instance = palette_klass.instance()
+            window = palette_instance.toolWindow().parentWidget()
+            if window:
+                current_loc = window.dockWidgetArea(palette_instance.toolWindow())
+            else:
+                current_loc = QtCore.Qt.NoDockWidgetArea
+            #print ">> P:", palette_instance.__class__.__name__, current_loc, \
+            #        dock_loc
+            
+            if current_loc == dock_loc:
+                # palette_instance.get_action().trigger()
+                palette_instance.set_visible(True)
+                    
+    def tab_changed(self, index):
+        #print 'raw tab_changed', index
+        if index < 0 or self.controller is None:
+            return
+
+        from vistrails.gui.vistrails_window import _app, QVistrailViewWindow
+
+        self.stack.setCurrentIndex(self.tab_to_stack_idx[index])
+        if isinstance(self.window(),QVistrailViewWindow):
+            window = self.window()
+        else:
+            window = _app
+        #print window
+        for action in window.view_action_group.actions():
+            action.setChecked(False)
+        self.selected_mode = None
+        action = None
+        if index in self.tab_state:
+            action = self.tab_state[index]
+            # if action is not None:
+                # print 'running toggle'
+                # action.toggle()
+                # action.setChecked(True)
+        else:
+            self.tab_state[index] = window.qactions['pipeline']
+        if action is not None:
+            action.setChecked(True)
+            # _app.view_triggered(action)
+
+        view = self.stack.widget(self.tab_to_stack_idx[index])
+        #print "view changed: ", view
+        self.set_to_current(view)
+        
+    def set_to_current(self, view):
+        from vistrails.gui.vistrails_window import _app, QVistrailViewWindow
+        if isinstance(view, QDiffView):
+            view.set_to_current()
+            #print "view changed!", self.controller, \
+            #    self.controller.current_version
+            _app.notify("controller_changed", self.controller)
+            self.reset_version_view()
+        elif isinstance(view, QLogView):
+            view.set_to_current()
+            #print "view changed!", self.controller, \
+            #    self.controller.current_version
+            _app.notify("controller_changed", self.controller)
+            self.reset_version_view()
+        elif isinstance(view, QPipelineView):
+            #print "PIPELINE_VIEW NEW SCENE:", id(view.scene())
+
+            # need to set the controller's version, pipeline, view
+            # to this view...
+            # self.controller.current_version = view.current_version
+            # self.controller.current_pipeline = view.current_pipeline
+            view.set_to_current()
+            #print "view changed!", self.controller, \
+            #    self.controller.current_version
+            real_view = self.stack.currentWidget()
+            if isinstance(real_view, QQueryView):
+                _app.notify("controller_changed", real_view.p_controller)
+            else:
+                _app.notify("controller_changed", self.controller)
+            self.reset_version_view()
+
+    def create_pipeline_view(self, read_only=False, set_controller=True):
+        view = self.create_view(QPipelineView)
+        view.setReadOnlyMode(read_only)
+        self.connect(view.scene(), QtCore.SIGNAL('moduleSelected'),
+                     self.gen_module_selected(view))
+        if set_controller:
+            view.set_controller(self.controller)
+            view.set_to_current()
+        self.set_notification('module_done_configure', view.done_configure)
+        #self.switch_to_tab(view.tab_idx)
+        return view
+
+    def add_pipeline_view(self, read_only=False):
+        view = self.create_pipeline_view(read_only)
+        self.switch_to_tab(view.tab_idx)
+        return view
+
+    def create_version_view(self):
+        view = self.create_view(QVersionTreeView, False)
+        self.connect(view.scene(), 
+                     QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+                     self.version_selected)
+        self.connect(view.scene(),
+                     QtCore.SIGNAL('diffRequested(int,int)'),
+                     self.diff_requested)
+        return view
+
+    def create_query_view(self):
+        view = self.create_view(QQueryView, False)
+        self.connect(view.pipeline_view.scene(), 
+                     QtCore.SIGNAL('moduleSelected'),
+                     self.gen_module_selected(view.pipeline_view))
+        # self.connect(view.version_result_view.scene(),
+        #              QtCore.SIGNAL('versionSelected(int,bool,bool,bool,bool)'),
+        #              self.version_selected)
+        # self.connect(view.version_result_view.scene(),
+        #              QtCore.SIGNAL('diffRequested(int,int)'),
+        #              self.diff_requested)
+        self.set_notification('query_changed', view.query_changed)
+        # DAK: removed this notification: query view has own version
+        # self.set_notification('version_changed', view.version_changed)
+        return view
+
+    def create_diff_view(self):
+        view = self.create_view(QDiffView)
+        self.connect(view.scene(), QtCore.SIGNAL('moduleSelected'),
+                     self.gen_module_selected(view))
+        return view
+
+    def create_pe_view(self):
+        view = self.create_view(QParamExploreView, False)
+        self.set_notification('controller_changed', view.set_controller)
+        self.set_notification('pipeline_changed', view.updatePipeline)
+        self.set_notification('exploration_changed', view.set_exploration)
+        return view
+
+    def create_log_view(self):
+        from vistrails.gui.vistrails_window import _app
+        view = self.create_view(QLogView, False)
+        self.set_notification('execution_changed', view.execution_changed)
+        return view
+    
+    def create_mashup_view(self, set_controller=True):
+        #print "******* create mashup view"
+        from vistrails.gui.vistrails_window import _app
+        view = self.create_view(QMashupView, False)
+        if set_controller:
+            view.set_controller(self.controller)
+        self.set_notification('controller_changed', view.controllerChanged)
+        self.set_notification('alias_changed', view.aliasChanged)
+        self.set_notification('version_changed', view.versionChanged)
+        return view
+    
+    def gen_module_selected(self, view):
+        def module_selected(module_id, selection = []):
+            from vistrails.gui.vistrails_window import _app
+            pipeline = view.scene().current_pipeline
+            if pipeline is not None and module_id in pipeline.modules:
+                module = pipeline.modules[module_id]
+                _app.notify('module_changed', module)
+            else:
+                _app.notify('module_changed', None)
+        return module_selected
+
+    def version_selected(self, version_id, by_click, do_validate=True,
+                         from_root=False, double_click=False):
+        from vistrails.gui.vistrails_window import _app
+        from vistrails.gui.vis_diff import QDiffView
+        if hasattr(self.window(), 'qactions'):
+            window = self.window()
+        else:
+            window = _app
+        #print 'got version selected:', version_id
+        if _app._focus_owner in self.detached_views.values():
+            view = _app._focus_owner.view
+        elif _app._previous_view in self.detached_views:
+            view = _app._previous_view
+        else:
+            view = self.stack.widget(
+                self.tab_to_stack_idx[self.tabs.currentIndex()])
+        if view and by_click:
+            self.controller.change_selected_version(version_id, True, 
+                                                    do_validate, from_root)
+
+            view.scene().fitToView(view, True)
+            if double_click:
+                # view = self.create_pipeline_view()
+                # view.set_controller(self.controller)
+                # view.set_to_current()
+                # self.tabs.setCurrentWidget(view.parent())
+                window.qactions['pipeline'].trigger()
+            self.controller.reset_redo_stack()
+        if view and not isinstance(view, QDiffView):
+            if view not in self.detached_views:
+                view.set_title("Pipeline: %s" %
+                               self.controller.get_pipeline_name())
+            else:
+                view.set_title(view.get_long_title())
+                view.window().setWindowTitle(view.get_long_title())
+        _app.notify("version_changed", self.controller.current_version)
+        _app.notify("pipeline_changed", self.controller.current_pipeline)
+
+    def query_version_selected(self, search=None, version_id=None):
+        if version_id is None:
+            self.query_view.set_result_level(
+                self.query_view.query_controller.LEVEL_VISTRAIL)
+            self.query_view.query_controller.set_search(search)
+        else:
+            self.query_view.set_result_level(
+                self.query_view.query_controller.LEVEL_WORKFLOW)
+            self.query_view.query_controller.set_search(search)
+            self.query_view.result_version_selected(version_id, True, 
+                                                    double_click=True)
+
+        window = self.window()
+        window.qactions['search'].trigger()
+        
+    def diff_requested(self, version_a, version_b, vistrail_b=None):
+        """diff_requested(self, id, id, Vistrail) -> None
+        
+        Request a diff between two versions.  If vistrail_b is
+        specified, the second version will be derived from that
+        vistrail instead of the common vistrail controlled by this
+        view.
+        """
+
+        view = self.create_diff_view()
+        view.set_controller(self.controller)
+        view.set_diff(version_a, version_b, vistrail_b)
+        self.switch_to_tab(view.tab_idx)
+        view.scene().fitToView(view, True)
+        self.view_changed()
+
+    def save_vistrail(self, locator_class, force_choose_locator=False, export=False):
+        """
+        force_choose_locator=True triggers 'save as' behavior
+        export=True does not update the current controller
+
+        """
+        locator = self.controller.locator
+        if locator_class is None:
+            if locator is not None:
+                locator_class = type(locator)
+            else:
+                debug.critical('Failed to save vistrail, unknown '
+                               'locator class.')
+
+        #print "CALLED SAVE VISTRAIL", locator_class
+
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        # get a locator to write to
+        if not locator or locator.is_untitled():
+            force_choose_locator = True
+        if force_choose_locator:
+            locator = gui_get(self, Vistrail.vtType,
+                              self.controller.locator)
+        # if couldn't get one, ignore the request
+        if not locator:
+            return False
+        try:
+            self.controller.write_vistrail(locator, export=export)
+        except Exception, e:
+            import traceback
+            debug.critical('Failed to save vistrail: %s' % str(e),
+                           traceback.format_exc())
+            raise
+            return False
+        if export:
+            return self.controller.locator
+        
+        if not force_choose_locator:
+            from vistrails.gui.vistrails_window import _app
+            _app.view_changed(self)
+            _app.notify("vistrail_saved")
+            return locator
+        # update collection
+        try:
+            thumb_cache = ThumbnailCache.getInstance()
+            self.controller.vistrail.thumbnails = \
+                self.controller.find_thumbnails(
+                    tags_only=thumb_cache.conf.tagsOnly)
+            self.controller.vistrail.abstractions = \
+                self.controller.find_abstractions(self.controller.vistrail, 
+                                                  True)
+            self.controller.vistrail.mashups = self.controller._mashups
+
+            collection = Collection.getInstance()
+            url = locator.to_url()
+            entity = collection.updateVistrail(url, self.controller.vistrail)
+            # add to relevant workspace categories
+            collection.add_to_workspace(entity)
+            collection.commit()
+        except Exception, e:
+            import traceback
+            debug.critical('Failed to index vistrail', traceback.format_exc())
+
+        from vistrails.gui.vistrails_window import _app
+        # update recent files menu items
+        if not self.is_abstraction:
+            _app.set_current_locator(locator)
+        _app.view_changed(self)
+        _app.notify("vistrail_saved")
+        # reload workspace entry
+        from vistrails.gui.collection.workspace import QWorkspaceWindow
+        QWorkspaceWindow.instance().add_vt_window(self)
+        return locator
+
+    def save_vistrail_as(self, locator_class):
+        #print "CALLED SAVE AS VISTRAIL", locator_class
+        self.save_vistrail(locator_class, force_choose_locator=True)
+
+    def export_vistrail(self, locator_class):
+        """ Exports vistrail without updating the current vistrail """
+        self.save_vistrail(locator_class, force_choose_locator=True, export=True)
+
+    def export_stable(self, locator_class=XMLFileLocator,
+                      force_choose_locator=True):
+        """ save vistrail to previous stable version """
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        if force_choose_locator:
+            locator = gui_get(self, Vistrail.vtType,
+                              self.controller.locator)
+        else:
+            locator = (self.controller.locator or
+                      gui_get(self, Vistrail.vtType, self.controller.locator))
+        if locator is not None and locator.is_untitled():
+            locator = gui_get(self, Vistrail.vtType,
+                              self.controller.locator)
+        if not locator:
+            return False
+        self.controller.write_vistrail(locator, '1.0.2', True)
+        return True
+
+
+
+    # FIXME normalize workflow/log/registry!!!
+    def save_workflow(self, locator_class, force_choose_locator=True):
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        if force_choose_locator:
+            locator = gui_get(self, Pipeline.vtType, self.controller.locator)
+        else:
+            locator = (self.controller.locator or
+                       gui_get(self, Pipeline.vtType,
+                               self.controller.locator))
+        if locator is not None and locator.is_untitled():
+            locator = gui_get(self, Pipeline.vtType, self.controller.locator)
+        if not locator:
+            return False
+        self.controller.write_workflow(locator)
+
+    def save_log(self, locator_class, force_choose_locator=True):
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        if force_choose_locator:
+            locator = gui_get(self, Log.vtType,
+                              self.controller.locator)
+        else:
+            locator = (self.controller.locator or
+                       gui_get(self, Log.vtType,
+                               self.controller.locator))
+        if locator is not None and locator.is_untitled():
+            locator = gui_get(self, Log.vtType,
+                              self.controller.locator)
+        if not locator:
+            return False
+        self.controller.write_log(locator)
+
+    def save_registry(self, locator_class, force_choose_locator=True):
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        if force_choose_locator:
+            locator = gui_get(self, ModuleRegistry.vtType,
+                              self.controller.locator)
+        else:
+            locator = (self.controller.locator or
+                       gui_get(self, ModuleRegistry.vtType,
+                               self.controller.locator))
+        if locator is not None and locator.is_untitled():
+            locator = gui_get(self, ModuleRegistry.vtType,
+                              self.controller.locator)
+        if not locator:
+            return False
+        self.controller.write_registry(locator)
+
+
+    def save_opm(self, locator_class=XMLFileLocator, 
+             force_choose_locator=True):
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        if force_choose_locator:
+            locator = gui_get(self, OpmGraph.vtType,
+                              self.controller.locator)
+        else:
+            locator = (self.controller.locator or
+                       gui_get(self, OpmGraph.vtType,
+                               self.controller.locator))
+        if locator is not None and locator.is_untitled():
+            locator = gui_get(self, OpmGraph.vtType,
+                              self.controller.locator)
+        if not locator:
+            return False
+        self.controller.write_opm(locator)
+        
+    
+    def save_prov(self, locator_class=XMLFileLocator, 
+             force_choose_locator=True):
+        self.flush_changes()
+        gui_get = locator_class.save_from_gui
+        if force_choose_locator:
+            locator = gui_get(self, ProvDocument.vtType,
+                              self.controller.locator)
+        else:
+            locator = (self.controller.locator or
+                       gui_get(self, ProvDocument.vtType,
+                               self.controller.locator))
+        if locator is not None and locator.is_untitled():
+            locator = gui_get(self, ProvDocument.vtType,
+                              self.controller.locator)
+        if not locator:
+            return False
+        self.controller.write_prov(locator)
+
+
+    def has_changes(self):
+        return self.controller.changed
+
+    def flush_changes(self):
+        """Flush changes in the vistrail before closing or saving.
+        """
+        # Quick workaround for notes focus out bug (ticket #182)
+        # There's probably a much better way to fix this.
+        from vistrails.gui.version_prop import QVersionProp
+        prop = QVersionProp.instance()
+        prop.versionNotes.commit_changes()
+
+    def execute(self):
+        # makes sure we are not already executing
+        if self.is_executing:
+            return
+        self.is_executing = True
+
+        view = self.get_current_tab()
+        try:
+            if hasattr(view, 'execute'):
+                view.setFocus(QtCore.Qt.MouseFocusReason)
+                view.execute()
+        finally:
+            self.is_executing = False
+
+    def publish_to_web(self):
+        view = self.get_current_tab()
+        if hasattr(view, 'publish_to_web'):
+            view.publish_to_web()
+                 
+    def publish_to_paper(self):
+        view = self.get_current_tab()
+        if hasattr(view, 'publish_to_paper'):
+            view.publish_to_paper()
+
+    def get_mashup_from_mashuptrail_id(self, mashuptrail_id, mashupVersion):
+        """get_mashup_from_mashuptrail_id(mashuptrail_id: int,
+                                           mashupVersion: int/str) -> None
+        It will find the matching mashuptrail and return the mashup
+        mashupVersion can be either version number or version tag
+
+        """
+        for mashuptrail in self.controller._mashups:
+            if str(mashuptrail.id) == mashuptrail_id:
+                try:
+                    mashupVersion = int(mashupVersion)
+                except ValueError:
+                    mashupVersion = mashuptrail.getTagMap()[mashupVersion]
+                mashup = mashuptrail.getMashup(mashupVersion)
+                return mashup
+        return None
+
+    def open_mashup(self, mashup):
+        """open_mashup(mashup: Mashup) -> None
+        It will switch to version view, select the corresponding node 
+        and run the mashup """
+        from vistrails.gui.version_prop import QVersionProp
+        #first we will show the hisotry view and select the version that has
+        #this mashup
+        vt_version = mashup.version
+        window = self.window()
+        window.qactions['history'].trigger()
+        self.version_selected(vt_version, by_click=True)
+        self.version_view.select_current_version()
+        #then we will execute the mashup
+        version_prop = QVersionProp.instance()
+        version_prop.versionMashups.openMashup(mashup.id)
+        
+    def edit_mashup(self, mashup):
+        """edit_mashup(mashup: Mashup) -> None
+        It will select the corresponding node, switch to mashup view, 
+        and select mashup """
+        from vistrails.gui.mashups.mashups_inspector import QMashupsInspector
+        vt_version = mashup.version
+        window = self.window()
+        window.qactions['history'].trigger()
+        self.version_selected(vt_version, by_click=True)
+        self.version_view.select_current_version()
+        window.qactions['mashup'].trigger()
+        inspector = QMashupsInspector.instance()
+        inspector.mashupsList.selectMashup(mashup.name)
+        
+    def open_parameter_exploration(self, pe_id):
+        pe = self.controller.vistrail.db_get_parameter_exploration_by_id(pe_id)
+        if not pe:
+            return
+        if self.controller.current_version != pe.action_id:
+            self.window().qactions['history'].trigger()
+            self.version_selected(pe.action_id, True)
+            self.version_view.select_current_version()
+        self.controller.current_parameter_exploration = pe
+        self.pe_view.setParameterExploration(pe)
+        self.window().qactions['explore'].trigger()
+
+    def apply_parameter_exploration(self, version, pe):
+        if not pe:
+            return
+        pe = pe.__copy__()
+        pe.action_id = version
+        if self.controller.current_version != version:
+            self.window().qactions['history'].trigger()
+            self.version_selected(version, True)
+            self.version_view.select_current_version()
+        #self.controller.current_parameter_exploration = pe
+        self.window().qactions['explore'].trigger()
+        self.pe_view.setParameterExploration(pe, False)
+        self.pe_view.table.setPipeline(self.controller.current_pipeline)
+
+    ##########################################################################
+    # Undo/redo
+        
+    def set_pipeline_selection(self, old_action, new_action):
+        # need to check if anything on module changed or
+        # any connections changed
+        module_types = set(['module', 'group', 'abstraction'])
+        module_child_types = set(['function', 'parameter', 'location', 
+                                  'portSpec', 'annotation'])
+        conn_types = set(['connection'])
+        conn_child_types = set(['port'])
+
+        view = self.stack.currentWidget()
+        if not isinstance(view, QPipelineView):
+            return 
+        
+        pipeline_scene = view.scene()    
+
+        if old_action is None:
+            old_action_id = 0
+        else:
+            old_action_id = old_action.id
+        if new_action is None:
+            new_action_id = 0
+        else:
+            new_action_id = new_action.id
+        action = self.controller.vistrail.general_action_chain(old_action_id,
+                                                               new_action_id)
+
+        def module_change():
+            module_ids = set()
+            function_ids = set()
+            for op in action.operations:
+                if op.what in module_types and \
+                        (op.vtType == 'change' or op.vtType == 'add'):
+                    module_ids.add(op.objectId)
+                elif op.what in module_child_types and \
+                        (op.vtType == 'change' or op.vtType == 'add' or
+                         op.vtType == 'delete'):
+                    if op.what == 'parameter':
+                        function_ids.add(op.parentObjId)
+                    else:
+                        module_ids.add(op.parentObjId)
+            if len(function_ids) > 0:
+                for m_id, module in \
+                        self.controller.current_pipeline.modules.iteritems():
+                    to_discard = set()
+                    for f_id in function_ids:
+                        if module.has_function_with_real_id(f_id):
+                            module_ids.add(m_id)
+                            to_discard.add(f_id)
+                    function_ids -= to_discard
+
+            for id in module_ids:
+                if id in pipeline_scene.modules:
+                    pipeline_scene.modules[id].setSelected(True)
+
+        def connection_change():
+            conn_ids = set()
+            for op in action.operations:
+                if op.what in conn_types and \
+                        (op.vtType == 'change' or op.vtType == 'add'):
+                    conn_ids.add(op.objectId)
+                elif op.what in conn_child_types and \
+                        (op.vtType == 'change' or op.vtType == 'add' or 
+                         op.vtType == 'delete'):
+                    conn_ids.add(op.parentObjId)
+            for id in conn_ids:
+                if id in pipeline_scene.connections:
+                    pipeline_scene.connections[id].setSelected(True)
+                    
+        module_change()
+        connection_change()
+        
+    def undo(self):
+        (old_action, new_action) = self.controller.undo()
+        self.set_pipeline_selection(old_action, new_action)
+        if new_action is not None:
+            return new_action.id
+        return 0
+    
+    def redo(self):
+        (old_action, new_action) = self.controller.redo()
+        self.set_pipeline_selection(old_action, new_action)
+        return new_action.id
+
+    def setVistrailVarsMode(self, on):
+        """ setVistrailVarsMode(on: bool) -> None
+        Set the vistrail variable panel state for the view
+
+        """
+        if on:
+            self.pipelineTab.vistrailVars.toolWindow().show()
+        else:
+            self.pipelineTab.vistrailVars.toolWindow().hide()
+
+    def stateChanged(self):
+        """ stateChanged() -> None
+        Handles 'stateChanged' signal from VistrailController """
+        from vistrails.gui.vistrails_window import _app
+        _app.notify("state_changed", self)
+        _app.state_changed(self)
+        
+################################################################################
+# FIXME: There is a bug on VisTrails that shows up if you load terminator.vt,
+# open the image slices HW, undo about 300 times and then try to redo.
+# This should be a test here, as soon as we have an api for that.
+
+if __name__=="__main__":
+    # Initialize the Vistrails Application and Theme
+    import sys
+    from vistrails.gui import qt, theme
+    app = qt.createBogusQtGuiApp(sys.argv)
+    theme.initializeCurrentTheme()
+
+    # Now visually test QPipelineView
+    vv = QVistrailView(None)
+    vv.show()    
+    sys.exit(app.exec_())
diff --git a/vistrails/gui/vistrails_palette.py b/vistrails/gui/vistrails_palette.py
new file mode 100644
index 0000000..abb47a6
--- /dev/null
+++ b/vistrails/gui/vistrails_palette.py
@@ -0,0 +1,122 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.common_widgets import QToolWindowInterface
+
+class QVistrailsPaletteInterface(QToolWindowInterface):
+    def __init__(self):
+        QToolWindowInterface.__init__(self)
+        self.controller = None
+        self.title = None
+        self.p_id = None
+        self.main_window = None
+ 
+    @classmethod
+    def instance(klass):
+        if not hasattr(klass, '_instance'):
+            klass._instance = klass()
+        return klass._instance
+
+    def toolWindow(self):
+        tool_window = QToolWindowInterface.toolWindow(self)
+        return tool_window
+
+    def set_id(self, p_id):
+        self.p_id = p_id
+
+    def get_id(self):
+        return self.p_id
+
+    def set_title(self, title):
+        self.setWindowTitle(title)
+
+    def get_title(self):
+        return str(self.windowTitle())
+
+    def set_action(self, action):
+        self.action = action
+        self.connect(self.toolWindow(), 
+                     QtCore.SIGNAL("visibilityChanged(bool)"),
+                     self.visibility_changed)
+
+    def get_action(self):
+        return self.action
+        # return self.toolWindow().toggleViewAction()
+
+    def get_action_tuple(self):
+        return (self.get_title(), self.get_title(), 
+                {'checkable': True, 
+                 'checked': self.toolWindow().isVisible(),
+                 'callback': self.set_visible})
+
+    def set_main_window(self, mw):
+        self.main_window = mw
+
+    def set_visible(self, enabled):
+        #print "set_visible ", self, enabled
+        if hasattr(self, 'main_window') and self.main_window is not None:
+            self.main_window.show()
+            self.main_window.raise_()
+
+        if enabled:
+            self.toolWindow().show()
+            self.toolWindow().raise_()
+            
+    def set_pin_status(self, pin_status):
+        self.toolWindow().setPinStatus(pin_status)
+    
+    def get_pin_status(self):
+        return self.toolWindow().pinStatus
+    
+    def set_controller(self, controller):
+        self.controller = controller
+
+    def get_controller(self):
+        return self.controller
+
+    def set_module(self, module):
+        self.module = module
+        
+    def get_module(self):
+        return self.module
+
+    def set_descriptor(self, descriptor):
+        self.descriptor = descriptor
+
+    def get_descriptor(self):
+        return self.descriptor
+
+    def visibility_changed(self, visible):
+        self.action.setChecked(visible)
diff --git a/vistrails/gui/vistrails_window.py b/vistrails/gui/vistrails_window.py
new file mode 100644
index 0000000..1ad99ce
--- /dev/null
+++ b/vistrails/gui/vistrails_window.py
@@ -0,0 +1,2695 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" The file describes a container widget consisting of a pipeline
+view and a version tree for each opened Vistrail """
+from PyQt4 import QtCore, QtGui
+import copy
+from itertools import izip
+import operator
+
+from vistrails.core import get_vistrails_application
+from vistrails.core.configuration import (get_vistrails_configuration,
+                                get_vistrails_persistent_configuration)
+from vistrails.core.db.locator import FileLocator, XMLFileLocator, DBLocator, \
+    UntitledLocator
+from vistrails.core.db.io import load_vistrail
+from vistrails.core.interpreter.cached import CachedInterpreter
+from vistrails.core.modules.module_registry import ModuleRegistry, \
+                                         ModuleRegistryException
+from vistrails.core.recent_vistrails import RecentVistrailList
+import vistrails.core.system
+import vistrails.core.db.action
+from vistrails.core.packagemanager import get_package_manager
+from vistrails.core.system import vistrails_default_file_type
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.thumbnails import ThumbnailCache
+from vistrails.core.collection import Collection
+from vistrails.core import debug
+
+from vistrails.gui.application import get_vistrails_application
+from vistrails.gui.preferences import QPreferencesDialog
+from vistrails.gui.base_view import BaseView
+from vistrails.gui.pipeline_view import QPipelineView
+from vistrails.gui.repository import QRepositoryDialog
+from vistrails.gui.theme import initializeCurrentTheme, CurrentTheme
+from vistrails.gui.utils import build_custom_window
+from vistrails.gui.vistrail_view import QVistrailView
+from vistrails.gui import merge_gui
+from vistrails.gui.vistrail_variables import QVistrailVariables
+from vistrails.gui.vistrails_palette import QVistrailsPaletteInterface
+from vistrails.gui.mashups.mashup_app import QMashupAppMainWindow
+from vistrails.gui.modules.constant_configuration import ConstantWidgetMixin
+from vistrails.gui.paramexplore.pe_view import QParamExploreView
+from vistrails.gui.mashups.alias_inspector import QAliasInspector
+from vistrails.gui.mashups.mashup_view import QMashupViewTab
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget
+from vistrails.db.services.io import SaveBundle
+import vistrails.db.services.vistrail
+from vistrails.db import VistrailsDBException
+
+class QBaseViewWindow(QtGui.QMainWindow):
+    def __init__(self, view=None, parent=None, f=QtCore.Qt.WindowFlags()):
+        QtGui.QMainWindow.__init__(self, parent, f)
+       
+        self.view = view
+
+        if self.view is not None:
+            self.setCentralWidget(view)
+            self.view.setVisible(True)
+        
+        self.create_actions_and_toolbar()
+        
+    def create_actions_and_toolbar(self):
+        self.create_actions()
+        self.init_toolbar()
+        
+    def closeEvent(self, event):
+        self.emit(QtCore.SIGNAL("viewWasClosed"), self.view)
+        event.accept()
+    
+    def init_toolbar(self):
+        pass
+    
+    def get_current_view(self):
+        if self.view is None:
+            return None
+        return self.view.vistrail_view
+    
+    def get_current_tab(self):
+        return self.view
+    
+    def get_current_scene(self):
+        return self.get_current_tab().scene()
+    
+    def get_current_controller(self):
+        if self.get_current_view() is None:
+            return None
+        return self.get_current_view().get_controller()
+    
+    def process_list(self, action_list, parent, qactions, qmenus):
+        for data in action_list:
+            if data == "---":
+                if parent is not None:
+                    parent.addSeparator()
+                continue
+            name, title, options = data
+            if isinstance(options, list):
+                # menu
+                if parent is not None:
+                    qmenu = parent.addMenu(title)
+                qmenus[name] = qmenu
+                self.process_list(options, qmenu, qactions, qmenus)
+            else:
+                qaction = QtGui.QAction(title, self)
+                callback = None
+                if 'callback' in options:
+                    callback = options['callback']
+                    del options['callback']
+                for option, value in options.iteritems():
+                    method = getattr(qaction, 'set%s' % \
+                                         option[0].capitalize() + \
+                                         option[1:])
+                    method(value)
+                qactions[name] = qaction
+                if parent is not None:
+                    parent.addAction(qaction)
+                if callback is not None:
+                    if 'checkable' in options and \
+                            options['checkable'] is True:
+                        self.connect(qaction, 
+                                     QtCore.SIGNAL("toggled(bool)"),
+                                     callback)
+                    else:
+                        self.connect(qaction, QtCore.SIGNAL("triggered()"),
+                                     callback)
+        
+    def init_action_list(self):
+        global _app
+        
+        self._actions = [("file", "&File",
+                   [("export", "Export",
+                      [('savePDF', "PDF...",
+                        {'statusTip': "Save the current view to a PDF file",
+                         'enabled': True,
+                         'callback': _app.pass_through(self.get_current_tab,
+                                                       'save_pdf')}),
+                       "---",
+                       ('saveWorkflow', "Workflow To XML...",
+                        {'statusTip': "Save the current workflow to a file",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_workflow',
+                                                       FileLocator())}),
+                       ('exportWorkflow', "Workflow to DB...",
+                        {'statusTip': "Save the current workflow to a database",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_workflow',
+                                                       DBLocator)})]),
+                       "---",
+                       ('close', "Close",
+                        {'shortcut': QtGui.QKeySequence.Close,
+                        'statusTip': "Close the current window",
+                         'enabled': True,
+                         'callback': self.close})]),
+                   ("edit", "&Edit",
+                    [("undo", "Undo",
+                      {'statusTip': "Undo the previous action",
+                       'shortcut': QtGui.QKeySequence.Undo,
+                       'callback': _app.pass_through(self.get_current_view,
+                                                     'undo'),
+                       'enabled': False}),
+                     ("redo", "Redo",
+                      {'statusTip': "Redo an undone action",
+                       'shortcut': QtGui.QKeySequence.Redo,
+                       'callback': _app.pass_through(self.get_current_view,
+                                                     'redo'),
+                       'enabled': False}),
+                     "---",
+                     ("copy", "Copy",
+                      {'statusTip': "Copy the selected modules in the " \
+                           "current pipeline view",
+                       'shortcut': QtGui.QKeySequence.Copy,
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'copySelection')}),
+                     ("paste", "Paste",
+                      {'statusTip': "Paste modules from the clipboard into " \
+                           "the current pipeline view",
+                       'shortcut': QtGui.QKeySequence.Paste,
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'pasteFromClipboard')}),
+                     ("selectAll", "Select All",
+                      {'statusTip': "Select all modules in the current " \
+                           "pipeline view",
+                       'enabled': True,
+                       'shortcut': QtGui.QKeySequence.SelectAll,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'selectAll')}),
+                     "---",
+                     ("controlFlowAssist", "Control Flow Assistant",
+                      {'callback': _app.pass_through(self.get_current_tab,
+                                                     'run_control_flow_assist'),
+                       'statusTip': "Create a loop over the selected modules",
+                       })]),
+                   ("run", "&Workflow",
+                    [("execute", "Execute",
+                      {'icon': CurrentTheme.EXECUTE_PIPELINE_ICON,
+                       'shortcut': 'Ctrl+Return',
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_view,
+                                                     'execute')}),
+                     ("stop_on_error", "Stop on first error",
+                      {'checkable': True,
+                       'callback': _app.set_stop_on_error}),
+                     ("flushCache", "Erase Cache Contents", 
+                      {'enabled': True,
+                       'callback': _app.flush_cache}),
+                     "---",
+                     ("layout", "Re-Layout",
+                      {'statusTip': "Move all modules to create a clean " \
+                           "layout for the workflow",
+                       'shortcut': 'Ctrl+L',
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'layout')}),
+                     ("group", "Group",
+                      {'statusTip': "Group the selected modules in the " \
+                           "current pipeline view",
+                       'shortcut': 'Ctrl+G',
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'group')}),
+                     ("ungroup", "Ungroup",
+                      {'statusTip': "Ungroup the selected groups in the " \
+                           "current pipeline view",
+                       'shortcut': 'Ctrl+Shift+G',
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'ungroup')}),
+                     ("showGroup", "Show Pipeline",
+                      {'statusTip': "Show the underlying pipeline for the " \
+                           "selected group in the current pipeline view",
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_view, 
+                                                     'show_group')}),
+                     "---",
+                     ("makeAbstraction", "Create Subworkflow",
+                      {'statusTip': "Create a subworkflow from the selected " \
+                           "modules",
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'makeAbstraction')}),
+                     ("convertToAbstraction", "Convert to Subworkflow",
+                      {'statusTip': "Convert selected group to a subworkflow",
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'convertToAbstraction')}),
+                     ("editAbstraction", "Edit Subworkflow",
+                      {'statusTip': "Edit a subworkflow",
+                       'enabled': False,
+                       'callback': _app.edit_abstraction}),
+                     ("importAbstraction", "Import Subworkflow",
+                      {'statusTip': "Import subworkflow from a vistrail to " \
+                           "local subworkflows",
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'importAbstraction')}),
+                     ("exportAbstraction", "Export Subworkflow",
+                      {'statusTip': "Export subworkflow from local " \
+                           "subworkflows for use in a package",
+                       'enabled': False,
+                       'callback': _app.pass_through(_app.get_current_scene,
+                                                     'exportAbstraction')}),
+                     "---",
+                     ("configureModule", "Configure Module...",
+                      {'shortcut': "Ctrl+E",
+                       'enabled': False,
+                       'callback': _app.configure_module}),
+                     ("documentModule", "Module Documentation...",
+                      {'enabled': False,
+                       'callback': _app.show_documentation})]),
+                   ("view", "&Views",
+                    [("zoomToFit", "Zoom To Fit",
+                      {'enabled': True,
+                       'shortcut': "Ctrl+R",
+                       'statusTip': "Fit current view to window",
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'zoomToFit')}),
+                     ("zoomIn", "Zoom In",
+                      {'enabled': True,
+                       'shortcut': QtGui.QKeySequence.ZoomIn,
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'zoomIn')}),
+                     ("zoomOut", "Zoom Out",
+                      {'enabled': True,
+                       'shortcut': QtGui.QKeySequence.ZoomOut,
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'zoomOut')})]),
+                   ("publish", "Publish",
+                    [("publishPaper", "To Paper...", 
+                      {'enabled': True,
+                       'statusTip': \
+                           "Embed workflow and results into a paper",
+                        'callback': _app.pass_through(self.get_current_view,
+                                                      'publish_to_paper')}),
+                     ("publishWeb", "To Wiki...",
+                      {'enabled': True,
+                       'statusTip': "Embed workflow in wiki",
+                       'callback' : _app.pass_through(self.get_current_view,
+                                                      'publish_to_web')}),
+                     ("publishCrowdLabs", "To crowdLabs...",
+                      {'enabled': True,
+                       'statusTip': "Publish workflows on crowdlabs.org",
+                       'callback': _app.publish_to_crowdlabs})]),
+                    ("window", "Window", 
+                      []),
+                   ("help", "Help",
+                    [("help", "About VisTrails...", 
+                      {'callback': _app.showAboutMessage}),
+                     ("checkUpdate", "Check for Updates", 
+                      {'callback': _app.showUpdatesMessage})])]
+                    
+    def create_actions(self):
+        self.init_action_list()
+
+        self.qactions = {}
+        self.qmenus = {}
+
+        menu_bar = self.menuBar()
+        #print 'menu_bar:', menu_bar
+        self.process_list(self._actions, menu_bar, self.qactions, self.qmenus)
+        #print 'done processing list'
+        
+class QVistrailViewWindow(QBaseViewWindow):
+    def __init__(self, view=None, parent=None, f=QtCore.Qt.WindowFlags()):
+        QBaseViewWindow.__init__(self, view, parent, f)
+        
+        self.setDocumentMode(True)
+        self.view = view
+
+        if self.view is not None:
+            self.setCentralWidget(view)
+            self.view.setVisible(True)
+            self.setWindowTitle('%s - VisTrails' % self.view.get_name())
+
+    def close_vistrail(self):
+        global _app
+        return _app.close_vistrail(self.view)
+        
+    def closeEvent(self, event):
+        if not self.close_vistrail():
+            event.ignore()
+        else:
+            self.emit(QtCore.SIGNAL("window_closed"), self.view)
+            event.accept()
+        
+    def get_current_controller(self):
+        return self.view.get_controller()
+
+    def get_current_view(self):
+        return self.view
+    
+    def get_current_tab(self):
+        return self.view.get_current_tab()
+
+    def get_current_scene(self):
+        return self.get_current_tab().scene()
+        
+    def init_toolbar(self):
+        def create_spacer():
+            spacer = QtGui.QWidget()
+            spacer.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, 
+                                  QtGui.QSizePolicy.Preferred)
+            return spacer
+        def create_separator():
+            sep = QtGui.QWidget()
+            sep.setMinimumWidth(50)
+            return sep
+
+        self.selected_mode = None
+        self.toolbar = QtGui.QToolBar(self)
+        
+        #left side
+        for action in [self.qactions[n] 
+                       for n in ['newVistrail', 'openFile', 'saveFile']]:
+            self.toolbar.addAction(action)
+        
+        self.toolbar.addWidget(create_spacer())
+        
+        #second group
+        self.view_action_group = QtGui.QActionGroup(self)
+        for action in [self.qactions[n] 
+                       for n in ['pipeline', 'history', 
+                                 'search', 'explore', 'provenance', 'mashup']]:
+            self.toolbar.addAction(action)
+            self.view_action_group.addAction(action)
+        self.toolbar.addWidget(create_separator())
+        # self.connect(self.view_action_group, 
+        #              QtCore.SIGNAL("triggered(QAction*)"),
+        #              self.view_triggered)
+        #third group
+        for action in [self.qactions[n] 
+                       for n in ['execute']]:
+            self.toolbar.addAction(action)
+            
+        
+        self.toolbar.addWidget(create_spacer())
+        self.toolbar.addWidget(create_spacer())
+        self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
+        self.addToolBar(self.toolbar)
+        self.setUnifiedTitleAndToolBarOnMac(True)
+
+    def set_title(self, title):
+        self.setWindowTitle('%s - VisTrails' % title)
+        
+    def get_name(self):
+        return self.windowTitle()
+
+    def set_name(self):
+        if self.view:
+            self.set_title(self.view.get_name())
+        else:
+            self.set_title('(empty)')
+
+    def build_packages_menu_from_main_app(self):
+        global _app
+        if len(self._package_menu_items) == 0:
+            self.qmenus['packages'].menuAction().setEnabled(True)
+            
+        for (pkg_id, d) in _app._package_menu_items.iteritems():
+            self._package_menu_items[pkg_id] = {}
+            for pkg_name,items in d['items']:
+                pkg_menu = self.qmenus['packages'].addMenu(str(pkg_name))
+                self._package_menu_items[pkg_id]['menu'] = pkg_menu
+                self._package_menu_items[pkg_id]['items'] = (pkg_name, items)
+                for item in items:
+                    (name, callback) = item
+                    action = QtGui.QAction(name, self,
+                                           triggered=callback)
+                    pkg_menu.addAction(action)
+
+    def init_action_list(self):
+        global _app
+        # This keeps track of the menu items for each package
+        self._package_menu_items = {}
+        
+        self.all_palette_actions =  _app.create_palette_actions()
+        tools_actions = []
+        palette_actions = []
+        for a,p in self.all_palette_actions:
+            if p.toolWindow().window() == _app.palette_window:
+                tools_actions.append(a)
+            else:
+                palette_actions.append(a)
+        
+        QBaseViewWindow.init_action_list(self)
+        #FIXME: 
+        #The menus that are different from the base class' menus are being 
+        # replaced in place. It would be much cleaner to create a function 
+        # to add/replace a menu item of a menu.
+        
+        self._actions[0] = ("file", "&File",
+                    [('newVistrail', "&New",
+                      {'icon': CurrentTheme.NEW_VISTRAIL_ICON,
+                       'shortcut': QtGui.QKeySequence.New,
+                       'statusTip': 'Create a new vistrail',
+                       'callback': _app.new_vistrail}),
+                     ('openFile', "&Open",
+                      {'icon': CurrentTheme.OPEN_VISTRAIL_ICON,
+                       'shortcut': QtGui.QKeySequence.Open,
+                       'statusTip': 'Open an existing vistrail from a file',
+                       'callback': _app.open_vistrail_default}),
+                     ("openRecent", "Open Recent", 
+                      []),
+                     ('saveFile', "&Save",
+                      {'icon': CurrentTheme.SAVE_VISTRAIL_ICON,
+                       'shortcut': QtGui.QKeySequence.Save,
+                       'statusTip': "Save the current vistrail to a file",
+                       'enabled': False,
+                       'callback': \
+                           _app.pass_through_locator(self.get_current_view,
+                                                     'save_vistrail')}),
+                     ('saveFileAs', "Save as...",
+                      {'shortcut': QtGui.QKeySequence.SaveAs,
+                       'statusTip': "Save the current vistrail to a " \
+                           "different file location",
+                       'enabled': False,
+                       'callback': \
+                           _app.pass_through_locator(self.get_current_view,
+                                                     'save_vistrail_as')}),
+                     ('saveToOther', "Save To DB...",
+                      {'statusTip': "Save the current vistrail to a " \
+                           "database",
+                       'enabled': True,
+                       'callback': \
+                           _app.pass_through_locator(self.get_current_view,
+                                                     'save_vistrail_as', 
+                                                     reverse=True)}),
+                     ('closeVistrail', "Close",
+                      {'shortcut': QtGui.QKeySequence.Close,
+                       'statusTip': "Close the current vistrail",
+                       'enabled': False,
+                       'callback': _app.close_vistrail}),
+                     "---",
+                     ("import", "Import",
+                      [('importFile', "From DB...",
+                        {'icon': CurrentTheme.OPEN_VISTRAIL_DB_ICON,
+                         'statusTip': "Import an existing vistrail " \
+                             "from a database",
+                         'callback': \
+                             _app.import_vistrail_default}),
+                       "---",
+                       ('importWorkflow', "Workflow...",
+                        {'statusTip': "Import a workflow from an XML file",
+                         'enabled': True,
+                         'callback': _app.import_workflow_default}),
+                       ('importWorkflowDB', "Workflow from DB...",
+                        {'statusTip': "Import a workflow from a database",
+                         'enabled': True,
+                         'callback': _app.import_workflow_from_db})]),
+                     ("export", "Export",
+                      [('exportFile', "To DB...",
+                        {'statusTip': "Export the current vistrail to a " \
+                             "database",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'export_vistrail', 
+                                                       reverse=True)}),
+                       ('exportStable', "To Stable Version...",
+                        {'statusTip': "Save vistrail as XML according to " \
+                             "the older (stable) schema",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'export_stable')}),
+                       "---",
+                       ('savePDF', "PDF...",
+                        {'statusTip': "Save the current view to a PDF file",
+                         'enabled': True,
+                         'callback': _app.pass_through(self.get_current_tab,
+                                                       'save_pdf')}),
+                       "---",
+                       ('saveWorkflow', "Workflow To XML...",
+                        {'statusTip': "Save the current workflow to a file",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_workflow',
+                                                       FileLocator())}),
+                       ('exportWorkflow', "Workflow to DB...",
+                        {'statusTip': "Save the current workflow to a database",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_workflow',
+                                                       DBLocator)}),
+                       "---",
+                       ('saveOpm', "OPM XML...",
+                        {'statusTip': "Save provenance according to the " \
+                             "Open Provenance Model in XML",
+                         'enabled': True,
+                         'callback': _app.pass_through(self.get_current_view,
+                                                       'save_opm')}),
+                       ('saveProv', "PROV Document...",
+                        {'statusTip': "Saves provenance according to " \
+                             "PROV-DM in XML",
+                         'enabled': True,
+                         'callback': _app.pass_through(self.get_current_view,
+                                                       'save_prov')}),
+                       ('saveLog', "Log to XML...",
+                        {'statusTip': "Save the execution log to a file",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_log',
+                                                       FileLocator())}),
+                       ('exportLog', "Log to DB...",
+                        {'statusTip': "Save the execution log to a database",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_log',
+                                                       DBLocator)}),
+                       "---",
+                       ('saveRegistry', "Registry to XML...",
+                        {'statusTip': "Save the current registry to a file",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_registry',
+                                                       FileLocator())}),
+                       ('exportRegistry', "Registry to DB...",
+                        {'statusTip': "Save the current registry to a database",
+                         'enabled': True,
+                         'callback': \
+                             _app.pass_through_locator(self.get_current_view,
+                                                       'save_registry',
+                                                       DBLocator)})]),
+                     "---",
+                     ('quitVistrails', "Quit",
+                      {'shortcut': QtGui.QKeySequence.Quit,
+                       'statusTip': "Exit VisTrails",
+                       'callback': _app.quit})])
+        
+        self._actions[1] = ("edit", "&Edit",
+                    [("undo", "Undo",
+                      {'statusTip': "Undo the previous action",
+                       'shortcut': QtGui.QKeySequence.Undo,
+                       'callback': _app.pass_through(self.get_current_view,
+                                                     'undo'),
+                       'enabled': False}),
+                     ("redo", "Redo",
+                      {'statusTip': "Redo an undone action",
+                       'shortcut': QtGui.QKeySequence.Redo,
+                       'callback': _app.pass_through(self.get_current_view,
+                                                     'redo'),
+                       'enabled': False}),
+                     "---",
+                     ("copy", "Copy",
+                      {'statusTip': "Copy the selected modules in the " \
+                           "current pipeline view",
+                       'shortcut': QtGui.QKeySequence.Copy,
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'copySelection')}),
+                     ("paste", "Paste",
+                      {'statusTip': "Paste modules from the clipboard into " \
+                           "the current pipeline view",
+                       'shortcut': QtGui.QKeySequence.Paste,
+                       'enabled': False,
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'pasteFromClipboard')}),
+                     ("selectAll", "Select All",
+                      {'statusTip': "Select all modules in the current " \
+                           "pipeline view",
+                       'enabled': True,
+                       'shortcut': QtGui.QKeySequence.SelectAll,
+                       'callback': _app.pass_through(self.get_current_scene,
+                                                     'selectAll')}),
+                     "---",
+                     ("controlFlowAssist", "Control Flow Assistant",
+                      {'callback': _app.pass_through(self.get_current_tab,
+                                                     'run_control_flow_assist'),
+                       'statusTip': "Create a loop over the selected modules",
+                       }),
+                     ("merge", "Merge with...", 
+                      []),
+                     "---",
+                     ("editPreferences", "Preferences...",
+                      {'statusTip': "Edit system preferences",
+                       'enabled': True,
+                       'shortcut': QtGui.QKeySequence.Preferences,
+                       'callback': _app.showPreferences}),
+                     ])
+        self._actions.insert(3, ("vistrail", "Vis&trail",
+                    [("tag", "Tag...",
+                      {'statusTip': "Tag the current pipeline",
+                       'shortcut': "Ctrl+Shift+T",
+                       'enabled': True,
+                       'callback': _app.add_tag}),
+                     "---",
+                     ("reLayout", "Re-Layout",
+                      {'statusTip': "Re-layouts the version tree",
+                       'enabled': True,
+                       'callback': \
+                           _app.pass_through(self.get_current_controller,
+                                             'invalidate_version_tree')}),
+                     ("expandBranch", "Expand Branch",
+                      {'statusTip': "Expand all versions in the tree below " \
+                           "the current version",
+                       'enabled': True,
+                       'callback': \
+                           _app.pass_through(self.get_current_controller,
+                                             'expand_all_versions_below')}),
+                     ("collapseBranch", "Collapse Branch",
+                      {'statusTip': "Collapse all expanded versions of the " \
+                           "tree",
+                       'enabled': True,
+                       'callback': \
+                           _app.pass_through(self.get_current_controller,
+                                             'collapse_all_versions_below')}),
+                     ("collapseAll", "Collapse All",
+                      {'statusTip': "Collapse all expanded branches of the " \
+                           "tree",
+                       'enabled': True,
+                       'callback': \
+                           _app.pass_through(self.get_current_controller,
+                                             'collapse_all_versions')}),
+                     ("hideBranch", "Hide Branch",
+                      {'statusTip': "Hide all versions in the tre including " \
+                           "and below the current version",
+                       'enabled': True,
+                       'callback': \
+                           _app.pass_through(self.get_current_controller,
+                                             'hide_versions_below')}),
+                     ("showAll", "Show All",
+                      {'enabled': True,
+                       'statusTip': "Show all hidden versions",
+                       'callback': \
+                           _app.pass_through(self.get_current_controller,
+                                             'show_all_versions')})]))
+        
+        self._actions[4] = ("view", "&Views",
+                    [("newView", "New Pipeline View",
+                      {'shortcut': QtGui.QKeySequence.AddTab,
+                       'enabled': True,
+                       'statusTip': "Create a new pipeline view",
+                       'callback': _app.pass_through(self.get_current_view,
+                                                     'add_pipeline_view')}),
+                     ("newDiff", "New Visual Difference",
+                      {'enabled': True,
+                       'statusTip': "Create a new visual difference for two" \
+                           "pipelines",
+                       'callback': _app.new_diff}),
+                     "---",
+                     ("zoomToFit", "Zoom To Fit",
+                      {'enabled': True,
+                       'shortcut': "Ctrl+R",
+                       'statusTip': "Fit current view to window",
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'zoomToFit')}),
+                     ("zoomIn", "Zoom In",
+                      {'enabled': True,
+                       'shortcut': QtGui.QKeySequence.ZoomIn,
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'zoomIn')}),
+                     ("zoomOut", "Zoom Out",
+                      {'enabled': True,
+                       'shortcut': QtGui.QKeySequence.ZoomOut,
+                       'callback': _app.pass_through(self.get_current_tab,
+                                                     'zoomOut')}),
+                     "---",
+                     ("pipeline", "Pipeline",
+                      {'icon': CurrentTheme.PIPELINE_ICON,
+                       'checkable': True,
+                       'checked': True,
+                       'callback': \
+                           _app.pass_through_bool(self.get_current_view,
+                                                  'pipeline_change')}),
+                     ("history", "History",
+                      {'icon': CurrentTheme.HISTORY_ICON,
+                       'checkable': True,
+                       'checked': False,
+                       'callback': \
+                           _app.pass_through_bool(self.get_current_view,
+                                                  'history_change')}),
+                     ("search", "Search",
+                      {'icon': CurrentTheme.QUERY_ICON,
+                       'checkable': True,
+                       'checked': False,
+                       'callback': \
+                           _app.pass_through_bool(self.get_current_view,
+                                                  'search_change')}),
+                     ("explore", "Explore",
+                      {'icon': CurrentTheme.EXPLORE_ICON,
+                       'checkable': True,
+                       'checked': False,
+                       'callback': \
+                           _app.pass_through_bool(self.get_current_view,
+                                                  'explore_change')}),
+                     ("provenance", "Provenance",
+                      {'icon': CurrentTheme.PROVENANCE_ICON,
+                       'checkable': True,
+                       'checked': False,
+                       'callback': \
+                           _app.pass_through_bool(self.get_current_view,
+                                                  'provenance_change')}),
+                    ("mashup", "Mashup",
+                      {'icon': CurrentTheme.MASHUP_ICON,
+                       'checkable': True,
+                       'checked': False,
+                       'enabled': False,
+                       'callback': \
+                           _app.pass_through_bool(self.get_current_view,
+                                                  'mashup_change')}),
+                     "---"] +
+                    palette_actions + 
+                    ["---"] + 
+                    tools_actions + 
+                    ["---", 
+                     ("dockPalettes", "Dock Palettes", 
+                      {'enabled': True,
+                       'statusTip': "Dock palettes on active window",
+                       'callback': _app.dock_palettes})])
+        self._actions.insert(6, ("packages", "Packages", 
+                                     []))
+    
+    def create_actions(self):
+        """ createActions() -> None 
+
+        Construct all menu/toolbar actions for window.
+
+        """
+        global _app
+
+        # format of each item in the list is:
+        # item: reference, title, options
+        # where options is either a list of subitems or
+        # a dictionary of options to be set for an action
+        # Also, "---" denotes a separator
+
+        is_main_window = False
+        if self == _app:
+            is_main_window = True
+
+        #global _global_menubar
+        
+        # palettes = []
+        # palette_actions = []
+
+        self.init_action_list()
+
+        self.qactions = {}
+        self.qmenus = {}
+
+        #if is_main_window and core.system.systemType in ['Darwin']:
+            # menu_bar = QtGui.QMenuBar()
+            #_global_menubar = menu_bar
+        #else:
+        menu_bar = self.menuBar()
+        #print 'menu_bar:', menu_bar
+        self.process_list(self._actions, menu_bar, self.qactions, self.qmenus)
+        #print 'done processing list'
+        
+        if is_main_window:
+            for action_tuple, palette in self.all_palette_actions:
+                palette.set_action(self.qactions[action_tuple[0]])
+            _app.connect_package_manager_signals()
+        else:
+            self.build_packages_menu_from_main_app()
+
+        self.qactions['stop_on_error'].setChecked(
+                getattr(get_vistrails_configuration(), 'stopOnError'))
+
+        # view_menu = self.qmenus["view"]
+        # for action_name, action in self.create_palette_actions():
+        #     self.qactions[action_name] = action
+        #     view_menu.addAction(action)
+
+class QVistrailsWindow(QVistrailViewWindow):
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        global _app
+        _app = self
+
+        QVistrailViewWindow.__init__(self, None, parent, f)
+
+        self.stack = QtGui.QStackedWidget()
+        self.vistrail_widgets = []
+        self.setCentralWidget(self.stack)        
+        self.auto_view = True
+
+        self._focus_owner = None
+        self._previous_view = None
+        self._is_quitting = False
+        self._first_view = True
+        self.connect(QtGui.QApplication.clipboard(),
+                     QtCore.SIGNAL('dataChanged()'),
+                     self.clipboard_changed)
+        self.connect(QtGui.QApplication.instance(), 
+                     QtCore.SIGNAL("focusChanged(QWidget*,QWidget*)"),
+                     self.applicationFocusChanged)
+
+        self.preferencesDialog = QPreferencesDialog(self)
+
+        # To track the current view we need to track all mouse clicks
+        builder = self
+        class FocusEvent(QtGui.QWidget):
+            def __init__(self):
+                QtGui.QWidget.__init__(self)
+                self.old_focus = None
+                self.vt_app = get_vistrails_application()
+            def eventFilter(self, object, event):
+                if event.type() == QtCore.QEvent.MouseButtonPress:
+                    # object may be the old one when this window gets focus
+                    object = self.vt_app.widgetAt(QtGui.QCursor.pos())
+                    if object != self.old_focus:
+                        builder.applicationFocusChanged(self.old_focus, object)
+                        self.old_focus = object
+                return False
+        self.focusEvent = FocusEvent()
+        self.focusEvent.vt_app.installEventFilter(self.focusEvent)
+
+        if get_vistrails_configuration().detachHistoryView:
+            self.history_view = QBaseViewWindow(parent=None)
+            self.history_view.resize(800, 600)
+            from vistrails.gui.version_prop import QVersionProp
+            inst = QVersionProp.instance().toolWindow()
+            self.history_view.addDockWidget(QtCore.Qt.RightDockWidgetArea,inst)
+            self.history_view.stack = QtGui.QStackedWidget()
+            self.history_view.setCentralWidget(self.history_view.stack)
+            self.history_view.show()
+            self.history_view.move(self.rect().center())
+            self.history_view.setWindowTitle('Version Tree')
+
+    def create_actions_and_toolbar(self):
+        self.current_view = None
+        self.windows = {}
+        self.base_view_windows = {}
+        self.notifications = {}
+        self.view_notifications = {}
+        self.view_notifications[-1] = {}
+        self.action_links = {}
+        self.dbDefault = False
+
+        self.init_palettes()
+        self.create_menus()
+        self.setup_recent_vistrails()
+        self.init_toolbar()
+
+    def create_view(self, vistrail, locator,  abstraction_files=None, 
+                    thumbnail_files=None, mashups=None):
+        view = QVistrailView(vistrail, locator, abstraction_files,
+                             thumbnail_files, mashups)
+        self.vistrail_widgets.append(view)
+        index = self.stack.addWidget(view)
+        self.stack.setCurrentIndex(index)
+        self.view_notifications[view] = {}
+        for notification_id, method_list in \
+                view.get_notifications().iteritems():
+            for method in method_list:
+                self.register_notification(notification_id, method, True, view)
+        return view
+
+    def remove_view(self, view):
+        from vistrails.gui.collection.workspace import QWorkspaceWindow
+        if view not in self.windows:
+            if view in self.view_notifications:
+                del self.view_notifications[view]
+            self.stack.removeWidget(view)
+        else:
+            window = self.windows[view]
+            window.close()
+        QWorkspaceWindow.instance().remove_vt_window(view)
+        self.current_view = None
+
+    def view_triggered(self, action):
+        #print "VIEW_TRIGGERED", action
+        if self.selected_mode == action:
+            if action is not None:
+                #print "SETTING CHECKED FALSE"
+                action.setChecked(False)
+            self.selected_mode = None
+        else:
+            self.selected_mode = action
+        current_view = self.stack.currentWidget()
+        current_view.tab_state[current_view.tabs.currentIndex()] = \
+            self.selected_mode
+        current_view.view_changed()
+
+    def action_triggered(self, action):
+        if self.selected_mode is not None:
+            self.selected_mode.un_method()
+        if self.selected_mode != action:
+            self.selected_mode = action
+            if action is not None:
+                action.method()
+        elif self.selected_mode is not None:
+            self.selected_mode = None
+            action.setChecked(False)
+        current_view = self.stack.currentWidget()
+        current_view.tab_state[current_view.tabs.currentIndex()] = \
+            self.selected_mode
+        current_view.view_changed()
+
+    # enumeration for dock areas
+    (UPPER_LEFT_DOCK_AREA, LOWER_LEFT_DOCK_AREA, RIGHT_DOCK_AREA,
+     UTILITY_WINDOW_AREA) = range(4)
+    DOCK_AREA_MAP = {UPPER_LEFT_DOCK_AREA: QtCore.Qt.LeftDockWidgetArea,
+                     LOWER_LEFT_DOCK_AREA: QtCore.Qt.LeftDockWidgetArea,
+                     RIGHT_DOCK_AREA: QtCore.Qt.RightDockWidgetArea,
+                     UTILITY_WINDOW_AREA: QtCore.Qt.NoDockWidgetArea}
+
+    def init_palettes(self):
+        # palettes are global!
+        from vistrails.gui.debug import DebugView
+        from vistrails.gui.job_monitor import QJobView
+        from vistrails.gui.debugger import QDebugger
+        from vistrails.gui.module_configuration import QModuleConfiguration
+        from vistrails.gui.module_documentation import QModuleDocumentation
+        from vistrails.gui.module_palette import QModulePalette
+        from vistrails.gui.module_info import QModuleInfo
+        from vistrails.gui.paramexplore.param_view import QParameterView
+        from vistrails.gui.paramexplore.pe_inspector import QParamExploreInspector
+        from vistrails.gui.shell import QShellDialog
+        from vistrails.gui.version_prop import QVersionProp
+        from vistrails.gui.vis_diff import QDiffProperties
+        from vistrails.gui.collection.explorer import QExplorerWindow
+        from vistrails.gui.collection.workspace import QWorkspaceWindow
+        from vistrails.gui.collection.vis_log import QLogDetails
+        from vistrails.gui.mashups.mashups_inspector import QMashupsInspector
+        from vistrails.gui.mashups.alias_parameter_view import QAliasParameterView
+        from vistrails.gui.publishing import QLatexAssistant, QVersionEmbed
+        self.palettes = []
+        self.palette_window = None
+        
+        self.palette_layout = \
+            [(self.UPPER_LEFT_DOCK_AREA,
+              [((QWorkspaceWindow,True),
+                (('search_changed', 'updateSearchResults'),
+                 ('execution_updated', 'execution_updated'),
+                 ('state_changed', 'state_changed')))]),
+             (self.LOWER_LEFT_DOCK_AREA,
+              [(QModulePalette, True),
+               ((QParamExploreInspector, False),
+                (('pipeline_changed', 'set_pipeline'),
+                 ('exploration_changed', 'set_exploration'),
+                 ('controller_changed', 'set_controller'))),
+               ((QMashupsInspector, False),
+                (('controller_changed', 'updateVistrailController'),
+                 ('mshpcontroller_changed', 'updateMshpController'),
+                 ('mshpversion_changed', 'updateMshpVersion'),
+                 ('version_changed', 'updateVistrailVersion')))]),
+             (self.RIGHT_DOCK_AREA,
+              [((QModuleInfo, True),
+                (('controller_changed', 'set_controller'),
+                 ('module_changed', 'update_module'),
+                 ('entry_klass_changed', 'update_entry_klass'))),
+               ((QVersionProp, True),
+                (('controller_changed', 'updateController'),
+                 ('version_changed', 'updateVersion'))),
+               ((QDiffProperties, False),
+                (('controller_changed', 'set_controller'),
+                 ('module_changed', 'update_module'))),
+               ((QParameterView, False),
+                (('controller_changed', 'set_controller'),
+                 ('pipeline_changed', 'set_pipeline'))),
+               ((QLogDetails, False),
+                (('controller_changed', 'set_controller'),
+                 ('execution_updated', 'execution_updated'),
+                 ('execution_changed', 'execution_changed'))),
+               ((QAliasParameterView, False),
+                (('mshpcontroller_changed', 'updateMshpController'),
+                 ('mshpversion_changed', 'updateMshpVersion'))),
+               ((QVistrailVariables, False),
+                (('controller_changed', 'updateController'),))]),
+             (self.UTILITY_WINDOW_AREA,
+              [((QModuleConfiguration, True),
+                (('controller_changed', 'set_controller'),
+                 ('module_changed', 'updateModule'))),
+               ((QModuleDocumentation, True),
+                (('controller_changed', 'set_controller'),
+                 ('module_changed', 'update_module'),
+                 ('descriptor_changed', 'update_descriptor'))),
+               ((QShellDialog, True),
+                (('controller_changed', 'set_controller'),)),
+               ((QDebugger, True),
+                (('controller_changed', 'set_controller'),)),
+               (DebugView, True),
+               (QJobView, True),
+               (QExplorerWindow, True),
+#               ((QLatexAssistant, True),
+#                (('controller_changed', 'set_controller'),)),
+               ((QVersionEmbed, True),
+                (('controller_changed', 'set_controller'),
+                 ('vistrail_saved', 'updateEmbedText'),
+                 ('version_changed', 'updateVersion')))])]
+        
+        left_added = None
+        self.palette_window = QPaletteMainWindow()
+        self.palette_window.setWindowTitle('VisTrails - Tools')
+        self.palette_window.setGeometry(200, 200, 768, 512)
+        self.palette_window.setDocumentMode(True)
+        for dock_area, p_group in self.palette_layout:
+            first_added = None
+            for p_klass in p_group:
+                notifications = []
+                if isinstance(p_klass, tuple):
+                    p_klass, visible = p_klass
+                    if isinstance(p_klass, tuple):
+                        notifications = visible
+                        p_klass, visible = p_klass      
+                #print "generating instance", p_klass
+                palette = p_klass.instance()
+                #print 'palette:', palette
+                self.palettes.append(palette)
+                for n_tuple in notifications:
+                    #print "n_tuple:", n_tuple
+                    if isinstance(n_tuple, tuple):
+                        if len(n_tuple) > 1:
+                            n_id, method_name = n_tuple
+                        else:
+                            n_id = n_tuple[0]
+                            method_name = n_tuple[0]
+                    else:
+                        n_id = n_tuple
+                        method_name = n_tuple
+                    method = getattr(palette, method_name)
+                    self.register_notification(n_id, method)
+
+                # palette.toolWindow().show()
+                # palette.toolWindow().setFloating(True)
+                if dock_area != self.UTILITY_WINDOW_AREA:
+                    palette.set_pin_status(visible)
+                    qt_dock_area = self.DOCK_AREA_MAP[dock_area]
+                    if first_added is None:
+                        if qt_dock_area == QtCore.Qt.LeftDockWidgetArea and \
+                                left_added is not None:
+                            if dock_area == self.UPPER_LEFT_DOCK_AREA:
+                                self.splitDockWidget(palette.toolWindow(),
+                                                     left_added,
+                                                     QtCore.Qt.Vertical)
+                            else:
+                                self.splitDockWidget(left_added,
+                                                     palette.toolWindow(),
+                                                     QtCore.Qt.Vertical)
+                        else:
+                            self.addDockWidget(qt_dock_area,
+                                               palette.toolWindow())
+                        first_added = palette.toolWindow()
+                        if qt_dock_area == QtCore.Qt.LeftDockWidgetArea and \
+                                left_added is None:
+                            left_added = first_added
+                    else:   
+                        self.tabifyDockWidget(first_added, palette.toolWindow())
+                    if not visible:
+                        palette.toolWindow().close()
+                else:
+                    self.palette_window.addPalette(palette)
+                    palette.set_main_window(self.palette_window)
+                    
+        if self.palette_window:
+            self.palette_window.hide()
+                        
+        self.connect(QWorkspaceWindow.instance(), 
+                     QtCore.SIGNAL("vistrailChanged(PyQt_PyObject)"),
+                     self.change_view)
+        self.connect(QWorkspaceWindow.instance(), 
+                     QtCore.SIGNAL("detachVistrail"),
+                     self.detach_view)
+
+    def dock_palettes(self, window=None):
+        if not window:
+            window = QtGui.QApplication.activeWindow()
+        if window == self or window in self.windows.values():
+            left_first_added = None
+            right_first_added = None
+            for dock_area, p_group in self.palette_layout:
+                for p_klass in p_group:
+                
+                    if isinstance(p_klass, tuple):
+                        p_klass, visible = p_klass
+                        if isinstance(p_klass, tuple):
+                            notifications = visible
+                            p_klass, visible = p_klass      
+                    palette = p_klass.instance()
+                    if dock_area == QtCore.Qt.RightDockWidgetArea:
+                        pin_status = palette.get_pin_status()
+                        palette.toolWindow().setParent(window)
+                        if right_first_added is None:
+                            window.addDockWidget(dock_area, palette.toolWindow())
+                            right_first_added = palette.toolWindow()
+                        else:
+                            window.tabifyDockWidget(right_first_added, palette.toolWindow())
+                    elif dock_area == QtCore.Qt.LeftDockWidgetArea:
+                        pin_status = palette.get_pin_status()
+                        palette.toolWindow().setParent(window)
+                        if left_first_added is None:
+                            window.addDockWidget(dock_area, palette.toolWindow())
+                            left_first_added = palette.toolWindow()
+                        else:
+                            window.tabifyDockWidget(left_first_added, palette.toolWindow())
+                    if not visible:
+                        palette.toolWindow().close()
+                    else:
+                        palette.toolWindow().show()
+                        
+    def create_notification(self, notification_id, link_view=False, view=None):
+        vt_app = get_vistrails_application()
+        vt_app.create_notification(notification_id, self, view)
+        # if link_view:
+        #     if view is not None:
+        #         notifications = self.view_notifications[view]
+        # else:
+        #     notifications = self.notifications
+        # if notification_id not in notifications:
+        #     notifications[notification_id] = set()
+        # else:
+        #     print "already added notification", notification_id
+
+    def register_notification(self, notification_id, method, link_view=False,
+                              view=None):
+        vt_app = get_vistrails_application()
+        vt_app.register_notification(notification_id, method, self, view)
+        # if link_view:
+        #     if view is not None:
+        #         notifications = self.view_notifications[view]
+        #         #print '>>> LOCAL adding notification', notification_id, view, method
+        #     #print id(notifications), notifications
+        #     #for n, o in notifications.iteritems():
+        #     #    print "    ", n , "(%s)"%len(o)
+        #     #    for m in o:
+        #     #        print "        ", m
+        # else:
+        #     notifications = self.notifications     
+        #     #print '>>> GLOBAL adding notification', notification_id, method  
+        #     #print id(notifications), notifications
+        # if notification_id not in notifications:
+        #     self.create_notification(notification_id, link_view, view)
+        # notifications[notification_id].add(method)
+
+    def unregister_notification(self, notification_id, method, link_view=False,
+                                view=None):
+        vt_app = get_vistrails_application()
+        vt_app.unregister_notification(notification_id, method, self, view)
+        
+#         if link_view:
+#             notifications = {}
+#             if view in self.view_notifications:
+#                 notifications = self.view_notifications[view]
+#                 #print '>>> LOCAL remove notification', notification_id, view
+            
+#             #print id(notifications), notifications
+# #            for n, o in notifications.iteritems():
+# #                print "    ", n , "(%s)"%len(o)
+# #                for m in o:
+# #                    print "        ", m
+#         else:
+#             notifications = self.notifications    
+#             #print '>>> GLOBAL remove notification', notification_id, method   
+#             #print id(notifications), notifications           
+#         if notification_id in notifications:
+#             notifications[notification_id].remove(method)
+
+    def notify(self, notification_id, *args):
+        vt_app = get_vistrails_application()
+        vt_app.send_notification(notification_id, *args)
+
+        # # do global notifications
+        # if notification_id in self.notifications:
+        #     print 'global notification ', notification_id
+        #     for m in self.notifications[notification_id]:
+        #         try:
+        #             #print "  m: ", m
+        #             m(*args)
+        #         except Exception, e:
+        #             import traceback
+        #             traceback.print_exc()
+        # notifications = {}
+        # # do local notifications
+        # if self.current_view in self.view_notifications:
+        #     notifications = self.view_notifications[self.current_view]
+        #     print 'local notification ', notification_id, self.current_view
+                
+        # if notification_id in notifications:
+        #     for m in notifications[notification_id]:
+        #         try:
+        #             #print "  m: ", m
+        #             m(*args)
+        #         except Exception, e:
+        #             import traceback
+        #             traceback.print_exc()
+
+    def clipboard_changed(self):
+        self.notify("clipboard_changed")
+
+    def set_action_links(self, action_links, obj, view):
+        link_list = []
+        def get_method(_qaction, _check):
+            def do_check_and_set(*args, **kwargs):
+                _qaction.setEnabled(_check(*args, **kwargs))
+            return do_check_and_set
+        for action, (notification_id, check) in action_links.iteritems():
+            window = obj.window()
+            if isinstance(window, BaseView):
+                window = window.vistrail_view.window()
+            if action in window.qactions:
+                qaction = window.qactions[action]
+                method = get_method(qaction, check)
+                notification = (notification_id, method, True, view)
+                self.register_notification(*notification)
+                link_list.append(notification)
+        self.action_links[id(obj)] = link_list
+    
+    def unset_action_links(self, obj):
+        if id(obj) in self.action_links:
+            for notification in self.action_links[id(obj)]:
+                self.unregister_notification(*notification)
+        
+    def set_action_defaults(self, obj):
+        window = obj.window()
+        if isinstance(window, BaseView):
+            window = window.vistrail_view.window()
+        qactions = window.qactions
+        for action, mlist in obj.action_defaults.iteritems():
+            if action in qactions:
+                qaction = qactions[action]
+                for (method, is_callback, value) in mlist:
+                    if is_callback:
+                        getattr(qaction, method)(value())
+                    else:
+                        getattr(qaction, method)(value)
+            
+    def set_name(self):
+        widget = self.stack.currentWidget()
+        if widget:
+            self.set_title(widget.get_name())
+        else:
+            self.set_title('(empty)')
+
+    # def action_triggered(self, action):
+    #     if self.selected_mode is not None:
+    #         self.selected_mode.un_method()
+    #     if self.selected_mode != action:
+    #         self.selected_mode = action
+    #         if action is not None:
+    #             action.method()
+    #     elif self.selected_mode is not None:
+    #         self.selected_mode = None
+    #         action.setChecked(False)
+    #     current_view = self.stack.currentWidget()
+    #     current_view.tab_state[current_view.tabs.currentIndex()] = \
+    #         self.selected_mode
+    #     current_view.view_changed()
+
+    # def create_pass_actions(self):
+    #     actions = ['history_selected', 'history_unselected',
+    #                'query_selected', 'query_unselected',
+    #                'explore_selected', 'explore_unselected']
+    #     def create_action(action_str):
+    #         def new_action():
+    #             getattr(self.stack.currentWidget(), action_str)()
+    #         return new_action
+    #     for action_str in actions:
+    #         method = create_action(action_str)
+    #         setattr(self, action_str, method)
+
+    def sizeHint(self):
+        return QtCore.QSize(1280, 768)
+
+    def create_first_vistrail(self):
+        #print 'calling create_first_vistrail'
+        if self.get_current_view():
+            return
+        if not self.dbDefault:
+            untitled_temps = UntitledLocator.all_untitled_temporaries()
+            if len(untitled_temps) > 0:
+                if FileLocator.prompt_autosave(self):
+                    for locator in untitled_temps:
+                        self.open_vistrail(locator)
+                    return
+                else:
+                    for locator in untitled_temps:
+                        locator.clean_temporaries()
+        self._first_view = None
+        self.new_vistrail(True)
+        self._first_view = self.get_current_view()
+
+    def change_view(self, view):
+        #print 'changing view', id(view), view
+        if isinstance(view, QVistrailView) or view is None:
+            if view and view not in self.windows:
+                if self.stack.currentWidget() != view:
+                    self.stack.setCurrentWidget(view)
+                    view.reset_tab_state()
+            self.view_changed(view)
+            if view and get_vistrails_configuration().detachHistoryView:
+                self.history_view.stack.setCurrentIndex(view.version_index)
+                self.history_view.view = view.controller
+        else:
+            debug.warning("change_view() got a wrong view type:'%s'"%view)            
+
+    def detach_view(self, view):
+        if view not in self.windows:
+            index = self.stack.indexOf(view)
+            self.stack.removeWidget(view)
+            window = QVistrailViewWindow(view, parent=None)
+            self.windows[view] = window
+            self.connect(window, QtCore.SIGNAL("window_closed"),
+                         self.window_closed)
+            window.qactions['history'].setChecked(True)
+            window.show()
+            # this is needed to make dropping modules work
+            self.dock_palettes(window)
+            self.dock_palettes(self)
+            self.view_changed(view)
+        else:
+            self.view_changed(view)
+
+    def attach_view(self, view=None):
+        if not view:
+            view = self.current_view
+        if view not in self.windows:
+            return
+        window = view.window()
+        self.disconnect(window, QtCore.SIGNAL("window_closed"),
+                        self.window_closed)
+        self.stack.addWidget(view)
+        del self.windows[view]
+        # disable save_vistrail call
+        window.closeEvent = lambda event: event.accept()
+        window.close()
+        self.stack.setCurrentWidget(view)
+        self.view_changed(view)
+            
+    def window_closed(self, view):
+        if view in self.windows:
+            del self.windows[view]
+            
+    def view_changed(self, new_view):
+        """ Updates the controller when the view changes and 
+            updates buttons when """
+        if self.current_view != new_view:
+            self.current_view = new_view
+            if new_view is not None:
+                self.notify('controller_changed', new_view.get_controller())
+                if new_view.current_tab:
+                    self.set_action_defaults(new_view.current_tab)
+        
+        if new_view is not None:
+            window = None
+            if new_view in self.windows:
+                window = self.windows[new_view]
+            if window is None:
+                if self.current_view.has_changes():
+                    self.qactions['saveFile'].setEnabled(True)
+                    # un-remember first view when it is changed
+                    if self._first_view:
+                        self._first_view = None
+                else:
+                    self.qactions['saveFile'].setEnabled(False)
+                self.qactions['saveFileAs'].setEnabled(True)
+                self.qactions['closeVistrail'].setEnabled(True)
+            else:
+                window.set_name()
+                window.activateWindow()
+                window.raise_()
+                if self.current_view.has_changes():
+                    window.qactions['saveFile'].setEnabled(True)
+                else:
+                    window.qactions['saveFile'].setEnabled(False)
+                window.qactions['saveFileAs'].setEnabled(True)
+                window.qactions['closeVistrail'].setEnabled(True)
+        else:
+            self.qactions['saveFile'].setEnabled(False)
+            self.qactions['saveFileAs'].setEnabled(False)
+            self.qactions['closeVistrail'].setEnabled(False)
+
+        from vistrails.gui.collection.workspace import QWorkspaceWindow
+        QWorkspaceWindow.instance().change_vt_window(new_view)
+        self.update_merge_menu()
+        self.update_window_menu()
+        self.update_recent_vistrail_menu()
+        self.set_name()
+
+    def reset_toolbar_for_view(self, view):
+        if view:
+            window = view.window()
+        else:
+            window = self
+        for action in window.view_action_group.actions():
+            action.setChecked(False)
+            
+    def state_changed(self, view):
+        """ state for the view changed so we need to update buttons"""
+        self.view_changed(view)
+
+    def new_vistrail(self, recover_files=False):
+        # if self.single_document_mode and self.currentView():
+        #     if not self.closeVistrail():
+        #         return None
+        self._first_view = None
+
+        locator = None
+        if recover_files:
+            untitled_temps = UntitledLocator.all_untitled_temporaries()
+            if len(untitled_temps) > 0:
+                # FIXME how do we choose which one? -- really should open all
+                locator = untitled_temps[0]
+
+        # try:
+        #     (vistrail, abstraction_files, thumbnail_files) = load_vistrail(locator)
+        # except ModuleRegistryException, e:
+        #     debug.critical("Module registry error for %s" %
+        #                    str(e.__class__.__name__), str(e))
+        # except Exception, e:
+        #     debug.critical('An error has occurred', str(e))
+        #     raise
+        # return self.set_vistrail_view(vistrail, locator, abstraction_files,
+        #                               thumbnail_files)
+        
+        self.open_vistrail(locator)
+        self.qactions['pipeline'].trigger()
+
+    def close_first_vistrail_if_necessary(self):
+        # Close first vistrail of no change was made
+        if not self._first_view:
+            return
+        if self._first_view is True:
+            view = self.get_current_view()
+            if not view:
+                return
+            vt = view.controller.vistrail
+        else:
+            vt = self._first_view.controller.vistrail
+        if vt.get_version_count() == 0:
+            #print "closing first vistrail"
+            self.close_vistrail(self._first_view)
+            self._first_view = None
+        else:
+            # We set it to none, since it's been changed, so
+            # we don't want to ever close it again.
+            self._first_view = None
+
+    def ensureController(self, controller):
+        """ ensureController(locator: VistrailController) -> QVistrailView        
+        This will first find among the opened vistrails to see if
+        controller is open. If not, it will try to open it if a locator exist.
+
+        This should be used when you have a controller and want to open the
+        associated vistrail 
+        """
+        if controller is None:
+            return None
+        for i in xrange(self.stack.count()):
+            view = self.stack.widget(i)
+            if view.controller is controller:
+                self.change_view(view)
+                return view
+        for (view, window) in self.windows.iteritems():
+            if view.controller == controller:
+                window.activateWindow()
+                window.raise_()
+                return view
+        # try to open it
+        if controller.locator:
+            return self.open_vistrail(controller.locator)
+        return None
+
+    def getViewFromLocator(self, locator):
+        """ getViewFromLocator(locator: VistrailLocator) -> QVistrailView        
+        This will find the view associated with the locator. If not, it will
+        return None.
+        
+        """
+        if locator is None:
+            return None
+        for i in xrange(self.stack.count()):
+            view = self.stack.widget(i)
+            if view.controller.vistrail.locator == locator:
+                return view
+        for (view, window) in self.windows.iteritems():
+            if view.controller.vistrail.locator == locator:
+                return view
+        return None
+
+    def ensureVistrail(self, locator):
+        """ ensureVistrail(locator: VistrailLocator) -> QVistrailView        
+        This will first find among the opened vistrails to see if
+        vistrails from locator has been opened. If not, it will return None.
+        
+        """
+        if locator is None:
+            return None
+        for i in xrange(self.stack.count()):
+            view = self.stack.widget(i)
+            if view.controller.vistrail.locator == locator:
+                self.change_view(view)
+                return view
+        for (view, window) in self.windows.iteritems():
+            if view.controller.vistrail.locator == locator:
+                window.activateWindow()
+                window.raise_()
+                return view
+        return None
+
+    def add_vistrail(self, *objs):
+        view = self.create_view(*objs)
+        # view.is_abstraction = is_abstraction
+        self.view_changed(view)
+        self.reset_toolbar_for_view(view)
+        self.qactions['history'].trigger()
+        view.version_view.zoomToFit()
+        return view.controller
+
+    def remove_vistrail(self, locator):
+        for view in copy.copy(self.vistrail_widgets):
+            if view.controller.locator == locator:
+                from vistrails.gui.job_monitor import QJobView
+                jobView = QJobView.instance()
+                jobView.delete_job(view.controller, all=True)
+
+                view.closeDetachedViews()
+                self.remove_view(view)
+                self.vistrail_widgets.remove(view)
+                if view == self._first_view:
+                    self._first_view = None
+                elif not self.stack.count() and not self._is_quitting and \
+                     self.auto_view:
+                    self.create_first_vistrail()
+                view = self.get_next_view()
+                self.change_view(view)
+
+    def select_version(self, version):
+        view = self.get_current_view()
+        if view is not None:
+            view.version_selected(version, True, double_click=True)
+            return True
+        return False
+
+    def open_vistrail(self, locator, version=None, is_abstraction=False):
+        """open_vistrail(locator: Locator, version = None: int or str,
+                         is_abstraction: bool)
+
+        opens a new vistrail from the given locator, selecting the
+        given version.
+
+        """
+        old_view = self.getViewFromLocator(locator)
+        self.close_first_vistrail_if_necessary()
+        
+        get_vistrails_application().open_vistrail(locator, version, 
+                                                  is_abstraction)
+        view = self.get_current_view()
+        view.is_abstraction = view.controller.is_abstraction
+        if not old_view:
+            # it was not already open
+            from vistrails.gui.collection.workspace import QWorkspaceWindow
+            QWorkspaceWindow.instance().add_vt_window(view)
+        return view
+
+    def open_vistrail_from_locator(self, locator_class):
+        """ open_vistrail(locator_class) -> None
+        Prompt user for information to get to a vistrail in different ways,
+        depending on the locator class given.
+        """
+        locator = locator_class.load_from_gui(self, Vistrail.vtType)
+        if locator:
+            if not self.getViewFromLocator(locator):
+                if locator.has_temporaries():
+                    if not locator_class.prompt_autosave(self):
+                        locator.clean_temporaries()
+            if hasattr(locator, '_vnode'):
+                version = locator._vnode
+                if hasattr(locator,'_vtag'):
+                    # if a tag is set, it should be used instead of the
+                    # version number
+                    if locator._vtag != '':
+                        version = locator._vtag
+            mashuptrail = None
+            mashupversion = None
+            execute = False
+            if hasattr(locator, '_mshptrail'):
+                mashuptrail = locator._mshptrail
+            if hasattr(locator, '_mshpversion'):
+                mashupversion = locator._mshpversion
+                if mashupversion:
+                    execute = True
+            self.open_vistrail_without_prompt(locator, version, 
+                                              mashuptrail=mashuptrail,
+                                              mashupVersion=mashupversion,
+                                              execute_workflow=execute)
+            self.set_current_locator(locator)
+
+    def executeParameterExploration(self, pe_id):
+        vistrail = self.current_view.controller.vistrail
+        try:
+            pe_id = int(pe_id)
+            pe = vistrail.get_paramexp(pe_id)
+        except ValueError:
+            pe= vistrail.get_named_paramexp(pe_id)
+        except Exception:
+            return
+        self.current_view.open_parameter_exploration(pe.id)
+        self.qactions['execute'].trigger()
+
+    def open_vistrail_without_prompt(self, locator, version=None,
+                                     execute_workflow=False, 
+                                     is_abstraction=False, workflow_exec=None,
+                                     mashuptrail=None, mashupVersion=None,
+                                     parameterExploration=None):
+        """open_vistrail_without_prompt(locator_class, version: int or str,
+                                        execute_workflow: bool,
+                                        is_abstraction: bool) -> None
+        Open vistrail depending on the locator class given.
+        If a version is given, the workflow is shown on the Pipeline View.
+        If execute_workflow is True the workflow will be executed.
+        If is_abstraction is True, the vistrail is flagged as abstraction
+        If mashuptrail is not None and mashupVersion is not None, the mashup 
+        will be executed.
+        If parameterExploration is not None, it will be opened.
+        
+        """
+        
+        # move additional information from locator to variables
+        if 'version_node' in locator.kwargs:
+            if locator.kwargs['version_node']:
+                version = locator.kwargs['version_node']
+            del locator.kwargs['version_node']
+        if 'version_tag' in locator.kwargs:
+            if locator.kwargs['version_tag']:
+                version = locator.kwargs['version_tag']
+            del locator.kwargs['version_tag']
+        if not parameterExploration:
+            if 'parameterExploration' in locator.kwargs:
+                parameterExploration = locator.kwargs['parameterExploration']
+                del locator.kwargs['parameterExploration']
+        if not mashuptrail:
+            if 'mashuptrail' in locator.kwargs:
+                mashuptrail = locator.kwargs['mashuptrail']
+                del locator.kwargs['mashuptrail']
+        if not mashupVersion:
+            if 'mashupVersion' in locator.kwargs:
+                mashupVersion = locator.kwargs['mashupVersion']
+                del locator.kwargs['mashupVersion']
+            if 'mashup' in locator.kwargs:
+                if not mashupVersion:
+                    mashupVersion = locator.kwargs['mashup']
+                del locator.kwargs['mashup']
+            
+        if not locator.is_valid():
+            ok = locator.update_from_gui(self)
+        else:
+            ok = True
+        if ok:
+            if locator and not self.getViewFromLocator(locator):
+                if locator.has_temporaries():
+                    if not locator.prompt_autosave(self):
+                        locator.clean_temporaries()
+            view = self.open_vistrail(locator, version, is_abstraction)
+            view.version_view.select_current_version()
+            conf = get_vistrails_configuration()
+            has_tag = len(view.controller.vistrail.get_tagMap()) > 0
+            if (not conf.check('showPipelineViewOnLoad')) and \
+               (conf.check('showHistoryViewOnLoad') or has_tag):
+                self.qactions['history'].trigger()
+
+            if version:
+                self.qactions['pipeline'].trigger()
+                
+            if mashuptrail is not None and mashupVersion is not None:
+                mashup = view.get_mashup_from_mashuptrail_id(mashuptrail,
+                                                             mashupVersion)
+                if execute_workflow:
+                    view.open_mashup(mashup)
+                else:
+                    view.edit_mashup(mashup)
+            elif parameterExploration is not None:
+                view.open_parameter_exploration(parameterExploration)
+            elif execute_workflow:
+                self.qactions['execute'].trigger()
+            
+            # self.closeVistrailAction.setEnabled(True)
+            # self.saveFileAsAction.setEnabled(True)
+            # self.exportFileAction.setEnabled(True)
+            # self.vistrailMenu.menuAction().setEnabled(True)
+            # self.mergeMenu.menuAction().setEnabled(True)
+            # self.viewManager.changeCursor(self.interactionToolBar.cursorMode)
+            # if version:
+            #     self.viewModeChanged(0)
+            # else:
+            #     self.viewModeChanged(1)
+            if workflow_exec:
+                self.qactions['provenance'].trigger()
+                self.current_view.log_view.set_exec_by_id(workflow_exec) or \
+                 self.current_view.log_view.set_exec_by_date(workflow_exec)
+
+    def open_vistrail_default(self):
+        """ open_vistrail_default() -> None
+        Opens a vistrail from the file/db
+
+        """
+        if self.dbDefault:
+            self.open_vistrail_from_locator(DBLocator)
+        else:
+            self.open_vistrail_from_locator(FileLocator())
+
+    def import_vistrail_default(self):
+        """ import_vistrail_default() -> None
+        Imports a vistrail from the file/db
+
+        """
+        if self.dbDefault:
+            self.open_vistrail_from_locator(FileLocator())
+        else:
+            self.open_vistrail_from_locator(DBLocator)
+
+    def import_workflow(self, locator_class):
+        locator = locator_class.load_from_gui(self, Pipeline.vtType)
+        if locator:
+            if not locator.is_valid():
+                ok = locator.update_from_gui(self, Pipeline.vtType)
+            else:
+                ok = True
+            if ok:
+                self.open_workflow(locator)
+
+    def import_workflow_default(self):
+        self.import_workflow(XMLFileLocator)
+
+    def import_workflow_from_db(self):
+        """ import_workflow_from_db() -> None
+        Imports a workflow from the db
+
+        """
+        self.import_workflow(DBLocator)
+
+    def open_workflow(self, locator):
+        self.close_first_vistrail_if_necessary()
+
+        get_vistrails_application().open_workflow(locator)
+
+        self.qactions['pipeline'].trigger()
+    
+    def close_vistrail(self, current_view=None, quiet=False):
+        locator = None
+        if not current_view:
+            current_view = self.get_current_view()
+        if current_view:
+            locator = current_view.controller.locator
+
+        if not quiet and current_view and current_view.has_changes():
+            window = current_view.window()
+            name = current_view.controller.name
+            if name=='':
+                name = 'Untitled%s'%vistrails.core.system.vistrails_default_file_type()
+            text = ('Vistrail ' +
+                    QtCore.Qt.escape(name) +
+                    ' contains unsaved changes.\n Do you want to '
+                    'save changes before closing it?')
+            res = QtGui.QMessageBox.information(window,
+                                                'Vistrails',
+                                                text, 
+                                                '&Save', 
+                                                '&Discard',
+                                                'Cancel',
+                                                0,
+                                                2)
+            # Check if any unsaved workflow contains jobs
+            if res == 1:
+                vistrail = current_view.controller.vistrail
+                conf = get_vistrails_configuration()
+                if not conf.has('runningJobsList') or not conf.runningJobsList:
+                    conf_jobs = []
+                else:
+                    conf_jobs = conf.runningJobsList.split(';')
+                    res2 = 0
+                for url in conf_jobs:
+                    loc, version = url.split('?')
+                    version = int(version.split('=')[1])
+                    if loc != locator.to_url():
+                        continue
+                    action = vistrail.db_get_action_by_id(version)
+                    if not action.is_dirty:
+                        continue
+                    if res2 == 1:
+                        # already discarded
+                        from vistrails.gui.job_monitor import QJobView
+                        QJobView.instance().delete_job(
+                                             current_view.controller, version)
+                        continue
+                    text = ('Vistrail ' +
+                            QtCore.Qt.escape(name) +
+                            ' contains unsaved jobs.\n Do you want to '
+                            'save changes or discard the job(s)?')
+                    res2 = QtGui.QMessageBox.information(window,
+                                                        'Vistrails',
+                                                        text, 
+                                                        '&Save', 
+                                                        '&Discard',
+                                                        'Cancel',
+                                                        0,
+                                                        2)
+                    if res2 == 0:
+                        res = 0
+                        break
+                    elif res2 == 1:
+                        from vistrails.gui.job_monitor import QJobView
+                        QJobView.instance().delete_job(
+                                             current_view.controller, version)
+                    elif res2 == 2:
+                        return False
+        else:
+            res = 1
+        
+        if res == 0:
+            if locator is None or locator.is_untitled():
+                class_ = FileLocator()
+            else:
+                class_ = type(locator)
+            locator = current_view.save_vistrail(class_)
+            if not locator:
+                return False
+        elif res == 2:
+            return False
+        
+        if locator is not None:
+            get_vistrails_application().close_vistrail(locator, current_view.controller)
+        return True
+
+    def close_all_vistrails(self, quiet=False):
+        self.current_view = None
+        for view in [self.stack.widget(i) for i in xrange(self.stack.count())]:
+            if not self.close_vistrail(view, quiet=quiet):
+                return False
+        while len(self.windows) > 0:
+            window = self.windows.values()[0]
+            window.activateWindow()
+            window.raise_()
+            if not window.close():
+                return False
+        return True
+
+    def closeEvent(self, e):
+        """ closeEvent(e: QCloseEvent) -> None
+        Close the whole application when the builder is closed
+
+        """
+        if not self.quit():
+            e.ignore()
+
+    def quit(self):
+        self._is_quitting = True
+        if self.close_all_vistrails():
+            QtCore.QCoreApplication.quit()
+            # In case the quit() failed (when Qt doesn't have the main
+            # event loop), we have to return True still
+            return True
+        self._is_quitting = False
+        return False
+
+    def link_registry(self):
+        from vistrails.gui.module_palette import QModulePalette
+        QModulePalette.instance().link_registry()
+       
+    def get_current_view(self):
+        # return the current global view
+        return self.current_view
+
+    def get_next_view(self):
+        # return an available view if one exist
+        # this can be used after closing a vistrail to get a new current one
+        if self.stack.count() > 0:
+            return self.stack.currentWidget()
+        else:
+            if len(self.windows) > 0:
+                return self.windows.iterkeys().next()
+        return None
+        
+    def get_current_controller(self):
+        if self.get_current_view() is None:
+            return None
+        return self.get_current_view().get_controller()
+
+    def get_current_tab(self):
+        view = self.get_current_view()
+        if not view:
+            return None
+        return view.get_current_tab()
+
+    def get_current_scene(self):
+        return self.get_current_tab().scene()
+
+    def pass_through(self, accessor, method_name):
+        def method():
+            obj = accessor()
+            if obj is not None:
+                if hasattr(obj, method_name):
+                    getattr(obj, method_name)()
+        return method
+
+    def pass_through_bool(self, accessor, method_name):
+        def method(checked):
+            obj = accessor()
+            if obj is not None:
+                getattr(obj, method_name)(checked)
+        return method
+
+    def pass_through_locator(self, accessor, method_name, locator_klass=None,
+                             reverse=False):
+        def method():
+            obj = accessor()
+            obj_method = getattr(obj, method_name)
+            if locator_klass is not None:
+                obj_method(locator_klass)
+            elif self.dbDefault ^ reverse:
+                obj_method(DBLocator)
+            else:
+                obj_method(FileLocator())
+        return method
+
+    def create_menus(self):
+        self.create_actions()
+        # self.fileMenu = _menu_bar.addMenu('&File')
+        # self.newVistrailAction = QtGui.QAction('&New', self)
+        # self.newVistrailAction.setShortcut('Ctrl+N')
+        # self.newVistrailAction.setStatusTip('Create a new vistrail')
+        # self.openFileAction = QtGui.QAction('&Open', self)
+        # self.openFileAction.setShortcut('Ctrl+O')
+        # self.openFileAction.setStatusTip('Open an existing vistrail from '
+        #                                  'a file')
+        
+        # self.fileMenu.addAction(self.newVistrailAction)
+        # self.fileMenu.addAction(self.openFileAction)
+
+        # trigger_actions = [(self.newVistrailAction, self.new_vistrail),
+        #                    (self.openFileAction, self.open_vistrail_default)]
+        # for (emitter, receiver) in trigger_actions:
+        #     self.connect(emitter, QtCore.SIGNAL('triggered()'), receiver)
+
+
+    def create_palette_actions(self):
+        palette_actions = []
+        for palette in self.palettes:
+            # palette_actions.append((palette.get_title(), palette.get_action()))
+            palette_actions.append((palette.get_action_tuple(), palette))
+        palette_actions.sort()
+        return palette_actions
+
+    def connect_package_manager_signals(self):
+        """ connect_package_manager_signals()->None
+        Connect specific signals related to the package manager """
+        self.register_notification("pm_add_package_menu", 
+                                   self.add_package_menu_items)
+        self.register_notification("pm_remove_package_menu",
+                                   self.remove_package_menu_items)
+        self.register_notification("pm_package_error_message",
+                                   self.show_package_error_message)
+        # pm = get_package_manager()
+        # self.connect(pm,
+        #              pm.add_package_menu_signal,
+        #              self.add_package_menu_items)
+        # self.connect(pm,
+        #              pm.remove_package_menu_signal,
+        #              self.remove_package_menu_items)
+        # self.connect(pm,
+        #              pm.package_error_message_signal,
+        #              self.show_package_error_message)
+
+    def add_package_menu_items(self, pkg_id, pkg_name, items):
+        """add_package_menu_items(pkg_id: str,pkg_name: str,items: list)->None
+        Add a pacckage menu entry with submenus defined by 'items' to
+        Packages menu.
+
+        """
+        if len(self._package_menu_items) == 0:
+            self.qmenus['packages'].menuAction().setEnabled(True)
+
+        # we don't support a menu hierarchy yet, only a flat list
+        # this can be added later
+        def update_menu(d, packagesMenu):
+            if pkg_id not in d:
+                pkg_menu = packagesMenu.addMenu(str(pkg_name))
+                d[pkg_id] = {}
+                d[pkg_id]['menu'] = pkg_menu
+                d[pkg_id]['items'] = []
+            else:
+                pkg_menu = d[pkg_id]['menu']
+                pkg_menu.clear()
+            d[pkg_id]['items'] = [(pkg_name,items)]
+            
+            for item in items:
+                (name, callback) = item
+                action = QtGui.QAction(name,self,
+                                       triggered=callback)
+                pkg_menu.addAction(action)
+                
+        update_menu(self._package_menu_items,self.qmenus['packages'])    
+        
+        for w in self.windows.values():
+            update_menu(w._package_menu_items, w.qmenus['packages'])
+
+    def remove_package_menu_items(self, pkg_id):
+        """remove_package_menu_items(pkg_id: str)-> None
+        removes all menu entries from the Packages Menu created by pkg_id """
+        def update_menu(items, menu):
+            if pkg_id in items:
+                pkg_menu = items[pkg_id]['menu']
+                del items[pkg_id]
+                pkg_menu.clear()
+                pkg_menu.deleteLater()
+            if len(items) == 0:
+                menu.menuAction().setEnabled(False)
+            
+        update_menu(self._package_menu_items, self.qmenus['packages'])
+        for w in self.windows.values():
+            update_menu(w._package_menu_items, w.qmenus['packages'])
+            
+    def show_package_error_message(self, pkg_id, pkg_name, msg):
+        """show_package_error_message(pkg_id: str, pkg_name: str, msg:str)->None
+        shows a message box with the message msg.
+        Because the way initialization is being set up, the messages will be
+        shown after the builder window is shown.
+
+        """
+        msgbox = build_custom_window("Package %s (%s) says:"%(pkg_name,pkg_id),
+                                    msg,
+                                    modal=True,
+                                    parent=self)
+        #we cannot call self.msgbox.exec_() or the initialization will hang
+        # creating a modal window and calling show() does not cause it to hang
+        # and forces the messages to be shown on top of the builder window after
+        # initialization
+        msgbox.show()
+
+    def showAboutMessage(self):
+        """showAboutMessage() -> None
+        Displays Application about message
+
+        """
+        class About(QtGui.QLabel):
+            def mousePressEvent(self, e):
+                self.emit(QtCore.SIGNAL("clicked()"))
+
+        dlg = QtGui.QDialog(self, QtCore.Qt.FramelessWindowHint)
+        layout = QtGui.QVBoxLayout()
+        layout.setMargin(0)
+        layout.setSpacing(0)
+        bgimage = About(dlg)
+        bgimage.setPixmap(CurrentTheme.DISCLAIMER_IMAGE)
+        layout.addWidget(bgimage)
+        dlg.setLayout(layout)
+        text = "<font color=\"white\"><b>%s</b></font>" % \
+            vistrails.core.system.short_about_string()
+        version = About(text, dlg)
+        version.setGeometry(11,20,450,30)
+        self.connect(bgimage,
+                     QtCore.SIGNAL('clicked()'),
+                     dlg,
+                     QtCore.SLOT('accept()'))
+        self.connect(version,
+                     QtCore.SIGNAL('clicked()'),
+                     dlg,
+                     QtCore.SLOT('accept()'))
+        dlg.setSizeGripEnabled(False)
+        dlg.exec_()
+
+    def showUpdatesMessage(self):
+        """ showUpdatesMessage() -> None
+        Displays Check for Updates message.
+        This queries vistrails.org for new VisTrails Versions
+
+        """
+
+        new_version_exists, version = vistrails.core.system.new_vistrails_release_exists()
+        if new_version_exists:
+            msg = 'Version %s of VisTrails is available at ' \
+                '<a href="%s">%s</a>' % \
+                (version, "http://www.vistrails.org/index.php/Downloads", \
+                     "http://www.vistrails.org/index.php/Downloads")
+        else:
+            msg = "Your VisTrails installation is up-to-date."
+        QtGui.QMessageBox.information(self, "Check for VisTrails Updates",
+                                      msg)
+                                      
+    def showRepositoryOptions(self):
+        """ Displays Repository Options for authentication and pushing VisTrail to Repository """
+        self.publish_to_crowdlabs()
+
+    def setDBDefault(self, dbState):
+        """ setDBDefault(on: bool) -> None
+        The preferences are set to turn on/off read/write from db instead of
+        file. Update the state accordingly.
+
+        """
+        self.dbDefault = dbState
+        if self.dbDefault:
+            openFileAction = self.qactions['openFile']
+            openFileAction.setIcon(CurrentTheme.OPEN_VISTRAIL_DB_ICON)
+            openFileAction.setStatusTip('Open an existing vistrail from '
+                                        'a database')
+            importFileAction = self.qactions['importFile']
+            importFileAction.setIcon(CurrentTheme.OPEN_VISTRAIL_ICON)
+            importFileAction.setText('From XML File...')
+            importFileAction.setStatusTip('Import an existing vistrail '
+                                          'from a file')
+            saveFileAction = self.qactions['saveFile']
+            saveFileAction.setStatusTip('Save the current vistrail '
+                                        'to a database')
+            saveFileAsAction = self.qactions['saveFileAs']
+            saveFileAsAction.setStatusTip('Save the current vistrail to a '
+                                          'different database location')
+            saveToOtherAction = self.qactions['saveToOther']
+            saveToOtherAction.setText('Save To File...')
+            saveToOtherAction.setStatusTip('Save the current vistrail to '
+                                          'a file')
+            exportFileAction = self.qactions['exportFile']
+            exportFileAction.setText('To File...')
+            exportFileAction.setStatusTip('Export the current vistrail to '
+                                          'a file')
+        else:
+            openFileAction = self.qactions['openFile']
+            openFileAction.setIcon(CurrentTheme.OPEN_VISTRAIL_ICON)
+            openFileAction.setStatusTip('Open an existing vistrail from '
+                                             'a file')
+            importFileAction = self.qactions['importFile']
+            importFileAction.setIcon(CurrentTheme.OPEN_VISTRAIL_DB_ICON)
+            importFileAction.setText('From DB...')
+            importFileAction.setStatusTip('Import an existing vistrail '
+                                          'from a database')
+            saveFileAction = self.qactions['saveFile']
+            saveFileAction.setStatusTip('Save the current vistrail '
+                                             'to a file')
+            saveFileAsAction = self.qactions['saveFileAs']
+            saveFileAsAction.setStatusTip('Save the current vistrail to a '
+                                          'different file location')
+            saveToOtherAction = self.qactions['saveToOther']
+            saveToOtherAction.setText('Save To DB...')
+            saveToOtherAction.setStatusTip('Save the current vistrail to '
+                                          'a database')
+            exportFileAction = self.qactions['exportFile']
+            exportFileAction.setText('Export To DB...')
+            exportFileAction.setStatusTip('Export the current vistrail to '
+                                          'a database')
+
+    def flush_cache(self):
+        CachedInterpreter.flush()
+
+    def set_stop_on_error(self, stop):
+        setattr(get_vistrails_persistent_configuration(), 'stopOnError', stop)
+        setattr(get_vistrails_configuration(), 'stopOnError', stop)
+
+    def showPreferences(self):
+        """showPreferences() -> None
+        Display Preferences dialog
+
+        """
+        self.preferencesDialog.show()
+
+    def new_diff(self):
+        selected_items = \
+            self.get_current_view().version_view.scene().selectedItems()
+        if len(selected_items) == 2:
+            selected_ids = [item.id for item in selected_items]
+            self.get_current_view().diff_requested(*selected_ids)
+
+    def setup_recent_vistrails(self):
+        conf = get_vistrails_configuration()
+        if conf.check('recentVistrailList'):
+            self.recentVistrailLocators = \
+                RecentVistrailList.unserialize(conf.recentVistrailList)
+        else:
+            self.recentVistrailLocators = RecentVistrailList()
+        conf.subscribe('maxRecentVistrails', self.max_recent_vistrails_changed)
+        self.update_recent_vistrail_actions()
+
+    def check_running_jobs(self):
+        from vistrails.gui.job_monitor import QJobView
+        QJobView.instance().load_running_jobs()
+
+    def open_recent_vistrail(self):
+        """ open_recent_vistrail() -> None
+        Opens a vistrail from Open Recent menu list
+        
+        """
+        action = self.sender()
+        if action:
+            self.open_vistrail_without_prompt(action.locator)
+            self.set_current_locator(action.locator)
+            
+    def update_recent_vistrail_menu(self):
+        #check if we have enough actions
+        def update_menu(openRecentMenu):
+            openRecentMenu.clear()
+            for i, locator in enumerate(self.recentVistrailLocators.locators):
+                action = QtGui.QAction(self)
+                self.connect(action, QtCore.SIGNAL("triggered()"),
+                             self.open_recent_vistrail)
+                action.locator = locator
+                action.setText("&%d %s" % (i+1, locator.name))
+                openRecentMenu.addAction(action)
+        update_menu(self.qmenus['openRecent'])
+        for w in self.windows.values():
+            update_menu(w.qmenus['openRecent'])
+
+    def update_window_menu(self):
+        def compute_action_items():
+            actions = []
+            action = QtGui.QAction(
+                    "Main Window", self,
+                    triggered=lambda checked=False: self.activateWindow())
+            action.setCheckable(True)
+            
+            base_view_windows = {}
+            if current_view == None or \
+               QtGui.QApplication.activeWindow() == self:
+                action.setChecked(True)
+            actions.append(action)
+            if current_view and current_view.window() == self:
+                for i in range(self.stack.count()):
+                    view = self.stack.widget(i)
+                    for dview, dw in current_view.detached_views.iteritems():
+                        base_view_windows[dview] = dw
+            if len(self.windows) > 0:
+                windowactions = []
+                for view, w in self.windows.iteritems():
+                    action = QtGui.QAction(view.get_name(), self,
+                           triggered=lambda checked=False: w.activateWindow())
+                    action.setCheckable(True)
+                    if w == QtGui.QApplication.activeWindow():
+                        action.setChecked(True)
+                    windowactions.append(action)
+                    for dview, dw in view.detached_views.iteritems():
+                        base_view_windows[dview] = dw
+                actions.append(windowactions)
+            if len(base_view_windows) > 0:
+                base_view_actions = []
+                for view, w in base_view_windows.iteritems():
+                    action = QtGui.QAction(w.windowTitle(), self,
+                           triggered=lambda checked=False: w.activateWindow())
+                    action.setCheckable(True)
+                    if w == QtGui.QApplication.activeWindow():
+                        action.setChecked(True)
+                    base_view_actions.append(action)
+                actions.append(base_view_actions)
+            return actions
+        
+        def update_menu(windowMenu):
+            actions = compute_action_items()
+            windowMenu.clear()
+            if len(actions) > 0:
+                windowMenu.addAction(actions[0])
+                if len(actions) > 1:
+                    windowMenu.addSeparator()
+                    for action in actions[1]:
+                        windowMenu.addAction(action)
+                if len(actions) > 2:
+                    windowMenu.addSeparator()
+                    for action in actions[2]:
+                        windowMenu.addAction(action)
+
+        current_view = self.get_current_view()
+        update_menu(self.qmenus['window'])
+        if current_view and current_view.window() == self:
+            for i in range(self.stack.count()):
+                view = self.stack.widget(i)
+                for dw in view.detached_views.values():
+                    update_menu(dw.qmenus['window'])
+        for v, w in self.windows.iteritems():
+            update_menu(w.qmenus['window'])
+            for dw in v.detached_views.values():
+                update_menu(dw.qmenus['window'])
+                
+        if current_view and current_view.window() in self.windows.values():
+            # add detach action
+            current_view.window().qmenus['window'].addSeparator()
+            action = QtGui.QAction(
+                    "Re-attach Vistrail View", self,
+                    triggered=lambda b=None: self.attach_view())
+            current_view.window().qmenus['window'].addAction(action)
+            
+            
+    def update_merge_menu(self):
+        #check if we have enough actions
+        def update_menu(mergeMenu):
+            mergeMenu.clear()
+            for i in xrange(self.stack.count()):
+                view = self.stack.widget(i)
+                # skip merge with self and not saved views
+                if view == self.current_view or not view.controller.vistrail.locator:
+                    continue
+                action = QtGui.QAction(self)
+                self.connect(action, QtCore.SIGNAL("triggered()"),
+                             self.merge_vistrail)
+                action.controller = view.controller
+                action.setText("%s" % view.controller.vistrail.locator.name)
+                mergeMenu.addAction(action)
+            for view, w in self.windows.iteritems():
+                # skip merge with self and not saved views
+                if view == self.current_view or not view.controller.vistrail.locator:
+                    continue
+                action = QtGui.QAction(self)
+                self.connect(action, QtCore.SIGNAL("triggered()"),
+                             self.merge_vistrail)
+                action.controller = view.controller
+                action.setText("%s" % view.controller.vistrail.locator.name)
+                mergeMenu.addAction(action)
+                
+        update_menu(self.qmenus['merge'])
+        for w in self.windows.values():
+            update_menu(w.qmenus['merge'])
+
+    def update_recent_vistrail_actions(self):
+        maxRecentVistrails = \
+            int(get_vistrails_configuration().maxRecentVistrails)
+        self.recentVistrailLocators.ensure_no_more_than_max(maxRecentVistrails)
+        self.update_recent_vistrail_menu()
+        
+        conf = get_vistrails_persistent_configuration()
+        tconf = get_vistrails_configuration()
+        conf.recentVistrailList = self.recentVistrailLocators.serialize()
+        tconf.recentVistrailList = conf.recentVistrailList
+        get_vistrails_application().save_configuration()
+        
+    def set_current_locator(self, locator):
+        """ set_current_locator(locator: CoreLocator)
+        Updates the list of recent files in the gui and in the configuration
+        
+        """
+        if locator:
+            self.recentVistrailLocators.add_locator(locator)
+            self.update_recent_vistrail_actions()
+    
+    def max_recent_vistrails_changed(self, field, value):
+        """max_recent_vistrails_changed()-> obj
+        callback to create an object to be used as a subscriber when the 
+        configuration changed.
+        
+        """
+        self.update_recent_vistrail_actions()
+                
+    def configure_module(self):
+        from vistrails.gui.module_configuration import QModuleConfiguration
+        action_name = QModuleConfiguration.instance().get_title()
+        if action_name[-1] == '*':
+            action_name = action_name[:-1]
+        # easy way to make sure that configuration window is raised
+        self.qactions[action_name].setChecked(False)
+        self.qactions[action_name].setChecked(True)
+
+    def show_documentation(self):
+        from vistrails.gui.module_documentation import QModuleDocumentation
+        action_name = QModuleDocumentation.instance().get_title()
+        # easy way to make sure that documentation window is raised
+        self.qactions[action_name].setChecked(False)
+        self.qactions[action_name].setChecked(True)
+
+#    def show_group(self):
+#        class DummyController(object):
+#            def __init__(self, pip):
+#                self.current_pipeline = pip
+#                self.search = None
+#        #FIXME: this should be delegated to QVistrailView
+#        current_scene = self.get_current_scene()
+#        selected_module_ids = current_scene.get_selected_module_ids()
+#        if len(selected_module_ids) > 0:
+#            for m_id in selected_module_ids:
+#                module = current_scene.current_pipeline.modules[m_id]
+#                if module.is_group() or module.is_abstraction():
+#                    pipelineView = QPipelineView()
+#                    controller = DummyController(module.pipeline)
+#                    pipelineView.controller = controller
+#                   pipelineMainWindow = QBaseViewWindow(pipelineView)
+#                    #pipelineMainWindow.setCentralWidget(pipelineView)
+#                    pipelineView.scene().controller = \
+#                        controller
+#                    controller.current_pipeline_view = \
+#                        pipelineView.scene()
+#                    module.pipeline.ensure_connection_specs()
+#                    pipelineView.scene().setupScene(module.pipeline)
+#                    pipelineView.scene().current_pipeline = module.pipeline
+#                    pipelineView.scene().fitToView(pipelineView, True)
+#                    pipelineView.show()
+#                    pipelineMainWindow.show()
+
+    def openAbstraction(self, filename):
+        locator = XMLFileLocator(filename)
+        self.open_vistrail_without_prompt(locator, None, False, True)
+
+    def edit_abstraction(self):
+        current_scene = self.get_current_tab().scene()
+        selected_module_ids = current_scene.get_selected_module_ids()
+        if len(selected_module_ids) > 0:
+            for m_id in selected_module_ids:
+                module = current_scene.current_pipeline.modules[m_id]
+                if module.is_abstraction():
+                    from vistrails.core.modules.abstraction import identifier as \
+                        abstraction_pkg                    
+                    ann_get = module.vistrail.get_annotation
+                    if module.package == abstraction_pkg and \
+                            ann_get('__abstraction_descriptor_info__') is None:
+                        desc = module.module_descriptor
+                        filename = desc.module.vt_fname
+                        self.openAbstraction(filename)
+                    else:
+                        debug.critical('Subworkflow is from a package and is '
+                                       'read-only',
+                                       "This subworkflow is from a package and "
+                                       "cannot be modified.  You can create an "
+                                       "editable copy in 'My Subworkflows' "
+                                       "using 'Edit->Import Subworkflow'")
+    def merge_vistrail(self):
+        action = self.sender()
+        if action:
+            self.merge_vistrails(self.current_view.controller, action.controller)
+
+    def merge_vistrails(self, c1, c2):
+        """ merge_vistrails(c1: VistrailController, c2: VistrailController) -> None
+            hamdle merge vistrail from 2 controller into new vistrail
+
+        """
+        thumb_cache = ThumbnailCache.getInstance()
+        
+        l1 = c1.locator._name if c1.locator is not None else ''
+        t1 = c1.find_thumbnails(tags_only=thumb_cache.conf.tagsOnly) \
+            if thumb_cache.conf.autoSave else []
+        s1 = SaveBundle(c1.vistrail.vtType, c1.vistrail.do_copy(), c1.log, thumbnails=t1)
+
+        l2 = c2.locator._name if c2.locator is not None else ''
+        t2 = c2.find_thumbnails(tags_only=thumb_cache.conf.tagsOnly) \
+            if thumb_cache.conf.autoSave else []
+        s2 = SaveBundle(c2.vistrail.vtType, c2.vistrail, c2.log, thumbnails=t2)
+
+        vistrails.db.services.vistrail.merge(s1, s2, "", merge_gui, l1, l2)
+        vistrail = s1.vistrail
+        vistrail.locator = None
+        vistrail.set_defaults()
+        view = self.create_view(vistrail, None)
+        # FIXME need to figure out what to do with this !!!
+        view.controller.set_vistrail(vistrail, None, thumbnails=s1.thumbnails)
+        view.controller.set_changed(True)
+        self.view_changed(view)
+        self.reset_toolbar_for_view(view)
+        self.qactions['history'].trigger()
+        view.version_view.scene().fitToView(view.version_view, True)
+
+
+        
+    def do_tag_prompt(self, name="", exists=False):
+        if exists:
+            prompt = "'%s' already exists.  Enter a new tag" % name
+        else:
+            prompt = "Enter a tag"
+            
+        (text, ok) = QtGui.QInputDialog.getText(None, 
+                                                'Tag Version',
+                                                prompt,
+                                                QtGui.QLineEdit.Normal,
+                                                name)
+        if ok and text:
+            return str(text).strip().rstrip()
+        if not ok:
+            return None
+        return ""
+
+    def add_tag(self, check_exists=True):
+        controller = self.get_current_controller()
+        vistrail = controller.vistrail
+        name = self.do_tag_prompt()
+        if name is None:
+            return None
+        while name == "" or (check_exists and vistrail.has_tag_str(name)):
+            name = self.do_tag_prompt(name, name != "")
+            if name is None:
+                return None
+        controller.update_current_tag(name)
+        
+    def publish_to_crowdlabs(self):
+        dialog = QRepositoryDialog(self)
+        if QRepositoryDialog.cookiejar:
+            dialog.exec_()
+
+    def invalidate_pipelines(self):
+        """ invalidate_pipelines() -> None
+            Clears the cache and reloads the current pipelines in all views
+            This should be called when a module in the module registry
+            is changed/added/deleted
+        """
+        
+        def reload_view(view):
+            view.version_selected(view.controller.current_version,
+                                  True, from_root=True)
+        
+        for i in xrange(self.stack.count()):
+            view = self.stack.widget(i)
+            reload_view(view)
+        for view in self.windows:
+            reload_view(view)
+    
+    def closeNotPinPalettes(self):
+        if (QtGui.QApplication.activeWindow() == self or 
+            QtGui.QApplication.activeWindow() in self.windows.values()):
+            for p in self.palettes:
+                if p.toolWindow().window() == QtGui.QApplication.activeWindow():
+                    if (p.toolWindow().isVisible() and 
+                        not p.toolWindow().isFloating() and not p.get_pin_status()):
+                        p.toolWindow().close()
+                 
+    def applicationFocusChanged(self, old, current):
+        """ This method updates the current vistrail view when needed
+            Clicking a vistrail view selects it as the current unless clicking
+            in a vistrail palette widget which are global
+        """
+        if self._is_quitting:
+            return
+        # focus owner is used to prevent view update when re-clicking a detached view
+        focus_owner = self._focus_owner
+        self._focus_owner = None
+
+        vt_app = get_vistrails_application()
+        # sometimes the correct widget is not selected
+        current = vt_app.widgetAt(QtGui.QCursor.pos())
+        
+        if current is not None:
+            owner = current.window()
+            #print "\n\n\n >>>>>> applicationfocuschanged"
+            #print "owner: ", owner, " current: ", current
+            def is_or_has_parent_of_types(widget, types):
+                while widget is not None:
+                    for _type in types:
+                        if isinstance(widget, _type):
+                            return True
+                    widget = widget.parent()
+                return False
+            allowed_widgets = [ConstantWidgetMixin,
+                               QParamExploreView,
+                               QAliasInspector,
+                               QCellWidget,
+                               QMashupViewTab,
+                               QVistrailsPaletteInterface]
+            old_view = self.get_current_view()
+            view = None
+            if self.isAncestorOf(current):
+                view = self.stack.currentWidget()
+            elif  owner in self.windows.values():
+                view = owner.get_current_view()
+            if view:
+                # owner is a vistrail view
+                if not is_or_has_parent_of_types(current, allowed_widgets):
+                    # clicked in a valid view, so update it
+                    #print "generating view_changed", view
+                    self.change_view(view)
+                    if view != old_view:
+                        self.update_window_menu()
+                    self._previous_view = self.current_view.current_tab
+                    view.reset_tab_view_to_current()
+                    view.view_changed()    
+                return
+            if isinstance(owner, QBaseViewWindow):
+                # this is a pipeline view
+                self._focus_owner = owner
+                view = owner.get_current_view()
+                if (view and owner != focus_owner and 
+                    not is_or_has_parent_of_types(current, allowed_widgets)):
+                    #print "generating view changed2", view
+                    self.change_view(view)
+                    if view != old_view:
+                        self.update_window_menu()
+                    self._previous_view = self.current_view.current_tab
+                    view.set_to_current(owner.get_current_tab())
+                    view.view_changed()
+_app = None
+#_global_menubar = None
+    
+            
+class QPaletteMainWindow(QtGui.QMainWindow):
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        QtGui.QMainWindow.__init__(self, parent, f)
+        self.palettes = []
+        self.windows = []
+        
+    def addPalette(self, palette):
+        if palette not in self.palettes:
+            self.palettes.append(palette)
+        if len(self.palettes) == 1:
+            self.addDockWidget(QtCore.Qt.TopDockWidgetArea, palette.toolWindow())
+        else:
+            self.tabifyDockWidget(self.palettes[0].toolWindow(),
+                                  palette.toolWindow())
+        palette.toolWindow().close()
+        
+    def closeDockedPalettes(self):
+        for p in self.palettes:
+            if (p.toolWindow().isVisible() and 
+                not p.toolWindow().isFloating()):
+                        p.toolWindow().close()
+            
+    def closeEvent(self, event):
+        if not QtCore.QCoreApplication.closingDown():
+            self.closeDockedPalettes()
+            self.hide()
+            event.ignore()
+
+    def showEvent(self, event):
+        for p in self.palettes:
+            if (not p.toolWindow().isVisible() and 
+                not p.toolWindow().isFloating() and p.get_pin_status()):
+                p.set_visible(True)
+    
diff --git a/vistrails/index/__core.py b/vistrails/index/__core.py
new file mode 100644
index 0000000..dffedde
--- /dev/null
+++ b/vistrails/index/__core.py
@@ -0,0 +1,143 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This is the core classes for the general workflow model
+
+The structures can hold a description of a workflow and lists of operations.
+
+This file implements:
+ Annotation
+ Parameter
+ Module
+ Connection
+ Pipeline
+ Port
+ Operation
+ Service
+"""
+
+class Annotation:
+    """
+    annotation
+    """
+    def __init__(self, key='', value=''):
+        self.key = key
+        self.value = value
+        self.annotations = [] # list of annotations
+    def __eq__(self, other):
+        """ equal if keys are equal """
+        return self.key == other.key
+
+class Parameter:
+    """
+    module parameter
+    """
+    def __init__(self, name, value='', type=''):
+        self.name = name      # parameter name
+        self.value = value    # value
+        self.type = type      # value type type/class (actually redundant)
+        self.annotations = [] # list of annotations
+
+class Module:
+    """
+    workflow module
+    """
+    def __init__(self, name = 'New', package = '',
+                 version = '', type = 'Module'):
+        self.name = name       # module name
+        self.package = package # package that the 'type' is in
+        self.version = version # version of the package
+        self.type = type       # module type
+        self.annotations = []  # list of annotations
+        self.parameters = []   # list of parameters
+        self.up = []           # input  modules (redundant)
+        self.down = []         # output modules (redundant)
+
+class Connection:
+    """
+    A connection between modules
+    """
+    def __init__(self, startModule=None, endModule=None, \
+                       startPort='', endPort=''):
+            self.startModule = startModule # reference to startmodule
+            self.endModule = endModule     # reference to endmodule
+            self.startPort = startPort
+            self.endPort = endPort
+            self.annotations = []           # list of annotations
+
+class Pipeline:
+    """
+    A representation of a pipeline 
+    """
+    def __init__(self, name='', type='', version='', source=''):
+        self.name        = name       # textual representation of pipeline
+        self.source      = source     # location of source
+        self.type        = type       # source format 
+        self.version     = version    # version of source format
+        self.modules     = []         # list of modules
+        self.connections = []         # list of connections
+        self.annotations = []         # list of annotations
+
+outPort = False
+inPort = True
+class Port:
+    """
+    module port
+    """
+    def __init__(self, name, type=None, kind=inPort):
+        self.name = name      # port name
+        self.type = type      # port type/class
+        self.kind = kind      # inPort/outPort
+        self.annotations = [] # list of annotations
+
+class Operation:
+    """
+    An operation
+    """
+    def __init__(self, name):
+        self.name = name      # operation name
+        self.ports = []       # list of ports
+        self.annotations = [] # list of annotations
+
+class Service:
+    """
+    A service representation
+    """
+    def __init__(self, name='', source='', type='', version=''):
+        self.name        = name       # textual representation of pipeline
+        self.source      = source     # location of source
+        self.type        = type       # source format (namespace)
+        self.version     = version    # version of source format
+        self.operations  = []         # list of operations
+        self.annotations = []         # list of annotations
diff --git a/vistrails/index/__init__.py b/vistrails/index/__init__.py
new file mode 100644
index 0000000..fac3164
--- /dev/null
+++ b/vistrails/index/__init__.py
@@ -0,0 +1,35 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
diff --git a/vistrails/index/indexworkflow.py b/vistrails/index/indexworkflow.py
new file mode 100755
index 0000000..00df65b
--- /dev/null
+++ b/vistrails/index/indexworkflow.py
@@ -0,0 +1,226 @@
+#!/usr/bin/python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import sys
+import urllib
+import hashlib
+import shutil
+import subprocess
+
+from lucene import FSDirectory, IndexWriter, StandardAnalyzer, initVM, CLASSPATH, Field, Document, Term, File
+
+from vistrailanalyzer import vistrailAnalyzer
+from __core import *
+from spec_io import spec
+
+lvm = initVM(CLASSPATH, maxheap='512m')
+
+location = "/server/index"
+
+class WorkflowIndexer:
+    store = None
+    writer = None
+    def __init__(self):
+        self.save = Field.Store.YES
+        self.ddict = dict()
+
+        lvm.attachCurrentThread()
+
+        if not WorkflowIndexer.store and not WorkflowIndexer.writer:
+            try:
+                # open lucene index
+                WorkflowIndexer.store = FSDirectory.open(File(location))
+                # if the index directory does not exist, create it.
+                WorkflowIndexer.writer = IndexWriter( WorkflowIndexer.store,
+                    vistrailAnalyzer(), not len(WorkflowIndexer.store.list()))
+            except Exception, e:
+                print "EXCEPTION", e
+                self.close()
+                raise
+
+    def close(self):
+        if WorkflowIndexer.writer:
+            WorkflowIndexer.writer.commit()
+
+    def remove(self, id):
+        print "removing index for", id
+        spec.remove(id)
+        # Delete old versions
+        WorkflowIndexer.writer.deleteDocuments(
+            [Term('workflow_id', id)] )
+        print "done removing", id
+
+    def index_vt_wf(self, wf_info, pipeline):
+        # convert to general workflow model
+        wf = self.convert_vt_wf(pipeline)
+        wf.id = str(wf_info['crowdlabs_wf_id'])
+        # add meta information
+        wf.name = wf_info['name']
+        wf.annotations.append(Annotation("title", wf_info['name']))
+        wf.annotations.append(Annotation("user", wf_info['user']))
+#value.strftime('%Y-%m-%d %H:%M:%S')
+        wf.annotations.append(Annotation("date", wf_info['date']))
+        wf.annotations.append(Annotation("note", wf_info['description']))
+        if wf_info['thumbnail'] != '':
+            wf.annotations.append(Annotation("__thumb__", wf_info['thumbnail']))
+        return self.index_wf(wf)
+
+    def index_wf(self, wf):
+        # upload to database
+        print "uploading", wf.name
+        spec.add(wf)
+        # index workflow using lucene
+        print "indexing", wf.name
+        self.write_index(wf)
+        print "done indexing", wf.name
+
+    #
+    # Creates pickle workflow object from vistrails pipeline
+    #
+    def convert_vt_wf(self, wf):
+        pipeline = Pipeline("", "vistrail", wf.db_version, "")
+
+        # process modules
+        mdict = {}
+        for module in wf.db_modules:
+            name = module.db_name
+            for annotation in module.db_annotations:
+                if annotation.db_key == "__desc__":
+                    name = annotation.db_value
+            m = Module(name, module.db_package, module.db_version, module.db_name)
+            m.id = module.db_id
+            mdict[m.id] = m
+            pipeline.modules.append(m)
+
+            # location x/y
+            m.annotations.append(Annotation('loc_x', str(module.db_location.db_x)))
+            m.annotations.append(Annotation('loc_y', str(module.db_location.db_y)))
+
+            # add functions
+            for function in module.db_functions:
+                name = function.db_name
+                for parameter in function.db_parameters:
+                    value = urllib.unquote(parameter.db_val) # decode pythonsources
+                    pos = str(parameter.db_pos)
+                    name += ((':' + pos) if len(function.db_parameters)>1 else '')
+                    m.parameters.append(Parameter(name, value, parameter.db_type))
+                # empty parameter
+                if len(function.db_parameters) == 0:
+                    m.parameters.append(Parameter(name, '', ''))
+
+        for connection in wf.db_connections:
+            start = connection.db_get_port_by_type('source')
+            startModuleId = start.db_moduleId
+            end = connection.db_get_port_by_type('destination')
+            endModuleId = end.db_moduleId
+
+            # get the references
+            startModule = mdict[startModuleId] if startModuleId in mdict else None
+            endModule = mdict[endModuleId] if endModuleId in mdict else None
+
+            if startModule and endModule:
+                # redundant attribute: add a module chain for fast traversal
+                if startModule not in endModule.up:
+                    endModule.up.append(startModule)
+                if endModule not in startModule.down:
+                    startModule.down.append(endModule)
+                pipeline.connections.append(Connection(startModule, endModule,
+                                                   start.db_name, end.db_name))
+            else:
+                print "A broken connection was found"
+        return pipeline
+
+    def adddd(self, k, v):
+        self.ddict[k] = self.ddict[k] + " " + v if self.ddict.has_key(k) else v
+
+    def write_index(self, workflow, property = False):
+        """
+        adds all keywords in workflow to the index at the specified location
+        types of the keywords can be preserved by setting (Property = True)
+        """
+        self.ddict = dict()
+        # name is used as id in this case
+        self.adddd("workflow_id", str(workflow.id))
+
+        self.adddd("text", workflow.id)
+        self.adddd("text", workflow.name)
+        # this is a key for the workflow
+        #adddd("workflow_source", workflow.source)
+        #self.adddd("text", workflow.source)
+        #adddd("workflow_type", workflow.type)
+        self.adddd("text", workflow.type)
+        # not very interesting
+        #d.add( Field("workflow_version", workflow.version, save, Field.Index.UN_TOKENIZED))
+        self.indexAnnotations(workflow.annotations, property)
+
+        for module in workflow.modules:    
+            self.adddd("module_name" if property else "text", module.name)
+            self.adddd("package"     if property else "text", module.package)
+            # not very interesting
+            #d.add( Field("package_version", module.version, save, Field.Index.UN_TOKENIZED))
+            self.adddd("module_type" if property else "text", module.type)
+            self.indexAnnotations(module.annotations, property)
+            for p in module.parameters:
+                self.adddd("parameter_name" if property else "text", p.name)
+                self.adddd("parameter_value" if property else "text", p.value)
+                self.adddd("parameter_type" if property else "text", p.type)
+                self.indexAnnotations(p.annotations, property)
+
+        for c in workflow.connections:    
+            self.adddd("port_name" if property else "text", c.startPort)
+            self.adddd("port_name" if property else "text", c.endPort)
+            self.indexAnnotations(c.annotations, property)
+
+        d = Document()
+        for (k, v) in self.ddict.iteritems():
+            d.add(Field(k, v, self.save, Field.Index.TOKENIZED))
+
+        # Delete old versions
+        WorkflowIndexer.writer.deleteDocuments(
+            [Term('workflow_id', str(workflow.id))] )
+        # add new
+        WorkflowIndexer.writer.addDocument(d)
+
+    def indexAnnotations(self, annotations, p):
+        """
+        design choice: key and values are indexed separately,
+        it would be possible to index them as the same type
+    """
+        for annotation in annotations:
+            self.adddd("annotation_key" if p else "text", annotation.key)
+            self.adddd("annotation_value" if p else "text", annotation.value)
+            # annotations can be recursive
+            self.indexAnnotations(annotation.annotations, p)
diff --git a/vistrails/index/spec_io.py b/vistrails/index/spec_io.py
new file mode 100644
index 0000000..6f8d450
--- /dev/null
+++ b/vistrails/index/spec_io.py
@@ -0,0 +1,137 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+import cPickle
+import MySQLdb
+from __core import Pipeline
+
+DBHOST = 'localhost'
+DBUSER = 'specuser'
+DBPASS = 'specpass'
+DBDB   = 'wfspec'
+
+class Spec:
+    def __init__(self):        
+        try:
+            self.db = MySQLdb.connect(DBHOST, DBUSER, DBPASS, DBDB)
+        except MySQLdb.Error, e:
+            print "1Database Connection Error %d: %s" % (e.args[0], e.args[1])
+            sys.exit(1)
+        self.cursor = MySQLdb.cursors.DictCursor(self.db)
+
+    def _exec(self, command):
+        try:
+            self.cursor.execute(command)
+        except MySQLdb.Error, e:
+            try:
+                self.db = MySQLdb.connect(DBHOST, DBUSER, DBPASS, DBDB)
+                self.cursor = MySQLdb.cursors.DictCursor(self.db)
+                self.cursor.execute(command)
+            except MySQLdb.Error, e:
+                print "3Database Connection Error %d: %s"%(e.args[0],e.args[1])
+                sys.exit(1)
+        return self.cursor.fetchall()
+
+    def get(self, name):
+        """ Given a name - returns the specification as a pickle object """
+        command = "SELECT wf FROM single_spec WHERE name='%s'" % name
+        for r in self._exec(command):
+            wf = r['wf']
+            # change class of pickle object (core module not allowed)-UGLY hack
+            if wf[0:14] == '(iindex.__core':
+                wf = wf.replace('(iindex.__core\n', '(i__core\n')
+            return cPickle.loads(wf)
+        return None
+
+    def names(self):
+        """ returns all names in db """
+        command = "SELECT name FROM single_spec"
+        return [name['name'] for name in self._exec(command)]
+
+    def getIndex(self, name):
+        command = "SELECT paths FROM spec_index WHERE name='%s'" % name
+        for r in self._exec(command):
+            return cPickle.loads(r['paths'])
+
+    def add(self, wf):
+        """ Inserts name, wf to single_spec """
+        dump = cPickle.dumps(wf)
+        dump = MySQLdb.escape_string(dump)
+        command = "REPLACE INTO single_spec VALUES ('%s', '%s')"%(wf.id, dump)
+        self._exec(command)
+    
+    def __del__(self):
+        self.cursor.close()
+        self.db.close()
+
+spec = Spec()
+
+idf = False
+def get_idf(module):
+    global idf
+    if not idf:
+        idf = cPickle.load(open("/server/crowdlabs/apps/vistrails/index/module.idf"))
+    return idf.get(module.type, 9.0)
+def getIDF(type):
+    global idf
+    if not idf:
+        idf = cPickle.load(open("/server/crowdlabs/apps/vistrails/index/module.idf")) 
+    return idf.get(type, 9.0)
+
+idf2 = False
+def get2IDF(type):
+    global idf2
+    if not idf2:
+        idf2 = cPickle.load(open("2grams.idf"))
+    return idf2.get(type, 9.0)
+
+# right now actually just DF
+path_idf = False
+def getPathIDF(path):
+    global path_idf
+    if not path_idf:
+        path_idf = cPickle.load(open("idf.pi"))
+    return path_idf.get(path, 0)
+
+# right now actually just DF
+coIndex = False
+def getCoIndex(pair):
+    global coIndex
+    if not coIndex:
+        coIndex = cPickle.load(open("coindex.pi"))
+    return coIndex.get(pair, 1)
+
+
+
diff --git a/vistrails/index/vistrailanalyzer.py b/vistrails/index/vistrailanalyzer.py
new file mode 100644
index 0000000..303e92b
--- /dev/null
+++ b/vistrails/index/vistrailanalyzer.py
@@ -0,0 +1,116 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import re
+
+from lucene import *
+import lucene
+dir(lucene)
+
+class vistrailAnalyzer(PythonAnalyzer):
+
+    def tokenStream(self, fieldName, reader):
+
+        result = StandardTokenizer(reader)
+        result = StandardFilter(result)
+        result = vistrailFilter(result)
+        result = LowerCaseFilter(result)
+        result = PorterStemFilter(result)
+        result = StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS)
+
+        return result
+
+class stemmingAnalyzer(PythonAnalyzer):
+
+    def tokenStream(self, fieldName, reader):
+
+        result = StandardTokenizer(reader)
+        result = StandardFilter(result)
+        result = LowerCaseFilter(result)
+        result = PorterStemFilter(result)
+        result = StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS)
+
+        return result
+
+# patterns for splitting words into substrings
+patterns = [
+    # 32 char md5 sums
+    "[a-f0-9]{32}",
+    # '2D', '3D'
+    "2D", "3D",
+    # words beginning with capital letters
+    "[A-Z][a-z]+",
+    # capital letter sequence ending with a word that begins with a capital letter
+    "[A-Z]*(?=[A-Z][a-z])",
+    # capital letter sequence
+    "[A-Z]{2,}",
+    # non-capital letter sequence
+    "[a-z]{2,}" ]
+
+splitPattern = re.compile("|".join(patterns))
+
+class vistrailFilter(PythonTokenFilter):
+
+    TOKEN_TYPE_PART = "text"
+
+
+    def __init__(self, input):
+        super(vistrailFilter, self).__init__(input)
+        self.input = input
+        self.parts = [] # parts found for the current token
+        self.current = None
+
+    def next(self):
+        if self.parts:
+            # continue adding parts
+            part = self.parts.pop()
+            t = Token(part, self.current.startOffset(),
+                      self.current.endOffset(), self.TOKEN_TYPE_PART)
+            t.setPositionIncrement(0)
+            return t
+        else:
+            # find parts
+            self.current = self.input.next()
+            if self.current is None:
+                return None
+            text = str(self.current.termText())
+            pattern = splitPattern.findall(text)
+            # remove single characters and duplicates
+            pattern = set([p for p in pattern if len(p)>1 and p != text])
+#            if len(pattern) > 0:
+#                print "vistrailFilter", text, "-->",','.join(pattern)
+            self.parts = pattern
+            return self.current
+
+
diff --git a/vistrails/packages/CLTools/README b/vistrails/packages/CLTools/README
new file mode 100644
index 0000000..79b82cc
--- /dev/null
+++ b/vistrails/packages/CLTools/README
@@ -0,0 +1,73 @@
+CLTools provide a way to wrap command line tools so that they can be used as modules in VisTrails.
+
+
+== Using the Wizard ==
+
+To launch the wizard run:
+python vistrails/package/CLTools/wizard.py
+
+The wizard enables you to create and edit a wrapper for a command line tool. You can create input/output ports or constant arguments and ports for stdin/stdout/stderr pipes. You can view and import flags from man and help pages.
+
+Files should be saved as {modulename}.clt in the directory .vistrails/CLTools/
+
+Supported flags:
+-c    Import a command with arguments automatically
+example:
+create a wrapper for ls with two flags
+"python wizard.py -c ls -l -A"
+
+
+== Creating a standalone package ==
+
+1. Create a new directory in ".vistrails/userpackages/"
+2. Copy "__init__.py" and "init.py" from "vistrails/packages/CLTools" to the new directory.
+3. Update "name", "identifier", and "version" in "__init__.py" to the desired values
+4. Move all desired tools (*.clt files) to the new directory
+5. Test the new package
+
+
+== File Format ==
+
+The wrapper is stored as a JSON file with the following syntax:
+
+ROOT is a dict with the following possible keys:
+* command (required) - value is the command to execute like "cat" or "/home/tommy/cat"
+* stdin - handle stdin - value is a 3-list ["port name", CLASS, OPTIONDICT]
+* stdout - handle stdout - value is a 3-list ["port name", CLASS, OPTIONDICT]
+* stderr - handle stdout - value is a 3-list ["port name", CLASS, OPTIONDICT]
+* args - list of ordered arguments that can either be constants, inputs, or outputs. See ARG.
+* options - a dict of module options - see OPTIONDICT
+OPTIONDICT is a dict with module specific options
+recognized options are:
+std_using_files - connect files to pipes so that they need not be stored in memory. This is useful for large files but may be unsafe since it does not use subprocess.communicate
+ARG is a 4-list containing [TYPE, "name", KLASS, ARGOPTIONDICT]
+TYPE is one of:
+* input - create input port for this arg
+* output - create output port for this arg
+* constant - use "port name" directly as a constant string
+CLASS can either be "File", "String", "Flag", or "List". Unknown types are handled as "String". "Flag" is a boolean with the value specified by option "value". "List" is a list with subtype specified by option "type"
+ARGOPTIONDICT is a dict containing argument options. recognized options are:
+"type": "CLASS" - used by List-types to specify subtype.
+"flag": "name" - Append name as a constant before the specified argument. If type is "List" it is appended before each item
+"prefix": "name" - Append name as a prefix to the final argument. If it is also a list it is appended to each item.
+"required": "" - Makes the port always visible in VisTrails.
+
+
+== EXAMPLE ==
+
+wrap the command "cat" that takes 2 files as input named "first" and "second". Also take a list of files as input named "rest".
+Catch stdout as file, name it "combined".
+Catch stderr as string, name it "stderr".
+Show only "first" and "conbined" by default.
+
+{"command": "cat",
+"args": [["input", "first", "File", {"required":""}],
+         ["input", "second", "File", {}],
+         ["input", "rest", "List", {"type":"File"}]],
+"stdout": ["combined", "File", {"required":""}],
+"stderr": ["stderr", "String", {}]
+}
+
+Save as /home/{username}/.vistrails/CLTools/cat.clt
+Reload CLTools package in VisTrails. Test the new module.
+
diff --git a/vistrails/packages/CLTools/__init__.py b/vistrails/packages/CLTools/__init__.py
new file mode 100644
index 0000000..cf437f7
--- /dev/null
+++ b/vistrails/packages/CLTools/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This package provides a way to wrap command line tools into VisTrails modules
+"""
+from vistrails.core.configuration import ConfigurationObject
+
+from identifiers import *
+
+configuration = ConfigurationObject(env=(None, str))
diff --git a/vistrails/packages/CLTools/icons/document-new.png b/vistrails/packages/CLTools/icons/document-new.png
new file mode 100644
index 0000000..e3808a1
Binary files /dev/null and b/vistrails/packages/CLTools/icons/document-new.png differ
diff --git a/vistrails/packages/CLTools/icons/document-open.png b/vistrails/packages/CLTools/icons/document-open.png
new file mode 100644
index 0000000..254a6b8
Binary files /dev/null and b/vistrails/packages/CLTools/icons/document-open.png differ
diff --git a/vistrails/packages/CLTools/icons/document-save-as.png b/vistrails/packages/CLTools/icons/document-save-as.png
new file mode 100644
index 0000000..340a87e
Binary files /dev/null and b/vistrails/packages/CLTools/icons/document-save-as.png differ
diff --git a/vistrails/packages/CLTools/icons/document-save.png b/vistrails/packages/CLTools/icons/document-save.png
new file mode 100644
index 0000000..a94e0ea
Binary files /dev/null and b/vistrails/packages/CLTools/icons/document-save.png differ
diff --git a/vistrails/packages/CLTools/icons/go-down.png b/vistrails/packages/CLTools/icons/go-down.png
new file mode 100644
index 0000000..af23788
Binary files /dev/null and b/vistrails/packages/CLTools/icons/go-down.png differ
diff --git a/vistrails/packages/CLTools/icons/go-up.png b/vistrails/packages/CLTools/icons/go-up.png
new file mode 100644
index 0000000..b0a0cd7
Binary files /dev/null and b/vistrails/packages/CLTools/icons/go-up.png differ
diff --git a/vistrails/packages/CLTools/icons/list-add.png b/vistrails/packages/CLTools/icons/list-add.png
new file mode 100644
index 0000000..306d3d8
Binary files /dev/null and b/vistrails/packages/CLTools/icons/list-add.png differ
diff --git a/vistrails/packages/CLTools/icons/list-remove.png b/vistrails/packages/CLTools/icons/list-remove.png
new file mode 100644
index 0000000..45e5c2a
Binary files /dev/null and b/vistrails/packages/CLTools/icons/list-remove.png differ
diff --git a/vistrails/packages/CLTools/icons/view-refresh.png b/vistrails/packages/CLTools/icons/view-refresh.png
new file mode 100644
index 0000000..cab4d02
Binary files /dev/null and b/vistrails/packages/CLTools/icons/view-refresh.png differ
diff --git a/vistrails/packages/CLTools/identifiers.py b/vistrails/packages/CLTools/identifiers.py
new file mode 100644
index 0000000..4b61931
--- /dev/null
+++ b/vistrails/packages/CLTools/identifiers.py
@@ -0,0 +1,4 @@
+name = 'CLTools'
+identifier = "org.vistrails.vistrails.cltools"
+version = "0.1.2"
+old_identifiers = ["edu.utah.sci.vistrails.cltools"]
diff --git a/vistrails/packages/CLTools/init.py b/vistrails/packages/CLTools/init.py
new file mode 100644
index 0000000..4e23521
--- /dev/null
+++ b/vistrails/packages/CLTools/init.py
@@ -0,0 +1,563 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 B Y THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+## THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import errno
+import json
+import os
+import shutil
+import subprocess
+import sys
+
+from vistrails.core.modules.vistrails_module import Module, ModuleError, IncompleteImplementation, new_module
+import vistrails.core.modules.module_registry
+from vistrails.core import debug
+from vistrails.core.packagemanager import get_package_manager
+import vistrails.core.system
+from vistrails.core.system import packages_directory, vistrails_root_directory
+
+import identifiers
+
+
+cl_tools = {}
+
+
+class CLTools(Module):
+    """ CLTools is the base Module.
+     We will create a SUDSWebService Module for each method published by 
+     the web service.
+
+    """
+    def compute(self):
+        raise IncompleteImplementation
+
+
+SUFFIX = '.clt'
+DEFAULTFILESUFFIX = '.cld'
+
+
+def _eintr_retry_call(func, *args):
+    """Fixes OSErrors and IOErrors
+
+    From: http://code.google.com/p/seascope/source/detail?spec=svn8dbe5e23d41db673727ce90fd338e9a43f8877e8&name=8dbe5e23d41d&r=8dbe5e23d41db673727ce90fd338e9a43f8877e8
+    IOError added
+    """
+    while True:
+        try:
+            return func(*args)
+        except (OSError, IOError), e:
+            if e.errno == errno.EINTR:
+                continue
+            raise
+
+
+def add_tool(path):
+    # first create classes
+    tool_name = os.path.basename(path)
+    if not tool_name.endswith(SUFFIX):
+        return
+    (tool_name, _) = os.path.splitext(tool_name)
+
+    if tool_name in cl_tools:
+        debug.critical("Package CLTools already added: '%s'" % tool_name)
+    try:
+        conf = json.load(open(path))
+    except ValueError as exc:
+        debug.critical("Package CLTools could not parse '%s'" % path, exc)
+        return
+
+    def compute(self):
+        """ 1. read inputs
+            2. call with inputs
+            3. set outputs
+        """
+        # add all arguments as an unordered list
+        args = [self.conf['command']]
+        file_std = 'options' in self.conf and 'std_using_files' in self.conf['options']
+        setOutput = [] # (name, File) - set File contents as output for name
+        open_files = []
+        stdin = None
+        kwargs = {}
+        for type, name, klass, options in self.conf['args']:
+            type = type.lower()
+            klass = klass.lower()
+            if "constant" == type:
+                flag = 'flag' in options and options['flag']
+                if flag:
+                    args.append(flag)
+                if name:
+                    # if flag==name we assume user tried to name a constant
+                    if not name == flag:
+                        args.append('%s%s' % (options.get('prefix', ''), name))
+            elif "input" == type:
+                # handle multiple inputs
+                values = self.forceGetInputListFromPort(name)
+                if values and 'list' == klass:
+                    values = values[0]
+                    klass = options['type'].lower() \
+                      if 'type' in options else 'string'
+                for value in values:
+                    if 'flag' == klass:
+                        if not value:
+                            continue
+                        if 'flag' in options and options['flag']:
+                            value = options['flag']
+                        else:
+                            # use name as flag
+                            value = name
+                    elif 'file' == klass:
+                        value = value.name
+                    # check for flag and append file name
+                    if not 'flag' == klass and 'flag' in options:
+                        args.append(options['flag'])
+                    value = '%s%s' % (options.get('prefix', ''),
+                                      value)
+                    args.append(value)
+            elif "output" == type:
+                # output must be a filename but we may convert the result to a string
+                # create new file
+                file = self.interpreter.filePool.create_file(
+                        suffix=options.get('suffix', DEFAULTFILESUFFIX))
+                fname = file.name
+                if 'prefix' in options:
+                    fname = options['prefix'] + fname
+                if 'flag' in options:
+                    args.append(options['flag'])
+                args.append(fname)
+                if "file" == klass:
+                    self.setResult(name, file)
+                elif "string" == klass:
+                    setOutput.append((name, file))
+                else:
+                    raise ValueError
+            elif "inputoutput" == type:
+                # handle single file that is both input and output
+                value = self.getInputFromPort(name)
+
+                # create copy of infile to operate on
+                outfile = self.interpreter.filePool.create_file(
+                        suffix=options.get('suffix', DEFAULTFILESUFFIX))
+                try:
+                    shutil.copyfile(value.name, outfile.name)
+                except IOError, e:
+                    raise ModuleError("Error copying file '%s': %s" %
+                                      (value.name, e))
+                value = '%s%s' % (options.get('prefix', ''), outfile.name)
+                # check for flag and append file name
+                if 'flag' in options:
+                    args.append(options['flag'])
+                args.append(value)
+                self.setResult(name, outfile)
+        if "stdin" in self.conf:
+            name, type, options = self.conf["stdin"]
+            type = type.lower()
+            if self.hasInputFromPort(name):
+                value = self.getInputFromPort(name)
+                if "file" == type:
+                    if file_std:
+                        f = open(value.name, 'rb')
+                    else:
+                        f = open(value.name, 'rb')
+                        stdin = f.read()
+                        f.close()
+                elif "string" == type:
+                    if file_std:
+                        file = self.interpreter.filePool.create_file()
+                        f = open(file.name, 'wb')
+                        f.write(value)
+                        f.close()
+                        f = open(file.name, 'rb')
+                    else:
+                        stdin = value
+                else:
+                    raise ValueError
+                if file_std:
+                    open_files.append(f)
+                    kwargs['stdin'] = f.fileno()
+                else:
+                    kwargs['stdin'] = subprocess.PIPE
+        if "stdout" in self.conf:
+            if file_std:
+                name, type, options = self.conf["stdout"]
+                type = type.lower()
+                file = self.interpreter.filePool.create_file(
+                        suffix=DEFAULTFILESUFFIX)
+                if "file" == type:
+                    self.setResult(name, file)
+                elif "string" == type:
+                    setOutput.append((name, file))
+                else:
+                    raise ValueError
+                f = open(file.name, 'wb')
+                open_files.append(f)
+                kwargs['stdout'] = f.fileno()
+            else:
+                kwargs['stdout'] = subprocess.PIPE
+        if "stderr" in self.conf:
+            if file_std:
+                name, type, options = self.conf["stderr"]
+                type = type.lower()
+                file = self.interpreter.filePool.create_file(
+                        suffix=DEFAULTFILESUFFIX)
+                if "file" == type:
+                    self.setResult(name, file)
+                elif "string" == type:
+                    setOutput.append((name, file))
+                else:
+                    raise ValueError
+                f = open(file.name, 'wb')
+                open_files.append(f)
+                kwargs['stderr'] = f.fileno()
+            else:
+                kwargs['stderr'] = subprocess.PIPE
+
+        if "return_code" in self.conf:
+            return_code = self.forceGetInputFromPort(name)
+        else:
+            return_code = None
+
+        env = {}
+        # 0. add defaults
+        # 1. add from configuration
+        # 2. add from module env
+        # 3. add from env port
+        if configuration.check('env'):
+            try:
+                for var in configuration.env.split(";"):
+                    key, value = var.split('=')
+                    key = key.strip()
+                    value = value.strip()
+                    if key:
+                        env[key] = value
+            except Exception, e:
+                raise ModuleError('Error parsing configuration env: %s' % e)
+
+        if 'options' in self.conf and 'env' in self.conf['options']:
+            try:
+                for var in self.conf['options']['env'].split(";"):
+                    key, value = var.split('=')
+                    key = key.strip()
+                    value = value.strip()
+                    if key:
+                        env[key] = value
+            except Exception, e:
+                raise ModuleError('Error parsing module env: %s' % e)
+            
+        if 'options' in self.conf and 'env_port' in self.conf['options']:
+            for e in self.forceGetInputListFromPort('env'):
+                try:
+                    for var in e.split(';'):
+                        if not var:
+                            continue
+                        key, value = var.split('=')
+                        key = key.strip()
+                        value = value.strip()
+                        if key:
+                            env[key] = value
+                except Exception, e:
+                    raise ModuleError('Error parsing env port: %s' % e)
+
+        if env:
+            kwargs['env'] = dict(os.environ)
+            kwargs['env'].update(env)
+            # write to execution provenance
+            env = ';'.join(['%s=%s'%(k,v) for k,v in env.iteritems()])
+            self.annotate({'execution_env': env})
+
+        if 'dir' in self.conf:
+            kwargs['cwd'] = self.conf['dir']
+
+        process = subprocess.Popen(args, **kwargs)
+        if file_std:
+            process.wait()
+        else:
+            #if stdin:
+            #    print "stdin:", len(stdin), stdin[:30]
+            stdout, stderr = _eintr_retry_call(process.communicate, stdin)
+            #stdout, stderr = process.communicate(stdin)
+            #if stdout:
+            #    print "stdout:", len(stdout), stdout[:30]
+            #if stderr:
+            #    print "stderr:", len(stderr), stderr[:30]
+
+        if return_code is not None:
+            if process.returncode != return_code:
+                raise ModuleError("Command returned %d (!= %d)" % (
+                                  process.returncode, return_code))
+        self.setResult('return_code', process.returncode)
+
+        for f in open_files:
+            f.close()
+
+        for name, file in setOutput:
+            f = open(file.name, 'rb')
+            self.setResult(name, f.read())
+            f.close()
+
+        if not file_std:
+            if stdout and "stdout" in self.conf:
+                name, type, options = self.conf["stdout"]
+                type = type.lower()
+                if "file" == type:
+                    file = self.interpreter.filePool.create_file(
+                            suffix=DEFAULTFILESUFFIX)
+                    f = open(file.name, 'wb')
+                    f.write(stdout)
+                    f.close()
+                    self.setResult(name, file)
+                elif "string" == type:
+                    self.setResult(name, stdout)
+                else:
+                    raise ValueError
+            if stderr and "stderr" in self.conf:
+                name, type, options = self.conf["stderr"]
+                type = type.lower()
+                if "file" == type:
+                    file = self.interpreter.filePool.create_file(
+                            suffix=DEFAULTFILESUFFIX)
+                    f = open(file.name, 'wb')
+                    f.write(stderr)
+                    f.close()
+                    self.setResult(name, file)
+                elif "string" == type:
+                    self.setResult(name, stderr)
+                else:
+                    raise ValueError
+
+
+    # create docstring
+    d = """This module is a wrapper for the command line tool '%s'""" % \
+        conf['command']
+    # create module
+    M = new_module(CLTools, tool_name,{"compute": compute,
+                                           "conf": conf,
+                                           "tool_name": tool_name,
+                                           "__doc__": d})
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    reg.add_module(M, package=identifiers.identifier,
+                   package_version=identifiers.version)
+
+    def to_vt_type(s):
+        # add recognized types here - default is String
+        return '(basic:%s)' % \
+          {'file':'File', 'flag':'Boolean', 'list':'List',
+           'float':'Float','integer':'Integer'
+          }.get(s.lower(), 'String')
+    # add module ports
+    if 'stdin' in conf:
+        name, type, options = conf['stdin']
+        optional = 'required' not in options
+        reg.add_input_port(M, name, to_vt_type(type), optional=optional)
+    if 'stdout' in conf:
+        name, type, options = conf['stdout']
+        optional = 'required' not in options
+        reg.add_output_port(M, name, to_vt_type(type), optional=optional)
+    if 'stderr' in conf:
+        name, type, options = conf['stderr']
+        optional = 'required' not in options
+        reg.add_output_port(M, name, to_vt_type(type), optional=optional)
+    if 'options' in conf and 'env_port' in conf['options']:
+        reg.add_input_port(M, 'env', to_vt_type('string'))
+    for type, name, klass, options in conf['args']:
+        optional = 'required' not in options
+        if 'input' == type.lower():
+            reg.add_input_port(M, name, to_vt_type(klass), optional=optional)
+        elif 'output' == type.lower():
+            reg.add_output_port(M, name, to_vt_type(klass), optional=optional)
+        elif 'inputoutput' == type.lower():
+            reg.add_input_port(M, name, to_vt_type('file'), optional=optional)
+            reg.add_output_port(M, name, to_vt_type('file'), optional=optional)
+    reg.add_output_port(M, 'return_code', to_vt_type('integer'))
+    cl_tools[tool_name] = M
+
+
+def initialize(*args, **keywords):
+    if "CLTools" == identifiers.name:
+        # this is the original package 
+        location = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                "CLTools")
+        # make sure dir exist
+        if not os.path.isdir(location):
+            try:
+                debug.log("Creating CLTools directory...")
+                os.mkdir(location)
+            except:
+                debug.critical("""Could not create CLTools directory. Make
+ sure '%s' does not exist and parent directory is writable""" % location)
+                sys.exit(1)
+    else:
+        # this is a standalone package so modules are placed in this directory
+        location = os.path.dirname(__file__)
+    
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    reg.add_module(CLTools, abstract=True)
+    for path in os.listdir(location):
+        if path.endswith(SUFFIX):
+            try:
+                add_tool(os.path.join(location, path))
+            except Exception as exc:
+                import traceback
+                debug.critical("Package CLTools failed to create module "
+                   "from '%s': %s" % (os.path.join(location, path), exc),
+                   traceback.format_exc())
+
+
+def remove_all_scripts():
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    for tool_name in cl_tools.keys():
+        del cl_tools[tool_name]
+        reg.delete_module(identifiers.identifier, tool_name)
+
+def reload_scripts():
+    remove_all_scripts()
+    if "CLTools" == identifiers.name:
+        # this is the original package
+        location = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                "CLTools")
+        # make sure dir exist
+        if not os.path.isdir(location):
+            try:
+                debug.log("Creating CLTools directory...")
+                os.mkdir(location)
+            except:
+                debug.critical("""Could not create CLTools directory. Make
+ sure '%s' does not exist and parent directory is writable""" % location)
+                sys.exit(1)
+    else:
+        # this is a standalone package so modules are placed in this directory
+        location = os.path.dirname(__file__)
+    
+    for path in os.listdir(location):
+        if path.endswith(SUFFIX):
+            try:
+                add_tool(os.path.join(location, path))
+            except Exception as exc:
+                import traceback
+                debug.critical("Package CLTools failed to create module "
+                   "from '%s': %s" % (os.path.join(location, path), exc),
+                   traceback.format_exc())
+
+    from vistrails.core.interpreter.cached import CachedInterpreter
+    CachedInterpreter.clear_package(identifiers.identifier)
+
+    from vistrails.gui.vistrails_window import _app
+    _app.invalidate_pipelines()
+
+
+wizards_list = []
+
+def menu_items():
+    """menu_items() -> tuple of (str,function)
+    It returns a list of pairs containing text for the menu and a
+    callback function that will be executed when that menu item is selected.
+    
+    """
+    # if wizard.py does not exist, assume it is a standalone package and abort
+    try:
+        from wizard import QCLToolsWizardWindow
+    except:
+        return
+    lst = []
+    if "CLTools" == identifiers.name:
+        def open_wizard():
+            window = QCLToolsWizardWindow(reload_scripts=reload_scripts)
+            wizards_list.append(window)
+            window.show()
+        lst.append(("Open Wizard", open_wizard))
+    lst.append(("Reload All Scripts", reload_scripts))
+    return tuple(lst)
+
+
+def finalize():
+    pass
+
+
+###############################################################################
+
+import unittest
+from vistrails.tests.utils import execute, intercept_results
+
+
+class TestCLTools(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        # first make sure CLTools is loaded
+        pm = get_package_manager()
+        if 'CLTools' not in pm._package_list:
+            pm.late_enable_package('CLTools')
+        remove_all_scripts()
+        cls.testdir = os.path.join(packages_directory(), 'CLTools', 'test_files')
+        cls._tools = {}
+        for name in os.listdir(cls.testdir):
+            if not name.endswith(SUFFIX):
+                continue
+            add_tool(os.path.join(cls.testdir, name))
+            toolname = os.path.splitext(name)[0]
+            cls._tools[toolname] = cl_tools[toolname]
+        cls._old_dir = os.getcwd()
+        os.chdir(vistrails_root_directory())
+
+    @classmethod
+    def tearDownClass(cls):
+        os.chdir(cls._old_dir)
+        reload_scripts()
+
+    def do_the_test(self, toolname):
+        with intercept_results(self._tools['intern_cltools_1'],
+                'return_code', 'f_out', 'stdout') as (
+                return_code, f_out, stdout):
+            self.assertFalse(execute([
+                    ('intern_cltools_1', 'org.vistrails.vistrails.cltools', [
+                        ('f_in', [('File', self.testdir + '/test_1.cltest')]),
+                        ('chars', [('List', '["a", "b", "c"]')]),
+                        ('false', [('Boolean', 'False')]),
+                        ('true', [('Boolean', 'True')]),
+                        ('nb', [('Integer', '42')]),
+                        ('stdin', [('String', 'some line\nignored')]),
+                    ]),
+                ]))
+        self.assertEqual(return_code, [0])
+        self.assertEqual(f_out, ['ok\nmessage received'])
+        self.assertEqual(stdout, ['program output here'])
+
+    def test_with_pipes(self):
+        """Without std_using_files: use pipes instead of files.
+        """
+        self.do_the_test('intern_cltools_1')
+
+    def test_with_files(self):
+        """With std_using_files: use files instead of pipes.
+        """
+        self.do_the_test('intern_cltools_2')
diff --git a/vistrails/packages/CLTools/test_files/intern_cltools_1.clt b/vistrails/packages/CLTools/test_files/intern_cltools_1.clt
new file mode 100644
index 0000000..d2bf818
--- /dev/null
+++ b/vistrails/packages/CLTools/test_files/intern_cltools_1.clt
@@ -0,0 +1,78 @@
+{
+    "args": [
+        [
+            "constant", 
+            "packages/CLTools/test_files/test_script_1.py", 
+            "string", 
+            {}
+        ], 
+        [
+            "input", 
+            "f_in", 
+            "file", 
+            {
+                "required": ""
+            }
+        ], 
+        [
+            "output", 
+            "f_out", 
+            "string", 
+            {
+                "required": "", 
+                "suffix": ".cltest"
+            }
+        ], 
+        [
+            "input", 
+            "true", 
+            "flag", 
+            {
+                "flag": "-t", 
+                "required": ""
+            }
+        ], 
+        [
+            "input", 
+            "false", 
+            "flag", 
+            {
+                "flag": "-f", 
+                "required": ""
+            }
+        ], 
+        [
+            "input", 
+            "nb", 
+            "integer", 
+            {
+                "required": ""
+            }
+        ], 
+        [
+            "input", 
+            "chars", 
+            "list", 
+            {
+                "flag": "-l", 
+                "required": "", 
+                "type": "String"
+            }
+        ]
+    ], 
+    "command": "python", 
+    "stdin": [
+        "stdin", 
+        "string", 
+        {
+            "required": ""
+        }
+    ], 
+    "stdout": [
+        "stdout", 
+        "string", 
+        {
+            "required": ""
+        }
+    ]
+}
\ No newline at end of file
diff --git a/vistrails/packages/CLTools/test_files/intern_cltools_2.clt b/vistrails/packages/CLTools/test_files/intern_cltools_2.clt
new file mode 100644
index 0000000..91cd2fd
--- /dev/null
+++ b/vistrails/packages/CLTools/test_files/intern_cltools_2.clt
@@ -0,0 +1,81 @@
+{
+    "args": [
+        [
+            "constant", 
+            "packages/CLTools/test_files/test_script_1.py", 
+            "string", 
+            {}
+        ], 
+        [
+            "input", 
+            "f_in", 
+            "file", 
+            {
+                "required": ""
+            }
+        ], 
+        [
+            "output", 
+            "f_out", 
+            "string", 
+            {
+                "required": "", 
+                "suffix": ".cltest"
+            }
+        ], 
+        [
+            "input", 
+            "true", 
+            "flag", 
+            {
+                "flag": "-t", 
+                "required": ""
+            }
+        ], 
+        [
+            "input", 
+            "false", 
+            "flag", 
+            {
+                "flag": "-f", 
+                "required": ""
+            }
+        ], 
+        [
+            "input", 
+            "nb", 
+            "integer", 
+            {
+                "required": ""
+            }
+        ], 
+        [
+            "input", 
+            "chars", 
+            "list", 
+            {
+                "flag": "-l", 
+                "required": "", 
+                "type": "String"
+            }
+        ]
+    ], 
+    "command": "python", 
+    "options": {
+        "std_using_files": ""
+    }, 
+    "stdin": [
+        "stdin", 
+        "string", 
+        {
+            "required": ""
+        }
+    ], 
+    "stdout": [
+        "stdout", 
+        "string", 
+        {
+            "required": ""
+        }
+    ]
+}
\ No newline at end of file
diff --git a/vistrails/packages/CLTools/test_files/test_1.cltest b/vistrails/packages/CLTools/test_files/test_1.cltest
new file mode 100644
index 0000000..d54e5bc
--- /dev/null
+++ b/vistrails/packages/CLTools/test_files/test_1.cltest
@@ -0,0 +1,2 @@
+this is a
+test
\ No newline at end of file
diff --git a/vistrails/packages/CLTools/test_files/test_script_1.py b/vistrails/packages/CLTools/test_files/test_script_1.py
new file mode 100644
index 0000000..31a76c6
--- /dev/null
+++ b/vistrails/packages/CLTools/test_files/test_script_1.py
@@ -0,0 +1,42 @@
+import sys
+
+
+if __name__ == '__main__':
+    args = sys.argv[1:]
+
+    if len(args) != 10:
+        sys.stderr.write("Wrong number of parameters\n")
+        sys.exit(1)
+
+    fin = args.pop(0)
+    fout = args.pop(0)
+
+    if args != ['-t', '42', '-l', 'a', '-l', 'b', '-l', 'c']:
+        sys.stderr.write("Wrong parameters\n")
+        sys.exit(1)
+
+    stdin = sys.stdin.readline()
+    if stdin != 'some line\n':
+        sys.stderr.write("Wrong line on stdin\n")
+        sys.exit(1)
+
+    if not fin.endswith('.cltest'):
+        sys.stderr.write("Wrong extension for f_in '%s'\n" % fin)
+        sys.exit(1)
+
+    with open(fin, 'r') as fpin:
+        fcin = fpin.read()
+    if fcin != 'this is a\ntest':
+        sys.stderr.write("Wrong content in f_in '%s'\n" % fin)
+        sys.exit(1)
+
+    if not fout.endswith('.cltest'):
+        sys.stderr.write("Wrong extension for f_out '%s'\n" % fout)
+        sys.exit(1)
+
+    with open(fout, 'wb') as fpout:
+        fpout.write('ok\nmessage received')
+
+    sys.stdout.write("program output here")
+
+    sys.exit(0)
diff --git a/vistrails/packages/CLTools/wizard.py b/vistrails/packages/CLTools/wizard.py
new file mode 100644
index 0000000..41bc170
--- /dev/null
+++ b/vistrails/packages/CLTools/wizard.py
@@ -0,0 +1,1163 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+if __name__ == '__main__':
+    import sip
+    sip.setapi('QString', 2)
+    sip.setapi('QVariant', 2)
+
+import json
+import os
+import platform
+import string
+import subprocess
+import sys
+import threading
+from PyQt4 import QtCore, QtGui
+
+encode_list = [['\xe2\x80\x90', '-'],
+               ['\xe2\x80\x9d', '"'],
+               ['\xe2\x80\x9c', '"']]
+
+SUFFIX = '.clt'
+
+def default_dir():
+    systemType = platform.system()
+    if systemType in ['Windows', 'Microsoft']:
+        if len(os.environ['HOMEPATH']) == 0:
+            root = '\\'
+        else:
+            root = os.environ['HOMEDRIVE'] + os.environ['HOMEPATH']
+    else:
+        root = os.getenv('HOME')
+    default_dir = os.path.join(root, '.vistrails', 'CLTools')
+    if not os.path.exists(default_dir):
+        os.mkdir(default_dir)
+    return default_dir
+
+def quote_arg(arg):
+    arg = arg.replace('\\', '\\\\')
+    if '"' in arg or any(c in arg for c in string.whitespace):
+        return '"%s"' % arg.replace('"', '\\"')
+    else:
+        return arg
+
+# From: https://gist.github.com/kirpit/1306188
+class Command(object):
+    """
+    Enables to run subprocess commands in a different thread with TIMEOUT option.
+ 
+    Based on jcollado's solution:
+    http://stackoverflow.com/questions/1191374/subprocess-with-timeout/4825933#4825933
+    """
+    command = None
+    process = None
+    status = None
+    output, error = '', ''
+ 
+    def __init__(self, command):
+        self.command = command
+ 
+    def run(self, timeout=5, **kwargs):
+        """ Run a command then return: (status, output, error). """
+        def target(**kwargs):
+            try:
+                self.process = subprocess.Popen(self.command, **kwargs)
+                self.output, self.error = self.process.communicate()
+                self.status = self.process.returncode
+            except:
+                import traceback
+                self.error = traceback.format_exc()
+                self.status = -1
+        # default stdout and stderr
+        if 'stdout' not in kwargs:
+            kwargs['stdout'] = subprocess.PIPE
+        if 'stderr' not in kwargs:
+            kwargs['stderr'] = subprocess.PIPE
+        # thread
+        print "calling with kwargs", target, kwargs
+        thread = threading.Thread(target=target, kwargs=kwargs)
+        thread.start()
+        thread.join(timeout)
+        if thread.is_alive():
+            self.process.terminate()
+            thread.join()
+        return self.status, self.output, self.error
+
+class QCLToolsWizard(QtGui.QWidget):
+    def __init__(self, parent, reload_scripts=None):
+        QtGui.QWidget.__init__(self, parent)
+
+        self.vbox = QtGui.QVBoxLayout()
+        self.vbox.setContentsMargins(5,5,5,5)
+
+        self.setLayout(self.vbox)
+        self.setTitle()
+        self.file = None
+        self.conf = None
+        self.reload_scripts = reload_scripts
+
+        self.toolBar = QtGui.QToolBar()
+        self.layout().addWidget(self.toolBar)
+        self.newFileAction = QtGui.QAction(
+            self.get_icon('document-new'), 'New', self)
+        self.newFileAction.setToolTip('Start on a new Wrapper')
+        self.connect(self.newFileAction, QtCore.SIGNAL('triggered()'),
+                     self.newFile)
+        self.toolBar.addAction(self.newFileAction)
+        self.openFileAction = QtGui.QAction(
+            self.get_icon('document-open'), 'Open', self)
+        self.openFileAction.setToolTip('Open an existing wrapper')
+        self.connect(self.openFileAction, QtCore.SIGNAL('triggered()'),
+                     self.openFile)
+        self.toolBar.addAction(self.openFileAction)
+        self.saveFileAction = QtGui.QAction(
+            self.get_icon('document-save'), 'Save', self)
+        self.saveFileAction.setToolTip('Save wrapper')
+        self.connect(self.saveFileAction, QtCore.SIGNAL('triggered()'),
+                     self.save)
+        self.toolBar.addAction(self.saveFileAction)
+        self.saveFileAsAction = QtGui.QAction(
+            self.get_icon('document-save-as'), 'Save As', self)
+        self.saveFileAsAction.setToolTip('Save wrapper as a new file')
+        self.connect(self.saveFileAsAction, QtCore.SIGNAL('triggered()'),
+                     self.saveAs)
+        self.toolBar.addAction(self.saveFileAsAction)
+
+        if self.reload_scripts:
+            self.reloadAction = QtGui.QAction(
+                self.get_icon('view-refresh'), 'Refresh', self)
+            self.reloadAction.setToolTip('Save and Reload CLTools Modules in VisTrails')
+            self.connect(self.reloadAction, QtCore.SIGNAL('triggered()'),
+                         self.refresh)
+            self.toolBar.addAction(self.reloadAction)
+        
+        self.toolBar.addSeparator()
+        self.addAction = QtGui.QAction(
+            self.get_icon('list-add'), 'Add', self)
+        self.addAction.setToolTip('Add a new argument')
+        self.connect(self.addAction, QtCore.SIGNAL('triggered()'),
+                     self.addArgument)
+        self.toolBar.addAction(self.addAction)
+        self.removeAction = QtGui.QAction(
+            self.get_icon('list-remove'), 'Remove', self)
+        self.removeAction.setToolTip('Remove the selected argument')
+        self.connect(self.removeAction, QtCore.SIGNAL('triggered()'),
+                     self.removeArgument)
+        self.toolBar.addAction(self.removeAction)
+        self.upAction = QtGui.QAction(
+            self.get_icon('go-up'), 'Move up', self)
+        self.upAction.setToolTip('Move argument up one position')
+        self.connect(self.upAction, QtCore.SIGNAL('triggered()'),
+                     self.moveUp)
+        self.toolBar.addAction(self.upAction)
+        self.downAction = QtGui.QAction(
+            self.get_icon('go-down'), 'Move down', self)
+        self.downAction.setToolTip('Move argument down one position')
+        self.connect(self.downAction, QtCore.SIGNAL('triggered()'),
+                     self.moveDown)
+        self.toolBar.addAction(self.downAction)
+        
+        self.toolBar.addSeparator()
+
+        self.showStdin = QtGui.QAction('stdin', self)
+        self.showStdin.setToolTip('Check to use standard input as an input port')
+        self.showStdin.setCheckable(True)
+        self.toolBar.addAction(self.showStdin)
+        self.showStdout = QtGui.QAction("stdout", self)
+        self.showStdout.setToolTip('Check to use standard output as an output port')
+        self.showStdout.setCheckable(True)
+        self.toolBar.addAction(self.showStdout)
+        self.showStderr = QtGui.QAction("stderr", self)
+        self.showStderr.setToolTip('Check to use standard error as an output port')
+        self.showStderr.setCheckable(True)
+        self.toolBar.addAction(self.showStderr)
+        self.envPort = QtGui.QAction("env", self)
+        self.envPort.setToolTip('Check to add the "env" input port for specifying environment variables')
+        self.envPort.setCheckable(True)
+        self.toolBar.addAction(self.envPort)
+        
+        self.toolBar.addSeparator()
+
+        self.stdAsFiles = QtGui.QAction('std file processing', self)
+        self.stdAsFiles.setToolTip('Check to make pipes communicate using files instead of strings\nOnly useful when processing large files')
+        self.stdAsFiles.setCheckable(True)
+        self.toolBar.addAction(self.stdAsFiles)
+
+        self.toolBar.addSeparator()
+
+        self.previewPorts = QtGui.QAction('preview', self)
+        self.previewPorts.setToolTip('Check which ports will be available for this module')
+        self.connect(self.previewPorts, QtCore.SIGNAL('triggered()'),
+                     self.preview_ports)
+        self.toolBar.addAction(self.previewPorts)
+
+        
+        self.envOption = None
+        
+        self.commandLayout = QtGui.QHBoxLayout()
+        self.commandLayout.setContentsMargins(5,5,5,5)
+        tooltip = 'The command to execute'
+        label = QtGui.QLabel("Command:")
+        label.setFixedWidth(80)
+        label.setToolTip(tooltip)
+        self.commandLayout.addWidget(label)
+        self.command = QtGui.QLineEdit()
+        self.command.setToolTip(tooltip)
+        self.commandLayout.addWidget(self.command)
+        tooltip = 'Sets directory to execute from. Leave blank to ignore.'
+        label = QtGui.QLabel("Directory:")
+        label.setToolTip(tooltip)
+        self.commandLayout.addWidget(label)
+        self.dir = QtGui.QLineEdit()
+        self.dir.setFixedWidth(140)
+        self.dir.setToolTip(tooltip)
+        self.commandLayout.addWidget(self.dir)
+        self.vbox.addLayout(self.commandLayout)
+
+        self.previewLayout = QtGui.QHBoxLayout()
+        self.previewLayout.setContentsMargins(5,5,5,5)
+        self.previewLayout.setAlignment(QtCore.Qt.AlignLeft)
+        tooltip = 'Shows what the command will look like when executed in the command line'
+        label = QtGui.QLabel("Preview:")
+        label.setToolTip(tooltip)
+        label.setFixedWidth(80)
+        self.previewLayout.addWidget(label)
+        self.preview = QtGui.QLabel()
+        self.preview.setToolTip(tooltip)
+        self.preview.setMaximumWidth(600)
+        self.previewLayout.addWidget(self.preview)
+        self.vbox.addLayout(self.previewLayout)
+
+        self.importLayout = QtGui.QHBoxLayout()
+        self.importLayout.setContentsMargins(5,5,5,5)
+        self.importLayout.setAlignment(QtCore.Qt.AlignLeft)
+        self.importLayout.addWidget(QtGui.QLabel("Man page:"))
+        self.viewManButton = QtGui.QPushButton("view")
+        self.viewManButton.setToolTip('View the man page for the current command')
+        self.connect(self.viewManButton, QtCore.SIGNAL('clicked()'),
+                     self.viewManPage)
+        self.importLayout.addWidget(self.viewManButton)
+        self.importManButton = QtGui.QPushButton("import")
+        self.importManButton.setToolTip('Import arguments from the man page for the current command')
+        self.connect(self.importManButton, QtCore.SIGNAL('clicked()'),
+                     self.generateFromManPage)
+        self.importLayout.addWidget(self.importManButton)
+
+        self.importLayout.addWidget(QtGui.QLabel("help page (-h):"))
+        self.viewHelpButton = QtGui.QPushButton("view")
+        self.viewHelpButton.setToolTip('View the help (-h) page for the current command')
+        self.connect(self.viewHelpButton, QtCore.SIGNAL('clicked()'),
+                     self.viewHelpPage)
+        self.importLayout.addWidget(self.viewHelpButton)
+        self.importHelpButton = QtGui.QPushButton("import")
+        self.importHelpButton.setToolTip('Import arguments from the help (-h) page for the current command')
+        self.connect(self.importHelpButton, QtCore.SIGNAL('clicked()'),
+                     self.generateFromHelpPage)
+        self.importLayout.addWidget(self.importHelpButton)
+
+        self.importLayout.addWidget(QtGui.QLabel("help page (--help):"))
+        self.viewHelpButton2 = QtGui.QPushButton("view")
+        self.viewHelpButton2.setToolTip('View the help (--help) page for the current command')
+        self.connect(self.viewHelpButton2, QtCore.SIGNAL('clicked()'),
+                     self.viewHelpPage2)
+        self.importLayout.addWidget(self.viewHelpButton2)
+        self.importHelpButton2 = QtGui.QPushButton("import")
+        self.importHelpButton2.setToolTip('Import arguments from the help (--help) page for the current command')
+        self.connect(self.importHelpButton2, QtCore.SIGNAL('clicked()'),
+                     self.generateFromHelpPage2)
+        self.importLayout.addWidget(self.importHelpButton2)
+        self.vbox.addLayout(self.importLayout)
+
+        self.stdinWidget = QArgWidget('stdin')
+        self.stdinGroup = QtGui.QGroupBox('Standard input')
+        self.stdinGroup.setLayout(QtGui.QHBoxLayout())
+        self.stdinGroup.layout().addWidget(self.stdinWidget)
+        self.layout().addWidget(self.stdinGroup)
+        self.stdinGroup.setVisible(False)
+        self.stdoutWidget = QArgWidget('stdout')
+        self.stdoutGroup = QtGui.QGroupBox('Standard output')
+        self.stdoutGroup.setLayout(QtGui.QHBoxLayout())
+        self.stdoutGroup.layout().addWidget(self.stdoutWidget)
+        self.layout().addWidget(self.stdoutGroup)
+        self.stdoutGroup.setVisible(False)
+        self.stderrWidget = QArgWidget('stderr')
+        self.stderrGroup = QtGui.QGroupBox('Standard error')
+        self.stderrGroup.setLayout(QtGui.QHBoxLayout())
+        self.stderrGroup.layout().addWidget(self.stderrWidget)
+        self.layout().addWidget(self.stderrGroup)
+        self.stderrGroup.setVisible(False)
+
+        self.connect(self.showStdin, QtCore.SIGNAL('toggled(bool)'),
+                     self.stdinGroup.setVisible)
+        self.connect(self.showStdout, QtCore.SIGNAL('toggled(bool)'),
+                     self.stdoutGroup.setVisible)
+        self.connect(self.showStderr, QtCore.SIGNAL('toggled(bool)'),
+                     self.stderrGroup.setVisible)
+        
+        self.argList = QtGui.QListWidget()
+        self.layout().addWidget(self.argList)
+
+    def get_icon(self, name):
+        return QtGui.QIcon(os.path.join(os.path.dirname(__file__),
+                                        "icons",
+                                        "%s.png" % name))
+    def setTitle(self, file=None):
+        self.parent().setWindowTitle("CLTools Wizard - " + (file if file else "untitled"))
+
+    def newFile(self):
+        self.conf = None
+        self.file = None
+        self.command.clear()
+        self.dir.clear()
+        self.showStdin.setChecked(False)
+        self.showStdout.setChecked(False)
+        self.showStderr.setChecked(False)
+        self.envPort.setChecked(False)
+        self.envOption = None
+        while self.argList.count():
+            item = self.argList.item(0)
+            itemWidget = self.argList.itemWidget(item)
+            itemWidget.setVisible(False)
+            itemWidget.setParent(None)
+            self.argList.removeItemWidget(item)
+            item.setHidden(True)
+            self.argList.takeItem(0)
+        self.argList.hide()
+        self.layout().takeAt(self.layout().indexOf(self.argList))
+        self.argList = QtGui.QListWidget()
+        self.layout().addWidget(self.argList)
+        self.stdAsFiles.setChecked(False)
+        self.setTitle()
+        self.generate_preview()
+    
+    def openFile(self):
+        fileName = QtGui.QFileDialog.getOpenFileName(self,
+                "Open Wrapper",
+                self.file if self.file else default_dir(),
+                "Wrappers (*%s)" % SUFFIX)
+        if not fileName:
+            return
+        try:
+            conf = json.load(open(fileName))
+        except  ValueError as exc:
+            print "Error opening Wrapper '%s': %s" % (fileName, exc)
+            return
+        self.newFile()
+        self.file = fileName
+        self.setTitle(self.file)
+        self.command.setText(conf.get('command', ''))
+        self.dir.setText(conf.get('dir', ''))
+        if 'stdin' in conf:
+            self.stdinWidget.fromList(conf['stdin'])
+        self.stdinGroup.setVisible('stdin' in conf)
+        self.showStdin.setChecked('stdin' in conf)
+        if 'stdout' in conf:
+            self.stdoutWidget.fromList(conf['stdout'])
+        self.stdoutGroup.setVisible('stdout' in conf)
+        self.showStdout.setChecked('stdout' in conf)
+        if 'stderr' in conf:
+            self.stderrWidget.fromList(conf['stderr'])
+        self.stderrGroup.setVisible('stderr' in conf)
+        self.showStderr.setChecked('stderr' in conf)
+        for argConf in conf.get('args', []):
+            arg = QArgWidget()
+            arg.fromList(argConf)
+            item = QtGui.QListWidgetItem()
+            item.setSizeHint(arg.sizeHint())
+            self.argList.addItem(item)
+            self.argList.setItemWidget(item, arg)
+        self.envPort.setChecked('options' in conf and
+                                'env_port' in conf['options'])
+        self.stdAsFiles.setChecked('options' in conf and
+                                   'std_using_files' in conf['options'])
+        self.envOption = conf['options']['env'] \
+                 if ('options' in conf and 'env' in conf['options']) else None
+        self.conf = conf
+        self.generate_preview()
+            
+    def get_current_conf(self):
+        conf = {}
+        conf['command'] = self.command.text()
+        dir = self.dir.text()
+        if dir:
+            conf['dir'] = dir
+            
+        if self.stdinGroup.isVisible():
+            conf['stdin'] = self.stdinWidget.toList()
+        if self.stdoutGroup.isVisible():
+            conf['stdout'] = self.stdoutWidget.toList()
+        if self.stderrGroup.isVisible():
+            conf['stderr'] = self.stderrWidget.toList()
+        args = []
+        for row in xrange(self.argList.count()):
+            arg = self.argList.itemWidget(self.argList.item(row))
+            args.append(arg.toList())
+        conf['args'] = args
+
+        options = {}
+        if self.stdAsFiles.isChecked():
+            options['std_using_files'] = ''
+        if self.envPort.isChecked():
+            options['env_port'] = ''
+        if self.envOption:
+            options['env'] = self.envOption
+        if options:
+            conf['options'] = options
+        return conf
+    
+    def save(self):
+        if not self.file:
+            self.saveAs()
+            if not self.file:
+                return
+        self.conf = self.get_current_conf()
+        f = open(self.file, "w")
+        json.dump(self.conf, f, sort_keys=True, indent=4)
+        f.close()
+        self.generate_preview()
+
+    def saveAs(self):
+        fileName = QtGui.QFileDialog.getSaveFileName(self,
+                            "Save Wrapper as",
+                            self.file if self.file else default_dir(),
+                            "Wrappers (*%s)" % SUFFIX)
+        if fileName:
+            self.file = fileName
+            if not self.file.endswith(SUFFIX):
+                self.file += SUFFIX
+            self.save()
+            self.setTitle(self.file)
+
+    def refresh(self):
+        self.save()
+        self.reload_scripts()
+    
+    def generate_preview(self):
+        # generate preview from self.conf
+        c = self.get_current_conf()
+        if not c:
+            self.preview.setText('')
+            self.preview.setToolTip('')
+            return
+        
+        text = ''
+
+        # show env as bash-style prefix
+        if 'options' in c:
+            o = c['options']
+            # env_port
+            if 'env_port' in o:
+                text += '<env_port>'
+            # env
+            if 'env' in o:
+                if text:
+                    text += ' '
+                text += c['options']['env']
+            if text:
+                text += ' '
+
+        # command
+        text += c['command']
+
+        # args
+        if 'args' in c:
+            for type, name, klass, opts in c['args']:
+                type = type.lower()
+                klass = klass.lower()
+                text += ' '
+                if type == 'constant':
+                    if 'flag' in opts:
+                        text += opts['flag'] + ' '
+                    text += quote_arg(name)
+                    continue
+                if 'required' not in opts:
+                    text += '['
+                if klass in 'list':
+                    text += '{'
+                if 'flag' in opts:
+                    text += opts['flag']
+                    if klass != 'flag':
+                        text += ' '
+                if 'prefix' in opts:
+                    text += opts['prefix']
+                if type!='input' or klass != 'flag':
+                    text += '<'
+                if klass == 'list':
+                    text += opts['type'].lower() \
+                            if ('type' in opts and opts['type']) else 'string'
+                elif type=='input' and klass == 'flag':
+                    if 'flag' not in opts:
+                        text += quote_arg(name)
+                elif type in ['output', 'inputoutput']:
+                    text += 'file'
+                else:
+                    text += klass
+                if type!='input' or klass != 'flag':
+                    text += '>'
+                if klass == 'list':
+                    text += '}'
+                if 'required' not in opts:
+                    text += ']' 
+                
+        self.preview.setText(text)
+        self.preview.setToolTip(text)
+
+    def preview_ports(self):
+        # show dialog with the ports that this module will have
+        self.generate_preview()
+        conf = self.get_current_conf()
+        if not conf:
+            return
+
+        intext = []
+        outtext = []
+
+        if 'stdin' in conf:
+            name, type, options = conf['stdin']
+            optional = " (visible)" if "required" in options else ""
+            intext.append("%s: %s%s" % (name, type, optional))
+        if 'stdout' in conf:
+            name, type, options = conf['stdout']
+            optional = " (visible)" if "required" in options else ""
+            outtext.append("%s: %s%s" % (name, type, optional))
+        if 'stderr' in conf:
+            name, type, options = conf['stderr']
+            optional = " (visible)" if "required" in options else ""
+            outtext.append("%s: %s%s" % (name, type, optional))
+        if 'options' in conf and 'env_port' in conf['options']:
+            intext.append('env: String')
+        for type, name, klass, options in conf['args']:
+            optional = " (visible)" if "required" in options else ""
+            if 'input' == type.lower():
+                intext.append("%s: %s%s" % (name, klass, optional))
+            elif 'output' == type.lower():
+                outtext.append("%s: %s%s" % (name, klass, optional))
+            elif 'inputoutput' == type.lower():
+                intext.append("%s: %s%s" % (name, 'File', optional))
+                outtext.append("%s: %s%s" % (name, 'File', optional))
+        
+        intext = ''.join(['Input %s. %s\n' % (i+1, t)
+                          for i, t in zip(xrange(len(intext)), intext)])
+        outtext = ''.join(['Output %s. %s\n' % (i+1, t)
+                            for i, t in zip(xrange(len(outtext)), outtext)])
+        
+        self.helppageView = QManpageDialog("Module Ports for this Wrapper",
+                                     intext + "\n" + outtext, self)
+        self.helppageView.show()
+    
+    def loadFromCommand(self, argv):
+        self.command.setText(argv[0])
+        pos = 0
+        for argName in argv[1:]:
+            arg = QArgWidget()
+            arg.guess(argName, pos)
+            pos += 1
+            item = QtGui.QListWidgetItem()
+            item.setSizeHint(arg.sizeHint())
+            self.argList.addItem(item)
+            self.argList.setItemWidget(item, arg)
+
+    def addArgument(self):
+        arg = QArgWidget()
+        item = QtGui.QListWidgetItem()
+        item.setSizeHint(arg.sizeHint())
+        self.argList.addItem(item)
+        self.argList.setItemWidget(item, arg)
+
+    def moveUp(self):
+        currentRow = self.argList.currentRow()
+        if currentRow < 1:
+            return
+        # moving widgets does not work so we just switch contents
+        w0 = self.argList.itemWidget(self.argList.item(currentRow-1))
+        w1 = self.argList.itemWidget(self.argList.item(currentRow))
+        arg0 = w0.toList()
+        arg1 = w1.toList()
+        w0.fromList(arg1)
+        w1.fromList(arg0)
+        self.argList.setCurrentRow(currentRow - 1)
+
+    def moveDown(self):
+        currentRow = self.argList.currentRow()
+        if currentRow<0 or currentRow>self.argList.count()-2:
+            return
+        # moving widgets does not work so we just switch contents
+        w1 = self.argList.itemWidget(self.argList.item(currentRow))
+        w2 = self.argList.itemWidget(self.argList.item(currentRow+1))
+        arg1 = w1.toList()
+        arg2 = w2.toList()
+        w1.fromList(arg2)
+        w2.fromList(arg1)
+        self.argList.setCurrentRow(currentRow + 1)
+
+    def removeArgument(self):
+        currentRow = self.argList.currentRow()
+        if currentRow<0:
+            return
+        self.argList.takeItem(currentRow)
+
+    def keyPressEvent(self, event):
+        if event.key() in [QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace]:
+            self.removeArgument()
+        else:
+            QtGui.QWidget.keyPressEvent(self, event)
+    
+    def parse(self, text):
+        """ parse(self, text)
+        parses the description of a command and extracts possible arguments
+        works on both man pages and help (-h) pages
+        """
+        lines = text.split('\n')
+        args = []
+        arg = None
+        for line in lines:
+            line = line.strip()
+            if len(line)>1 and line[0] == '-':
+                # make sure description is removed
+                flag = line.split('   ')[0].strip()
+                # use the last in the list of equal flags
+                #it is assumed to be most descriptive
+                flag = flag.split(',')[-1].strip()
+                # remove any special characters after flag
+                for i in ['=', '[', ' ']:
+                    flag = flag.split(i)[0].strip()
+                # new arg (type, flag, description)
+                arg = ['Flag', flag, line]
+                if '=' in line: # assume string attribute with prefix 
+                    arg[0] = 'String'
+                args.append(arg)
+            elif arg:
+                if not line:
+                    arg = None
+                else:
+                    arg[2] += ' %s' % line.strip()
+        #print "args:"
+        #for arg in args:
+        #    print arg
+        return args
+        
+    def runProcess(self, args):
+        try:
+            command = Command(args)
+            status, text, stderr = command.run(stdout=subprocess.PIPE,
+                                               stderr=subprocess.PIPE,
+                                               shell=True)
+            if not (text and len(text)):
+                text = stderr
+                if not (text and len(text)) or (text and text.startswith('No ')):
+                    return None
+            # fix weird formatting
+            for a, b in encode_list:
+                text = text.replace(a, b)
+            return text
+        except:
+            return None
+    
+    def generateFromManPage(self):
+        command = self.command.text()
+        if command == '':
+            return
+        text = self.runProcess(['-c', 'man %s | col -b' % command])
+        if not text:
+            QtGui.QMessageBox.warning(self, "Man page not found",
+                                      "For command '%s'" % command)
+            return
+        args = self.parse(text)
+        title = "Import arguments from man page for '%s'" % command
+        self.manpageImport = QManpageImport(title, args, self)
+        self.connect(self.manpageImport,
+                       QtCore.SIGNAL("importArgs(PyQt_PyObject)"),
+                       self.importArgs)
+        self.manpageImport.show()
+
+    def generateFromHelpPage(self):
+        command = self.command.text()
+        if command == '':
+            return
+        text = self.runProcess(['-c', command + ' -h'])
+        if not text:
+            QtGui.QMessageBox.warning(self, "Help page (-h) not found",
+                                      "For command '%s'" % command)
+            return
+        args = self.parse(text)
+
+        title = "Import arguments from help page (-h) for '%s'" % command
+        self.helppageImport = QManpageImport(title, args, self)
+        self.connect(self.helppageImport,
+                       QtCore.SIGNAL("importArgs(PyQt_PyObject)"),
+                       self.importArgs)
+        self.helppageImport.show()
+
+    def generateFromHelpPage2(self):
+        command = self.command.text()
+        if command == '':
+            return
+        text = self.runProcess(['-c', command + ' --help'])
+        if not text:
+            QtGui.QMessageBox.warning(self, "Help page (--help) not found",
+                                      "For command '%s'" % command)
+            return
+        args = self.parse(text)
+
+        title = "Import arguments from help page (--help) for '%s'" % command
+        self.helppageImport = QManpageImport(title, args, self)
+        self.connect(self.helppageImport,
+                       QtCore.SIGNAL("importArgs(PyQt_PyObject)"),
+                       self.importArgs)
+        self.helppageImport.show()
+
+    def viewManPage(self):
+        command = self.command.text()
+        if command == '':
+            return
+        text = self.runProcess(['-c', 'man %s | col -b' % command])
+        if not text:
+            QtGui.QMessageBox.warning(self, "Man page not found",
+                                      "For command '%s'" % command)
+            return
+        title = "man page for '%s'" % command
+        self.manpageView = QManpageDialog(title, text, self)
+        self.manpageView.show()
+
+    def viewHelpPage(self):
+        command = self.command.text()
+        if command == '':
+            return
+        text = self.runProcess(['-c', command + ' -h'])
+        if not text:
+            QtGui.QMessageBox.warning(self, "Help page (-h) not found",
+                                      "For command '%s'" % command)
+            return
+        title = "Help page for '%s'" % command
+        self.helppageView = QManpageDialog(title, text, self)
+        self.helppageView.show()
+
+    def viewHelpPage2(self):
+        command = self.command.text()
+        if command == '':
+            return
+        text = self.runProcess(['-c', command + ' --help'])
+        if not text:
+            QtGui.QMessageBox.warning(self, "Help page (--help) not found",
+                                      "For command '%s'" % command)
+            return
+        title = "Help page for '%s'" % command
+        self.helppageView = QManpageDialog(title, text, self)
+        self.helppageView.show()
+
+    def importArgs(self, args):
+        for arg in args:
+            item = QtGui.QListWidgetItem()
+            item.setSizeHint(arg.sizeHint())
+            self.argList.insertItem(0, item)
+            self.argList.setItemWidget(item, arg)
+
+class QArgWidget(QtGui.QWidget):
+    """ Widget for configuring an argument """
+    KLASSES = {
+            'input': ['flag', 'file', 'string', 'integer', 'float', 'list'],
+            'output': ['file', 'string'],
+            'inputoutput': ['file'],
+            'stdin': ['file', 'string'],
+            'stdout': ['file', 'string'],
+            'stderr': ['file', 'string'],
+        }
+    KLASSNAMES = {
+            'flag': 'Boolean flag',
+            'string': 'String',
+            'integer': 'Integer',
+            'float': 'Float',
+            'file': 'File',
+            'list': 'List',
+        }
+
+    TYPES = ['input', 'output', 'inputoutput', 'constant']
+    TYPENAMES = {
+            'input': 'Input Port',
+            'output': 'Output Port',
+            'inputoutput': 'InputOutput Port',
+            'constant': 'Constant',
+        }
+
+    def __init__(self, argtype='Input', name='untitled', klass='Flag', options={}, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.stdTypes = ['stdin', 'stdout', 'stderr']
+        self.stdLabels = ['Standard input', 'Standard output', 'Standard error']
+        self.stdDict = dict(zip(self.stdTypes, self.stdLabels))
+
+        self.argtype = argtype.lower()
+        self.name = name
+        self.klass = klass.lower()
+        self.options = options
+
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+
+        self.buildWidget()
+
+    def buildWidget(self):
+        layout = self.layout()
+        layout.setContentsMargins(2,2,2,2)
+        # remove any previous layout
+        layout1 = QtGui.QHBoxLayout()
+        layout1.setContentsMargins(2,2,2,2)
+        layout.addLayout(layout1)
+        if self.argtype not in self.stdTypes:
+            layout2 = QtGui.QHBoxLayout()
+            layout2.setContentsMargins(2,2,2,2)
+            layout.addLayout(layout2)
+        else:
+            layout2 = layout1
+        # type of argument
+        if self.argtype not in self.stdTypes:
+            self.typeList = QtGui.QComboBox()
+            self.typeDict = {}
+            for i, n in enumerate(self.TYPES):
+                self.typeList.addItem(self.TYPENAMES[n], n)
+                self.typeDict[n] = i
+            self.typeList.setCurrentIndex(self.typeDict.get(self.argtype, 0))
+            #label = QtGui.QLabel('Type:')
+            tt = "Select if argument will be an input port, output port, both, or a hidden constant. InputOutput's are always files."
+            #label.setToolTip(tt)
+            self.typeList.setToolTip(tt)
+            #layout1.addWidget(label)
+            layout1.addWidget(self.typeList)
+        else:
+            self.typeList = None
+        # type of port
+        self.klassList = QtGui.QComboBox()
+        klasses = self.KLASSES[self.argtype]
+        self.klassDict = {}
+        for i, n in enumerate(klasses):
+            self.klassList.addItem(self.KLASSNAMES[n], n)
+            self.klassDict[n] = i
+        self.klassList.setCurrentIndex(self.klassDict.get(self.klass, 0))
+        #label = QtGui.QLabel('Class:')
+        tt = 'Port Type. Can be String, Integer, Float, File or Boolean Flag. List means an input list of one of the other types. Only File and String should be used for output ports.'
+        self.klassList.setToolTip(tt)
+        #label.setToolTip(tt)
+        #layout1.addWidget(label)
+        layout1.addWidget(self.klassList)
+        # name of port
+        self.nameLine = QtGui.QLineEdit(self.name)
+        label = QtGui.QLabel('Name:')
+        tt = 'Name of the port, or the value for constants'
+        label.setToolTip(tt)
+        self.nameLine.setToolTip(tt)
+        layout1.addWidget(label)
+        layout1.addWidget(self.nameLine)
+        # options are different for each widget
+        if self.argtype not in self.stdTypes:
+            # all args can have flag
+            self.flag = QtGui.QLineEdit(self.options.get('flag', ''))
+            label = QtGui.QLabel('Flag:')
+            tt = 'a short-style flag before your input. Example: "-f" -> "-f yourinput"'
+            label.setToolTip(tt)
+            self.flag.setToolTip(tt)
+            self.flag.setFixedWidth(100)
+            layout1.addWidget(label)
+            layout1.addWidget(self.flag)
+        
+            # all args can have prefix
+            self.prefix = QtGui.QLineEdit(self.options.get('prefix', ''))
+            label = QtGui.QLabel('Prefix:')
+            tt = 'a long-style prefix to your input. Example: "--X=" -> "--X=yourinput"'
+            label.setToolTip(tt)
+            self.prefix.setToolTip(tt)
+            layout1.addWidget(label)
+            layout1.addWidget(self.prefix)
+
+        # all can be required
+        self.required = QtGui.QCheckBox()
+        self.required.setChecked('required' in self.options)
+        label = QtGui.QLabel('Visible:')
+        tt = 'Check to make port always visible in VisTrails'
+        label.setToolTip(tt)
+        self.required.setToolTip(tt)
+        layout2.addWidget(label)
+        layout2.addWidget(self.required)
+        
+        # subtype
+        self.subList = ['String', 'Integer', 'Float', 'File']
+        self.subDict = dict(zip(self.subList, xrange(len(self.subList))))
+        self.subDict.update(dict(zip([s.lower() for s in self.subList], xrange(len(self.subList)))))
+        self.subtype = QtGui.QComboBox()
+        self.subtype.addItems(self.subList)
+        self.subtype.setCurrentIndex(self.subDict.get(self.options.get('type', 'String'), 0))
+        self.listLabel = QtGui.QLabel('List type:')
+        self.subtype.setVisible(False)
+        tt = 'Choose type of values in List'
+        self.subtype.setToolTip(tt)
+        self.listLabel.setToolTip(tt)
+        layout2.addWidget(self.listLabel)
+        layout2.addWidget(self.subtype)
+        self.listLabel.setVisible(False)
+        self.subtype.setVisible(False)
+        
+        # input files and inputoutput's can set file suffix
+        self.suffix = QtGui.QLineEdit(self.options.get('suffix', ''))
+        self.suffixLabel = QtGui.QLabel('File suffix:')
+        tt = 'Sets the specified file ending on the created file, like for example: ".txt"'
+        self.suffixLabel.setToolTip(tt)
+        self.suffix.setToolTip(tt)
+        self.suffix.setFixedWidth(50)
+        layout2.addWidget(self.suffixLabel)
+        layout2.addWidget(self.suffix)
+
+        self.typeChanged()
+        self.klassChanged()
+
+        # description
+        self.desc = QtGui.QLineEdit(self.options.get('desc', ''))
+        label = QtGui.QLabel('Description:')
+        tt = 'Add a helpful description of the port'
+        label.setToolTip(tt)
+        self.desc.setToolTip(tt)
+        layout2.addWidget(label)
+        layout2.addWidget(self.desc)
+        
+        if self.argtype not in self.stdTypes:
+            self.connect(self.klassList, QtCore.SIGNAL('currentIndexChanged(int)'),
+                     self.klassChanged)
+            self.connect(self.typeList, QtCore.SIGNAL('currentIndexChanged(int)'),
+                     self.typeChanged)
+
+    def getValues(self):
+        """ get the values from the widgets and store them """
+        self.klass = self.klassList.itemData(self.klassList.currentIndex())
+        self.name = self.nameLine.text()
+        self.options = {}
+        if self.argtype not in self.stdTypes:
+            flag = self.flag.text()
+            if flag:
+                self.options['flag'] = flag
+            prefix = self.prefix.text()
+            if prefix:
+                self.options['prefix'] = prefix
+        desc = self.desc.text()
+        if desc:
+            self.options['desc'] = desc
+        if self.required.isChecked():
+            self.options['required'] = ''
+        if self.klass == 'list':
+            subtype = self.subtype.currentText()
+            if subtype:
+                self.options['type'] = subtype
+        type = self.argtype.lower()
+        suffix = self.suffix.text()
+        if (type == 'output' or type == 'inputoutput') and suffix:
+            self.options['suffix'] = suffix
+
+    def setValues(self):
+        if self.argtype not in self.stdTypes:
+            self.typeList.setCurrentIndex(self.typeDict.get(self.argtype, 0))
+        self.nameLine.setText(self.name)
+        self.klassList.setCurrentIndex(self.klassDict[self.klass])
+        if self.argtype not in self.stdTypes:
+            self.flag.setText(self.options.get('flag', ''))
+            self.prefix.setText(self.options.get('prefix', ''))
+            self.subtype.setCurrentIndex(self.subDict.get(self.options.get('type', 'String')))
+            self.subtype.setCurrentIndex(self.subDict.get(self.options.get('type', 'String'), 0))
+        self.required.setChecked('required' in self.options)
+        self.desc.setText(self.options.get('desc', ''))
+        type = self.argtype.lower()
+        if type == 'output' or type == 'inputoutput':
+            self.suffix.setText(self.options.get('suffix', ''))
+        self.typeChanged()
+        self.klassChanged()
+            
+    def toList(self):
+        self.getValues()
+        if self.argtype not in self.stdTypes:
+            return [self.argtype, self.name, self.klass, self.options]
+        else:
+            return [self.name, self.klass, self.options]
+            
+    def fromList(self, arg):
+        if self.argtype not in self.stdTypes:
+            self.argtype, self.name, self.klass, self.options = arg
+        else:
+            self.name, self.klass, self.options = arg
+        self.setValues()
+
+    def klassChanged(self, index=None):
+        if self.argtype in self.stdTypes:
+            return
+        klass = self.klassList.itemData(self.klassList.currentIndex())
+        self.listLabel.setVisible(klass == "list" and type == 'input')
+        self.subtype.setVisible(klass == "list" and type == 'input')
+
+    def typeChanged(self, index=None):
+        if self.argtype in self.stdTypes:
+            return
+        type = self.typeList.itemData(self.typeList.currentIndex())
+        if index is not None and type == self.argtype:
+            return
+        self.argtype = type
+        if type in ('constant', 'inputoutput'):
+            self.klassList.hide()
+        else:
+            self.klassList.show()
+            self.klassList.clear()
+            klasses = self.KLASSES[self.argtype]
+            self.klassDict = {}
+            for i, n in enumerate(klasses):
+                self.klassList.addItem(self.KLASSNAMES[n], n)
+                self.klassDict[n] = i
+            self.klassList.setCurrentIndex(self.klassDict.get(self.klass, 0))
+        self.suffixLabel.setVisible(type == 'output' or type == 'inputoutput')
+        self.suffix.setVisible(type == 'output' or type == 'inputoutput')
+
+    def guess(self, name, count=0):
+        """ add argument by guessing what the arg might be """
+        if '.' in name or '/' in name or '\\' in name: # guess file
+            self.fromList(['Input', 'file%s' % count, 'File',
+                           {'desc':'"%s" guessed to be an Input file' % name}])
+        elif name.startswith('-'): # guess flag
+            self.fromList(['Input', 'flag%s' % name, 'Flag',
+                           {'desc':'"%s" guessed to be a flag' % name,
+                            'flag':name}])
+        else: # guess string
+            self.fromList(['Input', 'input%s' % count, 'String',
+                           {'desc':'"%s" guessed to be an input string' % name}])
+            
+
+class QManpageDialog(QtGui.QDialog):
+    def __init__(self, title, text, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        self.setWindowTitle(title)
+        text = "<pre>%s</pre>" % text
+        self.textEdit = QtGui.QTextEdit(text)
+        self.textEdit.setReadOnly(True)
+        self.setLayout(QtGui.QHBoxLayout())
+        self.layout().addWidget(self.textEdit)
+        self.resize(800,600)
+
+class QManpageImport(QtGui.QDialog):
+    def __init__(self, title, args, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        self.setWindowTitle(title)
+        self.argLayout = QtGui.QVBoxLayout()
+        for arg in args:
+            if arg[0] == 'Flag':
+                w = QArgWidget(name=arg[1], options={'flag':arg[1],
+                                                     'desc':arg[2]})
+            else:
+            #if arg[0] == 'String':
+                w = QArgWidget(klass='String', name=arg[1],
+                               options={'prefix':arg[1] + '=',
+                                        'desc':arg[2]})
+            widgetLayout = QtGui.QHBoxLayout()
+            widgetLayout.addWidget(QtGui.QCheckBox())
+            widgetLayout.addWidget(w)
+            self.argLayout.addLayout(widgetLayout)
+        scroll = QtGui.QScrollArea()
+        w = QtGui.QWidget()
+        w.setLayout(self.argLayout)
+        scroll.setWidget(w)
+        scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
+        scroll.setWidgetResizable(True)
+        self.setLayout(QtGui.QVBoxLayout())
+        self.layout().addWidget(scroll)
+        layout2 = QtGui.QHBoxLayout()
+        self.layout().addLayout(layout2)
+        self.closeButton = QtGui.QPushButton('Close')
+        self.closeButton.setToolTip('Close this window')
+        self.connect(self.closeButton, QtCore.SIGNAL('clicked()'),
+                     self.close)
+        layout2.addWidget(self.closeButton)
+        self.selectAllButton = QtGui.QPushButton('Select All')
+        self.selectAllButton.setToolTip('Select All arguments')
+        self.connect(self.selectAllButton, QtCore.SIGNAL('clicked()'),
+                     self.selectAll)
+        layout2.addWidget(self.selectAllButton)
+        self.selectNoneButton = QtGui.QPushButton('Select None')
+        self.selectNoneButton.setToolTip('Unselect All arguments')
+        self.connect(self.selectNoneButton, QtCore.SIGNAL('clicked()'),
+                     self.selectNone)
+        layout2.addWidget(self.selectNoneButton)
+        self.addSelectedButton = QtGui.QPushButton('Import Selected')
+        self.addSelectedButton.setToolTip('Import all selected arguments')
+        self.connect(self.addSelectedButton, QtCore.SIGNAL('clicked()'),
+                     self.addSelected)
+        layout2.addWidget(self.addSelectedButton)
+        self.resize(800,600)
+
+    def selectAll(self):
+        for i in xrange(self.argLayout.count()):
+            w = self.argLayout.layout().itemAt(i)
+            w.layout().itemAt(0).widget().setChecked(True)
+
+    def selectNone(self):
+        for i in xrange(self.argLayout.count()):
+            w = self.argLayout.layout().itemAt(i)
+            w.layout().itemAt(0).widget().setChecked(False)
+
+    def addSelected(self):
+        # collect selected arguments and send through signal
+        args = []
+        remove_list = []
+        for i in xrange(self.argLayout.count()):
+            w = self.argLayout.layout().itemAt(i)
+            if w.layout().itemAt(0).widget().isChecked():
+                remove_list.append(w)
+                args.append(w.layout().itemAt(1).widget())
+        for w in remove_list:
+            w.layout().itemAt(0).widget().setChecked(False)
+            w.layout().itemAt(0).widget().hide()
+            w.layout().itemAt(1).widget().hide()
+            self.argLayout.removeItem(w)
+
+        self.emit(QtCore.SIGNAL('importArgs(PyQt_PyObject)'), args)
+
+class QCLToolsWizardWindow(QtGui.QMainWindow):
+
+    def __init__(self, parent=None, reload_scripts=None):
+        QtGui.QMainWindow.__init__(self, parent)
+        self.wizard = QCLToolsWizard(self, reload_scripts)
+        self.setCentralWidget(self.wizard)
+        self.setWindowTitle("CLTools Wizard")
+        self.resize(1000,600)
+        
+if __name__ == "__main__":
+    app = QtGui.QApplication(sys.argv)
+    window = QCLToolsWizardWindow()
+    if len(sys.argv)>2 and sys.argv[1] == '-c':
+        # read command from command line
+        window.wizard.loadFromCommand(sys.argv[2:])
+    window.show()
+    app.exec_()
diff --git a/vistrails/packages/HTTP/__init__.py b/vistrails/packages/HTTP/__init__.py
new file mode 100644
index 0000000..c4046f3
--- /dev/null
+++ b/vistrails/packages/HTTP/__init__.py
@@ -0,0 +1,46 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""HTTP provides packages for HTTP-based file fetching. This provides
+a location-independent way of referring to files. This package uses a
+local cache of the files, inside the per-user VisTrails
+directory. This way, files that haven't been changed do not need
+downloading. The check is performed efficiently using the HTTP GET
+headers.
+"""
+
+identifier = 'org.vistrails.vistrails.http'
+name = 'HTTP'
+version = '0.9.1'
+old_identifiers = ['edu.utah.sci.vistrails.http']
diff --git a/vistrails/packages/HTTP/http_directory.py b/vistrails/packages/HTTP/http_directory.py
new file mode 100644
index 0000000..d24d492
--- /dev/null
+++ b/vistrails/packages/HTTP/http_directory.py
@@ -0,0 +1,175 @@
+# https://gist.github.com/remram44/6540454
+
+from HTMLParser import HTMLParser
+import urllib2
+import os
+import re
+
+
+re_url = re.compile(r'^(([a-zA-Z_-]+)://([^/]+))(/.*)?$')
+
+def resolve_link(link, url):
+    m = re_url.match(link)
+    if m is not None:
+        if not m.group(4):
+            # http://domain -> http://domain/
+            return link + '/'
+        else:
+            return link
+    elif link[0] == '/':
+        # /some/path
+        murl = re_url.match(url)
+        return murl.group(1) + link
+    else:
+        # relative/path
+        if url[-1] == '/':
+            return url + link
+        else:
+            return url + '/' + link
+
+
+class ListingParser(HTMLParser):
+    """Parses an HTML file and build a list of links.
+
+    Links are stored into the 'links' set. They are resolved into absolute
+    links.
+    """
+    def __init__(self, url):
+        HTMLParser.__init__(self)
+
+        if url[-1] != '/':
+            url += '/'
+        self.__url = url
+        self.links = set()
+
+    def handle_starttag(self, tag, attrs):
+        if tag == 'a':
+            for key, value in attrs:
+                if key == 'href':
+                    if not value:
+                        continue
+                    value = resolve_link(value, self.__url)
+                    self.links.add(value)
+                    break
+
+
+def download_directory(url, target):
+    def mkdir():
+        if not mkdir.done:
+            try:
+                os.mkdir(target)
+            except OSError:
+                pass
+            mkdir.done = True
+    mkdir.done = False
+
+    response = urllib2.urlopen(url)
+
+    if response.info().type == 'text/html':
+        contents = response.read()
+
+        parser = ListingParser(url)
+        parser.feed(contents)
+        for link in parser.links:
+            link = resolve_link(link, url)
+            if link[-1] == '/':
+                link = link[:-1]
+            if not link.startswith(url):
+                continue
+            name = link.rsplit('/', 1)[1]
+            if '?' in name:
+                continue
+            mkdir()
+            download_directory(link, os.path.join(target, name))
+        if not mkdir.done:
+            # We didn't find anything to write inside this directory
+            # Maybe it's a HTML file?
+            if url[-1] != '/':
+                end = target[-5:].lower()
+                if not (end.endswith('.htm') or end.endswith('.html')):
+                    target = target + '.html'
+                with open(target, 'wb') as fp:
+                    fp.write(contents)
+    else:
+        buffer_size = 4096
+        with open(target, 'wb') as fp:
+            chunk = response.read(buffer_size)
+            while chunk:
+                fp.write(chunk)
+                chunk = response.read(buffer_size)
+
+
+###############################################################################
+
+import unittest
+
+
+class TestLinkResolution(unittest.TestCase):
+    def test_absolute_link(self):
+        self.assertEqual(
+                resolve_link('http://website.org/p/test.txt',
+                             'http://some/other/url'),
+                'http://website.org/p/test.txt')
+        self.assertEqual(
+                resolve_link('http://website.org',
+                             'http://some/other/url'),
+                'http://website.org/')
+
+    def test_absolute_path(self):
+        self.assertEqual(
+                resolve_link('/p/test.txt', 'http://some/url'),
+                'http://some/p/test.txt')
+        self.assertEqual(
+                resolve_link('/p/test.txt', 'http://some/url/'),
+                'http://some/p/test.txt')
+        self.assertEqual(
+                resolve_link('/p/test.txt', 'http://site'),
+                'http://site/p/test.txt')
+        self.assertEqual(
+                resolve_link('/p/test.txt', 'http://site/'),
+                'http://site/p/test.txt')
+
+    def test_relative_path(self):
+        self.assertEqual(
+                resolve_link('some/file', 'http://site/folder'),
+                'http://site/folder/some/file')
+        self.assertEqual(
+                resolve_link('some/file', 'http://site/folder/'),
+                'http://site/folder/some/file')
+        self.assertEqual(
+                resolve_link('some/dir/', 'http://site/folder'),
+                'http://site/folder/some/dir/')
+
+
+class TestParser(unittest.TestCase):
+    def test_parse(self):
+        parser = ListingParser('http://a.remram.fr/test')
+        parser.feed("""
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html><head><title>
+Index of /test</title></head><body><h1>Index of /test</h1><table><tr><th>
+<img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a>
+</th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size
+</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5">
+<hr></th></tr><tr><td valign="top"><img src="/icons/back.gif" alt="[DIR]"></td>
+<td><a href="/">Parent Directory</a></td><td> </td><td align="right">  - 
+</td><td> </td></tr><tr><td valign="top">
+<img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="a">a</a></td>
+<td align="right">11-Sep-2013 15:46  </td><td align="right">  3 </td><td> 
+</td></tr><tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td>
+<td><a href="/bb">bb</a></td><td align="right">11-Sep-2013 15:46  </td>
+<td align="right">  3 </td><td> </td></tr><tr><td valign="top">
+<img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="/cc/">cc/</a></td>
+<td align="right">11-Sep-2013 15:46  </td><td align="right">  - </td><td> 
+</td></tr><tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td>
+<td><a href="http://a.remram.fr/dd">dd/</a></td><td align="right">
+11-Sep-2013 15:46  </td><td align="right">  - </td><td> </td></tr><tr>
+<th colspan="5"><hr></th></tr></table></body></html>
+        """)
+        links = set(l for l in parser.links if '?' not in l)
+        self.assertEqual(links, set([
+                'http://a.remram.fr/',
+                'http://a.remram.fr/test/a',
+                'http://a.remram.fr/bb',
+                'http://a.remram.fr/cc/',
+                'http://a.remram.fr/dd',
+        ]))
diff --git a/vistrails/packages/HTTP/init.py b/vistrails/packages/HTTP/init.py
new file mode 100644
index 0000000..bd89b7a
--- /dev/null
+++ b/vistrails/packages/HTTP/init.py
@@ -0,0 +1,539 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""HTTP provides packages for HTTP-based file fetching. This provides
+a location-independent way of referring to files. This package uses a
+local cache of the files, inside the per-user VisTrails
+directory. This way, files that haven't been changed do not need
+downloading. The check is performed efficiently using the HTTP GET
+headers.
+"""
+from vistrails.core.modules.vistrails_module import ModuleError
+from vistrails.core.configuration import get_vistrails_persistent_configuration
+from vistrails.gui.utils import show_warning
+from vistrails.core.modules.vistrails_module import Module
+import vistrails.core.modules.basic_modules
+import vistrails.core.modules.module_registry
+from vistrails.core import debug
+from vistrails.core.system import current_dot_vistrails
+import vistrails.gui.repository
+
+import datetime
+import email.utils
+import hashlib
+import os.path
+import sys
+import unittest
+import urllib
+import urllib2
+
+from vistrails.core.repository.poster.encode import multipart_encode
+from vistrails.core.repository.poster.streaminghttp import register_openers
+
+from vistrails.core.utils import DummyView
+
+from http_directory import download_directory
+
+# special file uploaders used to push files to repository
+
+package_directory = None
+
+###############################################################################
+
+class HTTPFile(Module):
+    """ Downloads file from URL """
+
+    def compute(self):
+        self.checkInputPort('url')
+        url = self.getInputFromPort("url")
+        (result, downloaded_file, local_filename) = self.download(url)
+        self.setResult("local_filename", local_filename)
+        if result == 2:
+            raise ModuleError(self, downloaded_file)
+        else:
+            self.setResult("file", downloaded_file)
+
+    def download(self, url):
+        """download(url:string) -> (result: int, downloaded_file: File,
+                                    local_filename:string)
+        Tries to download a file from url. It returns a tuple with:
+        result: 0 -> success
+                1 -> couldn't download the file, but found a cached version
+                2 -> failed (in this case downloaded_file will contain the 
+                             error message)
+        downloaded_file: The downloaded file or the error message in case it
+                         failed
+                         
+        local_filename: the path to the local_filename
+        
+        """
+        
+        self._parse_url(url)
+
+        opener = urllib2.build_opener()
+
+        local_filename = self._local_filename(url)
+
+        # Get ETag from disk
+        try:
+            with open(local_filename + '.etag') as etag_file:
+                etag = etag_file.read()
+        except IOError:
+            etag = None
+
+        try:
+            request = urllib2.Request(url)
+            if etag is not None:
+                request.add_header(
+                    'If-None-Match',
+                    etag)
+            try:
+                mtime = email.utils.formatdate(os.path.getmtime(local_filename),
+                                               usegmt=True)
+                request.add_header(
+                    'If-Modified-Since',
+                    mtime)
+            except OSError:
+                pass
+            f1 = opener.open(request)
+        except urllib2.URLError, e:
+            if isinstance(e, urllib2.HTTPError) and e.code == 304:
+                # Not modified
+                result = vistrails.core.modules.basic_modules.File()
+                result.name = local_filename
+                return (0, result, local_filename)
+            if self._file_is_in_local_cache(local_filename):
+                debug.warning('A network error occurred. HTTPFile will use a '
+                              'cached version of the file')
+                result = vistrails.core.modules.basic_modules.File()
+                result.name = local_filename
+                return (1, result, local_filename)
+            else:
+                return (2, (str(e)), local_filename)
+        else:
+            try:
+                mod_header = f1.headers['last-modified']
+            except KeyError:
+                mod_header = None
+            try:
+                size_header = f1.headers['content-length']
+                if not size_header:
+                    raise ValueError
+                size_header = int(size_header)
+            except ValueError:
+                size_header = None
+
+            result = vistrails.core.modules.basic_modules.File()
+            result.name = local_filename
+
+            if (not self._file_is_in_local_cache(local_filename) or
+                    not mod_header or
+                    self._is_outdated(mod_header, local_filename)):
+                try:
+                    dl_size = 0
+                    CHUNKSIZE = 4096
+                    f2 = open(local_filename, 'wb')
+                    while True:
+                        if size_header is not None:
+                            self.logging.update_progress(
+                                    self,
+                                    dl_size*1.0/size_header)
+                        chunk = f1.read(CHUNKSIZE)
+                        if not chunk:
+                            break
+                        dl_size += len(chunk)
+                        f2.write(chunk)
+                    f2.close()
+                    f1.close()
+
+                except Exception, e:
+                    try:
+                        os.unlink(local_filename)
+                    except OSError:
+                        pass
+                    return (2, ("Error retrieving URL: %s" % e), local_filename)
+            result.name = local_filename
+
+            # Save ETag
+            try:
+                etag = f1.headers['ETag']
+            except KeyError:
+                pass
+            else:
+                with open(local_filename + '.etag', 'w') as etag_file:
+                    etag = etag_file.write(etag)
+
+            return (0, result, local_filename)
+        
+    ##########################################################################
+
+    def _parse_url(self, url):
+        s = url.split('/')
+        try:
+            self.host = s[2]
+            self.filename = '/' + '/'.join(s[3:])
+        except:
+            raise ModuleError(self, "Malformed URL: %s" % url)
+
+    def _is_outdated(self, remoteHeader, localFile):
+        """Checks whether local file is outdated."""
+        local_time = \
+                datetime.datetime.utcfromtimestamp(os.path.getmtime(localFile))
+        try:
+            remote_time = datetime.datetime.strptime(remoteHeader,
+                                                     "%a, %d %b %Y %H:%M:%S %Z")
+        except ValueError:
+            try:
+                remote_time = datetime.datetime.strptime(remoteHeader,
+                                                         "%a, %d %B %Y %H:%M:%S %Z")
+            except ValueError:
+                # unable to parse last-modified header, download file again
+                debug.warning("Unable to parse Last-Modified header"
+                              ", downloading file")
+                return True
+        return remote_time > local_time
+
+    def _file_is_in_local_cache(self, local_filename):
+        return os.path.isfile(local_filename)
+
+    def _local_filename(self, url):
+        return package_directory + '/' + urllib.quote_plus(url)
+
+
+class HTTPDirectory(Module):
+    """Downloads a whole directory recursively from a URL
+    """
+
+    def compute(self):
+        self.checkInputPort('url')
+        url = self.getInputFromPort('url')
+        local_path = self.download(url)
+        self.setResult('local_path', local_path)
+        local_dir = vistrails.core.modules.basic_modules.Directory()
+        local_dir.name = local_path
+        self.setResult('directory', local_dir)
+
+    def download(self, url):
+        local_path = self.interpreter.filePool.create_directory(
+                prefix='vt_http').name
+        download_directory(url, local_path)
+        return local_path
+
+
+class RepoSync(Module):
+    """ VisTrails Server version of RepoSync modules. Customized to play 
+    nicely with crowdlabs. Needs refactoring.
+
+    RepoSync enables data to be synced with a online repository. The designated file
+    parameter will be uploaded to the repository on execution,
+    creating a new pipeline version that links to online repository data.
+    If the local file isn't available, then the online repository data is used.
+    """
+
+    def __init__(self):
+        Module.__init__(self)
+
+        config = get_vistrails_persistent_configuration()
+        if config.check('webRepositoryURL'):
+            self.base_url = config.webRepositoryURL
+        else:
+            raise ModuleError(self,
+                              ("No webRepositoryURL value defined"
+                               " in the Expert Configuration"))
+
+        # check if we are running in server mode
+        # this effects how the compute method functions
+        if config.check('isInServerMode'):
+            self.is_server = bool(config.isInServerMode)
+        else:
+            self.is_server = False
+
+        # TODO: this '/' check should probably be done in core/configuration.py
+        if self.base_url[-1] == '/':
+            self.base_url = self.base_url[:-1]
+
+    # used for invaliding cache when user isn't logged in to crowdLabs
+    # but wants to upload data
+    def invalidate_cache(self):
+        return False
+
+    def validate_cache(self):
+        return True
+
+    def _file_is_in_local_cache(self, local_filename):
+        return os.path.isfile(local_filename)
+
+    def checksum_lookup(self):
+        """ checks if the repository has the wanted data """
+
+        checksum_url = "%s/datasets/exists/%s/" % (self.base_url, self.checksum)
+        self.on_server = False
+        try:
+            check_dataset_on_repo = urllib2.urlopen(url=checksum_url)
+            self.up_to_date = True if \
+                    check_dataset_on_repo.read() == 'uptodate' else False
+            self.on_server = True
+        except urllib2.HTTPError:
+            self.up_to_date = True
+
+    def data_sync(self):
+        """ downloads/uploads/uses the local file depending on availability """
+        self.checksum_lookup()
+
+        # local file not on repository, so upload
+        if not self.on_server and os.path.isfile(self.in_file.name):
+            cookiejar = vistrails.gui.repository.QRepositoryDialog.cookiejar
+            if cookiejar:
+                register_openers(cookiejar=cookiejar)
+
+                params = {'dataset_file': open(self.in_file.name, 'rb'),
+                          'name': self.in_file.name.split('/')[-1],
+                          'origin': 'vistrails',
+                          'checksum': self.checksum}
+
+                upload_url = "%s/datasets/upload/" % self.base_url
+
+                datagen, headers = multipart_encode(params)
+                request = urllib2.Request(upload_url, datagen, headers)
+                try:
+                    result = urllib2.urlopen(request)
+                    if result.code != 200:
+                        show_warning("Upload Failure",
+                                     "Data failed to upload to repository")
+                        # make temporarily uncachable
+                        self.is_cacheable = self.invalidate_cache
+                    else:
+                        debug.warning("Push to repository was successful")
+                        # make sure module caches
+                        self.is_cacheable = self.validate_cache
+                except Exception, e:
+                    show_warning("Upload Failure",
+                                 "Data failed to upload to repository")
+                    # make temporarily uncachable
+                    self.is_cacheable = self.invalidate_cache
+                debug.warning('RepoSync uploaded %s to the repository' % \
+                              self.in_file.name)
+            else:
+                show_warning("Please login", ("You must be logged into the web"
+                                              " repository in order to upload "
+                                              "data. No data was synced"))
+                # make temporarily uncachable
+                self.is_cacheable = self.invalidate_cache
+
+            # use local data
+            self.setResult("file", self.in_file)
+        else:
+            # file on repository mirrors local file, so use local file
+            if self.up_to_date and os.path.isfile(self.in_file.name):
+                self.setResult("file", self.in_file)
+            else:
+                # local file not present or out of date, download or used cached
+                self.url = "%s/datasets/download/%s" % (self.base_url,
+                                                       self.checksum)
+                local_filename = package_directory + '/' + \
+                        urllib.quote_plus(self.url)
+                if not self._file_is_in_local_cache(local_filename):
+                    # file not in cache, download.
+                    try:
+                        urllib.urlretrieve(self.url, local_filename)
+                    except IOError, e:
+                        raise ModuleError(self, ("Invalid URL: %s" % e))
+                out_file = vistrails.core.modules.basic_modules.File()
+                out_file.name = local_filename
+                debug.warning('RepoSync is using repository data')
+                self.setResult("file", out_file)
+
+
+    def compute(self):
+        # if server, grab local file using checksum id
+        if self.is_server:
+            self.checkInputPort('checksum')
+            self.checksum = self.getInputFromPort("checksum")
+            # get file path
+            path_url = "%s/datasets/path/%s/"%(self.base_url, self.checksum)
+            try:
+                dataset_path_request = urllib2.urlopen(url=path_url)
+                dataset_path = dataset_path_request.read()
+            except urllib2.HTTPError:
+                pass
+
+            if os.path.isfile(dataset_path):
+                out_file = vistrails.core.modules.basic_modules.File()
+                out_file.name = dataset_path
+                self.setResult("file", out_file)
+        else: # is client
+            self.checkInputPort('file')
+            self.in_file = self.getInputFromPort("file")
+            if os.path.isfile(self.in_file.name):
+                # do size check
+                size = os.path.getsize(self.in_file.name)
+                if size > 26214400:
+                    show_warning("File is too large", ("file is larger than 25MB, "
+                                 "unable to sync with web repository"))
+                    self.setResult("file", self.in_file)
+                else:
+                    # compute checksum
+                    f = open(self.in_file.name, 'r')
+                    self.checksum = hashlib.sha1()
+                    block = 1
+                    while block:
+                        block = f.read(128)
+                        self.checksum.update(block)
+                    f.close()
+                    self.checksum = self.checksum.hexdigest()
+
+                    # upload/download file
+                    self.data_sync()
+
+                    # set checksum param in module
+                    if not self.hasInputFromPort('checksum'):
+                        self.change_parameter('checksum', [self.checksum])
+
+            else:
+                # local file not present
+                if self.hasInputFromPort('checksum'):
+                    self.checksum = self.getInputFromPort("checksum")
+
+                    # download file
+                    self.data_sync()
+
+def initialize(*args, **keywords):
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    basic = vistrails.core.modules.basic_modules
+
+    reg.add_module(HTTPFile)
+    reg.add_input_port(HTTPFile, "url", (basic.String, 'URL'))
+    reg.add_output_port(HTTPFile, "file", (basic.File, 'local File object'))
+    reg.add_output_port(HTTPFile, "local_filename",
+                        (basic.String, 'local filename'), optional=True)
+
+    reg.add_module(HTTPDirectory)
+    reg.add_input_port(HTTPDirectory, 'url', (basic.String, "URL"))
+    reg.add_output_port(HTTPDirectory, 'directory',
+                        (basic.Directory, "local Directory object"))
+    reg.add_output_port(HTTPDirectory, 'local_path',
+                        (basic.String, "local path"), optional=True)
+
+    reg.add_module(RepoSync)
+    reg.add_input_port(RepoSync, "file", (basic.File, 'File'))
+    reg.add_input_port(RepoSync, "checksum",
+                       (basic.String, 'Checksum'), optional=True)
+    reg.add_output_port(RepoSync, "file", (basic.File,
+                                           'Repository Synced File object'))
+    reg.add_output_port(RepoSync, "checksum",
+                        (basic.String, 'Checksum'), optional=True)
+
+    global package_directory
+    dotVistrails = current_dot_vistrails()
+    package_directory = os.path.join(dotVistrails, "HTTP")
+
+    if not os.path.isdir(package_directory):
+        try:
+            debug.log("Creating HTTP package directory: %s" % package_directory)
+            os.mkdir(package_directory)
+        except:
+            debug.critical(("Create directory failed. Make sure '%s' does not"
+                           " exist and parent directory is writable") %
+                            package_directory)
+            sys.exit(1)
+
+##############################################################################
+
+
+class TestHTTPFile(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        from vistrails.core.packagemanager import get_package_manager
+        from vistrails.core.modules.module_registry import MissingPackage
+        pm = get_package_manager()
+        try:
+            pm.get_package('org.vistrails.vistrails.http')
+        except MissingPackage:
+            pm.late_enable_package('HTTP')
+
+    def testParseURL(self):
+        foo = HTTPFile()
+        foo._parse_url('http://www.sci.utah.edu/~cscheid/stuff/vtkdata-5.0.2.zip')
+        self.assertEquals(foo.host, 'www.sci.utah.edu')
+        self.assertEquals(foo.filename, '/~cscheid/stuff/vtkdata-5.0.2.zip')
+
+    def testIncorrectURL(self):
+        from vistrails.tests.utils import execute
+        self.assertTrue(execute([
+                ('HTTPFile', identifier, [
+                    ('url', [('String', 'http://idbetthisdoesnotexistohrly')]),
+                ]),
+            ]))
+
+    def testIncorrectURL_2(self):
+        from vistrails.tests.utils import execute
+        self.assertTrue(execute([
+                ('HTTPFile', identifier, [
+                    ('url', [('String', 'http://neitherodesthisohrly')]),
+                ]),
+            ]))
+
+class TestHTTPDirectory(unittest.TestCase):
+    def test_download(self):
+        url = 'http://www.vistrails.org/testing/httpdirectory/test/'
+
+        import shutil
+        import tempfile
+        testdir = tempfile.mkdtemp(prefix='vt_test_http_')
+        try:
+            download_directory(url, testdir)
+            files = {}
+            def addfiles(dirpath):
+                td = os.path.join(testdir, dirpath)
+                for name in os.listdir(td):
+                    filename = os.path.join(testdir, dirpath, name)
+                    dn = os.path.join(dirpath, name)
+                    if os.path.isdir(filename):
+                        addfiles(os.path.join(dirpath, name))
+                    else:
+                        with open(filename, 'rb') as f:
+                            files[dn.replace(os.sep, '/')] = f.read()
+            addfiles('')
+            self.assertEqual(len(files), 4)
+            del files['f.html']
+            self.assertEqual(files, {
+                    'a': 'aa\n',
+                    'bb': 'bb\n',
+                    'cc/d': 'dd\n',
+                })
+        finally:
+            shutil.rmtree(testdir)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/vistrails/packages/ImageMagick/__init__.py b/vistrails/packages/ImageMagick/__init__.py
new file mode 100644
index 0000000..651420e
--- /dev/null
+++ b/vistrails/packages/ImageMagick/__init__.py
@@ -0,0 +1,48 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""ImageMagick package for VisTrails.
+
+This package defines a set of modules that perform some of the
+operations exposed by the ImageMagick package.
+
+"""
+from vistrails.core.configuration import ConfigurationObject
+
+identifier = 'org.vistrails.vistrails.imagemagick'
+name = 'ImageMagick'
+version = '0.9.5'
+old_identifiers = ['edu.utah.sci.vistrails.imagemagick']
+configuration = ConfigurationObject(quiet=False,
+                                    path=(None, str))
diff --git a/vistrails/packages/ImageMagick/init.py b/vistrails/packages/ImageMagick/init.py
new file mode 100644
index 0000000..c3393bd
--- /dev/null
+++ b/vistrails/packages/ImageMagick/init.py
@@ -0,0 +1,280 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+##############################################################################
+# Changes
+#
+# 20130827 (by Remi)
+#    CombineRGBA can now also accept RGB
+#    Factored code common between Convert and CombineRGBA
+#    Removes 'geometry' and related ports from most modules, as they were
+#    *already ignored* except by the Scale module
+#
+# 20090521 (by Emanuele)
+#    Added path configuration option so imagemagick does not to be in the path
+#    Removed ImageMagick presence check
+#
+# 20081002:
+#    Added CombineRGBA to create image from channels.
+#    Moved quiet to configuration
+#    Fixed bug with GaussianBlur
+
+from vistrails.core import debug
+import vistrails.core.modules.basic_modules as basic
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.vistrails_module import Module, ModuleError, \
+    new_module, IncompleteImplementation
+from vistrails.core.system import list2cmdline
+
+import os
+
+################################################################################
+
+class ImageMagick(Module):
+    """ImageMagick is the base Module for all Modules in the ImageMagick
+package. It simply defines some helper methods for subclasses."""
+
+    def compute(self):
+        raise IncompleteImplementation
+
+    def input_file_description(self):
+        """Returns a fully described name in the ImageMagick format.
+
+        For example, a file stored in PNG format may be described by:
+        - 'graphic.png' indicates the filename 'graphic.png', using the PNG
+        file format.
+        - 'png:graphic' indicates the filename 'graphic', still using the PNG
+        file format."""
+        i = self.getInputFromPort("input")
+        if self.hasInputFromPort('inputFormat'):
+            return self.getInputFromPort('inputFormat') + ':' + i.name
+        else:
+            return i.name
+
+    def create_output_file(self):
+        """Creates a File with the output format given by the
+outputFormat port."""
+        if self.hasInputFromPort('outputFormat'):
+            s = '.' + self.getInputFromPort('outputFormat')
+            return self.interpreter.filePool.create_file(suffix=s)
+        else:
+            return self.interpreter.filePool.create_file(suffix='.png')
+
+    def run(self, *args):
+        """run(*args), runs ImageMagick's 'convert' on a shell, passing all
+arguments to the program."""
+        path = None
+        if configuration.check('path'):
+            path = configuration.path
+        if path:
+            cmd = os.path.join(path,'convert')
+        else:
+            cmd = 'convert'    
+        cmd = [cmd] + list(args)
+        cmdline = list2cmdline(cmd)
+        if not configuration.quiet:
+            debug.log(cmdline)
+        r = os.system(cmdline)
+        if r != 0:
+            raise ModuleError(self, "system call failed: %r" % cmdline)
+
+
+class Convert(ImageMagick):
+    """Convert is the base Module for VisTrails Modules in the ImageMagick
+package that transform a single input into a single output. Each subclass has
+a descriptive name of the operation it implements."""
+
+    def compute(self):
+        o = self.create_output_file()
+        i = self.input_file_description()
+        self.run(i, o.name)
+        self.setResult("output", o)
+
+
+class CombineRGBA(ImageMagick):
+    """Combines channels as separate images into a single RGBA file."""
+
+    def compute(self):
+        o = self.create_output_file()
+        r = self.getInputFromPort("r")
+        g = self.getInputFromPort("g")
+        b = self.getInputFromPort("b")
+        a = self.forceGetInputFromPort("a")
+
+        if a is not None:
+            self.run(r.name, g.name, b.name, a.name,
+                     '-channel', 'RGBA',
+                     '-combine', o.name)
+        else:
+            self.run(r.name, g.name, b.name,
+                     '-channel', 'RGB',
+                     '-combine', o.name)
+
+        self.setResult("output", o)
+
+
+class Scale(Convert):
+    """Scale rescales the input image to the given geometry description."""
+
+    def geometry_description(self):
+        """returns a string with the description of the geometry as
+indicated by the appropriate ports (geometry or width and height)"""
+        # if complete geometry is available, ignore rest
+        if self.hasInputFromPort("geometry"):
+            return self.getInputFromPort("geometry")
+        elif self.hasInputFromPort("width"):
+            w = self.getInputFromPort("width")
+            h = self.getInputFromPort("height")
+            return "'%sx%s'" % (w, h)
+        else:
+            raise ModuleError(self, "Needs geometry or width/height")
+
+    def compute(self):
+        o = self.create_output_file()
+        self.run(self.input_file_description(),
+                 "-scale",
+                 self.geometry_description(),
+                 o.name)
+        self.setResult("output", o)
+
+
+class GaussianBlur(Convert):
+    """GaussianBlur convolves the image with a Gaussian filter of given radius
+and standard deviation."""
+
+    def compute(self):
+        (radius, sigma) = self.getInputFromPort('radiusSigma')
+        o = self.create_output_file()
+        self.run(self.input_file_description(),
+                 "-blur",
+                 "%sx%s" % (radius, sigma),
+                 o.name)
+        self.setResult("output", o)
+
+
+no_param_options = [("Negate", "-negate",
+                     """Negate performs the two's complement negation of the image."""
+                     ),
+                    ("EqualizeHistogram", "-equalize", None),
+                    ("Enhance", "-enhance", None),
+                    ("VerticalFlip", "-flip", None),
+                    ("HorizontalFlip", "-flop", None),
+                    ("FloydSteinbergDither", "-dither", None),
+                    ("IncreaseContrast", "-contrast", None),
+                    ("Despeckle", "-despeckle", None),
+                    ("Normalize", "-normalize", None)]
+
+
+def no_param_options_method_dict(optionName):
+    """Creates a method dictionary for a module that takes no extra
+parameters. This dictionary will be used to dynamically create a
+VisTrails module."""
+   
+    def compute(self):
+        o = self.create_output_file()
+        i = self.input_file_description()
+        self.run(i, optionName, o.name)
+        self.setResult("output", o)
+
+    return {'compute': compute}
+
+
+float_param_options = [("DetectEdges", "-edge", "radius", "filter radius"),
+                       ("Emboss", "-emboss", "radius", "filter radius"),
+                       ("GammaCorrect", "-gamma", "gamma", "gamma correction factor"),
+                       ("MedianFilter", "-median", "radius", "filter radius")]
+
+def float_param_options_method_dict(optionName, portName):
+    """Creates a method dictionary for a module that has one port
+taking a floating-point value. This dictionary will be used to
+dynamically create a VisTrails module."""
+
+    def compute(self):
+        o = self.create_output_file()
+        optionValue = self.getInputFromPort(portName)
+        i = self.input_file_description()
+        self.run(i, optionName, str(optionValue), o.name)
+        self.setResult("output", o)
+
+    return {'compute': compute}
+
+
+
+################################################################################
+
+def initialize():
+    def parse_error_if_not_equal(s, expected):
+        if s != expected:
+            err = "Parse error on version line. Was expecting '%s', got '%s'"
+            raise RuntimeError(err % (s, expected))
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+
+    reg.add_module(ImageMagick, abstract=True)
+
+    reg.add_module(Convert)
+    reg.add_input_port(Convert, "input", (basic.File, 'the input file'))
+    reg.add_input_port(Convert, "inputFormat", (basic.String, 'coerce interpretation of file to this format'))
+    reg.add_output_port(Convert, "output", (basic.File, 'the output file'))
+    reg.add_input_port(Convert, "outputFormat", (basic.String, 'Force output to be of this format'))
+
+    for (name, opt, doc_string) in no_param_options:
+        m = new_module(Convert, name, no_param_options_method_dict(opt),
+                      docstring=doc_string)
+        reg.add_module(m)
+
+    for (name, opt, paramName, paramComment) in float_param_options:
+        m = new_module(Convert, name, float_param_options_method_dict(opt, paramName))
+        reg.add_module(m)
+        reg.add_input_port(m, paramName, (basic.Float, paramComment))
+
+    reg.add_module(GaussianBlur)
+    reg.add_input_port(GaussianBlur, "radiusSigma", [(basic.Float, 'radius'), (basic.Float, 'sigma')])
+
+    reg.add_module(Scale)
+    reg.add_input_port(Scale, "geometry", (basic.String, 'ImageMagick geometry'))
+    reg.add_input_port(Scale, "width", (basic.String, 'width of the geometry for operation'))
+    reg.add_input_port(Scale, "height", (basic.String, 'height of the geometry for operation'))
+
+    reg.add_module(CombineRGBA)
+    reg.add_input_port(CombineRGBA, "r", basic.File)
+    reg.add_input_port(CombineRGBA, "g", basic.File)
+    reg.add_input_port(CombineRGBA, "b", basic.File)
+    reg.add_input_port(CombineRGBA, "a", basic.File, optional=True)
+    reg.add_input_port(CombineRGBA, "outputFormat", basic.String)
+    reg.add_output_port(CombineRGBA, "output", basic.File)
+
+################################################################################
+
diff --git a/vistrails/packages/JobSubmission/__init__.py b/vistrails/packages/JobSubmission/__init__.py
new file mode 100644
index 0000000..1f1fefb
--- /dev/null
+++ b/vistrails/packages/JobSubmission/__init__.py
@@ -0,0 +1,34 @@
+import sys
+import vistrails.core
+##
+# TODO list:
+# (V) 1) Write the JobInfo module
+# (V) 2) Make implement generator functionality
+# (V) 4) write generator and exporter functions 
+# (V) 9) Move generators.py, exporters.py -> containers.py
+# (V) 10) auto_generated_types -> generator_definitions 
+# (V) 11) Local file transfer fails when no visible files are present
+# 12) Qprint -> annotate
+# 13) Disconnect and kill process if queue exist
+# 14) Write the clean up and add it to run job
+# 15) There is an error with terminal selection
+
+
+## TODO:
+# 1) Fix the last things whatever they are
+# 9) Pull the git repository
+# 10) Add the package and update
+
+
+### TESTING
+# 1) Test collective operations
+# 2) check wether it uploads anything
+# 3) Try to see what happens when things are connected different from what you are supposed to do
+# 4) Test queue reusing - something tells me that this might fail
+version = '0.2'
+identifier = 'org.comp-phys.batchq'
+name = 'Job Submission'
+
+def package_requirements():
+    from vistrails.core.requirements import require_python_module
+    require_python_module('batchq')
diff --git a/vistrails/packages/JobSubmission/common_definitions.py b/vistrails/packages/JobSubmission/common_definitions.py
new file mode 100644
index 0000000..b1ede6d
--- /dev/null
+++ b/vistrails/packages/JobSubmission/common_definitions.py
@@ -0,0 +1,51 @@
+from batchq import queues
+from batchq.core.batch import BatchQ
+from batchq.queues import containers
+
+from vistrails.core.modules.basic_modules import File, Directory
+from vistrails.core.system import get_vistrails_basic_pkg_id
+
+###
+# Categories
+categories = {
+'basic_submission': 'Basic Submission',
+'job_collective_operations': "Collective operations",
+'low_level': "Low-level operations"
+}
+##
+# Helper functions
+name_formatter = lambda x: x
+capitalise = lambda x: x[0].upper() + x[1:].lower()
+remove_underscore = lambda j, name: j.join([capitalise(a) for a in name.split("_")])
+
+basic_pkg = get_vistrails_basic_pkg_id()
+type_conversion = {str:'(%s:String)' % basic_pkg, bool:'(%s:Boolean)' % basic_pkg, int:'(%s:Integer)' % basic_pkg, float:'(%s:Float)' % basic_pkg}
+
+batch_queue_list = [(a, getattr(queues,a)) for a in dir(queues) if isinstance(getattr(queues,a),type) and issubclass(getattr(queues,a),BatchQ) ]
+
+
+def create_directory(self, generator = None):
+    x = self.interpreter.filePool.create_directory()
+    return x.name
+
+def create_file(self, contents, generator = None):
+    ext=''
+    if not generator is None:
+        ext = generator.extension
+    f = self.interpreter.filePool.create_file(suffix=ext)
+    h = open(f.name,'w')
+    h.write(contents)
+    h.close()
+    return f, f.name
+
+def directory_wrapper(self, path, generator = None):
+    ret = Directory.translate_to_python(path)
+    return ret
+
+
+generator_definitions = { containers.DirectoryName:create_directory }
+
+exporter_definitions = { containers.TextFile: ('(%s:File)' % basic_pkg, 
+                                               create_file),
+                        containers.DirectoryName: ('(%s:Directory)' % basic_pkg,
+                                                   directory_wrapper)}
diff --git a/vistrails/packages/JobSubmission/init.py b/vistrails/packages/JobSubmission/init.py
new file mode 100644
index 0000000..f2eb931
--- /dev/null
+++ b/vistrails/packages/JobSubmission/init.py
@@ -0,0 +1,315 @@
+from common_definitions import categories, capitalise, \
+    type_conversion, batch_queue_list, remove_underscore, name_formatter, \
+    generator_definitions, exporter_definitions
+from vistrails.core.modules.vistrails_module import Module, ModuleError, \
+    NotCacheable, InvalidOutput, ModuleSuspended
+from batchq.core.batch import BatchQ, Function, Property, FunctionMessage, \
+    Collection, Exportable
+from batchq.queues import NoHUP
+import copy
+from machine import module_definitions, Machine
+_modules = module_definitions
+
+
+
+#######################################
+## Creating queues/"machines"
+#######################################
+
+## Stores exportable properties 
+## (property_name, vistrails_type, port visibility) for
+## each key = property_name
+exp_job_properties = {}
+
+## Stores all non-auto-generated 
+## properties (property_name, vistrails type, port visibility) 
+## for each key = property_name
+in_job_properties = {}
+
+## Stores property for each key = property_name
+job_properties = {}
+
+## Stores (property_name, vistrails type, generator)
+## for each key = property_name
+auto_job_properties = {}  
+
+operations = {}
+operations_types = {}
+operations_highlevel = {}
+for queue_name, queue in batch_queue_list:
+
+    ## Generating queue classes
+    properties = []
+    for prop_name in dir(queue):
+        if isinstance(getattr(queue,prop_name), Property):
+            attr = getattr(queue,prop_name)
+
+            ## Properties which are machine dependent
+            if attr.verbose and attr.invariant:
+                properties.append( (prop_name,type_conversion[attr.type])  )
+
+            ## Properties which are job dependent
+            if not attr.password and not attr.invariant:
+                job_properties[prop_name] = attr
+
+                # Sorting auto generated fields
+                if attr.generator is None:
+                    in_job_properties[prop_name] = (prop_name, 
+                                                    type_conversion[attr.type], 
+                                                    not attr.verbose)
+                elif attr.generator.type in generator_definitions:
+
+                    auto_job_properties[prop_name] = (prop_name,
+                                                      type_conversion[attr.type],
+                                                      generator_definitions[attr.generator.type])
+
+                # Sorting exportable fields
+                if attr.exporter is None:
+                    exp_job_properties[prop_name] = (prop_name,type_conversion[attr.type], 
+                                                     not attr.verbose)
+                else:
+                    t, _ = exporter_definitions[attr.exporter.type]
+                    exp_job_properties[prop_name] = (prop_name, t, not attr.verbose)
+
+    ## Definiting machines/queuing systems
+    members = { '_input_ports' : [('inherits',
+                                   '(org.comp-phys.batchq:Machine)',
+                                   True)] + properties, 
+                'queue_cls'    : queue,
+                '_output_ports': [('machine', 
+                                   '(org.comp-phys.batchq:Machine)')],
+                'queue'        : None
+                }
+
+    if hasattr(queue, "__descriptive_name__"):
+        descriptive_name =  queue.__descriptive_name__
+    else:
+        descriptive_name = capitalise(queue_name)
+
+    cls = type(name_formatter(descriptive_name), (Machine,), members)
+
+    ## Extracing all functions from the queues - these will be used later 
+    ## for module generation
+    functions = [(a,getattr(queue,a)) for a in dir(queue) 
+                 if isinstance(getattr(queue,a), Function) and 
+                 not a.startswith("_") and getattr(queue,a).enduser ]
+
+    for f, fnc in functions:
+        t = fnc.type
+        if not f in operations:
+            operations[f] = []
+            operations_types[f] = []
+            operations_highlevel[f] = False
+
+        operations[f].append(queue_name)
+        operations_highlevel[f] = operations_highlevel[f] or fnc.highlevel
+
+        if not t in operations_types[f]: operations_types[f].append(t)
+
+    _modules.append((cls,{'namespace':categories['basic_submission']}))
+
+functions = dict(functions)
+
+#######################################
+## Basic Job and Job creation module
+#######################################
+class Job(Machine):
+    pass
+_modules.append((Job, {'abstract':True}))
+
+
+def compute_jobpreparation(self):  
+    mac = self.getInputFromPort("machine")
+    queue, cls = mac.queue, mac.queue_cls
+    kwargs = self.get_kwargs(cls)
+
+    for f, t, generator in auto_job_properties.itervalues():
+        kwargs[f] = generator(self)
+
+    self.queue = cls(queue, **kwargs) 
+
+    self.setResult("job", self)
+
+dct = {'_input_ports'   : [b for b in in_job_properties.itervalues()] \
+           + [('machine', '(org.comp-phys.batchq:Machine)'),],
+       '_output_ports'  : [('job', '(org.comp-phys.batchq:Job)'),],
+       'compute'        : compute_jobpreparation
+       }
+
+PrepareJob = type(name_formatter("Prepare Job"), (Job,), dct)
+
+_modules += [(PrepareJob, {'namespace':categories['basic_submission']})] 
+
+#######################################
+## Creating functions 
+#######################################
+class JobOperation(NotCacheable,Module):
+    pass
+
+def joboperation_compute(self):
+    if self.hasInputFromPort("job"):
+        job = self.getInputFromPort('job')
+        queue = job.queue
+#    print "TERMINAL ID", id(queue.terminal), id(queue.local_terminal)
+        self.anno_counter = 1
+        self.anno_dict = {}
+        def annotate(fncself, *args, **kwargs):
+            if len(args) == 1:
+                self.anno_dict.update( {"note%d"%self.anno_counter: args[0]} )
+            elif len(kwargs) == 0:
+                self.anno_dict.update( {"note%d"%self.anno_counter:" ".join(args)} )
+            else:
+                self.anno_dict.updateself.annotate( kwargs )
+            self.anno_counter +=1
+            return None
+        function = getattr(queue, self.function_name)
+        pnt = function.Qprint
+        function.Qprint = annotate
+        ret = function().val()
+        function.Qprint = pnt 
+        
+        ## TODO: annotate does not seem to work
+        self.annotate(self.anno_dict)
+
+        if isinstance(ret, FunctionMessage) and ret.code != 0:
+            raise ModuleSuspended(self, ret.message, queue) if ret.code > 0 \
+                else ModuleError(self,ret.message)
+
+        self.setResult("job", job)
+        self.setResult("result", ret)
+        self.setResult("string", str(ret))
+    self.setResult("operation", self)
+
+_modules+=[(JobOperation,{'abstract':True})]
+
+members = [ ('_input_ports', [('job', '(org.comp-phys.batchq:Job)'),] ),
+            ('_output_ports', [('job', '(org.comp-phys.batchq:Job)')] ),
+            ('compute', joboperation_compute)]
+
+low_level_functions = {}
+high_level_functions = {}
+high_level_modules = []
+for name in operations.iterkeys():
+    for t in operations_types[name]:
+        dct = dict(copy.deepcopy(members)+[('function_name',name)])
+        if not t is None and not t in [FunctionMessage]:
+            dct['_output_ports'].append( ('result', type_conversion[t]) )
+
+        #  TODO: Multiple types yet to be implemented
+        ## append = "" if len(operations_types[name]) == 1 else capiltalise(str(t))
+        namespace = categories['low_level']
+
+        descriptive_name = remove_underscore(" ",name)
+        if t in [str,int, float, bool]: 
+            if functions[name].exporter is None:
+                low_level_functions[name] = (name,type_conversion[t])
+            else:
+                tt, _ = exporter_definitions[functions[name].exporter.type]
+                low_level_functions[name] = (name,tt)
+
+            if t in [bool]: 
+                descriptive_name = "Is" + remove_underscore("",name)
+            else:
+                descriptive_name = "Get" + remove_underscore("",name)
+
+        if not operations_highlevel[name]:
+            dct['_output_ports'].append( ('operation', '(org.comp-phys.batchq:JobOperation)') )
+            cls = ( type(name_formatter(descriptive_name), 
+                         (JobOperation,),dct), 
+                    {'namespace': namespace} )
+            _modules.append(cls)
+        else:
+            namespace = categories['basic_submission']
+            if t in type_conversion:
+                high_level_functions[name] = (name,type_conversion[t]) 
+            else: 
+                high_level_functions[name] = (name,None)
+            high_level_modules.append((descriptive_name, dct, namespace))
+#        namespace = categories['basic_submission']
+
+
+def jobinfo_compute(self):
+    job = self.getInputFromPort("job")
+    queue = job.queue
+    for function in self.queue_functions:
+        name = function[0]
+        function =getattr(queue, name)
+        ret =function().val()
+        if function.exporter is None:
+            self.setResult(name, ret)
+        else:
+            ## If the field is exported to a vistrails 
+            ## type the conversion is done here
+            exporter = function.exporter
+            _, exp = exporter_definitions[exporter.type]
+            ret = function.exporter.as_str()
+            self.setResult(name, exp(self,ret))
+
+    for prop in self.queue_properties:
+        name = prop[0]
+        field = queue.fields[name]
+        ret = field.get()
+        if field.exporter is None:
+            self.setResult(name, ret)
+        else:
+            exporter = field.exporter
+            _, exp = exporter_definitions[exporter.type]
+
+            ret = exporter.as_str()
+            self.setResult(name, exp(self,ret))
+
+    self.setResult("job", job)
+
+
+queue_properties = [b for b in exp_job_properties.itervalues()]
+queue_functions = [b for b in low_level_functions.itervalues()]
+dct = {'_input_ports': [('job', '(org.comp-phys.batchq:Job)'),],
+       '_output_ports': queue_properties  + queue_functions,
+       'compute': jobinfo_compute,
+       'queue_properties': queue_properties,
+       'queue_functions':  queue_functions}
+JobInfo = type(name_formatter("Job Info"), (NotCacheable,Job,), dct)
+
+_modules += [(JobInfo, {'namespace':categories['basic_submission']})] 
+
+####
+# High-level function
+def highlevel_compute(self):
+    joboperation_compute(self)
+    jobinfo_compute(self)
+
+for descriptive_name, dct, namespace in high_level_modules:
+    dct['compute'] = highlevel_compute
+    dct['is_cacheable'] = lambda self: True
+    _modules.append((type(name_formatter(descriptive_name), (JobInfo,),dct), {'namespace': namespace} ))
+
+######
+## Creating collective operations
+class CollectiveOperation(NotCacheable,Module):
+    pass
+_modules.append((CollectiveOperation, {'abstract':True}))
+
+def collective_compute(self):
+    job = self.getInputFromPort('job')
+    operation = self.getInputFromPort('operation')
+    col = Collection() 
+    col += job.queue
+
+    col2 = getattr(col, self.collection_name)()
+    rets = getattr(col2, operation.function_name)().as_list()
+    ## TODO: ad results
+    self.setResult('job', job)
+
+collective = dict([(name,getattr(Collection, name)) for name in dir(Collection) if isinstance(getattr(Collection, name),Exportable)])
+members = [ ('_input_ports', [('operation', '(org.comp-phys.batchq:JobOperation)'),('job', '(org.comp-phys.batchq:Job)')] ),
+            ('_output_ports', [('job', '(org.comp-phys.batchq:Job)')] ),
+            ('compute', collective_compute ),
+            ('collection_name', name)]
+namespace = categories['job_collective_operations']
+for name, func in collective.iteritems():
+    dct = dict(members)
+    _modules.append((type( "".join([capitalise(a) for a in name.split("_")]) , (CollectiveOperation,),dct),{'namespace':namespace} ))
+
+
+
+_modules = _modules
diff --git a/vistrails/packages/JobSubmission/machine.py b/vistrails/packages/JobSubmission/machine.py
new file mode 100644
index 0000000..b991a99
--- /dev/null
+++ b/vistrails/packages/JobSubmission/machine.py
@@ -0,0 +1,31 @@
+from vistrails.core.modules.vistrails_module import Module
+from batchq.core.batch import Property
+QUEUE_REGISTER = {}
+####
+# Machine definition
+class Machine(Module):
+    def get_kwargs(self, cls):
+        
+        ret = dict([(a[0],self.getInputFromPort(a[0])) for a in self._input_ports if self.hasInputFromPort(a[0]) and a[0] in cls.__new_fields__ and isinstance(cls.__new_fields__[a[0]],Property)])
+        ret.update({'q_interact': False})
+        return ret
+
+    def compute(self):
+        global QUEUE_REGISTER
+        kwargs = self.get_kwargs(self.queue_cls)
+        inherits = self.getInputFromPort('inherits').queue if self.hasInputFromPort('inherits') else None
+
+# never disconnect because we want to check jobs later
+#        if self.signature in QUEUE_REGISTER:
+#            q = QUEUE_REGISTER[self.signature]
+#            if hasattr(q, "disconnect"):
+#                q.disconnect()
+
+
+        self.queue = self.queue_cls(**kwargs) if inherits is None else self.queue_cls(inherits, **kwargs) 
+
+        QUEUE_REGISTER[str(self.signature)] = self.queue
+
+        self.setResult("machine", self)
+
+module_definitions = [(Machine,{'abstract':True})]
diff --git a/vistrails/packages/SUDSWebServices/__init__.py b/vistrails/packages/SUDSWebServices/__init__.py
new file mode 100644
index 0000000..4e37825
--- /dev/null
+++ b/vistrails/packages/SUDSWebServices/__init__.py
@@ -0,0 +1,72 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This package defines a set of methods to deal with web services.
+It requires suds library to be installed. Click on configure to add wsdl
+urls to the package (use a ; to separate the urls).
+"""
+from vistrails.core.configuration import ConfigurationObject
+import vistrails.core
+
+identifier = 'org.vistrails.vistrails.sudswebservices'
+name = 'SUDS Web Services'
+version = '0.1.2'
+old_identifiers = ['edu.utah.sci.vistrails.sudswebservices']
+configuration = ConfigurationObject(wsdlList=(None, str),
+                                    proxy_http=(None, str),
+                                    cache_days=(None, int))
+
+
+def can_handle_identifier(identifier):
+    """ This package handles packages where identifier starts with SUDS#
+    """
+    return identifier.startswith('SUDS#')
+
+def can_handle_vt_file(name):
+    """ This package handles file in zipped .vt files that ends with
+        "-wsdl-px"
+        They are cached web service instances 
+    """
+    return name.endswith("-wsdl.px")
+    
+#def package_dependencies():
+#    return ['edu.utah.sci.vistrails.http']
+    
+def package_requirements():
+    from vistrails.core.requirements import require_python_module
+    require_python_module('suds', {
+            'pip': 'suds',
+            'linux-debian': 'python-suds',
+            'linux-ubuntu': 'python-suds',
+            'linux-fedora': 'python-suds'})
diff --git a/vistrails/packages/SUDSWebServices/init.py b/vistrails/packages/SUDSWebServices/init.py
new file mode 100644
index 0000000..3851e99
--- /dev/null
+++ b/vistrails/packages/SUDSWebServices/init.py
@@ -0,0 +1,874 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import sys
+import os.path
+import shutil
+import hashlib
+import vistrails.core.system
+import vistrails.core.modules.module_registry
+import vistrails.core.modules.basic_modules
+import traceback
+from vistrails.core.packagemanager import get_package_manager
+from vistrails.core.modules.package import Package
+from vistrails.core.modules.vistrails_module import Module, ModuleError, new_module
+from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler
+from vistrails.core import debug
+
+import suds
+
+
+package_cache = None
+
+webServicesDict = {}
+
+def toSignature(s):
+    """ transform wsdl address to valid package signature """
+    # cannot have ':' in package name
+    return 'SUDS#' + s.replace(':', '$')
+
+def toAddress(s):
+    """ transform package signature to valid wsdl address """
+    # look up address for a specific signature
+    return s[5:].replace('$', ':')
+
+###############################################################################
+
+wsdlSchemas = ['http://www.w3.org/2001/XMLSchema',
+              'http://xml.apache.org/xml-soap',
+              'http://schemas.xmlsoap.org/soap/encoding/']
+#Dictionary of primitive types
+#list extracted from http://www.w3.org/2001/XMLSchema
+wsdlTypesDict = { 'string' : vistrails.core.modules.basic_modules.String,
+                'float': vistrails.core.modules.basic_modules.Float,
+                'decimal': vistrails.core.modules.basic_modules.Float,
+                'double': vistrails.core.modules.basic_modules.Float,
+                'boolean': vistrails.core.modules.basic_modules.Boolean,
+                'anyType': vistrails.core.modules.basic_modules.Variant,
+                'anyURI': vistrails.core.modules.basic_modules.String,
+                'DataHandler':vistrails.core.modules.basic_modules.String,
+                'dateTime': vistrails.core.modules.basic_modules.String,
+                'duration': vistrails.core.modules.basic_modules.String,
+                'time': vistrails.core.modules.basic_modules.String,
+                'date': vistrails.core.modules.basic_modules.String,
+                'gYearMonth': vistrails.core.modules.basic_modules.String,
+                'gYear': vistrails.core.modules.basic_modules.String,
+                'gMonthDay': vistrails.core.modules.basic_modules.String,
+                'gDay': vistrails.core.modules.basic_modules.String,
+                'gMonth': vistrails.core.modules.basic_modules.String,
+                'hexBinary': vistrails.core.modules.basic_modules.String,
+                'base64': vistrails.core.modules.basic_modules.String,
+                'base64Binary': vistrails.core.modules.basic_modules.String,
+                'QName': vistrails.core.modules.basic_modules.String,
+                'normalizedString': vistrails.core.modules.basic_modules.String,
+                'token': vistrails.core.modules.basic_modules.String,
+                'language': vistrails.core.modules.basic_modules.String,
+                'IDREFS': vistrails.core.modules.basic_modules.String,
+                'ENTITIES': vistrails.core.modules.basic_modules.String,
+                'NMTOKEN': vistrails.core.modules.basic_modules.String,
+                'NMTOKENS': vistrails.core.modules.basic_modules.String,
+                'Name': vistrails.core.modules.basic_modules.String,
+                'NCName': vistrails.core.modules.basic_modules.String,
+                'ID': vistrails.core.modules.basic_modules.String,
+                'IDREF': vistrails.core.modules.basic_modules.String,
+                'ENTITY': vistrails.core.modules.basic_modules.String,
+                'integer' : vistrails.core.modules.basic_modules.Integer,
+                'nonPositiveInteger' : vistrails.core.modules.basic_modules.Integer,
+                'negativeInteger' : vistrails.core.modules.basic_modules.Integer,
+                'long' : vistrails.core.modules.basic_modules.Integer,
+                'int' : vistrails.core.modules.basic_modules.Integer,
+                'short' : vistrails.core.modules.basic_modules.Integer,
+                'byte' : vistrails.core.modules.basic_modules.Integer,
+                'nonNegativeInteger' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedLong' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedInt' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedShort' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedByte' : vistrails.core.modules.basic_modules.Integer,
+                'positiveInteger' : vistrails.core.modules.basic_modules.Integer,
+                'Array': vistrails.core.modules.basic_modules.List,
+
+                # soapenc types
+                'arrayCoordinate': vistrails.core.modules.basic_modules.String,
+                'Struct': vistrails.core.modules.basic_modules.String,
+                'NOTATION': vistrails.core.modules.basic_modules.String                
+                }
+
+def initialize(*args, **keywords):
+#    import core.packagemanager
+    global webServicesDict
+    global package_cache
+
+    #Create a directory for the SUDSWebServices package
+    location = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                            "SUDSWebServices")
+    if not os.path.isdir(location):
+        try:
+            debug.log("Creating SUDS cache directory...")
+            os.mkdir(location)
+        except:
+            debug.critical(
+"""Could not create SUDS cache directory. Make sure
+'%s' does not exist and parent directory is writable""" % location)
+            sys.exit(1)
+    # the number of days to cache wsdl files
+    days = 1
+    if configuration.check("cache_days"):
+        days = configuration.cache_days
+    suds.client.ObjectCache.protocol = 0 # windows needs this
+    package_cache = suds.client.ObjectCache(location, days=days)
+
+    #reg = core.modules.module_registry.get_module_registry()
+    #reg.add_module(SUDSWebService, abstract=True)
+
+    wsdlList = []
+    if configuration.check('wsdlList'):
+        wsdlList = configuration.wsdlList.split(";")
+    else:
+        configuration.wsdlList = ''
+    for wsdl in wsdlList:
+        if not wsdl:
+            break
+        if not wsdl.startswith('http://'):
+            wsdl = 'http://' + wsdl
+        if wsdl in webServicesDict:
+            debug.warning('Duplicate WSDL entry: '+wsdl)
+            continue
+        s = Service(wsdl)
+        if s.service:
+            webServicesDict[wsdl] = s
+        
+def finalize():
+    # unload service packages
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    for s in webServicesDict.itervalues():
+        if s.package:
+            reg.remove_package(s.package)
+
+class WSMethod:
+    """ A WSDL method
+    """
+    def __init__(self, qname=('','')):
+        self.qname = qname
+        "name: (typename, ns)"
+        self.inputs = {}
+        self.outputs = {}
+
+class WSElement:
+    """ A part of a WSDL type
+    """
+    def __init__(self, name='', type=('',''), optional=False, min=0,
+                 max='unbounded', enum=False):
+        self.name = name
+        self.type = type
+        self.optional = optional
+        self.min = min
+        self.max = max
+        self.enum = enum
+
+class WSType:
+    """ A WSDL type definition
+    """
+    def __init__(self, qname=('',''), enum=False):
+        self.qname = qname
+        self.enum = enum
+        "name: WSElement"
+        self.parts = {}
+ 
+class Service:
+    def __init__(self, address):
+        """ Process WSDL and add all Types and Methods
+        """
+        self.address = address
+        self.signature = toSignature(self.address)
+        self.wsdlHash = '-1'
+        self.modules = []
+        self.package = None
+        debug.log("Installing Web Service from WSDL: %s"% address)
+
+        options = dict(cachingpolicy=1, cache=package_cache)
+        
+        proxy_types = ['http']
+        for t in proxy_types:
+            key = 'proxy_%s'%t
+            if configuration.check(key):
+                proxy = getattr(configuration, key)
+                debug.log("Using proxy: %s" % proxy)
+                if len(proxy):
+                    options['proxy'] = {t:proxy}
+        try:
+            self.service = suds.client.Client(address, **options)
+            self.backUpCache()
+        except Exception, e:
+            self.service = None
+            # We may be offline and the cache may have expired,
+            # try to use backup
+            if self.restoreFromBackup():
+                try:
+                    self.service = suds.client.Client(address, **options)
+                except Exception, e:
+                    self.service = None
+                    debug.critical("Could not load WSDL: %s" % address,
+                           str(e) + '\n' + str(traceback.format_exc()))
+            else:
+                debug.critical("Could not load WSDL: %s" % address,
+                       str(e) + '\n' + str(traceback.format_exc()))
+        if self.service:
+            try:
+                self.createPackage()
+                self.setTypes()
+                self.setMethods()
+                self.createTypeClasses()
+                self.createMethodClasses()
+            except Exception, e:
+                debug.critical("Could not create Web Service: %s" % address,
+                               str(e) + '\n' + str(traceback.format_exc()))
+                self.service = None
+        if self.wsdlHash == '-1':
+            # create empty package so that it can be reloaded/deleted
+            self.createFailedPackage()
+        
+    def makeDictType(self, obj):
+        """ Create recursive dict from SUDS object
+            ignore attributes with None and empty dicts and handle lists
+        """
+        if not hasattr(obj,'__keylist__'):
+            return obj
+        if isinstance(obj, list):
+            p = [self.makeDictType(i) for i in obj if i is not None]
+            return [i for i in p if i is not None and i != {}]
+        d = {}
+        for o in obj.__keylist__:
+            e = getattr(obj, o)
+            if e is not None:
+                p = self.makeDictType(e)
+                if p is not None and p != {}:
+                    d[str(o)] = self.makeDictType(e)
+        return d
+            
+    def backUpCache(self):
+        """ We back up the cache for situations where the cache is expired and
+            the web service can not be reached. This allows working offline.
+        """ 
+        cached = os.path.join(package_cache.location,
+                              "suds-%s-wsdl.px" % abs(hash(self.address)))
+        backup = os.path.join(package_cache.location,
+                              "suds-%s-wsdl.px" % hashlib.md5(self.address
+                                                              ).hexdigest())
+        if os.path.exists(cached):
+            shutil.copyfile(cached, backup)
+
+    def restoreFromBackup(self):
+        """ Restore from backup into cache with reset cache time""" 
+        cached = os.path.join(package_cache.location,
+                              "suds-%s-wsdl.px" % abs(hash(self.address)))
+        backup = os.path.join(package_cache.location,
+                              "suds-%s-wsdl.px" % hashlib.md5(self.address
+                                                              ).hexdigest())
+        if not os.path.exists(cached) and os.path.exists(backup):
+            shutil.copyfile(backup, cached)
+            return True
+        return False
+
+    def createPackage(self):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        if self.signature in reg.packages:
+            reg.remove_package(reg.packages[self.signature])
+
+        # create a document hash integer from the cached sax tree
+        # "name" is what suds use as the cache key
+        name = '%s-%s' % (abs(hash(self.address)), "wsdl")
+        wsdl = package_cache.get(name)
+        if not wsdl:
+            debug.critical("File not found in SUDS cache: '%s'" % name)
+            self.wsdlHash = '0'
+            return
+        self.wsdlHash = str(int(hashlib.md5(str(wsdl.root)).hexdigest(), 16))
+
+        package_id = reg.idScope.getNewId(Package.vtType)
+        package = Package(id=package_id,
+                          load_configuration=False,
+                          name="SUDS#" + self.address,
+                          identifier=self.signature,
+                          version=self.wsdlHash,
+                          )
+        suds_package = reg.get_package_by_name(identifier)
+        package._module = suds_package.module
+        package._init_module = suds_package.init_module
+        
+        self.package = package
+        reg.add_package(package)
+        reg.signals.emit_new_package(self.signature)
+
+        self.module = new_module(Module, str(self.signature))
+        reg.add_module(self.module, **{'package':self.signature,
+                                       'package_version':self.wsdlHash,
+                                       'abstract':True})
+
+    def createFailedPackage(self):
+        """ Failed package is created so that the user can remove
+        it manually using package submenu """
+        pm = get_package_manager()
+        if pm.has_package(self.signature):
+            # do nothing
+            return
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+
+        # create a document hash integer from the cached sax tree
+        # "name" is what suds use as the cache key
+        name = '%s-%s' % (abs(hash(self.address)), "wsdl")
+        self.wsdlHash = '0'
+
+        package_id = reg.idScope.getNewId(Package.vtType)
+        package = Package(id=package_id,
+                          load_configuration=False,
+                          name="SUDS#" + self.address,
+                          identifier=self.signature,
+                          version=self.wsdlHash,
+                          )
+        suds_package = reg.get_package_by_name(identifier)
+        package._module = suds_package.module
+        package._init_module = suds_package.init_module
+        self.package = package
+        reg.add_package(package)
+        reg.signals.emit_new_package(self.signature)
+        self.module = new_module(Module, str(self.signature))
+        reg.add_module(self.module, **{'package':self.signature,
+                                       'package_version':self.wsdlHash,
+                                       'abstract':True})
+        self.service = -1
+
+    def setTypes(self):
+        """ Return dict containing all exposed types in the service
+        """
+        self.wstypes = {}
+        for sd in self.service.sd:
+            for type in sd.types:
+                type = type[0]
+                # ignore existing types and arrays
+                if type.qname[1] in wsdlSchemas or type.qname[0].startswith('Array'):
+                    continue
+                qname = type.qname
+                wstype = WSType(qname, type.enum())
+                self.wstypes[qname] = wstype
+                # handle enums by adding a "value" port with the possible enums
+                if wstype.enum:
+                    values = [i[0].name for i in type.children()]
+                    wstype.parts["value"] = WSElement("value",
+                        ('string', "http://www.w3.org/2001/XMLSchema"),
+                        False, 1, 1, values)
+                    continue
+                # add elements
+                for e in type.children():
+                    e = e[0]
+                    if e.type is None:
+                        pass # probably empty type so just ignore
+                    elif e.type[0].startswith('Array'):
+                        qtype = ('Array', 'http://www.w3.org/2001/XMLSchema')
+                        wstype.parts[e.name] = WSElement(e.name, qtype,
+                                                   e.optional(), e.min, e.max)
+                    else:
+                        wstype.parts[e.name] = WSElement(e.name, e.type,
+                                                   e.optional(), e.min, e.max)
+
+    def setMethods(self):
+        """ Return dict with methods in service
+        """
+        def isKnownType(qtype):
+            return not qtype or str(qtype[1]) in wsdlSchemas or \
+            qtype[0].startswith('Array') or qtype in self.wstypes
+
+        def getChildTypes(type):
+            schema = self.service.wsdl.schema
+            if type in schema.elements:
+                if schema.elements[type].type is not None:
+                    return [(schema.elements[type].name, schema.elements[type].type)]
+                else:
+                    return [(c[0].name, c[0].type) for c in schema.elements[type].children()]
+            elif type in schema.types:
+                return [(c[0].name, c[0].type) for c in schema.types[type].children()]
+            debug.critical("Could not resolve type in WSDL:" + str(type))
+            return []
+
+        def setMethod(m):
+            # create new method
+            wsm = WSMethod((m[0], self.address))
+            self.wsmethods[wsm.qname] = wsm
+            # process inputs
+            for param in m[1]:
+                name = param[0]
+                qtype = (param[1].resolve().name, param[1].resolve().namespace()[1])
+                qtype = (str(qtype[0]), str(qtype[1]))
+                if qtype is None:
+                    qtype = param[1].element
+                    qtype = (str(qtype[0]), str(qtype[1]))
+                if qtype is not None:
+                    if qtype[0].startswith('Array'):
+                        qtype = ('Array', 'http://www.w3.org/2001/XMLSchema')
+                    wsm.inputs[name] = qtype
+            # process outputs - need to look recursively in wsdl
+            method = self.service.service.__getattr__(m[0])
+            for output in method.method.soap.output.body.parts:
+                # get schema definition of method
+                if output.type:
+                    qtype = output.type
+                else:
+                    element = self.service.wsdl.schema.elements[output.element]
+                    qtype = element.type if element.type else output.element
+                # check that it exists
+                types = [(output.name, qtype)]
+                while qtype is not None and not isKnownType(qtype):
+                    types = getChildTypes(qtype)
+                    if len(types):
+                        qtype = types[0][1]
+                    else:
+                        break
+                for name, qtype in types:
+                    if qtype is not None:
+                        if qtype[0].startswith('Array'):
+                            qtype = ('Array', 'http://www.w3.org/2001/XMLSchema')
+                        wsm.outputs[name] = qtype
+        # loop through services, ports, and methods
+        self.wsmethods = {}
+        for sd in self.service.sd:
+            for port in sd.ports:
+                for m in port[1]:
+                    setMethod(m)
+
+    def createTypeClasses(self):
+        # first create classes
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        self.typeClasses = {}
+        for t in self.wstypes.itervalues():
+            def compute(self):
+                """ 1. use type input as object or create new
+                    2. add other inputs to obj
+                    3. set obj and parts as outputs
+                """
+                if self.wstype.enum:
+                    # only makes sure the enum is one of the valid values
+                    p = self.wstype.parts['value']
+                    if self.hasInputFromPort(p.name):
+                        obj = self.getInputFromPort(p.name)
+                    else:
+                        obj = p.enum[0] if len(p.enum) else ''
+                    if self.hasInputFromPort('value'):
+                        obj = self.getInputFromPort('value')
+                    if obj not in p.enum:
+                        raise ModuleError(self,
+                                 "'%s' is not one of the valid enums: %s" %
+                                 (obj, str(p.enum)) )
+                    self.setResult(self.wstype.qname[0], obj)
+                    self.setResult('value', obj)
+                    return
+                if self.hasInputFromPort(self.wstype.qname[0]):
+                    obj = self.getInputFromPort(self.wstype.qname[0])
+                else:
+                    obj = {}
+                    s = "{%s}%s"%(self.wstype.qname[1],self.wstype.qname[0])
+                    try:
+                        obj = self.service.service.factory.create(s)
+                    except (suds.TypeNotFound, suds.BuildError):
+                        raise ModuleError("Type not found: %s" % s)
+                for part in self.wstype.parts.itervalues():
+                    # 
+                    if obj.__class__.__name__ == 'UberClass':
+                        # UberClass is a placeholder and its value is assumed
+                        # to be the correct attribute value
+                        if len(self.wstype.parts) == 1:
+                            setattr(obj, part.name, obj.value)
+                        else:
+                            # update each attribute
+                            if hasattr(obj.value, part.name):
+                                setattr(obj, part.name, getattr(obj.value, part.name))
+                    if self.hasInputFromPort(part.name):
+                        p = self.getInputFromPort(part.name)
+                        if hasattr(obj, part.name):
+                            setattr(obj, part.name, p)
+                        else:
+                            # do it anyway - assume attribute missing in template
+                            setattr(obj, part.name, p)
+                    if hasattr(obj, part.name):
+                        # 
+                        res = getattr(obj, part.name)
+                        self.setResult(part.name, res)
+                self.setResult(self.wstype.qname[0], obj)
+
+            # create docstring
+            parts = ", ".join([i.type[0]+' '+i.name for i in t.parts.itervalues()])
+            d = """This module was created using a wrapper for SUDS (fedorahosted.org/suds/)
+from the WSDL spec at:
+   %s
+It is a WSDL type with signature:
+   %s(%s)"""%(self.address, t.qname[0], parts)
+            M = new_module(self.module, str(t.qname[0]),{"compute":compute,
+                                                         "wstype":t,
+                                                         "service":self,
+                                                         "__doc__":d})
+            self.typeClasses[t.qname] = M
+            reg.add_module(M, **{'namespace':'Types',
+                                 'package':self.signature,
+                                 'package_version':self.wsdlHash})
+
+        # then add ports
+        for t in self.wstypes:
+            wstype = self.wstypes[t]
+            # get type module
+            if t[1] in wsdlSchemas:
+                c = wsdlTypesDict[t[0]]
+            elif t in self.typeClasses:
+                c = self.typeClasses[t]
+            else:
+                debug.critical("Cannot find module for type: " + str(t))
+                continue
+            # add self ports
+            reg.add_input_port(self.typeClasses[t], t[0], c)
+            reg.add_output_port(self.typeClasses[t], t[0], c)
+            for p in wstype.parts:
+                part = wstype.parts[p]
+                # get type module
+                ptype = part.type
+                if part.max is not None and (part.max == 'unbounded' or int(part.max)>1):
+                    # it can be multiple objects which means we need to make it a list
+                    c = vistrails.core.modules.basic_modules.List
+                elif ptype[1] in wsdlSchemas:
+                    c = wsdlTypesDict[ptype[0]]
+                elif ptype in self.typeClasses:
+                    c = self.typeClasses[ptype]
+                else:
+                    debug.critical("Cannot find module for type: " + str(ptype))
+                    continue
+                # add as both input and output port
+                reg.add_input_port(self.typeClasses[t], p, c,
+                                   optional=part.optional)
+                reg.add_output_port(self.typeClasses[t], p, c,
+                                    optional=part.optional)
+
+    def createMethodClasses(self):
+        # register modules
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        self.methodClasses = {}
+        for m in self.wsmethods.itervalues():
+            def compute(self):
+                # create dict of inputs
+                cacheable = False
+                if self.hasInputFromPort('cacheable'):
+                    cacheable = self.getInputFromPort('cacheable')
+                self.is_cacheable = lambda *args, **kwargs: cacheable            
+                params = {}
+                mname = self.wsmethod.qname[0]
+                for name in self.wsmethod.inputs:
+                    name = str(name)
+                    if self.hasInputFromPort(name):
+                        params[name] = self.getInputFromPort(name)
+                        if params[name].__class__.__name__ == 'UberClass':
+                            params[name] = params[name].value
+                        params[name] = self.service.makeDictType(params[name])
+                try:
+                    #import logging
+                    #logging.basicConfig(level=logging.INFO)
+                    #logging.getLogger('suds.client').setLevel(logging.DEBUG)
+                    #print "params:", str(params)[:400]
+                    #self.service.service.set_options(retxml = True)
+                    #result = getattr(self.service.service.service, mname)(**params)
+                    #print "result:", str(result)[:400]
+                    #self.service.service.set_options(retxml = False)
+                    result = getattr(self.service.service.service, mname)(**params)
+                except Exception, e:
+                    raise ModuleError(self, "Error invoking method %s: %s"%(name, str(e)))
+                for name, qtype in self.wsmethod.outputs.iteritems():
+                    if isinstance(result, list):
+                        # if result is a list just set the output
+                        self.setResult(name, result)
+                    elif qtype[0] == 'Array':
+                        # if result is a type but type is a list try to extract the correct element
+                        if len(result.__keylist__):
+                            self.setResult(name, getattr(result, result.__keylist__[0]))
+                        else:
+                            self.setResult(name, result)
+                    elif result.__class__.__name__ == 'Text':
+                        # only text returned so we assume each output wants all of it
+                        self.setResult(name, str(result.trim()))
+                    elif result.__class__.__name__ == qtype[0]:
+                        # the return value is this type
+                        self.setResult(name, result)
+                    elif hasattr(result, name):
+                        self.setResult(name, getattr(result, name))
+                    else:
+                        # nothing matches - assume it is an attribute of the correct class
+                        class UberClass:
+                            def __init__(self, value):
+                                self.value = value
+                        self.setResult(name, UberClass(result))
+
+            # create docstring
+            inputs = ", ".join([t[0]+' '+i for i,t in m.inputs.iteritems()])
+            outputs = ", ".join([t[0]+' '+o for o,t in m.outputs.iteritems()])
+            d = """This module was created using a wrapper for SUDS (fedorahosted.org/suds/)
+from the WSDL spec at:
+   %s
+It is a WSDL method with signature:
+   %s(%s)
+Outputs:
+   (%s)
+"""%(self.address, m.qname[0], inputs, outputs)
+
+            M = new_module(self.module, str(m.qname[0]), {"compute":compute,
+                                                          "wsmethod":m,
+                                                          "service":self,
+                                                           "__doc__":d})
+            self.methodClasses[m.qname] = M
+            reg.add_module(M, **{'namespace':'Methods',
+                                 'package':self.signature,
+                                 'package_version':self.wsdlHash})
+            reg.add_input_port(self.methodClasses[m.qname], 'cacheable',
+                               wsdlTypesDict['boolean'], optional=True)
+
+            # add ports
+            for p, ptype in m.inputs.iteritems():
+                if ptype[1] in wsdlSchemas:
+                    c = wsdlTypesDict[ptype[0]]
+                elif ptype in self.typeClasses:
+                    c = self.typeClasses[ptype]
+                else:
+                    # use string as default
+                    c = wsdlTypesDict['string']
+                reg.add_input_port(M, p, c)
+            for p, ptype in m.outputs.iteritems():
+                if ptype[1] in wsdlSchemas:
+                    c = wsdlTypesDict[ptype[0]]
+                elif ptype in self.typeClasses:
+                    c = self.typeClasses[ptype]
+                else:
+                    # use string as default
+                    c = wsdlTypesDict['string']
+                reg.add_output_port(M, p, c)
+
+def load_from_signature(signature):
+    """ Load wsdl from signature and return success status """
+    wsdl = toAddress(signature)
+    wsdlList = []
+    if configuration.check('wsdlList'):
+        wsdlList = configuration.wsdlList.split(";")
+    if not wsdl in wsdlList:
+        try:
+            service = Service(wsdl)
+        except:
+            return False
+        if not service.service:
+            return False
+        webServicesDict[wsdl] = service
+        wsdlList.append(wsdl)
+        configuration.wsdlList = ';'.join(wsdlList)
+    return True
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    old_module = pipeline.modules[module_id]
+    # first check package
+    # v1.0 types:
+    if old_module.package == 'edu.utah.sci.vistrails.sudswebservices':
+        wsdl = old_module.namespace.split('|')[0]
+        namespace = old_module.namespace.split('|')[1]
+    else:
+        wsdl = toAddress(old_module.package)
+        namespace = old_module.namespace
+    name = old_module.name
+
+    wsdlList = []
+    if configuration.check('wsdlList'):
+        wsdlList = configuration.wsdlList.split(";")
+    if not wsdl in wsdlList:
+        service = Service(wsdl)
+        if not service.service:
+            return []
+        webServicesDict[wsdl] = service
+        wsdlList.append(wsdl)
+        configuration.wsdlList = ';'.join(wsdlList)
+
+    if old_module.package == 'edu.utah.sci.vistrails.sudswebservices':
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        new_descriptor = reg.get_descriptor_by_name(toSignature(wsdl), name,
+                                                    namespace)
+        if not new_descriptor:
+            return []
+        try:
+            return UpgradeWorkflowHandler.replace_module(controller, pipeline,
+                                                    module_id, new_descriptor)
+        except Exception, e:
+            import traceback
+            traceback.print_exc()
+            raise
+
+    return UpgradeWorkflowHandler.attempt_automatic_upgrade(controller, 
+                                                            pipeline,
+                                                            module_id)
+
+def handle_missing_module(controller, module_id, pipeline):
+    global webServicesDict
+    global package_cache
+
+    def get_wsdl_from_namespace(m_namespace):
+        try:
+            wsdl = m_namespace.split("|")
+            return wsdl[0]
+        except:
+            return None
+    
+    m = pipeline.modules[module_id]
+    if m.package == identifier:
+        # v1.0 old style
+        m_namespace = m.namespace
+        wsdl = get_wsdl_from_namespace(m_namespace)
+    else:
+        # v1.1 new style
+        wsdl = toAddress(m.package)
+    
+    wsdlList = []
+    if configuration.check('wsdlList'):
+        wsdlList = configuration.wsdlList.split(";")
+    if wsdl in wsdlList:
+        # it is already loaded
+        return True
+
+    service = Service(wsdl)
+    if not service.service:
+        return False
+
+    webServicesDict[wsdl] = service
+    wsdlList.append(wsdl)
+    configuration.wsdlList = ';'.join(wsdlList)
+    return True
+
+def load_from_identifier(service_identifier):
+    """ Loads a web service from its package identifier """
+    global webServicesDict
+    global package_cache
+
+    wsdl = toAddress(service_identifier)
+    
+    wsdlList = []
+    if configuration.check('wsdlList'):
+        wsdlList = configuration.wsdlList.split(";")
+    if wsdl in wsdlList:
+        # it is already loaded
+        return True
+
+    service = Service(wsdl)
+    if not service.service:
+        return False
+
+    webServicesDict[wsdl] = service
+    wsdlList.append(wsdl)
+    configuration.wsdlList = ';'.join(wsdlList)
+    return True
+
+def contextMenuName(signature):
+    """ Returns a context menu name that depends on the signature
+        should return None if no method is available
+    """
+    if signature == name:
+        return "Add Web Service"
+    elif signature.startswith('SUDS#'):
+        return "Remove this Web Service"
+    return None
+
+def saveVistrailFileHook(vistrail, temp_dir):
+    """ This is called when a vistrail is loaded
+        We should copy all used Web Services in temp_dir to .vistrails
+        """
+
+    
+    packages = vistrail.get_used_packages()
+    # clear old files
+    for name in os.listdir(temp_dir):
+        if name.endswith("-wsdl.px"):
+            os.remove(os.path.join(temp_dir, name))
+
+    for package in packages:
+        if package.startswith("SUDS#"):
+            address = toAddress(package)
+            name = "suds-%s-wsdl.px" % hashlib.md5(address).hexdigest()
+            cached = os.path.join(package_cache.location, name)
+            vt_cached = os.path.join(temp_dir, name)
+            if os.path.exists(cached):
+                shutil.copyfile(cached, vt_cached)
+
+def loadVistrailFileHook(vistrail, temp_dir):
+    """ This is called when a vistrail is saved
+        We should copy all cached Web Services in vistrail to temp_dir
+        if they do not exist
+    """
+    for name in os.listdir(temp_dir):
+        src = os.path.join(temp_dir, name)
+        dest = os.path.join(package_cache.location, name)
+        if name.endswith("-wsdl.px") and not os.path.exists(dest):
+            shutil.copyfile(src, dest)
+    
+def callContextMenu(signature):
+    global webServicesDict
+    if signature == name:
+        from PyQt4 import QtGui 
+        wsdl, ret = QtGui.QInputDialog.getText(None, 'Add Web Service',
+                                           'Enter the location of the WSDL:')
+        wsdl = str(wsdl)
+        if not wsdl:
+            return
+        if not wsdl.startswith('http://'):
+            wsdl = 'http://' + wsdl
+        if wsdl in webServicesDict:
+            debug.critical('WSDL already loaded: '+wsdl)
+            return
+        s = Service(wsdl)
+        if s.service:
+            webServicesDict[wsdl] = s
+            wsdlList = configuration.wsdlList.split(";")
+            wsdlList.append(wsdl)
+            configuration.wsdlList = ';'.join(wsdlList)
+    elif signature.startswith('SUDS#'):
+        address = toAddress(signature)
+        from PyQt4 import QtGui 
+        res = QtGui.QMessageBox.question(None,
+                           'Remove the following web service from vistrails?',
+                           address,
+                           buttons=QtGui.QMessageBox.Yes,
+                           defaultButton=QtGui.QMessageBox.No)
+        if res == QtGui.QMessageBox.Yes:
+            # Remove this Web Service
+            s = webServicesDict[address]
+            del webServicesDict[address]
+
+            reg = vistrails.core.modules.module_registry.get_module_registry()
+            reg.remove_package(s.package)
+            wsdlList = configuration.wsdlList.split(";")
+            wsdlList.remove(address)
+            configuration.wsdlList = ';'.join(wsdlList)
diff --git a/vistrails/packages/__init__.py b/vistrails/packages/__init__.py
new file mode 100644
index 0000000..cdc9214
--- /dev/null
+++ b/vistrails/packages/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Nothing here on purpose
+pass
diff --git a/vistrails/packages/analytics/__init__.py b/vistrails/packages/analytics/__init__.py
new file mode 100644
index 0000000..e132e51
--- /dev/null
+++ b/vistrails/packages/analytics/__init__.py
@@ -0,0 +1,39 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+name = "VisTrails Analytics"
+identifier = "org.vistrails.vistrails.analytics"
+version = "0.0.2"
+old_identifiers = ["edu.utah.sci.vistrails.analytics"]
diff --git a/vistrails/packages/analytics/counts.vt b/vistrails/packages/analytics/counts.vt
new file mode 100644
index 0000000..4fa3750
Binary files /dev/null and b/vistrails/packages/analytics/counts.vt differ
diff --git a/vistrails/packages/analytics/executedWorkflows.vt b/vistrails/packages/analytics/executedWorkflows.vt
new file mode 100644
index 0000000..c77e5fd
Binary files /dev/null and b/vistrails/packages/analytics/executedWorkflows.vt differ
diff --git a/vistrails/packages/analytics/init.py b/vistrails/packages/analytics/init.py
new file mode 100644
index 0000000..520290e
--- /dev/null
+++ b/vistrails/packages/analytics/init.py
@@ -0,0 +1,180 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.modules.basic_modules import new_constant
+from vistrails.core.modules.vistrails_module import Module, ModuleError, ModuleConnector
+import vistrails.core.vistrail.vistrail
+import vistrails.core.log.log 
+import vistrails.db.services.io
+
+
+class Vistrail(Module):
+    pass
+
+class Log(Module):
+    pass
+
+class ReadVistrail(Module):
+    _input_ports = [('file', '(basic:File)')]
+    _output_ports = [('vistrail','(Vistrail)'),
+                     ('log', '(Log)')]
+
+    def read_vistrail(self, fname):
+        # open the .vt bundle specified by the filename "fname"
+        bundle = vistrails.db.services.io.open_vistrail_bundle_from_zip_xml(fname)[0]
+
+        # access the vistrail from the bundle
+        vistrail = bundle.vistrail
+
+        # convert the vistrail from a db object
+        vistrails.core.vistrail.vistrail.Vistrail.convert(vistrail)
+
+        return vistrail
+
+    def read_log(self, fname):
+        # open the .vt bundle specified by the filename "fname"
+        bundle = vistrails.db.services.io.open_vistrail_bundle_from_zip_xml(fname)[0]
+       
+        # get the log filename
+        log_fname = bundle.vistrail.db_log_filename
+  
+        if log_fname is not None:
+            # open the log
+            log = vistrails.db.services.io.open_log_from_xml(log_fname, True)
+
+            # convert the log from a db object
+            vistrails.core.log.log.Log.convert(log)
+            return log
+        if log_fname is None:
+            # throw error message
+            raise ModuleError(self, "No log file accessible")
+
+        return None
+
+    def compute(self):
+        fname = self.getInputFromPort('file').name
+        vistrail = self.read_vistrail(fname)
+        self.setResult('vistrail', vistrail)
+        fname = self.getInputFromPort('file').name
+        log = self.read_log(fname)
+        self.setResult('log', log)
+
+class CountActions(Module):
+    _input_ports = [('vistrail', '(Vistrail)')]
+    _output_ports = [('counts', '(basic:Dictionary)')]
+
+    def count_actions(self, vistrail):
+    # loop through the actionMap dictionary's (key, value) pairs in
+    # sorted order
+        Tally={}
+        for id, action in sorted(vistrail.actionMap.iteritems()):
+            # print action information
+            for action in action.operations:
+                # look for action(what) in dictionary
+                # if not there, create an entry with a sub dictionary containing the vtType
+                if action.what not in Tally:
+                    Tally[action.what] = {action.vtType : 1}
+
+                # if is there, if subdictionray has the vtType key, update vtType count
+                elif Tally.has_key(action.what):
+                    if Tally[action.what].has_key(action.vtType):
+                        Tally[action.what][action.vtType] += 1
+                    else:
+                        Tally[action.what] = {action.vtType : 1}
+
+                # if is there, if subdictionary does not have vtType key, create entry
+                elif Tally.has_key(action.what) == none:
+                    Tally[action.what] = {action.vtType : 1}
+        return Tally
+
+    def compute(self):
+        vistrail = self.getInputFromPort('vistrail')
+        Tally = self.count_actions(vistrail)
+        self.setResult('counts', Tally)
+
+class CountExecutedWorkflows(Module):
+    _input_ports = [('log', '(Log)')]
+    _output_ports = [('completed', '(basic:Dictionary)')]
+    def count_executed_workflows(self,log):
+        users={}
+        for workflow_exec in log.workflow_execs:
+            if workflow_exec.completed == 1:
+                if workflow_exec.user not in users:
+                    users[workflow_exec.user] = 1
+                else:
+                    users[workflow_exec.user] += 1
+        return users
+
+    def compute(self):
+        log = self.getInputFromPort('log')
+        users = self.count_executed_workflows(log)
+        self.setResult('completed', users)
+
+class TotalDays(Module):
+    _input_ports = [('vistrail','(Vistrail)')]
+    _output_ports = [('completed','(basic:Dictionary)')]
+    def calc_time(self, vistrail):
+        time = {}
+        totals = {}
+        for id,action in sorted(vistrail.actionMap.iteritems()):
+            if action.user not in time:
+                # action.date is a string representation
+                # action.db_date is the real python datetime object
+                time[action.user] = [action.db_date]
+            else:
+                time[action.user].append(action.db_date)
+
+        for user, time_list in time.iteritems():
+            max_time = max(time_list)
+            min_time = min(time_list)
+
+            # this is a timedelta object
+            # http://docs.python.org/library/datetime.html#timedelta-objects
+            time_delta = max_time - min_time
+
+            # .days returns the number of days in the time delta
+            totals[user] = time_delta.days + 1
+
+        return totals
+                
+    def compute(self):
+        vistrail = self.getInputFromPort('vistrail')
+        totals = self.calc_time(vistrail)
+        self.setResult('completed', totals)
+
+#class TimevsTags(Module):
+    #Compare a few workflows to see how long the project took vs. how many tags were made
+ #   pass
+
+_modules = [Vistrail, Log, ReadVistrail, CountActions, CountExecutedWorkflows, TotalDays]
diff --git a/vistrails/packages/analytics/times.vt b/vistrails/packages/analytics/times.vt
new file mode 100644
index 0000000..49e8bfb
Binary files /dev/null and b/vistrails/packages/analytics/times.vt differ
diff --git a/vistrails/packages/controlflow/__init__.py b/vistrails/packages/controlflow/__init__.py
new file mode 100644
index 0000000..2211a9b
--- /dev/null
+++ b/vistrails/packages/controlflow/__init__.py
@@ -0,0 +1,39 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+identifier="org.vistrails.vistrails.control_flow"
+name="Control Flow"
+version="0.2.3"
+old_identifiers = ["edu.utah.sci.vistrails.control_flow"]
diff --git a/vistrails/packages/controlflow/conditional.py b/vistrails/packages/controlflow/conditional.py
new file mode 100644
index 0000000..4494406
--- /dev/null
+++ b/vistrails/packages/controlflow/conditional.py
@@ -0,0 +1,119 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.modules.vistrails_module import Module, InvalidOutput, \
+    ModuleError
+import copy
+
+#################################################################################
+## If Operator
+
+class If(Module):
+    """
+    The If Module alows the user to choose the part of the workflow to be
+    executed through the use of a condition.
+    """
+
+    def updateUpstream(self):
+        """A modified version of the updateUpstream method."""
+
+        # everything is the same except that we don't update anything
+        # upstream of TruePort or FalsePort
+        excluded_ports = set(['TruePort', 'FalsePort', 'TrueOutputPorts',
+                              'FalseOutputPorts'])
+        for port_name, connector_list in self.inputPorts.iteritems():
+            if port_name not in excluded_ports:
+                for connector in connector_list:
+                    connector.obj.update()
+        for port_name, connectorList in copy.copy(self.inputPorts.items()):
+            if port_name not in excluded_ports:
+                for connector in connectorList:
+                    if connector.obj.get_output(connector.port) is \
+                            InvalidOutput:
+                        self.removeInputConnector(port_name, connector)
+
+    def compute(self):
+        """ The compute method for the If module."""
+
+        if not self.hasInputFromPort('Condition'):
+            raise ModuleError(self, 'Must set condition')
+        cond = self.getInputFromPort('Condition')
+
+        if cond:
+            port_name = 'TruePort'
+            output_ports_name = 'TrueOutputPorts'
+        else:
+            port_name = 'FalsePort'
+            output_ports_name = 'FalseOutputPorts'
+
+        if self.hasInputFromPort(output_ports_name):
+            for connector in self.inputPorts.get(output_ports_name):
+                connector.obj.update()
+
+        if not self.hasInputFromPort(port_name):
+            raise ModuleError(self, 'Must set ' + port_name)
+
+        for connector in self.inputPorts.get(port_name):
+            connector.obj.update()
+
+            if self.hasInputFromPort(output_ports_name):
+                output_ports = self.getInputFromPort(output_ports_name)
+                result = []
+                for output_port in output_ports:
+                    result.append(connector.obj.get_output(output_port))
+
+                # FIXME can we just make this a list?
+                if len(output_ports) == 1:
+                    self.setResult('Result', result[0])
+                else:
+                    self.setResult('Result', result)
+
+#################################################################################
+## Default module
+
+class Default(Module):
+    """
+    The Default module allows the user to provide a default value.
+
+    This module can be put in the middle of a connection to provide a default
+    value from the Default port in case nothing is set on the Input port. This
+    is particularly useful when using subworkflows, with InputPort modules with
+    optional set to True.
+    """
+
+    def compute(self):
+        if self.hasInputFromPort('Input'):
+            self.setResult('Result', self.getInputFromPort('Input'))
+        else:
+            self.setResult('Result', self.getInputFromPort('Default'))
diff --git a/vistrails/packages/controlflow/fold.py b/vistrails/packages/controlflow/fold.py
new file mode 100644
index 0000000..1886011
--- /dev/null
+++ b/vistrails/packages/controlflow/fold.py
@@ -0,0 +1,308 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core import debug
+from vistrails.core.modules.vistrails_module import Module, ModuleError, \
+    ModuleConnector, InvalidOutput, ModuleSuspended
+from vistrails.core.modules.basic_modules import Boolean, String, Integer, \
+    Float, Constant, List
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.vistrail.port_spec import PortSpec
+
+import copy
+from itertools import izip
+
+###############################################################################
+## Fold Operator
+
+class Fold(Module):
+    """Fold is the base class for List-reducing modules.
+
+    It can be used to easily implement a module that takes a List and
+    aggregates its element one by one to get the final result, such as Sum.
+
+    To use it, create a subclass and override the setInitialValue() and
+    operation() methods.
+    """
+
+    def __init__(self):
+        Module.__init__(self)
+
+    def compute(self):
+        """The compute method for the Fold."""
+
+        self.setInitialValue()
+        self.partialResult = self.initialValue
+        self.elementResult = None
+
+        for element in self.getInputFromPort('InputList'):
+            self.element = element
+            self.operation()
+
+        if self.suspended:
+            raise ModuleSuspended(
+                    self,
+                    self.suspended,
+                    children=self._module_suspended)
+        self.setResult('Result', self.partialResult)
+
+    def setInitialValue(self):
+        """This method defines the initial value of the Fold structure. It must
+        be defined before the operation() method."""
+
+        pass
+
+    def operation(self):
+        """This method defines the interaction between the current element of
+        the list and the previous iterations' result."""
+
+        pass
+
+###############################################################################
+
+class FoldWithModule(Fold):
+    """Implementation of Fold that uses another module as its operation.
+
+    This can be used to create structures like Map or Filter, where another
+    module will be called with each element of the list to retrieve something
+    that this module will use.
+    """
+
+    def __init__(self):
+        Fold.__init__(self)
+        self.is_looping_module = True
+
+    def updateUpstream(self):
+        """A modified version of the updateUpstream method."""
+
+        # everything is the same except that we don't update anything
+        # upstream of FunctionPort
+        for port_name, connector_list in self.inputPorts.iteritems():
+            if port_name == 'FunctionPort':
+                for connector in connector_list:
+                    connector.obj.updateUpstream()
+            else:
+                for connector in connector_list:
+                    connector.obj.update()
+        for port_name, connectorList in list(self.inputPorts.items()):
+            if port_name != 'FunctionPort':
+                for connector in connectorList:
+                    if connector.obj.get_output(connector.port) is \
+                            InvalidOutput:
+                        self.removeInputConnector(port_name, connector)
+
+    def updateFunctionPort(self):
+        """
+        Function to be used inside the updateUsptream method of the
+        FoldWithModule module. It updates the modules connected to the
+        FunctionPort port.
+        """
+        nameInput = self.getInputFromPort('InputPort')
+        nameOutput = self.getInputFromPort('OutputPort')
+        rawInputList = self.getInputFromPort('InputList')
+
+        # Create inputList to always have iterable elements
+        # to simplify code
+        if len(nameInput) == 1:
+            element_is_iter = False
+            inputList = [[element] for element in rawInputList]
+        else:
+            element_is_iter = True
+            inputList = rawInputList
+        suspended = []
+        ## Update everything for each value inside the list
+        for i, element in enumerate(inputList):
+            self.logging.update_progress(self, float(i)/len(inputList))
+            if element_is_iter:
+                self.element = element
+            else:
+                self.element = element[0]
+            for connector in self.inputPorts.get('FunctionPort'):
+                module = copy.copy(connector.obj)
+
+                if not self.upToDate:
+                    ## Type checking
+                    if i == 0:
+                        self.typeChecking(module, nameInput, inputList)
+
+                    module.upToDate = False
+                    module.computed = False
+
+                    ## Setting information for logging stuff
+                    module.is_looping = True
+                    module.first_iteration = i == 0
+                    module.last_iteration = i == len(inputList) - 1
+                    module.loop_iteration = i
+
+                    self.setInputValues(module, nameInput, element)
+
+                module.update()
+                if hasattr(module, 'suspended') and module.suspended:
+                    suspended.append(module._module_suspended)
+                    module.suspended = False
+                    continue
+                ## Getting the result from the output port
+                if nameOutput not in module.outputPorts:
+                    raise ModuleError(module,
+                                      'Invalid output port: %s' % nameOutput)
+                self.elementResult = module.get_output(nameOutput)
+            self.operation()
+        if suspended:
+            self.suspended = "%d module(s) suspended: %s" % (
+                    len(suspended), suspended[0].msg)
+            self._module_suspended = suspended
+
+    def setInputValues(self, module, inputPorts, elementList):
+        """
+        Function used to set a value inside 'module', given the input port(s).
+        """
+        for element, inputPort in izip(elementList, inputPorts):
+            ## Cleaning the previous connector...
+            if inputPort in module.inputPorts:
+                del module.inputPorts[inputPort]
+            new_connector = ModuleConnector(create_constant(element), 'value')
+            module.set_input_port(inputPort, new_connector)
+
+    def typeChecking(self, module, inputPorts, inputList):
+        """
+        Function used to check if the types of the input list element and of the
+        inputPort of 'module' match.
+        """
+        for elementList in inputList:
+            if len(elementList) != len(inputPorts):
+                raise ModuleError(self,
+                                  'The number of input values and input ports '
+                                  'are not the same.')
+            for element, inputPort in izip(elementList, inputPorts):
+                p_modules = module.moduleInfo['pipeline'].modules
+                p_module = p_modules[module.moduleInfo['moduleId']]
+                port_spec = p_module.get_port_spec(inputPort, 'input')
+                v_module = get_module(element, port_spec.signature)
+                if v_module is not None:
+                    if not self.compare(port_spec, v_module, inputPort):
+                        raise ModuleError(self,
+                                          'The type of a list element does '
+                                          'not match with the type of the '
+                                          'port %s.' % inputPort)
+
+                    del v_module
+                else:
+                    break
+
+    def createSignature(self, v_module):
+        """
+    `   Function used to create a signature, given v_module, for a port spec.
+        """
+        if isinstance(v_module, tuple):
+            v_module_class = []
+            for module_ in v_module:
+                v_module_class.append(self.createSignature(module_))
+            return v_module_class
+        else:
+            return v_module
+
+    def compare(self, port_spec, v_module, port):
+        """
+        Function used to compare two port specs.
+        """
+        port_spec1 = port_spec
+
+        reg = get_module_registry()
+
+        v_module = self.createSignature(v_module)
+        port_spec2 = PortSpec(**{'signature': v_module})
+        matched = reg.are_specs_matched(port_spec2, port_spec1)
+
+        return matched
+
+    def compute(self):
+        """The compute method for the Fold."""
+
+        self.setInitialValue()
+        self.partialResult = self.initialValue
+        self.elementResult = None
+
+        self.updateFunctionPort()
+
+        if self.suspended:
+            raise ModuleSuspended(
+                    self,
+                    self.suspended,
+                    children=self._module_suspended)
+        self.setResult('Result', self.partialResult)
+
+###############################################################################
+
+class NewConstant(Constant):
+    """
+    A new Constant module to be used inside the FoldWithModule module.
+    """
+    def setValue(self, v):
+        self.setResult("value", v)
+        self.upToDate = True
+
+def create_constant(value):
+    """
+    Creates a NewConstant module, to be used for the ModuleConnector.
+    """
+    constant = NewConstant()
+    constant.setValue(value)
+    return constant
+
+def get_module(value, signature):
+    """
+    Creates a module for value, in order to do the type checking.
+    """
+    if isinstance(value, Constant):
+        return type(value)
+    elif isinstance(value, bool):
+        return Boolean
+    elif isinstance(value, str):
+        return String
+    elif isinstance(value, int):
+        return Integer
+    elif isinstance(value, float):
+        return Float
+    elif isinstance(value, list):
+        return List
+    elif isinstance(value, tuple):
+        v_modules = ()
+        for element in xrange(len(value)):
+            v_modules += (get_module(value[element], signature[element]),)
+        return v_modules
+    else:
+        debug.warning("Could not identify the type of the list element.")
+        debug.warning("Type checking is not going to be done inside"
+                      "FoldWithModule module.")
+        return None
diff --git a/vistrails/packages/controlflow/init.py b/vistrails/packages/controlflow/init.py
new file mode 100644
index 0000000..9055d59
--- /dev/null
+++ b/vistrails/packages/controlflow/init.py
@@ -0,0 +1,214 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.modules.vistrails_module import Module
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.basic_modules import Boolean, String, Variant, \
+    List, Not, Integer, Float
+from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler
+
+from fold import Fold, FoldWithModule
+from utils import Map, Filter, Sum, And, Or
+from conditional import If, Default
+from products import ElementwiseProduct, Dot, Cross, CartesianProduct
+from order import ExecuteInOrder
+from looping import For, While
+
+
+#################################################################################
+## An useful register function for control modules
+
+def registerControl(module, **kwargs):
+    """This function is used to register the control modules. In this way, all of
+    them will have the same style and shape."""
+
+    reg = get_module_registry()
+    reg.add_module(module,
+                   moduleRightFringe=[(0.0,0.0),(0.25,0.5),(0.0,1.0)],
+                   moduleLeftFringe=[(0.0,0.0),(0.0,1.0)],
+                   **kwargs)
+
+#################################################################################
+
+def initialize(*args,**keywords):
+    reg = get_module_registry()
+
+    registerControl(Fold, abstract=True)
+    registerControl(FoldWithModule, abstract=True)
+    registerControl(Map)
+    registerControl(Filter)
+    registerControl(Sum)
+    registerControl(And)
+    registerControl(Or)
+    registerControl(If)
+    registerControl(Default)
+    registerControl(ExecuteInOrder)
+    registerControl(While)
+    registerControl(For)
+
+    reg.add_output_port(Or, 'Result', (Boolean, ""))
+    reg.add_output_port(And, 'Result', (Boolean, ""))
+
+    reg.add_input_port(Fold, 'InputList', (List, ""))
+    reg.add_output_port(Fold, 'Result', (Variant, ""))
+
+    reg.add_input_port(FoldWithModule, 'FunctionPort', (Module, ""))
+    reg.add_input_port(FoldWithModule, 'InputPort', (List, ""))
+    reg.add_input_port(FoldWithModule, 'OutputPort', (String, ""))
+
+    reg.add_input_port(If, 'Condition', (Boolean, ""))
+    reg.add_input_port(If, 'TruePort', (Module, ""))
+    reg.add_input_port(If, 'FalsePort', (Module, ""))
+    reg.add_input_port(If, 'TrueOutputPorts', (List, ""), optional=True)
+    reg.add_input_port(If, 'FalseOutputPorts', (List, ""), optional=True)
+    reg.add_output_port(If, 'Result', (Variant, ""))
+
+    reg.add_input_port(Default, 'Input', (Variant, ""))
+    reg.add_input_port(Default, 'Default', (Variant, ""))
+    reg.add_output_port(Default, 'Result', (Variant, ""))
+
+    reg.add_module(ElementwiseProduct)
+    reg.add_input_port(ElementwiseProduct, 'List1', (List, ""))
+    reg.add_input_port(ElementwiseProduct, 'List2', (List, ""))
+    reg.add_input_port(ElementwiseProduct, 'NumericalProduct', (Boolean, ""),
+                       optional=True, defaults="['True']")
+    reg.add_output_port(ElementwiseProduct, 'Result', (List, ""))
+
+    reg.add_module(Dot)
+    reg.add_input_port(Dot, 'List1', (List, ""))
+    reg.add_input_port(Dot, 'List2', (List, ""))
+    reg.add_output_port(Dot, 'Result', (List, ""))
+
+    reg.add_module(Cross)
+    reg.add_input_port(Cross, 'List1', (List, ""))
+    reg.add_input_port(Cross, 'List2', (List, ""))
+    reg.add_output_port(Cross, 'Result', (List, ""))
+
+    reg.add_module(CartesianProduct)
+    reg.add_input_port(CartesianProduct, 'List1', (List, ""))
+    reg.add_input_port(CartesianProduct, 'List2', (List, ""))
+    reg.add_input_port(CartesianProduct, 'CombineTuple', (Boolean, ""),
+                       optional=True, defaults="['True']")
+    reg.add_output_port(CartesianProduct, 'Result', (List, ""))
+
+    reg.add_input_port(ExecuteInOrder, 'module1', (Module, ""))
+    reg.add_input_port(ExecuteInOrder, 'module2', (Module, ""))
+
+    reg.add_input_port(While, 'FunctionPort', (Module, ""))
+    reg.add_input_port(While, 'OutputPort', (String, ""),
+                       optional=True, defaults="['self']")
+    reg.add_input_port(While, 'ConditionPort', (String, ""))
+    reg.add_input_port(While, 'StateInputPorts', (List, ""),
+                       optional=True)
+    reg.add_input_port(While, 'StateOutputPorts', (List, ""),
+                       optional=True)
+    reg.add_input_port(While, 'MaxIterations', (Integer, ""),
+                       optional=True, defaults="['20']")
+    reg.add_input_port(While, 'Delay', (Float, ""),
+                       optional=True)
+    reg.add_output_port(While, 'Result', (Variant, ""))
+
+    reg.add_input_port(For, 'FunctionPort', (Module, ""))
+    reg.add_input_port(For, 'InputPort', (String, ""),
+                       optional=True)
+    reg.add_input_port(For, 'OutputPort', (String, ""),
+                       optional=True, defaults="['self']")
+    reg.add_input_port(For, 'LowerBound', (Integer, ""),
+                       optional=True, defaults="['0']")
+    reg.add_input_port(For, 'HigherBound', (Integer, ""))
+    reg.add_output_port(For, 'Result', (List, ""))
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    reg = get_module_registry()
+
+    # Product modules had a CombineTuple port, which has been replaced with
+    # NumericalProduct, with the opposite meaning
+    def product_change_connection(old_conn, new_module):
+        src_module = pipeline.modules[old_conn.source.moduleId]
+        new_x = (src_module.location.x + new_module.location.x) / 2.0
+        new_y = (src_module.location.y + new_module.location.y) / 2.0
+        Not_desc = reg.get_descriptor(Not)
+        not_mod = controller.create_module_from_descriptor(Not_desc,
+                                                           new_x, new_y)
+        conn1 = UpgradeWorkflowHandler.create_new_connection(
+                controller,
+                src_module, old_conn.source,
+                not_mod, 'input')
+        conn2 = UpgradeWorkflowHandler.create_new_connection(
+                controller,
+                not_mod, 'value',
+                new_module, 'NumericalProduct')
+        return [('add', not_mod), ('add', conn1), ('add', conn2)]
+    def product_change_function(function, new_module):
+        parameter = function.parameters[0]
+        if parameter.value():
+            value = 'False'
+        else:
+            value = 'True'
+        return controller.update_function_ops(
+                new_module, 'NumericalProduct',
+                [value])
+
+    module_remap = {
+            'ListOfElements': [
+                # Any 'ListOfElements' before 0.2.2 gets replaced with List
+                (None, '0.2.2', List, {}),
+            ],
+            'Dot': [
+                # The Dot module in 0.2.1 was in fact ElementwiseProduct
+                (None, '0.2.2', ElementwiseProduct, {
+                    'dst_port_remap': {
+                        'List_1': 'List1',
+                        'List_2': 'List2',
+                        'CombineTuple': product_change_connection,
+                    },
+                    'function_remap': {
+                        'CombineTuple': product_change_function,
+                    },
+                }),
+            ],
+            'Cross': [
+                (None, '0.2.2', CartesianProduct, {
+                    'dst_port_remap': {
+                        'List_1': 'List1',
+                        'List_2': 'List2',
+                    },
+                }),
+            ],
+        }
+
+    return UpgradeWorkflowHandler.remap_module(controller,
+                                               module_id,
+                                               pipeline,
+                                               module_remap)
diff --git a/vistrails/packages/controlflow/looping.py b/vistrails/packages/controlflow/looping.py
new file mode 100644
index 0000000..8b945df
--- /dev/null
+++ b/vistrails/packages/controlflow/looping.py
@@ -0,0 +1,241 @@
+import copy
+from itertools import izip
+import time
+
+from vistrails.core.modules.vistrails_module import Module, InvalidOutput, \
+    ModuleSuspended, ModuleError, ModuleConnector
+
+from fold import create_constant
+
+
+class While(Module):
+    """
+    The While Module runs a module over and over until the condition port
+    is false. Then, it returns the result.
+    """
+
+    def __init__(self):
+        Module.__init__(self)
+        self.is_looping_module = True
+
+    def updateUpstream(self):
+        """A modified version of the updateUpstream method."""
+
+        # everything is the same except that we don't update the module on
+        # FunctionPort
+        for port_name, connector_list in self.inputPorts.iteritems():
+            if port_name == 'FunctionPort':
+                for connector in connector_list:
+                    connector.obj.updateUpstream()
+            else:
+                for connector in connector_list:
+                    connector.obj.update()
+        for port_name, connectorList in copy.copy(self.inputPorts.items()):
+            if port_name != 'FunctionPort':
+                for connector in connectorList:
+                    if connector.obj.get_output(connector.port) is \
+                            InvalidOutput:
+                        self.removeInputConnector(port_name, connector)
+
+    def compute(self):
+        name_output = self.getInputFromPort('OutputPort')
+        name_condition = self.forceGetInputFromPort('ConditionPort')
+        name_state_input = self.forceGetInputFromPort('StateInputPorts')
+        name_state_output = self.forceGetInputFromPort('StateOutputPorts')
+        max_iterations = self.getInputFromPort('MaxIterations')
+        delay = self.forceGetInputFromPort('Delay')
+
+        if (name_condition is None and
+                not self.hasInputFromPort('MaxIterations')):
+            raise ModuleError(self,
+                              "Please set MaxIterations or use ConditionPort")
+
+        if name_state_input or name_state_output:
+            if not name_state_input or not name_state_output:
+                raise ModuleError(self,
+                                  "Passing state between iterations requires "
+                                  "BOTH StateInputPorts and StateOutputPorts "
+                                  "to be set")
+            if len(name_state_input) != len(name_state_output):
+                raise ModuleError(self,
+                                  "StateInputPorts and StateOutputPorts need "
+                                  "to have the same number of ports "
+                                  "(got %d and %d)" % (len(name_state_input),
+                                                       len(name_state_output)))
+
+        connectors = self.inputPorts.get('FunctionPort')
+        if len(connectors) != 1:
+            raise ModuleError(self,
+                              "Multiple modules connected on FunctionPort")
+        module = copy.copy(connectors[0].obj)
+
+        state = None
+
+        for i in xrange(max_iterations):
+            if not self.upToDate:
+                module.upToDate = False
+                module.computed = False
+
+                # For logging
+                module.is_looping = True
+                module.first_iteration = i == 0
+                module.last_iteration = False
+                module.loop_iteration = i
+
+                # Set state on input ports
+                if i > 0 and name_state_input:
+                    for value, port in izip(state, name_state_input):
+                        if port in module.inputPorts:
+                            del module.inputPorts[port]
+                        new_connector = ModuleConnector(
+                                create_constant(value),
+                                'value')
+                        module.set_input_port(port, new_connector)
+
+            module.update()
+            if hasattr(module, 'suspended') and module.suspended:
+                raise ModuleSuspended(module._module_suspended)
+
+            if name_condition is not None:
+                if name_condition not in module.outputPorts:
+                    raise ModuleError(
+                            module,
+                            "Invalid output port: %s" % name_condition)
+                if not module.get_output(name_condition):
+                    break
+
+            if delay and i+1 != max_iterations:
+                time.sleep(delay)
+
+            # Get state on output ports
+            if name_state_output:
+                state = [module.get_output(port) for port in name_state_output]
+
+        if name_output not in module.outputPorts:
+            raise ModuleError(module,
+                              "Invalid output port: %s" % name_output)
+        result = module.get_output(name_output)
+        self.setResult('Result', result)
+
+
+class For(Module):
+    """
+    The For Module runs a module with input from a range.
+    """
+
+    def __init__(self):
+        Module.__init__(self)
+        self.is_looping_module = True
+
+    def updateUpstream(self):
+        """A modified version of the updateUpstream method."""
+
+        # everything is the same except that we don't update the module on
+        # FunctionPort
+        for port_name, connector_list in self.inputPorts.iteritems():
+            if port_name == 'FunctionPort':
+                for connector in connector_list:
+                    connector.obj.updateUpstream()
+            else:
+                for connector in connector_list:
+                    connector.obj.update()
+        for port_name, connectorList in copy.copy(self.inputPorts.items()):
+            if port_name != 'FunctionPort':
+                for connector in connectorList:
+                    if connector.obj.get_output(connector.port) is \
+                            InvalidOutput:
+                        self.removeInputConnector(port_name, connector)
+
+    def compute(self):
+        name_output = self.getInputFromPort('OutputPort') # or 'self'
+        name_input = self.forceGetInputFromPort('InputPort') # or None
+        lower_bound = self.getInputFromPort('LowerBound') # or 0
+        higher_bound = self.getInputFromPort('HigherBound') # required
+
+        connectors = self.inputPorts.get('FunctionPort')
+        if len(connectors) != 1:
+            raise ModuleError(self,
+                              "Multiple modules connected on FunctionPort")
+
+        outputs = []
+        suspended = []
+        for i in xrange(lower_bound, higher_bound):
+            module = copy.copy(connectors[0].obj)
+
+            if not self.upToDate:
+                module.upToDate = False
+                module.computed = False
+
+                # For logging
+                module.is_looping = True
+                module.first_iteration = i == lower_bound
+                module.last_iteration = i+1 == higher_bound
+                module.loop_iteration = i - lower_bound
+
+                # Pass iteration number on input port
+                if name_input is not None:
+                    if name_input in module.inputPorts:
+                        del module.inputPorts[name_input]
+                    new_connector = ModuleConnector(
+                            create_constant(i),
+                            'value')
+                    module.set_input_port(name_input, new_connector)
+
+            module.update()
+
+            if hasattr(module, 'suspended') and module.suspended:
+                suspended.append(module._module_suspended)
+                continue
+
+            if name_output not in module.outputPorts:
+                raise ModuleError(module,
+                                  "Invalid output port: %s" % name_output)
+            outputs.append(module.get_output(name_output))
+
+        if suspended:
+            self.suspended = "%d module(s) suspended: %s" % (
+                    len(suspended), suspended[0].msg)
+            self._module_suspended = suspended
+        else:
+            self.setResult('Result', outputs)
+
+
+###############################################################################
+
+import unittest
+
+class TestWhile(unittest.TestCase):
+    def test_pythonsource(self):
+        import urllib2
+        source = ('o = i * 2\n'
+                  "r = \"it's %d!!!\" % o\n"
+                  'go_on = o < 100')
+        source = urllib2.quote(source)
+        from vistrails.tests.utils import execute, intercept_result
+        with intercept_result(While, 'Result') as results:
+            self.assertFalse(execute([
+                    ('PythonSource', 'org.vistrails.vistrails.basic', [
+                        ('source', [('String', source)]),
+                        ('i', [('Integer', '5')]),
+                    ]),
+                    ('While', 'org.vistrails.vistrails.control_flow', [
+                        ('ConditionPort', [('String', 'go_on')]),
+                        ('OutputPort', [('String', 'r')]),
+                        ('StateInputPorts', [('List', "['i']")]),
+                        ('StateOutputPorts', [('List', "['o']")]),
+                    ]),
+                ],
+                [
+                    (0, 'self', 1, 'FunctionPort'),
+                ],
+                add_port_specs=[
+                    (0, 'input', 'i',
+                     'org.vistrails.vistrails.basic:Integer'),
+                    (0, 'output', 'o',
+                     'org.vistrails.vistrails.basic:Integer'),
+                    (0, 'output', 'r',
+                     'org.vistrails.vistrails.basic:String'),
+                    (0, 'output', 'go_on',
+                     'org.vistrails.vistrails.basic:Boolean'),
+                ]))
+        self.assertEqual(results, ["it's 160!!!"])
diff --git a/vistrails/packages/controlflow/order.py b/vistrails/packages/controlflow/order.py
new file mode 100644
index 0000000..0f67878
--- /dev/null
+++ b/vistrails/packages/controlflow/order.py
@@ -0,0 +1,62 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.modules.vistrails_module import Module, InvalidOutput
+import copy
+
+##############################################################################
+## Order Operator
+
+class ExecuteInOrder(Module):
+    """
+    The Order Module alows the user to control which sink of a pair of
+    sinks ought to executed first.  Connect the "self" port of each
+    sink to the corresponding port.  Note that if you have more than
+    two sinks, you can string them together by using a string of Order
+    modules.
+    """
+
+    def updateUpstream(self):
+        # don't do update until compute!
+        pass
+
+    def compute(self):
+        # do updateUpstream as compute, but sort by key
+        for _, connectorList in sorted(self.inputPorts.iteritems()):
+            for connector in connectorList:
+                connector.obj.update()
+        for iport, connectorList in copy.copy(self.inputPorts.items()):
+            for connector in connectorList:
+                if connector.obj.get_output(connector.port) is InvalidOutput:
+                    self.removeInputConnector(iport, connector)
diff --git a/vistrails/packages/controlflow/products.py b/vistrails/packages/controlflow/products.py
new file mode 100644
index 0000000..6bc74b1
--- /dev/null
+++ b/vistrails/packages/controlflow/products.py
@@ -0,0 +1,135 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import itertools
+
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+
+#################################################################################
+## Products
+
+class ElementwiseProduct(Module):
+    """This module does the product of two lists.
+
+    If NumericalProduct is True, this will effectively compute the product of
+    each element, eg:
+        [1, 2, 3] x [3, -3, 1] = [3, -6, 3]
+    Else, it will make tuples, eg:
+        [1, 2, 3] x [3, -3, 1] = [(1, 3), (2, -3), (3, 1)]
+    """
+
+    def compute(self):
+        list1 = self.getInputFromPort('List1')
+        list2 = self.getInputFromPort('List2')
+        if len(list1) != len(list2):
+            raise ModuleError(self, "Both lists must have the same size.")
+
+        numerical = self.getInputFromPort('NumericalProduct')
+        if numerical:
+            result = [a*b for a, b in itertools.izip(list1, list2)]
+        else:
+            result = zip(list1, list2)
+
+        self.setResult('Result', result)
+
+
+class Dot(Module):
+    """This module produces a Dot product between two lists."""
+
+    def compute(self):
+        list1 = self.getInputFromPort("List1")
+        list2 = self.getInputFromPort("List2")
+        if len(list1) != len(list2):
+            raise ModuleError(self, 'Both lists must have the same size.')
+
+        result = sum(a*b for a, b in itertools.izip(list1, list2))
+
+        self.setResult("Result", result)
+
+
+class Cross(Module):
+    """This module produces a Cross product between two 3-D vectors."""
+
+    def compute(self):
+        list1 = self.getInputFromPort("List1")
+        list2 = self.getInputFromPort("List2")
+        if not (len(list1) == len(list2) == 3):
+            raise ModuleError(self, 'Both lists must have size 3.')
+
+        x1, y1, z1 = list1
+        x2, y2, z2 = list2
+
+        result = [y1*z2 - y2*z1,
+                  z1*x2 - z2*x1,
+                  x1*y2 - x2*y1]
+
+        self.setResult("Result", result)
+
+
+class CartesianProduct(Module):
+    """This module does the cartesian product of two lists.
+    """
+
+    def compute(self):
+        list1 = self.getInputFromPort("List1")
+        list2 = self.getInputFromPort("List2")
+        result = []
+        # If CombineTuple is not set or True, existing tuples will be
+        # concatenated instead of put inside a new tuple, eg:
+        #   with CombineTuple (default):
+        #     [(1, 2)], [3, 4] -> [(1, 2, 3), (1, 2, 4)]
+        #   without:
+        #     [(1, 2)], [3, 4] -> [((1, 2), 3), ((1, 2), 4)]
+        if not self.getInputFromPort('CombineTuple'):
+            for i in list1:
+                for j in list2:
+                    tuple_ = (i, j)
+                    result.append(tuple_)
+        else:
+            for i in list1:
+                for j in list2:
+                    if isinstance(i, tuple) and isinstance(j, tuple):
+                        tuple_ = i + j
+                        result.append(tuple_)
+                    elif isinstance(i, tuple) and not isinstance(j, tuple):
+                        tuple_ = i + (j,)
+                        result.append(tuple_)
+                    elif not isinstance(i, tuple) and isinstance(j, tuple):
+                        tuple_ = (i,) + j
+                        result.append(tuple_)
+                    else:
+                        tuple_ = (i, j)
+                        result.append(tuple_)
+
+        self.setResult("Result", result)
diff --git a/vistrails/packages/controlflow/utils.py b/vistrails/packages/controlflow/utils.py
new file mode 100644
index 0000000..8f5b6c8
--- /dev/null
+++ b/vistrails/packages/controlflow/utils.py
@@ -0,0 +1,116 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.modules.vistrails_module import ModuleError
+from fold import Fold, FoldWithModule
+
+#################################################################################
+## Some useful loop structures
+
+class Map(FoldWithModule):
+    """A Map module, that just appends the results in a list."""
+
+    def setInitialValue(self):
+        """Defining the initial value..."""
+
+        self.initialValue = []
+
+    def operation(self):
+        """Defining the operation..."""
+
+        self.partialResult.append(self.elementResult)
+
+
+class Filter(FoldWithModule):
+    """A Filter module, that returns in a list only the results that satisfy a
+    condition."""
+
+    def setInitialValue(self):
+        """Defining the initial value..."""
+
+        self.initialValue = []
+
+    def operation(self):
+        """Defining the operation..."""
+
+        if not isinstance(self.elementResult, bool):
+            raise ModuleError(self,'The function applied to the elements of the\
+list must return a boolean result.')
+
+        if self.elementResult:
+            self.partialResult.append(self.element)
+
+
+class Sum(Fold):
+    """A Sum module, that computes the sum of the elements in a list."""
+
+    def setInitialValue(self):
+        """Defining the initial value..."""
+
+        self.initialValue = 0
+
+    def operation(self):
+        """Defining the operation..."""
+
+        self.partialResult += self.element
+
+
+class And(Fold):
+    """An And module, that computes the And result among the elements
+    in a list."""
+
+    def setInitialValue(self):
+        """Defining the initial value..."""
+
+        self.initialValue = True
+
+    def operation(self):
+        """Defining the operation..."""
+
+        self.partialResult = self.partialResult and bool(self.element)
+
+
+class Or(Fold):
+    """An Or module, that computes the Or result among the elements
+    in a list."""
+
+    def setInitialValue(self):
+        """Defining the initial value..."""
+
+        self.initialValue = False
+
+    def operation(self):
+        """Defining the operation..."""
+
+        self.partialResult = self.partialResult or self.element
diff --git a/vistrails/packages/dialogs/__init__.py b/vistrails/packages/dialogs/__init__.py
new file mode 100644
index 0000000..16057bd
--- /dev/null
+++ b/vistrails/packages/dialogs/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""dialogs provides modules for user-based interaction on execution.
+Users can then enter file names, numbers, strings, etc."""
+
+identifier = 'org.vistrails.vistrails.dialogs'
+name = 'Dialogs'
+version = '0.9.1'
+old_identifiers = ['edu.utah.sci.vistrails.dialogs']
diff --git a/vistrails/packages/dialogs/init.py b/vistrails/packages/dialogs/init.py
new file mode 100644
index 0000000..53c4e9d
--- /dev/null
+++ b/vistrails/packages/dialogs/init.py
@@ -0,0 +1,110 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+import vistrails.core.modules
+import vistrails.core.modules.basic_modules
+import vistrails.core.modules.module_registry
+import vistrails.core.system
+import vistrails.gui.application
+from PyQt4 import QtCore, QtGui
+
+##############################################################################
+
+class Dialog(Module):
+    pass
+
+class TextDialog(Dialog):
+    password = False
+
+    def __init__(self, *args, **kwargs):
+        super(TextDialog,self).__init__(*args, **kwargs)
+        self.cacheable_dialog = False
+
+    def is_cacheable(self):
+        return self.cacheable_dialog
+
+    def compute(self):
+        if self.hasInputFromPort('title'):
+            title = self.getInputFromPort('title')
+        else:
+            title = 'VisTrails Dialog'
+        if self.hasInputFromPort('label'):
+            label = self.getInputFromPort('label')
+        else:
+            label = ''
+            if self.password:
+                label = 'Password'
+
+        if self.hasInputFromPort('default'):
+            default = self.getInputFromPort('default')
+        else:
+            default = ''
+            
+        if self.hasInputFromPort('cacheable') and self.getInputFromPort('cacheable'):
+            self.cacheable_dialog = True
+        else:
+            self.cacheable_dialog = False
+
+        mode =  QtGui.QLineEdit.Normal
+        if self.password:
+            mode = QtGui.QLineEdit.Password
+
+        (result, ok) = QtGui.QInputDialog.getText(None, title, label,
+                                                  mode,
+                                                  default)
+        if not ok:
+            raise ModuleError(self, "Canceled")
+        self.setResult('result', str(result))
+
+
+class PasswordDialog(TextDialog):
+    password = True
+
+
+##############################################################################
+
+def initialize(*args, **keywords):
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    basic = vistrails.core.modules.basic_modules
+    reg.add_module(Dialog, abstract=True)
+    reg.add_module(TextDialog)
+
+    reg.add_input_port(TextDialog, "title", basic.String)
+    reg.add_input_port(TextDialog, "label", basic.String)
+    reg.add_input_port(TextDialog, "default", basic.String)
+    reg.add_input_port(TextDialog, "cacheable", basic.Boolean)
+    reg.add_output_port(TextDialog, "result", basic.String)
+
+    reg.add_module(PasswordDialog)
diff --git a/vistrails/packages/matplotlib/README b/vistrails/packages/matplotlib/README
new file mode 100644
index 0000000..e691d7a
--- /dev/null
+++ b/vistrails/packages/matplotlib/README
@@ -0,0 +1,94 @@
+This version of the matplotlib package seeks to make the features much
+more accessible in VisTrails.  Previous versions required users to
+type code to generate figures, and this usually required reading
+external documentation.  Because matplotlib has no standard way to
+determine all method and parameter specification automatically.  We
+can, however, parse method declarations and the docutils documentation
+to infer many of the input types.  While this generates much of the
+package specification, there are many pieces that are unknown without
+checking the documentation and/or code manually.  To allow both
+automated generation and manual fixes to work, we use a multi-step process:
+
+(1) Automated Generation: based on documentation, method
+specifications, and heuristics, generate module and port
+specifications in XML.
+
+(2?) If a diff of previous edits exists (see step 3 & 4), apply it to
+the automated output.
+
+(3) Manual Fixes: Users then can manually edit the XML to fix and add
+extra information.  They can also specify python code in the mixins.py
+file; this is nicer for editing than doing this in XML.
+
+(4) Difference Computation: Find and store the differences in the XML
+tree between the automated specs and the manual fixes.  These
+differences are used in step (2).
+
+(5) Python Code Generation: Generate the VisTrails python wrapper code
+from the XML.
+
+This process is iterative as parsing heuristics may be updated and
+many manual fixes may be required.  The update.py script wraps this
+entire process.
+
+== Automated Generation ==
+
+The automated generation scripts consist of a few techniques.  First,
+for plotting functions, we can parse the function specification using
+python's inspect module, extracting argument names and defaults.  For
+artists (lines, patches, rectangles), the matplotlib authors have
+tried to enforce property getters and setters, and they also have
+documentation standards where developers specify an "ACCEPTS:" clause
+which specifies what type of arguments the setters take.  The
+ArtistInspector is tasked to grab this information.  Second, the
+documentation is in docutils format which means we can run it through
+the docutils parser to find tables and definition lists which can be
+translated to variables and translation dictionaries (e.g. we can show
+a user "upper center" but translate it to 9 for matplotlib).  In
+addition, we can search for certain keywords ("arguments") to find
+definition lists that likely correspond to ports.  Finally, we can
+parse the call signatures which are sometimes present in the
+documentation using python's ast module.
+
+== XML Specification ==
+
+The most important piece in updating the specs is understanding the
+XML serialization.  This serialization is a list of module specs which
+in turn have input and output port specs.  Input port specs may have
+any number of alternate specs which represent alternative types for a
+single input argument; for example, the box() method's width may be a
+single scalar or a sequence of scalars.  Output port specs are usually
+used to track internal outputs that permit customization; **they are
+not necessarily (nor often) associated with an actual output port**.
+Instead, if a boxplot command produces a dictionary of outputs (each a
+sequence of lines), the output port specs can specify how each artist
+may be customized (colors).  This is usually done with an
+MplProperties subclass; the user adds the properties module as an
+input and the automated compute() method sets those properties on the
+artist objects output.
+
+== Mixin Code ==
+
+Users may specify blocks for the init, compute_before, compute_inner,
+and compute_after methods.  This code is **copied** when the template
+is generated; mixins.py **is not imported** when the package is being
+used.
+
+== Shortcuts & Keywords ==
+
+-- When specifying alternate input port specs, users need only provide
+   the port_type field; everything else can be inferred from the
+   parent port spec.
+
+-- The output_type for a ModuleSpec should be one of "object",
+   "tuple", or "dict" if there is an output returned.  Then, the
+   property_key for each output spec should be an integer for a tuple
+   and the key value for a dictionary.
+
+-- When specifying output port specs, name and compute_name are
+   defaulted using the arg setting
+
+-- The "__property__" output_type on an output port spec specifies
+   that this port is being used to identify an output of the plotting
+   command that can be customized according to the property_type
+   field.
diff --git a/vistrails/packages/matplotlib/__init__.py b/vistrails/packages/matplotlib/__init__.py
new file mode 100644
index 0000000..f432dda
--- /dev/null
+++ b/vistrails/packages/matplotlib/__init__.py
@@ -0,0 +1,63 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Matplotlib package for VisTrails.
+
+This package wrap Matplotlib to provide a plotting tool for
+VisTrails. We are going to use the 'Qt4Agg' backend of the library.
+
+"""
+
+from identifiers import *
+
+def package_dependencies():
+    import vistrails.core.packagemanager
+    manager = vistrails.core.packagemanager.get_package_manager()
+    if manager.has_package('org.vistrails.vistrails.spreadsheet'):
+        return ['org.vistrails.vistrails.spreadsheet']
+    else:
+        return []
+
+def package_requirements():
+    from vistrails.core.requirements import require_python_module
+    require_python_module('numpy', {
+            'pip': 'numpy',
+            'linux-debian': 'python-numpy',
+            'linux-ubuntu': 'python-numpy',
+            'linux-fedora': 'numpy'})
+    mpl_dict = {'pip': 'matplotlib',
+                'linux-debian': 'python-matplotlib',
+                'linux-ubuntu': 'python-matplotlib',
+                'linux-fedora': 'python-matplotlib'}
+    require_python_module('matplotlib', mpl_dict)
+    require_python_module('pylab', mpl_dict)
diff --git a/vistrails/packages/matplotlib/artists.py b/vistrails/packages/matplotlib/artists.py
new file mode 100644
index 0000000..f167527
--- /dev/null
+++ b/vistrails/packages/matplotlib/artists.py
@@ -0,0 +1,3800 @@
+from vistrails.core.modules.vistrails_module import Module
+from bases import MplProperties
+import matplotlib.artist
+import matplotlib.cbook
+
+
+
+
+
+
+def translate_color(c):
+    return c.tuple
+
+def translate_MplLine2DProperties_marker(val):
+    translate_dict = {'caretright': 5, 'star': '*', 'point': '.', 'mathtext': '$...$', 'triangle_right': '>', 'tickup': 2, 'hexagon1': 'h', 'plus': '+', 'hline': '_', 'vline': '|', 'tickdown': 3, 'nothing': ' ', 'caretup': 6, 'caretleft': 4, 'pentagon': 'p', 'tri_left': '3', 'tickleft': 0, 'tickright': 1, 'tri_down': '1', 'thin_diamond': 'd', 'diamond': 'D', 'caretdown': 7, 'hexagon2': 'H', 'tri_up': '2', 'square': 's', 'x': 'x', 'triangle_down': 'v', 'triangle_up': '^', 'octagon': '8',  [...]
+    return translate_dict[val]
+def translate_MplLine2DProperties_linestyle(val):
+    translate_dict = {'solid': '-', 'dashed': '--', 'dash_dot': '-.', 'dotted': ':', 'draw nothing': ''}
+    return translate_dict[val]
+def translate_MplAxesProperties_anchor(val):
+    translate_dict = {'right': 'E', 'Center': 'C', 'bottom right': 'SE', 'top right': 'NE', 'bottom': 'S', 'top left': 'NW', 'top': 'N', 'bottom left': 'SW', 'left': 'W'}
+    return translate_dict[val]
+
+class MplArtistProperties(MplProperties):
+    """
+    Abstract base class for someone who renders into a
+    :class:`FigureCanvas`.
+    
+    """
+    _input_ports = [
+              ("picker", "basic:String",
+                {'optional': True, 'docstring': "Set the epsilon for picking used by this artist\n\npicker can be one of the following:\n\nNone: picking is disabled for this artist (default)\n\nA boolean: if True then picking will be enabled and the artist will fire a pick event if the mouse event is over the artist\n\nA float: if picker is a number it is interpreted as an epsilon tolerance in points and the artist will fire off an event if it's data is within epsilon of the mouse event. [...]
+              ("contains", "basic:String",
+                {'optional': True, 'docstring': 'Replace the contains test used by this artist. The new picker should be a callable function which determines whether the artist is hit by the mouse event:\n\nhit, props = picker(artist, mouseevent)\n\nIf the mouse event is over the artist, return hit = True and props is a dictionary of properties you want returned with the contains test.'}),
+              ("clip_on", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether artist uses clipping.'}),
+              ("agg_filter", "basic:String",
+                {'optional': True, 'docstring': 'set agg_filter fuction.'}),
+              ("visible", "basic:Boolean",
+                {'optional': True, 'docstring': "Set the artist's visiblity."}),
+              ("url", "basic:String",
+                {'optional': True, 'docstring': 'Sets the url for the artist'}),
+              ("transform", "basic:String",
+                {'optional': True, 'docstring': 'Set the :class:`~matplotlib.transforms.Transform` instance used by this artist.'}),
+              ("axes", "basic:String",
+                {'optional': True, 'docstring': 'Set the :class:`~matplotlib.axes.Axes` instance in which the artist resides, if any.'}),
+              ("clip_box", "basic:String",
+                {'optional': True, 'docstring': "Set the artist's clip :class:`~matplotlib.transforms.Bbox`."}),
+              ("clip_path", "basic:String",
+                {'optional': True, 'docstring': "Set the artist's clip path, which may be:\n\na :class:`~matplotlib.patches.Patch` (or subclass) instance\n\n\n\nNone, to remove the clipping path\n\nFor efficiency, if the path happens to be an axis-aligned rectangle, this method will set the clipping box to the corresponding rectangle and set the clipping path to None."}),
+              ("lod", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set Level of Detail on or off.  If on, the artists may examine things like the pixel width of the axes and draw a subset of their contents accordingly'}),
+              ("label", "basic:String",
+                {'optional': True, 'docstring': 'Set the label to s for auto legend.'}),
+              ("rasterized", "basic:Boolean",
+                {'optional': True, 'docstring': "Force rasterized (bitmap) drawing in vector backend output.\n\nDefaults to None, which implies the backend's default behavior"}),
+              ("gid", "basic:String",
+                {'optional': True, 'docstring': 'Sets the (group) id for the artist'}),
+              ("zorder", "basic:String",
+                {'optional': True, 'docstring': 'Set the zorder for the artist.  Artists with lower zorder values are drawn first.'}),
+              ("snap", "basic:String",
+                {'optional': True, 'docstring': 'Sets the snap setting which may be:\n\nTrue: snap vertices to the nearest pixel center\n\nFalse: leave vertices as-is\n\nNone: (auto) If the path contains only rectilinear line segments, round to the nearest pixel center\n\nOnly supported by the Agg and MacOSX backends.'}),
+              ("alpha", "basic:Float",
+                {'optional': True, 'docstring': 'Set the alpha value used for blending - not supported on all backends.'}),
+              ("animated", "basic:Boolean",
+                {'optional': True, 'docstring': "Set the artist's animation state."}),
+              ("figure", "basic:String",
+                {'optional': True, 'docstring': 'Set the :class:`~matplotlib.figure.Figure` instance the artist belongs to.'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplArtistProperties)")]
+
+    def __init__(self):
+        MplProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplProperties.compute(self)
+        if self.hasInputFromPort('picker'):
+            self.props['picker'] = self.getInputFromPort('picker')
+        if self.hasInputFromPort('contains'):
+            self.props['contains'] = self.getInputFromPort('contains')
+        if self.hasInputFromPort('clip_on'):
+            self.props['clip_on'] = self.getInputFromPort('clip_on')
+        if self.hasInputFromPort('agg_filter'):
+            self.props['agg_filter'] = self.getInputFromPort('agg_filter')
+        if self.hasInputFromPort('visible'):
+            self.props['visible'] = self.getInputFromPort('visible')
+        if self.hasInputFromPort('url'):
+            self.props['url'] = self.getInputFromPort('url')
+        if self.hasInputFromPort('transform'):
+            self.props['transform'] = self.getInputFromPort('transform')
+        if self.hasInputFromPort('axes'):
+            self.props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('clip_box'):
+            self.props['clip_box'] = self.getInputFromPort('clip_box')
+        if self.hasInputFromPort('clip_path'):
+            self.props['clip_path'] = self.getInputFromPort('clip_path')
+        if self.hasInputFromPort('lod'):
+            self.props['lod'] = self.getInputFromPort('lod')
+        if self.hasInputFromPort('label'):
+            self.props['label'] = self.getInputFromPort('label')
+        if self.hasInputFromPort('rasterized'):
+            self.props['rasterized'] = self.getInputFromPort('rasterized')
+        if self.hasInputFromPort('gid'):
+            self.props['gid'] = self.getInputFromPort('gid')
+        if self.hasInputFromPort('zorder'):
+            self.props['zorder'] = self.getInputFromPort('zorder')
+        if self.hasInputFromPort('snap'):
+            self.props['snap'] = self.getInputFromPort('snap')
+        if self.hasInputFromPort('alpha'):
+            self.props['alpha'] = self.getInputFromPort('alpha')
+        if self.hasInputFromPort('animated'):
+            self.props['animated'] = self.getInputFromPort('animated')
+        if self.hasInputFromPort('figure'):
+            self.props['figure'] = self.getInputFromPort('figure')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class Mpl_AxesImageBaseProperties(MplArtistProperties):
+    """None
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+                {'optional': True}),
+              ("resample", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether or not image resampling is used'}),
+              ("norm", "basic:String",
+                {'optional': True}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("filternorm", "basic:String",
+                {'optional': True, 'docstring': 'Set whether the resize filter norms the weights -- see help for imshow'}),
+              ("ax", "basic:String",
+                {'optional': True}),
+              ("alpha", "basic:Float",
+                {'optional': True, 'docstring': 'Set the alpha value used for blending - not supported on all backends'}),
+              ("array", "basic:String",
+                {'optional': True, 'docstring': 'Retained for backwards compatibility - use set_data instead'}),
+              ("data", "basic:String",
+                {'optional': True, 'docstring': 'Set the image array'}),
+              ("filterrad", "basic:Float",
+                {'optional': True, 'docstring': 'Set the resize filter radius only applicable to some interpolation schemes -- see help for imshow'}),
+              ("interpolation", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "Set the interpolation method the image uses when resizing.\n\nif None, use a value from rc setting. If 'none', the image is shown as is without interpolating. 'none' is only supported in agg, ps and pdf backends and will fall back to 'nearest' mode for other backends.", 'values': "[['nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitch [...]
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(Mpl_AxesImageBaseProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('origin'):
+            self.constructor_props['origin'] = self.getInputFromPort('origin')
+        if self.hasInputFromPort('resample'):
+            self.props['resample'] = self.getInputFromPort('resample')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('filternorm'):
+            self.props['filternorm'] = self.getInputFromPort('filternorm')
+        if self.hasInputFromPort('ax'):
+            self.constructor_props['ax'] = self.getInputFromPort('ax')
+        if self.hasInputFromPort('alpha'):
+            self.props['alpha'] = self.getInputFromPort('alpha')
+        if self.hasInputFromPort('array'):
+            self.props['array'] = self.getInputFromPort('array')
+        if self.hasInputFromPort('data'):
+            self.props['data'] = self.getInputFromPort('data')
+        if self.hasInputFromPort('filterrad'):
+            self.props['filterrad'] = self.getInputFromPort('filterrad')
+        if self.hasInputFromPort('interpolation'):
+            self.props['interpolation'] = self.getInputFromPort('interpolation')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplAxesImageProperties(Mpl_AxesImageBaseProperties):
+    """None
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+                {'optional': True}),
+              ("resample", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("norm", "basic:String",
+                {'optional': True}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("filterrad", "basic:Float",
+                {'optional': True, 'defaults': "['4.0']"}),
+              ("extent", "basic:String",
+                {'optional': True, 'docstring': 'extent is data axes (left, right, bottom, top) for making image plots\n\nThis 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.'}),
+              ("ax", "basic:String",
+                {'optional': True}),
+              ("filternorm", "basic:Integer",
+                {'optional': True, 'defaults': "['1']"}),
+              ("interpolation", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplAxesImageProperties)")]
+
+    def __init__(self):
+        Mpl_AxesImageBaseProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        Mpl_AxesImageBaseProperties.compute(self)
+        if self.hasInputFromPort('origin'):
+            self.constructor_props['origin'] = self.getInputFromPort('origin')
+        if self.hasInputFromPort('resample'):
+            self.constructor_props['resample'] = self.getInputFromPort('resample')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('filterrad'):
+            self.constructor_props['filterrad'] = self.getInputFromPort('filterrad')
+        if self.hasInputFromPort('extent'):
+            self.props['extent'] = self.getInputFromPort('extent')
+        if self.hasInputFromPort('ax'):
+            self.constructor_props['ax'] = self.getInputFromPort('ax')
+        if self.hasInputFromPort('filternorm'):
+            self.constructor_props['filternorm'] = self.getInputFromPort('filternorm')
+        if self.hasInputFromPort('interpolation'):
+            self.constructor_props['interpolation'] = self.getInputFromPort('interpolation')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplNonUniformImageProperties(MplAxesImageProperties):
+    """None
+    """
+    _input_ports = [
+              ("norm", "basic:String",
+                {'optional': True}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("filternorm", "basic:String",
+                {'optional': True}),
+              ("ax", "basic:String",
+                {'optional': True}),
+              ("array", "basic:String",
+                {'optional': True}),
+              ("data", "basic:String",
+                {'optional': True, 'docstring': 'Set the grid for the pixel centers, and the pixel values.'}),
+              ("filterrad", "basic:String",
+                {'optional': True}),
+              ("interpolation", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplNonUniformImageProperties)")]
+
+    def __init__(self):
+        MplAxesImageProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplAxesImageProperties.compute(self)
+        if self.hasInputFromPort('norm'):
+            self.props['norm'] = self.getInputFromPort('norm')
+        if self.hasInputFromPort('cmap'):
+            self.props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('filternorm'):
+            self.props['filternorm'] = self.getInputFromPort('filternorm')
+        if self.hasInputFromPort('ax'):
+            self.constructor_props['ax'] = self.getInputFromPort('ax')
+        if self.hasInputFromPort('array'):
+            self.props['array'] = self.getInputFromPort('array')
+        if self.hasInputFromPort('data'):
+            self.props['data'] = self.getInputFromPort('data')
+        if self.hasInputFromPort('filterrad'):
+            self.props['filterrad'] = self.getInputFromPort('filterrad')
+        if self.hasInputFromPort('interpolation'):
+            self.props['interpolation'] = self.getInputFromPort('interpolation')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplBboxImageProperties(Mpl_AxesImageBaseProperties):
+    """The Image class whose size is determined by the given bbox.
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+                {'optional': True}),
+              ("interp_at_native", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("resample", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("filternorm", "basic:Integer",
+                {'optional': True, 'defaults': "['1']"}),
+              ("norm", "basic:String",
+                {'optional': True}),
+              ("interpolation", "basic:String",
+                {'optional': True}),
+              ("filterrad", "basic:Float",
+                {'optional': True, 'defaults': "['4.0']"}),
+              ("bbox", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplBboxImageProperties)")]
+
+    def __init__(self):
+        Mpl_AxesImageBaseProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        Mpl_AxesImageBaseProperties.compute(self)
+        if self.hasInputFromPort('origin'):
+            self.constructor_props['origin'] = self.getInputFromPort('origin')
+        if self.hasInputFromPort('interp_at_native'):
+            self.constructor_props['interp_at_native'] = self.getInputFromPort('interp_at_native')
+        if self.hasInputFromPort('resample'):
+            self.constructor_props['resample'] = self.getInputFromPort('resample')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('filternorm'):
+            self.constructor_props['filternorm'] = self.getInputFromPort('filternorm')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+        if self.hasInputFromPort('interpolation'):
+            self.constructor_props['interpolation'] = self.getInputFromPort('interpolation')
+        if self.hasInputFromPort('filterrad'):
+            self.constructor_props['filterrad'] = self.getInputFromPort('filterrad')
+        if self.hasInputFromPort('bbox'):
+            self.constructor_props['bbox'] = self.getInputFromPort('bbox')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPcolorImageProperties(MplArtistProperties):
+    """
+    Make a pcolor-style plot with an irregular rectangular grid.
+
+    This uses a variation of the original irregular image code,
+    and it is used by pcolorfast for the corresponding grid type.
+    
+    """
+    _input_ports = [
+              ("A", "basic:String",
+                {'optional': True}),
+              ("ax", "basic:String",
+                {'optional': True}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("x", "basic:String",
+                {'optional': True}),
+              ("y", "basic:String",
+                {'optional': True}),
+              ("alpha", "basic:Float",
+                {'optional': True, 'docstring': 'Set the alpha value used for blending - not supported on all backends'}),
+              ("array", "basic:String",
+                {'optional': True}),
+              ("data", "basic:String",
+                {'optional': True}),
+              ("norm", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPcolorImageProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('A'):
+            self.constructor_props['A'] = self.getInputFromPort('A')
+        if self.hasInputFromPort('ax'):
+            self.constructor_props['ax'] = self.getInputFromPort('ax')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('x'):
+            self.constructor_props['x'] = self.getInputFromPort('x')
+        if self.hasInputFromPort('y'):
+            self.constructor_props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('alpha'):
+            self.props['alpha'] = self.getInputFromPort('alpha')
+        if self.hasInputFromPort('array'):
+            self.props['array'] = self.getInputFromPort('array')
+        if self.hasInputFromPort('data'):
+            self.props['data'] = self.getInputFromPort('data')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplFigureImageProperties(MplArtistProperties):
+    """None
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+                {'optional': True}),
+              ("offsetx", "basic:Integer",
+                {'optional': True, 'defaults': "['0']"}),
+              ("offsety", "basic:Integer",
+                {'optional': True, 'defaults': "['0']"}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("fig", "basic:String",
+                {'optional': True}),
+              ("array", "basic:String",
+                {'optional': True, 'docstring': 'Deprecated; use set_data for consistency with other image types.'}),
+              ("data", "basic:String",
+                {'optional': True, 'docstring': 'Set the image array.'}),
+              ("norm", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplFigureImageProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('origin'):
+            self.constructor_props['origin'] = self.getInputFromPort('origin')
+        if self.hasInputFromPort('offsetx'):
+            self.constructor_props['offsetx'] = self.getInputFromPort('offsetx')
+        if self.hasInputFromPort('offsety'):
+            self.constructor_props['offsety'] = self.getInputFromPort('offsety')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('fig'):
+            self.constructor_props['fig'] = self.getInputFromPort('fig')
+        if self.hasInputFromPort('array'):
+            self.props['array'] = self.getInputFromPort('array')
+        if self.hasInputFromPort('data'):
+            self.props['data'] = self.getInputFromPort('data')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplCollectionProperties(MplArtistProperties):
+    """
+    Base class for Collections.  Must be subclassed to be usable.
+
+    All properties in a collection must be sequences or scalars;
+    if scalars, they will be converted to sequences.  The
+    property of the ith element of the collection is::
+
+      prop[i % len(props)]
+
+    Keyword arguments and default values:
+
+        * *edgecolors*: None
+        * *facecolors*: None
+        * *linewidths*: None
+        * *antialiaseds*: None
+        * *offsets*: None
+        * *transOffset*: transforms.IdentityTransform()
+        * *offset_position*: 'screen' (default) or 'data'
+        * *norm*: None (optional for
+          :class:`matplotlib.cm.ScalarMappable`)
+        * *cmap*: None (optional for
+          :class:`matplotlib.cm.ScalarMappable`)
+        * *hatch*: None
+
+    *offsets* and *transOffset* are used to translate the patch after
+    rendering (default no offsets).  If offset_position is 'screen'
+    (default) the offset is applied after the master transform has
+    been applied, that is, the offsets are in screen coordinates.  If
+    offset_position is 'data', the offset is applied before the master
+    transform, i.e., the offsets are in data coordinates.
+
+    If any of *edgecolors*, *facecolors*, *linewidths*, *antialiaseds*
+    are None, they default to their :data:`matplotlib.rcParams` patch
+    setting, in sequence form.
+
+    The use of :class:`~matplotlib.cm.ScalarMappable` is optional.  If
+    the :class:`~matplotlib.cm.ScalarMappable` matrix _A is not None
+    (ie a call to set_array has been made), at draw time a call to
+    scalar mappable will be made to set the face colors.
+    
+    """
+    _input_ports = [
+              ("transOffset", "basic:String",
+                {'optional': True}),
+              ("edgecolor", "basic:List",
+                {'optional': True, 'docstring': "Set the edgecolor(s) of the collection. c can be a matplotlib color arg (all patches have same color), or a sequence of rgba tuples; if it is a sequence the patches will cycle through the sequence.\n\nIf c is 'face', the edge color will always be the same as the face color.  If it is 'none', the patch boundary will not be drawn."}),
+              ("offset_position", "basic:String",
+                {'optional': True, 'docstring': "Set how offsets are applied.  If offset_position is 'screen' (default) the offset is applied after the master transform has been applied, that is, the offsets are in screen coordinates. If offset_position is 'data', the offset is applied before the master transform, i.e., the offsets are in data coordinates."}),
+              ("edgecolors", "basic:String",
+                {'optional': True}),
+              ("facecolor", "basic:List",
+                {'optional': True, 'docstring': "Set the facecolor(s) of the collection.  c can be a matplotlib color arg (all patches have same color), or a sequence of rgba tuples; if it is a sequence the patches will cycle through the sequence.\n\nIf c is 'none', the patch will not be filled."}),
+              ("linestyles", "basic:String",
+                {'optional': True, 'defaults': "['solid']"}),
+              ("offsetsSequence", "basic:List",
+                {'optional': True, 'docstring': 'Set the offsets for the collection.  offsets can be a scalar or a sequence.'}),
+              ("offsetsScalar", "basic:Float",
+               {'docstring': 'Set the offsets for the collection.  offsets can be a scalar or a sequence.', 'optional': True}),
+              ("color", "basic:List",
+                {'optional': True, 'docstring': 'Set both the edgecolor and the facecolor. .. seealso:\n\n:meth:`set_facecolor`, :meth:`set_edgecolor`    For setting the edge or face color individually.'}),
+              ("pickradius", "basic:String",
+                {'optional': True}),
+              ("antialiaseds", "basic:String",
+                {'optional': True}),
+              ("linewidths", "basic:String",
+                {'optional': True}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("antialiasedSequence", "basic:List",
+                {'optional': True, 'docstring': 'Set the antialiasing state for rendering.'}),
+              ("antialiasedScalar", "basic:Boolean",
+               {'docstring': 'Set the antialiasing state for rendering.', 'optional': True}),
+              ("urls", "basic:String",
+                {'optional': True}),
+              ("hatch", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the hatching pattern\n\nhatch can be one of:\n\n/   - diagonal hatching \\   - back diagonal |   - vertical -   - horizontal +   - crossed x   - crossed diagonal o   - small circle O   - large circle .   - dots *   - stars\n\nLetters can be combined, in which case all the specified hatchings are done.  If same letter repeats, it increases the density of hatching of that pattern.\n\nHatching is supported in the PostScript, PDF, [...]
+              ("alpha", "basic:Float",
+                {'optional': True, 'docstring': 'Set the alpha tranparencies of the collection.  alpha must be a float or None.'}),
+              ("paths", "basic:String",
+                {'optional': True}),
+              ("linewidthSequence", "basic:List",
+                {'optional': True, 'docstring': 'Set the linewidth(s) for the collection.  lw can be a scalar or a sequence; if it is a sequence the patches will cycle through the sequence'}),
+              ("linewidthScalar", "basic:Float",
+               {'docstring': 'Set the linewidth(s) for the collection.  lw can be a scalar or a sequence; if it is a sequence the patches will cycle through the sequence', 'optional': True}),
+              ("linestyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the linestyle(s) for the collection.', 'values': "[['solid', ('dashed', 'dashdot', 'dotted'), '(offset, on-off-dash-seq)']]", 'optional': True}),
+              ("facecolors", "basic:String",
+                {'optional': True}),
+              ("norm", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplCollectionProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('transOffset'):
+            self.constructor_props['transOffset'] = self.getInputFromPort('transOffset')
+        if self.hasInputFromPort('edgecolor'):
+            self.props['edgecolor'] = self.getInputFromPort('edgecolor')
+        if self.hasInputFromPort('offset_position'):
+            self.props['offset_position'] = self.getInputFromPort('offset_position')
+        if self.hasInputFromPort('edgecolors'):
+            self.constructor_props['edgecolors'] = self.getInputFromPort('edgecolors')
+        if self.hasInputFromPort('facecolor'):
+            self.props['facecolor'] = self.getInputFromPort('facecolor')
+        if self.hasInputFromPort('linestyles'):
+            self.constructor_props['linestyles'] = self.getInputFromPort('linestyles')
+        if self.hasInputFromPort('offsetsSequence'):
+            self.props['offsets'] = self.getInputFromPort('offsetsSequence')
+        elif self.hasInputFromPort('offsetsScalar'):
+            self.props['offsets'] = self.getInputFromPort('offsetsScalar')
+        if self.hasInputFromPort('color'):
+            self.props['color'] = self.getInputFromPort('color')
+        if self.hasInputFromPort('pickradius'):
+            self.props['pickradius'] = self.getInputFromPort('pickradius')
+        if self.hasInputFromPort('antialiaseds'):
+            self.constructor_props['antialiaseds'] = self.getInputFromPort('antialiaseds')
+        if self.hasInputFromPort('linewidths'):
+            self.constructor_props['linewidths'] = self.getInputFromPort('linewidths')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('antialiasedSequence'):
+            self.props['antialiased'] = self.getInputFromPort('antialiasedSequence')
+        elif self.hasInputFromPort('antialiasedScalar'):
+            self.props['antialiased'] = self.getInputFromPort('antialiasedScalar')
+        if self.hasInputFromPort('urls'):
+            self.props['urls'] = self.getInputFromPort('urls')
+        if self.hasInputFromPort('hatch'):
+            self.props['hatch'] = self.getInputFromPort('hatch')
+        if self.hasInputFromPort('alpha'):
+            self.props['alpha'] = self.getInputFromPort('alpha')
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+        if self.hasInputFromPort('linewidthSequence'):
+            self.props['linewidth'] = self.getInputFromPort('linewidthSequence')
+        elif self.hasInputFromPort('linewidthScalar'):
+            self.props['linewidth'] = self.getInputFromPort('linewidthScalar')
+        if self.hasInputFromPort('linestyle'):
+            self.props['linestyle'] = self.getInputFromPort('linestyle')
+        if self.hasInputFromPort('facecolors'):
+            self.constructor_props['facecolors'] = self.getInputFromPort('facecolors')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPathCollectionProperties(MplCollectionProperties):
+    """
+    This is the most basic :class:`Collection` subclass.
+    
+    """
+    _input_ports = [
+              ("paths", "basic:String",
+                {'optional': True}),
+              ("sizes", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPathCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+        if self.hasInputFromPort('sizes'):
+            self.constructor_props['sizes'] = self.getInputFromPort('sizes')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPolyCollectionProperties(MplCollectionProperties):
+    """None
+    """
+    _input_ports = [
+              ("paths", "basic:String",
+                {'optional': True, 'docstring': 'This allows one to delay initialization of the vertices.'}),
+              ("verts", "basic:String",
+                {'optional': True, 'docstring': 'This allows one to delay initialization of the vertices.'}),
+              ("closed", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("sizes", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPolyCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+        if self.hasInputFromPort('verts'):
+            self.props['verts'] = self.getInputFromPort('verts')
+        if self.hasInputFromPort('closed'):
+            self.constructor_props['closed'] = self.getInputFromPort('closed')
+        if self.hasInputFromPort('sizes'):
+            self.constructor_props['sizes'] = self.getInputFromPort('sizes')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplBrokenBarHCollectionProperties(MplPolyCollectionProperties):
+    """
+    A collection of horizontal bars spanning *yrange* with a sequence of
+    *xranges*.
+    
+    """
+    _input_ports = [
+              ("xranges", "basic:String",
+                {'optional': True}),
+              ("yrange", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplBrokenBarHCollectionProperties)")]
+
+    def __init__(self):
+        MplPolyCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPolyCollectionProperties.compute(self)
+        if self.hasInputFromPort('xranges'):
+            self.constructor_props['xranges'] = self.getInputFromPort('xranges')
+        if self.hasInputFromPort('yrange'):
+            self.constructor_props['yrange'] = self.getInputFromPort('yrange')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplRegularPolyCollectionProperties(MplCollectionProperties):
+    """Draw a collection of regular polygons with *numsides*.
+    """
+    _input_ports = [
+              ("numsides", "basic:String",
+                {'optional': True}),
+              ("rotation", "basic:Integer",
+                {'optional': True, 'defaults': "['0']"}),
+              ("sizes", "basic:String",
+                {'optional': True, 'defaults': "['(1,)']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplRegularPolyCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('numsides'):
+            self.constructor_props['numsides'] = self.getInputFromPort('numsides')
+        if self.hasInputFromPort('rotation'):
+            self.constructor_props['rotation'] = self.getInputFromPort('rotation')
+        if self.hasInputFromPort('sizes'):
+            self.constructor_props['sizes'] = self.getInputFromPort('sizes')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplStarPolygonCollectionProperties(MplRegularPolyCollectionProperties):
+    """
+    Draw a collection of regular stars with *numsides* points.
+    """
+    _input_ports = [
+              ("numsides", "basic:String",
+                {'optional': True}),
+              ("rotation", "basic:Integer",
+                {'optional': True, 'defaults': "['0']"}),
+              ("sizes", "basic:String",
+                {'optional': True, 'defaults': "['(1,)']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplStarPolygonCollectionProperties)")]
+
+    def __init__(self):
+        MplRegularPolyCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplRegularPolyCollectionProperties.compute(self)
+        if self.hasInputFromPort('numsides'):
+            self.constructor_props['numsides'] = self.getInputFromPort('numsides')
+        if self.hasInputFromPort('rotation'):
+            self.constructor_props['rotation'] = self.getInputFromPort('rotation')
+        if self.hasInputFromPort('sizes'):
+            self.constructor_props['sizes'] = self.getInputFromPort('sizes')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplAsteriskPolygonCollectionProperties(MplRegularPolyCollectionProperties):
+    """
+    Draw a collection of regular asterisks with *numsides* points.
+    """
+    _input_ports = [
+              ("numsides", "basic:String",
+                {'optional': True}),
+              ("rotation", "basic:Integer",
+                {'optional': True, 'defaults': "['0']"}),
+              ("sizes", "basic:String",
+                {'optional': True, 'defaults': "['(1,)']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplAsteriskPolygonCollectionProperties)")]
+
+    def __init__(self):
+        MplRegularPolyCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplRegularPolyCollectionProperties.compute(self)
+        if self.hasInputFromPort('numsides'):
+            self.constructor_props['numsides'] = self.getInputFromPort('numsides')
+        if self.hasInputFromPort('rotation'):
+            self.constructor_props['rotation'] = self.getInputFromPort('rotation')
+        if self.hasInputFromPort('sizes'):
+            self.constructor_props['sizes'] = self.getInputFromPort('sizes')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplLineCollectionProperties(MplCollectionProperties):
+    """
+    All parameters must be sequences or scalars; if scalars, they will
+    be converted to sequences.  The property of the ith line
+    segment is::
+
+       prop[i % len(props)]
+
+    i.e., the properties cycle if the ``len`` of props is less than the
+    number of segments.
+    
+    """
+    _input_ports = [
+              ("paths", "basic:String",
+                {'optional': True}),
+              ("antialiaseds", "basic:String",
+                {'optional': True}),
+              ("linestyles", "basic:String",
+                {'optional': True, 'defaults': "['solid']"}),
+              ("offsets", "basic:String",
+                {'optional': True}),
+              ("color", "basic:List",
+                {'optional': True, 'docstring': 'Set the color(s) of the line collection.  c can be a matplotlib color arg (all patches have same color), or a sequence or rgba tuples; if it is a sequence the patches will cycle through the sequence.'}),
+              ("segments", "basic:String",
+                {'optional': True}),
+              ("linewidths", "basic:String",
+                {'optional': True}),
+              ("colors", "basic:String",
+                {'optional': True}),
+              ("cmap", "basic:String",
+                {'optional': True}),
+              ("transOffset", "basic:String",
+                {'optional': True}),
+              ("verts", "basic:String",
+                {'optional': True}),
+              ("pickradius", "basic:Integer",
+                {'optional': True, 'defaults': "['5']"}),
+              ("norm", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplLineCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+        if self.hasInputFromPort('antialiaseds'):
+            self.constructor_props['antialiaseds'] = self.getInputFromPort('antialiaseds')
+        if self.hasInputFromPort('linestyles'):
+            self.constructor_props['linestyles'] = self.getInputFromPort('linestyles')
+        if self.hasInputFromPort('offsets'):
+            self.constructor_props['offsets'] = self.getInputFromPort('offsets')
+        if self.hasInputFromPort('color'):
+            self.props['color'] = self.getInputFromPort('color')
+        if self.hasInputFromPort('segments'):
+            self.props['segments'] = self.getInputFromPort('segments')
+        if self.hasInputFromPort('linewidths'):
+            self.constructor_props['linewidths'] = self.getInputFromPort('linewidths')
+        if self.hasInputFromPort('colors'):
+            self.constructor_props['colors'] = self.getInputFromPort('colors')
+        if self.hasInputFromPort('cmap'):
+            self.constructor_props['cmap'] = self.getInputFromPort('cmap')
+        if self.hasInputFromPort('transOffset'):
+            self.constructor_props['transOffset'] = self.getInputFromPort('transOffset')
+        if self.hasInputFromPort('verts'):
+            self.props['verts'] = self.getInputFromPort('verts')
+        if self.hasInputFromPort('pickradius'):
+            self.constructor_props['pickradius'] = self.getInputFromPort('pickradius')
+        if self.hasInputFromPort('norm'):
+            self.constructor_props['norm'] = self.getInputFromPort('norm')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplCircleCollectionProperties(MplCollectionProperties):
+    """
+    A collection of circles, drawn using splines.
+    
+    """
+    _input_ports = [
+              ("sizes", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplCircleCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('sizes'):
+            self.constructor_props['sizes'] = self.getInputFromPort('sizes')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplEllipseCollectionProperties(MplCollectionProperties):
+    """
+    A collection of ellipses, drawn using splines.
+    
+    """
+    _input_ports = [
+              ("units", "basic:String",
+                {'optional': True, 'defaults': "['points']"}),
+              ("widths", "basic:String",
+                {'optional': True}),
+              ("angles", "basic:String",
+                {'optional': True}),
+              ("heights", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplEllipseCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('units'):
+            self.constructor_props['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('widths'):
+            self.constructor_props['widths'] = self.getInputFromPort('widths')
+        if self.hasInputFromPort('angles'):
+            self.constructor_props['angles'] = self.getInputFromPort('angles')
+        if self.hasInputFromPort('heights'):
+            self.constructor_props['heights'] = self.getInputFromPort('heights')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPatchCollectionProperties(MplCollectionProperties):
+    """
+    A generic collection of patches.
+
+    This makes it easier to assign a color map to a heterogeneous
+    collection of patches.
+
+    This also may improve plotting speed, since PatchCollection will
+    draw faster than a large number of patches.
+    
+    """
+    _input_ports = [
+              ("paths", "basic:String",
+                {'optional': True}),
+              ("patches", "basic:String",
+                {'optional': True}),
+              ("match_original", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPatchCollectionProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+        if self.hasInputFromPort('patches'):
+            self.constructor_props['patches'] = self.getInputFromPort('patches')
+        if self.hasInputFromPort('match_original'):
+            self.constructor_props['match_original'] = self.getInputFromPort('match_original')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplTriMeshProperties(MplCollectionProperties):
+    """
+    Class for the efficient drawing of a triangular mesh using
+    Gouraud shading.
+
+    A triangular mesh is a :class:`~matplotlib.tri.Triangulation`
+    object.
+    
+    """
+    _input_ports = [
+              ("triangulation", "basic:String",
+                {'optional': True}),
+              ("paths", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplTriMeshProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('triangulation'):
+            self.constructor_props['triangulation'] = self.getInputFromPort('triangulation')
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplQuadMeshProperties(MplCollectionProperties):
+    """
+    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', or 'gouraud'
+    
+    """
+    _input_ports = [
+              ("paths", "basic:String",
+                {'optional': True}),
+              ("meshWidth", "basic:String",
+                {'optional': True}),
+              ("coordinates", "basic:String",
+                {'optional': True}),
+              ("antialiased", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("shading", "basic:String",
+                {'optional': True, 'defaults': "['flat']"}),
+              ("meshHeight", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplQuadMeshProperties)")]
+
+    def __init__(self):
+        MplCollectionProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplCollectionProperties.compute(self)
+        if self.hasInputFromPort('paths'):
+            self.props['paths'] = self.getInputFromPort('paths')
+        if self.hasInputFromPort('meshWidth'):
+            self.constructor_props['meshWidth'] = self.getInputFromPort('meshWidth')
+        if self.hasInputFromPort('coordinates'):
+            self.constructor_props['coordinates'] = self.getInputFromPort('coordinates')
+        if self.hasInputFromPort('antialiased'):
+            self.constructor_props['antialiased'] = self.getInputFromPort('antialiased')
+        if self.hasInputFromPort('shading'):
+            self.constructor_props['shading'] = self.getInputFromPort('shading')
+        if self.hasInputFromPort('meshHeight'):
+            self.constructor_props['meshHeight'] = self.getInputFromPort('meshHeight')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPatchProperties(MplArtistProperties):
+    """
+    A patch is a 2D artist with a face color and an edge color.
+
+    If any of *edgecolor*, *facecolor*, *linewidth*, or *antialiased*
+    are *None*, they default to their rc params setting.
+    
+    """
+    _input_ports = [
+              ("edgecolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the patch edge color'}),
+              ("facecolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the patch face color'}),
+              ("path_effects", "basic:String",
+                {'optional': True, 'docstring': 'set path_effects, which should be a list of instances of matplotlib.patheffect._Base class or its derivatives.'}),
+              ("color", "basic:Color",
+                {'optional': True, 'docstring': 'Set both the edgecolor and the facecolor. .. seealso:\n\n:meth:`set_facecolor`, :meth:`set_edgecolor`    For setting the edge or face color individually.'}),
+              ("antialiased", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether to use antialiased rendering'}),
+              ("hatch", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the hatching pattern\n\nhatch can be one of:\n\n/   - diagonal hatching \\   - back diagonal |   - vertical -   - horizontal +   - crossed x   - crossed diagonal o   - small circle O   - large circle .   - dots *   - stars\n\nLetters can be combined, in which case all the specified hatchings are done.  If same letter repeats, it increases the density of hatching of that pattern.\n\nHatching is supported in the PostScript, PDF, [...]
+              ("alpha", "basic:Float",
+                {'optional': True, 'docstring': 'Set the alpha tranparency of the patch.'}),
+              ("linewidth", "basic:Float",
+                {'optional': True, 'docstring': 'Set the patch linewidth in points'}),
+              ("linestyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the patch linestyle', 'values': "[['solid', 'dashed', 'dashdot', 'dotted']]", 'optional': True}),
+              ("fill", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether to fill the patch'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPatchProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('edgecolor'):
+            self.props['edgecolor'] = self.getInputFromPort('edgecolor')
+            self.props['edgecolor'] = translate_color(self.props['edgecolor'])
+        if self.hasInputFromPort('facecolor'):
+            self.props['facecolor'] = self.getInputFromPort('facecolor')
+            self.props['facecolor'] = translate_color(self.props['facecolor'])
+        if self.hasInputFromPort('path_effects'):
+            self.props['path_effects'] = self.getInputFromPort('path_effects')
+        if self.hasInputFromPort('color'):
+            self.props['color'] = self.getInputFromPort('color')
+            self.props['color'] = translate_color(self.props['color'])
+        if self.hasInputFromPort('antialiased'):
+            self.props['antialiased'] = self.getInputFromPort('antialiased')
+        if self.hasInputFromPort('hatch'):
+            self.props['hatch'] = self.getInputFromPort('hatch')
+        if self.hasInputFromPort('alpha'):
+            self.props['alpha'] = self.getInputFromPort('alpha')
+        if self.hasInputFromPort('linewidth'):
+            self.props['linewidth'] = self.getInputFromPort('linewidth')
+        if self.hasInputFromPort('linestyle'):
+            self.props['linestyle'] = self.getInputFromPort('linestyle')
+        if self.hasInputFromPort('fill'):
+            self.props['fill'] = self.getInputFromPort('fill')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplShadowProperties(MplPatchProperties):
+    """None
+    """
+    _input_ports = [
+              ("patch", "basic:String",
+                {'optional': True}),
+              ("props", "basic:String",
+                {'optional': True}),
+              ("oy", "basic:String",
+                {'optional': True}),
+              ("ox", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplShadowProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('patch'):
+            self.constructor_props['patch'] = self.getInputFromPort('patch')
+        if self.hasInputFromPort('props'):
+            self.constructor_props['props'] = self.getInputFromPort('props')
+        if self.hasInputFromPort('oy'):
+            self.constructor_props['oy'] = self.getInputFromPort('oy')
+        if self.hasInputFromPort('ox'):
+            self.constructor_props['ox'] = self.getInputFromPort('ox')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplRectangleProperties(MplPatchProperties):
+    """
+    Draw a rectangle with lower left at *xy* = (*x*, *y*) with
+    specified *width* and *height*.
+    
+    """
+    _input_ports = [
+              ("bounds", "basic:String",
+                {'optional': True, 'docstring': 'Set the bounds of the rectangle: l,b,w,h'}),
+              ("height", "basic:Float",
+                {'optional': True, 'docstring': 'Set the width rectangle'}),
+              ("width", "basic:Float",
+                {'optional': True, 'docstring': 'Set the width rectangle'}),
+              ("xy", "basic:List",
+                {'optional': True, 'docstring': 'Set the left and bottom coords of the rectangle'}),
+              ("y", "basic:Float",
+                {'optional': True, 'docstring': 'Set the bottom coord of the rectangle'}),
+              ("x", "basic:Float",
+                {'optional': True, 'docstring': 'Set the left coord of the rectangle'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplRectangleProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('bounds'):
+            self.props['bounds'] = self.getInputFromPort('bounds')
+        if self.hasInputFromPort('height'):
+            self.props['height'] = self.getInputFromPort('height')
+        if self.hasInputFromPort('width'):
+            self.props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('xy'):
+            self.props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('y'):
+            self.props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('x'):
+            self.props['x'] = self.getInputFromPort('x')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplRegularPolygonProperties(MplPatchProperties):
+    """
+    A regular polygon patch.
+    
+    """
+    _input_ports = [
+              ("xy", "basic:String",
+                {'optional': True, 'docstring': 'A length 2 tuple (x, y) of the center.'}),
+              ("radius", "basic:Integer",
+                {'optional': True, 'docstring': 'The distance from the center to each of the vertices.', 'defaults': "['5']"}),
+              ("orientation", "basic:Integer",
+                {'optional': True, 'docstring': 'rotates the polygon (in radians).', 'defaults': "['0']"}),
+              ("numVertices", "basic:String",
+                {'optional': True, 'docstring': 'the number of vertices.'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplRegularPolygonProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('radius'):
+            self.constructor_props['radius'] = self.getInputFromPort('radius')
+        if self.hasInputFromPort('orientation'):
+            self.constructor_props['orientation'] = self.getInputFromPort('orientation')
+        if self.hasInputFromPort('numVertices'):
+            self.constructor_props['numVertices'] = self.getInputFromPort('numVertices')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplCirclePolygonProperties(MplRegularPolygonProperties):
+    """
+    A polygon-approximation of a circle patch.
+    
+    """
+    _input_ports = [
+              ("radius", "basic:Integer",
+                {'optional': True, 'defaults': "['5']"}),
+              ("xy", "basic:String",
+                {'optional': True}),
+              ("resolution", "basic:Integer",
+                {'optional': True, 'defaults': "['20']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplCirclePolygonProperties)")]
+
+    def __init__(self):
+        MplRegularPolygonProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplRegularPolygonProperties.compute(self)
+        if self.hasInputFromPort('radius'):
+            self.constructor_props['radius'] = self.getInputFromPort('radius')
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('resolution'):
+            self.constructor_props['resolution'] = self.getInputFromPort('resolution')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPathPatchProperties(MplPatchProperties):
+    """
+    A general polycurve path patch.
+    
+    """
+    _input_ports = [
+              ("path", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPathPatchProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('path'):
+            self.constructor_props['path'] = self.getInputFromPort('path')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplPolygonProperties(MplPatchProperties):
+    """
+    A general polygon patch.
+    
+    """
+    _input_ports = [
+              ("xy", "basic:String",
+                {'optional': True}),
+              ("closed", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplPolygonProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('xy'):
+            self.props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('closed'):
+            self.props['closed'] = self.getInputFromPort('closed')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplFancyArrowProperties(MplPolygonProperties):
+    """
+    Like Arrow, but lets you set head width and head height independently.
+    
+    """
+    _input_ports = [
+              ("length_includes_head", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("head_length", "basic:String",
+                {'optional': True}),
+              ("head_width", "basic:String",
+                {'optional': True}),
+              ("width", "basic:Float",
+                {'optional': True, 'defaults': "['0.001']"}),
+              ("shape", "basic:String",
+                {'optional': True, 'defaults': "['full']"}),
+              ("dx", "basic:String",
+                {'optional': True}),
+              ("dy", "basic:String",
+                {'optional': True}),
+              ("y", "basic:String",
+                {'optional': True}),
+              ("x", "basic:String",
+                {'optional': True}),
+              ("head_starts_at_zero", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("overhang", "basic:Integer",
+                {'optional': True, 'defaults': "['0']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplFancyArrowProperties)")]
+
+    def __init__(self):
+        MplPolygonProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPolygonProperties.compute(self)
+        if self.hasInputFromPort('length_includes_head'):
+            self.constructor_props['length_includes_head'] = self.getInputFromPort('length_includes_head')
+        if self.hasInputFromPort('head_length'):
+            self.constructor_props['head_length'] = self.getInputFromPort('head_length')
+        if self.hasInputFromPort('head_width'):
+            self.constructor_props['head_width'] = self.getInputFromPort('head_width')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('shape'):
+            self.constructor_props['shape'] = self.getInputFromPort('shape')
+        if self.hasInputFromPort('dx'):
+            self.constructor_props['dx'] = self.getInputFromPort('dx')
+        if self.hasInputFromPort('dy'):
+            self.constructor_props['dy'] = self.getInputFromPort('dy')
+        if self.hasInputFromPort('y'):
+            self.constructor_props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('x'):
+            self.constructor_props['x'] = self.getInputFromPort('x')
+        if self.hasInputFromPort('head_starts_at_zero'):
+            self.constructor_props['head_starts_at_zero'] = self.getInputFromPort('head_starts_at_zero')
+        if self.hasInputFromPort('overhang'):
+            self.constructor_props['overhang'] = self.getInputFromPort('overhang')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplWedgeProperties(MplPatchProperties):
+    """
+    Wedge shaped patch.
+    
+    """
+    _input_ports = [
+              ("theta2", "basic:String",
+                {'optional': True}),
+              ("width", "basic:String",
+                {'optional': True}),
+              ("r", "basic:String",
+                {'optional': True}),
+              ("theta1", "basic:String",
+                {'optional': True}),
+              ("center", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplWedgeProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('theta2'):
+            self.constructor_props['theta2'] = self.getInputFromPort('theta2')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('r'):
+            self.constructor_props['r'] = self.getInputFromPort('r')
+        if self.hasInputFromPort('theta1'):
+            self.constructor_props['theta1'] = self.getInputFromPort('theta1')
+        if self.hasInputFromPort('center'):
+            self.constructor_props['center'] = self.getInputFromPort('center')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplArrowProperties(MplPatchProperties):
+    """
+    An arrow patch.
+    
+    """
+    _input_ports = [
+              ("y", "basic:String",
+                {'optional': True}),
+              ("x", "basic:String",
+                {'optional': True}),
+              ("dy", "basic:String",
+                {'optional': True}),
+              ("dx", "basic:String",
+                {'optional': True}),
+              ("width", "basic:Float",
+                {'optional': True, 'defaults': "['1.0']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplArrowProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('y'):
+            self.constructor_props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('x'):
+            self.constructor_props['x'] = self.getInputFromPort('x')
+        if self.hasInputFromPort('dy'):
+            self.constructor_props['dy'] = self.getInputFromPort('dy')
+        if self.hasInputFromPort('dx'):
+            self.constructor_props['dx'] = self.getInputFromPort('dx')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplYAArrowProperties(MplPatchProperties):
+    """
+    Yet another arrow class.
+
+    This is an arrow that is defined in display space and has a tip at
+    *x1*, *y1* and a base at *x2*, *y2*.
+    
+    """
+    _input_ports = [
+              ("xytip", "basic:String",
+                {'optional': True, 'docstring': '(x, y) location of arrow tip'}),
+              ("headwidth", "basic:Integer",
+                {'optional': True, 'docstring': 'The width of the base of the arrow head in points', 'defaults': "['12']"}),
+              ("frac", "basic:Float",
+                {'optional': True, 'docstring': 'The fraction of the arrow length occupied by the head', 'defaults': "['0.1']"}),
+              ("figure", "basic:String",
+                {'optional': True, 'docstring': 'The :class:`~matplotlib.figure.Figure` instance (fig.dpi)'}),
+              ("xybase", "basic:String",
+                {'optional': True, 'docstring': '(x, y) location the arrow base mid point'}),
+              ("width", "basic:Integer",
+                {'optional': True, 'docstring': 'The width of the arrow in points', 'defaults': "['4']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplYAArrowProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('xytip'):
+            self.constructor_props['xytip'] = self.getInputFromPort('xytip')
+        if self.hasInputFromPort('headwidth'):
+            self.constructor_props['headwidth'] = self.getInputFromPort('headwidth')
+        if self.hasInputFromPort('frac'):
+            self.constructor_props['frac'] = self.getInputFromPort('frac')
+        if self.hasInputFromPort('figure'):
+            self.constructor_props['figure'] = self.getInputFromPort('figure')
+        if self.hasInputFromPort('xybase'):
+            self.constructor_props['xybase'] = self.getInputFromPort('xybase')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplEllipseProperties(MplPatchProperties):
+    """
+    A scale-free ellipse.
+    
+    """
+    _input_ports = [
+              ("width", "basic:String",
+                {'optional': True}),
+              ("xy", "basic:String",
+                {'optional': True}),
+              ("angle", "basic:Float",
+                {'optional': True, 'defaults': "['0.0']"}),
+              ("height", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplEllipseProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('angle'):
+            self.constructor_props['angle'] = self.getInputFromPort('angle')
+        if self.hasInputFromPort('height'):
+            self.constructor_props['height'] = self.getInputFromPort('height')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplCircleProperties(MplEllipseProperties):
+    """
+    A circle patch.
+    
+    """
+    _input_ports = [
+              ("xy", "basic:String",
+                {'optional': True}),
+              ("radius", "basic:Float",
+                {'optional': True, 'docstring': 'Set the radius of the circle'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplCircleProperties)")]
+
+    def __init__(self):
+        MplEllipseProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplEllipseProperties.compute(self)
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('radius'):
+            self.props['radius'] = self.getInputFromPort('radius')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplArcProperties(MplEllipseProperties):
+    """
+    An elliptical arc.  Because it performs various optimizations, it
+    can not be filled.
+
+    The arc must be used in an :class:`~matplotlib.axes.Axes`
+    instance---it can not be added directly to a
+    :class:`~matplotlib.figure.Figure`---because it is optimized to
+    only render the segments that are inside the axes bounding box
+    with high resolution.
+    
+    """
+    _input_ports = [
+              ("theta2", "basic:Float",
+                {'optional': True, 'defaults': "['360.0']"}),
+              ("theta1", "basic:Float",
+                {'optional': True, 'defaults': "['0.0']"}),
+              ("angle", "basic:Float",
+                {'optional': True, 'defaults': "['0.0']"}),
+              ("height", "basic:String",
+                {'optional': True}),
+              ("width", "basic:String",
+                {'optional': True}),
+              ("xy", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplArcProperties)")]
+
+    def __init__(self):
+        MplEllipseProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplEllipseProperties.compute(self)
+        if self.hasInputFromPort('theta2'):
+            self.constructor_props['theta2'] = self.getInputFromPort('theta2')
+        if self.hasInputFromPort('theta1'):
+            self.constructor_props['theta1'] = self.getInputFromPort('theta1')
+        if self.hasInputFromPort('angle'):
+            self.constructor_props['angle'] = self.getInputFromPort('angle')
+        if self.hasInputFromPort('height'):
+            self.constructor_props['height'] = self.getInputFromPort('height')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplFancyBboxPatchProperties(MplPatchProperties):
+    """
+    Draw a fancy box around a rectangle with lower left at *xy*=(*x*,
+    *y*) with specified width and height.
+
+    :class:`FancyBboxPatch` class is similar to :class:`Rectangle`
+    class, but it draws a fancy box around the rectangle. The
+    transformation of the rectangle box to the fancy box is delegated
+    to the :class:`BoxTransmuterBase` and its derived classes.
+
+    
+    """
+    _input_ports = [
+              ("mutation_scale", "basic:Float",
+                {'optional': True, 'docstring': 'Set the mutation scale.'}),
+              ("bbox_transmuter", "basic:String",
+                {'optional': True}),
+              ("bounds", "basic:String",
+                {'optional': True, 'docstring': 'Set the bounds of the rectangle: l,b,w,h'}),
+              ("height", "basic:Float",
+                {'optional': True, 'docstring': 'Set the width rectangle'}),
+              ("width", "basic:Float",
+                {'optional': True, 'docstring': 'Set the width rectangle'}),
+              ("xy", "basic:String",
+                {'optional': True}),
+              ("boxstyle", "basic:String",
+                {'optional': True, 'docstring': 'Set the box style.\n\nboxstyle can be a string with boxstyle name with optional comma-separated attributes. Alternatively, the attrs can be provided as keywords:\n\nset_boxstyle("round,pad=0.2") set_boxstyle("round", pad=0.2)\n\nOld attrs simply are forgotten.\n\nWithout argument (or with boxstyle = None), it returns available box styles.'}),
+              ("mutation_aspect", "basic:Float",
+                {'optional': True, 'docstring': 'Set the aspect ratio of the bbox mutation.'}),
+              ("y", "basic:Float",
+                {'optional': True, 'docstring': 'Set the bottom coord of the rectangle'}),
+              ("x", "basic:Float",
+                {'optional': True, 'docstring': 'Set the left coord of the rectangle'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplFancyBboxPatchProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('mutation_scale'):
+            self.props['mutation_scale'] = self.getInputFromPort('mutation_scale')
+        if self.hasInputFromPort('bbox_transmuter'):
+            self.constructor_props['bbox_transmuter'] = self.getInputFromPort('bbox_transmuter')
+        if self.hasInputFromPort('bounds'):
+            self.props['bounds'] = self.getInputFromPort('bounds')
+        if self.hasInputFromPort('height'):
+            self.props['height'] = self.getInputFromPort('height')
+        if self.hasInputFromPort('width'):
+            self.props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('boxstyle'):
+            self.props['boxstyle'] = self.getInputFromPort('boxstyle')
+        if self.hasInputFromPort('mutation_aspect'):
+            self.props['mutation_aspect'] = self.getInputFromPort('mutation_aspect')
+        if self.hasInputFromPort('y'):
+            self.props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('x'):
+            self.props['x'] = self.getInputFromPort('x')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplFancyArrowPatchProperties(MplPatchProperties):
+    """
+    A fancy arrow patch. It draws an arrow using the :class:ArrowStyle.
+    
+    """
+    _input_ports = [
+              ("connectionstyle", "basic:String",
+                {'optional': True, 'docstring': 'Set the connection style.\n\nOld attrs simply are forgotten.\n\nWithout argument (or with connectionstyle=None), return available styles as a list of strings.'}),
+              ("mutation_scale", "basic:Float",
+                {'optional': True, 'docstring': 'Set the mutation scale.'}),
+              ("arrowstyle", "basic:String",
+                {'optional': True, 'docstring': 'Set the arrow style.\n\nOld attrs simply are forgotten.\n\nWithout argument (or with arrowstyle=None), return available box styles as a list of strings.'}),
+              ("arrow_transmuter", "basic:String",
+                {'optional': True}),
+              ("positions", "basic:String",
+                {'optional': True}),
+              ("shrinkA", "basic:Float",
+                {'optional': True, 'defaults': "['2.0']"}),
+              ("posB", "basic:String",
+                {'optional': True}),
+              ("dpi_cor", "basic:String",
+                {'optional': True, 'docstring': 'dpi_cor is currently used for linewidth-related things and shink factor. Mutation scale is not affected by this.'}),
+              ("connector", "basic:String",
+                {'optional': True}),
+              ("path", "basic:String",
+                {'optional': True}),
+              ("shrinkB", "basic:Float",
+                {'optional': True, 'defaults': "['2.0']"}),
+              ("mutation_aspect", "basic:Float",
+                {'optional': True, 'docstring': 'Set the aspect ratio of the bbox mutation.'}),
+              ("patchA", "basic:String",
+                {'optional': True, 'docstring': 'set the begin patch.'}),
+              ("patchB", "basic:String",
+                {'optional': True, 'docstring': 'set the begin patch'}),
+              ("posA", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplFancyArrowPatchProperties)")]
+
+    def __init__(self):
+        MplPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplPatchProperties.compute(self)
+        if self.hasInputFromPort('connectionstyle'):
+            self.props['connectionstyle'] = self.getInputFromPort('connectionstyle')
+        if self.hasInputFromPort('mutation_scale'):
+            self.props['mutation_scale'] = self.getInputFromPort('mutation_scale')
+        if self.hasInputFromPort('arrowstyle'):
+            self.props['arrowstyle'] = self.getInputFromPort('arrowstyle')
+        if self.hasInputFromPort('arrow_transmuter'):
+            self.constructor_props['arrow_transmuter'] = self.getInputFromPort('arrow_transmuter')
+        if self.hasInputFromPort('positions'):
+            self.props['positions'] = self.getInputFromPort('positions')
+        if self.hasInputFromPort('shrinkA'):
+            self.constructor_props['shrinkA'] = self.getInputFromPort('shrinkA')
+        if self.hasInputFromPort('posB'):
+            self.constructor_props['posB'] = self.getInputFromPort('posB')
+        if self.hasInputFromPort('dpi_cor'):
+            self.props['dpi_cor'] = self.getInputFromPort('dpi_cor')
+        if self.hasInputFromPort('connector'):
+            self.constructor_props['connector'] = self.getInputFromPort('connector')
+        if self.hasInputFromPort('path'):
+            self.constructor_props['path'] = self.getInputFromPort('path')
+        if self.hasInputFromPort('shrinkB'):
+            self.constructor_props['shrinkB'] = self.getInputFromPort('shrinkB')
+        if self.hasInputFromPort('mutation_aspect'):
+            self.props['mutation_aspect'] = self.getInputFromPort('mutation_aspect')
+        if self.hasInputFromPort('patchA'):
+            self.props['patchA'] = self.getInputFromPort('patchA')
+        if self.hasInputFromPort('patchB'):
+            self.props['patchB'] = self.getInputFromPort('patchB')
+        if self.hasInputFromPort('posA'):
+            self.constructor_props['posA'] = self.getInputFromPort('posA')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplConnectionPatchProperties(MplFancyArrowPatchProperties):
+    """
+    A :class:`~matplotlib.patches.ConnectionPatch` class is to make
+    connecting lines between two points (possibly in different axes).
+    
+    """
+    _input_ports = [
+              ("connectionstyle", "basic:String",
+                {'optional': True, 'docstring': 'the connection style', 'defaults': "['arc3']"}),
+              ("coordsA", "basic:String",
+                {'entry_types': "['enum']", 'values': "[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]", 'optional': True}),
+              ("arrowstyle", "basic:String",
+                {'optional': True, 'docstring': 'the arrow style', 'defaults': "['-']"}),
+              ("clip_on", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("arrow_transmuter", "basic:String",
+                {'optional': True}),
+              ("axesA", "basic:String",
+                {'optional': True}),
+              ("axesB", "basic:String",
+                {'optional': True}),
+              ("annotation_clip", "basic:String",
+                {'optional': True, 'docstring': 'set annotation_clip attribute.\n\nNone: the self.xy will be checked only if xycoords is "data"'}),
+              ("dpi_cor", "basic:Float",
+                {'optional': True, 'defaults': "['1.0']"}),
+              ("connector", "basic:String",
+                {'optional': True}),
+              ("xyA", "basic:String",
+                {'optional': True}),
+              ("xyB", "basic:String",
+                {'optional': True}),
+              ("relpos", "basic:String",
+                {'optional': True, 'docstring': 'default is (0.5, 0.5)', 'defaults': "['(0.5']"}),
+              ("shrinkB", "basic:Float",
+                {'optional': True, 'docstring': 'default is 2 points', 'defaults': "['2']"}),
+              ("shrinkA", "basic:Float",
+                {'optional': True, 'docstring': 'default is 2 points', 'defaults': "['2']"}),
+              ("mutation_aspect", "basic:Integer",
+                {'optional': True, 'docstring': 'default is 1.', 'defaults': "['1']"}),
+              ("mutation_scale", "basic:String",
+                {'optional': True, 'docstring': 'default is text size (in points)', 'defaults': "['text']"}),
+              ("patchA", "basic:String",
+                {'optional': True, 'docstring': 'default is bounding box of the text', 'defaults': "['bounding']"}),
+              ("patchB", "basic:String",
+                {'optional': True, 'docstring': 'default is None'}),
+              ("coordsB", "basic:String",
+                {'entry_types': "['enum']", 'values': "[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]", 'optional': True}),
+              ("?", "basic:String",
+                {'optional': True, 'docstring': 'any key for :class:`matplotlib.patches.PathPatch`'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplConnectionPatchProperties)")]
+
+    def __init__(self):
+        MplFancyArrowPatchProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplFancyArrowPatchProperties.compute(self)
+        if self.hasInputFromPort('connectionstyle'):
+            self.constructor_props['connectionstyle'] = self.getInputFromPort('connectionstyle')
+        if self.hasInputFromPort('coordsA'):
+            self.constructor_props['coordsA'] = self.getInputFromPort('coordsA')
+        if self.hasInputFromPort('arrowstyle'):
+            self.constructor_props['arrowstyle'] = self.getInputFromPort('arrowstyle')
+        if self.hasInputFromPort('clip_on'):
+            self.constructor_props['clip_on'] = self.getInputFromPort('clip_on')
+        if self.hasInputFromPort('arrow_transmuter'):
+            self.constructor_props['arrow_transmuter'] = self.getInputFromPort('arrow_transmuter')
+        if self.hasInputFromPort('axesA'):
+            self.constructor_props['axesA'] = self.getInputFromPort('axesA')
+        if self.hasInputFromPort('axesB'):
+            self.constructor_props['axesB'] = self.getInputFromPort('axesB')
+        if self.hasInputFromPort('annotation_clip'):
+            self.props['annotation_clip'] = self.getInputFromPort('annotation_clip')
+        if self.hasInputFromPort('dpi_cor'):
+            self.constructor_props['dpi_cor'] = self.getInputFromPort('dpi_cor')
+        if self.hasInputFromPort('connector'):
+            self.constructor_props['connector'] = self.getInputFromPort('connector')
+        if self.hasInputFromPort('xyA'):
+            self.constructor_props['xyA'] = self.getInputFromPort('xyA')
+        if self.hasInputFromPort('xyB'):
+            self.constructor_props['xyB'] = self.getInputFromPort('xyB')
+        if self.hasInputFromPort('relpos'):
+            self.constructor_props['relpos'] = self.getInputFromPort('relpos')
+        if self.hasInputFromPort('shrinkB'):
+            self.constructor_props['shrinkB'] = self.getInputFromPort('shrinkB')
+        if self.hasInputFromPort('shrinkA'):
+            self.constructor_props['shrinkA'] = self.getInputFromPort('shrinkA')
+        if self.hasInputFromPort('mutation_aspect'):
+            self.constructor_props['mutation_aspect'] = self.getInputFromPort('mutation_aspect')
+        if self.hasInputFromPort('mutation_scale'):
+            self.constructor_props['mutation_scale'] = self.getInputFromPort('mutation_scale')
+        if self.hasInputFromPort('patchA'):
+            self.constructor_props['patchA'] = self.getInputFromPort('patchA')
+        if self.hasInputFromPort('patchB'):
+            self.constructor_props['patchB'] = self.getInputFromPort('patchB')
+        if self.hasInputFromPort('coordsB'):
+            self.constructor_props['coordsB'] = self.getInputFromPort('coordsB')
+        if self.hasInputFromPort('?'):
+            self.constructor_props['?'] = self.getInputFromPort('?')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplLine2DProperties(MplArtistProperties):
+    """
+    A line - the line can have both a solid linestyle connecting all
+    the vertices, and a marker at each vertex.  Additionally, the
+    drawing of the solid line is influenced by the drawstyle, eg one
+    can create "stepped" lines in various styles.
+
+
+    
+    """
+    _input_ports = [
+              ("picker", "basic:Float",
+                {'optional': True, 'docstring': 'Sets the event picker details for the line.'}),
+              ("dash_capstyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the cap style for dashed linestyles', 'values': "[['butt', 'round', 'projecting']]", 'optional': True}),
+              ("color", "basic:Color",
+                {'optional': True, 'docstring': 'Set the color of the line'}),
+              ("markevery", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the markevery property to subsample the plot when using markers.  Eg if markevery=5, every 5-th marker will be plotted.  every can be', 'values': "[['(startind, stride)']]", 'optional': True}),
+              ("markeredgecolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the marker edge color'}),
+              ("marker", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the line marker\n\nThe marker can also be a tuple (numsides, style, angle), which will create a custom, regular symbol.\n\n\n\nFor backward compatibility, the form (verts, 0) is also accepted, but it is equivalent to just verts for giving a raw set of vertices that define the shape.', 'values': "[['caretdown', 'caretleft', 'caretright', 'caretup', 'circle', 'diamond', 'hexagon1', 'hexagon2', 'hline', 'nothing', 'octagon', 'pen [...]
+              ("markerfacecoloralt", "basic:Color",
+                {'optional': True, 'docstring': 'Set the alternate marker face color.'}),
+              ("linewidth", "basic:Float",
+                {'optional': True, 'docstring': 'Set the line width in points'}),
+              ("linestyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "Set the linestyle of the line (also accepts drawstyles)\n\n'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility.", 'values': "[['solid', 'dashed', 'dash_dot', 'dotted', 'draw nothing', 'draw nothing', 'draw nothing']]", 'optional': True}),
+              ("solid_joinstyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the join style for solid linestyles', 'values': "[['miter', 'round', 'bevel']]", 'optional': True}),
+              ("markerfacecolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the marker face color.'}),
+              ("axes", "basic:String",
+                {'optional': True, 'docstring': 'Set the :class:`~matplotlib.axes.Axes` instance in which the artist resides, if any.'}),
+              ("transform", "basic:String",
+                {'optional': True, 'docstring': 'set the Transformation instance used by this artist'}),
+              ("fillstyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "Set the marker fill style; 'full' means fill the whole marker. 'none' means no filling; other options are for half-filled markers.", 'values': "[['full', 'left', 'right', 'bottom', 'top', 'none']]", 'optional': True}),
+              ("markeredgewidth", "basic:Float",
+                {'optional': True, 'docstring': 'Set the marker edge width in points'}),
+              ("solid_capstyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the cap style for solid linestyles', 'values': "[['butt', 'round', 'projecting']]", 'optional': True}),
+              ("dashes", "basic:List",
+                {'optional': True, 'docstring': 'Set the dash sequence, sequence of dashes with on off ink in points.  If seq is empty or if seq = (None, None), the linestyle will be set to solid.'}),
+              ("markersize", "basic:Float",
+                {'optional': True, 'docstring': 'Set the marker size in points'}),
+              ("antialiased", "basic:Boolean",
+                {'optional': True, 'docstring': 'True if line should be drawin with antialiased rendering'}),
+              ("xdata", "basic:String",
+                {'optional': True, 'docstring': 'Set the data np.array for x'}),
+              ("drawstyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "Set the drawstyle of the plot\n\n'default' connects the points with lines. The steps variants produce step-plots. 'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility.", 'values': "[['default', 'steps', 'steps-pre', 'steps-mid', 'steps-post']]", 'optional': True}),
+              ("data", "basic:String",
+                {'optional': True, 'docstring': 'Set the x and y data'}),
+              ("dash_joinstyle", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the join style for dashed linestyles', 'values': "[['miter', 'round', 'bevel']]", 'optional': True}),
+              ("pickradius", "basic:Float",
+                {'optional': True, 'docstring': 'Sets the pick radius used for containment tests'}),
+              ("ydata", "basic:String",
+                {'optional': True, 'docstring': 'Set the data np.array for y'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplLine2DProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('picker'):
+            self.props['picker'] = self.getInputFromPort('picker')
+        if self.hasInputFromPort('dash_capstyle'):
+            self.props['dash_capstyle'] = self.getInputFromPort('dash_capstyle')
+        if self.hasInputFromPort('color'):
+            self.props['color'] = self.getInputFromPort('color')
+            self.props['color'] = translate_color(self.props['color'])
+        if self.hasInputFromPort('markevery'):
+            self.props['markevery'] = self.getInputFromPort('markevery')
+        if self.hasInputFromPort('markeredgecolor'):
+            self.props['markeredgecolor'] = self.getInputFromPort('markeredgecolor')
+            self.props['markeredgecolor'] = translate_color(self.props['markeredgecolor'])
+        if self.hasInputFromPort('marker'):
+            self.props['marker'] = self.getInputFromPort('marker')
+            self.props['marker'] = translate_MplLine2DProperties_marker(self.props['marker'])
+        if self.hasInputFromPort('markerfacecoloralt'):
+            self.props['markerfacecoloralt'] = self.getInputFromPort('markerfacecoloralt')
+            self.props['markerfacecoloralt'] = translate_color(self.props['markerfacecoloralt'])
+        if self.hasInputFromPort('linewidth'):
+            self.props['linewidth'] = self.getInputFromPort('linewidth')
+        if self.hasInputFromPort('linestyle'):
+            self.props['linestyle'] = self.getInputFromPort('linestyle')
+            self.props['linestyle'] = translate_MplLine2DProperties_linestyle(self.props['linestyle'])
+        if self.hasInputFromPort('solid_joinstyle'):
+            self.props['solid_joinstyle'] = self.getInputFromPort('solid_joinstyle')
+        if self.hasInputFromPort('markerfacecolor'):
+            self.props['markerfacecolor'] = self.getInputFromPort('markerfacecolor')
+            self.props['markerfacecolor'] = translate_color(self.props['markerfacecolor'])
+        if self.hasInputFromPort('axes'):
+            self.props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('transform'):
+            self.props['transform'] = self.getInputFromPort('transform')
+        if self.hasInputFromPort('fillstyle'):
+            self.props['fillstyle'] = self.getInputFromPort('fillstyle')
+        if self.hasInputFromPort('markeredgewidth'):
+            self.props['markeredgewidth'] = self.getInputFromPort('markeredgewidth')
+        if self.hasInputFromPort('solid_capstyle'):
+            self.props['solid_capstyle'] = self.getInputFromPort('solid_capstyle')
+        if self.hasInputFromPort('dashes'):
+            self.props['dashes'] = self.getInputFromPort('dashes')
+        if self.hasInputFromPort('markersize'):
+            self.props['markersize'] = self.getInputFromPort('markersize')
+        if self.hasInputFromPort('antialiased'):
+            self.props['antialiased'] = self.getInputFromPort('antialiased')
+        if self.hasInputFromPort('xdata'):
+            self.props['xdata'] = self.getInputFromPort('xdata')
+        if self.hasInputFromPort('drawstyle'):
+            self.props['drawstyle'] = self.getInputFromPort('drawstyle')
+        if self.hasInputFromPort('data'):
+            self.props['data'] = self.getInputFromPort('data')
+        if self.hasInputFromPort('dash_joinstyle'):
+            self.props['dash_joinstyle'] = self.getInputFromPort('dash_joinstyle')
+        if self.hasInputFromPort('pickradius'):
+            self.props['pickradius'] = self.getInputFromPort('pickradius')
+        if self.hasInputFromPort('ydata'):
+            self.props['ydata'] = self.getInputFromPort('ydata')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplTextProperties(MplArtistProperties):
+    """
+    Handle storing and drawing of text in window or data coordinates.
+    
+    """
+    _input_ports = [
+              ("rotation_mode", "basic:String",
+                {'optional': True, 'docstring': 'set text rotation mode. If "anchor", the un-rotated text will first aligned according to their ha and va, and then will be rotated with the alignement reference point as a origin. If None (default), the text will be rotated first then will be aligned.'}),
+              ("style", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the font style.', 'values': "[['normal', 'italic', 'oblique']]", 'optional': True}),
+              ("linespacing", "basic:Float",
+                {'optional': True, 'docstring': 'Set the line spacing as a multiple of the font size. Default is 1.2.'}),
+              ("family", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the font family.  May be either a single string, or a list of strings in decreasing priority.  Each string may be either a real font name or a generic font class name.  If the latter, the specific font names will be looked up in the :file:`matplotlibrc` file.', 'values': "[['FONTNAME', 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace']]", 'optional': True}),
+              ("x", "basic:Float",
+                {'optional': True, 'docstring': 'Set the x position of the text'}),
+              ("color", "basic:Color",
+                {'optional': True, 'docstring': 'Set the foreground color of the text'}),
+              ("text", "basic:String",
+                {'optional': True, 'docstring': 'Set the text string s\n\nIt may contain newlines (\\n) or math in LaTeX syntax.'}),
+              ("verticalalignment", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the vertical alignment', 'values': "[['center', 'top', 'bottom', 'baseline']]", 'optional': True}),
+              ("variant", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "Set the font variant, either 'normal' or 'small-caps'.", 'values': "[['normal', 'small-caps']]", 'optional': True}),
+              ("path_effects", "basic:String",
+                {'optional': True}),
+              ("weight", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the font weight.', 'values': "[['a numeric value in range 0-1000', 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black']]", 'optional': True}),
+              ("stretch", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the font stretch (horizontal condensation or expansion).', 'values': "[['a numeric value in range 0-1000', 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded']]", 'optional': True}),
+              ("fontproperties", "basic:String",
+                {'optional': True, 'docstring': 'Set the font properties that control the text.  fp must be a :class:`matplotlib.font_manager.FontProperties` object.'}),
+              ("horizontalalignment", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the horizontal alignment to one of', 'values': "[['center', 'right', 'left']]", 'optional': True}),
+              ("bbox", "basic:String",
+                {'optional': True, 'docstring': 'Draw a bounding box around self.  rectprops are any settable properties for a rectangle, eg facecolor=\'red\', alpha=0.5.\n\nt.set_bbox(dict(facecolor=\'red\', alpha=0.5))\n\nIf rectprops has "boxstyle" key. A FancyBboxPatch is initialized with rectprops and will be drawn. The mutation scale of the FancyBboxPath is set to the fontsize.'}),
+              ("backgroundcolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the background color of the text by updating the bbox.'}),
+              ("position", "basic:String",
+                {'optional': True, 'docstring': 'Set the (x, y) position of the text'}),
+              ("y", "basic:Float",
+                {'optional': True, 'docstring': 'Set the y position of the text'}),
+              ("multialignment", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the alignment for multiple lines layout.  The layout of the bounding box of all the lines is determined bu the horizontalalignment and verticalalignment properties, but the multiline text within that box can be', 'values': "[['left', 'right', 'center']]", 'optional': True}),
+              ("rotation", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the rotation of the text', 'values': "[['angle in degrees', 'vertical', 'horizontal']]", 'optional': True}),
+              ("size", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the font size.  May be either a size string, relative to the default font size, or an absolute font size in points.', 'values': "[['size in points', 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']]", 'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplTextProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('rotation_mode'):
+            self.props['rotation_mode'] = self.getInputFromPort('rotation_mode')
+        if self.hasInputFromPort('style'):
+            self.props['style'] = self.getInputFromPort('style')
+        if self.hasInputFromPort('linespacing'):
+            self.props['linespacing'] = self.getInputFromPort('linespacing')
+        if self.hasInputFromPort('family'):
+            self.props['family'] = self.getInputFromPort('family')
+        if self.hasInputFromPort('x'):
+            self.props['x'] = self.getInputFromPort('x')
+        if self.hasInputFromPort('color'):
+            self.props['color'] = self.getInputFromPort('color')
+            self.props['color'] = translate_color(self.props['color'])
+        if self.hasInputFromPort('text'):
+            self.props['text'] = self.getInputFromPort('text')
+        if self.hasInputFromPort('verticalalignment'):
+            self.props['verticalalignment'] = self.getInputFromPort('verticalalignment')
+        if self.hasInputFromPort('variant'):
+            self.props['variant'] = self.getInputFromPort('variant')
+        if self.hasInputFromPort('path_effects'):
+            self.props['path_effects'] = self.getInputFromPort('path_effects')
+        if self.hasInputFromPort('weight'):
+            self.props['weight'] = self.getInputFromPort('weight')
+        if self.hasInputFromPort('stretch'):
+            self.props['stretch'] = self.getInputFromPort('stretch')
+        if self.hasInputFromPort('fontproperties'):
+            self.props['fontproperties'] = self.getInputFromPort('fontproperties')
+        if self.hasInputFromPort('horizontalalignment'):
+            self.props['horizontalalignment'] = self.getInputFromPort('horizontalalignment')
+        if self.hasInputFromPort('bbox'):
+            self.props['bbox'] = self.getInputFromPort('bbox')
+        if self.hasInputFromPort('backgroundcolor'):
+            self.props['backgroundcolor'] = self.getInputFromPort('backgroundcolor')
+            self.props['backgroundcolor'] = translate_color(self.props['backgroundcolor'])
+        if self.hasInputFromPort('position'):
+            self.props['position'] = self.getInputFromPort('position')
+        if self.hasInputFromPort('y'):
+            self.props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('multialignment'):
+            self.props['multialignment'] = self.getInputFromPort('multialignment')
+        if self.hasInputFromPort('rotation'):
+            self.props['rotation'] = self.getInputFromPort('rotation')
+        if self.hasInputFromPort('size'):
+            self.props['size'] = self.getInputFromPort('size')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplTextWithDashProperties(MplTextProperties):
+    """
+    This is basically a :class:`~matplotlib.text.Text` with a dash
+    (drawn with a :class:`~matplotlib.lines.Line2D`) before/after
+    it. It is intended to be a drop-in replacement for
+    :class:`~matplotlib.text.Text`, and should behave identically to
+    it when *dashlength* = 0.0.
+
+    The dash always comes between the point specified by
+    :meth:`~matplotlib.text.Text.set_position` and the text. When a
+    dash exists, the text alignment arguments (*horizontalalignment*,
+    *verticalalignment*) are ignored.
+
+    *dashlength* is the length of the dash in canvas units.
+    (default = 0.0).
+
+    *dashdirection* is one of 0 or 1, where 0 draws the dash after the
+    text and 1 before.  (default = 0).
+
+    *dashrotation* specifies the rotation of the dash, and should
+    generally stay *None*. In this case
+    :meth:`~matplotlib.text.TextWithDash.get_dashrotation` returns
+    :meth:`~matplotlib.text.Text.get_rotation`.  (I.e., the dash takes
+    its rotation from the text's rotation). Because the text center is
+    projected onto the dash, major deviations in the rotation cause
+    what may be considered visually unappealing results.
+    (default = *None*)
+
+    *dashpad* is a padding length to add (or subtract) space
+    between the text and the dash, in canvas units.
+    (default = 3)
+
+    *dashpush* "pushes" the dash and text away from the point
+    specified by :meth:`~matplotlib.text.Text.set_position` by the
+    amount in canvas units.  (default = 0)
+
+    .. note::
+
+        The alignment of the two objects is based on the bounding box
+        of the :class:`~matplotlib.text.Text`, as obtained by
+        :meth:`~matplotlib.artist.Artist.get_window_extent`.  This, in
+        turn, appears to depend on the font metrics as given by the
+        rendering backend. Hence the quality of the "centering" of the
+        label text with respect to the dash varies depending on the
+        backend used.
+
+    .. note::
+
+        I'm not sure that I got the
+        :meth:`~matplotlib.text.TextWithDash.get_window_extent` right,
+        or whether that's sufficient for providing the object bounding
+        box.
+
+    
+    """
+    _input_ports = [
+              ("dashpush", "basic:Float",
+                {'optional': True, 'docstring': 'Set the "push" of the TextWithDash, which is the extra spacing between the beginning of the dash and the specified position.'}),
+              ("dashdirection", "basic:String",
+                {'optional': True, 'docstring': "Set the direction of the dash following the text. 1 is before the text and 0 is after. The default is 0, which is what you'd want for the typical case of ticks below and on the left of the figure."}),
+              ("linespacing", "basic:String",
+                {'optional': True}),
+              ("figure", "basic:String",
+                {'optional': True, 'docstring': 'Set the figure instance the artist belong to.'}),
+              ("color", "basic:String",
+                {'optional': True}),
+              ("text", "basic:String",
+                {'optional': True, 'defaults': "['']"}),
+              ("verticalalignment", "basic:String",
+                {'optional': True, 'defaults': "['center']"}),
+              ("dashpad", "basic:Float",
+                {'optional': True, 'docstring': 'Set the "pad" of the TextWithDash, which is the extra spacing between the dash and the text, in canvas units.'}),
+              ("dashrotation", "basic:Float",
+                {'optional': True, 'docstring': 'Set the rotation of the dash, in degrees'}),
+              ("transform", "basic:String",
+                {'optional': True, 'docstring': 'Set the :class:`matplotlib.transforms.Transform` instance used by this artist.'}),
+              ("fontproperties", "basic:String",
+                {'optional': True}),
+              ("multialignment", "basic:String",
+                {'optional': True}),
+              ("x", "basic:Float",
+                {'optional': True, 'docstring': 'Set the x position of the :class:`TextWithDash`.'}),
+              ("y", "basic:Float",
+                {'optional': True, 'docstring': 'Set the y position of the :class:`TextWithDash`.'}),
+              ("position", "basic:String",
+                {'optional': True, 'docstring': 'Set the (x, y) position of the :class:`TextWithDash`.'}),
+              ("dashlength", "basic:Float",
+                {'optional': True, 'docstring': 'Set the length of the dash.'}),
+              ("rotation", "basic:String",
+                {'optional': True}),
+              ("horizontalalignment", "basic:String",
+                {'optional': True, 'defaults': "['center']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplTextWithDashProperties)")]
+
+    def __init__(self):
+        MplTextProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplTextProperties.compute(self)
+        if self.hasInputFromPort('dashpush'):
+            self.props['dashpush'] = self.getInputFromPort('dashpush')
+        if self.hasInputFromPort('dashdirection'):
+            self.props['dashdirection'] = self.getInputFromPort('dashdirection')
+        if self.hasInputFromPort('linespacing'):
+            self.constructor_props['linespacing'] = self.getInputFromPort('linespacing')
+        if self.hasInputFromPort('figure'):
+            self.props['figure'] = self.getInputFromPort('figure')
+        if self.hasInputFromPort('color'):
+            self.constructor_props['color'] = self.getInputFromPort('color')
+        if self.hasInputFromPort('text'):
+            self.constructor_props['text'] = self.getInputFromPort('text')
+        if self.hasInputFromPort('verticalalignment'):
+            self.constructor_props['verticalalignment'] = self.getInputFromPort('verticalalignment')
+        if self.hasInputFromPort('dashpad'):
+            self.props['dashpad'] = self.getInputFromPort('dashpad')
+        if self.hasInputFromPort('dashrotation'):
+            self.props['dashrotation'] = self.getInputFromPort('dashrotation')
+        if self.hasInputFromPort('transform'):
+            self.props['transform'] = self.getInputFromPort('transform')
+        if self.hasInputFromPort('fontproperties'):
+            self.constructor_props['fontproperties'] = self.getInputFromPort('fontproperties')
+        if self.hasInputFromPort('multialignment'):
+            self.constructor_props['multialignment'] = self.getInputFromPort('multialignment')
+        if self.hasInputFromPort('x'):
+            self.props['x'] = self.getInputFromPort('x')
+        if self.hasInputFromPort('y'):
+            self.props['y'] = self.getInputFromPort('y')
+        if self.hasInputFromPort('position'):
+            self.props['position'] = self.getInputFromPort('position')
+        if self.hasInputFromPort('dashlength'):
+            self.props['dashlength'] = self.getInputFromPort('dashlength')
+        if self.hasInputFromPort('rotation'):
+            self.constructor_props['rotation'] = self.getInputFromPort('rotation')
+        if self.hasInputFromPort('horizontalalignment'):
+            self.constructor_props['horizontalalignment'] = self.getInputFromPort('horizontalalignment')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplTickProperties(MplArtistProperties):
+    """
+    Abstract base class for the axis ticks, grid lines and labels
+
+    1 refers to the bottom of the plot for xticks and the left for yticks
+    2 refers to the top of the plot for xticks and the right for yticks
+
+    Publicly accessible attributes:
+
+      :attr:`tick1line`
+          a Line2D instance
+
+      :attr:`tick2line`
+          a Line2D instance
+
+      :attr:`gridline`
+          a Line2D instance
+
+      :attr:`label1`
+          a Text instance
+
+      :attr:`label2`
+          a Text instance
+
+      :attr:`gridOn`
+          a boolean which determines whether to draw the tickline
+
+      :attr:`tick1On`
+          a boolean which determines whether to draw the 1st tickline
+
+      :attr:`tick2On`
+          a boolean which determines whether to draw the 2nd tickline
+
+      :attr:`label1On`
+          a boolean which determines whether to draw tick label
+
+      :attr:`label2On`
+          a boolean which determines whether to draw tick label
+
+    
+    """
+    _input_ports = [
+              ("label1On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("loc", "basic:String",
+                {'optional': True}),
+              ("major", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("label2On", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("color", "basic:String",
+                {'optional': True}),
+              ("label1", "basic:String",
+                {'optional': True, 'docstring': 'Set the text of ticklabel'}),
+              ("label2", "basic:String",
+                {'optional': True, 'docstring': 'Set the text of ticklabel2'}),
+              ("axes", "basic:String",
+                {'optional': True}),
+              ("clip_path", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "Set the artist's clip path, which may be:\n\na :class:`~matplotlib.patches.Patch` (or subclass) instance\n\n\n\nNone, to remove the clipping path\n\nFor efficiency, if the path happens to be an axis-aligned rectangle, this method will set the clipping box to the corresponding rectangle and set the clipping path to None.", 'values': "[['(:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`)', ':class:`~ [...]
+              ("label", "basic:String",
+                {'optional': True, 'docstring': 'Set the text of ticklabel'}),
+              ("labelcolor", "basic:String",
+                {'optional': True}),
+              ("tickdir", "basic:String",
+                {'optional': True}),
+              ("pad", "basic:Float",
+                {'optional': True, 'docstring': 'Set the tick label pad in points'}),
+              ("gridOn", "basic:String",
+                {'optional': True}),
+              ("zorder", "basic:String",
+                {'optional': True}),
+              ("tick2On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("labelsize", "basic:String",
+                {'optional': True}),
+              ("width", "basic:String",
+                {'optional': True}),
+              ("tick1On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("size", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplTickProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('label1On'):
+            self.constructor_props['label1On'] = self.getInputFromPort('label1On')
+        if self.hasInputFromPort('loc'):
+            self.constructor_props['loc'] = self.getInputFromPort('loc')
+        if self.hasInputFromPort('major'):
+            self.constructor_props['major'] = self.getInputFromPort('major')
+        if self.hasInputFromPort('label2On'):
+            self.constructor_props['label2On'] = self.getInputFromPort('label2On')
+        if self.hasInputFromPort('color'):
+            self.constructor_props['color'] = self.getInputFromPort('color')
+        if self.hasInputFromPort('label1'):
+            self.props['label1'] = self.getInputFromPort('label1')
+        if self.hasInputFromPort('label2'):
+            self.props['label2'] = self.getInputFromPort('label2')
+        if self.hasInputFromPort('axes'):
+            self.constructor_props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('clip_path'):
+            self.props['clip_path'] = self.getInputFromPort('clip_path')
+        if self.hasInputFromPort('label'):
+            self.props['label'] = self.getInputFromPort('label')
+        if self.hasInputFromPort('labelcolor'):
+            self.constructor_props['labelcolor'] = self.getInputFromPort('labelcolor')
+        if self.hasInputFromPort('tickdir'):
+            self.constructor_props['tickdir'] = self.getInputFromPort('tickdir')
+        if self.hasInputFromPort('pad'):
+            self.props['pad'] = self.getInputFromPort('pad')
+        if self.hasInputFromPort('gridOn'):
+            self.constructor_props['gridOn'] = self.getInputFromPort('gridOn')
+        if self.hasInputFromPort('zorder'):
+            self.constructor_props['zorder'] = self.getInputFromPort('zorder')
+        if self.hasInputFromPort('tick2On'):
+            self.constructor_props['tick2On'] = self.getInputFromPort('tick2On')
+        if self.hasInputFromPort('labelsize'):
+            self.constructor_props['labelsize'] = self.getInputFromPort('labelsize')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('tick1On'):
+            self.constructor_props['tick1On'] = self.getInputFromPort('tick1On')
+        if self.hasInputFromPort('size'):
+            self.constructor_props['size'] = self.getInputFromPort('size')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplXTickProperties(MplTickProperties):
+    """
+    Contains all the Artists needed to make an x tick - the tick line,
+    the label text and the grid line
+    
+    """
+    _input_ports = [
+              ("label1On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("loc", "basic:String",
+                {'optional': True}),
+              ("major", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("label2On", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("color", "basic:String",
+                {'optional': True}),
+              ("axes", "basic:String",
+                {'optional': True}),
+              ("label", "basic:String",
+                {'optional': True}),
+              ("labelcolor", "basic:String",
+                {'optional': True}),
+              ("tickdir", "basic:String",
+                {'optional': True}),
+              ("pad", "basic:String",
+                {'optional': True}),
+              ("gridOn", "basic:String",
+                {'optional': True}),
+              ("zorder", "basic:String",
+                {'optional': True}),
+              ("tick2On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("labelsize", "basic:String",
+                {'optional': True}),
+              ("width", "basic:String",
+                {'optional': True}),
+              ("tick1On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("size", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplXTickProperties)")]
+
+    def __init__(self):
+        MplTickProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplTickProperties.compute(self)
+        if self.hasInputFromPort('label1On'):
+            self.constructor_props['label1On'] = self.getInputFromPort('label1On')
+        if self.hasInputFromPort('loc'):
+            self.constructor_props['loc'] = self.getInputFromPort('loc')
+        if self.hasInputFromPort('major'):
+            self.constructor_props['major'] = self.getInputFromPort('major')
+        if self.hasInputFromPort('label2On'):
+            self.constructor_props['label2On'] = self.getInputFromPort('label2On')
+        if self.hasInputFromPort('color'):
+            self.constructor_props['color'] = self.getInputFromPort('color')
+        if self.hasInputFromPort('axes'):
+            self.constructor_props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('label'):
+            self.constructor_props['label'] = self.getInputFromPort('label')
+        if self.hasInputFromPort('labelcolor'):
+            self.constructor_props['labelcolor'] = self.getInputFromPort('labelcolor')
+        if self.hasInputFromPort('tickdir'):
+            self.constructor_props['tickdir'] = self.getInputFromPort('tickdir')
+        if self.hasInputFromPort('pad'):
+            self.constructor_props['pad'] = self.getInputFromPort('pad')
+        if self.hasInputFromPort('gridOn'):
+            self.constructor_props['gridOn'] = self.getInputFromPort('gridOn')
+        if self.hasInputFromPort('zorder'):
+            self.constructor_props['zorder'] = self.getInputFromPort('zorder')
+        if self.hasInputFromPort('tick2On'):
+            self.constructor_props['tick2On'] = self.getInputFromPort('tick2On')
+        if self.hasInputFromPort('labelsize'):
+            self.constructor_props['labelsize'] = self.getInputFromPort('labelsize')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('tick1On'):
+            self.constructor_props['tick1On'] = self.getInputFromPort('tick1On')
+        if self.hasInputFromPort('size'):
+            self.constructor_props['size'] = self.getInputFromPort('size')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplYTickProperties(MplTickProperties):
+    """
+    Contains all the Artists needed to make a Y tick - the tick line,
+    the label text and the grid line
+    
+    """
+    _input_ports = [
+              ("label1On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("loc", "basic:String",
+                {'optional': True}),
+              ("major", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("label2On", "basic:Boolean",
+                {'optional': True, 'defaults': "['False']"}),
+              ("color", "basic:String",
+                {'optional': True}),
+              ("axes", "basic:String",
+                {'optional': True}),
+              ("label", "basic:String",
+                {'optional': True}),
+              ("labelcolor", "basic:String",
+                {'optional': True}),
+              ("tickdir", "basic:String",
+                {'optional': True}),
+              ("pad", "basic:String",
+                {'optional': True}),
+              ("gridOn", "basic:String",
+                {'optional': True}),
+              ("zorder", "basic:String",
+                {'optional': True}),
+              ("tick2On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("labelsize", "basic:String",
+                {'optional': True}),
+              ("width", "basic:String",
+                {'optional': True}),
+              ("tick1On", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("size", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplYTickProperties)")]
+
+    def __init__(self):
+        MplTickProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplTickProperties.compute(self)
+        if self.hasInputFromPort('label1On'):
+            self.constructor_props['label1On'] = self.getInputFromPort('label1On')
+        if self.hasInputFromPort('loc'):
+            self.constructor_props['loc'] = self.getInputFromPort('loc')
+        if self.hasInputFromPort('major'):
+            self.constructor_props['major'] = self.getInputFromPort('major')
+        if self.hasInputFromPort('label2On'):
+            self.constructor_props['label2On'] = self.getInputFromPort('label2On')
+        if self.hasInputFromPort('color'):
+            self.constructor_props['color'] = self.getInputFromPort('color')
+        if self.hasInputFromPort('axes'):
+            self.constructor_props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('label'):
+            self.constructor_props['label'] = self.getInputFromPort('label')
+        if self.hasInputFromPort('labelcolor'):
+            self.constructor_props['labelcolor'] = self.getInputFromPort('labelcolor')
+        if self.hasInputFromPort('tickdir'):
+            self.constructor_props['tickdir'] = self.getInputFromPort('tickdir')
+        if self.hasInputFromPort('pad'):
+            self.constructor_props['pad'] = self.getInputFromPort('pad')
+        if self.hasInputFromPort('gridOn'):
+            self.constructor_props['gridOn'] = self.getInputFromPort('gridOn')
+        if self.hasInputFromPort('zorder'):
+            self.constructor_props['zorder'] = self.getInputFromPort('zorder')
+        if self.hasInputFromPort('tick2On'):
+            self.constructor_props['tick2On'] = self.getInputFromPort('tick2On')
+        if self.hasInputFromPort('labelsize'):
+            self.constructor_props['labelsize'] = self.getInputFromPort('labelsize')
+        if self.hasInputFromPort('width'):
+            self.constructor_props['width'] = self.getInputFromPort('width')
+        if self.hasInputFromPort('tick1On'):
+            self.constructor_props['tick1On'] = self.getInputFromPort('tick1On')
+        if self.hasInputFromPort('size'):
+            self.constructor_props['size'] = self.getInputFromPort('size')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplAxisProperties(MplArtistProperties):
+    """
+    Public attributes
+
+    * :attr:`axes.transData` - transform data coords to display coords
+    * :attr:`axes.transAxes` - transform axis coords to display coords
+    * :attr:`labelpad` - number of points between the axis and its label
+    
+    """
+    _input_ports = [
+              ("pickradius", "basic:String",
+                {'optional': True, 'docstring': 'Set the depth of the axis used by the picker'}),
+              ("minor_formatter", "basic:String",
+                {'optional': True, 'docstring': 'Set the formatter of the minor ticker'}),
+              ("smart_bounds", "basic:String",
+                {'optional': True, 'docstring': 'set the axis to have smart bounds'}),
+              ("ticksSequence", "basic:List",
+                {'optional': True, 'docstring': 'Set the locations of the tick marks from sequence ticks'}),
+              ("ticksScalar", "basic:Float",
+               {'docstring': 'Set the locations of the tick marks from sequence ticks', 'optional': True}),
+              ("axes", "basic:String",
+                {'optional': True}),
+              ("view_interval", "basic:String",
+                {'optional': True}),
+              ("major_locator", "basic:String",
+                {'optional': True, 'docstring': 'Set the locator of the major ticker'}),
+              ("major_formatter", "basic:String",
+                {'optional': True, 'docstring': 'Set the formatter of the major ticker'}),
+              ("ticklabelsSequence", "basic:List",
+                {'optional': True, 'docstring': '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.\n\nTh [...]
+              ("ticklabelsScalar", "basic:String",
+               {'docstring': '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.\n\nThe input ticklabels  [...]
+              ("clip_path", "basic:String",
+                {'optional': True}),
+              ("minor_locator", "basic:String",
+                {'optional': True, 'docstring': 'Set the locator of the minor ticker'}),
+              ("default_intervals", "basic:String",
+                {'optional': True}),
+              ("scale", "basic:String",
+                {'optional': True}),
+              ("data_interval", "basic:String",
+                {'optional': True, 'docstring': 'set the axis data limits'}),
+              ("label_text", "basic:String",
+                {'optional': True, 'docstring': 'Sets the text value of the axis label'}),
+              ("label_coords", "basic:String",
+                {'optional': True, 'docstring': 'Set the coordinates of the label.  By default, the x coordinate of the y label is determined by the tick label bounding boxes, but this can lead to poor alignment of multiple ylabels if there are multiple axes.  Ditto for the y coodinate of the x label.\n\nYou can also specify the coordinate system of the label with the transform.  If None, the default coordinate system will be the axes coordinate system (0,0) is (left,bottom), (0.5, 0.5)  [...]
+              ("units", "basic:String",
+                {'optional': True, 'docstring': 'set the units for axis'}),
+              ("tick_params", "basic:String",
+                {'optional': True, 'docstring': 'Set appearance parameters for ticks and ticklabels.\n\nFor documentation of keyword arguments, see :meth:`matplotlib.axes.Axes.tick_params`.'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplAxisProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('pickradius'):
+            self.props['pickradius'] = self.getInputFromPort('pickradius')
+        if self.hasInputFromPort('minor_formatter'):
+            self.props['minor_formatter'] = self.getInputFromPort('minor_formatter')
+        if self.hasInputFromPort('smart_bounds'):
+            self.props['smart_bounds'] = self.getInputFromPort('smart_bounds')
+        if self.hasInputFromPort('ticksSequence'):
+            self.props['ticks'] = self.getInputFromPort('ticksSequence')
+        elif self.hasInputFromPort('ticksScalar'):
+            self.props['ticks'] = self.getInputFromPort('ticksScalar')
+        if self.hasInputFromPort('axes'):
+            self.constructor_props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('view_interval'):
+            self.props['view_interval'] = self.getInputFromPort('view_interval')
+        if self.hasInputFromPort('major_locator'):
+            self.props['major_locator'] = self.getInputFromPort('major_locator')
+        if self.hasInputFromPort('major_formatter'):
+            self.props['major_formatter'] = self.getInputFromPort('major_formatter')
+        if self.hasInputFromPort('ticklabelsSequence'):
+            self.props['ticklabels'] = self.getInputFromPort('ticklabelsSequence')
+        elif self.hasInputFromPort('ticklabelsScalar'):
+            self.props['ticklabels'] = self.getInputFromPort('ticklabelsScalar')
+        if self.hasInputFromPort('clip_path'):
+            self.props['clip_path'] = self.getInputFromPort('clip_path')
+        if self.hasInputFromPort('minor_locator'):
+            self.props['minor_locator'] = self.getInputFromPort('minor_locator')
+        if self.hasInputFromPort('default_intervals'):
+            self.props['default_intervals'] = self.getInputFromPort('default_intervals')
+        if self.hasInputFromPort('scale'):
+            self.props['scale'] = self.getInputFromPort('scale')
+        if self.hasInputFromPort('data_interval'):
+            self.props['data_interval'] = self.getInputFromPort('data_interval')
+        if self.hasInputFromPort('label_text'):
+            self.props['label_text'] = self.getInputFromPort('label_text')
+        if self.hasInputFromPort('label_coords'):
+            self.props['label_coords'] = self.getInputFromPort('label_coords')
+        if self.hasInputFromPort('units'):
+            self.props['units'] = self.getInputFromPort('units')
+        if self.hasInputFromPort('tick_params'):
+            self.props['tick_params'] = self.getInputFromPort('tick_params')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplXAxisProperties(MplAxisProperties):
+    """None
+    """
+    _input_ports = [
+              ("view_interval", "basic:String",
+                {'optional': True, 'docstring': 'If ignore is False, the order of vmin, vmax does not matter; the original axis orientation will be preserved. In addition, the view limits can be expanded, but will not be reduced.  This method is for mpl internal use; for normal use, see :meth:`~matplotlib.axes.Axes.set_xlim`.'}),
+              ("ticks_position", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "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. 'none' and 'both' affect only the ticks, not the labels.", 'values': "[['top', 'bottom', 'both', 'default', 'none']]", 'optional': True}),
+              ("axes", "basic:String",
+                {'optional': True}),
+              ("label_position", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the label position (top or bottom)', 'values': "[['top', 'bottom']]", 'optional': True}),
+              ("default_intervals", "basic:String",
+                {'optional': True, 'docstring': 'set the default limits for the axis interval if they are not mutated'}),
+              ("data_interval", "basic:String",
+                {'optional': True, 'docstring': 'set the axis data limits'}),
+              ("pickradius", "basic:Integer",
+                {'optional': True, 'defaults': "['15']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplXAxisProperties)")]
+
+    def __init__(self):
+        MplAxisProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplAxisProperties.compute(self)
+        if self.hasInputFromPort('view_interval'):
+            self.props['view_interval'] = self.getInputFromPort('view_interval')
+        if self.hasInputFromPort('ticks_position'):
+            self.props['ticks_position'] = self.getInputFromPort('ticks_position')
+        if self.hasInputFromPort('axes'):
+            self.constructor_props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('label_position'):
+            self.props['label_position'] = self.getInputFromPort('label_position')
+        if self.hasInputFromPort('default_intervals'):
+            self.props['default_intervals'] = self.getInputFromPort('default_intervals')
+        if self.hasInputFromPort('data_interval'):
+            self.props['data_interval'] = self.getInputFromPort('data_interval')
+        if self.hasInputFromPort('pickradius'):
+            self.constructor_props['pickradius'] = self.getInputFromPort('pickradius')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplYAxisProperties(MplAxisProperties):
+    """None
+    """
+    _input_ports = [
+              ("offset_position", "basic:String",
+                {'optional': True}),
+              ("view_interval", "basic:String",
+                {'optional': True, 'docstring': 'If ignore is False, the order of vmin, vmax does not matter; the original axis orientation will be preserved. In addition, the view limits can be expanded, but will not be reduced.  This method is for mpl internal use; for normal use, see :meth:`~matplotlib.axes.Axes.set_ylim`.'}),
+              ("ticks_position", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "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.", 'values': "[['left', 'right', 'both', 'default', 'none']]", 'optional': True}),
+              ("axes", "basic:String",
+                {'optional': True}),
+              ("label_position", "basic:String",
+                {'entry_types': "['enum']", 'docstring': 'Set the label position (left or right)', 'values': "[['left', 'right']]", 'optional': True}),
+              ("default_intervals", "basic:String",
+                {'optional': True, 'docstring': 'set the default limits for the axis interval if they are not mutated'}),
+              ("data_interval", "basic:String",
+                {'optional': True, 'docstring': 'set the axis data limits'}),
+              ("pickradius", "basic:Integer",
+                {'optional': True, 'defaults': "['15']"}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplYAxisProperties)")]
+
+    def __init__(self):
+        MplAxisProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplAxisProperties.compute(self)
+        if self.hasInputFromPort('offset_position'):
+            self.props['offset_position'] = self.getInputFromPort('offset_position')
+        if self.hasInputFromPort('view_interval'):
+            self.props['view_interval'] = self.getInputFromPort('view_interval')
+        if self.hasInputFromPort('ticks_position'):
+            self.props['ticks_position'] = self.getInputFromPort('ticks_position')
+        if self.hasInputFromPort('axes'):
+            self.constructor_props['axes'] = self.getInputFromPort('axes')
+        if self.hasInputFromPort('label_position'):
+            self.props['label_position'] = self.getInputFromPort('label_position')
+        if self.hasInputFromPort('default_intervals'):
+            self.props['default_intervals'] = self.getInputFromPort('default_intervals')
+        if self.hasInputFromPort('data_interval'):
+            self.props['data_interval'] = self.getInputFromPort('data_interval')
+        if self.hasInputFromPort('pickradius'):
+            self.constructor_props['pickradius'] = self.getInputFromPort('pickradius')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplLegendProperties(MplArtistProperties):
+    """
+    Place a legend on the axes at location loc.  Labels are a
+    sequence of strings and loc can be a string or an integer
+    specifying the legend location
+
+    The location codes are::
+
+      'best'         : 0, (only implemented for axis legends)
+      'upper right'  : 1,
+      'upper left'   : 2,
+      'lower left'   : 3,
+      'lower right'  : 4,
+      'right'        : 5,
+      'center left'  : 6,
+      'center right' : 7,
+      'lower center' : 8,
+      'upper center' : 9,
+      'center'       : 10,
+
+    loc can be a tuple of the noramilzed coordinate values with
+    respect its parent.
+
+    
+    """
+    _input_ports = [
+              ("fancybox", "basic:String",
+                {'optional': True}),
+              ("handlelength", "basic:String",
+                {'optional': True}),
+              ("labels", "basic:String",
+                {'optional': True}),
+              ("labelspacing", "basic:String",
+                {'optional': True}),
+              ("columnspacing", "basic:String",
+                {'optional': True}),
+              ("handletextpad", "basic:String",
+                {'optional': True}),
+              ("ncol", "basic:Integer",
+                {'optional': True, 'defaults': "['1']"}),
+              ("borderaxespad", "basic:String",
+                {'optional': True}),
+              ("loc", "basic:String",
+                {'optional': True}),
+              ("bbox_to_anchor", "basic:String",
+                {'optional': True, 'docstring': 'set the bbox that the legend will be anchored.\n\nbbox can be a BboxBase instance, a tuple of [left, bottom, width, height] in the given transform (normalized axes coordinate if None), or a tuple of [left, bottom] where the width and height will be assumed to be zero.'}),
+              ("title", "basic:String",
+                {'optional': True, 'docstring': 'set the legend title. Fontproperties can be optionally set with prop parameter.'}),
+              ("handletextsep", "basic:String",
+                {'optional': True}),
+              ("numpoints", "basic:String",
+                {'optional': True}),
+              ("prop", "basic:String",
+                {'optional': True}),
+              ("handles", "basic:String",
+                {'optional': True}),
+              ("pad", "basic:String",
+                {'optional': True}),
+              ("borderpad", "basic:String",
+                {'optional': True}),
+              ("parent", "basic:String",
+                {'optional': True}),
+              ("axespad", "basic:String",
+                {'optional': True}),
+              ("labelsep", "basic:String",
+                {'optional': True}),
+              ("frame_on", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether the legend box patch is drawn'}),
+              ("scatterpoints", "basic:Integer",
+                {'optional': True, 'defaults': "['3']"}),
+              ("fontsize", "basic:String",
+                {'optional': True}),
+              ("shadow", "basic:String",
+                {'optional': True}),
+              ("handler_map", "basic:String",
+                {'optional': True}),
+              ("handleheight", "basic:String",
+                {'optional': True}),
+              ("scatteryoffsets", "basic:String",
+                {'optional': True}),
+              ("markerscale", "basic:String",
+                {'optional': True}),
+              ("frameon", "basic:String",
+                {'optional': True}),
+              ("mode", "basic:String",
+                {'optional': True}),
+              ("handlelen", "basic:String",
+                {'optional': True}),
+              ("default_handler_map", "basic:String",
+                {'optional': True, 'docstring': 'A class method to set the default handler map.'}),
+              ("bbox_transform", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplLegendProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('fancybox'):
+            self.constructor_props['fancybox'] = self.getInputFromPort('fancybox')
+        if self.hasInputFromPort('handlelength'):
+            self.constructor_props['handlelength'] = self.getInputFromPort('handlelength')
+        if self.hasInputFromPort('labels'):
+            self.constructor_props['labels'] = self.getInputFromPort('labels')
+        if self.hasInputFromPort('labelspacing'):
+            self.constructor_props['labelspacing'] = self.getInputFromPort('labelspacing')
+        if self.hasInputFromPort('columnspacing'):
+            self.constructor_props['columnspacing'] = self.getInputFromPort('columnspacing')
+        if self.hasInputFromPort('handletextpad'):
+            self.constructor_props['handletextpad'] = self.getInputFromPort('handletextpad')
+        if self.hasInputFromPort('ncol'):
+            self.constructor_props['ncol'] = self.getInputFromPort('ncol')
+        if self.hasInputFromPort('borderaxespad'):
+            self.constructor_props['borderaxespad'] = self.getInputFromPort('borderaxespad')
+        if self.hasInputFromPort('loc'):
+            self.constructor_props['loc'] = self.getInputFromPort('loc')
+        if self.hasInputFromPort('bbox_to_anchor'):
+            self.props['bbox_to_anchor'] = self.getInputFromPort('bbox_to_anchor')
+        if self.hasInputFromPort('title'):
+            self.props['title'] = self.getInputFromPort('title')
+        if self.hasInputFromPort('handletextsep'):
+            self.constructor_props['handletextsep'] = self.getInputFromPort('handletextsep')
+        if self.hasInputFromPort('numpoints'):
+            self.constructor_props['numpoints'] = self.getInputFromPort('numpoints')
+        if self.hasInputFromPort('prop'):
+            self.constructor_props['prop'] = self.getInputFromPort('prop')
+        if self.hasInputFromPort('handles'):
+            self.constructor_props['handles'] = self.getInputFromPort('handles')
+        if self.hasInputFromPort('pad'):
+            self.constructor_props['pad'] = self.getInputFromPort('pad')
+        if self.hasInputFromPort('borderpad'):
+            self.constructor_props['borderpad'] = self.getInputFromPort('borderpad')
+        if self.hasInputFromPort('parent'):
+            self.constructor_props['parent'] = self.getInputFromPort('parent')
+        if self.hasInputFromPort('axespad'):
+            self.constructor_props['axespad'] = self.getInputFromPort('axespad')
+        if self.hasInputFromPort('labelsep'):
+            self.constructor_props['labelsep'] = self.getInputFromPort('labelsep')
+        if self.hasInputFromPort('frame_on'):
+            self.props['frame_on'] = self.getInputFromPort('frame_on')
+        if self.hasInputFromPort('scatterpoints'):
+            self.constructor_props['scatterpoints'] = self.getInputFromPort('scatterpoints')
+        if self.hasInputFromPort('fontsize'):
+            self.constructor_props['fontsize'] = self.getInputFromPort('fontsize')
+        if self.hasInputFromPort('shadow'):
+            self.constructor_props['shadow'] = self.getInputFromPort('shadow')
+        if self.hasInputFromPort('handler_map'):
+            self.constructor_props['handler_map'] = self.getInputFromPort('handler_map')
+        if self.hasInputFromPort('handleheight'):
+            self.constructor_props['handleheight'] = self.getInputFromPort('handleheight')
+        if self.hasInputFromPort('scatteryoffsets'):
+            self.constructor_props['scatteryoffsets'] = self.getInputFromPort('scatteryoffsets')
+        if self.hasInputFromPort('markerscale'):
+            self.constructor_props['markerscale'] = self.getInputFromPort('markerscale')
+        if self.hasInputFromPort('frameon'):
+            self.constructor_props['frameon'] = self.getInputFromPort('frameon')
+        if self.hasInputFromPort('mode'):
+            self.constructor_props['mode'] = self.getInputFromPort('mode')
+        if self.hasInputFromPort('handlelen'):
+            self.constructor_props['handlelen'] = self.getInputFromPort('handlelen')
+        if self.hasInputFromPort('default_handler_map'):
+            self.props['default_handler_map'] = self.getInputFromPort('default_handler_map')
+        if self.hasInputFromPort('bbox_transform'):
+            self.constructor_props['bbox_transform'] = self.getInputFromPort('bbox_transform')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplAxesProperties(MplArtistProperties):
+    """
+    The :class:`Axes` contains most of the figure elements:
+    :class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axis.Tick`,
+    :class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.text.Text`,
+    :class:`~matplotlib.patches.Polygon`, etc., and sets the
+    coordinate system.
+
+    The :class:`Axes` instance supports callbacks through a callbacks
+    attribute which is a :class:`~matplotlib.cbook.CallbackRegistry`
+    instance.  The events you can connect to are 'xlim_changed' and
+    'ylim_changed' and the callback will be called with func(*ax*)
+    where *ax* is the :class:`Axes` instance.
+    
+    """
+    _input_ports = [
+              ("adjustable", "basic:String",
+                {'entry_types': "['enum']", 'values': "[['box', 'datalim', 'box-forced']]", 'optional': True}),
+              ("cursor_props", "basic:Float",
+                {'optional': True, 'docstring': 'Set the cursor property as:\n\nax.set_cursor_props(linewidth, color)\n\nor:\n\nax.set_cursor_props((linewidth, color))'}),
+              ("figure", "basic:String",
+                {'optional': True, 'docstring': 'Set the class:~matplotlib.axes.Axes figure\n\naccepts a class:~matplotlib.figure.Figure instance'}),
+              ("yscale", "basic:String",
+                {'optional': True, 'docstring': "Call signature:\n\nset_yscale(value)\n\nSet the scaling of the y-axis: 'linear' | 'log' | 'symlog' Different kwargs are accepted, depending on the scale: 'linear'\n\n'log'\n\n\n\n'symlog'"}),
+              ("navigate", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether the axes responds to navigation toolbar commands'}),
+              ("aspect", "basic:String",
+                {'entry_types': "['enum']", 'docstring': "aspect\n\n\n\nadjustable\n\n\n\n'box' does not allow axes sharing, as this can cause unintended side effect. For cases when sharing axes is fine, use 'box-forced'.\n\nanchor", 'values': "[['auto', 'normal', 'equal', 'num']]", 'optional': True}),
+              ("axis_bgcolor", "basic:Color",
+                {'optional': True, 'docstring': 'set the axes background color'}),
+              ("ylimSequence", "basic:List",
+                {'optional': True, 'docstring': 'Call signature:\n\nset_ylim(self, *args, **kwargs):\n\nSet the data limits for the yaxis\n\nExamples:\n\nset_ylim((bottom, top)) set_ylim(bottom, top) set_ylim(bottom=1) # top unchanged set_ylim(top=1) # bottom unchanged\n\nKeyword arguments:\n\n\n\nNote, 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:\n\nset_ylim(5000, 0)\n\nso 5000 m depth is  [...]
+              ("ylimScalar", "basic:Float",
+               {'docstring': 'Call signature:\n\nset_ylim(self, *args, **kwargs):\n\nSet the data limits for the yaxis\n\nExamples:\n\nset_ylim((bottom, top)) set_ylim(bottom, top) set_ylim(bottom=1) # top unchanged set_ylim(top=1) # bottom unchanged\n\nKeyword arguments:\n\n\n\nNote, 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:\n\nset_ylim(5000, 0)\n\nso 5000 m depth is at the bottom of th [...]
+              ("sharey", "basic:String",
+                {'optional': True}),
+              ("xlimSequence", "basic:List",
+                {'optional': True, 'docstring': 'Call signature:\n\nset_xlim(self, *args, **kwargs):\n\nSet the data limits for the xaxis\n\nExamples:\n\nset_xlim((left, right)) set_xlim(left, right) set_xlim(left=1) # right unchanged set_xlim(right=1) # left unchanged\n\nKeyword arguments:\n\n\n\nNote, 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:\n\nset_ylim(5000, 0)\n\nso 5000 years ago [...]
+              ("xlimScalar", "basic:Float",
+               {'docstring': 'Call signature:\n\nset_xlim(self, *args, **kwargs):\n\nSet the data limits for the xaxis\n\nExamples:\n\nset_xlim((left, right)) set_xlim(left, right) set_xlim(left=1) # right unchanged set_xlim(right=1) # left unchanged\n\nKeyword arguments:\n\n\n\nNote, 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:\n\nset_ylim(5000, 0)\n\nso 5000 years ago is on the left of  [...]
+              ("axis_on", "basic:String",
+                {'optional': True, 'docstring': 'turn on the axis'}),
+              ("title", "basic:String",
+                {'optional': True, 'docstring': 'Call signature:\n\nset_title(label, fontdict=None, **kwargs):\n\nSet the title for the axes.'}),
+              ("axisbg", "basic:String",
+                {'optional': True}),
+              ("label", "basic:String",
+                {'optional': True, 'defaults': "['']"}),
+              ("xticks", "basic:List",
+                {'optional': True, 'docstring': 'Set the x ticks with list of ticks'}),
+              ("fig", "basic:String",
+                {'optional': True}),
+              ("ylabel", "basic:String",
+                {'optional': True, 'docstring': 'Call signature:\n\nset_ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)\n\nSet the label for the yaxis\n\nlabelpad is the spacing in points between the label and the y-axis'}),
+              ("autoscalex_on", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether autoscaling for the x-axis is applied on plot commands'}),
+              ("rasterization_zorder", "basic:String",
+                {'optional': True, 'docstring': 'Set zorder value below which artists will be rasterized.  Set to None to disable rasterizing of artists below a particular zorder.'}),
+              ("axes_locator", "basic:String",
+                {'optional': True, 'docstring': 'set axes_locator'}),
+              ("axisbelow", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether the axis ticks and gridlines are above or below most artists'}),
+              ("frame_on", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether the axes rectangle patch is drawn'}),
+              ("navigate_mode", "basic:String",
+                {'optional': True, 'docstring': 'Set the navigation toolbar button status;\n\nthis is not a user-API function.'}),
+              ("xscale", "basic:String",
+                {'optional': True, 'docstring': "Call signature:\n\nset_xscale(value)\n\nSet the scaling of the x-axis: 'linear' | 'log' | 'symlog' Different kwargs are accepted, depending on the scale: 'linear'\n\n'log'\n\n\n\n'symlog'"}),
+              ("axis_off", "basic:String",
+                {'optional': True, 'docstring': 'turn off the axis'}),
+              ("autoscale_on", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether autoscaling is applied on plot commands'}),
+              ("ybound", "basic:String",
+                {'optional': True, 'docstring': '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.'}),
+              ("rect", "basic:String",
+                {'optional': True}),
+              ("sharex", "basic:String",
+                {'optional': True}),
+              ("yticklabelsSequence", "basic:List",
+                {'optional': True, 'docstring': "Call signature:\n\nset_yticklabels(labels, fontdict=None, minor=False, **kwargs)\n\nSet the y tick labels with list of strings labels.  Return a list of :class:`~matplotlib.text.Text` instances.\n\nkwargs set :class:`~matplotlib.text.Text` properties for the labels. Valid properties are\n\nagg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgrou [...]
+              ("yticklabelsScalar", "basic:String",
+               {'docstring': "Call signature:\n\nset_yticklabels(labels, fontdict=None, minor=False, **kwargs)\n\nSet the y tick labels with list of strings labels.  Return a list of :class:`~matplotlib.text.Text` instances.\n\nkwargs set :class:`~matplotlib.text.Text` properties for the labels. Valid properties are\n\nagg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplo [...]
+              ("autoscaley_on", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether autoscaling for the y-axis is applied on plot commands'}),
+              ("xmargin", "basic:Float",
+                {'optional': True, 'docstring': 'Set padding of X data limits prior to autoscaling.\n\nm times the data interval will be added to each end of that interval before it is used in autoscaling.'}),
+              ("color_cycle", "basic:Color",
+                {'optional': True, 'docstring': 'Set the color cycle for any future plot commands on this Axes.\n\nclist is a list of mpl color specifiers.'}),
+              ("frameon", "basic:Boolean",
+                {'optional': True, 'defaults': "['True']"}),
+              ("xlabel", "basic:String",
+                {'optional': True, 'docstring': 'Call signature:\n\nset_xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)\n\nSet the label for the xaxis.\n\nlabelpad is the spacing in points between the label and the x-axis'}),
+              ("xbound", "basic:String",
+                {'optional': True, 'docstring': '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.'}),
+              ("yticks", "basic:List",
+                {'optional': True, 'docstring': 'Set the y ticks with list of ticks Keyword arguments:'}),
+              ("ymargin", "basic:Float",
+                {'optional': True, 'docstring': 'Set padding of Y data limits prior to autoscaling.\n\nm times the data interval will be added to each end of that interval before it is used in autoscaling.'}),
+              ("position", "basic:String",
+                {'optional': True, 'docstring': 'Set the axes position with:\n\npos = [left, bottom, width, height]\n\nin relative 0,1 coords, or pos can be a :class:`~matplotlib.transforms.Bbox`\n\nThere are two position variables: one which is ultimately used, but which may be modified by :meth:`apply_aspect`, and a second which is the starting point for :meth:`apply_aspect`.'}),
+              ("anchor", "basic:String",
+                {'docstring': 'anchor', 'values': "[['Center', 'bottom left', 'bottom', 'bottom right', 'right', 'top right', 'top', 'top left', 'left']]", 'optional': True}),
+              ("xticklabelsSequence", "basic:List",
+                {'optional': True, 'docstring': "Call signature:\n\nset_xticklabels(labels, fontdict=None, minor=False, **kwargs)\n\nSet the xtick labels with list of strings labels. Return a list of axis text instances.\n\nkwargs set the :class:`~matplotlib.text.Text` properties. Valid properties are\n\nagg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplotlib color bbox [...]
+              ("xticklabelsScalar", "basic:String",
+               {'docstring': "Call signature:\n\nset_xticklabels(labels, fontdict=None, minor=False, **kwargs)\n\nSet the xtick labels with list of strings labels. Return a list of axis text instances.\n\nkwargs set the :class:`~matplotlib.text.Text` properties. Valid properties are\n\nagg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplotlib color bbox: rectangle prop di [...]
+              ("titleProperties", "MplTextProperties",
+                {}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplAxesProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('adjustable'):
+            self.props['adjustable'] = self.getInputFromPort('adjustable')
+        if self.hasInputFromPort('cursor_props'):
+            self.props['cursor_props'] = self.getInputFromPort('cursor_props')
+        if self.hasInputFromPort('figure'):
+            self.props['figure'] = self.getInputFromPort('figure')
+        if self.hasInputFromPort('yscale'):
+            self.props['yscale'] = self.getInputFromPort('yscale')
+        if self.hasInputFromPort('navigate'):
+            self.props['navigate'] = self.getInputFromPort('navigate')
+        if self.hasInputFromPort('aspect'):
+            self.props['aspect'] = self.getInputFromPort('aspect')
+        if self.hasInputFromPort('axis_bgcolor'):
+            self.props['axis_bgcolor'] = self.getInputFromPort('axis_bgcolor')
+            self.props['axis_bgcolor'] = translate_color(self.props['axis_bgcolor'])
+        if self.hasInputFromPort('ylimSequence'):
+            self.props['ylim'] = self.getInputFromPort('ylimSequence')
+        elif self.hasInputFromPort('ylimScalar'):
+            self.props['ylim'] = self.getInputFromPort('ylimScalar')
+        if self.hasInputFromPort('sharey'):
+            self.constructor_props['sharey'] = self.getInputFromPort('sharey')
+        if self.hasInputFromPort('xlimSequence'):
+            self.props['xlim'] = self.getInputFromPort('xlimSequence')
+        elif self.hasInputFromPort('xlimScalar'):
+            self.props['xlim'] = self.getInputFromPort('xlimScalar')
+        if self.hasInputFromPort('axis_on'):
+            self.props['axis_on'] = self.getInputFromPort('axis_on')
+        if self.hasInputFromPort('title'):
+            self.props['title'] = self.getInputFromPort('title')
+        if self.hasInputFromPort('axisbg'):
+            self.constructor_props['axisbg'] = self.getInputFromPort('axisbg')
+        if self.hasInputFromPort('label'):
+            self.constructor_props['label'] = self.getInputFromPort('label')
+        if self.hasInputFromPort('xticks'):
+            self.props['xticks'] = self.getInputFromPort('xticks')
+        if self.hasInputFromPort('fig'):
+            self.constructor_props['fig'] = self.getInputFromPort('fig')
+        if self.hasInputFromPort('ylabel'):
+            self.props['ylabel'] = self.getInputFromPort('ylabel')
+        if self.hasInputFromPort('autoscalex_on'):
+            self.props['autoscalex_on'] = self.getInputFromPort('autoscalex_on')
+        if self.hasInputFromPort('rasterization_zorder'):
+            self.props['rasterization_zorder'] = self.getInputFromPort('rasterization_zorder')
+        if self.hasInputFromPort('axes_locator'):
+            self.props['axes_locator'] = self.getInputFromPort('axes_locator')
+        if self.hasInputFromPort('axisbelow'):
+            self.props['axisbelow'] = self.getInputFromPort('axisbelow')
+        if self.hasInputFromPort('frame_on'):
+            self.props['frame_on'] = self.getInputFromPort('frame_on')
+        if self.hasInputFromPort('navigate_mode'):
+            self.props['navigate_mode'] = self.getInputFromPort('navigate_mode')
+        if self.hasInputFromPort('xscale'):
+            self.props['xscale'] = self.getInputFromPort('xscale')
+        if self.hasInputFromPort('axis_off'):
+            self.props['axis_off'] = self.getInputFromPort('axis_off')
+        if self.hasInputFromPort('autoscale_on'):
+            self.props['autoscale_on'] = self.getInputFromPort('autoscale_on')
+        if self.hasInputFromPort('ybound'):
+            self.props['ybound'] = self.getInputFromPort('ybound')
+        if self.hasInputFromPort('rect'):
+            self.constructor_props['rect'] = self.getInputFromPort('rect')
+        if self.hasInputFromPort('sharex'):
+            self.constructor_props['sharex'] = self.getInputFromPort('sharex')
+        if self.hasInputFromPort('yticklabelsSequence'):
+            self.props['yticklabels'] = self.getInputFromPort('yticklabelsSequence')
+        elif self.hasInputFromPort('yticklabelsScalar'):
+            self.props['yticklabels'] = self.getInputFromPort('yticklabelsScalar')
+        if self.hasInputFromPort('autoscaley_on'):
+            self.props['autoscaley_on'] = self.getInputFromPort('autoscaley_on')
+        if self.hasInputFromPort('xmargin'):
+            self.props['xmargin'] = self.getInputFromPort('xmargin')
+        if self.hasInputFromPort('color_cycle'):
+            self.props['color_cycle'] = self.getInputFromPort('color_cycle')
+            self.props['color_cycle'] = translate_color(self.props['color_cycle'])
+        if self.hasInputFromPort('frameon'):
+            self.constructor_props['frameon'] = self.getInputFromPort('frameon')
+        if self.hasInputFromPort('xlabel'):
+            self.props['xlabel'] = self.getInputFromPort('xlabel')
+        if self.hasInputFromPort('xbound'):
+            self.props['xbound'] = self.getInputFromPort('xbound')
+        if self.hasInputFromPort('yticks'):
+            self.props['yticks'] = self.getInputFromPort('yticks')
+        if self.hasInputFromPort('ymargin'):
+            self.props['ymargin'] = self.getInputFromPort('ymargin')
+        if self.hasInputFromPort('position'):
+            self.props['position'] = self.getInputFromPort('position')
+        if self.hasInputFromPort('anchor'):
+            self.props['anchor'] = self.getInputFromPort('anchor')
+            self.props['anchor'] = translate_MplAxesProperties_anchor(self.props['anchor'])
+        if self.hasInputFromPort('xticklabelsSequence'):
+            self.props['xticklabels'] = self.getInputFromPort('xticklabelsSequence')
+        elif self.hasInputFromPort('xticklabelsScalar'):
+            self.props['xticklabels'] = self.getInputFromPort('xticklabelsScalar')
+        if self.hasInputFromPort('titleProperties'):
+            self.sub_props['title'] = self.getInputFromPort('titleProperties')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+        if not matplotlib.cbook.iterable(objs):
+            objs = [objs]
+        else:
+            objs = matplotlib.cbook.flatten(objs)
+        for obj in objs:
+            if 'title' in self.sub_props:
+                self.sub_props['title'].update_props(obj.title)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplAxesSubplotProperties(MplAxesProperties):
+    """None
+    """
+    _input_ports = [
+              ("fig", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplAxesSubplotProperties)")]
+
+    def __init__(self):
+        MplAxesProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplAxesProperties.compute(self)
+        if self.hasInputFromPort('fig'):
+            self.constructor_props['fig'] = self.getInputFromPort('fig')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplFigureProperties(MplArtistProperties):
+    """
+    The Figure instance supports callbacks through a *callbacks*
+    attribute which is a :class:`matplotlib.cbook.CallbackRegistry`
+    instance.  The events you can connect to are 'dpi_changed', and
+    the callback will be called with ``func(fig)`` where fig is the
+    :class:`Figure` instance.
+
+    *patch*
+       The figure patch is drawn by a
+       :class:`matplotlib.patches.Rectangle` instance
+
+    *suppressComposite*
+       For multiple figure images, the figure will make composite
+       images depending on the renderer option_image_nocomposite
+       function.  If suppressComposite is True|False, this will
+       override the renderer.
+    
+    """
+    _input_ports = [
+              ("edgecolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the edge color of the Figure rectangle'}),
+              ("canvas", "basic:String",
+                {'optional': True, 'docstring': 'Set the canvas the contains the figure'}),
+              ("facecolor", "basic:Color",
+                {'optional': True, 'docstring': 'Set the face color of the Figure rectangle'}),
+              ("size_inches", "basic:String",
+                {'optional': True, 'docstring': 'set_size_inches(w,h, forward=False)\n\nSet the figure size in inches\n\nUsage:\n\nfig.set_size_inches(w,h)  # OR fig.set_size_inches((w,h) )\n\noptional kwarg forward=True will cause the canvas size to be automatically updated; eg you can resize the figure window from the shell'}),
+              ("figwidth", "basic:Float",
+                {'optional': True, 'docstring': 'Set the width of the figure in inches'}),
+              ("frameon", "basic:Boolean",
+                {'optional': True, 'docstring': 'Set whether the figure frame (background) is displayed or invisible'}),
+              ("subplotpars", "basic:String",
+                {'optional': True}),
+              ("figheight", "basic:Float",
+                {'optional': True, 'docstring': 'Set the height of the figure in inches'}),
+              ("figsize", "basic:String",
+                {'optional': True}),
+              ("linewidth", "basic:Float",
+                {'optional': True, 'defaults': "['0.0']"}),
+              ("tight_layout", "basic:Boolean",
+                {'optional': True, 'docstring': "Set whether :meth:`tight_layout` is used upon drawing. If None, the rcParams['figure.autolayout'] value will be set."}),
+              ("dpi", "basic:Float",
+                {'optional': True, 'docstring': 'Set the dots-per-inch of the figure'}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplFigureProperties)")]
+
+    def __init__(self):
+        MplArtistProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplArtistProperties.compute(self)
+        if self.hasInputFromPort('edgecolor'):
+            self.props['edgecolor'] = self.getInputFromPort('edgecolor')
+            self.props['edgecolor'] = translate_color(self.props['edgecolor'])
+        if self.hasInputFromPort('canvas'):
+            self.props['canvas'] = self.getInputFromPort('canvas')
+        if self.hasInputFromPort('facecolor'):
+            self.props['facecolor'] = self.getInputFromPort('facecolor')
+            self.props['facecolor'] = translate_color(self.props['facecolor'])
+        if self.hasInputFromPort('size_inches'):
+            self.props['size_inches'] = self.getInputFromPort('size_inches')
+        if self.hasInputFromPort('figwidth'):
+            self.props['figwidth'] = self.getInputFromPort('figwidth')
+        if self.hasInputFromPort('frameon'):
+            self.props['frameon'] = self.getInputFromPort('frameon')
+        if self.hasInputFromPort('subplotpars'):
+            self.constructor_props['subplotpars'] = self.getInputFromPort('subplotpars')
+        if self.hasInputFromPort('figheight'):
+            self.props['figheight'] = self.getInputFromPort('figheight')
+        if self.hasInputFromPort('figsize'):
+            self.constructor_props['figsize'] = self.getInputFromPort('figsize')
+        if self.hasInputFromPort('linewidth'):
+            self.constructor_props['linewidth'] = self.getInputFromPort('linewidth')
+        if self.hasInputFromPort('tight_layout'):
+            self.props['tight_layout'] = self.getInputFromPort('tight_layout')
+        if self.hasInputFromPort('dpi'):
+            self.props['dpi'] = self.getInputFromPort('dpi')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+class MplAnnotationProperties(MplTextProperties):
+    """
+    A :class:`~matplotlib.text.Text` class to make annotating things
+    in the figure, such as :class:`~matplotlib.figure.Figure`,
+    :class:`~matplotlib.axes.Axes`,
+    :class:`~matplotlib.patches.Rectangle`, etc., easier.
+    
+    """
+    _input_ports = [
+              ("xycoords", "basic:String",
+                {'entry_types': "['enum']", 'values': "[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]", 'optional': True, 'defaults': "['data']"}),
+              ("figure", "basic:String",
+                {'optional': True}),
+              ("annotation_clip", "basic:String",
+                {'optional': True}),
+              ("xytext", "basic:String",
+                {'optional': True}),
+              ("s", "basic:String",
+                {'optional': True}),
+              ("xy", "basic:String",
+                {'optional': True}),
+              ("textcoords", "basic:String",
+                {'entry_types': "['enum']", 'values': "[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]", 'optional': True}),
+              ("arrowprops", "basic:String",
+                {'optional': True}),
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(MplAnnotationProperties)")]
+
+    def __init__(self):
+        MplTextProperties.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+
+    def compute(self):
+        MplTextProperties.compute(self)
+        if self.hasInputFromPort('xycoords'):
+            self.constructor_props['xycoords'] = self.getInputFromPort('xycoords')
+        if self.hasInputFromPort('figure'):
+            self.props['figure'] = self.getInputFromPort('figure')
+        if self.hasInputFromPort('annotation_clip'):
+            self.constructor_props['annotation_clip'] = self.getInputFromPort('annotation_clip')
+        if self.hasInputFromPort('xytext'):
+            self.constructor_props['xytext'] = self.getInputFromPort('xytext')
+        if self.hasInputFromPort('s'):
+            self.constructor_props['s'] = self.getInputFromPort('s')
+        if self.hasInputFromPort('xy'):
+            self.constructor_props['xy'] = self.getInputFromPort('xy')
+        if self.hasInputFromPort('textcoords'):
+            self.constructor_props['textcoords'] = self.getInputFromPort('textcoords')
+        if self.hasInputFromPort('arrowprops'):
+            self.constructor_props['arrowprops'] = self.getInputFromPort('arrowprops')
+
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+
+_modules = [
+            MplArtistProperties,
+            Mpl_AxesImageBaseProperties,
+            MplAxesImageProperties,
+            MplNonUniformImageProperties,
+            MplBboxImageProperties,
+            MplPcolorImageProperties,
+            MplFigureImageProperties,
+            MplCollectionProperties,
+            MplPathCollectionProperties,
+            MplPolyCollectionProperties,
+            MplBrokenBarHCollectionProperties,
+            MplRegularPolyCollectionProperties,
+            MplStarPolygonCollectionProperties,
+            MplAsteriskPolygonCollectionProperties,
+            MplLineCollectionProperties,
+            MplCircleCollectionProperties,
+            MplEllipseCollectionProperties,
+            MplPatchCollectionProperties,
+            MplTriMeshProperties,
+            MplQuadMeshProperties,
+            MplPatchProperties,
+            MplShadowProperties,
+            MplRectangleProperties,
+            MplRegularPolygonProperties,
+            MplCirclePolygonProperties,
+            MplPathPatchProperties,
+            MplPolygonProperties,
+            MplFancyArrowProperties,
+            MplWedgeProperties,
+            MplArrowProperties,
+            MplYAArrowProperties,
+            MplEllipseProperties,
+            MplCircleProperties,
+            MplArcProperties,
+            MplFancyBboxPatchProperties,
+            MplFancyArrowPatchProperties,
+            MplConnectionPatchProperties,
+            MplLine2DProperties,
+            MplTextProperties,
+            MplTextWithDashProperties,
+            MplTickProperties,
+            MplXTickProperties,
+            MplYTickProperties,
+            MplAxisProperties,
+            MplXAxisProperties,
+            MplYAxisProperties,
+            MplLegendProperties,
+            MplAxesProperties,
+            MplAxesSubplotProperties,
+            MplFigureProperties,
+            MplAnnotationProperties,
+]
diff --git a/vistrails/packages/matplotlib/artists_template.py.mako b/vistrails/packages/matplotlib/artists_template.py.mako
new file mode 100644
index 0000000..af51b1d
--- /dev/null
+++ b/vistrails/packages/matplotlib/artists_template.py.mako
@@ -0,0 +1,170 @@
+from vistrails.core.modules.vistrails_module import Module
+from bases import MplProperties
+import matplotlib.artist
+import matplotlib.cbook
+
+% if specs.custom_code:
+${specs.custom_code}
+% endif
+
+<%def name="get_props(t_ps)">\
+% if t_ps.constructor_arg:
+self.constructor_props['${t_ps.arg}']\
+% else:
+self.props['${t_ps.arg}']\
+% endif
+</%def>
+
+<%def name="do_translate(t_spec, t_ps, t_core_ps=None)">\
+<%
+if t_core_ps is None:
+    t_core_ps = t_ps
+%>\
+% if type(t_ps.translations) == dict:
+${get_props(t_core_ps)} = translate_${t_spec.name}_${t_ps.name}(${get_props(t_core_ps)})\
+% else:
+${get_props(t_core_ps)} = ${t_ps.translations}(${get_props(t_core_ps)})\
+% endif
+</%def>
+
+def translate_color(c):
+    return c.tuple
+
+% for spec in specs.module_specs:
+% for ps in spec.port_specs:
+% if ps.translations and type(ps.translations) == dict:
+def translate_${spec.name}_${ps.name}(val):
+    translate_dict = ${ps.translations}
+    return translate_dict[val]
+% endif
+% endfor
+% endfor
+
+% for spec in specs.module_specs:
+class ${spec.name}(${spec.superklass}):
+    """${spec.docstring}
+    """
+    _input_ports = [
+        % for ps in spec.port_specs:
+        % if not ps.hide:
+              ("${ps.name}", "${ps.get_port_type()}",
+                ${ps.get_port_attrs()}),
+        % for alt_ps in ps.alternate_specs:
+              ("${alt_ps.name}", "${alt_ps.get_port_type()}",
+               ${alt_ps.get_port_attrs()}),
+        % endfor
+        % endif
+        % endfor
+        % for ps in spec.output_port_specs:
+        % if ps.is_property():
+              ("${ps.name}", "${ps.get_property_type()}",
+                ${ps.get_port_attrs()}),
+        % endif
+        % endfor
+        ]
+
+    # no output ports except self
+    _output_ports = [("self", "(${spec.name})")]
+
+    def __init__(self):
+        ${spec.superklass}.__init__(self)
+        self.props = {}
+        self.constructor_props = {}
+        self.sub_props = {}
+        % if spec.get_init():
+        ${spec.get_init()}
+        % endif
+
+    def compute(self):
+        % if spec.get_compute_before():
+        ${spec.get_compute_before()}
+        % endif
+        ${spec.superklass}.compute(self)
+        % for ps in spec.port_specs:
+        % if not ps.hide and ps.in_kwargs:
+        % if ps.required:
+        % if ps.has_alternate_versions():
+        if self.hasInputFromPort('${ps.name}'):
+            ${get_props(ps)} = self.getInputFromPort('${ps.name}')
+            % if ps.translations:
+            ${do_translate(spec, ps)}
+            % endif
+        % for alt_ps in ps.alternate_specs:
+        elif self.hasInputFromPort('${alt_ps.name}'):
+            ${get_props(ps)} = self.getInputFromPort('${alt_ps.name}')
+            % if alt_ps.translations:
+            ${do_translate(spec, alt_ps, ps)}
+            % endif
+        % endfor
+        else:
+            raise ModuleError(self, 'Must set one of "${ps.name}", ' \
+                                  '${', '.join('"%s"' % alt_ps.name for alt_ps in ps.alternate_specs)}')
+        % else:
+        ${get_props(ps)} = self.getInputFromPort('${ps.name}')
+        % if ps.translations:
+        ${do_translate(spec, ps)}
+        % endif
+        % endif
+        ## self.props['${ps.arg}'] = self.getInputFromPort('${ps.name}')
+        ## % if ps.translations:
+        ## ${do_translate(spec, ps)}
+        ## % endif
+        % else:
+        if self.hasInputFromPort('${ps.name}'):
+            ${get_props(ps)} = self.getInputFromPort('${ps.name}')
+            % if ps.translations:
+            ${do_translate(spec, ps)}
+            % endif
+        % for alt_ps in ps.alternate_specs:
+        elif self.hasInputFromPort('${alt_ps.name}'):
+            ${get_props(ps)} = self.getInputFromPort('${alt_ps.name}')
+            % if alt_ps.translations:
+            ${do_translate(spec, alt_ps, ps)}
+            % endif
+        % endfor
+        ## if self.hasInputFromPort('${ps.name}'):
+        ##     self.props['${ps.arg}'] = self.getInputFromPort('${ps.name}')
+        ##     % if ps.translations:
+        ##     ${do_translate(spec, ps)}
+        ##     % endif
+        % endif
+        % endif
+        % endfor
+        % for ps in spec.output_port_specs:
+        % if ps.is_property():
+        if self.hasInputFromPort('${ps.name}'):
+            self.sub_props['${ps.arg}'] = self.getInputFromPort('${ps.name}')
+        % endif
+        % endfor            
+
+        % if spec.get_compute_after():
+        ${spec.get_compute_after()}
+        % endif
+        
+    def update_props(self, objs):
+        matplotlib.artist.setp(objs, **self.props)
+        % if any(ps.is_property() for ps in spec.output_port_specs):
+        if not matplotlib.cbook.iterable(objs):
+            objs = [objs]
+        else:
+            objs = matplotlib.cbook.flatten(objs)
+        for obj in objs:
+            % for ps in spec.output_port_specs:
+            % if ps.is_property():
+            if '${ps.arg}' in self.sub_props:
+                self.sub_props['${ps.arg}'].update_props(obj.${ps.compute_parent})
+            % endif
+            % endfor
+        % endif
+
+    def update_kwargs(self, kwargs):
+        kwargs.update(self.constructor_props)
+        kwargs.update(self.props)
+
+% endfor
+
+_modules = [
+% for spec in specs.module_specs:
+            ${spec.name},
+% endfor
+]
diff --git a/vistrails/packages/matplotlib/bases.py b/vistrails/packages/matplotlib/bases.py
new file mode 100644
index 0000000..92b7ea5
--- /dev/null
+++ b/vistrails/packages/matplotlib/bases.py
@@ -0,0 +1,291 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import pylab
+import urllib
+
+from vistrails.core.modules.basic_modules import CodeRunnerMixin
+from vistrails.core.modules.vistrails_module import Module, NotCacheable
+
+################################################################################
+
+class MplProperties(Module):
+    _output_ports = [("self", "(MplProperties)")]
+    
+    def update_props(self, objs):
+        # must implement in subclass
+        pass
+        
+
+#base class for 2D plots
+class MplPlot(NotCacheable, Module):
+    # _input_ports = [("subfigRow", "(edu.utah.sci.vistrails.basic:Integer)",
+    #                  {"defaults": ["1"]}),
+    #                 ("subfigCol", "(edu.utah.sci.vistrails.basic:Integer)",
+    #                  {"defaults": ["1"]})]
+    _output_ports = [("self", "(MplPlot)")]
+
+    def __init__(self):
+        Module.__init__(self)
+        # self.figInstance = None
+
+    # def set_fig(self, fig):
+    #     self.figInstance = fig
+
+    # def get_fig(self):
+    #     if self.figInstance is None:
+    #         self.figInstance = pylab.figure()
+    #     return self.figInstance
+
+    # def get_translation(self, port, val):
+    #     '''doing translation for enum type of the input ports'''
+        
+    #     for klass in self.__class__.mro():
+    #         if '_mpl_translations' in klass.__dict__ and \
+    #                 port in klass._mpl_translations:
+    #             obj = klass._mpl_translations[port]
+    #             if isinstance(obj, dict):
+    #                 if val in obj:
+    #                     return obj[val]
+    #                 else:
+    #                     raise ArtistException(
+    #                         "Value '%s' for input '%s' invalid." % (val, port))
+    #             else:
+    #                 print "trying to call"
+    #                 return obj(val)
+    #     return None
+    
+    # def get_kwargs_except(self, listExcepts):
+    #     ''' getting all the input ports except those ports listed inside listExcepts
+    #         return format: {port_name:value,...}'''
+    #     kwargs = {}
+    #     for port in self.inputPorts:
+    #         if port not in listExcepts:
+    #             val = self.getInputFromPort(port)
+    #             translation = self.get_translation(port, val)
+    #             if translation is not None:
+    #                 kwargs[port] = translation
+    #             else:
+    #                 kwargs[port] = val
+    #     return kwargs
+
+class MplSource(CodeRunnerMixin, MplPlot):
+    """
+    MplSource is a module similar to PythonSource. The user can enter
+    Matplotlib code into this module. This will then get connected to
+    MplFigure to draw the figure. Please note that, codes entered in
+    this module should limit to subplot() scope only. Using
+    Figure-level commands, e.g. figure() or show(), the result will be
+    unknown
+    
+    """
+    _input_ports = [('source', '(basic:String)')]
+
+    def compute(self):
+        """ compute() -> None
+        """
+        source = self.getInputFromPort('source')
+        s = ('from pylab import *\n' +
+             'from numpy import *\n' +
+             urllib.unquote(source))
+
+        self.run_code(s, use_input=True, use_output=True)
+
+class MplFigure(Module):
+    # _input_ports = [("addPlot", "(MplPlot)"),
+    #                 ("numSubfigRows", "(edu.utah.sci.vistrails.basic:Integer)",
+    #                  {"defaults": ["1"]}),
+    #                 ("numSubfigCols", "(edu.utah.sci.vistrails.basic:Integer)",
+    #                  {"defaults": ["1"]}),
+    #                 ]
+    _input_ports = [("addPlot", "(MplPlot)"),
+                    ("axesProperties", "(MplAxesProperties)"),
+                    ("figureProperties", "(MplFigureProperties)"),
+                    ("setLegend", "(MplLegend)")]
+
+    _output_ports = [("file", "(basic:File)"),
+                     ("self", "(MplFigure)")]
+
+    def __init__(self):
+        Module.__init__(self)
+        self.figInstance = None
+
+    def updateUpstream(self):
+        if self.figInstance is None:
+            self.figInstance = pylab.figure()
+        pylab.hold(True)
+        Module.updateUpstream(self)
+
+    def compute(self):
+        plots = self.getInputListFromPort("addPlot")
+        # num_rows = self.getInputFromPort("numSubfigRows")
+        # if num_rows < 1:
+        #     raise ModuleError(self, "numSubfigRows must be at least 1.")
+        # num_cols = self.getInputFromPort("numSubfigCols")
+        # if num_cols < 1:
+        #     raise ModuleError(self, "numSubfigCols must be at least 1.")
+        # if len(plots) < 1:
+        #     raise ModuleError(self, "Must add at least one plot to figure.")
+
+        # FIXME just take the fig instance from the first plot
+        # self.figInstance = plots[0].figInstance
+
+        if self.hasInputFromPort("figureProperties"):
+            figure_props = self.getInputFromPort("figureProperties")
+            figure_props.update_props(self.figInstance)
+        if self.hasInputFromPort("axesProperties"):
+            axes_props = self.getInputFromPort("axesProperties")
+            axes_props.update_props(self.figInstance.gca())
+        if self.hasInputFromPort("setLegend"):
+            legend = self.getInputFromPort("setLegend")
+            self.figInstance.gca().legend()
+
+        #FIXME write file out if File port is attached!
+
+        # if num_rows > 1 or num_cols > 1:
+        #     # need to reconstruct plot...
+        #     self.figInstance = pylab.figure()
+        # else:
+        #     self.figInstance = plots[0].figInstance
+
+        # for plot in plots:
+        #     p_axes = plot.get_fig().gca()
+        #     print "DPI:", plot.get_fig().dpi
+        #     for c in p_axes.collections:
+        #         print "TRANSFORM:", c._transform
+        #         print "DATALIM:", c.get_datalim(p_axes.transData)
+        #         print "PREPARE POINTS:", c._prepare_points()
+
+        # self.figInstance = pylab.figure()
+        # axes = self.figInstance.gca()
+        # x0 = None
+        # x1 = None
+        # y0 = None
+        # y1 = None
+        # dataLim = None
+        # for plot in plots:
+        #     p_axes = plot.get_fig().gca()
+        #     dataLim = p_axes.dataLim.frozen()
+        #     p_x0, p_x1 = p_axes.get_xlim()
+        #     if x0 is None or p_x0 < x0:
+        #         x0 = p_x0
+        #     if x1 is None or p_x1 > x1:
+        #         x1 = p_x1
+        #     p_y0, p_y1 = p_axes.get_ylim()
+        #     if y0 is None or p_y0 < y0:
+        #         y0 = p_y0
+        #     if y1 is None or p_y1 > y1:
+        #         y1 = p_y1
+
+        # print x0, x1, y0, y1
+        # axes.set_xlim(x0, x1, emit=False, auto=None)
+        # axes.set_ylim(y0, y1, emit=False, auto=None)
+
+        # # axes.dataLim = dataLim
+        # # axes.ignore_existing_data_limits = False
+        # # axes.autoscale_view()
+
+        # for plot in plots:
+        #     p_axes = plot.get_fig().gca()
+        #     # axes.lines.extend(p_axes.lines)
+        #     for line in p_axes.lines:
+        #         print "adding line!"
+        #         line = copy.copy(line)
+        #         line._transformSet = False
+        #         axes.add_line(line)
+        #     # axes.patches.extend(p_axes.patches)
+        #     for patch in p_axes.patches:
+        #         print "adding patch!"
+        #         patch = copy.copy(patch)
+        #         patch._transformSet = False
+        #         axes.add_patch(patch)
+        #     axes.texts.extend(p_axes.texts)
+        #     # axes.tables.extend(p_axes.tables)
+        #     for table in p_axes.tables:
+        #         table = copy.copy(table)
+        #         table._transformSet = False
+        #         axes.add_table(table)
+        #     # axes.artists.extend(p_axes.artists)
+        #     for artist in p_axes.artists:
+        #         artist = copy.copy(artist)
+        #         artist._transformSet = False
+        #         axes.add_artist(artist)
+        #     axes.images.extend(p_axes.images)
+        #     # axes.collections.extend(p_axes.collections)
+        #     for collection in p_axes.collections:
+        #         print "adding collection!"
+        #         # print "collection:", collection.__class__.__name__
+        #         # print "datalim:", p_axes.dataLim
+        #         # transOffset = axes.transData
+        #         collection = copy.copy(collection)
+        #         # collection._transformSet = False
+        #         # print dir(mtransforms)
+        #         collection.set_transform(mtransforms.IdentityTransform())
+        #         collection._transOffset = axes.transData
+        #         # collection._transformSet = False
+        #         collection._label = None
+        #         collection._clippath = None
+        #         axes.add_collection(collection)
+        #         # collection.set_transform(mtransforms.IdentityTransform())
+        #         # axes.collections.append(collection)
+        #     # axes.containers.extend(p_axes.containers)
+        # print "transFigure start:", self.figInstance.transFigure
+        # # axes.dataLim = dataLim
+        # # axes.ignore_existing_data_limits = False
+        # # print "datalim after:", axes.dataLim
+
+
+        # # print "DPI:", self.figInstance.dpi
+        # # for c in axes.collections:
+        # #     print "TRANSFORM:", c._transform
+        # #     print "DATALIM:", c.get_datalim(p_axes.transData)
+        # #     print "PREPARE POINTS:", c._prepare_points()
+
+
+        self.setResult("self", self)
+
+class MplContourSet(Module):
+    pass
+
+class MplQuadContourSet(MplContourSet):
+    pass
+        
+_modules = [(MplProperties, {'abstract': True}),
+            (MplPlot, {'abstract': True}), 
+            (MplSource, {'configureWidgetType': \
+                             ('vistrails.packages.matplotlib.widgets',
+                              'MplSourceConfigurationWidget')}),
+            MplFigure,
+            MplContourSet,
+            MplQuadContourSet]
diff --git a/vistrails/packages/matplotlib/diff.py b/vistrails/packages/matplotlib/diff.py
new file mode 100644
index 0000000..e5ddc9e
--- /dev/null
+++ b/vistrails/packages/matplotlib/diff.py
@@ -0,0 +1,354 @@
+import re
+from xml.etree import ElementTree as ET
+from specs import SpecList, ModuleSpec, InputPortSpec, OutputPortSpec, \
+    AlternatePortSpec
+
+def compute_ps_diff(root, in_ps_list, out_ps_list, code_ref, qualifier, 
+                    port=None):
+    if qualifier == "alternate":
+        if port is None:
+            raise ValueError("Must specify port with alternate")
+        out_port_specs = dict((ps.name, ps) for ps in out_ps_list)
+        in_port_specs = dict((ps.name, ps) for ps in in_ps_list)
+    else:
+        out_port_specs = dict((ps.arg, ps) for ps in out_ps_list)
+        in_port_specs = dict((ps.arg, ps) for ps in in_ps_list)
+
+    out_port_specs_set = set(out_port_specs.iterkeys())
+    in_port_specs_set = set(in_port_specs.iterkeys())
+
+    for arg in in_port_specs_set - out_port_specs_set:
+        # print 'argument "%s" of code reference "%s" removed' % \
+        #     (arg, code_ref)
+        print "- %s.%s.%s" % (code_ref, qualifier, arg)
+        elt = ET.Element("deletePortSpec")
+        elt.set("code_ref", code_ref)
+        if qualifier == "alternate":
+            elt.set("port", port)
+            elt.set("altName", arg)
+        else:
+            elt.set("port", arg)
+        elt.set("type", qualifier)
+        root.append(elt)
+
+    for arg, out_ps in out_port_specs.iteritems():
+        if arg not in in_port_specs:
+            # print 'argument "%s" of code reference "%s" added' % \
+            #     (arg, code_ref)
+            print "out_ps:", out_ps
+            print "+ %s.%s.%s %s" % (code_ref, qualifier, arg, 
+                                     ET.tostring(out_ps.to_xml()))
+            elt = ET.Element("addPortSpec")
+            elt.set("code_ref", code_ref)
+            if qualifier == "alternate":
+                elt.set("port", port)
+                elt.set("altName", arg)
+            else:
+                elt.set("port", arg)
+            elt.set("type", qualifier)
+            subelt = ET.Element("value")
+            subelt.append(out_ps.to_xml())
+            elt.append(subelt)
+            root.append(elt)
+            continue
+
+        in_ps = in_port_specs[arg]
+
+        # attrs = ['name', 'port_type', 'docstring', 'hide', 'entry_types',
+        #          'values', 'defaults', 'translations']
+        if qualifier == "output":
+            attr_list = OutputPortSpec.attrs
+        elif qualifier == "input":
+            attr_list = InputPortSpec.attrs
+        elif qualifier == "alternate":
+            attr_list = AlternatePortSpec.attrs
+        else:
+            raise ValueError('Unknown port type "%s"' % qualifier)
+        for attr in attr_list:
+            in_val = getattr(in_ps, attr) 
+            out_val = getattr(out_ps, attr)
+            if in_val != out_val:
+                # print '%s of argument "%s" changed from "%s" to "%s"' % \
+                #     (attr, arg, in_val, out_val)
+                print "C %s.%s.%s.%s %s" % (code_ref, qualifier, arg, attr, 
+                                            out_val)
+                elt = ET.Element("changePortSpec")
+                elt.set("code_ref", code_ref)
+                if qualifier == "alternate":
+                    elt.set("port", port)
+                    elt.set("altName", arg)
+                else:
+                    elt.set("port", arg)
+                elt.set("type", qualifier)
+                elt.set("attr", attr)
+                subelt = ET.Element("value")
+                subelt.text = str(out_val)
+                elt.append(subelt)
+                root.append(elt)
+        # only do this for input right now
+        if qualifier == "input":
+            compute_ps_diff(root, in_ps.alternate_specs, out_ps.alternate_specs,
+                            code_ref, "alternate", arg)
+
+def compute_diff(in_fname, out_fname, diff_fname):
+    in_specs = SpecList.read_from_xml(in_fname)
+    out_specs = SpecList.read_from_xml(out_fname)
+
+    in_refs = dict((spec.code_ref, spec) for spec in in_specs.module_specs)
+    out_refs = dict((spec.code_ref, spec) for spec in out_specs.module_specs)
+    
+    in_refs_set = set(in_refs.iterkeys())
+    out_refs_set = set(out_refs.iterkeys())
+
+    root = ET.Element("diff")
+
+    if in_specs.custom_code != out_specs.custom_code:
+        elt = ET.Element("changeCustomCode")
+        subelt = ET.Element("value")
+        subelt.text = out_specs.custom_code
+        elt.append(subelt)
+        root.append(elt)
+
+    for ref in in_refs_set - out_refs_set:
+        # print 'code reference "%s" removed' % ref
+        print "- %s" % ref
+        elt = ET.Element("deleteModule")
+        elt.set("code_ref", ref)
+        root.append(elt)
+
+    for code_ref, out_spec in out_refs.iteritems():
+        # need to check port specs, which removed, which added
+        if code_ref not in in_refs:
+            # print 'code reference "%s" added' % code_ref
+            print "+ %s %s" % (ref, ET.tostring(out_spec.to_xml()))
+            elt = ET.Element("addModule")
+            elt.set("code_ref", ref)
+            subelt = ET.Element("value")
+            subelt.append(out_spec.to_xml())
+            elt.append(subelt)
+            root.append(elt)
+            continue
+
+        in_spec = in_refs[code_ref]
+
+        for attr in ModuleSpec.attrs:
+            in_val = getattr(in_spec, attr)
+            out_val = getattr(out_spec, attr)
+            if in_val != out_val:
+                print "C %s.%s %s" % (out_spec.code_ref, attr, out_val)
+                elt = ET.Element("changeModule")
+                elt.set("code_ref", out_spec.code_ref)
+                elt.set("attr", attr)
+                subelt = ET.Element("value")
+                subelt.text = str(out_val)
+                elt.append(subelt)
+                root.append(elt)
+        
+        # if in_spec.name != out_spec.name:
+        #     # print 'name of ref "%s" changed from "%s" to "%s"' % \
+        #     #     (out_spec.code_ref, in_spec.name, out_spec.name)
+        #     print "C %s.name %s" % (out_spec.code_ref, out_spec.name)
+        # if in_spec.superklass != out_spec.superklass:
+        #     print 'superclass of ref "%s" changed from "%s" to "%s"' % \
+        #         (out_spec.code_ref, in_spec.superklass, out_spec.superklass)
+            
+
+        compute_ps_diff(root, in_spec.port_specs, out_spec.port_specs, 
+                        code_ref, "input")
+        compute_ps_diff(root, in_spec.output_port_specs, 
+                        out_spec.output_port_specs,
+                        code_ref, "output")
+        # out_port_specs = dict((ps.arg, ps) for ps in out_spec.port_specs)
+        # in_port_specs = dict((ps.arg, ps) for ps in in_spec.port_specs)
+
+        # out_port_specs_set = set(out_port_specs.iterkeys())
+        # in_port_specs_set = set(in_port_specs.iterkeys())
+
+        # for arg in in_port_specs_set - out_port_specs_set:
+        #     # print 'argument "%s" of code reference "%s" removed' % \
+        #     #     (arg, code_ref)
+        #     print "- %s.%s" % (code_ref, arg)
+
+        # for arg, out_ps in out_port_specs.iteritems():
+        #     if arg not in in_port_specs:
+        #         # print 'argument "%s" of code reference "%s" added' % \
+        #         #     (arg, code_ref)
+        #         print "+ %s.%s" % (code_ref, arg)
+        #         print ET.tostring(out_ps.to_xml())
+        #         continue
+            
+        #     in_ps = in_port_specs[arg]
+
+        #     # attrs = ['name', 'port_type', 'docstring', 'hide', 'entry_types',
+        #     #          'values', 'defaults', 'translations']
+        #     for attr in PortSpec.attrs:
+        #         in_val = getattr(in_ps, attr) 
+        #         out_val = getattr(out_ps, attr)
+        #         if in_val != out_val:
+        #             # print '%s of argument "%s" changed from "%s" to "%s"' % \
+        #             #     (attr, arg, in_val, out_val)
+        #             print "C %s.%s.%s %s" % (code_ref, arg, attr, out_val)
+
+    tree = ET.ElementTree(root)
+    def indent(elem, level=0):
+        i = "\n" + level*"  "
+        if len(elem):
+            if not elem.text or not elem.text.strip():
+                elem.text = i + "  "
+            if not elem.tail or not elem.tail.strip():
+                elem.tail = i
+            for elem in elem:
+                indent(elem, level+1)
+            if not elem.tail or not elem.tail.strip():
+                elem.tail = i
+        else:
+            if level and (not elem.tail or not elem.tail.strip()):
+                elem.tail = i
+    indent(tree.getroot())
+
+    tree.write(diff_fname)
+
+def apply_diff(in_fname, diff_fname, out_fname):
+    in_specs = SpecList.read_from_xml(in_fname)
+    
+    in_refs = dict((spec.code_ref, (i, spec))
+                   for i, spec in enumerate(in_specs.module_specs))
+    in_ips_refs = dict(((spec.code_ref, ps.arg), (i, ps))
+                       for spec in in_specs.module_specs 
+                       for i, ps in enumerate(spec.port_specs))
+    in_ops_refs = dict(((spec.code_ref, ps.arg), (i, ps))
+                       for spec in in_specs.module_specs
+                       for i, ps in enumerate(spec.output_port_specs))
+    in_alt_refs = dict(((spec.code_ref, ps.arg, alt_ps.name), (i, ps))
+                       for spec in in_specs.module_specs
+                       for ps in spec.port_specs
+                       for i, alt_ps in enumerate(ps.alternate_specs))
+
+    tree = ET.parse(diff_fname)
+    for elt in tree.getroot():
+        if elt.tag == "changeCustomCode":
+            val = elt.getchildren()[0].text
+            in_specs.custom_code = val
+            continue
+        code_ref = elt.get("code_ref")
+        m_spec = in_refs[code_ref][1]
+        port = elt.get("port", None)
+        if port:
+            port_type = elt.get("type")
+            if port_type == "alternate":
+                alt_name = elt.get("altName")
+        if elt.tag.startswith('delete'):
+            if port:
+                if port_type == "input":
+                    idx = in_ips_refs[(code_ref, port)][0]
+                    del m_spec.port_specs[idx]
+                elif port_type == 'output':
+                    idx = in_ops_refs[(code_ref, port)][0]
+                    del m_spec.output_port_specs[idx]
+                elif port_type == 'alternate':
+                    ps = in_ips_refs[(code_ref, port)][1]
+                    idx = in_alt_refs[(code_ref, port, alt_name)][0]
+                    del ps.alternate_specs[idx]
+                else:
+                    raise ValueError('Cannot access list of type "%s"' %
+                                     port_type)
+            else:
+                idx = in_refs[code_ref][0]
+                del in_specs.module_specs[idx]
+        elif elt.tag.startswith('add'):
+            for child in elt.getchildren():
+                if child.tag == 'value':
+                    for subchild in child.getchildren():
+                        value = subchild
+            if port:
+                if port_type == "input":
+                    m_spec.port_specs.append(InputPortSpec.from_xml(value))
+                elif port_type == "output":
+                    # print "VALUE:", ET.tostring(value)
+                    m_spec.output_port_specs.append(
+                        OutputPortSpec.from_xml(value))
+                elif port_type == "alternate":
+                    ps = in_ips_refs[(code_ref, port)][1]
+                    ps.alternate_specs.append(AlternatePortSpec.from_xml(value))
+                else:
+                    raise ValueError('Cannot access list of type "%s"' %
+                                     port_type)
+            else:
+                in_specs.module_specs.append(ModuleSpec.from_xml(value))
+        elif elt.tag.startswith('change'):
+            attr = elt.get("attr")
+            for child in elt.getchildren():
+                if child.tag == 'value':
+                    value = child.text
+            if port:
+                # KLUDGE to fix change from output_type to port_type
+                if attr == "output_type":
+                    attr = "port_type"
+                if port_type == "input":
+                    port_spec = in_ips_refs[(code_ref, port)][1]
+                    setattr(port_spec, attr, value)
+                elif port_type == "output":
+                    port_spec = in_ops_refs[(code_ref, port)][1]
+                    setattr(port_spec, attr, value)
+                elif port_type == "alternate":
+                    port_spec = in_alt_refs[(code_ref, port, alt_name)][1]
+                    setattr(port_spec, attr, value)
+            else:
+                setattr(m_spec, attr, value)
+
+    # with f = open(diff_fname):
+    #     f_iter = f.__iter__()
+    #     for line in f_iter:
+    #         line = line.strip()
+    #         if not re.match("[+-C]", line):
+    #             raise RuntimeError("Problem parsing line\n%s" % line)
+    #         if line.startswith('-'):
+    #             arr = line.split(' ', 1)
+    #             prop = arr[1].split('.')
+    #             if len(prop) < 2:
+    #                 idx = in_refs[prop[0]][0]
+    #                 del in_specs.module_specs[idx]
+    #             else:
+    #                 m_specs = in_refs[prop[0]][1]
+    #                 if prop[1] == 'input':
+    #                     idx = in_ips_refs[prop[0], prop[2]][0]
+    #                     del m_specs.port_specs[idx]
+    #                 elif prop[1] == 'output':
+    #                     idx = in_ops_refs[prop[0], prop[2]][0]
+    #                     del m_specs.output_port_specs[idx]
+    #                 else:
+    #                     raise ValueError('Cannot access list of type "%s"' %
+    #                                      prop[1])
+    #         elif line.startswith('+'):
+    #             arr = line.split(' ', 2)
+    #             prop = arr[1].split('.')
+    #             if len(prop) < 2:
+    #                 in_specs.module_specs.append(ModuleSpec.from_xml(arr[2]))
+                
+    #         line.split(' ', 2)
+            
+    in_specs.write_to_xml(out_fname)
+
+def run_compute():
+    compute_diff("mpl_artists_raw.xml", "mpl_artists.xml", 
+                 "mpl_artists_diff.xml")
+    compute_diff("mpl_plots_raw.xml", "mpl_plots.xml", "mpl_plots_diff.xml")    
+
+def run_apply():
+    apply_diff("mpl_artists_raw.xml", "mpl_artists_diff.xml", "mpl_artists.xml")
+    apply_diff("mpl_plots_raw.xml", "mpl_plots_diff.xml", "mpl_plots.xml")
+
+def usage():
+    print "Usage: %s %s [apply|compute]" % (sys.executable, sys.argv[0])
+
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv) < 2:
+        usage()
+    elif sys.argv[1] == "apply":
+        run_apply()
+    elif sys.argv[1] == "compute":
+        run_compute()
+    else:
+        usage()
+        
diff --git a/vistrails/packages/matplotlib/figure_cell.py b/vistrails/packages/matplotlib/figure_cell.py
new file mode 100644
index 0000000..5f4029b
--- /dev/null
+++ b/vistrails/packages/matplotlib/figure_cell.py
@@ -0,0 +1,294 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This file describe a new type of spreadsheet cell to embed
+Matplotlib viewer into our spreadsheet
+
+"""
+from PyQt4 import QtCore, QtGui
+import os
+
+import matplotlib
+import pylab
+from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg, NavigationToolbar2QT
+from matplotlib.backend_bases import NavigationToolbar2, FigureManagerBase
+
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+
+FigureCanvasQTAgg.DEBUG = True
+
+################################################################################
+
+class MplFigureCell(SpreadsheetCell):
+    """
+    MplFigureCell is a spreadsheet cell for displaying Figure from
+    Matplotlib
+
+    """
+    _input_ports = [("figure", "(MplFigure)")]
+
+    def compute(self):
+        """ compute() -> None        
+        The class will take the figure manager and embed it into the spreadsheet
+        
+        """
+        if self.hasInputFromPort('figure'):
+            fig = self.getInputFromPort('figure')
+            self.displayAndWait(MplFigureCellWidget, (fig, ))
+
+class MplFigureCellWidget(QCellWidget):
+    """
+    MplFigureCellWidget is the actual QWidget taking the FigureManager
+    as a child for displaying figures
+    
+    """
+    def __init__(self, parent=None):
+        """ MplFigureCellWidget(parent: QWidget) -> MplFigureCellWidget
+        Initialize the widget with its central layout
+        
+        """
+        QCellWidget.__init__(self, parent)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        centralLayout = QtGui.QVBoxLayout()
+        self.setLayout(centralLayout)
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)        
+        # self.figManager = pylab.get_current_fig_manager()
+        # self.figManager = None
+        # self.figNumber = None
+        self.canvas = None
+        self.figure = None
+        self.figManager = None
+        self.toolBarType = MplFigureCellToolBar
+        self.mplToolbar = None
+
+    # def getFigManager(self):
+    #     if self.figNumber is not None:
+    #         pylab.figure(self.figNumber)
+    #         return pylab.get_current_fig_manager()
+    #     return None
+
+    # def getFigure(self):
+    #     if self.figNumber is not None:
+    #         return pylab.figure(self.figNumber)
+    #     return None
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Update the widget contents based on the input data
+        
+        """
+        (fig, ) = inputPorts
+        if not self.figure or self.figure.number != fig.figInstance.number:
+            if self.layout().count() > 0:
+                self.layout().removeWidget(self.canvas)
+
+            self.figure = fig.figInstance
+                
+            # self.figure.set_size_inches(8.0,6.0)
+            self.canvas = FigureCanvasQTAgg(self.figure)
+            self.mplToolbar = MplNavigationToolbar(self.canvas, None)
+            self.canvas.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                      QtGui.QSizePolicy.Expanding)
+            # self.figManager = FigureManagerBase(self.canvas, self.figure.number)
+            self.layout().addWidget(self.canvas)
+
+            # Update the new figure canvas
+            # self.canvas.draw()
+            # self.layout().addWidget(self.getFigManager().window)
+
+        # Update the new figure canvas
+        # self.getFigManager().canvas.draw()            
+
+        # # Replace the old one with the new one
+        # if newFigManager!=self.figManager:
+            
+        #     # Remove the old figure manager
+        #     if self.figManager:
+        #         self.figManager.window.hide()
+        #         self.layout().removeWidget(self.figManager.window)
+
+        #     # Add the new one in
+        #     self.layout().addWidget(newFigManager.window)
+
+        #     # Destroy the old one if possible
+        #     if self.figManager:
+                
+        #         try:                    
+        #             pylab.close(self.figManager.canvas.figure)
+        #         # There is a bug in Matplotlib backend_qt4. It is a
+        #         # wrong command for Qt4. Just ignore it and continue
+        #         # to destroy the widget
+        #         except:
+        #             pass
+                
+        #         self.figManager.window.deleteLater()
+        #         del self.figManager
+
+        #     # Save back the manager
+        #     self.figManager = newFigManager
+        #     self.update()
+
+    def keyPressEvent(self, event):
+        print "KEY PRESS:",  event.key()
+        self.canvas.keyPressEvent(event)
+
+    def keyReleaseEvent(self, event):
+        print "KEY RELEASE:", event.key()
+        self.canvas.keyReleaseEvent(event)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Overriding PyQt deleteLater to free up resources
+        
+        """
+        # Destroy the old one if possible
+        if self.figure is not None:
+            # self.getFigManager().window.deleteLater()
+            print "pylab:", pylab
+            print "self.figure:", self.figure
+            pylab.close(self.figure)
+            
+        # if self.figManager:
+            
+        #     try:                    
+        #         pylab.close(self.figManager.canvas.figure)
+        #     # There is a bug in Matplotlib backend_qt4. It is a
+        #     # wrong command for Qt4. Just ignore it and continue
+        #     # to destroy the widget
+        #     except:
+        #         pass
+            
+        #     self.figManager.window.deleteLater()
+        QCellWidget.deleteLater(self)
+
+    def grabWindowPixmap(self):
+        """ grabWindowPixmap() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        # pylab.figure(self.figNumber)
+        # figManager = pylab.get_current_fig_manager()
+        return QtGui.QPixmap.grabWidget(self.canvas)
+
+    def dumpToFile(self, filename):
+        previous_size = tuple(self.figure.get_size_inches())
+        self.figure.set_size_inches(8.0,6.0)
+        self.canvas.print_figure(filename)
+        self.figure.set_size_inches(previous_size[0],previous_size[1])
+        self.canvas.draw()
+        
+    def saveToPDF(self, filename):
+        previous_size = tuple(self.figure.get_size_inches())
+        self.figure.set_size_inches(8.0,6.0)
+        self.canvas.print_figure(filename)
+        self.figure.set_size_inches(previous_size[0],previous_size[1])
+        self.canvas.draw()
+
+class MplNavigationToolbar(NavigationToolbar2QT):
+    # override a bunch of stuff here...
+    def __init__(self, canvas, parent):
+        self.canvas = canvas
+        NavigationToolbar2.__init__(self, canvas)
+
+    def _init_toolbar(self):
+        self.adj_window = None
+
+    def destroy(self):
+        pass
+
+    def pan(self, *args):
+        NavigationToolbar2.pan(self, *args)
+    
+    def zoom(self, *args):
+        NavigationToolbar2.zoom(self, *args)
+        
+    def set_message(self, s):
+        pass
+
+    def save_figure(self, *args):
+        pass
+
+    def set_history_buttons(self):
+        pass
+
+class MplFigureCellToolBar(QCellToolBar):
+    def createToolBar(self):
+        # can be copied from NavigationToolbar2QT... with checkable added
+        toolitems = (
+            ('Home', 'Reset original view', 'home.ppm', 'home', False),
+            ('Back', 'Back to  previous view','back.ppm', 'back', False),
+            ('Forward', 'Forward to next view','forward.ppm', 'forward', 
+             False),
+            # (None, None, None, None),
+            ('Pan', 'Pan axes with left mouse, zoom with right', 'move.ppm', 
+             'pan', True),
+            ('Zoom', 'Zoom to rectangle','zoom_to_rect.ppm', 'zoom', True),
+            # (None, None, None, None),
+            # ('Subplots', 'Configure subplots','subplots.png', 'configure_subplots'),
+            # ('Save', 'Save the figure','filesave.ppm', 'save_figure'),
+            )
+        icondir = os.path.join(matplotlib.rcParams[ 'datapath' ],'images')
+        exclusive_actions = {}
+        actions = {}
+        for (text, tooltip_text, image_file, callback, checkable) in toolitems:
+            icon = QtGui.QIcon(os.path.join(icondir, image_file))
+            action = QtGui.QAction(icon, text, self)
+            action.setStatusTip(tooltip_text)
+            # action.setToolTip(tooltip_text)
+            action.setCheckable(checkable)
+            # self.connect(action, QtCore.SIGNAL("triggered"), 
+            #              get_callback(callback))
+            actions[text] = action
+            if text == 'Pan' or text == 'Zoom':
+                exclusive_actions[text] = action
+
+        def get_callback(act, cb, txt):
+            print "CONSTRUCTING CALLBACK!", act, cb, txt
+            def callback():
+                print "GOT CALLBACK!!"
+                cellWidget = act.toolBar.getSnappedWidget()
+                print "CALLING callback", cb
+                getattr(cellWidget.mplToolbar, cb)()
+                if txt in exclusive_actions:
+                    for t, a in exclusive_actions.iteritems():
+                        if txt != t:
+                            a.setChecked(False)
+            return callback
+
+
+        for (text, tooltip_text, image_file, callback, checkable) in toolitems:
+            action = actions[text]
+            action.triggeredSlot = get_callback(action, callback, text)
+            self.appendAction(action)
diff --git a/vistrails/packages/matplotlib/generate.py b/vistrails/packages/matplotlib/generate.py
new file mode 100644
index 0000000..346a0fa
--- /dev/null
+++ b/vistrails/packages/matplotlib/generate.py
@@ -0,0 +1,29 @@
+from mako.template import Template
+import sys
+from specs import SpecList
+
+def generate_from_specs(fname, out_fname, template_fname):
+    specs = SpecList.read_from_xml(fname)
+    
+    template = Template(filename=template_fname, 
+                        module_directory='/tmp/mako')
+
+    f = open(out_fname, 'wb') # 'b' ensures that we always use LF line endings
+    f.write(template.render(specs=specs))
+    f.close()        
+
+def run(which="all"):
+    if which == "all" or which == "plots":
+        generate_from_specs("mpl_plots.xml", "plots.py", 
+                            "plots_template.py.mako")
+    if which == "all" or which == "artists":
+        generate_from_specs("mpl_artists.xml", "artists.py", 
+                            "artists_template.py.mako")
+    
+if __name__ == '__main__':
+    if len(sys.argv) <= 1:
+        run()
+    elif len(sys.argv) == 2:
+        run(sys.argv[1])
+    else:
+        raise TypeError("usage: python parse.py [all|artists|plots]")
diff --git a/vistrails/packages/matplotlib/identifiers.py b/vistrails/packages/matplotlib/identifiers.py
new file mode 100644
index 0000000..6da2f7c
--- /dev/null
+++ b/vistrails/packages/matplotlib/identifiers.py
@@ -0,0 +1,46 @@
+###############################################################################
+##
+## Copyright (C) 2011-2012, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Matplotlib package for VisTrails.
+
+This package wrap Matplotlib to provide a plotting tool for
+VisTrails. We are going to use the 'Qt4Agg' backend of the library.
+
+"""
+
+identifier = 'org.vistrails.vistrails.matplotlib'
+name = 'matplotlib'
+version = '1.0.1'
+old_identifiers = ['edu.utah.sci.vistrails.matplotlib',
+                   'org.vistrails.matplotlib.new']
diff --git a/vistrails/packages/matplotlib/init.py b/vistrails/packages/matplotlib/init.py
new file mode 100644
index 0000000..e465fe4
--- /dev/null
+++ b/vistrails/packages/matplotlib/init.py
@@ -0,0 +1,269 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import matplotlib
+matplotlib.use('Qt4Agg', warn=False)
+
+import vistrails.core.modules.module_registry
+import vistrails.core.db.action
+from vistrails.core.vistrail.module import Module
+from vistrails.core.vistrail.operation import AddOp
+
+from bases import _modules as _base_modules
+from plots import _modules as _plot_modules
+from artists import _modules as _artist_modules
+from identifiers import identifier
+
+################################################################################
+
+#list of modules to be displaced on matplotlib.new package
+_modules = _base_modules + _plot_modules + _artist_modules
+
+def initialize(*args, **kwargs):
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    if reg.has_module('org.vistrails.vistrails.spreadsheet',
+                      'SpreadsheetCell'):
+        from figure_cell import MplFigureCell
+        _modules.append(MplFigureCell)
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler
+    create_new_connection = UpgradeWorkflowHandler.create_new_connection
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+
+    def find_module_in_upgrade_action(action):
+        for op in action.operations:
+            if isinstance(op, AddOp):
+                if op.what == Module.vtType:
+                    return op.data
+        return None
+
+    def find_inputs(m):
+        functions = {}
+        for f in m.functions:
+            if f.name not in functions:
+                functions[f.name] = [f]
+            else:
+                functions[f.name].append(f)
+        connections = {}
+        for edge in pipeline.graph.iter_edges_to(m.id):
+            c = pipeline.connections[edge[2]]
+            if c.destination.name not in connections:
+                connections[c.destination.name] = [c]
+            else:
+                connections[c.destination.name].append(c)
+        return (functions, connections)
+
+    def find_figure(m):
+        for edge in pipeline.graph.iter_edges_from(m.id):
+            to_m = pipeline.modules[edge[1]]
+            if to_m.name == 'MplFigure':
+                # !!! assume only a single down-stream MplFigure !!!
+                # may have old or new module...
+                if pipeline.connections[edge[2]].destination.name == 'addPlot':
+                    return (to_m, None)
+                else:
+                    return (to_m, edge)
+        return (None, None)
+
+    def attach_inputs(new_module, inputs, selected_inputs):
+        conns = []
+        for port_name in selected_inputs:
+            if port_name in inputs[0]:
+                for f in inputs[0][port_name]:
+                    if len(f.parameters) > 0:
+                        new_param_vals, aliases = zip(*[(p.strValue, p.alias) 
+                                                        for p in f.parameters])
+                    else:
+                        new_param_vals = []
+                        aliases = []
+                    new_f = controller.create_function(new_module, 
+                                                       port_name,
+                                                       new_param_vals,
+                                                       aliases)
+                    new_module.add_function(new_f)
+            if port_name in inputs[1]:
+                for c in inputs[1][port_name]:
+                    source_module = pipeline.modules[c.source.id]
+                    new_conn = create_new_connection(controller,
+                                                     source_module,
+                                                     c.source,
+                                                     new_module,
+                                                     port_name)
+                    conns.append(new_conn)
+        return conns
+
+    module = pipeline.modules[module_id]
+    to_properties = []
+    to_axes = []
+    old_figure = (None, None)
+    if module.name == 'MplScatterplot':
+        props_name = 'MplPathCollectionProperties'
+        props_input = 'pathCollectionProperties'
+        to_properties = ['facecolor']
+        to_axes = ['title', 'xlabel', 'ylabel']
+        inputs = find_inputs(module)
+        old_loc = module.location
+        old_figure = find_figure(module)
+    elif module.name == 'MplHistogram':
+        props_name = 'MplRectangleProperties'
+        props_input = 'rectangleProperties'
+        to_properties = ['facecolor']
+        to_axes = ['title', 'xlabel', 'ylabel']
+        inputs = find_inputs(module)
+        old_loc = module.location
+        old_figure = find_figure(module)
+
+    module_remap = {'MplPlot': 
+                    [(None, '1.0.0', 'MplSource',
+                      {'dst_port_remap': {'source': 'source',
+                                          'Hide Toolbar': None},
+                       'src_port_remap': {'source': 'self'}})],
+                    'MplFigure': 
+                    [(None, '1.0.0', None,
+                      {'dst_port_remap': {'Script': 'addPlot'},
+                       'src_port_remap': {'FigureManager': 'self',
+                                          'File': 'file'}})],
+                    'MplFigureCell':
+                    [(None, '1.0.0', None,
+                      {'dst_port_remap': {'FigureManager': 'figure'}})],
+                    # we will delete parts of this but add back later
+                    'MplScatterplot':
+                    [(None, '1.0.0', 'MplScatter',
+                      {'dst_port_remap': {'xData': 'x',
+                                          'yData': 'y',
+                                          'facecolor': None,
+                                          'title': None,
+                                          'xlabel': None,
+                                          'ylabel': None},
+                       'src_port_remap': {'source': 'self'}})],
+                    'MplHistogram':
+                    [(None, '1.0.0', 'MplHist',
+                      {'dst_port_remap': {'columnData': 'x',
+                                          'bins': 'bins',
+                                          'facecolor': None,
+                                          'title': None,
+                                          'xlabel': None,
+                                          'ylabel': None},
+                       'src_port_remap': {'source': 'self'}})],
+                }
+
+    action_list = []
+    if old_figure[1] is not None and \
+       any(p in inputs[0] or p in inputs[1] for p in to_axes):
+        # need to remove the edge between plot and figure
+        pipeline.graph.delete_edge(*old_figure[1])
+        conn = pipeline.connections[old_figure[1][2]]
+        action = vistrails.core.db.action.create_action([('delete', conn)])
+        action_list.append(action)
+
+    normal_actions = UpgradeWorkflowHandler.remap_module(controller, module_id, 
+                                                        pipeline, module_remap)
+    action_list.extend(normal_actions)
+
+    more_ops = []
+    if any(p in inputs[0] or p in inputs[1] for p in to_properties):
+        # create props module
+        desc = reg.get_descriptor_by_name(identifier, props_name)
+        props_module = \
+            controller.create_module_from_descriptor(desc,
+                                                     old_loc.x + 100,
+                                                     old_loc.y + 100)
+        more_ops.append(('add', props_module))
+
+        # attach functions/connections
+        conns = attach_inputs(props_module, inputs, to_properties)
+        more_ops.extend([('add', c) for c in conns])
+        
+        # attach into pipeline
+        new_plot_module = find_module_in_upgrade_action(normal_actions[0])
+        assert new_plot_module is not None
+        new_conn = create_new_connection(controller,
+                                         props_module,
+                                         'self',
+                                         new_plot_module,
+                                         props_input)
+        more_ops.append(('add', new_conn))
+
+    if any(p in inputs[0] or p in inputs[1] for p in to_axes):
+        # create axes module
+        desc = reg.get_descriptor_by_name(identifier, "MplAxesProperties")
+        if old_figure[0] is not None:
+            old_loc = old_figure[0].location
+        axes_module = \
+            controller.create_module_from_descriptor(desc,
+                                                     old_loc.x + 100,
+                                                     old_loc.y + 100)
+        more_ops.append(('add', axes_module))
+
+        # attach functions/connections
+        conns = attach_inputs(axes_module, inputs, to_axes)
+        more_ops.extend([('add', c) for c in conns])
+        
+        # attach axes properties to new figure
+        if old_figure[0] is not None and old_figure[1] is not None:
+            # remap figure
+            fig_action = UpgradeWorkflowHandler.remap_module(controller,
+                                                             old_figure[0].id,
+                                                             pipeline,
+                                                             module_remap)
+            fig_module = find_module_in_upgrade_action(fig_action[0])
+            assert fig_module is not None
+            # add the removed edge back in
+            pipeline.graph.add_edge(*old_figure[1])
+            action_list.extend(fig_action)
+
+            new_plot_module = find_module_in_upgrade_action(normal_actions[0])
+            assert new_plot_module is not None
+            conn = create_new_connection(controller,
+                                         new_plot_module,
+                                         'self',
+                                         fig_module,
+                                         'addPlot')
+            action = vistrails.core.db.action.create_action([('add', conn)])
+            action_list.append(action)
+        else:
+            fig_module = old_figure[0]
+        new_conn = create_new_connection(controller,
+                                         axes_module,
+                                         'self',
+                                         fig_module,
+                                         'axesProperties')
+        more_ops.append(('add', new_conn))
+    
+    # for action in action_list:
+    #     for op in action.operations:
+    #         print "@+>:", op
+    return action_list
+            
diff --git a/vistrails/packages/matplotlib/mixins.py b/vistrails/packages/matplotlib/mixins.py
new file mode 100644
index 0000000..8da5801
--- /dev/null
+++ b/vistrails/packages/matplotlib/mixins.py
@@ -0,0 +1,62 @@
+class MplCorrBaseMixin(object):
+    def compute_after():
+        if 'usevlines' in kwargs and kwargs['usevlines']:
+            output = output + (output[2],)
+        else:
+            output = output + (None, None)
+
+class MplAcorrMixin(MplCorrBaseMixin):
+    pass
+
+class MplXcorrMixin(MplCorrBaseMixin):
+    pass
+
+class MplBoxplotMixin(object):
+    def compute_after():
+        if 'patch_artist' in kwargs and kwargs['patch_artist']:
+            output['boxPatches'] = output['boxes']
+            output['boxes'] = []
+        else:
+            output['boxPatches'] = []
+
+class MplContourBaseMixin(object):
+    def compute_before():
+        if self.hasInputFromPort("N") and self.hasInputFromPort("V"):
+            del args[-1]
+
+class MplContourMixin(MplContourBaseMixin):
+    def compute_inner():
+        contour_set = matplotlib.pyplot.contour(*args, **kwargs)
+        output = (contour_set, contour_set.collections)
+
+class MplContourfMixin(MplContourBaseMixin):
+    def compute_inner():
+        contour_set = matplotlib.pyplot.contourf(*args, **kwargs)
+        output = (contour_set, contour_set.collections)
+
+class MplPieMixin(object):
+    def compute_after():
+        if len(output) < 3:
+            output = output + ([],)
+
+class MplAnnotateMixin(object):
+    def compute_before():
+        if self.hasInputFromPort("fancyArrowProperties"):
+            kwargs['arrowprops'] = \
+                self.getInputFromPort("fancyArrowProperties").props
+        elif self.hasInputFromPort("arrowProperties"):
+            kwargs['arrowprops'] = \
+                self.getInputFromPort("arrowProperties").props
+
+class MplSpyMixin(object):
+    def compute_after():
+        if "marker" not in kwargs and "markersize" not in kwargs and \
+                not hasattr(kwargs["Z"], 'tocoo'):
+            output = (output, None)
+        else:
+            output = (None, output)
+
+class MplBarMixin(object):
+    def compute_before(self):
+        if not kwargs.has_key('left'):
+            kwargs['left'] = range(len(kwargs['height']))
diff --git a/vistrails/packages/matplotlib/mpl_artists.xml b/vistrails/packages/matplotlib/mpl_artists.xml
new file mode 100644
index 0000000..c97e605
--- /dev/null
+++ b/vistrails/packages/matplotlib/mpl_artists.xml
@@ -0,0 +1,1935 @@
+<specs>
+  <customCode />
+  <moduleSpec code_ref="matplotlib.artist.Artist" name="MplArtistProperties" superclass="MplProperties">
+    <docstring>
+    Abstract base class for someone who renders into a
+    :class:`FigureCanvas`.
+    </docstring>
+    <inputPortSpec arg="picker" name="picker">
+      <docstring>Set the epsilon for picking used by this artist
+
+picker can be one of the following:
+
+None: picking is disabled for this artist (default)
+
+A boolean: if True then picking will be enabled and the artist will fire a pick event if the mouse event is over the artist
+
+A float: if picker is a number it is interpreted as an epsilon tolerance in points and the artist will fire off an event if it's data is within epsilon of the mouse event.  For some artists like lines and patch collections, the artist may provide additional data to the pick event that is generated, e.g. the indices of the data within epsilon of the pick event
+
+A function: if picker is callable, it is a user supplied function which determines whether the artist is hit by the mouse event:
+
+hit, props = picker(artist, mouseevent)
+
+to determine the hit test.  if the mouse event is over the artist, return hit=True and props is a dictionary of properties you want added to the PickEvent attributes.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="contains" name="contains">
+      <docstring>Replace the contains test used by this artist. The new picker should be a callable function which determines whether the artist is hit by the mouse event:
+
+hit, props = picker(artist, mouseevent)
+
+If the mouse event is over the artist, return hit = True and props is a dictionary of properties you want returned with the contains test.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_on" name="clip_on" port_type="basic:Boolean">
+      <docstring>Set whether artist uses clipping.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="agg_filter" name="agg_filter">
+      <docstring>set agg_filter fuction.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="visible" name="visible" port_type="basic:Boolean">
+      <docstring>Set the artist's visiblity.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="url" name="url" port_type="basic:String">
+      <docstring>Sets the url for the artist</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" name="transform">
+      <docstring>Set the :class:`~matplotlib.transforms.Transform` instance used by this artist.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" name="axes">
+      <docstring>Set the :class:`~matplotlib.axes.Axes` instance in which the artist resides, if any.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_box" name="clip_box">
+      <docstring>Set the artist's clip :class:`~matplotlib.transforms.Bbox`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_path" name="clip_path" port_type="basic:String">
+      <docstring>Set the artist's clip path, which may be:
+
+a :class:`~matplotlib.patches.Patch` (or subclass) instance
+
+
+
+None, to remove the clipping path
+
+For efficiency, if the path happens to be an axis-aligned rectangle, this method will set the clipping box to the corresponding rectangle and set the clipping path to None.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="lod" name="lod" port_type="basic:Boolean">
+      <docstring>Set Level of Detail on or off.  If on, the artists may examine things like the pixel width of the axes and draw a subset of their contents accordingly</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label" name="label" port_type="basic:String">
+      <docstring>Set the label to s for auto legend.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rasterized" name="rasterized" port_type="basic:Boolean">
+      <docstring>Force rasterized (bitmap) drawing in vector backend output.
+
+Defaults to None, which implies the backend's default behavior</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="gid" name="gid" port_type="basic:String">
+      <docstring>Sets the (group) id for the artist</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="zorder" name="zorder">
+      <docstring>Set the zorder for the artist.  Artists with lower zorder values are drawn first.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="snap" name="snap">
+      <docstring>Sets the snap setting which may be:
+
+True: snap vertices to the nearest pixel center
+
+False: leave vertices as-is
+
+None: (auto) If the path contains only rectilinear line segments, round to the nearest pixel center
+
+Only supported by the Agg and MacOSX backends.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha value used for blending - not supported on all backends.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="animated" name="animated" port_type="basic:Boolean">
+      <docstring>Set the artist's animation state.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" name="figure">
+      <docstring>Set the :class:`~matplotlib.figure.Figure` instance the artist belongs to.</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image._AxesImageBase" name="Mpl_AxesImageBaseProperties" superclass="MplArtistProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="origin" arg_pos="4" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="resample" name="resample" port_type="basic:Boolean">
+      <docstring>Set whether or not image resampling is used</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="filternorm" name="filternorm">
+      <docstring>Set whether the resize filter norms the weights -- see help for imshow</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha value used for blending - not supported on all backends</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="array" name="array">
+      <docstring>Retained for backwards compatibility - use set_data instead</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the image array</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="filterrad" name="filterrad" port_type="basic:Float">
+      <docstring>Set the resize filter radius only applicable to some interpolation schemes -- see help for imshow</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="interpolation" name="interpolation" port_type="basic:String">
+      <docstring>Set the interpolation method the image uses when resizing.
+
+if None, use a value from rc setting. If 'none', the image is shown as is without interpolating. 'none' is only supported in agg, ps and pdf backends and will fall back to 'nearest' mode for other backends.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos', 'none', '']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.AxesImage" name="MplAxesImageProperties" superclass="Mpl_AxesImageBaseProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="origin" arg_pos="4" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="resample" arg_pos="8" constructor_arg="True" name="resample" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="filterrad" arg_pos="7" constructor_arg="True" name="filterrad" port_type="basic:Float">
+      <defaults>['4.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="extent" name="extent">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="filternorm" arg_pos="6" constructor_arg="True" name="filternorm" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="interpolation" arg_pos="3" constructor_arg="True" name="interpolation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.NonUniformImage" name="MplNonUniformImageProperties" superclass="MplAxesImageProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="norm" name="norm" />
+    <inputPortSpec arg="cmap" name="cmap" />
+    <inputPortSpec arg="filternorm" name="filternorm" />
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="array" name="array" />
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the grid for the pixel centers, and the pixel values.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="filterrad" name="filterrad" />
+    <inputPortSpec arg="interpolation" name="interpolation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.BboxImage" name="MplBboxImageProperties" superclass="Mpl_AxesImageBaseProperties">
+    <docstring>The Image class whose size is determined by the given bbox.</docstring>
+    <inputPortSpec arg="origin" arg_pos="4" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="interp_at_native" arg_pos="8" constructor_arg="True" name="interp_at_native" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="resample" arg_pos="7" constructor_arg="True" name="resample" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="filternorm" arg_pos="5" constructor_arg="True" name="filternorm" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+    <inputPortSpec arg="interpolation" arg_pos="3" constructor_arg="True" name="interpolation" />
+    <inputPortSpec arg="filterrad" arg_pos="6" constructor_arg="True" name="filterrad" port_type="basic:Float">
+      <defaults>['4.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox" arg_pos="0" constructor_arg="True" name="bbox" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.PcolorImage" name="MplPcolorImageProperties" superclass="MplArtistProperties">
+    <docstring>
+    Make a pcolor-style plot with an irregular rectangular grid.
+
+    This uses a variation of the original irregular image code,
+    and it is used by pcolorfast for the corresponding grid type.
+    </docstring>
+    <inputPortSpec arg="A" arg_pos="3" constructor_arg="True" name="A" />
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="cmap" arg_pos="4" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="x" arg_pos="1" constructor_arg="True" name="x" />
+    <inputPortSpec arg="y" arg_pos="2" constructor_arg="True" name="y" />
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha value used for blending - not supported on all backends</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="array" name="array" />
+    <inputPortSpec arg="data" name="data" />
+    <inputPortSpec arg="norm" arg_pos="5" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.FigureImage" name="MplFigureImageProperties" superclass="MplArtistProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="origin" arg_pos="5" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="offsetx" arg_pos="3" constructor_arg="True" name="offsetx" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="offsety" arg_pos="4" constructor_arg="True" name="offsety" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="fig" arg_pos="0" constructor_arg="True" name="fig" />
+    <inputPortSpec arg="array" name="array">
+      <docstring>Deprecated; use set_data for consistency with other image types.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the image array.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.Collection" name="MplCollectionProperties" superclass="MplArtistProperties">
+    <docstring>
+    Base class for Collections.  Must be subclassed to be usable.
+
+    All properties in a collection must be sequences or scalars;
+    if scalars, they will be converted to sequences.  The
+    property of the ith element of the collection is::
+
+      prop[i % len(props)]
+
+    Keyword arguments and default values:
+
+        * *edgecolors*: None
+        * *facecolors*: None
+        * *linewidths*: None
+        * *antialiaseds*: None
+        * *offsets*: None
+        * *transOffset*: transforms.IdentityTransform()
+        * *offset_position*: 'screen' (default) or 'data'
+        * *norm*: None (optional for
+          :class:`matplotlib.cm.ScalarMappable`)
+        * *cmap*: None (optional for
+          :class:`matplotlib.cm.ScalarMappable`)
+        * *hatch*: None
+
+    *offsets* and *transOffset* are used to translate the patch after
+    rendering (default no offsets).  If offset_position is 'screen'
+    (default) the offset is applied after the master transform has
+    been applied, that is, the offsets are in screen coordinates.  If
+    offset_position is 'data', the offset is applied before the master
+    transform, i.e., the offsets are in data coordinates.
+
+    If any of *edgecolors*, *facecolors*, *linewidths*, *antialiaseds*
+    are None, they default to their :data:`matplotlib.rcParams` patch
+    setting, in sequence form.
+
+    The use of :class:`~matplotlib.cm.ScalarMappable` is optional.  If
+    the :class:`~matplotlib.cm.ScalarMappable` matrix _A is not None
+    (ie a call to set_array has been made), at draw time a call to
+    scalar mappable will be made to set the face colors.
+    </docstring>
+    <inputPortSpec arg="transOffset" arg_pos="6" constructor_arg="True" name="transOffset" />
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:List">
+      <docstring>Set the edgecolor(s) of the collection. c can be a matplotlib color arg (all patches have same color), or a sequence of rgba tuples; if it is a sequence the patches will cycle through the sequence.
+
+If c is 'face', the edge color will always be the same as the face color.  If it is 'none', the patch boundary will not be drawn.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="offset_position" name="offset_position">
+      <docstring>Set how offsets are applied.  If offset_position is 'screen' (default) the offset is applied after the master transform has been applied, that is, the offsets are in screen coordinates. If offset_position is 'data', the offset is applied before the master transform, i.e., the offsets are in data coordinates.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="edgecolors" arg_pos="0" constructor_arg="True" name="edgecolors" />
+    <inputPortSpec arg="facecolor" name="facecolor" port_type="basic:List">
+      <docstring>Set the facecolor(s) of the collection.  c can be a matplotlib color arg (all patches have same color), or a sequence of rgba tuples; if it is a sequence the patches will cycle through the sequence.
+
+If c is 'none', the patch will not be filled.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" arg_pos="3" constructor_arg="True" name="linestyles" port_type="basic:String">
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="offsets" name="offsetsSequence" port_type="basic:List">
+      <docstring>Set the offsets for the collection.  offsets can be a scalar or a sequence.</docstring>
+      <alternateSpec arg="offsets" name="offsetsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:List">
+      <docstring>Set both the edgecolor and the facecolor. .. seealso:
+
+:meth:`set_facecolor`, :meth:`set_edgecolor`    For setting the edge or face color individually.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" name="pickradius" />
+    <inputPortSpec arg="antialiaseds" arg_pos="4" constructor_arg="True" name="antialiaseds" />
+    <inputPortSpec arg="linewidths" arg_pos="2" constructor_arg="True" name="linewidths" />
+    <inputPortSpec arg="cmap" arg_pos="8" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="antialiased" name="antialiasedSequence" port_type="basic:List">
+      <docstring>Set the antialiasing state for rendering.</docstring>
+      <alternateSpec arg="antialiased" name="antialiasedScalar" port_type="basic:Boolean" />
+    </inputPortSpec>
+    <inputPortSpec arg="urls" name="urls" />
+    <inputPortSpec arg="hatch" name="hatch" port_type="basic:String">
+      <docstring>Set the hatching pattern
+
+hatch can be one of:
+
+/   - diagonal hatching \   - back diagonal |   - vertical -   - horizontal +   - crossed x   - crossed diagonal o   - small circle O   - large circle .   - dots *   - stars
+
+Letters can be combined, in which case all the specified hatchings are done.  If same letter repeats, it increases the density of hatching of that pattern.
+
+Hatching is supported in the PostScript, PDF, SVG and Agg backends only.
+
+Unlike other properties such as linewidth and colors, hatching can only be specified for the collection as a whole, not separately for each member.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['/', "'\\'", "'", "'", '-', '+', 'x', 'o', 'O', '.', '*']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha tranparencies of the collection.  alpha must be a float or None.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="linewidth" name="linewidthSequence" port_type="basic:List">
+      <docstring>Set the linewidth(s) for the collection.  lw can be a scalar or a sequence; if it is a sequence the patches will cycle through the sequence</docstring>
+      <alternateSpec arg="linewidth" name="linewidthScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linestyle" name="linestyle" port_type="basic:String">
+      <docstring>Set the linestyle(s) for the collection.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['solid', ('dashed', 'dashdot', 'dotted'), '(offset, on-off-dash-seq)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="facecolors" arg_pos="1" constructor_arg="True" name="facecolors" />
+    <inputPortSpec arg="norm" arg_pos="7" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.PathCollection" name="MplPathCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    This is the most basic :class:`Collection` subclass.
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="sizes" arg_pos="1" constructor_arg="True" name="sizes" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.PolyCollection" name="MplPolyCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="paths" name="paths">
+      <docstring>This allows one to delay initialization of the vertices.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="verts" name="verts">
+      <docstring>This allows one to delay initialization of the vertices.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="closed" arg_pos="2" constructor_arg="True" name="closed" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="1" constructor_arg="True" name="sizes" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.BrokenBarHCollection" name="MplBrokenBarHCollectionProperties" superclass="MplPolyCollectionProperties">
+    <docstring>
+    A collection of horizontal bars spanning *yrange* with a sequence of
+    *xranges*.
+    </docstring>
+    <inputPortSpec arg="xranges" arg_pos="0" constructor_arg="True" name="xranges" />
+    <inputPortSpec arg="yrange" arg_pos="1" constructor_arg="True" name="yrange" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.RegularPolyCollection" name="MplRegularPolyCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>Draw a collection of regular polygons with *numsides*.</docstring>
+    <inputPortSpec arg="numsides" arg_pos="0" constructor_arg="True" name="numsides" />
+    <inputPortSpec arg="rotation" arg_pos="1" constructor_arg="True" name="rotation" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="2" constructor_arg="True" name="sizes">
+      <defaults>['(1,)']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.StarPolygonCollection" name="MplStarPolygonCollectionProperties" superclass="MplRegularPolyCollectionProperties">
+    <docstring>
+    Draw a collection of regular stars with *numsides* points.</docstring>
+    <inputPortSpec arg="numsides" arg_pos="0" constructor_arg="True" name="numsides" />
+    <inputPortSpec arg="rotation" arg_pos="1" constructor_arg="True" name="rotation" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="2" constructor_arg="True" name="sizes">
+      <defaults>['(1,)']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.AsteriskPolygonCollection" name="MplAsteriskPolygonCollectionProperties" superclass="MplRegularPolyCollectionProperties">
+    <docstring>
+    Draw a collection of regular asterisks with *numsides* points.</docstring>
+    <inputPortSpec arg="numsides" arg_pos="0" constructor_arg="True" name="numsides" />
+    <inputPortSpec arg="rotation" arg_pos="1" constructor_arg="True" name="rotation" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="2" constructor_arg="True" name="sizes">
+      <defaults>['(1,)']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.LineCollection" name="MplLineCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    All parameters must be sequences or scalars; if scalars, they will
+    be converted to sequences.  The property of the ith line
+    segment is::
+
+       prop[i % len(props)]
+
+    i.e., the properties cycle if the ``len`` of props is less than the
+    number of segments.
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="antialiaseds" arg_pos="3" constructor_arg="True" name="antialiaseds" />
+    <inputPortSpec arg="linestyles" arg_pos="4" constructor_arg="True" name="linestyles" port_type="basic:String">
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="offsets" arg_pos="5" constructor_arg="True" name="offsets" />
+    <inputPortSpec arg="color" name="color" port_type="basic:List">
+      <docstring>Set the color(s) of the line collection.  c can be a matplotlib color arg (all patches have same color), or a sequence or rgba tuples; if it is a sequence the patches will cycle through the sequence.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="segments" name="segments" />
+    <inputPortSpec arg="linewidths" arg_pos="1" constructor_arg="True" name="linewidths" />
+    <inputPortSpec arg="colors" arg_pos="2" constructor_arg="True" name="colors" />
+    <inputPortSpec arg="cmap" arg_pos="8" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="transOffset" arg_pos="6" constructor_arg="True" name="transOffset" />
+    <inputPortSpec arg="verts" name="verts" />
+    <inputPortSpec arg="pickradius" arg_pos="9" constructor_arg="True" name="pickradius" port_type="basic:Integer">
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="7" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.CircleCollection" name="MplCircleCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    A collection of circles, drawn using splines.
+    </docstring>
+    <inputPortSpec arg="sizes" arg_pos="0" constructor_arg="True" name="sizes" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.EllipseCollection" name="MplEllipseCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    A collection of ellipses, drawn using splines.
+    </docstring>
+    <inputPortSpec arg="units" arg_pos="3" constructor_arg="True" name="units" port_type="basic:String">
+      <defaults>['points']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="widths" arg_pos="0" constructor_arg="True" name="widths" />
+    <inputPortSpec arg="angles" arg_pos="2" constructor_arg="True" name="angles" />
+    <inputPortSpec arg="heights" arg_pos="1" constructor_arg="True" name="heights" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.PatchCollection" name="MplPatchCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    A generic collection of patches.
+
+    This makes it easier to assign a color map to a heterogeneous
+    collection of patches.
+
+    This also may improve plotting speed, since PatchCollection will
+    draw faster than a large number of patches.
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="patches" arg_pos="0" constructor_arg="True" name="patches" />
+    <inputPortSpec arg="match_original" arg_pos="1" constructor_arg="True" name="match_original" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.TriMesh" name="MplTriMeshProperties" superclass="MplCollectionProperties">
+    <docstring>
+    Class for the efficient drawing of a triangular mesh using
+    Gouraud shading.
+
+    A triangular mesh is a :class:`~matplotlib.tri.Triangulation`
+    object.
+    </docstring>
+    <inputPortSpec arg="triangulation" arg_pos="0" constructor_arg="True" name="triangulation" />
+    <inputPortSpec arg="paths" name="paths" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.QuadMesh" name="MplQuadMeshProperties" superclass="MplCollectionProperties">
+    <docstring>
+    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', or 'gouraud'
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="meshWidth" arg_pos="0" constructor_arg="True" name="meshWidth" />
+    <inputPortSpec arg="coordinates" arg_pos="2" constructor_arg="True" name="coordinates" />
+    <inputPortSpec arg="antialiased" arg_pos="3" constructor_arg="True" name="antialiased" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shading" arg_pos="4" constructor_arg="True" name="shading" port_type="basic:String">
+      <defaults>['flat']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="meshHeight" arg_pos="1" constructor_arg="True" name="meshHeight" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Patch" name="MplPatchProperties" superclass="MplArtistProperties">
+    <docstring>
+    A patch is a 2D artist with a face color and an edge color.
+
+    If any of *edgecolor*, *facecolor*, *linewidth*, or *antialiased*
+    are *None*, they default to their rc params setting.
+    </docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>Set the patch edge color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="facecolor" name="facecolor" port_type="basic:Color">
+      <docstring>Set the patch face color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="path_effects" name="path_effects">
+      <docstring>set path_effects, which should be a list of instances of matplotlib.patheffect._Base class or its derivatives.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>Set both the edgecolor and the facecolor. .. seealso:
+
+:meth:`set_facecolor`, :meth:`set_edgecolor`    For setting the edge or face color individually.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>Set whether to use antialiased rendering</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hatch" name="hatch" port_type="basic:String">
+      <docstring>Set the hatching pattern
+
+hatch can be one of:
+
+/   - diagonal hatching \   - back diagonal |   - vertical -   - horizontal +   - crossed x   - crossed diagonal o   - small circle O   - large circle .   - dots *   - stars
+
+Letters can be combined, in which case all the specified hatchings are done.  If same letter repeats, it increases the density of hatching of that pattern.
+
+Hatching is supported in the PostScript, PDF, SVG and Agg backends only.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['/', "'\\'", "'", "'", '-', '+', 'x', 'o', 'O', '.', '*']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha tranparency of the patch.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth" port_type="basic:Float">
+      <docstring>Set the patch linewidth in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyle" name="linestyle" port_type="basic:String">
+      <docstring>Set the patch linestyle</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['solid', 'dashed', 'dashdot', 'dotted']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fill" name="fill" port_type="basic:Boolean">
+      <docstring>Set whether to fill the patch</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Shadow" name="MplShadowProperties" superclass="MplPatchProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="patch" arg_pos="0" constructor_arg="True" name="patch" />
+    <inputPortSpec arg="props" arg_pos="3" constructor_arg="True" name="props" />
+    <inputPortSpec arg="oy" arg_pos="2" constructor_arg="True" name="oy" />
+    <inputPortSpec arg="ox" arg_pos="1" constructor_arg="True" name="ox" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Rectangle" name="MplRectangleProperties" superclass="MplPatchProperties">
+    <docstring>
+    Draw a rectangle with lower left at *xy* = (*x*, *y*) with
+    specified *width* and *height*.
+    </docstring>
+    <inputPortSpec arg="bounds" name="bounds">
+      <docstring>Set the bounds of the rectangle: l,b,w,h</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="height" name="height" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" name="width" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xy" name="xy" port_type="basic:List">
+      <docstring>Set the left and bottom coords of the rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the bottom coord of the rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the left coord of the rectangle</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.RegularPolygon" name="MplRegularPolygonProperties" superclass="MplPatchProperties">
+    <docstring>
+    A regular polygon patch.
+    </docstring>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy">
+      <docstring>A length 2 tuple (x, y) of the center.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="radius" arg_pos="2" constructor_arg="True" name="radius" port_type="basic:Integer">
+      <docstring>The distance from the center to each of the vertices.</docstring>
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="orientation" arg_pos="3" constructor_arg="True" name="orientation" port_type="basic:Integer">
+      <docstring>rotates the polygon (in radians).</docstring>
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="numVertices" arg_pos="1" constructor_arg="True" name="numVertices">
+      <docstring>the number of vertices.</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.CirclePolygon" name="MplCirclePolygonProperties" superclass="MplRegularPolygonProperties">
+    <docstring>
+    A polygon-approximation of a circle patch.
+    </docstring>
+    <inputPortSpec arg="radius" arg_pos="1" constructor_arg="True" name="radius" port_type="basic:Integer">
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="resolution" arg_pos="2" constructor_arg="True" name="resolution" port_type="basic:Integer">
+      <defaults>['20']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.PathPatch" name="MplPathPatchProperties" superclass="MplPatchProperties">
+    <docstring>
+    A general polycurve path patch.
+    </docstring>
+    <inputPortSpec arg="path" arg_pos="0" constructor_arg="True" name="path" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Polygon" name="MplPolygonProperties" superclass="MplPatchProperties">
+    <docstring>
+    A general polygon patch.
+    </docstring>
+    <inputPortSpec arg="xy" name="xy" />
+    <inputPortSpec arg="closed" name="closed" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.FancyArrow" name="MplFancyArrowProperties" superclass="MplPolygonProperties">
+    <docstring>
+    Like Arrow, but lets you set head width and head height independently.
+    </docstring>
+    <inputPortSpec arg="length_includes_head" arg_pos="5" constructor_arg="True" name="length_includes_head" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="head_length" arg_pos="7" constructor_arg="True" name="head_length" />
+    <inputPortSpec arg="head_width" arg_pos="6" constructor_arg="True" name="head_width" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" port_type="basic:Float">
+      <defaults>['0.001']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shape" arg_pos="8" constructor_arg="True" name="shape" port_type="basic:String">
+      <defaults>['full']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="dx" arg_pos="2" constructor_arg="True" name="dx" />
+    <inputPortSpec arg="dy" arg_pos="3" constructor_arg="True" name="dy" />
+    <inputPortSpec arg="y" arg_pos="1" constructor_arg="True" name="y" />
+    <inputPortSpec arg="x" arg_pos="0" constructor_arg="True" name="x" />
+    <inputPortSpec arg="head_starts_at_zero" arg_pos="10" constructor_arg="True" name="head_starts_at_zero" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="overhang" arg_pos="9" constructor_arg="True" name="overhang" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Wedge" name="MplWedgeProperties" superclass="MplPatchProperties">
+    <docstring>
+    Wedge shaped patch.
+    </docstring>
+    <inputPortSpec arg="theta2" arg_pos="3" constructor_arg="True" name="theta2" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="r" arg_pos="1" constructor_arg="True" name="r" />
+    <inputPortSpec arg="theta1" arg_pos="2" constructor_arg="True" name="theta1" />
+    <inputPortSpec arg="center" arg_pos="0" constructor_arg="True" name="center" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Arrow" name="MplArrowProperties" superclass="MplPatchProperties">
+    <docstring>
+    An arrow patch.
+    </docstring>
+    <inputPortSpec arg="y" arg_pos="1" constructor_arg="True" name="y" />
+    <inputPortSpec arg="x" arg_pos="0" constructor_arg="True" name="x" />
+    <inputPortSpec arg="dy" arg_pos="3" constructor_arg="True" name="dy" />
+    <inputPortSpec arg="dx" arg_pos="2" constructor_arg="True" name="dx" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" port_type="basic:Float">
+      <defaults>['1.0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.YAArrow" name="MplYAArrowProperties" superclass="MplPatchProperties">
+    <docstring>
+    Yet another arrow class.
+
+    This is an arrow that is defined in display space and has a tip at
+    *x1*, *y1* and a base at *x2*, *y2*.
+    </docstring>
+    <inputPortSpec arg="xytip" arg_pos="1" constructor_arg="True" name="xytip">
+      <docstring>(x, y) location of arrow tip</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="headwidth" arg_pos="5" constructor_arg="True" name="headwidth" port_type="basic:Integer">
+      <docstring>The width of the base of the arrow head in points</docstring>
+      <defaults>['12']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="frac" arg_pos="4" constructor_arg="True" name="frac" port_type="basic:Float">
+      <docstring>The fraction of the arrow length occupied by the head</docstring>
+      <defaults>['0.1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" arg_pos="0" constructor_arg="True" name="figure">
+      <docstring>The :class:`~matplotlib.figure.Figure` instance (fig.dpi)</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xybase" arg_pos="2" constructor_arg="True" name="xybase">
+      <docstring>(x, y) location the arrow base mid point</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" arg_pos="3" constructor_arg="True" name="width" port_type="basic:Integer">
+      <docstring>The width of the arrow in points</docstring>
+      <defaults>['4']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Ellipse" name="MplEllipseProperties" superclass="MplPatchProperties">
+    <docstring>
+    A scale-free ellipse.
+    </docstring>
+    <inputPortSpec arg="width" arg_pos="1" constructor_arg="True" name="width" />
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="angle" arg_pos="3" constructor_arg="True" name="angle" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="2" constructor_arg="True" name="height" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Circle" name="MplCircleProperties" superclass="MplEllipseProperties">
+    <docstring>
+    A circle patch.
+    </docstring>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="radius" name="radius" port_type="basic:Float">
+      <docstring>Set the radius of the circle</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Arc" name="MplArcProperties" superclass="MplEllipseProperties">
+    <docstring>
+    An elliptical arc.  Because it performs various optimizations, it
+    can not be filled.
+
+    The arc must be used in an :class:`~matplotlib.axes.Axes`
+    instance---it can not be added directly to a
+    :class:`~matplotlib.figure.Figure`---because it is optimized to
+    only render the segments that are inside the axes bounding box
+    with high resolution.
+    </docstring>
+    <inputPortSpec arg="theta2" arg_pos="5" constructor_arg="True" name="theta2" port_type="basic:Float">
+      <defaults>['360.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="theta1" arg_pos="4" constructor_arg="True" name="theta1" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="angle" arg_pos="3" constructor_arg="True" name="angle" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="2" constructor_arg="True" name="height" />
+    <inputPortSpec arg="width" arg_pos="1" constructor_arg="True" name="width" />
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.FancyBboxPatch" name="MplFancyBboxPatchProperties" superclass="MplPatchProperties">
+    <docstring>
+    Draw a fancy box around a rectangle with lower left at *xy*=(*x*,
+    *y*) with specified width and height.
+
+    :class:`FancyBboxPatch` class is similar to :class:`Rectangle`
+    class, but it draws a fancy box around the rectangle. The
+    transformation of the rectangle box to the fancy box is delegated
+    to the :class:`BoxTransmuterBase` and its derived classes.
+
+    </docstring>
+    <inputPortSpec arg="mutation_scale" name="mutation_scale" port_type="basic:Float">
+      <docstring>Set the mutation scale.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_transmuter" arg_pos="4" constructor_arg="True" name="bbox_transmuter" />
+    <inputPortSpec arg="bounds" name="bounds">
+      <docstring>Set the bounds of the rectangle: l,b,w,h</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="height" name="height" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" name="width" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="boxstyle" name="boxstyle">
+      <docstring>Set the box style.
+
+boxstyle can be a string with boxstyle name with optional comma-separated attributes. Alternatively, the attrs can be provided as keywords:
+
+set_boxstyle("round,pad=0.2") set_boxstyle("round", pad=0.2)
+
+Old attrs simply are forgotten.
+
+Without argument (or with boxstyle = None), it returns available box styles.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_aspect" name="mutation_aspect" port_type="basic:Float">
+      <docstring>Set the aspect ratio of the bbox mutation.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the bottom coord of the rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the left coord of the rectangle</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.FancyArrowPatch" name="MplFancyArrowPatchProperties" superclass="MplPatchProperties">
+    <docstring>
+    A fancy arrow patch. It draws an arrow using the :class:ArrowStyle.
+    </docstring>
+    <inputPortSpec arg="connectionstyle" name="connectionstyle">
+      <docstring>Set the connection style.
+
+Old attrs simply are forgotten.
+
+Without argument (or with connectionstyle=None), return available styles as a list of strings.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_scale" name="mutation_scale" port_type="basic:Float">
+      <docstring>Set the mutation scale.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowstyle" name="arrowstyle">
+      <docstring>Set the arrow style.
+
+Old attrs simply are forgotten.
+
+Without argument (or with arrowstyle=None), return available box styles as a list of strings.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="arrow_transmuter" arg_pos="4" constructor_arg="True" name="arrow_transmuter" />
+    <inputPortSpec arg="positions" name="positions" />
+    <inputPortSpec arg="shrinkA" arg_pos="9" constructor_arg="True" name="shrinkA" port_type="basic:Float">
+      <defaults>['2.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="posB" arg_pos="1" constructor_arg="True" name="posB" />
+    <inputPortSpec arg="dpi_cor" name="dpi_cor">
+      <docstring>dpi_cor is currently used for linewidth-related things and shink factor. Mutation scale is not affected by this.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="connector" arg_pos="6" constructor_arg="True" name="connector" />
+    <inputPortSpec arg="path" arg_pos="2" constructor_arg="True" name="path" />
+    <inputPortSpec arg="shrinkB" arg_pos="10" constructor_arg="True" name="shrinkB" port_type="basic:Float">
+      <defaults>['2.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_aspect" name="mutation_aspect" port_type="basic:Float">
+      <docstring>Set the aspect ratio of the bbox mutation.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="patchA" name="patchA">
+      <docstring>set the begin patch.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="patchB" name="patchB">
+      <docstring>set the begin patch</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="posA" arg_pos="0" constructor_arg="True" name="posA" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.ConnectionPatch" name="MplConnectionPatchProperties" superclass="MplFancyArrowPatchProperties">
+    <docstring>
+    A :class:`~matplotlib.patches.ConnectionPatch` class is to make
+    connecting lines between two points (possibly in different axes).
+    </docstring>
+    <inputPortSpec arg="connectionstyle" arg_pos="8" constructor_arg="True" name="connectionstyle" port_type="basic:String">
+      <docstring>the connection style</docstring>
+      <defaults>['arc3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="coordsA" arg_pos="2" constructor_arg="True" name="coordsA">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowstyle" arg_pos="6" constructor_arg="True" name="arrowstyle" port_type="basic:String">
+      <docstring>the arrow style</docstring>
+      <defaults>['-']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_on" arg_pos="16" constructor_arg="True" name="clip_on" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="arrow_transmuter" arg_pos="7" constructor_arg="True" name="arrow_transmuter" />
+    <inputPortSpec arg="axesA" arg_pos="4" constructor_arg="True" name="axesA" />
+    <inputPortSpec arg="axesB" arg_pos="5" constructor_arg="True" name="axesB" />
+    <inputPortSpec arg="annotation_clip" name="annotation_clip">
+      <docstring>set annotation_clip attribute.
+
+None: the self.xy will be checked only if xycoords is "data"</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dpi_cor" arg_pos="17" constructor_arg="True" name="dpi_cor" port_type="basic:Float">
+      <defaults>['1.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="connector" arg_pos="9" constructor_arg="True" name="connector" />
+    <inputPortSpec arg="xyA" arg_pos="0" constructor_arg="True" name="xyA" />
+    <inputPortSpec arg="xyB" arg_pos="1" constructor_arg="True" name="xyB" />
+    <inputPortSpec arg="relpos" constructor_arg="True" name="relpos" port_type="basic:String">
+      <docstring>default is (0.5, 0.5)</docstring>
+      <defaults>['(0.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shrinkB" arg_pos="13" constructor_arg="True" name="shrinkB" port_type="basic:Float">
+      <docstring>default is 2 points</docstring>
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shrinkA" arg_pos="12" constructor_arg="True" name="shrinkA" port_type="basic:Float">
+      <docstring>default is 2 points</docstring>
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_aspect" arg_pos="15" constructor_arg="True" name="mutation_aspect" port_type="basic:Integer">
+      <docstring>default is 1.</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_scale" arg_pos="14" constructor_arg="True" name="mutation_scale">
+      <docstring>default is text size (in points)</docstring>
+      <defaults>['text']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="patchA" arg_pos="10" constructor_arg="True" name="patchA" port_type="basic:String">
+      <docstring>default is bounding box of the text</docstring>
+      <defaults>['bounding']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="patchB" arg_pos="11" constructor_arg="True" name="patchB">
+      <docstring>default is None</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="coordsB" arg_pos="3" constructor_arg="True" name="coordsB">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="?" constructor_arg="True" name="?">
+      <docstring>any key for :class:`matplotlib.patches.PathPatch`</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.lines.Line2D" name="MplLine2DProperties" superclass="MplArtistProperties">
+    <docstring>
+    A line - the line can have both a solid linestyle connecting all
+    the vertices, and a marker at each vertex.  Additionally, the
+    drawing of the solid line is influenced by the drawstyle, eg one
+    can create "stepped" lines in various styles.
+
+
+    </docstring>
+    <inputPortSpec arg="picker" name="picker" port_type="basic:Float">
+      <docstring>Sets the event picker details for the line.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dash_capstyle" name="dash_capstyle" port_type="basic:String">
+      <docstring>Set the cap style for dashed linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['butt', 'round', 'projecting']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>Set the color of the line</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="markevery" name="markevery">
+      <docstring>Set the markevery property to subsample the plot when using markers.  Eg if markevery=5, every 5-th marker will be plotted.  every can be</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['(startind, stride)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markeredgecolor" name="markeredgecolor" port_type="basic:Color">
+      <docstring>Set the marker edge color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="marker" name="marker" port_type="basic:String">
+      <docstring>Set the line marker
+
+The marker can also be a tuple (numsides, style, angle), which will create a custom, regular symbol.
+
+
+
+For backward compatibility, the form (verts, 0) is also accepted, but it is equivalent to just verts for giving a raw set of vertices that define the shape.</docstring>
+      <translations>{'caretright': 5, 'star': '*', 'point': '.', 'tickdown': 3, 'triangle_right': '>', 'tickup': 2, 'hexagon1': 'h', 'hline': '_', 'vline': '|', 'mathtext': '$...$', 'nothing': ' ', 'caretleft': 4, 'pentagon': 'p', 'tri_left': '3', 'caretdown': 7, 'tri_down': '1', 'tickright': 1, 'tri_right': '4', 'thin_diamond': 'd', 'diamond': 'D', 'octagon': '8', 'tickleft': 0, 'square': 's', 'tri_up': '2', 'plus': '+', 'x': 'x', 'triangle_down': 'v', 'triangle_up': '^', 'hexagon2': [...]
+      <entry_types>['enum']</entry_types>
+      <values>[['caretdown', 'caretleft', 'caretright', 'caretup', 'circle', 'diamond', 'hexagon1', 'hexagon2', 'hline', 'nothing', 'octagon', 'pentagon', 'pixel', 'plus', 'point', 'square', 'star', 'thin_diamond', 'tickdown', 'tickleft', 'tickright', 'tickup', 'tri_down', 'tri_left', 'tri_right', 'tri_up', 'triangle_down', 'triangle_left', 'triangle_right', 'triangle_up', 'vline', 'x', 'mathtext']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markerfacecoloralt" name="markerfacecoloralt" port_type="basic:Color">
+      <docstring>Set the alternate marker face color.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth" port_type="basic:Float">
+      <docstring>Set the line width in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyle" name="linestyle" port_type="basic:String">
+      <docstring>Set the linestyle of the line (also accepts drawstyles)
+
+'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility.</docstring>
+      <translations>{'solid': '-', 'dashed': '--', 'dash_dot': '-.', 'dotted': ':', 'draw nothing': ''}</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['solid', 'dashed', 'dash_dot', 'dotted', 'draw nothing', 'draw nothing', 'draw nothing']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="solid_joinstyle" name="solid_joinstyle" port_type="basic:String">
+      <docstring>Set the join style for solid linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['miter', 'round', 'bevel']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markerfacecolor" name="markerfacecolor" port_type="basic:Color">
+      <docstring>Set the marker face color.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" name="axes">
+      <docstring>Set the :class:`~matplotlib.axes.Axes` instance in which the artist resides, if any.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" name="transform">
+      <docstring>set the Transformation instance used by this artist</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="fillstyle" name="fillstyle" port_type="basic:String">
+      <docstring>Set the marker fill style; 'full' means fill the whole marker. 'none' means no filling; other options are for half-filled markers.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['full', 'left', 'right', 'bottom', 'top', 'none']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markeredgewidth" name="markeredgewidth" port_type="basic:Float">
+      <docstring>Set the marker edge width in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="solid_capstyle" name="solid_capstyle" port_type="basic:String">
+      <docstring>Set the cap style for solid linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['butt', 'round', 'projecting']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="dashes" name="dashes" port_type="basic:List">
+      <docstring>Set the dash sequence, sequence of dashes with on off ink in points.  If seq is empty or if seq = (None, None), the linestyle will be set to solid.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="markersize" name="markersize" port_type="basic:Float">
+      <docstring>Set the marker size in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>True if line should be drawin with antialiased rendering</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xdata" name="xdata">
+      <docstring>Set the data np.array for x</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="drawstyle" name="drawstyle" port_type="basic:String">
+      <docstring>Set the drawstyle of the plot
+
+'default' connects the points with lines. The steps variants produce step-plots. 'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['default', 'steps', 'steps-pre', 'steps-mid', 'steps-post']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the x and y data</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dash_joinstyle" name="dash_joinstyle" port_type="basic:String">
+      <docstring>Set the join style for dashed linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['miter', 'round', 'bevel']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" name="pickradius" port_type="basic:Float">
+      <docstring>Sets the pick radius used for containment tests</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ydata" name="ydata">
+      <docstring>Set the data np.array for y</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.text.Text" name="MplTextProperties" superclass="MplArtistProperties">
+    <docstring>
+    Handle storing and drawing of text in window or data coordinates.
+    </docstring>
+    <inputPortSpec arg="rotation_mode" name="rotation_mode">
+      <docstring>set text rotation mode. If "anchor", the un-rotated text will first aligned according to their ha and va, and then will be rotated with the alignement reference point as a origin. If None (default), the text will be rotated first then will be aligned.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="style" name="style" port_type="basic:String">
+      <docstring>Set the font style.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['normal', 'italic', 'oblique']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linespacing" name="linespacing" port_type="basic:Float">
+      <docstring>Set the line spacing as a multiple of the font size. Default is 1.2.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="family" name="family" port_type="basic:String">
+      <docstring>Set the font family.  May be either a single string, or a list of strings in decreasing priority.  Each string may be either a real font name or a generic font class name.  If the latter, the specific font names will be looked up in the :file:`matplotlibrc` file.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['FONTNAME', 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the x position of the text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>Set the foreground color of the text</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="text" name="text" port_type="basic:String">
+      <docstring>Set the text string s
+
+It may contain newlines (\n) or math in LaTeX syntax.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="verticalalignment" name="verticalalignment" port_type="basic:String">
+      <docstring>Set the vertical alignment</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['center', 'top', 'bottom', 'baseline']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="variant" name="variant" port_type="basic:String">
+      <docstring>Set the font variant, either 'normal' or 'small-caps'.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['normal', 'small-caps']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="path_effects" name="path_effects" />
+    <inputPortSpec arg="weight" name="weight" port_type="basic:String">
+      <docstring>Set the font weight.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['a numeric value in range 0-1000', 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="stretch" name="stretch" port_type="basic:String">
+      <docstring>Set the font stretch (horizontal condensation or expansion).</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['a numeric value in range 0-1000', 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fontproperties" name="fontproperties">
+      <docstring>Set the font properties that control the text.  fp must be a :class:`matplotlib.font_manager.FontProperties` object.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="horizontalalignment" name="horizontalalignment" port_type="basic:String">
+      <docstring>Set the horizontal alignment to one of</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['center', 'right', 'left']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox" name="bbox">
+      <docstring>Draw a bounding box around self.  rectprops are any settable properties for a rectangle, eg facecolor='red', alpha=0.5.
+
+t.set_bbox(dict(facecolor='red', alpha=0.5))
+
+If rectprops has "boxstyle" key. A FancyBboxPatch is initialized with rectprops and will be drawn. The mutation scale of the FancyBboxPath is set to the fontsize.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="backgroundcolor" name="backgroundcolor" port_type="basic:Color">
+      <docstring>Set the background color of the text by updating the bbox.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="position" name="position">
+      <docstring>Set the (x, y) position of the text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the y position of the text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="multialignment" name="multialignment" port_type="basic:String">
+      <docstring>Set the alignment for multiple lines layout.  The layout of the bounding box of all the lines is determined bu the horizontalalignment and verticalalignment properties, but the multiline text within that box can be</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'right', 'center']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="rotation" name="rotation" port_type="basic:String">
+      <docstring>Set the rotation of the text</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['angle in degrees', 'vertical', 'horizontal']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="size" name="size" port_type="basic:String">
+      <docstring>Set the font size.  May be either a size string, relative to the default font size, or an absolute font size in points.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['size in points', 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.text.TextWithDash" name="MplTextWithDashProperties" superclass="MplTextProperties">
+    <docstring>
+    This is basically a :class:`~matplotlib.text.Text` with a dash
+    (drawn with a :class:`~matplotlib.lines.Line2D`) before/after
+    it. It is intended to be a drop-in replacement for
+    :class:`~matplotlib.text.Text`, and should behave identically to
+    it when *dashlength* = 0.0.
+
+    The dash always comes between the point specified by
+    :meth:`~matplotlib.text.Text.set_position` and the text. When a
+    dash exists, the text alignment arguments (*horizontalalignment*,
+    *verticalalignment*) are ignored.
+
+    *dashlength* is the length of the dash in canvas units.
+    (default = 0.0).
+
+    *dashdirection* is one of 0 or 1, where 0 draws the dash after the
+    text and 1 before.  (default = 0).
+
+    *dashrotation* specifies the rotation of the dash, and should
+    generally stay *None*. In this case
+    :meth:`~matplotlib.text.TextWithDash.get_dashrotation` returns
+    :meth:`~matplotlib.text.Text.get_rotation`.  (I.e., the dash takes
+    its rotation from the text's rotation). Because the text center is
+    projected onto the dash, major deviations in the rotation cause
+    what may be considered visually unappealing results.
+    (default = *None*)
+
+    *dashpad* is a padding length to add (or subtract) space
+    between the text and the dash, in canvas units.
+    (default = 3)
+
+    *dashpush* "pushes" the dash and text away from the point
+    specified by :meth:`~matplotlib.text.Text.set_position` by the
+    amount in canvas units.  (default = 0)
+
+    .. note::
+
+        The alignment of the two objects is based on the bounding box
+        of the :class:`~matplotlib.text.Text`, as obtained by
+        :meth:`~matplotlib.artist.Artist.get_window_extent`.  This, in
+        turn, appears to depend on the font metrics as given by the
+        rendering backend. Hence the quality of the "centering" of the
+        label text with respect to the dash varies depending on the
+        backend used.
+
+    .. note::
+
+        I'm not sure that I got the
+        :meth:`~matplotlib.text.TextWithDash.get_window_extent` right,
+        or whether that's sufficient for providing the object bounding
+        box.
+
+    </docstring>
+    <inputPortSpec arg="dashpush" name="dashpush" port_type="basic:Float">
+      <docstring>Set the "push" of the TextWithDash, which is the extra spacing between the beginning of the dash and the specified position.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dashdirection" name="dashdirection">
+      <docstring>Set the direction of the dash following the text. 1 is before the text and 0 is after. The default is 0, which is what you'd want for the typical case of ticks below and on the left of the figure.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linespacing" arg_pos="9" constructor_arg="True" name="linespacing" />
+    <inputPortSpec arg="figure" name="figure">
+      <docstring>Set the figure instance the artist belong to.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="3" constructor_arg="True" name="color" />
+    <inputPortSpec arg="text" arg_pos="2" constructor_arg="True" name="text" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="verticalalignment" arg_pos="4" constructor_arg="True" name="verticalalignment" port_type="basic:String">
+      <defaults>['center']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="dashpad" name="dashpad" port_type="basic:Float">
+      <docstring>Set the "pad" of the TextWithDash, which is the extra spacing between the dash and the text, in canvas units.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dashrotation" name="dashrotation" port_type="basic:Float">
+      <docstring>Set the rotation of the dash, in degrees</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" name="transform">
+      <docstring>Set the :class:`matplotlib.transforms.Transform` instance used by this artist.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="fontproperties" arg_pos="7" constructor_arg="True" name="fontproperties" />
+    <inputPortSpec arg="multialignment" arg_pos="6" constructor_arg="True" name="multialignment" />
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the x position of the :class:`TextWithDash`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the y position of the :class:`TextWithDash`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="position" name="position">
+      <docstring>Set the (x, y) position of the :class:`TextWithDash`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dashlength" name="dashlength" port_type="basic:Float">
+      <docstring>Set the length of the dash.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rotation" arg_pos="8" constructor_arg="True" name="rotation" />
+    <inputPortSpec arg="horizontalalignment" arg_pos="5" constructor_arg="True" name="horizontalalignment" port_type="basic:String">
+      <defaults>['center']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.Tick" name="MplTickProperties" superclass="MplArtistProperties">
+    <docstring>
+    Abstract base class for the axis ticks, grid lines and labels
+
+    1 refers to the bottom of the plot for xticks and the left for yticks
+    2 refers to the top of the plot for xticks and the right for yticks
+
+    Publicly accessible attributes:
+
+      :attr:`tick1line`
+          a Line2D instance
+
+      :attr:`tick2line`
+          a Line2D instance
+
+      :attr:`gridline`
+          a Line2D instance
+
+      :attr:`label1`
+          a Text instance
+
+      :attr:`label2`
+          a Text instance
+
+      :attr:`gridOn`
+          a boolean which determines whether to draw the tickline
+
+      :attr:`tick1On`
+          a boolean which determines whether to draw the 1st tickline
+
+      :attr:`tick2On`
+          a boolean which determines whether to draw the 2nd tickline
+
+      :attr:`label1On`
+          a boolean which determines whether to draw tick label
+
+      :attr:`label2On`
+          a boolean which determines whether to draw tick label
+
+    </docstring>
+    <inputPortSpec arg="label1On" arg_pos="14" constructor_arg="True" name="label1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="loc" arg_pos="1" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="major" arg_pos="16" constructor_arg="True" name="major" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label2On" arg_pos="15" constructor_arg="True" name="label2On" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="5" constructor_arg="True" name="color" />
+    <inputPortSpec arg="label1" name="label1">
+      <docstring>Set the text of ticklabel</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label2" name="label2">
+      <docstring>Set the text of ticklabel2</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="clip_path" name="clip_path" port_type="basic:String">
+      <docstring>Set the artist's clip path, which may be:
+
+a :class:`~matplotlib.patches.Patch` (or subclass) instance
+
+
+
+None, to remove the clipping path
+
+For efficiency, if the path happens to be an axis-aligned rectangle, this method will set the clipping box to the corresponding rectangle and set the clipping path to None.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['(:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`)', ':class:`~matplotlib.patches.Patch`']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="label" name="label">
+      <docstring>Set the text of ticklabel</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelcolor" arg_pos="9" constructor_arg="True" name="labelcolor" />
+    <inputPortSpec arg="tickdir" arg_pos="6" constructor_arg="True" name="tickdir" />
+    <inputPortSpec arg="pad" name="pad" port_type="basic:Float">
+      <docstring>Set the tick label pad in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="gridOn" arg_pos="11" constructor_arg="True" name="gridOn" />
+    <inputPortSpec arg="zorder" arg_pos="10" constructor_arg="True" name="zorder" />
+    <inputPortSpec arg="tick2On" arg_pos="13" constructor_arg="True" name="tick2On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsize" arg_pos="8" constructor_arg="True" name="labelsize" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="tick1On" arg_pos="12" constructor_arg="True" name="tick1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="size" arg_pos="3" constructor_arg="True" name="size" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.XTick" name="MplXTickProperties" superclass="MplTickProperties">
+    <docstring>
+    Contains all the Artists needed to make an x tick - the tick line,
+    the label text and the grid line
+    </docstring>
+    <inputPortSpec arg="label1On" arg_pos="14" constructor_arg="True" name="label1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="loc" arg_pos="1" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="major" arg_pos="16" constructor_arg="True" name="major" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label2On" arg_pos="15" constructor_arg="True" name="label2On" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="5" constructor_arg="True" name="color" />
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label" arg_pos="2" constructor_arg="True" name="label" />
+    <inputPortSpec arg="labelcolor" arg_pos="9" constructor_arg="True" name="labelcolor" />
+    <inputPortSpec arg="tickdir" arg_pos="6" constructor_arg="True" name="tickdir" />
+    <inputPortSpec arg="pad" arg_pos="7" constructor_arg="True" name="pad" />
+    <inputPortSpec arg="gridOn" arg_pos="11" constructor_arg="True" name="gridOn" />
+    <inputPortSpec arg="zorder" arg_pos="10" constructor_arg="True" name="zorder" />
+    <inputPortSpec arg="tick2On" arg_pos="13" constructor_arg="True" name="tick2On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsize" arg_pos="8" constructor_arg="True" name="labelsize" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="tick1On" arg_pos="12" constructor_arg="True" name="tick1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="size" arg_pos="3" constructor_arg="True" name="size" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.YTick" name="MplYTickProperties" superclass="MplTickProperties">
+    <docstring>
+    Contains all the Artists needed to make a Y tick - the tick line,
+    the label text and the grid line
+    </docstring>
+    <inputPortSpec arg="label1On" arg_pos="14" constructor_arg="True" name="label1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="loc" arg_pos="1" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="major" arg_pos="16" constructor_arg="True" name="major" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label2On" arg_pos="15" constructor_arg="True" name="label2On" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="5" constructor_arg="True" name="color" />
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label" arg_pos="2" constructor_arg="True" name="label" />
+    <inputPortSpec arg="labelcolor" arg_pos="9" constructor_arg="True" name="labelcolor" />
+    <inputPortSpec arg="tickdir" arg_pos="6" constructor_arg="True" name="tickdir" />
+    <inputPortSpec arg="pad" arg_pos="7" constructor_arg="True" name="pad" />
+    <inputPortSpec arg="gridOn" arg_pos="11" constructor_arg="True" name="gridOn" />
+    <inputPortSpec arg="zorder" arg_pos="10" constructor_arg="True" name="zorder" />
+    <inputPortSpec arg="tick2On" arg_pos="13" constructor_arg="True" name="tick2On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsize" arg_pos="8" constructor_arg="True" name="labelsize" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="tick1On" arg_pos="12" constructor_arg="True" name="tick1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="size" arg_pos="3" constructor_arg="True" name="size" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.Axis" name="MplAxisProperties" superclass="MplArtistProperties">
+    <docstring>
+    Public attributes
+
+    * :attr:`axes.transData` - transform data coords to display coords
+    * :attr:`axes.transAxes` - transform axis coords to display coords
+    * :attr:`labelpad` - number of points between the axis and its label
+    </docstring>
+    <inputPortSpec arg="pickradius" name="pickradius">
+      <docstring>Set the depth of the axis used by the picker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="minor_formatter" name="minor_formatter">
+      <docstring>Set the formatter of the minor ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="smart_bounds" name="smart_bounds">
+      <docstring>set the axis to have smart bounds</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticks" name="ticksSequence" port_type="basic:List">
+      <docstring>Set the locations of the tick marks from sequence ticks</docstring>
+      <alternateSpec arg="ticks" name="ticksScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="view_interval" name="view_interval" />
+    <inputPortSpec arg="major_locator" name="major_locator">
+      <docstring>Set the locator of the major ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="major_formatter" name="major_formatter">
+      <docstring>Set the formatter of the major ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticklabels" name="ticklabelsSequence" port_type="basic:List">
+      <docstring>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.</docstring>
+      <alternateSpec arg="ticklabels" name="ticklabelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="clip_path" name="clip_path" />
+    <inputPortSpec arg="minor_locator" name="minor_locator">
+      <docstring>Set the locator of the minor ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="default_intervals" name="default_intervals" />
+    <inputPortSpec arg="scale" name="scale" />
+    <inputPortSpec arg="data_interval" name="data_interval">
+      <docstring>set the axis data limits</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label_text" name="label_text" port_type="basic:String">
+      <docstring>Sets the text value of the axis label</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label_coords" name="label_coords">
+      <docstring>Set the coordinates of the label.  By default, the x coordinate of the y label is determined by the tick label bounding boxes, but this can lead to poor alignment of multiple ylabels if there are multiple axes.  Ditto for the y coodinate of the x label.
+
+You can also specify the coordinate system of the label with the transform.  If None, the default coordinate system will be the axes coordinate system (0,0) is (left,bottom), (0.5, 0.5) is middle, etc</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="units" name="units">
+      <docstring>set the units for axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="tick_params" name="tick_params">
+      <docstring>Set appearance parameters for ticks and ticklabels.
+
+For documentation of keyword arguments, see :meth:`matplotlib.axes.Axes.tick_params`.</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.XAxis" name="MplXAxisProperties" superclass="MplAxisProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="view_interval" name="view_interval">
+      <docstring>If ignore is False, the order of vmin, vmax does not matter; the original axis orientation will be preserved. In addition, the view limits can be expanded, but will not be reduced.  This method is for mpl internal use; for normal use, see :meth:`~matplotlib.axes.Axes.set_xlim`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticks_position" name="ticks_position" port_type="basic:String">
+      <docstring>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. 'none' and 'both' affect only the ticks, not the labels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['top', 'bottom', 'both', 'default', 'none']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label_position" name="label_position" port_type="basic:String">
+      <docstring>Set the label position (top or bottom)</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['top', 'bottom']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="default_intervals" name="default_intervals">
+      <docstring>set the default limits for the axis interval if they are not mutated</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data_interval" name="data_interval">
+      <docstring>set the axis data limits</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" arg_pos="1" constructor_arg="True" name="pickradius" port_type="basic:Integer">
+      <defaults>['15']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.YAxis" name="MplYAxisProperties" superclass="MplAxisProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="offset_position" name="offset_position" />
+    <inputPortSpec arg="view_interval" name="view_interval">
+      <docstring>If ignore is False, the order of vmin, vmax does not matter; the original axis orientation will be preserved. In addition, the view limits can be expanded, but will not be reduced.  This method is for mpl internal use; for normal use, see :meth:`~matplotlib.axes.Axes.set_ylim`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticks_position" name="ticks_position" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'right', 'both', 'default', 'none']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label_position" name="label_position" port_type="basic:String">
+      <docstring>Set the label position (left or right)</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'right']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="default_intervals" name="default_intervals">
+      <docstring>set the default limits for the axis interval if they are not mutated</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data_interval" name="data_interval">
+      <docstring>set the axis data limits</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" arg_pos="1" constructor_arg="True" name="pickradius" port_type="basic:Integer">
+      <defaults>['15']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.legend.Legend" name="MplLegendProperties" superclass="MplArtistProperties">
+    <docstring>
+    Place a legend on the axes at location loc.  Labels are a
+    sequence of strings and loc can be a string or an integer
+    specifying the legend location
+
+    The location codes are::
+
+      'best'         : 0, (only implemented for axis legends)
+      'upper right'  : 1,
+      'upper left'   : 2,
+      'lower left'   : 3,
+      'lower right'  : 4,
+      'right'        : 5,
+      'center left'  : 6,
+      'center right' : 7,
+      'lower center' : 8,
+      'upper center' : 9,
+      'center'       : 10,
+
+    loc can be a tuple of the noramilzed coordinate values with
+    respect its parent.
+
+    </docstring>
+    <inputPortSpec arg="fancybox" arg_pos="24" constructor_arg="True" name="fancybox" />
+    <inputPortSpec arg="handlelength" arg_pos="17" constructor_arg="True" name="handlelength" />
+    <inputPortSpec arg="labels" arg_pos="2" constructor_arg="True" name="labels" />
+    <inputPortSpec arg="labelspacing" arg_pos="16" constructor_arg="True" name="labelspacing" />
+    <inputPortSpec arg="columnspacing" arg_pos="21" constructor_arg="True" name="columnspacing" />
+    <inputPortSpec arg="handletextpad" arg_pos="19" constructor_arg="True" name="handletextpad" />
+    <inputPortSpec arg="ncol" arg_pos="22" constructor_arg="True" name="ncol" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="borderaxespad" arg_pos="20" constructor_arg="True" name="borderaxespad" />
+    <inputPortSpec arg="loc" arg_pos="3" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="bbox_to_anchor" name="bbox_to_anchor">
+      <docstring>set the bbox that the legend will be anchored.
+
+bbox can be a BboxBase instance, a tuple of [left, bottom, width, height] in the given transform (normalized axes coordinate if None), or a tuple of [left, bottom] where the width and height will be assumed to be zero.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="title" name="title">
+      <docstring>set the legend title. Fontproperties can be optionally set with prop parameter.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="handletextsep" arg_pos="13" constructor_arg="True" name="handletextsep" />
+    <inputPortSpec arg="numpoints" arg_pos="4" constructor_arg="True" name="numpoints" />
+    <inputPortSpec arg="prop" arg_pos="8" constructor_arg="True" name="prop" />
+    <inputPortSpec arg="handles" arg_pos="1" constructor_arg="True" name="handles" />
+    <inputPortSpec arg="pad" arg_pos="10" constructor_arg="True" name="pad" />
+    <inputPortSpec arg="borderpad" arg_pos="15" constructor_arg="True" name="borderpad" />
+    <inputPortSpec arg="parent" arg_pos="0" constructor_arg="True" name="parent" />
+    <inputPortSpec arg="axespad" arg_pos="14" constructor_arg="True" name="axespad" />
+    <inputPortSpec arg="labelsep" arg_pos="11" constructor_arg="True" name="labelsep" />
+    <inputPortSpec arg="frame_on" name="frame_on" port_type="basic:Boolean">
+      <docstring>Set whether the legend box patch is drawn</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scatterpoints" arg_pos="6" constructor_arg="True" name="scatterpoints" port_type="basic:Integer">
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="fontsize" arg_pos="9" constructor_arg="True" name="fontsize" />
+    <inputPortSpec arg="shadow" arg_pos="25" constructor_arg="True" name="shadow" />
+    <inputPortSpec arg="handler_map" arg_pos="30" constructor_arg="True" name="handler_map" />
+    <inputPortSpec arg="handleheight" arg_pos="18" constructor_arg="True" name="handleheight" />
+    <inputPortSpec arg="scatteryoffsets" arg_pos="7" constructor_arg="True" name="scatteryoffsets" />
+    <inputPortSpec arg="markerscale" arg_pos="5" constructor_arg="True" name="markerscale" />
+    <inputPortSpec arg="frameon" arg_pos="29" constructor_arg="True" name="frameon" />
+    <inputPortSpec arg="mode" arg_pos="23" constructor_arg="True" name="mode" />
+    <inputPortSpec arg="handlelen" arg_pos="12" constructor_arg="True" name="handlelen" />
+    <inputPortSpec arg="default_handler_map" name="default_handler_map">
+      <docstring>A class method to set the default handler map.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_transform" arg_pos="28" constructor_arg="True" name="bbox_transform" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axes.Axes" name="MplAxesProperties" superclass="MplArtistProperties">
+    <docstring>
+    The :class:`Axes` contains most of the figure elements:
+    :class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axis.Tick`,
+    :class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.text.Text`,
+    :class:`~matplotlib.patches.Polygon`, etc., and sets the
+    coordinate system.
+
+    The :class:`Axes` instance supports callbacks through a callbacks
+    attribute which is a :class:`~matplotlib.cbook.CallbackRegistry`
+    instance.  The events you can connect to are 'xlim_changed' and
+    'ylim_changed' and the callback will be called with func(*ax*)
+    where *ax* is the :class:`Axes` instance.
+    </docstring>
+    <inputPortSpec arg="adjustable" name="adjustable" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['box', 'datalim', 'box-forced']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cursor_props" name="cursor_props" port_type="basic:Float">
+      <docstring>Set the cursor property as:
+
+ax.set_cursor_props(linewidth, color)
+
+or:
+
+ax.set_cursor_props((linewidth, color))</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" name="figure">
+      <docstring>Set the class:~matplotlib.axes.Axes figure
+
+accepts a class:~matplotlib.figure.Figure instance</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="yscale" name="yscale">
+      <docstring>Call signature:
+
+set_yscale(value)
+
+Set the scaling of the y-axis: 'linear' | 'log' | 'symlog' Different kwargs are accepted, depending on the scale: 'linear'
+
+'log'
+
+
+
+'symlog'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="navigate" name="navigate" port_type="basic:Boolean">
+      <docstring>Set whether the axes responds to navigation toolbar commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="aspect" name="aspect">
+      <docstring>aspect
+
+
+
+adjustable
+
+
+
+'box' does not allow axes sharing, as this can cause unintended side effect. For cases when sharing axes is fine, use 'box-forced'.
+
+anchor</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['auto', 'normal', 'equal', 'num']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="axis_bgcolor" name="axis_bgcolor" port_type="basic:Color">
+      <docstring>set the axes background color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="ylim" name="ylimSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_ylim(self, *args, **kwargs):
+
+Set the data limits for the yaxis
+
+Examples:
+
+set_ylim((bottom, top)) set_ylim(bottom, top) set_ylim(bottom=1) # top unchanged set_ylim(top=1) # bottom unchanged
+
+Keyword arguments:
+
+
+
+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</docstring>
+      <alternateSpec arg="ylim" name="ylimScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="sharey" arg_pos="5" constructor_arg="True" name="sharey" />
+    <inputPortSpec arg="xlim" name="xlimSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_xlim(self, *args, **kwargs):
+
+Set the data limits for the xaxis
+
+Examples:
+
+set_xlim((left, right)) set_xlim(left, right) set_xlim(left=1) # right unchanged set_xlim(right=1) # left unchanged
+
+Keyword arguments:
+
+
+
+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:
+
+set_ylim(5000, 0)
+
+so 5000 years ago is on the left of the plot and the present is on the right.
+
+Returns the current xlimits as a length 2 tuple</docstring>
+      <alternateSpec arg="xlim" name="xlimScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="axis_on" name="axis_on">
+      <docstring>turn on the axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="title" name="title">
+      <docstring>Call signature:
+
+set_title(label, fontdict=None, **kwargs):
+
+Set the title for the axes.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axisbg" arg_pos="2" constructor_arg="True" name="axisbg" />
+    <inputPortSpec arg="label" arg_pos="6" constructor_arg="True" name="label" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xticks" name="xticks" port_type="basic:List">
+      <docstring>Set the x ticks with list of ticks</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="fig" arg_pos="0" constructor_arg="True" name="fig" />
+    <inputPortSpec arg="ylabel" name="ylabel">
+      <docstring>Call signature:
+
+set_ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)
+
+Set the label for the yaxis
+
+labelpad is the spacing in points between the label and the y-axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="autoscalex_on" name="autoscalex_on" port_type="basic:Boolean">
+      <docstring>Set whether autoscaling for the x-axis is applied on plot commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rasterization_zorder" name="rasterization_zorder">
+      <docstring>Set zorder value below which artists will be rasterized.  Set to None to disable rasterizing of artists below a particular zorder.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axes_locator" name="axes_locator">
+      <docstring>set axes_locator</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axisbelow" name="axisbelow" port_type="basic:Boolean">
+      <docstring>Set whether the axis ticks and gridlines are above or below most artists</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="frame_on" name="frame_on" port_type="basic:Boolean">
+      <docstring>Set whether the axes rectangle patch is drawn</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="navigate_mode" name="navigate_mode">
+      <docstring>Set the navigation toolbar button status;
+
+this is not a user-API function.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xscale" name="xscale">
+      <docstring>Call signature:
+
+set_xscale(value)
+
+Set the scaling of the x-axis: 'linear' | 'log' | 'symlog' Different kwargs are accepted, depending on the scale: 'linear'
+
+'log'
+
+
+
+'symlog'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axis_off" name="axis_off">
+      <docstring>turn off the axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="autoscale_on" name="autoscale_on" port_type="basic:Boolean">
+      <docstring>Set whether autoscaling is applied on plot commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ybound" name="ybound">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rect" arg_pos="1" constructor_arg="True" name="rect" />
+    <inputPortSpec arg="sharex" arg_pos="4" constructor_arg="True" name="sharex" />
+    <inputPortSpec arg="yticklabels" name="yticklabelsSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_yticklabels(labels, fontdict=None, minor=False, **kwargs)
+
+Set the y tick labels with list of strings labels.  Return a list of :class:`~matplotlib.text.Text` instances.
+
+kwargs set :class:`~matplotlib.text.Text` properties for the labels. Valid properties are
+
+agg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplotlib color bbox: rectangle prop dict clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] color: any matplotlib color contains: a callable fun [...]
+      <alternateSpec arg="yticklabels" name="yticklabelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="autoscaley_on" name="autoscaley_on" port_type="basic:Boolean">
+      <docstring>Set whether autoscaling for the y-axis is applied on plot commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xmargin" name="xmargin" port_type="basic:Float">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color_cycle" name="color_cycle" port_type="basic:Color">
+      <docstring>Set the color cycle for any future plot commands on this Axes.
+
+clist is a list of mpl color specifiers.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="frameon" arg_pos="3" constructor_arg="True" name="frameon" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xlabel" name="xlabel">
+      <docstring>Call signature:
+
+set_xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)
+
+Set the label for the xaxis.
+
+labelpad is the spacing in points between the label and the x-axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xbound" name="xbound">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="yticks" name="yticks" port_type="basic:List">
+      <docstring>Set the y ticks with list of ticks Keyword arguments:</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ymargin" name="ymargin" port_type="basic:Float">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="position" name="position">
+      <docstring>Set the axes position with:
+
+pos = [left, bottom, width, height]
+
+in relative 0,1 coords, or pos can be a :class:`~matplotlib.transforms.Bbox`
+
+There are two position variables: one which is ultimately used, but which may be modified by :meth:`apply_aspect`, and a second which is the starting point for :meth:`apply_aspect`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="anchor" name="anchor" port_type="basic:String">
+      <docstring>anchor</docstring>
+      <translations>{'bottom right': 'SE', 'right': 'E', 'Center': 'C', 'bottom': 'S', 'top right': 'NE', 'bottom left': 'SW', 'top left': 'NW', 'top': 'N', 'left': 'W'}</translations>
+      <values>[['Center', 'bottom left', 'bottom', 'bottom right', 'right', 'top right', 'top', 'top left', 'left']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="xticklabels" name="xticklabelsSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_xticklabels(labels, fontdict=None, minor=False, **kwargs)
+
+Set the xtick labels with list of strings labels. Return a list of axis text instances.
+
+kwargs set the :class:`~matplotlib.text.Text` properties. Valid properties are
+
+agg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplotlib color bbox: rectangle prop dict clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] color: any matplotlib color contains: a callable fun [...]
+      <alternateSpec arg="xticklabels" name="xticklabelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <outputPortSpec arg="title" compute_name="title" compute_parent="title" name="titleProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.text.Text" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axes.AxesSubplot" name="MplAxesSubplotProperties" superclass="MplAxesProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="fig" arg_pos="0" constructor_arg="True" name="fig" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.figure.Figure" name="MplFigureProperties" superclass="MplArtistProperties">
+    <docstring>
+    The Figure instance supports callbacks through a *callbacks*
+    attribute which is a :class:`matplotlib.cbook.CallbackRegistry`
+    instance.  The events you can connect to are 'dpi_changed', and
+    the callback will be called with ``func(fig)`` where fig is the
+    :class:`Figure` instance.
+
+    *patch*
+       The figure patch is drawn by a
+       :class:`matplotlib.patches.Rectangle` instance
+
+    *suppressComposite*
+       For multiple figure images, the figure will make composite
+       images depending on the renderer option_image_nocomposite
+       function.  If suppressComposite is True|False, this will
+       override the renderer.
+    </docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>Set the edge color of the Figure rectangle</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="canvas" name="canvas">
+      <docstring>Set the canvas the contains the figure</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="facecolor" name="facecolor" port_type="basic:Color">
+      <docstring>Set the face color of the Figure rectangle</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="size_inches" name="size_inches">
+      <docstring>set_size_inches(w,h, forward=False)
+
+Set the figure size in inches
+
+Usage:
+
+fig.set_size_inches(w,h)  # OR fig.set_size_inches((w,h) )
+
+optional kwarg forward=True will cause the canvas size to be automatically updated; eg you can resize the figure window from the shell</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figwidth" name="figwidth" port_type="basic:Float">
+      <docstring>Set the width of the figure in inches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="frameon" name="frameon" port_type="basic:Boolean">
+      <docstring>Set whether the figure frame (background) is displayed or invisible</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="subplotpars" arg_pos="6" constructor_arg="True" name="subplotpars" />
+    <inputPortSpec arg="figheight" name="figheight" port_type="basic:Float">
+      <docstring>Set the height of the figure in inches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figsize" arg_pos="0" constructor_arg="True" name="figsize" />
+    <inputPortSpec arg="linewidth" arg_pos="4" constructor_arg="True" name="linewidth" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="tight_layout" name="tight_layout" port_type="basic:Boolean">
+      <docstring>Set whether :meth:`tight_layout` is used upon drawing. If None, the rcParams['figure.autolayout'] value will be set.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dpi" name="dpi" port_type="basic:Float">
+      <docstring>Set the dots-per-inch of the figure</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.text.Annotation" name="MplAnnotationProperties" superclass="MplTextProperties">
+    <docstring>
+    A :class:`~matplotlib.text.Text` class to make annotating things
+    in the figure, such as :class:`~matplotlib.figure.Figure`,
+    :class:`~matplotlib.axes.Axes`,
+    :class:`~matplotlib.patches.Rectangle`, etc., easier.
+    </docstring>
+    <inputPortSpec arg="xycoords" arg_pos="3" constructor_arg="True" name="xycoords" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+      <defaults>['data']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" name="figure" />
+    <inputPortSpec arg="annotation_clip" arg_pos="6" constructor_arg="True" name="annotation_clip" />
+    <inputPortSpec arg="xytext" arg_pos="2" constructor_arg="True" name="xytext" />
+    <inputPortSpec arg="s" arg_pos="0" constructor_arg="True" name="s" />
+    <inputPortSpec arg="xy" arg_pos="1" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="textcoords" arg_pos="4" constructor_arg="True" name="textcoords">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowprops" arg_pos="5" constructor_arg="True" name="arrowprops" />
+  </moduleSpec>
+</specs>
diff --git a/vistrails/packages/matplotlib/mpl_artists_diff.xml b/vistrails/packages/matplotlib/mpl_artists_diff.xml
new file mode 100644
index 0000000..b160a37
--- /dev/null
+++ b/vistrails/packages/matplotlib/mpl_artists_diff.xml
@@ -0,0 +1,36 @@
+<diff>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.artist.Artist" port="picker" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.artist.Artist" port="picker" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.artist.Artist" port="clip_path" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.artist.Artist" port="clip_path" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="name" code_ref="matplotlib.axes.Axes" port="xticks" type="input">
+    <value>xticks</value>
+  </changePortSpec>
+  <deletePortSpec altName="xticksScalar" code_ref="matplotlib.axes.Axes" port="xticks" type="alternate" />
+  <changePortSpec attr="name" code_ref="matplotlib.axes.Axes" port="yticks" type="input">
+    <value>yticks</value>
+  </changePortSpec>
+  <deletePortSpec altName="yticksScalar" code_ref="matplotlib.axes.Axes" port="yticks" type="alternate" />
+  <addPortSpec code_ref="matplotlib.axes.Axes" port="title" type="output">
+    <value>
+      <outputPortSpec arg="title" compute_name="title" compute_parent="title" name="titleProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.text.Text" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="translations" code_ref="matplotlib.lines.Line2D" port="marker" type="input">
+    <value>{'caretright': 5, 'star': '*', 'point': '.', 'mathtext': '$...$', 'triangle_right': '>', 'tickup': 2, 'hexagon1': 'h', 'plus': '+', 'hline': '_', 'vline': '|', 'tickdown': 3, 'nothing': ' ', 'caretup': 6, 'caretleft': 4, 'pentagon': 'p', 'tri_left': '3', 'tickleft': 0, 'tickright': 1, 'tri_down': '1', 'thin_diamond': 'd', 'diamond': 'D', 'caretdown': 7, 'hexagon2': 'H', 'tri_up': '2', 'square': 's', 'x': 'x', 'triangle_down': 'v', 'triangle_up': '^', 'octagon': '8', 'tri_ri [...]
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.lines.Line2D" port="marker" type="input">
+    <value>['enum']</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.lines.Line2D" port="marker" type="input">
+    <value>[['caretdown', 'caretleft', 'caretright', 'caretup', 'circle', 'diamond', 'hexagon1', 'hexagon2', 'hline', 'nothing', 'octagon', 'pentagon', 'pixel', 'plus', 'point', 'square', 'star', 'thin_diamond', 'tickdown', 'tickleft', 'tickright', 'tickup', 'tri_down', 'tri_left', 'tri_right', 'tri_up', 'triangle_down', 'triangle_left', 'triangle_right', 'triangle_up', 'vline', 'x', 'mathtext']]</value>
+  </changePortSpec>
+</diff>
diff --git a/vistrails/packages/matplotlib/mpl_artists_raw.xml b/vistrails/packages/matplotlib/mpl_artists_raw.xml
new file mode 100644
index 0000000..d3c6f67
--- /dev/null
+++ b/vistrails/packages/matplotlib/mpl_artists_raw.xml
@@ -0,0 +1,1935 @@
+<specs>
+  <customCode />
+  <moduleSpec code_ref="matplotlib.artist.Artist" name="MplArtistProperties" superclass="MplProperties">
+    <docstring>
+    Abstract base class for someone who renders into a
+    :class:`FigureCanvas`.
+    </docstring>
+    <inputPortSpec arg="picker" name="picker">
+      <docstring>Set the epsilon for picking used by this artist
+
+picker can be one of the following:
+
+None: picking is disabled for this artist (default)
+
+A boolean: if True then picking will be enabled and the artist will fire a pick event if the mouse event is over the artist
+
+A float: if picker is a number it is interpreted as an epsilon tolerance in points and the artist will fire off an event if it's data is within epsilon of the mouse event.  For some artists like lines and patch collections, the artist may provide additional data to the pick event that is generated, e.g. the indices of the data within epsilon of the pick event
+
+A function: if picker is callable, it is a user supplied function which determines whether the artist is hit by the mouse event:
+
+hit, props = picker(artist, mouseevent)
+
+to determine the hit test.  if the mouse event is over the artist, return hit=True and props is a dictionary of properties you want added to the PickEvent attributes.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[<built-in function callable>]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="contains" name="contains">
+      <docstring>Replace the contains test used by this artist. The new picker should be a callable function which determines whether the artist is hit by the mouse event:
+
+hit, props = picker(artist, mouseevent)
+
+If the mouse event is over the artist, return hit = True and props is a dictionary of properties you want returned with the contains test.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_on" name="clip_on" port_type="basic:Boolean">
+      <docstring>Set whether artist uses clipping.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="agg_filter" name="agg_filter">
+      <docstring>set agg_filter fuction.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="visible" name="visible" port_type="basic:Boolean">
+      <docstring>Set the artist's visiblity.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="url" name="url" port_type="basic:String">
+      <docstring>Sets the url for the artist</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" name="transform">
+      <docstring>Set the :class:`~matplotlib.transforms.Transform` instance used by this artist.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" name="axes">
+      <docstring>Set the :class:`~matplotlib.axes.Axes` instance in which the artist resides, if any.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_box" name="clip_box">
+      <docstring>Set the artist's clip :class:`~matplotlib.transforms.Bbox`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_path" name="clip_path" port_type="basic:String">
+      <docstring>Set the artist's clip path, which may be:
+
+a :class:`~matplotlib.patches.Patch` (or subclass) instance
+
+
+
+None, to remove the clipping path
+
+For efficiency, if the path happens to be an axis-aligned rectangle, this method will set the clipping box to the corresponding rectangle and set the clipping path to None.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['(:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`)', ':class:`~matplotlib.patches.Patch`']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="lod" name="lod" port_type="basic:Boolean">
+      <docstring>Set Level of Detail on or off.  If on, the artists may examine things like the pixel width of the axes and draw a subset of their contents accordingly</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label" name="label" port_type="basic:String">
+      <docstring>Set the label to s for auto legend.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rasterized" name="rasterized" port_type="basic:Boolean">
+      <docstring>Force rasterized (bitmap) drawing in vector backend output.
+
+Defaults to None, which implies the backend's default behavior</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="gid" name="gid" port_type="basic:String">
+      <docstring>Sets the (group) id for the artist</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="zorder" name="zorder">
+      <docstring>Set the zorder for the artist.  Artists with lower zorder values are drawn first.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="snap" name="snap">
+      <docstring>Sets the snap setting which may be:
+
+True: snap vertices to the nearest pixel center
+
+False: leave vertices as-is
+
+None: (auto) If the path contains only rectilinear line segments, round to the nearest pixel center
+
+Only supported by the Agg and MacOSX backends.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha value used for blending - not supported on all backends.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="animated" name="animated" port_type="basic:Boolean">
+      <docstring>Set the artist's animation state.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" name="figure">
+      <docstring>Set the :class:`~matplotlib.figure.Figure` instance the artist belongs to.</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image._AxesImageBase" name="Mpl_AxesImageBaseProperties" superclass="MplArtistProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="origin" arg_pos="4" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="resample" name="resample" port_type="basic:Boolean">
+      <docstring>Set whether or not image resampling is used</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="filternorm" name="filternorm">
+      <docstring>Set whether the resize filter norms the weights -- see help for imshow</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha value used for blending - not supported on all backends</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="array" name="array">
+      <docstring>Retained for backwards compatibility - use set_data instead</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the image array</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="filterrad" name="filterrad" port_type="basic:Float">
+      <docstring>Set the resize filter radius only applicable to some interpolation schemes -- see help for imshow</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="interpolation" name="interpolation" port_type="basic:String">
+      <docstring>Set the interpolation method the image uses when resizing.
+
+if None, use a value from rc setting. If 'none', the image is shown as is without interpolating. 'none' is only supported in agg, ps and pdf backends and will fall back to 'nearest' mode for other backends.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos', 'none', '']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.AxesImage" name="MplAxesImageProperties" superclass="Mpl_AxesImageBaseProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="origin" arg_pos="4" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="resample" arg_pos="8" constructor_arg="True" name="resample" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="filterrad" arg_pos="7" constructor_arg="True" name="filterrad" port_type="basic:Float">
+      <defaults>['4.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="extent" name="extent">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="filternorm" arg_pos="6" constructor_arg="True" name="filternorm" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="interpolation" arg_pos="3" constructor_arg="True" name="interpolation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.NonUniformImage" name="MplNonUniformImageProperties" superclass="MplAxesImageProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="norm" name="norm" />
+    <inputPortSpec arg="cmap" name="cmap" />
+    <inputPortSpec arg="filternorm" name="filternorm" />
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="array" name="array" />
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the grid for the pixel centers, and the pixel values.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="filterrad" name="filterrad" />
+    <inputPortSpec arg="interpolation" name="interpolation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.BboxImage" name="MplBboxImageProperties" superclass="Mpl_AxesImageBaseProperties">
+    <docstring>The Image class whose size is determined by the given bbox.</docstring>
+    <inputPortSpec arg="origin" arg_pos="4" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="interp_at_native" arg_pos="8" constructor_arg="True" name="interp_at_native" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="resample" arg_pos="7" constructor_arg="True" name="resample" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="filternorm" arg_pos="5" constructor_arg="True" name="filternorm" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+    <inputPortSpec arg="interpolation" arg_pos="3" constructor_arg="True" name="interpolation" />
+    <inputPortSpec arg="filterrad" arg_pos="6" constructor_arg="True" name="filterrad" port_type="basic:Float">
+      <defaults>['4.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox" arg_pos="0" constructor_arg="True" name="bbox" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.PcolorImage" name="MplPcolorImageProperties" superclass="MplArtistProperties">
+    <docstring>
+    Make a pcolor-style plot with an irregular rectangular grid.
+
+    This uses a variation of the original irregular image code,
+    and it is used by pcolorfast for the corresponding grid type.
+    </docstring>
+    <inputPortSpec arg="A" arg_pos="3" constructor_arg="True" name="A" />
+    <inputPortSpec arg="ax" arg_pos="0" constructor_arg="True" name="ax" />
+    <inputPortSpec arg="cmap" arg_pos="4" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="x" arg_pos="1" constructor_arg="True" name="x" />
+    <inputPortSpec arg="y" arg_pos="2" constructor_arg="True" name="y" />
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha value used for blending - not supported on all backends</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="array" name="array" />
+    <inputPortSpec arg="data" name="data" />
+    <inputPortSpec arg="norm" arg_pos="5" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.image.FigureImage" name="MplFigureImageProperties" superclass="MplArtistProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="origin" arg_pos="5" constructor_arg="True" name="origin" />
+    <inputPortSpec arg="offsetx" arg_pos="3" constructor_arg="True" name="offsetx" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="offsety" arg_pos="4" constructor_arg="True" name="offsety" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="1" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="fig" arg_pos="0" constructor_arg="True" name="fig" />
+    <inputPortSpec arg="array" name="array">
+      <docstring>Deprecated; use set_data for consistency with other image types.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the image array.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="2" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.Collection" name="MplCollectionProperties" superclass="MplArtistProperties">
+    <docstring>
+    Base class for Collections.  Must be subclassed to be usable.
+
+    All properties in a collection must be sequences or scalars;
+    if scalars, they will be converted to sequences.  The
+    property of the ith element of the collection is::
+
+      prop[i % len(props)]
+
+    Keyword arguments and default values:
+
+        * *edgecolors*: None
+        * *facecolors*: None
+        * *linewidths*: None
+        * *antialiaseds*: None
+        * *offsets*: None
+        * *transOffset*: transforms.IdentityTransform()
+        * *offset_position*: 'screen' (default) or 'data'
+        * *norm*: None (optional for
+          :class:`matplotlib.cm.ScalarMappable`)
+        * *cmap*: None (optional for
+          :class:`matplotlib.cm.ScalarMappable`)
+        * *hatch*: None
+
+    *offsets* and *transOffset* are used to translate the patch after
+    rendering (default no offsets).  If offset_position is 'screen'
+    (default) the offset is applied after the master transform has
+    been applied, that is, the offsets are in screen coordinates.  If
+    offset_position is 'data', the offset is applied before the master
+    transform, i.e., the offsets are in data coordinates.
+
+    If any of *edgecolors*, *facecolors*, *linewidths*, *antialiaseds*
+    are None, they default to their :data:`matplotlib.rcParams` patch
+    setting, in sequence form.
+
+    The use of :class:`~matplotlib.cm.ScalarMappable` is optional.  If
+    the :class:`~matplotlib.cm.ScalarMappable` matrix _A is not None
+    (ie a call to set_array has been made), at draw time a call to
+    scalar mappable will be made to set the face colors.
+    </docstring>
+    <inputPortSpec arg="transOffset" arg_pos="6" constructor_arg="True" name="transOffset" />
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:List">
+      <docstring>Set the edgecolor(s) of the collection. c can be a matplotlib color arg (all patches have same color), or a sequence of rgba tuples; if it is a sequence the patches will cycle through the sequence.
+
+If c is 'face', the edge color will always be the same as the face color.  If it is 'none', the patch boundary will not be drawn.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="offset_position" name="offset_position">
+      <docstring>Set how offsets are applied.  If offset_position is 'screen' (default) the offset is applied after the master transform has been applied, that is, the offsets are in screen coordinates. If offset_position is 'data', the offset is applied before the master transform, i.e., the offsets are in data coordinates.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="edgecolors" arg_pos="0" constructor_arg="True" name="edgecolors" />
+    <inputPortSpec arg="facecolor" name="facecolor" port_type="basic:List">
+      <docstring>Set the facecolor(s) of the collection.  c can be a matplotlib color arg (all patches have same color), or a sequence of rgba tuples; if it is a sequence the patches will cycle through the sequence.
+
+If c is 'none', the patch will not be filled.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" arg_pos="3" constructor_arg="True" name="linestyles" port_type="basic:String">
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="offsets" name="offsetsSequence" port_type="basic:List">
+      <docstring>Set the offsets for the collection.  offsets can be a scalar or a sequence.</docstring>
+      <alternateSpec arg="" name="offsetsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:List">
+      <docstring>Set both the edgecolor and the facecolor. .. seealso:
+
+:meth:`set_facecolor`, :meth:`set_edgecolor`    For setting the edge or face color individually.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" name="pickradius" />
+    <inputPortSpec arg="antialiaseds" arg_pos="4" constructor_arg="True" name="antialiaseds" />
+    <inputPortSpec arg="linewidths" arg_pos="2" constructor_arg="True" name="linewidths" />
+    <inputPortSpec arg="cmap" arg_pos="8" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="antialiased" name="antialiasedSequence" port_type="basic:List">
+      <docstring>Set the antialiasing state for rendering.</docstring>
+      <alternateSpec arg="" name="antialiasedScalar" port_type="basic:Boolean" />
+    </inputPortSpec>
+    <inputPortSpec arg="urls" name="urls" />
+    <inputPortSpec arg="hatch" name="hatch" port_type="basic:String">
+      <docstring>Set the hatching pattern
+
+hatch can be one of:
+
+/   - diagonal hatching \   - back diagonal |   - vertical -   - horizontal +   - crossed x   - crossed diagonal o   - small circle O   - large circle .   - dots *   - stars
+
+Letters can be combined, in which case all the specified hatchings are done.  If same letter repeats, it increases the density of hatching of that pattern.
+
+Hatching is supported in the PostScript, PDF, SVG and Agg backends only.
+
+Unlike other properties such as linewidth and colors, hatching can only be specified for the collection as a whole, not separately for each member.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['/', "'\\'", "'", "'", '-', '+', 'x', 'o', 'O', '.', '*']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha tranparencies of the collection.  alpha must be a float or None.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="linewidth" name="linewidthSequence" port_type="basic:List">
+      <docstring>Set the linewidth(s) for the collection.  lw can be a scalar or a sequence; if it is a sequence the patches will cycle through the sequence</docstring>
+      <alternateSpec arg="" name="linewidthScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linestyle" name="linestyle" port_type="basic:String">
+      <docstring>Set the linestyle(s) for the collection.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['solid', ('dashed', 'dashdot', 'dotted'), '(offset, on-off-dash-seq)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="facecolors" arg_pos="1" constructor_arg="True" name="facecolors" />
+    <inputPortSpec arg="norm" arg_pos="7" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.PathCollection" name="MplPathCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    This is the most basic :class:`Collection` subclass.
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="sizes" arg_pos="1" constructor_arg="True" name="sizes" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.PolyCollection" name="MplPolyCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="paths" name="paths">
+      <docstring>This allows one to delay initialization of the vertices.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="verts" name="verts">
+      <docstring>This allows one to delay initialization of the vertices.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="closed" arg_pos="2" constructor_arg="True" name="closed" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="1" constructor_arg="True" name="sizes" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.BrokenBarHCollection" name="MplBrokenBarHCollectionProperties" superclass="MplPolyCollectionProperties">
+    <docstring>
+    A collection of horizontal bars spanning *yrange* with a sequence of
+    *xranges*.
+    </docstring>
+    <inputPortSpec arg="xranges" arg_pos="0" constructor_arg="True" name="xranges" />
+    <inputPortSpec arg="yrange" arg_pos="1" constructor_arg="True" name="yrange" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.RegularPolyCollection" name="MplRegularPolyCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>Draw a collection of regular polygons with *numsides*.</docstring>
+    <inputPortSpec arg="numsides" arg_pos="0" constructor_arg="True" name="numsides" />
+    <inputPortSpec arg="rotation" arg_pos="1" constructor_arg="True" name="rotation" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="2" constructor_arg="True" name="sizes">
+      <defaults>['(1,)']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.StarPolygonCollection" name="MplStarPolygonCollectionProperties" superclass="MplRegularPolyCollectionProperties">
+    <docstring>
+    Draw a collection of regular stars with *numsides* points.</docstring>
+    <inputPortSpec arg="numsides" arg_pos="0" constructor_arg="True" name="numsides" />
+    <inputPortSpec arg="rotation" arg_pos="1" constructor_arg="True" name="rotation" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="2" constructor_arg="True" name="sizes">
+      <defaults>['(1,)']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.AsteriskPolygonCollection" name="MplAsteriskPolygonCollectionProperties" superclass="MplRegularPolyCollectionProperties">
+    <docstring>
+    Draw a collection of regular asterisks with *numsides* points.</docstring>
+    <inputPortSpec arg="numsides" arg_pos="0" constructor_arg="True" name="numsides" />
+    <inputPortSpec arg="rotation" arg_pos="1" constructor_arg="True" name="rotation" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" arg_pos="2" constructor_arg="True" name="sizes">
+      <defaults>['(1,)']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.LineCollection" name="MplLineCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    All parameters must be sequences or scalars; if scalars, they will
+    be converted to sequences.  The property of the ith line
+    segment is::
+
+       prop[i % len(props)]
+
+    i.e., the properties cycle if the ``len`` of props is less than the
+    number of segments.
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="antialiaseds" arg_pos="3" constructor_arg="True" name="antialiaseds" />
+    <inputPortSpec arg="linestyles" arg_pos="4" constructor_arg="True" name="linestyles" port_type="basic:String">
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="offsets" arg_pos="5" constructor_arg="True" name="offsets" />
+    <inputPortSpec arg="color" name="color" port_type="basic:List">
+      <docstring>Set the color(s) of the line collection.  c can be a matplotlib color arg (all patches have same color), or a sequence or rgba tuples; if it is a sequence the patches will cycle through the sequence.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="segments" name="segments" />
+    <inputPortSpec arg="linewidths" arg_pos="1" constructor_arg="True" name="linewidths" />
+    <inputPortSpec arg="colors" arg_pos="2" constructor_arg="True" name="colors" />
+    <inputPortSpec arg="cmap" arg_pos="8" constructor_arg="True" name="cmap" />
+    <inputPortSpec arg="transOffset" arg_pos="6" constructor_arg="True" name="transOffset" />
+    <inputPortSpec arg="verts" name="verts" />
+    <inputPortSpec arg="pickradius" arg_pos="9" constructor_arg="True" name="pickradius" port_type="basic:Integer">
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="7" constructor_arg="True" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.CircleCollection" name="MplCircleCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    A collection of circles, drawn using splines.
+    </docstring>
+    <inputPortSpec arg="sizes" arg_pos="0" constructor_arg="True" name="sizes" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.EllipseCollection" name="MplEllipseCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    A collection of ellipses, drawn using splines.
+    </docstring>
+    <inputPortSpec arg="units" arg_pos="3" constructor_arg="True" name="units" port_type="basic:String">
+      <defaults>['points']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="widths" arg_pos="0" constructor_arg="True" name="widths" />
+    <inputPortSpec arg="angles" arg_pos="2" constructor_arg="True" name="angles" />
+    <inputPortSpec arg="heights" arg_pos="1" constructor_arg="True" name="heights" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.PatchCollection" name="MplPatchCollectionProperties" superclass="MplCollectionProperties">
+    <docstring>
+    A generic collection of patches.
+
+    This makes it easier to assign a color map to a heterogeneous
+    collection of patches.
+
+    This also may improve plotting speed, since PatchCollection will
+    draw faster than a large number of patches.
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="patches" arg_pos="0" constructor_arg="True" name="patches" />
+    <inputPortSpec arg="match_original" arg_pos="1" constructor_arg="True" name="match_original" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.TriMesh" name="MplTriMeshProperties" superclass="MplCollectionProperties">
+    <docstring>
+    Class for the efficient drawing of a triangular mesh using
+    Gouraud shading.
+
+    A triangular mesh is a :class:`~matplotlib.tri.Triangulation`
+    object.
+    </docstring>
+    <inputPortSpec arg="triangulation" arg_pos="0" constructor_arg="True" name="triangulation" />
+    <inputPortSpec arg="paths" name="paths" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.collections.QuadMesh" name="MplQuadMeshProperties" superclass="MplCollectionProperties">
+    <docstring>
+    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', or 'gouraud'
+    </docstring>
+    <inputPortSpec arg="paths" name="paths" />
+    <inputPortSpec arg="meshWidth" arg_pos="0" constructor_arg="True" name="meshWidth" />
+    <inputPortSpec arg="coordinates" arg_pos="2" constructor_arg="True" name="coordinates" />
+    <inputPortSpec arg="antialiased" arg_pos="3" constructor_arg="True" name="antialiased" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shading" arg_pos="4" constructor_arg="True" name="shading" port_type="basic:String">
+      <defaults>['flat']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="meshHeight" arg_pos="1" constructor_arg="True" name="meshHeight" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Patch" name="MplPatchProperties" superclass="MplArtistProperties">
+    <docstring>
+    A patch is a 2D artist with a face color and an edge color.
+
+    If any of *edgecolor*, *facecolor*, *linewidth*, or *antialiased*
+    are *None*, they default to their rc params setting.
+    </docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>Set the patch edge color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="facecolor" name="facecolor" port_type="basic:Color">
+      <docstring>Set the patch face color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="path_effects" name="path_effects">
+      <docstring>set path_effects, which should be a list of instances of matplotlib.patheffect._Base class or its derivatives.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>Set both the edgecolor and the facecolor. .. seealso:
+
+:meth:`set_facecolor`, :meth:`set_edgecolor`    For setting the edge or face color individually.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>Set whether to use antialiased rendering</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hatch" name="hatch" port_type="basic:String">
+      <docstring>Set the hatching pattern
+
+hatch can be one of:
+
+/   - diagonal hatching \   - back diagonal |   - vertical -   - horizontal +   - crossed x   - crossed diagonal o   - small circle O   - large circle .   - dots *   - stars
+
+Letters can be combined, in which case all the specified hatchings are done.  If same letter repeats, it increases the density of hatching of that pattern.
+
+Hatching is supported in the PostScript, PDF, SVG and Agg backends only.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['/', "'\\'", "'", "'", '-', '+', 'x', 'o', 'O', '.', '*']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>Set the alpha tranparency of the patch.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth" port_type="basic:Float">
+      <docstring>Set the patch linewidth in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyle" name="linestyle" port_type="basic:String">
+      <docstring>Set the patch linestyle</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['solid', 'dashed', 'dashdot', 'dotted']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fill" name="fill" port_type="basic:Boolean">
+      <docstring>Set whether to fill the patch</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Shadow" name="MplShadowProperties" superclass="MplPatchProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="patch" arg_pos="0" constructor_arg="True" name="patch" />
+    <inputPortSpec arg="props" arg_pos="3" constructor_arg="True" name="props" />
+    <inputPortSpec arg="oy" arg_pos="2" constructor_arg="True" name="oy" />
+    <inputPortSpec arg="ox" arg_pos="1" constructor_arg="True" name="ox" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Rectangle" name="MplRectangleProperties" superclass="MplPatchProperties">
+    <docstring>
+    Draw a rectangle with lower left at *xy* = (*x*, *y*) with
+    specified *width* and *height*.
+    </docstring>
+    <inputPortSpec arg="bounds" name="bounds">
+      <docstring>Set the bounds of the rectangle: l,b,w,h</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="height" name="height" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" name="width" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xy" name="xy" port_type="basic:List">
+      <docstring>Set the left and bottom coords of the rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the bottom coord of the rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the left coord of the rectangle</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.RegularPolygon" name="MplRegularPolygonProperties" superclass="MplPatchProperties">
+    <docstring>
+    A regular polygon patch.
+    </docstring>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy">
+      <docstring>A length 2 tuple (x, y) of the center.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="radius" arg_pos="2" constructor_arg="True" name="radius" port_type="basic:Integer">
+      <docstring>The distance from the center to each of the vertices.</docstring>
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="orientation" arg_pos="3" constructor_arg="True" name="orientation" port_type="basic:Integer">
+      <docstring>rotates the polygon (in radians).</docstring>
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="numVertices" arg_pos="1" constructor_arg="True" name="numVertices">
+      <docstring>the number of vertices.</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.CirclePolygon" name="MplCirclePolygonProperties" superclass="MplRegularPolygonProperties">
+    <docstring>
+    A polygon-approximation of a circle patch.
+    </docstring>
+    <inputPortSpec arg="radius" arg_pos="1" constructor_arg="True" name="radius" port_type="basic:Integer">
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="resolution" arg_pos="2" constructor_arg="True" name="resolution" port_type="basic:Integer">
+      <defaults>['20']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.PathPatch" name="MplPathPatchProperties" superclass="MplPatchProperties">
+    <docstring>
+    A general polycurve path patch.
+    </docstring>
+    <inputPortSpec arg="path" arg_pos="0" constructor_arg="True" name="path" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Polygon" name="MplPolygonProperties" superclass="MplPatchProperties">
+    <docstring>
+    A general polygon patch.
+    </docstring>
+    <inputPortSpec arg="xy" name="xy" />
+    <inputPortSpec arg="closed" name="closed" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.FancyArrow" name="MplFancyArrowProperties" superclass="MplPolygonProperties">
+    <docstring>
+    Like Arrow, but lets you set head width and head height independently.
+    </docstring>
+    <inputPortSpec arg="length_includes_head" arg_pos="5" constructor_arg="True" name="length_includes_head" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="head_length" arg_pos="7" constructor_arg="True" name="head_length" />
+    <inputPortSpec arg="head_width" arg_pos="6" constructor_arg="True" name="head_width" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" port_type="basic:Float">
+      <defaults>['0.001']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shape" arg_pos="8" constructor_arg="True" name="shape" port_type="basic:String">
+      <defaults>['full']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="dx" arg_pos="2" constructor_arg="True" name="dx" />
+    <inputPortSpec arg="dy" arg_pos="3" constructor_arg="True" name="dy" />
+    <inputPortSpec arg="y" arg_pos="1" constructor_arg="True" name="y" />
+    <inputPortSpec arg="x" arg_pos="0" constructor_arg="True" name="x" />
+    <inputPortSpec arg="head_starts_at_zero" arg_pos="10" constructor_arg="True" name="head_starts_at_zero" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="overhang" arg_pos="9" constructor_arg="True" name="overhang" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Wedge" name="MplWedgeProperties" superclass="MplPatchProperties">
+    <docstring>
+    Wedge shaped patch.
+    </docstring>
+    <inputPortSpec arg="theta2" arg_pos="3" constructor_arg="True" name="theta2" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="r" arg_pos="1" constructor_arg="True" name="r" />
+    <inputPortSpec arg="theta1" arg_pos="2" constructor_arg="True" name="theta1" />
+    <inputPortSpec arg="center" arg_pos="0" constructor_arg="True" name="center" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Arrow" name="MplArrowProperties" superclass="MplPatchProperties">
+    <docstring>
+    An arrow patch.
+    </docstring>
+    <inputPortSpec arg="y" arg_pos="1" constructor_arg="True" name="y" />
+    <inputPortSpec arg="x" arg_pos="0" constructor_arg="True" name="x" />
+    <inputPortSpec arg="dy" arg_pos="3" constructor_arg="True" name="dy" />
+    <inputPortSpec arg="dx" arg_pos="2" constructor_arg="True" name="dx" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" port_type="basic:Float">
+      <defaults>['1.0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.YAArrow" name="MplYAArrowProperties" superclass="MplPatchProperties">
+    <docstring>
+    Yet another arrow class.
+
+    This is an arrow that is defined in display space and has a tip at
+    *x1*, *y1* and a base at *x2*, *y2*.
+    </docstring>
+    <inputPortSpec arg="xytip" arg_pos="1" constructor_arg="True" name="xytip">
+      <docstring>(x, y) location of arrow tip</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="headwidth" arg_pos="5" constructor_arg="True" name="headwidth" port_type="basic:Integer">
+      <docstring>The width of the base of the arrow head in points</docstring>
+      <defaults>['12']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="frac" arg_pos="4" constructor_arg="True" name="frac" port_type="basic:Float">
+      <docstring>The fraction of the arrow length occupied by the head</docstring>
+      <defaults>['0.1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" arg_pos="0" constructor_arg="True" name="figure">
+      <docstring>The :class:`~matplotlib.figure.Figure` instance (fig.dpi)</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xybase" arg_pos="2" constructor_arg="True" name="xybase">
+      <docstring>(x, y) location the arrow base mid point</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" arg_pos="3" constructor_arg="True" name="width" port_type="basic:Integer">
+      <docstring>The width of the arrow in points</docstring>
+      <defaults>['4']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Ellipse" name="MplEllipseProperties" superclass="MplPatchProperties">
+    <docstring>
+    A scale-free ellipse.
+    </docstring>
+    <inputPortSpec arg="width" arg_pos="1" constructor_arg="True" name="width" />
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="angle" arg_pos="3" constructor_arg="True" name="angle" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="2" constructor_arg="True" name="height" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Circle" name="MplCircleProperties" superclass="MplEllipseProperties">
+    <docstring>
+    A circle patch.
+    </docstring>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="radius" name="radius" port_type="basic:Float">
+      <docstring>Set the radius of the circle</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.Arc" name="MplArcProperties" superclass="MplEllipseProperties">
+    <docstring>
+    An elliptical arc.  Because it performs various optimizations, it
+    can not be filled.
+
+    The arc must be used in an :class:`~matplotlib.axes.Axes`
+    instance---it can not be added directly to a
+    :class:`~matplotlib.figure.Figure`---because it is optimized to
+    only render the segments that are inside the axes bounding box
+    with high resolution.
+    </docstring>
+    <inputPortSpec arg="theta2" arg_pos="5" constructor_arg="True" name="theta2" port_type="basic:Float">
+      <defaults>['360.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="theta1" arg_pos="4" constructor_arg="True" name="theta1" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="angle" arg_pos="3" constructor_arg="True" name="angle" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="2" constructor_arg="True" name="height" />
+    <inputPortSpec arg="width" arg_pos="1" constructor_arg="True" name="width" />
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.FancyBboxPatch" name="MplFancyBboxPatchProperties" superclass="MplPatchProperties">
+    <docstring>
+    Draw a fancy box around a rectangle with lower left at *xy*=(*x*,
+    *y*) with specified width and height.
+
+    :class:`FancyBboxPatch` class is similar to :class:`Rectangle`
+    class, but it draws a fancy box around the rectangle. The
+    transformation of the rectangle box to the fancy box is delegated
+    to the :class:`BoxTransmuterBase` and its derived classes.
+
+    </docstring>
+    <inputPortSpec arg="mutation_scale" name="mutation_scale" port_type="basic:Float">
+      <docstring>Set the mutation scale.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_transmuter" arg_pos="4" constructor_arg="True" name="bbox_transmuter" />
+    <inputPortSpec arg="bounds" name="bounds">
+      <docstring>Set the bounds of the rectangle: l,b,w,h</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="height" name="height" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" name="width" port_type="basic:Float">
+      <docstring>Set the width rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xy" arg_pos="0" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="boxstyle" name="boxstyle">
+      <docstring>Set the box style.
+
+boxstyle can be a string with boxstyle name with optional comma-separated attributes. Alternatively, the attrs can be provided as keywords:
+
+set_boxstyle("round,pad=0.2") set_boxstyle("round", pad=0.2)
+
+Old attrs simply are forgotten.
+
+Without argument (or with boxstyle = None), it returns available box styles.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_aspect" name="mutation_aspect" port_type="basic:Float">
+      <docstring>Set the aspect ratio of the bbox mutation.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the bottom coord of the rectangle</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the left coord of the rectangle</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.FancyArrowPatch" name="MplFancyArrowPatchProperties" superclass="MplPatchProperties">
+    <docstring>
+    A fancy arrow patch. It draws an arrow using the :class:ArrowStyle.
+    </docstring>
+    <inputPortSpec arg="connectionstyle" name="connectionstyle">
+      <docstring>Set the connection style.
+
+Old attrs simply are forgotten.
+
+Without argument (or with connectionstyle=None), return available styles as a list of strings.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_scale" name="mutation_scale" port_type="basic:Float">
+      <docstring>Set the mutation scale.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowstyle" name="arrowstyle">
+      <docstring>Set the arrow style.
+
+Old attrs simply are forgotten.
+
+Without argument (or with arrowstyle=None), return available box styles as a list of strings.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="arrow_transmuter" arg_pos="4" constructor_arg="True" name="arrow_transmuter" />
+    <inputPortSpec arg="positions" name="positions" />
+    <inputPortSpec arg="shrinkA" arg_pos="9" constructor_arg="True" name="shrinkA" port_type="basic:Float">
+      <defaults>['2.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="posB" arg_pos="1" constructor_arg="True" name="posB" />
+    <inputPortSpec arg="dpi_cor" name="dpi_cor">
+      <docstring>dpi_cor is currently used for linewidth-related things and shink factor. Mutation scale is not affected by this.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="connector" arg_pos="6" constructor_arg="True" name="connector" />
+    <inputPortSpec arg="path" arg_pos="2" constructor_arg="True" name="path" />
+    <inputPortSpec arg="shrinkB" arg_pos="10" constructor_arg="True" name="shrinkB" port_type="basic:Float">
+      <defaults>['2.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_aspect" name="mutation_aspect" port_type="basic:Float">
+      <docstring>Set the aspect ratio of the bbox mutation.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="patchA" name="patchA">
+      <docstring>set the begin patch.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="patchB" name="patchB">
+      <docstring>set the begin patch</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="posA" arg_pos="0" constructor_arg="True" name="posA" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.patches.ConnectionPatch" name="MplConnectionPatchProperties" superclass="MplFancyArrowPatchProperties">
+    <docstring>
+    A :class:`~matplotlib.patches.ConnectionPatch` class is to make
+    connecting lines between two points (possibly in different axes).
+    </docstring>
+    <inputPortSpec arg="connectionstyle" arg_pos="8" constructor_arg="True" name="connectionstyle" port_type="basic:String">
+      <docstring>the connection style</docstring>
+      <defaults>['arc3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="coordsA" arg_pos="2" constructor_arg="True" name="coordsA">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowstyle" arg_pos="6" constructor_arg="True" name="arrowstyle" port_type="basic:String">
+      <docstring>the arrow style</docstring>
+      <defaults>['-']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="clip_on" arg_pos="16" constructor_arg="True" name="clip_on" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="arrow_transmuter" arg_pos="7" constructor_arg="True" name="arrow_transmuter" />
+    <inputPortSpec arg="axesA" arg_pos="4" constructor_arg="True" name="axesA" />
+    <inputPortSpec arg="axesB" arg_pos="5" constructor_arg="True" name="axesB" />
+    <inputPortSpec arg="annotation_clip" name="annotation_clip">
+      <docstring>set annotation_clip attribute.
+
+None: the self.xy will be checked only if xycoords is "data"</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dpi_cor" arg_pos="17" constructor_arg="True" name="dpi_cor" port_type="basic:Float">
+      <defaults>['1.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="connector" arg_pos="9" constructor_arg="True" name="connector" />
+    <inputPortSpec arg="xyA" arg_pos="0" constructor_arg="True" name="xyA" />
+    <inputPortSpec arg="xyB" arg_pos="1" constructor_arg="True" name="xyB" />
+    <inputPortSpec arg="relpos" constructor_arg="True" name="relpos" port_type="basic:String">
+      <docstring>default is (0.5, 0.5)</docstring>
+      <defaults>['(0.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shrinkB" arg_pos="13" constructor_arg="True" name="shrinkB" port_type="basic:Float">
+      <docstring>default is 2 points</docstring>
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shrinkA" arg_pos="12" constructor_arg="True" name="shrinkA" port_type="basic:Float">
+      <docstring>default is 2 points</docstring>
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_aspect" arg_pos="15" constructor_arg="True" name="mutation_aspect" port_type="basic:Integer">
+      <docstring>default is 1.</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="mutation_scale" arg_pos="14" constructor_arg="True" name="mutation_scale">
+      <docstring>default is text size (in points)</docstring>
+      <defaults>['text']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="patchA" arg_pos="10" constructor_arg="True" name="patchA" port_type="basic:String">
+      <docstring>default is bounding box of the text</docstring>
+      <defaults>['bounding']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="patchB" arg_pos="11" constructor_arg="True" name="patchB">
+      <docstring>default is None</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="coordsB" arg_pos="3" constructor_arg="True" name="coordsB">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="?" constructor_arg="True" name="?">
+      <docstring>any key for :class:`matplotlib.patches.PathPatch`</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.lines.Line2D" name="MplLine2DProperties" superclass="MplArtistProperties">
+    <docstring>
+    A line - the line can have both a solid linestyle connecting all
+    the vertices, and a marker at each vertex.  Additionally, the
+    drawing of the solid line is influenced by the drawstyle, eg one
+    can create "stepped" lines in various styles.
+
+
+    </docstring>
+    <inputPortSpec arg="picker" name="picker" port_type="basic:Float">
+      <docstring>Sets the event picker details for the line.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dash_capstyle" name="dash_capstyle" port_type="basic:String">
+      <docstring>Set the cap style for dashed linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['butt', 'round', 'projecting']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>Set the color of the line</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="markevery" name="markevery">
+      <docstring>Set the markevery property to subsample the plot when using markers.  Eg if markevery=5, every 5-th marker will be plotted.  every can be</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['(startind, stride)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markeredgecolor" name="markeredgecolor" port_type="basic:Color">
+      <docstring>Set the marker edge color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="marker" name="marker" port_type="basic:String">
+      <docstring>Set the line marker
+
+The marker can also be a tuple (numsides, style, angle), which will create a custom, regular symbol.
+
+
+
+For backward compatibility, the form (verts, 0) is also accepted, but it is equivalent to just verts for giving a raw set of vertices that define the shape.</docstring>
+      <translations>{'caretright': 5, 'point': '.', 'triangle_right': '>', 'tickup': 2, 'square': 's', 'vline': '|', 'caretleft': 4, 'pentagon': 'p', 'tri_left': '3', 'x': 'x', 'tickright': 1, 'tri_right': '4', 'see below': '(numsides, style, angle)', 'tickleft': 0, 'tri_up': '2', 'circle': 'o', 'pixel': ',', 'diamond': 'D', 'star': '*', 'hexagon1': 'h', 'hexagon2': 'H', 'octagon': '8', 'tickdown': 3, 'nothing': ' ', 'render the string using mathtext.': '$...$', 'thin_diamond': 'd', ' [...]
+      <values>[['caretdown', 'caretleft', 'caretright', 'caretup', 'circle', 'diamond', 'hexagon1', 'hexagon2', 'hline', 'nothing', 'nothing', 'nothing', 'nothing', 'octagon', 'pentagon', 'pixel', 'plus', 'point', 'square', 'star', 'thin_diamond', 'tickdown', 'tickleft', 'tickright', 'tickup', 'tri_down', 'tri_left', 'tri_right', 'tri_up', 'triangle_down', 'triangle_left', 'triangle_right', 'triangle_up', 'vline', 'x', 'render the string using mathtext.', 'a list of (x, y) pairs used for [...]
+    </inputPortSpec>
+    <inputPortSpec arg="markerfacecoloralt" name="markerfacecoloralt" port_type="basic:Color">
+      <docstring>Set the alternate marker face color.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth" port_type="basic:Float">
+      <docstring>Set the line width in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyle" name="linestyle" port_type="basic:String">
+      <docstring>Set the linestyle of the line (also accepts drawstyles)
+
+'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility.</docstring>
+      <translations>{'solid': '-', 'dashed': '--', 'dash_dot': '-.', 'dotted': ':', 'draw nothing': ''}</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['solid', 'dashed', 'dash_dot', 'dotted', 'draw nothing', 'draw nothing', 'draw nothing']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="solid_joinstyle" name="solid_joinstyle" port_type="basic:String">
+      <docstring>Set the join style for solid linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['miter', 'round', 'bevel']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markerfacecolor" name="markerfacecolor" port_type="basic:Color">
+      <docstring>Set the marker face color.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" name="axes">
+      <docstring>Set the :class:`~matplotlib.axes.Axes` instance in which the artist resides, if any.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" name="transform">
+      <docstring>set the Transformation instance used by this artist</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="fillstyle" name="fillstyle" port_type="basic:String">
+      <docstring>Set the marker fill style; 'full' means fill the whole marker. 'none' means no filling; other options are for half-filled markers.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['full', 'left', 'right', 'bottom', 'top', 'none']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="markeredgewidth" name="markeredgewidth" port_type="basic:Float">
+      <docstring>Set the marker edge width in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="solid_capstyle" name="solid_capstyle" port_type="basic:String">
+      <docstring>Set the cap style for solid linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['butt', 'round', 'projecting']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="dashes" name="dashes" port_type="basic:List">
+      <docstring>Set the dash sequence, sequence of dashes with on off ink in points.  If seq is empty or if seq = (None, None), the linestyle will be set to solid.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="markersize" name="markersize" port_type="basic:Float">
+      <docstring>Set the marker size in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>True if line should be drawin with antialiased rendering</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xdata" name="xdata">
+      <docstring>Set the data np.array for x</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="drawstyle" name="drawstyle" port_type="basic:String">
+      <docstring>Set the drawstyle of the plot
+
+'default' connects the points with lines. The steps variants produce step-plots. 'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['default', 'steps', 'steps-pre', 'steps-mid', 'steps-post']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="data" name="data">
+      <docstring>Set the x and y data</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dash_joinstyle" name="dash_joinstyle" port_type="basic:String">
+      <docstring>Set the join style for dashed linestyles</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['miter', 'round', 'bevel']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" name="pickradius" port_type="basic:Float">
+      <docstring>Sets the pick radius used for containment tests</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ydata" name="ydata">
+      <docstring>Set the data np.array for y</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.text.Text" name="MplTextProperties" superclass="MplArtistProperties">
+    <docstring>
+    Handle storing and drawing of text in window or data coordinates.
+    </docstring>
+    <inputPortSpec arg="rotation_mode" name="rotation_mode">
+      <docstring>set text rotation mode. If "anchor", the un-rotated text will first aligned according to their ha and va, and then will be rotated with the alignement reference point as a origin. If None (default), the text will be rotated first then will be aligned.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="style" name="style" port_type="basic:String">
+      <docstring>Set the font style.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['normal', 'italic', 'oblique']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linespacing" name="linespacing" port_type="basic:Float">
+      <docstring>Set the line spacing as a multiple of the font size. Default is 1.2.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="family" name="family" port_type="basic:String">
+      <docstring>Set the font family.  May be either a single string, or a list of strings in decreasing priority.  Each string may be either a real font name or a generic font class name.  If the latter, the specific font names will be looked up in the :file:`matplotlibrc` file.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['FONTNAME', 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the x position of the text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>Set the foreground color of the text</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="text" name="text" port_type="basic:String">
+      <docstring>Set the text string s
+
+It may contain newlines (\n) or math in LaTeX syntax.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="verticalalignment" name="verticalalignment" port_type="basic:String">
+      <docstring>Set the vertical alignment</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['center', 'top', 'bottom', 'baseline']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="variant" name="variant" port_type="basic:String">
+      <docstring>Set the font variant, either 'normal' or 'small-caps'.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['normal', 'small-caps']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="path_effects" name="path_effects" />
+    <inputPortSpec arg="weight" name="weight" port_type="basic:String">
+      <docstring>Set the font weight.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['a numeric value in range 0-1000', 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="stretch" name="stretch" port_type="basic:String">
+      <docstring>Set the font stretch (horizontal condensation or expansion).</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['a numeric value in range 0-1000', 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fontproperties" name="fontproperties">
+      <docstring>Set the font properties that control the text.  fp must be a :class:`matplotlib.font_manager.FontProperties` object.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="horizontalalignment" name="horizontalalignment" port_type="basic:String">
+      <docstring>Set the horizontal alignment to one of</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['center', 'right', 'left']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox" name="bbox">
+      <docstring>Draw a bounding box around self.  rectprops are any settable properties for a rectangle, eg facecolor='red', alpha=0.5.
+
+t.set_bbox(dict(facecolor='red', alpha=0.5))
+
+If rectprops has "boxstyle" key. A FancyBboxPatch is initialized with rectprops and will be drawn. The mutation scale of the FancyBboxPath is set to the fontsize.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="backgroundcolor" name="backgroundcolor" port_type="basic:Color">
+      <docstring>Set the background color of the text by updating the bbox.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="position" name="position">
+      <docstring>Set the (x, y) position of the text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the y position of the text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="multialignment" name="multialignment" port_type="basic:String">
+      <docstring>Set the alignment for multiple lines layout.  The layout of the bounding box of all the lines is determined bu the horizontalalignment and verticalalignment properties, but the multiline text within that box can be</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'right', 'center']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="rotation" name="rotation" port_type="basic:String">
+      <docstring>Set the rotation of the text</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['angle in degrees', 'vertical', 'horizontal']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="size" name="size" port_type="basic:String">
+      <docstring>Set the font size.  May be either a size string, relative to the default font size, or an absolute font size in points.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['size in points', 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.text.TextWithDash" name="MplTextWithDashProperties" superclass="MplTextProperties">
+    <docstring>
+    This is basically a :class:`~matplotlib.text.Text` with a dash
+    (drawn with a :class:`~matplotlib.lines.Line2D`) before/after
+    it. It is intended to be a drop-in replacement for
+    :class:`~matplotlib.text.Text`, and should behave identically to
+    it when *dashlength* = 0.0.
+
+    The dash always comes between the point specified by
+    :meth:`~matplotlib.text.Text.set_position` and the text. When a
+    dash exists, the text alignment arguments (*horizontalalignment*,
+    *verticalalignment*) are ignored.
+
+    *dashlength* is the length of the dash in canvas units.
+    (default = 0.0).
+
+    *dashdirection* is one of 0 or 1, where 0 draws the dash after the
+    text and 1 before.  (default = 0).
+
+    *dashrotation* specifies the rotation of the dash, and should
+    generally stay *None*. In this case
+    :meth:`~matplotlib.text.TextWithDash.get_dashrotation` returns
+    :meth:`~matplotlib.text.Text.get_rotation`.  (I.e., the dash takes
+    its rotation from the text's rotation). Because the text center is
+    projected onto the dash, major deviations in the rotation cause
+    what may be considered visually unappealing results.
+    (default = *None*)
+
+    *dashpad* is a padding length to add (or subtract) space
+    between the text and the dash, in canvas units.
+    (default = 3)
+
+    *dashpush* "pushes" the dash and text away from the point
+    specified by :meth:`~matplotlib.text.Text.set_position` by the
+    amount in canvas units.  (default = 0)
+
+    .. note::
+
+        The alignment of the two objects is based on the bounding box
+        of the :class:`~matplotlib.text.Text`, as obtained by
+        :meth:`~matplotlib.artist.Artist.get_window_extent`.  This, in
+        turn, appears to depend on the font metrics as given by the
+        rendering backend. Hence the quality of the "centering" of the
+        label text with respect to the dash varies depending on the
+        backend used.
+
+    .. note::
+
+        I'm not sure that I got the
+        :meth:`~matplotlib.text.TextWithDash.get_window_extent` right,
+        or whether that's sufficient for providing the object bounding
+        box.
+
+    </docstring>
+    <inputPortSpec arg="dashpush" name="dashpush" port_type="basic:Float">
+      <docstring>Set the "push" of the TextWithDash, which is the extra spacing between the beginning of the dash and the specified position.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dashdirection" name="dashdirection">
+      <docstring>Set the direction of the dash following the text. 1 is before the text and 0 is after. The default is 0, which is what you'd want for the typical case of ticks below and on the left of the figure.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="linespacing" arg_pos="9" constructor_arg="True" name="linespacing" />
+    <inputPortSpec arg="figure" name="figure">
+      <docstring>Set the figure instance the artist belong to.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="3" constructor_arg="True" name="color" />
+    <inputPortSpec arg="text" arg_pos="2" constructor_arg="True" name="text" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="verticalalignment" arg_pos="4" constructor_arg="True" name="verticalalignment" port_type="basic:String">
+      <defaults>['center']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="dashpad" name="dashpad" port_type="basic:Float">
+      <docstring>Set the "pad" of the TextWithDash, which is the extra spacing between the dash and the text, in canvas units.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dashrotation" name="dashrotation" port_type="basic:Float">
+      <docstring>Set the rotation of the dash, in degrees</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" name="transform">
+      <docstring>Set the :class:`matplotlib.transforms.Transform` instance used by this artist.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="fontproperties" arg_pos="7" constructor_arg="True" name="fontproperties" />
+    <inputPortSpec arg="multialignment" arg_pos="6" constructor_arg="True" name="multialignment" />
+    <inputPortSpec arg="x" name="x" port_type="basic:Float">
+      <docstring>Set the x position of the :class:`TextWithDash`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" name="y" port_type="basic:Float">
+      <docstring>Set the y position of the :class:`TextWithDash`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="position" name="position">
+      <docstring>Set the (x, y) position of the :class:`TextWithDash`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dashlength" name="dashlength" port_type="basic:Float">
+      <docstring>Set the length of the dash.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rotation" arg_pos="8" constructor_arg="True" name="rotation" />
+    <inputPortSpec arg="horizontalalignment" arg_pos="5" constructor_arg="True" name="horizontalalignment" port_type="basic:String">
+      <defaults>['center']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.Tick" name="MplTickProperties" superclass="MplArtistProperties">
+    <docstring>
+    Abstract base class for the axis ticks, grid lines and labels
+
+    1 refers to the bottom of the plot for xticks and the left for yticks
+    2 refers to the top of the plot for xticks and the right for yticks
+
+    Publicly accessible attributes:
+
+      :attr:`tick1line`
+          a Line2D instance
+
+      :attr:`tick2line`
+          a Line2D instance
+
+      :attr:`gridline`
+          a Line2D instance
+
+      :attr:`label1`
+          a Text instance
+
+      :attr:`label2`
+          a Text instance
+
+      :attr:`gridOn`
+          a boolean which determines whether to draw the tickline
+
+      :attr:`tick1On`
+          a boolean which determines whether to draw the 1st tickline
+
+      :attr:`tick2On`
+          a boolean which determines whether to draw the 2nd tickline
+
+      :attr:`label1On`
+          a boolean which determines whether to draw tick label
+
+      :attr:`label2On`
+          a boolean which determines whether to draw tick label
+
+    </docstring>
+    <inputPortSpec arg="label1On" arg_pos="14" constructor_arg="True" name="label1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="loc" arg_pos="1" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="major" arg_pos="16" constructor_arg="True" name="major" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label2On" arg_pos="15" constructor_arg="True" name="label2On" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="5" constructor_arg="True" name="color" />
+    <inputPortSpec arg="label1" name="label1">
+      <docstring>Set the text of ticklabel</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label2" name="label2">
+      <docstring>Set the text of ticklabel2</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="clip_path" name="clip_path" port_type="basic:String">
+      <docstring>Set the artist's clip path, which may be:
+
+a :class:`~matplotlib.patches.Patch` (or subclass) instance
+
+
+
+None, to remove the clipping path
+
+For efficiency, if the path happens to be an axis-aligned rectangle, this method will set the clipping box to the corresponding rectangle and set the clipping path to None.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['(:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`)', ':class:`~matplotlib.patches.Patch`']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="label" name="label">
+      <docstring>Set the text of ticklabel</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelcolor" arg_pos="9" constructor_arg="True" name="labelcolor" />
+    <inputPortSpec arg="tickdir" arg_pos="6" constructor_arg="True" name="tickdir" />
+    <inputPortSpec arg="pad" name="pad" port_type="basic:Float">
+      <docstring>Set the tick label pad in points</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="gridOn" arg_pos="11" constructor_arg="True" name="gridOn" />
+    <inputPortSpec arg="zorder" arg_pos="10" constructor_arg="True" name="zorder" />
+    <inputPortSpec arg="tick2On" arg_pos="13" constructor_arg="True" name="tick2On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsize" arg_pos="8" constructor_arg="True" name="labelsize" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="tick1On" arg_pos="12" constructor_arg="True" name="tick1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="size" arg_pos="3" constructor_arg="True" name="size" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.XTick" name="MplXTickProperties" superclass="MplTickProperties">
+    <docstring>
+    Contains all the Artists needed to make an x tick - the tick line,
+    the label text and the grid line
+    </docstring>
+    <inputPortSpec arg="label1On" arg_pos="14" constructor_arg="True" name="label1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="loc" arg_pos="1" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="major" arg_pos="16" constructor_arg="True" name="major" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label2On" arg_pos="15" constructor_arg="True" name="label2On" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="5" constructor_arg="True" name="color" />
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label" arg_pos="2" constructor_arg="True" name="label" />
+    <inputPortSpec arg="labelcolor" arg_pos="9" constructor_arg="True" name="labelcolor" />
+    <inputPortSpec arg="tickdir" arg_pos="6" constructor_arg="True" name="tickdir" />
+    <inputPortSpec arg="pad" arg_pos="7" constructor_arg="True" name="pad" />
+    <inputPortSpec arg="gridOn" arg_pos="11" constructor_arg="True" name="gridOn" />
+    <inputPortSpec arg="zorder" arg_pos="10" constructor_arg="True" name="zorder" />
+    <inputPortSpec arg="tick2On" arg_pos="13" constructor_arg="True" name="tick2On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsize" arg_pos="8" constructor_arg="True" name="labelsize" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="tick1On" arg_pos="12" constructor_arg="True" name="tick1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="size" arg_pos="3" constructor_arg="True" name="size" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.YTick" name="MplYTickProperties" superclass="MplTickProperties">
+    <docstring>
+    Contains all the Artists needed to make a Y tick - the tick line,
+    the label text and the grid line
+    </docstring>
+    <inputPortSpec arg="label1On" arg_pos="14" constructor_arg="True" name="label1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="loc" arg_pos="1" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="major" arg_pos="16" constructor_arg="True" name="major" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label2On" arg_pos="15" constructor_arg="True" name="label2On" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="5" constructor_arg="True" name="color" />
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label" arg_pos="2" constructor_arg="True" name="label" />
+    <inputPortSpec arg="labelcolor" arg_pos="9" constructor_arg="True" name="labelcolor" />
+    <inputPortSpec arg="tickdir" arg_pos="6" constructor_arg="True" name="tickdir" />
+    <inputPortSpec arg="pad" arg_pos="7" constructor_arg="True" name="pad" />
+    <inputPortSpec arg="gridOn" arg_pos="11" constructor_arg="True" name="gridOn" />
+    <inputPortSpec arg="zorder" arg_pos="10" constructor_arg="True" name="zorder" />
+    <inputPortSpec arg="tick2On" arg_pos="13" constructor_arg="True" name="tick2On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsize" arg_pos="8" constructor_arg="True" name="labelsize" />
+    <inputPortSpec arg="width" arg_pos="4" constructor_arg="True" name="width" />
+    <inputPortSpec arg="tick1On" arg_pos="12" constructor_arg="True" name="tick1On" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="size" arg_pos="3" constructor_arg="True" name="size" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.Axis" name="MplAxisProperties" superclass="MplArtistProperties">
+    <docstring>
+    Public attributes
+
+    * :attr:`axes.transData` - transform data coords to display coords
+    * :attr:`axes.transAxes` - transform axis coords to display coords
+    * :attr:`labelpad` - number of points between the axis and its label
+    </docstring>
+    <inputPortSpec arg="pickradius" name="pickradius">
+      <docstring>Set the depth of the axis used by the picker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="minor_formatter" name="minor_formatter">
+      <docstring>Set the formatter of the minor ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="smart_bounds" name="smart_bounds">
+      <docstring>set the axis to have smart bounds</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticks" name="ticksSequence" port_type="basic:List">
+      <docstring>Set the locations of the tick marks from sequence ticks</docstring>
+      <alternateSpec arg="" name="ticksScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="view_interval" name="view_interval" />
+    <inputPortSpec arg="major_locator" name="major_locator">
+      <docstring>Set the locator of the major ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="major_formatter" name="major_formatter">
+      <docstring>Set the formatter of the major ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticklabels" name="ticklabelsSequence" port_type="basic:List">
+      <docstring>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.</docstring>
+      <alternateSpec arg="" name="ticklabelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="clip_path" name="clip_path" />
+    <inputPortSpec arg="minor_locator" name="minor_locator">
+      <docstring>Set the locator of the minor ticker</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="default_intervals" name="default_intervals" />
+    <inputPortSpec arg="scale" name="scale" />
+    <inputPortSpec arg="data_interval" name="data_interval">
+      <docstring>set the axis data limits</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label_text" name="label_text" port_type="basic:String">
+      <docstring>Sets the text value of the axis label</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="label_coords" name="label_coords">
+      <docstring>Set the coordinates of the label.  By default, the x coordinate of the y label is determined by the tick label bounding boxes, but this can lead to poor alignment of multiple ylabels if there are multiple axes.  Ditto for the y coodinate of the x label.
+
+You can also specify the coordinate system of the label with the transform.  If None, the default coordinate system will be the axes coordinate system (0,0) is (left,bottom), (0.5, 0.5) is middle, etc</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="units" name="units">
+      <docstring>set the units for axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="tick_params" name="tick_params">
+      <docstring>Set appearance parameters for ticks and ticklabels.
+
+For documentation of keyword arguments, see :meth:`matplotlib.axes.Axes.tick_params`.</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.XAxis" name="MplXAxisProperties" superclass="MplAxisProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="view_interval" name="view_interval">
+      <docstring>If ignore is False, the order of vmin, vmax does not matter; the original axis orientation will be preserved. In addition, the view limits can be expanded, but will not be reduced.  This method is for mpl internal use; for normal use, see :meth:`~matplotlib.axes.Axes.set_xlim`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticks_position" name="ticks_position" port_type="basic:String">
+      <docstring>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. 'none' and 'both' affect only the ticks, not the labels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['top', 'bottom', 'both', 'default', 'none']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label_position" name="label_position" port_type="basic:String">
+      <docstring>Set the label position (top or bottom)</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['top', 'bottom']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="default_intervals" name="default_intervals">
+      <docstring>set the default limits for the axis interval if they are not mutated</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data_interval" name="data_interval">
+      <docstring>set the axis data limits</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" arg_pos="1" constructor_arg="True" name="pickradius" port_type="basic:Integer">
+      <defaults>['15']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axis.YAxis" name="MplYAxisProperties" superclass="MplAxisProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="offset_position" name="offset_position" />
+    <inputPortSpec arg="view_interval" name="view_interval">
+      <docstring>If ignore is False, the order of vmin, vmax does not matter; the original axis orientation will be preserved. In addition, the view limits can be expanded, but will not be reduced.  This method is for mpl internal use; for normal use, see :meth:`~matplotlib.axes.Axes.set_ylim`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ticks_position" name="ticks_position" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'right', 'both', 'default', 'none']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="axes" arg_pos="0" constructor_arg="True" name="axes" />
+    <inputPortSpec arg="label_position" name="label_position" port_type="basic:String">
+      <docstring>Set the label position (left or right)</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'right']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="default_intervals" name="default_intervals">
+      <docstring>set the default limits for the axis interval if they are not mutated</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="data_interval" name="data_interval">
+      <docstring>set the axis data limits</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="pickradius" arg_pos="1" constructor_arg="True" name="pickradius" port_type="basic:Integer">
+      <defaults>['15']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.legend.Legend" name="MplLegendProperties" superclass="MplArtistProperties">
+    <docstring>
+    Place a legend on the axes at location loc.  Labels are a
+    sequence of strings and loc can be a string or an integer
+    specifying the legend location
+
+    The location codes are::
+
+      'best'         : 0, (only implemented for axis legends)
+      'upper right'  : 1,
+      'upper left'   : 2,
+      'lower left'   : 3,
+      'lower right'  : 4,
+      'right'        : 5,
+      'center left'  : 6,
+      'center right' : 7,
+      'lower center' : 8,
+      'upper center' : 9,
+      'center'       : 10,
+
+    loc can be a tuple of the noramilzed coordinate values with
+    respect its parent.
+
+    </docstring>
+    <inputPortSpec arg="fancybox" arg_pos="24" constructor_arg="True" name="fancybox" />
+    <inputPortSpec arg="handlelength" arg_pos="17" constructor_arg="True" name="handlelength" />
+    <inputPortSpec arg="labels" arg_pos="2" constructor_arg="True" name="labels" />
+    <inputPortSpec arg="labelspacing" arg_pos="16" constructor_arg="True" name="labelspacing" />
+    <inputPortSpec arg="columnspacing" arg_pos="21" constructor_arg="True" name="columnspacing" />
+    <inputPortSpec arg="handletextpad" arg_pos="19" constructor_arg="True" name="handletextpad" />
+    <inputPortSpec arg="ncol" arg_pos="22" constructor_arg="True" name="ncol" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="borderaxespad" arg_pos="20" constructor_arg="True" name="borderaxespad" />
+    <inputPortSpec arg="loc" arg_pos="3" constructor_arg="True" name="loc" />
+    <inputPortSpec arg="bbox_to_anchor" name="bbox_to_anchor">
+      <docstring>set the bbox that the legend will be anchored.
+
+bbox can be a BboxBase instance, a tuple of [left, bottom, width, height] in the given transform (normalized axes coordinate if None), or a tuple of [left, bottom] where the width and height will be assumed to be zero.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="title" name="title">
+      <docstring>set the legend title. Fontproperties can be optionally set with prop parameter.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="handletextsep" arg_pos="13" constructor_arg="True" name="handletextsep" />
+    <inputPortSpec arg="numpoints" arg_pos="4" constructor_arg="True" name="numpoints" />
+    <inputPortSpec arg="prop" arg_pos="8" constructor_arg="True" name="prop" />
+    <inputPortSpec arg="handles" arg_pos="1" constructor_arg="True" name="handles" />
+    <inputPortSpec arg="pad" arg_pos="10" constructor_arg="True" name="pad" />
+    <inputPortSpec arg="borderpad" arg_pos="15" constructor_arg="True" name="borderpad" />
+    <inputPortSpec arg="parent" arg_pos="0" constructor_arg="True" name="parent" />
+    <inputPortSpec arg="axespad" arg_pos="14" constructor_arg="True" name="axespad" />
+    <inputPortSpec arg="labelsep" arg_pos="11" constructor_arg="True" name="labelsep" />
+    <inputPortSpec arg="frame_on" name="frame_on" port_type="basic:Boolean">
+      <docstring>Set whether the legend box patch is drawn</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scatterpoints" arg_pos="6" constructor_arg="True" name="scatterpoints" port_type="basic:Integer">
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="fontsize" arg_pos="9" constructor_arg="True" name="fontsize" />
+    <inputPortSpec arg="shadow" arg_pos="25" constructor_arg="True" name="shadow" />
+    <inputPortSpec arg="handler_map" arg_pos="30" constructor_arg="True" name="handler_map" />
+    <inputPortSpec arg="handleheight" arg_pos="18" constructor_arg="True" name="handleheight" />
+    <inputPortSpec arg="scatteryoffsets" arg_pos="7" constructor_arg="True" name="scatteryoffsets" />
+    <inputPortSpec arg="markerscale" arg_pos="5" constructor_arg="True" name="markerscale" />
+    <inputPortSpec arg="frameon" arg_pos="29" constructor_arg="True" name="frameon" />
+    <inputPortSpec arg="mode" arg_pos="23" constructor_arg="True" name="mode" />
+    <inputPortSpec arg="handlelen" arg_pos="12" constructor_arg="True" name="handlelen" />
+    <inputPortSpec arg="default_handler_map" name="default_handler_map">
+      <docstring>A class method to set the default handler map.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_transform" arg_pos="28" constructor_arg="True" name="bbox_transform" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axes.Axes" name="MplAxesProperties" superclass="MplArtistProperties">
+    <docstring>
+    The :class:`Axes` contains most of the figure elements:
+    :class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axis.Tick`,
+    :class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.text.Text`,
+    :class:`~matplotlib.patches.Polygon`, etc., and sets the
+    coordinate system.
+
+    The :class:`Axes` instance supports callbacks through a callbacks
+    attribute which is a :class:`~matplotlib.cbook.CallbackRegistry`
+    instance.  The events you can connect to are 'xlim_changed' and
+    'ylim_changed' and the callback will be called with func(*ax*)
+    where *ax* is the :class:`Axes` instance.
+    </docstring>
+    <inputPortSpec arg="adjustable" name="adjustable" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['box', 'datalim', 'box-forced']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cursor_props" name="cursor_props" port_type="basic:Float">
+      <docstring>Set the cursor property as:
+
+ax.set_cursor_props(linewidth, color)
+
+or:
+
+ax.set_cursor_props((linewidth, color))</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" name="figure">
+      <docstring>Set the class:~matplotlib.axes.Axes figure
+
+accepts a class:~matplotlib.figure.Figure instance</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="yscale" name="yscale">
+      <docstring>Call signature:
+
+set_yscale(value)
+
+Set the scaling of the y-axis: 'linear' | 'log' | 'symlog' Different kwargs are accepted, depending on the scale: 'linear'
+
+'log'
+
+
+
+'symlog'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="navigate" name="navigate" port_type="basic:Boolean">
+      <docstring>Set whether the axes responds to navigation toolbar commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="aspect" name="aspect">
+      <docstring>aspect
+
+
+
+adjustable
+
+
+
+'box' does not allow axes sharing, as this can cause unintended side effect. For cases when sharing axes is fine, use 'box-forced'.
+
+anchor</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['auto', 'normal', 'equal', 'num']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="axis_bgcolor" name="axis_bgcolor" port_type="basic:Color">
+      <docstring>set the axes background color</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="ylim" name="ylimSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_ylim(self, *args, **kwargs):
+
+Set the data limits for the yaxis
+
+Examples:
+
+set_ylim((bottom, top)) set_ylim(bottom, top) set_ylim(bottom=1) # top unchanged set_ylim(top=1) # bottom unchanged
+
+Keyword arguments:
+
+
+
+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</docstring>
+      <alternateSpec arg="" name="ylimScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="sharey" arg_pos="5" constructor_arg="True" name="sharey" />
+    <inputPortSpec arg="xlim" name="xlimSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_xlim(self, *args, **kwargs):
+
+Set the data limits for the xaxis
+
+Examples:
+
+set_xlim((left, right)) set_xlim(left, right) set_xlim(left=1) # right unchanged set_xlim(right=1) # left unchanged
+
+Keyword arguments:
+
+
+
+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:
+
+set_ylim(5000, 0)
+
+so 5000 years ago is on the left of the plot and the present is on the right.
+
+Returns the current xlimits as a length 2 tuple</docstring>
+      <alternateSpec arg="" name="xlimScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="axis_on" name="axis_on">
+      <docstring>turn on the axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="title" name="title">
+      <docstring>Call signature:
+
+set_title(label, fontdict=None, **kwargs):
+
+Set the title for the axes.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axisbg" arg_pos="2" constructor_arg="True" name="axisbg" />
+    <inputPortSpec arg="label" arg_pos="6" constructor_arg="True" name="label" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xticks" name="xticksSequence" port_type="basic:List">
+      <docstring>Set the x ticks with list of ticks</docstring>
+      <alternateSpec arg="" name="xticksScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="fig" arg_pos="0" constructor_arg="True" name="fig" />
+    <inputPortSpec arg="ylabel" name="ylabel">
+      <docstring>Call signature:
+
+set_ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)
+
+Set the label for the yaxis
+
+labelpad is the spacing in points between the label and the y-axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="autoscalex_on" name="autoscalex_on" port_type="basic:Boolean">
+      <docstring>Set whether autoscaling for the x-axis is applied on plot commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rasterization_zorder" name="rasterization_zorder">
+      <docstring>Set zorder value below which artists will be rasterized.  Set to None to disable rasterizing of artists below a particular zorder.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axes_locator" name="axes_locator">
+      <docstring>set axes_locator</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axisbelow" name="axisbelow" port_type="basic:Boolean">
+      <docstring>Set whether the axis ticks and gridlines are above or below most artists</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="frame_on" name="frame_on" port_type="basic:Boolean">
+      <docstring>Set whether the axes rectangle patch is drawn</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="navigate_mode" name="navigate_mode">
+      <docstring>Set the navigation toolbar button status;
+
+this is not a user-API function.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xscale" name="xscale">
+      <docstring>Call signature:
+
+set_xscale(value)
+
+Set the scaling of the x-axis: 'linear' | 'log' | 'symlog' Different kwargs are accepted, depending on the scale: 'linear'
+
+'log'
+
+
+
+'symlog'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="axis_off" name="axis_off">
+      <docstring>turn off the axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="autoscale_on" name="autoscale_on" port_type="basic:Boolean">
+      <docstring>Set whether autoscaling is applied on plot commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ybound" name="ybound">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rect" arg_pos="1" constructor_arg="True" name="rect" />
+    <inputPortSpec arg="sharex" arg_pos="4" constructor_arg="True" name="sharex" />
+    <inputPortSpec arg="yticklabels" name="yticklabelsSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_yticklabels(labels, fontdict=None, minor=False, **kwargs)
+
+Set the y tick labels with list of strings labels.  Return a list of :class:`~matplotlib.text.Text` instances.
+
+kwargs set :class:`~matplotlib.text.Text` properties for the labels. Valid properties are
+
+agg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplotlib color bbox: rectangle prop dict clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] color: any matplotlib color contains: a callable fun [...]
+      <alternateSpec arg="" name="yticklabelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="autoscaley_on" name="autoscaley_on" port_type="basic:Boolean">
+      <docstring>Set whether autoscaling for the y-axis is applied on plot commands</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xmargin" name="xmargin" port_type="basic:Float">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color_cycle" name="color_cycle" port_type="basic:Color">
+      <docstring>Set the color cycle for any future plot commands on this Axes.
+
+clist is a list of mpl color specifiers.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="frameon" arg_pos="3" constructor_arg="True" name="frameon" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xlabel" name="xlabel">
+      <docstring>Call signature:
+
+set_xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)
+
+Set the label for the xaxis.
+
+labelpad is the spacing in points between the label and the x-axis</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xbound" name="xbound">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="yticks" name="yticksSequence" port_type="basic:List">
+      <docstring>Set the y ticks with list of ticks Keyword arguments:</docstring>
+      <alternateSpec arg="" name="yticksScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="ymargin" name="ymargin" port_type="basic:Float">
+      <docstring>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.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="position" name="position">
+      <docstring>Set the axes position with:
+
+pos = [left, bottom, width, height]
+
+in relative 0,1 coords, or pos can be a :class:`~matplotlib.transforms.Bbox`
+
+There are two position variables: one which is ultimately used, but which may be modified by :meth:`apply_aspect`, and a second which is the starting point for :meth:`apply_aspect`.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="anchor" name="anchor" port_type="basic:String">
+      <docstring>anchor</docstring>
+      <translations>{'right': 'E', 'Center': 'C', 'bottom': 'S', 'top right': 'NE', 'bottom left': 'SW', 'top left': 'NW', 'bottom right': 'SE', 'top': 'N', 'left': 'W'}</translations>
+      <values>[['Center', 'bottom left', 'bottom', 'bottom right', 'right', 'top right', 'top', 'top left', 'left']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="xticklabels" name="xticklabelsSequence" port_type="basic:List">
+      <docstring>Call signature:
+
+set_xticklabels(labels, fontdict=None, minor=False, **kwargs)
+
+Set the xtick labels with list of strings labels. Return a list of axis text instances.
+
+kwargs set the :class:`~matplotlib.text.Text` properties. Valid properties are
+
+agg_filter: unknown alpha: float (0.0 transparent through 1.0 opaque) animated: [True | False] axes: an :class:`~matplotlib.axes.Axes` instance backgroundcolor: any matplotlib color bbox: rectangle prop dict clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] color: any matplotlib color contains: a callable fun [...]
+      <alternateSpec arg="" name="xticklabelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.axes.AxesSubplot" name="MplAxesSubplotProperties" superclass="MplAxesProperties">
+    <docstring>None</docstring>
+    <inputPortSpec arg="fig" arg_pos="0" constructor_arg="True" name="fig" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.figure.Figure" name="MplFigureProperties" superclass="MplArtistProperties">
+    <docstring>
+    The Figure instance supports callbacks through a *callbacks*
+    attribute which is a :class:`matplotlib.cbook.CallbackRegistry`
+    instance.  The events you can connect to are 'dpi_changed', and
+    the callback will be called with ``func(fig)`` where fig is the
+    :class:`Figure` instance.
+
+    *patch*
+       The figure patch is drawn by a
+       :class:`matplotlib.patches.Rectangle` instance
+
+    *suppressComposite*
+       For multiple figure images, the figure will make composite
+       images depending on the renderer option_image_nocomposite
+       function.  If suppressComposite is True|False, this will
+       override the renderer.
+    </docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>Set the edge color of the Figure rectangle</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="canvas" name="canvas">
+      <docstring>Set the canvas the contains the figure</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="facecolor" name="facecolor" port_type="basic:Color">
+      <docstring>Set the face color of the Figure rectangle</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="size_inches" name="size_inches">
+      <docstring>set_size_inches(w,h, forward=False)
+
+Set the figure size in inches
+
+Usage:
+
+fig.set_size_inches(w,h)  # OR fig.set_size_inches((w,h) )
+
+optional kwarg forward=True will cause the canvas size to be automatically updated; eg you can resize the figure window from the shell</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figwidth" name="figwidth" port_type="basic:Float">
+      <docstring>Set the width of the figure in inches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="frameon" name="frameon" port_type="basic:Boolean">
+      <docstring>Set whether the figure frame (background) is displayed or invisible</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="subplotpars" arg_pos="6" constructor_arg="True" name="subplotpars" />
+    <inputPortSpec arg="figheight" name="figheight" port_type="basic:Float">
+      <docstring>Set the height of the figure in inches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="figsize" arg_pos="0" constructor_arg="True" name="figsize" />
+    <inputPortSpec arg="linewidth" arg_pos="4" constructor_arg="True" name="linewidth" port_type="basic:Float">
+      <defaults>['0.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="tight_layout" name="tight_layout" port_type="basic:Boolean">
+      <docstring>Set whether :meth:`tight_layout` is used upon drawing. If None, the rcParams['figure.autolayout'] value will be set.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="dpi" name="dpi" port_type="basic:Float">
+      <docstring>Set the dots-per-inch of the figure</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.text.Annotation" name="MplAnnotationProperties" superclass="MplTextProperties">
+    <docstring>
+    A :class:`~matplotlib.text.Text` class to make annotating things
+    in the figure, such as :class:`~matplotlib.figure.Figure`,
+    :class:`~matplotlib.axes.Axes`,
+    :class:`~matplotlib.patches.Rectangle`, etc., easier.
+    </docstring>
+    <inputPortSpec arg="xycoords" arg_pos="3" constructor_arg="True" name="xycoords" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+      <defaults>['data']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="figure" name="figure" />
+    <inputPortSpec arg="annotation_clip" arg_pos="6" constructor_arg="True" name="annotation_clip" />
+    <inputPortSpec arg="xytext" arg_pos="2" constructor_arg="True" name="xytext" />
+    <inputPortSpec arg="s" arg_pos="0" constructor_arg="True" name="s" />
+    <inputPortSpec arg="xy" arg_pos="1" constructor_arg="True" name="xy" />
+    <inputPortSpec arg="textcoords" arg_pos="4" constructor_arg="True" name="textcoords">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowprops" arg_pos="5" constructor_arg="True" name="arrowprops" />
+  </moduleSpec>
+</specs>
diff --git a/vistrails/packages/matplotlib/mpl_plots.xml b/vistrails/packages/matplotlib/mpl_plots.xml
new file mode 100644
index 0000000..325ca51
--- /dev/null
+++ b/vistrails/packages/matplotlib/mpl_plots.xml
@@ -0,0 +1,3277 @@
+<specs>
+  <customCode />
+  <moduleSpec code_ref="matplotlib.pyplot.acorr" name="MplAcorr" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot the autocorrelation of x.
+
+Call signature:
+
+acorr(x, normed=True, detrend=mlab.detrend_none, usevlines=True,       maxlags=10, **kwargs)
+
+If normed = True, normalize the data by the autocorrelation at 0-th lag.  x is detrended by the detrend callable (default no normalization).
+
+Data are plotted as plot(lags, c, **kwargs)
+
+Return value is a tuple (lags, c, line) where:
+
+lags are a length 2*maxlags+1 lag vector
+
+c is the 2*maxlags+1 auto correlation vector
+
+line is a :class:`~matplotlib.lines.Line2D` instance returned by :meth:`plot`
+
+The default linestyle is None and the default marker is 'o', though these can be overridden with keyword args. The cross correlation is performed with :func:`numpy.correlate` with mode = 2.
+
+If usevlines is True, :meth:`~matplotlib.axes.Axes.vlines` rather than :meth:`~matplotlib.axes.Axes.plot` is used to draw vertical lines from the origin to the acorr.  Otherwise, the plot style is determined by the kwargs, which are :class:`~matplotlib.lines.Line2D` properties.
+
+maxlags is a positive integer detailing the number of lags to show.  The default value of None will return all (2*len(x)-1) lags.
+
+The return value is a tuple (lags, c, linecol, b) where
+
+linecol is the :class:`~matplotlib.collections.LineCollection`
+
+b is the x-axis.
+
+Example:
+
+:func:`~matplotlib.pyplot.xcorr` is top graph, and :func:`~matplotlib.pyplot.acorr` is bottom graph.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="normed" arg_pos="1" name="normed" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="usevlines" arg_pos="3" name="usevlines" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="detrend" arg_pos="2" name="detrend" />
+    <inputPortSpec arg="maxlags" arg_pos="4" name="maxlags" port_type="basic:Integer">
+      <defaults>['10']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="1" name="hold" />
+    <outputPortSpec arg="lineCollection" compute_name="lineCollection" name="lineCollectionProperties" port_type="__property__" property_key="4" property_type="matplotlib.collections.LineCollection" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.lines.Line2D" />
+    <outputPortSpec arg="xaxis" compute_name="xaxis" name="xaxisProperties" port_type="__property__" property_key="3" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.arrow" name="MplArrow" superclass="MplPlot">
+    <docstring>Add an arrow to the axes.
+
+Call signature:
+
+arrow(x, y, dx, dy, **kwargs)
+
+Draws arrow on specified axis from (x, y) to (x + dx, y + dy). Uses FancyArrow patch to construct the arrow.
+
+Optional kwargs control the arrow construction and properties:
+
+%(FancyArrow)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="dx" arg_pos="2" name="dx" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="dy" arg_pos="3" name="dy" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="arrow" constructor_arg="True" name="arrowProperties" port_type="__property__" property_type="matplotlib.patches.FancyArrow" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axhline" name="MplAxhline" output_type="object" superclass="MplPlot">
+    <docstring>Add a horizontal line across the axis.
+
+Call signature:
+
+axhline(y=0, xmin=0, xmax=1, **kwargs)
+
+Draw a horizontal line at y from xmin to xmax.  With the default values of xmin = 0 and xmax = 1, this line will always span the horizontal extent of the axes, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command.  That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the y location is in data coordinates.
+
+Return value is the :class:`~matplotlib.lines.Line2D` instance.  kwargs are the same as kwargs to plot, and can be used to control the line properties.  Eg.,
+
+draw a thick red hline at y = 0 that spans the xrange:
+
+>>> axhline(linewidth=4, color='r')
+
+draw a default hline at y = 1 that spans the xrange:
+
+>>> axhline(y=1)
+
+draw a default hline at y = .5 that spans the the middle half of the xrange:
+
+>>> axhline(y=.5, xmin=0.25, xmax=0.75)
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, with the exception of 'transform':
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="0" name="y" port_type="basic:Float">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xmin" arg_pos="1" name="xmin" port_type="basic:Float">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="3" name="hold" />
+    <inputPortSpec arg="xmax" arg_pos="2" name="xmax" port_type="basic:Float">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="line" compute_name="line" name="lineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axhspan" name="MplAxhspan" output_type="object" superclass="MplPlot">
+    <docstring>Add a horizontal span (rectangle) across the axis.
+
+Call signature:
+
+axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs)
+
+y coords are in data units and x coords are in axes (relative 0-1) units.
+
+Draw a horizontal span (rectangle) from ymin to ymax. With the default values of xmin = 0 and xmax = 1, this always spans the xrange, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command. That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the y location is in data coordinates.
+
+Return value is a :class:`matplotlib.patches.Polygon` instance.
+
+Examples:
+
+draw a gray rectangle from y = 0.25-0.75 that spans the horizontal extent of the axes:
+
+>>> axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
+
+Valid kwargs are :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="xmin" arg_pos="2" name="xmin" port_type="basic:Float">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="ymin" arg_pos="0" name="ymin" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="ymax" arg_pos="1" name="ymax" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="xmax" arg_pos="3" name="xmax" port_type="basic:Float">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="patch" compute_name="patch" name="patchProperties" port_type="__property__" property_key="-1" property_type="matplotlib.patches.Polygon" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axvline" name="MplAxvline" output_type="object" superclass="MplPlot">
+    <docstring>Add a vertical line across the axes.
+
+Call signature:
+
+axvline(x=0, ymin=0, ymax=1, **kwargs)
+
+Draw a vertical line at x from ymin to ymax.  With the default values of ymin = 0 and ymax = 1, this line will always span the vertical extent of the axes, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command.  That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the x location is in data coordinates.
+
+Return value is the :class:`~matplotlib.lines.Line2D` instance.  kwargs are the same as kwargs to plot, and can be used to control the line properties.  Eg.,
+
+draw a thick red vline at x = 0 that spans the yrange:
+
+>>> axvline(linewidth=4, color='r')
+
+draw a default vline at x = 1 that spans the yrange:
+
+>>> axvline(x=1)
+
+draw a default vline at x = .5 that spans the the middle half of the yrange:
+
+>>> axvline(x=.5, ymin=0.25, ymax=0.75)
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, with the exception of 'transform':
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:Float">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="3" name="hold" />
+    <inputPortSpec arg="ymin" arg_pos="1" name="ymin" port_type="basic:Float">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ymax" arg_pos="2" name="ymax" port_type="basic:Float">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="line" compute_name="line" name="lineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axvspan" name="MplAxvspan" output_type="object" superclass="MplPlot">
+    <docstring>Add a vertical span (rectangle) across the axes.
+
+Call signature:
+
+axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs)
+
+x coords are in data units and y coords are in axes (relative 0-1) units.
+
+Draw a vertical span (rectangle) from xmin to xmax.  With the default values of ymin = 0 and ymax = 1, this always spans the yrange, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command.  That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the y location is in data coordinates.
+
+Return value is the :class:`matplotlib.patches.Polygon` instance.
+
+Examples:
+
+draw a vertical green translucent rectangle from x=1.25 to 1.55 that spans the yrange of the axes:
+
+>>> axvspan(1.25, 1.55, facecolor='g', alpha=0.5)
+
+Valid kwargs are :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="xmin" arg_pos="0" name="xmin" port_type="basic:Float" required="True" />
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="ymin" arg_pos="2" name="ymin" port_type="basic:Float">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ymax" arg_pos="3" name="ymax" port_type="basic:Float">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xmax" arg_pos="1" name="xmax" port_type="basic:Float" required="True" />
+    <outputPortSpec arg="patch" compute_name="patch" name="patchProperties" port_type="__property__" property_key="-1" property_type="matplotlib.patches.Polygon" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.bar" name="MplBar" output_type="object" superclass="MplPlot">
+    <docstring>Make a bar plot.
+
+Call signature:
+
+bar(left, height, width=0.8, bottom=0, **kwargs)
+
+Make a bar plot with rectangles bounded by:
+
+
+
+left, height, width, and bottom can be either scalars or sequences
+
+Return value is a list of :class:`matplotlib.patches.Rectangle` instances.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+For vertical bars, align = 'edge' aligns bars by their left edges in left, while align = 'center' interprets these values as the x coordinates of the bar centers. For horizontal bars, align = 'edge' aligns bars by their bottom edges in bottom, while align = 'center' interprets these values as the y coordinates of the bar centers.
+
+The optional arguments color, edgecolor, linewidth, 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:
+
+%(Rectangle)s
+
+Example: A stacked bar chart.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>the colors of the bar edges</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth">
+      <docstring>width of bar edges; None means use default linewidth; 0 means don't draw edges.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="capsize" name="capsize" port_type="basic:Integer">
+      <docstring>(default 3) determines the length in points of the error bar caps</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="orientation" name="orientation" port_type="basic:String">
+      <docstring>'vertical' | 'horizontal'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['vertical', 'horizontal']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="bottom" arg_pos="3" name="bottom" port_type="basic:Float">
+      <docstring>the y coordinates of the bottom edges of the bars</docstring>
+      <defaults>['0']</defaults>
+      <alternateSpec arg="bottom" name="bottomSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>the colors of the bars</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="xerr" name="xerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="align" name="align" port_type="basic:String">
+      <docstring>'edge' (default) | 'center'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['edge', 'center']]</values>
+      <defaults>['edge']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ecolor" name="ecolor" port_type="basic:Color">
+      <docstring>specifies the color of any errorbar</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="1" name="height" port_type="basic:List" required="True">
+      <docstring>the heights of the bars</docstring>
+      <alternateSpec arg="height" name="heightScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="width" arg_pos="2" name="width" port_type="basic:Float">
+      <docstring>the widths of the bars</docstring>
+      <defaults>['0.8']</defaults>
+      <alternateSpec arg="width" name="widthSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="error_kw" name="error_kw">
+      <docstring>dictionary of kwargs to be passed to errorbar method. ecolor and capsize may be specified here rather than as independent kwargs.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="log" name="log" port_type="basic:Boolean">
+      <docstring>[False|True] False (default) leaves the orientation axis as-is; True sets it to log scale</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="yerr" name="yerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="left" arg_pos="0" name="left" port_type="basic:List" required="False">
+      <docstring>the x coordinates of the left sides of the bars</docstring>
+      <alternateSpec arg="left" name="leftScalar" port_type="basic:Float">
+        <docstring>the x coordinate of the left side of the bar</docstring>
+      </alternateSpec>
+    </inputPortSpec>
+    <outputPortSpec arg="rectangle" compute_name="rectangles" name="rectangleProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.Rectangle" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.barh" name="MplBarh" output_type="object" superclass="MplPlot">
+    <docstring>Make a horizontal bar plot.
+
+Call signature:
+
+barh(bottom, width, height=0.8, left=0, **kwargs)
+
+Make a horizontal bar plot with rectangles bounded by:
+
+
+
+bottom, width, height, and left can be either scalars or sequences
+
+Return value is a list of :class:`matplotlib.patches.Rectangle` instances.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+Setting align = 'edge' aligns bars by their bottom edges in bottom, while align = 'center' interprets these values as the y coordinates of the bar centers.
+
+The optional arguments color, edgecolor, linewidth, xerr, and yerr can be either scalars or sequences of length equal to the number of bars.  This enables you to use barh as the basis for stacked bar charts, or candlestick plots.
+
+other optional kwargs:
+
+%(Rectangle)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>the colors of the bar edges</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth">
+      <docstring>width of bar edges; None means use default linewidth; 0 means don't draw edges.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="capsize" name="capsize" port_type="basic:Integer">
+      <docstring>(default 3) determines the length in points of the error bar caps</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="log" name="log" port_type="basic:Boolean">
+      <docstring>[False|True] False (default) leaves the horizontal axis as-is; True sets it to log scale</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bottom" arg_pos="0" name="bottom" port_type="basic:List" required="True">
+      <docstring>the vertical positions of the bottom edges of the bars</docstring>
+      <alternateSpec arg="bottom" name="bottomScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>the colors of the bars</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="xerr" name="xerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="align" name="align" port_type="basic:String">
+      <docstring>'edge' (default) | 'center'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['edge', 'center']]</values>
+      <defaults>['edge']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ecolor" name="ecolor" port_type="basic:Color">
+      <docstring>specifies the color of any errorbar</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="2" name="height" port_type="basic:Float">
+      <docstring>the heights (thicknesses) of the bars</docstring>
+      <defaults>['0.8']</defaults>
+      <alternateSpec arg="height" name="heightSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="width" arg_pos="1" name="width" port_type="basic:List" required="True">
+      <docstring>the lengths of the bars</docstring>
+      <alternateSpec arg="width" name="widthScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="yerr" name="yerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="left" arg_pos="3" name="left" port_type="basic:Float">
+      <docstring>the x coordinates of the left edges of the bars</docstring>
+      <defaults>['0']</defaults>
+      <alternateSpec arg="left" name="leftSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <outputPortSpec arg="rectangle" compute_name="rectangles" name="rectangleProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.Rectangle" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.broken_barh" name="MplBrokenBarh" superclass="MplPlot">
+    <docstring>Plot horizontal bars.
+
+Call signature:
+
+broken_barh(self, xranges, yrange, **kwargs)
+
+A collection of horizontal bars spanning yrange with a sequence of xranges.
+
+Required arguments:
+
+
+
+kwargs are :class:`matplotlib.collections.BrokenBarHCollection` properties:
+
+%(BrokenBarHCollection)s
+
+these can either be a single argument, ie:
+
+facecolors = 'black'
+
+or a sequence of arguments for the various bars, ie:
+
+facecolors = ('black', 'red', 'green')
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="xranges" arg_pos="0" name="xranges" port_type="basic:List" required="True">
+      <docstring>sequence of (xmin, xwidth)</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="2" name="hold" />
+    <inputPortSpec arg="yrange" arg_pos="1" name="yrange" port_type="basic:Float,basic:Float" required="True">
+      <docstring>(ymin, ywidth)</docstring>
+    </inputPortSpec>
+    <outputPortSpec arg="brokenBarHCollection" compute_name="brokenBarHCollection" name="brokenBarHCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.BrokenBarHCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.boxplot" name="MplBoxplot" output_type="dict" superclass="MplPlot">
+    <docstring>Make a box and whisker plot.
+
+Call signature:
+
+boxplot(x, notch=False, sym='+', vert=True, whis=1.5,         positions=None, widths=None, patch_artist=False,         bootstrap=None, usermedians=None, conf_intervals=None)
+
+Make a box and whisker plot for each column of x or each vector in sequence x.  The box extends from the lower to upper quartile values of the data, with a line at the median. The whiskers extend from the box to show the range of the data.  Flier points are those past the end of the whiskers.
+
+Function Arguments:
+
+
+
+Returns a dictionary mapping each component of the boxplot to a list of the :class:`matplotlib.lines.Line2D` instances created. That dictionary has the following keys (assuming vertical boxplots):
+
+boxes: the main body of the boxplot showing the quartiles and the median's confidence intervals if enabled.
+
+medians: horizonal lines at the median of each box.
+
+whiskers: the vertical lines extending to the most extreme, n-outlier data points.
+
+caps: the horizontal lines at the ends of the whiskers.
+
+fliers: points representing data that extend beyone the whiskers (outliers).
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="11" name="hold" />
+    <inputPortSpec arg="vert" arg_pos="3" name="vert" port_type="basic:Boolean">
+      <docstring>If True (default), makes the boxes vertical. If False, makes horizontal boxes.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="positions" arg_pos="5" name="positions">
+      <docstring>Sets the horizontal positions of the boxes. The ticks and limits are automatically set to match the positions.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bootstrap" arg_pos="8" name="bootstrap">
+      <docstring>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.</ [...]
+    </inputPortSpec>
+    <inputPortSpec arg="usermedians" arg_pos="9" name="usermedians" port_type="basic:List">
+      <docstring>An array or sequence whose first dimension (or length) is compatible with x. This overrides the medians computed by matplotlib for each element of usermedians that is not None. When an element of usermedians == None, the median will be computed directly as normal.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="sym" arg_pos="2" name="sym" port_type="basic:String">
+      <docstring>The default symbol for flier points. Enter an empty string ('') if you don't want to show fliers.</docstring>
+      <defaults>['b+']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="widths" arg_pos="6" name="widths" port_type="basic:Float">
+      <docstring>Either a scalar or a vector and sets the width of each box. The default is 0.5, or 0.15*(distance between extreme positions) if that is smaller.</docstring>
+      <defaults>['0.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="patch_artist" arg_pos="7" name="patch_artist" port_type="basic:Boolean">
+      <docstring>If False produces boxes with the Line2D artist If True produces boxes with the Patch artist</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True">
+      <docstring>Array or a sequence of vectors.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="notch" arg_pos="1" name="notch" port_type="basic:Boolean">
+      <docstring>If False (default), produces a rectangular box plot. If True, will produce a notched box plot</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="whis" arg_pos="4" name="whis" port_type="basic:Float">
+      <docstring>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.</docstring>
+      <defaults>['1.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="conf_intervals" arg_pos="10" name="conf_intervals" port_type="basic:List">
+      <docstring>Array or sequence whose first dimension (or length) is compatible with x and whose second dimension is 2. When the current element of conf_intervals is not None, the notch locations computed by matplotlib are overridden (assuming notch is True). When an element of conf_intervals is None, boxplot compute notches the method specified by the other kwargs (e.g. bootstrap).</docstring>
+    </inputPortSpec>
+    <outputPortSpec arg="box" compute_name="boxes" name="boxProperties" plural="True" port_type="__property__" property_key="boxes" property_type="matplotlib.artist.Line2D" />
+    <outputPortSpec arg="flier" compute_name="fliers" name="flierProperties" plural="True" port_type="__property__" property_key="fliers" property_type="matplotlib.artist.Line2D" />
+    <outputPortSpec arg="cap" compute_name="caps" name="capProperties" plural="True" port_type="__property__" property_key="caps" property_type="matplotlib.artist.Line2D" />
+    <outputPortSpec arg="median" compute_name="medians" name="medianProperties" plural="True" port_type="__property__" property_key="medians" property_type="matplotlib.artist.Line2D" />
+    <outputPortSpec arg="boxPatch" compute_name="boxPatches" name="boxPatchProperties" plural="True" port_type="__property__" property_key="boxPatches" property_type="matplotlib.artist.PathPatch" />
+    <outputPortSpec arg="whisker" compute_name="whiskers" name="whiskerProperties" plural="True" port_type="__property__" property_key="whiskers" property_type="matplotlib.artist.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.cohere" name="MplCohere" superclass="MplPlot">
+    <docstring>Plot the coherence between x and y.
+
+Call signature:
+
+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, **kwargs)
+
+Plot the coherence between x and y.  Coherence is the normalized cross spectral density:
+
+C_{xy} = \frac{|P_{xy}|^2}{P_{xx}P_{yy}}
+
+%(PSD)s
+
+
+
+The return value is a tuple (Cxy, f), where f are the frequencies of the coherence vector.
+
+kwargs are applied to the lines.
+
+References:
+
+Bendat & Piersol -- Random Data: Analysis and Measurement Procedures, John Wiley & Sons (1986)
+
+kwargs control the :class:`~matplotlib.lines.Line2D` properties of the coherence plot:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="3" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="8" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="10" name="scale_by_freq" />
+    <inputPortSpec arg="detrend" arg_pos="5" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="6" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="4" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="2" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="11" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="9" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="7" name="noverlap" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="line" constructor_arg="True" name="lineProperties" port_type="__property__" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.clabel" name="MplClabel" output_type="object" superclass="MplPlot">
+    <docstring>Label a contour plot.
+
+Call signature:
+
+clabel(cs, **kwargs)
+
+Adds labels to line contours in cs, where cs is a :class:`~matplotlib.contour.ContourSet` object returned by contour.
+
+clabel(cs, v, **kwargs)
+
+only labels contours listed in v.
+
+Optional keyword arguments:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="inline_spacing" name="inline_spacing">
+      <docstring>space in pixels to leave on each side of label when placing inline.  Defaults to 5.  This spacing will be exact for labels at locations where the contour is straight, less so for labels on curved contours.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="use_clabeltext" name="use_clabeltext" port_type="basic:String">
+      <docstring>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.</docstring>
+      <defaults>['False)']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="fmt" name="fmt" port_type="basic:String">
+      <docstring>a format string for the label. Default is '%1.3f' Alternatively, this can be a dictionary matching contour levels with arbitrary strings to use for each contour level (i.e., fmt[level]=string), or it can be any callable, such as a :class:`~matplotlib.ticker.Formatter` instance, that returns a string when called with a numeric contour level.</docstring>
+      <defaults>['%1.3f']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="manual" name="manual">
+      <docstring>if True, contour labels will be placed manually using mouse clicks.  Click the first button near a contour to add a label, click the second button (or potentially both mouse buttons at once) to finish adding labels.  The third button can be used to remove the last label added, but only if labels are not inline.  Alternatively, the keyboard can be used to select label locations (enter to end label placement, delete or backspace act like the third mouse button, and any oth [...]
+
+manual can be an iterable object of x,y tuples. Contour labels will be created as if mouse is clicked at each x,y positions.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="cs" arg_pos="0" in_args="True" name="cs" port_type="MplContourSet" required="True" />
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>if None, the color of each label matches the color of the corresponding contour
+
+if one string color, e.g. colors = 'r' or colors = 'red', all labels will be plotted in this color
+
+if a tuple of matplotlib color args (string, float, rgb, etc), different labels will be plotted in different colors in the order specified</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="fontsize" name="fontsize">
+      <docstring>size in points or relative size eg 'smaller', 'x-large'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rightside_up" name="rightside_up" port_type="basic:Boolean">
+      <docstring>if True (default), label rotations will always be plus or minus 90 degrees from level.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="inline" name="inline" port_type="basic:Boolean">
+      <docstring>controls whether the underlying contour is removed or not. Default is True.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="v" arg_pos="1" in_args="True" name="v" port_type="basic:List" />
+    <outputPortSpec arg="text" compute_name="texts" name="textProperties" plural="True" port_type="__property__" property_key="__none__" property_type="matplotlib.text.Text" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.contour" name="MplContour" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot contours.
+
+: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 version in that it does not draw the polygon edges. To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`.
+
+Call signatures:
+
+contour(Z)
+
+make a contour plot of an array Z. The level values are chosen automatically.
+
+contour(X,Y,Z)
+
+X, Y specify the (x, y) coordinates of the surface
+
+contour(Z,N) contour(X,Y,Z,N)
+
+contour N automatically-chosen levels.
+
+contour(Z,V) contour(X,Y,Z,V)
+
+draw contour lines at the values specified in sequence V
+
+contourf(..., V)
+
+fill the len(V)-1 regions between the values in V
+
+contour(Z, **kwargs)
+
+Use keyword args to control colors, linewidth, origin, cmap ... see below for more details.
+
+X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
+
+C = contour(...) returns a :class:`~matplotlib.contour.QuadContourSet` object.
+
+Optional keyword arguments:
+
+
+
+contour-only keyword arguments:
+
+
+
+contourf-only keyword arguments:
+
+
+
+Note: contourf 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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="xunits" name="xunits" port_type="basic:String">
+      <docstring>Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'registered units']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="extend" name="extend" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['neither', 'both', 'min', 'max']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>If linestyles is None, the default is 'solid' unless the lines are monochrome.  In that case, negative contours will take their linestyle from the matplotlibrc contour.negative_linestyle setting.
+
+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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hatches" name="hatches" port_type="basic:List">
+      <docstring>A list of cross hatch patterns to use on the filled areas. If None, no hatching will be added to the contour. Hatching is supported in the PostScript, PDF, SVG and Agg backends only.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="levels" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="locator" name="locator" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="yunits" name="yunits" port_type="basic:String">
+      <docstring>Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="extent" name="extent" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(x0,x1,y0,y1)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Z" arg_pos="2" in_args="True" name="Z" port_type="basic:List" required="True" />
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>enable antialiasing, overriding the defaults.  For filled contours, the default is True.  For line contours, it is taken from rcParams['lines.antialiased'].</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List" />
+    <inputPortSpec arg="V" arg_pos="3" in_args="True" name="V" port_type="basic:List" />
+    <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List" />
+    <inputPortSpec arg="N" arg_pos="4" in_args="True" name="N" port_type="basic:Integer" />
+    <outputPortSpec arg="contourSet" compute_name="contourSet" name="contourSet" port_type="MplQuadContourSet" property_key="0" />
+    <outputPortSpec arg="lineCollection" compute_name="lineCollections" name="lineCollectionProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.collections.LineCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.contourf" name="MplContourf" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot contours.
+
+: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 version in that it does not draw the polygon edges. To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`.
+
+Call signatures:
+
+contour(Z)
+
+make a contour plot of an array Z. The level values are chosen automatically.
+
+contour(X,Y,Z)
+
+X, Y specify the (x, y) coordinates of the surface
+
+contour(Z,N) contour(X,Y,Z,N)
+
+contour N automatically-chosen levels.
+
+contour(Z,V) contour(X,Y,Z,V)
+
+draw contour lines at the values specified in sequence V
+
+contourf(..., V)
+
+fill the len(V)-1 regions between the values in V
+
+contour(Z, **kwargs)
+
+Use keyword args to control colors, linewidth, origin, cmap ... see below for more details.
+
+X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
+
+C = contour(...) returns a :class:`~matplotlib.contour.QuadContourSet` object.
+
+Optional keyword arguments:
+
+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.
+
+contour-only keyword arguments:
+
+
+
+contourf-only keyword arguments:
+
+
+
+Note: contourf 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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>If linestyles is None, the default is 'solid' unless the lines are monochrome.  In that case, negative contours will take their linestyle from the matplotlibrc contour.negative_linestyle setting.
+
+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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="hatches" name="hatches" port_type="basic:List">
+      <docstring>A list of cross hatch patterns to use on the filled areas. If None, no hatching will be added to the contour. Hatching is supported in the PostScript, PDF, SVG and Agg backends only.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="levels" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Z" arg_pos="2" in_args="True" name="Z" port_type="basic:List" required="True" />
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="N" arg_pos="4" in_args="True" name="N" port_type="basic:Integer" />
+    <inputPortSpec arg="V" arg_pos="3" in_args="True" name="V" port_type="basic:List" />
+    <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List" />
+    <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List" />
+    <outputPortSpec arg="contourSet" compute_name="contourSet" name="contourSet" port_type="MplQuadContourSet" property_key="0" />
+    <outputPortSpec arg="polyCollection" compute_name="polyCollections" name="polyCollectionProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.csd" name="MplCsd" superclass="MplPlot">
+    <docstring>Plot cross-spectral density.
+
+Call signature:
+
+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, **kwargs)
+
+The cross spectral density P_{xy} by Welch's average periodogram method.  The vectors x and y are divided into NFFT length segments.  Each segment is detrended by function detrend and windowed by function window.  The product of the direct FFTs of x and y are averaged over each segment to compute P_{xy}, with a scaling to correct for power loss due to windowing.
+
+Returns the tuple (Pxy, freqs).  P is the cross spectrum (complex valued), and 10\log_{10}|P_{xy}| is plotted.
+
+%(PSD)s
+
+
+
+kwargs control the Line2D properties:
+
+%(Line2D)s
+
+Example:
+
+seealso:  :meth:`psd`     For a description of the optional parameters.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="3" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="8" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="10" name="scale_by_freq" />
+    <inputPortSpec arg="detrend" arg_pos="5" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="6" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="4" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="2" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="11" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="9" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="7" name="noverlap" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="line" constructor_arg="True" name="lineProperties" port_type="__property__" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.errorbar" name="MplErrorbar" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot an errorbar graph.
+
+Call signature:
+
+errorbar(x, y, yerr=None, xerr=None,          fmt='-', ecolor=None, elinewidth=None, capsize=3,          barsabove=False, lolims=False, uplims=False,          xlolims=False, xuplims=False, errorevery=1,          capthick=None)
+
+Plot x versus y with error deltas in yerr and xerr. Vertical errorbars are plotted if yerr is not None. Horizontal errorbars are plotted if xerr is not None.
+
+x, y, xerr, and yerr can all be scalars, which plots a single error bar at x, y.
+
+Optional keyword arguments:
+
+
+
+All other keyword arguments are passed on to the plot command for the markers. For example, this code makes big red squares with thick green edges:
+
+x,y,yerr = rand(3,10) errorbar(x, y, yerr, marker='s',          mfc='red', mec='green', ms=20, mew=4)
+
+where mfc, mec, ms and mew are aliases for the longer property names, markerfacecolor, markeredgecolor, markersize and markeredgewith.
+
+valid kwargs for the marker properties are
+
+%(Line2D)s
+
+Returns (plotline, caplines, barlinecols):
+
+
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="lolims" arg_pos="9" name="lolims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="capsize" arg_pos="7" name="capsize" port_type="basic:Float">
+      <docstring>The length of the error bar caps in points</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="uplims" arg_pos="10" name="uplims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xlolims" arg_pos="11" name="xlolims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="barsabove" arg_pos="8" name="barsabove">
+      <docstring>if True, will plot the errorbars above the plot symbols. Default is below.</docstring>
+      <defaults>['below']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xerr" arg_pos="3" name="xerr" port_type="basic:List">
+      <docstring>If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.
+
+If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+      <alternateSpec arg="xerr" name="xerrScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="fmt" arg_pos="4" name="fmt" port_type="basic:String">
+      <docstring>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.</docstring>
+      <defaults>['-']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ecolor" arg_pos="5" name="ecolor" port_type="basic:Color">
+      <docstring>A matplotlib color arg which gives the color the errorbar lines; if None, use the marker color.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'mpl color']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="errorevery" arg_pos="13" name="errorevery" port_type="basic:Integer">
+      <docstring>subsamples the errorbars. Eg if everyerror=5, errorbars for every 5-th datapoint will be plotted. The data plot itself still shows all data points.</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="capthick" arg_pos="14" name="capthick" port_type="basic:Float">
+      <docstring>An alias kwarg to markeredgewidth (a.k.a. - mew). This setting is a more sensible name for the property that controls the thickness of the error bar cap in points. For backwards compatibility, if mew or markeredgewidth are given, then they will over-ride capthick.  This may change in future releases.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xuplims" arg_pos="12" name="xuplims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="elinewidth" arg_pos="6" name="elinewidth" port_type="basic:Float">
+      <docstring>The linewidth of the errorbar lines. If None, use the linewidth.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="15" name="hold" />
+    <inputPortSpec arg="yerr" arg_pos="2" name="yerr" port_type="basic:List">
+      <docstring>If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.
+
+If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+      <alternateSpec arg="yerr" name="yerrScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <outputPortSpec arg="capline" compute_name="caplines" name="caplineProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.lines.Line2D" />
+    <outputPortSpec arg="barline" compute_name="barlines" name="barlineProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.collections.LineCollection" />
+    <outputPortSpec arg="plotline" compute_name="plotline" name="plotlineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.fill" name="MplFill" output_type="object" superclass="MplPlot">
+    <docstring>Plot filled polygons.
+
+Call signature:
+
+fill(*args, **kwargs)
+
+args is a variable length argument, allowing for multiple x, y pairs with an optional color format string; see :func:`~matplotlib.pyplot.plot` for details on the argument parsing.  For example, to plot a polygon with vertices at x, y in blue.:
+
+ax.fill(x,y, 'b' )
+
+An arbitrary number of x, y, color groups can be specified:
+
+ax.fill(x1, y1, 'g', x2, y2, 'r')
+
+Return value is a list of :class:`~matplotlib.patches.Patch` instances that were added.
+
+The same color strings that :func:`~matplotlib.pyplot.plot` supports are supported by the fill format string.
+
+If you would like to fill below a curve, eg. shade a region between 0 and y along x, use :meth:`fill_between`
+
+The closed kwarg will close the polygon when True (default).
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    <outputPortSpec arg="polygon" compute_name="polygons" name="polygonProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.patches.Polygon" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.fill_between" name="MplFillBetween" output_type="object" superclass="MplPlot">
+    <docstring>Make filled polygons between two curves.
+
+Call signature:
+
+fill_between(x, y1, y2=0, where=None, **kwargs)
+
+Create a :class:`~matplotlib.collections.PolyCollection` filling the regions between y1 and y2 where where==True
+
+
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(PolyCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y2" arg_pos="2" name="y2" port_type="basic:Float">
+      <docstring>A scalar y-value</docstring>
+      <defaults>['0.0']</defaults>
+      <alternateSpec arg="y2" name="y2Sequence" port_type="basic:List">
+        <docstring>An N-length array of the y data</docstring>
+      </alternateSpec>
+    </inputPortSpec>
+    <inputPortSpec arg="interpolate" arg_pos="4" name="interpolate" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y1" arg_pos="1" in_args="True" name="y1" port_type="basic:List" required="True">
+      <docstring>An N-length array of the y data</docstring>
+      <alternateSpec arg="y1" name="y1Scalar" port_type="basic:Float">
+        <docstring>A scalar y-value</docstring>
+      </alternateSpec>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True">
+      <docstring>An N-length array of the x data</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="5" name="hold" />
+    <inputPortSpec arg="where" arg_pos="3" name="where" port_type="basic:List">
+      <docstring>An N-length boolean array that specifies where the fill is effective</docstring>
+    </inputPortSpec>
+    <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.fill_betweenx" name="MplFillBetweenx" output_type="object" superclass="MplPlot">
+    <docstring>Make filled polygons between two horizontal curves.
+
+Call signature:
+
+fill_between(y, x1, x2=0, where=None, **kwargs)
+
+Create a :class:`~matplotlib.collections.PolyCollection` filling the regions between x1 and x2 where where==True
+
+
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(PolyCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="0" in_args="True" name="y" port_type="basic:List" required="True">
+      <docstring>An N-length array of the y data</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x2" arg_pos="2" name="x2" port_type="basic:Float">
+      <docstring>A scalar x-value</docstring>
+      <defaults>['0']</defaults>
+      <alternateSpec arg="x2" name="x2Sequence" port_type="basic:List">
+        <docstring>An N-length array of the x data</docstring>
+      </alternateSpec>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="x1" arg_pos="1" in_args="True" name="x1" port_type="basic:List" required="True">
+      <docstring>An N-length array of the x data</docstring>
+      <alternateSpec arg="x1" name="x1Scalar" port_type="basic:Float">
+        <docstring>A scalar x-value</docstring>
+      </alternateSpec>
+    </inputPortSpec>
+    <inputPortSpec arg="where" arg_pos="3" name="where" port_type="basic:List">
+      <docstring>An N-length boolean array that specifies where the fill is effective</docstring>
+    </inputPortSpec>
+    <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hexbin" name="MplHexbin" output_type="object" superclass="MplPlot">
+    <docstring>Make a hexagonal binning plot.
+
+Call signature:
+
+hexbin(x, y, C = None, gridsize = 100, bins = None,        xscale = 'linear', yscale = 'linear',        cmap=None, norm=None, vmin=None, vmax=None,        alpha=None, linewidths=None, edgecolors='none'        reduce_C_function = np.mean, mincnt=None, marginals=True        **kwargs)
+
+Make a hexagonal binning plot of x versus y, where x, y are 1-D sequences of the same length, N. If C is None (the default), this is a histogram of the number of occurences of the observations at (x[i],y[i]).
+
+If C is specified, it specifies values at the coordinate (x[i],y[i]). These values are accumulated for each hexagonal bin and then reduced according to reduce_C_function, which defaults to numpy's mean function (np.mean). (If C is specified, it must also be a 1-D sequence of the same length as x and y.)
+
+x, y and/or C may be masked arrays, in which case only unmasked points will be plotted.
+
+Optional keyword arguments:
+
+Other keyword arguments controlling color mapping and normalization arguments:
+
+Other keyword arguments controlling the Collection properties:
+
+Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs:
+
+%(Collection)s
+
+The return value is a :class:`~matplotlib.collections.PolyCollection` instance; use :meth:`~matplotlib.collections.PolyCollection.get_array` on this :class:`~matplotlib.collections.PolyCollection` to get the counts in each hexagon. If marginals is True, horizontal bar and vertical bar (both PolyCollections) will be attached to the return collection as attributes hbar and vbar.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="vmax" arg_pos="11" name="vmax" port_type="basic:Float">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="edgecolors" arg_pos="14" name="edgecolorsSequence" port_type="basic:List">
+      <docstring>If 'none', draws the edges in the same color as the fill color. This is the default, as it avoids unsightly unpainted pixels between the hexagons.
+
+If None, draws the outlines in the default color.
+
+If a matplotlib color arg or sequence of rgba tuples, draws the outlines in the specified color.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'none', 'mpl color']]</values>
+      <defaults>['none']</defaults>
+      <alternateSpec arg="edgecolors" name="edgecolorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="C" arg_pos="2" name="C" port_type="basic:List" />
+    <inputPortSpec arg="gridsize" arg_pos="3" name="gridsize" port_type="basic:Integer">
+      <docstring>The number of hexagons in the x-direction, default is 100. The corresponding number of hexagons in the y-direction is chosen such that the hexagons are approximately regular. Alternatively, gridsize can be a tuple with two elements specifying the number of hexagons in the x-direction and the y-direction.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+      <defaults>['100']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" arg_pos="10" name="vmin" port_type="basic:Float">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="yscale" arg_pos="6" name="yscale" port_type="basic:String">
+      <defaults>['linear']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="reduce_C_function" arg_pos="15" name="reduce_C_function">
+      <defaults>['<function mean at 0x0277B3B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" arg_pos="13" name="linewidths">
+      <docstring>If None, defaults to rc lines.linewidth. Note that this is a tuple, and if you set the linewidths argument you must set it as a sequence of floats, as required by :class:`~matplotlib.collections.RegularPolyCollection`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="xscale" arg_pos="5" name="xscale" port_type="basic:String">
+      <docstring>Use a linear or log10 scale on the horizontal axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['linear', 'log']]</values>
+      <defaults>['linear']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="8" name="cmap" port_type="basic:String">
+      <docstring>a :class:`matplotlib.colors.Colormap` instance. If None, defaults to rc image.cmap.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="9" name="norm" port_type="basic:String">
+      <docstring>:class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="extent" arg_pos="7" name="extent">
+      <docstring>The limits of the bins. The default assigns the limits based on gridsize, x, y, xscale and yscale.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" arg_pos="12" name="alpha" port_type="basic:Float">
+      <docstring>the alpha value for the patches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="18" name="hold" />
+    <inputPortSpec arg="mincnt" arg_pos="16" name="mincnt">
+      <docstring>If not None, only display cells with more than mincnt number of points in the cell</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="marginals" arg_pos="17" name="marginals" port_type="basic:Boolean">
+      <docstring>if marginals is True, plot the marginal density as colormapped rectagles along the bottom of the x-axis and left of the y-axis</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bins" arg_pos="4" name="bins" port_type="basic:Integer">
+      <docstring>If None, no binning is applied; the color of each hexagon directly corresponds to its count value.
+
+If 'log', use a logarithmic scale for the color map. Internally, log_{10}(i+1) is used to determine the hexagon color.
+
+If an integer, divide the counts in the specified number of bins, and color the hexagons accordingly.
+
+If a sequence of values, the values of the lower bound of the bins to be used.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="scale" name="scale" port_type="basic:String">
+      <docstring>Use a linear or log10 scale on the vertical axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['linear', 'log']]</values>
+    </inputPortSpec>
+    <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="-1" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hist" name="MplHist" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot a histogram.
+
+Call signature:
+
+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, stacked=False,        **kwargs)
+
+Compute and draw the histogram of x. The return value is a tuple (n, bins, patches) or ([n0, n1, ...], bins, [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:
+
+
+
+kwargs are used to update the properties of the :class:`~matplotlib.patches.Patch` instances returned by hist:
+
+%(Patch)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="rwidth" arg_pos="10" name="rwidth">
+      <docstring>The relative width of the bars as a fraction of the bin width.  If None, automatically compute the width. Ignored if histtype = 'step' or 'stepfilled'.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="normed" arg_pos="3" name="normed" port_type="basic:Boolean">
+      <docstring>If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)*dbin).  In a probability density, the integral of the histogram should be 1; you can verify that with a trapezoidal integration of the probability density function:
+
+pdf, bins, patches = ax.hist(...) print np.sum(pdf * np.diff(bins))
+
+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</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="stacked" arg_pos="14" name="stacked" port_type="basic:Boolean">
+      <docstring>If True, multiple data are stacked on top of each other If False multiple data are aranged side by side if histtype is 'bar' or on top of each other if histtype is 'step'
+
+.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="orientation" arg_pos="9" name="orientation" port_type="basic:String">
+      <docstring>If 'horizontal', :func:`~matplotlib.pyplot.barh` will be used for bar-type histograms and the bottom kwarg will be the left edges.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['horizontal', 'vertical']]</values>
+      <defaults>['vertical']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bottom" arg_pos="6" name="bottom" />
+    <inputPortSpec arg="color" arg_pos="12" name="colorSequence" port_type="basic:List">
+      <docstring>Color spec or sequence of color specs, one per dataset.  Default (None) uses the standard line color sequence.</docstring>
+      <alternateSpec arg="color" name="colorScalar" port_type="basic:Color">
+	<translations>translate_color</translations>
+      </alternateSpec>
+    </inputPortSpec>
+    <inputPortSpec arg="histtype" arg_pos="7" name="histtype" port_type="basic:String">
+      <docstring>The type of histogram to draw.
+
+'bar' is a traditional bar-type histogram.  If multiple data are given the bars are aranged side by side.
+
+'barstacked' is a bar-type histogram where multiple data are stacked on top of each other.
+
+'step' generates a lineplot that is by default unfilled.
+
+'stepfilled' generates a lineplot that is by default filled.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['bar', 'barstacked', 'step', 'stepfilled']]</values>
+      <defaults>['bar']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="align" arg_pos="8" name="align" port_type="basic:String">
+      <docstring>Controls how the histogram is plotted.
+
+'left': bars are centered on the left bin edges.
+
+'mid': bars are centered between the bin edges.
+
+'right': bars are centered on the right bin edges.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'mid', 'right']]</values>
+      <defaults>['mid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cumulative" arg_pos="5" name="cumulative" port_type="basic:Boolean">
+      <docstring>If True, then a histogram is computed where each bin gives the counts in that bin plus all bins for smaller values. The last bin gives the total number of datapoints.  If normed is also True then the histogram is normalized such that the last bin equals 1. If cumulative evaluates to less than 0 (e.g. -1), the direction of accumulation is reversed.  In this case, if normed is also True, then the histogram is normalized such that the first bin equals 1.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="13" name="labelSequence" port_type="basic:List">
+      <docstring>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()</docstring>
+      <alternateSpec arg="label" name="labelScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="range" arg_pos="2" name="range" port_type="basic:List">
+      <docstring>The lower and upper range of the bins. Lower and upper outliers 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 based on the specified bin range instead of the range of x.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="weights" arg_pos="4" name="weights">
+      <docstring>An array of weights, of the same shape as x.  Each value in x only contributes its associated weight towards the bin count (instead of 1).  If normed is True, the weights are normalized, so that the integral of the density over the range remains 1.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="15" name="hold" />
+    <inputPortSpec arg="bins" arg_pos="1" name="bins" port_type="basic:Integer">
+      <docstring>Either an integer number of bins or a sequence giving the 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.</docstring>
+      <defaults>['10']</defaults>
+      <alternateSpec arg="bins" name="binsSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="log" arg_pos="11" name="log" port_type="basic:Boolean">
+      <docstring>If True, the histogram axis will be set to a log scale. If log is True and x is a 1D array, empty bins will be filtered out and only the non-empty (n, bins, patches) will be returned.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="rectangle" compute_name="rectangles" name="rectangleProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.patches.Rectangle" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hist2d" name="MplHist2d" superclass="MplPlot">
+    <docstring>Make a 2D histogram plot.
+
+Call signature:
+
+hist2d(x, y, bins = None, range=None, weights=None, cmin=None, cmax=None **kwargs)
+
+Make a 2d histogram plot of x versus y, where x, y are 1-D sequences of the same length.
+
+The return value is (counts, xedges, yedges, Image).
+
+Optional keyword arguments: bins: [None | int | [int, int] | array_like | [array, array]]
+
+The bin specification:
+
+If int, the number of bins for the two dimensions (nx=ny=bins).
+
+If [int, int], the number of bins in each dimension (nx, ny = bins).
+
+If array_like, the bin edges for the two dimensions (x_edges=y_edges=bins).
+
+If [array, array], the bin edges in each dimension (x_edges, y_edges = bins).
+
+The default value is 10.
+
+Remaining keyword arguments are passed directly to :meth:`pcolorfast`.
+
+Rendering the histogram with a logarithmic color scale is accomplished by passing a :class:`colors.LogNorm` instance to the norm keyword argument.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="normed" arg_pos="4" name="normed" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmin" arg_pos="6" name="cmin" />
+    <inputPortSpec arg="range" arg_pos="3" name="range" />
+    <inputPortSpec arg="weights" arg_pos="5" name="weights" />
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="8" name="hold" />
+    <inputPortSpec arg="cmax" arg_pos="7" name="cmax" />
+    <inputPortSpec arg="bins" arg_pos="2" name="bins" port_type="basic:Integer">
+      <defaults>['10']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hlines" name="MplHlines" output_type="object" superclass="MplPlot">
+    <docstring>Plot horizontal lines.
+
+call signature:
+
+hlines(y, xmin, xmax, colors='k', linestyles='solid', **kwargs)
+
+Plot horizontal lines at each y from xmin to xmax.
+
+Returns the :class:`~matplotlib.collections.LineCollection` that was added.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="linestyles" arg_pos="4" name="linestyles" port_type="basic:String">
+      <docstring>[ 'solid' | 'dashed' | 'dashdot' | 'dotted' ]</docstring>
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="5" name="label" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xmin" arg_pos="1" name="xminScalar" port_type="basic:Float" required="True">
+      <docstring>can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.</docstring>
+      <alternateSpec arg="xmin" name="xminSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="colors" arg_pos="3" name="colorsSequence" port_type="basic:List">
+      <docstring>a line collections color argument, either a single color or a len(y) list of colors</docstring>
+      <defaults>['k']</defaults>
+      <alternateSpec arg="colors" name="colorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="xmax" arg_pos="2" name="xmaxScalar" port_type="basic:Float" required="True">
+      <docstring>can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.</docstring>
+      <alternateSpec arg="xmax" name="xmaxSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="0" name="y" port_type="basic:List" required="True">
+      <docstring>a 1-D numpy array or iterable.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.collections.LineCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.imshow" name="MplImshow" superclass="MplPlot">
+    <docstring>Display an image on the axes.
+
+Call signature:
+
+imshow(X, cmap=None, norm=None, aspect=None, interpolation=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 array, a uint8 array or a PIL image. If X is an array, X can have the following shapes:
+
+MxN -- luminance (grayscale, float array only)
+
+MxNx3 -- RGB (float or uint8 array)
+
+MxNx4 -- RGBA (float or uint8 array)
+
+The value for each component of MxNx3 and MxNx4 float arrays should be in the range 0.0 to 1.0; MxN float arrays may be normalised.
+
+An :class:`matplotlib.image.AxesImage` instance is returned.
+
+Keyword arguments:
+
+interpolation:
+
+Acceptable values are None, 'none', 'nearest', 'bilinear', '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 filterrad parameters
+
+If interpolation is 'none', then no interpolation is performed on the Agg, ps and pdf backends. Other backends will fall back to 'nearest'.
+
+Additional kwargs are :class:`~matplotlib.artist.Artist` properties:
+
+%(Artist)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" arg_pos="8" name="origin" />
+    <inputPortSpec arg="imlim" arg_pos="13" name="imlim" />
+    <inputPortSpec arg="extent" arg_pos="9" name="extent" />
+    <inputPortSpec arg="vmin" arg_pos="6" name="vmin" />
+    <inputPortSpec arg="url" arg_pos="15" name="url" />
+    <inputPortSpec arg="resample" arg_pos="14" name="resample" />
+    <inputPortSpec arg="shape" arg_pos="10" name="shape" />
+    <inputPortSpec arg="cmap" arg_pos="1" name="cmap" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance, eg. cm.jet. If None, default to rc image.cmap value.
+
+cmap is ignored when X has RGB(A) information</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="filterrad" arg_pos="12" name="filterrad" port_type="basic:Float">
+      <defaults>['4.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="filternorm" arg_pos="11" name="filternorm" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="aspect" arg_pos="3" name="aspect">
+      <docstring>If 'auto', changes the image aspect ratio to match that of the axes
+
+If 'equal', and extent is None, changes the axes aspect ratio to match that of the image. If extent is not None, the axes aspect ratio is changed to match that of the extent.
+
+If None, default to rc image.aspect value.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'auto', 'equal']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" arg_pos="5" name="alpha" />
+    <inputPortSpec arg="vmax" arg_pos="7" name="vmax" />
+    <inputPortSpec arg="X" arg_pos="0" name="X" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="16" name="hold" />
+    <inputPortSpec arg="norm" arg_pos="2" name="norm" />
+    <inputPortSpec arg="interpolation" arg_pos="4" name="interpolation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.loglog" name="MplLoglog" output_type="object" superclass="MplPlot">
+    <docstring>Make a plot with log scaling on both the x and y axis.
+
+Call signature:
+
+loglog(*args, **kwargs)
+
+:func:`~matplotlib.pyplot.loglog` supports all the keyword arguments of :func:`~matplotlib.pyplot.plot` and :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="nonposx" name="nonposx" port_type="basic:String">
+      <docstring>Non-positive values in x or y can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="nonposy" name="nonposy" port_type="basic:String">
+      <docstring>Non-positive values in x or y can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="basex" name="basex" port_type="basic:Float">
+      <docstring>Base of the x/y logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="basey" name="basey" port_type="basic:Float">
+      <docstring>Base of the x/y logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="subsx" name="subsxSequence" port_type="basic:List">
+      <docstring>The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="subsx" name="subsxScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="subsy" name="subsySequence" port_type="basic:List">
+      <docstring>The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="subsy" name="subsyScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.pcolor" name="MplPcolor" output_type="object" superclass="MplPlot">
+    <docstring>Create a pseudocolor plot of a 2-D array.
+
+Note: pcolor can be very slow for large arrays; consider using the similar but much faster :func:`~matplotlib.pyplot.pcolormesh` instead.
+
+Call signatures:
+
+pcolor(C, **kwargs) pcolor(X, Y, C, **kwargs)
+
+C is the array of color values.
+
+X and Y, if given, specify the (x, y) coordinates of the colored quadrilaterals; the quadrilateral for C[i,j] has corners at:
+
+(X[i,   j],   Y[i,   j]), (X[i,   j+1], Y[i,   j+1]), (X[i+1, j],   Y[i+1, j]), (X[i+1, j+1], Y[i+1, j+1]).
+
+Ideally the dimensions of X and Y should be one greater than those of C; if the dimensions are the same, then the last row and column of C will be ignored.
+
+Note that the the column index corresponds to the x-coordinate, and the row index corresponds to y; for details, see the :ref:`Grid Orientation <axes-pcolor-grid-orientation>` section below.
+
+If either or both of X and Y are 1-D arrays or column vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid.
+
+X, Y and C may be masked arrays.  If either C[i, j], or one of the vertices surrounding C[i,j] (X or Y at [i, j], [i+1, j], [i, j+1],[i+1, j+1]) is masked, nothing is plotted.
+
+Keyword arguments:
+
+
+
+Return value is a :class:`matplotlib.collections.Collection` instance.
+
+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, except that the Y axis is reversed.  That is, C is taken as C*(*y, x).
+
+Similarly for :func:`meshgrid`:
+
+x = np.arange(5) y = np.arange(3) X, Y = meshgrid(x,y)
+
+is equivalent to:
+
+X = array([[0, 1, 2, 3, 4],            [0, 1, 2, 3, 4],            [0, 1, 2, 3, 4]])  Y = array([[0, 0, 0, 0, 0],            [1, 1, 1, 1, 1],            [2, 2, 2, 2, 2]])
+
+so if you have:
+
+C = rand( len(x), len(y))
+
+then you need:
+
+pcolor(X, Y, C.T)
+
+or:
+
+pcolor(C.T)
+
+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.
+
+kwargs can be used to control the :class:`~matplotlib.collections.PolyCollection` properties:
+
+%(PolyCollection)s
+
+Note: the default antialiaseds is False if the default edgecolors*="none" is used.  This eliminates artificial lines at patch boundaries, and works regardless of the value of alpha.  If *edgecolors is not "none", then the default antialiaseds is taken from rcParams['patch.antialiased'], which defaults to True. Stroking the edges may be preferred if alpha is 1, but will cause artifacts otherwise.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolors" name="edgecolorsSequence" port_type="basic:List">
+      <docstring>If None, the rc setting is used by default.
+
+If 'none', edges will not be visible.
+
+An mpl color or sequence of colors will set the edge color</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'none', 'color']]</values>
+      <alternateSpec arg="edgecolors" name="edgecolorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>the alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="shading" name="shading" port_type="basic:String">
+      <docstring>If 'faceted', a black grid is drawn around each rectangle; if 'flat', edges are not drawn. Default is 'flat', contrary to MATLAB.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['flat', 'faceted']]</values>
+      <defaults>['flat']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>An :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1. If None, defaults to :func:`normalize`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List" />
+    <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List" />
+    <inputPortSpec arg="Z" arg_pos="2" in_args="True" name="Z" port_type="basic:List" required="True" />
+    <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="0" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.pcolormesh" name="MplPcolormesh" superclass="MplPlot">
+    <docstring>Plot a quadrilateral mesh.
+
+Call signatures:
+
+pcolormesh(C) pcolormesh(X, Y, C) pcolormesh(C, **kwargs)
+
+Create a pseudocolor plot of a 2-D array.
+
+pcolormesh is similar to :func:`~matplotlib.pyplot.pcolor`, but uses a different mechanism and returns a different object; pcolor returns a :class:`~matplotlib.collections.PolyCollection` but pcolormesh returns a :class:`~matplotlib.collections.QuadMesh`.  It is much faster, so it is almost always preferred for large arrays.
+
+C may be a masked array, but X and Y may not.  Masked array support is implemented via cmap and norm; in contrast, :func:`~matplotlib.pyplot.pcolor` simply does not draw quadrilaterals with masked colors or vertices.
+
+Keyword arguments:
+
+
+
+Return value is a :class:`matplotlib.collections.QuadMesh` object.
+
+kwargs can be used to control the :class:`matplotlib.collections.QuadMesh` properties:
+
+%(QuadMesh)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolors" name="edgecolorsSequence" port_type="basic:List">
+      <docstring>If None, the rc setting is used by default.
+
+If 'None', edges will not be visible.
+
+If 'face', edges will have the same color as the faces.
+
+An mpl color or sequence of colors will set the edge color</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'None', 'face', 'color']]</values>
+      <alternateSpec arg="edgecolors" name="edgecolorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>the alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="shading" name="shading" port_type="basic:String">
+      <docstring>'flat' indicates a solid color for each quad.  When 'gouraud', each quad will be Gouraud shaded.  When gouraud shading, edgecolors is ignored.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['flat', 'gouraud']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1. If None, defaults to :func:`normalize`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.pie" name="MplPie" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot a pie chart.
+
+Call signature:
+
+pie(x, explode=None, labels=None,     colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),     autopct=None, pctdistance=0.6, shadow=False,     labeldistance=1.1, startangle=None, radius=None)
+
+Make a pie chart of array x.  The fractional area of each wedge is given by x/sum(x).  If sum(x) <= 1, then the values of x give the fractional area directly and the array will not be normalized.  The wedges are plotted counterclockwise, by default starting from the x-axis.
+
+Keyword arguments:
+
+radius: [ None | scalar ] The radius of the pie, if radius is None it will be set to 1.
+
+The pie chart will probably look best if the figure and axes are square.  Eg.:
+
+figure(figsize=(8,8)) ax = axes([0.1, 0.1, 0.8, 0.8])
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="autopct" arg_pos="4" name="autopct" port_type="basic:String">
+      <docstring>If not None, is a string or function used to label the wedges with their numeric value.  The label will be placed inside the wedge.  If it is a format string, the label will be fmt%pct. If it is a function, it will be called.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'format function']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="pctdistance" arg_pos="5" name="pctdistance" port_type="basic:Float">
+      <docstring>The ratio between the center of each pie slice and the start of the text generated by autopct.  Ignored if autopct is None; default is 0.6.</docstring>
+      <defaults>['0.6']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labels" arg_pos="2" name="labelsSequence" port_type="basic:List">
+      <docstring>A sequence of strings providing the labels for each wedge</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="labels" name="labelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="explode" arg_pos="1" name="explodeSequence" port_type="basic:List">
+      <docstring>If not None, is a len(x) array which specifies the fraction of the radius with which to offset each wedge.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="explode" name="explodeScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="colors" arg_pos="3" name="colors" port_type="basic:Color">
+      <docstring>A sequence of matplotlib color args through which the pie chart will cycle.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="radius" arg_pos="9" name="radius" />
+    <inputPortSpec arg="startangle" arg_pos="8" name="startangle" port_type="basic:String">
+      <docstring>If not None, rotates the start of the pie chart by angle degrees counterclockwise from the x-axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Offset angle']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="shadow" arg_pos="6" name="shadow" port_type="basic:Boolean">
+      <docstring>Draw a shadow beneath the pie.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="10" name="hold" />
+    <inputPortSpec arg="labeldistance" arg_pos="7" name="labeldistance" port_type="basic:Float">
+      <docstring>The radial distance at which the pie labels are drawn</docstring>
+      <defaults>['1.1']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="autotext" compute_name="autotexts" name="autotextProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.text.Text" />
+    <outputPortSpec arg="wedge" compute_name="wedges" name="wedgeProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.patches.Wedge" />
+    <outputPortSpec arg="text" compute_name="texts" name="textProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.text.Text" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.plot_date" name="MplPlotDate" output_type="object" superclass="MplPlot">
+    <docstring>Plot with data with dates.
+
+Call signature:
+
+plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, **kwargs)
+
+Similar to the :func:`~matplotlib.pyplot.plot` command, except the x or y (or both) data is considered to be dates, and the axis is labeled accordingly.
+
+x and/or y can be a sequence of dates represented as float days since 0001-01-01 UTC.
+
+Keyword arguments:
+
+
+
+Note if you are using custom date tickers and formatters, it may be necessary to set the formatters/locators after the call to :meth:`plot_date` since :meth:`plot_date` will set the default tick locator to :class:`matplotlib.dates.AutoDateLocator` (if the tick locator is not already set to a :class:`matplotlib.dates.DateLocator` instance) and the default tick formatter to :class:`matplotlib.dates.AutoDateFormatter` (if the tick formatter is not already set to a :class:`matplotlib.dates.D [...]
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="tz" arg_pos="3" name="tz" port_type="basic:String">
+      <docstring>The time zone to use in labeling dates. If None, defaults to rc value.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', ':class:`tzinfo` instance']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fmt" arg_pos="2" name="fmt" port_type="basic:String">
+      <docstring>The plot format string.</docstring>
+      <defaults>['bo']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ydate" arg_pos="5" name="ydate" port_type="basic:Boolean">
+      <docstring>If True, the y-axis will be labeled with dates.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xdate" arg_pos="4" name="xdate" port_type="basic:Boolean">
+      <docstring>If True, the x-axis will be labeled with dates.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.psd" name="MplPsd" superclass="MplPlot">
+    <docstring>Plot the power spectral density.
+
+Call signature:
+
+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, **kwargs)
+
+The power spectral density by Welch's average periodogram method.  The vector x is divided into NFFT length segments.  Each segment is detrended by function detrend and windowed by function window.  noverlap gives the length of the overlap between segments.  The |\mathrm{fft}(i)|^2 of each segment i are averaged to compute Pxx, with a scaling to correct for power loss due to windowing.  Fs is the sampling frequency.
+
+%(PSD)s
+
+
+
+Returns the tuple (Pxx, freqs).
+
+For plotting, the power is plotted as 10\log_{10}(P_{xx}) for decibels, though Pxx itself is returned.
+
+kwargs control the :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="2" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="7" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="9" name="scale_by_freq" />
+    <inputPortSpec arg="detrend" arg_pos="4" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="5" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="3" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="1" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="10" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="8" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="6" name="noverlap" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="line" constructor_arg="True" name="lineProperties" port_type="__property__" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.quiver" name="MplQuiver" output_type="object" superclass="MplPlot">
+    <docstring>Plot a 2-D field of arrows.
+
+call signatures:
+
+quiver(U, V, **kw) quiver(U, V, C, **kw) quiver(X, Y, U, V, **kw) quiver(X, Y, U, V, C, **kw)
+
+Arguments:
+
+
+
+All arguments may be 1-D or 2-D arrays or sequences. If X and Y are absent, they will be generated as a uniform grid.  If U and V are 2-D arrays but X and Y are 1-D, and if len(X) and len(Y) match the column and row dimensions of U, then X and Y will be expanded with :func:`numpy.meshgrid`.
+
+U, V, C may be masked arrays, but masked X, Y are not supported at present.
+
+Keyword arguments:
+
+
+
+The defaults give a slightly swept-back arrow; to make the head a triangle, make headaxislength the same as headlength. To make the arrow more pointed, reduce headwidth or increase headlength and headaxislength. To make the head smaller relative to the shaft, scale down all the head parameters. You will probably do best to leave minshaft alone.
+
+linewidths and edgecolors can be used to customize the arrow outlines. Additional :class:`~matplotlib.collections.PolyCollection` keyword arguments:
+
+agg_filter: unknown alpha: float or None animated: [True | False] antialiased or antialiaseds: Boolean or sequence of booleans array: unknown axes: an :class:`~matplotlib.axes.Axes` instance clim: a length 2 sequence of floats clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] cmap: a colormap or registered co [...]
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="headaxislength" name="headaxislength" port_type="basic:Float">
+      <docstring>Head length at shaft intersection, default is 4.5</docstring>
+      <defaults>['4.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="C" arg_pos="4" in_args="True" name="C" port_type="basic:List">
+      <docstring>None</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scale" name="scale">
+      <docstring>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.  The arrow length unit is given by the scale_units parameter</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="width" name="width" port_type="basic:List">
+      <docstring>Shaft width in arrow units; default depends on choice of units, above, and number of vectors; a typical starting value is about 0.005 times the width of the plot.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="headlength" name="headlength" port_type="basic:Float">
+      <docstring>Head length as multiple of shaft width, default is 5</docstring>
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="minlength" name="minlength" port_type="basic:Float">
+      <docstring>Minimum length as a multiple of shaft width; if an arrow length is less than this, plot a dot (hexagon) of this diameter instead. Default is 1.</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="minshaft" name="minshaft" port_type="basic:Float">
+      <docstring>Length below which arrow scales, in units of head length. Do not set this to less than 1, or small arrows will look terrible! Default is 1</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pivot" name="pivot" port_type="basic:String">
+      <docstring>The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['tail', 'middle', 'tip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="units" name="unitsSequence" port_type="basic:List">
+      <docstring>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".</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['width', 'height', 'dots', 'inches', 'x', 'y', 'xy']]</values>
+      <alternateSpec arg="units" name="unitsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="headwidth" name="headwidth" port_type="basic:Float">
+      <docstring>Head width as multiple of shaft width, default is 3</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="U" arg_pos="2" in_args="True" name="U" port_type="basic:List" required="True">
+      <docstring>None</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="angles" name="angles" port_type="basic:String">
+      <docstring>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 CCW from the x-axis. With 'xy', the arrow points from (x,y) to (x+u, y+v). Alternatively, arbitrary angles may be specified as an array of values in degrees, CCW from the x-axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['uv', 'xy', 'array']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="V" arg_pos="3" in_args="True" name="V" port_type="basic:List" required="True">
+      <docstring>None</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List">
+      <docstring>None</docstring>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List">
+      <docstring>None</docstring>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="scale_units" name="scale_units" port_type="basic:List">
+      <docstring>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".</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="colorSequence" port_type="basic:List">
+      <docstring>This is a synonym for the :class:`~matplotlib.collections.PolyCollection` facecolor kwarg. If C has been set, color has no effect.</docstring>
+      <alternateSpec arg="color" name="colorScalar" port_type="basic:String">
+	<translations>translate_color</translations>
+      </alternateSpec>
+    </inputPortSpec>
+    <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="0" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.quiverkey" name="MplQuiverkey" superclass="MplPlot">
+    <docstring>Add a key to a quiver plot.
+
+Call signature:
+
+quiverkey(Q, X, Y, U, label, **kw)
+
+Arguments:
+
+
+
+Keyword arguments:
+
+
+
+Any additional keyword arguments are used to override vector properties taken from Q.
+
+The positioning of the key depends on X, Y, coordinates, and labelpos.  If labelpos is 'N' or 'S', X, Y give the position of the middle of the key arrow.  If labelpos is 'E', X, Y positions the head, and if labelpos is 'W', X, Y positions the tail; in either of these two cases, X, Y is somewhere in the middle of the arrow+label key object.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>overrides face and edge colors from Q.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="coordinates" name="coordinatesSequence" port_type="basic:List">
+      <docstring>Coordinate system and units for X, Y: 'axes' and 'figure' are normalized coordinate systems with 0,0 in the lower left and 1,1 in the upper right; 'data' are the axes data coordinates (used for the locations of the vectors in the quiver plot itself); 'inches' is position in the figure in inches, with 0,0 at the lower left corner.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['axes', 'figure', 'data', 'inches']]</values>
+      <alternateSpec arg="coordinates" name="coordinatesScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="4" name="label" port_type="basic:String" required="True">
+      <docstring>A string with the length and units of the key</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Q" arg_pos="0" name="Q" required="True">
+      <docstring>The Quiver instance returned by a call to quiver.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelcolor" name="labelcolor" port_type="basic:Color">
+      <docstring>defaults to default :class:`~matplotlib.text.Text` color.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="fontproperties" name="fontproperties">
+      <docstring>A dictionary with keyword arguments accepted by the :class:`~matplotlib.font_manager.FontProperties` initializer: family, style, variant, size, weight</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="U" arg_pos="3" name="U" required="True">
+      <docstring>The length of the key</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelpos" name="labelpos" port_type="basic:String">
+      <docstring>Position the label above, below, to the right, to the left of the arrow, respectively.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['N', 'S', 'E', 'W']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" arg_pos="2" name="Y" required="True">
+      <docstring>The location of the key; additional explanation follows.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="X" arg_pos="1" name="X" required="True">
+      <docstring>The location of the key; additional explanation follows.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsep" name="labelsep" port_type="basic:Float">
+      <docstring>Distance in inches between the arrow and the label.  Default is 0.1</docstring>
+      <defaults>['0.1']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.scatter" name="MplScatter" output_type="object" superclass="MplPlot">
+    <docstring>Make a scatter plot.
+
+Call signatures:
+
+scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,         vmin=None, vmax=None, alpha=None, linewidths=None,         verts=None, **kwargs)
+
+Make a scatter plot of x versus y, where x, y are converted to 1-D sequences which must be of the same length, N.
+
+Keyword arguments:
+
+
+
+Any or all of x, y, s, and c may be masked arrays, in which case all masks will be combined and only unmasked points will be plotted.
+
+Other keyword arguments: the color mapping and normalization arguments will be used only if c is an array of floats.
+
+
+
+Optional kwargs control the :class:`~matplotlib.collections.Collection` properties; in particular:
+
+
+
+Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs:
+
+%(Collection)s
+
+A :class:`~matplotlib.collections.Collection` instance is returned.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="vmax" arg_pos="8" name="vmax">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="edgecolors" name="edgecolors" port_type="basic:String">
+      <docstring>The string 'none' to plot faces with no outlines</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="c" arg_pos="3" name="cSequence" port_type="basic:List">
+      <docstring>a color. c can be a single color format string, or a sequence of color specifications of length N, or a sequence of N numbers to be mapped to colors using the cmap and norm specified via kwargs (see below). Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped.  c can be a 2-D array in which the rows are RGB or RGBA, however.</docstring>
+      <defaults>['b']</defaults>
+      <alternateSpec arg="c" name="cScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" arg_pos="7" name="vmin">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="faceted" arg_pos="11" name="faceted" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" arg_pos="10" name="linewidths">
+      <docstring>If None, defaults to (lines.linewidth,).  Note that this is a tuple, and if you set the linewidths argument you must set it as a sequence of floats, as required by :class:`~matplotlib.collections.RegularPolyCollection`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="marker" arg_pos="4" name="marker" port_type="basic:String">
+      <docstring>can be one of:
+
+%(MarkerTable)s</docstring>
+      <defaults>['o']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="s" arg_pos="2" name="s" port_type="basic:Float">
+      <docstring>size in points^2.  It is a scalar or an array of the same length as x and y.</docstring>
+      <defaults>['20']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="5" name="cmap">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance or registered name. If None, defaults to rc image.cmap. cmap is only used if c is an array of floats.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="verts" arg_pos="12" name="verts" />
+    <inputPortSpec arg="alpha" arg_pos="9" name="alpha" port_type="basic:Float">
+      <docstring>The alpha value for the patches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="13" name="hold" />
+    <inputPortSpec arg="facecolors" name="facecolors" port_type="basic:String">
+      <docstring>The string 'none' to plot unfilled outlines</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="6" name="norm">
+      <docstring>A :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0, 1. If None, use the default :func:`normalize`. norm is only used if c is an array of floats.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <outputPortSpec arg="pathCollection" compute_name="pathCollection" name="pathCollectionProperties" port_type="__property__" property_key="0" property_type="matplotlib.collections.PathCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.semilogx" name="MplSemilogx" output_type="object" superclass="MplPlot">
+    <docstring>Make a plot with log scaling on the x axis.
+
+Call signature:
+
+semilogx(*args, **kwargs)
+
+:func:`semilogx` supports all the keyword arguments of :func:`~matplotlib.pyplot.plot` and :meth:`matplotlib.axes.Axes.set_xscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="basex" name="basex" port_type="basic:Float">
+      <docstring>Base of the x logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nonposx" name="nonposx" port_type="basic:String">
+      <docstring>Non-positive values in x can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="subsx" name="subsxSequence" port_type="basic:List">
+      <docstring>The location of the minor xticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_xscale` for details.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="subsx" name="subsxScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.semilogy" name="MplSemilogy" output_type="object" superclass="MplPlot">
+    <docstring>Make a plot with log scaling on the y axis.
+
+call signature:
+
+semilogy(*args, **kwargs)
+
+:func:`semilogy` supports all the keyword arguments of :func:`~matplotlib.pylab.plot` and :meth:`matplotlib.axes.Axes.set_yscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="basey" name="basey" port_type="basic:Float">
+      <docstring>Base of the y logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nonposy" name="nonposy" port_type="basic:String">
+      <docstring>Non-positive values in y can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="subsy" name="subsySequence" port_type="basic:List">
+      <docstring>The location of the minor yticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_yscale` for details.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="subsy" name="subsyScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.specgram" name="MplSpecgram" superclass="MplPlot">
+    <docstring>Plot a spectrogram.
+
+Call signature:
+
+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, **kwargs)
+
+Compute a spectrogram of data in x.  Data are split into NFFT length segments and the PSD of each section is computed.  The windowing function window is applied to each segment, and the amount of overlap of each segment is specified with noverlap.
+
+%(PSD)s
+
+kwargs:
+
+Additional kwargs are passed on to imshow which makes the specgram image
+
+Return value is (Pxx, freqs, bins, im):
+
+bins are the time points the spectrogram is calculated over
+
+freqs is an array of frequencies
+
+Pxx is an array of shape (len(times), len(freqs)) of power
+
+im is a :class:`~matplotlib.image.AxesImage` instance
+
+Note: If x is real (i.e. non-complex), only the positive spectrum is shown.  If x is complex, both positive and negative parts of the spectrum are shown.  This can be overridden using the sides keyword argument.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="2" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="9" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="11" name="scale_by_freq" />
+    <inputPortSpec arg="xextent" arg_pos="8" name="xextent" />
+    <inputPortSpec arg="detrend" arg_pos="4" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="5" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="3" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="1" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="7" name="cmap" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="12" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="10" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="6" name="noverlap" port_type="basic:Integer">
+      <defaults>['128']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.stackplot" name="MplStackplot" superclass="MplPlot">
+    <docstring>Draws a stacked area plot.
+
+x : 1d array of dimension N
+
+Keyword arguments:
+
+Returns r : A list of :class:`~matplotlib.collections.PolyCollection`, one for each element in the stacked area plot.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="x" arg_pos="0" name="x" required="True" />
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>used to colour the stacked areas. All other keyword arguments are passed to :func:`~matplotlib.Axes.fill_between`</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.stem" name="MplStem" output_type="tuple" superclass="MplPlot">
+    <docstring>Create a stem plot.
+
+Call signature:
+
+stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-')
+
+A stem plot plots vertical lines (using linefmt) at each x location from the baseline to y, and places a marker there using markerfmt.  A horizontal line at 0 is is plotted using basefmt.
+
+Return value is a tuple (markerline, stemlines, baseline).
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="bottom" arg_pos="5" name="bottom" />
+    <inputPortSpec arg="label" arg_pos="6" name="label" />
+    <inputPortSpec arg="linefmt" arg_pos="2" name="linefmt" port_type="basic:String">
+      <defaults>['b-']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="markerfmt" arg_pos="3" name="markerfmt" port_type="basic:String">
+      <defaults>['bo']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="7" name="hold" />
+    <inputPortSpec arg="basefmt" arg_pos="4" name="basefmt" port_type="basic:String">
+      <defaults>['r-']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="stemline" compute_name="stemlines" name="stemlineProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.lines.Line2D" />
+    <outputPortSpec arg="markerline" compute_name="markerline" name="markerlineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+    <outputPortSpec arg="baseline" compute_name="baseline" name="baselineProperties" port_type="__property__" property_key="2" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.step" name="MplStep" output_type="object" superclass="MplPlot">
+    <docstring>Make a step plot.
+
+Call signature:
+
+step(x, y, *args, **kwargs)
+
+Additional keyword args to :func:`step` are the same as those for :func:`~matplotlib.pyplot.plot`.
+
+x and y must be 1-D sequences, and it is assumed, but not checked, that x is uniformly increasing.
+
+Keyword arguments:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="where" name="where" port_type="basic:String">
+      <docstring>If 'pre', the interval from x[i] to x[i+1] has level y[i+1]
+
+If 'post', that interval has level y[i]
+
+If 'mid', the jumps in y occur half-way between the x-values.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['pre', 'post', 'mid']]</values>
+    </inputPortSpec>
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.streamplot" name="MplStreamplot" superclass="MplPlot">
+    <docstring>Draws streamlines of a vector flow.
+
+Returns:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="13" name="hold" />
+    <inputPortSpec arg="arrowstyle" arg_pos="10" name="arrowstyle" port_type="basic:String">
+      <defaults>['-|>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="density" arg_pos="4" name="density" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="6" name="color" />
+    <inputPortSpec arg="minlength" arg_pos="11" name="minlength" port_type="basic:Float">
+      <defaults>['0.1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" arg_pos="12" name="transform" />
+    <inputPortSpec arg="arrowsize" arg_pos="9" name="arrowsize" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="7" name="cmap" />
+    <inputPortSpec arg="u" arg_pos="2" name="u" required="True" />
+    <inputPortSpec arg="v" arg_pos="3" name="v" required="True" />
+    <inputPortSpec arg="y" arg_pos="1" name="y" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" required="True" />
+    <inputPortSpec arg="linewidth" arg_pos="5" name="linewidth" />
+    <inputPortSpec arg="norm" arg_pos="8" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.tricontour" name="MplTricontour" superclass="MplPlot">
+    <docstring>Draw contours on an unstructured triangular grid. :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and filled contours, respectively.  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=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:
+
+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.
+
+tricontour-only keyword arguments:
+
+
+
+tricontourf-only keyword arguments:
+
+
+
+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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="levels" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>enable antialiasing</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.tricontourf" name="MplTricontourf" superclass="MplPlot">
+    <docstring>Draw contours on an unstructured triangular grid. :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and filled contours, respectively.  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=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:
+
+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.
+
+tricontour-only keyword arguments:
+
+
+
+tricontourf-only keyword arguments:
+
+
+
+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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="levels" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>enable antialiasing</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.tripcolor" name="MplTripcolor" superclass="MplPlot">
+    <docstring>Create a pseudocolor plot of an unstructured triangular grid.
+
+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=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, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg facecolors*=C instead of just *C.
+
+shading may be 'flat' (the default) or 'gouraud'. If shading is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If shading is 'gouraud' then color values must be defined at points.  shading of 'faceted' is deprecated; please use edgecolors instead.
+
+The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`.
+
+Example:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.triplot" name="MplTriplot" superclass="MplPlot">
+    <docstring>Draw a unstructured triangular grid as lines and/or markers.
+
+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=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:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.vlines" name="MplVlines" superclass="MplPlot">
+    <docstring>Plot vertical lines.
+
+Call signature:
+
+vlines(x, ymin, ymax, color='k', linestyles='solid')
+
+Plot vertical lines at each x from ymin to ymax.  ymin or ymax can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the heights of the lines are determined by ymin and ymax.
+
+linestyles : [ 'solid' | 'dashed' | 'dashdot' | 'dotted' ]
+
+Returns the :class:`matplotlib.collections.LineCollection` that was added.
+
+kwargs are :class:`~matplotlib.collections.LineCollection` properties:
+
+%(LineCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+    <inputPortSpec arg="ymax" arg_pos="2" name="ymax" required="True" />
+    <inputPortSpec arg="linestyles" arg_pos="4" name="linestyles" port_type="basic:String">
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="3" name="color" port_type="basic:String">
+      <defaults>['k']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="5" name="label" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" arg_pos="3" name="colors" port_type="basic:String">
+      <defaults>['k']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="ymin" arg_pos="1" name="ymin" required="True" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.xcorr" name="MplXcorr" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot the cross correlation between x and y.
+
+Call signature:
+
+xcorr(self, x, y, normed=True, detrend=mlab.detrend_none,   usevlines=True, maxlags=10, **kwargs)
+
+If normed = True, normalize the data by the cross correlation at 0-th lag.  x and y are detrended by the detrend callable (default no normalization).  x and y must be equal length.
+
+Data are plotted as plot(lags, c, **kwargs)
+
+Return value is a tuple (lags, c, line) where:
+
+lags are a length 2*maxlags+1 lag vector
+
+c is the 2*maxlags+1 auto correlation vector
+
+The default linestyle is None and the default marker is 'o', though these can be overridden with keyword args.  The cross correlation is performed with :func:`numpy.correlate` with mode = 2.
+
+If usevlines is True:
+
+:func:`~matplotlib.pyplot.vlines` rather than :func:`~matplotlib.pyplot.plot` is used to draw vertical lines from the origin to the xcorr.  Otherwise the plotstyle is determined by the kwargs, which are :class:`~matplotlib.lines.Line2D` properties.
+
+The return value is a tuple (lags, c, linecol, b) where linecol is the :class:`matplotlib.collections.LineCollection` instance and b is the x-axis.
+
+maxlags is a positive integer detailing the number of lags to show. The default value of None will return all (2*len(x)-1) lags.
+
+Example:
+
+:func:`~matplotlib.pyplot.xcorr` is top graph, and :func:`~matplotlib.pyplot.acorr` is bottom graph.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="normed" arg_pos="2" name="normed" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="usevlines" arg_pos="4" name="usevlines" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="detrend" arg_pos="3" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="maxlags" arg_pos="5" name="maxlags" port_type="basic:Integer">
+      <defaults>['10']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+    <outputPortSpec arg="lineCollection" compute_name="lineCollection" name="lineCollectionProperties" port_type="__property__" property_key="4" property_type="matplotlib.collections.LineCollection" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.lines.Line2D" />
+    <outputPortSpec arg="xaxis" compute_name="xaxis" name="xaxisProperties" port_type="__property__" property_key="3" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.barbs" name="MplBarbs" output_type="object" superclass="MplPlot">
+    <docstring>Plot a 2-D field of barbs.
+
+Call signatures:
+
+barb(U, V, **kw) barb(U, V, C, **kw) barb(X, Y, U, V, **kw) barb(X, Y, U, V, C, **kw)
+
+Arguments:
+
+
+
+All arguments may be 1-D or 2-D arrays or sequences. If X and Y are absent, they will be generated as a uniform grid.  If U and V are 2-D arrays but X and Y are 1-D, and if len(X) and len(Y) match the column and row dimensions of U, then X and Y will be expanded with :func:`numpy.meshgrid`.
+
+U, V, C may be masked arrays, but masked X, Y are not supported at present.
+
+Keyword arguments:
+
+
+
+Barbs are traditionally used in meteorology as a way to plot the speed and direction of wind observations, but can technically be used to plot any two dimensional vector quantity.  As opposed to arrows, which give vector magnitude by the length of the arrow, the barbs give more quantitative information about the vector magnitude by putting slanted lines or a triangle for various increments in magnitude, as show schematically below:
+
+:     /\    \ :    /  \    \ :   /    \    \    \ :  /      \    \    \ : ------------------------------
+
+note the double \ at the end of each line to make the figure
+
+render correctly
+
+The largest increment is given by a triangle (or "flag"). After those come full lines (barbs). The smallest increment is a half line.  There is only, of course, ever at most 1 half line.  If the magnitude is small and only needs a single half-line and no full lines or triangles, the half-line is offset from the end of the barb so that it can be easily distinguished from barbs with a single full line.  The magnitude for the barb shown above would nominally be 65, using the standard increm [...]
+
+linewidths and edgecolors can be used to customize the barb. Additional :class:`~matplotlib.collections.PolyCollection` keyword arguments:
+
+agg_filter: unknown alpha: float or None animated: [True | False] antialiased or antialiaseds: Boolean or sequence of booleans array: unknown axes: an :class:`~matplotlib.axes.Axes` instance clim: a length 2 sequence of floats clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] cmap: a colormap or registered co [...]
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="barbcolor" name="barbcolor" port_type="basic:Color">
+      <docstring>Specifies the color all parts of the barb except any flags.  This parameter is analagous to the edgecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>None</entry_types>
+      <values>None</values>
+      <alternateSpec arg="barbcolor" name="barbcolorSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="C" arg_pos="4" in_args="True" name="C" port_type="basic:List">
+      <docstring>An optional array used to map colors to the barbs</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" name="sizes" port_type="basic:Dictionary">
+      <docstring>A dictionary of coefficients specifying the ratio of a given feature to the length of the barb. Only those values one wishes to override need to be included.  These features include:
+
+'spacing' - space between features (flags, full/half barbs)
+
+'height' - height (distance from shaft to top) of a flag or full barb
+
+'width' - width of a flag, twice the width of a full barb
+
+'emptybarb' - radius of the circle used for low magnitudes</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rounding" name="rounding" port_type="basic:Boolean">
+      <docstring>A flag to indicate whether the vector magnitude should be rounded when allocating barb components.  If True, the magnitude is rounded to the nearest multiple of the half-barb increment.  If False, the magnitude is simply truncated to the next lowest multiple.  Default is True</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pivot" name="pivot" port_type="basic:String">
+      <docstring>The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot.  Default is 'tip'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['tip', 'middle']]</values>
+      <defaults>['tip']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="flip_barb" name="flip_barb" port_type="basic:Boolean">
+      <docstring>Either a single boolean flag or an array of booleans.  Single boolean indicates whether the lines and flags should point opposite to normal for all barbs.  An array (which should be the same size as the other data arrays) indicates whether to flip for each individual barb.  Normal behavior is for the barbs and lines to point right (comes from wind barbs having these features point towards low pressure in the Northern Hemisphere.)  Default is False</docstring>
+      <defaults>['False']</defaults>
+      <alternateSpec arg="flip_barb" name="flip_barbSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="length" name="length" port_type="basic:Integer">
+      <docstring>Length of the barb in points; the other parts of the barb are scaled against this. Default is 9</docstring>
+      <defaults>['9']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="barb_increments" name="barb_increments" port_type="basic:Dictionary">
+      <docstring>A dictionary of increments specifying values to associate with different parts of the barb. Only those values one wishes to override need to be included.
+
+'half' - half barbs (Default is 5)
+
+'full' - full barbs (Default is 10)
+
+'flag' - flags (default is 50)</docstring>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="U" arg_pos="2" in_args="True" name="U" port_type="basic:List" required="True">
+      <docstring>Give the x and y components of the barb shaft</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="V" arg_pos="3" in_args="True" name="V" port_type="basic:List" required="True">
+      <docstring>Give the x and y components of the barb shaft</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List">
+      <docstring>The x and y coordinates of the barb locations (default is head of barb; see pivot kwarg)</docstring>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List">
+      <docstring>The x and y coordinates of the barb locations (default is head of barb; see pivot kwarg)</docstring>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="flagcolor" name="flagcolor" port_type="basic:Color">
+      <docstring>Specifies the color of any flags on the barb.  This parameter is analagous to the facecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.  If this is not set (and C has not either) then flagcolor will be set to match barbcolor so that the barb has a uniform color. If C has been set, flagcolor has no effect.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>None</entry_types>
+      <values>None</values>
+      <alternateSpec arg="flagcolor" name="flagcolorSequence" port_type="basic:List" />
+    </inputPortSpec>
+    <inputPortSpec arg="fill_empty" name="fill_empty" port_type="basic:Boolean">
+      <docstring>A flag on whether the empty barbs (circles) that are drawn should be filled with the flag color.  If they are not filled, they will be drawn such that no color is applied to the center.  Default is False</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.PolyCollection" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.spy" name="MplSpy" output_type="tuple" superclass="MplPlot">
+    <docstring>Plot the sparsity pattern on a 2-D array.
+
+Call signature:
+
+spy(Z, precision=0, marker=None, markersize=None,     aspect='equal', **kwargs)
+
+spy(Z) plots the sparsity pattern of the 2-D array Z.
+
+If precision is 0, any non-zero value will be plotted; else, values of |Z| > precision will be plotted.
+
+For :class:`scipy.sparse.spmatrix` instances, there is a special case: if precision is 'present', any value present in the array will be plotted, even if it is identically zero.
+
+The array will be plotted as it would be printed, with the first index (row) increasing down and the second index (column) increasing to the right.
+
+By default aspect is 'equal', so that each array element occupies a square space; set the aspect kwarg to 'auto' to allow the plot to fill the plot box, or to any scalar number to specify the aspect ratio of an array element directly.
+
+Two plotting styles are available: image or marker. Both are available for full arrays, but only the marker style works for :class:`scipy.sparse.spmatrix` instances.
+
+If marker and markersize are None, an image will be returned and any remaining kwargs are passed to :func:`~matplotlib.pyplot.imshow`; else, a :class:`~matplotlib.lines.Line2D` object will be returned with the value of marker determining the marker type, and any remaining kwargs passed to the :meth:`~matplotlib.axes.Axes.plot` method.
+
+If marker and markersize are None, useful kwargs include:
+
+cmap
+
+alpha
+
+For controlling colors, e.g. cyan background and red marks, use:
+
+cmap = mcolors.ListedColormap(['c','r'])
+
+If marker or markersize is not None, useful kwargs include:
+
+marker
+
+markersize
+
+color
+
+Useful values for marker include:
+
+'s'  square (default)
+
+'o'  circle
+
+'.'  point
+
+','  pixel
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="5" name="hold" />
+    <inputPortSpec arg="markersize" arg_pos="3" name="markersize" />
+    <inputPortSpec arg="precision" arg_pos="1" name="precision" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="aspect" arg_pos="4" name="aspect" port_type="basic:String">
+      <defaults>['equal']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="marker" arg_pos="2" name="marker" />
+    <inputPortSpec arg="Z" arg_pos="0" name="Z" port_type="basic:List" required="True" />
+    <outputPortSpec arg="image" compute_name="image" name="imageProperties" port_type="__property__" property_key="0" property_type="matplotlib.image.AxesImage" />
+    <outputPortSpec arg="marks" compute_name="marks" name="marksProperties" port_type="__property__" property_key="1" property_type="matplotlib.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.polar" name="MplPolar" output_type="object" superclass="MplPlot">
+    <docstring>Make a polar plot.
+
+call signature:
+
+polar(theta, r, **kwargs)
+
+Multiple theta, r arguments are supported, with format strings, as in :func:`~matplotlib.pyplot.plot`.</docstring>
+    <inputPortSpec arg="theta" arg_pos="0" in_args="True" name="theta" port_type="basic:List" required="True" />
+    <inputPortSpec arg="r" arg_pos="1" in_args="True" name="r" port_type="basic:List" required="True" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.legend" name="MplLegend" superclass="MplPlot">
+    <docstring>Place a legend on the current axes.
+
+Call signature:
+
+legend(*args, **kwargs)
+
+Places legend at location loc.  Labels are a sequence of strings and loc can be a string or an integer specifying the legend location.
+
+To make a legend with existing lines:
+
+legend()
+
+:meth:`legend` by itself will try and build a legend using the label property of the lines/patches/collections.  You can set the label of a line by doing:
+
+plot(x, y, label='my data')
+
+or:
+
+line.set_label('my data').
+
+If label is set to '_nolegend_', the item will not be shown in legend.
+
+To automatically generate the legend from labels:
+
+legend( ('label1', 'label2', 'label3') )
+
+To make a legend for a list of lines and labels:
+
+legend( (line1, line2, line3), ('label1', 'label2', 'label3') )
+
+To make a legend at a given location, using a location argument:
+
+legend( ('label1', 'label2', 'label3'), loc='upper left')
+
+or:
+
+legend( (line1, line2, line3),  ('label1', 'label2', 'label3'), loc=2)
+
+The location codes are
+
+
+
+Users can specify any arbitrary location for the legend using the bbox_to_anchor keyword argument. bbox_to_anchor can be an instance of BboxBase(or its derivatives) or a tuple of 2 or 4 floats. For example,
+
+loc = 'upper right', bbox_to_anchor = (0.5, 0.5)
+
+will place the legend so that the upper right corner of the legend at the center of the axes.
+
+The legend location can be specified in other coordinate, by using the bbox_transform keyword.
+
+The loc itslef can be a 2-tuple giving x,y of the lower-left corner of the legend in axes coords (bbox_to_anchor is ignored).
+
+Keyword arguments:
+
+fontsize: [ size in points | 'xx-small' | 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'xx-large' ]
+
+Set the font size.  May be either a size string, relative to the default font size, or an absolute font size in points. This argument is only used if prop is not specified.
+
+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.
+
+Not all kinds of artist are supported by the legend command. See LINK (FIXME) for details.
+
+Example:</docstring>
+    <inputPortSpec arg="loc" name="loc">
+      <translations>{'right': 5, 'center left': 6, 'upper right': 1, 'lower right': 4, 'best': 0, 'center': 10, 'lower left': 3, 'center right': 7, 'upper left': 2, 'upper center': 9, 'lower center': 8}</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fancybox" name="fancybox">
+      <docstring>if True, draw a frame with a round fancybox.  If None, use rc settings</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_to_anchor" name="bbox_to_anchor">
+      <docstring>the bbox that the legend will be anchored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="title" name="title">
+      <docstring>the legend title</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="handlelength" name="handlelength">
+      <docstring>the length of the legend handles</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="markerscale" name="markerscale">
+      <docstring>The relative size of legend markers vs. original. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="numpoints" name="numpoints" port_type="basic:Integer">
+      <docstring>The number of points in the legend for line</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelspacing" name="labelspacing">
+      <docstring>the vertical space between the legend entries</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scatterpoints" name="scatterpoints" port_type="basic:Integer">
+      <docstring>The number of points in the legend for scatter plot</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="frameon" name="frameon" port_type="basic:Boolean">
+      <docstring>if True, draw a frame around the legend. The default is set by the rcParam 'legend.frameon'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="columnspacing" name="columnspacing">
+      <docstring>the spacing between columns</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="handletextpad" name="handletextpad">
+      <docstring>the pad between the legend handle and text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scatteroffsets" name="scatteroffsetsSequence" port_type="basic:List">
+      <docstring>a list of yoffsets for scatter symbols in legend</docstring>
+      <alternateSpec arg="scatteroffsets" name="scatteroffsetsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="mode" name="mode">
+      <docstring>if mode is "expand", the legend will be horizontally expanded to fill the axes area (or bbox_to_anchor)</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ncol" name="ncol" port_type="basic:Integer">
+      <docstring>number of columns. default is 1</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shadow" name="shadow">
+      <docstring>If True, draw a shadow behind legend. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="prop" name="prop" port_type="basic:String">
+      <docstring>A :class:`matplotlib.font_manager.FontProperties` instance. If prop is a dictionary, a new instance will be created with prop. If None, use rc settings.</docstring>
+      <entry_types>None</entry_types>
+      <values>None</values>
+    </inputPortSpec>
+    <inputPortSpec arg="borderpad" name="borderpad">
+      <docstring>the fractional whitespace inside the legend border</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_transform" name="bbox_transform">
+      <docstring>the transform for the bbox. transAxes if None.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="borderaxespad" name="borderaxespad">
+      <docstring>the pad between the axes and legend border</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.annotate" name="MplAnnotate" output_type="object" superclass="MplPlot">
+    <docstring>Create an annotation: a piece of text referring to a data point.
+
+Call signature:
+
+annotate(s, xy, xytext=None, xycoords='data',          textcoords='data', arrowprops=None, **kwargs)
+
+Keyword arguments:
+
+Annotate the x, y point xy with text s at x, y location xytext.  (If xytext = None, defaults to xy, and if textcoords = None, defaults to xycoords).
+
+arrowprops, if not None, is a dictionary of line properties (see :class:`matplotlib.lines.Line2D`) for the arrow that connects annotation to the point.
+
+If the dictionary has a key arrowstyle, a FancyArrowPatch instance is created with the given dictionary and is drawn. Otherwise, a YAArow patch instance is created and drawn. Valid keys for YAArow are
+
+Valid keys for FancyArrowPatch are
+
+xycoords and textcoords are strings that indicate the coordinates of xy and xytext.
+
+If a 'points' or 'pixels' option is specified, values will be added to the bottom-left and if negative, values will be subtracted from the top-right.  Eg:
+
+# 10 points to the right of the left border of the axes and # 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 annotation will only be drawn when the xy is inside the axes. If False, the annotation will always be drawn regardless of its position.  The default is None, which behave as True only if xycoords is"data".
+
+Additional kwargs are Text properties:
+
+%(Text)s</docstring>
+    <inputPortSpec arg="xycoords" arg_pos="3" name="xycoords" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xytext" arg_pos="2" name="xytext" port_type="basic:Float, basic:Float" />
+    <inputPortSpec arg="s" arg_pos="0" name="s" port_type="basic:String" required="True" />
+    <inputPortSpec arg="xy" arg_pos="1" name="xy" port_type="basic:Float, basic:Float" required="True" />
+    <inputPortSpec arg="textcoords" arg_pos="4" name="textcoords" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+      <defaults>None</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="arrow_patch" in_kwargs="False" name="fancyArrowProperties" port_type="MplFancyArrowPatchProperties" />
+    <inputPortSpec arg="arrow" in_kwargs="False" name="arrowProperties" port_type="MplYAArrowProperties" />
+    <outputPortSpec arg="annotation" compute_name="annotation" name="annotationProperties" port_type="__property__" property_key="0" property_type="matplotlib.text.Annotation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.plot" name="MplLinePlot" output_type="object" superclass="MplPlot">
+    <docstring>Plot lines and/or markers to the :class:`~matplotlib.axes.Axes`.  args is a variable length argument, allowing for multiple x, y pairs with an optional format string.  For example, each of the following is legal:
+
+plot(x, y)         # plot x and y using default line style and color plot(x, y, 'bo')   # plot x and y using blue circle markers plot(y)            # plot y using x as index array 0..N-1 plot(y, 'r+')      # ditto, but with red plusses
+
+If x and/or y is 2-dimensional, then the corresponding columns will be plotted.
+
+An arbitrary number of x, y, fmt groups can be specified, as in:
+
+a.plot(x1, y1, 'g^', x2, y2, 'g-')
+
+Return value is a list of lines that were added.
+
+By default, each line is assigned a different color specified by a 'color cycle'.  To change this behavior, you can edit the axes.color_cycle rcParam. Alternatively, you can use :meth:`~matplotlib.axes.Axes.set_default_color_cycle`.
+
+The following format string characters are accepted to control the line style or marker:
+
+The following color abbreviations are supported:
+
+In addition, you can specify colors in many weird and wonderful ways, including full names ('green'), hex strings ('#008000'), RGB or RGBA tuples ((0,1,0,1)) or grayscale intensities as a string ('0.8').  Of these, the string specifications can be used in place of a fmt group, but the tuple forms can be used only as kwargs.
+
+Line styles and colors are combined in a single format string, as in 'bo' for blue circles.
+
+The kwargs can be used to set line properties (any property that has a set_* method).  You can use this to set a line label (for auto legends), linewidth, anitialising, marker face color, etc.  Here is an example:
+
+plot([1,2,3], [1,2,3], 'go-', label='line 1', linewidth=2) plot([1,2,3], [1,4,9], 'rs',  label='line 2') axis([0, 4, 0, 10]) legend()
+
+If you make multiple lines with one plot command, the kwargs apply to all those lines, e.g.:
+
+plot(x1, y1, x2, y2, antialised=False)
+
+Neither line will be antialiased.
+
+You do not need to use format strings, which are just abbreviations.  All of the line properties can be controlled by keyword arguments.  For example, you can set the color, marker, linestyle, and markercolor with:
+
+plot(x, y, color='green', linestyle='dashed', marker='o',      markerfacecolor='blue', markersize=12).
+
+See :class:`~matplotlib.lines.Line2D` for details.
+
+The kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+kwargs scalex and scaley, if defined, are passed on to :meth:`~matplotlib.axes.Axes.autoscale_view` to determine whether the x and y axes are autoscaled; the default is True.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="marker" name="marker">
+      <translations>{'tri_down marker': '1', 'pentagon marker': 'p', 'hline marker': '_', 'pixel marker': ',', 'triangle_up marker': '^', 'point marker': '.', 'square marker': 's', 'hexagon2 marker': 'H', 'tri_right marker': '4', 'plus marker': '+', 'vline marker': '|', 'triangle_left marker': '<', 'triangle_down marker': 'v', 'triangle_right marker': '>', 'tri_left marker': '3', 'x marker': 'x', 'circle marker': 'o', 'dashed line style': '--', 'hexagon1 marker': 'h', 'dash-dot lin [...]
+      <entry_types>['enum']</entry_types>
+      <values>[['solid line style', 'dashed line style', 'dash-dot line style', 'dotted line style', 'point marker', 'pixel marker', 'circle marker', 'triangle_down marker', 'triangle_up marker', 'triangle_left marker', 'triangle_right marker', 'tri_down marker', 'tri_up marker', 'tri_left marker', 'tri_right marker', 'square marker', 'pentagon marker', 'star marker', 'hexagon1 marker', 'hexagon2 marker', 'plus marker', 'x marker', 'diamond marker', 'thin_diamond marker', 'vline marker', [...]
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" />
+    <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+  </moduleSpec>
+</specs>
diff --git a/vistrails/packages/matplotlib/mpl_plots_diff.xml b/vistrails/packages/matplotlib/mpl_plots_diff.xml
new file mode 100644
index 0000000..feaef5e
--- /dev/null
+++ b/vistrails/packages/matplotlib/mpl_plots_diff.xml
@@ -0,0 +1,1113 @@
+<diff>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.hexbin">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.hexbin" port="C" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.hexbin" port="gridsize" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.hexbin" port="gridsize" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.hexbin" port="y" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.hexbin" port="bins" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.hexbin" port="bins" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.hexbin" port="bins" type="input">
+    <value>basic:Integer</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.hexbin" port="x" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.hexbin" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="-1" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.clabel">
+    <value>object</value>
+  </changeModule>
+  <deletePortSpec code_ref="matplotlib.pyplot.clabel" port="CS" type="input" />
+  <addPortSpec code_ref="matplotlib.pyplot.clabel" port="v" type="input">
+    <value>
+      <inputPortSpec arg="v" arg_pos="1" in_args="True" name="v" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.clabel" port="cs" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.clabel" port="cs" type="input">
+    <value>MplContourSet</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.clabel" port="text" type="output">
+    <value>
+      <outputPortSpec arg="text" compute_name="texts" name="textProperties" plural="True" port_type="__property__" property_key="__none__" property_type="matplotlib.text.Text" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.cohere" port="line" type="input">
+    <value>
+      <inputPortSpec arg="line" constructor_arg="True" name="lineProperties" port_type="__property__" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.fill_betweenx">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_betweenx" port="y" type="input">
+    <value>An N-length array of the y data</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.fill_betweenx" port="y" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_betweenx" port="x2" type="input">
+    <value>A scalar x-value</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.fill_betweenx" port="x2" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec altName="x2Sequence" code_ref="matplotlib.pyplot.fill_betweenx" port="x2" type="alternate">
+    <value>
+      <alternateSpec arg="x2" name="x2Sequence" port_type="basic:List">
+        <docstring>An N-length array of the x data</docstring>
+      </alternateSpec>
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_betweenx" port="x1" type="input">
+    <value>An N-length array of the x data</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.fill_betweenx" port="x1" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.fill_betweenx" port="x1" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="x1Scalar" code_ref="matplotlib.pyplot.fill_betweenx" port="x1" type="alternate">
+    <value>
+      <alternateSpec arg="x1" name="x1Scalar" port_type="basic:Float">
+        <docstring>A scalar x-value</docstring>
+      </alternateSpec>
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_betweenx" port="where" type="input">
+    <value>An N-length boolean array that specifies where the fill is effective</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.fill_betweenx" port="where" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.fill_betweenx" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.axhspan">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhspan" port="xmin" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhspan" port="ymin" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhspan" port="ymax" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhspan" port="xmax" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.axhspan" port="patch" type="output">
+    <value>
+      <outputPortSpec arg="patch" compute_name="patch" name="patchProperties" port_type="__property__" property_key="-1" property_type="matplotlib.patches.Polygon" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.xcorr">
+    <value>tuple</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.xcorr" port="lineCollection" type="output">
+    <value>
+      <outputPortSpec arg="lineCollection" compute_name="lineCollection" name="lineCollectionProperties" port_type="__property__" property_key="4" property_type="matplotlib.collections.LineCollection" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.xcorr" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.xcorr" port="xaxis" type="output">
+    <value>
+      <outputPortSpec arg="xaxis" compute_name="xaxis" name="xaxisProperties" port_type="__property__" property_key="3" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.axhline">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhline" port="y" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhline" port="xmin" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axhline" port="xmax" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.axhline" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="line" name="lineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.arrow" port="dx" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.arrow" port="arrow" type="input">
+    <value>
+      <inputPortSpec arg="arrow" constructor_arg="True" name="arrowProperties" port_type="__property__" property_type="matplotlib.patches.FancyArrow" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.arrow" port="dy" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.arrow" port="y" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.arrow" port="x" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.pcolor">
+    <value>object</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.pcolor" port="Y" type="input">
+    <value>
+      <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.pcolor" port="X" type="input">
+    <value>
+      <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.pcolor" port="Z" type="input">
+    <value>
+      <inputPortSpec arg="Z" arg_pos="2" in_args="True" name="Z" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.pcolor" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="0" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.annotate">
+    <value>object</value>
+  </changeModule>
+  <deletePortSpec code_ref="matplotlib.pyplot.annotate" port="arrowprops" type="input" />
+  <addPortSpec code_ref="matplotlib.pyplot.annotate" port="arrow_patch" type="input">
+    <value>
+      <inputPortSpec arg="arrow_patch" in_kwargs="False" name="fancyArrowProperties" port_type="MplFancyArrowPatchProperties" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.annotate" port="xytext" type="input">
+    <value>basic:Float, basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.annotate" port="xycoords" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.annotate" port="s" type="input">
+    <value>basic:String</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.annotate" port="xy" type="input">
+    <value>basic:Float, basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.annotate" port="textcoords" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.annotate" port="arrow" type="input">
+    <value>
+      <inputPortSpec arg="arrow" in_kwargs="False" name="arrowProperties" port_type="MplYAArrowProperties" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.annotate" port="annotation" type="output">
+    <value>
+      <outputPortSpec arg="annotation" compute_name="annotation" name="annotationProperties" port_type="__property__" property_key="0" property_type="matplotlib.text.Annotation" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.csd" port="line" type="input">
+    <value>
+      <inputPortSpec arg="line" constructor_arg="True" name="lineProperties" port_type="__property__" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.axvline">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvline" port="ymin" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvline" port="x" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvline" port="ymax" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.axvline" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="line" name="lineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.contour">
+    <value>tuple</value>
+  </changeModule>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.contour" port="locator" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.contour" port="locator" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.contour" port="colors" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.contour" port="colors" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.contour" port="cmap" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.contour" port="cmap" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.contour" port="yunits" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.contour" port="yunits" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.contour" port="norm" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.contour" port="norm" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contour" port="V" type="input">
+    <value>
+      <inputPortSpec arg="V" arg_pos="3" in_args="True" name="V" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contour" port="Y" type="input">
+    <value>
+      <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contour" port="X" type="input">
+    <value>
+      <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.contour" port="Z" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.contour" port="Z" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.contour" port="Z" type="input">
+    <value>2</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contour" port="N" type="input">
+    <value>
+      <inputPortSpec arg="N" arg_pos="4" in_args="True" name="N" port_type="basic:Integer" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contour" port="contourSet" type="output">
+    <value>
+      <outputPortSpec arg="contourSet" compute_name="contourSet" name="contourSet" port_type="MplQuadContourSet" property_key="0" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contour" port="lineCollection" type="output">
+    <value>
+      <outputPortSpec arg="lineCollection" compute_name="lineCollections" name="lineCollectionProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.collections.LineCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.barh">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barh" port="bottom" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="bottomScalar" code_ref="matplotlib.pyplot.barh" port="bottom" type="alternate">
+    <value>
+      <alternateSpec arg="bottom" name="bottomScalar" port_type="basic:Float" />
+    </value>
+  </addPortSpec>
+  <addPortSpec altName="heightSequence" code_ref="matplotlib.pyplot.barh" port="height" type="alternate">
+    <value>
+      <alternateSpec arg="height" name="heightSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barh" port="width" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="widthScalar" code_ref="matplotlib.pyplot.barh" port="width" type="alternate">
+    <value>
+      <alternateSpec arg="width" name="widthScalar" port_type="basic:Float" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barh" port="left" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec altName="leftSequence" code_ref="matplotlib.pyplot.barh" port="left" type="alternate">
+    <value>
+      <alternateSpec arg="left" name="leftSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.barh" port="rectangle" type="output">
+    <value>
+      <outputPortSpec arg="rectangle" compute_name="rectangles" name="rectangleProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.Rectangle" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.bar">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.bar" port="bottom" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec altName="bottomSequence" code_ref="matplotlib.pyplot.bar" port="bottom" type="alternate">
+    <value>
+      <alternateSpec arg="bottom" name="bottomSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.bar" port="height" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="heightScalar" code_ref="matplotlib.pyplot.bar" port="height" type="alternate">
+    <value>
+      <alternateSpec arg="height" name="heightScalar" port_type="basic:Float" />
+    </value>
+  </addPortSpec>
+  <addPortSpec altName="widthSequence" code_ref="matplotlib.pyplot.bar" port="width" type="alternate">
+    <value>
+      <alternateSpec arg="width" name="widthSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="required" code_ref="matplotlib.pyplot.bar" port="left" type="input">
+    <value>False</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.bar" port="left" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="leftScalar" code_ref="matplotlib.pyplot.bar" port="left" type="alternate">
+    <value>
+      <alternateSpec arg="left" name="leftScalar" port_type="basic:Float">
+        <docstring>the x coordinate of the left side of the bar</docstring>
+      </alternateSpec>
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.bar" port="rectangle" type="output">
+    <value>
+      <outputPortSpec arg="rectangle" compute_name="rectangles" name="rectangleProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.Rectangle" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.imshow" port="X" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.plot">
+    <value>object</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.plot" port="y" type="input">
+    <value>
+      <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.plot" port="x" type="input">
+    <value>
+      <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.plot" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.stem">
+    <value>tuple</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.stem" port="stemline" type="output">
+    <value>
+      <outputPortSpec arg="stemline" compute_name="stemlines" name="stemlineProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.stem" port="markerline" type="output">
+    <value>
+      <outputPortSpec arg="markerline" compute_name="markerline" name="markerlineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.stem" port="baseline" type="output">
+    <value>
+      <outputPortSpec arg="baseline" compute_name="baseline" name="baselineProperties" port_type="__property__" property_key="2" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.broken_barh" port="yrange" type="input">
+    <value>(ymin, ywidth)</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.broken_barh" port="yrange" type="input">
+    <value>basic:Float,basic:Float</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.broken_barh" port="brokenBarHCollection" type="output">
+    <value>
+      <outputPortSpec arg="brokenBarHCollection" compute_name="brokenBarHCollection" name="brokenBarHCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.BrokenBarHCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.fill_between">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_between" port="y2" type="input">
+    <value>A scalar y-value</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.fill_between" port="y2" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.fill_between" port="y2" type="input">
+    <value>['0.0']</value>
+  </changePortSpec>
+  <addPortSpec altName="y2Sequence" code_ref="matplotlib.pyplot.fill_between" port="y2" type="alternate">
+    <value>
+      <alternateSpec arg="y2" name="y2Sequence" port_type="basic:List">
+        <docstring>An N-length array of the y data</docstring>
+      </alternateSpec>
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_between" port="y1" type="input">
+    <value>An N-length array of the y data</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.fill_between" port="y1" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.fill_between" port="y1" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="y1Scalar" code_ref="matplotlib.pyplot.fill_between" port="y1" type="alternate">
+    <value>
+      <alternateSpec arg="y1" name="y1Scalar" port_type="basic:Float">
+        <docstring>A scalar y-value</docstring>
+      </alternateSpec>
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_between" port="x" type="input">
+    <value>An N-length array of the x data</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.fill_between" port="x" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.fill_between" port="where" type="input">
+    <value>An N-length boolean array that specifies where the fill is effective</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.fill_between" port="where" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.fill_between" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.hlines">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="name" code_ref="matplotlib.pyplot.hlines" port="xmax" type="input">
+    <value>xmaxScalar</value>
+  </changePortSpec>
+  <addPortSpec altName="xmaxSequence" code_ref="matplotlib.pyplot.hlines" port="xmax" type="alternate">
+    <value>
+      <alternateSpec arg="xmax" name="xmaxSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="name" code_ref="matplotlib.pyplot.hlines" port="xmin" type="input">
+    <value>xminScalar</value>
+  </changePortSpec>
+  <addPortSpec altName="xminSequence" code_ref="matplotlib.pyplot.hlines" port="xmin" type="alternate">
+    <value>
+      <alternateSpec arg="xmin" name="xminSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.hlines" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.collections.LineCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.quiver">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.quiver" port="C" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.quiver" port="C" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.quiver" port="C" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.quiver" port="C" type="input">
+    <value>4</value>
+  </changePortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.quiver" port="Y" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.quiver" port="Y" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.quiver" port="Y" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.quiver" port="Y" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.quiver" port="Y" type="input">
+    <value>1</value>
+  </changePortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.quiver" port="X" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.quiver" port="X" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.quiver" port="X" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.quiver" port="X" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.quiver" port="X" type="input">
+    <value>0</value>
+  </changePortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.quiver" port="U" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="required" code_ref="matplotlib.pyplot.quiver" port="U" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.quiver" port="U" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.quiver" port="U" type="input">
+    <value>2</value>
+  </changePortSpec>
+  <changePortSpec attr="docstring" code_ref="matplotlib.pyplot.quiver" port="V" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="required" code_ref="matplotlib.pyplot.quiver" port="V" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.quiver" port="V" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.quiver" port="V" type="input">
+    <value>3</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.quiver" port="color" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.quiver" port="color" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec altName="colorScalar" attr="translations" code_ref="matplotlib.pyplot.quiver" port="color" type="alternate">
+    <value>translate_color</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.quiver" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="0" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.pie">
+    <value>tuple</value>
+  </changeModule>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.pie" port="colors" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.pie" port="autotext" type="output">
+    <value>
+      <outputPortSpec arg="autotext" compute_name="autotexts" name="autotextProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.text.Text" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.pie" port="wedge" type="output">
+    <value>
+      <outputPortSpec arg="wedge" compute_name="wedges" name="wedgeProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.patches.Wedge" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.pie" port="text" type="output">
+    <value>
+      <outputPortSpec arg="text" compute_name="texts" name="textProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.text.Text" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.semilogx">
+    <value>object</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.semilogx" port="x" type="input">
+    <value>
+      <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.semilogx" port="y" type="input">
+    <value>
+      <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.semilogx" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.errorbar">
+    <value>tuple</value>
+  </changeModule>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.errorbar" port="xerr" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.errorbar" port="xerr" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.errorbar" port="xerr" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="xerrScalar" code_ref="matplotlib.pyplot.errorbar" port="xerr" type="alternate">
+    <value>
+      <alternateSpec arg="xerr" name="xerrScalar" port_type="basic:Float" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.errorbar" port="yerr" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.errorbar" port="yerr" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.errorbar" port="yerr" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec altName="yerrScalar" code_ref="matplotlib.pyplot.errorbar" port="yerr" type="alternate">
+    <value>
+      <alternateSpec arg="yerr" name="yerrScalar" port_type="basic:Float" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.errorbar" port="capline" type="output">
+    <value>
+      <outputPortSpec arg="capline" compute_name="caplines" name="caplineProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.errorbar" port="barline" type="output">
+    <value>
+      <outputPortSpec arg="barline" compute_name="barlines" name="barlineProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.collections.LineCollection" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.errorbar" port="plotline" type="output">
+    <value>
+      <outputPortSpec arg="plotline" compute_name="plotline" name="plotlineProperties" port_type="__property__" property_key="0" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.step">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.step" port="y" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.step" port="x" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.step" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.hist">
+    <value>tuple</value>
+  </changeModule>
+  <changePortSpec attr="translations" code_ref="matplotlib.pyplot.hist" port="color" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec altName="colorScalar" attr="translations" code_ref="matplotlib.pyplot.hist" port="color" type="alternate">
+    <value>translate_color</value>
+  </changePortSpec>
+  <changePortSpec attr="name" code_ref="matplotlib.pyplot.hist" port="bins" type="input">
+    <value>bins</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.hist" port="bins" type="input">
+    <value>basic:Integer</value>
+  </changePortSpec>
+  <deletePortSpec altName="binsScalar" code_ref="matplotlib.pyplot.hist" port="bins" type="alternate" />
+  <addPortSpec altName="binsSequence" code_ref="matplotlib.pyplot.hist" port="bins" type="alternate">
+    <value>
+      <alternateSpec arg="bins" name="binsSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.hist" port="rectangle" type="output">
+    <value>
+      <outputPortSpec arg="rectangle" compute_name="rectangles" name="rectangleProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.patches.Rectangle" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.scatter">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.scatter" port="cmap" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.scatter" port="cmap" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.scatter" port="norm" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.scatter" port="norm" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.scatter" port="pathCollection" type="output">
+    <value>
+      <outputPortSpec arg="pathCollection" compute_name="pathCollection" name="pathCollectionProperties" port_type="__property__" property_key="0" property_type="matplotlib.collections.PathCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.plot_date">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.plot_date" port="y" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.plot_date" port="x" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.plot_date" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.psd" port="line" type="input">
+    <value>
+      <inputPortSpec arg="line" constructor_arg="True" name="lineProperties" port_type="__property__" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.polar">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.polar" port="theta" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.polar" port="theta" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.polar" port="r" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.polar" port="r" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.polar" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.loglog">
+    <value>object</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.loglog" port="y" type="input">
+    <value>
+      <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.loglog" port="x" type="input">
+    <value>
+      <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.loglog" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.contourf">
+    <value>tuple</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.contourf" port="N" type="input">
+    <value>
+      <inputPortSpec arg="N" arg_pos="4" in_args="True" name="N" port_type="basic:Integer" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contourf" port="V" type="input">
+    <value>
+      <inputPortSpec arg="V" arg_pos="3" in_args="True" name="V" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contourf" port="Y" type="input">
+    <value>
+      <inputPortSpec arg="Y" arg_pos="1" in_args="True" name="Y" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contourf" port="X" type="input">
+    <value>
+      <inputPortSpec arg="X" arg_pos="0" in_args="True" name="X" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.contourf" port="Z" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.contourf" port="Z" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.contourf" port="Z" type="input">
+    <value>2</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contourf" port="contourSet" type="output">
+    <value>
+      <outputPortSpec arg="contourSet" compute_name="contourSet" name="contourSet" port_type="MplQuadContourSet" property_key="0" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.contourf" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollections" name="polyCollectionProperties" plural="True" port_type="__property__" property_key="1" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.legend" port="prop" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.legend" port="prop" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.semilogy">
+    <value>object</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.semilogy" port="y" type="input">
+    <value>
+      <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.semilogy" port="x" type="input">
+    <value>
+      <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.semilogy" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.spy">
+    <value>tuple</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.spy" port="Z" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.spy" port="image" type="output">
+    <value>
+      <outputPortSpec arg="image" compute_name="image" name="imageProperties" port_type="__property__" property_key="0" property_type="matplotlib.image.AxesImage" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.spy" port="marks" type="output">
+    <value>
+      <outputPortSpec arg="marks" compute_name="marks" name="marksProperties" port_type="__property__" property_key="1" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.acorr">
+    <value>tuple</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.acorr" port="lineCollection" type="output">
+    <value>
+      <outputPortSpec arg="lineCollection" compute_name="lineCollection" name="lineCollectionProperties" port_type="__property__" property_key="4" property_type="matplotlib.collections.LineCollection" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.acorr" port="line" type="output">
+    <value>
+      <outputPortSpec arg="line" compute_name="lines" name="lineProperties" plural="True" port_type="__property__" property_key="2" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.acorr" port="xaxis" type="output">
+    <value>
+      <outputPortSpec arg="xaxis" compute_name="xaxis" name="xaxisProperties" port_type="__property__" property_key="3" property_type="matplotlib.lines.Line2D" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.fill">
+    <value>object</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.fill" port="y" type="input">
+    <value>
+      <inputPortSpec arg="y" arg_pos="1" in_args="True" name="y" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.fill" port="x" type="input">
+    <value>
+      <inputPortSpec arg="x" arg_pos="0" in_args="True" name="x" port_type="basic:List" required="True" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.fill" port="polygon" type="output">
+    <value>
+      <outputPortSpec arg="polygon" compute_name="polygons" name="polygonProperties" plural="True" port_type="__property__" property_key="0" property_type="matplotlib.artist.patches.Polygon" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.barbs">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="name" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="input">
+    <value>barbcolor</value>
+  </changePortSpec>
+  <changePortSpec attr="translations" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="input">
+    <value>translate_color</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="input">
+    <value>basic:Color</value>
+  </changePortSpec>
+  <deletePortSpec altName="barbcolorScalar" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="alternate" />
+  <addPortSpec altName="barbcolorSequence" code_ref="matplotlib.pyplot.barbs" port="barbcolor" type="alternate">
+    <value>
+      <alternateSpec arg="barbcolor" name="barbcolorSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.barbs" port="C" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="C" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.barbs" port="C" type="input">
+    <value>4</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="sizes" type="input">
+    <value>basic:Dictionary</value>
+  </changePortSpec>
+  <addPortSpec altName="flip_barbSequence" code_ref="matplotlib.pyplot.barbs" port="flip_barb" type="alternate">
+    <value>
+      <alternateSpec arg="flip_barb" name="flip_barbSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="barb_increments" type="input">
+    <value>basic:Dictionary</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.barbs" port="barb_increments" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="required" code_ref="matplotlib.pyplot.barbs" port="U" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.barbs" port="U" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="U" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.barbs" port="U" type="input">
+    <value>2</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.barbs" port="X" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="X" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.barbs" port="X" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.barbs" port="X" type="input">
+    <value>0</value>
+  </changePortSpec>
+  <changePortSpec attr="required" code_ref="matplotlib.pyplot.barbs" port="V" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.barbs" port="V" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="V" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.barbs" port="V" type="input">
+    <value>3</value>
+  </changePortSpec>
+  <changePortSpec attr="in_args" code_ref="matplotlib.pyplot.barbs" port="Y" type="input">
+    <value>True</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="Y" type="input">
+    <value>basic:List</value>
+  </changePortSpec>
+  <changePortSpec attr="defaults" code_ref="matplotlib.pyplot.barbs" port="Y" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="arg_pos" code_ref="matplotlib.pyplot.barbs" port="Y" type="input">
+    <value>1</value>
+  </changePortSpec>
+  <changePortSpec attr="name" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="input">
+    <value>flagcolor</value>
+  </changePortSpec>
+  <changePortSpec attr="translations" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="input">
+    <value>translate_color</value>
+  </changePortSpec>
+  <changePortSpec attr="entry_types" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="values" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="input">
+    <value>None</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="input">
+    <value>basic:Color</value>
+  </changePortSpec>
+  <deletePortSpec altName="flagcolorScalar" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="alternate" />
+  <addPortSpec altName="flagcolorSequence" code_ref="matplotlib.pyplot.barbs" port="flagcolor" type="alternate">
+    <value>
+      <alternateSpec arg="flagcolor" name="flagcolorSequence" port_type="basic:List" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.barbs" port="polyCollection" type="output">
+    <value>
+      <outputPortSpec arg="polyCollection" compute_name="polyCollection" name="polyCollectionProperties" port_type="__property__" property_key="__none__" property_type="matplotlib.collections.PolyCollection" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.axvspan">
+    <value>object</value>
+  </changeModule>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvspan" port="xmin" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvspan" port="ymin" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvspan" port="ymax" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <changePortSpec attr="port_type" code_ref="matplotlib.pyplot.axvspan" port="xmax" type="input">
+    <value>basic:Float</value>
+  </changePortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.axvspan" port="patch" type="output">
+    <value>
+      <outputPortSpec arg="patch" compute_name="patch" name="patchProperties" port_type="__property__" property_key="-1" property_type="matplotlib.patches.Polygon" />
+    </value>
+  </addPortSpec>
+  <changeModule attr="output_type" code_ref="matplotlib.pyplot.boxplot">
+    <value>dict</value>
+  </changeModule>
+  <addPortSpec code_ref="matplotlib.pyplot.boxplot" port="box" type="output">
+    <value>
+      <outputPortSpec arg="box" compute_name="boxes" name="boxProperties" plural="True" port_type="__property__" property_key="boxes" property_type="matplotlib.artist.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.boxplot" port="flier" type="output">
+    <value>
+      <outputPortSpec arg="flier" compute_name="fliers" name="flierProperties" plural="True" port_type="__property__" property_key="fliers" property_type="matplotlib.artist.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.boxplot" port="cap" type="output">
+    <value>
+      <outputPortSpec arg="cap" compute_name="caps" name="capProperties" plural="True" port_type="__property__" property_key="caps" property_type="matplotlib.artist.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.boxplot" port="median" type="output">
+    <value>
+      <outputPortSpec arg="median" compute_name="medians" name="medianProperties" plural="True" port_type="__property__" property_key="medians" property_type="matplotlib.artist.Line2D" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.boxplot" port="boxPatch" type="output">
+    <value>
+      <outputPortSpec arg="boxPatch" compute_name="boxPatches" name="boxPatchProperties" plural="True" port_type="__property__" property_key="boxPatches" property_type="matplotlib.artist.PathPatch" />
+    </value>
+  </addPortSpec>
+  <addPortSpec code_ref="matplotlib.pyplot.boxplot" port="whisker" type="output">
+    <value>
+      <outputPortSpec arg="whisker" compute_name="whiskers" name="whiskerProperties" plural="True" port_type="__property__" property_key="whiskers" property_type="matplotlib.artist.Line2D" />
+    </value>
+  </addPortSpec>
+</diff>
diff --git a/vistrails/packages/matplotlib/mpl_plots_raw.xml b/vistrails/packages/matplotlib/mpl_plots_raw.xml
new file mode 100644
index 0000000..2d9dc75
--- /dev/null
+++ b/vistrails/packages/matplotlib/mpl_plots_raw.xml
@@ -0,0 +1,3154 @@
+<specs>
+  <customCode />
+  <moduleSpec code_ref="matplotlib.pyplot.acorr" name="MplAcorr" superclass="MplPlot">
+    <docstring>Plot the autocorrelation of x.
+
+Call signature:
+
+acorr(x, normed=True, detrend=mlab.detrend_none, usevlines=True,       maxlags=10, **kwargs)
+
+If normed = True, normalize the data by the autocorrelation at 0-th lag.  x is detrended by the detrend callable (default no normalization).
+
+Data are plotted as plot(lags, c, **kwargs)
+
+Return value is a tuple (lags, c, line) where:
+
+lags are a length 2*maxlags+1 lag vector
+
+c is the 2*maxlags+1 auto correlation vector
+
+line is a :class:`~matplotlib.lines.Line2D` instance returned by :meth:`plot`
+
+The default linestyle is None and the default marker is 'o', though these can be overridden with keyword args. The cross correlation is performed with :func:`numpy.correlate` with mode = 2.
+
+If usevlines is True, :meth:`~matplotlib.axes.Axes.vlines` rather than :meth:`~matplotlib.axes.Axes.plot` is used to draw vertical lines from the origin to the acorr.  Otherwise, the plot style is determined by the kwargs, which are :class:`~matplotlib.lines.Line2D` properties.
+
+maxlags is a positive integer detailing the number of lags to show.  The default value of None will return all (2*len(x)-1) lags.
+
+The return value is a tuple (lags, c, linecol, b) where
+
+linecol is the :class:`~matplotlib.collections.LineCollection`
+
+b is the x-axis.
+
+Example:
+
+:func:`~matplotlib.pyplot.xcorr` is top graph, and :func:`~matplotlib.pyplot.acorr` is bottom graph.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="normed" arg_pos="1" name="normed" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="usevlines" arg_pos="3" name="usevlines" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="detrend" arg_pos="2" name="detrend" />
+    <inputPortSpec arg="maxlags" arg_pos="4" name="maxlags" port_type="basic:Integer">
+      <defaults>['10']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="1" name="hold" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.arrow" name="MplArrow" superclass="MplPlot">
+    <docstring>Add an arrow to the axes.
+
+Call signature:
+
+arrow(x, y, dx, dy, **kwargs)
+
+Draws arrow on specified axis from (x, y) to (x + dx, y + dy). Uses FancyArrow patch to construct the arrow.
+
+Optional kwargs control the arrow construction and properties:
+
+%(FancyArrow)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="dx" arg_pos="2" name="dx" required="True" />
+    <inputPortSpec arg="dy" arg_pos="3" name="dy" required="True" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axhline" name="MplAxhline" superclass="MplPlot">
+    <docstring>Add a horizontal line across the axis.
+
+Call signature:
+
+axhline(y=0, xmin=0, xmax=1, **kwargs)
+
+Draw a horizontal line at y from xmin to xmax.  With the default values of xmin = 0 and xmax = 1, this line will always span the horizontal extent of the axes, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command.  That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the y location is in data coordinates.
+
+Return value is the :class:`~matplotlib.lines.Line2D` instance.  kwargs are the same as kwargs to plot, and can be used to control the line properties.  Eg.,
+
+draw a thick red hline at y = 0 that spans the xrange:
+
+>>> axhline(linewidth=4, color='r')
+
+draw a default hline at y = 1 that spans the xrange:
+
+>>> axhline(y=1)
+
+draw a default hline at y = .5 that spans the the middle half of the xrange:
+
+>>> axhline(y=.5, xmin=0.25, xmax=0.75)
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, with the exception of 'transform':
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="0" name="y" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xmin" arg_pos="1" name="xmin" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="3" name="hold" />
+    <inputPortSpec arg="xmax" arg_pos="2" name="xmax" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axhspan" name="MplAxhspan" superclass="MplPlot">
+    <docstring>Add a horizontal span (rectangle) across the axis.
+
+Call signature:
+
+axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs)
+
+y coords are in data units and x coords are in axes (relative 0-1) units.
+
+Draw a horizontal span (rectangle) from ymin to ymax. With the default values of xmin = 0 and xmax = 1, this always spans the xrange, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command. That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the y location is in data coordinates.
+
+Return value is a :class:`matplotlib.patches.Polygon` instance.
+
+Examples:
+
+draw a gray rectangle from y = 0.25-0.75 that spans the horizontal extent of the axes:
+
+>>> axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
+
+Valid kwargs are :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="xmin" arg_pos="2" name="xmin" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="ymin" arg_pos="0" name="ymin" required="True" />
+    <inputPortSpec arg="ymax" arg_pos="1" name="ymax" required="True" />
+    <inputPortSpec arg="xmax" arg_pos="3" name="xmax" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axvline" name="MplAxvline" superclass="MplPlot">
+    <docstring>Add a vertical line across the axes.
+
+Call signature:
+
+axvline(x=0, ymin=0, ymax=1, **kwargs)
+
+Draw a vertical line at x from ymin to ymax.  With the default values of ymin = 0 and ymax = 1, this line will always span the vertical extent of the axes, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command.  That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the x location is in data coordinates.
+
+Return value is the :class:`~matplotlib.lines.Line2D` instance.  kwargs are the same as kwargs to plot, and can be used to control the line properties.  Eg.,
+
+draw a thick red vline at x = 0 that spans the yrange:
+
+>>> axvline(linewidth=4, color='r')
+
+draw a default vline at x = 1 that spans the yrange:
+
+>>> axvline(x=1)
+
+draw a default vline at x = .5 that spans the the middle half of the yrange:
+
+>>> axvline(x=.5, ymin=0.25, ymax=0.75)
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, with the exception of 'transform':
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="3" name="hold" />
+    <inputPortSpec arg="ymin" arg_pos="1" name="ymin" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ymax" arg_pos="2" name="ymax" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.axvspan" name="MplAxvspan" superclass="MplPlot">
+    <docstring>Add a vertical span (rectangle) across the axes.
+
+Call signature:
+
+axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs)
+
+x coords are in data units and y coords are in axes (relative 0-1) units.
+
+Draw a vertical span (rectangle) from xmin to xmax.  With the default values of ymin = 0 and ymax = 1, this always spans the yrange, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command.  That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the y location is in data coordinates.
+
+Return value is the :class:`matplotlib.patches.Polygon` instance.
+
+Examples:
+
+draw a vertical green translucent rectangle from x=1.25 to 1.55 that spans the yrange of the axes:
+
+>>> axvspan(1.25, 1.55, facecolor='g', alpha=0.5)
+
+Valid kwargs are :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="xmin" arg_pos="0" name="xmin" required="True" />
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="ymin" arg_pos="2" name="ymin" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ymax" arg_pos="3" name="ymax" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xmax" arg_pos="1" name="xmax" required="True" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.bar" name="MplBar" superclass="MplPlot">
+    <docstring>Make a bar plot.
+
+Call signature:
+
+bar(left, height, width=0.8, bottom=0, **kwargs)
+
+Make a bar plot with rectangles bounded by:
+
+
+
+left, height, width, and bottom can be either scalars or sequences
+
+Return value is a list of :class:`matplotlib.patches.Rectangle` instances.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+For vertical bars, align = 'edge' aligns bars by their left edges in left, while align = 'center' interprets these values as the x coordinates of the bar centers. For horizontal bars, align = 'edge' aligns bars by their bottom edges in bottom, while align = 'center' interprets these values as the y coordinates of the bar centers.
+
+The optional arguments color, edgecolor, linewidth, 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:
+
+%(Rectangle)s
+
+Example: A stacked bar chart.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>the colors of the bar edges</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth">
+      <docstring>width of bar edges; None means use default linewidth; 0 means don't draw edges.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="capsize" name="capsize" port_type="basic:Integer">
+      <docstring>(default 3) determines the length in points of the error bar caps</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="orientation" name="orientation" port_type="basic:String">
+      <docstring>'vertical' | 'horizontal'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['vertical', 'horizontal']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="bottom" arg_pos="3" name="bottom" port_type="basic:Integer">
+      <docstring>the y coordinates of the bottom edges of the bars</docstring>
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>the colors of the bars</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="xerr" name="xerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="align" name="align" port_type="basic:String">
+      <docstring>'edge' (default) | 'center'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['edge', 'center']]</values>
+      <defaults>['edge']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ecolor" name="ecolor" port_type="basic:Color">
+      <docstring>specifies the color of any errorbar</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="1" name="height" required="True">
+      <docstring>the heights of the bars</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="width" arg_pos="2" name="width" port_type="basic:Float">
+      <docstring>the widths of the bars</docstring>
+      <defaults>['0.8']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="error_kw" name="error_kw">
+      <docstring>dictionary of kwargs to be passed to errorbar method. ecolor and capsize may be specified here rather than as independent kwargs.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="log" name="log" port_type="basic:Boolean">
+      <docstring>[False|True] False (default) leaves the orientation axis as-is; True sets it to log scale</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="yerr" name="yerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="left" arg_pos="0" name="left" required="True">
+      <docstring>the x coordinates of the left sides of the bars</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.barh" name="MplBarh" superclass="MplPlot">
+    <docstring>Make a horizontal bar plot.
+
+Call signature:
+
+barh(bottom, width, height=0.8, left=0, **kwargs)
+
+Make a horizontal bar plot with rectangles bounded by:
+
+
+
+bottom, width, height, and left can be either scalars or sequences
+
+Return value is a list of :class:`matplotlib.patches.Rectangle` instances.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+Setting align = 'edge' aligns bars by their bottom edges in bottom, while align = 'center' interprets these values as the y coordinates of the bar centers.
+
+The optional arguments color, edgecolor, linewidth, xerr, and yerr can be either scalars or sequences of length equal to the number of bars.  This enables you to use barh as the basis for stacked bar charts, or candlestick plots.
+
+other optional kwargs:
+
+%(Rectangle)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolor" name="edgecolor" port_type="basic:Color">
+      <docstring>the colors of the bar edges</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidth" name="linewidth">
+      <docstring>width of bar edges; None means use default linewidth; 0 means don't draw edges.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="capsize" name="capsize" port_type="basic:Integer">
+      <docstring>(default 3) determines the length in points of the error bar caps</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="log" name="log" port_type="basic:Boolean">
+      <docstring>[False|True] False (default) leaves the horizontal axis as-is; True sets it to log scale</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bottom" arg_pos="0" name="bottom" required="True">
+      <docstring>the vertical positions of the bottom edges of the bars</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>the colors of the bars</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="xerr" name="xerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="align" name="align" port_type="basic:String">
+      <docstring>'edge' (default) | 'center'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['edge', 'center']]</values>
+      <defaults>['edge']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ecolor" name="ecolor" port_type="basic:Color">
+      <docstring>specifies the color of any errorbar</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="height" arg_pos="2" name="height" port_type="basic:Float">
+      <docstring>the heights (thicknesses) of the bars</docstring>
+      <defaults>['0.8']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="width" arg_pos="1" name="width" required="True">
+      <docstring>the lengths of the bars</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="yerr" name="yerr">
+      <docstring>if not None, will be used to generate errorbars on the bar chart</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="left" arg_pos="3" name="left" port_type="basic:Integer">
+      <docstring>the x coordinates of the left edges of the bars</docstring>
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.broken_barh" name="MplBrokenBarh" superclass="MplPlot">
+    <docstring>Plot horizontal bars.
+
+Call signature:
+
+broken_barh(self, xranges, yrange, **kwargs)
+
+A collection of horizontal bars spanning yrange with a sequence of xranges.
+
+Required arguments:
+
+
+
+kwargs are :class:`matplotlib.collections.BrokenBarHCollection` properties:
+
+%(BrokenBarHCollection)s
+
+these can either be a single argument, ie:
+
+facecolors = 'black'
+
+or a sequence of arguments for the various bars, ie:
+
+facecolors = ('black', 'red', 'green')
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="xranges" arg_pos="0" name="xranges" port_type="basic:List" required="True">
+      <docstring>sequence of (xmin, xwidth)</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="2" name="hold" />
+    <inputPortSpec arg="yrange" arg_pos="1" name="yrange" port_type="basic:List" required="True">
+      <docstring>sequence of (ymin, ywidth)</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.boxplot" name="MplBoxplot" superclass="MplPlot">
+    <docstring>Make a box and whisker plot.
+
+Call signature:
+
+boxplot(x, notch=False, sym='+', vert=True, whis=1.5,         positions=None, widths=None, patch_artist=False,         bootstrap=None, usermedians=None, conf_intervals=None)
+
+Make a box and whisker plot for each column of x or each vector in sequence x.  The box extends from the lower to upper quartile values of the data, with a line at the median. The whiskers extend from the box to show the range of the data.  Flier points are those past the end of the whiskers.
+
+Function Arguments:
+
+
+
+Returns a dictionary mapping each component of the boxplot to a list of the :class:`matplotlib.lines.Line2D` instances created. That dictionary has the following keys (assuming vertical boxplots):
+
+boxes: the main body of the boxplot showing the quartiles and the median's confidence intervals if enabled.
+
+medians: horizonal lines at the median of each box.
+
+whiskers: the vertical lines extending to the most extreme, n-outlier data points.
+
+caps: the horizontal lines at the ends of the whiskers.
+
+fliers: points representing data that extend beyone the whiskers (outliers).
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="11" name="hold" />
+    <inputPortSpec arg="vert" arg_pos="3" name="vert" port_type="basic:Boolean">
+      <docstring>If True (default), makes the boxes vertical. If False, makes horizontal boxes.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="positions" arg_pos="5" name="positions">
+      <docstring>Sets the horizontal positions of the boxes. The ticks and limits are automatically set to match the positions.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bootstrap" arg_pos="8" name="bootstrap">
+      <docstring>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.</ [...]
+    </inputPortSpec>
+    <inputPortSpec arg="usermedians" arg_pos="9" name="usermedians" port_type="basic:List">
+      <docstring>An array or sequence whose first dimension (or length) is compatible with x. This overrides the medians computed by matplotlib for each element of usermedians that is not None. When an element of usermedians == None, the median will be computed directly as normal.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="sym" arg_pos="2" name="sym" port_type="basic:String">
+      <docstring>The default symbol for flier points. Enter an empty string ('') if you don't want to show fliers.</docstring>
+      <defaults>['b+']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="widths" arg_pos="6" name="widths" port_type="basic:Float">
+      <docstring>Either a scalar or a vector and sets the width of each box. The default is 0.5, or 0.15*(distance between extreme positions) if that is smaller.</docstring>
+      <defaults>['0.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="patch_artist" arg_pos="7" name="patch_artist" port_type="basic:Boolean">
+      <docstring>If False produces boxes with the Line2D artist If True produces boxes with the Patch artist</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True">
+      <docstring>Array or a sequence of vectors.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="notch" arg_pos="1" name="notch" port_type="basic:Boolean">
+      <docstring>If False (default), produces a rectangular box plot. If True, will produce a notched box plot</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="whis" arg_pos="4" name="whis" port_type="basic:Float">
+      <docstring>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.</docstring>
+      <defaults>['1.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="conf_intervals" arg_pos="10" name="conf_intervals" port_type="basic:List">
+      <docstring>Array or sequence whose first dimension (or length) is compatible with x and whose second dimension is 2. When the current element of conf_intervals is not None, the notch locations computed by matplotlib are overridden (assuming notch is True). When an element of conf_intervals is None, boxplot compute notches the method specified by the other kwargs (e.g. bootstrap).</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.cohere" name="MplCohere" superclass="MplPlot">
+    <docstring>Plot the coherence between x and y.
+
+Call signature:
+
+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, **kwargs)
+
+Plot the coherence between x and y.  Coherence is the normalized cross spectral density:
+
+C_{xy} = \frac{|P_{xy}|^2}{P_{xx}P_{yy}}
+
+%(PSD)s
+
+
+
+The return value is a tuple (Cxy, f), where f are the frequencies of the coherence vector.
+
+kwargs are applied to the lines.
+
+References:
+
+Bendat & Piersol -- Random Data: Analysis and Measurement Procedures, John Wiley & Sons (1986)
+
+kwargs control the :class:`~matplotlib.lines.Line2D` properties of the coherence plot:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="3" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="8" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="10" name="scale_by_freq" />
+    <inputPortSpec arg="detrend" arg_pos="5" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="6" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="4" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="2" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="11" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="9" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="7" name="noverlap" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.clabel" name="MplClabel" superclass="MplPlot">
+    <docstring>Label a contour plot.
+
+Call signature:
+
+clabel(cs, **kwargs)
+
+Adds labels to line contours in cs, where cs is a :class:`~matplotlib.contour.ContourSet` object returned by contour.
+
+clabel(cs, v, **kwargs)
+
+only labels contours listed in v.
+
+Optional keyword arguments:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="inline_spacing" name="inline_spacing">
+      <docstring>space in pixels to leave on each side of label when placing inline.  Defaults to 5.  This spacing will be exact for labels at locations where the contour is straight, less so for labels on curved contours.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="use_clabeltext" name="use_clabeltext" port_type="basic:String">
+      <docstring>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.</docstring>
+      <defaults>['False)']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="fmt" name="fmt" port_type="basic:String">
+      <docstring>a format string for the label. Default is '%1.3f' Alternatively, this can be a dictionary matching contour levels with arbitrary strings to use for each contour level (i.e., fmt[level]=string), or it can be any callable, such as a :class:`~matplotlib.ticker.Formatter` instance, that returns a string when called with a numeric contour level.</docstring>
+      <defaults>['%1.3f']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="manual" name="manual">
+      <docstring>if True, contour labels will be placed manually using mouse clicks.  Click the first button near a contour to add a label, click the second button (or potentially both mouse buttons at once) to finish adding labels.  The third button can be used to remove the last label added, but only if labels are not inline.  Alternatively, the keyboard can be used to select label locations (enter to end label placement, delete or backspace act like the third mouse button, and any oth [...]
+
+manual can be an iterable object of x,y tuples. Contour labels will be created as if mouse is clicked at each x,y positions.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="cs" arg_pos="0" name="cs" required="True" />
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>if None, the color of each label matches the color of the corresponding contour
+
+if one string color, e.g. colors = 'r' or colors = 'red', all labels will be plotted in this color
+
+if a tuple of matplotlib color args (string, float, rgb, etc), different labels will be plotted in different colors in the order specified</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="fontsize" name="fontsize">
+      <docstring>size in points or relative size eg 'smaller', 'x-large'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rightside_up" name="rightside_up" port_type="basic:Boolean">
+      <docstring>if True (default), label rotations will always be plus or minus 90 degrees from level.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="CS" arg_pos="0" name="CS" required="True" />
+    <inputPortSpec arg="inline" name="inline" port_type="basic:Boolean">
+      <docstring>controls whether the underlying contour is removed or not. Default is True.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.contour" name="MplContour" superclass="MplPlot">
+    <docstring>Plot contours.
+
+: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 version in that it does not draw the polygon edges. To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`.
+
+Call signatures:
+
+contour(Z)
+
+make a contour plot of an array Z. The level values are chosen automatically.
+
+contour(X,Y,Z)
+
+X, Y specify the (x, y) coordinates of the surface
+
+contour(Z,N) contour(X,Y,Z,N)
+
+contour N automatically-chosen levels.
+
+contour(Z,V) contour(X,Y,Z,V)
+
+draw contour lines at the values specified in sequence V
+
+contourf(..., V)
+
+fill the len(V)-1 regions between the values in V
+
+contour(Z, **kwargs)
+
+Use keyword args to control colors, linewidth, origin, cmap ... see below for more details.
+
+X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
+
+C = contour(...) returns a :class:`~matplotlib.contour.QuadContourSet` object.
+
+Optional keyword arguments:
+
+
+
+contour-only keyword arguments:
+
+
+
+contourf-only keyword arguments:
+
+
+
+Note: contourf 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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="xunits" name="xunits" port_type="basic:String">
+      <docstring>Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'registered units']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="extend" name="extend" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['neither', 'both', 'min', 'max']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>If linestyles is None, the default is 'solid' unless the lines are monochrome.  In that case, negative contours will take their linestyle from the matplotlibrc contour.negative_linestyle setting.
+
+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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hatches" name="hatches" port_type="basic:List">
+      <docstring>A list of cross hatch patterns to use on the filled areas. If None, no hatching will be added to the contour. Hatching is supported in the PostScript, PDF, SVG and Agg backends only.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="locator" name="locator" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'ticker.Locator subclass']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="yunits" name="yunits" port_type="basic:String">
+      <docstring>Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'registered units']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="extent" name="extent" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(x0,x1,y0,y1)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Z" arg_pos="0" name="Z" required="True" />
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>enable antialiasing, overriding the defaults.  For filled contours, the default is True.  For line contours, it is taken from rcParams['lines.antialiased'].</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.contourf" name="MplContourf" superclass="MplPlot">
+    <docstring>Plot contours.
+
+: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 version in that it does not draw the polygon edges. To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`.
+
+Call signatures:
+
+contour(Z)
+
+make a contour plot of an array Z. The level values are chosen automatically.
+
+contour(X,Y,Z)
+
+X, Y specify the (x, y) coordinates of the surface
+
+contour(Z,N) contour(X,Y,Z,N)
+
+contour N automatically-chosen levels.
+
+contour(Z,V) contour(X,Y,Z,V)
+
+draw contour lines at the values specified in sequence V
+
+contourf(..., V)
+
+fill the len(V)-1 regions between the values in V
+
+contour(Z, **kwargs)
+
+Use keyword args to control colors, linewidth, origin, cmap ... see below for more details.
+
+X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
+
+C = contour(...) returns a :class:`~matplotlib.contour.QuadContourSet` object.
+
+Optional keyword arguments:
+
+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.
+
+contour-only keyword arguments:
+
+
+
+contourf-only keyword arguments:
+
+
+
+Note: contourf 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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>If linestyles is None, the default is 'solid' unless the lines are monochrome.  In that case, negative contours will take their linestyle from the matplotlibrc contour.negative_linestyle setting.
+
+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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="hatches" name="hatches" port_type="basic:List">
+      <docstring>A list of cross hatch patterns to use on the filled areas. If None, no hatching will be added to the contour. Hatching is supported in the PostScript, PDF, SVG and Agg backends only.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Z" arg_pos="0" name="Z" required="True" />
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.csd" name="MplCsd" superclass="MplPlot">
+    <docstring>Plot cross-spectral density.
+
+Call signature:
+
+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, **kwargs)
+
+The cross spectral density P_{xy} by Welch's average periodogram method.  The vectors x and y are divided into NFFT length segments.  Each segment is detrended by function detrend and windowed by function window.  The product of the direct FFTs of x and y are averaged over each segment to compute P_{xy}, with a scaling to correct for power loss due to windowing.
+
+Returns the tuple (Pxy, freqs).  P is the cross spectrum (complex valued), and 10\log_{10}|P_{xy}| is plotted.
+
+%(PSD)s
+
+
+
+kwargs control the Line2D properties:
+
+%(Line2D)s
+
+Example:
+
+seealso:  :meth:`psd`     For a description of the optional parameters.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="3" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="8" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="10" name="scale_by_freq" />
+    <inputPortSpec arg="detrend" arg_pos="5" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="6" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="4" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="2" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="11" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="9" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="7" name="noverlap" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.errorbar" name="MplErrorbar" superclass="MplPlot">
+    <docstring>Plot an errorbar graph.
+
+Call signature:
+
+errorbar(x, y, yerr=None, xerr=None,          fmt='-', ecolor=None, elinewidth=None, capsize=3,          barsabove=False, lolims=False, uplims=False,          xlolims=False, xuplims=False, errorevery=1,          capthick=None)
+
+Plot x versus y with error deltas in yerr and xerr. Vertical errorbars are plotted if yerr is not None. Horizontal errorbars are plotted if xerr is not None.
+
+x, y, xerr, and yerr can all be scalars, which plots a single error bar at x, y.
+
+Optional keyword arguments:
+
+
+
+All other keyword arguments are passed on to the plot command for the markers. For example, this code makes big red squares with thick green edges:
+
+x,y,yerr = rand(3,10) errorbar(x, y, yerr, marker='s',          mfc='red', mec='green', ms=20, mew=4)
+
+where mfc, mec, ms and mew are aliases for the longer property names, markerfacecolor, markeredgecolor, markersize and markeredgewith.
+
+valid kwargs for the marker properties are
+
+%(Line2D)s
+
+Returns (plotline, caplines, barlinecols):
+
+
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="lolims" arg_pos="9" name="lolims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="capsize" arg_pos="7" name="capsize" port_type="basic:Float">
+      <docstring>The length of the error bar caps in points</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="uplims" arg_pos="10" name="uplims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xlolims" arg_pos="11" name="xlolims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="barsabove" arg_pos="8" name="barsabove">
+      <docstring>if True, will plot the errorbars above the plot symbols. Default is below.</docstring>
+      <defaults>['below']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xerr" arg_pos="3" name="xerr">
+      <docstring>If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.
+
+If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['N, Nx1, or 2xN array-like']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fmt" arg_pos="4" name="fmt" port_type="basic:String">
+      <docstring>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.</docstring>
+      <defaults>['-']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ecolor" arg_pos="5" name="ecolor" port_type="basic:Color">
+      <docstring>A matplotlib color arg which gives the color the errorbar lines; if None, use the marker color.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'mpl color']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="errorevery" arg_pos="13" name="errorevery" port_type="basic:Integer">
+      <docstring>subsamples the errorbars. Eg if everyerror=5, errorbars for every 5-th datapoint will be plotted. The data plot itself still shows all data points.</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="capthick" arg_pos="14" name="capthick" port_type="basic:Float">
+      <docstring>An alias kwarg to markeredgewidth (a.k.a. - mew). This setting is a more sensible name for the property that controls the thickness of the error bar cap in points. For backwards compatibility, if mew or markeredgewidth are given, then they will over-ride capthick.  This may change in future releases.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="xuplims" arg_pos="12" name="xuplims" port_type="basic:Boolean">
+      <docstring>These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="elinewidth" arg_pos="6" name="elinewidth" port_type="basic:Float">
+      <docstring>The linewidth of the errorbar lines. If None, use the linewidth.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="15" name="hold" />
+    <inputPortSpec arg="yerr" arg_pos="2" name="yerr">
+      <docstring>If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.
+
+If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['N, Nx1, or 2xN array-like']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.fill" name="MplFill" superclass="MplPlot">
+    <docstring>Plot filled polygons.
+
+Call signature:
+
+fill(*args, **kwargs)
+
+args is a variable length argument, allowing for multiple x, y pairs with an optional color format string; see :func:`~matplotlib.pyplot.plot` for details on the argument parsing.  For example, to plot a polygon with vertices at x, y in blue.:
+
+ax.fill(x,y, 'b' )
+
+An arbitrary number of x, y, color groups can be specified:
+
+ax.fill(x1, y1, 'g', x2, y2, 'r')
+
+Return value is a list of :class:`~matplotlib.patches.Patch` instances that were added.
+
+The same color strings that :func:`~matplotlib.pyplot.plot` supports are supported by the fill format string.
+
+If you would like to fill below a curve, eg. shade a region between 0 and y along x, use :meth:`fill_between`
+
+The closed kwarg will close the polygon when True (default).
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.fill_between" name="MplFillBetween" superclass="MplPlot">
+    <docstring>Make filled polygons between two curves.
+
+Call signature:
+
+fill_between(x, y1, y2=0, where=None, **kwargs)
+
+Create a :class:`~matplotlib.collections.PolyCollection` filling the regions between y1 and y2 where where==True
+
+
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(PolyCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y2" arg_pos="2" name="y2" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="interpolate" arg_pos="4" name="interpolate" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y1" arg_pos="1" name="y1" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="5" name="hold" />
+    <inputPortSpec arg="where" arg_pos="3" name="where" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.fill_betweenx" name="MplFillBetweenx" superclass="MplPlot">
+    <docstring>Make filled polygons between two horizontal curves.
+
+Call signature:
+
+fill_between(y, x1, x2=0, where=None, **kwargs)
+
+Create a :class:`~matplotlib.collections.PolyCollection` filling the regions between x1 and x2 where where==True
+
+
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(PolyCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="0" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x2" arg_pos="2" name="x2" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="4" name="hold" />
+    <inputPortSpec arg="x1" arg_pos="1" name="x1" required="True" />
+    <inputPortSpec arg="where" arg_pos="3" name="where" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hexbin" name="MplHexbin" superclass="MplPlot">
+    <docstring>Make a hexagonal binning plot.
+
+Call signature:
+
+hexbin(x, y, C = None, gridsize = 100, bins = None,        xscale = 'linear', yscale = 'linear',        cmap=None, norm=None, vmin=None, vmax=None,        alpha=None, linewidths=None, edgecolors='none'        reduce_C_function = np.mean, mincnt=None, marginals=True        **kwargs)
+
+Make a hexagonal binning plot of x versus y, where x, y are 1-D sequences of the same length, N. If C is None (the default), this is a histogram of the number of occurences of the observations at (x[i],y[i]).
+
+If C is specified, it specifies values at the coordinate (x[i],y[i]). These values are accumulated for each hexagonal bin and then reduced according to reduce_C_function, which defaults to numpy's mean function (np.mean). (If C is specified, it must also be a 1-D sequence of the same length as x and y.)
+
+x, y and/or C may be masked arrays, in which case only unmasked points will be plotted.
+
+Optional keyword arguments:
+
+Other keyword arguments controlling color mapping and normalization arguments:
+
+Other keyword arguments controlling the Collection properties:
+
+Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs:
+
+%(Collection)s
+
+The return value is a :class:`~matplotlib.collections.PolyCollection` instance; use :meth:`~matplotlib.collections.PolyCollection.get_array` on this :class:`~matplotlib.collections.PolyCollection` to get the counts in each hexagon. If marginals is True, horizontal bar and vertical bar (both PolyCollections) will be attached to the return collection as attributes hbar and vbar.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="vmax" arg_pos="11" name="vmax" port_type="basic:Float">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="edgecolors" arg_pos="14" name="edgecolorsSequence" port_type="basic:List">
+      <docstring>If 'none', draws the edges in the same color as the fill color. This is the default, as it avoids unsightly unpainted pixels between the hexagons.
+
+If None, draws the outlines in the default color.
+
+If a matplotlib color arg or sequence of rgba tuples, draws the outlines in the specified color.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'none', 'mpl color']]</values>
+      <defaults>['none']</defaults>
+      <alternateSpec arg="" name="edgecolorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="C" arg_pos="2" name="C" />
+    <inputPortSpec arg="gridsize" arg_pos="3" name="gridsize" port_type="basic:Integer">
+      <docstring>The number of hexagons in the x-direction, default is 100. The corresponding number of hexagons in the y-direction is chosen such that the hexagons are approximately regular. Alternatively, gridsize can be a tuple with two elements specifying the number of hexagons in the x-direction and the y-direction.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[100]]</values>
+      <defaults>['100']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" arg_pos="10" name="vmin" port_type="basic:Float">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="yscale" arg_pos="6" name="yscale" port_type="basic:String">
+      <defaults>['linear']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="reduce_C_function" arg_pos="15" name="reduce_C_function">
+      <defaults>['<function mean at 0x0277B3B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" arg_pos="13" name="linewidths">
+      <docstring>If None, defaults to rc lines.linewidth. Note that this is a tuple, and if you set the linewidths argument you must set it as a sequence of floats, as required by :class:`~matplotlib.collections.RegularPolyCollection`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="xscale" arg_pos="5" name="xscale" port_type="basic:String">
+      <docstring>Use a linear or log10 scale on the horizontal axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['linear', 'log']]</values>
+      <defaults>['linear']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="8" name="cmap" port_type="basic:String">
+      <docstring>a :class:`matplotlib.colors.Colormap` instance. If None, defaults to rc image.cmap.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="9" name="norm" port_type="basic:String">
+      <docstring>:class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="extent" arg_pos="7" name="extent">
+      <docstring>The limits of the bins. The default assigns the limits based on gridsize, x, y, xscale and yscale.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" arg_pos="12" name="alpha" port_type="basic:Float">
+      <docstring>the alpha value for the patches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" required="True" />
+    <inputPortSpec arg="hold" arg_pos="18" name="hold" />
+    <inputPortSpec arg="mincnt" arg_pos="16" name="mincnt">
+      <docstring>If not None, only display cells with more than mincnt number of points in the cell</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="marginals" arg_pos="17" name="marginals" port_type="basic:Boolean">
+      <docstring>if marginals is True, plot the marginal density as colormapped rectagles along the bottom of the x-axis and left of the y-axis</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bins" arg_pos="4" name="bins">
+      <docstring>If None, no binning is applied; the color of each hexagon directly corresponds to its count value.
+
+If 'log', use a logarithmic scale for the color map. Internally, log_{10}(i+1) is used to determine the hexagon color.
+
+If an integer, divide the counts in the specified number of bins, and color the hexagons accordingly.
+
+If a sequence of values, the values of the lower bound of the bins to be used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'log']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="scale" name="scale" port_type="basic:String">
+      <docstring>Use a linear or log10 scale on the vertical axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['linear', 'log']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hist" name="MplHist" superclass="MplPlot">
+    <docstring>Plot a histogram.
+
+Call signature:
+
+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, stacked=False,        **kwargs)
+
+Compute and draw the histogram of x. The return value is a tuple (n, bins, patches) or ([n0, n1, ...], bins, [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:
+
+
+
+kwargs are used to update the properties of the :class:`~matplotlib.patches.Patch` instances returned by hist:
+
+%(Patch)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="rwidth" arg_pos="10" name="rwidth">
+      <docstring>The relative width of the bars as a fraction of the bin width.  If None, automatically compute the width. Ignored if histtype = 'step' or 'stepfilled'.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="normed" arg_pos="3" name="normed" port_type="basic:Boolean">
+      <docstring>If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)*dbin).  In a probability density, the integral of the histogram should be 1; you can verify that with a trapezoidal integration of the probability density function:
+
+pdf, bins, patches = ax.hist(...) print np.sum(pdf * np.diff(bins))
+
+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</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="stacked" arg_pos="14" name="stacked" port_type="basic:Boolean">
+      <docstring>If True, multiple data are stacked on top of each other If False multiple data are aranged side by side if histtype is 'bar' or on top of each other if histtype is 'step'
+
+.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="orientation" arg_pos="9" name="orientation" port_type="basic:String">
+      <docstring>If 'horizontal', :func:`~matplotlib.pyplot.barh` will be used for bar-type histograms and the bottom kwarg will be the left edges.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['horizontal', 'vertical']]</values>
+      <defaults>['vertical']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="bottom" arg_pos="6" name="bottom" />
+    <inputPortSpec arg="color" arg_pos="12" name="colorSequence" port_type="basic:List">
+      <docstring>Color spec or sequence of color specs, one per dataset.  Default (None) uses the standard line color sequence.</docstring>
+      <translations>translate_color</translations>
+      <alternateSpec arg="" name="colorScalar" port_type="basic:Color" />
+    </inputPortSpec>
+    <inputPortSpec arg="histtype" arg_pos="7" name="histtype" port_type="basic:String">
+      <docstring>The type of histogram to draw.
+
+'bar' is a traditional bar-type histogram.  If multiple data are given the bars are aranged side by side.
+
+'barstacked' is a bar-type histogram where multiple data are stacked on top of each other.
+
+'step' generates a lineplot that is by default unfilled.
+
+'stepfilled' generates a lineplot that is by default filled.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['bar', 'barstacked', 'step', 'stepfilled']]</values>
+      <defaults>['bar']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="align" arg_pos="8" name="align" port_type="basic:String">
+      <docstring>Controls how the histogram is plotted.
+
+'left': bars are centered on the left bin edges.
+
+'mid': bars are centered between the bin edges.
+
+'right': bars are centered on the right bin edges.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['left', 'mid', 'right']]</values>
+      <defaults>['mid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cumulative" arg_pos="5" name="cumulative" port_type="basic:Boolean">
+      <docstring>If True, then a histogram is computed where each bin gives the counts in that bin plus all bins for smaller values. The last bin gives the total number of datapoints.  If normed is also True then the histogram is normalized such that the last bin equals 1. If cumulative evaluates to less than 0 (e.g. -1), the direction of accumulation is reversed.  In this case, if normed is also True, then the histogram is normalized such that the first bin equals 1.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="13" name="labelSequence" port_type="basic:List">
+      <docstring>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()</docstring>
+      <alternateSpec arg="" name="labelScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="range" arg_pos="2" name="range" port_type="basic:List">
+      <docstring>The lower and upper range of the bins. Lower and upper outliers 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 based on the specified bin range instead of the range of x.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="weights" arg_pos="4" name="weights">
+      <docstring>An array of weights, of the same shape as x.  Each value in x only contributes its associated weight towards the bin count (instead of 1).  If normed is True, the weights are normalized, so that the integral of the density over the range remains 1.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="15" name="hold" />
+    <inputPortSpec arg="bins" arg_pos="1" name="binsSequence" port_type="basic:List">
+      <docstring>Either an integer number of bins or a sequence giving the 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.</docstring>
+      <defaults>['10']</defaults>
+      <alternateSpec arg="" name="binsScalar" port_type="basic:Integer" />
+    </inputPortSpec>
+    <inputPortSpec arg="log" arg_pos="11" name="log" port_type="basic:Boolean">
+      <docstring>If True, the histogram axis will be set to a log scale. If log is True and x is a 1D array, empty bins will be filtered out and only the non-empty (n, bins, patches) will be returned.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hist2d" name="MplHist2d" superclass="MplPlot">
+    <docstring>Make a 2D histogram plot.
+
+Call signature:
+
+hist2d(x, y, bins = None, range=None, weights=None, cmin=None, cmax=None **kwargs)
+
+Make a 2d histogram plot of x versus y, where x, y are 1-D sequences of the same length.
+
+The return value is (counts, xedges, yedges, Image).
+
+Optional keyword arguments: bins: [None | int | [int, int] | array_like | [array, array]]
+
+The bin specification:
+
+If int, the number of bins for the two dimensions (nx=ny=bins).
+
+If [int, int], the number of bins in each dimension (nx, ny = bins).
+
+If array_like, the bin edges for the two dimensions (x_edges=y_edges=bins).
+
+If [array, array], the bin edges in each dimension (x_edges, y_edges = bins).
+
+The default value is 10.
+
+Remaining keyword arguments are passed directly to :meth:`pcolorfast`.
+
+Rendering the histogram with a logarithmic color scale is accomplished by passing a :class:`colors.LogNorm` instance to the norm keyword argument.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="normed" arg_pos="4" name="normed" port_type="basic:Boolean">
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmin" arg_pos="6" name="cmin" />
+    <inputPortSpec arg="range" arg_pos="3" name="range" />
+    <inputPortSpec arg="weights" arg_pos="5" name="weights" />
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="8" name="hold" />
+    <inputPortSpec arg="cmax" arg_pos="7" name="cmax" />
+    <inputPortSpec arg="bins" arg_pos="2" name="bins" port_type="basic:Integer">
+      <defaults>['10']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.hlines" name="MplHlines" superclass="MplPlot">
+    <docstring>Plot horizontal lines.
+
+call signature:
+
+hlines(y, xmin, xmax, colors='k', linestyles='solid', **kwargs)
+
+Plot horizontal lines at each y from xmin to xmax.
+
+Returns the :class:`~matplotlib.collections.LineCollection` that was added.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="linestyles" arg_pos="4" name="linestyles" port_type="basic:String">
+      <docstring>[ 'solid' | 'dashed' | 'dashdot' | 'dotted' ]</docstring>
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="5" name="label" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xmin" arg_pos="1" name="xmin" port_type="basic:Float" required="True">
+      <docstring>can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" arg_pos="3" name="colorsSequence" port_type="basic:List">
+      <docstring>a line collections color argument, either a single color or a len(y) list of colors</docstring>
+      <defaults>['k']</defaults>
+      <alternateSpec arg="" name="colorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="xmax" arg_pos="2" name="xmax" port_type="basic:Float" required="True">
+      <docstring>can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="0" name="y" port_type="basic:List" required="True">
+      <docstring>a 1-D numpy array or iterable.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.imshow" name="MplImshow" superclass="MplPlot">
+    <docstring>Display an image on the axes.
+
+Call signature:
+
+imshow(X, cmap=None, norm=None, aspect=None, interpolation=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 array, a uint8 array or a PIL image. If X is an array, X can have the following shapes:
+
+MxN -- luminance (grayscale, float array only)
+
+MxNx3 -- RGB (float or uint8 array)
+
+MxNx4 -- RGBA (float or uint8 array)
+
+The value for each component of MxNx3 and MxNx4 float arrays should be in the range 0.0 to 1.0; MxN float arrays may be normalised.
+
+An :class:`matplotlib.image.AxesImage` instance is returned.
+
+Keyword arguments:
+
+interpolation:
+
+Acceptable values are None, 'none', 'nearest', 'bilinear', '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 filterrad parameters
+
+If interpolation is 'none', then no interpolation is performed on the Agg, ps and pdf backends. Other backends will fall back to 'nearest'.
+
+Additional kwargs are :class:`~matplotlib.artist.Artist` properties:
+
+%(Artist)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" arg_pos="8" name="origin" />
+    <inputPortSpec arg="imlim" arg_pos="13" name="imlim" />
+    <inputPortSpec arg="extent" arg_pos="9" name="extent" />
+    <inputPortSpec arg="vmin" arg_pos="6" name="vmin" />
+    <inputPortSpec arg="url" arg_pos="15" name="url" />
+    <inputPortSpec arg="resample" arg_pos="14" name="resample" />
+    <inputPortSpec arg="shape" arg_pos="10" name="shape" />
+    <inputPortSpec arg="cmap" arg_pos="1" name="cmap" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance, eg. cm.jet. If None, default to rc image.cmap value.
+
+cmap is ignored when X has RGB(A) information</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="filterrad" arg_pos="12" name="filterrad" port_type="basic:Float">
+      <defaults>['4.0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="filternorm" arg_pos="11" name="filternorm" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="aspect" arg_pos="3" name="aspect">
+      <docstring>If 'auto', changes the image aspect ratio to match that of the axes
+
+If 'equal', and extent is None, changes the axes aspect ratio to match that of the image. If extent is not None, the axes aspect ratio is changed to match that of the extent.
+
+If None, default to rc image.aspect value.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'auto', 'equal']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" arg_pos="5" name="alpha" />
+    <inputPortSpec arg="vmax" arg_pos="7" name="vmax" />
+    <inputPortSpec arg="X" arg_pos="0" name="X" required="True" />
+    <inputPortSpec arg="hold" arg_pos="16" name="hold" />
+    <inputPortSpec arg="norm" arg_pos="2" name="norm" />
+    <inputPortSpec arg="interpolation" arg_pos="4" name="interpolation" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.loglog" name="MplLoglog" superclass="MplPlot">
+    <docstring>Make a plot with log scaling on both the x and y axis.
+
+Call signature:
+
+loglog(*args, **kwargs)
+
+:func:`~matplotlib.pyplot.loglog` supports all the keyword arguments of :func:`~matplotlib.pyplot.plot` and :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="nonposx" name="nonposx" port_type="basic:String">
+      <docstring>Non-positive values in x or y can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="nonposy" name="nonposy" port_type="basic:String">
+      <docstring>Non-positive values in x or y can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="basex" name="basex" port_type="basic:Float">
+      <docstring>Base of the x/y logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="basey" name="basey" port_type="basic:Float">
+      <docstring>Base of the x/y logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="subsx" name="subsxSequence" port_type="basic:List">
+      <docstring>The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="" name="subsxScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="subsy" name="subsySequence" port_type="basic:List">
+      <docstring>The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="" name="subsyScalar" port_type="basic:String" />
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.pcolor" name="MplPcolor" superclass="MplPlot">
+    <docstring>Create a pseudocolor plot of a 2-D array.
+
+Note: pcolor can be very slow for large arrays; consider using the similar but much faster :func:`~matplotlib.pyplot.pcolormesh` instead.
+
+Call signatures:
+
+pcolor(C, **kwargs) pcolor(X, Y, C, **kwargs)
+
+C is the array of color values.
+
+X and Y, if given, specify the (x, y) coordinates of the colored quadrilaterals; the quadrilateral for C[i,j] has corners at:
+
+(X[i,   j],   Y[i,   j]), (X[i,   j+1], Y[i,   j+1]), (X[i+1, j],   Y[i+1, j]), (X[i+1, j+1], Y[i+1, j+1]).
+
+Ideally the dimensions of X and Y should be one greater than those of C; if the dimensions are the same, then the last row and column of C will be ignored.
+
+Note that the the column index corresponds to the x-coordinate, and the row index corresponds to y; for details, see the :ref:`Grid Orientation <axes-pcolor-grid-orientation>` section below.
+
+If either or both of X and Y are 1-D arrays or column vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid.
+
+X, Y and C may be masked arrays.  If either C[i, j], or one of the vertices surrounding C[i,j] (X or Y at [i, j], [i+1, j], [i, j+1],[i+1, j+1]) is masked, nothing is plotted.
+
+Keyword arguments:
+
+
+
+Return value is a :class:`matplotlib.collections.Collection` instance.
+
+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, except that the Y axis is reversed.  That is, C is taken as C*(*y, x).
+
+Similarly for :func:`meshgrid`:
+
+x = np.arange(5) y = np.arange(3) X, Y = meshgrid(x,y)
+
+is equivalent to:
+
+X = array([[0, 1, 2, 3, 4],            [0, 1, 2, 3, 4],            [0, 1, 2, 3, 4]])  Y = array([[0, 0, 0, 0, 0],            [1, 1, 1, 1, 1],            [2, 2, 2, 2, 2]])
+
+so if you have:
+
+C = rand( len(x), len(y))
+
+then you need:
+
+pcolor(X, Y, C.T)
+
+or:
+
+pcolor(C.T)
+
+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.
+
+kwargs can be used to control the :class:`~matplotlib.collections.PolyCollection` properties:
+
+%(PolyCollection)s
+
+Note: the default antialiaseds is False if the default edgecolors*="none" is used.  This eliminates artificial lines at patch boundaries, and works regardless of the value of alpha.  If *edgecolors is not "none", then the default antialiaseds is taken from rcParams['patch.antialiased'], which defaults to True. Stroking the edges may be preferred if alpha is 1, but will cause artifacts otherwise.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolors" name="edgecolorsSequence" port_type="basic:List">
+      <docstring>If None, the rc setting is used by default.
+
+If 'none', edges will not be visible.
+
+An mpl color or sequence of colors will set the edge color</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'none', 'color']]</values>
+      <alternateSpec arg="" name="edgecolorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>the alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="shading" name="shading" port_type="basic:String">
+      <docstring>If 'faceted', a black grid is drawn around each rectangle; if 'flat', edges are not drawn. Default is 'flat', contrary to MATLAB.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['flat', 'faceted']]</values>
+      <defaults>['flat']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>An :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1. If None, defaults to :func:`normalize`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.pcolormesh" name="MplPcolormesh" superclass="MplPlot">
+    <docstring>Plot a quadrilateral mesh.
+
+Call signatures:
+
+pcolormesh(C) pcolormesh(X, Y, C) pcolormesh(C, **kwargs)
+
+Create a pseudocolor plot of a 2-D array.
+
+pcolormesh is similar to :func:`~matplotlib.pyplot.pcolor`, but uses a different mechanism and returns a different object; pcolor returns a :class:`~matplotlib.collections.PolyCollection` but pcolormesh returns a :class:`~matplotlib.collections.QuadMesh`.  It is much faster, so it is almost always preferred for large arrays.
+
+C may be a masked array, but X and Y may not.  Masked array support is implemented via cmap and norm; in contrast, :func:`~matplotlib.pyplot.pcolor` simply does not draw quadrilaterals with masked colors or vertices.
+
+Keyword arguments:
+
+
+
+Return value is a :class:`matplotlib.collections.QuadMesh` object.
+
+kwargs can be used to control the :class:`matplotlib.collections.QuadMesh` properties:
+
+%(QuadMesh)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="edgecolors" name="edgecolorsSequence" port_type="basic:List">
+      <docstring>If None, the rc setting is used by default.
+
+If 'None', edges will not be visible.
+
+If 'face', edges will have the same color as the faces.
+
+An mpl color or sequence of colors will set the edge color</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'None', 'face', 'color']]</values>
+      <alternateSpec arg="" name="edgecolorsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" name="vmin">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>the alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="vmax" name="vmax">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="shading" name="shading" port_type="basic:String">
+      <docstring>'flat' indicates a solid color for each quad.  When 'gouraud', each quad will be Gouraud shaded.  When gouraud shading, edgecolors is ignored.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['flat', 'gouraud']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>A :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1. If None, defaults to :func:`normalize`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.pie" name="MplPie" superclass="MplPlot">
+    <docstring>Plot a pie chart.
+
+Call signature:
+
+pie(x, explode=None, labels=None,     colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),     autopct=None, pctdistance=0.6, shadow=False,     labeldistance=1.1, startangle=None, radius=None)
+
+Make a pie chart of array x.  The fractional area of each wedge is given by x/sum(x).  If sum(x) <= 1, then the values of x give the fractional area directly and the array will not be normalized.  The wedges are plotted counterclockwise, by default starting from the x-axis.
+
+Keyword arguments:
+
+radius: [ None | scalar ] The radius of the pie, if radius is None it will be set to 1.
+
+The pie chart will probably look best if the figure and axes are square.  Eg.:
+
+figure(figsize=(8,8)) ax = axes([0.1, 0.1, 0.8, 0.8])
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="autopct" arg_pos="4" name="autopct" port_type="basic:String">
+      <docstring>If not None, is a string or function used to label the wedges with their numeric value.  The label will be placed inside the wedge.  If it is a format string, the label will be fmt%pct. If it is a function, it will be called.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'format function']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="pctdistance" arg_pos="5" name="pctdistance" port_type="basic:Float">
+      <docstring>The ratio between the center of each pie slice and the start of the text generated by autopct.  Ignored if autopct is None; default is 0.6.</docstring>
+      <defaults>['0.6']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="labels" arg_pos="2" name="labelsSequence" port_type="basic:List">
+      <docstring>A sequence of strings providing the labels for each wedge</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="" name="labelsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="explode" arg_pos="1" name="explodeSequence" port_type="basic:List">
+      <docstring>If not None, is a len(x) array which specifies the fraction of the radius with which to offset each wedge.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="" name="explodeScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="colors" arg_pos="3" name="colors" port_type="basic:Color">
+      <docstring>A sequence of matplotlib color args through which the pie chart will cycle.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <defaults>["('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w')"]</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="radius" arg_pos="9" name="radius" />
+    <inputPortSpec arg="startangle" arg_pos="8" name="startangle" port_type="basic:String">
+      <docstring>If not None, rotates the start of the pie chart by angle degrees counterclockwise from the x-axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Offset angle']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="shadow" arg_pos="6" name="shadow" port_type="basic:Boolean">
+      <docstring>Draw a shadow beneath the pie.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="hold" arg_pos="10" name="hold" />
+    <inputPortSpec arg="labeldistance" arg_pos="7" name="labeldistance" port_type="basic:Float">
+      <docstring>The radial distance at which the pie labels are drawn</docstring>
+      <defaults>['1.1']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.plot_date" name="MplPlotDate" superclass="MplPlot">
+    <docstring>Plot with data with dates.
+
+Call signature:
+
+plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, **kwargs)
+
+Similar to the :func:`~matplotlib.pyplot.plot` command, except the x or y (or both) data is considered to be dates, and the axis is labeled accordingly.
+
+x and/or y can be a sequence of dates represented as float days since 0001-01-01 UTC.
+
+Keyword arguments:
+
+
+
+Note if you are using custom date tickers and formatters, it may be necessary to set the formatters/locators after the call to :meth:`plot_date` since :meth:`plot_date` will set the default tick locator to :class:`matplotlib.dates.AutoDateLocator` (if the tick locator is not already set to a :class:`matplotlib.dates.DateLocator` instance) and the default tick formatter to :class:`matplotlib.dates.AutoDateFormatter` (if the tick formatter is not already set to a :class:`matplotlib.dates.D [...]
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="tz" arg_pos="3" name="tz" port_type="basic:String">
+      <docstring>The time zone to use in labeling dates. If None, defaults to rc value.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', ':class:`tzinfo` instance']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fmt" arg_pos="2" name="fmt" port_type="basic:String">
+      <docstring>The plot format string.</docstring>
+      <defaults>['bo']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="ydate" arg_pos="5" name="ydate" port_type="basic:Boolean">
+      <docstring>If True, the y-axis will be labeled with dates.</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xdate" arg_pos="4" name="xdate" port_type="basic:Boolean">
+      <docstring>If True, the x-axis will be labeled with dates.</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.psd" name="MplPsd" superclass="MplPlot">
+    <docstring>Plot the power spectral density.
+
+Call signature:
+
+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, **kwargs)
+
+The power spectral density by Welch's average periodogram method.  The vector x is divided into NFFT length segments.  Each segment is detrended by function detrend and windowed by function window.  noverlap gives the length of the overlap between segments.  The |\mathrm{fft}(i)|^2 of each segment i are averaged to compute Pxx, with a scaling to correct for power loss due to windowing.  Fs is the sampling frequency.
+
+%(PSD)s
+
+
+
+Returns the tuple (Pxx, freqs).
+
+For plotting, the power is plotted as 10\log_{10}(P_{xx}) for decibels, though Pxx itself is returned.
+
+kwargs control the :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="2" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="7" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="9" name="scale_by_freq" />
+    <inputPortSpec arg="detrend" arg_pos="4" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="5" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="3" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="1" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="10" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="8" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="6" name="noverlap" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.quiver" name="MplQuiver" superclass="MplPlot">
+    <docstring>Plot a 2-D field of arrows.
+
+call signatures:
+
+quiver(U, V, **kw) quiver(U, V, C, **kw) quiver(X, Y, U, V, **kw) quiver(X, Y, U, V, C, **kw)
+
+Arguments:
+
+
+
+All arguments may be 1-D or 2-D arrays or sequences. If X and Y are absent, they will be generated as a uniform grid.  If U and V are 2-D arrays but X and Y are 1-D, and if len(X) and len(Y) match the column and row dimensions of U, then X and Y will be expanded with :func:`numpy.meshgrid`.
+
+U, V, C may be masked arrays, but masked X, Y are not supported at present.
+
+Keyword arguments:
+
+
+
+The defaults give a slightly swept-back arrow; to make the head a triangle, make headaxislength the same as headlength. To make the arrow more pointed, reduce headwidth or increase headlength and headaxislength. To make the head smaller relative to the shaft, scale down all the head parameters. You will probably do best to leave minshaft alone.
+
+linewidths and edgecolors can be used to customize the arrow outlines. Additional :class:`~matplotlib.collections.PolyCollection` keyword arguments:
+
+agg_filter: unknown alpha: float or None animated: [True | False] antialiased or antialiaseds: Boolean or sequence of booleans array: unknown axes: an :class:`~matplotlib.axes.Axes` instance clim: a length 2 sequence of floats clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] cmap: a colormap or registered co [...]
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="headaxislength" name="headaxislength" port_type="basic:Float">
+      <docstring>Head length at shaft intersection, default is 4.5</docstring>
+      <defaults>['4.5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="C" name="C">
+      <docstring>An optional array used to map colors to the arrows</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scale" name="scale">
+      <docstring>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.  The arrow length unit is given by the scale_units parameter</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="width" name="width" port_type="basic:List">
+      <docstring>Shaft width in arrow units; default depends on choice of units, above, and number of vectors; a typical starting value is about 0.005 times the width of the plot.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="headlength" name="headlength" port_type="basic:Float">
+      <docstring>Head length as multiple of shaft width, default is 5</docstring>
+      <defaults>['5']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="minlength" name="minlength" port_type="basic:Float">
+      <docstring>Minimum length as a multiple of shaft width; if an arrow length is less than this, plot a dot (hexagon) of this diameter instead. Default is 1.</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="minshaft" name="minshaft" port_type="basic:Float">
+      <docstring>Length below which arrow scales, in units of head length. Do not set this to less than 1, or small arrows will look terrible! Default is 1</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pivot" name="pivot" port_type="basic:String">
+      <docstring>The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['tail', 'middle', 'tip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="units" name="unitsSequence" port_type="basic:List">
+      <docstring>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".</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['width', 'height', 'dots', 'inches', 'x', 'y', 'xy']]</values>
+      <alternateSpec arg="" name="unitsScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="headwidth" name="headwidth" port_type="basic:Float">
+      <docstring>Head width as multiple of shaft width, default is 3</docstring>
+      <defaults>['3']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="U" name="U" port_type="basic:List">
+      <docstring>Give the x and y components of the arrow vectors</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="angles" name="angles" port_type="basic:String">
+      <docstring>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 CCW from the x-axis. With 'xy', the arrow points from (x,y) to (x+u, y+v). Alternatively, arbitrary angles may be specified as an array of values in degrees, CCW from the x-axis.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['uv', 'xy', 'array']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="V" name="V" port_type="basic:List">
+      <docstring>Give the x and y components of the arrow vectors</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" name="Y" port_type="basic:String">
+      <docstring>The x and y coordinates of the arrow locations (default is tail of arrow; see pivot kwarg)</docstring>
+      <defaults>['tail']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="X" name="X" port_type="basic:String">
+      <docstring>The x and y coordinates of the arrow locations (default is tail of arrow; see pivot kwarg)</docstring>
+      <defaults>['tail']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="scale_units" name="scale_units" port_type="basic:List">
+      <docstring>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".</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="color" name="colorSequence" port_type="basic:List">
+      <docstring>This is a synonym for the :class:`~matplotlib.collections.PolyCollection` facecolor kwarg. If C has been set, color has no effect.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['color']]</values>
+      <alternateSpec arg="" name="colorScalar" port_type="basic:String" />
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.quiverkey" name="MplQuiverkey" superclass="MplPlot">
+    <docstring>Add a key to a quiver plot.
+
+Call signature:
+
+quiverkey(Q, X, Y, U, label, **kw)
+
+Arguments:
+
+
+
+Keyword arguments:
+
+
+
+Any additional keyword arguments are used to override vector properties taken from Q.
+
+The positioning of the key depends on X, Y, coordinates, and labelpos.  If labelpos is 'N' or 'S', X, Y give the position of the middle of the key arrow.  If labelpos is 'E', X, Y positions the head, and if labelpos is 'W', X, Y positions the tail; in either of these two cases, X, Y is somewhere in the middle of the arrow+label key object.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="color" name="color" port_type="basic:Color">
+      <docstring>overrides face and edge colors from Q.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="coordinates" name="coordinatesSequence" port_type="basic:List">
+      <docstring>Coordinate system and units for X, Y: 'axes' and 'figure' are normalized coordinate systems with 0,0 in the lower left and 1,1 in the upper right; 'data' are the axes data coordinates (used for the locations of the vectors in the quiver plot itself); 'inches' is position in the figure in inches, with 0,0 at the lower left corner.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['axes', 'figure', 'data', 'inches']]</values>
+      <alternateSpec arg="" name="coordinatesScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="4" name="label" port_type="basic:String" required="True">
+      <docstring>A string with the length and units of the key</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Q" arg_pos="0" name="Q" required="True">
+      <docstring>The Quiver instance returned by a call to quiver.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelcolor" name="labelcolor" port_type="basic:Color">
+      <docstring>defaults to default :class:`~matplotlib.text.Text` color.</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+    <inputPortSpec arg="fontproperties" name="fontproperties">
+      <docstring>A dictionary with keyword arguments accepted by the :class:`~matplotlib.font_manager.FontProperties` initializer: family, style, variant, size, weight</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="U" arg_pos="3" name="U" required="True">
+      <docstring>The length of the key</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelpos" name="labelpos" port_type="basic:String">
+      <docstring>Position the label above, below, to the right, to the left of the arrow, respectively.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['N', 'S', 'E', 'W']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" arg_pos="2" name="Y" required="True">
+      <docstring>The location of the key; additional explanation follows.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="X" arg_pos="1" name="X" required="True">
+      <docstring>The location of the key; additional explanation follows.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelsep" name="labelsep" port_type="basic:Float">
+      <docstring>Distance in inches between the arrow and the label.  Default is 0.1</docstring>
+      <defaults>['0.1']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.scatter" name="MplScatter" superclass="MplPlot">
+    <docstring>Make a scatter plot.
+
+Call signatures:
+
+scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,         vmin=None, vmax=None, alpha=None, linewidths=None,         verts=None, **kwargs)
+
+Make a scatter plot of x versus y, where x, y are converted to 1-D sequences which must be of the same length, N.
+
+Keyword arguments:
+
+
+
+Any or all of x, y, s, and c may be masked arrays, in which case all masks will be combined and only unmasked points will be plotted.
+
+Other keyword arguments: the color mapping and normalization arguments will be used only if c is an array of floats.
+
+
+
+Optional kwargs control the :class:`~matplotlib.collections.Collection` properties; in particular:
+
+
+
+Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs:
+
+%(Collection)s
+
+A :class:`~matplotlib.collections.Collection` instance is returned.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="vmax" arg_pos="8" name="vmax">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="edgecolors" name="edgecolors" port_type="basic:String">
+      <docstring>The string 'none' to plot faces with no outlines</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="c" arg_pos="3" name="cSequence" port_type="basic:List">
+      <docstring>a color. c can be a single color format string, or a sequence of color specifications of length N, or a sequence of N numbers to be mapped to colors using the cmap and norm specified via kwargs (see below). Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped.  c can be a 2-D array in which the rows are RGB or RGBA, however.</docstring>
+      <defaults>['b']</defaults>
+      <alternateSpec arg="" name="cScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="vmin" arg_pos="7" name="vmin">
+      <docstring>vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="faceted" arg_pos="11" name="faceted" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" arg_pos="10" name="linewidths">
+      <docstring>If None, defaults to (lines.linewidth,).  Note that this is a tuple, and if you set the linewidths argument you must set it as a sequence of floats, as required by :class:`~matplotlib.collections.RegularPolyCollection`.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="marker" arg_pos="4" name="marker" port_type="basic:String">
+      <docstring>can be one of:
+
+%(MarkerTable)s</docstring>
+      <defaults>['o']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="s" arg_pos="2" name="s" port_type="basic:Float">
+      <docstring>size in points^2.  It is a scalar or an array of the same length as x and y.</docstring>
+      <defaults>['20']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="5" name="cmap">
+      <docstring>A :class:`matplotlib.colors.Colormap` instance or registered name. If None, defaults to rc image.cmap. cmap is only used if c is an array of floats.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="verts" arg_pos="12" name="verts" />
+    <inputPortSpec arg="alpha" arg_pos="9" name="alpha" port_type="basic:Float">
+      <docstring>The alpha value for the patches</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="13" name="hold" />
+    <inputPortSpec arg="facecolors" name="facecolors" port_type="basic:String">
+      <docstring>The string 'none' to plot unfilled outlines</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" arg_pos="6" name="norm">
+      <docstring>A :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0, 1. If None, use the default :func:`normalize`. norm is only used if c is an array of floats.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.semilogx" name="MplSemilogx" superclass="MplPlot">
+    <docstring>Make a plot with log scaling on the x axis.
+
+Call signature:
+
+semilogx(*args, **kwargs)
+
+:func:`semilogx` supports all the keyword arguments of :func:`~matplotlib.pyplot.plot` and :meth:`matplotlib.axes.Axes.set_xscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="basex" name="basex" port_type="basic:Float">
+      <docstring>Base of the x logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nonposx" name="nonposx" port_type="basic:String">
+      <docstring>Non-positive values in x can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="subsx" name="subsxSequence" port_type="basic:List">
+      <docstring>The location of the minor xticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_xscale` for details.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="" name="subsxScalar" port_type="basic:String" />
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.semilogy" name="MplSemilogy" superclass="MplPlot">
+    <docstring>Make a plot with log scaling on the y axis.
+
+call signature:
+
+semilogy(*args, **kwargs)
+
+:func:`semilogy` supports all the keyword arguments of :func:`~matplotlib.pylab.plot` and :meth:`matplotlib.axes.Axes.set_yscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="basey" name="basey" port_type="basic:Float">
+      <docstring>Base of the y logarithm</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nonposy" name="nonposy" port_type="basic:String">
+      <docstring>Non-positive values in y can be masked as invalid, or clipped to a very small positive number</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['mask', 'clip']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="subsy" name="subsySequence" port_type="basic:List">
+      <docstring>The location of the minor yticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_yscale` for details.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+      <alternateSpec arg="" name="subsyScalar" port_type="basic:String" />
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.specgram" name="MplSpecgram" superclass="MplPlot">
+    <docstring>Plot a spectrogram.
+
+Call signature:
+
+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, **kwargs)
+
+Compute a spectrogram of data in x.  Data are split into NFFT length segments and the PSD of each section is computed.  The windowing function window is applied to each segment, and the amount of overlap of each segment is specified with noverlap.
+
+%(PSD)s
+
+kwargs:
+
+Additional kwargs are passed on to imshow which makes the specgram image
+
+Return value is (Pxx, freqs, bins, im):
+
+bins are the time points the spectrogram is calculated over
+
+freqs is an array of frequencies
+
+Pxx is an array of shape (len(times), len(freqs)) of power
+
+im is a :class:`~matplotlib.image.AxesImage` instance
+
+Note: If x is real (i.e. non-complex), only the positive spectrum is shown.  If x is complex, both positive and negative parts of the spectrum are shown.  This can be overridden using the sides keyword argument.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="Fs" arg_pos="2" name="Fs" port_type="basic:Integer">
+      <defaults>['2']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pad_to" arg_pos="9" name="pad_to" />
+    <inputPortSpec arg="scale_by_freq" arg_pos="11" name="scale_by_freq" />
+    <inputPortSpec arg="xextent" arg_pos="8" name="xextent" />
+    <inputPortSpec arg="detrend" arg_pos="4" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="window" arg_pos="5" name="window">
+      <defaults>['<function window_hanning at 0x02F5A2B0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="Fc" arg_pos="3" name="Fc" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="NFFT" arg_pos="1" name="NFFT" port_type="basic:Integer">
+      <defaults>['256']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="7" name="cmap" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="12" name="hold" />
+    <inputPortSpec arg="sides" arg_pos="10" name="sides" port_type="basic:String">
+      <defaults>['default']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="noverlap" arg_pos="6" name="noverlap" port_type="basic:Integer">
+      <defaults>['128']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.stackplot" name="MplStackplot" superclass="MplPlot">
+    <docstring>Draws a stacked area plot.
+
+x : 1d array of dimension N
+
+Keyword arguments:
+
+Returns r : A list of :class:`~matplotlib.collections.PolyCollection`, one for each element in the stacked area plot.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="x" arg_pos="0" name="x" required="True" />
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>used to colour the stacked areas. All other keyword arguments are passed to :func:`~matplotlib.Axes.fill_between`</docstring>
+      <translations>translate_color</translations>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.stem" name="MplStem" superclass="MplPlot">
+    <docstring>Create a stem plot.
+
+Call signature:
+
+stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-')
+
+A stem plot plots vertical lines (using linefmt) at each x location from the baseline to y, and places a marker there using markerfmt.  A horizontal line at 0 is is plotted using basefmt.
+
+Return value is a tuple (markerline, stemlines, baseline).
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="bottom" arg_pos="5" name="bottom" />
+    <inputPortSpec arg="label" arg_pos="6" name="label" />
+    <inputPortSpec arg="linefmt" arg_pos="2" name="linefmt" port_type="basic:String">
+      <defaults>['b-']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="markerfmt" arg_pos="3" name="markerfmt" port_type="basic:String">
+      <defaults>['bo']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="7" name="hold" />
+    <inputPortSpec arg="basefmt" arg_pos="4" name="basefmt" port_type="basic:String">
+      <defaults>['r-']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.step" name="MplStep" superclass="MplPlot">
+    <docstring>Make a step plot.
+
+Call signature:
+
+step(x, y, *args, **kwargs)
+
+Additional keyword args to :func:`step` are the same as those for :func:`~matplotlib.pyplot.plot`.
+
+x and y must be 1-D sequences, and it is assumed, but not checked, that x is uniformly increasing.
+
+Keyword arguments:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="where" name="where" port_type="basic:String">
+      <docstring>If 'pre', the interval from x[i] to x[i+1] has level y[i+1]
+
+If 'post', that interval has level y[i]
+
+If 'mid', the jumps in y occur half-way between the x-values.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['pre', 'post', 'mid']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.streamplot" name="MplStreamplot" superclass="MplPlot">
+    <docstring>Draws streamlines of a vector flow.
+
+Returns:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="13" name="hold" />
+    <inputPortSpec arg="arrowstyle" arg_pos="10" name="arrowstyle" port_type="basic:String">
+      <defaults>['-|>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="density" arg_pos="4" name="density" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="6" name="color" />
+    <inputPortSpec arg="minlength" arg_pos="11" name="minlength" port_type="basic:Float">
+      <defaults>['0.1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="transform" arg_pos="12" name="transform" />
+    <inputPortSpec arg="arrowsize" arg_pos="9" name="arrowsize" port_type="basic:Integer">
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" arg_pos="7" name="cmap" />
+    <inputPortSpec arg="u" arg_pos="2" name="u" required="True" />
+    <inputPortSpec arg="v" arg_pos="3" name="v" required="True" />
+    <inputPortSpec arg="y" arg_pos="1" name="y" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" required="True" />
+    <inputPortSpec arg="linewidth" arg_pos="5" name="linewidth" />
+    <inputPortSpec arg="norm" arg_pos="8" name="norm" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.tricontour" name="MplTricontour" superclass="MplPlot">
+    <docstring>Draw contours on an unstructured triangular grid. :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and filled contours, respectively.  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=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:
+
+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.
+
+tricontour-only keyword arguments:
+
+
+
+tricontourf-only keyword arguments:
+
+
+
+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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>enable antialiasing</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.tricontourf" name="MplTricontourf" superclass="MplPlot">
+    <docstring>Draw contours on an unstructured triangular grid. :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and filled contours, respectively.  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=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:
+
+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.
+
+tricontour-only keyword arguments:
+
+
+
+tricontourf-only keyword arguments:
+
+
+
+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:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="origin" name="origin" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'upper', 'lower', 'image']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="linestyles" name="linestyles" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'solid', 'dashed', 'dashdot', 'dotted']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="levels" name="levelsSequence" port_type="basic:List">
+      <docstring>A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]</docstring>
+      <alternateSpec arg="" name="levelsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="linewidths" name="linewidths" port_type="basic:String">
+      <docstring>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</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'number', 'tuple of numbers']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" name="colors" port_type="basic:Color">
+      <docstring>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.</docstring>
+      <translations>translate_color</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['', '(mpl_colors)']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="cmap" name="cmap" port_type="basic:String">
+      <docstring>A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Colormap']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="antialiased" name="antialiased" port_type="basic:Boolean">
+      <docstring>enable antialiasing</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="nchunk" name="nchunk" port_type="basic:Integer">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[[0]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="alpha" name="alpha" port_type="basic:Float">
+      <docstring>The alpha blending value</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="norm" name="norm" port_type="basic:String">
+      <docstring>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.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'Normalize']]</values>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.tripcolor" name="MplTripcolor" superclass="MplPlot">
+    <docstring>Create a pseudocolor plot of an unstructured triangular grid.
+
+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=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, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg facecolors*=C instead of just *C.
+
+shading may be 'flat' (the default) or 'gouraud'. If shading is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If shading is 'gouraud' then color values must be defined at points.  shading of 'faceted' is deprecated; please use edgecolors instead.
+
+The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`.
+
+Example:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.triplot" name="MplTriplot" superclass="MplPlot">
+    <docstring>Draw a unstructured triangular grid as lines and/or markers.
+
+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=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:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.vlines" name="MplVlines" superclass="MplPlot">
+    <docstring>Plot vertical lines.
+
+Call signature:
+
+vlines(x, ymin, ymax, color='k', linestyles='solid')
+
+Plot vertical lines at each x from ymin to ymax.  ymin or ymax can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the heights of the lines are determined by ymin and ymax.
+
+linestyles : [ 'solid' | 'dashed' | 'dashdot' | 'dotted' ]
+
+Returns the :class:`matplotlib.collections.LineCollection` that was added.
+
+kwargs are :class:`~matplotlib.collections.LineCollection` properties:
+
+%(LineCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+    <inputPortSpec arg="ymax" arg_pos="2" name="ymax" required="True" />
+    <inputPortSpec arg="linestyles" arg_pos="4" name="linestyles" port_type="basic:String">
+      <defaults>['solid']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="color" arg_pos="3" name="color" port_type="basic:String">
+      <defaults>['k']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="label" arg_pos="5" name="label" port_type="basic:String">
+      <defaults>['']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="colors" arg_pos="3" name="colors" port_type="basic:String">
+      <defaults>['k']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="ymin" arg_pos="1" name="ymin" required="True" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.xcorr" name="MplXcorr" superclass="MplPlot">
+    <docstring>Plot the cross correlation between x and y.
+
+Call signature:
+
+xcorr(self, x, y, normed=True, detrend=mlab.detrend_none,   usevlines=True, maxlags=10, **kwargs)
+
+If normed = True, normalize the data by the cross correlation at 0-th lag.  x and y are detrended by the detrend callable (default no normalization).  x and y must be equal length.
+
+Data are plotted as plot(lags, c, **kwargs)
+
+Return value is a tuple (lags, c, line) where:
+
+lags are a length 2*maxlags+1 lag vector
+
+c is the 2*maxlags+1 auto correlation vector
+
+The default linestyle is None and the default marker is 'o', though these can be overridden with keyword args.  The cross correlation is performed with :func:`numpy.correlate` with mode = 2.
+
+If usevlines is True:
+
+:func:`~matplotlib.pyplot.vlines` rather than :func:`~matplotlib.pyplot.plot` is used to draw vertical lines from the origin to the xcorr.  Otherwise the plotstyle is determined by the kwargs, which are :class:`~matplotlib.lines.Line2D` properties.
+
+The return value is a tuple (lags, c, linecol, b) where linecol is the :class:`matplotlib.collections.LineCollection` instance and b is the x-axis.
+
+maxlags is a positive integer detailing the number of lags to show. The default value of None will return all (2*len(x)-1) lags.
+
+Example:
+
+:func:`~matplotlib.pyplot.xcorr` is top graph, and :func:`~matplotlib.pyplot.acorr` is bottom graph.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="normed" arg_pos="2" name="normed" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="usevlines" arg_pos="4" name="usevlines" port_type="basic:Boolean">
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="detrend" arg_pos="3" name="detrend">
+      <defaults>['<function detrend_none at 0x02F5A3F0>']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="maxlags" arg_pos="5" name="maxlags" port_type="basic:Integer">
+      <defaults>['10']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="y" arg_pos="1" name="y" port_type="basic:List" required="True" />
+    <inputPortSpec arg="x" arg_pos="0" name="x" port_type="basic:List" required="True" />
+    <inputPortSpec arg="hold" arg_pos="6" name="hold" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.barbs" name="MplBarbs" superclass="MplPlot">
+    <docstring>Plot a 2-D field of barbs.
+
+Call signatures:
+
+barb(U, V, **kw) barb(U, V, C, **kw) barb(X, Y, U, V, **kw) barb(X, Y, U, V, C, **kw)
+
+Arguments:
+
+
+
+All arguments may be 1-D or 2-D arrays or sequences. If X and Y are absent, they will be generated as a uniform grid.  If U and V are 2-D arrays but X and Y are 1-D, and if len(X) and len(Y) match the column and row dimensions of U, then X and Y will be expanded with :func:`numpy.meshgrid`.
+
+U, V, C may be masked arrays, but masked X, Y are not supported at present.
+
+Keyword arguments:
+
+
+
+Barbs are traditionally used in meteorology as a way to plot the speed and direction of wind observations, but can technically be used to plot any two dimensional vector quantity.  As opposed to arrows, which give vector magnitude by the length of the arrow, the barbs give more quantitative information about the vector magnitude by putting slanted lines or a triangle for various increments in magnitude, as show schematically below:
+
+:     /\    \ :    /  \    \ :   /    \    \    \ :  /      \    \    \ : ------------------------------
+
+note the double \ at the end of each line to make the figure
+
+render correctly
+
+The largest increment is given by a triangle (or "flag"). After those come full lines (barbs). The smallest increment is a half line.  There is only, of course, ever at most 1 half line.  If the magnitude is small and only needs a single half-line and no full lines or triangles, the half-line is offset from the end of the barb so that it can be easily distinguished from barbs with a single full line.  The magnitude for the barb shown above would nominally be 65, using the standard increm [...]
+
+linewidths and edgecolors can be used to customize the barb. Additional :class:`~matplotlib.collections.PolyCollection` keyword arguments:
+
+agg_filter: unknown alpha: float or None animated: [True | False] antialiased or antialiaseds: Boolean or sequence of booleans array: unknown axes: an :class:`~matplotlib.axes.Axes` instance clim: a length 2 sequence of floats clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] cmap: a colormap or registered co [...]
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="barbcolor" name="barbcolorSequence" port_type="basic:List">
+      <docstring>Specifies the color all parts of the barb except any flags.  This parameter is analagous to the edgecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['color']]</values>
+      <alternateSpec arg="" name="barbcolorScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="C" name="C">
+      <docstring>An optional array used to map colors to the barbs</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="sizes" name="sizes">
+      <docstring>A dictionary of coefficients specifying the ratio of a given feature to the length of the barb. Only those values one wishes to override need to be included.  These features include:
+
+'spacing' - space between features (flags, full/half barbs)
+
+'height' - height (distance from shaft to top) of a flag or full barb
+
+'width' - width of a flag, twice the width of a full barb
+
+'emptybarb' - radius of the circle used for low magnitudes</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="rounding" name="rounding" port_type="basic:Boolean">
+      <docstring>A flag to indicate whether the vector magnitude should be rounded when allocating barb components.  If True, the magnitude is rounded to the nearest multiple of the half-barb increment.  If False, the magnitude is simply truncated to the next lowest multiple.  Default is True</docstring>
+      <defaults>['True']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="pivot" name="pivot" port_type="basic:String">
+      <docstring>The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot.  Default is 'tip'</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['tip', 'middle']]</values>
+      <defaults>['tip']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="flip_barb" name="flip_barb" port_type="basic:Boolean">
+      <docstring>Either a single boolean flag or an array of booleans.  Single boolean indicates whether the lines and flags should point opposite to normal for all barbs.  An array (which should be the same size as the other data arrays) indicates whether to flip for each individual barb.  Normal behavior is for the barbs and lines to point right (comes from wind barbs having these features point towards low pressure in the Northern Hemisphere.)  Default is False</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="length" name="length" port_type="basic:Integer">
+      <docstring>Length of the barb in points; the other parts of the barb are scaled against this. Default is 9</docstring>
+      <defaults>['9']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="barb_increments" name="barb_increments" port_type="basic:String">
+      <docstring>A dictionary of increments specifying values to associate with different parts of the barb. Only those values one wishes to override need to be included.
+
+'half' - half barbs (Default is 5)
+
+'full' - full barbs (Default is 10)
+
+'flag' - flags (default is 50)</docstring>
+      <defaults>['5)']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="U" name="U">
+      <docstring>Give the x and y components of the barb shaft</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="V" name="V">
+      <docstring>Give the x and y components of the barb shaft</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="Y" name="Y" port_type="basic:String">
+      <docstring>The x and y coordinates of the barb locations (default is head of barb; see pivot kwarg)</docstring>
+      <defaults>['head']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="X" name="X" port_type="basic:String">
+      <docstring>The x and y coordinates of the barb locations (default is head of barb; see pivot kwarg)</docstring>
+      <defaults>['head']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="flagcolor" name="flagcolorSequence" port_type="basic:List">
+      <docstring>Specifies the color of any flags on the barb.  This parameter is analagous to the facecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.  If this is not set (and C has not either) then flagcolor will be set to match barbcolor so that the barb has a uniform color. If C has been set, flagcolor has no effect.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['color']]</values>
+      <alternateSpec arg="" name="flagcolorScalar" port_type="basic:String" />
+    </inputPortSpec>
+    <inputPortSpec arg="fill_empty" name="fill_empty" port_type="basic:Boolean">
+      <docstring>A flag on whether the empty barbs (circles) that are drawn should be filled with the flag color.  If they are not filled, they will be drawn such that no color is applied to the center.  Default is False</docstring>
+      <defaults>['False']</defaults>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.spy" name="MplSpy" superclass="MplPlot">
+    <docstring>Plot the sparsity pattern on a 2-D array.
+
+Call signature:
+
+spy(Z, precision=0, marker=None, markersize=None,     aspect='equal', **kwargs)
+
+spy(Z) plots the sparsity pattern of the 2-D array Z.
+
+If precision is 0, any non-zero value will be plotted; else, values of |Z| > precision will be plotted.
+
+For :class:`scipy.sparse.spmatrix` instances, there is a special case: if precision is 'present', any value present in the array will be plotted, even if it is identically zero.
+
+The array will be plotted as it would be printed, with the first index (row) increasing down and the second index (column) increasing to the right.
+
+By default aspect is 'equal', so that each array element occupies a square space; set the aspect kwarg to 'auto' to allow the plot to fill the plot box, or to any scalar number to specify the aspect ratio of an array element directly.
+
+Two plotting styles are available: image or marker. Both are available for full arrays, but only the marker style works for :class:`scipy.sparse.spmatrix` instances.
+
+If marker and markersize are None, an image will be returned and any remaining kwargs are passed to :func:`~matplotlib.pyplot.imshow`; else, a :class:`~matplotlib.lines.Line2D` object will be returned with the value of marker determining the marker type, and any remaining kwargs passed to the :meth:`~matplotlib.axes.Axes.plot` method.
+
+If marker and markersize are None, useful kwargs include:
+
+cmap
+
+alpha
+
+For controlling colors, e.g. cyan background and red marks, use:
+
+cmap = mcolors.ListedColormap(['c','r'])
+
+If marker or markersize is not None, useful kwargs include:
+
+marker
+
+markersize
+
+color
+
+Useful values for marker include:
+
+'s'  square (default)
+
+'o'  circle
+
+'.'  point
+
+','  pixel
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="hold" arg_pos="5" name="hold" />
+    <inputPortSpec arg="markersize" arg_pos="3" name="markersize" />
+    <inputPortSpec arg="precision" arg_pos="1" name="precision" port_type="basic:Integer">
+      <defaults>['0']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="aspect" arg_pos="4" name="aspect" port_type="basic:String">
+      <defaults>['equal']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="marker" arg_pos="2" name="marker" />
+    <inputPortSpec arg="Z" arg_pos="0" name="Z" required="True" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.polar" name="MplPolar" superclass="MplPlot">
+    <docstring>Make a polar plot.
+
+call signature:
+
+polar(theta, r, **kwargs)
+
+Multiple theta, r arguments are supported, with format strings, as in :func:`~matplotlib.pyplot.plot`.</docstring>
+    <inputPortSpec arg="theta" arg_pos="0" name="theta" required="True" />
+    <inputPortSpec arg="r" arg_pos="1" name="r" required="True" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.legend" name="MplLegend" superclass="MplPlot">
+    <docstring>Place a legend on the current axes.
+
+Call signature:
+
+legend(*args, **kwargs)
+
+Places legend at location loc.  Labels are a sequence of strings and loc can be a string or an integer specifying the legend location.
+
+To make a legend with existing lines:
+
+legend()
+
+:meth:`legend` by itself will try and build a legend using the label property of the lines/patches/collections.  You can set the label of a line by doing:
+
+plot(x, y, label='my data')
+
+or:
+
+line.set_label('my data').
+
+If label is set to '_nolegend_', the item will not be shown in legend.
+
+To automatically generate the legend from labels:
+
+legend( ('label1', 'label2', 'label3') )
+
+To make a legend for a list of lines and labels:
+
+legend( (line1, line2, line3), ('label1', 'label2', 'label3') )
+
+To make a legend at a given location, using a location argument:
+
+legend( ('label1', 'label2', 'label3'), loc='upper left')
+
+or:
+
+legend( (line1, line2, line3),  ('label1', 'label2', 'label3'), loc=2)
+
+The location codes are
+
+
+
+Users can specify any arbitrary location for the legend using the bbox_to_anchor keyword argument. bbox_to_anchor can be an instance of BboxBase(or its derivatives) or a tuple of 2 or 4 floats. For example,
+
+loc = 'upper right', bbox_to_anchor = (0.5, 0.5)
+
+will place the legend so that the upper right corner of the legend at the center of the axes.
+
+The legend location can be specified in other coordinate, by using the bbox_transform keyword.
+
+The loc itslef can be a 2-tuple giving x,y of the lower-left corner of the legend in axes coords (bbox_to_anchor is ignored).
+
+Keyword arguments:
+
+fontsize: [ size in points | 'xx-small' | 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'xx-large' ]
+
+Set the font size.  May be either a size string, relative to the default font size, or an absolute font size in points. This argument is only used if prop is not specified.
+
+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.
+
+Not all kinds of artist are supported by the legend command. See LINK (FIXME) for details.
+
+Example:</docstring>
+    <inputPortSpec arg="loc" name="loc">
+      <translations>{'right': 5, 'center': 10, 'lower left': 3, 'center right': 7, 'upper left': 2, 'center left': 6, 'upper right': 1, 'lower right': 4, 'upper center': 9, 'lower center': 8, 'best': 0}</translations>
+      <entry_types>['enum']</entry_types>
+      <values>[['best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="fancybox" name="fancybox">
+      <docstring>if True, draw a frame with a round fancybox.  If None, use rc settings</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_to_anchor" name="bbox_to_anchor">
+      <docstring>the bbox that the legend will be anchored.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="title" name="title">
+      <docstring>the legend title</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="handlelength" name="handlelength">
+      <docstring>the length of the legend handles</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="markerscale" name="markerscale">
+      <docstring>The relative size of legend markers vs. original. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="numpoints" name="numpoints" port_type="basic:Integer">
+      <docstring>The number of points in the legend for line</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="labelspacing" name="labelspacing">
+      <docstring>the vertical space between the legend entries</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scatterpoints" name="scatterpoints" port_type="basic:Integer">
+      <docstring>The number of points in the legend for scatter plot</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="frameon" name="frameon" port_type="basic:Boolean">
+      <docstring>if True, draw a frame around the legend. The default is set by the rcParam 'legend.frameon'</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="columnspacing" name="columnspacing">
+      <docstring>the spacing between columns</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="handletextpad" name="handletextpad">
+      <docstring>the pad between the legend handle and text</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="scatteroffsets" name="scatteroffsetsSequence" port_type="basic:List">
+      <docstring>a list of yoffsets for scatter symbols in legend</docstring>
+      <alternateSpec arg="" name="scatteroffsetsScalar" port_type="basic:Float" />
+    </inputPortSpec>
+    <inputPortSpec arg="mode" name="mode">
+      <docstring>if mode is "expand", the legend will be horizontally expanded to fill the axes area (or bbox_to_anchor)</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="ncol" name="ncol" port_type="basic:Integer">
+      <docstring>number of columns. default is 1</docstring>
+      <defaults>['1']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="shadow" name="shadow">
+      <docstring>If True, draw a shadow behind legend. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['']]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="prop" name="prop" port_type="basic:String">
+      <docstring>A :class:`matplotlib.font_manager.FontProperties` instance. If prop is a dictionary, a new instance will be created with prop. If None, use rc settings.</docstring>
+      <entry_types>['enum']</entry_types>
+      <values>[['', 'FontProperties', None]]</values>
+    </inputPortSpec>
+    <inputPortSpec arg="borderpad" name="borderpad">
+      <docstring>the fractional whitespace inside the legend border</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="bbox_transform" name="bbox_transform">
+      <docstring>the transform for the bbox. transAxes if None.</docstring>
+    </inputPortSpec>
+    <inputPortSpec arg="borderaxespad" name="borderaxespad">
+      <docstring>the pad between the axes and legend border</docstring>
+    </inputPortSpec>
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.annotate" name="MplAnnotate" superclass="MplPlot">
+    <docstring>Create an annotation: a piece of text referring to a data point.
+
+Call signature:
+
+annotate(s, xy, xytext=None, xycoords='data',          textcoords='data', arrowprops=None, **kwargs)
+
+Keyword arguments:
+
+Annotate the x, y point xy with text s at x, y location xytext.  (If xytext = None, defaults to xy, and if textcoords = None, defaults to xycoords).
+
+arrowprops, if not None, is a dictionary of line properties (see :class:`matplotlib.lines.Line2D`) for the arrow that connects annotation to the point.
+
+If the dictionary has a key arrowstyle, a FancyArrowPatch instance is created with the given dictionary and is drawn. Otherwise, a YAArow patch instance is created and drawn. Valid keys for YAArow are
+
+Valid keys for FancyArrowPatch are
+
+xycoords and textcoords are strings that indicate the coordinates of xy and xytext.
+
+If a 'points' or 'pixels' option is specified, values will be added to the bottom-left and if negative, values will be subtracted from the top-right.  Eg:
+
+# 10 points to the right of the left border of the axes and # 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 annotation will only be drawn when the xy is inside the axes. If False, the annotation will always be drawn regardless of its position.  The default is None, which behave as True only if xycoords is"data".
+
+Additional kwargs are Text properties:
+
+%(Text)s</docstring>
+    <inputPortSpec arg="xycoords" arg_pos="3" name="xycoords" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+      <defaults>['data']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="xytext" arg_pos="2" name="xytext" />
+    <inputPortSpec arg="s" arg_pos="0" name="s" required="True" />
+    <inputPortSpec arg="xy" arg_pos="1" name="xy" required="True" />
+    <inputPortSpec arg="textcoords" arg_pos="4" name="textcoords" port_type="basic:String">
+      <entry_types>['enum']</entry_types>
+      <values>[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]</values>
+      <defaults>['data']</defaults>
+    </inputPortSpec>
+    <inputPortSpec arg="arrowprops" arg_pos="5" name="arrowprops" />
+  </moduleSpec>
+  <moduleSpec code_ref="matplotlib.pyplot.plot" name="MplLinePlot" superclass="MplPlot">
+    <docstring>Plot lines and/or markers to the :class:`~matplotlib.axes.Axes`.  args is a variable length argument, allowing for multiple x, y pairs with an optional format string.  For example, each of the following is legal:
+
+plot(x, y)         # plot x and y using default line style and color plot(x, y, 'bo')   # plot x and y using blue circle markers plot(y)            # plot y using x as index array 0..N-1 plot(y, 'r+')      # ditto, but with red plusses
+
+If x and/or y is 2-dimensional, then the corresponding columns will be plotted.
+
+An arbitrary number of x, y, fmt groups can be specified, as in:
+
+a.plot(x1, y1, 'g^', x2, y2, 'g-')
+
+Return value is a list of lines that were added.
+
+By default, each line is assigned a different color specified by a 'color cycle'.  To change this behavior, you can edit the axes.color_cycle rcParam. Alternatively, you can use :meth:`~matplotlib.axes.Axes.set_default_color_cycle`.
+
+The following format string characters are accepted to control the line style or marker:
+
+The following color abbreviations are supported:
+
+In addition, you can specify colors in many weird and wonderful ways, including full names ('green'), hex strings ('#008000'), RGB or RGBA tuples ((0,1,0,1)) or grayscale intensities as a string ('0.8').  Of these, the string specifications can be used in place of a fmt group, but the tuple forms can be used only as kwargs.
+
+Line styles and colors are combined in a single format string, as in 'bo' for blue circles.
+
+The kwargs can be used to set line properties (any property that has a set_* method).  You can use this to set a line label (for auto legends), linewidth, anitialising, marker face color, etc.  Here is an example:
+
+plot([1,2,3], [1,2,3], 'go-', label='line 1', linewidth=2) plot([1,2,3], [1,4,9], 'rs',  label='line 2') axis([0, 4, 0, 10]) legend()
+
+If you make multiple lines with one plot command, the kwargs apply to all those lines, e.g.:
+
+plot(x1, y1, x2, y2, antialised=False)
+
+Neither line will be antialiased.
+
+You do not need to use format strings, which are just abbreviations.  All of the line properties can be controlled by keyword arguments.  For example, you can set the color, marker, linestyle, and markercolor with:
+
+plot(x, y, color='green', linestyle='dashed', marker='o',      markerfacecolor='blue', markersize=12).
+
+See :class:`~matplotlib.lines.Line2D` for details.
+
+The kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+kwargs scalex and scaley, if defined, are passed on to :meth:`~matplotlib.axes.Axes.autoscale_view` to determine whether the x and y axes are autoscaled; the default is True.
+
+Additional kwargs: hold = [True|False] overrides default hold state</docstring>
+    <inputPortSpec arg="marker" name="marker">
+      <translations>{'tri_down marker': '1', 'pentagon marker': 'p', 'hline marker': '_', 'pixel marker': ',', 'triangle_up marker': '^', 'point marker': '.', 'square marker': 's', 'hexagon2 marker': 'H', 'tri_right marker': '4', 'plus marker': '+', 'vline marker': '|', 'triangle_left marker': '<', 'triangle_down marker': 'v', 'triangle_right marker': '>', 'tri_left marker': '3', 'x marker': 'x', 'circle marker': 'o', 'dashed line style': '--', 'hexagon1 marker': 'h', 'dash-dot lin [...]
+      <entry_types>['enum']</entry_types>
+      <values>[['solid line style', 'dashed line style', 'dash-dot line style', 'dotted line style', 'point marker', 'pixel marker', 'circle marker', 'triangle_down marker', 'triangle_up marker', 'triangle_left marker', 'triangle_right marker', 'tri_down marker', 'tri_up marker', 'tri_left marker', 'tri_right marker', 'square marker', 'pentagon marker', 'star marker', 'hexagon1 marker', 'hexagon2 marker', 'plus marker', 'x marker', 'diamond marker', 'thin_diamond marker', 'vline marker', [...]
+    </inputPortSpec>
+  </moduleSpec>
+</specs>
diff --git a/vistrails/packages/matplotlib/object.py b/vistrails/packages/matplotlib/object.py
new file mode 100644
index 0000000..ace8acc
--- /dev/null
+++ b/vistrails/packages/matplotlib/object.py
@@ -0,0 +1,20 @@
+from vistrails.core.modules.vistrails_module import Module
+
+class MplObject(Module):
+    _input_ports = [("subfigRow", "(org.vistrails.vistrails.spreadsheet:Integer)",
+                     {"defaults": ["1"]}),
+                    ("subfigCol", "(org.vistrails.vistrails.spreadsheet:Integer)",
+                     {"defaults": ["1"]})]
+    _output_ports = [("self", "(org.vistrails.vistrails.matplotlib:MplObject)")]
+
+    def __init__(self):
+        Module.__init__(self)
+        self.figInstance = None
+
+    def set_fig(self, fig):
+        self.figInstance = fig
+
+    def get_fig(self):
+        if self.figInstance is None:
+            self.figInstance = pylab.figure()
+        return self.figInstance
diff --git a/vistrails/packages/matplotlib/parse.py b/vistrails/packages/matplotlib/parse.py
new file mode 100644
index 0000000..18ff809
--- /dev/null
+++ b/vistrails/packages/matplotlib/parse.py
@@ -0,0 +1,1001 @@
+import ast
+import re
+import sys
+from xml.etree import ElementTree as ET
+import docutils.core
+import docutils.nodes
+from itertools import izip
+import inspect
+import matplotlib
+matplotlib.use('Qt4Agg')
+import matplotlib.docstring
+def new_call(self, func):
+    # print "!!!CALLING NEW CALL!!!"
+    return func
+# print id(matplotlib.docstring.interpd.__call__)
+
+matplotlib.docstring.Substitution.__call__ = new_call
+
+# def test_func():
+#     """this is something cool %(Line2D)s"""
+#     pass
+# # matplotlib.docstring.interpd(test_func)
+# print "docstring:", test_func.__doc__
+# print id(matplotlib.docstring.interpd.__call__), id(new_call)
+
+
+import matplotlib.pyplot
+from matplotlib.artist import Artist, ArtistInspector
+import matplotlib.cbook
+# want to get lowercase accepts too
+ArtistInspector._get_valid_values_regex = re.compile(
+    r"\n\s*ACCEPTS:\s*((?:.|\n)*?)(?:$|(?:\n\n))", re.IGNORECASE)
+
+from specs import SpecList, ModuleSpec, InputPortSpec, OutputPortSpec, \
+    AlternatePortSpec
+
+sys.path.append('/vistrails/src/git')
+from vistrails.core.modules.utils import expand_port_spec_string
+
+##############################################################################
+# docutils parsing code
+##############################################################################
+
+def parse_docutils_thead(elt):
+    header = []
+    for child in elt.children:
+        if child.__class__ == docutils.nodes.row:
+            assert len(header) == 0, "More than one row in header"
+            for subchild in child.children:
+                if subchild.__class__ == docutils.nodes.entry:
+                    header.append(parse_docutils_elt(subchild)[0].strip())
+    return header
+
+def parse_docutils_tbody(elt):
+    rows = []
+    for child in elt.children:
+        if child.__class__ == docutils.nodes.row:
+            row = []
+            for subchild in child.children:
+                if subchild.__class__ == docutils.nodes.entry:
+                    row.append(parse_docutils_elt(subchild)[0].strip())
+            rows.append(row)
+    return rows
+
+def parse_docutils_table(elt):
+    header = []
+    rows = []
+    for child in elt.children:
+        if child.__class__ == docutils.nodes.tgroup:
+            for subchild in child.children:
+                if subchild.__class__ == docutils.nodes.thead:
+                    header = parse_docutils_thead(subchild)
+                elif subchild.__class__ == docutils.nodes.tbody:
+                    rows = parse_docutils_tbody(subchild)
+    print "== TABLE =="
+    print "HEADER:", header
+    print "ROWS:", '\n'.join(str(r) for r in rows)
+    return (header, rows)
+
+def parse_docutils_term(elt):
+    # term = ""
+    terms = []
+    accepts = ""
+    for child in elt.children:
+        if child.__class__ == docutils.nodes.emphasis:
+            term = parse_docutils_elt(child)[0].strip()
+            if term in ('True', 'False'):
+                accepts += term
+            elif term != "None":
+                terms.append(term)
+        elif child.__class__ == docutils.nodes.Text:
+            accepts += str(child)
+        else:
+            accepts += parse_docutils_elt(child)[0]
+    accepts = accepts.strip()
+    if accepts.startswith(':'):
+        accepts = accepts[1:].strip()
+    return terms, accepts
+
+def parse_docutils_deflist(elt):
+    print "GOT DEFLIST!"
+    args = []
+    term = None
+    definition = None
+    for child in elt.children:
+        assert child.__class__ == docutils.nodes.definition_list_item, "NO DEF LIST ITEM!"
+        for subchild in child.children:
+            if subchild.__class__ == docutils.nodes.term:
+                terms, accepts = parse_docutils_term(subchild)
+                print "TERMS:", terms
+                if accepts:
+                    print "ACCEPTS:", accepts
+            elif subchild.__class__ == docutils.nodes.definition:
+                definition = parse_docutils_elt(subchild)[0].rstrip()
+                print "DEFINITION:", definition
+                for term in terms:
+                    args.append((term, accepts, definition))
+    return args
+
+def parse_docutils_elt(elt, last_text=""):
+    def get_last_block(cur_text):
+        num_newlines = 1
+        end_idx = len(cur_text)
+        while cur_text.endswith("\n\n" * num_newlines):
+            num_newlines += 1
+            end_idx -= 2
+        idx = cur_text.rfind("\n\n",0,end_idx)
+        if idx < 0:
+            idx = 0
+        else:
+            idx += 2
+        return cur_text[idx:].strip()
+
+    text = ""
+    args = []
+    tables = []
+    call_signatures = []
+    for child in elt.children:
+        if child.__class__ == docutils.nodes.Text:
+            # cur_block.extend(s.strip() for s in str(child).split('\n'))
+            ntext = ' '.join(s for s in str(child).split('\n'))
+            text += ntext
+        elif child.__class__ == docutils.nodes.system_message:
+            pass
+        elif child.__class__ == docutils.nodes.definition_list:
+            # print "DEFLIST BLOCK:", text[-20:]
+            # print get_last_block(last_text + text)
+            args.append((get_last_block(last_text + text), 
+                         parse_docutils_deflist(child)))
+        elif child.__class__ == docutils.nodes.table:
+            # print "TABLE BLOCK:", text[-20:]
+            # print get_last_block(last_text + text)
+            tables.append((get_last_block(last_text + text),) + \
+                              parse_docutils_table(child))
+        elif isinstance(child, docutils.nodes.Inline):
+            (ntext, nargs, ntables, ncall_sigs) = \
+                parse_docutils_elt(child, last_text + text)
+            text += ntext
+            args += nargs
+            tables += ntables
+            call_signatures += ncall_sigs
+        else:
+            (ntext, nargs, ntables, ncall_sigs) = \
+                parse_docutils_elt(child, last_text + text)
+            if child.__class__ == docutils.nodes.literal_block:
+                check_str = (last_text + text).lower().strip()
+                if check_str.endswith("\ncall signature:") or \
+                        check_str.endswith("\ncall signatures:"):
+                    call_signatures.append(ntext)
+            text += ntext.strip() + "\n\n"
+            args += nargs
+            tables += ntables
+            call_signatures += ncall_sigs
+    return (text.rstrip(), args, tables, call_signatures)
+            
+def parse_docutils_str(docstring, should_print=False):
+    root = docutils.core.publish_doctree(docstring)
+    if should_print:
+        print root
+    # for child in root.children:
+    #     print "CHILD:", child.__class__, child
+    #     for subchild in child.children:
+    #         print "SUBCHILD:", subchild.__class__, subchild
+    return parse_docutils_elt(root)
+    
+##############################################################################
+# util methods
+##############################################################################
+
+def capfirst(s):
+    return s[0].upper() + s[1:]
+
+def pretty_name(s):
+    cap = True
+    new_s = ""
+    for i, c in enumerate(s):
+        if cap:
+            c = c.upper()
+            cap = False
+        if c != '_' or i == 0:
+            new_s += c
+        else:
+            cap = True
+    return new_s
+
+def get_value_and_type(s):
+    try:
+        val = eval(s)
+        if isinstance(val, type):
+            return (None, None)
+    except:
+        val = s
+    port_type = get_type_from_val(val)
+    return (val, port_type)
+
+def get_type_from_val(val):
+    if isinstance(val, float):
+        return "basic:Float"
+    elif isinstance(val, (int, long)):
+        return "basic:Integer"
+    elif isinstance(val, basestring):
+        return "basic:String"
+    elif isinstance(val, bool):
+        return "basic:Boolean"
+    elif isinstance(val, list):
+        return "basic:List"
+    return None
+
+def resolve_port_type(port_types, port_spec):
+    port_types_set = set(p for p in port_types if p is not None)
+    was_set = False
+    if port_spec.port_type is not None:
+        port_types_set.add(port_spec.port_type)
+    if len(port_types_set) == 1:
+        port_spec.port_type = next(iter(port_types_set))
+        was_set = True
+    elif len(port_types_set) == 2:
+        if 'basic:Float' in port_types_set and \
+                'basic:Integer' in port_types_set:
+            port_spec.port_type = 'basic:Float'
+            was_set = True
+        elif 'basic:List' in port_types_set:
+            port_spec.port_type = 'basic:List'
+            base_name = port_spec.name
+            port_spec.name = base_name + "Sequence"
+            port_types_set.discard('basic:List')
+            alternate_spec = \
+                AlternatePortSpec(name=base_name + "Scalar",
+                                  port_type=next(iter(port_types_set)))
+            port_spec.alternate_specs.append(alternate_spec)
+            was_set = True
+    if not was_set:
+        if "color" in port_spec.name:
+            port_spec.port_type = "basic:Color"
+            port_spec.translations = "translate_color"
+        elif port_spec.name == "x":
+            port_spec.port_type = "basic:List"
+        elif port_spec.name == "y":
+            port_spec.port_type = "basic:List"
+        else:
+            port_spec.port_type = None
+
+    # # FIXME
+    # # what to do with scalar/sequence-type args
+    # elif len(port_types_set) == 2 and 'basic:List' in port_types_set:
+    #     port_type = 'basic:List'
+    # else:
+    #     port_type = None
+    # return port_type
+
+def parse_description(desc):
+    key_to_type = {'string': 'basic:String',
+                   'integer': 'basic:Integer',
+                   'sequence': 'basic:List',
+                   'float': 'basic:Float',
+                   'boolean': 'basic:Boolean',
+                   'scalar': 'basic:Float',
+                   'vector': 'basic:List',
+                   'list': 'basic:List'}
+    port_types = []
+    option_strs = []
+    default_val = None
+    allows_none = False
+    default_paren_re = re.compile(r"((\S*)\s+)?\(default:?(\s+(\S*))?\)", 
+                                  re.IGNORECASE)
+    default_is_re = re.compile(r"default\s+is\s+(\S*)", re.IGNORECASE)
+
+    if '|' in desc:
+        m = re.search("\[([\s\S]*?)\]", desc)
+        if m:
+            opt_str = m.group(1)
+        else:
+            opt_str = desc
+        opts = opt_str.split('|')
+        for opt in opts:
+            opt = opt.strip()
+            m = default_paren_re.search(opt)
+            if m:
+                (_, before_res, _, after_res) = m.groups()
+                if after_res:
+                    assert default_val is None, ('Multiple defaults: '
+                            '"%s" "%s"' % (default_val, after_res))
+                    default_val = after_res
+                    opt = after_res
+                elif before_res:
+                    assert default_val is None, ('Multiple defaults: '
+                            '"%s" "%s"' % (default_val, after_res))
+                    default_val = before_res
+                    opt = before_res
+            found_type = False
+            opt_lower = opt.lower()
+            if opt_lower == "none":
+                found_type = True
+                allows_none = True
+            elif opt_lower == "true" or opt_lower == "false":
+                found_type = True
+                port_types.append("basic:Boolean")
+            else:
+                for key in key_to_type:
+                    if key in opt_lower:
+                        found_type = True
+                        port_types.append(key_to_type[key])
+
+            if not found_type:
+                (val, port_type) = get_value_and_type(opt)
+                option_strs.append(val)
+                if port_type is not None:
+                    port_types.append(port_type)
+                    found_type = True
+                # option_strs.append(opt)
+                # if opt.startswith("'") or opt.startswith('"'):
+                #     port_types.append("basic:String")
+                #     found_type = True
+                    
+    if default_val is None:
+        m = default_paren_re.search(desc)
+        if m:
+            (_, before_res, _, after_res) = m.groups()
+            if after_res:
+                default_val = after_res
+            elif before_res:
+                default_val = before_res
+        else:
+            m = default_is_re.search(desc)
+            if m:
+                (default_val,) = m.groups()
+                if default_val.endswith('.') or default_val.endswith(','):
+                    default_val = default_val[:-1]
+
+    if default_val:
+        (default_val, port_type) = get_value_and_type(default_val)
+        if port_type is not None:
+            port_types.append(port_type)
+
+    should_print = False
+    if len(port_types) == 0:
+        for key, port_type in key_to_type.iteritems():
+            if key in desc:
+                port_types.append(port_type)
+
+    # port_type = resolve_port_type(port_types)
+        
+    return (port_types, option_strs, default_val, allows_none)
+
+def parse_translation(rows, should_reverse=True):
+    t = {}
+    port_types = []
+    values = []
+    for row in rows:
+        (val1, port_type1) = get_value_and_type(row[0])
+        (val2, port_type2) = get_value_and_type(row[1])
+        if should_reverse:
+            if val2 != None:
+                port_types.append(port_type2)
+                values.append(val2)
+                t[val2] = val1
+        else:
+            if val1 != None:
+                port_types.append(port_type1)
+                values.append(val1)
+                t[val1] = val2
+
+    # port_type = resolve_port_type(port_types)
+    return (t, port_types, values)
+
+def do_translation_override(port_specs, names, rows, opts):
+    if 'name' in opts:
+        names = opts['name']
+    if names is None:
+        raise ValueError("Must specify name of port to use translation for")
+    if isinstance(names, basestring) or not matplotlib.cbook.iterable(names):
+        names = [names]
+    should_reverse = opts.get('reverse', True)
+    values_only = opts.get('values_only', False)
+    (t, port_type, values) = \
+        parse_translation(rows, should_reverse)
+    for name in names:
+        print "TRANSLATING", name
+        if name not in port_specs:
+            port_specs[name] = InputPortSpec(name) 
+        port_specs[name].entry_types = ['enum']
+        port_specs[name].values = [values]
+        if not values_only:
+            port_specs[name].translations = t
+
+def get_names(obj, default_module_base, default_super_base, 
+              prefix="Mpl", suffix=""):
+    module_name = None
+    super_name = None
+    if isinstance(obj, tuple):
+        if len(obj) > 2:
+            super_name = obj[2]
+        if len(obj) < 2:
+            raise ValueError("Need to specify 2- or 3-tuple")
+        (obj, module_name) = obj[:2]
+    if module_name is None:
+        module_name = "%s%s%s" % (prefix, 
+                                  pretty_name(default_module_base(obj)), 
+                                  suffix)
+    if super_name is None:
+        super_name = "%s%s%s" % (prefix, 
+                                 pretty_name(default_super_base(obj)), 
+                                 suffix)
+
+    return (obj, module_name, super_name)
+
+##############################################################################
+# main methods
+##############################################################################
+
+def parse_argspec(obj_or_str):
+    if isinstance(obj_or_str, basestring):
+        obj_or_str = obj_or_str.strip()
+        if not obj_or_str.endswith(":"):
+            obj_or_str += ":"
+        if not obj_or_str.startswith("def "):
+            obj_or_str = "def " + obj_or_str
+        try:
+            tree = ast.parse(obj_or_str + "\n  pass")
+        except SyntaxError:
+            # cannot parse the argspec
+            print "*** CANNOT PARSE", obj_or_str
+            return []
+        argspec_name = tree.body[0].name
+        argspec_args = [a.id for a in tree.body[0].args.args]
+        print tree.body[0].args.defaults
+        argspec_defaults = []
+        for i, d in enumerate(tree.body[0].args.defaults):
+            try:
+                d_val = ast.literal_eval(d)
+            except ValueError:
+                d_val = None
+            argspec_defaults.append(d_val)
+        # argspec_defaults = \
+        #     [ast.literal_eval(d) for d in tree.body[0].args.defaults]
+    else:
+        argspec = inspect.getargspec(obj_or_str)
+        argspec_args = argspec.args
+        argspec_defaults = argspec.defaults
+
+    # print argspec
+    if not argspec_defaults:
+        start_defaults = len(argspec_args) + 1
+    else:
+        start_defaults = len(argspec_args) - len(argspec_defaults)
+    port_specs_list = []
+    has_self = False
+    for i, arg in enumerate(argspec_args):
+        if i == 0 and arg == "self":
+            has_self = True
+            continue
+        port_spec = InputPortSpec(arg)
+        port_spec.arg_pos = (i-1) if has_self else i
+        if i >= start_defaults:
+            port_spec.required = False
+            default_val = argspec_defaults[i-start_defaults]
+            if default_val is not None:
+                port_spec.defaults = [str(default_val)]
+                port_type = get_type_from_val(default_val)
+                if port_type is not None:
+                    port_spec.port_type = port_type
+        else:
+            port_spec.required = True
+            # port_specs[arg].entry_types = [None,]
+            # port_specs[arg].values = [[]]
+            # port_specs[arg].translations = [None,]
+        port_specs_list.append(port_spec)
+    return port_specs_list
+
+def process_docstring(docstring, port_specs, parent, table_overrides):
+    (cleaned_docstring, args, tables, call_sigs) = \
+        parse_docutils_str(docstring)
+
+    if len(call_sigs) > 0:
+        for call_sig in call_sigs:
+            port_specs_list = parse_argspec(call_sig)
+            for port_spec in port_specs_list:
+                if port_spec.arg in port_specs:
+                    # have to reconcile the two
+                    old_port_spec = port_specs[port_spec.arg]
+                    resolve_port_type([port_spec.port_type], old_port_spec)
+                    if old_port_spec.defaults is None:
+                        old_port_spec.defaults = port_spec.defaults
+                    elif old_port_spec.defaults != port_spec.defaults:
+                        # keep it as the old spec is
+                        print "*** Different defaults!" + \
+                            str(old_port_spec.defaults) + \
+                            " : " + str(port_spec.defaults)
+                        # raise RuntimeError("Different defaults! %s: %s" % (
+                        #                    old_port_spec.defaults,
+                        #                    port_spec.defaults))
+                else:
+                    port_specs[port_spec.arg] = port_spec
+
+    output_port_specs = []
+    for (deflist_intro, deflist) in args:
+        print "PROCESSING DEFLIST", deflist_intro
+        if re.search("return value", deflist_intro, re.IGNORECASE):
+            print "  -> RETURN VALUE"
+            for (name, accepts, port_doc) in deflist:
+                (port_types, option_strs, default_val, allows_none) = \
+                    parse_description(accepts)
+                (pt2, _, dv2, _) = parse_description(port_doc)
+                port_types.extend(pt2)
+                if default_val is None:
+                    default_val = dv2
+                oport = OutputPortSpec(name, docstring=port_doc)
+                resolve_port_type(port_types, oport)
+                output_port_specs.append(oport)
+        elif (re.search("argument", deflist_intro, re.IGNORECASE) or
+              re.search("kwarg", deflist_intro, re.IGNORECASE)):
+            print "  -> ARGUMENTS"
+            for (name, accepts, port_doc) in deflist:
+                if name not in port_specs:
+                    port_specs[name] = InputPortSpec(name, docstring=port_doc)
+                else:
+                    port_specs[name].docstring = port_doc
+                (port_types, option_strs, default_val, allows_none) = \
+                    parse_description(accepts)
+                (pt2, _, dv2, _) = parse_description(port_doc)
+                port_types.extend(pt2)
+                if default_val is None:
+                    default_val = dv2
+                resolve_port_type(port_types, port_specs[name])
+                if len(option_strs) > 0:
+                    port_specs[name].entry_types = ['enum']
+                    port_specs[name].values = [option_strs]
+                if default_val is not None:
+                    port_specs[name].defaults = [str(default_val)]
+
+    for (table_intro, header, rows) in tables:
+        print "GOT TABLE", table_intro, rows[0]
+        table_key = parent + (table_intro,)
+        if table_key in table_overrides:
+            (override_type, opts) = table_overrides[table_key]
+            if override_type == "translation":
+                do_translation_override(port_specs, None, rows, opts)
+                continue
+            elif override_type == "ports":
+                table_intro = "kwarg"
+            elif override_type == "skip":
+                continue
+
+        if re.search("return value", table_intro, re.IGNORECASE):
+            print "  -> RETURN"
+            if len(rows[0]) != 2:
+                raise ValueError("row that has more/less than 2 columns!")
+            for (name, port_doc) in rows:
+                (port_types, option_strs, default_val, allows_none) = \
+                    parse_description(port_doc)
+                # (port_types, option_strs) = parse_desc(port_doc)
+                # port_type_set = set(port_types)
+                # # print port_name, "PORT_TYPES:", port_type_set
+                # port_type = "UNKNOWN"
+                # if len(port_type_set) == 1:
+                #     port_type = port_types[0]
+                oport = OutputPortSpec(name, docstring=port_doc)
+                resolve_port_type(oport, port_types)
+                output_port_specs.append(oport)
+        elif (re.search("argument", table_intro, re.IGNORECASE) or
+              re.search("kwarg", table_intro, re.IGNORECASE)):
+            print "  -> ARGUMENT"
+            if len(rows[0]) != 2:
+                raise ValueError("row that has more/less than 2 columns!")
+            for (name, port_doc) in rows:
+                if name not in port_specs:
+                    port_specs[name] = InputPortSpec(name, docstring=port_doc)
+                else:
+                    port_specs[name].docstring = port_doc
+                (port_types, option_strs, default_val, allows_none) = \
+                    parse_description(port_doc)
+                # (port_types, option_strs) = parse_desc(port_doc)
+                # port_type_set = set(port_types)
+                # # print port_name, "PORT_TYPES:", port_type_set
+                # port_type = "UNKNOWN"
+                # if len(port_type_set) == 1:
+                #     port_specs[name].port_type = port_types[0]
+                resolve_port_type(port_types, port_specs[name])
+                if len(option_strs) > 0:
+                    port_specs[name].entry_types = ['enum']
+                    port_specs[name].values = [option_strs]
+                if default_val is not None:
+                    port_specs[name].defaults = [str(default_val)]
+        else:
+            raise ValueError("Unknown table: %s\n  %s %s" % (
+                             parent, table_intro, header))
+            # print "HIT SPEC:", name
+            # if name not in port_specs:
+            #     port_specs[name] = PortSpec(name, name, "UNKNOWN", "")
+            # port_specs[name].translations = dict(reversed(r) for r in rows)
+    return cleaned_docstring, output_port_specs
+
+def parse_plots(plot_types, table_overrides):
+    def get_module_base(n):
+        return n
+    def get_super_base(n):
+        return "plot"
+
+    module_specs = []
+    for plot in plot_types:
+        port_specs = {}
+        print "========================================"
+        print plot
+        print "========================================"
+        
+        (plot, module_name, super_name) = \
+            get_names(plot, get_module_base, get_super_base, "Mpl", "")
+
+        try:
+            plot_obj = getattr(matplotlib.pyplot, plot)
+        except AttributeError:
+            print '*** CANNOT ADD PLOT "%s";' \
+                'IT DOES NOT EXIST IN THIS MPL VERSION ***' % plot
+            continue
+        # argspec = inspect.getargspec(plot_obj)
+        # print argspec
+        # if argspec.defaults is None:
+        #     start_defaults = len(argspec.args) + 1
+        # else:
+        #     start_defaults = len(argspec.args) - len(argspec.defaults)
+        # for i, arg in enumerate(argspec.args):
+        #     port_specs[arg] = PortSpec(arg, arg)
+        #     if i >= start_defaults:
+        #         port_specs[arg].required = False
+        #         default_val = argspec.defaults[i-start_defaults]
+        #         if default_val is not None:
+        #             port_specs[arg].defaults = [str(default_val)]
+        #             port_type = get_type_from_val(default_val)
+        #             if port_type is not None:
+        #                 port_specs[arg].port_type = port_type
+        #     else:
+        #         port_specs[arg].required = True
+        #         # port_specs[arg].entry_types = [None,]
+        #         # port_specs[arg].values = [[]]
+        #         # port_specs[arg].translations = [None,]
+        
+        port_specs_list = parse_argspec(plot_obj)
+        for port_spec in port_specs_list:
+            port_specs[port_spec.arg] = port_spec
+
+        docstring = plot_obj.__doc__
+        if plot == 'contour':
+            # want to change the double newline to single newline...
+            print "&*&* FINDING:", \
+                docstring.find("*extent*: [ *None* | (x0,x1,y0,y1) ]\n\n")
+            docstring = docstring.replace("*extent*: [ *None* | (x0,x1,y0,y1) ]\n\n", 
+                              "*extent*: [ *None* | (x0,x1,y0,y1) ]\n")
+        if plot == 'annotate':
+            docstring = docstring % dict((k,v) for k, v in matplotlib.docstring.interpd.params.iteritems() if k == 'Annotation')
+        elif plot == 'barbs':
+            docstring = docstring % dict((k,v) for k,v in matplotlib.docstring.interpd.params.iteritems() if k == 'barbs_doc')
+
+        cleaned_docstring, output_port_specs = \
+            process_docstring(docstring, port_specs, ('pyplot', plot),
+                              table_overrides)
+
+        module_specs.append(ModuleSpec(module_name, super_name,
+                                       "matplotlib.pyplot.%s" % plot, 
+                                       cleaned_docstring, port_specs.values(),
+                                       output_port_specs))
+    my_specs = SpecList(module_specs)
+    return my_specs
+        
+_get_accepts_regex = re.compile(
+    r"([\s\S]*)\n\s*ACCEPTS:\s*((?:.|\n)*?)(?:$|(?:\n\n))([\s\S]*)",
+    re.IGNORECASE)
+
+def parse_artists(artist_types, table_overrides={}):
+    def get_module_name(obj):
+        return obj.__name__
+    def get_super_name(obj):
+        for base in obj.__bases__:
+            if issubclass(base, Artist):
+                return base.__name__
+        return ""
+        # if obj.__bases__[0].__name__ != 'object':
+        #     return obj.__bases__[0].__name__
+        # else:
+        #     return ""
+
+    module_specs = []
+    for klass in artist_types:
+        (klass, module_name, super_name) = \
+            get_names(klass, get_module_name, get_super_name, "Mpl", 
+                      "Properties")
+
+        port_specs = {}
+        insp = ArtistInspector(klass)
+        klass_name = klass.__name__
+        klass_qualname = klass.__module__ + "." + klass_name
+        for (s, t) in insp._get_setters_and_targets():
+            print "** %s **" % s
+            if t.rsplit('.',1)[0] != klass_qualname:
+                # let inheritance work
+                continue
+
+            if s in port_specs:
+                raise ValueError('duplicate port "%s"' % s)
+            port_spec = InputPortSpec(s)
+            port_specs[s] = port_spec
+
+            accepts_raw = insp.get_valid_values(s)
+            (accepts, deflists, tables, call_sigs) = \
+                parse_docutils_str(accepts_raw)
+            if len(deflists) + len(tables) > 0:
+                raise ValueError("accepts has deflists and/or tables")
+            (port_types, option_strs, default_val, allows_none) = \
+                parse_description(accepts)
+            # port_spec.port_type = port_type
+            if default_val is not None:
+                port_spec.default_val = default_val
+            if len(option_strs) > 0:
+                port_spec.entry_types = ['enum']
+                port_spec.values = [option_strs]
+            port_spec.hide = False
+
+            docstring = getattr(insp.o, 'set_' + s).__doc__
+            if docstring is None:
+                docstring = ""
+            else:
+                docstring = docstring % matplotlib.docstring.interpd.params
+            match = _get_accepts_regex.search(docstring)
+            if match is not None:
+                print "STARTING DOCSTRING:", docstring
+                groups = match.groups()
+                if len(groups) > 2 and groups[2]:
+                    docstring = groups[0] + groups[2]
+                else:
+                    docstring = groups[0]
+                print "FIXED DOCSTRING:", docstring
+            
+            (cleaned_docstring, args, tables, call_sigs) = \
+                parse_docutils_str(docstring)
+            port_spec.docstring = cleaned_docstring
+
+            translations = None
+            for (table_intro, header, rows) in tables:
+                print "TABLE:", table_intro
+                if (klass.__name__, s, table_intro) in table_overrides:
+                    (override_type, opts) = \
+                        table_overrides[(klass.__name__, s, table_intro)]
+                    if override_type == "translation":
+                        do_translation_override(port_specs, s, rows, opts)
+                        continue
+                    elif override_type == "ports":
+                        table_intro = "kwarg"
+                    elif override_type == "skip":
+                        continue
+                if len(header) != 2:
+                    raise ValueError("Table not two columns!")
+                if translations is not None:
+                    raise ValueError("Two translations in one attr")
+                (translations, pt2, values) = parse_translation(rows)
+                port_spec.translations = translations
+                port_spec.values = [values]
+                port_types.extend(pt2)  
+            resolve_port_type(port_types, port_spec)
+
+        constructor_port_specs = {}
+        port_specs_list = parse_argspec(klass.__init__)
+        for port_spec in port_specs_list:
+            constructor_port_specs[port_spec.arg] = port_spec
+        constructor_docstring = klass.__init__.__doc__
+        if constructor_docstring is not None:
+            _, output_port_specs = process_docstring(constructor_docstring, 
+                                                     constructor_port_specs,
+                                                     (klass.__name__, 
+                                                      '__init__'),
+                                                     table_overrides)
+        for arg, ps in constructor_port_specs.iteritems():
+            if arg not in port_specs:
+                ps.constructor_arg = True
+                ps.required = False
+                port_specs[arg] = ps            
+
+        module_spec = ModuleSpec(module_name, super_name, klass_qualname,
+                                 klass.__doc__, port_specs.values())
+        module_specs.append(module_spec)
+
+    my_specs = SpecList(module_specs)
+    return my_specs
+
+def run_artists():
+    import matplotlib.axes
+    import matplotlib.axis
+    import matplotlib.collections
+    import matplotlib.figure
+    import matplotlib.image
+    import matplotlib.lines
+    import matplotlib.patches
+    import matplotlib.text
+    
+    artist_py_modules = [matplotlib.axes,
+                         matplotlib.axis,
+                         matplotlib.collections,
+                         matplotlib.figure,
+                         matplotlib.image,
+                         matplotlib.lines,
+                         matplotlib.patches,
+                         matplotlib.text,
+                         ]
+
+    exclude = set([])
+
+    artist_types = set() # (Artist, None, "MplProperties")]
+    for py_module in artist_py_modules:
+        for cls_name, cls in inspect.getmembers(py_module, inspect.isclass):
+            if cls_name in exclude:
+                continue
+            if issubclass(cls, Artist) and cls != Artist:
+                artist_types.add(cls)
+
+    print "ARTIST TYPES:", artist_types
+    artist_types = [(Artist, None, "MplProperties")] + \
+        list(sorted(artist_types, key=lambda x: list(reversed(x.mro()))))
+    print "SORTED ARTIST TYPES:", artist_types
+
+    # from matplotlib.collections import Collection, PathCollection, \
+    #     LineCollection
+    # from matplotlib.lines import Line2D
+    # from matplotlib.patches import Patch, Rectangle, PathPatch, Wedge, \
+    #     FancyArrowPatch, YAArrow
+    # from matplotlib.text import Text, Annotation
+    # from matplotlib.axes import Axes
+    # from matplotlib.figure import Figure
+
+    # artist_types = [(Artist, None, "MplProperties"), 
+    #                 Line2D, Patch, Rectangle, Axes, Figure, PathPatch, Wedge, 
+    #                 Collection, PathCollection, LineCollection, Text, 
+    #                 Annotation, FancyArrowPatch, YAArrow]
+
+    # FIXME want this to be indexed by artist name, too...
+    artist_overrides = {('Axes', 'aspect', 'aspect'):
+                            ('translation', {'reverse': False,
+                                             'values_only': True}),
+                        # FIXME may want documentation from adjustable?
+                        ('Axes', 'aspect', 'adjustable'):
+                            ('skip', {}),
+                        # FIXME may want documentation from anchor?
+                        ('Axes', 'aspect', 'anchor'):
+                            ('skip', {}),
+                        ('ConnectionPatch', '__init__', "Valid keys are"):
+                            ('ports', {}),
+                        ('ConnectionPatch', '__init__', "coordsA and coordsB are strings that indicate the coordinates of xyA and xyB."):
+                            ('translation', {'name': ['coordsA', 'coordsB'],
+                                             'reverse': False,
+                                             'values_only': True}),
+                        ('Annotation', '__init__', "If the dictionary has a key arrowstyle, a FancyArrowPatch instance is created with the given dictionary and is drawn. Otherwise, a YAArow patch instance is created and drawn. Valid keys for YAArow are"):
+                            ('skip', {}),
+                        ('Annotation', '__init__', "Valid keys for FancyArrowPatch are"):
+                            ('skip', {}),
+                        ('Annotation', '__init__', "xycoords and textcoords are strings that indicate the coordinates of xy and xytext."):
+                            ('translation', {'name': ['xycoords', 'textcoords'],
+                                             'reverse': False,
+                                             'values_only': True}),
+                        }
+
+    # test_xml()
+    specs = parse_artists(artist_types, artist_overrides)
+    specs.write_to_xml("mpl_artists_raw.xml")
+
+
+def run_plots():
+    # from matplotlib's boilerplate.py
+    plot_types = ['acorr',
+                  'arrow',
+                  'axhline',
+                  'axhspan',
+                  'axvline',
+                  'axvspan',
+                  'bar',
+                  'barh',
+                  'broken_barh',
+                  'boxplot',
+                  'cohere',
+                  'clabel',
+                  'contour',
+                  'contourf',
+                  'csd',
+                  'errorbar',
+                  'fill',
+                  'fill_between',
+                  'fill_betweenx',
+                  'hexbin',
+                  'hist',
+                  'hist2d',
+                  'hlines',
+                  'imshow',
+                  'loglog',
+                  'pcolor',
+                  'pcolormesh',
+                  'pie',
+                  # add plot later
+                  # 'plot',
+                  'plot_date',
+                  'psd',
+                  'quiver',
+                  'quiverkey',
+                  'scatter',
+                  'semilogx',
+                  'semilogy',
+                  'specgram',
+                  'stackplot',
+                  'stem',
+                  'step',
+                  'streamplot',
+                  'tricontour',
+                  'tricontourf',
+                  'tripcolor',
+                  'triplot',
+                  'vlines',
+                  'xcorr',
+                  'barbs',
+                  ]
+
+    plot_types += ['spy',
+                   'polar',
+                   ]
+
+    # FIXME added to keep existing code happy for now
+    plot_types += ['legend',
+                   'annotate',
+                   ('plot', 'MplLinePlot')]
+
+    # others = ['plotfile', 'legend', 'matshow',]
+
+    # plot_types = ['acorr', 'bar', 'barbs', 'barh', 'boxplot', 'broken_barh', 'cohere', 'contour', 'contourf', 'csd', 'errorbar', 'hexbin', 'hist', 'loglog', 'pcolor', 'pcolormesh', 'pie', 'plot', 'plot_date', 'pie', 'polar', 'psd', 'quiver', 'scatter', 'semilogx', 'semilogy', 'specgram', 'spy', 'stem', 'tricontour', 'tricontourf', 'tripcolor', 'triplot', 'xcorr']
+
+    # plot_types = ['bar', 'boxplot', 'contour', 'hist', ('plot', "MplLinePlot"), 
+    #               'scatter', 'pie', 'legend', 'annotate', 'hlines', 
+    #               'axvline', 'axhline', 'errorbar']
+
+    table_overrides = {('pyplot', 'plot', 'The following format string characters are accepted to control the line style or marker:'):
+                           ('translation', {'name': 'marker'}),
+                       ('pyplot', 'plot', 'The following color abbreviations are supported:'):
+                           ('skip', {}),
+                       ('pyplot', 'legend', 'The location codes are'):
+                           ('translation', {'name': 'loc',
+                                            'reverse': False}),
+                       ('pyplot', 'legend', '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.'):
+                           ('ports', {}),
+                       ('pyplot', 'annotate', "If the dictionary has a key arrowstyle, a FancyArrowPatch instance is created with the given dictionary and is drawn. Otherwise, a YAArow patch instance is created and drawn. Valid keys for YAArow are"):
+                           ('skip', {}),
+                       ('pyplot', 'annotate', "Valid keys for FancyArrowPatch are"):
+                           ('skip', {}),
+                       ('pyplot', 'annotate', "xycoords and textcoords are strings that indicate the coordinates of xy and xytext."):
+                           ('translation', {'name': ['xycoords', 'textcoords'],
+                                            'reverse': False,
+                                            'values_only': True}),
+                       }
+
+
+
+    specs = parse_plots(plot_types, table_overrides)
+    specs.write_to_xml("mpl_plots_raw.xml")
+    
+
+def run(which="all"):
+    if which == "all" or which == "artists":
+        run_artists()
+    if which == "all" or which == "plots":
+        run_plots()
+
+    # write_specs("test.xml")
+    # write_specs("mpl.xml")
+    # test_table()
+
+def get_docutils(plot):
+    import matplotlib.pyplot
+    plot_obj = getattr(matplotlib.pyplot, plot)
+    (_, _, _, call_sigs) = parse_docutils_str(plot_obj.__doc__, True)
+    print call_sigs
+    
+if __name__ == '__main__':
+    if len(sys.argv) <= 1:
+        run()
+    elif len(sys.argv) == 2:
+        run(sys.argv[1])
+    else:
+        raise TypeError("usage: python parse.py [all|artists|plots]")
+    # get_docutils("axhline")
diff --git a/vistrails/packages/matplotlib/plots.py b/vistrails/packages/matplotlib/plots.py
new file mode 100644
index 0000000..5d342ea
--- /dev/null
+++ b/vistrails/packages/matplotlib/plots.py
@@ -0,0 +1,5482 @@
+import matplotlib.pyplot
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+from bases import MplPlot
+
+
+
+
+
+def translate_color(c):
+    return c.tuple
+
+def translate_MplLegend_loc(val):
+    translate_dict = {'right': 5, 'center left': 6, 'upper right': 1, 'lower right': 4, 'best': 0, 'center': 10, 'lower left': 3, 'center right': 7, 'upper left': 2, 'upper center': 9, 'lower center': 8}
+    return translate_dict[val]
+def translate_MplLinePlot_marker(val):
+    translate_dict = {'tri_down marker': '1', 'pentagon marker': 'p', 'hline marker': '_', 'pixel marker': ',', 'triangle_up marker': '^', 'point marker': '.', 'square marker': 's', 'hexagon2 marker': 'H', 'tri_right marker': '4', 'plus marker': '+', 'vline marker': '|', 'triangle_left marker': '<', 'triangle_down marker': 'v', 'triangle_right marker': '>', 'tri_left marker': '3', 'x marker': 'x', 'circle marker': 'o', 'dashed line style': '--', 'hexagon1 marker': 'h', 'dash-dot line sty [...]
+    return translate_dict[val]
+
+class MplAcorr(MplPlot):
+    """Plot the autocorrelation of x.
+
+Call signature:
+
+acorr(x, normed=True, detrend=mlab.detrend_none, usevlines=True,       maxlags=10, **kwargs)
+
+If normed = True, normalize the data by the autocorrelation at 0-th lag.  x is detrended by the detrend callable (default no normalization).
+
+Data are plotted as plot(lags, c, **kwargs)
+
+Return value is a tuple (lags, c, line) where:
+
+lags are a length 2*maxlags+1 lag vector
+
+c is the 2*maxlags+1 auto correlation vector
+
+line is a :class:`~matplotlib.lines.Line2D` instance returned by :meth:`plot`
+
+The default linestyle is None and the default marker is 'o', though these can be overridden with keyword args. The cross correlation is performed with :func:`numpy.correlate` with mode = 2.
+
+If usevlines is True, :meth:`~matplotlib.axes.Axes.vlines` rather than :meth:`~matplotlib.axes.Axes.plot` is used to draw vertical lines from the origin to the acorr.  Otherwise, the plot style is determined by the kwargs, which are :class:`~matplotlib.lines.Line2D` properties.
+
+maxlags is a positive integer detailing the number of lags to show.  The default value of None will return all (2*len(x)-1) lags.
+
+The return value is a tuple (lags, c, linecol, b) where
+
+linecol is the :class:`~matplotlib.collections.LineCollection`
+
+b is the x-axis.
+
+Example:
+
+:func:`~matplotlib.pyplot.xcorr` is top graph, and :func:`~matplotlib.pyplot.acorr` is bottom graph.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("normed", "basic:Boolean",
+               {'optional': True, 'defaults': "['True']"}),
+              ("usevlines", "basic:Boolean",
+               {'optional': True, 'defaults': "['True']"}),
+              ("detrend", "basic:String",
+               {'optional': True}),
+              ("maxlags", "basic:Integer",
+               {'optional': True, 'defaults': "['10']"}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("lineCollectionProperties", "MplLineCollectionProperties",
+               {}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+              ("xaxisProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplAcorr)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('normed'):
+            val = self.getInputFromPort('normed')
+            kwargs['normed'] = val
+        if self.hasInputFromPort('usevlines'):
+            val = self.getInputFromPort('usevlines')
+            kwargs['usevlines'] = val
+        if self.hasInputFromPort('detrend'):
+            val = self.getInputFromPort('detrend')
+            kwargs['detrend'] = val
+        if self.hasInputFromPort('maxlags'):
+            val = self.getInputFromPort('maxlags')
+            kwargs['maxlags'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+
+        output = matplotlib.pyplot.acorr(*args, **kwargs)        
+        if 'usevlines' in kwargs and kwargs['usevlines']:
+            output = output + (output[2],)
+        else:
+            output = output + (None, None)
+        lines = output[2]
+        xaxis = output[3]
+        lineCollection = output[4]
+        if self.hasInputFromPort('lineCollectionProperties'):
+            properties = self.getInputFromPort('lineCollectionProperties')
+            if lineCollection is not None:
+                properties.update_props(lineCollection)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+        if self.hasInputFromPort('xaxisProperties'):
+            properties = self.getInputFromPort('xaxisProperties')
+            if xaxis is not None:
+                properties.update_props(xaxis)
+
+class MplArrow(MplPlot):
+    """Add an arrow to the axes.
+
+Call signature:
+
+arrow(x, y, dx, dy, **kwargs)
+
+Draws arrow on specified axis from (x, y) to (x + dx, y + dy). Uses FancyArrow patch to construct the arrow.
+
+Optional kwargs control the arrow construction and properties:
+
+%(FancyArrow)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("y", "basic:Float",
+               {}),
+              ("x", "basic:Float",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("dx", "basic:Float",
+               {}),
+              ("dy", "basic:Float",
+               {}),
+              ("arrowProperties", "MplFancyArrowProperties",
+               {'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplArrow)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        val = self.getInputFromPort('dx')
+        kwargs['dx'] = val
+        val = self.getInputFromPort('dy')
+        kwargs['dy'] = val
+        if self.hasInputFromPort('arrowProperties'):
+            properties = self.getInputFromPort('arrowProperties')
+            properties.update_kwargs(kwargs)
+
+        matplotlib.pyplot.arrow(*args, **kwargs)        
+
+class MplAxhline(MplPlot):
+    """Add a horizontal line across the axis.
+
+Call signature:
+
+axhline(y=0, xmin=0, xmax=1, **kwargs)
+
+Draw a horizontal line at y from xmin to xmax.  With the default values of xmin = 0 and xmax = 1, this line will always span the horizontal extent of the axes, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command.  That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the y location is in data coordinates.
+
+Return value is the :class:`~matplotlib.lines.Line2D` instance.  kwargs are the same as kwargs to plot, and can be used to control the line properties.  Eg.,
+
+draw a thick red hline at y = 0 that spans the xrange:
+
+>>> axhline(linewidth=4, color='r')
+
+draw a default hline at y = 1 that spans the xrange:
+
+>>> axhline(y=1)
+
+draw a default hline at y = .5 that spans the the middle half of the xrange:
+
+>>> axhline(y=.5, xmin=0.25, xmax=0.75)
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, with the exception of 'transform':
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("y", "basic:Float",
+               {'optional': True, 'defaults': "['0']"}),
+              ("xmin", "basic:Float",
+               {'optional': True, 'defaults': "['0']"}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("xmax", "basic:Float",
+               {'optional': True, 'defaults': "['1']"}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplAxhline)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('y'):
+            val = self.getInputFromPort('y')
+            kwargs['y'] = val
+        if self.hasInputFromPort('xmin'):
+            val = self.getInputFromPort('xmin')
+            kwargs['xmin'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('xmax'):
+            val = self.getInputFromPort('xmax')
+            kwargs['xmax'] = val
+
+        line = matplotlib.pyplot.axhline(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if line is not None:
+                properties.update_props(line)
+
+class MplAxhspan(MplPlot):
+    """Add a horizontal span (rectangle) across the axis.
+
+Call signature:
+
+axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs)
+
+y coords are in data units and x coords are in axes (relative 0-1) units.
+
+Draw a horizontal span (rectangle) from ymin to ymax. With the default values of xmin = 0 and xmax = 1, this always spans the xrange, regardless of the xlim settings, even if you change them, eg. with the :meth:`set_xlim` command. That is, the horizontal extent is in axes coords: 0=left, 0.5=middle, 1.0=right but the y location is in data coordinates.
+
+Return value is a :class:`matplotlib.patches.Polygon` instance.
+
+Examples:
+
+draw a gray rectangle from y = 0.25-0.75 that spans the horizontal extent of the axes:
+
+>>> axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
+
+Valid kwargs are :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("xmin", "basic:Float",
+               {'optional': True, 'defaults': "['0']"}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("ymin", "basic:Float",
+               {}),
+              ("ymax", "basic:Float",
+               {}),
+              ("xmax", "basic:Float",
+               {'optional': True, 'defaults': "['1']"}),
+              ("patchProperties", "MplPolygonProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplAxhspan)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('xmin'):
+            val = self.getInputFromPort('xmin')
+            kwargs['xmin'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        val = self.getInputFromPort('ymin')
+        kwargs['ymin'] = val
+        val = self.getInputFromPort('ymax')
+        kwargs['ymax'] = val
+        if self.hasInputFromPort('xmax'):
+            val = self.getInputFromPort('xmax')
+            kwargs['xmax'] = val
+
+        patch = matplotlib.pyplot.axhspan(*args, **kwargs)
+        if self.hasInputFromPort('patchProperties'):
+            properties = self.getInputFromPort('patchProperties')
+            if patch is not None:
+                properties.update_props(patch)
+
+class MplAxvline(MplPlot):
+    """Add a vertical line across the axes.
+
+Call signature:
+
+axvline(x=0, ymin=0, ymax=1, **kwargs)
+
+Draw a vertical line at x from ymin to ymax.  With the default values of ymin = 0 and ymax = 1, this line will always span the vertical extent of the axes, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command.  That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the x location is in data coordinates.
+
+Return value is the :class:`~matplotlib.lines.Line2D` instance.  kwargs are the same as kwargs to plot, and can be used to control the line properties.  Eg.,
+
+draw a thick red vline at x = 0 that spans the yrange:
+
+>>> axvline(linewidth=4, color='r')
+
+draw a default vline at x = 1 that spans the yrange:
+
+>>> axvline(x=1)
+
+draw a default vline at x = .5 that spans the the middle half of the yrange:
+
+>>> axvline(x=.5, ymin=0.25, ymax=0.75)
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties, with the exception of 'transform':
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("x", "basic:Float",
+               {'optional': True, 'defaults': "['0']"}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("ymin", "basic:Float",
+               {'optional': True, 'defaults': "['0']"}),
+              ("ymax", "basic:Float",
+               {'optional': True, 'defaults': "['1']"}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplAxvline)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('x'):
+            val = self.getInputFromPort('x')
+            kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('ymin'):
+            val = self.getInputFromPort('ymin')
+            kwargs['ymin'] = val
+        if self.hasInputFromPort('ymax'):
+            val = self.getInputFromPort('ymax')
+            kwargs['ymax'] = val
+
+        line = matplotlib.pyplot.axvline(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if line is not None:
+                properties.update_props(line)
+
+class MplAxvspan(MplPlot):
+    """Add a vertical span (rectangle) across the axes.
+
+Call signature:
+
+axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs)
+
+x coords are in data units and y coords are in axes (relative 0-1) units.
+
+Draw a vertical span (rectangle) from xmin to xmax.  With the default values of ymin = 0 and ymax = 1, this always spans the yrange, regardless of the ylim settings, even if you change them, eg. with the :meth:`set_ylim` command.  That is, the vertical extent is in axes coords: 0=bottom, 0.5=middle, 1.0=top but the y location is in data coordinates.
+
+Return value is the :class:`matplotlib.patches.Polygon` instance.
+
+Examples:
+
+draw a vertical green translucent rectangle from x=1.25 to 1.55 that spans the yrange of the axes:
+
+>>> axvspan(1.25, 1.55, facecolor='g', alpha=0.5)
+
+Valid kwargs are :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("xmin", "basic:Float",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("ymin", "basic:Float",
+               {'optional': True, 'defaults': "['0']"}),
+              ("ymax", "basic:Float",
+               {'optional': True, 'defaults': "['1']"}),
+              ("xmax", "basic:Float",
+               {}),
+              ("patchProperties", "MplPolygonProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplAxvspan)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        val = self.getInputFromPort('xmin')
+        kwargs['xmin'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('ymin'):
+            val = self.getInputFromPort('ymin')
+            kwargs['ymin'] = val
+        if self.hasInputFromPort('ymax'):
+            val = self.getInputFromPort('ymax')
+            kwargs['ymax'] = val
+        val = self.getInputFromPort('xmax')
+        kwargs['xmax'] = val
+
+        patch = matplotlib.pyplot.axvspan(*args, **kwargs)
+        if self.hasInputFromPort('patchProperties'):
+            properties = self.getInputFromPort('patchProperties')
+            if patch is not None:
+                properties.update_props(patch)
+
+class MplBar(MplPlot):
+    """Make a bar plot.
+
+Call signature:
+
+bar(left, height, width=0.8, bottom=0, **kwargs)
+
+Make a bar plot with rectangles bounded by:
+
+
+
+left, height, width, and bottom can be either scalars or sequences
+
+Return value is a list of :class:`matplotlib.patches.Rectangle` instances.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+For vertical bars, align = 'edge' aligns bars by their left edges in left, while align = 'center' interprets these values as the x coordinates of the bar centers. For horizontal bars, align = 'edge' aligns bars by their bottom edges in bottom, while align = 'center' interprets these values as the y coordinates of the bar centers.
+
+The optional arguments color, edgecolor, linewidth, 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:
+
+%(Rectangle)s
+
+Example: A stacked bar chart.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("edgecolor", "basic:Color",
+               {'optional': True, 'docstring': 'the colors of the bar edges'}),
+              ("linewidth", "basic:String",
+               {'optional': True, 'docstring': "width of bar edges; None means use default linewidth; 0 means don't draw edges."}),
+              ("capsize", "basic:Integer",
+               {'optional': True, 'docstring': '(default 3) determines the length in points of the error bar caps', 'defaults': "['3']"}),
+              ("orientation", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "'vertical' | 'horizontal'", 'values': "[['vertical', 'horizontal']]", 'optional': True}),
+              ("bottom", "basic:Float",
+               {'optional': True, 'docstring': 'the y coordinates of the bottom edges of the bars', 'defaults': "['0']"}),
+              ("bottomSequence", "basic:List",
+               {'docstring': 'the y coordinates of the bottom edges of the bars', 'optional': True}),
+              ("color", "basic:Color",
+               {'optional': True, 'docstring': 'the colors of the bars'}),
+              ("xerr", "basic:String",
+               {'optional': True, 'docstring': 'if not None, will be used to generate errorbars on the bar chart'}),
+              ("align", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "'edge' (default) | 'center'", 'values': "[['edge', 'center']]", 'optional': True, 'defaults': "['edge']"}),
+              ("ecolor", "basic:Color",
+               {'optional': True, 'docstring': 'specifies the color of any errorbar'}),
+              ("height", "basic:List",
+               {'docstring': 'the heights of the bars'}),
+              ("heightScalar", "basic:Float",
+               {'docstring': 'the heights of the bars', 'optional': True}),
+              ("width", "basic:Float",
+               {'optional': True, 'docstring': 'the widths of the bars', 'defaults': "['0.8']"}),
+              ("widthSequence", "basic:List",
+               {'docstring': 'the widths of the bars', 'optional': True}),
+              ("error_kw", "basic:String",
+               {'optional': True, 'docstring': 'dictionary of kwargs to be passed to errorbar method. ecolor and capsize may be specified here rather than as independent kwargs.'}),
+              ("log", "basic:Boolean",
+               {'optional': True, 'docstring': '[False|True] False (default) leaves the orientation axis as-is; True sets it to log scale', 'defaults': "['False']"}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("yerr", "basic:String",
+               {'optional': True, 'docstring': 'if not None, will be used to generate errorbars on the bar chart'}),
+              ("left", "basic:List",
+               {'optional': True, 'docstring': 'the x coordinates of the left sides of the bars'}),
+              ("leftScalar", "basic:Float",
+               {'optional': True, 'docstring': 'the x coordinate of the left side of the bar'}),
+              ("rectangleProperties", "MplRectangleProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplBar)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('edgecolor'):
+            val = self.getInputFromPort('edgecolor')
+            val = translate_color(val)
+            kwargs['edgecolor'] = val
+        if self.hasInputFromPort('linewidth'):
+            val = self.getInputFromPort('linewidth')
+            kwargs['linewidth'] = val
+        if self.hasInputFromPort('capsize'):
+            val = self.getInputFromPort('capsize')
+            kwargs['capsize'] = val
+        if self.hasInputFromPort('orientation'):
+            val = self.getInputFromPort('orientation')
+            kwargs['orientation'] = val
+        if self.hasInputFromPort('bottom'):
+            val = self.getInputFromPort('bottom')
+            kwargs['bottom'] = val
+        elif self.hasInputFromPort('bottomSequence'):
+            val = self.getInputFromPort('bottomSequence')
+            kwargs['bottom'] = val
+        if self.hasInputFromPort('color'):
+            val = self.getInputFromPort('color')
+            val = translate_color(val)
+            kwargs['color'] = val
+        if self.hasInputFromPort('xerr'):
+            val = self.getInputFromPort('xerr')
+            kwargs['xerr'] = val
+        if self.hasInputFromPort('align'):
+            val = self.getInputFromPort('align')
+            kwargs['align'] = val
+        if self.hasInputFromPort('ecolor'):
+            val = self.getInputFromPort('ecolor')
+            val = translate_color(val)
+            kwargs['ecolor'] = val
+        if self.hasInputFromPort('height'):
+            val = self.getInputFromPort('height')
+            kwargs['height'] = val
+        elif self.hasInputFromPort('heightScalar'):
+            val = self.getInputFromPort('heightScalar')
+            kwargs['height'] = val
+        else:
+            raise ModuleError(self, 'Must set one of "height", '                                   '"heightScalar"')
+        if self.hasInputFromPort('width'):
+            val = self.getInputFromPort('width')
+            kwargs['width'] = val
+        elif self.hasInputFromPort('widthSequence'):
+            val = self.getInputFromPort('widthSequence')
+            kwargs['width'] = val
+        if self.hasInputFromPort('error_kw'):
+            val = self.getInputFromPort('error_kw')
+            kwargs['error_kw'] = val
+        if self.hasInputFromPort('log'):
+            val = self.getInputFromPort('log')
+            kwargs['log'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('yerr'):
+            val = self.getInputFromPort('yerr')
+            kwargs['yerr'] = val
+        if self.hasInputFromPort('left'):
+            val = self.getInputFromPort('left')
+            kwargs['left'] = val
+        elif self.hasInputFromPort('leftScalar'):
+            val = self.getInputFromPort('leftScalar')
+            kwargs['left'] = val
+
+        if not kwargs.has_key('left'):
+            kwargs['left'] = range(len(kwargs['height']))
+        rectangles = matplotlib.pyplot.bar(*args, **kwargs)
+        if self.hasInputFromPort('rectangleProperties'):
+            properties = self.getInputFromPort('rectangleProperties')
+            if rectangles is not None:
+                properties.update_props(rectangles)
+
+class MplBarh(MplPlot):
+    """Make a horizontal bar plot.
+
+Call signature:
+
+barh(bottom, width, height=0.8, left=0, **kwargs)
+
+Make a horizontal bar plot with rectangles bounded by:
+
+
+
+bottom, width, height, and left can be either scalars or sequences
+
+Return value is a list of :class:`matplotlib.patches.Rectangle` instances.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+Setting align = 'edge' aligns bars by their bottom edges in bottom, while align = 'center' interprets these values as the y coordinates of the bar centers.
+
+The optional arguments color, edgecolor, linewidth, xerr, and yerr can be either scalars or sequences of length equal to the number of bars.  This enables you to use barh as the basis for stacked bar charts, or candlestick plots.
+
+other optional kwargs:
+
+%(Rectangle)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("edgecolor", "basic:Color",
+               {'optional': True, 'docstring': 'the colors of the bar edges'}),
+              ("linewidth", "basic:String",
+               {'optional': True, 'docstring': "width of bar edges; None means use default linewidth; 0 means don't draw edges."}),
+              ("capsize", "basic:Integer",
+               {'optional': True, 'docstring': '(default 3) determines the length in points of the error bar caps', 'defaults': "['3']"}),
+              ("log", "basic:Boolean",
+               {'optional': True, 'docstring': '[False|True] False (default) leaves the horizontal axis as-is; True sets it to log scale', 'defaults': "['False']"}),
+              ("bottom", "basic:List",
+               {'docstring': 'the vertical positions of the bottom edges of the bars'}),
+              ("bottomScalar", "basic:Float",
+               {'docstring': 'the vertical positions of the bottom edges of the bars', 'optional': True}),
+              ("color", "basic:Color",
+               {'optional': True, 'docstring': 'the colors of the bars'}),
+              ("xerr", "basic:String",
+               {'optional': True, 'docstring': 'if not None, will be used to generate errorbars on the bar chart'}),
+              ("align", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "'edge' (default) | 'center'", 'values': "[['edge', 'center']]", 'optional': True, 'defaults': "['edge']"}),
+              ("ecolor", "basic:Color",
+               {'optional': True, 'docstring': 'specifies the color of any errorbar'}),
+              ("height", "basic:Float",
+               {'optional': True, 'docstring': 'the heights (thicknesses) of the bars', 'defaults': "['0.8']"}),
+              ("heightSequence", "basic:List",
+               {'docstring': 'the heights (thicknesses) of the bars', 'optional': True}),
+              ("width", "basic:List",
+               {'docstring': 'the lengths of the bars'}),
+              ("widthScalar", "basic:Float",
+               {'docstring': 'the lengths of the bars', 'optional': True}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("yerr", "basic:String",
+               {'optional': True, 'docstring': 'if not None, will be used to generate errorbars on the bar chart'}),
+              ("left", "basic:Float",
+               {'optional': True, 'docstring': 'the x coordinates of the left edges of the bars', 'defaults': "['0']"}),
+              ("leftSequence", "basic:List",
+               {'docstring': 'the x coordinates of the left edges of the bars', 'optional': True}),
+              ("rectangleProperties", "MplRectangleProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplBarh)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('edgecolor'):
+            val = self.getInputFromPort('edgecolor')
+            val = translate_color(val)
+            kwargs['edgecolor'] = val
+        if self.hasInputFromPort('linewidth'):
+            val = self.getInputFromPort('linewidth')
+            kwargs['linewidth'] = val
+        if self.hasInputFromPort('capsize'):
+            val = self.getInputFromPort('capsize')
+            kwargs['capsize'] = val
+        if self.hasInputFromPort('log'):
+            val = self.getInputFromPort('log')
+            kwargs['log'] = val
+        if self.hasInputFromPort('bottom'):
+            val = self.getInputFromPort('bottom')
+            kwargs['bottom'] = val
+        elif self.hasInputFromPort('bottomScalar'):
+            val = self.getInputFromPort('bottomScalar')
+            kwargs['bottom'] = val
+        else:
+            raise ModuleError(self, 'Must set one of "bottom", '                                   '"bottomScalar"')
+        if self.hasInputFromPort('color'):
+            val = self.getInputFromPort('color')
+            val = translate_color(val)
+            kwargs['color'] = val
+        if self.hasInputFromPort('xerr'):
+            val = self.getInputFromPort('xerr')
+            kwargs['xerr'] = val
+        if self.hasInputFromPort('align'):
+            val = self.getInputFromPort('align')
+            kwargs['align'] = val
+        if self.hasInputFromPort('ecolor'):
+            val = self.getInputFromPort('ecolor')
+            val = translate_color(val)
+            kwargs['ecolor'] = val
+        if self.hasInputFromPort('height'):
+            val = self.getInputFromPort('height')
+            kwargs['height'] = val
+        elif self.hasInputFromPort('heightSequence'):
+            val = self.getInputFromPort('heightSequence')
+            kwargs['height'] = val
+        if self.hasInputFromPort('width'):
+            val = self.getInputFromPort('width')
+            kwargs['width'] = val
+        elif self.hasInputFromPort('widthScalar'):
+            val = self.getInputFromPort('widthScalar')
+            kwargs['width'] = val
+        else:
+            raise ModuleError(self, 'Must set one of "width", '                                   '"widthScalar"')
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('yerr'):
+            val = self.getInputFromPort('yerr')
+            kwargs['yerr'] = val
+        if self.hasInputFromPort('left'):
+            val = self.getInputFromPort('left')
+            kwargs['left'] = val
+        elif self.hasInputFromPort('leftSequence'):
+            val = self.getInputFromPort('leftSequence')
+            kwargs['left'] = val
+
+        rectangles = matplotlib.pyplot.barh(*args, **kwargs)
+        if self.hasInputFromPort('rectangleProperties'):
+            properties = self.getInputFromPort('rectangleProperties')
+            if rectangles is not None:
+                properties.update_props(rectangles)
+
+class MplBrokenBarh(MplPlot):
+    """Plot horizontal bars.
+
+Call signature:
+
+broken_barh(self, xranges, yrange, **kwargs)
+
+A collection of horizontal bars spanning yrange with a sequence of xranges.
+
+Required arguments:
+
+
+
+kwargs are :class:`matplotlib.collections.BrokenBarHCollection` properties:
+
+%(BrokenBarHCollection)s
+
+these can either be a single argument, ie:
+
+facecolors = 'black'
+
+or a sequence of arguments for the various bars, ie:
+
+facecolors = ('black', 'red', 'green')
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("xranges", "basic:List",
+               {'docstring': 'sequence of (xmin, xwidth)'}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("yrange", "basic:Float,basic:Float",
+               {'docstring': '(ymin, ywidth)'}),
+              ("brokenBarHCollectionProperties", "MplBrokenBarHCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplBrokenBarh)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        val = self.getInputFromPort('xranges')
+        kwargs['xranges'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        val = self.getInputFromPort('yrange')
+        kwargs['yrange'] = val
+
+        matplotlib.pyplot.broken_barh(*args, **kwargs)        
+        if self.hasInputFromPort('brokenBarHCollectionProperties'):
+            properties = self.getInputFromPort('brokenBarHCollectionProperties')
+            if brokenBarHCollection is not None:
+                properties.update_props(brokenBarHCollection)
+
+class MplBoxplot(MplPlot):
+    """Make a box and whisker plot.
+
+Call signature:
+
+boxplot(x, notch=False, sym='+', vert=True, whis=1.5,         positions=None, widths=None, patch_artist=False,         bootstrap=None, usermedians=None, conf_intervals=None)
+
+Make a box and whisker plot for each column of x or each vector in sequence x.  The box extends from the lower to upper quartile values of the data, with a line at the median. The whiskers extend from the box to show the range of the data.  Flier points are those past the end of the whiskers.
+
+Function Arguments:
+
+
+
+Returns a dictionary mapping each component of the boxplot to a list of the :class:`matplotlib.lines.Line2D` instances created. That dictionary has the following keys (assuming vertical boxplots):
+
+boxes: the main body of the boxplot showing the quartiles and the median's confidence intervals if enabled.
+
+medians: horizonal lines at the median of each box.
+
+whiskers: the vertical lines extending to the most extreme, n-outlier data points.
+
+caps: the horizontal lines at the ends of the whiskers.
+
+fliers: points representing data that extend beyone the whiskers (outliers).
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("vert", "basic:Boolean",
+               {'optional': True, 'docstring': 'If True (default), makes the boxes vertical. If False, makes horizontal boxes.', 'defaults': "['True']"}),
+              ("positions", "basic:String",
+               {'optional': True, 'docstring': 'Sets the horizontal positions of the boxes. The ticks and limits are automatically set to match the positions.'}),
+              ("bootstrap", "basic:String",
+               {'optional': True, 'docstring': "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 10 [...]
+              ("usermedians", "basic:List",
+               {'optional': True, 'docstring': 'An array or sequence whose first dimension (or length) is compatible with x. This overrides the medians computed by matplotlib for each element of usermedians that is not None. When an element of usermedians == None, the median will be computed directly as normal.'}),
+              ("sym", "basic:String",
+               {'optional': True, 'docstring': "The default symbol for flier points. Enter an empty string ('') if you don't want to show fliers.", 'defaults': "['b+']"}),
+              ("widths", "basic:Float",
+               {'optional': True, 'docstring': 'Either a scalar or a vector and sets the width of each box. The default is 0.5, or 0.15*(distance between extreme positions) if that is smaller.', 'defaults': "['0.5']"}),
+              ("patch_artist", "basic:Boolean",
+               {'optional': True, 'docstring': 'If False produces boxes with the Line2D artist If True produces boxes with the Patch artist', 'defaults': "['False']"}),
+              ("x", "basic:List",
+               {'docstring': 'Array or a sequence of vectors.'}),
+              ("notch", "basic:Boolean",
+               {'optional': True, 'docstring': 'If False (default), produces a rectangular box plot. If True, will produce a notched box plot', 'defaults': "['False']"}),
+              ("whis", "basic:Float",
+               {'optional': True, 'docstring': '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.', 'defaults': "['1.5']"}),
+              ("conf_intervals", "basic:List",
+               {'optional': True, 'docstring': 'Array or sequence whose first dimension (or length) is compatible with x and whose second dimension is 2. When the current element of conf_intervals is not None, the notch locations computed by matplotlib are overridden (assuming notch is True). When an element of conf_intervals is None, boxplot compute notches the method specified by the other kwargs (e.g. bootstrap).'}),
+              ("boxProperties", "MplLine2DProperties",
+               {}),
+              ("flierProperties", "MplLine2DProperties",
+               {}),
+              ("capProperties", "MplLine2DProperties",
+               {}),
+              ("medianProperties", "MplLine2DProperties",
+               {}),
+              ("boxPatchProperties", "MplPathPatchProperties",
+               {}),
+              ("whiskerProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplBoxplot)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('vert'):
+            val = self.getInputFromPort('vert')
+            kwargs['vert'] = val
+        if self.hasInputFromPort('positions'):
+            val = self.getInputFromPort('positions')
+            kwargs['positions'] = val
+        if self.hasInputFromPort('bootstrap'):
+            val = self.getInputFromPort('bootstrap')
+            kwargs['bootstrap'] = val
+        if self.hasInputFromPort('usermedians'):
+            val = self.getInputFromPort('usermedians')
+            kwargs['usermedians'] = val
+        if self.hasInputFromPort('sym'):
+            val = self.getInputFromPort('sym')
+            kwargs['sym'] = val
+        if self.hasInputFromPort('widths'):
+            val = self.getInputFromPort('widths')
+            kwargs['widths'] = val
+        if self.hasInputFromPort('patch_artist'):
+            val = self.getInputFromPort('patch_artist')
+            kwargs['patch_artist'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('notch'):
+            val = self.getInputFromPort('notch')
+            kwargs['notch'] = val
+        if self.hasInputFromPort('whis'):
+            val = self.getInputFromPort('whis')
+            kwargs['whis'] = val
+        if self.hasInputFromPort('conf_intervals'):
+            val = self.getInputFromPort('conf_intervals')
+            kwargs['conf_intervals'] = val
+
+        output = matplotlib.pyplot.boxplot(*args, **kwargs)        
+        if 'patch_artist' in kwargs and kwargs['patch_artist']:
+            output['boxPatches'] = output['boxes']
+            output['boxes'] = []
+        else:
+            output['boxPatches'] = []
+        boxes = output['boxes']
+        fliers = output['fliers']
+        caps = output['caps']
+        medians = output['medians']
+        boxPatches = output['boxPatches']
+        whiskers = output['whiskers']
+        if self.hasInputFromPort('boxProperties'):
+            properties = self.getInputFromPort('boxProperties')
+            if boxes is not None:
+                properties.update_props(boxes)
+        if self.hasInputFromPort('flierProperties'):
+            properties = self.getInputFromPort('flierProperties')
+            if fliers is not None:
+                properties.update_props(fliers)
+        if self.hasInputFromPort('capProperties'):
+            properties = self.getInputFromPort('capProperties')
+            if caps is not None:
+                properties.update_props(caps)
+        if self.hasInputFromPort('medianProperties'):
+            properties = self.getInputFromPort('medianProperties')
+            if medians is not None:
+                properties.update_props(medians)
+        if self.hasInputFromPort('boxPatchProperties'):
+            properties = self.getInputFromPort('boxPatchProperties')
+            if boxPatches is not None:
+                properties.update_props(boxPatches)
+        if self.hasInputFromPort('whiskerProperties'):
+            properties = self.getInputFromPort('whiskerProperties')
+            if whiskers is not None:
+                properties.update_props(whiskers)
+
+class MplCohere(MplPlot):
+    """Plot the coherence between x and y.
+
+Call signature:
+
+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, **kwargs)
+
+Plot the coherence between x and y.  Coherence is the normalized cross spectral density:
+
+C_{xy} = \frac{|P_{xy}|^2}{P_{xx}P_{yy}}
+
+%(PSD)s
+
+
+
+The return value is a tuple (Cxy, f), where f are the frequencies of the coherence vector.
+
+kwargs are applied to the lines.
+
+References:
+
+Bendat & Piersol -- Random Data: Analysis and Measurement Procedures, John Wiley & Sons (1986)
+
+kwargs control the :class:`~matplotlib.lines.Line2D` properties of the coherence plot:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("Fs", "basic:Integer",
+               {'optional': True, 'defaults': "['2']"}),
+              ("pad_to", "basic:String",
+               {'optional': True}),
+              ("scale_by_freq", "basic:String",
+               {'optional': True}),
+              ("detrend", "basic:String",
+               {'optional': True, 'defaults': "['<function detrend_none at 0x02F5A3F0>']"}),
+              ("window", "basic:String",
+               {'optional': True, 'defaults': "['<function window_hanning at 0x02F5A2B0>']"}),
+              ("Fc", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("NFFT", "basic:Integer",
+               {'optional': True, 'defaults': "['256']"}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("sides", "basic:String",
+               {'optional': True, 'defaults': "['default']"}),
+              ("noverlap", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("lineProperties", "MplLine2DProperties",
+               {'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplCohere)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('Fs'):
+            val = self.getInputFromPort('Fs')
+            kwargs['Fs'] = val
+        if self.hasInputFromPort('pad_to'):
+            val = self.getInputFromPort('pad_to')
+            kwargs['pad_to'] = val
+        if self.hasInputFromPort('scale_by_freq'):
+            val = self.getInputFromPort('scale_by_freq')
+            kwargs['scale_by_freq'] = val
+        if self.hasInputFromPort('detrend'):
+            val = self.getInputFromPort('detrend')
+            kwargs['detrend'] = val
+        if self.hasInputFromPort('window'):
+            val = self.getInputFromPort('window')
+            kwargs['window'] = val
+        if self.hasInputFromPort('Fc'):
+            val = self.getInputFromPort('Fc')
+            kwargs['Fc'] = val
+        if self.hasInputFromPort('NFFT'):
+            val = self.getInputFromPort('NFFT')
+            kwargs['NFFT'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('sides'):
+            val = self.getInputFromPort('sides')
+            kwargs['sides'] = val
+        if self.hasInputFromPort('noverlap'):
+            val = self.getInputFromPort('noverlap')
+            kwargs['noverlap'] = val
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            properties.update_kwargs(kwargs)
+
+        matplotlib.pyplot.cohere(*args, **kwargs)        
+
+class MplClabel(MplPlot):
+    """Label a contour plot.
+
+Call signature:
+
+clabel(cs, **kwargs)
+
+Adds labels to line contours in cs, where cs is a :class:`~matplotlib.contour.ContourSet` object returned by contour.
+
+clabel(cs, v, **kwargs)
+
+only labels contours listed in v.
+
+Optional keyword arguments:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("inline_spacing", "basic:String",
+               {'optional': True, 'docstring': 'space in pixels to leave on each side of label when placing inline.  Defaults to 5.  This spacing will be exact for labels at locations where the contour is straight, less so for labels on curved contours.'}),
+              ("use_clabeltext", "basic:String",
+               {'optional': True, 'docstring': '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.', 'defaults': "['False)']"}),
+              ("fmt", "basic:String",
+               {'optional': True, 'docstring': "a format string for the label. Default is '%1.3f' Alternatively, this can be a dictionary matching contour levels with arbitrary strings to use for each contour level (i.e., fmt[level]=string), or it can be any callable, such as a :class:`~matplotlib.ticker.Formatter` instance, that returns a string when called with a numeric contour level.", 'defaults': "['%1.3f']"}),
+              ("manual", "basic:String",
+               {'optional': True, 'docstring': 'if True, contour labels will be placed manually using mouse clicks.  Click the first button near a contour to add a label, click the second button (or potentially both mouse buttons at once) to finish adding labels.  The third button can be used to remove the last label added, but only if labels are not inline.  Alternatively, the keyboard can be used to select label locations (enter to end label placement, delete or backspace act like the  [...]
+              ("cs", "MplContourSet",
+               {}),
+              ("colors", "basic:Color",
+               {'optional': True, 'docstring': "if None, the color of each label matches the color of the corresponding contour\n\nif one string color, e.g. colors = 'r' or colors = 'red', all labels will be plotted in this color\n\nif a tuple of matplotlib color args (string, float, rgb, etc), different labels will be plotted in different colors in the order specified"}),
+              ("fontsize", "basic:String",
+               {'optional': True, 'docstring': "size in points or relative size eg 'smaller', 'x-large'"}),
+              ("rightside_up", "basic:Boolean",
+               {'optional': True, 'docstring': 'if True (default), label rotations will always be plus or minus 90 degrees from level.', 'defaults': "['True']"}),
+              ("inline", "basic:Boolean",
+               {'optional': True, 'docstring': 'controls whether the underlying contour is removed or not. Default is True.', 'defaults': "['True']"}),
+              ("v", "basic:List",
+               {'optional': True}),
+              ("textProperties", "MplTextProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplClabel)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('cs')
+        args.append(val)
+        if self.hasInputFromPort('v'):
+            val = self.getInputFromPort('v')
+            args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('inline_spacing'):
+            val = self.getInputFromPort('inline_spacing')
+            kwargs['inline_spacing'] = val
+        if self.hasInputFromPort('use_clabeltext'):
+            val = self.getInputFromPort('use_clabeltext')
+            kwargs['use_clabeltext'] = val
+        if self.hasInputFromPort('fmt'):
+            val = self.getInputFromPort('fmt')
+            kwargs['fmt'] = val
+        if self.hasInputFromPort('manual'):
+            val = self.getInputFromPort('manual')
+            kwargs['manual'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+        if self.hasInputFromPort('fontsize'):
+            val = self.getInputFromPort('fontsize')
+            kwargs['fontsize'] = val
+        if self.hasInputFromPort('rightside_up'):
+            val = self.getInputFromPort('rightside_up')
+            kwargs['rightside_up'] = val
+        if self.hasInputFromPort('inline'):
+            val = self.getInputFromPort('inline')
+            kwargs['inline'] = val
+
+        texts = matplotlib.pyplot.clabel(*args, **kwargs)
+        if self.hasInputFromPort('textProperties'):
+            properties = self.getInputFromPort('textProperties')
+            if texts is not None:
+                properties.update_props(texts)
+
+class MplContour(MplPlot):
+    """Plot contours.
+
+: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 version in that it does not draw the polygon edges. To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`.
+
+Call signatures:
+
+contour(Z)
+
+make a contour plot of an array Z. The level values are chosen automatically.
+
+contour(X,Y,Z)
+
+X, Y specify the (x, y) coordinates of the surface
+
+contour(Z,N) contour(X,Y,Z,N)
+
+contour N automatically-chosen levels.
+
+contour(Z,V) contour(X,Y,Z,V)
+
+draw contour lines at the values specified in sequence V
+
+contourf(..., V)
+
+fill the len(V)-1 regions between the values in V
+
+contour(Z, **kwargs)
+
+Use keyword args to control colors, linewidth, origin, cmap ... see below for more details.
+
+X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
+
+C = contour(...) returns a :class:`~matplotlib.contour.QuadContourSet` object.
+
+Optional keyword arguments:
+
+
+
+contour-only keyword arguments:
+
+
+
+contourf-only keyword arguments:
+
+
+
+Note: contourf 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:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "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.\n\nThis keyword is not active if X and Y are specified in the call to contour.", 'values': "[['', 'upper', 'lower', 'image']]", 'optional': True}),
+              ("xunits", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`.', 'values': "[['', 'registered units']]", 'optional': True}),
+              ("extend", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "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.", 'values': "[['neither', 'both', 'min', 'max']]", 'optional': True}),
+              ("vmin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.', 'values': "[['']]", 'optional': True}),
+              ("nchunk", "basic:Integer",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': '[[0]]', 'optional': True}),
+              ("linestyles", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If linestyles is None, the default is 'solid' unless the lines are monochrome.  In that case, negative contours will take their linestyle from the matplotlibrc contour.negative_linestyle setting.\n\nlinestyles 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.", 'values': "[['', 'solid', 'dashed', 'da [...]
+              ("hatches", "basic:List",
+               {'optional': True, 'docstring': 'A list of cross hatch patterns to use on the filled areas. If None, no hatching will be added to the contour. Hatching is supported in the PostScript, PDF, SVG and Agg backends only.'}),
+              ("levelsSequence", "basic:List",
+               {'optional': True, 'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]'}),
+              ("levelsScalar", "basic:Float",
+               {'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]', 'optional': True}),
+              ("linewidths", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If linewidths is None, the default width in lines.linewidth in matplotlibrc is used.\n\nIf a number, all levels will be plotted with this linewidth.\n\nIf a tuple, different levels will be plotted with different linewidths in the order specified', 'values': "[['', 'number', 'tuple of numbers']]", 'optional': True}),
+              ("locator", "basic:String",
+               {'optional': True, 'docstring': '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.'}),
+              ("colors", "basic:Color",
+               {'optional': True, 'docstring': "If None, the colormap specified by cmap will be used.\n\nIf a string, like 'r' or 'red', all levels will be plotted in this color.\n\nIf a tuple of matplotlib color args (string, float, rgb, etc), different levels will be plotted in different colors in the order specified."}),
+              ("cmap", "basic:String",
+               {'optional': True, 'docstring': 'A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.'}),
+              ("yunits", "basic:String",
+               {'optional': True, 'docstring': 'Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`.'}),
+              ("extent", "basic:String",
+               {'entry_types': "['enum']", 'docstring': '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].\n\nThis keyword is not active if X and Y are specified in the call to contour.', 'values': "[['', '(x0,x1,y0,y1)']]", 'optional [...]
+              ("vmax", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.', 'values': "[['']]", 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'The alpha blending value'}),
+              ("Z", "basic:List",
+               {}),
+              ("antialiased", "basic:Boolean",
+               {'optional': True, 'docstring': "enable antialiasing, overriding the defaults.  For filled contours, the default is True.  For line contours, it is taken from rcParams['lines.antialiased'].", 'defaults': "['True']"}),
+              ("norm", "basic:String",
+               {'optional': True, 'docstring': '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.'}),
+              ("X", "basic:List",
+               {'optional': True}),
+              ("V", "basic:List",
+               {'optional': True}),
+              ("Y", "basic:List",
+               {'optional': True}),
+              ("N", "basic:Integer",
+               {'optional': True}),
+              ("lineCollectionProperties", "MplLineCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplContour)"),
+              ("contourSet", "MplQuadContourSet",
+                {}),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        if self.hasInputFromPort('X'):
+            val = self.getInputFromPort('X')
+            args.append(val)
+        if self.hasInputFromPort('Y'):
+            val = self.getInputFromPort('Y')
+            args.append(val)
+        val = self.getInputFromPort('Z')
+        args.append(val)
+        if self.hasInputFromPort('V'):
+            val = self.getInputFromPort('V')
+            args.append(val)
+        if self.hasInputFromPort('N'):
+            val = self.getInputFromPort('N')
+            args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('origin'):
+            val = self.getInputFromPort('origin')
+            kwargs['origin'] = val
+        if self.hasInputFromPort('xunits'):
+            val = self.getInputFromPort('xunits')
+            kwargs['xunits'] = val
+        if self.hasInputFromPort('extend'):
+            val = self.getInputFromPort('extend')
+            kwargs['extend'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('nchunk'):
+            val = self.getInputFromPort('nchunk')
+            kwargs['nchunk'] = val
+        if self.hasInputFromPort('linestyles'):
+            val = self.getInputFromPort('linestyles')
+            kwargs['linestyles'] = val
+        if self.hasInputFromPort('hatches'):
+            val = self.getInputFromPort('hatches')
+            kwargs['hatches'] = val
+        if self.hasInputFromPort('levelsSequence'):
+            val = self.getInputFromPort('levelsSequence')
+            kwargs['levels'] = val
+        elif self.hasInputFromPort('levelsScalar'):
+            val = self.getInputFromPort('levelsScalar')
+            kwargs['levels'] = val
+        if self.hasInputFromPort('linewidths'):
+            val = self.getInputFromPort('linewidths')
+            kwargs['linewidths'] = val
+        if self.hasInputFromPort('locator'):
+            val = self.getInputFromPort('locator')
+            kwargs['locator'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('yunits'):
+            val = self.getInputFromPort('yunits')
+            kwargs['yunits'] = val
+        if self.hasInputFromPort('extent'):
+            val = self.getInputFromPort('extent')
+            kwargs['extent'] = val
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('antialiased'):
+            val = self.getInputFromPort('antialiased')
+            kwargs['antialiased'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        if self.hasInputFromPort("N") and self.hasInputFromPort("V"):
+            del args[-1]
+        contour_set = matplotlib.pyplot.contour(*args, **kwargs)
+        output = (contour_set, contour_set.collections)
+        contourSet = output[0]
+        lineCollections = output[1]
+        self.setResult('contourSet', contourSet)
+        if self.hasInputFromPort('lineCollectionProperties'):
+            properties = self.getInputFromPort('lineCollectionProperties')
+            if lineCollections is not None:
+                properties.update_props(lineCollections)
+
+class MplContourf(MplPlot):
+    """Plot contours.
+
+: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 version in that it does not draw the polygon edges. To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`.
+
+Call signatures:
+
+contour(Z)
+
+make a contour plot of an array Z. The level values are chosen automatically.
+
+contour(X,Y,Z)
+
+X, Y specify the (x, y) coordinates of the surface
+
+contour(Z,N) contour(X,Y,Z,N)
+
+contour N automatically-chosen levels.
+
+contour(Z,V) contour(X,Y,Z,V)
+
+draw contour lines at the values specified in sequence V
+
+contourf(..., V)
+
+fill the len(V)-1 regions between the values in V
+
+contour(Z, **kwargs)
+
+Use keyword args to control colors, linewidth, origin, cmap ... see below for more details.
+
+X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
+
+C = contour(...) returns a :class:`~matplotlib.contour.QuadContourSet` object.
+
+Optional keyword arguments:
+
+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.
+
+contour-only keyword arguments:
+
+
+
+contourf-only keyword arguments:
+
+
+
+Note: contourf 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:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "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.\n\nThis keyword is not active if X and Y are specified in the call to contour.", 'values': "[['', 'upper', 'lower', 'image']]", 'optional': True}),
+              ("linestyles", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If linestyles is None, the default is 'solid' unless the lines are monochrome.  In that case, negative contours will take their linestyle from the matplotlibrc contour.negative_linestyle setting.\n\nlinestyles 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.", 'values': "[['', 'solid', 'dashed', 'da [...]
+              ("vmin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.', 'values': "[['']]", 'optional': True}),
+              ("nchunk", "basic:Integer",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': '[[0]]', 'optional': True}),
+              ("hatches", "basic:List",
+               {'optional': True, 'docstring': 'A list of cross hatch patterns to use on the filled areas. If None, no hatching will be added to the contour. Hatching is supported in the PostScript, PDF, SVG and Agg backends only.'}),
+              ("levelsSequence", "basic:List",
+               {'optional': True, 'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]'}),
+              ("levelsScalar", "basic:Float",
+               {'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]', 'optional': True}),
+              ("linewidths", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If linewidths is None, the default width in lines.linewidth in matplotlibrc is used.\n\nIf a number, all levels will be plotted with this linewidth.\n\nIf a tuple, different levels will be plotted with different linewidths in the order specified', 'values': "[['', 'number', 'tuple of numbers']]", 'optional': True}),
+              ("colors", "basic:Color",
+               {'entry_types': "['enum']", 'docstring': "If None, the colormap specified by cmap will be used.\n\nIf a string, like 'r' or 'red', all levels will be plotted in this color.\n\nIf a tuple of matplotlib color args (string, float, rgb, etc), different levels will be plotted in different colors in the order specified.", 'values': "[['', '(mpl_colors)']]", 'optional': True}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("vmax", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, either or both of these values will be supplied to the :class:`matplotlib.colors.Normalize` instance, overriding the default color scaling based on levels.', 'values': "[['']]", 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'The alpha blending value'}),
+              ("Z", "basic:List",
+               {}),
+              ("norm", "basic:String",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': "[['', 'Normalize']]", 'optional': True}),
+              ("N", "basic:Integer",
+               {'optional': True}),
+              ("V", "basic:List",
+               {'optional': True}),
+              ("Y", "basic:List",
+               {'optional': True}),
+              ("X", "basic:List",
+               {'optional': True}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplContourf)"),
+              ("contourSet", "MplQuadContourSet",
+                {}),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        if self.hasInputFromPort('X'):
+            val = self.getInputFromPort('X')
+            args.append(val)
+        if self.hasInputFromPort('Y'):
+            val = self.getInputFromPort('Y')
+            args.append(val)
+        val = self.getInputFromPort('Z')
+        args.append(val)
+        if self.hasInputFromPort('V'):
+            val = self.getInputFromPort('V')
+            args.append(val)
+        if self.hasInputFromPort('N'):
+            val = self.getInputFromPort('N')
+            args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('origin'):
+            val = self.getInputFromPort('origin')
+            kwargs['origin'] = val
+        if self.hasInputFromPort('linestyles'):
+            val = self.getInputFromPort('linestyles')
+            kwargs['linestyles'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('nchunk'):
+            val = self.getInputFromPort('nchunk')
+            kwargs['nchunk'] = val
+        if self.hasInputFromPort('hatches'):
+            val = self.getInputFromPort('hatches')
+            kwargs['hatches'] = val
+        if self.hasInputFromPort('levelsSequence'):
+            val = self.getInputFromPort('levelsSequence')
+            kwargs['levels'] = val
+        elif self.hasInputFromPort('levelsScalar'):
+            val = self.getInputFromPort('levelsScalar')
+            kwargs['levels'] = val
+        if self.hasInputFromPort('linewidths'):
+            val = self.getInputFromPort('linewidths')
+            kwargs['linewidths'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        if self.hasInputFromPort("N") and self.hasInputFromPort("V"):
+            del args[-1]
+        contour_set = matplotlib.pyplot.contourf(*args, **kwargs)
+        output = (contour_set, contour_set.collections)
+        contourSet = output[0]
+        polyCollections = output[1]
+        self.setResult('contourSet', contourSet)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollections is not None:
+                properties.update_props(polyCollections)
+
+class MplCsd(MplPlot):
+    """Plot cross-spectral density.
+
+Call signature:
+
+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, **kwargs)
+
+The cross spectral density P_{xy} by Welch's average periodogram method.  The vectors x and y are divided into NFFT length segments.  Each segment is detrended by function detrend and windowed by function window.  The product of the direct FFTs of x and y are averaged over each segment to compute P_{xy}, with a scaling to correct for power loss due to windowing.
+
+Returns the tuple (Pxy, freqs).  P is the cross spectrum (complex valued), and 10\log_{10}|P_{xy}| is plotted.
+
+%(PSD)s
+
+
+
+kwargs control the Line2D properties:
+
+%(Line2D)s
+
+Example:
+
+seealso:  :meth:`psd`     For a description of the optional parameters.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("Fs", "basic:Integer",
+               {'optional': True, 'defaults': "['2']"}),
+              ("pad_to", "basic:String",
+               {'optional': True}),
+              ("scale_by_freq", "basic:String",
+               {'optional': True}),
+              ("detrend", "basic:String",
+               {'optional': True, 'defaults': "['<function detrend_none at 0x02F5A3F0>']"}),
+              ("window", "basic:String",
+               {'optional': True, 'defaults': "['<function window_hanning at 0x02F5A2B0>']"}),
+              ("Fc", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("NFFT", "basic:Integer",
+               {'optional': True, 'defaults': "['256']"}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("sides", "basic:String",
+               {'optional': True, 'defaults': "['default']"}),
+              ("noverlap", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("lineProperties", "MplLine2DProperties",
+               {'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplCsd)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('Fs'):
+            val = self.getInputFromPort('Fs')
+            kwargs['Fs'] = val
+        if self.hasInputFromPort('pad_to'):
+            val = self.getInputFromPort('pad_to')
+            kwargs['pad_to'] = val
+        if self.hasInputFromPort('scale_by_freq'):
+            val = self.getInputFromPort('scale_by_freq')
+            kwargs['scale_by_freq'] = val
+        if self.hasInputFromPort('detrend'):
+            val = self.getInputFromPort('detrend')
+            kwargs['detrend'] = val
+        if self.hasInputFromPort('window'):
+            val = self.getInputFromPort('window')
+            kwargs['window'] = val
+        if self.hasInputFromPort('Fc'):
+            val = self.getInputFromPort('Fc')
+            kwargs['Fc'] = val
+        if self.hasInputFromPort('NFFT'):
+            val = self.getInputFromPort('NFFT')
+            kwargs['NFFT'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('sides'):
+            val = self.getInputFromPort('sides')
+            kwargs['sides'] = val
+        if self.hasInputFromPort('noverlap'):
+            val = self.getInputFromPort('noverlap')
+            kwargs['noverlap'] = val
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            properties.update_kwargs(kwargs)
+
+        matplotlib.pyplot.csd(*args, **kwargs)        
+
+class MplErrorbar(MplPlot):
+    """Plot an errorbar graph.
+
+Call signature:
+
+errorbar(x, y, yerr=None, xerr=None,          fmt='-', ecolor=None, elinewidth=None, capsize=3,          barsabove=False, lolims=False, uplims=False,          xlolims=False, xuplims=False, errorevery=1,          capthick=None)
+
+Plot x versus y with error deltas in yerr and xerr. Vertical errorbars are plotted if yerr is not None. Horizontal errorbars are plotted if xerr is not None.
+
+x, y, xerr, and yerr can all be scalars, which plots a single error bar at x, y.
+
+Optional keyword arguments:
+
+
+
+All other keyword arguments are passed on to the plot command for the markers. For example, this code makes big red squares with thick green edges:
+
+x,y,yerr = rand(3,10) errorbar(x, y, yerr, marker='s',          mfc='red', mec='green', ms=20, mew=4)
+
+where mfc, mec, ms and mew are aliases for the longer property names, markerfacecolor, markeredgecolor, markersize and markeredgewith.
+
+valid kwargs for the marker properties are
+
+%(Line2D)s
+
+Returns (plotline, caplines, barlinecols):
+
+
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("lolims", "basic:Boolean",
+               {'optional': True, 'docstring': 'These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.', 'defaults': "['False']"}),
+              ("capsize", "basic:Float",
+               {'optional': True, 'docstring': 'The length of the error bar caps in points', 'defaults': "['3']"}),
+              ("uplims", "basic:Boolean",
+               {'optional': True, 'docstring': 'These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.', 'defaults': "['False']"}),
+              ("xlolims", "basic:Boolean",
+               {'optional': True, 'docstring': 'These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.', 'defaults': "['False']"}),
+              ("barsabove", "basic:String",
+               {'optional': True, 'docstring': 'if True, will plot the errorbars above the plot symbols. Default is below.', 'defaults': "['below']"}),
+              ("xerr", "basic:List",
+               {'optional': True, 'docstring': 'If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.\n\nIf a sequence of shape 2xN, errorbars are drawn at -row1 and +row2'}),
+              ("xerrScalar", "basic:Float",
+               {'docstring': 'If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.\n\nIf a sequence of shape 2xN, errorbars are drawn at -row1 and +row2', 'optional': True}),
+              ("fmt", "basic:String",
+               {'optional': True, 'docstring': '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.', 'defaults': "['-']"}),
+              ("ecolor", "basic:Color",
+               {'entry_types': "['enum']", 'docstring': 'A matplotlib color arg which gives the color the errorbar lines; if None, use the marker color.', 'values': "[['', 'mpl color']]", 'optional': True}),
+              ("errorevery", "basic:Integer",
+               {'optional': True, 'docstring': 'subsamples the errorbars. Eg if everyerror=5, errorbars for every 5-th datapoint will be plotted. The data plot itself still shows all data points.', 'defaults': "['1']"}),
+              ("capthick", "basic:Float",
+               {'optional': True, 'docstring': 'An alias kwarg to markeredgewidth (a.k.a. - mew). This setting is a more sensible name for the property that controls the thickness of the error bar cap in points. For backwards compatibility, if mew or markeredgewidth are given, then they will over-ride capthick.  This may change in future releases.'}),
+              ("xuplims", "basic:Boolean",
+               {'optional': True, 'docstring': 'These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same type as xerr and yerr.', 'defaults': "['False']"}),
+              ("elinewidth", "basic:Float",
+               {'optional': True, 'docstring': 'The linewidth of the errorbar lines. If None, use the linewidth.'}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("yerr", "basic:List",
+               {'optional': True, 'docstring': 'If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.\n\nIf a sequence of shape 2xN, errorbars are drawn at -row1 and +row2'}),
+              ("yerrScalar", "basic:Float",
+               {'docstring': 'If a scalar number, len(N) array-like object, or an Nx1 array-like object, errorbars are drawn +/- value.\n\nIf a sequence of shape 2xN, errorbars are drawn at -row1 and +row2', 'optional': True}),
+              ("caplineProperties", "MplLine2DProperties",
+               {}),
+              ("barlineProperties", "MplLineCollectionProperties",
+               {}),
+              ("plotlineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplErrorbar)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('lolims'):
+            val = self.getInputFromPort('lolims')
+            kwargs['lolims'] = val
+        if self.hasInputFromPort('capsize'):
+            val = self.getInputFromPort('capsize')
+            kwargs['capsize'] = val
+        if self.hasInputFromPort('uplims'):
+            val = self.getInputFromPort('uplims')
+            kwargs['uplims'] = val
+        if self.hasInputFromPort('xlolims'):
+            val = self.getInputFromPort('xlolims')
+            kwargs['xlolims'] = val
+        if self.hasInputFromPort('barsabove'):
+            val = self.getInputFromPort('barsabove')
+            kwargs['barsabove'] = val
+        if self.hasInputFromPort('xerr'):
+            val = self.getInputFromPort('xerr')
+            kwargs['xerr'] = val
+        elif self.hasInputFromPort('xerrScalar'):
+            val = self.getInputFromPort('xerrScalar')
+            kwargs['xerr'] = val
+        if self.hasInputFromPort('fmt'):
+            val = self.getInputFromPort('fmt')
+            kwargs['fmt'] = val
+        if self.hasInputFromPort('ecolor'):
+            val = self.getInputFromPort('ecolor')
+            val = translate_color(val)
+            kwargs['ecolor'] = val
+        if self.hasInputFromPort('errorevery'):
+            val = self.getInputFromPort('errorevery')
+            kwargs['errorevery'] = val
+        if self.hasInputFromPort('capthick'):
+            val = self.getInputFromPort('capthick')
+            kwargs['capthick'] = val
+        if self.hasInputFromPort('xuplims'):
+            val = self.getInputFromPort('xuplims')
+            kwargs['xuplims'] = val
+        if self.hasInputFromPort('elinewidth'):
+            val = self.getInputFromPort('elinewidth')
+            kwargs['elinewidth'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('yerr'):
+            val = self.getInputFromPort('yerr')
+            kwargs['yerr'] = val
+        elif self.hasInputFromPort('yerrScalar'):
+            val = self.getInputFromPort('yerrScalar')
+            kwargs['yerr'] = val
+
+        output = matplotlib.pyplot.errorbar(*args, **kwargs)        
+        plotline = output[0]
+        caplines = output[1]
+        barlines = output[2]
+        if self.hasInputFromPort('caplineProperties'):
+            properties = self.getInputFromPort('caplineProperties')
+            if caplines is not None:
+                properties.update_props(caplines)
+        if self.hasInputFromPort('barlineProperties'):
+            properties = self.getInputFromPort('barlineProperties')
+            if barlines is not None:
+                properties.update_props(barlines)
+        if self.hasInputFromPort('plotlineProperties'):
+            properties = self.getInputFromPort('plotlineProperties')
+            if plotline is not None:
+                properties.update_props(plotline)
+
+class MplFill(MplPlot):
+    """Plot filled polygons.
+
+Call signature:
+
+fill(*args, **kwargs)
+
+args is a variable length argument, allowing for multiple x, y pairs with an optional color format string; see :func:`~matplotlib.pyplot.plot` for details on the argument parsing.  For example, to plot a polygon with vertices at x, y in blue.:
+
+ax.fill(x,y, 'b' )
+
+An arbitrary number of x, y, color groups can be specified:
+
+ax.fill(x1, y1, 'g', x2, y2, 'r')
+
+Return value is a list of :class:`~matplotlib.patches.Patch` instances that were added.
+
+The same color strings that :func:`~matplotlib.pyplot.plot` supports are supported by the fill format string.
+
+If you would like to fill below a curve, eg. shade a region between 0 and y along x, use :meth:`fill_between`
+
+The closed kwarg will close the polygon when True (default).
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(Polygon)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("polygonProperties", "MplPolygonProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplFill)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+
+        polygons = matplotlib.pyplot.fill(*args, **kwargs)
+        if self.hasInputFromPort('polygonProperties'):
+            properties = self.getInputFromPort('polygonProperties')
+            if polygons is not None:
+                properties.update_props(polygons)
+
+class MplFillBetween(MplPlot):
+    """Make filled polygons between two curves.
+
+Call signature:
+
+fill_between(x, y1, y2=0, where=None, **kwargs)
+
+Create a :class:`~matplotlib.collections.PolyCollection` filling the regions between y1 and y2 where where==True
+
+
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(PolyCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("y2", "basic:Float",
+               {'optional': True, 'docstring': 'A scalar y-value', 'defaults': "['0.0']"}),
+              ("y2Sequence", "basic:List",
+               {'optional': True, 'docstring': 'An N-length array of the y data'}),
+              ("interpolate", "basic:Boolean",
+               {'optional': True, 'defaults': "['False']"}),
+              ("y1", "basic:List",
+               {'docstring': 'An N-length array of the y data'}),
+              ("y1Scalar", "basic:Float",
+               {'optional': True, 'docstring': 'A scalar y-value'}),
+              ("x", "basic:List",
+               {'docstring': 'An N-length array of the x data'}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("where", "basic:List",
+               {'optional': True, 'docstring': 'An N-length boolean array that specifies where the fill is effective'}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplFillBetween)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        if self.hasInputFromPort('y1'):
+            val = self.getInputFromPort('y1')
+            args.append(val)
+        elif self.hasInputFromPort('y1Scalar'):
+            val = self.getInputFromPort('y1Scalar')
+            args.append(val)
+        else:
+            raise ModuleError(self, 'Must set one of "y1", '                                   '"y1Scalar"')
+
+        kwargs = {}
+        if self.hasInputFromPort('y2'):
+            val = self.getInputFromPort('y2')
+            kwargs['y2'] = val
+        elif self.hasInputFromPort('y2Sequence'):
+            val = self.getInputFromPort('y2Sequence')
+            kwargs['y2'] = val
+        if self.hasInputFromPort('interpolate'):
+            val = self.getInputFromPort('interpolate')
+            kwargs['interpolate'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('where'):
+            val = self.getInputFromPort('where')
+            kwargs['where'] = val
+
+        polyCollection = matplotlib.pyplot.fill_between(*args, **kwargs)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollection is not None:
+                properties.update_props(polyCollection)
+
+class MplFillBetweenx(MplPlot):
+    """Make filled polygons between two horizontal curves.
+
+Call signature:
+
+fill_between(y, x1, x2=0, where=None, **kwargs)
+
+Create a :class:`~matplotlib.collections.PolyCollection` filling the regions between x1 and x2 where where==True
+
+
+
+kwargs control the :class:`~matplotlib.patches.Polygon` properties:
+
+%(PolyCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("y", "basic:List",
+               {'docstring': 'An N-length array of the y data'}),
+              ("x2", "basic:Float",
+               {'optional': True, 'docstring': 'A scalar x-value', 'defaults': "['0']"}),
+              ("x2Sequence", "basic:List",
+               {'optional': True, 'docstring': 'An N-length array of the x data'}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("x1", "basic:List",
+               {'docstring': 'An N-length array of the x data'}),
+              ("x1Scalar", "basic:Float",
+               {'optional': True, 'docstring': 'A scalar x-value'}),
+              ("where", "basic:List",
+               {'optional': True, 'docstring': 'An N-length boolean array that specifies where the fill is effective'}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplFillBetweenx)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('y')
+        args.append(val)
+        if self.hasInputFromPort('x1'):
+            val = self.getInputFromPort('x1')
+            args.append(val)
+        elif self.hasInputFromPort('x1Scalar'):
+            val = self.getInputFromPort('x1Scalar')
+            args.append(val)
+        else:
+            raise ModuleError(self, 'Must set one of "x1", '                                   '"x1Scalar"')
+
+        kwargs = {}
+        if self.hasInputFromPort('x2'):
+            val = self.getInputFromPort('x2')
+            kwargs['x2'] = val
+        elif self.hasInputFromPort('x2Sequence'):
+            val = self.getInputFromPort('x2Sequence')
+            kwargs['x2'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('where'):
+            val = self.getInputFromPort('where')
+            kwargs['where'] = val
+
+        polyCollection = matplotlib.pyplot.fill_betweenx(*args, **kwargs)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollection is not None:
+                properties.update_props(polyCollection)
+
+class MplHexbin(MplPlot):
+    """Make a hexagonal binning plot.
+
+Call signature:
+
+hexbin(x, y, C = None, gridsize = 100, bins = None,        xscale = 'linear', yscale = 'linear',        cmap=None, norm=None, vmin=None, vmax=None,        alpha=None, linewidths=None, edgecolors='none'        reduce_C_function = np.mean, mincnt=None, marginals=True        **kwargs)
+
+Make a hexagonal binning plot of x versus y, where x, y are 1-D sequences of the same length, N. If C is None (the default), this is a histogram of the number of occurences of the observations at (x[i],y[i]).
+
+If C is specified, it specifies values at the coordinate (x[i],y[i]). These values are accumulated for each hexagonal bin and then reduced according to reduce_C_function, which defaults to numpy's mean function (np.mean). (If C is specified, it must also be a 1-D sequence of the same length as x and y.)
+
+x, y and/or C may be masked arrays, in which case only unmasked points will be plotted.
+
+Optional keyword arguments:
+
+Other keyword arguments controlling color mapping and normalization arguments:
+
+Other keyword arguments controlling the Collection properties:
+
+Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs:
+
+%(Collection)s
+
+The return value is a :class:`~matplotlib.collections.PolyCollection` instance; use :meth:`~matplotlib.collections.PolyCollection.get_array` on this :class:`~matplotlib.collections.PolyCollection` to get the counts in each hexagon. If marginals is True, horizontal bar and vertical bar (both PolyCollections) will be attached to the return collection as attributes hbar and vbar.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("vmax", "basic:Float",
+               {'optional': True, 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.'}),
+              ("edgecolorsSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': "If 'none', draws the edges in the same color as the fill color. This is the default, as it avoids unsightly unpainted pixels between the hexagons.\n\nIf None, draws the outlines in the default color.\n\nIf a matplotlib color arg or sequence of rgba tuples, draws the outlines in the specified color.", 'values': "[['', 'none', 'mpl color']]", 'optional': True, 'defaults': "['none']"}),
+              ("edgecolorsScalar", "basic:String",
+               {'docstring': "If 'none', draws the edges in the same color as the fill color. This is the default, as it avoids unsightly unpainted pixels between the hexagons.\n\nIf None, draws the outlines in the default color.\n\nIf a matplotlib color arg or sequence of rgba tuples, draws the outlines in the specified color.", 'optional': True}),
+              ("C", "basic:List",
+               {'optional': True}),
+              ("gridsize", "basic:Integer",
+               {'optional': True, 'docstring': 'The number of hexagons in the x-direction, default is 100. The corresponding number of hexagons in the y-direction is chosen such that the hexagons are approximately regular. Alternatively, gridsize can be a tuple with two elements specifying the number of hexagons in the x-direction and the y-direction.', 'defaults': "['100']"}),
+              ("vmin", "basic:Float",
+               {'optional': True, 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.'}),
+              ("yscale", "basic:String",
+               {'optional': True, 'defaults': "['linear']"}),
+              ("reduce_C_function", "basic:String",
+               {'optional': True, 'defaults': "['<function mean at 0x0277B3B0>']"}),
+              ("linewidths", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If None, defaults to rc lines.linewidth. Note that this is a tuple, and if you set the linewidths argument you must set it as a sequence of floats, as required by :class:`~matplotlib.collections.RegularPolyCollection`.', 'values': "[['']]", 'optional': True}),
+              ("xscale", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Use a linear or log10 scale on the horizontal axis.', 'values': "[['linear', 'log']]", 'optional': True, 'defaults': "['linear']"}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'a :class:`matplotlib.colors.Colormap` instance. If None, defaults to rc image.cmap.', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("norm", "basic:String",
+               {'entry_types': "['enum']", 'docstring': ':class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1.', 'values': "[['', 'Normalize']]", 'optional': True}),
+              ("extent", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'The limits of the bins. The default assigns the limits based on gridsize, x, y, xscale and yscale.', 'values': "[['']]", 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'the alpha value for the patches'}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("mincnt", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, only display cells with more than mincnt number of points in the cell', 'values': "[['']]", 'optional': True}),
+              ("marginals", "basic:Boolean",
+               {'optional': True, 'docstring': 'if marginals is True, plot the marginal density as colormapped rectagles along the bottom of the x-axis and left of the y-axis', 'defaults': "['False']"}),
+              ("bins", "basic:Integer",
+               {'optional': True, 'docstring': "If None, no binning is applied; the color of each hexagon directly corresponds to its count value.\n\nIf 'log', use a logarithmic scale for the color map. Internally, log_{10}(i+1) is used to determine the hexagon color.\n\nIf an integer, divide the counts in the specified number of bins, and color the hexagons accordingly.\n\nIf a sequence of values, the values of the lower bound of the bins to be used."}),
+              ("scale", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Use a linear or log10 scale on the vertical axis.', 'values': "[['linear', 'log']]", 'optional': True}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplHexbin)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        if self.hasInputFromPort('edgecolorsSequence'):
+            val = self.getInputFromPort('edgecolorsSequence')
+            kwargs['edgecolors'] = val
+        elif self.hasInputFromPort('edgecolorsScalar'):
+            val = self.getInputFromPort('edgecolorsScalar')
+            kwargs['edgecolors'] = val
+        if self.hasInputFromPort('C'):
+            val = self.getInputFromPort('C')
+            kwargs['C'] = val
+        if self.hasInputFromPort('gridsize'):
+            val = self.getInputFromPort('gridsize')
+            kwargs['gridsize'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('yscale'):
+            val = self.getInputFromPort('yscale')
+            kwargs['yscale'] = val
+        if self.hasInputFromPort('reduce_C_function'):
+            val = self.getInputFromPort('reduce_C_function')
+            kwargs['reduce_C_function'] = val
+        if self.hasInputFromPort('linewidths'):
+            val = self.getInputFromPort('linewidths')
+            kwargs['linewidths'] = val
+        if self.hasInputFromPort('xscale'):
+            val = self.getInputFromPort('xscale')
+            kwargs['xscale'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+        if self.hasInputFromPort('extent'):
+            val = self.getInputFromPort('extent')
+            kwargs['extent'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('mincnt'):
+            val = self.getInputFromPort('mincnt')
+            kwargs['mincnt'] = val
+        if self.hasInputFromPort('marginals'):
+            val = self.getInputFromPort('marginals')
+            kwargs['marginals'] = val
+        if self.hasInputFromPort('bins'):
+            val = self.getInputFromPort('bins')
+            kwargs['bins'] = val
+        if self.hasInputFromPort('scale'):
+            val = self.getInputFromPort('scale')
+            kwargs['scale'] = val
+
+        polyCollection = matplotlib.pyplot.hexbin(*args, **kwargs)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollection is not None:
+                properties.update_props(polyCollection)
+
+class MplHist(MplPlot):
+    """Plot a histogram.
+
+Call signature:
+
+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, stacked=False,        **kwargs)
+
+Compute and draw the histogram of x. The return value is a tuple (n, bins, patches) or ([n0, n1, ...], bins, [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:
+
+
+
+kwargs are used to update the properties of the :class:`~matplotlib.patches.Patch` instances returned by hist:
+
+%(Patch)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("rwidth", "basic:String",
+               {'optional': True, 'docstring': "The relative width of the bars as a fraction of the bin width.  If None, automatically compute the width. Ignored if histtype = 'step' or 'stepfilled'."}),
+              ("normed", "basic:Boolean",
+               {'optional': True, 'docstring': 'If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)*dbin).  In a probability density, the integral of the histogram should be 1; you can verify that with a trapezoidal integration of the probability density function:\n\npdf, bins, patches = ax.hist(...) print np.sum(pdf * np.diff(bins))\n\nUntil numpy release 1.5, the underlying numpy histogram function was incorrect wi [...]
+              ("stacked", "basic:Boolean",
+               {'optional': True, 'docstring': "If True, multiple data are stacked on top of each other If False multiple data are aranged side by side if histtype is 'bar' or on top of each other if histtype is 'step'\n\n.", 'defaults': "['False']"}),
+              ("orientation", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If 'horizontal', :func:`~matplotlib.pyplot.barh` will be used for bar-type histograms and the bottom kwarg will be the left edges.", 'values': "[['horizontal', 'vertical']]", 'optional': True, 'defaults': "['vertical']"}),
+              ("bottom", "basic:String",
+               {'optional': True}),
+              ("colorSequence", "basic:List",
+               {'optional': True, 'docstring': 'Color spec or sequence of color specs, one per dataset.  Default (None) uses the standard line color sequence.'}),
+              ("colorScalar", "basic:Color",
+               {'docstring': 'Color spec or sequence of color specs, one per dataset.  Default (None) uses the standard line color sequence.', 'optional': True}),
+              ("histtype", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "The type of histogram to draw.\n\n'bar' is a traditional bar-type histogram.  If multiple data are given the bars are aranged side by side.\n\n'barstacked' is a bar-type histogram where multiple data are stacked on top of each other.\n\n'step' generates a lineplot that is by default unfilled.\n\n'stepfilled' generates a lineplot that is by default filled.", 'values': "[['bar', 'barstacked', 'step', 'stepfilled']]", 'optional': True [...]
+              ("align", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "Controls how the histogram is plotted.\n\n'left': bars are centered on the left bin edges.\n\n'mid': bars are centered between the bin edges.\n\n'right': bars are centered on the right bin edges.", 'values': "[['left', 'mid', 'right']]", 'optional': True, 'defaults': "['mid']"}),
+              ("cumulative", "basic:Boolean",
+               {'optional': True, 'docstring': 'If True, then a histogram is computed where each bin gives the counts in that bin plus all bins for smaller values. The last bin gives the total number of datapoints.  If normed is also True then the histogram is normalized such that the last bin equals 1. If cumulative evaluates to less than 0 (e.g. -1), the direction of accumulation is reversed.  In this case, if normed is also True, then the histogram is normalized such that the first bi [...]
+              ("labelSequence", "basic:List",
+               {'optional': True, 'docstring': "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:\n\nax.hist(10+2*np.random.randn(1000), label='men') ax.hist(12+3*np.random.randn(1000), label='women', alpha=0.5) ax.legend()"}),
+              ("labelScalar", "basic:String",
+               {'docstring': "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:\n\nax.hist(10+2*np.random.randn(1000), label='men') ax.hist(12+3*np.random.randn(1000), label='women', alpha=0.5) ax.legend()", 'optional': True}),
+              ("range", "basic:List",
+               {'optional': True, 'docstring': 'The lower and upper range of the bins. Lower and upper outliers are ignored. If not provided, range is (x.min(), x.max()). Range has no effect if bins is a sequence.\n\nIf bins is a sequence or range is specified, autoscaling is based on the specified bin range instead of the range of x.'}),
+              ("weights", "basic:String",
+               {'optional': True, 'docstring': 'An array of weights, of the same shape as x.  Each value in x only contributes its associated weight towards the bin count (instead of 1).  If normed is True, the weights are normalized, so that the integral of the density over the range remains 1.'}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("bins", "basic:Integer",
+               {'optional': True, 'docstring': 'Either an integer number of bins or a sequence giving the 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.', 'defaults': "['10']"}),
+              ("binsSequence", "basic:List",
+               {'docstring': 'Either an integer number of bins or a sequence giving the 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.', 'optional': True}),
+              ("log", "basic:Boolean",
+               {'optional': True, 'docstring': 'If True, the histogram axis will be set to a log scale. If log is True and x is a 1D array, empty bins will be filtered out and only the non-empty (n, bins, patches) will be returned.', 'defaults': "['False']"}),
+              ("rectangleProperties", "MplRectangleProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplHist)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('rwidth'):
+            val = self.getInputFromPort('rwidth')
+            kwargs['rwidth'] = val
+        if self.hasInputFromPort('normed'):
+            val = self.getInputFromPort('normed')
+            kwargs['normed'] = val
+        if self.hasInputFromPort('stacked'):
+            val = self.getInputFromPort('stacked')
+            kwargs['stacked'] = val
+        if self.hasInputFromPort('orientation'):
+            val = self.getInputFromPort('orientation')
+            kwargs['orientation'] = val
+        if self.hasInputFromPort('bottom'):
+            val = self.getInputFromPort('bottom')
+            kwargs['bottom'] = val
+        if self.hasInputFromPort('colorSequence'):
+            val = self.getInputFromPort('colorSequence')
+            kwargs['color'] = val
+        elif self.hasInputFromPort('colorScalar'):
+            val = self.getInputFromPort('colorScalar')
+            val = translate_color(val)
+            kwargs['color'] = val
+        if self.hasInputFromPort('histtype'):
+            val = self.getInputFromPort('histtype')
+            kwargs['histtype'] = val
+        if self.hasInputFromPort('align'):
+            val = self.getInputFromPort('align')
+            kwargs['align'] = val
+        if self.hasInputFromPort('cumulative'):
+            val = self.getInputFromPort('cumulative')
+            kwargs['cumulative'] = val
+        if self.hasInputFromPort('labelSequence'):
+            val = self.getInputFromPort('labelSequence')
+            kwargs['label'] = val
+        elif self.hasInputFromPort('labelScalar'):
+            val = self.getInputFromPort('labelScalar')
+            kwargs['label'] = val
+        if self.hasInputFromPort('range'):
+            val = self.getInputFromPort('range')
+            kwargs['range'] = val
+        if self.hasInputFromPort('weights'):
+            val = self.getInputFromPort('weights')
+            kwargs['weights'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('bins'):
+            val = self.getInputFromPort('bins')
+            kwargs['bins'] = val
+        elif self.hasInputFromPort('binsSequence'):
+            val = self.getInputFromPort('binsSequence')
+            kwargs['bins'] = val
+        if self.hasInputFromPort('log'):
+            val = self.getInputFromPort('log')
+            kwargs['log'] = val
+
+        output = matplotlib.pyplot.hist(*args, **kwargs)        
+        rectangles = output[2]
+        if self.hasInputFromPort('rectangleProperties'):
+            properties = self.getInputFromPort('rectangleProperties')
+            if rectangles is not None:
+                properties.update_props(rectangles)
+
+class MplHist2d(MplPlot):
+    """Make a 2D histogram plot.
+
+Call signature:
+
+hist2d(x, y, bins = None, range=None, weights=None, cmin=None, cmax=None **kwargs)
+
+Make a 2d histogram plot of x versus y, where x, y are 1-D sequences of the same length.
+
+The return value is (counts, xedges, yedges, Image).
+
+Optional keyword arguments: bins: [None | int | [int, int] | array_like | [array, array]]
+
+The bin specification:
+
+If int, the number of bins for the two dimensions (nx=ny=bins).
+
+If [int, int], the number of bins in each dimension (nx, ny = bins).
+
+If array_like, the bin edges for the two dimensions (x_edges=y_edges=bins).
+
+If [array, array], the bin edges in each dimension (x_edges, y_edges = bins).
+
+The default value is 10.
+
+Remaining keyword arguments are passed directly to :meth:`pcolorfast`.
+
+Rendering the histogram with a logarithmic color scale is accomplished by passing a :class:`colors.LogNorm` instance to the norm keyword argument.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("normed", "basic:Boolean",
+               {'optional': True, 'defaults': "['False']"}),
+              ("cmin", "basic:String",
+               {'optional': True}),
+              ("range", "basic:String",
+               {'optional': True}),
+              ("weights", "basic:String",
+               {'optional': True}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("cmax", "basic:String",
+               {'optional': True}),
+              ("bins", "basic:Integer",
+               {'optional': True, 'defaults': "['10']"}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplHist2d)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('normed'):
+            val = self.getInputFromPort('normed')
+            kwargs['normed'] = val
+        if self.hasInputFromPort('cmin'):
+            val = self.getInputFromPort('cmin')
+            kwargs['cmin'] = val
+        if self.hasInputFromPort('range'):
+            val = self.getInputFromPort('range')
+            kwargs['range'] = val
+        if self.hasInputFromPort('weights'):
+            val = self.getInputFromPort('weights')
+            kwargs['weights'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('cmax'):
+            val = self.getInputFromPort('cmax')
+            kwargs['cmax'] = val
+        if self.hasInputFromPort('bins'):
+            val = self.getInputFromPort('bins')
+            kwargs['bins'] = val
+
+        matplotlib.pyplot.hist2d(*args, **kwargs)        
+
+class MplHlines(MplPlot):
+    """Plot horizontal lines.
+
+call signature:
+
+hlines(y, xmin, xmax, colors='k', linestyles='solid', **kwargs)
+
+Plot horizontal lines at each y from xmin to xmax.
+
+Returns the :class:`~matplotlib.collections.LineCollection` that was added.
+
+Required arguments:
+
+
+
+Optional keyword arguments:
+
+
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("linestyles", "basic:String",
+               {'optional': True, 'docstring': "[ 'solid' | 'dashed' | 'dashdot' | 'dotted' ]", 'defaults': "['solid']"}),
+              ("label", "basic:String",
+               {'optional': True, 'defaults': "['']"}),
+              ("xminScalar", "basic:Float",
+               {'docstring': 'can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.'}),
+              ("xminSequence", "basic:List",
+               {'docstring': 'can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.', 'optional': True}),
+              ("colorsSequence", "basic:List",
+               {'optional': True, 'docstring': 'a line collections color argument, either a single color or a len(y) list of colors', 'defaults': "['k']"}),
+              ("colorsScalar", "basic:String",
+               {'docstring': 'a line collections color argument, either a single color or a len(y) list of colors', 'optional': True}),
+              ("xmaxScalar", "basic:Float",
+               {'docstring': 'can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.'}),
+              ("xmaxSequence", "basic:List",
+               {'docstring': 'can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the widths of the lines are determined by xmin and xmax.', 'optional': True}),
+              ("y", "basic:List",
+               {'docstring': 'a 1-D numpy array or iterable.'}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("lineProperties", "MplLineCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplHlines)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('linestyles'):
+            val = self.getInputFromPort('linestyles')
+            kwargs['linestyles'] = val
+        if self.hasInputFromPort('label'):
+            val = self.getInputFromPort('label')
+            kwargs['label'] = val
+        if self.hasInputFromPort('xminScalar'):
+            val = self.getInputFromPort('xminScalar')
+            kwargs['xmin'] = val
+        elif self.hasInputFromPort('xminSequence'):
+            val = self.getInputFromPort('xminSequence')
+            kwargs['xmin'] = val
+        else:
+            raise ModuleError(self, 'Must set one of "xminScalar", '                                   '"xminSequence"')
+        if self.hasInputFromPort('colorsSequence'):
+            val = self.getInputFromPort('colorsSequence')
+            kwargs['colors'] = val
+        elif self.hasInputFromPort('colorsScalar'):
+            val = self.getInputFromPort('colorsScalar')
+            kwargs['colors'] = val
+        if self.hasInputFromPort('xmaxScalar'):
+            val = self.getInputFromPort('xmaxScalar')
+            kwargs['xmax'] = val
+        elif self.hasInputFromPort('xmaxSequence'):
+            val = self.getInputFromPort('xmaxSequence')
+            kwargs['xmax'] = val
+        else:
+            raise ModuleError(self, 'Must set one of "xmaxScalar", '                                   '"xmaxSequence"')
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+
+        lines = matplotlib.pyplot.hlines(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplImshow(MplPlot):
+    """Display an image on the axes.
+
+Call signature:
+
+imshow(X, cmap=None, norm=None, aspect=None, interpolation=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 array, a uint8 array or a PIL image. If X is an array, X can have the following shapes:
+
+MxN -- luminance (grayscale, float array only)
+
+MxNx3 -- RGB (float or uint8 array)
+
+MxNx4 -- RGBA (float or uint8 array)
+
+The value for each component of MxNx3 and MxNx4 float arrays should be in the range 0.0 to 1.0; MxN float arrays may be normalised.
+
+An :class:`matplotlib.image.AxesImage` instance is returned.
+
+Keyword arguments:
+
+interpolation:
+
+Acceptable values are None, 'none', 'nearest', 'bilinear', '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 filterrad parameters
+
+If interpolation is 'none', then no interpolation is performed on the Agg, ps and pdf backends. Other backends will fall back to 'nearest'.
+
+Additional kwargs are :class:`~matplotlib.artist.Artist` properties:
+
+%(Artist)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+               {'optional': True}),
+              ("imlim", "basic:String",
+               {'optional': True}),
+              ("extent", "basic:String",
+               {'optional': True}),
+              ("vmin", "basic:String",
+               {'optional': True}),
+              ("url", "basic:String",
+               {'optional': True}),
+              ("resample", "basic:String",
+               {'optional': True}),
+              ("shape", "basic:String",
+               {'optional': True}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A :class:`matplotlib.colors.Colormap` instance, eg. cm.jet. If None, default to rc image.cmap value.\n\ncmap is ignored when X has RGB(A) information', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("filterrad", "basic:Float",
+               {'optional': True, 'defaults': "['4.0']"}),
+              ("filternorm", "basic:Integer",
+               {'optional': True, 'defaults': "['1']"}),
+              ("aspect", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If 'auto', changes the image aspect ratio to match that of the axes\n\nIf 'equal', and extent is None, changes the axes aspect ratio to match that of the image. If extent is not None, the axes aspect ratio is changed to match that of the extent.\n\nIf None, default to rc image.aspect value.", 'values': "[['', 'auto', 'equal']]", 'optional': True}),
+              ("alpha", "basic:String",
+               {'optional': True}),
+              ("vmax", "basic:String",
+               {'optional': True}),
+              ("X", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("norm", "basic:String",
+               {'optional': True}),
+              ("interpolation", "basic:String",
+               {'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplImshow)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('origin'):
+            val = self.getInputFromPort('origin')
+            kwargs['origin'] = val
+        if self.hasInputFromPort('imlim'):
+            val = self.getInputFromPort('imlim')
+            kwargs['imlim'] = val
+        if self.hasInputFromPort('extent'):
+            val = self.getInputFromPort('extent')
+            kwargs['extent'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('url'):
+            val = self.getInputFromPort('url')
+            kwargs['url'] = val
+        if self.hasInputFromPort('resample'):
+            val = self.getInputFromPort('resample')
+            kwargs['resample'] = val
+        if self.hasInputFromPort('shape'):
+            val = self.getInputFromPort('shape')
+            kwargs['shape'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('filterrad'):
+            val = self.getInputFromPort('filterrad')
+            kwargs['filterrad'] = val
+        if self.hasInputFromPort('filternorm'):
+            val = self.getInputFromPort('filternorm')
+            kwargs['filternorm'] = val
+        if self.hasInputFromPort('aspect'):
+            val = self.getInputFromPort('aspect')
+            kwargs['aspect'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        val = self.getInputFromPort('X')
+        kwargs['X'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+        if self.hasInputFromPort('interpolation'):
+            val = self.getInputFromPort('interpolation')
+            kwargs['interpolation'] = val
+
+        matplotlib.pyplot.imshow(*args, **kwargs)        
+
+class MplLoglog(MplPlot):
+    """Make a plot with log scaling on both the x and y axis.
+
+Call signature:
+
+loglog(*args, **kwargs)
+
+:func:`~matplotlib.pyplot.loglog` supports all the keyword arguments of :func:`~matplotlib.pyplot.plot` and :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("nonposx", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Non-positive values in x or y can be masked as invalid, or clipped to a very small positive number', 'values': "[['mask', 'clip']]", 'optional': True}),
+              ("nonposy", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Non-positive values in x or y can be masked as invalid, or clipped to a very small positive number', 'values': "[['mask', 'clip']]", 'optional': True}),
+              ("basex", "basic:Float",
+               {'optional': True, 'docstring': 'Base of the x/y logarithm'}),
+              ("basey", "basic:Float",
+               {'optional': True, 'docstring': 'Base of the x/y logarithm'}),
+              ("subsxSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': 'The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details', 'values': "[['']]", 'optional': True}),
+              ("subsxScalar", "basic:String",
+               {'docstring': 'The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details', 'optional': True}),
+              ("subsySequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': 'The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details', 'values': "[['']]", 'optional': True}),
+              ("subsyScalar", "basic:String",
+               {'docstring': 'The location of the minor x/y ticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`matplotlib.axes.Axes.set_xscale` / :meth:`matplotlib.axes.Axes.set_yscale` for details', 'optional': True}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplLoglog)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('nonposx'):
+            val = self.getInputFromPort('nonposx')
+            kwargs['nonposx'] = val
+        if self.hasInputFromPort('nonposy'):
+            val = self.getInputFromPort('nonposy')
+            kwargs['nonposy'] = val
+        if self.hasInputFromPort('basex'):
+            val = self.getInputFromPort('basex')
+            kwargs['basex'] = val
+        if self.hasInputFromPort('basey'):
+            val = self.getInputFromPort('basey')
+            kwargs['basey'] = val
+        if self.hasInputFromPort('subsxSequence'):
+            val = self.getInputFromPort('subsxSequence')
+            kwargs['subsx'] = val
+        elif self.hasInputFromPort('subsxScalar'):
+            val = self.getInputFromPort('subsxScalar')
+            kwargs['subsx'] = val
+        if self.hasInputFromPort('subsySequence'):
+            val = self.getInputFromPort('subsySequence')
+            kwargs['subsy'] = val
+        elif self.hasInputFromPort('subsyScalar'):
+            val = self.getInputFromPort('subsyScalar')
+            kwargs['subsy'] = val
+
+        lines = matplotlib.pyplot.loglog(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplPcolor(MplPlot):
+    """Create a pseudocolor plot of a 2-D array.
+
+Note: pcolor can be very slow for large arrays; consider using the similar but much faster :func:`~matplotlib.pyplot.pcolormesh` instead.
+
+Call signatures:
+
+pcolor(C, **kwargs) pcolor(X, Y, C, **kwargs)
+
+C is the array of color values.
+
+X and Y, if given, specify the (x, y) coordinates of the colored quadrilaterals; the quadrilateral for C[i,j] has corners at:
+
+(X[i,   j],   Y[i,   j]), (X[i,   j+1], Y[i,   j+1]), (X[i+1, j],   Y[i+1, j]), (X[i+1, j+1], Y[i+1, j+1]).
+
+Ideally the dimensions of X and Y should be one greater than those of C; if the dimensions are the same, then the last row and column of C will be ignored.
+
+Note that the the column index corresponds to the x-coordinate, and the row index corresponds to y; for details, see the :ref:`Grid Orientation <axes-pcolor-grid-orientation>` section below.
+
+If either or both of X and Y are 1-D arrays or column vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid.
+
+X, Y and C may be masked arrays.  If either C[i, j], or one of the vertices surrounding C[i,j] (X or Y at [i, j], [i+1, j], [i, j+1],[i+1, j+1]) is masked, nothing is plotted.
+
+Keyword arguments:
+
+
+
+Return value is a :class:`matplotlib.collections.Collection` instance.
+
+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, except that the Y axis is reversed.  That is, C is taken as C*(*y, x).
+
+Similarly for :func:`meshgrid`:
+
+x = np.arange(5) y = np.arange(3) X, Y = meshgrid(x,y)
+
+is equivalent to:
+
+X = array([[0, 1, 2, 3, 4],            [0, 1, 2, 3, 4],            [0, 1, 2, 3, 4]])  Y = array([[0, 0, 0, 0, 0],            [1, 1, 1, 1, 1],            [2, 2, 2, 2, 2]])
+
+so if you have:
+
+C = rand( len(x), len(y))
+
+then you need:
+
+pcolor(X, Y, C.T)
+
+or:
+
+pcolor(C.T)
+
+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.
+
+kwargs can be used to control the :class:`~matplotlib.collections.PolyCollection` properties:
+
+%(PolyCollection)s
+
+Note: the default antialiaseds is False if the default edgecolors*="none" is used.  This eliminates artificial lines at patch boundaries, and works regardless of the value of alpha.  If *edgecolors is not "none", then the default antialiaseds is taken from rcParams['patch.antialiased'], which defaults to True. Stroking the edges may be preferred if alpha is 1, but will cause artifacts otherwise.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("edgecolorsSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': "If None, the rc setting is used by default.\n\nIf 'none', edges will not be visible.\n\nAn mpl color or sequence of colors will set the edge color", 'values': "[['', 'none', 'color']]", 'optional': True}),
+              ("edgecolorsScalar", "basic:String",
+               {'docstring': "If None, the rc setting is used by default.\n\nIf 'none', edges will not be visible.\n\nAn mpl color or sequence of colors will set the edge color", 'optional': True}),
+              ("vmin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.', 'values': "[['']]", 'optional': True}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A :class:`matplotlib.colors.Colormap` instance. If None, use rc settings.', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'the alpha blending value'}),
+              ("vmax", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.', 'values': "[['']]", 'optional': True}),
+              ("shading", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If 'faceted', a black grid is drawn around each rectangle; if 'flat', edges are not drawn. Default is 'flat', contrary to MATLAB.", 'values': "[['flat', 'faceted']]", 'optional': True, 'defaults': "['flat']"}),
+              ("norm", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'An :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1. If None, defaults to :func:`normalize`.', 'values': "[['', 'Normalize']]", 'optional': True}),
+              ("Y", "basic:List",
+               {'optional': True}),
+              ("X", "basic:List",
+               {'optional': True}),
+              ("Z", "basic:List",
+               {}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplPcolor)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        if self.hasInputFromPort('X'):
+            val = self.getInputFromPort('X')
+            args.append(val)
+        if self.hasInputFromPort('Y'):
+            val = self.getInputFromPort('Y')
+            args.append(val)
+        val = self.getInputFromPort('Z')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('edgecolorsSequence'):
+            val = self.getInputFromPort('edgecolorsSequence')
+            kwargs['edgecolors'] = val
+        elif self.hasInputFromPort('edgecolorsScalar'):
+            val = self.getInputFromPort('edgecolorsScalar')
+            kwargs['edgecolors'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        if self.hasInputFromPort('shading'):
+            val = self.getInputFromPort('shading')
+            kwargs['shading'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        polyCollection = matplotlib.pyplot.pcolor(*args, **kwargs)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollection is not None:
+                properties.update_props(polyCollection)
+
+class MplPcolormesh(MplPlot):
+    """Plot a quadrilateral mesh.
+
+Call signatures:
+
+pcolormesh(C) pcolormesh(X, Y, C) pcolormesh(C, **kwargs)
+
+Create a pseudocolor plot of a 2-D array.
+
+pcolormesh is similar to :func:`~matplotlib.pyplot.pcolor`, but uses a different mechanism and returns a different object; pcolor returns a :class:`~matplotlib.collections.PolyCollection` but pcolormesh returns a :class:`~matplotlib.collections.QuadMesh`.  It is much faster, so it is almost always preferred for large arrays.
+
+C may be a masked array, but X and Y may not.  Masked array support is implemented via cmap and norm; in contrast, :func:`~matplotlib.pyplot.pcolor` simply does not draw quadrilaterals with masked colors or vertices.
+
+Keyword arguments:
+
+
+
+Return value is a :class:`matplotlib.collections.QuadMesh` object.
+
+kwargs can be used to control the :class:`matplotlib.collections.QuadMesh` properties:
+
+%(QuadMesh)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("edgecolorsSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': "If None, the rc setting is used by default.\n\nIf 'None', edges will not be visible.\n\nIf 'face', edges will have the same color as the faces.\n\nAn mpl color or sequence of colors will set the edge color", 'values': "[['', 'None', 'face', 'color']]", 'optional': True}),
+              ("edgecolorsScalar", "basic:String",
+               {'docstring': "If None, the rc setting is used by default.\n\nIf 'None', edges will not be visible.\n\nIf 'face', edges will have the same color as the faces.\n\nAn mpl color or sequence of colors will set the edge color", 'optional': True}),
+              ("vmin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.', 'values': "[['']]", 'optional': True}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A :class:`matplotlib.colors.Colormap` instance. If None, use rc settings.', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'the alpha blending value'}),
+              ("vmax", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either is None, it is autoscaled to the respective min or max of the color array C.  If not None, vmin or vmax passed in here override any pre-existing values supplied in the norm instance.', 'values': "[['']]", 'optional': True}),
+              ("shading", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "'flat' indicates a solid color for each quad.  When 'gouraud', each quad will be Gouraud shaded.  When gouraud shading, edgecolors is ignored.", 'values': "[['flat', 'gouraud']]", 'optional': True}),
+              ("norm", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0,1. If None, defaults to :func:`normalize`.', 'values': "[['', 'Normalize']]", 'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplPcolormesh)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('edgecolorsSequence'):
+            val = self.getInputFromPort('edgecolorsSequence')
+            kwargs['edgecolors'] = val
+        elif self.hasInputFromPort('edgecolorsScalar'):
+            val = self.getInputFromPort('edgecolorsScalar')
+            kwargs['edgecolors'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        if self.hasInputFromPort('shading'):
+            val = self.getInputFromPort('shading')
+            kwargs['shading'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        matplotlib.pyplot.pcolormesh(*args, **kwargs)        
+
+class MplPie(MplPlot):
+    """Plot a pie chart.
+
+Call signature:
+
+pie(x, explode=None, labels=None,     colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),     autopct=None, pctdistance=0.6, shadow=False,     labeldistance=1.1, startangle=None, radius=None)
+
+Make a pie chart of array x.  The fractional area of each wedge is given by x/sum(x).  If sum(x) <= 1, then the values of x give the fractional area directly and the array will not be normalized.  The wedges are plotted counterclockwise, by default starting from the x-axis.
+
+Keyword arguments:
+
+radius: [ None | scalar ] The radius of the pie, if radius is None it will be set to 1.
+
+The pie chart will probably look best if the figure and axes are square.  Eg.:
+
+figure(figsize=(8,8)) ax = axes([0.1, 0.1, 0.8, 0.8])
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("autopct", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, is a string or function used to label the wedges with their numeric value.  The label will be placed inside the wedge.  If it is a format string, the label will be fmt%pct. If it is a function, it will be called.', 'values': "[['', 'format function']]", 'optional': True}),
+              ("pctdistance", "basic:Float",
+               {'optional': True, 'docstring': 'The ratio between the center of each pie slice and the start of the text generated by autopct.  Ignored if autopct is None; default is 0.6.', 'defaults': "['0.6']"}),
+              ("labelsSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': 'A sequence of strings providing the labels for each wedge', 'values': "[['']]", 'optional': True}),
+              ("labelsScalar", "basic:String",
+               {'docstring': 'A sequence of strings providing the labels for each wedge', 'optional': True}),
+              ("explodeSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': 'If not None, is a len(x) array which specifies the fraction of the radius with which to offset each wedge.', 'values': "[['']]", 'optional': True}),
+              ("explodeScalar", "basic:String",
+               {'docstring': 'If not None, is a len(x) array which specifies the fraction of the radius with which to offset each wedge.', 'optional': True}),
+              ("colors", "basic:Color",
+               {'entry_types': "['enum']", 'docstring': 'A sequence of matplotlib color args through which the pie chart will cycle.', 'values': "[['']]", 'optional': True}),
+              ("radius", "basic:String",
+               {'optional': True}),
+              ("startangle", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If not None, rotates the start of the pie chart by angle degrees counterclockwise from the x-axis.', 'values': "[['', 'Offset angle']]", 'optional': True}),
+              ("x", "basic:List",
+               {}),
+              ("shadow", "basic:Boolean",
+               {'optional': True, 'docstring': 'Draw a shadow beneath the pie.', 'defaults': "['False']"}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("labeldistance", "basic:Float",
+               {'optional': True, 'docstring': 'The radial distance at which the pie labels are drawn', 'defaults': "['1.1']"}),
+              ("autotextProperties", "MplTextProperties",
+               {}),
+              ("wedgeProperties", "MplWedgeProperties",
+               {}),
+              ("textProperties", "MplTextProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplPie)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('autopct'):
+            val = self.getInputFromPort('autopct')
+            kwargs['autopct'] = val
+        if self.hasInputFromPort('pctdistance'):
+            val = self.getInputFromPort('pctdistance')
+            kwargs['pctdistance'] = val
+        if self.hasInputFromPort('labelsSequence'):
+            val = self.getInputFromPort('labelsSequence')
+            kwargs['labels'] = val
+        elif self.hasInputFromPort('labelsScalar'):
+            val = self.getInputFromPort('labelsScalar')
+            kwargs['labels'] = val
+        if self.hasInputFromPort('explodeSequence'):
+            val = self.getInputFromPort('explodeSequence')
+            kwargs['explode'] = val
+        elif self.hasInputFromPort('explodeScalar'):
+            val = self.getInputFromPort('explodeScalar')
+            kwargs['explode'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+        if self.hasInputFromPort('radius'):
+            val = self.getInputFromPort('radius')
+            kwargs['radius'] = val
+        if self.hasInputFromPort('startangle'):
+            val = self.getInputFromPort('startangle')
+            kwargs['startangle'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('shadow'):
+            val = self.getInputFromPort('shadow')
+            kwargs['shadow'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('labeldistance'):
+            val = self.getInputFromPort('labeldistance')
+            kwargs['labeldistance'] = val
+
+        output = matplotlib.pyplot.pie(*args, **kwargs)        
+        if len(output) < 3:
+            output = output + ([],)
+        wedges = output[0]
+        texts = output[1]
+        autotexts = output[2]
+        if self.hasInputFromPort('autotextProperties'):
+            properties = self.getInputFromPort('autotextProperties')
+            if autotexts is not None:
+                properties.update_props(autotexts)
+        if self.hasInputFromPort('wedgeProperties'):
+            properties = self.getInputFromPort('wedgeProperties')
+            if wedges is not None:
+                properties.update_props(wedges)
+        if self.hasInputFromPort('textProperties'):
+            properties = self.getInputFromPort('textProperties')
+            if texts is not None:
+                properties.update_props(texts)
+
+class MplPlotDate(MplPlot):
+    """Plot with data with dates.
+
+Call signature:
+
+plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, **kwargs)
+
+Similar to the :func:`~matplotlib.pyplot.plot` command, except the x or y (or both) data is considered to be dates, and the axis is labeled accordingly.
+
+x and/or y can be a sequence of dates represented as float days since 0001-01-01 UTC.
+
+Keyword arguments:
+
+
+
+Note if you are using custom date tickers and formatters, it may be necessary to set the formatters/locators after the call to :meth:`plot_date` since :meth:`plot_date` will set the default tick locator to :class:`matplotlib.dates.AutoDateLocator` (if the tick locator is not already set to a :class:`matplotlib.dates.DateLocator` instance) and the default tick formatter to :class:`matplotlib.dates.AutoDateFormatter` (if the tick formatter is not already set to a :class:`matplotlib.dates.D [...]
+
+Valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("tz", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'The time zone to use in labeling dates. If None, defaults to rc value.', 'values': "[['', ':class:`tzinfo` instance']]", 'optional': True}),
+              ("fmt", "basic:String",
+               {'optional': True, 'docstring': 'The plot format string.', 'defaults': "['bo']"}),
+              ("ydate", "basic:Boolean",
+               {'optional': True, 'docstring': 'If True, the y-axis will be labeled with dates.', 'defaults': "['False']"}),
+              ("xdate", "basic:Boolean",
+               {'optional': True, 'docstring': 'If True, the x-axis will be labeled with dates.', 'defaults': "['True']"}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplPlotDate)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('tz'):
+            val = self.getInputFromPort('tz')
+            kwargs['tz'] = val
+        if self.hasInputFromPort('fmt'):
+            val = self.getInputFromPort('fmt')
+            kwargs['fmt'] = val
+        if self.hasInputFromPort('ydate'):
+            val = self.getInputFromPort('ydate')
+            kwargs['ydate'] = val
+        if self.hasInputFromPort('xdate'):
+            val = self.getInputFromPort('xdate')
+            kwargs['xdate'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+
+        lines = matplotlib.pyplot.plot_date(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplPsd(MplPlot):
+    """Plot the power spectral density.
+
+Call signature:
+
+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, **kwargs)
+
+The power spectral density by Welch's average periodogram method.  The vector x is divided into NFFT length segments.  Each segment is detrended by function detrend and windowed by function window.  noverlap gives the length of the overlap between segments.  The |\mathrm{fft}(i)|^2 of each segment i are averaged to compute Pxx, with a scaling to correct for power loss due to windowing.  Fs is the sampling frequency.
+
+%(PSD)s
+
+
+
+Returns the tuple (Pxx, freqs).
+
+For plotting, the power is plotted as 10\log_{10}(P_{xx}) for decibels, though Pxx itself is returned.
+
+kwargs control the :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("Fs", "basic:Integer",
+               {'optional': True, 'defaults': "['2']"}),
+              ("pad_to", "basic:String",
+               {'optional': True}),
+              ("scale_by_freq", "basic:String",
+               {'optional': True}),
+              ("detrend", "basic:String",
+               {'optional': True, 'defaults': "['<function detrend_none at 0x02F5A3F0>']"}),
+              ("window", "basic:String",
+               {'optional': True, 'defaults': "['<function window_hanning at 0x02F5A2B0>']"}),
+              ("Fc", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("NFFT", "basic:Integer",
+               {'optional': True, 'defaults': "['256']"}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("sides", "basic:String",
+               {'optional': True, 'defaults': "['default']"}),
+              ("noverlap", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("lineProperties", "MplLine2DProperties",
+               {'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplPsd)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('Fs'):
+            val = self.getInputFromPort('Fs')
+            kwargs['Fs'] = val
+        if self.hasInputFromPort('pad_to'):
+            val = self.getInputFromPort('pad_to')
+            kwargs['pad_to'] = val
+        if self.hasInputFromPort('scale_by_freq'):
+            val = self.getInputFromPort('scale_by_freq')
+            kwargs['scale_by_freq'] = val
+        if self.hasInputFromPort('detrend'):
+            val = self.getInputFromPort('detrend')
+            kwargs['detrend'] = val
+        if self.hasInputFromPort('window'):
+            val = self.getInputFromPort('window')
+            kwargs['window'] = val
+        if self.hasInputFromPort('Fc'):
+            val = self.getInputFromPort('Fc')
+            kwargs['Fc'] = val
+        if self.hasInputFromPort('NFFT'):
+            val = self.getInputFromPort('NFFT')
+            kwargs['NFFT'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('sides'):
+            val = self.getInputFromPort('sides')
+            kwargs['sides'] = val
+        if self.hasInputFromPort('noverlap'):
+            val = self.getInputFromPort('noverlap')
+            kwargs['noverlap'] = val
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            properties.update_kwargs(kwargs)
+
+        matplotlib.pyplot.psd(*args, **kwargs)        
+
+class MplQuiver(MplPlot):
+    """Plot a 2-D field of arrows.
+
+call signatures:
+
+quiver(U, V, **kw) quiver(U, V, C, **kw) quiver(X, Y, U, V, **kw) quiver(X, Y, U, V, C, **kw)
+
+Arguments:
+
+
+
+All arguments may be 1-D or 2-D arrays or sequences. If X and Y are absent, they will be generated as a uniform grid.  If U and V are 2-D arrays but X and Y are 1-D, and if len(X) and len(Y) match the column and row dimensions of U, then X and Y will be expanded with :func:`numpy.meshgrid`.
+
+U, V, C may be masked arrays, but masked X, Y are not supported at present.
+
+Keyword arguments:
+
+
+
+The defaults give a slightly swept-back arrow; to make the head a triangle, make headaxislength the same as headlength. To make the arrow more pointed, reduce headwidth or increase headlength and headaxislength. To make the head smaller relative to the shaft, scale down all the head parameters. You will probably do best to leave minshaft alone.
+
+linewidths and edgecolors can be used to customize the arrow outlines. Additional :class:`~matplotlib.collections.PolyCollection` keyword arguments:
+
+agg_filter: unknown alpha: float or None animated: [True | False] antialiased or antialiaseds: Boolean or sequence of booleans array: unknown axes: an :class:`~matplotlib.axes.Axes` instance clim: a length 2 sequence of floats clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] cmap: a colormap or registered co [...]
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("headaxislength", "basic:Float",
+               {'optional': True, 'docstring': 'Head length at shaft intersection, default is 4.5', 'defaults': "['4.5']"}),
+              ("C", "basic:List",
+               {'optional': True, 'docstring': 'None'}),
+              ("scale", "basic:String",
+               {'entry_types': "['enum']", 'docstring': '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.  The arrow length unit is given by the scale_units parameter', 'values': "[['']]", 'optional': True}),
+              ("width", "basic:List",
+               {'optional': True, 'docstring': 'Shaft width in arrow units; default depends on choice of units, above, and number of vectors; a typical starting value is about 0.005 times the width of the plot.'}),
+              ("headlength", "basic:Float",
+               {'optional': True, 'docstring': 'Head length as multiple of shaft width, default is 5', 'defaults': "['5']"}),
+              ("minlength", "basic:Float",
+               {'optional': True, 'docstring': 'Minimum length as a multiple of shaft width; if an arrow length is less than this, plot a dot (hexagon) of this diameter instead. Default is 1.', 'defaults': "['1']"}),
+              ("minshaft", "basic:Float",
+               {'optional': True, 'docstring': 'Length below which arrow scales, in units of head length. Do not set this to less than 1, or small arrows will look terrible! Default is 1', 'defaults': "['1']"}),
+              ("pivot", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot.', 'values': "[['tail', 'middle', 'tip']]", 'optional': True}),
+              ("unitsSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': '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.\n\nIf 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".', 'values': "[['width', 'height', 'd [...]
+              ("unitsScalar", "basic:String",
+               {'docstring': '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.\n\nIf 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".', 'optional': True}),
+              ("headwidth", "basic:Float",
+               {'optional': True, 'docstring': 'Head width as multiple of shaft width, default is 3', 'defaults': "['3']"}),
+              ("U", "basic:List",
+               {'docstring': 'None'}),
+              ("angles", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "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 CCW from the x-axis. With 'xy', the arrow points from (x,y) to (x+u, y+v). Alternatively, arbitrary angles may be specified as an array of values in degrees, CCW from the x-axis.", 'values': "[['uv', 'xy', 'array']]", 'optional': True}),
+              ("V", "basic:List",
+               {'docstring': 'None'}),
+              ("Y", "basic:List",
+               {'optional': True, 'docstring': 'None'}),
+              ("X", "basic:List",
+               {'optional': True, 'docstring': 'None'}),
+              ("scale_units", "basic:List",
+               {'optional': True, 'docstring': '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.\n\nIf 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".'}),
+              ("colorSequence", "basic:List",
+               {'optional': True, 'docstring': 'This is a synonym for the :class:`~matplotlib.collections.PolyCollection` facecolor kwarg. If C has been set, color has no effect.'}),
+              ("colorScalar", "basic:String",
+               {'docstring': 'This is a synonym for the :class:`~matplotlib.collections.PolyCollection` facecolor kwarg. If C has been set, color has no effect.', 'optional': True}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplQuiver)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        if self.hasInputFromPort('X'):
+            val = self.getInputFromPort('X')
+            args.append(val)
+        if self.hasInputFromPort('Y'):
+            val = self.getInputFromPort('Y')
+            args.append(val)
+        val = self.getInputFromPort('U')
+        args.append(val)
+        val = self.getInputFromPort('V')
+        args.append(val)
+        if self.hasInputFromPort('C'):
+            val = self.getInputFromPort('C')
+            args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('headaxislength'):
+            val = self.getInputFromPort('headaxislength')
+            kwargs['headaxislength'] = val
+        if self.hasInputFromPort('scale'):
+            val = self.getInputFromPort('scale')
+            kwargs['scale'] = val
+        if self.hasInputFromPort('width'):
+            val = self.getInputFromPort('width')
+            kwargs['width'] = val
+        if self.hasInputFromPort('headlength'):
+            val = self.getInputFromPort('headlength')
+            kwargs['headlength'] = val
+        if self.hasInputFromPort('minlength'):
+            val = self.getInputFromPort('minlength')
+            kwargs['minlength'] = val
+        if self.hasInputFromPort('minshaft'):
+            val = self.getInputFromPort('minshaft')
+            kwargs['minshaft'] = val
+        if self.hasInputFromPort('pivot'):
+            val = self.getInputFromPort('pivot')
+            kwargs['pivot'] = val
+        if self.hasInputFromPort('unitsSequence'):
+            val = self.getInputFromPort('unitsSequence')
+            kwargs['units'] = val
+        elif self.hasInputFromPort('unitsScalar'):
+            val = self.getInputFromPort('unitsScalar')
+            kwargs['units'] = val
+        if self.hasInputFromPort('headwidth'):
+            val = self.getInputFromPort('headwidth')
+            kwargs['headwidth'] = val
+        if self.hasInputFromPort('angles'):
+            val = self.getInputFromPort('angles')
+            kwargs['angles'] = val
+        if self.hasInputFromPort('scale_units'):
+            val = self.getInputFromPort('scale_units')
+            kwargs['scale_units'] = val
+        if self.hasInputFromPort('colorSequence'):
+            val = self.getInputFromPort('colorSequence')
+            kwargs['color'] = val
+        elif self.hasInputFromPort('colorScalar'):
+            val = self.getInputFromPort('colorScalar')
+            val = translate_color(val)
+            kwargs['color'] = val
+
+        polyCollection = matplotlib.pyplot.quiver(*args, **kwargs)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollection is not None:
+                properties.update_props(polyCollection)
+
+class MplQuiverkey(MplPlot):
+    """Add a key to a quiver plot.
+
+Call signature:
+
+quiverkey(Q, X, Y, U, label, **kw)
+
+Arguments:
+
+
+
+Keyword arguments:
+
+
+
+Any additional keyword arguments are used to override vector properties taken from Q.
+
+The positioning of the key depends on X, Y, coordinates, and labelpos.  If labelpos is 'N' or 'S', X, Y give the position of the middle of the key arrow.  If labelpos is 'E', X, Y positions the head, and if labelpos is 'W', X, Y positions the tail; in either of these two cases, X, Y is somewhere in the middle of the arrow+label key object.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("color", "basic:Color",
+               {'optional': True, 'docstring': 'overrides face and edge colors from Q.'}),
+              ("coordinatesSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': "Coordinate system and units for X, Y: 'axes' and 'figure' are normalized coordinate systems with 0,0 in the lower left and 1,1 in the upper right; 'data' are the axes data coordinates (used for the locations of the vectors in the quiver plot itself); 'inches' is position in the figure in inches, with 0,0 at the lower left corner.", 'values': "[['axes', 'figure', 'data', 'inches']]", 'optional': True}),
+              ("coordinatesScalar", "basic:String",
+               {'docstring': "Coordinate system and units for X, Y: 'axes' and 'figure' are normalized coordinate systems with 0,0 in the lower left and 1,1 in the upper right; 'data' are the axes data coordinates (used for the locations of the vectors in the quiver plot itself); 'inches' is position in the figure in inches, with 0,0 at the lower left corner.", 'optional': True}),
+              ("label", "basic:String",
+               {'docstring': 'A string with the length and units of the key'}),
+              ("Q", "basic:String",
+               {'docstring': 'The Quiver instance returned by a call to quiver.'}),
+              ("labelcolor", "basic:Color",
+               {'optional': True, 'docstring': 'defaults to default :class:`~matplotlib.text.Text` color.'}),
+              ("fontproperties", "basic:String",
+               {'optional': True, 'docstring': 'A dictionary with keyword arguments accepted by the :class:`~matplotlib.font_manager.FontProperties` initializer: family, style, variant, size, weight'}),
+              ("U", "basic:String",
+               {'docstring': 'The length of the key'}),
+              ("labelpos", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Position the label above, below, to the right, to the left of the arrow, respectively.', 'values': "[['N', 'S', 'E', 'W']]", 'optional': True}),
+              ("Y", "basic:String",
+               {'docstring': 'The location of the key; additional explanation follows.'}),
+              ("X", "basic:String",
+               {'docstring': 'The location of the key; additional explanation follows.'}),
+              ("labelsep", "basic:Float",
+               {'optional': True, 'docstring': 'Distance in inches between the arrow and the label.  Default is 0.1', 'defaults': "['0.1']"}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplQuiverkey)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('color'):
+            val = self.getInputFromPort('color')
+            val = translate_color(val)
+            kwargs['color'] = val
+        if self.hasInputFromPort('coordinatesSequence'):
+            val = self.getInputFromPort('coordinatesSequence')
+            kwargs['coordinates'] = val
+        elif self.hasInputFromPort('coordinatesScalar'):
+            val = self.getInputFromPort('coordinatesScalar')
+            kwargs['coordinates'] = val
+        val = self.getInputFromPort('label')
+        kwargs['label'] = val
+        val = self.getInputFromPort('Q')
+        kwargs['Q'] = val
+        if self.hasInputFromPort('labelcolor'):
+            val = self.getInputFromPort('labelcolor')
+            val = translate_color(val)
+            kwargs['labelcolor'] = val
+        if self.hasInputFromPort('fontproperties'):
+            val = self.getInputFromPort('fontproperties')
+            kwargs['fontproperties'] = val
+        val = self.getInputFromPort('U')
+        kwargs['U'] = val
+        if self.hasInputFromPort('labelpos'):
+            val = self.getInputFromPort('labelpos')
+            kwargs['labelpos'] = val
+        val = self.getInputFromPort('Y')
+        kwargs['Y'] = val
+        val = self.getInputFromPort('X')
+        kwargs['X'] = val
+        if self.hasInputFromPort('labelsep'):
+            val = self.getInputFromPort('labelsep')
+            kwargs['labelsep'] = val
+
+        matplotlib.pyplot.quiverkey(*args, **kwargs)        
+
+class MplScatter(MplPlot):
+    """Make a scatter plot.
+
+Call signatures:
+
+scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,         vmin=None, vmax=None, alpha=None, linewidths=None,         verts=None, **kwargs)
+
+Make a scatter plot of x versus y, where x, y are converted to 1-D sequences which must be of the same length, N.
+
+Keyword arguments:
+
+
+
+Any or all of x, y, s, and c may be masked arrays, in which case all masks will be combined and only unmasked points will be plotted.
+
+Other keyword arguments: the color mapping and normalization arguments will be used only if c is an array of floats.
+
+
+
+Optional kwargs control the :class:`~matplotlib.collections.Collection` properties; in particular:
+
+
+
+Here are the standard descriptions of all the :class:`~matplotlib.collections.Collection` kwargs:
+
+%(Collection)s
+
+A :class:`~matplotlib.collections.Collection` instance is returned.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("vmax", "basic:String",
+               {'optional': True, 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.'}),
+              ("edgecolors", "basic:String",
+               {'optional': True, 'docstring': "The string 'none' to plot faces with no outlines"}),
+              ("cSequence", "basic:List",
+               {'optional': True, 'docstring': 'a color. c can be a single color format string, or a sequence of color specifications of length N, or a sequence of N numbers to be mapped to colors using the cmap and norm specified via kwargs (see below). Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped.  c can be a 2-D array in which the rows are RGB or RGBA, however.', 'defaults': "['b']"}),
+              ("cScalar", "basic:String",
+               {'docstring': 'a color. c can be a single color format string, or a sequence of color specifications of length N, or a sequence of N numbers to be mapped to colors using the cmap and norm specified via kwargs (see below). Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped.  c can be a 2-D array in which the rows are RGB or RGBA, however.', 'optional': True}),
+              ("vmin", "basic:String",
+               {'optional': True, 'docstring': 'vmin and vmax are used in conjunction with norm to normalize luminance data.  If either are None, the min and max of the color array C is used.  Note if you pass a norm instance, your settings for vmin and vmax will be ignored.'}),
+              ("faceted", "basic:Boolean",
+               {'optional': True, 'defaults': "['True']"}),
+              ("linewidths", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If None, defaults to (lines.linewidth,).  Note that this is a tuple, and if you set the linewidths argument you must set it as a sequence of floats, as required by :class:`~matplotlib.collections.RegularPolyCollection`.', 'values': "[['']]", 'optional': True}),
+              ("marker", "basic:String",
+               {'optional': True, 'docstring': 'can be one of:\n\n%(MarkerTable)s', 'defaults': "['o']"}),
+              ("s", "basic:Float",
+               {'optional': True, 'docstring': 'size in points^2.  It is a scalar or an array of the same length as x and y.', 'defaults': "['20']"}),
+              ("cmap", "basic:String",
+               {'optional': True, 'docstring': 'A :class:`matplotlib.colors.Colormap` instance or registered name. If None, defaults to rc image.cmap. cmap is only used if c is an array of floats.'}),
+              ("verts", "basic:String",
+               {'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'The alpha value for the patches'}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("facecolors", "basic:String",
+               {'optional': True, 'docstring': "The string 'none' to plot unfilled outlines"}),
+              ("norm", "basic:String",
+               {'optional': True, 'docstring': 'A :class:`matplotlib.colors.Normalize` instance is used to scale luminance data to 0, 1. If None, use the default :func:`normalize`. norm is only used if c is an array of floats.'}),
+              ("pathCollectionProperties", "MplPathCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplScatter)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('vmax'):
+            val = self.getInputFromPort('vmax')
+            kwargs['vmax'] = val
+        if self.hasInputFromPort('edgecolors'):
+            val = self.getInputFromPort('edgecolors')
+            kwargs['edgecolors'] = val
+        if self.hasInputFromPort('cSequence'):
+            val = self.getInputFromPort('cSequence')
+            kwargs['c'] = val
+        elif self.hasInputFromPort('cScalar'):
+            val = self.getInputFromPort('cScalar')
+            kwargs['c'] = val
+        if self.hasInputFromPort('vmin'):
+            val = self.getInputFromPort('vmin')
+            kwargs['vmin'] = val
+        if self.hasInputFromPort('faceted'):
+            val = self.getInputFromPort('faceted')
+            kwargs['faceted'] = val
+        if self.hasInputFromPort('linewidths'):
+            val = self.getInputFromPort('linewidths')
+            kwargs['linewidths'] = val
+        if self.hasInputFromPort('marker'):
+            val = self.getInputFromPort('marker')
+            kwargs['marker'] = val
+        if self.hasInputFromPort('s'):
+            val = self.getInputFromPort('s')
+            kwargs['s'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('verts'):
+            val = self.getInputFromPort('verts')
+            kwargs['verts'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('facecolors'):
+            val = self.getInputFromPort('facecolors')
+            kwargs['facecolors'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        pathCollection = matplotlib.pyplot.scatter(*args, **kwargs)
+        if self.hasInputFromPort('pathCollectionProperties'):
+            properties = self.getInputFromPort('pathCollectionProperties')
+            if pathCollection is not None:
+                properties.update_props(pathCollection)
+
+class MplSemilogx(MplPlot):
+    """Make a plot with log scaling on the x axis.
+
+Call signature:
+
+semilogx(*args, **kwargs)
+
+:func:`semilogx` supports all the keyword arguments of :func:`~matplotlib.pyplot.plot` and :meth:`matplotlib.axes.Axes.set_xscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("basex", "basic:Float",
+               {'optional': True, 'docstring': 'Base of the x logarithm'}),
+              ("nonposx", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Non-positive values in x can be masked as invalid, or clipped to a very small positive number', 'values': "[['mask', 'clip']]", 'optional': True}),
+              ("subsxSequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': 'The location of the minor xticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_xscale` for details.', 'values': "[['']]", 'optional': True}),
+              ("subsxScalar", "basic:String",
+               {'docstring': 'The location of the minor xticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_xscale` for details.', 'optional': True}),
+              ("x", "basic:List",
+               {}),
+              ("y", "basic:List",
+               {}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplSemilogx)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('basex'):
+            val = self.getInputFromPort('basex')
+            kwargs['basex'] = val
+        if self.hasInputFromPort('nonposx'):
+            val = self.getInputFromPort('nonposx')
+            kwargs['nonposx'] = val
+        if self.hasInputFromPort('subsxSequence'):
+            val = self.getInputFromPort('subsxSequence')
+            kwargs['subsx'] = val
+        elif self.hasInputFromPort('subsxScalar'):
+            val = self.getInputFromPort('subsxScalar')
+            kwargs['subsx'] = val
+
+        lines = matplotlib.pyplot.semilogx(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplSemilogy(MplPlot):
+    """Make a plot with log scaling on the y axis.
+
+call signature:
+
+semilogy(*args, **kwargs)
+
+:func:`semilogy` supports all the keyword arguments of :func:`~matplotlib.pylab.plot` and :meth:`matplotlib.axes.Axes.set_yscale`.
+
+Notable keyword arguments:
+
+
+
+The remaining valid kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("basey", "basic:Float",
+               {'optional': True, 'docstring': 'Base of the y logarithm'}),
+              ("nonposy", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'Non-positive values in y can be masked as invalid, or clipped to a very small positive number', 'values': "[['mask', 'clip']]", 'optional': True}),
+              ("subsySequence", "basic:List",
+               {'entry_types': "['enum']", 'docstring': 'The location of the minor yticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_yscale` for details.', 'values': "[['']]", 'optional': True}),
+              ("subsyScalar", "basic:String",
+               {'docstring': 'The location of the minor yticks; None defaults to autosubs, which depend on the number of decades in the plot; see :meth:`~matplotlib.axes.Axes.set_yscale` for details.', 'optional': True}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplSemilogy)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('basey'):
+            val = self.getInputFromPort('basey')
+            kwargs['basey'] = val
+        if self.hasInputFromPort('nonposy'):
+            val = self.getInputFromPort('nonposy')
+            kwargs['nonposy'] = val
+        if self.hasInputFromPort('subsySequence'):
+            val = self.getInputFromPort('subsySequence')
+            kwargs['subsy'] = val
+        elif self.hasInputFromPort('subsyScalar'):
+            val = self.getInputFromPort('subsyScalar')
+            kwargs['subsy'] = val
+
+        lines = matplotlib.pyplot.semilogy(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplSpecgram(MplPlot):
+    """Plot a spectrogram.
+
+Call signature:
+
+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, **kwargs)
+
+Compute a spectrogram of data in x.  Data are split into NFFT length segments and the PSD of each section is computed.  The windowing function window is applied to each segment, and the amount of overlap of each segment is specified with noverlap.
+
+%(PSD)s
+
+kwargs:
+
+Additional kwargs are passed on to imshow which makes the specgram image
+
+Return value is (Pxx, freqs, bins, im):
+
+bins are the time points the spectrogram is calculated over
+
+freqs is an array of frequencies
+
+Pxx is an array of shape (len(times), len(freqs)) of power
+
+im is a :class:`~matplotlib.image.AxesImage` instance
+
+Note: If x is real (i.e. non-complex), only the positive spectrum is shown.  If x is complex, both positive and negative parts of the spectrum are shown.  This can be overridden using the sides keyword argument.
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("Fs", "basic:Integer",
+               {'optional': True, 'defaults': "['2']"}),
+              ("pad_to", "basic:String",
+               {'optional': True}),
+              ("scale_by_freq", "basic:String",
+               {'optional': True}),
+              ("xextent", "basic:String",
+               {'optional': True}),
+              ("detrend", "basic:String",
+               {'optional': True, 'defaults': "['<function detrend_none at 0x02F5A3F0>']"}),
+              ("window", "basic:String",
+               {'optional': True, 'defaults': "['<function window_hanning at 0x02F5A2B0>']"}),
+              ("Fc", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("NFFT", "basic:Integer",
+               {'optional': True, 'defaults': "['256']"}),
+              ("cmap", "basic:String",
+               {'optional': True}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("sides", "basic:String",
+               {'optional': True, 'defaults': "['default']"}),
+              ("noverlap", "basic:Integer",
+               {'optional': True, 'defaults': "['128']"}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplSpecgram)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('Fs'):
+            val = self.getInputFromPort('Fs')
+            kwargs['Fs'] = val
+        if self.hasInputFromPort('pad_to'):
+            val = self.getInputFromPort('pad_to')
+            kwargs['pad_to'] = val
+        if self.hasInputFromPort('scale_by_freq'):
+            val = self.getInputFromPort('scale_by_freq')
+            kwargs['scale_by_freq'] = val
+        if self.hasInputFromPort('xextent'):
+            val = self.getInputFromPort('xextent')
+            kwargs['xextent'] = val
+        if self.hasInputFromPort('detrend'):
+            val = self.getInputFromPort('detrend')
+            kwargs['detrend'] = val
+        if self.hasInputFromPort('window'):
+            val = self.getInputFromPort('window')
+            kwargs['window'] = val
+        if self.hasInputFromPort('Fc'):
+            val = self.getInputFromPort('Fc')
+            kwargs['Fc'] = val
+        if self.hasInputFromPort('NFFT'):
+            val = self.getInputFromPort('NFFT')
+            kwargs['NFFT'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('sides'):
+            val = self.getInputFromPort('sides')
+            kwargs['sides'] = val
+        if self.hasInputFromPort('noverlap'):
+            val = self.getInputFromPort('noverlap')
+            kwargs['noverlap'] = val
+
+        matplotlib.pyplot.specgram(*args, **kwargs)        
+
+class MplStackplot(MplPlot):
+    """Draws a stacked area plot.
+
+x : 1d array of dimension N
+
+Keyword arguments:
+
+Returns r : A list of :class:`~matplotlib.collections.PolyCollection`, one for each element in the stacked area plot.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("x", "basic:String",
+               {}),
+              ("colors", "basic:Color",
+               {'optional': True, 'docstring': 'used to colour the stacked areas. All other keyword arguments are passed to :func:`~matplotlib.Axes.fill_between`'}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplStackplot)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+
+        matplotlib.pyplot.stackplot(*args, **kwargs)        
+
+class MplStem(MplPlot):
+    """Create a stem plot.
+
+Call signature:
+
+stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-')
+
+A stem plot plots vertical lines (using linefmt) at each x location from the baseline to y, and places a marker there using markerfmt.  A horizontal line at 0 is is plotted using basefmt.
+
+Return value is a tuple (markerline, stemlines, baseline).
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("bottom", "basic:String",
+               {'optional': True}),
+              ("label", "basic:String",
+               {'optional': True}),
+              ("linefmt", "basic:String",
+               {'optional': True, 'defaults': "['b-']"}),
+              ("markerfmt", "basic:String",
+               {'optional': True, 'defaults': "['bo']"}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("basefmt", "basic:String",
+               {'optional': True, 'defaults': "['r-']"}),
+              ("stemlineProperties", "MplLine2DProperties",
+               {}),
+              ("markerlineProperties", "MplLine2DProperties",
+               {}),
+              ("baselineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplStem)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('bottom'):
+            val = self.getInputFromPort('bottom')
+            kwargs['bottom'] = val
+        if self.hasInputFromPort('label'):
+            val = self.getInputFromPort('label')
+            kwargs['label'] = val
+        if self.hasInputFromPort('linefmt'):
+            val = self.getInputFromPort('linefmt')
+            kwargs['linefmt'] = val
+        if self.hasInputFromPort('markerfmt'):
+            val = self.getInputFromPort('markerfmt')
+            kwargs['markerfmt'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('basefmt'):
+            val = self.getInputFromPort('basefmt')
+            kwargs['basefmt'] = val
+
+        output = matplotlib.pyplot.stem(*args, **kwargs)        
+        markerline = output[0]
+        stemlines = output[1]
+        baseline = output[2]
+        if self.hasInputFromPort('stemlineProperties'):
+            properties = self.getInputFromPort('stemlineProperties')
+            if stemlines is not None:
+                properties.update_props(stemlines)
+        if self.hasInputFromPort('markerlineProperties'):
+            properties = self.getInputFromPort('markerlineProperties')
+            if markerline is not None:
+                properties.update_props(markerline)
+        if self.hasInputFromPort('baselineProperties'):
+            properties = self.getInputFromPort('baselineProperties')
+            if baseline is not None:
+                properties.update_props(baseline)
+
+class MplStep(MplPlot):
+    """Make a step plot.
+
+Call signature:
+
+step(x, y, *args, **kwargs)
+
+Additional keyword args to :func:`step` are the same as those for :func:`~matplotlib.pyplot.plot`.
+
+x and y must be 1-D sequences, and it is assumed, but not checked, that x is uniformly increasing.
+
+Keyword arguments:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("where", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If 'pre', the interval from x[i] to x[i+1] has level y[i+1]\n\nIf 'post', that interval has level y[i]\n\nIf 'mid', the jumps in y occur half-way between the x-values.", 'values': "[['pre', 'post', 'mid']]", 'optional': True}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplStep)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('x')
+        args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('where'):
+            val = self.getInputFromPort('where')
+            kwargs['where'] = val
+
+        lines = matplotlib.pyplot.step(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplStreamplot(MplPlot):
+    """Draws streamlines of a vector flow.
+
+Returns:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("arrowstyle", "basic:String",
+               {'optional': True, 'defaults': "['-|>']"}),
+              ("density", "basic:Integer",
+               {'optional': True, 'defaults': "['1']"}),
+              ("color", "basic:String",
+               {'optional': True}),
+              ("minlength", "basic:Float",
+               {'optional': True, 'defaults': "['0.1']"}),
+              ("transform", "basic:String",
+               {'optional': True}),
+              ("arrowsize", "basic:Integer",
+               {'optional': True, 'defaults': "['1']"}),
+              ("cmap", "basic:String",
+               {'optional': True}),
+              ("u", "basic:String",
+               {}),
+              ("v", "basic:String",
+               {}),
+              ("y", "basic:String",
+               {}),
+              ("x", "basic:String",
+               {}),
+              ("linewidth", "basic:String",
+               {'optional': True}),
+              ("norm", "basic:String",
+               {'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplStreamplot)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('arrowstyle'):
+            val = self.getInputFromPort('arrowstyle')
+            kwargs['arrowstyle'] = val
+        if self.hasInputFromPort('density'):
+            val = self.getInputFromPort('density')
+            kwargs['density'] = val
+        if self.hasInputFromPort('color'):
+            val = self.getInputFromPort('color')
+            kwargs['color'] = val
+        if self.hasInputFromPort('minlength'):
+            val = self.getInputFromPort('minlength')
+            kwargs['minlength'] = val
+        if self.hasInputFromPort('transform'):
+            val = self.getInputFromPort('transform')
+            kwargs['transform'] = val
+        if self.hasInputFromPort('arrowsize'):
+            val = self.getInputFromPort('arrowsize')
+            kwargs['arrowsize'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        val = self.getInputFromPort('u')
+        kwargs['u'] = val
+        val = self.getInputFromPort('v')
+        kwargs['v'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('linewidth'):
+            val = self.getInputFromPort('linewidth')
+            kwargs['linewidth'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        matplotlib.pyplot.streamplot(*args, **kwargs)        
+
+class MplTricontour(MplPlot):
+    """Draw contours on an unstructured triangular grid. :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and filled contours, respectively.  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=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:
+
+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.
+
+tricontour-only keyword arguments:
+
+
+
+tricontourf-only keyword arguments:
+
+
+
+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:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "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.\n\nThis keyword is not active if X and Y are specified in the call to contour.", 'values': "[['', 'upper', 'lower', 'image']]", 'optional': True}),
+              ("linestyles", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If linestyles is None, the 'solid' is used.\n\nlinestyles 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.\n\nIf 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.", 'values': "[['', 's [...]
+              ("levelsSequence", "basic:List",
+               {'optional': True, 'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]'}),
+              ("levelsScalar", "basic:Float",
+               {'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]', 'optional': True}),
+              ("linewidths", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If linewidths is None, the default width in lines.linewidth in matplotlibrc is used.\n\nIf a number, all levels will be plotted with this linewidth.\n\nIf a tuple, different levels will be plotted with different linewidths in the order specified', 'values': "[['', 'number', 'tuple of numbers']]", 'optional': True}),
+              ("colors", "basic:Color",
+               {'entry_types': "['enum']", 'docstring': "If None, the colormap specified by cmap will be used.\n\nIf a string, like 'r' or 'red', all levels will be plotted in this color.\n\nIf a tuple of matplotlib color args (string, float, rgb, etc), different levels will be plotted in different colors in the order specified.", 'values': "[['', '(mpl_colors)']]", 'optional': True}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("antialiased", "basic:Boolean",
+               {'optional': True, 'docstring': 'enable antialiasing'}),
+              ("nchunk", "basic:Integer",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': '[[0]]', 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'The alpha blending value'}),
+              ("norm", "basic:String",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': "[['', 'Normalize']]", 'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplTricontour)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('origin'):
+            val = self.getInputFromPort('origin')
+            kwargs['origin'] = val
+        if self.hasInputFromPort('linestyles'):
+            val = self.getInputFromPort('linestyles')
+            kwargs['linestyles'] = val
+        if self.hasInputFromPort('levelsSequence'):
+            val = self.getInputFromPort('levelsSequence')
+            kwargs['levels'] = val
+        elif self.hasInputFromPort('levelsScalar'):
+            val = self.getInputFromPort('levelsScalar')
+            kwargs['levels'] = val
+        if self.hasInputFromPort('linewidths'):
+            val = self.getInputFromPort('linewidths')
+            kwargs['linewidths'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('antialiased'):
+            val = self.getInputFromPort('antialiased')
+            kwargs['antialiased'] = val
+        if self.hasInputFromPort('nchunk'):
+            val = self.getInputFromPort('nchunk')
+            kwargs['nchunk'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        matplotlib.pyplot.tricontour(*args, **kwargs)        
+
+class MplTricontourf(MplPlot):
+    """Draw contours on an unstructured triangular grid. :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and filled contours, respectively.  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=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:
+
+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.
+
+tricontour-only keyword arguments:
+
+
+
+tricontourf-only keyword arguments:
+
+
+
+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:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("origin", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "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.\n\nThis keyword is not active if X and Y are specified in the call to contour.", 'values': "[['', 'upper', 'lower', 'image']]", 'optional': True}),
+              ("linestyles", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "If linestyles is None, the 'solid' is used.\n\nlinestyles 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.\n\nIf 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.", 'values': "[['', 's [...]
+              ("levelsSequence", "basic:List",
+               {'optional': True, 'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]'}),
+              ("levelsScalar", "basic:Float",
+               {'docstring': 'A list of floating point numbers indicating the level curves to draw; eg to draw just the zero contour pass levels=[0]', 'optional': True}),
+              ("linewidths", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If linewidths is None, the default width in lines.linewidth in matplotlibrc is used.\n\nIf a number, all levels will be plotted with this linewidth.\n\nIf a tuple, different levels will be plotted with different linewidths in the order specified', 'values': "[['', 'number', 'tuple of numbers']]", 'optional': True}),
+              ("colors", "basic:Color",
+               {'entry_types': "['enum']", 'docstring': "If None, the colormap specified by cmap will be used.\n\nIf a string, like 'r' or 'red', all levels will be plotted in this color.\n\nIf a tuple of matplotlib color args (string, float, rgb, etc), different levels will be plotted in different colors in the order specified.", 'values': "[['', '(mpl_colors)']]", 'optional': True}),
+              ("cmap", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'A cm :class:`~matplotlib.colors.Colormap` instance or None. If cmap is None and colors is None, a default Colormap is used.', 'values': "[['', 'Colormap']]", 'optional': True}),
+              ("antialiased", "basic:Boolean",
+               {'optional': True, 'docstring': 'enable antialiasing'}),
+              ("nchunk", "basic:Integer",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': '[[0]]', 'optional': True}),
+              ("alpha", "basic:Float",
+               {'optional': True, 'docstring': 'The alpha blending value'}),
+              ("norm", "basic:String",
+               {'entry_types': "['enum']", 'docstring': '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.', 'values': "[['', 'Normalize']]", 'optional': True}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplTricontourf)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('origin'):
+            val = self.getInputFromPort('origin')
+            kwargs['origin'] = val
+        if self.hasInputFromPort('linestyles'):
+            val = self.getInputFromPort('linestyles')
+            kwargs['linestyles'] = val
+        if self.hasInputFromPort('levelsSequence'):
+            val = self.getInputFromPort('levelsSequence')
+            kwargs['levels'] = val
+        elif self.hasInputFromPort('levelsScalar'):
+            val = self.getInputFromPort('levelsScalar')
+            kwargs['levels'] = val
+        if self.hasInputFromPort('linewidths'):
+            val = self.getInputFromPort('linewidths')
+            kwargs['linewidths'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            val = translate_color(val)
+            kwargs['colors'] = val
+        if self.hasInputFromPort('cmap'):
+            val = self.getInputFromPort('cmap')
+            kwargs['cmap'] = val
+        if self.hasInputFromPort('antialiased'):
+            val = self.getInputFromPort('antialiased')
+            kwargs['antialiased'] = val
+        if self.hasInputFromPort('nchunk'):
+            val = self.getInputFromPort('nchunk')
+            kwargs['nchunk'] = val
+        if self.hasInputFromPort('alpha'):
+            val = self.getInputFromPort('alpha')
+            kwargs['alpha'] = val
+        if self.hasInputFromPort('norm'):
+            val = self.getInputFromPort('norm')
+            kwargs['norm'] = val
+
+        matplotlib.pyplot.tricontourf(*args, **kwargs)        
+
+class MplTripcolor(MplPlot):
+    """Create a pseudocolor plot of an unstructured triangular grid.
+
+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=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, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg facecolors*=C instead of just *C.
+
+shading may be 'flat' (the default) or 'gouraud'. If shading is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If shading is 'gouraud' then color values must be defined at points.  shading of 'faceted' is deprecated; please use edgecolors instead.
+
+The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`.
+
+Example:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+        ]
+
+    _output_ports = [
+        ("self", "(MplTripcolor)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+
+        matplotlib.pyplot.tripcolor(*args, **kwargs)        
+
+class MplTriplot(MplPlot):
+    """Draw a unstructured triangular grid as lines and/or markers.
+
+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=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:
+
+
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+        ]
+
+    _output_ports = [
+        ("self", "(MplTriplot)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+
+        matplotlib.pyplot.triplot(*args, **kwargs)        
+
+class MplVlines(MplPlot):
+    """Plot vertical lines.
+
+Call signature:
+
+vlines(x, ymin, ymax, color='k', linestyles='solid')
+
+Plot vertical lines at each x from ymin to ymax.  ymin or ymax can be scalars or len(x) numpy arrays.  If they are scalars, then the respective values are constant, else the heights of the lines are determined by ymin and ymax.
+
+linestyles : [ 'solid' | 'dashed' | 'dashdot' | 'dotted' ]
+
+Returns the :class:`matplotlib.collections.LineCollection` that was added.
+
+kwargs are :class:`~matplotlib.collections.LineCollection` properties:
+
+%(LineCollection)s
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("ymax", "basic:String",
+               {}),
+              ("linestyles", "basic:String",
+               {'optional': True, 'defaults': "['solid']"}),
+              ("color", "basic:String",
+               {'optional': True, 'defaults': "['k']"}),
+              ("label", "basic:String",
+               {'optional': True, 'defaults': "['']"}),
+              ("colors", "basic:String",
+               {'optional': True, 'defaults': "['k']"}),
+              ("x", "basic:List",
+               {}),
+              ("ymin", "basic:String",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplVlines)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        val = self.getInputFromPort('ymax')
+        kwargs['ymax'] = val
+        if self.hasInputFromPort('linestyles'):
+            val = self.getInputFromPort('linestyles')
+            kwargs['linestyles'] = val
+        if self.hasInputFromPort('color'):
+            val = self.getInputFromPort('color')
+            kwargs['color'] = val
+        if self.hasInputFromPort('label'):
+            val = self.getInputFromPort('label')
+            kwargs['label'] = val
+        if self.hasInputFromPort('colors'):
+            val = self.getInputFromPort('colors')
+            kwargs['colors'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        val = self.getInputFromPort('ymin')
+        kwargs['ymin'] = val
+
+        matplotlib.pyplot.vlines(*args, **kwargs)        
+
+class MplXcorr(MplPlot):
+    """Plot the cross correlation between x and y.
+
+Call signature:
+
+xcorr(self, x, y, normed=True, detrend=mlab.detrend_none,   usevlines=True, maxlags=10, **kwargs)
+
+If normed = True, normalize the data by the cross correlation at 0-th lag.  x and y are detrended by the detrend callable (default no normalization).  x and y must be equal length.
+
+Data are plotted as plot(lags, c, **kwargs)
+
+Return value is a tuple (lags, c, line) where:
+
+lags are a length 2*maxlags+1 lag vector
+
+c is the 2*maxlags+1 auto correlation vector
+
+The default linestyle is None and the default marker is 'o', though these can be overridden with keyword args.  The cross correlation is performed with :func:`numpy.correlate` with mode = 2.
+
+If usevlines is True:
+
+:func:`~matplotlib.pyplot.vlines` rather than :func:`~matplotlib.pyplot.plot` is used to draw vertical lines from the origin to the xcorr.  Otherwise the plotstyle is determined by the kwargs, which are :class:`~matplotlib.lines.Line2D` properties.
+
+The return value is a tuple (lags, c, linecol, b) where linecol is the :class:`matplotlib.collections.LineCollection` instance and b is the x-axis.
+
+maxlags is a positive integer detailing the number of lags to show. The default value of None will return all (2*len(x)-1) lags.
+
+Example:
+
+:func:`~matplotlib.pyplot.xcorr` is top graph, and :func:`~matplotlib.pyplot.acorr` is bottom graph.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("normed", "basic:Boolean",
+               {'optional': True, 'defaults': "['True']"}),
+              ("usevlines", "basic:Boolean",
+               {'optional': True, 'defaults': "['True']"}),
+              ("detrend", "basic:String",
+               {'optional': True, 'defaults': "['<function detrend_none at 0x02F5A3F0>']"}),
+              ("maxlags", "basic:Integer",
+               {'optional': True, 'defaults': "['10']"}),
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {}),
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("lineCollectionProperties", "MplLineCollectionProperties",
+               {}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+              ("xaxisProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplXcorr)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('normed'):
+            val = self.getInputFromPort('normed')
+            kwargs['normed'] = val
+        if self.hasInputFromPort('usevlines'):
+            val = self.getInputFromPort('usevlines')
+            kwargs['usevlines'] = val
+        if self.hasInputFromPort('detrend'):
+            val = self.getInputFromPort('detrend')
+            kwargs['detrend'] = val
+        if self.hasInputFromPort('maxlags'):
+            val = self.getInputFromPort('maxlags')
+            kwargs['maxlags'] = val
+        val = self.getInputFromPort('y')
+        kwargs['y'] = val
+        val = self.getInputFromPort('x')
+        kwargs['x'] = val
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+
+        output = matplotlib.pyplot.xcorr(*args, **kwargs)        
+        if 'usevlines' in kwargs and kwargs['usevlines']:
+            output = output + (output[2],)
+        else:
+            output = output + (None, None)
+        lines = output[2]
+        xaxis = output[3]
+        lineCollection = output[4]
+        if self.hasInputFromPort('lineCollectionProperties'):
+            properties = self.getInputFromPort('lineCollectionProperties')
+            if lineCollection is not None:
+                properties.update_props(lineCollection)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+        if self.hasInputFromPort('xaxisProperties'):
+            properties = self.getInputFromPort('xaxisProperties')
+            if xaxis is not None:
+                properties.update_props(xaxis)
+
+class MplBarbs(MplPlot):
+    """Plot a 2-D field of barbs.
+
+Call signatures:
+
+barb(U, V, **kw) barb(U, V, C, **kw) barb(X, Y, U, V, **kw) barb(X, Y, U, V, C, **kw)
+
+Arguments:
+
+
+
+All arguments may be 1-D or 2-D arrays or sequences. If X and Y are absent, they will be generated as a uniform grid.  If U and V are 2-D arrays but X and Y are 1-D, and if len(X) and len(Y) match the column and row dimensions of U, then X and Y will be expanded with :func:`numpy.meshgrid`.
+
+U, V, C may be masked arrays, but masked X, Y are not supported at present.
+
+Keyword arguments:
+
+
+
+Barbs are traditionally used in meteorology as a way to plot the speed and direction of wind observations, but can technically be used to plot any two dimensional vector quantity.  As opposed to arrows, which give vector magnitude by the length of the arrow, the barbs give more quantitative information about the vector magnitude by putting slanted lines or a triangle for various increments in magnitude, as show schematically below:
+
+:     /\    \ :    /  \    \ :   /    \    \    \ :  /      \    \    \ : ------------------------------
+
+note the double \ at the end of each line to make the figure
+
+render correctly
+
+The largest increment is given by a triangle (or "flag"). After those come full lines (barbs). The smallest increment is a half line.  There is only, of course, ever at most 1 half line.  If the magnitude is small and only needs a single half-line and no full lines or triangles, the half-line is offset from the end of the barb so that it can be easily distinguished from barbs with a single full line.  The magnitude for the barb shown above would nominally be 65, using the standard increm [...]
+
+linewidths and edgecolors can be used to customize the barb. Additional :class:`~matplotlib.collections.PolyCollection` keyword arguments:
+
+agg_filter: unknown alpha: float or None animated: [True | False] antialiased or antialiaseds: Boolean or sequence of booleans array: unknown axes: an :class:`~matplotlib.axes.Axes` instance clim: a length 2 sequence of floats clip_box: a :class:`matplotlib.transforms.Bbox` instance clip_on: [True | False] clip_path: [ (:class:`~matplotlib.path.Path`,         :class:`~matplotlib.transforms.Transform`) |         :class:`~matplotlib.patches.Patch` | None ] cmap: a colormap or registered co [...]
+
+Example:
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("barbcolor", "basic:Color",
+               {'optional': True, 'docstring': 'Specifies the color all parts of the barb except any flags.  This parameter is analagous to the edgecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.'}),
+              ("barbcolorSequence", "basic:List",
+               {'docstring': 'Specifies the color all parts of the barb except any flags.  This parameter is analagous to the edgecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.', 'optional': True}),
+              ("C", "basic:List",
+               {'optional': True, 'docstring': 'An optional array used to map colors to the barbs'}),
+              ("sizes", "basic:Dictionary",
+               {'optional': True, 'docstring': "A dictionary of coefficients specifying the ratio of a given feature to the length of the barb. Only those values one wishes to override need to be included.  These features include:\n\n'spacing' - space between features (flags, full/half barbs)\n\n'height' - height (distance from shaft to top) of a flag or full barb\n\n'width' - width of a flag, twice the width of a full barb\n\n'emptybarb' - radius of the circle used for low magnitudes"}),
+              ("rounding", "basic:Boolean",
+               {'optional': True, 'docstring': 'A flag to indicate whether the vector magnitude should be rounded when allocating barb components.  If True, the magnitude is rounded to the nearest multiple of the half-barb increment.  If False, the magnitude is simply truncated to the next lowest multiple.  Default is True', 'defaults': "['True']"}),
+              ("pivot", "basic:String",
+               {'entry_types': "['enum']", 'docstring': "The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot.  Default is 'tip'", 'values': "[['tip', 'middle']]", 'optional': True, 'defaults': "['tip']"}),
+              ("flip_barb", "basic:Boolean",
+               {'optional': True, 'docstring': 'Either a single boolean flag or an array of booleans.  Single boolean indicates whether the lines and flags should point opposite to normal for all barbs.  An array (which should be the same size as the other data arrays) indicates whether to flip for each individual barb.  Normal behavior is for the barbs and lines to point right (comes from wind barbs having these features point towards low pressure in the Northern Hemisphere.)  Default i [...]
+              ("flip_barbSequence", "basic:List",
+               {'docstring': 'Either a single boolean flag or an array of booleans.  Single boolean indicates whether the lines and flags should point opposite to normal for all barbs.  An array (which should be the same size as the other data arrays) indicates whether to flip for each individual barb.  Normal behavior is for the barbs and lines to point right (comes from wind barbs having these features point towards low pressure in the Northern Hemisphere.)  Default is False', 'optiona [...]
+              ("length", "basic:Integer",
+               {'optional': True, 'docstring': 'Length of the barb in points; the other parts of the barb are scaled against this. Default is 9', 'defaults': "['9']"}),
+              ("barb_increments", "basic:Dictionary",
+               {'optional': True, 'docstring': "A dictionary of increments specifying values to associate with different parts of the barb. Only those values one wishes to override need to be included.\n\n'half' - half barbs (Default is 5)\n\n'full' - full barbs (Default is 10)\n\n'flag' - flags (default is 50)"}),
+              ("U", "basic:List",
+               {'docstring': 'Give the x and y components of the barb shaft'}),
+              ("V", "basic:List",
+               {'docstring': 'Give the x and y components of the barb shaft'}),
+              ("Y", "basic:List",
+               {'optional': True, 'docstring': 'The x and y coordinates of the barb locations (default is head of barb; see pivot kwarg)'}),
+              ("X", "basic:List",
+               {'optional': True, 'docstring': 'The x and y coordinates of the barb locations (default is head of barb; see pivot kwarg)'}),
+              ("flagcolor", "basic:Color",
+               {'optional': True, 'docstring': 'Specifies the color of any flags on the barb.  This parameter is analagous to the facecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.  If this is not set (and C has not either) then flagcolor will be set to match barbcolor so that the barb has a uniform color. If C has been set, flagcolor has no effect.'}),
+              ("flagcolorSequence", "basic:List",
+               {'docstring': 'Specifies the color of any flags on the barb.  This parameter is analagous to the facecolor parameter for polygons, which can be used instead. However this parameter will override facecolor.  If this is not set (and C has not either) then flagcolor will be set to match barbcolor so that the barb has a uniform color. If C has been set, flagcolor has no effect.', 'optional': True}),
+              ("fill_empty", "basic:Boolean",
+               {'optional': True, 'docstring': 'A flag on whether the empty barbs (circles) that are drawn should be filled with the flag color.  If they are not filled, they will be drawn such that no color is applied to the center.  Default is False', 'defaults': "['False']"}),
+              ("polyCollectionProperties", "MplPolyCollectionProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplBarbs)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        if self.hasInputFromPort('X'):
+            val = self.getInputFromPort('X')
+            args.append(val)
+        if self.hasInputFromPort('Y'):
+            val = self.getInputFromPort('Y')
+            args.append(val)
+        val = self.getInputFromPort('U')
+        args.append(val)
+        val = self.getInputFromPort('V')
+        args.append(val)
+        if self.hasInputFromPort('C'):
+            val = self.getInputFromPort('C')
+            args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('barbcolor'):
+            val = self.getInputFromPort('barbcolor')
+            val = translate_color(val)
+            kwargs['barbcolor'] = val
+        elif self.hasInputFromPort('barbcolorSequence'):
+            val = self.getInputFromPort('barbcolorSequence')
+            kwargs['barbcolor'] = val
+        if self.hasInputFromPort('sizes'):
+            val = self.getInputFromPort('sizes')
+            kwargs['sizes'] = val
+        if self.hasInputFromPort('rounding'):
+            val = self.getInputFromPort('rounding')
+            kwargs['rounding'] = val
+        if self.hasInputFromPort('pivot'):
+            val = self.getInputFromPort('pivot')
+            kwargs['pivot'] = val
+        if self.hasInputFromPort('flip_barb'):
+            val = self.getInputFromPort('flip_barb')
+            kwargs['flip_barb'] = val
+        elif self.hasInputFromPort('flip_barbSequence'):
+            val = self.getInputFromPort('flip_barbSequence')
+            kwargs['flip_barb'] = val
+        if self.hasInputFromPort('length'):
+            val = self.getInputFromPort('length')
+            kwargs['length'] = val
+        if self.hasInputFromPort('barb_increments'):
+            val = self.getInputFromPort('barb_increments')
+            kwargs['barb_increments'] = val
+        if self.hasInputFromPort('flagcolor'):
+            val = self.getInputFromPort('flagcolor')
+            val = translate_color(val)
+            kwargs['flagcolor'] = val
+        elif self.hasInputFromPort('flagcolorSequence'):
+            val = self.getInputFromPort('flagcolorSequence')
+            kwargs['flagcolor'] = val
+        if self.hasInputFromPort('fill_empty'):
+            val = self.getInputFromPort('fill_empty')
+            kwargs['fill_empty'] = val
+
+        polyCollection = matplotlib.pyplot.barbs(*args, **kwargs)
+        if self.hasInputFromPort('polyCollectionProperties'):
+            properties = self.getInputFromPort('polyCollectionProperties')
+            if polyCollection is not None:
+                properties.update_props(polyCollection)
+
+class MplSpy(MplPlot):
+    """Plot the sparsity pattern on a 2-D array.
+
+Call signature:
+
+spy(Z, precision=0, marker=None, markersize=None,     aspect='equal', **kwargs)
+
+spy(Z) plots the sparsity pattern of the 2-D array Z.
+
+If precision is 0, any non-zero value will be plotted; else, values of |Z| > precision will be plotted.
+
+For :class:`scipy.sparse.spmatrix` instances, there is a special case: if precision is 'present', any value present in the array will be plotted, even if it is identically zero.
+
+The array will be plotted as it would be printed, with the first index (row) increasing down and the second index (column) increasing to the right.
+
+By default aspect is 'equal', so that each array element occupies a square space; set the aspect kwarg to 'auto' to allow the plot to fill the plot box, or to any scalar number to specify the aspect ratio of an array element directly.
+
+Two plotting styles are available: image or marker. Both are available for full arrays, but only the marker style works for :class:`scipy.sparse.spmatrix` instances.
+
+If marker and markersize are None, an image will be returned and any remaining kwargs are passed to :func:`~matplotlib.pyplot.imshow`; else, a :class:`~matplotlib.lines.Line2D` object will be returned with the value of marker determining the marker type, and any remaining kwargs passed to the :meth:`~matplotlib.axes.Axes.plot` method.
+
+If marker and markersize are None, useful kwargs include:
+
+cmap
+
+alpha
+
+For controlling colors, e.g. cyan background and red marks, use:
+
+cmap = mcolors.ListedColormap(['c','r'])
+
+If marker or markersize is not None, useful kwargs include:
+
+marker
+
+markersize
+
+color
+
+Useful values for marker include:
+
+'s'  square (default)
+
+'o'  circle
+
+'.'  point
+
+','  pixel
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("hold", "basic:String",
+               {'optional': True}),
+              ("markersize", "basic:String",
+               {'optional': True}),
+              ("precision", "basic:Integer",
+               {'optional': True, 'defaults': "['0']"}),
+              ("aspect", "basic:String",
+               {'optional': True, 'defaults': "['equal']"}),
+              ("marker", "basic:String",
+               {'optional': True}),
+              ("Z", "basic:List",
+               {}),
+              ("imageProperties", "MplAxesImageProperties",
+               {}),
+              ("marksProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplSpy)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('hold'):
+            val = self.getInputFromPort('hold')
+            kwargs['hold'] = val
+        if self.hasInputFromPort('markersize'):
+            val = self.getInputFromPort('markersize')
+            kwargs['markersize'] = val
+        if self.hasInputFromPort('precision'):
+            val = self.getInputFromPort('precision')
+            kwargs['precision'] = val
+        if self.hasInputFromPort('aspect'):
+            val = self.getInputFromPort('aspect')
+            kwargs['aspect'] = val
+        if self.hasInputFromPort('marker'):
+            val = self.getInputFromPort('marker')
+            kwargs['marker'] = val
+        val = self.getInputFromPort('Z')
+        kwargs['Z'] = val
+
+        output = matplotlib.pyplot.spy(*args, **kwargs)        
+        if "marker" not in kwargs and "markersize" not in kwargs and \
+                not hasattr(kwargs["Z"], 'tocoo'):
+            output = (output, None)
+        else:
+            output = (None, output)
+        image = output[0]
+        marks = output[1]
+        if self.hasInputFromPort('imageProperties'):
+            properties = self.getInputFromPort('imageProperties')
+            if image is not None:
+                properties.update_props(image)
+        if self.hasInputFromPort('marksProperties'):
+            properties = self.getInputFromPort('marksProperties')
+            if marks is not None:
+                properties.update_props(marks)
+
+class MplPolar(MplPlot):
+    """Make a polar plot.
+
+call signature:
+
+polar(theta, r, **kwargs)
+
+Multiple theta, r arguments are supported, with format strings, as in :func:`~matplotlib.pyplot.plot`.
+    """
+    _input_ports = [
+              ("theta", "basic:List",
+               {}),
+              ("r", "basic:List",
+               {}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplPolar)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        val = self.getInputFromPort('theta')
+        args.append(val)
+        val = self.getInputFromPort('r')
+        args.append(val)
+
+        kwargs = {}
+
+        lines = matplotlib.pyplot.polar(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+class MplLegend(MplPlot):
+    """Place a legend on the current axes.
+
+Call signature:
+
+legend(*args, **kwargs)
+
+Places legend at location loc.  Labels are a sequence of strings and loc can be a string or an integer specifying the legend location.
+
+To make a legend with existing lines:
+
+legend()
+
+:meth:`legend` by itself will try and build a legend using the label property of the lines/patches/collections.  You can set the label of a line by doing:
+
+plot(x, y, label='my data')
+
+or:
+
+line.set_label('my data').
+
+If label is set to '_nolegend_', the item will not be shown in legend.
+
+To automatically generate the legend from labels:
+
+legend( ('label1', 'label2', 'label3') )
+
+To make a legend for a list of lines and labels:
+
+legend( (line1, line2, line3), ('label1', 'label2', 'label3') )
+
+To make a legend at a given location, using a location argument:
+
+legend( ('label1', 'label2', 'label3'), loc='upper left')
+
+or:
+
+legend( (line1, line2, line3),  ('label1', 'label2', 'label3'), loc=2)
+
+The location codes are
+
+
+
+Users can specify any arbitrary location for the legend using the bbox_to_anchor keyword argument. bbox_to_anchor can be an instance of BboxBase(or its derivatives) or a tuple of 2 or 4 floats. For example,
+
+loc = 'upper right', bbox_to_anchor = (0.5, 0.5)
+
+will place the legend so that the upper right corner of the legend at the center of the axes.
+
+The legend location can be specified in other coordinate, by using the bbox_transform keyword.
+
+The loc itslef can be a 2-tuple giving x,y of the lower-left corner of the legend in axes coords (bbox_to_anchor is ignored).
+
+Keyword arguments:
+
+fontsize: [ size in points | 'xx-small' | 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'xx-large' ]
+
+Set the font size.  May be either a size string, relative to the default font size, or an absolute font size in points. This argument is only used if prop is not specified.
+
+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.
+
+Not all kinds of artist are supported by the legend command. See LINK (FIXME) for details.
+
+Example:
+    """
+    _input_ports = [
+              ("loc", "basic:String",
+               {'entry_types': "['enum']", 'values': "[['best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center']]", 'optional': True}),
+              ("fancybox", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'if True, draw a frame with a round fancybox.  If None, use rc settings', 'values': "[['']]", 'optional': True}),
+              ("bbox_to_anchor", "basic:String",
+               {'optional': True, 'docstring': 'the bbox that the legend will be anchored.'}),
+              ("title", "basic:String",
+               {'optional': True, 'docstring': 'the legend title'}),
+              ("handlelength", "basic:String",
+               {'optional': True, 'docstring': 'the length of the legend handles'}),
+              ("markerscale", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'The relative size of legend markers vs. original. If None, use rc settings.', 'values': "[['']]", 'optional': True}),
+              ("numpoints", "basic:Integer",
+               {'optional': True, 'docstring': 'The number of points in the legend for line'}),
+              ("labelspacing", "basic:String",
+               {'optional': True, 'docstring': 'the vertical space between the legend entries'}),
+              ("scatterpoints", "basic:Integer",
+               {'optional': True, 'docstring': 'The number of points in the legend for scatter plot'}),
+              ("frameon", "basic:Boolean",
+               {'optional': True, 'docstring': "if True, draw a frame around the legend. The default is set by the rcParam 'legend.frameon'"}),
+              ("columnspacing", "basic:String",
+               {'optional': True, 'docstring': 'the spacing between columns'}),
+              ("handletextpad", "basic:String",
+               {'optional': True, 'docstring': 'the pad between the legend handle and text'}),
+              ("scatteroffsetsSequence", "basic:List",
+               {'optional': True, 'docstring': 'a list of yoffsets for scatter symbols in legend'}),
+              ("scatteroffsetsScalar", "basic:Float",
+               {'docstring': 'a list of yoffsets for scatter symbols in legend', 'optional': True}),
+              ("mode", "basic:String",
+               {'optional': True, 'docstring': 'if mode is "expand", the legend will be horizontally expanded to fill the axes area (or bbox_to_anchor)'}),
+              ("ncol", "basic:Integer",
+               {'optional': True, 'docstring': 'number of columns. default is 1', 'defaults': "['1']"}),
+              ("shadow", "basic:String",
+               {'entry_types': "['enum']", 'docstring': 'If True, draw a shadow behind legend. If None, use rc settings.', 'values': "[['']]", 'optional': True}),
+              ("prop", "basic:String",
+               {'optional': True, 'docstring': 'A :class:`matplotlib.font_manager.FontProperties` instance. If prop is a dictionary, a new instance will be created with prop. If None, use rc settings.'}),
+              ("borderpad", "basic:String",
+               {'optional': True, 'docstring': 'the fractional whitespace inside the legend border'}),
+              ("bbox_transform", "basic:String",
+               {'optional': True, 'docstring': 'the transform for the bbox. transAxes if None.'}),
+              ("borderaxespad", "basic:String",
+               {'optional': True, 'docstring': 'the pad between the axes and legend border'}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplLegend)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('loc'):
+            val = self.getInputFromPort('loc')
+            val = translate_MplLegend_loc(val)
+            kwargs['loc'] = val
+        if self.hasInputFromPort('fancybox'):
+            val = self.getInputFromPort('fancybox')
+            kwargs['fancybox'] = val
+        if self.hasInputFromPort('bbox_to_anchor'):
+            val = self.getInputFromPort('bbox_to_anchor')
+            kwargs['bbox_to_anchor'] = val
+        if self.hasInputFromPort('title'):
+            val = self.getInputFromPort('title')
+            kwargs['title'] = val
+        if self.hasInputFromPort('handlelength'):
+            val = self.getInputFromPort('handlelength')
+            kwargs['handlelength'] = val
+        if self.hasInputFromPort('markerscale'):
+            val = self.getInputFromPort('markerscale')
+            kwargs['markerscale'] = val
+        if self.hasInputFromPort('numpoints'):
+            val = self.getInputFromPort('numpoints')
+            kwargs['numpoints'] = val
+        if self.hasInputFromPort('labelspacing'):
+            val = self.getInputFromPort('labelspacing')
+            kwargs['labelspacing'] = val
+        if self.hasInputFromPort('scatterpoints'):
+            val = self.getInputFromPort('scatterpoints')
+            kwargs['scatterpoints'] = val
+        if self.hasInputFromPort('frameon'):
+            val = self.getInputFromPort('frameon')
+            kwargs['frameon'] = val
+        if self.hasInputFromPort('columnspacing'):
+            val = self.getInputFromPort('columnspacing')
+            kwargs['columnspacing'] = val
+        if self.hasInputFromPort('handletextpad'):
+            val = self.getInputFromPort('handletextpad')
+            kwargs['handletextpad'] = val
+        if self.hasInputFromPort('scatteroffsetsSequence'):
+            val = self.getInputFromPort('scatteroffsetsSequence')
+            kwargs['scatteroffsets'] = val
+        elif self.hasInputFromPort('scatteroffsetsScalar'):
+            val = self.getInputFromPort('scatteroffsetsScalar')
+            kwargs['scatteroffsets'] = val
+        if self.hasInputFromPort('mode'):
+            val = self.getInputFromPort('mode')
+            kwargs['mode'] = val
+        if self.hasInputFromPort('ncol'):
+            val = self.getInputFromPort('ncol')
+            kwargs['ncol'] = val
+        if self.hasInputFromPort('shadow'):
+            val = self.getInputFromPort('shadow')
+            kwargs['shadow'] = val
+        if self.hasInputFromPort('prop'):
+            val = self.getInputFromPort('prop')
+            kwargs['prop'] = val
+        if self.hasInputFromPort('borderpad'):
+            val = self.getInputFromPort('borderpad')
+            kwargs['borderpad'] = val
+        if self.hasInputFromPort('bbox_transform'):
+            val = self.getInputFromPort('bbox_transform')
+            kwargs['bbox_transform'] = val
+        if self.hasInputFromPort('borderaxespad'):
+            val = self.getInputFromPort('borderaxespad')
+            kwargs['borderaxespad'] = val
+
+        matplotlib.pyplot.legend(*args, **kwargs)        
+
+class MplAnnotate(MplPlot):
+    """Create an annotation: a piece of text referring to a data point.
+
+Call signature:
+
+annotate(s, xy, xytext=None, xycoords='data',          textcoords='data', arrowprops=None, **kwargs)
+
+Keyword arguments:
+
+Annotate the x, y point xy with text s at x, y location xytext.  (If xytext = None, defaults to xy, and if textcoords = None, defaults to xycoords).
+
+arrowprops, if not None, is a dictionary of line properties (see :class:`matplotlib.lines.Line2D`) for the arrow that connects annotation to the point.
+
+If the dictionary has a key arrowstyle, a FancyArrowPatch instance is created with the given dictionary and is drawn. Otherwise, a YAArow patch instance is created and drawn. Valid keys for YAArow are
+
+Valid keys for FancyArrowPatch are
+
+xycoords and textcoords are strings that indicate the coordinates of xy and xytext.
+
+If a 'points' or 'pixels' option is specified, values will be added to the bottom-left and if negative, values will be subtracted from the top-right.  Eg:
+
+# 10 points to the right of the left border of the axes and # 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 annotation will only be drawn when the xy is inside the axes. If False, the annotation will always be drawn regardless of its position.  The default is None, which behave as True only if xycoords is"data".
+
+Additional kwargs are Text properties:
+
+%(Text)s
+    """
+    _input_ports = [
+              ("xycoords", "basic:String",
+               {'entry_types': "['enum']", 'values': "[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]", 'optional': True}),
+              ("xytext", "basic:Float, basic:Float",
+               {'optional': True}),
+              ("s", "basic:String",
+               {}),
+              ("xy", "basic:Float, basic:Float",
+               {}),
+              ("textcoords", "basic:String",
+               {'entry_types': "['enum']", 'values': "[['figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction', 'data', 'offset points', 'polar']]", 'optional': True}),
+              ("fancyArrowProperties", "MplFancyArrowPatchProperties",
+               {'optional': True}),
+              ("arrowProperties", "MplYAArrowProperties",
+               {'optional': True}),
+              ("annotationProperties", "MplAnnotationProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplAnnotate)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+
+        kwargs = {}
+        if self.hasInputFromPort('xycoords'):
+            val = self.getInputFromPort('xycoords')
+            kwargs['xycoords'] = val
+        if self.hasInputFromPort('xytext'):
+            val = self.getInputFromPort('xytext')
+            kwargs['xytext'] = val
+        val = self.getInputFromPort('s')
+        kwargs['s'] = val
+        val = self.getInputFromPort('xy')
+        kwargs['xy'] = val
+        if self.hasInputFromPort('textcoords'):
+            val = self.getInputFromPort('textcoords')
+            kwargs['textcoords'] = val
+
+        if self.hasInputFromPort("fancyArrowProperties"):
+            kwargs['arrowprops'] = \
+                self.getInputFromPort("fancyArrowProperties").props
+        elif self.hasInputFromPort("arrowProperties"):
+            kwargs['arrowprops'] = \
+                self.getInputFromPort("arrowProperties").props
+        annotation = matplotlib.pyplot.annotate(*args, **kwargs)
+        if self.hasInputFromPort('annotationProperties'):
+            properties = self.getInputFromPort('annotationProperties')
+            if annotation is not None:
+                properties.update_props(annotation)
+
+class MplLinePlot(MplPlot):
+    """Plot lines and/or markers to the :class:`~matplotlib.axes.Axes`.  args is a variable length argument, allowing for multiple x, y pairs with an optional format string.  For example, each of the following is legal:
+
+plot(x, y)         # plot x and y using default line style and color plot(x, y, 'bo')   # plot x and y using blue circle markers plot(y)            # plot y using x as index array 0..N-1 plot(y, 'r+')      # ditto, but with red plusses
+
+If x and/or y is 2-dimensional, then the corresponding columns will be plotted.
+
+An arbitrary number of x, y, fmt groups can be specified, as in:
+
+a.plot(x1, y1, 'g^', x2, y2, 'g-')
+
+Return value is a list of lines that were added.
+
+By default, each line is assigned a different color specified by a 'color cycle'.  To change this behavior, you can edit the axes.color_cycle rcParam. Alternatively, you can use :meth:`~matplotlib.axes.Axes.set_default_color_cycle`.
+
+The following format string characters are accepted to control the line style or marker:
+
+The following color abbreviations are supported:
+
+In addition, you can specify colors in many weird and wonderful ways, including full names ('green'), hex strings ('#008000'), RGB or RGBA tuples ((0,1,0,1)) or grayscale intensities as a string ('0.8').  Of these, the string specifications can be used in place of a fmt group, but the tuple forms can be used only as kwargs.
+
+Line styles and colors are combined in a single format string, as in 'bo' for blue circles.
+
+The kwargs can be used to set line properties (any property that has a set_* method).  You can use this to set a line label (for auto legends), linewidth, anitialising, marker face color, etc.  Here is an example:
+
+plot([1,2,3], [1,2,3], 'go-', label='line 1', linewidth=2) plot([1,2,3], [1,4,9], 'rs',  label='line 2') axis([0, 4, 0, 10]) legend()
+
+If you make multiple lines with one plot command, the kwargs apply to all those lines, e.g.:
+
+plot(x1, y1, x2, y2, antialised=False)
+
+Neither line will be antialiased.
+
+You do not need to use format strings, which are just abbreviations.  All of the line properties can be controlled by keyword arguments.  For example, you can set the color, marker, linestyle, and markercolor with:
+
+plot(x, y, color='green', linestyle='dashed', marker='o',      markerfacecolor='blue', markersize=12).
+
+See :class:`~matplotlib.lines.Line2D` for details.
+
+The kwargs are :class:`~matplotlib.lines.Line2D` properties:
+
+%(Line2D)s
+
+kwargs scalex and scaley, if defined, are passed on to :meth:`~matplotlib.axes.Axes.autoscale_view` to determine whether the x and y axes are autoscaled; the default is True.
+
+Additional kwargs: hold = [True|False] overrides default hold state
+    """
+    _input_ports = [
+              ("marker", "basic:String",
+               {'entry_types': "['enum']", 'values': "[['solid line style', 'dashed line style', 'dash-dot line style', 'dotted line style', 'point marker', 'pixel marker', 'circle marker', 'triangle_down marker', 'triangle_up marker', 'triangle_left marker', 'triangle_right marker', 'tri_down marker', 'tri_up marker', 'tri_left marker', 'tri_right marker', 'square marker', 'pentagon marker', 'star marker', 'hexagon1 marker', 'hexagon2 marker', 'plus marker', 'x marker', 'diamond marker' [...]
+              ("y", "basic:List",
+               {}),
+              ("x", "basic:List",
+               {'optional': True}),
+              ("lineProperties", "MplLine2DProperties",
+               {}),
+        ]
+
+    _output_ports = [
+        ("self", "(MplLinePlot)"),
+        ]
+    
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        if self.hasInputFromPort('x'):
+            val = self.getInputFromPort('x')
+            args.append(val)
+        val = self.getInputFromPort('y')
+        args.append(val)
+
+        kwargs = {}
+        if self.hasInputFromPort('marker'):
+            val = self.getInputFromPort('marker')
+            val = translate_MplLinePlot_marker(val)
+            kwargs['marker'] = val
+
+        lines = matplotlib.pyplot.plot(*args, **kwargs)
+        if self.hasInputFromPort('lineProperties'):
+            properties = self.getInputFromPort('lineProperties')
+            if lines is not None:
+                properties.update_props(lines)
+
+          
+_modules = [
+            MplAcorr,
+            MplArrow,
+            MplAxhline,
+            MplAxhspan,
+            MplAxvline,
+            MplAxvspan,
+            MplBar,
+            MplBarh,
+            MplBrokenBarh,
+            MplBoxplot,
+            MplCohere,
+            MplClabel,
+            MplContour,
+            MplContourf,
+            MplCsd,
+            MplErrorbar,
+            MplFill,
+            MplFillBetween,
+            MplFillBetweenx,
+            MplHexbin,
+            MplHist,
+            MplHist2d,
+            MplHlines,
+            MplImshow,
+            MplLoglog,
+            MplPcolor,
+            MplPcolormesh,
+            MplPie,
+            MplPlotDate,
+            MplPsd,
+            MplQuiver,
+            MplQuiverkey,
+            MplScatter,
+            MplSemilogx,
+            MplSemilogy,
+            MplSpecgram,
+            MplStackplot,
+            MplStem,
+            MplStep,
+            MplStreamplot,
+            MplTricontour,
+            MplTricontourf,
+            MplTripcolor,
+            MplTriplot,
+            MplVlines,
+            MplXcorr,
+            MplBarbs,
+            MplSpy,
+            MplPolar,
+            MplLegend,
+            MplAnnotate,
+            MplLinePlot,
+]
diff --git a/vistrails/packages/matplotlib/plots_template.py.mako b/vistrails/packages/matplotlib/plots_template.py.mako
new file mode 100644
index 0000000..0ca518e
--- /dev/null
+++ b/vistrails/packages/matplotlib/plots_template.py.mako
@@ -0,0 +1,210 @@
+import matplotlib.pyplot
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+from bases import MplPlot
+
+<%def name="do_translate(t_spec, t_ps)">\
+% if type(t_ps.translations) == dict:
+val = translate_${t_spec.name}_${t_ps.name}(val)\
+% else:
+val = ${t_ps.translations}(val)\
+% endif
+</%def>
+
+<%def name="get_port_val(spec, t_ps)">\
+        % if t_ps.required:
+        % if t_ps.has_alternate_versions():
+        if self.hasInputFromPort('${t_ps.name}'):
+            val = self.getInputFromPort('${t_ps.name}')
+            % if t_ps.translations:
+            ${do_translate(spec, t_ps)}
+            % endif
+            % if t_ps.in_args:
+            args.append(val)
+            % elif t_ps.in_kwargs:
+            kwargs['${t_ps.arg}'] = val
+            % endif
+        % for alt_ps in t_ps.alternate_specs:
+        elif self.hasInputFromPort('${alt_ps.name}'):
+            val = self.getInputFromPort('${alt_ps.name}')
+            % if alt_ps.translations:
+            ${do_translate(spec, alt_ps)}
+            % endif
+            % if t_ps.in_args:
+            args.append(val)
+            % elif t_ps.in_kwargs:
+            kwargs['${t_ps.arg}'] = val
+            % endif
+        % endfor
+        else:
+            raise ModuleError(self, 'Must set one of "${t_ps.name}", ' \
+                                  '${', '.join('"%s"' % alt_ps.name for alt_ps in t_ps.alternate_specs)}')
+        % else:
+        val = self.getInputFromPort('${t_ps.name}')
+        % if t_ps.in_args:
+        args.append(val)
+        % elif t_ps.in_kwargs:
+        kwargs['${t_ps.arg}'] = val
+        % endif
+        % if t_ps.translations:
+        ${do_translate(spec, t_ps)}
+        % endif
+        % endif
+        % else:
+        if self.hasInputFromPort('${t_ps.name}'):
+            val = self.getInputFromPort('${t_ps.name}')
+            % if t_ps.translations:
+            ${do_translate(spec, t_ps)}
+            % endif
+            % if t_ps.in_args:
+            args.append(val)
+            % elif t_ps.in_kwargs:
+            kwargs['${t_ps.arg}'] = val
+            % endif
+        % for alt_ps in t_ps.alternate_specs:
+        elif self.hasInputFromPort('${alt_ps.name}'):
+            val = self.getInputFromPort('${alt_ps.name}')
+            % if alt_ps.translations:
+            ${do_translate(spec, alt_ps)}
+            % endif
+            % if t_ps.in_args:
+            args.append(val)
+            % elif t_ps.in_kwargs:
+            kwargs['${t_ps.arg}'] = val
+            % endif
+        % endfor
+        % endif
+</%def>
+
+def translate_color(c):
+    return c.tuple
+
+% for spec in specs.module_specs:
+% for ps in spec.port_specs:
+% if ps.translations and type(ps.translations) == dict:
+def translate_${spec.name}_${ps.name}(val):
+    translate_dict = ${ps.translations}
+    return translate_dict[val]
+% endif
+% endfor
+% endfor
+
+% for spec in specs.module_specs:
+class ${spec.name}(${spec.superklass}):
+    """${spec.docstring}
+    """
+    _input_ports = [
+        % for ps in spec.port_specs:
+        % if not ps.hide:
+        % if ps.is_property():
+              ("${ps.name}", "${ps.get_property_type()}",
+               ${ps.get_port_attrs()}),
+        % else:
+              ("${ps.name}", "${ps.get_port_type()}",
+               ${ps.get_port_attrs()}),
+        % endif
+        % for alt_ps in ps.alternate_specs:
+              ("${alt_ps.name}", "${alt_ps.get_port_type()}",
+               ${alt_ps.get_port_attrs()}),
+        % endfor
+        % endif
+        % endfor
+        % for ps in spec.output_port_specs:
+        % if ps.is_property():
+              ("${ps.name}", "${ps.get_property_type()}",
+               ${ps.get_port_attrs()}),
+        % endif
+        % endfor
+        ]
+
+    _output_ports = [
+        ("self", "(${spec.name})"),
+        % for ps in spec.output_port_specs:
+        % if not ps.is_property():
+              ("${ps.name}", "${ps.get_port_type()}",
+                ${ps.get_port_attrs()}),
+        % endif
+        % endfor
+        ]
+    
+    % if spec.get_init():
+    ${spec.get_init()}
+    % endif
+
+    def compute(self):
+        # get args into args, kwargs
+        # write out translations
+        args = []
+        % for ps in spec.get_input_args():
+${get_port_val(spec, ps)}\
+        % endfor
+
+        kwargs = {}
+        % for ps in spec.port_specs:
+        % if ps.is_property():
+        if self.hasInputFromPort('${ps.name}'):
+            properties = self.getInputFromPort('${ps.name}')
+            properties.update_kwargs(kwargs)
+        % elif not ps.hide and not ps.in_args and ps.in_kwargs:
+${get_port_val(spec, ps)}\
+        % endif
+        % endfor
+
+        % if spec.get_compute_before():
+        ${spec.get_compute_before()}
+        % endif
+        % if spec.get_compute_inner():
+        ${spec.get_compute_inner()}
+        % elif spec.output_type is None:
+        ${spec.code_ref}(*args, **kwargs)        
+        % elif spec.output_type == "object":
+        ${spec.get_returned_output_port_specs()[0].compute_name} = ${spec.code_ref}(*args, **kwargs)
+        % else:
+        output = ${spec.code_ref}(*args, **kwargs)        
+        % endif
+        % if spec.get_compute_after():
+        ${spec.get_compute_after()}
+        % endif
+        % if spec.output_type == "dict":
+        % for ps in spec.get_returned_output_port_specs():
+        ${ps.compute_name} = output['${ps.property_key}']
+        % endfor
+        % elif spec.output_type == "tuple":
+        % for ps in sorted(spec.get_returned_output_port_specs(), \
+                               key=lambda ps: ps.property_key):
+        ${ps.compute_name} = output[${ps.property_key}]
+        % endfor
+        % endif
+        % for ps in spec.output_port_specs:
+        % if ps.is_property():
+        if self.hasInputFromPort('${ps.name}'):
+            properties = self.getInputFromPort('${ps.name}')
+            % if ps.compute_parent:
+            % if spec.get_output_port_spec(ps.compute_parent).plural:
+            for obj in ${spec.get_output_port_spec(ps.compute_parent).compute_name}:
+                properties.update(obj.${ps.compute_name})
+            % else:
+            if ${spec.get_output_port_spec(ps.compute_parent).compute_name}.${ps.compute_name} is not None:
+                properties.update(${spec.get_output_port_spec(ps.compute_parent).compute_name}.${ps.compute_name})
+            % endif
+            ## % if ps.plural:
+            ## for obj in ${ps.compute_name}:
+            ##     properties.update(obj)
+            ## % else:
+            ## properties.update(${ps.compute_name})
+            ## % endif
+            % else:
+            if ${ps.compute_name} is not None:
+                properties.update_props(${ps.compute_name})
+            % endif
+        % else:
+        self.setResult('${ps.name}', ${ps.compute_name})
+        % endif
+        % endfor
+
+% endfor        
+          
+_modules = [
+% for spec in specs.module_specs:
+            ${spec.name},
+% endfor
+]
diff --git a/vistrails/packages/matplotlib/specs.py b/vistrails/packages/matplotlib/specs.py
new file mode 100644
index 0000000..74c90fc
--- /dev/null
+++ b/vistrails/packages/matplotlib/specs.py
@@ -0,0 +1,753 @@
+import inspect
+import mixins
+from xml.etree import ElementTree as ET
+
+def capfirst(s):
+    return s[0].upper() + s[1:]
+
+_mixin_classes = None
+def load_mixin_classes():
+    return dict(inspect.getmembers(mixins, inspect.isclass))
+
+def get_mixin_classes():
+    global _mixin_classes
+    if _mixin_classes is None:
+        _mixin_classes = load_mixin_classes()
+    return _mixin_classes
+
+class SpecList(object):
+    def __init__(self, module_specs=[], custom_code=""):
+        self.module_specs = module_specs
+        self.custom_code = custom_code
+
+    def write_to_xml(self, fname):
+        root = ET.Element("specs")
+        subelt = ET.Element("customCode")
+        subelt.text = self.custom_code
+        root.append(subelt)
+        for spec in self.module_specs:
+            root.append(spec.to_xml())
+        tree = ET.ElementTree(root)
+
+        def indent(elem, level=0):
+            i = "\n" + level*"  "
+            if len(elem):
+                if not elem.text or not elem.text.strip():
+                    elem.text = i + "  "
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+                for elem in elem:
+                    indent(elem, level+1)
+                if not elem.tail or not elem.tail.strip():
+                    elem.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        indent(tree.getroot())
+
+        tree.write(fname)
+
+    @staticmethod
+    def read_from_xml(fname):
+        module_specs = []
+        custom_code = ""
+        tree = ET.parse(fname)
+        for elt in tree.getroot():
+            if elt.tag == "moduleSpec":
+                module_specs.append(ModuleSpec.from_xml(elt))
+            elif elt.tag == "customCode":
+                custom_code = elt.text
+        retval = SpecList(module_specs, custom_code)
+        # for spec in retval.module_specs:
+        #     print "==", spec.name, "=="
+        #     for ps in spec.port_specs:
+        #         print " ", ps.arg, ps.name
+        #         for alt_ps in ps.alternate_specs:
+        #             print "  !!!", ps.arg, ps.name, alt_ps.name
+        return retval
+
+class ModuleSpec(object):
+    attrs = ["name", "superklass", "docstring", "output_type"]
+    def __init__(self, name, superklass, code_ref, docstring="", port_specs=[],
+                 output_port_specs=[], output_type=None):
+        self.name = name
+        self.superklass = superklass
+        self.code_ref = code_ref
+        self.docstring = docstring
+        self.port_specs = port_specs
+        self.output_port_specs = output_port_specs
+        self.output_type = output_type
+        self._mixin_class = None
+        self._mixin_functions = None
+
+    def to_xml(self, elt=None):
+        if elt is None:
+            elt = ET.Element("moduleSpec")
+        elt.set("name", self.name)
+        elt.set("superclass", self.superklass)
+        elt.set("code_ref", self.code_ref)
+        if self.output_type is not None:
+            elt.set("output_type", self.output_type)
+        subelt = ET.Element("docstring")
+        subelt.text = str(self.docstring)
+        elt.append(subelt)
+        for port_spec in self.port_specs:
+            subelt = port_spec.to_xml()
+            elt.append(subelt)
+        for port_spec in self.output_port_specs:
+            subelt = port_spec.to_xml()
+            elt.append(subelt)
+        return elt
+
+    @classmethod
+    def from_xml(cls, elt):
+        name = elt.get("name", "")
+        superklass = elt.get("superclass", "")
+        code_ref = elt.get("code_ref", "")
+        output_type = elt.get("output_type", None)
+        docstring = ""
+        port_specs = []
+        output_port_specs = []
+        for child in elt.getchildren():
+            if child.tag == "inputPortSpec":
+                port_specs.append(InputPortSpec.from_xml(child))
+            elif child.tag == "outputPortSpec":
+                output_port_specs.append(OutputPortSpec.from_xml(child))
+            elif child.tag == "docstring":
+                if child.text:
+                    docstring = child.text
+        return cls(name, superklass, code_ref, docstring, port_specs,
+                   output_port_specs, output_type)
+
+    def get_returned_output_port_specs(self):
+        return [ps for ps in self.output_port_specs 
+                if ps.property_key is not None]
+
+    def get_input_args(self):
+        args = [ps for ps in self.port_specs if ps.in_args]
+        args.sort(key=lambda ps: ps.arg_pos)
+        if len(args) > 1 and len(args) != (args[-1].arg_pos + 1):
+            raise ValueError("Argument positions are numbered incorrectly")
+        return args
+
+    def get_output_port_spec(self, compute_name):
+        for ps in self.output_port_specs:
+            if ps.compute_name == compute_name:
+                return ps
+        return None
+
+    def get_mixin_name(self):
+        return self.name + "Mixin"
+        
+    def has_mixin(self):
+        if self._mixin_class is None:
+            mixin_classes = get_mixin_classes()
+            if self.get_mixin_name() in mixin_classes:
+                self._mixin_class = mixin_classes[self.get_mixin_name()]
+            else:
+                self._mixin_class = False
+        return (self._mixin_class is not False)
+
+    def get_mixin_function(self, f_name):
+        if not self.has_mixin():
+            return None
+        if self._mixin_functions is None:
+            self._mixin_functions = \
+                dict(inspect.getmembers(self._mixin_class, inspect.ismethod))
+        if f_name in self._mixin_functions:
+            s = inspect.getsource(self._mixin_functions[f_name])
+            return s[s.find(':')+1:].strip()
+        return None
+            
+    def get_compute_before(self):
+        return self.get_mixin_function("compute_before")
+    
+    def get_compute_inner(self):
+        return self.get_mixin_function("compute_inner")
+
+    def get_compute_after(self):
+        return self.get_mixin_function("compute_after")
+    
+    def get_init(self):
+        return self.get_mixin_function("__init__")
+
+class PortSpec(object):
+    xml_name = "portSpec"
+    attrs = {"name": "",
+             "port_type": None,
+             "docstring": ("", True),
+             "required": (False, False, True),
+             "show_port": (False, False, True),
+             "hide": (False, False, True),
+             "property_type": ""}
+
+    def __init__(self, arg, **kwargs):
+        self.arg = arg
+        self.set_defaults(**kwargs)
+
+    def set_defaults(self, **kwargs):
+        for attr, props in self.attrs.iteritems():
+            if isinstance(props, tuple):
+                default_val = props[0]
+            else:
+                default_val = props
+            if attr in kwargs:
+                setattr(self, attr, kwargs[attr])
+            else:
+                setattr(self, attr, default_val)
+
+        if not self.name:
+            if self.port_type == "__property__":
+                self.name = self.arg + "Properties"
+            else:
+                self.name = self.arg
+
+    def to_xml(self, elt=None):
+        if elt is None:
+            elt = ET.Element(self.xml_name)
+        elt.set("arg", self.arg)
+        for attr, props in self.attrs.iteritems():
+            attr_val = getattr(self, attr)
+            is_subelt = False
+            if isinstance(props, tuple):
+                default_val = props[0]
+                if len(props) > 1:
+                    is_subelt = props[1]
+            else:
+                default_val = props
+
+            if default_val != attr_val:
+                if is_subelt:
+                    subelt = ET.Element(attr)
+                    subelt.text = str(getattr(self, attr))
+                    elt.append(subelt)
+                else:
+                    elt.set(attr, str(attr_val))
+        return elt
+
+        # if self.name != "":
+        #     elt.set("name", self.name)
+        # if self.port_type is not None:
+        #     elt.set("port_type", self.port_type)
+        # else:
+        #     elt.set("port_type", "__unknown__")
+        # if self.port_type == "__property__":
+        #     elt.set("property_type", self.property_type)
+        # if self.required != False:
+        #     elt.set("required", str(self.required))
+        # if self.
+        # elt.set("hide", str(self.hide))
+        # elt.set("show_port", str(self.show_port))
+
+    @classmethod
+    def internal_from_xml(cls, elt, obj=None):
+        arg = elt.get("arg", "")
+        if obj is None:
+            obj = cls(arg)
+        else:
+            obj.arg = arg
+
+        child_elts = {}
+        for child in elt.getchildren():
+            # if child.tag not in obj.attrs:
+            #     raise RuntimeError('Cannot deal with tag "%s"' % child.tag)
+            if child.tag not in child_elts:
+                child_elts[child.tag] = []
+            child_elts[child.tag].append(child)
+
+        kwargs = {}
+        for attr, props in obj.attrs.iteritems():
+            is_subelt = False
+            run_eval = False
+            if isinstance(props, tuple):
+                if len(props) > 1:
+                    is_subelt = props[1]
+                if len(props) > 2:
+                    run_eval = props[2]
+            attr_vals = []
+            if is_subelt:
+                if attr in child_elts:
+                    attr_vals = [c.text for c in child_elts[attr]
+                                 if c.text is not None]
+                    if attr == "docstring":
+                        print "()() docstring attr_vals:", attr_vals
+            else:
+                attr_val = elt.get(attr)
+                if attr_val is not None:
+                    attr_vals = [attr_val]
+            
+            if len(attr_vals) > 1:
+                raise ValueError('Should have only one value for '
+                                'attribute "%s"' % attr)
+            if len(attr_vals) > 0:
+                attr_val = attr_vals[0]
+                if run_eval:
+                    try:
+                        kwargs[attr] = eval(attr_val)
+                    except (NameError, SyntaxError):
+                        kwargs[attr] = attr_val                        
+                else:
+                    kwargs[attr] = attr_val
+        obj.set_defaults(**kwargs)
+        return obj, child_elts
+        
+    @classmethod
+    def from_xml(cls, elt, obj=None):
+        obj, child_elts = cls.internal_from_xml(elt, obj)
+        return obj
+
+    @staticmethod
+    def create_from_xml(elt):
+        if elt.tag == "inputPortSpec":
+            return InputPortSpec.from_xml(elt)
+        elif elt.tag == "outputPortSpec":
+            return OutputPortSpec.from_xml(elt)
+        elif elt.tag == "alternateSpec":
+            return AlternatePortSpec.from_xml(elt)
+        raise TypeError('Cannot create spec from element of type "%s"' %
+                        elt.tag)
+
+
+    # @staticmethod
+    # def from_xml(elt, obj=None):
+    #     arg = elt.get("arg", "")
+    #     if obj is None:
+    #         obj = PortSpec(arg)
+    #     else:
+    #         obj.arg = arg
+    #     obj.port_type = elt.get("port_type", "")
+    #     if obj.port_type == "__unknown__":
+    #         obj.port_type = None
+
+    #     if obj.port_type is not None and \
+    #             obj.port_type.lower() == "__property__":
+    #         obj.name = elt.get("name", obj.arg + "Properties")
+    #     else:
+    #         obj.name = elt.get("name", obj.arg)
+    #     obj.required = eval(elt.get("required", "False"))
+    #     obj.hide = eval(elt.get("hide", "False"))
+    #     obj.show_port = eval(elt.get("show_port", "False"))
+    #     return obj
+
+    def is_property(self):
+        return self.port_type == "__property__"
+
+    def get_property_type(self):
+        return "Mpl%sProperties" % \
+            capfirst(self.property_type.rsplit('.', 1)[1])
+
+    def get_port_type(self):
+        if self.port_type is None:
+            return "basic:String"
+        return self.port_type
+
+class InputPortSpec(PortSpec):
+    xml_name = "inputPortSpec"
+    attrs = {"entry_types": (None, True, True),
+             "values": (None, True, True),
+             "defaults": (None, True, True),
+             "translations": (None, True, True),
+             "in_kwargs": (True, False, True),
+             "in_args": (False, False, True),
+             "constructor_arg": (False, False, True),
+             "arg_pos": (-1, False, True),
+             }
+    attrs.update(PortSpec.attrs)
+
+    def __init__(self, arg, **kwargs):
+        if "alternate_specs" in kwargs and kwargs["alternate_specs"]:
+            self.alternate_specs = kwargs.pop("alternate_specs")
+        else:
+            self.alternate_specs = []
+        PortSpec.__init__(self, arg, **kwargs)
+        for spec in self.alternate_specs:
+            spec.set_parent(self)
+
+    def to_xml(self, elt=None):
+        elt = PortSpec.to_xml(self, elt)
+        for spec in self.alternate_specs:
+            # write the spec
+            subelt = spec.to_xml()
+            elt.append(subelt)
+        return elt
+
+    @classmethod
+    def from_xml(cls, elt, obj=None):
+        obj, child_elts = cls.internal_from_xml(elt, obj)
+
+        if "alternateSpec" in child_elts:
+            for child_elt in child_elts["alternateSpec"]:
+                spec = AlternatePortSpec.from_xml(child_elt)
+                spec.set_parent(obj)
+                obj.alternate_specs.append(spec)
+                
+        return obj
+
+    def get_port_attr_dict(self):
+        attrs = {}
+        if self.values:
+            attrs["values"] = str(self.values)
+        if self.entry_types:
+            attrs["entry_types"] = str(self.entry_types)
+        if self.defaults:
+            attrs["defaults"] = str(self.defaults)
+        if self.docstring:
+            attrs["docstring"] = self.docstring
+        if not self.required and not self.show_port:
+            attrs["optional"] = True
+        return attrs
+
+    def get_port_attrs(self):
+        return str(self.get_port_attr_dict())
+
+    def has_alternate_versions(self):
+        return len(self.alternate_specs) > 0
+
+    # def is_property_input(self):
+    #     return self.get_port_type().lower() == "__property__"
+
+class AlternatePortSpec(InputPortSpec):
+    # attrs = ["name", "port_type", "docstring", "required", "hide", 
+    #          "entry_types", "values", "defaults", "translations", 
+    #          "property_type"]
+
+    xml_name = "alternateSpec"
+    def __init__(self, *args, **kwargs):
+        if len(args) < 1:
+            args = [""]
+        InputPortSpec.__init__(self, *args, **kwargs)
+        self._parent = None
+
+    def set_parent(self, parent):
+        self._parent = parent
+        if not self.name:
+            if self._parent.name.endswith("Sequence"):
+                base_name = self._parent.name[:-8]
+            elif self._parent.name.endswith("Scalar"):
+                base_name = self._parent.name[:-6]
+            else:
+                base_name = self._parent.name
+            if self.port_type == "basic:List":
+                self.name = base_name + "Sequence"
+            else:
+                self.name = base_name + "Scalar"
+        self.arg = self._parent.arg
+            
+    # def to_xml(self, elt=None):
+    #     if elt is None:
+    #         elt = ET.Element("alternateSpec")
+    #     return PortSpec.to_xml(self, elt)
+
+    def get_port_attr_dict(self):
+        print "CALLING AlternatePortSpec.get_port_attr_dict", self.arg
+        my_attrs = InputPortSpec.get_port_attr_dict(self)
+        print "=> my_attrs:", my_attrs
+        par_attrs = self._parent.get_port_attr_dict()
+        print "=> par_attrs:", par_attrs
+        for k, v in par_attrs.iteritems():
+            if k == 'defaults' or k == "values" or k == "entry_types" or \
+                    k == "translations":
+                continue
+            if k not in my_attrs or my_attrs[k] is None:
+                my_attrs[k] = v
+        print my_attrs
+        return my_attrs
+
+class OutputPortSpec(PortSpec):
+    xml_name = "outputPortSpec"
+    attrs = {"compute_name": "",
+             "property_key": None,
+             "plural": (False, False, True),
+             "compute_parent": "",
+             }
+    attrs.update(PortSpec.attrs)
+    
+    def set_defaults(self, **kwargs):
+        PortSpec.set_defaults(self, **kwargs)
+        if self.compute_name == "":
+            if self.plural and self.is_property():
+                self.compute_name = self.arg + 's'
+            else:
+                self.compute_name = self.arg
+
+    @classmethod
+    def from_xml(cls, elt, obj=None):
+        obj, child_elts = cls.internal_from_xml(elt, obj)
+
+        output_type = elt.get("output_type")
+        if output_type is not None:
+            obj.port_type = output_type
+        return obj
+
+    def get_port_attrs(self):
+        attrs = {}
+        if self.docstring:
+            attrs["docstring"] = self.docstring
+        return str(attrs)
+             
+
+# class OutputPortSpec(object):
+#     attrs = ["name", "compute_name", "output_type", "docstring",
+#              "property_type", "property_key", "plural", "compute_parent"]
+#     def __init__(self, arg, name, compute_name, output_type, docstring="",
+#                  property_type="", property_key=None, plural=False, 
+#                  compute_parent=""):
+#         self.arg = arg
+#         self.name = name
+#         self.compute_name = compute_name
+#         self.output_type = output_type
+#         self.docstring = docstring
+#         self.property_type = property_type
+#         self.property_key = property_key
+#         self.plural = plural
+#         self.compute_parent = compute_parent
+
+#         self._property_name = None
+
+#     def to_xml(self, elt=None):
+#         if elt is None:
+#             elt = ET.Element("outputPortSpec")
+#         elt.set("arg", self.arg)
+#         elt.set("name", self.name)
+#         elt.set("compute_name", self.compute_name)
+#         if self.output_type is not None:
+#             elt.set("output_type", self.output_type)
+#         else:
+#             elt.set("output_type", "__unknown__")
+#         elt.set("property_type", self.property_type)
+#         if self.property_key is None:
+#             elt.set("property_key", "__none__")
+#         else:
+#             elt.set("property_key", str(self.property_key))
+#         elt.set("plural", str(self.plural))
+#         elt.set("compute_parent", self.compute_parent)
+                
+#         subelt = ET.Element("docstring")
+#         subelt.text = str(self.docstring)
+#         elt.append(subelt)
+#         return elt
+
+#     @classmethod
+#     def from_xml(cls, elt):
+#         arg = elt.get("arg", "")
+#         output_type = elt.get("output_type", "")
+#         if output_type == "__unknown__":
+#             output_type = None
+#         plural = eval(elt.get("plural", "False"))
+        
+#         if output_type.lower() == "__property__":
+#             name = elt.get("name", arg + "Properties")
+#             compute_name = elt.get("compute_name", arg + 
+#                                    ("s" if plural else ""))
+#         else:
+#             name = elt.get("name", arg)
+#             compute_name = elt.get("name", arg)
+#         property_type = elt.get("property_type", "")
+#         property_key = elt.get("property_key", None)
+#         if property_key is not None:
+#             if property_key == "__none__":
+#                 property_key = None
+#             else:
+#                 try:
+#                     property_key = int(property_key)
+#                 except ValueError:
+#                     pass
+#         compute_parent = elt.get("compute_parent", "")
+#         docstring = ""
+#         for child in elt.getchildren():
+#             if child.tag == "docstring" and child.text:
+#                 docstring = child.text
+#         return cls(arg, name, compute_name, output_type, docstring,
+#                    property_type, property_key, plural, compute_parent)
+
+#     def is_property_output(self):
+#         return self.output_type.lower() == "__property__"
+
+#     def get_property_type(self):
+#         return "Mpl%sProperties" % \
+#             capfirst(self.property_type.rsplit('.', 1)[1])
+
+#     def get_port_type(self):
+#         if self.output_type is None:
+#             return "basic:String"
+#         return self.output_type
+
+# class InputPortSpec(PortSpec):
+#     def __init__(self, arg="", name="", port_type=None, docstring="", 
+#                  required=False, show_port=False, hide=False, property_type="",
+#                  entry_types=None, values=None, defaults=None,
+#                  translations=None, alternate_specs=None, in_kwargs=True,
+#                  in_args=False, constructor_arg=False):
+#         PortSpec.__init__(self, arg, name, port_type, docstring, required,
+#                           show_port, hide, property_type)
+#         self.entry_types = entry_types
+#         self.values = values
+#         self.defaults = defaults
+#         self.translations = translations
+#         self.in_kwargs = in_kwargs
+#         self.in_args = in_args
+#         self.constructor_arg = constructor_arg
+#         if alternate_specs is None:
+#             self.alternate_specs = []
+#         else:
+#             self.alternate_specs = alternate_specs
+#         for spec in self.alternate_specs:
+#             spec.set_parent(self)
+
+#     def to_xml(self, elt=None):
+#         if elt is None:
+#             elt = ET.Element("inputPortSpec")
+#         PortSpec.to_xml(self, elt)
+#         elt.set("in_kwargs", str(self.in_kwargs))
+#         elt.set("in_args", str(self.in_args))
+#         elt.set("constructor_arg", str(self.constructor_arg))
+#         if self.entry_types is not None:
+#             subelt = ET.Element("entry_types")
+#             subelt.text = str(self.entry_types)
+#             elt.append(subelt)
+#         if self.values is not None:
+#             subelt = ET.Element("values")
+#             subelt.text = str(self.values)
+#             elt.append(subelt)
+#         if self.translations is not None:
+#             subelt = ET.Element("translations")
+#             subelt.text = str(self.translations)
+#             elt.append(subelt)
+#         if self.defaults is not None:
+#             subelt = ET.Element("defaults")
+#             subelt.text = str(self.defaults)
+#             elt.append(subelt)
+#         for spec in self.alternate_specs:
+#             # print "FOUND ALT:", spec.name, spec.alternate_specs, spec
+#             subelt = ET.Element("alternateSpec")
+#             spec.to_xml(subelt)
+#             elt.append(subelt)
+#         # if self.entry_types is not None and self.values is not None and \
+#         #         self.defaults is not None and self.translations is not None:
+#         #     for entry_type, value, default, translation in \
+#         #             izip(self.entry_types, self.values, self.defaults,
+#         #                  self.translations):
+#         #         subelt = ET.Element("entry")
+#         #         subelt.set("type", str(entry_type))
+#         #         valueselt = ET.Element("values")
+#         #         valueselt.text = str(value)
+#         #         subelt.append(valueselt)
+#         #         transelt = ET.Element("translation")
+#         #         transelt.text = str(translation)
+#         #         subelt.append(transelt)
+#         #         defaultelt = ET.Element("default")
+#         #         if isinstance(default, basestring):
+#         #             defaultelt.text = "'%s'" % default
+#         #         else:
+#         #             defaultelt.text = str(default)
+#         #         subelt.append(defaultelt)
+#         #         elt.append(subelt)
+#         docelt = ET.Element("docstring")
+#         docelt.text = self.docstring
+#         elt.append(docelt)
+#         return elt
+
+#     @classmethod
+#     def from_xml(cls, elt):
+#         arg = elt.get("arg", "")
+#         port_type = elt.get("port_type", "")
+#         if port_type == "__unknown__":
+#             port_type = None
+#         required = eval(elt.get("required", "False"))
+#         hide = eval(elt.get("hide", "False"))
+#         in_kwargs = eval(elt.get("in_kwargs", "True"))
+#         property_type = elt.get("property_type", "")
+#         constructor_arg = eval(elt.get("constructor_arg", "False"))
+#         if port_type is not None and port_type.lower() == "__property__":
+#             name = elt.get("name", arg + "Properties")
+#         else:
+#             name = elt.get("name", arg)
+#         entry_types = None
+#         values = None
+#         defaults = None
+#         translations = None
+#         docstring = ""
+#         alternate_specs = []
+#         for child in elt.getchildren():
+#             if child.tag == "entry_types":
+#                 entry_types = eval(child.text)
+#             elif child.tag == "values":
+#                 try:
+#                     values = eval(child.text)
+#                 except SyntaxError:
+#                     values = [[child.text[2:-2]]]
+#             elif child.tag == "translations":
+#                 try:
+#                     translations = eval(child.text)
+#                 except NameError:
+#                     translations = child.text
+#             elif child.tag == "defaults":
+#                 if child.text:
+#                     defaults = eval(child.text)
+#             elif child.tag == "docstring":
+#                 if child.text:
+#                     docstring = child.text
+#             elif child.tag == "alternateSpec":
+#                 alternate_specs.append(AlternatePortSpec.from_xml(child))
+
+#             # if child.tag == "entry":
+#             #     if entry_types is None:
+#             #         entry_types = []
+#             #         values = []
+#             #         defaults = []
+#             #         translations = []
+#             #     entry_types.append(child.get("type", None))
+#             #     for subchild in child.getchildren():
+#             #         if subchild.tag == "values":
+#             #             values.append(eval(subchild.text))
+#             #         elif subchild.tag == "translation":
+#             #             try:
+#             #                 translation = eval(subchild.text)
+#             #             except NameError:
+#             #                 translation = subchild.text
+#             #             translations.append(translation)
+#             #         elif subchild.tag == "default":
+#             #             defaults.append(eval(subchild.text))
+#             # elif child.tag == "docstring":
+#             #     docstring = child.text
+
+#         return cls(arg, name, port_type, docstring, required, hide, 
+#                    entry_types, values, defaults, translations, 
+#                    alternate_specs, in_kwargs, property_type, constructor_arg)
+
+
+#     # def has_scalar_version(self):
+#     #     return self.scalar_type and self.scalar_type != self.port_type
+
+#     # def get_scalar_name(self):
+#     #     return self.name + "Scalar"
+
+#     # def has_sequence_version(self):
+#     #     return self.sequence_type and self.sequence_type != self.port_type
+
+#     # def get_sequence_name(self):
+#     #     return self.name + "Sequence"
+
+#     # def has_other_version(self):
+#     #     return self.has_scalar_version() or self.has_sequence_version()
+
+#     # def get_other_name(self):
+#     #     if self.has_scalar_version():
+#     #         return self.get_scalar_name()
+#     #     elif self.has_sequence_version():
+#     #         return self.get_sequence_name()
+#     #     return None
+
+#     # def get_other_type(self):
+#     #     if self.has_scalar_version():
+#     #         return self.scalar_type
+#     #     elif self.has_sequence_version():
+#     #         return self.sequence_type
+#     #     return None
+
+def run():
+    specs = SpecList.read_from_xml("mpl_plots_raw.xml")
+    specs.write_to_xml("mpl_plots_raw_out.xml")
+
+if __name__ == '__main__':
+    run()
diff --git a/vistrails/packages/matplotlib/update.py b/vistrails/packages/matplotlib/update.py
new file mode 100644
index 0000000..7d80c04
--- /dev/null
+++ b/vistrails/packages/matplotlib/update.py
@@ -0,0 +1,78 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import os
+import shutil
+
+from parse import run as run_parse
+from diff import compute_diff, apply_diff
+from generate import run as run_generate
+
+_bases = ["artists", "plots"]
+
+def backup():
+    if not os.path.exists("backup"):
+        os.mkdir("backup")
+    backup_files = ["mpl_%s_raw.xml", "mpl_%s.xml", "mpl_%s_diff.xml"]
+    for base in _bases:
+        for fname_base in backup_files:
+            fname = fname_base % base
+            shutil.copy(fname, "backup")
+
+def run(which="all"):
+    backup()
+    if which == "all":
+        bases = _bases
+    else:
+        bases = [which]
+    for base in bases:
+        compute_diff("mpl_%s_raw.xml" % base, 
+                     "mpl_%s.xml" % base, 
+                     "mpl_%s_diff.xml" % base)
+        run_parse(base)
+        apply_diff("mpl_%s_raw.xml" % base,
+                   "mpl_%s_diff.xml" % base,
+                   "mpl_%s.xml" % base)
+        run_generate(base)
+
+if __name__ == "__main__":
+    import sys
+    if len(sys.argv) > 1:
+        if sys.argv[1] == 'backup':
+            backup()
+        else:
+            run(sys.argv[1])
+    else:
+        run()
diff --git a/vistrails/packages/matplotlib/widgets.py b/vistrails/packages/matplotlib/widgets.py
new file mode 100644
index 0000000..c11560e
--- /dev/null
+++ b/vistrails/packages/matplotlib/widgets.py
@@ -0,0 +1,49 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from vistrails.gui.modules.python_source_configure import PythonEditor
+from vistrails.gui.modules.source_configure import SourceConfigurationWidget
+
+class MplSourceConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        """ MplSourceConfigurationWidget(module: Module,
+                                         controller: VistrailController,
+                                         parent: QWidget)
+                                         -> MplSourceConfigurationWidget
+        Setup the dialog to similar to PythonSource but with a
+        different name
+        
+        """
+        SourceConfigurationWidget.__init__(self, module, controller, 
+                                           PythonEditor, True, False, parent)
diff --git a/vistrails/packages/parallelflow/__init__.py b/vistrails/packages/parallelflow/__init__.py
new file mode 100644
index 0000000..0f26f60
--- /dev/null
+++ b/vistrails/packages/parallelflow/__init__.py
@@ -0,0 +1,3 @@
+identifier="edu.poly.vistrails.parallel_flow"
+name="Parallel Flow"
+version="0.1.1"
diff --git a/vistrails/packages/parallelflow/api.py b/vistrails/packages/parallelflow/api.py
new file mode 100644
index 0000000..7ee4a5f
--- /dev/null
+++ b/vistrails/packages/parallelflow/api.py
@@ -0,0 +1,116 @@
+"""Provides access to IPython to packages.
+
+get_client() returns the Client object, from which you can construct a view.
+This may return None if no client is available, if the user cancels, etc, in
+which case you can raise an exception.
+
+direct_view() returns a DirectView of the whole cluster. It is equivalent to
+get_client()[:], with the difference that it will prompt the user to create new
+engines if none are started.
+
+load_balanced_view() returns a LoadBalancedView of the cluster. It is
+equivalent to get_client().load_balanced_view(), with the difference that it
+will prompt the user to create new engines if none are started.
+
+parallel_map() might use IPython's parallel map_sync(), or the standard map()
+function if IPython cannot be used.
+If the 'ipython' keyword argument is True, the function will return an
+additional boolean indicating whether this was computed through IPython (True)
+or with the default map() function (False).
+
+All of these functions have an 'ask' parameter, that indicates whether to
+prompt the user to start a cluster if none is available. It is True by default
+(except for parallel_map).
+"""
+
+
+__all__ = ['get_client', 'direct_view', 'load_balanced_view', 'parallel_map']
+
+
+def get_client(ask=True):
+    """Returns a Client object, from which you can construct a view.
+
+    This may return None if no client is available, if the user cancels, etc.
+    In this case, you might want to raise a ModuleError.
+    """
+    from engine_manager import EngineManager
+
+    c = EngineManager.ensure_controller(connect_only=not ask)
+    if c is not None and ask and not c.ids:
+        EngineManager.start_engines(
+                prompt="A module requested an IPython cluster, but no engines "
+                       "are started. Do you want to start some?")
+    if c is not None and c.ids:
+        return c
+    else:
+        return None
+
+
+def direct_view(ask=True):
+    """Returns a DirectView of the whole cluster.
+
+    This is equivalent to get_client()[:], with the difference that it will
+    prompt the user to create new engines if none are started.
+    """
+    c = get_client()
+    if c is not None:
+        return c[:]
+    else:
+        return None
+
+
+def load_balanced_view(ask=True):
+    """Returns a LoadBalancedView of the cluster.
+
+    This is equivalent to get_client().load_balanced_view(), with the
+    difference that it will prompt the user to create new engines if none are
+    started.
+    """
+    c = get_client()
+    if c is not None:
+        return c.load_balanced_view()
+    else:
+        return None
+
+
+def parallel_map(function, *args, **kwargs):
+    """Wrapper around IPython's map_sync() that defaults to map().
+
+    This might use IPython's parallel map_sync(), or the standard map()
+    function if IPython cannot be used.
+
+    If the 'ask' keyword argument is true, the user will be prompted to start
+    IPython engines, but the function will still default to map() if the user
+    cancels.
+    If the 'ipython' keyword argument is True, the function will return an
+    additional boolean indicating whether this was computed through IPython
+    (True) or with the default map() function (False).
+    """
+    say_ipython = kwargs.pop('ipython', False)
+    ask = kwargs.pop('ask', False)
+    if kwargs:
+        raise TypeError("map() got unexpected keyword arguments")
+
+    try:
+        import IPython.parallel
+    except ImportError:
+        result, ipython = map(function, *args), False
+    else:
+        from engine_manager import EngineManager
+        c = EngineManager.ensure_controller(connect_only=not ask)
+        if c is not None and not c.ids:
+            EngineManager.start_engines(
+                    prompt="A module is performing a parallelizable "
+                    "operation, however no IPython engines are running. Do "
+                    "you want to start some?")
+
+        if c is None or not c.ids:
+            result, ipython = map(function, *args), False
+        else:
+            ldview = c.load_balanced_view()
+            result, ipython = ldview.map_sync(function, *args), True
+
+    if say_ipython:
+        return result, ipython
+    else:
+        return result
diff --git a/vistrails/packages/parallelflow/engine_manager.py b/vistrails/packages/parallelflow/engine_manager.py
new file mode 100644
index 0000000..58763f6
--- /dev/null
+++ b/vistrails/packages/parallelflow/engine_manager.py
@@ -0,0 +1,491 @@
+import os
+import subprocess
+import sys
+import time
+
+from IPython.utils.path import get_ipython_dir, locate_profile
+from IPython.parallel import Client
+from IPython.parallel import error
+
+from vistrails.core.system import vistrails_root_directory
+
+
+try:
+    from PyQt4 import QtCore, QtGui
+    QtGui.QDialog
+except Exception:
+    qt_available = False
+else:
+    qt_available = True
+
+
+class ProfileItem(QtGui.QListWidgetItem):
+    def __init__(self, profile, text, italic=False):
+        QtGui.QListWidgetItem.__init__(self, text)
+        if italic:
+            font = self.font()
+            font.setItalic(True)
+            self.setFont(font)
+        self.profile = profile
+
+
+def choose_profile(profiles):
+    dialog = QtGui.QDialog()
+    dialog.setWindowTitle("IPython profile selection")
+
+    layout = QtGui.QVBoxLayout()
+    profile_list = QtGui.QListWidget()
+    profile_list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+    for profile in profiles:
+        profile_list.addItem(ProfileItem(profile, profile))
+
+    # If no profiles are available, still provide an option to use the
+    # 'default' profile
+    if not profiles:
+        profile_list.addItem(ProfileItem('default', "default (create)", True))
+
+    buttons = QtGui.QHBoxLayout()
+    ok = QtGui.QPushButton("Select")
+    QtCore.QObject.connect(ok, QtCore.SIGNAL('clicked()'),
+                           dialog, QtCore.SLOT('accept()'))
+    buttons.addWidget(ok)
+    cancel = QtGui.QPushButton("Cancel")
+    QtCore.QObject.connect(cancel, QtCore.SIGNAL('clicked()'),
+                           dialog, QtCore.SLOT('reject()'))
+    buttons.addWidget(cancel)
+
+    def check_selection():
+        selection = profile_list.selectedItems()
+        ok.setEnabled(len(selection) == 1)
+    QtCore.QObject.connect(
+            profile_list, QtCore.SIGNAL('itemSelectionChanged()'),
+            check_selection)
+    check_selection()
+
+    layout.addWidget(profile_list)
+    layout.addLayout(buttons)
+    dialog.setLayout(layout)
+
+    if dialog.exec_() == QtGui.QDialog.Accepted:
+        return profile_list.selectedItems()[0].profile
+    else:
+        return None
+
+
+class EngineManager(object):
+    def __init__(self):
+        self.profile = None
+        self.started_controller = None
+        self.started_engines = set()
+        self._client = None
+
+    def _select_profile(self):
+        # See IPython.core.profileapp:list_profile_in()
+        profiles = []
+        for filename in os.listdir(get_ipython_dir()):
+            if filename.startswith('profile_'):
+                profiles.append(filename[8:])
+
+        if profiles == ['default'] and not qt_available:
+            self.profile = 'default'
+        elif not qt_available:
+            raise ValueError("'default' IPython profile does not exist "
+                             "and PyQt4 is not available")
+        else:
+            self.profile = choose_profile(profiles)
+
+    def ensure_controller(self, connect_only=False):
+        """Make sure a controller is available, else start a local one.
+        """
+        if self._client:
+            return self._client
+
+        if self.profile is None:
+            self._select_profile()
+        if self.profile is None:
+            return None
+        print "parallelflow: using IPython profile %r" % self.profile
+
+        try:
+            self._client = Client(profile=self.profile)
+            print "parallelflow: connected to controller"
+            return self._client
+        except error.TimeoutError:
+            print "parallelflow: timeout when connecting to controller"
+            if connect_only:
+                start_ctrl = False
+            elif qt_available:
+                res = QtGui.QMessageBox.question(
+                        None,
+                        "Start controller",
+                        "Unable to connect to the configured IPython "
+                        "controller. Do you want to start one?",
+                        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
+                start_ctrl = res == QtGui.QMessageBox.Yes
+            else:
+                start_ctrl = True
+        except IOError:
+            print "parallelflow: didn't find a controller to connect to"
+            if connect_only:
+                start_ctrl = False
+            elif qt_available:
+                res = QtGui.QMessageBox.question(
+                        None,
+                        "Start controller",
+                        "No controller is configured in this IPython profile. "
+                        "Do you want to start one?",
+                        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
+                start_ctrl = res == QtGui.QMessageBox.Yes
+            else:
+                start_ctrl = True
+
+        if start_ctrl:
+            ctrl_pid = os.path.join(
+                    locate_profile(self.profile),
+                    'pid',
+                    'ipcontroller.pid')
+            if os.path.exists(ctrl_pid):
+                os.remove(ctrl_pid)
+            print "parallelflow: starting controller"
+            proc, code = self.start_process(
+                    lambda: os.path.exists(ctrl_pid),
+                    sys.executable,
+                    '-m',
+                    'IPython.parallel.apps.ipcontrollerapp',
+                    '--profile=%s' % self.profile)
+            if code is not None:
+                if qt_available:
+                    QtGui.QMessageBox.critical(
+                            None,
+                            "Error",
+                            "Controller exited with code %d" % code)
+                print ("parallelflow: controller process exited with "
+                       "code %d" % code)
+                return None
+            else:
+                self.started_controller = proc
+                print "parallelflow: controller started, connecting"
+                self._client = Client(profile=self.profile)
+                return self._client
+
+        return None
+
+    @staticmethod
+    def start_process(condition, *args):
+        """Executes a file and waits for a condition.
+        """
+        prev_dir = os.getcwd()
+        os.chdir(os.path.join(vistrails_root_directory(), os.path.pardir))
+        try:
+            p = subprocess.Popen(args)
+        finally:
+            os.chdir(prev_dir)
+        if condition is None:
+            return p, None
+        else:
+            while True:
+                time.sleep(0.5)
+                if condition():
+                    return p, None
+                res = p.poll()
+                if res is not None:
+                    return None, res
+
+    def start_engines(self, nb=None, prompt="Number of engines to start"):
+        """Start some engines locally
+        """
+        c = self.ensure_controller()
+        if c is None:
+            if qt_available:
+                QtGui.QMessageBox.warning(
+                        None,
+                        "No controller",
+                        "Can't start engines: couldn't connect to a "
+                        "controller")
+            print "parallelflow: no controller, not starting engines"
+        else:
+            if not nb and qt_available:
+                nb, res = QtGui.QInputDialog.getInt(
+                        None,
+                        "Start engines",
+                        prompt,
+                        1,  # value
+                        1,  # min
+                        16) # max
+                if not res:
+                    return
+            elif nb is None:
+                nb = 1
+            print "parallelflow: about to start %d engines" % nb
+            if qt_available:
+                bar = QtGui.QProgressDialog(
+                        "Starting engines...",
+                        None,
+                        0, nb)
+                def progress(n):
+                    bar.setValue(n)
+                bar.show()
+            else:
+                def progress(n): pass
+            progress(0)
+
+            init_engines = set(c.ids)
+            # Start the processes
+            starting = set()
+            for i in xrange(nb):
+                proc, res = self.start_process(
+                        None,
+                        sys.executable,
+                        '-m',
+                        'IPython.parallel.apps.ipengineapp',
+                        '--profile=%s' % self.profile)
+                starting.add(proc)
+            # Wait for each one to either fail or connect
+            failed = []
+            connected = 0
+            while connected < len(starting):
+                connected = len(set(c.ids) - init_engines)
+                progress(len(failed) + connected)
+                time.sleep(0.5)
+                for p in list(starting):
+                    res = p.poll()
+                    if res is not None:
+                        failed.append(res)
+                        starting.remove(p)
+            if failed:
+                nb_failed = len(failed)
+                if nb_failed > 3:
+                    failed = "%s, ..." % (', '.join('%d' % f for f in failed))
+                else:
+                    failed = ', '.join('%d' % f for f in failed)
+                if qt_available:
+                    QtGui.QMessageBox.critical(
+                        None,
+                        "Error",
+                        "%d engine(s) exited with codes: %s" % (
+                        nb_failed, failed))
+                print "parallelflow: %d engine(s) exited with codes: %s" % (
+                        nb_failed, failed)
+            self.started_engines.update(starting)
+
+            if qt_available:
+                bar.hide()
+                bar.deleteLater()
+            print "parallelflow: %d engines started" % (i + 1)
+
+    def info(self):
+        """Show some information on the cluster.
+        """
+        client = self.ensure_controller(connect_only=True)
+
+        print "----- IPython information -----"
+        print "profile: %s" % self.profile
+        connected = client is not None
+        print "connected to controller: %s" % (
+                "yes" if connected else "no")
+        st_ctrl = (self.started_controller is not None and
+                        self.started_controller.poll() is None)
+        print "controller started from VisTrails: %s" % (
+                "running" if st_ctrl else "no")
+        st_engines = sum(1 for p in self.started_engines if p.poll() is None)
+        print "engines started from VisTrails: %d" % st_engines
+        if client is not None:
+            nb_engines = len(client.ids)
+        else:
+            nb_engines = None
+        print "total engines in cluster: %s" % (
+                nb_engines if nb_engines is not None else "(unknown)")
+        if connected and client.ids:
+            dview = client[:]
+            with dview.sync_imports():
+                import os
+                import platform
+                import socket
+            engines = dview.apply_async(
+                    eval,
+                    '(os.getpid(), platform.system(), socket.getfqdn())'
+            ).get_dict()
+            engines = sorted(
+                    engines.items(),
+                    key=lambda (ip_id, (pid, system, fqdn)): (fqdn, ip_id))
+            print "engines:"
+            print "\tid\tsystem\tPID\tnode FQDN"
+            print "\t--\t------\t---\t---------"
+            for ip_id, (pid, system, fqdn) in engines:
+                print "\t%d\t%s\t%d\t%s" % (ip_id, system, pid, fqdn)
+        print ""
+
+        if qt_available:
+            dialog = QtGui.QDialog()
+            layout = QtGui.QVBoxLayout()
+            form = QtGui.QFormLayout()
+            form.addRow(
+                    "Profile:",
+                    QtGui.QLabel(self.profile))
+            form.addRow(
+                    "Connected:",
+                    QtGui.QLabel("yes" if connected else "no"))
+            form.addRow(
+                    "Controller started from VisTrails:",
+                    QtGui.QLabel("running" if st_ctrl else "no"))
+            form.addRow(
+                    "Engines started from VisTrails:",
+                    QtGui.QLabel(str(st_engines)))
+            form.addRow(
+                    "Total engines in cluster:",
+                    QtGui.QLabel(str(nb_engines)
+                                 if nb_engines is not None
+                                 else "(unknown)"))
+            layout.addLayout(form)
+            if connected and client.ids:
+                tree = QtGui.QTreeWidget()
+                tree.setHeaderHidden(False)
+                tree.setHeaderLabels(["IPython id", "PID", "System type"])
+                engine_tree = dict()
+                for ip_id, (pid, system, fqdn) in engines:
+                    engine_tree.setdefault(fqdn, []).append(
+                            (ip_id, pid, system))
+                for fqdn, info in engine_tree.iteritems():
+                    node = QtGui.QTreeWidgetItem([fqdn])
+                    tree.addTopLevelItem(node)
+                    tree.setFirstItemColumnSpanned(node, True)
+                    for ip_id, pid, system in info:
+                        node.addChild(QtGui.QTreeWidgetItem([
+                                str(ip_id),
+                                str(pid),
+                                system]))
+                for i in xrange(tree.columnCount()):
+                    tree.resizeColumnToContents(i)
+                tree.expandAll()
+                layout.addWidget(tree)
+
+            ok = QtGui.QPushButton("Ok")
+            QtCore.QObject.connect(ok, QtCore.SIGNAL('clicked()'),
+                                   dialog, QtCore.SLOT('accept()'))
+            layout.addWidget(ok, 1, QtCore.Qt.AlignHCenter)
+            dialog.setLayout(layout)
+            dialog.exec_()
+
+    def change_profile(self):
+        self.cleanup()
+
+        old_profile = self.profile
+        self._select_profile()
+        if not self.profile:
+            self.profile = old_profile
+
+        if self.profile != old_profile:
+            # Here, the processes that were started but the user didn't want to
+            # clean up are abandonned
+            # They will continue running but later cleanups won't ask for these
+            # ones
+            self.started_engines = set()
+            self.started_controller = None
+
+    def cleanup(self):
+        """Shut down the started processes (with user confirmation).
+        """
+        engines = sum(1 for p in self.started_engines if p.poll() is None)
+        ctrl = (self.started_controller is not None and
+                self.started_controller.poll() is None)
+        print ("parallelflow: cleanup: %s, %d engines running" % (
+               "controller running" if ctrl else "no controller",
+               engines))
+
+        hub_shutdown = False
+
+        if ctrl:
+            if qt_available:
+                res = QtGui.QMessageBox.question(
+                        None,
+                        "Shutdown controller",
+                        "The controller is still running. Do you want to stop "
+                        "it?",
+                        QtGui.QMessageBox.Yes,
+                        QtGui.QMessageBox.No)
+                res = res != QtGui.QMessageBox.No
+            else:
+                res = True
+            if res:
+                if self._client is not None:
+                    self._client.shutdown(
+                            targets='all',
+                            restart=False,
+                            hub=True,
+                            block=False)
+                    hub_shutdown = True
+                    print "parallelflow: requested hub shutdown"
+                else:
+                    if self.started_controller.poll() is not None:
+                        self.started_controller.terminate()
+                        self.started_controller.wait()
+                    print "parallelflow: controller terminated"
+            self.started_controller = None
+
+        if engines > 0 and not hub_shutdown:
+            if qt_available:
+                if self._client is not None:
+                    total = " (among %d total)" % len(self._client.ids)
+                else:
+                    total = ''
+                res = QtGui.QMessageBox.question(
+                        None,
+                        "Shutdown engines",
+                        "%d engines started here%s are still "
+                        "running. Do you want to stop them?" % (
+                                engines,
+                                total),
+                        QtGui.QMessageBox.Yes,
+                        QtGui.QMessageBox.No)
+                res = res != QtGui.QMessageBox.No
+            else:
+                res = True
+            if res:
+                for engine in self.started_engines:
+                    if engine.poll() is not None:
+                        engine.terminate()
+                        engine.wait()
+                print ("parallelflow: %d engines terminated" %
+                       len(self.started_engines))
+            self.started_engines = set()
+
+        if self._client is not None:
+            print "parallelflow: closing client"
+            self._client.close()
+            self._client = None
+
+    def shutdown_cluster(self):
+        """Use the client to request a shutdown of the whole cluster.
+        """
+        client = self.ensure_controller(connect_only=True)
+        if client is None:
+            if qt_available:
+                QtGui.QMessageBox.information(
+                        None,
+                        "Couldn't connect",
+                        "Couldn't connect to a controller. Is the cluster "
+                        "down already?")
+            print ("parallelflow: shutdown_cluster requested, but could "
+                   "not connect to a controller")
+            return
+
+        if qt_available:
+            res = QtGui.QMessageBox.question(
+                    None,
+                    "Shutdown cluster",
+                    "This will use the client connection to request the hub "
+                    "and every engine to shutdown. Continue?",
+                    QtGui.QMessageBox.Ok,
+                    QtGui.QMessageBox.Cancel)
+            if res != QtGui.QMessageBox.Ok:
+                return
+
+        self._client.shutdown(
+                targets='all',
+                restart=False,
+                hub=True,
+                block=False)
+        print "parallelflow: cluster shutdown requested"
+        self._client = None
+
+EngineManager = EngineManager()
diff --git a/vistrails/packages/parallelflow/init.py b/vistrails/packages/parallelflow/init.py
new file mode 100644
index 0000000..3d36dda
--- /dev/null
+++ b/vistrails/packages/parallelflow/init.py
@@ -0,0 +1,36 @@
+from vistrails.core.modules.vistrails_module import Module
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.basic_modules import List, String
+
+from engine_manager import EngineManager
+from map import Map
+
+
+def initialize(*args,**keywords):
+    reg = get_module_registry()
+
+    reg.add_module(Map)
+    reg.add_input_port(Map, 'FunctionPort', (Module, ''))
+    reg.add_input_port(Map, 'InputList', (List, ''))
+    reg.add_input_port(Map, 'InputPort', (List, ''))
+    reg.add_input_port(Map, 'OutputPort', (String, ''))
+    reg.add_output_port(Map, 'Result', (List, ''))
+
+
+def finalize():
+    EngineManager.cleanup()
+
+
+def menu_items():
+    return (
+            ("Start new engine processes",
+             lambda: EngineManager.start_engines()),
+            ("Show information on the cluster",
+             lambda: EngineManager.info()),
+            ("Change profile",
+             lambda: EngineManager.change_profile()),
+            ("Cleanup started processes",
+             lambda: EngineManager.cleanup()),
+            ("Request cluster shutdown",
+             lambda: EngineManager.shutdown_cluster()),
+    )
diff --git a/vistrails/packages/parallelflow/map.py b/vistrails/packages/parallelflow/map.py
new file mode 100644
index 0000000..737f978
--- /dev/null
+++ b/vistrails/packages/parallelflow/map.py
@@ -0,0 +1,581 @@
+import vistrails.core.db.action
+import vistrails.db.versions
+import vistrails.core.modules.module_registry
+import vistrails.core.modules.utils
+from vistrails.core.modules.vistrails_module import Module, ModuleError, \
+    ModuleConnector, InvalidOutput
+from vistrails.core.modules.basic_modules import NotCacheable, Constant
+from vistrails.core.vistrail.pipeline import Pipeline
+from vistrails.core.vistrail.annotation import Annotation
+from vistrails.core.vistrail.group import Group
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.core.db.locator import XMLFileLocator
+from vistrails.core.vistrail.controller import VistrailController
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.core.db.io import serialize, unserialize
+from vistrails.core.log.module_exec import ModuleExec
+from vistrails.core.log.group_exec import GroupExec
+from vistrails.core.log.machine import Machine
+from vistrails.db.domain import IdScope
+
+import copy
+import inspect
+from itertools import izip
+import os
+import re
+import sys
+import tempfile
+
+from IPython.parallel.error import CompositeError
+
+from .api import get_client
+
+
+###############################################################################
+# This function is sent to the engines which execute it
+#
+# It receives the workflow, and the list of targeted output ports
+#
+# It returns the corresponding computed outputs and the execution log
+#
+def execute_wf(wf, output_port):
+    # Save the workflow in a temporary file
+    temp_wf_fd, temp_wf = tempfile.mkstemp()
+
+    try:
+        f = open(temp_wf, 'w')
+        f.write(wf)
+        f.close()
+        os.close(temp_wf_fd)
+
+        # Clean the cache
+        interpreter = get_default_interpreter()
+        interpreter.flush()
+
+        # Load the Pipeline from the temporary file
+        vistrail = Vistrail()
+        locator = XMLFileLocator(temp_wf)
+        workflow = locator.load(Pipeline)
+
+        # Build a Vistrail from this single Pipeline
+        action_list = []
+        for module in workflow.module_list:
+            action_list.append(('add', module))
+        for connection in workflow.connection_list:
+            action_list.append(('add', connection))
+        action = vistrails.core.db.action.create_action(action_list)
+
+        vistrail.add_action(action, 0L)
+        vistrail.update_id_scope()
+        tag = 'parallel flow'
+        vistrail.addTag(tag, action.id)
+
+        # Build a controller and execute
+        controller = VistrailController()
+        controller.set_vistrail(vistrail, None)
+        controller.change_selected_version(vistrail.get_version_number(tag))
+        execution = controller.execute_current_workflow(
+                custom_aliases=None,
+                custom_params=None,
+                extra_info=None,
+                reason='API Pipeline Execution')
+
+        # Build a list of errors
+        errors = []
+        pipeline = vistrail.getPipeline(tag)
+        execution_errors = execution[0][0].errors
+        if execution_errors:
+            for key in execution_errors:
+                module = pipeline.modules[key]
+                msg = '%s: %s' %(module.name, execution_errors[key])
+                errors.append(msg)
+
+        # Get the execution log from the controller
+        try:
+            module_log = controller.log.workflow_execs[0].item_execs[0]
+        except IndexError:
+            errors.append("Module log not found")
+            return dict(errors=errors)
+        else:
+            machine = controller.log.machine_list[0]
+            xml_log = serialize(module_log)
+            machine_log = serialize(machine)
+
+        # Get the output value
+        output = None
+        serializable = None
+        if not execution_errors:
+            executed_module, = execution[0][0].executed
+            executed_module = execution[0][0].objects[executed_module]
+            try:
+                output = executed_module.get_output(output_port)
+            except ModuleError:
+                errors.append("Output port not found: %s" % output_port)
+                return dict(errors=errors)
+            reg = vistrails.core.modules.module_registry.get_module_registry()
+            base_classes = inspect.getmro(type(output))
+            if Module in base_classes:
+                serializable = reg.get_descriptor(type(output)).sigstring
+                output = output.serialize()
+
+        # Return the dictionary, that will be sent back to the client
+        return dict(errors=errors,
+                    output=output,
+                    serializable=serializable,
+                    xml_log=xml_log,
+                    machine_log=machine_log)
+    finally:
+        os.unlink(temp_wf)
+
+###############################################################################
+
+_ansi_code = re.compile(r'%s(?:(?:\[[^A-Za-z]*[A-Za-z])|[^\[])' % '\x1B')
+
+def strip_ansi_codes(s):
+    return _ansi_code.sub('', s)
+
+###############################################################################
+# Map Operator
+#
+class Map(Module):
+    """The Map Module executes a map operator in parallel on IPython engines.
+
+    The FunctionPort should be connected to the 'self' output of the module you
+    want to execute.
+    The InputList is the list of values to be scattered on the engines.
+    """
+    def __init__(self):
+        Module.__init__(self)
+
+    def updateUpstream(self):
+        """A modified version of the updateUpstream method."""
+
+        # everything is the same except that we don't update anything
+        # upstream of FunctionPort
+        for port_name, connector_list in self.inputPorts.iteritems():
+            if port_name == 'FunctionPort':
+                for connector in connector_list:
+                    connector.obj.updateUpstream()
+            else:
+                for connector in connector_list:
+                    connector.obj.update()
+        for port_name, connectorList in copy.copy(self.inputPorts.items()):
+            if port_name != 'FunctionPort':
+                for connector in connectorList:
+                    if connector.obj.get_output(connector.port) is \
+                            InvalidOutput:
+                        self.removeInputConnector(port_name, connector)
+
+    @staticmethod
+    def print_compositeerror(e):
+        sys.stderr.write("Got %d exceptions from IPython engines:\n" %
+                         len(e.elist))
+        for e_type, e_msg, formatted_tb, infos in e.elist:
+            sys.stderr.write("Error from engine %d (%r):\n" % (
+                             infos['engine_id'], infos['engine_uuid']))
+            sys.stderr.write("%s\n" % strip_ansi_codes(formatted_tb))
+
+    @staticmethod
+    def list_exceptions(e):
+        return '\n'.join(
+                "% 3d: %s: %s" % (infos['engine_id'],
+                                  e_type,
+                                  e_msg)
+                for e_type, e_msg, tb, infos in e.elist)
+
+    def updateFunctionPort(self):
+        """
+        Function to be used inside the updateUsptream method of the Map module. It
+        updates the module connected to the FunctionPort port, executing it in
+        parallel.
+        """
+        nameInput = self.getInputFromPort('InputPort')
+        nameOutput = self.getInputFromPort('OutputPort')
+        rawInputList = self.getInputFromPort('InputList')
+
+        # Create inputList to always have iterable elements
+        # to simplify code
+        if len(nameInput) == 1:
+            element_is_iter = False
+            inputList = [[element] for element in rawInputList]
+        else:
+            element_is_iter = True
+            inputList = rawInputList
+
+        workflows = []
+        module = None
+        vtType = None
+
+        # iterating through the connectors
+        for connector in self.inputPorts.get('FunctionPort'):
+            module = connector.obj
+
+            # pipeline
+            original_pipeline = connector.obj.moduleInfo['pipeline']
+
+            # module
+            module_id = connector.obj.moduleInfo['moduleId']
+            vtType = original_pipeline.modules[module_id].vtType
+
+            # serialize the module for each value in the list
+            for i, element in enumerate(inputList):
+                if element_is_iter:
+                    self.element = element
+                else:
+                    self.element = element[0]
+
+                # checking type and setting input in the module
+                self.typeChecking(connector.obj, nameInput, inputList)
+                self.setInputValues(connector.obj, nameInput, element)
+
+                pipeline_db_module = original_pipeline.modules[module_id].do_copy()
+
+                # transforming a subworkflow in a group
+                # TODO: should we also transform inner subworkflows?
+                if pipeline_db_module.is_abstraction():
+                    group = Group(id=pipeline_db_module.id,
+                                  cache=pipeline_db_module.cache,
+                                  location=pipeline_db_module.location,
+                                  functions=pipeline_db_module.functions,
+                                  annotations=pipeline_db_module.annotations)
+
+                    source_port_specs = pipeline_db_module.sourcePorts()
+                    dest_port_specs = pipeline_db_module.destinationPorts()
+                    for source_port_spec in source_port_specs:
+                        group.add_port_spec(source_port_spec)
+                    for dest_port_spec in dest_port_specs:
+                        group.add_port_spec(dest_port_spec)
+
+                    group.pipeline = pipeline_db_module.pipeline
+                    pipeline_db_module = group
+
+                # getting highest id between functions to guarantee unique ids
+                # TODO: can get current IdScope here?
+                if pipeline_db_module.functions:
+                    high_id = max(function.db_id
+                                  for function in pipeline_db_module.functions)
+                else:
+                    high_id = 0
+
+                # adding function and parameter to module in pipeline
+                # TODO: 'pos' should not be always 0 here
+                id_scope = IdScope(beginId=long(high_id+1))
+                for elementValue, inputPort in izip(element, nameInput):
+
+                    p_spec = pipeline_db_module.get_port_spec(inputPort, 'input')
+                    descrs = p_spec.descriptors()
+                    if len(descrs) != 1:
+                        raise ModuleError(
+                                self,
+                                "Tuple input ports are not supported")
+                    if not issubclass(descrs[0].module, Constant):
+                        raise ModuleError(
+                                self,
+                                "Module inputs should be Constant types")
+                    type = p_spec.sigstring[1:-1]
+
+                    mod_function = ModuleFunction(id=id_scope.getNewId(ModuleFunction.vtType),
+                                                  pos=0,
+                                                  name=inputPort)
+                    mod_param = ModuleParam(id=0L,
+                                            pos=0,
+                                            type=type,
+                                            val=elementValue)
+
+                    mod_function.add_parameter(mod_param)
+                    pipeline_db_module.add_function(mod_function)
+
+                # serializing module
+                wf = self.serialize_module(pipeline_db_module)
+                workflows.append(wf)
+
+            # getting first connector, ignoring the rest
+            break
+
+        # IPython stuff
+        try:
+            rc = get_client()
+        except Exception, error:
+            raise ModuleError(self, "Exception while loading IPython: "
+                              "%s" % error)
+        if rc is None:
+            raise ModuleError(self, "Couldn't get an IPython connection")
+        engines = rc.ids
+        if not engines:
+            raise ModuleError(
+                    self,
+                    "Exception while loading IPython: No IPython engines "
+                    "detected!")
+
+        # initializes each engine
+        # importing modules and initializing the VisTrails application
+        # in the engines *only* in the first execution on this engine
+        uninitialized = []
+        for eng in engines:
+            try:
+                rc[eng]['init']
+            except:
+                uninitialized.append(eng)
+        if uninitialized:
+            init_view = rc[uninitialized]
+            with init_view.sync_imports():
+                import tempfile
+                import inspect
+
+                # VisTrails API
+                import vistrails
+                import vistrails.core
+                import vistrails.core.db.action
+                import vistrails.core.application
+                import vistrails.core.modules.module_registry
+                from vistrails.core.db.io import serialize
+                from vistrails.core.vistrail.vistrail import Vistrail
+                from vistrails.core.vistrail.pipeline import Pipeline
+                from vistrails.core.db.locator import XMLFileLocator
+                from vistrails.core.vistrail.controller import VistrailController
+                from vistrails.core.interpreter.default import get_default_interpreter
+
+            # initializing a VisTrails application
+            try:
+                init_view.execute(
+                        'app = vistrails.core.application.init('
+                        '        {"spawned": True},'
+                        '        args=[])',
+                        block=True)
+            except CompositeError, e:
+                self.print_compositeerror(e)
+                raise ModuleError(self, "Error initializing application on "
+                                  "IPython engines:\n"
+                                  "%s" % self.list_exceptions(e))
+
+            init_view['init'] = True
+
+        # setting computing color
+        module.logging.set_computing(module)
+
+        # executing function in engines
+        # each map returns a dictionary
+        try:
+            ldview = rc.load_balanced_view()
+            map_result = ldview.map_sync(execute_wf, workflows, [nameOutput]*len(workflows))
+        except CompositeError, e:
+            self.print_compositeerror(e)
+            raise ModuleError(self, "Error from IPython engines:\n"
+                              "%s" % self.list_exceptions(e))
+
+        # verifying errors
+        errors = []
+        for engine in range(len(map_result)):
+            if map_result[engine]['errors']:
+                msg = "ModuleError in engine %d: '%s'" % (
+                        engine,
+                        ', '.join(map_result[engine]['errors']))
+                errors.append(msg)
+
+        if errors:
+            raise ModuleError(self, '\n'.join(errors))
+
+        # setting success color
+        module.logging.signalSuccess(module)
+
+        import vistrails.core.modules.module_registry
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        self.result = []
+        for map_execution in map_result:
+            serializable = map_execution['serializable']
+            output = None
+            if not serializable:
+                output = map_execution['output']
+            else:
+                d_tuple = vistrails.core.modules.utils.parse_descriptor_string(serializable)
+                d = reg.get_descriptor_by_name(*d_tuple)
+                module_klass = d.module
+                output = module_klass().deserialize(map_execution['output'])
+            self.result.append(output)
+
+        # including execution logs
+        for engine in range(len(map_result)):
+            log = map_result[engine]['xml_log']
+            exec_ = None
+            if (vtType == 'abstraction') or (vtType == 'group'):
+                exec_ = unserialize(log, GroupExec)
+            elif (vtType == 'module'):
+                exec_ = unserialize(log, ModuleExec)
+            else:
+                # something is wrong...
+                continue
+
+            # assigning new ids to existing annotations
+            exec_annotations = exec_.annotations
+            for i in range(len(exec_annotations)):
+                exec_annotations[i].id = self.logging.log.log.id_scope.getNewId(Annotation.vtType)
+
+            parallel_annotation = Annotation(key='parallel_execution', value=True)
+            parallel_annotation.id = self.logging.log.log.id_scope.getNewId(Annotation.vtType)
+            annotations = [parallel_annotation] + exec_annotations
+            exec_.annotations = annotations
+
+            # before adding the execution log, we need to get the machine information
+            machine = unserialize(map_result[engine]['machine_log'], Machine)
+            machine.id = self.logging.log.log.id_scope.getNewId(Machine.vtType) #assigning new id
+            self.logging.log.log.add_machine(machine)
+
+            # recursively add machine information to execution items
+            def add_machine_recursive(exec_):
+                for i in range(len(exec_.item_execs)):
+                    if hasattr(exec_.item_execs[i], 'machine_id'):
+                        exec_.item_execs[i].machine_id = machine.id
+                        vt_type = exec_.item_execs[i].vtType
+                        if (vt_type == 'abstraction') or (vt_type == 'group'):
+                            add_machine_recursive(exec_.item_execs[i])
+
+            exec_.machine_id = machine.id
+            if (vtType == 'abstraction') or (vtType == 'group'):
+                add_machine_recursive(exec_)
+
+            self.logging.add_exec(exec_)
+
+
+    def serialize_module(self, module):
+        """
+        Serializes a module to be executed in parallel.
+        """
+
+        def process_group(group):
+            group.pipeline.id = None
+            for module in group.pipeline.module_list:
+                if module.is_group():
+                    process_group(module)
+
+        pipeline = Pipeline(version=vistrails.db.versions.currentVersion)
+
+        if module.is_group():
+            process_group(module)
+
+        module = module.do_copy()
+        pipeline.add_module(module)
+
+        return serialize(pipeline)
+
+    def setInputValues(self, module, inputPorts, elementList):
+        """
+        Function used to set a value inside 'module', given the input port(s).
+        """
+        for element, inputPort in izip(elementList, inputPorts):
+            ## Cleaning the previous connector...
+            if inputPort in module.inputPorts:
+                del module.inputPorts[inputPort]
+            new_connector = ModuleConnector(create_constant(element), 'value')
+            module.set_input_port(inputPort, new_connector)
+
+    def typeChecking(self, module, inputPorts, inputList):
+        """
+        Function used to check if the types of the input list element and of the
+        inputPort of 'module' match.
+        """
+        for elementList in inputList:
+            if len(elementList) != len(inputPorts):
+                raise ModuleError(self,
+                                  'The number of input values and input ports '
+                                  'are not the same.')
+            for element, inputPort in izip(elementList, inputPorts):
+                p_modules = module.moduleInfo['pipeline'].modules
+                p_module = p_modules[module.moduleInfo['moduleId']]
+                port_spec = p_module.get_port_spec(inputPort, 'input')
+                v_module = get_module(element, port_spec.signature)
+                if v_module is not None:
+                    if not self.compare(port_spec, v_module, inputPort):
+                        raise ModuleError(self,
+                                          'The type of a list element does '
+                                          'not match with the type of the '
+                                          'port %s.' % inputPort)
+
+                    del v_module
+                else:
+                    break
+
+    def createSignature(self, v_module):
+        """
+    `   Function used to create a signature, given v_module, for a port spec.
+        """
+        if isinstance(v_module, tuple):
+            v_module_class = []
+            for module_ in v_module:
+                v_module_class.append(self.createSignature(module_))
+            return v_module_class
+        else:
+            return v_module
+
+    def compare(self, port_spec, v_module, port):
+        """
+        Function used to compare two port specs.
+        """
+        port_spec1 = port_spec
+
+        from vistrails.core.modules.module_registry import get_module_registry
+        reg = get_module_registry()
+
+        from vistrails.core.vistrail.port_spec import PortSpec
+        v_module = self.createSignature(v_module)
+        port_spec2 = PortSpec(**{'signature': v_module})
+        matched = reg.are_specs_matched(port_spec2, port_spec1)
+
+        return matched
+
+    def compute(self):
+        """The compute method for Map."""
+
+        self.result = None
+        self.updateFunctionPort()
+
+        self.setResult('Result', self.result)
+
+###############################################################################
+
+class NewConstant(Constant):
+    """
+    A new Constant module to be used inside the Map module.
+    """
+    def setValue(self, v):
+        self.setResult("value", v)
+        self.upToDate = True
+
+def create_constant(value):
+    """
+    Creates a NewConstant module, to be used for the ModuleConnector.
+    """
+    constant = NewConstant()
+    constant.setValue(value)
+    return constant
+
+def get_module(value, signature):
+    """
+    Creates a module for value, in order to do the type checking.
+    """
+
+    from vistrails.core.modules.basic_modules import Boolean, String, Integer, Float, List
+
+    if isinstance(value, Constant):
+        return type(value)
+    elif isinstance(value, bool):
+        return Boolean
+    elif isinstance(value, str):
+        return String
+    elif isinstance(value, int):
+        return Integer
+    elif isinstance(value, float):
+        return Float
+    elif isinstance(value, list):
+        return List
+    elif isinstance(value, tuple):
+        v_modules = ()
+        for element in xrange(len(value)):
+            v_modules += (get_module(value[element], signature[element]))
+        return v_modules
+    else:
+        from vistrails.core import debug
+        debug.warning("Could not identify the type of the list element.")
+        debug.warning("Type checking is not going to be done inside Map module.")
+        return None
diff --git a/vistrails/packages/persistence/__init__.py b/vistrails/packages/persistence/__init__.py
new file mode 100644
index 0000000..3ac93c6
--- /dev/null
+++ b/vistrails/packages/persistence/__init__.py
@@ -0,0 +1,44 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.configuration import ConfigurationObject
+
+from identifiers import *
+
+configuration = ConfigurationObject(global_db=(None, str), 
+                                    local_db=(None, str),
+                                    git_bin=(None, str),
+                                    search_dbs=(None, str),
+                                    compress_by_default=False,
+                                    debug=False)
diff --git a/vistrails/packages/persistence/compute_hash.py b/vistrails/packages/persistence/compute_hash.py
new file mode 100644
index 0000000..fe2c8b5
--- /dev/null
+++ b/vistrails/packages/persistence/compute_hash.py
@@ -0,0 +1,82 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import os
+try:
+    import hashlib
+    sha_hash = hashlib.sha1
+except ImportError:
+    import sha
+    sha_hash = sha.new
+
+def compute_hash(persistent_path, is_dir=None):
+    def hash_file(filename, hasher):
+        f = open(filename, 'rb')
+        while True:
+            block = f.read(8192)
+            if not block:
+                break
+            hasher.update(block)
+
+    sha_hasher = sha_hash()
+    if is_dir is None:
+        is_dir = os.path.isdir(persistent_path)
+    if is_dir:
+        # get all of the files we need to hash
+        fnames = []
+        base_dir = persistent_path
+        dir_stack = ['.']
+        while dir_stack:
+            dir = dir_stack.pop()
+            for base in sorted(os.listdir(os.path.join(base_dir, dir))):
+                name = os.path.join(dir, base)
+                if os.path.isdir(os.path.join(base_dir, name)):
+                    dir_stack.append(name)
+                else:
+                    fnames.append(name)
+
+        # hash filenames and files to ensure directory structure
+        # is accounted for
+        for fname in fnames:
+            # print fname
+            sha_hasher.update(fname)
+            hash_file(os.path.join(base_dir, fname), sha_hasher)
+    else:
+        hash_file(persistent_path, sha_hasher)
+    return sha_hasher.hexdigest()
+
+if __name__ == '__main__':
+    import sys
+    print compute_hash(sys.argv[1])
diff --git a/vistrails/packages/persistence/db_utils.py b/vistrails/packages/persistence/db_utils.py
new file mode 100644
index 0000000..c564394
--- /dev/null
+++ b/vistrails/packages/persistence/db_utils.py
@@ -0,0 +1,171 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import os
+import sqlite3
+
+class DatabaseAccessSingleton(object):
+    def __new__(cls, *args, **kw):
+        if DatabaseAccess._instance is None:
+            obj = DatabaseAccess(*args, **kw)
+            DatabaseAccess._instance = obj
+        return DatabaseAccess._instance
+
+class DatabaseAccess(object):
+    _instance = None
+    def __init__(self, db_file):
+        #print 'initing DatabaseAccess'
+        self.db_file = db_file
+        run_schema = False
+        if not os.path.exists(db_file):
+            run_schema = True
+        self.conn = sqlite3.connect(db_file)
+        if run_schema:
+            #print 'running schema'
+            #print 'schema file:', os.path.join(os.path.dirname(
+            #            os.path.abspath(__file__)), 'schema.sql')
+            cur = self.conn.cursor()
+            self.run_sql_file(cur, os.path.join(os.path.dirname(
+                        os.path.abspath(__file__)), 'schema.sql'))
+        self.ensure_deleted_column_exist()
+        self.model = None
+
+    def ensure_deleted_column_exist(self):
+        """ Add a "deleted" column if not already exist
+            This was added in version 0.2.2 without bumping the schema
+        """
+        cur = self.conn.cursor()
+        if 'deleted' not in [i[1] for i in cur.execute(
+                    "PRAGMA table_info(file);").fetchall()]:
+            cur.execute("ALTER TABLE file ADD COLUMN "
+                        "deleted bool NOT NULL DEFAULT False;")
+            self.conn.commit()
+
+    def set_model(self, model):
+        self.model = model
+
+    def run_sql_file(self, cur, sql_file):
+        cmd = ''
+        for line in open(sql_file):
+            cmd += line
+            if line.strip().endswith(';'):
+                cur.execute(cmd.strip())
+                cmd = ''
+
+    def finalize(self):
+        self.conn.close()
+
+    def write_database(self, value_dict):
+#         db_file = '/vistrails/managed/files.db'
+#         self.conn = sqlite3.connect(db_file)
+
+        cur = self.conn.cursor()
+        cols, vals = zip(*value_dict.iteritems())
+        col_str = ', '.join(cols)
+        # print "executing sql:", "INSERT INTO file(%s) VALUES (%s);" % \
+        #                 (col_str, ','.join(['?'] * len(vals)))
+        # print "  ", vals
+        cur.execute("INSERT INTO file(%s) VALUES (%s);" % \
+                        (col_str, ','.join(['?'] * len(vals))),
+                    vals)
+        self.conn.commit()
+
+        if self.model:
+            self.model.add_data(value_dict)
+
+    #         cur.execute("SELECT id, name, tags, user, date_created, "
+    #                     "date_modified, content_hash, version, signature "
+    #                     "FROM file;")
+
+    def read_database(self, cols=None, where_dict=None):
+        # self.conn = sqlite3.connect(db_file)
+        cur = self.conn.cursor()
+        if cols is None:
+            cols = ["id", "name", "tags", "user", "date_created",
+                    "date_modified", "content_hash", "version", "signature"]
+        col_str = ', '.join(cols)
+        if where_dict is None or len(where_dict) <= 0:
+            cur.execute("SELECT " + ", ".join(cols) +
+                        " FROM file WHERE deleted != 'True';")
+        else:
+            where_cols, where_vals = zip(*where_dict.iteritems())
+            where_str = '=? AND '.join(where_cols) + '=?'
+            cur.execute("SELECT " + ", ".join(cols) + " FROM file WHERE "
+                        "%s AND deleted != 'True';" % where_str, where_vals)
+        return cur.fetchall()
+
+    def search_by_signature(self, signature):
+        cur = self.conn.cursor()
+        cur.execute("SELECT id, version, name FROM file WHERE signature=? "
+                    "ORDER BY date_created DESC LIMIT 1;", (signature,))
+        res = cur.fetchone()
+        if res:
+            return res
+        return None
+
+    def get_signature(self, id, version=None):
+        cur = self.conn.cursor()
+        cur.execute("SELECT signature FROM file where id=? and version=?;", 
+                    (id, version))
+        res = cur.fetchone()
+        if res:
+            return res[0]
+        return None
+
+    def ref_exists(self, id, version=None):
+        cur = self.conn.cursor()
+        if version is None:
+            cur.execute("SELECT id, version, name, signature FROM file "
+                        "WHERE id=?;", (id,))
+        else:
+            cur.execute("SELECT id, version, name, signature FROM file "
+                        "WHERE id=? AND version=?;", (id, version))
+        res = cur.fetchone()
+        return res is not None
+
+    def delete_from_database(self, where_dict=None):
+        cur = self.conn.cursor()
+        if where_dict is None or len(where_dict) <= 0:
+            cur.execute("UPDATE file SET deleted='True';")
+        else:
+            where_cols, where_vals = zip(*where_dict.iteritems())
+            where_str = '=? AND '.join(where_cols) + '=?'
+            cur.execute("UPDATE file SET deleted='True' WHERE %s;" %
+                           where_str, where_vals)
+        self.conn.commit()
+        if self.model:
+            self.model.remove_data(where_dict)
+        # return cur.fetchall()
+                     
diff --git a/vistrails/packages/persistence/find_files.py b/vistrails/packages/persistence/find_files.py
new file mode 100644
index 0000000..3acc6c8
--- /dev/null
+++ b/vistrails/packages/persistence/find_files.py
@@ -0,0 +1,113 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import shutil
+import sys
+
+vistrails_src = None
+if not vistrails_src:
+    vistrails_src = os.path.dirname(
+        os.path.dirname(os.path.dirname(sys.path[0])))
+if vistrails_src not in sys.path:
+    sys.path.append(vistrails_src)
+
+import vistrails.db.services.io
+
+from identifiers import identifier as persistence_pkg, \
+    old_identifiers as persistence_old_ids
+persistence_pkg_ids = set(persistence_old_ids)
+persistence_pkg_ids.add(persistence_pkg)
+    
+def find_files(filename, version=None):
+    save_bundle, save_dir = \
+        vistrails.db.services.io.open_vistrail_bundle_from_zip_xml(filename)
+    vistrail = save_bundle.vistrail
+    # FIXME hack for now, should change in the future
+    log_fname = vistrail.db_log_filename
+    log = vistrails.db.services.io.open_log_from_xml(log_fname, True)
+
+    if version:
+        if isinstance(version, basestring):
+            # need to lookup version number
+            if version in vistrail.db_tags_name_index:
+                version = vistrail.db_tags_name_index[version].db_id
+
+    persistent_module_ids = set()
+    for action in vistrail.db_actions:
+        for op in action.db_operations:
+            if op.db_what == 'module' and (op.vtType == 'add' or 
+                                           op.vtType == 'change'):
+                module = op.db_data
+                if module.db_package in persistence_pkg_ids:
+                    persistent_module_ids.add(module.db_id)
+                
+    filenames = {}
+    tags = {}
+    for workflow_exec in log.db_workflow_execs:
+        cur_version = workflow_exec.db_parent_version
+        if version is not None and cur_version != version:
+            continue
+        if cur_version in vistrail.db_tags_id_index:
+            tags[cur_version] = vistrail.db_tags_id_index[cur_version].db_name
+        
+        for module_exec in workflow_exec.db_item_execs:
+            if module_exec.db_module_id in persistent_module_ids:
+                for annotation in module_exec.db_annotations:
+                    if annotation.db_key == 'signature':
+                        if cur_version not in filenames:
+                            filenames[cur_version] = set()
+                        val = annotation.db_value.upper()
+                        filenames[cur_version].add(os.path.join(val[:2], 
+                                                                val[2:]))
+    shutil.rmtree(save_dir)
+    return filenames, tags
+                        
+if __name__ == '__main__':
+    fname = sys.argv[1]
+    version = sys.argv[2] if len(sys.argv) > 2 else None
+    if version:
+        try:
+            version = int(version)
+        except ValueError:
+            pass
+    all_files, tags = find_files(fname, version)
+    for version, filenames in all_files.iteritems():
+        if version in tags:
+            print str(version) + ' (' + tags[version] + '):'
+        else:
+            print str(version) + ':'
+        for fname in filenames:
+            print ' ', fname
+                    
diff --git a/vistrails/packages/persistence/find_workflows.py b/vistrails/packages/persistence/find_workflows.py
new file mode 100644
index 0000000..80140e9
--- /dev/null
+++ b/vistrails/packages/persistence/find_workflows.py
@@ -0,0 +1,132 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import shutil
+import sys
+
+from compute_hash import compute_hash
+from identifiers import identifier as persistence_pkg, \
+    old_identifiers as persistence_old_ids
+persistence_pkg_ids = set(persistence_old_ids)
+persistence_pkg_ids.add(persistence_pkg)
+
+vistrails_src = None
+if not vistrails_src:
+    vistrails_src = os.path.dirname(
+        os.path.dirname(os.path.dirname(sys.path[0])))
+if vistrails_src not in sys.path:
+    sys.path.append(vistrails_src)
+    
+import vistrails.db.services.io    
+
+def find_workflows(path_name, vistrail_dir):
+    file_hash = compute_hash(path_name)
+    vt_files = []
+    dir_stack = [vistrail_dir]
+    while dir_stack:
+        dir = dir_stack.pop()
+        for base in os.listdir(dir):
+            name = os.path.join(dir, base)
+            if os.path.isdir(name):
+                dir_stack.append(name)
+            elif name.endswith('.vt'):
+                vt_files.append(name)
+
+    vt_finds = {}
+    for filename in vt_files:
+        save_bundle, save_dir = \
+            vistrails.db.services.io.open_vistrail_bundle_from_zip_xml(filename)
+        vistrail = save_bundle.vistrail
+        log_fname = vistrail.db_log_filename
+        log = vistrails.db.services.io.open_log_from_xml(log_fname, True)
+        
+        persistent_module_ids = set()
+        for action in vistrail.db_actions:
+            for op in action.db_operations:
+                if op.db_what == 'module' and (op.vtType == 'add' or 
+                                               op.vtType == 'change'):
+                    module = op.db_data
+                    if module.db_package in persistence_pkg_ids:
+                        persistent_module_ids.add(module.db_id)
+
+        execs = {}
+        tags = {}
+        for workflow_exec in log.db_workflow_execs:
+            cur_version = workflow_exec.db_parent_version
+            if cur_version in vistrail.db_tags_id_index:
+                tags[cur_version] = \
+                    vistrail.db_tags_id_index[cur_version].db_name
+
+            for module_exec in workflow_exec.db_item_execs:
+                if module_exec.db_module_id in persistent_module_ids:
+                    found = False
+                    for annotation in module_exec.db_annotations:
+                        if annotation.db_key == 'sha_hash':
+                            if annotation.db_value == file_hash:
+                                # found the file/dir
+                                # do something
+                                found = True
+                        if annotation.db_key == 'signature':
+                            val = annotation.db_value.upper()
+                            cache_fname = os.path.join(val[:2], val[2:])
+                    if found:
+                        if cur_version not in execs:
+                            execs[cur_version] = []
+                        execs[cur_version].append((workflow_exec.db_ts_start,
+                                                   cache_fname))
+
+        if len(execs) > 0:
+            vt_finds[filename] = (execs, tags)
+
+        shutil.rmtree(save_dir)
+
+    return vt_finds
+
+if __name__ == '__main__':
+    path_name = sys.argv[1]
+    vistrail_dir = sys.argv[2]
+    vt_finds = find_workflows(path_name, vistrail_dir)
+
+    for fname, (execs, tags) in vt_finds.iteritems():
+        print fname + ':'
+        for version, exec_list in execs.iteritems():
+            for (exec_time, cache_fname) in exec_list:
+                if version in tags:
+                    print ' ', str(version) + ' (' + tags[version] + '):', \
+                        exec_time
+                    print '   ', cache_fname
+                else:
+                    print ' ', str(version) + ':', exec_time
+                    print '   ', cache_fname
diff --git a/vistrails/packages/persistence/identifiers.py b/vistrails/packages/persistence/identifiers.py
new file mode 100644
index 0000000..f108807
--- /dev/null
+++ b/vistrails/packages/persistence/identifiers.py
@@ -0,0 +1,40 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+identifier = 'org.vistrails.vistrails.persistence'
+version = '0.3.2'
+name = 'Persistence'
+old_identifiers = ['edu.utah.sci.vistrails.persistence',
+                   'edu.utah.sci.vistrails.persistence.exp']
diff --git a/vistrails/packages/persistence/init.py b/vistrails/packages/persistence/init.py
new file mode 100644
index 0000000..d02add9
--- /dev/null
+++ b/vistrails/packages/persistence/init.py
@@ -0,0 +1,682 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import copy
+import os
+import shutil
+import tempfile
+import uuid
+
+import vistrails.core.debug
+from vistrails.core.configuration import ConfigurationObject
+from vistrails.core.cache.hasher import Hasher
+from vistrails.core.modules.basic_modules import Path, File, Directory, Boolean, \
+    String, Constant
+from vistrails.core.modules.module_registry import get_module_registry, MissingModule, \
+    MissingPackageVersion, MissingModuleVersion
+from vistrails.core.modules.vistrails_module import Module, ModuleError, NotCacheable
+from vistrails.core.system import current_dot_vistrails, execute_cmdline2, \
+    execute_piped_cmdlines, systemType, \
+    current_user, current_time, get_executable_path
+from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler, UpgradeWorkflowError
+from compute_hash import compute_hash
+from widgets import PersistentRefInlineWidget, \
+    PersistentInputFileConfiguration, PersistentOutputFileConfiguration, \
+    PersistentInputDirConfiguration, PersistentOutputDirConfiguration, \
+    PersistentRefModel, PersistentConfiguration
+from db_utils import DatabaseAccessSingleton
+import repo
+
+try:
+    import hashlib
+    sha_hash = hashlib.sha1
+except ImportError:
+    import sha
+    sha_hash = sha.new
+
+
+global_db = None
+local_db = None
+search_dbs = None
+db_access = None
+git_bin = "@executable_path/git"
+tar_bin = "@executable_path/tar"
+compress_by_default = False
+debug = False
+
+def debug_print(*args):
+    global debug
+    if debug:
+        for arg in args:
+            print arg,
+        print ''
+
+class PersistentRef(Constant):
+
+    # ref types
+    ALWAYS_NEW = 0
+    CREATE = 1
+    EXISTING = 2
+    
+    def __init__(self):
+        Constant.__init__(self)
+        self.default_value = self
+        
+        self.type = PersistentRef.CREATE
+        self.id = None
+        self.version = None
+        self.local_path = None
+        self.local_read = False
+        self.local_writeback = False
+        self.versioned = False
+        self.name = ''
+        self.tags = ''
+
+    # @staticmethod
+    # def get_widget_class():
+    #     return PersistentRefInlineWidget
+
+    @staticmethod
+    def translate_to_python(x):
+        try:
+            res = PersistentRef()
+            s_tuple = eval(x)
+            (res.type, res.id, res.version, res.local_path, res.local_read,
+             res.local_writeback, res.versioned, res.name, res.tags) = s_tuple
+        except:
+            return None
+#         result.settings = dict(zip(sorted(default_settings.iterkeys()),
+#                                    s_tuple))
+#         print 'from_string:', result.settings
+        return res
+
+    @staticmethod
+    def translate_to_string(x):
+        rep = str((x.type, x.id, x.version, x.local_path,
+                   x.local_read, x.local_writeback, x.versioned,
+                   x.name, x.tags))
+        # rep = str(tuple(y[1] for y in sorted(x.settings.iteritems())))
+        # print 'to_string:', rep
+        return rep
+        
+    @staticmethod
+    def validate(x):
+        return isinstance(x, PersistentRef)
+
+    _input_ports = [('value', '(PersistentRef)')]
+    _output_ports = [('value', '(PersistentRef)')]
+
+class PersistentPath(Module):
+    def __init__(self):
+        Module.__init__(self)
+
+    # FIXME find a way to do this through dulwich and move to repo.py
+    @staticmethod
+    def git_remove_path(path):
+        global git_bin, local_db
+        # only recommended for intermediate files!
+        inner_cmd = [git_bin, "rm", "-r", "--cached", "--ignore-unmatch",path]
+        inner_cmd_str = ' '.join(inner_cmd)
+        cmd_line = PersistentPath.git_command() + \
+            ['filter-branch', '--index-filter', inner_cmd_str, 'HEAD']
+        debug_print('executing', cmd_line)
+        result, output, errs = execute_cmdline2(cmd_line)
+        debug_print('result:', result)
+        debug_print('stdout:', type(output), output)
+        debug_print('stderr:', type(errs), errs)
+        debug_print('***')
+        shutil.rmtree(os.path.join(local_db, ".git", "refs", "original"))
+        cmd_line = PersistentPath.git_command() + ["reflog", "expire","--all"]
+        debug_print('executing', cmd_line)
+        result, output, errs = execute_cmdline2(cmd_line)
+        debug_print('result:', result)
+        debug_print('stdout:', type(output), output)
+        debug_print('stderr:', type(errs), errs)
+        debug_print('***')
+        cmd_line = PersistentPath.git_command() + ["gc", "--aggressive",
+                                                   "--prune"]
+        debug_print('executing', cmd_line)
+        result, output, errs = execute_cmdline2(cmd_line)
+        debug_print('result:', result)
+        debug_print('stdout:', type(output), output)
+        debug_print('stderr:', type(errs), errs)
+        debug_print('***')
+
+    @staticmethod
+    def git_command():
+        if systemType in ['Windows', 'Microsoft']:
+            return ['cd', '/D', local_db, '&&', git_bin]
+        else:
+            return ['cd', local_db, '&&', git_bin]
+
+    def get_path_type(self, path):
+        if os.path.isdir(path):
+            return 'tree'
+        elif os.path.isfile(path):
+            return 'blob'            
+
+    def copypath(self, src, dst, path_type=None):
+        if path_type is None:
+            path_type = self.get_path_type(src)
+
+        if path_type == 'blob':
+            shutil.copyfile(src, dst)
+        elif path_type == 'tree':
+            if os.path.exists(dst):
+                shutil.rmtree(dst)
+            shutil.copytree(src, dst)
+        else:
+            raise ModuleError(self, "Unknown path type '%s'" % path_type)
+
+    def set_result(self, path):
+        persistent_path = Path()
+        persistent_path.name = path
+        persistent_path.setResult('value', self)
+        persistent_path.upToDate = True
+        self.setResult("value", persistent_path)
+
+    def updateUpstream(self, is_input=None, path_type=None):
+        global db_access
+
+        if is_input is None:
+            if not self.hasInputFromPort('value'):
+                is_input = True
+            else:
+                # FIXME: check if the signature is the signature of
+                # the value if so we know that it's an input...
+                is_input = False
+
+        self.persistent_ref = None
+        self.persistent_path = None
+        if is_input:
+            return super(PersistentPath, self).updateUpstream()
+
+        # can check updateUpstream
+        if not hasattr(self, 'signature'):
+            raise ModuleError(self, 'Module has no signature')
+
+        ref_exists = False
+        if not self.hasInputFromPort('ref'):
+            # create new reference with no name or tags
+            ref = PersistentRef()
+            ref.signature = self.signature
+        else:
+            # update single port
+            self.updateUpstreamPort('ref')
+            ref = self.getInputFromPort('ref')
+            if db_access.ref_exists(ref.id, ref.version):
+                ref_exists = True
+                if ref.version is None:
+                    ref.version = \
+                        repo.get_current_repo().get_latest_version(ref.id)
+                signature = db_access.get_signature(ref.id, ref.version)
+                if signature == self.signature:
+                    # don't need to create a new version
+                    self.persistent_ref = ref
+
+        # Note that ref_exists is True if the reference is a fixed
+        # reference; if it was assigned a new uuid, we can still
+        # reuse a reference with the same signature
+        if not ref_exists:
+            signature = self.signature
+            debug_print('searching for signature', signature)
+            sig_ref = db_access.search_by_signature(signature)
+            debug_print('sig_ref:', sig_ref)
+            if sig_ref:
+                debug_print('setting persistent_ref')
+                ref.id, ref.version, ref.name = sig_ref
+                self.persistent_ref = ref
+                #             else:
+                #                 ref.id = uuid.uuid1()
+
+            # copy as normal
+            # don't copy if equal
+
+        # FIXME also need to check that the file actually exists here!
+        if self.persistent_ref is not None:
+            _, suffix = os.path.splitext(self.persistent_ref.name)
+            self.persistent_path = repo.get_current_repo().get_path(
+                self.persistent_ref.id,
+                self.persistent_ref.version,
+                out_suffix=suffix)
+            debug_print("FOUND persistent path")
+            debug_print(self.persistent_path)
+            debug_print(self.persistent_ref.local_path)
+
+        if self.persistent_ref is None or self.persistent_path is None:
+            debug_print("NOT FOUND persistent path")
+            super(PersistentPath, self).updateUpstream()
+
+    def compute(self, is_input=None, path_type=None):
+        global db_access
+        if not self.hasInputFromPort('value') and \
+                not self.hasInputFromPort('ref'):
+            raise ModuleError(self, "Need to specify path or reference")
+
+        if self.persistent_path is not None:
+            debug_print('using persistent path')
+            ref = self.persistent_ref
+            path = self.persistent_path
+        elif self.hasInputFromPort('ref'):
+            ref = self.getInputFromPort('ref')
+            if ref.id is None:
+                ref.id = str(uuid.uuid1())
+        else:
+            # create a new reference
+            ref = PersistentRef()
+            ref.id = str(uuid.uuid1())
+
+        if self.hasInputFromPort('localPath'):
+            ref.local_path = self.getInputFromPort('localPath').name
+            if self.hasInputFromPort('readLocal'):
+                ref.local_read = self.getInputFromPort('readLocal')
+            if self.hasInputFromPort('writeLocal'):
+                ref.local_writeback = self.getInputFromPort('writeLocal')
+
+        if is_input is None:
+            is_input = False
+            if not self.hasInputFromPort('value'):
+                is_input = True
+            else:
+                if ref.local_path and ref.local_read:
+                    debug_print('found local path with local read')
+                    is_input = True
+                # FIXME: check if the signature is the signature of
+                # the value if so we know that it's an input...
+
+        # if just reference, pull path from repository (get latest
+        # version unless specified as specific version)
+        if self.persistent_path is None and not self.hasInputFromPort('value') \
+                and is_input and not (ref.local_path and ref.local_read):
+            _, suffix = os.path.splitext(ref.name)
+            if not db_access.ref_exists(ref.id, ref.version):
+                raise ModuleError(self, "Persistent entity '%s' does not "
+                                  "exist in the local repository." % ref.id)
+            if ref.version is None:
+                ref.version = repo.get_current_repo().get_latest_version(ref.id)
+
+            # get specific ref.uuid, ref.version combo
+            path = repo.get_current_repo().get_path(ref.id, ref.version, 
+                                                    out_suffix=suffix)
+            
+        elif self.persistent_path is None:
+            # copy path to persistent directory with uuid as name
+            if is_input and ref.local_path and ref.local_read:
+                debug_print('using local_path')
+                path = ref.local_path
+            else:
+                path = self.getInputFromPort('value').name
+            # this is a static method so we need to add module ourselves
+            try:
+                new_hash = repo.get_current_repo().compute_hash(path)
+            except ModuleError, e:
+                e.module = self
+                raise e
+            rep_path = os.path.join(local_db, ref.id)
+            do_update = True
+            if os.path.exists(rep_path):
+                if os.path.isdir(rep_path):
+                    actual_type = 'tree'
+                elif os.path.isfile(rep_path):
+                    actual_type = 'blob'
+                else:
+                    raise ModuleError(self, "Path is something not a file or "
+                                      "a directory")
+                if path_type is None:
+                    path_type = actual_type
+                else:
+                    if path_type != actual_type:
+                        def show_type(t):
+                            if t == 'tree': return "directory"
+                            elif t == 'blob': return "file"
+                            else: return '"%s"' % t
+                        raise ModuleError(self, "Path is not a %s but a %s" % (
+                                          show_type(path_type),
+                                          show_type(actual_type)))
+
+                old_hash = repo.get_current_repo().get_hash(ref.id, 
+                                                            path_type=path_type)
+                debug_print('old_hash:', old_hash)
+                debug_print('new_hash:', new_hash)
+                if old_hash == new_hash:
+                    do_update = False
+                    
+            if do_update:
+                debug_print('doing update')
+
+                if path_type == 'tree':
+                    if (not os.path.exists(path) or
+                            not os.listdir(path)):
+                        raise ModuleError(self, "This directory is empty")
+
+                self.copypath(path, os.path.join(local_db, ref.id))
+
+                # commit (and add to) repository
+                # get commit id as version id
+                # persist object-hash, commit-version to repository
+                version = repo.get_current_repo().add_commit(ref.id)
+                ref.version = version
+
+                # write object-hash, commit-version to provenance
+                if is_input:
+                    signature = new_hash
+                else:
+                    signature = self.signature
+                db_access.write_database({'id': ref.id, 
+                                          'name': ref.name, 
+                                          'tags': ref.tags, 
+                                          'user': current_user(),
+                                          'date_created': current_time(),
+                                          'date_modified': current_time(),
+                                          'content_hash': new_hash,
+                                          'version': version, 
+                                          'signature': signature,
+                                          'type': path_type})
+            
+        # if keep-local and path is different than the selected path, copy
+        # the path to the keep-local path
+        if ref.local_path and ref.local_writeback:
+            if path != ref.local_path:
+                self.copypath(path, ref.local_path)
+        if not str(ref.version):
+            vistrails.core.debug.critical("Persistent version annotation not set correctly "
+                           "for persistent_id=%s" % ref.id)
+        # for all paths
+        self.annotate({'persistent_id': ref.id,
+                       'persistent_version': ref.version})
+        self.set_result(path)
+
+    _input_ports = [('value', '(basic:Path)'),
+                    ('ref', '(PersistentRef)'),
+                    ('localPath', '(basic:Path)'),
+                    ('readLocal', '(basic:Boolean)', True),
+                    ('writeLocal','(basic:Boolean)', True)]
+    _output_ports = [('value', '(basic:Path)')]
+
+class PersistentFile(PersistentPath):
+    _input_ports = [('value', '(basic:File)'),
+                    ('localPath', '(basic:File)')]
+    _output_ports = [('value', '(basic:File)')]
+
+    def updateUpstream(self, is_input=None):
+        PersistentPath.updateUpstream(self, is_input, 'blob')
+
+    def compute(self, is_input=None):
+        PersistentPath.compute(self, is_input, 'blob')
+
+    def set_result(self, path):
+        persistent_path = File()
+        persistent_path.name = path
+        persistent_path.setResult('value', self)
+        persistent_path.upToDate = True
+        self.setResult("value", persistent_path)
+
+class PersistentDir(PersistentPath):
+    _input_ports = [('value', '(basic:Directory)'),
+                    ('localPath', '(basic:Directory)')]
+    _output_ports = [('value', '(basic:Directory)')]
+
+    def updateUpstream(self, is_input=None):
+        PersistentPath.updateUpstream(self, is_input, 'tree')
+
+    def compute(self, is_input=None):
+        PersistentPath.compute(self, is_input, 'tree')
+
+    def set_result(self, path):
+        persistent_path = Directory()
+        persistent_path.name = path
+        persistent_path.setResult('value', self)
+        persistent_path.upToDate = True
+        self.setResult("value", persistent_path)
+
+class PersistentInputDir(PersistentDir):
+    _input_ports = [('value', '(basic:Directory)', True)]
+
+    def updateUpstream(self):
+        PersistentDir.updateUpstream(self, True)
+
+    def compute(self):
+        PersistentDir.compute(self, True)
+        
+class PersistentIntermediateDir(PersistentDir):
+    def updateUpstream(self):
+        PersistentDir.updateUpstream(self, False)
+
+    def compute(self):
+        PersistentDir.compute(self, False)
+    
+class PersistentOutputDir(PersistentDir):
+    _output_ports = [('value', '(basic:Directory)', True)]
+
+    def updateUpstream(self):
+        PersistentDir.updateUpstream(self, False)
+
+    def compute(self):
+        PersistentDir.compute(self, False)
+
+class PersistentInputFile(PersistentFile):
+    _input_ports = [('value', '(basic:File)', True)]
+
+    def updateUpstream(self):
+        PersistentFile.updateUpstream(self, True)
+
+    def compute(self):
+        PersistentFile.compute(self, True)
+    
+class PersistentIntermediateFile(PersistentFile):
+    def updateUpstream(self):
+        PersistentFile.updateUpstream(self, False)
+
+    def compute(self):
+        PersistentFile.compute(self, False)
+    
+class PersistentOutputFile(PersistentFile):
+    _output_ports = [('value', '(basic:File)', True)]
+
+    def updateUpstream(self):
+        PersistentFile.updateUpstream(self, False)
+
+    def compute(self):
+        PersistentFile.compute(self, False)
+    
+#def persistent_ref_hasher(p):
+#    return Hasher.parameter_signature(p)
+
+def persistent_module_hasher(pipeline, module, chm):
+    current_hash = Hasher.module_signature(module, chm)
+    ref = None
+    read_local = False
+    for function in module.functions:
+        if function.name == "ref":
+            ref = PersistentRef.translate_to_python(function.params[0].strValue)
+        if function.name == 'readLocal':
+            read_local = \
+                Boolean.translate_to_python(function.params[0].strValue)
+    if ref and not read_local and db_access.ref_exists(ref.id, ref.version):
+        if ref.version is None:
+            ref.version = repo.get_current_repo().get_latest_version(ref.id)
+        return Hasher.compound_signature([current_hash, str(ref.id),
+                                          str(ref.version)])
+    return current_hash
+
+_modules = [PersistentRef, PersistentPath, PersistentFile, PersistentDir,
+           (PersistentInputFile, {'configureWidgetType': \
+                                      PersistentInputFileConfiguration,
+                                  'signatureCallable': \
+                                      persistent_module_hasher}),
+           (PersistentOutputFile, {'configureWidgetType': \
+                                       PersistentOutputFileConfiguration,
+                                   'signatureCallable': \
+                                       persistent_module_hasher}),
+           (PersistentIntermediateFile, {'configureWidgetType': \
+                                             PersistentOutputFileConfiguration,
+                                         'signatureCallable': \
+                                             persistent_module_hasher}),
+           (PersistentInputDir, {'configureWidgetType': \
+                                     PersistentInputDirConfiguration,
+                                 'signatureCallable': \
+                                     persistent_module_hasher}),
+           (PersistentOutputDir, {'configureWidgetType': \
+                                      PersistentOutputDirConfiguration,
+                                  'signatureCallable': \
+                                      persistent_module_hasher}),
+           (PersistentIntermediateDir, {'configureWidgetType': \
+                                            PersistentOutputDirConfiguration,
+                                        'signatureCallable': \
+                                            persistent_module_hasher})]
+
+def initialize():
+    global global_db, local_db, search_dbs, compress_by_default, db_access, \
+        git_bin, debug
+    
+    if configuration.check('git_bin'):
+        git_bin = configuration.git_bin
+    if git_bin.startswith("@executable_path/"):
+        non_expand_path = git_bin
+        git_bin = get_executable_path(git_bin[len("@executable_path/"):])
+        if git_bin is not None:
+            configuration.git_bin = non_expand_path
+    if git_bin is None:
+        git_bin = 'git'
+        configuration.git_bin = git_bin
+        
+    if configuration.check('compress_by_default'):
+        compress_by_default = configuration.compress_by_default
+    if configuration.check('debug'):
+        debug = configuration.debug
+    if configuration.check('global_db'):
+        global_db = configuration.global_db
+    if configuration.check('local_db'):
+        local_db = configuration.local_db
+        if not os.path.exists(local_db):
+            raise RuntimeError('local_db "%s" does not exist' % local_db)
+    else:
+        local_db = os.path.join(current_dot_vistrails(), 'persistent_files')
+        if not os.path.exists(local_db):
+            try:
+                os.mkdir(local_db)
+            except:
+                raise RuntimeError('local_db "%s" does not exist' % local_db)
+
+    local_repo = repo.get_repo(local_db)
+    repo.set_current_repo(local_repo)
+
+    debug_print('creating DatabaseAccess')
+    db_path = os.path.join(local_db, '.files.db')
+    db_access = DatabaseAccessSingleton(db_path)
+    debug_print('done', db_access)
+    
+    search_dbs = [local_db,]
+    if configuration.check('search_dbs'):
+        try:
+            check_paths = eval(configuration.search_dbs)
+        except:
+            print "*** persistence error: cannot parse search_dbs ***"
+        for path in check_paths:
+            if os.path.exists(path):
+                search_dbs.append(path)
+            else:
+                print '*** persistence warning: cannot find path "%s"' % path
+
+_configuration_widget = None
+
+def finalize():
+    # delete all temporary files/directories used by zip
+    global db_access, _configuration_widget
+
+    for fname in repo.get_current_repo().temp_persist_files:
+        if os.path.isfile(fname):
+            os.remove(fname)
+        elif os.path.isdir(fname):
+            shutil.rmtree(fname)
+    db_access.finalize()
+    if _configuration_widget is not None:
+        _configuration_widget.deleteLater()
+
+def menu_items():
+    def show_configure():
+        global _configuration_widget
+        if _configuration_widget is None:
+            _configuration_widget = PersistentConfiguration()
+        _configuration_widget.show()
+    menu_tuple = (("Manage Store...", show_configure),)
+    return menu_tuple
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    module_remap = {
+            # Migrates from pre-0.1.0 to 0.2.0+
+            'PersistentFile': [
+                (None, '0.1.0', 'PersistentIntermediateFile', {
+                    'dst_port_remap': {
+                        'compress': None}})],
+            'PersistentDirectory': [
+                (None, '0.1.0', 'PersistentIntermediateDir', {
+                    'dst_port_remap': {
+                        'compress': None}})],
+            # Migrates from persistence_exp (0.1.0-0.2.0) to 0.2.0+
+            'ManagedRef': [
+                ('0.1.0', None, 'persistence:PersistentRef', {})],
+            'ManagedPath': [
+                ('0.1.0', None, 'persistence:PersistentPath', {})],
+            'ManagedFile': [
+                ('0.1.0', None, 'persistence:PersistentFile', {})],
+            'ManagedDir': [
+                ('0.1.0', None, 'persistence:PersistentDir', {})],
+            'ManagedInputFile': [
+                ('0.1.0', None, 'persistence:PersistentInputFile', {})],
+            'ManagedOutputFile': [
+                ('0.1.0', None, 'persistence:PersistentOutputFile', {})],
+            'ManagedIntermediateFile': [
+                ('0.1.0', None, 'persistence:PersistentIntermediateFile', {})],
+            'ManagedInputDir': [
+                ('0.1.0', None, 'persistence:PersistentInputDir', {})],
+            'ManagedOutputDir': [
+                ('0.1.0', None, 'persistence:PersistentOutputDir', {})],
+            'ManagedIntermediateDir': [
+                ('0.1.0', None, 'persistence:PersistentIntermediateDir', {})]
+        }
+    for module in ['PersistentPath', 'PersistentFile', 'PersistentDir',
+                   'PersistentInputFile', 'PersistentOutputFile',
+                   'PersistentIntermediateFile',
+                   'PersistentInputDir', 'PersistentOutputDir',
+                   'PersistentIntermediateDir']:
+        upgrade = ('0.2.0', '0.2.2', None,
+                   {'dst_port_remap': {'ref': 'ref'}})
+        if module in module_remap:
+            module_remap[module].append(upgrade)
+        else:
+            module_remap[module] = [upgrade]
+
+    return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline,
+                                               module_remap)
diff --git a/vistrails/packages/persistence/repo.py b/vistrails/packages/persistence/repo.py
new file mode 100644
index 0000000..b43eec9
--- /dev/null
+++ b/vistrails/packages/persistence/repo.py
@@ -0,0 +1,272 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from vistrails.core.bundles import py_import
+py_import('dulwich', {
+        'pip': 'dulwich',
+        'linux-debian': 'python-dulwich',
+        'linux-ubuntu': 'python-dulwich',
+        'linux-fedora': 'python-dulwich'})
+from vistrails.core import debug
+
+from dulwich.errors import NotCommitError, NotGitRepository
+from dulwich.repo import Repo
+from dulwich.objects import Commit, Blob, Tree, object_header
+from dulwich.pack import iter_sha1
+from dulwich.walk import Walker
+from itertools import chain
+import os
+import shutil
+import stat
+import tempfile
+
+class GitRepo(object):
+    def __init__(self, path):
+        if os.path.exists(path):
+            if not os.path.isdir(path):
+                raise IOError('Git repository "%s" must be a directory.' %
+                              path)
+        try:
+            self.repo = Repo(path)
+        except NotGitRepository:
+            # repo does not exist
+            self.repo = Repo.init(path, not os.path.exists(path))
+    
+        self.temp_persist_files = []
+
+    def _get_commit(self, version="HEAD"):
+        commit = self.repo[version]
+        if not isinstance(commit, Commit):
+            raise NotCommitError(commit)
+        return commit
+
+    def get_type(self, name, version="HEAD"):
+        commit = self._get_commit(version)
+
+        tree = self.repo.tree(commit.tree)
+        if name not in tree:
+            raise KeyError('Cannot find object "%s"' % name)
+        if tree[name][0] & stat.S_IFDIR:
+            return "tree"
+        else:
+            return "blob"
+
+    def get_path(self, name, version="HEAD", path_type=None, out_name=None,
+                 out_suffix=''):
+        if path_type is None:
+            path_type = self.get_type(name, version)
+        if path_type == 'tree':
+            return self.get_dir(name, version, out_name, out_suffix)
+        elif path_type == 'blob':
+            return self.get_file(name, version, out_name, out_suffix)
+
+        raise TypeError("Unknown path type '%s'" % path_type)
+
+    def _write_blob(self, blob_sha, out_fname=None, out_suffix=''):
+        if out_fname is None:
+            # create a temporary file
+            (fd, out_fname) = tempfile.mkstemp(suffix=out_suffix,
+                                               prefix='vt_persist')
+            os.close(fd)
+            self.temp_persist_files.append(out_fname)
+        else:
+            out_dirname = os.path.dirname(out_fname)
+            if out_dirname and not os.path.exists(out_dirname):
+                os.makedirs(out_dirname)
+        
+        blob = self.repo.get_blob(blob_sha)
+        with open(out_fname, "wb") as f:
+            for b in blob.as_raw_chunks():
+                f.write(b)
+        return out_fname
+
+    def get_file(self, name, version="HEAD", out_fname=None, 
+                 out_suffix=''):
+        commit = self._get_commit(version)
+        tree = self.repo.tree(commit.tree)
+        if name not in tree:
+            raise KeyError('Cannot find blob "%s"' % name)
+        blob_sha = tree[name][1]
+        out_fname = self._write_blob(blob_sha, out_fname, out_suffix)
+        return out_fname
+
+    def get_dir(self, name, version="HEAD", out_dirname=None, 
+                out_suffix=''):
+        if out_dirname is None:
+            # create a temporary directory
+            out_dirname = tempfile.mkdtemp(suffix=out_suffix,
+                                           prefix='vt_persist')
+            self.temp_persist_files.append(out_dirname)
+        elif not os.path.exists(out_dirname):
+            os.makedirs(out_dirname)
+        
+        commit = self._get_commit(version)
+        tree = self.repo.tree(commit.tree)
+        if name not in tree:
+            raise KeyError('Cannot find tree "%s"' % name)
+        subtree_id = tree[name][1]
+        # subtree = self.repo.tree(subtree_id)
+        for entry in self.repo.object_store.iter_tree_contents(subtree_id):
+            out_fname = os.path.join(out_dirname, entry.path)
+            self._write_blob(entry.sha, out_fname)
+        return out_dirname
+
+    def get_hash(self, name, version="HEAD", path_type=None):
+        commit = self._get_commit(version)
+        tree = self.repo.tree(commit.tree)
+        if name not in tree:
+            raise KeyError('Cannot find object "%s"' % name)
+        return tree[name][1]
+
+    @staticmethod
+    def compute_blob_hash(fname, chunk_size=1<<16):
+        obj_len = os.path.getsize(fname)
+        head = object_header(Blob.type_num, obj_len)
+        with open(fname, "rb") as f:
+            def read_chunk():
+                return f.read(chunk_size)
+            my_iter = chain([head], iter(read_chunk,''))
+            return iter_sha1(my_iter)
+        return None
+
+    @staticmethod
+    def compute_tree_hash(dirname):
+        tree = Tree()
+        for entry in sorted(os.listdir(dirname)):
+            fname = os.path.join(dirname, entry)
+            if os.path.isdir(fname):
+                thash = GitRepo.compute_tree_hash(fname)
+                mode = stat.S_IFDIR # os.stat(fname)[stat.ST_MODE]
+                tree.add(entry, mode, thash)
+            elif os.path.isfile(fname):
+                bhash = GitRepo.compute_blob_hash(fname)
+                mode = os.stat(fname)[stat.ST_MODE]
+                tree.add(entry, mode, bhash)
+        return tree.id
+
+    @staticmethod
+    def compute_hash(path):
+        if os.path.isdir(path):
+            return GitRepo.compute_tree_hash(path)
+        elif os.path.isfile(path):
+            return GitRepo.compute_blob_hash(path)
+        raise TypeError("Do not support this type of path")
+
+    def get_latest_version(self, path):
+        head = self.repo.head()
+        walker = Walker(self.repo.object_store, [head], max_entries=1, 
+                        paths=[path])
+        return iter(walker).next().commit.id
+
+    def _stage(self, filename):
+        fullpath = os.path.join(self.repo.path, filename)
+        if os.path.islink(fullpath):
+            debug.warning("Warning: not staging symbolic link %s" % os.path.basename(filename))
+        elif os.path.isdir(fullpath):
+            for f in os.listdir(fullpath):
+                self._stage(os.path.join(filename, f))
+        else:
+            if os.path.sep != '/':
+                filename = filename.replace(os.path.sep, '/')
+            self.repo.stage(filename)
+
+    def add_commit(self, filename):
+        self.setup_git()
+        self._stage(filename)
+        commit_id = self.repo.do_commit('Updated %s' % filename)
+        return commit_id
+
+    def setup_git(self):
+        config_stack = self.repo.get_config_stack()
+
+        try:
+            config_stack.get(('user',), 'name')
+            config_stack.get(('user',), 'email')
+        except KeyError:
+            from vistrails.core.system import current_user
+            from dulwich.config import ConfigFile
+            user = current_user()
+            repo_conf = self.repo.get_config()
+            repo_conf.set(('user',), 'name', user)
+            repo_conf.set(('user',), 'email', '%s at localhost' % user)
+            repo_conf.write_to_path()
+
+current_repo = None
+
+def get_current_repo():
+    return current_repo
+def set_current_repo(repo):
+    global current_repo
+    current_repo = repo
+
+def get_repo(path):
+    return GitRepo(path)
+
+def run_get_file_test():
+    r = GitRepo("/vistrails/src/git")
+    r.get_file("README.md", "HEAD", "testREADMEout.md")
+
+def run_get_dir_test():
+    r = GitRepo("/vistrails/src/git")
+    r.get_dir("scripts", "HEAD", "testScriptsout")
+
+def run_get_type_test():
+    r = GitRepo("/vistrails/src/git")
+    print "README.md:", r.get_type("README.md")
+    print "scripts:", r.get_type("scripts")
+
+def run_compute_sha_test():
+    r = GitRepo("/vistrails/src/git")
+    print r.get_hash("README.md")
+    # print r.compute_blob_hash("/Users/dakoop/Downloads/xcode_2.4.1_8m1910_6936315.dmg")        
+    print r.compute_blob_hash("/vistrails/src/git/README.md")
+
+def run_compute_sha_dir_test():
+    r = GitRepo("/vistrails/src/git")
+    print r.get_hash("scripts")
+    print r.compute_tree_hash("/vistrails/src/git/scripts")
+
+def run_get_latest_test():
+    r = GitRepo("/vistrails/src/git")
+    print r.get_latest_version("README.md")
+
+def run_init_add_test():
+    r = GitRepo("/Users/dakoop/.vistrails/git_test")
+    shutil.copy("/vistrails/src/git/README.md", 
+                "/Users/dakoop/.vistrails/git_test")
+    print r.add_commit("README.md")
+
+if __name__ == '__main__':
+    run_init_add_test()
diff --git a/vistrails/packages/persistence/schema.sql b/vistrails/packages/persistence/schema.sql
new file mode 100644
index 0000000..068d5ea
--- /dev/null
+++ b/vistrails/packages/persistence/schema.sql
@@ -0,0 +1,37 @@
+--#############################################################################
+--
+-- Copyright (C) 2011-2014, NYU-Poly.
+-- Copyright (C) 2006-2011, University of Utah. 
+-- All rights reserved.
+-- Contact: contact at vistrails.org
+--
+-- This file is part of VisTrails.
+--
+-- "Redistribution and use in source and binary forms, with or without 
+-- modification, are permitted provided that the following conditions are met:
+--
+--  - Redistributions of source code must retain the above copyright notice, 
+--    this list of conditions and the following disclaimer.
+--  - Redistributions in binary form must reproduce the above copyright 
+--    notice, this list of conditions and the following disclaimer in the 
+--    documentation and/or other materials provided with the distribution.
+--  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+--
+--#############################################################################
+
+create table file (id text, name text, tags text, user text, date_created text, date_modified text, content_hash text, version text, signature text, type text);
+create index signature_idx on file(signature);
\ No newline at end of file
diff --git a/vistrails/packages/persistence/widgets.py b/vistrails/packages/persistence/widgets.py
new file mode 100644
index 0000000..ec5b50e
--- /dev/null
+++ b/vistrails/packages/persistence/widgets.py
@@ -0,0 +1,1184 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+import os
+import re
+import uuid
+
+from vistrails.core.modules.basic_modules import Path
+from vistrails.gui.common_widgets import QSearchBox, QSearchEditBox
+from vistrails.gui.modules.constant_configuration import ConstantWidgetMixin
+from vistrails.gui.modules.module_configure import StandardModuleConfigurationWidget
+
+from db_utils import DatabaseAccessSingleton
+from identifiers import identifier as persistence_pkg
+import repo
+
+class IntegerWrapper(object):
+    def __init__(self, idx):
+        self.idx = idx
+
+class PersistentRefModelSingleton(object):
+    def __new__(self, *args, **kw):
+        if PersistentRefModel._instance is None:
+            obj = PersistentRefModel(*args, **kw)
+            PersistentRefModel._instance = obj
+        return PersistentRefModel._instance
+
+class PersistentRefModel(QtCore.QAbstractItemModel):
+
+    _instance = None
+
+    # 2013-09-03 18:57:53.133000
+    _DATE_FORMAT = re.compile(r'^(?P<y>[0-9]{4})-'
+                              r'(?P<m>[0-9]{2})-'
+                              r'(?P<d>[0-9]{2}) '
+                              r'(?P<H>[0-9]{2}):'
+                              r'(?P<M>[0-9]{2}):'
+                              r'(?P<S>[0-9]{2}).'
+                              r'(?P<ms>[0-9]+)$')
+
+    cols = {0: "name",
+            1: "type",
+            2: "tags",
+            3: "user",
+            4: "date_created",
+            5: "date_modified",
+            6: "id",
+            7: "version",
+            8: "content_hash",
+            9: "signature"}
+    idxs = dict((v,k) for (k,v) in cols.iteritems())
+    headers = {"id": "ID",
+               "name": "Name",
+               "tags": "Tags",
+               "user": "User",
+               "date_created": "Date Created",
+               "date_modified": "Date Modified",
+               "content_hash": "Content Hash",
+               "version": "Version",
+               "signature": "Signature",
+               "type": "Type"}
+
+    def __init__(self, parent=None):
+        QtCore.QAbstractItemModel.__init__(self, parent)
+
+        self.db_access = DatabaseAccessSingleton()
+        self.db_access.set_model(self)
+        rows = self.db_access.read_database(
+            [c[1] for c in sorted(self.cols.iteritems())])
+        rows = map(self.fix_dates, rows)
+
+        self.id_lists = {}
+        for ref in rows:
+            if ref[self.idxs['id']] not in self.id_lists:
+                self.id_lists[ref[self.idxs['id']]] = []
+            self.id_lists[ref[self.idxs['id']]].append(ref)
+
+        self.id_lists_keys = self.id_lists.keys()
+
+        self.integer_wrappers = {}
+
+    @staticmethod
+    def fix_dates(row):
+        row = list(row)
+        for c in ('date_created', 'date_modified'):
+            c = PersistentRefModel.idxs[c]
+            m = PersistentRefModel._DATE_FORMAT.match(row[c])
+            if m is not None:
+                row[c] = '{y}-{m}-{d} {H}:{M}'.format(**m.groupdict())
+        return tuple(row)
+
+    def rowCount(self, parent=QtCore.QModelIndex()):
+        if not parent.isValid():
+            # print 'rowCount:', len(self.id_lists_keys)
+            return len(self.id_lists_keys)
+        # print 'parentValid rowCount:', \
+        #     len(self.id_lists[self.id_lists_keys[parent.row()]])
+        return len(self.id_lists[self.id_lists_keys[parent.row()]])
+ 
+    def columnCount(self, parent=QtCore.QModelIndex()):
+        # print 'columnCount:', len(self.headers)
+        return len(self.headers)
+    
+    def hasChildren(self, parent=QtCore.QModelIndex()):
+        # print 'hasChildren:'
+        if not parent.isValid():
+            # print '  True'
+            return True
+        else:
+            # print '  PARENT:', parent.row(), parent.column(), \
+            #     parent.internalPointer()
+            if not parent.parent().isValid():
+                # print '  TRUE'
+                return True
+        # print '  False'
+        return False
+
+    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
+        if role != QtCore.Qt.DisplayRole:
+            return None
+        if section in self.cols:
+            return self.headers[self.cols[section]]
+        return None
+    
+    def data(self, index, role):
+        if not index.isValid() or role != QtCore.Qt.DisplayRole:
+            return None
+        # if index.parent().isValid():
+        #     print 'data', index.row(), index.column(), index.parent().row()
+        if index.parent().isValid():
+            # have a child node
+            # print 'got child node!', index.parent().row()
+            id_list = self.id_lists[self.id_lists_keys[index.parent().row()]]
+            data = id_list[index.row()]
+        else:
+            # have a parent node    
+            id_list = self.id_lists[self.id_lists_keys[index.row()]]
+            data = id_list[0]
+            # want to have the earliest created date and latest modified date
+            if index.column() == self.idxs['date_created']:
+                dates = [l[index.column()] for l in id_list]
+                return min(dates)
+            if index.column() == self.idxs['date_modified']:
+                dates = [l[index.column()] for l in id_list]
+                return max(dates)
+            if index.column() == self.idxs['version'] or \
+                    index.column() == self.idxs['signature'] or \
+                    index.column() == self.idxs['content_hash'] or \
+                    index.column() == self.idxs['user']:
+                return None
+
+        if index.column() < len(data):
+            return data[index.column()]
+        return None
+    
+    def parent(self, index):
+        # print 'calling parent() method'
+        if index.isValid():
+            # print '  index is valid', index.row(), index.column()
+            if index.internalPointer():
+                parent_item = index.internalPointer().idx
+                # print '  parent_item:', parent_item
+                return self.createIndex(parent_item, 0, None)
+#             else:
+#                 # print '  internalPointer is not valid'
+#         else:
+#             # print 'index not valid for parent call'
+        return QtCore.QModelIndex()
+
+    def index(self, row, column, parent):
+        # print 'index:', row, column
+        if not parent.isValid():
+            if len(self.id_lists_keys) > row:
+                # print '  no parent item'
+                return self.createIndex(row, column, None)
+        else:
+            # print '  **** parent_item', row, column, parent.row()
+            if len(self.id_lists[self.id_lists_keys[parent.row()]]) > row:
+                # print '  ++++ creating index'
+                # !!! internalPointer is a weakref in PyQt !!!
+                if parent.row() not in self.integer_wrappers:
+                    integer_wrapper = IntegerWrapper(parent.row())
+                    self.integer_wrappers[parent.row()] = integer_wrapper
+                else:
+                    integer_wrapper = self.integer_wrappers[parent.row()]
+                # print '  ---- created parent wrapper'
+                return self.createIndex(row, column, integer_wrapper)
+        return QtCore.QModelIndex()
+
+    def sort(self, column, order=QtCore.Qt.AscendingOrder):
+        self.emit(QtCore.SIGNAL('layoutAboutToBeChanged()'))
+        if column == -1:
+            return
+        self.id_lists_keys.sort(key=lambda x: self.id_lists[x][0][column], 
+                                reverse=(order==QtCore.Qt.AscendingOrder))
+        self.emit(QtCore.SIGNAL('layoutChanged()'))
+
+    def find_row(self, id, version=None):
+        if id in self.id_lists:
+            i = self.id_lists_keys.index(id)
+            if version is not None:
+                for j, data in enumerate(self.id_lists[id]):
+                    if data[self.idxs['version']] == version:
+                        if i not in self.integer_wrappers:
+                            integer_wrapper = IntegerWrapper(i)
+                            self.integer_wrappers[i] = integer_wrapper
+                        else:
+                            integer_wrapper = self.integer_wrappers[i]
+                        return self.createIndex(j, 0, integer_wrapper)
+            return self.createIndex(i, 0, 0)
+#             for i, id in enumerate(self.id_lists_keys):
+            
+#             if version is not None:
+#                 for data in enumerate(self.id_lists[id]):
+#                     if
+#         for i, data in enumerate(self.id_lists):
+#             if data[self.idxs['id']] == id and \
+#                     (not version or data[self.idxs['version']] == version):
+#                 return self.createIndex(i, 0, 0)
+        return QtCore.QModelIndex()
+
+    def add_data(self, value_dict):
+        id = value_dict['id']
+        value_list = []
+        for _, c in sorted(self.cols.iteritems()):
+            if c in value_dict:
+                value_list.append(str(value_dict[c]))
+            else:
+                value_list.append(None)
+        if id not in self.id_lists:
+            self.id_lists[id] = []
+            self.id_lists_keys.append(id)
+        self.id_lists[id].append(self.fix_dates(value_list))
+        self.reset()
+
+    def remove_data(self, where_dict):
+        id = where_dict['id']
+        version = where_dict.get('version', None)
+        if version is not None:
+            found = False
+            for idx, value_tuple in enumerate(self.id_lists[id]):
+                if value_tuple[self.idxs['version']] == version:
+                    found = True
+                    break
+            if found:
+                del self.id_lists[id][idx]
+        else:
+            path_type = self.id_lists[id][0][self.idxs['type']]
+            found = False
+            for idx, key_id in enumerate(self.id_lists_keys):
+                if key_id == id:
+                    found = True
+                    break
+            if found:
+                del self.id_lists_keys[idx]
+            del self.id_lists[id]
+        self.reset()
+
+class PersistentRefView(QtGui.QTreeView):
+    def __init__(self, path_type=None, parent=None):
+        QtGui.QTreeView.__init__(self, parent)
+        self.my_model = PersistentRefModelSingleton()
+        print 'my_model:', id(self.my_model)
+        proxy_model = QtGui.QSortFilterProxyModel(self)
+        proxy_model.setSourceModel(self.my_model)
+        proxy_model.setFilterKeyColumn(-1)
+        self.setModel(proxy_model)
+        self.set_visibility(path_type)
+
+        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+        self.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+        self.setSortingEnabled(True)
+        self.current_id = None
+        self.current_version = None
+
+        for i in xrange(self.my_model.columnCount()):
+            self.resizeColumnToContents(i)
+
+    def set_visibility(self, path_type=None):
+        if path_type == "blob":
+            self.header().hideSection(self.my_model.idxs["type"])
+            for i, key in enumerate(self.my_model.id_lists_keys):
+                id_list = self.my_model.id_lists[key]
+                if id_list[0][self.my_model.idxs["type"]] != "blob":
+                    # if i not in self.my_model.file_idxs:
+                    print "setting index", i, "to hidden"
+                    my_index = self.my_model.createIndex(i, 0, None)
+                    index = self.model().mapFromSource(my_index)
+                    self.setRowHidden(index.row(), QtCore.QModelIndex(), True)
+        elif path_type == "tree":
+            self.header().hideSection(self.my_model.idxs["type"])
+            for i, key in enumerate(self.my_model.id_lists_keys):
+                id_list = self.my_model.id_lists[key]
+                if id_list[0][self.my_model.idxs["type"]] != "tree":
+                    # if i not in self.my_model.dir_idxs:
+                    print "setting index", i, "to hidden"
+                    my_index = self.my_model.createIndex(i, 0, None)
+                    index = self.model().mapFromSource(my_index)
+                    self.setRowHidden(index.row(), QtCore.QModelIndex(), True)
+        
+    def set_selection(self):
+        if self.current_id:
+            my_index = self.my_model.find_row(self.current_id, 
+                                              self.current_version)
+            
+            index = self.model().mapFromSource(my_index)
+            if index.isValid():
+                print 'checking internalPointer', my_index.internalPointer()
+                if my_index.internalPointer():
+                    my_expand_index = \
+                        self.my_model.createIndex(
+                        my_index.internalPointer().idx, 0, 0)
+                    expand_index = self.model().mapFromSource(my_expand_index)
+                    self.expand(expand_index)
+                self.selectionModel().select(
+                    index, QtGui.QItemSelectionModel.ClearAndSelect | \
+                        QtGui.QItemSelectionModel.Rows)
+                return True
+        return False
+
+    def set_id(self, id):
+        self.current_id = id
+        return self.set_selection()
+
+    def set_version(self, version):
+        self.current_version = version
+        return self.set_selection()
+
+    def get_id(self):
+        sf_index = self.selectionModel().selectedRows()[0]
+        index = self.model().mapToSource(sf_index)
+        if index.internalPointer():
+            paridx = index.internalPointer().idx
+            id_list = \
+                self.my_model.id_lists[self.my_model.id_lists_keys[paridx]]
+            id = id_list[index.row()][self.my_model.idxs['id']]
+        else:
+            id_list = \
+                self.my_model.id_lists[self.my_model.id_lists_keys[index.row()]]
+            id = id_list[0][self.my_model.idxs['id']]
+        return str(id)
+
+    def get_version(self):
+        sf_index = self.selectionModel().selectedRows()[0]
+        index = self.model().mapToSource(sf_index)
+        if index.internalPointer():
+            paridx = index.internalPointer().idx
+            id_list = \
+                self.my_model.id_lists[self.my_model.id_lists_keys[paridx]]
+            version = id_list[index.row()][self.my_model.idxs['version']]
+            return str(version)        
+        return None
+        
+    def get_info(self):
+        return self.get_info_list()[0]
+
+    def get_info_list(self):
+        s_indexes = self.selectionModel().selectedRows()
+        info_list = []
+        for s_idx in s_indexes:
+            index = self.model().mapToSource(s_idx)
+            if index.internalPointer():
+                paridx = index.internalPointer().idx
+                id_list = \
+                    self.my_model.id_lists[self.my_model.id_lists_keys[paridx]]
+                info = id_list[index.row()]
+                version = str(info[self.my_model.idxs['version']])
+            else:
+                id_list = self.my_model.id_lists[ \
+                    self.my_model.id_lists_keys[index.row()]]
+                info = id_list[0]
+                version = None
+            info_list.append((str(info[self.my_model.idxs['id']]),
+                              version,
+                              str(info[self.my_model.idxs['name']]),
+                              str(info[self.my_model.idxs['tags']])))
+        return info_list
+
+class PersistentRefDialog(QtGui.QDialog):
+    def __init__(self, param, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        # two tabs, one for starting from managed, one for local file
+        # options are set accordingly
+        # uuid assigned when options are set, either new or existing
+        # don't compute uuid for local file that hasn't been run
+        # need PersistentReference parameter
+        # allow user to pass contents in to PersistentRef
+        self.setWindowTitle("Configure Persistent Reference...")
+
+        self.settings = {'ref_id': None,
+                         'ref_version': None,
+                         'local_path': None,
+                         'versioning': False,
+                         'local_read_priority': True,
+                         'write_back': True}
+
+        self.current_file = ""
+        db_file = "/vistrails/managed/files.db"
+
+        layout = QtGui.QVBoxLayout()
+        managed_group = QtGui.QGroupBox("Persistent Data")
+        managed_layout = QtGui.QVBoxLayout()
+        search = QSearchBox(False, False)
+
+        def keyPressEvent(obj, e):
+            print "got to key press event", e.key()
+            if e.key() in (QtCore.Qt.Key_Return,QtCore.Qt.Key_Enter):
+                if obj.currentText():
+                    obj.emit(QtCore.SIGNAL('executeSearch(QString)'),  
+                             obj.searchEdit.currentText())
+                else:
+                    obj.emit(QtCore.SIGNAL('resetSearch()'))
+            QtGui.QComboBox.keyPressEvent(obj, e)
+
+        print 'keyPressEvent:', search.searchEdit.keyPressEvent
+        search.searchEdit.keyPressEvent = keyPressEvent
+        print 'keyPressEvent:', search.searchEdit.keyPressEvent
+        self.connect(search, QtCore.SIGNAL('executeSearch(QString)'),
+                     self.search_string)
+        self.connect(search, QtCore.SIGNAL('resetSearch()'),
+                     self.reset_search)
+        managed_layout.addWidget(search)
+        self.table = PersistentRefView(db_file, self)
+        managed_layout.addWidget(self.table)
+        managed_group.setLayout(managed_layout)
+        layout.addWidget(managed_group)
+
+        local_group = QtGui.QGroupBox("Local Data")
+        local_layout = QtGui.QHBoxLayout()
+        self.filename_edit = QtGui.QLineEdit()
+        local_layout.addWidget(self.filename_edit)
+
+        filename_button = QtGui.QToolButton()
+        filename_button.setIcon(
+            QtGui.QIcon(filename_button.style().standardPixmap(
+                    QtGui.QStyle.SP_DirOpenIcon)))
+        filename_button.setIconSize(QtCore.QSize(12,12))
+        filename_button.connect(filename_button,
+                                QtCore.SIGNAL('clicked()'),
+                                self.choose_file)
+        local_layout.addWidget(filename_button)
+        local_group.setLayout(local_layout)
+        layout.addWidget(local_group)
+
+        pref_layout = QtGui.QHBoxLayout()
+        version_group = QtGui.QGroupBox("Versioning")
+        version_layout = QtGui.QVBoxLayout()
+        version_off = QtGui.QRadioButton("Create New ID")
+        version_layout.addWidget(version_off)
+        version_on = QtGui.QRadioButton("Create New Version")
+        version_layout.addWidget(version_on)
+        version_group.setLayout(version_layout)
+        pref_layout.addWidget(version_group)
+
+        r_priority_group = QtGui.QGroupBox("Read Priority")
+        r_priority_layout = QtGui.QVBoxLayout()
+        r_priority_off = QtGui.QRadioButton("Local")
+        r_priority_layout.addWidget(r_priority_off)
+        r_priority_on = QtGui.QRadioButton("Persistent Store")
+        r_priority_layout.addWidget(r_priority_on)
+        r_priority_group.setLayout(r_priority_layout)
+        pref_layout.addWidget(r_priority_group)
+        
+        w_priority_group = QtGui.QGroupBox("Write Priority")
+        w_priority_layout = QtGui.QVBoxLayout()
+        w_priority_off = QtGui.QRadioButton("Local")
+        w_priority_layout.addWidget(w_priority_off)
+        w_priority_on = QtGui.QRadioButton("Persistent Store")
+        w_priority_layout.addWidget(w_priority_on)
+        w_priority_group.setLayout(w_priority_layout)
+        pref_layout.addWidget(w_priority_group)
+        layout.addLayout(pref_layout)
+
+        button_layout = QtGui.QHBoxLayout()
+        button_layout.setDirection(QtGui.QBoxLayout.RightToLeft)
+        button_layout.setAlignment(QtCore.Qt.AlignRight)
+        ok_button = QtGui.QPushButton("OK")
+        ok_button.setFixedWidth(100)
+        self.connect(ok_button, QtCore.SIGNAL('clicked()'), self.close)
+        button_layout.addWidget(ok_button)
+        cancel_button = QtGui.QPushButton("Cancel")
+        cancel_button.setFixedWidth(100)
+        self.connect(cancel_button, QtCore.SIGNAL('clicked()'), self.cancel)
+        button_layout.addWidget(cancel_button)
+        layout.addLayout(button_layout)
+        self.setLayout(layout)
+
+    def close(self):
+        self.done(QtGui.QDialog.Accepted)
+
+    def cancel(self):
+        self.done(QtGui.QDialog.Rejected)
+
+    def choose_file(self):
+        chosen_file = \
+            QtGui.QFileDialog.getOpenFileName(self,
+                                              'Use File...',
+                                              self.current_file,
+                                              'All files (*.*)')
+        if chosen_file:
+            self.current_file = chosen_file
+            self.filename_edit.setText(self.current_file)
+    
+    def build_table(self):
+        # read sql table from sqlite3 
+        # display table
+        pass
+    
+    def select_file(self):
+        # present file dialog and allow user to choose file
+        # compute file hash
+        # if content exists in persistent store, ask to reuse 
+        # (or set reuse checkbox)
+        # set use_local checkbox to True
+        # don't transfer until execution?
+        # create uuid for file
+        pass
+
+    def select_remote(self):
+        # present table of data with search box
+        # each data has name, id, user, date, tags, etc.
+        # if user selects, check use_local checkbox to False
+        # store local is False, too?
+        # don't transfer file until execution?
+        # populate uuid
+        pass
+
+
+    # starting choice: local file or find existing managed file?
+    # allow branch off of existing managed file -- ie no longer a
+    # version of the initial file?
+    
+    # === options ===
+    # overwrite managed on change
+    # overwrite local on change
+    # local is authoritative
+    # keep local copy -- need to allow where to store
+
+class PathChooserLayout(QtGui.QHBoxLayout):
+    def __init__(self, is_dir=False, par_widget=None, parent=None):
+        # QtGui.QWidget.__init__(self, parent)
+        QtGui.QHBoxLayout.__init__(self, parent)
+        self.par_widget = par_widget
+        # layout = QtGui.QHBoxLayout()
+        self.pathname_edit = QtGui.QLineEdit()
+        self.addWidget(self.pathname_edit)
+
+        pathname_button = QtGui.QToolButton()
+        pathname_button.setIcon(
+            QtGui.QIcon(pathname_button.style().standardPixmap(
+                    QtGui.QStyle.SP_DirOpenIcon)))
+        pathname_button.setIconSize(QtCore.QSize(12,12))
+        pathname_button.connect(pathname_button,
+                                QtCore.SIGNAL('clicked()'),
+                                self.choose_path)
+        self.addWidget(pathname_button)
+        # layout.setContentsMargins(1,1,1,1)
+        # self.setLayout(layout)
+        self.is_dir = is_dir
+        
+    def choose_path(self):
+        if self.is_dir:
+            chosen_path = \
+                QtGui.QFileDialog.getExistingDirectory(self.par_widget,
+                                                       'Use Directory...',
+                                                       self.pathname_edit.text())
+        else:
+            chosen_path = \
+                QtGui.QFileDialog.getOpenFileName(self.par_widget,
+                                                  'Use File...',
+                                                  self.pathname_edit.text(),
+                                                  'All files (*.*)')
+
+        if chosen_path and chosen_path:
+            self.pathname_edit.setText(chosen_path)
+            self.emit(QtCore.SIGNAL('pathnameChanged()'))
+
+    def get_path(self):
+        return str(self.pathname_edit.text())
+
+    def set_path(self, pathname):
+        if pathname:
+            self.pathname_edit.setText(pathname)
+        else:
+            self.pathname_edit.clear()
+
+class PersistentRefViewSearch(QtGui.QGroupBox):
+    def __init__(self, path_type=None, parent=None):
+        QtGui.QGroupBox.__init__(self, parent)
+        self.build_gui(path_type)
+
+    def build_gui(self, path_type):
+        layout = QtGui.QVBoxLayout()
+        self.search_ref = QSearchBox(False, False)
+
+        self.connect(self.search_ref, 
+                     QtCore.SIGNAL('executeSearch(QString)'),
+                     self.search_string)
+        self.connect(self.search_ref, 
+                     QtCore.SIGNAL('resetSearch()'),
+                     self.reset_search)
+
+        layout.addWidget(self.search_ref)
+        self.ref_widget = PersistentRefView(path_type, self)
+        layout.addWidget(self.ref_widget)
+        layout.setMargin(0)
+        self.setLayout(layout)
+
+    def search_string(self, str):
+        self.ref_widget.model().setFilterWildcard(str)
+
+    def reset_search(self):
+        self.ref_widget.model().setFilterWildcard('')
+        self.ref_widget.model().invalidate()
+    
+
+class PersistentPathConfiguration(StandardModuleConfigurationWidget):
+    def __init__(self, module, controller, parent=None, 
+                 is_input=None, path_type=None):
+        StandardModuleConfigurationWidget.__init__(self, module, controller, 
+                                                   parent)
+
+        # set title
+        if module.has_annotation_with_key('__desc__'):
+            label = module.get_annotation_by_key('__desc__').value.strip()
+            title = '%s (%s) Module Configuration' % (label, module.name)
+        else:
+            title = '%s Module Configuration' % module.name
+        self.setWindowTitle(title)
+
+        self.build_gui(is_input, path_type)
+        self.set_values()
+
+    def sizeHint(self):
+        return QtCore.QSize(800, 600)
+
+    def build_gui(self, is_input, path_type):
+        self.current_path = ""
+
+        layout = QtGui.QVBoxLayout()
+#         layout.setMargin(0)
+#         layout.setSpacing(0)
+
+        if not is_input:
+            self.managed_change = \
+                QtGui.QRadioButton("Always Create New Reference")
+            layout.addWidget(self.managed_change)
+            self.connect(self.managed_change, QtCore.SIGNAL("toggled(bool)"),
+                         self.managed_toggle)
+
+        else:
+            self.managed_change = None
+
+        self.managed_new = QtGui.QRadioButton("Create New Reference")
+        self.connect(self.managed_new, QtCore.SIGNAL("toggled(bool)"),
+                     self.new_toggle)
+        layout.addWidget(self.managed_new)
+        self.new_group = QtGui.QGroupBox()
+        new_layout = QtGui.QGridLayout()
+        self.new_file = None
+        if is_input:
+            new_layout.addWidget(QtGui.QLabel("Path:"), 0, 0)
+            self.new_file = self.get_chooser_layout()
+            if hasattr(self.new_file, 'pathname_edit'):
+                self.connect(self.new_file.pathname_edit,
+                             QtCore.SIGNAL("textChanged(QString)"),
+                             self.stateChange)
+            new_layout.addLayout(self.new_file, 0, 1)
+            self.connect(self.new_file, QtCore.SIGNAL("pathnameChanged()"),
+                         self.new_file_changed)
+        new_layout.addWidget(QtGui.QLabel("Name:"), 1, 0)
+        self.name_edit = QtGui.QLineEdit()
+        self.connect(self.name_edit, QtCore.SIGNAL("textChanged(QString)"),
+                     self.stateChange)
+        new_layout.addWidget(self.name_edit, 1, 1)
+        new_layout.addWidget(QtGui.QLabel("Tags:"), 2, 0)
+        self.tags_edit = QtGui.QLineEdit()
+        self.connect(self.tags_edit, QtCore.SIGNAL("textChanged(QString)"),
+                     self.stateChange)
+        new_layout.addWidget(self.tags_edit, 2, 1)
+        self.new_group.setLayout(new_layout)
+        layout.addWidget(self.new_group)
+
+        self.managed_existing = QtGui.QRadioButton("Use Existing Reference")
+        self.connect(self.managed_existing, QtCore.SIGNAL("toggled(bool)"),
+                     self.existing_toggle)
+        layout.addWidget(self.managed_existing)
+
+        # self.existing_group = QtGui.QGroupBox()
+        # existing_layout = QtGui.QVBoxLayout()
+        # self.search_ref = QSearchBox(False, False)
+
+        # self.connect(self.search_ref, 
+        #              QtCore.SIGNAL('executeSearch(QString)'),
+        #              self.search_string)
+        # self.connect(self.search_ref, 
+        #              QtCore.SIGNAL('resetSearch()'),
+        #              self.reset_search)
+
+        # existing_layout.addWidget(self.search_ref)
+        # self.ref_widget = PersistentRefView(path_type, self)
+        # existing_layout.addWidget(self.ref_widget)
+        # self.existing_group.setLayout(existing_layout)
+        self.existing_group = PersistentRefViewSearch(path_type)
+        self.ref_widget = self.existing_group.ref_widget
+        self.connect(self.ref_widget,
+                     QtCore.SIGNAL("clicked(QModelIndex)"),
+                     self.ref_changed)
+        layout.addWidget(self.existing_group)
+
+        self.keep_local = QtGui.QCheckBox("Keep Local Version")
+        layout.addWidget(self.keep_local)
+        self.connect(self.keep_local, QtCore.SIGNAL("toggled(bool)"),
+                     self.local_toggle)
+        self.local_group = QtGui.QGroupBox()
+        local_layout = QtGui.QGridLayout()
+        self.local_path = self.get_chooser_layout()
+        if hasattr(self.local_path, 'pathname_edit'):
+            self.connect(self.local_path.pathname_edit,
+                         QtCore.SIGNAL("textChanged(QString)"),
+                         self.stateChange)
+        local_layout.addLayout(self.local_path,0,0,1,2)
+
+        self.r_priority_local = QtGui.QCheckBox("Read From Local Path")
+        local_layout.addWidget(self.r_priority_local,1,0)
+        self.write_managed_checkbox = QtGui.QCheckBox("Write To Local Path")
+        self.connect(self.write_managed_checkbox, QtCore.SIGNAL("toggled(bool)"),
+                     self.stateChange)
+        local_layout.addWidget(self.write_managed_checkbox,1,1)
+        self.local_group.setLayout(local_layout)
+        layout.addWidget(self.local_group)
+
+        if is_input:
+            self.r_priority_local.setEnabled(True)
+            self.write_managed_checkbox.setEnabled(False)
+        else:
+            self.r_priority_local.setEnabled(False)
+            self.write_managed_checkbox.setEnabled(True)
+
+        button_layout = QtGui.QHBoxLayout()
+        button_layout.setDirection(QtGui.QBoxLayout.RightToLeft)
+        button_layout.setAlignment(QtCore.Qt.AlignRight)
+        self.saveButton = QtGui.QPushButton("Save")
+        self.saveButton.setFixedWidth(100)
+        self.connect(self.saveButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.saveTriggered)
+        button_layout.addWidget(self.saveButton)
+        self.resetButton = QtGui.QPushButton("Reset")
+        self.resetButton.setFixedWidth(100)
+        self.connect(self.resetButton, QtCore.SIGNAL('clicked()'),
+                     self.resetTriggered)
+        button_layout.addWidget(self.resetButton)
+        layout.addLayout(button_layout)
+        self.setLayout(layout)
+
+    def saveTriggered(self, checked = False):
+        self.get_values()
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+        self.emit(QtCore.SIGNAL('doneConfigure'), self.module.id)
+        
+    def closeEvent(self, event):
+        self.askToSaveChanges()
+        event.accept()
+                
+    def resetTriggered(self):
+        self.set_values()
+        self.setUpdatesEnabled(True)
+        self.state_changed = False
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        
+    def stateChange(self, checked = False, old = None):
+        if not self.state_changed:
+            self.state_changed = True
+            self.saveButton.setEnabled(True)
+            self.resetButton.setEnabled(True)
+    
+    def managed_toggle(self, checked):
+        self.stateChange()
+        self.new_group.setEnabled(not checked)
+        self.existing_group.setEnabled(not checked)
+
+    def new_toggle(self, checked):
+        self.stateChange()
+        self.new_group.setEnabled(checked)
+        self.existing_group.setEnabled(not checked)
+        if not checked and self.keep_local.isChecked():
+            self.keep_local.setChecked(False)
+
+    def existing_toggle(self, checked):
+        self.stateChange()
+        self.existing_group.setEnabled(checked)
+        self.new_group.setEnabled(not checked)
+
+    def local_toggle(self, checked):
+        self.stateChange()
+        self.local_group.setEnabled(checked)
+
+    def new_file_changed(self):
+        self.stateChange()
+        new_file = str(self.new_file.get_path())
+        if new_file:
+            base_name = os.path.basename(new_file)
+        self.name_edit.setText(base_name)
+        self.keep_local.setChecked(True)
+        self.local_path.set_path(new_file)
+        self.r_priority_local.setChecked(True)
+        self.write_managed_checkbox.setChecked(False)
+
+    def ref_changed(self, index):
+        self.stateChange()
+        if self.keep_local.isChecked():
+            self.keep_local.setChecked(False)
+
+    def set_values(self):
+        from vistrails.core.modules.module_registry import get_module_registry
+        reg = get_module_registry()
+        PersistentRef = \
+            reg.get_descriptor_by_name(persistence_pkg, 'PersistentRef').module
+
+        def func_to_bool(function):
+            try:
+                value = function.parameters[0].strValue
+                if value and value == 'True':
+                    return True
+            except:
+                pass
+            return False
+
+        ref_exists = False
+        self.existing_ref = None
+        local_path = None
+        local_read = None
+        local_write = None
+        for function in self.module.functions:
+            if function.name == 'ref':
+                self.existing_ref = PersistentRef.translate_to_python(
+                    function.parameters[0].strValue)
+                self.ref_widget.set_id(self.existing_ref.id)
+                ref_exists = \
+                    self.ref_widget.set_version(self.existing_ref.version)
+                self.existing_ref._exists = ref_exists
+                print 'ref_exists:', ref_exists, self.existing_ref.id, \
+                    self.existing_ref.version
+            elif function.name == 'value':
+                if self.new_file:
+                    self.new_file.set_path(function.parameters[0].strValue)
+            elif function.name == 'localPath':
+                local_path = Path.translate_to_python(
+                    function.parameters[0].strValue).name
+            elif function.name == 'readLocal':
+                local_read = func_to_bool(function)
+            elif function.name == 'writeLocal':
+                local_write = func_to_bool(function)
+
+        if ref_exists:
+            self.managed_existing.setChecked(True)
+            self.existing_toggle(True)
+        elif self.managed_change and (not self.existing_ref or \
+                                          not self.existing_ref.id):
+            self.managed_change.setChecked(True)
+            self.managed_toggle(True)
+        else:
+            self.managed_new.setChecked(True)
+            self.new_toggle(True)
+            if self.existing_ref:
+                self.name_edit.setText(self.existing_ref.name)
+                self.tags_edit.setText(self.existing_ref.tags)
+        
+        if self.existing_ref:
+            if self.existing_ref.local_path:
+                self.keep_local.setChecked(True)
+                self.local_toggle(True)
+            else:
+                self.keep_local.setChecked(False)
+                self.local_toggle(False)
+            self.local_path.set_path(self.existing_ref.local_path)
+            self.r_priority_local.setChecked(self.existing_ref.local_read)
+            self.write_managed_checkbox.setChecked(
+                self.existing_ref.local_writeback)
+        else:
+            self.keep_local.setChecked(False)
+            self.local_toggle(False)
+
+        if local_path is not None:
+            if local_path:
+                self.keep_local.setChecked(True)
+                self.local_toggle(True)
+            else:
+                self.keep_local.setChecked(False)
+                self.local_toggle(False)
+            self.local_path.set_path(local_path)
+        if local_read is not None:
+            self.r_priority_local.setChecked(local_read)
+        if local_write is not None:
+            self.write_managed_checkbox.setChecked(local_write)
+        self.saveButton.setEnabled(False)
+        self.resetButton.setEnabled(False)
+        self.state_changed = False
+
+    def get_values(self):
+        from vistrails.core.modules.module_registry import get_module_registry
+        reg = get_module_registry()
+        PersistentRef = \
+            reg.get_descriptor_by_name(persistence_pkg, 'PersistentRef').module
+
+        functions = []
+        if self.new_file and self.new_file.get_path() and \
+                self.managed_new.isChecked():
+        # if self.new_file and self.new_file.get_path():
+            functions.append(('value', [self.new_file.get_path()]))
+        else:
+            functions.append(('value', None))
+            pass
+        ref = PersistentRef()
+        if self.managed_new.isChecked():
+            if self.existing_ref and not self.existing_ref._exists:
+                ref.id = self.existing_ref.id
+                ref.version = self.existing_ref.version
+            else:
+                ref.id = str(uuid.uuid1())
+                ref.version = None
+            # endif
+            ref.name = str(self.name_edit.text())
+            ref.tags = str(self.tags_edit.text())
+        elif self.managed_existing.isChecked():
+            (ref.id, ref.version, ref.name, ref.tags) = \
+                self.ref_widget.get_info()
+        if self.keep_local.isChecked():
+            functions.append(('localPath', [self.local_path.get_path()]))
+            functions.append(('readLocal', 
+                              [str(self.r_priority_local.isChecked())]))
+            functions.append(('writeLocal',
+                              [str(self.write_managed_checkbox.isChecked())]))
+#             ref.local_path = self.local_path.get_path()
+#             ref.local_read = self.r_priority_local.isChecked()
+#             ref.local_writeback = self.write_managed_checkbox.isChecked()
+        else:
+            ref.local_path = None
+            # functions.append(('localPath', None))
+            functions.append(('readLocal', None))
+            functions.append(('writeLocal', None))
+            pass
+        functions.append(('ref', [PersistentRef.translate_to_string(ref)]))
+        self.controller.update_functions(self.module, functions)
+
+class PersistentInputPathConfiguration(PersistentPathConfiguration):
+    def __init__(self, module, controller, parent=None, path_type=None):
+        PersistentPathConfiguration.__init__(self, module, controller, parent,
+                                          True, path_type)
+        
+class PersistentOutputPathConfiguration(PersistentPathConfiguration):
+    def __init__(self, module, controller, parent=None, path_type=None):
+        PersistentPathConfiguration.__init__(self, module, controller, parent,
+                                          False, path_type)
+
+class PersistentRefInlineWidget(QtGui.QWidget, ConstantWidgetMixin):
+    def __init__(self, param, parent=None):
+        self.param = param
+        self.strValue = param.strValue
+        contentsType = param.type
+        QtGui.QWidget.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        layout = QtGui.QHBoxLayout()
+        # FIXME Use a greyed QLineEdit?
+        # layout.addWidget(QtGui.QLabel("File Info:"))
+        button = QtGui.QPushButton("Configure")
+        button.setMaximumWidth(100)
+        self.connect(button, QtCore.SIGNAL('clicked()'), self.run_dialog)
+        layout.addWidget(button)
+        layout.setMargin(5)
+        layout.setSpacing(5)
+        self.setLayout(layout)
+        
+    def run_dialog(self):
+        dialog = PersistentRefDialog(self.param)
+        if dialog.exec_() == QtGui.QDialog.Accepted:
+            self.setContents("test")
+            #use same translate call?, False)
+
+    def contents(self):
+        return self.strValue
+
+    def setContents(self, strValue, silent=True):
+        self.strValue = strValue
+        if not silent:
+            self.update_parent()
+
+class PersistentInputFileConfiguration(PersistentInputPathConfiguration):
+    def __init__(self, module, controller, parent=None):
+        PersistentInputPathConfiguration.__init__(self, module, controller, 
+                                               parent, "blob")
+    def get_chooser_layout(self):
+        return PathChooserLayout(False, self)
+    
+class PersistentInputDirConfiguration(PersistentInputPathConfiguration):
+    def __init__(self, module, controller, parent=None):
+        PersistentInputPathConfiguration.__init__(self, module, controller, 
+                                               parent, "tree")
+
+    def get_chooser_layout(self):
+        return PathChooserLayout(True, self)
+
+class PersistentOutputFileConfiguration(PersistentOutputPathConfiguration):
+    def __init__(self, module, controller, parent=None):
+        PersistentOutputPathConfiguration.__init__(self, module, controller, 
+                                               parent, "blob")
+
+    def get_chooser_layout(self):
+        return PathChooserLayout(False, self)
+
+class PersistentOutputDirConfiguration(PersistentOutputPathConfiguration):
+    def __init__(self, module, controller, parent=None):
+        PersistentOutputPathConfiguration.__init__(self, module, controller, 
+                                               parent, "tree")
+
+    def get_chooser_layout(self):
+        return PathChooserLayout(True, self)
+    
+class PersistentConfiguration(QtGui.QDialog):
+    def __init__(self, parent=None):
+        QtGui.QDialog.__init__(self, parent)
+        self.setModal(False)
+        self.build_gui()
+        self.db_access = DatabaseAccessSingleton()
+
+    def build_gui(self):
+        layout = QtGui.QVBoxLayout()
+        self.ref_search = PersistentRefViewSearch(None)
+        self.ref_search.ref_widget.setSelectionMode(
+            QtGui.QAbstractItemView.ExtendedSelection)
+        layout.addWidget(self.ref_search)
+        
+        button_layout = QtGui.QHBoxLayout()
+        button_layout.setAlignment(QtCore.Qt.AlignRight)
+        write_button = QtGui.QPushButton("Write...")
+        write_button.setAutoDefault(False)
+        self.connect(write_button, QtCore.SIGNAL("clicked()"), self.write)
+        button_layout.addWidget(write_button)
+        delete_button = QtGui.QPushButton("Delete...")
+        delete_button.setAutoDefault(False)
+        self.connect(delete_button, QtCore.SIGNAL("clicked()"), self.delete)
+        button_layout.addWidget(delete_button)
+        layout.addLayout(button_layout)
+        self.setLayout(layout)
+        
+    def sizeHint(self):
+        return QtCore.QSize(800,320)
+
+    def write(self):
+        info_list = self.ref_search.ref_widget.get_info_list()
+        if len(info_list) < 1:
+            return
+        elif len(info_list) == 1:
+            # save single file/dir
+            info = info_list[0]
+            name = info[2]
+            chosen_path = QtGui.QFileDialog.getSaveFileName(
+                    self,
+                    'Save...',
+                    name)
+            if not chosen_path:
+                return
+
+            # FIXME really should move this calls to a higher level so
+            # we don't need to instantiate a module
+            if info[1] is None:
+                version = "HEAD"
+            else:
+                version = info[1]
+            repo.get_current_repo().get_path(info[0], version, None, 
+                                             chosen_path)
+        else:
+            # have multiple files/dirs
+            chosen_path = QtGui.QFileDialog.getExistingDirectory(
+                    self,
+                    'Save All to Directory...')
+            has_overwrite = False
+            # if untitled (no name, use the uuid)
+            for info in info_list:
+                if info[2]:
+                    name = info[2]
+                else:
+                    name = info[0]
+                full_path = os.path.join(chosen_path, name)
+                if os.path.exists(full_path):
+                    has_overwrite = True
+            if has_overwrite:
+                question_str = "One or more of the paths already exist.  " + \
+                    "Overwrite?"
+                ret_val = \
+                    QtGui.QMessageBox.question(self, "Overwrite", \
+                                                   question_str, \
+                                                   QtGui.QMessageBox.Cancel | \
+                                                   QtGui.QMessageBox.No | \
+                                                   QtGui.QMessageBox.Yes)
+                if ret_val != QtGui.QMessageBox.Yes:
+                    return
+
+            for info in info_list:
+                if info[1] is None:
+                    version = "HEAD"
+                else:
+                    version = info[1]
+                if info[2]:
+                    name = info[2]
+                else:
+                    name = info[0]
+                full_path = os.path.join(chosen_path, name)
+                repo.get_current_repo().git_get_path(info[0], version, None, 
+                                                     full_path)
+            
+    def delete(self):
+        QtGui.QMessageBox.critical(self, "Delete",
+                                   "This feature is not functional in the "
+                                   "current version of VisTrails and has been "
+                                   "disabled for this release.")
+        return
+
+        from init import PersistentPath
+        info_list = self.ref_search.ref_widget.get_info_list()
+        if len(info_list) < 1:
+            return
+
+        delete_str = "This will permanently delete the selected data " + \
+            "from the peristent store.  This cannot be undone.  Proceed?"
+        question_f = QtGui.QMessageBox.question
+        ret_val = question_f(self, "Delete", delete_str, \
+                                 QtGui.QMessageBox.Cancel | \
+                                 QtGui.QMessageBox.Ok)
+        if ret_val != QtGui.QMessageBox.Ok:
+            return
+            
+        git_util = PersistentPath()
+        db_access = DatabaseAccessSingleton()
+        # FIXME keep entry in database with flag for deleted?
+        # NEED TO update the model...
+        for info in info_list:
+            delete_where = {'id': info[0]}
+            if info[1] is None:
+                git_util.git_remove_path(info[0])
+                db_access.delete_from_database(delete_where)
+            else:
+                # FIXME implement delete for versions...
+                delete_where['version'] = info[1]
+                print "NOT IMPLEMENTED FOR VERSIONS!!"
+                
+                
+        
diff --git a/vistrails/packages/pipelineEdit/__init__.py b/vistrails/packages/pipelineEdit/__init__.py
new file mode 100644
index 0000000..ce8f86c
--- /dev/null
+++ b/vistrails/packages/pipelineEdit/__init__.py
@@ -0,0 +1,42 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""This package implements a very simple Qt GUI that can load a
+pipeline, change its parameters based on aliases, and execute them on
+the spreadsheet."""
+
+identifier = 'org.vistrails.vistrails.pipelineedit'
+name = 'Pipeline Editor'
+version = '0.0.2'
+old_identifiers = ['edu.utah.sci.vistrails.pipelineedit']
diff --git a/vistrails/packages/pipelineEdit/init.py b/vistrails/packages/pipelineEdit/init.py
new file mode 100644
index 0000000..61b4397
--- /dev/null
+++ b/vistrails/packages/pipelineEdit/init.py
@@ -0,0 +1,153 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+import vistrails.api
+from vistrails.core.utils import DummyView
+from vistrails.core.vistrail.controller import VistrailController
+
+class QPipelineEditor(QtGui.QWidget):
+    """QPipelineEditor is a simple widget that can load a vistrail,
+    select a pipeline and dipslay aliases of that pipeline."""
+    
+    def __init__(self, parent=None):
+        """ init(parent: QWidget) -> None
+        Construct and layout GUI elements
+
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setWindowTitle('Pipeline Editor')
+
+        self.vistrail = None
+        self.versions = []
+        
+        vbox = QtGui.QVBoxLayout()
+        self.setLayout(vbox)
+
+        hbox = QtGui.QHBoxLayout()
+        vbox.addLayout(hbox)
+
+        self.filenameLabel = QtGui.QLabel('Vistrail: N/A')
+        hbox.addWidget(self.filenameLabel)
+        self.browseButton = QtGui.QPushButton('Browse...')
+        hbox.addWidget(self.browseButton)
+        self.connect(self.browseButton, QtCore.SIGNAL('clicked()'),
+                     self.selectFile)
+
+        vbox.addWidget(QtGui.QLabel('Pipelines'))
+        self.pipelineList = QtGui.QListWidget()
+        vbox.addWidget(self.pipelineList)
+        self.connect(self.pipelineList, QtCore.SIGNAL('currentRowChanged(int)'),
+                     self.currentPipelineChanged)
+        
+        vbox.addWidget(QtGui.QLabel('Aliases'))
+        self.aliasTable = QtGui.QTableWidget(0, 2)
+        self.aliasTable.horizontalHeader().setStretchLastSection(True)
+        vbox.addWidget(self.aliasTable)
+
+        hbox = QtGui.QHBoxLayout()
+        vbox.addLayout(hbox)
+        self.executeButton = QtGui.QPushButton('Execute')
+        hbox.addWidget(self.executeButton)
+        self.connect(self.executeButton, QtCore.SIGNAL('clicked()'),
+                     self.execute)
+        
+    def selectFile(self):
+        """ selectFile() -> None
+        Open a file dialog and select a vistrail file. Then display a
+        list of tagged version on the pipeline list.
+
+        """
+        fn = QtGui.QFileDialog.getOpenFileName(self,
+                                               'Load Vistrail',
+                                               '.',
+                                               'Vistrail (*.vt)')
+        if not fn.isNull():
+            self.filenameLabel.setText('Vistrail: %s' % fn)
+            self.vistrail = vistrails.api.get_vistrail_from_file(str(fn))
+            for item in self.vistrail.get_tagMap().items():
+                self.versions.append(item)
+            self.pipelineList.clear()
+            self.pipelineList.addItems([version for (name, version) in self.versions])
+
+    def currentPipelineChanged(self, row):
+        """ currentPipelineChanged(row: int) -> None
+        When the current pipeline is changed in the pipeline list,
+        update the alias table with aliases in that pipeline.
+        
+        """
+        if row<0:
+            self.aliasTable.setRowCount(0)
+        else:
+            versionName = self.pipelineList.currentItem().text()
+            pipeline = self.vistrail.getPipelineVersionName(str(versionName))
+            aliases = pipeline.aliases.keys()
+            self.aliasTable.setRowCount(len(aliases))
+            row = 0
+            for name in aliases:
+                self.aliasTable.setItem(row, 0, QtGui.QTableWidgetItem(name))
+                value = pipeline.get_alias_str_value(name)
+                self.aliasTable.setItem(row, 1, QtGui.QTableWidgetItem(value))
+                row += 1
+
+    def execute(self):
+        """ execute() -> None
+        Execute the selected pipeline with the edited aliases
+
+        """
+        aliases = {}
+        for r in xrange(self.aliasTable.rowCount()):
+            name = str(self.aliasTable.item(r, 0).text())
+            value = str(self.aliasTable.item(r, 1).text())
+            aliases[name] = value
+
+        versionNumber = self.versions[self.pipelineList.currentIndex().row()][0]
+        pipeline = self.vistrail.getPipelineVersionNumber(versionNumber)
+        controller = VistrailController(self.vistrail)
+        controller.execute_workflow_list([(self.vistrail.locator,
+                                           versionNumber,
+                                           pipeline,
+                                           DummyView(),
+                                           aliases,
+                                           None)])
+
+def initialize(*args, **keywords):
+    """ initialize() -> None    
+    Package-entry to initialize the package. We just create and show
+    the main window, a QPipelineEditor widget, here.
+    
+    """
+    global mainWindow
+    mainWindow = QPipelineEditor()
+    mainWindow.show()
diff --git a/vistrails/packages/pythonCalc/__init__.py b/vistrails/packages/pythonCalc/__init__.py
new file mode 100644
index 0000000..e2f845f
--- /dev/null
+++ b/vistrails/packages/pythonCalc/__init__.py
@@ -0,0 +1,47 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""This package implements a very simple VisTrails module called
+PythonCalc. This is intended as a simple example that can be referred
+to by users to create their own packages and modules later.
+
+If you're interested in developing new modules for VisTrails, you
+should also consult the documentation in the User's Guide and in
+core/modules/vistrails_module.py.
+"""
+
+identifier = 'org.vistrails.vistrails.pythoncalc'
+name = 'PythonCalc'
+version = '0.9.1'
+old_identifiers = ['edu.utah.sci.vistrails.pythoncalc']
diff --git a/vistrails/packages/pythonCalc/init.py b/vistrails/packages/pythonCalc/init.py
new file mode 100644
index 0000000..32b73b6
--- /dev/null
+++ b/vistrails/packages/pythonCalc/init.py
@@ -0,0 +1,127 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+
+###############################################################################
+# PythonCalc
+#
+# A VisTrails package is simply a Python class that subclasses from
+# Module.  For this class to be executable, it must define a method
+# compute(self) that will perform the appropriate computations and set
+# the results.
+#
+# Extra helper methods can be defined, as usual. In this case, we're
+# using a helper method op(self, v1, v2) that performs the right
+# operations.
+
+class PythonCalc(Module):
+    """PythonCalc is a module that performs simple arithmetic operations
+on its inputs."""
+
+    # This constructor is strictly unnecessary. However, some modules
+    # might want to initialize per-object data. When implementing your
+    # own constructor, remember that it must not take any extra
+    # parameters.
+    def __init__(self):
+        Module.__init__(self)
+
+    # This is the method you should implement in every module that
+    # will be executed directly. VisTrails does not use the return
+    # value of this method.
+    def compute(self):
+        # getInputFromPort is a method defined in Module that returns
+        # the value stored at an input port. If there's no value
+        # stored on the port, the method will return None.
+        v1 = self.getInputFromPort("value1")
+        v2 = self.getInputFromPort("value2")
+
+        # You should call setResult to store the appropriate results
+        # on the ports.  In this case, we are only storing a
+        # floating-point result, so we can use the number types
+        # directly. For more complicated data, you should
+        # return an instance of a VisTrails Module. This will be made
+        # clear in further examples that use these more complicated data.
+        self.setResult("value", self.op(v1, v2))
+
+    def op(self, v1, v2):
+        op = self.getInputFromPort("op")
+        if op == '+':
+            return v1 + v2
+        elif op == '-':
+            return v1 - v2
+        elif op == '*':
+            return v1 * v2
+        elif op == '/':
+            return v1 / v2
+        # If a module wants to report an error to VisTrails, it should raise
+        # ModuleError with a descriptive error. This allows the interpreter
+        # to capture the error and report it to the caller of the evaluation
+        # function.
+        raise ModuleError(self, "unrecognized operation: '%s'" % op)
+
+###############################################################################
+# the function initialize is called for each package, after all
+# packages have been loaded. It is used to register the module with
+# the VisTrails runtime.
+
+def initialize(*args, **keywords):
+
+    # We'll first create a local alias for the module_registry so that
+    # we can refer to it in a shorter way.
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+
+    # VisTrails cannot currently automatically detect your derived
+    # classes, and the ports that they support as input and
+    # output. Because of this, you as a module developer need to let
+    # VisTrails know that you created a new module. This is done by calling
+    # function addModule:
+    reg.add_module(PythonCalc)
+
+    # In a similar way, you need to report the ports the module wants
+    # to make available. This is done by calling addInputPort and
+    # addOutputPort appropriately. These calls only show how to set up
+    # one-parameter ports. We'll see in later tutorials how to set up
+    # multiple-parameter plots.
+    reg.add_input_port(PythonCalc, "value1",
+                       (vistrails.core.modules.basic_modules.Float, 'the first argument'))
+    reg.add_input_port(PythonCalc, "value2",
+                       (vistrails.core.modules.basic_modules.Float, 'the second argument'))
+    reg.add_input_port(PythonCalc, "op",
+                       (vistrails.core.modules.basic_modules.String, 'the operation'),
+                       entry_types=['enum'], values=["['+', '-', '*', '/']"])
+    reg.add_output_port(PythonCalc, "value",
+                        (vistrails.core.modules.basic_modules.Float, 'the result'))
+
diff --git a/vistrails/packages/pythonCalcQt/__init__.py b/vistrails/packages/pythonCalcQt/__init__.py
new file mode 100644
index 0000000..de5584b
--- /dev/null
+++ b/vistrails/packages/pythonCalcQt/__init__.py
@@ -0,0 +1,51 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""This package implements a very simple Qt GUI over the PythonCalc
+package to provide an example of how a package may add GUI elements
+including independent windows, menu items as well as dependency
+requirements.
+
+If you're interested in developing new modules for VisTrails, you
+should also consult the documentation in the User's Guide and in
+core/modules/vistrails_module.py.
+"""
+
+identifier = 'org.vistrails.vistrails.pythoncalcqt'
+name = 'PythonCalcQt'
+version = '0.0.2'
+old_identifiers = ['edu.utah.sci.vistrails.pythoncalcqt']
+
+def package_dependencies():
+    return ['org.vistrails.vistrails.pythoncalc']
diff --git a/vistrails/packages/pythonCalcQt/init.py b/vistrails/packages/pythonCalcQt/init.py
new file mode 100644
index 0000000..8d885b7
--- /dev/null
+++ b/vistrails/packages/pythonCalcQt/init.py
@@ -0,0 +1,139 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+from PyQt4 import QtCore, QtGui
+import vistrails.api
+
+class QPythonCalc(QtGui.QWidget):
+    """QPythonCalc is a widget used for specifying PythonCalc
+    parameters and providing two buttons for compute and add that
+    module to the pipeline. """
+    
+    def __init__(self, parent=None):
+        """ init(parent: QWidget) -> None        
+        We construct a simple GUI with edit boxes for 2 operands and a
+        combo box for the operator. There are also 2 buttons: (1)
+        perform the calculation and display the result, (2) create a
+        PythonCalc module with the specified parameters and add to the
+        current pipeline.
+
+        """
+        QtGui.QWidget.__init__(self, parent)
+        self.setWindowTitle('PythonCalc GUI')
+        gridLayout = QtGui.QGridLayout()
+        self.setLayout(gridLayout)
+        gridLayout.addWidget(QtGui.QLabel('value1'), 0, 0)
+        gridLayout.addWidget(QtGui.QLabel('value2'), 1, 0)
+        gridLayout.addWidget(QtGui.QLabel('op'), 2, 0)
+        gridLayout.addWidget(QtGui.QLabel('result'), 3, 0)
+        
+        numberValidator = QtGui.QIntValidator(self)
+        self.value1Edit = QtGui.QLineEdit('0')
+        self.value2Edit = QtGui.QLineEdit('0')
+        self.value1Edit.setValidator(numberValidator)
+        self.value2Edit.setValidator(numberValidator)
+        gridLayout.addWidget(self.value1Edit, 0, 1)
+        gridLayout.addWidget(self.value2Edit, 1, 1)
+        
+        self.opCombo = QtGui.QComboBox()
+        self.opCombo.addItems(['+', '-', '*', '/'])
+        gridLayout.addWidget(self.opCombo, 2, 1)
+
+        self.resultLabel = QtGui.QLabel()
+        gridLayout.addWidget(self.resultLabel, 3, 1)
+
+        self.calculateButton = QtGui.QPushButton('Calculate')
+        gridLayout.addWidget(self.calculateButton, 4, 0)
+        self.connect(self.calculateButton, QtCore.SIGNAL('clicked()'),
+                     self.calculate)
+
+        self.createModuleButton = QtGui.QPushButton('Create Module')
+        gridLayout.addWidget(self.createModuleButton, 4, 1)
+        self.connect(self.createModuleButton, QtCore.SIGNAL('clicked()'),
+                     self.createModule)
+
+    def calculate(self):
+        """ calculate() -> None        
+        Perform the calculation based on value1, value2 and op,
+        similar to the PythonCalc module, but through the GUI.
+
+        """
+        result = eval(str(self.value1Edit.text() +
+                          self.opCombo.currentText() +
+                          self.value2Edit.text()))
+        self.resultLabel.setText(str(result))
+
+    def createModule(self):
+        """ createModule() -> None
+        Collect parameters, values and operator, and create a
+        PythonCalc module to the current pipeline using the API
+        provided in vistrails.api.
+
+        """
+        pythoncalc = "org.vistrails.vistrails.pythoncalc"
+        module = vistrails.api.add_module(0, 0, pythoncalc, 'PythonCalc', '')
+        vistrails.api.get_current_controller().update_function(module, 'value1',
+                                                     [str(self.value1Edit.text())])
+        vistrails.api.get_current_controller().update_function(module, 'value2',
+                                                     [str(self.value2Edit.text())])
+        vistrails.api.get_current_controller().update_function(module, 'op',
+                                                     [str(self.opCombo.currentText())])
+        vistrails.api.switch_to_pipeline_view()
+
+def initialize(*args, **keywords):
+    """ initialize() -> None    
+    Package-entry to initialize the package. We just create and show
+    the main window, a QPythonCalc widget, here.
+    
+    """
+    global mainWindow
+    mainWindow = QPythonCalc()
+    mainWindow.show()
+
+def menu_items():
+    """menu_items() -> tuple of (str,function)
+    It returns a list of pairs containing text for the menu and a
+    callback function that will be executed when that menu item is
+    selected. This will add a 'Create Module' menu item under the
+    Packages>PythonCalcQt menu. It has the same functionality as the
+    'Create Module' button, which adds a PythonCalc with specified
+    parameters module to the current pipeline.
+    
+    """
+    lst = []
+    global mainWindow
+    lst.append(("Create Module", mainWindow.createModule))
+    return tuple(lst)    
diff --git a/vistrails/packages/qgis/__init__.py b/vistrails/packages/qgis/__init__.py
new file mode 100644
index 0000000..fd91230
--- /dev/null
+++ b/vistrails/packages/qgis/__init__.py
@@ -0,0 +1,48 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import vistrails.core
+identifier = 'org.vistrails.vistrails.qgis'
+version = '0.0.2'
+name = "QGIS"
+old_identifiers = ['edu.utah.sci.vistrails.qgis']
+
+def package_dependencies():
+    import vistrails.core.packagemanager
+    manager = vistrails.core.packagemanager.get_package_manager()
+    if manager.has_package('org.vistrails.vistrails.spreadsheet'):
+        return ['org.vistrails.vistrails.spreadsheet']
+    else:
+        return []
+
diff --git a/vistrails/packages/qgis/init.py b/vistrails/packages/qgis/init.py
new file mode 100644
index 0000000..636bb01
--- /dev/null
+++ b/vistrails/packages/qgis/init.py
@@ -0,0 +1,172 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.modules.vistrails_module import Module
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+
+import qgis.core
+import qgis.gui
+
+import itertools
+import os
+
+class RasterLayer(Module):
+    _input_ports = [('file', '(basic:File)'), 
+                    ('name', '(basic:String)')]
+    _output_ports = [('self', '(RasterLayer)')]
+
+    def __init__(self):
+        Module.__init__(self)
+        self.qgis_obj = None
+
+    def compute(self):
+        fname = self.getInputFromPort('file').name
+        if self.hasInputFromPort('name'):
+            name = self.getInputFromPort('name')
+        else:
+            name = os.path.splitext(os.path.basename(fname))[0]
+        self.qgis_obj = qgis.core.QgsRasterLayer(fname, name)
+        self.setResult('self', self)
+
+class VectorLayer(Module):
+    _input_ports = [('file', '(basic:File)'), 
+                    ('name', '(basic:String)')]
+    _output_ports = [('self', '(VectorLayer)')]
+
+    def __init__(self):
+        Module.__init__(self)
+        self.qgis_obj = None
+
+    def compute(self):
+        fname = self.getInputFromPort('file').name
+        if self.hasInputFromPort('name'):
+            name = self.getInputFromPort('name')
+        else:
+            name = os.path.splitext(os.path.basename(fname))[0]
+        self.qgis_obj = qgis.core.QgsVectorLayer(fname, name, "ogr")
+        self.setResult('self', self)
+
+class QGISCell(SpreadsheetCell):
+    """
+    QGISCell is a VisTrails Module that can display QGIS inside a cell
+    
+    """
+    _input_ports = [('rasterLayers', '(RasterLayer)'),
+                    ('vectorLayers', '(VectorLayer)')]
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+    
+    def compute(self):
+        rasterLayers = self.forceGetInputListFromPort('rasterLayers')
+        vectorLayers = self.forceGetInputListFromPort('vectorLayers')
+        self.displayAndWait(QGISCellWidget, (rasterLayers, vectorLayers))
+
+class QGISCellWidget(QCellWidget):
+    """
+    QGISCellWidget is the actual QWidget taking the FigureManager
+    as a child for displaying figures
+    
+    """
+    def __init__(self, parent=None):
+        """ QGISCellWidget(parent: QWidget) -> QGISCellWidget
+        Initialize the widget with its central layout
+        
+        """
+        QCellWidget.__init__(self, parent)
+        centralLayout = QtGui.QVBoxLayout()
+        self.setLayout(centralLayout)
+        centralLayout.setMargin(0)
+        centralLayout.setSpacing(0)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Update the widget contents based on the input data
+        
+        """
+        (rasterLayers, vectorLayers) = inputPorts
+
+        canvas = qgis.gui.QgsMapCanvas()
+        canvas.show()
+
+        canvas.setCanvasColor(QtCore.Qt.white)
+        canvas.enableAntiAliasing(True)
+
+        for layer in itertools.chain(rasterLayers, vectorLayers):
+            print 'adding layer', layer.qgis_obj
+            qgis.core.QgsMapLayerRegistry.instance().addMapLayer(layer.qgis_obj)
+        
+        canvas.setExtent(rasterLayers[0].qgis_obj.extent())
+        canvas.setLayerSet([qgis.gui.QgsMapCanvasLayer(layer.qgis_obj) 
+                            for layer in itertools.chain(vectorLayers, 
+                                                         rasterLayers)])
+
+        # raster_fname = "/vistrails/local_packages/qgis/qgis_sample_data/raster/landcover.img"
+        # raster = qgis.core.QgsRasterLayer(raster_fname, os.path.splitext(os.path.basename(raster_fname))[0])
+        # qgis.core.QgsMapLayerRegistry.instance().addMapLayer(raster)
+
+        # layer = qgis.core.QgsVectorLayer("/vistrails/local_packages/qgis/qgis_sample_data/vmap0_shapefiles/majrivers.shp", "Rivers", "ogr")
+        # print layer.isValid()
+        # qgis.core.QgsMapLayerRegistry.instance().addMapLayer(layer)
+        # canvas.setLayerSet([qgis.gui.QgsMapCanvasLayer(layer), 
+        #                     qgis.gui.QgsMapCanvasLayer(raster)])
+    
+        self.layout().addWidget(canvas)
+
+        # Update the new figure canvas
+        self.update()
+
+    def grabWindowPixmap(self):
+        """ grabWindowPixmap() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        # return QtGui.QPixmap.grabWidget(self.figManager.canvas)
+        return None
+
+    def dumpToFile(self, filename):
+        pass
+
+    def saveToPDF(self, filename):
+        pass
+
+_modules = [RasterLayer, VectorLayer, QGISCell,]
+
+def initialize():
+    qgis.core.QgsApplication.setPrefixPath(
+        "/vistrails/local_packages/qgis/QGIS.app/Contents/MacOS", True)
+    qgis.core.QgsApplication.initQgis()
+
diff --git a/vistrails/packages/rpy/README b/vistrails/packages/rpy/README
new file mode 100644
index 0000000..49b996b
--- /dev/null
+++ b/vistrails/packages/rpy/README
@@ -0,0 +1,11 @@
+On the Mac, I needed to patch rpy2 2.0.8:
+
+rinterface/__init__.py:
+- R_HOME = os.popen("R RHOME").readlines()
++ p = os.popen("R RHOME")
++ time.sleep(1)
++ R_HOME = p.readlines()
+
+robjects/__init__.py:
+- import rpy2.robjects.conversion
++ import conversion
\ No newline at end of file
diff --git a/vistrails/packages/rpy/__init__.py b/vistrails/packages/rpy/__init__.py
new file mode 100644
index 0000000..b115553
--- /dev/null
+++ b/vistrails/packages/rpy/__init__.py
@@ -0,0 +1,39 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+name = "R"
+identifier = "org.vistrails.vistrails.rpy"
+version = "0.1.2"
+old_identifiers = ["edu.utah.sci.vistrails.rpy"]
+
diff --git a/vistrails/packages/rpy/init.py b/vistrails/packages/rpy/init.py
new file mode 100644
index 0000000..c0920ee
--- /dev/null
+++ b/vistrails/packages/rpy/init.py
@@ -0,0 +1,482 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import os
+import sys
+import tempfile
+import urllib
+import rpy2.robjects as robjects
+
+from vistrails.core.modules.basic_modules import File, Constant, \
+    new_constant
+
+from vistrails.core.modules.vistrails_module import Module, ModuleError, \
+    ModuleConnector, NotCacheable
+from vistrails.core.modules.basic_modules import new_constant
+import vistrails.core.modules.module_registry
+from widgets import RSourceConfigurationWidget, RFigureConfigurationWidget
+
+# FIXME when rpy2 is installed on the path, we won't need this
+old_sys_path = sys.path
+sys.path.append(os.path.dirname(__file__))
+sys.path = old_sys_path
+
+r_temp_files = []
+
+class TypeException(Exception):
+    pass
+
+def create_vector(v_list, desired_type=None):
+    is_bool = True
+    is_int = True
+    is_float = True
+    is_str = True
+    for elt in v_list:
+        if isinstance(elt, basestring):
+            is_bool = False
+            is_int = False
+            is_float = False
+        elif isinstance(elt, float):
+            is_bool = False
+            is_int = False
+        elif isinstance(elt, (int, long)):
+            is_bool = False
+        else:
+            is_bool = False
+            is_int = False
+            is_float = False
+            is_str = False
+            break
+ 
+    if is_bool and (desired_type is None or desired_type == bool):
+        return robjects.BoolVector(v_list)
+    elif is_int and (desired_type is None or desired_type == int):
+        res = [int(elt) for elt in v_list]
+        return robjects.IntVector(res)
+    elif is_float and (desired_type is None or desired_type == float):
+        res = [float(elt) for elt in v_list]
+        return robjects.FloatVector(res)
+    elif is_str and (desired_type is None or desired_type == str):
+        res = [str(elt) for elt in v_list]
+        return robjects.StrVector(res)
+    
+    if desired_type is not None:
+        raise TypeException("Cannot coerce vector to type '%s'" % desired_type)
+    return robjects.RVector(v_list)
+
+def vector_conv(v, desired_type=None):
+    v_list = eval(v)
+    return create_vector(v_list, desired_type)
+
+RVector = new_constant('RVector', staticmethod(vector_conv),
+                       robjects.Vector([]),
+                       staticmethod(lambda x: isinstance(x, robjects.Vector)))
+
+def bool_vector_conv(v):
+    return vector_conv(v, bool)
+
+RBoolVector = new_constant('RBoolVector' , staticmethod(bool_vector_conv), 
+                            robjects.BoolVector([]),
+                            staticmethod(lambda x: isinstance(x, robjects.Vector)),
+                            base_class=RVector)
+                       
+def int_vector_conv(v):
+    return vector_conv(v, int)
+
+RIntVector = new_constant('RIntVector' , staticmethod(int_vector_conv), 
+                            robjects.IntVector([]),
+                            staticmethod(lambda x: isinstance(x, robjects.Vector)),
+                            base_class=RVector)
+
+def float_vector_conv(v):
+    return vector_conv(v, float)
+
+RFloatVector = new_constant('RFloatVector' , staticmethod(float_vector_conv), 
+                            robjects.FloatVector([]),
+                            staticmethod(lambda x: isinstance(x, robjects.Vector)),
+                            base_class=RVector)
+                       
+def str_vector_conv(v):
+    return vector_conv(v, str)
+
+RStrVector = new_constant('RStrVector' , staticmethod(str_vector_conv), 
+                            robjects.StrVector([]),
+                            staticmethod(lambda x: isinstance(x, robjects.Vector)),
+                            base_class=RVector)
+
+def array_conv(v):
+    return robjects.r.array(vector_conv(v))
+
+RArray = new_constant('RArray', staticmethod(array_conv),
+                      robjects.r.array(),
+                      staticmethod(lambda x: isinstance(x, robjects.RArray)),
+                      base_class=RVector)
+
+def create_matrix(v_list):
+    vec_list = []
+    nrow = 0
+    ncol = -1
+    for v_sublist in v_list:
+        if ncol == -1:
+            ncol = len(v_sublist)
+        elif ncol != len(v_sublist):
+            raise TypeException("Matrix must be rectangular")
+        nrow += 1
+        vec_list.extend(v_sublist)
+    vec = create_vector(vec_list)
+    return robjects.r.matrix(vec, nrow=nrow)
+    
+def matrix_conv(v):
+    # should be a double list
+    v_list = eval(v)
+    create_matrix(v_list)
+
+def matrix_compute(self):
+    if self.hasInputFromPort('rvector'):
+        rvector = self.getInputFromPort('rvector')
+        nrows = self.getInputFromPort('nrows')
+        self.setResult('value', robjects.r.matrix(rvector, nrow=nrows))
+    else:
+        RArray.compute(self)
+
+RMatrix = new_constant('RMatrix', staticmethod(matrix_conv),
+                       robjects.r.matrix(),
+                       staticmethod(lambda x: isinstance(x, robjects.RArray)),
+                       base_class=RArray,
+                       compute=matrix_compute)
+RMatrix._input_ports.extend([('rvector', '(Types|RVector)'), 
+                             ('nrows', '(basic:Integer)')])
+
+def create_list(v_dict):
+    data_dict = {}
+    for k,v in v_dict.iteritems():
+        if isinstance(v, list):
+            data_dict[k] = create_vector(v)
+        elif isinstance(v, dict):
+            data_dict[k] = create_list(v)
+        else:
+            data_dict[k] = v
+    return robjects.r['list'](**data_dict)
+
+def list_conv(v):
+    v_dict = eval(v)
+    return create_list(v_dict)
+
+RList = new_constant('RList', staticmethod(list_conv),
+                     robjects.r.list(),
+                     staticmethod(lambda x: isinstance(x, robjects.Vector)),
+                     base_class=RVector)
+# compute=list_compute)
+
+def create_data_frame(v_dict):
+    data_dict = {}
+    for k,v in v_dict.iteritems():
+        if isinstance(v, list):
+            data_dict[k] = create_vector(v)
+        elif isinstance(v, dict):
+            data_dict[k] = create_data_frame(v)
+        else:
+            data_dict[k] = v
+    return robjects.r['data.frame'](**data_dict)
+
+def data_frame_conv(v):
+    v_dict = eval(v)
+    return create_data_frame(v_dict)
+
+RDataFrame = new_constant('RDataFrame', staticmethod(data_frame_conv),
+                          robjects.r['data.frame'](),
+                          staticmethod(lambda x: \
+                                           isinstance(x, robjects.RDataFrame)))
+                          
+class RVectorFromList(Module):
+    _input_ports = [('list', '(basic:List)')]
+    _output_ports = [('rvector', '(Types|RVector)')]
+
+    def compute(self):
+        ilist = self.getInputFromPort('list')
+        rvector = create_vector(ilist)
+        self.setResult('rvector', rvector)
+
+class ListFromRVector(Module):
+    _input_ports = [('rvector', '(Types|RVector)')]
+    _output_ports = [('list', '(basic:List)')]
+
+    def compute(self):
+        rvector = self.getInputFromPort('rvector')
+        olist = list(rvector)
+        self.setResult('list', olist)
+
+class RMatrixFromNestedList(Module):
+    _input_ports = [('list', '(basic:List)')]
+    _output_ports = [('rmatrix', '(Types|RMatrix)')]
+
+    def compute(self):
+        ilist = self.getInputFromPort('list')
+        rmatrix = create_matrix(ilist)
+        self.setResult('rmatrix', rmatrix)
+
+class NestedListFromRMatrix(Module):
+    _input_ports = [('rmatrix', '(Types|RMatrix)')]
+    _output_ports = [('list', '(basic:List)')]
+    
+    def compute(self):
+        rmatrix = self.getInputFromPort('rmatrix')
+        mlist = list(rmatrix)
+        nrows = rmatrix.nrow
+        ncols = len(mlist) / nrows
+        olist = [] 
+        for row in xrange(nrows):
+            olist.append(mlist[row*ncols:(row+1)*ncols])
+        self.setResult('list', olist)
+
+class RDataFrameFromDict(Module):
+    _input_ports = [('dict', '(basic:Dictionary)')]
+    _output_ports = [('rdataframe', '(Types|RDataFrame)')]
+    
+    def compute(self):
+        idict = self.getInputFromPort('dict')
+        rdataframe = create_data_frame(idict)
+        self.setResult('rdataframe', rdataframe)
+
+class DictFromRDataFrame(Module):
+    _input_ports = [('rdataframe','(Types|RDataFrame)')]
+    _output_ports = [('dict', '(basic:Dictionary)')]
+
+    def compute(self):
+        rdataframe = self.getInputFromPort('rdataframe')
+        colnames = list(rdataframe.colnames())
+        odict = {}
+        for i in xrange(len(rdataframe)):
+            # FIXME !!! just assume that each row can be converted to a list!!!
+            odict[colnames[i]] = list(rdataframe[i])
+        self.setResult('dict', odict)
+
+class RListFromDict(Module):
+    # _input_ports = [('dict', '(basic:Dictionary)')]
+    _input_ports = [('dict', '(basic:Module)')]
+    _output_ports = [('rlist', '(Types|RList)')]
+    
+    def compute(self):
+        idict = self.getInputFromPort('dict')
+        rlist = create_list(idict)
+        self.setResult('rlist', rlist)
+
+class DictFromRList(Module):
+    _input_ports = [('rlist', '(Types|RList)')]
+    # _output_ports = [('dict', '(basic:Dictionary)')]
+    _output_ports = [('dict', '(basic:Module)')]
+
+    def compute(self):
+        rlist = self.getInputFromPort('rlist')
+        colnames = list(rlist.names)
+        odict = {}
+        for i in xrange(len(rlist)):
+            # FIXME !!! just assume that each row can be converted to a list!!!
+            # FIXME this may need to be a list of lists
+            odict[colnames[i]] = list(rlist[i])
+        self.setResult('dict', odict)
+
+class RRead(Module):
+    _input_ports = [('file', '(basic:File)'),
+                    ('header', '(basic:Boolean)', True),
+                    ('sep', '(basic:String)', True),
+                    ('commentChar', '(basic:String)', True),
+                    ('quote', '(basic:String)', True),
+                    ('dec', '(basic:String)', True),
+                    ('fill', '(basic:Boolean)', True)]
+    _output_ports = [('rdataframe', '(Types|RDataFrame)')]
+
+    def do_read(self, read_cmd):
+        fname = self.getInputFromPort('file').name
+        options_dict = {}
+        for port in RRead._input_ports:
+            if port[0] != 'file' and self.hasInputFromPort(port):
+                options_dict[port] = self.getInputFromPort(port)
+        rdataframe = robjects.r[read_cmd](fname, **options_dict)
+        self.setResult('rdataframe', rdataframe)
+
+class RReadTable(RRead):
+    def compute(self):
+        self.do_read('read.table')
+
+class RReadCSV(RRead):
+    def compute(self):
+        self.do_read('read.csv')
+
+class RReadCSV2(RRead):
+    def compute(self):
+        self.do_read('read.csv2')
+    
+class RReadDelim(RRead):
+    def compute(self):
+        self.do_read('read.delim')
+
+class RReadDelim2(RRead):
+    def compute(self):
+        self.do_read('read.delim2')
+
+# class RSource(NotCacheable, Module):
+class RSource(Module):
+    _input_ports = [('source', '(basic:String)', True)]
+    def run_code(self, code_str,
+                 use_input=False,
+                 use_output=False,
+                 excluded_inputs=set(),
+                 excluded_outputs=set()):
+        """run_code runs a piece of code as a VisTrails module.
+        use_input and use_output control whether to use the inputport
+        and output port dictionary as local variables inside the
+        execution."""
+        import vistrails.core.packagemanager
+        def fail(msg):
+            raise ModuleError(self, msg)
+        def cache_this():
+            self.is_cacheable = lambda *args, **kwargs: True
+        if use_input:
+            inputDict = dict([(k, self.getInputFromPort(k))
+                              for k in self.inputPorts
+                              if k not in excluded_inputs])
+            for k,v in inputDict.iteritems():
+                robjects.globalEnv[k] = v
+        robjects.r(code_str)
+        if use_output:
+            for k in self.outputPorts:
+                if k not in excluded_outputs and k in robjects.globalEnv:
+                    self.setResult(k, robjects.globalEnv[k])
+
+    def run_file(self, fname, excluded_inputs=set(['source']), 
+                 excluded_outputs=set()):
+        f = open(fname, 'rU')
+        code_str = f.readlines()
+        f.close()
+        self.run_code(code_str, use_input=True, use_output=True,
+                      excluded_inputs=excluded_inputs,
+                      excluded_outputs=excluded_outputs)
+
+    def set_variable(self, name, value):
+        robjects.globalEnv[name] = value
+
+    def get_variable(self, name):
+        # return robjects.globalEnv[name]
+        return robjects.r(name)
+
+    def chdir(self, dir):
+        robjects.r('setwd("%s")' % dir)
+
+    def compute(self):
+        code_str = urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        self.run_code(code_str, use_input=True, use_output=True,
+                      excluded_inputs=set(['source']))
+
+class RFigure(RSource):
+    _output_ports = [('imageFile', '(basic:File)')]
+    def run_figure(self, code_str, graphics_dev, width, height, 
+                   excluded_inputs=set(['source'])):
+        fname = self.interpreter.filePool.create_file(prefix='vtr', suffix='.' + graphics_dev)
+        r_temp_files.append(fname)
+        robjects.r[graphics_dev](file=fname, width=width, height=height)
+        self.run_code(code_str, use_input=True, 
+                      excluded_inputs=excluded_inputs)
+        robjects.r['dev.off']()
+        image_file = File()
+        image_file.name = fname
+        image_file.upToDate = True
+        self.setResult('imageFile', image_file)
+
+    def run_figure_file(self, fname, graphics_dev, width, height, 
+                        excluded_inputs=set(['source'])):
+        f = open(fname)
+        code_str = f.readlines()
+        f.close()
+        self.run_figure(code_str, graphics_dev, width, height, excluded_inputs)
+
+class RSVGFigure(RFigure):
+    def compute(self):
+        code_str = \
+            urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        RFigure.run_figure(self, code_str, 'svg', 4, 3)
+
+class RPNGFigure(RFigure):
+    def compute(self):
+        code_str = \
+            urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        RFigure.run_figure(self, code_str, 'png', 640, 480)
+
+class RPDFFigure(RFigure):
+    def compute(self):
+        code_str = \
+            urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        RFigure.run_figure(self, code_str, 'pdf', 4, 3)
+
+class RFactor(Module):
+    pass
+
+_modules = {None: [(RSource, 
+                    {'configureWidgetType': RSourceConfigurationWidget})],
+            'Types': [RVector, 
+                      RBoolVector,
+                      RIntVector,
+                      RFloatVector,
+                      RStrVector,
+                      RArray,
+                      RMatrix,
+                      RDataFrame,
+                      RList,
+                      RFactor],
+            'Readers': [(RRead, {'abstract': True}),
+                         RReadTable,
+                         RReadCSV,
+                         RReadCSV2,
+                         RReadDelim,
+                         RReadDelim2],
+            'Converters': [RVectorFromList,
+                           ListFromRVector,
+                           RMatrixFromNestedList,
+                           NestedListFromRMatrix,
+                           RDataFrameFromDict,
+                           DictFromRDataFrame,
+                           RListFromDict,
+                           DictFromRList],
+            'Figures': [(RFigure, {'abstract': True}),
+                        (RSVGFigure, {'configureWidgetType': \
+                                          RFigureConfigurationWidget}),
+                        (RPNGFigure, {'configureWidgetType': \
+                                          RFigureConfigurationWidget}),
+                        (RPDFFigure, {'configureWidgetType': \
+                                          RFigureConfigurationWidget})]
+            }
+
+def finalize():
+    for file in r_temp_files:
+        os.remove(file)
diff --git a/vistrails/packages/rpy/widgets.py b/vistrails/packages/rpy/widgets.py
new file mode 100644
index 0000000..dc599b4
--- /dev/null
+++ b/vistrails/packages/rpy/widgets.py
@@ -0,0 +1,46 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.gui.modules.source_configure import SourceConfigurationWidget
+
+class RSourceConfigurationWidget(SourceConfigurationWidget):
+
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, None,
+                                           True, True, parent)
+
+class RFigureConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, None,
+                                           True, False, parent)
diff --git a/vistrails/packages/spreadsheet/__init__.py b/vistrails/packages/spreadsheet/__init__.py
new file mode 100644
index 0000000..280fd6d
--- /dev/null
+++ b/vistrails/packages/spreadsheet/__init__.py
@@ -0,0 +1,39 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+from identifiers import *
+
+# This must be here because of VisTrails protocol
+from spreadsheet_config import configuration
diff --git a/vistrails/packages/spreadsheet/analogy_api.py b/vistrails/packages/spreadsheet/analogy_api.py
new file mode 100644
index 0000000..0562f3d
--- /dev/null
+++ b/vistrails/packages/spreadsheet/analogy_api.py
@@ -0,0 +1,133 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file describes the analogy structure the spreadsheet holding
+# and it should be reimplemented to integrate between the spreadsheet
+# and the analogy
+################################################################################
+import os
+import vistrails.core.analogy
+import vistrails.gui
+
+class SpreadsheetAnalogyObject(object):
+    """
+    SpreadsheetAnalogyObject provides a API functions to integrate
+    between the spreadsheet and the analogy. There will be only one
+    instance of the analogy object
+    
+    """
+    def __init__(self):
+        """ SpreadsheetAnalogyObject() -> SpreadsheetAnalogyObject
+        Initialize object properties
+        
+        """
+        pass
+
+    def isValid(self):
+        """ isValid() -> bool        
+        Is the current analogy object is valid and can be applied to
+        other pipeline
+        
+        """
+        return True
+        
+    def createAnalogy(self, p1Info, p2Info):
+        """ createAnalogy(p1Info: tuple, p2Info) -> bool        
+        p1Info, p2Info: (vistrailName, versionNumber, actions, pipeline)
+        
+        Setup an analogy object from p1 to p2 given their info in
+        p1Info and p2Info. CAUTION: sometimes the actual 'pipeline' on
+        the spreadsheet is different than the one created from the
+        vistrailName:versionNumber. For example, the parameter
+        exploration.  If that is the case, actions is a list of all
+        actions has performed on the original pipeline to get to the
+        pipeline.
+
+        This function should return a boolean saying if the analogy
+        has been successfully created or not.
+        
+        """
+#         (p1_vistrail, p1_number, p1_actions, p1_pipeline) = p1Info
+#         (p2_vistrail, p2_number, p2_actions, p2_pipeline) = p2Info
+        self._p1Info = p1Info
+        self._p2Info = p2Info
+        return True
+
+    def applyAnalogy(self, pInfo):
+        """ createAnalogy(pInfo: tuple) -> pInfo
+        pInfo: (vistrailName, versionNumber, actions, pipeline)
+
+        Given the analogy, apply on the pipeline in pInfo and return
+        the modified pipeline as a result. Along with the pipeline is
+        the list of actions that has been applied. If no actions
+        given (i.e. []), this can not be put back to the builder. If
+        analogy is not applicable, this should return None
+        
+        """
+
+        (p1_locator, p1_number, p1_actions, p1_pipeline, p1_controller) = self._p1Info
+        (p2_locator, p2_number, p2_actions, p2_pipeline, p2_controller) = self._p2Info
+        (p3_locator, p3_number, p3_actions, p3_pipeline, p3_controller) = pInfo
+
+        if (p1_controller != p2_controller or
+            p1_controller != p3_controller or
+            p1_actions or
+            p2_actions or
+            p3_actions):
+            return None
+
+        perform = vistrails.core.analogy.perform_analogy_on_vistrail
+
+        controller = p1_controller
+        vt = controller.vistrail
+        if controller.current_version != p3_number:
+            controller.change_selected_version(p3_number)
+        action = perform( vt, p1_number, p2_number, p3_number)
+        
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        
+        new_version = controller.current_version
+        new_pipeline = vt.getPipeline(new_version)
+        return (controller.locator, new_version, [], new_pipeline, controller)
+
+    def __call__(self):
+        """ __call__() -> SpreadsheetAnalogy
+        Return self for calling method
+        
+        """
+        return self
+
+SpreadsheetAnalogy = SpreadsheetAnalogyObject()
diff --git a/vistrails/packages/spreadsheet/basic_widgets.py b/vistrails/packages/spreadsheet/basic_widgets.py
new file mode 100644
index 0000000..1228529
--- /dev/null
+++ b/vistrails/packages/spreadsheet/basic_widgets.py
@@ -0,0 +1,267 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file describes basic VisTrails Modules of the Spreadsheet package:
+#   CellLocation
+#   SheetReference
+#   SingleCellSheetReference
+#   SpreadsheetCell
+################################################################################
+from vistrails.core.modules.vistrails_module import Module, NotCacheable, ModuleError
+from spreadsheet_base import (StandardSheetReference,
+                              StandardSingleCellSheetReference)
+from spreadsheet_controller import spreadsheetController
+from spreadsheet_event import DisplayCellEvent
+from PyQt4 import QtCore
+
+################################################################################
+
+def widgetName():
+    """ widgetName() -> str
+    Identify the name of the package
+    
+    """
+    return 'Basic Widgets'
+
+def registerWidget(reg, basicModules, basicWidgets):
+    """ registerWidget(reg: module_registry, basicModules: package,
+                       basicWidgets:package) -> None
+    Register widgets with VisTrails registry
+    
+    """
+    reg.add_module(SheetReference)
+    reg.add_input_port(SheetReference, "MinRowCount", basicModules.Integer, True)
+    reg.add_input_port(SheetReference, "MinColumnCount",
+                       basicModules.Integer, True)
+    reg.add_input_port(SheetReference, "SheetName", basicModules.String, True)
+    reg.add_output_port(SheetReference, "self", SheetReference)
+     
+    reg.add_module(CellLocation)
+    reg.add_input_port(CellLocation, "ColumnRowAddress",
+                       basicModules.String, True)
+    reg.add_input_port(CellLocation, "Row", basicModules.Integer, True)
+    reg.add_input_port(CellLocation, "Column", basicModules.Integer, True)
+    reg.add_input_port(CellLocation, "RowSpan", basicModules.Integer, True)
+    reg.add_input_port(CellLocation, "ColumnSpan", basicModules.Integer, True)
+    reg.add_input_port(CellLocation, "SheetReference", SheetReference)
+    reg.add_output_port(CellLocation, "self", CellLocation)
+
+    reg.add_module(SpreadsheetCell)
+    reg.add_input_port(SpreadsheetCell, "Location", CellLocation)
+
+    reg.add_module(SingleCellSheetReference)
+    reg.add_input_port(SingleCellSheetReference, "SheetName",
+                       basicModules.String, True)
+    reg.add_output_port(SingleCellSheetReference, "self",
+                        SingleCellSheetReference)
+     
+class SheetReference(Module):
+    """
+    SheetReference is a VisTrail Module that allows users to specify
+    which sheet (page) to put the visualiation on. This is as
+    well a wrapper to simply contain real sheet reference classes
+    
+    """
+    def __init__(self):
+        """ SheetReference() -> SheetReference
+        Instantiate an empty SheetReference
+        
+        """
+        Module.__init__(self)
+        self.sheetReference = None
+
+    def compute(self):
+        """ compute() -> None
+        Store information on input ports and ready to be passed on to whoever
+        needs it
+        
+        """
+        if self.sheetReference==None:
+            self.sheetReference = StandardSheetReference()
+        ref = self.sheetReference
+        ref.minimumRowCount = self.forceGetInputFromPort("MinRowCount", 1)
+        ref.minimumColumnCount = self.forceGetInputFromPort("MinColumnCount", 1)
+        ref.sheetName = self.forceGetInputFromPort("SheetName")
+
+    def getSheetReference(self):
+        """ getSheetReference() -> subclass of StandardSheetReference
+        Return the actual information stored in the SheetReference
+        
+        """
+        return self.sheetReference
+
+class CellLocation(Module):
+    """
+    CellLocation is a Vistrail Module that allow users to specify
+    where to put a visualization on a sheet, i.e. row, column
+    location
+    
+    """
+    def __init__(self):
+        """ CellLocation() -> CellLocation
+        Instantiate an empty cell location, i.e. any available cell
+        
+        """
+        Module.__init__(self)
+        self.row = -1
+        self.col = -1
+        self.rowSpan = -1
+        self.colSpan = -1
+        self.sheetReference = None
+
+    def compute(self):
+        """ compute() -> None
+        Translate input ports into (row, column) location
+        
+        """
+        def set_row_col(row, col):
+            try:
+                self.col = ord(col)-ord('A')
+                self.row = int(row)-1
+            except:
+                raise ModuleError(self, 'ColumnRowAddress format error')
+            
+        ref = self.forceGetInputFromPort("SheetReference")
+        if ref:
+            self.sheetReference = ref.getSheetReference()
+
+        self.rowSpan = self.forceGetInputFromPort("RowSpan", -1)
+        self.colSpan = self.forceGetInputFromPort("ColumnSpan", -1)
+        if self.hasInputFromPort("Row") and self.hasInputFromPort("Column"):
+            self.row = self.getInputFromPort("Row")-1
+            self.col = self.getInputFromPort("Column")-1
+        elif self.hasInputFromPort("ColumnRowAddress"):
+            address = self.getInputFromPort("ColumnRowAddress")
+            address = address.replace(' ', '').upper()
+            if len(address)>1:
+                if address[0] >= 'A' and address[0] <= 'Z':
+                    set_row_col(address[1:], address[0])
+                else:
+                    set_row_col(address[:-1], address[-1])
+
+class SpreadsheetCell(NotCacheable, Module):
+    """
+    SpreadsheetCell is a base class to other widget types. It provides
+    a simple protocol to dispatch information to the spreadsheet
+    cells. But it doesn't know how to display the information
+    itself. That should be done by the specific widget type.
+    
+    """
+    def __init__(self):
+        """ SpreadsheetCell() -> SpreadsheetCell
+        Initialize attributes
+        
+        """
+        Module.__init__(self)
+        self.location = None
+    
+    def overrideLocation(self, location):
+        """ overrideLocation(location: CellLocation) -> None        
+        Make the cell always use this location instead of reading from
+        the port
+        
+        """
+        self.location = location
+
+    def createDisplayEvent(self, cellType, inputPorts):
+        """ display(cellType: python type, iputPorts: tuple) -> None        
+        Create a DisplayEvent with all the parameters from the cell
+        locations and inputs
+        
+        """
+        e = DisplayCellEvent()
+        e.vistrail = self.moduleInfo
+        if self.location:
+            location = self.location
+        else:
+            location = self.forceGetInputFromPort("Location")
+        if location:
+            e.row = location.row
+            e.col = location.col
+            e.rowSpan = location.rowSpan
+            e.colSpan = location.colSpan
+            e.sheetReference = location.sheetReference
+        e.cellType = cellType
+        e.inputPorts = inputPorts
+        return e
+    
+    def display(self, cellType, inputPorts):
+        """ display(cellType: python type, iputPorts: tuple) -> None
+        Dispatch the cellType to the spreadsheet with appropriate input data
+        to display it
+
+        Keyword arguments:
+        cellType   --- widget type, this is truely a python type
+        inputPorts --- a tuple of input data that cellType() will understand
+        
+        """
+        if spreadsheetController.echoMode():
+            return self.displayAndWait(cellType, inputPorts)
+        e = self.createDisplayEvent(cellType, inputPorts)
+        spreadsheetController.postEventToSpreadsheet(e)
+
+    def displayAndWait(self, cellType, inputPorts):
+        """ displayAndWait(cellType: python type, iputPorts: tuple)
+        Send the message and wait for the cell to complete its movement
+        constructed to return it
+
+        Keyword arguments:
+        cellType   --- widget type, this is truely a python type
+        inputPorts --- a tuple of input data that cellType() will understand
+        
+        """
+        e = self.createDisplayEvent(cellType, inputPorts)
+        QtCore.QCoreApplication.processEvents()
+        spreadsheetWindow = spreadsheetController.findSpreadsheetWindow()
+        if spreadsheetWindow.echoMode == False:
+            spreadsheetWindow.configShow(show=True)
+        return spreadsheetWindow.displayCellEvent(e)
+
+class SingleCellSheetReference(SheetReference):
+    """
+    SingleCellSheetReference is a wrapper of StandardSingleCellSheetReference
+    that will allow users to dedicate a whole sheet to view a single
+    visualization by pass all other sheet control widgets.
+    
+    """
+    def compute(self):
+        """ compute() -> None
+        Store information from input ports into internal structure
+        
+        """
+        if self.sheetReference==None:
+            self.sheetReference = StandardSingleCellSheetReference()
+        self.sheetReference.sheetName = self.forceGetInputFromPort("SheetName")
+
diff --git a/vistrails/packages/spreadsheet/cell_rc.py b/vistrails/packages/spreadsheet/cell_rc.py
new file mode 100644
index 0000000..134c0aa
--- /dev/null
+++ b/vistrails/packages/spreadsheet/cell_rc.py
@@ -0,0 +1,3259 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created: Fri Nov 30 16:53:17 2007
+#      by: The Resource Compiler for PyQt (Qt v4.2.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x33\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9c\xed\xbd\x79\x9c\x1d\x57\
+\x79\xe7\xfd\x7d\x4e\xd5\x5d\x7a\xd7\xda\xda\x2d\xdb\x92\x77\x79\
+\x37\xb6\x71\x26\x36\x06\x13\xe2\x04\xc2\x92\x18\x48\x08\x0a\x19\
+\xf2\x4e\x98\x30\x21\x21\x04\xb2\xcd\xe7\x93\x99\x24\x84\x21\x0c\
+\x49\xde\x37\x13\x66\x86\x84\x64\x42\xc0\x01\x4c\x20\x4c\x06\x08\
+\x13\x36\x93\x78\x03\x1b\x6f\xb2\x8c\x65\xc9\x96\xd5\x52\x4b\xea\
+\x56\xb7\x7a\xbb\x5b\xd5\x39\xcf\xf3\xfe\x71\xea\xde\xbe\x6a\xc9\
+\x2b\x96\x5a\xc6\xfa\x7d\x54\xaa\x7b\xeb\x56\xdd\x3e\x75\x9f\xdf\
+\x79\xb6\xf3\x9c\x53\x70\x0a\xa7\x70\x0a\xa7\x70\x0a\xa7\x70\x0a\
+\xa7\x70\x0a\xa7\x70\x0a\x2f\x2e\x88\x99\x2d\x76\x1b\x4e\x61\x11\
+\xe1\x16\xbb\x01\xa7\xb0\xb8\x38\x45\x80\x17\x39\x4e\x11\xe0\x45\
+\x8e\x74\xb1\x1b\xb0\x98\xb8\xe2\x8a\x2b\x3a\x0e\xd0\xdd\x77\xdf\
+\x2d\x8b\xd9\x96\xc5\xc2\x29\x0d\xf0\x22\xc7\x8b\x5a\x03\x74\x43\
+\x44\x56\x03\x55\xa0\x09\x4c\x99\x59\x73\x91\x9b\x74\x42\x70\x8a\
+\x00\xf3\xb8\x04\x58\x0d\x1c\x00\xee\x2b\xf6\x3f\xf0\x38\x45\x80\
+\x79\xac\x06\x4e\x2f\x5e\x57\x17\xb1\x1d\x27\x14\xa7\x7c\x80\x17\
+\x39\x5e\xb4\x1a\x60\xec\xcd\x72\xd3\x0f\xf7\x9f\xd9\x79\xff\xfa\
+\x4b\x79\xc9\x7f\xbc\x97\xf1\x45\x6c\xd2\xa2\xe0\x07\x36\x15\x3c\
+\xf6\x66\x59\x0f\xbc\x14\xb8\x1a\xd8\x00\xdc\xf4\x1c\xbe\xe6\x16\
+\x60\x04\xb8\x13\xb8\x63\xf8\x53\xb6\xf7\xf9\x6b\xe1\xc9\x81\x1f\
+\x28\x02\x8c\xbd\x59\x6e\x22\x0a\xfa\xb9\x08\xfb\x99\xe2\x16\xe0\
+\x96\xe1\x4f\xd9\x2d\xc7\xf1\x6f\x9c\x30\xbc\xe0\x09\x30\xf6\x66\
+\xb9\x1a\xf8\x35\x9e\xa5\xd0\x67\x72\xbe\x74\x7f\x6b\xe9\x8f\xb5\
+\xdf\xaf\x08\x87\xef\x3d\x6f\x88\x4b\x9f\xe5\x9f\xbf\x05\xf8\xe3\
+\xe1\x4f\xd9\x9d\xcf\xf2\xba\x93\x06\x2f\x58\x02\x8c\xbd\x59\xde\
+\x0d\xbc\x9b\xa8\xde\x8f\x82\xc1\xde\x66\xe0\xbb\xdf\x36\xf2\x3d\
+\x46\xf2\x59\xc7\x80\x29\xa9\x19\xa9\x4b\x19\x2e\x57\x39\x6b\xe1\
+\x35\xcd\x39\xf6\xfa\x8c\x29\x71\xe4\x22\x84\x1b\x73\x5a\xab\x81\
+\x4b\x85\x74\x6d\x2f\x9b\x7a\x12\x56\x3c\x49\x73\x46\x80\x3f\x19\
+\xfe\x94\xfd\xc9\xf3\x76\x83\x27\x08\x2f\x38\x02\x14\x6a\xfe\xc3\
+\x1c\x43\xf0\xb3\xc6\x97\xbf\x04\x33\x9f\x12\x06\x5d\xc2\x65\x2e\
+\x61\xd5\xf3\xf5\x77\x7d\xce\x74\x6b\x8e\xdd\x3f\xea\x69\xdc\xe0\
+\xe8\x3d\x7f\x80\x8b\x16\x9e\x63\xb0\x57\x8d\xf7\xac\xf9\xb4\x7d\
+\xe6\xf9\xfa\xbb\xc7\x1b\x2f\x18\x02\x14\xaa\xfe\x8f\x89\x8e\x5d\
+\x07\x19\x7c\xf7\x0b\xf0\xbd\x4f\x25\x9c\xe3\x12\x2e\x5f\x78\xdd\
+\xf0\x86\x61\x00\x56\x6d\x58\xd9\x39\x56\xe9\xad\x30\xb4\x7c\xe8\
+\xa8\xbf\x31\x3d\x31\x4d\xab\xde\xea\xbc\x3f\x38\x12\x83\x82\xb1\
+\x91\xb1\xa3\xce\x6d\xce\x31\xf2\xf2\x3a\x63\x6f\xaa\xb2\x72\x6d\
+\x95\xd3\xba\x3f\xf3\xc6\xb7\x9b\x81\x5f\x3b\xf3\xb3\x76\xdb\xb3\
+\xb9\xc7\xc5\xc0\x0b\x82\x00\x63\x6f\x96\xcf\xb0\xc0\xc6\xd7\xe1\
+\x8b\xbf\xe3\x18\xdf\x9b\xf2\xb6\xee\xe3\xc3\x1b\x86\x59\xb5\x61\
+\x25\x9b\xcf\xbc\x88\x25\x43\x2b\x58\x39\xb0\x91\xde\x4a\x14\xf6\
+\xca\x81\x8d\xf4\x55\x8e\x16\x7c\xad\x35\xcd\xf8\xec\x13\xf1\x7b\
+\x8b\xd7\xf5\xd6\x0c\x87\x66\xf7\x74\xce\x69\xd6\x5b\xcc\x4c\x4c\
+\x73\x70\x64\xfc\x28\x42\x54\x0f\x72\xf7\x7b\x13\xfa\x2e\x1a\xe4\
+\xbc\xee\xe3\xb9\xf2\xf9\xf5\xb7\x70\x93\x99\x85\xef\xe3\xf6\x8f\
+\x2b\x4e\x6a\x02\x14\xa1\xdc\x67\xe8\xea\xf5\x39\xdc\xf3\xff\x39\
+\x76\xdd\x99\xf2\xc6\xf6\xb1\xe1\x0d\xc3\x5c\x7c\xf1\x95\x9c\xb5\
+\xf9\x62\x4e\x5b\xbe\x85\x15\x03\xa7\x1d\xeb\xeb\x9e\x13\x0e\xcd\
+\xee\x61\xcf\xc4\x36\x0e\xcd\x8e\x30\x31\x37\x32\xdf\xb6\x91\xb1\
+\xa3\xc8\x70\xe6\x21\xee\xff\x0f\x25\x56\x6c\xe8\x61\x5d\xfb\x58\
+\xa6\xdc\x73\xcf\x04\x3f\xfd\xba\xaf\xb3\xcb\xcc\xf4\x79\x6b\xd8\
+\xf3\x84\x93\x96\x00\x85\xca\xff\x0c\x5d\xb6\xfe\x13\x8e\x2f\x7d\
+\x21\xa5\xe3\xb9\x5f\x70\xd9\x45\xbc\xf4\xea\x57\xb1\x65\xe3\xb5\
+\xf4\x96\x07\x8f\x7b\x9b\xea\xd9\x0c\x8f\xec\xbf\x9d\x91\x89\xed\
+\x34\xb2\x19\x20\x6a\x86\x91\x1d\x23\xec\x79\x64\x9e\x1c\x2f\x9d\
+\xe4\xe1\x5f\xeb\x9f\xd7\x06\x99\x72\xf0\xbe\x49\x7e\xfe\x35\x5f\
+\xe3\x6b\x66\x96\x1d\xf7\x86\x3e\x0b\x9c\x94\x04\x28\x7a\x7e\xe7\
+\x17\x55\x18\xfd\x4f\x25\xd2\x87\x85\x61\x80\x4b\xaf\xb9\x82\xeb\
+\xaf\x79\x3d\x67\xaf\xbe\x7a\xd1\xda\xb8\xe3\xc0\x9d\xec\x38\xf8\
+\xed\x0e\x11\x00\xf6\x3c\x32\xc2\xa3\xf7\xed\x04\xe0\xac\x9c\xd9\
+\xdf\xcc\xb1\xc1\x94\x0e\x33\xff\xeb\x43\xbc\xf4\x43\xdb\xb8\x0f\
+\x68\xd9\x49\xf2\xc3\x9f\x74\x04\x28\x84\x7f\x3b\x45\xcf\x9f\x16\
+\x76\xfc\x46\xca\xd9\x13\x02\x43\xcb\x07\xf9\xc9\x9f\x7a\x3b\x97\
+\x6d\xfe\xd1\xc5\x6d\x64\x17\x1e\x1c\xf9\x1a\x3b\x0f\x7e\xa7\xf3\
+\xbe\x59\x6f\xb1\xed\xf6\x6d\x4c\x4f\xcc\xb0\xdc\xe0\x37\x6b\x1c\
+\x3a\xbd\x1c\xc3\xc7\x46\xe0\xd0\x1f\x3e\xc0\x4d\x1f\xdd\xc1\x3d\
+\x40\xed\x64\x30\x09\x27\x23\x01\x6e\xa7\xb0\xf9\x2d\x98\xf8\xd9\
+\x32\xcb\x01\xce\xbb\x64\x0b\x6f\x7c\xcd\xbb\x58\xd6\xb7\x76\x51\
+\xdb\x77\x2c\x4c\xd6\x46\xb9\xfb\xf1\x7f\xa4\x99\xcf\x75\x8e\x3d\
+\x7a\xdf\xce\x8e\x59\xf8\xcb\x06\xf5\xa1\x84\x5e\x80\xf1\x26\x8f\
+\x6e\xf9\x02\x37\x01\x8f\x01\x73\x8b\xad\x09\x4e\x2a\x02\x8c\xbd\
+\x59\x3e\x4c\xcc\xea\xd1\x82\x89\x5f\x29\xb1\x7c\x42\xe0\xaa\xeb\
+\x5f\xca\x6b\x5f\xf6\x4e\x7a\x4a\x03\x8b\xdc\xc2\x27\x47\x23\x9f\
+\xe5\xb6\x47\x3f\x7d\x04\x09\xc6\x46\xc6\x78\xf0\xf6\x87\x58\x6e\
+\xf0\xc1\xe6\x3c\x09\xee\x9e\xe0\xcb\x3f\xfe\x55\xde\x07\x3c\x0e\
+\xd4\x17\x93\x04\x27\x0d\x01\x16\xda\xfd\xdf\x29\xc1\x0e\x81\x2b\
+\xaf\xbf\x9a\xd7\x5c\xfb\x0e\xaa\xa5\xfe\x45\x6c\xdd\x33\x43\x33\
+\x9f\xe3\xce\x5d\x9f\xa5\x99\xd7\x3a\xc7\xda\x24\x38\xdb\xe0\xfd\
+\xf9\xfc\xb9\x37\x7d\x93\x5f\xfa\xd6\x41\xbe\x0e\x3c\xb1\x98\xd5\
+\x47\x27\xd3\x70\xf0\xbb\xdb\x2f\x6e\x4e\x98\xda\x21\x2c\xb9\xf0\
+\x9a\x0b\xb8\xfc\xa2\x97\x53\x4a\x2a\x04\xcd\x9f\xea\xda\x93\x02\
+\xa5\xa4\xc2\x69\xcb\x2f\x62\xc7\x81\x3b\x3a\xc7\x86\x37\x0c\x73\
+\xe1\x35\xf0\xe0\xed\x0f\xf1\x71\x68\x6e\x2d\x8a\x4d\x7e\xf9\x3c\
+\xde\xf4\xad\x83\xec\x03\x1a\x22\xb2\xdf\xcc\x16\xe5\x06\x4f\x26\
+\x02\xdc\x04\xd0\x80\xa9\xcf\x27\x2c\x19\x5a\x3e\xc8\xe6\xb3\x2f\
+\x60\xfd\xd2\x73\x5f\x10\xc2\x6f\x63\xfd\xd2\x73\x39\x30\xbd\x93\
+\x99\xc6\x7c\x69\xc1\xf0\x86\x61\x86\x96\x8f\xf0\x8f\x13\x33\xd5\
+\x9f\x68\xd0\x5c\x92\x50\xbd\x64\x19\x97\x00\x1b\x81\x59\xa0\x26\
+\x22\x93\x8b\x61\x0a\x4e\x0a\x02\x14\x03\x3b\x1b\x00\x3e\x9f\xc4\
+\x63\x67\x5d\xba\x99\x75\x4b\xce\xc5\x87\x67\x2f\xfc\xff\xfc\x2b\
+\xff\xbd\xf3\xfa\xfc\x4b\x36\x71\xd3\xcf\xff\x48\xe7\xfd\xf6\xfb\
+\x1e\xe3\x96\xbf\xfe\x0a\xe7\x5f\xb2\x89\xed\xf7\xed\xea\x1c\xbf\
+\xe9\xe7\x5f\xc5\xf9\x97\x9c\xd9\xb9\x7e\xe1\x75\x4f\x75\x7c\x21\
+\xd6\x2d\x39\xf7\x08\x02\xb4\xef\xe7\xee\xaf\x7e\x97\xff\x9d\xc0\
+\x56\x60\xb0\xc4\xd0\x9f\x5e\xc9\x8d\xbf\xfa\x6d\x66\x88\xf5\x87\
+\xb3\xc0\x09\xcf\x11\x9c\x2c\x25\x61\x9d\x34\xef\x43\x2e\xf6\xfe\
+\xa1\xe5\x43\xa4\x49\x19\xaf\xd9\x33\xde\xf6\x8f\x1e\xe4\x9d\x6f\
+\x7c\x3f\xdf\xfc\xf2\xdd\xa8\x29\x6a\xca\x2d\xff\xeb\xff\x72\xfd\
+\xd9\x6f\xef\x9c\x73\x60\x74\x8c\x6f\x7e\xf9\x6e\x3e\xf2\x81\x4f\
+\x77\xce\x79\xe8\xbe\x5d\xbc\xf3\x8d\xef\xe7\x77\xdf\xf5\xe7\x78\
+\xcd\x18\xdb\x3f\xc9\x47\x3e\xf0\x69\xfe\xfc\x03\x7f\x77\x8c\xef\
+\x0d\x4f\xdb\x8e\x34\x29\x1f\x75\x83\x43\xcb\x87\x18\x5a\x3e\xc8\
+\x23\xa5\xf9\x7a\xc3\x7f\x33\xcc\x16\x60\x29\xb0\x06\xe8\x3b\x11\
+\x3f\xf4\x42\x9c\x14\x1a\x80\xae\x54\xef\x0e\x81\x0b\xcf\x89\xc9\
+\xbf\xde\xf2\x10\x41\xfd\x33\xfe\x92\x87\xee\xdd\xc9\xf6\xfb\x1e\
+\xe3\x0d\x6f\x7b\x39\xff\xee\x7d\xaf\x07\xe0\x7b\xf7\xef\x66\xfc\
+\xc0\xe1\xce\xf7\x68\x91\x96\x5f\x78\xce\xaf\xfe\xf4\x87\x79\xf8\
+\xbe\xc7\x79\xe8\xde\x9d\xfc\xf6\x9f\xfc\x3c\xef\x7f\xf7\x5f\xf1\
+\xd9\xbf\xfe\x2a\xcb\x86\x07\xf9\x97\xaf\xdc\xcb\xc3\xf7\x3d\xce\
+\x1b\xde\xf6\x72\x5e\xb7\xf5\xba\xa7\x6d\x53\x6f\xf9\xe8\xf1\x06\
+\x88\xa6\x60\xc7\xc4\x7c\xe2\x68\x43\x1f\x1b\x80\x1e\x60\x15\xb0\
+\x54\x44\x66\xcd\xec\x99\xdf\xf0\xf3\x80\x93\x85\x00\xc7\xc4\x74\
+\xfd\x20\xbd\x95\xa5\xcf\xf8\xfc\xa5\xc3\xfd\xac\x58\xbd\x84\xcf\
+\xfd\xaf\xaf\xb3\xfd\xde\xc7\x78\xed\xd6\x6b\x01\x38\xf7\xe2\xd3\
+\xc9\x43\xd4\xae\xbe\x10\xde\x59\x17\xae\xef\x1c\xdb\xb4\x65\x2d\
+\xbf\xf1\xe1\xad\x7c\xf0\x3d\x1f\x67\xff\xe8\x38\x9b\xb6\xac\xe5\
+\x8f\xfe\xf6\x3f\xf0\xde\x9f\xfd\x33\x3e\xfa\xc1\xcf\x01\xf0\x0b\
+\xef\x7d\x2d\xaf\xdd\x7a\x6d\xe7\x9a\xa7\x42\xbd\x75\xf8\x98\xc7\
+\xab\xbd\x95\x63\x1d\x4e\x81\x65\xc4\xaa\xe4\x43\xc0\xcc\xb1\x4e\
+\x3a\x5e\x58\x74\x13\x50\x8c\xef\x03\x70\x47\xd1\x9a\xf6\x10\x6e\
+\x23\x9f\x25\x68\xf6\x8c\xb7\xcd\x5b\xd6\xf0\xde\x0f\xfd\x0c\x6f\
+\xfd\x77\xaf\x24\xa9\x79\xbe\xf3\x99\x7b\x78\xe2\x6b\x3b\xb9\xf5\
+\xaf\x6e\x23\xcd\x3c\xaa\x39\xda\xd6\x04\xea\x8f\xb8\xf6\x58\xc7\
+\x5f\xf3\xb3\xd7\x74\xda\xf9\xea\x9f\xbd\xfa\x19\xb7\xa3\x91\xcf\
+\x1e\xf3\x5e\xdb\xf7\x75\x47\xd7\xaf\xfe\xde\x2d\x5c\x08\x0c\x00\
+\xc3\x10\xf3\x04\x27\x12\x27\xb5\x06\x38\x38\xfd\x38\x69\xde\x43\
+\xd6\xcc\xc9\x1a\x2d\xf2\x66\x46\xbf\xd6\xf0\x73\x73\xe4\xb3\x73\
+\xf8\x5a\x9d\xfe\x50\x63\x53\xcf\x1c\xae\x51\xa7\x27\xab\x71\x9a\
+\xaf\x71\xc3\xb2\x04\x7d\x73\x3f\xd5\x52\x4e\x4f\x72\x90\xd9\xba\
+\x67\xea\xa3\xdf\x20\x1b\x38\x8b\xe1\x0d\x3f\x04\x44\x41\xfb\xae\
+\xde\xfc\xbd\xfb\x77\x1f\x71\x7c\xc7\x83\x7b\xf9\xd0\x7b\x6f\x66\
+\xc5\xaa\x21\x0e\x1d\x9c\xe6\x7d\x6f\xfd\x08\xef\xf9\xe0\x1b\x59\
+\xbe\xea\xe9\x07\x9d\xc6\x66\x77\x3f\xdb\x5b\x2d\x03\xfd\xc5\xfe\
+\x84\xe2\x84\x13\x20\x4d\xc4\x39\x21\xb9\xe6\x0c\x7a\xce\x5c\xc9\
+\x4a\x13\xf6\xbf\x75\x39\xcc\x2a\xac\x5d\x0e\xaf\xac\xc2\xda\x3b\
+\xee\xa1\x2f\x11\x96\xa5\x81\xd5\x3d\xb7\x52\x05\x7a\xcb\x39\xae\
+\x6c\x58\xef\x69\xd8\xd0\xe9\x0c\xac\xea\xa1\xd4\x53\xc6\xaa\xab\
+\xa0\xba\x12\x7a\xd6\xd2\x93\xb4\x30\x69\x20\x89\x07\x01\x2c\xc3\
+\xfc\x2c\x64\xd3\x30\x77\x90\xb1\x87\xf6\xd0\xfc\xe7\x4f\x70\xee\
+\x99\xa7\xf1\xbf\x3f\x71\x1b\x57\xbc\x7c\x33\x00\x5f\xba\xf9\xdb\
+\xfc\xe3\x27\x6e\xe7\xac\x0b\xd7\x71\xe6\x96\x55\x6c\xbf\xef\x31\
+\xfe\xdf\xdf\xfa\x3c\x00\xef\xfa\xc0\xeb\xb8\xeb\x6b\xdf\xe3\x8b\
+\x9f\xbc\x8b\xff\xfa\xbe\x4f\xf1\x7b\x7f\xf5\x73\x4f\x79\x7f\x53\
+\xf5\xfd\x47\x0c\x10\x75\xa3\x3d\x74\xfc\xd2\xae\x11\x80\x0f\x6d\
+\x63\x3b\x51\x13\x57\x80\x8a\x88\x24\x27\xb2\x7e\xe0\x84\x12\xa0\
+\x9c\x8a\xdc\xfe\x3e\x3e\x7a\xd6\x3a\xb9\xc9\xaa\x83\x83\x5a\x5a\
+\x4e\x5a\xe9\xa7\xd4\x23\x58\xdf\x00\x56\xdd\xc8\xb9\x7d\x67\xd2\
+\xd7\x9b\x20\x55\x41\x7a\x87\xa1\xba\x0e\x4a\x2b\x00\x8f\xa9\x47\
+\xcc\x83\xe5\xa0\x39\x68\x86\x69\x0b\xd1\x16\x68\x13\x42\x1d\x09\
+\x75\xd4\xcf\xe1\x42\x0d\xb4\x81\x84\x06\x58\x03\x2b\x1b\xab\xb7\
+\xf4\x73\xc9\xf8\x0c\x37\x1c\x0c\xfc\xdd\x23\x33\xfc\xf4\x4b\xfe\
+\xb0\xd3\xb6\xcd\x17\xae\xe5\xca\x57\x9c\xcd\xe0\x8a\x0a\xef\xfc\
+\xf1\xbf\x61\xf9\xaa\x01\x7e\xf7\x63\x6f\xe1\x8c\x0b\x56\x72\xc6\
+\x05\x2b\x59\xb2\xb2\x97\x4f\xfe\xe9\x37\xf8\x93\xdf\xfc\x7b\x7e\
+\xf9\x0f\x5f\x73\xcc\xfb\xf3\x21\x67\xb2\xb6\xef\x49\xef\xbf\xd9\
+\x55\x6d\x74\x0c\x94\x88\x91\x40\x09\xf8\xc1\x24\x40\xe6\xcd\x3e\
+\xf6\x36\x69\x5d\x70\xfd\x0f\x0d\xf6\xfd\xd0\xaf\x43\xba\x14\x92\
+\x5e\xcc\x0c\x11\x81\x4e\x1e\xc4\x30\x0b\xf1\xbd\x29\x58\x06\xe6\
+\xe7\x37\xcd\x0a\x02\xb4\xe6\xb7\xd0\x88\x9b\xd6\x23\x19\xb4\xfd\
+\xbe\x01\xa1\x1e\x37\xad\x73\xc6\xb9\xc6\xe9\x5f\x19\xe7\x75\x3f\
+\x77\x3d\x95\xc1\x79\x63\xbc\x79\xcb\x1a\x96\x0e\xf7\xe3\x43\xc6\
+\x2f\xfd\xc1\x8d\x2c\x5b\x35\xc0\xe9\xe7\x2d\xef\x98\x89\x1b\xde\
+\x78\x21\x43\x2b\xaa\x2c\x5b\x35\x70\x84\xe9\x68\x23\x68\xce\x81\
+\x99\x5d\x4f\x99\xb4\x1a\x1b\x19\xe3\xec\xae\x54\xcf\x9e\x1a\x8b\
+\x3e\xcf\xe0\x84\x9b\x80\x1d\xfb\xf9\x6a\x6d\xd7\xed\xef\xe8\xdb\
+\xfc\x29\xc7\x9a\xb7\x82\x4b\x00\x0c\x15\x01\x03\x0c\x2c\x12\x40\
+\x30\xd0\x00\x16\xba\x84\xef\x23\x21\x34\x3b\x92\x00\x1a\x05\x4c\
+\x68\x20\xa1\x56\x08\xbd\x56\x6c\x75\x08\x73\xe0\xe7\x28\x0d\xe6\
+\xac\xe9\x83\xc3\x6b\x96\xb3\xf1\x8a\x23\x07\x97\xf2\x10\x7b\xe8\
+\x25\xd7\x9d\x76\xc4\xfb\x36\x9e\xec\x78\x1e\x9a\x1c\xae\x8f\x3e\
+\x65\x78\x38\x3d\x31\xcd\xf4\xc4\x0c\xd7\xe6\x34\x29\xd2\xc1\xff\
+\x3a\xc6\x43\xdd\x5f\x03\xd4\x8a\xfd\x09\xc3\x09\x27\xc0\x57\x1e\
+\xe6\xce\xb7\xbd\x54\x77\x95\x6e\xfb\xfb\xb3\x96\x5c\xb0\x0d\x39\
+\xe3\x5d\xd0\xbb\x29\x7e\x68\xc5\x7f\x66\x51\xd0\x00\x84\x42\xe8\
+\x61\x5e\xf5\x5b\xbb\xf7\x67\x10\x9a\x1d\xf5\x1f\xb5\xc0\x42\xe1\
+\xd7\xa2\xf0\x43\x2d\x9e\xdb\x82\xe9\x06\xa8\xe6\xf8\xf0\x94\x2a\
+\xf9\x19\x61\x2e\x3b\xfc\xa4\x36\xbf\x1b\x8f\xde\x1b\x0b\x45\x7e\
+\x22\x00\x09\x4c\xe7\xcc\xbc\xfb\xdb\xb4\xe7\x13\x28\xd0\x22\x16\
+\x8a\x9c\xd0\xfa\xc1\x13\x4e\x80\xfb\xf6\xd8\xfe\x97\x9f\x2b\xaf\
+\xfc\xdd\x1b\xf3\x8f\x6f\x1e\xdb\xf6\xc3\xab\x26\x7e\x85\xe4\xac\
+\xad\xd8\x8a\x1f\x03\x12\x10\xed\xa8\x7e\x45\x11\xd3\xae\xde\x9f\
+\x63\x1d\xfb\xdf\x56\xfd\x4d\xac\xad\xee\x3b\x82\x9f\xc3\xfc\x5c\
+\xd1\xeb\x67\x8b\xad\x86\x79\x65\x76\x3f\x4c\xd4\x52\xe8\x6b\x91\
+\xeb\x73\xbf\xfd\x56\x5e\xa7\xe5\x6b\x9d\xc4\xd2\x53\x61\x6c\x64\
+\x8c\xe9\x89\x19\x5e\x93\xc5\x71\x00\x80\xbb\x0f\xf1\x10\x05\xe5\
+\x89\x29\xe0\x39\x16\x21\x15\xbc\x28\x61\xe0\xd7\xbf\x67\x4f\x9c\
+\xbf\x5a\x5e\xfb\xe1\xd7\xf2\x47\x67\xce\x36\xfe\xed\xc6\xc9\x8f\
+\xba\xea\x59\xdb\xe0\x8c\x7f\x0b\xa5\x41\x30\xc5\x54\x71\xe8\xbc\
+\xfa\x57\x8f\x59\x8e\x1c\x61\xff\x9b\x98\x36\xa3\xa3\x17\x1a\xe0\
+\x6b\xa0\x35\x2c\xcc\x21\x85\xca\x6f\x6f\xe6\x73\x24\xc0\xe8\x08\
+\xac\xb8\xf2\x42\x6a\x9b\xd2\xa3\x54\xf9\xd3\xc1\x4c\xc9\x43\x0b\
+\xaf\x19\xcf\xb4\x98\xa7\x7b\x38\x78\x6b\xd7\xb4\xf3\x0f\x3e\xc8\
+\xed\xc4\x9e\x0f\x71\x1c\x60\x0c\xa8\x3f\xab\x06\x3d\x0f\x58\xb4\
+\x3c\xc0\xf6\x03\x36\x95\x26\xf2\x8e\x3f\xb8\x91\x07\x6e\x98\xb1\
+\x3f\xd8\x74\xe8\xb6\xa1\x25\xae\x1f\x39\xe3\x67\xc0\x14\xd1\x00\
+\x1d\x02\x74\xa9\x7f\x6d\xdb\xff\x66\x47\x03\xb4\x6d\x3f\xa1\x16\
+\x49\xd0\xe9\xf9\x33\xe0\xa7\xc1\xb7\xc0\x03\x09\x8c\xee\x01\xb6\
+\xac\x7a\xc6\xc2\x37\x53\xd4\x02\x6a\xe1\x19\x0b\xbd\x8d\xee\x82\
+\x90\xf7\x36\x69\x90\xd0\x03\xf0\xb5\xfd\xdc\x71\xff\x61\xa6\x89\
+\x1a\x20\x00\x93\xc4\x01\xa1\x17\x0f\x01\x00\x7c\x30\xed\x2d\xcb\
+\x47\xca\xc2\xc6\x44\xdc\xaf\x5f\xf8\xe3\xff\x86\x34\xd4\xba\x7c\
+\x80\x6e\x0d\xd0\xb6\xfd\xdd\x0e\x60\x73\xde\xfb\x0f\xf5\x42\xf8\
+\xb5\xa2\xd7\xcf\x14\x24\x28\x84\x6f\x82\x59\x0f\xa3\xa3\x75\xdc\
+\x6b\x57\x90\x87\xfd\x4f\xd2\xaa\xa8\x95\xcd\xe6\x5f\x3f\x17\x74\
+\x97\x84\xfd\x97\x26\x8d\x25\x85\xf0\xf7\xd4\xd8\xfb\x33\xdf\xe2\
+\x2b\xc5\x69\x8e\xa8\xfa\x0f\x02\x87\x4f\xf4\x38\x00\x2c\x32\x01\
+\xd6\x0e\x4a\xef\x1f\xbc\x8a\xdf\xbf\x7e\x4b\xcf\x2f\x9f\xf7\x93\
+\xaf\x21\xed\xeb\x89\x42\x44\xbb\x08\xd0\xf6\xfc\x73\x4c\x73\xc4\
+\x32\x08\xad\x05\x04\x68\xce\xf7\x7e\x5f\xf4\xfe\x30\x0b\x79\x33\
+\xfa\xd4\x39\x50\x19\xa0\x56\xef\x63\xfc\x60\x9d\x50\x9a\x7e\xd6\
+\xbd\xf9\x99\x62\x61\x51\xe8\x6f\xd4\x98\x58\x52\xd4\x35\x4e\xe7\
+\xcc\xfc\xc2\x6d\x7c\x86\xc8\x2c\x89\x37\xc8\x61\x60\x3f\x31\x02\
+\x38\xe1\x58\x34\x02\x5c\xb5\x41\xd6\x7d\xf0\x46\x3e\x7a\xe5\x45\
+\x4b\x6f\xdc\xf4\x86\x37\x92\x2c\x5d\x63\x16\x66\xe7\x63\x7f\x0d\
+\x62\x9d\x08\x20\xda\x7f\x42\x8e\x5a\x0b\x2c\x43\x7c\xb3\x13\xef\
+\x5b\xb7\xfa\x2f\x08\x60\x3e\x8b\x82\xcf\x88\xcb\x3e\x55\x4b\xd4\
+\xf7\xb7\x98\x2a\x55\x29\x49\xf3\xfb\xe9\xdc\x4f\x8a\xee\xb2\xf0\
+\xcd\x19\xb5\xdf\xcc\xd1\xa1\x42\xf8\x00\x37\x7d\x83\xbf\xbc\xff\
+\x30\x53\x5d\x97\x4c\x03\x7b\x88\xf6\xff\xc5\x53\x11\xf4\xe3\x67\
+\xcb\xc5\xbf\x7f\x03\xb7\x9c\x77\xf5\x19\x67\x6d\x78\xd5\x2b\xb1\
+\xb4\xcf\xc4\xcf\xc4\x3c\x80\x29\xa0\x98\xaa\x09\x41\xda\xea\x5f\
+\x34\x47\x43\x8e\xb3\xb6\xfa\x6f\x40\x68\xa1\xa1\x8e\x6b\x27\x7a\
+\xfc\x1c\xf8\x3a\x96\x79\xa4\x45\x14\x7c\x13\xf0\x60\xeb\xce\xe4\
+\x91\xc7\x46\xa8\x9e\xbb\x8c\xfc\x79\x8c\xb4\x8e\x35\x31\xe4\xea\
+\x09\x76\xbc\x67\x80\xb3\x29\xc5\xf7\xd3\x39\x33\xbf\x7d\x0f\x9f\
+\xb9\xff\x30\xdd\xc3\x84\x0d\xe0\x09\x60\x17\x30\xb3\x58\x85\xa1\
+\x27\x9c\x00\xaf\x3e\x5b\xae\x7d\xe7\xd5\xdc\x7c\xc5\x8f\x9e\xbb\
+\x6e\xe9\x95\x57\x01\x21\x3a\x6a\x42\x91\x07\x8a\x04\x38\x32\x01\
+\x14\x7b\xbf\xb4\x13\x40\xa1\x5b\xfd\x17\xb6\x3f\xab\x41\x2b\x83\
+\x96\xc5\x5e\x9f\x13\x6d\xbf\x07\x92\x0a\x0c\x9e\xcd\xf4\xce\xfb\
+\x58\x72\xc3\x55\x8c\x3f\x0f\x23\xae\xc7\x9a\x1a\x76\xc6\x38\xdb\
+\xde\x59\x62\xf9\xc6\x01\xce\x6e\x1f\x1b\xa9\x31\xf2\xf6\xdb\x3a\
+\xc2\x37\xa2\xdd\xcf\x88\x05\xb0\x8f\x00\x63\x8b\x55\x0f\x08\x27\
+\x98\x00\xaf\xda\x24\x5b\x7e\xe5\x1a\x3e\x73\xd5\x6b\x4e\x5f\xb5\
+\xec\x92\xf3\xa2\x9d\x46\xe8\x92\x3e\xa8\x71\x84\xf7\xaf\x6d\x07\
+\x30\x2b\x84\x5d\xc4\xfa\xf9\x2c\xe4\xd9\xbc\x9d\x0f\x74\x04\x6e\
+\x1e\xa4\xfb\x7d\xdf\x00\x94\x4e\xe3\xe1\xdd\x4a\x65\xc5\x73\x1b\
+\x01\x7f\xaa\xc9\xa1\x83\x93\x2b\x78\x87\x4d\xef\x7f\xc9\x50\xbe\
+\xa5\xfb\xf8\xfd\x87\x79\xe8\x47\xfe\x2f\x37\x33\x6f\xf3\x85\xd8\
+\xda\x7d\xc0\x76\x60\x2f\x31\x01\xb4\x68\x38\x61\x04\x38\x77\xb9\
+\xac\xfa\xbd\x97\xf1\x89\xcb\x7e\x78\xd5\xf0\xf2\xf3\xd7\x83\x3f\
+\xcc\x11\xc2\x6f\x0b\xdb\xf2\xc2\xf1\xeb\xca\xf1\x6b\x1d\x7c\x23\
+\x7e\x1e\x42\x14\x76\xb1\x49\xd7\xeb\x4e\x8f\x0f\x40\xde\xe5\x3f\
+\x2e\x3d\x8f\x6c\x74\x9a\x7a\x80\x99\xc6\x34\xf5\xd6\xf4\xf7\x3d\
+\x3d\x5c\x1b\x7d\x5c\xd5\xac\xf2\x13\x69\x83\x73\xfb\x0f\x41\x2c\
+\xeb\x02\x62\xaf\xff\xd0\x36\xfe\xcf\xa7\x77\xf3\x78\xbc\x39\x4a\
+\xc4\x9e\x5f\x07\x46\x81\x87\x89\xea\x7f\x51\xe7\x04\xc0\x09\x22\
+\x40\xea\x44\xfe\xf8\x65\xbc\xff\xdc\x73\xdd\x45\xab\x2e\x2f\x63\
+\xad\xbd\xc5\x4d\x6b\x31\xd8\xe3\x31\x0b\x16\x5f\x77\x27\x7e\xbc\
+\x45\x62\x58\x5b\x29\x88\x69\x21\x74\xa5\x23\x78\x6b\x0b\xbf\xb8\
+\x94\x42\xf0\xc1\x43\xcb\x43\xef\x92\x0d\x3c\x7a\xd7\x08\xf5\x72\
+\x99\x7b\x6e\xfd\xd7\x67\x54\xd5\xb3\x10\x3e\x63\xa6\x39\xcb\xde\
+\x1b\x72\xf2\x97\x27\xf4\x5c\x3a\x54\x3b\x9b\xbe\x23\x1d\xf7\x71\
+\x5f\xe6\xaf\x9f\xa8\xde\xf1\xe1\xbb\x67\xbe\x40\xec\xd9\x42\x1c\
+\xe6\x75\xc4\x64\xcf\x6e\xa2\xda\xdf\x47\x9c\x1a\xb6\xe8\x93\x32\
+\x4e\x08\x01\xae\x5b\xcf\xcb\x36\xad\xe6\xe7\xce\xbd\xae\x2c\xe4\
+\x93\x26\x88\x74\xab\x7d\x33\x35\x41\x25\x46\x00\x01\x54\x31\x33\
+\x13\x43\x28\x5c\x82\xb6\x55\x70\x6d\x2b\x2a\x60\xad\xf8\x15\xd2\
+\xa5\x01\x64\x9e\x3f\x64\x05\x01\xfa\x06\x4f\x63\xec\xc1\xcf\xc1\
+\x8a\x15\x33\x87\xc7\x46\xf6\xa6\x15\x06\xab\xfd\xac\x5f\xd8\xce\
+\xe6\x1c\x7b\x7d\x6b\xde\x41\xb8\x21\x27\x5f\x65\x70\xa1\xa3\x74\
+\x7a\x3f\xeb\x87\x06\x38\xff\x58\xf7\x37\xee\xcb\xfc\xc3\xd4\x30\
+\x9f\x9f\x5a\x05\xf0\xd2\xb5\x6b\xf7\x3f\x36\x3a\x3a\x7a\x3f\x90\
+\xc4\x56\x71\x88\xd8\xe3\x1f\x25\x26\x7c\x4e\x9a\xc9\xa1\xc7\x9d\
+\x00\xef\xfb\xa5\xb7\xf5\xbc\x61\x13\xef\xbf\xf4\x6a\xd2\x72\x4f\
+\x93\xe8\xee\x74\x2f\xcc\x6d\x98\xc6\xd1\xe0\xb6\x1b\xd0\xd9\xda\
+\xc2\x6f\xe7\xcb\xa4\x0c\x03\xcb\x41\x6b\x8c\x3d\x3c\xc3\x8e\xbb\
+\xe1\xac\x73\x60\xd5\xaa\xe2\xbc\xc2\xfe\xfb\x42\xf0\x0d\x1f\xfd\
+\x3f\xa9\x1f\x62\x64\xe7\x1e\x5e\xbb\x7a\xcd\xe0\x7b\x34\x0a\xf1\
+\xfe\x83\x6c\x5f\xd8\xd6\x8b\x97\x72\xfe\xb3\xa9\xc9\xd9\x36\xc5\
+\x03\x7f\x39\xba\xec\xc0\x8e\xf2\x19\x47\xd4\x89\xaf\x59\xb3\xe6\
+\x2d\xa3\xa3\xa3\x0f\x13\xeb\xfb\xf6\x12\x7b\xfe\xbe\x4b\x2f\xbd\
+\xf4\x15\xce\xb9\x9b\x01\xae\xb8\xe2\x8a\x93\x62\x85\xf2\xe3\x4e\
+\x80\x6b\xd7\xf2\xa3\x72\x88\x97\xac\x39\x87\xae\x48\xd7\xe6\x39\
+\xd0\x16\xf4\x42\x02\xe8\x82\x7d\x65\x09\x2c\xbb\x18\xf3\x53\xec\
+\xfd\xd7\x47\xf8\xf6\xed\xd0\x6a\xc1\x9e\xfd\x70\xc9\x79\x70\xce\
+\xe6\xa8\x1d\x72\x0f\xcd\x30\x4f\x80\xde\xa1\x01\x66\x0e\xee\x66\
+\xfc\x40\x93\x57\x9c\x57\x82\x89\xf8\x67\x2f\x5e\x7a\xec\xde\xfc\
+\x74\xd8\x36\xc5\x03\x5f\xdf\xcf\x7d\xef\x7f\x80\xef\xc4\xd6\x4d\
+\x96\xd7\xae\xad\x4e\xae\x59\xb3\xe6\xcd\x0b\x4e\x55\x62\x8a\x77\
+\x27\xb0\xfb\xb2\xcb\x2e\xbb\x51\x44\x6e\x7e\x2e\x7f\xf3\x78\xe2\
+\xb8\x12\x40\x7d\xee\x0e\xdd\xfd\xf5\x77\x5d\x77\x15\xa9\x18\x31\
+\xf8\x69\x0b\xbe\x2d\x70\x78\x7a\x02\xf4\x0d\xc3\xfa\x57\x43\xeb\
+\x30\x8f\xfd\xd3\x36\xee\xbe\xab\x49\x2b\x83\xc9\x89\x78\xca\xbf\
+\xcc\xc2\xde\x51\xb8\xea\x32\x20\x81\xa6\xc7\x5a\x01\xf1\x01\xfa\
+\xaa\xc6\xc4\x43\xf7\xd2\xcc\xa0\xa7\xfe\xec\xd6\x7f\x7e\x78\x9a\
+\x7b\x27\x5b\x1c\xbe\x7f\x92\xc7\xbf\xbc\x8f\x5d\xdf\x3e\xc4\x54\
+\xfc\x0b\x94\x89\xe5\xdc\x00\xc9\xe8\xe8\xe8\x36\xe0\x93\x6b\xd6\
+\xac\x79\x4b\xd7\xe5\x09\xb1\xc2\xa7\xf7\xa2\x8b\x2e\x7a\xbd\x88\
+\xfc\xcd\xc2\xef\x17\x91\x75\x44\x07\x71\xd1\x56\x28\x3f\xae\x04\
+\xd8\xfe\xc5\xbf\x3d\x2f\xad\x8f\xfc\xf0\xba\x33\x98\x8f\x74\x8b\
+\x74\x4f\xf7\x79\x12\x7d\x3c\x59\x40\x00\xc1\x30\x7a\x86\xe1\xcc\
+\x7f\x0f\x7e\x8e\xdd\x5f\xfe\x2a\x77\xdd\x3e\x41\xa3\x01\x07\x0e\
+\x62\x3b\xa7\x78\xac\x2f\xa1\x77\xdd\x00\x6b\x6a\x73\x30\x7a\x00\
+\x5e\x72\x25\xf4\x0d\x42\xd0\x22\xdb\x2b\x35\x1e\x79\xb8\xc1\xb4\
+\x67\xec\x8c\xcf\xf8\x3f\xa9\xd7\xa3\x31\xf9\xed\x0b\xb9\xc8\x40\
+\x44\xd0\x44\xf0\x0e\xf4\x3f\xdf\xcf\xbd\x45\x93\xda\x42\x76\xcc\
+\xb7\xd5\x88\x02\x4d\x8a\xdf\x4d\x88\x8e\xde\x2c\x30\x33\x3a\x3a\
+\xfa\xc0\xe8\xe8\xe8\xa7\x89\xe5\xdd\x2b\x8b\xeb\x57\x6c\xdc\xb8\
+\xf1\x4d\xa5\x52\xa9\x33\xef\xb1\x8d\xe9\xe9\xe9\xdf\x02\xae\x29\
+\xbe\x73\xd1\x56\x28\x3f\xae\x04\xf8\xde\x57\x3f\xf7\xf6\x33\xce\
+\x20\x29\x97\xe8\xf4\x7e\x13\x4c\x8e\x74\x02\x30\xc3\x5c\xb7\x36\
+\x28\xd2\x01\x92\x96\x85\xf3\x7e\x0d\xd2\x21\x76\xff\xc3\x9f\x71\
+\xdb\xad\x7b\xac\x56\x43\x0e\x8e\xe1\xbf\x7c\x90\xdb\xbf\x3d\xcd\
+\x57\x13\x61\xfa\x4d\xab\x79\xf5\x59\xfd\xbc\xa2\x5e\xc7\x1d\xfc\
+\x22\x5c\x79\x35\xb6\x6e\x3d\x92\x00\x95\xcc\x38\xb0\x2b\x30\x78\
+\xfe\x15\x4f\xd4\xbf\x7c\x77\x46\x14\x4c\xf9\x0f\x1f\xa4\x3d\x2f\
+\xac\x08\x1a\x09\xcc\x97\x65\x27\xc4\x9e\x99\x74\x9d\x93\x15\x5b\
+\xbd\xd8\x37\x80\x29\x62\x1a\x77\x92\x38\xa8\x93\x10\xe7\xfb\x9d\
+\x0f\xac\x5a\xbb\x76\xed\x25\x2b\x56\xac\x38\x6a\x01\xcb\xe9\xe9\
+\xe9\xdf\xd9\xb9\x73\xe7\x38\x70\x16\xf3\x95\xc0\x8b\xb2\x42\xf9\
+\x71\x23\xc0\xe8\xb6\x7b\xfa\x76\x7d\xeb\x2b\x37\xbe\x6c\x2b\x47\
+\xab\xfe\x85\xe8\xee\x63\xed\x0d\x81\x2d\xef\x86\xc1\x4b\xd9\xfd\
+\x85\x3f\xe2\x9b\xff\xb4\x9d\xb9\x1a\x8c\x1f\xa2\x71\xeb\x18\x7f\
+\x71\xd7\x34\xf7\x03\xb3\xde\xd8\xfd\xd9\x03\x7c\xf6\xa6\x61\xb6\
+\x9e\xd1\xc7\x7f\xcc\x73\xfa\xfe\xe5\x56\x38\xef\x7c\x38\xef\x3c\
+\x98\x1b\x87\xdd\x07\xa1\x74\xc9\xf2\x6f\x01\xf7\x13\xcb\xaf\x07\
+\xa0\x9d\xa8\x3d\x4a\xd8\x70\x24\x29\x28\x5e\xcf\x12\x85\xdc\xde\
+\xd7\x89\x24\xa8\x01\x4d\x33\x0b\x22\x92\x10\xb5\x82\xdf\xb8\x71\
+\xe3\x4f\x3f\x85\xf0\x0f\x12\x67\x03\x95\x8b\x5f\xe7\x84\x97\x82\
+\xb5\x71\xdc\x08\x10\x7c\x7e\x46\x39\xf1\xa7\xad\x58\xc6\xfc\xad\
+\x45\xf5\x1f\x3d\xfe\x36\xec\x18\x7b\x05\xd6\x5d\x05\x6b\x6f\xe4\
+\xf0\x9d\x9f\xe3\xd6\xbf\xfb\x26\xb3\x73\x30\x79\x88\x7c\xfc\x10\
+\xbf\x5f\x9b\xe6\xcb\x5b\xa0\x5c\x82\x6c\x10\x66\x57\x19\x7e\xfc\
+\x20\xff\xbd\x7f\x88\xc7\x56\x2c\xe3\x4f\xcd\x58\xbd\xed\x41\x38\
+\x7c\x18\x0e\x6d\x84\xdc\xe3\xaf\x7e\xc5\x8d\xff\xcc\xa7\xbe\x72\
+\x2f\x85\x06\x60\x5e\xe0\xdd\xd5\xb8\x6d\x2c\xac\xcf\xeb\xd6\x00\
+\xed\xcd\x2f\x0c\xe5\x0a\x12\x4c\x5d\x74\xd1\x45\xe7\x3d\x89\xda\
+\x3f\x4a\xf8\x1b\x36\x6c\xd8\x30\x3c\x3c\xfc\x7e\x58\x9c\xc8\xe0\
+\xf8\x99\x00\xa3\x6f\x78\x39\x3d\x9d\xcc\x1c\x1c\x5b\x0b\x2c\xec\
+\xfd\x80\x95\xab\x70\xf6\x9b\x68\x3c\x71\x3b\x5f\xf9\xf3\x8f\x30\
+\x35\x13\x98\x9e\x12\x76\xcf\x56\xef\x9d\x9e\x6a\xdc\x73\x11\x94\
+\xd3\x22\xdb\xef\x21\x11\xe8\xed\x83\x52\x6b\x9a\x6f\x1c\x68\xf0\
+\xda\xe1\xd5\xfc\x59\x92\x72\xe5\xbe\xbd\xc8\x81\x51\x50\x65\xe2\
+\x9c\x8b\x2e\xdd\x66\x66\x47\xcd\xd9\x2a\x7a\xed\x31\x35\xc0\x73\
+\xa9\xcf\xbb\xfc\xf2\xcb\xdf\x00\x1c\xe5\xf0\x3d\x85\xf0\xdf\xf1\
+\x6c\xff\xc6\xf3\x89\xe3\x3a\x35\x6c\x70\x10\xb2\x0c\xf3\x19\x16\
+\x72\x4c\xb3\x62\x54\x37\xeb\xda\xda\x69\xfe\x1c\xf3\x39\x96\x67\
+\x18\xa7\x5d\x6e\xe2\xa7\xed\x8e\x8f\xfc\x37\x46\x0f\x78\x66\x67\
+\x60\xa4\x31\xc0\x9e\xc1\xf5\x57\x4d\xad\x5c\xf9\xc6\x69\x18\x0e\
+\xd1\x0b\x2f\x25\x90\x4a\x24\x72\xa2\x90\x64\x19\x8f\xed\x1f\xe5\
+\xa6\x7a\x9d\x8f\x9b\xa1\x3e\x60\x33\x9e\xd1\xf7\xff\xb7\xff\x79\
+\x4c\x07\xcb\xcc\x82\x99\x35\xcd\xac\xd6\xb5\x35\x9f\x8b\xf0\xaf\
+\xb8\xe2\x8a\x9b\x88\x4b\xdb\x1d\x81\x67\x23\x7c\x11\x59\x27\x22\
+\xa7\x8b\xc8\x6a\x11\x39\xee\x7e\xc1\x71\x25\x40\xa9\x02\xb5\x0c\
+\x99\xcb\x90\x5a\xb1\x35\x32\xac\x91\x41\x33\x83\x46\xb1\xb5\x3f\
+\x9f\xcb\x90\x56\xb9\x22\x2c\x19\x96\x27\xbe\xfc\x39\xee\xfd\xce\
+\x28\x8d\x3a\x4c\x35\xcb\xec\x29\x2d\x8f\xb5\x02\x4b\x96\xbc\xfd\
+\x10\x6c\x9c\x84\x21\x0f\x69\x91\x51\x90\xc2\x5d\x17\x05\x66\x3d\
+\xd3\x07\x0e\xf0\xae\x89\x19\x7e\x1d\x98\x6d\x29\x77\x7f\xec\x6f\
+\x6f\x3e\x11\x99\xb7\xef\x4b\xf8\x5d\x91\xc1\xcb\x88\xcf\x30\x5a\
+\x72\x7c\x9b\x7b\x9c\xa3\x80\x5c\x61\x2e\xa3\x93\xf8\x75\x0b\xdd\
+\x7f\xba\x34\x7f\x11\x1b\xae\x3c\xad\x17\x3f\xf9\x30\x5f\xbb\x65\
+\x07\xf5\x06\x78\x8f\x3e\xa6\xcb\x5d\x48\x1c\x52\x98\xdc\x69\x38\
+\xdd\x43\x16\xa0\xb9\x04\x9a\xc9\xfc\x40\xb2\x7a\x30\x07\x36\x05\
+\x7e\xee\x10\x1f\x79\xb4\xc9\x77\x27\x84\xe9\xe3\x79\x9f\x4f\x86\
+\x67\x29\xfc\x45\x89\x0c\x8e\x2b\x01\xea\x8d\x98\x8f\x87\x48\x02\
+\x8e\x41\x00\x28\xf2\x40\x06\x95\x12\x94\x2b\xb3\x3c\xf8\xf5\x59\
+\xf6\x8c\xc6\x92\xad\xe6\x1c\x77\xcf\xe5\xad\x47\x59\xda\xfb\x16\
+\x44\x30\x11\x5a\xb0\x24\x83\xd3\x33\xa8\x1b\xcc\xae\x80\x39\x01\
+\x75\xc5\x16\x62\xd5\x80\x4d\x43\xb8\x6d\x8e\x7f\x4d\x4b\x25\x35\
+\xcb\x4e\x68\xee\x7d\x7a\x7a\xfa\xb7\x0a\x81\x3e\x53\xe1\x2f\x4a\
+\x64\x70\x5c\x09\x30\x37\x17\xbd\xb4\xb6\xd7\x2f\x9d\xff\x8e\x44\
+\xdb\x97\x5e\x3a\x08\xcc\x79\xee\xb9\xad\x73\x2c\xab\x4d\xf3\x0f\
+\xcb\x9b\x93\x4f\x8c\x4f\x4e\xde\x3b\x0d\xeb\x9a\x30\xa4\x90\x78\
+\x58\x12\x60\x55\x15\x76\xaf\x04\x6f\xe0\x35\xba\x15\xbe\x05\x5a\
+\x86\x70\x57\x51\x5e\x9a\x65\x27\x46\xf8\x6d\x0f\xbe\xc8\xf0\x5d\
+\xc3\x7c\x6f\x7e\xb6\xc2\x3f\x48\x1c\x3f\x38\xf6\x3c\xf3\xe7\x11\
+\xc7\x33\x0a\x98\x1d\xdd\xc7\xec\x81\xfd\x0c\xac\x5c\xc9\x42\xc1\
+\xdb\x82\x37\x02\xd0\x6b\x70\xe8\x71\x18\x3d\x18\x8f\x67\x2d\x1e\
+\xcf\x9a\x6c\xef\x87\xa0\xc5\xe0\x5e\x06\xeb\x35\xda\x7f\xa7\x50\
+\xae\x13\x6b\x8a\x92\x82\x04\x21\x9e\x1b\xee\x01\x9d\x01\x5d\xa4\
+\x51\xb7\x76\x68\xf9\x5c\x85\xff\x10\x71\x21\xc9\xe3\x5e\x28\x7a\
+\xdc\x08\x30\x9e\xf1\xf0\x6d\x63\xfc\x7b\xf7\x2d\xfe\xc7\x15\x2f\
+\x61\x60\xf5\xda\x8e\x2f\xd0\xae\x8e\xe9\xc0\xa2\xdd\x16\xdf\x80\
+\x3d\xbb\xa0\x15\x15\x9f\xec\x6f\xf5\x4c\xb5\x68\x54\x07\x61\xaa\
+\x3f\x8e\xed\x34\x72\xa8\x79\x58\x19\x62\xdb\x0f\xb8\x42\x55\xd6\
+\xc1\xe7\x05\x01\x76\x41\x38\xb0\x78\xc2\x87\x98\xdb\x3f\x00\xb0\
+\x71\xe3\xc6\x8b\x56\xac\x58\xf1\x6c\x85\xff\x28\x71\x6c\xe0\xb8\
+\x4f\x13\x3b\x6e\x04\xb8\xec\xea\xab\xed\xd6\x5a\xf9\xd3\xab\xf7\
+\x66\x35\xef\xf9\xab\x2b\xae\x64\xd9\x9a\xd5\x60\x72\xec\x44\x90\
+\x00\xa3\x53\xb0\x3d\x2e\xdb\x8f\x22\x8c\x0d\xac\xba\xaa\x79\x68\
+\xf7\xb0\x42\x63\x10\xea\x4b\xa1\x26\x30\x55\x85\xdd\xf5\x68\xeb\
+\xa7\x97\xc0\xa1\x7a\x1c\x04\xf4\x59\x14\xbe\x7e\x6f\x71\x85\x0f\
+\x31\x45\x7c\x1f\x50\x5d\xb1\x62\xc5\x5f\x2f\xfc\x70\xa1\xf0\x2f\
+\xbf\xfc\xf2\xdf\x6d\x7f\xd6\x6a\xb5\xde\xbe\x6d\xdb\xb6\xef\x9c\
+\xa8\x39\x82\xc7\xd5\x07\x38\xe7\x9c\x73\x6c\xe2\xc1\x07\xff\x29\
+\x31\x7e\x41\xee\x96\x9b\x2f\xb9\xc4\xaa\xc3\x6b\x8e\xee\xfe\x6d\
+\x4c\x34\xe1\x50\x51\x34\x5d\xd7\x32\x59\xa9\xc4\x61\xd8\x90\xc7\
+\xa8\xb1\xbe\x14\xe6\x96\x40\x6b\x19\x64\x06\x4d\x0f\xad\x3a\xe4\
+\x39\xf8\x29\xf0\xfb\xc0\xef\x58\x7c\xe1\x53\x8c\xea\x1d\x80\x98\
+\xdd\xeb\xc6\x93\xf4\xfc\x0e\x2a\x95\xca\xc7\x2e\xbf\xfc\xf2\x59\
+\xe2\x03\xa9\x8e\x3b\x8e\x6b\x1e\x60\x68\xc9\x12\x9b\x05\x7d\xe8\
+\x8c\x0b\xfb\xbe\xc5\xa6\xea\xed\xdf\x2d\xb1\xe7\xf1\xa2\x96\xb3\
+\xbd\xe5\xc5\xd6\xce\x0d\x34\xe2\xb5\x33\x56\x21\x38\x47\x03\x06\
+\x26\xe1\xb4\x7d\xb0\x72\x22\x12\xb6\x65\xd0\x14\xc8\x1a\x90\x29\
+\xe4\xd3\x90\xef\x38\x49\x84\xff\x54\x28\x22\x83\x63\xa9\xfd\x85\
+\xf8\xcc\x05\x17\x5c\xf0\x8b\x22\x32\x58\x64\x2a\x8f\x1b\x8e\xfb\
+\x5a\xc1\x97\x5f\x76\xd9\x9b\x1d\xdc\x2c\x66\xf4\x37\x6b\x72\x75\
+\x78\x9c\x2d\xe7\x78\xd6\xac\x39\x7a\x6a\x46\x9e\xc3\x9d\xb7\xc7\
+\xc8\x61\xd7\x21\xbe\x79\xd7\x0c\x0f\x6b\xcc\xf0\xb5\x4a\xf0\xf8\
+\x2a\xb8\xeb\x1c\x18\x11\xc8\xea\xd1\x21\xcc\x67\xc1\xdf\x0e\x61\
+\xf6\x24\x7e\x2c\x0b\x1c\x3b\x32\xa0\xb0\xf9\x5b\xb6\x6c\x39\xbf\
+\x52\xa9\x7c\x6c\xe1\x35\x05\x61\xfe\x82\xe3\xe8\x0f\x1c\x57\x0d\
+\x70\xc5\x15\x57\xfc\x94\x38\xf7\x49\x13\x31\x13\xb1\xb9\x6a\x1f\
+\xdf\x4e\xce\x60\xdb\x76\x37\xb3\x77\x04\xc9\x32\x24\x8f\x1b\x79\
+\x86\xb4\x5a\x48\x08\xd1\x42\xf8\x9c\x07\x80\x83\x85\xe3\xe7\x9a\
+\x50\x9a\x8d\xc9\x9e\xd6\x4c\xf4\x13\xf3\x59\xf0\x77\xbc\x00\x84\
+\x5f\xe0\x88\xc8\x80\x2e\x87\x6f\xdb\xb6\x6d\x7f\x03\xf3\x8f\xc0\
+\x69\x63\x68\x68\xe8\x03\x9b\x37\x6f\xfe\x45\x60\xc9\xf1\xd2\x04\
+\xc7\xf4\x01\xae\xdb\x2a\x57\x11\x8b\x1a\x2e\x2e\xce\x29\x01\x6b\
+\x81\x97\x14\x37\x50\x29\x8e\x09\xd1\xd9\x39\xc8\xfc\x60\xca\x77\
+\x80\xd1\xda\xf6\xcb\x01\xfe\x0e\x00\x91\x76\x77\xd7\x03\xcd\xfc\
+\xfd\x5f\xda\xab\xe5\x10\x78\xc7\x59\x2d\x86\xd6\x14\xc5\xd4\x06\
+\x34\x1b\x9d\x26\x84\x1e\x78\xb8\x0a\xe3\x1e\xd6\x84\x98\x11\x3b\
+\x00\xcc\xb6\x20\x9b\x2b\x66\x05\x3c\x00\x61\xe6\x24\x78\xe8\xc2\
+\x33\x44\xc7\x2f\x20\x46\x2e\xbb\x89\xa1\x5e\xbb\x77\xdf\x72\xc1\
+\x05\x17\xbc\xa3\xa7\xa7\xe7\x7f\x74\x5f\x34\x34\x34\xf4\xfe\xcd\
+\x9b\x37\xb3\xec\xc2\x9d\x07\xae\x7d\xab\x2c\x11\xe1\xaa\xe2\x23\
+\x03\xd6\x01\x57\x42\x77\xe9\x2c\x1e\xb8\x83\x58\x8b\xd8\x2e\x94\
+\xbf\x07\x18\xbd\xf5\xe3\xf6\xcf\x0b\x1b\x25\xd7\xbe\x95\x7e\xe0\
+\x5c\xe0\x0c\xe0\x6c\x62\x7d\x7b\x0f\xb1\x38\xa2\x87\xf8\xe3\xf7\
+\x30\x3f\x8c\xda\x26\x40\x85\x28\xf4\x76\x85\x4c\x4a\xd4\x28\x6d\
+\x52\x89\xe5\xe5\x24\x34\xfa\x44\x1b\x7d\xce\xcf\x2c\x95\xa9\x83\
+\x73\xff\x69\xdf\xe3\x8f\x1f\x12\x58\xb3\x3e\x61\xdd\x6b\xd6\xf1\
+\xba\xb3\x4e\x67\xd9\xca\xe1\x18\x1a\x36\x1b\xf0\xc8\xf7\xc0\x8c\
+\xc6\xc1\x51\x7e\xe2\xb1\x26\x7b\x27\xa0\xa7\x15\xbf\xb7\x36\x00\
+\x13\x2b\x61\x6e\x1f\xf8\x7b\x21\x9c\x0c\x4f\xdc\x78\xa6\x28\x06\
+\x76\x96\x10\x7f\xcf\x76\x7d\x41\xad\x5b\xb5\x8b\xc8\xe0\xe6\xcd\
+\x9b\x7f\x69\xc9\x8a\x9e\x0f\xa4\x83\x87\x71\x3d\x35\x92\x9e\x1a\
+\x52\xca\xe0\x88\xf1\x52\xba\xdf\x77\x0b\x7f\xe1\x0c\x89\xf6\xec\
+\xc8\x16\xf3\xc5\x2c\x7b\x88\x9d\xf6\x41\xe0\x0e\xb9\xf6\xad\xfc\
+\x3c\x45\xed\x5a\x7b\x3f\xbc\x61\xb8\x17\xe8\x1d\x5e\xbf\xb2\x07\
+\xb3\x3e\x83\x9e\x4a\x4f\xa5\x3a\xb8\x6c\xa8\x2c\x42\x15\x28\x23\
+\x51\x0b\xcc\x4c\x4c\xa7\xad\x7a\x2b\x2d\x82\xbb\x74\x6c\xef\xb8\
+\x03\xdc\xd8\xc8\x58\xda\xd5\xe0\x04\x90\x56\x9d\xc7\xa6\x46\x79\
+\xf4\xc0\x23\xec\x6c\x4d\x72\xf8\xf4\x84\xf4\x75\xeb\xf9\xb9\xf5\
+\x6b\x59\xb7\x62\x25\xd2\x6a\xc2\xae\x5d\x60\x46\x7d\x6c\x3f\x3f\
+\x52\x6f\xf0\x88\xc4\x70\xcf\x37\xa3\x6b\x10\x76\x42\x78\x18\x42\
+\x38\x89\x9d\xbd\xe7\x82\xeb\xb6\xca\x7a\x33\xde\x84\xf1\x46\x71\
+\x5c\xb9\xe0\x63\x2b\x16\x99\xb4\xae\xe7\x1f\x5a\xa5\xb7\x62\x43\
+\xcb\x87\xcc\xac\x4d\x04\x0b\x40\x98\x9e\x98\xd1\x56\xad\xd9\x9e\
+\x1c\xd7\x3a\x38\x72\xa8\x65\x90\x8d\x8f\x8c\x35\x11\xea\x40\x4d\
+\xda\xfb\x6b\xdf\xca\x4f\x0f\x6f\x18\xee\x1b\x5e\xbf\xb2\x6f\xd3\
+\xe9\x17\xf6\x0d\x0e\x2c\xeb\x5f\xde\xbb\xa1\xaf\xa7\x3c\xd8\xa7\
+\x66\xfd\x4b\xab\x6b\xfb\x7b\xca\x83\x7d\x40\x8f\x08\x65\xe7\x5c\
+\x05\xa8\xd4\xb3\xd9\xca\x44\x6d\x24\x11\x21\x69\x64\xb3\xa5\xc9\
+\xfa\x88\xab\xb7\x66\xdd\x64\x6d\x44\x10\x12\xc0\xb5\x1a\x99\xcc\
+\x4e\x4c\x73\x70\xef\xb8\x1b\xdb\x33\xd6\x9e\x06\x04\x02\xd3\x07\
+\xf9\xea\xf8\x0e\xfe\xe7\x9a\x11\xf6\xbc\x62\x1d\x1f\x5d\x33\xcc\
+\x25\xfd\x03\xb0\x27\xe6\x01\x66\xf7\x8c\x72\x69\xab\xc9\xc1\xbd\
+\xa0\x12\x27\x91\xe9\xf6\x22\xc7\x7f\x32\x7b\xfa\xcf\x16\xd7\x6d\
+\x95\xf5\xc0\xaf\x52\x3c\x29\xa5\x8d\xe2\xf9\x87\xd2\xf5\xfc\x43\
+\xeb\x7a\xfe\xa1\x15\x4f\x49\x33\x8a\xdf\xc3\xd4\xc2\x5c\x73\xca\
+\xc6\x67\x9f\x30\x33\x74\xae\x31\x15\xc6\x67\x9e\xf0\x8d\x6c\xd6\
+\x1f\x9a\x1d\x69\x69\xb0\xcc\x8c\x56\xab\xd1\x6a\xce\x1e\x9e\xa9\
+\x1d\x1a\x9d\x98\x1b\xdf\x37\x3e\x2b\x9f\xba\xe7\x77\x5e\x7f\xda\
+\xf2\x2d\x3d\x4b\xaa\x6b\xfb\x6b\xb5\xc6\xd2\x56\xb3\xb5\x34\xcf\
+\xfd\xa0\xa9\xf5\x8b\xd0\x6f\x46\x9f\x08\x55\x71\xae\xd7\x39\x29\
+\x25\x49\x52\x11\x27\x95\xc4\x25\x25\xe7\xa4\x24\xce\x25\x22\x38\
+\xe7\x5c\x9a\xa4\x89\x88\x88\x9b\x9c\x1b\x71\x23\x93\xdb\xdd\xc4\
+\xdc\x5e\x99\xac\xed\x85\x98\xfc\x71\x63\x23\xe3\x72\x70\x64\x9c\
+\xf1\x91\x31\x90\x48\x06\x0d\xfc\x59\xed\x01\xfe\xee\x47\xe7\xf8\
+\xe8\x92\x41\x2e\xac\xc5\xf5\x21\xa6\xbe\x78\x80\x8b\x9e\xa8\xb3\
+\xf7\xd0\x0f\x90\xb0\xbb\x71\x2c\xc1\x1f\xe3\xf9\x87\x9d\x94\x49\
+\xb1\x94\x9e\x15\xaf\xdb\x7b\x4c\xad\x1d\xfa\x9a\x6a\x3c\xa2\xaa\
+\x66\x6a\x21\x84\xe0\x55\x2d\x98\xaa\x1f\x9f\x19\xf1\x23\x87\xb6\
+\x67\xe3\xd3\x7b\x5b\x87\x6b\xa3\x4d\x33\x1a\x66\xcc\xca\xf7\x0e\
+\xdd\x7a\x23\xd0\x33\x33\x3d\x37\x34\x31\x3e\x39\xdc\x6c\x66\xcb\
+\x81\x3e\x11\x06\x12\x97\xf4\x89\x93\xde\x24\x71\x95\x24\x49\x2a\
+\xce\xb9\x9e\x24\x4d\xca\xc5\xfb\xd4\x39\x57\x12\x91\xc4\x39\x49\
+\xc4\xb9\xd4\x39\x49\x92\xc4\x39\x44\x9c\xc4\x4d\x9a\xf9\xac\xec\
+\x38\x70\xa7\xec\x3d\xfc\xb0\x6b\x64\x33\x26\x82\x34\xeb\x99\xec\
+\xdd\x31\x22\x7b\x76\x8c\xb4\xed\x98\x64\x53\x7c\xec\xb2\xfb\xd8\
+\x58\x0b\x8c\x7e\x67\x8a\x0f\x3c\x54\xb3\x1d\x27\x50\x1e\x27\x14\
+\xd7\x6d\x95\x0f\x11\x9f\x90\x22\x00\x17\x5c\x76\x91\xbd\xf4\xea\
+\x57\xc9\x96\x8d\xd7\xca\xb1\x9e\x7f\x68\x66\xdd\x45\xf4\xb4\x5f\
+\xab\x46\xc1\x47\xc9\x9b\x59\xe4\x86\x9a\xaa\xaa\x9a\x86\xa0\xaa\
+\x21\xf8\xa0\xea\x83\x0f\x5e\xd5\xbc\xcf\x7d\x56\x6b\x4e\x67\x8f\
+\xee\xbf\xbb\xb9\x6f\xe2\xd1\x86\x6c\x3f\xf8\xb5\xeb\x81\xea\xe1\
+\xc9\xe9\x25\x07\xf6\x8d\xaf\x69\x36\x5b\xcb\x92\xc4\xf5\x39\xe7\
+\x7a\x9d\x73\xbd\x69\x29\xed\x4b\x12\x57\x75\xce\xf5\x24\x89\xeb\
+\x71\x49\x52\x4e\x23\x09\xaa\xce\xb9\xc4\x25\xae\x04\x24\x69\x92\
+\xa4\x5d\xda\xc0\xb9\xc4\x25\x80\x13\x11\x44\xc4\x39\x11\xd9\x71\
+\xf0\x2e\x1e\x1d\xfb\x8e\x34\xb2\x99\x62\xd4\x0c\x19\x79\x64\x2f\
+\x8f\xde\xbf\x53\x00\x2a\x69\xef\xbe\xfe\x74\xed\x0d\x9f\xff\x8b\
+\x9d\x3b\x7e\x90\xd4\x7c\x1b\x45\xaf\xff\x17\x88\xd3\xd2\x2e\xbd\
+\xe6\x0a\xb9\xfe\x9a\xd7\xcb\xd9\xab\xaf\xee\xdc\xab\x99\xb5\x43\
+\xf3\x85\xf7\xdf\x2e\x87\x68\xab\xfd\xce\x25\x85\x11\x30\xb5\xd8\
+\xfb\x31\x34\x84\xa0\xaa\x16\x29\x10\x42\x08\x3e\x64\xaa\xe6\xbd\
+\xf7\x99\x06\xcd\xf2\xdc\xb7\x42\x08\xad\xd4\x9b\x6f\x02\xe4\x21\
+\x6f\xb6\xf2\x56\xdd\x87\xbc\x27\x98\x93\x24\x71\x22\xe6\x9c\x12\
+\x5c\x62\x09\x2e\x49\x9c\x33\x91\xc4\x12\xf5\x2a\x96\xa4\x09\xce\
+\xb9\x52\xa2\x89\x24\x89\xb3\x40\xc0\x99\xc3\x89\x98\x98\x43\x14\
+\x92\xc4\x59\x3b\xf3\xef\x9c\x93\x33\x87\x2f\x77\x67\x0e\x5f\x6e\
+\xdb\xf6\x7d\xa3\xfd\xac\x3d\xd9\x70\xce\x06\x86\x37\x0c\xdb\xb6\
+\x3b\xb6\x31\x3d\x31\xb3\xb6\xe5\x77\x3e\x7c\xe5\xeb\xf9\x05\x11\
+\xf9\xdb\xc5\x9c\x37\xff\x7c\xe3\xba\xad\xf2\x53\xc0\xcd\x80\x74\
+\x3d\xff\x50\x01\x72\xcd\x1d\x74\x86\xc0\x8f\x22\x7e\xb1\x88\xea\
+\xfc\xf1\x76\x7f\x67\xfe\x7c\x35\x33\xd5\x18\x14\xa9\x2a\x6a\x86\
+\x6a\x30\x35\xb3\xa0\xc1\x82\x29\x41\x03\x6a\x8a\xd7\x80\x37\x8f\
+\x0f\xc1\xd2\x10\xf2\x48\x80\xbc\xd5\x08\xea\x1b\xde\xe7\x73\xe2\
+\x1c\xaa\x82\x4b\x1c\x58\x42\x50\x4f\x92\x26\x38\x71\xaa\x89\xd3\
+\x24\x4d\xc4\x2c\x88\x4b\x12\x51\xf5\x12\x82\xa4\x22\xce\x92\xc4\
+\xa9\x38\x49\x93\x24\xde\x8f\x6a\x82\x73\xce\x89\x60\x1a\x00\x91\
+\x20\x22\x72\xee\xea\x1f\x72\xab\x06\x37\x71\xcf\xe3\xff\x47\x9b\
+\x7e\x4e\xca\x3d\x65\x2e\x7f\xc5\x65\xec\xbc\x6f\x97\xec\xd9\x31\
+\x62\xd5\x7e\xfe\xf2\xb2\x1f\xa3\x2a\x22\x7f\x4d\x2c\xb9\x7e\x41\
+\x6b\x83\xeb\xb6\xca\x4f\x02\x9f\x04\xec\xbc\x4b\xb6\x58\xf1\xfc\
+\x43\xf1\x3e\xc3\xac\x98\x13\x15\xd5\x3c\x2c\x24\x40\xf7\xc8\x59\
+\x21\x78\x11\x41\x4d\x0b\x3f\x80\x79\xbf\xc0\xcc\x54\x4d\x35\xb2\
+\xc1\x42\xf4\x05\x2c\x84\xa0\x21\x36\xef\x44\xdf\x00\x00\x13\x32\
+\x49\x44\x41\x54\xa8\x85\xa0\x04\x1f\x88\xf6\xc1\x9b\x6a\x20\x55\
+\x0d\x19\x20\x66\xda\xf4\x79\x5e\xcf\xf3\xbc\x9c\xa4\x09\xaa\x62\
+\x89\x39\x67\xaa\x88\x13\x34\x04\x75\x89\x13\x23\x15\xd5\xe0\x34\
+\x4d\x48\x4c\x63\x8f\x77\x4e\x93\xc4\x99\x99\x13\xe7\xc4\x9b\x39\
+\x11\x11\x33\x53\x44\x9c\x39\x27\x26\x22\x22\x82\x20\xe2\x00\x1d\
+\xaa\x0e\xcb\x4b\x37\xdf\xc4\x1d\x3b\x6f\xa1\xe9\xe7\xc4\x0c\x36\
+\x5d\xbc\xc9\x06\x97\x0f\xca\xb6\x3b\x1e\xb2\xfe\xe5\xfc\xd9\x45\
+\xaf\xa4\xfa\xc0\x3f\xf3\x31\x11\x99\x3b\x99\x9f\xc0\xfd\x54\xb8\
+\x6e\xab\xbc\x01\xf8\x04\x10\x8a\xe7\x1f\x4a\x4f\x69\x80\x10\xbc\
+\x98\xe1\xe2\xb2\xb8\xed\xa2\xb8\x88\x23\x87\x4b\x8f\x84\x16\x0e\
+\x1f\x85\xff\x50\x68\x7f\xac\x70\x03\xa2\x3b\xa0\xa1\xf0\x06\x09\
+\x3e\x98\x99\x59\x08\xc1\x34\x14\xe6\x20\xa8\xf9\xe0\x35\x84\xa0\
+\xa9\xd7\xbc\x05\x58\x2b\x6b\x95\x72\x9f\x37\xf2\x90\x97\x82\x79\
+\x9c\x73\x92\x7b\x21\x49\x9d\x25\x89\x93\xe0\x9c\x25\xe6\x24\x98\
+\xb7\x24\x49\x70\xe6\x2c\x09\x2e\x9a\x82\xc4\x11\x34\xba\xfa\x69\
+\x29\x29\x8b\xba\x5c\x84\xd4\x25\x0e\xe7\x9c\x89\x16\x81\x80\x2b\
+\x58\x20\xe2\x50\x2c\x75\x15\x77\xd5\xa6\xd7\x73\xd7\xae\xcf\xc5\
+\x67\xed\x09\xac\x5c\xbf\x92\x2d\x2f\xbd\x40\xb6\xdd\xfe\x10\x4b\
+\x56\xf3\x47\x9b\x5e\xc2\xd4\xae\xef\xf0\x05\x11\x39\x21\xe3\xe3\
+\xcf\x27\xae\xdb\x2a\x57\x02\x7f\x0b\xe8\x95\xd7\x5f\x6d\xaf\xbe\
+\xf6\x17\x49\x5d\xc5\x65\x3e\x13\x53\x95\x76\x15\x3c\xf3\xfb\x4e\
+\xf1\x94\x41\xb7\xe7\xd7\xf9\x4c\xe7\x23\x80\x38\x87\xaa\x7d\xc2\
+\xbc\xf0\x2d\x84\xb6\x1f\xa0\xc1\x4c\x2d\xf8\x60\x21\xc4\x18\xc1\
+\x87\x60\xde\x7b\x0d\x5e\xcd\x87\x40\x1a\x22\x01\x50\xf3\xcd\xdc\
+\x67\xb5\x2c\x6b\xa5\xce\x39\x44\xd0\xb4\x94\x9a\xe6\x82\xaa\x33\
+\xe7\x9c\xa9\x39\x24\x38\xd2\xd4\x21\xc1\x69\x9a\x26\xaa\x38\x5c\
+\x70\x26\x4e\xd4\x39\xb1\xa0\xce\x5c\xe2\x4a\x49\xe2\x40\xc5\x92\
+\xe8\x28\x02\x88\x68\xb4\x08\x40\x28\xe8\xa0\x89\x2b\xcb\x86\x65\
+\x17\xca\x8e\x03\x77\xb6\x6f\xde\x56\xae\x5f\xe9\xb6\x5c\x73\x01\
+\xdb\x6e\x7f\x88\xd5\x9b\xf8\xe0\xae\xef\xb0\x1d\x78\xf4\x05\x48\
+\x82\xbf\x01\x7c\xfb\xf9\x87\xa9\x2b\x3b\xef\x33\xd3\xd8\xeb\xe7\
+\x33\x7b\x66\xdd\xaa\xbe\x4d\x88\x63\xd5\xcf\xc6\xfd\xbc\x0b\x60\
+\x6d\xa8\xc6\xb5\x75\x54\x4d\x23\x07\xd4\x88\x87\x83\xaa\xaa\x0f\
+\x41\x35\x68\xee\xbd\x8f\x2f\x43\x08\xde\xab\x4f\x83\xe6\x39\x40\
+\xab\xd5\x4c\x7c\xc8\xeb\x41\x7d\x1a\x14\x8b\xc2\x0c\x94\xca\x09\
+\xaa\x42\x92\x26\x04\x13\x73\x22\x18\x09\xce\x39\x55\x15\x5c\x88\
+\xbd\xdc\x25\x4e\x13\xe7\x70\x89\x53\x67\xce\x54\x23\x29\xd4\x89\
+\x3a\x75\x26\x22\x2e\x8a\x5c\x3c\xe0\x62\x7d\xa7\x13\xe7\xc4\xad\
+\x1d\x3a\x5b\x0e\x4c\xef\x74\x33\x8d\x43\x80\x21\x88\xad\x5c\xbf\
+\x92\xc1\xe5\x83\x32\x3d\x31\xb3\xf4\xfc\x6b\x79\xd7\xf6\x6f\xf1\
+\xa7\x44\x12\x4c\xbf\x10\x52\xc0\xd7\x6d\x95\x77\x02\x6b\x86\x96\
+\x0f\x86\xcd\x67\x5f\xc0\xba\x25\xe7\x48\xee\x5b\xa8\x9a\x60\x88\
+\xb6\x3d\x36\x3a\x2a\xff\x88\x50\xaf\x1d\xf3\x77\x1f\x6f\xab\xfb\
+\xf8\xba\x1d\x0d\x68\xb1\x8f\xe2\xd6\x18\x0a\x98\x59\x4c\x95\x7b\
+\x1f\x82\x06\xcd\x35\xa8\x0f\x21\xa8\xf7\x21\x04\xaf\x3e\x84\xe0\
+\x43\x50\x9f\xfa\x90\xe7\x80\x05\xf3\x49\xab\xd9\x6c\x7a\x1f\x4a\
+\xce\x09\x6a\x45\x17\x6d\x7a\x92\x34\xb1\xa0\xde\x5c\xe2\xcc\x39\
+\x27\x6a\x41\x93\xc4\x29\x22\x96\xa4\xce\x12\xe7\xcc\xa9\x33\x4d\
+\x9c\x49\x90\x92\x73\x4e\x5d\xe2\xd4\x39\x29\x89\x88\x39\x27\x2a\
+\xce\x25\xce\x39\x15\xc1\x89\x48\x52\xd0\xc1\x39\x91\x80\xe0\xd6\
+\x0c\x9e\x6d\xd3\xf5\xf1\x22\x5b\x68\x01\x13\xb7\xf9\xe2\x4d\xdc\
+\xf3\xf5\x7b\x65\xc9\x1a\x7e\x04\xf8\x27\x62\x4e\x7b\x27\x8b\xb4\
+\xa8\xe2\xb3\xc4\xff\x03\x64\x67\x5d\xba\xd9\xd6\x0e\x9d\x2b\x59\
+\x9e\x25\xc1\x07\x17\x82\x1a\x10\x44\x10\x59\xd8\xc9\xdb\x07\xda\
+\x16\xbe\x1d\x15\xcc\x1f\xef\x7c\xd2\x36\xf9\x6d\x6d\x10\xa3\x40\
+\x14\xcc\x82\x8f\x66\xde\x54\x55\x83\xe5\x21\x66\x03\x7c\xf0\x21\
+\x0b\xaa\x3e\xe4\x21\x0b\x41\x7d\xf0\x21\x4f\xbd\xc6\xc2\xed\x66\
+\xab\x91\xe7\x3e\x6b\xe4\x79\x48\x45\xd0\x24\x49\x4c\x9c\x20\x82\
+\x06\x73\x31\x0a\x88\xf5\x5c\xea\xd4\x85\xd4\x12\x01\x34\xd1\xa2\
+\xd7\x07\x51\xe7\x9c\x77\x89\x54\x9d\x73\x96\xa8\x33\x44\x34\x49\
+\x9c\xba\xc4\xa5\x4e\xc5\x44\xc4\xc4\x49\xe2\x9c\x98\xa8\xa4\x22\
+\x62\x44\x42\x68\xe2\x4a\x62\x86\x08\x38\x33\x40\x4c\x07\x97\x0d\
+\xca\xd0\xb2\x41\x99\x9e\x9c\x19\x3a\xfd\x12\x6e\xd8\x7d\x1f\x73\
+\xc0\x94\x88\xb4\x6c\x11\x96\x55\x7d\xa6\xb8\x6e\xab\xfc\x04\x30\
+\x3c\xb4\x7c\x30\x1f\x5a\x3e\x64\x89\x4b\x93\x66\xab\xe1\x42\x08\
+\xda\x1d\xcc\x31\x2f\xf2\x36\xda\x62\x97\x05\x8e\xa0\x98\x99\x89\
+\x48\xe1\xed\x77\x27\x82\xa2\x36\x34\x33\xd5\x60\xa1\x30\x07\x21\
+\x04\xf5\x66\xa6\x3e\x0f\xde\xcc\xda\xbd\x3e\x0f\x5e\x73\xef\x43\
+\xae\xaa\xb9\xcf\x43\x96\x06\xf5\x3e\x7e\x59\x68\xa9\x85\x54\xd5\
+\x27\x88\xa0\x16\xa2\x03\x27\xa2\x52\x98\x03\xe7\xc4\x92\xa8\xe2\
+\x51\x0d\xe6\x9c\x78\x35\x31\xa7\xce\x8b\x13\x4d\x9c\x0b\xce\x1c\
+\x89\x73\x16\x54\xd4\x39\xa7\x21\x88\xba\x44\xd4\x89\x24\x2e\x71\
+\xa9\xb8\xf8\x1a\x11\x75\xae\x93\x31\x4c\x2a\x6e\xc0\x99\x9a\xe0\
+\x24\xfe\x00\x91\xf7\x6e\xe5\xfa\x95\x36\x3d\x31\xe3\x96\xae\xe1\
+\xa2\xdd\xf7\x71\x27\x71\x08\xf4\x30\x27\xf8\xf1\x6a\xcf\x12\x37\
+\x02\xfe\xb4\x73\x36\x98\x99\x49\x59\xfa\x5d\x96\xb5\x50\x55\x45\
+\x44\xe9\x8e\x6a\x8f\xa5\xff\x0b\x8f\xa0\xe8\xee\xd2\x11\xfc\xfc\
+\x39\x6d\x3b\xa0\x1a\x34\xba\x14\x51\x07\x04\xd5\x82\x04\x41\x7d\
+\x08\xea\x55\x2d\xf8\xdc\x67\xa6\xe6\x43\xd0\x2c\x84\x90\xe7\x59\
+\x68\xa9\x6a\xcb\xe7\xa1\x95\xe6\x21\x0b\x80\xd5\x9b\x0d\x87\xb3\
+\x3c\x58\xc8\x4c\x8d\x10\x34\x94\x4a\xa9\xb8\xc4\x89\x79\xd5\x42\
+\xfd\x6b\x6a\x89\xe1\x09\xe2\xa2\x60\x93\xc4\xa9\x88\x53\xe7\x24\
+\xb8\x44\x42\x12\x12\x75\x4e\xbc\x38\xa9\xb8\xc4\x45\x73\x10\x24\
+\x88\x48\xc9\x25\xce\x5c\x24\x94\xba\x44\x12\x27\x92\x02\xe6\x12\
+\x67\x8d\x6c\xda\x99\xe1\x50\x73\x22\x88\x89\x08\x8a\x54\x7a\x2a\
+\x30\xbf\x5e\x48\x3f\xb1\x2e\x61\xaf\x88\x1c\x31\x94\x7a\x92\xc1\
+\x13\x87\x5f\x55\x03\xe9\xe4\xec\x01\x57\xa2\xdf\x1b\x9d\x58\x7f\
+\x61\xd7\x3f\x3a\xf2\x8b\xe1\x72\xfb\xc3\x76\xc8\xd7\x59\x4b\xa5\
+\xb0\x01\x6d\x3f\x42\x83\xd7\xa0\x66\x21\x76\xff\xb8\xd0\x72\xf0\
+\x21\xd7\x60\xc1\xfb\x90\x85\xa0\x79\xf0\x9a\x05\x1f\x5a\x21\x68\
+\x33\x84\xd0\x0a\x5e\x5b\x69\xd0\x4c\x01\x73\x89\xfa\x3c\x6f\xe5\
+\x59\x96\x89\x4b\x9c\x95\xca\x89\xe5\x59\x4b\x24\x88\x02\x9a\x4a\
+\x62\x66\xa2\x86\x53\x20\xc4\x64\x90\xa8\xaa\x98\x38\xb1\x34\x75\
+\x1a\x4c\x08\xa1\xa3\xf6\x83\xa8\x54\x44\xc4\x27\x89\xab\x38\x27\
+\x2a\x2a\x41\x44\x52\xe7\x24\x71\xea\x52\xe7\x44\x01\x27\x2a\xae\
+\x9e\xcd\xa6\xa6\xa6\x08\x69\x74\x11\xcd\x21\xf8\x15\xeb\x56\x8a\
+\x19\xae\x6f\x29\xe7\x11\x6b\x0d\x96\x12\x8b\x55\x26\x38\x79\x7d\
+\x81\xeb\x81\xc6\xca\xf5\x2b\x9d\xcf\xcd\xe6\xea\xd3\xa5\xfe\x72\
+\x29\xd0\x35\x8e\xb3\x40\xc7\xb7\x05\x4c\x91\x2f\x81\x28\xf7\xee\
+\xe4\x90\xcc\x0f\x02\x75\xbc\x7f\x6d\x3b\x83\x1a\x34\xa8\x9a\xc7\
+\xac\x08\xff\x2c\x44\x3b\xaf\x99\x06\xcd\x54\x35\xcf\xb3\xd0\x54\
+\xd5\xcc\xe7\xa1\x69\x66\x99\xcf\x43\x23\xf5\x21\x33\x40\x6a\x73\
+\xb5\x50\x9b\xab\x67\xcd\x46\x46\x6f\x7f\x55\x6b\x73\x4d\x4d\xd2\
+\x04\x87\x2b\xd2\x4f\x8a\x88\x98\x8b\xab\xb9\x69\x12\x3d\x7b\x2f\
+\x82\x4f\x12\x17\x42\x70\xed\x9e\x9f\xb9\xe0\x82\x38\xf1\x4e\x24\
+\xb8\x44\x4a\xce\xb9\x20\x4e\xca\xce\x49\x29\x6a\x05\x29\x49\x10\
+\x13\xa2\x26\x10\x91\x64\x6c\x7a\xb7\x6a\xb0\xd4\x25\x82\x05\x13\
+\x11\x12\x13\x11\xe7\xcc\x31\xff\x60\x05\x88\xc5\x29\x4b\x88\x05\
+\x29\x27\x2b\x01\x5a\xc4\xde\xef\x42\xae\xd5\x03\x53\xbb\xb3\xf5\
+\x43\x7d\x47\xe6\xf8\x8f\xf4\x00\x0c\x10\x27\xe2\x98\xb7\x08\x40\
+\x27\x0d\xdc\x6d\x21\x0a\x85\xdf\xfe\x87\x6a\x50\xd5\x98\xf1\xf5\
+\x98\xa9\xf7\x9a\x43\xdb\xee\x6b\xee\xf3\xd0\x52\xb5\x2c\x04\xcd\
+\xd5\x6b\x33\x6a\x00\x6d\x6a\xd0\x66\x9a\x87\x96\x02\x56\xea\x71\
+\x78\xcd\x5d\x5a\x91\x90\xc5\xd4\x80\x53\x1f\xa4\x5c\x29\x11\x34\
+\x98\x7a\x31\x33\x0b\xd1\x93\x17\x1f\x4c\x54\x44\x54\x44\x42\xa2\
+\xa2\x78\xf1\x49\xe2\x7a\x00\xef\x12\x09\xce\xb9\x5c\x9c\x64\xce\
+\x49\x8f\x73\x92\x3b\x27\x5e\xa2\x26\x08\xce\x39\xef\x9c\xa4\x05\
+\x11\x92\xb9\xd6\x78\xa9\xd6\x98\x4d\x9c\xc3\x82\x11\xc4\x91\x8a\
+\x88\x89\x98\x1b\xdb\x77\x08\x33\x5c\xed\x30\xdb\x88\x44\x48\x28\
+\xa6\x86\x1f\x4f\x09\x7e\x9f\xf8\x12\x70\xdd\xd8\xc8\x98\x1b\x5c\
+\xba\x34\x69\xb6\x66\x92\x71\xdb\x63\x83\x3d\xc3\x47\x9a\x7a\x39\
+\x62\x9d\xdc\x4e\x8f\x97\x98\x37\x03\x8b\x5e\x77\xe7\x81\x6a\x5d\
+\x29\x71\x8d\xcf\xaa\x31\x55\x53\x88\x0e\xa0\x9a\xa9\xc5\x24\x5f\
+\x1e\x82\x66\xd1\x27\x50\x9f\x67\xa1\x19\xb5\x80\xb5\x7c\x1e\x4d\
+\x80\xa9\xb5\x82\x0f\xf5\xd4\x6b\x9c\x37\x37\x3b\x3b\xa7\x6a\x3e\
+\xa4\xe5\x34\x6f\xd6\x33\x6b\x35\x72\xeb\xe9\x2b\x9b\x36\x3d\x80\
+\x89\x13\x73\xce\x45\xad\x13\x4c\x9d\x09\x51\x85\x8b\x0f\x2a\x01\
+\xc1\xbb\xe0\x72\x97\x88\x97\x40\xee\x12\xe7\x45\xa4\x2a\x51\xf8\
+\x3d\x2e\x91\xf8\xb9\x93\x8a\x4b\xa4\x0c\x92\xb8\x44\x82\xa1\xa5\
+\x89\xb9\x51\x55\x2c\x05\x52\x11\x92\xf8\x13\x98\xc3\x89\x6b\xcc\
+\xb5\x14\x23\x8d\x21\x0e\x4a\x34\x03\x27\x3b\x01\x9a\xc0\x9c\x99\
+\x95\x83\xb7\x92\xcf\x55\x26\x66\xf6\x93\xd0\x4b\xe2\x52\x93\xf9\
+\x60\xaf\xdb\xce\x43\x7b\xfa\xa4\x8b\xf6\x5f\x8a\x45\xaa\xba\x9c\
+\xc3\xee\x3a\x00\x03\xd4\x2c\xaa\x7f\x83\xa0\xd1\x0f\xc8\x35\x68\
+\x6e\x46\x08\x3e\xb4\x7c\x16\xb2\xe2\x58\x16\xbc\x36\xbd\xd7\xa6\
+\x06\x6d\xe5\x59\xa8\xab\x6a\xab\x6d\x02\xa8\xcd\xd6\x2c\xad\x38\
+\x6d\x35\x9a\x5e\x1c\x26\xce\xac\xd5\x6a\x59\x6f\x7f\x05\x9f\x87\
+\x10\x32\xd5\x24\x75\x06\x84\x98\xec\x11\x25\x66\xf4\x02\x90\xbb\
+\x44\x02\x44\x93\xe0\x9c\xf4\xb8\xd4\xe5\x4e\x24\x73\x4e\xaa\x88\
+\x78\x71\x94\xd3\x34\xa9\x88\xe0\x5d\xe2\x72\xe7\xa4\x6c\x79\xd0\
+\x89\xfa\x88\x37\x09\x25\x11\x4a\x24\x12\x44\x48\xc4\x08\xce\xc5\
+\x3a\xc3\xb1\xbd\xe3\x66\x06\x87\x47\x3b\x1a\x60\x61\x6d\xdc\xc9\
+\x88\x6f\x00\x97\xec\x79\x64\x6f\x7e\xce\x65\x4b\xd2\xe0\xcd\x02\
+\x19\xa3\x93\x8f\xb2\xa2\x7f\x83\x39\x99\xaf\xc5\x3d\x42\xf0\x42\
+\x1c\x2d\x89\x07\x45\xa2\x23\x58\x04\xfa\x44\x8d\xd1\x49\x00\x75\
+\x8a\x40\x82\xcd\xf7\x7c\x6f\x10\x34\x58\x1e\x7c\xc8\x55\x2d\x0f\
+\x5e\x5b\x1a\xb4\xe5\x73\x6d\x9a\x59\x16\x82\xb6\x34\x68\xa3\xd5\
+\xf2\x8d\xe0\xa3\x09\x00\xb0\xa9\xc9\x59\x03\xac\xd5\xcc\xad\x7f\
+\xa8\xaa\xd6\xf4\xb9\x88\x93\x7a\xbd\x91\x25\x89\x53\x49\x45\x72\
+\x9f\x8b\x99\xa9\x78\x31\x97\x44\xf5\xef\x9c\x78\x55\xcb\xa3\xda\
+\x17\x0f\x78\xe7\x5c\x46\x4e\xd5\x39\xc9\x5d\x2a\xb9\x73\xae\x25\
+\x42\x35\x04\x97\x89\x93\x4c\x44\x2a\x2a\x79\x65\x2e\x3b\x94\x1b\
+\xa1\x1c\xb5\x04\x65\x33\x4a\xce\x51\x2a\xe6\x0f\xda\xec\xc4\x8c\
+\xce\x4c\xcc\xa6\xc1\x33\xbd\xe7\x41\xb6\x11\x7b\x44\x7b\xfd\x9e\
+\x13\xfe\x84\xad\x67\x8a\x5b\x3f\x6e\xb7\x5f\xb7\x55\xde\x30\x33\
+\x39\xbb\x6a\xf6\xf0\x8c\x94\x4a\x3d\x41\x83\x09\x92\xd9\xc1\xc3\
+\x4f\x30\xd8\xbb\x92\x84\x32\x31\xba\x03\x71\x71\xf1\x5b\x71\x1d\
+\x32\x38\x27\xed\x09\xf5\x47\x40\xcc\x50\x9b\x1f\x1c\xd6\x10\x54\
+\x4d\x2d\x60\xa8\x9a\xe5\xc1\x6b\xde\x0e\xf9\x34\x74\x04\xde\xd2\
+\x60\x99\xcf\x43\x33\x04\x6b\x06\xaf\xed\xad\x91\xb6\x9f\x9d\xb7\
+\xf7\xb1\x71\x3b\xeb\x92\xd5\x1a\x34\xa7\xd9\x68\xaa\x4b\x49\x9a\
+\xf5\xa6\x77\x4e\x2c\x2d\xc5\xe1\x5d\x44\xd4\xd4\xbc\x73\xa2\xde\
+\x9b\x8a\x8b\x8b\xb2\x3b\x27\x5e\x54\xbc\x88\xe4\x22\xb4\x9c\x93\
+\x1e\x04\xef\x9c\xcb\x45\xc9\x44\xa4\x92\x24\x2e\x0f\x41\x2a\x92\
+\x48\xde\xf4\xb3\x79\xae\x75\x2f\x4e\x72\x11\xc9\x5d\x62\x65\x4c\
+\x54\x0a\x35\x2f\x10\x4c\x29\x3d\xf6\xe0\xee\x92\x19\x3a\xb1\x97\
+\xdb\x89\xd5\xae\x46\x54\xaf\x8b\xb6\xaa\xd6\xb3\xc0\x17\x05\x7e\
+\x6a\xf7\x43\x4f\x70\xe6\x96\x73\x54\x83\x39\x33\x33\x4f\xc6\xa1\
+\x6c\xd4\x2a\xa5\x3e\x7a\x4a\x03\x1d\x21\xc7\x41\x32\x92\xf9\xf4\
+\x60\x31\x7a\x1a\x13\x63\xd6\x3e\x1e\x45\x6f\x98\x45\xf5\x6f\xaa\
+\xc1\x14\x8d\x86\xd9\xbc\xaa\x79\x0d\x51\xe5\xab\x5a\xe6\xb3\xe8\
+\xf1\x07\x6f\x4d\x9f\x87\xa6\xaa\x35\x43\xd0\x96\x7a\x6d\xf8\x5c\
+\x5b\x69\xae\x91\x00\x3f\xb2\xf5\x3c\xfb\xa7\xbf\xd9\xa6\xab\x4f\
+\x1f\x34\x20\x99\x99\x6c\x6a\x5a\x72\xa1\x54\x49\xd5\x9c\x59\xb3\
+\x96\xab\x19\x94\x2a\x89\x59\xc0\x30\x0b\xe2\x24\x38\x27\x21\x28\
+\x41\x62\xef\xcf\x9c\x93\x5c\x9c\xe4\x66\x96\x39\x27\x15\xe7\xa4\
+\x25\x89\xab\xb8\x40\xcb\x6b\x56\xf1\xda\xac\x4a\x62\x15\x97\x48\
+\x4e\xb0\x4a\x92\xba\x8a\x42\x6e\x46\x70\x86\x07\xca\xa2\x56\x3a\
+\x3c\x36\xa9\xd3\x93\xb3\xa6\x39\xb5\x5d\xdf\xe1\x4e\x62\xef\x57\
+\xa2\xf0\xa7\x58\xe4\x75\xf6\x9f\x0e\xb7\x7e\xdc\xbe\xf1\xc3\x6f\
+\x91\x97\xcc\x4e\xcd\xad\x9b\x3c\x30\x19\xfa\x87\x86\xe6\x7d\x16\
+\x31\x0d\xf9\xac\x6b\x50\xb3\x52\xda\x23\xe5\x52\x05\x41\x5c\x21\
+\x7a\x57\x18\x00\x27\x9d\x65\xb1\xe3\x55\xc5\xbe\xab\x10\x14\x33\
+\xa2\xf7\x1f\x6b\x00\xcd\x9b\xb5\x09\xd0\xee\xfd\x96\x05\xaf\xad\
+\xe0\xb5\xa9\xc1\x5a\xaa\x16\x85\x1f\x8f\x35\xd2\x3c\xb4\x78\xcf\
+\x0d\x7f\x6f\x1f\xfe\xea\x4f\x4a\x30\x8f\x57\x4f\xff\x50\x59\xbd\
+\xa6\x6e\x76\xb2\x19\x48\x54\x82\x0a\xb9\x0f\x38\x27\x34\x9b\x9e\
+\xb4\xec\x82\x13\xd1\xac\x19\x34\x29\x39\xaf\x6a\x3e\x49\x5c\x2e\
+\x8e\x8a\x20\x5e\x1c\x99\x88\x64\x08\x15\x71\xb4\x34\xf3\x55\x13\
+\x9f\x99\x59\x25\x49\x25\x13\x93\xaa\xaa\x65\x2e\x91\x2a\x5e\x7b\
+\x62\xd2\x88\x80\x91\x9b\xe1\x0f\x8f\x4d\x56\x76\xde\xbf\x33\x20\
+\x84\x27\x1e\xe0\xf3\xc4\xde\x9e\x30\xbf\xfe\xee\x04\x27\x39\x01\
+\x00\x82\xe7\x93\x2e\xe5\x6d\x8f\x6d\x7b\xdc\xaf\xdb\xb4\xb1\x77\
+\x68\xd9\x10\xc4\xdc\x7e\xdc\xa3\x92\xe7\xb3\xd2\x68\xd6\x48\x5c\
+\xea\x4a\x69\x99\x38\x3c\x82\x43\x70\x14\x4e\x62\x57\x3e\xa0\x13\
+\x12\xc7\xfa\xaf\xf8\x78\x15\x0d\x16\x54\xcd\x9b\x5a\xa6\x6a\x41\
+\xbd\xe5\x41\x35\xb3\x60\x2d\x0d\xd6\x0a\x05\x09\x34\x58\x53\xd5\
+\x5a\x79\xe6\x9b\x59\x2b\xab\x7b\x1f\xb2\x23\xe6\x06\xbe\xf2\xad\
+\xe7\x74\x4f\x15\x6b\xbf\x76\x3d\x03\x25\xe9\xe9\x2f\xa5\xc1\xab\
+\xf3\xb9\xc6\xe2\xcf\x92\x4b\x35\x58\x0a\x94\x54\x2d\x2d\x57\x92\
+\x8a\x99\x95\x44\xa4\x0c\x56\x46\xac\xaa\x1a\x2a\x92\xc4\x89\x24\
+\x49\x22\x15\x71\xd2\x23\x8e\xaa\x73\x52\x11\x91\xaa\x4b\xa5\xa7\
+\x88\x0a\x7a\xc4\x51\x15\x91\xca\xf4\xc4\x54\x75\xd7\x03\xbb\x2a\
+\x22\x54\x0e\xec\xe2\x1b\x7b\xb7\xf3\x38\x51\xf8\xed\x47\xac\x3d\
+\x0a\xec\x34\xb3\xb9\xe3\x22\xb5\xe7\x19\x97\xbf\x5a\xce\x03\x5e\
+\x9d\x35\x18\x5a\xbf\x69\x43\x69\x68\xc5\xd0\x11\x23\x99\xe2\xba\
+\x9c\x3e\x17\xcb\x27\x9d\xc4\xa2\xca\x82\x0c\xd1\x4c\x14\x7b\xeb\
+\x88\x1f\x30\x62\xc5\x97\x5a\x08\x3e\x3e\x59\x4b\x15\xaf\x6d\xfb\
+\xef\x35\x0b\xde\x62\x49\xb8\x6a\xe6\x7d\xe8\x64\x00\x7d\xae\x2d\
+\x53\x5a\x47\x10\x40\x44\xe4\xfa\xb7\x9c\xd1\x59\xd0\x65\x60\x59\
+\x39\x99\x9d\xcc\xac\x67\x20\x4d\x2a\x3d\xa9\x34\xe6\x72\x49\x4b\
+\x2e\x29\x55\x92\x34\x6b\x86\xa2\x1a\xb8\xb3\xd2\x66\x49\x9c\xa4\
+\x22\x94\xc1\x4a\x20\x65\x11\xca\xe2\xa4\x02\x94\x93\x54\x2a\x22\
+\x54\x9d\x93\x1e\x71\x52\x49\x52\xa9\x02\x3d\x49\xea\xaa\x22\xf4\
+\xb8\x44\xaa\xfb\x76\xed\xab\x1c\xdc\x3b\xd6\x2b\x42\x75\xec\x31\
+\xfe\x75\xdf\xf7\xd8\xc3\xfc\xcc\x23\x25\x3e\x5e\xed\x11\x60\xfc\
+\x24\x4e\x03\x1f\x01\x11\x71\xe7\xfe\x1b\xce\x2d\x55\x78\x45\x9e\
+\xd1\xb7\x7c\xf5\x72\x56\x9d\xb6\xca\x64\x7e\x9d\x84\xa2\x6a\xb6\
+\x43\x04\x27\x8e\xa4\xf3\x5a\x0a\xd3\x60\xb8\xce\x15\xdd\x23\x80\
+\x8a\x8f\x6e\xa0\xe5\x85\xfd\xf7\xaa\xd6\x6a\x9b\x01\x9f\x6b\x2b\
+\x0e\x07\x5b\xcb\x8c\x96\x69\x3c\xe6\x33\x6d\x99\xe1\x8f\x9a\x1d\
+\xdc\x9d\xa2\xbc\xfe\x67\xce\x10\x0a\x4d\xd0\xbf\xac\x2c\x21\x57\
+\x97\x94\x5c\xa2\xc1\x5c\xd6\x0c\x92\xa4\x92\x38\x27\x25\x97\x8a\
+\x68\xb0\x34\x49\x5d\x7b\x1e\x61\x09\x28\x25\xa9\x94\xcc\xa8\x88\
+\x50\x76\x89\x2b\x8b\x50\x71\x89\x54\x9c\x93\xaa\x48\x14\x3e\x42\
+\x35\x78\x5f\x7d\xe2\x7b\xbb\x7b\xeb\xb3\xf5\xaa\x08\x3d\x63\xbb\
+\xb9\x67\xf4\x11\xf6\x31\x3f\xe5\x0c\xe2\xe0\xcf\x6e\x60\x9f\x2d\
+\xc2\xaa\xda\xdf\x0f\x44\xa4\x74\xfa\xc5\x9c\xdd\x33\xc4\x4b\x42\
+\x4e\xa5\xa7\xaf\x2a\xeb\xce\x5a\x4f\xb9\x12\xdd\x02\x71\x85\xa0\
+\x21\x3a\x82\x4e\xa2\x19\x80\xa4\x18\x3e\x8f\xbd\x7f\xbe\x6e\xb0\
+\x78\xba\x9e\x05\x55\x82\x59\xbb\xe6\xd3\x7c\xf0\x9a\x99\xb6\x7d\
+\x00\xcb\xd4\x5b\x5e\xd8\xfe\x2c\x7e\x46\xee\x73\xcd\xcc\x2c\x0b\
+\xb9\xe5\x4f\x3a\x3d\x5c\x44\xe4\xfa\x9f\x39\x43\x56\x9e\xd6\x2b\
+\x00\xe3\x7b\xea\x1d\x3b\x54\xe9\x4d\x92\x52\x35\x91\x56\xdd\x8b\
+\x29\x69\x92\x4a\xe2\x12\x49\xda\x44\x10\xa4\x84\x50\x72\x89\xa4\
+\x40\x49\x44\xca\xe2\x28\x27\x89\x94\xc5\x49\x45\x84\x4a\xd1\xf3\
+\xab\x13\x07\x26\xaa\xfb\x1f\xdf\xdf\x83\xa3\xd7\x14\xf7\xf8\x77\
+\xb9\xab\x3e\x8d\x67\x5e\xf8\x42\x74\xfc\xf6\x53\x3c\x5e\xf5\x85\
+\x50\x10\xd2\x8d\x42\x80\xe5\xc1\x95\xac\x58\x75\x26\x97\x99\xd1\
+\x0b\xc8\xf0\xfa\x95\xb2\x7c\xcd\xb2\x22\x0c\x14\x69\x13\x41\x1c\
+\x4e\x20\x89\xf3\x2b\x3a\xbe\x40\xb7\x1f\x00\x60\x45\xd1\xaf\x16\
+\xbd\x3e\x98\xe2\x63\x18\x48\xae\x51\x23\x64\x21\xd7\x2c\x78\xcb\
+\x34\x58\x86\x90\xfb\x96\xe6\x79\x2b\x64\x40\xae\xc1\x8e\xd6\x00\
+\x0b\x1b\x5e\x68\x01\x00\xc6\xf6\xd4\xe4\xcc\x4b\x96\xba\xb9\xc9\
+\x4c\x7a\x06\x52\xd1\x60\x4e\xd5\x5c\xde\x54\x49\xcb\x2e\x49\x52\
+\x49\xcc\x70\x2e\x89\xa6\x41\x90\x92\x99\xa5\x2e\x91\x14\xa1\x94\
+\x24\xae\x84\x50\xd5\x10\xca\x93\x07\x27\x2b\x93\x07\x26\x0a\xdb\
+\x4f\x4f\x7d\x9a\xc9\xc7\xef\x65\x0f\xf3\x82\x6f\x4f\x36\x6d\x02\
+\xe3\xc5\xf6\x82\x13\x7e\x1b\x6d\x12\x00\xfd\xeb\xce\xe5\xf4\x6a\
+\x3f\x2b\x8b\x02\x5f\xb7\x6c\xf5\x52\x96\xad\x5a\xea\xd2\x52\xea\
+\x92\x92\x38\x90\x44\x1c\x0e\xc3\xc5\xac\xa0\x39\x33\xda\xfe\x00\
+\x20\x52\xcc\x07\x32\x2d\xc2\x40\x33\xf3\xea\x63\x04\x10\x82\xe5\
+\xea\x2d\x0f\x41\xbd\x29\xb9\xaa\xb5\x7c\x4b\x73\x97\x88\xcf\xb3\
+\xe0\xb3\x46\xc8\x9c\x13\x1f\x9e\x8e\x00\xbf\xf7\xc5\x97\x0b\xc0\
+\x37\x6f\xde\xdd\x9d\x90\x58\xe8\x28\xba\xee\xd7\x69\xd9\x25\x66\
+\xe6\x92\xd4\x25\x6d\x22\x98\x92\x8a\x50\xaa\xcd\xcc\xa5\xb3\x53\
+\x73\xe5\xb9\xe9\xd9\x92\x08\x15\x11\xaa\xf5\x69\x6a\xe3\x4f\x30\
+\xd3\x98\xe9\xa4\x79\x53\x8a\xc9\xa4\xc4\x64\xcf\xe1\x62\x6b\xbe\
+\x50\x85\xdf\x46\x41\x82\x12\xd0\x53\xe9\x65\x60\xc9\x1a\x96\xf6\
+\x0e\x31\x24\xd1\x01\x74\x03\x4b\x07\xdc\xc0\xd2\xfe\x64\x70\xf9\
+\x80\x73\x4e\x1c\xf3\x79\x01\xc7\xfc\xf4\x7b\x57\x84\x7f\x86\x61\
+\xc1\x9b\xaa\x9a\x62\x04\x9f\xab\x37\xb5\x3c\xee\xe3\x02\xd7\x79\
+\x2b\xb4\xb5\x81\x17\x91\xd0\xaa\xfb\x2c\x49\xc5\x37\x6b\x21\x66\
+\x72\x9f\x8a\x00\x6d\xfc\xde\x17\x5f\x2e\x0b\x48\x40\xd1\x28\x66\
+\x27\x5b\x32\xb0\xac\xd2\xf1\x15\x4a\x55\x97\xb4\x35\x42\x9e\x79\
+\x97\xb7\x5a\xc9\xdc\xcc\x5c\x52\x9b\x9e\x4b\xcc\xe2\x5a\x03\xe2\
+\x48\x1b\x33\xe4\x93\xfb\x68\x35\x66\x30\xe6\xa7\x99\xb7\x37\x88\
+\xc2\x6f\x2f\xcd\x9e\xbf\xd0\x85\xdf\x46\x41\x82\x84\x62\x8a\x7d\
+\xa5\x8f\xea\xd0\x2a\x06\xfa\x86\xe8\x2d\x04\x9e\x88\x43\x06\x96\
+\x0e\x24\x83\xcb\xfa\x93\x6a\x6f\xd5\x95\x7b\x4a\x0e\x23\xd6\x4b\
+\x14\x30\x35\x82\x8f\xa1\xa0\xe9\xfc\xdc\x8f\x76\xaf\xcf\x5b\x21\
+\x88\x48\xde\xee\xf1\xe5\x6a\x62\x79\x2b\xe4\x8d\x5a\x1e\x9a\x73\
+\x99\xcf\xb3\xcc\x7c\x9e\xe9\x33\x5e\x22\xe6\x9a\x37\xac\x75\xd5\
+\x9e\x2a\xdf\xb8\xf9\x71\x6b\x9b\x85\xb1\x3d\x35\xc9\xb3\x9c\x25\
+\xc3\x25\xa9\x4d\xe5\xd2\xb7\xa4\x24\x73\xd3\x35\x07\x50\x9b\xa9\
+\xb5\xb5\x83\x73\x31\x52\x70\x79\x0b\xc9\x9b\xd8\xf4\x18\xa1\x19\
+\x83\xb8\xf6\x39\x6d\xc1\xb7\x47\xc6\xda\x0f\x64\x68\x11\xd7\x01\
+\x38\xd9\x73\xff\xcf\x1a\x85\xd3\x97\x12\xcd\x42\x5a\xee\xa1\x34\
+\xb0\x82\x6a\xcf\x00\x3d\xa5\x2a\x95\xe8\x03\x20\x22\x24\x08\xc9\
+\xc0\xd2\x01\x11\x41\x06\x96\xf4\x3b\x55\xc3\x14\x4b\x4a\x89\x95\
+\x4a\x15\xd3\x10\xf3\x01\xc1\xab\xcf\x33\xcd\x5b\x8d\x96\xe6\x4d\
+\x1f\xf2\x4c\x33\x81\xd0\xa8\x37\x43\xf0\x84\xac\xd1\x34\x0d\x71\
+\xfd\x76\x0d\x71\x02\xd1\x93\x12\xe0\xba\xad\x22\xb7\x7e\xdc\xac\
+\xbd\x2f\x1a\x7d\xd4\x8c\x85\x8d\x17\x23\xf5\xa9\x62\xa1\xc7\x25\
+\x48\x56\x47\xca\xbd\x88\x6f\x75\x96\x7a\x91\xd6\x1c\x34\x6b\x50\
+\x08\xbd\x9d\xfe\x74\x5d\x5b\xfb\x7b\xdb\x8b\x1b\xe4\xbc\xc0\x16\
+\x80\x78\x2e\x68\x87\x7a\xcc\x87\xba\x09\x90\x94\x7b\x48\x87\x86\
+\xa9\x94\xaa\x94\x2b\xbd\x54\x5c\x42\xa9\xa8\x09\x90\xa2\x44\x54\
+\xb4\xa8\x2e\x34\x45\x2d\x14\x4f\x56\x34\x82\x2a\x21\xe4\xe4\x71\
+\x6c\x00\xaf\x9e\x90\xa4\x90\xb7\xc8\xc5\x61\x18\xa1\xd5\x20\xf8\
+\x16\xda\x9c\x7b\x0a\x02\x3c\x4d\xa3\x8f\xc2\xc6\x8b\xa3\x10\xdb\
+\x64\x18\x7f\x62\xfe\x92\xae\xfd\xc2\xad\x7d\xfc\x88\x55\x2e\x7e\
+\x10\x7b\xfc\x53\xa1\x8b\x08\xdd\xda\xb0\xbb\x73\xc8\x92\x55\x54\
+\x4a\x55\x92\x72\x2f\x15\x53\x0c\x8b\x89\x23\x97\x92\x98\x11\x30\
+\xd4\xb4\x20\x40\x86\xcf\x1a\x04\x49\x22\x39\x5a\x0d\x82\x4b\xd0\
+\xda\xe1\xce\x78\x4a\x67\x7b\x4e\xab\x84\x3d\x19\x09\x16\x9e\x76\
+\x8c\xd7\xc7\xcc\x6b\xd3\x95\xdf\x7e\xd6\x8d\xf9\x01\x42\x3b\xde\
+\xe7\x48\xed\xd8\x4d\x84\x63\x8d\x0d\xc0\x91\xb3\x8b\xba\x37\x3d\
+\xc6\xb1\xee\xe1\xf4\xe7\x46\x80\xa7\xb9\x81\xa3\x0e\x3f\xc9\xe9\
+\x9d\x3f\xfc\x62\x17\xfc\x42\x74\xfd\x8e\xdd\x64\xe8\x26\xc0\x42\
+\x2d\xda\xfd\xfb\x3d\x99\xc0\x8f\x10\x7c\xfb\xf5\x71\x59\x27\xf0\
+\xe9\x34\xc4\x29\x81\x3f\x73\x2c\x20\xc3\x93\x99\xd1\x85\x38\x96\
+\x46\x58\x78\x3c\x7e\xe9\x29\x59\xbc\xf0\xb0\x80\x14\x4f\x87\xa3\
+\x04\xdc\xdd\x01\x4f\x11\xe0\x45\x8e\xe3\xba\x52\xe8\x29\x9c\xfc\
+\x38\x45\x80\x17\x39\x4e\x11\xe0\x45\x8e\x53\x04\x78\x91\xe3\x14\
+\x01\x5e\xe4\x38\x45\x80\x17\x39\x4e\x11\xe0\x45\x8e\x53\x04\x78\
+\x91\xe3\x14\x01\x5e\xe4\x38\x45\x80\x17\x39\x4e\x11\xe0\x45\x8e\
+\xff\x1f\xb9\x16\x9b\x37\x03\x92\x29\x11\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x1b\x4b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x89\x00\x00\x0b\x89\
+\x01\x37\xc9\xcb\xad\x00\x00\x1a\xfd\x49\x44\x41\x54\x78\x9c\xed\
+\x9d\x7b\x94\x24\x57\x5d\xc7\x3f\xf7\xde\xea\xee\x99\x9e\x9d\xd9\
+\x99\x7d\xb3\xd9\xe7\xe4\x61\xc8\x63\x09\x02\x47\xe4\x25\x68\x8c\
+\x72\xe4\x18\x0f\x12\x4c\x50\xf1\x44\x85\x03\xa8\x41\x3c\x01\x23\
+\x12\x94\xf8\x38\x49\x20\x04\x45\x41\x4f\x34\x40\xf0\x48\x42\x7c\
+\x90\x28\x41\x36\x1b\x31\x48\x20\x07\xc5\xc4\x24\x0b\x86\x28\xc4\
+\x00\x71\x57\x36\x31\xcb\x30\xaf\xee\xba\xf7\xfa\xc7\xbd\xb7\xea\
+\x56\x75\xf7\xcc\xec\x4c\xf7\x66\x7b\xbb\x7f\x7b\x7a\xab\xab\xba\
+\xa7\xaa\xba\xbe\xdf\xdf\xf7\xf7\xb8\xb7\xba\x61\x68\x43\x1b\xda\
+\xe0\x9a\xe8\xe2\x7e\x04\x90\xf8\x47\xc5\x2f\x55\x97\xf6\xff\x74\
+\x99\xf1\x8f\x14\xd0\xa5\x87\xf5\x8f\xbe\xb6\xa4\x4b\xfb\x11\x38\
+\xb0\xab\x17\x5d\x74\xd1\xb6\x8b\x2e\xba\xe8\xb9\x47\x8f\x1e\xad\
+\x35\x9b\x4d\xa5\xb5\x96\xd6\xda\x6e\x11\xed\xb8\x98\x10\xc2\x4a\
+\x29\xad\x52\xca\x5c\x77\xdd\x75\x07\x1f\x79\xe4\x91\x27\x80\x45\
+\xa0\xe1\x97\x4d\xff\x38\x69\x88\xb0\x16\x13\x80\x04\x46\x81\x2d\
+\x1f\xfe\xf0\x87\x5f\x6b\xfb\xc4\x8c\x31\x85\x87\xd6\x3a\x7b\xa4\
+\x69\x6a\xd3\x34\xb5\x8b\x8b\x8b\xf6\xf0\xe1\xc3\x87\xee\xbb\xef\
+\xbe\x3b\xae\xb9\xe6\x9a\x5f\x04\x4e\x07\xb6\x03\x93\xfe\x33\x27\
+\xfe\xf3\xf7\x15\xc9\x83\xc9\x2e\xee\xa7\x02\x8c\x3d\xfe\xf8\xe3\
+\x13\x5d\xda\x67\xd7\xcd\x5a\x8b\xd6\x9a\x34\x4d\x69\x36\x9b\x34\
+\x1a\x0d\x16\x17\x17\x99\x9f\x9f\x67\x6e\x6e\x8e\xd9\xd9\x59\xbe\
+\xfb\xdd\xef\x32\x33\x33\xc3\xcc\xcc\x0c\x47\x8f\x1e\x65\x66\x66\
+\x06\x29\xe5\xd6\x53\x4e\x39\xe5\xe5\x97\x5e\x7a\xe9\x0d\x8f\x3d\
+\xf6\xd8\x3f\x7f\xf0\x83\x1f\x7c\x0d\xb0\x05\x58\x0f\xd4\x71\x24\
+\x08\x61\xb0\xaf\xac\x5b\x04\x08\x21\x60\xe4\xe8\xd1\xa3\xeb\xba\
+\xb4\xcf\xe3\x6a\xd6\x16\x55\xdc\x18\x93\x6d\xb7\xd6\x62\x8c\x21\
+\x4d\x53\xa4\x94\x5b\x5f\xf9\xca\x57\xbe\xfb\xa1\x87\x1e\xba\xf5\
+\xc2\x0b\x2f\xfc\x5e\x60\x0a\x58\x07\xd4\x70\xd7\xa0\xaf\xd4\xa0\
+\x9b\x04\x90\x40\x65\x76\x76\xb6\xd6\xa5\x7d\x3e\x6d\x16\xc8\x10\
+\x2f\x03\x09\xac\xb5\xcc\xcf\xcf\xb3\x69\xd3\xa6\x7d\xef\x7f\xff\
+\xfb\x3f\x7e\xc3\x0d\x37\xbc\x1e\xd8\x04\x8c\x93\x93\xa0\x6f\xd4\
+\xa0\x5b\x04\x00\x4f\x02\xad\x75\xbf\x67\xfe\x05\x0b\xe0\xc7\x24\
+\x00\x98\x9f\x9f\x67\x64\x64\x64\xec\xc2\x0b\x2f\x7c\xfb\x3d\xf7\
+\xdc\xf3\x7e\xf2\x90\x30\x42\x1f\x85\x84\x6e\x12\x00\xfa\xe4\x43\
+\xaf\xc5\x02\x11\xd2\x34\x65\x76\x76\x16\xa5\x14\xa7\x9f\x7e\xfa\
+\x05\xf7\xdf\x7f\xff\x5f\x4e\x4f\x4f\x4f\xd3\x67\x24\xe8\x36\x01\
+\x4e\x5a\x0b\xf2\x0f\x79\x68\x68\x34\x1a\xa4\x69\x8a\x52\x8a\xed\
+\xdb\xb7\x9f\x7b\xfb\xed\xb7\xdf\xb4\x6d\xdb\xb6\xbe\x22\xc1\x90\
+\x00\xcb\x58\xf0\xf8\x78\x3d\x90\xc1\x5a\xcb\xc2\xc2\x02\x4a\x29\
+\x94\x52\x6c\xd9\xb2\x65\xef\x81\x03\x07\x3e\xbc\x75\xeb\xd6\x53\
+\xe9\x13\x12\x0c\x09\x70\x0c\xd6\x2e\x39\x9c\x9b\x9b\xcb\x08\x10\
+\x48\x70\xd7\x5d\x77\xdd\xd8\x2f\x24\x18\x38\x02\x08\xd1\x1d\x0c\
+\x02\x09\x8c\x31\x34\x1a\x8d\xbe\x25\xc1\xc0\x11\x20\xb6\x6e\x90\
+\xc1\x18\x43\xb3\xd9\x24\x49\x92\xbe\x24\xc1\x40\x11\x20\x00\x2e\
+\x84\x68\x01\xbf\x13\x19\xda\xbd\xb7\x6c\x21\x11\xec\x47\x12\x0c\
+\x14\x01\xa0\x08\x74\x00\x57\x4a\xd9\xf1\x3d\x2b\xd9\xbe\xb0\xb0\
+\x80\x94\xb2\x2f\x49\x30\x70\x04\x80\xf6\x40\x06\x32\x74\x52\x86\
+\x40\x92\x76\xef\x0b\xe0\xf7\x23\x09\x06\x8e\x00\x2b\x91\xfe\xa0\
+\x0a\x71\xc8\x88\x97\xb1\x62\xc4\xcf\xfb\x91\x04\x03\x47\x00\x68\
+\xf5\xe2\xf2\xb2\xbc\x6d\xb9\x47\x6c\xfd\x46\x82\x81\x24\x00\xb4\
+\xf7\xea\xa5\xc2\x40\x3b\x55\x68\x47\x1c\xe8\x2f\x12\x0c\x24\x01\
+\x56\xea\xf9\xed\x00\x2f\x93\xa1\x53\x95\xb0\x1c\x09\x3e\xfb\xd9\
+\xcf\xde\xb8\x7b\xf7\xee\xa7\x9d\x04\x03\x49\x00\x68\x2f\xf1\x9d\
+\xaa\x81\xa5\xc0\x8f\x49\x52\xb6\xa5\x48\x30\x35\x35\xb5\x77\xff\
+\xfe\xfd\x4f\x3b\x09\x06\x96\x00\xb0\xb2\x98\x5f\xf6\xf4\x78\x5d\
+\x29\xb5\x6c\x9f\xe0\x44\x27\xc1\xc0\x12\xa0\x53\x42\x57\xf6\xe8\
+\x32\x31\xc2\xeb\xcb\x85\x80\xd8\x4e\x64\x12\x0c\x2c\x01\x82\xad\
+\x46\x05\x82\xe7\x07\x50\x57\xd2\x52\x3e\x51\x49\x30\xd0\x04\x58\
+\x4e\x05\xda\x25\x8b\xe1\xb5\x00\x68\x00\x75\x25\x76\x22\x92\xa0\
+\xef\x09\x50\x9e\xb2\x55\x9e\xdc\xb9\x9c\x2d\xd5\x13\x58\x2a\xf1\
+\x2b\x87\x82\x95\xda\x4a\x48\xb0\x67\xcf\x9e\x69\x60\x82\xe3\x30\
+\xc7\xb0\xaf\x09\x10\xc0\xbe\xe7\xbf\xef\xe6\x96\x07\x3e\xda\x15\
+\x12\x2c\x95\xfc\xb5\x0b\x05\x61\xfb\xb1\xd8\x72\x24\xf8\xf4\xa7\
+\x3f\xfd\x21\xdc\x1c\xc3\xf2\x44\xd3\xae\x5b\xdf\x12\xa0\x3c\x53\
+\xf7\xcd\x9f\xfc\x05\x6e\x7e\xe0\xa6\x55\xa9\xc1\x6a\x12\xc2\x58\
+\xfe\x8f\x45\x01\x82\x2d\x47\x82\x03\x07\x0e\x5c\x8b\x9b\x6d\xbc\
+\x0e\x77\xcf\x45\x4f\xa6\x9b\x77\xeb\xd6\xb0\xe3\x6a\xe5\x59\xba\
+\x5a\x6b\x00\xde\x72\xc7\xeb\xb0\xd6\xf2\xea\x73\x7e\xa6\x6d\x2f\
+\x7f\x39\x13\x42\x60\xad\xcd\xde\x1f\x9e\x4b\x29\xb3\xd9\xc0\x4a\
+\xa9\xec\x78\xc1\xf3\xb5\xd6\x1c\x39\x72\x24\x23\xa3\x31\x26\x7b\
+\xc4\x24\x8d\xa7\x92\x85\x47\xb5\x5a\x25\x49\x12\x46\x47\x47\x19\
+\x19\x19\xc9\xce\x65\xdf\xbe\x7d\x3f\xb4\x7f\xff\xfe\x77\x5d\x70\
+\xc1\x05\xbf\x49\x7e\x0b\x9a\x09\x97\x60\x6d\x57\x30\xb7\xbe\x24\
+\x40\xb0\x00\x7e\x00\x04\xe0\xd7\x3e\xf5\x7a\x8c\x31\xfc\xd4\xb9\
+\x3f\x5b\x48\xce\x96\x23\x41\xdc\x12\x0e\x60\xc7\xe0\xc7\x7f\x5f\
+\x7e\x8f\xb5\x96\x66\xb3\x89\xd6\x3a\x03\x3e\x7e\x1e\x80\xd7\x5a\
+\xb7\x10\x60\x6e\x6e\xae\x70\x1e\xe3\xe3\xe3\x8c\x8f\x8f\x53\xa9\
+\x54\x38\xef\xbc\xf3\x7e\xe2\xea\xab\xaf\xfe\xb7\x2b\xae\xb8\xe2\
+\x66\xf2\x9b\x52\x53\xba\x48\x80\xbe\x0e\x01\xe1\x6e\x9d\x66\xb3\
+\x09\xc0\xcf\x3d\xef\x75\x8c\x56\xc7\xb8\xfc\xd3\x6f\xe0\xe6\x07\
+\x6e\x22\x4d\xd3\x82\xd7\x2d\x67\x9d\x42\x40\x39\xfe\x97\x93\xc0\
+\x38\x1c\x2c\xf5\x3c\x49\x92\x8e\xef\x0f\x8f\xb9\xb9\x39\x0e\x1f\
+\x3e\xcc\x91\x23\x47\x00\xb8\xe4\x92\x4b\xae\x38\xff\xfc\xf3\xcf\
+\x25\xbf\xfb\xa8\xab\xa1\xa0\x2f\x09\x50\x96\xff\xa0\x00\x7b\xa6\
+\xf6\xf2\xae\x0b\x7e\x9f\xd1\xea\x18\x6f\xdd\xff\x46\x6e\x79\xf0\
+\xa3\x99\x27\xae\x96\x04\x2b\x49\x0a\xcb\xa0\x86\x47\x92\x24\x19\
+\xe8\x31\x09\xda\x6d\x2f\x3f\xd2\x34\xe5\x89\x27\x9e\xa0\x52\xa9\
+\xd4\xaf\xbf\xfe\xfa\xab\x80\x0d\xb8\xfb\x10\x2b\x0c\x32\x01\xca\
+\xb7\x6b\x69\xad\x31\x51\x08\xd8\xb3\x61\xba\x40\x82\x9b\x1f\xb8\
+\x69\xd5\x24\xe8\xf4\xbc\x13\x09\x62\xf0\x63\x30\x63\xb0\xcb\x04\
+\x89\x89\x12\x27\x83\x61\xbf\x33\x33\x33\x6c\xda\xb4\xe9\xec\xcb\
+\x2e\xbb\xec\x87\x70\x55\x41\x95\x2e\x56\x05\x7d\x47\x80\xd8\xb2\
+\x30\x10\x11\x00\x8a\x24\x78\xdb\x9d\x6f\x3a\x66\x12\x2c\x57\xfb\
+\x2f\x55\x1e\xc6\xa0\x07\x40\xe3\xf5\x76\x6a\x51\xf6\xfe\xf2\xb6\
+\xf9\xf9\x79\xde\xf8\xc6\x37\xfe\x0a\xee\x96\xf4\xf8\x6e\xe4\x35\
+\x5b\x5f\x13\x00\xbc\x12\x18\xd3\xb2\xfd\x44\x20\x41\x00\x3e\x06\
+\xba\x1c\x02\xda\x29\x43\x99\x0c\x42\x08\xd6\xaf\x5f\xbf\xfb\xf2\
+\xcb\x2f\x7f\x29\x30\x46\x17\xcb\xc2\xbe\x27\x00\xb4\xde\xda\x1d\
+\xac\x5b\x24\x58\xae\x21\x54\x1e\x17\x28\x7b\x74\xb9\xce\x6f\x47\
+\x86\x4e\xe1\x21\x1c\xab\xd9\x6c\xf2\x8a\x57\xbc\xe2\xc7\xe8\x72\
+\x32\xd8\xf7\x04\x58\x0e\xc4\x6e\x90\x60\x25\x5d\xc1\x72\x77\xb0\
+\x5d\x72\x18\x83\x5a\x26\x43\xa7\x64\x30\x7e\x6d\xc7\x8e\x1d\xe7\
+\xe2\x14\x20\xe4\x01\x6b\xb6\xbe\x27\xc0\x4a\xac\x97\x24\x88\x01\
+\x5f\xaa\x84\x2c\x13\xa1\x4c\x86\xa5\x92\xc8\x40\xac\xf5\xeb\xd7\
+\x6f\xc4\x7d\x2d\x4d\x08\x01\x6b\xb6\x81\x20\x00\xf4\x8e\x04\x65\
+\x90\x97\x22\xc7\x52\x64\x28\x87\x82\x78\x3d\xe4\x0b\xbe\xf9\x54\
+\xa5\xf8\xbd\x44\x6b\x0a\x03\x7d\x4d\x80\x63\x1d\xf4\xe9\x05\x09\
+\xda\x91\xa1\x5d\x6e\x50\xce\x0f\x3a\x49\x7e\xa7\xca\x20\x3c\xe8\
+\xf2\xd7\xd0\xf4\x35\x01\x56\x63\xdd\x22\x41\xd9\xdb\x97\xea\x1c\
+\xc6\x44\x58\x2e\x94\x2c\xf5\xf0\xfd\x88\xae\x0e\x08\x0d\x1c\x01\
+\xa0\xb7\x25\x62\x39\x09\xec\x54\x2d\xc4\x55\xc3\x72\xe5\x64\xfc\
+\x9e\x70\x0a\xdd\xba\x16\x3d\x21\x40\xbb\x49\x1a\xbd\x7c\x98\x63\
+\x0c\x05\xd0\x9b\x12\xb1\x13\xd0\x4b\x25\x89\xed\x3c\xbf\x04\x76\
+\x39\x04\x74\xd5\x7a\x46\x80\x78\x24\xac\x57\x8f\xd5\x4e\x00\x09\
+\xd6\xed\x70\xd0\x29\x21\x5c\x2a\x54\xb4\xfb\x9b\x72\x4f\x20\xde\
+\x77\xb7\x2d\xa3\xd9\xe4\x3b\x78\x56\x52\x15\xef\x5b\xcd\x4e\xac\
+\x15\x12\x83\xb2\x29\xb5\xf5\xc9\xfa\xcd\xfb\xa6\xcf\xdb\xdd\xbd\
+\x53\x6c\x73\x3c\x3f\x1a\xaa\xb5\x23\xc2\x77\x16\x9f\xe2\x9b\x73\
+\xdf\xe0\x23\x17\xdf\xbc\xaa\xfd\x3d\xfa\xe4\xd7\xf8\xad\xfd\x6f\
+\x67\xbe\x31\xcb\xb5\x3f\xfc\x01\x2e\xde\xf7\xda\x96\x78\xbd\xec\
+\x39\x75\x98\x9a\xd6\xee\x1b\xc6\xca\xaf\x1d\x8b\x4d\x4c\x4c\x5c\
+\x08\x3c\x0c\xfc\x0f\x30\x8b\x9b\x23\xb0\xea\xe1\xe1\x7c\x3e\x80\
+\x60\x52\x2a\xf5\xd2\x9d\x93\xbb\xa9\x57\xeb\x64\xdc\x28\x7d\x76\
+\x19\xfd\x41\x27\x7b\xaa\xf9\xa4\x7f\xc7\xf1\xb9\xbf\x61\xfb\xc6\
+\xed\xbc\xf9\x65\x97\x2f\x7b\x31\x6d\xfc\xcc\xe4\xdb\x76\xae\xdf\
+\xcd\x3b\xcf\xff\x1d\xae\x3a\xf0\x0e\xde\x76\xe7\x9b\x00\xb8\x78\
+\xdf\x6b\x81\xe2\x5d\xc1\x4b\x59\x78\x5d\x08\x51\x00\x3b\xde\x16\
+\x96\x40\x36\xc7\xa0\xfc\xb5\x33\xd9\x19\x96\xd6\x57\x42\xc2\xd5\
+\x58\xcb\x84\x90\x57\x9f\xf7\x1a\xce\xdc\x72\x96\x87\x2e\x1c\x54\
+\x20\x44\x11\x50\x81\x00\x51\x06\x39\x5a\x13\x45\xb9\x92\x85\xbf\
+\xf5\xff\x77\xf9\x33\x35\xd3\x06\x50\x74\x07\x53\x76\x0e\x1b\xb6\
+\x14\xe8\xc0\xb6\xf1\x67\xf0\xeb\x2f\xbd\x92\xab\x3f\xf3\x3b\x6b\
+\x26\x41\xf8\x9b\x76\x20\x06\xaf\x8f\xe5\xbc\x3c\xe1\x24\x9e\x95\
+\xd4\x6b\x6b\x21\x40\x53\x37\x58\x68\xce\xe7\x20\xc9\x12\xec\xbe\
+\x12\x89\x09\x22\xb3\xa7\xb2\x44\x1c\xf2\x35\x11\xbf\xd2\xcb\x0f\
+\x67\x0b\x90\xb7\x57\x85\xf0\x1e\x83\xb1\xf9\xb6\xad\x13\x5b\x79\
+\xcb\x0f\xbc\x95\xeb\xef\xbe\x76\xd5\x24\x08\xef\x89\xc1\xee\x44\
+\x84\x70\x7e\xbd\x88\xed\x2b\xb5\x16\x02\x34\xf4\x22\x0b\x7a\x3e\
+\xf7\x65\x1d\x40\x07\x10\xad\x10\x8b\xe2\x96\xc2\xe5\xc9\x40\x2f\
+\x7b\x3f\x20\x97\x26\x44\x39\x7c\x94\xbd\xb6\x00\xb4\xb1\x6d\xde\
+\xdb\xe6\x7d\xb6\xd5\xf7\x03\x11\xc2\xc6\x2d\x63\x5b\xf8\xa5\x17\
+\xfe\x2a\x7f\x74\xcf\xfb\xd6\x44\x82\xf8\x7d\x31\x19\xe2\xd7\xca\
+\x61\xa1\x1d\x59\xc3\xb6\xe3\x16\x02\x1a\xba\xc1\x42\xba\xe0\xf1\
+\x69\xe7\xfd\x71\x16\x10\x3e\xa0\x5b\x8b\xad\xa0\x11\x22\x5a\x0b\
+\x61\xc3\x87\x48\x19\xa9\xca\x4a\xcd\x62\x23\x14\xad\xcf\x82\xdc\
+\xb6\x16\xa2\xd8\x1c\x66\x4b\x07\x35\xb0\xc5\xd7\x36\xad\xdb\xc4\
+\xeb\x9e\xff\x06\x6e\xb8\xf7\x83\x5d\x23\x41\x78\xbe\x94\x22\x94\
+\xc3\xc0\xb1\x1c\x67\xb5\xd6\x1a\x02\xcc\x22\x8b\xe9\x7c\x11\x7a\
+\xd1\x2a\xed\x22\xd7\xfd\x16\x6f\xcd\x41\x17\xc8\x00\xbe\x5f\x77\
+\xaf\xcb\x28\x05\x68\xa3\x0f\x9d\x3e\xb3\x75\xff\xb5\x78\xb8\x0d\
+\x34\x88\x89\x90\xf7\x07\xe2\xbf\x68\x49\xb6\xe2\xd7\x22\x25\xd9\
+\x58\xdf\xc8\xcf\x3d\xef\x52\x3e\xf2\xc5\x0f\xad\x99\x04\xf1\x7b\
+\xcb\x1e\xdf\x29\x71\x7d\xda\x72\x80\x46\xda\x64\x51\x2f\x84\xd3\
+\xc8\x41\x2a\x79\xa9\xd0\xad\xf3\xe5\x21\x78\xb4\x03\xdb\x2d\x65\
+\x46\x96\xb2\x1a\x08\x40\x66\x7f\x1b\x5e\xa7\x73\x51\x53\xf2\x70\
+\x03\x60\xad\xff\xc9\x0e\x9b\x3d\xf7\xf0\x63\x8d\x7f\x6e\x7d\x32\
+\x68\x6d\x6b\x52\x48\x54\x96\x95\x42\xcc\x64\x7d\x8a\x8b\x9f\xf3\
+\x1a\x3e\xf6\xa5\xbf\xe8\x0a\x09\x82\x95\x55\xa1\x70\x0e\xab\xec\
+\x69\xac\xd6\xda\x2a\xc0\x42\x3a\x4f\x5b\xd0\xc3\xff\xa2\x35\xab\
+\x77\x2a\x21\xdc\x32\x10\xc0\x93\x40\x9a\xf0\x41\x8b\x24\x10\x2d\
+\x49\x66\x6c\x71\x62\xd4\x3a\xe3\xc7\x42\x16\xfb\x2d\x3e\xd9\x0a\
+\x6b\x11\xd0\x99\x0a\xf8\xec\xdf\x58\x83\xb5\x91\x5a\x94\x2c\x56\
+\x0d\x21\x60\x72\x6c\x3d\x3f\xf9\xec\x8b\xf8\xeb\xfb\x6e\xed\x2a\
+\x09\xca\x7f\xb7\x54\x18\xe8\xa5\xb5\x4d\x02\x17\x03\x01\xca\xd2\
+\x5e\xf6\x56\x42\x37\x4c\x20\xc8\x3b\x56\xaa\x44\x80\xf0\x17\x81\
+\x24\x21\x0f\x90\x02\x97\x64\xe6\x07\xc8\x8f\x15\x1d\xb7\x70\x19\
+\x4a\x89\x9c\x89\xe5\x34\x40\x6a\x4d\x44\x8a\x9c\x1c\xc6\xaf\x1b\
+\x6b\xb0\x26\x7f\x4f\x61\xf7\x71\xbe\x60\x41\x24\x82\xc9\xb1\x09\
+\x7e\xfc\xbc\x1f\xe7\xb6\xfb\x6f\xeb\x3a\x09\x62\x2b\xef\xe3\x78\
+\x84\x81\x16\x02\x2c\x1a\x97\x04\xb6\xd6\xf8\x71\xd2\x27\x32\x40\
+\x95\x10\x08\x2b\x91\xa4\x6e\xbb\x94\xe8\x0c\x6c\x4f\x90\x10\x0e\
+\xac\xc8\xb6\xb5\x2b\x29\x57\xf2\x79\x1d\xc0\xb1\xb7\xfb\x65\x94\
+\xcc\x39\xc9\x37\xb9\x2a\x78\x42\x18\x93\x13\xc2\x58\x83\xb1\x16\
+\x63\x75\x29\x47\x08\xfb\xf3\x47\xd3\x20\x13\xc1\xf8\xe8\x3a\x5e\
+\x7e\xee\x8f\xf2\xa9\x07\xff\xa1\xa7\x24\x38\xde\xd6\x1a\x02\x52\
+\x57\x06\x16\x9b\x3a\x64\xeb\x42\x08\x94\xf7\x76\x29\x04\x5a\x48\
+\x9f\xe8\x49\x94\x90\x1e\xe4\x28\x07\x90\x31\xf8\x0e\x64\x69\x8b\
+\x4a\x80\xdf\x6f\xc0\xa1\xdd\x65\x6c\x57\xdb\x17\x25\x1f\xc8\x40\
+\xf7\x5e\x6f\x82\xc7\x47\xc0\xe3\x80\x0f\x24\x08\xdb\xb4\xd5\xd9\
+\x41\xca\x2a\x40\x0a\xb2\x2a\x58\x57\xaf\x73\xfe\x39\x3f\xc8\x81\
+\x87\xee\x3a\x69\x48\xd0\x1a\x02\x8c\x6b\x04\x15\x1b\x37\x0e\x28\
+\x25\x1c\xf0\x5a\x3a\xd0\xa5\x08\x4b\x85\x40\x60\x44\x34\xea\xe5\
+\x82\x02\x42\x47\x39\x81\x74\x44\x30\x61\xdf\x36\x4f\xfc\xa4\xcd\
+\x8f\xd4\x99\x01\x21\xf9\xcb\x4b\xbe\x0c\xac\x00\xb2\x89\xd5\xc0\
+\xdd\x8a\xa5\x03\x21\x6c\x4e\x02\x6b\x2d\xda\x9a\x9c\x04\xc6\x3d\
+\xd7\xd6\x42\x56\x51\x90\x1f\x21\x85\xa4\x26\x18\xab\x8f\xf2\x92\
+\xb3\x5f\xc4\xdd\x07\x3f\x77\x52\x90\xa0\x7d\x27\x50\xcf\x13\x92\
+\x30\x89\x4b\xf0\xa4\x90\x68\x91\x22\x85\x44\x59\x07\xba\xf4\x44\
+\x10\x42\xa3\x84\xc0\x58\xe9\xdf\x2b\x3c\x21\x9c\x4a\x48\xeb\x49\
+\xa1\xf3\xca\x20\x24\x7f\x41\x01\xfc\x9d\x76\xee\x24\x96\xcc\x7d\
+\x6c\xc6\x85\x2c\xe6\x1b\x9f\xf5\x67\x21\xc0\x25\x81\xc1\xd3\xad\
+\x07\xdc\x58\x83\xc5\x81\x9c\x85\x01\x2c\x46\x6b\xb4\x0f\x07\x26\
+\x7a\x7f\x08\x37\xd9\xf9\xa5\x86\xca\x88\xa2\x5e\xaf\xf1\x82\xb3\
+\x9e\xc7\xe7\xbf\xfc\xc5\xbe\x27\x41\x6b\x0e\x90\x2e\xb2\xd8\x5c\
+\xc8\x32\x75\x07\xb2\x7b\x28\xa1\x90\xc2\x79\xba\x14\x1a\x65\x3d\
+\xd8\x52\x61\x84\x8b\xfb\x12\x07\x78\x08\x0b\xd6\x4a\xf7\x9a\x27\
+\x81\x0c\xe1\x41\x8b\xc8\xd9\x3d\x0d\xa2\xde\x42\x7b\xb3\x51\xd3\
+\xce\x97\x7f\x51\xd6\x6e\x42\x49\x18\x49\x7b\x50\x06\x6d\x83\xf4\
+\xfb\xa5\x31\x4e\xfa\x4d\xc8\x07\x82\x02\xe8\x7c\x3d\xeb\x0b\xe4\
+\x59\xc2\xe2\x8c\x25\xa9\x4b\x46\xea\x15\x9e\xfb\xcc\x67\xf1\x2f\
+\x5f\xf9\xf7\xbe\x26\x41\xfb\x32\x50\x2f\xf8\x1a\x5d\x22\xad\x8b\
+\xed\x4a\x2a\x0f\xbc\x5b\x97\x42\x61\xa4\x03\x5c\x69\xed\xbc\x5d\
+\x4a\xac\x10\x18\xa1\x32\x22\x58\x91\x41\xee\x54\xc1\x86\x90\xe0\
+\x65\x3f\xce\x03\x4c\xf9\x82\xb5\x36\x05\xe2\xa4\x0f\x5f\xdf\xe7\
+\x92\x5f\xca\x01\x32\xf9\x2f\x26\x7c\x46\x1b\x34\x0e\xe0\xa0\x0a\
+\xc6\x1a\x52\x9b\xcf\x35\x48\xad\xc6\x18\x9d\xf5\x0f\x0a\xed\xe3\
+\x19\xa8\x5a\xc5\x48\x3d\xe1\xd9\xcf\x3c\x93\xfb\xbe\xf2\x95\xbe\
+\x25\x41\xdb\x56\xf0\xa2\x9e\x47\x09\xe5\x80\xc6\x01\x6f\xad\x46\
+\x2a\xb7\x6e\x91\x28\x34\xd6\x48\xac\x90\x8e\x18\x48\x94\x11\x58\
+\x29\x91\x18\xac\x15\x8e\x0c\x2e\x65\x6c\xf9\x07\xe4\xca\x00\x20\
+\x24\x32\xbb\xca\xc5\xfa\x23\xbe\xf8\xae\xb7\x63\xb2\xf8\x5f\xe8\
+\xaa\x45\x09\x5f\x21\xd1\x23\xf7\x7a\x1d\x91\x21\xf7\xfa\xa0\x02\
+\x1a\xad\x9d\x0a\xe8\xb0\x6e\x0d\xda\x64\xcd\x66\x42\xe5\xb1\xf0\
+\x14\x50\x6f\x52\xa9\x2b\x4e\x3b\xe3\x14\xbe\xfa\xf0\x37\x78\xdb\
+\x9d\x6f\xc2\x5a\xcb\xc5\xfb\x5e\x4b\x92\x24\x85\x19\x40\x6b\xb5\
+\xe3\x36\x16\xf0\xd4\xc2\x93\x68\xb1\xe0\x3c\x5d\x4a\x12\x91\x50\
+\xab\x8c\x92\x08\x89\xd2\x21\xee\x2b\x2a\x42\x51\x4d\x46\x50\x3e\
+\x19\x44\xba\x89\xaa\xc6\x28\x14\x12\x29\x05\xae\x5d\x64\x70\xcd\
+\x5f\x41\x14\x00\x7c\xe3\x83\x88\x10\x1a\x5b\x0c\x08\x91\x00\xe4\
+\x1e\x18\xb7\x7a\x0b\xcf\xb3\xb8\x1f\xf5\x00\x02\xb0\x3e\x47\x08\
+\x71\x7e\x21\x5d\xcc\x08\xa0\x7d\xf2\xd7\x34\x0d\x16\x75\x13\x63\
+\xd2\x6c\xdb\x42\x3a\x4f\xc3\xa4\x19\x31\x16\xf5\x42\xa1\x64\xe4\
+\x29\x18\xdd\x50\xa1\x3a\xa6\xd8\xba\xb7\xce\xe1\xaf\xcf\xf1\xeb\
+\x07\x7e\x09\x29\x04\x3f\xe5\x27\x95\xf4\x9f\x02\x98\x05\x66\x1b\
+\xda\x4d\x47\x12\x8e\x00\x0b\x7a\xce\xcb\xbe\x24\x91\xfe\x4e\x57\
+\x21\x91\x0d\x47\x92\x90\x1b\x64\xe1\x41\x4a\x12\x59\xa1\x22\x13\
+\x1f\xf7\x65\xd6\x21\x94\xf8\xfc\x20\x8c\x06\x8a\x48\x13\x84\xa4\
+\x78\xb9\x8a\x21\x20\xaf\xe9\x4b\xdd\x3f\xe3\x3c\xde\xf8\x6d\x4d\
+\xb3\x98\x65\xf8\x99\xf4\x9b\x3c\xeb\xcf\x96\x26\x8a\xfb\x46\x93\
+\x9a\xfc\xf5\xd4\xe8\x82\x22\xa4\xbe\x71\xd4\x72\xbd\xbe\x9b\x32\
+\x32\x91\x50\x5b\xa7\x58\x37\x55\x61\xe6\x48\x93\x1b\xef\xfb\x00\
+\xaf\x3a\xfb\xa7\x0b\xde\x7f\xa2\x12\xa1\x85\x00\x4a\xf8\xb9\x68\
+\x42\x91\x48\x95\xc5\x7b\xa7\x06\x7e\x36\xab\xdf\xee\x80\x97\x59\
+\x35\xa0\xbc\x3a\x48\x21\x71\x65\xbd\x41\x20\xb0\xe4\xc9\x9e\xf5\
+\x4d\xa0\x62\xa7\x31\xbc\x43\xb3\x6c\x12\xd8\xb2\xb4\x59\x1e\x10\
+\xd6\xb3\x64\xd5\x4a\x0f\xb6\xc4\x08\x83\xb0\x1a\x6d\x04\xc2\x48\
+\x0c\x06\x21\x9d\xcc\x0b\x8b\x6b\x5e\xe1\x62\x3f\x06\x90\x60\x8c\
+\x00\x95\x46\x87\x4b\xd0\x26\xcd\xaf\x55\x4d\x30\xf1\x8c\x11\x84\
+\x14\xcc\x3c\xd9\x64\xe6\x48\x93\xd3\x27\x9f\xc9\x9f\xbf\xfc\x56\
+\x9a\xcd\x66\x57\xe7\xf2\x1d\xb7\x10\x10\xb2\x7d\x07\x7e\x00\x5e\
+\x22\x45\x82\x52\x3e\x21\x14\x12\x25\x93\xac\x3a\x48\x84\x44\xaa\
+\x92\x0a\x84\x72\xd0\x27\x84\xca\x77\x09\x0b\x9d\x41\xf0\x5e\x9f\
+\x77\x05\x7d\xea\x54\x3a\xab\xa8\x14\xcb\x12\x3e\x9b\xa9\x81\x11\
+\x79\xb9\xa7\x8d\x45\x5a\x07\xb0\xb4\x06\x69\x05\xc6\x5a\xb4\x15\
+\x18\x2b\x90\x68\x34\x6e\x5d\x58\x81\xb6\x20\x0c\xae\x2c\x15\xc2\
+\x71\x50\xba\x1e\x85\x06\xb0\x09\x98\xd4\xdd\x8e\xa1\x01\x91\xa0\
+\x6d\x8a\xaa\x09\x26\x77\x8e\x22\x24\xcc\x7c\xbb\xc9\x13\x8f\xce\
+\x33\x3d\x7e\x06\x7f\xf8\x92\x0f\x31\x22\x47\x0b\xbf\x33\x78\x22\
+\x5b\x1b\x05\x90\x25\xf0\xfd\x9d\x2a\xbe\x12\x48\x82\x22\x78\x35\
+\x48\x22\xaf\x4f\x0a\x0d\x22\x4f\x08\x5f\x29\xc8\xac\x49\x24\xf3\
+\x30\x40\xab\x44\x16\xe2\x7f\xb0\x72\x87\x2e\xaa\xd1\x5d\x89\x17\
+\x32\x7f\x83\x14\x3e\xeb\x37\x12\x2d\x0c\xd2\x87\x00\x69\x05\xa9\
+\x09\x9d\x49\x8b\xb4\x9a\xd4\x38\xf0\xb5\x14\x08\xab\x49\x8d\x70\
+\x40\x5b\x81\xd1\xa9\x2b\x4b\x8d\xf0\xcb\xd4\x9d\x93\x84\x4a\xb5\
+\xca\xf8\xce\x0a\x28\x98\xf9\xdf\x06\xdf\xfe\xfa\x3c\x7b\xc7\x4e\
+\xe3\x9a\xe7\x7d\x80\x7a\x32\xd6\x32\x29\xf4\x44\xb6\x8e\x0a\x10\
+\x83\xef\x14\xc1\xab\x80\x2c\xa9\x40\xb4\x9e\x87\x03\xe9\xc3\x81\
+\x27\x84\x6f\x1d\xab\x20\x89\x04\x32\x64\x0d\xe6\x5c\x11\xc0\x55\
+\x04\xd1\x39\x85\xcc\x1f\x88\x6a\xff\x3c\x07\x90\x59\xe2\x27\x7d\
+\x93\x47\x63\x84\x75\x29\xa8\xb5\x5e\xf6\x0d\x42\x6a\x8c\x95\xa4\
+\xd6\x20\x6c\x08\x3a\x02\xac\x70\x25\xa8\x74\x72\x2f\x8c\x40\x2b\
+\x40\x6b\x0f\xbe\x05\x99\x00\x29\x49\x55\x32\xb9\x6b\x04\x23\x34\
+\x4f\x1c\x9e\xe3\x7f\xff\x6b\x9e\x3d\x63\xa7\x72\xd5\x79\xef\x63\
+\xbc\x36\xd1\x76\x26\xf1\x89\x4c\x82\xf6\x04\x68\x03\xbe\x12\x01\
+\x6c\x45\xa2\xf2\xf8\x9f\x48\x95\x79\x7c\x46\x04\x29\xb2\x6a\xc1\
+\xc9\xbf\x97\x7e\x51\x0c\x01\x32\xc8\xbf\x8c\xbc\xbf\xd0\x09\x76\
+\x49\xa0\xbb\x7c\xaa\x98\xfd\x9b\xd0\xfc\x71\x31\x3e\x24\x85\x32\
+\xc4\xfc\x90\x00\xa2\x91\x52\x60\x10\xa4\x56\x22\xac\xf1\xde\x8e\
+\x3b\xae\x30\x08\xad\x49\x25\x5e\xee\x0d\x46\xa6\x8e\x75\x41\xf6\
+\x25\x60\xa0\x52\xaf\xb1\x71\x77\x1d\x2d\x34\x87\x1e\xff\x0e\x87\
+\x1f\x99\x63\xcf\xd8\xa9\xbc\x6b\xdf\xf5\x6c\x18\xdb\x48\xb5\x5a\
+\xa5\x5a\xad\x52\xa9\x54\x0a\xf3\xf9\x4f\x64\x6b\x43\x00\xd5\x16\
+\xfc\x2c\xf1\x53\x61\x3d\xf2\x7c\x99\x78\x45\x08\x8d\x22\x91\x11\
+\x42\x46\xe0\xcb\x08\x74\xe7\x29\x44\x61\x20\xe4\x04\xa2\x25\x03\
+\x80\x36\xa3\x80\xc2\x66\x5e\x6f\xb2\x41\x9f\x18\x7c\x89\xb5\x86\
+\xd4\x3a\x79\x77\x03\x52\x4e\x0d\xb4\x01\x21\x71\x79\x40\xf0\x76\
+\x0b\x68\x27\xf7\xc2\x24\x4e\x0d\x3c\x09\x8c\xb6\xd4\xea\x8a\x2d\
+\x7b\x26\xd0\x32\xe5\x5b\xdf\x9a\xe5\x9b\x0f\x1f\x65\xf7\xe8\x74\
+\x06\x7e\xad\x56\x63\x64\x64\x84\x5a\xad\x96\x11\xe0\xe9\x9c\xec\
+\xb9\x52\x6b\x25\x80\x14\xed\xc1\x97\xc1\xdb\xa3\xf0\xe0\xbd\x3c\
+\x11\x0a\xa9\xf2\x0e\xa1\x12\x71\x2e\xe0\x2b\x04\xa1\x10\x32\x22\
+\x40\x34\x68\x24\x45\xb1\x6b\xd6\x4a\x81\xa8\x0f\x10\x7a\xf3\x51\
+\xbd\x6f\x44\x4e\x00\x57\xee\x69\x5f\xfe\xf9\xc1\x27\x2b\xd0\xd6\
+\x6d\xf7\x61\x9c\xd4\x0a\xb0\x2e\xf7\xf7\x99\xa4\xcb\xf8\xbd\xc7\
+\x5b\x93\x20\x65\x8a\x35\x96\xa9\xc9\x31\x36\xef\x18\xc7\x48\xcd\
+\xa3\xdf\x38\xca\x7f\x1e\xfc\x36\xbb\x47\xa7\xb9\xea\x59\xd7\x33\
+\x55\xdf\xc0\xe8\xe8\x28\xf5\x7a\x9d\x91\x91\x91\xec\x8b\x1f\xa3\
+\x9b\x39\x0b\xe7\x7d\xa2\x59\xdb\x24\x30\xc4\xf2\xd8\xd3\x13\xa9\
+\x50\x9e\x00\x89\x08\xf5\x7f\x5c\x19\x94\xf3\x81\x50\x11\xc4\x83\
+\x46\x32\x03\x5e\x85\x3c\x80\x9c\x08\x71\x5b\xb8\x9d\x85\x96\x2f\
+\xde\xf3\x03\x01\x74\x18\xef\xb7\x12\x2b\x8c\xab\x02\x4c\xe8\xeb\
+\x0b\x9f\xf1\x5b\x9f\xf0\x85\xa1\x67\x37\x1e\xa1\x83\xa7\x4b\xc0\
+\x24\x05\x12\x60\x24\x1b\x36\x8e\xf1\x8c\x53\x26\x69\xd8\x06\xff\
+\xf5\xd8\x21\x0e\x3e\xf0\x78\x0e\xfe\xd8\x46\xea\xf5\x7a\x06\x7e\
+\x4c\x80\x3e\x0e\x01\x1e\xf0\x2c\xa1\x53\x0e\xe4\xa8\x32\x08\xc4\
+\xc8\xfa\x04\x71\x75\x90\x85\x01\x85\x92\xb9\x0a\x88\x88\x18\xa1\
+\x12\x88\x09\x20\xdd\xc1\x3d\xfc\xb2\x4d\x15\x60\xf2\xa6\x0f\xc5\
+\xd6\xaf\xf4\x25\xa0\x09\x5e\xee\xa7\x56\x09\x2b\xdc\x4d\x17\xbe\
+\xc7\x2f\xa4\x1b\x7f\x48\xad\x01\xa3\x11\x0a\xd0\x09\x48\xe3\x49\
+\x20\xbc\xec\x3b\x12\x6c\xda\x38\xce\x8e\x9d\x1b\x1c\xf8\x5f\x3f\
+\xcc\x97\xee\x7f\xf4\xa4\x02\x1f\x3a\x85\x00\xa9\x1c\xc8\x42\xfa\
+\x84\x2f\xc9\xc0\x2d\x80\xef\xd7\x93\x4c\x31\x5c\xa5\x90\x28\xd9\
+\x22\xff\x85\x1c\x40\xf8\xb9\x02\x52\x44\x73\x09\xdb\x25\x82\x22\
+\x17\x7f\xab\xdc\x73\x19\x8d\xfd\x5b\x57\xf7\x07\xef\x77\x75\xbf\
+\x8c\x46\xf5\xdc\x90\xb4\xd0\xd2\x79\xba\x75\xf5\x3d\x46\xb8\x1c\
+\xc0\x00\xca\x83\x8e\xaf\xf7\xa5\x05\x93\xb0\x65\xd3\x3a\xf6\xec\
+\xd8\xc4\xa2\x6d\xf2\xf0\xa3\xdf\xe2\x0b\xff\xf6\x30\xbb\x7c\xcc\
+\x9f\xf4\xb2\x3f\x3a\x3a\x4a\xad\x56\xeb\x18\xf7\x4f\x54\xd9\x8f\
+\xad\x95\x00\xe4\xb2\x9d\x88\x62\x33\xa8\x2d\xf8\xb2\x58\x11\x64\
+\xdd\xc0\xd0\x39\x2c\xe4\x02\xbe\x42\x10\x12\x81\x2c\xe4\x01\x42\
+\x44\x13\x4d\x4b\x89\x60\x48\x00\xcb\x8d\x20\x6b\xad\xab\xfb\x09\
+\xc3\xb7\x22\x8b\xfd\xce\xd3\x35\xc2\x48\x84\xd2\x08\x9b\x20\x8d\
+\x6b\xf1\xba\x46\x0f\x80\x00\x9b\xe6\x07\x91\x12\x0c\x3c\x63\xd3\
+\x14\xa7\xee\xd8\x46\xd3\x36\x38\xf8\xb5\xc7\xf8\xcc\x17\x1f\x64\
+\xd7\xe8\x34\x57\xed\xbb\x9e\xa9\xb1\x0d\x27\x85\xe7\x07\xeb\x98\
+\x03\xe4\xdd\xbd\x38\xe6\x97\xc1\x57\x59\xf6\x9f\x84\x1c\x20\x4e\
+\x0c\xa3\xaa\x40\x49\xe9\xba\x82\x51\x25\xa0\x0a\x04\x90\x2d\xde\
+\x9f\x5b\x69\x12\x48\x94\x00\xba\x26\x90\xcf\xfc\x85\x6b\xfa\x68\
+\xe3\x47\x19\x8d\xc4\x48\x4d\x6a\x43\x67\xcf\x57\x1b\x16\x74\xd6\
+\xe0\xf1\x19\x3f\x16\x74\xc2\x29\x9b\xd6\x73\xe6\xce\x53\x68\xd8\
+\x26\xff\xfe\x9f\x5f\xe3\x8e\x7b\xff\xf5\xa4\x05\x1f\x96\xc8\x01\
+\x64\x06\x78\xc8\xec\x13\x1f\x0e\x62\xcf\x0f\xdd\xc1\xb8\x5b\x18\
+\x3c\x3f\x2f\x1b\x0b\x0a\xe0\x09\xe1\xb2\x7f\x55\x50\x00\x81\x00\
+\x29\x68\x57\x3c\x19\xf0\x33\x7f\x2c\xd6\x87\x03\x57\xf7\x6b\xdf\
+\x0d\x8c\xbc\x5f\x18\x8c\xd6\xa4\xd2\x35\x7c\xb0\x02\x6d\xb4\x8b\
+\xf1\x02\x84\x8e\xca\xbc\x40\x02\x01\xbb\x36\x6d\xe6\xec\x9d\xbb\
+\x69\xd8\x26\x5f\x7c\xe4\xab\xfc\xcd\xe7\xef\x71\xb2\x7f\xee\x7b\
+\x99\xac\x4f\x65\xb2\xbf\x54\xb9\xd7\x0f\xb2\x1f\x5b\x0b\x01\x4e\
+\xd9\xb6\x91\x9d\x53\x9b\xa9\x88\x84\x8a\xa8\x50\x51\x49\xfe\x5c\
+\xb8\xe7\x89\x5f\x97\x42\x21\x55\x82\x14\xee\xa1\x50\x48\x91\x78\
+\x4f\x57\x7e\xbb\x4b\x12\x9d\xe4\x27\xde\xd3\x65\xb6\x0c\x77\x0e\
+\x89\xcc\xf5\x97\xe8\x03\x90\x4f\x02\x81\x30\xcd\xdb\x78\x45\x30\
+\x7c\xf3\x3b\x8f\x30\x97\xce\x38\x05\x50\x79\x7b\x57\xf8\x16\x30\
+\x36\x75\x95\x80\x0a\x3d\x7f\x47\x02\x2b\xe0\x8c\x2d\xbb\x38\x7b\
+\xfb\x2e\x9a\x36\xe5\xf3\x8f\x1c\xe4\x63\x9f\xfb\x4c\x06\x7e\xec\
+\xf9\x21\xee\xf7\xbb\xe7\x07\x6b\x21\xc0\x9e\xad\x5b\x38\x63\xdb\
+\x4e\x6a\xa2\x42\x4d\x54\xa9\x52\xa1\x26\xab\x54\xa8\x50\x13\x15\
+\xaa\x54\xa8\x8a\x2a\x8a\x0a\x42\x54\x10\xd9\x32\x01\x51\x45\x90\
+\x64\xeb\x6e\x20\xa8\x02\x42\xb9\x75\x14\xa0\xc8\x6f\x35\x93\xa5\
+\x5b\xcc\xca\xd6\x66\x46\x50\xb6\xb4\x41\x16\x08\xd3\xc0\xf6\x4c\
+\x9c\xc3\x17\x1e\xbf\x9d\xd9\xc6\x51\x74\x28\xff\x30\xa4\xf8\x19\
+\xbf\x26\x21\x95\xc6\x0f\xee\x58\xac\x4e\xb0\x22\xe5\x07\x76\x9f\
+\xc5\xae\xa9\xcd\x34\x68\x72\xf7\x7f\x3c\xc0\x8d\x77\xff\xc3\x40\
+\x80\x0f\x6d\x08\x70\xf8\xc9\xa7\x18\x11\x55\xe7\xf1\x24\x85\x65\
+\x82\xa2\x4a\x82\x14\x15\x0f\x66\x05\x21\x54\xfe\x5c\x2a\x24\x0a\
+\x3c\xf8\xa0\x32\x22\x38\xad\x75\x5e\x5f\xae\xf7\x0b\x3e\xbf\x92\
+\xd1\xe0\xd2\xc8\xfc\xba\xda\x38\x67\x6e\x3e\x13\xa5\xaa\xac\xab\
+\x4c\xb2\x90\xce\x22\xac\xf6\xd9\xbe\x70\x33\x9c\x35\x59\x99\x97\
+\x4a\x89\x35\xa0\x24\xbc\x78\xe7\xf7\x32\x3d\xe5\x12\xbe\x3b\xff\
+\xe3\x4b\xfc\xf1\x3f\x7d\x82\x5d\xa3\x7b\xf9\xed\x73\xaf\x6b\x91\
+\xfd\xb8\xcd\xdb\xcf\xb2\x1f\x5b\x0b\x01\x6e\xfb\xc2\xbd\x4f\xc7\
+\x79\xac\xd9\x2e\x3c\xe7\x95\xfc\xde\x8f\x5c\x4d\x22\x5d\x72\xea\
+\xbc\x5f\xbb\x8e\x9f\x01\x54\x02\xd9\x08\x1f\x20\x52\x5e\xb4\xfb\
+\x39\x4c\xaf\xdf\x8e\xa5\xc1\xa7\xbe\x7c\x2f\xef\xf9\xc7\x5b\x3c\
+\xf8\xef\x65\xaa\x7e\x72\x7b\x7e\xb0\x8c\x00\xa2\xc1\xfd\x0d\xd2\
+\x97\x1e\xeb\x0e\xac\x41\xa0\x49\xcc\x13\xd4\xf5\x61\xb6\xbe\x60\
+\xef\x8b\x5f\xf2\xba\x57\xbf\xe1\x67\x0e\x1d\x3a\x84\x4e\xd3\xe5\
+\x77\xb0\x06\x0b\x9e\xf7\xdf\x73\x5f\xe3\xe6\x87\x6e\xe4\xb2\x17\
+\xbe\x85\x44\x25\x24\x4a\xf9\x2e\x9f\xf0\xb5\x3d\x25\x12\x58\x5e\
+\xb8\xe3\x85\xec\x5d\xbf\x13\x4b\x93\xdb\xbf\xfc\x39\x7e\xf7\xae\
+\x8f\x0c\x1c\xf8\x10\x11\xe0\xff\xae\xe1\x28\x70\xf7\x2a\xf6\x21\
+\x70\xdf\x5d\x3b\x01\xec\xda\xf5\xf3\xa7\xef\x7e\xee\xb6\xe7\xf3\
+\xb8\x79\x9c\x46\xa3\xd1\xa5\xd3\x74\x16\x4b\x6d\xfc\xc5\x4b\x61\
+\x34\xf1\xd0\xd1\x43\xa8\x9a\xab\x58\x84\xd2\x5e\xf6\x93\x12\x09\
+\x14\xdf\xbf\xed\xc5\xec\x9d\xda\x05\xb6\xc9\xdf\x3e\xf4\x19\x7e\
+\xfb\xce\x3f\x75\xe0\x9f\xf3\xde\xac\xb7\x7f\x32\xcb\x7e\x6c\xdd\
+\xfe\xd1\x28\x0b\x50\xa9\x54\x18\x1b\x1b\xa3\x52\xa9\x74\x79\xf7\
+\xd1\x81\xac\xfb\xb5\x90\x34\x4d\x49\x66\xdd\xc7\x10\xa1\x5c\x95\
+\x0a\x5d\x98\x3d\x96\x77\xf9\x9e\xbf\xed\x65\xec\x99\x9c\x06\xdb\
+\xe0\x6f\xbe\xbc\x9f\x77\xee\xff\x83\x1c\xfc\xb1\x7c\x60\xe7\x64\
+\xf7\xfc\x60\x3d\xf9\xd5\xb0\x5a\xad\xc6\xc4\xc4\x04\x8b\x8b\x8b\
+\xbd\xd8\x7d\xe6\xf9\x5a\x6b\x1a\x8d\x06\xd5\x6a\x15\x20\xeb\x46\
+\x26\x52\x15\x7b\xfb\x02\x2a\x95\x3a\xe7\x6e\x7e\x31\x7b\x26\x4e\
+\xc3\xd2\xe0\xaf\x0f\x7e\x92\xb7\x7f\xea\xda\x81\x06\x1f\x7a\x40\
+\x00\x21\x84\x0d\xbf\x7f\x97\x24\xbd\xf9\x55\xba\xd8\xfb\x85\x10\
+\x24\x5e\x69\xc2\x54\x35\x25\x64\x94\xec\x29\x92\x4a\x8d\x17\xed\
+\xb8\x84\x89\xea\x24\xd0\xe4\xaf\x1e\xfc\x04\x57\xdc\xf1\x2e\x76\
+\x8d\xec\xe5\x9d\x67\xbf\x87\xf5\xa3\x93\x59\x67\x2f\x06\x3e\x0c\
+\xe9\xf6\xcb\xf4\xae\xd5\x58\x4f\x10\xaa\x56\xab\x5d\x9f\x13\x5f\
+\xbe\xf8\xc1\xfb\x01\x12\xe5\x3e\x86\xf4\x43\xd6\xca\x27\x7b\x56\
+\x58\x2a\x49\x95\xe7\x6f\xbf\x84\xf5\xd5\x2d\x80\xe6\x96\x07\x6f\
+\xe5\xad\x9f\xfc\x0d\x07\xfe\x39\xef\xc9\x12\xbe\x38\xee\x57\x2a\
+\x95\x93\xde\xf3\x83\xf5\x84\x00\xe1\xe2\xa5\x3d\xa8\x02\xca\xdf\
+\xb3\x97\xa6\x69\xf6\x5c\x92\x0f\x51\x5b\xa1\xa8\x55\x6a\x7c\xdf\
+\xb6\x8b\x99\xa8\x6c\x01\x2c\xb7\x3c\x78\x33\x97\xff\xfd\xaf\x0e\
+\xc1\x8f\xac\xeb\x04\x30\xc6\xa0\x94\x2a\x80\xd4\x8b\x63\x84\xfd\
+\x4b\x29\xa3\x9b\x4c\xf2\x7b\x17\x93\x4a\x8d\xe7\x6c\xb9\x88\x89\
+\x64\x0b\x16\xb8\xe5\xc1\x9b\x78\xcb\xdf\xbd\x81\x5d\x23\x7b\xb9\
+\xf2\xec\x77\x33\x39\x3a\x95\x81\x1e\xa4\x3f\xfe\x15\x8f\x60\x27\
+\xa3\xec\xc7\xd6\xb3\x9f\x8e\xed\xa5\xf7\x48\x99\xff\x9c\x6b\x7c\
+\x9c\x30\x94\x5d\x53\x75\xce\xdb\xfc\x2a\xc6\xd4\x66\x00\x3e\xfe\
+\xd0\x47\x78\xf3\xdf\xbd\x3e\x03\x7f\xe8\xf9\xb9\xf5\x84\x00\xbd\
+\xbc\x1d\x6a\xa9\xef\xcf\x13\x42\x52\x55\xa3\x3c\x77\xeb\xc5\xd4\
+\xc4\x14\x00\x1f\x3f\xf8\x51\x2e\xbb\xfd\x17\x87\xe0\x77\xb0\x9e\
+\xfe\x78\x74\x2f\xe4\xb3\xfc\x8d\xdc\xd6\xda\x70\xcf\x38\x20\x39\
+\x63\xe2\x02\xc2\x0f\x6a\xdd\x7a\xf0\x2f\xf8\x95\xdb\x7e\x9e\x9d\
+\x23\x7b\xb9\xf2\xac\x5c\xf6\xe3\x21\xdd\x41\x94\xfd\xd8\x4e\xfc\
+\x79\xcb\x4b\x58\x7b\x4f\xcd\xc1\xff\xe5\xdb\x2e\x65\xe7\xc8\x5e\
+\xde\x79\xd6\xbb\x99\xac\x4f\xb5\x4c\xe6\x18\x64\xcf\x0f\xd6\xd7\
+\x3f\x1f\xdf\xc9\x02\xf8\xbb\xea\xd3\x5c\x79\xe6\xb5\x43\xf0\x97\
+\xb0\x93\x22\x04\xc4\x87\xc9\xc0\x1f\x9d\xe6\x1d\xdf\x73\x4d\x61\
+\x48\x37\x4c\xe0\x1c\x74\xd9\x8f\xed\xa4\x52\x80\x3f\xb9\xf7\x7d\
+\xdc\xf1\xf0\x27\x1c\xf8\x67\x5e\x53\x68\xef\x0e\x3d\xbf\xbd\xf5\
+\x3d\x01\x62\x00\xef\x78\xf8\x13\xec\xae\x9f\xca\x95\xcf\x74\xb2\
+\x3f\x32\x32\x32\x04\x7f\x19\x3b\x29\x42\x40\x68\x04\xed\x1d\x3b\
+\x8d\xdf\x3a\xe7\x3a\xc6\x6b\x13\xd4\x6a\xb5\xa1\xec\xaf\xc0\xfa\
+\x5e\x01\xc2\x80\xcd\xf4\xc4\x19\xfc\xde\xb3\xff\x90\xba\x72\xc3\
+\xd0\xa1\xcc\x1b\x7a\xfe\xd2\xd6\xb7\x04\x88\xbf\x7e\x65\xe7\xc4\
+\x2e\xae\x7f\xc1\x9f\x31\x22\x47\x91\x52\x52\xa9\x54\xa8\x56\xab\
+\xd9\xd4\xed\x21\xf8\x9d\xad\x27\x63\x01\xc1\x7a\x25\xb1\xf1\x37\
+\x70\x48\x29\xd9\x3e\xbe\x93\x34\x4d\x09\x5f\xb7\x1e\x08\x70\x32\
+\xcf\xe4\xe9\x96\xf5\xa5\x02\xc4\xde\x9f\x24\x09\xd6\xda\xc2\x00\
+\x54\xf9\x97\xb8\x87\x9e\xdf\xd9\xfa\x92\x00\x40\x46\x00\x6b\x6d\
+\x26\xf3\xf1\xf6\xf2\x6f\xf3\x0e\xad\xbd\xf5\x5d\x15\x10\xef\x37\
+\x80\x1d\xcf\xda\x69\xf7\xd5\x6c\x43\xd9\xef\x6c\x7d\xa9\x00\x01\
+\xf0\x58\x05\xe2\xd7\xc2\x72\xe8\xf9\xcb\x5b\x5f\x12\x00\x8a\x24\
+\x68\x3f\x34\x3c\x04\x7f\x25\xd6\x53\x02\xc4\x15\xc1\xf1\xb6\xa1\
+\xec\xaf\xcc\xfa\x7a\x38\x78\x68\x6b\xb7\x21\x01\x06\xdc\xfa\xb2\
+\x0a\x18\x5a\xf7\x6c\xa8\x00\x03\x6e\x43\x02\x0c\xb8\xf5\xe5\x58\
+\xc0\xd0\xba\x67\x43\x05\x18\x70\x1b\x12\x60\xc0\x6d\x48\x80\x01\
+\xb7\x61\x19\x38\xe0\x36\x54\x80\x01\xb7\x6e\x13\xc0\x0a\x21\x86\
+\x6e\xdf\x7b\xeb\xda\x35\xee\x66\x08\x30\x80\x56\x4a\x65\x5f\x0a\
+\xb0\x79\xf3\xe6\x2e\xee\x7e\x68\xde\x52\xdc\xb5\xee\x0a\x09\x86\
+\x21\x60\xc0\xad\x1b\x83\xe6\x02\xa7\x24\x63\xc0\x56\xe0\x54\xe0\
+\x34\x60\x07\xb0\x01\xa8\x31\x24\xda\x5a\x4c\x03\x0b\xc0\x11\xe0\
+\x51\xe0\xab\xc0\xd7\xfd\xfa\x3c\xe1\xe7\x14\x57\x69\xdd\x0a\x01\
+\x16\x77\xa2\xf3\xc0\x93\xc0\xb7\x70\x52\x75\x04\xa8\x12\x7e\x2a\
+\x74\x68\xc7\x6a\x16\x07\x70\x03\x38\x0a\x1c\xf2\xcb\x45\xd6\x08\
+\x7c\xb0\x6e\x11\xc0\x00\x4d\x60\x16\xf8\x36\x8e\x0c\xff\x07\x8c\
+\x74\xf1\x18\x83\x6c\x29\x30\x87\x03\xff\x09\x9c\xa3\xe9\x6e\xec\
+\xb8\x1b\xe0\x84\x64\x24\xc5\x9d\x98\xf5\xcb\x9a\xdf\xff\xd0\xfb\
+\xd7\x66\x41\x05\x9a\x38\xcf\x9f\xf7\x4b\x4d\x17\xab\x81\xa1\x0d\
+\x6d\x68\x83\x68\xff\x0f\x35\x0c\xec\x2e\xc0\xed\x7d\xa5\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0a\x85\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x89\x00\x00\x0b\x89\
+\x01\x37\xc9\xcb\xad\x00\x00\x0a\x37\x49\x44\x41\x54\x78\x9c\xed\
+\x9d\xcd\x6f\xd4\x48\x1a\xc6\x1f\x77\xa7\xc9\x07\x44\x91\x96\x15\
+\x01\x36\xda\xd5\x6a\x85\xd8\x13\x87\xe5\x80\x06\x69\x0f\x5c\xb3\
+\x97\xb9\xed\x81\xcb\x9e\xe6\x32\x0c\x8d\xc4\x79\xef\x1c\x01\x31\
+\x7f\xc4\x5c\x98\xd3\x72\x43\xb0\x1a\x69\x25\xe6\x46\x6e\xac\x60\
+\xd0\x08\x12\x14\xb4\xa4\xe9\x74\xd2\xb6\xeb\xc3\xde\x43\xe8\x8e\
+\x53\x5d\xb6\xcb\x76\xd9\x71\xec\xf7\x27\x45\xb6\xab\xca\x6f\xbd\
+\xae\x7a\x5c\x55\x2e\x57\x3b\x00\x41\x10\x04\x41\x10\x04\x41\x10\
+\x04\x41\x10\x04\x41\x10\x04\x41\x10\x4d\xc6\x49\x8a\x7c\xf0\xe0\
+\x41\x58\x95\x23\x44\x79\xf4\xfb\xfd\xd8\x7a\x9e\x4b\x3b\xf9\xf6\
+\xed\xdb\x76\xbd\x21\x2a\xe5\xe1\xc3\x87\x89\xf1\x9d\x8a\xfc\x20\
+\x6a\x0a\x09\xa0\xe5\x90\x00\x5a\x0e\x09\xa0\xe5\x90\x00\x5a\x0e\
+\x09\xa0\xe5\x90\x00\x5a\x4e\xea\x3c\x80\x29\x6f\xdf\xbe\xc5\xb9\
+\x73\xe7\x6c\x99\x3b\xc2\xc7\x8f\x1f\xc9\xb6\xc2\x70\x38\xc4\xc5\
+\x8b\x17\x0b\xdb\xb1\x26\x80\xf9\xf9\x79\x9c\x3e\x7d\xda\x96\x39\
+\xb2\x9d\xc2\x70\x38\xb4\x62\xc7\x9a\x00\x8e\x9b\x5b\xb7\x6e\x55\
+\x9e\xe7\xa3\x47\x8f\x2a\xcf\xd3\x36\x8d\x11\x00\x00\x3c\xf8\xfe\
+\xfb\xca\xf2\xea\x7f\xfb\x6d\x65\x79\x95\x49\xa3\x04\x20\x1c\xa0\
+\xf3\xd5\x75\x38\xd7\xaf\xe7\x38\xdb\xec\xbd\x97\xfc\xe1\x07\xe0\
+\xfd\xfb\x1c\xf6\xeb\x49\xa3\x04\xc0\x01\xf4\xae\x5e\x45\xef\x9b\
+\x6f\x4a\xcb\x83\xfd\xf4\x13\x02\x12\x40\x3d\x11\x0e\xd0\xf1\x5c\
+\x74\x07\x83\xf8\x44\x61\xb1\x37\xdc\x52\x08\xc8\xc4\x97\xe8\x27\
+\x8b\x66\x09\x00\x40\xd7\x73\x11\x0c\x76\x8a\x19\x4a\x10\x89\x10\
+\x1c\xb2\x98\xf5\x5a\xd1\x28\x01\x70\x07\xe8\xba\x2e\xe6\x76\x0a\
+\x0a\x20\x01\x21\x04\x04\xb5\x00\xf5\x44\x00\x10\x9e\x07\x39\x18\
+\xcc\xdc\xc5\xb6\x96\x36\x09\xc1\x21\x2c\xd9\xaa\x03\xcd\x12\x80\
+\x03\x48\xcf\x85\xc8\xd3\x05\x18\x8e\x0d\xa8\x05\x88\x61\x7b\x7b\
+\x7b\x66\x76\xaa\xd3\xb1\xf3\xaa\x81\x31\x86\xd1\x68\x94\x9a\x8e\
+\xe3\xa0\x0b\x48\x1c\x04\x9a\x12\x23\x08\x2e\xc4\xb4\x05\x78\xf5\
+\xea\x55\xa2\x09\x53\xbf\xd3\x08\x82\x60\x26\x6c\x65\x65\xa5\xb0\
+\x5d\xc0\xa2\x00\x56\x57\x57\xad\xcc\x4d\xeb\xd8\xda\xda\x32\xb2\
+\x2d\x1c\x40\x78\x2e\x78\xd1\x41\x60\x52\x1e\x92\x4f\x5b\x80\xcb\
+\x97\x2f\x27\xa6\x35\xf5\x3b\x0f\x5b\x5b\x5b\x56\xec\x34\xab\x0b\
+\x00\xc0\x3d\x0f\x9d\x69\x0b\x60\xa9\xe7\x0f\x0f\x2d\x71\x2e\xe8\
+\x29\xa0\xae\x70\x07\x70\x3c\x17\x30\x6e\x01\xb2\x0b\x84\x4b\x4e\
+\xf3\x00\x75\x45\x00\x70\x5c\x17\xa1\xad\x2e\x40\x33\x0e\xe0\x42\
+\x60\xb6\x47\x3e\xb9\x34\x4b\x00\x0e\x10\x7a\x2e\x64\x46\x01\x64\
+\x69\x07\x84\x10\x08\xa9\x05\xa8\x27\x1c\x07\x83\x40\x47\xf0\xc3\
+\xc0\x82\x53\xbf\x2a\x41\xd4\x76\x03\x68\x94\x00\x84\x03\x20\x90\
+\x00\x2b\x79\x98\x46\x2d\x40\x3d\x69\xd2\x0c\x5d\x55\x34\x4a\x00\
+\xbc\x41\x77\x66\x55\x34\x4a\x00\xd4\x02\x64\xc7\x9a\x00\x6c\x2d\
+\x52\xd4\x31\x1a\x8d\x8c\x66\xbe\xaa\x9e\xa3\x4f\xf3\xc9\xd4\xef\
+\xe3\xc4\x9a\x00\x16\x16\x16\x66\xe6\xa7\x75\x73\xd8\x79\x60\x8c\
+\x61\x79\x79\x39\x35\x5d\xd5\xe3\xf3\x34\x9f\x4c\xfd\x4e\x43\xf7\
+\x4e\xa5\x76\xab\x82\xcb\x5c\x02\x3d\x1a\x8d\x8c\x0a\xb2\xea\x16\
+\x20\xcd\x27\x53\xbf\xf3\x50\x3b\x01\xd4\x81\x9f\xff\xd1\x8c\x95\
+\xba\x55\xd2\x18\x01\xe4\x59\xa3\x1f\xfd\x2d\x41\x13\xd6\xf8\xe7\
+\x81\x7e\x1b\xd8\x72\x48\x00\x2d\x87\x04\xd0\x72\x48\x00\x2d\x87\
+\x04\xd0\x72\x48\x00\x2d\xa7\xf6\x8f\x81\xe3\xf1\x18\x4f\x9f\x3e\
+\xc5\xc6\xc6\x06\x5c\xd7\x2d\x2d\x1f\xdb\x3f\x2f\x5f\x5c\x5c\xc4\
+\xb5\x6b\xd7\xb0\xbe\xbe\x8e\xa5\xa5\x25\xab\xb6\x6d\x52\xeb\x65\
+\xe1\xae\xeb\xe2\xf1\xe3\xc7\xd8\x29\xf1\x97\x3e\x65\xe1\xba\x2e\
+\x9e\x3f\x7f\x8e\x8d\x8d\x0d\xdc\xbc\x79\xb3\x90\xad\xd6\x2e\x0b\
+\x7f\xf2\xe4\xc9\xb4\xf2\x17\x17\x17\x71\xe5\xca\x15\x9c\x3d\x7b\
+\xd6\x6a\x1e\x65\x4c\xd7\x7e\xfa\xf4\x09\x2f\x5e\xbc\x00\x00\xec\
+\xec\xec\xe0\xcd\x9b\x37\x58\x5f\x5f\xb7\x9a\x47\x2b\x96\x85\x3f\
+\x7b\xf6\x0c\xc0\x41\xe5\xf7\xfb\x7d\xac\xad\xad\x59\xcf\xa3\xac\
+\xb5\xfb\x37\x6e\xdc\xc0\xbd\x7b\xf7\x00\x00\x2f\x5f\xbe\xb4\x2e\
+\x00\x5b\xd4\x7a\x10\x38\xe9\xf3\xd7\xd6\xd6\x4a\xa9\xfc\x32\x59\
+\x5b\x5b\xc3\xf9\xf3\xe7\x01\x00\x9b\x9b\x9b\xc7\xec\x4d\x3c\xb5\
+\x16\x00\x51\x3e\xa5\x76\x01\xa1\xa5\x15\xb9\x61\x18\x5a\xb3\x15\
+\x67\xbf\x6c\x8a\xe4\xe1\x38\xe5\xbd\xe7\xb6\x26\x00\xdd\x05\xda\
+\x2c\xd8\xb2\x2a\xa9\x4c\x71\x45\xed\xda\x16\x80\x2d\x9f\xad\x09\
+\x40\xf7\xa8\xd2\x76\x01\xa8\xf9\xd8\xc4\xd6\x6a\xab\xca\x5a\x80\
+\x3b\x77\xee\xe4\xb6\xfd\xfa\xf5\x6b\xf4\xfb\xfd\xcc\xe7\xdd\xbf\
+\x7f\x3f\x35\x8d\xa9\x00\x8a\xf8\x0f\xc0\xba\xff\x95\xb5\x00\xa6\
+\x4a\x0b\xc3\x70\x26\xad\xea\xe4\xfe\x5f\xbe\xcb\xe0\x5a\x7e\xba\
+\x7b\x9b\x58\xf8\xef\x63\xa3\x42\xca\xd2\x02\xfc\xfe\xbb\x5f\x8a\
+\xba\x66\x84\xff\x7e\x01\xdb\x3f\x5e\x9c\xfa\x15\xd7\xba\xda\x68\
+\x05\x52\x05\x60\x5a\x38\xba\x82\x54\x8f\xfd\xe5\x3f\xe1\xec\x12\
+\xf0\xdb\xa5\xf4\x41\x4d\x5e\x7d\xbf\x1b\x86\x60\x32\xc0\x82\x26\
+\x7f\x6d\x3e\x19\x04\x30\xff\x87\x5d\x2c\x3b\xab\x58\x76\xca\xf9\
+\xfe\x2f\x00\xfc\x2f\xf8\x05\x81\x18\x4f\x7d\x8b\x6e\xa3\xd8\xea\
+\xba\xac\x09\x60\x30\x18\xcc\xa4\x55\x07\x2f\x9c\x4b\x5c\x3d\xdf\
+\xc5\xdf\xfe\xdc\x99\xa9\x61\x5b\x3d\xe4\xfd\xff\x70\xfc\x2a\x0e\
+\xee\x0c\x93\xd9\xb2\xd1\x68\x64\x7c\x8d\x82\x49\xfc\xf1\xd4\x5f\
+\x71\xb5\xf7\xf7\x42\x3e\xc6\x11\x02\xf8\x97\xfb\x4f\xec\xf0\x5f\
+\x01\x1c\xfa\x1f\xe7\x5f\xad\x04\xb0\xb2\xb2\x32\x33\x59\x23\xe5\
+\xd1\xdf\xe8\x09\x21\xe1\x71\x07\x23\xdf\x60\xfa\x21\xe7\xb5\x31\
+\x16\x40\xca\x03\x01\x4c\x26\x62\x12\xb3\x09\x43\xa3\x74\x00\x20\
+\xb8\x04\xeb\x78\x70\xe7\x76\x73\x78\x66\x76\x41\x9c\x73\x48\x71\
+\xd4\xff\x6e\xb7\x3b\x93\xee\xdd\xbb\x77\xf5\x12\x40\x10\x04\xa9\
+\x5d\x80\xe0\x12\xae\xef\x60\xe4\x95\x37\xff\xc4\xb8\x9c\x16\xa0\
+\xed\x2e\x40\x30\x09\xbf\xeb\xc2\x95\xc5\x97\x64\xc7\xe5\xc8\x38\
+\x83\x50\xfc\xd7\xf9\xa7\x2b\xef\x3c\xa4\x0a\x40\xbd\x8b\xe3\x08\
+\xc3\x70\x26\xad\x3a\x48\x11\x5c\xc2\x65\x1d\xec\x7a\x19\x1c\x0f\
+\x63\x0f\xb4\xf8\x4c\x42\x7c\x69\x01\x4c\x06\x49\x59\x06\x53\x82\
+\x05\xf0\xe7\x5c\x8c\x7b\x87\x02\xb0\xfd\x00\xc9\x38\x83\xe4\xe9\
+\xfe\xeb\xca\x3b\x0f\x95\x0e\x02\x0f\x5a\x80\x2e\x76\xc7\x7a\xc7\
+\x6d\x14\xa6\xcf\x82\xd2\x5a\x00\xce\x24\xfc\x9e\x8b\x7d\x31\x11\
+\x80\xfd\xf9\x03\xce\xd8\x8c\xff\x27\x62\x10\x68\x22\x00\x2e\x24\
+\xc6\x9e\xc4\x70\x6c\xd6\x05\xe4\xb9\x3c\x9f\xc9\xe9\x18\xc0\x7a\
+\x17\xc0\x25\x3c\x3e\xc6\x3e\xff\x9c\xd3\xbb\x74\x18\x6f\xb0\x00\
+\x04\x0f\xe0\xfa\x12\x43\x77\x76\x50\x93\x62\x5c\x1f\xac\x09\x63\
+\x4c\x42\x0a\xa9\xcd\x5f\x6f\x3a\xe3\x18\xa0\xe7\x62\xbf\xf7\xd9\
+\x20\xb5\x41\xde\x9a\x30\xd6\xe4\x16\x40\x70\x89\x7d\xaf\x83\xc1\
+\x5e\x79\x3f\xe4\xf6\xca\x6c\x01\x98\x84\xdb\x1b\x63\x6f\x2e\xfb\
+\x87\x28\x4d\xab\x8a\x31\x7f\x3a\x06\x38\x51\x02\x30\x7a\x0a\x10\
+\x12\x63\xaf\x83\xcf\xfb\xf1\x5d\x40\xd1\x8b\xf2\x7c\x89\xa0\xc4\
+\xa7\x00\x6f\x6e\x8c\x51\x27\xda\x02\x58\x7a\xe3\xf9\x65\x7b\xd0\
+\x02\x38\x53\xdf\xa2\xdb\x28\x95\x3d\x05\xd8\x9c\x0a\xe6\x5c\x62\
+\xdf\x73\x30\xd8\x9b\xc4\x1b\x7a\x99\x01\x9f\x49\x74\x4a\x1b\x03\
+\x04\x70\xfd\x31\x46\x4e\xd6\x35\x8a\xe6\x1f\xae\xf6\x7d\x1f\x82\
+\xf7\x30\x87\x43\xff\x1b\x33\x15\x2c\xb8\xc4\xbe\x0b\xec\xc4\xe5\
+\x3a\x93\x55\xf6\x7e\xd4\xf7\x05\x4e\x95\xd8\x02\xb8\x18\x63\x37\
+\xd4\x0b\x20\xb7\x9e\x23\xf9\xfb\x8c\x41\x8a\xee\x11\x01\xe8\x4f\
+\xa9\x59\x17\x60\x2c\x80\x31\xe0\xe4\x74\x7c\xf6\xb4\x59\x3b\x9e\
+\x2f\xd1\x2d\xf1\x31\x70\x1c\xec\x03\xb2\xab\xcd\x3b\x3d\xaf\xf4\
+\x34\x8c\xf9\x08\xc4\xfc\xd4\xb7\x78\x5b\x15\x09\xc0\xb4\x99\x19\
+\x0e\x87\x33\x0e\xa9\x53\x98\x42\x48\xec\xb9\x01\x7c\xf5\x6b\x4e\
+\x16\xdf\x0b\xf8\x3c\xc4\xfc\x17\x9f\x3f\x7c\xf8\x90\x9a\x7e\x6f\
+\x6f\x2f\x5b\x0b\x20\xf6\xc1\x99\xc9\xb7\x48\xf2\x5d\x05\x93\x3e\
+\x9c\xd0\x07\x70\xe8\x7f\xdc\x84\x4f\x25\x5d\x80\x69\x26\x67\xce\
+\x9c\xc1\x85\x0b\x17\x12\xd3\x70\x1e\x80\x1b\x7f\xc7\x25\xbf\x0c\
+\x24\x24\xd0\x85\xd1\x7f\xed\x0c\xc3\xd0\xf8\xbf\x7b\x0a\x26\x71\
+\xf0\xa9\x68\x2f\xb7\x6f\x46\xcc\x7f\x02\x90\xec\xff\xe6\xe6\x66\
+\xfd\xc7\x00\x2a\x82\x57\xf3\x9d\x6d\xd9\x09\x80\x6e\x39\x13\x41\
+\x56\x30\xd4\x76\x2d\xba\x80\x13\x29\x80\x6e\x00\x9c\x2a\x63\x10\
+\xa8\xde\x71\xe5\xcc\x06\x4e\xad\x37\x55\x00\xe5\x16\x1b\x20\x51\
+\xde\x53\x80\x4d\xd2\x72\x6d\x9c\x00\xb8\x28\xb1\x05\x88\x64\x2d\
+\x9d\xf2\x9e\x02\xaa\xa4\x71\x02\xa8\x74\x0c\x80\x63\x1a\x03\x58\
+\x6c\xde\x6a\x21\x00\xd3\x91\x66\x10\x04\x33\x69\xd5\x25\x61\x55\
+\x09\x40\x74\x4f\x46\x17\x90\x46\xda\x54\xf0\x89\x7b\x0a\x58\xed\
+\x6d\x9b\x79\x55\x90\xdf\xcc\x1d\xcc\xd5\xdb\x16\xc0\xe2\x38\xf9\
+\x31\xd7\x36\xb5\x78\x19\x54\xe4\x5d\x80\xda\x02\x7c\xfd\xbb\x7f\
+\x67\x70\xad\x38\xb6\x57\x04\x5d\x1a\x7e\x5d\xd4\xa5\x4c\x4c\xfc\
+\x8a\x13\x40\xed\x5b\x80\xe8\xf1\xdd\xbb\x77\x33\xba\x76\x48\xde\
+\x9f\x70\x9b\x14\x10\x63\xcc\x28\x5d\x1e\xff\x8b\xfe\xf4\x3c\x6d\
+\x49\x58\xad\x06\x81\xbb\xbb\xbb\x56\x1c\xd2\x91\x65\xe9\x76\x5b\
+\x6c\x03\xc5\x5f\x9d\x03\x16\xbb\x80\x4b\x97\x2e\x15\x76\x26\x0e\
+\xd3\x65\xdb\x6d\xb2\x0d\x54\xf4\x2e\xa0\x4c\x05\x13\xc7\x0f\x09\
+\xa0\xe5\x90\x00\x5a\x0e\x09\xa0\xe5\x90\x00\x5a\x8e\xb5\xa7\x00\
+\xe2\x64\x42\x02\x68\x39\xf4\x99\xb8\x96\x93\xda\x02\x4c\xbe\xd6\
+\x49\x10\x04\x41\x34\x8d\xba\xfc\xbb\xe5\xba\xf8\x51\x35\xc7\xfe\
+\x8c\x9d\xa7\xe0\xab\xae\xac\x22\xf9\xd9\xf2\xb5\x48\x45\x55\x5d\
+\xc9\x99\xf2\x33\x29\xa0\xbc\x69\xd4\xb0\x2a\xed\xa4\xa5\x8d\x0b\
+\x8f\x2b\xbc\x2c\x85\xaa\xa6\xd5\x9d\x6b\x62\xaf\x2c\x3b\x47\x48\
+\x2a\x4c\x5d\xc1\x3b\x29\xf1\xba\xad\x49\x7c\xde\xb8\xb4\x73\x74\
+\xc7\x69\x02\x0a\x63\xf6\xe3\xe2\xe2\xd2\xe8\xe2\xf3\xc6\x65\x89\
+\x9f\xec\x9b\x08\xc8\xe8\x0e\x71\x70\x38\x5f\xe0\xe0\xa8\x10\x8a\
+\x1c\xa7\xc5\xa1\x60\xbe\x30\x08\x53\x89\x16\x5c\x68\x10\x66\x7a\
+\x1c\x68\xc2\x75\x69\xb3\xda\x35\xc9\x37\x49\xd0\xa9\xf3\x00\x1d\
+\x1c\x0a\x20\xba\x8d\x8a\x42\x0d\xd3\xc5\xc5\xa5\x49\xda\xc6\xa5\
+\x4f\xca\x47\xfd\x8b\x0a\x28\x4e\x4c\xd1\xc2\x89\x2b\xbc\x00\xfa\
+\x4a\x0a\x94\xf8\x40\x89\x53\xc3\x74\xe1\x71\x5b\x35\x2c\x29\x1f\
+\xd5\xc7\xa8\xef\xd1\x34\x33\xe8\x04\xa0\xde\x29\x9d\xc8\x5f\x57\
+\x09\x53\x2b\xa3\xa3\xc4\x45\xd3\xab\xe7\xea\xfe\x4c\xd2\x24\xe5\
+\x67\x22\xaa\xe8\x7e\x14\xb5\xf0\x4c\x2b\x2b\xfa\xa7\x0b\xd3\xa5\
+\x91\x19\xd2\x4c\xf6\x93\xf2\x0b\x63\xce\xc5\x97\xad\xf3\x25\x7c\
+\xb2\x9d\x92\xd4\x02\xa8\x77\x52\x17\xe9\x95\xd2\xc5\xd1\x8a\x8c\
+\x9e\x93\xb4\x6f\x9a\x4e\x15\x8b\x9a\xaf\xba\xaf\x13\xa2\x49\x0b\
+\xa0\x2b\xf8\xc9\x56\x26\xec\x47\x2b\x47\x1a\xee\x9b\xa6\x8b\x56\
+\xac\x4e\x10\x93\x6b\x8a\xde\xed\x61\x24\x5c\x3b\x06\xa0\x77\x01\
+\x2d\x27\xa9\x05\xd0\xf5\x75\xba\xf0\xe8\xdd\x36\x39\x96\xa0\x2e\
+\xa0\x0e\x5d\x80\x3a\xae\x99\x41\x27\x80\x68\x5f\x11\xad\xfc\x10\
+\x47\x9b\x14\x1a\x04\xd6\x7f\x10\x18\x0d\x43\x64\x3b\x25\xed\x29\
+\x60\xd2\xb7\xa8\xc7\x59\x1e\xc7\xe2\x8e\xd3\xe2\x80\xf8\x4a\x33\
+\x39\x86\x41\x98\x8a\xae\xb0\x92\xc2\x4c\x8f\xd5\x9b\x28\x2e\x6d\
+\x56\xbb\x26\xf9\xc6\xde\xfd\x40\x7c\x41\xe8\xe2\xd4\x82\xd3\xc5\
+\xeb\xb6\x26\xf1\x79\xe3\xd2\xce\xd1\x1d\x27\x5d\x33\x70\xb4\xc0\
+\xd4\xc2\xd3\xc5\xc5\xa5\xd1\xc5\xe7\x8d\xcb\x12\x3f\xd9\x4f\x8a\
+\x9f\x92\x56\x18\x45\xd2\x24\x55\x42\xd9\x76\xd2\xd2\x26\xb5\x00\
+\x59\xc2\x4d\xd2\xea\xce\x35\xb1\x57\x96\x1d\x82\x20\x08\x82\x20\
+\x08\x82\x20\x08\x82\x20\x08\x82\x20\x08\x82\x20\x5a\xc4\xff\x01\
+\x12\x7e\x4b\xc7\x19\x95\xbc\xe3\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x23\x98\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x89\x00\x00\x0b\x89\
+\x01\x37\xc9\xcb\xad\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9c\xed\
+\x9d\x79\xb4\x1d\x47\x7d\xe7\x3f\xd5\x7d\xd7\xa7\xb7\xe9\x3d\x49\
+\x96\x64\x6d\x5e\xc1\x78\x85\xf1\x18\x1b\x8c\x2d\x30\x09\x66\x18\
+\x8c\x71\xc6\x8e\x25\x9b\x41\x99\xe5\x9c\x31\xe7\x24\x38\x93\x85\
+\x81\x1c\x07\x67\x4e\x86\xe0\x0c\x99\x68\x4e\x4e\x02\x3e\x40\x10\
+\x4c\x6c\x19\x0c\x8c\x88\x87\x7d\x89\xcc\x98\x65\x0c\x38\xb2\x25\
+\xdb\xf2\x22\xf3\x2c\xcb\x96\xb5\x3d\xbd\xed\xee\xdd\x55\xf3\x47\
+\xf5\x52\xd5\xb7\xef\x7d\xf7\xed\xef\xc9\xfa\x9d\xf3\xde\xed\xae\
+\xea\xaa\xae\xfa\x7d\xbf\xf5\xab\x5f\x55\x57\x57\xc3\x69\x39\x2d\
+\xa7\xe5\xb5\x2b\x62\xa1\x0b\x30\x2f\x72\x13\x1b\xc9\xb3\x09\x00\
+\x41\x3f\x70\x59\x8b\x2b\xf7\xa0\x18\x01\xa0\xc6\x10\x5f\xe7\xc5\
+\x79\x29\xdf\x02\xca\xa9\x45\x80\x5b\xb8\x94\x2c\x97\xa1\xd8\x84\
+\xc3\x66\x60\x13\x4e\x00\xfc\x74\x45\x32\x04\x0c\x21\xd9\x8d\x60\
+\x88\x0a\xbb\x4f\x25\x62\x2c\x6d\x02\xe8\x96\x7d\x23\x0e\x9b\x11\
+\x6c\xc6\xa1\x7f\x5e\xee\x2b\x19\x41\xb1\x1b\xc9\x6e\x6a\xec\x5a\
+\xca\x84\x58\x7a\x04\xb8\x85\x4b\xc9\xb0\x0d\x87\x1b\x3b\x6d\xdd\
+\xfd\x6b\xb2\x14\xba\x1c\xdc\xbc\xc3\xf2\xb5\x59\x1c\x21\x50\x0a\
+\x14\xa0\x94\x42\x29\x00\x85\x2f\x61\xe4\x70\x1d\xaf\xa6\xa8\x97\
+\x25\xe3\x47\xbd\xce\xca\x24\xd9\x83\x64\x37\x1e\x3b\xf8\x0a\x8f\
+\x4f\xb7\x6a\x0b\x21\x4b\x83\x00\x37\xd3\x47\x86\x6d\xb8\x6c\xc3\
+\x69\xd9\x7f\xd3\x33\x90\xe1\x8c\x73\x0a\xf4\x0d\x66\x59\x7b\x6e\
+\x81\xde\x35\x39\x0a\x5d\x0e\x52\x29\x64\x00\xb4\x94\x1a\x74\xa9\
+\x88\xc3\xa5\x3e\x57\x8a\xe0\x57\xa1\x82\xeb\x4a\x23\x1e\xe5\x93\
+\x3e\x27\x5e\xac\x53\x3a\xe9\x71\xf2\xa5\x06\xd5\x51\xbf\x75\x59\
+\x25\x7b\xf0\xd9\x81\xc7\x0e\x1e\x64\x74\x2e\xd4\x31\x9b\xb2\xb8\
+\x09\x70\x13\x1b\x29\x72\x37\x2e\xdb\xd2\xa2\xf3\x45\x87\x8d\x17\
+\x2f\x63\xc3\xf9\x45\xd6\x9e\x57\xa0\x7b\x20\x8b\x1f\x02\xad\x42\
+\xa0\xa7\x0f\x7e\x78\xad\x4a\xfc\x55\x46\x1a\x0c\xbf\x58\xe7\xc4\
+\xc1\x3a\x27\x0e\x68\x8b\xd1\x24\xba\x9b\xd8\x45\x85\xbb\x17\x73\
+\x17\xb1\x38\x09\xb0\x85\x6b\x71\xb8\x13\x97\x1b\x93\x51\xf9\xa2\
+\xc3\xb9\x97\x76\xf3\x86\x6b\x7b\x59\xbb\xb1\xa8\x81\x94\x0a\x05\
+\xf3\x02\xbe\x92\x32\x11\xa6\x38\xf6\x5c\x8d\xe3\x07\x6a\x1c\x3f\
+\x50\xc7\xaf\xa7\x90\xc1\x67\xc7\x62\x25\xc2\xe2\x22\x80\x6e\xf1\
+\xdb\xd3\x80\x5f\x7f\x7e\x91\x0b\xaf\xea\xe3\xc2\x2b\x7b\xf1\x15\
+\x28\x54\x47\xe0\xd7\xea\x3e\x9e\x0f\x95\x9a\x8f\x52\x50\xad\xf9\
+\x51\xbf\xef\x79\x0a\xdf\xd3\xe9\x51\x90\x71\x43\x75\x68\x10\x5d\
+\xd7\x41\x00\x8e\x2b\x10\x42\x20\x84\x6a\x02\x3f\x26\x0c\x48\x5f\
+\x71\x74\x7f\x8d\x23\xfb\xab\x8c\xbd\x92\xe2\x3f\x2c\x42\x22\x2c\
+\x0e\x02\xdc\x4c\x1f\x59\xee\x26\xc3\x9d\xc9\xa8\x8b\xae\xea\xe5\
+\xca\xf7\x0c\xd2\xbf\x22\x8b\x52\xb4\x05\xdf\xf3\x15\xa5\x9a\x47\
+\xb9\xea\x51\xad\xfb\x54\x6a\x32\xf0\xf4\x02\xc0\x50\xd6\x79\x78\
+\x1a\x87\x29\x2b\x2c\xbc\x26\x8a\x43\x93\x21\x93\x11\x38\xae\xc0\
+\x75\x45\x04\xbe\x49\x04\xdd\x4d\xf8\x1c\xfa\x55\x85\xe3\xcf\xd5\
+\x9a\xeb\xeb\xb1\x9d\x06\x77\x2f\x06\x1f\x61\xe1\x09\xb0\x95\xf7\
+\xe1\xb0\x23\x39\x84\xbb\xf8\xaa\x3e\xae\x7e\xef\x20\x3d\x83\xd9\
+\xc8\x8c\xa7\x81\x5f\x6d\x48\xc6\x2b\x0d\x46\x4a\x0d\x6a\x75\x19\
+\x01\x65\x83\x37\x73\xf0\xa3\x73\x23\x6f\xa5\x14\x99\x8c\xc0\xcd\
+\x08\x9c\x8c\x88\xe2\x4c\x32\xd4\xc6\x7c\x0e\x3d\x56\xe1\xc4\xf3\
+\x75\xbb\xde\x92\x11\x24\xdb\xb8\x9f\x6f\xcc\x85\x5a\x3b\x95\x85\
+\x23\xc0\xcd\xf4\x91\x63\x47\xd2\xdc\x9f\x73\xc9\x32\xde\xb5\x65\
+\x0d\xbd\x03\x2e\x12\x52\xc1\x6f\xf8\x92\x93\xa5\x3a\x27\x23\xd0\
+\xb1\x5a\xe9\x7c\x81\x4f\x22\x2f\x27\xa3\x2d\x84\x9b\x09\x86\x99\
+\x32\xb6\x0e\xb5\x71\x9f\x97\x1e\xad\x30\x7a\xa8\x61\xeb\xc1\x67\
+\x17\x75\xb6\x2d\x94\x35\x58\x18\x02\xa4\xb4\xfa\xc1\x33\x73\xbc\
+\x7b\xcb\x1a\x36\x9c\xdf\x85\x54\x32\x15\xfc\xf1\xaa\xc7\x70\xa9\
+\xc6\xc9\x89\x40\x89\x8a\x45\x03\x7e\xb2\x1c\x6e\x56\xe0\xb8\x00\
+\xc2\xb2\x0a\xe3\xaf\x36\x38\xf8\xf3\x32\x8d\x92\x8a\xf5\xb1\x80\
+\xd6\x60\xfe\x09\xb0\x95\xbf\x4e\xf6\xf5\xd7\xbc\x77\x25\xd7\xdc\
+\xb0\x32\x70\xdc\x9a\xc1\x1f\xaf\x79\x1c\x19\xad\x30\x51\xf5\x82\
+\x49\x1b\x16\x35\xf8\x66\x98\x70\xd1\x16\x81\x20\x5e\x82\x94\x8a\
+\x23\xfb\x6a\x1c\x7d\x2a\xe1\x1f\x78\x6c\xe7\x7e\x7e\x7f\x96\x34\
+\xdd\x91\xcc\x1f\x01\x6e\xa6\x8f\x3c\xbb\xcd\x89\x9c\x15\x67\xe6\
+\x78\xff\xbf\x5f\xc7\x19\xeb\x0b\xa9\xe0\x8f\xd5\x3c\x0e\x8f\x56\
+\x99\xa8\x36\x62\xa5\xc2\x92\x01\x3f\x0a\x52\x0a\xe1\xe8\x2e\x02\
+\x25\x02\x6b\x00\x95\x61\x9f\x43\xbf\x2c\x53\x1b\x93\xb1\x9e\xf4\
+\xf4\xf2\x8d\xf3\xd5\x25\xcc\x0f\x01\x6e\xe1\x52\x72\xec\x36\x4d\
+\xfe\xa5\x6f\xe9\xe7\x37\x6f\x3d\x83\x7c\xd1\x6d\x02\xdf\xf3\x15\
+\x2f\x8d\x54\x18\x2e\xd5\x63\xa0\x96\x30\xf8\xe6\xb9\x70\x40\x38\
+\x22\xea\x12\xfc\x9a\xe4\xd5\xbd\x55\x46\x5f\x32\x86\x8d\x92\x21\
+\xea\xdc\x38\x1f\xd3\xca\x73\x4f\x80\x2d\x5c\x8b\xcb\xae\x10\xfc\
+\x4c\x41\xf0\x9e\x2d\x6b\xb8\xe4\x2d\xfd\x28\x68\x02\xff\xc8\x78\
+\x8d\xc3\xa3\x55\x7c\xa9\x4e\x2d\xf0\xcd\x3c\x01\x21\x82\xb2\x06\
+\xd6\x60\xe4\x60\x83\x57\x9f\xa8\xc6\x7a\x93\x8c\x50\x67\xf3\x5c\
+\x93\xc0\x9d\xcb\xcc\xb9\x8d\x0f\x92\x61\x17\x82\x02\x40\xa1\xe8\
+\xf0\xef\x3e\x72\x16\x67\x5f\xd8\xdd\x04\x7e\xb5\xe1\x73\xe0\x78\
+\x89\xe3\xa5\x7a\x30\x96\x3e\x45\xc1\x0f\xef\x25\x8d\x70\x09\xf9\
+\x6e\x97\x65\xab\x32\x8c\x1f\x6e\xe8\x38\x41\x01\x87\x5b\xb9\x98\
+\x57\xd9\x3b\x77\x24\x98\x3b\x02\xdc\xc6\x07\x71\xd9\x11\x9e\xae\
+\x5e\x5f\xe0\xf6\x3f\xdc\xc8\xe0\xea\x7c\x13\xf8\xc3\xe5\x3a\xcf\
+\x1f\x2f\x51\xf5\xa4\x0d\xd4\x29\x0a\xbe\x55\x36\x19\xc7\xb9\x39\
+\xc1\xb2\x41\x97\xca\x88\xd4\x53\xca\x9a\x04\x37\x72\x11\x43\x73\
+\x45\x82\xb9\x21\x40\x0a\xf8\xdb\xfe\x68\x13\xcb\xfa\x32\x4d\xe0\
+\x1f\x1c\x29\xf3\xd2\x48\x05\x99\x54\xd0\x6b\x01\xfc\x94\x3c\xdd\
+\x9c\x43\xf7\xea\x0c\xe5\xe3\x7e\xfc\x5c\x61\x0e\x49\x30\xfb\x3e\
+\xc0\x16\xae\x25\xcb\xee\xf0\x34\x04\x3f\x5b\x74\x2c\xf0\x1b\x52\
+\xf2\xdc\xf1\x12\xe3\x35\xaf\x19\xa8\xd7\x28\xf8\x66\xd9\xfc\x86\
+\xe2\xe5\xc7\x2a\xd4\x27\x8c\x11\x42\x95\xcb\x66\xdb\x27\x70\x66\
+\x33\x33\x6e\xe1\x52\x5c\x76\x85\xa7\xad\xc0\x2f\xd5\x3d\xf6\x1f\
+\x9b\x38\x0d\x7e\x9b\xba\x39\x19\xc1\xda\xcb\x0a\xe4\xba\x0d\x88\
+\x72\xec\xe6\x16\x2e\x9d\x09\x44\x49\x99\x3d\x0b\xa0\xc7\xf9\x43\
+\xa1\xb7\x3f\x19\xf8\x9e\x34\xc1\x3b\x0d\x3e\xc9\x3c\x03\xfd\xf8\
+\x9e\xe2\xf0\x9e\x2a\xf5\x52\x60\x09\x24\x43\xd4\xb8\x6c\xb6\xe6\
+\x09\x66\xc7\x02\xc4\x93\x3c\xfd\xa0\xbd\xfd\xdb\xff\x70\xe3\x69\
+\xf0\x67\x08\xbe\x42\x3f\x5b\x58\xf5\x86\x7c\x30\xad\x0c\x38\x6c\
+\x22\x1f\x77\xb1\x33\x95\xd9\x21\x40\x8e\xed\xe1\x0c\x5f\xa1\xe8\
+\xb0\xed\x8f\x37\x51\xec\x72\x4f\x83\x3f\x43\xf0\xc3\xf0\x4c\xde\
+\x61\xf5\xc5\x05\x93\x04\x97\xb1\x95\xbf\x9e\x11\x66\x81\xcc\x7c\
+\x14\xa0\x3d\xfe\xbb\xc3\xd3\xf7\x7c\x60\x4d\xd3\x38\xff\x34\xf8\
+\xd3\x07\x3f\xbc\xc6\xc9\x09\xdc\xac\xa0\x32\x1c\xac\x47\x74\xb8\
+\x92\x0b\xd9\xc3\x5e\x9e\x99\x26\x72\x41\x36\x33\x91\x9b\xd8\x88\
+\x60\x7b\x78\xfa\xe6\x77\x0e\x34\xcd\xf0\x35\xa4\xe4\x85\x93\xe5\
+\x19\x81\x2f\x7d\x85\xf4\x15\xc8\xc4\xb5\xd0\x9c\x67\x22\xbf\x53\
+\x01\xfc\x90\xf8\xcb\x56\x65\xe8\x59\x93\x89\xf5\xef\xb0\x83\x9b\
+\xd8\x38\x1d\xe8\xe2\x2c\x66\x22\x5d\xf1\x23\xdd\x33\xd6\x17\xf8\
+\xcd\xdf\x5e\x6d\x81\x2f\x81\xfd\xc7\x26\x28\xd7\xfd\x69\x83\xaf\
+\x82\x3f\xe9\x29\xfc\xba\x42\x7a\x7a\x8a\xf8\xb5\x06\x7e\xa8\xae\
+\xe5\x9b\x72\x64\xbb\x02\xdf\xdd\xa1\x9f\xae\x78\xbe\x65\x3a\x32\
+\x7d\x02\x6c\xe1\xc3\xc1\xdb\x37\xe4\x8b\x0e\xbf\x75\xc7\x99\x4d\
+\xe0\xff\x7a\xb8\x34\x73\xf0\xd1\x8b\x37\x95\xaf\x17\x76\xfa\x0d\
+\xf0\x6b\x9a\x10\xaf\x19\xf0\x8d\xfb\x21\x60\xf0\xbc\x7c\x8c\x83\
+\xc3\x66\xb6\xf0\xe1\x69\x61\xc8\x74\x7d\x00\xbd\x86\x2f\x9a\xe3\
+\xbf\xee\xb7\x56\x71\xee\xc5\x3d\x16\xf8\xc7\x4a\x35\x5e\x19\xab\
+\xce\x18\x7c\x14\x48\x4f\x77\x03\x51\x9c\x04\x15\x86\x09\xc2\x27\
+\x2b\xa7\x34\xf8\x4a\x01\x42\x57\xd5\xc9\xe9\xf4\xd1\x63\x64\xc1\
+\x95\xbc\x8e\xcf\xf0\x14\x29\x0b\x10\xdb\xcb\xf4\x2c\x80\xf6\xfa\
+\xfb\x01\xce\x3c\xaf\xc8\x15\xef\x1c\xb4\xc0\x2f\xd5\x3d\x0e\x9d\
+\xac\xcc\x0a\xf8\xd1\xb9\x04\xe5\xc3\xea\xdc\x7a\x7d\x2c\x75\x77\
+\xe0\x55\x15\x5e\x55\xa2\x4c\x82\x9c\x8a\xe0\x03\xf8\x71\x9e\xbd\
+\xeb\xb2\x76\x57\x90\x8b\x7d\xb1\xa9\xc8\xd4\x09\xa0\x1f\xef\x6e\
+\x0b\x4f\xdf\x7d\xeb\x9a\xa6\x47\xba\x43\xc3\xb1\xd3\x37\x2b\xde\
+\xbe\x0c\x08\x20\xe1\xe3\xaf\xff\x5b\xee\x7d\xe3\x3f\xf2\xa6\xbe\
+\xb7\x46\xa4\xf0\x1b\x50\x2f\x2b\xbc\x9a\x3c\x75\xc1\x0f\x89\x1d\
+\x3c\x3c\x12\x08\xfa\xcf\xca\xc5\xb8\xb8\x6c\x9b\xce\x2c\xe1\xd4\
+\x09\x60\x0c\xf9\xde\xf4\x8e\xe5\xac\x5a\x9f\xb7\xc0\x7f\x65\xb4\
+\x1a\xf5\xfb\xb3\x36\xd4\x53\x31\x01\x50\x70\xf9\xf2\xab\xf9\xec\
+\xe5\xff\x87\x3f\xbb\xf0\x6f\x59\x93\x5f\x8f\xf2\x75\x9c\x57\x53\
+\xd4\x26\x64\xf4\xa6\xce\x29\x07\xbe\x02\xe5\xc5\xf5\xc8\xf7\xb9\
+\x74\xad\x34\x7a\xf1\x69\x58\x81\xa9\x11\x40\xbf\xb1\xb3\x19\xb4\
+\xe3\xb7\xf9\x86\x95\x16\xf8\x35\x4f\x72\x38\xe8\xf7\x67\x73\x9c\
+\xaf\x9d\x40\x85\x94\xd2\x2a\xce\x0d\x67\x6e\xe5\x5b\x9b\x9f\xe0\
+\x8f\x2e\xf8\x04\xdd\x4e\x6f\x6c\x11\xaa\x8a\xda\xb8\x7e\xa4\x7a\
+\x2a\x81\x1f\x95\xc3\x03\x82\x05\x25\x3d\xeb\xb3\x88\x78\x82\x68\
+\x33\x5b\xb8\x76\x2a\x90\x4e\x8d\x00\x46\xeb\xff\x97\xef\x1c\x20\
+\x57\x14\xd6\x1a\xbe\xa1\xe1\xf2\xac\x83\x1f\x5b\x80\xd8\xfc\x25\
+\xe5\xf6\xb3\xee\xe0\xdb\xd7\x3d\xce\x1d\xe7\x7d\x44\xfb\x06\x81\
+\x7f\xd0\x28\xfb\xd4\x4b\x52\x0f\x1d\x5b\x94\x63\xc9\x81\xaf\x34\
+\xc9\x95\xaf\x03\x32\x05\x41\xf7\x5a\x63\x6e\xc0\xc0\xa8\x13\xe9\
+\x9c\x00\x89\xd6\x7f\xf9\x75\xfd\x4d\x0b\x38\xf5\xaa\xdd\xd9\x05\
+\x1f\x45\xec\x03\xb4\x79\x29\xb7\x37\xdb\xcf\x87\x5e\xff\x51\xbe\
+\xfb\x1b\x4f\xf0\xbe\xf5\x5b\xa3\xfe\x52\xd6\xb5\x35\xa8\x4f\xf8\
+\xd1\x48\x62\x29\x83\x1f\x86\xcb\x46\xdc\x12\xba\xd7\x64\xa6\x6d\
+\x05\x3a\x27\x80\x13\x2f\xe5\xbe\xfc\xba\xe5\xe4\x82\xc5\x9c\x4a\
+\xe9\xa5\xdb\x2f\x9e\x28\xcf\x09\xf8\x5a\x09\x4a\xbf\xdc\x69\x2c\
+\xa3\x6a\x25\x67\x2e\xdb\xc8\x27\x2e\xff\x34\x5f\xbb\xee\x11\x2e\
+\x1f\xbc\x3a\x4a\xe7\xd5\xa1\x3a\x2a\xa9\x97\x65\x13\xc8\x4b\x0d\
+\x7c\x14\xe0\xa1\x15\x0f\x08\x57\xb0\xcc\x9e\x21\x6c\x7a\xc5\xae\
+\x95\x74\x46\x80\x9b\xd8\x68\xbe\xc1\xf3\xc6\xb7\xf7\x5b\xe0\x0f\
+\x97\xea\xd4\x3d\x3f\xa5\x12\xed\x15\xd4\xf1\xdc\x7e\x30\xec\x53\
+\xd2\xd0\xc8\x24\x72\x41\xff\x25\x7c\xe9\xed\xdf\xe2\x4b\x6f\xff\
+\x26\xaf\xef\xbb\x38\xb0\x22\x7a\xc8\x58\x1d\x91\x34\x2a\xd2\x2a\
+\xef\x92\x02\x3f\xf8\x91\x8d\x20\x4e\x40\xd7\x2a\xc3\x19\x74\xb9\
+\xb1\xd3\x29\xe2\xce\x08\x50\x88\x19\x75\xd1\x55\xbd\x14\x96\xb9\
+\x11\xf8\x0a\xc5\xab\x63\x95\xb9\x03\x3f\x48\x1b\x7a\xfa\x69\x3e\
+\x40\x3b\xb9\x62\xd5\xdb\xd8\xf5\xee\x9f\xf0\x17\x6f\xfe\x34\x6b\
+\xbb\x36\xe8\x19\x45\x1f\xea\x25\x45\x65\xc4\xb7\x1c\xc5\xa5\x04\
+\x3e\x0a\x64\x5d\xe7\xa5\x50\xb8\x05\x41\xd1\x1c\x11\x14\xd2\xf7\
+\x54\x48\x4a\x67\x04\x70\xe2\xcc\x2e\xdd\xdc\x6f\x81\x7f\x62\xa2\
+\x4e\xbd\x21\xe7\x0c\xfc\xd8\x02\xd0\x51\x17\xd0\x4a\x6e\x3a\xe7\
+\x36\x76\xbf\xff\x49\x7e\xf7\x92\x8f\xd2\x93\xe9\x43\x29\x3d\xc3\
+\x58\x1d\xf3\xa9\x8e\xfa\xf8\x0d\x45\x2b\xa5\x2f\x46\xf0\xa3\x38\
+\xe3\x9d\xd3\xa2\x69\x05\x9c\xd9\x22\x80\x7e\x8f\xaf\x1f\xa0\x77\
+\x30\xc3\xea\x0d\x05\xeb\x45\xcd\x93\xa5\xda\xdc\x82\x1f\xfe\x05\
+\x26\x7c\xa6\xf2\x7b\x97\x7d\x8c\x87\xff\xcd\x3e\xb6\x5d\xf0\xa1\
+\x78\xd5\x4d\x1d\xaa\x23\x92\xda\x84\x6c\xf9\x8c\x61\x51\x82\xaf\
+\x14\x32\x9c\xf3\x00\x72\x7d\x0e\x4e\x3e\x9a\x1d\xdc\xc4\x56\xde\
+\x37\x99\x3e\x26\x27\x80\x88\xfb\xfe\x37\xbd\x63\xb9\x05\x7e\xb9\
+\xe6\x31\x51\xf5\x8d\x4a\xb4\x57\xd0\xf4\x9f\xe7\xab\x60\x78\x67\
+\x28\x6d\x06\xd2\x9b\xeb\xe7\xae\x37\xdf\xc3\x8f\x6f\x79\x92\x9b\
+\xce\xbd\x2d\x78\x8b\x57\xe1\x55\x24\xe5\x61\x9f\x7a\xc9\xd7\x61\
+\x56\xd9\xda\xd7\x0d\xe6\x1f\x7c\x00\xfc\xe0\x99\x48\x90\xbc\xb8\
+\xd2\x80\x54\x34\x6f\xb4\x91\x94\x29\x11\xe0\xec\x4b\xba\x23\xf0\
+\xa5\x54\x1c\x9f\xa8\x1b\x95\x68\xaf\xa0\x19\x2d\xe6\x08\x5e\xa8\
+\x9c\x0d\x0b\x60\xca\xba\x9e\x8d\x7c\xea\xda\x7b\x79\xe0\x5f\x7f\
+\x9b\x37\xaf\x7e\x5b\xf4\xba\x56\xbd\xa4\x89\xd0\x28\xcb\x8e\xea\
+\x06\x0b\x04\x7e\xa8\xdb\x5a\x70\x8d\x48\x74\x03\x33\x26\x80\x61\
+\xfe\x57\xae\xcb\xd3\x33\x98\xb1\x36\x67\x18\x2b\x37\x52\x0b\x36\
+\xab\xe0\xab\xe0\xf9\xff\x0c\x7d\x80\x76\x72\xe5\xda\x6b\xf8\xf2\
+\x0d\xdf\xe1\x81\x1b\xbe\xcd\xba\xee\x0d\x91\xd3\x59\x1f\x97\x94\
+\x4e\x78\xd1\x33\x86\xb4\xba\xc1\xc2\x82\x8f\xd2\xce\xa0\x5e\xde\
+\xab\x70\x8a\x82\x4c\xd1\x78\x48\x34\xc9\x9c\xc0\x64\x16\x60\x73\
+\x78\x70\xf6\x25\xcb\x2c\xf0\x47\xcb\x8d\xd8\x24\xcf\x29\xf8\x01\
+\xf0\x93\x4c\x04\xcd\x86\x5c\x75\xe6\x35\xfc\xf4\x03\xfb\xf9\xab\
+\x77\xdc\x1b\x13\xc1\x83\xea\x88\xaf\x47\x0c\x8d\x44\x5d\x58\x78\
+\xf0\x95\x02\x3c\x50\xbe\x8a\xda\x46\x76\xb9\xd5\x0d\x6c\x6e\x57\
+\xe7\xf6\x04\x70\xe2\xc4\x1b\x2e\xee\xb2\xf6\xe4\x19\xaf\x34\xe6\
+\x05\x7c\xb3\x1b\x08\x75\x33\xd7\x72\xcb\x05\x1f\xe0\x3b\x5b\x7e\
+\xce\xef\x5f\xf1\x27\xf4\xe4\x7a\x51\x0a\xfc\x9a\xa2\x32\xec\x53\
+\x1b\xf3\xe3\x3e\x77\x0e\xc0\x57\x12\x54\x43\xcf\xf4\xa9\xba\xc2\
+\xaf\x28\x64\x39\xf8\x0b\x8e\xfd\x09\x85\x3f\x16\xfc\x8d\x2b\xfc\
+\x31\x89\x77\x5c\x22\x47\x15\xfe\xa8\x22\x9b\x35\x56\xfb\x3b\xed\
+\xbb\x81\xd6\x04\xb8\x99\xbe\x70\xa5\x6f\x26\x2f\x58\xb5\x2e\x1f\
+\x81\xaf\x14\x8c\x55\xbc\xf9\x01\x1f\xec\x89\xa0\xf9\x60\x00\xd0\
+\x97\xef\xe7\x0f\xae\xfc\x13\x7e\xfe\x3b\xfb\xb9\xe5\x82\xdb\x23\
+\x4b\x54\xaf\x28\xed\x28\x4e\xd8\x8e\x62\xa7\xe0\xcb\xba\x44\x36\
+\x62\x40\xbd\x00\x34\x6f\x58\xe1\x9d\x50\xf8\xc3\x0a\x6f\x0c\xfc\
+\x31\xf0\xc6\x40\x96\xd0\xc0\x57\x14\xaa\x02\xb2\x82\xee\xf3\x1b\
+\xda\x3a\xa9\x86\xd2\xc7\x65\x7d\x8e\x07\x99\xa2\x03\xa1\xb5\x6c\
+\xb3\xb1\xa6\x8e\x6e\x25\x99\x38\xe1\xaa\xf5\x36\xf8\x95\xba\x8f\
+\x34\x16\x27\xcc\x29\xf8\x41\x7c\x34\x15\x3c\xcf\xd2\x57\xe8\x67\
+\xfb\xf5\x9f\xe5\xd1\xff\xb0\x9f\x77\x9d\xf3\x5e\xbd\xc3\x87\xa7\
+\x1f\x3b\x97\x4f\xf8\x34\x2a\x32\x15\x7c\x59\x57\xc8\xaa\xc2\x2f\
+\x2b\xbc\x31\x49\xe3\xa4\xa4\x7e\xc2\xc7\x1b\x53\xf8\xa3\x1a\x48\
+\xbf\xac\x81\x94\x0d\x15\xeb\x32\xfa\x17\xbe\xb5\x13\x33\xde\xd2\
+\x25\xb1\x1e\x41\xe7\x63\x5e\x9d\xe9\x32\xac\x40\x1b\x3f\xa0\x35\
+\x01\x8c\xbe\x63\xed\x79\x45\x6b\x1f\xbe\xf1\x8a\x37\x6f\xe0\xeb\
+\xb8\x90\x05\x66\x73\x9a\x5f\x59\xdf\xb7\x91\x1d\xef\xff\x0a\x5f\
+\xbb\xf5\xbb\xbc\x65\xfd\x35\xba\x38\x3e\xd4\x46\x25\xa5\xa3\x1e\
+\x8d\x71\x89\x37\x21\x69\x8c\x48\xea\x27\x24\xde\x98\xc2\x2b\x69\
+\x13\xae\x1a\x68\xff\x45\x09\x92\xb0\x46\x3d\x77\xd2\xb8\x19\xd6\
+\xd5\xb4\x22\x06\x1d\xe2\xd7\xba\x14\xd6\x6a\x21\x85\xb2\x09\xd0\
+\xc6\x0f\x68\x4d\x00\xa3\xff\x3f\xe3\xec\x82\xa1\x7f\x45\xb9\xaa\
+\x77\xb3\x98\x0f\xf0\xcd\x11\x80\x94\xf3\xd6\x03\xb4\x94\xb7\x6e\
+\xb8\x86\xff\xbd\xf5\x7b\xec\xb8\xe9\x2b\xac\xcd\x6f\xa0\x31\xa1\
+\x68\x8c\x2b\x4a\xc7\x3c\xca\xc3\x5e\xf4\x46\xaf\x59\xce\x64\x99\
+\xe3\xfa\xc7\xfa\x02\x10\x49\x4b\x92\x48\xaf\xcc\x03\x93\x30\x82\
+\xc8\x61\x55\x42\x81\x00\xb7\x60\x11\xa0\x65\x37\xd0\xce\x09\xdc\
+\x14\x1e\xf4\x0e\x66\xac\x1d\x38\x6b\x75\x7f\xde\xc0\x8f\xf2\x0f\
+\x46\x02\x0b\xce\x80\x40\xfe\xd5\xf9\x37\xb0\xe7\x3f\x3f\xcb\x27\
+\xde\xf3\x29\xfa\x0a\x7d\xa0\xc0\xf7\xa0\x3a\x2e\xa9\x95\x25\xd2\
+\x78\x0f\x82\xb4\xba\xa5\x54\xa4\xc9\x2a\x90\xd0\x65\x14\x60\xe8\
+\x36\x0e\xd2\x3e\x40\x10\xec\xe4\x85\xd6\x17\x80\x68\xbd\xab\x7a\
+\x3b\x0b\x10\x25\x5a\x36\x90\x8d\xc0\xaf\xd6\x7d\xfc\x10\x88\x79\
+\x00\x3f\xba\x4e\x6a\x0b\xb4\xd8\xe4\x8e\xb7\xfe\x2e\x8f\xff\xf1\
+\xb3\x7c\xe4\xba\xbb\xe8\xcb\xeb\x67\x0c\x5e\xb0\x06\xa1\x51\x8d\
+\xe7\x0f\xc0\x34\xe3\x76\xcb\x8f\xe2\x4c\x62\x28\xf3\xfa\xe8\x2a\
+\x2b\x9f\x64\x3a\xe5\xab\xa8\x97\x71\x97\x89\x38\x61\x1b\x47\x30\
+\x9d\x00\xc6\xe2\xc2\xd5\xe7\x16\x22\xf0\xa5\x52\x34\xbc\xd9\xdd\
+\x7e\x75\x32\xf0\x15\xc4\x23\x80\x79\x1c\x05\x4c\x45\xfa\x8a\xfd\
+\xfc\x97\xdf\xb8\x8b\xff\xfb\xe1\x5f\xb0\xf5\x5f\x7c\x00\x11\xd4\
+\xb3\x51\x55\x54\xc7\x25\x5e\x5d\xda\x2d\x38\x51\x87\xd4\x96\x6f\
+\xc4\x0b\x23\x9d\x6a\x93\x2e\x7c\x30\x24\x02\xeb\x6f\x75\x03\x2d\
+\x1e\x0f\xa7\x13\xc0\x35\xb6\x6d\x55\xc6\xee\xda\x0a\xaa\xf5\x78\
+\x7a\x74\x3e\xc0\x8f\xee\xa5\x16\x87\x0f\xd0\x4e\x36\x0c\x6c\xe2\
+\xd3\xbf\xfd\x79\x1e\xff\xe8\xb3\x5c\x7d\xf6\x35\x51\x99\xeb\x65\
+\x45\x75\xc2\xc7\xf7\x74\xe9\xcd\x77\xf2\xad\x7a\x43\xac\x27\xf3\
+\x9a\x10\xe0\xb4\x74\x66\xa8\x10\x7a\x07\x32\x42\x33\x60\x24\xc8\
+\xa7\x77\x03\xe9\x04\x30\xcc\xff\xea\x73\x0a\xd6\x96\xeb\xe1\xd6\
+\xac\xf3\x0d\xfe\x62\xb6\x00\x49\xd9\x38\xb0\x89\x6f\xde\xf1\x03\
+\xbe\x79\xc7\xf7\xb9\xfa\x9c\x6b\x50\xe8\x35\x8a\xb5\x92\x4f\xb5\
+\xe4\x47\xfe\x81\xd5\x25\x08\xa2\xba\x05\xb3\xba\x3a\x2e\xad\xe5\
+\xc7\x5c\x21\x4e\x21\xc0\x78\x26\xa0\x84\x4a\x3a\x82\xa9\x9f\xd3\
+\x49\x27\x80\x8a\x09\xa0\x88\xc1\xd7\x4b\xb3\xd4\xbc\x82\x1f\x85\
+\xcd\xd2\x93\xc0\xf9\x94\xb7\x9d\x7b\x2d\xdf\xfa\xd0\x0f\xf8\xcc\
+\xad\x9f\x63\xc3\xf2\x8d\xa0\xb4\xa3\x58\x19\x97\xd4\x2a\xe1\x3b\
+\x0c\x09\x34\x0d\xb0\xd3\xe6\x06\x9a\xc0\x57\xa2\x39\x5d\x70\x24\
+\x8c\x55\x62\xb4\xf8\x52\xda\xa4\x4f\x03\x2d\xf0\x15\x34\xbc\xf9\
+\x05\x5f\x0f\x03\x8d\x67\x02\x4b\x50\x6e\xbb\xe2\x83\x3c\xf9\xa7\
+\xcf\xf3\xd1\xeb\xef\xd2\x23\x06\xc0\xaf\x2b\xaa\x13\x92\x46\x4d\
+\x5a\x4f\x39\xa3\xfa\x87\x66\xdf\x20\x7d\x93\xbe\x0d\xb1\xc0\x17\
+\x98\x53\x0e\x6d\x65\x52\x02\xe8\x39\x80\xf8\x4b\x1b\x9e\x97\x78\
+\x44\x1a\xde\x7d\x8e\xc0\x0f\x6b\x37\x97\x4f\x03\xe7\x4b\x3e\x76\
+\xfd\x9f\x46\x44\xd0\x96\x55\xe9\x97\x59\x4a\xb6\xa3\x18\x4d\x25\
+\x1b\x69\xcd\xe3\x24\xae\x4d\xe0\x87\x17\x75\xb0\xde\xab\xd5\x25\
+\x51\x7f\xa1\x9f\xff\xc7\x8e\xe0\x82\x80\xaf\x88\xf6\xd3\x53\x84\
+\xf9\x2d\xcd\xbf\xbe\x62\x1f\x1f\xbb\xfe\x2e\x9e\xfa\xf8\xf3\xdc\
+\x76\xc5\xbf\x8d\xf4\x51\xaf\x2a\xaa\x25\x1f\xdf\x58\xdc\x11\x61\
+\xa0\xec\x80\x34\x62\x44\xa4\x09\x81\x0f\x87\x82\x93\x48\x26\x35\
+\xd4\x18\x37\x26\xbf\xb1\xb3\x10\xe0\xab\xa0\x0c\x28\x90\x52\x36\
+\xbd\x21\xb4\x14\x65\x5d\xff\x7a\x3e\xbd\xe5\xb3\x5c\x7d\xce\xdb\
+\xf8\x4f\xf7\xfd\x47\x5d\x37\x5f\x51\x2b\xfb\x64\xf3\x02\x37\x13\
+\xb4\x4d\x65\xf9\x87\x2d\xfc\x01\x83\x34\xa1\x4b\x10\x76\x03\x93\
+\x48\x3a\x01\x0c\x09\x95\x1f\x7e\x60\x69\xde\x5b\x7e\x60\xfe\x09\
+\x86\x80\xd2\xf7\xf1\xfd\x39\x5e\x18\x30\x0f\x72\x70\xf8\x45\x3e\
+\xf9\xdd\xff\xc6\xfd\x8f\xfe\x03\xa0\x41\x14\x0e\x64\xf3\x0e\x8e\
+\x13\x3b\x76\x20\xd2\xfd\x01\x1d\xd5\x3c\x4a\x30\xbb\x80\x69\x13\
+\x20\xfc\x7e\x2e\x44\x4e\x98\x54\xfa\x23\x4b\xf3\x0e\x7e\x22\x9d\
+\xef\xcb\x25\x4d\x80\xd1\xca\x28\xf7\x3e\xf2\x77\xdc\xf3\xbd\x4f\
+\x44\x80\x0a\x01\xd9\xbc\x20\x93\x71\x0c\xfd\x06\x7b\x1e\x24\xfd\
+\x01\xe3\xd8\x1a\x25\x84\x61\x01\xf0\x69\x53\xcd\x69\xd2\x8a\x00\
+\x7b\x40\x2f\x24\x08\x1d\xc0\x88\x7d\xf3\x0d\x3e\x21\x09\xf5\xb1\
+\x94\x4b\x97\x00\xff\xfd\x07\x9f\xe4\xde\x47\x3e\xcd\x68\x25\xde\
+\xe2\x2f\x93\x17\x64\x72\x22\x18\xfb\x0b\xdb\xdc\x8b\x04\xf8\x04\
+\x00\x87\xc4\xa0\x85\x55\x40\xe9\x3d\x33\xd2\x3e\x61\x97\x90\x49\
+\xbb\x80\x93\xaf\x34\x18\xd8\x98\xd7\xe6\x3f\xbc\xf9\x3c\x83\x1f\
+\x87\x2b\x7c\x6f\xe9\x75\x01\x5f\x79\x6c\x27\x9f\xfa\xe1\x3d\x1c\
+\x1c\x79\x29\xd2\x8b\x9b\x15\xe4\x8a\x51\x73\x8d\x24\xf6\xb1\x5a\
+\xb4\xfc\x64\x5c\x84\x09\x1a\x4d\xa1\xc1\x47\x05\x6b\x05\x27\x91\
+\x49\x09\x50\xaf\xc8\xa6\x8f\x2a\x2e\x04\xf8\xca\x53\x48\x7f\x69\
+\x75\x01\x3f\x1b\xfa\x29\x7f\xf5\xa3\xbf\xe4\x67\x43\x3f\x89\x74\
+\xe2\x64\x04\xb9\x62\xd0\xcf\x27\x5b\x77\xa4\x0a\xc3\xb4\xc7\xea\
+\x69\x8e\x0b\x0e\xc2\x63\x91\x25\x76\x02\x1d\x66\xe0\x03\x98\x85\
+\x62\x81\xc1\x97\x7a\xac\xec\x07\x2b\x5e\x96\x82\x13\x78\x68\xe4\
+\x25\xfe\xe0\x1b\x1f\xe6\x67\x43\x3f\x8d\x81\x77\x21\x5b\x74\x71\
+\x33\x71\x8b\xb7\x00\x4e\x82\x9f\x34\xed\xc4\xfa\x6a\x8a\x0b\xff\
+\x39\x80\x10\x46\x17\x62\x14\x4a\x30\x94\x56\xd6\x56\x3e\xc0\xee\
+\xf0\x70\xf4\x68\xc3\xfa\x9c\x2a\x02\x6b\x8f\xfb\xb9\x04\x5f\xfa\
+\x8a\x46\x59\x45\x6f\xeb\x00\xf8\x8b\xd8\x07\x38\x34\xf2\x12\xff\
+\xf3\xc7\xff\x83\xaf\x3e\xfe\x95\x38\x50\x40\xae\xcb\x21\x93\x73\
+\x6c\x53\x6f\xc4\x87\x13\x5c\xa9\x0f\x7d\xa2\xdf\xe6\x38\x54\xd8\
+\x03\x04\xfa\xc9\x63\xce\x0c\xe3\x8f\x19\x57\xcb\xa9\x10\xc0\x90\
+\x46\x29\x9e\xb3\x96\x0a\x5c\x57\xd0\x98\x87\x0d\x99\xbc\xba\xde\
+\x00\x8a\x44\x1a\xb9\x08\xbb\x80\xb1\xea\x18\x3b\x7e\xf1\x79\xbe\
+\xf0\x8b\xbf\x67\xac\xaa\x1d\x3c\x21\x20\x5b\x70\xc8\x16\x04\xa2\
+\x69\x19\x18\xb6\xbe\x20\x76\xf8\xda\xb5\x7c\xf3\xa6\x49\x4b\x09\
+\x90\x33\xe6\x0c\x92\xc3\x40\x3f\x1e\xd9\x99\x92\x4e\x80\x9d\x3c\
+\x8c\x9e\xa4\x62\xf4\xd5\x86\x35\x12\x88\x9e\x54\xcd\x11\xf8\xfa\
+\x15\x6e\x85\x6c\xe8\x25\x52\x56\x7a\x40\xca\xc5\xd5\x05\x7c\xf1\
+\x97\x5f\xe0\x6f\x7e\xb2\x9d\xf1\xea\x78\xd4\x4a\x33\x79\x41\xbe\
+\xe8\x20\x9c\xd8\xc9\x6b\x3f\xb7\x6f\x80\x08\xb6\xde\x8c\xfe\x42\
+\x98\x71\x34\x13\x43\x14\x0c\x0b\x20\x14\x72\x4c\xc5\x24\x68\xf1\
+\x9d\x81\xd6\x16\x40\x32\x82\x43\xbf\x57\xb3\xbf\xa2\xed\xb8\x0e\
+\x28\x7f\x6e\xc0\xf7\x15\x8d\x8a\x8a\x5e\x00\x89\xd3\x1b\x5d\xc0\
+\x22\xb1\x00\x3f\x7c\xfe\xfb\xfc\xc5\x3f\xfd\x39\x2f\x8f\xbe\x1c\
+\x85\xb9\x59\x41\xbe\xdb\xc5\x75\x85\x5d\xb7\x24\xc0\x24\xe2\x48\
+\x58\x05\xec\x74\xa6\xb4\xea\x12\x94\x02\x8a\x22\x8a\x0b\xb7\x90\
+\x01\x5a\x9a\x7f\x68\xdf\x05\xec\x21\x78\x33\xe8\xc4\x50\x9d\xe5\
+\x1b\x72\x9a\x00\x62\x6e\x5a\xbe\xf4\x15\x5e\x39\x1e\xef\xc7\x3e\
+\x86\xb2\xd2\x2c\xf4\x3c\xc0\x2f\x0e\x3d\xca\xdf\xfd\xec\x6f\xf8\
+\xc5\xa1\x47\x83\x82\xea\x8f\x43\x16\x7b\x5d\xdc\xac\x63\x58\xc7\
+\x20\xda\x6c\xa5\x49\xb3\x9f\x66\x15\x52\x8e\x92\x21\xc9\x96\xaf\
+\x00\x96\x05\xc7\x42\x87\xca\x32\x66\x17\x30\xd4\xaa\x3e\xed\x2c\
+\xc0\x9e\x70\x65\xf0\xd8\x91\x06\xfd\xeb\x03\x02\xb8\xcc\x3e\xf8\
+\x0d\x6d\xf6\x55\x22\x4f\x4b\x09\x41\xe4\x42\x59\x80\x57\xc6\x5e\
+\xe6\x2f\x7f\xfc\x49\xfe\xe9\x85\x1f\x06\xe5\x01\x1c\x28\xf4\xb8\
+\xe4\x8a\x4e\xa2\xc5\x13\x4f\xd3\x62\xd4\x22\x74\xf8\x68\x6e\xc1\
+\xf6\x71\x8b\x96\xaf\x9a\xd3\x85\xf7\xd4\xe6\x5f\x45\xd3\x0a\x09\
+\x07\x70\x77\xab\x7a\xb5\x26\x80\x60\x4f\x78\x38\x76\x44\x7f\xb2\
+\x55\x49\x19\x8d\x5f\xa3\x9b\xcf\x10\x7c\xbf\x91\x70\xf6\x12\x4a\
+\x88\x8c\x40\x64\x01\xe6\xd7\x07\x18\xaf\x8d\xf3\xa9\x47\xee\xe1\
+\xa1\xa7\x8d\xcf\xfa\x0a\xc8\x77\x3b\xe4\xba\x1c\x84\xb0\xc7\xf3\
+\xd3\x6d\xf9\x41\xb6\xa9\x0e\x5f\x6a\x57\x62\xea\x4a\x01\xdd\x80\
+\x31\xd0\x90\x25\x2b\xf3\x3d\xb4\x90\xd6\x04\xa8\xb0\x9b\x6e\x7d\
+\x38\xfc\x62\x1d\x25\x65\x04\x84\x9b\x11\x78\x8d\xd0\x34\xcf\x12\
+\xf8\xa1\x12\x8c\x3c\x23\xe5\x19\x7f\xf3\x35\x0a\x18\xaf\x8d\xb3\
+\x73\xef\x7d\xec\x7c\xe2\x3e\x26\x6a\xe3\x51\x11\x73\x45\x41\xbe\
+\xc7\xb5\x1e\xd8\x24\x01\xe9\xc4\xe1\x8b\x23\xe2\xdf\x8e\xe6\x00\
+\xcc\x70\x83\x18\xa2\x1b\x94\x31\xda\x90\x13\xc6\x3d\xaa\xd3\x21\
+\xc0\xd7\x79\x91\xdb\x19\xc2\x61\x53\x75\xcc\xa7\x3c\xea\x53\xe8\
+\x71\x63\x02\xcc\x70\x13\xc6\x26\xf0\x13\xe9\x94\x15\x16\xe7\x31\
+\x1f\xf3\x00\xdf\x7c\xf6\x21\x3e\xf7\xab\x7b\x79\x65\xfc\x70\x54\
+\xb6\x4c\x5e\x50\xec\x73\xa3\x4f\xc3\x5b\x75\xc3\xac\x86\x41\x5e\
+\x52\xe2\x8c\x40\x91\x12\xa7\xc0\x9e\xde\x4d\xc6\x91\x24\x88\x82\
+\x5e\xc0\x8d\xc1\xf7\x4b\x0a\xc2\x69\x60\xc9\x10\x5f\xe7\xc5\x56\
+\x75\x6d\x3f\x0f\xa0\x27\x84\xb6\x01\x9c\x3c\x58\x67\xf5\x1b\x8a\
+\x28\xa5\x70\x5c\x31\xb3\x3e\xdf\x53\xf8\xb5\xf8\xd5\xa6\x54\x25\
+\x34\x97\x45\xd7\x67\x0e\x67\x02\x1f\x3b\xfc\x2b\xfe\xfc\xc7\xff\
+\x95\x57\x43\xe0\xd1\x3e\x4f\xb1\x3f\x43\xb6\xa0\x87\x74\x56\xdd\
+\xc2\xa2\xb5\x00\x2a\x8a\x33\x5a\xb7\x29\x2d\x2d\x86\x95\x77\x4a\
+\xcb\x8f\xae\xd1\x17\x8a\xde\x38\x4e\x01\x72\xd4\x62\xc8\xee\x76\
+\x75\x9e\x6c\x22\x68\x37\x01\x01\x8e\x3d\x57\xe3\x8c\x0b\x0a\x28\
+\x09\x6e\xb8\xdc\x78\x1a\xe0\x2b\x5f\x4f\xed\xc6\xe6\xcb\x48\x67\
+\xd4\x52\x28\x61\xa5\x0f\xf3\x98\x0b\x0b\xf0\xcf\xaf\x3e\xc6\x17\
+\xf6\x7c\x9e\x7f\x3e\xfc\x58\x14\x26\x04\x14\xfa\x5c\x0a\xdd\xae\
+\x5d\xc6\xb8\x88\xf1\x6f\xda\x73\x79\xcc\x96\xda\x6c\xd3\x27\xb5\
+\x18\x06\x69\x2c\xa2\x99\x84\x0a\xf4\x22\xfa\x62\xf0\x01\x94\x4d\
+\x80\x5d\xb4\x91\xf6\x04\xa8\xb3\x8b\xa2\x3e\x3c\x7e\xa0\x4e\xa3\
+\x22\x71\x73\x1a\x18\xd7\x15\xc6\x8e\xe0\x74\x06\x7e\x30\xc9\x43\
+\x62\xa8\x17\x83\x2f\x02\xf0\x13\xad\xca\x38\x9f\x4d\x1f\xe0\xd5\
+\x89\xc3\xec\x78\xfc\xef\xf9\xce\x81\x6f\x47\xe5\x06\x28\xf6\xbb\
+\xe4\xbb\xf5\x44\x4e\x6a\xdd\x30\xca\x4f\xa2\x95\xa6\x35\x55\xeb\
+\xbc\x75\xeb\xb6\xf2\x34\x89\x61\xe8\x33\x09\x7e\x68\xfe\xa3\x3c\
+\x3d\x85\x1c\x36\x32\x6c\xcc\xc4\x02\x3c\xc8\x28\xb7\xb3\x27\x5c\
+\x22\x76\xfc\x40\x9d\x55\xaf\xcf\x6b\x2b\x10\xf9\x01\x34\x2b\xa8\
+\x0d\xf8\xc9\x71\xbe\x0a\x81\x37\x34\x91\x54\x90\x69\x02\x66\x63\
+\x1e\x60\xa2\x3e\xc1\x17\xf7\x7e\x81\xaf\x3d\xfd\x55\x2b\x3c\xdf\
+\xed\x50\xec\x73\x71\x32\xf6\x07\x28\x4c\xf3\x1d\xb7\xce\xf0\xbc\
+\x19\xe0\xb8\x39\x26\x5a\xb7\x09\x68\xd2\xec\x93\xa8\x77\x27\xe0\
+\x2b\x10\x03\x76\x59\xfc\x61\x23\x43\x9f\x5d\x93\x7d\x5f\x70\xd2\
+\x67\x01\x28\xb6\x83\xfe\x2e\xcd\xf1\x03\x35\x56\x9e\x9f\xd7\x7e\
+\x40\xc6\xf0\x82\x27\x01\x1f\xa5\x97\x41\xc7\x63\xe0\x58\x44\xe2\
+\x3c\x8d\x50\xe6\xaf\x3f\x43\x1f\xe0\x7f\xed\xfb\x22\x5f\x7b\xe6\
+\xab\x94\xea\xa5\x28\x2c\x53\x10\x74\xf5\xbb\x64\x0b\x4e\xba\x53\
+\x67\x96\x2d\x19\x67\x14\xbe\xa5\x53\x17\x86\x25\x17\x73\x18\x89\
+\x92\xd6\xb0\x13\xf0\xc9\x02\x7d\xc2\xba\x9f\x3c\x6e\xde\xb1\xbd\
+\xf9\x87\x4e\x08\x60\x74\x03\x27\x5e\xa8\x53\x1d\xf7\xc9\x2d\xd3\
+\x0b\x16\x1d\x57\xe0\xf9\x31\xaa\xad\xc0\x97\x9e\x42\x1a\x6f\xae\
+\x62\x55\xca\x38\x36\xcc\x9f\x1e\x13\x87\xf9\xc4\xc7\xd3\xb5\x00\
+\xdf\x1f\xfa\x1e\xff\xb0\xef\x4b\x1c\x29\x1d\x89\xc2\x9c\x0c\x2c\
+\x5b\x91\x21\xd7\xe5\xd8\xad\x3a\x49\x42\x8c\xb8\xe8\xd7\x52\xb4\
+\x9d\x2e\x09\x7e\xbb\x96\x3f\x4d\xf0\x55\xd0\xfa\xcd\xb2\xa8\x9a\
+\x42\x9d\x34\x0a\x54\x9f\x0d\x02\x3c\xc8\x28\xb7\xb1\x2b\xdc\x2b\
+\xf8\xc8\x53\x55\xd6\x5d\xde\x65\x74\x03\xc9\x4a\x84\xca\x08\x0a\
+\x2c\x15\x5e\xb8\x34\x49\x85\xce\x9d\x5d\x51\xdb\x4c\xaa\xf8\x21\
+\x90\x11\x1f\x5e\x33\xd5\x99\xc0\x27\x8e\x3d\xc1\x67\x1f\xff\x0c\
+\x2f\x8c\x1c\x20\xec\x6a\x84\x03\x5d\x03\x2e\x85\x3e\xb7\x89\x88\
+\x56\x1f\xdc\x34\x1c\x8b\x0b\x65\x95\x91\x44\x3a\x8c\xba\x19\xe9\
+\x92\xfe\xcc\x4c\xc0\xc7\x05\x56\xd9\xf7\xf3\x63\x6e\x83\xcf\x8e\
+\x4e\x3e\x2f\x3b\x39\x01\x00\x24\xdb\x43\x02\x1c\xdd\x5f\xe3\xcc\
+\x37\x75\xa1\x94\x42\xb8\xc1\xf2\x80\x56\xe0\x2b\xbd\x0b\xa7\xe5\
+\xd1\x87\x05\x0e\xd6\x15\x58\xca\x4a\x9b\x03\xb0\xa3\x3a\x9e\x09\
+\x7c\x61\xe4\x05\x3e\xb7\xf7\x5e\xf6\x1e\xdf\x6b\xb1\xa9\xb8\xdc\
+\xa5\x6b\x20\x13\xbd\x41\x6b\xde\x2f\xb6\x00\x31\x72\x26\x11\x9b\
+\x66\xea\x0c\x0b\xa5\x4f\x13\xad\x9b\x44\x9e\xb3\x05\x3e\x20\x56\
+\x12\xbd\xfc\x19\x66\x29\x5f\x31\x6e\x2c\x3b\xfb\x9c\x5c\x67\x04\
+\xd8\xc9\xc3\xe1\xa4\x50\x6d\x42\x72\xf4\x99\x2a\x2b\xce\xcb\xa3\
+\xa4\xc2\xc9\x0a\xa4\x35\x8f\x1f\x17\x58\x7a\xfa\xc9\x5e\x53\x0b\
+\xb0\x34\x13\x3e\xf6\x35\x94\x97\x6c\x71\x01\x03\x14\x93\x8f\x02\
+\x8e\x96\x8f\xf0\xc0\xfe\x9d\xfc\xe8\xa5\x1f\x5a\xe1\xb9\x6e\x87\
+\xee\x95\x59\x3d\x91\x63\x30\xcb\x6a\xdd\x46\x39\xc2\x30\xb3\xa5\
+\x4f\xfb\x91\xee\x2c\x83\x8f\x03\xac\xb2\x75\x24\x8f\xaa\x78\x63\
+\x28\xc9\x10\x3b\x79\xb8\xa5\x92\x0c\xe9\x8c\x00\xfa\x4e\x77\x13\
+\x38\x83\x87\x7e\x55\x61\xf0\x9c\xf0\xe1\x90\x88\xb4\x64\xad\xe1\
+\x53\xfa\x99\x7e\x52\x09\x51\xa9\x2d\xa0\x8d\x56\x15\x5e\x12\xd5\
+\x4c\x67\x68\x8d\x28\x4c\x04\x02\x29\x35\x26\x78\xe8\x85\x87\xf8\
+\xf2\x33\x3b\xa3\x7b\x28\xf4\x6a\x9c\x65\x2b\x32\x64\x8b\x4e\x94\
+\xde\xb4\x2e\xe6\xbd\x3a\x9e\xa9\x33\xaa\x01\xd8\xab\x77\xcd\xbc\
+\xe7\x02\x7c\x05\xac\x54\xf6\xd0\x0f\xf0\x0f\x5a\x65\xbf\xbb\x49\
+\x41\x2d\xa4\x73\x02\xdc\xc7\x17\xb9\x5d\x7f\x2e\xae\x3e\x21\x39\
+\xf6\x7c\x8d\xc1\xb3\xf2\xda\x19\x71\x04\xd2\x4f\xbc\x33\xe8\x25\
+\x2a\x1a\x17\xce\x6e\x55\xa1\x49\x35\x49\xa1\x12\xe6\xd6\xac\x69\
+\x8a\x3c\x74\xe0\x1f\x79\xe0\x99\x9d\x94\x1a\xb1\x67\xef\x64\x05\
+\x3d\x2b\x32\x14\xfb\xdc\x26\x30\xcc\xac\xec\xf6\x6e\xcb\x94\x5a\
+\xbe\x05\x9e\x7d\xbf\xd9\x04\x5f\x65\x15\xe2\x0c\xbb\xfc\xfe\x51\
+\x45\xf4\xc5\x40\xc9\x10\xf7\xf1\xc5\x74\x4d\x35\x4b\xe7\x04\xd0\
+\x99\x6f\xc7\xd1\xec\x7a\xe5\x57\x55\x06\x36\xe9\x39\x01\xc7\xd5\
+\x9f\x6e\x33\x2b\xe7\x7b\x91\xaa\x9a\xb2\xb1\x14\x84\x51\xf9\x50\
+\x04\xf6\x26\x8c\x60\x29\x3f\x94\x1f\x1d\xfc\x21\x0f\xec\xdf\xc9\
+\xd1\xf2\xd1\x38\xa9\x03\x5d\x83\x19\xba\x57\x66\xac\xbc\x53\x3d\
+\x7a\x65\x87\x58\x23\x8f\x28\xc6\x2e\x87\x95\xe7\x7c\x83\xaf\x14\
+\x62\x3d\xd6\xbc\xbf\x02\xd4\x34\x5b\x3f\x4c\x95\x00\x0d\xb6\xe3\
+\xb0\x0d\x87\x4d\xf5\x92\xe4\xc4\x73\x35\x96\x9f\x9d\x43\xa1\x34\
+\x09\x82\x3e\x48\x7a\x61\xc9\x4c\x04\x13\x4a\x48\x10\xc3\x52\x7e\
+\x62\x07\xce\xe8\x2f\x90\x7d\xc7\xf7\xf2\xc0\xfe\x9d\xec\x3b\xbe\
+\xcf\xca\xa3\x6b\xd0\xa5\x7b\x65\x06\x11\xae\xc8\x89\x6e\x1d\xa3\
+\x1a\xe5\x89\x6d\x65\xd2\xc8\x96\xea\xf0\x99\x0b\x38\xe7\x19\x7c\
+\xba\x81\x7e\x1b\x7c\xf9\xca\xf4\x5b\x3f\x4c\xf5\xd3\xb1\x4f\x51\
+\xe3\x62\x46\xc2\xed\x47\x27\x8e\x78\x0c\x9e\x9b\xc3\x11\x02\x84\
+\xd0\x9b\x47\x4a\xdd\xf7\x93\xa8\xa8\x59\xa1\xa6\xbe\xd6\x8c\x33\
+\x95\x1e\xfc\xd6\xc6\x25\xb5\x71\x3d\x64\xd8\x77\x7c\x1f\x0f\x1d\
+\x78\xc8\x6a\xf5\x85\x5e\x87\x81\x4d\x39\x0a\xfd\xae\x7e\x3e\x0f\
+\x4d\x60\x84\x12\x39\xff\x09\x12\x46\xd7\x47\xe7\x41\x39\x0c\xf2\
+\x2d\x28\xf8\x0e\x88\xf3\x80\x8c\x88\xdb\x84\xa7\x50\x4f\x1b\x85\
+\x96\xdc\xc9\xde\xf4\xb5\x7f\xad\x64\xea\xdf\x0e\xde\xcb\xe3\x5c\
+\xcc\x8d\x08\x56\xab\x60\xd7\xcc\x9e\xd5\xd9\x68\x96\xcf\x6f\x10\
+\xad\x47\x33\xdb\x78\x74\xac\x94\xb5\xb0\xd4\x6e\x79\x2a\x71\xae\
+\xe3\x4d\x02\x98\xfd\x7c\xa6\x28\x58\xbe\x21\x47\xf7\xaa\xb8\xd5\
+\x9b\xe9\xc2\x80\xa6\x3d\x79\x48\x01\xdf\xfa\x4d\x00\xcc\x02\x83\
+\xaf\x40\x6c\x04\x7a\x0d\xf0\x95\x42\xbe\xa8\x60\x2c\xb8\x56\xb2\
+\x87\xfb\xb8\x83\x29\xca\xf4\xbe\x1d\xec\xc7\xdf\x10\x3a\xfe\x6c\
+\x9d\xf1\x60\xc5\x90\x7e\x5c\x1a\x95\xdd\xa8\x44\x54\x6a\x1d\x64\
+\x1b\x80\x20\xac\xd9\x62\xe8\x07\xb0\xc6\x42\xc7\x60\x04\xe0\xe4\
+\x04\xfd\x1b\xb2\xac\x7a\x5d\x81\x5c\xb7\x63\x03\x65\xdd\x38\xe5\
+\xd5\x6a\x5a\xb4\xfc\x28\xfd\xe2\x03\x9f\x41\x60\x85\x0d\xbe\x1a\
+\x53\x10\x3f\xb5\xb6\x30\x99\x8a\x4c\x8f\x00\x3b\x79\x18\x3f\x9e\
+\x68\x38\xf4\x68\x19\xaf\x16\xae\x44\x35\x18\x60\x00\x19\x1e\x34\
+\x11\x03\x52\x36\x81\x0e\x97\x53\x8b\x00\xf8\x20\xb9\x0b\x3d\x6b\
+\xb2\xac\x7a\x5d\x9e\xae\x81\x0c\xd1\xe2\xd4\x38\xcb\xe0\x20\xa5\
+\x75\xa7\xb5\xfc\x84\xd2\x17\x25\xf8\x45\x60\x83\xa1\x4e\xa5\xc0\
+\x57\xa8\xe7\x0c\x75\x79\x6c\xef\x74\xdc\x9f\x94\xe9\x11\x00\xa0\
+\xce\x9d\x48\xfd\xb2\x41\xa3\xac\x38\xfa\x54\x35\xfe\xc4\x7b\x30\
+\x35\x10\x4a\xda\x50\x4f\x25\xe2\xf4\xd4\x5c\xb0\xab\x81\xa9\x20\
+\xf4\x71\xd7\x80\xcb\x9a\x8b\x8a\xf4\xae\xc9\x46\x0b\x52\x2c\xce\
+\x10\xde\x33\x4e\xa3\xcc\x5f\xf3\x5e\x29\x4a\x5f\x8c\xe0\x2b\x17\
+\x38\x8b\x68\xcc\xaf\x82\x8b\xe5\x41\x6c\xc7\xaf\x31\x35\xcf\xdf\
+\x94\xa9\xfb\x00\xa1\x3c\x45\x8d\x8b\xd8\x8f\xc3\xad\x00\x95\x93\
+\x3e\xf9\x1e\x87\x6c\x97\xd3\xac\x04\xac\x46\x69\x59\x01\x11\xbf\
+\xd0\x6e\x5f\x23\xe2\x74\xf9\x5e\x97\x42\x7f\x26\x78\xd1\x22\x26\
+\x86\x50\x89\xfe\x3d\x69\xda\xc1\x06\x2a\x3a\xc6\xba\xdf\xa2\x04\
+\x5f\x81\x38\x1f\xe8\xb6\xc1\x57\xc3\xd8\x8b\xbc\x3d\x6e\xe4\xcb\
+\x3c\x93\x06\x51\x27\x32\x7d\x02\x00\xec\xe5\x19\x2e\xa4\x1f\x87\
+\x2b\x01\x4a\xc7\x3c\x7a\xd7\x04\x40\x19\x2d\xd8\x04\xdc\xac\xac\
+\x19\x67\x5d\x83\xa1\x3c\x12\x69\x4c\x96\x08\x43\xc1\xc9\x96\x0f\
+\x4d\x24\x5c\x52\xe0\x9f\x05\x2c\x4f\x80\x5f\x05\xf5\x94\xa1\x2c\
+\x6d\xfa\xef\x6d\x05\x4f\x27\x32\x33\x02\x00\xbc\x9e\x9f\xe3\x72\
+\x7d\x38\x2a\xa8\x0c\xfb\xf4\x9c\x91\x89\x3a\x97\x50\x09\x61\xa1\
+\x05\xa6\x89\x0f\xae\x31\x95\x6f\x92\xc6\x4c\xa7\x8c\x58\x65\xa4\
+\x23\x56\x6a\x9a\xd2\x97\x2c\xf8\x2b\x12\xe0\x7b\xa0\x9e\xc6\x34\
+\xfd\x7b\xb8\x8f\xf7\x77\x06\x52\x6b\x99\xbe\x0f\x10\xca\x83\x8c\
+\x52\x67\x5b\xe8\x0f\xd4\xc6\x25\x47\x9e\xaa\xea\x38\x15\x9a\xe9\
+\xf0\x4d\xc5\xe6\x47\xc1\x76\xd7\x10\x80\x6f\x00\x02\xf1\x1b\xb0\
+\xed\x46\x0f\xa7\x32\xf8\x00\xea\x79\x20\x1c\x01\x4b\x46\x28\x4f\
+\xfe\x45\xb0\x4e\x64\xe6\x16\x00\xe0\x49\x8e\x98\xfe\x40\xa3\xac\
+\x97\x7f\x2d\x5b\xa1\x77\x2c\x48\x7a\xfb\x46\xdd\x8d\x83\x18\xc8\
+\xe4\xbe\x06\x49\x87\x2f\x09\xc6\xa9\x0e\xbe\x7c\x0e\x38\x61\x28\
+\xc0\xe3\x7a\x1e\x9c\xda\x84\x4f\x2b\x99\x1d\x02\x80\xf6\x07\x2e\
+\x62\x28\x9c\x25\xac\x4f\x48\xbc\xaa\xa4\x6b\x45\x38\x27\x1f\x30\
+\x39\x5c\x49\x66\x28\xc8\x62\x05\x86\x82\x08\x5a\x3e\x44\xf1\x49\
+\x85\xbf\x26\xc0\x3f\x66\xe8\xd9\x67\x1b\xf7\x63\xbc\xa6\x34\x33\
+\x99\x3d\x02\x80\x9e\x25\xbc\x88\x4d\xe1\x22\xd2\xfa\x84\x24\x53\
+\x10\x7a\x09\x99\xa1\x20\xab\x39\x87\xde\x7e\x70\xaa\x20\x5e\x23\
+\xaa\x94\x0d\xd4\xa9\x08\xbe\x0b\xe2\x6c\x60\x30\x05\xfc\x23\xc0\
+\x21\x43\x57\x1e\xdb\xb9\x9f\x7b\x3a\xc6\xa3\x03\x99\x5d\x02\x00\
+\xec\xe5\x1b\x26\x09\xca\xc7\x7d\xbc\xaa\xa2\x6b\x30\x63\x01\x1f\
+\x8d\xd9\x8d\xc6\x9f\x54\xd0\xa9\x0e\x3e\xb9\x60\xa8\xd7\x9b\x02\
+\xfe\xaf\x81\x83\x86\x5e\x7d\x76\x70\xff\xd4\xa7\x7a\x27\x93\xd9\
+\x27\x00\x34\x91\xa0\x5e\x92\x78\x35\x9b\x04\x49\x6f\xff\x35\x07\
+\x7e\x3f\x70\x3e\x90\x6f\x61\xf6\x93\xeb\xfb\xee\xe3\x77\xa6\x81\
+\xc4\xa4\x32\x37\x04\x80\x74\x12\x54\x15\x85\x7e\xb7\x69\x88\xf8\
+\x9a\x02\xdf\x01\xd6\x81\xd8\x20\xc0\x49\x19\xea\x1d\x20\xd9\xe7\
+\xcf\x19\xf8\x30\x97\x04\x80\x54\x12\x94\x4f\xfa\x14\xfb\x1d\x44\
+\xc6\xf0\xf5\x0d\xc5\x9e\xd2\xe0\x77\xeb\xfe\x5e\x2c\xb7\x1f\xec\
+\x80\xd2\x1f\x83\x7c\x1a\xac\x9d\x7c\xe6\x18\x7c\x98\x6b\x02\x80\
+\x26\xc1\x1b\x18\xc1\xe5\x7a\xd0\x1f\x49\x9c\x38\xea\x91\xef\x71\
+\xc8\x14\x1c\xfd\xdc\xc0\x81\x48\xab\xa7\x22\xf8\x8e\x42\x9c\x09\
+\x62\xa3\x80\x6c\x0a\xf8\xa3\xa0\xf6\x11\x4f\xf2\x80\xf6\xf6\xef\
+\xe3\xcf\x66\x03\x82\x76\x32\xf7\x04\x00\xd8\xc7\xff\xe3\x42\xf6\
+\x00\xd7\x23\x28\xa0\xa0\x74\x4c\x2f\x1f\x2a\xf4\xb9\x44\x6b\xf0\
+\x9d\x60\xd2\x27\x04\xea\x14\x00\x9f\x95\x0a\x71\x2e\xd0\x93\x58\
+\xc6\x15\x5c\x2c\x0f\x02\x07\xe2\x72\x22\x19\xc1\xe7\x56\xee\xe7\
+\xcb\xb3\xa2\xfb\x49\xa4\x83\xbd\x24\x67\x51\x6e\xe1\x52\x72\xec\
+\x30\xb7\xa3\xcf\x76\x09\x06\xce\xcb\x91\xed\x72\x10\x84\xad\x43\
+\x45\xdf\xc5\x0d\x77\x09\x5f\x72\xe0\x0f\x80\x58\x03\xe4\x62\x6c\
+\x4d\xf0\x55\x29\x78\xa4\x5b\x36\xf4\x23\xd9\x43\x9d\x6d\xad\x76\
+\xf4\x9a\x0b\x99\x1f\x0b\x10\xca\x93\x1c\xe1\x75\x3c\x80\xc3\xea\
+\x90\x04\xb2\x01\xa5\x23\x3e\x20\xc8\x76\x3b\x7a\x65\x8f\xd0\xcf\
+\xfe\x45\x06\xfd\xc0\xc7\x5f\x22\xe0\x3b\xc0\xf2\xa0\x9f\x1f\x04\
+\xdc\x14\xf0\x3d\x85\x7a\x59\xa1\x9e\x05\x1a\x86\x6e\x7c\x76\x50\
+\xe7\x56\x1e\x6c\xbd\x99\xc3\x5c\xc8\xfc\x5a\x00\x53\xb6\xf2\x3e\
+\x1c\x76\xe0\xc4\x5f\x27\x71\xf3\x82\xfe\xb3\xb2\x14\x06\x6c\x5e\
+\x2a\x15\x7c\x60\xb9\xae\x15\xb8\xe8\xc0\xcf\xea\x37\x75\xd4\x00\
+\x08\xd7\xd8\xdf\x3f\xce\x12\x05\xc8\x13\x0a\xf5\x6b\x65\xf7\xf5\
+\x92\x11\xe4\xec\xce\xee\x4d\x45\x16\x8e\x00\xa0\x3f\x51\x9f\x63\
+\x47\xf8\xda\x59\x28\xb9\x5e\x87\xde\xf5\x19\xf2\x7d\x7a\x4b\x1a\
+\x73\xff\x7b\x25\x35\x11\x64\xf0\x09\x75\x58\x20\xf0\xb3\x40\x2f\
+\x88\xe5\x40\xd1\x7c\x49\xa3\x19\x7c\x39\xaa\x90\x07\x55\xbc\x7e\
+\x2f\x14\x9f\x5d\xd4\xd9\xd6\xc9\x3b\x7c\x73\x25\x0b\x4b\x80\x50\
+\xb4\x35\xd8\x6e\x7e\xaf\x10\x34\x11\x7a\xd6\x67\xc8\xf5\xc5\x0f\
+\x2d\xad\x56\x15\x90\x41\xd5\x94\xfe\x42\x77\xf8\x06\xf2\x5c\x80\
+\xef\x00\x5d\x20\x96\x01\xcb\x94\xb1\x29\x23\x2d\xc1\x97\xa3\x4a\
+\xbf\xb1\x93\x04\x5e\x32\x84\xcf\xb6\xe9\x2e\xe3\x9a\x4d\x59\x1c\
+\x04\x08\x65\x2b\x1f\xc7\xe1\x4e\xb3\x5b\x00\xfd\x09\xd4\xee\x75\
+\x19\xf2\x83\x8e\x5e\x0e\x06\xd1\xbe\xa9\xca\xb8\x4e\xf9\x01\x11\
+\xea\x20\xeb\x0a\x24\xc8\x2a\x53\x07\x3f\x4f\x04\x38\x12\x7c\xf1\
+\xad\x00\x00\x03\x3e\x49\x44\x41\x54\x59\xa0\x00\xa2\xd0\xda\xb4\
+\x9b\x25\x09\x77\xe8\xf0\x5f\x56\xb6\x83\x07\xa1\xb9\xdf\xce\xfd\
+\x73\x3f\xbc\xeb\x54\xa6\x43\x80\xa9\xa4\x51\x93\x5f\x92\x90\x9b\
+\xe9\x23\xcb\x9d\x69\x44\x10\x2e\xe4\x07\x5d\xf2\x2b\x1c\x0a\xcb\
+\x9d\xa6\xcc\x23\x80\x13\x40\x41\x4c\x08\x15\x5c\xa4\x8c\x0b\xa2\
+\xeb\xba\x6c\x70\xcd\x45\xac\x93\x81\x2f\x27\x14\xf2\xb0\x42\x9e\
+\x20\x7e\x49\x33\xba\x79\x00\x7c\x83\xed\x0b\x69\xee\xd3\xa4\x13\
+\x30\xa7\x7b\x8d\xa0\x59\x15\x9d\x4b\x1b\x22\x80\x1e\x21\xe4\x07\
+\x1d\xf2\x03\x0e\xd9\x7e\xa7\xf5\x32\x34\xe2\x96\x6e\xc6\x05\xae\
+\x85\xb1\xbd\xba\x9a\x12\xf8\x52\xe9\x96\x2e\x47\x15\xf2\x84\x8a\
+\xb7\x65\x33\x45\x32\x84\x64\xc7\x62\x04\x3e\x94\x76\xe0\x26\xe3\
+\x44\x22\x2c\x2d\x3e\xed\xb7\x93\xf8\x76\x71\xdd\x5c\xc3\xef\x71\
+\x06\xef\xa2\xc8\x1b\x5b\x15\x36\xdb\x2b\xc8\xf6\x39\xb8\xdd\x82\
+\xcc\x32\x81\x93\x0b\xfa\xe8\x59\x02\x5f\x36\x14\xb2\x04\xfe\xa8\
+\xde\x85\x5b\x25\xfb\x75\x53\x3c\x1e\xe1\x65\x7e\xcc\xc3\x7c\x1f\
+\xd8\x4f\xbc\x96\x47\xb5\xf8\x9d\x2c\x6e\x2a\xf1\x66\x35\x5b\xc5\
+\x47\xd2\x8a\x00\x49\x70\x1c\xe3\xd8\x24\xc2\x4c\xce\x27\x8b\xa3\
+\xe9\xbe\x67\xf1\x66\x2e\x60\x2b\x7d\x5c\x41\x96\xb5\x2d\xca\x1e\
+\xa5\xc8\xf4\x08\x9c\xa2\xc0\xc9\x82\xc8\x82\xdb\x25\x62\xf0\x01\
+\x0a\xfa\x52\x55\x47\x77\x0f\xc1\x5d\xfd\x4a\xe0\x5c\x36\x14\xb2\
+\xac\xf4\xae\x9b\x93\x7d\xaa\x50\x32\xc4\x28\xdf\xe5\x31\x7e\xca\
+\xcb\xfc\x1a\xbd\x76\x37\xf2\x07\x83\x5f\x95\xf8\x4b\x0b\x6b\x15\
+\x37\x9d\xf3\xe4\xb7\x56\x9b\x48\x30\x19\x01\xc2\x2f\xcf\x24\x7f\
+\x4d\x52\x24\xc3\xd2\xe2\x5a\x5d\xd3\xee\xb7\xd5\xf5\xfa\xf8\x5c\
+\xae\xe4\x4c\x2e\x66\x15\x6f\xa4\xc8\x9b\x5a\xd4\x63\x6e\xc5\xe3\
+\x11\x8e\xf1\x4b\xf6\xf1\x24\x87\x39\x06\xbc\x42\x0c\x80\x4c\xfc\
+\xb6\x0a\x6f\xf5\x9b\x0c\xa3\xcd\x35\xb4\x49\x67\x5e\xd3\x11\x01\
+\xcc\x16\xe9\x24\xfe\xdc\x44\x78\x12\x20\x27\x11\x67\x5e\x9f\x4c\
+\x9b\xf6\xd7\xc9\x35\x69\xf7\x5b\xc6\x05\x5c\xc0\x3a\xce\xa1\x87\
+\x35\x14\x38\x8b\x0c\xeb\x52\xea\x36\x7d\xd1\x2f\x60\x3c\xc3\x18\
+\x2f\xf3\x12\x43\xec\xe3\x45\xb4\x8f\x53\x42\x2b\xd8\x54\x76\xbb\
+\x3f\x15\xa4\xeb\xf4\x9a\xf0\x38\x2d\xef\x24\xc8\xed\xf2\x4f\xed\
+\x3a\xda\x11\x20\x09\x8c\xcb\xe4\xa0\xb8\xd8\x40\xba\x89\x3c\x5a\
+\x1d\x77\x7a\x5d\xb2\x4c\xc9\xfb\x0a\x2b\xbf\xf3\xd8\x44\x2f\x0e\
+\x03\xac\xc6\xa5\x46\x91\xe5\xe4\x58\x89\x83\x8f\xc0\x47\x20\xd1\
+\xa3\x3b\x81\xc2\x41\xe1\xd2\xe0\x55\xca\x9c\x40\x52\xe0\x10\xcf\
+\xe1\xd3\xc5\xd3\x1c\x44\x0f\x08\x7d\x20\x7c\xf9\x5d\x26\x80\x49\
+\x2a\xdd\xef\xf0\xb8\xd3\xeb\x4c\x60\x5b\x11\x22\x79\xff\x64\x99\
+\x20\x41\x80\xa9\xed\x0f\xb0\x74\x44\x2b\xe7\x39\x86\xd0\xa4\x38\
+\x48\x7a\xf7\x92\x4c\x93\x34\xa1\x3e\x7a\x1a\x27\x83\xdd\x8a\x4e\
+\x19\x69\x47\x80\xa4\x42\x5a\x85\x9b\x26\x39\x3c\xf7\x99\xdf\x2e\
+\x60\x2a\x7e\x85\x79\x9c\x56\xdf\xc9\xfa\xd2\x34\xb3\xbb\x58\xbb\
+\x80\xa4\x53\xd8\x24\x69\x04\x30\x1d\xe5\xa4\x03\x11\xc6\x2d\xbc\
+\x13\xd8\xba\x0c\xc9\xb4\xa4\x1c\x4f\x66\x01\xc0\x6e\xf1\x49\x65\
+\xb6\x72\xc0\xda\x91\x67\x21\x9d\xc0\xd4\xfe\x1f\x26\xef\x02\x24\
+\xb6\xa2\xc2\xf3\x85\x19\x06\x4e\xed\x3e\x74\x10\x96\x94\x34\x65\
+\xb5\x0b\x9b\xca\x70\x2c\x19\x9e\x76\xed\x54\xf3\xed\xe4\xbe\x6d\
+\xbb\xad\x56\x8a\x48\x8b\x4b\x2a\x2e\x2d\x3e\xed\xb7\x93\xf8\xe9\
+\xc6\x4d\x96\x26\xed\xbc\x5d\x9d\xc1\x56\x58\x52\x79\x69\x71\xad\
+\xae\x49\x8b\x9f\x6e\xdc\x54\xe2\xc3\xe3\x76\xf1\x91\x4c\xa6\x8c\
+\x99\x5c\xd3\x0e\x84\xb9\xce\x67\xb2\x6b\xdb\x59\x80\xa9\x84\x77\
+\x72\x6d\x5a\xda\x4e\xf2\x9b\xab\x7c\x4e\xcb\x69\x39\x2d\xa7\x25\
+\x90\xff\x0f\xef\x1c\x86\x3c\x32\xce\x0d\x59\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x2d\x91\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x89\x00\x00\x0b\x89\
+\x01\x37\xc9\xcb\xad\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9c\xed\
+\x7d\x7b\x74\x1c\xd7\x79\xdf\xef\xce\x63\x1f\x58\x3c\x16\x24\x41\
+\x82\x0f\x11\x20\x45\x51\x0f\xca\x22\x15\xd9\x4a\xe2\x4a\x16\x59\
+\xc7\x76\x52\x3b\x91\x9c\x36\x49\x6b\xc7\x91\x9c\x34\x49\x73\x4e\
+\x12\xd9\x27\x6d\xd2\x3f\x7a\x2a\xfb\x9c\x34\xc9\x49\x9b\xc8\x6a\
+\x4f\x93\xf8\x34\x31\xe3\x46\x7e\xc8\x51\x22\xcb\x91\x12\x37\x71\
+\x2c\xca\x7a\xdb\xa2\x4c\x91\x22\x45\x3d\xf8\x04\x29\x10\x04\x08\
+\x60\x01\x2c\x76\xe7\x71\xbf\xaf\x7f\xcc\xdc\x3b\x77\x66\x67\x41\
+\x12\x04\x20\x8a\xc6\x87\xb3\x98\xd7\x9d\xd9\x99\xf9\x7d\x8f\xdf\
+\xf7\xdd\x3b\xb3\xc0\xb2\x2c\xcb\xb2\x2c\xcb\xb2\x2c\xcb\xb2\x2c\
+\xcb\xb2\x2c\xcb\xb2\x2c\xcb\xb2\x2c\xcb\xb2\x2c\xcb\xb2\xfc\x40\
+\x88\x78\xbb\x4f\xe0\x4a\x97\xbb\xef\xef\xdb\x01\x58\xd5\x30\x04\
+\x2c\x0b\x3b\x41\x00\xc0\x03\xcc\x18\x64\x46\x55\x08\xb1\x83\x99\
+\x41\x92\xf7\x00\x0c\x66\x1c\x67\xa6\x27\x11\xc8\x3d\x0f\x7d\xb6\
+\x76\x7c\xb1\xcf\x6f\x59\x01\xe6\x21\xbf\xf4\xa7\xeb\x77\x02\x00\
+\x93\xa8\x0a\x88\x1d\x00\x81\x59\xf4\x80\x68\x07\x47\x4d\x06\x01\
+\x31\x08\x06\x98\x19\x6a\xca\x00\xc0\x0c\xce\xae\xe7\xfc\xf5\x44\
+\xbc\x0f\x24\x1f\xf8\xeb\xcf\xd6\xfe\x72\xb1\xae\x65\x59\x01\x00\
+\xdc\xbd\x7b\xa0\x5a\x02\x76\x20\x04\x20\x30\x08\x81\xc1\xc8\x52\
+\xc5\x76\x66\xaa\xc6\xcd\x76\x00\xa2\xaa\x41\x05\x52\xc0\x21\x03\
+\x70\x1e\xb8\xb1\x85\x83\x99\xb1\xba\xba\x11\x05\xb7\x14\xb7\x89\
+\x3e\x67\xcf\x0d\xc1\xf3\x1b\x99\xfd\x22\x45\x08\x43\xfe\xe4\xa3\
+\xbf\x57\xdb\xb7\xd0\xd7\x7e\xc5\x2a\xc0\xaf\xee\x1e\x18\x74\x1c\
+\x67\x10\x00\x40\x1c\x81\x07\x80\xc1\x77\x20\x9a\x81\x10\x62\xa7\
+\xb2\x38\xa0\x15\x58\x73\x3e\xc6\x2f\xb1\x50\x28\x4b\x8d\xb6\x17\
+\xdd\x0a\xd6\xf4\x0e\x82\x19\x28\xba\x1d\x58\xd3\x3b\x00\x62\x46\
+\x4f\x65\x15\xba\x3b\x56\x82\x99\xd0\x55\x59\x89\xae\xca\x0a\x30\
+\x11\x88\x25\x88\xa3\x29\xb3\x8c\x96\x49\xa2\xe1\xcd\x60\xe8\xcc\
+\xeb\x38\x32\xb4\x1f\xc7\x4e\xbe\x82\xa6\xdf\x00\x88\x41\x44\x93\
+\x92\xc3\x5d\x8f\xfe\xde\xec\x82\x2a\xc1\x3b\x4a\x01\xee\x7d\xf0\
+\x9a\x1d\xb0\xad\x6a\x18\x86\xb0\x2c\x6b\x27\x00\x08\xa0\x87\x81\
+\x1d\x31\x2a\x83\x42\x88\x41\x05\x16\x14\x48\xc6\x72\x8c\x6b\x06\
+\xd4\x6c\xdb\xa8\x5d\x7f\xef\xd5\x28\xb9\x15\x30\x33\x06\xd7\xdc\
+\x14\x2b\x08\x63\x60\xf5\xbb\xe2\xfd\x19\x1b\x57\xdf\x08\x06\x81\
+\x99\x62\xcb\x25\x10\x08\x4c\x04\x06\x81\x98\x62\x80\xa3\x36\x1a\
+\x74\x4a\x14\xc0\x54\x06\xa2\x30\x9a\xa7\x10\x4d\xaf\x8e\x6f\x3f\
+\xf7\x35\x1c\x3b\x79\x28\x3a\x36\xf1\x24\x05\xe1\xae\x47\xff\xc7\
+\xc2\x29\xc1\xdb\xaa\x00\xf7\xee\xde\x5e\x75\x3a\xb1\x03\x61\x08\
+\x16\xa2\x2a\x44\x14\x4f\x49\x60\x40\x30\x0f\xc6\x16\xb9\x03\x40\
+\x95\xc1\x1a\x00\x00\x89\x15\x22\xb5\x6a\x4e\xe0\x7b\x2b\xfd\xa8\
+\x56\xfa\xc1\xcc\xa9\xf9\x08\xe8\x4e\x30\x18\x6b\xab\x57\xa3\x58\
+\xe8\xd0\xdf\xc5\x31\xd0\x11\xc8\xac\x81\x27\x26\x20\x9e\x2a\xe0\
+\x99\x49\x2b\x83\x09\x78\x32\x95\xa9\x69\x0a\x7c\x92\xc9\xb2\x9a\
+\xa7\x10\xc4\x12\xfb\x5f\x7d\x1a\xcf\xbd\xf8\x4d\x30\x33\xa4\xe4\
+\x3d\xdf\xf8\xc3\xe9\x5d\x0b\x85\xc1\x92\x29\xc0\x6f\xff\xf5\x8e\
+\xdd\xcc\x18\x04\x08\xc2\xb2\x76\x32\xd8\xb0\x42\x8e\xc1\x4c\x6e\
+\xb8\x5a\xc7\x09\x8a\x09\xa8\xc6\xf2\xa6\xd5\x37\xeb\x36\x9b\x56\
+\xef\x00\x00\x94\xdc\x4e\xf4\x57\xb7\xe8\xf9\xb5\xbd\x57\x27\x31\
+\xb8\xe5\xfb\xd4\x7a\x6e\x01\x3d\xa5\x00\x4c\x00\x33\x08\x0c\x30\
+\xe9\x29\x33\x47\x16\xcf\xe6\x87\x35\xb0\x5a\x21\x62\xb7\xaf\xbd\
+\x02\xb5\x01\xdf\x50\x02\xc9\x61\xb4\x8d\x42\xfc\xe3\x93\x5f\xc5\
+\x89\xa1\xd7\xc0\xcc\x08\xa4\xbc\xf9\xef\x17\xc8\x0b\x38\x0b\x71\
+\x90\xf3\xc9\x6f\xfd\xf5\xb6\x9d\x0c\xba\x87\x05\x00\x30\x98\x42\
+\x0d\x24\x67\x94\xa0\xe4\x56\x34\x78\xd5\x8e\x7e\xf4\x56\xfa\xc1\
+\x00\xd6\x56\xb7\xa0\xe4\x76\x02\x00\xd6\xf6\x6e\x89\x2d\x16\xa6\
+\x99\xc7\x62\xb8\x79\x05\xa3\xfa\x0e\x0d\xb2\x39\x9f\x56\x34\xf5\
+\xa7\xcf\x8d\x0d\xeb\x37\x40\x07\x0c\xcb\x37\xda\x92\x6a\xaf\x8f\
+\x41\x5a\x11\xd4\xb2\x0a\x13\xc4\x9c\x52\x12\xfd\xa1\xf4\x32\x31\
+\x61\xc7\x8d\xb7\xe1\xf8\xc9\xc3\x00\x33\x2c\xc6\xdd\x00\xde\x39\
+\x0a\x10\x32\x4f\x3a\x90\x51\x2c\xed\xdb\x8e\x81\xbe\xed\x00\x18\
+\xfd\x1a\x54\xc6\x60\xdf\x0e\x00\x22\x76\x49\x0c\x36\x9c\x93\x00\
+\x0c\x50\xe3\xed\xc6\x8a\xd6\x50\x60\x82\xac\xd6\x24\x31\x41\x13\
+\x38\x03\xe8\x44\x59\x12\xb0\x13\xf7\x1f\x81\xaa\xbd\x12\x12\xcb\
+\xd7\x8a\x10\x83\x08\xa4\x81\x4b\x58\xbe\x8a\xff\x06\xb8\x30\xda\
+\x1b\xa1\x23\xaf\x5d\x6f\xb5\x0f\x9d\x1d\xdd\x98\x9e\xa9\x01\xc0\
+\x3d\x00\x3e\xbd\x10\xd8\x2c\x59\x08\xf8\xcd\xaf\x5c\x3b\x61\x09\
+\x54\x07\xfb\xb6\xe3\x9e\x9d\x7f\xdc\xf2\xf5\x42\xff\xe7\x64\x7d\
+\x06\xf4\x96\xa5\x8c\xa5\xa7\xda\x99\x00\x03\x09\xab\x37\x42\x8f\
+\xe9\x01\x92\x90\x93\xf5\x00\x86\x85\x1b\x56\xdf\x12\xff\x91\x06\
+\x2d\x35\x8f\x38\xee\x13\xa5\x62\x3f\x9b\x3c\x80\x32\x53\x0e\x21\
+\x0d\x2e\x20\x49\xe2\xe0\xab\xdf\xc5\x77\xf7\xfe\x33\xc0\x00\x85\
+\xe1\xae\xc7\x1f\xf0\xf6\xcc\x1f\x91\x48\xac\x4b\x3d\xc0\x05\x0b\
+\xd3\x1e\x66\xc6\xb1\x91\x7d\x18\xae\xbd\x16\x01\x62\x7c\x12\x22\
+\x65\x4c\x41\xc6\xc7\xf8\xe3\x04\x28\xd3\xdd\x22\x03\x88\x99\x63\
+\xab\x38\x9e\x00\x1a\x5b\x1f\x38\xb5\x2e\xb2\x74\xca\xb4\xcd\x9c\
+\x5b\x0e\xf8\x9c\xd9\x07\xf1\x79\x93\x61\xd9\x66\x3b\xc4\x64\x30\
+\xcd\x1d\x12\x45\x4a\x14\x28\x21\x8e\x1b\xd6\x6f\x8e\x2f\x93\x41\
+\xb0\x76\x2e\x04\x2c\x4b\xa6\x00\x2c\xf9\x49\x05\xc4\xcb\x27\xbe\
+\x85\xc3\x23\x4f\x23\x20\xaf\x15\x5c\xa4\x81\x6d\x01\xdd\x00\x3e\
+\x01\xd0\x00\xd1\x6c\x6f\x02\x6c\x6e\x57\x60\xb4\x80\x1f\xc7\xf1\
+\x94\xc5\x9b\x4a\x98\x69\x8b\x04\x30\x53\xc9\x22\x00\x93\xef\x55\
+\xdb\x49\x79\x03\xa4\x5d\x7d\xe2\x19\xa2\x79\x66\x19\xd7\x0a\xd4\
+\x72\x34\xdf\x51\xa9\xa0\xda\xb3\x2a\xb6\x19\xde\xbe\x10\xb8\x2c\
+\x99\x02\xf8\x61\xf0\xf5\xd8\xd3\x62\xb4\x76\x12\xb5\xc6\x59\xbc\
+\x3c\xf4\x4d\xd4\xbd\x09\x28\x86\x6d\xc6\x5c\x95\xa0\x73\x66\x7d\
+\x9a\x60\x65\x80\xd6\x60\x73\x0e\x58\x26\xa0\xa6\x55\xa7\x63\xb0\
+\x8e\xc5\x99\xd8\xde\xd2\x3e\xf3\xa1\xd4\xb1\x5b\xc3\x80\x69\xed\
+\x2d\xc4\x0f\xe9\x76\x5a\x51\x74\xd6\x20\xf5\x7e\xd5\xea\x4a\x30\
+\x33\x04\xa3\x7a\xbe\x7b\x7e\x21\xb2\x64\x0a\xf0\xf9\x4f\x9e\x38\
+\x4e\x44\xc7\xc1\x8c\xa1\xb3\x87\xe0\x05\xb3\xf0\x65\x13\xfb\x4f\
+\xfd\x13\x86\x6b\xaf\x27\x16\x96\xeb\xc6\x73\x40\x4d\x85\x88\x04\
+\x50\x68\xa0\xb9\x05\x10\x93\x90\x71\xcc\xc2\xd3\xfb\xe7\xb9\xf4\
+\x36\x6e\x3e\x87\xac\x65\x5d\x77\xb6\x0e\x40\xb9\xeb\xa5\xe1\x0d\
+\x64\x2a\xa5\xa4\x9c\x76\xb3\xcd\x99\xd8\x30\x68\x41\x70\x59\x3a\
+\x0e\x00\x80\x09\x7b\x98\x80\xd9\xe6\x34\x9e\xda\xff\x10\x26\x67\
+\xce\x42\xb2\xc4\xd1\xd1\xbd\x78\x75\xf8\x3b\x08\xa5\x87\xa8\xd8\
+\x62\x80\xa5\x2d\xde\x5c\x67\xc6\x64\x45\xe0\xd2\xa0\x11\x32\xe0\
+\xb5\xb8\x7e\xf3\x18\xa6\x25\x26\xdb\xa8\xc5\xfa\xa3\xef\x49\xac\
+\x3d\xeb\x79\xda\x29\x46\xc6\xfa\x0d\x17\xaf\x95\x05\xd2\xd8\xd7\
+\x20\x89\x24\x53\xc7\x9b\x9a\x1e\x07\x33\x40\x0b\x83\xff\xd2\x2a\
+\xc0\x0c\x85\x9f\x96\x44\xfb\x98\x19\xb3\xcd\x69\x3c\x73\xe0\x61\
+\x9c\x3a\x7b\x18\xc4\x12\xa3\xd3\x27\xf1\xd2\x89\xc7\x31\xe3\x9d\
+\xcb\xe1\x00\x39\x16\x68\x6c\xa3\x9c\x75\xdc\x62\xdd\x66\x5a\x96\
+\x89\xed\x66\x3c\xce\x96\x75\x99\x40\x48\xdc\x72\xb6\xc2\xa7\xeb\
+\xf8\x19\x77\x9f\x3d\x5e\xab\xa7\x30\x2d\x3f\xe1\x01\x4c\x0a\xf8\
+\x4c\xe1\x88\x09\x13\x93\xa3\x08\x02\x4f\x19\xc1\xe4\x42\x60\x62\
+\x2f\xc4\x41\x2e\x54\x5e\x7e\xb4\xd6\xdc\x76\x67\xf7\x43\x0e\xa1\
+\x1f\x02\x3b\xc0\xc0\xd9\x89\x13\x98\xf5\xa6\x51\xed\x5c\x0d\xc9\
+\x21\xde\x9a\x3c\x0c\xdb\x72\xd1\x5d\x5a\xa5\x63\xbd\x4a\x16\x55\
+\x4e\x0f\x91\xce\xdf\xa1\x6a\x02\x22\xbd\x4e\x73\x05\x63\xd9\x74\
+\xf7\xba\xae\x68\x2a\x0f\x9b\x6d\x33\xde\xc2\xf0\x3c\x0a\x58\x33\
+\x63\x50\x04\xaf\x25\xa6\x6b\xe2\x67\x28\x8b\x8a\xf1\xc6\x47\x85\
+\x80\x68\xbb\x4c\x14\x23\xf6\x02\xc3\x67\x4e\xe0\xd8\x9b\x6f\x20\
+\x26\x81\x0f\x1d\x7d\x91\xf6\x5c\x2a\x26\x4b\xaa\x00\x40\xa4\x04\
+\x2f\x3e\x3a\xf9\xe8\x2d\x3f\xd9\x5d\x03\xc4\x8f\x03\xc0\xf4\xec\
+\x38\xc6\x26\x4f\xa1\xb7\xbb\x1f\xb6\xe5\xe0\xdc\xcc\x10\xa6\xbd\
+\x31\xac\xa8\xac\x87\x25\x2c\x68\x10\x91\xad\xf8\x65\x96\x81\x74\
+\xbe\x6f\x2a\x42\xa6\xf0\x13\xb5\x4a\x3c\x87\x06\x5d\x2b\x87\x2a\
+\xf7\x26\xa1\x48\x79\x10\xb4\xf0\x13\xc3\x33\xa4\x48\xa4\xe9\xfa\
+\x25\x5a\x3c\x84\x99\x0d\xc0\xdc\x26\xb5\x07\x48\xbc\x80\xc4\xeb\
+\xaf\xed\xc7\xf8\xb9\xb1\x28\x0d\x24\xfa\xec\xb1\xbd\x7c\xfc\x52\
+\xf1\x58\xd2\x10\x60\xca\x9f\xfd\xd2\x89\xcf\x91\xa4\x5d\x44\x3c\
+\xc9\x0c\x4c\xd7\xc7\xf1\xdd\x57\x1e\xc7\x78\x6d\x18\xc4\x21\x46\
+\x6a\x47\xf1\xc2\x91\xbf\xc1\x74\x73\x34\x86\x22\x1b\xe7\x0d\x6b\
+\xcb\x86\x81\x16\x2e\x90\x69\xa7\x0a\x33\x9c\xb5\xe8\x0c\x41\xcc\
+\xb8\xeb\x3c\x76\xdf\x52\xb5\xcb\x78\x84\xb4\xbb\xcf\x10\xbe\xdc\
+\x0e\xa0\x44\x09\xf4\xf1\xe3\x6d\x13\xe3\xa3\x60\x8a\x94\x32\x6c\
+\xca\x05\x29\x05\x2f\xb9\x07\x30\x65\xef\xdf\xd5\x8e\xbf\xfb\x27\
+\x7a\x1e\x62\xa6\x9d\x10\xa2\x9f\x48\xe2\xcc\xb9\x63\x60\x26\x74\
+\x57\x56\xc2\x97\x4d\x0c\x9d\x7b\x05\xb6\x55\x40\x4f\xc7\x6a\x20\
+\x65\xd5\x4a\xb2\xd5\x3e\xe5\x2d\x60\x58\x75\x5e\xd9\x37\xb1\x74\
+\x53\x71\x54\x85\x2f\x45\x3a\xdb\xb8\xff\x68\x5b\x54\xe2\x26\x35\
+\x45\x86\xe5\x43\x59\xbe\xd9\x13\x98\x54\x05\x99\x29\x19\x1f\x60\
+\x76\x10\xc5\xcb\xaa\xbd\xef\x37\xb1\x6f\xef\xf3\x60\x49\x20\xe2\
+\x7d\x4f\x7c\x81\x1e\x58\x08\x0c\xde\x56\x05\x00\x80\xbd\x8f\xd7\
+\x26\x6f\x7c\x3f\x1e\xb2\x9c\x62\x3f\x10\xf1\x82\xc9\xe9\x51\x4c\
+\xcf\x4e\xa0\xda\xb5\x0a\x80\xc0\xe8\xf4\x09\x4c\x35\xce\x62\x55\
+\xe7\x46\x58\xc2\x32\xc2\x01\xa7\x41\x37\xc1\xcd\x80\xad\xc1\x3f\
+\x9f\xfb\xd7\x53\xd2\xed\x49\x73\x84\xb4\xeb\xd7\xde\x24\x43\xf4\
+\x52\x31\x3c\x35\xaf\xe2\x7d\x12\xff\x53\x5d\xc2\x90\x29\xe0\x85\
+\xd0\xec\x07\x67\xcf\xbe\x85\x23\x6f\xbc\x16\x5f\x32\x7f\xf3\xd8\
+\x4b\xfc\xe8\x42\xdc\xff\xb7\x5d\x01\x00\xe0\xe5\xff\xe7\x35\x5f\
+\x7a\xac\xf6\xe8\xcd\x1f\xee\xae\x01\xf8\x71\x00\x68\x34\x66\x30\
+\x3a\x7e\x0a\x5d\x95\x5e\x38\x8e\x8b\xe9\xc6\x39\x9c\x9e\x3c\x8c\
+\x15\x95\x75\x28\x3a\x15\xa4\xbd\x41\xa2\x10\x09\xa0\x94\xf1\x08\
+\xe9\xf8\xde\x0a\x78\x02\x3c\xb4\x02\x18\x96\x6e\x64\x16\x69\x97\
+\xcf\xa9\xea\x5e\x36\xcf\x37\x2d\x3f\x9b\xe6\x65\xbb\x7f\x4d\x77\
+\x2f\x59\xc2\xb1\x0a\xf1\x1d\x12\x38\x79\xf2\x0d\x0c\x9f\x3e\xa5\
+\xae\xe1\x8b\xc7\x5e\xe2\xe7\x17\xe2\xde\xbf\x6d\x1c\x20\x4f\xfe\
+\xfc\x3f\x0c\x7d\x8e\x02\xb9\x8b\x24\x4d\x32\x33\x9a\xde\x2c\x0e\
+\xbe\xfe\x1c\x46\xc6\x4e\x82\x38\x84\x17\xcc\xa2\xee\x4d\xea\x9b\
+\x6d\x16\x4e\x28\xe5\x62\x93\xb8\x4f\x30\xb7\x25\xeb\xcc\xe2\x4e\
+\xcb\x72\x36\x45\x33\x2c\x38\x4d\xe6\x12\xab\xa6\x38\x97\x4f\xc7\
+\xfd\x36\x1f\xb3\xe3\x87\xd2\xc7\x50\xe7\x0b\x06\x6c\xe1\xc0\x16\
+\x0e\x2c\xcb\xc1\xc8\xf0\x69\xad\xc0\x92\x69\xc1\x46\x04\x5d\x56\
+\x0a\x00\x00\x7f\xf1\x1b\xa7\xf7\x84\xfe\xf4\x26\x92\xbc\x8f\x89\
+\x11\x86\x01\x8e\x9c\x38\x80\xd3\x6f\x1d\xc5\x6d\xd7\xfe\x3b\xac\
+\xe9\xd9\x94\x62\xd7\xe9\x22\x8e\x01\x72\x0b\x59\x6b\xb5\xc4\x34\
+\x2b\x97\x99\x6d\xd9\xef\x90\x99\x63\x99\x03\x3a\x92\x38\x1e\xa5\
+\x7d\x32\xa3\x48\x86\x75\x53\x46\xb9\x8c\x63\xb1\x56\x0a\x09\x4b\
+\x38\xb0\x2c\x1b\x56\xac\x04\x67\x47\xde\x02\x13\x83\x09\x78\xf2\
+\x2f\xb0\x67\xa1\xee\xf7\x92\x8c\x07\xb8\x58\xf9\xe2\xa7\x6b\x93\
+\x40\xed\xe6\x4f\x3e\xb0\xfe\x11\x61\xe1\x2e\x66\x60\x68\xf8\x0d\
+\x94\xdc\xce\x98\xa0\xc1\x48\xeb\x62\xe1\x88\xec\xe9\x50\xa0\xfb\
+\xfe\x91\x8a\xf1\x09\x01\x04\x92\xbe\x7c\x63\x5b\x8a\xf4\x19\xae\
+\x3f\x15\xdf\x19\x69\x2f\x90\x9d\xa6\x15\x40\xcf\x43\x66\x94\x22\
+\xea\xf6\xd5\x6e\xdf\xc8\x0a\x8a\x96\x0b\x5b\x38\x10\x16\x61\x62\
+\x7c\x14\x81\x1f\x22\xca\x40\x17\xce\xfa\x81\xcb\x54\x01\x00\xe0\
+\xee\xfb\xd7\xdd\x03\x81\xbb\x14\xde\x03\xfd\xdb\xc0\x2c\xf5\xf6\
+\xf3\xd6\x00\x52\xcc\x3f\x5e\x6b\x16\x87\x74\x7d\xa0\x95\xf8\xa5\
+\x63\x7e\x1a\xec\x7c\x1e\x90\x56\x82\x54\x0a\x97\x49\xed\x52\x29\
+\x60\xcb\xc0\xd0\x24\x3c\xb8\x76\x11\x96\x70\x20\x40\x38\x77\x6e\
+\x04\x32\x54\x1d\x66\x0b\x33\x12\x48\xc9\x65\xa9\x00\xbf\xf0\xb9\
+\xb5\xbb\x85\xc0\x3d\x4c\x11\xa0\x3f\xbc\xed\x23\xf8\xe0\xad\xbf\
+\x98\x58\x3f\x60\xb0\x79\x23\x21\x34\xab\x7b\x06\xf0\xaa\x6d\x42\
+\x00\x61\x10\x3d\x68\xe2\x47\x86\x07\xd0\xdb\xc1\x06\xd8\x86\x32\
+\xe8\xf5\xad\x35\x02\xbd\x5e\x75\xed\x9a\x20\x6b\xd0\x43\x83\x9f\
+\x98\x0a\x11\x79\x84\x92\xdb\xa5\x8f\x37\x72\x26\x22\x7f\x91\x02\
+\xf0\xcb\x0b\x79\xaf\x2f\x2b\x05\xb8\xfb\xfe\x35\x83\xcc\xd6\x23\
+\x16\xc4\x0e\x10\x50\x2c\x74\xe0\x83\x3f\xfc\x49\x6c\xbf\x66\x57\
+\x04\x0a\x80\xa4\x7c\x1b\xcd\xb3\x1a\x44\x94\xb2\xfa\x78\x9b\x51\
+\x05\x34\x97\xf3\x53\x3f\x4a\xda\x70\xc6\xfa\x63\x6f\x90\x55\x04\
+\x95\x06\xb6\xba\x7e\x4a\x0d\xfb\x6e\xe5\x0d\x19\x22\x18\xb3\x7e\
+\xe2\x68\x14\xb0\x63\x17\x60\x5b\x2e\x98\x09\x82\x09\x67\xce\x9c\
+\x02\x28\x56\xe8\x60\xe1\xe2\x3f\x70\x19\x29\xc0\xc7\xff\xfb\x9a\
+\x9d\xcc\xe2\x11\x21\x50\x65\x62\xf4\x74\xf6\xe1\x67\xde\xff\x9f\
+\xb0\x66\xa5\x22\x7d\x66\x6b\x06\x58\xa4\x5c\x7d\x34\x6e\x30\x5b\
+\x06\x46\x0a\xe4\xb4\x37\x30\x6a\x00\x66\xed\x9f\xb3\x4a\x90\xc4\
+\xfc\x3c\x4f\x90\x8e\xff\x99\x98\x6f\xf2\x80\xbc\xaa\x1f\x1b\xe0\
+\x53\x18\x8f\x04\x96\xe8\x2c\x74\xc2\x16\x0e\x24\x42\x34\x1b\x53\
+\x18\x1b\x3d\x83\xb8\xfe\x8f\x27\xbf\x7c\x05\x86\x80\x4f\xfc\xd1\
+\xea\x4f\x09\x61\xdd\x0f\x00\x4c\xc0\x40\xff\x0d\xf8\x37\x3f\xf6\
+\x1f\x51\x2a\x74\xc4\xac\x3a\xee\xff\x51\x50\x2b\x6d\x10\xac\x67\
+\xd9\x04\x57\xad\x31\x88\x1d\x90\x84\x08\xad\x14\xda\x43\xb4\x23\
+\x7d\x69\x0e\x40\x79\x84\xb0\x0d\xf8\x4c\x26\x1f\xc8\xc4\x7e\x05\
+\x7c\x66\xfc\x3f\xb1\x44\x28\x3d\x38\x76\x01\x81\xf4\x40\x4c\x18\
+\x1d\x1b\x86\x0c\xd5\xf7\x2e\xac\xf5\x03\x6f\xb3\x02\xdc\x79\x5f\
+\x4f\xb5\xbb\xb3\x78\xbf\x80\x75\x4f\x4c\x70\xf0\x9e\x6d\x3f\x81\
+\x0f\xdc\xfa\x09\x40\x20\x8e\xf9\xca\x92\x13\x49\xd8\x3e\xb4\x95\
+\x47\xeb\xcd\x82\x90\x6e\x68\x00\x99\x29\x16\xa5\x00\x4e\xc2\x43\
+\xda\xca\xcd\x30\x90\xe5\x04\xd4\x62\xf1\x79\x35\x09\x33\xcd\x93\
+\x2a\x1d\x34\x32\x00\x49\x21\xbc\xb0\x8e\x46\x30\x8d\x20\x6c\x62\
+\x7d\xf5\x06\xd8\x96\x0b\x1b\xc0\x99\x91\x21\x90\xd4\x99\xcf\x82\
+\x3f\x1b\xf8\xb6\x29\xc0\x9d\xf7\xf5\x54\xbb\x3a\x4b\x4f\x40\x88\
+\x1d\x1c\xc7\xfb\x8f\xdc\xfe\x2b\xb8\x66\xe3\xbb\x23\xe0\x19\x91\
+\xd9\x73\x52\x0e\xd5\xa3\x86\x19\x60\x11\x6b\x85\x06\x39\x6a\x93\
+\x10\x43\x86\xee\x03\xe0\x34\xf8\xb9\x19\xc0\x1c\xa9\x5f\xb6\x37\
+\x30\xed\x11\x64\xc6\x13\x90\x26\x7a\x5a\x01\x72\xdc\x7f\x48\x3e\
+\xfc\xb0\x01\x2f\xa8\xc3\x0b\x67\x53\xdb\xba\xcb\x7d\xd1\x00\x79\
+\x66\x0c\x9d\x3a\xa2\xef\x19\x03\x0b\x4a\x00\x81\xb7\x49\x01\x3e\
+\xf6\xbb\x7d\x3b\x44\x41\x3c\x01\x44\xf1\x7e\xf5\x8a\x8d\xf8\xf0\
+\xed\xbf\x8c\xd5\x2b\x06\xa0\x52\x3d\x65\xe4\x26\xfc\x2a\xf6\xe7\
+\x13\xbe\x78\x2e\x93\x09\x20\x6b\xfd\x29\x4b\x37\xb7\xe7\x13\xbf\
+\x14\xe9\xcb\x74\x02\xb5\xe6\xff\x14\xd7\xf1\xb3\x5e\x20\x9a\x0f\
+\x64\x13\x7e\xd8\x40\x33\x98\x41\x20\x9b\x19\xe5\x88\x8e\xd1\x53\
+\x5e\x03\xd7\x2a\x40\x5d\xf9\xf1\x13\x87\xf5\x7d\x93\x74\x05\x78\
+\x80\x9f\xfb\xfd\x95\x3b\x85\x10\x8f\x08\x16\x55\x66\xc6\xc6\xfe\
+\xeb\xf0\xd1\xf7\xff\x06\x8a\x85\x0a\x28\x06\xdf\x7c\x58\x81\x90\
+\x3c\x2d\x60\xfc\x43\x34\x97\xb6\x7e\xb5\xa0\x99\xbe\xb9\x9c\x2a\
+\xf4\xb4\x7a\x83\x04\x58\xe5\x01\x0c\x12\x68\xb2\xfe\x0c\xf3\xcf\
+\xb3\x7c\xc5\xfc\x95\x6b\xf7\xc3\x06\x7c\xd9\x40\x28\x03\x23\x2c\
+\x90\x1e\xf1\x6b\x1e\xa7\xb7\x63\x1d\x1c\xab\x08\x21\x04\x86\x47\
+\x8e\x27\xee\x1f\xc0\xb3\x0b\x4c\x00\x81\x25\x56\x80\x8f\xfd\x7e\
+\xdf\x3d\x42\x88\xdd\x40\x64\xa9\xdb\xb6\xbc\x17\x3f\x71\xfb\x2f\
+\x02\x10\x29\xcb\x17\xa9\x99\x48\x09\xf4\xc6\x78\x86\xcd\x86\xda\
+\xd5\x9b\x19\x80\x9a\x4b\xdc\x7d\xda\xe5\x9b\x4a\x60\xb8\xff\xb6\
+\xc0\x27\x8a\xd1\x96\x03\x50\x08\x5f\x36\xe1\xcb\x06\xfc\xb0\x81\
+\x40\x7a\x46\x18\x48\x73\x02\xb3\xa3\xc8\x2c\x5b\xf7\x94\xd7\xc0\
+\xb1\x23\x05\x18\x1a\x3e\x02\x0a\xa3\xab\x5f\x0c\x02\x08\x2c\xa1\
+\x02\xfc\xdc\xef\xae\xb8\x07\xc0\x6e\xc5\xc8\x77\xde\xfa\xb3\xb8\
+\x65\xdb\x8f\x69\xab\xd7\x8f\x85\xa9\xd0\x1e\xcf\xab\x1e\xd1\x74\
+\xe1\xcf\x24\x7d\xf1\x2a\x03\x74\x3d\x35\x43\x40\x3b\x2f\xa0\xc0\
+\xcf\x2a\x40\x6e\xfe\x9f\x06\x3d\xa4\x00\x81\x6c\x22\x90\x1e\x02\
+\xd9\x40\x20\xfd\x74\x2d\x20\x47\x59\x5a\x79\x42\xfc\x89\x97\x7b\
+\x3b\xd6\xc1\xb5\x8b\x10\xb0\x30\x3c\x7c\x3c\x09\x6d\xc0\x93\x0b\
+\x0c\x09\x80\x25\x52\x80\x9f\xfd\x6f\x2b\xef\xb2\x84\xb5\x5b\x5d\
+\xcc\x87\x6e\xfb\x05\x6c\xdb\xf2\xa3\x20\x4a\xc0\x37\x25\x15\xf7\
+\x73\x79\x40\x66\x5e\x11\x42\x24\x8a\x91\xf5\x08\xe7\x23\x7e\x30\
+\xad\xde\x18\x11\xa4\xd6\x49\x0a\x10\x48\x0f\xa1\xf4\x11\xc8\x26\
+\x42\xf2\x20\x29\x49\xf1\xe6\x4c\x0b\x29\xdf\xea\xd3\xf5\x02\x82\
+\x63\xb9\xe8\x2e\xf5\xc1\x12\x36\x2c\x61\xe3\xc8\xf1\x03\xfa\x9e\
+\xf0\x22\x64\x00\xc0\x12\x28\xc0\xcf\xdc\xd7\xb3\x43\x10\x76\x73\
+\x94\xc8\xe3\x83\xb7\xfd\x3c\xae\xdb\xfc\x1e\x10\x45\xef\x63\x01\
+\xa2\x49\x14\xe7\x73\x1e\x55\x34\x42\x81\x99\x0f\xb2\x39\x6f\x16\
+\x80\xb2\x39\x7f\xca\x2b\x28\x6e\x60\xc6\xfb\xb4\xe5\x2b\x86\x2e\
+\xc9\x47\x48\x01\x24\xf9\x29\xcb\x9e\xcb\xba\xb3\xd5\xc0\xe4\xa9\
+\x9e\x0c\x31\xa4\x0c\xf8\x31\x71\x5c\xd5\x39\x08\xc7\x2a\xc0\xb6\
+\x1c\x34\x9b\xb3\x18\x1b\x3f\xa3\x6f\x43\x10\xbc\x03\x15\xe0\xce\
+\xfb\x7a\x06\x85\x6d\x47\x6c\x9f\x19\x1f\xb8\xed\x63\xb8\xee\xea\
+\x77\x1b\x6e\x3f\x76\xfc\x29\x90\xa3\xb5\x89\x45\x1b\x85\x1f\xa4\
+\x2d\x3f\x9a\xcb\xcc\x23\x63\xfd\x79\x96\x0f\x8e\x9e\x41\x88\xa7\
+\xc4\x84\x90\x7c\x84\xe4\x47\x60\x68\x52\xd8\x5a\xf6\x8d\xe6\xb9\
+\x05\xf8\x16\xcb\xa6\x8c\x17\x30\xc0\x37\xad\x9e\x8d\xac\x61\x45\
+\x65\x5d\x54\x06\x16\x2e\x8e\x9e\xfc\x9e\x26\x80\xcc\x98\x7c\xe1\
+\x21\x1c\x5f\x0c\x8c\x16\x4d\x01\xee\xbc\xaf\xa7\x5a\xb4\xec\x47\
+\x44\xfc\x62\xa5\xeb\xae\x7e\x37\xae\xdd\x7c\x0b\x24\x49\x1d\xd7\
+\x93\x67\x82\x85\x06\x31\x2d\x9a\xff\x67\x26\x99\xff\x19\xb0\x25\
+\x05\x00\x90\xbc\x60\x81\xa3\x97\x2d\x70\x0c\x74\xe4\xf2\x33\xc4\
+\x0f\x9c\x06\x3c\xa7\x16\xd0\x62\xf1\x26\x29\xa4\x36\x5e\xc0\x0c\
+\x07\x2d\xef\x06\x32\xc7\x04\x10\xfa\xbb\xaf\x81\x63\xb9\xb0\xad\
+\x02\x4e\x9f\x39\x62\x72\x9c\x45\xb1\x7e\x60\x11\x15\xa0\xc0\xd6\
+\xfd\x00\x76\x30\x31\xd6\xf5\x6f\xc6\xae\xf7\xfe\x0c\x24\x85\x11\
+\xd8\x02\x00\x44\x34\xe6\xcd\x00\x5e\x18\x21\x01\x50\x4e\x80\xa0\
+\x7a\x01\x15\xb0\x00\x10\x52\x00\x6d\xf3\x4c\x20\x0a\x53\x8c\xbf\
+\x85\xf4\xe9\x58\x9f\x57\xf0\x69\xa3\x04\x06\x07\x68\xb5\xf8\xf6\
+\xbd\x81\x17\x0c\x3e\xa5\x3d\x41\x34\xe6\xd1\x85\x63\xb9\x38\x7c\
+\xe4\x45\x53\xe9\x17\x85\x00\x02\x8b\xa4\x00\x3f\xfd\x5f\x7a\xee\
+\x42\xdc\x9d\xdb\xd5\xd9\x8b\x0f\xed\xfc\x38\x88\x55\xcc\x17\x71\
+\x5d\x5f\x80\x21\xe3\x69\x74\x83\x01\xc4\xe1\x21\xb1\xb6\x48\x54\
+\x1c\x57\xf3\x99\x38\x1f\x2d\x9c\x1f\xfc\x3c\xe0\x5b\x6a\xff\xe7\
+\x2b\x00\x9d\x8f\x03\xb4\x56\x07\x93\xe2\x50\x1e\xf8\x11\x91\xec\
+\x28\xf6\xa2\xe4\x56\x60\x5b\x36\x6c\xcb\xc5\xc1\x37\x5e\xd0\xf7\
+\x73\xb1\x08\x20\xb0\x08\x0a\x70\xe7\xbd\x3d\x55\x21\xc4\x6e\x55\
+\x9c\xd9\x75\xfb\xbf\x06\x0b\x89\x66\x58\xd7\x6d\xf2\xde\x4a\xc1\
+\xa9\x99\xd6\x62\x0f\x8c\xd4\x4e\x01\x9e\x05\x3f\x01\x39\xc3\xfe\
+\x63\xeb\xce\xf2\x80\x74\xca\xd7\x4e\x09\xb2\x19\x41\x3e\xf0\xad\
+\x15\xc1\x36\x1c\x20\x07\x7c\x22\x42\x7f\xf7\x16\x00\x16\x04\x2c\
+\xbc\x7a\xe4\x7b\x50\x63\x21\x00\x60\x7a\x7a\x71\x6a\x00\xc0\x22\
+\x28\x80\xd5\xc9\xbb\x11\x57\xf9\x76\xdc\x74\x1b\x7a\xab\xab\xa0\
+\x6b\xfb\x30\xa2\x7a\x3a\xb7\xcb\xa1\x00\x26\xb3\x47\x32\x0f\x24\
+\xd6\x0e\xb4\x05\xbd\xad\xf5\x5f\x44\x08\xc8\xad\x02\x66\xf9\x80\
+\xaa\x0a\x52\xbe\xf5\x5f\x08\xf8\xc4\x84\x15\x95\xf5\xfa\x96\x1c\
+\x3f\x7d\xc8\xc8\x66\x70\xfc\xe5\x47\xb1\x20\xcf\x01\xe6\xc9\x82\
+\x2a\xc0\x9d\xbf\x53\xd9\x29\x20\xee\x62\x66\xac\xe8\x5d\x8d\xed\
+\x37\xbe\x57\xc7\x6f\xc0\xa4\x74\x79\xa4\xcf\x24\x76\x48\x6e\x80\
+\xf9\x5f\x93\xa2\x3c\xb7\x1f\xaf\x3f\x6f\x28\x20\xa4\x15\x23\xed\
+\xf2\x29\x6e\xe3\x58\x2e\x98\x19\x3e\x35\x5a\x3d\xc1\x9c\xee\xbf\
+\x8d\x22\xa4\x06\x83\xa6\xc1\x67\x96\xe8\xed\x58\xa7\x39\xc7\xc1\
+\xd7\x9f\x07\x27\xf7\x67\xd1\xdc\x3f\xb0\xc0\x0a\x20\x84\x15\x55\
+\xfa\x18\x78\xef\x8f\xfc\x78\xca\xf2\xa3\xed\x40\xfb\xd7\x12\xb1\
+\x79\xd1\xc9\xba\x78\x9a\x38\x82\x56\xc0\x75\xcb\x36\xa0\xb7\xba\
+\x7e\xc5\x39\x5a\x79\x40\xd1\xa9\xa0\xe8\x54\x74\x6a\x18\x48\x0f\
+\x92\x82\x58\x39\x4c\x2f\x60\x02\xce\x6d\x2c\x3f\x01\x3e\xed\x09\
+\x64\xaa\x38\x44\x2c\xb1\xa6\x7b\x33\xd4\x18\x81\xe3\xa7\x0e\x19\
+\x77\x60\xe1\x7b\x00\x4d\x59\x30\x05\xb8\xf3\xb7\xbb\x3e\x05\x88\
+\x41\x26\xe0\xfa\xeb\x7e\x08\xd5\x9e\x95\xa9\x7c\x1f\x00\x04\xb7\
+\x03\x3f\x11\x36\x35\x26\x0b\x3c\x5a\x8b\x3e\x69\x45\x30\x40\xd7\
+\xf3\xc8\xa4\x7c\x4a\x29\xd2\x69\xa0\x63\x15\xd1\xd3\xb1\x06\x42\
+\x58\x90\x32\x00\xb3\x0f\xc1\x02\x92\x02\x0c\x0d\x1d\x45\x10\xf8\
+\xd8\x38\xb0\x19\x66\x97\xb0\xa9\x10\x3a\x0c\x40\x66\x52\xc2\x74\
+\xca\x97\x7e\x43\x68\xa4\x0c\xd5\xf2\x5a\x48\x0a\x60\x09\x1b\xe3\
+\x13\x23\x18\x3d\x77\x5a\xdf\x01\xa2\xc5\x8b\xff\xc0\x02\x29\xc0\
+\x1d\xf7\xa2\xca\xcc\xf7\x81\x81\x82\x5b\xc4\x8d\x37\xde\x1a\x81\
+\xcf\x66\x5a\x27\xda\xda\xbe\x29\x66\xcc\xd7\xcb\x6a\xce\x20\x88\
+\xb9\x19\x40\x0a\xf4\x1c\x37\x9f\xa7\x04\xcc\xa8\x96\xd7\xa2\xab\
+\xd4\xa7\xab\x7f\x2a\x5b\x69\x78\x33\x78\x69\xef\xd3\x98\x9c\x38\
+\x07\x66\xc6\xf8\xb9\x51\x5c\x7f\xe3\x4d\xb0\x6c\xfb\x02\xc2\x40\
+\xa6\x4f\xa0\xad\x27\x90\xe8\xeb\x1a\x8c\x52\x64\x11\xe0\xd8\xd0\
+\xc1\xd4\xfd\x98\x99\x79\x07\x84\x80\x6e\xa7\xf2\x29\xc4\x7d\xfb\
+\x5b\xaf\xdd\x0e\xc7\x71\x62\xeb\x37\x13\xfa\xf3\x2b\x40\xb6\xde\
+\x17\xcd\x29\x85\x48\x93\xc2\x56\x12\x98\x6c\x6f\x1f\x02\x12\xab\
+\x07\x33\x84\xb0\xb1\xbe\x7a\x1d\x8a\x76\x07\x42\xf2\x21\xe2\x73\
+\x14\x10\x98\xa8\x9d\xc5\x33\x2f\x3c\x86\xd9\x46\x3d\x6a\x4f\x8c\
+\xc9\xf1\x71\xbc\xf4\xc2\xf3\xb8\xf6\xc6\x1b\xd1\xd1\xd9\x71\x61\
+\x3c\x80\x32\xcb\x4a\x01\x8c\x2c\xa1\xbb\xbc\x1a\xa1\xf4\x01\x08\
+\x1c\x3e\xfa\x62\x72\xed\x8b\x4c\x00\x81\x05\x50\x80\x3b\xee\x45\
+\x95\xc1\xf7\x82\x81\x4a\xa5\x0b\x5b\xb7\xbe\x0b\xc4\x52\xe7\xfa\
+\x00\x74\x97\xde\x85\x79\x80\xf8\x7f\x96\xf9\xe7\x7a\x80\x74\xec\
+\x4f\x65\x03\xe7\x21\x81\x25\xb7\x0b\xeb\x7b\xae\x87\x6b\x17\x21\
+\x29\x88\x1f\xc4\xb4\x00\x08\x1c\x3d\x79\x10\xcf\xed\xfd\x87\xe8\
+\x18\x1c\x7f\x57\x3c\x6d\x34\x66\x71\xe0\xa5\x97\x30\xb0\x65\x33\
+\x56\xad\xe9\x4b\x14\x00\xd9\x6a\x60\x9e\x27\x48\xba\x86\xd5\x7a\
+\x30\xd0\x55\x5c\x19\x55\x28\x01\x9c\x3c\xf5\xba\x79\x3b\x16\xd5\
+\xfa\x81\x05\x50\x80\x4e\xab\x7c\x0f\x38\xaa\xf5\x6f\xdd\xfa\xae\
+\xc8\xfa\x49\xc6\x1d\x3c\x69\x0f\xa0\xff\xb7\x29\x04\xcc\xed\x01\
+\x92\x34\x2f\xd7\x03\x18\xeb\xe7\x26\x81\x84\xb2\xdb\x8d\x6b\xfa\
+\x7e\x18\x60\x68\x97\xaf\xac\x7f\xff\xa1\x67\xf0\xfd\x83\x7b\x22\
+\x65\x33\x14\x20\x59\x66\x04\x32\xc0\x9b\x07\x0f\x63\xba\x36\x85\
+\x8d\x5b\x36\x42\x75\x22\x25\xd3\x8c\x02\x64\xca\xc4\xba\xc8\x15\
+\x9f\x6f\x67\xb1\x37\x1e\x3b\xc0\x38\x72\xe2\x80\x79\x17\x16\xad\
+\x02\xa8\xe4\x92\x15\x80\x25\xee\x85\x0d\xb8\x6e\x01\x03\x9b\xae\
+\x49\x88\x1f\xc3\x28\xfb\x02\xa9\xb7\x82\xb6\x26\xfd\xe0\xec\xd2\
+\xf9\x3c\x40\x4a\x11\x5a\x63\x7f\x3b\x0f\xd0\x51\xe8\xc1\xf5\x6b\
+\xee\x00\x00\x6d\xf9\x02\x16\x88\x18\xdf\xf9\xee\xd7\xf1\xda\xd1\
+\x97\x72\x2d\xbf\x55\x21\x18\xc3\x27\x4e\x63\x7a\x72\x0a\x5b\xde\
+\xb5\x05\x96\x63\xa5\x2c\x7e\x4e\x22\xc8\xa4\xaf\x65\x45\xc7\x06\
+\x04\xd2\x07\x33\x70\x24\x13\xff\x69\x11\x86\x80\x65\xe5\x92\x14\
+\xe0\x43\xbf\x5e\xbc\x07\x02\x83\x4c\x8c\x6b\xb6\x6e\x83\xed\xd8\
+\xda\xfa\x81\x6c\x27\x4f\xc6\xec\xcd\xc5\x14\xfa\x59\x3f\x90\x70\
+\x80\x84\xf1\x1b\xcb\x19\xf7\x9f\x97\x11\xa8\xe5\x4a\xa1\x17\xef\
+\x5a\xfb\x01\x08\x08\xc3\xf2\x2d\x30\x11\xfe\xf1\x3b\x5f\xc2\xb1\
+\xd3\x07\x72\x81\x0f\x1a\x01\xea\x93\x4d\x30\x31\xca\xdd\x45\xb8\
+\x45\x47\x6f\x9b\x1a\xaf\x61\xdf\xd3\xfb\xb0\xf5\xe6\x6b\x50\xee\
+\x2c\xe5\x13\x40\xc3\x13\x30\x12\x65\x02\xa2\x17\x62\x47\xd6\x4f\
+\xa9\xfe\x7f\x00\x78\xe6\x4b\x8b\x9b\x01\x00\x97\xa8\x00\x02\x7c\
+\xb7\x8a\xc5\x1b\x37\x6d\xd6\xc4\x4f\x18\xa0\x67\x7b\xfe\xb4\xe4\
+\x78\x01\x73\x63\x52\x13\x48\x5b\x7c\xae\x22\xe4\x64\x04\x59\x25\
+\xe8\x2a\xae\xc4\x0f\x6d\xf8\x08\x20\x04\x24\xf9\xb1\xe5\x0b\x30\
+\x11\xfe\xe1\xc9\x2f\xe2\xe8\xa9\x03\x06\xe8\xd1\x77\x91\x64\x34\
+\xa6\x3d\x78\x75\x5f\x9f\x59\x63\xca\x43\x58\x94\x28\x74\xb8\xd1\
+\x59\x30\x83\x64\x88\x83\xcf\x1f\xc2\xc0\xf5\x57\x61\xc5\xda\x6a\
+\x26\xed\x4b\x3a\x86\xf4\xb9\xea\x4b\x61\x94\xdd\x6e\x04\xa1\x07\
+\xb2\x24\x86\x47\x4e\x24\x77\x60\x11\xeb\xff\xa6\xcc\x5b\x01\x3e\
+\xf4\xab\x18\x04\xc4\x4e\x26\xc6\xc0\xe6\x2d\x28\x77\x94\xf5\x08\
+\x1f\xb3\xc7\x2f\x0a\x05\x4a\x2e\x8a\x06\xea\xff\x66\xcc\x4f\x7b\
+\x80\xd6\x30\x90\x47\x04\x1d\xab\x80\x9b\x37\x7c\x04\xae\x53\x8e\
+\xd9\xbe\x15\x83\xcf\x78\xec\x89\x2f\xe0\xcd\x93\xfb\x5a\xdc\xbc\
+\x0c\x25\xea\x13\x0d\xc8\x20\xa9\x64\x32\x63\x52\x08\x54\x03\x2f\
+\x84\x0c\x09\xc5\x0e\x37\x19\xa9\xce\x8c\x63\xaf\x9c\x44\x6d\xac\
+\x86\xab\x6e\x58\x87\xec\xf8\x00\x7d\x9e\x0c\x43\x71\x81\xa2\x53\
+\x89\x46\x08\x93\x8b\x93\x43\x6f\x98\x37\xe2\xf2\x56\x00\xb2\xdc\
+\x7b\xad\x18\x93\xab\x06\x37\xc5\xfd\xfc\x0a\x60\x91\xc9\x02\x52\
+\x14\x70\x0e\x51\xc4\x2e\xb3\xac\xfe\xb7\x28\x42\x6b\x26\x90\x55\
+\x02\xd7\x2a\xe2\x5f\x6c\xfe\x18\x2a\x85\x2a\x42\x0a\x60\xc1\x82\
+\x8c\xc1\xff\xc6\xb7\x3f\x8f\xd7\x8e\x7f\x2f\x05\x3c\x98\x11\x78\
+\x12\xf5\xc9\x86\xee\x90\x61\xc6\xf1\x50\xe2\xa3\x00\xe0\xd8\x78\
+\x44\x08\x0c\x92\x24\x34\x67\x3c\xb8\x25\x17\xc2\x12\x7a\xff\xb1\
+\xd3\x13\x98\x99\x9c\xc5\xc0\xf6\x75\x70\x4b\x96\x61\xf1\xad\xe0\
+\xdb\xc2\x81\x25\x6c\xf8\x61\x13\xb3\x33\x63\xf0\xbc\x86\x79\x27\
+\x16\xb5\x02\xa8\x64\xfe\x21\x80\xa3\xee\xde\x8e\x4a\x05\x2b\xfb\
+\x56\xc6\xa9\x9f\xa1\x00\xa6\xeb\x37\xdc\x7d\xfb\x6a\x00\x9b\xcd\
+\xd2\xeb\x4c\xa0\xe3\xe5\x24\x0c\xe4\x65\x03\x89\x32\x6c\xbf\xea\
+\xa7\x50\x2d\xf7\x23\xd4\xa9\x5e\xd4\xf6\x91\x6f\xfd\x6f\x1c\x3a\
+\xfa\x7c\x02\x4a\x0c\xa0\xdf\x08\x30\x5b\x6b\x26\x67\xc0\xd8\x53\
+\x9b\xc2\x47\x55\x3e\xbe\xfd\x4e\xdc\xdc\xd3\x8d\xdd\x42\x44\xef\
+\x2d\xf0\x1b\x01\x1c\xd7\x86\xb0\x85\xf6\x04\xb3\x53\x0d\xbc\xf6\
+\xec\x31\x0c\x6c\x5f\x8b\x4a\x6f\x19\x5a\x79\x33\xee\xbf\x52\xec\
+\x85\x1f\x36\x61\x5b\x61\xd6\xfa\x97\x84\x00\x02\xf3\x54\x80\x7f\
+\xf9\xef\xad\x7b\x10\xa7\x7e\x9b\xb7\x5e\x93\xaa\xfa\x69\x2f\xc0\
+\x06\xd4\xa2\x1d\xe8\xc6\x88\x1f\x53\x34\xe0\xc9\x7f\xd3\xfa\xd3\
+\x7c\x80\x5b\x14\x42\xad\xbb\xae\xff\x76\x6c\x5e\xf5\xee\x54\x91\
+\x87\x19\x78\xf8\x1f\x1f\xc0\x2b\x6f\x3e\xd3\x42\xf8\xbc\x19\x1f\
+\x4d\x23\xde\x33\xe1\x73\xdf\x79\x30\xfd\xc3\x0c\xb1\x22\x7c\xf4\
+\xf6\x4f\xe0\x33\x96\xc0\x7d\x00\x10\x06\x12\x42\x0a\x58\xb6\xa5\
+\x15\x29\x94\x12\x6f\xbe\x30\x84\x75\xd7\xf5\x61\xd5\x40\x35\xf1\
+\x30\xf1\xf5\x31\x03\x05\xa7\x8c\x20\x6c\x40\x0a\x17\xa3\xa3\x6f\
+\xa5\x6e\xc1\x52\x10\x40\x60\x9e\x0a\x20\x2c\xdc\xa9\x2c\x6f\xfd\
+\xe0\x55\x91\xfb\x8f\xfd\x7c\xaa\xde\x2f\x92\xa1\xde\x17\xf7\xdb\
+\x14\xca\xf2\xf5\xbf\x36\xd6\xaf\xb6\xb4\x72\x81\x15\x95\xf5\xb8\
+\x75\xe0\xa7\x75\x85\x0d\x00\x88\x19\xcf\xbe\xf4\x18\xf6\xbf\xfe\
+\x64\x6c\xf5\x89\x02\xcc\x4e\x35\x11\x34\x43\x7d\x06\x44\xf8\xe4\
+\x53\x0f\xe2\x2f\xdb\x9d\xe1\x53\x7f\x85\xcf\xdc\xf6\xf3\xd8\x67\
+\x09\xec\x56\x4f\x34\x4b\x96\x7a\x94\x93\xba\x3f\x6f\x1d\x1e\x45\
+\x63\xca\xc3\xda\x6b\x57\xc1\xb6\x2d\x23\x14\x30\x42\x19\xc0\x0f\
+\x9b\xb0\x44\x88\xe1\xe1\x53\xc9\xd5\x2f\xd2\x33\x00\x79\x72\xd1\
+\x0a\x70\xc7\xdd\xa8\x82\xc4\x5d\x0c\x46\xff\x86\x75\xb0\x1d\x2b\
+\x72\xff\x40\xae\x17\x50\x92\xe2\x00\x73\x8c\x08\x49\x07\x02\x93\
+\x13\xe4\x29\x42\x2b\xf0\x0c\xa0\x60\x97\xf1\xe1\x6d\xbf\x85\xec\
+\x5e\xcf\xbd\xf4\x18\xbe\xf1\xe4\x9f\x40\x73\x84\x18\xfc\xc6\xb4\
+\xa7\xc1\x67\xc6\x24\x33\x3e\x3d\x17\xf8\x4a\x9e\x7e\x10\x5f\x7f\
+\xef\xc7\x70\xdc\xb1\xb1\x5b\xc4\xaf\xbe\x4d\xba\xac\x13\x99\x78\
+\x6b\x0a\x8d\x69\x0f\x03\x37\xf5\xc3\x2d\x39\xc9\xf7\xfa\xd3\xf0\
+\x83\x06\xc0\x16\x26\x27\xce\x99\x97\xbd\x24\xee\x1f\x98\xdf\x4b\
+\xa2\x76\xaa\x54\x69\xf5\xfa\x35\xf1\xb3\xed\xf1\xa3\xce\xe6\xbb\
+\x6e\x28\xfd\xd8\xb3\x8c\x07\x66\x46\x4f\xc4\xaa\x5f\xc3\x4a\xda\
+\x49\x0e\xe3\xed\xc6\x23\xd3\xea\xb8\xf1\x7a\x49\xa1\xd1\x5e\x26\
+\xbf\xac\x95\x79\xd4\x7a\xd7\xd6\x5f\x44\xc1\x29\xa5\xea\x00\x47\
+\x4f\x1e\xc0\xc3\xff\x7c\x7f\x94\xb6\x11\xc7\x2f\x5c\x62\x34\xa6\
+\xd2\xe0\x87\x12\xbb\x2e\x04\x7c\x25\xcf\x7e\x19\xfb\x6a\x53\xd8\
+\xc5\x3c\xf7\x3e\xcd\x69\x0f\x6f\xbe\x30\x84\xa9\xb3\x33\x49\xc8\
+\xf1\x67\xe1\x85\x0d\x8c\x8c\x9c\x4e\xb5\x5d\x2a\x02\x08\xcc\xc3\
+\x03\x08\x81\x3b\xd4\x18\x8f\xde\x55\x55\x10\xc5\xd6\xaf\xea\xfd\
+\xba\x07\x50\x2d\xeb\x3d\x2f\xe2\x5b\x8c\xe8\x9f\xc3\x07\xb2\x79\
+\xbf\xf6\x01\xcc\xd8\xbe\xe1\x43\x18\x58\xb1\x1d\x92\x02\x3d\xf0\
+\x62\x64\xec\x04\xfe\xec\xe1\xdf\x32\x58\x7d\x64\x81\xcd\xba\x8f\
+\xc0\x33\xc0\x0f\x9c\x0f\x78\x6f\x6c\x3f\x78\xcb\x2d\x70\x2f\xe2\
+\x64\xb1\xf7\xd1\xbd\x75\x00\xbf\xfc\xbe\x8f\xe3\x80\xb0\xf1\x47\
+\xed\xda\xc9\x90\x70\xf2\xc0\x08\xfa\x06\x7b\xb1\x6a\xa0\x8a\x90\
+\x7c\x34\xbc\x19\x8c\x8e\x9c\x49\xb7\x5b\x22\x02\x08\xcc\x43\x01\
+\x88\xb0\xd3\x12\x8c\xae\xde\x2e\x14\x3a\x8a\xd1\x03\x1e\x22\x9d\
+\xf6\xa5\x47\xfb\x9a\x7d\x00\x17\xa0\x04\x6c\x06\x81\x3c\x45\xc8\
+\x84\x00\x24\x0a\xd1\x55\x5c\x85\x5b\xae\xfa\xc9\xf8\x81\x8e\x00\
+\x92\x42\x4c\xcd\x8c\xe3\xf3\x0f\xff\x0e\x66\x1b\xd3\x29\x06\x1e\
+\x78\xd2\xb4\xfc\xa9\x60\xaa\xfb\xdf\xce\x1c\x1d\x38\x03\xf8\x6b\
+\xe6\x3a\xbd\x72\xb9\x0c\x29\xa5\xb4\x2c\x8b\x3d\xcf\x23\xdf\xf7\
+\xe5\x0d\x37\xdc\xc0\xae\xeb\xd2\x5b\x2f\xd4\xff\x7c\xcd\x2d\xc7\
+\x5e\xb5\x0b\xf2\x2b\x42\xa0\xa7\xdd\x31\x46\x8f\x4f\xa0\x39\xed\
+\xa1\x7f\xeb\x2a\xcc\x7a\x35\x8c\x8f\x9d\x4b\x6d\x5f\x8c\x87\x40\
+\xdb\xc9\xc5\x7b\x00\x60\x07\x33\xa3\xab\xa7\xd3\x00\x3f\x1b\xfb\
+\xa3\x96\x2d\xa0\x73\xbb\xa2\x50\x4e\x0a\xd8\xd6\xf2\x8d\xf6\x19\
+\x25\xb8\x63\xeb\x3d\xb0\x2c\x3b\x7e\xc0\x23\x44\x28\x7d\xec\xfe\
+\xfa\x7f\xc5\xe9\xb3\x6f\xa6\x88\x59\xe8\xcb\x54\x75\x4f\x4e\x57\
+\x7f\xb3\x79\x72\xd3\x49\xc7\x41\x57\xde\x35\x5b\x96\xc5\x42\x08\
+\x96\x52\x4a\x22\xa2\x30\x0c\xc9\x75\x5d\x59\x2a\x95\xd8\x75\x5d\
+\xe9\x79\x1e\x09\x21\xa8\xb7\xb7\x97\x66\x0e\x57\x9e\x2b\x0f\xbe\
+\x79\x7b\xa1\xbb\xfe\xa0\x10\xb8\xa9\xdd\x7d\x9c\x3e\x37\x0b\x7f\
+\xff\x19\x6c\xbc\xce\x46\x7d\x6a\xc6\xbc\xec\x3d\xed\xf6\x59\x0c\
+\x99\x77\x1d\xa0\x52\xed\xd4\xe9\x9f\x06\x9a\xb3\x63\xfb\xc5\xbc\
+\x43\x80\xde\x6d\xae\x1a\x80\xde\xce\xd8\xb6\xee\xfd\xe8\xeb\x1c\
+\xd4\x75\x75\x62\x89\x6f\x3e\xfd\x45\x1c\x78\xe3\xa9\x54\x9e\x4f\
+\x92\xe0\xcf\x26\xcf\x17\xc8\x99\xce\xcf\x34\x87\xae\x3e\x60\x59\
+\x28\x67\xcf\xc2\xb2\x2c\x0a\xc3\x90\x00\xb0\x65\x59\x92\x99\x45\
+\x18\x86\xd2\x71\x1c\x61\x59\x96\x08\x82\x80\x5c\xd7\x85\xeb\xba\
+\xc2\x71\x1c\xe1\x79\x9e\x70\x5d\x57\xd4\x8f\x6e\x3e\x15\xac\x19\
+\xfb\xc9\xca\x9a\x33\xbf\x27\x6c\xfe\x78\xbb\xab\xf4\xea\x3e\xde\
+\xd8\x7b\x2c\x7b\xe9\x4b\x66\xfd\xc0\x25\x28\x40\x67\x4f\x87\xf1\
+\xa0\x47\xb6\xf2\x97\x0f\xfc\x9c\x61\x20\x65\xf1\xd9\x39\xd6\x8b\
+\x8a\xf1\x9b\x75\x01\xd7\x2e\x61\xfb\x86\x0f\x46\xe0\x83\xc1\x4c\
+\x38\x36\x74\x10\x7f\xfb\xad\xff\x99\x4a\xbb\x54\xe1\x46\x79\x02\
+\x39\x5b\xfe\x42\xf3\xe4\x75\xff\x24\x04\x4a\xfa\x1c\x23\x4b\x67\
+\x21\x04\x01\x20\xcb\xb2\xc8\xb2\x2c\x0a\x82\x40\x10\x91\x74\x1c\
+\x07\x52\x4a\x10\x91\x90\x32\x2a\x7d\x87\x61\x08\x22\x12\xc5\x62\
+\x11\x9e\xe7\xa1\x50\x28\xa0\xf1\x56\xef\x4c\x38\xba\xfa\xd7\xbb\
+\x6e\x38\xf8\x8c\xed\x86\x7f\x72\xa1\xf7\x95\x96\xa0\x0b\xd8\x94\
+\x79\x2b\x40\xb9\x27\xae\xfd\xb7\x8d\xff\x66\x21\x28\xd9\x9e\x57\
+\xf7\x69\x15\xa3\x62\xa6\x77\x48\x77\x10\x99\x65\xe0\x1f\xdd\xf4\
+\x53\x10\xb0\x10\xc8\x26\x18\x8c\x99\x7a\x0d\x9f\xff\xda\x7f\x06\
+\x91\x7e\xb6\x2e\x8a\xfb\xcd\x10\x24\xa3\xfd\xc8\x77\x9f\x6e\x1e\
+\xdf\xf6\x7f\x81\x84\xf0\x09\x21\x98\x88\x48\x08\xc1\x96\x65\x09\
+\x22\x12\x96\x65\x81\x23\x11\x8e\xe3\x58\x52\x4a\x76\x1c\x87\xe3\
+\x30\x60\x85\x61\xc8\x85\x42\xc1\x0a\xc3\x50\x12\x91\x88\x15\x43\
+\x54\x2a\x15\xd1\x6c\x36\x45\xe3\xf5\xed\x5f\x2e\x0f\x1c\xdc\x6f\
+\x55\x9a\x8f\xcf\xc5\x0b\x8c\x5b\xb5\x64\x19\x00\x70\x09\x0a\x60\
+\xd9\x88\x0a\x1f\x0a\xec\x54\xe7\x4f\xba\x18\xd4\x3e\xf6\x9b\x92\
+\x63\xfb\x59\xf7\x8f\x84\xf0\xa9\xf5\x6b\xba\x36\x63\xe3\xca\x9b\
+\x10\xc8\xa6\x5e\xf7\x8d\x7f\xfe\x3c\xc6\x6b\x67\x92\xfd\x19\x90\
+\x81\x8c\xde\xb6\x09\x80\xa4\x75\xa4\x39\x74\xf5\x1f\x33\x73\x21\
+\x3a\x45\xc1\x06\xf8\x82\x22\x11\x96\x65\x81\x88\x98\x99\xd9\x75\
+\x5d\x26\x22\xb8\xae\x2b\xc2\x30\xb4\xd4\x32\x33\x0b\x05\x3c\x11\
+\x09\x00\x30\x15\x21\x0c\x43\x71\x66\xff\x86\x03\xab\xae\x1d\xdf\
+\x56\x58\x31\xfe\xf7\x73\xf1\x02\x66\x4c\x3e\xf5\x20\x8e\xa3\x6d\
+\x89\x74\xe1\x65\x5e\x0a\xe0\xb8\x36\x88\xc3\xa4\xf0\xa3\xc2\x40\
+\xbc\x14\x4d\xcc\x2a\xa0\xb1\xfe\xbc\x92\x93\x03\xe8\x8a\x5f\xb2\
+\xac\x96\xae\xef\x7f\x1f\x82\xb0\xa9\x43\xcb\xeb\x47\xbe\x8f\xa7\
+\xf7\x7e\x3d\x89\xfb\x00\x98\x18\x61\x10\xbf\x81\x44\xa2\x1e\x8c\
+\xae\xfb\x1c\x35\x2b\x1e\x00\x37\x06\x9f\x0c\xf0\x95\xd5\x4b\x66\
+\x16\x00\x84\x65\x59\x16\x11\xb1\x6d\xdb\x4c\x44\x31\xf5\x88\x80\
+\x2f\x14\x0a\x42\x4a\x89\x62\xb1\x28\x82\x20\x10\xe5\x72\x59\x78\
+\x9e\x97\x02\x6f\xc5\x8a\x15\x98\x78\xd3\x9e\x2a\x16\x37\xbc\xb7\
+\xfa\xae\x03\x7f\x20\x6c\xfe\xf5\x36\x97\xfe\x32\x12\xf0\x97\x44\
+\x09\xe6\xa5\x00\x1d\x3d\xe5\xb8\xfc\x0b\x20\x87\x03\x9c\xef\xa1\
+\xcf\xd6\x05\xce\x99\xa4\x2b\x82\x2d\xd5\x40\x06\x06\x56\xde\x84\
+\x6a\xc7\x5a\xf8\xb2\x09\x01\xa0\xd1\xac\xe3\xa1\xc7\xfe\x58\xbb\
+\x79\x93\xf5\xab\xc3\xc9\x46\xf7\x97\xc3\xf1\xfe\x13\x42\xc0\x89\
+\x9a\x44\x55\x8d\xd8\xda\xc9\xb6\x6d\x41\x44\x82\x99\x85\xc8\xf0\
+\x15\xdf\xf7\xe1\x38\xc9\x2d\x8b\x15\x04\x00\xe0\x79\x1e\x5b\x56\
+\x7e\x5d\x6d\x7c\x7c\x1c\xb6\x1d\xfd\x34\x43\xfd\xf0\x0f\xfd\x4e\
+\xf9\xda\xef\xef\xb7\x6c\xfa\x43\x21\xd2\x3f\xfe\xc8\xad\xf1\x7f\
+\xd1\x95\x60\x5e\x0a\x10\x55\xd3\xa2\x87\x3d\x85\x40\x8b\x27\x50\
+\xa7\xdc\x02\x7c\x4b\x69\x38\x5e\x9d\x3e\xba\x19\x03\xd2\x54\x30\
+\xa3\x04\x5b\x56\xff\x48\x0c\x7e\xf4\xbd\x4f\x3c\xfb\x37\x18\x9f\
+\x3c\x9b\xca\xf7\x49\xb2\x2e\x00\x51\xe0\x1c\xf0\x4e\x6e\xfd\x3b\
+\x00\x1a\x60\x21\x84\xc5\x26\xb9\x88\x4f\x6f\x2e\x45\xd0\xd7\x20\
+\x12\xaa\x1b\x7b\x00\xae\xd7\xeb\x29\x25\x51\x62\xdb\xb6\x6e\x3b\
+\xf4\xcc\x55\x7f\xb5\xf1\xd6\xd3\x2f\xa3\x14\x7e\x4d\x08\x0c\xe8\
+\xe3\x2d\x71\x06\x00\x5c\x02\x07\xd0\xcf\xf9\xb7\xed\x05\x4c\xc6\
+\x03\x5e\xc8\x03\x21\xa6\x70\xca\x15\x64\xea\x01\xb1\xfb\xdf\xd0\
+\x7b\x03\x1c\xab\x80\x20\x6c\x00\x42\xa0\x56\x3b\x87\x67\xbf\xf7\
+\x0f\xf1\x8f\x2a\x25\x5e\x42\xbf\x64\x41\xa2\xee\x0d\x5f\xf5\x00\
+\x62\xf0\x81\xc8\x82\x0d\x25\x60\x66\x56\xdb\xce\x6b\x75\xbe\xef\
+\xb3\xb2\x6a\x20\xf2\x00\x8e\xe3\xb0\x65\x45\xa3\x24\xea\xf5\x3a\
+\xbb\xae\xcb\x8e\xe3\xb0\x09\xfe\xc8\xc8\x08\xdb\xb6\x8d\x73\x07\
+\xb7\xee\xeb\xb9\xf6\xc4\xad\x6e\xa5\xfe\x35\x61\xe1\x0e\x00\x20\
+\x5e\x5a\x02\x08\x5c\xaa\x07\x50\xb9\xbe\x31\x02\xc8\x04\x3f\x95\
+\x1a\xa6\x64\x8e\xde\xa0\xcc\x3a\xce\x2a\x41\x6c\xad\x83\x2b\x6f\
+\x86\x2f\x1b\xd1\xe8\x1e\x21\xf0\xed\xa7\x1e\x46\xb3\x59\x47\xd2\
+\x84\xc1\xc9\x60\x1e\xc8\x46\xf7\x57\x68\x66\xe5\xa8\xe9\xb6\xf5\
+\xd9\x08\xa1\x98\x25\x0b\x21\x98\x99\x85\x94\x52\x81\x99\x3a\xb1\
+\x20\x08\xd8\x71\x1c\x96\x52\xc2\xb2\x2c\x0e\x82\x80\x14\xf0\x0a\
+\x7c\x35\xcd\x8a\xeb\xba\x6c\x4e\xfd\x93\xd7\x4d\x3c\xb7\x77\xef\
+\x8f\xbd\xef\xe3\xf8\x05\x16\x38\xfe\xf4\x97\x71\x3c\xf3\x7d\x97\
+\x27\x07\x30\xd3\xb0\xa4\x20\xa3\xb6\xa9\xc2\x90\xfe\x87\x64\xee\
+\xfc\x9e\x20\xaf\x37\x30\x9b\x12\xae\xed\xd9\x1a\x5b\x85\x64\x98\
+\x50\x00\x00\x0d\x37\x49\x44\x41\x54\xbf\x07\x21\x04\xa6\xa7\x26\
+\xf1\xf2\x81\xe7\x92\x22\x91\xe1\x01\x00\x80\xa5\x38\xeb\x9d\xdc\
+\xfa\x0d\x66\x4e\x05\x69\x03\x78\x00\x80\x65\x59\x3a\x58\x65\xdb\
+\xc5\x40\x93\x94\x52\x83\x1c\xa7\x8b\xac\x42\x41\xa3\xd1\xd0\x16\
+\xaf\x14\xa2\x56\xab\x71\xa1\x50\x60\xc7\x71\x38\xb6\xfe\x16\x50\
+\xbf\xf3\x25\x7c\x31\xfb\x9d\x4b\x25\xf3\x52\x00\xbf\x11\xe6\x74\
+\x7b\x2a\x88\x5b\x6b\xf9\xe9\xb9\x8b\x14\xce\xce\x32\x56\x75\x0e\
+\x20\x90\x4d\x08\x11\x3d\x4f\xff\x9d\x67\x1e\x8b\x5f\xbc\x94\x7f\
+\x88\x70\xbc\xff\x81\x76\xe0\xc7\xe9\x1f\x0b\x21\x74\xca\xa7\x2c\
+\x5f\xd5\x04\xe2\xc2\x90\x06\x5a\xcd\xfb\xbe\xcf\xae\xeb\xb2\xe7\
+\x79\x5c\x28\x14\x48\x79\x0d\xcb\xb2\xd8\x75\x5d\x52\xca\xe0\x38\
+\x0e\x9b\xd6\x5f\x28\x14\xb8\x5c\x2e\xf3\xde\xbd\x7b\xb3\x1e\x66\
+\x49\xad\x1f\x98\xb7\x02\x04\xfa\x66\x27\x36\xdd\xca\xdd\x17\x4c\
+\x8c\x83\x76\x14\xaa\xa8\x14\xaa\xf1\x40\x0a\x0b\xbe\xef\xe3\xe0\
+\xc1\x17\xdb\xee\x4a\x81\x73\xc0\x1f\x5d\xff\x8a\xc9\x40\x33\xe0\
+\x93\x4a\x05\x39\x22\x05\x0a\x68\x62\x66\x64\xb7\xd9\xb6\x4d\x61\
+\x18\x92\xe3\x38\xa4\x52\x42\x05\xba\x65\x59\x6c\xdb\x36\xc7\xf1\
+\x1f\xca\xfa\x01\x1d\xfb\x19\x00\x0c\xf0\xcd\x2b\x5c\x72\xf0\x81\
+\x4b\x20\x81\xcc\x9c\x7e\x97\xb3\x16\xa3\xe2\x37\xc7\xf8\x8f\x39\
+\x8f\xdd\x32\x93\xac\xe8\xeb\x8a\xad\x1f\x16\x84\xb0\xf0\xca\xc1\
+\xbd\x73\x1e\x4b\x4e\xf6\x7d\x35\x75\x76\x6d\xc0\x27\x22\x8a\xd2\
+\x7d\x62\x29\x25\xdb\xb6\xad\xd7\x2b\x97\x1e\x86\x21\xd9\xb6\xcd\
+\xb6\x6d\x53\x6c\xfd\xe4\xfb\x3e\x15\x0a\x05\x52\xee\xbf\x5e\xaf\
+\x73\xb1\x58\xa4\x7a\xbd\x4e\xa6\xf5\xdb\xb6\xcd\xca\xfa\x33\x97\
+\x9a\xbd\xca\x25\x0d\x05\xf3\x56\x80\xfa\xf8\x2c\x2a\xbd\x1d\x29\
+\xa0\x23\x89\xce\xdf\x2c\x02\x5d\x64\x12\x60\x1e\x26\x3b\x8b\x8e\
+\xd8\xfa\x95\xfb\x3f\x74\xe8\xfc\xd6\xaf\x88\x9f\x02\x9f\x99\x29\
+\x76\xf5\x04\xc3\xd5\xab\x29\x00\x8a\x95\x80\x98\x59\x5b\x3c\x00\
+\x8e\xe7\xd9\xb6\x6d\x12\x42\xb0\xe3\x38\x64\xba\x7d\x29\xa5\x76\
+\xfd\xc5\x62\x91\x5c\xd7\xe5\x91\x91\x11\x2e\x95\x4a\x79\xae\x3f\
+\x21\x52\xad\x97\xba\x24\x32\x6f\x05\xf0\x1b\x21\x3a\xaa\x46\xba\
+\x26\xd2\x7a\x60\xa8\x81\x91\x5d\x5f\xc0\x81\xb9\xed\x02\x3a\x8b\
+\x2b\x41\x24\xe1\x73\x13\x16\x2c\x4c\x4e\x4c\xa0\x36\xd1\xfe\xe1\
+\xd9\x70\xba\xf7\xef\xd4\xbc\x10\x82\x8c\x78\xaf\x80\x66\xc3\xf2\
+\xc9\xb0\x78\x22\x22\x92\x52\x32\x11\x91\xe3\x38\x14\x04\x01\xbb\
+\xae\x4b\x00\x48\x31\x7f\x35\xf5\x3c\x8f\x5c\xd7\x25\x95\xfa\xe5\
+\xb9\xfe\x0b\x88\xfb\xef\x1c\x12\x08\x00\x63\x27\x27\xd1\xb9\xb2\
+\x03\xb6\x1b\x71\xab\xe8\x6d\xad\x22\xd7\x1b\xb4\x5b\xbc\x58\x29\
+\xb9\x5d\x51\xec\x8f\xdd\xff\x29\xe3\x5d\xfa\x59\x61\x29\x46\x82\
+\x33\x03\xcf\x03\x10\x79\xe0\x2b\xc0\x2d\xcb\x62\x13\x7c\x33\x1c\
+\x00\x90\xaa\xbd\xe3\x38\x32\x0c\x43\x92\x52\x92\x6d\xdb\xac\x5c\
+\xbf\xe7\x79\x54\x2c\x16\xc9\x24\x7e\x85\x42\x81\x1c\xc7\xe1\xf1\
+\xf1\x71\x52\xae\xff\x3c\x71\xff\x6d\x01\x1f\x98\xc7\x98\x40\x35\
+\x60\xa1\x39\xe3\xe3\xf8\xf7\xdf\x8a\x9e\x9c\x61\xe8\x41\x96\x6c\
+\x8c\xb7\x53\x63\x07\x2f\xe9\x63\x1c\xcf\xb1\x0a\x08\x82\x26\xfc\
+\x30\xfa\xbc\x75\xea\x74\xdb\xf3\x94\x5e\xf9\xdb\x39\x4c\x3f\x05\
+\x7e\x2c\x32\x26\x79\xa9\xa9\x1a\xf8\x11\x7b\x07\x19\xc7\x7f\xfd\
+\x71\x1c\x87\x3c\xcf\x23\x15\x02\x9a\xcd\x26\x39\x8e\xc3\x33\x33\
+\x33\x34\x47\xdc\xe7\xcc\x07\x78\x1b\xc1\x07\xe6\xa1\x00\x34\x8e\
+\x9f\xe6\xb8\x64\xa9\x94\x20\xf4\xe5\x1c\xe0\x29\xe5\x40\xeb\xe5\
+\xe7\x7c\x98\x11\xed\x93\x51\x22\x4b\x44\x0f\x9e\x2a\xf0\x9b\xcd\
+\x59\x4c\x66\x86\x52\x99\x12\x9c\x5b\xf3\x2d\x20\xd5\xc5\xab\x40\
+\x97\xa6\xb5\x5b\x96\x95\x0b\xbe\x94\x52\x2a\xc6\x6f\x59\x16\xd9\
+\xb6\x4d\x41\x10\x90\x6d\xdb\x24\xa5\x94\x0a\x78\xd7\x75\xa9\xd9\
+\x6c\x52\xa1\x50\xa0\x99\x99\x19\x6d\xf1\x63\x63\x63\x94\x49\xf9\
+\xcc\x9f\x3d\xbb\x2c\xc0\x07\xe6\xa1\x00\x4f\x3f\x8e\x49\xbf\x89\
+\xf7\x73\x5c\xb6\x6c\xce\xf8\x78\xf3\x85\x21\x34\xa6\xbd\x18\x30\
+\x64\x3e\x0c\x50\xf4\xe1\x0b\xf8\x80\xa2\x1d\xb3\xc7\xb1\xe0\x68\
+\xf0\xfd\xa0\x81\xf1\x73\xa3\x90\x24\x73\xcf\x91\x42\xeb\xa8\x9c\
+\x5a\x71\x86\x88\x74\x8c\x37\x40\x37\xdd\x7f\xca\xed\x2b\x25\xb0\
+\x6d\x5b\x1a\x40\xcb\x30\x0c\x55\xdc\xa7\x20\x08\x48\x8d\x07\x54\
+\x71\xbf\x50\x28\x50\xad\x56\x63\xdb\xb6\xb9\x5c\x2e\xd3\x3b\x05\
+\x7c\x60\x7e\xbf\x1e\x2e\x4e\x1d\x82\x77\x62\x3f\xfe\xcf\xc6\x1b\
+\x31\x28\x2c\x6c\x67\x62\x4c\x8f\xd6\x51\xe9\x2d\xc3\x76\x6d\x7d\
+\x69\xf3\x21\xff\xa6\xe8\x0a\x23\x03\x8e\x5d\x40\xf4\x1c\x7f\x34\
+\xfc\x7b\xe4\xd4\x19\xd4\xce\xe5\x13\x40\x9a\xed\xfc\x9a\x9c\x5a\
+\x75\x58\x55\xea\x60\x90\x3d\x66\xa6\xb8\xdc\x2b\x11\x8f\xf8\x61\
+\x66\x1d\xf3\x2d\xcb\x62\x29\xa5\x62\xf3\x32\x9e\x97\xae\xeb\xca\
+\x78\x38\x18\x79\x9e\xa7\x52\x3f\x72\x5d\x97\xa6\xa7\xa7\xb9\x50\
+\x28\x50\xb9\x5c\xa6\x91\x91\x11\x2e\x16\x8b\x73\x81\x7f\x59\x00\
+\xaf\x64\x5e\x0a\x80\xf8\x5d\x2a\x9d\xf2\x86\xc7\x3a\xfa\x47\x07\
+\x85\x30\x95\xa0\x04\xdb\xb5\x21\x72\xdc\xfb\x05\xa9\x44\x3c\x64\
+\xdb\xbc\x55\x0c\xc0\x16\x6e\xdc\x07\x11\x3d\x0f\x70\xea\xcd\x53\
+\xf0\x9b\x7e\xee\x21\xfc\xf1\x55\x5f\x08\x67\x3a\x26\x54\xff\xbd\
+\x4a\xf9\x0c\x2b\x6f\xf1\x00\xcc\x2c\x2d\xcb\xd2\xc0\x0b\x21\x64\
+\x3c\xaf\x99\xbf\xeb\xba\x8a\xf4\x49\x05\x7e\xbd\x5e\x27\x13\xfc\
+\x52\xa9\x44\xef\x14\xf0\x81\x05\xf8\xf5\xf0\x13\x4f\x0d\xfc\x0a\
+\x13\x1e\x04\x92\x71\xef\xcd\x19\x3f\x27\x14\xe0\x82\x42\x40\xee\
+\x7e\xcc\x08\x42\x0f\x7e\xd0\x84\x17\x34\xe0\x05\x0d\xd4\xa7\xeb\
+\xb9\xe7\xc3\x52\x8c\xc8\xf1\x75\x6f\x98\xe0\xe6\xb9\x7a\xb5\x2e\
+\x1e\xec\x29\xd5\x00\x50\xc7\x71\x64\x4c\x01\x64\xec\x01\x64\x18\
+\x86\xb2\x50\x28\x48\x45\xfa\xb2\xe0\xab\x3a\x7f\x06\xfc\x3c\xe2\
+\x77\xd9\xc9\x7c\x14\xa0\xe5\x62\xea\xaf\xde\xf2\xab\x4a\x09\x28\
+\x24\x0c\xbd\x32\x82\xe6\x8c\x37\xff\x6c\xa0\x45\x31\x00\x29\x43\
+\x04\xa1\x87\x20\xf0\xd0\x68\xd4\xf5\x6f\xe9\x64\x85\xa4\xbb\x2f\
+\x76\xfd\x52\x81\x6c\x12\x3f\x05\x38\x11\x49\xcb\xb2\xa4\x22\x7c\
+\x14\x0d\xf8\x94\x8a\xf4\x29\xf0\xb3\x8c\xdf\xf7\x7d\x19\x97\x7b\
+\xb5\xe5\x8f\x8f\x8f\x53\x0e\xf8\x79\x8c\xff\xb2\x93\xf9\x84\x00\
+\x20\xf2\xe5\xa2\xaf\xaf\x4f\x00\x40\xad\x56\x13\x62\x6a\xf0\xf1\
+\x52\xdf\xd9\x01\x61\xe1\x26\x26\xc6\xf4\xb9\x59\x74\xf4\x94\xa2\
+\x3a\xc1\x05\x66\x00\x73\xde\x2a\x16\x71\x96\xc0\x68\x4c\x37\x31\
+\x3d\x96\xef\x01\x68\xb6\xf2\xb7\xc1\xe4\x8a\x37\x28\x1a\x10\xaa\
+\x7a\xec\x74\x9c\x37\x5d\x3e\x00\x56\x20\x4b\x29\xa5\x10\x42\x15\
+\x81\xa4\xaa\xfe\x49\x29\x65\x10\x04\xd2\x71\x1c\x52\x85\xa0\xd9\
+\xd9\xd9\xf3\xb9\xfd\xcb\x8e\xec\xb5\x93\x4b\x7a\x45\x4c\xb9\x5c\
+\x66\xdf\xf7\x75\x60\x1f\x79\x71\xeb\xaf\xad\x7e\xcf\xeb\xc2\xb2\
+\xf8\x63\x14\x12\x4e\x1d\x3a\x8b\xf5\xd7\xf7\xa1\x58\x31\x9f\xb4\
+\x9a\x8b\x07\xb4\xa9\xff\x66\xc4\x7c\xa8\x23\x2b\xe1\xd4\x8a\x97\
+\xd4\x18\x7e\xd5\x7b\x97\x8d\xf3\x8a\x10\x2a\x97\xaf\x72\x7c\x19\
+\x8d\xf3\xa6\x30\x0c\xa5\xeb\xba\x2a\x0c\x10\x33\x93\x4a\xf7\x1a\
+\x8d\x46\xae\xdb\x3f\x74\xe8\x90\x02\xbe\xcd\x05\x5d\x9e\x32\x5f\
+\x0e\x90\xb2\x55\x95\xfb\xda\xb6\xcd\xde\xeb\xef\xf9\x35\x96\xe2\
+\x4f\x81\x68\x34\xce\xd0\x2b\x23\x98\x3a\x5b\x8f\x73\xfb\xf3\xf1\
+\x00\x24\x1f\xb3\xb8\x64\x84\x05\x22\xd2\xa3\x7b\x5b\x4e\x8a\x30\
+\x13\x4e\xae\x3c\x4d\x11\xf3\x93\xca\xfd\x2b\xb7\x6f\x56\xf9\xcc\
+\x14\x4f\xb9\xfb\x78\x39\x05\x7e\x10\x04\xd2\xf7\x7d\xe9\xfb\xbe\
+\x2c\x97\xcb\xb2\x9d\xdb\xc7\x85\xfb\xb2\xcb\x4a\x2e\x25\x04\x60\
+\x78\x78\x58\xf4\xf7\xf7\x8b\x20\x08\x44\x47\x47\x87\x00\x80\x7a\
+\xbd\x2e\xc4\xd4\xc0\xb7\x9d\xea\xe8\x29\x61\xd3\xbf\x02\x80\xfa\
+\x64\x13\x4e\xc1\xd6\x2f\x56\xba\x60\x69\xc9\x06\xa2\x99\xda\xd9\
+\x99\xd4\xb3\xfc\xba\xb9\xb4\x0f\x06\xe7\xfa\xff\x5e\xb9\x7d\x95\
+\xf3\x23\x0a\x05\x2a\xc7\x57\xe5\x5c\x5d\xd0\x51\x4a\x10\x33\xfd\
+\x14\xf8\xae\xeb\x12\x11\xf1\xec\xec\xac\xee\xe8\x19\x1b\x1b\xe3\
+\x52\xa9\x44\x3d\x3d\x3d\xb4\x7f\xff\x7e\x1e\x1e\x1e\xbe\xac\xaa\
+\x7b\x17\x23\x97\xe2\x01\x00\x80\xcb\xe5\x32\xbb\xae\xab\x07\x3c\
+\x28\x99\x7a\x75\xdb\x97\xc8\x77\xf4\xf0\xe7\xd1\xe3\x13\x98\x1e\
+\xab\x5f\x58\x26\x90\x47\x1e\x0d\x0f\xd1\x8e\x00\x72\xe8\xbc\x6e\
+\x5a\xbe\x22\x7d\x79\x4c\xdf\x8c\xfd\x26\xf8\x46\xc1\x47\xc6\xdd\
+\xbd\xb2\xd1\x68\xe4\x5a\x7e\x1b\xb2\xf7\x8e\x01\x1f\xb8\xb4\x34\
+\x50\x5f\x68\xa1\x50\xe0\xe1\xe1\x61\x1d\x06\x6a\xb5\x1a\x3b\x8e\
+\xc3\x93\x07\xaf\xff\x32\x79\xce\x6f\xa8\x76\xa3\xc7\x27\x31\x3d\
+\x36\x3b\x8f\x2c\x80\xe3\x57\xb2\x47\x1f\x35\xec\xbb\xe5\x84\xc8\
+\x7e\x4b\x01\x1e\x13\xbf\x30\x1e\xdf\x2f\xb3\x4c\x3f\xab\x04\xca\
+\xf2\x0b\x85\x82\x34\xc1\xcf\xcb\xf3\x7b\x7a\x7a\xc8\x88\xf9\xef\
+\x48\xe0\x95\xcc\x37\x04\x28\x11\xc3\xc3\xc3\x62\x74\x74\x14\x7d\
+\x7d\x7d\xa2\x56\xab\x89\x4a\xa5\x22\x88\x48\x34\x1a\x0d\x14\x8b\
+\x45\x31\x33\xdc\xfb\x4a\x79\xe5\xc4\x29\xe1\x44\xe1\x60\xb6\xd6\
+\x84\x5d\xb0\x51\x28\xb9\x6d\xb2\x80\x36\xf7\x31\xe6\x04\x60\x60\
+\xfc\xf4\x54\x6e\x93\x70\xa6\xe7\x2f\xe5\x74\xcf\xe9\xf8\x48\x9a\
+\xe8\x31\x33\xd9\xb6\xcd\x79\x4c\x1f\x80\x0e\x07\xf1\x53\xbe\xb9\
+\xe0\x8f\x8d\x8d\x51\xb1\x58\xe4\x9e\x9e\x1e\x7a\x27\xa5\x79\xe7\
+\x93\x4b\x7d\x55\x2c\x23\xfa\x69\x5f\xab\x50\x28\x70\xdc\x67\xce\
+\x00\xc8\xf3\x3c\xcb\x71\x1c\x26\x22\x6e\x1e\xbd\xf9\x2b\xa5\x2d\
+\xdf\x87\xe5\x86\xff\x0b\x00\xce\x9d\xac\x01\x8c\xf8\x0d\x5a\x6d\
+\x8e\x9a\x59\xe0\xdc\x6d\x69\xa1\xa9\x15\x87\x62\x26\x0f\x55\x06\
+\x76\x1c\x87\x85\x10\x7a\x34\x8f\x62\xfa\xaa\x63\x27\x0c\x43\x09\
+\x80\x62\xb6\x2f\x7d\xdf\x97\xcc\x4c\x59\xf0\x5d\xd7\xbd\xe2\xc0\
+\x07\x2e\xbd\x12\xa8\x6f\x82\xe2\x02\x23\x23\x23\x0c\x44\x99\x41\
+\x3c\x30\x82\x9a\xcd\x26\xcd\xbe\xbe\xfd\xab\xd2\x77\x7e\x53\xed\
+\x78\x6e\xa8\x86\x99\xf1\xd9\xf3\xc7\x7e\x36\x32\x03\x32\x47\x23\
+\xb7\x4a\x38\xd3\x55\x73\x1c\x47\x3a\x8e\x23\x99\x39\x94\xb1\x30\
+\x73\x68\xba\x7c\xc5\xf4\x55\x85\xcf\x64\xfb\xd9\xf2\xee\x95\x0c\
+\x3e\x70\xe9\x21\x40\x89\x18\x1e\x1e\x46\x7f\x7f\xbf\x10\x42\x60\
+\x7a\x7a\x1a\xd9\x50\xe0\x79\x1e\x30\xb5\xe1\xa0\xd3\x35\x76\x08\
+\x0e\xed\x12\x02\xa5\xc6\x94\x07\xe9\x4b\x94\xba\x8a\xd1\x51\xda\
+\x50\x2a\xf3\x2e\x07\xcd\x10\xf5\x89\x46\xf6\xfb\xc1\x24\x0e\x37\
+\x47\x56\x7f\x35\xee\xf7\x97\xaa\xdf\x5e\x75\xee\x20\x76\xf5\xea\
+\xe5\x0e\xf1\x94\x3c\xcf\x23\x00\xd4\x0e\xfc\x4a\xa5\x42\x9d\x9d\
+\x9d\xef\xa8\xea\xde\xc5\xc8\x42\x29\x00\x03\x10\xa3\xa3\xa3\x29\
+\x25\xe8\xea\xea\x02\x11\x89\x52\xa9\x24\x84\x10\xf0\x3c\x0f\x98\
+\xd9\xf0\xa6\x28\x4f\xed\xb1\x0a\xc1\x47\x85\x40\x31\x68\x86\x08\
+\x7d\x89\x52\x67\xa1\xed\x91\xcd\xb1\x04\xa1\x17\x62\xb6\xe6\xb5\
+\xb6\x23\xeb\xa8\x9c\x58\xff\xb7\x0a\x64\xd5\x09\x24\x84\x90\x8a\
+\x07\x58\x96\x25\x55\xbf\xbe\x2a\xef\x16\x8b\x45\xe9\x79\x1e\x95\
+\xcb\x65\x39\x3b\x3b\x4b\xe5\x72\x99\x26\x27\x27\xa9\xd9\x6c\x72\
+\xa5\x52\x21\xa3\xb4\x6b\x16\x7a\xae\x08\xf0\x81\x85\x53\x00\x2d\
+\x79\x4a\xd0\x68\x34\x50\x2a\x95\x04\x33\x0b\xdf\xf7\x61\xcd\xae\
+\x3d\x9b\x52\x02\x2f\x84\x0c\x08\xa5\x4a\xa1\xbd\xf5\xc7\xcb\x32\
+\x20\x34\xa6\x72\x14\x80\x71\xca\x1f\x5b\xfb\x30\x33\xeb\xa1\xdb\
+\x88\x40\x23\xc7\x71\xc8\x5c\x97\x19\xcd\x4b\xe5\x72\x59\xce\xcc\
+\xcc\x50\xb1\x58\xd4\x69\x5e\xb9\x5c\xe6\x43\x87\x0e\x51\x26\xc7\
+\xbf\x62\x80\x57\xb2\xd0\x0a\xc0\x40\x7b\x25\x28\x97\xcb\x50\x9e\
+\x20\x4f\x09\xc2\x40\xa2\xd4\x59\x84\xea\x12\xe6\x9c\xdb\x2e\x7d\
+\x89\xc6\x74\xab\x02\x70\xe8\xfe\xcd\xec\xc8\x8a\xe7\x39\x7a\xda\
+\x57\x83\x1e\x04\x81\xb6\x7e\x65\xf5\x00\xf4\x78\xbe\x52\xa9\x44\
+\x59\xf0\x33\xa5\xdd\x2b\x16\x7c\x60\x11\x3c\x00\x12\x25\xe0\x4d\
+\x9b\x36\x41\x4a\xa9\x95\xc0\xf7\x7d\x6e\x36\x9b\x28\x95\x4a\x5a\
+\x09\xac\x8e\xa9\x27\x2c\x37\xb8\x4b\x08\x94\x42\x4f\x42\x06\x12\
+\xc5\x4a\x21\x39\x90\x72\x03\x86\x07\x68\xe6\x28\x00\x91\xfd\x3c\
+\xd7\xd6\x3f\x63\xdb\x36\x2b\xd0\x11\x2b\x42\xdc\x8b\x47\xcc\x4c\
+\xc5\x62\x51\x36\x9b\x4d\xdd\xa9\xc3\xcc\x54\xa9\x54\x28\x5b\xdd\
+\xc3\x0f\x00\xf8\xc0\xe2\x28\x00\x10\xdf\xb0\xe1\xe1\x61\x1e\x1f\
+\x1f\xc7\x86\x0d\x1b\x30\x3d\x3d\x8d\x9e\x9e\x1e\xd8\xb6\xcd\x9e\
+\xe7\xa1\x52\xa9\xc0\xf7\x7d\x34\x46\xbb\x47\x4a\x5d\x8d\x6f\x8b\
+\x82\xff\xd1\x44\x09\x28\x2a\x1b\xa7\x6e\x7d\xa4\x08\x32\x24\x34\
+\x67\x72\x3a\x83\xa4\x78\xd6\x1b\x5d\xfd\x0c\x33\x73\xa1\x50\x90\
+\xf1\xf7\x50\xfc\x0c\x00\xa9\x6c\x04\x00\x35\x9b\x4d\x29\x84\x90\
+\xc5\x62\x91\x8a\xc5\x22\x5f\xa9\x39\xfe\x85\xc8\x62\x29\x80\x12\
+\xed\x0d\xb6\x6c\xd9\x82\x5a\xad\x96\xf2\x06\x9e\xe7\xa1\xb3\xb3\
+\x93\x67\xc7\xba\xcf\x16\x2b\xb3\x4f\x68\x25\xf0\x23\x4f\x50\x28\
+\xbb\x2d\x30\x50\x28\x73\x15\x80\xc9\x7a\xb6\x3e\xbc\xe2\xe9\x78\
+\x1c\x20\xab\x1e\x3c\xd7\x75\x29\x08\x02\x49\x44\x54\x2c\x16\x49\
+\x11\xbd\x18\x78\x96\x52\x52\xb9\x5c\xe6\x2b\x99\xe9\xcf\x25\x8b\
+\xad\x00\x40\x8e\x37\x68\x36\x9b\x5c\xaf\xd7\xb1\x72\xe5\x4a\x6e\
+\x34\x1a\x08\xc3\x90\xa7\x47\x2a\x67\x0a\x5d\xf4\x88\x55\x6c\xde\
+\x26\x04\xd6\x84\xbe\x84\x3f\x1b\x44\x3f\xca\xa0\x8e\x12\x87\x80\
+\xbc\xee\x60\x62\xeb\x19\x9e\xdc\xf0\xb4\xe3\x38\xec\xfb\x7e\x9c\
+\xfe\x47\xb1\x7f\x66\x66\x46\x8d\x03\x90\xe5\x72\x99\x26\x26\x26\
+\x28\x08\x02\xea\xe8\xe8\xa0\xce\xce\x4e\xce\xe9\xd0\xb9\xe2\x81\
+\x57\x72\xa9\xe3\x36\xe7\xfb\x9d\xd6\x2d\xb7\xdc\x62\x35\x1a\x0d\
+\xe1\xfb\xbe\xe8\xe9\xe9\xb1\x01\xa0\xd1\x68\x58\x9d\x1b\xcf\x54\
+\x4b\x7d\xe3\x8f\xab\x97\x29\x39\xae\x8d\xee\xd5\x95\xf8\x47\x19\
+\x80\xc0\x0b\x31\x35\xda\x3a\x18\x24\x6c\x16\x7e\x6a\xea\xd5\x6b\
+\x9f\x36\x5e\xd0\xa0\x9e\xe3\xe3\xec\x43\x1a\x6d\x9e\xd2\xf9\x81\
+\x03\x1f\x78\x7b\x14\xc0\xfc\x6e\xa5\x0c\x42\x29\x43\xb3\xd9\xb4\
+\xd6\x6c\x1b\xaf\x56\x56\xcf\x7e\x53\x29\x81\xed\xda\xe8\x5a\xd5\
+\x01\xcb\x12\x08\xbc\x10\xd3\x63\xb3\x2d\x07\x0b\x9a\x85\x0f\x9f\
+\x7b\x79\xd3\x53\xe6\x03\x99\xea\xb1\x2c\xf3\xe1\x8c\x39\x80\x07\
+\x7e\xc0\xc0\x07\x16\xe1\xe7\xe3\x2f\x42\xd4\x8d\xa7\xbd\x7b\xf7\
+\x02\x89\x42\xe0\xd4\x29\x8c\xde\xf2\x11\xbc\xbf\xd2\x8b\x6f\x09\
+\x81\xed\x32\x90\x98\x1e\xab\xa3\x6b\x65\x47\xdb\xbe\x22\xd7\x91\
+\x15\x29\xa5\xaf\x00\x8f\x8e\x73\x2a\x0f\xd8\xb9\xd6\xfd\xc0\xc9\
+\xdb\xe9\x01\xce\x2b\xdb\xef\x44\xb5\xa7\x1b\x4f\x08\x81\x1d\x00\
+\x60\x3b\x16\x2a\x2b\xca\x98\x3a\xdb\x1a\x02\x88\xf1\xd9\xa7\xfe\
+\x0a\x9f\x59\xea\x73\x7c\xa7\xcb\x25\x0f\x0b\x5f\x4c\x79\xf9\x51\
+\x4c\xc6\xef\xe2\xdf\x07\x44\x29\xe0\xcc\xb9\x56\xf7\xcf\x8c\x49\
+\x29\xf1\xf5\x25\x3f\xc1\x2b\x40\x2e\x6b\x05\x00\x52\x4a\xb0\x07\
+\x40\x6a\x30\x08\x33\x26\x89\xf1\xd9\xda\x14\x36\x2d\xe5\x2b\xd6\
+\xaf\x24\xb9\xac\x43\x40\x56\xde\xf7\x09\xec\x16\x02\xf7\x00\xe7\
+\xff\x4d\x9f\x65\xb9\x42\xe5\xf6\x4f\xe0\x53\xb7\x7f\x02\x9f\x7a\
+\xbb\xcf\x63\x59\x96\x65\x59\x96\x65\x59\x96\x65\x59\x96\x65\x59\
+\x96\x65\x59\x96\x65\x59\x96\xe5\x1d\x28\xff\x1f\xa3\xe7\x37\x1e\
+\xe7\xe8\xe8\x91\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x1a\x14\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x89\x00\x00\x0b\x89\
+\x01\x37\xc9\xcb\xad\x00\x00\x19\xc6\x49\x44\x41\x54\x78\x9c\xed\
+\x9d\x7b\x9c\x1d\x65\x99\xe7\xbf\xef\xa5\xaa\xce\xe9\x4e\x77\x27\
+\x9d\x6e\x12\x72\x23\x21\xc1\x98\x1b\x08\x86\xdb\xa0\x42\x10\xc5\
+\x5d\x93\x31\xbb\xae\xf3\x99\x1d\xd8\x55\x87\xd9\x8f\x1f\x9c\x45\
+\xc4\x8f\xe3\xc7\xcf\x20\x03\x88\xc8\x30\x8b\x23\xe8\x78\xd9\x6b\
+\xc6\x55\x06\x1d\x56\x97\xa0\x71\x71\x60\x84\x75\x16\x0d\x2c\x3a\
+\x6e\x9c\x05\x65\x21\x0c\x04\x72\xeb\x5c\xbb\xfb\xdc\xab\xea\xdd\
+\x3f\xaa\xea\x74\x9d\xea\x3a\x97\x4e\x5f\x72\xba\x73\x7e\xf9\xbc\
+\xa9\x53\x75\xce\xa9\x53\x55\xcf\xef\x7d\x9e\xe7\x7d\xde\xe7\x79\
+\x1b\x3a\xe8\xa0\x83\x0e\x3a\x38\x43\x21\x9a\xbc\x6f\x01\x0a\x90\
+\x33\x70\x2d\xa7\x02\x1f\x30\x80\x0b\x78\xa7\xf9\x5a\x66\x25\x1a\
+\x11\xc0\x01\x7a\x80\xc5\x40\x96\x80\x08\xed\x06\x0f\x28\x02\x47\
+\x80\x51\x20\x4f\x87\x08\x13\x82\xae\x73\x5c\x85\xad\xdb\x18\xf3\
+\xab\x99\xb8\x10\x63\x4c\x4b\x5b\xdf\xf7\x01\x70\x5d\x97\x03\x07\
+\x0e\xbc\x78\xe0\xc0\x81\x9f\xed\xda\xb5\x6b\xe7\xbd\xf7\xde\xfb\
+\x73\x82\xfb\xc9\x03\x65\x02\xcd\xd0\x41\x13\xd4\xd3\x00\x0a\x58\
+\x00\xac\x31\xc6\xfc\x6c\x26\x2e\xc4\xf7\x7d\x7c\xdf\xc7\xf3\xbc\
+\xea\xeb\xb4\x63\xc6\x98\x9a\x63\xc6\x18\x6c\xdb\xe6\xc0\x81\x03\
+\x4f\x7f\xf4\xa3\x1f\xbd\xfb\x99\x67\x9e\x79\x1e\x38\x4e\x40\x04\
+\x77\x26\xae\x7d\x36\xa3\x9e\x6d\x17\x04\xf6\xbf\x6f\x06\xaf\xa5\
+\x06\xc6\x98\xaa\xb0\xa3\xd7\xc9\xe6\xfb\x3e\xae\xeb\x32\x32\x32\
+\xc2\x82\x05\x0b\xae\xf8\xde\xf7\xbe\xf7\xc8\x7d\xf7\xdd\xf7\x87\
+\xc0\x2a\xa0\x97\xfa\x1a\xae\x83\x10\x8d\x9c\x3b\xd1\xe4\xfd\x69\
+\x43\xa4\xee\xeb\xbd\x97\xa6\x1d\xf2\xf9\x3c\xa5\x52\xc9\xbe\xfe\
+\xfa\xeb\xff\xe8\xf1\xc7\x1f\xff\x12\xb0\x9a\x0e\x09\x9a\xa2\x99\
+\x80\x67\x9c\x00\xf5\x84\x5f\x4f\x03\xc4\x49\x70\xe2\xc4\x09\x00\
+\x36\x6d\xda\xf4\x8e\xdd\xbb\x77\xef\x00\xd6\xd0\x21\x41\x43\xb4\
+\xeb\xf0\xae\x06\x49\x52\xa4\x99\x87\x88\x04\xc7\x8f\x1f\x47\x6b\
+\xcd\xca\x95\x2b\x37\xec\xde\xbd\xfb\xbf\xd0\x21\x41\x43\xb4\x1d\
+\x01\x84\xa8\xf5\x4b\xd3\x34\x42\x9a\x16\x88\xda\xf0\xf0\x30\x96\
+\x65\x75\x48\xd0\x22\xda\x8e\x00\x49\x24\x09\x11\x21\x22\x00\x50\
+\x43\x80\x4a\xa5\x42\x6f\x6f\x6f\x87\x04\x2d\xa2\x6d\x08\x10\x17\
+\x74\x3d\xa1\xa7\x21\xcd\x2f\x00\xd0\x5a\x77\x48\xd0\x02\xda\x86\
+\x00\x50\x9f\x04\xad\x12\x22\xf2\x09\x00\x6c\xdb\xee\x90\xa0\x05\
+\xb4\x15\x01\x00\xa4\x94\x55\x81\x4f\x86\x10\x5a\xeb\x0e\x09\x5a\
+\x40\xdb\x10\x40\x08\x51\x6d\xd1\x3e\x34\x26\x44\xfc\xf3\x69\xe8\
+\x90\xa0\x39\xda\x86\x00\x40\x8d\xa0\xd3\x08\xd1\xac\x49\x39\xfe\
+\x76\x3a\x24\x68\x8c\xb6\x22\x00\x50\x23\xc8\x46\x44\x90\x52\x56\
+\xb5\x83\x52\xaa\xa1\x46\xe8\x90\xa0\x3e\xda\x8a\x00\x8d\x7a\x76\
+\xda\x7e\x9c\x04\xf1\x6d\x1a\x3a\x24\x48\x47\x5b\x11\x00\x5a\x53\
+\xf5\x71\xe1\x2b\xa5\xc6\x6d\xeb\xa1\x43\x82\xf1\x68\x3b\x02\x00\
+\xa9\x6a\x3d\xae\x05\x22\xe1\x27\x5b\x44\x82\x46\xe8\x90\xa0\x16\
+\x6d\x47\x80\x66\xbd\x3e\x4d\x0b\x68\xad\x51\x4a\x55\x5b\x33\x74\
+\x48\x30\x86\xb6\x23\x40\x84\xb8\x16\xa8\x67\xf3\xa3\x5e\x1f\x57\
+\xff\xad\x10\x00\x3a\x24\x88\xd0\x96\x04\x88\xf7\xf2\x24\x09\x92\
+\x84\x88\x84\x1f\x69\x01\xad\x5b\x97\x99\x52\x0a\x63\x4c\x1a\x09\
+\xbe\xca\x19\x92\x4f\x50\x2f\x8a\xa2\x81\xb3\x80\x0b\x8d\x31\x3f\
+\x98\xc1\xeb\xa9\x41\x7c\xbe\x3f\x9e\x16\xe6\xba\xee\xb8\xf7\x3c\
+\xcf\xc3\x75\x5d\x2a\x95\x4a\x75\x1b\x1d\x73\x5d\xb7\xe6\x73\xf1\
+\x90\x71\x44\xaa\xf9\xf3\xe7\x57\x9b\x31\x86\x87\x1e\x7a\xe8\xc1\
+\x5b\x6e\xb9\xe5\x8b\xc0\x5e\xe0\x04\x73\x34\xc7\xb0\x9e\xbe\x94\
+\x40\x37\x70\xf6\x1d\x77\xdc\xf1\x7b\x33\x78\x3d\x0d\x11\x17\x5a\
+\xda\x7e\x1c\x69\xa1\xe3\xb8\xd6\x88\x6b\x16\xa5\x14\xae\xeb\x32\
+\x3a\x3a\xca\xc9\x93\x27\xb1\x2c\x8b\x8d\x1b\x37\xbe\xf9\x85\x17\
+\x5e\xd8\xff\xf2\xcb\x2f\xef\x03\x72\x40\x65\x7a\xef\xee\xf4\xa0\
+\xad\x35\x00\x50\x93\xfb\x17\x9f\xf6\x4d\xee\x47\xc7\xe2\xbd\x3e\
+\xd9\xfb\x93\xc9\xa4\x49\x2d\x10\x11\x42\x6b\x4d\x6f\x6f\x2f\xb9\
+\x5c\xee\xb5\xcd\x9b\x37\x7f\x04\xf8\x25\x41\xea\xf9\x9c\x4b\x32\
+\x6d\x4b\x1f\x20\x8e\xb8\x2f\x90\x8c\xfe\x25\x87\x81\x71\x3f\x20\
+\xb2\xe9\x96\x65\x55\x5b\x7c\x3f\xfe\x99\x48\x23\x68\xad\xd1\x5a\
+\x23\xa5\xa4\x50\x28\xd0\xdf\xdf\xbf\xe2\x8e\x3b\xee\x78\x3f\x30\
+\x40\x50\x27\x31\xe7\x30\x2b\x1c\x9c\x78\x84\xcf\x18\xd3\x70\xac\
+\xaf\xb5\x1e\x17\x3a\x8e\x8f\x18\x92\x1a\xa0\x9e\x16\x50\x4a\x91\
+\xcb\xe5\xb8\xf2\xca\x2b\xaf\x04\xbe\x0b\x1c\x66\xac\x10\x65\xce\
+\x60\xd6\x10\x20\xda\xb6\x3a\xcc\x8b\x20\xa5\xc4\xf3\x3c\x84\x10\
+\xf8\xbe\x8f\x94\xb2\xa6\xc6\x00\x02\x52\x25\x7f\x23\x22\xcd\x9a\
+\x35\x6b\xce\x03\x56\x02\xaf\x12\x08\x7f\x4e\x11\xa0\xed\x4d\x40\
+\x84\xb4\xf0\x6f\xbd\xfd\xe8\x58\xa4\xe2\x93\x63\xfe\x66\x2d\x1e\
+\x54\xf2\x3c\x8f\x1b\x6f\xbc\xf1\x1a\x02\x33\xb0\x80\xf6\x2c\x91\
+\x3b\x65\xcc\x0a\x0d\x10\xa1\xd1\x64\x4f\xda\x67\xa3\xf4\xb0\xb4\
+\xde\x9f\x74\x04\xe3\xdf\x8b\x93\xcd\xf7\x7d\x0e\x1f\x3e\x3c\x0f\
+\x18\x24\x78\x5e\x36\x53\x57\x7f\x58\x20\x18\x61\xe4\xa6\xf0\x9c\
+\x13\x42\xdb\x8f\x02\xd2\x90\x56\x13\x10\xdf\x8f\xbf\x1f\x4f\x1f\
+\x4f\x3b\x96\x96\x75\x9c\x0c\x38\xed\xda\xb5\x6b\x64\xf5\xea\xd5\
+\xa3\x17\x5c\x70\x41\xa5\xa7\xa7\xc7\x9f\xa8\x19\x8a\xc3\xf3\x3c\
+\x0e\x1e\x3c\xb8\x7f\xef\xde\xbd\x2f\xdf\x76\xdb\x6d\x0f\xef\xde\
+\xbd\x3b\x2a\x65\xcb\x71\x1a\x6a\x1a\x67\x25\x01\xa0\x3e\x09\xe2\
+\xb5\x83\x49\x41\xa7\x09\xbf\x11\x01\x22\x12\x3c\xf5\xd4\x53\xac\
+\x5d\xbb\x96\xb5\x6b\xd7\xd2\xdd\xdd\x5d\x13\x63\x88\xd7\x25\xa4\
+\x91\x31\x8d\x7c\x9e\xe7\x61\x59\x16\xc5\x62\xb1\x3c\x32\x32\xf2\
+\xe2\x75\xd7\x5d\x77\xfb\x9e\x3d\x7b\x7e\x05\x1c\x25\x20\x42\x69\
+\xa6\x9e\xe3\xac\xf1\x01\x92\x68\x34\x25\x1c\x0d\x09\x93\xc7\x92\
+\xc3\xbd\xc8\x27\x88\xdb\xfc\xe8\xfd\x78\xb0\xa8\x19\x1a\x95\xb2\
+\x45\xef\x27\x33\x97\x0b\x85\x02\xae\xeb\xda\x5d\x5d\x5d\x1b\x7f\
+\xf8\xc3\x1f\x3e\xb4\x73\xe7\xce\x2f\x03\x1b\x81\xa5\x04\x41\xb8\
+\xd6\x53\xa3\x27\x81\x59\x4b\x00\xa8\x25\x41\x24\xf0\xa4\x23\x18\
+\x9f\x2c\xaa\x37\x7d\x1c\x27\x44\xda\x79\x5a\x21\x41\x12\x8d\x0a\
+\x5a\xe3\x5a\xaa\x5c\x2e\x33\x3a\x3a\x6a\x5f\x7a\xe9\xa5\xd7\x3e\
+\xf7\xdc\x73\xdf\x5c\xb1\x62\xc5\x35\xc0\x72\xa0\x8b\x19\x20\xc1\
+\xac\x26\x00\x34\xd6\x04\xf1\x6d\x72\xca\x38\x4d\x6b\xd4\x6b\x13\
+\x45\x23\x8d\x90\x56\xfa\x5e\x2e\x97\x39\x79\xf2\x24\x2b\x56\xac\
+\x58\xb1\x6b\xd7\xae\x3f\xdb\xba\x75\xeb\x76\x66\x88\x04\xb3\x9e\
+\x00\x50\xeb\xb4\xc5\x05\x5d\xcf\x04\x34\x32\x1d\x53\x45\x82\x38\
+\x1a\xd5\x32\xc6\x4b\xdc\x8d\x31\x2c\x5a\xb4\xa8\xef\x6b\x5f\xfb\
+\xda\x9d\x37\xdf\x7c\xf3\x07\x99\x01\x12\xcc\xaa\x61\x60\x23\x44\
+\x24\x88\x47\xf6\xe2\x41\xa0\xb8\x10\xa4\x94\xe3\x2a\x89\x60\x7c\
+\xcf\x3d\x15\xd5\xdf\x0c\x49\x93\x10\x9f\xa3\xc8\xe5\x72\xf4\xf5\
+\xf5\xe1\x38\x8e\xfd\xc9\x4f\x7e\xf2\x13\x00\x0f\x3c\xf0\xc0\x37\
+\x80\x7d\x04\x0b\x5e\x4c\xf9\x08\x61\xce\x10\x20\x42\x24\xf8\xe8\
+\x01\x0b\x21\xaa\x23\x82\x68\x3f\x2e\x80\xe8\xb3\xcd\xce\x39\x99\
+\xf7\x93\xa8\xe7\x1f\x1c\x3f\x7e\x9c\x81\x81\x01\x80\x19\x23\xc1\
+\x9c\x23\x00\xd4\x6a\x83\xb8\xd0\xe3\x44\x00\xc6\xbd\x3e\xd5\xdf\
+\x8a\x87\x92\x27\x82\xb8\x16\x8a\x7c\x01\xdb\xb6\xab\xef\xcf\x04\
+\x09\xe6\x24\x01\x22\xc4\xe3\xfb\xc9\xde\x9f\x9c\x0b\x88\x6f\xeb\
+\x9d\x67\x22\xbf\xd7\x2a\xe2\xbf\xed\xfb\x7e\x0d\x01\x60\xfa\x49\
+\x30\xa7\x09\x00\xe3\x49\x10\xd7\x0a\x30\xf6\xe0\x23\x9c\x8a\x1f\
+\x50\x2f\xf9\xa4\xd5\x73\x24\xaf\xcb\x71\x6a\x67\x9e\xa7\x93\x04\
+\x73\x9e\x00\x71\x24\x1d\xc5\x56\xfd\x80\x56\x49\x10\xcd\x1d\xc4\
+\x49\x90\x24\x44\xfc\x58\xa3\x73\xcf\x14\x09\xce\x28\x02\x44\x48\
+\x6a\x85\x08\x93\xf1\x03\x92\x02\x4e\x23\x44\xb4\x9f\xfc\x5c\xbc\
+\xc5\x31\x13\x24\x68\x3b\x02\xac\xbc\x77\xfe\xe9\xbe\x84\x71\xb8\
+\x6d\xe9\x7d\x4d\x3f\x93\x14\x62\x1a\x21\xea\xd5\x37\xa4\x09\x3f\
+\xc2\x74\x93\xa0\xed\x08\x00\x70\xf9\x3b\x97\x9d\xee\x4b\xe0\xd7\
+\x3f\xcd\x71\xbc\x70\x9c\xef\x7f\xf0\x49\x5e\x7c\x7a\x6f\x4b\xdf\
+\x49\xf6\xfa\x7a\x9a\x21\x4a\x3a\x89\x62\x12\xcd\x02\x4e\xd3\x49\
+\x82\xb6\x24\x00\xc0\xeb\xee\x01\x86\x5f\xa9\xb0\x38\xbb\x9c\xac\
+\xec\xc2\x56\x19\x1c\x99\xc5\x91\x59\x6c\xe1\x90\x91\x59\x1c\x95\
+\x25\x13\x1e\xcf\x58\x59\x32\x2a\x4b\x46\x67\x70\x74\x17\x19\x1d\
+\xbc\xd6\x52\x23\xc4\xc4\x22\x79\x4f\xbd\xf4\x04\x3f\x2b\xfc\x25\
+\xdf\xff\xe0\x93\x6c\x5a\x7c\x21\x2f\xd2\x9c\x00\xf5\x54\x7a\x92\
+\x10\xc9\x39\x86\x56\x23\x8e\x69\x24\xb8\xe1\x86\x1b\x6e\x7c\xf8\
+\xe1\x87\x5f\xdb\xbf\x7f\xff\x93\x9c\x22\x09\xda\x3a\x14\x7c\xf2\
+\x70\x9e\x57\xf6\xbd\xc2\xf1\xe3\x23\x8c\x9c\xc8\x31\x3a\x92\x23\
+\x37\x9a\x23\x5f\xc8\x93\x2f\xe5\x29\x94\xf3\x14\xcb\x45\x4a\x5e\
+\x91\x62\xa5\x48\xd1\x2b\x52\x74\x4b\x94\xdd\x22\x65\xaf\x40\xc9\
+\x2d\xe2\x19\x8f\x89\x98\xf6\xa7\x5e\x7a\x82\x6f\xfd\x62\x4c\xf8\
+\x13\x41\x23\x12\x24\xf7\xd3\x66\x2c\x9b\xe5\x19\x38\x8e\x83\x6d\
+\xdb\xd5\x19\xcc\xc5\x8b\x17\xf7\x3d\xf6\xd8\x63\xf7\x2c\x59\xb2\
+\x64\x0b\xa7\x18\x36\x6e\x6b\x02\x00\x94\xfd\x32\x43\xb9\x43\x81\
+\x70\x43\x21\x97\xdd\x12\x65\xb7\x14\x08\xde\x2b\x50\xf2\x0a\x55\
+\x81\x07\xc7\x8a\x14\x2b\x25\x4a\x5e\x89\x52\xa5\x88\x6f\xdc\x96\
+\x48\x30\x19\xe1\x47\x88\xd4\x7b\x5c\xf0\xc9\xaa\xa6\xb4\x19\xc9\
+\x56\xcb\xda\xa6\x9a\x04\x6d\x4f\x00\x80\x7c\x65\x84\x43\xa3\x07\
+\x02\x61\x57\x0a\x14\xbd\x02\x45\xaf\x48\x29\x14\x72\x44\x8c\x92\
+\x5b\xa0\xe8\x06\x84\x28\x79\xc5\xb0\x95\x28\xba\x25\x7c\xd3\x38\
+\xa5\x7f\xaa\x84\x5f\xaf\xf7\xa7\x91\x20\x2d\x07\xa1\x15\x4c\x25\
+\x09\x66\x05\x01\x20\x20\xc1\xc9\xe2\xb1\xa0\x87\xbb\x81\xb0\x4b\
+\x55\x42\x14\x29\x86\xc4\x28\x7b\x05\x4a\x95\x40\x33\xd4\x1c\x73\
+\x4b\xf8\x7e\x7a\xda\xdd\x54\x08\x3f\x42\xdc\xc9\x4b\x53\xfb\xf1\
+\xf7\xd3\x48\xd0\x2a\x5a\x24\x41\x53\xb4\xad\x13\x98\x86\x63\x85\
+\x23\x00\xf4\x67\x06\x10\x08\x88\x9a\x10\x48\x04\x42\xc8\xd8\xf1\
+\x31\x88\xea\xff\x82\x8c\xe5\x20\xc5\x58\x4f\x9b\x4a\xe1\x57\x7f\
+\x2f\x26\xe4\x78\x1d\x43\xe4\xf5\x43\x10\x73\x88\xde\x8f\xb7\x3d\
+\x7b\xf6\x54\xeb\x1b\xd3\x2a\x9b\xa2\x38\x42\x36\x9b\x25\x9b\xcd\
+\xd2\xdd\xdd\x4d\x4f\x4f\x0f\x3d\x3d\x3d\x2c\x5e\xbc\xb8\x6f\xe7\
+\xce\x9d\x77\x5e\x7c\xf1\xc5\x47\x08\x4a\xd9\x5e\xa7\x49\x7a\xd9\
+\xac\x22\x00\x04\x24\xb0\x64\x2c\x5e\x2e\x22\xd1\xc6\x09\x11\x10\
+\x41\x08\x51\xdd\x46\x34\x90\x80\x1d\x92\x60\x3a\x84\x0f\xb5\x33\
+\x92\x49\x81\x47\xaf\xa3\xe3\x5a\xeb\x86\x73\x10\x71\xed\x11\xcf\
+\x2b\xac\x54\x2a\x54\x2a\x15\x46\x46\x46\x18\x1a\x1a\xc2\xb2\x2c\
+\x06\x07\x07\x59\xb6\x6c\xd9\xe0\x83\x0f\x3e\xf8\xa9\xeb\xae\xbb\
+\xee\x8f\x08\x8a\x5a\x1b\x26\x9a\xce\x3a\x02\x00\x1c\xce\x1d\xa4\
+\x2a\x79\xa8\xed\xf5\x55\x42\x8c\x41\xc6\x88\x20\x42\x8d\xf1\xb3\
+\x7f\xfc\x5f\x3c\xf8\xf7\xdf\x98\x72\xe1\xc7\x11\x9f\x96\x8e\x13\
+\x22\x19\x7d\xac\x67\xfb\x1b\x11\x20\xf9\x19\x80\xa3\x47\x8f\x52\
+\x28\x14\xb8\xfa\xea\xab\x37\x7f\xf8\xc3\x1f\x7e\xf7\x8e\x1d\x3b\
+\xa2\xc2\xd6\xba\xc5\x2c\xb3\x92\x00\x06\x9f\xc3\xb9\x03\x28\x21\
+\x11\x76\x2c\x8a\x56\xbb\x89\x61\xfc\x91\xe9\x16\x7e\x3c\xfc\x0b\
+\xe9\x25\x6d\x8d\xca\xdc\xea\xc5\x13\xe2\x66\x20\xfe\xd9\xc8\xa7\
+\x70\x5d\x97\xa3\x47\x8f\x72\xd3\x4d\x37\xfd\xeb\x1d\x3b\x76\xec\
+\x02\x86\x08\xcc\x40\xaa\x16\x68\x5b\x27\x50\xa8\x26\x33\x68\xf8\
+\x0c\xe5\x0f\x51\x70\xf3\x94\xc2\xb1\x7f\x75\x18\x58\x89\xc7\x06\
+\xc2\xe1\x62\x25\x70\x1a\x23\xc7\x10\xe0\x6b\xbb\xef\x9f\xde\x7b\
+\x48\x8c\x02\x1a\x05\x81\xe2\xce\x60\xbc\xa2\xc9\xb2\xac\x71\x55\
+\x4d\x91\xf3\xd7\xa8\x9a\xa9\xaf\xaf\x6f\xe9\x87\x3e\xf4\xa1\x2b\
+\x09\x32\x8c\xeb\x0e\x2f\x5a\x22\x40\xbd\x0c\x96\xe9\x68\xd5\x87\
+\x27\x9b\x8f\x62\x2a\x7e\x99\x43\xa3\x07\x28\xb8\xa3\x14\xc2\x91\
+\x41\x30\x44\x1c\xf3\xfe\x8b\xe1\xd0\xb0\x98\x20\xc1\xad\xd7\xdc\
+\xce\x0f\x7f\xb3\x93\x9b\x76\xde\x30\xa1\xeb\x3a\x15\xa4\xe5\x1d\
+\x36\x2b\x67\x4b\x56\x35\x47\x42\x4f\x66\x30\xc7\x5b\x7c\x38\x59\
+\x2a\x95\xd8\xb6\x6d\xdb\xfb\x80\xf9\x04\x7f\xfe\x27\xf5\x81\xb6\
+\x64\x02\x26\xfb\x00\x4e\x05\xb2\xc5\xe2\x9b\x88\x04\x8b\xe6\x9d\
+\x3d\xce\xf7\x8f\x7c\x03\x99\x72\xef\x19\xdd\xcd\x6d\xef\xba\x93\
+\xbb\x1e\xbf\x1d\x80\x07\xb6\xfd\xc7\xc9\x5e\x72\x2a\x92\xa6\x00\
+\xea\xab\x7e\x21\x82\x12\xb6\x78\x85\x73\xa4\x2d\x22\xd5\x9f\x1c\
+\x39\xc4\xbf\x9b\xd4\x38\xe7\x9c\x73\xce\xb9\x04\x1a\xc0\xa2\x8e\
+\x1f\xd0\xb6\x3e\x80\x6c\x62\x02\xe2\xa8\xf8\x65\x8e\x16\x86\x90\
+\x5d\x2a\x9d\xe7\xd1\xb1\x70\x34\x20\xa5\x42\x09\x4d\x46\x65\xb8\
+\xed\x5d\x9f\xe5\xae\xc7\xff\x04\x30\x3c\xb0\xed\x3f\x4d\xc1\x95\
+\xa7\xfc\x7c\x8a\x3f\x90\xf6\x99\xb8\x6d\x8f\x04\x9a\xac\x69\x8c\
+\xa7\xb5\xa5\x11\x20\x3e\x04\x5d\xb2\x64\xc9\x00\x41\x2d\x63\x5d\
+\xb4\xb1\x06\x98\x58\x8e\x5d\xa1\x92\x67\x28\x7f\x90\xc1\xae\xb3\
+\xa1\xfa\xf7\xae\xc6\x9f\x43\x22\x90\x62\xac\xd8\xa3\x86\x04\x06\
+\xee\x9f\x66\x4d\x10\x09\x27\x7e\x3c\x4d\xf8\xd1\x04\x52\xb2\x8e\
+\x20\x9a\x45\x8c\x64\x12\x7d\x2f\x22\x57\x52\x0b\x30\x7e\x50\x54\
+\x83\xb6\x25\x40\x2b\x3e\x40\x12\x85\x4a\x9e\x23\xf9\x43\x0c\x76\
+\x2d\x8a\x47\x05\xaa\x77\x2f\x91\x48\xa1\x02\x02\xc4\xbe\x57\xab\
+\x09\xe0\x8b\x5b\xff\xc3\x24\xaf\x3e\x1d\x31\xa1\x20\x84\xa8\x06\
+\x77\x92\x9f\x89\x8e\x45\x29\x62\xf1\x51\x40\x3d\xff\xa4\x5e\x42\
+\x4a\x33\xb4\xad\x09\x10\xa7\x78\x65\xf9\xca\x28\x43\x79\x18\xec\
+\x5a\x14\x1c\x08\x9f\x81\x14\x12\x25\xea\xd7\xfa\xc5\x49\x60\xf0\
+\xb9\x7f\xeb\xf4\x99\x83\x46\x29\x68\x71\x41\x46\x02\x17\x42\xd4\
+\xc4\x10\xe2\x79\x8c\x49\x33\x00\x63\xda\x60\xca\x08\x30\x1b\x4c\
+\x40\x1c\xf9\xca\x28\x47\x0a\x82\x81\xae\x45\x04\x4e\xa0\xa4\x2c\
+\x34\x72\x5c\x5e\x40\xed\x7d\x8d\xd3\x04\xef\x0d\xcc\xc1\x54\xdf\
+\x7f\x9a\x63\x18\x1d\x8f\xab\xfe\x38\x09\x92\xad\x15\x12\x25\x73\
+\x08\xd2\xd0\x12\x01\x92\x6a\x6a\x26\x20\x26\x59\x8e\x95\x2b\x8f\
+\x60\x49\x0b\x99\x1d\x40\x79\x6a\x5c\x52\x48\x3d\x91\x06\x24\x18\
+\x1b\x1d\x7c\xe1\x9f\xfc\xfb\x49\x5d\x47\x3d\xa4\xf5\xd6\xf8\x52\
+\x36\xd1\x67\xd2\x22\x80\xcd\xea\x19\x92\x69\x69\x8d\xd0\xbe\x26\
+\x60\x12\x1a\x20\xc2\x70\xe9\x24\x4a\x5a\x29\x3d\xbf\x31\x1c\xe5\
+\xf0\x99\x77\xdd\xc9\xe7\x1e\xbf\x1d\xdf\x18\xb6\xb0\x75\xd2\xd7\
+\x92\x86\x48\x40\x91\x63\x07\xd4\x08\x3f\x6e\x02\x92\x3e\x00\xd4\
+\xaf\x67\x98\x72\x02\x9c\x0e\x13\x30\xd1\x45\x38\x44\x22\xa6\xa5\
+\xa5\x44\x20\x19\x2e\x1e\x43\x00\x7d\x99\x05\x4d\x93\xa5\x4c\x75\
+\xeb\x93\x51\xd9\x2a\x09\xf6\xaa\xbd\xdc\x7d\xee\xf4\x44\x0d\xe3\
+\x9a\x20\xee\xbc\xc5\x6b\x1a\x93\xbe\x00\xd4\xfe\x81\xac\x66\xe7\
+\x6e\x84\xb6\x25\x40\x23\x0d\x10\x78\xf1\x12\x25\x04\x42\x46\x13\
+\x3c\xd1\xa4\x10\xc1\x1c\x81\x50\x18\x0c\x18\x28\xb8\x23\x58\x65\
+\x8d\x72\x14\x65\x37\x1a\x01\x8c\x3f\x7f\x64\xe8\xa2\xfb\x8d\x93\
+\xe0\x81\xe7\x3f\xcf\x57\xd7\x7e\x63\x6a\x6f\x32\x86\xa4\x36\x88\
+\x46\x09\xc9\x8a\xa6\xb4\xc2\x96\x66\xe7\x6c\x84\x59\x63\x02\xa4\
+\x50\x28\x21\x91\x32\x18\xc7\x07\x63\x79\x89\x62\x6c\x32\x48\x84\
+\x41\x1e\x21\x44\xd8\x9d\x0d\x86\xe0\x21\x15\xbd\x1c\x96\xab\xd1\
+\x96\xc6\x37\x2e\xae\x29\x53\xf6\x44\x95\x34\xb5\x18\x7b\xa8\x19\
+\x95\xe5\x8f\xdf\x79\x3b\x9f\xff\xdb\x3b\xf9\xd4\xe3\x7f\xc8\x57\
+\xb6\xff\xe5\x74\xdd\x72\x8d\x36\x88\x0b\x3e\x2d\xf8\xd3\xcc\x0f\
+\x88\x9f\xaf\x11\xda\x56\x03\x48\x09\xce\x3c\x0b\x37\x67\xd0\x4a\
+\x06\xc2\x17\x12\x25\x15\x96\xd6\x9c\x77\xc1\x22\x7a\x7a\x32\xbc\
+\xf6\x9b\x63\x1c\x3b\x9c\x47\x08\xc6\x65\x00\x1b\x0c\xc6\x04\x5b\
+\xdf\x37\x14\xdd\x1c\x96\xb2\xb0\x50\xf8\xc6\xc5\x37\x1a\xd7\x54\
+\x10\x5e\xe2\x41\x25\x6e\xd7\x12\x0e\xb7\x5e\x73\x3b\x77\x3f\x71\
+\x27\x1f\x7b\xf4\x0f\xf8\xf2\xfb\xfe\xf3\xb4\xde\x7b\x64\x0a\xe2\
+\xbd\x3d\x3e\xfc\xab\x27\xfc\xe4\x90\x70\x56\x0f\x03\xb3\x3a\x43\
+\x6f\x5f\x17\xb9\x72\x19\x25\x34\x5a\x06\x04\x70\x6c\xcd\xf9\x9b\
+\x57\x60\x8c\xa1\xc7\xea\x62\xe3\xfa\x1e\x5e\xd1\x43\x1c\x3b\x92\
+\x47\x89\x5a\xc7\xc1\xe0\xe3\x87\xd7\x6f\x64\xb0\x57\xf2\xf2\x58\
+\xae\x42\xdb\x1a\x43\x05\xdf\x48\x7c\x23\xf0\x8d\xa4\xec\x95\x42\
+\x7d\x60\x88\x58\x60\x00\x5f\xfa\x38\x3a\xcb\xad\xd7\xdc\xc1\xdd\
+\x4f\xdc\x81\x10\xf0\xa5\xdf\x9e\x5e\x12\xc0\xf8\x0a\xa6\x89\xfa\
+\x01\xb3\xda\x04\xf4\xca\x79\x64\xd5\x08\x9e\x12\x28\x29\xd1\x42\
+\x61\xdb\x16\x9b\x2f\x3d\x97\x7d\xfb\x8f\xf2\xec\x33\xfb\x00\xb8\
+\x7e\xfb\x65\x5c\xf8\xe6\x35\xbc\xf4\xd2\x61\x86\x8e\x9c\xac\x39\
+\x87\x89\x99\x00\x63\x7c\x7c\x63\xf0\xf1\x28\x7a\x05\xb4\x6b\x61\
+\x59\x3d\x18\xe3\xe1\x1b\x89\xe7\xbb\x08\x21\x70\xfd\xb1\x10\x72\
+\xf5\xbb\xca\x03\x01\x8e\xca\x56\x35\x01\x9c\x1e\x12\x00\x24\xfd\
+\x80\xe8\x58\xbd\xef\x36\x42\xdb\x4e\x07\xf7\xa9\x79\x64\x55\x06\
+\x47\x59\x38\xda\xa1\x3b\x9b\xe5\xaa\xb7\x6d\x60\xe8\xd0\x28\xcf\
+\x3e\xb3\x8f\xef\x7c\x60\x17\xef\x5e\xfd\x5e\xbe\xf5\xc8\x6e\x32\
+\x6e\x86\x8b\xce\x5b\xcd\x39\x8b\xcf\x22\x63\x39\x61\xb3\x83\xad\
+\xb6\xc3\xd7\x36\x8e\xb6\x71\x94\x43\x46\xd9\x94\xbc\x3c\x45\x2f\
+\x8f\xc1\xc5\xc7\xc3\x18\x17\xdf\x78\xb8\xa6\x82\x67\x2a\x94\xfd\
+\x20\xc7\xa0\xe8\x15\x28\xba\x63\x53\xc9\x42\x08\x6e\xbd\xe6\x76\
+\xfe\xee\x1f\x7f\xcc\xcd\x8f\xfe\x41\x2b\x8f\x6f\xca\x90\x96\x55\
+\x3c\xd9\xa5\x6d\xda\x97\x00\x7a\x1e\x59\x9d\xc1\xd6\x36\xf3\xb2\
+\x59\xae\x7d\xfb\x5b\x38\x78\xe0\x24\x3f\xf9\xe9\x4b\x7c\xe7\x03\
+\xbb\x58\x3f\x78\x3e\x5f\xb8\xf6\xeb\xbc\x67\xcd\x36\xfe\xe2\xbf\
+\x3f\x86\xe3\xdb\x5c\xb2\x7a\x2d\xab\xce\x5a\x44\x46\x5b\x64\x94\
+\x4d\x46\x59\xe1\x6b\x0b\x5b\xd9\x01\x19\xb4\x8d\xa3\x1d\x9c\x2a\
+\x09\x0a\x18\xe3\xe3\xe1\x61\xfc\x4a\xe8\x20\x56\xf0\x7c\x97\x8a\
+\x5f\xa1\xec\x96\xc2\x9c\x82\x38\x09\xe0\xc6\x2b\x3e\xc6\xb3\x6f\
+\x3c\xcd\xa7\x1f\xfb\xd8\xa9\x4b\x74\x12\xa8\x57\x67\x30\xd1\x75\
+\x8d\xda\x36\x23\xa8\x4f\x06\x1a\xa0\x27\xdb\xc5\xb6\x2b\x2f\xe6\
+\xf5\x03\xc7\xf8\xd1\xdf\x3d\xcf\xb7\xff\xc5\x0f\x58\x3f\x78\x7e\
+\xf5\x73\xff\xee\xdd\x5f\xe5\x3d\x6b\xb6\x71\xcf\x7f\xfb\x2e\x96\
+\x67\x71\xd9\xaa\x75\x9c\x3b\xb8\x14\x47\x3b\x64\xb4\x83\xa3\x9c\
+\xb1\xd7\xda\x0a\xb4\x40\x75\xeb\x50\x72\xf3\x94\xbc\x7c\x60\x0a\
+\xf0\x30\x26\x20\x81\x67\x5c\x5c\xbf\x1c\x92\x20\x2c\x36\xa9\x26\
+\x95\x14\xb1\xa4\xe2\x23\x97\xdd\xc4\x2f\xde\x78\x86\xcf\x3e\xf1\
+\xe9\xd3\xf8\xa4\x02\xa4\xd5\x24\xcc\x6a\x13\xd0\x2b\x7a\xe8\xcb\
+\x76\xf3\xfe\xab\x7f\x8b\x57\x5f\x1f\x62\xe7\x93\xbf\xac\x0a\x3f\
+\xf9\x9d\x3f\x7b\xd7\x57\x78\xcf\x9a\x6d\xdc\xfa\xf0\x37\xb1\x3c\
+\x9b\xb7\x9d\xb3\x81\x35\x03\xcb\xb0\xb5\x83\x63\x39\x38\x61\xcf\
+\xcf\xa8\xa0\xe7\x3b\xca\x0e\x35\x83\xc6\xd1\x36\x65\x3f\x4f\xd9\
+\x2b\x04\x24\xf0\x3d\x7c\xdf\xc5\x33\x95\xea\x70\xb1\x62\xca\x01\
+\x09\xdc\x02\x25\xaf\x44\xc5\x77\x71\x8d\x8b\xa5\x35\x1f\xba\xe4\
+\xdf\xb0\xe7\xd0\x2f\xb8\xef\x27\x77\x9d\xba\xf4\x4e\x23\xda\x96\
+\x00\x3d\xa2\x9b\xad\x97\x5f\xcc\xde\x7d\x07\xf9\xeb\xbf\x7d\x96\
+\xbf\x7a\xff\xf7\x59\x37\xb0\xa9\xee\xf7\xee\xbd\xe6\x2f\xb8\x76\
+\xf5\x56\x6e\xfe\xeb\xaf\x63\xf9\x16\xef\x58\xb9\x89\xb5\x03\xcb\
+\xc8\xa8\x50\xe5\x6b\x07\xdb\x1a\x23\x84\xa3\x6c\x6c\xe5\x84\xe6\
+\xc1\xa2\xe4\xe7\x19\xad\x9c\xc4\xe0\x05\x7e\x41\xcc\x14\xb8\x7e\
+\x85\x8a\x5f\xa6\xe2\x95\x70\xfd\x32\x9e\x57\xc1\xf3\x3d\x3c\xcf\
+\xc5\x52\x16\xff\xf2\xc2\x7f\xc5\xf3\x87\xf7\xf0\x95\x9f\x7e\x61\
+\xda\x04\x35\x5d\x68\x89\x00\xc9\xa4\x84\xe9\x6c\x11\x7a\xe8\xe6\
+\xe7\xff\x77\x2f\xdf\xfc\x9b\xa7\x03\xe1\x2f\xdc\xd8\xf4\xbb\x7f\
+\xfa\xce\x2f\x73\xed\xea\xad\xfc\xfe\xb7\xff\x1c\x5c\x8b\xb7\x2f\
+\xbf\x90\x37\x2d\x3c\x07\x47\x39\xd8\xca\xaa\xf6\x7e\x5b\xdb\x58\
+\x71\x93\xa0\x6c\x1c\x65\xe1\xe3\x92\xab\x9c\x0c\xb4\x40\xd5\x14\
+\x54\xaa\x8e\xa1\x31\x06\xcf\xf8\xf8\xc6\xc3\x0b\xcd\x84\x6f\x5c\
+\xb4\xd2\xfc\xf3\x4d\xbf\xc3\x8b\xc7\x5e\x60\xc7\x73\x5f\x9f\x36\
+\x61\x4d\x07\xda\xd2\x07\x58\x90\xeb\xe7\xe9\x5f\xfe\x9a\x1d\x3f\
+\xfa\x9f\x3c\xf8\xcf\x1e\x65\xdd\xc2\x8d\x2d\x7f\x37\x22\xc1\xf5\
+\x0f\x7d\x8e\xb2\x2b\xb9\x7c\xd9\x45\x9c\xd7\x7f\x4e\x75\x64\x60\
+\x2b\xbb\xea\x20\x5a\xda\xc6\x0a\x7d\x02\x5b\x59\x38\xd2\xc2\x33\
+\x2e\xb9\xca\x09\x4c\x48\x02\xcf\xb8\x78\xbe\x0b\xc6\x54\xf3\x8c\
+\x3c\xe3\x8f\xb5\x90\x7c\x5a\x69\xfe\xe9\xba\x6d\xbc\x7c\xec\x45\
+\xbe\xb3\xe7\xbf\x4e\xdb\xb3\x99\x6a\xb4\x65\x20\xe8\xc7\xbf\xdc\
+\x43\xb1\x08\x0f\x6e\x7f\x94\x75\x03\x1b\x27\xfc\xfb\xf7\x5c\xfd\
+\x25\x00\x7e\xef\xaf\x6e\xe3\xdb\xd7\xdd\xc7\xa5\x4b\x37\xa3\xa5\
+\xc5\xab\xc3\x6f\xa0\xa5\x17\xaa\x6f\x1f\x69\x2a\x78\x42\x52\x09\
+\x53\xc4\x04\x12\x84\xa4\xe2\x57\xc8\x55\x86\xe9\xb6\x7a\x41\x0a\
+\x84\xaf\x31\xd2\x44\x29\x85\x61\x7c\xc0\xc7\x37\x3e\xd5\x7f\xbe\
+\x4f\xc6\x72\xb8\xe6\x4d\xd7\xf2\xbf\x5f\x7b\x86\x47\x5f\xf8\x2e\
+\xbf\xbd\xee\xfd\x53\xff\x70\xa6\x18\x6d\xa9\x01\x8a\x45\xf8\xd6\
+\xf6\x9d\xac\x1b\x6c\xbd\xe7\x27\x71\xcf\xd5\x5f\xe2\xda\xd5\x5b\
+\xf9\xc4\xf7\xef\xa1\xec\x49\x2e\x59\x72\x09\xab\x17\xac\xaa\xda\
+\x7e\xdb\x0a\xe2\x0b\x96\xb2\xb1\x95\x85\x25\x6d\x2c\xad\xb1\x94\
+\xc6\x96\x16\x1e\x15\x86\x2b\xc7\x11\x18\x8c\x6f\xaa\xe5\x67\x21\
+\x4d\xc2\x20\x53\xcc\x0f\xc1\xc7\xc7\xa0\xa5\xe2\x8a\x55\xef\x60\
+\xff\xc8\x3e\x1e\x7f\xe9\x7f\x4c\xd9\x33\x99\x2e\xb4\xa5\x13\xf8\
+\xcd\xf7\x3d\x52\xed\xf9\x93\x69\x9f\xdf\xf2\x00\x1b\x07\x2e\xe3\
+\xe3\x3b\x3f\x4b\xd1\x95\xbc\x75\xf1\x25\xac\x9a\xbf\x2a\xb0\xfd\
+\x2a\x30\x07\x8e\xb6\x70\x64\x48\x82\xf0\x98\x56\x1a\x5b\xda\x58\
+\x42\x53\xa8\xe4\xc0\xf8\x08\x43\x30\x11\x25\x65\x50\x6a\x26\x04\
+\xb1\x58\x63\x38\xf7\x14\x5c\xbf\xa5\x34\x17\x2f\xbf\x8c\xa1\xd1\
+\x83\x3c\xfd\xea\x4f\xa6\x47\x72\x53\x84\xb6\x23\xc0\x73\x37\xbc\
+\x34\x25\xc2\xaf\x25\xc1\xc5\x7c\xfc\xd1\xcf\x50\x74\x05\x17\x2e\
+\xba\x9c\x95\xf3\x57\x61\x6b\x0b\x27\x14\xba\xa5\x35\xb6\xb6\xb0\
+\xa5\x0e\x84\xaf\x6c\xb2\x56\x96\xac\xee\xc2\x51\x0e\xf9\xf2\x28\
+\x00\x42\xc8\x6a\x56\xb1\xac\x56\x22\x8f\x65\x11\xc4\x61\x49\xcd\
+\x05\x4b\xde\xc2\xf1\xfc\x11\xfe\x7e\xff\x73\x53\x29\xb3\x29\x45\
+\xdb\x11\x60\x3a\xda\xdd\x57\xdd\xcf\x86\x85\x9b\xb9\x79\xe7\xa7\
+\x29\xba\xf0\x96\xb3\x2e\x67\x65\xef\xb9\x01\x09\x64\x20\x70\x4b\
+\x59\xe1\xbe\x45\x56\x67\xc8\xea\x2c\x59\xab\x8b\xac\xce\xa2\xd0\
+\x14\xcb\x81\x26\x90\x52\x21\x55\x34\x0d\x2d\x63\xd3\xc9\xb5\xd9\
+\xd7\x02\x50\xd2\xe2\xcd\x67\xad\x63\xa4\x34\xcc\x6f\x86\x9e\x9f\
+\x7a\xe9\x4d\x01\xda\xd2\x07\x98\x0e\xdc\x7d\xd5\xfd\x6c\xe8\x7f\
+\x2b\x1f\xdb\xf9\x49\x8a\x2e\x9c\x7f\xd6\xe5\x9c\xd3\x1b\x68\x82\
+\xc8\xee\xdb\xd2\x22\x63\x65\x02\xc1\xab\x6c\x30\x17\xa1\xb3\x38\
+\xd2\xc6\x92\x16\x95\x70\xb6\x30\x4a\x2d\xd7\x61\x4e\x42\xe4\x1d\
+\x48\x11\xa6\xa0\x0a\x09\x61\x25\xb2\x92\x16\x2b\xfb\x57\x91\xaf\
+\xe4\xd9\x77\xf2\xd5\xd3\xfd\x18\xc6\xe1\x8c\xd0\x00\x51\xfb\xdc\
+\x55\x5f\x64\x7d\xff\x85\xdc\xf4\xc8\x2d\x14\x5d\xc3\xa6\xc1\xcb\
+\x59\xd1\x7b\x2e\xb6\xd2\x58\x32\xa8\x14\xca\xaa\x60\xf5\x31\xc7\
+\x0a\x5a\x46\x67\xd0\xc2\x0e\x56\x29\xd3\x19\x5c\xbf\x8c\x31\x1e\
+\x32\xcc\x32\x8e\x9b\x83\xb1\xb5\x08\x6a\xd7\x27\xd0\x52\xb1\xb4\
+\x77\x29\x65\xb7\xc4\x91\xdc\xd0\x8c\xdd\x6f\x87\x00\x69\x24\xb8\
+\x32\x20\xc1\xbf\x7d\xe4\x66\x8a\xae\xcf\xa6\xc1\xcb\x58\xd1\x7b\
+\x2e\x19\x9d\x21\x63\x8d\x2d\x3d\x97\x51\x19\x9c\x70\x6b\x0b\x1b\
+\x47\x06\xfb\x8e\xca\xe0\x1b\x1f\x83\x87\x94\xaa\xaa\x05\x84\x94\
+\xa1\x8f\x30\xe6\x27\x28\xc2\x89\x19\x24\x52\x2a\xfa\xbb\x06\x30\
+\xc6\x27\x5f\xce\xb7\x24\x9c\x99\xc0\x19\x63\x02\xe2\x48\x92\xe0\
+\xfc\x90\x04\x51\x2f\x77\x64\x6d\xd3\xd8\x58\xd2\x26\xa3\xb2\xc1\
+\xc4\x92\xca\x60\x8c\x8f\xef\x07\x9a\x40\xa1\xaa\x79\x8a\x51\xaa\
+\x9a\x40\x85\xdb\x20\x3f\x51\x22\xd1\x42\xd3\x6d\xcd\x43\xca\xfa\
+\xf9\xfe\x1d\x0d\x30\x43\xed\xae\x77\xfc\x39\xeb\xfb\x2f\xe2\x13\
+\x8f\x7e\x8a\xa2\x6b\xd8\x38\xb0\x99\xe5\x3d\x2b\x71\xa4\x8d\xa3\
+\x33\x58\x2a\x83\x2d\x1d\x2c\xe5\x60\x09\x3b\xd0\x02\x3a\xd0\x00\
+\xb6\xca\x90\x51\x59\x04\x32\x08\x05\x4b\x85\x24\xca\x59\x0c\x2a\
+\x90\xa2\xa6\xc5\xd8\x7e\x90\xd2\xa6\xb1\xa5\x33\x23\xcf\xb5\x43\
+\x80\x26\xed\xb3\x6f\xbf\x8f\x8d\x0b\xdf\xca\x67\x1e\xbb\x93\xb2\
+\x6b\x58\xd7\x7f\x3e\x4b\x7a\x96\x63\xc9\x70\x7e\x20\xcc\x1b\x50\
+\x04\x42\x0b\x8e\x67\xc9\x68\x07\x5b\x67\xc8\x68\x07\x25\x2c\x7c\
+\xe3\xa3\xa5\x42\x0b\x0b\x25\x74\x90\xc2\x26\x54\xb5\x0a\x39\x20\
+\x80\x46\x49\x3d\x2e\x6d\xed\x74\xe3\x8c\x34\x01\x71\xfc\xf1\x6f\
+\x7d\x8e\xf5\xf3\xdf\xc2\xe7\x7f\xfc\x05\xca\x9e\xcf\xda\xfe\xf5\
+\x2c\xe9\x5e\x82\x96\x0e\x5a\xd8\x68\xe1\xa0\xd0\x68\x61\xe1\x48\
+\x07\x5b\x3b\x81\xa9\x50\xe1\x56\x3a\x68\x11\x2c\xf4\x14\xd4\x1f\
+\xea\xb0\xb7\x6b\xb4\xd0\xa1\x89\x08\x49\xc0\xd8\x22\x51\x33\xd1\
+\x5a\x41\xbd\x8c\x01\x4d\xf0\xb7\x72\x2f\x30\xc6\xb4\x7f\x3c\x73\
+\x0a\x70\xdb\xae\x4f\xb1\x3f\xf7\x32\x1f\x7f\xdb\x47\xb0\x24\xbc\
+\x7c\xfc\x15\x8e\xe6\x8f\x63\x8c\x62\xdf\xbe\xd7\xe9\x9b\xdf\xcf\
+\xc2\xf9\x03\x38\x4e\x06\x25\x2c\xb4\xd0\x28\x69\xa1\x64\x10\x46\
+\xd6\xd2\xc2\x51\x19\xba\xed\x1e\xb2\x2a\x5b\xf5\x27\x6c\x15\xf8\
+\x0f\x4a\x69\xe4\x0c\xf7\x37\xcb\xb2\x10\x42\xbc\x0d\xf8\x07\x60\
+\x98\x94\xd2\x98\x7a\x93\x41\x86\x60\x61\xa1\xa3\xdb\xb7\x6f\xff\
+\x93\xe1\xe1\xe1\x85\xae\xeb\xd6\x5d\x66\xa4\x9d\x60\x8c\x51\xe5\
+\x72\xb9\x7b\xde\xbc\x79\x4b\x2f\xbd\xf4\xd2\xab\x5a\xff\xa6\xe6\
+\x55\xf7\x10\x9f\xde\x77\x17\xbf\xff\xd6\xdf\x41\x1a\x9f\xa1\xa3\
+\x87\x39\x51\xca\x61\xdb\x61\x8f\xd7\x0e\x8e\x74\x50\xd2\x46\xca\
+\x40\xd5\x07\xc2\x0f\xe2\x04\xb6\xca\x04\xbe\x80\x0c\x22\x8c\x5a\
+\x6a\xb4\x0c\xcc\xc2\x4c\x0b\xbf\x55\xd4\x13\xa8\x24\x58\x69\x72\
+\x31\xb0\x02\xe8\x27\x58\x66\xa4\xdd\x21\x08\x56\xc4\x18\x1c\x1c\
+\x1c\xbc\xe8\x96\x5b\x6e\xf9\xdd\x89\x9e\xe0\x1f\xc4\xcf\x29\x67\
+\x46\xf8\xdd\xf3\xdf\x8b\xc4\xb0\x7f\x74\x08\xcf\x52\x2c\x5c\x78\
+\x16\x3d\xf3\xfa\x70\xb4\x83\x54\x3a\x34\x0f\x1a\x15\x0a\xdf\x52\
+\x0e\xb6\x0c\x52\xcf\x6c\x95\x0d\x56\x2b\x57\x19\xb4\xb4\x5a\x4a\
+\xcd\x9a\x0e\x38\x8e\x33\x29\x0d\x50\x24\x58\x62\xac\x08\x64\x68\
+\xb2\xd2\x44\x9b\x40\x10\x10\x77\xd9\xaa\x55\xab\x96\x6f\xd9\xb2\
+\x65\xc2\x27\xd8\xc2\x16\x9e\x3c\xf8\x23\x9e\x3d\xf6\x6b\xde\xb7\
+\xfe\x6a\x56\xe8\x15\x0c\x95\x46\x70\xa5\xc4\xd6\x59\xb4\x0a\x55\
+\xbf\xb0\xb0\xa4\x85\x16\x16\x96\x76\xb0\xa4\x83\x2d\x6d\x6c\x19\
+\x6a\x0b\x69\xa3\x64\xf0\x78\x5b\xb5\xc7\xa7\x03\x8d\x08\xe0\x01\
+\xa3\x04\x04\x68\x4f\xfd\x95\x8e\x6e\xc0\x1a\x1c\x1c\xcc\x6d\xd8\
+\xb0\x81\x72\xb9\x3c\xe1\x13\x9c\x77\xde\x79\xfc\x68\xef\x0f\xf8\
+\xf9\x91\xff\xc7\xb5\x6f\xba\x9c\x05\x7a\x80\xa1\xfc\x28\x45\x2f\
+\x1c\xf7\x8b\x50\x03\x48\x1d\x0c\x13\xa5\x1d\xcc\x1e\xaa\x0c\x76\
+\x38\x54\xb4\xa4\x5d\xa7\xec\xac\xbd\xd0\x28\x21\x24\x22\x41\xfa\
+\x0a\xcb\xed\x09\x41\xb0\x26\x5e\x59\x6b\xed\xf5\xf4\xf4\x90\xcf\
+\x9f\x5a\xd4\x6d\xfb\x86\x0f\xf0\xe4\x2b\x7f\xc3\xb3\x6f\xfc\x86\
+\x2b\x56\x5e\xc0\xa2\x9e\x85\x1c\x2b\xe4\xa9\x54\x7c\xa4\x0c\x08\
+\x60\x29\x0b\x1d\x09\x5f\x66\xb0\x95\x83\x23\x6d\xb4\x08\xac\x65\
+\x3b\xf7\xfc\x08\xb3\xa9\x67\x4f\x08\x93\xfd\x7b\xbf\x00\x5b\x56\
+\xbd\x9b\xa5\xf3\x56\xf1\x7f\xf6\xbf\x82\x31\x92\xfe\xee\x3e\xba\
+\x9d\x6e\x2c\xe1\x04\x79\x03\xc2\x09\x85\x1f\xd8\x7f\x3b\x74\x08\
+\xa1\x3d\x62\x27\xad\xa0\x6d\x4b\xc3\x26\x8b\xb4\x35\x74\x4e\x05\
+\x97\x2c\xbb\x82\x5f\x1d\xfa\x05\x2f\x0f\x1d\x62\xcd\x59\xcb\xe9\
+\xc9\xce\xa3\x54\xf2\x30\x46\x06\x59\x44\x91\xed\xd7\x81\x26\xc0\
+\x54\xd3\x43\x66\x05\xe6\xac\x06\x98\x4a\x6c\x5a\x74\x11\x0b\xb3\
+\x8b\x39\x78\xe2\x04\xc2\x57\x74\x39\x5d\x64\x74\x26\x08\x11\x4b\
+\xbb\x1a\x2e\x6e\x7f\x1f\x79\x3c\xe6\xac\x06\x88\x30\x55\x76\xf8\
+\xbc\xfe\xb5\xbc\x3e\xfc\x1a\xc3\xb9\x02\xfd\x3d\xf3\x83\x20\x8b\
+\xa7\xaa\x31\x80\xa9\xfc\xad\x99\x44\x87\x00\x13\xc0\xd2\x9e\xe5\
+\x1c\x2b\x1c\xa5\x5c\xf2\xe9\xce\x58\x68\x6d\xa1\xb1\x66\x9d\xda\
+\x8f\xa3\x63\x02\x26\x88\xfe\xec\x42\xba\x74\x37\xc2\x93\xa8\x39\
+\xd0\x7f\x66\xff\x1d\x34\xc1\x74\xa8\xe5\x8c\xce\x56\xd7\x1f\x9a\
+\xad\x3d\x3f\x42\x87\x00\x93\x39\xf7\x2c\x17\x3e\xcc\x61\x13\x70\
+\x3a\x16\xb7\x9c\x8d\x98\xf3\x1a\xa0\x43\x84\xc6\x98\xf3\x04\x98\
+\x8d\x43\xb3\x99\xc4\x9c\x35\x01\x1d\xb4\x86\x8e\x06\x38\xc3\xd1\
+\x21\xc0\x19\x8e\x8e\x09\x38\xc3\xd1\xd1\x00\x67\x38\xe6\x2c\x01\
+\xa6\x6a\x3a\x78\xae\xa3\x63\x02\xce\x70\xcc\x59\x0d\x10\xa1\xa3\
+\x01\x1a\xa3\x43\x80\x33\x1c\x1d\x13\x70\x86\xa3\xa3\x01\xce\x70\
+\xcc\x55\x02\x54\xff\xe2\xc3\xd9\x67\x9f\x7d\x9a\x2f\xe5\xb4\xa3\
+\x61\x0f\x98\x8b\x04\x30\x80\xb7\x67\xcf\x9e\x23\x77\xdd\x75\xd7\
+\x63\x95\x4a\x65\x2e\xde\x63\x53\x58\x96\xe5\x2e\x58\xb0\x60\x98\
+\xa0\xae\xa3\x2e\x09\x66\x5f\x1a\x6b\x63\x08\x82\x32\xb6\x25\xc0\
+\x7a\x60\x29\xe0\x30\xf7\xee\xb3\x19\xa2\xe2\xde\x37\x80\xe7\x81\
+\xfd\x04\x15\x5e\xe3\x88\x30\xd7\x1e\x4c\x54\x19\xd4\x07\x2c\x02\
+\x7a\x09\xb4\xdc\x5c\xbb\xcf\x66\x30\x80\x4b\x50\x10\x7a\x08\x38\
+\x49\x1d\x4d\x30\x17\x1f\x8c\x20\xa8\x64\xce\x84\xdb\xb9\x78\x8f\
+\xad\xc0\x00\x15\x82\x9e\x5f\xa1\x8e\x19\x98\xab\x0f\x27\x5a\xd8\
+\xbb\x83\xe0\xef\x61\x76\x86\x42\x1d\x74\xd0\x41\x0a\xfe\x3f\x32\
+\x6b\x8b\xf8\x56\x76\x1c\x55\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x0a\
+\x08\xaa\x3c\x67\
+\x00\x6c\
+\x00\x6f\x00\x63\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x04\xf6\x3d\xa7\
+\x00\x6d\
+\x00\x6f\x00\x76\x00\x65\x00\x5f\x00\x63\x00\x65\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x09\xfa\x25\xa7\
+\x00\x63\
+\x00\x72\x00\x65\x00\x61\x00\x74\x00\x65\x00\x5f\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x6f\x00\x67\x00\x79\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
+\x00\x11\
+\x0a\xfd\x03\xc7\
+\x00\x61\
+\x00\x70\x00\x70\x00\x6c\x00\x79\x00\x5f\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x6f\x00\x67\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x0a\
+\x08\xab\xda\x07\
+\x00\x75\
+\x00\x70\x00\x64\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x00\xe0\xbd\xe7\
+\x00\x63\
+\x00\x6f\x00\x70\x00\x79\x00\x5f\x00\x63\x00\x65\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x02\
+\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xaa\x84\
+\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x33\x7b\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x7c\xef\
+\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x4e\xca\
+\x00\x00\x00\x76\x00\x00\x00\x00\x00\x01\x00\x00\x59\x53\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/packages/spreadsheet/celltoolbar_rc.py b/vistrails/packages/spreadsheet/celltoolbar_rc.py
new file mode 100644
index 0000000..7bc26d6
--- /dev/null
+++ b/vistrails/packages/spreadsheet/celltoolbar_rc.py
@@ -0,0 +1,677 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created: Mon Jul 19 16:02:46 2010
+#      by: The Resource Compiler for PyQt (Qt v4.6.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x09\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x08\xd6\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x32\x60\x64\x64\x64\xc0\x00\x6c\x82\x0c\x0c\
+\xdc\xca\x0c\x0c\x3c\x40\x2c\x62\xc3\xc0\xc0\xc4\x0e\x14\x04\xea\
+\x63\x64\xb0\x61\xf8\xf5\x6f\x15\xc3\x9f\xbf\x07\x19\x38\x59\x4b\
+\x81\x82\x4f\x30\xf4\xfe\x7a\x0f\x14\x5d\xc3\xc0\xf0\xfe\x0c\x5c\
+\x08\xd9\x4e\x80\x00\x62\xc4\xeb\x00\x4e\x29\x06\x06\x09\x0f\x06\
+\x06\x3e\x1d\x06\x06\x56\x3e\xa0\x24\x13\x03\xc3\xbf\x3f\x10\xcb\
+\xc1\x86\xff\x6d\xd0\x31\x94\xaa\xe7\xe5\x65\x67\x38\xbe\xef\xee\
+\x43\x06\x56\xa6\x0e\x06\x56\xe6\x39\x40\x99\x3f\x08\x03\x99\x40\
+\x04\x03\xc3\xdb\x63\x0c\x0c\x8f\x57\x01\x65\xbe\xa0\x38\x00\x20\
+\x80\x98\x18\x70\x01\x61\x2b\x06\x06\xad\x7a\x06\x06\x51\x07\x88\
+\xe5\xff\xff\x02\x2d\xff\x8d\xb0\x1c\x04\x7e\xff\x63\x94\x93\xe5\
+\x67\x58\x36\xc5\x83\xa1\xaa\xc1\x4d\x5e\x44\x9c\x7f\x3a\xc3\xd7\
+\x5f\x47\x18\xfe\xfd\x77\x41\x78\xf7\x1f\x44\x2f\xc8\x1c\x9d\x66\
+\x06\x06\x29\x5f\x14\x6b\x00\x02\x08\xbb\x03\x84\xcc\x18\x18\x94\
+\x33\x20\x2e\xff\xfb\x1d\x62\x00\x36\xc0\xc8\xf0\xfd\xfb\xf7\xbf\
+\x0c\x0f\x3e\x33\x30\x58\xb9\xaa\x32\xf4\x4d\x0e\x61\xf0\x08\x33\
+\x33\x67\x62\x66\xde\xcd\xf0\xe3\xd7\x22\xa0\x0a\x65\xb8\x5a\x90\
+\x39\x2c\xbc\x0c\x0c\x32\x61\x28\x46\x00\x04\x10\x0b\x56\x83\x55\
+\xb2\x21\x1a\x10\x80\x19\xe8\x71\x63\x86\xbf\xff\xf4\x81\xbe\x13\
+\x05\xf3\x81\xe1\x01\x8c\x02\xe7\xef\x3f\xff\x31\x3c\x06\x46\xf3\
+\xc3\x77\x0c\x0c\x5c\xec\x6c\x0c\xc1\x09\x66\x0c\x5a\x26\xaa\x0c\
+\xeb\x57\x9c\x8a\xbd\x7f\xe9\xae\x2f\x03\x13\x43\x0f\x03\x2b\xcb\
+\x04\xa0\xfa\xaf\x60\x8f\xfc\xfd\x86\x62\x15\x40\x00\x61\xa6\x01\
+\xad\x6a\xa0\x49\xf2\x0c\x48\x29\x26\x96\xe1\xc7\x9f\x42\x06\x76\
+\x26\x43\x71\x71\x6e\x06\x50\x7c\x83\xd2\x09\x48\x17\xe3\xcf\xdf\
+\x0c\x9a\xc6\x4a\x0c\xd6\x7e\x96\x0c\xcf\x3f\x01\xd3\x26\x23\x24\
+\x82\x38\x39\x80\x72\x40\xbb\x6e\x9e\x7b\xc8\x70\x64\xdb\x29\x86\
+\x17\x77\x5f\x5e\x65\x60\x63\xa9\x63\x60\x61\x5a\x07\x36\xf2\x4c\
+\x1a\xdc\x78\x80\x00\xc2\x74\x80\xd9\x02\xa0\xdf\x7e\x81\x98\xdc\
+\xc0\xd4\x3d\x87\x85\x99\x31\xc2\xc6\x49\x8d\xc1\xc4\x5e\x9d\x81\
+\x5f\x5c\x04\xe8\x77\x56\xa8\xc3\x80\x08\x68\x21\x33\x90\x78\xf1\
+\x81\x91\xe1\xed\x0f\x20\x9b\x11\xe6\x66\x48\xda\xe3\xe6\x04\x3a\
+\x06\xe8\xeb\x07\x67\x2e\x33\x1c\xd8\x76\x81\xe1\xfd\xeb\xaf\x9b\
+\x18\x38\x58\x6b\x80\x0e\xb8\x0c\xb3\x0f\x20\x80\x30\x1d\x60\x32\
+\x0b\x12\x35\x7f\xfe\xae\xe7\xe5\xe3\xf0\xf1\x88\x77\x66\xe0\x57\
+\x92\x63\x78\xf9\x81\x01\x18\xe1\x40\xb7\x21\x29\x07\xb1\x85\x81\
+\x96\xb0\x00\x2d\x7b\xfb\x1d\x12\x02\xc8\x00\x6c\x34\x50\x4c\x0c\
+\x98\x8b\x65\xb8\x7e\x30\x1c\x59\x77\x84\xe1\xe8\xfe\xdb\xef\xff\
+\x5f\xcc\x14\x82\xa9\x01\x08\x20\xec\x69\xe0\xdf\xff\x62\x56\x36\
+\x16\x1f\xd3\x30\x4f\x86\xb7\x3c\x12\x0c\xf7\xef\x00\x7d\x07\xb4\
+\x84\x09\x84\x99\x51\x1d\xf0\x0d\x98\x31\xfe\x01\x83\xfb\xe3\x77\
+\x44\x08\xa0\x24\x1e\x60\x80\xdd\x7d\xc1\xc0\x70\xf6\xfe\x0b\x86\
+\x4f\x0f\x3f\x82\x14\x5d\x45\x96\x07\x08\x20\x6c\x0e\x90\x65\xf8\
+\xfd\xbb\x4c\xc1\xce\x9a\x41\x40\x41\x82\xe1\x27\x30\xcd\x70\x09\
+\x00\xcb\x22\x60\xd9\xf3\xe3\xeb\x1f\x86\xcf\x6f\x3f\x32\xfc\x83\
+\x05\x03\x90\x66\x15\xe4\x60\xe0\x11\xe4\x65\x60\x61\x05\x95\x21\
+\x48\x16\x03\x1d\xca\xc2\xc6\xc0\xf0\xea\xe1\x5b\x86\x9b\xfb\x4e\
+\x32\xbc\xb9\xf3\xe0\x35\x50\x05\xa8\x9c\x98\x86\x6c\x19\x40\x00\
+\x61\x3a\xe0\xef\xbf\x44\x36\x01\x3e\x21\x13\x7b\x6d\x06\x41\x1e\
+\x20\x17\x98\xa0\xd8\x80\xf8\xc6\xd9\xfb\x0c\x27\x37\x1d\x67\xf8\
+\xfc\xf1\x33\x3c\x68\x19\x7e\xfc\x66\xd0\xb5\xd6\x64\x70\x4f\x70\
+\x66\xe0\x01\x3a\x94\x11\x1a\xf7\x1c\xc0\x68\xf9\x08\x4c\x14\xa7\
+\x77\x9f\x67\xb8\x7e\xec\xca\xff\xbf\x3f\x7f\xcd\x65\x60\x63\x05\
+\x16\x02\x0c\x8f\xd0\xad\x03\x08\x20\x4c\x07\xfc\xfa\xe3\xa3\xac\
+\x29\xc5\xa0\xa7\xce\xc6\xf0\x0b\x98\xb0\x58\x81\xbe\x78\x70\xeb\
+\x35\xc3\xbe\x45\xbb\x18\xfe\xfe\xfe\xbb\x18\xe8\x83\x79\x40\x6b\
+\xbe\x83\x5d\xf1\x9f\x21\x95\x99\x85\x21\x59\x1c\x18\x42\x3c\xc0\
+\x10\xe2\x04\x5a\xfc\x1b\x98\x7e\x4f\x1e\xb8\xce\x70\x70\xe3\x59\
+\x86\x4f\x2f\x3f\x1c\x62\x60\x67\xad\x01\x5a\x7e\x18\xb9\xf0\x40\
+\x06\x00\x01\x84\xe9\x80\x3f\xff\x95\x35\x35\x84\x19\xd4\x64\x81\
+\xf1\xfb\x15\x68\x28\x17\x03\xc3\xee\x15\xb7\x18\xfe\x7e\xfd\x75\
+\x0e\x68\x4b\x1c\xaa\x41\x8c\x2e\xac\x40\x13\x64\xc5\x81\x21\x05\
+\x2c\x7c\x2f\x9c\x79\xce\xb0\x7e\xf1\x29\x86\x3b\x97\x9e\x80\x8a\
+\xe5\x66\x06\x4e\xb6\x79\xa8\x45\x27\x88\xf7\x1b\x85\x0b\x10\x40\
+\x98\x0e\xe0\x64\x15\x3a\x73\xf4\x2e\xc3\x8b\x27\x6f\xc0\x86\x82\
+\x12\xdd\xf5\x2b\xc0\x54\xc4\xc9\x76\x1f\x43\xed\x7f\x06\x76\x01\
+\x5e\x16\x06\xe6\x1f\xdf\x18\xe6\x4c\x39\xc5\xb0\x77\xfb\x8d\x1f\
+\xff\x7f\xff\x9d\x02\x34\xa3\x13\x28\xfb\x06\x6b\x02\xff\xfd\x09\
+\x85\x0b\x10\x40\x98\x0e\x60\x65\xea\x7f\x74\xe7\xb5\xc2\xa3\xeb\
+\x2f\x21\x9e\x04\xb9\x9f\x1d\x94\xa2\x98\xd6\xa0\xf9\x05\x28\xce\
+\xf2\xfd\xca\xc5\x67\x0c\x99\x49\xeb\x18\xde\x3c\xf8\xb0\x85\x81\
+\x9b\xb5\x16\x98\xcf\x2f\x30\xe0\x03\xec\x22\x28\x5c\x80\x00\x62\
+\xc1\xe2\xab\x22\x60\x3c\x33\x80\x31\xaa\x38\x26\x60\x61\x9c\xfe\
+\xfc\xf1\x47\x50\xc9\x74\x89\x81\x87\x6d\x03\x03\x31\x00\x54\x39\
+\x21\x01\x80\x00\x62\x62\xa0\x04\xfc\xfd\x2f\x01\x4e\xd9\x2c\x4c\
+\x7b\xc8\x35\x02\x20\x80\x30\x43\x80\x11\x28\xf4\xff\x0f\x21\x7d\
+\x02\xc0\xfa\xa1\x94\x89\x8b\xb5\x40\x48\x88\x93\xeb\xcd\xab\xaf\
+\x86\xc0\x62\x30\x1f\x4d\x8d\x31\x30\xa7\x44\x03\x2b\x2c\x44\xb2\
+\x07\x95\x64\xac\x4c\xc0\x04\xc5\xd0\x09\x13\x02\x08\x20\x4c\x07\
+\x7c\x05\xa6\x35\x2e\x59\xdc\x56\xff\xf9\x17\x03\xcc\xaa\x0d\x6a\
+\xfa\xd2\xca\xb9\x25\x56\x0c\xc7\x8f\x3e\x66\x58\x36\xfd\x84\x20\
+\x03\x37\x1b\x7a\x39\x1c\xc6\xc6\xc1\x5a\x28\xaf\x21\x06\x6f\xe8\
+\x7c\xfa\xf4\x03\x98\xb8\x3f\x32\x20\x3b\x00\x20\x80\x30\x1d\xc0\
+\xc2\xc3\x80\xa3\x78\x36\x07\x16\x3c\x2d\xfc\xe2\x7c\x2e\x3e\xe1\
+\xc6\x0c\xae\xde\x5a\x0c\x42\xc2\x8c\x0c\x3b\x76\x3e\x04\xa7\x6d\
+\x0c\xf5\x3f\xfe\xc8\xab\xe8\xc9\x30\xd4\x76\x7a\x03\x0b\x56\x48\
+\xe1\xb4\x77\xdb\x6d\x86\x99\x6d\xbb\xbe\x22\x2b\x03\x08\x20\x16\
+\xac\xa9\x14\xb5\x01\x22\xc5\xf0\xf3\x77\x15\x33\x3b\x6b\xba\xb1\
+\xa7\x01\x8b\x4b\x90\x11\x83\xa8\x38\x17\xc3\x33\x60\xe5\xf4\x1e\
+\x58\x50\xfd\xf8\x09\x2e\x12\x80\x4d\x26\x06\x79\xb8\x99\xff\xfe\
+\xf9\x03\x71\x90\xa6\xa9\x2a\x58\xdd\x4f\xa0\x3a\x0e\x60\x79\x72\
+\xf3\x0e\xc8\xf7\xff\x5f\x22\x1b\x0e\x10\x40\x58\x72\xc1\x5f\x84\
+\xdc\x9f\xbf\xe9\x40\x83\x6a\xa4\x35\xe5\x25\x2c\x7d\xcd\x18\xe4\
+\xd5\xc4\x18\xbe\x02\x7d\xf3\xf1\x31\x24\x53\xf0\x02\x03\xeb\xc7\
+\x0f\x60\xaa\xfe\xf3\x3b\x90\xe1\x37\x93\x37\xd4\x00\x66\x16\x36\
+\x36\x36\x3d\x5f\x63\x06\x69\x3d\x35\x86\xfb\xcf\x20\x65\xd6\x9f\
+\xb7\xc0\xac\x72\xee\x31\x28\x0d\x1c\x41\xb6\x0e\x20\x80\x70\xd5\
+\x86\x2e\xc0\x70\x6b\xe5\x12\x15\x32\xd3\xb0\x37\x65\x50\x32\x54\
+\x05\xa7\x9f\x7b\x4f\x51\x73\x25\x37\x30\x30\xc5\x35\xd5\x19\x8c\
+\x79\xc4\x99\x99\x58\x98\x38\x41\xc5\x33\x13\x30\xae\xf9\x44\x05\
+\x19\x04\x25\xf8\x18\x9e\x00\xab\x9f\x7f\x40\xf7\xb1\x02\xeb\x92\
+\xfb\x97\x1e\x33\xbc\x7b\x08\x4c\x7f\xac\x2c\x73\x91\xad\x02\x08\
+\x20\x16\x2c\x96\xcf\xe6\x15\xe0\x4c\xe1\x53\x33\x61\x90\x34\xd0\
+\x65\xe0\xe6\x63\x63\x78\xf6\x16\x5a\xb7\x33\xa0\x56\xc5\xbc\xc0\
+\x74\xc7\xc5\x2d\xc8\xc0\xa1\x28\xc8\x80\x5c\x6a\x7c\x07\x5a\xfa\
+\xe5\x15\xa8\x5e\x83\xd4\xa2\x7c\xc0\x86\xc4\xcd\xbd\x47\x40\x21\
+\x01\x6c\x9f\x33\x1c\x42\x36\x07\x20\x80\x30\x1d\xf0\xfb\x6f\x84\
+\x86\x86\x28\x83\x73\xb4\x3e\xc3\xbd\x8f\x2c\x0c\xaf\x80\x6d\x3d\
+\x76\x56\xf4\x2a\x04\xe2\x00\x6e\x76\x50\x88\x42\x1b\xe1\x4c\xa8\
+\x85\x0b\xa8\x06\x15\x01\x36\x44\x38\x7e\x7c\x62\xd8\xbb\x68\x37\
+\xc3\xe7\x97\xef\xee\x01\x0d\xca\x43\xb7\x0e\x20\x80\xb0\x24\x42\
+\x16\xd7\xd3\x47\x1e\x34\x3f\xba\xbb\xdc\xc5\x11\x18\x8f\x86\xba\
+\x9a\x0c\x9f\xfe\x30\x32\x7c\xfb\x8e\x5a\x1a\xc2\x42\x40\x46\x98\
+\x81\x41\x9d\x09\x62\x29\xac\x96\x06\x85\xc6\x9f\x6f\x9f\x19\x6e\
+\x9f\xbf\xcb\xb0\x65\xc3\x45\x86\x77\xaf\xbf\x5c\x06\x5a\x0e\x6a\
+\x0e\x3f\x47\xf7\x0a\x40\x00\xe1\x6a\x92\x81\x42\x22\x1e\x98\x08\
+\xeb\xe4\x35\xa5\x95\x6c\xbc\x81\x09\x50\x4b\x1a\x58\x51\x42\x52\
+\x3d\x23\xb8\x49\x0c\xf4\x21\x30\x11\x3e\x3e\x7f\x83\xe1\xf2\xf1\
+\x1b\x20\x87\xc3\xcd\xf8\xfc\xf9\x27\xc3\x93\x47\x1f\x19\x3e\xbd\
+\xf9\xf6\x0e\x18\xe7\xf3\x80\x25\x65\x2b\x50\xf8\x03\xc4\x02\x60\
+\x03\xfb\x74\x32\x5c\x2d\x40\x00\xe1\x76\x00\xb4\x87\x00\xcc\x82\
+\xa5\xc0\x2a\x31\x4f\xdd\x58\x8d\xcb\x37\x0c\x98\x20\x55\x79\x19\
+\x3e\x01\x43\xe3\x07\xb0\xde\x97\x01\xb6\xec\xd6\xcd\x3f\xc1\xb0\
+\x6d\xe1\xf1\xdb\xc0\xf8\x38\x08\x0d\xfd\x7f\xc0\x94\xf8\x16\x68\
+\xe9\x45\x60\xf3\xeb\x00\xc4\xd7\xb0\x66\x12\xb0\x30\xb8\x5a\xcf\
+\xf0\xff\xcb\x3d\xb8\x10\x40\x00\x61\x46\x01\x33\x17\xb4\x4f\x00\
+\x76\xd8\x3b\x60\xd0\x55\x02\x53\xe0\xb2\x9b\xa7\xae\x35\xdd\xbb\
+\xf6\x30\xc0\xcb\xdf\x80\x21\x24\x54\x97\x81\x4b\x9c\x05\x58\xf9\
+\x01\xa3\x81\x8b\x09\x54\x85\x1f\x60\xe0\x64\x49\xc3\x5b\x78\x83\
+\x2c\x7f\xb9\x1b\x52\xd2\x22\x01\x80\x00\xc2\xac\x8c\x9e\xac\x82\
+\x58\x0e\xd2\x80\xe8\x30\x5e\x66\xe0\x60\x0b\xfc\xfd\xf3\x67\xe0\
+\xc6\x45\x47\x2f\x97\x17\xac\x63\xb8\x72\xec\x01\x83\x16\xb0\x25\
+\xc4\xcb\xcd\x0c\x52\xce\x8a\xab\xeb\x04\xae\x5b\x98\x40\x8d\xc3\
+\xfd\xc0\xde\xcb\x62\x0c\x15\x00\x01\x84\xbd\x73\x0a\xee\x94\x7a\
+\x02\x23\xd9\x1a\x52\x30\xa1\x56\xa1\x5c\xc0\xba\x20\x07\x18\xd0\
+\x25\xae\xde\x1a\xa2\xff\x80\xfa\xf7\x6e\xbf\xb9\x18\x98\x06\x10\
+\xad\x25\x90\x85\x20\xcb\xff\x01\x8b\xc0\x9f\xc0\xc2\xe0\xd1\x72\
+\x06\x86\x4f\xd7\xb0\xf6\x8e\x01\x02\x08\x7f\xef\x58\xc0\x00\x58\
+\xc0\xc6\x62\xaf\x1f\xfe\x03\xfb\x7d\xc0\xba\x01\xd8\x6e\x70\x07\
+\xe6\xc5\x22\x20\x7f\x01\xd8\x52\x90\x63\x3f\x5e\x02\x16\x04\xb7\
+\x80\xa9\x11\x88\xbf\x3f\xc3\xa8\x5d\x91\xed\x04\x08\x30\x00\xbd\
+\xc3\xf9\xac\x32\x36\xd0\x57\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x04\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\x43\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xcc\xaa\x63\xf8\xf1\x27\x89\xe1\
+\xcf\xbf\xbf\x40\x2e\x44\x10\x01\x98\x18\xd8\x98\xff\x31\xb0\x33\
+\xb7\x01\x65\xe6\x31\xe0\x03\x8c\x0c\x21\x0c\xbf\xff\xb5\x00\xcd\
+\x62\x03\xf2\xfe\x61\xc8\x33\x33\x71\x30\x70\xb2\x6c\xfc\x7f\x26\
+\x2d\x1b\xc4\x05\x08\x20\x46\xb8\x03\x74\xa7\x7d\x48\x89\xd0\xe3\
+\xb7\xd4\x17\x67\xf8\xfe\xf3\x2f\x8a\x1e\x4e\x76\x66\x86\xcd\x87\
+\x1e\x32\x6c\xd8\x76\xfb\x04\x03\x3b\x93\x25\xaa\x85\x8c\xa8\x16\
+\xfc\xf8\xb3\xce\xca\x54\x3a\x30\x25\x44\x9b\xe1\xdb\x8f\x3f\x28\
+\x52\xec\x6c\xcc\x0c\x57\xef\xbe\x63\x98\xb8\xe8\xc2\xa7\x7f\xe7\
+\xd2\xf9\x41\x62\x00\x01\xc4\x02\x97\xfd\xfd\x8f\xc1\xc6\x54\x96\
+\x21\xd6\x4d\x9e\xe1\x13\x92\x3e\x90\xf3\x04\x80\xaa\x9e\xbc\xf9\
+\xc1\xb0\x61\xd3\x8d\x7f\x0c\x6c\x4c\xe8\x3e\x46\x65\xff\xfe\xf7\
+\x4f\x45\x4e\x90\x21\xc1\x5b\x85\xe1\xc3\x1f\x54\x69\x1e\xa0\x39\
+\x3b\xcf\xbc\x62\x98\xb4\xe0\x3c\x3c\x84\x01\x02\x88\x05\x29\x90\
+\xff\x3f\xff\xf8\x97\xe1\xe6\x07\x06\x86\xaf\xdf\x50\x1d\xc0\xcb\
+\xcd\xc0\xf0\xf6\xcb\x3f\x90\x69\xff\xf1\x06\xff\x7f\x88\x39\x1f\
+\xbf\xff\x63\xb8\xf9\x91\x81\xe1\xf3\x67\xa0\x16\x24\xf7\x72\x72\
+\x30\x30\x3c\x7d\xf7\x97\xe1\x3f\x92\x39\x00\x01\xc4\x82\xac\xff\
+\xd3\x4f\x06\x86\x97\x5f\x18\x18\xbe\x7d\x47\x35\xf7\x1b\x50\xf9\
+\x97\xdf\x68\xbe\xc5\x03\x40\x21\xff\x0a\x68\xce\xe7\x6f\xa8\x31\
+\xc4\x09\x8c\xd9\xf7\x3f\x50\xd5\x02\x04\x10\x0b\x72\xf0\x81\x1c\
+\xf0\xfa\x2b\x03\xc3\x77\x34\x07\x7c\x05\x3a\xe0\xeb\x2f\xe2\x2c\
+\x07\x99\x03\x76\x00\xd0\x9c\xaf\x5f\x51\x1d\xc0\x01\x74\xc0\xc7\
+\x1f\xa8\x1e\x01\x08\x20\x94\x10\xf8\x08\x74\xc0\x0b\xa0\xa6\x1f\
+\x68\x0e\x00\x69\xfc\xf2\x8b\xc8\x10\x00\xaa\xf9\x0e\x54\xff\x02\
+\x14\x92\x68\x21\xc0\xfe\x07\x1a\x02\x48\x11\x09\x10\x40\xa8\x21\
+\xf0\x03\x12\x05\xbf\x7e\xa2\x9a\xc9\xfe\x0f\xc9\x01\x8c\xc4\x85\
+\xc0\x4b\xa0\xe5\x3f\xbf\xa1\xaa\x67\x05\x3a\xec\x03\x5a\x14\x00\
+\x04\x10\x8a\x03\x40\x21\xf0\xf2\x2b\xa6\x03\xd8\xfe\x40\x1d\x40\
+\x24\xf8\xfe\x07\x12\x02\xbf\xbe\x81\x13\x25\xc2\x01\xbf\xa0\x21\
+\x80\xe4\x28\x80\x00\xc2\x70\x00\x48\xe3\x5f\x34\xcb\x58\xfe\x90\
+\x18\x05\x7f\x20\x21\xf9\x07\xcd\x23\xcc\xac\x90\x10\x40\xce\x4a\
+\x00\x01\x84\x92\x06\xbe\x02\x35\xbc\xfd\x86\xe9\x00\x66\xa0\x81\
+\xdf\x48\xc8\x05\x3f\xff\x40\xcc\xc1\xe6\x00\x50\x34\x23\x1b\x03\
+\x10\x40\x28\x0e\xf8\xf7\x1f\x81\x51\x3c\xf5\x1f\x4b\xe1\x8c\x27\
+\x04\x40\x6a\xff\xfe\xc3\x6e\x0e\x48\x0c\x59\x18\x20\x80\x58\x08\
+\x95\x2b\x30\xfa\x3f\x03\xf9\xe0\x3f\x1a\x8d\x1c\x02\x00\x01\xc4\
+\x82\xae\x90\x52\xcb\x48\x35\x07\x20\x80\x98\x18\x06\x18\x00\x04\
+\xd0\x80\x3b\x00\x20\x80\x06\xdc\x01\x00\x01\x34\xe0\x0e\x00\x08\
+\xa0\x01\x77\x00\x40\x00\x0d\xb8\x03\x00\x02\x68\xc0\x1d\x00\x10\
+\x40\x28\xe5\x00\x0b\x33\xb0\xe6\x63\x81\x94\x62\x28\x45\x28\x50\
+\x8c\x99\x99\xc8\x8c\x0d\x54\xc3\x04\x2c\x69\xd8\x59\xb1\x9b\x03\
+\xb2\x03\xd9\x18\x80\x00\x62\x41\xd6\xc8\x05\x6c\xc7\xf2\x71\x01\
+\xcb\x70\xb4\xf2\x91\x95\x1d\xd8\x26\x60\x21\xde\x57\x6c\x40\xb5\
+\xfc\x40\x73\x7e\x33\xa1\xd5\x7c\x40\x47\xfd\x64\x47\x55\x0b\x10\
+\x40\x28\xc6\x72\x80\x1c\xc0\x09\xd5\x88\xe6\x00\x90\x8f\x88\x0d\
+\x01\x56\xa0\xa9\xbc\x20\x73\x18\x30\x1d\xf0\x95\x1d\xb5\x28\x06\
+\x08\x20\x14\x07\x70\x82\x1c\x00\x6c\x38\xfe\x42\x73\x00\x1b\x07\
+\xd4\x01\x44\x02\x56\x66\x88\x47\x7e\xa1\x3b\x00\x68\xf9\x47\x36\
+\x54\xb5\x00\x01\x84\x70\xc0\x3f\x88\x03\x78\xb9\x30\x1d\xc0\xce\
+\x81\x14\x02\xff\x19\x70\x37\xcb\x61\x21\x00\x75\xc0\xcf\xff\x68\
+\x2d\x22\xa0\x03\xb8\x38\x50\x95\x03\x04\x10\x66\x08\x80\x1c\x80\
+\x66\x28\x07\x27\x24\x71\x12\x9d\x06\x98\x21\xe6\xfc\xf8\x8f\xda\
+\x26\x64\x63\x87\xa4\x33\x64\x00\x10\x40\x58\xd3\x00\x5a\xb3\x8d\
+\x81\x83\x8b\xc4\x34\x00\x0d\x01\xd6\x7f\xa8\x21\xc0\xc1\x01\x75\
+\x00\x92\x39\x00\x01\x84\x92\x0b\x38\x81\x96\xf0\x03\x35\xb2\xa1\
+\x59\xc4\x41\x4a\x1a\x00\xea\x65\x61\x81\x38\x80\xe5\x2f\x5a\xab\
+\x98\x03\x33\x04\x00\x02\x08\x39\x04\x18\xf9\x79\x99\x19\x24\x44\
+\x80\xcd\xaf\xaf\xa8\x8a\xb8\x78\x40\x69\x83\x09\x5b\x57\x13\x6b\
+\x6b\x88\x8b\x9d\x89\x41\x42\x14\x9a\xe2\x19\x51\x43\xf2\x29\x3f\
+\x33\x4a\xca\x01\x08\x20\x16\xa4\x5e\x2b\xf3\x83\xdb\xaf\x18\xce\
+\xf0\xb1\x32\xfc\x44\xeb\x9c\x72\x70\x30\x33\x3c\x7b\xfc\x0e\xe8\
+\x25\x26\x56\x82\xed\x42\x16\x26\x96\xb7\xaf\x3f\x33\x9c\x3d\xfa\
+\x0c\xd8\xc1\xf9\x8b\x9a\x06\x80\x89\xe3\xce\xad\xd7\x20\x57\x31\
+\xc3\xc4\x00\x02\x88\x11\xa9\x7b\x3e\x89\xe1\xcf\xdf\x30\x86\xbf\
+\xff\xff\x60\x4d\xeb\xcc\x4c\x4c\x40\xc3\xfb\x81\xec\x6e\x02\x4e\
+\x48\x01\x36\xfc\xea\x19\x7e\xff\x65\xc4\x9a\x6a\x98\x18\xd9\x81\
+\x89\x64\x3b\xb0\x7b\x1e\x0f\xe2\x02\x04\x18\x00\x0c\x5e\x57\xaa\
+\x57\xdc\x85\x99\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x09\x8f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x09\x21\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\xd0\x80\x3b\x00\x20\x80\
+\x58\x40\x84\xb1\x71\x2a\xc3\x8f\x1f\x3f\x99\x7e\xfe\xfc\xce\xfd\
+\xff\xff\xbf\xbf\x4a\x4a\xaa\x46\x52\x52\x02\x99\x3c\x3c\x0c\xa6\
+\xff\xfe\xfd\x63\x7d\xfc\xf8\xcd\x8d\x73\xe7\x8e\xac\xfc\xf4\xe9\
+\xe5\x66\x25\x25\xfb\x9f\x0c\x0c\xb0\x84\xcb\x08\xc6\x8c\x40\x8a\
+\x89\x09\xe1\x17\x18\x9b\x99\x19\x42\x83\xd2\x39\x23\x50\x11\x13\
+\x13\x48\x2d\x33\xe3\xbf\x7f\xdf\xbf\x9f\x3a\xb5\xe0\x0f\x48\x0e\
+\x20\x80\xc0\x0e\xf8\xf7\xef\xbf\x9d\x8a\x8a\x4c\x83\xa0\x20\x2f\
+\x0f\x30\x57\xfc\xe5\xe0\xe0\xd4\xe0\xe2\x62\x14\x60\x63\x63\x02\
+\x6b\xe4\xe2\xe2\x51\x90\x94\x94\x76\xff\xfb\xf7\xcf\x65\x20\xf7\
+\x07\x23\x13\x33\x23\x07\x3b\x3b\xc8\x6a\xa0\xc9\x4c\x0c\xbf\x7f\
+\xff\x02\x1a\xce\x0c\xb6\x00\xe8\x60\x38\x1b\x64\x31\xd0\x43\x40\
+\x33\x98\xc0\x8e\x84\x38\x8a\x85\xf1\xdd\xbb\x0f\x5f\x1e\x3f\xd6\
+\xe9\x78\xfe\xfc\xca\x4e\x80\x00\x1c\x8e\xb1\x0d\xc2\x30\x10\x00\
+\xcf\xf8\x6d\x22\xb1\x00\xa2\x70\x83\x44\x2a\xb2\x0e\x1b\x30\x4e\
+\x1a\x06\xc9\x18\xf4\x48\x54\x88\x02\x31\x41\xb0\x62\x23\x70\x24\
+\xde\xf4\xa7\xbb\xfb\x0f\xb4\x6d\x38\xf5\xfd\xb1\xd3\x01\x15\x18\
+\x62\xcc\x8c\xe3\x44\x4a\xdf\x3a\x87\x88\xc5\x39\x31\x2a\xee\xaa\
+\xcc\x7b\xcf\xf5\x72\xe6\xf9\xb8\xb1\xdd\xed\x59\x6f\x82\x86\x2a\
+\x3b\x2b\x2b\x94\x62\x94\x59\xb1\xf4\x96\xa6\x11\x6c\xfd\x64\x41\
+\x7a\x7f\x78\x4d\x30\x17\x47\xce\x31\x0c\xc3\xfd\xf0\x13\x40\x60\
+\x07\x88\x88\x70\x49\x33\x31\xfd\x65\xf8\xf4\xe9\x33\xd8\xf5\x20\
+\xcb\x5f\xbc\x78\x0f\xa4\xbf\x01\x0d\x66\x04\xb9\x1a\x88\x99\xc1\
+\x34\x3b\x3b\x27\xc3\xcb\x67\xf7\x19\xaa\x16\x1c\x66\x50\xb1\x0f\
+\x60\x78\xd4\x31\x8b\x61\x79\x5f\x06\xc3\x86\xcd\xdb\x18\xee\xdf\
+\xbf\xcf\x50\x59\x59\xc9\xc0\xcb\xcb\xc9\x70\xee\xfc\x45\x06\x2e\
+\x21\x31\x06\x05\x15\x0d\x86\x97\xdf\x18\x18\x9e\x7d\xfd\xcf\xf0\
+\xee\x3b\x23\x03\xcb\xed\xeb\x0c\xe2\xdc\x52\x40\x73\x38\x44\x80\
+\x9e\x31\x00\x08\x20\x70\x24\xfd\xfa\xf5\xeb\xef\xef\xdf\x7f\xc1\
+\xc1\x0d\x03\x90\x38\x63\x02\x07\x25\x24\xee\x60\x7c\x06\x86\x57\
+\xcf\xef\x30\x3c\xfe\xc6\xc7\xb0\xf3\x81\x24\xc3\x6f\x36\x31\x06\
+\x61\x60\xc8\xad\x59\xb3\x96\x61\xe1\xc2\x45\xc0\x50\xfb\xce\xa0\
+\xa0\x20\xcf\x60\x6d\x65\xc6\xf0\xf1\x37\x1b\xc3\x99\x07\x9f\x19\
+\x2e\xdc\x7e\xcd\xf0\xf5\xd3\x2f\x06\xc6\x6f\xdf\x18\x38\xd8\x58\
+\x19\xfe\x02\xa3\xe9\xc7\x8f\xdf\xa0\xd4\xc1\x0e\x10\x40\x2c\xb0\
+\xc4\x84\x64\x37\x56\x00\x72\x00\x28\xf8\x1f\x3f\xbe\xc5\x60\x65\
+\x6f\xcd\x30\x89\xe7\x3c\xc3\x9e\x43\x9d\x0c\xc9\x45\x7e\x0c\x32\
+\x8a\x9a\x0c\xf3\xe7\xcf\x67\x78\xfd\xfa\x35\x83\xb6\xb6\x0e\xc3\
+\xcf\x9f\xbf\x19\x38\x39\x79\x18\x6c\x34\x24\x19\x7e\x01\xd3\xc7\
+\xad\x4f\x77\x18\x58\x7f\x8a\x33\xf0\xf3\xcb\x30\xbc\xf9\x2d\xce\
+\xf0\xf9\xcb\x5f\x98\x7d\xff\x01\x02\x88\x85\xd8\xec\x02\x0a\xfe\
+\x37\x6f\x9e\x02\xa3\x8b\x9b\x41\x4a\x5a\x91\x21\x5a\x4d\x83\x21\
+\x39\x2e\x8c\x81\x85\x83\x1b\x9c\xd8\x4c\x4c\x4c\xe0\x6a\x41\x0e\
+\x00\x15\xf1\x5c\xdc\xdc\x0c\xac\xbf\xd8\x19\x74\xf4\x8c\x18\xce\
+\x03\xa3\x84\xe3\x8f\x04\x30\x6d\x70\x02\xe5\x3e\x43\x73\x10\x03\
+\x03\x40\x00\xb1\xc0\x7c\x87\xc8\x5a\xd8\x7c\xcf\x04\x0c\xb2\xef\
+\xc0\x44\xf6\x85\x41\x5e\xde\x14\x94\x65\x81\x62\xff\x18\xfe\x71\
+\xb2\x33\xb0\x33\xfe\x06\x06\xfb\x17\x86\x97\x2f\x5f\x00\xe9\xaf\
+\x0c\x3c\x3c\x7c\x0c\xe2\xe2\x12\x40\x07\xb3\x03\x73\xc7\x0f\x86\
+\x3f\x7f\xff\x82\x13\xb6\xbc\xbc\x0c\xc3\xad\x5b\xd7\x19\x84\x84\
+\xb4\x18\x10\x76\x32\x30\x00\x04\x10\x51\x21\x00\x49\x98\xaf\x19\
+\xa4\xa5\x65\xc0\x86\x81\x7c\x07\xd2\x0f\xc2\x8f\x1e\xde\x67\x78\
+\xfe\xe2\x25\xc3\xdf\xbf\x6c\xc0\x9c\xc2\x09\x0c\xa5\x17\x0c\x4f\
+\x9f\x3e\x65\xd0\xd1\xd4\x62\xe0\xe5\x13\x66\x78\xfb\xeb\x03\x30\
+\x57\xfc\x61\xe0\xe3\x13\x02\x3a\xee\x05\xc3\xd7\xaf\x9f\x40\x65\
+\x01\xdc\x6c\x80\x00\x62\x82\xf9\x10\x1f\x00\xe6\x7f\x06\x50\x2e\
+\x01\xc5\xeb\x5f\xa0\x8f\x20\x8e\x62\x65\x78\xff\xfe\x2d\xc3\x8b\
+\x97\xaf\x19\x38\xb9\xc4\x19\xde\xbd\xfb\xcc\x70\xe2\xe4\x71\x06\
+\x16\x56\x5e\x60\x42\x13\x66\x98\xb7\x62\x2d\xc3\xa5\x1b\x37\x19\
+\xf8\xb8\x79\xc1\xa1\x0d\x4a\xe4\xdc\xdc\x5c\x0c\x1f\x3e\xbc\x00\
+\x66\x55\x56\x78\x08\x00\x04\x10\xc1\x10\x00\x29\xfc\xfb\x17\x92\
+\xc7\x81\x29\x01\x1c\x55\x20\xb1\x7f\xff\x7e\x03\xb3\xea\x33\x06\
+\x71\x09\x79\x86\xe3\x27\x4e\x30\x14\xe4\xa5\x02\x0d\xff\xc0\xa0\
+\xa7\x6d\xc8\x20\x6d\x67\xc9\xf0\x52\xf2\x1c\xc3\xb2\xa5\x2b\x19\
+\x4a\x6c\x2b\x18\xfc\x6c\x1d\x19\x5e\xbc\x79\x0d\xcc\x9e\x7c\x40\
+\x7d\x8f\xa0\x66\x41\x00\x40\x00\x41\xd3\x00\x03\x81\x10\xf8\x0b\
+\x2e\xd1\x20\x4d\x07\x48\x96\x04\x95\x7e\xac\xac\xec\x40\x07\x88\
+\x33\x6c\xdc\xb0\x0a\x6c\x39\x08\x5c\x7a\xfd\x84\x41\xc0\xe4\x32\
+\x83\xb2\xcd\x4f\x86\xff\xdf\xfe\x32\x34\xcf\x6b\x62\xf8\x03\x4c\
+\x94\xde\x36\x0e\x0c\xaf\xff\xfe\x04\xea\x61\x06\x9a\xf7\x8f\x81\
+\x19\x18\xad\xa0\x92\x14\x20\x80\x98\x10\x65\x3a\xa1\x2c\x08\x73\
+\xe8\x7f\xb8\x18\xc8\x11\xa0\xe8\x91\x92\x90\x84\x44\x8b\x8c\x0c\
+\x83\x6d\x97\x3e\x83\xa4\xe5\x57\x86\xa7\xb7\x5f\x30\x7c\xff\xf2\
+\x9e\xc1\x24\x99\x89\xa1\xe9\x58\x03\xc3\xf6\x63\x87\x19\xf8\xb9\
+\xf8\xc0\xbe\x67\x67\xe1\x80\x14\xd3\x0c\xff\xff\x01\x04\x10\x13\
+\x72\x8a\xc4\x97\x05\x21\x09\x07\x62\x39\xa8\xbc\x67\x63\xe3\x00\
+\x8b\xbf\x7c\xfe\x98\x21\x26\x26\x81\x81\x5b\x55\x83\xc1\xb8\x4e\
+\x9e\x41\xc9\xf2\x13\xc3\xaf\x57\x5f\x18\x14\x84\x44\x18\x84\x99\
+\xb9\x18\x78\xfe\x7f\x67\xb0\x4a\x61\x67\xa8\x3e\x58\xc1\xb0\x66\
+\xef\x26\x06\x61\x6e\x49\x86\x4b\x4f\x4e\x31\xec\xfe\xb8\x80\xf3\
+\x0f\xe7\x4f\x01\x80\x00\x22\x18\x05\xa0\x14\xcf\xc2\xc2\x06\xa4\
+\x41\x6e\xfd\x0b\x2f\xb4\x40\x3e\x90\x97\x57\x60\x78\x72\xff\x21\
+\x43\xef\xaa\xe5\x0c\xb2\x59\xfc\x0c\x06\x4e\xc0\x68\x7a\xf7\x8b\
+\x41\x0c\x18\xd7\xb0\x1a\x91\x9f\x87\x9f\x41\x86\x87\x8d\xe1\x7b\
+\xf2\x3f\x86\xae\xd9\x3d\x0c\x9e\x9c\x51\x0c\x87\x18\x37\x31\xb0\
+\x99\x7f\x66\xfd\x7f\xec\xbf\x0c\x40\x00\x31\x11\x97\x0d\x41\xc5\
+\x30\x1b\x30\xa5\xbf\x02\xc6\x21\x2b\x34\x1b\xfe\x67\xe0\x06\xe6\
+\x8a\xde\x35\xab\x19\x0e\x72\x6f\x64\xb0\xf1\x67\x66\xe0\xfc\x06\
+\x2c\x7c\x38\xb9\x18\x38\x39\x38\x80\x65\x3d\x3b\x03\x1b\x3b\x1b\
+\x83\x0c\x30\x91\xaa\x8a\xeb\x30\x98\xc8\x4a\x33\x98\x26\x0a\x30\
+\xac\xfa\x3d\x99\x41\x25\x92\x15\x98\x25\x81\xb9\xe3\xe7\x3f\x16\
+\x80\x00\x62\x21\x26\x0a\x40\xf1\xcc\xc7\x27\xc2\xf0\xea\xd5\x5d\
+\x06\x29\xa9\xaf\xc0\xec\x28\xc8\xc0\x05\x2c\xd1\x1a\x66\x4f\x67\
+\xd8\xc6\xb6\x9a\x21\x20\x49\x9c\x41\xe0\x17\x33\xc3\x7f\x50\xf5\
+\xcd\xc4\x08\xae\xb8\xc0\x29\x1c\x58\x33\xf2\x72\x0a\x30\xb0\x32\
+\x72\x32\xa8\x08\xe9\x30\xb0\x32\x73\x32\x88\x95\xf1\x30\xf0\x70\
+\x73\x32\x9c\x59\xfe\xe0\x1f\x50\xc9\x77\x80\x00\x22\x2a\x11\xc2\
+\x1a\x17\xbc\xbc\x92\xc0\xd2\xec\x06\x03\x0b\xb0\x7e\xfd\xfb\xe7\
+\x3f\xc3\xb6\xeb\x07\x18\xd4\x3d\x38\x18\xe4\x38\xb9\xc1\x69\x82\
+\x9d\x83\x1d\xe2\x73\x60\x75\xcd\x0e\xf4\x3d\x2f\x30\xd1\x71\x32\
+\xf3\x00\x2b\x62\x16\x06\x4e\x26\x5e\x06\x75\x01\x7d\x06\x1b\x51\
+\x0d\x86\xff\xc0\xea\xfa\xcb\xd7\x9f\xc0\xf8\x62\xf8\x01\x10\x40\
+\x4c\xc4\x64\x43\x58\x56\xe4\xe7\x17\x04\xaa\xe5\x63\x38\x79\xea\
+\x38\x30\x5e\xfe\x30\x94\xf8\x24\x32\x9c\x5b\xf2\x95\xe1\xc2\xeb\
+\xaf\x40\x39\x2e\x60\xdd\x0f\x09\x7a\x48\xf0\xb3\x02\xa3\x88\x97\
+\x81\x9d\x81\x93\x81\x0d\x88\x59\x81\x98\x9b\x51\x88\x41\x96\x5d\
+\x93\xe1\xc7\x6f\x26\x86\x5f\x5f\x7f\xfd\x01\xfa\xfb\x07\x40\x00\
+\x31\x41\x7c\xc7\x0c\x0c\x2d\x26\x70\xc2\x01\xf9\x14\xb9\x1a\x86\
+\x61\x66\x66\x50\x11\xfc\x17\x58\x19\x49\x01\x83\x56\x84\x61\xd7\
+\xde\xfd\x0c\x2e\xfa\x86\x0c\x2d\x66\xd5\x0c\xdb\xe7\xbe\x61\x38\
+\xfb\xfa\x0b\x03\x1f\x0f\x27\x38\xfe\x39\x60\x18\x98\xdd\x40\x16\
+\xb3\x33\x00\x1d\xc7\xc0\x0d\x64\xf1\x02\x1d\xc3\x0e\x6c\x98\x00\
+\xeb\x91\xef\x7f\x80\x85\x0b\xc3\x77\x80\x00\x02\x3b\xe0\xd1\xa3\
+\x57\xd7\x6e\x03\xeb\xec\x1f\x3f\xfe\x02\xcb\xea\x3f\xc0\xd6\xca\
+\x1f\x60\x8d\xf6\x1f\xd8\x4e\x60\x40\xc3\x40\x1d\xdf\x7f\x01\xa3\
+\x42\x04\x88\x95\x18\x8e\x1c\xbf\xcd\x60\x28\xa5\xc5\xe0\xf3\xcb\
+\x91\x61\xc3\x94\x7b\x0c\x67\x5e\x7d\x65\x10\xe2\xe7\x86\x24\x42\
+\x0e\x4e\x06\x66\x60\xa1\xc3\x0a\xb4\x92\x15\xec\x00\x3e\xa0\x13\
+\x04\x80\x91\xc1\xce\xf0\xf9\x1b\xd0\xb0\x1f\xa0\xd2\x8d\xe1\x07\
+\x40\x00\x81\x13\xe1\xd1\xa3\xeb\xcb\x6e\xdf\x3e\x5b\xc5\xc3\xc3\
+\x23\x0f\xcc\xe5\x8c\xa0\x2c\xf6\xef\x1f\x38\xc7\x83\xab\x0b\x48\
+\x14\x31\x22\x15\x48\x8c\xd0\x76\x1e\x33\xc3\x3f\x60\x02\xfd\xff\
+\xfb\xf7\x3f\xce\x6f\xac\xdc\x4b\xff\x5d\x56\xfe\x5f\x60\xc8\xe0\
+\xae\x2a\xc9\xf0\x9d\x01\x58\x7c\x33\x00\xeb\x10\x60\xf1\xcd\x01\
+\x74\x00\x27\x03\x30\xf1\x31\x08\x01\xc5\xbe\x32\x7c\xfa\x0c\x34\
+\xf7\x3b\xb0\x86\xfa\xc7\xf0\x0d\x20\x80\xc0\x0e\x78\xf5\xea\xfa\
+\x71\x20\x4e\x06\x32\xe5\x89\xad\x21\xd1\xc0\x3f\x70\x45\xf1\x95\
+\x33\x65\xd9\xbf\xf3\x71\x4c\x79\x0c\xcc\x2e\x9a\xd2\x40\xeb\xff\
+\x03\x4b\x8e\xbf\xd0\x28\xe0\x05\x3a\x40\x18\xc8\xfb\xc2\xf0\xfb\
+\x1b\x30\xe0\x7f\x82\x5d\xf8\x1d\x20\x80\x90\x2d\x7b\x05\xc5\xe4\
+\x01\x29\x36\x90\xaf\xfe\xff\xbf\xff\x3e\xf8\xde\xbd\x0f\x7c\x9c\
+\x9a\xfa\x40\x4b\x41\xc1\xcf\x02\xc6\x2c\xe0\x92\xff\x37\x30\x22\
+\x84\x80\x90\x1d\xe4\x80\x9f\xa0\x10\x00\x08\x20\x16\xaa\xf4\x2e\
+\xf4\x79\x18\x18\xa4\x39\xd4\x81\x89\x7e\x96\x63\x9c\x3a\x5f\x94\
+\x9b\x2d\x03\xe3\x2f\x60\x75\x0d\x4c\x38\xcf\x7f\xde\x63\xb8\xf2\
+\xfb\x16\xc3\xf7\x9f\x7f\x18\x7e\xfc\xfa\xc9\x00\xaa\xcd\xdf\xbd\
+\x7d\x0a\x2a\x54\x41\xfd\x82\x6f\x00\x01\xc4\x08\x29\xd5\x18\xc9\
+\xb3\x98\x15\xa8\x4f\x97\x9b\x81\x41\x92\x1d\x94\x68\x56\x6a\xda\
+\xf1\x87\x89\x48\x70\x32\x7c\x79\xfd\x8b\xe1\xe3\x87\x6f\x0c\xdf\
+\xbe\x7c\xff\xf7\xe3\xdb\xcf\xbf\xbf\x7f\xfd\xf9\xf7\xfb\x07\xb0\
+\x59\xf2\xe3\xff\xdf\x7f\xa0\xc4\xf1\x1b\x68\xfd\x0d\x86\x13\x0c\
+\x2f\x18\x5a\x01\x02\x88\x32\x07\xb0\x00\xf5\x89\xb0\x02\x5b\x1b\
+\xc0\x24\xc0\xcc\x68\x0f\xcc\xa7\xe1\xc0\xd4\x2d\x08\xa4\xbf\x83\
+\xb2\x18\x10\xff\x04\xa5\x74\x28\xfe\x0e\x8a\x73\x30\xfe\x0b\xc4\
+\x0c\x0c\xc0\x60\x60\xb8\x02\x10\x60\x00\x48\xb0\x3b\x49\xa1\xf4\
+\xe9\xc0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xe5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x05\x77\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xcc\x62\x20\x09\x30\x32\x48\x31\
+\xfc\xfe\x37\x93\xe1\xff\x7f\x61\x06\x36\xe6\x44\x86\xff\x0c\x37\
+\x49\xd1\xfe\xff\x4c\x1a\x98\x06\x08\x20\x26\x06\x72\x00\x23\x10\
+\xff\xf8\x93\xab\x22\x27\xe0\xa3\xa3\x2a\x62\xc9\xf0\xfd\x4f\x35\
+\x50\x8c\x91\x1c\xa3\x00\x02\x88\x3c\x07\xfc\xfd\x6f\xc1\xf0\xf7\
+\x5f\x7e\x5e\x82\x09\x43\x7d\xa1\x2d\x03\x13\x0b\x53\x2c\x30\x34\
+\x02\xc9\x31\x0a\x20\x80\xc8\x71\x00\x2b\xc3\xb7\x5f\x1d\xa6\x66\
+\x0a\x9c\xb6\xd6\x4a\x0c\x5a\xda\x12\x0c\xee\xce\x6a\x0c\x0c\xdf\
+\x7f\x55\x01\xe5\xf8\x48\x35\x0c\x20\x80\x48\x77\xc0\xbf\x7f\x71\
+\x2c\xdc\xec\xf6\x51\x61\x86\x0c\x9f\xff\x30\x31\x3c\xfe\xc0\xc0\
+\x10\x18\x60\xc8\x20\x20\xce\x6f\xcc\xf0\xfb\x6f\x3e\xa9\xc6\x01\
+\x04\x10\x13\x89\x71\x2f\xc1\xf0\xed\x77\x85\xa7\xbb\x0e\x83\x96\
+\x8e\x34\xc3\xed\x57\x0c\x0c\x4f\xdf\x33\x30\x08\x4a\x08\x32\xb8\
+\x79\xea\x31\x30\xfc\xfc\x5d\x0c\x54\xa5\x49\x8a\x91\x00\x01\x44\
+\x9a\x03\x7e\xfc\x2e\x14\x95\x11\x56\xf1\x0d\x30\x62\xb8\xf3\x86\
+\x81\xe1\xf5\x57\x06\x86\xb7\xdf\x18\x18\x1e\xbf\x63\x60\x30\xb4\
+\xd1\x61\x90\x55\x97\xe1\x07\xaa\xa9\x23\xc5\x48\x80\x00\x22\xde\
+\x01\xff\xff\x5b\x33\xfc\xfb\x9f\xe3\xe8\x69\xc8\xf0\x8b\x95\x83\
+\xe1\xfe\x5b\x06\x86\xf7\x3f\x18\x18\xde\x7c\x67\x60\x78\xf1\x09\
+\x98\x04\x98\x58\x19\x2c\x3d\x4c\x19\x98\x58\x99\x43\x80\xd1\x14\
+\x40\xac\xb1\x00\x01\x44\xac\x03\xb8\x18\x7e\xfe\x6a\x95\xd1\x90\
+\xe3\x32\xb2\xd2\x64\xb8\xf4\x0c\x68\xf1\x57\x48\x08\x80\xe8\x37\
+\xc0\x50\x78\x02\x0c\x11\x21\x25\x59\x06\x45\x3d\x35\x16\x60\x54\
+\xd4\x01\xa3\x4b\x94\x18\x83\x01\x02\x88\x89\xc8\x84\x17\xc1\xc0\
+\xca\x66\x6f\xed\x6e\xc2\xf0\x08\xe8\xdb\xc7\xc0\x78\x7f\xf7\x1d\
+\x62\x31\x32\x7e\xf1\x99\x81\x41\xc1\xca\x98\x81\x4d\x80\xd7\x90\
+\xe1\xcf\xdf\x2c\x62\x8c\x06\x08\x20\x62\x1c\x20\xcc\xf0\xeb\x4f\
+\xbd\x86\xa5\x3e\x83\x94\x8a\x14\xc3\xd9\xc7\x90\xa0\x7f\xfd\x0d\
+\x13\xbf\xfc\xc8\xc0\xf0\x9b\x97\x9f\x41\xd2\x50\x9f\x01\xe8\x80\
+\x12\x60\xb4\xa9\x13\x32\x1c\x20\x80\x08\x3b\xe0\xcf\xef\x0a\x76\
+\x41\x41\x39\x1b\x67\x5d\x86\x5b\xaf\x81\x09\xfd\x0f\xd0\x92\x7f\
+\x0c\x0c\xbf\xfe\x62\xc7\xdf\x80\x21\x23\xac\xab\xc3\xc0\x2d\x2d\
+\xc5\xc3\xf0\xe7\x4f\x23\x21\xe3\x01\x02\x88\x90\x03\xec\x19\xfe\
+\x32\xa4\x19\xb9\x98\x30\x30\xf1\x70\x33\x3c\x01\x06\x3d\x33\x13\
+\xa4\x24\xc6\x85\xff\x03\x1d\xc1\xc2\xce\xca\x20\x63\x69\x0e\x54\
+\xcc\x1c\x04\x0c\x05\x5f\x7c\x16\x00\x04\x10\x13\x9e\x3c\xcf\x0e\
+\x4c\x78\x15\x7c\x72\x32\x7c\x56\xd6\x6a\x0c\xb7\x5e\x00\x0d\x87\
+\x65\x08\x3c\x18\x5c\x52\xff\x02\x16\x89\x72\xd2\x0c\xc2\xaa\xaa\
+\xac\x0c\xbf\x7e\xd5\x03\x85\x78\x71\x59\x03\x10\x40\xb8\x1d\xf0\
+\xe7\x6f\x1c\xd0\x2b\x1e\x0e\x3e\x16\x0c\x5f\xfe\x30\x82\x53\x3b\
+\x2b\x13\x29\x65\x16\x03\x83\x94\xb9\x09\x03\x2b\x2f\xaf\x31\x30\
+\x2a\xca\x71\xa9\x03\x08\x20\x5c\x46\x4a\x02\x23\xbb\x52\xc9\x5c\
+\x97\xc1\x54\x5f\x9c\xe1\xca\x53\xa0\xe5\xcc\xa8\x86\xe3\xc2\xf0\
+\xfa\xea\x37\x03\x03\xa7\x30\x3f\x83\x98\x81\x01\x90\xf3\x2f\x03\
+\x28\xa4\x8f\xcd\x22\x80\x00\xc2\xee\x80\x3f\x7f\x2a\x99\x85\x85\
+\x15\xfd\x7c\xf5\x19\x9e\x00\xcb\xfa\xcf\xbf\x20\xbe\x67\x62\x84\
+\x60\x46\x3c\x98\x09\x09\x33\x00\x13\xac\xb4\x91\x1e\x03\x8f\xac\
+\x8c\x30\xc3\xef\xdf\xf5\xd8\xec\x03\x08\x20\x16\x2c\x25\x9e\x23\
+\xc3\xaf\x7f\xe9\x4e\x3e\xa6\x0c\x2a\x72\x9c\x0c\xdb\xae\x31\x30\
+\x88\x02\xeb\x38\x66\xb2\x6a\x7b\x60\x82\xe4\x60\x62\xd0\x74\x32\
+\x63\x38\xbd\x64\x63\x20\xb0\x3c\xf1\x63\x60\x62\xda\x80\x2c\x0f\
+\x10\x40\x2c\x18\x0e\xfa\xf1\xbb\x4a\x42\x53\x81\x2d\xc2\x47\x89\
+\xe1\x39\x30\xde\x79\xb8\x80\xd9\x8a\x99\x81\x6c\x00\x0a\x15\x31\
+\x7d\x29\x86\x0f\x37\x35\x19\x6e\x1f\xbb\xdc\xcc\xc0\xc9\x7e\x10\
+\x28\xfc\x1e\x26\x0f\x10\x40\xa8\x0e\xf8\xf3\x2f\x95\x89\x83\xc3\
+\x25\x36\xd1\x8c\x41\x1e\x68\xeb\x4d\x60\xf0\x8b\xf1\x63\xfa\x9e\
+\x11\x47\xa2\xc3\xd9\x80\x60\x67\x60\xb0\xf3\x33\x60\x78\x72\xf5\
+\xbe\xce\xf7\xaf\x3f\x4a\x81\x09\xaa\x0a\x26\x07\x10\x40\x2c\x48\
+\x4e\x95\x67\xf8\xfe\xbb\xc0\x35\xd2\x90\x21\xcc\x51\x8c\xe1\xd7\
+\x17\x06\x06\x2d\x71\x48\xc1\xf3\x17\x94\xa8\x80\x85\xcf\x3f\x50\
+\xa9\xfc\x1f\x92\xdd\xfe\x81\x63\x0b\x29\x5b\xfe\x47\x64\x43\x6c\
+\x40\x4a\x5b\x80\xc1\x39\xc8\x98\x61\xcb\xbc\x43\x29\x40\x07\xac\
+\x03\x0a\x9d\x01\x89\x03\x04\x10\xc2\x01\xbf\x7e\x17\x88\xab\x8a\
+\xaa\x45\x46\xea\x01\x4b\x5e\xa0\xc5\x4c\xff\x19\x94\x04\x21\x16\
+\x22\x5b\xfc\x1f\xea\x90\xbf\xe0\x2a\x02\x2a\x07\x73\x00\x92\x5a\
+\x10\xfe\x0d\xc4\xbf\xfe\x41\x8c\x67\x06\x06\xa3\x7f\x88\x16\xc3\
+\x9d\x4b\x0f\x44\x6f\x9c\x7b\x52\x02\x14\x8a\x00\x89\x03\x04\x10\
+\xc2\x01\xcc\x4c\xdc\x3f\xbe\xff\x66\x68\xaa\xdb\x06\x2c\x7f\xfe\
+\xc1\x83\x94\x91\x91\x70\x10\x63\x95\x67\x44\x2a\xb5\x60\xc1\x0d\
+\xcc\x4a\xef\x3f\xfc\x00\xe5\x69\x2e\x98\x18\x40\x00\x21\x1c\xc0\
+\xc4\x54\xf2\xf1\xfd\xb7\xcd\x1f\x5f\x7f\xe1\x84\x7a\x8a\x16\x80\
+\x11\x98\xa0\x7e\x03\x3d\x7b\x0c\x26\x00\x10\x40\x48\x69\x80\xc1\
+\x10\x18\xd1\x21\xc0\x12\x90\x19\xc8\xa6\x8d\x03\xfe\x83\xc2\x85\
+\x89\x09\xe8\x00\x50\xb8\x6c\x04\x09\x01\x04\x10\xc2\x01\xbf\xff\
+\xb5\xab\xaa\x89\x5b\xaa\x29\x8b\x00\x2b\xc0\xff\x34\xb1\x9f\x15\
+\x18\x05\x0f\x81\x25\xdb\xe5\xab\x4f\x0d\x60\x0e\x00\x08\x20\x24\
+\x07\xfc\xe1\x11\x55\x57\x61\xd0\xf1\xd2\x63\xf8\xf9\x9d\x36\xe1\
+\xcf\x01\x8c\xf9\xdf\x47\xee\x31\x5c\xbe\xf8\x88\x0d\x26\x06\x10\
+\x40\x48\x89\x90\xe1\xef\xfd\x37\x7f\x19\x7e\xdc\x80\xd4\x66\xb4\
+\x00\xcc\xc0\xf2\xe0\xcd\x8b\x3f\xa0\x02\x19\x1e\xc5\x00\x01\xc4\
+\x82\x9e\x70\x41\x65\xf8\x7f\x46\xda\x38\x00\x56\x8f\x20\x03\x80\
+\x00\x62\x41\x4e\x20\x6c\x6c\x4c\x0c\xc0\x76\x07\xc3\x1f\x16\xda\
+\x38\x80\x85\x83\x81\xe1\x13\x1b\x6a\xb9\x0e\x10\x40\xc8\x25\x21\
+\x13\xc7\xaf\xf7\x0c\x02\x9f\x9f\x31\xfc\x01\xb5\xad\x68\x91\x08\
+\x7f\xb3\x30\x7c\xf8\xf9\x1a\x14\x16\x70\x7b\x01\x02\x08\xe1\x00\
+\x36\xd6\xa5\x37\x4f\xdd\xc8\xbb\x79\xe2\x1a\xa1\x52\x95\x82\x42\
+\x80\x81\xf1\x3f\x13\x13\x33\xb0\x20\x5a\x0f\x13\x03\x08\x30\x00\
+\x49\xfd\xb6\x3b\x2a\xaa\x2e\x21\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x06\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x05\xe0\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\x03\x08\x30\x9a\xce\xae\x60\xf8\xf6\x3b\x8c\x81\
+\x95\x69\x3a\x10\x2f\x64\xf8\xcf\xf0\x8b\x81\x86\xe0\xff\x99\x34\
+\x30\x0d\x10\x40\x4c\x70\x91\xbf\xff\xca\x83\x7d\xd4\x0c\xa5\x44\
+\xb9\x67\x31\x7c\xfc\xb9\x07\xc8\x77\x63\x60\x64\xa0\x39\x00\x08\
+\x20\x84\x03\x7e\xfe\x61\x8a\xf5\xd7\x60\x38\xb6\x34\x84\x21\x3c\
+\x44\xc7\x96\xf5\x3f\xc3\x4e\x60\x88\x2c\x04\xca\x68\xd0\xd2\x01\
+\x00\x01\xc4\x84\xc4\xfe\xf7\xe2\xdd\x1f\x06\x59\x31\x4e\x86\xf9\
+\xad\x8e\x0c\xab\x66\x06\x30\x98\x19\xcb\xc5\x31\x7c\xfe\x79\x10\
+\xe8\xb8\x26\xa0\x3c\x1f\x2d\x1c\x00\x10\x40\xc8\x0e\x60\xf8\xfe\
+\x87\x81\xe1\xd3\x5f\x06\x86\x8f\x5f\x19\x18\x9c\x4d\x25\x18\xd6\
+\x4e\xf7\x65\x68\xa8\x71\x15\x93\x91\x11\xaa\x65\xf8\xf2\xf3\x04\
+\xc3\xbf\xff\x51\xc0\x68\x61\xa5\xa6\x03\x00\x02\x08\xd5\x01\x40\
+\xcb\x7f\xfc\x66\x60\x78\xf8\x81\x81\xe1\xf2\x53\x06\x86\x2f\xdf\
+\x19\x18\xb2\x23\x34\x18\xd6\xcc\x0a\x64\x88\x8a\xb3\xd0\x64\x61\
+\x62\x5a\x0a\x74\xc8\x36\x86\x7f\xff\xac\xa8\x95\x3e\x00\x02\x08\
+\xc5\x01\xdf\x80\x96\x7f\x01\xe2\xa7\x9f\x19\x18\x1e\x00\x1d\x71\
+\xf1\x05\x03\xc3\x89\x7b\x0c\x0c\x2c\x6c\xec\x0c\x8d\xb9\xa6\x0c\
+\x0b\xa7\x86\x30\x58\x3b\x6b\xbb\x30\xfc\xf9\x7f\x10\xe8\xd2\x19\
+\x40\x2d\x6a\x94\x3a\x00\x20\x80\x10\x0e\x60\x84\xf8\xfe\xd3\x0f\
+\x06\x86\x77\x40\x9f\x7f\xfe\x09\x8c\x0a\x20\xfb\xc9\x27\x06\x86\
+\xd3\x8f\x20\x0e\x91\x97\x15\x64\xe8\xad\x71\x62\xa8\xab\xf3\x65\
+\x91\x96\x17\x4f\x67\xf8\xfe\xeb\x00\xc3\xef\x3f\x05\x40\xdd\x9c\
+\xe4\x3a\x00\x20\x80\x50\xa3\x00\xe4\x80\x5f\x10\x07\x7c\x00\x5a\
+\xfe\xe1\x27\x84\xff\x09\x48\x3f\x01\x86\xca\xa1\xbb\x0c\x0c\xe7\
+\x9e\x30\x30\x58\x99\xc9\x30\x4c\xeb\x0f\x66\x88\xcf\x70\x91\xe4\
+\xe1\xe7\xed\x67\xf8\xf6\xf3\x22\x30\x5a\x42\xd1\xcd\x23\x06\x00\
+\x04\x10\x0b\x32\xe7\xc7\x1f\x48\x08\xbc\xff\x01\x0f\x14\x0c\xf0\
+\x11\xe8\x98\x07\xef\x19\x18\x24\x78\x19\x19\x7c\x3d\x35\x18\x0c\
+\x0d\x64\x19\xd6\x6c\xbc\xac\x7a\xe4\xc0\x95\x55\x0c\xdf\x7f\x6c\
+\x66\xe0\x60\x6d\x65\x60\x64\x3c\x49\xac\x03\x00\x02\x88\x05\x3d\
+\x0d\x80\x43\xe0\x1b\xd0\x2b\x4c\x0c\xb8\xd3\xd9\x7f\x88\x23\x6f\
+\xbe\x61\x60\x90\x15\xe4\x66\x48\x49\xb6\x60\xb0\xb4\x51\x67\x58\
+\xb3\xe6\xb4\xef\xfd\x0b\xb7\xbd\x18\x98\x19\x67\x30\xb0\xb1\x74\
+\x02\xd5\x3d\x26\xe4\x00\x80\x00\x62\x41\xcf\x86\x1f\xa1\x21\xc0\
+\x42\x64\x60\x5e\x04\xe6\x96\x6b\xc0\xc4\xaa\x20\x2c\xc8\x90\x91\
+\xe3\xc6\x70\xfa\xac\x06\xf3\xee\xad\x67\xb2\x3f\x3e\x7c\xea\x05\
+\x74\xc4\x54\x06\x66\xe6\xc9\x40\x65\x38\x8b\x75\x80\x00\x62\x41\
+\x4e\x84\xa0\x10\x00\xc5\x3f\x08\xb3\x32\x13\x1f\x8f\xff\x80\xc6\
+\xbf\x04\x26\x54\x6e\x36\x60\xb6\xd0\x92\x63\x48\x55\x97\x61\x38\
+\xb0\xf7\xaa\xe2\xf9\x83\xe7\x7b\xfe\x7e\xfa\x18\xc1\xc0\xce\x56\
+\x07\x8c\x96\xed\xd8\xf4\x02\x04\x10\x46\x08\xbc\x03\x25\x3e\x12\
+\x1d\x00\xf3\xc0\x17\xa0\x43\x9e\x02\x73\x8d\x20\x17\x13\x83\xa1\
+\xbd\x2e\x83\xa2\xae\x22\xc3\xb1\xbd\x97\x4d\x9e\x9e\xbb\xb4\x95\
+\xe1\xef\xcf\x8d\x0c\xac\x6c\xf5\x40\x87\x5c\x42\xd6\x06\x10\x40\
+\x28\x01\xfd\xef\x1f\xd0\x11\xc0\x44\xf6\x0b\x48\xff\x21\x15\xff\
+\x05\xd5\x67\x90\x74\xf3\xe6\x0b\x03\xc3\xa9\x07\xc0\xf4\xc4\xc8\
+\xc3\x60\x1f\x60\xc9\x60\x15\x1b\xc4\xc8\xaf\xa4\x1c\xc0\xf0\xf7\
+\xef\x49\x86\xdf\xbf\x5b\x80\x4a\x64\x60\x76\x02\x04\x10\x46\x4c\
+\xff\xfe\xc7\x40\x56\x21\xf7\x1f\x09\x33\x33\x41\xd2\xd0\xcb\x8f\
+\x0c\x0c\x37\x9e\x33\x30\xf0\x4a\x8a\x32\xe8\x07\x7b\x31\xa8\xfa\
+\xfb\x71\x70\x4b\x4a\x56\x03\x7d\xba\x16\xa6\x0f\x20\x80\xb0\x3a\
+\x80\x5a\x00\xe4\x10\x90\x8b\x5e\x03\x43\xe4\x07\xd0\x5c\x76\x5e\
+\x1e\x06\x66\x56\x60\x55\xf2\xff\xbf\x10\x4c\x0d\x40\x00\xb1\xa0\
+\x6b\x02\x05\x25\x39\x80\x11\x2d\x34\xc0\x62\x40\x07\x30\x03\xed\
+\xfb\xf9\xe1\x0b\xc3\xa3\x03\xe7\x18\xde\xdd\xbc\xc9\xf0\xef\xf7\
+\xaf\x05\x0c\xac\xac\x5d\x30\xb5\x00\x01\xc4\x82\x1e\x8c\x7f\xff\
+\x33\x50\x5c\xcf\x80\x3c\xce\x04\xcc\x11\xbf\x7f\xfd\x62\x78\x79\
+\xf6\x26\xc3\xf3\xd3\x67\x18\xfe\x7c\xf9\x72\x02\x68\x71\x33\x10\
+\x6f\x43\x56\x0b\x10\x40\x28\x0e\x00\xc5\x1b\x2b\x50\x84\x03\xa8\
+\x99\x95\x89\xbc\x60\x60\x86\x56\xd6\x2f\x6f\xde\x67\x78\x78\xec\
+\x0c\xc3\xf7\x57\x2f\x9f\x30\xb0\xb0\x34\x31\xb0\xb3\x2f\x05\x95\
+\x75\xe8\x5a\x00\x02\x08\xc5\x01\x20\xcb\xd9\x81\x06\x70\x71\x00\
+\xd9\x24\x06\x03\x13\x50\x2f\x33\x10\xbf\x79\xf4\x9a\xe1\xde\xb1\
+\x73\x0c\xaf\x6f\xdc\xfe\x00\x2c\x4e\x17\x32\xb0\xb1\x75\x02\xa5\
+\x9f\xe3\xd2\x07\x10\x40\x2c\xc8\xe1\x0f\xca\xfb\x20\x07\x80\x0a\
+\x14\x62\x4b\x42\x26\xa0\x1e\x56\x76\x60\xed\x09\x2c\x3e\xaf\xed\
+\x3b\xc7\xf0\xf0\xf4\x65\x60\x3c\xff\xd9\x08\xb4\xb8\x0e\x28\x7d\
+\x89\x90\x7e\x80\x00\x42\x29\x09\x41\x86\xb1\x03\x2d\xe7\x06\x86\
+\x00\x33\x11\x21\xc0\x06\x54\xf7\x03\x58\x7a\xdd\x3c\x72\x83\xe1\
+\xfa\xe1\xf3\x0c\x3f\xde\x7d\x38\xc3\xc0\x06\xac\x8c\xd8\x58\x37\
+\x10\x1b\x72\x00\x01\x84\x91\x06\xc0\x51\x00\xf4\x11\x13\x23\xf6\
+\xcc\xce\x08\x14\x67\x05\x3a\x12\x94\x5b\xef\x5f\x79\xc2\x70\x6a\
+\xeb\x49\x86\x0f\x8f\x9e\xbf\x63\x60\x61\x6e\x67\xe0\x60\x9f\x0d\
+\xaa\x30\x49\x89\x3a\x80\x00\x42\x71\x00\x28\x0e\xc1\x21\xc0\x86\
+\xe9\x80\xff\xd0\x34\xc2\x02\x94\x7b\x7c\xef\x3d\xc3\x91\x0d\xc7\
+\x19\x1e\x5f\x7b\xf0\x0d\x98\xa7\x67\x03\x53\x2d\xde\x78\xc6\x07\
+\x00\x02\x08\xc5\x01\xa0\x2a\x18\x54\x78\x70\xb3\xa3\xda\x0c\x76\
+\x18\x30\xb8\xdf\xbe\xfe\xc1\x70\x68\xe3\x45\x86\x4b\x07\xae\x30\
+\xfc\xfa\xf6\x1d\x58\xf7\xb3\x81\xf2\xf3\x11\x4a\xb2\x2c\x40\x00\
+\xa1\x38\x00\x14\xfc\xec\x40\xcb\x19\xff\x41\x7c\x0c\x0a\x04\x0e\
+\x60\x63\xeb\xe7\xaf\xff\x0c\xc7\xf6\xdc\x64\x38\xb8\xe1\x34\xc3\
+\xb7\xd7\xef\x2f\x03\x2d\x6e\x03\xe2\x15\xd4\x28\x2d\x01\x02\x08\
+\x25\x17\xb0\xb1\x40\xe2\x9f\x05\xc4\x66\x87\xb8\xe0\xdc\xc9\x27\
+\x0c\x7b\xd6\x9e\x63\x78\x72\xed\xd1\x1b\x06\x36\xe6\x2e\x06\x1e\
+\x8e\x79\x40\xb5\x6f\xa9\x55\x5c\x03\x04\x10\x4a\x08\x80\x1c\x20\
+\xc0\x05\x2c\x0d\x81\xbe\xbe\x7f\xf7\x23\xc3\xa6\xe5\x67\x19\x2e\
+\x1c\xbc\x01\xac\xa0\xff\xaf\x60\xe0\x64\x6d\x02\xa6\xc0\xfb\xf0\
+\x72\x96\x4a\x00\x20\x80\x90\x43\x80\x51\x48\x80\x85\xe1\x1f\xb0\
+\x2c\x5e\xb9\xe0\x2c\xc3\xc1\x4d\x97\x18\xbe\x7f\xfe\xb6\x1f\x68\
+\x71\x0d\xd0\xe2\x63\xb4\xea\x9a\x01\x04\x10\xc2\x01\x6c\xcc\x8c\
+\x27\x8f\x3c\x60\x58\x38\xfd\x38\xc3\xf3\x9b\x2f\xae\x33\x70\xb2\
+\xf4\x31\x70\xb1\xcd\x63\x80\xe4\x38\x9a\x01\x80\x00\x42\x38\x80\
+\x85\x79\xce\xfe\x4d\x97\x02\x80\x35\xc9\x22\x06\x3e\xf6\x69\xc0\
+\x10\x79\xcd\x40\x07\x00\x10\x60\x00\x67\x40\x00\x61\x44\x18\x7f\
+\x31\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x12\
+\x05\x0c\xb7\x27\
+\x00\x6e\
+\x00\x6f\x00\x61\x00\x74\x00\x75\x00\x6e\x00\x6c\x00\x6f\x00\x6f\x00\x70\x00\x73\x00\x6f\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
+\x00\x10\
+\x03\x05\x50\x67\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x70\x00\x61\x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x05\x42\x7f\x67\
+\x00\x63\
+\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x5f\x00\x6d\x00\x6f\x00\x75\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x04\x32\xd5\x67\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x65\x00\x6a\x00\x65\x00\x63\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x03\x75\x07\x07\
+\x00\x70\
+\x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x5f\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x02\
+\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x09\x48\
+\x00\x00\x00\xae\x00\x00\x00\x00\x00\x01\x00\x00\x1d\x79\
+\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00\x17\x90\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xfd\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/packages/spreadsheet/identifiers.py b/vistrails/packages/spreadsheet/identifiers.py
new file mode 100644
index 0000000..1823bee
--- /dev/null
+++ b/vistrails/packages/spreadsheet/identifiers.py
@@ -0,0 +1,39 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+identifier = 'org.vistrails.vistrails.spreadsheet'
+name = 'VisTrails Spreadsheet'
+version = '0.9.2'
+old_identifiers = ['edu.utah.sci.vistrails.spreadsheet']
diff --git a/vistrails/packages/spreadsheet/init.py b/vistrails/packages/spreadsheet/init.py
new file mode 100644
index 0000000..1273905
--- /dev/null
+++ b/vistrails/packages/spreadsheet/init.py
@@ -0,0 +1,153 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# Spreadsheet Package for VisTrails
+################################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core import debug
+from vistrails.core.modules import basic_modules
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.vistrails_module import Module
+from vistrails.core.system import vistrails_root_directory
+from spreadsheet_controller import spreadsheetController
+from spreadsheet_registry import spreadsheetRegistry
+from spreadsheet_window import SpreadsheetWindow
+import os
+import string
+import sys
+from spreadsheet_config import configuration
+import vistrails.core
+
+# This must be here because of VisTrails protocol
+
+################################################################################
+
+basicWidgets = None
+
+def importReturnLast(name):
+    """ importReturnLast(name: str) -> package
+    Import a package whose name is specified in name and return right-most
+    package on the package name
+    
+    """
+    mod = __import__(name)
+    components = name.split('.')
+    for comp in components[1:]:
+        mod = getattr(mod, comp)
+    return mod
+
+def addWidget(packagePath):
+    """ addWidget(packagePath: str) -> package
+    Add a new widget type to the spreadsheet registry supplying a
+    basic set of spreadsheet widgets
+    
+    """
+    try:
+        registry = get_module_registry()
+        widget = importReturnLast(packagePath)
+        if hasattr(widget, 'widgetName'):
+            widgetName = widget.widgetName()
+        else:
+            widgetName = packagePath
+        widget.registerWidget(registry, basic_modules, basicWidgets)
+        spreadsheetRegistry.registerPackage(widget, packagePath)
+        debug.log('  ==> Successfully import <%s>' % widgetName)
+    except:
+        debug.log('  ==> Ignored package <%s>' % packagePath)
+        widget = None
+    return widget
+
+def importWidgetModules(basicWidgets):
+    """ importWidgetModules(basicWidgets: widget) -> None
+    Find all widget package under ./widgets/* to add to the spreadsheet registry
+    
+    """
+    packageName = __name__.lower().endswith('.init') and \
+        __name__[:-5] or __name__
+    widgetDir = os.path.join(
+        os.path.join(os.path.dirname(vistrails_root_directory()), 
+                     *packageName.split('.')),
+        'widgets')
+    candidates = os.listdir(widgetDir)
+    for folder in candidates:
+        if os.path.isdir(os.path.join(widgetDir, folder)) and folder != '.svn':
+            addWidget('.'.join([packageName, 'widgets', folder]))
+
+def initialize(*args, **keywords):
+    """ initialize() -> None
+    Package-entry to initialize the package
+    
+    """
+    import vistrails.core.application
+    if not vistrails.core.application.is_running_gui():
+        raise RuntimeError, "GUI is not running. The Spreadsheet package requires the GUI"
+    
+    # initialize widgets
+    debug.log('Loading Spreadsheet widgets...')
+    global basicWidgets
+    if basicWidgets==None:
+        basicWidgets = addWidget('vistrails.packages.spreadsheet.basic_widgets')
+    importWidgetModules(basicWidgets)
+
+    # Create application if there is no one available
+    global app
+    app = QtCore.QCoreApplication.instance()
+    if app==None:
+        app = QtGui.QApplication(sys.argv)
+    if hasattr(app, 'builderWindow'):
+        global spreadsheetWindow        
+        spreadsheetWindow = spreadsheetController.findSpreadsheetWindow(show=False)
+
+def menu_items():
+    """menu_items() -> tuple of (str,function)
+    It returns a list of pairs containing text for the menu and a
+    callback function that will be executed when that menu item is selected.
+    
+    """
+    def show_spreadsheet():
+        spreadsheetWindow.show()
+        spreadsheetWindow.activateWindow()
+        spreadsheetWindow.raise_()
+    lst = []
+    lst.append(("Show Spreadsheet", show_spreadsheet))
+    return tuple(lst)
+
+def finalize():
+    spreadsheetWindow = spreadsheetController.findSpreadsheetWindow()
+    ### DO NOT ADD BACK spreadsheetWindow.destroy()
+    ### That will crash VisTrails on Mac. 
+    ### It is not supposed to be called directly
+    spreadsheetWindow.cleanup()
+    spreadsheetWindow.deleteLater()
diff --git a/vistrails/packages/spreadsheet/spreadsheet_base.py b/vistrails/packages/spreadsheet/spreadsheet_base.py
new file mode 100644
index 0000000..983b705
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_base.py
@@ -0,0 +1,316 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains a set of internal Spreadsheet basic classes used
+# by others:
+#   StandardSheetReference
+#   StandardSingleCellSheetReference
+#   StandardSingleCellSheetTab
+################################################################################
+from PyQt4 import QtCore, QtGui
+from spreadsheet_helpers import CellHelpers
+from spreadsheet_registry import spreadsheetRegistry
+from spreadsheet_tab import (StandardWidgetSheetTab,
+                             StandardWidgetSheetTabInterface)
+
+################################################################################
+
+class StandardSheetReference(object):
+    """
+    StandardSheetReference is used to specify which sheet a cell want
+    to be on. It also knows how to decide if a sheet on the
+    spreadsheet is appropriate for itself.
+    """
+
+    def __init__(self):
+        """ StandardSheetReference() -> StandardSheetReference
+        Initialize to the current sheet with no minimum size
+        
+        """
+        self.sheetName = None
+        self.minimumRowCount = 1
+        self.minimumColumnCount = 1
+        self.candidate = None
+
+    def isTabValid(self, tabWidget):
+        """ isTabValid(tabWidget: QWidget) -> boolean
+        Check to see if the tab is an acceptable type
+        
+        """
+        return issubclass(tabWidget.__class__, StandardWidgetSheetTab)
+
+    def clearCandidate(self):
+        """ clearCandidate() -> None        
+        Begin the candidate searching process by clearing the previous        
+        candidate sheet. The searching process is done by looping
+        through all available sheets and let the SheetReference decides
+        and keep track of which one is the best appropriate
+        
+        """
+        self.candidate = None
+
+    def checkCandidate(self, tabWidget, tabLabel, tabIndex, curIndex):
+        """ checkCandidate(tabWidget: QWidget,
+                           tabLabel: str,
+                           tabIndex: int,
+                           curIndex: int) -> None                           
+        Check to see if this new candidate is better than the one we
+        have right now. If it is then use this one instead. The
+        condition is very simple, sheet type comes first, then name
+        and dimensions.
+
+        Keyword arguments:
+        tabWidget --- QWidget controlling actual sheet widget
+        tabLabel  --- the display label of the sheet
+        tabIndex  --- its index inside the tab controller
+        curIndex  --- the current active index of the tab controller
+        
+        """
+        if self.isTabValid(tabWidget):
+            if (self.sheetName!=None and
+                str(tabLabel)!=str(self.sheetName)):
+                return
+            if self.candidate!=None:
+                if (self.sheetName==None or
+                    (str(tabLabel)==str(self.sheetName))==
+                    (str(self.candidate[1])==str(self.sheetName))):
+                    storedSheet = self.candidate[0].sheet
+                    newSheet = tabWidget.sheet
+                    if (newSheet.rowCount()<self.minimumRowCount and
+                        storedSheet.rowCount()>=self.minimumRowCount):
+                        return
+                    if (newSheet.columnCount()<self.minimumColumnCount and
+                        storedSheet.columnCount()>=self.minimumColumnCount):
+                        return
+                    if (((newSheet.rowCount()<self.minimumRowCount)==
+                         (storedSheet.rowCount()<self.minimumRowCount)) and
+                        ((newSheet.columnCount()<self.minimumColumnCount)==
+                         (storedSheet.columnCount()<self.minimumColumnCount))):
+                        if tabIndex!=curIndex:
+                            return
+            self.candidate = (tabWidget, tabLabel, tabIndex, curIndex)
+                
+    def setupCandidate(self, tabController):
+        """ setupCandidate(tabController: SpreadsheetTabController) -> None
+        Setup the candidate we have to completely satisfy the reference,
+        making ready to be displayed on, e.g. extend the number of row and
+        column
+        
+        """
+        if self.candidate==None:
+            candidate = StandardWidgetSheetTab(tabController,
+                                               self.minimumRowCount,
+                                               self.minimumColumnCount)
+            idx = tabController.addTabWidget(candidate, self.sheetName)
+            tabController.setCurrentIndex(idx)
+            candidate.sheet.stretchCells()
+            return candidate
+        else:
+            if self.candidate[0].sheet.rowCount()<self.minimumRowCount:
+                self.candidate[0].sheet.setRowCount(self.minimumRowCount)
+            if self.candidate[0].sheet.columnCount()<self.minimumColumnCount:
+                self.candidate[0].sheet.setColumnCount(self.minimumColumnCount)
+            tabController.setCurrentWidget(self.candidate[0])
+            return self.candidate[0]
+
+class StandardSingleCellSheetTab(QtGui.QWidget,
+                                 StandardWidgetSheetTabInterface):
+    """
+    StandardSingleCellSheetTab is a container of StandardWidgetSheet
+    with only a single cell. This will be added directly to a
+    QTabWidget on the spreadsheet as a sheet for displaying
+    
+    """
+    def __init__(self, tabWidget, row=1, col=1):
+        """ StandardSingleCellSheetTab(row: int,
+                                       col: int) -> StandardSingleCellSheetTab
+        Initialize with the vertical layout containing only a single widget
+        
+        """
+        QtGui.QWidget.__init__(self, None)
+        StandardWidgetSheetTabInterface.__init__(self)
+        self.type = 'StandardSingleCellSheetTab'
+        self.tabWidget = tabWidget
+        self.vLayout = QtGui.QVBoxLayout()
+        self.vLayout.setSpacing(0)
+        self.vLayout.setMargin(0)
+        self.setLayout(self.vLayout)
+        self.cell = QtGui.QWidget()
+        self.layout().addWidget(self.cell)
+        self.helpers = CellHelpers(self)
+        self.toolBars = {}
+        self.blankCellToolBar = None
+        self.pipelineInfo = {}
+
+    ### Belows are API Wrappers to connect to self.sheet
+            
+    def getDimension(self):
+        """ getDimension() -> tuple
+        Get the sheet dimensions
+        
+        """
+        return (1,1)
+            
+    def getCell(self, row, col):
+        """ getCell(row: int, col: int) -> QWidget
+        Get cell at a specific row and column.
+        
+        """
+        return self.cell
+
+    def getCellToolBar(self, row, col):
+        """ getCellToolBar(row: int, col: int) -> QWidget
+        Return the toolbar widget at cell location (row, col)
+        
+        """
+        cell = self.getCell(row, col)
+        if cell and hasattr(cell, 'toolBarType'):
+            if not self.toolBars.has_key(cell.toolBarType):
+                self.toolBars[cell.toolBarType] = cell.toolBarType(self)
+            return self.toolBars[cell.toolBarType]
+        else:
+            return self.blankCellToolBar
+        return self.sheet.getCellToolBar(row, col)
+
+    def getCellRect(self, row, col):
+        """ getCellRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in parent coordinates
+        
+        """
+        return self.contentsRect()
+
+    def getCellGlobalRect(self, row, col):
+        """ getCellGlobalRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in global coordinates
+        
+        """
+        rect = self.getCellRect(row, col)
+        rect.moveTo(self.mapToGlobal(rect.topLeft()))
+        return rect
+
+    def setCellByType(self, row, col, cellType, inputPorts):
+        """ setCellByType(row: int,
+                          col: int,
+                          cellType: a type inherits from QWidget,
+                          inpurPorts: tuple) -> None                          
+        Replace the current location (row, col) with a cell of
+        cellType. If the current type of that cell is the same as
+        cellType, only the contents is updated with inputPorts.
+        
+        """
+        oldCell = self.getCell(row, col)
+        if type(oldCell)!=cellType:
+            oldCell.hide()
+            self.layout().removeWidget(oldCell)
+            if cellType:
+                self.cell = cellType(self)
+#                self.cell.setGeometry(self.getCellRect(row, col))
+                self.layout().addWidget(self.cell)
+                self.cell.show()
+                self.cell.updateContents(inputPorts)
+            if hasattr(oldCell, 'deleteLater'):
+                oldCell.deleteLater()
+            del oldCell
+        else:
+            oldCell.updateContents(inputPorts)
+
+    def showHelpers(self, show, globalPos):
+        """ showHelpers(show: boolean, globalPos: QPoint) -> None
+        Show the helpers (toolbar, resizer) when show==True
+        
+        """
+        if show:
+            self.helpers.snapTo(0,0)
+            self.helpers.adjustPosition()
+            self.helpers.show()
+        else:
+            self.helpers.hide()
+
+    def getSelectedLocations(self):
+        """ getSelectedLocations() -> tuple
+        Return the selected locations (row, col) of the current sheet
+        
+        """
+        return [(0,0)]
+
+class StandardSingleCellSheetReference(StandardSheetReference):
+    """
+    StandardSingleCellSheetReference is a sheet reference that only
+    accepts a single cell. This overrides the StandardSheetReference
+    
+    """
+    def isTabValid(self, tabWidget):
+        """ isTabValid(tabWidget: QWidget) -> boolean
+        Only accepts StandardSingleCellSheetTab
+        
+        """
+        return issubclass(tabWidget.__class__, StandardSingleCellSheetTab)
+
+    def checkCandidate(self, tabWidget, tabLabel, tabIndex, curIndex):
+        """ checkCandidate(tabWidget: QWidget,
+                           tabLabel: str,
+                           tabIndex: int,
+                           curIndex: int) -> None
+        Better candidate is decided merely if it is the current index
+        
+        """
+        if self.isTabValid(tabWidget):
+            better = False
+            if (self.sheetName!=None and
+                str(tabLabel)!=str(self.sheetName)):
+                return
+            if self.candidate!=None:
+                if self.candidate[2]==curIndex or tabIndex!=curIndex:
+                    return
+            self.candidate = (tabWidget, tabLabel, tabIndex, curIndex)
+                
+    def setupCandidate(self, tabController):
+        """ setupCandidate(tabController: SpreadsheetTabController) -> None
+        Set up the sheet to be single-cell sheet
+        
+        """
+        if self.candidate==None:
+            candidate = StandardSingleCellSheetTab(tabController)
+            index = tabController.addTabWidget(candidate, self.sheetName)
+            tabController.setCurrentIndex(index)
+            return candidate
+        else:
+            return self.candidate[0]
+
+spreadsheetRegistry.registerSheet('StandardSingleCellSheetTab',
+                                  StandardSingleCellSheetTab)
+
diff --git a/vistrails/packages/spreadsheet/spreadsheet_cell.py b/vistrails/packages/spreadsheet/spreadsheet_cell.py
new file mode 100644
index 0000000..31f39ad
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_cell.py
@@ -0,0 +1,1179 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains classes working with cell helper widgets, i.e. toolbar,
+# resizer, etc.:
+#   QCellWidget
+#   QCellToolBar
+################################################################################
+from PyQt4 import QtCore, QtGui
+import datetime
+import os
+import tempfile
+from vistrails.core import debug
+import cell_rc
+import celltoolbar_rc
+import spreadsheet_controller
+import analogy_api
+from vistrails.core.configuration import get_vistrails_configuration
+
+################################################################################
+
+class QCellWidget(QtGui.QWidget):
+    """
+    QCellWidget is the base cell class. All types of spreadsheet cells
+    should inherit from this.
+    
+    """
+
+    def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags()):
+        """ QCellWidget(parent: QWidget) -> QCellWidget
+        Instantiate the cell and helper properties
+        
+        """
+        QtGui.QWidget.__init__(self, parent, flags)
+        self._historyImages = []
+        self._player = QtGui.QLabel(self.parent())
+        self._player.setAutoFillBackground(True)
+        self._player.setFocusPolicy(QtCore.Qt.NoFocus)
+        self._player.setScaledContents(True)
+        self._playerTimer = QtCore.QTimer()        
+        self._playerTimer.setSingleShot(True)
+        self._currentFrame = 0
+        self._playing = False
+        # cell can be captured if it re-implements saveToPNG
+        self._capturingEnabled = (not isinstance(self, QCellWidget) and
+                                  hasattr(self, 'saveToPNG'))
+        self.connect(self._playerTimer,
+                     QtCore.SIGNAL('timeout()'),
+                     self.playNextFrame)
+        if getattr(get_vistrails_configuration(),'fixedSpreadsheetCells',False):
+            self.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+            self.setFixedSize(200, 180)
+
+    def setAnimationEnabled(self, enabled):
+        """ setAnimationEnabled(enabled: bool) -> None
+        
+        """
+        self._capturingEnabled = enabled
+        if not enabled:
+            self.clearHistory()
+        
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> Bool       
+        Abtract function for saving the current widget contents to an
+        image file
+        Returns True when succesful
+        
+        """
+        debug.critical('saveToPNG() is unimplemented by the inherited cell')
+
+    def saveToHistory(self):
+        """ saveToHistory() -> None
+        Save the current contents to the history
+        
+        """
+        # Generate filename
+        current = datetime.datetime.now()
+        tmpDir = tempfile.gettempdir()
+        fn = ( "hist_" + current.strftime("%Y_%m_%d__%H_%M_%S") +
+               "_" + str(current.microsecond)+".png")
+        fn = os.path.join(tmpDir, fn)
+        if self.saveToPNG(fn):
+            self._historyImages.append(fn)
+
+    def clearHistory(self):
+        """ clearHistory() -> None
+        Clear all history files
+        
+        """
+        for fn in self._historyImages:
+            os.remove(fn)
+        self._historyImages = []
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to clear history and delete the widget
+        
+        """
+        self.clearHistory()
+        QtGui.QWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Make sure to capture to history
+        
+        """
+        # Capture window into history for playback
+        if self._capturingEnabled:
+            self.saveToHistory()
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the player widget
+        
+        """
+        QtGui.QWidget.resizeEvent(self, e)
+
+        if self._player.isVisible():
+            self._player.setGeometry(self.geometry())
+
+    def setPlayerFrame(self, frame):
+        """ setPlayerFrame(frame: int) -> None
+        Set the player to display a particular frame number
+        
+        """
+        if (len(self._historyImages)==0):
+            return
+        if frame>=len(self._historyImages):
+            frame = frame % len(self._historyImages)
+        if frame>=len(self._historyImages):
+            return
+        self._player.setPixmap(QtGui.QPixmap(self._historyImages[frame]))
+
+    def startPlayer(self):
+        """ startPlayer() -> None
+        Adjust the size of the player to the cell and show it
+        
+        """
+        if not self._capturingEnabled:
+            return
+        self._player.setParent(self.parent())
+        self._player.setGeometry(self.geometry())
+        self._player.raise_()
+        self._currentFrame = -1
+        self.playNextFrame()
+        self._player.show()
+        self.hide()
+        self._playing = True
+        
+    def stopPlayer(self):
+        """ startPlayer() -> None
+        Adjust the size of the player to the cell and show it
+        
+        """
+        if not self._capturingEnabled:
+            return
+        self._playerTimer.stop()
+        self._player.hide()
+        self.show()
+        self._playing = False
+
+    def showNextFrame(self):
+        """ showNextFrame() -> None
+        Display the next frame in the history
+        
+        """
+        self._currentFrame += 1
+        if self._currentFrame>=len(self._historyImages):
+            self._currentFrame = 0
+        self.setPlayerFrame(self._currentFrame)
+        
+    def playNextFrame(self):
+        """ playNextFrame() -> None        
+        Display the next frame in the history and start the timer for
+        the frame after
+        
+        """
+        self.showNextFrame()
+        self._playerTimer.start(100)
+
+    def grabWindowPixmap(self):
+        """ grabWindowPixmap() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        return QtGui.QPixmap.grabWidget(self)
+
+    def dumpToFile(self, filename):
+        """ dumpToFile(filename: str, dump_as_pdf: bool) -> None
+        Dumps itself as an image to a file, calling grabWindowPixmap """
+        pixmap = self.grabWindowPixmap()
+        pixmap.save(filename,"PNG")
+            
+    def saveToPDF(self, filename):
+        printer = QtGui.QPrinter()
+
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        pixmap = self.grabWindowPixmap()
+        size = pixmap.size()
+        printer.setPaperSize(QtCore.QSizeF(size.width(), size.height()),
+                             QtGui.QPrinter.Point)
+        painter = QtGui.QPainter()
+        painter.begin(printer)
+        rect = painter.viewport()
+        size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)
+        painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
+        painter.setWindow(pixmap.rect())
+        painter.drawPixmap(0, 0, pixmap)
+        painter.end()
+        
+        
+################################################################################
+
+class QCellToolBar(QtGui.QToolBar):
+    """
+    CellToolBar is inherited from QToolBar with some functionalities
+    for interacting with CellHelpers
+    
+    """
+    def __init__(self, sheet):
+        """ CellToolBar(sheet: SpreadsheetSheet) -> CellToolBar
+        Initialize the cell toolbar by calling the user-defined
+        toolbar construction function
+        
+        """
+        QtGui.QToolBar.__init__(self,sheet)
+        self.setOrientation(QtCore.Qt.Horizontal)
+        self.sheet = sheet
+        self.row = -1
+        self.col = -1
+        self.layout().setMargin(0)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+        pixmap = self.style().standardPixmap(QtGui.QStyle.SP_DialogCloseButton)
+        self.appendAction(QCellToolBarRemoveCell(QtGui.QIcon(pixmap), self))
+        self.appendAction(QCellToolBarMergeCells(QtGui.QIcon(':celltoolbar/mergecells.png'), self))
+        self.createToolBar()
+
+    def addAnimationButtons(self):
+        """ addAnimationButtons() -> None
+        
+        """
+        self.appendAction(QCellToolBarCaptureToHistory(self))
+        self.appendAction(QCellToolBarPlayHistory(self))
+        self.appendAction(QCellToolBarClearHistory(self))
+
+    def createToolBar(self):
+        """ createToolBar() -> None        
+        A user-defined method for customizing the toolbar. This is
+        going to be an empty method here for inherited classes to
+        override.
+        
+        """
+        self.addAnimationButtons()
+
+    def snapTo(self, row, col):
+        """ snapTo(row, col) -> None
+        Assign which row and column the toolbar should be snapped to
+        
+        """
+        self.row = row
+        self.col = col
+        self.updateToolBar()
+
+    def updateToolBar(self):
+        """ updateToolBar() -> None        
+        This will get called when the toolbar widgets need to have
+        their status updated. It sends out needUpdateStatus signal
+        to let the widget have a change to update their own status
+        
+        """
+        cellWidget = self.sheet.getCell(self.row, self.col)
+        for action in self.actions():
+            action.emit(QtCore.SIGNAL('needUpdateStatus'),
+                        (self.sheet, self.row, self.col, cellWidget))
+
+    def connectAction(self, action, widget):
+        """ connectAction(action: QAction, widget: QWidget) -> None
+        Connect actions to special slots of a widget
+        
+        """
+        if hasattr(widget, 'updateStatus'):
+            self.connect(action, QtCore.SIGNAL('needUpdateStatus'),
+                         widget.updateStatus)
+        if hasattr(widget, 'triggeredSlot'):
+            self.connect(action, QtCore.SIGNAL('triggered()'),
+                         widget.triggeredSlot)
+        if hasattr(widget, 'toggledSlot'):
+            self.connect(action, QtCore.SIGNAL('toggled(bool)'),
+                         widget.toggledSlot)
+
+    def appendAction(self, action):
+        """ appendAction(action: QAction) -> QAction
+        Setup and add action to the tool bar
+        
+        """
+        action.toolBar = self
+        self.addAction(action)
+        self.connectAction(action, action)
+        return action
+
+    def appendWidget(self, widget):
+        """ appendWidget(widget: QWidget) -> QAction
+        Setup the widget as an action and add it to the tool bar
+
+        """
+        action = self.addWidget(widget)
+        widget.toolBar = self
+        action.toolBar = self
+        self.connectAction(action, widget)
+        return action
+
+    def getSnappedWidget(self):
+        """ getSnappedWidget() -> QWidget
+        Return the widget being snapped by the toolbar
+        
+        """
+        if self.row>=0 and self.col>=0:
+            return self.sheet.getCell(self.row, self.col)
+        else:
+            return None
+
+class QCellToolBarRemoveCell(QtGui.QAction):
+    """
+    QCellToolBarRemoveCell is the action to clear the current cell
+
+    """
+    def __init__(self, icon, parent=None):
+        """ QCellToolBarRemoveCell(icon: QIcon, parent: QWidget)
+                                   -> QCellToolBarRemoveCell
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               icon,
+                               "&Clear the current cell",
+                               parent)
+        self.setStatusTip("Clear the current cell")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        r = QtGui.QMessageBox.question(cellWidget, 'Clear cell',
+                                       'Are you sure to clear the cell?',
+                                       QtGui.QMessageBox.Yes |
+                                       QtGui.QMessageBox.No,
+                                       QtGui.QMessageBox.No)
+        if (r==QtGui.QMessageBox.Yes):
+            self.toolBar.sheet.deleteCell(self.toolBar.row, self.toolBar.col)
+
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        self.setVisible(cellWidget!=None)
+        
+class QCellToolBarMergeCells(QtGui.QAction):
+    """
+    QCellToolBarMergeCells is the action to merge selected cells to a
+    single cell if they are in consecutive poisitions
+
+    """
+    def __init__(self, icon, parent=None):
+        """ QCellToolBarMergeCells(icon: QIcon, parent: QWidget)
+                                   -> QCellToolBarMergeCells
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               icon,
+                               "&Merge cells",
+                               parent)
+        self.setStatusTip("Merge selected cells to a single cell if "
+                          "they are in consecutive poisitions")
+        self.setCheckable(True)
+
+    def triggeredSlot(self):
+        """ toggledSlot() -> None
+        Execute the action when the button is clicked
+        
+        """
+        # Merge
+        if self.isChecked():
+            sheet = self.toolBar.sheet
+            selectedCells = sorted(sheet.getSelectedLocations())
+            topLeft = selectedCells[0]
+            bottomRight = selectedCells[-1]
+            sheet.setSpan(topLeft[0], topLeft[1],
+                          bottomRight[0]-topLeft[0]+1,
+                          bottomRight[1]-topLeft[1]+1)
+        else:
+            sheet = self.toolBar.sheet
+            selectedCells = sorted(sheet.getSelectedLocations())
+            for (row, col) in selectedCells:
+                sheet.setSpan(row, col, 1, 1)
+        sheet.clearSelection()
+        self.toolBar.updateToolBar()
+
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        selectedCells = sorted(sheet.getSelectedLocations())
+
+        # Will not show up if there is no cell selected
+        if len(selectedCells)==0:            
+            self.setVisible(False)
+            
+        # If there is a single cell selected, only show up if it has
+        # been merged before so that user can un-merge cells
+        elif len(selectedCells)==1:
+            showUp = False
+            if selectedCells[0]==(row, col):
+                span = sheet.getSpan(row, col)
+                if span[0]>1 or span[1]>1:
+                    showUp = True
+            if showUp:
+                self.setChecked(True)
+                self.setVisible(True)
+            else:
+                self.setVisible(False)
+                
+        # If there are multiple cells selected, only show up if they
+        # can be merged, i.e. cells are in consecutive position and
+        # none of them is already merged
+        else:
+            showUp = False
+            validRange = False
+            topLeft = selectedCells[0]
+            bottomRight = selectedCells[-1]
+            fullCount = (bottomRight[0]-topLeft[0]+1)*(bottomRight[1]-topLeft[1]+1)
+            validRange = len(selectedCells)==fullCount
+            if validRange:
+                showUp = True
+                for (r, c) in selectedCells:
+                    span = sheet.getSpan(r, c)
+                    if span[0]>1 or span[1]>1:
+                        showUp = False
+                        break
+            if showUp:
+                self.setChecked(False)
+                self.setVisible(True)
+            else:
+                self.setVisible(False)
+            
+class QCellToolBarCaptureToHistory(QtGui.QAction):
+    """
+    QCellToolBarCaptureToHistory is the action to capture the
+    underlying widget to history for play back. The cell type must
+    support function saveToPNG(filename)
+    
+    """
+    def __init__(self, parent=None):
+        """ QCellToolBarCaptureToHistory(parent: QWidget)
+                                         -> QCellToolBarCaptureToHistory
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera_mount.png"),
+                               "&Capture image to history",
+                               parent)
+        self.setStatusTip("Capture the cell contents to the history for "
+                          "playback later")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        self.toolBar.hide()
+        cellWidget.saveToHistory()
+        self.toolBar.updateToolBar()
+        self.toolBar.show()
+        
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        if cellWidget:
+            self.setVisible(cellWidget._capturingEnabled)
+        else:
+            self.setVisible(False)
+
+################################################################################
+        
+class QCellToolBarPlayHistory(QtGui.QAction):
+    """
+    QCellToolBarPlayHistory is the action to play the history as an
+    animation
+    
+    """
+    def __init__(self, parent=None):
+        """ QCellToolBarPlayHistory(parent: QWidget)
+                                    -> QCellToolBarPlayHistory
+        Setup the image, status tip, etc. of the action
+        
+        """
+        self.icons = [QtGui.QIcon(":/images/player_play.png"),
+                      QtGui.QIcon(":/images/player_pause.png")]
+        self.toolTips = ["&Play the history",
+                         "Pa&use the history playback"]
+        self.statusTips = ["Playback all image files kept in the history",
+                           "Pause the playback"]
+        QtGui.QAction.__init__(self, self.icons[0], self.toolTips[0], parent)
+        self.setStatusTip(self.statusTips[0])
+        self.status = 0
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        if self.status==0:
+            cellWidget.startPlayer()
+        else:
+            cellWidget.stopPlayer()
+        self.toolBar.updateToolBar()
+
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        if cellWidget:
+            self.setVisible(cellWidget._capturingEnabled)
+            newStatus = int(cellWidget._playing)
+            if newStatus!=self.status:
+                self.status = newStatus
+                self.setIcon(self.icons[self.status])
+                self.setToolTip(self.toolTips[self.status])
+                self.setStatusTip(self.statusTips[self.status])
+            self.setEnabled(len(cellWidget._historyImages)>0)
+        else:
+            self.setVisible(False)
+
+################################################################################
+            
+class QCellToolBarClearHistory(QtGui.QAction):
+    """
+    QCellToolBarClearHistory is the action to reset cell history
+    
+    """
+    def __init__(self, parent=None):
+        """ QCellToolBarClearHistory(parent: QWidget)
+                                     -> QCellToolBarClearHistory
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/noatunloopsong.png"),
+                               "&Clear this cell history",
+                               parent)
+        self.setStatusTip("Clear the cell history and its temporary "
+                          "image files on disk")        
+        
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.clearHistory()
+        self.toolBar.updateToolBar()
+        
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        if cellWidget:
+            self.setVisible(cellWidget._capturingEnabled)
+            self.setEnabled((len(cellWidget._historyImages)>0
+                             and cellWidget._playing==False))
+        else:
+            self.setVisible(False)
+
+################################################################################
+
+class QCellContainer(QtGui.QWidget):
+    """ QCellContainer is a simple QWidget containing the actual cell
+    widget as a child. This also acts as a sentinel protecting the
+    actual cell widget from being destroyed by sheet widgets
+    (e.g. QTableWidget) where they take control of the cell widget.
+    
+    """
+    def __init__(self, widget=None, parent=None):
+        """ QCellContainer(parent: QWidget) -> QCellContainer
+        Create an empty container
+        
+        """
+        QtGui.QWidget.__init__(self, parent)
+        layout = QtGui.QVBoxLayout()
+        layout.setSpacing(0)
+        layout.setMargin(0)
+        self.setLayout(layout)
+        self.containedWidget = None
+        self.setWidget(widget)
+        self.toolBar = None
+
+    def setWidget(self, widget):
+        """ setWidget(widget: QWidget) -> None
+        Set the contained widget of this container
+        
+        """
+        if widget!=self.containedWidget:
+            if self.containedWidget:
+                self.layout().removeWidget(self.containedWidget)
+                self.containedWidget.deleteLater()
+                self.toolBar = None
+            if widget:
+                widget.setParent(self)
+                self.layout().addWidget(widget)
+                widget.show()
+            self.containedWidget = widget
+
+    def widget(self):
+        """ widget() -> QWidget
+        Return the contained widget
+        
+        """
+        return self.containedWidget
+
+    def takeWidget(self):
+        """ widget() -> QWidget
+        Take the contained widget out without deleting
+        
+        """
+        widget = self.containedWidget
+        if self.containedWidget:
+            self.layout().removeWidget(self.containedWidget)
+            self.containedWidget.setParent(None)
+            self.containedWidget = None
+        self.toolBar = None
+        return widget
+
+################################################################################
+
+class QCellPresenter(QtGui.QLabel):
+    """
+    QCellPresenter represents a cell in the Editing Mode. It has an
+    info bar on top and control dragable icons on the bottom
+    
+    """
+    def __init__(self, parent=None):
+        """ QCellPresenter(parent: QWidget) -> QCellPresenter
+        Create the layout of the widget
+        
+        """        
+        QtGui.QLabel.__init__(self, parent)        
+        self.setAutoFillBackground(True)
+        self.setScaledContents(True)
+        self.setMargin(0)
+        self.setFocusPolicy(QtCore.Qt.ClickFocus)
+        self.cellWidget = None
+
+        layout = QtGui.QGridLayout(self)
+        layout.setSpacing(2)
+        layout.setMargin(self.margin())
+        layout.setRowStretch(1, 1)
+        self.setLayout(layout)
+        
+        self.info = QPipelineInfo()
+        layout.addWidget(self.info, 0, 0, 1, 2)        
+
+        self.manipulator = QCellManipulator()
+        layout.addWidget(self.manipulator, 1, 0, 1, 2)
+
+    def assignCellWidget(self, cellWidget):
+        """ updateFromCellWidget(cellWidget: QWidget) -> None
+        Assign a cell widget to this presenter
+        
+        """
+        self.cellWidget = cellWidget
+        if cellWidget:
+            if hasattr(cellWidget, 'grabWindowPixmap'):
+                bgPixmap = cellWidget.grabWindowPixmap()
+            else:
+                bgPixmap = QtGui.QPixmap.grabWidget(cellWidget)
+            self.info.show()
+        else:
+            self.info.hide()
+            bgPixmap = QtGui.QPixmap.grabWidget(self)
+        self.thumbnail = QtGui.QPixmap(bgPixmap)
+        painter = QtGui.QPainter(bgPixmap)
+        painter.fillRect(bgPixmap.rect(),
+                         QtGui.QBrush(QtGui.QColor(175, 198, 229, 196)))
+        painter.end()
+        self.setPixmap(bgPixmap)
+
+    def assignCell(self, sheet, row, col):
+        """ assignCell(sheet: Sheet, row: int, col: int) -> None
+        Assign a sheet cell to the presenter
+        
+        """
+        self.manipulator.assignCell(sheet, row, col)
+        self.assignCellWidget(sheet.getCell(row, col))
+        info = sheet.getCellPipelineInfo(row, col)
+        self.info.updateInfo(info)
+        
+    def releaseCellWidget(self):
+        """ releaseCellWidget() -> QWidget
+        Return the ownership of self.cellWidget to the caller
+        
+        """
+        cellWidget = self.cellWidget
+        self.assignCellWidget(None)
+        self.manipulator.assignCell(None, -1, -1)
+        if cellWidget:
+            cellWidget.setParent(None)
+        return cellWidget
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to delete the cell widget if it exists
+        
+        """
+        if (self.cellWidget):
+            self.cellWidget.deleteLater()
+        QtGui.QLabel.deleteLater(self)
+
+################################################################################
+
+class QInfoLineEdit(QtGui.QLineEdit):
+    """
+    QInfoLineEdit is wrapper for a transparent, un-frame, read-only
+    line edit
+    
+    """
+    def __init__(self, parent=None):
+        """ QInfoLineEdit(parent: QWidget) -> QInfoLineEdit
+        Initialize the line edit
+        
+        """
+        QtGui.QLineEdit.__init__(self, parent)
+        self.setReadOnly(True)
+        self.setFrame(False)
+        pal = QtGui.QPalette(self.palette())
+        pal.setBrush(QtGui.QPalette.Base,
+                     QtGui.QBrush(QtCore.Qt.NoBrush))
+        self.setPalette(pal)
+
+
+class QInfoLabel(QtGui.QLabel):
+    """
+    QInfoLabel is wrapper for a transparent, bolded label
+    
+    """
+    def __init__(self, text='', parent=None):
+        """ QInfoLabel(text: str, parent: QWidget) -> QInfoLabel
+        Initialize the line edit
+        
+        """
+        QtGui.QLabel.__init__(self, text, parent)
+        font = QtGui.QFont(self.font())
+        font.setBold(True)
+        self.setFont(font)
+
+################################################################################
+    
+class QPipelineInfo(QtGui.QFrame):
+    """
+    QPipelineInfo displays information about the executed pipeline of
+    a cell. It has 3 static lines: Vistrail name, (pipeline name,
+    pipeline id) and the cell type
+    
+    """
+    def __init__(self, parent=None):
+        """ QPipelineInfo(parent: QWidget) -> None
+        Create the 3 information lines
+        
+        """
+        QtGui.QFrame.__init__(self, parent)
+        self.setAutoFillBackground(True)
+        self.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Maximum)
+
+        pal = QtGui.QPalette(self.palette())
+        color = QtGui.QColor(pal.brush(QtGui.QPalette.Base).color())
+        color.setAlpha(196)
+        pal.setBrush(QtGui.QPalette.Base, QtGui.QBrush(color))
+        self.setPalette(pal)
+        
+        topLayout = QtGui.QVBoxLayout(self)
+        topLayout.setSpacing(0)
+        topLayout.setMargin(0)
+        self.setLayout(topLayout)
+
+        hLine = QtGui.QFrame()
+        hLine.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Plain)
+        hLine.setFixedHeight(1)
+        topLayout.addWidget(hLine)
+
+        layout = QtGui.QGridLayout()
+        layout.setSpacing(2)
+        layout.setMargin(2)
+        topLayout.addLayout(layout)
+
+        self.edits = []
+        texts = ['Vistrail', 'Index', 'Created by']
+        for i in xrange(len(texts)):
+            label = QInfoLabel(texts[i])
+            layout.addWidget(label, i, 0, 1, 1)
+            edit = QInfoLineEdit()
+            self.edits.append(edit)
+            layout.addWidget(edit, i, 1, 1, 1)
+
+        topLayout.addStretch()
+        hLine = QtGui.QFrame()
+        hLine.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Plain)
+        hLine.setFixedHeight(1)
+        topLayout.addWidget(hLine)
+
+    def updateInfo(self, info):
+        """ updateInfo(info: (dict, pid)) -> None
+        Update the information of a pipeline info
+        
+        """
+        if info!=None and info[0]['locator']!=None:
+            self.edits[0].setText(str(info[0]['locator'].name))
+            self.edits[1].setText('(Pipeline: %d, Module: %d)'
+                                  % (info[0]['version'], info[0]['moduleId']))
+            self.edits[2].setText(str(info[0]['reason']))
+        else:
+            for edit in self.edits:
+                edit.setText('N/A')
+
+################################################################################
+
+class QCellManipulator(QtGui.QFrame):
+    """
+    QCellManipulator contains several dragable icons that allow users
+    to move/copy or perform some operation from one cell to
+    another. It also inclues a button for update the pipeline under
+    the cell to be a new version on the pipeline. It is useful for the
+    parameter exploration talks back to the builder
+    
+    """
+    def __init__(self, parent=None):
+        """ QPipelineInfo(parent: QWidget) -> None
+        Create the 3 information lines
+        
+        """
+        QtGui.QFrame.__init__(self, parent)
+        self.setAcceptDrops(True)
+        self.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+        
+        layout = QtGui.QVBoxLayout(self)
+        layout.setSpacing(0)
+        layout.setMargin(0)
+        self.setLayout(layout)
+
+        layout.addStretch()
+
+        bLayout = QtGui.QHBoxLayout()
+        layout.addLayout(bLayout)                
+
+        bInfo = [(':/images/copy_cell.png',
+                  'Drag to copy this cell to another place',
+                  'copy', 'Copy'),
+                 (':/images/move_cell.png',
+                  'Drag to move this cell to another place',
+                  'move', 'Move'),
+                 (':/images/create_analogy.png',
+                  'Drag to create an analogy between this cell and another one',
+                  'create_analogy', 'Create\nAnalogy'),
+                 (':/images/apply_analogy.png',
+                  'Drag to apply the current analogy to this cell and put it '
+                  'at another place', 'apply_analogy', 'Apply\nAnalogy')]
+        
+        self.buttons = []
+        
+        bLayout.addStretch()
+        for b in bInfo:
+            button = QCellDragLabel(QtGui.QPixmap(b[0]))
+            button.setToolTip(b[1])
+            button.setStatusTip(b[1])
+            button.action = b[2]
+            vLayout = QtGui.QVBoxLayout()
+            vLayout.addWidget(button)
+            label = QtGui.QLabel(b[3])
+            label.setAlignment(QtCore.Qt.AlignCenter)
+            vLayout.addWidget(label)
+            bLayout.addLayout(vLayout)
+            self.buttons.append(button)
+            self.buttons.append(label)
+
+        self.updateButton = QtGui.QToolButton()
+        self.updateButton.setIconSize(QtCore.QSize(64, 64))
+        self.updateButton.setIcon(QtGui.QIcon(QtGui.QPixmap(            
+            ':/images/update.png')))
+        self.updateButton.setAutoRaise(True)
+        self.updateButton.setToolTip('Add this cell as a new version')
+        self.updateButton.setStatusTip(self.updateButton.toolTip())
+        self.updateButton.setText('Create Version')
+        self.updateButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
+        self.connect(self.updateButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.updateVersion)
+        self.buttons.append(self.updateButton)
+
+        self.locateButton = QtGui.QToolButton()
+        self.locateButton.setIconSize(QtCore.QSize(64, 64))
+        self.locateButton.setIcon(QtGui.QIcon(QtGui.QPixmap(            
+            ':/images/locate.png')))
+        self.locateButton.setAutoRaise(True)
+        self.locateButton.setToolTip('Select this pipeline in the version tree ')
+        self.locateButton.setStatusTip(self.locateButton.toolTip())
+        self.locateButton.setText('Locate Version')
+        self.locateButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
+        self.connect(self.locateButton, QtCore.SIGNAL('clicked(bool)'),
+                     self.locateVersion)
+        self.buttons.append(self.locateButton)
+
+        
+        uLayout = QtGui.QHBoxLayout()
+        uLayout.addStretch()
+        uLayout.addWidget(self.locateButton)
+        uLayout.addWidget(self.updateButton)
+        uLayout.addStretch()
+        layout.addLayout(uLayout)
+            
+        bLayout.addStretch()
+
+        layout.addStretch()
+
+        self.innerRubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle,
+                                                 self)
+        
+    def assignCell(self, sheet, row, col):
+        """ assignCell(sheet: Sheet, row: int, col: int) -> None
+        Assign a cell to the manipulator, so it knows where to drag
+        and drop
+        
+        """
+        self.cellInfo = (sheet, row, col)
+        for b in self.buttons:
+            if hasattr(b, 'updateCellInfo'):
+                b.updateCellInfo(self.cellInfo)
+            if sheet and sheet.getCell(row, col)!=None:
+                widget = sheet.getCell(row, col)
+                b.setVisible(not isinstance(widget, QCellPresenter) or
+                             widget.cellWidget is not None)
+            else:
+                b.setVisible(False)
+        self.updateButton.setVisible(False)
+        if sheet:
+            info = sheet.getCellPipelineInfo(row, col)
+            if info:
+                self.updateButton.setVisible(len(info[0]['actions'])>0)
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the other cell info
+        
+        """
+        mimeData = event.mimeData()
+        if hasattr(mimeData, 'cellInfo'):
+            if (mimeData.cellInfo==self.cellInfo or
+                mimeData.cellInfo[0]==None or
+                self.cellInfo[0]==None):
+                event.ignore()
+            else:
+                event.setDropAction(QtCore.Qt.MoveAction)
+                event.accept()
+                self.highlight()
+        else:
+            event.ignore()
+            
+    def dragLeaveEvent(self, event):
+        """ dragLeaveEvent(event: QDragLeaveEvent) -> None
+        Unhighlight when the cursor leaves
+        
+        """
+        self.highlight(False)
+        
+    def dropEvent(self, event):
+        """ dragLeaveEvent(event: QDragLeaveEvent) -> None
+        Unhighlight when the cursor leaves
+        
+        """
+        self.highlight(False)
+        mimeData = event.mimeData()
+        action = mimeData.action
+        cellInfo = mimeData.cellInfo
+        manipulator = mimeData.manipulator
+        if action in ['move', 'copy', 'create_analogy', 'apply_analogy']:
+            event.setDropAction(QtCore.Qt.MoveAction)
+            event.accept()
+            
+            if action=='move':
+                self.cellInfo[0].swapCell(self.cellInfo[1], self.cellInfo[2],
+                                          cellInfo[0], cellInfo[1], cellInfo[2])
+                manipulator.assignCell(*self.cellInfo)
+                self.assignCell(*cellInfo)
+                
+            if action=='copy':
+                cellInfo[0].copyCell(cellInfo[1], cellInfo[2],
+                                     self.cellInfo[0], self.cellInfo[1],
+                                     self.cellInfo[2])
+                
+            if action=='create_analogy':
+                p1Info = cellInfo[0].getPipelineInfo(cellInfo[1], cellInfo[2])
+                p2Info = self.cellInfo[0].getPipelineInfo(self.cellInfo[1],
+                                                          self.cellInfo[2])
+                if p1Info!=None and p2Info!=None:
+                    analogy = analogy_api.SpreadsheetAnalogy()
+                    analogy.createAnalogy(p1Info, p2Info)
+
+            if action=='apply_analogy':
+                p1Info = cellInfo[0].getPipelineInfo(cellInfo[1], cellInfo[2])
+                analogy = analogy_api.SpreadsheetAnalogy()
+                newPipeline = analogy.applyAnalogy(p1Info)
+                if newPipeline:
+                    self.cellInfo[0].executePipelineToCell(newPipeline,
+                                                           self.cellInfo[1],
+                                                           self.cellInfo[2],
+                                                           'Apply Analogy')
+
+        else:
+            event.ignore()
+                    
+        
+    def highlight(self, on=True):
+        """ highlight(on: bool) -> None
+        Highlight the cell as if being selected
+        
+        """
+        if on:
+            self.innerRubberBand.setGeometry(self.rect())
+            self.innerRubberBand.show()
+        else:
+            self.innerRubberBand.hide()
+
+    def updateVersion(self):
+        """ updateVersion() -> None        
+        Use the performed action of this cell to add back a new
+        version to the version tree
+        
+        """
+        spreadsheetController = spreadsheet_controller.spreadsheetController
+        builderWindow = spreadsheetController.getBuilderWindow()
+        if builderWindow:
+            info = self.cellInfo[0].getCellPipelineInfo(self.cellInfo[1],
+                                                        self.cellInfo[2])
+            if info:
+                info = info[0]
+                view = builderWindow.ensureController(info['controller'])
+                if view:
+                    controller = view.controller
+                    controller.change_selected_version(info['version'])
+                    controller.perform_param_changes(info['actions'])
+                    # controller.performBulkActions(info['actions'])
+
+    def locateVersion(self):
+        """ locateVersion() -> None        
+        Select the version node on the version that has generated this cell
+        
+        """
+        spreadsheetController = spreadsheet_controller.spreadsheetController
+        builderWindow = spreadsheetController.getBuilderWindow()
+        if builderWindow:
+            info = self.cellInfo[0].getCellPipelineInfo(self.cellInfo[1],
+                                                        self.cellInfo[2])
+            if info:
+                info = info[0]
+                view = builderWindow.ensureController(info['controller'])
+                if view:
+                    view.version_selected(info['version'], True)
+                    view.version_view.select_current_version()
+                    builderWindow.view_changed(view)
+                    w = view.window()
+                    # this has no effect
+                    w.qactions['history'].trigger()
+                    # so we need to use this one
+                    view.history_selected()
+                    view.activateWindow()
+
+################################################################################
+
+class QCellDragLabel(QtGui.QLabel):
+    """
+    QCellDragLabel is a pixmap label allowing users to drag it to
+    another cell manipulator
+    
+    """
+    def __init__(self, pixmap, parent=None):
+        """ QCellDragLabel(pixmap: QPixmap, parent: QWidget) -> QCellDragLabel
+        Construct the pixmap label
+        
+        """
+        QtGui.QLabel.__init__(self, parent)
+        self.setMargin(0)
+        self.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
+        self.setPixmap(pixmap)
+        self.setScaledContents(True)
+        self.setFixedSize(64, 64)
+        self.cursorPixmap = pixmap.scaled(self.size())
+
+        self.startPos = None
+        self.cellInfo = (None, -1, -1)
+        self.action = None
+        
+    def updateCellInfo(self, cellInfo):
+        """ updateCellInfo(cellInfo: tuple) -> None
+        Update cellInfo for mime data while dragging
+        
+        """
+        self.cellInfo = cellInfo
+
+    def mousePressEvent(self, event):
+        """ mousePressEvent(event: QMouseEvent) -> None
+        Store the start position for drag event
+        
+        """
+        self.startPos = QtCore.QPoint(event.pos())
+        QtGui.QLabel.mousePressEvent(self, event)
+
+    def mouseMoveEvent(self, event):
+        """ mouseMoveEvent(event: QMouseEvent) -> None
+        Prepare to drag
+        
+        """
+        p = event.pos() - self.startPos
+        if p.manhattanLength()>=QtGui.QApplication.startDragDistance():
+            drag = QtGui.QDrag(self)
+            data = QtCore.QMimeData()
+            data.cellInfo = self.cellInfo
+            data.action = self.action
+            data.manipulator = self.parent()
+            drag.setMimeData(data)
+            drag.setHotSpot(self.cursorPixmap.rect().center())
+            drag.setPixmap(self.cursorPixmap)            
+            drag.start(QtCore.Qt.MoveAction)
diff --git a/vistrails/packages/spreadsheet/spreadsheet_config.py b/vistrails/packages/spreadsheet/spreadsheet_config.py
new file mode 100644
index 0000000..c75ccb2
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_config.py
@@ -0,0 +1,39 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.configuration import ConfigurationObject
+configuration = ConfigurationObject(rowCount=2,
+                                    columnCount=3,
+                                    dumpfileType='PNG')
+# other possible value for dumpfileType is PDF
diff --git a/vistrails/packages/spreadsheet/spreadsheet_controller.py b/vistrails/packages/spreadsheet/spreadsheet_controller.py
new file mode 100644
index 0000000..0d16f73
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_controller.py
@@ -0,0 +1,129 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains the spreadsheet controller to take care of
+# interactions to the spreadsheet:
+#   SpreadsheetController
+################################################################################
+from PyQt4 import QtCore, QtGui
+from spreadsheet_window import SpreadsheetWindow
+
+################################################################################
+
+class SpreadsheetController(object):
+    """
+    SpreadsheetController will act like an event dispatcher to
+    interact and control the spreadsheet in a thread-safe manner
+    (postEvent).
+
+    """
+    def __init__(self):
+        """ SpreadsheetController() -> SpreadsheetController
+        This class is more like an interface where there is no data inside
+        
+        """
+        pass
+
+    def findSpreadsheetWindow(self, show=True):
+        """ findSpreadsheetWindow() -> QWidget
+        Looking for the spreadsheet window
+        
+        """
+        wList = QtGui.QApplication.topLevelWidgets()
+        for w in wList:
+            if isinstance(w, SpreadsheetWindow):
+                return w
+        global spreadsheetWindow
+        spreadsheetWindow = SpreadsheetWindow()
+        if show:
+            spreadsheetWindow.configShow()
+        return spreadsheetWindow
+        
+    def postEventToSpreadsheet(self, event):
+        """ postEventToSpreadsheet(event: QEvent) -> None
+        Post an event to the spreadsheet to make thread-safe connection
+        """
+        spreadsheetWindow = self.findSpreadsheetWindow()
+        if spreadsheetWindow:
+            QtCore.QCoreApplication.postEvent(spreadsheetWindow, QtGui.QShowEvent())
+            QtCore.QCoreApplication.postEvent(spreadsheetWindow, event)
+
+    def getBuilderWindow(self):
+        """ getBuilderWindow() -> QWidget        
+        Return the builder window of the application, or None if
+        couldn't fine one
+        
+        """
+        spreadsheetWindow = self.findSpreadsheetWindow()
+        if hasattr(spreadsheetWindow.visApp, 'builderWindow'):
+            return spreadsheetWindow.visApp.builderWindow
+        else:
+            return None
+
+    def setEchoMode(self, echo):
+        """ setEchoMode(echo: bool)
+        Instruct the spreadsheet to dispatch (echo) all cell widgets
+        instead of managing them on the spreadsheet
+
+        """
+        spreadsheetWindow = self.findSpreadsheetWindow(show=False)
+        if spreadsheetWindow:
+            spreadsheetWindow.setEchoMode(echo)
+
+    def echoMode(self):
+        """ echoMode() -> bool
+        Return true if the spreadsheet is in echo mode
+
+        """
+        spreadsheetWindow = self.findSpreadsheetWindow(show=False)
+        if spreadsheetWindow:
+            return spreadsheetWindow.echoMode
+        return None
+
+    def getEchoCellEvents(self):
+        """ getEchoCellEvents() -> [DisplayCellEvent]
+        Echo back the list of all cell events that have been captured
+        earlier
+        
+        """
+        spreadsheetWindow = self.findSpreadsheetWindow(show=False)
+        if spreadsheetWindow:
+            events = spreadsheetWindow.getEchoCellEvents()
+            spreadsheetWindow.clearEchoCellEvents()
+            return events
+        return None
+
+spreadsheetController = SpreadsheetController()
+registeredWidgets = {}
diff --git a/vistrails/packages/spreadsheet/spreadsheet_event.py b/vistrails/packages/spreadsheet/spreadsheet_event.py
new file mode 100644
index 0000000..a86f697
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_event.py
@@ -0,0 +1,97 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains all Spreadsheet special Qt event classes
+################################################################################
+from PyQt4 import QtCore, QtGui
+
+################################################################################
+
+# A list of newly added events starting from QtCore.QEvent.User
+DisplayCellEventType = QtCore.QEvent.Type(QtCore.QEvent.User)
+BatchDisplayCellEventType = QtCore.QEvent.Type(QtCore.QEvent.User+1)
+RepaintCurrentSheetEventType = QtCore.QEvent.Type(QtCore.QEvent.User+2)
+
+class DisplayCellEvent(QtCore.QEvent):
+    """
+    DisplayCellEvent is an event to notify the spreadsheet that we want to
+    display input data on a specific type of widget. This is more of a data
+    container class
+    
+    """
+    def __init__(self):
+        """ DisplayCellEvent() -> DisplayCellEvent
+        Instantiate a display event with no location, cell type, input data nor
+        an associated vistrail
+        
+        """
+        QtCore.QEvent.__init__(self, DisplayCellEventType)
+        self.sheetReference = None
+        self.row = -1
+        self.col = -1
+        self.rowSpan = -1
+        self.colSpan = -1
+        self.cellType = None
+        self.inputPorts = None
+        self.vistrail = None
+
+class BatchDisplayCellEvent(QtCore.QEvent):
+    """
+    BatchDisplayCellEvent is similar to DisplayCellEvent but it is holding a
+    serie of DisplayCellEvent. This is very helpful since DisplayCellEvent
+    requires a thread-safe procedure, thus, very slow/un-safe when displaying
+    more than one cell with multiple events.
+    
+    """    
+    def __init__(self):
+        """ BatchDisplayCellEvent()
+        Instantiate an empty BatchDisplayCellEvent
+        """
+        QtCore.QEvent.__init__(self, BatchDisplayCellEventType)
+        self.displayEvents = []
+        self.vistrail = None
+
+class RepaintCurrentSheetEvent(QtCore.QEvent):
+    """
+    RepaintCurrentSheetEvent signal the spreadsheet to call repaint
+    for all cells in the current sheet
+    
+    """    
+    def __init__(self):
+        """ RepaintCurrentSheetEvent() -> RepaintCurrentSheetEvent
+        Initialize the event type
+        
+        """
+        QtCore.QEvent.__init__(self, RepaintCurrentSheetEventType)
diff --git a/vistrails/packages/spreadsheet/spreadsheet_execute.py b/vistrails/packages/spreadsheet/spreadsheet_execute.py
new file mode 100644
index 0000000..89b566e
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_execute.py
@@ -0,0 +1,207 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains useful functions for executing pipelines on the spreadsheet
+# assignPipelineCellLocations
+# executePipelineWithProgress
+################################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.vistrail.controller import VistrailController
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.inspector import PipelineInspector
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.core.utils import DummyView
+from vistrails.core.vistrail.action import Action
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.port import Port
+from vistrails.core.vistrail import module
+from vistrails.core.vistrail import connection
+import vistrails.db.services.action
+import copy
+
+from identifiers import identifier as spreadsheet_pkg
+
+# FIXME broke this as Actions have been changed around
+#
+# from core.vistrail.action import AddModuleAction, AddConnectionAction, \
+#      DeleteConnectionAction, ChangeParameterAction
+
+################################################################################
+
+def assignPipelineCellLocations(pipeline, sheetName, 
+                                row, col, cellIds=None,
+                                minRowCount=None, minColCount=None):
+
+    reg = get_module_registry()
+    spreadsheet_cell_desc = \
+        reg.get_descriptor_by_name(spreadsheet_pkg, 'SpreadsheetCell')
+
+    create_module = VistrailController.create_module_static
+    create_function = VistrailController.create_function_static
+    create_connection = VistrailController.create_connection_static
+
+    pipeline = copy.copy(pipeline)
+    root_pipeline = pipeline
+    if cellIds is None:
+        inspector = PipelineInspector()
+        inspector.inspect_spreadsheet_cells(pipeline)
+        inspector.inspect_ambiguous_modules(pipeline)
+        cellIds = inspector.spreadsheet_cells
+
+    for id_list in cellIds:
+        # find at which depth we need to be working
+        try:                
+            id_iter = iter(id_list)
+            m = pipeline.modules[id_iter.next()]
+            for mId in id_iter:
+                pipeline = m.pipeline
+                m = pipeline.modules[mId]
+        except TypeError:
+            mId = id_list
+
+        m = pipeline.modules[mId]
+        if not reg.is_descriptor_subclass(m.module_descriptor, 
+                                          spreadsheet_cell_desc):
+            continue
+
+        # Walk through all connections and remove all CellLocation
+        # modules connected to this spreadsheet cell
+        conns_to_delete = []
+        for (cId,c) in pipeline.connections.iteritems():
+            if (c.destinationId==mId and 
+                pipeline.modules[c.sourceId].name=="CellLocation"):
+                conns_to_delete.append(c.id)
+        for c_id in conns_to_delete:
+            pipeline.delete_connection(c_id)
+
+        # a hack to first get the id_scope to the local pipeline scope
+        # then make them negative by hacking the getNewId method
+        # all of this is reset at the end of this block
+        id_scope = pipeline.tmp_id
+        orig_getNewId = pipeline.tmp_id.__class__.getNewId
+        def getNewId(self, objType):
+            return -orig_getNewId(self, objType)
+        pipeline.tmp_id.__class__.getNewId = getNewId
+
+        # Add a sheet reference with a specific name
+        sheetReference = create_module(id_scope, spreadsheet_pkg,
+                                       "SheetReference")
+        sheetNameFunction = create_function(id_scope, sheetReference, 
+                                            "SheetName", [str(sheetName)])
+            # ["%s %d" % (sheetPrefix, sheet)])
+
+        sheetReference.add_function(sheetNameFunction)
+
+        if minRowCount is not None:
+            minRowFunction = create_function(id_scope, sheetReference, 
+                                             "MinRowCount", [str(minRowCount)])
+                                                   # [str(rowCount*vRCount)])
+            sheetReference.add_function(minRowFunction)
+        if minColCount is not None:
+            minColFunction = create_function(id_scope, sheetReference, 
+                                             "MinColumnCount", 
+                                             [str(minColCount)])
+                                                   # [str(colCount*vCCount)])
+            sheetReference.add_function(minColFunction)
+
+        # Add a cell location module with a specific row and column
+        cellLocation = create_module(id_scope, spreadsheet_pkg,
+                                     "CellLocation")
+        rowFunction = create_function(id_scope, cellLocation, "Row", [str(row)])
+                                                 # [str(row*vRCount+vRow+1)])
+        colFunction = create_function(id_scope, cellLocation, "Column", 
+                                      [str(col)])
+                                                 # [str(col*vCCount+vCol+1)])
+
+        cellLocation.add_function(rowFunction)
+        cellLocation.add_function(colFunction)
+
+        # Then connect the SheetReference to the CellLocation
+        sheet_conn = create_connection(id_scope, sheetReference, "self",
+                                       cellLocation, "SheetReference")
+
+        # Then connect the CellLocation to the spreadsheet cell
+        cell_module = pipeline.get_module_by_id(mId)
+        cell_conn = create_connection(id_scope, cellLocation, "self",
+                                      cell_module, "Location")
+
+        pipeline.add_module(sheetReference)
+        pipeline.add_module(cellLocation)
+        pipeline.add_connection(sheet_conn)
+        pipeline.add_connection(cell_conn)
+        # replace the getNewId method
+        pipeline.tmp_id.__class__.getNewId = orig_getNewId
+
+    return root_pipeline
+
+def executePipelineWithProgress(pipeline,
+                                pTitle='Pipeline Execution',
+                                pCaption='Executing...',
+                                pCancel='&Cancel',
+                                **kwargs):
+    """ executePipelineWithProgress(pipeline: Pipeline,                                    
+                                    pTitle: str, pCaption: str, pCancel: str,
+                                    kwargs: keyword arguments) -> bool
+    Execute the pipeline while showing a progress dialog with title
+    pTitle, caption pCaption and the cancel button text
+    pCancel. kwargs is the keyword arguments that will be passed to
+    the interpreter. A bool will be returned indicating if the
+    execution was performed without cancel or not.
+    
+    """
+    withoutCancel = True
+    totalProgress = len(pipeline.modules)
+    progress = QtGui.QProgressDialog(pCaption,
+                                     pCancel,
+                                     0, totalProgress)
+    progress.setWindowTitle(pTitle)
+    progress.setWindowModality(QtCore.Qt.WindowModal)
+    progress.show()
+    def moduleExecuted(objId):
+        if not progress.wasCanceled():
+            progress.setValue(progress.value()+1)
+            QtCore.QCoreApplication.processEvents()
+        else:
+            withoutCancel = False
+    interpreter = get_default_interpreter()
+    if kwargs.has_key('module_executed_hook'):
+        kwargs['module_executed_hook'].append(moduleExecuted)
+    else:
+        kwargs['module_executed_hook'] = [moduleExecuted]
+    kwargs['view'] = DummyView()
+    interpreter.execute(pipeline, **kwargs)
+    progress.setValue(totalProgress)
+    return withoutCancel
diff --git a/vistrails/packages/spreadsheet/spreadsheet_helpers.py b/vistrails/packages/spreadsheet/spreadsheet_helpers.py
new file mode 100644
index 0000000..4521fef
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_helpers.py
@@ -0,0 +1,294 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains classes working with cell helper widgets, i.e. toolbar,
+# resizer, etc.:
+#   CellHelpers
+#   CellResizer
+#   CellResizerConfig
+################################################################################
+from PyQt4 import QtCore, QtGui
+
+################################################################################
+
+class CellResizerConfig(object):
+    """
+    CellResizerConfig can be used to config different parameters of
+    the CellResizer widget such as shape, mask, pixmap, color, size,
+    and cursor. By default, it has a black, triangular shape of size
+    25x25. In order to change the shape, we have to override this
+    class
+
+    """
+    def __init__(self, size=25, color=QtGui.QColor(0,0,0)):
+        """ CellResizerConfig(size: int, color: QColor) -> CellResizerConfig
+        Create mask and pixmap of a triangular shape with the specifc size
+        and color
+        
+        """
+        self.size = size
+        self.transparentColor = QtGui.QColor(QtCore.Qt.blue)
+        self.image = QtGui.QImage(size,size,QtGui.QImage.Format_RGB32)
+        for i in xrange(size):
+            for j in xrange(size):
+                if i+j<size-1:
+                    self.image.setPixel(i, j, self.transparentColor.rgb())
+                else:
+                    if i+j==size-1 or i==size-1 or j==size-1:
+                        self.image.setPixel(i, j,
+                                            QtGui.QColor(QtCore.Qt.white).rgb())
+                    else:
+                        self.image.setPixel(i, j, color.rgb())
+        self.pixmapVar = self.maskVar = self.cursorVar = None
+
+    def pixmap(self):
+        """ pixmap() -> QPixmap
+        Return the pixmap of the resizer shape
+        
+        """
+        if not self.pixmapVar:
+            self.pixmapVar = QtGui.QPixmap.fromImage(self.image)
+        return self.pixmapVar
+
+    def mask(self):
+        """ mask() -> QRegion
+        Return only the region of the resizer that will be shown on screen
+        
+        """
+        if not self.maskVar:
+            mask = self.pixmap().createMaskFromColor(self.transparentColor)
+            self.maskVar = QtGui.QRegion(mask)
+        return self.maskVar
+
+    def cursor(self):
+        """ cursor() -> QCursor
+        Return the cursor that will be shown inside the resizer
+        
+        """
+        return QtGui.QCursor(QtCore.Qt.SizeFDiagCursor)
+
+class CellResizer(QtGui.QLabel):
+    """
+    CellResizer is a customized shape SizeGrip that stays on top of
+    the widget, moving this size grip will end up resizing the
+    corresponding cell in the table. This is different from QSizeGrip
+    because it allows overlapping on top of the widget
+
+    """
+    def __init__(self, sheet, config=CellResizerConfig(), parent=None):
+        """ CellResizer(sheet: SpreadsheetSheet,
+                        config: subclass of CellResizerConfig,
+                        parent: QWidget) -> CellResizer
+        Initialize the size grip with the default triangular shape
+        
+        """
+        QtGui.QLabel.__init__(self,sheet)
+        self.setFixedSize(config.size, config.size)
+        self.setPixmap(config.pixmap())
+        self.setMask(config.mask())
+        self.setCursor(config.cursor())
+        self.setStatusTip("Left/Right-click drag to resize the underlying"
+                          "cell or the whole spreadsheet ")
+        self.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.sheet = sheet
+        self.config = config
+        self.resizeAll = False
+        self.dragging = False
+        self.lastPos = None
+        self.row = -1
+        self.col = -1
+        self.hide()
+
+    def setDragging(self,b):        
+        """ setDragging(b: boolean) -> None
+        Set the resizer state to busy dragging
+        
+        """
+        self.dragging = b
+
+    def snapTo(self,row,col):
+        """ snapTo(row, col) -> None
+        Assign which row and column the resizer should be controlling
+        
+        """
+        self.row = row
+        self.col = col
+
+    def adjustPosition(self, rect):
+        """ adjustPosition(rect: QRect) -> None
+        Adjust resizer position to be on the bottom-right corner of the cell
+        
+        """
+        p = self.parent().mapFromGlobal(rect.topLeft())
+        self.move(p.x()+rect.width()-self.width(),
+                  p.y()+rect.height()-self.height())
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None        
+        Handle Qt mouse press event to track if we need to resize
+        either left or right mouse button is clicked
+        
+        """
+        if self.col>=0:
+            if e.button()==QtCore.Qt.LeftButton:
+                self.resizeAll = False
+                self.dragging = True
+            if e.button()==QtCore.Qt.RightButton and not self.sheet.fitToWindow:
+                self.resizeAll = True
+                self.dragging = True
+            self.lastPos = (e.globalX()-self.sheet.columnWidth(self.col),
+                            e.globalY()-self.sheet.rowHeight(self.row))
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QMouseEvent) -> None
+        Handle Qt mouse release event to clean up all state
+        
+        """
+        if (e.button()==QtCore.Qt.LeftButton or
+            e.button()==QtCore.Qt.RightButton):
+            self.dragging = False
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None        
+        Interactively resize the corresponding column and row when the
+        mouse moves
+        
+        """
+        if self.dragging:
+            hSize = self.sheet.columnWidth(self.col)
+            vSize = self.sheet.rowHeight(self.row)
+            hd = e.globalX() - self.lastPos[0] - hSize
+            vd = e.globalY() - self.lastPos[1] - vSize
+            
+            # All sections should have the same size (Right-Click)
+            if self.resizeAll:
+                # Resize the columns first
+                dS = int(hd / (self.col+1))
+                mS = hd % (self.col+1)
+                for i in xrange(self.sheet.columnCount()):                    
+                    if i>self.col:
+                        newValue = hSize+dS
+                    else:
+                        newValue = self.sheet.columnWidth(i)+dS+(i<mS)
+                    self.sheet.setColumnWidth(i, newValue)
+                # Then resize the rows
+                dS = int(vd / (self.row+1))
+                mS = vd % (self.row+1)
+                for i in xrange(self.sheet.rowCount()):                    
+                    if i>self.row:
+                        newValue = vSize+dS
+                    else:
+                        newValue = self.sheet.rowHeight(i)+dS+(i<mS)
+                    self.sheet.setRowHeight(i, newValue)
+
+            # Only resize the corresponding column and row (Left-Click)
+            else:
+                self.sheet.setColumnWidth(self.col, hSize+hd)
+                self.sheet.setRowHeight(self.row, vSize+vd)
+            rect = self.sheet.getCellRect(self.row, self.col)
+            rect.moveTo(self.sheet.viewport().mapToGlobal(rect.topLeft()))
+            self.adjustPosition(rect)
+
+class CellHelpers(object):
+    """
+    CellHelpers is a container include CellResizer that will shows up
+    whenever the Ctrl key is hold down and the mouse hovers the cell.
+
+    """
+    def __init__(self, sheet, resizerInstance=None):
+        """ CellHelpers(sheet: SpreadsheetSheet,
+                        resizerInstance: CellResizer) -> CellHelpers
+        Initialize with  a cell resizer
+        
+        """
+        self.sheet = sheet
+        self.resizer = resizerInstance
+        self.row = -1
+        self.col = -1
+        
+    def snapTo(self, row, col):
+        """ snapTo(row: int, col: int) -> None
+        Assign the resizer to the correct cell
+        
+        """
+        if row>=0 and ((row!=self.row) or (col!=self.col)):
+            self.hide()
+            self.row = row
+            self.col = col
+            if self.resizer:
+                self.resizer.snapTo(row,col)
+            self.adjustPosition()
+
+    def adjustPosition(self):
+        """ adjustPosition() -> None
+        Adjust the resizer
+        
+        """
+        rect = self.sheet.getCellGlobalRect(self.row, self.col)
+        if self.resizer:
+            self.resizer.adjustPosition(rect)
+
+    def show(self):
+        """ show() -> None
+        An helper function derived from setVisible
+        
+        """
+        self.setVisible(True)
+
+    def hide(self):
+        """ hide() -> None
+        An helper function derived from setVisible
+        
+        """
+        self.setVisible(False)
+
+    def setVisible(self,b):
+        """ setVisible(b: boolean) -> None
+        Show/hide the cell helpers
+        """
+        if self.resizer:
+            self.resizer.setVisible(b)
+        if not b and self.resizer:
+            self.resizer.setDragging(False)
+
+    def isInteracting(self):
+        """ isInteracting() -> boolean
+        Check to see if the helper is in action with the resizer
+        
+        """
+        if self.resizer:
+            return self.resizer.dragging
+        else:
+            return False
diff --git a/vistrails/packages/spreadsheet/spreadsheet_rc.py b/vistrails/packages/spreadsheet/spreadsheet_rc.py
new file mode 100644
index 0000000..ca1f8d4
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_rc.py
@@ -0,0 +1,1872 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Resource object code
+#
+# Created: Fri Oct 6 13:32:35 2006
+#      by: The Resource Compiler for PyQt (Qt v4.1.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x07\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x07\x09\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x2c\x20\x82\x91\x31\x39\x8d\x87\x8b\xa9\x8e\x83\x9d\x89\xfb\xdf\
+\xff\xff\x7f\x41\x62\xe0\x80\x61\x04\x31\xc0\x88\x01\x26\x86\x1c\
+\x5e\xff\x19\xd0\xe4\x61\xfa\x90\xe5\x31\xf4\x31\x32\xfe\xfd\xf3\
+\x8f\xe1\xcf\xcf\xbf\x93\xfe\xff\x9f\xd7\x08\x10\x40\x8c\xa0\x28\
+\xe0\xe3\x4d\x7b\xda\xd8\x13\x2f\xc5\x2b\x2f\xc5\xf0\xf5\xdb\x7f\
+\x86\xbf\xff\x18\x18\x80\x6a\x18\xfe\x02\x75\xfd\x05\x3a\xe7\x0f\
+\x88\xfe\x07\xc5\x50\xf6\x1f\xa8\x1c\xb2\x5a\x10\xfd\x0f\x99\x0f\
+\x94\x07\x32\xc1\x34\x48\x3d\x48\x8e\x81\x85\x91\xe1\xc3\xd3\xd7\
+\x0c\x17\xe6\xce\x7b\xf5\xeb\xeb\x0c\x71\x80\x00\x02\x87\x00\x37\
+\x17\x2b\x97\x84\x8e\x32\xc3\x0f\x71\x09\x06\xf6\x6f\x10\x43\x59\
+\x90\x0c\x62\xf9\x8b\x30\x1c\xe6\x00\x98\xe5\x7f\x91\x2c\xff\x8b\
+\x84\x41\x6a\x7f\x83\xe8\xff\xa8\x6a\xff\x03\x6d\xfc\xcd\x21\xc8\
+\xc0\xc4\xce\xc1\x0a\xb2\x1b\x20\x80\xc0\x0e\xf8\xf7\x8f\xe9\xef\
+\x97\x2f\x7f\x18\x1e\x03\xd9\x1f\x3f\x41\xc2\x0e\x64\xe0\x7f\x24\
+\x5f\xfc\x85\x19\x06\x35\x1c\xce\xfe\x8f\x60\x23\xab\xf9\x0f\x75\
+\xd8\x3f\xa8\xcf\x61\xf2\xcc\x1c\x40\xc3\x7e\xfc\x06\x9a\xcd\x04\
+\x32\x96\x01\x20\x80\x20\x69\x80\x89\x89\xe1\xd7\x1f\x46\x86\x95\
+\x6b\x1e\x30\x7c\xff\xf8\x9d\x81\x01\x98\x34\xff\x33\x32\xa1\x44\
+\xe4\x7f\x70\x64\xa3\xe6\x98\xff\xc8\x11\x8d\xcc\x64\x64\x84\x60\
+\x64\xb5\x40\x57\x80\x4c\xfc\xc7\xc2\xc6\x20\x2d\xcb\x07\xb6\x13\
+\x04\x00\x02\x88\x05\xa2\x81\x99\xe1\xc3\xd7\xbf\x0c\xce\x52\x1f\
+\x18\x0a\x73\x64\x19\xfe\xb3\xb2\x32\x30\x02\x31\xc8\xf9\x20\x85\
+\x40\x69\x86\xbf\x5f\xbf\x31\xfc\xfb\xf3\x0f\x6a\x01\xfe\x94\xcd\
+\xc8\xc4\xc8\xc0\xc4\xc5\x09\xd4\xcf\x08\xf6\x3e\x23\x23\xd0\xf9\
+\x40\xc7\x33\xff\xf9\xc5\xb0\x70\xcf\x4b\x86\x25\xd7\x7f\x03\xc5\
+\x98\xc1\x6a\x01\x02\x88\x05\xe2\x72\x26\x86\xdf\xc0\x54\x22\x2c\
+\xc2\xc3\xa0\xaa\x2c\xcc\xf0\xe9\xd0\x7e\x86\x87\xf3\x67\x03\x13\
+\x07\x0b\xc3\xef\xff\x5f\x18\xde\xdd\x7e\xcb\x60\x58\xd7\xc4\x20\
+\x6c\x63\x4f\x54\xd6\xfa\x73\xe5\x22\xc3\xf3\xec\x12\x06\x66\x29\
+\x76\x86\x3f\xec\xfc\x0c\xdf\x3f\xfd\x61\xe0\xf7\x0b\x62\x90\x08\
+\x0b\x67\x90\x14\xff\x09\x94\x07\x15\x00\x90\x10\x00\x08\x20\x30\
+\x09\x0a\x6e\x48\xaa\x86\xf8\xf0\xc9\x9a\xcd\x0c\x22\x3a\xcf\x18\
+\xb4\xe2\x2e\x31\xfc\x7f\xb3\x9e\x81\x4b\x51\x8b\x81\xdf\xc8\x0c\
+\xa7\x85\x20\xdf\x81\xf0\x3f\xa0\x6f\xc1\x66\x68\xe9\x31\xfc\x33\
+\xb6\x63\xf8\x7a\x77\x2b\x83\x8c\xf3\x11\x06\x71\xaf\xcf\x0c\xf7\
+\xd7\xaf\x83\x38\x0e\x28\x0f\x4a\x1b\x30\x07\x00\x04\x10\x94\x64\
+\x06\x26\x10\x46\x78\x14\x73\x70\xb0\x30\x70\xb3\x5f\x67\x78\x3c\
+\xf3\x22\x03\xbb\x42\x15\x83\xe5\xb4\xe9\x0c\x2c\xa0\x20\xc5\xb0\
+\x18\x66\x39\x03\xd4\x01\x10\x47\x80\xe2\x5b\xba\xa5\x96\xe1\xbf\
+\x43\x07\xc3\x9d\xc5\x8f\x18\x38\x04\xaf\x33\x30\xf1\x20\x0a\x03\
+\x50\xc2\xfc\xcf\x04\x89\x02\x80\x00\x82\x86\x00\x23\x38\x04\x60\
+\x80\x8d\xe9\x17\xc3\xd3\x39\xaf\x18\x7e\x0b\x94\x31\xe8\x74\xb6\
+\x32\x40\xa3\x0b\x9b\xdf\xe1\x34\xb2\x63\xfe\x01\x7d\xf9\xe7\xd7\
+\x1f\x06\x85\x86\x72\x86\x9f\x26\x7d\x0c\xe7\xfa\x1f\x32\xfc\xfc\
+\xfd\x11\xae\xeb\xdf\x7f\x44\x22\x05\x08\x20\x88\x03\x80\xc1\xf1\
+\xf7\x3f\x22\x65\xfd\x7b\xfd\x8d\x81\x4d\x27\x91\x41\xa5\xab\x1d\
+\x47\x90\x63\xf3\x39\xb2\x23\xfe\x01\x13\xec\x5f\x86\xdf\xdf\x7f\
+\x31\xa8\xd6\x14\x32\x30\xe9\x57\x33\xbc\xbd\xf7\x83\x01\x92\xa1\
+\xa1\xd9\x94\x09\x62\x1f\x40\x00\x41\x72\x01\xd0\x01\xa0\x04\xce\
+\x0e\xb5\x40\x34\x2f\x9b\x81\x5d\x55\x15\xe8\x73\x26\x22\x7d\x8e\
+\x48\x07\x10\x07\x41\x1d\x06\x2c\x81\xfe\x7d\xf9\xcf\xa0\x51\x5f\
+\xc3\x20\x7c\xf2\x24\xc3\xdf\x9f\xdf\xc1\x7a\x40\x51\xc0\xc0\x0c\
+\xb1\x1a\x20\x80\x20\xb9\x00\xe8\x9a\xbf\xff\x10\xd9\x9c\x53\x5f\
+\x1f\xa7\xcf\x61\x96\x82\x0d\xfa\x07\xb1\x10\x26\x07\xe3\x83\xd3\
+\x01\xd4\x21\xff\xfe\xfd\x06\x3b\x57\xc8\xcc\x1c\x18\xec\x7f\x80\
+\xe9\xe3\x3f\x24\x1c\xa0\x51\x00\x10\x40\xd0\x72\x80\x05\x98\x06\
+\x18\x19\x08\x57\xcc\x98\x3e\x87\x94\xa4\xff\x51\x72\x02\xb2\xe3\
+\x60\x62\x7f\x7e\xfe\x62\xf8\xcb\xcc\x06\x8f\x02\x06\x68\x41\x07\
+\x10\x40\x2c\x88\x34\x40\xc0\xea\xff\xc8\xf1\xcf\x00\xf5\x39\xb0\
+\xe2\xfa\xfb\x1f\xea\xa0\x7f\x70\xb9\x7f\xff\x10\x34\xc8\x72\x48\
+\x1a\x81\x46\x13\xd8\x0c\x46\xb0\x9d\x20\x00\x10\x40\x70\x07\xfc\
+\xf9\xc7\x88\x5a\xae\xa2\xe5\x73\x44\x7e\x87\xf8\x18\xe6\x4b\x84\
+\x6f\x19\xa0\x41\x0f\x0b\x11\x48\x99\x00\x4b\xa4\x7f\xff\xfd\x05\
+\xf2\x99\xc1\x2e\x83\x94\x03\x90\xac\x05\x10\x40\x28\x89\xf0\x3f\
+\x23\xf1\x3e\x47\xc4\x37\x96\xc4\x07\x4d\x03\xb0\x2c\x09\xf2\xdb\
+\x7f\x76\x0e\x60\xfc\xff\x05\x7b\x11\x1c\x4b\xd0\x5c\x00\x10\x40\
+\xf0\x92\xf0\x2f\x52\x1a\x78\x75\xea\x14\xc3\xcf\xf7\x1f\x50\x4a\
+\x39\x64\xcb\x90\x69\x58\xe1\x83\x15\x83\x72\x01\x33\xb0\x90\x03\
+\x16\x32\x3f\x0f\x1d\x04\x3b\x06\x58\xbb\x80\xcb\x01\x58\x65\x07\
+\x10\x40\x90\x10\x00\x66\xb7\xbf\xa0\xe0\x84\xe6\xba\xeb\x33\x67\
+\x31\xfc\xfd\xf4\x83\xc1\x61\xc5\x22\x70\x56\x04\xfb\x02\x2d\xe5\
+\xa3\x3a\x04\x3d\x17\xfc\x07\x97\x86\xff\x40\x29\x9d\x8b\x87\xe1\
+\x03\xb0\x40\xfa\x73\xe6\x28\xc3\x7f\xd7\x9d\x0c\x8c\xff\x21\x0d\
+\x1e\x26\x68\x14\x00\x04\x10\xbc\x20\x02\xe5\x02\x58\x10\xf0\x08\
+\xf1\x30\xb0\xbe\x5d\xca\x70\xad\xa2\x94\xe1\xdf\x6f\xa0\x20\xd0\
+\x17\xff\xff\x22\xfb\x18\x92\xf8\x20\x09\x0f\xbb\xef\x41\x59\xfb\
+\x3f\x1b\x17\xc3\x8b\xc6\x16\x06\xce\x6b\x7d\x0c\xac\xf2\x9c\x0c\
+\x7f\x7e\x43\x42\x19\x52\x14\x43\x7c\x0b\x10\x40\xd0\x28\x60\x66\
+\x80\xd6\x43\x90\x00\x01\x36\x5b\xb4\x32\xe5\x18\xf8\xbe\xf6\x31\
+\xdc\x29\x2f\x63\xf8\x0f\x4a\x20\x2c\xcc\x60\x5f\x21\x27\x3e\xd4\
+\x78\x87\xf2\x21\xde\x03\x16\x26\xbc\x0c\x8f\xdb\x9b\x19\x78\x1f\
+\x36\x30\x28\xe6\xc9\x32\xfc\x62\xe3\x63\xf8\xfb\xfb\x37\x03\x34\
+\x09\xc1\x2b\x23\x80\x00\x62\x42\x49\x84\xd0\x20\x60\xfc\xf9\x8f\
+\xe1\xeb\x6d\x59\x06\x29\x77\x55\x06\xe6\xcb\x3d\x0c\xf7\x92\x52\
+\x81\x51\xf2\x89\xe1\x3f\x28\x3e\xff\x22\x52\xf8\xdf\xbf\x58\xe2\
+\x1f\x68\xc6\x6f\x60\x31\x7c\xb5\xa2\x92\xe1\xff\xb5\x56\x06\xb9\
+\x54\x25\x86\x4f\x5f\x34\x19\xbe\x7f\x01\x95\x80\xff\xe0\x2d\x54\
+\x58\x08\x00\x04\x10\x0b\x72\x22\x64\x84\x96\x4e\xf2\x91\xc1\x0c\
+\x6f\xd6\xfc\x65\x78\x7e\x0a\xd8\x24\x30\xb1\x63\xf8\x75\xef\x23\
+\xc3\x9f\xab\x97\x19\x38\x6c\x6c\x18\x98\xfe\xfe\x01\xd7\x9c\x8c\
+\xe0\x76\x09\x24\xa5\x33\xc2\xca\x28\x60\xc3\x83\x89\x8d\x8d\xe1\
+\xcb\xe5\xcb\x0c\xbf\x9e\xdf\x63\x60\x57\x8c\x64\x38\xbf\x8d\x9b\
+\xe1\xff\xe7\x7f\x0c\xec\x9e\x36\xc0\xd2\x97\x91\x01\x5c\xba\x83\
+\xb2\x05\x34\x11\x02\x04\x10\x3c\x1b\x82\x1c\xf0\xfd\xeb\x4f\x86\
+\x2f\x9f\xbf\x33\x30\xea\x9b\x31\x88\x18\x58\x42\xea\x0e\x60\x5c\
+\x72\x31\xfd\x67\xf8\xf3\xe3\x3b\xc3\xa7\x37\x90\x06\xe3\x7f\x68\
+\x68\xfd\x87\x27\x48\x68\xfe\x07\xb1\x81\xe5\x3d\xa7\x92\x0a\x83\
+\xde\x8c\x79\xc0\xd4\x0f\x2c\xe2\xff\xfc\x01\xab\xfd\x0b\x6a\x92\
+\xfd\xf9\xcd\xf0\x0b\x58\x22\x32\xfc\xe7\x82\x87\x00\x40\x00\xc1\
+\xea\x02\x26\x5e\x5e\x76\x86\xf3\xf7\xd8\x19\x22\x7a\xef\x43\x6a\
+\xc6\xff\x0c\xf0\xd2\xf1\x1f\xbc\x0e\x80\xb4\x19\xfe\x31\x40\xe4\
+\xc1\x16\x82\xc2\x01\x5e\x33\x32\x42\x1c\xc6\x80\x68\x5b\xfc\x83\
+\x95\x1f\x40\x06\x33\x33\x23\xc3\x8b\xcf\xc0\x34\xc6\xc7\xc9\xf0\
+\x17\x1a\xdc\x00\x01\x04\x76\xc0\xef\x7f\x8c\x7f\xde\xbd\x79\xcb\
+\xc0\x2d\x2f\xc1\xf0\xee\xcb\x5f\xb0\x26\x58\xab\x18\xde\x0a\x66\
+\x80\x36\xaf\x91\x5a\xc3\x30\xfe\x3f\x06\xa4\x96\xf1\x7f\x44\xf3\
+\x1d\xdd\x8c\xff\xe0\x7e\x01\x13\x03\xd3\x8f\xf7\xf0\x04\x0f\x10\
+\x40\x60\x07\xfc\xfa\xc7\x30\xf1\xd8\xc6\x83\xf9\xc0\xbc\xc9\x02\
+\x0a\x4f\x44\xeb\x16\xb9\x55\x8c\xa5\xf5\x8b\xce\xff\x8f\x5f\x1e\
+\x6a\x1c\x23\x30\x31\x02\x4b\xa3\x3f\x0b\x41\x62\x00\x01\xc4\x38\
+\xd0\x9d\x53\x80\x00\x1a\xf0\xce\x29\x40\x00\x0d\xb8\x03\x00\x02\
+\x0c\x00\x1c\x03\xc6\x0d\x8c\xe5\xc0\x85\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0d\x82\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x35\x20\x4e\x6f\x76\x20\
+\x32\x30\x30\x32\x20\x31\x30\x3a\x30\x38\x3a\x32\x39\x20\x2b\x30\
+\x31\x30\x30\xf5\xa2\x62\xc6\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x18\x18\xbd\xfd\x88\xff\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0b\x11\x00\x00\x0b\x11\x01\x7f\x64\x5f\x91\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x0c\xda\x49\x44\x41\x54\x78\xda\xd5\x5a\x69\x6c\x5c\xd5\x15\
+\xfe\xde\x9b\xdd\xe3\x7d\x8d\xb3\x38\x90\xc5\x29\x4e\x02\x4d\xa0\
+\xd0\x00\x05\x04\x2d\xfc\x40\x94\xaa\x25\x2d\x95\xe8\x46\x53\xa9\
+\xfc\xa0\xb4\x55\x0b\x85\x0a\x9a\xa2\x2a\x85\x2e\x29\xa8\x3f\x5a\
+\xd1\x4a\x08\x81\x50\x25\x04\x82\xb2\x85\xa0\xb8\x35\x64\x21\xc1\
+\x4d\xc8\xea\x38\x4e\x1c\xaf\xe3\x99\xf1\xec\xcb\x9b\xe5\x6d\x3d\
+\xe7\x2d\x9e\xb1\x93\x99\x38\x21\x15\xe5\x2a\x37\x6f\xe6\xbe\xed\
+\x2c\xdf\xf9\xce\x39\x77\x0c\x7c\xca\x87\xf0\x09\x3c\x53\xff\x3f\
+\x53\x40\x17\xf0\xe8\x91\x95\x90\xf4\x1b\xa0\x69\x57\x42\x10\x97\
+\xd1\x52\x27\xad\xd7\xf3\x29\xe8\x6a\x0a\x8a\x1c\x84\x9c\x3b\x0d\
+\xb5\x70\x08\xf1\xc0\x4e\xbc\xf2\x9d\x41\xba\xb1\x48\x53\xfb\xe4\
+\x14\x78\x7c\xac\x13\x52\x6c\x13\xb4\xcc\xd7\xa1\xb8\x7a\x1c\x35\
+\x75\x62\x63\x9d\x1b\x35\x35\x1e\xb8\x5d\x02\x9c\x22\xc9\xae\x6b\
+\xd0\x14\x15\xb9\xbc\x0c\x29\x93\x43\x36\x5d\x40\x31\x95\xa7\x45\
+\xe1\x28\xa4\xc4\xab\x18\xdd\xf9\x02\x76\x3d\x39\x6a\x29\x73\x41\
+\x9e\x39\x7f\x05\x36\x9f\xe8\x40\x4e\x7e\x14\xb2\x74\xaf\x58\xdf\
+\xe8\x5b\xd2\xd9\x84\x85\x8d\x6e\xd4\x39\xc9\x9c\xba\x0a\x4d\xa5\
+\xa9\xeb\xa6\xf0\x9a\x06\x9d\xa6\xa6\x6a\xe6\x39\x4d\xa7\x5b\x35\
+\x44\x63\x39\x84\x43\x69\x28\x09\x29\x8b\x7c\xfc\x45\x0c\xbc\xb3\
+\x15\x87\xfe\x76\xfa\x42\x14\x39\x1f\x05\x04\x6c\x1e\xff\x3e\x52\
+\xc1\x27\x84\xa6\x96\x96\x9e\x65\x1d\x58\x52\xcb\x66\x56\x49\x58\
+\x7a\xa7\xa6\xd2\x05\x3a\x44\x12\x5c\x60\x64\xd0\x52\x91\xac\x9f\
+\x2a\xa8\xc8\x16\x55\xc8\x8a\x02\x95\xaf\xa1\x75\x27\x5d\xe3\x12\
+\x05\x24\xb2\x32\x26\xc7\xe3\x50\xe3\xc9\x28\x92\x63\x5b\xf0\xc6\
+\x7d\xcf\xd1\x7b\x92\x34\x95\x8b\xab\xc0\xfd\xa7\x1b\x51\x97\x7f\
+\x96\x24\xbd\xb3\x6b\xd5\x52\x61\x4d\x9b\x1b\x82\x21\xb0\x09\x61\
+\x27\x54\x10\x6a\xa0\x90\xb5\x27\x92\x32\x02\x19\x05\x41\x49\x85\
+\x5a\x54\x0c\x05\x59\x39\x72\x05\x1d\x35\xf3\xb3\xca\x47\x1d\x1e\
+\x51\x87\xdf\x25\xa2\x98\x2f\x22\x33\x95\xd4\x91\x0a\xbf\x89\x5d\
+\x5b\x1f\x42\xe8\xc3\x53\xf3\xf5\x86\xe3\x9c\xc2\x3f\x3e\xb6\x08\
+\x72\xe8\x5d\xd4\x35\xde\x74\xcd\xba\xe5\xc2\x8a\x06\xd1\xb0\xa2\
+\x83\x8c\xef\xa1\xe9\x77\x0a\x90\x14\x0d\xfd\x61\x05\xfb\x02\x24\
+\x7c\x5a\x45\xba\x40\x10\x1a\x8d\xc0\x11\x49\x43\x97\x64\xa0\xce\
+\x03\x72\x8d\x29\x8f\x2d\x12\x79\x4d\x65\x48\x91\x87\xc8\x41\x70\
+\xd5\x7a\x04\x4d\x77\x75\xa3\x65\xed\xf5\x48\x47\x0e\x21\x4d\x0f\
+\x98\x87\x27\xaa\x2b\xf0\xab\xd3\x5d\x48\x86\x7a\x1d\x9d\x5d\x3d\
+\x37\xaf\x5d\x84\x26\xb7\x4e\x24\x03\xb8\xe9\xae\x1a\x27\xcb\x22\
+\xa0\x6f\x52\xc1\xfe\x20\x43\x85\x24\x63\xcd\x04\x72\xc5\x70\x08\
+\x8f\x7c\xb1\x15\x7d\x0f\xae\xc2\xe2\x3a\x07\xde\xd8\x17\x07\x6a\
+\xdd\xa6\x17\x0c\x25\xce\x9c\x1a\x19\x81\xa2\x9f\xdc\xe9\x5d\x80\
+\x86\xee\xeb\x90\x31\x94\x08\xd3\x0d\xf2\x85\x29\xf0\xe0\xd1\x06\
+\xe4\xe2\xef\x8a\x1d\x8b\x7b\x6e\x59\xdd\x8e\x5a\x07\xe1\x9b\xcc\
+\xee\x75\x08\xe4\x76\x01\xc7\xe3\x1a\xb6\x8f\xa8\xc8\x14\x35\x13\
+\x88\x36\x18\x87\x83\xf8\xf1\x17\x1a\xf0\xbb\x8d\x8b\x8d\xaf\xeb\
+\x97\xfa\xf1\xfc\xfb\x11\xc4\x99\x96\x2a\x08\x3f\x33\xc9\x23\x70\
+\x91\x48\xa2\xa7\x05\xf5\x97\x5e\x81\xa9\x43\xfb\x51\x4c\x44\xaa\
+\x29\x21\x9e\x7d\x99\x08\x5c\x48\x3c\x8b\xc6\xd6\xcb\x6f\xbc\xac\
+\x0d\x35\x82\x4a\xc2\xeb\xf0\x8a\x9a\x61\xf9\xde\x09\x15\xfb\xa6\
+\x6c\x8b\x9b\x70\x30\xc6\x48\x08\x3f\xb8\xba\x0e\x7f\xba\xbb\x6b\
+\xd6\xd3\xba\x9a\x3d\xf3\x67\x7c\x56\xc2\x4f\xd7\x37\x76\x5e\x81\
+\xab\x7f\xf2\x10\xad\x2c\xa7\xe9\x39\x3f\x05\x7e\x79\xf0\x5e\x08\
+\x35\x5f\xf9\xec\xaa\x85\x68\x70\x6a\x20\x98\xc3\x43\xc2\xfa\x48\
+\x89\x7f\x8e\x28\x18\x4d\xb2\xd5\xcb\xe0\x40\x8c\x82\xb1\x10\xee\
+\x59\xe3\xc3\x33\xdf\x5a\x7a\xc6\xe3\x6a\xbd\xa2\x79\x9d\x80\xf9\
+\x91\xa4\x46\x17\xfa\xbc\x40\xcb\xb2\xdb\xb1\x76\xd3\xdd\xb4\x42\
+\x89\x91\xb8\x62\x5e\x0a\x6c\x1e\xea\x80\x24\x3f\xd9\xda\xd5\x25\
+\x2c\xf5\x13\x25\xea\xac\x80\x6e\x58\xfe\x4d\x82\x4c\x24\xa3\xc2\
+\x30\xa7\x6e\x05\x24\x07\x05\x09\x7f\xd7\x0a\x27\x9e\xdf\x74\xc9\
+\x59\xe5\xf1\xba\x2d\xa4\xce\xf5\x82\x3e\xe7\x58\x3e\x98\x25\xbc\
+\x84\xd5\x25\x37\x6d\x42\x6d\xd7\x35\xb4\x52\x8f\xb3\xb0\xe6\x99\
+\x0a\x64\xf2\x8f\xa0\xae\xbe\x65\xdd\x02\xd3\x6b\xb6\xf0\x7b\x88\
+\x61\x42\x19\x26\x05\xd5\xa4\x43\x58\x10\x9a\x0c\xe2\xf6\x25\xc0\
+\x4b\xf7\x2d\xaf\x68\xd0\x24\x25\x5f\xc1\x88\x13\x9b\x89\xac\x63\
+\xf9\xe7\x59\x47\xeb\xf9\x2c\x5e\x4d\x7d\x3b\xba\x37\xde\x41\x5f\
+\xd8\xb5\xee\xea\x0a\x3c\x3c\xd0\x0e\x25\x77\xef\x92\xc5\xad\x06\
+\xde\xd9\xfa\x2e\x82\x4d\x88\x38\xfd\x58\x58\x29\x71\xb9\x6e\xf1\
+\xfa\x54\x18\x37\xb7\xaa\x78\xe3\x47\x2b\x2b\x0a\x4f\x84\x8a\x23\
+\x53\x05\xe8\x62\x99\x5c\xe5\x13\x55\x8e\x7c\x8f\x8b\x98\xa9\xe3\
+\xca\x3b\x50\xb3\x60\x3d\x7d\x6b\x9c\xeb\x85\xd9\x0a\x28\xf2\xf7\
+\xe0\xf3\xd7\xae\x6c\x12\x8d\x24\xe5\x24\xee\xf6\xd2\xe5\x3b\xc6\
+\x29\xa7\x88\xb6\xe0\xaa\xf9\x88\x60\x14\x1b\x6a\x65\xec\xf8\x59\
+\x37\xaa\x8d\x1f\xbe\x18\x40\x8a\x13\x86\x50\xcd\xe2\xe5\x47\xeb\
+\x46\x8e\x03\x86\x27\x1b\xca\xed\xab\xc7\x92\x2f\x31\x8c\x38\x16\
+\x5c\x55\x14\xd0\xee\x69\x68\xab\x47\x8d\xc3\x7c\xa0\x8b\x02\xf5\
+\x78\x4c\x46\x21\x6f\x65\x53\x58\x81\x18\x8e\x61\xbd\x47\xc2\xee\
+\x87\x57\x55\x15\x7e\xcb\xdb\x61\xbc\x3c\x90\x45\xc6\x69\x51\xe4\
+\x2c\xda\xac\x64\x79\xeb\x3c\x93\x84\x68\x53\x2b\x61\xb8\xf3\xda\
+\xab\xe9\x24\xbb\xba\xf6\xec\x0a\xfc\x62\x74\x25\xb4\x62\xcf\xc2\
+\x26\x8f\x51\x74\x71\xd8\xb9\x49\xd8\xfe\x10\x51\xb0\x50\x56\x0a\
+\x44\x92\x58\x2d\x66\xf1\x9f\xc7\x7a\xaa\x0a\xff\x97\xbe\x28\xfe\
+\xb4\x3b\x8e\xa8\xb7\x4c\xa8\x72\xc1\xab\xe5\x03\x3b\x0c\xd8\x5a\
+\x36\xcb\xb9\x9b\xd7\xc0\xd7\xc9\xee\x9e\x15\xcc\x25\x05\xa4\xd8\
+\x8d\x70\x3b\xc5\x56\xc6\x0c\x05\xaa\x43\x54\x31\x99\x56\x50\x2c\
+\x28\x56\xd0\xd2\x48\xa6\xb1\x4c\x49\xe3\xc8\xaf\xab\x0b\xff\xd7\
+\x9d\x31\x3c\xb6\x3d\x8a\x88\x5b\x34\x2d\xc8\xf7\xab\xba\x39\xed\
+\xcf\xbc\xce\x35\x11\x55\xa7\x50\xac\x69\xd5\x48\x25\x48\x59\x8a\
+\xf0\x9a\x53\x74\xa0\xa9\x67\x11\x7d\x6b\x2d\x87\x51\x89\x5b\x05\
+\x6d\xbd\xe8\xf5\xc0\xef\xd0\x0c\xef\x31\x8a\x86\xe2\x45\x8b\xef\
+\x49\x90\x64\x06\x4b\x72\x69\x0c\xfe\x76\x2d\xaa\xd5\x80\x2f\xed\
+\x4f\xe1\xa9\xde\x28\x96\x37\x3a\xb1\x9a\xb2\xb6\x43\x14\x0d\x46\
+\x14\x89\x86\x04\xc2\xb4\xc3\xc1\xd5\x86\x60\x58\x8e\x21\x2e\x8a\
+\x66\x1a\x67\x71\xe3\x54\x37\x8d\x45\x53\x38\x3d\x31\x3d\xdb\x6b\
+\xb0\x4a\x94\xfa\x95\x6d\x08\xec\x68\xa7\x05\xf6\x6b\x71\xb6\x02\
+\x9a\xb0\xcc\xef\x75\x12\x52\xa8\x2e\xa1\x80\xe3\x17\x8e\xa5\x64\
+\x23\x29\x23\x5b\x40\x6b\xc6\x14\xde\xe9\xa8\x5e\xc0\x6e\x5c\x5f\
+\x6f\xcc\x0b\x1d\x8f\xbd\x1d\xc3\xb3\x7d\x0a\x26\x88\x24\x4c\x3b\
+\x59\xde\x62\x2b\xd4\x2c\x68\xa1\x85\x36\x94\x65\xe6\x12\x84\x74\
+\x71\xa1\x87\x5c\xce\x8d\x07\x8f\x58\x8e\xea\x7c\xaa\xe7\x21\x15\
+\xd0\x4c\xd0\x39\xf9\x9b\xd5\xf0\xb9\xc5\xf3\x93\xe6\x02\xc6\x03\
+\x37\x34\x60\x71\x7b\x83\x55\x7a\x5b\xb0\xb3\xe1\xe4\x6e\x61\x05\
+\xe8\xe4\x99\x10\x22\x1f\x6a\xf5\x0e\xb2\xae\xae\x6a\x86\x43\xa3\
+\x92\x66\x06\x6e\x24\x8b\x9d\x0f\x77\xa3\xc1\xe7\x3c\x6f\x61\x2e\
+\x64\xb4\xf8\x1d\xa8\xa3\xb6\xd4\x78\xb7\x2e\x94\x41\x88\xa5\xf4\
+\xd6\xd0\xff\x7e\x4b\x01\xa3\x30\x99\x2d\x15\xdd\xa4\xd2\x24\x00\
+\x21\x9e\xb7\x9a\x11\xb0\x11\x2e\xea\x46\xc2\x39\x87\xdb\x61\x05\
+\xbf\x6e\x51\xb7\x9d\x1f\x8c\x72\xdc\xc8\xc6\x33\x50\x28\x61\x42\
+\x95\x33\xdc\x41\x69\xaa\xd9\xcf\x4a\x45\x2b\xf3\x36\xbb\xb1\xf1\
+\x99\x51\x5c\xe4\xdd\x90\x8a\x83\x49\x49\x55\x55\xd3\xf2\xb2\x55\
+\x73\xa9\x82\x09\x25\x45\xca\xcd\xbd\xbe\xa4\x80\xa2\x04\xf3\x39\
+\xea\x5b\x09\x42\xaa\xac\xa3\x50\xb4\x78\x9f\x9c\x35\x48\xdf\x2f\
+\x7f\xfc\x84\xd9\xfb\xfe\x8f\xc7\xbf\x4e\x16\x11\x89\xa7\x4d\xd6\
+\x51\x94\x52\x52\x63\x59\xf2\xd1\x38\xcc\xde\x60\xa6\x2c\xb4\x21\
+\x44\xd4\x23\x9f\xce\x11\xdb\x68\x5a\x2d\xd1\xb1\xb9\x93\x60\xf0\
+\x32\x3d\x48\x27\x48\x1e\xcb\xc9\xb8\xfe\xf7\xa7\xb0\xeb\xc1\x15\
+\x55\x05\x38\x16\x2c\xe0\xe9\x7f\xc7\xd1\x54\xe3\xa0\x62\x92\x68\
+\x93\xee\xe7\xd8\x62\x56\x13\x89\x37\x45\x83\xe1\xa8\x54\x21\x3a\
+\xe5\x73\x06\xb4\x45\xd1\xc8\x55\x11\x49\xc7\xfe\x91\x14\xfa\x8f\
+\x8d\x5b\x1e\x50\x67\xc4\x83\x4c\xca\xe4\x02\xac\x80\x04\xb3\xd5\
+\xd4\xcb\x15\x20\x56\xcd\x1c\x51\xb3\x4e\xb2\xbc\x4a\x20\x13\x8d\
+\x60\x36\x13\x98\x60\xfc\x53\xc9\x13\xfd\x89\x3c\x6e\xde\x3a\x8c\
+\xde\x9f\x2e\xab\xa8\x40\x0f\x55\xb1\xb7\x5d\xe6\xc7\x96\xed\x31\
+\x0c\xc4\x93\x66\xff\x2c\xe8\x86\xf7\xcc\x82\x94\x77\x2e\x4c\x98\
+\x8a\xba\x60\x6c\xbb\x88\x30\x5b\xca\x1c\x35\xf7\xf9\xb4\x64\x66\
+\x5e\xd9\x92\xd1\x76\x3a\x33\x62\x72\x30\x01\x73\xd7\x62\xa6\x43\
+\x2b\x29\x90\x9e\xdc\x0d\x97\x5b\x8f\x49\xb2\xe0\x13\x9d\x74\xa2\
+\xe4\x01\x63\xd0\xa1\x48\x80\xdb\x1b\xc9\xe1\xb6\x3f\x8f\xe0\x9d\
+\xfb\x2f\xa9\xa8\xc4\x57\xaf\xa8\x43\x0d\x59\x7f\xf3\x36\xba\x7e\
+\x34\x68\xad\x5a\x19\x18\x76\x46\x56\xad\x2c\x6b\x1d\x8d\x42\x11\
+\xa6\xf0\x7c\x2c\xc8\xa5\x92\x83\x65\x28\x92\x86\xa9\x01\x4e\x5e\
+\xdc\x62\x16\xec\x77\x95\x7a\xe2\xc1\x23\x31\xac\xb9\xe5\x1b\x9a\
+\xc7\xdf\xd2\x5c\xeb\x42\x9a\x0a\xb8\x4c\x41\x9d\x5d\x60\xd1\x94\
+\xa9\xcc\x08\x67\x34\x7c\x30\x94\xc7\x37\xaf\x6a\xa8\xa8\xc4\x8a\
+\x36\x37\x3a\xeb\xdd\x18\x4f\x38\x8c\xec\x5a\xaa\x73\xca\x9a\x21\
+\x6b\xff\xc8\x5c\x43\xa9\xcf\x60\x6b\x17\x8a\x56\xc3\x24\x98\x4a\
+\xc6\xc2\x83\x08\xbc\x36\x44\x2b\xbb\x69\x4e\xc2\x68\x4c\x66\x35\
+\xf5\x09\x15\xab\xbe\xb6\xa8\xa0\xb9\xae\x6f\x6d\xf6\x19\xc1\x9c\
+\xc8\x5a\xbb\x1a\xe5\x29\x9d\x8e\x45\x55\x46\x38\xab\xe1\xc0\xa8\
+\x8c\xbb\xd6\x55\xce\xba\xdd\xed\x2e\x4a\x7e\x4e\x4c\x24\x04\x4c\
+\x4e\x27\x4a\xcf\xb2\xeb\x23\x5d\x2f\x25\x2c\x7b\xf2\x6b\xb2\xb9\
+\x52\xf5\xca\x23\x47\x06\x1f\x7f\xab\x17\xe9\x13\xbc\x5f\xb4\x8f\
+\x66\xd4\x7e\x47\x79\x6a\xd5\x11\x3e\xf4\x02\x32\x52\x3e\x90\x28\
+\x50\x17\x26\x5a\x85\x97\xbd\x21\x65\x7d\x56\xcd\x17\xc7\xf3\x59\
+\xec\x18\x4e\xe0\xdb\xcf\x4d\x55\x0d\xea\xbb\xd7\xf9\x71\xc3\xca\
+\x66\xd4\x78\xdd\xb3\x9f\xa5\xcd\x15\xde\xf2\x42\xa1\x60\x7a\xc0\
+\xee\xa1\x61\x28\x24\x21\xdc\x9b\xa1\x4f\xac\x40\x02\x65\x9c\x3e\
+\x7b\x5b\x65\xf4\xbd\x24\x56\xde\xd9\x2d\xa9\x8e\xb5\x1d\x2d\x3e\
+\xea\x7f\x65\x93\x3a\x2b\x94\xbc\x12\xbd\x2c\x44\x70\x3a\x1e\xd4\
+\xf0\xe5\xb5\xb5\x15\x95\x20\x02\xc3\x07\xc3\x19\xc4\x12\x59\x2b\
+\x1c\xb4\x92\x85\x67\x14\xb1\xe2\x21\x93\x2f\x79\x8a\x35\xc8\x11\
+\x94\x02\xef\xbd\x83\xf8\x87\x44\x4d\x78\x9f\xe6\x84\x0d\x9f\xb9\
+\x1e\xe0\x51\xc4\xf8\xde\xad\x48\x64\x32\x23\x61\x09\x4d\xdc\x49\
+\xa9\x73\xbc\x50\xee\x0d\x7a\x49\x28\x91\xc4\xb6\x81\x28\x1e\x78\
+\x39\x5c\x51\x81\xd6\x3a\x87\x01\x25\xa8\xa5\x6d\xc5\x92\xe0\x96\
+\xf0\x1c\x07\xe9\x5c\x29\xde\xec\x1d\x8c\x14\x51\xd9\xe4\x4b\x1c\
+\xb8\x03\x16\xf6\x8b\xe5\xcf\x9e\xab\x80\x8e\xfe\x3f\x1e\x43\x6a\
+\xf4\xa9\xcc\x54\x4c\x17\xec\xc0\x2a\x87\xcf\x5c\x85\xe8\x65\x93\
+\xd3\x51\xbc\x7e\x38\x82\x9f\xbf\x16\xad\xa0\x82\x6e\xbe\x68\xae\
+\x11\x0c\x25\x2c\xe1\x33\x52\x29\x2e\x74\x4b\xb4\x54\x5a\xc7\xc4\
+\x2b\x6f\x43\xc9\x32\x95\x1d\xa6\x19\xc7\x9c\x92\xe0\x6c\x3b\x73\
+\x2a\x42\xfb\x07\xd0\xf6\xf9\x0d\x92\xee\xee\x72\xfb\xdc\x50\x15\
+\x6d\x76\xef\x6a\xbb\x5e\x2f\x05\x5a\x22\x91\x01\x39\x0d\xc1\xac\
+\x03\xb7\x74\xfb\x66\x3d\x70\x24\xae\xe1\xf5\x83\x51\x84\x23\xa9\
+\x12\x3c\xec\x26\x89\x8f\x99\x9c\x69\x14\x9b\xf7\xd9\xfa\x79\x8a\
+\x85\xe9\xc3\x7b\x30\xf6\x0f\xb6\xfa\x4e\x9a\x07\x68\xa6\xe7\x0a\
+\x7b\xf6\xad\xc5\x22\x01\x51\x55\x0e\xa1\x76\xc5\xad\xaa\xd3\xd3\
+\x68\xd4\xe2\x95\xb6\x02\xcb\x94\x88\x51\x09\x30\x4d\x4a\xc4\x0a\
+\x6e\xdc\xb8\xc2\x3b\xf3\xb8\xa1\xa8\x86\xed\x07\xa7\x11\x9e\x4e\
+\xce\x78\xc4\x10\x94\x93\x95\xcd\x38\xe5\xc2\x73\x1d\x16\x99\x18\
+\xc6\xe0\x1f\x0e\x52\x4d\x7f\xc0\xc2\x3e\x7b\x41\x9b\x9f\x02\x7c\
+\x61\x62\x28\x46\x35\xc0\x10\xdc\x4b\x6f\x82\xc7\x5d\x4b\xad\xd3\
+\x59\x1a\xf3\x39\x8a\x70\x19\x4e\x3d\x73\x8c\x32\x5e\x5a\xf1\xe0\
+\xba\x4b\xcd\xbe\xe3\xef\x7b\x73\xd8\xd6\x7f\x0a\x72\xc1\xa2\x65\
+\xb6\xb6\x44\xc1\x9a\x2f\x96\xe5\x19\x4b\x78\x56\x2a\x16\x0c\xe0\
+\xf8\x13\x7d\x50\x33\xfc\x53\x54\x2f\xcd\xe1\xb9\xd8\x3f\x97\x02\
+\x26\x94\x22\x47\x03\x28\xd0\x43\x7c\x4b\x37\xc0\xe1\x69\x30\x76\
+\x07\x2a\xc1\xc8\x0e\x4c\x4a\x3c\xa1\x29\x6a\xe6\x49\x89\x81\x84\
+\x07\x6f\x0e\x14\xb0\x6d\xef\x49\x04\x26\xad\xf8\x60\x68\x50\x93\
+\x34\x43\x9b\xc6\xf3\x04\x33\x1a\xf9\x5c\x74\x6a\x04\x03\x5b\xfa\
+\x20\x27\x86\x2d\xe1\x39\x78\xa5\x4a\x42\x9e\xeb\x07\x0e\x3e\x5f\
+\x8f\xf6\xcf\x5d\x8f\xcf\x7c\x77\x33\x9a\x17\x5e\x85\x3a\x3f\x4a\
+\x0d\x86\x68\x3a\x55\xb0\x6a\x26\x63\xe7\x42\x30\x3d\x4d\x71\x23\
+\x12\xf3\x68\x0c\x07\xb6\xb4\xaa\x95\x05\xa9\x6d\x71\x4b\x78\x1e\
+\x69\xa2\xd8\xf8\x50\x3f\x4e\x3c\x3d\x00\x55\x3a\x61\x09\x7f\x94\
+\x66\x0a\x55\x6a\xf9\x73\xff\xc0\xc1\xae\xcb\x06\x82\x98\xec\xfd\
+\x10\xee\x0e\xaa\xc2\x1a\x7b\x08\x4e\x2e\x43\x01\xae\x57\x98\x1a\
+\x39\xc8\xb9\x72\xe4\x04\xc4\x10\x30\x3e\x2b\xd0\xd9\xd2\x45\x79\
+\x8e\xe0\xfa\xec\x4d\x11\x2e\x19\x12\x29\x09\x63\xaf\xbc\x8a\x91\
+\xe7\x26\xa0\x17\x0f\x5a\xc2\x1f\x83\x19\xb4\x55\x6b\xf8\xf9\x28\
+\x60\x2a\xa1\x29\x51\x04\xf7\x10\xc5\x9e\x1a\x84\xa3\xc3\x0b\xb5\
+\x66\xa9\x59\x1f\x5b\xb1\xa1\xa8\x67\x66\xda\xf2\x6e\x6a\x46\x66\
+\xc1\xb4\x3a\x27\xa8\x24\xd5\x2a\xa1\x8f\xfa\x30\xb4\x75\x0f\x92\
+\x87\x03\x74\x62\x17\x5d\xd1\x47\xf3\xa4\x05\x9b\x73\x36\x20\xe7\
+\xfb\x2b\x25\xf7\xa2\xcd\xe0\x3d\xfb\xe6\x35\xd7\x62\xe1\xad\x1b\
+\xd0\xb8\xea\x3a\x78\x6b\xdb\xe1\x72\x09\x86\x32\x8e\xb2\x2d\x41\
+\xbb\xa7\xe5\x0c\xcb\x5e\x91\x65\xb6\xb8\x0e\x29\x15\x44\xfc\x40\
+\x3f\xa6\xde\x8a\x40\xe6\x4a\x0f\x0c\x99\x8f\x60\x96\x0a\x31\x9c\
+\xe3\x57\x99\x8f\xa3\x80\x7d\x0f\x73\x24\x6f\x30\x91\x17\x5c\xab\
+\xd0\x70\x59\x37\x1a\xd7\x2e\x84\xff\xd2\x4e\x78\xdb\x17\xc0\x59\
+\xdf\x02\xd1\xe9\x37\x7f\xaa\xa4\xa2\xa9\x98\x8a\xa0\x10\x08\x23\
+\x75\x72\x1a\xc9\x8f\xd2\xc8\x8d\x13\xbe\x34\xce\xae\x1c\xa8\xcc\
+\x34\x63\x30\x0b\xb4\xfc\x7c\xac\xfe\x71\x15\xb0\x07\xf3\x06\xf3\
+\x24\x97\xa3\x4d\x34\x17\x58\xb3\xcd\x5a\xe3\x1d\x04\x7b\x3b\x9c\
+\x29\x90\x21\xc1\x89\x80\x05\xe7\x0a\x90\x79\x9d\x0b\x33\xf6\x00\
+\xd7\xf7\x17\xf4\xab\xfd\xc5\xf8\x5b\x09\x7e\x86\xc3\x12\xd6\x67\
+\x29\xc5\x50\x73\xa2\x54\xaa\xb0\x70\x9c\x04\x64\x4b\xd8\x5c\x99\
+\xd0\x1f\xab\xd1\xfe\xd4\xff\xb1\xc7\xa7\x7e\xfc\x17\x10\x56\x75\
+\x67\x6d\x81\x89\x1b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x0e\x21\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x44\x69\x20\x33\x30\x20\x53\x65\x70\x20\
+\x32\x30\x30\x33\x20\x32\x33\x3a\x35\x32\x3a\x32\x37\x20\x2b\x30\
+\x31\x30\x30\xce\xbc\x84\x32\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x19\x02\x59\x84\x40\xc4\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0b\x11\x00\x00\x0b\x11\x01\x7f\x64\x5f\x91\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x0d\x79\x49\x44\x41\x54\x78\xda\xed\x59\x69\x6c\x54\xd7\x15\
+\xfe\xde\x2c\xde\xb1\x8d\x57\xe2\x05\x30\x60\x82\x81\x02\x69\x08\
+\xc6\x04\x68\x81\x42\x5a\x9a\x12\xb5\x22\x45\x6d\x03\x59\xd4\x2c\
+\x4d\xa4\x36\x52\xa4\xaa\x4b\xa4\x36\x6d\x95\x48\x55\x5b\xb5\x3f\
+\xda\x2a\x8d\xd2\x96\x26\xad\x2a\x51\x25\xcd\xbe\xd2\x40\x20\x6d\
+\xd2\x84\x24\x84\x00\xc1\x66\xb3\xb1\x3d\xb6\xf1\x32\x66\xf6\xb7\
+\xdd\x7e\xf7\xdd\xf7\xc6\xe3\xb1\xc1\x63\xf2\xab\x52\x1e\xb9\x9a\
+\xc9\xf3\x7b\xf7\x7e\xe7\xdc\xef\x7c\xf7\x9c\x33\xc0\x27\xd7\xff\
+\xf1\xf5\x06\x50\xf1\x26\xb0\x85\x5f\xf3\x39\x7c\x1f\x67\xae\x67\
+\x81\x92\xe7\x81\x27\x77\x03\xb7\xcf\xe6\xbc\xbc\x15\xe0\xd0\xa6\
+\x7a\xcf\x7f\x39\x8b\x1d\x07\x16\xee\x02\x1e\xd0\x81\x47\x6d\x60\
+\x27\x57\x3a\xf4\x2e\x70\x9e\x7f\x4a\x5e\xce\x7c\x1d\x04\x3b\x02\
+\xec\xa9\xac\x29\xda\x36\x43\xe0\xfa\xb5\x86\xfd\x65\x7a\x25\x3f\
+\x08\x74\x71\xad\x04\x1f\x11\x1f\xd7\xd9\x68\xe7\x22\xef\x03\xdf\
+\x7a\x07\x38\x7c\x10\x30\xdb\xdb\x5a\x84\xfe\xd0\x4e\x71\x66\x7d\
+\x8b\x78\x14\x38\x48\x23\xd6\xf2\xb1\xa2\xcb\x98\x5a\xdb\x0f\xfc\
+\xfe\x40\x59\x81\x10\x77\x5c\x2d\xc4\xae\x16\xd1\xd7\x5a\x23\xde\
+\x28\xcf\x17\x4f\x01\xa3\x7b\x80\xc7\x7f\x0d\x6c\xe6\x73\xc5\x98\
+\x64\x97\x73\xda\x01\x7a\xb7\x7a\x88\xbb\x1c\xa8\x29\xbf\x7b\xfe\
+\x9d\x5b\x67\x2d\xfc\xe6\x75\xbe\xca\x95\x0b\xe0\xb7\x4d\x94\xcf\
+\x2a\x44\xe4\x60\x47\x63\x4c\x88\xfe\xa3\x8e\x9d\xb8\x30\x1d\x8f\
+\x1d\x02\xee\x4b\x04\xfd\xdf\x5f\xf7\xb5\x65\x9a\x66\x9a\xf4\x77\
+\x0a\x25\x33\x02\x68\x9c\x57\x8c\xb9\x0d\x85\xf9\x41\x21\x96\x05\
+\xc2\xc6\x4d\xdb\x81\x0d\xcb\x81\xc1\xbd\x40\x0f\x5f\x33\xbd\x35\
+\xa6\x34\xe0\xbf\x40\x55\x0c\xd8\x5f\xb7\x6e\xd9\x35\x4b\x7f\x76\
+\x8b\x56\x50\x4e\x27\x27\xb8\xab\x31\xde\x8d\xf3\xd3\x30\x50\x58\
+\x12\xd0\xca\xda\x07\xe6\xbc\x0c\xbc\x47\x0e\x85\x90\x23\x95\x38\
+\xf7\x8e\x61\x7a\x7f\xed\x37\xae\xf2\x05\x25\xe3\x53\x24\xa5\x45\
+\x6c\xa6\xe5\x8c\x00\xd1\x55\xd7\xe6\x63\xce\xfc\x62\x4d\x37\x45\
+\xa3\x16\x36\x36\x71\x47\x5e\xe7\x93\x7c\x0d\x3a\x90\x43\xe0\xe5\
+\x01\x0f\xd7\xb4\xb6\x2c\x5e\x70\xdf\x57\xf8\x1a\x99\x1a\x8d\x12\
+\x1e\xf1\xe9\x7c\x5f\x7a\xcc\x16\xa8\x59\xde\x88\xfa\xaa\x92\xd9\
+\x77\x00\x37\xf0\x95\x06\xf5\xda\x94\xe0\x3f\xcb\xa0\xf9\xd3\xaa\
+\xed\xcb\xfc\x05\xc5\x41\xc7\x11\xb0\x08\xdc\xb6\x21\xe4\x10\x02\
+\x06\xe7\x8e\xa6\x04\x42\x09\x0b\xa3\x7c\x67\x00\xe8\xe3\xc7\x2a\
+\x8e\x72\x6f\x9e\x29\x0d\x20\xcc\x8a\x8a\xe5\x73\x14\x78\x0f\xb8\
+\x21\x87\xe9\x2c\x06\x8d\x42\x61\x6b\x58\x72\xfd\x62\x7c\x06\xd8\
+\xbe\x02\xb8\x96\xaf\xcd\xc4\x25\x14\xe4\x2d\x60\x09\xc1\xec\xb9\
+\x7a\x6b\x4b\x61\x79\xdd\x0c\xce\x99\xe2\x7c\x96\x32\xc0\xe2\x9c\
+\x12\xbc\x25\x90\x30\x6c\x0c\xa5\x4c\x1c\x1b\x36\x10\x3e\x1b\x37\
+\x7f\xe5\xb0\x19\x56\x26\x45\xa7\x34\x80\x0b\x3d\xdf\xb7\xf7\xb0\
+\xf2\xb6\xe7\x75\x67\x11\xdb\x9d\xc1\xe7\xcc\x57\x34\xab\x0c\x4d\
+\x4b\xae\x28\xb9\x0b\xf8\x2a\x6f\xcc\xe7\x28\x98\x6c\x3e\x22\x68\
+\xe8\x67\x3c\xb5\x5c\x3b\xaf\xaa\xf6\xca\x1a\x52\x31\xa9\x9c\x21\
+\xa9\x23\x0d\x20\x78\x8b\x43\xa7\xf7\xe9\x78\x74\x25\x6d\x24\x4f\
+\x46\xf0\x2a\xf0\xe2\x29\x15\x5f\x1f\x72\x84\x73\x36\xe0\x04\xf0\
+\xdc\xd0\xa9\x90\x81\x58\x9c\x3e\x15\x0a\xb8\x50\x5e\x72\x86\xb7\
+\x0b\x96\x86\x45\x9b\x9a\xd1\xec\xf3\x6d\xd8\x09\x7c\x81\xaf\xce\
+\x42\x56\x8c\xfd\x1b\xa8\xec\x25\xf8\xf9\xcb\xea\xe7\xce\x5b\x33\
+\x97\x31\x94\x74\x1d\x22\xa9\xa3\xc0\xdb\xae\xf7\x4d\x4e\x3d\xa0\
+\x5b\x18\xee\x49\x60\x28\x6e\x9f\xfd\x03\x40\x1d\x01\x85\x10\x1f\
+\x71\xc4\x73\x36\xe0\x3e\xe0\x14\xe7\x7a\xab\xef\xad\x76\x05\x54\
+\x68\x6a\x07\x25\x70\x5b\x28\xa6\x08\x77\x1a\x46\xe2\x92\x2d\xcd\
+\xda\x36\xe0\x36\xc2\x5b\xc9\x3b\xa5\x1e\x95\x3e\xa0\x0c\x12\xc1\
+\xd3\xf5\xcd\x35\xcb\x17\x6f\x5d\xc2\x58\x4a\x2a\x2a\x7a\x9e\xb7\
+\x95\x43\x4c\xe9\x7d\x8e\xb0\x6e\xa3\x37\xc2\xb8\xe8\x4e\x58\x3f\
+\x67\xe0\xf2\x1b\x37\x00\x54\x71\xe7\xbc\xb1\x73\x36\x40\x86\x01\
+\xd9\xff\x64\xcf\x01\x1a\x1e\xe0\xe3\xc2\x1a\xf3\xbe\xc8\xa2\x12\
+\x8d\xab\x6d\x99\x85\xa6\x86\xb2\xba\x7b\x81\x9b\x79\xb7\x89\x23\
+\x8f\x3a\x5f\xd2\x05\x3c\x55\xdd\x58\xb1\x66\xc5\xf6\xab\x08\x3e\
+\xae\xc0\xa7\xbd\x2f\x83\x56\x23\x33\x6d\xb2\x49\x80\xb4\x47\x77\
+\xd2\x44\xa2\x23\x06\x2a\xdb\x0b\xed\x8a\x3a\x8c\x7b\x74\x72\xa4\
+\x32\xc1\xe5\x74\x0e\x90\xa9\x7d\x73\x22\x89\x3b\x1a\xaf\x9e\x17\
+\xf4\xe7\x07\x94\xcc\x39\x3b\x90\x49\x25\x2b\xbd\x2b\xb3\x9a\xca\
+\x11\x79\xb7\xa7\x99\x26\x0d\x72\x74\xb7\x01\xbb\xab\x1a\xca\x3f\
+\xb7\x7a\xd7\x6a\x05\xde\x09\xda\x31\x03\x84\x74\x28\xe7\xd4\x4d\
+\x1b\x29\xc6\x57\x28\x65\xa1\xaf\x33\x86\xf3\x43\xfa\xe9\x9f\x92\
+\x32\xb6\x13\xf7\x60\xd6\xe2\xc8\xa7\x98\xb6\x01\x34\x3d\xbe\x03\
+\x58\x11\xf4\x69\x2d\x15\xcd\xb3\xc6\x14\x28\x7b\x17\x9c\x7b\xe4\
+\x8c\x4f\xa0\xbc\xa6\x48\xcb\x6b\x1f\x5a\xfe\x69\x9e\xd0\xb3\x1b\
+\x2a\xd6\x3b\xe0\x63\x3c\x37\x52\x92\xf7\x86\x92\x4d\xd7\x09\x1a\
+\x87\xc9\x39\x25\xf8\x11\xca\xe6\xe9\x91\x14\x52\x1d\x51\xe3\x47\
+\xf4\xfe\xa0\x93\x69\xe0\x35\x0e\x6e\x22\x8c\x6c\x6c\xb9\xe6\x42\
+\x36\xb5\x31\x95\xd7\x3b\xb2\xa3\x69\xe3\x12\x4d\xe9\xbf\x3d\x71\
+\x48\x43\xa4\x42\xf1\xbf\xa2\x8a\x42\x04\x4c\xbb\xa0\x24\x10\x6c\
+\x58\x7d\xcb\x6a\xa5\x36\x29\xd7\xf3\x1e\x78\x3a\x40\xea\xbd\x4d\
+\x09\x4d\xd1\xfb\x71\xd2\xe7\x74\xcc\x40\xe4\x68\x18\xcf\x99\xe2\
+\x99\x7f\x01\xfd\x2e\xf8\x63\x1c\xb1\xc9\x80\xe5\x9c\xcc\x91\x87\
+\xbd\xeb\x2c\xfb\xc6\xea\x9a\x19\x15\x45\x95\xa5\x2a\xf8\xec\x4c\
+\xea\xd8\xe9\x40\x74\x2c\xe0\xf7\xca\xb9\x55\x68\x58\x56\x47\xe0\
+\xc6\x18\x78\xe9\x7d\x57\xeb\x9d\xe7\x48\x21\x5d\x97\xde\x17\x38\
+\x47\xde\xf7\x9f\x8e\xa2\x3b\x6c\x1c\x63\xe0\x9e\xb2\x1d\xe1\x72\
+\xe8\x33\x81\x3a\xde\x95\x73\x0a\x7c\x12\x8e\x90\x3e\x7e\xf2\x35\
+\xe6\x87\x01\x77\x2e\x4f\x4e\x3d\x3a\x41\xcb\x58\x47\x53\x1c\x4f\
+\xe8\xea\x00\xcc\x54\x1c\x78\x71\x23\x6f\x13\x3c\xdf\x1f\x4a\x5a\
+\xe8\x19\x24\x75\x42\x89\xf8\x83\x4c\x91\x4c\x47\xc1\x1d\xd5\x19\
+\x44\x86\xea\x5c\xb6\x01\xbc\x2c\x2a\xc2\xee\xf3\xa1\x70\x38\xd9\
+\x17\x56\xe0\x33\x83\x58\x64\xef\x86\xf2\x2e\x4c\xdd\x1d\x86\x32\
+\x40\xda\xe7\x7a\xdf\x24\x95\x74\x3e\x17\xd3\x05\xba\x48\x1d\xfd\
+\xc4\x05\xfc\x91\x52\x1b\x72\xce\x4f\xfc\xc7\xe5\xbd\x7e\x29\x50\
+\xd3\x2a\x42\xfe\x42\x1a\x71\x17\xf6\x9c\xd8\x7b\x5c\x49\xaa\xbc\
+\xec\x8c\x5d\xc8\x34\xc0\x72\x53\x03\xb9\x0b\xe9\x98\x71\xd0\x3b\
+\x36\xd8\x54\x1d\x83\xdc\x4f\x1a\x8a\x3a\xa3\xed\x11\x1c\xb2\xc4\
+\xc1\x97\x80\x08\x94\x64\xca\x03\x2b\x36\x15\xa6\xe9\x56\x51\x06\
+\x53\xe6\x87\xbb\x8f\x87\x74\x63\x24\x3a\x5e\x89\xb2\xbd\x9f\xa9\
+\x50\x9e\x41\xc2\xa5\x17\xbf\x1b\x2e\xef\xfb\x28\xfa\x7d\xe7\x62\
+\x08\x8f\xea\xbd\xbf\x01\xce\xf0\xaf\x47\xa0\x72\x9e\x21\xe4\x90\
+\x96\x4f\xd7\x00\x41\x5d\x3e\x4a\xe8\x4f\xb6\xef\xa7\xba\xf9\x35\
+\xd7\xfb\x19\x69\x85\x9d\x95\x66\x64\xdd\x93\x99\xa6\xa9\x1b\x8e\
+\xe6\x8f\x10\x7c\xcf\xb0\x0e\xbd\x33\x66\x3c\x04\xbc\x1a\x53\x06\
+\x48\xea\x78\x39\xff\x94\xd7\xe5\xd4\xb1\x29\x16\x21\xbf\x3d\xf9\
+\x41\x8f\x69\xc4\x75\x95\x5e\x40\x5c\xfc\x60\x4b\xa7\x09\x0e\xdf\
+\x1c\x3a\xd9\xd2\x08\x3e\x33\xca\x74\x21\x72\x2c\x2c\xfe\x0e\xfc\
+\x93\xee\xe0\x81\xef\xa8\x0e\xf5\x22\xf7\xd2\x74\xda\x06\x3c\xce\
+\xd4\x80\xaa\xfe\x25\xea\xaf\x16\x0d\x53\x1a\x03\xda\x58\x60\x0a\
+\x17\x68\x36\x78\x2f\x09\xb4\xdc\x83\x8b\xcf\xf1\x50\x84\xd5\x97\
+\x40\xcc\x14\xa3\x2f\x2a\xae\x4b\xda\x48\xfa\x4c\xab\xa2\x9b\x56\
+\x51\x4f\xf7\x2c\xe4\xbe\x3e\x5d\x3e\xb3\xf8\xc6\x0d\xf7\x6c\xf4\
+\x15\x57\x16\x29\x8d\x97\x0a\xe3\x05\xaa\xc8\x02\x9f\xb9\x3b\xf6\
+\x58\x12\xe8\xe3\xfd\xea\xaa\x7c\x24\x46\x8d\x82\xc5\x31\x33\x70\
+\x9a\x14\x1a\x52\xd2\x39\xad\xc6\x40\x4e\x06\xf0\x50\xf1\xfd\x00\
+\xb8\x9b\xa7\xc9\x3f\xae\x6c\x9b\xdf\xb4\xf2\xeb\xad\x9a\xdf\x32\
+\x94\xbe\xa7\x3c\xf0\x59\x41\x3c\x01\xbc\x9d\xae\x23\xe4\x0e\xf8\
+\xe4\xc6\x90\x52\xb3\x1b\x8a\x21\xa2\x66\xcd\x82\x88\xb9\x82\xb3\
+\x7d\x78\x5a\x9d\xbe\x46\x2e\xb8\x72\x32\x80\x27\x49\x73\x3e\xf0\
+\x84\xbf\x30\x78\xd7\xfa\x5b\xaf\xcd\xab\xfb\x54\xbd\xca\x69\x92\
+\x29\xb7\xc0\x71\xf5\x7d\x9c\x9c\xda\x2a\xed\x16\x76\x56\x20\x5b\
+\xe3\xce\x0d\xcd\x61\x9b\x85\x86\x3a\xd6\x3e\x29\xab\xb2\x7a\xd4\
+\xdc\xc0\x7b\x1d\x27\x54\x10\xeb\x53\xc3\xbf\x84\x01\x8c\xa4\xc0\
+\x17\x81\xef\x32\xb2\xfe\xd6\xbc\xaa\xa9\xb9\xf5\xa6\x56\x2d\x2f\
+\xe8\x53\x45\x88\x93\x4d\xba\x09\x59\x36\x78\x0f\x20\xc6\xb2\x53\
+\xe5\x79\xcb\xc9\x7b\x14\x8d\x54\xac\xd8\x42\x73\x95\x09\xa8\xab\
+\x0d\x22\x4f\x43\x69\xc9\xb0\xb1\x99\xc9\x47\xff\x3b\x4a\x91\x74\
+\x4c\x11\x0f\x93\x1a\xc0\xb2\x7f\x19\x13\xef\x27\x0a\x67\x14\xdc\
+\xbc\xf6\xe6\xd5\x79\xf5\x4b\xeb\xdc\x4c\x32\x23\x0d\x76\x12\x32\
+\x6b\x22\x65\x9c\x20\x1e\x0b\x58\x05\x76\x0c\xbc\x70\xc1\x0b\x27\
+\x91\x53\x06\x6b\xbc\x67\xcb\xe6\xc0\xcc\x20\xca\x8b\xfd\x85\xa2\
+\x5f\xdf\xb2\x94\xab\xbc\xee\xf4\xd0\x9c\x98\xb0\x73\x32\xe0\x17\
+\xe4\xfa\x0f\x81\xef\x8d\x02\x8f\x2d\x5a\xd3\xd4\xb4\x72\xc7\x4a\
+\x2d\xcf\x2f\x54\xfb\x44\x77\xb3\xc8\x34\x65\xac\x2c\xe0\xee\xa7\
+\x97\xdf\xdb\x48\xa7\xca\x02\x1e\x78\x3b\x0d\xde\x16\x63\xd9\xa8\
+\x1c\x9a\x5b\x4e\x96\x16\xfb\x51\x5f\x1d\xf0\xc7\x42\xc6\xfa\x56\
+\x81\x06\x32\xe1\x03\x26\x2e\xd1\x8b\x19\x31\xce\x80\xef\x00\xe5\
+\x84\xfa\xd2\xa6\xdb\xda\x82\xb3\x9c\x82\xdb\xe5\xba\xe1\x06\xaa\
+\x39\xd6\xfa\x48\x1f\x5e\x1e\xd7\x1d\xa5\x94\xa9\x83\x0d\x8b\x29\
+\x82\x70\xf2\x1e\xa5\x36\x69\xea\xa4\xc1\x8b\x34\x78\xcf\x70\xe7\
+\x9f\x4b\xaf\xc2\x3c\x1f\xe6\xd5\xe7\x69\xb1\x21\x73\xe9\x95\x86\
+\x68\x23\x71\x3f\xea\x50\xf9\x91\x79\x49\x03\x48\x14\xab\x91\xbc\
+\x5f\x7c\x4d\x43\xc0\xc7\xd3\xd2\xe1\xba\x07\xdc\xcc\xe0\xba\xbc\
+\x32\xcb\x4a\x28\xba\x38\x79\x3d\x0b\x13\x93\xf4\x91\x94\xf0\x3b\
+\x20\xe1\x78\x57\xb8\xdf\x45\x86\xe7\xb3\x3f\xd3\xdf\x6d\x19\xe0\
+\x02\x0b\xea\x83\xd0\x0c\x51\x57\x11\xb1\x6f\x20\xa5\x22\x07\x55\
+\x71\x33\x2e\x2e\xb2\xbb\x06\x62\x17\x70\x6b\x75\x7d\xc9\xcc\xc2\
+\x42\x9f\x0b\xde\x1a\x9f\x02\x3b\x7d\xa0\x2c\x75\x91\x5d\x04\xa7\
+\x24\xb4\x90\x20\xf8\xa8\xec\xf1\xf0\x76\x90\xa9\x86\x8f\x5f\x9c\
+\xb3\x5a\x8c\xed\x84\xc0\xe4\xa0\xb3\x29\x25\xdb\x2b\xb5\x33\xfd\
+\xa8\x28\xf6\x15\x98\x23\xd6\x75\x57\x08\x24\xde\x56\x49\x5e\xba\
+\xe1\x3b\xe1\x24\xa6\x79\x47\xc2\x03\x51\xc5\x71\x2f\xa3\x1c\x97\
+\x5d\x66\x74\xd0\x9c\x85\x65\x56\x69\xb0\xa2\x32\x11\x37\x6c\xf4\
+\x24\x4c\x1c\xef\x8a\xe1\x95\x57\x42\xb8\x10\x49\x39\xab\xc8\x1d\
+\xf1\xe8\x21\x30\x1e\xb8\xd3\x4a\x49\x83\x77\x7d\x24\xc6\xc4\x2b\
+\xc1\xe5\x0a\x4a\x7c\x28\x28\xd4\x34\xba\xff\x0a\x4e\xd7\xc2\x51\
+\xe8\xe1\x9d\x60\x00\x49\x73\x66\x30\x14\x55\xb5\x89\x97\x22\x7b\
+\x7d\x1b\x4f\x5d\x64\xa0\xca\x7b\x04\xee\x65\x95\x31\xe6\x35\x9d\
+\x5c\xed\x0c\xc1\x87\xda\x23\x51\x96\x83\xcf\xee\x3b\x30\x64\x8f\
+\x46\x0c\xb7\xcc\xb1\x1d\xee\x67\x7a\xda\xce\x02\x8f\x0c\x3a\x59\
+\xb6\xec\x4e\xc8\xe6\x96\x85\xae\x38\x77\x35\x2a\xec\xc3\x0a\x62\
+\x41\x26\xee\x80\xf7\x85\xb9\x7e\x90\x61\xfb\x63\xe6\xfb\xf7\x54\
+\xd7\x95\x8e\xe9\x75\x76\x2a\x9c\xe1\x35\x83\x7f\x93\x1d\xb4\x38\
+\x73\x7a\x09\xbe\xf7\x6c\x0c\x91\x9e\x44\xf8\x01\xe0\x99\xd3\xb2\
+\x7b\x26\xc4\x23\xd6\xeb\x83\xb7\x6f\x5a\x57\xe9\x2b\x95\x94\xbc\
+\x18\x7d\x5c\xf0\xde\xff\x4b\xf0\x72\x5e\x83\xdf\x87\xb9\x03\xfd\
+\xe7\x4d\x59\x96\x1d\x1b\x50\xfc\x1f\x42\x46\x6b\x25\x6d\xc0\x0c\
+\xda\x90\x57\x96\xbf\x63\xe3\xd6\x66\x2d\x58\xe0\x1f\xeb\x14\x7b\
+\xd4\x71\xb5\x42\x73\x29\x21\xbb\x67\x29\xda\x16\x25\xef\x3b\x63\
+\xcc\xe9\x4f\x46\x31\x38\x98\xea\x25\xf8\xbd\x21\x75\x92\xee\x7f\
+\x84\x05\x50\x95\x4c\xd4\x0e\x0e\xdd\xbb\xa1\xad\xdc\x57\x56\x14\
+\x98\x40\x1f\xe1\x25\x80\xee\x8e\x08\x5b\x35\x75\x25\xff\xa3\xa4\
+\x64\x28\x21\x10\x39\x6f\x89\xdd\x2a\xd9\xeb\x86\x52\xa3\xf4\x29\
+\x9d\x0e\xe2\xeb\x81\x0d\x73\xe7\x94\xae\xaa\x9b\x5d\x92\x6e\xf9\
+\x09\x73\xac\x86\xd5\xdc\xc9\x65\xeb\x43\x37\x15\xf8\xe1\x94\x85\
+\x33\xa4\x48\xff\x47\x11\x74\x8f\xe8\xed\xf7\x03\x07\xe8\x29\x3a\
+\x1f\x7b\xa1\x16\x0c\x51\x39\x8e\x2c\xe4\x97\xd8\xb9\x64\x2b\x4f\
+\x5b\x2d\x2f\xa0\x7a\xa9\x5e\xa0\x2a\x8f\xc3\x01\xcf\x15\x95\xf7\
+\x5d\xf0\x5d\x5c\xa4\xbf\xd3\xc4\xdb\x26\x5e\x79\x5e\xe5\x48\xb2\
+\xb5\xde\x9e\xb9\x03\x69\x03\xae\xa1\x55\xc1\x91\xd4\xce\x45\x0b\
+\x4b\x34\x22\x54\x1c\x77\xfb\x95\x72\x52\xa7\x6b\x66\x49\xef\xf0\
+\x68\xa0\xd6\xf7\xb1\x0c\x3c\x1b\xd6\x31\x74\xf4\x82\x38\x9c\xb0\
+\xde\xf8\x09\x81\xc6\x95\x42\x48\xf0\x32\x2d\x1e\x75\x75\x3b\x4e\
+\x23\x8e\xce\xa7\x2b\x62\xdd\x7a\x5b\x5d\x55\x40\x19\xe1\x7a\x59\
+\xda\x20\x3d\x6e\xda\xaa\xad\x28\x3f\xe3\x9c\xbf\x93\xe0\x43\x5d\
+\x26\xce\x24\xc4\xe1\x5f\x33\xb3\xb1\x55\x99\xf9\x26\xb2\x2a\xb5\
+\xb4\x01\x5c\x71\x60\xa3\xc0\xf6\xaa\x22\x5f\xe5\x8c\x52\x3f\x34\
+\xba\xc5\x72\x27\xb6\xdd\x6e\xb1\xee\x48\x24\x0b\xf0\xa4\x85\x73\
+\xa1\x24\xa2\x27\x22\xf6\x0b\xb6\x78\xe6\x77\xdc\x5a\x4b\x79\x5c\
+\x82\x97\x46\x44\x33\x16\x91\x07\x45\x9c\x12\x7d\x6c\x9e\x34\xa2\
+\x57\x6f\xab\xad\x0c\x68\x05\x79\x9a\x43\x49\xa7\x17\x4a\xc7\x24\
+\xe5\x6f\x01\xdc\xd9\x28\x9f\xee\x4f\x09\xf4\x10\x7c\x57\x4c\x1c\
+\x7f\x10\x78\xcf\x70\x5a\xab\xd8\x87\x49\x9a\x5b\x69\x03\x58\x51\
+\x58\x9b\x81\x7c\xf3\x82\xb9\x79\xfe\xbc\x22\x32\xc8\x4e\x4f\xee\
+\x2c\x40\x5f\xf6\xeb\x16\xce\x46\x4c\x0c\x74\x44\x11\xee\x4b\x9e\
+\xff\x25\x2b\xa9\x97\x55\xb3\x55\x96\x81\xfb\xa1\x1a\xb0\x93\xfd\
+\x28\xe7\x18\xc1\x87\x8e\xce\xe5\x4e\xc7\x43\xfa\x9a\x9a\x99\x7e\
+\x5f\x3e\x8d\xa0\xea\x62\x88\x0a\xd6\x43\x8f\x77\x86\xe8\xf1\x33\
+\x06\x46\xc3\x54\x9e\x04\x8e\xb2\xcc\x3c\x94\x54\x4d\xad\xbd\x2e\
+\x75\x26\xd4\x0a\x99\x07\x99\xe8\x23\x80\xc5\xba\xbd\x2d\x4f\x13\
+\x95\xa5\x33\xf3\x9c\x8e\x41\xdc\x92\x4a\x60\xa3\x3b\x6e\xa1\xe7\
+\x5c\x1c\x17\x3a\x62\xe2\xfd\xa4\xb5\x8f\xc1\x7a\xe8\x9c\x6a\xb6\
+\xee\x73\x0d\xe8\xc6\xa5\x53\x60\xc7\x08\x72\xe0\x38\x4f\xfb\x44\
+\xb2\xdf\x58\x53\x51\xe6\xf3\x51\xaa\x70\xb2\xd7\xc0\xc0\x59\x53\
+\x74\xc6\xc5\xfb\x8f\x0a\xbc\xca\xed\x3c\xf2\x18\x4f\xdd\x84\xda\
+\x4d\x2a\xb2\x53\xe8\x24\x26\x9b\x34\xfb\x57\x94\xc0\xb7\x81\xcf\
+\xaf\x62\x32\xd7\x3c\xb7\xb0\xbc\x88\x15\xd3\x30\x81\x87\x59\x78\
+\xc7\x07\x74\xd1\x63\x8b\xe3\x7f\x26\xf0\x0f\x15\x45\xe4\x0f\x0d\
+\x6f\xbb\x5e\x97\x7c\xb7\x90\xdb\x25\x95\xaf\xf6\x76\xe0\xb6\x56\
+\x0d\xf7\xb3\xb2\x0c\x76\xdb\x78\xef\xaf\x9c\xef\x84\x02\x29\xd3\
+\xe8\xb3\x50\xa5\x65\xa7\x3b\xe2\x93\xec\xea\xa4\x06\xc8\xab\x64\
+\x0b\xb0\x75\x3d\x70\x67\x2d\xb0\x94\x3b\x9c\xe2\xde\xb5\xbf\x00\
+\x9c\xe3\x02\x49\xa1\x26\x94\x3f\x34\xc8\x54\x57\x2a\x43\xea\x62\
+\x93\x4f\x61\x44\xcd\x36\x60\x3b\xe7\x6e\xa4\x9b\x83\xee\x0e\x1e\
+\x71\x1d\x22\x5b\x89\xa6\x4b\x19\xe3\x52\xf3\x6b\x17\xb9\x27\x7f\
+\x44\x5b\xc4\xb1\x02\xea\x97\x16\xb9\xfd\x03\xee\xe4\x52\x26\x25\
+\xef\xa3\xd3\xf0\xfa\xc5\x8c\xa8\xe4\x98\x03\x75\xb2\x0e\xb8\xf3\
+\xc6\xa7\x33\xaf\x76\x89\xfb\x32\xdf\x28\x73\x3f\x85\xeb\x8d\xe8\
+\x74\x17\x98\xe2\x92\xc0\xbd\x5f\x34\x75\x5c\xa2\x70\x99\xae\x01\
+\x17\xfb\xfb\xc7\xff\xc9\xff\x93\x6b\xfc\xf5\x3f\x5e\x04\x75\x8f\
+\xce\xe3\x03\x8e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x09\xf5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x36\x20\x4d\x61\x69\x20\
+\x32\x30\x30\x33\x20\x30\x39\x3a\x30\x30\x3a\x35\x38\x20\x2b\x30\
+\x31\x30\x30\x71\x7e\x34\xbc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x17\x3a\xef\x05\xd5\xd4\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x09\x4d\x49\x44\x41\x54\x78\xda\xd5\x59\x79\x90\x14\x57\x1d\
+\xfe\xba\xe7\xd8\x9d\x65\x6f\x60\x83\xee\x01\xd9\x0d\x1b\x48\xb8\
+\x17\x50\x44\x22\x2e\xd9\x8a\x21\x56\x42\x84\x92\xb0\x05\x49\xe5\
+\x28\x62\xa9\x49\xaa\x3c\x8a\xf2\x2f\xc9\x1f\xd1\x52\xcb\x23\x96\
+\xb5\x28\x26\x60\x40\xc0\x4a\x34\x4a\xa0\x44\x4d\x22\x84\x23\xe2\
+\x86\xc8\x11\x30\x82\x06\xc2\xb2\xc7\xc0\xce\xce\xec\xcc\xec\xec\
+\x1c\x7d\xf9\x7b\x7d\xcc\xf6\xcc\x74\xf7\xcc\x20\x9b\xc4\x37\xf5\
+\xab\xee\x79\xaf\x8f\xef\x77\xbe\xaf\xdf\x03\xfe\xcf\x1b\x97\xe7\
+\xff\x47\xb5\x29\x39\x80\xbb\xba\xba\x0e\xa5\x52\xa9\x06\x51\x14\
+\x39\x45\xd1\xc6\xb3\x8f\xc6\xb9\x24\x49\xe0\x38\x0e\xb2\x2c\xa3\
+\xc4\x57\xd6\x28\xc9\x3c\x24\xba\x44\x91\x15\xea\x07\xf5\x67\x1e\
+\x25\x49\x56\xdf\xa4\x8d\x2b\x70\x41\x44\x2a\x19\xbf\x62\x8c\x67\
+\xbf\x47\x96\x25\x15\x9a\xa2\xc8\xea\x7b\x58\x3f\xcf\xf3\x24\xae\
+\xde\x67\x9e\xf9\xce\x5a\x1a\x0c\x92\xa4\xd8\xb5\x6e\x03\x98\x20\
+\x08\x8d\x2b\x57\xae\x6c\xae\xac\xac\x54\x81\xb1\x1b\x73\xd4\x36\
+\x29\x62\xb4\x57\x5e\xf9\x03\xda\xdb\xef\xb4\x36\x93\xa2\x19\xcb\
+\xb8\x8d\x1d\x99\x1c\x39\xf2\x06\x3a\x3a\x56\x36\x93\x1d\xd4\xff\
+\xec\x38\x66\x1c\xed\xdc\x7c\x64\x50\xc2\xe1\x10\xf6\xef\xdf\xce\
+\x53\x57\x07\xc9\xab\x24\xfe\x0c\x05\x98\xe5\xeb\xea\xea\x50\x55\
+\x55\x55\x9c\x33\x39\x37\xa6\x4f\x9f\x6e\xab\x80\x21\x64\x93\xf4\
+\xf1\xe0\xe1\x23\xa8\xaf\xaf\xcf\xe8\x33\x24\xfb\x3f\x53\x80\x8c\
+\x0f\x8f\xa7\x1c\x89\x44\x82\x59\xf5\x66\x12\x9f\xf1\x0e\x43\x01\
+\x35\x6c\x98\xe5\x8b\x0e\x46\xc5\x7e\xcc\xec\x44\xe3\x5c\x0d\x19\
+\x38\x83\x36\xf7\x8d\x79\x48\x32\x22\xc0\x03\x2d\xf4\x99\x28\xbc\
+\xf1\x02\xc9\xf0\xd9\x0d\x6e\x0c\x70\xb6\x64\xf7\x5b\x5d\x9b\x6b\
+\x08\x59\xcd\xa9\xec\xc6\x8f\x5d\x34\xbe\x05\xc8\x0c\xdc\x4e\x49\
+\xe7\x7e\xce\x12\x63\x5a\x81\xeb\x09\x1f\xfd\xb9\x05\x81\xcf\x00\
+\xa3\x70\xb6\xd6\x76\x52\x88\x55\x25\x5b\x05\x3e\x88\x66\x07\xac\
+\xd0\x71\xab\x2a\xc8\x3b\x0d\x16\xd6\xae\xf7\xbe\xe2\x14\xd3\x8e\
+\x0e\x21\x64\x77\xc1\x8d\x6a\x99\x21\xa3\x64\xf4\x17\xda\xac\xc2\
+\x3c\xc3\x03\xd7\x9d\x07\x1f\x50\xcb\xeb\x81\x8f\x76\x53\xf2\x7b\
+\xe0\x46\x59\xe5\x46\xdf\xa3\xf1\x25\xeb\xfb\xd2\x54\x82\x29\x40\
+\x7c\x88\x4d\xd7\x45\x1a\xa6\x78\x27\x52\x15\x25\xea\x92\xc8\xa0\
+\x1a\x06\x50\x97\x4b\xa3\x0e\x46\x9f\x61\xf4\x92\x12\xc9\xb2\x8c\
+\xba\xcd\x7f\xf6\xee\xdd\x4b\x9c\xc3\x8d\xe2\x9a\x8c\x5f\x6c\xfd\
+\x65\x91\x1a\xb8\xb0\x67\xcf\x6e\xdd\x70\x28\xe8\xc8\x8c\xab\xb2\
+\x5a\x3b\x05\x58\x7c\xad\x5f\xbf\x01\x6e\x77\x71\x0a\x6c\xdf\xb1\
+\x03\x8f\x3f\xf6\x68\x7e\xcc\x26\x52\xb7\x75\xdb\x36\xac\x5b\xb7\
+\x41\xb5\xb4\xc1\x77\xcc\xd7\x98\xbd\x62\xd0\x9f\x68\x34\x82\x53\
+\xa7\x8e\x3b\x7b\x20\x91\x88\xa3\xb6\xb6\xb6\x38\x63\x4a\xd7\x43\
+\x00\xe9\x9b\xc0\xe5\xc9\x21\x6d\xd9\x84\xce\x10\xa6\x68\x28\x94\
+\x1c\xaf\x89\xac\x18\xe0\xb9\xd6\xce\x1e\xb3\x82\x31\x56\x7c\xc6\
+\x83\x0b\x15\x01\x3c\x1b\xb0\xd3\x58\x76\x72\xb3\x2f\x39\xc7\x24\
+\x1e\x6f\x36\x9a\x9d\x94\x66\xa0\x76\xff\xcd\x7d\x9a\x7d\xc7\x85\
+\x8d\x3a\x2b\x9e\x9d\x98\x56\x21\x64\x37\x96\xe9\x01\x15\x65\xce\
+\xf3\x33\x3c\x70\x7d\x69\x60\xaf\xb8\x15\x78\xbb\x8a\x93\x4f\x99\
+\xbc\x1e\x60\xf1\x65\x38\xc1\x2e\x99\xac\x5a\x73\x73\xb3\x2d\xf8\
+\x42\x81\xe6\xbb\xc6\x98\x89\xf3\x7c\x0f\x70\x63\x9a\xb2\x59\xf9\
+\x4c\x37\x12\xbb\xb6\x38\x82\x17\x07\xaf\xa1\x62\xcb\x0f\x10\x39\
+\x76\x08\x8a\x29\x04\xb3\x3f\xe4\x0b\x51\x20\xdb\x70\xe6\x73\xf6\
+\x1c\xf3\xf2\x8b\xad\x07\xd8\x2c\xcc\xbd\xf9\x17\x0c\x3e\xf0\x69\
+\x0c\xac\x59\x82\x81\xa7\x9f\x84\x78\xf2\x6f\x96\x1e\x91\x63\x23\
+\x38\xd7\xf9\x79\xf8\x4e\x1f\xc6\xe9\x55\xed\x38\xd9\xbe\x08\x81\
+\x9d\xcf\x43\x1c\x8d\xe7\x80\xcb\x56\x04\x5c\x7e\x0f\xe4\x86\x90\
+\x75\xae\xa5\x15\x68\x68\x68\xf0\x96\xed\xdb\x01\xff\x63\xf7\xa0\
+\x6c\x62\x0a\x53\x9f\x5a\x8d\x8a\xe6\x7a\xf4\x7e\xfb\x6b\x34\x59\
+\x49\x19\x0f\x94\x05\x11\x17\x36\x76\x82\xeb\x3d\x87\x79\x6b\x67\
+\x61\xd9\xaa\x56\xd4\x2b\x3d\x38\xbf\xe9\x4b\x78\xf7\x89\x47\x2c\
+\x97\x4a\xcc\x8a\x40\xe6\x0a\x52\x20\x53\x64\x67\x36\x3a\x75\xea\
+\xb4\x12\xe1\xd7\x3f\x43\x45\xc7\x42\x94\x2f\x9c\x01\x5c\x1b\x41\
+\x79\x4b\x23\xa2\xef\x9c\x40\xe4\xc5\x17\xd8\xba\x11\x92\x49\x41\
+\x5d\xbd\xe8\xfd\xd6\x57\x11\x23\x4f\xcd\xfe\xc2\x6c\x60\x30\x0e\
+\x39\x2c\xa0\x97\x66\x56\x91\x4c\xeb\xbb\x7d\xae\x25\x00\xb3\x22\
+\x1c\xcf\xd1\xec\x2a\xd0\x5b\x05\x0a\x0d\x41\x3d\x77\xb9\x04\xa2\
+\x31\x02\x45\x81\x00\xaf\x57\x20\xf2\xa6\x89\xcf\xa7\xc9\xa4\x49\
+\x3e\x4b\x0f\xa4\xab\x50\x20\x30\x28\x06\x5a\x17\xa0\xec\xfc\x51\
+\x94\x7f\x7c\x0a\x90\xa2\x07\x78\x5d\xa8\x9b\xd3\x82\x7f\x6f\xfe\
+\x26\x5c\x75\x8d\x88\x95\xf8\x50\xfb\xf2\x4e\x44\x5f\xdc\x86\x85\
+\xeb\xe7\x83\x0b\xc7\x81\x98\x80\x13\x81\x04\x82\x3d\x61\x78\xea\
+\x5b\x11\x58\xb4\x14\x7f\xdd\xfe\x5c\x9e\x99\xdd\x4d\x64\x6e\x67\
+\x46\xb2\xdb\x9d\x1b\x49\x2c\x08\x29\xcb\x67\xa6\x15\xe8\xef\x1f\
+\x48\x55\x77\x6e\xc4\xd5\xce\xdf\xa0\xae\x7d\x3e\xbb\x15\x9c\x8b\
+\x43\x4d\x7d\x2d\x42\x97\xfc\x50\x76\x76\x61\xf2\xed\x0b\xd0\xbb\
+\xfb\x39\x2c\x78\x70\x01\xdc\x02\x99\x34\x92\x42\x7f\x24\x89\xfe\
+\xd0\x28\x2a\xc3\x12\x16\xff\x6e\x17\xbc\x33\xe7\x62\xde\xa2\x65\
+\x8e\x5e\xd8\xf5\xd2\xaf\x70\xdf\xbd\x6b\xd2\x09\x6a\x3e\x5a\xe5\
+\x01\x6b\x31\xca\xb9\xee\xee\x37\xec\x15\x18\x1e\x0e\x49\x72\x6b\
+\x1b\x70\xf3\x6d\x88\x9c\xbb\x8c\xca\xa6\xc9\xe4\x05\x09\x5e\x52\
+\xa2\xb9\xad\x19\x6f\x1f\xd8\x87\xe0\x81\xbd\x58\xf8\x50\x1b\x4a\
+\x18\xa1\x0f\x8e\x42\x4c\x8a\x78\x6b\x28\x81\xf2\xde\x08\x5a\xbe\
+\xfe\xb4\x0a\xde\x58\xef\x74\x12\x4e\x56\x50\x56\x56\x81\x78\x7c\
+\x8c\xfb\x73\x9c\xb5\xb2\x46\x05\x1a\x19\x19\xb5\x2c\xed\x19\x64\
+\x2e\x29\x28\x98\xf4\xc5\x47\x31\x70\xfa\x22\xe0\xe5\xf4\xbb\x65\
+\x78\x4b\xdd\x98\xb5\xb4\x85\x2c\xbf\x10\x25\x1c\x7d\x71\x0c\x8d\
+\x02\xc4\x42\xdf\xbc\x16\x87\xcf\x1f\x41\xc5\xfc\x4f\xe1\xa6\x27\
+\x36\x51\x9e\xe4\x26\xae\xa5\x17\xe8\xc7\xc0\xe7\x2b\xb7\xb9\x92\
+\x87\x8d\xa6\x28\xee\x27\xac\x7e\x98\xb8\x37\x51\x6b\xff\xb0\x36\
+\xf1\xa9\x74\x59\x41\x45\x7d\x15\x7c\x22\x3d\x60\x28\xa6\x3e\xed\
+\xfc\x50\x1c\x91\x60\x0c\x4a\xcc\x85\xdb\x9e\x7d\x9e\x0a\x8b\xc7\
+\x71\xad\xd3\x3c\x96\x59\x1e\x0b\x05\x9f\xa7\x8c\x32\x05\x44\x02\
+\x28\x4d\xa8\xc6\x94\xb5\x0f\xe3\xf2\xf1\x0b\x63\x5e\x60\x12\x4f\
+\x01\xd1\x84\x7a\x3e\x44\xc7\x7f\x06\x46\xe1\xbd\x12\x41\xed\x53\
+\x94\xe0\x53\x5b\xd5\xd0\xc9\x06\x9f\xaf\xbe\x67\x5f\xe3\xac\x8c\
+\xec\xec\x01\x16\x67\xbc\x5a\xde\xe8\x38\xa5\x01\xfe\xf7\xc2\x10\
+\xa9\xde\x83\x63\x4f\xd6\xd1\x31\x6f\x50\xfc\xf6\x8f\x50\x69\xeb\
+\x09\x61\xe2\x27\x3f\x0b\xb1\xfd\xae\x74\xe8\x64\x83\xb7\xf3\x02\
+\xd4\xcd\x11\x7b\xf0\x76\x8a\x58\xf1\xc6\xb4\x02\x8d\x8d\x4d\xde\
+\xf2\x54\x14\xfe\xaf\x3c\x80\x9e\xef\x6e\xc2\xdc\xb5\x73\xe0\xae\
+\xf6\x42\x43\x27\xe9\xe0\xb5\x05\xfb\xd9\x35\x5e\x2c\x99\x35\x09\
+\x7e\xa2\x10\xdc\xef\x5f\x02\xfb\x0a\x75\x5a\x2e\xcf\xf5\x80\x92\
+\x01\xf6\x7f\xc9\x01\xb5\x0a\x6d\x26\xe5\xe6\x05\xfb\xab\x2f\xde\
+\xbd\x08\x55\x35\x54\x0e\xbf\xbc\x0c\x7c\x92\x40\x5f\x09\x23\x1d\
+\x1b\x66\xa1\xc4\xae\xaa\x2d\xc5\xb2\xc5\x13\x71\xb0\xeb\xc7\xb8\
+\x48\x25\x75\xda\xe6\xef\x23\x25\xba\x0b\x66\x9d\x76\xa0\x2d\x67\
+\x6e\x38\xe7\x00\x77\x5f\x1d\x76\xba\x7f\xfe\xbd\x09\xb7\xde\x51\
+\x87\x19\xf7\xcf\x01\x3f\x48\x89\x7a\x35\x02\x23\x36\x14\x41\x82\
+\xc4\xc2\x49\xd1\xc3\x89\xb1\x42\x45\x42\x65\xa5\x17\x77\x2f\x9d\
+\x84\xcb\xdb\x9e\xc5\x89\xce\x7b\xc1\x8f\x04\xf4\xbd\x31\xeb\x10\
+\x72\x52\xac\x30\x4f\x58\x53\x09\xd6\xdf\x36\x73\x45\x2b\xaa\x3f\
+\x56\x01\x5c\x0a\xd2\xac\x41\xc9\x2a\x6a\x96\x17\x12\x02\xfe\x48\
+\xb3\x6c\x20\x94\xd0\xbc\xc1\x1e\x22\xea\xf9\x40\xff\xbd\xa5\x1c\
+\xee\x59\x5a\x03\xd7\x3f\x5e\xc3\xc1\xcf\xb4\x61\xf4\xcc\xdf\xd3\
+\xab\x0d\x56\x5c\xc8\x3c\x71\xd9\x85\x99\x1d\x87\xb2\x5b\x5a\xe4\
+\x62\x12\x7a\xa2\x03\x14\x2e\xc3\x71\xcd\xea\xea\x6e\x8d\x8c\x14\
+\x55\x9e\x3f\xf5\x46\xc1\x53\xc2\xbe\xf3\x56\x3f\x24\x56\x89\x32\
+\xcc\x2b\xa5\x77\xe3\xe6\xcc\xf4\xc1\x1d\xea\x45\xe8\xcc\xc9\x9c\
+\x10\x71\x2a\xa3\xf9\x98\xab\xf9\xbf\xd5\x2e\x12\xff\xf6\x64\x3c\
+\x49\x63\x77\xb8\x7c\x94\x0e\xbc\x92\x8e\xf9\xc1\x50\x1c\x07\x08\
+\xbc\xfb\xfd\x10\x4a\x6b\x5b\x50\xbd\xea\x41\xbc\x7a\x64\x00\x02\
+\x55\x20\xcd\x13\xba\x37\xa8\x2a\x0d\x10\xa5\x38\xd8\x97\x44\x44\
+\x70\xa3\x6e\x79\x07\xf1\x16\x7b\x0b\xab\xcb\x24\x5c\xe6\x06\x87\
+\x59\xd4\x2a\x68\x21\x1c\x4d\xa0\x96\x4b\x8b\x41\x11\x33\x1a\x9b\
+\x2a\x4b\x6e\xba\xa5\x86\x98\x65\x4c\x0d\x8f\x77\x83\x49\xfc\x2b\
+\x48\x14\x81\x92\xb8\x74\xd6\x62\x34\xfd\xe4\x05\xa0\xa2\x56\x65\
+\x9b\x7f\xfe\xed\x0e\xdc\xf5\x89\x1a\x78\x68\x8e\x88\x27\x44\xfc\
+\x67\x44\x44\x0f\xb9\x30\x79\x39\x85\xa6\x0d\x8f\x23\x40\xac\x34\
+\x70\xe1\x6c\xba\xda\x18\xd6\x1e\x9b\x6f\x68\x4a\x21\x5e\xd3\xd7\
+\x77\xc9\x21\xe6\x95\xac\xd0\xe1\x11\x0e\x0f\xb2\x7d\xe2\x5c\x05\
+\x2e\x0a\xd8\xed\xb9\x12\xd9\x78\xab\x3f\xca\xf7\x85\x52\x38\x1b\
+\x4e\x41\x26\x9e\x33\xc1\x4f\xca\x2c\xeb\x88\x5f\x5b\xf7\x50\x74\
+\xcf\x96\x1f\x0e\x27\x93\x09\xb9\x7d\xf9\xf2\xea\xd2\xd0\x60\xe5\
+\xfe\xd7\x0e\x94\xdd\x39\x6f\x02\x8e\x06\x05\x24\x03\x02\x84\xa8\
+\x04\xb9\x6d\x89\x32\xb0\x62\x85\xb8\x6b\xeb\x4f\x25\xb6\xa1\x2d\
+\x1b\xee\x4e\x6f\x70\xeb\x1b\xdf\x14\x9a\x3c\x79\xaf\xfb\xf8\xe1\
+\xcb\xda\x46\x37\xa7\xb0\x8d\x6d\x63\xe3\xdc\xd8\xd8\x36\x26\x57\
+\xe3\xe8\x72\xb9\x90\x48\x08\x43\xd0\x36\xb8\x65\xc3\x3a\xcc\x27\
+\xbe\x97\xab\xb0\xbb\xbe\xc2\xbb\x2a\x55\xee\x45\x82\x2c\x3f\x14\
+\x13\x07\x7e\x94\xc4\xeb\xdd\x22\x19\x1d\xa0\xe4\x40\x5c\xbf\x91\
+\xdd\xe4\x7d\xc4\x85\x5b\x3a\x3c\xdc\x1a\x51\x52\xa4\xb3\x22\x8e\
+\x9d\x07\xfc\xfb\x88\x4a\x11\xe4\x98\xe9\x05\xf9\x9a\xa4\x3f\xb7\
+\xd0\xed\x51\xf6\x6e\x86\xe7\x7d\x92\xd7\x49\xae\x1a\x0a\xf0\x8b\
+\x81\x96\xcf\x95\xe1\x1b\x1e\x05\xd3\x8e\x8a\xb8\x76\x88\x0c\x9b\
+\x04\x7a\x69\xec\x14\xc9\x7b\xfa\x8b\x0c\x50\xbc\x07\xa8\xba\x9f\
+\xc3\xea\x63\x0a\x7c\x7d\x5a\x1f\xbb\xb6\x87\xe4\x12\x49\xb4\x40\
+\x30\x8a\x0e\x5e\x29\xe0\x7a\xa3\x31\x0c\x6c\xf9\x3c\xa4\x1b\x2a\
+\xbd\x4e\x51\x42\x32\x95\x64\x16\x09\x25\x03\x02\x3a\xf0\x3e\x1d\
+\x50\xb6\x95\xd8\x66\xf3\x14\xfd\x1e\xf6\x20\xbf\x7e\xdd\x08\xd8\
+\x67\xd6\xf8\xb7\xb4\xd2\xe6\xb4\x26\xde\x80\x72\x1d\x1c\xd3\x72\
+\x54\x77\x99\x9d\x85\xdc\xfa\x3d\x92\x0e\xfa\x43\xd9\x9f\xfa\x2f\
+\xbe\x0f\xae\x81\x3c\xed\xb4\x07\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x07\xf8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2a\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x4d\x6f\x20\x33\x20\x4d\x72\x7a\x20\x32\
+\x30\x30\x33\x20\x32\x32\x3a\x34\x32\x3a\x31\x30\x20\x2b\x30\x31\
+\x30\x30\xff\x26\x55\x7b\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd3\
+\x0a\x06\x14\x19\x0f\x27\x35\x3c\x79\x00\x00\x00\x09\x70\x48\x59\
+\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\x00\
+\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\
+\x07\x51\x49\x44\x41\x54\x78\xda\xed\x98\x5b\x4c\x1c\x55\x18\xc7\
+\xff\x33\x03\xec\xa5\xbb\x80\x5c\xda\x42\xdb\xa5\xbb\x40\xa9\x80\
+\x54\x5a\xd3\x26\xae\x56\xa0\x5e\x63\x8c\x89\x89\x26\x4d\x7c\xd0\
+\x47\x7d\x52\x1f\x8c\xbe\xf8\xa0\x46\xad\xad\x89\x51\x13\x8d\xfa\
+\xec\x83\x62\x35\x55\x5b\x2f\x0f\xde\x52\x13\xef\xc6\x6a\x45\x6d\
+\xd5\x56\xa0\xb0\x2c\xcb\x72\xd9\xdb\xec\xce\x8c\xff\x33\x97\x65\
+\xb7\xa5\xa5\x65\x41\x6a\xe4\x90\x93\xdd\x30\xb3\x67\x7f\xff\xef\
+\xfc\xbf\xef\x3b\xb3\xc0\xca\x58\x19\x2b\xe3\x3f\x3d\xa4\xe5\x06\
+\xb8\x40\x46\xe3\xbf\x23\xe0\x31\xec\x46\x16\x8f\x42\x83\x1b\x19\
+\x7c\x84\xdf\xf0\x02\x0e\xe0\x17\x5e\x49\x17\x0a\x51\x96\x9b\x73\
+\xce\xb1\x07\xf7\x12\xf3\x95\xa6\xa6\xca\xba\xd5\x6b\xbd\x95\xaa\
+\xa1\x75\xab\x7e\x7d\x37\x02\x88\xe1\x08\x8e\xf3\x0e\xd5\x11\x71\
+\xf1\x09\x10\xf0\x09\x3c\x17\x6a\xae\x52\xda\x37\x04\xd1\x56\xbb\
+\x19\xae\xea\x2c\x74\x25\xe7\x9a\x82\x7a\x1d\x7c\x18\xc3\x31\x53\
+\x84\xb9\x13\x17\x97\x80\xa7\x71\x0f\xe1\x9f\x0f\x36\xfb\x95\x9d\
+\xcd\x61\x5c\x55\x7f\x3d\x1a\x3d\x01\x34\x79\x5b\x10\x93\x07\x91\
+\x95\x54\x65\xba\x5c\xdd\x81\x13\xf8\x11\x53\x18\x16\x22\x2e\x1e\
+\x01\x02\x7e\xc6\x82\xef\x6b\xed\xc1\xe5\xd5\x3b\x30\x96\x1e\xc5\
+\xa1\xa1\xfd\xf8\x2a\x7a\x18\xd0\x65\x78\x7c\x32\xa6\xa6\x55\x77\
+\x36\xa7\xe7\x98\x13\x22\x1f\xc6\x2f\x0e\x01\x56\xe4\x5f\x08\xb5\
+\x54\x29\xbd\xcd\x3b\xd1\x55\xbd\x1d\xc3\xc9\x21\xc2\xf7\x23\xad\
+\x65\x20\xf3\x4f\x30\x43\x92\x60\xd0\xf9\xd3\x09\xb5\x02\xdf\x60\
+\x80\x9f\x3c\x29\x2f\x37\x3b\xe1\x1f\x40\x92\xf0\xcd\x7e\xb9\x27\
+\x74\x35\xba\x2e\x11\xf0\x83\x78\x7f\xf8\x2d\x46\x5d\x32\x53\xd5\
+\x20\xb5\x2e\xe0\x79\x7b\x26\x4d\x21\x29\xca\x05\x1a\x38\x3d\x65\
+\xcb\x0e\x9f\xc0\x5e\x01\xbf\x33\x74\x8d\x09\x3f\x92\x1a\xc6\x87\
+\xc3\x6f\x43\xd2\xc9\x0f\x0b\xde\x20\xbc\x24\x19\x88\x8e\xa6\x10\
+\x3d\x99\xca\xe2\x13\xd6\x22\x2b\x89\xf5\xe5\x13\xb0\x17\xf7\x63\
+\x1a\x7b\x83\x2d\x7e\xb9\xaf\xa5\x0f\x9d\x55\xdb\x4c\xf8\xf7\x87\
+\xde\x82\xae\x5b\x35\x52\xc0\x0b\xcf\x48\xf4\xc9\x38\xe1\x4f\xfd\
+\x3e\xa3\xe2\x1d\xbc\xc1\x24\x8e\xf1\xf2\x51\xce\xa9\xe5\x11\x60\
+\xc1\xef\x13\xf0\xbb\x08\xdf\x41\xf8\xd1\xe4\x30\x0e\x0e\xbf\x69\
+\xda\xc6\x8c\xba\x08\xaf\x80\x57\x24\xc4\x0a\xe1\x7f\x45\x94\x97\
+\x3e\xe3\x14\xbb\x90\xf8\xf7\x05\xec\xc5\x7d\x0e\x7c\x5f\x4b\x2f\
+\x3a\x2a\xb7\x22\x42\xf8\xf7\x06\x09\xcf\x83\x81\x6e\xc3\x1b\xc5\
+\xf0\xd9\x02\xf8\x4f\x38\xbf\xe4\x14\xef\xf5\xb9\x93\xf8\x01\x94\
+\xe3\x11\x78\x60\x1d\x35\x16\xef\xb8\x61\x45\xfe\x19\x07\xbe\xb3\
+\x72\x1b\x22\xa9\x53\x26\xbc\x51\x00\xef\xd8\x26\x36\x62\xc3\xbf\
+\x8b\xd7\x4f\x83\x8f\x70\x6a\xe2\xd6\x62\x01\x2f\xa3\x15\xcf\xe2\
+\x35\xe6\xf7\x38\x3b\x5e\x1c\x4f\x51\x75\x17\x82\xbc\xe2\x5a\x14\
+\xf8\x19\xec\x0b\xb5\x56\xda\x91\xdf\xc6\x3a\x3f\x82\x43\xac\x36\
+\x02\xde\xb4\x8d\xed\x79\x43\xc0\x8f\xa6\x71\xea\xb8\x0d\x3f\x30\
+\x37\xbc\x18\xb3\x7d\xe0\x45\xdc\xc5\xe8\x1c\xa8\xf5\xb9\xb6\x76\
+\x6f\x5c\xe7\x6a\x6d\xac\x55\x86\x26\x27\xdb\xb5\x06\x63\x1b\xfe\
+\xc4\xf7\xbc\x36\xc1\xbb\x72\x25\x44\x7e\x5f\x68\x53\xa5\xdc\x1b\
+\xec\xa1\xe7\xbb\x11\x65\x93\x7a\x77\x70\x3f\x13\x56\xcb\xfb\xdd\
+\x90\xac\x90\x0a\xf8\x11\x01\x7f\xe0\xec\x91\x2f\x16\xf0\x12\xee\
+\x66\x39\x7b\x75\x4b\xb0\xde\xb5\xbb\xeb\x66\xdc\xb8\xfe\x36\x5c\
+\x5e\xb7\x03\x7e\xbf\x8a\xa3\xf1\x13\x01\x2d\x68\x74\xe0\xaf\x05\
+\x8a\xd8\x63\x47\x9e\xb6\xe9\x21\x7c\x67\xf5\x56\x46\x3e\x42\xdb\
+\x08\x78\x3d\x1f\x7d\x61\x54\x56\x4b\x07\x5e\x25\xfc\x1b\xf3\xc1\
+\x5b\x02\x9e\xc5\xa5\x6c\x0c\x6f\x6f\x09\xd6\xb9\xee\x68\xbb\x1d\
+\x2d\xbe\x2d\xf8\x63\x66\x00\x9f\x8d\x1e\xc2\xb4\x36\x89\x86\x1a\
+\x2f\x4e\xa5\x67\x02\xb9\x80\xde\xc1\xf2\xf5\xdd\x05\x89\x10\xf0\
+\x09\x2b\x61\x7b\x43\x3d\x68\x27\x7c\x94\xf0\x07\x1d\xf8\x02\xcf\
+\x1b\xb2\x84\x89\xd9\xc8\x9f\x17\xbc\x25\xa0\x17\x7b\x6a\xab\x5c\
+\xdb\x6f\x6d\xef\xc3\x66\xfa\xf2\xdb\xf1\xcf\xf1\x4d\xec\x53\x64\
+\x75\x15\x59\x2d\xc7\x64\x92\xb1\xae\xd6\x47\x11\x89\x0d\x5a\x13\
+\x45\x1c\xa3\x88\xe4\x79\x88\x78\x1a\x0f\x11\x7e\x8f\x09\xdf\x4c\
+\x78\xda\x66\x22\x13\xc3\x3b\x4c\x58\x07\xde\x69\x54\x50\x8a\xe0\
+\xe7\xb5\x4d\xe1\x90\xb9\x4a\x78\x5d\x8d\x1f\x0d\x9e\x8d\x18\x4a\
+\x9e\xc0\x91\xc9\xaf\xf9\xcf\x72\x7a\xd2\x6a\x26\xe2\xcb\x24\x45\
+\xc6\x8e\x8e\x46\xb8\x1a\xca\xae\xc4\x9d\xdc\xb3\x46\x74\xf2\x92\
+\xe7\x1c\x9e\x7f\x98\xb6\x79\xc2\xaa\xf3\xd7\xa2\xbd\xb2\x1b\x31\
+\x13\xbe\xdf\x5c\x4f\x2f\x80\x17\xb6\x59\x28\xbc\xb5\x03\xbb\x70\
+\xa7\xdf\x57\xb1\xbe\xb1\xba\x86\x5f\x12\x45\x4c\x8d\xe6\xcf\x1f\
+\x4e\x72\x99\x0d\x85\xdf\xd4\x50\xef\x63\xb7\xe4\x4e\x04\x8c\x76\
+\x9c\xc4\x0f\xb4\x53\xec\x8c\x9d\xb0\xe0\x1f\x77\xe0\xdb\xfc\x97\
+\x31\xf2\x51\xb3\x54\x9a\x07\x32\x7b\x6d\x3b\x7c\x88\x47\x52\x18\
+\x39\x96\x10\x75\xfe\x82\xe1\x2d\x01\x57\xc0\x88\x65\xd3\x37\x27\
+\xa5\x98\xbc\xca\x5b\x86\x54\x36\x95\x87\x2f\x7a\xb5\x45\xac\xa9\
+\x5d\x85\x48\x3a\x19\x30\x45\xfc\x7d\x9a\x08\x1b\x3e\xd4\xc2\x52\
+\x19\x12\x96\xec\xb2\xe1\xf7\x23\xa7\x65\x91\x6f\x54\x76\xb5\x99\
+\x60\x93\x1a\x3d\x9e\x3c\x67\x9d\x9f\x5f\xc0\x61\x3e\xdd\x6c\x84\
+\x3a\x2a\x25\xae\x92\xca\xb3\x72\xa5\xa7\xa2\xa8\x2e\xe7\x4b\x9c\
+\xfd\x2a\x72\x62\x75\x9d\x17\xd1\xa4\x2d\x42\x94\xd8\x04\x73\xe2\
+\x49\x3c\xc8\xdc\x30\xe1\x7b\x83\xbd\xd8\x5c\xb5\x85\xf0\xe3\xa6\
+\xe7\x45\x2e\xe5\xd7\xb4\xab\xcd\x62\xc0\x5b\x02\x44\xf4\xbe\xe3\
+\x12\x0d\xc8\x44\xa4\x64\xd8\xeb\x2d\x97\x57\x51\x84\x66\x96\xb8\
+\x33\x77\xc1\xb1\x53\x7d\xbd\x10\x91\x0a\x68\x4d\x46\x17\x76\x22\
+\x4c\xbe\xfb\x42\x9b\x98\xb0\xc1\x5d\x68\x23\xfc\x64\x66\x82\x91\
+\xef\x37\xe1\xe1\x94\x4a\x33\x00\x52\x31\xfc\x00\x9b\xe6\x02\xe1\
+\x1d\x01\x82\x2f\xc5\x87\xb4\x01\x8a\x48\x47\xe4\x64\xd8\xe3\x2e\
+\x97\x7d\x5e\x17\x8c\xd3\xaa\xc5\xe9\x76\xaa\xab\xf3\x20\x5b\xa6\
+\xaf\x57\xdc\x52\xd7\x86\xa0\x4f\xda\x15\xbc\x1e\x9b\xaa\x3a\x08\
+\x1f\x67\x93\xea\x87\x2a\x6c\x63\xa0\xa8\xda\xc4\x99\xb0\x26\xbc\
+\xe5\x79\x01\xff\xf1\x42\xe1\x1d\x01\x62\xe8\xa6\x88\x23\x14\xb1\
+\x06\x99\x31\x25\x19\x76\xbb\xcb\xac\x9d\x28\x80\x76\x04\xe8\xb6\
+\x9d\x2a\x14\x17\xbc\x55\x32\x93\xbb\x0a\xd7\x05\x6e\xc1\xc6\x55\
+\xcd\xb4\x0d\x23\x3f\xf4\x26\x32\x9a\x6a\x25\x2c\x66\x0f\x66\x16\
+\xfc\xc2\x13\xf6\x5c\x02\x66\x45\xfc\xc4\x67\xcd\xb5\xc8\x44\x69\
+\x27\x8f\x57\x88\x28\x9f\xdb\x4e\xf6\x87\x3a\xab\xbb\xd1\xb3\xf6\
+\x26\x54\x48\x2e\xfc\x32\x79\x04\x1f\x8f\x7c\xc0\x6a\xa3\xe5\xe1\
+\xe1\x94\xca\x48\x06\x91\x45\x86\x07\xe6\x3e\x69\x8a\x23\xf6\x1a\
+\xec\xe6\x73\x6a\x1b\x1e\x6a\x6d\xae\x51\x6a\x6a\x3c\xd0\x34\xbd\
+\xc8\x42\xce\xfb\x1c\x75\xf3\x61\x09\x39\x43\xb7\x16\x34\xa4\xa2\
+\x9d\x12\xf0\xf1\x31\x1b\x7e\x9e\x83\x59\xa9\x3b\x30\xe7\x4e\xc4\
+\xe4\x94\x6d\xa7\xb2\x7c\x12\x17\xed\x82\x95\x9b\x8c\x84\xf5\xc0\
+\x9d\xbf\x26\xaa\x8d\x7c\x06\x7c\x49\x09\x7b\xbe\x02\x0a\x45\x98\
+\x89\x3d\x21\xa5\xc3\x2e\x4f\x99\xec\xa6\x08\xfd\x2c\x25\xb6\x70\
+\x57\x9c\x6a\x13\x8f\x9c\x01\x5f\x52\xc2\x5e\x88\x00\x47\x44\xd2\
+\x14\xb1\x86\x22\x40\x11\x5e\x45\xf6\x50\x84\xa6\xcf\xdd\xe8\x1c\
+\x41\xa2\xda\x4c\xfe\x0b\xf0\xf3\x09\x98\x15\xf1\x33\xed\xc4\x3e\
+\x11\x37\x32\xe1\x0a\x26\xb6\x9b\x1d\xdb\xd0\xe7\xde\x05\xab\xda\
+\x64\x30\xf6\x47\x62\xd1\x4a\x65\x29\x02\x1c\x11\x29\x53\x04\x4b\
+\xec\xa4\x94\x09\xbb\xdc\x8a\x5c\xe1\x51\x8a\xfa\x83\x53\x6d\xe2\
+\x11\x15\x63\x22\xf2\xef\x2d\x6e\xb5\x29\x45\xc0\xac\x88\xa3\x96\
+\x88\x29\x8a\xa8\xa0\x08\xb7\x57\x81\xc0\x17\xbf\xdb\x88\x7a\x36\
+\x35\x4e\xf8\x63\x36\xfc\x12\x24\x6c\x29\x02\x0a\x45\x0c\xa0\x06\
+\xd3\xd3\x50\xb7\x27\x93\xb9\x72\x71\xec\xce\xa6\x34\x8c\x0f\xa5\
+\x10\xff\x3b\x9d\xc6\x41\xf4\x17\xc0\x7f\xb5\x94\xf0\x62\x2c\xe4\
+\x17\x07\xd1\x27\x56\xb3\x47\xdc\x80\x76\xdc\x82\x3a\xbe\x13\x27\
+\xb5\x11\x9e\x4d\xbf\xc0\x20\xcf\xa6\x02\xfe\x30\xe7\xd7\x36\xfc\
+\xc2\x9e\xa3\x97\x50\x80\x23\xa2\x9a\xb3\x95\x73\x33\x44\xe3\xb3\
+\xd6\x1a\xe3\x14\xbf\x1a\xff\xc6\x29\x8e\xd9\x4b\x16\xf9\x52\x05\
+\x38\x9f\x75\x73\xfa\x31\xfb\x74\x26\x7e\xaf\x9c\xb6\x5f\xf5\xa5\
+\x86\x2f\x55\xc0\xd9\xd6\x30\x16\xb4\xca\xca\x58\x19\x2b\xe3\xff\
+\x39\xfe\x01\xfe\x79\xc6\xae\x4a\x14\xfd\x64\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0d\x42\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x35\x20\x4e\x6f\x76\x20\
+\x32\x30\x30\x32\x20\x31\x30\x3a\x30\x38\x3a\x32\x39\x20\x2b\x30\
+\x31\x30\x30\xf5\xa2\x62\xc6\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x18\x17\x2d\x42\x95\x6e\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0b\x11\x00\x00\x0b\x11\x01\x7f\x64\x5f\x91\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x0c\x9a\x49\x44\x41\x54\x78\xda\xd5\x5a\x69\x6c\x5c\xe5\x15\
+\x3d\xef\xcd\x3e\x1e\x8f\xc7\xf1\xee\xc4\xce\x46\x1c\x70\x48\x21\
+\x09\x05\xb1\xb4\x44\x8d\x0a\x3f\x28\x6a\x55\xb5\x08\x89\xb6\xa1\
+\x01\x75\x51\x5b\xa9\xa5\x52\x53\x5a\xa5\x8d\xa0\xa2\x41\x15\x11\
+\xe5\x07\x3f\x8a\x5a\x88\xa0\xe9\x02\xb2\x02\x65\x11\x0d\x31\x58\
+\x24\x71\x00\x93\x80\x93\x38\x8b\xb3\xd8\x49\x3c\x1e\x2f\xe3\xd9\
+\xb7\xb7\xf6\xde\xf7\xde\x2c\x1e\x8f\x1d\x27\x6c\xe5\x29\x5f\xe6\
+\xcd\x5b\xcf\xb9\xf7\xdc\xe5\xfb\xc6\xc0\xe7\x7c\x13\x3e\x83\x67\
+\xea\xff\x67\x04\x74\x01\x5b\x8e\xac\x40\x5a\xff\x32\x34\x6d\x1d\
+\x04\x71\x19\x1d\x6a\xa1\xe3\x7e\x3e\x05\x5d\x8d\x43\x91\x43\x90\
+\x33\x67\xa1\xe6\xfa\x11\x09\xee\x45\xd7\xc6\x13\x74\xa3\x44\x43\
+\xfb\xec\x08\x3c\x74\xae\x05\xe9\xa9\xfb\xa1\x25\xef\x82\xe2\xe8\
+\xb4\x79\xab\xc5\x40\xb5\x13\x5e\xaf\x0b\x4e\x87\x00\xbb\x48\xd8\
+\x75\x0d\x9a\xa2\x22\x93\x95\x91\x4e\x66\x90\x4a\xe4\x20\xc5\xb3\
+\x74\x50\x38\x8a\x74\x74\x17\x86\xf7\x3e\x87\x7d\x8f\x0e\x5b\x64\
+\x2e\xcb\x33\x97\x4e\x60\xeb\xc9\x26\x64\xe4\x2d\x90\xd3\x9b\x44\
+\x7f\xc0\xd3\xd6\x52\x8b\xd6\x80\x13\xd5\x76\x32\xa7\xae\x42\x53\
+\x69\xe8\xba\x09\x5e\xd3\xa0\xd3\xd0\x54\xcd\x3c\xa7\xe9\x74\xab\
+\x86\xf0\x54\x06\xe3\x63\x09\x28\xd1\x74\x0a\xd9\xc8\x4e\x1c\x7b\
+\x7d\x3b\xfa\x9f\x3a\x7b\x39\x44\x2e\x85\x80\x80\xad\xe7\xef\x43\
+\x3c\xb4\x4d\xa8\xad\xab\xeb\x5c\xd6\x84\x36\x1f\x9b\x59\x25\xb0\
+\xf4\x4e\x4d\xa5\x0b\x74\x88\x04\x5c\x60\x65\xd0\x21\x89\xac\x1f\
+\xcf\xa9\x48\x49\x2a\x64\x45\x81\xca\xd7\xd0\x71\x3b\x5d\xe3\x10\
+\x05\x44\x53\x32\x46\xce\x47\xa0\x46\x62\x61\xc4\xce\x3d\x82\x97\
+\x7f\xbc\x83\xde\x13\xa3\xa1\x7c\xbc\x04\x7e\x76\x36\x80\xea\xec\
+\xd3\x84\xf4\xeb\xed\x2b\x17\x0b\x57\x37\x38\x21\x18\x80\x4d\x09\
+\xdb\xa1\x82\x54\x03\x85\xac\x7d\x21\xae\x20\x98\x52\x11\x4a\xca\
+\x50\x25\x99\x88\x69\x06\x49\x72\x85\xb9\x4f\xf7\x11\x13\x76\x17\
+\x5c\xa2\x8e\x2a\x87\x08\x29\x2b\x21\x39\x1a\xd3\x11\x1f\x7f\x05\
+\xfb\xb6\x6f\xc6\xd8\x7b\xa7\xe7\xeb\x0d\xdb\x45\xc1\x3f\x74\x6e\
+\x21\xe4\xb1\xdd\xa8\x0e\xac\xbf\x61\xcd\x72\xe1\x8a\x1a\xd1\xb0\
+\xa2\x8d\x8c\xef\xa2\x51\x65\x17\x90\x56\x34\xf4\x8d\x2b\x78\x37\
+\x48\xe0\x27\xb2\x48\x1c\x0f\x41\x1f\x8b\x03\x0e\x7a\xbc\xd7\x6e\
+\xc1\x20\xd0\x7c\x63\x1e\x12\x79\x4d\x65\x49\x91\x87\xc8\x41\x70\
+\xf8\x5c\x82\xa6\x3b\x3a\x50\xb7\xfa\x16\x24\x26\xfb\x91\x18\x9e\
+\x9c\x8f\x27\xe6\x26\xf0\xfb\xb3\xed\x88\x8d\x75\xdb\x5a\xda\x3b\
+\xbf\xb2\x7a\x21\x6a\x9d\x3a\x25\x19\xc0\x59\xc0\x25\xa0\x67\x44\
+\xc1\xc1\x10\x49\x45\xd2\x0d\x50\x38\x75\x01\x07\x36\x77\xe0\xa9\
+\x7b\x97\x60\xd7\xde\x31\x8c\x91\x47\xe0\xb1\x9b\xe7\x60\x0d\x7d\
+\xe6\xd0\xc8\x08\x14\xfd\xe4\x4e\x77\x33\x6a\x3a\x6e\x46\xd2\x20\
+\x31\x4e\x37\xc8\x97\x47\xe0\x57\x47\x6b\x90\x89\xec\x16\x9b\x16\
+\x75\x6e\x58\xd5\x08\x9f\x8d\xf4\x4d\x66\x77\xdb\x04\x72\xbb\x80\
+\xe3\x11\x0d\xff\x1d\x52\x91\x94\xb4\xa2\x10\xe3\x29\x6c\x5c\xe5\
+\xc4\x4f\x37\x34\x19\x5f\x7f\xb4\xbe\x01\x2f\x1f\x08\x63\x34\x45\
+\x24\x5c\x36\x53\x46\xba\x3e\xfb\x20\x8f\x18\x5e\x13\x5d\x75\xf0\
+\x2f\xbd\x06\xa3\xfd\x07\x21\x45\x27\xe7\x22\x21\x56\x3e\x4c\x09\
+\x5c\x88\x3e\x8d\x40\xfd\x17\x6e\xbd\xaa\x01\x5e\x41\x25\xf0\x3a\
+\xdc\xa2\x66\x58\xbe\xfb\x82\x8a\x77\x47\x75\x53\x12\x02\x2c\xeb\
+\xf2\x6b\x54\xb4\xd5\xb9\xa6\x3d\xa9\x6f\xcb\x95\xb8\xd6\x23\x42\
+\xa4\x80\x9d\x57\xc4\x31\x89\x2a\x7a\x46\xa0\xe5\x1a\x5c\xff\x8b\
+\xcd\x74\x64\x39\x0d\xd7\x6c\x97\x57\x26\xf0\xdb\x0f\x37\x41\xf0\
+\x7e\xe3\xda\x95\xad\xa8\xb1\x6b\x20\x99\xc3\x45\x60\x3d\x44\xe2\
+\xa5\x21\x05\xc3\x31\xb6\xba\x56\x94\x03\x6f\x82\xf9\xe9\xb2\xcf\
+\x7c\xe4\xa1\x2d\x2b\xb1\xce\x67\x83\x33\xa3\xcd\x2f\x49\x6a\xf4\
+\x42\x8f\x1b\xa8\x5b\x76\x07\x56\xdf\x7f\x37\x1d\xa1\xc2\x48\xb9\
+\x62\x5e\x04\xb6\x0e\x36\x21\x2d\x3f\x5a\xdf\xde\x2e\x2c\xae\xa2\
+\x94\xa8\x33\x01\xdd\xb0\xfc\x2b\x24\x99\xc9\xa4\x0a\x23\x20\xf3\
+\x6e\xcf\xeb\x5a\x33\x3f\x9d\xf6\xca\x66\x7e\xf7\xc1\x0e\x5c\x47\
+\x85\xce\x55\x2a\x06\xbd\xec\xb3\x74\xe3\x2c\xe1\x26\xad\xb6\xad\
+\xbf\x1f\xbe\xf6\x1b\xe8\x88\x1f\x15\x7c\x38\x93\x40\x32\xfb\x1b\
+\x54\xfb\xeb\xd6\x34\x9b\x5e\xcb\x83\xef\x0d\xca\x18\x4b\x72\x52\
+\x50\xad\xd4\x58\x36\x18\x05\xa5\xc4\x68\x5a\x9d\xd5\xb0\xfb\x36\
+\x5f\x81\x35\x7e\x17\x3c\x9a\x88\x69\x01\x3d\xe3\xd3\x7a\x1e\xc3\
+\xf3\xfa\x1b\xd1\xf1\xed\x3b\xe9\xcb\x62\x1a\xce\xb9\x09\x3c\x78\
+\xac\x11\x4a\x66\x53\xdb\xa2\x7a\x43\xef\x6c\x7d\x07\xc9\x66\x8c\
+\x40\x0d\x50\x9a\x2c\xe4\x72\x23\xaf\xab\xd3\x83\x92\x3d\xe0\x72\
+\x60\xf7\x40\x62\x4e\x75\xec\xfd\xe5\x52\x5c\x57\xeb\x86\x57\xb7\
+\x15\x3b\x21\x7d\x96\x4f\x46\xe7\xa0\xcc\xd4\xb4\xee\x4e\x78\x9b\
+\xd7\xd2\xb7\x40\xb9\x17\xa6\x13\x50\xe4\xef\xc3\x53\xe5\x5b\x51\
+\x2b\x1a\x45\xca\x4e\x85\xc6\x4d\x97\xef\x39\x4f\x35\x45\x2c\x03\
+\x3e\xc3\x0b\xaa\xe1\x81\x01\x4a\xff\xcf\xf6\x46\x66\x25\x60\x23\
+\x69\x74\xff\x7c\x09\x6e\x68\xac\x86\xcf\x61\x2f\x48\xaf\xe8\x01\
+\xeb\x42\x8e\x03\xce\xd9\xfc\x6c\xa7\xc7\x8f\xb6\xaf\xb2\x8c\x38\
+\x16\x1c\x73\x10\xd0\xbe\x53\xd3\xe0\x87\xd7\x66\x3e\xd0\x41\x81\
+\x7a\x7c\x4a\x46\x2e\xab\x9a\x15\x34\x0f\x96\x5f\x3a\x83\x84\xe9\
+\x85\xf4\x02\x1f\x1e\xd8\x15\xc2\x1b\x73\x78\xc2\x2e\x8a\x78\xfd\
+\x27\x6d\xb8\xb1\x39\x40\x24\x9c\x65\x9e\xb0\xc8\x70\x92\x10\xf3\
+\xa9\x95\x88\xb6\xdc\x74\x3d\x9d\x5c\x41\xc3\x57\x99\xc0\xaf\x87\
+\x57\x40\x93\x3a\x5b\x6b\x5d\x46\xd3\xc5\x05\xc2\x49\x46\xe8\x1b\
+\xe3\xf4\x97\xb7\x7a\x9e\x88\x52\x22\x21\x75\xba\x17\x08\xc0\x64\
+\x8d\x1b\x1b\x77\x06\xf1\xce\x99\xf4\xac\x24\x1c\x94\xad\x5e\xfa\
+\xe1\x42\xdc\xbc\xa8\x16\x7e\x97\xd3\x32\x46\xbe\x26\x58\x61\xc0\
+\x6a\xe1\xef\xd4\x37\xc1\xb9\xe0\x6a\x78\x5a\x3a\x50\x16\xcc\x45\
+\x02\xe9\xa9\x5b\x29\x85\x88\xf5\xac\x19\x0a\x54\x9b\xa8\x62\x24\
+\xa1\x40\xca\x29\x96\x45\xf2\x2e\x2e\xb1\x38\x2c\x6f\x68\x7a\x89\
+\x87\x54\xe3\xda\xa0\xdb\x8e\xbb\x9e\xa1\xaa\x7c\x36\x33\x2b\x09\
+\x37\x49\xae\xeb\x07\x0b\xf1\xa5\x25\x0d\xa8\xf1\x78\xe8\xb5\xfa\
+\x74\x2f\xc0\x22\xc2\xcf\xb7\x8b\x36\xd4\x76\x2e\xa4\x6f\xf5\xa5\
+\x32\x2a\xe6\x56\x41\x5b\x2b\xba\x5d\xa8\xb2\x69\x86\xf7\x58\x45\
+\x83\x11\xab\x9f\x9a\xa0\x06\x31\x92\x42\xc0\xc5\x96\xb3\x11\x39\
+\x91\x86\x40\x01\x2e\x80\x76\x8d\x7d\x3b\x69\x5b\x14\xf8\x53\x00\
+\xfd\x83\x48\x16\x56\xec\x76\x6c\xfa\x7b\x10\xcf\x7c\xaf\x15\xd7\
+\xb7\x7b\x2a\x92\xf0\x12\x89\xe7\xef\x6b\xc1\x3d\x3b\x28\x36\x4e\
+\x04\x11\x8b\x25\x8b\x04\x4a\x53\x35\x3d\x1b\xfe\x15\x0d\x08\xee\
+\x69\x64\xee\x30\x9b\xbd\x12\x02\x9a\xb0\xac\x8a\xac\xa6\x13\x5b\
+\x8d\x2c\xc8\x60\xce\x25\x48\x3e\xb1\x2c\x36\x34\xe8\x78\x63\xdb\
+\x1a\x7c\x52\x9b\x87\x48\xec\xf8\x6e\x13\x36\x3e\x47\x55\x7e\xe0\
+\x3c\x62\xd1\x64\x21\xcb\x16\x6a\x0c\xd7\x05\x6f\x73\x1d\x1d\x68\
+\x40\x49\x65\x2e\x4a\x48\x17\x5b\x5d\x4e\xd1\x98\x78\xf0\x36\x95\
+\xa1\x3e\x9f\x5a\x03\x44\xb3\xf8\xd3\xb7\xda\x3e\x31\xf0\xf9\xad\
+\x9a\x5a\xdb\x1d\xf7\x34\xe1\xf6\x6b\x96\xc0\xe7\x75\x17\xa5\xa9\
+\x96\xc8\xc9\x59\xc7\x04\x6a\x4a\x25\x94\x27\x40\x73\x11\xcd\x6f\
+\x23\xdf\xeb\xaa\x66\xf4\xfa\x61\xee\x5d\xf8\x46\x9a\x94\x2c\x6d\
+\x70\x5e\x32\xa0\xcb\x22\xe1\x16\xb1\xed\x8e\x05\x58\x7b\x45\x2b\
+\x01\x57\xa7\x07\x36\x87\xa6\xe0\xf6\xd2\xff\x55\x16\x01\x23\x90\
+\xa7\xf7\x17\x14\x84\x2a\x0d\x12\x10\x22\x59\xc5\xcc\x36\x7c\x91\
+\x4d\xbc\x34\x24\x1f\x61\x5b\x5a\x67\x27\x22\x2e\x2b\x55\x9b\x59\
+\xad\x50\x1f\x8c\x8a\x6f\x54\xe3\x02\xa0\x22\x32\x55\x4e\xaa\x92\
+\x42\xc9\xc4\x9c\xcf\xa6\x25\xab\xf2\x92\xac\x2e\x84\x73\x9f\x1a\
+\x81\xc7\xde\x4a\x62\x28\x34\x69\xda\x57\xb6\x3c\xa0\x0a\xa6\x94\
+\x94\xf4\x8c\x94\x56\x24\xa0\x28\xa1\x6c\x86\xe6\xad\x24\x21\x55\
+\xd6\x91\x93\xcc\x42\x25\x56\xd9\xf0\xd8\x9e\xc9\x4f\x05\xfc\x13\
+\x7b\x93\xf8\xc7\x81\x20\x8e\x1e\x1f\x31\x73\xbf\xa2\x14\x8b\x1a\
+\xcb\x29\x1b\xe6\x12\xcf\xed\x60\x61\x39\x26\x2f\x21\x4a\x3d\xf2\
+\xd9\x4c\x2a\x47\xd7\xf9\x68\xaa\x67\xae\x24\xf0\xdc\x55\xa3\xec\
+\xf7\xec\x87\x51\xbc\x3f\x9c\xc6\xaa\x85\x5e\x63\xbe\xc1\x69\xd4\
+\x4e\x59\x4a\xb4\xd2\x28\xef\x7b\x5d\x66\x6a\x65\xb5\xd9\xa8\x05\
+\x10\x44\xb3\xd6\x64\xc9\x18\xab\x5a\x5d\xb8\x7b\xad\x6f\x4e\xf0\
+\x4f\xbd\x93\xc1\x3f\x0f\x84\xf0\x7e\xff\x19\x18\x6b\x32\xfc\x7e\
+\x59\x2d\xc0\x83\x4c\x64\x32\x41\x26\xc0\xd5\x51\x81\x95\xa3\x8a\
+\x31\x20\x25\x8f\xa8\x29\x3b\x59\x5e\x25\x91\x89\x46\x30\x9b\x93\
+\x70\x01\x39\x0a\x9b\x43\x34\xf1\x3e\x74\xda\x0c\x6c\x81\x01\x72\
+\xa4\x08\x56\x6c\x59\xc3\x48\xd7\xc6\x44\x93\x1e\x47\xee\xef\xa0\
+\xb6\xe2\xd6\xa5\xfe\x8b\x82\x7f\xf6\x60\x16\x3b\x09\x7c\xef\xc1\
+\xd3\x26\x78\x86\x26\xcb\x98\xd6\x1b\x51\x32\x41\xec\x44\x14\xe6\
+\xaa\x45\xa1\x29\x2f\x12\x48\x8c\xec\x87\xc3\xa9\x4f\xa5\x65\xc1\
+\x23\xda\xe9\x84\xe9\x01\xa3\x80\x68\x28\x16\x6f\xc1\x70\x57\xa1\
+\x01\x2d\xa4\xb8\xd2\x36\x80\x5e\xd6\xe2\xf7\xe1\xb6\x15\x35\x78\
+\xfc\x9b\xf5\x73\x82\x7f\xa1\x3f\x47\xcd\xdf\x38\xde\x7a\x6f\xd0\
+\x68\x06\x8d\x77\xea\x86\xeb\xac\xc0\xb5\x8a\x98\x44\x93\xe6\xf8\
+\x31\x2e\x5e\xac\xe7\x42\x50\x16\x63\xe0\xc5\x3f\x1e\x86\x9c\x3e\
+\x15\x8e\x64\xc9\x73\xba\x99\x68\x35\x8b\x44\xfe\xb3\x74\x54\x3a\
+\x67\xe4\x6d\x15\x8d\x3e\x2f\xbe\xb6\xb2\xee\xa2\xe0\xff\x33\x20\
+\xe1\x6f\xbd\x13\xd8\x7d\xe0\xb8\xa9\x79\xcd\x9a\x07\xb0\xf6\x39\
+\x8d\xe6\xc1\xf3\x7e\x6a\xea\x24\xa4\x29\x06\x3e\xc6\xf4\x66\x12\
+\xc0\x50\x0e\x39\xb9\x2b\x3e\x91\x44\x96\x64\xe4\xe6\x4e\x50\x29\
+\x07\x58\xe1\x7b\xe9\x71\xba\xde\x6d\xb3\x61\xc3\xf2\x7a\xfc\xe5\
+\xee\xc6\x39\xc1\xbf\x7e\x52\xc6\x5f\xf7\x87\xf1\xda\xbe\x63\x26\
+\xc8\xbc\x4b\x99\x43\x3a\x5b\xb4\x3e\x8f\x0c\x19\x7e\xe2\xad\x7e\
+\x3a\x12\xb2\x3c\x20\x55\x20\x40\xb7\x8c\xf7\x3f\x87\x64\x3a\x1b\
+\x8c\xe6\x68\x16\x26\xce\x04\x58\x89\xc8\xb4\x4f\x15\x9d\xf5\x01\
+\xfc\xee\xf6\x05\x73\x82\xef\x39\x23\xe1\x2f\xfb\xc2\x78\xf1\xed\
+\xa3\x45\xf9\x69\x96\x74\x72\x39\x53\xef\xf9\xe2\xc5\x5b\x2a\x93\
+\xc6\x78\x37\x37\x49\xbc\xe0\x15\x45\x31\x32\xca\xe6\x03\x3d\x0f\
+\x0f\x22\x9b\xe8\x9a\x08\xc6\x38\x8c\x8d\x51\x51\x3e\x15\x65\x64\
+\x5a\x70\x51\xad\x07\x57\x36\x39\x66\x05\xdf\x7b\x4e\xc1\x93\x6f\
+\x47\xd1\xf5\xe6\x91\x92\xd9\x9c\x66\x5a\x9e\xa5\x92\x96\x4a\x62\
+\x8a\xbd\x41\x84\x26\x7a\xbb\xa1\xa4\xa6\xe8\xdb\x29\xa6\x53\xfa\
+\xbc\xf2\x12\x2b\xe1\xfc\x3b\xdb\x11\x4d\x26\x87\xc6\xd3\xa8\x75\
+\x89\x33\xad\x3e\x97\x8c\x68\x6b\xae\x9e\x1d\xfc\xfb\x23\x32\x9e\
+\xe8\x89\xe0\xdf\xdd\x87\x2d\x80\x5a\x11\x3c\xef\x27\x32\x28\x4e\
+\x68\x2c\x3b\xc7\x23\x31\x8c\x3c\xcf\xb2\x21\xad\x61\xa4\x54\x3e\
+\x95\x08\xe8\xe8\x7b\x6c\x00\xf1\xe1\xc7\x93\xa3\x53\xba\x31\x05\
+\x28\x07\x3c\x43\x46\xfa\x34\x12\xc2\x2c\x6b\x3f\x87\x43\x32\xb6\
+\xbf\x19\xc3\xbf\xf6\x90\x94\xb5\xfc\xfc\x5a\x2f\x82\x4f\xa6\x4b\
+\x7a\x1f\x0b\x5a\x3c\xa1\xe3\x42\xd7\x6b\x64\x7d\xd6\x3e\xb1\x46\
+\xa4\x54\x3e\x95\x08\xf0\x96\xc5\xfe\x3f\x3c\x89\xa9\xb1\xfd\x93\
+\xa3\x51\xea\x24\x84\xca\x5e\xa8\xe4\x01\x2a\x36\x59\x65\xe6\x1a\
+\xc9\x89\x71\x15\x8f\xee\x21\xf0\xdd\xfd\xd4\xe1\x2a\xd6\x8c\x2b\
+\x3f\x0d\x25\xd9\x24\xd2\x66\xc2\xc8\xe7\x7d\x36\x42\x86\x02\x79\
+\x6a\xa0\x17\x13\x3d\xac\xfd\x83\x34\x78\xf9\x7d\x46\x4f\x53\x89\
+\x80\x8e\x64\x68\x02\x27\x5e\x78\x00\xe1\xc9\x61\x89\xdd\xaa\x57\
+\x88\x05\xad\xf2\x3e\xaf\xff\x97\x6e\x67\xc2\x2a\x1e\xde\xcd\xb2\
+\xe9\x87\x9a\xb5\x26\x48\xba\x15\xb0\xdc\x6f\x31\x78\xb5\x0c\x3c\
+\x1f\x0f\x8f\x9c\xc1\xe0\x93\x14\xb4\x3a\x67\x9f\x43\xe5\xc1\x9b\
+\xdf\x66\x5b\x1b\xd5\x10\x1d\x9c\x82\xcd\x36\x08\xe7\xe2\xf5\x70\
+\x39\x7d\x46\xcf\xa0\xcd\xb1\xa6\x69\xb5\xde\x01\x7f\x35\xd6\xb5\
+\x57\xa1\xd9\x6f\xc3\x48\x4c\xc5\x83\xaf\x46\xd0\xd5\x7d\x04\x12\
+\xa7\xc6\xbc\xbc\x18\x30\x7f\x67\x42\x85\x29\xa4\x05\x9e\x3d\x34\
+\x15\x0a\xe2\xf8\xb6\x1e\xa8\x49\xfe\x29\xaa\x9b\xed\x50\xae\xfd\
+\x8b\x11\x30\x5e\x83\xc9\xa3\x41\xe4\xe8\x21\x9e\xc5\x37\xc2\xe6\
+\xaa\x31\x56\x07\x50\x01\x78\xc9\xfe\x68\x24\x81\xe1\x94\x17\x43\
+\x31\x01\x3b\xfb\x12\x78\xa9\xe7\x28\x32\xac\xef\xbc\x14\xb3\x39\
+\x33\xb3\xe4\xd3\xa6\xf1\x3c\xc1\xd4\x02\x9f\x0b\x8f\x0e\xe1\xd8\
+\x23\x3d\x90\xa3\x67\x2c\xf0\x1c\xbc\xb3\xae\x0e\x5c\x6c\xb9\x95\
+\xcf\xfb\xd1\xf8\xc5\x5b\x70\xe5\xbd\x5b\xb1\xa0\xf5\x3a\x54\x57\
+\xc1\x6a\x7a\xcc\x75\x1b\xa3\xcd\xb0\x7a\x8d\x42\x46\xd1\x51\xe5\
+\x73\x23\x95\xcc\x9a\x39\x9d\xd3\x23\x5b\x56\x2d\x5b\x79\x10\x2c\
+\xf0\xbc\x25\x28\x3b\x46\x06\xfb\x70\xf2\xcf\xc7\xa0\xa6\x4f\x5a\
+\xe0\xb9\x50\xc4\x2b\x49\x67\x3e\x1e\xc8\x6f\x12\x52\xc1\x10\x46\
+\xba\xdf\x83\xb3\x89\x26\x0b\x81\x4e\x92\x93\xc3\x20\x90\x93\x4d\
+\x70\x8a\xd5\x39\x1a\xfb\xe6\x90\x93\x19\xd3\xa2\xdc\x16\xf0\xb1\
+\x52\x6f\x95\x2e\x8a\xe4\x48\x19\xd1\x78\x1a\xe7\xba\x76\x61\x68\
+\xc7\x05\xe8\xd2\x87\x16\xf8\x01\xa6\x35\x17\xf8\xf9\x12\x30\x49\
+\x68\x4a\x18\xa1\x5e\x4a\xb1\xa7\x4f\xc0\xd6\xe4\x86\xea\x5d\x4c\
+\xb2\x10\x0b\xb1\xa1\xa8\xd3\x33\xd5\xb4\x26\xaf\xe4\x49\x2c\x25\
+\xb6\x3a\xb7\x07\xb1\x94\x82\xb1\x0f\x7a\x30\xb8\xbd\x17\xb1\xc3\
+\x41\x3a\xb1\x8f\xae\xe8\x81\x59\xb0\xd2\x17\x03\x3f\x1f\x09\x95\
+\x6f\x5c\xa5\xb8\x4f\x58\x8e\x05\x57\xdf\x84\xd6\xdb\x6e\x44\x60\
+\xe5\xcd\x70\xfb\x1a\xe1\x70\x58\x6b\x2c\x25\x4b\x82\xba\x50\x4c\
+\x95\xec\x21\x6e\x91\x73\x92\x8e\x74\x3c\x84\xc8\xa1\x3e\x8c\xbe\
+\x3a\x09\x39\xcc\x12\x61\xc9\x7c\x00\xb3\x55\xe0\x8a\x2b\xcf\x17\
+\xd0\xe5\xfc\x4e\xcc\xf7\xf0\xba\x0c\xb7\x9a\xe4\x05\xc7\x4a\xd4\
+\x5c\xd5\x81\xc0\xea\x56\x54\x2d\x6d\x81\xbb\xb1\x19\x76\x7f\x1d\
+\x44\x7b\x95\xf9\x53\x65\x36\x05\x29\x3e\x89\x5c\x70\x1c\xf1\x53\
+\x13\x88\x7d\x90\x40\xe6\xbc\x42\x04\xb9\xba\x72\xa0\x72\xa6\x39\
+\x47\x23\x0c\xb3\xcb\xfc\xc4\x7e\x66\x2d\xdf\x38\x6f\xf0\xfa\x0c\
+\x2f\xf5\xd5\xd2\x68\xb6\x46\x83\x75\x8c\x57\x10\xf2\xcb\x19\x9c\
+\x02\x59\x12\x3c\x19\x61\xe0\xa3\x30\x3b\x4b\xce\xed\xec\x01\x2e\
+\x50\x97\xf5\xab\xfd\xc7\xf1\xb7\x12\xfc\x0c\x9b\x05\xd6\x63\x91\
+\x62\xa9\xd9\x51\x2c\x94\x0c\x8e\xa7\x81\xb2\x05\x36\x53\x02\xfa\
+\x23\xfd\xed\xc4\xe7\xfe\x8f\x3d\x3e\xf7\xdb\xff\x00\x44\x7a\x79\
+\x66\x42\x46\x37\x52\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x0a\x54\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x36\x20\x4d\x61\x69\x20\
+\x32\x30\x30\x33\x20\x31\x32\x3a\x31\x31\x3a\x33\x32\x20\x2b\x30\
+\x31\x30\x30\x47\xeb\x88\x5e\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x19\x01\xc0\x8d\x11\x7e\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x09\xac\x49\x44\x41\x54\x78\xda\xcd\x5a\x4d\x8c\x1c\x47\x15\
+\x7e\x55\x3d\x33\x3b\xfb\xe3\xf1\x7a\x8d\x65\x2f\x24\x8b\xd7\x71\
+\x10\x49\x24\x22\x82\x73\xe1\x80\x22\x10\x70\x40\xe4\xe6\x83\x2f\
+\x20\xa4\x48\x08\x02\x88\x03\x39\x71\x45\x48\x39\xe1\x03\x42\x1c\
+\x38\x23\xc4\x05\x21\x71\x01\x21\x38\x18\x39\x60\x58\x63\x89\xd8\
+\x52\xb2\x89\x8d\xbd\x19\xdb\x8b\x93\xdd\xd9\xff\x9d\x99\xee\x2e\
+\xea\x55\xd5\xab\x7e\x55\x5d\x3d\x76\x90\x0f\xb4\x5d\xae\xfe\xa9\
+\xae\xfe\xde\x7b\xdf\xfb\xa9\x1a\x0b\x48\x1f\x02\xfe\x3f\x0f\xd5\
+\x0c\xf4\xc2\x6f\x33\x98\x5b\xfc\x1a\x48\x71\x41\x0f\x5b\x06\xa1\
+\x24\x3d\xba\xf8\xc5\xe2\xd4\xc7\x7b\x65\xc7\xbc\x20\x84\x69\x74\
+\x94\x65\x09\x4a\xd9\x79\xf3\xa2\x30\xe7\x4a\xdf\xa3\xfb\x85\xbb\
+\x87\xd7\x66\x4c\x9e\xeb\x73\x3d\x46\xf1\x6b\x7b\x8e\xe3\xee\xee\
+\x75\x46\xaf\xff\xe3\xc4\x7d\x18\x8f\x01\x0a\x7d\xbf\xc8\x15\x8c\
+\x0f\x6f\xc1\xce\xbd\xdf\xc0\xb5\xd7\x7f\x05\x83\xdb\xdb\xf8\x1a\
+\x7d\xbf\x65\xc1\xab\x0c\x8e\x5d\xfd\x25\x0c\xf3\xf3\xa2\xdf\x17\
+\xf2\xf0\x40\xcb\xa1\x27\x74\x60\xe7\xe1\x14\x7c\xf6\xf9\x67\x60\
+\x66\x66\xc6\x0c\x97\x52\x42\x96\x65\xe6\x19\x7e\x94\x04\x32\xe0\
+\x1d\xd8\xa6\x86\x02\xa5\xee\xe1\x7b\xfb\xfb\xfb\xf0\xfb\xbf\xbe\
+\xd5\x5a\x3a\xaa\xce\x08\xd1\x76\xdf\xea\xc2\xe1\xe1\xf4\x53\xff\
+\x59\xef\x7c\xa1\x78\xe1\x87\x5f\x82\x3f\xbd\xf6\x03\x80\xad\x35\
+\xfd\x68\x58\x09\xd0\x7b\xe3\x5b\x70\xa0\xce\xcb\x1b\xd7\x35\x16\
+\x09\x06\x4f\x26\xb4\x10\x5a\x00\xa9\x81\x6a\x93\xb4\x5a\x2d\x0f\
+\x9a\x04\xc0\x56\xb3\x71\x83\x00\xa4\x69\x7c\x07\x01\x73\x41\x48\
+\x11\x38\x2f\xb2\x64\x4a\x4f\x2b\xf4\xf7\x45\x26\x35\x06\xa9\x15\
+\xd7\x86\x85\xe3\x5d\xf1\xf6\xf5\xf1\xcb\xe3\x67\xcf\xbf\x03\x37\
+\x7e\xf1\x33\x3d\xf0\x0e\x5a\xc2\x0a\x00\xed\x57\xe4\x7b\x37\x85\
+\xa1\x87\x24\x8a\x08\x00\xa6\x59\xa2\x0f\x7e\x84\x1a\x82\x5a\x5f\
+\x5f\xf7\x16\xc0\x9e\xa8\x13\xb7\xf8\x7e\xbb\xdd\x36\x8d\xe6\x0e\
+\x2c\x69\xe6\x92\x30\xda\xb8\x63\x30\xc8\x56\x07\xba\xc7\x3f\x06\
+\x8b\x4f\xcc\x8b\x3b\xf7\x9e\xfd\xb2\x7e\xfc\x17\xdd\x36\x74\x1b\
+\xb4\xdc\x1b\xa7\xc5\xe1\xa1\x06\x2f\xed\x24\x8e\x3a\xb6\x55\xc0\
+\x39\x50\x6c\xa3\xd1\x08\xd6\xd6\xd6\x92\x96\xe0\x7e\x92\xb2\x52\
+\xaf\xd7\x83\xa9\xa9\x29\x63\x09\x3e\xde\x08\x64\xf4\x97\xc1\xc1\
+\xda\x35\x7d\x3d\x86\x56\xf7\x28\x4c\xcd\x2f\xc2\xcc\x9c\x76\x43\
+\xd1\x7b\x52\x3f\xfd\x84\x6e\x2b\x95\x00\x48\x0d\x04\xa8\xac\xe6\
+\x09\xb8\x9d\x48\x6b\x55\xa9\x46\x60\x4a\xa9\x46\x90\x0f\x13\x26\
+\xf5\x6e\x35\x56\x41\x36\xdd\x03\x55\xe4\x20\x3b\xd3\x96\x66\xda\
+\xf9\xa1\x18\xe3\x80\x05\xdd\xa6\xc8\x07\x90\xe2\x5a\x00\x6d\xc2\
+\x92\xb4\x0f\x91\x15\x84\x8f\x14\xfc\x40\x0d\x9e\x3d\x7b\x36\x00\
+\x98\xa2\x0d\xa7\x0f\xf1\x3e\x65\x35\xf3\x3e\xfa\x84\x81\x5f\x42\
+\xe7\xf8\x19\x7d\x56\x80\xcc\x3a\x36\x7e\x0a\x14\xc0\x9c\xd1\xcb\
+\xa2\x45\x2f\xa2\xc3\x9a\xd0\x03\xa1\x00\x38\x5b\xa9\xcd\x9c\x8a\
+\x34\x08\xe2\xc4\x89\x13\x49\x20\x14\x5d\xc8\x59\xb9\xd3\xa2\xef\
+\xe0\x35\xf6\xe9\x43\x7f\x5b\x6b\x7b\xea\x23\xa7\xc1\xfb\xa5\x56\
+\xb0\x09\x9e\x65\x5e\x0d\x02\x8a\x42\x5a\x3e\x25\xd0\xe3\x4b\xef\
+\xb8\x82\x09\xa0\x18\x70\x6e\x7a\x04\x30\x18\x0c\x6a\x4e\x1c\x6b\
+\x3c\xee\xb1\x51\x54\x8b\x2d\x57\x41\xc3\x7c\x52\x58\xa5\x96\xc2\
+\x38\xb5\xb9\x9d\x17\x81\xa8\xde\x02\x46\x4a\xca\x5d\xce\x71\xa9\
+\x57\x0c\x10\x69\x17\xef\x1f\x1c\x1c\xc0\xea\xea\xaa\x01\x33\xe9\
+\x48\xf9\x0d\x3a\xf1\xec\xec\x6c\x08\xdc\x0e\x66\x42\xf0\x7b\x69\
+\x3f\x0a\x28\x44\xa0\xfd\x47\x9d\x00\x25\xd3\x1c\x45\x24\xd2\x28\
+\x8f\x4e\x8f\x2a\x00\x09\x11\xd3\x92\x67\xec\x1a\x70\xec\x64\x7d\
+\xee\x16\xff\x88\x90\xd5\x60\x4e\x0b\x88\x62\x3a\x3f\xe6\xe7\xe7\
+\x03\x80\x44\x23\xde\xc7\xf4\x23\x0a\xf1\x32\x24\x0e\xd1\xf6\x8f\
+\x95\xc1\x8b\xa1\x26\x09\x80\x99\xd7\x06\x24\x2f\xbd\xf0\x61\xb4\
+\xca\xa8\xc1\xcb\x1a\xc4\xf2\xf2\x72\x12\x38\xe7\x7c\x5c\x3e\x90\
+\x73\x53\x09\x91\xb4\x00\x67\x4d\x83\xf6\x2b\x01\x6c\x8c\x72\xb5\
+\x0f\x13\xc0\xf5\xdc\xf9\xb8\x16\xb1\xdf\xd8\xd8\x08\x34\xc8\x85\
+\x48\x65\x64\x6a\x48\x3d\x54\x80\xaa\x59\x57\xa5\xf9\xaf\x84\xc9\
+\x55\x13\x2d\x40\x66\xa3\x7f\xbc\x05\xca\x50\x00\xf2\x83\x43\x9d\
+\xbd\xfb\xfd\xbe\xab\x61\x26\x73\x3e\x3e\xb0\x30\xc4\x28\x14\x0b\
+\xe0\xe9\xc3\xab\x5e\x6f\x81\x3a\x87\x42\x1f\x68\xb0\x40\x59\x16\
+\x35\x01\xe2\xf7\x3e\x0c\x78\xee\x0f\xf5\x16\xd2\xc7\xfb\x80\x12\
+\xc9\x40\x54\x73\x62\x6e\x01\xfb\xd7\xfa\x05\x71\x97\x67\x66\xfc\
+\xe0\x91\x23\x47\x26\x96\x17\x71\xee\xe0\x14\xe2\x7e\x41\xcf\x0a\
+\x8c\xfd\x41\x31\x29\x2a\x29\x60\x12\x85\x24\xa3\x90\xe7\x9e\xcb\
+\x03\x91\x13\x93\x10\x08\x82\x67\xe2\xc9\x9a\x55\xbe\x70\x23\xa7\
+\x4e\x8d\x21\x17\x10\x22\x6c\xf6\xbb\xaa\x46\x23\x66\x01\x8c\xe7\
+\xa5\xa7\x0d\x71\xcf\x58\xa0\xac\x87\x50\x1e\x6d\xe2\x7b\x29\x27\
+\x06\x67\xc5\xb8\x27\xde\x57\x3e\xc0\xd0\x33\x2b\x34\x51\xb3\x4a\
+\x64\x99\x25\x9f\xa8\x90\x57\x16\xd0\x85\xd5\xee\xee\xae\x5e\xe5\
+\x8d\xed\x58\xad\x79\x02\x45\x0e\x1c\xc7\xfe\x94\x86\x49\xfb\xa9\
+\x1e\xc7\x63\x66\xa7\xe0\xe1\xa9\x4c\x4d\x1a\x9a\x34\x08\x80\x1f\
+\x00\xbb\x02\x23\xad\x73\x0b\xbc\xfb\xbe\x84\xad\x4b\x37\xb1\x3a\
+\xa9\x84\x0c\x14\xe2\x6a\x26\x6f\x21\x3b\x0e\xa9\x47\x3e\x49\xf5\
+\x94\xa9\x33\x1d\x55\xe8\xba\x7a\xa6\x17\x8b\xf9\x8c\xb7\x40\x10\
+\x91\x94\x48\xa6\x82\x90\x42\x52\x79\x0d\x30\x5e\xc0\xaf\xaf\xb1\
+\xac\xec\xb3\x74\x5c\x76\x83\x29\xbc\x78\x11\xe8\x23\x9b\x64\x80\
+\x24\x8b\x5c\xb2\x7a\xce\xc7\x06\xa5\x0f\xeb\x95\x98\x14\x46\x31\
+\x0f\x94\xa2\xae\x61\x21\x58\x50\x12\xde\xc3\xaa\x45\x4f\x7d\xfd\
+\xc0\xc1\x83\xbf\x86\x90\xdf\x7c\xbd\x01\x91\xc7\x46\x6b\x91\x6a\
+\xae\x49\x51\x48\xd8\x92\x95\xd1\x3f\x4c\x68\xc0\xc0\xa6\xb4\xdf\
+\x00\x5e\xd4\xae\xc3\xe5\x2a\x71\xbc\x16\x75\xe2\x26\x61\x32\x85\
+\xa4\x14\xdc\x85\x93\x16\x08\x81\xd3\x75\x0c\x1a\x42\xf0\x32\x05\
+\x1e\x22\x4b\x72\x6b\xb9\xb1\x50\x59\xc7\x16\x94\xb6\xd4\x99\x6c\
+\x01\xc9\x04\x78\x64\x0b\x44\xda\x77\xea\x0c\xb8\xfe\x88\xc0\xab\
+\x4d\x84\xba\x15\xfc\x82\x71\xa2\x00\x64\x01\x2e\x01\x5f\x1f\xd0\
+\xb3\xa0\xf4\x05\x06\x20\xd2\x7e\x0c\x5e\xa6\x80\xc7\x09\x2b\xed\
+\x07\xa6\xa8\xa4\xe5\x61\x4a\x00\x33\xb9\xe2\x35\x0d\xb3\x05\x77\
+\x60\x12\x26\x5e\x33\x7c\x08\xf0\x56\x9d\xe0\xc7\xd5\xad\x10\x51\
+\x0a\x98\x45\x92\x16\x50\xcc\x02\xc1\x8a\xae\x6e\x81\x46\xe0\x10\
+\x0a\xc0\xc3\x66\x3d\x42\x4d\x02\x9e\x72\x6c\x57\xba\x3c\xd4\x07\
+\x44\xb3\x05\x3e\xbf\xb0\x0a\x4b\xf3\x05\x64\xb8\x18\x77\x3b\x73\
+\xbe\x9c\xd0\x49\x28\xcf\xc7\x26\x53\x17\x7a\xd1\x3d\xd2\x3d\x5d\
+\xe3\xc2\x3f\xcf\x0b\x73\x8d\xe7\xf6\x5e\x61\x92\xdc\xe6\x78\x0a\
+\x6e\x15\x9f\xab\xd1\x87\x40\x1f\x7b\xfe\xe9\x80\x5f\xaa\x79\x49\
+\xa9\x7c\x31\x57\xb1\x3f\x2c\x5f\xa7\x5b\x23\x78\xed\x3b\xaf\x98\
+\x74\x8f\xeb\x00\xec\x71\x33\x16\xfb\xbd\xbd\x3d\x73\x0f\x1b\x9e\
+\xe3\x81\xf5\x3e\xee\x1b\x61\x3f\x3d\x3d\xed\x1b\x5e\x77\xbb\x5d\
+\x58\x58\x58\x80\xaf\x5c\xf8\x26\xcc\x3f\x77\x26\x4a\x74\x95\x65\
+\x9e\xfe\xe8\x02\xbc\x73\x7f\xd3\xcb\x20\xd5\x44\x0b\xb0\x05\x25\
+\x2f\x27\xc8\x10\xfa\xd1\xce\xce\x0e\xac\xac\xac\xc0\xad\xf7\xd6\
+\x61\x66\xae\x07\xad\xac\x65\xca\xdf\xd1\x70\x04\xc3\xe1\xa1\x7e\
+\xbe\x0d\xb3\x6d\x05\x8b\x8b\x8b\x66\xb5\x85\x7b\x9f\xb8\x68\xe1\
+\x0b\x7f\xbe\x0e\x2e\x8a\xdc\x86\x96\x06\xc7\xe6\x7e\x65\x2c\x30\
+\x29\x0a\xe1\xae\x57\x58\xf1\x85\x25\x05\x56\x2c\xa8\x71\xd4\xf2\
+\xc5\xeb\x4f\xf9\xaa\xb5\x32\xbd\xfd\xd8\xab\xa7\xaf\x1a\x2d\x77\
+\x3a\x1d\xa3\x69\xde\xd0\x22\xd4\xe3\x73\xca\x23\x8d\xfe\xe1\xbf\
+\xf1\x28\x3e\x20\x45\x3d\xfe\x33\x37\xc0\x13\x04\x8f\x3c\x16\x09\
+\xe0\x64\x35\xd4\x36\x0a\x80\xda\x8f\x81\x63\x43\x1a\xe1\xb5\x51\
+\x8a\x2a\x43\xf0\x51\xa4\x8a\x1d\x5b\x34\x0b\xe0\x76\xbe\x44\x59\
+\x49\x20\x02\x59\xcc\xc7\x90\xef\xb8\x23\x5d\xad\xdc\x78\xf2\xaa\
+\x3e\x80\x40\xb9\x00\xb1\x10\x95\x00\xaa\xa1\x76\x4a\x27\xbe\xe6\
+\x7d\xa1\xd2\x2d\x15\x33\x9b\xb2\xf9\x41\x9a\x2e\x34\x77\x91\x42\
+\xc3\xe1\x30\xca\xba\xa1\x05\xf0\x1c\x77\xdc\x90\xfb\x29\xed\x23\
+\x75\x70\x0e\xef\x17\x04\x5e\x86\xc0\x6d\xdd\x16\xd7\x4e\x4d\xc5\
+\x1c\x2e\x42\x4c\x1d\x27\xab\xf4\x1d\xb0\xc9\x2e\xec\x51\x00\xb2\
+\x80\xbd\x2d\x2a\xba\x31\x4d\x21\x58\x12\x80\xd3\x86\xc0\x23\x15\
+\x69\x4d\x1c\x82\xaf\x7c\x00\x6a\x96\xb1\x7e\x9a\x16\x40\xf3\x1a\
+\x8b\x39\x5c\x5c\x05\x1b\x6f\x9e\x49\x5a\x80\xa2\xd9\x02\x71\x71\
+\x87\x16\xc0\x9e\x6b\x1f\x29\x45\xe1\x97\x04\x30\x14\x8a\x35\xef\
+\x8a\x9e\x00\xb8\x64\x42\x25\x04\xc0\xd5\xf6\xc6\xe6\x01\x1c\x3d\
+\xd5\xcb\xa0\xa0\xad\x0d\x4f\x21\xfb\x52\xe1\x04\x78\x98\x05\x10\
+\x14\x02\x26\x4b\x60\xc3\x90\x4a\x11\x8c\x1a\x59\x60\x22\x78\x80\
+\x90\x42\x28\x49\x64\x04\x4b\xaa\x5b\x7f\xf8\xfa\xe6\x83\xed\x9b\
+\xfd\xf7\x47\x36\x6e\x67\xb4\x27\x5f\x25\x17\xcc\xa4\xfc\xe7\x20\
+\x23\x04\x5f\x51\xc9\xea\xa3\x94\xac\x90\x3a\x08\x9e\x03\x27\x2b\
+\x60\xf3\x1b\x59\x2e\x02\x25\x57\x74\x34\xaf\x74\x4e\x5c\x19\x41\
+\x55\x02\xbc\xf1\xe3\xab\x70\xe5\x47\xaf\x6e\xdf\xbf\xff\x66\xbf\
+\xbf\xeb\x92\x8f\xdb\xca\x73\x13\x20\x78\x04\x16\x03\x8e\x97\x83\
+\x38\x0e\xc1\x93\x23\xf3\x8c\x4d\x8d\xfc\xc0\xec\x33\xc9\xd8\x81\
+\xc3\xc0\x40\x8e\x21\x33\x09\x87\x9b\x3a\xcb\x8f\xb7\xef\x22\x21\
+\x48\x08\xca\x03\xfb\x70\xf7\xca\x65\x18\x5f\xfc\xfe\xf6\xa7\xbe\
+\xfb\xd3\x3e\x94\x9f\x7c\xe2\xf4\x31\xbb\x9d\x22\xac\xef\x60\xfd\
+\x82\x1a\x9d\x9b\x9b\x83\xaf\x6e\xfd\x4e\xd7\x44\x6d\xff\x6b\x25\
+\x69\xb2\xd0\x56\x3a\x79\xf2\x19\xc3\x77\x04\x47\xc0\x63\x0b\x90\
+\x1f\xa1\x0a\xb3\x4c\xf8\xdf\xa3\xf1\x27\x55\xe5\x12\x2a\x29\x30\
+\x6b\x39\x65\xea\x7e\xf5\xf2\x5b\x0a\x06\x7f\xbe\xa6\x5f\x1b\xe8\
+\x36\x62\x79\xc0\xcc\xb5\x03\x0f\xfe\xfe\x37\x78\xf3\xe7\xdf\xdb\
+\x1a\x7d\xe3\x27\xe3\xfd\xd1\x73\x27\x9f\x9c\xd7\x93\xda\x1d\x8b\
+\xb1\xe6\x3e\x82\x3f\x77\xee\x1c\xbc\xf4\xd2\x9c\x11\x06\x35\xcd\
+\xe9\x92\x3a\x52\xdb\x90\x7e\x47\x4e\x0b\x79\xb0\xb5\xef\x4a\x79\
+\x0a\x06\xd2\x55\x05\x12\x86\xb3\x53\xb0\xbf\xb1\x0b\xfb\x83\x3d\
+\xf8\xf7\x95\x77\x61\x74\x6f\xe5\x12\x3c\xb8\xb4\xa3\x47\xbe\xad\
+\xdb\xae\x8f\x92\x61\xdc\x81\x59\xe8\x9d\x7d\x01\x96\x5e\xfe\x36\
+\x74\x97\x5e\x84\x71\x2e\xb5\x6a\xe1\x33\xa7\xd6\x16\x8e\xcd\x0c\
+\xdb\x3c\x37\x84\x7b\xfe\xae\xbe\x71\xbf\x7b\xd9\xad\xf3\xd2\x54\
+\xa7\x85\xa9\x58\xe9\xf7\x32\x65\x94\x81\xc7\x41\xde\xcd\x6f\x8f\
+\x5f\xfc\xa0\x26\x75\x14\x09\x21\xdf\xdb\x82\xc1\xe5\x1b\xf0\xc1\
+\xa5\x6d\x4d\x8b\x7f\xea\x3b\x7f\xd4\xed\x36\x3e\x49\x94\x47\xe6\
+\x15\xfc\x3f\x05\xcb\xba\x7d\x5a\xb7\x25\xdd\xba\xce\x5f\x50\x80\
+\x2c\x21\xf8\xff\x7a\x98\x6d\x57\x47\x87\x72\xc2\xb8\xc2\x30\x04\
+\xe0\xa6\x6e\xff\xd2\xcd\xff\x57\x83\x26\x20\x78\x1f\xab\xad\x9e\
+\x13\x86\x40\xbb\xa8\xfc\x58\x0f\x12\x42\x3d\x64\x1c\x0a\xb9\xe7\
+\x04\x09\x7f\xaa\x9c\x70\x3c\x2e\x4d\x3f\x4e\x61\x83\xe3\xbf\xbf\
+\x22\x01\x6d\x97\x94\xab\xf9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x07\x8d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x36\x20\x4d\x61\x69\x20\
+\x32\x30\x30\x33\x20\x30\x39\x3a\x30\x30\x3a\x35\x38\x20\x2b\x30\
+\x31\x30\x30\x71\x7e\x34\xbc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x17\x3b\x98\x02\xe5\x42\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x06\xe5\x49\x44\x41\x54\x78\xda\xd5\x5a\x4f\x6c\x15\x45\x18\
+\xff\x76\xdf\x6b\xcb\xe3\x4f\x5b\x0a\x85\x03\xd6\xa0\xa4\x17\x4f\
+\x08\x07\x8f\x26\x28\x97\x86\x08\x07\x48\x43\x02\x1a\x03\x89\x31\
+\xf1\x20\xc4\x13\x27\x2f\x70\x93\x83\x21\x35\x14\x03\x06\x52\x2b\
+\xd2\xa0\x20\x17\x63\x14\x81\xc4\x90\x82\x80\x68\x82\x5a\xfe\x55\
+\x5a\x62\x35\x58\x2a\x60\x5f\x5f\xbb\xbb\x7e\xdf\xec\x7e\xfb\x66\
+\x66\x67\xf6\xed\x36\x2d\xe2\x84\xe9\xec\xce\xee\xdb\xf9\xfd\xbe\
+\x7f\xf3\xcd\x0c\x00\xff\xf3\xe2\xd4\xb8\x7f\x52\x4b\x90\x00\xdc\
+\xd5\xd5\xf5\x6d\xa5\x52\x79\x6a\x6a\x6a\xca\x09\x82\xf0\xb9\xde\
+\xf2\xb5\xe7\x79\xe0\x38\x0e\xf8\xbe\x0f\x0d\xa5\xb9\x6d\x9e\xef\
+\x82\x87\xaf\x04\x7e\x80\xfd\x80\xfd\x6a\xeb\x79\xbe\x18\x29\x7c\
+\x1e\x40\x01\xa6\xa0\x32\x31\x7e\x87\x9f\xeb\xe3\xf8\xbe\x27\xa0\
+\x05\x81\x2f\xc6\xa1\x7e\xd7\x75\xb1\x16\x86\x76\xef\xde\xd3\x89\
+\x0f\xff\xc2\x5a\xa1\x77\x8b\x0c\x6c\x72\x72\xb2\xad\xa3\xa3\xe3\
+\xd9\xc6\xc6\x46\x01\x8c\x7e\x98\xa0\x2d\x11\xe1\x72\xf2\xe4\xe7\
+\xb0\x66\xcd\xcb\x66\x31\x05\xa1\xb0\xf8\x67\xd4\x52\x3d\x77\xee\
+\x0c\xac\x5d\xdb\xf1\x2c\xca\x41\xdc\x53\x5b\x15\x4e\x78\x2d\xb7\
+\x04\x65\x6c\x6c\x14\x4e\x9d\x3a\xe4\x62\xd7\x5a\xac\x5f\x61\xfd\
+\x5d\x21\x40\x92\x5f\xb2\x64\x09\x34\x35\x35\xe5\x53\xa6\x53\x84\
+\xf6\xf6\x76\x2b\x01\xae\x28\x93\xb8\x3d\x7d\xf6\x1c\x2c\x5b\xb6\
+\x4c\xe9\xe3\xaa\xdf\x13\x01\x14\x3e\xd4\xd5\xcd\x87\x72\xb9\x4c\
+\x52\x7d\x06\x6b\x89\xc7\x60\x02\xc2\x6c\x48\xf2\xb9\x8d\x31\xb0\
+\x3f\x93\x95\xc8\xd7\xc2\x64\x20\x1d\xb4\xdc\x57\xd5\x90\xc7\x16\
+\x50\x07\xa1\xe9\x53\x0d\x5c\x1e\xc0\x63\x9d\xcd\x70\x21\xc0\x7a\
+\xd5\xfb\x4d\xef\x26\x05\xe1\x0b\x9f\xd2\x8b\x5b\x7d\x69\x76\x03\
+\x90\x0c\xdc\x46\x32\xbd\xdf\x31\x62\x8c\x09\x4c\xc7\x7c\xa2\xef\
+\x66\x02\xaf\x80\x09\x1c\xab\xb4\xd3\x08\x51\x54\xb2\x12\x78\x1c\
+\xc5\x06\x2c\xeb\x73\x53\x14\x74\xd3\x1e\x66\x2b\xd3\xfd\x5d\x3e\
+\x62\x61\x9b\x62\x42\xb6\x17\x66\xaa\xa8\x26\x13\x28\xfd\x59\x8b\
+\xc9\xcc\x15\x0d\x4c\xdb\x0f\x1e\x53\xa9\xa9\x81\x27\xbb\x04\xb5\
+\x35\x30\x53\x52\x99\xe9\xdf\x84\xf9\x92\xf9\x77\x71\x2a\x41\x04\
+\x30\x1f\xa2\xe9\x3a\xa7\x60\xf2\x2b\x11\xa3\x28\xa6\x2e\x65\x25\
+\xd5\x60\xa0\x85\x42\x98\x3a\x70\x1f\x0b\xbd\xa1\xc1\x33\x86\xd1\
+\xa2\x7c\x73\xe2\xc4\x09\xcc\x39\x8a\x90\xaf\xf8\xb0\xbf\xfb\x40\
+\x4e\x06\x05\xe8\xed\xfd\x38\x12\x1c\x64\x6a\x49\xb8\x22\xab\xb5\
+\x11\x20\xfb\xda\xb2\x65\x2b\x14\x8b\xf9\x08\x1c\x3a\x7c\x18\xde\
+\xd8\xbe\xad\x36\x66\x29\xa9\xeb\x3e\x78\x10\x36\x6f\xde\x2a\x24\
+\xcd\xf9\x8e\xfc\x8e\xac\x15\x4e\x7f\x1e\x3c\xf8\x1b\xae\x5c\x39\
+\x9f\xae\x81\x72\x79\x1c\x5a\x5a\x5a\xf2\x09\xd3\x9b\x4e\x02\x88\
+\x6b\x82\x42\x5d\x22\x69\xd3\x13\x3a\xae\x44\x74\x74\x74\x62\xb6\
+\x26\xb2\x3c\xc0\x93\xd2\xd6\x9f\x99\x60\x54\x83\xcf\x6c\xe4\x42\
+\x39\x80\xeb\x80\xd3\x9e\xe9\xce\x4d\x2b\xb9\x54\x27\x9e\xed\x6c\
+\x54\x77\x4a\x19\xa8\xed\x5e\xee\x0b\xe5\x3b\x2b\xd9\x68\x3a\x71\
+\xdd\x31\x4d\x26\x64\x7b\xa6\x6a\x40\xa0\x4c\x7c\x5f\xd1\xc0\xf4\
+\xdc\xc0\x4e\xdc\x04\xde\x16\x71\x6a\x91\xa9\xa9\x01\xb2\x2f\x56\
+\x82\xcd\x99\x2c\x2a\xb0\x82\xcf\x0a\xb4\xd6\x3b\x3c\x13\xd7\x98\
+\xc8\x1c\x89\xa9\x3c\x7d\xe7\xd7\x49\x56\x70\xf5\xf5\x2a\x59\x5d\
+\x80\xdc\x3f\x36\xc6\x78\x92\x52\x95\x52\x89\x70\xcd\x29\xb3\x36\
+\xaf\x4d\xed\x0a\xb0\x49\x97\xe3\x7c\x0c\xca\xa9\xbe\x5b\xea\x72\
+\x42\x2b\xb4\xd4\xfb\x3b\x82\xe8\x1b\x66\x49\x2a\xb9\x90\x2e\x41\
+\xd3\x42\x3c\x21\x04\x3f\xbb\x59\xc4\xb3\xae\xaf\xfa\x5b\xcf\x5b\
+\x7b\xc4\xa6\x17\xa7\xf4\xd4\xde\x7e\x74\x11\xde\xdd\xff\x85\xf4\
+\x5d\xdf\x18\x68\x14\x13\x9a\x37\xaf\x24\x72\x0e\x9b\xe9\x18\xfb\
+\x70\x9a\xcc\x62\xdb\xb2\x16\x1c\xd7\xc1\xd9\x75\x12\xe4\x6c\x7e\
+\xb8\xf2\x83\x00\x48\xbb\x23\xd4\x7e\x3f\x38\x18\x02\x2c\x7a\x50\
+\x2a\xf9\xb0\x78\x71\x09\x4c\x45\xca\x85\x3c\xe8\xe9\x39\x82\xc9\
+\x5c\x5d\x3e\xdb\x47\xc9\x1c\xf8\x30\x67\x32\x87\xc3\xf6\xf6\x1e\
+\x81\xd5\xab\x57\xa5\x05\x31\xb1\x70\xbb\x76\xed\x47\xb8\x70\xe1\
+\x12\x0a\xb6\x92\xee\x03\x54\xd6\xad\xdb\x80\x5a\x98\xab\xa8\x37\
+\x6d\x3b\x84\xca\xd1\x63\x9f\xc2\xeb\xaf\x6d\x8b\xa5\x9f\x45\x0b\
+\x3d\xc7\x3e\x82\xf5\xaf\x6c\x84\xf9\xf3\x1b\x00\x4e\xf3\xf3\x40\
+\xd9\x23\x65\x08\xed\xed\xcf\x41\x6b\xeb\x0a\x78\xf4\xe8\x21\xf4\
+\xf7\x9f\xb1\x13\x08\xf7\x25\x8b\x18\x19\x16\x24\x9c\xd8\xb4\xc3\
+\x26\x6b\xa0\x96\x09\x51\xb4\x91\x85\xf2\xc2\xaa\x95\xb0\x70\xe1\
+\x02\x94\x2a\x84\x1a\x88\xc0\xcb\x24\x58\x03\x9e\x57\x0f\x8d\x8d\
+\xf5\x68\x4a\x2e\x6c\xda\xd4\xd9\xd4\xd3\xf3\x09\xd9\x9d\x9b\x20\
+\x10\x0e\xee\x28\x20\x98\x84\x3c\x23\x26\xa6\x7a\x30\xa7\xc4\x3a\
+\x19\x11\x6d\xb8\x10\xe8\xd3\x0c\x1e\x14\xf0\x31\x89\xe8\x23\x8b\
+\xf6\x2a\x51\xaa\x19\xde\x81\x5d\xd8\xee\x82\xbd\xb0\x1c\x7b\x46\
+\xb4\x28\xe4\x03\xef\x18\xeb\xf3\x80\x31\x02\x31\x1e\x3f\x1d\x3c\
+\x83\xa6\x68\x53\x1d\x4f\x92\x7c\xb4\xde\xe5\x08\x44\xf5\xf9\xb6\
+\x36\x58\xff\xf6\x86\xf8\x1d\x3f\x6a\x07\x46\xbf\x83\xbd\xdd\xc2\
+\x94\x36\x62\xed\xd3\x4c\xa8\x2a\x4d\xdd\x7c\xac\x4e\xed\xa8\x04\
+\x6c\x44\x44\xb8\xc5\x50\x49\xd1\x26\xb6\xf3\x40\x0d\x9d\xfa\xf5\
+\xad\x07\xfd\xf1\x3d\x13\xbc\x7a\xf7\x2e\xef\xca\xb4\x61\x9d\x23\
+\xe5\x42\xb2\x29\x25\xb5\x60\x4d\x2d\x7c\x0b\x60\x5d\x0b\xbe\xba\
+\x75\x63\x23\xa0\xdf\xeb\xef\x06\x6c\xb7\x91\x1f\x48\x61\x34\xd4\
+\x00\x9b\x10\x93\xd2\x7d\xc0\x66\x42\xa6\xb5\xac\x4e\x80\xe3\xbc\
+\xac\x75\x1d\x74\x1a\x99\xd8\xc1\x25\x61\x2a\x1a\x90\x43\x9d\x29\
+\x17\xb2\xa5\x12\xb5\x4c\xa8\xaa\x29\x55\x03\x59\x4d\x49\xa9\xda\
+\x6c\xac\x68\x40\x97\x5a\xad\x08\xc4\x0c\x4c\x04\x64\x22\x7e\x14\
+\x45\x28\x3d\xe0\x19\x36\xfe\x54\xe4\xb0\x3a\x91\xcb\x43\x43\x8a\
+\x03\x83\xac\x01\xdf\x40\xc0\x71\xd4\xd3\x11\x59\xe2\xa9\x3e\x00\
+\xf2\x9a\x35\x3d\x0a\x71\x6e\x13\xa3\x8f\x5a\x8a\x36\xe4\xb0\x7a\
+\x18\xfd\xf2\xd4\xcf\x51\x9c\x06\xb5\x0d\xaa\x34\x94\x6d\x15\x9a\
+\x07\x74\x13\xb2\x9a\x4e\x15\xb2\xd1\x64\x74\x22\x63\x3b\xab\x87\
+\x7d\xbf\x5e\xbf\x02\xed\x2b\x56\x8a\xfb\x96\xf7\xc2\x81\xd8\xb4\
+\x14\x07\xc6\x7f\x57\x5f\x0d\x4f\x32\xef\xdd\x1b\x81\x7d\xfb\xde\
+\x1c\xec\xeb\xfb\xec\x12\xbe\xf6\x07\xd6\x3b\x58\xcb\xda\x26\x90\
+\x13\xef\xd5\x64\x9a\x85\xb1\xb8\x8e\xaa\x35\x19\x34\x5f\xdf\xbf\
+\xaf\xf6\x5f\xbc\x74\x19\x5a\x17\xad\x84\xe6\x66\x88\x7d\x43\xaf\
+\xc2\x6c\xa2\x2d\x95\x30\x98\x14\xf0\x5a\x00\x20\x1b\x24\x55\xde\
+\x00\x79\x22\xa3\x73\xd8\x91\x91\x61\x18\x1f\xff\x47\x7c\x35\x69\
+\x32\x4e\x6c\x7c\xf2\xb1\xcf\xc4\x78\x19\x06\x06\x7e\x4a\xce\xd0\
+\x52\xbc\xd3\xc9\x8d\x63\x5e\x33\x3c\x7c\x0b\xc7\x5c\x18\x46\x27\
+\x53\xb4\x89\x34\x30\x34\x74\x13\xc7\x73\x71\x51\xf3\x27\x9d\x13\
+\xd3\x27\x1e\x46\x24\x7e\xa3\xcf\x31\x01\x32\x9a\x81\xe3\xc7\x3f\
+\x28\x57\x2a\x13\x8e\xe7\xa9\x46\x6a\x3a\xf0\xa6\x6d\x3e\x22\xd2\
+\xd8\xbc\x78\xf9\xb5\x1b\xb7\xc5\x41\xb7\x43\x0e\x4d\x87\xd3\xd4\
+\x72\xb8\x8c\x0f\xb8\xa3\x83\x6f\x44\xec\x06\x1e\xf4\x9f\x3f\x3b\
+\xd8\xd9\xb9\xb9\x05\x6f\x5b\x6d\x51\x87\xc8\x75\x77\xef\xf8\x85\
+\x2e\x0b\x85\x42\x50\x2e\x4f\xde\x83\xf0\x80\xdb\x63\x70\xb2\x51\
+\x2c\xc5\xfa\x12\xd6\xe5\x91\x6f\x64\x4d\xa8\x49\x2c\xa5\xa8\xcd\
+\x53\x3c\x01\x06\x73\x9b\x9d\xdb\x5f\x14\x33\x6c\x2c\xb6\xc8\x1f\
+\xbe\x39\x89\x56\xf2\x3e\x1c\xc7\xcb\x9b\x91\xe4\x29\xfd\xbb\x8d\
+\xf5\x6b\x32\x1f\x9d\x00\xad\x50\x51\xa7\x30\x07\xf2\x9d\x1b\x38\
+\x11\x78\x07\xb2\x93\xe6\x58\xe2\xc3\x4e\xb8\xae\xf4\x48\x51\x4b\
+\x5c\xef\x83\xfd\xf8\xf7\x28\x84\x66\x43\xa4\x69\xfb\x7c\x34\xd2\
+\xc4\x13\xf1\x9f\x3d\x9e\x86\x30\x31\x6b\x33\x08\x8e\x68\x50\xb4\
+\xe9\x83\xd0\xe6\x65\x01\xfc\x67\x80\xf5\x42\x1a\x5f\x1a\xb5\xa6\
+\x42\x12\x1f\x89\xda\x44\xf9\x17\xdb\x91\x6a\xec\xf8\xda\x56\xb1\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x09\x89\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x36\x20\x4d\x61\x69\x20\
+\x32\x30\x30\x33\x20\x31\x32\x3a\x31\x31\x3a\x33\x32\x20\x2b\x30\
+\x31\x30\x30\x47\xeb\x88\x5e\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x18\x07\x30\xf5\x85\x0a\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x08\xe1\x49\x44\x41\x54\x78\xda\xcd\x5a\x5d\x8c\x5d\x55\x15\
+\x5e\x7b\x9f\x7b\xef\xdc\xf9\xe9\x70\x67\x4a\xa1\xa3\x32\x4c\x7f\
+\x80\x00\x21\x44\x52\x5f\x7c\x20\x24\x44\x8d\x18\x89\x0f\xb6\xa5\
+\x2f\x0a\x09\xc6\x08\x84\x80\x96\x98\x68\x7c\x23\x24\x3c\x00\xc3\
+\x8b\x31\xd1\x67\x62\xa3\x89\x21\x31\x31\x68\xe2\x8b\x86\x2a\x3a\
+\x0d\x24\x6d\x83\xb6\xb4\xb1\xd3\x0b\x73\xa1\x99\xce\x4f\x67\xe6\
+\xfe\x9d\xb3\x5d\x6b\x9f\xbd\xf6\x59\xfb\xdc\x73\xef\x2d\xf4\x8f\
+\x0d\x8b\xbd\xcf\xcf\x3d\xfb\xfb\xd6\xdf\x5e\x7b\x0f\x0a\xa8\x1d\
+\x7a\x33\x82\x89\x99\xef\x81\x56\x87\xc0\xc0\x2e\x50\x46\x83\x6b\
+\xf3\x5f\x8b\x77\xde\x3e\x99\x54\x68\xac\x94\xb2\xc2\x2d\x49\x12\
+\x30\xc6\xd8\x71\x37\x8e\xed\xd8\xe0\xbd\x18\xc7\xb1\xbb\xa6\x77\
+\xec\xf3\x6e\x17\xc7\xf8\xdc\xc8\xeb\x74\x4c\xef\x7d\xb8\x51\x69\
+\xbf\xfc\xef\x1d\x4b\xd0\xe9\x00\xc4\x78\x3f\xee\x1a\xe8\x34\xcf\
+\xc2\xfa\x47\x7f\x80\x77\x5f\xfe\x2d\xac\xfc\x6f\x8d\x7e\x06\xb9\
+\x56\x82\x43\x26\x82\xa9\x63\x6f\x40\xab\xbb\x5f\xd5\xeb\x4a\x37\
+\xb7\x90\x07\x7e\xd4\x81\xad\xc1\x4e\xf8\xea\xfd\x77\xc3\xd8\xd8\
+\x98\xfd\x81\xd6\x1a\xa2\x28\xb2\xcf\x68\x62\x26\x64\xc1\x3b\xc0\
+\x0c\x4e\x0a\x11\x2a\xba\x47\xbf\xd9\xdc\xdc\x84\xb7\xfe\xf1\x9f\
+\xd2\xec\x4d\x66\xb7\x52\x65\x37\x4f\x15\x9a\xcd\xd1\x3d\x1f\x37\
+\x2a\x0f\xc7\x0f\xfc\xfc\xeb\xf0\xd7\x17\x0e\x03\xac\x2e\xe2\xa3\
+\x56\x48\x60\xf2\xe8\x8f\x60\xcb\xec\xd7\x27\x4f\x20\x16\x0d\x16\
+\x4f\xa4\x90\x04\x12\xd0\x08\x14\x4d\x52\x2a\x95\x3c\x68\x26\x40\
+\x92\x6f\x4c\x80\x9e\x31\x48\x26\x43\xf7\xd8\x32\xfc\x8c\x95\x40\
+\xdf\xc4\x5f\xc3\x08\x7e\x52\xe1\xdc\x2a\xd2\x38\xbf\x46\xa5\x95\
+\x61\x7a\x7b\x55\xfd\xf7\x44\xe7\xd1\xce\x3d\xfb\x4f\xc3\xc9\xdf\
+\xfc\x12\x5f\x3c\x27\x2d\x51\x02\x28\x3f\xa9\xcf\x9f\x51\xd6\x3d\
+\x34\xbb\x88\x02\x10\x9a\x65\xf7\xa1\x89\x58\x08\x58\xa3\xd1\xf0\
+\x16\xa0\x9e\x5d\x8a\xfb\xfc\x98\xa4\x5c\x2e\x5b\xe1\xef\x06\x56\
+\xb4\xdf\xd1\xd0\x5e\x3e\x67\xe7\xd7\xa5\x0a\x54\xb7\x7f\x11\x66\
+\xbe\x54\x53\xe7\x3e\xba\xe7\x1b\xf8\xf8\xef\x28\xcb\x28\x2b\x19\
+\x01\x03\x73\xaa\xd9\x44\xf0\x3a\xfd\x90\x73\x9d\x54\x32\xe0\x12\
+\x28\x49\xbb\xdd\x86\xc5\xc5\xc5\x42\x4b\xc8\x38\xc9\x5b\x68\x72\
+\x72\x12\x46\x46\x46\xac\x25\xe4\xbb\x96\x90\xd5\x5d\x04\x5b\x8b\
+\xef\xe2\x75\x07\x4a\xd5\x9b\x60\xa4\x36\x03\x63\x13\x18\x82\x6a\
+\xf2\x36\x7c\x7a\x27\xca\x42\x48\x80\x5c\x83\x00\x9a\x54\xf3\x0c\
+\x3c\xfd\x18\x6a\xd5\x69\xaa\x08\x98\x11\xcf\x8a\xee\x0f\x22\xd2\
+\x9f\xb4\x81\x68\x74\x12\x4c\xdc\x05\x5d\x19\x4d\xdd\x0c\x83\x1f\
+\xe2\x0e\xbd\x30\x8d\x32\x12\xc6\x00\x11\xd7\x68\xc6\x84\xb5\x0f\
+\x39\x2b\x28\x9f\x2d\x64\x23\x2d\xee\xdd\xbb\x37\x00\xc9\x6e\x22\
+\x33\x90\x74\x25\x8e\x85\x42\x52\x14\x13\x16\x7e\x02\x95\xed\xbb\
+\x71\x14\x83\x8e\x2a\xd6\xad\x50\xbb\x78\x69\x47\xfc\x63\xe5\x3c\
+\x8e\x62\x00\x6c\xc0\xda\xd4\x03\x21\x01\x7a\x2d\x41\x30\x45\x99\
+\x86\x80\xec\xd8\xb1\xa3\x10\x4c\x07\x53\x21\x07\xab\x0c\x5a\x8a\
+\x1b\xba\xa6\xbe\xb8\xe1\xbc\xa8\xed\x91\x9b\xe7\xc0\xc7\x24\x2a\
+\xd7\x86\x6c\xd2\x05\x01\x5e\x58\x00\x89\x18\x45\x51\x9f\xf8\xc0\
+\x55\x82\x80\x11\xc0\xa5\xf9\x09\xc4\xca\xca\x4a\x4f\x10\x4b\x91\
+\x56\xe0\x7b\x9c\xd1\xf2\x56\xcb\xa0\xd1\x5a\x12\xa7\x0a\x4d\x94\
+\x0d\x6a\x7b\xbb\x1b\x17\x52\xb6\x16\xb0\x4c\x79\xed\x72\x81\xcb\
+\xbd\x11\x6e\x40\x8d\xd3\xdf\xd6\xd6\x16\x9c\x3a\x75\xca\x02\xea\
+\xd7\x8a\x62\x86\x82\x78\x7c\x7c\x3c\x04\x9e\xbe\xdc\xab\x5f\x1f\
+\x8c\xfd\x9b\x77\x21\x06\xed\x27\x76\x04\x12\xa1\x3d\xce\x48\xac\
+\x55\x99\x9d\x2e\x87\x00\x93\xc8\xbb\xa4\x5c\xb1\x7b\x80\x53\xa7\
+\xfb\x4e\xe1\x2c\xe0\xfc\x2d\xb0\x00\x03\x10\x93\xe4\xb3\x47\xad\
+\x56\x0b\x40\xca\xb5\x80\x17\x29\xe9\x7a\xec\x42\xb2\x04\xc9\xa7\
+\xe7\xf4\x9f\x94\x83\xa7\x61\x86\x11\xa0\x95\xd7\xae\xb9\x99\x06\
+\x94\x4f\xa3\x99\x4f\x07\x3f\x44\x20\xbb\x76\xed\x0a\x80\x73\x5f\
+\x14\xc0\x89\xa8\x91\x38\x4b\x15\x5a\x40\x7a\xcd\x10\xed\xa7\x04\
+\xd2\x3c\xe5\x6a\x1f\x41\xc0\xf5\x32\x00\xa5\x26\xa9\x5f\x5e\x5e\
+\x0e\xb4\xc8\x24\x8a\x00\xb2\x90\xdb\x11\x79\xd3\x63\x59\x53\xec\
+\xff\x46\xd9\x75\x6a\xa8\x05\xd8\x74\xfc\x1f\x6f\x81\x24\x24\xc0\
+\x71\xd0\xc4\xd5\xbb\x5e\xaf\xbb\x3a\x66\xb0\xdf\xcb\x46\x45\x21\
+\x65\xa1\x3c\x01\xef\x3e\xb2\xe2\xf5\x16\xe8\xef\x43\x59\x0c\xf4\
+\xb1\x40\x92\xc4\x3d\x04\x24\xd8\xfc\xf5\xa0\x26\xe3\xa1\x57\x42\
+\xf7\xf1\x31\x60\xd4\xc0\x44\x14\x04\xb1\xb4\x40\xfa\x6f\x1a\x17\
+\xec\xbf\x72\x65\xa6\x49\xb7\x6d\xdb\xd6\xb7\xbc\x28\xea\xd9\x85\
+\x64\x5c\xf0\xb3\x98\x72\x7f\x50\x48\xaa\x8c\x05\x0c\x73\x21\x2d\
+\x5c\xc8\xfb\x9f\x5b\x07\x72\x41\xcc\x24\x08\x88\x5c\x89\xf3\xd9\
+\x46\x6a\x97\x0b\x37\x0e\xea\x22\x0b\x70\x08\x28\x15\x4a\x3a\xa7\
+\xe9\xeb\x46\xce\x02\x94\xcf\x13\xef\x36\xec\x7f\xd6\x02\x49\x6f\
+\x0a\x95\xab\x6e\xfe\x5e\x3e\x88\xc1\x59\x30\xdf\xe7\x53\xad\x92\
+\xe8\x85\x15\x86\xb9\x65\xba\x90\x45\xa9\x03\xaa\x0c\x79\x66\x01\
+\x2c\xae\x2e\x5d\xba\x64\xeb\x1b\xfb\x2e\x6a\x9e\x81\x71\x00\xcb\
+\x14\x5a\x94\x85\x58\xfb\x45\x3d\xfd\x86\x56\x75\x4e\x1c\xde\x8d\
+\x59\xb4\x75\x91\x01\x04\x68\x12\x48\x77\x60\xac\x75\x69\x81\x0f\
+\x2e\x68\x58\xfd\xdb\x19\xaa\x50\x32\x92\x81\x52\x5c\xcd\xe4\x2d\
+\xe4\x80\x43\x56\x32\x72\x9a\x4c\x9c\xab\xf0\x75\xf6\x0c\x37\x8b\
+\xdd\x31\x6f\x81\x20\x23\x19\x35\x70\x29\x48\x2d\x50\x8a\x40\x27\
+\xd0\x0b\x10\x3f\xf0\xbb\xf7\x32\x32\xec\xa4\xd9\x9e\xa1\xb7\xfc\
+\xa6\x77\xac\x65\x6c\x62\x10\x99\x4a\x8b\x12\x5d\x8c\xfd\xfd\x01\
+\xbd\xd1\x6a\x30\x81\xf4\x63\x5a\x7a\x4f\xb8\x1e\x80\x00\x0b\x79\
+\xd0\xd9\x38\x2b\x04\xb3\xdd\x5c\xef\x2e\x4f\x6e\x98\x0a\x82\x36\
+\x2f\x1a\x2e\xc3\x02\x5a\xc9\x08\x08\x2c\x50\xb4\xb8\x65\x44\x32\
+\xd0\xe1\x18\xb2\xfd\x75\x21\xf0\x90\x90\x64\xe0\x5d\x87\xbf\x6f\
+\xd2\x2a\x61\xb8\x05\xb4\x20\x70\xd9\x16\xc8\x69\xdf\xa9\xb4\x17\
+\xfc\x60\xe0\xd9\xfe\xbb\xd7\x0a\x7e\xaf\x35\x94\x00\x5b\x40\x32\
+\x90\xe5\x35\x3f\x0b\xaa\x47\x10\x20\x20\x00\x1d\x80\xd7\x45\xc0\
+\xf3\xf9\x3e\x4f\x28\x7b\xd7\xf0\xce\xaa\x1f\x01\x3b\x81\x91\x25\
+\x81\xb0\x85\x0c\x60\x26\x93\x2f\xb9\x73\xbe\xdf\x0f\x7c\xaa\x4e\
+\xf0\x64\x7b\xad\x90\x73\x29\x10\x16\xe9\x6b\x01\x23\x2c\x10\x6c\
+\x8a\xb2\xeb\x87\x6f\x3e\x0d\xb3\xb5\x18\x22\xda\x0e\xba\x73\x21\
+\xbf\x98\x61\x1a\xec\x76\x3b\xe9\x3e\x18\xb7\x7d\x6d\xec\xf9\x9a\
+\xb6\x9d\xdd\x56\x6c\xaf\x69\x9c\xde\x8b\xed\xea\x7e\xb1\x33\x02\
+\xcb\x77\x3d\x3e\x24\xb0\xdd\xaa\x7f\x59\x31\xa0\xfa\x5b\x60\xb4\
+\xd4\x86\x17\x9e\x79\xd2\x2e\x38\x54\x85\x52\x4f\xc7\x81\xd4\x6f\
+\x6c\x6c\xd8\x7b\x24\x34\xa6\x46\x15\x27\x9d\x5a\x50\x3f\x3a\x3a\
+\xea\x85\xae\xab\xd5\x2a\x4c\x4f\x4f\xc3\xb7\x0e\xfd\x10\x56\x4f\
+\x9e\xc9\xb9\x5e\x3a\x9e\xba\xff\x8e\xc0\xbf\xcc\xe0\x1d\x99\xf1\
+\xb5\x50\xe6\xfd\xb9\x0a\x10\xad\xb4\xbe\xbe\x0e\x0b\x0b\x0b\x70\
+\xf6\x7c\x03\xc6\x26\x26\xa1\x14\x95\x6c\x01\xd6\x6e\xb5\xa1\xd5\
+\x6a\xe2\xf3\x35\x18\x2f\x1b\x98\x99\x99\xb1\xf5\x3e\x9d\xbe\x51\
+\xd9\x2c\xb7\x9d\x72\x27\x16\xc7\x5d\xa8\xdd\xbb\xdb\x9d\x3c\xe8\
+\x20\xf0\xef\xf8\xc2\x34\x9c\x5e\xba\xe8\x39\x68\x33\xd4\x02\x62\
+\x3f\x26\x57\x63\x77\x4d\x6b\x26\x69\x9c\xb4\x3c\x7f\x62\x8f\xaf\
+\x99\xb2\xe0\x4b\x35\xf7\xf4\xdc\x31\xab\xe5\x4a\xa5\x62\x35\x2d\
+\x85\x2c\xc2\x3d\x3d\x4f\x57\xbc\x30\xe8\xc3\x42\x54\x58\x60\x58\
+\x16\xa2\x83\xa3\xb0\x68\x12\xe9\xd3\x5d\x13\x78\xf2\x63\x55\x00\
+\x9c\x49\x93\xb6\x89\x00\x69\x3f\x0f\x9c\x84\xdc\x88\xae\xad\x51\
+\x4d\x92\x5b\x3f\x72\xae\x2c\x82\x7a\x78\x0c\x68\xd5\x9b\xff\x45\
+\x18\xd0\x64\xe4\xef\x74\x1e\xca\xef\x3e\xf2\xc0\x2d\xa1\xbb\xa1\
+\x3c\x78\xdf\x83\x16\x28\xb9\x0e\x1f\xe2\x92\xb6\xc9\xa5\xa8\xe7\
+\x31\xb5\x5f\x1c\x7e\x06\xfe\xb4\xb4\x1d\xfc\xfc\x02\xf8\xcc\xd4\
+\x38\xec\x99\x76\xc4\x68\xff\xd0\x89\xe1\xa7\xaf\x3c\x32\xfa\xd8\
+\x37\x7f\xec\xf7\x68\x0e\x9d\xa1\x23\x02\xd0\x65\xf4\xd5\x28\x81\
+\xbc\xad\x58\xd3\x31\xbe\x43\x2e\xd4\x6a\xb5\x02\x8d\xbf\xfe\xf8\
+\xdd\xc1\xfb\xaf\xc3\x35\x6d\xf4\x87\x83\x9f\x38\xa1\x36\x87\xd2\
+\xb0\x04\xd2\x32\x48\x07\x5b\xba\xcc\x18\xe9\xb6\x92\x08\xb0\x05\
+\x6c\x73\x7a\x38\x72\xe4\xc8\xb5\x85\x5d\xd0\x0e\x1e\x3c\x48\xdd\
+\x77\x51\x7e\x5f\x42\xc7\xb6\xb5\x10\x15\x90\xc1\xb1\x8f\x4f\x44\
+\x48\x20\x2e\xb6\x00\xb7\x03\x07\x0e\x78\x17\xc8\x1f\x5c\x5d\x43\
+\x02\x74\xdc\x5e\xd5\x98\xcf\x96\x2f\x6e\x19\x4c\x8b\xb8\x40\x45\
+\x7c\xa0\xca\xa5\x6c\x9a\xde\xd8\x85\x7c\x0c\x88\xda\x89\x9b\x3c\
+\x5d\x28\x3a\x04\xbb\x06\x4d\xa7\xff\x39\xfb\xe7\xef\x5f\xfc\x64\
+\xed\x4c\xfd\x42\x3b\xcd\xdb\x3d\x24\x94\x5d\x49\xe5\x1f\x24\x2c\
+\x78\x75\x45\x93\x5f\x45\x16\x47\x5f\x3a\x06\xef\xbc\xf8\xf4\xda\
+\xd2\xd2\xf1\x7a\xfd\x92\x5b\x7c\xdc\x61\x92\x23\x41\xe0\x29\x3d\
+\x66\x47\xde\x62\xc7\x7d\xc3\x09\x00\x6c\xc2\x87\xef\xbc\x0d\xc7\
+\xe6\x9f\x5b\x6b\x34\xde\xaf\x2f\xae\x42\x54\xa6\x23\x70\x74\xa9\
+\x12\xb9\x95\xb6\xf5\x0b\xe5\xf0\x89\x89\x09\xf8\xb6\xfa\x23\x7c\
+\xa7\xf4\x16\x3c\x71\x5f\xfb\x46\x63\xb7\x8d\x92\x32\x39\xeb\x3a\
+\x7c\xf2\xaf\x7f\xc2\xf1\x5f\x3d\xbb\xda\x7e\xe2\xb5\xce\x66\xfb\
+\xde\x5b\x6f\xab\xa1\x01\xd2\xfd\x72\x07\x7d\x9f\xc0\xef\xdb\xb7\
+\x0f\x1e\x7a\x68\xc2\x92\x99\x9a\x9a\xba\xd1\xd8\x3d\x01\x70\x24\
+\x36\xa0\xf1\xf6\x51\xd8\xfa\xf8\xa9\xcd\xd9\x47\x9f\x3a\x7b\x7e\
+\xf6\x2b\xd0\xe9\x62\x90\x77\x61\x6a\x67\x6b\xfa\xa5\xf9\x37\xec\
+\x1f\x70\x79\x6d\xf8\xd9\xe1\x1f\x50\x3d\x10\x7d\xc6\x79\xaf\x3a\
+\x81\x8c\xc4\xda\xe9\x05\x38\xfe\xea\x8b\x38\xfe\x32\xca\x2c\x4a\
+\x75\xe1\xb8\x75\xb5\xb2\x03\x6c\x29\xfc\xe5\xcd\x5f\x53\xf7\xfc\
+\xe7\x89\x00\x93\xd8\x44\x39\x85\xd2\x40\x19\x13\xa0\xe5\x32\x0e\
+\xee\xda\x13\xb8\x9e\xeb\xc0\x20\x02\x4c\x82\xfe\x9c\x7f\xe1\xd3\
+\x7c\x48\x82\xbd\x1e\xc0\xaf\x56\x33\x37\x50\xe6\x51\xee\x2a\x0d\
+\xc7\x38\xb0\xcd\x41\x5a\x93\xd0\xb2\xae\xaf\xec\x53\x9f\xaa\xd1\
+\x31\x1c\xfd\x8f\x1f\xcd\x2b\x5d\x8d\xaa\x28\xb7\xba\xfe\x7a\xb7\
+\x26\x4a\xe3\xff\x19\xf5\x4b\xa6\x3e\x14\x68\xc8\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0e\x77\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x44\x6f\x20\x32\x31\x20\x4e\x6f\x76\x20\
+\x32\x30\x30\x32\x20\x31\x31\x3a\x34\x35\x3a\x34\x35\x20\x2b\x30\
+\x31\x30\x30\xb2\xab\x05\x98\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x18\x2f\x05\x40\x2d\xf0\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0b\x11\x00\x00\x0b\x11\x01\x7f\x64\x5f\x91\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x0d\xcf\x49\x44\x41\x54\x78\xda\xdd\x59\x69\x8c\x5d\x65\x19\
+\x7e\xce\xb9\xfb\xbd\x33\x9d\x99\xce\x4c\x3b\x2d\xcc\x50\xdb\x29\
+\xb5\xa0\x14\x2c\xca\xa2\x42\xab\x18\x84\x10\xc1\x2a\xc6\x08\x82\
+\xa2\xfe\x51\x51\x0c\x89\x4b\xe2\x42\x08\x12\x12\x82\x3f\x88\xa2\
+\x31\xc6\x44\x42\xea\x42\x04\x84\x42\x51\x6a\x43\x28\x74\xa1\x74\
+\x63\xe8\xd0\xce\xd2\xb9\xb3\xdd\xd9\xe7\xce\xdc\xfd\xac\x9f\xcf\
+\x77\xce\xb9\xcb\xdc\xde\x99\xa9\xe0\x12\x3d\xed\x3b\xdf\xd9\xcf\
+\xf3\xbe\xef\xf3\x2e\xdf\x77\x81\xff\xf1\x4d\xf9\x6f\x03\x78\x07\
+\x18\xc4\xb9\x3d\xfc\x2b\xb4\x61\x0e\x97\x60\x1e\x33\x28\x60\x02\
+\x53\x1c\x9f\x80\x56\xfd\x82\x5a\x2f\x3d\x97\xed\xe5\x87\xd1\x98\
+\xc9\xe1\x49\xad\x80\xa8\x6d\x22\xc8\x17\xf8\x04\xff\x58\xb6\x73\
+\x39\x08\x9b\xc7\x16\x60\xbb\x20\xc3\x8a\x1f\x8a\x50\xb0\xf3\xf6\
+\x9f\xe1\x11\x9e\x9a\xa7\x98\xf2\x46\xff\xa2\x5f\x08\xe1\x63\x94\
+\x27\xea\xd7\x47\x94\x74\x3e\x2f\xd0\x01\x03\x1f\xc6\x2c\x02\x98\
+\xe4\xa3\x53\x7c\xf3\x14\xef\x9a\x84\xe5\xc8\x14\xaf\x4e\xf0\x78\
+\x82\x2a\x26\xf0\x43\x0a\xb1\x2c\xa5\x98\x2a\xb0\xbd\xa5\xfd\x03\
+\xd7\x5d\x7c\xd3\x6f\x61\x0b\x13\x8a\x52\x86\xa2\xfa\x43\x3c\x56\
+\x5d\xf3\xda\x36\xfc\xa1\x18\x0a\xa9\x04\xfe\xf2\xc0\x95\xb7\xab\
+\x2a\x0e\xf2\xd4\x6b\xbc\x32\xb3\xb4\x02\x5f\xc6\xd3\x78\x10\x3b\
+\x3b\x3b\xdb\x6e\xfb\xd6\x4d\x37\x28\x79\xa1\x07\xf3\x9a\xde\x96\
+\xd1\xb4\xb6\x64\x3a\x8d\x64\x36\x8b\x64\x2e\x8b\x54\x36\xe7\x8c\
+\x49\x8e\xa9\x5c\x0e\x73\xf9\xac\x8d\x3b\x71\x33\x7e\x87\x7d\x7c\
+\x4b\x6a\x31\x25\x68\xf5\xed\xab\x36\x7f\x06\x75\xad\x5b\x78\xa4\
+\xa3\x64\x6b\xd8\x15\x4e\x2d\x1f\x07\xa3\xed\x68\x68\x8d\xb5\xaf\
+\x5f\x9d\xbd\xbc\x6f\x0c\x6f\xf3\x54\x52\x5e\x5c\x5c\x01\xf9\xd6\
+\xc7\x70\xdf\xb1\x3b\x06\x2e\xdc\xd9\xf8\xea\x07\x3f\x75\xe5\x56\
+\x04\xfc\x7e\xac\x09\x47\x70\x7e\x43\x33\x7c\xce\xeb\xdd\x7f\xaa\
+\x37\xd6\x23\x82\xbb\x7e\xff\x98\x3a\xbd\x37\xbd\x95\x97\x87\x28\
+\xa7\x3c\x74\xd5\x9b\x62\x99\xd8\xd6\xda\x79\x03\x77\x0b\x94\xfc\
+\x32\x6c\x54\x1c\x56\xb5\x6f\xf9\x0c\xb6\x6e\x78\x7c\x1d\x15\x68\
+\xe3\x89\x11\xf9\xe0\x52\x0a\x58\xbc\x65\x18\x2f\xe1\xde\x97\x02\
+\x6f\xfe\xb1\xbd\xa5\x79\xcd\xc5\xeb\xda\x21\x48\xd4\x50\x20\xb0\
+\x28\x3f\xa6\x53\x69\x9b\xce\x6d\x69\xaa\x43\xdd\x17\xb6\xa1\xee\
+\x93\x57\x43\xa1\xb5\x63\x61\x15\x31\x4b\xa0\x5e\x51\x10\x23\x99\
+\xdb\x74\x5b\x6c\xae\x6b\xb9\x8c\x4f\xcc\x7a\x56\xae\x7e\x5b\xf5\
+\x71\x1e\xe7\xbd\xff\x16\x5c\xb4\xf6\xf1\x4e\x1e\x9c\x47\x39\xb9\
+\x9c\x02\xae\x17\x6e\x44\x33\x79\x5f\x67\x91\x78\x86\x65\x91\xaf\
+\x02\x0a\x89\x18\xf2\xf9\xaa\x6c\xa4\xf0\x66\xc6\x55\x0e\xca\xfe\
+\xef\xe0\xf3\x99\x00\xee\x24\xad\x83\x64\xb2\x5f\x84\x49\xeb\x40\
+\x54\x51\xfd\x75\xf0\x85\xea\xa0\xf8\xa2\x68\xd9\xf0\x09\x0f\x78\
+\xa5\x83\x16\x0b\x19\xe1\xdc\x17\x8a\x35\xc0\xaf\x22\xcc\x03\xe9\
+\x81\x88\xbc\xb2\xb4\x02\x3f\xc7\xf5\xc8\x62\xe7\x97\x6e\xde\x1e\
+\xe9\x68\x6d\x46\xc1\xd0\x11\xf4\x07\xa0\x1a\x06\x7c\x34\xa5\x9f\
+\x02\x45\x29\x39\x39\x65\xe4\x18\xfc\x7e\xe5\xaa\x07\xe6\x5b\x5c\
+\x70\xe1\x25\x3e\x21\x7d\x38\x07\x2f\x99\x2c\x63\x7d\xf7\x7e\x21\
+\x8c\xe2\x15\xf9\x62\xdf\xd2\x0a\x3c\x82\xad\xf4\xee\x9f\x6e\xbd\
+\xe9\xaa\x48\x53\x7d\x14\x39\x9d\xe0\x69\x75\x97\xed\x12\x37\xc7\
+\x60\xd0\xcd\x7d\x8a\x7b\x76\x26\x93\xc2\xea\xd8\x2a\x5e\x8d\xc2\
+\x4d\x12\x05\xcf\xca\x45\xc2\xd5\x92\xa5\x40\x57\x9e\x53\xbc\xf7\
+\x94\x0e\x9c\xb1\xb6\x02\xf7\xa1\x91\x31\xfe\xfb\x6b\xb6\x5d\x54\
+\xdf\xd4\x10\x45\x5e\x37\x10\xf0\xb9\xd9\xc0\x01\x4e\x51\x29\xd2\
+\x0b\x0a\xe3\x41\x91\xb4\xe2\xfe\x0c\x33\x53\x7b\xac\x15\x2e\xaf\
+\x53\xe7\x48\x8d\x73\x39\x27\x37\x15\xe5\x0c\xe5\xda\x70\x29\x0f\
+\x3c\x70\xfe\x05\xcd\x1b\xdb\xcf\x5f\x89\x4c\x41\x73\x82\x96\xfe\
+\x73\x40\xab\x9e\x02\x45\x91\xd6\x97\xd7\xa5\x6f\x66\xd2\xf3\xe8\
+\xa8\x5b\xe3\xd1\xc2\xaa\x01\x48\xa9\xfc\xb6\x07\xaa\x78\x5e\x78\
+\xcf\x55\x7b\xa6\xb8\xf9\x1c\x05\x44\x55\xe9\x3d\x5b\x81\x87\xd1\
+\xc9\x3a\xf7\xb5\xf7\x5f\x76\x01\x32\x39\x8d\x9c\xf7\xd7\x04\xbe\
+\xe0\x1c\x83\x3a\xec\x0b\xd0\x03\x19\x6c\xae\xdf\x8c\x72\x4e\x57\
+\x51\xce\xe7\x02\xc2\xce\x33\xff\xe7\x60\x5b\x14\x23\x0f\x61\xe5\
+\x61\x99\x59\x9e\x63\x1a\xb5\x75\xd4\x9f\xf7\x09\x9c\x5d\xff\x2a\
+\xf6\x59\xfd\xe4\xff\xa5\x15\x98\xc6\xdd\xed\x1b\x5b\x82\xa6\x2d\
+\xeb\xb8\x28\xf3\xbd\x1a\xb8\x7c\x58\xc6\x04\xf7\x2d\xd3\x84\xe5\
+\x13\x98\xcd\x64\xb1\x26\x42\x4b\xa5\x8e\x23\xa3\x25\x09\x2c\xeb\
+\x00\x16\x52\x6c\x8d\xd9\x87\xb4\xa3\xb2\x2a\x9f\xf3\xf9\x58\x3d\
+\x28\x01\x85\x88\x42\xcc\x87\xd9\x3c\xb4\xec\x19\x66\x9a\x0e\xd4\
+\x2e\xe2\x2a\x9f\xf1\x33\x71\x38\x98\x95\xda\x0a\xdc\x45\x3f\x69\
+\xf8\x74\x6b\xfb\x0a\x68\x1a\x23\x9e\xd6\xaf\x65\x71\x55\x25\x6d\
+\x82\x01\x0c\x4e\x4e\x63\xcf\xd1\x37\xf1\xad\x5b\x6e\xe0\x27\xd9\
+\x4f\xa4\xd2\x68\x8b\x19\xb4\xee\x00\xf8\x28\xd4\xa0\x1f\x3e\x7f\
+\x94\x80\xeb\xf9\x9c\x70\x3d\x23\x1b\x1c\x49\x15\x69\x20\xb6\x10\
+\x92\x9a\xf2\x5c\x84\x8a\x67\x66\xba\x3c\x05\xaa\x33\x53\x51\x19\
+\xab\xb8\xb7\x50\x81\x17\x7e\x8c\x8f\xd9\x05\x5c\xd9\x5f\xc0\xfa\
+\x6f\xfb\x71\xbe\x8f\x55\xc7\xb0\xdc\x97\x28\x95\x54\x91\x76\xa0\
+\x05\x95\x50\x00\x27\xfa\xe2\x78\x61\xcf\x31\x6c\xed\xe8\xc4\xa3\
+\xcf\xee\xc6\x4f\x6e\xfd\x2c\x66\xe6\xb3\xd8\x78\x79\x27\xd4\xe6\
+\x36\x84\xad\x82\x07\xd0\x72\xc5\xae\xd8\x77\xc4\xcb\x4e\xde\xb1\
+\x3f\x44\x7e\xa7\x67\x61\x6a\x09\xee\x37\xd7\xf0\x82\x82\x5a\x29\
+\xd7\x51\x20\x99\xc1\x8f\x36\x5c\xf2\xf1\x6d\x53\xb1\xd5\xc0\x89\
+\x9d\xd0\x0d\x52\x42\xa8\xce\x43\x95\xe0\xa5\xfb\x05\x2d\x79\xb0\
+\xab\x17\xaf\x1f\xea\xc3\xe0\x3d\xbf\x41\x47\xc3\x46\xac\xfe\xe5\
+\xcd\x78\xea\xc8\xeb\xc8\xe6\xf2\xcc\x42\x0d\xfc\xae\x04\xaf\x2f\
+\x04\x8c\x1a\x52\xa5\x48\x84\xd9\x37\x9f\x3c\x89\xfa\xb6\x8f\x56\
+\x81\x2d\x7b\x00\xe5\xb2\xa3\x94\xd2\xc0\x7c\x06\xbb\x82\xd1\x46\
+\xac\xd9\xfa\x39\xe7\x1e\x9d\x85\xca\x20\xaf\xa5\xe8\xde\x28\x63\
+\x42\x28\x36\x0e\x1c\xef\xc1\xd1\xc3\xc3\x48\x7d\xef\x49\x82\x97\
+\x05\x31\x89\xa1\xaf\xfe\x02\xbb\x5e\x3e\xe2\x64\xcf\xb5\xd1\x7a\
+\x5a\xdb\xf0\xac\x6f\x7a\x40\x96\x12\xa3\xb4\x1f\x0a\xb3\xda\x67\
+\xe2\x64\x57\x1a\xe5\xfa\x61\x56\x28\x6d\xcb\xe6\xb4\x2a\x32\xb8\
+\x9d\x1a\xc3\xae\xa1\x37\xfe\x6c\xa8\xcc\x0e\xf2\x7e\x07\x34\xdb\
+\x06\xc3\x1b\x4d\x19\xa4\xd4\xb7\xeb\x54\x02\x03\x6f\x8d\x23\xf5\
+\xfd\x03\xa8\x0f\xc7\xf8\x64\x16\xb2\x47\x09\x05\x42\x38\xfe\xc5\
+\x9f\xba\x2e\x0d\x04\x5d\xeb\x3b\xc0\xa4\x22\xc6\xf2\x8a\xc8\x7b\
+\xa8\xb4\xc2\xfb\x82\x61\x81\xc2\xfc\xa9\xb2\xc5\xcf\x92\x1a\x0a\
+\x3c\xfa\x1c\xe2\x2c\xb4\x07\xc2\x63\x5d\xb2\x97\x81\x61\xbb\xe0\
+\xf5\xa2\x12\x74\xe1\xc8\xc8\x2c\x4e\xef\x1f\xc6\xdf\x37\x6e\x42\
+\x24\x20\x8b\x55\xa6\x02\x44\x0e\x5b\x56\x5d\x00\xf1\x83\xc7\x09\
+\x26\x57\xdb\xca\xa2\x42\x99\xc5\x14\xe2\xf9\x48\x44\xd2\xe8\x74\
+\x85\x07\x8a\x52\xbc\xaf\x86\x02\xdc\xf4\xf9\x02\x9e\x69\x48\x9c\
+\xe0\xb7\x14\x14\x34\x1d\xba\x6c\xde\x24\x75\xc8\xd1\x5c\x5e\x43\
+\xf7\x2b\x43\xd8\xbb\xe3\x4e\xd4\xc9\x9c\xed\x4c\xcc\xb4\x0a\x60\
+\xb4\xb8\x4d\x6f\x58\x52\x34\x8f\xff\xde\xb5\xc5\x28\x53\x53\x09\
+\x8b\xa9\xd2\x62\xa2\xc8\x32\xa5\x0e\x78\xdc\xf7\xb2\x95\xc3\x7f\
+\xe1\x24\xad\x5a\x0a\x88\xae\x04\x9e\x1b\xef\xde\xab\x5d\xd1\x79\
+\x29\xe6\xc7\xf3\xa4\x8e\xe1\x78\xc2\x64\x70\x75\x1d\x8a\xe3\x47\
+\xd7\xdf\x8e\x6b\x37\xbc\x0f\x79\x43\xf3\x3e\xa6\x61\x01\x05\x44\
+\x11\x5c\x15\x68\x51\x61\x7d\xc5\xaa\x50\xc2\x58\x78\xad\xf8\x0e\
+\x52\x29\x2a\xeb\x02\x53\xaa\xa3\x80\x5d\xa6\xa0\xc2\x7b\xaa\xe7\
+\xc0\xa5\xaa\xf6\xe8\xb3\x18\xca\x64\x0b\xaf\xed\x58\xd9\x00\x6d\
+\xd0\x60\xd0\xba\xc1\x9b\x99\xd3\x20\xc6\x80\xfb\xaf\xbf\x93\xb1\
+\x21\xad\xab\x94\x3f\x0e\xa3\xc2\xda\xba\x53\x4d\x9d\x0f\xca\x51\
+\xe8\xe5\x73\xc5\x51\x7a\xc7\xd6\x17\x11\x37\x0e\x40\xc3\x85\x82\
+\xa4\x6e\x66\x14\x96\x3e\xe3\x5a\xde\xb9\xce\x42\x48\x5a\xc9\x16\
+\xac\xa6\x02\x12\x4d\xb2\x80\xe7\xaf\x63\x10\xa9\x79\x76\x9f\x29\
+\x7a\x80\xd6\x9f\x1b\xca\x38\xcd\x6b\xdd\x83\xb7\xe0\xc5\xde\xa3\
+\x6c\x2d\x54\xd7\xfa\x82\x62\x6a\xa5\x97\xbb\x52\xb1\x2f\xc1\x5a\
+\x55\x20\x2d\xad\xe2\xde\x6a\xa9\x50\x84\xcf\x45\x43\x02\xb9\xa9\
+\x93\x6e\x9a\xf5\x8c\xc5\xfa\xc9\x54\x5e\xaa\xc4\x4a\xb5\x02\xa2\
+\x2f\x81\x5d\x13\x6f\xbf\xa6\x3f\xb4\xe3\x0e\xe4\xba\x34\x98\xaa\
+\xc5\x97\x68\xe8\x68\x6e\x41\xbd\x2f\xcc\xa9\xd9\x53\xc8\xb0\xdf\
+\x99\xd5\xc7\xdd\x8f\xaa\xd6\x42\x9a\x94\x68\x51\x43\x99\x22\x48\
+\x6b\x31\x31\x16\x78\x21\x22\x15\x98\xed\xf6\xce\x9b\xce\x28\xe4\
+\xb5\x2a\xc3\x2f\x68\x25\x1e\x7a\x1a\xf1\x2d\x1d\xe6\x81\x6f\xbe\
+\x77\xc3\xb5\xf7\x3d\x1d\x41\x66\xa2\xc0\xd8\x14\x08\xb6\xfa\x11\
+\x8b\x04\x71\x61\x24\x40\x1a\x65\x70\x24\xd1\x8b\x53\xa3\x7b\xd8\
+\xfb\x37\xa1\x35\x1a\xc5\x0a\xb6\x15\x21\x69\x1a\x06\x19\x33\x35\
+\x2e\x6a\x68\x72\x95\xb1\x2b\x8a\xd5\x82\x2a\x5c\x55\x91\x9d\x51\
+\xf1\xea\x95\x3b\xaa\x8a\xec\x93\x0a\x28\xcc\xf5\x20\xbc\xa2\xa3\
+\xd4\x7a\x54\x07\x71\x75\x33\x67\xe4\x0c\xbc\xd0\xb3\xff\xf9\x6b\
+\x77\xdf\xfb\x63\x5c\x7b\xff\x0f\xe4\x5c\xda\xe9\x7d\xe0\xe5\x04\
+\x59\x99\x1b\x23\x7e\x6c\x68\x69\x06\xb3\x2c\xbd\x91\xc1\x64\xc1\
+\x72\xea\x84\xc2\x3b\x92\x5a\x1e\x51\xc5\xc4\xba\x58\xcc\x0b\x40\
+\xb7\x00\xb9\xed\x44\x55\x05\x2e\x29\x21\xbc\x2e\x5a\x29\x8f\xdc\
+\xa2\xfc\x76\x96\x34\x0a\xaf\x68\x77\xbd\x40\xa9\xc0\x7f\x16\x85\
+\x1c\x8c\xfd\x53\xd8\xdd\x7b\xf8\x65\xeb\x9a\xf7\x6c\xc5\x8d\x97\
+\x5f\xea\x4c\xaa\x14\x55\x71\x66\x8e\x12\xbc\x9c\xd4\x1b\xb2\xe0\
+\x11\x5c\x38\x20\x95\x09\xa2\x6d\x45\x0c\x1d\x4d\x2b\xb0\xbe\xb9\
+\x11\x1b\x57\x36\x62\xdf\xd8\x88\x47\x23\xad\xcc\x7d\xab\x2a\x36\
+\x2a\x69\x65\x7b\x34\xb1\x17\xd2\x28\xec\x67\x2a\xcf\x32\x98\xd9\
+\xd9\xba\x19\x4a\x5f\x34\x8d\x96\xb6\x07\x9f\x44\x8f\xae\xe1\xd8\
+\xdc\xe0\xcb\xd8\xf5\x8d\xbb\x1d\x1f\x65\x39\xa9\x91\xed\xaf\x63\
+\x1c\x69\x2c\xf6\xf5\x2a\x2d\x27\x2c\xf7\xe3\x92\x9b\x36\x03\xda\
+\xe4\x47\x9b\x98\x03\x0b\xb4\x74\x7c\x6e\x1a\xce\x84\xbd\x66\xa0\
+\x56\x07\xba\xb1\x30\x13\x55\x48\x24\x20\x98\x52\xdf\xf6\xbc\x68\
+\x54\xc3\x3d\x5b\x01\xf9\xd5\xbc\x81\xe7\x7b\x0e\xed\xa5\x8f\x02\
+\x78\xe5\xfb\x77\x63\xa4\x7f\x06\x1a\x1b\x3c\x9f\xea\x73\x5c\x6c\
+\x51\x01\x51\x59\x55\x4b\xfb\x3a\xaf\xe9\xe8\x5c\xd5\x84\x3d\x89\
+\x31\x17\x9c\xa8\x0c\xe2\x42\x0d\x85\x5c\x6b\x97\xa4\xca\x0b\xb1\
+\xa0\xc2\x36\xbb\xbb\xd4\xd1\x0a\x7b\x79\x05\xc4\x6c\x16\xcf\x0f\
+\x1d\x3b\x24\x64\xbb\xf0\xd1\x8d\xeb\xf1\xbb\xbb\x76\xa0\xe7\xad\
+\x11\x64\x35\xcd\xb9\xc1\xb6\x73\xce\x62\x4f\x09\xbc\xed\x15\x19\
+\x19\x64\x04\xdd\xc8\x60\xf7\x05\x54\x74\xcf\xce\x94\x2d\x6e\x55\
+\xd3\xa9\xb6\xc5\x4b\x4a\x78\xa3\x5f\xe5\x37\xb4\x39\x58\xb9\x71\
+\xc6\x62\x69\x11\xa4\x18\x92\x35\x15\xc0\x77\x1f\x47\x97\x99\x17\
+\x3d\xa9\x21\x6a\xae\xa7\x71\xc7\x55\x97\xe1\x4f\x5f\xd9\x81\xa3\
+\xbd\x53\xae\x05\xa4\x25\x69\x11\x07\xb4\x5d\xe9\x01\x57\x2c\x2a\
+\xb1\x79\x6d\x2b\xf6\x8e\x91\x46\x56\xbe\x46\x3a\xad\xc5\xfd\xc5\
+\x46\x8b\x5e\x50\x91\x9f\xed\x81\x96\x49\x83\x49\xa6\xd8\xaa\x2e\
+\xea\x01\x87\x46\x05\x13\x7f\x1d\x38\xf6\x86\x9b\x0e\xb3\x73\xb8\
+\xf5\xd2\x8d\x38\xf8\xd5\x9b\x30\x9d\xc9\x61\x7c\x7a\x9c\xb3\x4d\
+\x9d\x41\x4d\x25\x14\x6b\x01\x95\x1c\x2f\x10\x5c\x94\x1f\x6d\xaa\
+\x8b\xe0\xc8\xf4\x5c\xed\x58\xb0\x6a\x04\x6e\xa5\x17\xe0\xed\x73\
+\xac\x8f\xfa\x60\xa4\x7a\xd1\x7b\xec\x20\x7a\xc6\x31\x08\x77\x2d\
+\xd2\x59\x01\x58\x4c\x01\x7b\x2a\x83\x17\x06\x8e\xbf\x49\x15\xf9\
+\x31\xd9\xc0\x15\xd2\x68\x64\x5a\x5b\x15\x09\x63\x5d\x44\xa0\x27\
+\x3e\x8a\xf1\x99\x59\xce\x87\x75\xe6\x7f\x1b\x3e\xa9\x0c\x2c\x47\
+\x81\x22\x95\x2e\x5c\xbb\x12\x07\xa6\x52\x5e\x83\x57\xc3\xf2\x25\
+\x25\x2a\xac\x2e\x0d\xc1\xf7\xc1\x6f\xc9\x35\x3d\x24\xc7\x53\x38\
+\xbc\x7f\x10\x2f\xfe\xe1\x84\x38\xb0\xfb\xe0\xf0\x5f\x8f\x43\x66\
+\x87\x84\xa7\xc4\xe2\x0b\x5b\x4f\xec\xc6\xfe\x7b\x3e\x9b\x9b\xd0\
+\x27\xc7\x56\x07\x99\x2a\xe5\xc2\xbd\x4d\x20\x36\x27\xfa\x1f\x6a\
+\x8f\x62\x4b\x6c\x2d\xf6\x27\x92\xe8\x3a\x33\x88\x68\x34\x8c\x55\
+\x8d\x31\x34\xac\x88\xa2\x2e\x1c\xe2\x64\x9f\x13\x70\xd5\x46\x43\
+\x24\x84\x86\x86\x08\x4e\xcf\x65\xb0\xa9\xce\xe7\x01\xf4\xf2\x60\
+\x55\xce\x87\x5c\xaa\xf4\xd6\xae\xc6\x86\x72\xe8\xef\x9b\xc3\xd0\
+\x40\xda\x9e\x9c\x13\xbd\x87\xfb\x70\x72\xdf\xdb\x98\x1b\x99\x81\
+\xce\xc7\xfb\xe1\xae\x8b\x66\x96\x54\xe0\xcd\x49\xe4\x68\x87\x3d\
+\x03\x27\xba\x6f\xdb\x74\xd5\x66\xcf\x5a\xcc\x32\x32\x08\xb4\x14\
+\x42\x0c\xae\xed\x1d\x2b\xb0\xfd\xbc\x28\x4e\x33\xea\x7b\xe6\x67\
+\x71\x32\x31\xee\x98\x25\x18\xf0\x73\x62\xa3\x3a\xcb\x2d\x59\x4e\
+\x34\xfa\x59\xd3\x36\xc5\x54\x67\x95\xa3\x04\x5a\xad\x10\x4d\x20\
+\xde\x3f\x8f\x81\xbe\x0c\x86\x06\x73\xc6\xf8\x2c\xde\x7a\xf5\x34\
+\x7a\x5e\xef\x55\x32\x93\xf3\xce\xf2\x9e\xfc\xed\x61\xd0\x13\xb9\
+\x2a\xcd\x14\xe7\xb4\xc3\x4b\xae\x8d\xda\x39\x13\x7f\x1b\xea\x1e\
+\xa0\x02\x9d\x54\xa0\xe0\x16\x12\x79\x45\x4e\xf9\x24\x2d\x4c\xdb\
+\xa9\xa8\x9b\x1a\x55\x0a\x27\xb4\x0a\x67\x23\x4c\xb7\x69\x83\x6d\
+\xb8\xe5\x4d\x13\x55\x81\xa8\x8f\x4f\x99\x92\x1a\xaa\x1b\x75\x3e\
+\x05\x66\xda\xc6\x99\xbe\x1c\x06\xce\xe4\x38\x59\xd2\x73\xf1\x49\
+\x1c\x7b\xed\x34\xe2\x47\xfa\x90\x4f\xe5\x9d\xa9\x1e\x1b\x2e\x11\
+\x87\xbb\x4c\x2f\x15\x90\x4b\x7d\x59\x0f\x78\x69\x6a\xb6\x94\x02\
+\xe2\xad\x21\xfc\xbd\x29\x38\x53\x80\x96\x0e\xcb\xc9\xa8\x30\x65\
+\xf0\x59\xde\xc4\xc5\x70\x93\x81\xf0\xc4\xf6\x46\xf2\xb7\x5e\x02\
+\x96\xe9\x4f\x1e\xab\x9e\xb0\x0b\xce\x27\xe9\x8d\xde\x02\x41\x17\
+\x90\x98\xb0\x92\xbd\xa3\x38\xf2\x4a\x37\x46\xbb\xe2\x30\x98\x34\
+\xe6\x3d\x6e\x4b\xd0\xc3\x14\xf9\x0b\x50\xda\x03\xad\x63\x91\x25\
+\xbb\x25\x57\xa7\x7f\xfd\x22\x26\xaf\xfe\x3a\xde\x98\xec\x4f\x7c\
+\x64\xd5\xba\x06\xb7\xf2\xca\xf5\x1d\x3b\x5f\xe6\xb3\xf0\x96\x3f\
+\xdc\xfc\xea\xee\x4b\xf0\x3e\x77\x1d\x28\x39\xa6\x23\x7e\xc6\xc4\
+\x99\x7e\x0d\x89\x69\x31\x7a\x32\x8e\xe3\x04\x3d\xd5\x9b\x60\x5f\
+\x68\x3b\xbf\xb2\x0c\x7b\xa0\x25\x35\x66\x3d\x6e\xe7\x2a\x40\x2f\
+\xb9\x2d\xf7\xfb\x80\xc9\x8f\xbc\x3a\x7a\x66\xe2\x23\xab\xde\x13\
+\x66\x61\xcd\xbb\x8d\x9d\x9c\x07\x38\x1e\x10\x25\xab\xbb\x99\x43\
+\x38\x1e\x9a\x18\x36\x31\x40\xc0\x83\x03\x86\x98\x9a\x45\xef\xa1\
+\x7e\x9c\x7c\xe5\x24\x92\xc3\xd3\x4e\x10\x4e\x7b\xb4\x88\x7b\x16\
+\x4f\x7a\xa0\x4b\xa9\x71\x39\xd0\xff\x8c\x02\x22\x95\xc5\xfe\xa1\
+\xbe\x19\x5c\x76\xdd\x1a\x1a\x5c\xf7\xac\x9e\x77\x69\x58\x04\x6d\
+\xd8\x18\xee\xd3\x49\x0d\x03\xc3\x43\xa6\x39\x3e\xe3\x06\xe1\x81\
+\x1e\xa4\x27\xe6\x4a\x41\x58\x04\x4d\x6e\x3b\x74\x91\xa0\x0b\x58\
+\xe6\xc7\xc0\x77\xab\x00\x06\x12\x38\xd4\x50\xa7\xe5\x58\x06\xa3\
+\x26\x9b\xba\x70\x58\x4e\x8b\x34\xc6\x30\xad\xdc\x67\x10\xb4\x89\
+\xc4\x88\x55\x88\x4f\xe3\xe8\xbe\x6e\x0c\x1c\xee\x67\x10\xe6\x8a\
+\x41\x58\xca\x1c\x93\x1e\xe8\x62\x10\xd6\xfa\x4d\xe9\x1d\x6d\xe7\
+\xf2\x23\xb3\xff\xb7\xdf\xc4\x4b\x1f\xbf\x7e\xe5\xb6\x29\xce\xce\
+\xc6\x87\xb3\x4e\x7b\x3d\x3c\x2a\xe6\x19\x84\x6f\x30\x73\x8c\x1e\
+\x8f\xb3\x72\xeb\x4e\xc0\x8d\x4a\x9d\xb1\x30\x08\x73\x1e\xe8\xc5\
+\xd6\xcd\xdf\xd5\xb6\xac\x07\xb8\x59\xf1\x49\xdf\x43\xcf\x3c\x35\
+\xdb\xce\x78\xb0\xba\x47\xd0\xb7\xef\x94\x98\x3c\x33\xc6\x84\x69\
+\x3b\x41\x57\x04\x5d\x0c\xc2\x22\xe8\x73\x0a\xc2\xff\x84\x07\xe4\
+\x26\x97\xe1\x2e\xa1\x5c\xe1\xed\x4b\x4a\x48\x6a\x54\x06\x61\x71\
+\x45\xeb\xdf\x0e\xfa\x9d\x28\xa0\x78\xc0\x1b\xe1\xfe\x54\x22\x83\
+\x2f\x8b\x7f\x41\x10\xfe\xa7\x14\xa8\x75\xff\x7f\x0d\xf4\xff\xd5\
+\xf6\x0f\x42\xfe\xe5\xec\x04\x06\x8b\xbc\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x0f\
+\x0c\x06\x5b\xe7\
+\x00\x66\
+\x00\x69\x00\x74\x00\x74\x00\x6f\x00\x77\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x07\x9e\x5a\x47\
+\x00\x62\
+\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\xad\x0f\x07\
+\x00\x64\
+\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x0e\x53\x6f\x87\
+\x00\x64\
+\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x06\
+\x07\x5e\x57\x47\
+\x00\x6f\
+\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x08\x5d\x84\xe7\
+\x00\x66\
+\x00\x6f\x00\x72\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xc8\x58\x67\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x05\x5e\x84\x87\
+\x00\x6e\
+\x00\x65\x00\x77\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0b\x8d\x66\xc7\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x61\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xc1\x59\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x02\
+\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00\x4c\xb9\
+\x00\x00\x01\x06\x00\x00\x00\x00\x00\x01\x00\x00\x5d\xd7\
+\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x2d\x1f\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x07\x7b\
+\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x35\x1b\
+\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x42\x61\
+\x00\x00\x00\xec\x00\x00\x00\x00\x00\x01\x00\x00\x54\x4a\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x15\x01\
+\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x23\x26\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/packages/spreadsheet/spreadsheet_registry.py b/vistrails/packages/spreadsheet/spreadsheet_registry.py
new file mode 100644
index 0000000..03b9f80
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_registry.py
@@ -0,0 +1,104 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains the spreadsheet registry:
+#   SpreadsheetRegistry
+################################################################################
+
+class SpreadsheetRegistry(object):
+    """
+    SpreadsheetRegistry is the class holding information about cell and sheet
+    types. Each sheet name will only have one sheet type associated with it
+    
+    """
+    def __init__(self):
+        """ SpreadsheetRegistry() -> SpreadsheetRegistry
+        Initialize the registry with no member
+        
+        """
+        self.packages = {}
+        self.sheets = {}
+
+    def registerPackage(self, package, name):
+        """ registerPackage(package: python package, name: str) -> None
+        Register a package containing spreadsheet widgets to the spreadsheet
+        
+        """
+        self.packages[package] = name
+
+    def unregisterPackage(self, package):
+        """ unregisterPackage(package: python package) -> None
+        Unregister a package out of the spreadsheet
+        
+        """
+        if self.packages.has_key(package):
+            del self.packages[package]
+
+    def registerSheet(self, name, sheetType):
+        """ registerSheet(name: str, sheetType: type) -> None
+        Register a name for a sheet type
+        
+        """
+        self.sheets[name] = sheetType
+        
+    def unregisterSheet(self, name):
+        """ unregisterSheet(name: str) -> None
+        Unregister a named sheet type
+        
+        """
+        if self.sheets.has_key(name):
+            del self.sheets[name]
+
+    def getSheet(self, name):
+        """ getSheet(name: str) -> type
+        Return the type of sheet with the corresponding name
+        
+        """
+        if self.sheets.has_key(name):            
+            return self.sheets[name]
+        else:
+            return None
+
+    def getSheetByType(self, type):
+        """ getSheetByType(type) -> name
+        Return the name of sheet with the corresponding type
+        
+        """
+        for (n,t) in self.sheets.items():
+            if t==type:
+                return n
+        return None
+        
+spreadsheetRegistry = SpreadsheetRegistry()
diff --git a/vistrails/packages/spreadsheet/spreadsheet_sheet.py b/vistrails/packages/spreadsheet/spreadsheet_sheet.py
new file mode 100644
index 0000000..4c2e9d2
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_sheet.py
@@ -0,0 +1,531 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains a set of internal Spreadsheet basic classes used
+# by others:
+#   StandardWidgetHeaderView
+#   StandardWidgetItemDelegate
+#   StandardWidgetSheet
+################################################################################
+from PyQt4 import QtCore, QtGui
+from spreadsheet_helpers import CellHelpers, CellResizer
+
+################################################################################
+
+class StandardWidgetHeaderView(QtGui.QHeaderView):
+    """
+    StandardWidgetHeaderView is the standard header view (containing
+    column/row labels) inheriting from QHeaderView. The main
+    difference between this class and the original one is that it
+    allows resizing and stretching at the same time
+    
+    """
+    minimumSize = 50
+
+    def __init__(self, orientation, parent=None):
+        """ StandardWidgetHeaderView(orientation: QtCore.Qt.Align...,
+                                     parent: QWidget)
+                                     -> StandardWidgetHeaderView
+        Initialize the header view to be like the one in the spreadsheet table
+        
+        """
+        QtGui.QHeaderView.__init__(self, orientation, parent)
+        self.setMovable(True)
+        self.setFont(QtGui.QFont("Helvetica",12,QtGui.QFont.Bold))
+        self.resizeSections(QtGui.QHeaderView.Stretch)
+        self.setClickable(True)
+        self.setHighlightSections(True)
+        self.fitToViewport = False
+        if orientation==QtCore.Qt.Vertical:
+            self.setDefaultAlignment(QtCore.Qt.AlignHCenter |
+                                     QtCore.Qt.AlignVCenter)
+
+    def setFitToViewport(self, fit=True):
+        """ setFitToViewport(fit: boolean) -> None        
+        Set fit to viewport for have all the sections always stretch
+        to the whole viewport
+
+        """
+        self.fitToViewport = fit
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Set a default thickness of the bar to 30
+        
+        """
+        size = QtGui.QHeaderView.sizeHint(self)
+        if self.orientation()==QtCore.Qt.Vertical:
+            size.setWidth(30)
+        else:
+            size.setHeight(30)
+        return size        
+
+class StandardWidgetItemDelegate(QtGui.QItemDelegate):
+    """
+    StandardWidgetItemDelegate will replace the QTableWidget default
+    display to have a padding around every cell widget
+
+    """
+    def __init__(self, table):
+        """ StandardWidgetItemDelegate(table: QTableWidget)
+                                       -> StandardWidgetItemDelegate
+        Initialize to store a table and padding
+        
+        """
+        self.table = table
+        self.padding = 4
+        QtGui.QItemDelegate.__init__(self, None)
+
+    def setPadding(self, padding):
+        """ setPadding(padding: int) -> None
+        Re-set padding to a different value
+        
+        """
+        if self.padding!=padding:
+            self.padding = padding
+
+    def updateEditorGeometry(self, editor, option, index):
+        """ updateEditorGeometry(editor: QWidget,
+                                 option: QStyleOptionViewItem,
+                                 index: QModelIndex) -> None
+        Make sure the widget only occupied inside the padded area
+    
+        """
+        rect = self.table.visualRect(index)
+        rect.adjust(self.padding,self.padding,-self.padding,-self.padding)
+        editor.setGeometry(rect)
+        editor.setFixedSize(rect.width(), rect.height())
+
+    def paint(self, painter, option, index):
+        """ paint(painter: QPainter, option: QStyleOptionViewItem,
+                  index: QModelIndex) -> None                  
+        Paint the current cell with a ring outside
+        
+        """
+        QtGui.QItemDelegate.paint(self, painter, option, index)
+        if ((index.row(), index.column())==self.table.activeCell):
+            painter.save()
+            painter.setPen(QtGui.QPen(QtGui.QBrush(
+                QtGui.QColor(0.8549*255, 0.6971*255, 0.2255*255)), self.padding))
+            r = self.table.visualRect(index)
+            painter.setClipRegion(QtGui.QRegion(r))
+            r.adjust(self.padding/2,self.padding/2,-self.padding/2,-self.padding/2)
+            painter.drawRoundedRect(r, self.padding, self.padding)
+            painter.restore()
+            
+            
+class StandardWidgetSheet(QtGui.QTableWidget):
+    """
+    StandardWidgetSheet is a standard sheet that can contain any type
+    of cell widget. Each of them will be put into a separate cell. In
+    the case of vtkRenderWindow, where creating each sheet separately
+    can end up with a large number of GL contexts, a special type of
+    VTK sheet need to be derived from this one
+
+    """
+    def __init__(self, rows=0, cols=0, parent=None):
+        """ StandardWidgetSheet(rows: int, cols: int, parent: QWidget)
+                                -> StandardWidgetSheet
+        Construct a sheet with rows x cols cells
+        
+        """
+        QtGui.QTableWidget.__init__(self, 0, 0, parent)
+        self.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
+        self.fitToWindow = False
+        self.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+        self.setHorizontalHeader(StandardWidgetHeaderView(QtCore.Qt.Horizontal,
+                                                          self))
+        self.horizontalHeader().setSelectionModel(self.selectionModel())
+        self.connect(self.horizontalHeader(),
+                     QtCore.SIGNAL('sectionCountChanged(int, int)'),
+                     self.updateColumnLabels)
+        self.connect(self.horizontalHeader(),
+                     QtCore.SIGNAL('sectionMoved(int,int,int)'),
+                     self.columnMoved)
+        self.connect(self.horizontalHeader(),
+                     QtCore.SIGNAL('sectionPressed(int)'),
+                     self.forceColumnMultiSelect) 
+        self.setVerticalHeader(StandardWidgetHeaderView(QtCore.Qt.Vertical,
+                                                        self))
+        self.verticalHeader().setSelectionModel(self.selectionModel())
+        self.connect(self.verticalHeader(),
+                     QtCore.SIGNAL('sectionCountChanged(int, int)'),
+                     self.updateRowLabels)
+        self.connect(self.verticalHeader(),
+                     QtCore.SIGNAL('sectionMoved(int,int,int)'),
+                     self.rowMoved)
+        self.connect(self.verticalHeader(),
+                     QtCore.SIGNAL('sectionPressed(int)'),
+                     self.forceRowMultiSelect)
+
+        # A hack to force the select all button in single click mode
+        cornerButton = self.findChild(QtGui.QAbstractButton)
+        if cornerButton:
+            self.connect(cornerButton,
+                         QtCore.SIGNAL('clicked()'),
+                         self.forceSheetSelect)
+        
+        self.delegate = StandardWidgetItemDelegate(self)
+        self.setItemDelegate(self.delegate)
+        self.helpers = CellHelpers(parent, CellResizer(self))
+        self.setRowCount(rows)
+        self.setColumnCount(cols)
+        self.setFitToWindow(True)
+        self.connect(self,
+                     QtCore.SIGNAL('cellActivated(int, int, bool)'),
+                     self.selectCell)
+        self.activeCell = (-1,-1)
+
+    def forceColumnMultiSelect(self, logicalIndex):
+        """ forceColumnMultiSelect(logicalIndex: int) -> None        
+        Make sure we always toggle the headerview in the right way        
+        NOTE: the MultiSelection type of SelectionMode does not work
+        correctly for overlapping columns and rows selection
+        
+        """
+        if (self.selectionModel().isColumnSelected(logicalIndex, QtCore.QModelIndex())):
+            self.selectionModel().select(self.model().index(0, logicalIndex),
+                                         QtGui.QItemSelectionModel.Deselect |
+                                         QtGui.QItemSelectionModel.Columns)
+        else:
+            self.selectionModel().select(self.model().index(0, logicalIndex),
+                                         QtGui.QItemSelectionModel.Select |
+                                         QtGui.QItemSelectionModel.Columns)
+
+    def forceRowMultiSelect(self, logicalIndex):
+        """ forceRowMultiSelect(logicalIndex: int) -> None        
+        Make sure we always toggle the headerview in the right way        
+        NOTE: the MultiSelection type of SelectionMode does not work
+        correctly for overlapping columns and rows selection
+        
+        """
+        if (self.selectionModel().isRowSelected(logicalIndex, QtCore.QModelIndex())):
+            self.selectionModel().select(self.model().index(logicalIndex, 0),
+                                         QtGui.QItemSelectionModel.Deselect |
+                                         QtGui.QItemSelectionModel.Rows)
+        else:
+            self.selectionModel().select(self.model().index(logicalIndex, 0),
+                                         QtGui.QItemSelectionModel.Select |
+                                         QtGui.QItemSelectionModel.Rows)
+
+    def forceSheetSelect(self):
+        """ forceSheetSelect() -> None        
+        Make sure we can toggle the whole sheet selection
+        
+        """
+        totalCells = self.rowCount()*self.columnCount()
+        if (len(self.selectionModel().selectedIndexes())<totalCells):
+            self.selectionModel().select(
+                QtGui.QItemSelection(self.model().index(0,0),
+                                     self.model().index(self.rowCount()-1,
+                                                        self.columnCount()-1)),                
+                QtGui.QItemSelectionModel.Select)
+        else:
+            self.selectionModel().clearSelection()
+
+    def updateHeaderStatus(self):
+        """ updateHeaderStatus() -> None
+        Update the visibility of the row and column header
+        
+        """
+        return
+        self.horizontalHeader().setVisible(self.columnCount() > 1 or
+                                           self.rowCount() > 1)
+        self.verticalHeader().setVisible(self.columnCount() > 1 or
+                                         self.rowCount() > 1)
+
+    def updateRowLabels(self, oldCount, newCount):
+        """ updateRowLabels(oldCount: int, newCount: int) -> None
+        Update vertical labels when the number of row changed
+        
+        """
+        vLabels = []
+        vIdx = self.verticalHeader().visualIndex
+        for i in xrange(newCount):
+            vLabels.append(str(vIdx(i)+1))
+        self.setVerticalHeaderLabels(vLabels)
+        self.updateHeaderStatus()
+
+    def rowMoved(self, row, old, new):
+        """ rowMove(row: int, old: int, new: int) -> None
+        Renumber the vertical header labels when rows moved
+        
+        """
+        self.updateRowLabels(self.rowCount(), self.rowCount())
+        
+    def updateColumnLabels(self, oldCount, newCount):
+        """ updateColumnLabels(oldCount: int, newCount: int) -> None
+        Update horizontal labels when the number of column changed
+        
+        """
+        hLabels = []
+        vIdx = self.horizontalHeader().visualIndex
+        for i in xrange(newCount):
+            hLabels.append(chr(vIdx(i)+ord('A')))
+        self.setHorizontalHeaderLabels(hLabels)
+        self.updateHeaderStatus()
+        
+    def columnMoved(self, row, old, new):
+        """ columnMoved(row: int, old: int, new: int) -> None
+        Renumber the horizontal header labels when columns moved
+        
+        """
+        self.updateColumnLabels(self.columnCount(), self.columnCount())
+        
+    def setFitToWindow(self, fit=True):
+        """ setFitToWindow(fit: boolean) -> None
+        Force to fit all cells into the visible area. Set fit=False
+        for the scroll mode where hidden cell can be viewed by scrolling
+        the scrollbars.
+        
+        """
+        if fit!=self.fitToWindow:
+            self.fitToWindow = fit
+            self.horizontalHeader().setFitToViewport(fit)
+            self.verticalHeader().setFitToViewport(fit)
+            if not fit:
+                width = self.columnWidth(self.columnCount()-1)
+                height = self.rowHeight(self.rowCount()-1)
+
+                self.setColumnWidth(self.columnCount()-1, width)
+                self.setRowHeight(self.rowCount()-1, height)
+            self.horizontalHeader().setStretchLastSection(fit)
+            self.verticalHeader().setStretchLastSection(fit)
+            self.stretchCells()
+
+    def showEvent(self, event):
+        """ showEvent(event: QShowEvent) -> None
+        Make sure to stretch the sheet on the first appearance
+        
+        """
+        self.stretchCells()
+
+    def stretchCells(self):
+        """ stretchCells() -> None
+        Stretch all the cells with equally spaces to fit in the viewport
+        
+        """
+        if self.fitToWindow:
+            self.horizontalHeader().setFitToViewport(False)
+            self.horizontalHeader().resizeSections(QtGui.QHeaderView.Stretch)
+            self.horizontalHeader().setFitToViewport(True)
+            self.verticalHeader().setFitToViewport(False)
+            self.verticalHeader().resizeSections(QtGui.QHeaderView.Stretch)
+            self.verticalHeader().setFitToViewport(True)
+            
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QResizeEvent) -> None
+        Resizes each row/column keeping the size ratios between them
+
+        """
+        if self.fitToWindow:
+            for min_size, getter, setter, count, final_size in [
+                    (self.horizontalHeader().minimumSize,
+                     self.columnWidth, self.setColumnWidth, self.columnCount(),
+                     e.size().width()),
+                    (self.verticalHeader().minimumSize,
+                     self.rowHeight, self.setRowHeight, self.rowCount(),
+                     e.size().height())]:
+                # Computes the total size of the columns
+                initial_size = 0
+                for i in xrange(count):
+                    size = getter(i)
+                    if size < min_size:
+                        initial_size += min_size
+                    else:
+                        initial_size += size
+
+                if initial_size == 0:
+                    continue
+
+                # Computes the resize ratio
+                ratio = float(final_size)/initial_size
+
+                i_total = 0
+                f_total = 0
+                for i in xrange(count - 1):
+                    initial = getter(i)
+                    if initial < min_size:
+                        initial = min_size
+                    final = int((initial + i_total) * ratio - f_total)
+                    if final < min_size:
+                        final = min_size
+                    setter(i, final)
+                    i_total += initial
+                    f_total += final
+                final = final_size - f_total
+                if final < min_size:
+                    final = min_size
+                setter(count - 1, final)
+
+        QtGui.QTableWidget.resizeEvent(self, e)
+
+    def showHelpers(self, show, row, col):
+        """ showHelpers(show: boolean, row: int, col: int) -> None        
+        Show/hide the helpers (resizer, toolbar) on the current cell
+        depending on the value of show
+        
+        """
+        if self.helpers.isInteracting():
+            return
+        if show:
+            if row>=0 and col>=0:
+                self.helpers.snapTo(row, col)
+                self.helpers.adjustPosition()
+                self.helpers.show()
+            else:
+                self.helpers.hide()
+        else:
+            self.helpers.hide()
+
+    def getRealLocation(self, vRow, vCol, visual=False):
+        """ getRealLocation(vRow: int, vCol: int, visual: bool) -> (int, int)
+        Return the actual location even if there is spanning at (vRow, vCol)
+        
+        """
+        # Qt doesn't provide a mechanism to map from a cell to its
+        # span region, so we have to scan the whole spreadsheet N^2
+        # for now, but our spreadsheet is usuallly small enough.
+        if visual:
+            (row, col) = (vRow, vCol)
+        else:
+            row = self.verticalHeader().logicalIndex(vRow)
+            col = self.horizontalHeader().logicalIndex(vCol)
+        cellSet = set()
+        for r in xrange(self.rowCount()):
+            for c in xrange(self.columnCount()):
+                cellSet.add((r, c))
+        for r in xrange(self.rowCount()):
+            for c in xrange(self.columnCount()):
+                if (r, c) not in cellSet:
+                    continue
+                rect = self.visualRect(self.model().index(r, c))
+                rSpan = self.rowSpan(r, c)
+                cSpan = self.columnSpan(r, c)
+                for rs in xrange(rSpan):
+                    for cs in xrange(cSpan):
+                        if (row==r+rs) and (col==c+cs):
+                            return (r, c)
+                        if (r+rs, c+cs) in cellSet:
+                            cellSet.remove((r+rs, c+cs))
+        return (-1, -1)        
+
+    def getCell(self, row, col):
+        """ getCell(row: int, col: int) -> QWidget
+        Get cell at a specific row and column
+        
+        """
+        return self.cellWidget(*self.getRealLocation(row, col))
+
+    def getCellRect(self, row, col):
+        """ getCellRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in parent coordinates
+        
+        """
+        idx = self.model().index(*self.getRealLocation(row, col))
+        return self.visualRect(idx)
+
+    def getCellGlobalRect(self, row, col):
+        """ getCellGlobalRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in global coordinates
+        
+        """
+        rect = self.getCellRect(row, col)
+        rect.moveTo(self.viewport().mapToGlobal(rect.topLeft()))
+        return rect
+
+    def setCellByWidget(self, row, col, cellWidget):
+        """ setCellByWidget(row: int,
+                            col: int,                            
+                            cellWidget: QWidget) -> None
+        Replace the current location (row, col) with a cell widget
+        
+        """
+        if cellWidget:
+            # Relax the size constraint of the widget
+            cellWidget.setMinimumSize(QtCore.QSize(0, 0))
+            cellWidget.setMaximumSize(QtCore.QSize(16777215, 16777215))
+            cellWidget.setParent(self)
+        (row, col) = self.getRealLocation(row, col)
+        index = self.model().index(row, col)
+        self.setCellWidget(row, col, cellWidget)
+        if cellWidget:
+            self.delegate.updateEditorGeometry(cellWidget, None, index)
+
+    def selectCell(self, row, col, toggling):
+        """ selectCell(row: int, col: int, toggling: bool) -> None
+        Select a cell based on its current selection
+        
+        """
+        (row, col) = self.getRealLocation(row, col, visual=True)
+        if toggling:
+            self.selectionModel().setCurrentIndex(self.model().index(row, col),
+                                                  QtGui.QItemSelectionModel.Toggle)
+            if (self.selectionModel().isSelected(self.model().index(row, col))):
+                self.setActiveCell(row, col)
+            else:
+                self.setActiveCell(-1, -1)
+        else:
+            if len(self.selectionModel().selectedIndexes())<=1:
+                self.selectionModel().setCurrentIndex(
+                    self.model().index(row, col),
+                    QtGui.QItemSelectionModel.ClearAndSelect)
+            self.setActiveCell(row, col)
+        self.viewport().repaint()
+
+    def setActiveCell(self, row, col):
+        """ setActiveCell(row: int, col: int) -> None
+        Set the location of an active cell also bring up the
+        corresponding toolbar
+
+        """
+        self.activeCell = (row, col)
+        toolBar = self.parent().getCellToolBar(row, col)
+        if toolBar:
+            toolBar.snapTo(row, col)
+        self.parent().toolBar.setCellToolBar(toolBar)
+
+    def adjustWidgetGeometry(self, row, col):
+        """ setActiveCell(row: int, col: int) -> None        
+        Adjust the widget at cell (row, col) to fit inside the cell
+
+        """
+        cellWidget = self.getCell(row, col)
+        if cellWidget:
+            index = self.model().index(*self.getRealLocation(row, col))
+            self.delegate.updateEditorGeometry(cellWidget, None, index)
+        
diff --git a/vistrails/packages/spreadsheet/spreadsheet_tab.py b/vistrails/packages/spreadsheet/spreadsheet_tab.py
new file mode 100644
index 0000000..c1d2096
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_tab.py
@@ -0,0 +1,1203 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file contains classes controlling tabs in the spreadsheets. A tab is
+# a container of a sheet:
+#   SizeSpinBox
+#   StandardTabDockWidget
+#   StandardWidgetSheetTab
+#   StandardWidgetTabBar
+#   StandardWidgetTabBarEditor
+#   StandardWidgetToolBar
+################################################################################
+from PyQt4 import QtCore, QtGui
+import os.path
+from spreadsheet_registry import spreadsheetRegistry
+from spreadsheet_sheet import StandardWidgetSheet
+from spreadsheet_cell import QCellPresenter, QCellContainer, QCellToolBar
+from spreadsheet_execute import assignPipelineCellLocations, \
+     executePipelineWithProgress
+from spreadsheet_config import configuration
+from vistrails.core.inspector import PipelineInspector
+import spreadsheet_rc
+
+################################################################################
+
+class SizeSpinBox(QtGui.QSpinBox):
+    """
+    SizeSpinBox is just an overrided spin box that will also emit
+    'editingFinished()' signal when the user interact with mouse
+    
+    """    
+    def __init__(self, initValue=0, parent=None):
+        """ SizeSpinBox(initValue: int, parent: QWidget) -> SizeSpinBox
+        Initialize with a default width of 50 and a value of 0
+        
+        """
+        QtGui.QSpinBox.__init__(self, parent)
+        self.setMinimum(1)
+        self.setMinimumWidth(50)
+        self.setMaximumWidth(50)
+        self.setValue(initValue)
+
+    def mouseReleaseEvent(self, event):
+        """ mouseReleaseEvent(event: QMouseEvent) -> None
+        Emit 'editingFinished()' signal when the user release a mouse button
+        
+        """
+        QtGui.QSpinBox.mouseReleaseEvent(self, event)
+        self.emit(QtCore.SIGNAL("editingFinished()"))        
+
+class StandardWidgetToolBar(QtGui.QToolBar):
+    """
+    StandardWidgetToolBar: The default toolbar for each sheet
+    container. By default, only FitToWindow and Table resizing are
+    included
+    
+    """
+    def __init__(self, parent=None):
+        """ StandardWidgetToolBar(parent: QWidget) -> StandardWidgetToolBar
+        Init the toolbar with default actions
+        
+        """
+        QtGui.QToolBar.__init__(self, parent)
+        self.sheetTab = parent
+        self.addAction(self.sheetTab.tabWidget.newSheetAction())
+        self.addAction(self.sheetTab.tabWidget.openAction())
+        self.addAction(self.sheetTab.tabWidget.saveAction())
+        self.addWidget(self.rowCountSpinBox())
+        self.addWidget(self.colCountSpinBox())
+        self.addAction(self.sheetTab.tabWidget.exportSheetToImageAction())
+        self.addSeparator()
+        self.layout().setSpacing(2)
+        self.currentToolBarAction = None
+    
+    def rowCountSpinBox(self):
+        """ rowCountSpinBox() -> SizeSpinBox
+        Return the row spin box widget:
+        
+        """
+        if not hasattr(self, 'rowSpinBox'):
+            self.rowSpinBox = SizeSpinBox(self.sheetTab.sheet.rowCount())
+            self.rowSpinBox.setToolTip('The number of rows')
+            self.rowSpinBox.setStatusTip('Change the number of rows '
+                                         'of the current sheet')
+            self.connect(self.rowSpinBox,
+                         QtCore.SIGNAL('editingFinished()'),
+                         self.sheetTab.rowSpinBoxChanged)
+        return self.rowSpinBox
+
+    def colCountSpinBox(self):
+        """ colCountSpinBox() -> SizeSpinBox
+        Return the column spin box widget:
+        
+        """
+        if not hasattr(self, 'colSpinBox'):
+            self.colSpinBox = SizeSpinBox(self.sheetTab.sheet.columnCount())
+            self.colSpinBox.setToolTip('The number of columns')
+            self.colSpinBox.setStatusTip('Change the number of columns '
+                                         'of the current sheet')
+            self.connect(self.colSpinBox,
+                         QtCore.SIGNAL('editingFinished()'),
+                         self.sheetTab.colSpinBoxChanged)
+        return self.colSpinBox
+
+    def setCellToolBar(self, cellToolBar):
+        """ setCellToolBar(cellToolBar: QToolBar) -> None
+        Set the current cell toolbar on this toolbar. Use None to
+        remove the cell toolbar
+        
+        """
+        if (not self.currentToolBarAction or
+            self.widgetForAction(self.currentToolBarAction)!=cellToolBar):
+            if self.currentToolBarAction:
+                self.removeAction(self.currentToolBarAction)
+            if cellToolBar:
+                self.currentToolBarAction = self.addWidget(cellToolBar)
+                self.currentToolBarAction.setVisible(True)
+                self.currentToolBarAction.setEnabled(True)
+            else:
+                self.currentToolBarAction = None
+
+class StandardWidgetSheetTabInterface(object):
+    """
+    StandardWidgetSheetTabInterface is the interface for tab
+    controller to call for manipulating a tab
+    
+    """
+    ### Belows are API Wrappers to connect to self.sheet
+
+    def __init__(self):
+        self.lastCellLocation = (0, 0)
+        self.emptyCellToolBar = None
+
+    def isSheetTabWidget(self):
+        """ isSheetTabWidget() -> boolean
+        Return True if this is a sheet tab widget
+        
+        """
+        return True
+
+    def getDimension(self):
+        """ getDimension() -> tuple
+        Get the sheet dimensions
+        
+        """
+        return (0,0)
+            
+    def setDimension(self, rc, cc):
+        """ setDimension(rc: int, cc: int) -> None
+        Set the sheet dimensions
+        
+        """
+        pass
+            
+    def getCell(self, row, col):
+        """ getCell(row: int, col: int) -> QWidget        
+        Get cell at a specific row and column. In reality, this cell
+        widget is inside a QCellContainer and the cell container is
+        the actual widget under the cell
+        
+        """
+        cellWidget = self.getCellWidget(row, col)
+        if isinstance(cellWidget, QCellContainer):
+            return cellWidget.widget()
+        return cellWidget
+
+    def getCellWidget(self, row, col):
+        """ getCellWidget(row: int, col: int) -> QWidget        
+        Get actual cell at a specific row and column. This will in
+        fact return the container widget of a cell
+        
+        """
+        return None
+
+    def setCellWidget(self, row, col, cellWidget):
+        """ setCellWidget(row: int,
+                          col: int,                            
+                          cellWidget: QWidget) -> None                            
+        Replace the current location (row, col) with a 
+        widget. The widget will be put into a container to be
+        protected from being destroyed when taken out.
+        
+        """
+        pass
+
+    def setCellByWidget(self, row, col, cellWidget):
+        """ setCellByWidget(row: int,
+                            col: int,                            
+                            cellWidget: QWidget) -> None
+        Put the cellWidget inside a container and place it on the sheet
+
+        """
+        if not isinstance(cellWidget, QCellContainer):
+            container = QCellContainer(cellWidget)
+        else:
+            container = cellWidget
+        self.setCellWidget(row, col, container)
+        self.lastCellLocation = (row, col)
+
+    def getCellToolBar(self, row, col):
+        """ getCellToolBar(row: int, col: int) -> QWidget
+        Return the toolbar widget at cell location (row, col)
+        
+        """
+        cell = self.getCell(row, col)
+        if cell:
+            if hasattr(cell, 'toolBarType'):
+                toolBarType = cell.toolBarType
+            else:
+                toolBarType = QCellToolBar
+            container = self.getCellWidget(row, col)
+            if isinstance(container, QCellContainer):
+                if container.toolBar==None:
+                    container.toolBar = toolBarType(self)
+                return container.toolBar
+        else:
+            if self.emptyCellToolBar==None:
+                self.emptyCellToolBar = QCellToolBar(self)
+            return self.emptyCellToolBar
+
+    def getCellRect(self, row, col):
+        """ getCellRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in parent coordinates
+        
+        """
+        return QtCore.QRect()
+
+    def getCellGlobalRect(self, row, col):
+        """ getCellGlobalRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in global coordinates
+        
+        """
+        return QtCore.QRect()
+
+    def getFreeCell(self):
+        """ getFreeCell() -> tuple        
+        Get a free cell location (row, col) on the spreadsheet
+
+        """
+        (rowCount, colCount) = self.getDimension()
+        for r in xrange(rowCount):
+            for c in xrange(colCount):
+                w = self.getCell(r, c)
+                if w==None or (isinstance(w, QCellPresenter) and w.cellWidget==None):
+                    return (r,c)
+        (r, c) = self.lastCellLocation
+        (rs, cs) = self.getSpan(r, c)
+        index = (colCount * r + c + cs) % (rowCount*colCount)
+        return (index/colCount, index%colCount)
+
+    def setCellByType(self, row, col, cellType, inputPorts):
+        """ setCellByType(row: int,
+                          col: int,
+                          cellType: a type inherits from QWidget,
+                          inpurPorts: tuple) -> None                          
+        Replace the current location (row, col) with a cell of
+        cellType. If the current type of that cell is the same as
+        cellType, only the contents is updated with inputPorts.
+        
+        """
+        oldCell = self.getCell(row, col)
+        if cellType is None or not isinstance(oldCell, cellType):
+            if cellType:
+                newCell = cellType(self)
+                self.setCellByWidget(row, col, newCell)
+                newCell.show()
+                newCell.updateContents(inputPorts)
+            else:
+                self.setCellByWidget(row, col, None)
+            if hasattr(oldCell, 'deleteLater'):
+                oldCell.deleteLater()
+        else:
+            oldCell.updateContents(inputPorts)
+        self.lastCellLocation = (row, col)
+
+    def showHelpers(self, show, globalPos):
+        """ showHelpers(show: boolean, globalPos: QPoint) -> None    
+        Show/hide the helpers (toolbar, resizer when the mouse is at
+        globalPos
+        
+        """
+        pass
+
+    def setCellPipelineInfo(self, row, col, info):
+        """ setCellPipelineInfo(row: int, col: int, info: any type) -> None        
+        Provide a way for the spreadsheet to store vistrail
+        information, info, for the cell (row, col)
+        
+        """
+        if not (row,col) in self.pipelineInfo:
+            self.pipelineInfo[(row,col)] = {}
+        self.pipelineInfo[(row,col)] = info
+
+    def getCellPipelineInfo(self, row, col):
+        """ getCellPipelineInfo(row: int, col: int) -> any type        
+        Provide a way for the spreadsheet to extract vistrail
+        information, info, for the cell (row, col)
+        
+        """        
+        if not (row,col) in self.pipelineInfo:
+            return None
+        return self.pipelineInfo[(row,col)]
+
+    def getSelectedLocations(self):
+        """ getSelectedLocations() -> list
+        Return the selected locations (row, col) of the current sheet
+        
+        """
+        return []
+
+    def clearSelection(self):
+        """ clearSelection() -> None
+        Clear all the selection in the current sheet
+        
+        """
+        pass
+    
+    def deleteCell(self, row, col):
+        """ deleteCell(row, col: int) -> None
+        Delete a cell in the sheet
+        
+        """
+        self.setCellByType(row, col, None, None)
+        self.setCellPipelineInfo(row, col, None)
+        
+    def deleteAllCells(self):
+        """ deleteAllCells() -> None
+        Delete all cells in the sheet
+        
+        """
+        (rowCount, columnCount) = self.getDimension()
+        for r in xrange(rowCount):
+            for c in xrange(columnCount):
+                self.deleteCell(r, c)
+
+    def takeCell(self, row, col):
+        """ takeCell(row, col) -> QWidget        
+        Free the cell widget at (row, col) from the tab and return as
+        the result of the function. If there is no widget at (row,
+        col). This returns None. The ownership of the widget is passed
+        to the caller.
+        
+        """
+        cell = self.getCellWidget(row, col)
+        if isinstance(cell, QCellContainer):
+            widget = cell.takeWidget()
+            self.setCellWidget(row, col, None)
+            return widget
+        else:
+            return cell
+
+    def setCellEditingMode(self, r, c, editing=True):
+        """ setCellEditingMode(r: int, c: int, editing: bool) -> None
+        Turn on/off the editing mode of a single cell
+        
+        """
+        if editing:
+            cellWidget = self.getCell(r, c)
+            if isinstance(cellWidget, QCellPresenter):
+                return
+            presenter = QCellPresenter()
+            presenter.assignCell(self, r, c)
+            cellWidget = self.takeCell(r, c)
+            self.setCellByWidget(r, c, presenter)
+            if cellWidget:
+                cellWidget.hide()
+        else:
+            presenter = self.getCell(r, c)
+            if not isinstance(presenter, QCellPresenter):
+                return
+            presenter = self.takeCell(r, c)
+            if presenter:
+                cellWidget = presenter.releaseCellWidget()
+                self.setCellByWidget(r, c, cellWidget)
+                presenter.hide()
+    
+    def setEditingMode(self, editing=True):
+        """ setEditingMode(editing: bool) -> None
+        Turn on/off the editing mode of the tab
+        
+        """
+        # Turn off active cell selection
+        self.sheet.clearSelection()
+        self.sheet.setActiveCell(-1, -1)
+        # Go over all the cells and set the editing widget up
+        (rowCount, colCount) = self.getDimension()
+        for r in xrange(rowCount):
+            for c in xrange(colCount):
+                self.setCellEditingMode(r, c, editing)
+        QtCore.QCoreApplication.processEvents()
+
+    def swapCell(self, row, col, newSheet, newRow, newCol):
+        """ swapCell(row, col: int, newSheet: Sheet,
+                     newRow, newCol: int) -> None
+        Swap the (row, col) of this sheet to (newRow, newCol) of newSheet
+        
+        """
+        myWidget = self.takeCell(row, col)
+        theirWidget = newSheet.takeCell(newRow, newCol)
+        self.setCellByWidget(row, col, theirWidget)
+        newSheet.setCellByWidget(newRow, newCol, myWidget)
+        info = self.getCellPipelineInfo(row, col)
+        self.setCellPipelineInfo(row, col,
+                                 newSheet.getCellPipelineInfo(newRow, newCol))
+        newSheet.setCellPipelineInfo(newRow, newCol, info)
+
+    def copyCell(self, row, col, newSheet, newRow, newCol):
+        """ copyCell(row, col: int, newSheet: Sheet,
+                     newRow, newCol: int) -> None
+        Copy the (row, col) of this sheet to (newRow, newCol) of newSheet
+        
+        """
+        info = self.getCellPipelineInfo(row, col)
+        if info:
+            info = info[0]
+            mId = info['moduleId']
+            pipeline = newSheet.setPipelineToLocateAt(newRow, newCol,
+                                                      info['pipeline'], [mId])
+            executePipelineWithProgress(pipeline, 'Copy Cell',
+                                        current_version=info['version'],
+                                        actions=info['actions'],
+                                        reason=info['reason'],
+                                        locator=info['locator'],
+                                        controller=info['controller'],
+                                        sinks=[mId])
+
+    def executePipelineToCell(self, pInfo, row, col, reason=''):
+        """ executePipelineToCell(p: tuple, row: int, col: int) -> None
+        p: (locator, version, actions, pipeline)
+        
+        Execute a pipeline and put all of its cell to (row, col). This
+        need to be fixed to layout all cells inside the pipeline
+        
+        """
+        pipeline = self.setPipelineToLocateAt(row, col, pInfo[3])
+        executePipelineWithProgress(pipeline, 'Execute Cell',
+                                    locator=pInfo[0],
+                                    controller=pInfo[4],
+                                    current_version=pInfo[1],
+                                    actions=pInfo[2],
+                                    reason=reason)
+
+    def setPipelineToLocateAt(self, row, col, inPipeline, cellIds=[]):
+        """ setPipelineToLocateAt(row: int, col: int, inPipeline: Pipeline,
+                                  cellIds: [ids]) -> Pipeline                                  
+        Modify the pipeline to have its cells (provided by cellIds) to
+        be located at (row, col) of this sheet
+        
+        """
+        sheetName = str(self.tabWidget.tabText(self.tabWidget.indexOf(self)))
+        # Note that we must increment row/col by 1 to match how the
+        # CellReference module expects them
+        return assignPipelineCellLocations(inPipeline, sheetName,
+                                           row + 1, col + 1, cellIds)
+
+    def getPipelineInfo(self, row, col):
+        """ getPipelineInfo(row: int, col: int) -> tuple
+        Return (locator, versionNumber, actions, pipeline, controller) for a cell
+        
+        """
+        info = self.getCellPipelineInfo(row, col)
+        if info:
+            return (info[0]['locator'],
+                    info[0]['version'],
+                    info[0]['actions'],
+                    info[0]['pipeline'],
+                    info[0]['controller'])
+        return None
+
+    def exportSheetToImage(self, fileName):
+        """ exportSheetToImage() -> None
+        Montage all the cell images and export to a file
+        
+        """
+        (rCount, cCount) = self.getDimension()
+        if rCount<1 or cCount<1: return
+        cellHeights = [self.getCellRect(r, 0).height()
+                       for r in xrange(rCount)]
+        cellWidths = [self.getCellRect(0, c).width()
+                      for c in xrange(cCount)] 
+        finalImage = QtGui.QImage(sum(cellWidths), sum(cellHeights), QtGui.QImage.Format_ARGB32)
+        finalImage.fill(0xFFFFFFFF)
+        painter = QtGui.QPainter(finalImage)
+        y = 0
+        for r in xrange(rCount):
+            x = 0
+            for c in xrange(cCount):
+                widget = self.getCell(r, c)
+                if widget:
+                    pix = widget.grabWindowPixmap()
+                    cx = (cellWidths[c]-pix.width())/2
+                    cy = (cellHeights[r]-pix.height())/2
+                    painter.drawPixmap(x+cx, y+cy, widget.grabWindowPixmap())
+                x += cellWidths[c]
+            y += cellHeights[r]
+        painter.end()
+         
+        #forcing png format if no extension was provided 
+        (_,ext) = os.path.splitext(fileName)
+        if ext == '':
+            finalImage.save(fileName, 'png')
+        else:
+            #try to guess based on the extension
+            finalImage.save(fileName)
+
+    def exportSheetToImages(self, dirPath, format='png'):
+        """ exportSheetToImage() -> None
+        Montage all the cell images and export to a file
+        
+        """
+        (rCount, cCount) = self.getDimension()
+        for r in xrange(rCount):
+            for c in xrange(cCount):
+                widget = self.getCell(r, c)
+                if widget:
+                    widget.grabWindowPixmap().save(dirPath+'/'+
+                                                   chr(c+ord('a'))+
+                                                   str(r+1)+
+                                                   '.'+format)
+
+    def setSpan(self, row, col, rowSpan, colSpan):
+        """ setSpan(row, col, rowSpan, colSpan: int) -> None
+        Set the spanning at location (row, col). This is only a place
+        holder. Subclasses should implement this and getSpan for a
+        fully functioning spanning feature.
+        
+        """
+        pass
+
+    def getSpan(self, row, col):
+        """ setSpan(row, col: int) -> (rowSpan, colSpan: int)
+        Return the spanning at location (row, col). This is only a
+        place holder. Subclasses should implement this and setSpan for
+        a fully functioning spanning feature.
+        
+        """
+        return (1, 1)
+
+class StandardWidgetSheetTab(QtGui.QWidget, StandardWidgetSheetTabInterface):
+    """
+    StandardWidgetSheetTab is a container of StandardWidgetSheet with
+    a toolbar on top. This will be added directly to a QTabWidget for
+    displaying the spreadsheet.
+    
+    """
+    def __init__(self, tabWidget,row=None , col=None):
+        """ StandardWidgetSheet(tabWidget: QTabWidget,
+                                row: int,
+                                col: int) -> StandardWidgetSheet
+        Initialize with a toolbar and a sheet widget
+                                
+        """
+        QtGui.QWidget.__init__(self, None)
+        StandardWidgetSheetTabInterface.__init__(self)
+        if not row:
+            row = configuration.rowCount
+        if not col:
+            col = configuration.columnCount
+        self.type = 'StandardWidgetSheetTab'
+        self.tabWidget = tabWidget
+        self.sheet = StandardWidgetSheet(row, col, self)
+        self.sheet.setFitToWindow(True)
+        self.toolBar = StandardWidgetToolBar(self)
+        self.vLayout = QtGui.QVBoxLayout()
+        self.vLayout.setSpacing(0)
+        self.vLayout.setMargin(0)
+        self.vLayout.addWidget(self.toolBar, 0)
+        self.vLayout.addWidget(self.sheet, 1)
+        self.setLayout(self.vLayout)
+        self.pipelineInfo = {}
+        self.setAcceptDrops(True)
+
+    def rowSpinBoxChanged(self):
+        """ rowSpinBoxChanged() -> None
+        Handle the number of row changed
+        
+        """
+        if self.toolBar.rowSpinBox.value()!=self.sheet.rowCount():
+            self.sheet.setRowCount(self.toolBar.rowSpinBox.value())
+            self.sheet.stretchCells()
+            self.setEditingMode(self.tabWidget.editingMode)
+        
+    def colSpinBoxChanged(self):
+        """ colSpinBoxChanged() -> None
+        Handle the number of row changed
+        
+        """
+        if self.toolBar.colSpinBox.value()!=self.sheet.columnCount():
+            self.sheet.setColumnCount(self.toolBar.colSpinBox.value())
+            self.sheet.stretchCells()
+            self.setEditingMode(self.tabWidget.editingMode)
+
+    ### Belows are API Wrappers to connect to self.sheet
+
+    def getDimension(self):
+        """ getDimension() -> tuple
+        Get the sheet dimensions
+        
+        """
+        return (self.sheet.rowCount(), self.sheet.columnCount())
+            
+    def setDimension(self, rc, cc):
+        """ setDimension(rc: int, cc: int) -> None
+        Set the sheet dimensions
+        
+        """
+        self.toolBar.rowCountSpinBox().setValue(rc)
+        self.toolBar.colCountSpinBox().setValue(cc)
+            
+    def getCellWidget(self, row, col):
+        """ getCellWidget(row: int, col: int) -> QWidget
+        Get cell at a specific row and column.
+        
+        """
+        return self.sheet.getCell(row, col)
+
+    def getCellRect(self, row, col):
+        """ getCellRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in parent coordinates
+        
+        """
+        return self.sheet.getCellRect(row, col)
+
+    def getCellGlobalRect(self, row, col):
+        """ getCellGlobalRect(row: int, col: int) -> QRect
+        Return the rectangle surrounding the cell at location (row, col)
+        in global coordinates
+        
+        """
+        return self.sheet.getCellGlobalRect(row, col)
+
+    def showHelpers(self, show, globalPos):
+        """ showHelpers(show: boolean, globalPos: QPoint) -> None        
+        Show/hide the helpers (toolbar, resizer) depending on the
+        status of show and the global position of the cursor
+        
+        """
+        localPos = self.sheet.viewport().mapFromGlobal(QtGui.QCursor.pos())
+        row = self.sheet.rowAt(localPos.y())
+        col = self.sheet.columnAt(localPos.x())
+        rect = self.sheet.getCellRect(row, col)
+        show =  show and (rect.x()+rect.width()-localPos.x()<100 and
+                          rect.y()+rect.height()-localPos.y()<100)
+        self.sheet.showHelpers(show, row, col)
+        
+    def getSelectedLocations(self):
+        """ getSelectedLocations() -> list
+        Return the selected locations (row, col) of the current sheet
+        
+        """
+        indexes = self.sheet.selectedIndexes()
+        return [(idx.row(), idx.column()) for idx in indexes]
+
+    def clearSelection(self):
+        """ clearSelection() -> None
+        Clear all the selection in the current sheet
+        
+        """
+        self.sheet.clearSelection()
+    
+    def setCellWidget(self, row, col, cellWidget):
+        """ setCellWidget(row: int,
+                            col: int,                            
+                            cellWidget: QWidget) -> None                            
+        Replace the current location (row, col) with a cell widget
+        
+        """
+        self.sheet.setCellByWidget(row, col, cellWidget)
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the version tree
+        
+        """
+        mimeData = event.mimeData()
+        if hasattr(mimeData, 'versionId'):
+            event.accept()
+        else:
+            event.ignore()
+
+    def dragMoveEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops while moving from the version tree
+        
+        """
+        mimeData = event.mimeData()
+        if (hasattr(mimeData, 'versionId') and
+            hasattr(mimeData, 'controller')):
+            event.accept()
+        else:
+            event.ignore()
+
+    def dropEvent(self, event):
+        """ Execute the pipeline at the particular location """
+        mimeData = event.mimeData()        
+        if (hasattr(mimeData, 'versionId') and
+            hasattr(mimeData, 'controller')):
+            event.accept()
+            versionId = mimeData.versionId
+            controller = mimeData.controller
+            pipeline = controller.vistrail.getPipeline(versionId)
+
+            inspector = PipelineInspector()
+            inspector.inspect_spreadsheet_cells(pipeline)
+            inspector.inspect_ambiguous_modules(pipeline)
+            if len(inspector.spreadsheet_cells)==1:
+                localPos = self.sheet.viewport().mapFromGlobal(QtGui.QCursor.pos())
+                row = self.sheet.rowAt(localPos.y())
+                col = self.sheet.columnAt(localPos.x())
+                if (row!=-1 and col!=-1):
+                    pipeline = self.setPipelineToLocateAt(row, col, pipeline)
+            executePipelineWithProgress(pipeline, 'Execute Cell',
+                                        controller=controller,
+                                        locator=controller.locator,
+                                        current_version=versionId,
+                                        reason='Drop Version')
+        else:
+            event.ignore()
+
+    def setSpan(self, row, col, rowSpan, colSpan):
+        """ setSpan(row, col, rowSpan, colSpan: int) -> None
+        Set the spanning at location (row, col).
+        
+        """
+        colSpan = max(colSpan, 1)
+        rowSpan = max(rowSpan, 1)
+        (curRowSpan, curColSpan) = self.getSpan(row, col)
+        if rowSpan!=curRowSpan or colSpan!=curColSpan:
+            # Need to remove all cell except the top-left
+            for r in xrange(rowSpan):
+                for c in xrange(colSpan):
+                    if r!=0 or c!=0:
+                        self.deleteCell(row+r, col+c)
+                        
+            # Take the current widget out
+            curWidget = self.takeCell(row, col)
+
+            #  ... before setting the span
+            self.sheet.setSpan(row, col, rowSpan, colSpan)
+
+            # Then put it back in
+            if curWidget:
+                self.setCellByWidget(row, col, curWidget)
+
+    def getSpan(self, row, col):
+        """ setSpan(row, col: int) -> (rowSpan, colSpan: int)
+        Return the spanning at location (row, col). This is only a
+        place holder. Subclasses should implement this and setSpan for
+        a fully functioning spanning feature.
+        
+        """
+        return (self.sheet.rowSpan(row, col), self.sheet.columnSpan(row, col))
+
+    
+class StandardWidgetTabBarEditor(QtGui.QLineEdit):    
+    """
+    StandardWidgetTabBarEditor overrides QLineEdit to enable canceling
+    edit when Esc is pressed
+    
+    """
+    def __init__(self, text='', parent=None):
+        """ StandardWidgetTabBarEditor(text: str, parent: QWidget)
+                                       -> StandardWidgetTabBarEditor
+        Store the original text at during initialization
+        
+        """
+        QtGui.QLineEdit.__init__(self, text, parent)
+        self.originalText = text
+
+    def keyPressEvent(self, e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Override keyPressEvent to handle Esc key
+        
+        """
+        if e.key()==QtCore.Qt.Key_Escape:
+            e.ignore()
+            self.setText(self.originalText)
+            self.clearFocus()
+        else:
+            QtGui.QLineEdit.keyPressEvent(self, e)
+
+class StandardWidgetTabBar(QtGui.QTabBar):
+    """
+    StandardWidgetTabBar: a customized QTabBar to allow double-click
+    to change tab name
+    
+    """
+    def __init__(self, parent=None):
+        """ StandardWidgetTabBar(parent: QWidget) -> StandardWidgetTabBar
+        Initialize like the original QTabWidget TabBar
+        
+        """
+        QtGui.QTabBar.__init__(self, parent)
+        self.setAcceptDrops(True)
+        self.setStatusTip('Move the sheet in, out and around'
+                          'by dragging the tabs')
+        self.setDrawBase(False)
+        self.editingIndex = -1
+        self.editor = None        
+        self.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.connect(self, QtCore.SIGNAL('currentChanged(int)'),
+                     self.updateTabText)
+        self.startDragPos = None
+        self.dragging = False
+        self.targetTab = -1
+        self.innerRubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle,
+                                                 self)
+        self.outerRubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle,
+                                                 None)
+
+    def mouseDoubleClickEvent(self, e):
+        """ mouseDoubleClickEvent(e: QMouseEvent) -> None
+        Handle Double-Click event to start the editor
+        
+        """
+        if e.buttons()!=QtCore.Qt.LeftButton or self.editor: return
+        
+        # Update the current editing tab widget
+        self.editingIndex = self.currentIndex()
+        
+        # A hack to capture the rect of the triangular tab from commonstyle.cpp
+        rect = self.tabRect(self.editingIndex)
+        h = rect.height()-2
+        dx = h/3 + 3
+        rect.adjust(dx+1,1,-dx,-1)
+
+        # Display the editor inplace of the tab text
+        text = self.tabText(self.editingIndex)
+        self.editor = StandardWidgetTabBarEditor(text, self)
+        self.editor.setFont(self.font())
+        self.editor.setFrame(False)
+        self.editor.setGeometry(rect)
+        self.editor.setAlignment(QtCore.Qt.AlignHCenter)
+        self.editor.selectAll()
+        self.connect(self.editor, QtCore.SIGNAL('editingFinished()'),
+                     self.updateTabText)
+        self.editor.show()
+        self.editor.setFocus(QtCore.Qt.MouseFocusReason)
+
+    def updateTabText(self, idx=0):
+        """ updateTabText(idx: int) -> None
+        Update the tab text after editing has been finished
+        
+        """
+        if self.editingIndex>=0 and self.editor:
+            self.setTabText(self.editingIndex, self.editor.text())
+            self.emit(QtCore.SIGNAL('tabTextChanged(int,QString)'),
+                      self.editingIndex,self.editor.text())
+            self.editor.deleteLater()
+            self.editingIndex = -1
+            self.editor = None
+
+    def indexAtPos(self, p):
+        """ indexAtPos(p: QPoint) -> int Reimplement of the private
+        indexAtPos to find the tab index under a point
+        
+        """
+        if self.tabRect(self.currentIndex()).contains(p):
+            return self.currentIndex()
+        for i in xrange(self.count()):
+            if self.isTabEnabled(i) and self.tabRect(i).contains(p):                
+                return i
+        return -1;
+
+    def mousePressEvent(self, e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Handle mouse press event to see if we should start to drag tabs or not
+        
+        """
+        QtGui.QTabBar.mousePressEvent(self, e)
+        if e.buttons()==QtCore.Qt.LeftButton and self.editor==None:
+            self.startDragPos = QtCore.QPoint(e.x(), e.y())
+
+    def getGlobalRect(self, index):
+        """ getGlobalRect(self, index: int)
+        Get the rectangle of a tab in global coordinates
+        
+        """
+        if index<0: return None
+        rect = self.tabRect(index)
+        rect.moveTo(self.mapToGlobal(rect.topLeft()))
+        return rect
+
+    def highlightTab(self, index):
+        """ highlightTab(index: int)
+        Highlight the rubber band of a tab
+        
+        """
+        if index==-1:
+            self.innerRubberBand.hide()
+        else:
+            self.innerRubberBand.setGeometry(self.tabRect(index))
+            self.innerRubberBand.show()
+            
+    def mouseMoveEvent(self, e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Handle dragging tabs in and out or around
+        
+        """
+        QtGui.QTabBar.mouseMoveEvent(self, e)
+        if self.startDragPos:
+            # We already move more than 4 pixels
+            if (self.startDragPos-e.pos()).manhattanLength()>=4:
+                self.startDragPos = None
+                self.dragging = True
+        if self.dragging:
+            t = self.indexAtPos(e.pos())
+            if t!=-1:
+                if t!=self.targetTab:                    
+                    self.targetTab = t
+                    self.outerRubberBand.hide()
+                    self.highlightTab(t)
+            else:
+                self.highlightTab(-1)
+                if t!=self.targetTab:
+                    self.targetTab = t
+                if self.count()>0:
+                    if not self.outerRubberBand.isVisible():
+                        index = self.getGlobalRect(self.currentIndex())
+                        self.outerRubberBand.setGeometry(index)
+                        self.outerRubberBand.move(e.globalPos())
+                        self.outerRubberBand.show()
+                    else:
+                        self.outerRubberBand.move(e.globalPos())
+
+    def mouseReleaseEvent(self, e):
+        """ mouseReleaseEvent(e: QMouseEvent) -> None
+        Make sure the tab moved at the end
+        
+        """
+        QtGui.QTabBar.mouseReleaseEvent(self, e)
+        if self.dragging:
+            if self.targetTab!=-1 and self.targetTab!=self.currentIndex():
+                self.emit(QtCore.SIGNAL('tabMoveRequest(int,int)'),
+                          self.currentIndex(),
+                          self.targetTab)
+            elif self.targetTab==-1:
+                self.emit(QtCore.SIGNAL('tabSplitRequest(int,QPoint)'),
+                          self.currentIndex(),
+                          e.globalPos())
+            self.dragging = False
+            self.targetTab = -1
+            self.highlightTab(-1)
+            self.outerRubberBand.hide()
+            
+    def slotIndex(self, pos):
+        """ slotIndex(pos: QPoint) -> int
+        Return the slot index between the slots at the cursor pos
+        
+        """
+        p = self.mapFromGlobal(pos)
+        for i in xrange(self.count()):
+            r = self.tabRect(i)
+            if self.isTabEnabled(i) and r.contains(p):
+                if p.x()<(r.x()+r.width()/2):
+                    return i
+                else:
+                    return i+1
+        return -1
+        
+    def slotGeometry(self, idx):
+        """ slotGeometry(idx: int) -> QRect
+        Return the geometry between the slots at cursor pos
+        
+        """
+        if idx<0 or self.count()==0: return None
+        if idx<self.count():
+            rect = self.getGlobalRect(idx)
+            rect = QtCore.QRect(rect.x()-5, rect.y(), 5*2, rect.height())
+            return rect
+        else:
+            rect = self.getGlobalRect(self.count()-1)
+            rect = QtCore.QRect(rect.x()+rect.width()-5, rect.y(),
+                                5*2, rect.height())
+            return rect
+
+    def dragEnterEvent(self, event):
+        """ dragEnterEvent(event: QDragEnterEvent) -> None
+        Set to accept drops from the other cell info
+        
+        """
+        mimeData = event.mimeData()
+        if hasattr(mimeData, 'cellInfo'):
+            event.setDropAction(QtCore.Qt.MoveAction)
+            event.accept()
+            idx = self.indexAtPos(event.pos())
+            if idx>=0:
+                self.setCurrentIndex(idx)
+        else:
+            event.ignore()
+            
+    def dragMoveEvent(self, event):
+        """ dragMoveEvent(event: QDragMoveEvent) -> None
+        Set to accept drops from the other cell info
+        
+        """
+        idx = self.indexAtPos(event.pos())
+        if idx>=0:
+            self.setCurrentIndex(idx)
+            
+            
+class StandardTabDockWidget(QtGui.QDockWidget):
+    """
+    StandardTabDockWidget inherits from QDockWidget to contain a sheet
+    widget floating around that can be merge back to tab controller
+    
+    """
+    def __init__(self, title, tabWidget, tabBar, tabController):
+        """ StandardTabDockWidget(title: str,
+                                  tabWidget: QTabWidget,
+                                  tabBar: QTabBar,
+                                  tabController: StandardWidgetTabController)
+                                  -> StandardTabDockWidget
+        Initialize the dock widget to override the floating button
+        
+        """
+        QtGui.QDockWidget.__init__(self, title, None,
+                                   QtCore.Qt.FramelessWindowHint)
+        self.tabBar = tabBar
+        self.tabController = tabController
+        self.setFeatures(QtGui.QDockWidget.DockWidgetClosable |
+                         QtGui.QDockWidget.DockWidgetMovable |
+                         QtGui.QDockWidget.DockWidgetFloatable)
+        self.setFloating(True)
+        self.floatingButton = self.findFloatingButton()
+        if self.floatingButton:
+            self.floatingButton.blockSignals(True)
+            self.floatingButton.installEventFilter(self)
+        self.startDragPos = None
+        self.startDragging = False
+        self.windowRubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle,
+                                                  None)
+        tabWidget.setParent(self)
+        self.setWidget(tabWidget)
+        tabWidget.show()
+        self.resize(tabWidget.size())
+
+    def findFloatingButton(self):
+        """ findFloatingButton() -> QAbstractButton        
+        Hack to find the private Floating Button. Since there is only
+        one button exists, we just need to find QAbstractButton
+        
+        """
+        for c in self.children():
+            if isinstance(c, QtGui.QAbstractButton):
+                return c
+        return None
+
+    def eventFilter(self, q, e):
+        """ eventFilter(q: QObject, e: QEvent) -> depends on event type
+        Event filter the floating button to makes it merge to the tab controller
+        
+        """
+        if q and q==self.floatingButton:
+            if (e.type()==QtCore.QEvent.MouseButtonRelease and
+                e.button()&QtCore.Qt.LeftButton):
+                if self.isMaximized():
+                    self.showNormal()
+                else:
+                    self.showMaximized()
+                return False
+        return QtGui.QDockWidget.eventFilter(self, q, e)
+
+    def isTabControllerUnderMouse(self, tb):        
+        """ Check if any of common parent of the tab controller and tb
+        is under the mouse """
+        tbp = []
+        while tb!=None:
+            tbp.append(tb)
+            tb = tb.parent()
+        tc = self.tabController
+        while tc!=None:
+            if tc in tbp:
+                return True
+            tc = tc.parent()
+        return False
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Handle movement of the dock widget to snap to the tab controller
+        
+        """
+        # MOUSE PRESS (QtCore.QEvent.NonClientAreaMouseButtonPress=174)
+        if e.type() in [QtCore.QEvent.MouseButtonPress,174]:
+            if e.type()==174:
+                gp = QtGui.QCursor.pos()
+                ontitle = True
+            else:
+                gp = e.globalPos()
+                ontitle = e.y()<self.widget().y() and e.buttons()&QtCore.Qt.LeftButton
+            if ontitle:
+                self.startDragPos = QtCore.QPoint(gp)
+                self.grabMouse()
+            return True
+
+        elif e.type()==QtCore.QEvent.MouseMove:
+            if not (e.buttons() & QtCore.Qt.LeftButton):
+                self.windowRubberBand.hide()
+                self.setMouseTracking(False)
+                return QtGui.QDockWidget.event(self, e)
+            gp = e.globalPos()
+            if (not self.startDragging and
+                self.startDragPos and
+                (self.startDragPos-gp).manhattanLength()>=4):
+                self.startDragging = True
+                self.windowRubberBand.setGeometry(self.geometry())
+                self.startDragPos = self.pos()-gp
+                self.windowRubberBand.show()
+                self.setMouseTracking(True)
+            if self.startDragging:
+                tb = QtGui.QApplication.widgetAt(gp)
+                if tb==self.tabBar:
+                    idx = tb.slotIndex(gp)
+                    if idx>=0:
+                        self.windowRubberBand.setGeometry(tb.slotGeometry(idx))
+                elif (tb!=None and self.tabController.count()==0 and
+                      self.isTabControllerUnderMouse(tb)):
+                    r = self.tabController.frameGeometry()
+                    r.moveTo(self.tabController.mapToGlobal(r.topLeft()))
+                    self.windowRubberBand.setGeometry(r)
+                else:
+                    rect = QtCore.QRect(self.startDragPos+gp, self.size())
+                    self.windowRubberBand.setGeometry(rect)
+            return True
+
+        # MOUSE RELEASE (QtCore.QEvent.NonClientAreaMouseRelease=175)
+        elif e.type()==QtCore.QEvent.MouseButtonRelease:
+            if self.startDragging:
+                if e.type()==173:
+                    gp = QtGui.QCursor.pos()
+                else:
+                    gp = e.globalPos()
+                self.setMouseTracking(False)
+                self.windowRubberBand.hide()
+                self.startDragPos = None
+                self.startDragging = False
+                tb = QtGui.QApplication.widgetAt(gp)
+                if tb==self.tabBar:
+                    idx = tb.slotIndex(gp)
+                    if idx>=0:
+                        self.hide()
+                        self.tabController.mergeTab(self, idx)
+                elif (tb!=None and self.tabController.count()==0 and
+                      self.isTabControllerUnderMouse(tb)):
+                    self.hide()
+                    self.tabController.mergeTab(self, 0)
+                else:
+                    self.move(self.windowRubberBand.pos())
+            self.releaseMouse()
+            self.setFocus(QtCore.Qt.MouseFocusReason)
+            return True
+
+        # MOUSE DOUBLE CLICK (QtCore.QEvent.NonClientAreaMouseButtonDblClick=176)
+        elif e.type() in [QtCore.QEvent.MouseButtonDblClick, 176]:
+            if (e.type()==176) or (e.buttons()&QtCore.Qt.LeftButton):
+                self.hide()
+                self.tabController.mergeTab(self, self.tabController.count())
+                return True
+            
+        return QtGui.QDockWidget.event(self, e)
+
+    def closeEvent(self, event):
+        """ On close event dock the sheet back to the spreadsheet window """
+        self.tabController.mergeTab(self, self.tabController.count())
+        event.accept()
+
+spreadsheetRegistry.registerSheet('StandardWidgetSheetTab',
+                                  StandardWidgetSheetTab)
diff --git a/vistrails/packages/spreadsheet/spreadsheet_tabcontroller.py b/vistrails/packages/spreadsheet/spreadsheet_tabcontroller.py
new file mode 100644
index 0000000..17725ab
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_tabcontroller.py
@@ -0,0 +1,822 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file implements the Spreadsheet Tab Controller, to manages tabs
+#   StandardWidgetTabController
+################################################################################
+import os.path
+from PyQt4 import QtCore, QtGui
+from vistrails.core.db.locator import FileLocator, _DBLocator as DBLocator
+from vistrails.core.interpreter.default import get_default_interpreter
+from vistrails.db.services.io import SaveBundle
+from spreadsheet_registry import spreadsheetRegistry
+from spreadsheet_tab import (StandardWidgetTabBar,
+                             StandardWidgetSheetTab, StandardTabDockWidget)
+from spreadsheet_registry import spreadsheetRegistry
+from vistrails.core.utils import DummyView
+from vistrails.core.utils.uxml import XMLWrapper, named_elements
+import copy
+import gc
+from vistrails.gui.theme import CurrentTheme
+from vistrails.gui.utils import show_warning
+
+################################################################################
+
+class StandardWidgetTabController(QtGui.QTabWidget):
+    """
+    StandardWidgetTabController inherits from QTabWidget to contain a
+    list of StandardWidgetSheetTab. This is the major component that
+    will handle most of the spreadsheet actions
+
+    """
+    def __init__(self, parent=None):
+        """ StandardWidgetTabController(parent: QWidget)
+                                        -> StandardWidgetTabController
+        Initialize signals/slots and widgets for the tab bar
+        
+        """
+        
+        QtGui.QTabWidget.__init__(self, parent)
+        self.operatingWidget = self
+        self.setTabBar(StandardWidgetTabBar(self))
+        self.setTabShape(QtGui.QTabWidget.Triangular)
+        self.setTabPosition(QtGui.QTabWidget.South)
+        self.tabWidgets = []
+        self.floatingTabWidgets = []
+        self.addTabWidget(StandardWidgetSheetTab(self), 'Sheet 1')
+        self.connect(self.tabBar(),
+                     QtCore.SIGNAL('tabMoveRequest(int,int)'),
+                     self.moveTab)
+        self.connect(self.tabBar(),
+                     QtCore.SIGNAL('tabSplitRequest(int,QPoint)'),
+                     self.splitTab)
+        self.connect(self.tabBar(),
+                     QtCore.SIGNAL('tabTextChanged(int,QString)'),
+                     self.changeTabText)
+        self.addAction(self.showNextTabAction())
+        self.addAction(self.showPrevTabAction())
+        self.executedPipelines = [[],{},{}]
+        self.monitoredPipelines = {}
+        self.spreadsheetFileName = None
+        self.loadingMode = False
+        self.editingMode = False
+        self.closeButton = QtGui.QToolButton(self)
+        self.closeButton.setIcon(CurrentTheme.VIEW_MANAGER_CLOSE_ICON)
+        self.closeButton.setAutoRaise(True)
+        self.setCornerWidget(self.closeButton)
+        self.connect(self.closeButton, QtCore.SIGNAL('clicked()'),
+                     self.deleteSheetAction().trigger)
+        
+    def isLoadingMode(self):
+        """ isLoadingMode() -> boolean
+        Checking if the controller is in loading mode
+        
+        """
+        return self.loadingMode
+
+    def getMonitoredLocations(self, spec):
+        """ getMonitoredLocations(spec: tuple) -> location
+        Return the monitored location associated with spec
+        
+        """
+        key = ((spec[0]['locator'], spec[0]['version']), spec[1], spec[2])
+        if key in self.monitoredPipelines:
+            return self.monitoredPipelines[key]
+        else:
+            return []
+
+    def appendMonitoredLocations(self, spec, value):
+        """ getMonitoredLocations(spec: tuple, value: location) -> None
+        Return the monitored location associated with spec
+        
+        """
+        key = ((spec[0]['locator'], spec[0]['version']), spec[1], spec[2])
+        if key in self.monitoredPipelines:
+            self.monitoredPipelines[key].append(value)
+        else:
+            self.monitoredPipelines[key] = [value]
+         
+    def newSheetAction(self):
+        """ newSheetAction() -> QAction
+        Return the 'New Sheet' action
+        
+        """
+        if not hasattr(self, 'newSheetActionVar'):
+            icon = QtGui.QIcon(':/images/newsheet.png')
+            self.newSheetActionVar = QtGui.QAction(icon, '&New sheet', self)
+            self.newSheetActionVar.setToolTip('Create a new sheet')
+            self.newSheetActionVar.setStatusTip('Create and show a new sheet')
+            self.newSheetActionVar.setShortcut(QtGui.QKeySequence('Ctrl+N'))
+            self.connect(self.newSheetActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.newSheetActionTriggered)
+        return self.newSheetActionVar
+
+    def deleteSheetAction(self):
+        """ deleteSheetAction() -> QAction
+        Return the 'Delete Sheet' action:
+        
+        """
+        if not hasattr(self, 'deleteSheetActionVar'):
+            icon = QtGui.QIcon(':/images/deletesheet.png')
+            self.deleteSheetActionVar = QtGui.QAction(icon, '&Delete sheet',
+                                                      self)
+            self.deleteSheetActionVar.setToolTip('Delete the current sheet')
+            self.deleteSheetActionVar.setStatusTip('Delete the current sheet '
+                                                   'if there are more than one')
+            key = QtGui.QKeySequence('Ctrl+Backspace')
+            self.deleteSheetActionVar.setShortcut(key)
+            self.connect(self.deleteSheetActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.deleteSheetActionTriggered)
+        return self.deleteSheetActionVar
+
+    def showNextTabAction(self):
+        """ showNextTabAction() -> QAction
+        Return the 'Next Sheet' action
+        
+        """
+        if not hasattr(self, 'showNextTabActionVar'):
+            icon = QtGui.QIcon(':/images/forward.png')
+            self.showNextTabActionVar = QtGui.QAction(icon, '&Next sheet', self)
+            self.showNextTabActionVar.setToolTip('Show the next sheet')
+            self.showNextTabActionVar.setStatusTip('Show the next sheet if it '
+                                                   'is available')
+            self.showNextTabActionShortcut = QtGui.QShortcut(self)
+            self.showNextTabActionVar.setShortcut('Ctrl+PgDown')
+            self.connect(self.showNextTabActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.showNextTab)
+        return self.showNextTabActionVar
+
+    def showPrevTabAction(self):
+        """ showPrevTabAction() -> QAction
+        Return the 'Prev Sheet' action
+        
+        """
+        if not hasattr(self, 'showPrevTabActionVar'):
+            icon = QtGui.QIcon(':/images/back.png')
+            self.showPrevTabActionVar = QtGui.QAction(icon, '&Prev sheet', self)
+            self.showPrevTabActionVar.setToolTip('Show the previous sheet')
+            self.showPrevTabActionVar.setStatusTip('Show the previous sheet if '
+                                                   'it is available')
+            self.showPrevTabActionVar.setShortcut('Ctrl+PgUp')
+            self.connect(self.showPrevTabActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.showPrevTab)
+        return self.showPrevTabActionVar
+
+    def saveAction(self):
+        """ saveAction() -> QAction
+        Return the 'Save' action
+        
+        """
+        if not hasattr(self, 'saveActionVar'):
+            self.saveActionVar = QtGui.QAction(QtGui.QIcon(':/images/save.png'),
+                                               '&Save', self)
+            self.saveActionVar.setStatusTip('Save the current spreadsheet')
+            self.saveActionVar.setShortcut('Ctrl+S')
+            self.connect(self.saveActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.saveSpreadsheet)
+        return self.saveActionVar
+
+    def saveAsAction(self):
+        """ saveAsAction() -> QAction
+        Return the 'Save As...' action
+        
+        """
+        if not hasattr(self, 'saveAsActionVar'):
+            icon = QtGui.QIcon(':/images/saveas.png')
+            self.saveAsActionVar = QtGui.QAction(icon, 'Save &As...', self)
+            self.saveAsActionVar.setStatusTip('Save the current spreadsheet '
+                                              'at a new location')
+            self.connect(self.saveAsActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.saveSpreadsheetAs)
+        return self.saveAsActionVar
+
+    def openAction(self):
+        """ openAction() -> QAction
+        Return the 'Open...' action
+        
+        """
+        if not hasattr(self, 'openActionVar'):
+            self.openActionVar = QtGui.QAction(QtGui.QIcon(':/images/open.png'),
+                                               '&Open...', self)
+            self.openActionVar.setStatusTip('Open a saved spreadsheet')
+            self.openActionVar.setShortcut('Ctrl+O')
+            self.connect(self.openActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.openSpreadsheetAs)
+        return self.openActionVar
+
+    def exportSheetToImageAction(self):
+        """ exportSheetToImageAction() -> QAction
+        Export the current sheet to an image
+        
+        """
+        if not hasattr(self, 'exportSheetToImageVar'):
+            self.exportSheetToImageVar = QtGui.QAction('Export', self)
+            self.exportSheetToImageVar.setStatusTip(
+                'Export all cells in the spreadsheet to a montaged image')
+
+            exportMenu = QtGui.QMenu(self)
+            singleAction = exportMenu.addAction('As a Single Image')
+            multiAction = exportMenu.addAction('Separately')
+            self.exportSheetToImageVar.setMenu(exportMenu)
+            
+            self.connect(self.exportSheetToImageVar,
+                         QtCore.SIGNAL('triggered(bool)'),
+                         self.exportSheetToImageActionTriggered)
+            
+            self.connect(exportMenu,
+                         QtCore.SIGNAL('triggered(QAction*)'),
+                         self.exportSheetToImageActionTriggered)
+        return self.exportSheetToImageVar
+
+    def exportSheetToImageActionTriggered(self, action=None):
+        """ exportSheetToImageActionTriggered(checked: boolean) -> None
+        Actual code to create export an image
+        
+        """
+        if not isinstance(action, bool) and action.text() == 'Separately':
+            dir = QtGui.QFileDialog.getExistingDirectory(
+                self, 'Select a Directory to Export Images', ".",
+                QtGui.QFileDialog.ShowDirsOnly)
+            if dir:
+                self.currentWidget().exportSheetToImages(dir)
+        else:
+            file = QtGui.QFileDialog.getSaveFileName(
+                self, "Select a File to Export the Sheet",
+                ".", "Images (*.png *.xpm *.jpg)")
+            if file:
+                self.currentWidget().exportSheetToImage(str(file))
+        
+    def newSheetActionTriggered(self, checked=False):
+        """ newSheetActionTriggered(checked: boolean) -> None
+        Actual code to create a new sheet
+        
+        """
+        self.setCurrentIndex(self.addTabWidget(StandardWidgetSheetTab(self),
+                                               'Sheet %d' % (self.count()+1)))
+        self.currentWidget().sheet.stretchCells()
+        
+    def tabInserted(self, index):
+        """tabInserted(index: int) -> None
+        event handler to get when sheets are inserted """
+        self.deleteSheetAction().setEnabled(True)
+        self.saveAction().setEnabled(True)
+        self.saveAsAction().setEnabled(True)
+
+    def tabRemoved(self, index):
+        """tabInserted(index: int) -> None
+        event handler to get when sheets are removed """
+        if self.count() == 0:
+            self.deleteSheetAction().setEnabled(False)
+            self.saveAction().setEnabled(False)
+            self.saveAsAction().setEnabled(False)
+
+    def removeSheetReference(self, sheet):
+        """ removeSheetReference(sheet: StandardWidgetSheetTab) -> None
+        Remove references of a sheet from the spreadsheet
+        """
+        for (code, locations) in self.monitoredPipelines.iteritems():
+            for lid in reversed(xrange(len(locations))):
+                if sheet==locations[lid][0]:
+                    del locations[lid]                        
+
+    def deleteSheetActionTriggered(self, checked=False):
+        """ deleteSheetActionTriggered(checked: boolean) -> None
+        Actual code to delete the current sheet
+        
+        """
+        if self.count()>0:
+            widget = self.currentWidget()
+            self.tabWidgets.remove(widget)
+            self.removeTab(self.currentIndex())
+            self.removeSheetReference(widget)
+            widget.deleteAllCells()
+            widget.deleteLater()
+            QtCore.QCoreApplication.processEvents()
+            gc.collect()
+            
+    def clearTabs(self):
+        """ clearTabs() -> None
+        Clear and reset the controller
+        
+        """
+        self.executedPipelines = [[], {}, {}]
+        while self.count()>0:
+            self.deleteSheetActionTriggered()
+        for i in reversed(range(len(self.tabWidgets))):
+            t = self.tabWidgets[i]
+            del self.tabWidgets[i]
+            self.removeSheetReference(t)
+            t.deleteAllCells()
+            t.deleteLater()
+
+    def insertTab(self, idx, tabWidget, tabText):
+        """ insertTab(idx: int, tabWidget: QWidget, tabText: str)
+                      -> QTabWidget
+        Redirect insertTab command to operatingWidget, this can either be a
+        QTabWidget or a QStackedWidget
+        
+        """
+        if self.operatingWidget!=self:
+            ret = self.operatingWidget.insertWidget(idx, tabWidget)
+            self.operatingWidget.setCurrentIndex(ret)
+            return ret
+        else:
+            return QtGui.QTabWidget.insertTab(self, idx, tabWidget, tabText)
+
+    def findSheet(self, sheetReference):
+        """ findSheet(sheetReference: subclass(SheetReference)) -> Sheet widget
+        Find/Create a sheet that meets a certen sheet reference
+        
+        """
+        if not sheetReference:
+            return None
+        sheetReference.clearCandidate()
+        for idx in xrange(len(self.tabWidgets)):
+            tabWidget = self.tabWidgets[idx]
+            tabLabel = tabWidget.windowTitle()
+            sheetReference.checkCandidate(tabWidget, tabLabel, idx,
+                                          self.operatingWidget.currentIndex())
+        return sheetReference.setupCandidate(self)
+
+    def changeTabText(self, tabIdx, newTabText):
+        """ changeTabText(tabIdx: int, newTabText: str) -> None
+        Update window title on the operating widget when the tab text
+        has changed
+        
+        """
+        self.operatingWidget.widget(tabIdx).setWindowTitle(newTabText)
+
+    def moveTab(self, tabIdx, destination):
+        """ moveTab(tabIdx: int, destination: int) -> None
+        Move a tab at tabIdx to a different position at destination
+        
+        """
+        if (tabIdx<0 or tabIdx>self.count() or
+            destination<0 or destination>self.count()):
+            return
+        tabText = self.tabText(tabIdx)
+        tabWidget = self.widget(tabIdx)
+        self.removeTab(tabIdx)
+        self.insertTab(destination, tabWidget, tabText)
+        if tabIdx==self.currentIndex():
+            self.setCurrentIndex(destination)
+
+    def splitTab(self, tabIdx, pos=None):
+        """ splitTab(tabIdx: int, pos: QPoint) -> None
+        Split a tab to be  a stand alone window and move to position pos        
+        
+        """
+        if tabIdx<0 or tabIdx>self.count() or self.count()==0:
+            return
+        tabWidget = self.widget(tabIdx)
+        self.removeTab(tabIdx)
+        
+        frame = StandardTabDockWidget(tabWidget.windowTitle(), tabWidget,
+                                      self.tabBar(), self)
+        if pos:
+            frame.move(pos)
+        frame.show()        
+        self.floatingTabWidgets.append(frame)
+
+    def mergeTab(self, frame, tabIdx):
+        """ mergeTab(frame: StandardTabDockWidget, tabIdx: int) -> None
+        Merge a tab dock widget back to the controller at position tabIdx
+        
+        """
+        if tabIdx<0 or tabIdx>self.count():
+            return
+        if tabIdx==self.count(): tabIdx = -1
+        tabWidget = frame.widget()
+        frame.setWidget(None)
+        while frame in self.floatingTabWidgets:
+            self.floatingTabWidgets.remove(frame)
+        frame.deleteLater()
+        tabWidget.setParent(None)
+        newIdx = self.insertTab(tabIdx, tabWidget, tabWidget.windowTitle())
+        self.setCurrentIndex(newIdx)
+
+    def addTabWidget(self, tabWidget, sheetLabel):
+        """ addTabWidget(tabWidget: QWidget, sheetLabel: str) -> int
+        Add a new tab widget to the controller
+        
+        """
+        return self.insertTabWidget(-1, tabWidget, sheetLabel)
+
+    def insertTabWidget(self, index, tabWidget, sheetLabel):
+        """ insertTabWidget(index: int, tabWidget: QWidget, sheetLabel: str)
+                            -> int
+        Insert a tab widget to the controller at some location
+        
+        """
+        if sheetLabel==None:
+            sheetLabel = 'Sheet %d' % (len(self.tabWidgets)+1)
+        if not tabWidget in self.tabWidgets:
+            self.tabWidgets.append(tabWidget)
+            tabWidget.setWindowTitle(sheetLabel)
+        return self.insertTab(index, tabWidget, sheetLabel)
+
+    def tabWidgetUnderMouse(self):
+        """ tabWidgetUnderMouse() -> QWidget
+        Return the tab widget that is under mouse, hide helpers for the rest
+        
+        """
+        result = None
+        for t in self.tabWidgets:
+            if t.underMouse():
+                result = t
+            else:
+                t.showHelpers(False, QtCore.QPoint(-1,-1))
+        return result
+
+    def setupFullScreenWidget(self, fs, stackedWidget):
+        """ setupFullScreenWidget(fs: boolean, stackedWidget: QStackedWidget)
+                                  -> None
+        Prepare(fs=True)/Clean(fs=False) up full screen mode
+                                  
+        """
+        if fs:
+            idx = self.currentIndex()
+            for i in xrange(self.count()):
+                widget = self.widget(0)
+                self.removeTab(0)
+                self.tabTrueParent = widget.parent()
+                widget.setParent(stackedWidget)
+                stackedWidget.addWidget(widget)
+            stackedWidget.setCurrentIndex(idx)
+            self.operatingWidget = stackedWidget
+        else:
+            idx = stackedWidget.currentIndex()
+            for i in xrange(stackedWidget.count()):
+                widget = stackedWidget.widget(0)
+                stackedWidget.removeWidget(widget)
+                widget.setParent(self.tabTrueParent)
+                self.addTab(widget, widget.windowTitle())
+            self.setCurrentIndex(idx)
+            self.operatingWidget = self
+
+    def showNextTab(self):
+        """ showNextTab() -> None
+        Bring the next tab up
+        
+        """
+        if self.operatingWidget.currentIndex()<self.operatingWidget.count()-1:
+            index = self.operatingWidget.currentIndex()+1
+            self.operatingWidget.setCurrentIndex(index)
+
+    def showPrevTab(self):
+        """ showPrevTab() -> None
+        Bring the previous tab up
+        
+        """
+        if self.operatingWidget.currentIndex()>0:
+            index = self.operatingWidget.currentIndex()-1
+            self.operatingWidget.setCurrentIndex(index)
+
+    def tabPopupMenu(self):
+        """ tabPopupMenu() -> QMenu
+        Return a menu containing a list of all tabs
+        
+        """
+        menu = QtGui.QMenu(self)        
+        en = self.operatingWidget.currentIndex()<self.operatingWidget.count()-1
+        self.showNextTabAction().setEnabled(en)
+        menu.addAction(self.showNextTabAction())
+        en = self.operatingWidget.currentIndex()>0
+        self.showPrevTabAction().setEnabled(en)
+        menu.addAction(self.showPrevTabAction())
+        menu.addSeparator()
+        for idx in xrange(self.operatingWidget.count()):
+            t = self.operatingWidget.widget(idx)
+            action = menu.addAction(t.windowTitle())
+            action.setData(idx)
+            if t==self.operatingWidget.currentWidget():
+                action.setIcon(QtGui.QIcon(':/images/ok.png'))
+        menu.addAction(self.parent().parent().fullScreenAction())
+        return menu
+
+    def showPopupMenu(self):
+        """ showPopupMenu() -> None
+        Activate the tab list and show the popup menu
+        
+        """
+        menu = self.tabPopupMenu()
+        action = menu.exec_(QtGui.QCursor.pos())
+        self.showNextTabAction().setEnabled(True)
+        self.showPrevTabAction().setEnabled(True)
+        if not action: return
+        if not action in self.actions():
+            self.operatingWidget.setCurrentIndex(action.data()[0])
+        menu.deleteLater()
+
+    def changeSpreadsheetFileName(self, fileName):
+        """ changeSpreadsheetFileName(fileName: str) -> None        
+        Change the current spreadsheet filename and reflect it on the
+        window title
+        
+        """
+        self.spreadsheetFileName = fileName
+        if self.spreadsheetFileName:
+            displayName = self.spreadsheetFileName
+        else:
+            displayName = 'Untitled'
+        self.emit(QtCore.SIGNAL('needChangeTitle'),
+                  '%s - VisTrails Spreadsheet' % displayName)
+
+    def pipelineId(self, pipelineInfo):
+        return (pipelineInfo['controller'], pipelineInfo['version'])
+
+    def addPipeline(self, pipelineInfo):
+        """ addPipeline(pipelineInfo: dict) -> None
+        Add vistrail pipeline executions to history
+        
+        """
+        vistrail = self.pipelineId(pipelineInfo)
+        self.executedPipelines[0].append(vistrail)
+        if not vistrail in self.executedPipelines[1]:
+            self.executedPipelines[1][vistrail] = 0
+        else:
+            self.executedPipelines[1][vistrail] += 1
+        self.executedPipelines[2][vistrail] = 0
+
+    def getCurrentPipelineId(self, pipelineInfo):
+        """ getCurrentPipelineId(pipelineInfo: dict) -> Int
+        Get the current pipeline id
+        
+        """
+        vistrail = self.pipelineId(pipelineInfo)
+        return self.executedPipelines[1][vistrail]
+
+    def increasePipelineCellId(self, pipelineInfo):
+        """ increasePipelineCellId(pipelineInfo: dict) -> int
+        Increase the current cell pipeline id
+        
+        """
+        vistrail = self.pipelineId(pipelineInfo)
+        cid = self.executedPipelines[2][vistrail]
+        self.executedPipelines[2][vistrail] += 1
+        return cid
+        
+    def getCurrentPipelineCellId(self, pipelineInfo):
+        """ getCurrentPipelineCellId(pipelineInfo: dict) -> int
+        Get current pipeline cell id
+        
+        """
+        vistrail = self.pipelineId(pipelineInfo)
+        return self.executedPipelines[2][vistrail]
+        
+    def addPipelineCell(self, pipelineInfo):
+        """ addPipelineCell(pipelineInfo: dict) -> None
+        Add vistrail pipeline executions to history
+        
+        """
+        vistrail = self.pipelineId(pipelineInfo)
+        self.executedPipelines[0].append(vistrail)
+        if not vistrail in self.executedPipelines[1]:
+            self.executedPipelines[1][vistrail] = 0
+        else:
+            self.executedPipelines[1][vistrail] += 1
+
+
+    def saveSpreadsheet(self, fileName=None):
+        """ saveSpreadsheet(fileName: str) -> None        
+        Save the current spreadsheet to a file if fileName is not
+        None. Else, pop up a dialog to ask for a file name.
+        
+        """
+        def serialize_locator(locator):
+            wrapper = XMLWrapper()
+            dom = wrapper.create_document('spreadsheet_locator')
+            root = dom.documentElement
+            root.setAttribute("version", "1.0")
+            locator.serialize(dom,root)
+            return dom.toxml()
+        
+        def need_save():
+            from vistrails.gui.vistrails_window import _app
+            need_save_vt = False
+            for t in self.tabWidgets:
+                dim = t.getDimension()
+                for r in xrange(dim[0]):
+                    for c in xrange(dim[1]):
+                        info = t.getCellPipelineInfo(r,c)
+                        if info:
+                            controller = info[0]['controller']
+                            view = _app.ensureController(controller)
+                            if view:
+                                controller = view.get_controller()
+                                if controller.changed:
+                                    need_save_vt = True
+            return need_save_vt
+        
+        if need_save():
+            show_warning('Save Spreadsheet', 'Please save your vistrails and try again.')
+            return
+        
+        if fileName==None:
+            fileName = self.spreadsheetFileName
+        if fileName:
+            indexFile = open(fileName, 'w')
+            indexFile.write(str(len(self.tabWidgets))+'\n')
+            for t in self.tabWidgets:
+                dim = t.getDimension()
+                sheet = spreadsheetRegistry.getSheetByType(type(t))
+                indexFile.write('%s\n'%str((str(t.windowTitle()),
+                                            sheet,
+                                            dim[0], dim[1])))
+                for r in xrange(dim[0]):
+                    for c in xrange(dim[1]):
+                        info = t.getCellPipelineInfo(r,c)
+                        if info:
+                            newinfo0 = copy.copy(info[0])
+                            newinfo0['pipeline'] = None
+                            newinfo0['actions'] = []
+                            newinfo0['locator'] = \
+                                          serialize_locator(newinfo0['controller'].locator)
+                            newinfo0['controller'] = None
+                            indexFile.write('%s\n'
+                                            %str((r, c,
+                                                  newinfo0,
+                                                  info[1], info[2])))
+                indexFile.write('---\n')
+            indexFile.write(str(len(self.executedPipelines[0]))+'\n')
+            for vistrail in self.executedPipelines[0]:
+                indexFile.write('%s\n'%str((serialize_locator(vistrail[0].locator),
+                                            vistrail[1])))
+            self.changeSpreadsheetFileName(fileName)
+            indexFile.close()
+        else:
+            self.saveSpreadsheetAs()
+        
+    def saveSpreadsheetAs(self):
+        """ saveSpreadsheetAs() -> None
+        Asking a file name before saving the spreadsheet
+        
+        """
+        fileName = QtGui.QFileDialog.getSaveFileName(self,
+                                                     'Choose a spreadsheet '
+                                                     'name',
+                                                     '',
+                                                     'VisTrails Spreadsheet '
+                                                     '(*.vss)')
+        if fileName:
+            (root, ext) = os.path.splitext(fileName)
+            if ext=='':
+                fileName += '.vss'
+            self.saveSpreadsheet(fileName)
+        
+    def openSpreadsheet(self, fileName):
+        """ openSpreadsheet(fileName: str) -> None
+        Open a saved spreadsheet assuming that all VTK files must exist and have
+        all the version using the saved spreadsheet
+        
+        """
+        def parse_locator(text):
+            locator = None
+            wrapper = XMLWrapper()
+            dom = wrapper.create_document_from_string(text)
+            root = dom.documentElement
+            version = None
+            version = root.getAttribute('version')
+            if version == '1.0':
+                for element in named_elements(root, 'locator'):
+                    if str(element.getAttribute('type')) == 'file':
+                        locator = FileLocator.parse(element)
+                    elif str(element.getAttribute('type')) == 'db':
+                        locator = DBLocator.parse(element)
+            return locator
+        locators = {}
+        indexFile = open(fileName, 'r')
+        contents = indexFile.read()
+        self.clearTabs()
+        lidx = 0
+        lines = contents.split('\n')
+        tabCount = int(lines[lidx])
+        lidx += 1
+        for tabIdx in xrange(tabCount):
+            # FIXME: eval should pretty much never be used
+            tabInfo = eval(lines[lidx])
+            lidx += 1
+            sheet = spreadsheetRegistry.getSheet(tabInfo[1])(self)
+            sheet.setDimension(tabInfo[2], tabInfo[3])
+            self.addTabWidget(sheet, tabInfo[0])
+            while lines[lidx]!='---':
+                (r, c, vistrail, pid, cid) = eval(lines[lidx])
+                locator = vistrail['locator']
+                if locators.has_key(locator):
+                    vistrail['locator'] = locators[locator]
+                else:
+                    locators[locator] = parse_locator(vistrail['locator'])
+                    vistrail['locator'] = locators[locator]
+                self.appendMonitoredLocations((vistrail, pid, cid),
+                                              (sheet, r, c))
+                lidx += 1
+            lidx += 1
+        pipelineCount = int(lines[lidx])
+        lidx += 1
+        self.loadingMode = True
+        progress = QtGui.QProgressDialog("Loading spreadsheet...",
+                                         "&Cancel", 0, pipelineCount,
+                                         self,
+                                         QtCore.Qt.WindowStaysOnTopHint
+                                         );
+        progress.show()
+        for pipelineIdx in xrange(pipelineCount):
+            # FIXME: eval should pretty much never be used
+            (serializedLocator, version) = eval(lines[lidx])
+            try:
+                locator = locators[serializedLocator]
+            except KeyError:
+                locator = parse_locator(serializedLocator)
+            if locator:
+                bundle = locator.load()
+                if isinstance(bundle, SaveBundle):
+                    pipeline = bundle.vistrail.getPipeline(version)
+                else:
+                    pipeline = bundle.getPipeline(version)
+                execution = get_default_interpreter()
+                progress.setValue(pipelineIdx)
+                QtCore.QCoreApplication.processEvents()
+                if progress.wasCanceled():
+                    break
+                kwargs = {'locator': locator,
+                          'current_version': version,
+                          'view': DummyView(),
+                          }
+                execution.execute(pipeline, **kwargs)
+            else:
+                raise RuntimeError("Couldn't load spreadsheet")
+            lidx += 1
+        progress.setValue(pipelineCount)
+        QtCore.QCoreApplication.processEvents()
+        self.changeSpreadsheetFileName(fileName)
+        self.loadingMode = False
+        indexFile.close()
+
+    def openSpreadsheetAs(self):
+        """ openSpreadsheetAs() -> None
+        Open a saved spreadsheet and set its filename in the dialog box
+        
+        """
+        fileName = QtGui.QFileDialog.getOpenFileName(self,
+                                                     'Choose a spreadsheet',
+                                                     '',
+                                                     'VisTrails Spreadsheet '
+                                                     '(*.vss)',
+                                                     )
+        if fileName:
+            self.openSpreadsheet(fileName)
+
+    def cleanup(self):
+        """ cleanup() -> None
+        Clear reference of non-collectable objects/temp files for gc
+        
+        """
+        self.clearTabs()
+
+    def setEditingMode(self, editing=True):
+        """ setEditingMode(editing: bool) -> None
+        Turn on/off the editing mode of the whole spreadsheet
+        
+        """
+        self.editingMode = editing
+        for w in self.tabWidgets:
+            w.setEditingMode(editing)
diff --git a/vistrails/packages/spreadsheet/spreadsheet_window.py b/vistrails/packages/spreadsheet/spreadsheet_window.py
new file mode 100644
index 0000000..51cc4c4
--- /dev/null
+++ b/vistrails/packages/spreadsheet/spreadsheet_window.py
@@ -0,0 +1,668 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This file implements the main spreadsheet window:
+#   SpreadsheetWindow
+################################################################################
+from PyQt4 import QtCore, QtGui
+from spreadsheet_base import StandardSheetReference
+from spreadsheet_event import BatchDisplayCellEventType, DisplayCellEventType, \
+     RepaintCurrentSheetEventType
+from spreadsheet_tabcontroller import StandardWidgetTabController
+from spreadsheet_sheet import StandardWidgetSheet
+from spreadsheet_cell import QCellContainer
+from spreadsheet_config import configuration
+from vistrails.core.modules import module_utils
+from vistrails.core.utils import trace_method
+import ctypes
+import os.path
+import sys
+import tempfile
+
+################################################################################
+class SpreadsheetWindow(QtGui.QMainWindow):
+    """
+    SpreadsheetWindow is the top-level main window containing a
+    stacked widget of QTabWidget and its stacked widget for slideshow
+    mode
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ SpreadsheetWindow(parent: QWidget, f: WindowFlags)
+                              -> SpreadsheetWindow
+        Layout menu, status bar and tab widget
+        
+        """
+        QtGui.QMainWindow.__init__(self, parent, f)
+        self.createEventMap()
+        self.setWindowTitle('Untitled - VisTrails Spreadsheet')
+        self.shownConfig = False #flag to control the window setup code is done only once
+        self.stackedCentralWidget = QtGui.QStackedWidget(self)
+        self.tabController = StandardWidgetTabController(
+            self.stackedCentralWidget)
+        self.stackedCentralWidget.addWidget(self.tabController)
+        self.fullScreenStackedWidget = QtGui.QStackedWidget(
+            self.stackedCentralWidget)
+        self.stackedCentralWidget.addWidget(self.fullScreenStackedWidget)
+        self.setCentralWidget(self.stackedCentralWidget)
+        self.setStatusBar(QtGui.QStatusBar(self))
+        self.modeActionGroup = QtGui.QActionGroup(self)
+        
+        self.visApp = QtCore.QCoreApplication.instance()
+        self.visApp.installEventFilter(self)
+        
+        self.setupMenu()
+        
+        self.connect(self.tabController,
+                     QtCore.SIGNAL('needChangeTitle'),
+                     self.setWindowTitle)
+        self.file_pool = module_utils.FilePool()
+        self.echoMode = False
+        self.echoCellEvents = []
+
+        if hasattr(self.visApp, 'builderWindow'):
+            self.quitAction = QtGui.QAction('&Quit VisTrails', self)
+            self.addAction(self.quitAction)
+            self.quitAction.setShortcut('Ctrl+Q')
+            self.connect(self.quitAction,
+                         QtCore.SIGNAL('triggered()'),
+                         self.quitActionTriggered)
+
+        # if the spreadsheet has one row and 2 columns
+        # this will cause the spreadsheet to have each cell
+        # 550 x 450 size in the server
+        #self.resize(1156, 599)
+
+    def quitActionTriggered(self):
+        if self.visApp and hasattr(self.visApp, 'builderWindow') and \
+           self.visApp.builderWindow.isVisible():
+            self.visApp.builderWindow.quit()
+
+    
+    def cleanup(self):
+        if self.visApp!=None:
+            self.visApp.removeEventFilter(self)
+        self.file_pool.cleanup()
+        self.tabController.cleanup()
+
+    def destroy(self):
+        self.tabController.cleanup()
+        self.file_pool.cleanup()
+
+    def setupMenu(self):
+        """ setupMenu() -> None
+        Add all available actions to the menu bar
+
+        """
+        self.setMenuBar(QtGui.QMenuBar(self))
+        self.mainMenu = QtGui.QMenu('&Main', self.menuBar())
+        self.menuBar().addAction(self.mainMenu.menuAction())
+        self.mainMenu.addAction(self.tabController.saveAction())
+        self.mainMenu.addAction(self.tabController.saveAsAction())
+        self.mainMenu.addAction(self.tabController.openAction())
+        self.mainMenu.addSeparator()
+        self.mainMenu.addAction(self.tabController.newSheetAction())
+        self.mainMenu.addAction(self.tabController.deleteSheetAction())
+        self.viewMenu = QtGui.QMenu('&View', self.menuBar())
+        self.menuBar().addAction(self.viewMenu.menuAction())
+        self.viewMenu.addAction(self.interactiveModeAction())
+        self.viewMenu.addAction(self.editingModeAction())
+        self.viewMenu.addSeparator()
+        self.viewMenu.addAction(self.fitToWindowAction())
+        self.viewMenu.addAction(self.fullScreenAction())
+        self.windowMenu = QtGui.QMenu('&Window', self.menuBar())
+        self.menuBar().addAction(self.windowMenu.menuAction())
+        self.windowMenu.addAction(self.showBuilderWindowAction())
+
+        self.connect(self.modeActionGroup,
+                     QtCore.SIGNAL('triggered(QAction*)'),
+                     self.modeChanged)
+
+    def fitToWindowAction(self):
+        """ fitToWindowAction() -> QAction
+        Return the fit to window action
+        
+        """
+        if not hasattr(self, 'fitAction'):
+            self.fitAction = QtGui.QAction('Fit to window', self)
+            self.fitAction.setStatusTip('Stretch spreadsheet cells '
+                                        'to fit the window size')
+            self.fitAction.setCheckable(True)
+            checked = self.tabController.currentWidget().sheet.fitToWindow
+            self.fitAction.setChecked(checked)
+            self.connect(self.fitAction,
+                         QtCore.SIGNAL('toggled(bool)'),
+                         self.fitActionToggled)
+        return self.fitAction
+
+    def fitActionToggled(self, checked):
+        """ fitActionToggled(checked: boolean) -> None
+        Handle fitToWindow Action toggled
+        
+        """
+        self.tabController.currentWidget().sheet.setFitToWindow(checked)
+        
+    def fullScreenAction(self):
+        """ fullScreenAction() -> QAction
+        Return the fullscreen action
+        
+        """
+        if not hasattr(self, 'fullScreenActionVar'):
+            self.fullScreenActionVar = QtGui.QAction('&Full Screen', self)
+            self.fullScreenActionVar.setShortcut('Ctrl+F')
+            self.fullScreenActionVar.setCheckable(True)
+            self.fullScreenActionVar.setChecked(False)
+            self.fullScreenActionVar.setStatusTip('Show sheets without any '
+                                                  'menubar or statusbar')
+            self.connect(self.fullScreenActionVar,
+                         QtCore.SIGNAL('triggered(bool)'),
+                         self.fullScreenActivated)
+            self.fullScreenAlternativeShortcuts = [QtGui.QShortcut('F11', self),
+                                                   QtGui.QShortcut('Alt+Return',
+                                                                   self),
+                                                   QtGui.QShortcut('Alt+Enter',
+                                                                   self)]
+            for sc in self.fullScreenAlternativeShortcuts:
+                self.connect(sc, QtCore.SIGNAL('activated()'),
+                             self.fullScreenActionVar.trigger)
+        return self.fullScreenActionVar
+
+    def fullScreenActivated(self, full=None):
+        """ fullScreenActivated(full: bool) -> None
+        if fullScreen has been requested has pressed, then go to fullscreen now
+        
+        """
+        if full==None:
+            fs = self.isFullScreen()
+            fs = not fs
+        else:
+            fs = full
+        if fs:
+            self.setWindowState(QtCore.Qt.WindowFullScreen)
+        else:
+            self.setWindowState(QtCore.Qt.WindowNoState)
+        fs = self.isFullScreen()
+        self.menuBar().setVisible(not fs)
+        self.statusBar().setVisible(not fs)
+        self.tabController.setupFullScreenWidget(fs,
+                                                 self.fullScreenStackedWidget)
+        self.stackedCentralWidget.setCurrentIndex(int(fs))
+        
+    def interactiveModeAction(self):
+        """ interactiveModeAction() -> QAction
+        Return the interactive mode action, this is the mode where users can
+        interact with the content of the cells
+        
+        """
+        if not hasattr(self, 'interactiveModeActionVar'):
+            self.interactiveModeActionVar = QtGui.QAction('&Interactive Mode',
+                                                          self.modeActionGroup)
+            self.interactiveModeActionVar.setCheckable(True)
+            self.interactiveModeActionVar.setChecked(True)
+            self.interactiveModeActionVar.setShortcut('Ctrl+Shift+I')
+            self.interactiveModeActionVar.setStatusTip('Use this mode to '
+                                                       'interact with '
+                                                       'the cell contents')
+        return self.interactiveModeActionVar
+
+    def editingModeAction(self):
+        """ editingModeAction() -> QAction
+        Return the editing mode action, this is the mode where users can
+        interact with the content of the cells
+        
+        """
+        if not hasattr(self, 'editingModeActionVar'):
+            self.editingModeActionVar = QtGui.QAction('&Editing Mode',
+                                                      self.modeActionGroup)
+            self.editingModeActionVar.setCheckable(True)
+            self.editingModeActionVar.setShortcut('Ctrl+Shift+E')
+            self.editingModeActionVar.setStatusTip('Use this mode to '
+                                                   'layout cells and '
+                                                   'interact cells with '
+                                                   'the builder')
+        return self.editingModeActionVar
+
+    def showBuilderWindowAction(self):
+        """ showBuilderWindowAction() -> QAction
+        Return the show builder action, this is used to show the builder window
+        when only the spreadsheet window is visible.
+        
+        """
+        if not hasattr(self, 'showBuilderWindowActionVar'):
+            self.showBuilderWindowActionVar = \
+                                        QtGui.QAction('&Show Builder Window',
+                                                      self)
+            self.showBuilderWindowActionVar.setShortcut('Ctrl+Shift+B')
+            self.showBuilderWindowActionVar.setStatusTip('Show the '
+                                                         'Builder Window')
+            if hasattr(self.visApp, 'builderWindow'):
+                self.showBuilderWindowActionVar.setEnabled(True)
+            else:
+                self.showBuilderWindowActionVar.setEnabled(False)
+                
+            self.connect(self.showBuilderWindowActionVar,
+                         QtCore.SIGNAL('triggered()'),
+                         self.showBuilderWindowActionTriggered)
+            
+        return self.showBuilderWindowActionVar
+    
+    def modeChanged(self, action):
+        """ modeChanged(action: QAction) -> None        
+        Handle the new mode (interactive or editing) based on the
+        triggered action
+        
+        """
+        editing = self.editingModeAction().isChecked()
+        self.tabController.setEditingMode(editing)
+    
+    def configShow(self, show=False):
+        """ configShow() -> None
+        Read VisTrails setting and show the spreadsheet window accordingly
+        
+        """
+        if hasattr(self.visApp, 'configuration'):
+            if self.shownConfig:
+                self.show()
+            ### Multiheads
+            desktop = QtGui.QApplication.desktop()
+            if self.visApp.temp_configuration.multiHeads and desktop.numScreens()>1:
+                builderScreen = desktop.screenNumber(self.visApp.builderWindow)
+                r = desktop.availableGeometry(builderScreen)
+                self.visApp.builderWindow.ensurePolished()
+                self.visApp.builderWindow.updateGeometry()
+                frame = self.visApp.builderWindow.frameGeometry()
+                rect = self.visApp.builderWindow.rect()
+                frameDiff = QtCore.QPoint((frame.width()-rect.width())/2,
+                                          (frame.height()-rect.height())/2)
+                self.visApp.builderWindow.move(
+                    frame.topLeft()+r.center()-frame.center())
+                for i in xrange(desktop.numScreens()):
+                    if i!=builderScreen:
+                        r = desktop.availableGeometry(i)
+                        self.adjustSize()
+                        self.move(r.center()-self.rect().center()-frameDiff)
+                        break
+            if not self.visApp.temp_configuration.interactiveMode:
+                self.shownConfig = True
+                if show:
+                    self.show()
+                return
+            ### Maximize
+            if self.visApp.temp_configuration.maximizeWindows:
+                self.showMaximized()
+                ### When the builder is hidden, the spreadsheet window does
+                ### not have focus. We have to force it
+                if self.visApp.temp_configuration.showSpreadsheetOnly:
+                    self.raise_()
+            else:
+                self.show()
+                ### When the builder is hidden, the spreadsheet window does
+                ### not have focus. We have to force it to have the focus
+                if self.visApp.temp_configuration.showSpreadsheetOnly:
+                    self.raise_()                
+        else:
+            self.show()
+            
+        self.shownConfig = True
+
+    def showEvent(self, e):
+        """ showEvent(e: QShowEvent) -> None
+        Make sure we show ourself for show event
+        
+        """
+        self.show()
+        # Without this Ubuntu Unity will not show the menu bar
+        self.raise_()
+
+    def closeEvent(self, e):
+        """ closeEvent(e: QCloseEvent) -> None
+        When close, just hide instead
+        
+        """
+        if hasattr(self.visApp, 'builderWindow'):
+            if self.visApp.builderWindow.isVisible():
+                e.ignore()
+                self.hide()
+            else:
+                #if the window is not visible, we need to quit the application
+                QtCore.QCoreApplication.quit()
+        else:
+            QtGui.QMainWindow.closeEvent(self, e)
+
+    def sizeHint(self):
+        """ sizeHint() -> QSize
+        Return a default size of the window
+        
+        """
+        return QtCore.QSize(1024, 768)
+
+    def eventFilter(self,q,e):
+        """ eventFilter(q: QObject, e: QEvent) -> depends on event type
+        An application-wide eventfilter to capture mouse/keyboard events
+        
+        """
+        eType = e.type()
+        # Handle Show/Hide cell resizer on MouseMove
+        if eType==QtCore.QEvent.MouseMove:
+            sheetWidget = self.tabController.tabWidgetUnderMouse()
+            if sheetWidget:
+                sheetWidget.showHelpers(True, QtGui.QCursor.pos())
+
+        # Slideshow mode
+        if (eType==QtCore.QEvent.MouseButtonPress and
+            self.isFullScreen() and
+            e.buttons()&QtCore.Qt.RightButton):
+            self.tabController.showPopupMenu()
+            return True
+                
+        # Handle slideshow shortcuts
+        if (eType==QtCore.QEvent.KeyPress and
+            self.isFullScreen()):
+            if (e.key() in [QtCore.Qt.Key_Space,
+                            QtCore.Qt.Key_PageDown,QtCore.Qt.Key_Right]):
+                self.tabController.showNextTab()
+                return True
+            if (e.key() in [QtCore.Qt.Key_PageUp,QtCore.Qt.Key_Left]):
+                self.tabController.showPrevTab()
+                return True
+            if (e.key()==QtCore.Qt.Key_Escape or
+                (e.key()==QtCore.Qt.Key_F and e.modifiers()&QtCore.Qt.ControlModifier)):
+                self.fullScreenAction().trigger()
+                return True
+
+        # Perform single-click event on the spread sheet
+        if (not self.tabController.editingMode and
+            eType==QtCore.QEvent.MouseButtonPress):
+            if isinstance(q, QCellContainer):
+                return q.containedWidget!=None
+            p = q
+            while (p and (not p.isModal()) and not isinstance(p, StandardWidgetSheet) and p.parent):
+                p = p.parent()
+            if p and isinstance(p, StandardWidgetSheet) and not p.isModal():
+                pos = p.viewport().mapFromGlobal(e.globalPos())
+                p.emit(QtCore.SIGNAL('cellActivated(int, int, bool)'),
+                       p.rowAt(pos.y()), p.columnAt(pos.x()),
+                       e.modifiers()==QtCore.Qt.ControlModifier)
+        return False
+        #return QtGui.QMainWindow.eventFilter(self,q,e)
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Handle all special events from spreadsheet controller
+        
+        """
+        if self.eventMap.has_key(e.type()):
+            self.eventMap[e.type()](e)
+            return False
+        return QtGui.QMainWindow.event(self, e)
+
+    def createEventMap(self):
+        """ createEventMap() -> None        
+        Create the event map to call inside the event(). This must be
+        called before anything else
+        
+        """
+        self.eventMap = {
+            DisplayCellEventType : self.displayCellEvent,
+            BatchDisplayCellEventType : self.batchDisplayCellEvent,
+            RepaintCurrentSheetEventType: self.repaintCurrentSheetEvent
+            }
+
+    def displayCellEvent(self, e):
+        """ displayCellEvent(e: DisplayCellEvent) -> None
+        Display a cell when receive this event
+        
+        """
+        if self.echoMode:
+            self.echoCellEvents.append(e)
+            return None 
+        self.tabController.addPipeline(e.vistrail)
+        cid = self.tabController.increasePipelineCellId(e.vistrail)
+        pid = self.tabController.getCurrentPipelineId(e.vistrail)
+        if self.tabController.isLoadingMode():
+            locations = self.tabController.getMonitoredLocations((
+                (e.vistrail), pid, cid))
+            for (sheet, row, col) in locations:
+                sheet.tabWidget.setCurrentWidget(sheet)
+                sheet.setCellPipelineInfo(row, col, (e.vistrail, pid, cid))
+                sheet.setCellByType(row, col, e.cellType, e.inputPorts)
+            return None
+        else:
+            reference = e.sheetReference
+            if reference==None:
+                reference = StandardSheetReference()
+            sheet = self.tabController.findSheet(reference)
+            row = e.row
+            col = e.col
+            if row<0 or col<0:
+                (row, col) = sheet.getFreeCell()
+            sheet.tabWidget.setCurrentWidget(sheet)
+            sheet.setCellPipelineInfo(row, col,
+                                      (e.vistrail, pid, cid))
+            if e.rowSpan>=1 or e.colSpan>=1:
+                sheet.setSpan(row, col, e.rowSpan, e.colSpan)
+            if e.inputPorts!=None:
+                sheet.setCellByType(row, col, e.cellType, e.inputPorts)
+            else:
+                sheet.setCellByWidget(row, col, e.cellType)
+            QtCore.QCoreApplication.processEvents()
+            cell = sheet.getCell(row, col) 
+            if self.editingModeAction().isChecked():
+                sheet.setCellEditingMode(row, col, True)
+            #If a cell has to dump its contents to a file, it will be in the
+            #extra_info dictionary
+            if cell and e.vistrail.has_key('extra_info'):
+                dump_as_pdf = False
+                extra_info = e.vistrail['extra_info']
+                if extra_info.has_key('pathDumpCells'):
+                    dumppath = extra_info['pathDumpCells']
+                    if extra_info.has_key('nameDumpCells'):
+                        name = extra_info['nameDumpCells']
+                        base_fname = os.path.join(dumppath,
+                                                  name)
+                    else:
+                        locator = e.vistrail['locator']
+                        if locator is not None:
+                            name = e.vistrail['locator'].short_name
+                        else:
+                            name = 'untitled'
+                        version = e.vistrail['version']
+                        if version is None:
+                            version = 0L
+                        base_fname = os.path.join(dumppath,"%s_%s" % \
+                                                  (name, e.vistrail['version']))
+
+                    if configuration.dumpfileType == 'PNG':
+                        dump_as_pdf = False
+                    elif configuration.dumpfileType == 'PDF':
+                        dump_as_pdf = True
+                        
+                    #extra_info configuration overwrites global configuration    
+                    if extra_info.has_key('pdf'):
+                        dump_as_pdf = extra_info['pdf']
+                    
+                    file_extension = '.png'
+                    if dump_as_pdf == True:
+                        file_extension = '.pdf'
+                            
+                    # add cell location by default
+                    if not extra_info.has_key('nameDumpCells'):
+                        base_fname = base_fname + "_%d_%d" % (row, col)
+                    # make a unique filename
+                    filename = base_fname + file_extension
+                    counter = 2
+                    while os.path.exists(filename):
+                        filename = base_fname + "_%d%s" % (counter,
+                                                           file_extension)
+                        counter += 1
+                    if not dump_as_pdf:
+                        cell.dumpToFile(filename)
+                    else:
+                        cell.saveToPDF(filename)
+            #if the cell was already selected, then we need to update 
+            #the toolbar with this new cell
+            if hasattr(sheet, 'sheet'):
+                if sheet.sheet.activeCell == (row,col):
+                    sheet.sheet.setActiveCell(row,col)
+            return cell 
+
+    def batchDisplayCellEvent(self, batchEvent):
+        """ batchDisplayCellEvent(batchEvent: BatchDisplayCellEvent) -> None
+        Handle event where a series of cells are arrived
+        
+        """
+        self.tabController.addPipeline(batchEvent.vistrail)
+        for e in batchEvent.displayEvents:
+            e.vistrail = batchEvent.vistrail
+            self.displayCellEvent(e)
+
+    def repaintCurrentSheetEvent(self, e):
+        """ repaintCurrentSheetEvent(e: RepaintCurrentSheetEvent) -> None
+        Repaint the current sheet
+        
+        """
+        currentTab = self.tabController.currentWidget()
+        if currentTab:
+            (rCount, cCount) = currentTab.getDimension()
+            for r in xrange(rCount):
+                for c in xrange(cCount):
+                    widget = currentTab.getCell(r, c)
+                    if widget:
+                        widget.repaint()
+    
+    def showBuilderWindowActionTriggered(self):
+        """showBuilderWindowActionTriggered() -> None
+        This will show the builder window """
+        self.visApp.builderWindow.show()
+
+    def prepareReviewingMode(self, vCol):
+        """ Trim down most of the spreadsheet window """
+        self.menuBar().hide()
+        self.statusBar().hide()
+        self.tabController.tabBar().hide()
+        self.tabController.clearTabs()
+        self.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.WindowStaysOnTopHint)
+        self.setWindowTitle('Pipeline Review - VisTrails Spreadsheet')
+        self.resize(560*vCol, 512)
+        self.show()
+
+    def startReviewingMode(self):
+        """ startReviewingMode()
+        Reorganize the spreadsheet to contain only cells executed from locator:version
+        
+        """
+        currentTab = self.tabController.currentWidget()
+        if currentTab:
+            currentTab.toolBar.hide()
+            buttonLayout = QtGui.QHBoxLayout()
+            buttons = [QtGui.QPushButton('&Accept'),
+                       QtGui.QPushButton('&Discard')]
+            buttonLayout.addStretch()
+            buttonLayout.addWidget(buttons[0])
+            buttonLayout.addWidget(buttons[1])
+            buttonLayout.addStretch()
+            currentTab.layout().addLayout(buttonLayout)
+            self.connect(buttons[0], QtCore.SIGNAL('clicked()'),
+                         self.acceptReview)
+            self.connect(buttons[1], QtCore.SIGNAL('clicked()'),
+                         self.discardReview)
+
+    def discardReview(self):
+        """ Just quit the program """
+        QtCore.QCoreApplication.quit()
+
+    def acceptReview(self):
+        """ Copy image of all cells to the clipboard and then exit """
+        currentTab = self.tabController.currentWidget()
+        height = 0
+        width = 0
+        pixmaps = []
+        version = -1
+        if currentTab:
+            (rCount, cCount) = currentTab.getDimension()
+            for r in xrange(rCount):
+                for c in xrange(cCount):
+                    widget = currentTab.getCell(r, c)
+                    if widget:
+                        version = currentTab.getCellPipelineInfo(r, c)[0]['version']
+                        pix = widget.grabWindowPixmap()
+                        pixmaps.append(pix)
+                        width += pix.width()
+                        height = max(height, pix.height())
+        finalImage = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32)
+        painter = QtGui.QPainter(finalImage)
+        x = 0
+        for pix in pixmaps:
+            painter.drawPixmap(x, 0, pix)
+            x += pix.width()
+        painter.end()
+        filename = tempfile.gettempdir() + '/' + 'vtexport.png'
+        finalImage.save(filename, 'PNG')
+        sm = QtCore.QSharedMemory('VisTrailsPipelineImage')
+        sm.create(32768)
+        sm.attach()
+        sm.lock()
+        pfn = ctypes.c_char_p(filename)
+        ctypes.memmove(int(sm.data()), pfn, len(filename))
+        pfn = ctypes.c_char_p(str(version))
+        ctypes.memmove(int(sm.data())+256, pfn, len(str(version)))
+        sm.unlock()
+        sm.detach()
+        QtCore.QCoreApplication.quit()
+
+    def setEchoMode(self, echo):
+        """ setEchoMode(echo: bool)
+        Instruct the spreadsheet to dispatch (echo) all cell widgets
+        instead of managing them on the spreadsheet
+
+        """
+        self.echoMode = echo
+
+    def getEchoCellEvents(self):
+        """ getEchoCellEvents() -> [DisplayCellEvent]
+        Echo back the list of all cell events that have been captured
+        earlier
+        
+        """
+        return self.echoCellEvents
+
+    def clearEchoCellEvents(self):
+        """ clearEchoCellEvents()
+        Erase the list of echoed events 
+
+        """
+        self.echoCellEvents = []
+
+    
diff --git a/vistrails/packages/spreadsheet/widgets/__init__.py b/vistrails/packages/spreadsheet/widgets/__init__.py
new file mode 100644
index 0000000..cdc9214
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Nothing here on purpose
+pass
diff --git a/vistrails/packages/spreadsheet/widgets/iebrowser/__init__.py b/vistrails/packages/spreadsheet/widgets/iebrowser/__init__.py
new file mode 100644
index 0000000..dc0cdd5
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/iebrowser/__init__.py
@@ -0,0 +1,59 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# Internet Explorer plugin for VisTrails Spreadsheet
+################################################################################
+from iecell import IECell
+
+################################################################################
+
+def widgetName():
+    """ widgetName() -> str
+    Return the name of this widget plugin
+    
+    """
+    return 'Internet Explorer Control'
+
+def registerWidget(reg, basicModules, basicWidgets):    
+    """ registerWidget(reg: module_registry,
+                       basicModules: python package,
+                       basicWidgets: python package) -> None
+    Register all widgets in this package to VisTrails module_registry
+    
+    """
+    reg.add_module(IECell)
+    reg.add_input_port(IECell, "Location", basicWidgets.CellLocation)
+    reg.add_input_port(IECell, "url", basicModules.String)
+    reg.add_input_port(IECell, "file", basicModules.File)
diff --git a/vistrails/packages/spreadsheet/widgets/iebrowser/iecell.py b/vistrails/packages/spreadsheet/widgets/iebrowser/iecell.py
new file mode 100644
index 0000000..28feaa5
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/iebrowser/iecell.py
@@ -0,0 +1,110 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+############################################################################
+# web browser view implementation
+############################################################################
+from vistrails.core.modules.vistrails_module import Module
+from PyQt4 import QtCore, QtGui, QAxContainer
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget
+import shutil
+############################################################################
+
+class IECell(SpreadsheetCell):
+    """
+    IECell is a custom Module to view URLs using the IE ActiveX Control
+    
+    """
+    def compute(self):
+        """ compute() -> None
+        Dispatch the URL to the spreadsheet
+        """
+        if self.hasInputFromPort("url"):
+            urlValue = self.getInputFromPort("url")
+            fileValue = None
+        elif self.hasInputFromPort("file"):
+            fileValue = self.getInputFromPort("file")
+            urlValue = None
+        else:
+            fileValue = None
+            urlValue = None
+        self.display(IECellWidget, (urlValue, fileValue))
+
+class IECellWidget(QCellWidget):
+    """
+    IECellWidget has a QAxContainer to display supported documents
+    
+    """
+    def __init__(self, parent=None):
+        """ IECellWidget(parent: QWidget) -> IECellWidget
+        Create a ActiveX Container pointing to the IE Cell
+        
+        """
+        QCellWidget.__init__(self, parent)
+        vbox = QtGui.QVBoxLayout(self)
+        vbox.setMargin(0)
+        self.setLayout(vbox)
+        self.browser = QAxContainer.QAxWidget(self)
+        self.browser.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.browser.setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}")
+        vbox.addWidget(self.browser)
+        self.urlSrc = None
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Updates the contents with a new changed in filename
+        
+        """
+        self.urlSrc = None
+        (urlValue, fileValue) = inputPorts
+        if urlValue:
+            self.urlSrc = QtCore.QUrl(urlValue)
+        elif fileValue:
+            self.urlSrc = QtCore.QUrl.fromLocalFile(fileValue.name)
+        if self.urlSrc!=None:
+            self.browser.dynamicCall('Navigate(const QString&)', self.urlSrc)
+        else:
+            self.browser.dynamicCall('Navigate(const QString&)', 'about:blank')
+
+    def dumpToFile(self, filename):
+        if self.urlSrc is not None:
+            shutil.copyfile(str(self.urlSrc.toLocalFile()), filename)
+            
+    def saveToPDF(self, filename):
+        printer = QtGui.QPrinter()
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        self.browser.print_(printer)
diff --git a/vistrails/packages/spreadsheet/widgets/imageviewer/__init__.py b/vistrails/packages/spreadsheet/widgets/imageviewer/__init__.py
new file mode 100644
index 0000000..38432e2
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/imageviewer/__init__.py
@@ -0,0 +1,58 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# ImageViewer plugin for VisTrails Spreadsheet
+################################################################################
+from imageviewer import ImageViewerCell
+
+################################################################################
+
+def widgetName():
+    """ widgetName() -> str
+    Return the name of this widget plugin
+    
+    """
+    return 'Image Viewer'
+
+def registerWidget(reg, basicModules, basicWidgets):
+    """ registerWidget(reg: module_registry,
+                       basicModules: python package,
+                       basicWidgets: python package) -> None
+    Register all widgets in this package to VisTrails module_registry
+    
+    """
+    reg.add_module(ImageViewerCell)
+    reg.add_input_port(ImageViewerCell, "Location", basicWidgets.CellLocation)
+    reg.add_input_port(ImageViewerCell, "File", basicModules.File)    
diff --git a/vistrails/packages/spreadsheet/widgets/imageviewer/imageviewer.py b/vistrails/packages/spreadsheet/widgets/imageviewer/imageviewer.py
new file mode 100644
index 0000000..53e7e3a
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/imageviewer/imageviewer.py
@@ -0,0 +1,371 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# ImageViewer widgets/toolbar implementation
+################################################################################
+from PyQt4 import QtCore, QtGui
+from vistrails.core.modules.vistrails_module import Module
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+from vistrails.packages.spreadsheet.spreadsheet_controller import spreadsheetController
+import imageviewer_rc
+
+################################################################################
+
+class ImageViewerCell(SpreadsheetCell):
+    """
+    ImageViewerCell is a custom Module to display labels, images, etc.
+    
+    """    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the display event to the spreadsheet with images and labels
+        
+        """
+        if self.hasInputFromPort("File"):
+            window = spreadsheetController.findSpreadsheetWindow()
+            file_to_display = self.getInputFromPort("File")
+            fileValue = window.file_pool.make_local_copy(file_to_display.name)
+        else:
+            fileValue = None
+        self.cellWidget = self.displayAndWait(ImageViewerCellWidget, (fileValue, ))
+
+class ImageViewerCellWidget(QCellWidget):
+    """
+    ImageViewerCellWidget is the actual QLabel that will draw
+    labels/images on the spreadsheet
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerCellWidget(parent: QWidget) -> ImageViewerCellWidget
+        Initialize the widget with its toolbar type and aligment
+        
+        """
+        QCellWidget.__init__(self, parent)
+        self.setLayout(QtGui.QVBoxLayout(self))
+        self.setAnimationEnabled(True)
+        
+        self.label = QtGui.QLabel()
+        self.layout().addWidget(self.label)
+        
+        self.label.setAutoFillBackground(True)
+        self.label.palette().setColor(QtGui.QPalette.Window, QtCore.Qt.white)
+        self.label.setMouseTracking(False)
+        self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
+        self.label.setScaledContents(False)
+        self.toolBarType = ImageViewerToolBar
+        self.originalPix = None
+        self.setMinimumSize(1, 1)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Update the widget contents based on the input data
+        
+        """
+        (fileValue, ) = inputPorts
+        if fileValue:
+            img = QtGui.QImage()
+            if img.load(fileValue.name):
+                self.originalPix = QtGui.QPixmap.fromImage(img)
+                self.label.setPixmap(self.originalPix.scaled(len(self.label),
+                                                         QtCore.Qt.KeepAspectRatio,
+                                                         QtCore.Qt.SmoothTransformation))
+            else:
+                self.label.setText("Invalid image file!")
+
+        QCellWidget.updateContents(self, inputPorts)
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> bool
+        Save the current widget contents to an image file
+        
+        """
+        pixmap = self.label.pixmap()
+        if pixmap and (not pixmap.isNull()):
+            return pixmap.save(filename)
+        return False
+    
+    def saveToPDF(self, filename):
+        """ saveToPDF(filename: str) -> bool
+        Save the current widget contents to a pdf file
+        
+        """
+        printer = QtGui.QPrinter()
+        
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        painter = QtGui.QPainter()
+        painter.begin(printer)
+        rect = painter.viewport()
+        pixmap = self.label.pixmap()
+        size = pixmap.size()
+        size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)
+        painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
+        painter.setWindow(pixmap.rect())
+        painter.drawPixmap(0, 0, pixmap)
+        painter.end()
+
+    def resizeEvent(self, e):
+        if self.originalPix!=None:
+            self.label.setPixmap(self.originalPix.scaled(self.label.size(),
+                                                         QtCore.Qt.KeepAspectRatio,
+                                                         QtCore.Qt.SmoothTransformation))
+                
+class ImageViewerFitToCellAction(QtGui.QAction):
+    """
+    ImageViewerFitToCellAction is the action to stretch the image to
+    fit inside a cell
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerFitToCellAction(parent: QWidget)
+                                       -> ImageViewerFitToCellAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/fittocell.png"),
+                               "&Fit To Cell",
+                               parent)
+        self.setStatusTip("Scale image content to fit cell frame")
+        self.setCheckable(True)
+        self.setChecked(True)
+
+    def toggledSlot(self, checked):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is toggled
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.label.setScaledContents(checked)
+        self.toolBar.slider.updateStatus((self.toolBar.sheet,
+                                          self.toolBar.row,
+                                          self.toolBar.col,
+                                          cellWidget))
+        
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        self.setChecked(cellWidget.label.hasScaledContents())
+
+class ImageViewerSaveAction(QtGui.QAction):
+    """
+    ImageViewerSaveAction is the action to save the image to file
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerSaveAction(parent: QWidget) -> ImageViewerSaveAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/save.png"),
+                               "&Save image as...",
+                               parent)
+        self.setStatusTip("Save image to file")
+        
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        if not cellWidget.label.pixmap() or cellWidget.label.pixmap().isNull():
+            return
+        fn = QtGui.QFileDialog.getSaveFileName(None, "Save image as...",
+                                               "screenshot.png",
+                                               "Images (*.png);;PDF files (*.pdf)")
+        if fn:
+            if fn.lower().endswith("png"):
+                cellWidget.label.pixmap().toImage().save(fn, "png")
+            elif fn.lower().endswith("pdf"):
+                cellWidget.saveToPDF(fn)
+        
+
+class ImageViewerZoomSlider(QtGui.QSlider):
+    """
+    ImageViewerZoomSlider is a slider that allows user to zoom in and
+    out by dragging it
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerZoomSlider(parent: QWidget) -> ImageViewerZoomSlider
+        Setup the ranges, status tip, etc. of the slider
+        
+        """
+        QtGui.QSlider.__init__(self, QtCore.Qt.Horizontal, parent)
+        self.setRange(100, 300)
+        self.setValue(100)
+        self.setTracking(True)
+        self.setStatusTip("Zoom in the image")
+        self.connect(self, QtCore.SIGNAL("valueChanged(int)"), self.updateZoom)
+        self.connect(self, QtCore.SIGNAL("needUpdateStatus"), self.updateStatus)
+        self.setSizePolicy(QtGui.QSizePolicy.Preferred,
+                           QtGui.QSizePolicy.Expanding)
+        
+    def updateZoom(self, value):
+        """ updateZoom(value: int) -> None
+        Update the image when the slider value changed
+        
+        """
+        if self.toolBar:
+            cellWidget = self.toolBar.getSnappedWidget()
+            if not cellWidget.label.hasScaledContents():
+                newWidth = cellWidget.originalPix.width()*value/100
+                pixmap = cellWidget.originalPix.scaledToWidth(newWidth)
+                cellWidget.label.setPixmap(pixmap)
+
+    def updateStatus(self, info):
+        """ updateStatus(info: tuple) -> None
+        Updates the status of the button based on the input info
+        
+        """
+        (sheet, row, col, cellWidget) = info
+        if cellWidget:
+            if (not cellWidget.label.hasScaledContents() and
+                not cellWidget._playing):
+                self.setEnabled(True)
+                originalWidth = cellWidget.originalPix.width()
+                self.setValue(cellWidget.label.pixmap().width()*100/originalWidth)
+            else:
+                self.setEnabled(False)
+                self.setValue(100)
+                
+class ImageViewerZoomLabel(QtGui.QLabel):
+    """
+    ImageViewerZoomLabel is the label sitting next to the ImageViewerZoomSlider
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerZoomSlider(parent: QWidget) -> None
+        Setup the label with a status tip
+        
+        """
+        QtGui.QLabel.__init__(self, "100%", parent)
+        self.setStatusTip("Zoom in the image")
+        
+    def updateValue(self, value):
+        """ updateValue(value: int)
+        Updates the label with the new percentage value
+        """
+        self.setText(str(value)+"%")
+                
+class ImageViewerRotateAction(QtGui.QAction):
+    """
+    ImageViewerRotateAction is the action to rotate the image
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerRotateAction(parent: QWidget)
+                                       -> ImageViewerRotateAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/rotate.png"),
+                               "&Rotate CW...",
+                               parent)
+        self.setStatusTip("Rotate 90 degrees CW")
+        self.rotationMatrix = QtGui.QMatrix(0,1,-1,0,0,0)
+        
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        if not cellWidget.label.pixmap() or cellWidget.label.pixmap().isNull():
+            return
+        cellWidget.originalPix = cellWidget.originalPix.transformed(
+            self.rotationMatrix)
+        cellWidget.label.setPixmap(cellWidget.label.pixmap().transformed(
+            self.rotationMatrix))
+
+class ImageViewerFlipAction(QtGui.QAction):
+    """
+    ImageViewerFlipAction is the action to flip the image
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerFlipAction(parent: QWidget) -> ImageViewerFlipAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/flip.png"),
+                               "&Flip Horizontal...",
+                               parent)
+        self.setStatusTip("Flip the image horizontally")
+        self.flipMatrix = QtGui.QMatrix(-1,0,0,1,0,0)
+        
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        label = cellWidget.label
+        if not label.pixmap() or label.pixmap().isNull():
+            return
+        cellWidget.originalPix = cellWidget.originalPix.transformed(
+            self.flipMatrix)
+        label.setPixmap(label.pixmap().transformed(self.flipMatrix))
+
+class ImageViewerToolBar(QCellToolBar):
+    """
+    ImageViewerToolBar derives from CellToolBar to give the ImageViewerCellWidget
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(ImageViewerFitToCellAction(self))
+        self.appendAction(ImageViewerSaveAction(self))
+        self.appendAction(ImageViewerRotateAction(self))
+        self.appendAction(ImageViewerFlipAction(self))
+        self.slider = ImageViewerZoomSlider(self)
+        label = ImageViewerZoomLabel(self)
+        self.connect(self.slider,
+                     QtCore.SIGNAL("valueChanged(int)"),
+                     label.updateValue)
+        self.appendWidget(self.slider)
+        self.appendWidget(label)
+        self.addAnimationButtons()
diff --git a/vistrails/packages/spreadsheet/widgets/imageviewer/imageviewer_rc.py b/vistrails/packages/spreadsheet/widgets/imageviewer/imageviewer_rc.py
new file mode 100644
index 0000000..9412c41
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/imageviewer/imageviewer_rc.py
@@ -0,0 +1,557 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# Resource object code
+#
+# Created: Thu Sep 21 00:22:30 2006
+#      by: The Resource Compiler for PyQt (Qt v4.1.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x07\xc2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd8\
+\xeb\xf5\x1c\x14\xaa\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x6e\
+\x27\x00\x00\x73\xaf\x00\x00\xf6\x37\x00\x00\x80\xa5\x00\x00\x70\
+\x23\x00\x00\xdd\x02\x00\x00\x30\x3e\x00\x00\x16\xb2\xce\x5d\x77\
+\x0a\x00\x00\x07\x38\x49\x44\x41\x54\x78\xda\x62\x64\x20\x12\x18\
+\xcd\x7d\x64\x00\xa4\x02\x80\xd8\x1e\x88\x1d\xfe\xff\xff\xcf\xf0\
+\xe7\xcf\x7f\x86\x7f\x7f\x81\xf8\xdf\x7f\x86\xbf\x7f\xc1\xec\x03\
+\x7f\xfe\xfe\x3b\x08\x64\x6f\x78\x5c\xa9\x7e\x81\x18\x73\x01\x02\
+\x88\x91\x08\x8b\x13\x80\x54\xbe\x00\x07\x8b\x81\x9a\x28\x07\x83\
+\x8a\x30\x07\x83\x08\x17\x0b\x03\x23\x23\x23\xc3\x1f\xa0\xc5\x40\
+\xc4\xf0\xe3\xf7\x3f\x86\xaf\xbf\xfe\x32\xbc\xf8\xf4\x8b\xe1\xf6\
+\xcb\xef\x0c\x77\x5f\x7e\x63\xf8\xf8\xf5\xf7\x85\xbf\x7f\xfe\x4d\
+\x7c\xd5\xa8\xbd\x00\x9f\xf9\x00\x01\xc4\x88\xc7\x62\x05\x20\x35\
+\x5f\x82\x97\xd5\xc1\x53\x5d\x90\x41\x86\x8f\x0d\x68\x29\x44\x8e\
+\x99\x89\x91\x01\x5d\xe3\x3f\x60\x88\x7c\xf9\xf9\x8f\xe1\xe3\xcf\
+\xbf\x0c\x2f\x3f\xff\x62\xb8\xff\xfa\x07\xc3\xf1\x1b\xef\x19\xde\
+\x7c\xfc\x75\xe0\xcf\x9f\x7f\x89\x9f\xba\xf4\x1e\x60\xb3\x07\x20\
+\x80\x18\x71\x58\x1e\xc0\xc9\xca\xb4\xc0\x41\x89\x8f\xdf\x52\x8e\
+\x97\x01\x68\x36\xdc\x72\x62\xc1\x8b\xcf\xbf\x19\xae\xbf\xfe\xce\
+\x70\xfe\xee\x27\x86\x8b\x77\x3e\x7e\xfc\xf1\xf3\x6f\xc2\xd7\x3e\
+\xfd\x0d\xe8\xea\x00\x02\x88\x11\x5b\x90\x73\xb0\x30\xcd\x4f\x32\
+\x11\x63\x00\xfa\x1e\xc3\xe0\x1f\x7f\xfe\x81\x83\xfc\x3b\x30\xfe\
+\x7f\xfd\xfd\x07\x16\xfb\x0d\x8c\x7f\x76\x66\x46\x06\x6e\x76\x66\
+\x06\x21\x4e\x16\xb8\xda\xdf\xc0\xf8\x39\xf7\xf4\x2b\xc3\xe5\x27\
+\x5f\x18\xf6\x9e\x7a\xc5\xf0\xf3\xe7\xbf\xc4\x5f\x53\x0c\x51\xa2\
+\x04\x20\x80\x18\xd1\x7d\x0e\xb4\x7c\x3d\x36\xcb\xbf\x01\x2d\xfd\
+\x0c\x0c\xde\x07\xef\x7e\x30\xdc\x04\xc6\xf3\xcb\x8f\xbf\x18\xbe\
+\xfd\xfc\xc3\xc0\xc2\xc4\xc4\xf0\x17\x68\x91\x00\x27\x33\x83\x08\
+\x2f\x1b\x83\x2c\x30\x9d\x48\x01\xa3\x4b\x59\x88\x03\xae\xf7\xd6\
+\x9b\x1f\x0c\xbb\xae\xbd\x63\x38\x70\xf2\x35\xc3\x8f\x9f\x7f\x02\
+\x19\x66\x99\xc0\x43\x02\x20\x80\x18\x91\xe3\x1c\x18\xec\x17\x12\
+\x8d\xc5\xf8\x91\x2d\x07\x19\xfe\x19\x18\xb7\x57\x81\x09\x6b\xdf\
+\xcd\xf7\x0c\x1f\xbe\xfd\xb9\x00\x4c\xe5\x1b\x81\x29\xff\x00\x28\
+\xf5\x83\x72\xc2\x7f\x70\x2e\xf8\xe7\xf0\xf7\xcf\x7f\x7f\x4e\x36\
+\x66\x03\x03\x25\x3e\x06\x55\x69\x6e\x06\x43\x29\x6e\x06\x01\x0e\
+\x66\xb0\x39\x57\x81\x8e\xde\x76\xe5\x2d\xc3\xb1\x33\xaf\x3f\xfe\
+\xfb\xf1\xdd\xe0\xef\x5c\x6b\x70\x9a\x00\x08\x20\x16\x24\x4f\xce\
+\x07\xc5\x39\xba\xe5\xaf\xbe\xfc\x66\xd8\x73\xeb\x23\xc3\xa5\xa7\
+\x5f\x2e\x00\x2d\x2c\xbc\x99\xaf\x7c\x00\x47\xb4\x83\xc4\x1b\x04\
+\x2a\x2e\x3b\xec\x3f\xff\xa6\xff\xee\xb3\xaf\x06\x2f\xd5\x05\x18\
+\xdc\x81\x58\x10\x18\x2d\xda\xe2\x9c\x0c\x0f\x3f\x70\x33\xbc\x78\
+\xfd\x95\xff\xee\x8d\xaf\xf3\x81\x6a\x1d\x41\x9a\x00\x02\x88\x19\
+\x16\xef\x40\x8b\x0b\x82\xb4\x85\x31\x2c\x5f\x76\xf6\x35\xc3\xdd\
+\x37\xdf\x17\x00\x2d\x8f\x04\x5a\x7e\x83\x50\xe2\xfb\x71\x64\xfa\
+\x03\x56\x8b\x8c\x95\x6f\x3f\xfe\x94\x78\xfc\xea\xbb\xc1\x0f\x16\
+\x26\x06\x59\x41\x76\x06\x2e\x56\x26\x06\x39\x01\x76\x86\xbb\x5f\
+\xff\x32\xbc\x79\xfe\x41\x81\x51\x3d\xe2\xe1\x9f\x4b\x8b\x2f\x00\
+\x04\x10\x2c\x04\xf2\x41\x59\x0d\x39\xb5\x83\x82\x1d\xe4\x73\x60\
+\xde\x5e\x70\x3d\x57\x29\x91\x94\x1c\x00\x4c\xed\x1f\x80\x54\xe2\
+\xef\xcc\x73\x0c\x27\x2f\xbf\x4b\xe0\x64\x67\x62\x08\xd7\x13\x61\
+\x60\x07\x3a\xc6\x41\x91\x8f\xe1\xc9\x33\x61\x86\x87\xa7\xdf\xe7\
+\x03\xd5\x2c\x00\x08\x20\x26\x50\x09\x07\x2a\x64\x90\xf3\x39\x28\
+\xc1\x81\xe2\x1c\x14\xec\xa4\x5a\x8e\x0c\xfe\x4e\x37\x4a\x7c\xfc\
+\xec\xcb\x85\x4b\xf7\x3e\x32\x1c\x7f\xf4\x19\x2c\xa6\x2b\xc1\xc5\
+\x20\x20\xcc\xc3\xc0\xce\xc6\x64\x20\x18\xba\xca\x00\x20\x80\x98\
+\x40\xc5\x2b\xa8\x84\x43\xce\xe7\xa0\xd4\x0e\x4a\x70\xa0\x38\x67\
+\xa0\x10\x30\xff\xfd\x55\x78\xf7\xc6\x2b\x86\x13\x8f\xbf\xc0\xc5\
+\x40\x8e\xe0\x04\x3a\x82\xf1\xff\xdf\x00\x80\x00\x02\x39\xc0\x1e\
+\x54\xbc\x22\xe7\xf3\x9b\xaf\xbe\x83\x53\x3b\x9e\x04\x47\x7c\x28\
+\xcc\xb5\x3e\xf0\xfb\xeb\x8f\x0b\x2f\x5e\x7c\x62\xb8\x01\x2c\x98\
+\x40\x40\x01\x98\x26\x58\x84\xf9\x19\x98\xfe\xfd\xb6\x07\x08\x20\
+\x50\x1a\x70\x00\x95\xed\xa0\xe2\x15\xec\x00\x60\xf0\x3f\x78\xfb\
+\x03\x54\xb9\x6c\xc4\x69\xea\x4c\x06\x01\x20\xb9\x9e\x8b\x91\xcd\
+\xe1\xff\x4f\x06\x86\xef\x9f\x7f\x1d\x60\xf8\xc5\x10\xc8\xd0\xc0\
+\xf0\x01\x47\x28\x6c\xfc\xf4\xe2\x83\xc1\xdd\xb7\x62\x0c\x1a\xa2\
+\x9c\xe0\x32\xe2\x3f\x17\x27\x03\xcb\x9f\x5f\x0e\x00\x01\xc4\x04\
+\xaa\xd5\x40\x15\x0b\x2c\x06\x40\x25\x1c\xa8\x90\x01\xe5\x73\x3c\
+\x1e\x5b\xef\x6b\x64\xec\xd0\x16\x13\xce\x50\x12\xe0\xc2\x60\xaa\
+\x2c\xe3\xc0\xf0\x9b\x61\x3d\x2e\xc5\x2c\x7f\x7e\x1e\xf8\xf9\xf1\
+\x0b\xc3\x23\xa0\xb9\x20\x00\x2c\x6f\x18\xfe\x30\x32\x03\x43\xe0\
+\x0f\x03\x40\x00\x31\x81\x0a\x12\x50\x51\x0a\x03\xa0\x1a\xee\xef\
+\xbf\x7f\xe0\x2a\x16\x17\x00\xf9\xdc\x59\x5b\x8b\xe1\xed\xdb\xb7\
+\x0c\x6f\x80\x58\x42\x8c\x0b\xe8\x4b\x26\x07\x5c\xea\x99\xfe\xff\
+\x65\x60\x04\x5a\xf6\x17\xc9\x4c\x36\x60\xd1\xcd\xfc\xef\x37\x03\
+\x40\x00\x31\x81\xea\x73\x58\xb5\x0a\xa9\xd1\xfe\x32\x3c\x7e\xfb\
+\x13\x54\xc2\x3d\xc0\x65\x20\x28\xd8\x61\x96\x3f\x79\xff\x9e\xe1\
+\x2e\x10\xff\xff\x89\xdb\xc1\x20\xcb\x19\x40\x0e\xf8\x8f\x50\xf3\
+\x01\x68\x0f\xd3\xdf\x3f\x0c\x00\x01\xc4\x04\x8c\xeb\x03\xdb\xaf\
+\xbe\x63\xb8\x0b\x8c\xf7\x9b\xc0\x2a\xf4\xc4\xbd\x4f\xa0\xf8\x3f\
+\xf0\xa4\x4a\x1d\xa7\x03\x40\x71\xbe\x7a\xcf\x69\xb8\xe5\xb7\xaf\
+\xbf\x65\xf8\xf7\x0d\x77\x94\x31\xff\x05\xba\xf8\xdf\x5f\x06\x68\
+\xdd\x05\x09\x69\xa0\xc7\x99\xfe\xfd\x62\x00\x08\x20\x16\x60\x1a\
+\x08\xbc\xfa\xf4\xeb\xfa\x4b\x8f\x3f\x3b\x00\x43\x1e\x6c\x39\x50\
+\x3e\x10\x6f\xd2\x06\x26\xb8\x1b\x77\x5e\xaf\xbf\x71\xf5\xb5\x03\
+\xc3\x4f\x30\xff\x00\xc3\x7f\xdc\x7a\x80\x51\xe0\xc0\xc4\xc9\xc1\
+\x20\x0d\x2c\x6b\xc0\x05\xd5\xaf\x7f\x0c\x7f\x7f\xfd\x04\xa7\x01\
+\x80\x00\x62\xb9\x91\xa7\xf4\x01\x56\x2e\x83\x83\x8b\x98\x8a\x1f\
+\x92\xda\xe1\x7a\x40\x09\x99\x23\x61\xdf\x7a\xe6\x98\x3f\x0f\xbe\
+\x2d\x71\xc7\x28\x3b\x80\x41\xed\xff\x57\x58\x90\x41\x55\x04\x92\
+\xdd\xaf\xbe\xfa\xc6\xc0\xfc\xf1\x03\xc8\x01\x07\x00\x02\x88\x09\
+\x9c\x03\x90\x30\xb9\x00\x68\x58\x80\xa0\x04\x4f\x01\x7f\xf8\x86\
+\xf9\xc8\xe2\x12\x7e\x73\x1c\x18\xd9\x58\x0c\xd8\x44\x84\x19\x8c\
+\x80\xb5\x23\x08\x5c\x7a\xfe\x8d\x81\xe3\xe5\x13\x60\x22\xfc\x73\
+\x10\x20\x80\x98\x18\xa8\x04\x58\xfe\xfe\x66\x10\x56\x97\x61\xe0\
+\x16\xe7\x4b\x10\x0e\x5e\x36\x1f\x6a\xb9\x00\xb0\xb0\xe9\xff\xad\
+\xac\xc2\xe0\xaa\x22\x00\x57\xbb\xfb\xce\x47\x06\xbe\x97\x0f\x80\
+\x89\xf3\xef\x06\x80\x00\x62\xa1\x96\x03\x40\x29\xfa\x17\x30\x61\
+\x09\xeb\x2a\x33\xbc\xf9\xf3\x3b\x41\xc2\x6f\x2e\x38\xf1\xfd\x11\
+\x97\x30\x90\x50\x91\x65\x08\xd6\x11\x02\xab\xdb\x0b\xb4\xfc\xff\
+\xcb\x67\x0c\xec\x5f\x3f\x5d\xb8\x76\xa4\xfd\x02\x40\x00\x51\xcf\
+\x01\xc0\x14\x0d\xca\xce\x05\x36\x92\x0c\xbd\xa0\xd6\xd3\xef\x9f\
+\x09\xff\x3f\xbe\x63\x60\xd4\xd4\x64\xc8\x34\x17\x87\x27\xbe\x59\
+\xa7\x5f\x31\x48\x5c\x3f\x05\x2a\x86\x27\x82\xc4\x00\x02\x88\x8a\
+\x0e\xf8\x03\x76\x00\xa8\x56\x2d\x04\x3a\xa2\x15\x58\xa7\xfc\xfd\
+\xf9\x8b\xa1\xd6\x5d\x91\x41\x1e\xd8\x0e\x00\x81\xfe\xa3\xcf\x19\
+\xd8\x6f\x5f\x66\xe0\xfa\xf8\xea\xc0\x95\x63\x3d\xe0\xb6\x21\x40\
+\x00\x51\xd5\x01\xb0\x12\x15\xd4\xf0\xa8\x72\x90\x06\xb3\x61\x96\
+\x6f\xbc\xf6\x9e\xe1\xc2\xd5\x87\x0c\x8a\xb7\xcf\x7d\x04\xb5\x15\
+\x60\xfa\x00\x02\x88\x6a\x0e\x00\x56\x38\xe0\x10\x80\x01\x98\xc5\
+\xb0\x78\x5f\xbc\xef\x3a\x83\xe2\xc9\xad\x0c\xac\x3f\xbf\x27\x5c\
+\x3a\xd1\x0f\x2f\xe4\x00\x02\x88\x89\x9a\x21\xf0\x0b\x4b\xfd\x01\
+\x8b\x77\xc1\x27\xb7\x18\xd8\x7e\x7c\xbd\x00\xb4\x1c\xa5\x6f\x00\
+\x10\x40\x54\x73\x00\xa8\x62\xf9\xf3\x17\xd3\x01\xdc\x6c\x4c\x0c\
+\xed\xee\x72\x0c\x9f\xf4\xad\x19\x3e\x48\x2b\x1b\x18\x1b\xa7\xa1\
+\x94\x13\x00\x01\xc4\x44\xcd\x6c\xf8\xfb\xdf\x3f\xac\x72\x4a\x42\
+\xec\x60\x47\xbc\x31\xf7\x60\x78\x2b\xa7\x9d\x80\xec\x08\x80\x00\
+\xa2\x72\x36\x64\x60\xf0\x59\x88\xbf\xe1\xfc\xd5\xc8\x0d\x44\x25\
+\x18\x33\xa4\x7d\x38\x7b\x76\x56\x21\x40\x00\x51\x33\x17\x7c\x50\
+\xdc\xbd\x52\x00\x94\x18\x81\x75\x3c\x38\x4d\x80\xd8\xcc\xc0\x12\
+\x12\xd8\xf6\xc3\xa6\x05\xd4\xf9\x65\x00\x08\x30\x00\x8e\xdc\x6f\
+\x30\x01\x62\x8c\x52\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x05\xd9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x02\x00\x00\x00\xd8\x60\x6e\xd0\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\x00\x00\x05\x90\x49\x44\x41\x54\x58\x47\xed\x56\x7d\x4c\xd4\x75\
+\x1c\xa6\x94\x3f\x32\x47\x1a\x4e\x4a\x32\x88\x64\x82\x7c\x81\xe3\
+\xee\x38\xee\x80\xe3\x0e\x0e\x8f\x97\x83\x3b\x5e\x94\x40\x10\xce\
+\x93\xb7\xe3\x55\xde\x04\x81\x9b\x63\xa4\x4b\xdc\xc8\x55\x86\x2d\
+\x59\x2d\x57\xda\xab\xad\x74\xa1\x63\xad\x5a\xfd\xa1\x36\x01\x11\
+\x08\x45\x79\x55\x40\x42\xe2\x25\x94\xca\xe8\xa1\x5b\x74\xdf\xe3\
+\xb8\x37\x91\x58\xe3\xf6\x19\xe3\xf7\xbc\x7d\x1e\x3e\xfc\xfe\xb8\
+\xc7\xa6\xa7\xa7\x2d\x96\xd4\x07\x85\x96\xd4\xc7\x62\x49\xb5\x99\
+\xf9\x77\x2d\x17\x32\x70\x81\xff\xd7\x85\x46\xef\x8d\x56\x7e\x55\
+\xa9\xf9\x27\xe3\x11\xe0\xc3\xbc\x06\x0f\x75\xa1\x8a\xb3\x15\x1b\
+\xf6\x6d\xd0\x5c\x8f\x47\x80\xff\x4d\xa1\x81\xb1\x01\xab\x7c\xab\
+\x4d\xfb\x37\x69\xae\xc7\x23\x40\x50\x66\x77\x32\xff\x42\xaa\x2f\
+\x55\x16\x69\x16\x2e\x95\x2e\x9a\xbb\xf1\x08\x10\xd4\x62\x17\x6a\
+\xea\x6b\x5a\x53\xf8\x94\xed\xcb\x4f\x93\x4a\xa2\xb9\x1b\x8f\x00\
+\x41\x41\x60\x5e\x27\x33\x2f\x24\xaf\x95\x3b\x54\xd9\xc8\xea\x38\
+\x44\x45\x17\x52\x11\x80\xa0\x20\x58\xbc\x42\x17\x3b\x2f\x3e\x91\
+\xbe\x2a\xb5\x51\x1c\xfb\xad\x2f\x29\xa3\x0b\x95\x11\x80\xa0\x20\
+\x80\xcc\x8c\x4e\x26\x5f\xe8\xc1\x9f\x0f\xf8\x07\xf8\xce\x47\xec\
+\xde\x9a\x4e\x97\xd5\x71\x49\x29\x5d\xa8\x14\x17\xe2\x82\x82\x00\
+\x32\x88\x4d\xed\x64\x72\xa1\x73\x57\xcf\x5b\xec\x5a\x91\xdc\x20\
+\x3e\x36\x9d\x2e\x39\xcb\x21\x25\x74\xa1\x12\x02\x10\x14\x04\x90\
+\x41\xfc\x68\x0b\x8d\xdd\x1b\x63\xab\x38\x8c\x1a\xc7\x57\xa6\x12\
+\xab\xa7\x15\x21\x67\x38\xa4\xd8\x8d\x7a\xa9\x8b\xdd\x00\x82\x82\
+\x00\x32\x88\x61\x31\xa9\x93\x69\x17\x3a\x5a\x5f\x63\x99\xf6\x64\
+\xce\x4d\xe9\xc1\xa9\x9d\x87\xfe\x48\x0a\xfe\x82\x43\xf6\xba\x53\
+\x85\xf6\xba\x03\x04\x05\x01\x64\x10\xc3\xf2\xa8\x0a\xdd\x9d\x18\
+\x71\xc8\x71\xe4\xbc\xe3\x52\x79\x3f\x5e\x35\x1a\x7b\xe0\xb7\x9d\
+\xe2\xcf\x3d\x49\x11\x83\x2a\x54\xc4\x00\x08\x0a\x02\xc8\x20\x86\
+\x05\x46\xe3\x3b\x99\x70\xa1\xe2\x53\x65\x56\xb9\xd6\x7b\x7a\x23\
+\xca\xc7\x62\xf7\x8d\xc4\x54\xdc\x8f\x0f\x3c\xcd\x26\x85\x1e\x54\
+\xa1\x42\x0f\x80\xa0\x20\x80\x0c\x62\x58\x60\x5c\xf8\x42\x5d\x43\
+\xdd\x6b\xe5\xcf\x08\x3e\x61\x95\x4f\xc6\x16\x0d\x6f\xc3\x94\x4f\
+\xc6\xf9\x7f\xca\x22\x05\x2c\xaa\x50\x01\x0b\x20\xa8\x7f\x34\xb1\
+\xb0\xc0\x08\xbb\x91\x9d\x8c\xbd\x90\xf2\x78\xee\xda\x7c\x9b\xcc\
+\x3e\x59\xc1\xdd\xe8\xbc\xa1\x28\x4c\xc9\x44\x8c\xe0\x63\x16\xc9\
+\xa7\x0b\xe5\xb3\x00\x82\x52\x6b\x20\x86\x05\x46\xd8\x17\xb2\xd0\
+\x85\x8e\x1f\x57\xc6\xad\x09\x3e\xe7\x5d\x38\xba\x2d\x7b\x30\x22\
+\xfb\x4e\x24\xa6\x70\x7c\x3b\xff\x23\x16\xc9\x63\x53\x17\xca\x63\
+\x03\x04\xa5\xd6\x40\x0c\x0b\x8c\xb0\x23\xc4\x98\x4e\x46\x5d\x28\
+\xb2\x6a\x87\x4d\xc9\x46\xe5\x80\x34\x73\x50\xa6\xec\x97\x29\x07\
+\x66\x66\xcf\x68\xb4\xf7\x29\x16\xc9\xe5\x50\x85\x72\x39\x00\x41\
+\xa9\x35\x10\xcf\x58\x06\xa4\xb0\x23\x64\x61\x0a\xd5\x35\xd6\x5b\
+\xc6\xad\x0b\xf9\xda\x37\xe3\x67\x59\xea\xad\xb0\xd4\xdb\xe1\xea\
+\xc9\x1a\x89\xe4\x9d\x64\x92\x1c\x2e\x55\x28\x87\x0b\x10\xd4\xac\
+\x0c\x16\x18\x61\x47\x08\xa2\x0c\x76\x32\x70\xa1\xa9\xdf\xa7\xd8\
+\x05\x42\xfb\x83\x8e\xa9\x83\x61\x8a\x3e\x89\xa2\x57\x32\xf3\xf3\
+\xef\x49\x1f\x96\x7a\xbd\xcf\x24\xd9\x74\xa1\x6c\x2e\x40\x50\xb3\
+\x32\xb5\x05\x76\x84\x20\x0a\x81\xfa\x3b\x19\x28\xf4\xe1\x0f\xa7\
+\x1f\x8f\xb1\x0e\xfd\x9e\xaf\x18\x90\x24\x76\x07\x27\xf6\x84\xcc\
+\x4e\xf2\x90\x84\x7d\xc2\x83\x64\xf3\xa8\x0b\x65\xf3\x00\x82\xd2\
+\x54\xc2\x08\x3b\x42\x10\x85\x40\xf3\x0b\x8d\x4c\xfc\xe2\xa4\xf4\
+\x72\xac\x76\x4e\xbc\x1d\xb2\xa3\x2b\x48\x6b\xe4\x83\xa1\xcc\xf7\
+\x18\x24\xcb\x9b\x2a\x94\xe5\x0d\x10\xd4\x5c\x3d\x42\x10\x85\x40\
+\xc4\xea\xe9\xa4\xef\x42\xfb\x4f\x56\x59\xc6\x3f\x1b\xde\x20\x8c\
+\xeb\x11\xc7\xdc\x08\x8c\xb9\xb9\x55\x73\x12\xfa\x83\xdd\xdf\x65\
+\x90\x0c\x5f\xaa\x50\x86\x2f\x40\x50\x5a\x62\xd8\x11\x82\x28\x04\
+\x22\xd6\x9c\x42\x57\xba\x5a\x57\x47\xdb\x3b\xbd\xe9\x1a\xd3\xb3\
+\x35\xaa\x23\x20\xaa\x43\xa4\x35\x2f\xdd\x12\xbb\xd5\x32\x88\x92\
+\x4f\x15\x52\xf2\x01\x82\x9a\xab\x47\x08\xa2\x10\x88\x58\x84\xcf\
+\xd7\x69\xde\x0b\xed\x7a\x35\x77\x75\x8a\x5d\x58\xab\x30\xa2\xc3\
+\x5f\xda\x2e\x94\x5e\xf3\xd7\x9a\xe8\x5e\x11\x39\xee\x4e\xd2\xfd\
+\xa8\x42\xe9\x7e\x00\x41\xcd\xd5\x23\x04\x51\x08\x44\x2c\xc2\x4d\
+\x2b\x74\xe9\x7a\xe3\xaa\x08\x7b\xc6\x07\x1e\xd2\x4e\xff\xd0\x36\
+\xbf\xd0\x9f\x04\x73\x47\xd6\x2d\x74\x7e\xdb\x8d\xa4\x09\xa9\x42\
+\x69\x33\x20\x28\x9d\x16\x44\x21\x10\xb1\x08\xc7\x0a\x9d\x9d\x74\
+\x5c\x08\x5f\xf3\x04\x85\x51\xeb\x8a\x1c\x43\xda\xfd\x82\xda\xf8\
+\xe2\x16\xbe\xb8\x55\xc7\x48\x3a\x05\x9b\x8f\xb9\x92\x54\xba\x50\
+\xaa\x10\x20\x28\x9d\x16\x44\x21\x10\xb1\x08\xc7\x0a\x9d\xdf\x27\
+\x75\x14\x3a\x7f\xf9\x3b\x8b\x60\x5b\xc6\x67\x4c\xf1\x75\x5f\x51\
+\xb3\xb7\xe8\xaa\x8f\xce\x09\xba\xc1\x77\xac\x71\x25\x29\x01\xd4\
+\x85\x52\x02\x00\x82\x9a\xcf\x85\x40\xc4\x22\x1c\x2b\xb0\x68\xee\
+\x91\xb4\x0b\x8d\x4d\x8e\x7b\x66\x4a\xd6\x97\x6e\x16\xb6\xf0\x04\
+\x57\x78\x82\x26\xee\x7c\x23\xba\xe6\xf3\xe2\x51\x57\x92\x2c\xa2\
+\x0a\x25\x8b\x00\x82\xd2\x63\x44\x2c\xc2\xb1\x02\x8b\xb0\x4e\xab\
+\x93\x76\xa1\x9a\x33\x27\x56\x84\xdb\x31\xeb\xd9\xfc\x16\xae\x4f\
+\x83\x97\x4f\xe3\xbc\x23\x68\xe7\xbd\xf0\x06\x21\xbb\x03\xa9\x42\
+\xbb\x03\x01\x82\xd2\x63\x44\x2c\xc2\xb1\x02\x8b\xb0\x4e\x5f\xa1\
+\xf1\xc9\x5f\x5d\xe4\x81\xeb\x55\x4e\xbc\x66\x8e\x57\x83\xa7\xd7\
+\x65\x7d\xe3\xd3\xc6\x79\xfe\x35\x42\x14\x62\xaa\x90\x42\x0c\x10\
+\x94\x7e\x2f\xc2\xb1\x02\x8b\xb0\x0e\x4b\x35\x13\xa8\x0b\x95\xd6\
+\x1e\x5e\xb9\xdd\xc1\xf5\x1b\x06\xab\x81\xe9\x71\xc9\x43\xff\xb0\
+\x9b\x99\xcf\x1d\xd9\x42\xe4\x74\x21\xb9\x18\x20\x28\x83\x76\xac\
+\xc0\x22\xac\xc3\x52\xdd\x85\xfa\x87\xef\x58\x4b\xdc\x6d\x0e\x6d\
+\x61\x35\x79\x32\x2e\xb0\x0d\x0e\x64\xb6\xd5\x84\x24\x05\x51\x17\
+\x4a\x0a\x02\x68\x7c\x02\xd6\x61\x29\x56\xcf\x86\xfc\x7b\xa1\xbc\
+\xd7\x2b\x36\x26\xfa\x7a\x46\x45\xe9\x1c\x56\x64\x24\x09\x0f\x57\
+\x8f\xe6\xef\x24\x81\x7e\xa9\x13\x44\x3a\x65\xb0\xcc\x97\x8c\xa5\
+\x58\xad\xa3\x90\xc1\x6f\x2a\x8b\x23\x30\xea\x1b\xe3\xe2\x54\x51\
+\x6f\x59\x2e\x64\xe8\xda\xcb\x17\x5a\xbe\x90\xa1\x0b\x18\xe2\x97\
+\xdc\x3b\xf4\x17\xad\xc1\xc2\xaa\xe0\x57\x31\x22\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x09\x89\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x46\x72\x20\x31\x36\x20\x4d\x61\x69\x20\
+\x32\x30\x30\x33\x20\x31\x32\x3a\x31\x31\x3a\x33\x32\x20\x2b\x30\
+\x31\x30\x30\x47\xeb\x88\x5e\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x06\x14\x18\x07\x30\xf5\x85\x0a\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x08\xe1\x49\x44\x41\x54\x78\xda\xcd\x5a\x5d\x8c\x5d\x55\x15\
+\x5e\x7b\x9f\x7b\xef\xdc\xf9\xe9\x70\x67\x4a\xa1\xa3\x32\x4c\x7f\
+\x80\x00\x21\x44\x52\x5f\x7c\x20\x24\x44\x8d\x18\x89\x0f\xb6\xa5\
+\x2f\x0a\x09\xc6\x08\x84\x80\x96\x98\x68\x7c\x23\x24\x3c\x00\xc3\
+\x8b\x31\xd1\x67\x62\xa3\x89\x21\x31\x31\x68\xe2\x8b\x86\x2a\x3a\
+\x0d\x24\x6d\x83\xb6\xb4\xb1\xd3\x0b\x73\xa1\x99\xce\x4f\x67\xe6\
+\xfe\x9d\xb3\x5d\x6b\x9f\xbd\xf6\x59\xfb\xdc\x73\xef\x2d\xf4\x8f\
+\x0d\x8b\xbd\xcf\xcf\x3d\xfb\xfb\xd6\xdf\x5e\x7b\x0f\x0a\xa8\x1d\
+\x7a\x33\x82\x89\x99\xef\x81\x56\x87\xc0\xc0\x2e\x50\x46\x83\x6b\
+\xf3\x5f\x8b\x77\xde\x3e\x99\x54\x68\xac\x94\xb2\xc2\x2d\x49\x12\
+\x30\xc6\xd8\x71\x37\x8e\xed\xd8\xe0\xbd\x18\xc7\xb1\xbb\xa6\x77\
+\xec\xf3\x6e\x17\xc7\xf8\xdc\xc8\xeb\x74\x4c\xef\x7d\xb8\x51\x69\
+\xbf\xfc\xef\x1d\x4b\xd0\xe9\x00\xc4\x78\x3f\xee\x1a\xe8\x34\xcf\
+\xc2\xfa\x47\x7f\x80\x77\x5f\xfe\x2d\xac\xfc\x6f\x8d\x7e\x06\xb9\
+\x56\x82\x43\x26\x82\xa9\x63\x6f\x40\xab\xbb\x5f\xd5\xeb\x4a\x37\
+\xb7\x90\x07\x7e\xd4\x81\xad\xc1\x4e\xf8\xea\xfd\x77\xc3\xd8\xd8\
+\x98\xfd\x81\xd6\x1a\xa2\x28\xb2\xcf\x68\x62\x26\x64\xc1\x3b\xc0\
+\x0c\x4e\x0a\x11\x2a\xba\x47\xbf\xd9\xdc\xdc\x84\xb7\xfe\xf1\x9f\
+\xd2\xec\x4d\x66\xb7\x52\x65\x37\x4f\x15\x9a\xcd\xd1\x3d\x1f\x37\
+\x2a\x0f\xc7\x0f\xfc\xfc\xeb\xf0\xd7\x17\x0e\x03\xac\x2e\xe2\xa3\
+\x56\x48\x60\xf2\xe8\x8f\x60\xcb\xec\xd7\x27\x4f\x20\x16\x0d\x16\
+\x4f\xa4\x90\x04\x12\xd0\x08\x14\x4d\x52\x2a\x95\x3c\x68\x26\x40\
+\x92\x6f\x4c\x80\x9e\x31\x48\x26\x43\xf7\xd8\x32\xfc\x8c\x95\x40\
+\xdf\xc4\x5f\xc3\x08\x7e\x52\xe1\xdc\x2a\xd2\x38\xbf\x46\xa5\x95\
+\x61\x7a\x7b\x55\xfd\xf7\x44\xe7\xd1\xce\x3d\xfb\x4f\xc3\xc9\xdf\
+\xfc\x12\x5f\x3c\x27\x2d\x51\x02\x28\x3f\xa9\xcf\x9f\x51\xd6\x3d\
+\x34\xbb\x88\x02\x10\x9a\x65\xf7\xa1\x89\x58\x08\x58\xa3\xd1\xf0\
+\x16\xa0\x9e\x5d\x8a\xfb\xfc\x98\xa4\x5c\x2e\x5b\xe1\xef\x06\x56\
+\xb4\xdf\xd1\xd0\x5e\x3e\x67\xe7\xd7\xa5\x0a\x54\xb7\x7f\x11\x66\
+\xbe\x54\x53\xe7\x3e\xba\xe7\x1b\xf8\xf8\xef\x28\xcb\x28\x2b\x19\
+\x01\x03\x73\xaa\xd9\x44\xf0\x3a\xfd\x90\x73\x9d\x54\x32\xe0\x12\
+\x28\x49\xbb\xdd\x86\xc5\xc5\xc5\x42\x4b\xc8\x38\xc9\x5b\x68\x72\
+\x72\x12\x46\x46\x46\xac\x25\xe4\xbb\x96\x90\xd5\x5d\x04\x5b\x8b\
+\xef\xe2\x75\x07\x4a\xd5\x9b\x60\xa4\x36\x03\x63\x13\x18\x82\x6a\
+\xf2\x36\x7c\x7a\x27\xca\x42\x48\x80\x5c\x83\x00\x9a\x54\xf3\x0c\
+\x3c\xfd\x18\x6a\xd5\x69\xaa\x08\x98\x11\xcf\x8a\xee\x0f\x22\xd2\
+\x9f\xb4\x81\x68\x74\x12\x4c\xdc\x05\x5d\x19\x4d\xdd\x0c\x83\x1f\
+\xe2\x0e\xbd\x30\x8d\x32\x12\xc6\x00\x11\xd7\x68\xc6\x84\xb5\x0f\
+\x39\x2b\x28\x9f\x2d\x64\x23\x2d\xee\xdd\xbb\x37\x00\xc9\x6e\x22\
+\x33\x90\x74\x25\x8e\x85\x42\x52\x14\x13\x16\x7e\x02\x95\xed\xbb\
+\x71\x14\x83\x8e\x2a\xd6\xad\x50\xbb\x78\x69\x47\xfc\x63\xe5\x3c\
+\x8e\x62\x00\x6c\xc0\xda\xd4\x03\x21\x01\x7a\x2d\x41\x30\x45\x99\
+\x86\x80\xec\xd8\xb1\xa3\x10\x4c\x07\x53\x21\x07\xab\x0c\x5a\x8a\
+\x1b\xba\xa6\xbe\xb8\xe1\xbc\xa8\xed\x91\x9b\xe7\xc0\xc7\x24\x2a\
+\xd7\x86\x6c\xd2\x05\x01\x5e\x58\x00\x89\x18\x45\x51\x9f\xf8\xc0\
+\x55\x82\x80\x11\xc0\xa5\xf9\x09\xc4\xca\xca\x4a\x4f\x10\x4b\x91\
+\x56\xe0\x7b\x9c\xd1\xf2\x56\xcb\xa0\xd1\x5a\x12\xa7\x0a\x4d\x94\
+\x0d\x6a\x7b\xbb\x1b\x17\x52\xb6\x16\xb0\x4c\x79\xed\x72\x81\xcb\
+\xbd\x11\x6e\x40\x8d\xd3\xdf\xd6\xd6\x16\x9c\x3a\x75\xca\x02\xea\
+\xd7\x8a\x62\x86\x82\x78\x7c\x7c\x3c\x04\x9e\xbe\xdc\xab\x5f\x1f\
+\x8c\xfd\x9b\x77\x21\x06\xed\x27\x76\x04\x12\xa1\x3d\xce\x48\xac\
+\x55\x99\x9d\x2e\x87\x00\x93\xc8\xbb\xa4\x5c\xb1\x7b\x80\x53\xa7\
+\xfb\x4e\xe1\x2c\xe0\xfc\x2d\xb0\x00\x03\x10\x93\xe4\xb3\x47\xad\
+\x56\x0b\x40\xca\xb5\x80\x17\x29\xe9\x7a\xec\x42\xb2\x04\xc9\xa7\
+\xe7\xf4\x9f\x94\x83\xa7\x61\x86\x11\xa0\x95\xd7\xae\xb9\x99\x06\
+\x94\x4f\xa3\x99\x4f\x07\x3f\x44\x20\xbb\x76\xed\x0a\x80\x73\x5f\
+\x14\xc0\x89\xa8\x91\x38\x4b\x15\x5a\x40\x7a\xcd\x10\xed\xa7\x04\
+\xd2\x3c\xe5\x6a\x1f\x41\xc0\xf5\x32\x00\xa5\x26\xa9\x5f\x5e\x5e\
+\x0e\xb4\xc8\x24\x8a\x00\xb2\x90\xdb\x11\x79\xd3\x63\x59\x53\xec\
+\xff\x46\xd9\x75\x6a\xa8\x05\xd8\x74\xfc\x1f\x6f\x81\x24\x24\xc0\
+\x71\xd0\xc4\xd5\xbb\x5e\xaf\xbb\x3a\x66\xb0\xdf\xcb\x46\x45\x21\
+\x65\xa1\x3c\x01\xef\x3e\xb2\xe2\xf5\x16\xe8\xef\x43\x59\x0c\xf4\
+\xb1\x40\x92\xc4\x3d\x04\x24\xd8\xfc\xf5\xa0\x26\xe3\xa1\x57\x42\
+\xf7\xf1\x31\x60\xd4\xc0\x44\x14\x04\xb1\xb4\x40\xfa\x6f\x1a\x17\
+\xec\xbf\x72\x65\xa6\x49\xb7\x6d\xdb\xd6\xb7\xbc\x28\xea\xd9\x85\
+\x64\x5c\xf0\xb3\x98\x72\x7f\x50\x48\xaa\x8c\x05\x0c\x73\x21\x2d\
+\x5c\xc8\xfb\x9f\x5b\x07\x72\x41\xcc\x24\x08\x88\x5c\x89\xf3\xd9\
+\x46\x6a\x97\x0b\x37\x0e\xea\x22\x0b\x70\x08\x28\x15\x4a\x3a\xa7\
+\xe9\xeb\x46\xce\x02\x94\xcf\x13\xef\x36\xec\x7f\xd6\x02\x49\x6f\
+\x0a\x95\xab\x6e\xfe\x5e\x3e\x88\xc1\x59\x30\xdf\xe7\x53\xad\x92\
+\xe8\x85\x15\x86\xb9\x65\xba\x90\x45\xa9\x03\xaa\x0c\x79\x66\x01\
+\x2c\xae\x2e\x5d\xba\x64\xeb\x1b\xfb\x2e\x6a\x9e\x81\x71\x00\xcb\
+\x14\x5a\x94\x85\x58\xfb\x45\x3d\xfd\x86\x56\x75\x4e\x1c\xde\x8d\
+\x59\xb4\x75\x91\x01\x04\x68\x12\x48\x77\x60\xac\x75\x69\x81\x0f\
+\x2e\x68\x58\xfd\xdb\x19\xaa\x50\x32\x92\x81\x52\x5c\xcd\xe4\x2d\
+\xe4\x80\x43\x56\x32\x72\x9a\x4c\x9c\xab\xf0\x75\xf6\x0c\x37\x8b\
+\xdd\x31\x6f\x81\x20\x23\x19\x35\x70\x29\x48\x2d\x50\x8a\x40\x27\
+\xd0\x0b\x10\x3f\xf0\xbb\xf7\x32\x32\xec\xa4\xd9\x9e\xa1\xb7\xfc\
+\xa6\x77\xac\x65\x6c\x62\x10\x99\x4a\x8b\x12\x5d\x8c\xfd\xfd\x01\
+\xbd\xd1\x6a\x30\x81\xf4\x63\x5a\x7a\x4f\xb8\x1e\x80\x00\x0b\x79\
+\xd0\xd9\x38\x2b\x04\xb3\xdd\x5c\xef\x2e\x4f\x6e\x98\x0a\x82\x36\
+\x2f\x1a\x2e\xc3\x02\x5a\xc9\x08\x08\x2c\x50\xb4\xb8\x65\x44\x32\
+\xd0\xe1\x18\xb2\xfd\x75\x21\xf0\x90\x90\x64\xe0\x5d\x87\xbf\x6f\
+\xd2\x2a\x61\xb8\x05\xb4\x20\x70\xd9\x16\xc8\x69\xdf\xa9\xb4\x17\
+\xfc\x60\xe0\xd9\xfe\xbb\xd7\x0a\x7e\xaf\x35\x94\x00\x5b\x40\x32\
+\x90\xe5\x35\x3f\x0b\xaa\x47\x10\x20\x20\x00\x1d\x80\xd7\x45\xc0\
+\xf3\xf9\x3e\x4f\x28\x7b\xd7\xf0\xce\xaa\x1f\x01\x3b\x81\x91\x25\
+\x81\xb0\x85\x0c\x60\x26\x93\x2f\xb9\x73\xbe\xdf\x0f\x7c\xaa\x4e\
+\xf0\x64\x7b\xad\x90\x73\x29\x10\x16\xe9\x6b\x01\x23\x2c\x10\x6c\
+\x8a\xb2\xeb\x87\x6f\x3e\x0d\xb3\xb5\x18\x22\xda\x0e\xba\x73\x21\
+\xbf\x98\x61\x1a\xec\x76\x3b\xe9\x3e\x18\xb7\x7d\x6d\xec\xf9\x9a\
+\xb6\x9d\xdd\x56\x6c\xaf\x69\x9c\xde\x8b\xed\xea\x7e\xb1\x33\x02\
+\xcb\x77\x3d\x3e\x24\xb0\xdd\xaa\x7f\x59\x31\xa0\xfa\x5b\x60\xb4\
+\xd4\x86\x17\x9e\x79\xd2\x2e\x38\x54\x85\x52\x4f\xc7\x81\xd4\x6f\
+\x6c\x6c\xd8\x7b\x24\x34\xa6\x46\x15\x27\x9d\x5a\x50\x3f\x3a\x3a\
+\xea\x85\xae\xab\xd5\x2a\x4c\x4f\x4f\xc3\xb7\x0e\xfd\x10\x56\x4f\
+\x9e\xc9\xb9\x5e\x3a\x9e\xba\xff\x8e\xc0\xbf\xcc\xe0\x1d\x99\xf1\
+\xb5\x50\xe6\xfd\xb9\x0a\x10\xad\xb4\xbe\xbe\x0e\x0b\x0b\x0b\x70\
+\xf6\x7c\x03\xc6\x26\x26\xa1\x14\x95\x6c\x01\xd6\x6e\xb5\xa1\xd5\
+\x6a\xe2\xf3\x35\x18\x2f\x1b\x98\x99\x99\xb1\xf5\x3e\x9d\xbe\x51\
+\xd9\x2c\xb7\x9d\x72\x27\x16\xc7\x5d\xa8\xdd\xbb\xdb\x9d\x3c\xe8\
+\x20\xf0\xef\xf8\xc2\x34\x9c\x5e\xba\xe8\x39\x68\x33\xd4\x02\x62\
+\x3f\x26\x57\x63\x77\x4d\x6b\x26\x69\x9c\xb4\x3c\x7f\x62\x8f\xaf\
+\x99\xb2\xe0\x4b\x35\xf7\xf4\xdc\x31\xab\xe5\x4a\xa5\x62\x35\x2d\
+\x85\x2c\xc2\x3d\x3d\x4f\x57\xbc\x30\xe8\xc3\x42\x54\x58\x60\x58\
+\x16\xa2\x83\xa3\xb0\x68\x12\xe9\xd3\x5d\x13\x78\xf2\x63\x55\x00\
+\x9c\x49\x93\xb6\x89\x00\x69\x3f\x0f\x9c\x84\xdc\x88\xae\xad\x51\
+\x4d\x92\x5b\x3f\x72\xae\x2c\x82\x7a\x78\x0c\x68\xd5\x9b\xff\x45\
+\x18\xd0\x64\xe4\xef\x74\x1e\xca\xef\x3e\xf2\xc0\x2d\xa1\xbb\xa1\
+\x3c\x78\xdf\x83\x16\x28\xb9\x0e\x1f\xe2\x92\xb6\xc9\xa5\xa8\xe7\
+\x31\xb5\x5f\x1c\x7e\x06\xfe\xb4\xb4\x1d\xfc\xfc\x02\xf8\xcc\xd4\
+\x38\xec\x99\x76\xc4\x68\xff\xd0\x89\xe1\xa7\xaf\x3c\x32\xfa\xd8\
+\x37\x7f\xec\xf7\x68\x0e\x9d\xa1\x23\x02\xd0\x65\xf4\xd5\x28\x81\
+\xbc\xad\x58\xd3\x31\xbe\x43\x2e\xd4\x6a\xb5\x02\x8d\xbf\xfe\xf8\
+\xdd\xc1\xfb\xaf\xc3\x35\x6d\xf4\x87\x83\x9f\x38\xa1\x36\x87\xd2\
+\xb0\x04\xd2\x32\x48\x07\x5b\xba\xcc\x18\xe9\xb6\x92\x08\xb0\x05\
+\x6c\x73\x7a\x38\x72\xe4\xc8\xb5\x85\x5d\xd0\x0e\x1e\x3c\x48\xdd\
+\x77\x51\x7e\x5f\x42\xc7\xb6\xb5\x10\x15\x90\xc1\xb1\x8f\x4f\x44\
+\x48\x20\x2e\xb6\x00\xb7\x03\x07\x0e\x78\x17\xc8\x1f\x5c\x5d\x43\
+\x02\x74\xdc\x5e\xd5\x98\xcf\x96\x2f\x6e\x19\x4c\x8b\xb8\x40\x45\
+\x7c\xa0\xca\xa5\x6c\x9a\xde\xd8\x85\x7c\x0c\x88\xda\x89\x9b\x3c\
+\x5d\x28\x3a\x04\xbb\x06\x4d\xa7\xff\x39\xfb\xe7\xef\x5f\xfc\x64\
+\xed\x4c\xfd\x42\x3b\xcd\xdb\x3d\x24\x94\x5d\x49\xe5\x1f\x24\x2c\
+\x78\x75\x45\x93\x5f\x45\x16\x47\x5f\x3a\x06\xef\xbc\xf8\xf4\xda\
+\xd2\xd2\xf1\x7a\xfd\x92\x5b\x7c\xdc\x61\x92\x23\x41\xe0\x29\x3d\
+\x66\x47\xde\x62\xc7\x7d\xc3\x09\x00\x6c\xc2\x87\xef\xbc\x0d\xc7\
+\xe6\x9f\x5b\x6b\x34\xde\xaf\x2f\xae\x42\x54\xa6\x23\x70\x74\xa9\
+\x12\xb9\x95\xb6\xf5\x0b\xe5\xf0\x89\x89\x09\xf8\xb6\xfa\x23\x7c\
+\xa7\xf4\x16\x3c\x71\x5f\xfb\x46\x63\xb7\x8d\x92\x32\x39\xeb\x3a\
+\x7c\xf2\xaf\x7f\xc2\xf1\x5f\x3d\xbb\xda\x7e\xe2\xb5\xce\x66\xfb\
+\xde\x5b\x6f\xab\xa1\x01\xd2\xfd\x72\x07\x7d\x9f\xc0\xef\xdb\xb7\
+\x0f\x1e\x7a\x68\xc2\x92\x99\x9a\x9a\xba\xd1\xd8\x3d\x01\x70\x24\
+\x36\xa0\xf1\xf6\x51\xd8\xfa\xf8\xa9\xcd\xd9\x47\x9f\x3a\x7b\x7e\
+\xf6\x2b\xd0\xe9\x62\x90\x77\x61\x6a\x67\x6b\xfa\xa5\xf9\x37\xec\
+\x1f\x70\x79\x6d\xf8\xd9\xe1\x1f\x50\x3d\x10\x7d\xc6\x79\xaf\x3a\
+\x81\x8c\xc4\xda\xe9\x05\x38\xfe\xea\x8b\x38\xfe\x32\xca\x2c\x4a\
+\x75\xe1\xb8\x75\xb5\xb2\x03\x6c\x29\xfc\xe5\xcd\x5f\x53\xf7\xfc\
+\xe7\x89\x00\x93\xd8\x44\x39\x85\xd2\x40\x19\x13\xa0\xe5\x32\x0e\
+\xee\xda\x13\xb8\x9e\xeb\xc0\x20\x02\x4c\x82\xfe\x9c\x7f\xe1\xd3\
+\x7c\x48\x82\xbd\x1e\xc0\xaf\x56\x33\x37\x50\xe6\x51\xee\x2a\x0d\
+\xc7\x38\xb0\xcd\x41\x5a\x93\xd0\xb2\xae\xaf\xec\x53\x9f\xaa\xd1\
+\x31\x1c\xfd\x8f\x1f\xcd\x2b\x5d\x8d\xaa\x28\xb7\xba\xfe\x7a\xb7\
+\x26\x4a\xe3\xff\x19\xf5\x4b\xa6\x3e\x14\x68\xc8\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x2b\x74\x45\x58\x74\x43\x72\x65\x61\x74\x69\x6f\x6e\
+\x20\x54\x69\x6d\x65\x00\x4d\x69\x20\x32\x31\x20\x4d\x61\x69\x20\
+\x32\x30\x30\x33\x20\x30\x30\x3a\x34\x37\x3a\x35\x36\x20\x2b\x30\
+\x31\x30\x30\xd7\x2c\xac\x73\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd4\x0a\x08\x0e\x31\x16\xf2\x68\x5b\x3e\x00\x00\x00\x09\x70\x48\
+\x59\x73\x00\x00\x0a\xf0\x00\x00\x0a\xf0\x01\x42\xac\x34\x98\x00\
+\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\
+\x00\x05\x10\x49\x44\x41\x54\x78\xda\xed\x59\x5d\x6c\x14\x55\x14\
+\x3e\xbb\xb5\x02\xaf\xc6\xe8\x8b\x8a\xd8\x7d\x37\x29\x85\xc6\x06\
+\x96\x84\xf8\x00\x0f\xd6\x28\x5a\x94\xd4\x07\x5d\x74\x13\x02\x0d\
+\x41\xb2\x31\x80\xc4\x07\x63\x48\x43\x22\x31\x11\x53\x10\x7c\xd0\
+\xb4\xd2\x6a\x49\xf9\x49\x8c\x7f\xb1\x84\x97\x15\x76\x13\x13\x89\
+\x52\xb7\x44\x0a\xa5\x74\xbb\xdd\xb5\xdd\xdf\xd9\xbf\xf1\x9c\x99\
+\xbb\xcb\xec\x64\x67\xe7\xce\xcc\xdd\xb6\x0f\x7c\xc9\xcd\xbd\xf3\
+\x73\xef\x39\xdf\xbd\xe7\x9e\x73\x66\x2e\xc0\x43\x3c\x44\xf3\xe0\
+\xe9\xf9\x5e\x86\xf5\x03\x32\x36\x9f\xc1\xb2\x7a\x25\xca\x77\x37\
+\xe8\xef\xd2\xb4\x5f\xc7\xf2\xa4\xee\x5e\xb3\xc1\x25\xdf\xcd\x39\
+\xd8\xd3\xb0\x0c\x2b\xc0\x23\xff\x11\x1b\xb3\xb1\x94\xab\x60\x2a\
+\xb3\xe6\x81\x62\x73\x3a\x44\x26\x63\xe0\x69\x7b\x7c\x19\x74\x36\
+\x96\x1f\x19\xde\xb1\x16\xab\x28\x96\x9c\x76\x05\x5c\xf4\xb2\xd1\
+\x20\x76\x70\xba\xfb\xb8\x52\xbf\x7b\xe1\xa0\x63\x12\x3a\xd0\x9e\
+\x18\xc1\x72\xa7\xd6\x84\x42\xfe\xb5\xec\x21\xd9\x9c\x0b\x57\xa4\
+\x4f\xe9\x1c\xf2\x5f\xc0\xeb\xfb\xc4\x98\x57\xe8\xb7\x47\xa1\x6b\
+\xe7\x81\x40\x07\xb5\x93\xd3\xfe\xf0\x81\x53\x70\x0b\x9b\xf3\x58\
+\x24\xde\x31\x0c\xe4\xd7\x58\x89\x96\x00\x3d\x88\x32\x66\xb4\x61\
+\xc8\xbc\xfa\xd8\x33\xea\xfc\x1d\x96\x29\x1e\xc1\xe3\x27\xe0\xac\
+\xd7\x17\xe8\x28\x45\x7f\x51\xae\x77\xf5\x7a\xda\x57\xb7\x46\x4a\
+\x7b\x3e\x87\x21\x9a\x50\x0b\x24\xea\xc9\x97\x19\x11\xd2\x55\xd6\
+\x6f\xe2\x9c\x46\x49\x57\x9d\xfb\x13\x66\x12\x7f\xff\x02\xc6\x37\
+\xf4\x06\xba\x48\xf9\xcc\x62\x0e\x8a\x85\x92\x72\xff\xd5\x9d\x9e\
+\x0d\xab\x5a\x23\x01\xdf\x09\xd8\x8d\x97\xb7\xad\xac\x84\x4e\x7e\
+\xcd\x0a\xf0\xba\x51\x2d\x64\xa3\xc2\x94\xdf\x4c\xca\x2f\xce\xa7\
+\x21\x93\x94\x20\x99\xc8\x42\x26\x95\x57\xea\xf6\xf6\xc7\x3a\xcf\
+\xec\x87\x2f\xf1\xdd\x36\x2c\x8f\x36\x1a\x8b\x57\x19\x3b\x04\x1a\
+\xcd\xfc\xe6\xff\x26\x2e\xc1\xec\x54\x02\xe2\xb3\x49\x48\x44\x53\
+\x90\x5a\xc8\xc2\x42\x4c\xad\x09\x8c\xc4\x19\x6c\x7a\xb0\xac\x72\
+\x2a\x97\x37\x0e\x98\xc1\xe5\x76\x83\x77\xe8\xa3\x7e\xae\x97\xd7\
+\xb4\x40\x27\x56\x5e\x2c\x71\x50\xed\x9b\x7b\xc6\x9b\x45\x00\x3a\
+\xfc\x8a\xe7\x7a\x05\xcb\x3a\xcd\xb8\xfa\x00\x54\x51\xb4\xc8\xde\
+\x69\x71\x2a\x57\x14\x01\x52\x8c\x9c\xf5\x18\x3c\xf0\x60\x66\xef\
+\xe7\x58\x1f\xdb\xb3\x6f\x9b\x40\x10\xed\xbd\x05\x4d\x86\xcd\x7a\
+\x8c\x29\x63\xe4\xc1\x8c\x08\x54\x71\x7d\x00\xe4\xb9\x79\xb8\xba\
+\xfd\x10\xf4\x80\x6a\x56\xdc\x1e\xca\xf2\x26\x0e\x9e\x84\x2b\x1b\
+\x7b\x03\xde\x09\xd5\xa1\x92\xc9\xd4\xcb\x12\x65\xe0\xf7\x30\x4a\
+\xdf\x6d\xfb\x02\x9b\x06\x0f\xc1\x79\x50\x3d\x14\xf7\xe6\xb6\x44\
+\x00\x95\x1f\xdf\xf8\x96\xea\x69\x18\x9e\x03\x81\x59\xea\x8e\xbd\
+\x6f\x77\x7e\xf3\x01\x9c\x05\xd5\x43\x71\x8d\xcb\x4d\xe0\x37\x8c\
+\xae\xa4\x7c\x25\x40\x31\x38\xde\x84\x5a\xc8\xc5\x24\xbc\xb9\x67\
+\x2b\x91\x20\x37\xdb\x26\x8c\xc0\xd0\x87\xd0\xb5\xc5\xa7\x46\x57\
+\x0a\x50\xd9\x54\xd5\x44\xc5\xa6\xd6\xc5\x14\x64\x12\x51\x78\xb1\
+\xfb\xf9\x4a\xc0\x73\x4e\xe0\xd4\x4b\xc7\xe1\x8d\x80\x9a\xd7\xd0\
+\xcc\xe7\x73\x45\x28\x48\x25\xa1\x7a\x13\x64\x29\x0a\xd2\xe2\x1c\
+\x23\x92\x86\x17\xbc\x4f\x75\xf6\xad\x3b\x62\x3a\x51\x96\xf6\x00\
+\xe5\x35\x52\xb6\x00\xe5\x72\x59\x38\x01\xc8\x27\xa0\x5c\xcc\x43\
+\x7a\x41\x35\x4f\x29\x95\x81\x6c\xb6\xfa\xd4\x3e\x81\xf7\x2e\x1e\
+\x84\x4f\xdf\xef\x0f\xc7\xa6\x17\x94\xd9\x2f\x95\x64\xa5\x16\x0d\
+\xb9\x94\xae\xb6\x67\xfe\x8d\xc3\xc5\x1f\xe2\xe1\xd3\xf7\x3f\x36\
+\xed\xc7\xb5\x02\x94\xcb\x8f\x9e\x8b\x5c\xa3\x76\xa9\x20\xde\x7c\
+\x2a\x28\xbb\xd7\x54\x95\x3f\x3a\x08\x37\xb5\xfc\x1c\x11\x40\xcc\
+\x63\x2e\x7f\xec\xf2\x68\x24\x58\x49\xca\x44\x23\x9d\x72\xc1\xcc\
+\x3f\xb7\x2a\xca\xff\x8d\xb7\xae\x8b\x24\x40\x6e\x27\x42\xb9\x7c\
+\x38\x1c\x0f\xf2\x0c\x6c\x15\x89\xdb\x37\x60\xec\x52\x2c\xc4\x94\
+\xa7\xd5\xfe\x91\xa7\x9f\x95\x4d\x4c\x24\x26\x91\x84\x4f\x43\x42\
+\x98\x3d\x8d\x0c\xdf\xbb\x76\xf8\x6b\xf8\x8b\x29\xff\x13\xc9\xe2\
+\xe9\x67\x35\x17\x22\x17\x41\x2b\xf1\x0e\xd6\x5b\x58\x7f\xee\xef\
+\x64\x23\x60\x4e\xf5\x2c\x56\xdd\xa0\x66\xa9\xe3\x4c\xf9\x7c\x33\
+\x08\x10\x24\x26\x20\x01\x6a\x24\x76\x9a\x51\x52\xdf\x59\x2c\x94\
+\x07\xd1\x8a\x56\x92\x39\xae\x20\x69\x37\x9d\x26\x01\x33\x0e\x94\
+\xd6\x83\x56\xf1\xae\x9d\x8e\xc2\x3e\x68\x74\xb0\x94\x4e\x3b\x81\
+\x30\x02\x94\xd3\x5b\x79\x1f\xed\xbe\xfa\x77\x6d\x25\x10\x70\xcd\
+\xc5\xe0\xea\xb6\xbe\xc0\x26\xed\x4d\xca\x6f\x28\x45\xa8\x44\x59\
+\xf2\xf5\xe4\x2e\x47\xce\xdd\x23\x4f\xf3\x32\xa8\x76\x3f\x0d\x2b\
+\xe1\x9b\x78\xfb\x61\xe8\x19\x4c\xf7\x9f\xa7\x9c\x9e\xd2\x62\xca\
+\x2c\x29\x39\xa3\xfc\x86\xa0\x44\x59\x0c\x54\xe4\xeb\xd1\x5d\x52\
+\x94\x25\x8f\xe3\xd8\x0d\x8b\xfa\xad\x42\x33\x18\xdf\xf5\x09\xf8\
+\x46\x3e\xfb\x2a\xd8\x8a\x8e\xa4\x90\xbc\x0b\x6e\x97\x04\x52\x26\
+\xab\x94\xa9\x3f\x23\x30\x3a\x16\x0b\x33\xe5\x43\x58\xae\x80\xea\
+\x71\x1c\xed\x07\x61\xff\x85\x80\x45\xeb\xde\x63\xe0\x1b\x3a\xf9\
+\x6b\x30\x9d\x6e\xa9\x66\x96\x9a\xfc\xa6\x12\x65\x29\x50\x59\xf9\
+\xc5\x28\x94\x80\xab\x41\x21\x7b\x99\x44\x12\xbb\x2f\x0f\xff\x11\
+\x8c\xc7\x72\xfa\xe4\x8c\x66\xfe\x67\x78\x10\xa8\x1a\x8d\xc5\xad\
+\x4c\x15\xa2\xcf\x07\xe8\x83\x84\x72\x7a\x9e\xb4\xd8\x08\x66\xe7\
+\x03\xb5\x27\x2f\xeb\x07\x9a\xf0\xa5\xd2\x04\x84\xfc\x74\xe0\xa0\
+\x9c\x0f\xe8\x8f\x8e\xe8\x3f\x8f\x90\xf3\x01\xcd\x98\x5a\x58\xda\
+\xb0\x0d\xce\x07\xee\x40\x9d\x03\x0e\x61\xe7\x03\x02\xb1\xf4\xe7\
+\x03\x4d\x82\xe1\xf9\x00\x6f\x20\x93\x0d\xda\xcd\x84\x76\x02\x65\
+\x9e\x97\xea\x3d\xa3\x13\xf2\xd7\xd8\xb5\x76\x09\x97\x8a\x80\xa9\
+\x7c\x33\x7f\x4b\x7b\xe1\x09\xd6\x76\x9c\x78\xd9\xc0\x72\xcb\x6f\
+\x3e\xfe\x07\x44\x59\x76\x36\x1e\xee\x54\x0f\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x0a\
+\x08\xab\x7a\x07\
+\x00\x72\
+\x00\x6f\x00\x74\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x03\x03\x5a\xe7\
+\x00\x66\
+\x00\x6c\x00\x69\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xc8\x58\x67\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x02\x38\x3d\xc7\
+\x00\x66\
+\x00\x69\x00\x74\x00\x74\x00\x6f\x00\x63\x00\x65\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x02\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x17\x30\
+\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x07\xc6\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xa3\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/packages/spreadsheet/widgets/richtext/__init__.py b/vistrails/packages/spreadsheet/widgets/richtext/__init__.py
new file mode 100644
index 0000000..564257c
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/richtext/__init__.py
@@ -0,0 +1,66 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# RichText plugin for VisTrails Spreadsheet
+################################################################################
+from richtext import RichTextCell, XSLCell
+
+################################################################################
+
+def widgetName():
+    """ widgetName() -> str
+    Return the name of this widget plugin
+    
+    """
+    return 'HTML Viewer'
+
+def registerWidget(reg, basicModules, basicWidgets):    
+    """ registerWidget(reg: module_registry,
+                       basicModules: python package,
+                       basicWidgets: python package) -> None
+    Register all widgets in this package to VisTrails module_registry
+    
+    """
+    reg.add_module(RichTextCell)
+    reg.add_input_port(RichTextCell, "Location", basicWidgets.CellLocation)
+    reg.add_input_port(RichTextCell, "File", basicModules.File)
+    reg.add_input_port(RichTextCell, "Format", basicModules.String,
+                       entry_types=['enum'], values=["['html', 'rtf']"],
+                       optional=True, defaults="['html']")
+
+    reg.add_module(XSLCell)
+    reg.add_input_port(XSLCell, "Location", basicWidgets.CellLocation)
+    reg.add_input_port(XSLCell, "XML", basicModules.File)
+    reg.add_input_port(XSLCell, "XSL", basicModules.File)
diff --git a/vistrails/packages/spreadsheet/widgets/richtext/richtext.py b/vistrails/packages/spreadsheet/widgets/richtext/richtext.py
new file mode 100644
index 0000000..11849ce
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/richtext/richtext.py
@@ -0,0 +1,143 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# Richtext widgets implementation
+################################################################################
+import os
+from PyQt4 import QtGui
+from PyQt4.QtCore import QUrl
+from PyQt4.QtXmlPatterns import QXmlQuery
+
+from vistrails.core.bundles.pyimport import py_import
+from vistrails.core.modules.vistrails_module import ModuleError
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget
+################################################################################
+
+class RichTextCell(SpreadsheetCell):
+    """
+    RichTextCell is a custom Module to view HTML files
+
+    """
+    def compute(self):
+        """ compute() -> None
+        Dispatch the HTML contents to the spreadsheet
+        """
+        filename = self.getInputFromPort("File").name
+
+        text_format = self.getInputFromPort("Format")
+        with open(filename, 'rb') as fp:
+            if text_format == 'html':
+                html = fp.read()
+            elif text_format == 'rtf':
+                try:
+                    py_import('pyth', {'pip': 'pyth'})
+                except ImportError:
+                    raise ModuleError(self, "'rtf' format requires the pyth "
+                                      "Python library")
+                else:
+                    from pyth.plugins.rtf15.reader import Rtf15Reader
+                    from pyth.plugins.xhtml.writer import XHTMLWriter
+                    doc = Rtf15Reader.read(fp)
+                    html = XHTMLWriter.write(doc).read().decode('utf-8')
+            else:
+                raise ModuleError(self, "'%s' format is unknown" % text_format)
+
+        self.cellWidget = self.displayAndWait(RichTextCellWidget, (html,))
+
+
+class XSLCell(SpreadsheetCell):
+    """
+    XSLCell is a custom Module to render an XML file via an XSL stylesheet
+
+    """
+    def compute(self):
+        """ compute() -> None
+        Render the XML tree and display it on the spreadsheet
+        """
+        xml = self.getInputFromPort('XML').name
+        xsl = self.getInputFromPort('XSL').name
+
+        query = QXmlQuery(QXmlQuery.XSLT20)
+        query.setFocus(QUrl.fromLocalFile(os.path.join(os.getcwd(), xml)))
+        query.setQuery(QUrl.fromLocalFile(os.path.join(os.getcwd(), xsl)))
+        html = query.evaluateToString()
+
+        self.cellWidget = self.displayAndWait(RichTextCellWidget, (html,))
+
+
+class RichTextCellWidget(QCellWidget):
+    """
+    RichTextCellWidget has a QTextBrowser to display HTML files
+
+    """
+    def __init__(self, parent=None):
+        """ RichTextCellWidget(parent: QWidget) -> RichTextCellWidget
+        Create a rich text cell without a toolbar
+
+        """
+        QCellWidget.__init__(self, parent)
+        self.setLayout(QtGui.QVBoxLayout(self))
+        self.browser = QtGui.QTextBrowser()
+        self.layout().addWidget(self.browser)
+        self.browser.setMouseTracking(True)
+        self.browser.controlBarType = None
+        self.html = None
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Updates the contents with a new HTML document
+
+        """
+        (self.html,) = inputPorts
+        self.browser.setHtml(self.html)
+
+    def dumpToFile(self, filename):
+        """ dumpToFile(filename) -> None
+        It will generate a screenshot of the cell contents and dump to filename.
+        It will also create a copy of the original text file used with
+        filename's basename and the original extension.
+        """
+        if self.html is not None:
+            basename, ext = os.path.splitext(filename)
+            with open(basename + '.html', 'wb') as fp:
+                fp.write(self.html.encode('utf-8'))
+        QCellWidget.dumpToFile(self,filename)
+
+    def saveToPDF(self, filename):
+        printer = QtGui.QPrinter()
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        self.browser.print_(printer)
diff --git a/vistrails/packages/spreadsheet/widgets/svg/__init__.py b/vistrails/packages/spreadsheet/widgets/svg/__init__.py
new file mode 100644
index 0000000..203aebf
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/svg/__init__.py
@@ -0,0 +1,61 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# SVG plugin for VisTrails Spreadsheet
+################################################################################
+from svg import SVGCell, SVGSplitter
+
+################################################################################
+
+def widgetName():
+    """ widgetName() -> str
+    Return the name of this widget plugin
+    
+    """
+    return 'SVG Widgets'
+
+def registerWidget(reg, basicModules, basicWidgets):    
+    """ registerWidget(reg: module_registry,
+                       basicModules: python package,
+                       basicWidgets: python package) -> None
+    Register all widgets in this package to VisTrails module_registry
+    
+    """
+    reg.add_module(SVGCell)
+    reg.add_input_port(SVGCell, "Location", basicWidgets.CellLocation)
+    reg.add_input_port(SVGCell, "File", basicModules.File)
+
+    reg.add_module(SVGSplitter)
+    reg.add_input_port(SVGSplitter, "File", basicModules.File)
diff --git a/vistrails/packages/spreadsheet/widgets/svg/svg.py b/vistrails/packages/spreadsheet/widgets/svg/svg.py
new file mode 100644
index 0000000..f431983
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/svg/svg.py
@@ -0,0 +1,194 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# SVG widgets implementation
+################################################################################
+from vistrails.core.modules.basic_modules import File
+from vistrails.core.modules.vistrails_module import Module
+from PyQt4 import QtCore, QtGui, QtSvg
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_base import StandardSingleCellSheetReference
+from vistrails.packages.spreadsheet.spreadsheet_controller import spreadsheetController
+from vistrails.packages.spreadsheet.spreadsheet_event import (DisplayCellEvent,
+                                                    BatchDisplayCellEvent)
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import shutil
+################################################################################
+
+class SVGCell(SpreadsheetCell):
+    """
+    SVGCell is a VisTrails Module that can display SVG files
+
+    """
+    def compute(self):
+        """ compute() -> None
+        Dispatch SVG file into the spreadshet for display
+        """
+        if self.hasInputFromPort("File"):
+            window = spreadsheetController.findSpreadsheetWindow()
+            file_to_display = self.getInputFromPort("File")
+            fileValue = window.file_pool.make_local_copy(file_to_display.name)
+        else:
+            fileValue = None
+        self.display(SVGCellWidget, (fileValue,))
+
+### SVG Cell  widget type
+class SVGCellWidget(QCellWidget):
+    """
+    SVGCellWidget derives from QSvgWidget to dispay SVG contents and
+    received SVG file from the SVGCell
+    
+    """
+    def __init__(self, parent=None):
+        """ SVGCellWidget(parent: QWidget) -> SVGCellWidget
+        Create a SVGCellWidget without any toolbar
+        """
+        QCellWidget.__init__(self, parent)        
+        self.setLayout(QtGui.QVBoxLayout(self))
+
+        self.svgWidget = QtSvg.QSvgWidget()
+        self.layout().addWidget(self.svgWidget)
+        
+        self.controlBarType = None
+        self.fileSrc = None
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Updates the contents of the SVG widget with a new file name
+        
+        """
+        (fileValue,) = inputPorts
+        self.svgWidget.load(fileValue.name)
+        self.fileSrc = fileValue.name
+        
+    def dumpToFile(self, filename):
+        if self.fileSrc is not None:
+            shutil.copyfile(self.fileSrc, filename)
+
+    def saveToPDF(self, filename):
+        printer = QtGui.QPrinter()
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        b_rect = self.svgWidget.contentsRect()
+        printer.setPaperSize(QtCore.QSizeF(b_rect.width(), b_rect.height()),
+                             QtGui.QPrinter.Point)
+        painter = QtGui.QPainter(printer)
+        self.svgWidget.render(painter, QtCore.QRectF(), b_rect)
+        painter.end()
+
+# A custom widget to displays SVG slide show
+class SVGSplitter(Module):
+    """
+    SVGSplitter is a special Module that can dispatch multiple SVG
+    files to the spreadsheet for displaying a slideshow
+    
+    """
+    def compute(self):
+        """ compute() -> None
+        Use BatchDisplayCellEvent to display a serie of SVG files
+        
+        """
+        if self.hasInputFromPort("File"):
+            fileValue = self.getInputFromPort("File")
+        else:
+            fileValue = None
+        if fileValue:
+            batchDisplayEvent = BatchDisplayCellEvent()
+            # FIXME: Will this work? there should be no
+            # self.currentVersion in the module (there is a
+            # self.version)
+            batchDisplayEvent.vistrail = (self.vistrailName,
+                                          self.currentVersion)
+            f = open(fileValue.name, 'r')            
+            for line in f.read().split('\n'):
+                comps = line.split('|')
+                if len(comps)==2:
+                    e = DisplayCellEvent()        
+                    e.sheetReference = StandardSingleCellSheetReference()
+                    e.sheetReference.sheetName = comps[1]                    
+                    e.cellType = SVGCellWidget
+                    F = File()
+                    from os.path import abspath, basename, dirname
+                    F.name = (dirname(abspath(fileValue.name))+
+                              '/'+basename(comps[0]))
+                    e.inputPorts = (F,)
+                    batchDisplayEvent.displayEvents.append(e)
+            f.close()
+            spreadsheetController.postEventToSpreadsheet(batchDisplayEvent)
+                    
+class SVGSaveAction(QtGui.QAction):
+    """
+    ImageViewerSaveAction is the action to save the image to file
+    
+    """
+    def __init__(self, parent=None):
+        """ ImageViewerSaveAction(parent: QWidget) -> ImageViewerSaveAction
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/save.png"),
+                               "&Save svg as...",
+                               parent)
+        self.setStatusTip("Save svg to file")
+        
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        
+        fn = QtGui.QFileDialog.getSaveFileName(None, "Save svg as...",
+                                               "screenshot.png",
+                                               "SVG (*.svg);;PDF files (*.pdf)")
+        if fn:
+            if fn.lower().endswith("svg"):
+                cellWidget.dumpToFile(fn)
+            elif fn.lower().endswith("pdf"):
+                cellWidget.saveToPDF(fn)
+        
+class SVGToolBar(QCellToolBar):
+    """
+    ImageViewerToolBar derives from CellToolBar to give the ImageViewerCellWidget
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(SVGSaveAction(self))
diff --git a/vistrails/packages/spreadsheet/widgets/webview/__init__.py b/vistrails/packages/spreadsheet/widgets/webview/__init__.py
new file mode 100644
index 0000000..58d4880
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/webview/__init__.py
@@ -0,0 +1,59 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# WebView plugin for VisTrails Spreadsheet
+################################################################################
+from webview import WebViewCell
+
+################################################################################
+
+def widgetName():
+    """ widgetName() -> str
+    Return the name of this widget plugin
+    
+    """
+    return 'WebKit Viewer'
+
+def registerWidget(reg, basicModules, basicWidgets):    
+    """ registerWidget(reg: module_registry,
+                       basicModules: python package,
+                       basicWidgets: python package) -> None
+    Register all widgets in this package to VisTrails module_registry
+    
+    """
+    reg.add_module(WebViewCell)
+    reg.add_input_port(WebViewCell, "Location", basicWidgets.CellLocation)
+    reg.add_input_port(WebViewCell, "url", basicModules.String)
+    reg.add_input_port(WebViewCell, "file", basicModules.File)
diff --git a/vistrails/packages/spreadsheet/widgets/webview/webview.py b/vistrails/packages/spreadsheet/widgets/webview/webview.py
new file mode 100644
index 0000000..58418ff
--- /dev/null
+++ b/vistrails/packages/spreadsheet/widgets/webview/webview.py
@@ -0,0 +1,110 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+############################################################################
+# web browser view implementation
+############################################################################
+from vistrails.core.modules.vistrails_module import Module
+from PyQt4 import QtCore, QtGui, QtWebKit
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget
+import shutil
+############################################################################
+
+class WebViewCell(SpreadsheetCell):
+    """
+    WebViewCell is a custom Module to view URLs using WebKit
+    
+    """
+    def compute(self):
+        """ compute() -> None
+        Dispatch the URL to the spreadsheet
+        """
+        if self.hasInputFromPort("url"):
+            urlValue = self.getInputFromPort("url")
+            fileValue = None
+        elif self.hasInputFromPort("file"):
+            fileValue = self.getInputFromPort("file")
+            urlValue = None
+        else:
+            fileValue = None
+            urlValue = None
+        self.display(WebViewCellWidget, (urlValue, fileValue))
+
+class WebViewCellWidget(QCellWidget):
+    """
+    WebViewCellWidget has a QTextBrowser to display HTML files
+    
+    """
+    def __init__(self, parent=None):
+        """ WebViewCellWidget(parent: QWidget) -> WebViewCellWidget
+        Create a rich text cell without a toolbar
+        
+        """
+        QCellWidget.__init__(self, parent)
+        self.setLayout(QtGui.QVBoxLayout(self))
+        self.browser = QtWebKit.QWebView()
+        self.layout().addWidget(self.browser)
+        self.browser.setMouseTracking(True)
+        self.urlSrc = None
+        # self.browser.controlBarType = None
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple) -> None
+        Updates the contents with a new changed in filename
+        
+        """
+        self.urlSrc = None
+        (urlValue, fileValue) = inputPorts
+        if urlValue:
+            url = QtCore.QUrl(urlValue)
+            self.browser.load(url)
+            self.urlSrc = url
+        elif fileValue:
+            url = QtCore.QUrl.fromLocalFile(fileValue.name)
+            self.browser.load(url)
+            self.urlSrc = url
+        else:
+            self.browser.setHtml("No HTML file is specified!")
+
+    def dumpToFile(self, filename):
+        if self.urlSrc is not None:
+            shutil.copyfile(str(self.urlSrc.toLocalFile()), filename)
+            
+    def saveToPDF(self, filename):
+        printer = QtGui.QPrinter()
+        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
+        printer.setOutputFileName(filename)
+        self.browser.print_(printer)
\ No newline at end of file
diff --git a/vistrails/packages/sql/__init__.py b/vistrails/packages/sql/__init__.py
new file mode 100644
index 0000000..ae81603
--- /dev/null
+++ b/vistrails/packages/sql/__init__.py
@@ -0,0 +1,47 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""
+SQL Scripting package. It supports MySQL and PostgreSQL.
+
+Preliminary work at adding DBConnection and SQLSource modules.
+Interfaces may change so don't write any critical code using this
+package!
+
+"""
+
+identifier = 'org.vistrails.vistrails.sql'
+name = 'SQL'
+version = '0.0.4'
+old_identifiers = ['edu.utah.sci.vistrails.sql']
diff --git a/vistrails/packages/sql/init.py b/vistrails/packages/sql/init.py
new file mode 100644
index 0000000..e6420bc
--- /dev/null
+++ b/vistrails/packages/sql/init.py
@@ -0,0 +1,225 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+from vistrails.core.bundles import py_import
+from PyQt4 import QtCore, QtGui
+import urllib
+
+from vistrails.core import debug
+from vistrails.core.modules.vistrails_module import Module, ModuleError, NotCacheable
+from vistrails.gui.modules.source_configure import SourceConfigurationWidget
+from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler
+from vistrails.core.utils import PortAlreadyExists
+from vistrails.gui.theme import CurrentTheme
+
+MySQLdb = py_import('MySQLdb', {
+        'pip': 'mysql-python',
+        'linux-debian': 'python-mysqldb',
+        'linux-ubuntu': 'python-mysqldb',
+        'linux-fedora': 'MySQL-python'})
+
+psycopg2 = py_import('psycopg2', {
+        'pip': 'psycopg2',
+        'linux-debian':'python-psycopg2',
+        'linux-ubuntu':'python-psycopg2',
+        'linux-fedora':'python-psycopg2'})
+
+
+class QPasswordEntry(QtGui.QDialog):
+    def __init__(self, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        self.setModal(True)
+        self.setWindowTitle("Enter Password:")
+        self.setLayout(QtGui.QVBoxLayout())
+        hbox = QtGui.QHBoxLayout()
+        hbox.addWidget(QtGui.QLabel("Password:"))
+        self.line_edit = QtGui.QLineEdit()
+        self.line_edit.setEchoMode(QtGui.QLineEdit.Password)
+        hbox.addWidget(self.line_edit)
+        self.layout().addLayout(hbox)
+
+        bbox = QtGui.QHBoxLayout()
+        cancel = QtGui.QPushButton("Cancel")
+        ok = QtGui.QPushButton("OK")
+        ok.setDefault(True)
+        bbox.addWidget(cancel, 1, QtCore.Qt.AlignRight)
+        bbox.addWidget(ok, 0, QtCore.Qt.AlignRight)
+        self.layout().addLayout(bbox)
+        self.connect(ok, QtCore.SIGNAL("clicked(bool)"), self.accept)
+        self.connect(cancel, QtCore.SIGNAL("clicked(bool)"), self.reject)
+
+    def get_password(self):
+        return str(self.line_edit.text())
+
+class DBConnection(Module):
+    def __init__(self):
+         Module.__init__(self)
+         self.conn = None
+         self.protocol = 'mysql'
+    
+    def get_db_lib(self):
+        if self.protocol == 'mysql':
+            return MySQLdb
+        elif self.protocol == 'postgresql':
+            return psycopg2
+        else:
+            raise ModuleError(self, "Currently no support for '%s'" % protocol)
+        
+    def ping(self):
+        """ping() -> boolean 
+        It will ping the database to check if the connection is alive.
+        It returns True if it is, False otherwise. 
+        This can be used for preventing the "MySQL Server has gone away" error. 
+        """
+        result = False
+        if self.conn:
+            try:
+                self.conn.ping()
+                result = True
+            except self.get_db_lib().OperationalError, e:
+                result = False
+            except AttributeError, e:
+                #psycopg2 connections don't have a ping method
+                try:
+                    if self.conn.status == 1:
+                        result = True
+                except Exception, e:
+                    result = False
+        return result
+    
+    def open(self):        
+        retry = True
+        while retry:
+            config = {'host': self.host,
+                      'port': self.port,
+                      'user': self.user}
+            
+            # unfortunately keywords are not standard across libraries
+            if self.protocol == 'mysql':    
+                config['db'] = self.db_name
+                if self.password is not None:
+                    config['passwd'] = self.password
+            elif self.protocol == 'postgresql':
+                config['database'] = self.db_name
+                if self.password is not None:
+                    config['password'] = self.password
+            try:
+                self.conn = self.get_db_lib().connect(**config)
+                break
+            except self.get_db_lib().Error, e:
+                debug.warning(str(e))
+                if (e[0] == 1045 or self.get_db_lib().OperationalError 
+                    and self.password is None):
+                    passwd_dlg = QPasswordEntry()
+                    if passwd_dlg.exec_():
+                        self.password = passwd_dlg.get_password()
+                    else:
+                        retry = False
+                else:
+                    raise ModuleError(self, str(e))
+             
+    def compute(self):
+        self.checkInputPort('db_name')
+        self.host = self.forceGetInputFromPort('host', 'localhost')
+        self.port = self.forceGetInputFromPort('port', 3306)
+        self.user = self.forceGetInputFromPort('user', None)
+        self.db_name = self.getInputFromPort('db_name')
+        self.protocol = self.forceGetInputFromPort('protocol', 'mysql')
+        if self.hasInputFromPort('password'):
+            self.password = self.getInputFromPort('password')
+        else:
+            self.password = None
+
+        self.open()
+
+    # nice to have enumeration constant type
+    _input_ports = [('host', '(basic:String)'),
+                    ('port', '(basic:Integer)'),
+                    ('user', '(basic:String)'),
+                    ('db_name', '(basic:String)'),
+                    ('protocol', '(basic:String)')]
+    _output_ports = [('self', '(DBConnection)')]
+
+class SQLSource(Module):
+    def __init__(self):
+        Module.__init__(self)
+        self.is_cacheable = self.cachedOff
+        
+    def compute(self):
+        cached = False
+        if self.hasInputFromPort('cacheResults'):
+            cached = self.getInputFromPort('cacheResults')
+        self.checkInputPort('connection')
+        connection = self.getInputFromPort('connection')
+        inputs = [self.getInputFromPort(k) for k in self.inputPorts
+                  if k != 'source' and k != 'connection' and k!= 'cacheResults']
+        #print 'inputs:', inputs
+        s = urllib.unquote(str(self.forceGetInputFromPort('source', '')))
+        if not connection.ping():
+            connection.open()
+        cur = connection.conn.cursor()
+        cur.execute(s, inputs)
+    
+        if cached:
+            self.is_cacheable = self.cachedOn
+        else:
+            self.is_cacheable = self.cachedOff
+            
+        self.setResult('resultSet', cur.fetchall())
+
+    def cachedOn(self):
+        return True
+    
+    def cachedOff(self):
+        return False
+    
+    _input_ports = [('connection', '(DBConnection)'),
+                    ('cacheResults', '(basic:Boolean)'),    
+                    ('source', '(basic:String)')]
+    _output_ports = \
+        [('resultSet', '(basic:List)')]
+
+class SQLSourceConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        SourceConfigurationWidget.__init__(self, module, controller, None,
+                                           True, False, parent)
+        
+_modules = [DBConnection,
+            (SQLSource, {'configureWidgetType': SQLSourceConfigurationWidget})]
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    module_remap = {'SQLSource': [(None, '0.0.3', None, {})]}
+
+    return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline,
+                                               module_remap)
diff --git a/vistrails/packages/tabledata/__init__.py b/vistrails/packages/tabledata/__init__.py
new file mode 100644
index 0000000..6b7d29f
--- /dev/null
+++ b/vistrails/packages/tabledata/__init__.py
@@ -0,0 +1,29 @@
+"""Table data package for VisTrails.
+
+This package contains data extraction and manipulation facilities. It wraps
+numpy and csv and allows the use of several file types from VisTrails, with
+extraction and conversion routines.
+
+"""
+
+from vistrails.core.packagemanager import get_package_manager
+
+from identifiers import *
+
+
+def package_dependencies():
+    pm = get_package_manager()
+    if pm.has_package('org.vistrails.vistrails.spreadsheet'):
+        return ['org.vistrails.vistrails.spreadsheet']
+    else:
+        return []
+
+
+def package_requirements():
+    from vistrails.core.requirements import require_python_module
+    require_python_module('numpy', {
+            'pip': 'numpy',
+            'linux-debian': 'python-numpy',
+            'linux-ubuntu': 'python-numpy',
+            'linux-fedora': 'numpy'})
+    require_python_module('csv')
diff --git a/vistrails/packages/tabledata/common.py b/vistrails/packages/tabledata/common.py
new file mode 100644
index 0000000..0f5be29
--- /dev/null
+++ b/vistrails/packages/tabledata/common.py
@@ -0,0 +1,64 @@
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+
+
+class Table(Module):
+    columns = None
+    rows = None
+
+    names = None
+
+    def get_column(self, i):
+        raise NotImplementedError
+
+
+class ExtractColumn(Module):
+    _input_ports = [
+            ('table', Table),
+            ('column_name', '(org.vistrails.vistrails.basic:String)',
+             {'optional': True}),
+            ('column_index', '(org.vistrails.vistrails.basic:Integer)',
+             {'optional': True}),
+            ('numeric', '(org.vistrails.vistrails.basic:Boolean)',
+             {'optional': True, 'defaults': "['False']"})]
+    _output_ports = [
+            ('value', '(org.vistrails.vistrails.basic:List)')]
+
+    def compute(self):
+        table = self.getInputFromPort('table')
+        if self.hasInputFromPort('column_index'):
+            column_index = self.getInputFromPort('column_index')
+        if self.hasInputFromPort('column_name'):
+            name = self.getInputFromPort('column_name')
+            if isinstance(name, unicode):
+                name = name.encode('utf-8')
+            if table.names is None:
+                raise ModuleError("Unable to get column by names: table "
+                                  "doesn't have column names")
+            try:
+                index = table.names.index(name)
+            except ValueError:
+                try:
+                    name = name.strip()
+                    index = table.column_names.index(name)
+                except:
+                    raise ModuleError(self, "Column name was not found")
+            if self.hasInputFromPort('column_index'):
+                if column_index != index:
+                    raise ModuleError(self,
+                                      "Both column_name and column_index were "
+                                      "specified, and they don't agree")
+        elif self.hasInputFromPort('column_index'):
+            index = column_index
+        else:
+            raise ModuleError(self,
+                              "You must set one of column_name or "
+                              "column_index")
+
+        result = table.get_column(
+                index,
+                numeric=self.getInputFromPort('numeric', allowDefault=True))
+
+        self.setResult('value', result)
+
+
+_modules = [(Table, {'abstract': True}), ExtractColumn]
diff --git a/vistrails/packages/tabledata/convert/__init__.py b/vistrails/packages/tabledata/convert/__init__.py
new file mode 100644
index 0000000..d369879
--- /dev/null
+++ b/vistrails/packages/tabledata/convert/__init__.py
@@ -0,0 +1,6 @@
+from vistrails.core.modules.utils import make_modules_dict
+
+from convert_dates import _modules as dates_modules
+
+
+_modules = make_modules_dict(dates_modules, namespace='convert')
diff --git a/vistrails/packages/tabledata/convert/convert_dates.py b/vistrails/packages/tabledata/convert/convert_dates.py
new file mode 100644
index 0000000..6e4e6af
--- /dev/null
+++ b/vistrails/packages/tabledata/convert/convert_dates.py
@@ -0,0 +1,580 @@
+import datetime
+from distutils.version import LooseVersion
+import re
+import time
+import warnings
+
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+from vistrails.core.bundles import py_import
+
+
+class UTC(datetime.tzinfo):
+    def utcoffset(self, dt):
+        return datetime.timedelta(0)
+
+    def tzname(self, dt):
+        return "UTC"
+
+    def dst(self, dt):
+        return datetime.timedelta(0)
+
+utc = UTC()
+
+
+class FixedOffset(datetime.tzinfo):
+    def __init__(self, offset, name):
+        self.offset = offset
+        self.name = name
+
+    def utcoffset(self, dt):
+        return self.offset
+
+    def tzname(self, dt):
+        return self.name
+
+    def dst(self, dt):
+        return datetime.timedelta(0)
+
+
+class LocalTimezone(datetime.tzinfo):
+    STDOFFSET = datetime.timedelta(seconds=time.timezone)
+    if time.daylight:
+        DSTOFFSET = datetime.timedelta(seconds=-time.altzone)
+    else:
+        DSTOFFSET = STDOFFSET
+
+    DSTDIFF = DSTOFFSET - STDOFFSET
+
+    def utcoffset(self, dt):
+        if self._isdst(dt):
+            return self.DSTOFFSET
+        else:
+            return self.STDOFFSET
+
+    def dst(self, dt):
+        if self._isdst(dt):
+            return self.DSTDIFF
+        else:
+            return datetime.timedelta(0)
+
+    def tzname(self, dt):
+        return time.tzname[self._isdst(dt)]
+
+    def _isdst(self, dt):
+        tt = (dt.year, dt.month, dt.day,
+              dt.hour, dt.minute, dt.second,
+              dt.weekday(), 0, 0)
+        timestamp = time.mktime(tt)
+        tt = time.localtime(timestamp)
+        return tt.tm_isdst > 0
+
+
+_decimal_fmt = re.compile(
+        r'^'
+        '([-+]?)'           # + means we are advancing compared to UTC
+        '([0-9]?[0-9])'     # hours
+        '([0-9][0-9])?$')   # minutes
+
+def make_timezone(s):
+        if s == 'local':
+            return LocalTimezone()
+
+        match = _decimal_fmt.match(s)
+        if match is not None:
+            sign, hours, minutes = match.groups('')
+            sign = -1 if sign == '-' else 1
+            hours = int(hours)
+            minutes = int(minutes) if minutes else 0
+            offset = datetime.timedelta(
+                    minutes=sign * (hours*60 + minutes))
+            name = '%s%02d%02d' % (
+                    '-' if sign == -1 else '+',
+                    hours,
+                    minutes)
+            return FixedOffset(offset, name)
+
+        try:
+            pytz = py_import('pytz', {
+                    'pip': 'pytz',
+                    'linux-debian': 'python-tz',
+                    'linux-ubuntu': 'python-tz',
+                    'linux-fedora': 'pytz'})
+        except ImportError:
+            raise ValueError("can't understand timezone %r (maybe you should "
+                             "install pytz?)" % s)
+        else:
+            ver = LooseVersion(pytz.__version__)
+            if ver < LooseVersion('2012'):
+                warnings.warn(
+                        "You are using an old version of pytz (%s). You might "
+                        "run into some issues with daylight saving handling." %
+                        pytz.__version__,
+                        category=UserWarning)
+            try:
+                return pytz.timezone(s)
+            except KeyError:
+                raise ValueError("can't understand timezone %r (defaulted to "
+                                 "pytz, which gave no answer)" % s)
+
+
+class TimestampsToDates(Module):
+    """
+    Converts a List or numpy array of timestamps into datetime objects.
+
+    A UNIX timestamp represents the number of seconds since Jan 1 1970 0:00,
+    UTC. It represents a specific point in time that is not dependent on a
+    timezone.
+    The returned datetime objects are in the UTC timezone.
+    """
+    _input_ports = [
+            ('timestamps', '(org.vistrails.vistrails.basic:List)')]
+    _output_ports = [
+            ('dates', '(org.vistrails.vistrails.basic:List)')]
+
+    @staticmethod
+    def convert(timestamps):
+        return [datetime.datetime.fromtimestamp(t, utc) for t in timestamps]
+
+    def compute(self):
+        timestamps = self.getInputFromPort('timestamps')
+
+        result = self.convert(timestamps)
+        self.setResult('dates', result)
+
+
+class StringsToDates(Module):
+    """
+    Converts a List of dates (as strings) into datetime objects.
+
+    If no format is given, the dateutil.parser module will be used to guess
+    what each string refers to; else, it is passed to strptime() to read each
+    date. For example: '%Y-%m-%d %H:%M:%S'.
+    The 'timezone' parameter indicates which timezone these dates are expressed
+    in. It can be either:
+      * 'local', in which case each date is interpreted as being in whatever
+        timezone the system is set to use;
+      * an offset in hours/minutes from UTC, for instance '-0400' for DST
+        (eastern America time, when daylight saving is in effect). Note that in
+        this case, the same offset is used for every date, without regard for
+        daylight saving (if a date falls in winter, '-0500' will not be used
+        instead).
+      * if pytz is available, anything else will be passed to pytz.timezone(),
+        so you would be able to use strings such as 'US/Eastern' or
+        'Europe/Amsterdam'.
+    """
+    _input_ports = [
+            ('strings', '(org.vistrails.vistrails.basic:List)'),
+            ('format', '(org.vistrails.vistrails.basic:String)',
+             {'optional': True, 'defaults': "['']"}),
+            ('timezone', '(org.vistrails.vistrails.basic:String)',
+             {'optional': True, 'defaults': "['']"})]
+    _output_ports = [
+            ('dates', '(org.vistrails.vistrails.basic:List)')]
+
+    @staticmethod
+    def convert(strings, fmt, tz):
+        if tz:
+            tz = make_timezone(tz) # Might raise ValueError
+        else:
+            tz = None
+
+        if not fmt:
+            try:
+                py_import('dateutil', {
+                    'pip': 'python-dateutil',
+                    'linux-debian': 'python-dateutil',
+                    'linux-ubuntu': 'python-dateutil',
+                    'linux-fedora': 'python-dateutil'})
+            except ImportError:
+                raise ValueError("can't read dates without a format without "
+                                 "the dateutil package")
+            from dateutil import parser
+            result = [parser.parse(s, ignoretz=tz is not None)
+                      for s in strings]
+        else:
+            result = [datetime.datetime.strptime(s, fmt) for s in strings]
+
+        if tz:
+            # Compute the time without daylight saving
+            result = [dt.replace(tzinfo=tz) for dt in result]
+
+            # Check if it is in fact during daylight saving
+            if hasattr(tz, 'normalize'):
+                for i in xrange(len(result)):
+                    dt = result[i]
+                    dst = tz.dst(dt.replace(tzinfo=None))
+                    if dst:
+                        result[i] = tz.normalize(dt) - dst
+                        # This is close enough but the way this work is by
+                        # essence ambiguous
+                        # If the given datetime falls right during the time
+                        # change period (one hour, two times a year):
+                        # For standard -> dst (spring): the time will be in
+                        #   dst, although it doesn't actually exist (we stepped
+                        #   over it by changing the clock)
+                        # For dst -> standard (fall): the time will be in dst,
+                        #   although it could also have been standard (there is
+                        #   noway to know which one was meant)
+        else:
+            result = [dt.replace(tzinfo=None) for dt in result]
+
+        return result
+
+    def compute(self):
+        tz = self.getInputFromPort('timezone')
+
+        strings = self.getInputFromPort('strings')
+        fmt = self.getInputFromPort('format')
+
+        try:
+            result = self.convert(strings, fmt, tz)
+        except ValueError, e:
+            raise ModuleError(self, e.message)
+        self.setResult('dates', result)
+
+
+class DatesToMatplotlib(Module):
+    """
+    Converts a List of Python's datetime objects to an array for matplotlib.
+    """
+    _input_ports = [('datetimes', '(org.vistrails.vistrails.basic:List)')]
+    _output_ports = [('dates', '(org.vistrails.vistrails.basic:List)')]
+
+    @staticmethod
+    def convert(datetimes):
+        from matplotlib.dates import date2num
+        return date2num(datetimes)
+
+    def compute(self):
+        try:
+            py_import('matplotlib', {
+                    'pip': 'matplotlib',
+                    'linux-debian': 'python-matplotlib',
+                    'linux-ubuntu': 'python-matplotlib',
+                    'linux-fedora': 'python-matplotlib'})
+        except ImportError:
+            raise ModuleError(self, "matplotlib is not available")
+
+        datetimes = self.getInputFromPort('datetimes')
+        result = self.convert(datetimes)
+        self.setResult('dates', result)
+
+
+class TimestampsToMatplotlib(Module):
+    """
+    Converts a List or numpy array of timestamps into an array for matplotlib.
+    """
+    _input_ports = [
+            ('timestamps', '(org.vistrails.vistrails.basic:List)')]
+    _output_ports = [
+            ('dates', '(org.vistrails.vistrails.basic:List)')]
+
+    @staticmethod
+    def convert(timestamps):
+        from matplotlib.dates import date2num
+        result = TimestampsToDates.convert(timestamps)
+        return date2num(result)
+
+    def compute(self):
+        try:
+            py_import('matplotlib', {
+                    'pip': 'matplotlib',
+                    'linux-debian': 'python-matplotlib',
+                    'linux-ubuntu': 'python-matplotlib',
+                    'linux-fedora': 'python-matplotlib'})
+        except ImportError:
+            raise ModuleError(self, "matplotlib is not available")
+
+        timestamps = self.getInputFromPort('timestamps')
+        result = self.convert(timestamps)
+        self.setResult('dates', result)
+
+
+class StringsToMatplotlib(Module):
+    """
+    Converts a List of dates (as strings) to an array accepted by matplotlib.
+    """
+    _input_ports = [
+            ('strings', '(org.vistrails.vistrails.basic:List)'),
+            ('format', '(org.vistrails.vistrails.basic:String)',
+             {'optional': True, 'defaults': "['']"}),
+            ('timezone', '(org.vistrails.vistrails.basic:String)',
+             {'optional': True, 'defaults': "['']"})]
+    _output_ports = [
+            ('dates', '(org.vistrails.vistrails.basic:List)')]
+
+    @staticmethod
+    def convert(strings, fmt, tz):
+        from matplotlib.dates import date2num
+        datetimes = StringsToDates.convert(strings, fmt, tz)
+        return date2num(datetimes)
+
+    def compute(self):
+        try:
+            py_import('matplotlib', {
+                    'pip': 'matplotlib',
+                    'linux-debian': 'python-matplotlib',
+                    'linux-ubuntu': 'python-matplotlib',
+                    'linux-fedora': 'python-matplotlib'})
+        except ImportError:
+            raise ModuleError(self, "matplotlib is not available")
+
+        tz = self.getInputFromPort('timezone')
+
+        strings = self.getInputFromPort('strings')
+        fmt = self.getInputFromPort('format')
+
+        try:
+            result = self.convert(strings, fmt, tz)
+        except ValueError, e:
+            raise ModuleError(self, e.message)
+        self.setResult('dates', result)
+
+
+_modules = {'dates': [
+        TimestampsToDates, StringsToDates,
+        DatesToMatplotlib, TimestampsToMatplotlib, StringsToMatplotlib]}
+
+
+###############################################################################
+
+import unittest
+from vistrails.tests.utils import execute, intercept_result
+from ..identifiers import identifier
+
+
+class TestTimestampToDates(unittest.TestCase):
+    def test_timestamps(self):
+        """Test conversion to datetime objects.
+        """
+        timestamps = [1369041900, 1369042260, 1357153500]
+        with intercept_result(TimestampsToDates, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|TimestampsToDates', identifier, [
+                        ('timestamps', [('List', repr(timestamps))]),
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertTrue(all(d.tzinfo is utc for d in results))
+        fmt = '%Y-%m-%d %H:%M:%S %Z %z'
+        self.assertEqual(
+                [d.strftime(fmt) for d in results],
+                ['2013-05-20 09:25:00 UTC +0000',
+                 '2013-05-20 09:31:00 UTC +0000',
+                 '2013-01-02 19:05:00 UTC +0000'])
+        try:
+            import pytz
+        except ImportError:
+            pass
+        else:
+            self.assertEqual(
+                    [d.astimezone(pytz.timezone('US/Eastern')).strftime(fmt)
+                     for d in results],
+                    ['2013-05-20 05:25:00 EDT -0400',
+                     '2013-05-20 05:31:00 EDT -0400',
+                     '2013-01-02 14:05:00 EST -0500'])
+
+
+class TestStringsToDates(unittest.TestCase):
+    def test_naive(self):
+        """Test reading non-timezone-aware dates.
+        """
+        dates = ['2013-05-20 9:25', '2013-05-20 09:31', '2013-01-02 19:05']
+        in_fmt = '%Y-%m-%d %H:%M'
+        with intercept_result(StringsToDates, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|StringsToDates', identifier, [
+                        ('strings', [('List', repr(dates))]),
+                        ('format', [('String', in_fmt)]),
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertTrue(all(d.tzinfo is None for d in results))
+        fmt = '%Y-%m-%d %H:%M:%S %Z %z'
+        self.assertEqual(
+                [d.strftime(fmt) for d in results],
+                ['2013-05-20 09:25:00  ',
+                 '2013-05-20 09:31:00  ',
+                 '2013-01-02 19:05:00  '])
+
+    def test_dateutil(self):
+        """Test reading non-timezone-aware dates without providing the format.
+
+        dateutil is required for this one.
+        """
+        try:
+            import dateutil
+        except ImportError:
+            self.skipTest("dateutil is not available")
+
+        dates = ['2013-05-20 9:25',
+                 'Thu Sep 25 10:36:26 2003',
+                 '2003 10:36:28 CET 25 Sep Thu'] # Timezone will be ignored
+        with intercept_result(StringsToDates, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|StringsToDates', identifier, [
+                        ('strings', [('List', repr(dates))]),
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        fmt = '%Y-%m-%d %H:%M:%S %Z %z'
+        self.assertEqual(
+                [d.strftime(fmt) for d in results],
+                ['2013-05-20 09:25:00  ',
+                 '2003-09-25 10:36:26  ',
+                 '2003-09-25 10:36:28  '])
+
+    def test_timezone(self):
+        """Test reading timezone-aware dates by supplying an offset.
+        """
+        dates = ['2013-05-20 9:25', '2013-05-20 09:31', '2013-01-02 19:05']
+        in_fmt = '%Y-%m-%d %H:%M'
+        with intercept_result(StringsToDates, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|StringsToDates', identifier, [
+                        ('strings', [('List', repr(dates))]),
+                        ('format', [('String', in_fmt)]),
+                        ('timezone', [('String', '-0500')])
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertTrue(all(d.tzinfo is not None for d in results))
+        fmt = '%Y-%m-%d %H:%M:%S %z'
+        self.assertEqual(
+                [d.strftime(fmt) for d in results],
+                ['2013-05-20 09:25:00 -0500',
+                 '2013-05-20 09:31:00 -0500',
+                 '2013-01-02 19:05:00 -0500'])
+
+    def test_timezone_pytz(self):
+        """Test reading timezone-aware dates through pytz.
+        """
+        try:
+            import pytz
+        except ImportError:
+            self.skipTest("pytz is not available")
+        if LooseVersion(pytz.__version__) < LooseVersion('2012'):
+            self.skipTest("pytz version is known to cause issues (%s)" %
+                          pytz.__version__)
+
+        dates = ['2013-01-20 9:25', '2013-01-20 09:31', '2013-06-02 19:05']
+        in_fmt = '%Y-%m-%d %H:%M'
+        with intercept_result(StringsToDates, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|StringsToDates', identifier, [
+                        ('strings', [('List', repr(dates))]),
+                        ('format', [('String', in_fmt)]),
+                        ('timezone', [('String', 'America/New_York')])
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertTrue(all(d.tzinfo is not None for d in results))
+        fmt = '%Y-%m-%d %H:%M:%S %Z %z'
+        self.assertEqual(
+                [d.strftime(fmt) for d in results],
+                ['2013-01-20 09:25:00 EST -0500',
+                 '2013-01-20 09:31:00 EST -0500',
+                 '2013-06-02 19:05:00 EDT -0400'])
+
+
+class TestDatesToMatplotlib(unittest.TestCase):
+    def test_simple(self):
+        """Test converting datetime objects into matplotlib's format.
+
+        This uses a PythonSource module to emit the datetime objects.
+        """
+        try:
+            import matplotlib
+        except ImportError:
+            self.skipTest("matplotlib is not available")
+
+        from matplotlib.dates import date2num
+
+        import urllib2
+        source = (""
+        "import datetime\n"
+        "from vistrails.packages.tabledata.convert.convert_dates import \\\n"
+        "    make_timezone\n"
+        "datetimes = [\n"
+        "        datetime.datetime(2013, 5, 29, 11, 18, 33),\n"
+        "        datetime.datetime(2013, 5, 29, 8, 11, 47,\n"
+        "                          tzinfo=make_timezone('-0700'))]\n")
+        source = urllib2.quote(source)
+
+        with intercept_result(DatesToMatplotlib, 'dates') as results:
+            self.assertFalse(execute([
+                    ('PythonSource', 'org.vistrails.vistrails.basic', [
+                        ('source', [('String', source)]),
+                    ]),
+                    ('convert|dates|DatesToMatplotlib', identifier, []),
+                ],
+                [
+                    (0, 'datetimes', 1, 'datetimes')
+                ],
+                add_port_specs=[
+                    (0, 'output', 'datetimes',
+                     'org.vistrails.vistrails.basic:List'),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertEqual(list(results), list(date2num([
+                datetime.datetime(2013, 5, 29, 11, 18, 33),
+                datetime.datetime(2013, 5, 29, 15, 11, 47)])))
+
+
+class TestTimestampsToMatplotlib(unittest.TestCase):
+    def test_simple(self):
+        """Test converting timestamps into matplotlib's format.
+        """
+        try:
+            import matplotlib
+        except ImportError:
+            self.skipTest("matplotlib is not available")
+
+        from matplotlib.dates import date2num
+
+        with intercept_result(TimestampsToMatplotlib, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|TimestampsToMatplotlib', identifier, [
+                        ('timestamps', [('List', '[1324842375, 1369842877]')]),
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertEqual(list(results), list(date2num([
+                datetime.datetime.utcfromtimestamp(1324842375),
+                datetime.datetime.utcfromtimestamp(1369842877)])))
+
+
+class TestStringsToMatplotlib(unittest.TestCase):
+    def test_timezone(self):
+        """Test reading timezone-aware dates by supplying an offset.
+        """
+        try:
+            import matplotlib
+        except ImportError:
+            self.skipTest("matplotlib is not available")
+
+        from matplotlib.dates import date2num
+
+        dates = ['2013-05-20 9:25', '2013-05-20 09:31', '2013-01-02 18:05']
+        in_fmt = '%Y-%m-%d %H:%M'
+        with intercept_result(StringsToMatplotlib, 'dates') as results:
+            self.assertFalse(execute([
+                    ('convert|dates|StringsToMatplotlib', identifier, [
+                        ('strings', [('List', repr(dates))]),
+                        ('format', [('String', in_fmt)]),
+                        ('timezone', [('String', '-0500')])
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        results = results[0]
+        self.assertEqual(list(results), list(date2num([
+                datetime.datetime(2013, 5, 20, 14, 25, 0),
+                datetime.datetime(2013, 5, 20, 14, 31, 0),
+                datetime.datetime(2013, 1, 2, 23, 5, 0)])))
diff --git a/vistrails/packages/tabledata/identifiers.py b/vistrails/packages/tabledata/identifiers.py
new file mode 100644
index 0000000..81fb4b9
--- /dev/null
+++ b/vistrails/packages/tabledata/identifiers.py
@@ -0,0 +1,3 @@
+identifier = 'org.vistrails.vistrails.tabledata'
+name = 'tabledata'
+version = '0.1.0'
diff --git a/vistrails/packages/tabledata/init.py b/vistrails/packages/tabledata/init.py
new file mode 100644
index 0000000..cf1df2d
--- /dev/null
+++ b/vistrails/packages/tabledata/init.py
@@ -0,0 +1,17 @@
+from vistrails.core.modules.utils import make_modules_dict
+from vistrails.core.packagemanager import get_package_manager
+
+from .common import _modules as common_modules
+from .convert import _modules as convert_modules
+from .read import _modules as read_modules
+
+
+_modules = [common_modules,
+            convert_modules,
+            read_modules]
+
+if get_package_manager().has_package('org.vistrails.vistrails.spreadsheet'):
+    from .viewer import _modules as viewer_modules
+    _modules.append(viewer_modules)
+
+_modules = make_modules_dict(*_modules)
diff --git a/vistrails/packages/tabledata/read/__init__.py b/vistrails/packages/tabledata/read/__init__.py
new file mode 100644
index 0000000..ae083df
--- /dev/null
+++ b/vistrails/packages/tabledata/read/__init__.py
@@ -0,0 +1,7 @@
+from vistrails.core.modules.utils import make_modules_dict
+
+from read_numpy import _modules as numpy_modules
+from read_csv import _modules as csv_modules
+
+
+_modules = make_modules_dict(numpy_modules, csv_modules, namespace='read')
diff --git a/vistrails/packages/tabledata/read/read_csv.py b/vistrails/packages/tabledata/read/read_csv.py
new file mode 100644
index 0000000..65f8ddc
--- /dev/null
+++ b/vistrails/packages/tabledata/read/read_csv.py
@@ -0,0 +1,241 @@
+import csv
+from itertools import izip
+import numpy
+
+from vistrails.core.modules.vistrails_module import ModuleError
+from ..common import Table
+
+
+def count_lines(fp):
+    lines = 0
+    for line in fp:
+        lines += 1
+    return lines
+
+
+class CSVFile(Table):
+    _input_ports = [
+            ('file', '(org.vistrails.vistrails.basic:File)'),
+            ('delimiter', '(org.vistrails.vistrails.basic:String)',
+             {'optional': True}),
+            ('header_present', '(org.vistrails.vistrails.basic:Boolean)',
+             {'optional': True, 'defaults': "['True']"})]
+    _output_ports = [
+            ('column_count', '(org.vistrails.vistrails.basic:Integer)'),
+            ('column_names', '(org.vistrails.vistrails.basic:List)'),
+            ('self', '(org.vistrails.vistrails.tabledata:read|csv|CSVFile)')]
+
+    _STANDARD_DELIMITERS = [';', ',', '\t', '|']
+
+    def __init__(self):
+        Table.__init__(self)
+        self._rows = None
+
+    @staticmethod
+    def read_file(filename, delimiter=None, header_present=True):
+        try:
+            with open(filename, 'rb') as fp:
+                first_line = fp.readline()
+            if delimiter is None:
+                counts = [first_line.count(d)
+                          for d in CSVFile._STANDARD_DELIMITERS]
+                read_delimiter, count = max(
+                        izip(CSVFile._STANDARD_DELIMITERS, counts),
+                        key=lambda (delim, count): count)
+                if count == 0:
+                    raise ModuleError(self,
+                                      "Couldn't guess the field delimiter")
+                else:
+                    delimiter = read_delimiter
+            else:
+                count = first_line.count(delimiter)
+
+            column_count = count + 1
+
+            if header_present:
+                column_names = [
+                        name.strip()
+                        for name in first_line.split(delimiter)]
+            else:
+                column_names = None
+        except IOError:
+            raise ModuleError(self, "File does not exist")
+
+        return column_count, column_names, delimiter
+
+    def compute(self):
+        csv_file = self.getInputFromPort('file').name
+        self.header_present = self.getInputFromPort('header_present',
+                                                    allowDefault=True)
+        if self.hasInputFromPort('delimiter'):
+            self.delimiter = self.getInputFromPort('delimiter')
+        else:
+            self.delimiter = None
+
+        self.filename = csv_file
+
+        self.columns, self.names, self.delimiter = \
+                self.read_file(csv_file, self.delimiter, self.header_present)
+
+        self.column_cache = {}
+
+        self.setResult('column_count', self.columns)
+        self.setResult('column_names', self.names)
+
+    def get_column(self, index, numeric=False):
+        if index in self.column_cache:
+            return self.column_cache[index]
+
+        if numeric:
+            result = numpy.loadtxt(
+                    self.filename,
+                    dtype=numpy.float32,
+                    delimiter=self.delimiter,
+                    skiprows=1 if self.header_present else 0,
+                    usecols=[index])
+        else:
+            with open(self.filename, 'rb') as fp:
+                if self.header_present:
+                    fp.readline()
+                reader = csv.reader(
+                        fp,
+                        delimiter=self.delimiter)
+                result = [row[index] for row in reader]
+
+        self.column_cache[index] = result
+        return result
+
+    @property
+    def rows(self):
+        if self._rows is not None:
+            return self._rows
+        with open(self.filename, 'rb') as fp:
+            self._rows = count_lines(fp)
+        if self.header_present:
+            self._rows -= 1
+        return self._rows
+
+
+_modules = {'csv': [CSVFile]}
+
+
+###############################################################################
+
+from StringIO import StringIO
+import unittest
+from vistrails.tests.utils import execute, intercept_result
+from ..identifiers import identifier
+from ..common import ExtractColumn
+
+
+class CSVTestCase(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        import os
+        cls._test_dir = os.path.join(
+                os.path.dirname(__file__),
+                os.pardir,
+                'test_files')
+
+    def test_csv_numeric(self):
+        """Uses CSVFile and ExtractColumn to load a numeric array.
+        """
+        with intercept_result(ExtractColumn, 'value') as results:
+            with intercept_result(CSVFile, 'column_count') as columns:
+                self.assertFalse(execute([
+                        ('read|csv|CSVFile', identifier, [
+                            ('file', [('File', self._test_dir + '/test.csv')]),
+                        ]),
+                        ('ExtractColumn', identifier, [
+                            ('column_index', [('Integer', '1')]),
+                            ('column_name', [('String', 'col 2')]),
+                            ('numeric', [('Boolean', 'True')]),
+                        ]),
+                        ('PythonSource', 'org.vistrails.vistrails.basic', [
+                            ('source', [('String', '')]),
+                        ]),
+                    ],
+                    [
+                        (0, 'self', 1, 'table'),
+                        (1, 'value', 2, 'l'),
+                    ],
+                    add_port_specs=[
+                        (2, 'input', 'l',
+                         'org.vistrails.vistrails.basic:List'),
+                    ]))
+                # Here we use a PythonSource just to check that a numpy array
+                # can be passed on a List port
+        self.assertEqual(columns, [3])
+        self.assertEqual(len(results), 1)
+        self.assertEqual(list(results[0]), [2.0, 3.0, 14.5])
+
+    def test_csv_mismatch(self):
+        """Uses CSVFile and ExtractColumn with mismatching columns.
+        """
+        self.assertTrue(execute([
+                ('read|csv|CSVFile', identifier, [
+                    ('file', [('File', self._test_dir + '/test.csv')]),
+                ]),
+                ('ExtractColumn', identifier, [
+                    ('column_index', [('Integer', '0')]), # index is wrong
+                    ('column_name', [('String', 'col 2')]),
+                ]),
+            ],
+            [
+                (0, 'self', 1, 'table'),
+            ]))
+
+    def test_csv_missing(self):
+        """Uses CSVFile and ExtractColumn with a nonexisting column.
+        """
+        self.assertTrue(execute([
+                ('read|csv|CSVFile', identifier, [
+                    ('file', [('File', self._test_dir + '/test.csv')]),
+                ]),
+                ('ExtractColumn', identifier, [
+                    ('column_name', [('String', 'col not here')]),
+                ]),
+            ],
+            [
+                (0, 'self', 1, 'table'),
+            ]))
+
+    def test_csv_nonnumeric(self):
+        """Uses CSVFile and ExtractColumn to load strings.
+        """
+        with intercept_result(ExtractColumn, 'value') as results:
+            self.assertFalse(execute([
+                    ('read|csv|CSVFile', identifier, [
+                        ('file', [('File', self._test_dir + '/test.csv')]),
+                        ('header_present', [('Boolean', 'False')]),
+                    ]),
+                    ('ExtractColumn', identifier, [
+                        ('column_index', [('Integer', '2')]),
+                        ('numeric', [('Boolean', 'False')]),
+                    ]),
+                ],
+                [
+                    (0, 'self', 1, 'table'),
+                ]))
+        self.assertEqual(len(results), 1)
+        self.assertEqual(results[0],
+                         ['col moutarde', '4', 'not a number', '7'])
+
+
+class TestCountlines(unittest.TestCase):
+    def test_countlines(self):
+        # Simple
+        fp = StringIO("first\nsecond")
+        self.assertEqual(count_lines(fp), 2)
+
+        # With newline at EOF
+        fp = StringIO("first\nsecond\n")
+        self.assertEqual(count_lines(fp), 2)
+
+        # Empty
+        fp = StringIO("")
+        self.assertEqual(count_lines(fp), 0)
+
+        # Single newline
+        fp = StringIO("\n")
+        self.assertEqual(count_lines(fp), 1)
diff --git a/vistrails/packages/tabledata/read/read_numpy.py b/vistrails/packages/tabledata/read/read_numpy.py
new file mode 100644
index 0000000..8f251f4
--- /dev/null
+++ b/vistrails/packages/tabledata/read/read_numpy.py
@@ -0,0 +1,136 @@
+import numpy
+
+from vistrails.core.modules.vistrails_module import Module
+
+
+class NumPyArray(Module):
+    """
+    A Numpy Array, that can be loaded from a file.
+
+    Declared as returning a List, but returns a Numpy array instead!
+    """
+    _input_ports = [
+            ('file', '(org.vistrails.vistrails.basic:File)'),
+            ('datatype', '(org.vistrails.vistrails.basic:String)'),
+            ('shape', '(org.vistrails.vistrails.basic:List)')]
+    _output_ports = [
+            ('value', '(org.vistrails.vistrails.basic:List)')]
+
+    NPY_FMT = object()
+
+    FORMAT_MAP = dict(
+               npy = NPY_FMT,
+
+              int8 = numpy.int8,
+             uint8 = numpy.uint8,
+             int16 = numpy.int16,
+            uint16 = numpy.uint16,
+             int32 = numpy.int32,
+            uint32 = numpy.uint32,
+             int64 = numpy.int64,
+            uint64 = numpy.uint64,
+
+           float32 = numpy.float32,
+           float64 = numpy.float64,
+
+         complex64 = numpy.complex64,
+        complex128 = numpy.complex128,
+    )
+
+    def compute(self):
+        filename = self.getInputFromPort('file').name
+        if self.hasInputFromPort('datatype'):
+            dtype = NumPyArray.FORMAT_MAP[self.getInputFromPort('datatype')]
+        else:
+            if filename[-4:].lower() == '.npy':
+                dtype = self.NPY_FMT
+            else:
+                dtype = numpy.float32
+        if dtype is self.NPY_FMT:
+            # Numpy's ".NPY" format
+            # Written with: numpy.save('xxx.npy', array)
+            array = numpy.load(filename)
+        else:
+            # Numpy's plain binary format
+            # Written with: array.tofile('xxx.dat')
+            array = numpy.fromfile(filename, dtype)
+        if self.hasInputFromPort('shape'):
+            array.shape = tuple(self.getInputFromPort('shape'))
+        self.setResult('value', array)
+
+
+_modules = {'numpy': [NumPyArray]}
+
+
+###############################################################################
+
+import unittest
+
+
+class NumpyTestCase(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        import os
+        cls._test_dir = os.path.join(
+                os.path.dirname(__file__),
+                os.pardir,
+                'test_files')
+
+    def test_raw_numpy(self):
+        """Uses NumPyArray to load an array in raw format.
+        """
+        from ..identifiers import identifier
+        from vistrails.tests.utils import execute, intercept_result
+
+        with intercept_result(NumPyArray, 'value') as results:
+            self.assertFalse(execute([
+                    ('read|numpy|NumPyArray', identifier, [
+                        ('datatype', [('String', 'float32')]),
+                        ('shape', [('List', '[2, 3]')]),
+                        ('file', [('File', self._test_dir + '/random.dat')]),
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        self.assertTrue(
+                (results[0] == [[1.0, 7.0, 5.0], [3.0, 6.0, 1.0]]).all())
+
+    def test_npy_numpy(self):
+        """Uses NumPyArray to load an array in .NPY format.
+        """
+        from ..identifiers import identifier
+        from vistrails.tests.utils import execute, intercept_result
+
+        with intercept_result(NumPyArray, 'value') as results:
+            self.assertFalse(execute([
+                    ('read|numpy|NumPyArray', identifier, [
+                        ('datatype', [('String', 'npy')]),
+                        ('file', [('File', self._test_dir + '/random.npy')]),
+                    ]),
+                    ('PythonSource', 'org.vistrails.vistrails.basic', [
+                        ('source', [('String', '')]),
+                    ]),
+                ],
+                [
+                    (0, 'value', 1, 'l'),
+                ],
+                add_port_specs=[
+                    (1, 'input', 'l',
+                     'org.vistrails.vistrails.basic:List'),
+                ]))
+        self.assertEqual(len(results), 1)
+        self.assertEqual(list(results[0]), [1.0, 7.0, 5.0, 3.0, 6.0, 1.0])
+
+    def test_npy_auto_numpy(self):
+        """Uses NumPyArray to load an array in (autodetected) .NPY format.
+        """
+        from ..identifiers import identifier
+        from vistrails.tests.utils import execute, intercept_result
+
+        with intercept_result(NumPyArray, 'value') as results:
+            self.assertFalse(execute([
+                    ('read|numpy|NumPyArray', identifier, [
+                        ('file', [('File', self._test_dir + '/random.npy')]),
+                    ]),
+                ]))
+        self.assertEqual(len(results), 1)
+        self.assertEqual(list(results[0]), [1.0, 7.0, 5.0, 3.0, 6.0, 1.0])
diff --git a/vistrails/packages/tabledata/test_files/random.dat b/vistrails/packages/tabledata/test_files/random.dat
new file mode 100644
index 0000000..a97c0c5
Binary files /dev/null and b/vistrails/packages/tabledata/test_files/random.dat differ
diff --git a/vistrails/packages/tabledata/test_files/random.npy b/vistrails/packages/tabledata/test_files/random.npy
new file mode 100644
index 0000000..6f4f696
Binary files /dev/null and b/vistrails/packages/tabledata/test_files/random.npy differ
diff --git a/vistrails/packages/tabledata/test_files/test.csv b/vistrails/packages/tabledata/test_files/test.csv
new file mode 100644
index 0000000..6d1d62e
--- /dev/null
+++ b/vistrails/packages/tabledata/test_files/test.csv
@@ -0,0 +1,4 @@
+col 1;col 2;col moutarde
+-1;2;4
+2;3;not a number
+6;14.5;7
diff --git a/vistrails/packages/tabledata/viewer.py b/vistrails/packages/tabledata/viewer.py
new file mode 100644
index 0000000..7b39b09
--- /dev/null
+++ b/vistrails/packages/tabledata/viewer.py
@@ -0,0 +1,55 @@
+from PyQt4 import QtCore, QtGui
+
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget
+
+
+class TableCell(SpreadsheetCell):
+    """Shows a table in a spreadsheet cell.
+    """
+    _input_ports = [('table', '(org.vistrails.vistrails.tabledata:Table)')]
+
+    def compute(self):
+        table = self.getInputFromPort('table')
+        self.cellWidget = self.displayAndWait(TableCellWidget, (table,))
+
+
+class TableCellWidget(QCellWidget):
+    def __init__(self, parent=None):
+        QCellWidget.__init__(self, parent)
+
+        layout = QtGui.QVBoxLayout()
+
+        self.table = QtGui.QTableWidget()
+
+        scrollarea = QtGui.QScrollArea(self)
+        scrollarea.setWidgetResizable(True)
+        scrollarea.setWidget(self.table)
+        layout.addWidget(scrollarea)
+
+        self.setLayout(layout)
+
+    def updateContents(self, inputPorts):
+        table, = inputPorts
+
+        self.table.setColumnCount(table.columns)
+        self.table.setRowCount(table.rows)
+
+        for col in xrange(table.columns):
+            column = table.get_column(col)
+            for row in xrange(table.rows):
+                elem = column[row]
+                if isinstance(elem, bytes):
+                    elem = elem.decode('utf-8', 'replace')
+                elif not isinstance(elem, unicode):
+                    elem = unicode(elem)
+                item = QtGui.QTableWidgetItem(elem)
+                item.setFlags(QtCore.Qt.ItemIsEnabled |
+                              QtCore.Qt.ItemIsSelectable)
+                self.table.setItem(row, col, item)
+
+        if table.names is not None:
+            self.table.setHorizontalHeaderLabels(table.names)
+
+
+_modules = [TableCell]
diff --git a/vistrails/packages/vtk/__init__.py b/vistrails/packages/vtk/__init__.py
new file mode 100644
index 0000000..a5d56cc
--- /dev/null
+++ b/vistrails/packages/vtk/__init__.py
@@ -0,0 +1,61 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""The Visualization ToolKit (VTK) is an open source, freely available
+software system for 3D computer graphics, image processing, and
+visualization used by thousands of researchers and developers around
+the world. http://www.vtk.org"""
+
+from identifiers import *
+import vistrails.core
+
+def package_dependencies():
+    import vistrails.core.packagemanager
+    manager = vistrails.core.packagemanager.get_package_manager()
+    if manager.has_package('org.vistrails.vistrails.spreadsheet'):
+        return ['org.vistrails.vistrails.spreadsheet']
+    else:
+        return []
+
+def package_requirements():
+    from vistrails.core.requirements import require_python_module, \
+        python_module_exists
+    require_python_module('vtk', {
+            'linux-debian': 'python-vtk',
+            'linux-ubuntu': 'python-vtk',
+            'linux-fedora': 'vtk-python'})
+    if not python_module_exists('PyQt4'):
+        from vistrails.core import debug
+        debug.warning('PyQt4 is not available. There will be no interaction '
+                      'between VTK and the spreadsheet.')
diff --git a/vistrails/packages/vtk/base_module.py b/vistrails/packages/vtk/base_module.py
new file mode 100644
index 0000000..5f64fce
--- /dev/null
+++ b/vistrails/packages/vtk/base_module.py
@@ -0,0 +1,272 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# This describes basic modules used by other VTK module
+################################################################################
+from itertools import izip
+import vtk
+
+from vistrails.core.interpreter.base import AbortExecution
+from vistrails.core.modules.module_registry import registry
+from vistrails.core.modules.vistrails_module import Module, ModuleError
+from identifiers import identifier as vtk_pkg_identifier
+
+################################################################################
+
+class vtkBaseModule(Module):
+    """
+    vtkBaseModule is the base class for all VTK modules in VisTrails, it acts
+    as a wrapper to direct all input/output ports to appropriate VTK function
+    calls
+    
+    """
+
+    def __init__(self):
+        """ vtkBaseModule() -> vtkBaseModule
+        Instantiate an emptt VTK Module with real VTK instance
+        
+        """
+        Module.__init__(self)
+        self.vtkInstance = None
+
+    def is_cacheable(self):
+        # VTK objects are by default cacheable only if they're subclasses
+        # of vtkAlgorithm
+        return (issubclass(self.vtkClass, vtk.vtkAlgorithm)
+                and (not issubclass(self.vtkClass, vtk.vtkAbstractMapper)))
+
+    def call_input_function(self, function, params):
+        """self.call_input_function(function, params) -> None
+        Calls the input function on the vtkInstance, or a special
+        input function if one exists in the class."""
+        if hasattr(self, '_special_input_function_' + function):
+            attr = getattr(self, '_special_input_function_' + function)
+        else:
+            try:
+                attr = getattr(self.vtkInstance, function)
+            except AttributeError:
+                # Compensates for overload by exploiting the fact that
+                # no VTK method has underscores.
+                f = function.find('_')
+                if f != -1:
+                    function = function[:f]
+                attr = getattr(self.vtkInstance, function)
+
+        from init import get_method_signature, prune_signatures
+
+        doc = ''
+        try:
+            # doc = self.provide_output_port_documentation(function)
+            doc = self.get_doc(function)
+        except:
+            doc = ''
+
+        setterSig = []
+        if doc != '': setterSig = get_method_signature(None, doc, function)
+
+        if len(setterSig) > 1:
+            prune_signatures(self, function, setterSig)
+
+        pp = []
+        for j in xrange(len(setterSig)):
+          setter = list(setterSig[j][1]) if setterSig[j][1] != None else None
+          aux = []
+          if setter != None and len(setter) == len(params) and pp == []:
+              for i in xrange(len(setter)):
+                  if setter[i].find('[') != -1:
+                      del aux[:]
+                      aux.append(params[i])
+                  elif setter[i].find(']') != -1:
+                      aux.append(params[i])
+                      pp.append(aux)
+                  else:
+                      if len(aux) > 0: 
+                          aux.append(params[i])
+                      else:
+                          pp.append(params[i])                
+        if pp != []:
+            params = pp 
+            attr(*params)
+        else: 
+            attr(*params)
+        # print "Called ",attr,function,params
+
+    @classmethod
+    def get_doc(cls, port_name):
+        f = port_name.find('_')
+        if f != -1:
+            name = port_name[:f]
+        else:
+            name = port_name
+        return getattr(cls.vtkClass, name).__doc__
+
+    # @classmethod
+    # def provide_input_port_documentation(cls, port_name):
+    #     return cls.get_doc(port_name)
+
+    # @classmethod
+    # def provide_output_port_documentation(cls, port_name):
+    #     return cls.get_doc(port_name)
+
+    def compute(self):
+        """ compute() -> None
+        Actually perform real VTK task by directing all input/output ports
+        to VTK function calls
+        
+        """
+
+        def call_it(function, p):
+            # Translate between VisTrails objects and VTK objects
+            if p is None:
+                # None indicates a call with no parameters
+                params = []
+            elif isinstance(p, tuple):
+                # A tuple indicates a call with many parameters
+                params = list(p)
+            else:
+                # Otherwise, it's a single parameter
+                params = [p]
+
+            # Unwraps VTK objects
+            for i in xrange(len(params)):
+                if hasattr(params[i], 'vtkInstance'):
+                    params[i] = params[i].vtkInstance
+            try:
+                self.call_input_function(function, params)
+            except Exception, e:
+                msg = 'VTK Exception: '
+                raise ModuleError(self, msg  + str(type(e)) + ': ' + str(e))
+
+        # Always re-create vtkInstance module, no caching here
+        if self.vtkInstance:
+            del self.vtkInstance
+        self.vtkInstance = self.vtkClass()
+
+        # We need to call method ports before anything else, and in
+        # the right order.
+
+        # FIXME: This does not belong here, it belongs in the main class
+        # No time for that now
+        methods = self.is_method.values()
+        methods.sort()
+        for value in methods:
+            (_, port) = value
+            conn = self.is_method.inverse[value]
+            p = conn()
+            call_it(port, p)
+
+        # Make sure all input ports are called correctly
+        for (function, connector_list) in self.inputPorts.iteritems():
+            paramList = self.forceGetInputListFromPort(function)
+            if function[:18]=='SetInputConnection':
+                paramList = zip([int(function[18:])]*len(paramList),
+                                 paramList)
+                function = 'SetInputConnection'
+            if function=='AddInputConnection':
+                desc = registry.get_descriptor_by_name(
+                    vtk_pkg_identifier,
+                    'vtkAlgorithmOutput')
+                for i in xrange(len(paramList)):
+                    if isinstance(paramList[i], desc.module):
+                        paramList[i] = (0, paramList[i])
+            for p,connector in izip(paramList, connector_list):
+                # Don't call method
+                if connector in self.is_method:
+                    continue
+                call_it(function, p)
+                
+        #In the case of a vtkRenderer, 
+        # we need to call the methods after the
+        #input ports are set.
+        if isinstance(self.vtkInstance, vtk.vtkRenderer):
+            for value in methods:
+                (_, port) = value
+                conn = self.is_method.inverse[value]
+                p = conn()
+                call_it(port, p)
+
+        # Call update if appropriate
+        if hasattr(self.vtkInstance, 'Update'):
+            is_aborted = False
+            isAlgorithm = issubclass(self.vtkClass, vtk.vtkAlgorithm)
+            cbId = None
+            if isAlgorithm:
+                def ProgressEvent(obj, event):
+                    try:
+                        self.logging.update_progress(self, obj.GetProgress())
+                    except AbortExecution:
+                        obj.SetAbortExecute(True)
+                        self.vtkInstance.RemoveObserver(cbId)
+                        is_aborted = True
+                cbId = self.vtkInstance.AddObserver('ProgressEvent', ProgressEvent)
+            self.vtkInstance.Update()
+            if isAlgorithm and not is_aborted:
+                self.vtkInstance.RemoveObserver(cbId)
+
+        # Then update the output ports also with appropriate function calls
+        for function in self.outputPorts.keys():
+            if function[:13]=='GetOutputPort':
+                i = int(function[13:])
+                vtkOutput = self.vtkInstance.GetOutputPort(i)
+                output = vtkBaseModule.wrapperModule('vtkAlgorithmOutput',
+                                                     vtkOutput)
+                self.setResult(function, output)
+            elif hasattr(self.vtkInstance, function):
+                retValues = getattr(self.vtkInstance, function)()
+                if issubclass(retValues.__class__, vtk.vtkObject):
+                    className = retValues.GetClassName()
+                    output  = vtkBaseModule.wrapperModule(className, retValues)
+                    self.setResult(function, output)
+                elif isinstance(retValues, (tuple, list)):
+                    result = list(retValues)
+                    for i in xrange(len(result)):
+                        if issubclass(result[i].__class__, vtk.vtkObject):
+                            className = result[i].GetClassName()
+                            result[i] = vtkBaseModule.wrapperModule(className,
+                                                                    result[i])
+                    self.setResult(function, type(retValues)(result))
+                else:
+                    self.setResult(function, retValues)
+
+    @staticmethod
+    def wrapperModule(classname, instance):
+        """ wrapperModule(classname: str, instance: vtk class) -> Module
+        Create a wrapper module in VisTrails with a vtk instance
+        
+        """
+        result = registry.get_descriptor_by_name(vtk_pkg_identifier,
+                                                 classname).module()
+        result.vtkInstance = instance
+        return result
diff --git a/vistrails/packages/vtk/class_tree.py b/vistrails/packages/vtk/class_tree.py
new file mode 100644
index 0000000..9451e0e
--- /dev/null
+++ b/vistrails/packages/vtk/class_tree.py
@@ -0,0 +1,303 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Author: Prabhu Ramachandran
+# Copyright (c) 2004, Enthought, Inc.
+# License: BSD Style.
+
+"""This module generates the class hierarchy for any given Python
+modules.  This can be used (among other things) to generate the
+traitified VTK classes in the correct order.
+
+"""
+
+import __builtin__
+
+
+class TreeNode(object):
+    """Represents a node in the class tree.
+
+    Stores information on the sub and super classes of a particular
+    class.  It also stores the inheritance level of the class inside
+    the inheritance tree (essentially how many levels of inheritance
+    are there below this class).  This inheritance level is computed
+    when the `get_level` method is called.  The `get_level` method
+    works only when the parent information is complete.
+    
+    """
+
+    def __init__(self, klass):
+        """Given a class, create a node in the tree.
+
+        Parameters
+        ----------
+        - klass : `class`
+
+          The class which is represented as a node in the tree.
+
+        """
+        self.klass = klass
+        self.name = klass.__name__
+        self.children = []
+        self.parents = []
+        # Uninitialized level is set to None
+        self.level = None
+
+    def add_parent(self, parent):
+        """Add a parent node."""
+        assert isinstance(parent, TreeNode)
+        if parent not in self.parents:
+            self.parents.append(parent)
+
+    def add_child(self, child):
+        """Add a child node. """
+        assert isinstance(child, TreeNode)
+        if child not in self.children:
+            self.children.append(child)
+
+    def get_level(self):
+        """Returns the inheritance level of the node (an int).  If the
+        level has not been set, the method computes it.  Note however,
+        that this computation will fail if the parent information is
+        incorrect.
+
+        """
+        if not self.level:
+            if self.parents:
+                self.level = max([x.get_level() for x in self.parents]) + 1
+            else:
+                self.level = 0
+        return self.level
+
+    def get_ancestors(self):
+        """Returns a list of ancestor nodes from which this class has
+        descended.
+
+        """
+        def _get_ancestors(node, ancestors):
+            ancestors.extend(node.parents)
+            for p in node.parents:
+                _get_ancestors(p, ancestors)
+        ancestors = []
+        _get_ancestors(self, ancestors)
+        return ancestors
+
+
+class ClassTree(object):
+    """Contains and generates all the class tree information.
+
+    On initialization of the instance, nothing is done.  The classes
+    are obtained using the list of modules (or a single module) that
+    is used to initialize the instance.  One must then call the
+    `create` method to generate the tree structure.  The instance of
+    the class also can be treated as an iterator which iterates over
+    the nodes of the tree.
+
+    There are two ways in which the tree hierarchy is stored.  A
+    dictionary mapping class names to the tree node and a tree
+    represented as a list of lists containing the nodes.  The tree is
+    organized based on a concept of an inheritance level.  A class
+    that has no parent classes (no base classes) is said to be at
+    level zero.  If a class inherits successively from 7 classes, it
+    is at level 6.  An example of inheritance for a vtkFoo class is
+    given below:
+
+      vtkFoo -> vtkBar -> vtkObject -> vtkObjectBase
+
+    Here, vtkObjectBase has an inheritance level of 0 and vtkFoo a
+    level of 3.  One can traverse the tree by using the level as an
+    index and find all the classes at a particular level.
+
+    Here is some example usage of this class::
+
+        >>> import vtk
+        >>> t = ClassTree(vtk)
+        >>> t.create()
+        >>> print t.get_node('vtkObject').name
+        vtkObject
+        >>> print t.get_node('vtkObject').parents[0].name
+        vtkObjectBase
+        >>> print len(t.tree[0])
+        1
+        >>> t.tree[0][0].name
+        vtkObjectBase
+    
+    """
+
+    def __init__(self, modules):
+        """Initialize the instance with the given modules.
+
+        Parameters
+        ----------
+
+        - modules : `sequence` of modules or a module
+
+          This is either a single module or a sequence of modules.
+          The instance uses these list of modules to generate the
+          class tree.
+          
+        """
+        self.nodes = {}
+        self.tree = [[]]
+        if not hasattr(modules, '__iter__'):
+            self.modules = [modules]
+        else:
+            self.modules = modules
+
+    def __iter__(self):
+        return iter(self.nodes.values())
+
+    def _generate_hierarchy(self, klass):
+        """Does the hard work of generating the class hierarchy."""
+        node = self.get_node(klass.__name__, create=1)
+        for base in klass.__bases__:
+            base_node = self.get_node_from_class(base, create=1)
+            node.add_parent(base_node)
+            base_node.add_child(node)
+            self._generate_hierarchy(base)
+
+    def get_class(self, name):
+        """Given a class name in the given modules returns the class."""
+        klass = None
+        for m in self.modules:
+            if hasattr(m, name):
+                return getattr(m, name)
+        if hasattr(__builtin__, name):
+            klass = getattr(__builtin__, name)
+        if not klass:
+            try:
+                klass = self.nodes[name].klass
+            except KeyError:
+                raise KeyError, "Cannot find class of name %s"%name
+        return klass
+
+    def add_node(self, klass):
+        """Create a node for the given class."""
+        name = klass.__name__
+        if not self.nodes.has_key(name):
+            node = TreeNode(klass)
+            self.nodes[name] = node
+            return node
+
+    def get_node(self, name, create=0):
+        """Get a node of the given name.
+
+        Parameters
+        ----------
+
+        - name : `str`
+
+          Name of the node to get.
+
+        - create : `boolean`
+
+          If True, a new node will be added if no node of the given
+          name is available.  Defaults to False.
+
+        Returns
+        -------
+
+        - `TreeNode`
+
+        """
+        if self.nodes.has_key(name):
+            return self.nodes[name]
+        elif create:
+            return self.add_node(self.get_class(name))
+
+    def get_node_from_class(self, cls, create=0):
+        """Get a node of the given class.
+
+        Parameters
+        ----------
+
+        - cls : `class`
+
+          Class of the node to get.
+
+        - create : `boolean`
+
+          If True, a new node will be added if no node of the given
+          name is available.  Defaults to False.
+
+        Returns
+        -------
+
+        - `TreeNode`
+
+        """
+        name = cls.__name__
+        if self.nodes.has_key(name):
+            return self.nodes[name]
+        elif create:
+            return self.add_node(cls)
+
+    def create(self, class_names=None):
+        """This method generates the class tree given an optional list
+        of class names.
+
+        Parameters
+        ----------
+
+        - class_names - `list` of `str`
+
+          An optional list of names of the classes to generate the
+          tree for.  Defaults to None where the class list is computed
+          from the modules.        
+
+        """
+        if class_names is None:
+            class_names = []
+            for m in self.modules:            
+                class_names.extend(dir(m))
+            
+        # Generate the nodes.
+        for name in class_names:
+            klass = self.get_class(name)
+            if klass and hasattr(klass, '__bases__'):
+                self._generate_hierarchy(klass)
+
+        # Compute the inheritance level and store the nodes in the tree.
+        for node in self:
+            d = node.get_level()
+            while len(self.tree) <= d:
+                self.tree.append([])
+            self.tree[d].append(node)
+
+        # Sort the nodes alphabetically.
+        def _comp(x, y):
+            return cmp(x.name, y.name)
+        for nodes in self.tree:
+            nodes.sort(_comp)
diff --git a/vistrails/packages/vtk/fix_classes.py b/vistrails/packages/vtk/fix_classes.py
new file mode 100644
index 0000000..084ea5f
--- /dev/null
+++ b/vistrails/packages/vtk/fix_classes.py
@@ -0,0 +1,67 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import vtk
+
+################################################################################
+# Some fixed classes that solve a few VTK API issues
+
+# This dictionary stores the patched class to vtk class mapping.
+# This would be naturally better stored as an attribute directly on the
+# patched class. VTK, however, doesn't like class attributes.
+description = {}
+
+# http://www.vtk.org/doc/nightly/html/classvtkImagePlaneWidget.html
+# SetUserControlledLookupTable needs to be set before calling
+# SetLookupTable.  VTK should do it automatically, so let's fix it
+
+
+# This fix seems to break on VTK versions larger than 5.0.3. It might also
+# be because of an interaction with python 2.6, but I haven't checked that.
+class vtkImagePlaneWidget_fixed(vtk.vtkImagePlaneWidget):
+    def SetLookupTable(self, lookup_table):
+        self.UserControlledLookupTableOn()
+        vtk.vtkImagePlaneWidget.SetLookupTable(self, lookup_table)
+v = vtk.vtkVersion()
+version = [v.GetVTKMajorVersion(),
+           v.GetVTKMinorVersion(),
+           v.GetVTKBuildVersion()]
+if version < [5, 0, 4]:
+    description[vtkImagePlaneWidget_fixed] = vtk.vtkImagePlaneWidget
+else:
+    description[id(vtkImagePlaneWidget_fixed)] = vtk.vtkImagePlaneWidget
+
+# Set docstring to wrap it correctly
+vtkImagePlaneWidget_fixed.SetLookupTable.__doc__ = vtk.vtkImagePlaneWidget.SetLookupTable.__doc__
diff --git a/vistrails/packages/vtk/hasher.py b/vistrails/packages/vtk/hasher.py
new file mode 100644
index 0000000..a238541
--- /dev/null
+++ b/vistrails/packages/vtk/hasher.py
@@ -0,0 +1,49 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# This is the user-defined hasher for VTK, that takes into account
+# incoming and outgoing connections
+from vistrails.core.cache.hasher import Hasher
+
+def vtk_hasher(pipeline, module, chm):
+    outgoing_connections = pipeline.graph.edges_from(module.id)
+    incoming_connections = pipeline.graph.edges_to(module.id)
+    current_hash = Hasher.module_signature(module, chm)
+    chashes = [Hasher.connection_signature(pipeline.connections[c_id])
+               for (_, c_id) in outgoing_connections]
+    chashes += [Hasher.connection_signature(pipeline.connections[c_id])
+               for (_, c_id) in incoming_connections]
+    compound_hash = Hasher.compound_signature(chashes)
+    return Hasher.compound_signature([current_hash, compound_hash])
diff --git a/vistrails/packages/vtk/identifiers.py b/vistrails/packages/vtk/identifiers.py
new file mode 100644
index 0000000..3402231
--- /dev/null
+++ b/vistrails/packages/vtk/identifiers.py
@@ -0,0 +1,38 @@
+###############################################################################
+##
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+identifier = 'org.vistrails.vistrails.vtk'
+old_identifiers = ['edu.utah.sci.vistrails.vtk']
+name = 'VTK'
+version = '0.9.4'
diff --git a/vistrails/packages/vtk/init.py b/vistrails/packages/vtk/init.py
new file mode 100644
index 0000000..75961de
--- /dev/null
+++ b/vistrails/packages/vtk/init.py
@@ -0,0 +1,1383 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# VTK Package for VisTrails
+################################################################################
+
+from vistrails.core.debug import debug
+from vistrails.core.modules.basic_modules import Integer, Float, String, File, \
+     Color, identifier as basic_pkg
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.vistrails_module import new_module, ModuleError
+from vistrails.core.system import get_vistrails_default_pkg_prefix
+from identifiers import identifier as vtk_pkg_identifier
+from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler
+from vistrails.core.utils import all, any, InstanceObject
+from vistrails.core.vistrail.connection import Connection
+
+from hasher import vtk_hasher
+from itertools import izip
+import os.path
+import re
+import warnings
+
+import vtk
+
+from base_module import vtkBaseModule
+from class_tree import ClassTree
+import fix_classes
+import inspectors
+import offscreen
+import tf_widget
+from vtk_parser import VTKMethodParser
+
+
+#TODO: Change the Core > Module > Registry > Add Input : To support vector as type.
+
+################################################################################
+
+# filter some deprecation warnings coming from the fact that vtk calls
+# range() with float parameters
+
+warnings.filterwarnings("ignore",
+                        message="integer argument expected, got float")
+
+################################################################################
+v = vtk.vtkVersion()
+version = [v.GetVTKMajorVersion(),
+           v.GetVTKMinorVersion(),
+           v.GetVTKBuildVersion()]
+if version < [5, 0, 4]:
+    def get_description_class(klass):
+        """Because sometimes we need to patch VTK classes, the klass that
+        has the methods is different than the klass we want to
+        instantiate. get_description_class makes sure that for patched
+        classes we get the correct one."""
+        try:
+            return fix_classes.description[klass]
+        except KeyError:
+            return klass
+else:
+    # On VTK 5.0.4, we use the id of the class to hash, because it
+    # seems that VTK hasn't implemented hash() correctly for their
+    # classes.
+    def get_description_class(klass):
+        """Because sometimes we need to patch VTK classes, the klass that
+        has the methods is different than the klass we want to
+        instantiate. get_description_class makes sure that for patched
+        classes we get the correct one."""
+        try:
+            return fix_classes.description[id(klass)]
+        except KeyError:
+            return klass
+
+parser = VTKMethodParser()
+
+typeMapDict = {'int': Integer,
+               'long': Integer,
+               'float': Float,
+               'char*': String,
+               'char *': String,
+               'string': String,
+               'char': String,
+               'const char*': String,
+               'const char *': String,
+               '[float': Float,         
+               'float]': Float,
+               '[int': Integer,
+               'int]': Integer}
+typeMapDictValues = [Integer, Float, String]
+
+file_name_pattern = re.compile('.*FileName$')
+set_file_name_pattern = re.compile('Set.*FileName$')
+
+def resolve_overloaded_name(name, ix, signatures):
+    # VTK supports static overloading, VisTrails does not. The
+    # solution is to check whether the current function has
+    # overloads and change the names appropriately.
+    if len(signatures) == 1:
+        return name
+    else:
+        return name + '_' + str(ix+1)
+
+def typeMap(name, package=None):
+    """ typeMap(name: str) -> Module
+    Convert from C/C++ types into VisTrails Module type
+    
+    """
+    if package is None:
+        package = identifier
+    if isinstance(name, tuple):
+        return [typeMap(x, package) for x in name]
+    if name in typeMapDict:
+        return typeMapDict[name]
+    else:
+        registry = get_module_registry()
+        if not registry.has_descriptor_with_name(package, name):
+            return None
+        else:
+            return registry.get_descriptor_by_name(package,
+                                                   name).module
+
+def get_method_signature(method, docum='', name=''):
+    """ get_method_signature(method: vtkmethod) -> [ret, arg]
+    Re-wrap Prabu's method to increase performance
+
+    """
+    doc = method.__doc__ if docum=='' else docum
+    tmptmp = doc.split('\n')
+    tmp = []
+    for l in tmptmp:
+        l = l.strip('\n \t')
+        if l.startswith('V.') or l.startswith('C++:'):
+            tmp.append(l)
+        else:
+            if (len(tmp) != 0):       
+                tmp[-1] = tmp[-1] + ' ' + l
+    tmp.append('')
+    sig = []        
+    pat = re.compile(r'\b')
+
+    # Remove all the C++ function signatures and V.<method_name> field  
+    name = method.__name__ if name == '' else name
+    offset = 2+len(name)
+    for i in xrange(len(tmp)):
+        s = tmp[i]
+        if s=='': break
+        if i%2==0:
+            x = s.split('->')
+            arg = x[0].strip()[offset:]
+            if len(x) == 1: # No return value
+                ret = None
+            else:
+                ret = x[1].strip()
+
+            # Remove leading and trailing parens for arguments.
+            arg = arg[1:-1]
+            if not arg:
+                arg = None
+            if arg and arg[-1] == ')':
+                arg = arg + ','
+
+            # Now quote the args and eval them.  Easy!
+            if ret and ret[:3]!='vtk':
+                try:
+                    ret = eval(pat.sub('\"', ret))
+                except:
+                    continue
+            if arg:
+                if arg.find('(')!=-1:
+                    try:
+                        arg = eval(pat.sub('\"', arg))
+                    except:
+                        continue
+                else:
+                    arg = arg.split(', ')
+                    if len(arg)>1:
+                        arg = tuple(arg)
+                    else:
+                        arg = arg[0]
+                if isinstance(arg, str):
+                    arg = [arg]
+
+            sig.append(([ret], arg))
+    return sig    
+
+def prune_signatures(module, name, signatures, output=False):
+    """prune_signatures tries to remove redundant signatures to reduce
+    overloading. It _mutates_ the given parameter.
+
+    It does this by performing several operations:
+
+    1) It compares a 'flattened' version of the types
+    against the other 'flattened' signatures. If any of them match, we
+    keep only the 'flatter' ones.
+
+    A 'flattened' signature is one where parameters are not inside a
+    tuple.
+
+    2) We explicitly forbid a few signatures based on modules and names
+
+    """
+    # yeah, this is Omega(n^2) on the number of overloads. Who cares?
+
+    def flatten(type_):
+        if type_ is None:
+            return []
+        def convert(entry):
+            if isinstance(entry, tuple):
+                return list(entry)
+            elif isinstance(entry, str):
+                return [entry]
+            else:
+                result = []
+                first = True
+                lastList = True
+                for e in entry:
+                    if (isinstance(e, list)):
+                        if lastList == False: result[len(result)] = result[len(result)] + ']'  
+                        aux = e
+                        aux.reverse()
+                        aux[0] = '[' + aux[0]
+                        aux[-1] = aux[-1] + ']'
+                        result.extend(aux)
+                        lastList = True
+                    else:
+                        if first: e = '[' + e
+                        result.append(e)
+                        lastList = False
+                        first = False
+                return result
+        result = []
+        for entry in type_:
+            result.extend(convert(entry))
+        return result
+    flattened_entries = [flatten(sig[1]) for
+                         sig in signatures]
+    def hit_count(entry):
+        result = 0
+        for entry in flattened_entries:
+            if entry in flattened_entries:
+                result += 1
+        return result
+    hits = [hit_count(entry) for entry in flattened_entries]
+
+    def forbidden(flattened, hit_count, original):
+        if (issubclass(get_description_class(module.vtkClass), vtk.vtk3DWidget) and
+            name == 'PlaceWidget' and
+            flattened == []):
+            return True
+        # We forbid this because addPorts hardcodes this but
+        # SetInputArrayToProcess is an exception for the InfoVis
+        # package
+        if (get_description_class(module.vtkClass) == vtk.vtkAlgorithm and
+            name!='SetInputArrayToProcess'):
+            return True
+        return False
+
+    # This is messy: a signature is only allowed if there's no
+    # explicit disallowing of it. Then, if it's not overloaded,
+    # it is also allowed. If it is overloaded and not the flattened
+    # version, it is pruned. If these are output ports, there can be
+    # no parameters.
+
+    def passes(flattened, hit_count, original):
+        if forbidden(flattened, hit_count, original):
+            return False
+        if hit_count == 1:
+            return True
+        if original[1] is None:
+            return True
+        if output and len(original[1]) > 0:
+            return False
+        if hit_count > 1 and len(original[1]) == len(flattened):
+            return True
+        return False
+    
+    signatures[:] = [original for (flattened, hit_count, original)
+                     in izip(flattened_entries,
+                             hits,
+                             signatures)
+                     if passes(flattened, hit_count, original)]
+    
+    #then we remove the duplicates, if necessary
+    unique_signatures = []
+    
+    #Remove the arrays and tuples inside the signature
+    #  in order to transform it in a single array
+    #Also remove the '[]' from the Strings
+    def removeBracts(signatures):
+        result = []
+        stack = list(signatures)
+        while (len(stack) != 0):
+            curr = stack.pop(0)
+            if (isinstance(curr, (String, str))):
+                c = curr.replace('[', '')
+                c = c.replace(']', '')
+                result.append(c)
+            elif (curr == None):
+                result.append(curr)
+            elif (isinstance(curr, list)):
+                curr.reverse()
+                for c in curr: stack.insert(0, c)
+            elif (isinstance(curr, tuple)):
+                cc = list(curr)
+                cc.reverse()
+                for c in cc: stack.insert(0, c)
+            else:
+                result.append(curr)
+        return result
+
+    unique2 = []
+    for s in signatures:
+        aux = removeBracts(s)
+        if not unique2.count(aux): 
+            unique_signatures.append(s)
+            unique2.append(aux)
+    signatures[:] = unique_signatures
+    
+disallowed_classes = set(
+    [
+    'simplewrapper', # ticket 464: VTK 5.10 on OpenSuSE needs this
+    'vtkCriticalSection',
+    'vtkDataArraySelection',
+    'vtkDebugLeaks',
+    'vtkDirectory',
+    'vtkDynamicLoader',
+    'vtkFunctionParser',
+    'vtkGarbageCollector',
+    'vtkHeap',
+    'vtkInformationKey',
+    'vtkInstantiator',
+    'vtkLogLookupTable', # VTK: use vtkLookupTable.SetScaleToLog10() instead
+    'vtkMath',
+    'vtkModelMetadata',
+    'vtkMultiProcessController',
+    'vtkMutexLock',
+    'vtkOutputWindow',
+    'vtkPriorityQueue',
+    'vtkQtInitialization',
+    'vtkReferenceCount',
+    'vtkRenderWindowCollection',
+    'vtkRenderWindowInteractor',
+    'vtkTesting',
+    'vtkWindow',
+    'vtkContext2D',       #Not working for VTK 5.7.0
+    'vtkPLYWriter',       #Not working for VTK 5.7.0. 
+    'vtkBooleanTexture',  #Not working for VTK 5.7.0
+    'vtkImageMaskBits',   #Not working for VTK 5.7.0
+    'vtkHardwareSelector',#Not working for VTK 5.7.0
+     ])
+
+def is_class_allowed(module):
+    if module is None:
+        return False
+    try:
+        name = module.__name__
+        return not (name in disallowed_classes)
+    except AttributeError:
+        return True
+
+def addAlgorithmPorts(module):
+    """ addAlgorithmPorts(module: Module) -> None
+    If module is a subclass of vtkAlgorithm, this function will add all
+    SetInputConnection([id],[port]) and GetOutputPort([id]) as
+    SetInputConnection{id}([port]) and GetOutputPort{id}.
+
+    """
+    if issubclass(get_description_class(module.vtkClass), vtk.vtkAlgorithm):
+        if get_description_class(module.vtkClass)!=vtk.vtkStructuredPointsGeometryFilter:
+            # We try to instantiate the class here to get the number of
+            # ports and to avoid abstract classes
+            try:
+                instance = module.vtkClass()
+            except TypeError:
+                pass
+            else:
+                reg = get_module_registry()
+                des = reg.get_descriptor_by_name(vtk_pkg_identifier,
+                                                      'vtkAlgorithmOutput')
+                for i in xrange(0,instance.GetNumberOfInputPorts()):
+                    reg.add_input_port(module, 'SetInputConnection%d'%i,
+                                       des.module, 
+                                       docstring=\
+                                           module.get_doc('SetInputConnection'))
+                for i in xrange(0,instance.GetNumberOfOutputPorts()):
+                    reg.add_output_port(module, 'GetOutputPort%d'%i, 
+                                        des.module, 
+                                        docstring=\
+                                            module.get_doc('GetOutputPort'))
+
+disallowed_set_get_ports = set(['ReferenceCount',
+                                'InputConnection',
+                                'OutputPort',
+                                'Progress',
+                                'ProgressText',
+                                'InputArrayToProcess',
+                                ])
+def addSetGetPorts(module, get_set_dict, delayed):
+    """ addSetGetPorts(module: Module, get_set_dict: dict) -> None
+    Convert all Setxxx methods of module into input ports and all Getxxx
+    methods of module into output ports
+
+    Keyword arguments:
+    module       --- Module
+    get_set_dict --- the Set/Get method signatures returned by vtk_parser
+
+    """
+
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in get_set_dict.iterkeys():
+        if name in disallowed_set_get_ports: continue
+        getterMethod = getattr(klass, 'Get%s'%name)
+        setterMethod = getattr(klass, 'Set%s'%name)
+        getterSig = get_method_signature(getterMethod)
+        setterSig = get_method_signature(setterMethod)
+        if len(getterSig) > 1:
+            prune_signatures(module, 'Get%s'%name, getterSig, output=True)
+        for order, getter in enumerate(getterSig):
+            if getter[1]:
+                debug("Can't handle getter %s (%s) of class %s: Needs input to "
+                    "get output" % (order+1, name, klass))
+                continue
+            if len(getter[0]) != 1:
+                debug("Can't handle getter %s (%s) of class %s: More than a "
+                    "single output" % (order+1, name, str(klass)))
+                continue
+            class_ = typeMap(getter[0][0])
+            if is_class_allowed(class_):
+                port_name = 'Get'+name
+                registry.add_output_port(module, port_name, class_, True,
+                                         docstring=module.get_doc(port_name))
+        if len(setterSig) > 1:
+            prune_signatures(module, 'Set%s'%name, setterSig)
+        for ix, setter in enumerate(setterSig):
+            if setter[1]==None: continue
+            n = resolve_overloaded_name('Set' + name, ix, setterSig)
+            if len(setter[1]) == 1 and is_class_allowed(typeMap(setter[1][0])):
+                registry.add_input_port(module, n,
+                                        typeMap(setter[1][0]),
+                                        setter[1][0] in typeMapDict,
+                                        docstring=module.get_doc(n))
+            else:
+                classes = [typeMap(i) for i in setter[1]]
+
+                if all(is_class_allowed(x) for x in classes):
+                    registry.add_input_port(module, n, classes, True, 
+                                            docstring=module.get_doc(n))
+
+
+            # Wrap SetFileNames for VisTrails file access
+            if file_name_pattern.match(name):
+                # FIXME add documentation...
+                registry.add_input_port(module, 'Set' + name[:-4], 
+                                        (File, 'input file'), False)
+            # Wrap SetRenderWindow for exporters
+            elif name == 'RenderWindow':
+                # cscheid 2008-07-11 This is messy: VTKCell isn't
+                # registered yet, so we can't use it as a port
+                # However, we can't register VTKCell before these either,
+                # because VTKCell requires vtkRenderer. The "right" way would
+                # be to add all modules first, then all ports. However, that would
+                # be too slow.
+                # Workaround: delay the addition of the port by storing
+                # the information in a list
+                if registry.has_module('%s.spreadsheet' % \
+                                       get_vistrails_default_pkg_prefix(),
+                                       'SpreadsheetCell'):
+                    from vtkcell import VTKCell
+                    # FIXME add documentation
+                    delayed.add_input_port.append((module, 'SetVTKCell', VTKCell, False))
+            # Wrap color methods for VisTrails GUI facilities
+            # FIXME add documentation for all of these!
+            elif name == 'DiffuseColor':
+                registry.add_input_port(module, 'SetDiffuseColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'Color':
+                registry.add_input_port(module, 'SetColorWidget', 
+                                        (Color, 'color'), True)
+            elif name == 'AmbientColor':
+                registry.add_input_port(module, 'SetAmbientColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'SpecularColor':
+                registry.add_input_port(module, 'SetSpecularColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'EdgeColor':
+                registry.add_input_port(module, 'SetEdgeColorWidget',
+                                        (Color, 'color'), True)
+            elif name == 'Background' :
+                registry.add_input_port(module, 'SetBackgroundWidget', 
+                                        (Color, 'color'), True)
+            elif name == 'Background2' :
+                registry.add_input_port(module, 'SetBackground2Widget', 
+                                        (Color, 'color'), True)
+
+disallowed_toggle_ports = set(['GlobalWarningDisplay',
+                               'Debug',
+                               ])
+def addTogglePorts(module, toggle_dict):
+    """ addTogglePorts(module: Module, toggle_dict: dict) -> None
+    Convert all xxxOn/Off methods of module into input ports
+
+    Keyword arguments:
+    module      --- Module
+    toggle_dict --- the Toggle method signatures returned by vtk_parser
+
+    """
+    registry = get_module_registry()
+    for name in toggle_dict.iterkeys():
+        if name in disallowed_toggle_ports:
+            continue
+        port_name = name+'On'
+        registry.add_input_port(module, port_name, [], True,
+                                docstring=module.get_doc(port_name))
+        port_name = name+'Off'
+        registry.add_input_port(module, port_name, [], True,
+                                docstring=module.get_doc(port_name))
+
+disallowed_state_ports = set(['SetInputArrayToProcess'])
+def addStatePorts(module, state_dict):
+    """ addStatePorts(module: Module, state_dict: dict) -> None
+    Convert all SetxxxToyyy methods of module into input ports
+
+    Keyword arguments:
+    module     --- Module
+    state_dict --- the State method signatures returned by vtk_parser
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in state_dict.iterkeys():
+        for mode in state_dict[name]:
+            # Creates the port Set foo to bar
+            field = 'Set'+name+'To'+mode[0]
+            if field in disallowed_state_ports:
+                continue
+            if not registry.has_input_port(module, field):
+                registry.add_input_port(module, field, [], True,
+                                        docstring=module.get_doc(field))
+
+        # Now create the port Set foo with parameter
+        if hasattr(klass, 'Set%s'%name):
+            setterMethod = getattr(klass, 'Set%s'%name)
+            setterSig = get_method_signature(setterMethod)
+            # if the signature looks like an enum, we'll skip it, it shouldn't
+            # be necessary
+            if len(setterSig) > 1:
+                prune_signatures(module, 'Set%s'%name, setterSig)
+            for ix, setter in enumerate(setterSig):
+                n = resolve_overloaded_name('Set' + name, ix, setterSig)
+                tm = typeMap(setter[1][0])
+                if len(setter[1]) == 1 and is_class_allowed(tm):
+                    registry.add_input_port(module, n, tm,
+                                            setter[1][0] in typeMapDict,
+                                            docstring=module.get_doc(n))
+                else:
+                    classes = [typeMap(i) for i in setter[1]]
+                    if all(is_class_allowed(x) for x in classes):
+                        registry.add_input_port(module, n, classes, True,
+                                                docstring=module.get_doc(n))
+
+disallowed_other_ports = set(
+    [
+     'BreakOnError',
+     'DeepCopy',
+     'FastDelete',
+     'HasObserver',
+     'HasExecutive',
+     'InvokeEvent',
+     'IsA',
+     'Modified',
+     'NewInstance',
+     'PrintRevisions',
+     'RemoveAllInputs',
+     'RemoveObserver',
+     'RemoveObservers',
+     'SafeDownCast',
+#     'SetInputArrayToProcess',
+     'ShallowCopy',
+     'Update',
+     'UpdateInformation',
+     'UpdateProgress',
+     'UpdateWholeExtent',
+     # DAK: These are taken care of by s.upper() == s test
+     # 'GUI_HIDE',
+     # 'INPUT_ARRAYS_TO_PROCESS',
+     # 'INPUT_CONNECTION',
+     # 'INPUT_IS_OPTIONAL',
+     # 'INPUT_IS_REPEATABLE',
+     # 'INPUT_PORT',
+     # 'INPUT_REQUIRED_DATA_TYPE',
+     # 'INPUT_REQUIRED_FIELDS',
+     # 'IS_INTERNAL_VOLUME',
+     # 'IS_EXTERNAL_SURFACE',
+     # 'MANAGES_METAINFORMATION',
+     # 'POINT_DATA',
+     # 'POINTS',
+     # 'PRESERVES_ATTRIBUTES',
+     # 'PRESERVES_BOUNDS',
+     # 'PRESERVES_DATASET',
+     # 'PRESERVES_GEOMETRY',
+     # 'PRESERVES_RANGES',
+     # 'PRESERVES_TOPOLOGY',
+     ])
+
+
+
+force_not_optional_port = set(
+    ['ApplyViewTheme',
+     ])
+
+
+def addOtherPorts(module, other_list):
+    """ addOtherPorts(module: Module, other_list: list) -> None
+    Convert all other ports such as Insert/Add.... into input/output
+
+    Keyword arguments:
+    module     --- Module
+    other_dict --- any other method signatures that is not
+                   Algorithm/SetGet/Toggle/State type
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in other_list:
+        if name=='CopyImportVoidPointer':
+            # FIXME add documentation
+            registry.add_input_port(module, 'CopyImportVoidString', (String, 'value'), False)
+        if name[:3] in ['Add','Set'] or name[:6]=='Insert':
+            if name in disallowed_other_ports:
+                continue
+            method = getattr(klass, name)
+            signatures = ""
+            if not isinstance(method, int):
+                signatures = get_method_signature(method)
+
+            if len(signatures) > 1:
+                prune_signatures(module, name, signatures)
+            for (ix, sig) in enumerate(signatures):
+                ([result], params) = sig
+                types = []
+                if params:
+                    for p in params:
+                        t = typeMap(p)
+                        if not t:
+                            types = None
+                            break
+                        else: types.append(t)
+                else:
+                    types = [[]]
+                if types:
+                    if not all(is_class_allowed(x) for x in types):
+                        continue
+                    n = resolve_overloaded_name(name, ix, signatures)
+                    if len(types)<=1:
+                        registry.add_input_port(module, n, types[0],
+                                                types[0] in typeMapDictValues,
+                                                docstring=module.get_doc(n))
+                    else:
+                        registry.add_input_port(module, n, types, True,
+                                                docstring=module.get_doc(n))
+        else:
+            # DAK: check for static methods as name.upper() == name
+            if name in disallowed_other_ports or name.upper() == name:
+                continue
+            method = getattr(klass, name)
+            signatures = ""
+            if not isinstance(method, int):
+                signatures = get_method_signature(method)
+
+            if len(signatures) > 1:
+                prune_signatures(module, name, signatures)
+            for (ix, sig) in enumerate(signatures):
+                ([result], params) = sig
+                types = []
+                if params:
+                    paramsList = list(params)
+                    while (len(paramsList) != 0):
+                        p = paramsList.pop(0)
+                        if isinstance(p, list): 
+                            for aux in p: paramsList.insert(0, aux)
+                        else:
+                          types.append(typeMap(p))
+                else:
+                    types = []
+                if not all(is_class_allowed(x) for x in types):
+                    continue
+                if types==[] or (result==None):
+                    n = resolve_overloaded_name(name, ix, signatures)
+                    # print module.vtkClass.__name__, n
+                    try:
+                        doc = module.get_doc(n)
+                        registry.add_input_port(module, n, types,
+                                                not (n in force_not_optional_port),
+                                                docstring=module.get_doc(n))
+                    except:
+                        print "&*& ERROR WITH ", module.vtkClass.__name__, n
+
+disallowed_get_ports = set([
+    'GetClassName',
+    'GetErrorCode',
+    'GetNumberOfInputPorts',
+    'GetNumberOfOutputPorts',
+    'GetOutputPortInformation',
+    'GetTotalNumberOfInputConnections',
+    ])
+
+def addGetPorts(module, get_list):
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    for name in get_list:
+        if name in disallowed_get_ports:
+            continue
+        method = getattr(klass, name)
+        signatures = get_method_signature(method)
+        if len(signatures) > 1:
+            prune_signatures(module, name, signatures, output=True)
+        for ix, getter in enumerate(signatures):
+            if getter[1] or len(getter[0]) > 1:
+                continue
+            class_ = typeMap(getter[0][0])
+            if is_class_allowed(class_):
+                if len(signatures) > 1:
+                    n = name + "_" + str(ix+1)
+                else:
+                    n = name
+                registry.add_output_port(module, n, class_, True,
+                                         docstring=module.get_doc(n))
+    
+def addPorts(module, delayed):
+    """ addPorts(module: VTK module inherited from Module,
+                 delayed: object with add_input_port slot
+    ) -> None
+    
+    Search all metamethods of module and add appropriate ports
+
+    ports that cannot be added immediately should be appended to
+    the delayed object that is passed. see the SetRenderWindow cases.
+
+    """
+    klass = get_description_class(module.vtkClass)
+    registry = get_module_registry()
+    registry.add_output_port(module, 'self', module)
+    parser.parse(klass)
+    addAlgorithmPorts(module)
+    addGetPorts(module, parser.get_get_methods())
+    addSetGetPorts(module, parser.get_get_set_methods(), delayed) 
+    addTogglePorts(module, parser.get_toggle_methods())
+    addStatePorts(module, parser.get_state_methods())
+    addOtherPorts(module, parser.get_other_methods())             
+    # CVS version of VTK doesn't support AddInputConnect(vtkAlgorithmOutput)
+    # FIXME Add documentation
+    basic_pkg = '%s.basic' % get_vistrails_default_pkg_prefix()
+    if klass==vtk.vtkAlgorithm:
+        registry.add_input_port(module, 'AddInputConnection',
+                                typeMap('vtkAlgorithmOutput'))
+    # vtkWriters have a custom File port
+    elif klass==vtk.vtkWriter:
+        registry.add_output_port(module, 'file', typeMap('File', basic_pkg))
+    elif klass==vtk.vtkImageWriter:
+        registry.add_output_port(module, 'file', typeMap('File', basic_pkg))
+    elif klass==vtk.vtkVolumeProperty:
+        registry.add_input_port(module, 'SetTransferFunction',
+                                typeMap('TransferFunction'))
+    elif klass==vtk.vtkDataSet:
+        registry.add_input_port(module, 'SetPointData', typeMap('vtkPointData'))
+        registry.add_input_port(module, 'SetCellData', typeMap('vtkCellData'))
+    elif klass==vtk.vtkCell:
+        registry.add_input_port(module, 'SetPointIds', typeMap('vtkIdList'))
+
+def setAllPorts(descriptor, delayed):
+    """ setAllPorts(descriptor: ModuleDescriptor) -> None
+    Traverse descriptor and all of its children/grand-children to add all ports
+
+    """
+    addPorts(descriptor.module, delayed)
+    for child in descriptor.children:
+        setAllPorts(child, delayed)
+
+def class_dict(base_module, node):
+    """class_dict(base_module, node) -> dict
+    Returns the class dictionary for the module represented by node and
+    with base class base_module"""
+
+    class_dict_ = {}
+    def update_dict(name, callable_):
+        if class_dict_.has_key(name):
+            class_dict_[name] = callable_(class_dict_[name])
+        elif hasattr(base_module, name):
+            class_dict_[name] = callable_(getattr(base_module, name))
+        else:
+            class_dict_[name] = callable_(None)
+
+    def guarded_SimpleScalarTree_wrap_compute(old_compute):
+        # This builds the scalar tree and makes it cacheable
+
+        def compute(self):
+            self.is_cacheable = lambda *args, **kwargs: True
+            old_compute(self)
+            self.vtkInstance.BuildTree()
+        return compute
+
+    def guarded_SetFileName_wrap_compute(old_compute):
+        # This checks for the presence of file in VTK readers
+        def compute(self):
+
+            # Skips the check if it's a vtkImageReader or vtkPLOT3DReader, because
+            # it has other ways of specifying files, like SetFilePrefix for
+            # multiple files
+            skip = [vtk.vtkBYUReader,
+                    vtk.vtkImageReader,
+                    vtk.vtkDICOMImageReader,
+                    vtk.vtkTIFFReader]
+
+            # vtkPLOT3DReader does not exist from version 6.0.0
+            v = vtk.vtkVersion()
+            version = [v.GetVTKMajorVersion(),
+                       v.GetVTKMinorVersion(),
+                       v.GetVTKBuildVersion()]
+            if version < [6, 0, 0]:
+                skip.append(vtk.vtkPLOT3DReader)
+            if any(issubclass(self.vtkClass, x) for x in skip):
+                old_compute(self)
+                return
+            if self.hasInputFromPort('SetFileName'):
+                name = self.getInputFromPort('SetFileName')
+            elif self.hasInputFromPort('SetFile'):
+                name = self.getInputFromPort('SetFile').name
+            else:
+                raise ModuleError(self, 'Missing filename')
+            if not os.path.isfile(name):
+                raise ModuleError(self, 'File does not exist')
+            old_compute(self)
+        return compute
+
+    def compute_SetDiffuseColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetDiffuseColorWidget(self, color):
+            self.vtkInstance.SetDiffuseColor(color.tuple)
+        return call_SetDiffuseColorWidget
+
+    def compute_SetAmbientColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetAmbientColorWidget(self, color):
+            self.vtkInstance.SetAmbientColor(color.tuple)
+        return call_SetAmbientColorWidget
+
+    def compute_SetSpecularColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetSpecularColorWidget(self, color):
+            self.vtkInstance.SetSpecularColor(color.tuple)
+        return call_SetSpecularColorWidget
+
+    def compute_SetColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetColorWidget(self, color):
+            self.vtkInstance.SetColor(color.tuple)
+        return call_SetColorWidget
+
+    def compute_SetEdgeColorWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetEdgeColorWidget(self, color):
+            self.vtkInstance.SetEdgeColor(color.tuple)
+        return call_SetEdgeColorWidget
+    
+    def compute_SetBackgroundWidget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetBackgroundWidget(self, color):
+            self.vtkInstance.SetBackground(color.tuple)
+        return call_SetBackgroundWidget
+    
+    def compute_SetBackground2Widget(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetBackground2Widget(self, color):
+            self.vtkInstance.SetBackground2(color.tuple)
+        return call_SetBackground2Widget
+    
+    def compute_SetVTKCell(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetRenderWindow(self, cellObj):
+            if cellObj.cellWidget:
+                self.vtkInstance.SetRenderWindow(cellObj.cellWidget.mRenWin)
+        return call_SetRenderWindow
+    
+    def compute_SetTransferFunction(old_compute):
+        # This sets the transfer function
+        if old_compute != None:
+            return old_compute
+        def call_SetTransferFunction(self, tf):
+            tf.set_on_vtk_volume_property(self.vtkInstance)
+        return call_SetTransferFunction
+
+    def compute_SetPointData(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetPointData(self, pd):
+            self.vtkInstance.GetPointData().ShallowCopy(pd)
+        return call_SetPointData
+
+    def compute_SetCellData(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetCellData(self, cd):
+            self.vtkInstance.GetCellData().ShallowCopy(cd)
+        return call_SetCellData            
+
+    def compute_SetPointIds(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_SetPointIds(self, point_ids):
+            self.vtkInstance.GetPointIds().SetNumberOfIds(point_ids.GetNumberOfIds())
+            for i in xrange(point_ids.GetNumberOfIds()):
+                self.vtkInstance.GetPointIds().SetId(i, point_ids.GetId(i))
+        return call_SetPointIds
+
+    def compute_CopyImportString(old_compute):
+        if old_compute != None:
+            return old_compute
+        def call_CopyImportVoidPointer(self, pointer):
+            self.vtkInstance.CopyImportVoidPointer(pointer, len(pointer))
+        return call_CopyImportVoidPointer
+
+    def guarded_Writer_wrap_compute(old_compute):
+        # The behavior for vtkWriter subclasses is to call Write()
+        # If the user sets a name, we will create a file with that name
+        # If not, we will create a temporary file from the file pool
+        def compute(self):
+            old_compute(self)
+            fn = self.vtkInstance.GetFileName()
+            if not fn:
+                o = self.interpreter.filePool.create_file(suffix='.vtk')
+                self.vtkInstance.SetFileName(o.name)
+            else:
+                o = File()
+                o.name = fn
+            self.vtkInstance.Write()
+            self.setResult('file', o)
+        return compute
+
+    for var in dir(node.klass):
+        # Everyone that has a Set.*FileName should have a Set.*File port too
+        if set_file_name_pattern.match(var):
+            def get_compute_SetFile(method_name):
+                def compute_SetFile(old_compute):
+                    if old_compute != None:
+                        return old_compute
+                    def call_SetFile(self, file_obj):
+                        getattr(self.vtkInstance, method_name)(file_obj.name)
+                    return call_SetFile
+                return compute_SetFile
+            update_dict('_special_input_function_' + var[:-4], 
+                        get_compute_SetFile(var))
+
+    if hasattr(node.klass, 'SetFileName'):
+        # ... BUT we only want to check existence of filenames on
+        # readers. VTK is nice enough to be consistent with names, but
+        # this is brittle..
+        if node.klass.__name__.endswith('Reader'):
+            if not node.klass.__name__.endswith('TiffReader'):
+                update_dict('compute', guarded_SetFileName_wrap_compute)
+    if hasattr(node.klass, 'SetRenderWindow'):
+        update_dict('_special_input_function_SetVTKCell',
+                    compute_SetVTKCell)
+    #color gui wrapping
+    if hasattr(node.klass, 'SetDiffuseColor'):
+        update_dict('_special_input_function_SetDiffuseColorWidget',
+                    compute_SetDiffuseColorWidget)
+    if hasattr(node.klass, 'SetAmbientColor'):
+        update_dict('_special_input_function_SetAmbientColorWidget',
+                    compute_SetAmbientColorWidget)
+    if hasattr(node.klass, 'SetSpecularColor'):
+        update_dict('_special_input_function_SetSpecularColorWidget',
+                    compute_SetSpecularColorWidget)
+    if hasattr(node.klass, 'SetEdgeColor'):
+        update_dict('_special_input_function_SetEdgeColorWidget',
+                    compute_SetEdgeColorWidget)
+    if hasattr(node.klass, 'SetColor'):
+        update_dict('_special_input_function_SetColorWidget',
+                    compute_SetColorWidget)
+    if (issubclass(node.klass, vtk.vtkRenderer) and 
+        hasattr(node.klass, 'SetBackground')):
+        update_dict('_special_input_function_SetBackgroundWidget',
+                    compute_SetBackgroundWidget)
+    if (issubclass(node.klass, vtk.vtkRenderer) and 
+        hasattr(node.klass, 'SetBackground2')):
+        update_dict('_special_input_function_SetBackground2Widget',
+                    compute_SetBackground2Widget)    
+    if issubclass(node.klass, vtk.vtkWriter):
+        update_dict('compute', guarded_Writer_wrap_compute)
+
+    if issubclass(node.klass, vtk.vtkScalarTree):
+        update_dict('compute', guarded_SimpleScalarTree_wrap_compute)
+
+    if issubclass(node.klass, vtk.vtkVolumeProperty):
+        update_dict('_special_input_function_SetTransferFunction',
+                    compute_SetTransferFunction)
+    if issubclass(node.klass, vtk.vtkDataSet):
+        update_dict('_special_input_function_SetPointData',
+                    compute_SetPointData)
+        update_dict('_special_input_function_SetCellData',
+                    compute_SetCellData)
+    if issubclass(node.klass, vtk.vtkCell):
+        update_dict('_special_input_function_SetPointIds',
+                    compute_SetPointIds)
+    if issubclass(node.klass, vtk.vtkImageImport):
+        update_dict('_special_input_function_CopyImportString',
+                    compute_CopyImportString)
+    return class_dict_
+
+disallowed_modules = set([
+        'vtkGeoAlignedImageCache',
+        'vtkGeoTerrainCache',
+        'vtkMPIGroup'
+        ])
+def createModule(baseModule, node):
+    """ createModule(baseModule: a Module subclass, node: TreeNode) -> None
+    Construct a module inherits baseModule with specification from node
+    
+    """
+    if node.name in disallowed_modules: return
+    def obsolete_class_list():
+        lst = []
+        items = ['vtkInteractorStyleTrackball',
+                 'vtkStructuredPointsGeometryFilter',
+                 'vtkConstrainedPointHandleRepresentation']
+        def try_to_add_item(item):
+            try:
+                lst.append(getattr(vtk, item))
+            except AttributeError:
+                pass
+        for item in items:
+            try_to_add_item(item)
+        return lst
+
+    obsolete_list = obsolete_class_list()
+    
+    def is_abstract():
+        """is_abstract tries to instantiate the class. If it's
+        abstract, this will raise."""
+        # Consider obsolete classes abstract        
+        if node.klass in obsolete_list:
+            return True
+        try:
+            getattr(vtk, node.name)()
+        except (TypeError, NotImplementedError): # VTK raises type error on abstract classes
+            return True
+        return False
+    module = new_module(baseModule, node.name,
+                       class_dict(baseModule, node),
+                       docstring=getattr(vtk, node.name).__doc__
+                       )
+
+    # This is sitting on the class
+    if hasattr(fix_classes, node.klass.__name__ + '_fixed'):
+        module.vtkClass = getattr(fix_classes, node.klass.__name__ + '_fixed')
+    else:
+        module.vtkClass = node.klass
+    registry = get_module_registry()
+    registry.add_module(module, abstract=is_abstract(), 
+                        signatureCallable=vtk_hasher)
+    for child in node.children:
+        if child.name in disallowed_classes:
+            continue
+        createModule(module, child)
+
+def createAllModules(g):
+    """ createAllModules(g: ClassTree) -> None
+    Traverse the VTK class tree and add all modules into the module registry
+    
+    """
+    v = vtk.vtkVersion()
+    version = [v.GetVTKMajorVersion(),
+               v.GetVTKMinorVersion(),
+               v.GetVTKBuildVersion()]
+    if version < [5, 7, 0]:
+        assert len(g.tree[0]) == 1
+        base = g.tree[0][0]
+        assert base.name == 'vtkObjectBase'
+
+    vtkObjectBase = new_module(vtkBaseModule, 'vtkObjectBase')
+    vtkObjectBase.vtkClass = vtk.vtkObjectBase
+    registry = get_module_registry()
+    registry.add_module(vtkObjectBase)
+    if version < [5, 7, 0]:
+        for child in base.children:
+            if child.name in disallowed_classes:
+                continue
+            createModule(vtkObjectBase, child)
+    else:
+        for base in g.tree[0]:
+            for child in base.children:
+                if child.name in disallowed_classes:
+                    continue
+                createModule(vtkObjectBase, child)
+
+
+################################################################################
+
+def initialize():
+    """ initialize() -> None
+    Package-entry to initialize the package
+    
+    """
+    # Check VTK version
+    v = vtk.vtkVersion()
+    version = [v.GetVTKMajorVersion(),
+               v.GetVTKMinorVersion(),
+               v.GetVTKBuildVersion()]
+    if version < [5, 0, 0]:
+        raise RuntimeError("You need to upgrade your VTK install to version "
+                           ">= 5.0.0")
+    inheritanceGraph = ClassTree(vtk)
+    inheritanceGraph.create()
+
+    # Transfer Function constant
+    tf_widget.initialize()
+
+    delayed = InstanceObject(add_input_port=[])
+    # Add VTK modules
+    registry = get_module_registry()
+    registry.add_module(vtkBaseModule)
+    createAllModules(inheritanceGraph)
+    setAllPorts(registry.get_descriptor_by_name(identifier,
+                                                'vtkObjectBase'),
+                delayed)
+
+    # Register the VTKCell and VTKHandler type if the spreadsheet is up
+    if registry.has_module('%s.spreadsheet' % \
+                           get_vistrails_default_pkg_prefix(),
+                           'SpreadsheetCell'):
+        import vtkhandler
+        import vtkcell
+        import vtkviewcell
+        vtkhandler.registerSelf()
+        vtkcell.registerSelf()
+        vtkviewcell.registerSelf()
+
+    # register offscreen rendering module
+    offscreen.register_self()
+
+    # Now add all "delayed" ports - see comment on addSetGetPorts
+    for args in delayed.add_input_port:
+        
+        registry.add_input_port(*args)
+
+    # register Transfer Function adjustment
+    # This can't be reordered -- TransferFunction needs to go before
+    # vtkVolumeProperty, but vtkScaledTransferFunction needs
+    # to go after vtkAlgorithmOutput
+    getter = registry.get_descriptor_by_name
+    registry.add_module(tf_widget.vtkScaledTransferFunction)
+    # FIXME Add documentation
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Input', getter(vtk_pkg_identifier,
+                                            'vtkAlgorithmOutput').module)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Dataset', getter (vtk_pkg_identifier,
+                                               'vtkDataObject').module)
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'Range', [Float, Float])
+    registry.add_input_port(tf_widget.vtkScaledTransferFunction,
+                            'TransferFunction',
+                            tf_widget.TransferFunctionConstant)
+    registry.add_output_port(tf_widget.vtkScaledTransferFunction,
+                             'TransferFunction',
+                             tf_widget.TransferFunctionConstant)
+    registry.add_output_port(tf_widget.vtkScaledTransferFunction,
+                             'vtkPiecewiseFunction',
+                             getter(vtk_pkg_identifier, 
+                                    'vtkPiecewiseFunction').module)
+    registry.add_output_port(tf_widget.vtkScaledTransferFunction,
+                             'vtkColorTransferFunction',
+                             getter(vtk_pkg_identifier, 
+                                    'vtkColorTransferFunction').module)
+
+    inspectors.initialize()
+
+################################################################################
+
+_remap = None
+_controller = None
+_pipeline = None
+
+def _get_controller():
+    global _controller
+    return _controller
+
+def _get_pipeline():
+    global _pipeline
+    return _pipeline
+
+def build_remap(module_name=None):
+    global _remap, _controller
+
+    reg = get_module_registry()
+    uscore_num = re.compile(r"(.+)_(\d+)$")
+    
+    def get_port_specs(descriptor, port_type):
+        ports = {}
+        for desc in reversed(reg.get_module_hierarchy(descriptor)):
+            ports.update(reg.module_ports(port_type, desc))
+        return ports
+
+    def build_remap_method(desc, port_prefix, port_num, port_type):
+        # for connection, need to differentiate between src and dst
+        if port_type == 'input':
+            conn_lookup = Connection._get_destination
+            get_port_spec = reg.get_input_port_spec
+            idx = 1
+        else:
+            conn_lookup = Connection._get_source
+            get_port_spec = reg.get_output_port_spec
+            idx = 0
+
+        def remap(old_conn, new_module):
+            create_new_connection = UpgradeWorkflowHandler.create_new_connection
+            port = conn_lookup(old_conn)
+            pipeline = _get_pipeline()
+            modules = [pipeline.modules[old_conn.source.moduleId],
+                       pipeline.modules[old_conn.destination.moduleId]]
+            modules[idx] = new_module
+            ports = [old_conn.source, old_conn.destination]
+            for i in xrange(1, port_num):
+                port_name = "%s_%d" % (port_prefix, i)
+                port_spec = get_port_spec(modules[idx], port_name)
+                if port_spec.sigstring == port.signature:
+                    ports[idx] = port_name
+                    new_conn = create_new_connection(_get_controller(),
+                                                     modules[0],
+                                                     ports[0],
+                                                     modules[1],
+                                                     ports[1])
+                    return [('add', new_conn)]
+                                                                  
+            # if get here, just try to use _1 version?
+            ports[idx] = "%s_%d" % (port_prefix, 1)
+            new_conn = create_new_connection(_get_controller(),
+                                             modules[0],
+                                             ports[0],
+                                             modules[1],
+                                             ports[1])
+            return [('add', new_conn)]
+        return remap
+
+    def build_function_remap_method(desc, port_prefix, port_num):
+        f_map = {"vtkCellArray": {"InsertNextCell": 3}}
+        def build_function(old_function, new_function_name, new_module):
+            controller = _get_controller()
+            if len(old_function.parameters) > 0:
+                new_param_vals, aliases = \
+                    zip(*[(p.strValue, p.alias) 
+                          for p in old_function.parameters])
+            else:
+                new_param_vals = []
+                aliases = []
+            new_function = controller.create_function(new_module, 
+                                                      new_function_name,
+                                                      new_param_vals,
+                                                      aliases)
+            return new_function
+            
+        def remap(old_function, new_module):
+            for i in xrange(1, port_num):
+                port_name = "%s_%d" % (port_prefix, i)
+                port_spec = reg.get_input_port_spec(new_module, port_name)
+                old_sigstring = \
+                    reg.expand_port_spec_string(old_function.sigstring,
+                                                basic_pkg)
+                if port_spec.sigstring == old_sigstring:
+                    new_function = build_function(old_function, port_name,
+                                                  new_module)
+                    new_module.add_function(new_function)
+                    return []
+            port_idx = 1
+            if desc.name in f_map:
+                if port_prefix in f_map[desc.name]:
+                    port_idx =  f_map[desc.name][port_prefix]
+            port_name = "%s_%d" % (port_prefix, port_idx)
+            new_function = build_function(old_function, port_name, new_module)
+            new_module.add_function(new_function)
+            return []
+
+        return remap
+                    
+    def process_ports(desc, port_type):
+        if port_type == 'input':
+            remap_dict_key = 'dst_port_remap'
+        else:
+            remap_dict_key = 'src_port_remap'
+        ports = get_port_specs(desc, port_type)
+        port_nums = {}
+        for port_name, port_spec in ports.iteritems():
+            # FIXME just start at 1 and go until don't find port (no
+            # need to track max)?
+            search_res = uscore_num.search(port_name)
+            if search_res:
+                port_prefix = search_res.group(1)
+                port_num = int(search_res.group(2))
+                if port_prefix not in port_nums:
+                    port_nums[port_prefix] = port_num
+                elif port_num > port_nums[port_prefix]:
+                    port_nums[port_prefix] = port_num
+        if desc.name not in _remap:
+            _remap[desc.name] = [(None, '0.9.3', None, dict())]
+        for port_prefix, port_num in port_nums.iteritems():
+            my_remap_dict = _remap[desc.name][0][3]
+            if remap_dict_key not in my_remap_dict:
+                my_remap_dict[remap_dict_key] = dict()
+            remap = build_remap_method(desc, port_prefix, port_num, port_type)
+            my_remap_dict[remap_dict_key][port_prefix] = remap
+            if port_type == 'input':
+                remap = build_function_remap_method(desc, port_prefix, port_num)
+                if 'function_remap' not in my_remap_dict:
+                    my_remap_dict['function_remap'] = {}
+                my_remap_dict['function_remap'][port_prefix] = remap
+
+    pkg = reg.get_package_by_name(identifier)
+    if module_name is not None:
+        # print 'building remap for', module_name
+        desc = reg.get_descriptor_by_name(identifier, module_name)
+        process_ports(desc, 'input')
+        process_ports(desc, 'output')
+    else:
+        # print 'building entire remap'
+        # FIXME do this by descriptor first, then build the hierarchies for each
+        # module after that...
+        for desc in pkg.descriptor_list:
+            process_ports(desc, 'input')
+            process_ports(desc, 'output')    
+
+def handle_module_upgrade_request(controller, module_id, pipeline):
+    global _remap, _controller, _pipeline
+    reg = get_module_registry()
+    if _remap is None:
+        _remap = {}
+    
+    _controller = controller
+    _pipeline = pipeline
+    module_name = pipeline.modules[module_id].name
+    if module_name not in _remap:
+        build_remap(module_name)
+    return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline,
+                                              _remap)
diff --git a/vistrails/packages/vtk/inspectors.py b/vistrails/packages/vtk/inspectors.py
new file mode 100644
index 0000000..2cd770b
--- /dev/null
+++ b/vistrails/packages/vtk/inspectors.py
@@ -0,0 +1,244 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+##############################################################################
+# Data inspectors for VTK
+from vistrails.core.modules.vistrails_module import ModuleError
+from vistrails.core.utils import VistrailsInternalError
+from vistrails.core.modules.basic_modules import Module, Float, Integer
+from vistrails.core.modules.module_registry import get_module_registry
+import vtk
+from base_module import vtkBaseModule
+from hasher import vtk_hasher
+from identifiers import identifier as vtk_pkg_identifier
+
+class vtkBaseInspector(Module):
+
+    @classmethod
+    def register_self(cls, **kwargs):
+        registry = get_module_registry()
+        def resolve_type(t):
+            if isinstance(t, tuple):
+                return registry.get_descriptor_by_name(*t).module
+            elif isinstance(t, type):
+                return t
+            else:
+                assert False, ("Unknown type " + str(type(t)))
+
+        registry.add_module(cls, **kwargs)
+        try:
+            ips = cls.input_ports
+        except AttributeError:
+            pass
+        else:
+            for (port_name, types) in ips:
+                registry.add_input_port(cls,
+                                        port_name,
+                                        list(resolve_type(t) for t in types))
+
+        try:
+            ops = cls.output_ports
+        except AttributeError:
+            pass
+        else:
+            for (port_name, types) in ops:
+                registry.add_output_port(cls,
+                                         port_name,
+                                         list(resolve_type(t) for t in types))
+
+    def auto_set_results(self, vtk_object):
+        for function in self.outputPorts.keys():
+            if hasattr(vtk_object, function):
+                retValues = getattr(vtk_object, function)()
+                if issubclass(retValues.__class__, vtk.vtkObject):
+                    className = retValues.GetClassName()
+                    output  = vtkBaseModule.wrapperModule(className, retValues)
+                    self.setResult(function, output)
+                elif isinstance(retValues, (tuple, list)):
+                    result = list(retValues)
+                    for i in xrange(len(result)):
+                        if issubclass(result[i].__class__, vtk.vtkObject):
+                            className = result[i].GetClassName()
+                            result[i] = vtkBaseModule.wrapperModule(className,
+                                                                    result[i])
+                    self.setResult(function, type(retValues)(result))
+                else:
+                    self.setResult(function, retValues)
+
+class vtkDataSetInspector(vtkBaseInspector):
+
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInputConnection0"):
+            ic = self.getInputFromPort("SetInputConnection0")
+            port_object = ic.vtkInstance
+            ix = port_object.GetIndex()
+            producer = port_object.GetProducer()
+            try:
+                vtk_object = producer.GetOutput()
+            except AttributeError:
+                raise ModuleError(self, 
+                                  "expected a module that supports GetOutput")
+        elif self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInputConnection0',
+                    [(vtk_pkg_identifier, 'vtkAlgorithmOutput')]),
+                   ('SetInput',
+                    [(vtk_pkg_identifier, 'vtkDataSet')]),
+                   ]
+    output_ports = [('GetBounds', [Float] * 6),
+                    ('GetScalarRange', [Float] * 2),
+                    ('GetLength', [Float]),
+                    ('GetCenter', [Float] * 3),
+                    ('GetNumberOfPoints', [Integer]),
+                    ('GetNumberOfCells', [Integer]),
+                    ('GetPointData', 
+                     [(vtk_pkg_identifier, 'vtkPointData')]),
+                    ('GetCellData',
+                     [(vtk_pkg_identifier, 'vtkCellData')]),
+                    ]
+
+class vtkDataSetAttributesInspector(vtkBaseInspector):
+    
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInput',
+                    [(vtk_pkg_identifier, 'vtkDataSetAttributes')]),
+                   ]
+    output_ports = [('GetScalars', 
+                     [(vtk_pkg_identifier, 'vtkDataArray')]),
+                    ('GetVectors', 
+                     [(vtk_pkg_identifier, 'vtkDataArray')]),
+                    ('GetNormals', 
+                     [(vtk_pkg_identifier, 'vtkDataArray')]),
+                    ('GetTCoords', 
+                     [(vtk_pkg_identifier, 'vtkDataArray')]),
+                    ('GetTensors', 
+                     [(vtk_pkg_identifier, 'vtkDataArray')]),
+                    ('GetGlobalIds', 
+                     [(vtk_pkg_identifier, 'vtkDataArray')]),
+                    ('GetPedigreeIds', 
+                     [(vtk_pkg_identifier, 'vtkAbstractArray')]),
+                    ]
+
+class vtkDataArrayInspector(vtkBaseInspector):
+
+   def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+   input_ports = [('SetInput',
+                   [(vtk_pkg_identifier, 'vtkDataArray')])]
+   output_ports = [('GetMaxNorm', [Float]),
+                   ('GetRange', [Float] * 2)]
+                   
+class vtkPolyDataInspector(vtkDataSetInspector):
+
+    def compute(self):
+        vtk_object = None
+        if self.hasInputFromPort("SetInputConnection0"):
+            ic = self.getInputFromPort("SetInputConnection0")
+            port_object = ic.vtkInstance
+            ix = port_object.GetIndex()
+            producer = port_object.GetProducer()
+            try:
+                vtk_object = producer.GetOutput()
+            except AttributeError:
+                raise ModuleError(self, 
+                                  "expected a module that supports GetOutput")
+        elif self.hasInputFromPort("SetInput"):
+            port_object = self.getInputFromPort("SetInput")
+            if hasattr(port_object, "vtkInstance"):
+                vtk_object = port_object.vtkInstance
+            else:
+                raise ModuleError(self, "expected a vtk module")
+        if vtk_object:
+            self.auto_set_results(vtk_object)
+
+    input_ports = [('SetInputConnection0',
+                    [(vtk_pkg_identifier, 'vtkAlgorithmOutput')]),
+                   ('SetInput',
+                    [(vtk_pkg_identifier, 'vtkDataSet')]),
+                   ]
+    output_ports = [('GetVerts',
+                     [(vtk_pkg_identifier, 'vtkCellArray')]),
+                    ('GetLines',
+                     [(vtk_pkg_identifier, 'vtkCellArray')]),
+                    ('GetPolys',
+                     [(vtk_pkg_identifier, 'vtkCellArray')]),
+                    ('GetStrips',
+                     [(vtk_pkg_identifier, 'vtkCellArray')]),
+                    ('GetPoints',
+                     [(vtk_pkg_identifier, 'vtkPoints')]),
+                    ('GetNumberOfVerts', [Integer]),
+                    ('GetNumberOfLines', [Integer]),
+                    ('GetNumberOfPolys', [Integer]),
+                    ('GetNumberOfStrips', [Integer]),
+                    ]
+
+def initialize():
+    vtkBaseInspector.register_self(abstract=True, signatureCallable=vtk_hasher)
+    vtkDataSetInspector.register_self(abstract=False, 
+                                      signatureCallable=vtk_hasher)
+    vtkDataSetAttributesInspector.register_self(abstract=False, 
+                                                signatureCallable=vtk_hasher)
+    vtkDataArrayInspector.register_self(abstract=False, 
+                                        signatureCallable=vtk_hasher)
+    vtkPolyDataInspector.register_self(abstract=False,
+                                       signatureCallable=vtk_hasher)
+    
diff --git a/vistrails/packages/vtk/offscreen.py b/vistrails/packages/vtk/offscreen.py
new file mode 100644
index 0000000..f8b2d15
--- /dev/null
+++ b/vistrails/packages/vtk/offscreen.py
@@ -0,0 +1,87 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import vtk
+from identifiers import identifier as vtk_pkg_identifier
+
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.modules.vistrails_module import Module
+from vistrails.core.modules.basic_modules import File, Integer
+from vistrails.core import system
+
+class VTKRenderOffscreen(Module):
+
+    def compute(self):
+        r = self.getInputFromPort("renderer").vtkInstance
+        window = vtk.vtkRenderWindow()
+        w = self.forceGetInputFromPort("width", 512)
+        h = self.forceGetInputFromPort("height", 512)
+        window.OffScreenRenderingOn()
+        window.SetSize(w, h)
+        # r.ResetCamera()
+
+        widget = None
+        if system.systemType=='Darwin':
+            from PyQt4 import QtCore, QtGui
+            widget = QtGui.QWidget(None, QtCore.Qt.FramelessWindowHint)
+            widget.resize(w, h)
+            widget.show()
+            window.SetWindowInfo(str(int(widget.winId())))    
+       
+        window.AddRenderer(r)
+#        window.Start()
+        window.Render()
+        win2image = vtk.vtkWindowToImageFilter()
+        win2image.SetInput(window)
+        win2image.Update()
+        writer = vtk.vtkPNGWriter()
+        writer.SetInput(win2image.GetOutput())
+        output = self.interpreter.filePool.create_file(suffix='.png')
+        writer.SetFileName(output.name)
+        writer.Write()
+        window.Finalize()
+        if widget!=None:
+            widget.close()
+        self.setResult("image", output)
+
+def register_self():
+    registry = get_module_registry()
+    r = registry.get_descriptor_by_name(vtk_pkg_identifier, 
+                                        'vtkRenderer').module
+    registry.add_module(VTKRenderOffscreen)
+    registry.add_input_port(VTKRenderOffscreen, 'renderer', r)
+    registry.add_input_port(VTKRenderOffscreen, 'width', Integer)
+    registry.add_input_port(VTKRenderOffscreen, 'height', Integer)
+    registry.add_output_port(VTKRenderOffscreen, 'image', File)
+
diff --git a/vistrails/packages/vtk/tf_widget.py b/vistrails/packages/vtk/tf_widget.py
new file mode 100644
index 0000000..b5ebc7e
--- /dev/null
+++ b/vistrails/packages/vtk/tf_widget.py
@@ -0,0 +1,736 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+##############################################################################
+# Transfer Function Widget for VTK
+from PyQt4 import QtCore, QtGui
+from vistrails.gui.modules.constant_configuration import ConstantWidgetMixin
+from vistrails.core.modules.basic_modules import new_constant, init_constant, Module
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.system import get_elementtree_library
+from vistrails.core.utils.color import ColorByName
+import vtk
+import math
+import pickle
+import copy
+import StringIO
+import unittest
+ElementTree = get_elementtree_library()
+
+from identifiers import identifier as vtk_pkg_identifier
+
+################################################################################
+# etc
+
+def clamp(v, mn, mx, eps=0.0):
+    mne = mn + eps
+    mxe = mx - eps
+    if v < mne: return mn
+    if v > mxe: return mx
+    return v
+# Because of a Qt bug see 
+# http://bugreports.qt.nokia.com/browse/QTBUG-17985
+# We cannot set the scene from 0 to 1. In this case we will set it
+# 4000 x 4000 with GLOBAL_SCALE. When the bug is fixed, just set it to 1.0
+
+GLOBAL_SCALE = 4000.0
+##############################################################################
+# Transfer Function object
+
+class TransferFunction(object):
+
+    def __init__(self):
+        self._min_range = 0.0
+        self._max_range = 1.0
+        self._pts = []
+
+    def set_range(self, mn, mx):
+        self._min_range = mn
+        self._max_range = mx
+
+    def set_on_vtk_volume_property(self, vtk_volume_property):
+        # Builds the opacity and color functions
+        of = vtk.vtkPiecewiseFunction()
+        cf = vtk.vtkColorTransferFunction()
+        vp = vtk_volume_property
+        for pt in self._pts:
+            (scalar, opacity, color) = pt
+            # Map scalar to tf range
+            s = self._min_range + (self._max_range - self._min_range) * scalar
+            of.AddPoint(s, opacity)
+            cf.AddRGBPoint(s, color[0], color[1], color[2])
+        vp.SetScalarOpacity(of)
+        vp.SetColor(cf)
+
+    def get_vtk_transfer_functions(self):
+        of = vtk.vtkPiecewiseFunction()
+        cf = vtk.vtkColorTransferFunction()
+        for pt in self._pts:
+            (scalar, opacity, color) = pt
+            # Map scalar to tf range
+            s = self._min_range + (self._max_range - self._min_range) * scalar
+            of.AddPoint(s, opacity)
+            cf.AddRGBPoint(s, color[0], color[1], color[2])
+        return (of,cf)
+    
+    def add_point(self, scalar, opacity, color):
+        self._pts.append((scalar, opacity, color))
+        self._pts.sort()
+
+    def get_value(self, scalar):
+        """get_value(scalar): returns the opacity and color
+        linearly interpolated at the value. Useful for
+        adding knots."""
+        ix = 0
+        while ix < len(self._pts) and self._pts[ix][0] > scalar:
+            ix += 1
+        if ix == 0:
+            return (self._pts[0][1], self._pts[0][2])
+        elif ix == len(self._pts):
+            return (self._pts[-1][1], self._pts[-1][2])
+        else:
+            u = ((self._pts[ix][0] - scalar) /
+                 (self._pts[ix][0] - self._pts[ix-1][0]))
+            do = self._pts[ix][1] - self._pts[ix-1][1]
+            dr = self._pts[ix][2][0] - self._pts[ix-1][2][0]
+            dg = self._pts[ix][2][1] - self._pts[ix-1][2][1]
+            db = self._pts[ix][2][2] - self._pts[ix-1][2][2]
+            return (self._pts[ix-1][1] + u * do,
+                    (self._pts[ix-1][2][0] + u * dr,
+                     self._pts[ix-1][2][1] + u * dg,
+                     self._pts[ix-1][2][2] + u * db))
+
+    def __copy__(self):
+        result = TransferFunction()
+        result._min_range = self._min_range
+        result._max_range = self._max_range
+        result._pts = copy.copy(self._pts)
+        return result
+
+    def __eq__(self, other):
+        if type(other) != type(self):
+            return False
+        if self._min_range != other._min_range:
+            return False
+        if self._max_range != other._max_range:
+            return False
+        for my_pt, other_pt in zip(self._pts, other._pts):
+            if my_pt != other_pt:
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def serialize(self, node=None):
+        """serialize(node: ElementTree.Element) -> str
+        Convert this object to an XML representation in string format.
+        """
+        if node is None:
+            node = ElementTree.Element('transfer_function')
+            
+        node.set('min_range', str(self._min_range))
+        node.set('max_range', str(self._max_range))
+        for pt in self._pts:
+            ptNode = ElementTree.SubElement(node, 'point')
+            ptNode.set('scalar', str(pt[0]))
+            ptNode.set('opacity', str(pt[1]))
+            color = pt[2]
+            colorNode = ElementTree.SubElement(ptNode, 'color')
+            colorNode.set('R', str(color[0]))
+            colorNode.set('G', str(color[1]))
+            colorNode.set('B', str(color[2]))
+            
+        return ElementTree.tostring(node)
+   
+    @staticmethod         
+    def parse(strNode):
+        """parse(strNode: str) -> TransferFunction
+        Parses a string representing a TransferFunction and returns a 
+        TransferFunction object 
+        """
+        try:
+            node = ElementTree.fromstring(strNode)
+        except SyntaxError:
+            #it was serialized using pickle
+            class FixUnpickler(pickle.Unpickler):
+                def find_class(self, module, name):
+                    if module == 'packages.vtk.tf_widget':
+                        module = 'vistrails.packages.vtk.tf_widget'
+                    return pickle.Unpickler.find_class(self, module, name)
+            tf = FixUnpickler(StringIO.StringIO(strNode.decode('hex'))).load()
+            tf._pts.sort()
+            return tf
+        
+        if node.tag != 'transfer_function':
+            return None
+        #read attributes
+        tf = TransferFunction()
+        tf._min_range = float(node.get('min_range', "0.0")) 
+        tf._max_range = float(node.get('max_range', "1.0"))
+        for ptNode in node.getchildren():
+            if ptNode.tag == 'point':
+                scalar = float(ptNode.get('scalar','-1.0'))
+                opacity = float(ptNode.get('opacity', '1.0'))
+                for colorNode in ptNode.getchildren():
+                    if colorNode.tag == 'color':
+                        color = (float(colorNode.get('R','0.0')),
+                                 float(colorNode.get('G','0.0')),
+                                 float(colorNode.get('B','0.0')))
+                        break
+                tf._pts.append((scalar,opacity,color))
+        tf._pts.sort()
+        return tf
+    
+##############################################################################
+# Graphics Items
+
+class TransferFunctionPoint(QtGui.QGraphicsEllipseItem):
+
+    selection_pens = { True: QtGui.QPen(QtGui.QBrush(
+        QtGui.QColor(*(ColorByName.get_int('goldenrod_medium')))),GLOBAL_SCALE * 0.012),
+                       False: QtGui.QPen() }
+
+    def __init__(self, scalar, opacity, color, parent=None):
+        QtGui.QGraphicsEllipseItem.__init__(self, parent)
+        self._scalar = scalar
+        self._opacity = opacity
+        self._color = QtGui.QColor(color[0]*255,
+                                   color[1]*255,
+                                   color[2]*255)
+        self.setPen(QtGui.QPen(QtGui.QColor(0,0,0)))
+        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
+        self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable) 
+        if QtCore.QT_VERSION >= 0x40600:
+            self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges)
+        self.setZValue(2.0)
+
+        self._sx = 1.0
+        self._sy = 1.0
+        # fixed scale
+        self._fsx = GLOBAL_SCALE
+        self._fsy  = GLOBAL_SCALE
+        self._left_line = None
+        self._right_line = None
+        self._point = QtCore.QPointF(scalar * self._fsx, opacity * self._fsy)
+        self.refresh()
+
+        self.setToolTip("Double-click to change color\n"
+                        "Right-click to remove point\n"
+                        "Scalar: %.5f, Opacity: %.5f" % (self._scalar,
+                                                         self._opacity))
+        # This sets up the linked list of Lines
+
+    def keyPressEvent(self, event):
+        if event.key() == QtCore.Qt.Key_Backspace or \
+           event.key() == QtCore.Qt.Key_Delete:
+            self.remove_self()
+
+    def refresh(self):
+        dx = self._fsx * 0.025 / self._sx
+        dy = self._fsy * 0.025/ self._sy
+        # this is the setup
+        self.setBrush(QtGui.QBrush(self._color))
+        self.setRect(-dx,
+                     -dy,
+                     2 * dx, 2 * dy)
+        self.setPos(self._fsx * self._scalar,
+                    self._fsy * self._opacity)
+        self.update()
+
+    def update_scale(self, sx, sy):
+        self._sx = sx
+        self._sy = sy
+        self.refresh()
+
+    def itemChange(self, change, value):
+        if change == QtGui.QGraphicsItem.ItemSelectedChange:
+            self.setPen(self.selection_pens[value])
+        if change == QtGui.QGraphicsItem.ItemPositionChange:
+            # moves point
+            # value is now a QPointF, not a QPoint so no conversion needed
+            pt = value
+            pt.setY(clamp(pt.y(), 0.0, 1.0 * self._fsy) )
+            self._opacity = pt.y() / self._fsy
+            self._point.setY(pt.y())
+            if not self._left_line:
+                pt.setX(0.0)
+            elif not self._right_line:
+                pt.setX(1.0 * self._fsx)
+            else:
+                assert self._left_line._point_right == self
+                assert self._right_line._point_left == self
+                pt.setX(clamp(pt.x(),
+                              self._left_line._point_left._point.x(),
+                              self._right_line._point_right._point.x(),
+                              1e-6))
+                self._point.setX(pt.x())
+                self._scalar = pt.x() / self._fsx
+            if self._left_line:
+                self._left_line.refresh()
+            if self._right_line:
+                self._right_line.refresh()
+            if self.scene():
+                self.scene()._tf_poly.setup()
+            self.setToolTip("Double-click to change color\n"
+                        "Right-click to remove point\n"
+                        "Scalar: %.5f, Opacity: %.5f" % (self._scalar,
+                                                         self._opacity))
+            return QtGui.QGraphicsItem.itemChange(self, change, pt)
+        return QtGui.QGraphicsItem.itemChange(self, change, value)
+
+    def remove_self(self):
+        if not self._left_line or not self._right_line:
+            # Ignore, self is a corner node that can't be removed
+            return
+        
+        # Removes the right line and self, re-ties data structure
+        self._left_line._point_right = self._right_line._point_right
+        self._left_line._point_right._left_line = self._left_line
+        
+        # be friends with garbage collector
+        self._right_line._point_left = None
+        self._right_line._point_right = None
+        self.scene()._tf_poly.setup()
+        self.scene().removeItem(self._right_line)
+        self.scene().removeItem(self)
+        self._left_line.refresh()
+
+    def mouseDoubleClickEvent(self, event):
+        new_color = QtGui.QColorDialog.getColor(self._color)
+        if not new_color.isValid():
+            return
+        self._color = new_color
+        if self._left_line:
+            self._left_line.refresh()
+        if self._right_line:
+            self._right_line.refresh()
+        self.refresh()
+        self.scene()._tf_poly.setup()
+        QtGui.QGraphicsEllipseItem.mouseDoubleClickEvent(self, event)
+
+    def mousePressEvent(self, event):
+        if event.button() == QtCore.Qt.RightButton:
+            event.accept()
+            self.remove_self()
+        else:
+            QtGui.QGraphicsEllipseItem.mousePressEvent(self, event)
+        
+    def paint(self, painter, option, widget=None):
+        """ paint(painter: QPainter, option: QStyleOptionGraphicsItem,
+                  widget: QWidget) -> None
+        Peform painting of the point without the ugly default dashed-line black
+        square
+        
+        """
+        painter.setBrush(self.brush())
+        painter.setPen(self.pen())
+        painter.drawEllipse(self.rect())
+        
+    def add_self_to_transfer_function(self, tf):
+        tf.add_point(self._scalar,
+                     self._opacity,
+                     (self._color.redF(),
+                      self._color.greenF(),
+                      self._color.blueF()))
+
+class TransferFunctionPolygon(QtGui.QGraphicsPolygonItem):
+
+    def __init__(self):
+        QtGui.QGraphicsPolygonItem.__init__(self)
+
+    def setup(self):
+        # This inspects the scene, finds the left-most point, and
+        # then builds the polygon traversing the linked list structure
+        if not self.scene():
+            return
+        pt = self.scene().get_leftmost_point()
+        first_pt = pt
+        self.setZValue(1.25)
+        g = QtGui.QLinearGradient()
+        g.setStart(0.0, 0.5)
+        g.setFinalStop(1.0, 0.5)
+        g.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)
+        p = QtGui.QPen()
+        p.setStyle(QtCore.Qt.NoPen)
+        pts = [QtCore.QPointF(pt.x(), 0)]
+        self.setPen(p)
+        while 1:
+            c = QtGui.QColor(pt._color)
+            c.setAlphaF(pt._opacity)
+            g.setColorAt(pt._scalar, c)
+            pts.append(pt._point)
+            # move cursor fwd
+            if pt._right_line:
+                pt = pt._right_line._point_right
+            else:
+                break
+        self.setBrush(QtGui.QBrush(g))
+        pts.append(QtCore.QPointF(pt._point.x(), 0))
+        polygon = QtGui.QPolygonF(pts)
+        self.setPolygon(polygon)
+
+class TransferFunctionLine(QtGui.QGraphicsPolygonItem):
+
+    def __init__(self, point_left, point_right, parent=None):
+        assert point_right._scalar >= point_left._scalar
+        QtGui.QGraphicsPolygonItem.__init__(self, parent)
+        self._point_left = point_left
+        self._point_right = point_right
+        self._point_left._right_line = self
+        self._point_right._left_line = self
+        self.setup(1.0, 1.0)
+        self._sx = 1.0
+        self._sy = 1.0
+        # fixed scale
+        self._fsx = GLOBAL_SCALE
+        self._fsy  = GLOBAL_SCALE
+        self.setToolTip('')
+        
+    def setup(self, sx, sy):
+        d = self._point_right._point - self._point_left._point
+        d_normal = QtCore.QPointF(d.y(), -d.x())
+        l = math.sqrt(d.x() * d.x() + d.y() * d.y())
+        if l != 0.0:
+            d_normal /= l
+            d_normal *= GLOBAL_SCALE * 0.010
+            d_normal.setX(d_normal.x() / sx)
+            d_normal.setY(d_normal.y() / sy)
+        ps = [self._point_left._point + d_normal,
+              self._point_right._point + d_normal,
+              self._point_right._point - d_normal,
+              self._point_left._point - d_normal]
+        self.setPolygon(QtGui.QPolygonF(ps))
+        self.setZValue(1.5)
+        # Gradient for filling
+        g = QtGui.QLinearGradient()
+        g.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)
+        g.setStart(self._point_left._scalar, self._point_left._opacity)
+        g.setFinalStop(self._point_right._scalar, self._point_right._opacity)
+        g.setColorAt(0.0, self._point_left._color)
+        g.setColorAt(1.0, self._point_right._color)
+        self.setBrush(QtGui.QBrush(g))
+        # Gradient for outlining
+        g = QtGui.QLinearGradient()
+        g.setStart(self._point_left._point)
+        g.setFinalStop(self._point_right._point)
+        dark_pl = QtGui.QColor(self._point_left._color.red() * 0.5,
+                               self._point_left._color.green() * 0.5,
+                               self._point_left._color.blue() * 0.5)
+        dark_pr = QtGui.QColor(self._point_right._color.red() * 0.5,
+                               self._point_right._color.green() * 0.5,
+                               self._point_right._color.blue() * 0.5)
+        g.setColorAt(0.0, dark_pl)
+        g.setColorAt(1.0, dark_pr)
+        p = QtGui.QPen()
+        p.setBrush(QtGui.QBrush(g))
+        self.setPen(p)
+
+    def update_scale(self, sx, sy):
+        self._sx = sx
+        self._sy = sy
+        self.refresh()
+
+    def refresh(self):
+        self.setup(self._sx, self._sy)
+
+    def mouseDoubleClickEvent(self, event):
+        p = event.scenePos()
+        c_left = self._point_left._color
+        c_right = self._point_right._color
+        u = ((p.x() - self._point_left._point.x()) /
+             (self._point_right._point.x() - self._point_left._point.x()))
+        new_c = (u * c_right.redF() + (1-u) * c_left.redF(),
+                 u * c_right.greenF() + (1-u) * c_left.greenF(),
+                 u * c_right.blueF() + (1-u) * c_left.blueF())
+        new_point = TransferFunctionPoint(p.x()/ self._fsx, p.y()/self._fsy, new_c)
+        new_line = TransferFunctionLine(new_point, self._point_right)
+        new_point._left_line = self
+        self._point_right = new_point
+        self.scene().addItem(new_line)
+        self.scene().addItem(new_point)
+        new_line.update_scale(self._point_left._sx,
+                              self._point_left._sy)
+        new_point.update_scale(self._point_left._sx,
+                               self._point_left._sy)
+        new_point.refresh()
+        self.refresh()
+
+    def mousePressEvent(self, event):
+        # This needs to be here, otherwise mouseDoubleClickEvent does
+        # not get called.
+        event.accept()
+        
+
+##############################################################################
+# Scene, view, widget
+
+class TransferFunctionScene(QtGui.QGraphicsScene):
+
+    def __init__(self, tf, parent=None):
+        QtGui.QGraphicsScene.__init__(self, parent)
+        self._tf_items = []
+        poly = TransferFunctionPolygon()
+        poly.setup()
+        self._tf_poly = poly
+        self.addItem(poly)
+        self.create_tf_items(tf)
+        self._tf_poly.setup()
+        #current scale
+        self._sx = 1.0
+        self._sy = 1.0    
+        # Add outlines
+        line_color = QtGui.QColor(200, 200, 200)
+        pen = QtGui.QPen(line_color)
+        ps = [QtCore.QPointF(0.0, 0.0),
+              QtCore.QPointF(GLOBAL_SCALE, 0.0),
+              QtCore.QPointF(GLOBAL_SCALE, GLOBAL_SCALE),
+              QtCore.QPointF(0.0, GLOBAL_SCALE)]
+        outline = QtGui.QPolygonF(ps)
+        self.addPolygon(outline, pen)
+
+        for i in xrange(51):
+            u = GLOBAL_SCALE * float(i) / 50.0
+            self.addLine(QtCore.QLineF(u, 0.0, u, GLOBAL_SCALE), pen)
+            self.addLine(QtCore.QLineF(0.0, u, GLOBAL_SCALE, u), pen)
+
+    def reset_transfer_function(self, tf):
+        self.create_tf_items(tf)
+        self.update_scale(self._sx, self._sy)
+        self._tf_poly.setup()
+        
+    def removeItem(self, item):
+        if item in self._tf_items:
+            self._tf_items.remove(item)
+        QtGui.QGraphicsScene.removeItem(self, item)
+
+    def addItem(self, item):
+        # Ugly, but hey
+        if isinstance(item, TransferFunctionLine) or \
+           isinstance(item, TransferFunctionPoint):
+            self._tf_items.append(item)
+        QtGui.QGraphicsScene.addItem(self, item)
+
+    def create_tf_items(self, tf):
+        items = copy.copy(self._tf_items)
+        for item in items:
+            self.removeItem(item)
+        self._tf_items = []
+        if len(tf._pts) == 0:
+            pt_left = TransferFunctionPoint(0.0, 0.0, (0.0, 0.0, 0.0))
+            pt_right = TransferFunctionPoint(1.0, 0.0, (0.0, 0.0, 0.0))
+            line = TransferFunctionLine(pt_left, pt_right)
+            
+            self.addItem(pt_left)
+            self.addItem(pt_right)
+            self.addItem(line)
+            
+        else:
+            pts = [TransferFunctionPoint(*pt)
+                   for pt in tf._pts]
+            lines = [TransferFunctionLine(pt_l, pt_r)
+                     for (pt_l, pt_r) in zip(pts[:-1], pts[1:])]
+            for pt in pts:
+                self.addItem(pt)
+            for line in lines:
+                self.addItem(line)
+
+    def add_knot(self, scalar, opacity):
+        pass
+
+    def update_scale(self, sx, sy):
+        for item in self._tf_items:
+            item.update_scale(sx, sy)
+        self._sx = sx
+        self._sy = sy
+
+    def get_leftmost_point(self):
+        pt = None
+        
+        for item in self._tf_items:
+            if hasattr(item, '_left_line') and not item._left_line:
+                pt = item
+                break
+        assert pt
+        return pt        
+
+    def get_transfer_function(self):
+        result = TransferFunction()
+        pt = self.get_leftmost_point()
+        while 1:
+            pt.add_self_to_transfer_function(result)
+            if pt._right_line:
+                pt = pt._right_line._point_right
+            else:
+                break
+        return result
+
+class TransferFunctionView(QtGui.QGraphicsView):
+    def __init__(self, parent=None):
+        QtGui.QGraphicsView.__init__(self, parent)
+        self.setRenderHint(QtGui.QPainter.Antialiasing)
+        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        
+    def resizeEvent(self, event):
+        self.resetMatrix()
+        self.setMatrix(QtGui.QMatrix(event.size().width() / (GLOBAL_SCALE *10.0/9) , 0,
+                                     0, -event.size().height() / (GLOBAL_SCALE*10.0/9), 0, 0))
+        self.scene().update_scale(event.size().width()/(2000.0/9), event.size().height()/(2000.0/9))
+        
+    def focusOutEvent(self, event):
+        self.parent().update_parent()
+        QtGui.QGraphicsView.focusOutEvent(self, event)
+
+default_tf = TransferFunction()
+default_tf.add_point(0.0, 0.0, (0.0, 0.0, 0.0))
+default_tf.add_point(1.0, 0.0, (0.0, 0.0, 0.0))
+    
+class TransferFunctionWidget(QtGui.QWidget, ConstantWidgetMixin):
+
+    def __init__(self, param, parent=None):
+        QtGui.QWidget.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        if not param.strValue:
+            self._tf = copy.copy(default_tf)
+        else:
+            self._tf = TransferFunction.parse(param.strValue)
+        self._scene = TransferFunctionScene(self._tf, self)
+        layout = QtGui.QVBoxLayout()
+        self.setLayout(layout)
+        self._view = TransferFunctionView(self)
+        self._view.setScene(self._scene)
+        self._view.setMinimumSize(200,200)
+        self._view.setMaximumHeight(280)
+        self._view.show()
+        self._view.setSizePolicy(QtGui.QSizePolicy.Expanding,
+                                 QtGui.QSizePolicy.Expanding)
+        self._view.setMatrix(QtGui.QMatrix(1, 0, 0, -1, 0, 0))
+        self.setMinimumSize(260,240)
+        caption = QtGui.QLabel("Double-click on the line to add a point")
+        font = QtGui.QFont('Arial', 11)
+        font.setItalic(True)
+        caption.setFont(font)
+        layout.addWidget(self._view)
+        layout.addWidget(caption)
+
+    def contents(self):
+        return self._scene.get_transfer_function().serialize()
+    
+    def setContents(self, strValue, silent=True):
+        if not strValue:
+            self._tf = copy.copy(default_tf)
+        else:
+            self._tf = TransferFunction.parse(strValue)
+        self._scene.reset_transfer_function(self._tf)
+        if not silent:
+            self.update_parent()    
+            
+##############################################################################
+# Helper module to adjust range
+
+class vtkScaledTransferFunction(Module):
+
+    def compute(self):
+        reg = get_module_registry()
+        tf = self.getInputFromPort('TransferFunction')
+        new_tf = copy.copy(tf)
+        if self.hasInputFromPort('Input'):
+            port = self.getInputFromPort('Input')
+            algo = port.vtkInstance.GetProducer()
+            output = algo.GetOutput(port.vtkInstance.GetIndex())
+            (new_tf._min_range, new_tf._max_range) = output.GetScalarRange()
+        elif self.hasInputFromPort('Dataset'):
+            algo = self.getInputFromPort('Dataset').vtkInstance
+            output = algo
+            (new_tf._min_range, new_tf._max_range) = output.GetScalarRange()
+        else:
+            (new_tf._min_range, new_tf._max_range) = self.getInputFromPort('Range')
+            
+        self.setResult('TransferFunction', new_tf)
+        (of,cf) = new_tf.get_vtk_transfer_functions()
+        
+        of_module = reg.get_descriptor_by_name(vtk_pkg_identifier, 
+                                               'vtkPiecewiseFunction').module()
+        of_module.vtkInstance  = of
+        
+        cf_module = reg.get_descriptor_by_name(vtk_pkg_identifier, 
+                                               'vtkColorTransferFunction').module()
+        cf_module.vtkInstance  = cf
+        
+        self.setResult('vtkPicewiseFunction', of_module)
+        self.setResult('vtkColorTransferFunction', cf_module)
+
+string_conversion = staticmethod(lambda x: x.serialize())
+conversion = staticmethod(lambda x: TransferFunction.parse(x))
+validation = staticmethod(lambda x: isinstance(x, TransferFunction))
+TransferFunctionConstant = new_constant('TransferFunction',
+                                        conversion,
+                                        default_tf,
+                                        validation,
+                                        TransferFunctionWidget)
+TransferFunctionConstant.translate_to_string = string_conversion
+
+##############################################################################
+
+def initialize():
+    init_constant(TransferFunctionConstant)
+    
+##############################################################################
+class TestTransferFunction(unittest.TestCase):
+    def test_serialization(self):
+        tf = TransferFunction()
+        tf._min_range = 0.1
+        tf._max_range = 2.0
+        tf._pts.append((0.3,0.5,(1.0,1.0,1.0)))
+        tf._pts.append((0.6,0.7,(1.0,0.5,1.0)))
+        tf._pts.append((0.2,0.8,(1.0,0.0,1.0)))
+        tf._pts.sort()
+        
+        #simulate old serialization method
+        ser1 = pickle.dumps(tf).encode('hex')
+        
+        ser2 = tf.serialize()
+        
+        tf1 = TransferFunction.parse(ser1)
+        tf2 = TransferFunction.parse(ser2)
+        
+        assert tf == tf1
+        assert tf == tf2
+        assert tf1 == tf2
+        
+if __name__ == "__main__":
+    unittest.main()
diff --git a/vistrails/packages/vtk/vtk_parser.py b/vistrails/packages/vtk/vtk_parser.py
new file mode 100644
index 0000000..2306ad9
--- /dev/null
+++ b/vistrails/packages/vtk/vtk_parser.py
@@ -0,0 +1,548 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+# Author: Prabhu Ramachandran
+# Copyright (c) 2004, Enthought, Inc.
+# License: BSD Style.
+
+# Modified for VisTrails by the VisTrails team.
+
+"""This module parses the VTK methods, obtains the argument and return
+type information, and organizes them.
+
+"""
+import re
+import vtk
+import class_tree
+import vistrails.core.debug
+
+log      = vistrails.core.debug.log
+warning  = vistrails.core.debug.warning
+critical = vistrails.core.debug.critical
+debug    = vistrails.core.debug.debug
+
+class VTKMethodParser(object):
+    """This class provides useful methods for parsing methods of a VTK
+    class or instance.
+
+    The class allows one to categorize the methods of the VTK class
+    and also obtain the method signatures in a form that is easy to
+    use.  When the `parse` method is called, it in turn calls the
+    `_organize_methods` method.  This method organizes the VTK methods
+    into different instance variables described in the following.
+    `self.toggle_meths` contains a dictionary of all the boolean
+    methods of the form <Value>On/Off.  The dictionary keys are
+    strings with the <Value>'s and the value of each item is the
+    default value (0/1) of the item (the example below will clarify
+    this).  `self.state_meths` contains a dictionary which collects
+    the Set<Prop>To<Value> type of methods.  The key is the <Prop> and
+    the value is a list containing the different string <Value>'s and
+    their corresponding mapped value.  The first value in these is the
+    default value of the <Prop>.  `self.get_set_meths` will contain a
+    dictionary which collects all the methods of the form
+    Set/Get<Prop> that are not already specified in
+    `self.toggle_meths` or `self.state_meths`.  The default value of
+    the Get<Prop> is stored.  If the value accepted by the method has
+    a range (via the methods `Get<Prop>MinValue` and
+    `Get<Prop>MaxValue`), then that range is computed and stored.
+    `self.get_meths` stores the methods that are of the form
+    `Get<Prop>`.  `self.other_meths` stores the remaining methods.
+    The parsing is quite fast.  Parsing every class in the VTK API
+    takes a couple of seconds (on a Pentium III @ 450Mhz).
+
+    Here is an example::
+        
+       >>> import vtk
+       >>> p = VTKMethodParser()
+       >>> p.parse(vtk.vtkProperty)
+       >>> print p.get_toggle_methods()
+       {'EdgeVisibility': 0, 'BackfaceCulling': 0, 'FrontfaceCulling': 0}
+       >>> print p.get_state_methods()['Representation']
+       [['Surface', 2], ['Points', 0], ['Surface', 2], ['Wireframe', 1]]
+       >>> print p.get_get_set_methods()['Opacity']
+       (1.0, (0.0, 1.0))
+       >>> print p.get_get_methods()
+       ['GetClassName']
+       >>> print p.get_other_methods()[:3]
+       ['BackfaceRender', 'DeepCopy', 'IsA']
+
+
+    The class also provides a method called `get_method_signature`
+    that obtains the Python method signature given the VTK method
+    object.  Here is an example::
+    
+       >>> import vtk
+       >>> p = VTKMethodParser()
+       >>> o = vtk.vtkProperty
+       >>> print p.get_method_signature(o.GetClassName)
+       [(['string'], None)]
+       >>> print p.get_method_signature(o.GetColor)[0]
+       ([('float', 'float', 'float')], None)
+       >>> print p.get_method_signature(o.GetColor)[1]
+       ([None], (('float', 'float', 'float'),))
+
+    The `get_method_signature` is fairly efficient and obtaining the
+    signature for every method in every class in the VTK API takes
+    around 6 seconds (on a Pentium III @ 450Mhz).
+
+    """
+
+    def __init__(self, use_tree=True):
+        """Initializes the object.
+
+        Parameters
+        ----------
+
+        - use_tree : `bool`
+
+          If True (default), use a ClassTree instance to obtain a
+          concrete subclass for an abstract base class.  This is used
+          only to find the range and default values for some of the
+          methods.  If False, no ClassTree instance is created.
+
+          This is optional because, creating a ClassTree is expensive.
+          The parser functionality can be very useful even without the
+          use of a ClassTree.  For example, if one wants to save the
+          state of a VTK object one only needs to know the names of
+          the methods and not their default values, ranges etc.  In
+          that case using a parser should be cheap.
+
+        """
+        # The ClassTree is needed to find an instantiable child class
+        # for an abstract VTK parent class.  This instance is used to
+        # obtain the state values and the ranges of the arguments
+        # accepted by the Get/Set methods that have a
+        # Get<Prop>{MaxValue,MinValue} method.
+        if use_tree:
+            self._tree = class_tree.ClassTree(vtk)
+            self._tree.create()
+        else:
+            self._tree = None
+        self._state_patn = re.compile('To[A-Z0-9]')
+        self._initialize()
+
+    #################################################################
+    # 'VTKMethodParser' interface.
+    #################################################################
+
+    def parse(self, obj, no_warn=True):
+        """Parse the methods for a given VTK object/class.
+
+        Given a VTK class or object, this method parses the methods
+        and orgaizes them into useful categories.  The categories and
+        their usage is documented in the documentation for the class.
+
+        Parameters
+        ----------
+
+        - obj : VTK class or instance
+
+        - no_warn : `bool` (default: True)
+
+          If True (default), it suppresses any warnings generated by
+          the VTK object when parsing the methods.  This is safe to
+          use.
+        
+        """
+        if not hasattr(obj, '__bases__'):
+            klass = obj.__class__
+        else:
+            klass = obj
+
+        methods = self.get_methods(klass)
+
+        if no_warn:
+            # Save warning setting and shut it off before parsing.
+            warn = vtk.vtkObject.GetGlobalWarningDisplay()
+            if klass.__name__ <> 'vtkObject':
+                vtk.vtkObject.GlobalWarningDisplayOff()
+
+        self._organize_methods(klass, methods)
+
+        if no_warn:
+            # Reset warning status.
+            vtk.vtkObject.SetGlobalWarningDisplay(warn)
+
+    def get_methods(self, klass):
+        """Returns all the relevant methods of the given VTK class."""
+        methods = dir(klass)[:]
+        if hasattr(klass, '__members__'):
+            # Only VTK versions < 4.5 have these.
+            for m in klass.__members__:
+                methods.remove(m)
+
+        return methods
+
+    def get_toggle_methods(self):        
+        """Returns a dictionary of the parsed <Value>On/Off methods
+        along with the default value.
+
+        """
+        return self.toggle_meths
+    
+    def get_state_methods(self):
+        """Returns a dict of the parsed Set<Prop>To<Value>.
+
+        The keys are the <Prop> string with a list of the different
+        <Value> strings along with their corresponding value (if
+        obtainable).  The first value is the default value of the
+        state.
+        
+        """
+        return self.state_meths
+
+    def get_get_set_methods(self):
+        """Returns a dict of the parsed Get/Set<Value> methods.
+
+        The keys of the dict are the <Value> strings and contain a
+        two-tuple containing the default value (or None if it is not
+        obtainable for some reason) and a pair of numbers specifying
+        an acceptable range of values (or None if not obtainable).
+
+        """
+        return self.get_set_meths
+    
+    def get_get_methods(self):
+        """Return a list of parsed Get<Value> methods.
+
+        All of these methods do NOT have a corresponding Set<Value>.
+
+        """
+        return self.get_meths
+    
+    def get_other_methods(self):
+        """Return list of all other methods, that are not
+        categorizable.
+
+        """
+        return self.other_meths    
+
+    def get_method_signature(self, method):
+        """Returns information on the Python method signature given
+        the VTK method.
+
+        The doc string of the given method object to get the method
+        signature.  The method returns a list of tuples, each of which
+        contains 2 items, the first is a list representing the return
+        value the second represents the arguments to be passed to the
+        function.  If the method supports different return values and
+        arguments, this function returns all of their signatures.
+
+        Parameters
+        ----------
+
+        - method : `method`
+
+          A VTK method object.
+
+        """
+        doc = method.__doc__
+        doc = doc[:doc.find('\n\n')]
+        sig = doc.split('\n')
+        sig = [x.strip() for x in sig]
+
+        # Remove all the C++ function signatures.
+        for i in sig[:]:
+            if i[:4] == 'C++:':
+                sig.remove(i)
+
+        # Remove the V.<method_name>
+        sig = [x.replace('V.' + method.__name__, '') for x in sig]
+
+        pat = re.compile(r'\b')
+
+        # Split into [return_value, arguments] after processing them.
+        tmp = list(sig)
+        sig = []
+        for i in tmp:
+            # Split to get return values.
+            x = i.split('->')
+            # Strip each part.
+            x = [y.strip() for y in x]
+
+            if len(x) == 1: # No return value
+                x = [None, x[0]]
+            else:
+                x.reverse()
+
+            ret, arg = x        
+
+            # Remove leading and trailing parens for arguments.
+            arg = arg[1:-1]
+            if not arg:
+                arg = None
+            if arg and arg[-1] == ')':
+                arg = arg + ','
+
+            # Now quote the args and eval them.  Easy!
+            if ret:
+                ret = eval(pat.sub('\"', ret))
+            if arg:
+                arg = eval(pat.sub('\"', arg))
+                if isinstance(arg, basestring):
+                    arg = [arg]
+
+            sig.append(([ret], arg))
+
+        return sig
+
+    def get_tree(self):
+        """Return the ClassTree instance used by this class."""
+        return self._tree
+
+    #################################################################
+    # Non-public interface.
+    #################################################################
+
+    def _initialize(self):
+        """Initializes the method categories."""
+        # Collects the <Value>On/Off methods.
+        self.toggle_meths = {}
+        # Collects the Set<Prop>To<Value> methods.
+        self.state_meths = {}
+        # Collects the Set/Get<Value> pairs.
+        self.get_set_meths = {}
+        # Collects the Get<Value> methods.
+        self.get_meths = []
+        # Collects all the remaining methods.
+        self.other_meths = []
+
+    def _organize_methods(self, klass, methods):
+        """Organizes the given methods of a VTK class into different
+        categories.
+
+        Parameters
+        ----------
+
+        - klass : A VTK class
+
+        - methods : `list` of `str`
+
+          A list of the methods to be categorized.
+
+        """
+        self._initialize()
+        meths = methods[:]
+        meths = self._find_toggle_methods(klass, meths)
+        meths = self._find_state_methods(klass, meths)
+        meths = self._find_get_set_methods(klass, meths)
+        meths = self._find_get_methods(klass, meths)
+        self.other_meths = [x for x in meths if '__' not in x]
+
+    def _remove_method(self, meths, method):
+        try:
+            meths.remove(method)
+        except ValueError:
+            pass
+
+    def _find_toggle_methods(self, klass, methods):
+        """Find/store methods of the form <Value>{On,Off} in the given
+        `methods`.  Returns the remaining list of methods.
+
+        """
+        meths = methods[:]
+        tm = self.toggle_meths
+        for method in meths[:]:
+            if method[-2:] == 'On':
+                key = method[:-2]
+                if (key + 'Off') in meths and ('Get' + key) in meths:
+                    tm[key] = None
+                    meths.remove(method)
+                    meths.remove(key + 'Off')
+                    self._remove_method(meths, 'Set' + key)
+                    self._remove_method(meths, 'Get' + key)
+        # get defaults
+        if tm:
+            obj = self._get_instance(klass)
+            if obj:
+                for key in tm:
+                    try:
+                        tm[key] = getattr(obj, 'Get%s'%key)()
+                    except TypeError, e:
+                        log("Type error during parsing: class %s will not expose method %s " % (klass.__name__, key))
+                    except AttributeError, e:
+                        log("Attribute error during parsing: class %s will not expose method %s " % (klass.__name__, key))
+        return meths
+
+    def _find_state_methods(self, klass, methods):
+        """Find/store methods of the form Set<Prop>To<Value> in the
+        given `methods`.  Returns the remaining list of methods.  The
+        method also computes the mapped value of the different
+        <Values>.
+
+        """
+        # These ignored ones are really not state methods.
+        ignore = ['SetUpdateExtentToWholeExtent']
+        meths = methods[:]
+        sm = self.state_meths
+        for method in meths[:]:
+            if method not in ignore and method[:3] == 'Set':
+                # Methods of form Set<Prop>To<Value>
+                match = self._state_patn.search(method)
+                # Second cond. ensures that this is not an accident.
+                if match and (('Get'+method[3:]) not in meths):
+                    key = method[3:match.start()] # The <Prop> part.
+                    if (('Get' + key) in methods):
+                        val = method[match.start()+2:] # <Value> part.
+                        meths.remove(method)
+                        if sm.has_key(key):
+                            sm[key].append([val, None])
+                        else:
+                            sm[key] = [[val, None]]
+                            meths.remove('Get'+ key)
+                            self._remove_method(meths, 'Set'+ key)
+                            if ('Get' + key + 'MaxValue') in meths:
+                                meths.remove('Get' + key + 'MaxValue')
+                                meths.remove('Get' + key + 'MinValue')
+                            try:
+                                meths.remove('Get' + key + 'AsString')
+                            except ValueError:
+                                pass
+
+        # Find the values for each of the states, i.e. find that
+        # vtkProperty.SetRepresentationToWireframe() corresponds to
+        # vtkProperty.SetRepresentation(1).
+        if sm:
+            obj = self._get_instance(klass)
+            if obj:
+                for key, values in sm.items():
+                    default = getattr(obj, 'Get%s'%key)()
+                    for x in values[:]:
+                        try:
+                            getattr(obj, 'Set%sTo%s'%(key, x[0]))()
+                        except:
+                            continue
+                        val = getattr(obj, 'Get%s'%key)()
+                        x[1] = val
+                        if val == default:
+                            values.insert(0, [x[0], val])
+        return meths
+
+    def _find_get_set_methods(self, klass, methods):
+        """Find/store methods of the form {Get,Set}Prop in the given
+        `methods` and returns the remaining list of methods.
+
+        Note that it makes sense to call this *after*
+        `_find_state_methods` is called in order to avoid incorrect
+        duplication.  This method also computes the default value and
+        the ranges of the arguments (when possible) by using the
+        Get<Prop>{MaxValue,MinValue} methods.
+
+        """
+        meths = methods[:]
+        gsm = self.get_set_meths
+        
+        for method in meths[:]:
+            # Methods of the Set/Get form.
+            if method in ['Get', 'Set']:
+                # This occurs with the vtkInformation class.
+                continue
+            elif (method[:3] == 'Set') and ('Get' + method[3:]) in methods:
+                key = method[3:]
+                meths.remove('Set' + key)
+                meths.remove('Get' + key)                    
+                if ('Get' + key + 'MaxValue') in meths:
+                    meths.remove('Get' + key + 'MaxValue')
+                    meths.remove('Get' + key + 'MinValue')
+                    gsm[key] = 1
+                else:
+                    gsm[key] = None
+
+        # Find the default and range of the values.
+        if gsm:
+            obj = self._get_instance(klass)
+            if obj:
+                klass_name = klass.__name__
+                for key, value in gsm.items():
+                    if klass_name == 'vtkPolyData':
+                        # Evil hack, this class segfaults!
+                        default = None
+                    else:
+                        try:
+                            default = getattr(obj, 'Get%s'%key)()
+                        except TypeError:
+                            default = None
+                    if value:
+                        low = getattr(obj, 'Get%sMinValue'%key)()
+                        high = getattr(obj, 'Get%sMaxValue'%key)()
+                        gsm[key] = (default, (low, high))
+                    else:
+                        gsm[key] = (default, None)
+            else:
+                # We still might have methods that have a default range.
+                for key, value in gsm.items():
+                    if value == 1:
+                        gsm[key] = None
+        
+        return meths
+
+    def _find_get_methods(self, klass, methods):
+        """Find/store methods of the form Get<Value> in the given
+        `methods` and returns the remaining list of methods.
+
+        """
+        meths = methods[:]
+        gm = self.get_meths
+        for method in meths[:]:
+            if method == 'Get':
+                # Occurs with vtkInformation
+                continue
+            elif method[:3] == 'Get':        
+                gm.append(method)
+                meths.remove(method)
+        return meths
+
+    def _get_instance(self, klass):
+        """Given a VTK class, `klass`, returns an instance of the
+        class.
+
+        If the class is abstract, it uses the class tree to return an
+        instantiable subclass.  This is necessary to get the values of
+        the 'state' methods and the ranges for the Get/Set methods.
+        
+        """
+        obj = None
+        try:
+            obj = klass()
+        except (TypeError, NotImplementedError):
+            if self._tree:
+                t = self._tree
+                n = t.get_node(klass.__name__)
+                for c in n.children:
+                    obj = self._get_instance(t.get_class(c.name))
+                    if obj:
+                        break
+        return obj
+
diff --git a/vistrails/packages/vtk/vtkcell.py b/vistrails/packages/vtk/vtkcell.py
new file mode 100644
index 0000000..0b87922
--- /dev/null
+++ b/vistrails/packages/vtk/vtkcell.py
@@ -0,0 +1,1146 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# File QVTKWidget.py
+# File for displaying a vtkRenderWindow in a Qt's QWidget ported from
+# VTK/GUISupport/QVTK. Combine altogether to a single class: QVTKWidget
+################################################################################
+import vtk
+from PyQt4 import QtCore, QtGui
+import sip
+from vistrails.core import system
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+from vtk.qt4.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
+import vtkcell_rc
+import gc
+from vistrails.gui.qt import qt_super
+import vistrails.core.db.action
+from vistrails.core.vistrail.action import Action
+from vistrails.core.vistrail.port import Port
+from vistrails.core.vistrail import module
+from vistrails.core.vistrail import connection
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.location import Location
+from vistrails.core.modules.vistrails_module import ModuleError
+import copy
+
+from identifiers import identifier as vtk_pkg_identifier
+
+################################################################################
+
+class VTKCell(SpreadsheetCell):
+    """
+    VTKCell is a VisTrails Module that can display vtkRenderWindow inside a cell
+    
+    """
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        renderers = self.forceGetInputListFromPort('AddRenderer')
+        renderViews = self.forceGetInputListFromPort('SetRenderView')
+        if len(renderViews)>1:
+            raise ModuleError(self, 'There can only be one vtkRenderView '
+                              'per cell')
+        if len(renderViews)==1 and len(renderers)>0:
+            raise ModuleError(self, 'Cannot set both vtkRenderView '
+                              'and vtkRenderer to a cell')
+        renderView = self.forceGetInputFromPort('SetRenderView')
+        iHandlers = self.forceGetInputListFromPort('InteractionHandler')
+        iStyle = self.forceGetInputFromPort('InteractorStyle')
+        picker = self.forceGetInputFromPort('AddPicker')
+        self.cellWidget = self.displayAndWait(QVTKWidget, (renderers, renderView, iHandlers, iStyle, picker))
+
+AsciiToKeySymTable = ( None, None, None, None, None, None, None,
+                       None, None,
+                       "Tab", None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None,
+                       "space", "exclam", "quotedbl", "numbersign",
+                       "dollar", "percent", "ampersand", "quoteright",
+                       "parenleft", "parenright", "asterisk", "plus",
+                       "comma", "minus", "period", "slash",
+                       "0", "1", "2", "3", "4", "5", "6", "7",
+                       "8", "9", "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",
+                       "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+                       "h", "i", "j", "k", "l", "m", "n", "o",
+                       "p", "q", "r", "s", "t", "u", "v", "w",
+                       "x", "y", "z", "braceleft", "bar", "braceright",
+                       "asciitilde", "Delete",
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None)
+
+class QVTKWidget(QCellWidget):
+    """
+    QVTKWidget is the actual rendering widget that can display
+    vtkRenderer inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVTKWidget(parent: QWidget, f: WindowFlags) -> QVTKWidget
+        Initialize QVTKWidget with a toolbar with its own device
+        context
+        
+        """
+        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+
+        self.interacting = None
+        self.mRenWin = None
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.toolBarType = QVTKWidgetToolBar
+        self.iHandlers = []
+        self.setAnimationEnabled(True)
+        self.renderer_maps = {}
+        
+    def removeObserversFromInteractorStyle(self):
+        """ removeObserversFromInteractorStyle() -> None        
+        Remove all python binding from interactor style observers for
+        safely freeing the cell
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.RemoveObservers("InteractionEvent")
+            style.RemoveObservers("EndPickEvent")
+            style.RemoveObservers("CharEvent")
+            style.RemoveObservers("MouseWheelForwardEvent")
+            style.RemoveObservers("MouseWheelBackwardEvent")
+        
+    def addObserversToInteractorStyle(self):
+        """ addObserversToInteractorStyle() -> None        
+        Assign observer to the current interactor style
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.AddObserver("InteractionEvent", self.interactionEvent)
+            style.AddObserver("EndPickEvent", self.interactionEvent)
+            style.AddObserver("CharEvent", self.charEvent)
+            style.AddObserver("MouseWheelForwardEvent", self.interactionEvent)
+            style.AddObserver("MouseWheelBackwardEvent", self.interactionEvent)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        
+        """
+        self.renderer_maps = {}
+        for ren in self.getRendererList():
+            self.mRenWin.RemoveRenderer(ren)
+            
+        self.removeObserversFromInteractorStyle()
+        
+        self.updateContents(([], None, [], None, None))
+        
+        self.SetRenderWindow(None)
+
+        QCellWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts, cameralist = None):
+        """ updateContents(inputPorts: tuple)
+        Updates the cell contents with new vtkRenderer
+        
+        """
+        renWin = self.GetRenderWindow()
+        for iHandler in self.iHandlers:
+            if iHandler.observer:
+                iHandler.observer.vtkInstance.SetInteractor(None)
+            iHandler.clear()
+
+        # Remove old renderers first
+        oldRenderers = self.getRendererList()
+        for renderer in oldRenderers:
+            renWin.RemoveRenderer(renderer)
+            renderer.SetRenderWindow(None)
+        del oldRenderers
+
+        (renderers, renderView, self.iHandlers, iStyle, picker) = inputPorts
+        if renderView:
+            renderView.vtkInstance.SetupRenderWindow(renWin)
+            renderers = [renderView.vtkInstance.GetRenderer()]
+        self.renderer_maps = {}
+        self.usecameras = False
+        if cameralist != None and len(cameralist) == len(renderers):
+            self.usecameras = True
+        j = 0
+        for renderer in renderers:
+            if renderView==None:
+                vtkInstance = renderer.vtkInstance
+                renWin.AddRenderer(vtkInstance)
+                self.renderer_maps[vtkInstance] = renderer.moduleInfo['moduleId']
+            else:
+                vtkInstance = renderer
+            if hasattr(vtkInstance, 'IsActiveCameraCreated'):
+                if self.usecameras:
+                    vtkInstance.SetActiveCamera(cameralist[j])
+                    j = j + 1
+                if not vtkInstance.IsActiveCameraCreated():
+                    vtkInstance.ResetCamera()
+                else:
+                    vtkInstance.ResetCameraClippingRange()
+            
+        iren = renWin.GetInteractor()
+        if picker:
+            iren.SetPicker(picker.vtkInstance)
+            
+        # Update interactor style
+        self.removeObserversFromInteractorStyle()
+        if renderView==None:
+            if iStyle==None:
+                iStyleInstance = vtk.vtkInteractorStyleTrackballCamera()
+            else:
+                iStyleInstance = iStyle.vtkInstance
+            iren.SetInteractorStyle(iStyleInstance)
+        self.addObserversToInteractorStyle()
+        
+        for iHandler in self.iHandlers:
+            if iHandler.observer:
+                iHandler.observer.vtkInstance.SetInteractor(iren)
+        renWin.Render()
+
+        # Capture window into history for playback
+        # Call this at the end to capture the image after rendering
+        QCellWidget.updateContents(self, inputPorts)
+
+    def GetRenderWindow(self):
+        """ GetRenderWindow() -> vtkRenderWindow
+        Return the associated vtkRenderWindow
+        
+        """
+        if not self.mRenWin:
+            win = vtk.vtkRenderWindow()
+            win.DoubleBufferOn()
+            self.SetRenderWindow(win)
+            del win
+
+        return self.mRenWin
+
+    def SetRenderWindow(self,w):
+        """ SetRenderWindow(w: vtkRenderWindow)        
+        Set a new render window to QVTKWidget and initialize the
+        interactor as well
+        
+        """
+        if w == self.mRenWin:
+            return
+        
+        if self.mRenWin:
+            if system.systemType!='Linux':
+                self.mRenWin.SetInteractor(None)
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+            
+        self.mRenWin = w
+
+        if self.mRenWin:
+            self.mRenWin.Register(None)
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+            if system.systemType=='Linux':
+                try:
+                    vp = '_%s_void_p' % (hex(int(QtGui.QX11Info.display()))[2:])
+                except TypeError:
+                    #This was change for PyQt4.2
+                    if isinstance(QtGui.QX11Info.display(),QtGui.Display):
+                        display = sip.unwrapinstance(QtGui.QX11Info.display())
+                        vp = '_%s_void_p' % (hex(display)[2:])
+                v = vtk.vtkVersion()
+                version = [v.GetVTKMajorVersion(),
+                           v.GetVTKMinorVersion(),
+                           v.GetVTKBuildVersion()]
+                if version < [5, 7, 0]:
+                    vp = vp + '\0x00'                
+                self.mRenWin.SetDisplayId(vp)
+                self.resizeWindow(1,1)
+            self.mRenWin.SetWindowInfo(str(int(self.winId())))
+            if self.isVisible():
+                self.mRenWin.Start()
+
+            if not self.mRenWin.GetInteractor():
+                #iren = vtk.vtkRenderWindowInteractor()
+                iren = QVTKRenderWindowInteractor()
+#                if system.systemType=='Darwin':
+#                    iren.InstallMessageProcOff()
+                iren.SetRenderWindow(self.mRenWin)
+                iren.Initialize()
+#                if system.systemType=='Linux':
+#                    system.XDestroyWindow(self.mRenWin.GetGenericDisplayId(),
+#                                          self.mRenWin.GetGenericWindowId())
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                self.resizeWindow(self.width(), self.height())
+                self.mRenWin.SetPosition(self.x(), self.y())
+
+    def GetInteractor(self):
+        """ GetInteractor() -> vtkInteractor
+        Return the vtkInteractor control this QVTKWidget
+        """
+        return self.GetRenderWindow().GetInteractor()
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Process window and interaction events
+        
+        """
+        if e.type()==QtCore.QEvent.ParentAboutToChange:
+            if self.mRenWin:
+                if self.mRenWin.GetMapped():
+                    self.mRenWin.Finalize()
+        else:
+            if e.type()==QtCore.QEvent.ParentChange:
+                if self.mRenWin:
+                    self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                    if self.isVisible():
+                        self.mRenWin.Start()
+        
+        if QtCore.QObject.event(self,e):
+            return 1
+
+        if e.type() == QtCore.QEvent.KeyPress:
+            self.keyPressEvent(e)
+            if e.isAccepted():
+                return e.isAccepted()
+
+        return qt_super(QVTKWidget, self).event(e)
+        
+        # return QtGui.QWidget.event(self,e)
+        # Was this right? Wasn't this supposed to be QCellWidget.event()?
+
+    def resizeWindow(self, width, height):
+        """ resizeWindow(width: int, height: int) -> None
+        Work around vtk bugs for resizing window
+        
+        """
+        ########################################################
+        # VTK - BUGGGGGGGGG - GRRRRRRRRR
+        # This is a 'bug' in vtkWin32OpenGLRenderWindow(.cxx)
+        # If a render window is mapped to screen, the actual
+        # window size is the client area of the window in Win32.
+        # However, this real window size is only updated through
+        # vtkWin32OpenGLRenderWindow::GetSize(). So this has to
+        # be called here to get the cell size correctly. This
+        # invalidates the condition in the next SetSize().
+        # We can use self.mRenWin.SetSize(0,0) here but it will
+        # cause flickering and decrease performance!
+        # SetPosition(curX,curY) also works here but slower.
+        self.mRenWin.GetSize()
+        
+        self.mRenWin.SetSize(width, height)
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().SetSize(width, height)
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the vtkRenderWindow size then QVTKWidget resized
+        
+        """
+        qt_super(QVTKWidget, self).resizeEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.resizeWindow(self.width(), self.height())
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().Render()
+        else:
+            self.mRenWin.Render()
+
+    def moveEvent(self,e):
+        """ moveEvent(e: QEvent) -> None
+        Echo the move event into vtkRenderWindow
+        
+        """
+        qt_super(QVTKWidget, self).moveEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.mRenWin.SetPosition(self.x(),self.y())
+
+    def paintEngine(self):
+        """ paintEngine() -> QPaintEngine
+        On Windows, this has to return None to fully disable
+        double-buffer (we let vtkRenderWindow handle this instead).
+        
+        """
+        if system.systemType in ['Windows', 'Microsoft']:
+            return None
+        else:
+            return QCellWidget.paintEngine(self)
+
+    def paintEvent(self, e):
+        """ paintEvent(e: QPaintEvent) -> None
+        Paint the QVTKWidget with vtkRenderWindow
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        if hasattr(self.mRenWin, 'UpdateGLRegion'):
+            self.mRenWin.UpdateGLRegion()
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().Render()
+        else:
+            self.mRenWin.Render()
+
+    def SelectActiveRenderer(self,iren):
+        """ SelectActiveRenderer(iren: vtkRenderWindowIteractor) -> None
+        Only make the vtkRenderer below the mouse cursor active
+        
+        """
+        epos = iren.GetEventPosition()
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            ren.SetInteractive(ren.IsInViewport(epos[0], epos[1]))
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        isDoubleClick = e.type()==QtCore.QEvent.MouseButtonDblClick
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      ctrl,
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),
+                                      isDoubleClick,
+                                      None)
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonPressEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonPressEvent",
+                  QtCore.Qt.RightButton:"RightButtonPressEvent"}
+
+        self.SelectActiveRenderer(iren)
+
+        if ctrl:
+            e.ignore()
+            return
+
+        self.interacting = self.getActiveRenderer(iren)
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0), 0, None)
+
+        iren.InvokeEvent("MouseMoveEvent")
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("EnterEvent")
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("LeaveEvent")
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonReleaseEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonReleaseEvent",
+                  QtCore.Qt.RightButton:"RightButtonReleaseEvent"}
+
+        self.interacting = None
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def keyPressEvent(self,e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if len(e.text())>0:
+            ascii_key = e.text()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q', 'e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl,shift,ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyPressEvent")
+
+        if ascii_key:
+            iren.InvokeEvent("CharEvent")
+
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if len(e.text())>0:
+            ascii_key = e.text()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q','e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl, shift, ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyReleaseEvent")
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+        
+        self.SelectActiveRenderer(iren)
+        
+        if e.delta()>0:
+            iren.InvokeEvent("MouseWheelForwardEvent")
+        else:
+            iren.InvokeEvent("MouseWheelBackwardEvent")
+
+    def focusInEvent(self,e):
+        """ focusInEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def focusOutEvent(self,e):
+        """ focusOutEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def contextMenuEvent(self,e):
+        """ contextMenuEvent(e: QContextMenuEvent) -> None        
+        Make sure to get the right mouse position for the context menu
+        event, i.e. also the right click
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = int(e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = int(e.modifiers()&QtCore.Qt.ShiftModifier)
+        iren.SetEventInformationFlipY(e.x(),e.y(),ctrl,shift,chr(0),0,None)
+        iren.InvokeEvent("ContextMenuEvent")
+
+    def ascii_to_key_sym(self,i):
+        """ ascii_to_key_sym(i: int) -> str
+        Convert ASCII code into key name
+        
+        """
+        global AsciiToKeySymTable
+        return AsciiToKeySymTable[i]
+
+    def qt_key_to_key_sym(self,i):
+        """ qt_key_to_key_sym(i: QtCore.Qt.Keycode) -> str
+        Convert Qt key code into key name
+        
+        """
+        handler = {QtCore.Qt.Key_Backspace:"BackSpace",
+                   QtCore.Qt.Key_Tab:"Tab",
+                   QtCore.Qt.Key_Backtab:"Tab",
+                   QtCore.Qt.Key_Return:"Return",
+                   QtCore.Qt.Key_Enter:"Return",
+                   QtCore.Qt.Key_Shift:"Shift_L",
+                   QtCore.Qt.Key_Control:"Control_L",
+                   QtCore.Qt.Key_Alt:"Alt_L",
+                   QtCore.Qt.Key_Pause:"Pause",
+                   QtCore.Qt.Key_CapsLock:"Caps_Lock",
+                   QtCore.Qt.Key_Escape:"Escape",
+                   QtCore.Qt.Key_Space:"space",
+                   QtCore.Qt.Key_End:"End",
+                   QtCore.Qt.Key_Home:"Home",
+                   QtCore.Qt.Key_Left:"Left",
+                   QtCore.Qt.Key_Up:"Up",
+                   QtCore.Qt.Key_Right:"Right",
+                   QtCore.Qt.Key_Down:"Down",
+                   QtCore.Qt.Key_SysReq:"Snapshot",
+                   QtCore.Qt.Key_Insert:"Insert",
+                   QtCore.Qt.Key_Delete:"Delete",
+                   QtCore.Qt.Key_Help:"Help",
+                   QtCore.Qt.Key_0:"0",
+                   QtCore.Qt.Key_1:"1",
+                   QtCore.Qt.Key_2:"2",
+                   QtCore.Qt.Key_3:"3",
+                   QtCore.Qt.Key_4:"4",
+                   QtCore.Qt.Key_5:"5",
+                   QtCore.Qt.Key_6:"6",
+                   QtCore.Qt.Key_7:"7",
+                   QtCore.Qt.Key_8:"8",
+                   QtCore.Qt.Key_9:"9",
+                   QtCore.Qt.Key_A:"a",
+                   QtCore.Qt.Key_B:"b",
+                   QtCore.Qt.Key_C:"c",
+                   QtCore.Qt.Key_D:"d",
+                   QtCore.Qt.Key_E:"e",
+                   QtCore.Qt.Key_F:"f",
+                   QtCore.Qt.Key_G:"g",
+                   QtCore.Qt.Key_H:"h",
+                   QtCore.Qt.Key_I:"i",
+                   QtCore.Qt.Key_J:"h",
+                   QtCore.Qt.Key_K:"k",
+                   QtCore.Qt.Key_L:"l",
+                   QtCore.Qt.Key_M:"m",
+                   QtCore.Qt.Key_N:"n",
+                   QtCore.Qt.Key_O:"o",
+                   QtCore.Qt.Key_P:"p",
+                   QtCore.Qt.Key_Q:"q",
+                   QtCore.Qt.Key_R:"r",
+                   QtCore.Qt.Key_S:"s",
+                   QtCore.Qt.Key_T:"t",
+                   QtCore.Qt.Key_U:"u",
+                   QtCore.Qt.Key_V:"v",
+                   QtCore.Qt.Key_W:"w",
+                   QtCore.Qt.Key_X:"x",
+                   QtCore.Qt.Key_Y:"y",
+                   QtCore.Qt.Key_Z:"z",
+                   QtCore.Qt.Key_Asterisk:"asterisk",
+                   QtCore.Qt.Key_Plus:"plus",
+                   QtCore.Qt.Key_Minus:"minus",
+                   QtCore.Qt.Key_Period:"period",
+                   QtCore.Qt.Key_Slash:"slash",
+                   QtCore.Qt.Key_F1:"F1",
+                   QtCore.Qt.Key_F2:"F2",
+                   QtCore.Qt.Key_F3:"F3",
+                   QtCore.Qt.Key_F4:"F4",
+                   QtCore.Qt.Key_F5:"F5",
+                   QtCore.Qt.Key_F6:"F6",
+                   QtCore.Qt.Key_F7:"F7",
+                   QtCore.Qt.Key_F8:"F8",
+                   QtCore.Qt.Key_F9:"F9",
+                   QtCore.Qt.Key_F10:"F10",
+                   QtCore.Qt.Key_F11:"F11",
+                   QtCore.Qt.Key_F12:"F12",
+                   QtCore.Qt.Key_F13:"F13",
+                   QtCore.Qt.Key_F14:"F14",
+                   QtCore.Qt.Key_F15:"F15",
+                   QtCore.Qt.Key_F16:"F16",
+                   QtCore.Qt.Key_F17:"F17",
+                   QtCore.Qt.Key_F18:"F18",
+                   QtCore.Qt.Key_F19:"F19",
+                   QtCore.Qt.Key_F20:"F20",
+                   QtCore.Qt.Key_F21:"F21",
+                   QtCore.Qt.Key_F22:"F22",
+                   QtCore.Qt.Key_F23:"F23",
+                   QtCore.Qt.Key_F24:"F24",
+                   QtCore.Qt.Key_NumLock:"Num_Lock",
+                   QtCore.Qt.Key_ScrollLock:"Scroll_Lock"}
+        if i in handler:            
+            return handler[i]
+        else:
+            return "None"
+
+    def getRendererList(self):
+        """ getRendererList() -> list
+        Return a list of vtkRenderer running in this QVTKWidget
+        """
+        result = []
+        renWin = self.GetRenderWindow()
+        renderers = renWin.GetRenderers()
+        renderers.InitTraversal()
+        for i in xrange(renderers.GetNumberOfItems()):
+            result.append(renderers.GetNextItem())
+        return result
+
+    def getActiveRenderer(self, iren):
+        """ getActiveRenderer(iren: vtkRenderWindowwInteractor) -> vtkRenderer
+        Return the active vtkRenderer under mouse
+        
+        """
+        epos = list(iren.GetEventPosition())
+        if epos[1]<0:
+            epos[1] = -epos[1]
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            if ren.IsInViewport(epos[0], epos[1]):
+                return ren
+        return None
+
+    def findSheetTabWidget(self):
+        """ findSheetTabWidget() -> QTabWidget
+        Find and return the sheet tab widget
+        
+        """
+        p = self.parent()
+        while p:
+            if hasattr(p, 'isSheetTabWidget'):
+                if p.isSheetTabWidget()==True:
+                    return p
+            p = p.parent()
+        return None
+
+    def getRenderersInCellList(self, sheet, cells):
+        """ isRendererIn(sheet: spreadsheet.StandardWidgetSheet,
+                         cells: [(int,int)]) -> bool
+        Get the list of renderers in side a list of (row, column)
+        cells.
+        
+        """
+        rens = []
+        for (row, col) in cells:
+            cell = sheet.getCell(row, col)
+            if hasattr(cell, 'getRendererList'):
+                rens += cell.getRendererList()
+        return rens
+
+    def getSelectedCellWidgets(self):
+        sheet = self.findSheetTabWidget()
+        if sheet:
+            iren = self.mRenWin.GetInteractor()
+            ren = self.interacting
+            if not ren: ren = self.getActiveRenderer(iren)
+            if ren:
+                cells = sheet.getSelectedLocations()
+                if (ren in self.getRenderersInCellList(sheet, cells)):
+                    return [sheet.getCell(row, col)
+                            for (row, col) in cells
+                            if hasattr(sheet.getCell(row, col), 
+                                       'getRendererList')]
+        return []
+
+    def interactionEvent(self, istyle, name):
+        """ interactionEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure interactions sync across selected renderers
+        
+        """
+        if name=='MouseWheelForwardEvent':
+            istyle.OnMouseWheelForward()
+        if name=='MouseWheelBackwardEvent':
+            istyle.OnMouseWheelBackward()
+        ren = self.interacting
+        if not ren:
+            ren = self.getActiveRenderer(istyle.GetInteractor())
+        if ren:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            for cell in self.getSelectedCellWidgets():
+                if cell!=self and hasattr(cell, 'getRendererList'): 
+                    rens = cell.getRendererList()
+                    for r in rens:
+                        if r!=ren:
+                            dcam = r.GetActiveCamera()
+                            dcam.SetPosition(cpos)
+                            dcam.SetFocalPoint(cfol)
+                            dcam.SetViewUp(cup)
+                            r.ResetCameraClippingRange()
+                    cell.update()
+
+    def charEvent(self, istyle, name):
+        """ charEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure key presses also sync across selected renderers
+
+        """
+        iren = istyle.GetInteractor()
+        ren = self.interacting
+        if not ren: ren = self.getActiveRenderer(iren)
+        if ren:
+            keyCode = iren.GetKeyCode()
+            if keyCode in ['w','W','s','S','r','R','p','P']:
+                for cell in self.getSelectedCellWidgets():
+                    if hasattr(cell, 'GetInteractor'):
+                        selectedIren = cell.GetInteractor()
+                        selectedIren.SetKeyCode(keyCode)
+                        selectedIren.GetInteractorStyle().OnChar()
+                        selectedIren.Render()
+            istyle.OnChar()
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+        
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+        
+        """
+        w2i = vtk.vtkWindowToImageFilter()
+        w2i.ReadFrontBufferOff()
+        w2i.SetInput(self.mRenWin)
+        # Render twice to get a clean image on the back buffer
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().Render()
+            self.mRenWin.GetInteractor().Render()
+        else:
+            self.mRenWin.Render()
+            self.mRenWin.Render()
+        w2i.Update()
+        writer = vtk.vtkPNGWriter()
+        writer.SetInputConnection(w2i.GetOutputPort())
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def captureWindow(self):
+        """ captureWindow() -> None        
+        Capture the window contents to file
+        
+        """
+        fn = QtGui.QFileDialog.getSaveFileName(None,
+                                               "Save file as...",
+                                               "screenshot.png",
+                                               "Images (*.png);;PDF files (*.pdf)")
+        if fn:
+            if fn.lower().endswith("png"):
+                self.saveToPNG(fn)
+            elif fn.lower().endswith("pdf"):
+                self.saveToPDF(fn)
+        
+    def grabWindowPixmap(self):
+        """ grabWindowImage() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        uchar = self.saveToPNG(None)
+
+        ba = QtCore.QByteArray()
+        buf = QtCore.QBuffer(ba)
+        buf.open(QtCore.QIODevice.WriteOnly)
+        for i in xrange(uchar.GetNumberOfTuples()):
+            c = uchar.GetValue(i)
+            buf.putChar(chr(c))
+        buf.close()
+        
+        pixmap = QtGui.QPixmap()
+        pixmap.loadFromData(ba, 'PNG')
+        return pixmap
+
+    def dumpToFile(self, filename):
+        """dumpToFile() -> None
+        Dumps itself as an image to a file, calling saveToPNG
+        """
+        self.saveToPNG(filename)
+
+class QVTKWidgetCapture(QtGui.QAction):
+    """
+    QVTKWidgetCapture is the action to capture the vtk rendering
+    window to an image
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKWidgetCapture(parent: QWidget) -> QVTKWidgetCapture
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera.png"),
+                               "&Capture image to file",
+                               parent)
+        self.setStatusTip("Capture the rendered image to a file")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.captureWindow()
+
+class QVTKWidgetSaveCamera(QtGui.QAction):
+    """
+    QVTKWidgetSaveCamera is the action to capture the current camera
+    of the vtk renderers and save it back to the pipeline
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKWidgetSaveCamera(parent: QWidget) -> QVTKWidgetSaveCamera
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               "Save &Camera",
+                               parent)
+        self.setStatusTip("Save current camera views to the pipeline")
+
+    def setCamera(self, controller):
+        ops = []
+        pipeline = controller.current_pipeline                        
+        cellWidget = self.toolBar.getSnappedWidget()
+        renderers = cellWidget.getRendererList()
+        for ren in renderers:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            rendererId = cellWidget.renderer_maps[ren]
+            # Looking for SetActiveCamera()
+            camera = None
+            renderer = pipeline.modules[rendererId]
+            for c in pipeline.connections.values():
+                if c.destination.moduleId==rendererId:
+                    if c.destination.name=='SetActiveCamera':
+                        camera = pipeline.modules[c.source.moduleId]
+                        break
+            
+            if not camera:
+                # Create camera
+                vtk_package = vtk_pkg_identifier
+                camera = controller.create_module(vtk_package, 'vtkCamera', '',
+                                                  0.0, 0.0)
+                ops.append(('add', camera))
+
+                # Connect camera to renderer
+                camera_conn = controller.create_connection(camera, 'self',
+                                                           renderer, 
+                                                           'SetActiveCamera')
+                ops.append(('add', camera_conn))
+            # update functions
+            def convert_to_str(arglist):
+                new_arglist = []
+                for arg in arglist:
+                    new_arglist.append(str(arg))
+                return new_arglist
+            functions = [('SetPosition', convert_to_str(cpos)),
+                         ('SetFocalPoint', convert_to_str(cfol)),
+                         ('SetViewUp', convert_to_str(cup))]
+            ops.extend(controller.update_functions_ops(camera, functions))
+
+        action = vistrails.core.db.action.create_action(ops)
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        controller.select_latest_version()
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        visApp = QtCore.QCoreApplication.instance()
+        if hasattr(visApp, 'builderWindow'):
+            builderWindow = visApp.builderWindow
+            if builderWindow:
+                info = self.toolBar.sheet.getCellPipelineInfo(
+                    self.toolBar.row, self.toolBar.col)
+                if info:
+                    info = info[0]
+                    view = builderWindow.ensureController(info['controller'])
+                    if view:
+                        controller = view.controller
+                        controller.change_selected_version(info['version'])
+                        self.setCamera(controller)
+                        
+                
+class QVTKWidgetToolBar(QCellToolBar):
+    """
+    QVTKWidgetToolBar derives from QCellToolBar to give the VTKCell
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(QVTKWidgetCapture(self))
+        self.addAnimationButtons()
+        self.appendAction(QVTKWidgetSaveCamera(self))
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    registry = get_module_registry()
+    registry.add_module(VTKCell)
+    registry.add_input_port(VTKCell, "Location", CellLocation)
+    import vistrails.core.debug
+    for (port,module) in [("AddRenderer",'vtkRenderer'),
+                          ("SetRenderView",'vtkRenderView'),
+                          ("InteractionHandler",'vtkInteractionHandler'),
+                          ("InteractorStyle", 'vtkInteractorStyle'),
+                          ("AddPicker",'vtkAbstractPicker')]:
+        try:
+            registry.add_input_port(VTKCell, port,'(%s:%s)' % \
+                                        (vtk_pkg_identifier,module))
+            
+        except Exception, e:
+            vistrails.core.debug.warning(str(e))
+
+    registry.add_output_port(VTKCell, "self", VTKCell)
diff --git a/vistrails/packages/vtk/vtkcell_rc.py b/vistrails/packages/vtk/vtkcell_rc.py
new file mode 100644
index 0000000..ae51b30
--- /dev/null
+++ b/vistrails/packages/vtk/vtkcell_rc.py
@@ -0,0 +1,198 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created: Mon Jul 19 16:02:11 2010
+#      by: The Resource Compiler for PyQt (Qt v4.6.3)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x07\xb6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x07\x48\x49\x44\x41\x54\x78\xda\x62\
+\xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\
+\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\xd0\x80\x3b\x00\x20\x80\
+\x58\x40\x84\xb1\x71\x2a\xc3\x8f\x1f\x3f\x99\x7e\xfe\xfc\xce\xfd\
+\xff\xff\xbf\xbf\x4a\x4a\xaa\x86\x52\x52\x02\x59\x3c\x3c\x8c\x66\
+\x7f\xfe\xfc\x61\x7e\xf2\xe4\xed\x8d\xd3\xa7\xf7\x2d\xfb\xf6\xed\
+\xdd\x76\x25\x25\xc7\x9f\x0c\x0c\xff\xa0\xda\x19\x21\xbe\x60\x82\
+\xf8\x83\x91\x91\x11\x8e\x99\x98\x18\x19\x40\xe9\x1b\xc4\x86\xc9\
+\x81\xc4\x98\x98\x98\x19\x7f\xff\xfe\xf4\xe5\xcc\x99\xa5\xe0\xd4\
+\x0f\x10\x40\x60\x07\xfc\xfb\xf7\xdf\x4e\x45\x45\xa6\x41\x50\x90\
+\x97\x07\x98\x2b\xfe\x72\x70\x70\x6a\x70\x71\x31\x0a\xb0\xb1\x31\
+\x81\x2d\xe1\xe5\xe5\x55\x94\x92\x8a\x75\xff\xf7\xef\xef\x65\x06\
+\x86\xff\x3f\x41\x86\xb0\xb3\xb3\x83\x03\x10\x64\xfe\xef\xdf\xbf\
+\x41\x06\x83\x2d\x01\x7a\x00\xcc\x06\x3b\xe0\xdf\x7f\x86\xff\x70\
+\x87\x81\x4c\x02\x3a\x80\x99\x99\xf1\xc5\x8b\x97\xaf\x1e\x3c\x50\
+\xa9\x7f\xf3\xe6\xce\x19\x80\x00\x02\x3b\x40\x4d\x4d\x76\x62\x6f\
+\x6f\x9a\x81\xa0\x20\x1f\xd8\xd5\x9f\x3f\x7f\x67\xf8\xf8\xf1\x2b\
+\xc3\xb7\x6f\xbf\xc1\x7c\x16\x16\x66\x06\x56\x56\x56\xa0\x47\x99\
+\xf4\x41\x86\xb1\xb1\x73\x30\x5c\xbf\x7c\x9c\xe1\xf1\x83\x3b\x0c\
+\x6a\xda\x46\x0c\xc2\x22\x62\x40\x75\x7f\x80\x1e\xf9\xc7\xc0\xcc\
+\xcc\xcc\xf0\xf7\x2f\x13\x03\x07\x07\x1f\x03\x3b\x3b\x50\x2d\x0b\
+\x23\x03\x33\x28\x10\x18\x99\x18\xbe\x7c\xfd\xc1\xf0\xfd\x27\x2b\
+\xd0\xfc\xbf\x0c\xf7\xef\x5f\x66\x02\x3a\x20\x09\x20\x80\xc0\x0e\
+\x10\x15\xe5\x96\x65\x61\xf9\xc7\xf0\xe5\xcb\x67\xb0\xeb\x3f\x7d\
+\xfa\xca\xf0\xf2\xe5\x7b\x86\x0f\x1f\xbe\x83\x83\x8f\x99\x99\x05\
+\x8c\x41\x72\x5c\x9c\x5c\x0c\x77\x6f\x9f\x60\x68\x59\x75\x9c\x41\
+\xc9\x3a\x80\xe1\x45\xd3\x74\x86\x25\xfd\xb9\x0c\x4b\x96\xaf\x66\
+\xf8\xf8\xe1\x03\x43\x45\x45\x25\xd8\xe7\x97\xaf\x5e\x64\x10\x91\
+\x92\x65\x10\x92\x94\x61\x78\xf1\x8d\x91\xe1\xf9\xd7\xff\x0c\xaf\
+\xdf\xfd\x64\xe0\x7a\x78\x83\x41\x54\x50\x11\xe8\x40\x0e\x05\xa0\
+\xd1\x0a\x00\x01\x04\x8e\xbc\x5f\xbf\x7e\xfd\xfd\xfd\xfb\x2f\x3c\
+\xbe\x50\xe3\x0c\x82\x41\x7c\x66\x66\x26\x70\xb4\xbf\x7c\x76\x93\
+\xe1\xfe\x27\x1e\x86\xdd\x8f\xa5\x18\x18\x39\x44\x19\x04\xf8\x78\
+\x18\x56\x2c\x5f\xc1\xb0\x60\xc1\x22\x86\xef\xdf\x7f\x30\x28\xab\
+\x28\x33\xd8\x58\x9b\x31\x3c\xff\xc6\xc4\x70\xe6\xfe\x67\x86\xcb\
+\xf7\xde\x30\x7c\xff\xf2\x9b\x81\xf9\xe7\x37\x06\x0e\x60\xd4\xfd\
+\xfe\xf5\x07\x18\x6d\x7f\x41\x96\xb1\x01\x04\x10\x0b\x2c\x31\x21\
+\xd9\x8d\x15\x40\x1c\xc7\xc8\xf0\xf8\xf1\x0d\x06\x77\x5f\x6f\x06\
+\x0e\xc1\x13\x0c\x07\x8f\x75\x31\x64\x97\x86\x30\xc8\x29\x6b\x31\
+\x2c\x5d\xba\x14\x68\xf9\x77\x06\x0d\x0d\x75\x60\x82\xfe\x0d\x8c\
+\x32\x76\x06\x0b\x25\x01\x86\x5f\x3f\x7e\x32\x5c\xb9\x72\x95\x41\
+\x98\x4b\x8d\x81\x55\x90\x9f\xe1\x1d\x23\x3b\x30\x7a\x7f\xc2\x3c\
+\xfb\x1f\x20\x80\x58\x88\xcd\x2e\x20\xdf\xbf\x7a\xf5\x88\x41\x4c\
+\x8c\x9f\x41\x52\x52\x9e\x21\x39\x5e\x99\x21\x3b\x25\x92\x81\x85\
+\x83\x07\x2c\x6f\x67\x67\x07\x57\xfb\xfb\x37\x24\x97\xf0\xf0\xf0\
+\x32\xfc\x66\xe7\x62\x30\x30\x34\x66\xb8\x78\xf1\x1a\x83\xa4\x94\
+\x38\x30\x3d\x81\x92\xe5\x0f\xb8\x87\x01\x02\x88\x05\xe1\xbb\xff\
+\x78\x7c\xcf\x04\xf4\xd5\x0f\xa0\xaf\xfe\x30\xc8\xc9\x29\x83\x83\
+\x99\x81\x81\x95\x81\x81\x9b\x93\x81\x0d\x18\x9c\x5f\xbe\x7c\x02\
+\x3a\xee\x05\x58\x0d\x1f\x1f\x3f\x30\x4d\x49\x80\x13\xee\xb7\x6f\
+\x3f\xc1\x39\x84\x99\x85\x1d\x68\xb9\x08\xc3\xa3\x47\x57\x18\x04\
+\x04\x54\x19\x90\xab\x1f\x80\x00\x22\x2a\x04\x40\x89\xef\xc3\x87\
+\x97\x0c\xb2\xb2\x52\xc0\x14\xfe\x1f\xec\x58\x90\xa3\x81\xd9\x92\
+\xe1\xde\xbd\x07\x0c\x2f\x5e\xbc\x06\x0a\xb1\x03\x2d\x62\x03\x26\
+\xde\x27\xc0\x68\x7a\xc2\xa0\xa2\xa2\xca\xc0\xc5\xc5\x0f\x4c\x5f\
+\xa0\xf8\xfe\xc3\x20\x2c\x2c\x0e\x4e\xd8\x3f\x7e\x7c\x87\x46\x39\
+\x24\x08\x00\x02\x88\x89\x50\x81\x08\x52\xf8\xf7\xef\x6f\xa0\x41\
+\x5f\x19\xd8\xd8\xb8\xc0\x96\x42\xa2\x84\x99\xe1\xcd\x9b\x97\x0c\
+\xaf\x5f\xbf\x63\xe0\xe1\x95\x64\x78\xfd\xe6\x23\xc3\xb9\x73\x67\
+\x19\x38\x38\x85\x80\x39\x8e\x87\xe1\xc6\x8d\x6b\x0c\xc0\x82\x0d\
+\x5a\x36\x00\xcb\x83\xff\x4c\x0c\xdc\xdc\xec\xc0\xd0\x7a\x0b\x0c\
+\x1d\x84\xbf\x01\x02\x88\x09\x62\x09\xde\xe4\x07\xf4\xc1\x2f\x06\
+\x4e\x4e\xa0\x0f\x99\x59\xc1\x86\xc1\x7c\xff\xfe\xfd\x7b\x06\x31\
+\x71\x39\x86\x53\xa7\x8e\x30\x24\xa7\x84\x30\x14\x15\xa5\x02\xb3\
+\x61\x16\xb0\xe0\xe2\x07\x46\x17\x17\xc3\xdb\xb7\xaf\x80\x96\x41\
+\x3c\xf7\xf7\xef\x5f\xb0\x19\x3f\x7e\x7c\x00\x47\x29\x0c\x00\x04\
+\x10\x11\x0e\x60\x00\x5b\x0a\x2a\xf9\x60\x6d\x07\x50\xd1\xfb\xf3\
+\xe7\x0f\x70\xaa\x11\x13\x17\x65\x58\xb8\x60\x26\xc3\xe7\x4f\x9f\
+\x40\x25\x2a\xc3\x89\xe3\x47\x18\xce\x9c\x39\xc6\x20\x2e\x21\x05\
+\x2c\x70\x3e\xc2\x2d\x83\x98\xc1\x01\xe4\xff\x03\xab\x83\x15\xe3\
+\x00\x01\xc4\x84\x5c\xa6\xe3\x03\x10\x4d\x08\x07\x81\x1c\xf1\x0f\
+\xe8\xab\xff\xc0\x7a\x41\x50\x48\x18\x45\x2d\xbf\x00\x3f\xc3\x1f\
+\x60\xb4\xfd\xfd\xfb\x0f\x29\x2a\x19\xc0\x25\xe5\xbf\x7f\xa8\xe6\
+\x02\x04\x10\x52\x2e\xc0\x57\x06\x30\x83\xf3\x38\xc2\x31\xff\x80\
+\xe9\x81\x13\x98\xe8\x58\x18\x5e\x3e\x7f\xca\x50\x5e\x51\xcd\xf0\
+\x13\x98\xb8\x5e\x3c\x7f\xce\xe0\xe1\xed\xc3\x60\x6e\x6e\xc9\x70\
+\xe3\xfa\x45\x06\x49\x09\x49\x68\x94\x41\xec\x00\x25\x40\x26\x26\
+\x56\xb0\xe3\x61\x76\x02\x04\x10\x0b\xa1\x28\x00\x19\xc0\xc6\xc6\
+\x06\xcc\x05\xff\x80\x3e\xfa\x05\x54\xcb\x0e\x97\x13\x03\xd6\x01\
+\xf7\xee\xdf\x65\x10\x11\x91\x60\x98\x39\x7b\x3e\x38\x7b\xf2\xf0\
+\x70\x33\xdc\xbd\x73\x1d\x58\xda\xfd\x64\x90\x90\x90\x02\xc7\x3d\
+\xac\x3e\xf9\xf1\xe3\x17\x50\x5e\x84\x01\x58\xc3\xc2\xed\x04\x08\
+\x20\x22\xb2\x21\x24\xb8\x39\x39\xf9\x19\xbe\x7e\xfd\xc4\xc0\xcf\
+\x2f\x08\x4f\x54\xc2\x22\xa2\x40\xd7\xff\x67\x78\xf2\xe4\x31\xc3\
+\xdb\x9f\x7f\x80\xc1\xfe\x87\xe1\xc5\xb3\x3f\xc0\xc4\xca\xc8\x60\
+\x6a\x6a\x01\x2e\x0d\x7f\xff\xfe\x01\xcd\x49\xbf\x80\x69\xe2\x27\
+\x30\x27\x08\x00\x13\xef\x57\x78\xb4\x03\x04\x10\x51\x51\x00\xb2\
+\x8c\x8f\x4f\x88\xe1\xd9\xb3\x7b\xc0\x52\x50\x12\xe8\x20\x48\x28\
+\x80\x7c\x22\x21\x21\x0d\x2c\x1d\x45\x81\x86\x7f\x01\xe7\x16\x16\
+\x16\x56\xa0\x2f\xf9\xc1\xf1\xff\xfd\xfb\x4f\xb0\x3a\x36\x36\x56\
+\x86\xdb\xb7\x6f\x03\x1d\x26\x08\xae\xd4\x90\x01\x40\x00\x11\x99\
+\x08\xff\x83\x35\x72\x72\x8a\x82\xf3\x37\x28\x38\x61\x8e\xfe\x0b\
+\xf4\x35\x0b\xb0\xa4\x13\x11\x11\x01\x3a\x4e\x0a\x48\x8b\x82\x83\
+\x17\xe4\x68\x10\x60\x65\x65\x01\x46\xdf\x6b\x60\xf9\xff\x97\x41\
+\x46\x46\x0d\xac\x1e\xb9\xee\x01\x08\x20\xa2\xb2\x21\x2c\x14\x84\
+\x84\x44\x81\x05\x12\x2b\xc3\xe5\xcb\xe7\xc0\x7a\x40\x69\x03\x51\
+\xd0\x20\xd4\x81\xf8\xa0\x82\x8a\x9d\x9d\x8d\xe1\xdd\xbb\xd7\x0c\
+\x77\xee\x3c\x06\x56\x52\xe6\xf0\x34\x85\x0c\x00\x02\x88\x09\x5a\
+\xaa\x31\x83\x2a\x1b\x6c\x55\x30\x72\x13\x0b\x54\xf8\x48\x4a\x2a\
+\x00\x83\x96\x95\xe1\xc8\x91\xa3\x0c\xcf\x9f\x3f\x01\xfa\x90\x19\
+\x5c\xd8\xc0\x13\x15\x30\x74\x40\x05\x0e\xa8\x14\xbc\x7a\xf5\x32\
+\x30\xe8\x9f\x31\xe8\xe8\x58\x03\x8b\x65\x0e\x70\x6b\x09\x62\x16\
+\x13\xb8\x69\x06\x52\x0f\x10\x40\xe0\x08\x79\xf2\xe4\xcd\xed\x87\
+\x0f\xdf\x09\x2b\x2a\x4a\x01\xe3\x15\x54\x9b\x81\xe2\x17\x98\xcf\
+\xff\x31\xc1\x2b\x23\x18\x06\xb5\x1b\x84\x85\xe5\x80\x29\xfa\x1b\
+\xb0\x04\xbc\x07\xac\x6a\xef\x01\x43\x86\x17\xe8\x30\x71\xb0\x8f\
+\x3f\x00\x1b\x25\xcf\x9e\x01\xeb\xff\xef\xff\x80\xe9\x46\x8a\x41\
+\x5b\x5b\x05\xec\xf8\x5f\xbf\x80\x25\xc6\x3f\x90\x67\x58\x80\x0d\
+\x9e\xcf\xa0\x68\x01\xd5\x68\xff\x01\x02\x88\x11\x14\x24\x52\x52\
+\x7a\x76\xe2\xe2\x72\xd5\xbc\xbc\xdc\xb2\xa0\xf8\x06\x66\xf3\xff\
+\xa0\x82\x07\x56\xec\x22\xb7\x07\x40\x86\xc1\x2a\x28\x50\xf9\x00\
+\xf2\xe9\xb7\x6f\x9f\x80\x21\xc1\x08\xf6\x3d\xa8\xf2\x01\x25\x52\
+\x7e\x7e\x21\x50\x33\x0e\x68\xd6\x1f\xa8\xc5\x90\xb4\x04\x64\x33\
+\x7e\xfc\xf8\xe6\xe7\xb5\x6b\x07\xf7\x7c\xff\xfe\x69\x0e\x40\x00\
+\x31\x42\x2d\x01\x49\x4b\x01\xb1\x1c\x28\x46\xe8\xd0\x1a\x07\x95\
+\x87\xc0\x2a\x94\xe1\x11\x40\x00\x31\x0e\x74\xdf\x10\x20\x80\x06\
+\xbc\x63\x02\x10\x40\x03\xee\x00\x80\x00\x1a\x70\x07\x00\x04\x18\
+\x00\x4e\x12\xc6\x99\x32\x89\xe5\xec\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x0a\
+\x0c\x91\x67\x27\
+\x00\x63\
+\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/vistrails/packages/vtk/vtkhandler.py b/vistrails/packages/vtk/vtkhandler.py
new file mode 100644
index 0000000..337c36e
--- /dev/null
+++ b/vistrails/packages/vtk/vtkhandler.py
@@ -0,0 +1,220 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Modules for handling vtkRenderWindowInteractor events"""
+from PyQt4 import QtCore, QtGui
+from vistrails.core.modules.basic_modules import String
+from vistrails.core.modules.vistrails_module import Module, NotCacheable
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.core.vistrail.module_function import ModuleFunction, ModuleParam
+from vistrails.gui.modules.source_configure import SourceConfigurationWidget
+from vistrails.gui.modules.python_source_configure import PythonEditor
+import urllib
+
+from identifiers import identifier as vtk_pkg_identifier
+
+################################################################################
+class vtkInteractionHandler(NotCacheable, Module):
+    """
+    vtkInteractionHandler allow users to insert callback code for interacting
+    with the vtkRenderWindowInteractor InteractionEvent
+    
+    """
+
+    # Since vtkCommand is not wrapped in Python, we need to hardcoded all events
+    # string from vtkCommand.h
+    vtkEvents = [
+        'AnyEvent',
+        'DeleteEvent',
+        'StartEvent',
+        'EndEvent',
+        'RenderEvent',
+        'ProgressEvent',
+        'PickEvent',
+        'StartPickEvent',
+        'EndPickEvent',
+        'AbortCheckEvent',
+        'ExitEvent',
+        'LeftButtonPressEvent',
+        'LeftButtonReleaseEvent',
+        'MiddleButtonPressEvent',
+        'MiddleButtonReleaseEvent',
+        'RightButtonPressEvent',
+        'RightButtonReleaseEvent',
+        'EnterEvent',
+        'LeaveEvent',
+        'KeyPressEvent',
+        'KeyReleaseEvent',
+        'CharEvent',
+        'ExposeEvent',
+        'ConfigureEvent',
+        'TimerEvent',
+        'MouseMoveEvent',
+        'MouseWheelForwardEvent',
+        'MouseWheelBackwardEvent',
+        'ResetCameraEvent',
+        'ResetCameraClippingRangeEvent',
+        'ModifiedEvent',
+        'WindowLevelEvent',
+        'StartWindowLevelEvent',
+        'EndWindowLevelEvent',
+        'ResetWindowLevelEvent',
+        'SetOutputEvent',
+        'ErrorEvent',
+        'WarningEvent',
+        'StartInteractionEvent',
+        'InteractionEvent',
+        'EndInteractionEvent',
+        'EnableEvent',
+        'DisableEvent',
+        'CreateTimerEvent',
+        'DestroyTimerEvent',
+        'PlacePointEvent',
+        'PlaceWidgetEvent',
+        'CursorChangedEvent',
+        'ExecuteInformationEvent',
+        'RenderWindowMessageEvent',
+        'WrongTagEvent',
+        'StartAnimationCueEvent',
+        'AnimationCueTickEvent',
+        'EndAnimationCueEvent',
+        'VolumeMapperRenderEndEvent',
+        'VolumeMapperRenderProgressEvent',
+        'VolumeMapperRenderStartEvent',
+        'VolumeMapperComputeGradientsEndEvent',
+        'VolumeMapperComputeGradientsProgressEvent',
+        'VolumeMapperComputeGradientsStartEvent',
+        'WidgetModifiedEvent',
+        'WidgetValueChangedEvent',
+        'WidgetActivateEvent',
+        'ConnectionCreatedEvent',
+        'ConnectionClosedEvent',
+        'DomainModifiedEvent',
+        'PropertyModifiedEvent',
+        'UpdateEvent',
+        'RegisterEvent',
+        'UnRegisterEvent',
+        'UpdateInformationEvent']
+    
+    def __init__(self):
+        Module.__init__(self)
+        self.observer = None
+        self.handler = None
+        self.shareddata = None
+
+    def compute(self):
+        """ compute() -> None
+        Actually compute nothing
+        """        
+        self.observer = self.forceGetInputFromPort('Observer')
+        self.handler = self.forceGetInputFromPort('Handler', '')
+        self.shareddata = self.forceGetInputListFromPort('SharedData')
+        if len(self.shareddata)==1:
+            self.shareddata = self.shareddata[0]
+        if self.observer:
+            source = urllib.unquote(self.handler)
+            observer = self.observer.vtkInstance
+            for e in vtkInteractionHandler.vtkEvents:
+                f = e[0].lower() + e[1:]
+                f = f.replace('Event', 'Handler')
+                source += ('\nif locals().has_key("%s"):\n' % f +
+                           '\tobserver.AddObserver("%s", ' % e +
+                           'self.eventHandler)\n')
+            exec(source)
+            if hasattr(self.observer.vtkInstance, 'PlaceWidget'):
+                self.observer.vtkInstance.PlaceWidget()
+
+    def eventHandler(self, obj, event):
+        """ eventHandler(obj: vtkObject, event: str) -> None
+        A proxy for all vtk events to direct to the correct calls
+        
+        """
+        if self.handler!='':
+            source = urllib.unquote(self.handler)
+            f = event[0].lower() + event[1:]
+            f = f.replace('Event', 'Handler')
+            myGlobals = globals()
+            myGlobals.update({'self':self})
+            exec(source + ('\nif locals().has_key("%s"):\n' % f)+
+                 ('\t%s(obj, self.shareddata)' % f)) in myGlobals, locals()
+
+    def clear(self):
+        """ clear() -> None
+        Remove event handler so the object can be freed correctly
+        
+        """
+        # Remove all observers
+        if self.observer:
+            for e in vtkInteractionHandler.vtkEvents:
+                self.observer.vtkInstance.RemoveObservers(e)
+        Module.clear(self)
+
+    def repaintCells(self):
+        """ repaintCells() -> None
+        Redraw all cells on the current sheet
+        
+        """
+        from vistrails.packages.spreadsheet.spreadsheet_controller \
+             import spreadsheetController
+        from vistrails.packages.spreadsheet.spreadsheet_event \
+             import RepaintCurrentSheetEvent
+        spreadsheetController.postEventToSpreadsheet(RepaintCurrentSheetEvent())
+
+class HandlerConfigurationWidget(SourceConfigurationWidget):
+    def __init__(self, module, controller, parent=None):
+        """ HandlerConfigurationWidget(module: Module,
+                                       controller: VistrailController,
+                                       parent: QWidget)
+                                       -> HandlerConfigurationWidget
+        Setup the dialog to similar to PythonSource but with a
+        different name
+        
+        """
+        SourceConfigurationWidget.__init__(self, module, controller, 
+                                           PythonEditor, False, False, parent,
+                                           portName='Handler')
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    registry = get_module_registry()
+    vIO = registry.get_descriptor_by_name(vtk_pkg_identifier,
+                                          'vtkInteractorObserver').module
+    registry.add_module(vtkInteractionHandler, configureWidgetType=HandlerConfigurationWidget)
+    registry.add_input_port(vtkInteractionHandler, 'Observer', vIO)
+    registry.add_input_port(vtkInteractionHandler, 'Handler', String, True)
+    registry.add_input_port(vtkInteractionHandler, 'SharedData', Module)
+    registry.add_output_port(vtkInteractionHandler, 'self',
+                             vtkInteractionHandler)
diff --git a/vistrails/packages/vtk/vtkviewcell.py b/vistrails/packages/vtk/vtkviewcell.py
new file mode 100644
index 0000000..b06eacc
--- /dev/null
+++ b/vistrails/packages/vtk/vtkviewcell.py
@@ -0,0 +1,1045 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+################################################################################
+# File QVTKViewWidget.py
+# File for displaying a vtkRenderWindow in a Qt's QWidget ported from
+# VTK/GUISupport/QVTK. Combine altogether to a single class: QVTKViewWidget
+################################################################################
+import vtk
+from PyQt4 import QtCore, QtGui
+import sip
+from vistrails.core import system
+from vistrails.core.modules.module_registry import get_module_registry
+from vistrails.packages.spreadsheet.basic_widgets import SpreadsheetCell, CellLocation
+from vistrails.packages.spreadsheet.spreadsheet_cell import QCellWidget, QCellToolBar
+import vtkcell_rc
+import gc
+from vistrails.gui.qt import qt_super
+import vistrails.core.db.action
+from vistrails.core.vistrail.action import Action
+from vistrails.core.vistrail.port import Port
+from vistrails.core.vistrail import module
+from vistrails.core.vistrail import connection
+from vistrails.core.vistrail.module_function import ModuleFunction
+from vistrails.core.vistrail.module_param import ModuleParam
+from vistrails.core.vistrail.location import Location
+from vistrails.core.modules.vistrails_module import ModuleError
+import copy
+
+from identifiers import identifier as vtk_pkg_identifier
+
+################################################################################
+
+class VTKViewCell(SpreadsheetCell):
+    """
+    VTKViewCell is a VisTrails Module that can display vtkRenderWindow inside a cell
+    
+    """
+
+    def __init__(self):
+        SpreadsheetCell.__init__(self)
+        self.cellWidget = None
+    
+    def compute(self):
+        """ compute() -> None
+        Dispatch the vtkRenderer to the actual rendering widget
+        """
+        renderView = self.forceGetInputFromPort('SetRenderView')
+        if renderView==None:
+            raise ModuleError(self, 'A vtkRenderView input is required.')
+        self.cellWidget = self.displayAndWait(QVTKViewWidget, (renderView,))
+
+AsciiToKeySymTable = ( None, None, None, None, None, None, None,
+                       None, None,
+                       "Tab", None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None, None, None,
+                       None, None, None, None,
+                       "space", "exclam", "quotedbl", "numbersign",
+                       "dollar", "percent", "ampersand", "quoteright",
+                       "parenleft", "parenright", "asterisk", "plus",
+                       "comma", "minus", "period", "slash",
+                       "0", "1", "2", "3", "4", "5", "6", "7",
+                       "8", "9", "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",
+                       "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+                       "h", "i", "j", "k", "l", "m", "n", "o",
+                       "p", "q", "r", "s", "t", "u", "v", "w",
+                       "x", "y", "z", "braceleft", "bar", "braceright",
+                       "asciitilde", "Delete",
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None, 
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None,
+                       None, None, None, None, None, None, None, None)
+
+class QVTKViewWidget(QCellWidget):
+    """
+    QVTKViewWidget is the actual rendering widget that can display
+    vtkRenderer inside a Qt QWidget
+    
+    """
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        """ QVTKViewWidget(parent: QWidget, f: WindowFlags) -> QVTKViewWidget
+        Initialize QVTKViewWidget with a toolbar with its own device
+        context
+        
+        """
+        QCellWidget.__init__(self, parent, f | QtCore.Qt.MSWindowsOwnDC)
+
+        self.interacting = None
+        self.mRenWin = None
+        self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)
+        self.setAttribute(QtCore.Qt.WA_PaintOnScreen)
+        self.setMouseTracking(True)
+        self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                             QtGui.QSizePolicy.Expanding))
+        self.toolBarType = QVTKViewWidgetToolBar
+        self.setAnimationEnabled(True)
+        
+    def removeObserversFromInteractorStyle(self):
+        """ removeObserversFromInteractorStyle() -> None        
+        Remove all python binding from interactor style observers for
+        safely freeing the cell
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.RemoveObservers("InteractionEvent")
+            style.RemoveObservers("EndPickEvent")
+            style.RemoveObservers("CharEvent")
+            style.RemoveObservers("MouseWheelForwardEvent")
+            style.RemoveObservers("MouseWheelBackwardEvent")
+        
+    def addObserversToInteractorStyle(self):
+        """ addObserversToInteractorStyle() -> None        
+        Assign observer to the current interactor style
+        
+        """
+        iren = self.mRenWin.GetInteractor()
+        if iren:
+            style = iren.GetInteractorStyle()
+            style.AddObserver("InteractionEvent", self.interactionEvent)
+            style.AddObserver("EndPickEvent", self.interactionEvent)
+            style.AddObserver("CharEvent", self.charEvent)
+            style.AddObserver("MouseWheelForwardEvent", self.interactionEvent)
+            style.AddObserver("MouseWheelBackwardEvent", self.interactionEvent)
+
+    def deleteLater(self):
+        """ deleteLater() -> None        
+        Make sure to free render window resource when
+        deallocating. Overriding PyQt deleteLater to free up
+        resources
+        
+        """
+        self.renderer_maps = {}
+        for ren in self.getRendererList():
+            self.mRenWin.RemoveRenderer(ren)
+        self.removeObserversFromInteractorStyle()
+        self.SetRenderWindow(None)
+        QCellWidget.deleteLater(self)
+
+    def updateContents(self, inputPorts):
+        """ updateContents(inputPorts: tuple)
+        Updates the cell contents with new vtkRenderer
+        
+        """
+        (renderView, ) = inputPorts
+        renWin = renderView.vtkInstance.GetRenderWindow()
+        renWin.DoubleBufferOn()
+        self.SetRenderWindow(renWin)
+        renderView.vtkInstance.ResetCamera()
+        self.addObserversToInteractorStyle()
+        
+#        renWin = self.GetRenderWindow()
+#        renderers = [renderView.vtkInstance.GetRenderer()]
+#        iren = renWin.GetInteractor()
+        # Update interactor style
+#         self.removeObserversFromInteractorStyle()
+#         if renderView==None:
+#             if iStyle==None:
+#                 iStyleInstance = vtk.vtkInteractorStyleTrackballCamera()
+#             else:
+#                 iStyleInstance = iStyle.vtkInstance
+#             iren.SetInteractorStyle(iStyleInstance)
+#         self.addObserversToInteractorStyle()
+        # Capture window into history for playback
+        # Call this at the end to capture the image after rendering
+        QCellWidget.updateContents(self, inputPorts)
+
+    def GetRenderWindow(self):
+        """ GetRenderWindow() -> vtkRenderWindow
+        Return the associated vtkRenderWindow
+        
+        """
+        if not self.mRenWin:
+            win = vtk.vtkRenderWindow()
+            win.DoubleBufferOn()
+            self.SetRenderWindow(win)
+            del win
+
+        return self.mRenWin
+
+    def SetRenderWindow(self,w):
+        """ SetRenderWindow(w: vtkRenderWindow)        
+        Set a new render window to QVTKViewWidget and initialize the
+        interactor as well
+        
+        """
+        if w == self.mRenWin:
+            return
+        
+        if self.mRenWin:
+            if self.mRenWin.GetMapped():
+                self.mRenWin.Finalize()
+                
+        self.mRenWin = w
+        
+        if self.mRenWin:
+            self.mRenWin.Register(None)
+            if system.systemType=='Linux':
+                try:
+                    vp = '_%s_void_p' % (hex(int(QtGui.QX11Info.display()))[2:])
+                except TypeError:
+                    #This was change for PyQt4.2
+                    if isinstance(QtGui.QX11Info.display(),QtGui.Display):
+                        display = sip.unwrapinstance(QtGui.QX11Info.display())
+                        vp = '_%s_void_p' % (hex(display)[2:])
+                self.mRenWin.SetDisplayId(vp)
+                if not self.mRenWin.GetMapped():
+                    self.mRenWin.GetInteractor().Initialize()
+                    system.XDestroyWindow(self.mRenWin.GetGenericDisplayId(),
+                                          self.mRenWin.GetGenericWindowId())
+                    self.mRenWin.Finalize()
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))
+            else:
+                self.mRenWin.SetWindowInfo(str(int(self.winId())))                
+            if self.isVisible():
+                self.mRenWin.Start()
+
+    def GetInteractor(self):
+        """ GetInteractor() -> vtkInteractor
+        Return the vtkInteractor control this QVTKViewWidget
+        """
+        return self.GetRenderWindow().GetInteractor()
+
+    def event(self, e):
+        """ event(e: QEvent) -> depends on event type
+        Process window and interaction events
+        
+        """
+        if e.type()==QtCore.QEvent.ParentAboutToChange:
+            if self.mRenWin:
+                if self.mRenWin.GetMapped():
+                    self.mRenWin.Finalize()
+        else:
+            if e.type()==QtCore.QEvent.ParentChange:
+                if self.mRenWin:
+                    self.mRenWin.SetWindowInfo(str(int(self.winId())))
+                    if self.isVisible():
+                        self.mRenWin.Start()
+        
+        if QtCore.QObject.event(self,e):
+            return 1
+
+        if e.type() == QtCore.QEvent.KeyPress:
+            self.keyPressEvent(e)
+            if e.isAccepted():
+                return e.isAccepted()
+
+        return qt_super(QVTKViewWidget, self).event(e)
+        
+        # return QtGui.QWidget.event(self,e)
+        # Was this right? Wasn't this supposed to be QCellWidget.event()?
+
+    def resizeWindow(self, width, height):
+        """ resizeWindow(width: int, height: int) -> None
+        Work around vtk bugs for resizing window
+        
+        """
+        ########################################################
+        # VTK - BUGGGGGGGGG - GRRRRRRRRR
+        # This is a 'bug' in vtkWin32OpenGLRenderWindow(.cxx)
+        # If a render window is mapped to screen, the actual
+        # window size is the client area of the window in Win32.
+        # However, this real window size is only updated through
+        # vtkWin32OpenGLRenderWindow::GetSize(). So this has to
+        # be called here to get the cell size correctly. This
+        # invalidates the condition in the next SetSize().
+        # We can use self.mRenWin.SetSize(0,0) here but it will
+        # cause flickering and decrease performance!
+        # SetPosition(curX,curY) also works here but slower.
+        self.mRenWin.GetSize()
+        
+        self.mRenWin.SetSize(width, height)
+        if self.mRenWin.GetInteractor():
+            self.mRenWin.GetInteractor().SetSize(width, height)
+
+    def resizeEvent(self, e):
+        """ resizeEvent(e: QEvent) -> None
+        Re-adjust the vtkRenderWindow size then QVTKViewWidget resized
+        
+        """
+        qt_super(QVTKViewWidget, self).resizeEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.resizeWindow(self.width(), self.height())
+        self.mRenWin.Render()
+
+    def moveEvent(self,e):
+        """ moveEvent(e: QEvent) -> None
+        Echo the move event into vtkRenderWindow
+        
+        """
+        qt_super(QVTKViewWidget, self).moveEvent(e)
+        if not self.mRenWin:
+            return
+
+        self.mRenWin.SetPosition(self.x(),self.y())
+
+    def paintEvent(self, e):
+        """ paintEvent(e: QPaintEvent) -> None
+        Paint the QVTKViewWidget with vtkRenderWindow
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        if hasattr(self.mRenWin, 'UpdateGLRegion'):
+            self.mRenWin.UpdateGLRegion()
+        self.mRenWin.Render()
+
+    def SelectActiveRenderer(self,iren):
+        """ SelectActiveRenderer(iren: vtkRenderWindowIteractor) -> None
+        Only make the vtkRenderer below the mouse cursor active
+        
+        """
+        epos = iren.GetEventPosition()
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            ren.SetInteractive(ren.IsInViewport(epos[0], epos[1]))
+
+    def mousePressEvent(self,e):
+        """ mousePressEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        isDoubleClick = e.type()==QtCore.QEvent.MouseButtonDblClick
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      ctrl,
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),
+                                      isDoubleClick,
+                                      None)
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonPressEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonPressEvent",
+                  QtCore.Qt.RightButton:"RightButtonPressEvent"}
+
+        self.SelectActiveRenderer(iren)
+
+        if ctrl:
+            e.ignore()
+            return
+
+        self.interacting = self.getActiveRenderer(iren)
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def mouseMoveEvent(self,e):
+        """ mouseMoveEvent(e: QMouseEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0), 0, None)
+
+        iren.InvokeEvent("MouseMoveEvent")
+                  
+    def enterEvent(self,e):
+        """ enterEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("EnterEvent")
+
+    def leaveEvent(self,e):
+        """ leaveEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.InvokeEvent("LeaveEvent")
+
+    def mouseReleaseEvent(self,e):
+        """ mouseReleaseEvent(e: QEvent) -> None
+        Echo mouse event to vtkRenderWindowwInteractor
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+
+        invoke = {QtCore.Qt.LeftButton:"LeftButtonReleaseEvent",
+                  QtCore.Qt.MidButton:"MiddleButtonReleaseEvent",
+                  QtCore.Qt.RightButton:"RightButtonReleaseEvent"}
+
+        self.interacting = None
+        
+        if e.button() in invoke:
+            iren.InvokeEvent(invoke[e.button()])
+
+    def keyPressEvent(self,e):
+        """ keyPressEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if len(e.text())>0:
+            ascii_key = e.text()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q', 'e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl,shift,ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyPressEvent")
+
+        if ascii_key:
+            iren.InvokeEvent("CharEvent")
+
+        
+    def keyReleaseEvent(self,e):
+        """ keyReleaseEvent(e: QKeyEvent) -> None
+        Disallow 'quit' key in vtkRenderWindowwInteractor and sync the others
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ascii_key = None
+        if len(e.text())>0:
+            ascii_key = e.text()[0]
+        else:
+            ascii_key = chr(0)
+
+        keysym = self.ascii_to_key_sym(ord(ascii_key))
+
+        if not keysym:
+            keysym = self.qt_key_to_key_sym(e.key())
+
+        # Ignore 'q' or 'e' or Ctrl-anykey
+        ctrl = (e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = (e.modifiers()&QtCore.Qt.ShiftModifier)
+        if (keysym in ['q','e'] or ctrl):
+            e.ignore()
+            return
+        
+        iren.SetKeyEventInformation(ctrl, shift, ascii_key, e.count(), keysym)
+
+        iren.InvokeEvent("KeyReleaseEvent")
+
+    def wheelEvent(self,e):
+        """ wheelEvent(e: QWheelEvent) -> None
+        Zoom in/out while scrolling the mouse
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        iren.SetEventInformationFlipY(e.x(),e.y(),
+                                      (e.modifiers()&QtCore.Qt.ControlModifier),
+                                      (e.modifiers()&QtCore.Qt.ShiftModifier),
+                                      chr(0),0,None)
+        
+        self.SelectActiveRenderer(iren)
+        
+        if e.delta()>0:
+            iren.InvokeEvent("MouseWheelForwardEvent")
+        else:
+            iren.InvokeEvent("MouseWheelBackwardEvent")
+
+    def focusInEvent(self,e):
+        """ focusInEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def focusOutEvent(self,e):
+        """ focusOutEvent(e: QFocusEvent) -> None
+        Ignore focus event
+        
+        """
+        pass
+
+    def contextMenuEvent(self,e):
+        """ contextMenuEvent(e: QContextMenuEvent) -> None        
+        Make sure to get the right mouse position for the context menu
+        event, i.e. also the right click
+        
+        """
+        iren = None
+        if self.mRenWin:
+            iren = self.mRenWin.GetInteractor()
+
+        if (not iren) or (not iren.GetEnabled()):
+            return
+
+        ctrl = int(e.modifiers()&QtCore.Qt.ControlModifier)
+        shift = int(e.modifiers()&QtCore.Qt.ShiftModifier)
+        iren.SetEventInformationFlipY(e.x(),e.y(),ctrl,shift,chr(0),0,None)
+        iren.InvokeEvent("ContextMenuEvent")
+
+    def ascii_to_key_sym(self,i):
+        """ ascii_to_key_sym(i: int) -> str
+        Convert ASCII code into key name
+        
+        """
+        global AsciiToKeySymTable
+        return AsciiToKeySymTable[i]
+
+    def qt_key_to_key_sym(self,i):
+        """ qt_key_to_key_sym(i: QtCore.Qt.Keycode) -> str
+        Convert Qt key code into key name
+        
+        """
+        handler = {QtCore.Qt.Key_Backspace:"BackSpace",
+                   QtCore.Qt.Key_Tab:"Tab",
+                   QtCore.Qt.Key_Backtab:"Tab",
+                   QtCore.Qt.Key_Return:"Return",
+                   QtCore.Qt.Key_Enter:"Return",
+                   QtCore.Qt.Key_Shift:"Shift_L",
+                   QtCore.Qt.Key_Control:"Control_L",
+                   QtCore.Qt.Key_Alt:"Alt_L",
+                   QtCore.Qt.Key_Pause:"Pause",
+                   QtCore.Qt.Key_CapsLock:"Caps_Lock",
+                   QtCore.Qt.Key_Escape:"Escape",
+                   QtCore.Qt.Key_Space:"space",
+                   QtCore.Qt.Key_End:"End",
+                   QtCore.Qt.Key_Home:"Home",
+                   QtCore.Qt.Key_Left:"Left",
+                   QtCore.Qt.Key_Up:"Up",
+                   QtCore.Qt.Key_Right:"Right",
+                   QtCore.Qt.Key_Down:"Down",
+                   QtCore.Qt.Key_SysReq:"Snapshot",
+                   QtCore.Qt.Key_Insert:"Insert",
+                   QtCore.Qt.Key_Delete:"Delete",
+                   QtCore.Qt.Key_Help:"Help",
+                   QtCore.Qt.Key_0:"0",
+                   QtCore.Qt.Key_1:"1",
+                   QtCore.Qt.Key_2:"2",
+                   QtCore.Qt.Key_3:"3",
+                   QtCore.Qt.Key_4:"4",
+                   QtCore.Qt.Key_5:"5",
+                   QtCore.Qt.Key_6:"6",
+                   QtCore.Qt.Key_7:"7",
+                   QtCore.Qt.Key_8:"8",
+                   QtCore.Qt.Key_9:"9",
+                   QtCore.Qt.Key_A:"a",
+                   QtCore.Qt.Key_B:"b",
+                   QtCore.Qt.Key_C:"c",
+                   QtCore.Qt.Key_D:"d",
+                   QtCore.Qt.Key_E:"e",
+                   QtCore.Qt.Key_F:"f",
+                   QtCore.Qt.Key_G:"g",
+                   QtCore.Qt.Key_H:"h",
+                   QtCore.Qt.Key_I:"i",
+                   QtCore.Qt.Key_J:"h",
+                   QtCore.Qt.Key_K:"k",
+                   QtCore.Qt.Key_L:"l",
+                   QtCore.Qt.Key_M:"m",
+                   QtCore.Qt.Key_N:"n",
+                   QtCore.Qt.Key_O:"o",
+                   QtCore.Qt.Key_P:"p",
+                   QtCore.Qt.Key_Q:"q",
+                   QtCore.Qt.Key_R:"r",
+                   QtCore.Qt.Key_S:"s",
+                   QtCore.Qt.Key_T:"t",
+                   QtCore.Qt.Key_U:"u",
+                   QtCore.Qt.Key_V:"v",
+                   QtCore.Qt.Key_W:"w",
+                   QtCore.Qt.Key_X:"x",
+                   QtCore.Qt.Key_Y:"y",
+                   QtCore.Qt.Key_Z:"z",
+                   QtCore.Qt.Key_Asterisk:"asterisk",
+                   QtCore.Qt.Key_Plus:"plus",
+                   QtCore.Qt.Key_Minus:"minus",
+                   QtCore.Qt.Key_Period:"period",
+                   QtCore.Qt.Key_Slash:"slash",
+                   QtCore.Qt.Key_F1:"F1",
+                   QtCore.Qt.Key_F2:"F2",
+                   QtCore.Qt.Key_F3:"F3",
+                   QtCore.Qt.Key_F4:"F4",
+                   QtCore.Qt.Key_F5:"F5",
+                   QtCore.Qt.Key_F6:"F6",
+                   QtCore.Qt.Key_F7:"F7",
+                   QtCore.Qt.Key_F8:"F8",
+                   QtCore.Qt.Key_F9:"F9",
+                   QtCore.Qt.Key_F10:"F10",
+                   QtCore.Qt.Key_F11:"F11",
+                   QtCore.Qt.Key_F12:"F12",
+                   QtCore.Qt.Key_F13:"F13",
+                   QtCore.Qt.Key_F14:"F14",
+                   QtCore.Qt.Key_F15:"F15",
+                   QtCore.Qt.Key_F16:"F16",
+                   QtCore.Qt.Key_F17:"F17",
+                   QtCore.Qt.Key_F18:"F18",
+                   QtCore.Qt.Key_F19:"F19",
+                   QtCore.Qt.Key_F20:"F20",
+                   QtCore.Qt.Key_F21:"F21",
+                   QtCore.Qt.Key_F22:"F22",
+                   QtCore.Qt.Key_F23:"F23",
+                   QtCore.Qt.Key_F24:"F24",
+                   QtCore.Qt.Key_NumLock:"Num_Lock",
+                   QtCore.Qt.Key_ScrollLock:"Scroll_Lock"}
+        if i in handler:            
+            return handler[i]
+        else:
+            return "None"
+
+    def getRendererList(self):
+        """ getRendererList() -> list
+        Return a list of vtkRenderer running in this QVTKViewWidget
+        """
+        result = []
+        renWin = self.GetRenderWindow()
+        renderers = renWin.GetRenderers()
+        renderers.InitTraversal()
+        for i in xrange(renderers.GetNumberOfItems()):
+            result.append(renderers.GetNextItem())
+        return result
+
+    def getActiveRenderer(self, iren):
+        """ getActiveRenderer(iren: vtkRenderWindowwInteractor) -> vtkRenderer
+        Return the active vtkRenderer under mouse
+        
+        """
+        epos = list(iren.GetEventPosition())
+        if epos[1]<0:
+            epos[1] = -epos[1]
+        rens = iren.GetRenderWindow().GetRenderers()
+        rens.InitTraversal()
+        for i in xrange(rens.GetNumberOfItems()):
+            ren = rens.GetNextItem()
+            if ren.IsInViewport(epos[0], epos[1]):
+                return ren
+        return None
+
+    def findSheetTabWidget(self):
+        """ findSheetTabWidget() -> QTabWidget
+        Find and return the sheet tab widget
+        
+        """
+        p = self.parent()
+        while p:
+            if hasattr(p, 'isSheetTabWidget'):
+                if p.isSheetTabWidget()==True:
+                    return p
+            p = p.parent()
+        return None
+
+    def getRenderersInCellList(self, sheet, cells):
+        """ isRendererIn(sheet: spreadsheet.StandardWidgetSheet,
+                         cells: [(int,int)]) -> bool
+        Get the list of renderers in side a list of (row, column)
+        cells.
+        
+        """
+        rens = []
+        for (row, col) in cells:
+            cell = sheet.getCell(row, col)
+            if hasattr(cell, 'getRendererList'):
+                rens += cell.getRendererList()
+        return rens
+
+    def getSelectedCellWidgets(self):
+        sheet = self.findSheetTabWidget()
+        if sheet:
+            iren = self.mRenWin.GetInteractor()
+            ren = self.interacting
+            if not ren: ren = self.getActiveRenderer(iren)
+            if ren:
+                cells = sheet.getSelectedLocations()
+                if (ren in self.getRenderersInCellList(sheet, cells)):
+                    return [sheet.getCell(row, col)
+                            for (row, col) in cells
+                            if hasattr(sheet.getCell(row, col), 
+                                       'getRendererList')]
+        return []
+
+    def interactionEvent(self, istyle, name):
+        """ interactionEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure interactions sync across selected renderers
+        
+        """
+        if name=='MouseWheelForwardEvent':
+            istyle.OnMouseWheelForward()
+        if name=='MouseWheelBackwardEvent':
+            istyle.OnMouseWheelBackward()
+        ren = self.interacting
+        if not ren:
+            ren = self.getActiveRenderer(istyle.GetInteractor())
+        if ren:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            for cell in self.getSelectedCellWidgets():
+                if cell!=self and hasattr(cell, 'getRendererList'): 
+                    rens = cell.getRendererList()
+                    for r in rens:
+                        if r!=ren:
+                            dcam = r.GetActiveCamera()
+                            dcam.SetPosition(cpos)
+                            dcam.SetFocalPoint(cfol)
+                            dcam.SetViewUp(cup)
+                            r.ResetCameraClippingRange()
+                    cell.update()
+
+    def charEvent(self, istyle, name):
+        """ charEvent(istyle: vtkInteractorStyle, name: str) -> None
+        Make sure key presses also sync across selected renderers
+
+        """
+        iren = istyle.GetInteractor()
+        ren = self.interacting
+        if not ren: ren = self.getActiveRenderer(iren)
+        if ren:
+            keyCode = iren.GetKeyCode()
+            if keyCode in ['w','W','s','S','r','R','p','P']:
+                for cell in self.getSelectedCellWidgets():
+                    if hasattr(cell, 'GetInteractor'):
+                        selectedIren = cell.GetInteractor()
+                        selectedIren.SetKeyCode(keyCode)
+                        selectedIren.GetInteractorStyle().OnChar()
+                        selectedIren.Render()
+            istyle.OnChar()
+
+    def saveToPNG(self, filename):
+        """ saveToPNG(filename: str) -> filename or vtkUnsignedCharArray
+        
+        Save the current widget contents to an image file. If
+        str==None, then it returns the vtkUnsignedCharArray containing
+        the PNG image. Otherwise, the filename is returned.
+        
+        """
+        w2i = vtk.vtkWindowToImageFilter()
+        w2i.ReadFrontBufferOff()
+        w2i.SetInput(self.mRenWin)
+        # Render twice to get a clean image on the back buffer
+        self.mRenWin.Render()
+        self.mRenWin.Render()
+        w2i.Update()
+        writer = vtk.vtkPNGWriter()
+        writer.SetInputConnection(w2i.GetOutputPort())
+        if filename!=None:
+            writer.SetFileName(filename)
+        else:
+            writer.WriteToMemoryOn()
+        writer.Write()
+        if filename:
+            return filename
+        else:
+            return writer.GetResult()
+
+    def captureWindow(self):
+        """ captureWindow() -> None        
+        Capture the window contents to file
+        
+        """
+        fn = QtGui.QFileDialog.getSaveFileName(None,
+                                               "Save file as...",
+                                               "screenshot.png",
+                                               "Images (*.png)")
+        if fn:
+            self.saveToPNG(fn)
+        
+    def grabWindowPixmap(self):
+        """ grabWindowImage() -> QPixmap
+        Widget special grabbing function
+        
+        """
+        uchar = self.saveToPNG(None)
+
+        ba = QtCore.QByteArray()
+        buf = QtCore.QBuffer(ba)
+        buf.open(QtCore.QIODevice.WriteOnly)
+        for i in xrange(uchar.GetNumberOfTuples()):
+            c = uchar.GetValue(i)
+            buf.putChar(chr(c))
+        buf.close()
+        
+        pixmap = QtGui.QPixmap()
+        pixmap.loadFromData(ba, 'PNG')
+        return pixmap
+
+    def dumpToFile(self, filename):
+        """dumpToFile() -> None
+        Dumps itself as an image to a file, calling saveToPNG
+        """
+        self.saveToPNG(filename)
+
+class QVTKViewWidgetCapture(QtGui.QAction):
+    """
+    QVTKViewWidgetCapture is the action to capture the vtk rendering
+    window to an image
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKViewWidgetCapture(parent: QWidget) -> QVTKViewWidgetCapture
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               QtGui.QIcon(":/images/camera.png"),
+                               "&Capture image to file",
+                               parent)
+        self.setStatusTip("Capture the rendered image to a file")
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        cellWidget = self.toolBar.getSnappedWidget()
+        cellWidget.captureWindow()
+
+class QVTKViewWidgetSaveCamera(QtGui.QAction):
+    """
+    QVTKViewWidgetSaveCamera is the action to capture the current camera
+    of the vtk renderers and save it back to the pipeline
+    
+    """
+    def __init__(self, parent=None):
+        """ QVTKViewWidgetSaveCamera(parent: QWidget) -> QVTKViewWidgetSaveCamera
+        Setup the image, status tip, etc. of the action
+        
+        """
+        QtGui.QAction.__init__(self,
+                               "Save &Camera",
+                               parent)
+        self.setStatusTip("Save current camera views to the pipeline")
+
+    def setCamera(self, controller):
+        ops = []
+        pipeline = controller.current_pipeline                        
+        cellWidget = self.toolBar.getSnappedWidget()
+        renderers = cellWidget.getRendererList()
+        for ren in renderers:
+            cam = ren.GetActiveCamera()
+            cpos = cam.GetPosition()
+            cfol = cam.GetFocalPoint()
+            cup = cam.GetViewUp()
+            rendererId = cellWidget.renderer_maps[ren]
+            # Looking for SetActiveCamera()
+            camera = None
+            renderer = pipeline.modules[rendererId]
+            for c in pipeline.connections.values():
+                if c.destination.moduleId==rendererId:
+                    if c.destination.name=='SetActiveCamera':
+                        camera = pipeline.modules[c.source.moduleId]
+                        break
+            
+            if not camera:
+                # Create camera
+                vtk_package = vtk_pkg_identifier
+                camera = controller.create_module(vtk_package, 'vtkCamera', '',
+                                                  0.0, 0.0)
+                ops.append(('add', camera))
+
+                # Connect camera to renderer
+                camera_conn = controller.create_connection(camera, 'self',
+                                                           renderer, 
+                                                           'SetActiveCamera')
+                ops.append(('add', camera_conn))
+            # update functions
+            def convert_to_str(arglist):
+                new_arglist = []
+                for arg in arglist:
+                    new_arglist.append(str(arg))
+                return new_arglist
+            functions = [('SetPosition', convert_to_str(cpos)),
+                         ('SetFocalPoint', convert_to_str(cfol)),
+                         ('SetViewUp', convert_to_str(cup))]
+            ops.extend(controller.update_functions_ops(camera, functions))
+
+        action = vistrails.core.db.action.create_action(ops)
+        controller.add_new_action(action)
+        controller.perform_action(action)
+        controller.select_latest_version()
+
+    def triggeredSlot(self, checked=False):
+        """ toggledSlot(checked: boolean) -> None
+        Execute the action when the button is clicked
+        
+        """
+        visApp = QtCore.QCoreApplication.instance()
+        if hasattr(visApp, 'builderWindow'):
+            builderWindow = visApp.builderWindow
+            if builderWindow:
+                info = self.toolBar.sheet.getCellPipelineInfo(
+                    self.toolBar.row, self.toolBar.col)
+                if info:
+                    info = info[0]
+                    viewManager = builderWindow.viewManager
+                    view = viewManager.ensureController(info['controller'])
+                    if view:
+                        controller = view.controller
+                        controller.change_selected_version(info['version'])
+                        self.setCamera(controller)
+                
+class QVTKViewWidgetToolBar(QCellToolBar):
+    """
+    QVTKViewWidgetToolBar derives from QCellToolBar to give the VTKViewCell
+    a customizable toolbar
+    
+    """
+    def createToolBar(self):
+        """ createToolBar() -> None
+        This will get call initiallly to add customizable widgets
+        
+        """
+        self.appendAction(QVTKViewWidgetCapture(self))
+        self.addAnimationButtons()
+        self.appendAction(QVTKViewWidgetSaveCamera(self))
+
+def registerSelf():
+    """ registerSelf() -> None
+    Registry module with the registry
+    """
+    registry = get_module_registry()
+    registry.add_module(VTKViewCell)
+    registry.add_input_port(VTKViewCell, "Location", CellLocation)
+    import vistrails.core.debug
+    for (port,module) in [("SetRenderView",'vtkRenderView')]:
+        try:
+            registry.add_input_port(VTKViewCell, port,'(%s:%s)'% \
+                                        (vtk_pkg_identifier, module))
+ 
+        except Exception, e:
+            vistrails.core.debug.warning(str(e))
+
+    registry.add_output_port(VTKViewCell, "self", VTKViewCell)
diff --git a/vistrails/packages/vtlcreator/__init__.py b/vistrails/packages/vtlcreator/__init__.py
new file mode 100644
index 0000000..a3b950f
--- /dev/null
+++ b/vistrails/packages/vtlcreator/__init__.py
@@ -0,0 +1,41 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""This package contains a module that generates a .vtl file for the 
+workflow it is contained into."""
+
+identifier = 'org.vistrails.vistrails.vtlcreator'
+name = 'vtlCreator'
+version = '0.0.4'
+old_identifiers = ['edu.utah.sci.vistrails.vtlcreator']
diff --git a/vistrails/packages/vtlcreator/init.py b/vistrails/packages/vtlcreator/init.py
new file mode 100644
index 0000000..9a1ae0f
--- /dev/null
+++ b/vistrails/packages/vtlcreator/init.py
@@ -0,0 +1,176 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+import base64
+import os
+import vistrails.core.db.action
+from vistrails.core.modules.basic_modules import File, Boolean, String, Directory
+from vistrails.core.modules.vistrails_module import Module, ModuleError, NotCacheable
+from vistrails.core.vistrail.vistrail import Vistrail
+from vistrails.db.services.locator import DBLocator
+from vistrails.core.system import get_elementtree_library
+from vistrails.db.services import io
+from vistrails.db.versions import currentVersion
+
+ElementTree = get_elementtree_library()
+
+class VtlFileCreator(NotCacheable, Module):
+    """This Module creates a vtl file for the workflow where it is
+    present.
+    By default it generates a string with an <vtlink> </vtlink> XML
+    element or it can write the vtl file to disk if filename is
+    provided. If directory is provided, the final filename will be
+    the concatenation of directory and filename.
+    
+    Other input ports:
+    
+    execute: Boolean
+        tells VisTrails to execute the workflow when the vtl is open
+        
+    showSpreadsheetOnly: Boolean
+        tells VisTrails to hide the builder window and show only the
+        spreadsheet when the vtl is open
+    
+    embedWorkflow: Boolean
+        it will embed a vistrail encoded as base64 containing only 
+        the workflow where the module is. It can be loaded by 
+        VisTrails.
+        
+    """
+    def __init__(self):
+        Module.__init__(self)
+        self.locator = None
+        self.version = -1
+        self.pipeline = None
+        self.execute = False
+        self.embedWorkflow = False
+        self.showSpreadsheetOnly = False
+        self.forceDB = False
+        
+    def get_locator_and_version(self):
+        self.locator = self.moduleInfo['locator']
+        self.version = self.moduleInfo['version']
+        self.pipeline = self.moduleInfo['pipeline']
+        
+        if self.locator is None:
+            raise ModuleError(self, 'could not get the locator for this pipeline')
+        if self.version is None:
+            raise ModuleError(self, 'could not get the version number of this peline')
+    
+    @staticmethod
+    def generate_vtl(locator,version,pipeline,execute=False,forceDB=False,
+                     showSpreadsheetOnly=False,embedWorkflow=False):
+        """generate_vtl(locator:DBLocator or XMLLocator,
+                        version: str, pipeline:Pipeline, execute:boolean,
+                        forceDB:boolean, showspreadsheetOnly:boolean,
+                        embedWorkflow: boolean) -> str
+           It generates the contents of a .vtl file with the information
+           given.
+        """
+        node = ElementTree.Element('vtlink')
+        
+        if isinstance(locator, DBLocator):
+            node.set('host', str(locator.host))
+            node.set('port', str(locator.port))
+            node.set('database', str(locator.db))
+            node.set('vtid', str(locator.obj_id))
+        elif locator is not None:
+            node.set('filename', str(locator.name))
+            
+        node.set('version', str(version))    
+        node.set('execute', str(execute))
+        node.set('forceDB', str(forceDB))
+        node.set('showSpreadsheetOnly', str(showSpreadsheetOnly))
+            
+        if embedWorkflow == True:
+            vistrail = Vistrail()
+            action_list = []
+            for module in pipeline.module_list:
+                action_list.append(('add', module))
+            for connection in pipeline.connection_list:
+                action_list.append(('add', connection))
+            action = vistrails.core.db.action.create_action(action_list)
+            vistrail.add_action(action, 0L)
+            vistrail.addTag("Imported workflow", action.id)
+            if not forceDB:
+                node.set('version', str(action.id))
+            if not vistrail.db_version:
+                vistrail.db_version = currentVersion
+            pipxmlstr = io.serialize(vistrail)
+            vtcontent = base64.b64encode(pipxmlstr)
+            node.set('vtcontent',vtcontent)
+            
+        return ElementTree.tostring(node)
+            
+            
+    def compute(self):
+        self.get_locator_and_version()
+        
+        if self.hasInputFromPort('execute'):
+            self.execute = self.getInputFromPort('execute')
+        
+        if self.hasInputFromPort('forceDB'):
+            self.forceDB = self.getInputFromPort('forceDB')
+        
+        if self.hasInputFromPort('showSpreadsheetOnly'):
+            self.showSpreadsheetOnly = self.getInputFromPort('showSpreadsheetOnly')
+            
+        if self.hasInputFromPort('embedWorkflow'):
+            self.embedWorkflow = self.getInputFromPort('embedWorkflow')
+        
+        xmlstring = self.generate_vtl(self.locator,self.version,self.pipeline,
+                                      self.execute,self.forceDB,
+                                      self.showSpreadsheetOnly,self.embedWorkflow)
+        
+        if self.hasInputFromPort('filename'):
+            filename = self.getInputFromPort('filename')
+            if self.hasInputFromPort('directory'):
+                directory = self.getInputFromPort('directory').name
+                filename = os.path.join(directory,filename)
+            file_ = open(filename,'w')
+            file_.write(xmlstring)
+            file_.close()
+        
+        self.setResult("xmlstring", xmlstring)
+        
+    _input_ports = [('execute', Boolean, True), 
+                    ('showspreadsheetOnly', Boolean, True),
+                    ('embedWorkflow', Boolean, True),
+                    ('forceDB', Boolean, True), 
+                    ('filename', String), 
+                    ('directory', Directory)]
+    
+    _output_ports = [('xmlstring', String)]
+
+_modules = [VtlFileCreator]
diff --git a/vistrails/packages/webServices/__init__.py b/vistrails/packages/webServices/__init__.py
new file mode 100644
index 0000000..9049569
--- /dev/null
+++ b/vistrails/packages/webServices/__init__.py
@@ -0,0 +1,79 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This package defines a set of methods to deal with web services.
+It requires ZSI library to be installed (please use the trunk version as it has
+important fixes. Click on configure to add wsdl urls to the package 
+(use a ; to separate the urls).
+
+ChangeLog
+2013-04-26  (by VisTrails Team)
+    * Updated package to version 0.9.4
+    * Updated to new org.vistrails identifiers
+2010-02-25  (by VisTrails Team)
+    * Updated package to version 0.9.3
+    * Fixed bug with new package reloading
+    * If you see the error ('Error loading configuration file: ',
+                             '~/.vistrails/webServices/modules.conf')
+      Just remove your ~/.vistrails/webServices and enable the package again
+    * Adding http package to package dependencies
+2010-01-27  (by VisTrails Team)
+    * Updated package to version 0.9.2 
+    * Supporting hierarchy of types (not fully tested yet)
+    * Changing the default port names of modules to 'self', keeping the old 
+      names (as optional ports) for backwards compatibility 
+2010-01-25  (by VisTrails Team)
+    * Updated package to version 0.9.1 
+    * Expanded map of simple types
+"""
+from vistrails.core.configuration import ConfigurationObject
+import vistrails.core
+
+identifier = 'org.vistrails.vistrails.webservices'
+name = 'Web Services'
+version = '0.9.4'
+old_identifiers = ['edu.utah.sci.vistrails.webservices']
+configuration = ConfigurationObject(wsdlList=(None, str),
+                                    showWarning=True)
+
+def package_dependencies():
+    return ['org.vistrails.vistrails.http']
+    
+def package_requirements():
+    from vistrails.core.requirements import require_python_module
+    require_python_module('ZSI', {
+            'pip': 'zsi',
+            'linux-debian': 'python-zsi',
+            'linux-ubuntu': 'python-zsi',
+            'linux-fedora': 'python-ZSI'})
diff --git a/vistrails/packages/webServices/enumeration_widget.py b/vistrails/packages/webServices/enumeration_widget.py
new file mode 100644
index 0000000..4712bd2
--- /dev/null
+++ b/vistrails/packages/webServices/enumeration_widget.py
@@ -0,0 +1,115 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+##############################################################################
+# Enumeration Widget for Web Services
+from PyQt4 import QtCore, QtGui
+import vistrails.core.modules
+from vistrails.gui.modules.constant_configuration import ConstantWidgetMixin, \
+    StandardConstantWidget
+from vistrails.core.modules.basic_modules import Constant, Module
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.vistrails_module import new_module
+import vistrails.packages.webServices
+
+class EnumerationWidget(QtGui.QComboBox, ConstantWidgetMixin):
+    enumerationlist = []
+    def __init__(self, param, parent=None):
+        """__init__(param: core.vistrail.module_param.ModuleParam,
+                    parent: QWidget)
+        Initializes the line edit with contents
+        """
+        dictkey = param._namespace
+        typedict = vistrails.packages.webServices.webServicesmodulesDict[dictkey]
+        w = param._namespace.replace('|Types','')
+        dictkey = w + "." + param._type
+        obj = typedict[dictkey]
+        self.enumerationlist = obj.ports[0][0]
+        QtGui.QComboBox.__init__(self, parent)
+        ConstantWidgetMixin.__init__(self, param.strValue)
+        QtGui.QComboBox.clear(self)
+        listqt = []
+        for element in self.enumerationlist:
+            listqt.append(element)
+            
+        QtGui.QComboBox.addItems(self, listqt)
+        foundindex = self.findText(param.strValue)
+        if not foundindex == -1:
+            self.setCurrentIndex(foundindex)
+        else:
+            self.setCurrentIndex(0)
+            param.strValue = self.enumerationlist[self.currentIndex()]
+        self.connect(self, QtCore.SIGNAL('activated(int)'), self.change_state)
+
+    def contents(self):
+        return self.enumerationlist[self.currentIndex()]
+    
+    def change_state(self, state):
+        self.update_parent()
+    
+def initialize(namemodule,namespace,identifier, version):
+    enumerationConstant = new_constant(namemodule,
+                                            namespace,
+                                            identifier,
+                                            version,
+                                            EnumerationWidget)
+    return enumerationConstant
+
+def new_constant(name, namespace, identifier, 
+                 version, widget_type=StandardConstantWidget):
+    """new_constant(name: str, namespace: str,widget_type: QWidget type) -> Module
+    
+    new_constant dynamically creates a new Module derived from Constant
+    with a widget type."""
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    
+    def __init__(self):
+        Constant.__init__(self)
+
+    @staticmethod
+    def get_widget_class():
+        return widget_type
+
+    @staticmethod
+    def conversion(self): return self
+    
+    m = new_module(Constant, name, {'__init__': __init__,
+                                    'get_widget_class': get_widget_class,
+                                    'translate_to_python': conversion})
+    m.name = name
+    m.isEnumeration = True
+    reg.add_module(m,namespace=namespace,package=identifier,
+                   package_version=version)
+    return m
diff --git a/vistrails/packages/webServices/init.py b/vistrails/packages/webServices/init.py
new file mode 100644
index 0000000..f9165bc
--- /dev/null
+++ b/vistrails/packages/webServices/init.py
@@ -0,0 +1,1527 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+import sys
+import os.path
+import httplib
+import urllib
+
+import vistrails.core.modules.module_registry
+import vistrails.core.modules.basic_modules
+from vistrails.core.modules import vistrails_module
+from vistrails.core.modules.vistrails_module import Module, ModuleError, new_module
+import vistrails.core.system
+import enumeration_widget
+
+import cPickle
+
+from ZSI.ServiceProxy import ServiceProxy
+from ZSI.generate.wsdl2python import WriteServiceModule
+from ZSI.wstools import WSDLTools
+
+
+package_directory = None
+#Dictionary that contains the methods and complex types of all the web services
+webServicesmodulesDict = {}
+complexsdict ={} 
+
+pm = vistrails.core.packagemanager.get_package_manager()
+###############################################################################
+
+class WebService(Module):
+    """ WebService is the base Module.
+     We will create a WebService Module for each method published by 
+     the web service.
+
+    """
+    def __init__(self):
+        Module.__init__(self)
+
+    def compute(self):
+        raise vistrails_module.IncompleteImplementation
+
+    def runMethod(self, methodName, *args):
+        return getattr(self.server,methodName)(*args)
+
+#Class for complex types
+class WBModule:
+    def __init__(self,name):
+        self.name = name
+        self.namespace = ''
+        self.webservice = ''
+        self.typeobj = ''   #Enumeration, ComplexType or Method.
+        self.ports = []   #Have the elements of a complex type and the elements of an enumeration.
+        self.attributes = []    #Have the attributes of a complex type
+        self.hasAttributes = False
+        self.isRequestType = False
+        self.isEmptySequence = False
+        self.isExtension = False
+        self.ExtensionBase = ''
+        self.superClass = ''
+
+def webServiceNameClassifier():
+    """  """
+    def compute(self):
+        raise vistrails_module.IncompleteImplementation
+
+    return { 'compute': compute}
+
+def webServiceNameMethodDict():
+    """ This returns the method dictionary for the web service address base
+    class. """
+    def compute(self):
+        raise vistrails_module.IncompleteImplementation
+
+    return { 'compute': compute}
+
+def webServiceTypesDict(WBobj):
+    """ This will create a correct compute method according to the complex type
+    or enumeration name. """
+
+    def unwrapRequestobj(self,libobj,visobj):
+
+        #Find the children for the vistrail type and set the attributes
+        #Check to see if the name of the port is repeated
+        portname = visobj.name
+        dictkey = WBobj.webservice + "." + portname
+        complexsdict = webServicesmodulesDict[WBobj.namespace] 
+        obj = complexsdict[dictkey]
+        for child in obj.ports:
+            namechild = child[0]
+            typechild = child[1]
+            nameattrib = str(namechild)
+            nameattrib = nameattrib[0].upper() + nameattrib[1:]
+            sentence = "visobj" + "." + nameattrib
+            visdata = eval(sentence)
+            if visdata != None:
+                try:
+                    Type = wsdlTypesDict[str(typechild)]
+                    setattr(libobj,nameattrib,visdata)
+                except KeyError:
+                    #Check if the port is an Enumeration Constant
+                    keyvalue = WBobj.namespace.replace('|Types','') + "." + str(child[1])
+                    childType = complexsdict[keyvalue]
+                    if childType.typeobj == 'Enumeration':
+                        visobjchild = getattr(visobj,nameattrib)
+                        setattr(libobj, nameattrib, visobjchild)
+                    else:
+                        namemethod = "new_" + namechild
+                        libobjchild = getattr(libobj,namemethod)()
+                        visobjchild = getattr(visobj,nameattrib)
+                        setattr(libobj,nameattrib,libobjchild)
+                        unwrapRequestobj(self,libobjchild,visobjchild)
+        if obj.hasAttributes:                
+            for attributes in obj.attributes:
+                nameattrib = str(attributes[0])
+                nameattribute = nameattrib[0].upper() + nameattrib[1:]
+                sentence = "visobj" + "." + nameattribute
+                visdata = eval(sentence)
+                if visdata != None:
+                    nameattrib = "attribute_typecode_dict[" + nameattrib + "].pname"
+                    setattr(libobj,nameattrib,visdata)
+
+    def compute(self):
+        reg = vistrails.core.modules.module_registry.get_module_registry()
+        #Check if it is an enumeration
+        if WBobj.typeobj == 'Enumeration':
+            nameport = str(WBobj.ports[0][0])
+            if self.hasInputFromPort(nameport):
+                inputport = self.getInputFromPort(nameport)
+                self.holder = inputport
+                self.setResult(WBobj.name,self)
+                self.setResult('self',self)
+        else:
+            #Check if it is a request type
+            modbyname = reg.get_module_by_name(identifier = identifier, name = WBobj.name, namespace = WBobj.namespace)
+            porttype = str(modbyname.server._wsdl.portTypes.keys()[0][0][1])
+            listoperations = modbyname.server._wsdl.portTypes[porttype].operations.values()
+            isrequest = False
+            requestname = ''
+            modname = WBobj.name
+            for element in listoperations:
+                parts = modbyname.server._wsdl.messages[element.input.getMessage().name].parts.values()
+                for part in parts:
+                    if str(part.element[1]).strip() == modname.strip():
+                        requestname = element.input.getMessage().name
+                        isrequest = True
+                        break
+            if (isrequest == True):
+                WBobj.isRequestType = True
+                #Create the request object
+                try:
+                    req = getattr(self.modclient,requestname)()
+                except:
+                    print "sys.exc_value: ", sys.exc_value
+                #Set the values of the input ports in the resquest object
+                for types in WBobj.ports:
+                    nameport = str(types[0])
+                    if self.hasInputFromPort(nameport):
+                        #We need to distinguish between simple and complex types.
+                        inputport = self.getInputFromPort(nameport)
+                        try:
+                            Type = str(types[1])
+                            if isArray(Type):
+                                Type = 'Array'
+                            Type = wsdlTypesDict[Type]
+                            namemethod = "set_element_" + nameport
+                            try:
+                                getattr(req, namemethod)(inputport)
+                            except:
+                                namemethod = nameport
+                                setattr(req, namemethod,inputport)
+                        except KeyError:
+                            keyvalue = WBobj.namespace.replace('|Types','') + "." + str(types[1])
+                            #Check if the port is an Enumeration Constant
+                            complexsdict = webServicesmodulesDict[WBobj.namespace]
+                            childType = complexsdict[keyvalue]
+                            if childType.typeobj == 'Enumeration':
+                                namemethod = "set_element_" + nameport
+                                getattr(req, namemethod)(inputport)
+                            else:
+                                namemethod = "new_" + nameport
+                                libobj = getattr(req,namemethod)()
+                                unwrapRequestobj(self,libobj,inputport)
+                                namemethod = "set_element_" + nameport
+                                getattr(req, namemethod)(libobj)
+                if WBobj.hasAttributes:
+                    for types in WBobj.attributes:
+                        nameport = str(types[0])
+                        if self.hasInputFromPort(nameport):
+                            inputport = self.getInputFromPort(nameport)
+                            Type = wsdlTypesDict[str(types[1])]
+                            nameattrib = "attribute_typecode_dict[" + nameport + "].pname"
+                            setattr(req, nameattrib,inputport)
+
+                #Set the value in the response output port
+                nameport = str(WBobj.name)
+                #This step is to warranty that the name are not going to repeat    
+                for ports in WBobj.ports:
+                     if str(WBobj.name.strip()) == str(ports[0].strip()):
+                         nameport = WBobj.vistrailsname
+                         break
+                if WBobj.hasAttributes:
+                    for attributes in WBobj.attributes:
+                        if str(WBobj.name.strip()) == str(attributes[0].strip()):
+                            nameport = WBobj.vistrailsname
+                            break
+                self.setResult(nameport,req)
+                self.setResult('self',req)
+            else:
+                nameport = str(WBobj.name)
+                for ports in WBobj.ports:
+                    if str(WBobj.name.strip()) == str(ports[0].strip()):
+                        nameport = WBobj.vistrailsname
+                        break
+                if WBobj.hasAttributes:
+                    for attributes in WBobj.attributes:
+                        if str(WBobj.name.strip()) == str(attributes[0].strip()):
+                            nameport = WBobj.vistrailsname
+                            break
+                if self.hasInputFromPort(nameport):
+                    #Output modules
+                    inputport = self.getInputFromPort(nameport)
+                    for nameport in WBobj.ports:
+                        nameattrib = nameport[0][0].upper() + nameport[0][1:]
+                        sentence = "inputport" + "." + nameattrib
+                        outputport = eval(sentence)
+                        self.setResult(nameport[0],outputport)
+                    if WBobj.hasAttributes:
+                        for attributes in WBobj.attributes:
+                            nameattrib = attributes[0][0].upper() + attributes[0][1:]
+                            sentence = "inputport" + "." + nameattrib
+                            outputport = eval(sentence)
+                            self.setResult(attributes[0],outputport)
+                elif self.hasInputFromPort('self'):
+                    #Now we use the 'self' input port name
+                    #we keep the old for backwards compatibility
+                    #Output modules
+                    inputport = self.getInputFromPort('self')
+                    for nameport in WBobj.ports:
+                        nameattrib = nameport[0][0].upper() + nameport[0][1:]
+                        sentence = "inputport" + "." + nameattrib
+                        outputport = eval(sentence)
+                        self.setResult(nameport[0],outputport)
+                    if WBobj.hasAttributes:
+                        for attributes in WBobj.attributes:
+                            nameattrib = attributes[0][0].upper() + attributes[0][1:]
+                            sentence = "inputport" + "." + nameattrib
+                            outputport = eval(sentence)
+                            self.setResult(attributes[0],outputport)
+                else:    
+                    #Set the values in the input ports
+                    #Input modules
+                    for types in WBobj.ports:
+                        nameport = str(types[0])
+                        nameattrib = str(nameport)
+                        nameattrib = nameattrib[0].upper() + nameattrib[1:]
+                        if self.hasInputFromPort(nameport):
+                            inputport = self.getInputFromPort(nameport)
+                            setattr(self,nameattrib,inputport)
+                        else:
+                            setattr(self,nameattrib,None)
+                    if WBobj.hasAttributes:
+                        for types in WBobj.attributes:
+                            nameport = str(types[0])
+                            nameattrib = str(nameport)
+                            nameattrib = nameattrib[0].upper() + nameattrib[1:]
+                            if self.hasInputFromPort(nameport):
+                                inputport = self.getInputFromPort(nameport)
+                                setattr(self,nameattrib,inputport)
+                            else:
+                                setattr(self,nameattrib,None)
+                    #Set the value in the response output port
+                    nameport = str(WBobj.name)
+                    #This step is to warranty that the name are not going to repeat    
+                    for ports in WBobj.ports:
+                        if str(WBobj.name.strip()) == str(ports[0].strip()):
+                            nameport = WBobj.vistrailsname
+                            break
+                    if WBobj.hasAttributes:
+                        for attributes in WBobj.attributes:
+                            if str(WBobj.name.strip()) == str(attributes[0].strip()):
+                                nameport = WBobj.vistrailsname
+                                break
+                    self.setResult(nameport,self)
+                    self.setResult('self',self)
+
+    return {'compute':compute}
+
+
+def webServiceParamsMethodDict(name, server, inparams, outparams):
+    """ This will create a correct compute method according to the 
+    inparams and outparams. Right now, only the first outparam is used
+    for setting the result. """
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+
+    def wrapResponseobj(self,resp,visobj):
+        if isinstance(resp, list):
+            ptype = resp[0].typecode.type[1]
+        else:
+            if resp.typecode.type[1] == None:
+                ptype = resp.typecode.pname
+            else:    
+                ptype = resp.typecode.type[1]
+
+        #Find the children for the vistrail type and set the attributes
+        dictkey =  self.webservice + "|Types"        
+        complexsdict = webServicesmodulesDict[dictkey]
+        dictkey = self.webservice + "." + str(ptype)
+        obj = complexsdict[dictkey]
+        for child in obj.ports:
+            namechild = child[0]
+            typechild = child[1]    
+            try:
+                Type = wsdlTypesDict[str(typechild)]
+                namemethod = "get_element_" + str(namechild)
+                try:
+                    ans = getattr(resp, namemethod)()
+                except:
+                    #Some times when there is no complex type in the wsdl
+                    #the get and set methods are not generated
+                    namemethod = str(namechild)
+                    sentence = "resp" + "." + namemethod
+                    ans = eval(sentence)
+                nameattrib = str(namechild)
+                nameattrib = nameattrib[0].upper() + nameattrib[1:]
+                setattr(visobj,nameattrib,ans)
+
+            except KeyError:
+                if not isinstance(resp, list):
+                    namemethod = "get_element_" + namechild
+                    try:
+                        resp = getattr(resp, namemethod)()
+                    except:
+                        namemethod = str(namechild)
+                        sentence = "resp" + "." + namemethod
+                        resp = eval(sentence)
+
+                if isinstance(resp, list):
+                    objlist = []
+                    for element in resp:
+                        ptype = element.typecode.type[1]
+                        dictkey = self.webservice + "|Types" 
+                        complexsdict = webServicesmodulesDict[dictkey]
+                        dictkey = self.webservice + "." + str(ptype)
+                        obj = complexsdict[dictkey]
+                        visclass = reg.get_module_by_name(identifier=identifier,
+                                                          name=obj.name,
+                                                          namespace=obj.namespace)
+                        vischildobj = visclass()
+                        wrapResponseobj(self,element,vischildobj)
+                        objlist.append(vischildobj)
+                    nameattrib = str(namechild)
+                    nameattrib = nameattrib[0].upper() + nameattrib[1:]
+                    setattr(visobj,nameattrib,objlist)  
+                else:
+                    ptype = str(typechild)
+                    dictkey = self.webservice + "|Types"
+                    complexsdict = webServicesmodulesDict[dictkey]
+                    dictkey = self.webservice + "." + ptype
+                    obj = complexsdict[dictkey]
+                    vischildclass = reg.get_module_by_name(identifier=identifier,
+                                                           name=obj.name,
+                                                           namespace = obj.namespace)
+                    vischildobj = vischildclass()
+                    nameattrib = str(namechild)
+                    nameattrib = nameattrib[0].upper() + nameattrib[1:]
+                    #Set the attribute in the vistrail object (Same as in
+                    # schema but with the first letter uppercase)
+                    setattr(visobj,nameattrib,vischildobj)  
+                    visobjchild = getattr(visobj,nameattrib)
+                    wrapResponseobj(self,resp,visobjchild)
+
+    def compute(self):
+        dirmodule = dir(self.modclient)
+        #Get the locator name
+        for elemlist in dirmodule:
+            if elemlist.find('Locator') != -1:
+                namelocator = elemlist
+                break
+        #Get the port name
+        loc = getattr(self.modclient, namelocator)()
+        dirloc = dir(loc)
+        for elemlist in dirloc:
+            if ((elemlist.find('Address') == -1) and
+                ((elemlist.find('Port') != -1 and
+                  elemlist.find('get') != -1) or
+                 (elemlist.find('get') != -1 and
+                  elemlist.find('Soap') != -1) or
+                 (elemlist.find('get') != -1))):
+                portname = elemlist
+        port = getattr(loc, portname)()
+        try:
+            #This part is for the primitive or simple types methods parameters
+            Type = str(inparams[0].type[1])
+            if isArray(Type):
+                Type = 'Array'
+            Type = wsdlTypesDict[Type]
+            porttype = server._wsdl.portTypes.keys()[0][0][1]
+            listoperations = server._wsdl.portTypes[porttype].operations.values()
+            for element in listoperations: #list of operations instances
+                if str(element.name) == str(name):
+                    #get the request method name
+                    reqname = element.input.getMessage().name
+            try:
+                req = getattr(self.modclient,reqname)()
+            except:
+                print "sys.exc_value: ", sys.exc_value
+            for inparam in inparams:
+                #Now set all attributes for the request object
+                if self.hasInputFromPort(inparam.name):
+                    inputport = self.getInputFromPort(inparam.name)
+                    namemethod = "set_element_" + inparam.name
+                    try:
+                        getattr(req, namemethod)(inputport)
+                    except:
+                        namemethod = inparam.name
+                        setattr(req, namemethod,inputport)
+            try:
+                resp = getattr(port,name)(req)
+            except:
+                print "sys.exc_value: ", sys.exc_value
+                raise ModuleError(self, str(sys.exc_value))
+            namemethod = "get_element_" + outparams[0].name
+
+            try:
+                result = getattr(resp,namemethod)()
+            except:
+                namemethod = outparams[0].name
+                sentence = "resp" + "." + namemethod
+                result = eval(sentence)
+            self.setResult(outparams[0].name,result)
+        except KeyError:
+            #This part is for the complex types methods parameters
+            inparam = str(inparams[0].name)
+            if self.hasInputFromPort(inparam):
+                request = self.getInputFromPort(inparam)
+                try:
+                    resp = getattr(port,name)(request)
+                except:
+                    print "sys.exc_value: ", sys.exc_value
+                    raise ModuleError(self, str(sys.exc_value))
+                #Wrap the ZSI attributes into the vistrails module attributes
+                nameclass = str(outparams[0].type[1])
+                dictkey = self.webservice + "|Types"
+                complexsdict = webServicesmodulesDict[dictkey]
+                dictkey = self.webservice + "." + nameclass
+                obj = complexsdict[dictkey]
+                visclass = reg.get_module_by_name(identifier=identifier,
+                                                  name=obj.name,
+                                                  namespace=obj.namespace)
+                visobj = visclass()
+                wrapResponseobj(self,resp, visobj)
+                self.setResult(outparams[0].name,visobj)
+
+    return {'compute':compute}
+
+def processEnumeration(complexschema):
+    listenum = []
+    Type = complexschema.content.attributes['base'][1]
+    for facets in complexschema.content.facets:
+        listenum.append(facets.getAttributeDictionary()['value'])
+    return (listenum,Type)
+
+def processArray(complexschema,w):
+    # the problem here is that sometimes we are told that complexschema is an
+    # array but it is not. So if we get an AttributeError we will consider that
+    # complexschema is a regular complex type.
+    try:
+        contentschema =  complexschema.content.content.attr_content
+    except AttributeError:
+        print "warning: type is not an array..."
+        processType(complexschema,w)
+        return
+    
+    for child in contentschema:
+        nametype = str(child.attributes['http://schemas.xmlsoap.org/wsdl/']['arrayType'])
+        index = nametype.find(':')
+        nametype = nametype[index+1:]
+        #verify if is an array of complex types
+        index = nametype.find('[')
+        if index != -1:
+            Type = nametype[0:index]
+        try:
+            Type = wsdlTypesDict[str(Type)]
+        except KeyError:
+            try:
+                complex1 = schema.types[str(Type)]
+                processType(complex1,w)
+            except KeyError:    
+                pass
+
+def isArray(Type):   
+    #FIXME: this function not always work!!
+    #Just because there's the word Array doesn't mean it will be an array (Emanuele)         
+    if len(Type) > 5:
+        if Type[0:5] == 'Array':
+            return True
+        else:
+            return False
+
+def generatename(name):
+    name = name + "_1"
+    return name
+
+def processType(complexschema,w):
+    
+    contentschema = ''
+    modulename = str(complexschema.attributes['name'])
+    #print "processType: %s,%s"%(modulename,w)
+    try:
+        moduletype = str(complexschema.attributes['type'][1])
+    except KeyError:
+        moduletype = ''
+    modulekey = w + "." + modulename
+    objModule = WBModule(modulename)
+    objModule.superClass = moduletype
+    if complexschema.isSimple():
+        objModule.typeobj = 'Enumeration'
+        objModule.ports.append(processEnumeration(complexschema))
+
+    if complexschema.isElement():
+        try:
+            if complexschema.content.content == None:
+                contentschema = []
+            else:    
+                contentschema = complexschema.content.content.content
+            objModule.typeobj = 'ComplexType'
+            if (complexschema.content.content == None or
+                complexschema.content.content.content == ()):
+                objModule.isEmptySequence = True
+        except AttributeError:
+            pass
+
+    if complexschema.isComplex():
+        try:
+            #Extensions in a complex type
+            if complexschema.content.content.isExtension():
+                objModule = WBModule(modulename)
+                objModule.typeobj = 'ComplexType'
+                objModule.isExtension = True
+                objModule.ExtensionBase = str(complexschema.content.content.attributes['base'][1])
+                contentschema = complexschema.content.content.content.content
+        except AttributeError:
+            contentschema = complexschema.content.content
+    try:       
+        #Get all the attributes of the complex type
+        if complexschema.attr_content != None:
+            for attribute in complexschema.attr_content:
+                nametype = attribute.getAttributeName()
+                Type = 'string'
+                objModule.hasAttributes = True
+                objModule.attributes.append((nametype,Type))
+    except AttributeError:
+        pass
+
+    #Get all the child elements of the complex type
+    for child in contentschema:
+        try:
+            nametype = child.attributes['name']
+            Type = child.attributes['type'][1]
+            if isArray(Type):
+                Type = 'Array'
+                objModule.ports.append((nametype,Type))
+                processArray(child,w)
+            objModule.ports.append((nametype,Type))
+            try:
+                Type = wsdlTypesDict[str(Type)]
+            except KeyError:
+                try:
+                    complex1 = schema.types[str(Type)]
+                    processType(complex1,w)
+                except KeyError:    
+                    pass
+        except AttributeError:
+            pass
+
+    objModule.webservice = str(w)
+    complexsdict [modulekey] = objModule
+
+def addExtensionsModules(w, server, extensionbase):
+    """ Add complex types specified in the extension base if they are not in
+    the complex types dictionary. """
+    try:
+        dictkey = w + "|Types"
+        complexsdict = webServicesmodulesDict[dictkey]
+        dictkey = w + "." + extensionbase
+        extensionobj = complexsdict[dictkey]
+    except KeyError:
+        for schematypes in server._wsdl.types.keys():
+            schema = server._wsdl.types[str(schematypes)]
+            if len(schema.types.keys()) != 0:
+                try:
+                    extensionbasestr = str(extensionbase)
+                    complex1 = schema.types[extensionbasestr]
+                    processType(complex1,w)
+                except KeyError:
+                    pass        
+            if len(schema.elements.keys()) != 0:
+                try:
+                    extensionbasestr = str(extensionbase)
+                    complex1 = schema.elements[str(extensionbasestr)]
+                    processType(complex1,w)
+                except KeyError:
+                    pass
+
+def processExtension(w, server):
+    dictkey = w + "|Types"
+    complexsdict = webServicesmodulesDict[dictkey]
+    keys = complexsdict.keys()
+    keys.sort()
+    for types in keys:
+        obj = complexsdict[types]
+        if obj.isExtension:
+            #Add extensions to modulesDict dictionary
+            extensionbase = obj.ExtensionBase
+            addExtensionsModules(w, server, extensionbase)
+            keys2 = complexsdict.keys()
+            keys2.sort()
+            for types2 in keys2:
+                obj2 = complexsdict[types2]
+                if obj2.name == extensionbase:
+                    for port in obj2.ports:
+                        obj.ports.append(port)
+                    break
+
+def addTypesModules(w,modclient,server):
+    """ Create a VisTrails module for each complex type specified in
+    webservicesmodulesDict dictionary. """
+    def addObj(obj, namespace):
+        if hasattr(obj,"superClass"):
+            SuperType = str(obj.superClass)
+        else:
+            SuperType = ''
+        #print "Adding obj ", obj.name, " ", SuperType
+        if SuperType != '':
+            try:
+                if isArray(SuperType):
+                    SuperType = 'Array'
+                SuperType = wsdlTypesDict[SuperType]
+                mt = new_module(SuperType,str(obj.name), webServiceTypesDict(obj))
+                mt.name = obj.name
+                mt.webservice = w
+                mt.modclient = modclient
+                mt.server = server
+                mt.isEnumeration = False
+                mt.namespace = namespace
+                #print "  add to reg: ", mt.name, namespace, identifier
+                reg.add_module(mt, namespace=namespace, 
+                               package=identifier, package_version=version)
+            except KeyError:
+                try:
+                    modname = SuperType
+                    dictkey = w + "|Types"
+                    typedict = webServicesmodulesDict[dictkey]
+                    dictkey = w + "." + modname
+                    typeObj = typedict[dictkey]
+                    try:
+                        SuperType = reg.get_module_by_name(identifier =identifier,
+                                                       name=typeObj.name,
+                                                       namespace = typeObj.namespace)
+                        mt = new_module(SuperType,str(obj.name), webServiceTypesDict(obj))
+                        mt.name = obj.name
+                        mt.webservice = w
+                        mt.modclient = modclient
+                        mt.server = server
+                        mt.isEnumeration = False
+                        mt.namespace = namespace
+                        #print "  add to reg: ", mt.name, namespace, identifier
+                        reg.add_module(mt, namespace=namespace, 
+                               package=identifier, package_version=version)
+                    except:
+                        addObj(typeObj,namespace)
+
+                except KeyError:
+                    pass
+        else:
+            mt = new_module(WebService,str(obj.name), webServiceTypesDict(obj))
+            mt.name = obj.name
+            mt.webservice = w
+            mt.modclient = modclient
+            mt.server = server
+            mt.isEnumeration = False
+            mt.namespace = namespace
+            #print "  add to reg: ", mt.name, namespace, identifier
+            reg.add_module(mt, namespace=namespace, 
+                           package=identifier, package_version=version)    
+             
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    namespace = w + "|Types"
+    complexsdict = webServicesmodulesDict[namespace]
+    keys = complexsdict.keys()
+    keys.sort()
+    for dictkey in keys:
+        obj = complexsdict[dictkey]
+        #print "key: ", dictkey, " obj: ", obj.name
+        obj.namespace = namespace
+        if obj.typeobj == 'Enumeration':
+            mt = enumeration_widget.initialize(obj.name, namespace,identifier,
+                                               version)
+        else:
+            
+            addObj(obj,namespace)
+            #mt = new_module(WebService,str(obj.name), webServiceTypesDict(obj))
+            #mt.name = obj.name
+            #mt.webservice = w
+            #mt.modclient = modclient
+            #mt.server = server
+            #mt.isEnumeration = False
+            #mt.namespace = namespace
+            #reg.add_module(mt, namespace=namespace, 
+            #               package=identifier, package_version=version)
+
+def addMethodsModules(w,modclient,server):
+    """ Create a VisTrails module for each complex type specified in
+    webservicesmodulesDict dictionary. """
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    namespace = w + "|Methods"
+    complexsdict = webServicesmodulesDict[namespace]
+    keys = complexsdict.keys()
+    keys.sort()
+    for dictkey in keys:
+        obj = complexsdict[dictkey]
+        obj.namespace = namespace  
+        mt = new_module(WebService,str(obj.name),
+                        webServiceParamsMethodDict(str(obj.name), server,
+                                                   obj.ports[0], obj.ports[1]))
+        mt.name = obj.name
+        mt.webservice = w
+        mt.modclient = modclient
+        mt.server = server
+        mt.namespace = namespace
+        reg.add_module(mt, namespace= namespace, package=identifier,
+                       package_version=version)
+
+def addPortsToTypes(w):
+    """ Add input and output ports to the VisTrails complex type modules. """
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    dictkey = w + "|Types"
+    complexsdict = webServicesmodulesDict[dictkey]
+    keys = complexsdict.keys()
+    for dictkey in keys:
+        #Add the Ports that are of the module type
+        obj = complexsdict[dictkey]
+        if obj.webservice == w:
+            objtype = reg.get_module_by_name(identifier=identifier,
+                                             name=obj.name,
+                                             namespace=obj.namespace)
+            #print "Adding ports to ", obj.name
+            portname = 'self'
+            if obj.typeobj != 'Enumeration':
+                for ports in obj.ports:
+                    #This step is to warranty that the name are not going
+                    #to repeat
+                    #print " > ", ports
+                    if str(portname.strip()) == str(ports[0].strip()):
+                        obj.vistrailsname = generatename(portname)
+                        portname = obj.vistrailsname
+                        break    
+                if obj.hasAttributes:
+                    for attributes in obj.attributes:
+                        #This step is to warranty that the name are not
+                        #going to repeat
+                        if str(portname.strip()) == str(attributes[0].strip()):
+                            obj.vistrailsname = generatename(portname)
+                            portname = obj.vistrailsname
+                            break
+            reg.add_input_port(objtype,portname,(objtype, ''))
+            reg.add_output_port(objtype,portname,(objtype, ''))
+            
+            # this is to keep compatibility with previous versions
+            # we will add as optional ports.
+            reg.add_input_port(objtype,obj.name,(objtype, ''), optional=True)
+            reg.add_output_port(objtype,obj.name,(objtype, ''), optional=True)
+            
+            if obj.typeobj != 'Enumeration':
+                #Add ports according to the input and output parameters
+                for ports in obj.ports:
+                    try:
+                        Type = wsdlTypesDict[str(ports[1])]
+                    except KeyError:
+                        portname = str(ports[1])
+                        namespace = w + '|Types'
+                        Type = reg.get_module_by_name(identifier = identifier, name =portname, namespace = namespace)
+                    reg.add_input_port(objtype,str(ports[0]),(Type, ''))
+                    reg.add_output_port(objtype,str(ports[0]),(Type, ''))
+            if obj.hasAttributes == True:
+                for attributes in obj.attributes:
+                    Type = wsdlTypesDict[str(attributes[1])]
+                    reg.add_input_port(objtype,str(attributes[0]),(Type, ''))
+                    reg.add_output_port(objtype,str(attributes[0]),(Type, ''))
+
+def addPortsToMethods(w):
+    """ Add input and output ports to the VisTrails complex type modules. """
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    dictkey = w + "|Methods"
+    complexsdict = webServicesmodulesDict[dictkey]
+    keys = complexsdict.keys()
+    for dictkey in keys:
+        obj = complexsdict[dictkey]
+        objtype = reg.get_module_by_name(identifier = identifier, name = obj.name, namespace = obj.namespace)
+        #Add input ports
+        for port in obj.ports[0]:
+            try:
+                nameport = str(port.name)
+                Type = str(port.type[1])
+                if isArray(Type):
+                    Type = 'Array'
+                Type = wsdlTypesDict[Type]
+                reg.add_input_port(objtype,nameport,(Type, ''))
+            except KeyError:
+                try:
+                    modname = str(port.type[1])
+                    dictkey = w + "|Types"
+                    typedict = webServicesmodulesDict[dictkey]
+                    dictkey = w + "." + modname
+                    typeObj = typedict[dictkey]
+                    Type = reg.get_module_by_name(identifier=identifier,
+                                                  name=typeObj.name,
+                                                  namespace=typeObj.namespace)
+                    reg.add_input_port(objtype,str(port.name),(Type, ''))
+                except KeyError:
+                    pass
+        #Add output ports        
+        for port in obj.ports[1]:
+            try:
+                nameport = str(port.name)
+                Type = str(port.type[1])
+                if isArray(Type):
+                    Type = 'Array'
+                Type = wsdlTypesDict[Type]
+                reg.add_output_port(objtype,nameport,(Type, ''))
+            except KeyError:
+                try:
+                    modname = str(port.type[1])
+                    dictkey = w + "|Types"
+                    typedict = webServicesmodulesDict[dictkey]
+                    dictkey = w + "." + modname
+                    typeObj = typedict[dictkey]
+                    Type = reg.get_module_by_name(identifier=identifier,
+                                                  name=typeObj.name,
+                                                  namespace=typeObj.namespace)
+                    reg.add_output_port(objtype,str(port.name),(Type, ''))
+                except KeyError:
+                    pass        
+
+#Dictionary of primitive types
+#list extracted from http://www.w3.org/2001/XMLSchema
+wsdlTypesDict = { 'string' : vistrails.core.modules.basic_modules.String,
+                'float': vistrails.core.modules.basic_modules.Float,
+                'decimal': vistrails.core.modules.basic_modules.Float,
+                'double': vistrails.core.modules.basic_modules.Float,
+                'boolean': vistrails.core.modules.basic_modules.Boolean,
+                'anyType': vistrails.core.modules.basic_modules.Variant,
+                'anyURI': vistrails.core.modules.basic_modules.String,
+                'DataHandler':vistrails.core.modules.basic_modules.String,
+                'dateTime': vistrails.core.modules.basic_modules.String,
+                'duration': vistrails.core.modules.basic_modules.String,
+                'time': vistrails.core.modules.basic_modules.String,
+                'date': vistrails.core.modules.basic_modules.String,
+                'gYearMonth': vistrails.core.modules.basic_modules.String,
+                'gYear': vistrails.core.modules.basic_modules.String,
+                'gMonthDay': vistrails.core.modules.basic_modules.String,
+                'gDay': vistrails.core.modules.basic_modules.String,
+                'gMonth': vistrails.core.modules.basic_modules.String,
+                'hexBinary': vistrails.core.modules.basic_modules.String,
+                'base64Binary': vistrails.core.modules.basic_modules.String,
+                'QName': vistrails.core.modules.basic_modules.String,
+                'normalizedString': vistrails.core.modules.basic_modules.String,
+                'token': vistrails.core.modules.basic_modules.String,
+                'language': vistrails.core.modules.basic_modules.String,
+                'IDREFS': vistrails.core.modules.basic_modules.String,
+                'ENTITIES': vistrails.core.modules.basic_modules.String,
+                'NMTOKEN': vistrails.core.modules.basic_modules.String,
+                'NMTOKENS': vistrails.core.modules.basic_modules.String,
+                'Name': vistrails.core.modules.basic_modules.String,
+                'NCName': vistrails.core.modules.basic_modules.String,
+                'ID': vistrails.core.modules.basic_modules.String,
+                'IDREF': vistrails.core.modules.basic_modules.String,
+                'ENTITY': vistrails.core.modules.basic_modules.String,
+                'integer' : vistrails.core.modules.basic_modules.Integer,
+                'nonPositiveInteger' : vistrails.core.modules.basic_modules.Integer,
+                'negativeInteger' : vistrails.core.modules.basic_modules.Integer,
+                'long' : vistrails.core.modules.basic_modules.Integer,
+                'int' : vistrails.core.modules.basic_modules.Integer,
+                'short' : vistrails.core.modules.basic_modules.Integer,
+                'byte' : vistrails.core.modules.basic_modules.Integer,
+                'nonNegativeInteger' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedLong' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedInt' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedShort' : vistrails.core.modules.basic_modules.Integer,
+                'unsignedByte' : vistrails.core.modules.basic_modules.Integer,
+                'positiveInteger' : vistrails.core.modules.basic_modules.Integer,
+                'Array': vistrails.core.modules.basic_modules.List}
+
+################################################################################
+def load_wsdl_no_config(wsdlList):
+    """load_wsdl_no_config(wsdlList: list of urls) -> (bool, errors)
+    This loads the wsdl list without creating config files.
+    Returns a tuple with two values. The first is a boolean that is True
+    in case of success. The second is a list with problematic urls.
+    
+    """
+    global complexsdict
+    result = True
+    not_loaded = []
+    for w in wsdlList:
+        # Validation if the user introduces a blank space in the list of web
+        # services
+        if w == '':
+            continue
+        complexsdict = {} #Dictionary that contains the methods or the
+                          #types of a web service
+        w = w.strip()
+        numtimes = 0
+        for element in wsdlList:
+            if w == element.strip():
+                numtimes = numtimes + 1
+        if numtimes > 1:
+            # as this is not a big problem, let's just print on the console
+            print "Warning: Web service '%s' is repeated in the list and won't \
+be loaded again." % w
+            # this is not a problem, we will just ignore it
+            continue
+        try:
+            s = w.split('/')
+            host = s[2]
+        except:
+            msg = "Malformed URL."
+            not_loaded.append((w,msg))
+            result = False
+            continue
+        location = w
+        try:
+            reader = WSDLTools.WSDLReader()
+            wsdl = reader.loadFromURL(location)
+            
+        except Exception, e:
+            # we will not show this every time. Just in the end
+            # so we can show a single message for everybody
+            not_loaded.append((w,str(e)))
+            result = False
+            continue
+
+        #create a directory for each webservice if it does not exist
+        package_directory = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                         "webServices")
+        sys.path.append(package_directory)
+        directoryname = urllib.quote_plus(w)
+        directoryname = directoryname.replace(".","_")
+        directoryname = directoryname.replace("%","_")
+        directoryname = directoryname.replace("+","_")
+        package_subdirectory = os.path.join(package_directory, directoryname)
+        wsm = WriteServiceModule(wsdl)
+        client_mod = wsm.getClientModuleName()
+        types_mod = wsm.getTypesModuleName()
+
+        #import the stub generated files
+        try:
+            importpackage = __import__(directoryname)
+            modclient = getattr(importpackage,client_mod)
+            server = ServiceProxy(w, pyclass=True, tracefile=sys.stdout)
+        except Exception, e:
+            msg =  "Couldn't load generated stub file: %s"%str(e)
+            not_loaded.append((w,msg))
+            result = False
+            continue
+        
+        addTypesModules(w,modclient,server)
+        addPortsToTypes(w)
+        addMethodsModules(w,modclient,server)
+        addPortsToMethods(w)
+    return (result, not_loaded)
+
+def load_wsdl_with_config(wsdlList):
+    """load_wsdl_with_config(wsdlList: list of urls) -> (bool,list)
+    This loads the wsdl list creating config files.
+    Returns a tuple with two values. The first is a boolean that is True
+    in case of success. The second is a list with problematic urls"""
+    
+    global schema
+    global webServicesmodulesDict
+    global complexsdict
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    basic = vistrails.core.modules.basic_modules
+    not_loaded = []
+    result = True
+    for w in wsdlList:
+        #Validation if the user introduces a blank space in the list of
+        #web services
+        if w == '':
+            continue
+        complexsdict = {} #This dictionary stores the complex types for
+                          #a webservice w
+        w = w.strip()
+        #Check to see if the element is not repeated in the web services list
+        numtimes = 0
+        for element in wsdlList:
+            if w == element.strip():
+                numtimes = numtimes + 1
+        if numtimes > 1:
+            print "The following web service is repeated in the list and won't \
+be loaded again: %s"% w
+            continue
+          
+        #Create the stub files for the webservices that have been
+        # modified since the last time they where loaded in VisTrails
+        try:
+            s = w.split('/')
+            host = s[2]
+        except:
+            msg = "Malformed URL."
+            not_loaded.append((w,msg))
+            result = False
+            continue
+        location = w
+        ok = 0 # Trying to load a few times
+               # a couple of times, because sometimes we have timeout
+        msg = ''
+        while ok < 3:
+            try:
+                reader = WSDLTools.WSDLReader()
+                wsdl = reader.loadFromURL(location)
+                ok = 4
+                failed = False
+            except Exception, e:
+                ok += 1
+                failed = True
+                msg = str(e)
+
+        if failed:
+            not_loaded.append((w,msg))
+            result = False
+            continue
+        #create a directory for each webservice if it does not exist
+        directoryname = urllib.quote_plus(w)
+        directoryname = directoryname.replace(".","_")
+        directoryname = directoryname.replace("%","_")
+        directoryname = directoryname.replace("+","_")
+
+        package_directory = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                         "webServices")
+        sys.path.append(package_directory)
+        package_subdirectory = os.path.join(package_directory,
+                                            directoryname)
+        
+        wsm = WriteServiceModule(wsdl)
+        client_mod = wsm.getClientModuleName()
+        types_mod = wsm.getTypesModuleName()
+        client_file = os.path.join(package_subdirectory, '%s.py' %client_mod)
+        types_file = os.path.join(package_subdirectory, '%s.py' %types_mod)
+        filename = '__init__'
+        init_file = os.path.join(package_subdirectory, '%s.py' %filename)
+        conn = httplib.HTTPConnection(host)
+        filename = '/' + '/'.join(s[3:])
+        request = conn.request("GET", filename)
+        response = conn.getresponse()
+        if not os.path.isdir(package_subdirectory):
+            try:
+                print "Creating package subdirectory...",
+                os.mkdir(package_subdirectory)
+                print "done."
+            except:
+                msg = "\nCould not create package subdirectory. Make sure \
+'%s' does not exist and parent directory is writable." % package_subdirectory
+                print "Skipping '%s'" % w
+                # We don't need to exit here. Continuing try to load
+                # the other files
+                not_loaded.append((w,msg))
+                result = False
+                continue
+                
+        #generate the stub files
+        try:
+            from ZSI.generate.containers import ServiceHeaderContainer,\
+                 TypecodeContainerBase, TypesHeaderContainer
+            kwargs = {'module':'ZSI.generate.pyclass', 
+                      'metaclass':'pyclass_type'}
+            TypecodeContainerBase.metaclass = kwargs['metaclass']
+            TypesHeaderContainer.imports.append(\
+                  'from %(module)s import %(metaclass)s' %kwargs
+                  )
+            ServiceHeaderContainer.imports.append (\
+            'from %(module)s import %(metaclass)s' %kwargs
+            )
+            
+            fd = open(client_file, 'w+')
+            wsm.writeClient(fd)
+            fd.close()
+            
+            fd = open(types_file, 'w+' )
+            wsm.writeTypes(fd)
+            fd.close()
+              
+            fd = open(init_file, 'w')
+            content = 'import ' + client_mod
+            fd.write(content)
+            fd.close()
+        except Exception, e:
+            msg = "Couldn't generate stub file: %s"% str(e)
+            not_loaded.append((w,msg))
+            result = False
+            continue
+        #import the stub generated files
+        try:
+            importpackage = __import__(directoryname)
+            modclient = getattr(importpackage,client_mod)
+            server = ServiceProxy(w, pyclass=True, tracefile=sys.stdout)
+        except Exception, e:
+            msg = "Problem importing the generated stub files: %s", str(e)
+            not_loaded.append((w,msg))
+            result = False
+            continue
+
+        #Set up the dictionary with all the complex types modules and their ports.
+        for schematypes in server._wsdl.types.keys():
+            schema = server._wsdl.types[str(schematypes)]
+            if len(schema.types.keys()) != 0:
+                for schematype in schema.types.keys():
+                    try:
+                        complex1 = schema.types[str(schematype)]
+                        modulename = str(complex1.attributes['name'])
+                        try:
+                            dictkey = w + "." + modulename
+                            typeObj = complexsdict[dictkey]
+                        except KeyError:
+                            #Check if it is an array.  Arrays are python
+                            #lists, not complex types though they can
+                            #contain complex types elements.
+                            Type = str(schematype)
+                            if isArray(Type):
+                                processArray(complex1,w)
+                            else:
+                                processType(complex1,w)
+                    except KeyError:
+                        pass
+            if len(schema.elements.keys()) != 0:
+                for schematype in schema.elements.keys():
+                    try:
+                        complex1 = schema.elements[str(schematype)]
+                        modulename = str(complex1.attributes['name'])
+                        try:
+                            dictkey = w + "." + modulename
+                            typeObj = complexsdict[dictkey]
+                        except KeyError:
+                            #Check if it is an array.  Arrays are python
+                            #lists, not complex types, though they can
+                            #contain complex types elements.
+                            Type = str(schematype)
+                            if isArray(Type):
+                                processArray(complex1,w)
+                            else:
+                                processType(complex1,w)
+                    except KeyError:
+                        pass
+        dictkey = w + "|Types"
+        webServicesmodulesDict[dictkey] = complexsdict            
+        complexsdict = {}
+        #get all the service's methods and for each method create a
+        #module also create
+        # a module for the complex types classes and enumerations.
+        
+        # Add the Extensions if there is any in the complex types
+        processExtension(w,server)
+
+        #Create the VisTrails modules with their ports
+        addTypesModules(w,modclient,server)
+
+        addPortsToTypes(w)
+
+        #Open the file with methods
+        #Add the Methods
+        keys = server._methods.keys()
+        keys.sort()
+        
+        for kw in keys:
+            methods = server._methods[kw]
+            callInfo = methods[0].callinfo
+            inparams = callInfo.inparams
+            outparams = callInfo.outparams
+            mt = new_module(WebService,str(kw), 
+                            webServiceParamsMethodDict(str(kw),server,
+                                                       inparams,
+                                                       outparams))
+            mt.webservice = w
+            mt.modclient = modclient
+            namespace = w + '|Methods'
+            mt.namespace = namespace
+            
+            reg.add_module(mt, namespace= namespace, package=identifier,
+                           package_version=version)
+            
+            objModule = WBModule(kw)
+            objModule.namespace = namespace
+            objModule.webservice = w
+            objModule.typeobj = 'Method'
+            objModule.ports.append(inparams)
+            objModule.ports.append(outparams)
+            #Add the input (ports) parameters to the methods
+            for p in inparams:
+                try:
+                    nameport = str(p.name)
+                    Type = str(p.type[1])
+                    if isArray(Type):
+                        Type = 'Array'
+                    Type = wsdlTypesDict[Type]
+                    reg.add_input_port(mt,nameport,(Type, ''))
+                except KeyError:
+                    try:
+                        modname = str(p.type[1])
+                        dictkey = w + "|Types"
+                        typedict = webServicesmodulesDict[dictkey]
+                        dictkey = w + "." + modname
+                        typeObj = typedict[dictkey]
+                        Type = reg.get_module_by_name(identifier =identifier,
+                                                      name=typeObj.name,
+                                                      namespace = typeObj.namespace)
+                        reg.add_input_port(mt,str(p.name),(Type, ''))
+                    except KeyError:
+                        pass
+            #Add the output (ports) parameters to the methods
+            for p in outparams:
+                try:
+                    nameport = str(p.name)
+                    Type = str(p.type[1])
+                    if isArray(Type):
+                        Type = 'Array'
+                    Type = wsdlTypesDict[Type]
+                    reg.add_output_port(mt,nameport,(Type, ''))
+                except KeyError:
+                    try:
+                        modname = str(p.type[1])
+                        dictkey = w + "|Types"
+                        typedict = webServicesmodulesDict[dictkey]
+                        dictkey = w + "." + modname
+                        typeObj = typedict[dictkey]
+                        Type = reg.get_module_by_name(identifier=identifier,
+                                                      name=typeObj.name,
+                                                      namespace = typeObj.namespace)
+                        reg.add_output_port(mt,str(p.name),(Type, ''))
+                    except KeyError:
+                        pass
+            modulekey = w + "." + str(kw)
+            complexsdict[modulekey] = objModule
+        dictkey = w + "|Methods"
+        webServicesmodulesDict[dictkey] = complexsdict        
+    #Write modules.conf file that will contain the types and methods
+    #dictionary of the web services.
+    namefile = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                            'webServices',
+                            'modules.conf')    
+    try:
+        ouf = open(namefile, 'w')
+        cPickle.dump(webServicesmodulesDict,ouf)
+        ouf.close()
+    except Exception, e:
+        msg = "Error generating web services configuration file %s"%str(e)
+        raise RuntimeError(msg)
+
+    return(result,not_loaded)
+        
+def verify_wsdl(wsdlList):
+    """verify_wsdl(wsdlList: list of urls) -> (list,list,list)
+
+    This checks for the wsdls that need to be updated or the files need to be
+    generated and splits them in 3 lists: files that are outdated, updated and
+    ones that an error was generated.
+    
+    """
+    outdated_list = []
+    updated_list = []
+    error_list = []
+    for w in wsdlList:
+        if w == '':
+            continue
+        try:
+            s = w.split('/')
+            host = s[2]
+        except:
+            msg = "Malformed URL."
+            error_list.append((w,msg))
+            continue
+        location = w
+        reader = WSDLTools.WSDLReader()
+        load = reader.loadFromURL
+        try:
+            wsdl = load(location)
+        except Exception, e:
+            msg = "Couldn't load wsdl from the web: %s."%str(e)
+            error_list.append((w,msg))
+            continue
+        directoryname = urllib.quote_plus(w)
+        directoryname = directoryname.replace(".","_")
+        directoryname = directoryname.replace("%","_")
+        directoryname = directoryname.replace("+","_")
+        package_subdirectory = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                            "webServices",
+                                            directoryname)
+        wsm = WriteServiceModule(wsdl)
+        client_mod = wsm.getClientModuleName()
+        client_file = os.path.join(package_subdirectory, '%s.py' %client_mod)
+        conn = httplib.HTTPConnection(host)
+        filename = '/' + '/'.join(s[3:])
+        request = conn.request("GET", filename)
+        response = conn.getresponse()
+        remoteHeader = response.msg.getheader('last-modified')
+        isoutdated = False
+        if remoteHeader != None:
+            localFile = client_file
+            reg = vistrails.core.modules.module_registry.get_module_registry()
+            httpfile = reg.get_descriptor_by_name(
+                'org.vistrails.vistrails.http', 'HTTPFile').module()
+            try:
+                isoutdated = httpfile._is_outdated(remoteHeader, localFile)
+            except OSError:
+                print "File doesn't exist"
+                isoutdated = True
+        if isoutdated or remoteHeader == None:
+            outdated_list.append(w)
+        else:
+            updated_list.append(w)
+    return (outdated_list,updated_list, error_list)
+            
+def initialize(*args, **keywords):
+    import vistrails.core.packagemanager
+    global schema
+    global webServicesmodulesDict
+    global complexsdict
+    wsdlList = []
+    if configuration.showWarning == True:
+        msg = "The Web Services package is deprecated and will be removed from \
+next VisTrails release. Please consider using the new SUDS Web Services package. \
+This message will not be shown again."
+        pm.show_error_message(pm.get_package(identifier),msg)
+        try:
+            from vistrails.gui.application import get_vistrails_application
+            if get_vistrails_application() is not None:
+                configuration.showWarning = False
+                VisTrailsApplication.save_configuration()
+        except:
+            pass
+    if configuration.check('wsdlList'):
+        wsdlList = configuration.wsdlList.split(";")
+
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    basic = vistrails.core.modules.basic_modules
+    reg.add_module(WebService)
+
+    #Create a directory for the webServices package
+    global package_directory
+    package_directory = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                     "webServices")
+    if not os.path.isdir(package_directory):
+        try:
+            print "Creating package directory..."
+            os.mkdir(package_directory)
+        except:
+            print "Could not create package directory. Make sure"
+            print "'%s' does not exist and parent directory is writable"
+            sys.exit(1)
+
+    pathfile = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                            "webServices",
+                            "modules.conf")
+    outdated_list = []
+    updated_list = []
+    error_list = []
+    if os.path.isfile(pathfile):
+        #Verify if there is a need to update the modules configuration
+        #file (modules.conf)
+         (outdated_list, updated_list, error_list) = verify_wsdl(wsdlList)
+             
+    else:
+        #If the modules configuration file doesn't exist, create it
+        outdated_list = wsdlList 
+
+        #If the stub files are not updated or there is not information in
+        # the header about the modification date of the web service, the
+        # stubs files and a modules configuration file will be created
+        # otherwise the information of the modules will be obtained from
+        # the modules.conf files that contains serialized data of the methods
+        # and the complex types of the web services
+    if os.path.isfile(pathfile):
+        try: 
+            inf = open(pathfile)
+            webServicesmodulesDict = cPickle.load(inf)
+            inf.close()
+        except Exception, e:
+            msg = "Error loading configuration file: ", pathfile
+            raise IOError(msg)
+    
+    #print wsdlList, outdated_list, updated_list
+    (res, not_loaded) = load_wsdl_no_config(updated_list)
+    if not res:
+        #there was a problem when trying to load the stubs
+        # let's try creating them again
+        for (w,e) in not_loaded:
+            outdated_list.append(w)
+        print "There were problems loading the webservices %s" % not_loaded
+        print "We will try to load them again..."
+    (res, not_loaded) = load_wsdl_with_config(outdated_list)
+    if not res or len(error_list) > 0:
+        msg = """ There were problems loading the webservices.
+The following could not be loaded:\n"""
+        error_list.extend(not_loaded)
+        for (w,e) in error_list:
+            msg += "Url: '%s', error: '%s'\n"%(w,e)
+        pm.show_error_message(pm.get_package(identifier),msg)
+
+def handle_missing_module(*args, **kwargs):
+    global webServicesmodulesDict
+    
+    #this is the order the arguments are passed to the function
+    controller = args[0]
+    m_id = args[1]
+    pipeline = args[2]
+    
+    def get_wsdl_from_namespace(m_namespace):
+        try:
+            wsdl = m_namespace.split("|")
+            return wsdl[0]
+        except:
+            print "invalid namespace"
+            return None
+    m = pipeline.modules[m_id]
+    m_namespace = m.namespace
+    
+    wsdl = get_wsdl_from_namespace(m_namespace)
+    if wsdl:
+        outdated_list = []
+        updated_list = []
+        error_list = []
+        print "Downloading %s and adding to the Module list..."%wsdl
+        pathfile = os.path.join(vistrails.core.system.current_dot_vistrails(),
+                                "webServices",
+                                "modules.conf")
+        if os.path.isfile(pathfile):
+            #Verify if there is a need to update the modules configuration
+            #file (modules.conf)
+            (outdated_list, updated_list, error_list) = verify_wsdl([wsdl])
+            #print "verified: createconfig file is %s"%createconfigfile
+        else:
+            #If the modules configuration file doesn't exist, create it
+            outdated_list = [wsdl]
+        
+        #If the stub files are not updated or there is not information in
+        # the header about the modification date of the web service, the
+        # stubs files and a modules configuration file will be created
+        # otherwise the information of the modules will be obtained from
+        # the modules.conf files that contains serialized data of the methods
+        # and the complex types of the web services
+        # print outdated_list, updated_list, error_list
+        if os.path.isfile(pathfile):
+            try: 
+                inf = open(pathfile)
+                webServicesmodulesDict = cPickle.load(inf)
+                inf.close()
+            except:
+                print "Error loading configuration file"
+                return False
+        try:
+            (res,not_loaded) = load_wsdl_no_config(updated_list)
+            #print "done loading_no_config"
+            if not res:
+                outdated_list.extend([wsdl])
+        
+            (res, not_loaded) = load_wsdl_with_config(outdated_list)
+            #print "done loading_with_config"
+            if res:
+                #add new url to package config file
+                wsdlList = []
+                if configuration.check('wsdlList'):
+                    wsdlList = configuration.wsdlList.split(";")
+                if wsdl not in wsdlList:
+                    wsdlList.append(wsdl)    
+                swsdlList = ";".join(wsdlList)
+                configuration.wsdlList = swsdlList
+                print "done."
+                return True
+            else:
+                msg = """ There were problems loading the webservice.
+The following could not be loaded:\n"""
+                error_list.extend(not_loaded)
+                for (w,e) in error_list:
+                    msg += "Url: '%s', error: '%s'\n"%(w,e)
+                    pm.show_error_message(pm.get_package(identifier),msg)
+        except Exception, e:
+            print e
+            import traceback
+            traceback.print_stack()
+    print "An error occurred. Could not add missing wsdl."
+    return False
diff --git a/vistrails/run.py b/vistrails/run.py
new file mode 100644
index 0000000..681d63a
--- /dev/null
+++ b/vistrails/run.py
@@ -0,0 +1,147 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Main file for the VisTrails distribution."""
+
+import os
+import sys
+
+# Allows the userpackages directory to be overridden through an environment
+# variable
+# As this variable is set by the package manager, this also allows
+# multiprocessing to work correctly on Windows, where fork is not used and thus
+# 'userpackages' needs to be available in processes spawned from a
+# userpackage's code
+try:
+    userpackages_dir = os.environ['VISTRAILS_USERPACKAGES_DIR']
+except KeyError:
+    pass
+else:
+    old_sys_path = list(sys.path)
+    sys.path.insert(0, os.path.join(userpackages_dir, os.path.pardir))
+    try:
+        import userpackages
+    except ImportError:
+        sys.stderr.write("Couldn't import VISTRAILS_USERPACKAGES_DIR (%s), "
+                         "continuing\n" % userpackages_dir)
+
+def disable_lion_restore():
+    """ Prevent Mac OS 10.7 to restore windows state since it would
+    make Qt 4.7.3 unstable due to its lack of handling Cocoa's Main
+    Window. """
+    import platform
+    if platform.system()!='Darwin': return
+    release = platform.mac_ver()[0].split('.')
+    if len(release)<2: return
+    major = int(release[0])
+    minor = int(release[1])
+    if major*100+minor<107: return
+    ssPath = os.path.expanduser('~/Library/Saved Application State/org.vistrails.savedState')
+    if os.path.exists(ssPath):
+        os.system('rm -rf "%s"' % ssPath)
+    os.system('defaults write org.vistrails NSQuitAlwaysKeepsWindows -bool false')
+
+
+def fix_site():
+    # py2app ships a stripped version of site.py
+    # USER_BASE and USER_SITE is not set,
+    # this is needed by at least scipy.weave
+    import platform
+    if platform.system()!='Darwin': return
+    import site
+    if hasattr(site, "USER_BASE"): return
+    from vistrails.core.system import mac_site
+    site.USER_BASE = mac_site.getuserbase()
+    site.USER_SITE = mac_site.getusersitepackages()
+    site._Helper = mac_site._Helper
+
+def fix_paths():
+    import site
+    if not hasattr(site, "USER_BASE"): return # We are running py2app
+
+    # Fix import path: add parent directory(so that we can
+    # import vistrails.[gui|...] and remove other paths below it (we might have
+    # been started from a subdir)
+    # A better solution is probably to move run.py up a
+    # directory in the repo
+    old_dir = os.path.realpath(os.path.dirname(__file__))
+    vistrails_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
+    i = 0
+    while i < len(sys.path):
+        rpath = os.path.realpath(sys.path[i])
+        if rpath.startswith(old_dir):
+            del sys.path[i]
+        else:
+            i += 1
+    if vistrails_dir not in sys.path:
+        sys.path.insert(0, vistrails_dir)
+
+if __name__ == '__main__':
+    fix_paths()
+    disable_lion_restore()
+    fix_site()
+
+    from vistrails.gui.requirements import require_pyqt4_api2
+    require_pyqt4_api2()
+
+    from PyQt4 import QtGui
+    import vistrails.gui.application
+    from vistrails.core.application import APP_SUCCESS, APP_FAIL, APP_DONE
+    try:
+        v = vistrails.gui.application.start_application()
+        if v != APP_SUCCESS:
+            app = vistrails.gui.application.get_vistrails_application()
+            if app:
+                app.finishSession()
+            sys.exit(APP_SUCCESS if v == APP_DONE else APP_FAIL)
+        app = vistrails.gui.application.get_vistrails_application()()
+    except SystemExit, e:
+        app = vistrails.gui.application.get_vistrails_application()
+        if app:
+            app.finishSession()
+        sys.exit(e)
+    except Exception, e:
+        app = vistrails.gui.application.get_vistrails_application()
+        if app:
+            app.finishSession()
+        print "Uncaught exception on initialization: %s" % e
+        import traceback
+        traceback.print_exc()
+        sys.exit(255)
+    if (app.temp_configuration.interactiveMode and
+        not app.temp_configuration.check('spreadsheetDumpCells')): 
+        v = app.exec_()
+        
+    vistrails.gui.application.stop_application()
+    sys.exit(v)
diff --git a/vistrails/stop_vistrails_server.py b/vistrails/stop_vistrails_server.py
new file mode 100644
index 0000000..2eb817e
--- /dev/null
+++ b/vistrails/stop_vistrails_server.py
@@ -0,0 +1,57 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+""" This script stops VisTrails server. It can only stop with an XML Request """
+
+import xmlrpclib
+import sys
+import socket
+
+def usage():
+    return "%s server_url"%sys.argv[0]
+
+if __name__ == '__main__':
+    try:
+        uri = sys.argv[1]
+    except Exception, e:
+        print usage()
+        sys.exit(1)
+
+    try:
+        proxy = xmlrpclib.ServerProxy(uri)
+        print proxy.quit()
+    except socket.error, e:
+        print "Vistrails was not running on ", uri
+
+    #print proxy.run_from_db('vistrails.sci.utah.edu', 3306,'vt_test',1,'/tmp/spreadsheet',598)
diff --git a/vistrails/tests/__init__.py b/vistrails/tests/__init__.py
new file mode 100644
index 0000000..4808ee9
--- /dev/null
+++ b/vistrails/tests/__init__.py
@@ -0,0 +1,50 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+class NotModule(Exception):
+    """This is a special exception that is caught by the testing
+    infrastructure. If a particular python file is not meant to be
+    imported as a module, that file should have the following lines:
+
+    if __name__ != '__main__':
+        from vistrails.tests import NotModule
+        raise NotModule('This should not be imported as a module')
+
+    This way, the testing infrastructure will know not to report failure
+    to import that file as an error.
+    """
+
+    pass
+
diff --git a/vistrails/tests/resources/__init__.py b/vistrails/tests/resources/__init__.py
new file mode 100644
index 0000000..86c4a06
--- /dev/null
+++ b/vistrails/tests/resources/__init__.py
@@ -0,0 +1,36 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+pass
diff --git a/vistrails/tests/resources/console_mode_test.py b/vistrails/tests/resources/console_mode_test.py
new file mode 100644
index 0000000..6e7c899
--- /dev/null
+++ b/vistrails/tests/resources/console_mode_test.py
@@ -0,0 +1,101 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Testing package for console_mode"""
+
+##############################################################################
+import vistrails.core.modules
+import vistrails.core.modules.module_registry
+from vistrails.core.modules.vistrails_module import Module, ModuleError, NotCacheable
+from vistrails.core.modules.basic_modules import Float, Integer
+
+identifier = 'org.vistrails.vistrails.console_mode_test'
+version = '0.9.1'
+name = 'Console Mode Tests'
+old_identifiers = ['edu.utah.sci.vistrails.console_mode_test']
+
+class TestTupleExecution(Module):
+
+    def compute(self):
+        v1, v2 = self.getInputFromPort('input')
+        self.setResult('output', v1 + v2)
+
+
+class TestDynamicModuleError(Module):
+
+    def compute(self):
+        c = TestDynamicModuleError()
+        c.die()
+
+    def die(self):
+        raise ModuleError(self, "I died!")
+
+class TestChangeVistrail(NotCacheable, Module):
+
+    def compute(self):
+        if self.hasInputFromPort('foo'):
+            v1 = self.getInputFromPort('foo')
+        else:
+            v1 = 0
+        if v1 != 12:
+            self.change_parameter('foo', v1 + 1)
+
+class TestCustomNamed(Module):
+
+    pass
+
+
+class TestOptionalPorts(Module):
+
+    pass
+
+##############################################################################
+
+def initialize():
+    reg = vistrails.core.modules.module_registry.get_module_registry()
+    reg.add_module(TestTupleExecution)
+    reg.add_input_port(TestTupleExecution, 'input', [Float, Float])
+    reg.add_output_port(TestTupleExecution, 'output', (Float, 'output'))
+    reg.add_module(TestDynamicModuleError)
+    reg.add_module(TestChangeVistrail)
+    reg.add_input_port(TestChangeVistrail, 'foo', Integer)
+
+    reg.add_module(TestCustomNamed, name='different name')
+    reg.add_input_port(TestCustomNamed, 'input', Float)
+
+    reg.add_module(TestOptionalPorts)
+    reg.add_input_port(TestOptionalPorts, 'foo', Float, optional=True)
+    reg.add_output_port(TestOptionalPorts, 'foo', Float, optional=True)
+
diff --git a/vistrails/tests/resources/dummy.xml b/vistrails/tests/resources/dummy.xml
new file mode 100644
index 0000000..bb546b4
--- /dev/null
+++ b/vistrails/tests/resources/dummy.xml
@@ -0,0 +1,164 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+  <visTrail version="0.3.0">
+    <action date="09 Nov 2006 11:11:45" parent="0" time="2" user="cscheid" what="addModule">
+      <object cache="0" id="0" name="File" x="-0.405904047613" y="0.590405904059"/>
+    </action>
+    <action date="09 Nov 2006 11:11:49" parent="2" time="3" user="cscheid" what="addModule">
+      <object cache="0" id="1" name="String" x="-79.7416969521" y="113.505537534"/>
+    </action>
+    <action date="09 Nov 2006 11:11:52" parent="3" time="4" user="cscheid" what="addConnection">
+      <connect destinationId="0" destinationModule="File" destinationPort="name(String)" id="0" sourceId="1" sourceModule="String" sourcePort="value(String)"/>
+    </action>
+    <action date="09 Nov 2006 11:12:01" parent="4" time="5" user="cscheid" what="addModule">
+      <object cache="0" id="2" name="FileSink" x="-25.1291511435" y="-88.7084891257"/>
+    </action>
+    <action date="09 Nov 2006 11:12:04" parent="5" time="6" user="cscheid" what="addConnection">
+      <connect destinationId="2" destinationModule="FileSink" destinationPort="file(File)" id="1" sourceId="0" sourceModule="File" sourcePort="self(File)"/>
+    </action>
+    <action date="09 Nov 2006 11:12:06" parent="6" time="7" user="cscheid" what="moveModule">
+      <move dx="88.5608850951" dy="-27.3062736731" id="2"/>
+    </action>
+    <action date="09 Nov 2006 11:12:06" parent="7" time="8" user="cscheid" what="addModule">
+      <object cache="0" id="3" name="String" x="135.756456779" y="-26.7158678139"/>
+    </action>
+    <action date="09 Nov 2006 11:12:09" parent="8" time="9" user="cscheid" what="addConnection">
+      <connect destinationId="2" destinationModule="FileSink" destinationPort="outputName(String)" id="2" sourceId="3" sourceModule="String" sourcePort="value(String)"/>
+    </action>
+    <action date="09 Nov 2006 11:12:12" parent="9" time="10" user="cscheid" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="09 Nov 2006 11:12:23" parent="10" time="11" user="cscheid" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="/tmp/unimportant.tmp"/>
+    </action>
+    <action date="21 Nov 2006 22:10:52" parent="0" time="12" user="emanuele" what="addModule">
+      <object cache="0" id="0" name="Float" x="-11.8561695459" y="98.7737701549"/>
+    </action>
+    <action date="21 Nov 2006 22:11:01" parent="12" time="13" user="emanuele" what="moveModule">
+      <move dx="6.72586935127" dy="37.8330149522" id="0"/>
+    </action>
+    <action date="21 Nov 2006 22:11:02" parent="13" time="14" user="emanuele" what="addModule">
+      <object cache="0" id="1" name="Float" x="100.802142088" y="40.7631472281"/>
+    </action>
+    <action date="21 Nov 2006 22:11:06" parent="14" time="15" user="emanuele" what="moveModule">
+      <move dx="-24.3812763984" dy="-26.0627436337" id="1"/>
+    </action>
+    <action date="21 Nov 2006 22:11:06" parent="15" time="16" user="emanuele" what="addConnection">
+      <connect destinationId="1" destinationModule="Float" destinationPort="value(Float)" id="0" sourceId="0" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="21 Nov 2006 22:11:16" parent="16" time="17" user="emanuele" what="moveModule">
+      <move dx="5.88513568236" dy="-5.88513565923" id="1"/>
+      <move dx="-54.6476884791" dy="5.88513565923" id="0"/>
+      <move dx="-15.9739397093" dy="54.6476882643" id="1"/>
+    </action>
+    <action date="21 Nov 2006 22:11:16" parent="17" time="18" user="emanuele" what="addModule">
+      <object cache="0" id="2" name="Float" x="156.290564236" y="-60.1248926444"/>
+    </action>
+    <action date="21 Nov 2006 22:11:18" parent="18" time="19" user="emanuele" what="addConnection">
+      <connect destinationId="2" destinationModule="Float" destinationPort="value(Float)" id="1" sourceId="1" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="21 Nov 2006 22:12:06" parent="19" time="20" user="emanuele" what="addModule">
+      <object cache="0" id="3" name="Integer" x="-74.0704610451" y="2.93013227592"/>
+    </action>
+    <action date="21 Nov 2006 22:12:10" parent="20" time="21" user="emanuele" what="moveModule">
+      <move dx="-15.9739397093" dy="16.8146733121" id="3"/>
+    </action>
+    <action date="21 Nov 2006 22:12:10" parent="21" time="22" user="emanuele" what="addModule">
+      <object cache="0" id="4" name="Integer" x="24.2953782172" y="-86.1876362782"/>
+    </action>
+    <action date="21 Nov 2006 22:12:14" parent="22" time="23" user="emanuele" what="addConnection">
+      <connect destinationId="4" destinationModule="Integer" destinationPort="value(Integer)" id="2" sourceId="3" sourceModule="Integer" sourcePort="value(Integer)"/>
+    </action>
+    <action date="21 Nov 2006 22:12:20" parent="23" time="24" user="emanuele" what="moveModule">
+      <move dx="-39.5144824387" dy="-8.40733665605" id="4"/>
+      <move dx="4.20366834454" dy="11.7702713185" id="3"/>
+    </action>
+    <action date="21 Nov 2006 22:12:21" parent="24" time="25" user="emanuele" what="deleteConnection">
+      <connection connectionId="0"/>
+    </action>
+    <action date="21 Nov 2006 22:12:21" parent="25" time="26" user="emanuele" what="deleteModule">
+      <module moduleId="0"/>
+    </action>
+    <action date="21 Nov 2006 22:12:23" parent="26" time="27" user="emanuele" what="deleteConnection">
+      <connection connectionId="1"/>
+    </action>
+    <action date="21 Nov 2006 22:12:23" parent="27" time="28" user="emanuele" what="deleteModule">
+      <module moduleId="1"/>
+    </action>
+    <action date="21 Nov 2006 22:12:26" parent="28" time="29" user="emanuele" what="deleteConnection"/>
+    <action date="21 Nov 2006 22:12:26" parent="29" time="30" user="emanuele" what="deleteModule">
+      <module moduleId="2"/>
+    </action>
+    <action date="21 Nov 2006 22:12:41" parent="30" time="31" user="emanuele" what="moveModule">
+      <move dx="85.7548342287" dy="41.1959496146" id="4"/>
+      <move dx="63.8957588371" dy="52.1254872675" id="3"/>
+      <move dx="10.9295376958" dy="41.1959496146" id="4"/>
+    </action>
+    <action date="21 Nov 2006 22:12:41" parent="31" time="32" user="emanuele" what="addModule">
+      <object cache="0" id="0" name="StandardOutput" x="112.572413453" y="-161.853666183"/>
+    </action>
+    <action date="21 Nov 2006 22:12:44" parent="32" time="33" user="emanuele" what="addConnection">
+      <connect destinationId="0" destinationModule="StandardOutput" destinationPort="value(Module)" id="0" sourceId="4" sourceModule="Integer" sourcePort="value(Integer)"/>
+    </action>
+    <action date="21 Nov 2006 22:12:49" parent="33" time="34" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="21 Nov 2006 22:12:53" parent="34" time="35" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="Integer" value="2"/>
+    </action>
+    <action date="21 Nov 2006 22:13:08" parent="35" time="36" user="emanuele" what="moveModule">
+      <move dx="-54.6476884791" dy="49.6032862707" id="0"/>
+      <move dx="-25.2220100673" dy="5.88513565923" id="4"/>
+    </action>
+    <action date="21 Nov 2006 22:13:23" parent="19" time="37" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="21 Nov 2006 22:13:27" parent="37" time="38" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="1.2"/>
+    </action>
+    <action date="21 Nov 2006 22:13:33" parent="38" time="39" user="emanuele" what="addModule">
+      <object cache="0" id="3" name="StandardOutput" x="73.8986646828" y="-196.323746472"/>
+    </action>
+    <action date="21 Nov 2006 22:13:36" parent="39" time="40" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="StandardOutput" destinationPort="value(Module)" id="2" sourceId="2" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="21 Nov 2006 22:13:42" parent="40" time="41" user="emanuele" what="moveModule">
+      <move dx="-11.7702713647" dy="31.1071456274" id="3"/>
+    </action>
+    <tag name="int chain" time="36"/>
+    <tag name="float chain" time="41"/>
+    <tag name="final" time="11"/>
+  </visTrail>
diff --git a/vistrails/tests/resources/dummy_broken.xml b/vistrails/tests/resources/dummy_broken.xml
new file mode 100644
index 0000000..0d17a63
--- /dev/null
+++ b/vistrails/tests/resources/dummy_broken.xml
@@ -0,0 +1,165 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+THIS FILE IS BROKEN ON PURPOSE
+  <visTrail version="0.3.0">
+    <action date="09 Nov 2006 11:11:45" parent="0" time="2" user="cscheid" what="addModule">
+      <object cache="0" id="0" name="File" x="-0.405904047613" y="0.590405904059"/>
+    </action>
+    <action date="09 Nov 2006 11:11:49" parent="2" time="3" user="cscheid" what="addModule">
+      <object cache="0" id="1" name="String" x="-79.7416969521" y="113.505537534"/>
+    </action>
+    <action date="09 Nov 2006 11:11:52" parent="3" time="4" user="cscheid" what="addConnection">
+      <connect destinationId="0" destinationModule="File" destinationPort="name(String)" id="0" sourceId="1" sourceModule="String" sourcePort="value(String)"/>
+    </action>
+    <action date="09 Nov 2006 11:12:01" parent="4" time="5" user="cscheid" what="addModule">
+      <object cache="0" id="2" name="FileSink" x="-25.1291511435" y="-88.7084891257"/>
+    </action>
+    <action date="09 Nov 2006 11:12:04" parent="5" time="6" user="cscheid" what="addConnection">
+      <connect destinationId="2" destinationModule="FileSink" destinationPort="file(File)" id="1" sourceId="0" sourceModule="File" sourcePort="self(File)"/>
+    </action>
+    <action date="09 Nov 2006 11:12:06" parent="6" time="7" user="cscheid" what="moveModule">
+      <move dx="88.5608850951" dy="-27.3062736731" id="2"/>
+    </action>
+    <action date="09 Nov 2006 11:12:06" parent="7" time="8" user="cscheid" what="addModule">
+      <object cache="0" id="3" name="String" x="135.756456779" y="-26.7158678139"/>
+    </action>
+    <action date="09 Nov 2006 11:12:09" parent="8" time="9" user="cscheid" what="addConnection">
+      <connect destinationId="2" destinationModule="FileSink" destinationPort="outputName(String)" id="2" sourceId="3" sourceModule="String" sourcePort="value(String)"/>
+    </action>
+    <action date="09 Nov 2006 11:12:12" parent="9" time="10" user="cscheid" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value=""/>
+    </action>
+    <action date="09 Nov 2006 11:12:23" parent="10" time="11" user="cscheid" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="String" value="/tmp/unimportant.tmp"/>
+    </action>
+    <action date="21 Nov 2006 22:10:52" parent="0" time="12" user="emanuele" what="addModule">
+      <object cache="0" id="0" name="Float" x="-11.8561695459" y="98.7737701549"/>
+    </action>
+    <action date="21 Nov 2006 22:11:01" parent="12" time="13" user="emanuele" what="moveModule">
+      <move dx="6.72586935127" dy="37.8330149522" id="0"/>
+    </action>
+    <action date="21 Nov 2006 22:11:02" parent="13" time="14" user="emanuele" what="addModule">
+      <object cache="0" id="1" name="Float" x="100.802142088" y="40.7631472281"/>
+    </action>
+    <action date="21 Nov 2006 22:11:06" parent="14" time="15" user="emanuele" what="moveModule">
+      <move dx="-24.3812763984" dy="-26.0627436337" id="1"/>
+    </action>
+    <action date="21 Nov 2006 22:11:06" parent="15" time="16" user="emanuele" what="addConnection">
+      <connect destinationId="1" destinationModule="Float" destinationPort="value(Float)" id="0" sourceId="0" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="21 Nov 2006 22:11:16" parent="16" time="17" user="emanuele" what="moveModule">
+      <move dx="5.88513568236" dy="-5.88513565923" id="1"/>
+      <move dx="-54.6476884791" dy="5.88513565923" id="0"/>
+      <move dx="-15.9739397093" dy="54.6476882643" id="1"/>
+    </action>
+    <action date="21 Nov 2006 22:11:16" parent="17" time="18" user="emanuele" what="addModule">
+      <object cache="0" id="2" name="Float" x="156.290564236" y="-60.1248926444"/>
+    </action>
+    <action date="21 Nov 2006 22:11:18" parent="18" time="19" user="emanuele" what="addConnection">
+      <connect destinationId="2" destinationModule="Float" destinationPort="value(Float)" id="1" sourceId="1" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="21 Nov 2006 22:12:06" parent="19" time="20" user="emanuele" what="addModule">
+      <object cache="0" id="3" name="Integer" x="-74.0704610451" y="2.93013227592"/>
+    </action>
+    <action date="21 Nov 2006 22:12:10" parent="20" time="21" user="emanuele" what="moveModule">
+      <move dx="-15.9739397093" dy="16.8146733121" id="3"/>
+    </action>
+    <action date="21 Nov 2006 22:12:10" parent="21" time="22" user="emanuele" what="addModule">
+      <object cache="0" id="4" name="Integer" x="24.2953782172" y="-86.1876362782"/>
+    </action>
+    <action date="21 Nov 2006 22:12:14" parent="22" time="23" user="emanuele" what="addConnection">
+      <connect destinationId="4" destinationModule="Integer" destinationPort="value(Integer)" id="2" sourceId="3" sourceModule="Integer" sourcePort="value(Integer)"/>
+    </action>
+    <action date="21 Nov 2006 22:12:20" parent="23" time="24" user="emanuele" what="moveModule">
+      <move dx="-39.5144824387" dy="-8.40733665605" id="4"/>
+      <move dx="4.20366834454" dy="11.7702713185" id="3"/>
+    </action>
+    <action date="21 Nov 2006 22:12:21" parent="24" time="25" user="emanuele" what="deleteConnection">
+      <connection connectionId="0"/>
+    </action>
+    <action date="21 Nov 2006 22:12:21" parent="25" time="26" user="emanuele" what="deleteModule">
+      <module moduleId="0"/>
+    </action>
+    <action date="21 Nov 2006 22:12:23" parent="26" time="27" user="emanuele" what="deleteConnection">
+      <connection connectionId="1"/>
+    </action>
+    <action date="21 Nov 2006 22:12:23" parent="27" time="28" user="emanuele" what="deleteModule">
+      <module moduleId="1"/>
+    </action>
+    <action date="21 Nov 2006 22:12:26" parent="28" time="29" user="emanuele" what="deleteConnection"/>
+    <action date="21 Nov 2006 22:12:26" parent="29" time="30" user="emanuele" what="deleteModule">
+      <module moduleId="2"/>
+    </action>
+    <action date="21 Nov 2006 22:12:41" parent="30" time="31" user="emanuele" what="moveModule">
+      <move dx="85.7548342287" dy="41.1959496146" id="4"/>
+      <move dx="63.8957588371" dy="52.1254872675" id="3"/>
+      <move dx="10.9295376958" dy="41.1959496146" id="4"/>
+    </action>
+    <action date="21 Nov 2006 22:12:41" parent="31" time="32" user="emanuele" what="addModule">
+      <object cache="0" id="0" name="StandardOutput" x="112.572413453" y="-161.853666183"/>
+    </action>
+    <action date="21 Nov 2006 22:12:44" parent="32" time="33" user="emanuele" what="addConnection">
+      <connect destinationId="0" destinationModule="StandardOutput" destinationPort="value(Module)" id="0" sourceId="4" sourceModule="Integer" sourcePort="value(Integer)"/>
+    </action>
+    <action date="21 Nov 2006 22:12:49" parent="33" time="34" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="Integer" value="0"/>
+    </action>
+    <action date="21 Nov 2006 22:12:53" parent="34" time="35" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="3" parameter="<no description>" parameterId="0" type="Integer" value="2"/>
+    </action>
+    <action date="21 Nov 2006 22:13:08" parent="35" time="36" user="emanuele" what="moveModule">
+      <move dx="-54.6476884791" dy="49.6032862707" id="0"/>
+      <move dx="-25.2220100673" dy="5.88513565923" id="4"/>
+    </action>
+    <action date="21 Nov 2006 22:13:23" parent="19" time="37" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="21 Nov 2006 22:13:27" parent="37" time="38" user="emanuele" what="changeParameter">
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="1.2"/>
+    </action>
+    <action date="21 Nov 2006 22:13:33" parent="38" time="39" user="emanuele" what="addModule">
+      <object cache="0" id="3" name="StandardOutput" x="73.8986646828" y="-196.323746472"/>
+    </action>
+    <action date="21 Nov 2006 22:13:36" parent="39" time="40" user="emanuele" what="addConnection">
+      <connect destinationId="3" destinationModule="StandardOutput" destinationPort="value(Module)" id="2" sourceId="2" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="21 Nov 2006 22:13:42" parent="40" time="41" user="emanuele" what="moveModule">
+      <move dx="-11.7702713647" dy="31.1071456274" id="3"/>
+    </action>
+    <tag name="int chain" time="36"/>
+    <tag name="float chain" time="41"/>
+    <tag name="final" time="11"/>
+  </visTrail>
diff --git a/vistrails/tests/resources/dummy_new.vt b/vistrails/tests/resources/dummy_new.vt
new file mode 100644
index 0000000..9ae5e63
Binary files /dev/null and b/vistrails/tests/resources/dummy_new.vt differ
diff --git a/vistrails/tests/resources/dummy_new.xml b/vistrails/tests/resources/dummy_new.xml
new file mode 100644
index 0000000..b342d08
--- /dev/null
+++ b/vistrails/tests/resources/dummy_new.xml
@@ -0,0 +1,342 @@
+<?xml version="1.0" ?>
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<vistrail dbHost="" dbName="" dbPort="" id="" name="" version="0.5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2006-11-09 11:11:45" id="2" prevId="0" user="cscheid">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="File"/>
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-0.405904047613" y="0.590405904059"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:11:49" id="3" prevId="2" user="cscheid">
+    <add id="2" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="String"/>
+    </add>
+    <add id="3" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="-79.7416969521" y="113.505537534"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:11:52" id="4" prevId="3" user="cscheid">
+    <add id="4" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0"/>
+    </add>
+    <add id="5" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="1" moduleName="String" sig="value(String)" type="source"/>
+    </add>
+    <add id="6" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="0" moduleName="File" sig="name(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:12:01" id="5" prevId="4" user="cscheid">
+    <add id="7" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="FileSink"/>
+    </add>
+    <add id="8" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="-25.1291511435" y="-88.7084891257"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:12:04" id="6" prevId="5" user="cscheid">
+    <add id="9" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1"/>
+    </add>
+    <add id="10" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="0" moduleName="File" sig="self(File)" type="source"/>
+    </add>
+    <add id="11" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="2" moduleName="FileSink" sig="file(File)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:12:06" id="7" prevId="6" user="cscheid">
+    <change id="12" newObjId="3" oldObjId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="3" x="63.4317339516" y="-116.014762799"/>
+    </change>
+  </action>
+  <action date="2006-11-09 11:12:06" id="8" prevId="7" user="cscheid">
+    <add id="13" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="String"/>
+    </add>
+    <add id="14" objectId="4" parentObjId="3" parentObjType="module" what="location">
+      <location id="4" x="135.756456779" y="-26.7158678139"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:12:09" id="9" prevId="8" user="cscheid">
+    <add id="15" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2"/>
+    </add>
+    <add id="16" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="3" moduleName="String" sig="value(String)" type="source"/>
+    </add>
+    <add id="17" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="2" moduleName="FileSink" sig="outputName(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:12:12" id="10" prevId="9" user="cscheid">
+    <add id="18" objectId="0" parentObjId="3" parentObjType="module" what="function">
+      <function id="0" name="value" pos="0"/>
+    </add>
+    <add id="19" objectId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-11-09 11:12:23" id="11" prevId="10" user="cscheid">
+    <change id="20" newObjId="1" oldObjId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="String" val="/tmp/unimportant.tmp"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:10:52" id="12" prevId="0" user="emanuele">
+    <add id="21" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="Float"/>
+    </add>
+    <add id="22" objectId="5" parentObjId="4" parentObjType="module" what="location">
+      <location id="5" x="-11.8561695459" y="98.7737701549"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:11:01" id="13" prevId="12" user="emanuele">
+    <change id="23" newObjId="6" oldObjId="5" parentObjId="4" parentObjType="module" what="location">
+      <location id="6" x="-5.13030019463" y="136.606785107"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:11:02" id="14" prevId="13" user="emanuele">
+    <add id="24" objectId="5" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="5" name="Float"/>
+    </add>
+    <add id="25" objectId="7" parentObjId="5" parentObjType="module" what="location">
+      <location id="7" x="100.802142088" y="40.7631472281"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:11:06" id="15" prevId="14" user="emanuele">
+    <change id="26" newObjId="8" oldObjId="7" parentObjId="5" parentObjType="module" what="location">
+      <location id="8" x="76.4208656896" y="14.7004035944"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:11:06" id="16" prevId="15" user="emanuele">
+    <add id="27" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3"/>
+    </add>
+    <add id="28" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="4" moduleName="Float" sig="value(Float)" type="source"/>
+    </add>
+    <add id="29" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="5" moduleName="Float" sig="value(Float)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:11:16" id="17" prevId="16" user="emanuele">
+    <change id="30" newObjId="9" oldObjId="8" parentObjId="5" parentObjType="module" what="location">
+      <location id="9" x="82.306001372" y="8.81526793517"/>
+    </change>
+    <change id="31" newObjId="10" oldObjId="6" parentObjId="4" parentObjType="module" what="location">
+      <location id="10" x="-59.7779886737" y="142.491920766"/>
+    </change>
+    <change id="32" newObjId="11" oldObjId="9" parentObjId="5" parentObjType="module" what="location">
+      <location id="11" x="66.3320616627" y="63.4629561995"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:11:16" id="18" prevId="17" user="emanuele">
+    <add id="33" objectId="6" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="6" name="Float"/>
+    </add>
+    <add id="34" objectId="12" parentObjId="6" parentObjType="module" what="location">
+      <location id="12" x="156.290564236" y="-60.1248926444"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:11:18" id="19" prevId="18" user="emanuele">
+    <add id="35" objectId="4" parentObjId="" parentObjType="" what="connection">
+      <connection id="4"/>
+    </add>
+    <add id="36" objectId="8" parentObjId="4" parentObjType="connection" what="port">
+      <port id="8" moduleId="5" moduleName="Float" sig="value(Float)" type="source"/>
+    </add>
+    <add id="37" objectId="9" parentObjId="4" parentObjType="connection" what="port">
+      <port id="9" moduleId="6" moduleName="Float" sig="value(Float)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:06" id="20" prevId="19" user="emanuele">
+    <add id="38" objectId="7" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="7" name="Integer"/>
+    </add>
+    <add id="39" objectId="13" parentObjId="7" parentObjType="module" what="location">
+      <location id="13" x="-74.0704610451" y="2.93013227592"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:10" id="21" prevId="20" user="emanuele">
+    <change id="40" newObjId="14" oldObjId="13" parentObjId="7" parentObjType="module" what="location">
+      <location id="14" x="-90.0444007544" y="19.744805588"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:12:10" id="22" prevId="21" user="emanuele">
+    <add id="41" objectId="8" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="8" name="Integer"/>
+    </add>
+    <add id="42" objectId="15" parentObjId="8" parentObjType="module" what="location">
+      <location id="15" x="24.2953782172" y="-86.1876362782"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:14" id="23" prevId="22" user="emanuele">
+    <add id="43" objectId="5" parentObjId="" parentObjType="" what="connection">
+      <connection id="5"/>
+    </add>
+    <add id="44" objectId="10" parentObjId="5" parentObjType="connection" what="port">
+      <port id="10" moduleId="7" moduleName="Integer" sig="value(Integer)" type="source"/>
+    </add>
+    <add id="45" objectId="11" parentObjId="5" parentObjType="connection" what="port">
+      <port id="11" moduleId="8" moduleName="Integer" sig="value(Integer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:20" id="24" prevId="23" user="emanuele">
+    <change id="46" newObjId="16" oldObjId="15" parentObjId="8" parentObjType="module" what="location">
+      <location id="16" x="-15.2191042215" y="-94.5949729342"/>
+    </change>
+    <change id="47" newObjId="17" oldObjId="14" parentObjId="7" parentObjType="module" what="location">
+      <location id="17" x="-85.8407324099" y="31.5150769065"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:12:21" id="25" prevId="24" user="emanuele">
+    <delete id="48" objectId="6" parentObjId="3" parentObjType="connection" what="port"/>
+    <delete id="49" objectId="7" parentObjId="3" parentObjType="connection" what="port"/>
+    <delete id="50" objectId="3" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-11-21 22:12:21" id="26" prevId="25" user="emanuele">
+    <delete id="51" objectId="10" parentObjId="4" parentObjType="module" what="location"/>
+    <delete id="52" objectId="4" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-11-21 22:12:23" id="27" prevId="26" user="emanuele">
+    <delete id="53" objectId="8" parentObjId="4" parentObjType="connection" what="port"/>
+    <delete id="54" objectId="9" parentObjId="4" parentObjType="connection" what="port"/>
+    <delete id="55" objectId="4" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-11-21 22:12:23" id="28" prevId="27" user="emanuele">
+    <delete id="56" objectId="11" parentObjId="5" parentObjType="module" what="location"/>
+    <delete id="57" objectId="5" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-11-21 22:12:26" id="29" prevId="28" user="emanuele"/>
+  <action date="2006-11-21 22:12:26" id="30" prevId="29" user="emanuele">
+    <delete id="58" objectId="12" parentObjId="6" parentObjType="module" what="location"/>
+    <delete id="59" objectId="6" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-11-21 22:12:41" id="31" prevId="30" user="emanuele">
+    <change id="60" newObjId="18" oldObjId="16" parentObjId="8" parentObjType="module" what="location">
+      <location id="18" x="70.5357300072" y="-53.3990233196"/>
+    </change>
+    <change id="61" newObjId="19" oldObjId="17" parentObjId="7" parentObjType="module" what="location">
+      <location id="19" x="-21.9449735728" y="83.640564174"/>
+    </change>
+    <change id="62" newObjId="20" oldObjId="18" parentObjId="8" parentObjType="module" what="location">
+      <location id="20" x="81.465267703" y="-12.203073705"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:12:41" id="32" prevId="31" user="emanuele">
+    <add id="63" objectId="9" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="9" name="StandardOutput"/>
+    </add>
+    <add id="64" objectId="21" parentObjId="9" parentObjType="module" what="location">
+      <location id="21" x="112.572413453" y="-161.853666183"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:44" id="33" prevId="32" user="emanuele">
+    <add id="65" objectId="6" parentObjId="" parentObjType="" what="connection">
+      <connection id="6"/>
+    </add>
+    <add id="66" objectId="12" parentObjId="6" parentObjType="connection" what="port">
+      <port id="12" moduleId="8" moduleName="Integer" sig="value(Integer)" type="source"/>
+    </add>
+    <add id="67" objectId="13" parentObjId="6" parentObjType="connection" what="port">
+      <port id="13" moduleId="9" moduleName="StandardOutput" sig="value(Module)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:49" id="34" prevId="33" user="emanuele">
+    <add id="68" objectId="1" parentObjId="7" parentObjType="module" what="function">
+      <function id="1" name="value" pos="0"/>
+    </add>
+    <add id="69" objectId="2" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="Integer" val="0"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:12:53" id="35" prevId="34" user="emanuele">
+    <change id="70" newObjId="3" oldObjId="2" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="0" type="Integer" val="2"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:13:08" id="36" prevId="35" user="emanuele">
+    <change id="71" newObjId="22" oldObjId="21" parentObjId="9" parentObjType="module" what="location">
+      <location id="22" x="57.9247249739" y="-112.250379912"/>
+    </change>
+    <change id="72" newObjId="23" oldObjId="20" parentObjId="8" parentObjType="module" what="location">
+      <location id="23" x="56.2432576357" y="-6.31793804582"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:13:23" id="37" prevId="19" user="emanuele">
+    <add id="73" objectId="2" parentObjId="4" parentObjType="module" what="function">
+      <function id="2" name="value" pos="0"/>
+    </add>
+    <add id="74" objectId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:13:27" id="38" prevId="37" user="emanuele">
+    <change id="75" newObjId="5" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="0" type="Float" val="1.2"/>
+    </change>
+  </action>
+  <action date="2006-11-21 22:13:33" id="39" prevId="38" user="emanuele">
+    <add id="76" objectId="10" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="10" name="StandardOutput"/>
+    </add>
+    <add id="77" objectId="24" parentObjId="10" parentObjType="module" what="location">
+      <location id="24" x="73.8986646828" y="-196.323746472"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:13:36" id="40" prevId="39" user="emanuele">
+    <add id="78" objectId="7" parentObjId="" parentObjType="" what="connection">
+      <connection id="7"/>
+    </add>
+    <add id="79" objectId="14" parentObjId="7" parentObjType="connection" what="port">
+      <port id="14" moduleId="6" moduleName="Float" sig="value(Float)" type="source"/>
+    </add>
+    <add id="80" objectId="15" parentObjId="7" parentObjType="connection" what="port">
+      <port id="15" moduleId="10" moduleName="StandardOutput" sig="value(Module)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-11-21 22:13:42" id="41" prevId="40" user="emanuele">
+    <change id="81" newObjId="25" oldObjId="24" parentObjId="10" parentObjType="module" what="location">
+      <location id="25" x="62.1283933181" y="-165.216600845"/>
+    </change>
+  </action>
+  <tag name="int chain" time="36"/>
+  <tag name="float chain" time="41"/>
+  <tag name="final" time="11"/>
+</vistrail>
diff --git a/vistrails/tests/resources/dynamic_module_error.xml b/vistrails/tests/resources/dynamic_module_error.xml
new file mode 100644
index 0000000..1215d17
--- /dev/null
+++ b/vistrails/tests/resources/dynamic_module_error.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" ?>
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+  <visTrail version="0.3.1">
+    <action date="15 Mar 2007 16:53:42" parent="0" time="1" user="cscheid" what="addModule">
+      <object cache="0" id="0" name="TestDynamicModuleError" x="-7.0" y="18.0"/>
+    </action>
+    <tag name="test" time="1"/>
+  </visTrail>
diff --git a/vistrails/tests/resources/empty_bookmarks.xml b/vistrails/tests/resources/empty_bookmarks.xml
new file mode 100644
index 0000000..45ff5f3
--- /dev/null
+++ b/vistrails/tests/resources/empty_bookmarks.xml
@@ -0,0 +1,36 @@
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+  <bookmarks/>
diff --git a/vistrails/tests/resources/import_pkg/__init__.py b/vistrails/tests/resources/import_pkg/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/vistrails/tests/resources/import_pkg/test_import_pkg/__init__.py b/vistrails/tests/resources/import_pkg/test_import_pkg/__init__.py
new file mode 100644
index 0000000..ae172b9
--- /dev/null
+++ b/vistrails/tests/resources/import_pkg/test_import_pkg/__init__.py
@@ -0,0 +1,8 @@
+name = 'test_import_pkg'
+identifier = 'org.vistrails.tests.test_import_pkg'
+version = '0.42'
+
+import vistrails.tests.resources.import_targets.test1
+import tests.resources.import_targets.test2
+
+import module1
diff --git a/vistrails/tests/resources/import_pkg/test_import_pkg/init.py b/vistrails/tests/resources/import_pkg/test_import_pkg/init.py
new file mode 100644
index 0000000..1d4ff55
--- /dev/null
+++ b/vistrails/tests/resources/import_pkg/test_import_pkg/init.py
@@ -0,0 +1 @@
+import module2
diff --git a/vistrails/tests/resources/import_pkg/test_import_pkg/module1.py b/vistrails/tests/resources/import_pkg/test_import_pkg/module1.py
new file mode 100644
index 0000000..f3f9c43
--- /dev/null
+++ b/vistrails/tests/resources/import_pkg/test_import_pkg/module1.py
@@ -0,0 +1,2 @@
+import vistrails.tests.resources.import_targets.test3
+import tests.resources.import_targets.test4
diff --git a/vistrails/tests/resources/import_pkg/test_import_pkg/module2.py b/vistrails/tests/resources/import_pkg/test_import_pkg/module2.py
new file mode 100644
index 0000000..0f295a5
--- /dev/null
+++ b/vistrails/tests/resources/import_pkg/test_import_pkg/module2.py
@@ -0,0 +1,2 @@
+import vistrails.tests.resources.import_targets.test5
+import tests.resources.import_targets.test6
diff --git a/vistrails/tests/resources/import_targets/__init__.py b/vistrails/tests/resources/import_targets/__init__.py
new file mode 100644
index 0000000..65a1ff1
--- /dev/null
+++ b/vistrails/tests/resources/import_targets/__init__.py
@@ -0,0 +1,5 @@
+"""This is a target for importing a non-package module.
+
+It is used in the PackageManager's tests to check that the dependency-tracking
+name-fixing import override works correctly.
+"""
diff --git a/vistrails/tests/resources/import_targets/test1.py b/vistrails/tests/resources/import_targets/test1.py
new file mode 100644
index 0000000..3a2255a
--- /dev/null
+++ b/vistrails/tests/resources/import_targets/test1.py
@@ -0,0 +1,7 @@
+try:
+    import core.packagemanager
+except ImportError:
+    pass
+else:
+    raise AssertionError("Importing without prefix from outside the package "
+                         "didn't raise ImportError")
diff --git a/vistrails/tests/resources/import_targets/test2.py b/vistrails/tests/resources/import_targets/test2.py
new file mode 100644
index 0000000..e69de29
diff --git a/vistrails/tests/resources/import_targets/test3.py b/vistrails/tests/resources/import_targets/test3.py
new file mode 100644
index 0000000..e69de29
diff --git a/vistrails/tests/resources/import_targets/test4.py b/vistrails/tests/resources/import_targets/test4.py
new file mode 100644
index 0000000..e69de29
diff --git a/vistrails/tests/resources/import_targets/test5.py b/vistrails/tests/resources/import_targets/test5.py
new file mode 100644
index 0000000..e69de29
diff --git a/vistrails/tests/resources/import_targets/test6.py b/vistrails/tests/resources/import_targets/test6.py
new file mode 100644
index 0000000..e69de29
diff --git a/vistrails/tests/resources/paramexp-1.0.2.vt b/vistrails/tests/resources/paramexp-1.0.2.vt
new file mode 100644
index 0000000..74fa2f1
Binary files /dev/null and b/vistrails/tests/resources/paramexp-1.0.2.vt differ
diff --git a/vistrails/tests/resources/paramexp-1.0.3.vt b/vistrails/tests/resources/paramexp-1.0.3.vt
new file mode 100644
index 0000000..a059689
Binary files /dev/null and b/vistrails/tests/resources/paramexp-1.0.3.vt differ
diff --git a/vistrails/tests/resources/pythonsource.xml b/vistrails/tests/resources/pythonsource.xml
new file mode 100644
index 0000000..cb95484
--- /dev/null
+++ b/vistrails/tests/resources/pythonsource.xml
@@ -0,0 +1,288 @@
+<?xml version="1.0" ?>
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<vistrail dbHost="" dbName="" dbPort="" id="" name="" version="0.5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2007-03-02 14:30:19" id="1" prevId="0" user="cscheid">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="PythonSource"/>
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-2.0" y="-19.0"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:47" id="2" prevId="1" user="cscheid">
+    <add id="2" objectId="0" parentObjId="0" parentObjType="module" what="portSpec">
+      <portSpec id="0" name="v1" spec="(Float)" type="input"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:47" id="3" prevId="2" user="cscheid">
+    <add id="3" objectId="1" parentObjId="0" parentObjType="module" what="portSpec">
+      <portSpec id="1" name="v2" spec="(Float)" type="input"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:47" id="4" prevId="3" user="cscheid">
+    <add id="4" objectId="2" parentObjId="0" parentObjType="module" what="portSpec">
+      <portSpec id="2" name="o" spec="(Float)" type="output"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:48" id="5" prevId="4" user="cscheid">
+    <add id="5" objectId="0" parentObjId="0" parentObjType="module" what="function">
+      <function id="0" name="source" pos="0"/>
+    </add>
+    <add id="6" objectId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="String" val="o%20%3D%20v1%20%2B%20v2"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:50" id="6" prevId="5" user="cscheid">
+    <add id="7" objectId="1" parentObjId="0" parentObjType="module" what="function">
+      <function id="1" name="v1" pos="1"/>
+    </add>
+    <add id="8" objectId="1" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:51" id="7" prevId="6" user="cscheid">
+    <change id="9" newObjId="2" oldObjId="1" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:30:53" id="8" prevId="7" user="cscheid">
+    <add id="10" objectId="2" parentObjId="0" parentObjType="module" what="function">
+      <function id="2" name="v2" pos="2"/>
+    </add>
+    <add id="11" objectId="3" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:30:54" id="9" prevId="8" user="cscheid">
+    <change id="12" newObjId="4" oldObjId="3" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="0" type="Float" val="2"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:31:00" id="10" prevId="9" user="cscheid">
+    <add id="13" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="StandardOutput"/>
+    </add>
+    <add id="14" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="11.0" y="-158.0"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:31:02" id="11" prevId="10" user="cscheid">
+    <add id="15" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0"/>
+    </add>
+    <add id="16" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="0" moduleName="PythonSource" sig="o(Float)" type="source"/>
+    </add>
+    <add id="17" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="1" moduleName="StandardOutput" sig="value(Module)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:35:38" id="12" prevId="11" user="cscheid">
+    <delete id="18" objectId="0" parentObjId="0" parentObjType="connection" what="port"/>
+    <delete id="19" objectId="1" parentObjId="0" parentObjType="connection" what="port"/>
+    <delete id="20" objectId="0" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2007-03-02 14:35:38" id="13" prevId="12" user="cscheid">
+    <delete id="21" objectId="1" parentObjId="1" parentObjType="module" what="location"/>
+    <delete id="22" objectId="1" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2007-03-02 14:36:05" id="14" prevId="13" user="cscheid">
+    <add id="23" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="PythonSource"/>
+    </add>
+    <add id="24" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="-1.1116424772" y="-107.829320288"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:36:30" id="15" prevId="14" user="cscheid">
+    <add id="25" objectId="3" parentObjId="2" parentObjType="module" what="portSpec">
+      <portSpec id="3" name="v" spec="(Float)" type="input"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:36:30" id="16" prevId="15" user="cscheid">
+    <add id="26" objectId="3" parentObjId="2" parentObjType="module" what="function">
+      <function id="3" name="source" pos="0"/>
+    </add>
+    <add id="27" objectId="5" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="0" type="String" val="if%20v%20%21%3D%202.0%3A%0A%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:36:32" id="17" prevId="16" user="cscheid">
+    <add id="28" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1"/>
+    </add>
+    <add id="29" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="0" moduleName="PythonSource" sig="o(Float)" type="source"/>
+    </add>
+    <add id="30" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="2" moduleName="PythonSource" sig="v(Float)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:37:44" id="18" prevId="17" user="cscheid">
+    <add id="31" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="StandardOutput"/>
+    </add>
+    <add id="32" objectId="3" parentObjId="3" parentObjType="module" what="location">
+      <location id="3" x="43.9797583425" y="-186.913972956"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:37:45" id="19" prevId="18" user="cscheid">
+    <add id="33" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2"/>
+    </add>
+    <add id="34" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="0" moduleName="PythonSource" sig="o(Float)" type="source"/>
+    </add>
+    <add id="35" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="3" moduleName="StandardOutput" sig="value(Module)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:37:52" id="20" prevId="19" user="cscheid">
+    <change id="36" newObjId="4" oldObjId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="4" x="201.195245898" y="-103.431344454"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:37:52" id="21" prevId="20" user="cscheid">
+    <delete id="37" objectId="2" parentObjId="1" parentObjType="connection" what="port"/>
+    <delete id="38" objectId="3" parentObjId="1" parentObjType="connection" what="port"/>
+    <delete id="39" objectId="1" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2007-03-02 14:38:06" id="22" prevId="21" user="cscheid">
+    <change id="40" newObjId="6" oldObjId="5" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="String" val="return%0Aif%20v%20%21%3D%202.0%3A%0A%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:38:23" id="23" prevId="22" user="cscheid">
+    <change id="41" newObjId="7" oldObjId="6" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="7" name="<no description>" pos="0" type="String" val="%23if%20v%20%21%3D%202.0%3A%0A%23%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29%0Apass"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:38:29" id="24" prevId="23" user="cscheid">
+    <add id="42" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3"/>
+    </add>
+    <add id="43" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="0" moduleName="PythonSource" sig="o(Float)" type="source"/>
+    </add>
+    <add id="44" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="2" moduleName="PythonSource" sig="v(Float)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-02 14:38:34" id="25" prevId="24" user="cscheid">
+    <change id="45" newObjId="8" oldObjId="7" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="8" name="<no description>" pos="0" type="String" val="%23if%20v%20%21%3D%202.0%3A%0A%23%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29%0Aprint%20v"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:39:39" id="26" prevId="25" user="cscheid">
+    <change id="46" newObjId="9" oldObjId="8" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="9" name="<no description>" pos="0" type="String" val="if%20v%20%21%3D%202.0%3A%0A%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29%0A"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:42:03" id="27" prevId="26" user="cscheid">
+    <delete id="47" objectId="4" parentObjId="2" parentObjType="connection" what="port"/>
+    <delete id="48" objectId="5" parentObjId="2" parentObjType="connection" what="port"/>
+    <delete id="49" objectId="2" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2007-03-02 14:42:03" id="28" prevId="27" user="cscheid">
+    <delete id="50" objectId="3" parentObjId="3" parentObjType="module" what="location"/>
+    <delete id="51" objectId="3" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2007-03-02 14:42:09" id="29" prevId="28" user="cscheid">
+    <change id="52" newObjId="10" oldObjId="9" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="10" name="<no description>" pos="0" type="String" val="if%20v%20%21%3D%203.0%3A%0A%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29%0A"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:43:30" id="30" prevId="29" user="cscheid">
+    <change id="53" newObjId="11" oldObjId="10" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="11" name="<no description>" pos="0" type="String" val="if%20v%20%21%3D%202.0%3A%0A%20%20%20raise%20ModuleError%28self%2C%20%22assert%20failed%22%29%0A"/>
+    </change>
+  </action>
+  <action date="2007-03-02 14:43:43" id="31" prevId="30" user="cscheid">
+    <change id="54" newObjId="12" oldObjId="11" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="12" name="<no description>" pos="0" type="String" val="if%20v%20%21%3D%202.0%3A%0A%20%20%20fail%28%22assert%20failed%22%29%0A"/>
+    </change>
+  </action>
+  <action date="2007-03-15 17:09:27" id="32" prevId="31" user="cscheid">
+    <change id="55" newObjId="13" oldObjId="12" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="13" name="<no description>" pos="0" type="String" val="if%20v%20%21%3D%203.0%3A%0A%20%20%20fail%28%22assert%20failed%22%29%0A"/>
+    </change>
+  </action>
+  <action date="2007-07-13 14:20:10" id="33" prevId="32" user="cscheid">
+    <add id="56" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="PythonSource"/>
+    </add>
+    <add id="57" objectId="5" parentObjId="4" parentObjType="module" what="location">
+      <location id="5" x="106.04612809" y="-290.823472489"/>
+    </add>
+  </action>
+  <action date="2007-07-13 14:20:12" id="34" prevId="33" user="cscheid">
+    <delete id="58" objectId="6" parentObjId="3" parentObjType="connection" what="port"/>
+    <delete id="59" objectId="7" parentObjId="3" parentObjType="connection" what="port"/>
+    <delete id="60" objectId="3" parentObjId="" parentObjType="" what="connection"/>
+    <delete id="61" objectId="0" parentObjId="0" parentObjType="module" what="location"/>
+    <delete id="62" objectId="0" parentObjId="0" parentObjType="function" what="parameter"/>
+    <delete id="63" objectId="0" parentObjId="0" parentObjType="module" what="function"/>
+    <delete id="64" objectId="2" parentObjId="1" parentObjType="function" what="parameter"/>
+    <delete id="65" objectId="1" parentObjId="0" parentObjType="module" what="function"/>
+    <delete id="66" objectId="4" parentObjId="2" parentObjType="function" what="parameter"/>
+    <delete id="67" objectId="2" parentObjId="0" parentObjType="module" what="function"/>
+    <delete id="68" objectId="0" parentObjId="0" parentObjType="module" what="portSpec"/>
+    <delete id="69" objectId="1" parentObjId="0" parentObjType="module" what="portSpec"/>
+    <delete id="70" objectId="2" parentObjId="0" parentObjType="module" what="portSpec"/>
+    <delete id="71" objectId="0" parentObjId="" parentObjType="" what="module"/>
+    <delete id="72" objectId="4" parentObjId="2" parentObjType="module" what="location"/>
+    <delete id="73" objectId="13" parentObjId="3" parentObjType="function" what="parameter"/>
+    <delete id="74" objectId="3" parentObjId="2" parentObjType="module" what="function"/>
+    <delete id="75" objectId="3" parentObjId="2" parentObjType="module" what="portSpec"/>
+    <delete id="76" objectId="2" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2007-07-13 14:20:27" id="35" prevId="34" user="cscheid">
+    <add id="77" objectId="4" parentObjId="4" parentObjType="module" what="portSpec">
+      <portSpec id="4" name="foo" spec="(String)" type="output"/>
+    </add>
+  </action>
+  <action date="2007-07-13 14:20:27" id="36" prevId="35" user="cscheid">
+    <add id="78" objectId="4" parentObjId="4" parentObjType="module" what="function">
+      <function id="4" name="source" pos="0"/>
+    </add>
+    <add id="79" objectId="14" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="14" name="<no description>" pos="0" type="String" val="foo%20%3D%20%22foo%22"/>
+    </add>
+  </action>
+  <tag name="test_simple_success" time="36"/>
+  <tag name="testPortsAndFail" time="32"/>
+</vistrail>
diff --git a/vistrails/tests/resources/spx_loop.vt b/vistrails/tests/resources/spx_loop.vt
new file mode 100644
index 0000000..d1680bd
Binary files /dev/null and b/vistrails/tests/resources/spx_loop.vt differ
diff --git a/vistrails/tests/resources/terminator.vt b/vistrails/tests/resources/terminator.vt
new file mode 100644
index 0000000..022889b
Binary files /dev/null and b/vistrails/tests/resources/terminator.vt differ
diff --git a/vistrails/tests/resources/test_abstraction.xml b/vistrails/tests/resources/test_abstraction.xml
new file mode 100644
index 0000000..9532b60
--- /dev/null
+++ b/vistrails/tests/resources/test_abstraction.xml
@@ -0,0 +1,227 @@
+<vistrail id="" name="" version="1.0.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2007-08-27 17:13:44" id="1" prevId="0" session="" user="dakoop">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="Float" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="62.0" y="180.0" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:13:46" id="2" prevId="1" session="" user="dakoop">
+    <add id="2" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="Float" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+    </add>
+    <add id="3" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="-109.0" y="146.0" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:13:51" id="3" prevId="2" session="" user="dakoop">
+    <add id="4" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="List" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+    </add>
+    <add id="5" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="18.0" y="85.0" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:13:53" id="4" prevId="3" session="" user="dakoop">
+    <add id="6" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="List" namespace="" package="edu.utah.sci.vistrails.basic" version="" />
+    </add>
+    <add id="7" objectId="3" parentObjId="3" parentObjType="module" what="location">
+      <location id="3" x="17.0" y="-31.0" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:13:57" id="5" prevId="4" session="" user="dakoop">
+    <add id="8" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0" />
+    </add>
+    <add id="9" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="2" moduleName="List" name="head" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="10" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="1" moduleName="Float" name="value" signature="(edu.utah.sci.vistrails.basic:Float)" type="source" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:14:03" id="6" prevId="5" session="" user="dakoop">
+    <delete id="11" objectId="1" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="12" objectId="0" parentObjId="0" parentObjType="connection" what="port" />
+    <delete id="13" objectId="0" parentObjId="" parentObjType="" what="connection" />
+  </action>
+  <action date="2007-08-27 17:14:06" id="7" prevId="6" session="" user="dakoop">
+    <add id="14" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1" />
+    </add>
+    <add id="15" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="3" moduleName="List" name="head" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="16" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="1" moduleName="Float" name="value" signature="(edu.utah.sci.vistrails.basic:Float)" type="source" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:14:09" id="8" prevId="7" session="" user="dakoop">
+    <add id="17" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2" />
+    </add>
+    <add id="18" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="2" moduleName="List" name="head" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="19" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="0" moduleName="Float" name="value" signature="(edu.utah.sci.vistrails.basic:Float)" type="source" />
+    </add>
+  </action>
+  <action date="2007-08-27 17:14:11" id="9" prevId="8" session="" user="dakoop">
+    <add id="20" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3" />
+    </add>
+    <add id="21" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="3" moduleName="List" name="tail" signature="(edu.utah.sci.vistrails.basic:List)" type="destination" />
+    </add>
+    <add id="22" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="2" moduleName="List" name="value" signature="(edu.utah.sci.vistrails.basic:List)" type="source" />
+    </add>
+  </action>
+  <action date="2012-08-02 17:59:40" id="10" prevId="9" session="2" user="tommy">
+    <annotation id="0" key="__description__" value="Upgrade" />
+    <delete id="23" objectId="3" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="24" objectId="2" parentObjId="1" parentObjType="connection" what="port" />
+    <delete id="25" objectId="1" parentObjId="" parentObjType="" what="connection" />
+    <delete id="26" objectId="7" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="27" objectId="6" parentObjId="3" parentObjType="connection" what="port" />
+    <delete id="28" objectId="3" parentObjId="" parentObjType="" what="connection" />
+    <delete id="29" objectId="3" parentObjId="3" parentObjType="module" what="location" />
+    <delete id="30" objectId="3" parentObjId="" parentObjType="" what="module" />
+    <delete id="31" objectId="1" parentObjId="1" parentObjType="module" what="location" />
+    <delete id="32" objectId="1" parentObjId="" parentObjType="" what="module" />
+    <delete id="33" objectId="5" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="34" objectId="4" parentObjId="2" parentObjType="connection" what="port" />
+    <delete id="35" objectId="2" parentObjId="" parentObjType="" what="connection" />
+    <delete id="36" objectId="2" parentObjId="2" parentObjType="module" what="location" />
+    <delete id="37" objectId="2" parentObjId="" parentObjType="" what="module" />
+    <delete id="38" objectId="0" parentObjId="0" parentObjType="module" what="location" />
+    <delete id="39" objectId="0" parentObjId="" parentObjType="" what="module" />
+    <add id="40" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="List" namespace="" package="edu.utah.sci.vistrails.basic" version="1.6" />
+    </add>
+    <add id="41" objectId="4" parentObjId="4" parentObjType="module" what="location">
+      <location id="4" x="17.0" y="-31.0" />
+    </add>
+    <add id="42" objectId="5" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="5" name="Float" namespace="" package="edu.utah.sci.vistrails.basic" version="1.6" />
+    </add>
+    <add id="43" objectId="5" parentObjId="5" parentObjType="module" what="location">
+      <location id="5" x="-109.0" y="146.0" />
+    </add>
+    <add id="44" objectId="6" parentObjId="" parentObjType="" what="connection">
+      <connection id="6" />
+    </add>
+    <add id="45" objectId="12" parentObjId="6" parentObjType="connection" what="port">
+      <port id="12" moduleId="5" moduleName="Float" name="value" signature="(edu.utah.sci.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="46" objectId="13" parentObjId="6" parentObjType="connection" what="port">
+      <port id="13" moduleId="4" moduleName="List" name="head" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="47" objectId="6" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="6" name="List" namespace="" package="edu.utah.sci.vistrails.basic" version="1.6" />
+    </add>
+    <add id="48" objectId="6" parentObjId="6" parentObjType="module" what="location">
+      <location id="6" x="18.0" y="85.0" />
+    </add>
+    <add id="49" objectId="7" parentObjId="" parentObjType="" what="connection">
+      <connection id="7" />
+    </add>
+    <add id="50" objectId="14" parentObjId="7" parentObjType="connection" what="port">
+      <port id="14" moduleId="6" moduleName="List" name="value" signature="(edu.utah.sci.vistrails.basic:List)" type="source" />
+    </add>
+    <add id="51" objectId="15" parentObjId="7" parentObjType="connection" what="port">
+      <port id="15" moduleId="4" moduleName="List" name="tail" signature="(edu.utah.sci.vistrails.basic:List)" type="destination" />
+    </add>
+    <add id="52" objectId="7" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="7" name="Float" namespace="" package="edu.utah.sci.vistrails.basic" version="1.6" />
+    </add>
+    <add id="53" objectId="7" parentObjId="7" parentObjType="module" what="location">
+      <location id="7" x="62.0" y="180.0" />
+    </add>
+    <add id="54" objectId="9" parentObjId="" parentObjType="" what="connection">
+      <connection id="9" />
+    </add>
+    <add id="55" objectId="18" parentObjId="9" parentObjType="connection" what="port">
+      <port id="18" moduleId="7" moduleName="Float" name="value" signature="(edu.utah.sci.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="56" objectId="19" parentObjId="9" parentObjType="connection" what="port">
+      <port id="19" moduleId="6" moduleName="List" name="head" signature="(edu.utah.sci.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <action date="2013-05-08 17:48:29" id="11" prevId="10" session="3" user="dakoop">
+    <annotation id="3" key="__description__" value="Upgrade" />
+    <delete id="57" objectId="12" parentObjId="6" parentObjType="connection" what="port" />
+    <delete id="58" objectId="13" parentObjId="6" parentObjType="connection" what="port" />
+    <delete id="59" objectId="6" parentObjId="" parentObjType="" what="connection" />
+    <delete id="60" objectId="14" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="61" objectId="15" parentObjId="7" parentObjType="connection" what="port" />
+    <delete id="62" objectId="7" parentObjId="" parentObjType="" what="connection" />
+    <delete id="63" objectId="4" parentObjId="4" parentObjType="module" what="location" />
+    <delete id="64" objectId="4" parentObjId="" parentObjType="" what="module" />
+    <delete id="65" objectId="18" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="66" objectId="19" parentObjId="9" parentObjType="connection" what="port" />
+    <delete id="67" objectId="9" parentObjId="" parentObjType="" what="connection" />
+    <delete id="68" objectId="7" parentObjId="7" parentObjType="module" what="location" />
+    <delete id="69" objectId="7" parentObjId="" parentObjType="" what="module" />
+    <delete id="70" objectId="5" parentObjId="5" parentObjType="module" what="location" />
+    <delete id="71" objectId="5" parentObjId="" parentObjType="" what="module" />
+    <delete id="72" objectId="6" parentObjId="6" parentObjType="module" what="location" />
+    <delete id="73" objectId="6" parentObjId="" parentObjType="" what="module" />
+    <add id="74" objectId="8" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="8" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="75" objectId="8" parentObjId="8" parentObjType="module" what="location">
+      <location id="8" x="17.0" y="-31.0" />
+    </add>
+    <add id="76" objectId="9" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="9" name="Float" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="77" objectId="9" parentObjId="9" parentObjType="module" what="location">
+      <location id="9" x="62.0" y="180.0" />
+    </add>
+    <add id="78" objectId="10" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="10" name="Float" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="79" objectId="10" parentObjId="10" parentObjType="module" what="location">
+      <location id="10" x="-109.0" y="146.0" />
+    </add>
+    <add id="80" objectId="13" parentObjId="" parentObjType="" what="connection">
+      <connection id="13" />
+    </add>
+    <add id="81" objectId="26" parentObjId="13" parentObjType="connection" what="port">
+      <port id="26" moduleId="10" moduleName="Float" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="82" objectId="27" parentObjId="13" parentObjType="connection" what="port">
+      <port id="27" moduleId="8" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+    <add id="83" objectId="11" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="11" name="List" namespace="" package="org.vistrails.vistrails.basic" version="2.1" />
+    </add>
+    <add id="84" objectId="11" parentObjId="11" parentObjType="module" what="location">
+      <location id="11" x="18.0" y="85.0" />
+    </add>
+    <add id="85" objectId="14" parentObjId="" parentObjType="" what="connection">
+      <connection id="14" />
+    </add>
+    <add id="86" objectId="28" parentObjId="14" parentObjType="connection" what="port">
+      <port id="28" moduleId="11" moduleName="List" name="value" signature="(org.vistrails.vistrails.basic:List)" type="source" />
+    </add>
+    <add id="87" objectId="29" parentObjId="14" parentObjType="connection" what="port">
+      <port id="29" moduleId="8" moduleName="List" name="tail" signature="(org.vistrails.vistrails.basic:List)" type="destination" />
+    </add>
+    <add id="88" objectId="15" parentObjId="" parentObjType="" what="connection">
+      <connection id="15" />
+    </add>
+    <add id="89" objectId="30" parentObjId="15" parentObjType="connection" what="port">
+      <port id="30" moduleId="9" moduleName="Float" name="value" signature="(org.vistrails.vistrails.basic:Float)" type="source" />
+    </add>
+    <add id="90" objectId="31" parentObjId="15" parentObjType="connection" what="port">
+      <port id="31" moduleId="11" moduleName="List" name="head" signature="(org.vistrails.vistrails.basic:Module)" type="destination" />
+    </add>
+  </action>
+  <actionAnnotation actionId="9" date="2012-08-02 17:59:40" id="2" key="__upgrade__" user="tommy" value="10" />
+  <actionAnnotation actionId="10" date="2013-05-08 17:48:29" id="6" key="__upgrade__" user="dakoop" value="11" />
+</vistrail>
diff --git a/vistrails/tests/resources/test_alias.xml b/vistrails/tests/resources/test_alias.xml
new file mode 100644
index 0000000..e2c76af
--- /dev/null
+++ b/vistrails/tests/resources/test_alias.xml
@@ -0,0 +1,178 @@
+<?xml version="1.0" ?>
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->  
+  <visTrail version="0.3.0">
+    <action date="22 Feb 2007 16:47:32" parent="0" time="1" user="manu" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="0" name="Float" x="-119.0" y="150.0"/>
+    </action>
+    <action date="22 Feb 2007 16:47:50" parent="1" time="2" user="manu" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="1" name="PythonSource" x="-98.0" y="11.0"/>
+    </action>
+    <action date="22 Feb 2007 16:47:55" parent="2" time="3" user="manu" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="6.0" dy="41.0" id="1"/>
+    </action>
+    <action date="22 Feb 2007 16:47:55" parent="3" time="4" user="manu" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="0.0"/>
+    </action>
+    <action date="22 Feb 2007 16:48:02" parent="4" time="5" user="manu" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="2.0"/>
+    </action>
+    <action date="22 Feb 2007 16:48:03" parent="5" time="6" user="manu" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="2.0"/>
+    </action>
+    <action date="22 Feb 2007 16:48:11" parent="6" time="7" user="manu" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="v1" function="value" functionId="0" moduleId="0" parameter="<no description>" parameterId="0" type="Float" value="2.0"/>
+    </action>
+    <action date="22 Feb 2007 16:51:14" parent="7" time="8" user="manu" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-21.0" dy="37.0" id="0"/>
+    </action>
+    <action date="22 Feb 2007 16:51:14" parent="8" time="9" user="manu" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="1" portName="v1" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="22 Feb 2007 16:51:14" parent="9" time="10" user="manu" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="1" portName="v2" portSpec="(Float)" portType="input"/>
+    </action>
+    <action date="22 Feb 2007 16:51:15" parent="10" time="11" user="manu" what="addModulePort">
+      <notes>
+        None
+      </notes>
+      <addPort moduleId="1" portName="res" portSpec="(Float)" portType="output"/>
+    </action>
+    <action date="22 Feb 2007 16:51:15" parent="11" time="12" user="manu" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="source" functionId="0" moduleId="1" parameter="<no description>" parameterId="0" type="String" value="v1%20%3D%20self.getInputFromPort%28%22v1%22%29%0Av2%20%3D%20self.getInputFromPort%28%22v2%22%29%0A%0Aself.setResult%28%22res%22%2C%20v1%2Bv2%29"/>
+    </action>
+    <action date="22 Feb 2007 16:51:21" parent="12" time="13" user="manu" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="1" destinationModule="PythonSource" destinationPort="v1(Float)" id="0" sourceId="0" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="22 Feb 2007 16:51:32" parent="13" time="14" user="manu" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="-17.0" dy="-20.0" id="0"/>
+    </action>
+    <action date="22 Feb 2007 16:51:32" parent="14" time="15" user="manu" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="2" name="Float" x="-130.0" y="197.0"/>
+    </action>
+    <action date="22 Feb 2007 16:51:32" parent="15" time="16" user="manu" what="changeParameter">
+      <notes>
+        None
+      </notes>
+      <set alias="" function="value" functionId="0" moduleId="2" parameter="<no description>" parameterId="0" type="Float" value="2.0"/>
+    </action>
+    <action date="22 Feb 2007 16:51:32" parent="16" time="17" user="manu" what="changeAnnotation">
+      <notes>
+        None
+      </notes>
+      <set key="" moduleId="2" value=""/>
+    </action>
+    <action date="22 Feb 2007 16:52:21" parent="17" time="18" user="manu" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="67.0" dy="-28.0" id="2"/>
+    </action>
+    <action date="22 Feb 2007 16:52:21" parent="18" time="19" user="manu" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="1" destinationModule="PythonSource" destinationPort="v2(Float)" id="1" sourceId="2" sourceModule="Float" sourcePort="value(Float)"/>
+    </action>
+    <action date="22 Feb 2007 16:52:41" parent="19" time="20" user="manu" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="0.0" dy="-1.0" id="0"/>
+      <move dx="0.0" dy="-2.0" id="2"/>
+    </action>
+    <action date="22 Feb 2007 16:52:41" parent="20" time="21" user="manu" what="addModule">
+      <notes>
+        None
+      </notes>
+      <object cache="0" id="3" name="Float" x="-93.0" y="-85.0"/>
+    </action>
+    <action date="22 Feb 2007 16:52:45" parent="21" time="22" user="manu" what="moveModule">
+      <notes>
+        None
+      </notes>
+      <move dx="47.0" dy="52.0" id="3"/>
+    </action>
+    <action date="22 Feb 2007 16:52:45" parent="22" time="23" user="manu" what="addConnection">
+      <notes>
+        None
+      </notes>
+      <connect destinationId="3" destinationModule="Float" destinationPort="value(Float)" id="2" sourceId="1" sourceModule="PythonSource" sourcePort="res(Float)"/>
+    </action>
+    <tag name="alias" time="23"/>
+  </visTrail>
diff --git a/vistrails/tests/resources/test_archive.zip b/vistrails/tests/resources/test_archive.zip
new file mode 100644
index 0000000..80e524e
Binary files /dev/null and b/vistrails/tests/resources/test_archive.zip differ
diff --git a/vistrails/tests/resources/test_change_vistrail.xml b/vistrails/tests/resources/test_change_vistrail.xml
new file mode 100644
index 0000000..fc99e20
--- /dev/null
+++ b/vistrails/tests/resources/test_change_vistrail.xml
@@ -0,0 +1,386 @@
+<vistrail id="" name="" version="1.0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2007-07-16 15:56:55" id="1" prevId="0" session="" user="cscheid">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="TestChangeVistrail" namespace="" package="edu.utah.sci.vistrails.console_mode_test" version="" />
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-12.0" y="36.0" />
+    </add>
+  </action>
+  <action date="2007-07-16 15:57:04" id="2" prevId="1" session="" user="cscheid">
+    <add id="2" objectId="0" parentObjId="0" parentObjType="module" what="function">
+      <function id="0" name="foo" pos="0" />
+    </add>
+    <add id="3" objectId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="Integer" val="" />
+    </add>
+  </action>
+  <action date="2007-07-16 15:57:05" id="3" prevId="2" session="" user="cscheid">
+    <change id="4" newObjId="1" oldObjId="0" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="Integer" val="10" />
+    </change>
+  </action>
+  <action date="2007-07-19 16:38:29" id="4" prevId="3" session="" user="cscheid">
+    <delete id="5" objectId="1" parentObjId="0" parentObjType="function" what="parameter" />
+    <delete id="6" objectId="0" parentObjId="0" parentObjType="module" what="function" />
+  </action>
+  <action date="2011-06-30 15:14:47" id="5" prevId="3" session="0" user="emanuele">
+    <change id="7" newObjId="2" oldObjId="1" parentObjId="0" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:14:47" id="6" prevId="4" session="1" user="emanuele">
+    <annotation id="2" key="__description__" value="Upgrade" />
+    <delete id="8" objectId="0" parentObjId="0" parentObjType="module" what="location" />
+    <delete id="9" objectId="0" parentObjId="" parentObjType="" what="module" />
+    <add id="10" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="TestChangeVistrail" namespace="" package="edu.utah.sci.vistrails.console_mode_test" version="0.9.0" />
+    </add>
+    <add id="11" objectId="1" parentObjId="1" parentObjType="module" what="location">
+      <location id="1" x="-12.0" y="36.0" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:14:47" id="7" prevId="6" session="1" user="emanuele">
+    <add id="12" objectId="1" parentObjId="1" parentObjType="module" what="function">
+      <function id="1" name="foo" pos="0" />
+    </add>
+    <add id="13" objectId="3" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:30:25" id="8" prevId="3" session="2" user="emanuele">
+    <annotation id="4" key="__description__" value="Upgrade" />
+    <delete id="14" objectId="0" parentObjId="0" parentObjType="module" what="location" />
+    <delete id="15" objectId="1" parentObjId="0" parentObjType="function" what="parameter" />
+    <delete id="16" objectId="0" parentObjId="0" parentObjType="module" what="function" />
+    <delete id="17" objectId="0" parentObjId="" parentObjType="" what="module" />
+    <add id="18" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="TestChangeVistrail" namespace="" package="edu.utah.sci.vistrails.console_mode_test" version="0.9.0" />
+    </add>
+    <add id="19" objectId="2" parentObjId="2" parentObjType="module" what="function">
+      <function id="2" name="foo" pos="0" />
+    </add>
+    <add id="20" objectId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="10" />
+    </add>
+    <add id="21" objectId="2" parentObjId="2" parentObjType="module" what="location">
+      <location id="2" x="-12.0" y="36.0" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:30:25" id="9" prevId="8" session="2" user="emanuele">
+    <change id="22" newObjId="5" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:30:25" id="10" prevId="6" session="3" user="emanuele">
+    <add id="23" objectId="3" parentObjId="1" parentObjType="module" what="function">
+      <function id="3" name="foo" pos="0" />
+    </add>
+    <add id="24" objectId="6" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:30:47" id="11" prevId="8" session="4" user="emanuele">
+    <change id="25" newObjId="7" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="7" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:30:47" id="12" prevId="6" session="5" user="emanuele">
+    <add id="26" objectId="4" parentObjId="1" parentObjType="module" what="function">
+      <function id="4" name="foo" pos="0" />
+    </add>
+    <add id="27" objectId="8" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="8" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:32:51" id="13" prevId="8" session="6" user="emanuele">
+    <change id="28" newObjId="9" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="9" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:32:51" id="14" prevId="6" session="7" user="emanuele">
+    <add id="29" objectId="5" parentObjId="1" parentObjType="module" what="function">
+      <function id="5" name="foo" pos="0" />
+    </add>
+    <add id="30" objectId="10" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="10" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:35:57" id="15" prevId="8" session="8" user="emanuele">
+    <change id="31" newObjId="11" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="11" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:35:57" id="16" prevId="6" session="9" user="emanuele">
+    <add id="32" objectId="6" parentObjId="1" parentObjType="module" what="function">
+      <function id="6" name="foo" pos="0" />
+    </add>
+    <add id="33" objectId="12" parentObjId="6" parentObjType="function" what="parameter">
+      <parameter alias="" id="12" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:41:37" id="17" prevId="8" session="10" user="emanuele">
+    <change id="34" newObjId="13" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="13" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:41:37" id="18" prevId="6" session="11" user="emanuele">
+    <add id="35" objectId="7" parentObjId="1" parentObjType="module" what="function">
+      <function id="7" name="foo" pos="0" />
+    </add>
+    <add id="36" objectId="14" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="14" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:45:44" id="19" prevId="8" session="12" user="emanuele">
+    <change id="37" newObjId="15" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="15" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:45:44" id="20" prevId="6" session="13" user="emanuele">
+    <add id="38" objectId="8" parentObjId="1" parentObjType="module" what="function">
+      <function id="8" name="foo" pos="0" />
+    </add>
+    <add id="39" objectId="16" parentObjId="8" parentObjType="function" what="parameter">
+      <parameter alias="" id="16" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:47:49" id="21" prevId="8" session="14" user="emanuele">
+    <change id="40" newObjId="17" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="17" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:47:49" id="22" prevId="6" session="15" user="emanuele">
+    <add id="41" objectId="9" parentObjId="1" parentObjType="module" what="function">
+      <function id="9" name="foo" pos="0" />
+    </add>
+    <add id="42" objectId="18" parentObjId="9" parentObjType="function" what="parameter">
+      <parameter alias="" id="18" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 15:56:24" id="23" prevId="8" session="16" user="emanuele">
+    <change id="43" newObjId="19" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="19" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 15:56:24" id="24" prevId="6" session="17" user="emanuele">
+    <add id="44" objectId="10" parentObjId="1" parentObjType="module" what="function">
+      <function id="10" name="foo" pos="0" />
+    </add>
+    <add id="45" objectId="20" parentObjId="10" parentObjType="function" what="parameter">
+      <parameter alias="" id="20" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:01:31" id="25" prevId="8" session="18" user="emanuele">
+    <change id="46" newObjId="21" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="21" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:01:31" id="26" prevId="6" session="19" user="emanuele">
+    <add id="47" objectId="11" parentObjId="1" parentObjType="module" what="function">
+      <function id="11" name="foo" pos="0" />
+    </add>
+    <add id="48" objectId="22" parentObjId="11" parentObjType="function" what="parameter">
+      <parameter alias="" id="22" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:02:57" id="27" prevId="8" session="20" user="emanuele">
+    <change id="49" newObjId="23" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="23" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:02:57" id="28" prevId="6" session="21" user="emanuele">
+    <add id="50" objectId="12" parentObjId="1" parentObjType="module" what="function">
+      <function id="12" name="foo" pos="0" />
+    </add>
+    <add id="51" objectId="24" parentObjId="12" parentObjType="function" what="parameter">
+      <parameter alias="" id="24" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:04:06" id="29" prevId="8" session="22" user="emanuele">
+    <change id="52" newObjId="25" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="25" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:04:06" id="30" prevId="6" session="23" user="emanuele">
+    <add id="53" objectId="13" parentObjId="1" parentObjType="module" what="function">
+      <function id="13" name="foo" pos="0" />
+    </add>
+    <add id="54" objectId="26" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="26" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:23:24" id="31" prevId="8" session="24" user="emanuele">
+    <change id="55" newObjId="27" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="27" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:23:24" id="32" prevId="6" session="25" user="emanuele">
+    <add id="56" objectId="14" parentObjId="1" parentObjType="module" what="function">
+      <function id="14" name="foo" pos="0" />
+    </add>
+    <add id="57" objectId="28" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="28" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:29:05" id="33" prevId="8" session="26" user="emanuele">
+    <change id="58" newObjId="29" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="29" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:29:05" id="34" prevId="6" session="27" user="emanuele">
+    <add id="59" objectId="15" parentObjId="1" parentObjType="module" what="function">
+      <function id="15" name="foo" pos="0" />
+    </add>
+    <add id="60" objectId="30" parentObjId="15" parentObjType="function" what="parameter">
+      <parameter alias="" id="30" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:46:53" id="35" prevId="8" session="28" user="emanuele">
+    <change id="61" newObjId="31" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="31" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:46:53" id="36" prevId="6" session="29" user="emanuele">
+    <add id="62" objectId="16" parentObjId="1" parentObjType="module" what="function">
+      <function id="16" name="foo" pos="0" />
+    </add>
+    <add id="63" objectId="32" parentObjId="16" parentObjType="function" what="parameter">
+      <parameter alias="" id="32" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 16:57:25" id="37" prevId="8" session="30" user="emanuele">
+    <change id="64" newObjId="33" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="33" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 16:57:25" id="38" prevId="6" session="31" user="emanuele">
+    <add id="65" objectId="17" parentObjId="1" parentObjType="module" what="function">
+      <function id="17" name="foo" pos="0" />
+    </add>
+    <add id="66" objectId="34" parentObjId="17" parentObjType="function" what="parameter">
+      <parameter alias="" id="34" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:07:47" id="39" prevId="8" session="32" user="emanuele">
+    <change id="67" newObjId="35" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="35" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:07:47" id="40" prevId="6" session="33" user="emanuele">
+    <add id="68" objectId="18" parentObjId="1" parentObjType="module" what="function">
+      <function id="18" name="foo" pos="0" />
+    </add>
+    <add id="69" objectId="36" parentObjId="18" parentObjType="function" what="parameter">
+      <parameter alias="" id="36" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:09:48" id="41" prevId="8" session="34" user="emanuele">
+    <change id="70" newObjId="37" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="37" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:09:48" id="42" prevId="6" session="35" user="emanuele">
+    <add id="71" objectId="19" parentObjId="1" parentObjType="module" what="function">
+      <function id="19" name="foo" pos="0" />
+    </add>
+    <add id="72" objectId="38" parentObjId="19" parentObjType="function" what="parameter">
+      <parameter alias="" id="38" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:13:14" id="43" prevId="8" session="36" user="emanuele">
+    <change id="73" newObjId="39" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="39" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:13:15" id="44" prevId="6" session="37" user="emanuele">
+    <add id="74" objectId="20" parentObjId="1" parentObjType="module" what="function">
+      <function id="20" name="foo" pos="0" />
+    </add>
+    <add id="75" objectId="40" parentObjId="20" parentObjType="function" what="parameter">
+      <parameter alias="" id="40" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:21:57" id="45" prevId="8" session="38" user="emanuele">
+    <change id="76" newObjId="41" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="41" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:21:57" id="46" prevId="6" session="39" user="emanuele">
+    <add id="77" objectId="21" parentObjId="1" parentObjType="module" what="function">
+      <function id="21" name="foo" pos="0" />
+    </add>
+    <add id="78" objectId="42" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="42" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:23:07" id="47" prevId="8" session="40" user="emanuele">
+    <change id="79" newObjId="43" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="43" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:23:08" id="48" prevId="6" session="41" user="emanuele">
+    <add id="80" objectId="22" parentObjId="1" parentObjType="module" what="function">
+      <function id="22" name="foo" pos="0" />
+    </add>
+    <add id="81" objectId="44" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="44" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:25:56" id="49" prevId="8" session="42" user="emanuele">
+    <change id="82" newObjId="45" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="45" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:25:57" id="50" prevId="6" session="43" user="emanuele">
+    <add id="83" objectId="23" parentObjId="1" parentObjType="module" what="function">
+      <function id="23" name="foo" pos="0" />
+    </add>
+    <add id="84" objectId="46" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="46" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:29:30" id="51" prevId="8" session="44" user="emanuele">
+    <change id="85" newObjId="47" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="47" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:29:30" id="52" prevId="6" session="45" user="emanuele">
+    <add id="86" objectId="24" parentObjId="1" parentObjType="module" what="function">
+      <function id="24" name="foo" pos="0" />
+    </add>
+    <add id="87" objectId="48" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="48" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:30:46" id="53" prevId="8" session="46" user="emanuele">
+    <change id="88" newObjId="49" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="49" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:30:46" id="54" prevId="6" session="47" user="emanuele">
+    <add id="89" objectId="25" parentObjId="1" parentObjType="module" what="function">
+      <function id="25" name="foo" pos="0" />
+    </add>
+    <add id="90" objectId="50" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="50" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <action date="2011-06-30 17:31:14" id="55" prevId="8" session="48" user="emanuele">
+    <change id="91" newObjId="51" oldObjId="4" parentObjId="2" parentObjType="function" what="parameter">
+      <parameter alias="" id="51" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="11" />
+    </change>
+  </action>
+  <action date="2011-06-30 17:31:14" id="56" prevId="6" session="49" user="emanuele">
+    <add id="92" objectId="26" parentObjId="1" parentObjType="module" what="function">
+      <function id="26" name="foo" pos="0" />
+    </add>
+    <add id="93" objectId="52" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="52" name="<no description>" pos="0" type="edu.utah.sci.vistrails.basic:Integer" val="1" />
+    </add>
+  </action>
+  <actionAnnotation actionId="3" date="" id="0" key="__tag__" user="" value="v1" />
+  <actionAnnotation actionId="4" date="" id="1" key="__tag__" user="" value="v2" />
+  <actionAnnotation actionId="4" date="2011-06-30 15:14:47" id="3" key="__upgrade__" user="emanuele" value="6" />
+  <actionAnnotation actionId="3" date="2011-06-30 15:30:25" id="5" key="__upgrade__" user="emanuele" value="8" />
+</vistrail>
diff --git a/vistrails/tests/resources/test_ticket_73.xml b/vistrails/tests/resources/test_ticket_73.xml
new file mode 100644
index 0000000..a26ea43
--- /dev/null
+++ b/vistrails/tests/resources/test_ticket_73.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" ?>
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<vistrail dbHost="" dbName="" dbPort="" id="" name="" version="0.5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2007-07-23 15:57:26" id="1" prevId="0" user="cscheid">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="different name"/>
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-30.0" y="-12.0"/>
+    </add>
+  </action>
+</vistrail>
diff --git a/vistrails/tests/resources/triangle_count.vt b/vistrails/tests/resources/triangle_count.vt
new file mode 100644
index 0000000..33950e5
Binary files /dev/null and b/vistrails/tests/resources/triangle_count.vt differ
diff --git a/vistrails/tests/resources/visvar-1.0.2.vt b/vistrails/tests/resources/visvar-1.0.2.vt
new file mode 100644
index 0000000..0d1e08c
Binary files /dev/null and b/vistrails/tests/resources/visvar-1.0.2.vt differ
diff --git a/vistrails/tests/resources/visvar-1.0.3.vt b/vistrails/tests/resources/visvar-1.0.3.vt
new file mode 100644
index 0000000..72171c0
Binary files /dev/null and b/vistrails/tests/resources/visvar-1.0.3.vt differ
diff --git a/vistrails/tests/resources/vtk.xml b/vistrails/tests/resources/vtk.xml
new file mode 100644
index 0000000..3f11dbc
--- /dev/null
+++ b/vistrails/tests/resources/vtk.xml
@@ -0,0 +1,3840 @@
+<?xml version="1.0" ?>
+<!--###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+-->
+<vistrail dbHost="" dbName="" dbPort="" id="" name="" version="0.5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vistrails.org/vistrail.xsd">
+  <action date="2006-09-21 14:07:44" id="2" prevId="0" user="hvo">
+    <add id="0" objectId="0" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="0" name="vtkDataSetReader"/>
+    </add>
+    <add id="1" objectId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="0" x="-2.94277920552" y="1.77656675749"/>
+    </add>
+  </action>
+  <action date="2006-09-21 14:07:49" id="3" prevId="2" user="hvo">
+    <change id="2" newObjId="1" oldObjId="0" parentObjId="0" parentObjType="module" what="location">
+      <location id="1" x="3.23342404537" y="82.0672161716"/>
+    </change>
+  </action>
+  <action date="2006-09-22 03:52:04" id="4" prevId="3" user="hvo">
+    <add id="3" objectId="1" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="1" name="vtkDataSetMapper"/>
+    </add>
+    <add id="4" objectId="2" parentObjId="1" parentObjType="module" what="location">
+      <location id="2" x="-14.284824029" y="-23.0422741235"/>
+    </add>
+  </action>
+  <action date="2006-09-22 04:04:49" id="5" prevId="4" user="hvo">
+    <add id="5" objectId="0" parentObjId="1" parentObjType="module" what="function">
+      <function id="0" name="ScalarVisibilityOn" pos="0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:22:03" id="6" prevId="5" user="hvo">
+    <change id="6" newObjId="3" oldObjId="2" parentObjId="1" parentObjType="module" what="location">
+      <location id="3" x="27.486042365" y="-14.9946762384"/>
+    </change>
+    <change id="7" newObjId="4" oldObjId="1" parentObjId="0" parentObjType="module" what="location">
+      <location id="4" x="-20.1429320795" y="169.441140427"/>
+    </change>
+    <change id="8" newObjId="5" oldObjId="3" parentObjId="1" parentObjType="module" what="location">
+      <location id="5" x="-13.5183864985" y="66.2477401434"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:22:03" id="7" prevId="6" user="hvo">
+    <add id="9" objectId="1" parentObjId="0" parentObjType="module" what="function">
+      <function id="1" name="SetFileName" pos="0"/>
+    </add>
+    <add id="10" objectId="0" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="0" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:22:10" id="8" prevId="7" user="hvo">
+    <change id="11" newObjId="1" oldObjId="0" parentObjId="1" parentObjType="function" what="parameter">
+      <parameter alias="" id="1" name="<no description>" pos="0" type="String" val="../examples/data/spx.vtk"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:22:15" id="9" prevId="8" user="hvo">
+    <add id="12" objectId="0" parentObjId="" parentObjType="" what="connection">
+      <connection id="0"/>
+    </add>
+    <add id="13" objectId="0" parentObjId="0" parentObjType="connection" what="port">
+      <port id="0" moduleId="0" moduleName="vtkDataSetReader" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="14" objectId="1" parentObjId="0" parentObjType="connection" what="port">
+      <port id="1" moduleId="1" moduleName="vtkDataSetMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:22:33" id="10" prevId="9" user="hvo">
+    <add id="15" objectId="2" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="2" name="vtkActor"/>
+    </add>
+    <add id="16" objectId="6" parentObjId="2" parentObjType="module" what="location">
+      <location id="6" x="-37.3328730993" y="-27.7787650508"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:22:36" id="11" prevId="10" user="hvo">
+    <change id="17" newObjId="7" oldObjId="6" parentObjId="2" parentObjType="module" what="location">
+      <location id="7" x="0.6058018275" y="-59.5859397334"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:22:36" id="12" prevId="11" user="hvo">
+    <add id="18" objectId="1" parentObjId="" parentObjType="" what="connection">
+      <connection id="1"/>
+    </add>
+    <add id="19" objectId="2" parentObjId="1" parentObjType="connection" what="port">
+      <port id="2" moduleId="1" moduleName="vtkDataSetMapper" sig="self(vtkDataSetMapper)" type="source"/>
+    </add>
+    <add id="20" objectId="3" parentObjId="1" parentObjType="connection" what="port">
+      <port id="3" moduleId="2" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:22:42" id="13" prevId="12" user="hvo">
+    <change id="21" newObjId="8" oldObjId="7" parentObjId="2" parentObjType="module" what="location">
+      <location id="8" x="-12.8068616323" y="-24.3297942561"/>
+    </change>
+    <change id="22" newObjId="9" oldObjId="5" parentObjId="1" parentObjType="module" what="location">
+      <location id="9" x="-23.0988603983" y="94.9891627966"/>
+    </change>
+    <change id="23" newObjId="10" oldObjId="4" parentObjId="0" parentObjType="module" what="location">
+      <location id="10" x="-33.9388143045" y="200.865096344"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:22:53" id="14" prevId="13" user="hvo">
+    <change id="24" newObjId="11" oldObjId="9" parentObjId="1" parentObjType="module" what="location">
+      <location id="11" x="-23.4820793424" y="95.3723817705"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:22:53" id="15" prevId="14" user="hvo">
+    <add id="25" objectId="2" parentObjId="1" parentObjType="module" what="function">
+      <function id="2" name="ScalarVisibilityOn" pos="1"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:22:55" id="16" prevId="15" user="hvo">
+    <delete id="26" objectId="0" parentObjId="1" parentObjType="module" what="function"/>
+  </action>
+  <action date="2006-09-22 06:23:16" id="17" prevId="16" user="hvo">
+    <change id="27" newObjId="12" oldObjId="8" parentObjId="2" parentObjType="module" what="location">
+      <location id="12" x="-13.1900805764" y="-7.0849402827"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:23:16" id="18" prevId="17" user="hvo">
+    <add id="28" objectId="3" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="3" name="vtkRenderer"/>
+    </add>
+    <add id="29" objectId="13" parentObjId="3" parentObjType="module" what="location">
+      <location id="13" x="-32.7342456759" y="-69.5496320346"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:23:30" id="19" prevId="18" user="hvo">
+    <change id="30" newObjId="14" oldObjId="13" parentObjId="3" parentObjType="module" what="location">
+      <location id="14" x="-16.6390499056" y="-100.590367279"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:43:19" id="20" prevId="19" user="hvo">
+    <add id="31" objectId="2" parentObjId="" parentObjType="" what="connection">
+      <connection id="2"/>
+    </add>
+    <add id="32" objectId="4" parentObjId="2" parentObjType="connection" what="port">
+      <port id="4" moduleId="2" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="33" objectId="5" parentObjId="2" parentObjType="connection" what="port">
+      <port id="5" moduleId="3" moduleName="vtkRenderer" sig="AddActor(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:43:22" id="21" prevId="20" user="hvo">
+    <change id="34" newObjId="15" oldObjId="14" parentObjId="3" parentObjType="module" what="location">
+      <location id="15" x="-17.7392522276" y="-128.095427475"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:43:43" id="22" prevId="21" user="hvo">
+    <change id="35" newObjId="16" oldObjId="15" parentObjId="3" parentObjType="module" what="location">
+      <location id="16" x="-9.92281593687" y="-99.0629491428"/>
+    </change>
+    <change id="36" newObjId="17" oldObjId="10" parentObjId="0" parentObjType="module" what="location">
+      <location id="17" x="-38.4053493959" y="260.046687378"/>
+    </change>
+    <change id="37" newObjId="18" oldObjId="11" parentObjId="1" parentObjType="module" what="location">
+      <location id="18" x="-24.5987131153" y="189.169622981"/>
+    </change>
+    <change id="38" newObjId="19" oldObjId="12" parentObjId="2" parentObjType="module" what="location">
+      <location id="19" x="3.55942542033" y="76.6625954229"/>
+    </change>
+    <change id="39" newObjId="20" oldObjId="18" parentObjId="1" parentObjType="module" what="location">
+      <location id="20" x="-43.5814878498" y="162.370411479"/>
+    </change>
+    <change id="40" newObjId="21" oldObjId="16" parentObjId="3" parentObjType="module" what="location">
+      <location id="21" x="17.9930280267" y="-33.1815557102"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:43:43" id="23" prevId="22" user="hvo">
+    <add id="41" objectId="4" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="4" name="vtkRenderWindow"/>
+    </add>
+    <add id="42" objectId="22" parentObjId="4" parentObjType="module" what="location">
+      <location id="22" x="-19.5792388934" y="-162.786616329"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:43:44" id="24" prevId="23" user="hvo">
+    <add id="43" objectId="3" parentObjId="" parentObjType="" what="connection">
+      <connection id="3"/>
+    </add>
+    <add id="44" objectId="6" parentObjId="3" parentObjType="connection" what="port">
+      <port id="6" moduleId="3" moduleName="vtkRenderer" sig="self(vtkRenderer)" type="source"/>
+    </add>
+    <add id="45" objectId="7" parentObjId="3" parentObjType="connection" what="port">
+      <port id="7" moduleId="4" moduleName="vtkRenderWindow" sig="AddRenderer(vtkRenderer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:53:16" id="25" prevId="24" user="hvo">
+    <change id="46" newObjId="23" oldObjId="22" parentObjId="4" parentObjType="module" what="location">
+      <location id="23" x="238.133010863" y="-201.366297726"/>
+    </change>
+    <change id="47" newObjId="24" oldObjId="21" parentObjId="3" parentObjType="module" what="location">
+      <location id="24" x="-230.460112232" y="-13.1201219181"/>
+    </change>
+    <change id="48" newObjId="25" oldObjId="19" parentObjId="2" parentObjType="module" what="location">
+      <location id="25" x="-268.041526728" y="109.069528254"/>
+    </change>
+    <change id="49" newObjId="26" oldObjId="20" parentObjId="1" parentObjType="module" what="location">
+      <location id="26" x="-247.282186703" y="291.998142802"/>
+    </change>
+    <change id="50" newObjId="27" oldObjId="17" parentObjId="0" parentObjType="module" what="location">
+      <location id="27" x="-223.587813996" y="411.279032959"/>
+    </change>
+    <change id="51" newObjId="28" oldObjId="23" parentObjId="4" parentObjType="module" what="location">
+      <location id="28" x="15.9140624986" y="-168.959364895"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:53:16" id="26" prevId="25" user="hvo">
+    <add id="52" objectId="5" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="5" name="vtkInteractorStyleTrackballCamera"/>
+    </add>
+    <add id="53" objectId="29" parentObjId="5" parentObjType="module" what="location">
+      <location id="29" x="404.515813471" y="218.027401249"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:53:25" id="27" prevId="26" user="hvo">
+    <change id="54" newObjId="30" oldObjId="29" parentObjId="5" parentObjType="module" what="location">
+      <location id="30" x="296.492704035" y="255.063896458"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:53:25" id="28" prevId="27" user="hvo">
+    <add id="55" objectId="6" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="6" name="vtkRenderWindowInteractor"/>
+    </add>
+    <add id="56" objectId="31" parentObjId="6" parentObjType="module" what="location">
+      <location id="31" x="302.665452228" y="22.0426236832"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:53:31" id="29" prevId="28" user="hvo">
+    <add id="57" objectId="4" parentObjId="" parentObjType="" what="connection">
+      <connection id="4"/>
+    </add>
+    <add id="58" objectId="8" parentObjId="4" parentObjType="connection" what="port">
+      <port id="8" moduleId="5" moduleName="vtkInteractorStyleTrackballCamera" sig="self(vtkInteractorStyleTrackballCamera)" type="source"/>
+    </add>
+    <add id="59" objectId="9" parentObjId="4" parentObjType="connection" what="port">
+      <port id="9" moduleId="6" moduleName="vtkRenderWindowInteractor" sig="SetInteractorStyle(vtkInteractorObserver)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:53:33" id="30" prevId="29" user="hvo">
+    <change id="60" newObjId="32" oldObjId="31" parentObjId="6" parentObjType="module" what="location">
+      <location id="32" x="186.926408039" y="39.0176831925"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:53:34" id="31" prevId="30" user="hvo">
+    <add id="61" objectId="5" parentObjId="" parentObjType="" what="connection">
+      <connection id="5"/>
+    </add>
+    <add id="62" objectId="10" parentObjId="5" parentObjType="connection" what="port">
+      <port id="10" moduleId="6" moduleName="vtkRenderWindowInteractor" sig="self(vtkRenderWindowInteractor)" type="source"/>
+    </add>
+    <add id="63" objectId="11" parentObjId="5" parentObjType="connection" what="port">
+      <port id="11" moduleId="4" moduleName="vtkRenderWindow" sig="SetInteractor(vtkRenderWindowInteractor)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 06:54:00" id="32" prevId="31" user="hvo">
+    <change id="64" newObjId="33" oldObjId="30" parentObjId="5" parentObjType="module" what="location">
+      <location id="33" x="294.949516774" y="255.063896458"/>
+    </change>
+  </action>
+  <action date="2006-09-22 06:55:39" id="33" prevId="32" user="hvo">
+    <change id="65" newObjId="34" oldObjId="32" parentObjId="6" parentObjType="module" what="location">
+      <location id="34" x="186.926408039" y="37.4744959319"/>
+    </change>
+    <change id="66" newObjId="35" oldObjId="33" parentObjId="5" parentObjType="module" what="location">
+      <location id="35" x="294.949516774" y="256.607083718"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:11:08" id="34" prevId="33" user="hvo">
+    <add id="67" objectId="7" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="7" name="VTKCell"/>
+    </add>
+    <add id="68" objectId="36" parentObjId="7" parentObjType="module" what="location">
+      <location id="36" x="-293.958243639" y="-287.246531471"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:11:24" id="35" prevId="34" user="hvo">
+    <change id="69" newObjId="37" oldObjId="36" parentObjId="7" parentObjType="module" what="location">
+      <location id="37" x="5.383644789" y="-302.002820953"/>
+    </change>
+    <change id="70" newObjId="38" oldObjId="28" parentObjId="4" parentObjType="module" what="location">
+      <location id="38" x="-345.615020753" y="-181.607613567"/>
+    </change>
+    <change id="71" newObjId="39" oldObjId="37" parentObjId="7" parentObjType="module" what="location">
+      <location id="39" x="175.080971449" y="-220.843229278"/>
+    </change>
+    <change id="72" newObjId="40" oldObjId="38" parentObjId="4" parentObjType="module" what="location">
+      <location id="40" x="-86.3259277354" y="-249.064942364"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:11:24" id="36" prevId="35" user="hvo">
+    <delete id="73" objectId="6" parentObjId="3" parentObjType="connection" what="port"/>
+    <delete id="74" objectId="7" parentObjId="3" parentObjType="connection" what="port"/>
+    <delete id="75" objectId="3" parentObjId="" parentObjType="" what="connection"/>
+    <delete id="76" objectId="10" parentObjId="5" parentObjType="connection" what="port"/>
+    <delete id="77" objectId="11" parentObjId="5" parentObjType="connection" what="port"/>
+    <delete id="78" objectId="5" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-09-22 08:11:24" id="37" prevId="36" user="hvo">
+    <delete id="79" objectId="40" parentObjId="4" parentObjType="module" what="location"/>
+    <delete id="80" objectId="4" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 08:11:25" id="38" prevId="37" user="hvo">
+    <delete id="81" objectId="8" parentObjId="4" parentObjType="connection" what="port"/>
+    <delete id="82" objectId="9" parentObjId="4" parentObjType="connection" what="port"/>
+    <delete id="83" objectId="4" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-09-22 08:11:25" id="39" prevId="38" user="hvo">
+    <delete id="84" objectId="34" parentObjId="6" parentObjType="module" what="location"/>
+    <delete id="85" objectId="6" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 08:11:26" id="40" prevId="39" user="hvo"/>
+  <action date="2006-09-22 08:11:26" id="41" prevId="40" user="hvo">
+    <delete id="86" objectId="35" parentObjId="5" parentObjType="module" what="location"/>
+    <delete id="87" objectId="5" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 08:11:28" id="42" prevId="41" user="hvo">
+    <change id="88" newObjId="41" oldObjId="39" parentObjId="7" parentObjType="module" what="location">
+      <location id="41" x="-190.664206774" y="-175.520338043"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:11:28" id="43" prevId="42" user="hvo">
+    <add id="89" objectId="6" parentObjId="" parentObjType="" what="connection">
+      <connection id="6"/>
+    </add>
+    <add id="90" objectId="12" parentObjId="6" parentObjType="connection" what="port">
+      <port id="12" moduleId="3" moduleName="vtkRenderer" sig="self(vtkRenderer)" type="source"/>
+    </add>
+    <add id="91" objectId="13" parentObjId="6" parentObjType="connection" what="port">
+      <port id="13" moduleId="7" moduleName="VTKCell" sig="AddRenderer(vtkRenderer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:18:17" id="44" prevId="43" user="hvo">
+    <change id="92" newObjId="42" oldObjId="27" parentObjId="0" parentObjType="module" what="location">
+      <location id="42" x="-528.34999051" y="415.967682137"/>
+    </change>
+    <change id="93" newObjId="43" oldObjId="26" parentObjId="1" parentObjType="module" what="location">
+      <location id="43" x="-569.236074642" y="182.59633311"/>
+    </change>
+    <change id="94" newObjId="44" oldObjId="25" parentObjId="2" parentObjType="module" what="location">
+      <location id="44" x="-502.47396081" y="74.6861015874"/>
+    </change>
+    <change id="95" newObjId="45" oldObjId="24" parentObjId="3" parentObjType="module" what="location">
+      <location id="45" x="-544.599577564" y="-66.2581452946"/>
+    </change>
+    <change id="96" newObjId="46" oldObjId="42" parentObjId="0" parentObjType="module" what="location">
+      <location id="46" x="-528.34999051" y="417.530565156"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:18:17" id="45" prevId="44" user="hvo">
+    <add id="97" objectId="8" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="8" name="vtkDataSetReader"/>
+    </add>
+    <add id="98" objectId="47" parentObjId="8" parentObjType="module" what="location">
+      <location id="47" x="-167.928980017" y="385.74270929"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:18:57" id="46" prevId="45" user="hvo">
+    <change id="99" newObjId="48" oldObjId="47" parentObjId="8" parentObjType="module" what="location">
+      <location id="48" x="-97.5992452148" y="387.305592309"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:18:57" id="47" prevId="46" user="hvo">
+    <add id="100" objectId="3" parentObjId="3" parentObjType="module" what="function">
+      <function id="3" name="SetViewport" pos="0"/>
+    </add>
+    <add id="101" objectId="2" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="2" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="102" objectId="3" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="3" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="103" objectId="4" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="4" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+    <add id="104" objectId="5" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="5" name="<no description>" pos="3" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:19:04" id="48" prevId="47" user="hvo">
+    <change id="105" newObjId="6" oldObjId="2" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="6" name="<no description>" pos="0" type="Float" val=""/>
+    </change>
+    <change id="106" newObjId="7" oldObjId="3" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="7" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="107" newObjId="8" oldObjId="4" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="8" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="108" newObjId="9" oldObjId="5" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="9" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:20:03" id="49" prevId="48" user="hvo">
+    <change id="109" newObjId="10" oldObjId="6" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="10" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="110" newObjId="11" oldObjId="7" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="11" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="111" newObjId="12" oldObjId="8" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="12" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="112" newObjId="13" oldObjId="9" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="13" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:20:04" id="50" prevId="49" user="hvo">
+    <change id="113" newObjId="14" oldObjId="10" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="14" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="114" newObjId="15" oldObjId="11" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="15" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="115" newObjId="16" oldObjId="12" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="16" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="116" newObjId="17" oldObjId="13" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="17" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:20:07" id="51" prevId="50" user="hvo">
+    <change id="117" newObjId="18" oldObjId="14" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="18" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="118" newObjId="19" oldObjId="15" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="19" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="119" newObjId="20" oldObjId="16" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="20" name="<no description>" pos="2" type="Float" val="0.5"/>
+    </change>
+    <change id="120" newObjId="21" oldObjId="17" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="21" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:20:11" id="52" prevId="51" user="hvo">
+    <change id="121" newObjId="22" oldObjId="18" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="22" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="122" newObjId="23" oldObjId="19" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="23" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="123" newObjId="24" oldObjId="20" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="24" name="<no description>" pos="2" type="Float" val="0.5"/>
+    </change>
+    <change id="124" newObjId="25" oldObjId="21" parentObjId="3" parentObjType="function" what="parameter">
+      <parameter alias="" id="25" name="<no description>" pos="3" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:20:16" id="53" prevId="52" user="hvo">
+    <add id="125" objectId="4" parentObjId="8" parentObjType="module" what="function">
+      <function id="4" name="SetFileName" pos="0"/>
+    </add>
+    <add id="126" objectId="26" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="26" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:21:00" id="54" prevId="53" user="hvo">
+    <change id="127" newObjId="27" oldObjId="26" parentObjId="4" parentObjType="function" what="parameter">
+      <parameter alias="" id="27" name="<no description>" pos="0" type="String" val="../examples/data/torus.vtk"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:21:10" id="55" prevId="54" user="hvo">
+    <add id="128" objectId="9" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="9" name="vtkDataSetMapper"/>
+    </add>
+    <add id="129" objectId="49" parentObjId="9" parentObjType="module" what="location">
+      <location id="49" x="-114.790960222" y="177.879271361"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:21:27" id="56" prevId="55" user="hvo">
+    <change id="130" newObjId="50" oldObjId="49" parentObjId="9" parentObjType="module" what="location">
+      <location id="50" x="-41.3354624803" y="220.077113005"/>
+    </change>
+    <change id="131" newObjId="51" oldObjId="50" parentObjId="9" parentObjType="module" what="location">
+      <location id="51" x="-96.0363635118" y="170.064856383"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:21:27" id="57" prevId="56" user="hvo"/>
+  <action date="2006-09-22 08:21:27" id="58" prevId="57" user="hvo">
+    <delete id="132" objectId="48" parentObjId="8" parentObjType="module" what="location"/>
+    <delete id="133" objectId="27" parentObjId="4" parentObjType="function" what="parameter"/>
+    <delete id="134" objectId="4" parentObjId="8" parentObjType="module" what="function"/>
+    <delete id="135" objectId="8" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 08:21:32" id="59" prevId="58" user="hvo">
+    <add id="136" objectId="10" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="10" name="vtkDataSetMapper"/>
+    </add>
+    <add id="137" objectId="52" parentObjId="10" parentObjType="module" what="location">
+      <location id="52" x="-103.850779676" y="387.305592282"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:21:47" id="60" prevId="59" user="hvo">
+    <change id="138" newObjId="53" oldObjId="52" parentObjId="10" parentObjType="module" what="location">
+      <location id="53" x="33.68291173" y="496.707401974"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:21:48" id="61" prevId="60" user="hvo"/>
+  <action date="2006-09-22 08:21:48" id="62" prevId="61" user="hvo">
+    <delete id="139" objectId="51" parentObjId="9" parentObjType="module" what="location"/>
+    <delete id="140" objectId="9" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 08:21:50" id="63" prevId="62" user="hvo">
+    <change id="141" newObjId="54" oldObjId="53" parentObjId="10" parentObjType="module" what="location">
+      <location id="54" x="35.2457946302" y="496.707401974"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:21:50" id="64" prevId="63" user="hvo"/>
+  <action date="2006-09-22 08:21:50" id="65" prevId="64" user="hvo">
+    <delete id="142" objectId="54" parentObjId="10" parentObjType="module" what="location"/>
+    <delete id="143" objectId="10" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 08:23:39" id="66" prevId="65" user="hvo">
+    <add id="144" objectId="11" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="11" name="vtkDataSetReader"/>
+    </add>
+    <add id="145" objectId="55" parentObjId="11" parentObjType="module" what="location">
+      <location id="55" x="-135.908606931" y="367.981424058"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:23:49" id="67" prevId="66" user="hvo">
+    <change id="146" newObjId="56" oldObjId="55" parentObjId="11" parentObjType="module" what="location">
+      <location id="56" x="-64.4827722752" y="313.870938981"/>
+    </change>
+    <change id="147" newObjId="57" oldObjId="56" parentObjId="11" parentObjType="module" what="location">
+      <location id="57" x="-49.3318371022" y="402.61213466"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:23:49" id="68" prevId="67" user="hvo">
+    <add id="148" objectId="5" parentObjId="11" parentObjType="module" what="function">
+      <function id="5" name="SetFileName" pos="0"/>
+    </add>
+    <add id="149" objectId="28" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="28" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:00" id="69" prevId="68" user="hvo">
+    <change id="150" newObjId="29" oldObjId="28" parentObjId="5" parentObjType="function" what="parameter">
+      <parameter alias="" id="29" name="<no description>" pos="0" type="String" val="../examples/data/torus.vtk"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:24:09" id="70" prevId="69" user="hvo">
+    <add id="151" objectId="12" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="12" name="vtkDataSetMapper"/>
+    </add>
+    <add id="152" objectId="58" parentObjId="12" parentObjType="module" what="location">
+      <location id="58" x="-125.0865102" y="138.552965026"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:11" id="71" prevId="70" user="hvo">
+    <change id="153" newObjId="59" oldObjId="58" parentObjId="12" parentObjType="module" what="location">
+      <location id="59" x="-57.9895100779" y="177.512513976"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:24:11" id="72" prevId="71" user="hvo">
+    <add id="154" objectId="7" parentObjId="" parentObjType="" what="connection">
+      <connection id="7"/>
+    </add>
+    <add id="155" objectId="14" parentObjId="7" parentObjType="connection" what="port">
+      <port id="14" moduleId="11" moduleName="vtkDataSetReader" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="156" objectId="15" parentObjId="7" parentObjType="connection" what="port">
+      <port id="15" moduleId="12" moduleName="vtkDataSetMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:19" id="73" prevId="72" user="hvo">
+    <add id="157" objectId="13" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="13" name="vtkActor"/>
+    </add>
+    <add id="158" objectId="60" parentObjId="13" parentObjType="module" what="location">
+      <location id="60" x="-53.6606717757" y="32.4964132087"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:21" id="74" prevId="73" user="hvo">
+    <add id="159" objectId="8" parentObjId="" parentObjType="" what="connection">
+      <connection id="8"/>
+    </add>
+    <add id="160" objectId="16" parentObjId="8" parentObjType="connection" what="port">
+      <port id="16" moduleId="12" moduleName="vtkDataSetMapper" sig="self(vtkDataSetMapper)" type="source"/>
+    </add>
+    <add id="161" objectId="17" parentObjId="8" parentObjType="connection" what="port">
+      <port id="17" moduleId="13" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:32" id="75" prevId="74" user="hvo">
+    <add id="162" objectId="14" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="14" name="vtkRenderer"/>
+    </add>
+    <add id="163" objectId="61" parentObjId="14" parentObjType="module" what="location">
+      <location id="61" x="9.1074892643" y="-49.751524935"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:35" id="76" prevId="75" user="hvo">
+    <change id="164" newObjId="62" oldObjId="41" parentObjId="7" parentObjType="module" what="location">
+      <location id="62" x="-376.804267199" y="-307.549924835"/>
+    </change>
+    <change id="165" newObjId="63" oldObjId="61" parentObjId="14" parentObjType="module" what="location">
+      <location id="63" x="-198.676766717" y="-127.670622835"/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:24:35" id="77" prevId="76" user="hvo">
+    <add id="166" objectId="9" parentObjId="" parentObjType="" what="connection">
+      <connection id="9"/>
+    </add>
+    <add id="167" objectId="18" parentObjId="9" parentObjType="connection" what="port">
+      <port id="18" moduleId="13" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="168" objectId="19" parentObjId="9" parentObjType="connection" what="port">
+      <port id="19" moduleId="14" moduleName="vtkRenderer" sig="AddVolume(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:36" id="78" prevId="77" user="hvo">
+    <add id="169" objectId="10" parentObjId="" parentObjType="" what="connection">
+      <connection id="10"/>
+    </add>
+    <add id="170" objectId="20" parentObjId="10" parentObjType="connection" what="port">
+      <port id="20" moduleId="14" moduleName="vtkRenderer" sig="self(vtkRenderer)" type="source"/>
+    </add>
+    <add id="171" objectId="21" parentObjId="10" parentObjType="connection" what="port">
+      <port id="21" moduleId="7" moduleName="VTKCell" sig="AddRenderer(vtkRenderer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:24:57" id="79" prevId="78" user="hvo">
+    <add id="172" objectId="6" parentObjId="12" parentObjType="module" what="function">
+      <function id="6" name="ScalarVisibilityOn" pos="0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:25:13" id="80" prevId="79" user="hvo">
+    <add id="173" objectId="7" parentObjId="14" parentObjType="module" what="function">
+      <function id="7" name="SetViewport" pos="0"/>
+    </add>
+    <add id="174" objectId="30" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="30" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="175" objectId="31" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="31" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="176" objectId="32" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="32" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+    <add id="177" objectId="33" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="33" name="<no description>" pos="3" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 08:25:14" id="81" prevId="80" user="hvo">
+    <change id="178" newObjId="34" oldObjId="30" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="34" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="179" newObjId="35" oldObjId="31" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="35" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="180" newObjId="36" oldObjId="32" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="36" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="181" newObjId="37" oldObjId="33" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="37" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:25:15" id="82" prevId="81" user="hvo">
+    <change id="182" newObjId="38" oldObjId="34" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="38" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="183" newObjId="39" oldObjId="35" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="39" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="184" newObjId="40" oldObjId="36" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="40" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="185" newObjId="41" oldObjId="37" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="41" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:25:18" id="83" prevId="82" user="hvo">
+    <change id="186" newObjId="42" oldObjId="38" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="42" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="187" newObjId="43" oldObjId="39" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="43" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="188" newObjId="44" oldObjId="40" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="44" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="189" newObjId="45" oldObjId="41" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="45" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:25:19" id="84" prevId="83" user="hvo">
+    <change id="190" newObjId="46" oldObjId="42" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="46" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="191" newObjId="47" oldObjId="43" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="47" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="192" newObjId="48" oldObjId="44" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="48" name="<no description>" pos="2" type="Float" val="1"/>
+    </change>
+    <change id="193" newObjId="49" oldObjId="45" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="49" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 08:25:22" id="85" prevId="84" user="hvo">
+    <change id="194" newObjId="50" oldObjId="46" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="50" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="195" newObjId="51" oldObjId="47" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="51" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="196" newObjId="52" oldObjId="48" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="52" name="<no description>" pos="2" type="Float" val="1"/>
+    </change>
+    <change id="197" newObjId="53" oldObjId="49" parentObjId="7" parentObjType="function" what="parameter">
+      <parameter alias="" id="53" name="<no description>" pos="3" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:20:53" id="86" prevId="0" user="hvo">
+    <add id="428" objectId="33" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="33" name="vtkQuadric"/>
+    </add>
+    <add id="429" objectId="125" parentObjId="33" parentObjType="module" what="location">
+      <location id="125" x="21.1678829158" y="163.50365329"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:01" id="87" prevId="86" user="hvo">
+    <change id="430" newObjId="126" oldObjId="125" parentObjId="33" parentObjType="module" what="location">
+      <location id="126" x="8.0291967357" y="136.496353867"/>
+    </change>
+    <change id="431" newObjId="127" oldObjId="126" parentObjId="33" parentObjType="module" what="location">
+      <location id="127" x="6.90734946378" y="226.244141342"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:21:01" id="88" prevId="87" user="hvo">
+    <add id="432" objectId="34" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="34" name="vtkSampleFunction"/>
+    </add>
+    <add id="433" objectId="128" parentObjId="34" parentObjType="module" what="location">
+      <location id="128" x="-152.571228424" y="99.8444104635"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:08" id="89" prevId="88" user="hvo">
+    <change id="434" newObjId="129" oldObjId="128" parentObjId="34" parentObjType="module" what="location">
+      <location id="129" x="-33.655418793" y="54.9705167257"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:21:08" id="90" prevId="89" user="hvo">
+    <add id="435" objectId="35" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="35" name="vtkOutlineFilter"/>
+    </add>
+    <add id="436" objectId="130" parentObjId="35" parentObjType="module" what="location">
+      <location id="130" x="-221.003911761" y="-48.2394342689"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:16" id="91" prevId="90" user="hvo">
+    <change id="437" newObjId="131" oldObjId="129" parentObjId="34" parentObjType="module" what="location">
+      <location id="131" x="-10.0966266787" y="121.159504458"/>
+    </change>
+    <change id="438" newObjId="132" oldObjId="130" parentObjId="35" parentObjType="module" what="location">
+      <location id="132" x="-180.617410449" y="14.5840139123"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:21:16" id="92" prevId="91" user="hvo">
+    <add id="439" objectId="36" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="36" name="vtkContourFilter"/>
+    </add>
+    <add id="440" objectId="133" parentObjId="36" parentObjType="module" what="location">
+      <location id="133" x="91.9914759615" y="10.0966257772"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:29" id="93" prevId="92" user="hvo">
+    <change id="441" newObjId="134" oldObjId="133" parentObjId="36" parentObjType="module" what="location">
+      <location id="134" x="163.789701364" y="15.7058624944"/>
+    </change>
+    <change id="442" newObjId="135" oldObjId="134" parentObjId="36" parentObjType="module" what="location">
+      <location id="135" x="166.033395908" y="-6.73108437448"/>
+    </change>
+    <change id="443" newObjId="136" oldObjId="135" parentObjId="36" parentObjType="module" what="location">
+      <location id="136" x="166.033395908" y="14.5840153417"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:21:29" id="94" prevId="93" user="hvo">
+    <add id="444" objectId="37" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="37" name="vtkPolyDataMapper2D"/>
+    </add>
+    <add id="445" objectId="137" parentObjId="37" parentObjType="module" what="location">
+      <location id="137" x="-195.201424601" y="-109.941036241"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:31" id="95" prevId="94" user="hvo"/>
+  <action date="2006-09-22 09:21:32" id="96" prevId="95" user="hvo">
+    <delete id="446" objectId="137" parentObjId="37" parentObjType="module" what="location"/>
+    <delete id="447" objectId="37" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-22 09:21:34" id="97" prevId="96" user="hvo">
+    <add id="448" objectId="38" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="38" name="vtkPolyDataMapper"/>
+    </add>
+    <add id="449" objectId="138" parentObjId="38" parentObjType="module" what="location">
+      <location id="138" x="74.0419196764" y="-134.621677029"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:40" id="98" prevId="97" user="hvo">
+    <change id="450" newObjId="139" oldObjId="138" parentObjId="38" parentObjType="module" what="location">
+      <location id="139" x="131.256130187" y="-122.281356442"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:21:40" id="99" prevId="98" user="hvo">
+    <add id="451" objectId="39" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="39" name="vtkPolyDataMapper"/>
+    </add>
+    <add id="452" objectId="140" parentObjId="39" parentObjType="module" what="location">
+      <location id="140" x="-232.222384439" y="-116.672120092"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:21:56" id="100" prevId="99" user="hvo">
+    <change id="453" newObjId="141" oldObjId="140" parentObjId="39" parentObjType="module" what="location">
+      <location id="141" x="-203.054354654" y="-114.428425548"/>
+    </change>
+    <change id="454" newObjId="142" oldObjId="139" parentObjId="38" parentObjType="module" what="location">
+      <location id="142" x="175.008174864" y="-102.088105786"/>
+    </change>
+    <change id="455" newObjId="143" oldObjId="141" parentObjId="39" parentObjType="module" what="location">
+      <location id="143" x="-186.226645456" y="-111.062883613"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:21:56" id="101" prevId="100" user="hvo">
+    <add id="456" objectId="40" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="40" name="vtkProperty"/>
+    </add>
+    <add id="457" objectId="144" parentObjId="40" parentObjType="module" what="location">
+      <location id="144" x="-185.104799191" y="-232.222392876"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:06" id="102" prevId="101" user="hvo">
+    <add id="458" objectId="41" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="41" name="vtkActor"/>
+    </add>
+    <add id="459" objectId="145" parentObjId="41" parentObjType="module" what="location">
+      <location id="145" x="-38.2185105303" y="-320.08003419"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:14" id="103" prevId="102" user="hvo">
+    <change id="460" newObjId="146" oldObjId="144" parentObjId="40" parentObjType="module" what="location">
+      <location id="146" x="-358.680528561" y="-235.407268841"/>
+    </change>
+    <change id="461" newObjId="147" oldObjId="145" parentObjId="41" parentObjType="module" what="location">
+      <location id="147" x="-85.9916504839" y="-296.193464213"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:22:14" id="104" prevId="103" user="hvo">
+    <add id="462" objectId="42" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="42" name="vtkActor"/>
+    </add>
+    <add id="463" objectId="148" parentObjId="42" parentObjType="module" what="location">
+      <location id="148" x="356.706098989" y="-218.164002224"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:20" id="105" prevId="104" user="hvo">
+    <add id="464" objectId="43" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="43" name="vtkCamera"/>
+    </add>
+    <add id="465" objectId="149" parentObjId="43" parentObjType="module" what="location">
+      <location id="149" x="275.491763967" y="-375.815364171"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:30" id="106" prevId="105" user="hvo">
+    <change id="466" newObjId="150" oldObjId="149" parentObjId="43" parentObjType="module" what="location">
+      <location id="150" x="-65.289943797" y="-394.924620915"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:22:30" id="107" prevId="106" user="hvo">
+    <add id="467" objectId="44" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="44" name="vtkRenderer"/>
+    </add>
+    <add id="468" objectId="151" parentObjId="44" parentObjType="module" what="location">
+      <location id="151" x="146.504290696" y="-340.781728183"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:43" id="108" prevId="107" user="hvo">
+    <change id="469" newObjId="152" oldObjId="151" parentObjId="44" parentObjType="module" what="location">
+      <location id="152" x="183.130362626" y="-331.227099811"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:22:43" id="109" prevId="108" user="hvo">
+    <add id="470" objectId="45" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="45" name="VTKCell"/>
+    </add>
+    <add id="471" objectId="153" parentObjId="45" parentObjType="module" what="location">
+      <location id="153" x="159.243794229" y="-461.807016142"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:46" id="110" prevId="109" user="hvo">
+    <change id="472" newObjId="154" oldObjId="153" parentObjId="45" parentObjType="module" what="location">
+      <location id="154" x="253.197636392" y="-458.622140177"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:22:49" id="111" prevId="110" user="hvo">
+    <add id="473" objectId="25" parentObjId="" parentObjType="" what="connection">
+      <connection id="25"/>
+    </add>
+    <add id="474" objectId="50" parentObjId="25" parentObjType="connection" what="port">
+      <port id="50" moduleId="33" moduleName="vtkQuadric" sig="self(vtkQuadric)" type="source"/>
+    </add>
+    <add id="475" objectId="51" parentObjId="25" parentObjType="connection" what="port">
+      <port id="51" moduleId="34" moduleName="vtkSampleFunction" sig="SetImplicitFunction(vtkImplicitFunction)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:53" id="112" prevId="111" user="hvo">
+    <add id="476" objectId="26" parentObjId="" parentObjType="" what="connection">
+      <connection id="26"/>
+    </add>
+    <add id="477" objectId="52" parentObjId="26" parentObjType="connection" what="port">
+      <port id="52" moduleId="34" moduleName="vtkSampleFunction" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="478" objectId="53" parentObjId="26" parentObjType="connection" what="port">
+      <port id="53" moduleId="35" moduleName="vtkOutlineFilter" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:55" id="113" prevId="112" user="hvo">
+    <add id="479" objectId="27" parentObjId="" parentObjType="" what="connection">
+      <connection id="27"/>
+    </add>
+    <add id="480" objectId="54" parentObjId="27" parentObjType="connection" what="port">
+      <port id="54" moduleId="34" moduleName="vtkSampleFunction" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="481" objectId="55" parentObjId="27" parentObjType="connection" what="port">
+      <port id="55" moduleId="36" moduleName="vtkContourFilter" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:22:59" id="114" prevId="113" user="hvo">
+    <add id="482" objectId="28" parentObjId="" parentObjType="" what="connection">
+      <connection id="28"/>
+    </add>
+    <add id="483" objectId="56" parentObjId="28" parentObjType="connection" what="port">
+      <port id="56" moduleId="35" moduleName="vtkOutlineFilter" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="484" objectId="57" parentObjId="28" parentObjType="connection" what="port">
+      <port id="57" moduleId="39" moduleName="vtkPolyDataMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:03" id="115" prevId="114" user="hvo">
+    <add id="485" objectId="29" parentObjId="" parentObjType="" what="connection">
+      <connection id="29"/>
+    </add>
+    <add id="486" objectId="58" parentObjId="29" parentObjType="connection" what="port">
+      <port id="58" moduleId="36" moduleName="vtkContourFilter" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="487" objectId="59" parentObjId="29" parentObjType="connection" what="port">
+      <port id="59" moduleId="38" moduleName="vtkPolyDataMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:07" id="116" prevId="115" user="hvo">
+    <add id="488" objectId="30" parentObjId="" parentObjType="" what="connection">
+      <connection id="30"/>
+    </add>
+    <add id="489" objectId="60" parentObjId="30" parentObjType="connection" what="port">
+      <port id="60" moduleId="38" moduleName="vtkPolyDataMapper" sig="self(vtkPolyDataMapper)" type="source"/>
+    </add>
+    <add id="490" objectId="61" parentObjId="30" parentObjType="connection" what="port">
+      <port id="61" moduleId="42" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:10" id="117" prevId="116" user="hvo">
+    <add id="491" objectId="31" parentObjId="" parentObjType="" what="connection">
+      <connection id="31"/>
+    </add>
+    <add id="492" objectId="62" parentObjId="31" parentObjType="connection" what="port">
+      <port id="62" moduleId="39" moduleName="vtkPolyDataMapper" sig="self(vtkPolyDataMapper)" type="source"/>
+    </add>
+    <add id="493" objectId="63" parentObjId="31" parentObjType="connection" what="port">
+      <port id="63" moduleId="41" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:15" id="118" prevId="117" user="hvo">
+    <add id="494" objectId="32" parentObjId="" parentObjType="" what="connection">
+      <connection id="32"/>
+    </add>
+    <add id="495" objectId="64" parentObjId="32" parentObjType="connection" what="port">
+      <port id="64" moduleId="40" moduleName="vtkProperty" sig="self(vtkProperty)" type="source"/>
+    </add>
+    <add id="496" objectId="65" parentObjId="32" parentObjType="connection" what="port">
+      <port id="65" moduleId="41" moduleName="vtkActor" sig="SetProperty(vtkProperty)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:31" id="119" prevId="118" user="hvo">
+    <add id="497" objectId="33" parentObjId="" parentObjType="" what="connection">
+      <connection id="33"/>
+    </add>
+    <add id="498" objectId="66" parentObjId="33" parentObjType="connection" what="port">
+      <port id="66" moduleId="43" moduleName="vtkCamera" sig="self(vtkCamera)" type="source"/>
+    </add>
+    <add id="499" objectId="67" parentObjId="33" parentObjType="connection" what="port">
+      <port id="67" moduleId="44" moduleName="vtkRenderer" sig="SetActiveCamera(vtkCamera)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:40" id="120" prevId="119" user="hvo">
+    <change id="500" newObjId="155" oldObjId="152" parentObjId="44" parentObjType="module" what="location">
+      <location id="155" x="186.315238591" y="-316.895158206"/>
+    </change>
+    <change id="501" newObjId="156" oldObjId="150" parentObjId="43" parentObjType="module" what="location">
+      <location id="156" x="70.067279714" y="-192.684996892"/>
+    </change>
+    <change id="502" newObjId="157" oldObjId="155" parentObjId="44" parentObjType="module" what="location">
+      <location id="157" x="116.247970219" y="-391.73974744"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:23:40" id="121" prevId="120" user="hvo">
+    <add id="503" objectId="34" parentObjId="" parentObjType="" what="connection">
+      <connection id="34"/>
+    </add>
+    <add id="504" objectId="68" parentObjId="34" parentObjType="connection" what="port">
+      <port id="68" moduleId="41" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="505" objectId="69" parentObjId="34" parentObjType="connection" what="port">
+      <port id="69" moduleId="44" moduleName="vtkRenderer" sig="AddVolume(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:54" id="122" prevId="121" user="hvo">
+    <add id="506" objectId="35" parentObjId="" parentObjType="" what="connection">
+      <connection id="35"/>
+    </add>
+    <add id="507" objectId="70" parentObjId="35" parentObjType="connection" what="port">
+      <port id="70" moduleId="42" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="508" objectId="71" parentObjId="35" parentObjType="connection" what="port">
+      <port id="71" moduleId="44" moduleName="vtkViewport" sig="AddActor2D(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:23:57" id="123" prevId="122" user="hvo">
+    <delete id="509" objectId="68" parentObjId="34" parentObjType="connection" what="port"/>
+    <delete id="510" objectId="69" parentObjId="34" parentObjType="connection" what="port"/>
+    <delete id="511" objectId="34" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-09-22 09:23:59" id="124" prevId="123" user="hvo">
+    <add id="512" objectId="36" parentObjId="" parentObjType="" what="connection">
+      <connection id="36"/>
+    </add>
+    <add id="513" objectId="72" parentObjId="36" parentObjType="connection" what="port">
+      <port id="72" moduleId="41" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="514" objectId="73" parentObjId="36" parentObjType="connection" what="port">
+      <port id="73" moduleId="44" moduleName="vtkViewport" sig="AddProp(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:01" id="125" prevId="124" user="hvo">
+    <change id="515" newObjId="158" oldObjId="157" parentObjId="44" parentObjType="module" what="location">
+      <location id="158" x="111.47065651" y="-394.924623405"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:01" id="126" prevId="125" user="hvo">
+    <delete id="516" objectId="72" parentObjId="36" parentObjType="connection" what="port"/>
+    <delete id="517" objectId="73" parentObjId="36" parentObjType="connection" what="port"/>
+    <delete id="518" objectId="36" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-09-22 09:24:04" id="127" prevId="126" user="hvo">
+    <add id="519" objectId="37" parentObjId="" parentObjType="" what="connection">
+      <connection id="37"/>
+    </add>
+    <add id="520" objectId="74" parentObjId="37" parentObjType="connection" what="port">
+      <port id="74" moduleId="41" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="521" objectId="75" parentObjId="37" parentObjType="connection" what="port">
+      <port id="75" moduleId="44" moduleName="vtkViewport" sig="AddActor2D(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:11" id="128" prevId="127" user="hvo">
+    <delete id="522" objectId="74" parentObjId="37" parentObjType="connection" what="port"/>
+    <delete id="523" objectId="75" parentObjId="37" parentObjType="connection" what="port"/>
+    <delete id="524" objectId="37" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-09-22 09:24:12" id="129" prevId="128" user="hvo">
+    <delete id="525" objectId="70" parentObjId="35" parentObjType="connection" what="port"/>
+    <delete id="526" objectId="71" parentObjId="35" parentObjType="connection" what="port"/>
+    <delete id="527" objectId="35" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-09-22 09:24:15" id="130" prevId="129" user="hvo">
+    <add id="528" objectId="38" parentObjId="" parentObjType="" what="connection">
+      <connection id="38"/>
+    </add>
+    <add id="529" objectId="76" parentObjId="38" parentObjType="connection" what="port">
+      <port id="76" moduleId="42" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="530" objectId="77" parentObjId="38" parentObjType="connection" what="port">
+      <port id="77" moduleId="44" moduleName="vtkViewport" sig="AddProp(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:17" id="131" prevId="130" user="hvo">
+    <add id="531" objectId="39" parentObjId="" parentObjType="" what="connection">
+      <connection id="39"/>
+    </add>
+    <add id="532" objectId="78" parentObjId="39" parentObjType="connection" what="port">
+      <port id="78" moduleId="41" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="533" objectId="79" parentObjId="39" parentObjType="connection" what="port">
+      <port id="79" moduleId="44" moduleName="vtkViewport" sig="AddProp(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:22" id="132" prevId="131" user="hvo">
+    <change id="534" newObjId="159" oldObjId="154" parentObjId="45" parentObjType="module" what="location">
+      <location id="159" x="329.63465574" y="-476.13895727"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:22" id="133" prevId="132" user="hvo">
+    <add id="535" objectId="40" parentObjId="" parentObjType="" what="connection">
+      <connection id="40"/>
+    </add>
+    <add id="536" objectId="80" parentObjId="40" parentObjType="connection" what="port">
+      <port id="80" moduleId="44" moduleName="vtkRenderer" sig="self(vtkRenderer)" type="source"/>
+    </add>
+    <add id="537" objectId="81" parentObjId="40" parentObjType="connection" what="port">
+      <port id="81" moduleId="45" moduleName="VTKCell" sig="AddRenderer(vtkRenderer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:35" id="134" prevId="133" user="hvo">
+    <add id="538" objectId="21" parentObjId="33" parentObjType="module" what="function">
+      <function id="21" name="SetCoefficients" pos="0"/>
+    </add>
+    <add id="539" objectId="121" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="121" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="540" objectId="122" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="122" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="541" objectId="123" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="123" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+    <add id="542" objectId="124" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="124" name="<no description>" pos="3" type="Float" val="0.0"/>
+    </add>
+    <add id="543" objectId="125" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="125" name="<no description>" pos="4" type="Float" val="0.0"/>
+    </add>
+    <add id="544" objectId="126" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="126" name="<no description>" pos="5" type="Float" val="0.0"/>
+    </add>
+    <add id="545" objectId="127" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="127" name="<no description>" pos="6" type="Float" val="0.0"/>
+    </add>
+    <add id="546" objectId="128" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="128" name="<no description>" pos="7" type="Float" val="0.0"/>
+    </add>
+    <add id="547" objectId="129" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="129" name="<no description>" pos="8" type="Float" val="0.0"/>
+    </add>
+    <add id="548" objectId="130" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="130" name="<no description>" pos="9" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:39" id="135" prevId="134" user="hvo">
+    <change id="549" newObjId="131" oldObjId="121" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="131" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="550" newObjId="132" oldObjId="122" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="132" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="551" newObjId="133" oldObjId="123" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="133" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="552" newObjId="134" oldObjId="124" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="134" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="553" newObjId="135" oldObjId="125" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="135" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="554" newObjId="136" oldObjId="126" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="136" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+    <change id="555" newObjId="137" oldObjId="127" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="137" name="<no description>" pos="6" type="Float" val=""/>
+    </change>
+    <change id="556" newObjId="138" oldObjId="128" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="138" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="557" newObjId="139" oldObjId="129" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="139" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="558" newObjId="140" oldObjId="130" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="140" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:41" id="136" prevId="135" user="hvo">
+    <change id="559" newObjId="141" oldObjId="131" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="141" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="560" newObjId="142" oldObjId="132" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="142" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="561" newObjId="143" oldObjId="133" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="143" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="562" newObjId="144" oldObjId="134" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="144" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="563" newObjId="145" oldObjId="135" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="145" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="564" newObjId="146" oldObjId="136" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="146" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+    <change id="565" newObjId="147" oldObjId="137" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="147" name="<no description>" pos="6" type="Float" val=""/>
+    </change>
+    <change id="566" newObjId="148" oldObjId="138" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="148" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="567" newObjId="149" oldObjId="139" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="149" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="568" newObjId="150" oldObjId="140" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="150" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:42" id="137" prevId="136" user="hvo">
+    <change id="569" newObjId="151" oldObjId="141" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="151" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="570" newObjId="152" oldObjId="142" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="152" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="571" newObjId="153" oldObjId="143" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="153" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="572" newObjId="154" oldObjId="144" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="154" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="573" newObjId="155" oldObjId="145" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="155" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="574" newObjId="156" oldObjId="146" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="156" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+    <change id="575" newObjId="157" oldObjId="147" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="157" name="<no description>" pos="6" type="Float" val=""/>
+    </change>
+    <change id="576" newObjId="158" oldObjId="148" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="158" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="577" newObjId="159" oldObjId="149" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="159" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="578" newObjId="160" oldObjId="150" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="160" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:42" id="138" prevId="137" user="hvo">
+    <change id="579" newObjId="161" oldObjId="151" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="161" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="580" newObjId="162" oldObjId="152" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="162" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="581" newObjId="163" oldObjId="153" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="163" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="582" newObjId="164" oldObjId="154" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="164" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="583" newObjId="165" oldObjId="155" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="165" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="584" newObjId="166" oldObjId="156" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="166" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+    <change id="585" newObjId="167" oldObjId="157" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="167" name="<no description>" pos="6" type="Float" val=""/>
+    </change>
+    <change id="586" newObjId="168" oldObjId="158" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="168" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="587" newObjId="169" oldObjId="159" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="169" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="588" newObjId="170" oldObjId="160" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="170" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:43" id="139" prevId="138" user="hvo">
+    <change id="589" newObjId="171" oldObjId="161" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="171" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="590" newObjId="172" oldObjId="162" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="172" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="591" newObjId="173" oldObjId="163" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="173" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="592" newObjId="174" oldObjId="164" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="174" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="593" newObjId="175" oldObjId="165" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="175" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </change>
+    <change id="594" newObjId="176" oldObjId="166" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="176" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+    <change id="595" newObjId="177" oldObjId="167" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="177" name="<no description>" pos="6" type="Float" val=""/>
+    </change>
+    <change id="596" newObjId="178" oldObjId="168" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="178" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="597" newObjId="179" oldObjId="169" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="179" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="598" newObjId="180" oldObjId="170" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="180" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:45" id="140" prevId="139" user="hvo">
+    <change id="599" newObjId="181" oldObjId="171" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="181" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="600" newObjId="182" oldObjId="172" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="182" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="601" newObjId="183" oldObjId="173" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="183" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="602" newObjId="184" oldObjId="174" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="184" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="603" newObjId="185" oldObjId="175" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="185" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </change>
+    <change id="604" newObjId="186" oldObjId="176" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="186" name="<no description>" pos="5" type="Float" val="0"/>
+    </change>
+    <change id="605" newObjId="187" oldObjId="177" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="187" name="<no description>" pos="6" type="Float" val=""/>
+    </change>
+    <change id="606" newObjId="188" oldObjId="178" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="188" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="607" newObjId="189" oldObjId="179" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="189" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="608" newObjId="190" oldObjId="180" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="190" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:46" id="141" prevId="140" user="hvo">
+    <change id="609" newObjId="191" oldObjId="181" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="191" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="610" newObjId="192" oldObjId="182" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="192" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="611" newObjId="193" oldObjId="183" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="193" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="612" newObjId="194" oldObjId="184" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="194" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="613" newObjId="195" oldObjId="185" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="195" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </change>
+    <change id="614" newObjId="196" oldObjId="186" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="196" name="<no description>" pos="5" type="Float" val="0"/>
+    </change>
+    <change id="615" newObjId="197" oldObjId="187" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="197" name="<no description>" pos="6" type="Float" val="0"/>
+    </change>
+    <change id="616" newObjId="198" oldObjId="188" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="198" name="<no description>" pos="7" type="Float" val=""/>
+    </change>
+    <change id="617" newObjId="199" oldObjId="189" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="199" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="618" newObjId="200" oldObjId="190" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="200" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:47" id="142" prevId="141" user="hvo">
+    <change id="619" newObjId="201" oldObjId="191" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="201" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="620" newObjId="202" oldObjId="192" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="202" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="621" newObjId="203" oldObjId="193" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="203" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="622" newObjId="204" oldObjId="194" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="204" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="623" newObjId="205" oldObjId="195" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="205" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </change>
+    <change id="624" newObjId="206" oldObjId="196" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="206" name="<no description>" pos="5" type="Float" val="0"/>
+    </change>
+    <change id="625" newObjId="207" oldObjId="197" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="207" name="<no description>" pos="6" type="Float" val="0"/>
+    </change>
+    <change id="626" newObjId="208" oldObjId="198" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="208" name="<no description>" pos="7" type="Float" val="0.2"/>
+    </change>
+    <change id="627" newObjId="209" oldObjId="199" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="209" name="<no description>" pos="8" type="Float" val=""/>
+    </change>
+    <change id="628" newObjId="210" oldObjId="200" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="210" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:47" id="143" prevId="142" user="hvo">
+    <change id="629" newObjId="211" oldObjId="201" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="211" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="630" newObjId="212" oldObjId="202" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="212" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="631" newObjId="213" oldObjId="203" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="213" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="632" newObjId="214" oldObjId="204" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="214" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="633" newObjId="215" oldObjId="205" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="215" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </change>
+    <change id="634" newObjId="216" oldObjId="206" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="216" name="<no description>" pos="5" type="Float" val="0"/>
+    </change>
+    <change id="635" newObjId="217" oldObjId="207" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="217" name="<no description>" pos="6" type="Float" val="0"/>
+    </change>
+    <change id="636" newObjId="218" oldObjId="208" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="218" name="<no description>" pos="7" type="Float" val="0.2"/>
+    </change>
+    <change id="637" newObjId="219" oldObjId="209" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="219" name="<no description>" pos="8" type="Float" val="0"/>
+    </change>
+    <change id="638" newObjId="220" oldObjId="210" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="220" name="<no description>" pos="9" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:48" id="144" prevId="143" user="hvo">
+    <change id="639" newObjId="221" oldObjId="211" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="221" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </change>
+    <change id="640" newObjId="222" oldObjId="212" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="222" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="641" newObjId="223" oldObjId="213" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="223" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </change>
+    <change id="642" newObjId="224" oldObjId="214" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="224" name="<no description>" pos="3" type="Float" val="0"/>
+    </change>
+    <change id="643" newObjId="225" oldObjId="215" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="225" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </change>
+    <change id="644" newObjId="226" oldObjId="216" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="226" name="<no description>" pos="5" type="Float" val="0"/>
+    </change>
+    <change id="645" newObjId="227" oldObjId="217" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="227" name="<no description>" pos="6" type="Float" val="0"/>
+    </change>
+    <change id="646" newObjId="228" oldObjId="218" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="228" name="<no description>" pos="7" type="Float" val="0.2"/>
+    </change>
+    <change id="647" newObjId="229" oldObjId="219" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="229" name="<no description>" pos="8" type="Float" val="0"/>
+    </change>
+    <change id="648" newObjId="230" oldObjId="220" parentObjId="21" parentObjType="function" what="parameter">
+      <parameter alias="" id="230" name="<no description>" pos="9" type="Float" val="0"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:24:57" id="145" prevId="144" user="hvo">
+    <add id="649" objectId="22" parentObjId="34" parentObjType="module" what="function">
+      <function id="22" name="SetSampleDimensions" pos="0"/>
+    </add>
+    <add id="650" objectId="231" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="231" name="<no description>" pos="0" type="Integer" val="0"/>
+    </add>
+    <add id="651" objectId="232" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="232" name="<no description>" pos="1" type="Integer" val="0"/>
+    </add>
+    <add id="652" objectId="233" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="233" name="<no description>" pos="2" type="Integer" val="0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:24:58" id="146" prevId="145" user="hvo">
+    <change id="653" newObjId="234" oldObjId="231" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="234" name="<no description>" pos="0" type="Integer" val=""/>
+    </change>
+    <change id="654" newObjId="235" oldObjId="232" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="235" name="<no description>" pos="1" type="Integer" val=""/>
+    </change>
+    <change id="655" newObjId="236" oldObjId="233" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="236" name="<no description>" pos="2" type="Integer" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:25:00" id="147" prevId="146" user="hvo">
+    <change id="656" newObjId="237" oldObjId="234" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="237" name="<no description>" pos="0" type="Integer" val="50"/>
+    </change>
+    <change id="657" newObjId="238" oldObjId="235" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="238" name="<no description>" pos="1" type="Integer" val=""/>
+    </change>
+    <change id="658" newObjId="239" oldObjId="236" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="239" name="<no description>" pos="2" type="Integer" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:25:01" id="148" prevId="147" user="hvo">
+    <change id="659" newObjId="240" oldObjId="237" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="240" name="<no description>" pos="0" type="Integer" val="50"/>
+    </change>
+    <change id="660" newObjId="241" oldObjId="238" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="241" name="<no description>" pos="1" type="Integer" val="50"/>
+    </change>
+    <change id="661" newObjId="242" oldObjId="239" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="242" name="<no description>" pos="2" type="Integer" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:25:02" id="149" prevId="148" user="hvo">
+    <change id="662" newObjId="243" oldObjId="240" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="243" name="<no description>" pos="0" type="Integer" val="50"/>
+    </change>
+    <change id="663" newObjId="244" oldObjId="241" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="244" name="<no description>" pos="1" type="Integer" val="50"/>
+    </change>
+    <change id="664" newObjId="245" oldObjId="242" parentObjId="22" parentObjType="function" what="parameter">
+      <parameter alias="" id="245" name="<no description>" pos="2" type="Integer" val="50"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:31:15" id="150" prevId="149" user="hvo">
+    <add id="665" objectId="23" parentObjId="36" parentObjType="module" what="function">
+      <function id="23" name="GenerateValues" pos="0"/>
+    </add>
+    <add id="666" objectId="246" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="246" name="<no description>" pos="0" type="Integer" val="0"/>
+    </add>
+    <add id="667" objectId="247" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="247" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="668" objectId="248" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="248" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:31:18" id="151" prevId="150" user="hvo">
+    <change id="669" newObjId="249" oldObjId="246" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="249" name="<no description>" pos="0" type="Integer" val="5"/>
+    </change>
+    <change id="670" newObjId="250" oldObjId="247" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="250" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="671" newObjId="251" oldObjId="248" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="251" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:31:19" id="152" prevId="151" user="hvo">
+    <change id="672" newObjId="252" oldObjId="249" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="252" name="<no description>" pos="0" type="Integer" val="5"/>
+    </change>
+    <change id="673" newObjId="253" oldObjId="250" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="253" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="674" newObjId="254" oldObjId="251" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="254" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:31:21" id="153" prevId="152" user="hvo">
+    <change id="675" newObjId="255" oldObjId="252" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="255" name="<no description>" pos="0" type="Integer" val="5"/>
+    </change>
+    <change id="676" newObjId="256" oldObjId="253" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="256" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="677" newObjId="257" oldObjId="254" parentObjId="23" parentObjType="function" what="parameter">
+      <parameter alias="" id="257" name="<no description>" pos="2" type="Float" val="1.2"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:31:34" id="154" prevId="153" user="hvo">
+    <add id="678" objectId="24" parentObjId="38" parentObjType="module" what="function">
+      <function id="24" name="SetScalarRange" pos="0"/>
+    </add>
+    <add id="679" objectId="258" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="258" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="680" objectId="259" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="259" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:31:36" id="155" prevId="154" user="hvo">
+    <change id="681" newObjId="260" oldObjId="258" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="260" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="682" newObjId="261" oldObjId="259" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="261" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:31:39" id="156" prevId="155" user="hvo">
+    <change id="683" newObjId="262" oldObjId="260" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="262" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="684" newObjId="263" oldObjId="261" parentObjId="24" parentObjType="function" what="parameter">
+      <parameter alias="" id="263" name="<no description>" pos="1" type="Float" val="1.2"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:31:58" id="157" prevId="156" user="hvo">
+    <add id="685" objectId="25" parentObjId="40" parentObjType="module" what="function">
+      <function id="25" name="SetColor" pos="0"/>
+    </add>
+    <add id="686" objectId="264" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="264" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="687" objectId="265" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="265" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="688" objectId="266" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="266" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:31:59" id="158" prevId="157" user="hvo">
+    <change id="689" newObjId="267" oldObjId="264" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="267" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="690" newObjId="268" oldObjId="265" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="268" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="691" newObjId="269" oldObjId="266" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="269" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:32:00" id="159" prevId="158" user="hvo">
+    <change id="692" newObjId="270" oldObjId="267" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="270" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="693" newObjId="271" oldObjId="268" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="271" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="694" newObjId="272" oldObjId="269" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="272" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:32:00" id="160" prevId="159" user="hvo">
+    <change id="695" newObjId="273" oldObjId="270" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="273" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="696" newObjId="274" oldObjId="271" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="274" name="<no description>" pos="1" type="Float" val="0"/>
+    </change>
+    <change id="697" newObjId="275" oldObjId="272" parentObjId="25" parentObjType="function" what="parameter">
+      <parameter alias="" id="275" name="<no description>" pos="2" type="Float" val="0"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:32:21" id="161" prevId="160" user="hvo">
+    <change id="698" newObjId="160" oldObjId="158" parentObjId="44" parentObjType="module" what="location">
+      <location id="160" x="111.47065651" y="-396.486531531"/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:32:21" id="162" prevId="161" user="hvo">
+    <add id="699" objectId="26" parentObjId="44" parentObjType="module" what="function">
+      <function id="26" name="SetBackground" pos="0"/>
+    </add>
+    <add id="700" objectId="276" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="276" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="701" objectId="277" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="277" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="702" objectId="278" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="278" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-22 09:32:23" id="163" prevId="162" user="hvo">
+    <change id="703" newObjId="279" oldObjId="276" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="279" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="704" newObjId="280" oldObjId="277" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="280" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="705" newObjId="281" oldObjId="278" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="281" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:32:24" id="164" prevId="163" user="hvo">
+    <change id="706" newObjId="282" oldObjId="279" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="282" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="707" newObjId="283" oldObjId="280" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="283" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="708" newObjId="284" oldObjId="281" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="284" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-22 09:32:24" id="165" prevId="164" user="hvo">
+    <change id="709" newObjId="285" oldObjId="282" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="285" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="710" newObjId="286" oldObjId="283" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="286" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="711" newObjId="287" oldObjId="284" parentObjId="26" parentObjType="function" what="parameter">
+      <parameter alias="" id="287" name="<no description>" pos="2" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2006-09-22 13:34:24" id="166" prevId="43" user="hvo">
+    <delete id="232" objectId="1" parentObjId="1" parentObjType="function" what="parameter"/>
+    <delete id="233" objectId="1" parentObjId="0" parentObjType="module" what="function"/>
+  </action>
+  <action date="2006-09-22 13:35:05" id="167" prevId="166" user="hvo">
+    <change id="234" newObjId="72" oldObjId="27" parentObjId="0" parentObjType="module" what="location">
+      <location id="72" x="-267.821971558" y="414.087550892"/>
+    </change>
+    <change id="235" newObjId="73" oldObjId="72" parentObjId="0" parentObjType="module" what="location">
+      <location id="73" x="-391.396762513" y="406.364126458"/>
+    </change>
+    <change id="236" newObjId="74" oldObjId="26" parentObjId="1" parentObjType="module" what="location">
+      <location id="74" x="-149.686186031" y="220.380932414"/>
+    </change>
+    <change id="237" newObjId="75" oldObjId="73" parentObjId="0" parentObjType="module" what="location">
+      <location id="75" x="-362.609452867" y="451.300413384"/>
+    </change>
+    <change id="238" newObjId="76" oldObjId="75" parentObjId="0" parentObjType="module" what="location">
+      <location id="76" x="-279.056047105" y="372.661909356"/>
+    </change>
+  </action>
+  <action date="2006-09-22 13:35:05" id="168" prevId="167" user="hvo">
+    <add id="239" objectId="18" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="18" name="String"/>
+    </add>
+    <add id="240" objectId="77" parentObjId="18" parentObjType="module" what="location">
+      <location id="77" x="-288.555049783" y="457.174066849"/>
+    </add>
+  </action>
+  <action date="2006-09-22 13:35:08" id="169" prevId="168" user="hvo">
+    <change id="241" newObjId="78" oldObjId="77" parentObjId="18" parentObjType="module" what="location">
+      <location id="78" x="-312.019206887" y="521.93514473"/>
+    </change>
+  </action>
+  <action date="2006-09-22 13:35:16" id="171" prevId="169" user="hvo">
+    <add id="242" objectId="10" parentObjId="18" parentObjType="module" what="function">
+      <function id="10" name="value" pos="0"/>
+    </add>
+    <add id="243" objectId="59" parentObjId="10" parentObjType="function" what="parameter">
+      <parameter alias="" id="59" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-09-22 13:35:37" id="172" prevId="171" user="hvo">
+    <change id="244" newObjId="60" oldObjId="59" parentObjId="10" parentObjType="function" what="parameter">
+      <parameter alias="" id="60" name="<no description>" pos="0" type="String" val="../examples/data/spx.vtk"/>
+    </change>
+  </action>
+  <action date="2006-09-22 13:36:36" id="173" prevId="172" user="hvo">
+    <change id="245" newObjId="79" oldObjId="78" parentObjId="18" parentObjType="module" what="location">
+      <location id="79" x="-478.14544285" y="490.962456055"/>
+    </change>
+    <change id="246" newObjId="80" oldObjId="76" parentObjId="0" parentObjType="module" what="location">
+      <location id="80" x="-151.411027574" y="371.723343028"/>
+    </change>
+    <change id="247" newObjId="81" oldObjId="80" parentObjId="0" parentObjType="module" what="location">
+      <location id="81" x="-159.858124399" y="367.96907772"/>
+    </change>
+    <change id="248" newObjId="82" oldObjId="81" parentObjId="0" parentObjType="module" what="location">
+      <location id="82" x="-222.742066049" y="336.057822837"/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:38:26" id="174" prevId="173" user="hvo">
+    <change id="249" newObjId="83" oldObjId="82" parentObjId="0" parentObjType="module" what="location">
+      <location id="83" x="-132.79472413" y="381.031497611"/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:38:26" id="176" prevId="174" user="hvo">
+    <delete id="250" objectId="79" parentObjId="18" parentObjType="module" what="location"/>
+    <delete id="251" objectId="60" parentObjId="10" parentObjType="function" what="parameter"/>
+    <delete id="252" objectId="10" parentObjId="18" parentObjType="module" what="function"/>
+    <delete id="253" objectId="18" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-09-25 05:39:14" id="177" prevId="176" user="hvo">
+    <change id="254" newObjId="84" oldObjId="83" parentObjId="0" parentObjType="module" what="location">
+      <location id="84" x="-546.124191903" y="404.58913578"/>
+    </change>
+    <change id="255" newObjId="85" oldObjId="84" parentObjId="0" parentObjType="module" what="location">
+      <location id="85" x="-68.5466162191" y="402.44753231"/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:39:14" id="178" prevId="177" user="hvo">
+    <add id="256" objectId="19" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="19" name="String"/>
+    </add>
+    <add id="257" objectId="86" parentObjId="19" parentObjType="module" what="location">
+      <location id="86" x="-391.049311314" y="549.034618216"/>
+    </add>
+  </action>
+  <action date="2006-09-25 05:39:16" id="179" prevId="178" user="hvo">
+    <add id="258" objectId="14" parentObjId="" parentObjType="" what="connection">
+      <connection id="14"/>
+    </add>
+    <add id="259" objectId="28" parentObjId="14" parentObjType="connection" what="port">
+      <port id="28" moduleId="19" moduleName="String" sig="value(String)" type="source"/>
+    </add>
+    <add id="260" objectId="29" parentObjId="14" parentObjType="connection" what="port">
+      <port id="29" moduleId="0" moduleName="vtkDataReader" sig="SetFileName(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-09-25 05:39:20" id="180" prevId="179" user="hvo">
+    <add id="261" objectId="11" parentObjId="19" parentObjType="module" what="function">
+      <function id="11" name="value" pos="0"/>
+    </add>
+    <add id="262" objectId="61" parentObjId="11" parentObjType="function" what="parameter">
+      <parameter alias="" id="61" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-09-25 05:39:28" id="181" prevId="180" user="hvo">
+    <change id="263" newObjId="62" oldObjId="61" parentObjId="11" parentObjType="function" what="parameter">
+      <parameter alias="" id="62" name="<no description>" pos="0" type="String" val="../examples/data/torus.vtk"/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:40:31" id="182" prevId="181" user="hvo">
+    <change id="264" newObjId="87" oldObjId="85" parentObjId="0" parentObjType="module" what="location">
+      <location id="87" x="-68.5466162191" y="401.526861979"/>
+    </change>
+    <change id="265" newObjId="88" oldObjId="87" parentObjId="0" parentObjType="module" what="location">
+      <location id="88" x="-180.53186097" y="393.292652919"/>
+    </change>
+    <change id="266" newObjId="89" oldObjId="88" parentObjId="0" parentObjType="module" what="location">
+      <location id="89" x="-218.409222268" y="406.467387988"/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:42:21" id="183" prevId="182" user="hvo">
+    <change id="267" newObjId="90" oldObjId="89" parentObjId="0" parentObjType="module" what="location">
+      <location id="90" x="-217.328838609" y="406.467387988"/>
+    </change>
+    <change id="268" newObjId="91" oldObjId="86" parentObjId="19" parentObjType="module" what="location">
+      <location id="91" x="-389.148638401" y="551.568848925"/>
+    </change>
+    <change id="269" newObjId="92" oldObjId="74" parentObjId="1" parentObjType="module" what="location">
+      <location id="92" x="-440.025968746" y="265.332016551"/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:48:48" id="184" prevId="183" user="hvo">
+    <add id="270" objectId="12" parentObjId="3" parentObjType="module" what="function">
+      <function id="12" name="ResetCamera" pos="0"/>
+    </add>
+  </action>
+  <action date="2006-09-25 05:48:49" id="185" prevId="184" user="hvo">
+    <add id="271" objectId="13" parentObjId="3" parentObjType="module" what="function">
+      <function id="13" name="ResetCamera" pos="1"/>
+    </add>
+    <add id="272" objectId="63" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="63" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="273" objectId="64" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="64" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="274" objectId="65" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="65" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+    <add id="275" objectId="66" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="66" name="<no description>" pos="3" type="Float" val="0.0"/>
+    </add>
+    <add id="276" objectId="67" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="67" name="<no description>" pos="4" type="Float" val="0.0"/>
+    </add>
+    <add id="277" objectId="68" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="68" name="<no description>" pos="5" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2006-09-25 05:48:51" id="186" prevId="185" user="hvo">
+    <change id="278" newObjId="69" oldObjId="63" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="69" name="<no description>" pos="0" type="Float" val=""/>
+    </change>
+    <change id="279" newObjId="70" oldObjId="64" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="70" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="280" newObjId="71" oldObjId="65" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="71" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="281" newObjId="72" oldObjId="66" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="72" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="282" newObjId="73" oldObjId="67" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="73" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="283" newObjId="74" oldObjId="68" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="74" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:54:51" id="187" prevId="186" user="hvo">
+    <change id="284" newObjId="75" oldObjId="69" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="75" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="285" newObjId="76" oldObjId="70" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="76" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="286" newObjId="77" oldObjId="71" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="77" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="287" newObjId="78" oldObjId="72" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="78" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="288" newObjId="79" oldObjId="73" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="79" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="289" newObjId="80" oldObjId="74" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="80" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:54:51" id="188" prevId="187" user="hvo">
+    <change id="290" newObjId="81" oldObjId="75" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="81" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="291" newObjId="82" oldObjId="76" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="82" name="<no description>" pos="1" type="Float" val="2"/>
+    </change>
+    <change id="292" newObjId="83" oldObjId="77" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="83" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+    <change id="293" newObjId="84" oldObjId="78" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="84" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="294" newObjId="85" oldObjId="79" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="85" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="295" newObjId="86" oldObjId="80" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="86" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:54:52" id="189" prevId="188" user="hvo">
+    <change id="296" newObjId="87" oldObjId="81" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="87" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="297" newObjId="88" oldObjId="82" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="88" name="<no description>" pos="1" type="Float" val="2"/>
+    </change>
+    <change id="298" newObjId="89" oldObjId="83" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="89" name="<no description>" pos="2" type="Float" val="3"/>
+    </change>
+    <change id="299" newObjId="90" oldObjId="84" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="90" name="<no description>" pos="3" type="Float" val=""/>
+    </change>
+    <change id="300" newObjId="91" oldObjId="85" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="91" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="301" newObjId="92" oldObjId="86" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="92" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:54:52" id="190" prevId="189" user="hvo">
+    <change id="302" newObjId="93" oldObjId="87" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="93" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="303" newObjId="94" oldObjId="88" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="94" name="<no description>" pos="1" type="Float" val="2"/>
+    </change>
+    <change id="304" newObjId="95" oldObjId="89" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="95" name="<no description>" pos="2" type="Float" val="3"/>
+    </change>
+    <change id="305" newObjId="96" oldObjId="90" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="96" name="<no description>" pos="3" type="Float" val="4"/>
+    </change>
+    <change id="306" newObjId="97" oldObjId="91" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="97" name="<no description>" pos="4" type="Float" val=""/>
+    </change>
+    <change id="307" newObjId="98" oldObjId="92" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="98" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:54:53" id="191" prevId="190" user="hvo">
+    <change id="308" newObjId="99" oldObjId="93" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="99" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="309" newObjId="100" oldObjId="94" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="100" name="<no description>" pos="1" type="Float" val="2"/>
+    </change>
+    <change id="310" newObjId="101" oldObjId="95" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="101" name="<no description>" pos="2" type="Float" val="3"/>
+    </change>
+    <change id="311" newObjId="102" oldObjId="96" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="102" name="<no description>" pos="3" type="Float" val="4"/>
+    </change>
+    <change id="312" newObjId="103" oldObjId="97" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="103" name="<no description>" pos="4" type="Float" val="5"/>
+    </change>
+    <change id="313" newObjId="104" oldObjId="98" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="104" name="<no description>" pos="5" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2006-09-25 05:54:55" id="192" prevId="191" user="hvo">
+    <change id="314" newObjId="105" oldObjId="99" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="105" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="315" newObjId="106" oldObjId="100" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="106" name="<no description>" pos="1" type="Float" val="2"/>
+    </change>
+    <change id="316" newObjId="107" oldObjId="101" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="107" name="<no description>" pos="2" type="Float" val="3"/>
+    </change>
+    <change id="317" newObjId="108" oldObjId="102" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="108" name="<no description>" pos="3" type="Float" val="4"/>
+    </change>
+    <change id="318" newObjId="109" oldObjId="103" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="109" name="<no description>" pos="4" type="Float" val="5"/>
+    </change>
+    <change id="319" newObjId="110" oldObjId="104" parentObjId="13" parentObjType="function" what="parameter">
+      <parameter alias="" id="110" name="<no description>" pos="5" type="Float" val="6"/>
+    </change>
+  </action>
+  <action date="2006-10-01 16:25:54" id="193" prevId="85" user="hvo">
+    <add id="198" objectId="15" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="15" name="CellLocation"/>
+    </add>
+    <add id="199" objectId="64" parentObjId="15" parentObjType="module" what="location">
+      <location id="64" x="72.1005174815" y="-280.021816048"/>
+    </add>
+  </action>
+  <action date="2006-10-01 16:25:57" id="194" prevId="193" user="hvo">
+    <change id="200" newObjId="65" oldObjId="64" parentObjId="15" parentObjType="module" what="location">
+      <location id="65" x="74.2421209034" y="-252.180970551"/>
+    </change>
+  </action>
+  <action date="2006-10-01 16:25:57" id="195" prevId="194" user="hvo">
+    <add id="201" objectId="11" parentObjId="" parentObjType="" what="connection">
+      <connection id="11"/>
+    </add>
+    <add id="202" objectId="22" parentObjId="11" parentObjType="connection" what="port">
+      <port id="22" moduleId="15" moduleName="CellLocation" sig="self(CellLocation)" type="source"/>
+    </add>
+    <add id="203" objectId="23" parentObjId="11" parentObjType="connection" what="port">
+      <port id="23" moduleId="7" moduleName="VTKCell" sig="Location(CellLocation)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-10-01 16:25:59" id="196" prevId="195" user="hvo">
+    <change id="204" newObjId="66" oldObjId="65" parentObjId="15" parentObjType="module" what="location">
+      <location id="66" x="129.923809874" y="-151.525606063"/>
+    </change>
+  </action>
+  <action date="2006-10-01 16:26:00" id="197" prevId="196" user="hvo">
+    <add id="205" objectId="16" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="16" name="SheetReference"/>
+    </add>
+    <add id="206" objectId="67" parentObjId="16" parentObjType="module" what="location">
+      <location id="67" x="207.021533064" y="73.3427614089"/>
+    </add>
+  </action>
+  <action date="2006-10-01 16:26:01" id="198" prevId="197" user="hvo">
+    <add id="207" objectId="12" parentObjId="" parentObjType="" what="connection">
+      <connection id="12"/>
+    </add>
+    <add id="208" objectId="24" parentObjId="12" parentObjType="connection" what="port">
+      <port id="24" moduleId="16" moduleName="SheetReference" sig="self(SheetReference)" type="source"/>
+    </add>
+    <add id="209" objectId="25" parentObjId="12" parentObjType="connection" what="port">
+      <port id="25" moduleId="15" moduleName="CellLocation" sig="SheetReference(SheetReference)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-10-01 16:26:04" id="199" prevId="198" user="hvo">
+    <add id="210" objectId="8" parentObjId="15" parentObjType="module" what="function">
+      <function id="8" name="ColumnRowAddress" pos="0"/>
+    </add>
+    <add id="211" objectId="54" parentObjId="8" parentObjType="function" what="parameter">
+      <parameter alias="" id="54" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-10-01 16:26:08" id="200" prevId="199" user="hvo">
+    <change id="212" newObjId="55" oldObjId="54" parentObjId="8" parentObjType="function" what="parameter">
+      <parameter alias="" id="55" name="<no description>" pos="0" type="String" val="B2"/>
+    </change>
+  </action>
+  <action date="2006-10-01 16:26:11" id="201" prevId="200" user="hvo">
+    <change id="213" newObjId="68" oldObjId="67" parentObjId="16" parentObjType="module" what="location">
+      <location id="68" x="207.021533064" y="71.2011579092"/>
+    </change>
+  </action>
+  <action date="2006-10-01 16:26:11" id="202" prevId="201" user="hvo">
+    <add id="214" objectId="9" parentObjId="16" parentObjType="module" what="function">
+      <function id="9" name="SheetName" pos="0"/>
+    </add>
+    <add id="215" objectId="56" parentObjId="9" parentObjType="function" what="parameter">
+      <parameter alias="" id="56" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2006-10-01 16:26:15" id="203" prevId="202" user="hvo">
+    <change id="216" newObjId="57" oldObjId="56" parentObjId="9" parentObjType="function" what="parameter">
+      <parameter alias="" id="57" name="<no description>" pos="0" type="String" val="Sheet 2"/>
+    </change>
+  </action>
+  <action date="2006-10-01 16:28:47" id="204" prevId="203" user="hvo">
+    <change id="217" newObjId="58" oldObjId="55" parentObjId="8" parentObjType="function" what="parameter">
+      <parameter alias="" id="58" name="<no description>" pos="0" type="String" val="A1"/>
+    </change>
+  </action>
+  <action date="2006-10-01 18:16:05" id="205" prevId="204" user="hvo">
+    <delete id="218" objectId="24" parentObjId="12" parentObjType="connection" what="port"/>
+    <delete id="219" objectId="25" parentObjId="12" parentObjType="connection" what="port"/>
+    <delete id="220" objectId="12" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-10-01 18:16:05" id="206" prevId="205" user="hvo">
+    <delete id="221" objectId="57" parentObjId="9" parentObjType="function" what="parameter"/>
+    <delete id="222" objectId="9" parentObjId="16" parentObjType="module" what="function"/>
+    <delete id="223" objectId="68" parentObjId="16" parentObjType="module" what="location"/>
+    <delete id="224" objectId="16" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2006-10-01 18:16:09" id="207" prevId="206" user="hvo">
+    <add id="225" objectId="17" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="17" name="SingleCellSheetReference"/>
+    </add>
+    <add id="226" objectId="69" parentObjId="17" parentObjType="module" what="location">
+      <location id="69" x="210.579999471" y="33.1199996413"/>
+    </add>
+  </action>
+  <action date="2006-10-01 18:16:24" id="208" prevId="207" user="hvo">
+    <change id="227" newObjId="70" oldObjId="69" parentObjId="17" parentObjType="module" what="location">
+      <location id="70" x="256.803596792" y="108.587099514"/>
+    </change>
+    <change id="228" newObjId="71" oldObjId="70" parentObjId="17" parentObjType="module" what="location">
+      <location id="71" x="274.976685875" y="73.4524595916"/>
+    </change>
+  </action>
+  <action date="2006-10-01 18:16:24" id="209" prevId="208" user="hvo">
+    <add id="229" objectId="13" parentObjId="" parentObjType="" what="connection">
+      <connection id="13"/>
+    </add>
+    <add id="230" objectId="26" parentObjId="13" parentObjType="connection" what="port">
+      <port id="26" moduleId="17" moduleName="SingleCellSheetReference" sig="self(SingleCellSheetReference)" type="source"/>
+    </add>
+    <add id="231" objectId="27" parentObjId="13" parentObjType="connection" what="port">
+      <port id="27" moduleId="15" moduleName="CellLocation" sig="SheetReference(SheetReference)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-10-06 22:51:39" id="210" prevId="165" user="hvo">
+    <delete id="712" objectId="78" parentObjId="39" parentObjType="connection" what="port"/>
+    <delete id="713" objectId="79" parentObjId="39" parentObjType="connection" what="port"/>
+    <delete id="714" objectId="39" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-10-06 22:51:40" id="211" prevId="210" user="hvo">
+    <delete id="715" objectId="76" parentObjId="38" parentObjType="connection" what="port"/>
+    <delete id="716" objectId="77" parentObjId="38" parentObjType="connection" what="port"/>
+    <delete id="717" objectId="38" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-10-06 22:51:42" id="212" prevId="211" user="hvo">
+    <add id="718" objectId="41" parentObjId="" parentObjType="" what="connection">
+      <connection id="41"/>
+    </add>
+    <add id="719" objectId="82" parentObjId="41" parentObjType="connection" what="port">
+      <port id="82" moduleId="41" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="720" objectId="83" parentObjId="41" parentObjType="connection" what="port">
+      <port id="83" moduleId="44" moduleName="vtkRenderer" sig="AddVolume(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-10-06 22:51:46" id="213" prevId="212" user="hvo">
+    <delete id="721" objectId="82" parentObjId="41" parentObjType="connection" what="port"/>
+    <delete id="722" objectId="83" parentObjId="41" parentObjType="connection" what="port"/>
+    <delete id="723" objectId="41" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2006-10-06 22:51:50" id="214" prevId="213" user="hvo">
+    <add id="724" objectId="42" parentObjId="" parentObjType="" what="connection">
+      <connection id="42"/>
+    </add>
+    <add id="725" objectId="84" parentObjId="42" parentObjType="connection" what="port">
+      <port id="84" moduleId="41" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="726" objectId="85" parentObjId="42" parentObjType="connection" what="port">
+      <port id="85" moduleId="44" moduleName="vtkViewport" sig="AddViewProp(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2006-10-06 22:51:53" id="215" prevId="214" user="hvo">
+    <add id="727" objectId="43" parentObjId="" parentObjType="" what="connection">
+      <connection id="43"/>
+    </add>
+    <add id="728" objectId="86" parentObjId="43" parentObjType="connection" what="port">
+      <port id="86" moduleId="42" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="729" objectId="87" parentObjId="43" parentObjType="connection" what="port">
+      <port id="87" moduleId="44" moduleName="vtkViewport" sig="AddViewProp(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:08:31" id="216" prevId="0" user="hvo">
+    <add id="730" objectId="46" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="46" name="vtkSphereSource"/>
+    </add>
+    <add id="731" objectId="161" parentObjId="46" parentObjType="module" what="location">
+      <location id="161" x="-114.288728978" y="288.442982659"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:08:43" id="217" prevId="216" user="hvo">
+    <change id="732" newObjId="162" oldObjId="161" parentObjId="46" parentObjType="module" what="location">
+      <location id="162" x="-3.628213618" y="277.558341804"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:08:43" id="218" prevId="217" user="hvo">
+    <add id="733" objectId="47" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="47" name="vtkConeSource"/>
+    </add>
+    <add id="734" objectId="163" parentObjId="47" parentObjType="module" what="location">
+      <location id="163" x="-72.4388138813" y="167.92634127"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:08:55" id="219" prevId="218" user="hvo">
+    <change id="735" newObjId="164" oldObjId="162" parentObjId="46" parentObjType="module" what="location">
+      <location id="164" x="209.572386328" y="167.253784303"/>
+    </change>
+    <change id="736" newObjId="165" oldObjId="163" parentObjId="47" parentObjType="module" what="location">
+      <location id="165" x="-112.77406252" y="186.03604474"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:08:55" id="220" prevId="219" user="hvo">
+    <add id="737" objectId="48" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="48" name="vtkGlyph3D"/>
+    </add>
+    <add id="738" objectId="166" parentObjId="48" parentObjType="module" what="location">
+      <location id="166" x="-239.541986812" y="50.2132687131"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:09:06" id="221" prevId="220" user="hvo">
+    <change id="739" newObjId="167" oldObjId="166" parentObjId="48" parentObjType="module" what="location">
+      <location id="167" x="62.560793806" y="23.0487135076"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:09:06" id="222" prevId="221" user="hvo">
+    <add id="740" objectId="44" parentObjId="" parentObjType="" what="connection">
+      <connection id="44"/>
+    </add>
+    <add id="741" objectId="88" parentObjId="44" parentObjType="connection" what="port">
+      <port id="88" moduleId="46" moduleName="vtkSphereSource" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="742" objectId="89" parentObjId="44" parentObjType="connection" what="port">
+      <port id="89" moduleId="48" moduleName="vtkAlgorithm" sig="AddInputConnection(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:09:21" id="223" prevId="222" user="hvo">
+    <delete id="743" objectId="88" parentObjId="44" parentObjType="connection" what="port"/>
+    <delete id="744" objectId="89" parentObjId="44" parentObjType="connection" what="port"/>
+    <delete id="745" objectId="44" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2007-02-19 15:09:25" id="224" prevId="223" user="hvo">
+    <add id="746" objectId="45" parentObjId="" parentObjType="" what="connection">
+      <connection id="45"/>
+    </add>
+    <add id="747" objectId="90" parentObjId="45" parentObjType="connection" what="port">
+      <port id="90" moduleId="46" moduleName="vtkSphereSource" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="748" objectId="91" parentObjId="45" parentObjType="connection" what="port">
+      <port id="91" moduleId="48" moduleName="vtkGlyph3D" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:09:43" id="225" prevId="224" user="hvo">
+    <add id="749" objectId="46" parentObjId="" parentObjType="" what="connection">
+      <connection id="46"/>
+    </add>
+    <add id="750" objectId="92" parentObjId="46" parentObjType="connection" what="port">
+      <port id="92" moduleId="47" moduleName="vtkConeSource" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="751" objectId="93" parentObjId="46" parentObjType="connection" what="port">
+      <port id="93" moduleId="48" moduleName="vtkGlyph3D" sig="SetInputConnection1(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:10:00" id="226" prevId="225" user="hvo">
+    <change id="752" newObjId="168" oldObjId="164" parentObjId="46" parentObjType="module" what="location">
+      <location id="168" x="-67.012175764" y="209.235369621"/>
+    </change>
+    <change id="753" newObjId="169" oldObjId="165" parentObjId="47" parentObjType="module" what="location">
+      <location id="169" x="166.280004591" y="211.554263267"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:10:00" id="227" prevId="226" user="hvo">
+    <add id="754" objectId="27" parentObjId="48" parentObjType="module" what="function">
+      <function id="27" name="SetVectorModeToUseNormal" pos="0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:10:13" id="228" prevId="227" user="hvo">
+    <add id="755" objectId="28" parentObjId="48" parentObjType="module" what="function">
+      <function id="28" name="SetScaleModeToScaleByVector" pos="1"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:10:22" id="229" prevId="228" user="hvo">
+    <add id="756" objectId="29" parentObjId="48" parentObjType="module" what="function">
+      <function id="29" name="SetScaleFactor" pos="2"/>
+    </add>
+    <add id="757" objectId="288" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="288" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:10:27" id="230" prevId="229" user="hvo">
+    <change id="758" newObjId="289" oldObjId="288" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="289" name="<no description>" pos="0" type="Float" val="0.25"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:10:28" id="231" prevId="230" user="hvo">
+    <change id="759" newObjId="290" oldObjId="289" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="290" name="<no description>" pos="0" type="Float" val="0.25"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:10:41" id="232" prevId="231" user="hvo">
+    <add id="760" objectId="49" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="49" name="vtkAppendPolyData"/>
+    </add>
+    <add id="761" objectId="170" parentObjId="49" parentObjType="module" what="location">
+      <location id="170" x="68.3229721835" y="-100.426537426"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:11:03" id="233" prevId="232" user="hvo">
+    <change id="762" newObjId="171" oldObjId="168" parentObjId="46" parentObjType="module" what="location">
+      <location id="171" x="-117.225444477" y="364.814185798"/>
+    </change>
+    <change id="763" newObjId="172" oldObjId="169" parentObjId="47" parentObjType="module" what="location">
+      <location id="172" x="116.066735878" y="367.133079444"/>
+    </change>
+    <change id="764" newObjId="173" oldObjId="167" parentObjId="48" parentObjType="module" what="location">
+      <location id="173" x="12.3475250929" y="178.627529685"/>
+    </change>
+    <change id="765" newObjId="174" oldObjId="170" parentObjId="49" parentObjType="module" what="location">
+      <location id="174" x="81.4936656165" y="23.048713508"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:11:03" id="234" prevId="233" user="hvo">
+    <add id="766" objectId="47" parentObjId="" parentObjType="" what="connection">
+      <connection id="47"/>
+    </add>
+    <add id="767" objectId="94" parentObjId="47" parentObjType="connection" what="port">
+      <port id="94" moduleId="47" moduleName="vtkConeSource" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="768" objectId="95" parentObjId="47" parentObjType="connection" what="port">
+      <port id="95" moduleId="49" moduleName="vtkAlgorithm" sig="AddInputConnection(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:11:39" id="235" prevId="234" user="hvo">
+    <delete id="769" objectId="94" parentObjId="47" parentObjType="connection" what="port"/>
+    <delete id="770" objectId="95" parentObjId="47" parentObjType="connection" what="port"/>
+    <delete id="771" objectId="47" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2007-02-19 15:13:42" id="236" prevId="235" user="hvo">
+    <change id="772" newObjId="175" oldObjId="174" parentObjId="49" parentObjType="module" what="location">
+      <location id="175" x="180.273866364" y="25.5182185267"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:13:49" id="237" prevId="236" user="hvo">
+    <add id="773" objectId="48" parentObjId="" parentObjType="" what="connection">
+      <connection id="48"/>
+    </add>
+    <add id="774" objectId="96" parentObjId="48" parentObjType="connection" what="port">
+      <port id="96" moduleId="47" moduleName="vtkPolyDataAlgorithm" sig="GetOutput(vtkPolyData)" type="source"/>
+    </add>
+    <add id="775" objectId="97" parentObjId="48" parentObjType="connection" what="port">
+      <port id="97" moduleId="49" moduleName="vtkAppendPolyData" sig="AddInput(vtkPolyData)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:13:55" id="238" prevId="237" user="hvo">
+    <add id="776" objectId="49" parentObjId="" parentObjType="" what="connection">
+      <connection id="49"/>
+    </add>
+    <add id="777" objectId="98" parentObjId="49" parentObjType="connection" what="port">
+      <port id="98" moduleId="48" moduleName="vtkPolyDataAlgorithm" sig="GetOutput(vtkPolyData)" type="source"/>
+    </add>
+    <add id="778" objectId="99" parentObjId="49" parentObjType="connection" what="port">
+      <port id="99" moduleId="49" moduleName="vtkAppendPolyData" sig="AddInput(vtkPolyData)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:14:13" id="239" prevId="238" user="hvo">
+    <change id="779" newObjId="176" oldObjId="173" parentObjId="48" parentObjType="module" what="location">
+      <location id="176" x="-28.8108918851" y="177.804361345"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:14:13" id="240" prevId="239" user="hvo">
+    <add id="780" objectId="50" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="50" name="vtkPolyDataMapper"/>
+    </add>
+    <add id="781" objectId="177" parentObjId="50" parentObjType="module" what="location">
+      <location id="177" x="80.6704972769" y="-76.5546555791"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:14:25" id="241" prevId="240" user="hvo">
+    <change id="782" newObjId="178" oldObjId="176" parentObjId="48" parentObjType="module" what="location">
+      <location id="178" x="-32.1035652433" y="241.188323491"/>
+    </change>
+    <change id="783" newObjId="179" oldObjId="175" parentObjId="49" parentObjType="module" what="location">
+      <location id="179" x="139.115449386" y="134.999607688"/>
+    </change>
+    <change id="784" newObjId="180" oldObjId="177" parentObjId="50" parentObjType="module" what="location">
+      <location id="180" x="147.347132781" y="4.1158416978"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:14:25" id="242" prevId="241" user="hvo">
+    <add id="785" objectId="50" parentObjId="" parentObjType="" what="connection">
+      <connection id="50"/>
+    </add>
+    <add id="786" objectId="100" parentObjId="50" parentObjType="connection" what="port">
+      <port id="100" moduleId="49" moduleName="vtkAppendPolyData" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="787" objectId="101" parentObjId="50" parentObjType="connection" what="port">
+      <port id="101" moduleId="50" moduleName="vtkPolyDataMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:14:35" id="243" prevId="242" user="hvo">
+    <add id="788" objectId="51" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="51" name="vtkLODActor"/>
+    </add>
+    <add id="789" objectId="181" parentObjId="51" parentObjType="module" what="location">
+      <location id="181" x="13.170693433" y="-120.182577576"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:14:47" id="244" prevId="243" user="hvo">
+    <add id="790" objectId="30" parentObjId="51" parentObjType="module" what="function">
+      <function id="30" name="VisibilityOn" pos="0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:14:50" id="245" prevId="244" user="hvo">
+    <add id="791" objectId="51" parentObjId="" parentObjType="" what="connection">
+      <connection id="51"/>
+    </add>
+    <add id="792" objectId="102" parentObjId="51" parentObjType="connection" what="port">
+      <port id="102" moduleId="50" moduleName="vtkPolyDataMapper" sig="self(vtkPolyDataMapper)" type="source"/>
+    </add>
+    <add id="793" objectId="103" parentObjId="51" parentObjType="connection" what="port">
+      <port id="103" moduleId="51" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:15:26" id="246" prevId="245" user="hvo">
+    <change id="794" newObjId="182" oldObjId="171" parentObjId="46" parentObjType="module" what="location">
+      <location id="182" x="-258.810398881" y="453.71636647"/>
+    </change>
+    <change id="795" newObjId="183" oldObjId="172" parentObjId="47" parentObjType="module" what="location">
+      <location id="183" x="-25.5182185258" y="456.035260116"/>
+    </change>
+    <change id="796" newObjId="184" oldObjId="178" parentObjId="48" parentObjType="module" what="location">
+      <location id="184" x="-173.688519647" y="330.090504164"/>
+    </change>
+    <change id="797" newObjId="185" oldObjId="179" parentObjId="49" parentObjType="module" what="location">
+      <location id="185" x="-2.4695050183" y="223.90178836"/>
+    </change>
+    <change id="798" newObjId="186" oldObjId="180" parentObjId="50" parentObjType="module" what="location">
+      <location id="186" x="10.7011884142" y="105.365547464"/>
+    </change>
+    <change id="799" newObjId="187" oldObjId="181" parentObjId="51" parentObjType="module" what="location">
+      <location id="187" x="58.4449521088" y="-25.5182185266"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:15:26" id="247" prevId="246" user="hvo">
+    <add id="800" objectId="52" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="52" name="vtkPlane"/>
+    </add>
+    <add id="801" objectId="188" parentObjId="52" parentObjType="module" what="location">
+      <location id="188" x="260.94436364" y="59.2681204483"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:15:36" id="248" prevId="247" user="hvo">
+    <change id="802" newObjId="189" oldObjId="188" parentObjId="52" parentObjType="module" what="location">
+      <location id="189" x="301.279612278" y="214.846936625"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:15:36" id="249" prevId="248" user="hvo">
+    <add id="803" objectId="53" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="53" name="vtkClipPolyData"/>
+    </add>
+    <add id="804" objectId="190" parentObjId="53" parentObjType="module" what="location">
+      <location id="190" x="304.572285637" y="86.4326756538"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:15:39" id="250" prevId="249" user="hvo">
+    <change id="805" newObjId="191" oldObjId="190" parentObjId="53" parentObjType="module" what="location">
+      <location id="191" x="308.688127335" y="103.719210785"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:15:39" id="251" prevId="250" user="hvo">
+    <add id="806" objectId="52" parentObjId="" parentObjType="" what="connection">
+      <connection id="52"/>
+    </add>
+    <add id="807" objectId="104" parentObjId="52" parentObjType="connection" what="port">
+      <port id="104" moduleId="52" moduleName="vtkPlane" sig="self(vtkPlane)" type="source"/>
+    </add>
+    <add id="808" objectId="105" parentObjId="52" parentObjType="connection" what="port">
+      <port id="105" moduleId="53" moduleName="vtkClipPolyData" sig="SetClipFunction(vtkImplicitFunction)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:16:02" id="252" prevId="251" user="hvo">
+    <add id="809" objectId="53" parentObjId="" parentObjType="" what="connection">
+      <connection id="53"/>
+    </add>
+    <add id="810" objectId="106" parentObjId="53" parentObjType="connection" what="port">
+      <port id="106" moduleId="49" moduleName="vtkAppendPolyData" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="811" objectId="107" parentObjId="53" parentObjType="connection" what="port">
+      <port id="107" moduleId="53" moduleName="vtkClipPolyData" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:16:23" id="253" prevId="252" user="hvo">
+    <change id="812" newObjId="192" oldObjId="186" parentObjId="50" parentObjType="module" what="location">
+      <location id="192" x="88.9021806724" y="92.1948540308"/>
+    </change>
+    <change id="813" newObjId="193" oldObjId="187" parentObjId="51" parentObjType="module" what="location">
+      <location id="193" x="169.57267795" y="-36.2194069409"/>
+    </change>
+    <change id="814" newObjId="194" oldObjId="189" parentObjId="52" parentObjType="module" what="location">
+      <location id="194" x="-274.115057074" y="200.029906513"/>
+    </change>
+    <change id="815" newObjId="195" oldObjId="191" parentObjId="53" parentObjType="module" what="location">
+      <location id="195" x="-174.511687987" y="86.4326756538"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:16:23" id="254" prevId="253" user="hvo">
+    <add id="816" objectId="31" parentObjId="53" parentObjType="module" what="function">
+      <function id="31" name="InsideOutOn" pos="0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:16:58" id="255" prevId="254" user="hvo">
+    <add id="817" objectId="54" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="54" name="vtkPolyDataMapper"/>
+    </add>
+    <add id="818" objectId="196" parentObjId="54" parentObjType="module" what="location">
+      <location id="196" x="-170.395846289" y="-16.4633667912"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:17:02" id="256" prevId="255" user="hvo">
+    <change id="819" newObjId="197" oldObjId="196" parentObjId="54" parentObjType="module" what="location">
+      <location id="197" x="-122.652082595" y="-43.6279219967"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:17:02" id="257" prevId="256" user="hvo">
+    <add id="820" objectId="54" parentObjId="" parentObjType="" what="connection">
+      <connection id="54"/>
+    </add>
+    <add id="821" objectId="108" parentObjId="54" parentObjType="connection" what="port">
+      <port id="108" moduleId="53" moduleName="vtkClipPolyData" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="822" objectId="109" parentObjId="54" parentObjType="connection" what="port">
+      <port id="109" moduleId="54" moduleName="vtkPolyDataMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:17:12" id="258" prevId="257" user="hvo">
+    <add id="823" objectId="55" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="55" name="vtkLODActor"/>
+    </add>
+    <add id="824" objectId="198" parentObjId="55" parentObjType="module" what="location">
+      <location id="198" x="179.572677949" y="-26.2194069406"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:17:12" id="259" prevId="258" user="hvo">
+    <add id="825" objectId="32" parentObjId="55" parentObjType="module" what="function">
+      <function id="32" name="VisibilityOn" pos="0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:17:12" id="260" prevId="259" user="hvo"/>
+  <action date="2007-02-19 15:17:17" id="261" prevId="260" user="hvo">
+    <change id="826" newObjId="199" oldObjId="198" parentObjId="55" parentObjType="module" what="location">
+      <location id="199" x="-83.018022371" y="-159.57267795"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:17:17" id="262" prevId="261" user="hvo">
+    <add id="827" objectId="55" parentObjId="" parentObjType="" what="connection">
+      <connection id="55"/>
+    </add>
+    <add id="828" objectId="110" parentObjId="55" parentObjType="connection" what="port">
+      <port id="110" moduleId="54" moduleName="vtkPolyDataMapper" sig="self(vtkPolyDataMapper)" type="source"/>
+    </add>
+    <add id="829" objectId="111" parentObjId="55" parentObjType="connection" what="port">
+      <port id="111" moduleId="55" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:17:46" id="263" prevId="262" user="hvo">
+    <change id="830" newObjId="200" oldObjId="194" parentObjId="52" parentObjType="module" what="location">
+      <location id="200" x="-288.108918846" y="244.480996849"/>
+    </change>
+    <change id="831" newObjId="201" oldObjId="195" parentObjId="53" parentObjType="module" what="location">
+      <location id="201" x="-139.938617726" y="121.828914255"/>
+    </change>
+    <change id="832" newObjId="202" oldObjId="197" parentObjId="54" parentObjType="module" what="location">
+      <location id="202" x="-166.280004591" y="27.1645552054"/>
+    </change>
+    <change id="833" newObjId="203" oldObjId="199" parentObjId="55" parentObjType="module" what="location">
+      <location id="203" x="-85.4875273897" y="-83.0180223705"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:17:46" id="264" prevId="263" user="hvo">
+    <add id="834" objectId="33" parentObjId="55" parentObjType="module" what="function">
+      <function id="33" name="VisibilityOff" pos="1"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:17:48" id="265" prevId="264" user="hvo">
+    <delete id="835" objectId="32" parentObjId="55" parentObjType="module" what="function"/>
+  </action>
+  <action date="2007-02-19 15:18:01" id="266" prevId="265" user="hvo">
+    <change id="836" newObjId="204" oldObjId="203" parentObjId="55" parentObjType="module" what="location">
+      <location id="204" x="-86.3106957292" y="-83.8411907101"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:18:01" id="267" prevId="266" user="hvo">
+    <change id="837" newObjId="34" oldObjId="33" parentObjId="55" parentObjType="module" what="function">
+      <function id="34" name="SetScale" pos="1"/>
+    </change>
+    <add id="838" objectId="291" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="291" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="839" objectId="292" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="292" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="840" objectId="293" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="293" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:18:04" id="268" prevId="267" user="hvo">
+    <change id="841" newObjId="294" oldObjId="291" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="294" name="<no description>" pos="0" type="Float" val="1.01"/>
+    </change>
+    <change id="842" newObjId="295" oldObjId="292" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="295" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="843" newObjId="296" oldObjId="293" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="296" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:18:06" id="269" prevId="268" user="hvo">
+    <change id="844" newObjId="297" oldObjId="294" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="297" name="<no description>" pos="0" type="Float" val="1.01"/>
+    </change>
+    <change id="845" newObjId="298" oldObjId="295" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="298" name="<no description>" pos="1" type="Float" val="1.01"/>
+    </change>
+    <change id="846" newObjId="299" oldObjId="296" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="299" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:18:08" id="270" prevId="269" user="hvo">
+    <change id="847" newObjId="300" oldObjId="297" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="300" name="<no description>" pos="0" type="Float" val="1.01"/>
+    </change>
+    <change id="848" newObjId="301" oldObjId="298" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="301" name="<no description>" pos="1" type="Float" val="1.01"/>
+    </change>
+    <change id="849" newObjId="302" oldObjId="299" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="302" name="<no description>" pos="2" type="Float" val="1.01"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:18:08" id="271" prevId="270" user="hvo">
+    <change id="850" newObjId="303" oldObjId="300" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="303" name="<no description>" pos="0" type="Float" val="1.01"/>
+    </change>
+    <change id="851" newObjId="304" oldObjId="301" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="304" name="<no description>" pos="1" type="Float" val="1.01"/>
+    </change>
+    <change id="852" newObjId="305" oldObjId="302" parentObjId="34" parentObjType="function" what="parameter">
+      <parameter alias="" id="305" name="<no description>" pos="2" type="Float" val="1.01"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:19:16" id="272" prevId="271" user="hvo">
+    <change id="853" newObjId="205" oldObjId="204" parentObjId="55" parentObjType="module" what="location">
+      <location id="205" x="-102.77406252" y="-123.353271009"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:19:16" id="273" prevId="272" user="hvo">
+    <add id="854" objectId="56" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="56" name="vtkProperty"/>
+    </add>
+    <add id="855" objectId="206" parentObjId="56" parentObjType="module" what="location">
+      <location id="206" x="8.2316833956" y="16.4633667912"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:19:20" id="274" prevId="273" user="hvo">
+    <change id="856" newObjId="207" oldObjId="206" parentObjId="56" parentObjType="module" what="location">
+      <location id="207" x="8.2316833956" y="-18.1097034703"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:19:20" id="275" prevId="274" user="hvo">
+    <add id="857" objectId="56" parentObjId="" parentObjType="" what="connection">
+      <connection id="56"/>
+    </add>
+    <add id="858" objectId="112" parentObjId="56" parentObjType="connection" what="port">
+      <port id="112" moduleId="56" moduleName="vtkProperty" sig="self(vtkProperty)" type="source"/>
+    </add>
+    <add id="859" objectId="113" parentObjId="56" parentObjType="connection" what="port">
+      <port id="113" moduleId="55" moduleName="vtkActor" sig="SetProperty(vtkProperty)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:19:55" id="276" prevId="275" user="hvo">
+    <change id="860" newObjId="208" oldObjId="202" parentObjId="54" parentObjType="module" what="location">
+      <location id="208" x="-218.139609984" y="19.7560401494"/>
+    </change>
+    <change id="861" newObjId="209" oldObjId="207" parentObjId="56" parentObjType="module" what="location">
+      <location id="209" x="-8.2316833956" y="11.5243567539"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:19:55" id="277" prevId="276" user="hvo">
+    <add id="862" objectId="35" parentObjId="56" parentObjType="module" what="function">
+      <function id="35" name="SetColor" pos="0"/>
+    </add>
+    <add id="863" objectId="306" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="306" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="864" objectId="307" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="307" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="865" objectId="308" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="308" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:20:00" id="278" prevId="277" user="hvo">
+    <change id="866" newObjId="309" oldObjId="306" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="309" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="867" newObjId="310" oldObjId="307" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="310" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="868" newObjId="311" oldObjId="308" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="311" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:20:01" id="279" prevId="278" user="hvo">
+    <change id="869" newObjId="312" oldObjId="309" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="312" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="870" newObjId="313" oldObjId="310" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="313" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="871" newObjId="314" oldObjId="311" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="314" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:20:03" id="280" prevId="279" user="hvo">
+    <change id="872" newObjId="315" oldObjId="312" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="315" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="873" newObjId="316" oldObjId="313" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="316" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="874" newObjId="317" oldObjId="314" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="317" name="<no description>" pos="2" type="Float" val="0"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:20:04" id="281" prevId="280" user="hvo">
+    <change id="875" newObjId="318" oldObjId="315" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="318" name="<no description>" pos="0" type="Float" val="0"/>
+    </change>
+    <change id="876" newObjId="319" oldObjId="316" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="319" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="877" newObjId="320" oldObjId="317" parentObjId="35" parentObjType="function" what="parameter">
+      <parameter alias="" id="320" name="<no description>" pos="2" type="Float" val="0"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:20:20" id="282" prevId="281" user="hvo">
+    <change id="878" newObjId="210" oldObjId="205" parentObjId="55" parentObjType="module" what="location">
+      <location id="210" x="-45.1522787512" y="-146.401984517"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:20:20" id="283" prevId="282" user="hvo">
+    <add id="879" objectId="57" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="57" name="vtkRenderer"/>
+    </add>
+    <add id="880" objectId="211" parentObjId="57" parentObjType="module" what="location">
+      <location id="211" x="48.566932034" y="-250.243175226"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:20:45" id="284" prevId="283" user="hvo">
+    <add id="881" objectId="57" parentObjId="" parentObjType="" what="connection">
+      <connection id="57"/>
+    </add>
+    <add id="882" objectId="114" parentObjId="57" parentObjType="connection" what="port">
+      <port id="114" moduleId="55" moduleName="vtkLODActor" sig="self(vtkLODActor)" type="source"/>
+    </add>
+    <add id="883" objectId="115" parentObjId="57" parentObjType="connection" what="port">
+      <port id="115" moduleId="57" moduleName="vtkRenderer" sig="AddActor(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:20:49" id="285" prevId="284" user="hvo">
+    <add id="884" objectId="58" parentObjId="" parentObjType="" what="connection">
+      <connection id="58"/>
+    </add>
+    <add id="885" objectId="116" parentObjId="58" parentObjType="connection" what="port">
+      <port id="116" moduleId="51" moduleName="vtkLODActor" sig="self(vtkLODActor)" type="source"/>
+    </add>
+    <add id="886" objectId="117" parentObjId="58" parentObjType="connection" what="port">
+      <port id="117" moduleId="57" moduleName="vtkRenderer" sig="AddActor(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:21:14" id="286" prevId="285" user="hvo">
+    <change id="887" newObjId="212" oldObjId="211" parentObjId="57" parentObjType="module" what="location">
+      <location id="212" x="168.74950961" y="-144.054459423"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:14" id="287" prevId="286" user="hvo">
+    <add id="888" objectId="36" parentObjId="57" parentObjType="module" what="function">
+      <function id="36" name="SetBackground" pos="0"/>
+    </add>
+    <add id="889" objectId="321" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="321" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+    <add id="890" objectId="322" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="322" name="<no description>" pos="1" type="Float" val="0.0"/>
+    </add>
+    <add id="891" objectId="323" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="323" name="<no description>" pos="2" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:21:20" id="288" prevId="287" user="hvo">
+    <change id="892" newObjId="324" oldObjId="321" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="324" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="893" newObjId="325" oldObjId="322" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="325" name="<no description>" pos="1" type="Float" val=""/>
+    </change>
+    <change id="894" newObjId="326" oldObjId="323" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="326" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:21" id="289" prevId="288" user="hvo">
+    <change id="895" newObjId="327" oldObjId="324" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="327" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="896" newObjId="328" oldObjId="325" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="328" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="897" newObjId="329" oldObjId="326" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="329" name="<no description>" pos="2" type="Float" val=""/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:21" id="290" prevId="289" user="hvo">
+    <change id="898" newObjId="330" oldObjId="327" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="330" name="<no description>" pos="0" type="Float" val="1"/>
+    </change>
+    <change id="899" newObjId="331" oldObjId="328" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="331" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="900" newObjId="332" oldObjId="329" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="332" name="<no description>" pos="2" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:33" id="291" prevId="290" user="hvo">
+    <change id="901" newObjId="333" oldObjId="330" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="333" name="<no description>" pos="0" type="Float" val="0.1"/>
+    </change>
+    <change id="902" newObjId="334" oldObjId="331" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="334" name="<no description>" pos="1" type="Float" val="1"/>
+    </change>
+    <change id="903" newObjId="335" oldObjId="332" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="335" name="<no description>" pos="2" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:34" id="292" prevId="291" user="hvo">
+    <change id="904" newObjId="336" oldObjId="333" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="336" name="<no description>" pos="0" type="Float" val="0.1"/>
+    </change>
+    <change id="905" newObjId="337" oldObjId="334" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="337" name="<no description>" pos="1" type="Float" val="0.2"/>
+    </change>
+    <change id="906" newObjId="338" oldObjId="335" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="338" name="<no description>" pos="2" type="Float" val="1"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:35" id="293" prevId="292" user="hvo">
+    <change id="907" newObjId="339" oldObjId="336" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="339" name="<no description>" pos="0" type="Float" val="0.1"/>
+    </change>
+    <change id="908" newObjId="340" oldObjId="337" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="340" name="<no description>" pos="1" type="Float" val="0.2"/>
+    </change>
+    <change id="909" newObjId="341" oldObjId="338" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="341" name="<no description>" pos="2" type="Float" val="0.4"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:35" id="294" prevId="293" user="hvo">
+    <change id="910" newObjId="342" oldObjId="339" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="342" name="<no description>" pos="0" type="Float" val="0.1"/>
+    </change>
+    <change id="911" newObjId="343" oldObjId="340" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="343" name="<no description>" pos="1" type="Float" val="0.2"/>
+    </change>
+    <change id="912" newObjId="344" oldObjId="341" parentObjId="36" parentObjType="function" what="parameter">
+      <parameter alias="" id="344" name="<no description>" pos="2" type="Float" val="0.4"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:21:45" id="295" prevId="294" user="hvo">
+    <add id="913" objectId="58" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="58" name="VTKCell"/>
+    </add>
+    <add id="914" objectId="213" parentObjId="58" parentObjType="module" what="location">
+      <location id="213" x="100.426537426" y="-264.237036999"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:21:47" id="296" prevId="295" user="hvo">
+    <add id="915" objectId="59" parentObjId="" parentObjType="" what="connection">
+      <connection id="59"/>
+    </add>
+    <add id="916" objectId="118" parentObjId="59" parentObjType="connection" what="port">
+      <port id="118" moduleId="57" moduleName="vtkRenderer" sig="self(vtkRenderer)" type="source"/>
+    </add>
+    <add id="917" objectId="119" parentObjId="59" parentObjType="connection" what="port">
+      <port id="119" moduleId="58" moduleName="VTKCell" sig="AddRenderer(vtkRenderer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:22:03" id="297" prevId="296" user="hvo">
+    <change id="918" newObjId="214" oldObjId="213" parentObjId="58" parentObjType="module" what="location">
+      <location id="214" x="193.444559796" y="-260.944363641"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:22:03" id="298" prevId="297" user="hvo">
+    <delete id="919" objectId="96" parentObjId="48" parentObjType="connection" what="port"/>
+    <delete id="920" objectId="97" parentObjId="48" parentObjType="connection" what="port"/>
+    <delete id="921" objectId="48" parentObjId="" parentObjType="" what="connection"/>
+  </action>
+  <action date="2007-02-19 15:22:09" id="299" prevId="298" user="hvo">
+    <add id="922" objectId="60" parentObjId="" parentObjType="" what="connection">
+      <connection id="60"/>
+    </add>
+    <add id="923" objectId="120" parentObjId="60" parentObjType="connection" what="port">
+      <port id="120" moduleId="46" moduleName="vtkPolyDataAlgorithm" sig="GetOutput(vtkPolyData)" type="source"/>
+    </add>
+    <add id="924" objectId="121" parentObjId="60" parentObjType="connection" what="port">
+      <port id="121" moduleId="49" moduleName="vtkAppendPolyData" sig="AddInput(vtkPolyData)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 15:25:15" id="300" prevId="299" user="hvo">
+    <change id="925" newObjId="215" oldObjId="184" parentObjId="48" parentObjType="module" what="location">
+      <location id="215" x="1.86329516366" y="330.840725594"/>
+    </change>
+    <change id="926" newObjId="216" oldObjId="214" parentObjId="58" parentObjType="module" what="location">
+      <location id="216" x="-29.3712051567" y="-259.443920779"/>
+    </change>
+  </action>
+  <action date="2007-02-19 15:25:15" id="301" prevId="300" user="hvo">
+    <change id="927" newObjId="345" oldObjId="290" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="345" name="<no description>" pos="0" type="Float" val="0.23"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:03:47" id="302" prevId="301" user="hvo">
+    <add id="928" objectId="59" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="59" name="vtkInteractionHandler"/>
+    </add>
+    <add id="929" objectId="217" parentObjId="59" parentObjType="module" what="location">
+      <location id="217" x="-275.549024657" y="-159.488973511"/>
+    </add>
+  </action>
+  <action date="2007-02-19 16:03:49" id="303" prevId="302" user="hvo">
+    <add id="930" objectId="61" parentObjId="" parentObjType="" what="connection">
+      <connection id="61"/>
+    </add>
+    <add id="931" objectId="122" parentObjId="61" parentObjType="connection" what="port">
+      <port id="122" moduleId="59" moduleName="vtkInteractionHandler" sig="self(vtkInteractionHandler)" type="source"/>
+    </add>
+    <add id="932" objectId="123" parentObjId="61" parentObjType="connection" what="port">
+      <port id="123" moduleId="58" moduleName="VTKCell" sig="InteractionHandler(vtkInteractionHandler)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 16:04:11" id="304" prevId="303" user="hvo">
+    <change id="933" newObjId="218" oldObjId="217" parentObjId="59" parentObjType="module" what="location">
+      <location id="218" x="-259.07598514" y="-147.508581135"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:04:11" id="305" prevId="304" user="hvo">
+    <add id="934" objectId="60" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="60" name="vtkImplicitPlaneWidget"/>
+    </add>
+    <add id="935" objectId="219" parentObjId="60" parentObjType="module" what="location">
+      <location id="219" x="-368.397065574" y="-28.4534318939"/>
+    </add>
+  </action>
+  <action date="2007-02-19 16:04:15" id="306" prevId="305" user="hvo">
+    <change id="936" newObjId="220" oldObjId="218" parentObjId="59" parentObjType="module" what="location">
+      <location id="220" x="-233.61765134" y="-183.449758264"/>
+    </change>
+    <change id="937" newObjId="221" oldObjId="219" parentObjId="60" parentObjType="module" what="location">
+      <location id="221" x="-306.997554645" y="-59.9019618819"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:04:15" id="307" prevId="306" user="hvo">
+    <add id="938" objectId="62" parentObjId="" parentObjType="" what="connection">
+      <connection id="62"/>
+    </add>
+    <add id="939" objectId="124" parentObjId="62" parentObjType="connection" what="port">
+      <port id="124" moduleId="60" moduleName="vtkImplicitPlaneWidget" sig="self(vtkImplicitPlaneWidget)" type="source"/>
+    </add>
+    <add id="940" objectId="125" parentObjId="62" parentObjType="connection" what="port">
+      <port id="125" moduleId="59" moduleName="vtkInteractionHandler" sig="Observer(vtkInteractorObserver)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 16:04:40" id="308" prevId="307" user="hvo">
+    <change id="941" newObjId="222" oldObjId="220" parentObjId="59" parentObjType="module" what="location">
+      <location id="222" x="-283.036769892" y="-144.51348304"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:04:40" id="309" prevId="308" user="hvo">
+    <add id="942" objectId="37" parentObjId="60" parentObjType="module" what="function">
+      <function id="37" name="SetPlaceFactor" pos="0"/>
+    </add>
+    <add id="943" objectId="346" parentObjId="37" parentObjType="function" what="parameter">
+      <parameter alias="" id="346" name="<no description>" pos="0" type="Float" val="0.0"/>
+    </add>
+  </action>
+  <action date="2007-02-19 16:04:44" id="310" prevId="309" user="hvo">
+    <change id="944" newObjId="347" oldObjId="346" parentObjId="37" parentObjType="function" what="parameter">
+      <parameter alias="" id="347" name="<no description>" pos="0" type="Float" val="1.25"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:04:44" id="311" prevId="310" user="hvo">
+    <change id="945" newObjId="348" oldObjId="347" parentObjId="37" parentObjType="function" what="parameter">
+      <parameter alias="" id="348" name="<no description>" pos="0" type="Float" val="1.25"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:04:56" id="312" prevId="311" user="hvo">
+    <add id="946" objectId="63" parentObjId="" parentObjType="" what="connection">
+      <connection id="63"/>
+    </add>
+    <add id="947" objectId="126" parentObjId="63" parentObjType="connection" what="port">
+      <port id="126" moduleId="48" moduleName="vtkPolyDataAlgorithm" sig="GetOutput(vtkPolyData)" type="source"/>
+    </add>
+    <add id="948" objectId="127" parentObjId="63" parentObjType="connection" what="port">
+      <port id="127" moduleId="60" moduleName="vtk3DWidget" sig="SetInput(vtkDataSet)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 16:10:34" id="313" prevId="312" user="hvo">
+    <change id="949" newObjId="223" oldObjId="215" parentObjId="48" parentObjType="module" what="location">
+      <location id="223" x="-106.641240193" y="350.8486541"/>
+    </change>
+    <change id="950" newObjId="224" oldObjId="185" parentObjId="49" parentObjType="module" what="location">
+      <location id="224" x="-123.286611763" y="224.671324072"/>
+    </change>
+    <change id="951" newObjId="225" oldObjId="192" parentObjId="50" parentObjType="module" what="location">
+      <location id="225" x="-1.9030333145" y="103.737889707"/>
+    </change>
+    <change id="952" newObjId="226" oldObjId="193" parentObjId="51" parentObjType="module" what="location">
+      <location id="226" x="137.252178056" y="-0.0512284885"/>
+    </change>
+    <change id="953" newObjId="227" oldObjId="200" parentObjId="52" parentObjType="module" what="location">
+      <location id="227" x="-343.515490092" y="226.012139767"/>
+    </change>
+    <change id="954" newObjId="228" oldObjId="201" parentObjId="53" parentObjType="module" what="location">
+      <location id="228" x="-249.982224507" y="135.680557067"/>
+    </change>
+    <change id="955" newObjId="229" oldObjId="208" parentObjId="54" parentObjType="module" what="location">
+      <location id="229" x="-272.776645518" y="28.2209329787"/>
+    </change>
+    <change id="956" newObjId="230" oldObjId="210" parentObjId="55" parentObjType="module" what="location">
+      <location id="230" x="-225.993171013" y="-108.694734641"/>
+    </change>
+    <change id="957" newObjId="231" oldObjId="209" parentObjId="56" parentObjType="module" what="location">
+      <location id="231" x="-62.0991832183" y="29.993213836"/>
+    </change>
+    <change id="958" newObjId="232" oldObjId="212" parentObjId="57" parentObjType="module" what="location">
+      <location id="232" x="-10.552311229" y="-90.1869596003"/>
+    </change>
+    <change id="959" newObjId="233" oldObjId="216" parentObjId="58" parentObjType="module" what="location">
+      <location id="233" x="238.427222533" y="-120.157956952"/>
+    </change>
+    <change id="960" newObjId="234" oldObjId="222" parentObjId="59" parentObjType="module" what="location">
+      <location id="234" x="201.001192801" y="178.691515896"/>
+    </change>
+    <change id="961" newObjId="235" oldObjId="221" parentObjId="60" parentObjType="module" what="location">
+      <location id="235" x="158.571550966" y="272.537465595"/>
+    </change>
+  </action>
+  <action date="2007-02-19 16:10:34" id="314" prevId="313" user="hvo">
+    <change id="962" newObjId="349" oldObjId="345" parentObjId="29" parentObjType="function" what="parameter">
+      <parameter alias="" id="349" name="<no description>" pos="0" type="Float" val="0.24"/>
+    </change>
+  </action>
+  <action date="2007-02-19 17:28:20" id="315" prevId="314" user="hvo">
+    <add id="963" objectId="38" parentObjId="59" parentObjType="module" what="function">
+      <function id="38" name="Handler" pos="0"/>
+    </add>
+    <add id="964" objectId="350" parentObjId="38" parentObjType="function" what="parameter">
+      <parameter alias="" id="350" name="<no description>" pos="0" type="String" val="def%20interactionHandler%28observer%2C%20shareddata%29%3A%0A%20%20%20%20print%20type%28observer%29%2C%20type%28shareddata%29"/>
+    </add>
+  </action>
+  <action date="2007-02-19 17:32:20" id="316" prevId="315" user="hvo">
+    <change id="965" newObjId="236" oldObjId="227" parentObjId="52" parentObjType="module" what="location">
+      <location id="236" x="-339.306136093" y="356.502113748"/>
+    </change>
+  </action>
+  <action date="2007-02-19 17:32:20" id="317" prevId="316" user="hvo">
+    <add id="966" objectId="64" parentObjId="" parentObjType="" what="connection">
+      <connection id="64"/>
+    </add>
+    <add id="967" objectId="128" parentObjId="64" parentObjType="connection" what="port">
+      <port id="128" moduleId="52" moduleName="vtkPlane" sig="self(vtkPlane)" type="source"/>
+    </add>
+    <add id="968" objectId="129" parentObjId="64" parentObjType="connection" what="port">
+      <port id="129" moduleId="59" moduleName="vtkInteractionHandler" sig="SharedData(Module)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-02-19 17:34:24" id="318" prevId="317" user="hvo">
+    <change id="969" newObjId="351" oldObjId="350" parentObjId="38" parentObjType="function" what="parameter">
+      <parameter alias="" id="351" name="<no description>" pos="0" type="String" val="def%20interactionHandler%28observer%2C%20shareddata%29%3A%0A%20%20%20%20observer.GetPlane%28shareddata.vtkInstance%29"/>
+    </change>
+  </action>
+  <action date="2007-02-19 17:35:07" id="319" prevId="318" user="hvo"/>
+  <action date="2007-02-19 17:35:10" id="320" prevId="319" user="hvo">
+    <delete id="970" objectId="305" parentObjId="39" parentObjType="function" what="parameter"/>
+    <delete id="971" objectId="304" parentObjId="39" parentObjType="function" what="parameter"/>
+    <delete id="972" objectId="303" parentObjId="39" parentObjType="function" what="parameter"/>
+    <change id="973" newObjId="39" oldObjId="34" parentObjId="55" parentObjType="module" what="function">
+      <function id="39" name="VisibilityOn" pos="1"/>
+    </change>
+  </action>
+  <action date="2007-02-19 17:37:06" id="321" prevId="320" user="hvo">
+    <change id="974" newObjId="352" oldObjId="351" parentObjId="38" parentObjType="function" what="parameter">
+      <parameter alias="" id="352" name="<no description>" pos="0" type="String" val="def%20interactionHandler%28observer%2C%20shareddata%29%3A%0A%20%20%20%20return%0A%20%20%20%20observer.GetPlane%28shareddata.vtkInstance%29"/>
+    </change>
+  </action>
+  <action date="2007-02-19 17:37:28" id="322" prevId="321" user="hvo">
+    <change id="975" newObjId="353" oldObjId="352" parentObjId="38" parentObjType="function" what="parameter">
+      <parameter alias="" id="353" name="<no description>" pos="0" type="String" val="def%20interactionHandler%28observer%2C%20shareddata%29%3A%0A%20%20%20%20observer.GetPlane%28shareddata.vtkInstance%29"/>
+    </change>
+  </action>
+  <action date="2007-03-06 17:31:12" id="323" prevId="43" user="stew">
+    <change id="344" newObjId="97" oldObjId="27" parentObjId="0" parentObjType="module" what="location">
+      <location id="97" x="-549.137243226" y="416.778178723"/>
+    </change>
+    <change id="345" newObjId="98" oldObjId="26" parentObjId="1" parentObjType="module" what="location">
+      <location id="98" x="-572.831615933" y="297.497288566"/>
+    </change>
+    <change id="346" newObjId="99" oldObjId="25" parentObjId="2" parentObjType="module" what="location">
+      <location id="99" x="-593.590955958" y="114.568674018"/>
+    </change>
+    <change id="347" newObjId="100" oldObjId="24" parentObjId="3" parentObjType="module" what="location">
+      <location id="100" x="-556.009541462" y="-7.62097615407"/>
+    </change>
+    <change id="348" newObjId="101" oldObjId="41" parentObjId="7" parentObjType="module" what="location">
+      <location id="101" x="-516.213636004" y="-170.021192279"/>
+    </change>
+  </action>
+  <action date="2007-03-06 17:31:12" id="324" prevId="323" user="stew">
+    <add id="349" objectId="20" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="20" name="VTKCell"/>
+    </add>
+    <add id="350" objectId="102" parentObjId="20" parentObjType="module" what="location">
+      <location id="102" x="-180.664206774" y="-165.520338043"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:12" id="325" prevId="324" user="stew">
+    <add id="351" objectId="21" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="21" name="vtkDataSetMapper"/>
+    </add>
+    <add id="352" objectId="103" parentObjId="21" parentObjType="module" what="location">
+      <location id="103" x="-237.282186703" y="301.998142802"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:13" id="326" prevId="325" user="stew">
+    <add id="353" objectId="22" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="22" name="vtkDataSetReader"/>
+    </add>
+    <add id="354" objectId="104" parentObjId="22" parentObjType="module" what="location">
+      <location id="104" x="-213.587813996" y="421.279032959"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:13" id="327" prevId="326" user="stew">
+    <add id="355" objectId="23" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="23" name="vtkRenderer"/>
+    </add>
+    <add id="356" objectId="105" parentObjId="23" parentObjType="module" what="location">
+      <location id="105" x="-220.460112232" y="-3.1201219181"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:13" id="328" prevId="327" user="stew">
+    <add id="357" objectId="24" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="24" name="vtkActor"/>
+    </add>
+    <add id="358" objectId="106" parentObjId="24" parentObjType="module" what="location">
+      <location id="106" x="-258.041526728" y="119.069528254"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:14" id="329" prevId="328" user="stew"/>
+  <action date="2007-03-06 17:31:14" id="330" prevId="329" user="stew">
+    <add id="359" objectId="15" parentObjId="21" parentObjType="module" what="function">
+      <function id="15" name="ScalarVisibilityOn" pos="0"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:14" id="331" prevId="330" user="stew"/>
+  <action date="2007-03-06 17:31:14" id="332" prevId="331" user="stew">
+    <add id="360" objectId="16" parentObjId="22" parentObjType="module" what="function">
+      <function id="16" name="SetFileName" pos="0"/>
+    </add>
+    <add id="361" objectId="114" parentObjId="16" parentObjType="function" what="parameter">
+      <parameter alias="" id="114" name="<no description>" pos="0" type="String" val="../examples/data/spx.vtk"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:14" id="333" prevId="332" user="stew"/>
+  <action date="2007-03-06 17:31:14" id="334" prevId="333" user="stew"/>
+  <action date="2007-03-06 17:31:14" id="335" prevId="334" user="stew"/>
+  <action date="2007-03-06 17:31:14" id="336" prevId="335" user="stew">
+    <add id="362" objectId="15" parentObjId="" parentObjType="" what="connection">
+      <connection id="15"/>
+    </add>
+    <add id="363" objectId="30" parentObjId="15" parentObjType="connection" what="port">
+      <port id="30" moduleId="23" moduleName="vtkRenderer" sig="self(vtkRenderer)" type="source"/>
+    </add>
+    <add id="364" objectId="31" parentObjId="15" parentObjType="connection" what="port">
+      <port id="31" moduleId="20" moduleName="VTKCell" sig="AddRenderer(vtkRenderer)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:14" id="337" prevId="336" user="stew">
+    <add id="365" objectId="16" parentObjId="" parentObjType="" what="connection">
+      <connection id="16"/>
+    </add>
+    <add id="366" objectId="32" parentObjId="16" parentObjType="connection" what="port">
+      <port id="32" moduleId="22" moduleName="vtkDataSetReader" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+    <add id="367" objectId="33" parentObjId="16" parentObjType="connection" what="port">
+      <port id="33" moduleId="21" moduleName="vtkDataSetMapper" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:15" id="338" prevId="337" user="stew">
+    <add id="368" objectId="17" parentObjId="" parentObjType="" what="connection">
+      <connection id="17"/>
+    </add>
+    <add id="369" objectId="34" parentObjId="17" parentObjType="connection" what="port">
+      <port id="34" moduleId="21" moduleName="vtkDataSetMapper" sig="self(vtkDataSetMapper)" type="source"/>
+    </add>
+    <add id="370" objectId="35" parentObjId="17" parentObjType="connection" what="port">
+      <port id="35" moduleId="24" moduleName="vtkActor" sig="SetMapper(vtkMapper)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:15" id="339" prevId="338" user="stew">
+    <add id="371" objectId="18" parentObjId="" parentObjType="" what="connection">
+      <connection id="18"/>
+    </add>
+    <add id="372" objectId="36" parentObjId="18" parentObjType="connection" what="port">
+      <port id="36" moduleId="24" moduleName="vtkActor" sig="self(vtkActor)" type="source"/>
+    </add>
+    <add id="373" objectId="37" parentObjId="18" parentObjType="connection" what="port">
+      <port id="37" moduleId="23" moduleName="vtkRenderer" sig="AddActor(vtkProp)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:31:21" id="340" prevId="339" user="stew">
+    <change id="374" newObjId="115" oldObjId="114" parentObjId="16" parentObjType="function" what="parameter">
+      <parameter alias="" id="115" name="<no description>" pos="0" type="String" val="../examples/data/torus.vtk"/>
+    </change>
+  </action>
+  <action date="2007-03-06 17:31:22" id="341" prevId="340" user="stew">
+    <change id="375" newObjId="116" oldObjId="115" parentObjId="16" parentObjType="function" what="parameter">
+      <parameter alias="" id="116" name="<no description>" pos="0" type="String" val="../examples/data/torus.vtk"/>
+    </change>
+  </action>
+  <action date="2007-03-06 17:38:56" id="342" prevId="341" user="stew">
+    <change id="376" newObjId="107" oldObjId="97" parentObjId="0" parentObjType="module" what="location">
+      <location id="107" x="-865.654230156" y="460.815324731"/>
+    </change>
+    <change id="377" newObjId="108" oldObjId="98" parentObjId="1" parentObjType="module" what="location">
+      <location id="108" x="-889.348602863" y="341.534434574"/>
+    </change>
+    <change id="378" newObjId="109" oldObjId="99" parentObjId="2" parentObjType="module" what="location">
+      <location id="109" x="-910.107942888" y="158.605820025"/>
+    </change>
+    <change id="379" newObjId="110" oldObjId="100" parentObjId="3" parentObjType="module" what="location">
+      <location id="110" x="-872.526528392" y="36.4161698535"/>
+    </change>
+    <change id="380" newObjId="111" oldObjId="101" parentObjId="7" parentObjType="module" what="location">
+      <location id="111" x="-832.730622934" y="-125.984046271"/>
+    </change>
+    <change id="381" newObjId="112" oldObjId="102" parentObjId="20" parentObjType="module" what="location">
+      <location id="112" x="-497.181193704" y="-121.483192035"/>
+    </change>
+    <change id="382" newObjId="113" oldObjId="103" parentObjId="21" parentObjType="module" what="location">
+      <location id="113" x="-553.799173633" y="346.03528881"/>
+    </change>
+    <change id="383" newObjId="114" oldObjId="104" parentObjId="22" parentObjType="module" what="location">
+      <location id="114" x="-530.104800926" y="465.316178967"/>
+    </change>
+    <change id="384" newObjId="115" oldObjId="105" parentObjId="23" parentObjType="module" what="location">
+      <location id="115" x="-536.977099162" y="40.9170240895"/>
+    </change>
+    <change id="385" newObjId="116" oldObjId="106" parentObjId="24" parentObjType="module" what="location">
+      <location id="116" x="-574.558513658" y="163.106674262"/>
+    </change>
+  </action>
+  <action date="2007-03-06 17:38:57" id="343" prevId="342" user="stew">
+    <add id="386" objectId="25" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="25" name="MplPlot"/>
+    </add>
+    <add id="387" objectId="117" parentObjId="25" parentObjType="module" what="location">
+      <location id="117" x="-361.0" y="199.0"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:57" id="344" prevId="343" user="stew">
+    <add id="388" objectId="26" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="26" name="MplFigureCell"/>
+    </add>
+    <add id="389" objectId="118" parentObjId="26" parentObjType="module" what="location">
+      <location id="118" x="37.0688549561" y="-60.0259508645"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:57" id="345" prevId="344" user="stew">
+    <add id="390" objectId="27" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="27" name="MplPlot"/>
+    </add>
+    <add id="391" objectId="119" parentObjId="27" parentObjType="module" what="location">
+      <location id="119" x="-210.08155986" y="198.305077955"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:58" id="346" prevId="345" user="stew">
+    <add id="392" objectId="28" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="28" name="MplPlot"/>
+    </add>
+    <add id="393" objectId="120" parentObjId="28" parentObjType="module" what="location">
+      <location id="120" x="-104.504769347" y="212.057733157"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:58" id="347" prevId="346" user="stew">
+    <add id="394" objectId="29" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="29" name="MplPlot"/>
+    </add>
+    <add id="395" objectId="121" parentObjId="29" parentObjType="module" what="location">
+      <location id="121" x="-305.0" y="279.0"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:58" id="348" prevId="347" user="stew">
+    <add id="396" objectId="30" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="30" name="MplFigure"/>
+    </add>
+    <add id="397" objectId="122" parentObjId="30" parentObjType="module" what="location">
+      <location id="122" x="-202.707626949" y="33.3776401774"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="349" prevId="348" user="stew">
+    <add id="398" objectId="31" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="31" name="MplFigure"/>
+    </add>
+    <add id="399" objectId="123" parentObjId="31" parentObjType="module" what="location">
+      <location id="123" x="-2.3575207408" y="92.971924974"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="350" prevId="349" user="stew">
+    <add id="400" objectId="32" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="32" name="MplFigureCell"/>
+    </add>
+    <add id="401" objectId="124" parentObjId="32" parentObjType="module" what="location">
+      <location id="124" x="-200.077852594" y="-92.979339507"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="351" prevId="350" user="stew">
+    <add id="402" objectId="17" parentObjId="25" parentObjType="module" what="function">
+      <function id="17" name="source" pos="0"/>
+    </add>
+    <add id="403" objectId="117" parentObjId="17" parentObjType="function" what="parameter">
+      <parameter alias="" id="117" name="<no description>" pos="0" type="String" val="subplot%28212%29%0A%0Adashes%20%3D%20%5B5%2C2%2C10%2C5%5D%20%23%205%20points%20on%2C%202%20off%2C%203%20on%2C%201%20off%0A%0Al%2C%20%3D%20plot%28arange%2820%29%2C%20%27--%27%29%0Al.set_dashes%28dashes%29%0A"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="352" prevId="351" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="353" prevId="352" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="354" prevId="353" user="stew">
+    <add id="404" objectId="18" parentObjId="27" parentObjType="module" what="function">
+      <function id="18" name="source" pos="0"/>
+    </add>
+    <add id="405" objectId="118" parentObjId="18" parentObjType="function" what="parameter">
+      <parameter alias="" id="118" name="<no description>" pos="0" type="String" val="subplot%28221%29%0A%0A%0AN%20%3D%205%0AmenMeans%20%3D%20%2820%2C%2035%2C%2030%2C%2035%2C%2027%29%0AmenStd%20%3D%20%20%20%282%2C%203%2C%204%2C%201%2C%202%29%0A%0Aind%20%3D%20arange%28N%29%20%20%23%20the%20x%20locations%20for%20the%20groups%0Awidth%20%3D%200.35%20%20%20%20%20%20%20%23%20the%20width%20of%20the%20bars%0Ap1%20%3D%20bar%28ind%2C%20menMeans%2C%20width%2C%20color%3D%27r%27%2C%20yerr%3Dmen [...]
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="355" prevId="354" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="356" prevId="355" user="stew">
+    <add id="406" objectId="19" parentObjId="28" parentObjType="module" what="function">
+      <function id="19" name="source" pos="0"/>
+    </add>
+    <add id="407" objectId="119" parentObjId="19" parentObjType="function" what="parameter">
+      <parameter alias="" id="119" name="<no description>" pos="0" type="String" val="import%20matplotlib.axes3d%20as%20axes3d%0A%0Afig%20%3D%20gcf%28%29%0A%0Aax3d%20%3D%20axes3d.Axes3D%28fig%29%0Aplt%20%3D%20fig.axes.append%28ax3d%29%0A%0Adelta%20%3D%20pi%20/%20199.0%0Au%20%3D%20arange%280%2C%202%2Api%2B%28delta%2A2%29%2C%20delta%2A2%29%0Av%20%3D%20arange%280%2C%20pi%2Bdelta%2C%20delta%29%0A%0Ax%20%3D%20outer%28cos%28u%29%2Csin%28v%29%29%0Ay%20%3D%20outer%28sin%28u%29%2Csin%28v%29 [...]
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="357" prevId="356" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="358" prevId="357" user="stew">
+    <add id="408" objectId="20" parentObjId="29" parentObjType="module" what="function">
+      <function id="20" name="source" pos="0"/>
+    </add>
+    <add id="409" objectId="120" parentObjId="20" parentObjType="function" what="parameter">
+      <parameter alias="" id="120" name="<no description>" pos="0" type="String" val="subplot%28222%29%0Amu%2C%20sigma%20%3D%20100%2C%2015%0Ax%20%3D%20mu%20%2B%20sigma%2Arandn%2810000%29%0A%0A%23%20the%20histogram%20of%20the%20data%0An%2C%20bins%2C%20patches%20%3D%20hist%28x%2C%2050%2C%20normed%3D1%29%0Asetp%28patches%2C%20%27facecolor%27%2C%20%27g%27%2C%20%27alpha%27%2C%200.75%29%0A%0A%23%20add%20a%20%27best%20fit%27%20line%0Ay%20%3D%20normpdf%28%20bins%2C%20mu%2C%20sigma%29%0Al%2 [...]
+    </add>
+  </action>
+  <action date="2007-03-06 17:38:59" id="359" prevId="358" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="360" prevId="359" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="361" prevId="360" user="stew"/>
+  <action date="2007-03-06 17:38:59" id="362" prevId="361" user="stew"/>
+  <action date="2007-03-06 17:39:00" id="363" prevId="362" user="stew">
+    <add id="410" objectId="19" parentObjId="" parentObjType="" what="connection">
+      <connection id="19"/>
+    </add>
+    <add id="411" objectId="38" parentObjId="19" parentObjType="connection" what="port">
+      <port id="38" moduleId="25" moduleName="MplPlot" sig="source(String)" type="source"/>
+    </add>
+    <add id="412" objectId="39" parentObjId="19" parentObjType="connection" what="port">
+      <port id="39" moduleId="30" moduleName="MplFigure" sig="Script(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:39:00" id="364" prevId="363" user="stew">
+    <add id="413" objectId="20" parentObjId="" parentObjType="" what="connection">
+      <connection id="20"/>
+    </add>
+    <add id="414" objectId="40" parentObjId="20" parentObjType="connection" what="port">
+      <port id="40" moduleId="31" moduleName="MplFigure" sig="FigureManager(MplFigureManager)" type="source"/>
+    </add>
+    <add id="415" objectId="41" parentObjId="20" parentObjType="connection" what="port">
+      <port id="41" moduleId="26" moduleName="MplFigureCell" sig="FigureManager(MplFigureManager)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:39:01" id="365" prevId="364" user="stew">
+    <add id="416" objectId="21" parentObjId="" parentObjType="" what="connection">
+      <connection id="21"/>
+    </add>
+    <add id="417" objectId="42" parentObjId="21" parentObjType="connection" what="port">
+      <port id="42" moduleId="27" moduleName="MplPlot" sig="source(String)" type="source"/>
+    </add>
+    <add id="418" objectId="43" parentObjId="21" parentObjType="connection" what="port">
+      <port id="43" moduleId="30" moduleName="MplFigure" sig="Script(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:39:01" id="366" prevId="365" user="stew">
+    <add id="419" objectId="22" parentObjId="" parentObjType="" what="connection">
+      <connection id="22"/>
+    </add>
+    <add id="420" objectId="44" parentObjId="22" parentObjType="connection" what="port">
+      <port id="44" moduleId="28" moduleName="MplPlot" sig="source(String)" type="source"/>
+    </add>
+    <add id="421" objectId="45" parentObjId="22" parentObjType="connection" what="port">
+      <port id="45" moduleId="31" moduleName="MplFigure" sig="Script(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:39:01" id="367" prevId="366" user="stew">
+    <add id="422" objectId="23" parentObjId="" parentObjType="" what="connection">
+      <connection id="23"/>
+    </add>
+    <add id="423" objectId="46" parentObjId="23" parentObjType="connection" what="port">
+      <port id="46" moduleId="29" moduleName="MplPlot" sig="source(String)" type="source"/>
+    </add>
+    <add id="424" objectId="47" parentObjId="23" parentObjType="connection" what="port">
+      <port id="47" moduleId="30" moduleName="MplFigure" sig="Script(String)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-06 17:39:02" id="368" prevId="367" user="stew">
+    <add id="425" objectId="24" parentObjId="" parentObjType="" what="connection">
+      <connection id="24"/>
+    </add>
+    <add id="426" objectId="48" parentObjId="24" parentObjType="connection" what="port">
+      <port id="48" moduleId="30" moduleName="MplFigure" sig="FigureManager(MplFigureManager)" type="source"/>
+    </add>
+    <add id="427" objectId="49" parentObjId="24" parentObjType="connection" what="port">
+      <port id="49" moduleId="32" moduleName="MplFigureCell" sig="FigureManager(MplFigureManager)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:54:16" id="369" prevId="192" user="cscheid">
+    <add id="320" objectId="0" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="0" key="foo" value=""/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:54:18" id="370" prevId="369" user="cscheid">
+    <change id="321" newObjId="1" oldObjId="0" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="1" key="foo" value="bar"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:54:23" id="371" prevId="370" user="cscheid">
+    <add id="322" objectId="2" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="2" key="foo2" value=""/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:54:24" id="372" prevId="371" user="cscheid">
+    <change id="323" newObjId="3" oldObjId="2" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="3" key="foo2" value="bar4"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:54:27" id="373" prevId="372" user="cscheid">
+    <change id="324" newObjId="4" oldObjId="1" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="4" key="foo" value="bar3"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:54:30" id="374" prevId="373" user="cscheid">
+    <change id="325" newObjId="5" oldObjId="3" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="5" key="foo2" value="bar"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:54:33" id="375" prevId="374" user="cscheid">
+    <change id="326" newObjId="6" oldObjId="4" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="6" key="foo" value="bar"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:54:43" id="376" prevId="375" user="cscheid">
+    <change id="327" newObjId="7" oldObjId="6" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="7" key="foo" value=""/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:54:45" id="377" prevId="376" user="cscheid"/>
+  <action date="2007-03-22 16:55:01" id="378" prevId="377" user="cscheid">
+    <change id="328" newObjId="93" oldObjId="90" parentObjId="0" parentObjType="module" what="location">
+      <location id="93" x="-212.321945021" y="406.467387988"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:55:01" id="379" prevId="378" user="cscheid">
+    <change id="329" newObjId="8" oldObjId="5" parentObjId="0" parentObjType="module" what="annotation">
+      <annotation id="8" key="foo2" value="asd"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:55:13" id="380" prevId="379" user="cscheid">
+    <change id="330" newObjId="94" oldObjId="93" parentObjId="0" parentObjType="module" what="location">
+      <location id="94" x="-209.818498227" y="410.222558179"/>
+    </change>
+    <change id="331" newObjId="95" oldObjId="91" parentObjId="19" parentObjType="module" what="location">
+      <location id="95" x="-242.69700094" y="556.575742513"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:55:13" id="381" prevId="380" user="cscheid">
+    <add id="332" objectId="14" parentObjId="19" parentObjType="module" what="function">
+      <function id="14" name="value" pos="1"/>
+    </add>
+    <add id="333" objectId="111" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="111" name="<no description>" pos="0" type="String" val=""/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:55:15" id="382" prevId="381" user="cscheid">
+    <change id="334" newObjId="112" oldObjId="111" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="112" name="<no description>" pos="0" type="String" val="123"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:55:16" id="383" prevId="382" user="cscheid">
+    <change id="335" newObjId="113" oldObjId="112" parentObjId="14" parentObjType="function" what="parameter">
+      <parameter alias="" id="113" name="<no description>" pos="0" type="String" val="123"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:55:17" id="384" prevId="383" user="cscheid">
+    <delete id="336" objectId="113" parentObjId="14" parentObjType="function" what="parameter"/>
+    <delete id="337" objectId="14" parentObjId="19" parentObjType="module" what="function"/>
+  </action>
+  <action date="2007-03-22 16:55:22" id="385" prevId="384" user="cscheid"/>
+  <action date="2007-03-22 16:58:31" id="386" prevId="385" user="cscheid">
+    <add id="338" objectId="9" parentObjId="2" parentObjType="module" what="annotation">
+      <annotation id="9" key="foo" value=""/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:58:32" id="387" prevId="386" user="cscheid">
+    <change id="339" newObjId="10" oldObjId="9" parentObjId="2" parentObjType="module" what="annotation">
+      <annotation id="10" key="foo" value="bar"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:58:34" id="388" prevId="387" user="cscheid"/>
+  <action date="2007-03-22 16:58:34" id="389" prevId="388" user="cscheid">
+    <add id="340" objectId="11" parentObjId="2" parentObjType="module" what="annotation">
+      <annotation id="11" key="2" value="bar"/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:58:41" id="390" prevId="389" user="cscheid">
+    <change id="341" newObjId="96" oldObjId="24" parentObjId="3" parentObjType="module" what="location">
+      <location id="96" x="-230.460112232" y="-11.4334776796"/>
+    </change>
+  </action>
+  <action date="2007-03-22 16:58:41" id="391" prevId="390" user="cscheid"/>
+  <action date="2007-03-22 16:58:42" id="392" prevId="391" user="cscheid">
+    <add id="342" objectId="12" parentObjId="2" parentObjType="module" what="annotation">
+      <annotation id="12" key="foo3" value="bar"/>
+    </add>
+  </action>
+  <action date="2007-03-22 16:58:47" id="393" prevId="392" user="cscheid">
+    <change id="343" newObjId="13" oldObjId="12" parentObjId="2" parentObjType="module" what="annotation">
+      <annotation id="13" key="foo3" value="baz"/>
+    </change>
+  </action>
+  <action date="2007-07-23 10:06:48" id="394" prevId="0" user="cscheid">
+    <add id="976" objectId="61" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="61" name="vtkQuadric"/>
+    </add>
+    <add id="977" objectId="40" parentObjId="61" parentObjType="module" what="function">
+      <function id="40" name="SetCoefficients" pos="0"/>
+    </add>
+    <add id="978" objectId="354" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="354" name="<no description>" pos="9" type="Float" val="0"/>
+    </add>
+    <add id="979" objectId="355" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="355" name="<no description>" pos="8" type="Float" val="0"/>
+    </add>
+    <add id="980" objectId="356" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="356" name="<no description>" pos="7" type="Float" val="0.2"/>
+    </add>
+    <add id="981" objectId="357" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="357" name="<no description>" pos="6" type="Float" val="0"/>
+    </add>
+    <add id="982" objectId="358" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="358" name="<no description>" pos="5" type="Float" val="0"/>
+    </add>
+    <add id="983" objectId="359" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="359" name="<no description>" pos="4" type="Float" val="0.1"/>
+    </add>
+    <add id="984" objectId="360" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="360" name="<no description>" pos="3" type="Float" val="0"/>
+    </add>
+    <add id="985" objectId="361" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="361" name="<no description>" pos="2" type="Float" val="0.2"/>
+    </add>
+    <add id="986" objectId="362" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="362" name="<no description>" pos="1" type="Float" val="1"/>
+    </add>
+    <add id="987" objectId="363" parentObjId="40" parentObjType="function" what="parameter">
+      <parameter alias="" id="363" name="<no description>" pos="0" type="Float" val="0.5"/>
+    </add>
+    <add id="988" objectId="238" parentObjId="61" parentObjType="module" what="location">
+      <location id="238" x="16.9073494638" y="236.244141342"/>
+    </add>
+    <add id="989" objectId="62" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="62" name="vtkSampleFunction"/>
+    </add>
+    <add id="990" objectId="41" parentObjId="62" parentObjType="module" what="function">
+      <function id="41" name="SetSampleDimensions" pos="0"/>
+    </add>
+    <add id="991" objectId="364" parentObjId="41" parentObjType="function" what="parameter">
+      <parameter alias="" id="364" name="<no description>" pos="2" type="Integer" val="50"/>
+    </add>
+    <add id="992" objectId="365" parentObjId="41" parentObjType="function" what="parameter">
+      <parameter alias="" id="365" name="<no description>" pos="1" type="Integer" val="50"/>
+    </add>
+    <add id="993" objectId="366" parentObjId="41" parentObjType="function" what="parameter">
+      <parameter alias="" id="366" name="<no description>" pos="0" type="Integer" val="50"/>
+    </add>
+    <add id="994" objectId="240" parentObjId="62" parentObjType="module" what="location">
+      <location id="240" x="-0.0966266787" y="131.159504458"/>
+    </add>
+    <add id="995" objectId="63" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="63" name="vtkContourFilter"/>
+    </add>
+    <add id="996" objectId="42" parentObjId="63" parentObjType="module" what="function">
+      <function id="42" name="GenerateValues" pos="0"/>
+    </add>
+    <add id="997" objectId="367" parentObjId="42" parentObjType="function" what="parameter">
+      <parameter alias="" id="367" name="<no description>" pos="2" type="Float" val="1.2"/>
+    </add>
+    <add id="998" objectId="368" parentObjId="42" parentObjType="function" what="parameter">
+      <parameter alias="" id="368" name="<no description>" pos="1" type="Float" val="0"/>
+    </add>
+    <add id="999" objectId="369" parentObjId="42" parentObjType="function" what="parameter">
+      <parameter alias="" id="369" name="<no description>" pos="0" type="Integer" val="5"/>
+    </add>
+    <add id="1000" objectId="242" parentObjId="63" parentObjType="module" what="location">
+      <location id="242" x="176.033395908" y="24.5840153417"/>
+    </add>
+    <add id="1001" objectId="65" parentObjId="" parentObjType="" what="connection">
+      <connection id="65"/>
+    </add>
+    <add id="1002" objectId="130" parentObjId="65" parentObjType="connection" what="port">
+      <port id="130" moduleId="62" moduleName="vtkSampleFunction" sig="SetImplicitFunction(vtkImplicitFunction)" type="destination"/>
+    </add>
+    <add id="1003" objectId="131" parentObjId="65" parentObjType="connection" what="port">
+      <port id="131" moduleId="61" moduleName="vtkQuadric" sig="self(vtkQuadric)" type="source"/>
+    </add>
+    <add id="1004" objectId="66" parentObjId="" parentObjType="" what="connection">
+      <connection id="66"/>
+    </add>
+    <add id="1005" objectId="132" parentObjId="66" parentObjType="connection" what="port">
+      <port id="132" moduleId="63" moduleName="vtkContourFilter" sig="SetInputConnection0(vtkAlgorithmOutput)" type="destination"/>
+    </add>
+    <add id="1006" objectId="133" parentObjId="66" parentObjType="connection" what="port">
+      <port id="133" moduleId="62" moduleName="vtkSampleFunction" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:06:54" id="395" prevId="394" user="cscheid">
+    <add id="1007" objectId="64" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="64" name="vtkDataSetWriter"/>
+    </add>
+    <add id="1008" objectId="244" parentObjId="64" parentObjType="module" what="location">
+      <location id="244" x="89.5819273347" y="-213.890488902"/>
+    </add>
+    <add id="1009" objectId="65" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="65" name="File"/>
+    </add>
+    <add id="1010" objectId="43" parentObjId="65" parentObjType="module" what="function">
+      <function id="43" name="name" pos="1"/>
+    </add>
+    <add id="1011" objectId="370" parentObjId="43" parentObjType="function" what="parameter">
+      <parameter alias="" id="370" name="<no description>" pos="0" type="String" val="/tmp/foobar.vtk"/>
+    </add>
+    <add id="1012" objectId="44" parentObjId="65" parentObjType="module" what="function">
+      <function id="44" name="create_file" pos="0"/>
+    </add>
+    <add id="1013" objectId="371" parentObjId="44" parentObjType="function" what="parameter">
+      <parameter alias="" id="371" name="<no description>" pos="0" type="Boolean" val="True"/>
+    </add>
+    <add id="1014" objectId="246" parentObjId="65" parentObjType="module" what="location">
+      <location id="246" x="-98.231421175" y="-95.048144082"/>
+    </add>
+    <add id="1015" objectId="67" parentObjId="" parentObjType="" what="connection">
+      <connection id="67"/>
+    </add>
+    <add id="1016" objectId="134" parentObjId="67" parentObjType="connection" what="port">
+      <port id="134" moduleId="65" moduleName="File" sig="self(File)" type="source"/>
+    </add>
+    <add id="1017" objectId="135" parentObjId="67" parentObjType="connection" what="port">
+      <port id="135" moduleId="64" moduleName="vtkDataWriter" sig="SetFile(File)" type="destination"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:06:57" id="396" prevId="395" user="cscheid">
+    <add id="1018" objectId="68" parentObjId="" parentObjType="" what="connection">
+      <connection id="68"/>
+    </add>
+    <add id="1019" objectId="137" parentObjId="68" parentObjType="connection" what="port">
+      <port id="137" moduleId="64" moduleName="vtkAlgorithm" sig="AddInputConnection(Integer,vtkAlgorithmOutput)" type="destination"/>
+    </add>
+    <add id="1020" objectId="136" parentObjId="68" parentObjType="connection" what="port">
+      <port id="136" moduleId="63" moduleName="vtkContourFilter" sig="GetOutputPort0(vtkAlgorithmOutput)" type="source"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:07:34" id="397" prevId="396" user="cscheid">
+    <change id="1021" newObjId="247" oldObjId="244" parentObjId="64" parentObjType="module" what="location">
+      <location id="247" x="17.408877156" y="-143.286418075"/>
+    </change>
+    <change id="1022" newObjId="248" oldObjId="246" parentObjId="65" parentObjType="module" what="location">
+      <location id="248" x="-170.404471354" y="-24.444073255"/>
+    </change>
+    <change id="1023" newObjId="249" oldObjId="242" parentObjId="63" parentObjType="module" what="location">
+      <location id="249" x="52.0840271228" y="-0.519654285678"/>
+    </change>
+  </action>
+  <action date="2007-07-23 10:07:34" id="398" prevId="397" user="cscheid">
+    <delete id="1024" objectId="370" parentObjId="43" parentObjType="function" what="parameter"/>
+    <delete id="1025" objectId="43" parentObjId="65" parentObjType="module" what="function"/>
+  </action>
+  <action date="2007-07-23 10:07:42" id="399" prevId="398" user="cscheid">
+    <add id="1026" objectId="66" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="66" name="PythonSource"/>
+    </add>
+    <add id="1027" objectId="250" parentObjId="66" parentObjType="module" what="location">
+      <location id="250" x="-105.149148177" y="103.183743538"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:09:20" id="400" prevId="399" user="cscheid">
+    <change id="1028" newObjId="251" oldObjId="250" parentObjId="66" parentObjType="module" what="location">
+      <location id="251" x="-170.007501258" y="90.4086133859"/>
+    </change>
+  </action>
+  <action date="2007-07-23 10:09:20" id="401" prevId="400" user="cscheid">
+    <add id="1029" objectId="0" parentObjId="66" parentObjType="module" what="portSpec">
+      <portSpec id="0" name="filename" spec="(String)" type="output"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:09:20" id="402" prevId="401" user="cscheid">
+    <add id="1030" objectId="45" parentObjId="66" parentObjType="module" what="function">
+      <function id="45" name="source" pos="0"/>
+    </add>
+    <add id="1031" objectId="372" parentObjId="45" parentObjType="function" what="parameter">
+      <parameter alias="" id="372" name="<no description>" pos="0" type="String" val="import%20core.system%0Aimport%20os%0Areturn%20%28core.system.temporary_directory%28%29%20%2B%20%0A%20%20%20%20%20%20%20%20os.path.dir%20%2B%0A%20%20%20%20%20%20%20%20%27test_vtk_12345.vtk%27%29"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:09:22" id="403" prevId="402" user="cscheid">
+    <add id="1032" objectId="69" parentObjId="" parentObjType="" what="connection">
+      <connection id="69"/>
+    </add>
+    <add id="1033" objectId="139" parentObjId="69" parentObjType="connection" what="port">
+      <port id="139" moduleId="65" moduleName="File" sig="name(String)" type="destination"/>
+    </add>
+    <add id="1034" objectId="138" parentObjId="69" parentObjType="connection" what="port">
+      <port id="138" moduleId="66" moduleName="PythonSource" sig="filename(String)" type="source"/>
+    </add>
+  </action>
+  <action date="2007-07-23 10:09:45" id="404" prevId="403" user="cscheid">
+    <change id="1035" newObjId="252" oldObjId="251" parentObjId="66" parentObjType="module" what="location">
+      <location id="252" x="-168.042096619" y="56.9967345259"/>
+    </change>
+  </action>
+  <action date="2007-07-23 10:09:45" id="405" prevId="404" user="cscheid">
+    <change id="1036" newObjId="373" oldObjId="372" parentObjId="45" parentObjType="function" what="parameter">
+      <parameter alias="" id="373" name="<no description>" pos="0" type="String" val="import%20core.system%0Aimport%20os%0Afilename%20%3D%20%28core.system.temporary_directory%28%29%20%2B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20os.path.dir%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%27test_vtk_12345.vtk%27%29"/>
+    </change>
+  </action>
+  <action date="2007-07-23 10:09:57" id="406" prevId="405" user="cscheid">
+    <change id="1037" newObjId="374" oldObjId="373" parentObjId="45" parentObjType="function" what="parameter">
+      <parameter alias="" id="374" name="<no description>" pos="0" type="String" val="import%20core.system%0Aimport%20os%0Afilename%20%3D%20%28core.system.temporary_directory%28%29%20%2B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20os.path.sep%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%27test_vtk_12345.vtk%27%29"/>
+    </change>
+  </action>
+  <action date="2007-07-23 11:01:03" id="407" prevId="406" user="cscheid">
+    <delete id="1038" objectId="134" parentObjId="67" parentObjType="connection" what="port"/>
+    <delete id="1039" objectId="135" parentObjId="67" parentObjType="connection" what="port"/>
+    <delete id="1040" objectId="67" parentObjId="" parentObjType="" what="connection"/>
+    <delete id="1041" objectId="139" parentObjId="69" parentObjType="connection" what="port"/>
+    <delete id="1042" objectId="138" parentObjId="69" parentObjType="connection" what="port"/>
+    <delete id="1043" objectId="69" parentObjId="" parentObjType="" what="connection"/>
+    <delete id="1044" objectId="248" parentObjId="65" parentObjType="module" what="location"/>
+    <delete id="1045" objectId="371" parentObjId="44" parentObjType="function" what="parameter"/>
+    <delete id="1046" objectId="44" parentObjId="65" parentObjType="module" what="function"/>
+    <delete id="1047" objectId="65" parentObjId="" parentObjType="" what="module"/>
+  </action>
+  <action date="2007-07-23 11:01:09" id="408" prevId="407" user="cscheid">
+    <change id="1048" newObjId="253" oldObjId="252" parentObjId="66" parentObjType="module" what="location">
+      <location id="253" x="-185.896081002" y="-182.622529566"/>
+    </change>
+  </action>
+  <action date="2007-07-23 11:01:09" id="409" prevId="408" user="cscheid">
+    <add id="1049" objectId="67" parentObjId="" parentObjType="" what="module">
+      <module cache="1" id="67" name="FileSink"/>
+    </add>
+    <add id="1050" objectId="254" parentObjId="67" parentObjType="module" what="location">
+      <location id="254" x="-22.5524013263" y="-205.790662102"/>
+    </add>
+  </action>
+  <action date="2007-07-23 11:01:13" id="410" prevId="409" user="cscheid">
+    <change id="1051" newObjId="255" oldObjId="254" parentObjId="67" parentObjType="module" what="location">
+      <location id="255" x="-28.1905016579" y="-266.870082361"/>
+    </change>
+  </action>
+  <action date="2007-07-23 11:01:13" id="411" prevId="410" user="cscheid">
+    <add id="1052" objectId="70" parentObjId="" parentObjType="" what="connection">
+      <connection id="70"/>
+    </add>
+    <add id="1053" objectId="141" parentObjId="70" parentObjType="connection" what="port">
+      <port id="141" moduleId="67" moduleName="FileSink" sig="file(File)" type="destination"/>
+    </add>
+    <add id="1054" objectId="140" parentObjId="70" parentObjType="connection" what="port">
+      <port id="140" moduleId="64" moduleName="vtkWriter" sig="file(File)" type="source"/>
+    </add>
+  </action>
+  <action date="2007-07-23 11:01:15" id="412" prevId="411" user="cscheid">
+    <add id="1055" objectId="71" parentObjId="" parentObjType="" what="connection">
+      <connection id="71"/>
+    </add>
+    <add id="1056" objectId="143" parentObjId="71" parentObjType="connection" what="port">
+      <port id="143" moduleId="67" moduleName="FileSink" sig="outputName(String)" type="destination"/>
+    </add>
+    <add id="1057" objectId="142" parentObjId="71" parentObjType="connection" what="port">
+      <port id="142" moduleId="66" moduleName="PythonSource" sig="filename(String)" type="source"/>
+    </add>
+  </action>
+  <tag name="Four Cells" time="368"/>
+  <tag name="Implicit Plane Clipper" time="322"/>
+  <tag name="Hidden Port" time="182"/>
+  <tag name="Double Renderer" time="85"/>
+  <tag name="vtk_book_3rd_p189" time="215"/>
+  <tag name="writer_test_filesink" time="412"/>
+  <tag name="Single Renderer" time="43"/>
+  <tag name="writer_test" time="406"/>
+</vistrail>
diff --git a/vistrails/tests/resources/vtkfiles/vtk_quadric_writer_test.vtk b/vistrails/tests/resources/vtkfiles/vtk_quadric_writer_test.vtk
new file mode 100644
index 0000000..6da8f6f
--- /dev/null
+++ b/vistrails/tests/resources/vtkfiles/vtk_quadric_writer_test.vtk
@@ -0,0 +1,9001 @@
+# vtk DataFile Version 3.0
+vtk output
+ASCII
+DATASET POLYDATA
+POINTS 3318 float
+-1 0.918367 -0.967871 -0.959184 0.918367 -0.960159 -1 1 -1 
+-1 0.959184 -0.983936 -0.959184 0.959184 -0.976096 -0.918367 0.959184 -0.968379 
+-0.877551 0.959184 -0.960784 -0.959184 1 -0.992032 -0.918367 1 -0.98419 
+-0.877551 1 -0.976471 -0.836735 1 -0.968872 -0.795918 1 -0.96139 
+-1 0.795918 -0.920908 -1 0.836735 -0.936473 -0.959184 0.836735 -0.929241 
+-0.918367 0.836735 -0.922121 -1 0.896293 -0.959184 -1 0.877551 -0.952037 
+-0.959184 0.915868 -0.959184 -0.959184 0.877551 -0.944685 -0.918367 0.877551 -0.937446 
+-0.877551 0.877551 -0.930317 -0.836735 0.877551 -0.923296 -0.953973 0.918367 -0.959184 
+-0.918367 0.935444 -0.959184 -0.918367 0.918367 -0.952772 -0.877551 0.955019 -0.959184 
+-0.877551 0.918367 -0.945526 -0.836735 0.918367 -0.93839 -0.795918 0.918367 -0.931361 
+-0.755102 0.918367 -0.924437 -0.868867 0.959184 -0.959184 -0.836735 0.974594 -0.959184 
+-0.836735 0.959184 -0.953485 -0.795918 0.994169 -0.959184 -0.795918 0.959184 -0.946343 
+-0.755102 0.959184 -0.939307 -0.714286 0.959184 -0.932374 -0.673469 0.959184 -0.925544 
+-0.632653 0.959184 -0.918813 -0.78376 1 -0.959184 -0.755102 1 -0.954176 
+-0.714286 1 -0.947135 -0.673469 1 -0.940196 -0.632653 1 -0.933358 
+-0.591837 1 -0.926619 -0.55102 1 -0.919977 -1 0.714286 -0.890643 
+-0.959184 0.714286 -0.883972 -1 0.789254 -0.918367 -1 0.755102 -0.905737 
+-0.959184 0.755102 -0.898953 -0.918367 0.755102 -0.892269 -0.877551 0.755102 -0.885684 
+-0.836735 0.755102 -0.879196 -0.985488 0.795918 -0.918367 -0.959184 0.807997 -0.918367 
+-0.959184 0.795918 -0.913934 -0.918367 0.826739 -0.918367 -0.918367 0.795918 -0.907139 
+-0.877551 0.795918 -0.900444 -0.836735 0.795918 -0.893848 -0.795918 0.795918 -0.887347 
+-0.755102 0.795918 -0.88094 -0.896599 0.836735 -0.918367 -0.877551 0.845481 -0.918367 
+-0.877551 0.836735 -0.915204 -0.836735 0.864223 -0.918367 -0.836735 0.836735 -0.9085 
+-0.795918 0.836735 -0.901892 -0.755102 0.836735 -0.895381 -0.714286 0.836735 -0.888962 
+-0.673469 0.836735 -0.882635 -0.80771 0.877551 -0.918367 -0.795918 0.882965 -0.918367 
+-0.795918 0.877551 -0.916438 -0.755102 0.901708 -0.918367 -0.755102 0.877551 -0.909821 
+-0.714286 0.877551 -0.903299 -0.673469 0.877551 -0.89687 -0.632653 0.877551 -0.890531 
+-0.591837 0.877551 -0.884282 -0.55102 0.877551 -0.87812 -0.718821 0.918367 -0.918367 
+-0.714286 0.92045 -0.918367 -0.714286 0.918367 -0.917636 -0.673469 0.939192 -0.918367 
+-0.673469 0.918367 -0.911105 -0.632653 0.957934 -0.918367 -0.632653 0.918367 -0.904666 
+-0.591837 0.918367 -0.898317 -0.55102 0.918367 -0.892057 -0.510204 0.918367 -0.885884 
+-0.469388 0.918367 -0.879795 -0.629932 0.959184 -0.918367 -0.591837 0.976676 -0.918367 
+-0.591837 0.959184 -0.912352 -0.55102 0.995419 -0.918367 -0.55102 0.959184 -0.905994 
+-0.510204 0.959184 -0.899725 -0.469388 0.959184 -0.893541 -0.428571 0.959184 -0.887442 
+-0.387755 0.959184 -0.881425 -0.541043 1 -0.918367 -0.510204 1 -0.913565 
+-0.469388 1 -0.907287 -0.428571 1 -0.901094 -0.387755 1 -0.894984 
+-0.346939 1 -0.888958 -0.306122 1 -0.883011 -1 0.591837 -0.846303 
+-0.959184 0.591837 -0.840148 -1 0.632653 -0.860955 -0.959184 0.632653 -0.854694 
+-0.918367 0.632653 -0.848523 -0.877551 0.632653 -0.84244 -1 0.678884 -0.877551 
+-1 0.673469 -0.875607 -0.959184 0.696793 -0.877551 -0.959184 0.673469 -0.869239 
+-0.918367 0.673469 -0.862963 -0.877551 0.673469 -0.856777 -0.836735 0.673469 -0.850679 
+-0.795918 0.673469 -0.844667 -0.755102 0.673469 -0.83874 -0.919317 0.714286 -0.877551 
+-0.918367 0.714702 -0.877551 -0.918367 0.714286 -0.877404 -0.877551 0.732611 -0.877551 
+-0.877551 0.714286 -0.871114 -0.836735 0.750521 -0.877551 -0.836735 0.714286 -0.864914 
+-0.795918 0.714286 -0.858801 -0.755102 0.714286 -0.852775 -0.714286 0.714286 -0.846832 
+-0.673469 0.714286 -0.840972 -0.826293 0.755102 -0.877551 -0.795918 0.76843 -0.877551 
+-0.795918 0.755102 -0.872936 -0.755102 0.786339 -0.877551 -0.755102 0.755102 -0.86681 
+-0.714286 0.755102 -0.860769 -0.673469 0.755102 -0.854813 -0.632653 0.755102 -0.848938 
+-0.591837 0.755102 -0.843143 -0.55102 0.755102 -0.837426 -0.73327 0.795918 -0.877551 
+-0.714286 0.804248 -0.877551 -0.714286 0.795918 -0.874707 -0.673469 0.822157 -0.877551 
+-0.673469 0.795918 -0.868653 -0.632653 0.795918 -0.862683 -0.591837 0.795918 -0.856795 
+-0.55102 0.795918 -0.850986 -0.510204 0.795918 -0.845255 -0.469388 0.795918 -0.839601 
+-0.640247 0.836735 -0.877551 -0.632653 0.840067 -0.877551 -0.632653 0.836735 -0.876429 
+-0.591837 0.857976 -0.877551 -0.591837 0.836735 -0.870446 -0.55102 0.875885 -0.877551 
+-0.55102 0.836735 -0.864545 -0.510204 0.836735 -0.858723 -0.469388 0.836735 -0.852979 
+-0.428571 0.836735 -0.847312 -0.387755 0.836735 -0.841719 -0.547224 0.877551 -0.877551 
+-0.510204 0.893794 -0.877551 -0.510204 0.877551 -0.872191 -0.469388 0.911703 -0.877551 
+-0.469388 0.877551 -0.866357 -0.428571 0.877551 -0.860601 -0.387755 0.877551 -0.85492 
+-0.346939 0.877551 -0.849314 -0.306122 0.877551 -0.843781 -0.265306 0.877551 -0.83832 
+-0.4542 0.918367 -0.877551 -0.428571 0.929613 -0.877551 -0.428571 0.918367 -0.87389 
+-0.387755 0.947522 -0.877551 -0.387755 0.918367 -0.868122 -0.346939 0.918367 -0.862429 
+-0.306122 0.918367 -0.85681 -0.265306 0.918367 -0.851265 -0.22449 0.918367 -0.84579 
+-0.183673 0.918367 -0.840386 -0.361177 0.959184 -0.877551 -0.346939 0.965431 -0.877551 
+-0.346939 0.959184 -0.875544 -0.306122 0.98334 -0.877551 -0.306122 0.959184 -0.86984 
+-0.265306 0.959184 -0.86421 -0.22449 0.959184 -0.858652 -0.183673 0.959184 -0.853166 
+-0.142857 0.959184 -0.847749 -0.102041 0.959184 -0.8424 -0.0612245 0.959184 -0.837119 
+-0.268154 1 -0.877551 -0.265306 1 -0.877155 -0.22449 1 -0.871514 
+-0.183673 1 -0.865945 -0.142857 1 -0.860447 -0.102041 1 -0.855018 
+-0.0612245 1 -0.849658 -0.0204082 1 -0.844364 0.0204082 1 -0.839136 
+-1 0.469388 -0.803326 -0.959184 0.469388 -0.797649 -1 0.510204 -0.817561 
+-0.959184 0.510204 -0.811783 -0.918367 0.510204 -0.806087 -0.877551 0.510204 -0.800469 
+-1 0.565181 -0.836735 -1 0.55102 -0.831796 -0.959184 0.582257 -0.836735 
+-0.959184 0.55102 -0.825918 -0.918367 0.55102 -0.820122 -0.877551 0.55102 -0.814407 
+-0.836735 0.55102 -0.808771 -0.795918 0.55102 -0.803212 -0.755102 0.55102 -0.797729 
+-0.936287 0.591837 -0.836735 -0.918367 0.599334 -0.836735 -0.918367 0.591837 -0.834157 
+-0.877551 0.61641 -0.836735 -0.877551 0.591837 -0.828344 -0.836735 0.591837 -0.822611 
+-0.795918 0.591837 -0.816958 -0.755102 0.591837 -0.811381 -0.714286 0.591837 -0.80588 
+-0.673469 0.591837 -0.800454 -0.838726 0.632653 -0.836735 -0.836735 0.633486 -0.836735 
+-0.836735 0.632653 -0.836452 -0.795918 0.650562 -0.836735 -0.795918 0.632653 -0.830703 
+-0.755102 0.667638 -0.836735 -0.755102 0.632653 -0.825033 -0.714286 0.632653 -0.81944 
+-0.673469 0.632653 -0.813922 -0.632653 0.632653 -0.808477 -0.591837 0.632653 -0.803105 
+-0.55102 0.632653 -0.797804 -0.741165 0.673469 -0.836735 -0.714286 0.684715 -0.836735 
+-0.714286 0.673469 -0.832999 -0.673469 0.701791 -0.836735 -0.673469 0.673469 -0.82739 
+-0.632653 0.673469 -0.821855 -0.591837 0.673469 -0.816394 -0.55102 0.673469 -0.811006 
+-0.510204 0.673469 -0.805688 -0.469388 0.673469 -0.800439 -0.643604 0.714286 -0.836735 
+-0.632653 0.718867 -0.836735 -0.632653 0.714286 -0.835233 -0.591837 0.735943 -0.836735 
+-0.591837 0.714286 -0.829683 -0.55102 0.75302 -0.836735 -0.55102 0.714286 -0.824207 
+-0.510204 0.714286 -0.818802 -0.469388 0.714286 -0.813468 -0.428571 0.714286 -0.808203 
+-0.387755 0.714286 -0.803005 -0.346939 0.714286 -0.797874 -0.546043 0.755102 -0.836735 
+-0.510204 0.770096 -0.836735 -0.510204 0.755102 -0.831917 -0.469388 0.787172 -0.836735 
+-0.469388 0.755102 -0.826497 -0.428571 0.755102 -0.821148 -0.387755 0.755102 -0.815867 
+-0.346939 0.755102 -0.810654 -0.306122 0.755102 -0.805507 -0.265306 0.755102 -0.800425 
+-0.448482 0.795918 -0.836735 -0.428571 0.804248 -0.836735 -0.428571 0.795918 -0.834093 
+-0.387755 0.821324 -0.836735 -0.387755 0.795918 -0.828729 -0.346939 0.795918 -0.823434 
+-0.306122 0.795918 -0.818205 -0.265306 0.795918 -0.813043 -0.22449 0.795918 -0.807946 
+-0.183673 0.795918 -0.802912 -0.142857 0.795918 -0.79794 -0.350921 0.836735 -0.836735 
+-0.346939 0.838401 -0.836735 -0.346939 0.836735 -0.836213 -0.306122 0.855477 -0.836735 
+-0.306122 0.836735 -0.830904 -0.265306 0.872553 -0.836735 -0.265306 0.836735 -0.825661 
+-0.22449 0.836735 -0.820485 -0.183673 0.836735 -0.815373 -0.142857 0.836735 -0.810324 
+-0.102041 0.836735 -0.805338 -0.0612245 0.836735 -0.800412 -0.25336 0.877551 -0.836735 
+-0.22449 0.889629 -0.836735 -0.22449 0.877551 -0.833024 -0.183673 0.906706 -0.836735 
+-0.183673 0.877551 -0.827834 -0.142857 0.877551 -0.822708 -0.102041 0.877551 -0.817645 
+-0.0612245 0.877551 -0.812644 -0.0204082 0.877551 -0.807704 0.0204082 0.877551 -0.802824 
+0.0612245 0.877551 -0.798002 -0.155799 0.918367 -0.836735 -0.142857 0.923782 -0.836735 
+-0.142857 0.918367 -0.835092 -0.102041 0.940858 -0.836735 -0.102041 0.918367 -0.829953 
+-0.0612245 0.957934 -0.836735 -0.0612245 0.918367 -0.824877 -0.0204082 0.918367 -0.819862 
+0.0204082 0.918367 -0.814908 0.0612245 0.918367 -0.810014 0.102041 0.918367 -0.805178 
+0.142857 0.918367 -0.8004 -0.0582379 0.959184 -0.836735 -0.0204082 0.97501 -0.836735 
+-0.0204082 0.959184 -0.83202 0.0204082 0.992087 -0.836735 0.0204082 0.959184 -0.826993 
+0.0612245 0.959184 -0.822026 0.102041 0.959184 -0.817118 0.142857 0.959184 -0.812269 
+0.183673 0.959184 -0.807477 0.22449 0.959184 -0.802741 0.265306 0.959184 -0.79806 
+0.039323 1 -0.836735 0.0612245 1 -0.834038 0.102041 1 -0.829059 
+0.142857 1 -0.824139 0.183673 1 -0.819276 0.22449 1 -0.814471 
+0.265306 1 -0.809722 0.306122 1 -0.805028 0.346939 1 -0.800388 
+-1 0.346939 -0.761599 -0.959184 0.346939 -0.756364 -1 0.387755 -0.77544 
+-0.959184 0.387755 -0.77011 -0.918367 0.387755 -0.764853 -0.877551 0.387755 -0.759668 
+-1 0.448147 -0.795918 -1 0.428571 -0.78928 -0.959184 0.46439 -0.795918 
+-0.959184 0.428571 -0.783856 -0.918367 0.428571 -0.778505 -0.877551 0.428571 -0.773227 
+-0.836735 0.428571 -0.76802 -0.795918 0.428571 -0.762883 -0.755102 0.428571 -0.757814 
+-0.946625 0.469388 -0.795918 -0.918367 0.480633 -0.795918 -0.918367 0.469388 -0.792157 
+-0.877551 0.496876 -0.795918 -0.877551 0.469388 -0.786787 -0.836735 0.469388 -0.781488 
+-0.795918 0.469388 -0.776261 -0.755102 0.469388 -0.771103 -0.714286 0.469388 -0.766013 
+-0.673469 0.469388 -0.76099 -0.632653 0.469388 -0.756033 -0.844061 0.510204 -0.795918 
+-0.836735 0.51312 -0.795918 -0.836735 0.510204 -0.794956 -0.795918 0.529363 -0.795918 
+-0.795918 0.510204 -0.789639 -0.755102 0.545606 -0.795918 -0.755102 0.510204 -0.784392 
+-0.714286 0.510204 -0.779215 -0.673469 0.510204 -0.774105 -0.632653 0.510204 -0.769062 
+-0.591837 0.510204 -0.764084 -0.55102 0.510204 -0.759171 -0.741497 0.55102 -0.795918 
+-0.714286 0.561849 -0.795918 -0.714286 0.55102 -0.792416 -0.673469 0.578092 -0.795918 
+-0.673469 0.55102 -0.78722 -0.632653 0.55102 -0.782091 -0.591837 0.55102 -0.777029 
+-0.55102 0.55102 -0.772032 -0.510204 0.55102 -0.767099 -0.469388 0.55102 -0.762229 
+-0.428571 0.55102 -0.75742 -0.638932 0.591837 -0.795918 -0.632653 0.594336 -0.795918 
+-0.632653 0.591837 -0.795121 -0.591837 0.610579 -0.795918 -0.591837 0.591837 -0.789974 
+-0.55102 0.626822 -0.795918 -0.55102 0.591837 -0.784894 -0.510204 0.591837 -0.779879 
+-0.469388 0.591837 -0.774927 -0.428571 0.591837 -0.770038 -0.387755 0.591837 -0.76521 
+-0.346939 0.591837 -0.760442 -0.306122 0.591837 -0.755734 -0.536368 0.632653 -0.795918 
+-0.510204 0.643065 -0.795918 -0.510204 0.632653 -0.792658 -0.469388 0.659309 -0.795918 
+-0.469388 0.632653 -0.787626 -0.428571 0.632653 -0.782656 -0.387755 0.632653 -0.777749 
+-0.346939 0.632653 -0.772904 -0.306122 0.632653 -0.768118 -0.265306 0.632653 -0.763391 
+-0.22449 0.632653 -0.758722 -0.433804 0.673469 -0.795918 -0.428571 0.675552 -0.795918 
+-0.428571 0.673469 -0.795275 -0.387755 0.691795 -0.795918 -0.387755 0.673469 -0.790289 
+-0.346939 0.708038 -0.795918 -0.346939 0.673469 -0.785365 -0.306122 0.673469 -0.780502 
+-0.265306 0.673469 -0.775699 -0.22449 0.673469 -0.770954 -0.183673 0.673469 -0.766268 
+-0.142857 0.673469 -0.761638 -0.102041 0.673469 -0.757063 -0.33124 0.714286 -0.795918 
+-0.306122 0.724282 -0.795918 -0.306122 0.714286 -0.792886 -0.265306 0.740525 -0.795918 
+-0.265306 0.714286 -0.788006 -0.22449 0.714286 -0.783187 -0.183673 0.714286 -0.778426 
+-0.142857 0.714286 -0.773722 -0.102041 0.714286 -0.769075 -0.0612245 0.714286 -0.764484 
+-0.0204082 0.714286 -0.759947 0.0204082 0.714286 -0.755463 -0.228676 0.755102 -0.795918 
+-0.22449 0.756768 -0.795918 -0.22449 0.755102 -0.795419 -0.183673 0.773011 -0.795918 
+-0.183673 0.755102 -0.790584 -0.142857 0.789254 -0.795918 -0.142857 0.755102 -0.785807 
+-0.102041 0.755102 -0.781087 -0.0612245 0.755102 -0.776424 -0.0204082 0.755102 -0.771816 
+0.0204082 0.755102 -0.767263 0.0612245 0.755102 -0.762763 0.102041 0.755102 -0.758315 
+-0.126112 0.795918 -0.795918 -0.102041 0.805498 -0.795918 -0.102041 0.795918 -0.793099 
+-0.0612245 0.821741 -0.795918 -0.0612245 0.795918 -0.788364 -0.0204082 0.795918 -0.783686 
+0.0204082 0.795918 -0.779062 0.0612245 0.795918 -0.774493 0.102041 0.795918 -0.769977 
+0.142857 0.795918 -0.765513 0.183673 0.795918 -0.761101 0.22449 0.795918 -0.756739 
+-0.0235479 0.836735 -0.795918 -0.0204082 0.837984 -0.795918 -0.0204082 0.836735 -0.795555 
+0.0204082 0.854227 -0.795918 0.0204082 0.836735 -0.790861 0.0612245 0.870471 -0.795918 
+0.0612245 0.836735 -0.786223 0.102041 0.836735 -0.781639 0.142857 0.836735 -0.777107 
+0.183673 0.836735 -0.772628 0.22449 0.836735 -0.768201 0.265306 0.836735 -0.763823 
+0.306122 0.836735 -0.759496 0.346939 0.836735 -0.755217 0.0790162 0.877551 -0.795918 
+0.102041 0.886714 -0.795918 0.102041 0.877551 -0.7933 0.142857 0.902957 -0.795918 
+0.142857 0.877551 -0.788702 0.183673 0.877551 -0.784156 0.22449 0.877551 -0.779662 
+0.265306 0.877551 -0.77522 0.306122 0.877551 -0.770827 0.346939 0.877551 -0.766485 
+0.387755 0.877551 -0.762191 0.428571 0.877551 -0.757944 0.18158 0.918367 -0.795918 
+0.183673 0.9192 -0.795918 0.183673 0.918367 -0.795683 0.22449 0.935444 -0.795918 
+0.22449 0.918367 -0.791123 0.265306 0.951687 -0.795918 0.265306 0.918367 -0.786615 
+0.306122 0.918367 -0.782159 0.346939 0.918367 -0.777752 0.387755 0.918367 -0.773395 
+0.428571 0.918367 -0.769086 0.469388 0.918367 -0.764826 0.510204 0.918367 -0.760612 
+0.55102 0.918367 -0.756444 0.284144 0.959184 -0.795918 0.306122 0.96793 -0.795918 
+0.306122 0.959184 -0.79349 0.346939 0.984173 -0.795918 0.346939 0.959184 -0.78902 
+0.387755 0.959184 -0.7846 0.428571 0.959184 -0.780229 0.469388 0.959184 -0.775906 
+0.510204 0.959184 -0.771631 0.55102 0.959184 -0.767403 0.591837 0.959184 -0.763221 
+0.632653 0.959184 -0.759084 0.386709 1 -0.795918 0.387755 1 -0.795804 
+0.428571 1 -0.791371 0.469388 1 -0.786986 0.510204 1 -0.78265 
+0.55102 1 -0.778362 0.591837 1 -0.77412 0.632653 1 -0.769924 
+0.673469 1 -0.765774 0.714286 1 -0.761668 0.755102 1 -0.757605 
+-1 0.22449 -0.72102 -0.959184 0.22449 -0.716197 -1 0.265306 -0.734488 
+-0.959184 0.265306 -0.729575 -0.918367 0.265306 -0.724727 -0.877551 0.265306 -0.719943 
+-0.836735 0.265306 -0.715222 -1 0.32778 -0.755102 -1 0.306122 -0.747956 
+-0.959184 0.34319 -0.755102 -0.959184 0.306122 -0.742953 -0.918367 0.306122 -0.738016 
+-0.877551 0.306122 -0.733145 -0.836735 0.306122 -0.728337 -0.795918 0.306122 -0.723592 
+-0.755102 0.306122 -0.718909 -0.714286 0.306122 -0.714286 -0.949255 0.346939 -0.755102 
+-0.918367 0.358601 -0.755102 -0.918367 0.346939 -0.751305 -0.877551 0.374011 -0.755102 
+-0.877551 0.346939 -0.746346 -0.836735 0.346939 -0.741452 -0.795918 0.346939 -0.736622 
+-0.755102 0.346939 -0.731854 -0.714286 0.346939 -0.727147 -0.673469 0.346939 -0.722501 
+-0.632653 0.346939 -0.717914 -0.841147 0.387755 -0.755102 -0.836735 0.389421 -0.755102 
+-0.836735 0.387755 -0.754567 -0.795918 0.404831 -0.755102 -0.795918 0.387755 -0.749651 
+-0.755102 0.420242 -0.755102 -0.755102 0.387755 -0.744799 -0.714286 0.387755 -0.740009 
+-0.673469 0.387755 -0.735281 -0.632653 0.387755 -0.730612 -0.591837 0.387755 -0.726003 
+-0.55102 0.387755 -0.721451 -0.510204 0.387755 -0.716956 -0.733039 0.428571 -0.755102 
+-0.714286 0.435652 -0.755102 -0.714286 0.428571 -0.752871 -0.673469 0.451062 -0.755102 
+-0.673469 0.428571 -0.74806 -0.632653 0.466472 -0.755102 -0.632653 0.428571 -0.743311 
+-0.591837 0.428571 -0.738621 -0.55102 0.428571 -0.73399 -0.510204 0.428571 -0.729417 
+-0.469388 0.428571 -0.7249 -0.428571 0.428571 -0.72044 -0.387755 0.428571 -0.716033 
+-0.624931 0.469388 -0.755102 -0.591837 0.481883 -0.755102 -0.591837 0.469388 -0.751239 
+-0.55102 0.497293 -0.755102 -0.55102 0.469388 -0.746529 -0.510204 0.469388 -0.741878 
+-0.469388 0.469388 -0.737284 -0.428571 0.469388 -0.732747 -0.387755 0.469388 -0.728266 
+-0.346939 0.469388 -0.723838 -0.306122 0.469388 -0.719465 -0.265306 0.469388 -0.715144 
+-0.516823 0.510204 -0.755102 -0.510204 0.512703 -0.755102 -0.510204 0.510204 -0.754339 
+-0.469388 0.528113 -0.755102 -0.469388 0.510204 -0.749668 -0.428571 0.543524 -0.755102 
+-0.428571 0.510204 -0.745055 -0.387755 0.510204 -0.740498 -0.346939 0.510204 -0.735997 
+-0.306122 0.510204 -0.731549 -0.265306 0.510204 -0.727156 -0.22449 0.510204 -0.722815 
+-0.183673 0.510204 -0.718525 -0.142857 0.510204 -0.714286 -0.408715 0.55102 -0.755102 
+-0.387755 0.558934 -0.755102 -0.387755 0.55102 -0.75273 -0.346939 0.574344 -0.755102 
+-0.346939 0.55102 -0.748155 -0.306122 0.589754 -0.755102 -0.306122 0.55102 -0.743634 
+-0.265306 0.55102 -0.739168 -0.22449 0.55102 -0.734755 -0.183673 0.55102 -0.730394 
+-0.142857 0.55102 -0.726085 -0.102041 0.55102 -0.721827 -0.0612245 0.55102 -0.717618 
+-0.300607 0.591837 -0.755102 -0.265306 0.605165 -0.755102 -0.265306 0.591837 -0.75118 
+-0.22449 0.620575 -0.755102 -0.22449 0.591837 -0.746695 -0.183673 0.591837 -0.742264 
+-0.142857 0.591837 -0.737885 -0.102041 0.591837 -0.733557 -0.0612245 0.591837 -0.729279 
+-0.0204082 0.591837 -0.725052 0.0204082 0.591837 -0.720873 0.0612245 0.591837 -0.716742 
+-0.192499 0.632653 -0.755102 -0.183673 0.635985 -0.755102 -0.183673 0.632653 -0.754133 
+-0.142857 0.651395 -0.755102 -0.142857 0.632653 -0.749684 -0.102041 0.666806 -0.755102 
+-0.102041 0.632653 -0.745287 -0.0612245 0.632653 -0.740941 -0.0204082 0.632653 -0.736646 
+0.0204082 0.632653 -0.7324 0.0612245 0.632653 -0.728203 0.102041 0.632653 -0.724054 
+0.142857 0.632653 -0.719951 0.183673 0.632653 -0.715895 -0.0843905 0.673469 -0.755102 
+-0.0612245 0.682216 -0.755102 -0.0612245 0.673469 -0.752603 -0.0204082 0.697626 -0.755102 
+-0.0204082 0.673469 -0.74824 0.0204082 0.713036 -0.755102 0.0204082 0.673469 -0.743928 
+0.0612245 0.673469 -0.739664 0.102041 0.673469 -0.73545 0.142857 0.673469 -0.731283 
+0.183673 0.673469 -0.727163 0.22449 0.673469 -0.723089 0.265306 0.673469 -0.719061 
+0.306122 0.673469 -0.715077 0.0237176 0.714286 -0.755102 0.0612245 0.728446 -0.755102 
+0.0612245 0.714286 -0.751126 0.102041 0.743857 -0.755102 0.102041 0.714286 -0.746846 
+0.142857 0.714286 -0.742614 0.183673 0.714286 -0.738431 0.22449 0.714286 -0.734294 
+0.265306 0.714286 -0.730203 0.306122 0.714286 -0.726157 0.346939 0.714286 -0.722157 
+0.387755 0.714286 -0.7182 0.428571 0.714286 -0.714286 0.131826 0.755102 -0.755102 
+0.142857 0.759267 -0.755102 0.142857 0.755102 -0.753946 0.183673 0.774677 -0.755102 
+0.183673 0.755102 -0.749698 0.22449 0.790087 -0.755102 0.22449 0.755102 -0.745498 
+0.265306 0.755102 -0.741345 0.306122 0.755102 -0.737238 0.346939 0.755102 -0.733176 
+0.387755 0.755102 -0.729159 0.428571 0.755102 -0.725185 0.469388 0.755102 -0.721254 
+0.510204 0.755102 -0.717366 0.239934 0.795918 -0.755102 0.265306 0.805498 -0.755102 
+0.265306 0.795918 -0.752487 0.306122 0.820908 -0.755102 0.306122 0.795918 -0.748318 
+0.346939 0.836318 -0.755102 0.346939 0.795918 -0.744195 0.387755 0.795918 -0.740117 
+0.428571 0.795918 -0.736084 0.469388 0.795918 -0.732094 0.510204 0.795918 -0.728148 
+0.55102 0.795918 -0.724244 0.591837 0.795918 -0.720381 0.632653 0.795918 -0.716559 
+0.348042 0.836735 -0.755102 0.387755 0.851728 -0.755102 0.387755 0.836735 -0.751076 
+0.428571 0.867139 -0.755102 0.428571 0.836735 -0.746983 0.469388 0.836735 -0.742935 
+0.510204 0.836735 -0.73893 0.55102 0.836735 -0.734967 0.591837 0.836735 -0.731048 
+0.632653 0.836735 -0.727169 0.673469 0.836735 -0.723332 0.714286 0.836735 -0.719535 
+0.755102 0.836735 -0.715778 0.45615 0.877551 -0.755102 0.469388 0.882549 -0.755102 
+0.469388 0.877551 -0.753775 0.510204 0.897959 -0.755102 0.510204 0.877551 -0.749711 
+0.55102 0.913369 -0.755102 0.55102 0.877551 -0.745691 0.591837 0.877551 -0.741714 
+0.632653 0.877551 -0.737779 0.673469 0.877551 -0.733886 0.714286 0.877551 -0.730034 
+0.755102 0.877551 -0.726222 0.795918 0.877551 -0.722449 0.836735 0.877551 -0.718715 
+0.877551 0.877551 -0.71502 0.564258 0.918367 -0.755102 0.591837 0.92878 -0.755102 
+0.591837 0.918367 -0.752381 0.632653 0.94419 -0.755102 0.632653 0.918367 -0.74839 
+0.673469 0.918367 -0.74444 0.714286 0.918367 -0.740532 0.755102 0.918367 -0.736665 
+0.795918 0.918367 -0.732839 0.836735 0.918367 -0.729051 0.877551 0.918367 -0.725303 
+0.918367 0.918367 -0.721593 0.959184 0.918367 -0.717921 1 0.918367 -0.714286 
+0.672366 0.959184 -0.755102 0.673469 0.9596 -0.755102 0.673469 0.959184 -0.754994 
+0.714286 0.97501 -0.755102 0.714286 0.959184 -0.751031 0.755102 0.990421 -0.755102 
+0.755102 0.959184 -0.747109 0.795918 0.959184 -0.743228 0.836735 0.959184 -0.739387 
+0.877551 0.959184 -0.735586 0.918367 0.959184 -0.731823 0.959184 0.959184 -0.728099 
+1 0.959184 -0.724412 0.780474 1 -0.755102 0.795918 1 -0.753618 
+0.836735 1 -0.749723 0.877551 1 -0.745869 0.918367 1 -0.742053 
+0.959184 1 -0.738277 1 1 -0.734539 -1 0.102041 -0.681499 
+-0.959184 0.102041 -0.677059 -1 0.142857 -0.694614 -0.959184 0.142857 -0.690088 
+-0.918367 0.142857 -0.685622 -0.877551 0.142857 -0.681213 -0.836735 0.142857 -0.67686 
+-1 0.204082 -0.714286 -1 0.183673 -0.707728 -0.959184 0.218659 -0.714286 
+-0.959184 0.183673 -0.703118 -0.918367 0.183673 -0.698567 -0.877551 0.183673 -0.694074 
+-0.836735 0.183673 -0.689639 -0.795918 0.183673 -0.685261 -0.755102 0.183673 -0.680937 
+-0.714286 0.183673 -0.676668 -0.942857 0.22449 -0.714286 -0.918367 0.233236 -0.714286 
+-0.918367 0.22449 -0.711512 -0.877551 0.247813 -0.714286 -0.877551 0.22449 -0.706936 
+-0.836735 0.262391 -0.714286 -0.836735 0.22449 -0.702419 -0.795918 0.22449 -0.697959 
+-0.755102 0.22449 -0.693556 -0.714286 0.22449 -0.689207 -0.673469 0.22449 -0.684913 
+-0.632653 0.22449 -0.680672 -0.591837 0.22449 -0.676484 -0.828571 0.265306 -0.714286 
+-0.795918 0.276968 -0.714286 -0.795918 0.265306 -0.710658 -0.755102 0.291545 -0.714286 
+-0.755102 0.265306 -0.706174 -0.714286 0.265306 -0.701747 -0.673469 0.265306 -0.697374 
+-0.632653 0.265306 -0.693056 -0.591837 0.265306 -0.688791 -0.55102 0.265306 -0.684578 
+-0.510204 0.265306 -0.680417 -0.469388 0.265306 -0.676306 -0.673469 0.3207 -0.714286 
+-0.673469 0.306122 -0.709835 -0.632653 0.335277 -0.714286 -0.632653 0.306122 -0.70544 
+-0.591837 0.306122 -0.701099 -0.55102 0.306122 -0.696811 -0.510204 0.306122 -0.692575 
+-0.469388 0.306122 -0.68839 -0.428571 0.306122 -0.684256 -0.387755 0.306122 -0.680171 
+-0.346939 0.306122 -0.676134 -0.6 0.346939 -0.714286 -0.591837 0.349854 -0.714286 
+-0.591837 0.346939 -0.713407 -0.55102 0.364432 -0.714286 -0.55102 0.346939 -0.709043 
+-0.510204 0.379009 -0.714286 -0.510204 0.346939 -0.704733 -0.469388 0.346939 -0.700475 
+-0.428571 0.346939 -0.696268 -0.387755 0.346939 -0.692111 -0.346939 0.346939 -0.688003 
+-0.306122 0.346939 -0.683944 -0.265306 0.346939 -0.679933 -0.22449 0.346939 -0.675968 
+-0.485714 0.387755 -0.714286 -0.469388 0.393586 -0.714286 -0.469388 0.387755 -0.712559 
+-0.428571 0.408163 -0.714286 -0.428571 0.387755 -0.70828 -0.387755 0.422741 -0.714286 
+-0.387755 0.387755 -0.704051 -0.346939 0.387755 -0.699873 -0.306122 0.387755 -0.695744 
+-0.265306 0.387755 -0.691663 -0.22449 0.387755 -0.68763 -0.183673 0.387755 -0.683644 
+-0.142857 0.387755 -0.679704 -0.102041 0.387755 -0.675808 -0.371429 0.428571 -0.714286 
+-0.346939 0.437318 -0.714286 -0.346939 0.428571 -0.711742 -0.306122 0.451895 -0.714286 
+-0.306122 0.428571 -0.707543 -0.265306 0.466472 -0.714286 -0.265306 0.428571 -0.703393 
+-0.22449 0.428571 -0.699292 -0.183673 0.428571 -0.695238 -0.142857 0.428571 -0.691231 
+-0.102041 0.428571 -0.68727 -0.0612245 0.428571 -0.683354 -0.0204082 0.428571 -0.679482 
+0.0204082 0.428571 -0.675654 -0.257143 0.469388 -0.714286 -0.22449 0.48105 -0.714286 
+-0.22449 0.469388 -0.710954 -0.183673 0.495627 -0.714286 -0.183673 0.469388 -0.706832 
+-0.142857 0.469388 -0.702758 -0.102041 0.469388 -0.698731 -0.0612245 0.469388 -0.69475 
+-0.0204082 0.469388 -0.690813 0.0204082 0.469388 -0.686922 0.0612245 0.469388 -0.683073 
+0.102041 0.469388 -0.679268 0.142857 0.469388 -0.675505 -0.102041 0.524781 -0.714286 
+-0.102041 0.510204 -0.710192 -0.0612245 0.539359 -0.714286 -0.0612245 0.510204 -0.706146 
+-0.0204082 0.510204 -0.702145 0.0204082 0.510204 -0.698189 0.0612245 0.510204 -0.694278 
+0.102041 0.510204 -0.69041 0.142857 0.510204 -0.686585 0.183673 0.510204 -0.682802 
+0.22449 0.510204 -0.679061 0.265306 0.510204 -0.67536 -0.0285714 0.55102 -0.714286 
+-0.0204082 0.553936 -0.714286 -0.0204082 0.55102 -0.713476 0.0204082 0.568513 -0.714286 
+0.0204082 0.55102 -0.709457 0.0612245 0.58309 -0.714286 0.0612245 0.55102 -0.705482 
+0.102041 0.55102 -0.701552 0.142857 0.55102 -0.697665 0.183673 0.55102 -0.693821 
+0.22449 0.55102 -0.69002 0.265306 0.55102 -0.686259 0.306122 0.55102 -0.68254 
+0.346939 0.55102 -0.67886 0.387755 0.55102 -0.67522 0.0857143 0.591837 -0.714286 
+0.102041 0.597668 -0.714286 0.102041 0.591837 -0.712694 0.142857 0.612245 -0.714286 
+0.142857 0.591837 -0.708746 0.183673 0.626822 -0.714286 0.183673 0.591837 -0.704841 
+0.22449 0.591837 -0.700978 0.265306 0.591837 -0.697158 0.306122 0.591837 -0.69338 
+0.346939 0.591837 -0.689642 0.387755 0.591837 -0.685944 0.428571 0.591837 -0.682286 
+0.469388 0.591837 -0.678666 0.510204 0.591837 -0.675085 0.2 0.632653 -0.714286 
+0.22449 0.641399 -0.714286 0.22449 0.632653 -0.711937 0.265306 0.655977 -0.714286 
+0.265306 0.632653 -0.708058 0.306122 0.670554 -0.714286 0.306122 0.632653 -0.70422 
+0.346939 0.632653 -0.700424 0.387755 0.632653 -0.696668 0.428571 0.632653 -0.692952 
+0.469388 0.632653 -0.689276 0.510204 0.632653 -0.685639 0.55102 0.632653 -0.68204 
+0.591837 0.632653 -0.678478 0.632653 0.632653 -0.674954 0.314286 0.673469 -0.714286 
+0.346939 0.685131 -0.714286 0.346939 0.673469 -0.711205 0.387755 0.699708 -0.714286 
+0.387755 0.673469 -0.707392 0.428571 0.673469 -0.703619 0.469388 0.673469 -0.699886 
+0.510204 0.673469 -0.696193 0.55102 0.673469 -0.692538 0.591837 0.673469 -0.688922 
+0.632653 0.673469 -0.685343 0.673469 0.673469 -0.681801 0.714286 0.673469 -0.678296 
+0.755102 0.673469 -0.674826 0.469388 0.728863 -0.714286 0.469388 0.714286 -0.710496 
+0.510204 0.74344 -0.714286 0.510204 0.714286 -0.706747 0.55102 0.714286 -0.703037 
+0.591837 0.714286 -0.699366 0.632653 0.714286 -0.695733 0.673469 0.714286 -0.692137 
+0.714286 0.714286 -0.688579 0.755102 0.714286 -0.685057 0.795918 0.714286 -0.68157 
+0.836735 0.714286 -0.678119 0.877551 0.714286 -0.674703 0.542857 0.755102 -0.714286 
+0.55102 0.758017 -0.714286 0.55102 0.755102 -0.713536 0.591837 0.772595 -0.714286 
+0.591837 0.755102 -0.70981 0.632653 0.787172 -0.714286 0.632653 0.755102 -0.706122 
+0.673469 0.755102 -0.702473 0.714286 0.755102 -0.698862 0.755102 0.755102 -0.695287 
+0.795918 0.755102 -0.691748 0.836735 0.755102 -0.688246 0.877551 0.755102 -0.684779 
+0.918367 0.755102 -0.681346 0.959184 0.755102 -0.677948 1 0.755102 -0.674583 
+0.657143 0.795918 -0.714286 0.673469 0.801749 -0.714286 0.673469 0.795918 -0.712809 
+0.714286 0.816327 -0.714286 0.714286 0.795918 -0.709144 0.755102 0.830904 -0.714286 
+0.755102 0.795918 -0.705517 0.795918 0.795918 -0.701927 0.836735 0.795918 -0.698373 
+0.877551 0.795918 -0.694854 0.918367 0.795918 -0.691371 0.959184 0.795918 -0.687923 
+1 0.795918 -0.684509 0.771429 0.836735 -0.714286 0.795918 0.845481 -0.714286 
+0.795918 0.836735 -0.712105 0.836735 0.860058 -0.714286 0.836735 0.836735 -0.708499 
+0.877551 0.874636 -0.714286 0.877551 0.836735 -0.70493 0.918367 0.836735 -0.701396 
+0.959184 0.836735 -0.697898 1 0.836735 -0.694435 0.885714 0.877551 -0.714286 
+0.918367 0.889213 -0.714286 0.918367 0.877551 -0.711421 0.959184 0.90379 -0.714286 
+0.959184 0.877551 -0.707873 1 0.877551 -0.70436 -1 -0.0204082 -0.642955 
+-0.959184 -0.0204082 -0.638873 -0.918367 -0.0204082 -0.634842 -1 0.0204082 -0.655734 
+-0.959184 0.0204082 -0.651571 -0.918367 0.0204082 -0.64746 -0.877551 0.0204082 -0.643401 
+-0.836735 0.0204082 -0.639392 -0.795918 0.0204082 -0.635433 -1 0.0770512 -0.673469 
+-1 0.0612245 -0.668514 -0.959184 0.0907955 -0.673469 -0.959184 0.0612245 -0.66427 
+-0.918367 0.0612245 -0.660079 -0.877551 0.0612245 -0.65594 -0.836735 0.0612245 -0.651853 
+-0.795918 0.0612245 -0.647817 -0.755102 0.0612245 -0.64383 -0.714286 0.0612245 -0.639893 
+-0.673469 0.0612245 -0.636003 -0.925789 0.102041 -0.673469 -0.918367 0.10454 -0.673469 
+-0.918367 0.102041 -0.672697 -0.877551 0.118284 -0.673469 -0.877551 0.102041 -0.668479 
+-0.836735 0.132028 -0.673469 -0.836735 0.102041 -0.664314 -0.795918 0.102041 -0.660201 
+-0.755102 0.102041 -0.656138 -0.714286 0.102041 -0.652125 -0.673469 0.102041 -0.648161 
+-0.632653 0.102041 -0.644244 -0.591837 0.102041 -0.640375 -0.55102 0.102041 -0.636552 
+-0.510204 0.102041 -0.632774 -0.804576 0.142857 -0.673469 -0.795918 0.145773 -0.673469 
+-0.795918 0.142857 -0.672585 -0.755102 0.159517 -0.673469 -0.755102 0.142857 -0.668446 
+-0.714286 0.173261 -0.673469 -0.714286 0.142857 -0.664357 -0.673469 0.142857 -0.660319 
+-0.632653 0.142857 -0.656329 -0.591837 0.142857 -0.652387 -0.55102 0.142857 -0.648492 
+-0.510204 0.142857 -0.644644 -0.469388 0.142857 -0.64084 -0.428571 0.142857 -0.637082 
+-0.387755 0.142857 -0.633367 -0.683364 0.183673 -0.673469 -0.673469 0.187005 -0.673469 
+-0.673469 0.183673 -0.672477 -0.632653 0.20075 -0.673469 -0.632653 0.183673 -0.668414 
+-0.591837 0.214494 -0.673469 -0.591837 0.183673 -0.664399 -0.55102 0.183673 -0.660433 
+-0.510204 0.183673 -0.656513 -0.469388 0.183673 -0.65264 -0.428571 0.183673 -0.648812 
+-0.387755 0.183673 -0.645029 -0.346939 0.183673 -0.64129 -0.306122 0.183673 -0.637593 
+-0.265306 0.183673 -0.63394 -0.562152 0.22449 -0.673469 -0.55102 0.228238 -0.673469 
+-0.55102 0.22449 -0.672373 -0.510204 0.241983 -0.673469 -0.510204 0.22449 -0.668382 
+-0.469388 0.255727 -0.673469 -0.469388 0.22449 -0.664439 -0.428571 0.22449 -0.660542 
+-0.387755 0.22449 -0.656691 -0.346939 0.22449 -0.652884 -0.306122 0.22449 -0.649121 
+-0.265306 0.22449 -0.645401 -0.22449 0.22449 -0.641723 -0.183673 0.22449 -0.638088 
+-0.142857 0.22449 -0.634493 -0.44094 0.265306 -0.673469 -0.428571 0.269471 -0.673469 
+-0.428571 0.265306 -0.672272 -0.387755 0.283215 -0.673469 -0.387755 0.265306 -0.668352 
+-0.346939 0.29696 -0.673469 -0.346939 0.265306 -0.664478 -0.306122 0.265306 -0.660648 
+-0.265306 0.265306 -0.656862 -0.22449 0.265306 -0.653119 -0.183673 0.265306 -0.649419 
+-0.142857 0.265306 -0.64576 -0.102041 0.265306 -0.642143 -0.0612245 0.265306 -0.638565 
+-0.0204082 0.265306 -0.635027 -0.319728 0.306122 -0.673469 -0.306122 0.310704 -0.673469 
+-0.306122 0.306122 -0.672176 -0.265306 0.324448 -0.673469 -0.265306 0.306122 -0.668324 
+-0.22449 0.338192 -0.673469 -0.22449 0.306122 -0.664515 -0.183673 0.306122 -0.66075 
+-0.142857 0.306122 -0.657028 -0.102041 0.306122 -0.653347 -0.0612245 0.306122 -0.649707 
+-0.0204082 0.306122 -0.646108 0.0204082 0.306122 -0.642548 0.0612245 0.306122 -0.639027 
+0.102041 0.306122 -0.635545 -0.198516 0.346939 -0.673469 -0.183673 0.351937 -0.673469 
+-0.183673 0.346939 -0.672082 -0.142857 0.365681 -0.673469 -0.142857 0.346939 -0.668296 
+-0.102041 0.379425 -0.673469 -0.102041 0.346939 -0.664552 -0.0612245 0.346939 -0.660849 
+-0.0204082 0.346939 -0.657188 0.0204082 0.346939 -0.653567 0.0612245 0.346939 -0.649986 
+0.102041 0.346939 -0.646444 0.142857 0.346939 -0.64294 0.183673 0.346939 -0.639474 
+0.22449 0.346939 -0.636045 0.265306 0.346939 -0.632653 -0.0773036 0.387755 -0.673469 
+-0.0612245 0.39317 -0.673469 -0.0612245 0.387755 -0.671991 -0.0204082 0.406914 -0.673469 
+-0.0204082 0.387755 -0.668268 0.0204082 0.420658 -0.673469 0.0204082 0.387755 -0.664586 
+0.0612245 0.387755 -0.660945 0.102041 0.387755 -0.657343 0.142857 0.387755 -0.65378 
+0.183673 0.387755 -0.650256 0.22449 0.387755 -0.646769 0.265306 0.387755 -0.64332 
+0.306122 0.387755 -0.639907 0.346939 0.387755 -0.63653 0.387755 0.387755 -0.633189 
+0.0439085 0.428571 -0.673469 0.0612245 0.434402 -0.673469 0.0612245 0.428571 -0.671904 
+0.102041 0.448147 -0.673469 0.102041 0.428571 -0.668242 0.142857 0.461891 -0.673469 
+0.142857 0.428571 -0.66462 0.183673 0.428571 -0.661037 0.22449 0.428571 -0.657493 
+0.265306 0.428571 -0.653986 0.306122 0.428571 -0.650517 0.346939 0.428571 -0.647084 
+0.387755 0.428571 -0.643687 0.428571 0.428571 -0.640326 0.469388 0.428571 -0.637 
+0.510204 0.428571 -0.633708 0.165121 0.469388 -0.673469 0.183673 0.475635 -0.673469 
+0.183673 0.469388 -0.671819 0.22449 0.489379 -0.673469 0.22449 0.469388 -0.668217 
+0.265306 0.503124 -0.673469 0.265306 0.469388 -0.664653 0.306122 0.469388 -0.661127 
+0.346939 0.469388 -0.657638 0.387755 0.469388 -0.654186 0.428571 0.469388 -0.65077 
+0.469388 0.469388 -0.647389 0.510204 0.469388 -0.644044 0.55102 0.469388 -0.640732 
+0.591837 0.469388 -0.637455 0.632653 0.469388 -0.634211 0.286333 0.510204 -0.673469 
+0.306122 0.516868 -0.673469 0.306122 0.510204 -0.671737 0.346939 0.530612 -0.673469 
+0.346939 0.510204 -0.668192 0.387755 0.544357 -0.673469 0.387755 0.510204 -0.664685 
+0.428571 0.510204 -0.661214 0.469388 0.510204 -0.657779 0.510204 0.510204 -0.65438 
+0.55102 0.510204 -0.651015 0.591837 0.510204 -0.647685 0.632653 0.510204 -0.644389 
+0.673469 0.510204 -0.641126 0.714286 0.510204 -0.637896 0.755102 0.510204 -0.634699 
+0.407545 0.55102 -0.673469 0.428571 0.558101 -0.673469 0.428571 0.55102 -0.671658 
+0.469388 0.571845 -0.673469 0.469388 0.55102 -0.668169 0.510204 0.585589 -0.673469 
+0.510204 0.55102 -0.664715 0.55102 0.55102 -0.661298 0.591837 0.55102 -0.657915 
+0.632653 0.55102 -0.654567 0.673469 0.55102 -0.651253 0.714286 0.55102 -0.647972 
+0.755102 0.55102 -0.644724 0.795918 0.55102 -0.641508 0.836735 0.55102 -0.638325 
+0.877551 0.55102 -0.635173 0.528757 0.591837 -0.673469 0.55102 0.599334 -0.673469 
+0.55102 0.591837 -0.671581 0.591837 0.613078 -0.673469 0.591837 0.591837 -0.668146 
+0.632653 0.626822 -0.673469 0.632653 0.591837 -0.664745 0.673469 0.591837 -0.66138 
+0.714286 0.591837 -0.658048 0.755102 0.591837 -0.654749 0.795918 0.591837 -0.651484 
+0.836735 0.591837 -0.64825 0.877551 0.591837 -0.645049 0.918367 0.591837 -0.641879 
+0.959184 0.591837 -0.638741 1 0.591837 -0.635632 0.649969 0.632653 -0.673469 
+0.673469 0.640566 -0.673469 0.673469 0.632653 -0.671506 0.714286 0.654311 -0.673469 
+0.714286 0.632653 -0.668123 0.755102 0.668055 -0.673469 0.755102 0.632653 -0.664774 
+0.795918 0.632653 -0.661459 0.836735 0.632653 -0.658176 0.877551 0.632653 -0.654926 
+0.918367 0.632653 -0.651707 0.959184 0.632653 -0.648521 1 0.632653 -0.645365 
+0.771181 0.673469 -0.673469 0.795918 0.681799 -0.673469 0.795918 0.673469 -0.671434 
+0.836735 0.695544 -0.673469 0.836735 0.673469 -0.668101 0.877551 0.709288 -0.673469 
+0.877551 0.673469 -0.664802 0.918367 0.673469 -0.661535 0.959184 0.673469 -0.6583 
+1 0.673469 -0.655097 0.892393 0.714286 -0.673469 0.918367 0.723032 -0.673469 
+0.918367 0.714286 -0.671363 0.959184 0.736776 -0.673469 0.959184 0.714286 -0.66808 
+1 0.750521 -0.673469 1 0.714286 -0.664829 -1 -0.183673 -0.592854 
+-1 -0.142857 -0.605315 -0.959184 -0.142857 -0.601567 -0.918367 -0.142857 -0.597865 
+-0.877551 -0.142857 -0.594208 -1 -0.102041 -0.617776 -0.959184 -0.102041 -0.613951 
+-0.918367 -0.102041 -0.610173 -0.877551 -0.102041 -0.606441 -0.836735 -0.102041 -0.602754 
+-0.795918 -0.102041 -0.599112 -0.755102 -0.102041 -0.595514 -0.714286 -0.102041 -0.591959 
+-1 -0.0533111 -0.632653 -1 -0.0612245 -0.630237 -0.959184 -0.0403998 -0.632653 
+-0.959184 -0.0612245 -0.626335 -0.918367 -0.0274885 -0.632653 -0.918367 -0.0612245 -0.62248 
+-0.877551 -0.0612245 -0.618673 -0.836735 -0.0612245 -0.614912 -0.795918 -0.0612245 -0.611197 
+-0.755102 -0.0612245 -0.607526 -0.714286 -0.0612245 -0.603899 -0.673469 -0.0612245 -0.600315 
+-0.632653 -0.0612245 -0.596773 -0.591837 -0.0612245 -0.593273 -0.895984 -0.0204082 -0.632653 
+-0.877551 -0.0145773 -0.632653 -0.877551 -0.0204082 -0.630906 -0.836735 -0.00166597 -0.632653 
+-0.836735 -0.0204082 -0.62707 -0.795918 0.0112453 -0.632653 -0.795918 -0.0204082 -0.623281 
+-0.755102 -0.0204082 -0.619538 -0.714286 -0.0204082 -0.615839 -0.673469 -0.0204082 -0.612184 
+-0.632653 -0.0204082 -0.608573 -0.591837 -0.0204082 -0.605003 -0.55102 -0.0204082 -0.601476 
+-0.510204 -0.0204082 -0.597989 -0.469388 -0.0204082 -0.594542 -0.766952 0.0204082 -0.632653 
+-0.755102 0.0241566 -0.632653 -0.755102 0.0204082 -0.63155 -0.714286 0.0370679 -0.632653 
+-0.714286 0.0204082 -0.627779 -0.673469 0.0499792 -0.632653 -0.673469 0.0204082 -0.624054 
+-0.632653 0.0204082 -0.620372 -0.591837 0.0204082 -0.616733 -0.55102 0.0204082 -0.613137 
+-0.510204 0.0204082 -0.609583 -0.469388 0.0204082 -0.60607 -0.428571 0.0204082 -0.602596 
+-0.387755 0.0204082 -0.599163 -0.346939 0.0204082 -0.595768 -0.306122 0.0204082 -0.592412 
+-0.63792 0.0612245 -0.632653 -0.632653 0.0628905 -0.632653 -0.632653 0.0612245 -0.632171 
+-0.591837 0.0758018 -0.632653 -0.591837 0.0612245 -0.628464 -0.55102 0.088713 -0.632653 
+-0.55102 0.0612245 -0.624799 -0.510204 0.101624 -0.632653 -0.510204 0.0612245 -0.621177 
+-0.469388 0.0612245 -0.617597 -0.428571 0.0612245 -0.614058 -0.387755 0.0612245 -0.610559 
+-0.346939 0.0612245 -0.607099 -0.306122 0.0612245 -0.603679 -0.265306 0.0612245 -0.600297 
+-0.22449 0.0612245 -0.596953 -0.183673 0.0612245 -0.593646 -0.508887 0.102041 -0.632653 
+-0.469388 0.114536 -0.632653 -0.469388 0.102041 -0.629124 -0.428571 0.127447 -0.632653 
+-0.428571 0.102041 -0.625519 -0.387755 0.140358 -0.632653 -0.387755 0.102041 -0.621955 
+-0.346939 0.102041 -0.618431 -0.306122 0.102041 -0.614947 -0.265306 0.102041 -0.611502 
+-0.22449 0.102041 -0.608095 -0.183673 0.102041 -0.604726 -0.142857 0.102041 -0.601394 
+-0.102041 0.102041 -0.598099 -0.0612245 0.102041 -0.59484 -0.379855 0.142857 -0.632653 
+-0.346939 0.153269 -0.632653 -0.346939 0.142857 -0.629762 -0.306122 0.166181 -0.632653 
+-0.306122 0.142857 -0.626214 -0.265306 0.179092 -0.632653 -0.265306 0.142857 -0.622706 
+-0.22449 0.142857 -0.619237 -0.183673 0.142857 -0.615806 -0.142857 0.142857 -0.612414 
+-0.102041 0.142857 -0.609058 -0.0612245 0.142857 -0.605739 -0.0204082 0.142857 -0.602456 
+0.0204082 0.142857 -0.599208 0.0612245 0.142857 -0.595995 0.102041 0.142857 -0.592816 
+-0.250823 0.183673 -0.632653 -0.22449 0.192003 -0.632653 -0.22449 0.183673 -0.630379 
+-0.183673 0.204915 -0.632653 -0.183673 0.183673 -0.626887 -0.142857 0.217826 -0.632653 
+-0.142857 0.183673 -0.623433 -0.102041 0.183673 -0.620017 -0.0612245 0.183673 -0.616638 
+-0.0204082 0.183673 -0.613296 0.0204082 0.183673 -0.60999 0.0612245 0.183673 -0.606719 
+0.102041 0.183673 -0.603483 0.142857 0.183673 -0.600281 0.183673 0.183673 -0.597114 
+0.22449 0.183673 -0.593979 -0.121791 0.22449 -0.632653 -0.102041 0.230737 -0.632653 
+-0.102041 0.22449 -0.630976 -0.0612245 0.243648 -0.632653 -0.0612245 0.22449 -0.627537 
+-0.0204082 0.25656 -0.632653 -0.0204082 0.22449 -0.624136 0.0204082 0.22449 -0.620771 
+0.0612245 0.22449 -0.617443 0.102041 0.22449 -0.61415 0.142857 0.22449 -0.610892 
+0.183673 0.22449 -0.607668 0.22449 0.22449 -0.604478 0.265306 0.22449 -0.601321 
+0.306122 0.22449 -0.598198 0.346939 0.22449 -0.595106 0.387755 0.22449 -0.592047 
+0.00724161 0.265306 -0.632653 0.0204082 0.269471 -0.632653 0.0204082 0.265306 -0.631553 
+0.0612245 0.282382 -0.632653 0.0612245 0.265306 -0.628167 0.102041 0.295294 -0.632653 
+0.102041 0.265306 -0.624816 0.142857 0.265306 -0.621502 0.183673 0.265306 -0.618222 
+0.22449 0.265306 -0.614977 0.265306 0.265306 -0.611765 0.306122 0.265306 -0.608587 
+0.346939 0.265306 -0.605442 0.387755 0.265306 -0.602329 0.428571 0.265306 -0.599248 
+0.469388 0.265306 -0.596199 0.510204 0.265306 -0.59318 0.136274 0.306122 -0.632653 
+0.142857 0.308205 -0.632653 0.142857 0.306122 -0.632112 0.183673 0.321116 -0.632653 
+0.183673 0.306122 -0.628776 0.22449 0.334027 -0.632653 0.22449 0.306122 -0.625475 
+0.265306 0.306122 -0.622209 0.306122 0.306122 -0.618977 0.346939 0.306122 -0.615778 
+0.387755 0.306122 -0.612612 0.428571 0.306122 -0.609479 0.469388 0.306122 -0.606377 
+0.510204 0.306122 -0.603307 0.55102 0.306122 -0.600267 0.591837 0.306122 -0.597258 
+0.632653 0.306122 -0.59428 0.306122 0.35985 -0.632653 0.306122 0.346939 -0.629367 
+0.346939 0.372761 -0.632653 0.346939 0.346939 -0.626114 0.387755 0.385673 -0.632653 
+0.387755 0.346939 -0.622895 0.428571 0.346939 -0.619709 0.469388 0.346939 -0.616555 
+0.510204 0.346939 -0.613433 0.55102 0.346939 -0.610343 0.591837 0.346939 -0.607284 
+0.632653 0.346939 -0.604255 0.673469 0.346939 -0.601256 0.714286 0.346939 -0.598287 
+0.755102 0.346939 -0.595347 0.795918 0.346939 -0.592435 0.394338 0.387755 -0.632653 
+0.428571 0.398584 -0.632653 0.428571 0.387755 -0.629939 0.469388 0.411495 -0.632653 
+0.469388 0.387755 -0.626733 0.510204 0.424406 -0.632653 0.510204 0.387755 -0.62356 
+0.55102 0.387755 -0.620418 0.591837 0.387755 -0.617309 0.632653 0.387755 -0.61423 
+0.673469 0.387755 -0.611181 0.714286 0.387755 -0.608163 0.755102 0.387755 -0.605175 
+0.795918 0.387755 -0.602215 0.836735 0.387755 -0.599285 0.877551 0.387755 -0.596383 
+0.918367 0.387755 -0.593509 0.523371 0.428571 -0.632653 0.55102 0.437318 -0.632653 
+0.55102 0.428571 -0.630494 0.591837 0.450229 -0.632653 0.591837 0.428571 -0.627334 
+0.632653 0.46314 -0.632653 0.632653 0.428571 -0.624205 0.673469 0.428571 -0.621107 
+0.714286 0.428571 -0.61804 0.755102 0.428571 -0.615003 0.795918 0.428571 -0.611995 
+0.836735 0.428571 -0.609017 0.877551 0.428571 -0.606068 0.918367 0.428571 -0.603147 
+0.959184 0.428571 -0.600254 1 0.428571 -0.597389 0.652403 0.469388 -0.632653 
+0.673469 0.476052 -0.632653 0.673469 0.469388 -0.631033 0.714286 0.488963 -0.632653 
+0.714286 0.469388 -0.627916 0.755102 0.501874 -0.632653 0.755102 0.469388 -0.624831 
+0.795918 0.469388 -0.621775 0.836735 0.469388 -0.61875 0.877551 0.469388 -0.615753 
+0.918367 0.469388 -0.612786 0.959184 0.469388 -0.609847 1 0.469388 -0.606936 
+0.781435 0.510204 -0.632653 0.795918 0.514786 -0.632653 0.795918 0.510204 -0.631555 
+0.836735 0.527697 -0.632653 0.836735 0.510204 -0.628482 0.877551 0.540608 -0.632653 
+0.877551 0.510204 -0.625439 0.918367 0.510204 -0.622424 0.959184 0.510204 -0.619439 
+1 0.510204 -0.616482 0.910467 0.55102 -0.632653 0.918367 0.553519 -0.632653 
+0.918367 0.55102 -0.632063 0.959184 0.566431 -0.632653 0.959184 0.55102 -0.629031 
+1 0.579342 -0.632653 1 0.55102 -0.626029 -1 -0.306122 -0.556355 
+-0.959184 -0.306122 -0.552993 -1 -0.265306 -0.568513 -0.959184 -0.265306 -0.565078 
+-0.918367 -0.265306 -0.561684 -0.877551 -0.265306 -0.558331 -0.836735 -0.265306 -0.555017 
+-0.795918 -0.265306 -0.551743 -1 -0.187005 -0.591837 -1 -0.22449 -0.580671 
+-0.959184 -0.22449 -0.577163 -0.918367 -0.22449 -0.573696 -0.877551 -0.22449 -0.570271 
+-0.836735 -0.22449 -0.566887 -0.795918 -0.22449 -0.563542 -0.755102 -0.22449 -0.560237 
+-0.714286 -0.22449 -0.55697 -0.673469 -0.22449 -0.553742 -0.98874 -0.183673 -0.591837 
+-0.959184 -0.174927 -0.591837 -0.959184 -0.183673 -0.589247 -0.918367 -0.162849 -0.591837 
+-0.918367 -0.183673 -0.585708 -0.877551 -0.150771 -0.591837 -0.877551 -0.183673 -0.582211 
+-0.836735 -0.183673 -0.578756 -0.795918 -0.183673 -0.575342 -0.755102 -0.183673 -0.571967 
+-0.714286 -0.183673 -0.568632 -0.673469 -0.183673 -0.565336 -0.632653 -0.183673 -0.562077 
+-0.591837 -0.183673 -0.558856 -0.55102 -0.183673 -0.555672 -0.510204 -0.183673 -0.552524 
+-0.850809 -0.142857 -0.591837 -0.836735 -0.138692 -0.591837 -0.836735 -0.142857 -0.590626 
+-0.795918 -0.126614 -0.591837 -0.795918 -0.142857 -0.587141 -0.755102 -0.114536 -0.591837 
+-0.755102 -0.142857 -0.583697 -0.714286 -0.102457 -0.591837 -0.714286 -0.142857 -0.580294 
+-0.673469 -0.142857 -0.57693 -0.632653 -0.142857 -0.573605 -0.591837 -0.142857 -0.570318 
+-0.55102 -0.142857 -0.567068 -0.510204 -0.142857 -0.563855 -0.469388 -0.142857 -0.560678 
+-0.428571 -0.142857 -0.557537 -0.387755 -0.142857 -0.554431 -0.346939 -0.142857 -0.55136 
+-0.712878 -0.102041 -0.591837 -0.673469 -0.090379 -0.591837 -0.673469 -0.102041 -0.588524 
+-0.632653 -0.0783007 -0.591837 -0.632653 -0.102041 -0.585132 -0.591837 -0.0662224 -0.591837 
+-0.591837 -0.102041 -0.581779 -0.55102 -0.102041 -0.578464 -0.510204 -0.102041 -0.575186 
+-0.469388 -0.102041 -0.571946 -0.428571 -0.102041 -0.568742 -0.387755 -0.102041 -0.565573 
+-0.346939 -0.102041 -0.56244 -0.306122 -0.102041 -0.559341 -0.265306 -0.102041 -0.556276 
+-0.22449 -0.102041 -0.553245 -0.574947 -0.0612245 -0.591837 -0.55102 -0.0541441 -0.591837 
+-0.55102 -0.0612245 -0.58986 -0.510204 -0.0420658 -0.591837 -0.510204 -0.0612245 -0.586518 
+-0.469388 -0.0299875 -0.591837 -0.469388 -0.0612245 -0.583214 -0.428571 -0.0612245 -0.579946 
+-0.387755 -0.0612245 -0.576715 -0.346939 -0.0612245 -0.57352 -0.306122 -0.0612245 -0.57036 
+-0.265306 -0.0612245 -0.567235 -0.22449 -0.0612245 -0.564144 -0.183673 -0.0612245 -0.561086 
+-0.142857 -0.0612245 -0.558061 -0.102041 -0.0612245 -0.555069 -0.0612245 -0.0612245 -0.552109 
+-0.437016 -0.0204082 -0.591837 -0.428571 -0.0179092 -0.591837 -0.428571 -0.0204082 -0.591151 
+-0.387755 -0.0058309 -0.591837 -0.387755 -0.0204082 -0.587857 -0.346939 0.0062474 -0.591837 
+-0.346939 -0.0204082 -0.584601 -0.306122 0.0183257 -0.591837 -0.306122 -0.0204082 -0.58138 
+-0.265306 -0.0204082 -0.578194 -0.22449 -0.0204082 -0.575043 -0.183673 -0.0204082 -0.571926 
+-0.142857 -0.0204082 -0.568843 -0.102041 -0.0204082 -0.565793 -0.0612245 -0.0204082 -0.562775 
+-0.0204082 -0.0204082 -0.55979 0.0204082 -0.0204082 -0.556836 0.0612245 -0.0204082 -0.553913 
+0.102041 -0.0204082 -0.55102 -0.299085 0.0204082 -0.591837 -0.265306 0.030404 -0.591837 
+-0.265306 0.0204082 -0.589153 -0.22449 0.0424823 -0.591837 -0.22449 0.0204082 -0.585942 
+-0.183673 0.0545606 -0.591837 -0.183673 0.0204082 -0.582766 -0.142857 0.0204082 -0.579625 
+-0.102041 0.0204082 -0.576517 -0.0612245 0.0204082 -0.573442 -0.0204082 0.0204082 -0.5704 
+0.0204082 0.0204082 -0.56739 0.0612245 0.0204082 -0.564412 0.102041 0.0204082 -0.561464 
+0.142857 0.0204082 -0.558548 0.183673 0.0204082 -0.555661 0.22449 0.0204082 -0.552804 
+-0.161154 0.0612245 -0.591837 -0.142857 0.0666389 -0.591837 -0.142857 0.0612245 -0.590407 
+-0.102041 0.0787172 -0.591837 -0.102041 0.0612245 -0.587241 -0.0612245 0.0907955 -0.591837 
+-0.0612245 0.0612245 -0.584109 -0.0204082 0.0612245 -0.58101 0.0204082 0.0612245 -0.577944 
+0.0612245 0.0612245 -0.57491 0.102041 0.0612245 -0.571908 0.142857 0.0612245 -0.568937 
+0.183673 0.0612245 -0.565997 0.22449 0.0612245 -0.563087 0.265306 0.0612245 -0.560207 
+0.306122 0.0612245 -0.557356 0.346939 0.0612245 -0.554534 0.387755 0.0612245 -0.55174 
+-0.0232231 0.102041 -0.591837 -0.0204082 0.102874 -0.591837 -0.0204082 0.102041 -0.59162 
+0.0204082 0.114952 -0.591837 0.0204082 0.102041 -0.588498 0.0612245 0.12703 -0.591837 
+0.0612245 0.102041 -0.585409 0.102041 0.139109 -0.591837 0.102041 0.102041 -0.582352 
+0.142857 0.102041 -0.579327 0.183673 0.102041 -0.576333 0.22449 0.102041 -0.57337 
+0.265306 0.102041 -0.570437 0.306122 0.102041 -0.567534 0.346939 0.102041 -0.56466 
+0.387755 0.102041 -0.561816 0.428571 0.102041 -0.559 0.469388 0.102041 -0.556212 
+0.510204 0.102041 -0.553451 0.114708 0.142857 -0.591837 0.142857 0.151187 -0.591837 
+0.142857 0.142857 -0.589716 0.183673 0.163265 -0.591837 0.183673 0.142857 -0.586669 
+0.22449 0.175344 -0.591837 0.22449 0.142857 -0.583652 0.265306 0.142857 -0.580667 
+0.306122 0.142857 -0.577712 0.346939 0.142857 -0.574787 0.387755 0.142857 -0.571891 
+0.428571 0.142857 -0.569025 0.469388 0.142857 -0.566187 0.510204 0.142857 -0.563377 
+0.55102 0.142857 -0.560595 0.591837 0.142857 -0.55784 0.632653 0.142857 -0.555112 
+0.673469 0.142857 -0.552411 0.252639 0.183673 -0.591837 0.265306 0.187422 -0.591837 
+0.265306 0.183673 -0.590897 0.306122 0.1995 -0.591837 0.306122 0.183673 -0.58789 
+0.346939 0.211579 -0.591837 0.346939 0.183673 -0.584913 0.387755 0.223657 -0.591837 
+0.387755 0.183673 -0.581967 0.428571 0.183673 -0.57905 0.469388 0.183673 -0.576162 
+0.510204 0.183673 -0.573302 0.55102 0.183673 -0.570471 0.591837 0.183673 -0.567668 
+0.632653 0.183673 -0.564892 0.673469 0.183673 -0.562143 0.714286 0.183673 -0.559421 
+0.755102 0.183673 -0.556725 0.795918 0.183673 -0.554055 0.836735 0.183673 -0.55141 
+0.39057 0.22449 -0.591837 0.428571 0.235735 -0.591837 0.428571 0.22449 -0.589075 
+0.469388 0.247813 -0.591837 0.469388 0.22449 -0.586137 0.510204 0.259892 -0.591837 
+0.510204 0.22449 -0.583228 0.55102 0.22449 -0.580348 0.591837 0.22449 -0.577496 
+0.632653 0.22449 -0.574672 0.673469 0.22449 -0.571875 0.714286 0.22449 -0.569106 
+0.755102 0.22449 -0.566363 0.795918 0.22449 -0.563647 0.836735 0.22449 -0.560957 
+0.877551 0.22449 -0.558292 0.918367 0.22449 -0.555652 0.959184 0.22449 -0.553037 
+0.528501 0.265306 -0.591837 0.55102 0.27197 -0.591837 0.55102 0.265306 -0.590224 
+0.591837 0.284048 -0.591837 0.591837 0.265306 -0.587324 0.632653 0.296127 -0.591837 
+0.632653 0.265306 -0.584452 0.673469 0.265306 -0.581608 0.714286 0.265306 -0.578791 
+0.755102 0.265306 -0.576002 0.795918 0.265306 -0.573239 0.836735 0.265306 -0.570503 
+0.877551 0.265306 -0.567793 0.918367 0.265306 -0.565108 0.959184 0.265306 -0.562449 
+1 0.265306 -0.559815 0.666432 0.306122 -0.591837 0.673469 0.308205 -0.591837 
+0.673469 0.306122 -0.59134 0.714286 0.320283 -0.591837 0.714286 0.306122 -0.588477 
+0.755102 0.332362 -0.591837 0.755102 0.306122 -0.585641 0.795918 0.34444 -0.591837 
+0.795918 0.306122 -0.582832 0.836735 0.306122 -0.58005 0.877551 0.306122 -0.577294 
+0.918367 0.306122 -0.574565 0.959184 0.306122 -0.571861 1 0.306122 -0.569182 
+0.804363 0.346939 -0.591837 0.836735 0.356518 -0.591837 0.836735 0.346939 -0.589596 
+0.877551 0.368596 -0.591837 0.877551 0.346939 -0.586795 0.918367 0.380675 -0.591837 
+0.918367 0.346939 -0.584021 0.959184 0.346939 -0.581272 1 0.346939 -0.57855 
+0.942294 0.387755 -0.591837 0.959184 0.392753 -0.591837 0.959184 0.387755 -0.590684 
+1 0.404831 -0.591837 1 0.387755 -0.587918 -1 -0.428571 -0.52062 
+-0.959184 -0.428571 -0.517549 -0.918367 -0.428571 -0.514513 -0.877551 -0.428571 -0.511513 
+-1 -0.387755 -0.53249 -0.959184 -0.387755 -0.529348 -0.918367 -0.387755 -0.526243 
+-0.877551 -0.387755 -0.523175 -0.836735 -0.387755 -0.520142 -0.795918 -0.387755 -0.517144 
+-0.755102 -0.387755 -0.51418 -0.714286 -0.387755 -0.511251 -1 -0.324032 -0.55102 
+-1 -0.346939 -0.544359 -0.959184 -0.312786 -0.55102 -0.959184 -0.346939 -0.541147 
+-0.918367 -0.346939 -0.537974 -0.877551 -0.346939 -0.534837 -0.836735 -0.346939 -0.531736 
+-0.795918 -0.346939 -0.528671 -0.755102 -0.346939 -0.525642 -0.714286 -0.346939 -0.522647 
+-0.673469 -0.346939 -0.519686 -0.632653 -0.346939 -0.516758 -0.591837 -0.346939 -0.513863 
+-0.55102 -0.346939 -0.511 -0.934996 -0.306122 -0.55102 -0.918367 -0.301541 -0.55102 
+-0.918367 -0.306122 -0.549704 -0.877551 -0.290296 -0.55102 -0.877551 -0.306122 -0.546498 
+-0.836735 -0.27905 -0.55102 -0.836735 -0.306122 -0.54333 -0.795918 -0.267805 -0.55102 
+-0.795918 -0.306122 -0.540199 -0.755102 -0.306122 -0.537103 -0.714286 -0.306122 -0.534043 
+-0.673469 -0.306122 -0.531017 -0.632653 -0.306122 -0.528025 -0.591837 -0.306122 -0.525067 
+-0.55102 -0.306122 -0.522142 -0.510204 -0.306122 -0.519249 -0.469388 -0.306122 -0.516388 
+-0.428571 -0.306122 -0.513559 -0.387755 -0.306122 -0.51076 -0.786848 -0.265306 -0.55102 
+-0.755102 -0.25656 -0.55102 -0.755102 -0.265306 -0.548564 -0.714286 -0.245314 -0.55102 
+-0.714286 -0.265306 -0.545439 -0.673469 -0.234069 -0.55102 -0.673469 -0.265306 -0.542348 
+-0.632653 -0.265306 -0.539293 -0.591837 -0.265306 -0.536272 -0.55102 -0.265306 -0.533284 
+-0.510204 -0.265306 -0.53033 -0.469388 -0.265306 -0.527408 -0.428571 -0.265306 -0.524518 
+-0.387755 -0.265306 -0.521659 -0.346939 -0.265306 -0.518832 -0.306122 -0.265306 -0.516035 
+-0.265306 -0.265306 -0.513268 -0.22449 -0.265306 -0.510531 -0.6387 -0.22449 -0.55102 
+-0.632653 -0.222824 -0.55102 -0.632653 -0.22449 -0.550561 -0.591837 -0.211579 -0.55102 
+-0.591837 -0.22449 -0.547476 -0.55102 -0.200333 -0.55102 -0.55102 -0.22449 -0.544426 
+-0.510204 -0.189088 -0.55102 -0.510204 -0.22449 -0.54141 -0.469388 -0.22449 -0.538427 
+-0.428571 -0.22449 -0.535477 -0.387755 -0.22449 -0.532559 -0.346939 -0.22449 -0.529672 
+-0.306122 -0.22449 -0.526817 -0.265306 -0.22449 -0.523992 -0.22449 -0.22449 -0.521197 
+-0.183673 -0.22449 -0.518432 -0.142857 -0.22449 -0.515697 -0.102041 -0.22449 -0.512989 
+-0.0612245 -0.22449 -0.510311 -0.490552 -0.183673 -0.55102 -0.469388 -0.177843 -0.55102 
+-0.469388 -0.183673 -0.549446 -0.428571 -0.166597 -0.55102 -0.428571 -0.183673 -0.546436 
+-0.387755 -0.155352 -0.55102 -0.387755 -0.183673 -0.543458 -0.346939 -0.144107 -0.55102 
+-0.346939 -0.183673 -0.540512 -0.306122 -0.183673 -0.537598 -0.265306 -0.183673 -0.534716 
+-0.22449 -0.183673 -0.531864 -0.183673 -0.183673 -0.529042 -0.142857 -0.183673 -0.526251 
+-0.102041 -0.183673 -0.523488 -0.0612245 -0.183673 -0.520755 -0.0204082 -0.183673 -0.518049 
+0.0204082 -0.183673 -0.515372 0.0612245 -0.183673 -0.512722 -0.342404 -0.142857 -0.55102 
+-0.306122 -0.132861 -0.55102 -0.306122 -0.142857 -0.54838 -0.265306 -0.121616 -0.55102 
+-0.265306 -0.142857 -0.54544 -0.22449 -0.110371 -0.55102 -0.22449 -0.142857 -0.542531 
+-0.183673 -0.142857 -0.539652 -0.142857 -0.142857 -0.536805 -0.102041 -0.142857 -0.533987 
+-0.0612245 -0.142857 -0.531198 -0.0204082 -0.142857 -0.528439 0.0204082 -0.142857 -0.525708 
+0.0612245 -0.142857 -0.523005 0.102041 -0.142857 -0.52033 0.142857 -0.142857 -0.517682 
+0.183673 -0.142857 -0.515061 0.22449 -0.142857 -0.512466 -0.194255 -0.102041 -0.55102 
+-0.183673 -0.0991254 -0.55102 -0.183673 -0.102041 -0.550263 -0.142857 -0.0878801 -0.55102 
+-0.142857 -0.102041 -0.547359 -0.102041 -0.0766347 -0.55102 -0.102041 -0.102041 -0.544486 
+-0.0612245 -0.0653894 -0.55102 -0.0612245 -0.102041 -0.541642 -0.0204082 -0.102041 -0.538828 
+0.0204082 -0.102041 -0.536044 0.0612245 -0.102041 -0.533288 0.102041 -0.102041 -0.53056 
+0.142857 -0.102041 -0.52786 0.183673 -0.102041 -0.525187 0.22449 -0.102041 -0.522542 
+0.265306 -0.102041 -0.519922 0.306122 -0.102041 -0.517329 0.346939 -0.102041 -0.514762 
+0.387755 -0.102041 -0.51222 -0.0461073 -0.0612245 -0.55102 -0.0204082 -0.0541441 -0.55102 
+-0.0204082 -0.0612245 -0.549218 0.0204082 -0.0428988 -0.55102 0.0204082 -0.0612245 -0.54638 
+0.0612245 -0.0316535 -0.55102 0.0612245 -0.0612245 -0.543571 0.102041 -0.0612245 -0.54079 
+0.142857 -0.0612245 -0.538038 0.183673 -0.0612245 -0.535314 0.22449 -0.0612245 -0.532617 
+0.265306 -0.0612245 -0.529947 0.306122 -0.0612245 -0.527304 0.346939 -0.0612245 -0.524687 
+0.387755 -0.0612245 -0.522096 0.428571 -0.0612245 -0.519531 0.469388 -0.0612245 -0.51699 
+0.510204 -0.0612245 -0.514474 0.55102 -0.0612245 -0.511983 0.142857 -0.00916285 -0.55102 
+0.142857 -0.0204082 -0.548216 0.183673 0.00208247 -0.55102 0.183673 -0.0204082 -0.54544 
+0.22449 0.0133278 -0.55102 0.22449 -0.0204082 -0.542693 0.265306 -0.0204082 -0.539972 
+0.306122 -0.0204082 -0.537279 0.346939 -0.0204082 -0.534613 0.387755 -0.0204082 -0.531973 
+0.428571 -0.0204082 -0.529359 0.469388 -0.0204082 -0.52677 0.510204 -0.0204082 -0.524207 
+0.55102 -0.0204082 -0.521668 0.591837 -0.0204082 -0.519154 0.632653 -0.0204082 -0.516664 
+0.673469 -0.0204082 -0.514198 0.714286 -0.0204082 -0.511755 0.250189 0.0204082 -0.55102 
+0.265306 0.0245731 -0.55102 0.265306 0.0204082 -0.549997 0.306122 0.0358184 -0.55102 
+0.306122 0.0204082 -0.547254 0.346939 0.0470637 -0.55102 0.346939 0.0204082 -0.544538 
+0.387755 0.058309 -0.55102 0.387755 0.0204082 -0.541849 0.428571 0.0204082 -0.539187 
+0.469388 0.0204082 -0.53655 0.510204 0.0204082 -0.533939 0.55102 0.0204082 -0.531353 
+0.591837 0.0204082 -0.528793 0.632653 0.0204082 -0.526257 0.673469 0.0204082 -0.523745 
+0.714286 0.0204082 -0.521257 0.755102 0.0204082 -0.518792 0.795918 0.0204082 -0.516351 
+0.836735 0.0204082 -0.513932 0.877551 0.0204082 -0.511536 0.398337 0.0612245 -0.55102 
+0.428571 0.0695544 -0.55102 0.428571 0.0612245 -0.549015 0.469388 0.0807997 -0.55102 
+0.469388 0.0612245 -0.54633 0.510204 0.092045 -0.55102 0.510204 0.0612245 -0.543671 
+0.55102 0.0612245 -0.541039 0.591837 0.0612245 -0.538431 0.632653 0.0612245 -0.535849 
+0.673469 0.0612245 -0.533291 0.714286 0.0612245 -0.530758 0.755102 0.0612245 -0.528248 
+0.795918 0.0612245 -0.525762 0.836735 0.0612245 -0.5233 0.877551 0.0612245 -0.52086 
+0.918367 0.0612245 -0.518443 0.959184 0.0612245 -0.516048 1 0.0612245 -0.513676 
+0.546485 0.102041 -0.55102 0.55102 0.10329 -0.55102 0.55102 0.102041 -0.550724 
+0.591837 0.114536 -0.55102 0.591837 0.102041 -0.54807 0.632653 0.125781 -0.55102 
+0.632653 0.102041 -0.545441 0.673469 0.137026 -0.55102 0.673469 0.102041 -0.542838 
+0.714286 0.102041 -0.540259 0.755102 0.102041 -0.537704 0.795918 0.102041 -0.535174 
+0.836735 0.102041 -0.532667 0.877551 0.102041 -0.530184 0.918367 0.102041 -0.527724 
+0.959184 0.102041 -0.525286 1 0.102041 -0.522871 0.694633 0.142857 -0.55102 
+0.714286 0.148272 -0.55102 0.714286 0.142857 -0.54976 0.755102 0.159517 -0.55102 
+0.755102 0.142857 -0.547161 0.795918 0.170762 -0.55102 0.795918 0.142857 -0.544586 
+0.836735 0.182007 -0.55102 0.836735 0.142857 -0.542035 0.877551 0.142857 -0.539508 
+0.918367 0.142857 -0.537005 0.959184 0.142857 -0.534524 1 0.142857 -0.532067 
+0.842782 0.183673 -0.55102 0.877551 0.193253 -0.55102 0.877551 0.183673 -0.548832 
+0.918367 0.204498 -0.55102 0.918367 0.183673 -0.546285 0.959184 0.215743 -0.55102 
+0.959184 0.183673 -0.543762 1 0.183673 -0.541262 0.99093 0.22449 -0.55102 
+1 0.226989 -0.55102 1 0.22449 -0.550457 -1 -0.591837 -0.474002 
+-0.959184 -0.591837 -0.47127 -1 -0.55102 -0.485596 -0.959184 -0.55102 -0.482797 
+-0.918367 -0.55102 -0.48003 -0.877551 -0.55102 -0.477295 -0.836735 -0.55102 -0.474591 
+-0.795918 -0.55102 -0.471917 -1 -0.510204 -0.49719 -0.959184 -0.510204 -0.494325 
+-0.918367 -0.510204 -0.491492 -0.877551 -0.510204 -0.488691 -0.836735 -0.510204 -0.485922 
+-0.795918 -0.510204 -0.483185 -0.755102 -0.510204 -0.480478 -0.714286 -0.510204 -0.477801 
+-0.673469 -0.510204 -0.475154 -0.632653 -0.510204 -0.472536 -0.591837 -0.510204 -0.469947 
+-1 -0.46439 -0.510204 -1 -0.469388 -0.508784 -0.959184 -0.453977 -0.510204 
+-0.959184 -0.469388 -0.505852 -0.918367 -0.443565 -0.510204 -0.918367 -0.469388 -0.502953 
+-0.877551 -0.433153 -0.510204 -0.877551 -0.469388 -0.500087 -0.836735 -0.469388 -0.497254 
+-0.795918 -0.469388 -0.494452 -0.755102 -0.469388 -0.491682 -0.714286 -0.469388 -0.488943 
+-0.673469 -0.469388 -0.486234 -0.632653 -0.469388 -0.483555 -0.591837 -0.469388 -0.480906 
+-0.55102 -0.469388 -0.478285 -0.510204 -0.469388 -0.475693 -0.469388 -0.469388 -0.473128 
+-0.428571 -0.469388 -0.470591 -0.859592 -0.428571 -0.510204 -0.836735 -0.422741 -0.510204 
+-0.836735 -0.428571 -0.508585 -0.795918 -0.412328 -0.510204 -0.795918 -0.428571 -0.50572 
+-0.755102 -0.401916 -0.510204 -0.755102 -0.428571 -0.502887 -0.714286 -0.391504 -0.510204 
+-0.714286 -0.428571 -0.500085 -0.673469 -0.428571 -0.497315 -0.632653 -0.428571 -0.494575 
+-0.591837 -0.428571 -0.491865 -0.55102 -0.428571 -0.489184 -0.510204 -0.428571 -0.486533 
+-0.469388 -0.428571 -0.48391 -0.428571 -0.428571 -0.481315 -0.387755 -0.428571 -0.478748 
+-0.346939 -0.428571 -0.476209 -0.306122 -0.428571 -0.473696 -0.265306 -0.428571 -0.471209 
+-0.699592 -0.387755 -0.510204 -0.673469 -0.381091 -0.510204 -0.673469 -0.387755 -0.508395 
+-0.632653 -0.370679 -0.510204 -0.632653 -0.387755 -0.505594 -0.591837 -0.360267 -0.510204 
+-0.591837 -0.387755 -0.502824 -0.55102 -0.349854 -0.510204 -0.55102 -0.387755 -0.500083 
+-0.510204 -0.387755 -0.497373 -0.469388 -0.387755 -0.494692 -0.428571 -0.387755 -0.492039 
+-0.387755 -0.387755 -0.489415 -0.346939 -0.387755 -0.486819 -0.306122 -0.387755 -0.48425 
+-0.265306 -0.387755 -0.481708 -0.22449 -0.387755 -0.479192 -0.183673 -0.387755 -0.476703 
+-0.142857 -0.387755 -0.474239 -0.102041 -0.387755 -0.471801 -0.539592 -0.346939 -0.510204 
+-0.510204 -0.339442 -0.510204 -0.510204 -0.346939 -0.508213 -0.469388 -0.32903 -0.510204 
+-0.469388 -0.346939 -0.505473 -0.428571 -0.318617 -0.510204 -0.428571 -0.346939 -0.502763 
+-0.387755 -0.308205 -0.510204 -0.387755 -0.346939 -0.500082 -0.346939 -0.346939 -0.497429 
+-0.306122 -0.346939 -0.494804 -0.265306 -0.346939 -0.492206 -0.22449 -0.346939 -0.489636 
+-0.183673 -0.346939 -0.487092 -0.142857 -0.346939 -0.484575 -0.102041 -0.346939 -0.482084 
+-0.0612245 -0.346939 -0.479618 -0.0204082 -0.346939 -0.477177 0.0204082 -0.346939 -0.474761 
+0.0612245 -0.346939 -0.472369 0.102041 -0.346939 -0.470002 -0.379592 -0.306122 -0.510204 
+-0.346939 -0.297793 -0.510204 -0.346939 -0.306122 -0.508039 -0.306122 -0.28738 -0.510204 
+-0.306122 -0.306122 -0.505358 -0.265306 -0.276968 -0.510204 -0.265306 -0.306122 -0.502705 
+-0.22449 -0.266556 -0.510204 -0.22449 -0.306122 -0.50008 -0.183673 -0.306122 -0.497482 
+-0.142857 -0.306122 -0.494911 -0.102041 -0.306122 -0.492367 -0.0612245 -0.306122 -0.489848 
+-0.0204082 -0.306122 -0.487355 0.0204082 -0.306122 -0.484888 0.0612245 -0.306122 -0.482445 
+0.102041 -0.306122 -0.480027 0.142857 -0.306122 -0.477632 0.183673 -0.306122 -0.475262 
+0.22449 -0.306122 -0.472915 0.265306 -0.306122 -0.470591 -0.219592 -0.265306 -0.510204 
+-0.183673 -0.256143 -0.510204 -0.183673 -0.265306 -0.507872 -0.142857 -0.245731 -0.510204 
+-0.142857 -0.265306 -0.505247 -0.102041 -0.235319 -0.510204 -0.102041 -0.265306 -0.502649 
+-0.0612245 -0.224906 -0.510204 -0.0612245 -0.265306 -0.500078 -0.0204082 -0.265306 -0.497533 
+0.0204082 -0.265306 -0.495014 0.0612245 -0.265306 -0.49252 0.102041 -0.265306 -0.490052 
+0.142857 -0.265306 -0.487608 0.183673 -0.265306 -0.485188 0.22449 -0.265306 -0.482792 
+0.265306 -0.265306 -0.480419 0.306122 -0.265306 -0.47807 0.346939 -0.265306 -0.475744 
+0.387755 -0.265306 -0.47344 0.428571 -0.265306 -0.471158 -0.0595918 -0.22449 -0.510204 
+-0.0204082 -0.214494 -0.510204 -0.0204082 -0.22449 -0.507711 0.0204082 -0.204082 -0.510204 
+0.0204082 -0.22449 -0.505141 0.0612245 -0.193669 -0.510204 0.0612245 -0.22449 -0.502596 
+0.102041 -0.22449 -0.500077 0.142857 -0.22449 -0.497583 0.183673 -0.22449 -0.495113 
+0.22449 -0.22449 -0.492668 0.265306 -0.22449 -0.490247 0.306122 -0.22449 -0.48785 
+0.346939 -0.22449 -0.485476 0.387755 -0.22449 -0.483125 0.428571 -0.22449 -0.480797 
+0.469388 -0.22449 -0.478491 0.510204 -0.22449 -0.476207 0.55102 -0.22449 -0.473944 
+0.591837 -0.22449 -0.471704 0.632653 -0.22449 -0.469484 0.100408 -0.183673 -0.510204 
+0.102041 -0.183257 -0.510204 0.102041 -0.183673 -0.510102 0.142857 -0.172845 -0.510204 
+0.142857 -0.183673 -0.507558 0.183673 -0.162432 -0.510204 0.183673 -0.183673 -0.505039 
+0.22449 -0.15202 -0.510204 0.22449 -0.183673 -0.502545 0.265306 -0.183673 -0.500075 
+0.306122 -0.183673 -0.49763 0.346939 -0.183673 -0.495208 0.387755 -0.183673 -0.49281 
+0.428571 -0.183673 -0.490435 0.469388 -0.183673 -0.488083 0.510204 -0.183673 -0.485753 
+0.55102 -0.183673 -0.483446 0.591837 -0.183673 -0.48116 0.632653 -0.183673 -0.478896 
+0.673469 -0.183673 -0.476652 0.714286 -0.183673 -0.47443 0.755102 -0.183673 -0.472229 
+0.795918 -0.183673 -0.470048 0.260408 -0.142857 -0.510204 0.265306 -0.141608 -0.510204 
+0.265306 -0.142857 -0.509903 0.306122 -0.131195 -0.510204 0.306122 -0.142857 -0.50741 
+0.346939 -0.120783 -0.510204 0.346939 -0.142857 -0.504941 0.387755 -0.110371 -0.510204 
+0.387755 -0.142857 -0.502495 0.428571 -0.142857 -0.500074 0.469388 -0.142857 -0.497675 
+0.510204 -0.142857 -0.4953 0.55102 -0.142857 -0.492947 0.591837 -0.142857 -0.490616 
+0.632653 -0.142857 -0.488307 0.673469 -0.142857 -0.48602 0.714286 -0.142857 -0.483754 
+0.755102 -0.142857 -0.48151 0.795918 -0.142857 -0.479285 0.836735 -0.142857 -0.477082 
+0.877551 -0.142857 -0.474898 0.918367 -0.142857 -0.472735 0.959184 -0.142857 -0.470591 
+0.420408 -0.102041 -0.510204 0.428571 -0.0999584 -0.510204 0.428571 -0.102041 -0.509712 
+0.469388 -0.089546 -0.510204 0.469388 -0.102041 -0.507268 0.510204 -0.0791337 -0.510204 
+0.510204 -0.102041 -0.504846 0.55102 -0.0687214 -0.510204 0.55102 -0.102041 -0.502448 
+0.591837 -0.102041 -0.500072 0.632653 -0.102041 -0.497719 0.673469 -0.102041 -0.495388 
+0.714286 -0.102041 -0.493078 0.755102 -0.102041 -0.49079 0.795918 -0.102041 -0.488523 
+0.836735 -0.102041 -0.486277 0.877551 -0.102041 -0.484052 0.918367 -0.102041 -0.481847 
+0.959184 -0.102041 -0.479661 1 -0.102041 -0.477496 0.580408 -0.0612245 -0.510204 
+0.591837 -0.058309 -0.510204 0.591837 -0.0612245 -0.509529 0.632653 -0.0478967 -0.510204 
+0.632653 -0.0612245 -0.507131 0.673469 -0.0374844 -0.510204 0.673469 -0.0612245 -0.504756 
+0.714286 -0.0270721 -0.510204 0.714286 -0.0612245 -0.502402 0.755102 -0.0612245 -0.500071 
+0.795918 -0.0612245 -0.497761 0.836735 -0.0612245 -0.495473 0.877551 -0.0612245 -0.493205 
+0.918367 -0.0612245 -0.490958 0.959184 -0.0612245 -0.488732 1 -0.0612245 -0.486525 
+0.740408 -0.0204082 -0.510204 0.755102 -0.0166597 -0.510204 0.755102 -0.0204082 -0.509352 
+0.795918 -0.0062474 -0.510204 0.795918 -0.0204082 -0.506999 0.836735 0.00416493 -0.510204 
+0.836735 -0.0204082 -0.504668 0.877551 0.0145773 -0.510204 0.877551 -0.0204082 -0.502358 
+0.918367 -0.0204082 -0.50007 0.959184 -0.0204082 -0.497802 1 -0.0204082 -0.495554 
+0.900408 0.0204082 -0.510204 0.918367 0.0249896 -0.510204 0.918367 0.0204082 -0.509181 
+0.959184 0.0354019 -0.510204 0.959184 0.0204082 -0.506872 1 0.0458142 -0.510204 
+1 0.0204082 -0.504584 -1 -0.755102 -0.428571 -1 -0.714286 -0.439903 
+-0.959184 -0.714286 -0.437425 -0.918367 -0.714286 -0.434974 -0.877551 -0.714286 -0.432551 
+-0.836735 -0.714286 -0.430154 -1 -0.673469 -0.451234 -0.959184 -0.673469 -0.448692 
+-0.918367 -0.673469 -0.446178 -0.877551 -0.673469 -0.443693 -0.836735 -0.673469 -0.441235 
+-0.795918 -0.673469 -0.438804 -0.755102 -0.673469 -0.436399 -0.714286 -0.673469 -0.434021 
+-0.673469 -0.673469 -0.431669 -0.632653 -0.673469 -0.429342 -1 -0.60808 -0.469388 
+-1 -0.632653 -0.462566 -0.959184 -0.598501 -0.469388 -0.959184 -0.632653 -0.45996 
+-0.918367 -0.632653 -0.457383 -0.877551 -0.632653 -0.454835 -0.836735 -0.632653 -0.452315 
+-0.795918 -0.632653 -0.449823 -0.755102 -0.632653 -0.447358 -0.714286 -0.632653 -0.44492 
+-0.673469 -0.632653 -0.442509 -0.632653 -0.632653 -0.440123 -0.591837 -0.632653 -0.437763 
+-0.55102 -0.632653 -0.435429 -0.510204 -0.632653 -0.433119 -0.469388 -0.632653 -0.430833 
+-0.428571 -0.632653 -0.428571 -0.93079 -0.591837 -0.469388 -0.918367 -0.588921 -0.469388 
+-0.918367 -0.591837 -0.468587 -0.877551 -0.579342 -0.469388 -0.877551 -0.591837 -0.465977 
+-0.836735 -0.569763 -0.469388 -0.836735 -0.591837 -0.463395 -0.795918 -0.560183 -0.469388 
+-0.795918 -0.591837 -0.460842 -0.755102 -0.591837 -0.458317 -0.714286 -0.591837 -0.455819 
+-0.673469 -0.591837 -0.453349 -0.632653 -0.591837 -0.450905 -0.591837 -0.591837 -0.448487 
+-0.55102 -0.591837 -0.446095 -0.510204 -0.591837 -0.443729 -0.469388 -0.591837 -0.441387 
+-0.428571 -0.591837 -0.43907 -0.387755 -0.591837 -0.436777 -0.346939 -0.591837 -0.434508 
+-0.306122 -0.591837 -0.432263 -0.265306 -0.591837 -0.43004 -0.756877 -0.55102 -0.469388 
+-0.755102 -0.550604 -0.469388 -0.755102 -0.55102 -0.469276 -0.714286 -0.541025 -0.469388 
+-0.714286 -0.55102 -0.466719 -0.673469 -0.531445 -0.469388 -0.673469 -0.55102 -0.464189 
+-0.632653 -0.521866 -0.469388 -0.632653 -0.55102 -0.461687 -0.591837 -0.512287 -0.469388 
+-0.591837 -0.55102 -0.459211 -0.55102 -0.55102 -0.456762 -0.510204 -0.55102 -0.454339 
+-0.469388 -0.55102 -0.451941 -0.428571 -0.55102 -0.449569 -0.387755 -0.55102 -0.447221 
+-0.346939 -0.55102 -0.444898 -0.306122 -0.55102 -0.442599 -0.265306 -0.55102 -0.440323 
+-0.22449 -0.55102 -0.438071 -0.183673 -0.55102 -0.435842 -0.142857 -0.55102 -0.433635 
+-0.102041 -0.55102 -0.43145 -0.0612245 -0.55102 -0.429287 -0.582964 -0.510204 -0.469388 
+-0.55102 -0.502707 -0.469388 -0.55102 -0.510204 -0.467429 -0.510204 -0.493128 -0.469388 
+-0.510204 -0.510204 -0.464949 -0.469388 -0.483549 -0.469388 -0.469388 -0.510204 -0.462495 
+-0.428571 -0.473969 -0.469388 -0.428571 -0.510204 -0.460067 -0.387755 -0.510204 -0.457665 
+-0.346939 -0.510204 -0.455288 -0.306122 -0.510204 -0.452935 -0.265306 -0.510204 -0.450606 
+-0.22449 -0.510204 -0.448301 -0.183673 -0.510204 -0.44602 -0.142857 -0.510204 -0.443761 
+-0.102041 -0.510204 -0.441526 -0.0612245 -0.510204 -0.439313 -0.0204082 -0.510204 -0.437121 
+0.0204082 -0.510204 -0.434952 0.0612245 -0.510204 -0.432804 0.102041 -0.510204 -0.430677 
+0.142857 -0.510204 -0.428571 -0.409051 -0.469388 -0.469388 -0.387755 -0.46439 -0.469388 
+-0.387755 -0.469388 -0.468109 -0.346939 -0.454811 -0.469388 -0.346939 -0.469388 -0.465677 
+-0.306122 -0.445231 -0.469388 -0.306122 -0.469388 -0.463271 -0.265306 -0.435652 -0.469388 
+-0.265306 -0.469388 -0.460889 -0.22449 -0.469388 -0.458531 -0.183673 -0.469388 -0.456198 
+-0.142857 -0.469388 -0.453888 -0.102041 -0.469388 -0.451601 -0.0612245 -0.469388 -0.449338 
+-0.0204082 -0.469388 -0.447097 0.0204082 -0.469388 -0.444878 0.0612245 -0.469388 -0.442681 
+0.102041 -0.469388 -0.440505 0.142857 -0.469388 -0.438351 0.183673 -0.469388 -0.436218 
+0.22449 -0.469388 -0.434106 0.265306 -0.469388 -0.432014 0.306122 -0.469388 -0.429942 
+-0.235138 -0.428571 -0.469388 -0.22449 -0.426072 -0.469388 -0.22449 -0.428571 -0.468761 
+-0.183673 -0.416493 -0.469388 -0.183673 -0.428571 -0.466376 -0.142857 -0.406914 -0.469388 
+-0.142857 -0.428571 -0.464014 -0.102041 -0.397334 -0.469388 -0.102041 -0.428571 -0.461677 
+-0.0612245 -0.428571 -0.459363 -0.0204082 -0.428571 -0.457072 0.0204082 -0.428571 -0.454803 
+0.0612245 -0.428571 -0.452557 0.102041 -0.428571 -0.450333 0.142857 -0.428571 -0.448131 
+0.183673 -0.428571 -0.445951 0.22449 -0.428571 -0.443791 0.265306 -0.428571 -0.441652 
+0.306122 -0.428571 -0.439534 0.346939 -0.428571 -0.437436 0.387755 -0.428571 -0.435358 
+0.428571 -0.428571 -0.4333 0.469388 -0.428571 -0.43126 0.510204 -0.428571 -0.429241 
+-0.0612245 -0.387755 -0.469388 -0.0612245 -0.387755 -0.469388 -0.0612245 -0.387755 -0.469388 
+-0.0204082 -0.378176 -0.469388 -0.0204082 -0.387755 -0.467047 0.0204082 -0.368596 -0.469388 
+0.0204082 -0.387755 -0.464729 0.0612245 -0.359017 -0.469388 0.0612245 -0.387755 -0.462434 
+0.102041 -0.349438 -0.469388 0.102041 -0.387755 -0.460161 0.142857 -0.387755 -0.457911 
+0.183673 -0.387755 -0.455683 0.22449 -0.387755 -0.453476 0.265306 -0.387755 -0.451291 
+0.306122 -0.387755 -0.449126 0.346939 -0.387755 -0.446983 0.387755 -0.387755 -0.444859 
+0.428571 -0.387755 -0.442756 0.469388 -0.387755 -0.440672 0.510204 -0.387755 -0.438608 
+0.55102 -0.387755 -0.436563 0.591837 -0.387755 -0.434538 0.632653 -0.387755 -0.432531 
+0.673469 -0.387755 -0.430542 0.714286 -0.387755 -0.428571 0.112689 -0.346939 -0.469388 
+0.142857 -0.339858 -0.469388 0.142857 -0.346939 -0.467691 0.183673 -0.330279 -0.469388 
+0.183673 -0.346939 -0.465415 0.22449 -0.3207 -0.469388 0.22449 -0.346939 -0.463162 
+0.265306 -0.31112 -0.469388 0.265306 -0.346939 -0.460929 0.306122 -0.346939 -0.458719 
+0.346939 -0.346939 -0.456529 0.387755 -0.346939 -0.45436 0.428571 -0.346939 -0.452212 
+0.469388 -0.346939 -0.450084 0.510204 -0.346939 -0.447976 0.55102 -0.346939 -0.445887 
+0.591837 -0.346939 -0.443818 0.632653 -0.346939 -0.441768 0.673469 -0.346939 -0.439737 
+0.714286 -0.346939 -0.437725 0.755102 -0.346939 -0.435731 0.795918 -0.346939 -0.433754 
+0.836735 -0.346939 -0.431796 0.877551 -0.346939 -0.429856 0.286602 -0.306122 -0.469388 
+0.306122 -0.301541 -0.469388 0.306122 -0.306122 -0.468311 0.346939 -0.291962 -0.469388 
+0.346939 -0.306122 -0.466076 0.387755 -0.282382 -0.469388 0.387755 -0.306122 -0.463862 
+0.428571 -0.272803 -0.469388 0.428571 -0.306122 -0.461668 0.469388 -0.306122 -0.459496 
+0.510204 -0.306122 -0.457344 0.55102 -0.306122 -0.455211 0.591837 -0.306122 -0.453099 
+0.632653 -0.306122 -0.451006 0.673469 -0.306122 -0.448933 0.714286 -0.306122 -0.446878 
+0.755102 -0.306122 -0.444842 0.795918 -0.306122 -0.442825 0.836735 -0.306122 -0.440826 
+0.877551 -0.306122 -0.438844 0.918367 -0.306122 -0.436881 0.959184 -0.306122 -0.434935 
+1 -0.306122 -0.433006 0.460515 -0.265306 -0.469388 0.469388 -0.263224 -0.469388 
+0.469388 -0.265306 -0.468908 0.510204 -0.253644 -0.469388 0.510204 -0.265306 -0.466711 
+0.55102 -0.244065 -0.469388 0.55102 -0.265306 -0.464535 0.591837 -0.234486 -0.469388 
+0.591837 -0.265306 -0.46238 0.632653 -0.224906 -0.469388 0.632653 -0.265306 -0.460244 
+0.673469 -0.265306 -0.458128 0.714286 -0.265306 -0.456031 0.755102 -0.265306 -0.453954 
+0.795918 -0.265306 -0.451895 0.836735 -0.265306 -0.449855 0.877551 -0.265306 -0.447833 
+0.918367 -0.265306 -0.445829 0.959184 -0.265306 -0.443843 1 -0.265306 -0.441875 
+0.634428 -0.22449 -0.469388 0.673469 -0.215327 -0.469388 0.673469 -0.22449 -0.467323 
+0.714286 -0.205748 -0.469388 0.714286 -0.22449 -0.465185 0.755102 -0.196168 -0.469388 
+0.755102 -0.22449 -0.463065 0.795918 -0.186589 -0.469388 0.795918 -0.22449 -0.460965 
+0.836735 -0.22449 -0.458884 0.877551 -0.22449 -0.456822 0.918367 -0.22449 -0.454778 
+0.959184 -0.22449 -0.452752 1 -0.22449 -0.450744 0.808341 -0.183673 -0.469388 
+0.836735 -0.17701 -0.469388 0.836735 -0.183673 -0.467914 0.877551 -0.16743 -0.469388 
+0.877551 -0.183673 -0.465811 0.918367 -0.157851 -0.469388 0.918367 -0.183673 -0.463726 
+0.959184 -0.148272 -0.469388 0.959184 -0.183673 -0.461661 1 -0.183673 -0.459614 
+0.982254 -0.142857 -0.469388 1 -0.138692 -0.469388 1 -0.142857 -0.468483 
+-1 -0.877551 -0.39533 -0.959184 -0.877551 -0.393152 -0.918367 -0.877551 -0.390998 
+-0.877551 -0.877551 -0.388867 -1 -0.836735 -0.406411 -0.959184 -0.836735 -0.404172 
+-0.918367 -0.836735 -0.401957 -0.877551 -0.836735 -0.399766 -0.836735 -0.836735 -0.3976 
+-0.795918 -0.836735 -0.395456 -0.755102 -0.836735 -0.393336 -0.714286 -0.836735 -0.391238 
+-0.673469 -0.836735 -0.389163 -1 -0.795918 -0.417491 -0.959184 -0.795918 -0.415191 
+-0.918367 -0.795918 -0.412916 -0.877551 -0.795918 -0.410666 -0.836735 -0.795918 -0.40844 
+-0.795918 -0.795918 -0.406238 -0.755102 -0.795918 -0.40406 -0.714286 -0.795918 -0.401905 
+-0.673469 -0.795918 -0.399773 -0.632653 -0.795918 -0.397663 -0.591837 -0.795918 -0.395576 
+-0.55102 -0.795918 -0.39351 -0.510204 -0.795918 -0.391466 -0.469388 -0.795918 -0.389443 
+-0.959184 -0.746356 -0.428571 -0.959184 -0.755102 -0.42621 -0.918367 -0.737609 -0.428571 
+-0.918367 -0.755102 -0.423875 -0.877551 -0.728863 -0.428571 -0.877551 -0.755102 -0.421565 
+-0.836735 -0.720117 -0.428571 -0.836735 -0.755102 -0.41928 -0.795918 -0.755102 -0.41702 
+-0.755102 -0.755102 -0.414784 -0.714286 -0.755102 -0.412571 -0.673469 -0.755102 -0.410383 
+-0.632653 -0.755102 -0.408217 -0.591837 -0.755102 -0.406074 -0.55102 -0.755102 -0.403954 
+-0.510204 -0.755102 -0.401855 -0.469388 -0.755102 -0.399779 -0.428571 -0.755102 -0.397723 
+-0.387755 -0.755102 -0.395689 -0.346939 -0.755102 -0.393675 -0.306122 -0.755102 -0.391682 
+-0.265306 -0.755102 -0.389709 -0.809524 -0.714286 -0.428571 -0.795918 -0.71137 -0.428571 
+-0.795918 -0.714286 -0.427801 -0.755102 -0.702624 -0.428571 -0.755102 -0.714286 -0.425507 
+-0.714286 -0.693878 -0.428571 -0.714286 -0.714286 -0.423238 -0.673469 -0.685131 -0.428571 
+-0.673469 -0.714286 -0.420993 -0.632653 -0.676385 -0.428571 -0.632653 -0.714286 -0.418771 
+-0.591837 -0.714286 -0.416573 -0.55102 -0.714286 -0.414398 -0.510204 -0.714286 -0.412245 
+-0.469388 -0.714286 -0.410114 -0.428571 -0.714286 -0.408006 -0.387755 -0.714286 -0.405919 
+-0.346939 -0.714286 -0.403853 -0.306122 -0.714286 -0.401808 -0.265306 -0.714286 -0.399784 
+-0.22449 -0.714286 -0.39778 -0.183673 -0.714286 -0.395796 -0.142857 -0.714286 -0.393832 
+-0.102041 -0.714286 -0.391887 -0.0612245 -0.714286 -0.389961 -0.0204082 -0.714286 -0.388054 
+-0.619048 -0.673469 -0.428571 -0.591837 -0.667638 -0.428571 -0.591837 -0.673469 -0.427072 
+-0.55102 -0.658892 -0.428571 -0.55102 -0.673469 -0.424841 -0.510204 -0.650146 -0.428571 
+-0.510204 -0.673469 -0.422635 -0.469388 -0.641399 -0.428571 -0.469388 -0.673469 -0.42045 
+-0.428571 -0.673469 -0.418289 -0.387755 -0.673469 -0.416149 -0.346939 -0.673469 -0.414031 
+-0.306122 -0.673469 -0.411935 -0.265306 -0.673469 -0.40986 -0.22449 -0.673469 -0.407805 
+-0.183673 -0.673469 -0.405771 -0.142857 -0.673469 -0.403758 -0.102041 -0.673469 -0.401764 
+-0.0612245 -0.673469 -0.399789 -0.0204082 -0.673469 -0.397834 0.0204082 -0.673469 -0.395898 
+0.0612245 -0.673469 -0.393981 0.102041 -0.673469 -0.392083 0.142857 -0.673469 -0.390202 
+0.183673 -0.673469 -0.38834 -0.387755 -0.623907 -0.428571 -0.387755 -0.632653 -0.426379 
+-0.346939 -0.61516 -0.428571 -0.346939 -0.632653 -0.424209 -0.306122 -0.606414 -0.428571 
+-0.306122 -0.632653 -0.422061 -0.265306 -0.597668 -0.428571 -0.265306 -0.632653 -0.419935 
+-0.22449 -0.632653 -0.41783 -0.183673 -0.632653 -0.415746 -0.142857 -0.632653 -0.413683 
+-0.102041 -0.632653 -0.41164 -0.0612245 -0.632653 -0.409617 -0.0204082 -0.632653 -0.407614 
+0.0204082 -0.632653 -0.405631 0.0612245 -0.632653 -0.403667 0.102041 -0.632653 -0.401721 
+0.142857 -0.632653 -0.399794 0.183673 -0.632653 -0.397886 0.22449 -0.632653 -0.395996 
+0.265306 -0.632653 -0.394124 0.306122 -0.632653 -0.392269 0.346939 -0.632653 -0.390432 
+0.387755 -0.632653 -0.388611 -0.238095 -0.591837 -0.428571 -0.22449 -0.588921 -0.428571 
+-0.22449 -0.591837 -0.427855 -0.183673 -0.580175 -0.428571 -0.183673 -0.591837 -0.425721 
+-0.142857 -0.571429 -0.428571 -0.142857 -0.591837 -0.423609 -0.102041 -0.562682 -0.428571 
+-0.102041 -0.591837 -0.421517 -0.0612245 -0.553936 -0.428571 -0.0612245 -0.591837 -0.419445 
+-0.0204082 -0.591837 -0.417394 0.0204082 -0.591837 -0.415363 0.0612245 -0.591837 -0.413352 
+0.102041 -0.591837 -0.41136 0.142857 -0.591837 -0.409387 0.183673 -0.591837 -0.407433 
+0.22449 -0.591837 -0.405497 0.265306 -0.591837 -0.40358 0.306122 -0.591837 -0.401681 
+0.346939 -0.591837 -0.399799 0.387755 -0.591837 -0.397935 0.428571 -0.591837 -0.396089 
+0.469388 -0.591837 -0.394259 0.510204 -0.591837 -0.392447 0.55102 -0.591837 -0.390651 
+0.591837 -0.591837 -0.388871 -0.047619 -0.55102 -0.428571 -0.0204082 -0.545189 -0.428571 
+-0.0204082 -0.55102 -0.427174 0.0204082 -0.536443 -0.428571 0.0204082 -0.55102 -0.425096 
+0.0612245 -0.527697 -0.428571 0.0612245 -0.55102 -0.423037 0.102041 -0.51895 -0.428571 
+0.102041 -0.55102 -0.420998 0.142857 -0.55102 -0.418979 0.183673 -0.55102 -0.416979 
+0.22449 -0.55102 -0.414998 0.265306 -0.55102 -0.413036 0.306122 -0.55102 -0.411092 
+0.346939 -0.55102 -0.409167 0.387755 -0.55102 -0.407259 0.428571 -0.55102 -0.40537 
+0.469388 -0.55102 -0.403497 0.510204 -0.55102 -0.401642 0.55102 -0.55102 -0.399804 
+0.591837 -0.55102 -0.397982 0.632653 -0.55102 -0.396178 0.673469 -0.55102 -0.394389 
+0.714286 -0.55102 -0.392616 0.755102 -0.55102 -0.39086 0.795918 -0.55102 -0.389119 
+0.183673 -0.501458 -0.428571 0.183673 -0.510204 -0.426526 0.22449 -0.492711 -0.428571 
+0.22449 -0.510204 -0.424499 0.265306 -0.483965 -0.428571 0.265306 -0.510204 -0.422492 
+0.306122 -0.475219 -0.428571 0.306122 -0.510204 -0.420504 0.346939 -0.510204 -0.418535 
+0.387755 -0.510204 -0.416583 0.428571 -0.510204 -0.41465 0.469388 -0.510204 -0.412735 
+0.510204 -0.510204 -0.410837 0.55102 -0.510204 -0.408957 0.591837 -0.510204 -0.407094 
+0.632653 -0.510204 -0.405248 0.673469 -0.510204 -0.403418 0.714286 -0.510204 -0.401605 
+0.755102 -0.510204 -0.399808 0.795918 -0.510204 -0.398027 0.836735 -0.510204 -0.396262 
+0.877551 -0.510204 -0.394513 0.918367 -0.510204 -0.392779 0.959184 -0.510204 -0.39106 
+1 -0.510204 -0.389356 0.333333 -0.469388 -0.428571 0.346939 -0.466472 -0.428571 
+0.346939 -0.469388 -0.427902 0.387755 -0.457726 -0.428571 0.387755 -0.469388 -0.425907 
+0.428571 -0.44898 -0.428571 0.428571 -0.469388 -0.423931 0.469388 -0.440233 -0.428571 
+0.469388 -0.469388 -0.421973 0.510204 -0.431487 -0.428571 0.510204 -0.469388 -0.420033 
+0.55102 -0.469388 -0.41811 0.591837 -0.469388 -0.416206 0.632653 -0.469388 -0.414318 
+0.673469 -0.469388 -0.412448 0.714286 -0.469388 -0.410594 0.755102 -0.469388 -0.408757 
+0.795918 -0.469388 -0.406936 0.836735 -0.469388 -0.405131 0.877551 -0.469388 -0.403343 
+0.918367 -0.469388 -0.40157 0.959184 -0.469388 -0.399812 1 -0.469388 -0.39807 
+0.52381 -0.428571 -0.428571 0.55102 -0.422741 -0.428571 0.55102 -0.428571 -0.427264 
+0.591837 -0.413994 -0.428571 0.591837 -0.428571 -0.425317 0.632653 -0.405248 -0.428571 
+0.632653 -0.428571 -0.423388 0.673469 -0.396501 -0.428571 0.673469 -0.428571 -0.421477 
+0.714286 -0.428571 -0.419583 0.755102 -0.428571 -0.417705 0.795918 -0.428571 -0.415845 
+0.836735 -0.428571 -0.414001 0.877551 -0.428571 -0.412173 0.918367 -0.428571 -0.410361 
+0.959184 -0.428571 -0.408565 1 -0.428571 -0.406785 0.755102 -0.379009 -0.428571 
+0.755102 -0.387755 -0.426654 0.795918 -0.370262 -0.428571 0.795918 -0.387755 -0.424753 
+0.836735 -0.361516 -0.428571 0.836735 -0.387755 -0.42287 0.877551 -0.35277 -0.428571 
+0.877551 -0.387755 -0.421003 0.918367 -0.387755 -0.419152 0.959184 -0.387755 -0.417318 
+1 -0.387755 -0.4155 0.904762 -0.346939 -0.428571 0.918367 -0.344023 -0.428571 
+0.918367 -0.346939 -0.427943 0.959184 -0.335277 -0.428571 0.959184 -0.346939 -0.426071 
+1 -0.326531 -0.428571 1 -0.346939 -0.424214 -1 -1 -0.362646 
+-0.959184 -1 -0.360691 -0.918367 -1 -0.358757 -0.877551 -1 -0.356844 
+-0.836735 -1 -0.35495 -0.795918 -1 -0.353077 -0.755102 -1 -0.351224 
+-0.714286 -1 -0.34939 -0.673469 -1 -0.347575 -1 -0.959184 -0.373486 
+-0.959184 -0.959184 -0.371473 -0.918367 -0.959184 -0.369481 -0.877551 -0.959184 -0.36751 
+-0.836735 -0.959184 -0.365561 -0.795918 -0.959184 -0.363631 -0.755102 -0.959184 -0.361723 
+-0.714286 -0.959184 -0.359834 -0.673469 -0.959184 -0.357964 -0.632653 -0.959184 -0.356115 
+-0.591837 -0.959184 -0.354284 -0.55102 -0.959184 -0.352471 -0.510204 -0.959184 -0.350678 
+-0.469388 -0.959184 -0.348902 -0.428571 -0.959184 -0.347144 -1 -0.905456 -0.387755 
+-1 -0.918367 -0.384326 -0.959184 -0.897543 -0.387755 -0.959184 -0.918367 -0.382254 
+-0.918367 -0.889629 -0.387755 -0.918367 -0.918367 -0.380205 -0.877551 -0.881716 -0.387755 
+-0.877551 -0.918367 -0.378177 -0.836735 -0.918367 -0.376171 -0.795918 -0.918367 -0.374186 
+-0.755102 -0.918367 -0.372221 -0.714286 -0.918367 -0.370278 -0.673469 -0.918367 -0.368354 
+-0.632653 -0.918367 -0.36645 -0.591837 -0.918367 -0.364566 -0.55102 -0.918367 -0.362702 
+-0.510204 -0.918367 -0.360856 -0.469388 -0.918367 -0.359029 -0.428571 -0.918367 -0.35722 
+-0.387755 -0.918367 -0.355429 -0.346939 -0.918367 -0.353657 -0.306122 -0.918367 -0.351902 
+-0.265306 -0.918367 -0.350164 -0.22449 -0.918367 -0.348443 -0.856069 -0.877551 -0.387755 
+-0.836735 -0.873803 -0.387755 -0.836735 -0.877551 -0.386781 -0.795918 -0.865889 -0.387755 
+-0.795918 -0.877551 -0.38474 -0.755102 -0.857976 -0.387755 -0.755102 -0.877551 -0.38272 
+-0.714286 -0.850062 -0.387755 -0.714286 -0.877551 -0.380721 -0.673469 -0.842149 -0.387755 
+-0.673469 -0.877551 -0.378744 -0.632653 -0.877551 -0.376786 -0.591837 -0.877551 -0.374849 
+-0.55102 -0.877551 -0.372932 -0.510204 -0.877551 -0.371034 -0.469388 -0.877551 -0.369155 
+-0.428571 -0.877551 -0.367296 -0.387755 -0.877551 -0.365454 -0.346939 -0.877551 -0.363632 
+-0.306122 -0.877551 -0.361827 -0.265306 -0.877551 -0.36004 -0.22449 -0.877551 -0.358271 
+-0.183673 -0.877551 -0.356519 -0.142857 -0.877551 -0.354784 -0.102041 -0.877551 -0.353066 
+-0.0612245 -0.877551 -0.351365 -0.0204082 -0.877551 -0.349679 0.0204082 -0.877551 -0.34801 
+-0.645542 -0.836735 -0.387755 -0.632653 -0.834236 -0.387755 -0.632653 -0.836735 -0.387122 
+-0.591837 -0.826322 -0.387755 -0.591837 -0.836735 -0.385132 -0.55102 -0.818409 -0.387755 
+-0.55102 -0.836735 -0.383162 -0.510204 -0.810496 -0.387755 -0.510204 -0.836735 -0.381212 
+-0.469388 -0.802582 -0.387755 -0.469388 -0.836735 -0.379282 -0.428571 -0.836735 -0.377371 
+-0.387755 -0.836735 -0.37548 -0.346939 -0.836735 -0.373607 -0.306122 -0.836735 -0.371753 
+-0.265306 -0.836735 -0.369917 -0.22449 -0.836735 -0.368099 -0.183673 -0.836735 -0.366299 
+-0.142857 -0.836735 -0.364517 -0.102041 -0.836735 -0.362751 -0.0612245 -0.836735 -0.361003 
+-0.0204082 -0.836735 -0.359272 0.0204082 -0.836735 -0.357557 0.0612245 -0.836735 -0.355858 
+0.102041 -0.836735 -0.354176 0.142857 -0.836735 -0.352509 0.183673 -0.836735 -0.350858 
+0.22449 -0.836735 -0.349222 0.265306 -0.836735 -0.347602 -0.435016 -0.795918 -0.387755 
+-0.428571 -0.794669 -0.387755 -0.428571 -0.795918 -0.387447 -0.387755 -0.786756 -0.387755 
+-0.387755 -0.795918 -0.385505 -0.346939 -0.778842 -0.387755 -0.346939 -0.795918 -0.383582 
+-0.306122 -0.770929 -0.387755 -0.306122 -0.795918 -0.381678 -0.265306 -0.763015 -0.387755 
+-0.265306 -0.795918 -0.379793 -0.22449 -0.795918 -0.377927 -0.183673 -0.795918 -0.376079 
+-0.142857 -0.795918 -0.374249 -0.102041 -0.795918 -0.372437 -0.0612245 -0.795918 -0.370642 
+-0.0204082 -0.795918 -0.368864 0.0204082 -0.795918 -0.367103 0.0612245 -0.795918 -0.365359 
+0.102041 -0.795918 -0.363632 0.142857 -0.795918 -0.361921 0.183673 -0.795918 -0.360226 
+0.22449 -0.795918 -0.358546 0.265306 -0.795918 -0.356882 0.306122 -0.795918 -0.355234 
+0.346939 -0.795918 -0.353601 0.387755 -0.795918 -0.351982 0.428571 -0.795918 -0.350379 
+0.469388 -0.795918 -0.34879 0.510204 -0.795918 -0.347215 -0.22449 -0.755102 -0.387755 
+-0.22449 -0.755102 -0.387755 -0.22449 -0.755102 -0.387755 -0.183673 -0.747189 -0.387755 
+-0.183673 -0.755102 -0.385859 -0.142857 -0.739275 -0.387755 -0.142857 -0.755102 -0.383981 
+-0.102041 -0.731362 -0.387755 -0.102041 -0.755102 -0.382122 -0.0612245 -0.723449 -0.387755 
+-0.0612245 -0.755102 -0.38028 -0.0204082 -0.715535 -0.387755 -0.0204082 -0.755102 -0.378456 
+0.0204082 -0.755102 -0.37665 0.0612245 -0.755102 -0.374861 0.102041 -0.755102 -0.373088 
+0.142857 -0.755102 -0.371333 0.183673 -0.755102 -0.369593 0.22449 -0.755102 -0.36787 
+0.265306 -0.755102 -0.366163 0.306122 -0.755102 -0.364472 0.346939 -0.755102 -0.362796 
+0.387755 -0.755102 -0.361136 0.428571 -0.755102 -0.35949 0.469388 -0.755102 -0.35786 
+0.510204 -0.755102 -0.356245 0.55102 -0.755102 -0.354643 0.591837 -0.755102 -0.353057 
+0.632653 -0.755102 -0.351484 0.673469 -0.755102 -0.349925 0.714286 -0.755102 -0.34838 
+-0.0139635 -0.714286 -0.387755 0.0204082 -0.707622 -0.387755 0.0204082 -0.714286 -0.386196 
+0.0612245 -0.699708 -0.387755 0.0612245 -0.714286 -0.384362 0.102041 -0.691795 -0.387755 
+0.102041 -0.714286 -0.382545 0.142857 -0.683882 -0.387755 0.142857 -0.714286 -0.380744 
+0.183673 -0.675968 -0.387755 0.183673 -0.714286 -0.378961 0.22449 -0.714286 -0.377194 
+0.265306 -0.714286 -0.375444 0.306122 -0.714286 -0.37371 0.346939 -0.714286 -0.371992 
+0.387755 -0.714286 -0.370289 0.428571 -0.714286 -0.368602 0.469388 -0.714286 -0.36693 
+0.510204 -0.714286 -0.365274 0.55102 -0.714286 -0.363632 0.591837 -0.714286 -0.362005 
+0.632653 -0.714286 -0.360393 0.673469 -0.714286 -0.358795 0.714286 -0.714286 -0.35721 
+0.755102 -0.714286 -0.35564 0.795918 -0.714286 -0.354084 0.836735 -0.714286 -0.352541 
+0.877551 -0.714286 -0.351012 0.918367 -0.714286 -0.349495 0.959184 -0.714286 -0.347992 
+0.196563 -0.673469 -0.387755 0.22449 -0.668055 -0.387755 0.22449 -0.673469 -0.386518 
+0.265306 -0.660142 -0.387755 0.265306 -0.673469 -0.384725 0.306122 -0.652228 -0.387755 
+0.306122 -0.673469 -0.382948 0.346939 -0.644315 -0.387755 0.346939 -0.673469 -0.381187 
+0.387755 -0.636401 -0.387755 0.387755 -0.673469 -0.379442 0.428571 -0.673469 -0.377714 
+0.469388 -0.673469 -0.376001 0.510204 -0.673469 -0.374303 0.55102 -0.673469 -0.372621 
+0.591837 -0.673469 -0.370954 0.632653 -0.673469 -0.369301 0.673469 -0.673469 -0.367664 
+0.714286 -0.673469 -0.36604 0.755102 -0.673469 -0.364432 0.795918 -0.673469 -0.362837 
+0.836735 -0.673469 -0.361256 0.877551 -0.673469 -0.359688 0.918367 -0.673469 -0.358135 
+0.959184 -0.673469 -0.356594 1 -0.673469 -0.355067 0.407089 -0.632653 -0.387755 
+0.428571 -0.628488 -0.387755 0.428571 -0.632653 -0.386825 0.469388 -0.620575 -0.387755 
+0.469388 -0.632653 -0.385071 0.510204 -0.612661 -0.387755 0.510204 -0.632653 -0.383333 
+0.55102 -0.604748 -0.387755 0.55102 -0.632653 -0.38161 0.591837 -0.596835 -0.387755 
+0.591837 -0.632653 -0.379902 0.632653 -0.632653 -0.37821 0.673469 -0.632653 -0.376533 
+0.714286 -0.632653 -0.37487 0.755102 -0.632653 -0.373223 0.795918 -0.632653 -0.371589 
+0.836735 -0.632653 -0.36997 0.877551 -0.632653 -0.368365 0.918367 -0.632653 -0.366774 
+0.959184 -0.632653 -0.365196 1 -0.632653 -0.363632 0.617615 -0.591837 -0.387755 
+0.632653 -0.588921 -0.387755 0.632653 -0.591837 -0.387119 0.673469 -0.581008 -0.387755 
+0.673469 -0.591837 -0.385402 0.714286 -0.573095 -0.387755 0.714286 -0.591837 -0.3837 
+0.755102 -0.565181 -0.387755 0.755102 -0.591837 -0.382014 0.795918 -0.557268 -0.387755 
+0.795918 -0.591837 -0.380342 0.836735 -0.591837 -0.378685 0.877551 -0.591837 -0.377042 
+0.918367 -0.591837 -0.375413 0.959184 -0.591837 -0.373799 1 -0.591837 -0.372198 
+0.828142 -0.55102 -0.387755 0.836735 -0.549354 -0.387755 0.836735 -0.55102 -0.387399 
+0.877551 -0.541441 -0.387755 0.877551 -0.55102 -0.385719 0.918367 -0.533528 -0.387755 
+0.918367 -0.55102 -0.384053 0.959184 -0.525614 -0.387755 0.959184 -0.55102 -0.382401 
+1 -0.517701 -0.387755 1 -0.55102 -0.380763 -0.659064 -1 -0.346939 
+-0.632653 -0.995419 -0.346939 -0.632653 -1 -0.345802 -0.591837 -0.988338 -0.346939 
+-0.591837 -1 -0.34406 -0.55102 -0.981258 -0.346939 -0.55102 -1 -0.342335 
+-0.510204 -0.974177 -0.346939 -0.510204 -1 -0.340628 -0.469388 -0.967097 -0.346939 
+-0.469388 -1 -0.338938 -0.428571 -0.960017 -0.346939 -0.428571 -1 -0.337264 
+-0.387755 -1 -0.335606 -0.346939 -1 -0.333965 -0.306122 -1 -0.33234 
+-0.265306 -1 -0.330731 -0.22449 -1 -0.329137 -0.183673 -1 -0.327558 
+-0.142857 -1 -0.325995 -0.102041 -1 -0.324446 -0.0612245 -1 -0.322912 
+-0.0204082 -1 -0.321393 0.0204082 -1 -0.319887 0.0612245 -1 -0.318396 
+0.102041 -1 -0.316918 0.142857 -1 -0.315455 0.183673 -1 -0.314004 
+0.22449 -1 -0.312567 0.265306 -1 -0.311143 0.306122 -1 -0.309732 
+0.346939 -1 -0.308334 0.387755 -1 -0.306948 -0.42377 -0.959184 -0.346939 
+-0.387755 -0.952936 -0.346939 -0.387755 -0.959184 -0.345434 -0.346939 -0.945856 -0.346939 
+-0.346939 -0.959184 -0.343745 -0.306122 -0.938776 -0.346939 -0.306122 -0.959184 -0.342073 
+-0.265306 -0.931695 -0.346939 -0.265306 -0.959184 -0.340416 -0.22449 -0.924615 -0.346939 
+-0.22449 -0.959184 -0.338776 -0.183673 -0.959184 -0.337151 -0.142857 -0.959184 -0.335541 
+-0.102041 -0.959184 -0.333947 -0.0612245 -0.959184 -0.332368 -0.0204082 -0.959184 -0.330804 
+0.0204082 -0.959184 -0.329255 0.0612245 -0.959184 -0.32772 0.102041 -0.959184 -0.326199 
+0.142857 -0.959184 -0.324692 0.183673 -0.959184 -0.3232 0.22449 -0.959184 -0.32172 
+0.265306 -0.959184 -0.320255 0.306122 -0.959184 -0.318802 0.346939 -0.959184 -0.317363 
+0.387755 -0.959184 -0.315937 0.428571 -0.959184 -0.314523 0.469388 -0.959184 -0.313122 
+0.510204 -0.959184 -0.311734 0.55102 -0.959184 -0.310357 0.591837 -0.959184 -0.308993 
+0.632653 -0.959184 -0.307641 0.673469 -0.959184 -0.3063 -0.188475 -0.918367 -0.346939 
+-0.183673 -0.917534 -0.346939 -0.183673 -0.918367 -0.346743 -0.142857 -0.910454 -0.346939 
+-0.142857 -0.918367 -0.345088 -0.102041 -0.903374 -0.346939 -0.102041 -0.918367 -0.343449 
+-0.0612245 -0.896293 -0.346939 -0.0612245 -0.918367 -0.341825 -0.0204082 -0.889213 -0.346939 
+-0.0204082 -0.918367 -0.340216 0.0204082 -0.882132 -0.346939 0.0204082 -0.918367 -0.338623 
+0.0612245 -0.918367 -0.337044 0.102041 -0.918367 -0.33548 0.142857 -0.918367 -0.33393 
+0.183673 -0.918367 -0.332395 0.22449 -0.918367 -0.330874 0.265306 -0.918367 -0.329366 
+0.306122 -0.918367 -0.327873 0.346939 -0.918367 -0.326392 0.387755 -0.918367 -0.324925 
+0.428571 -0.918367 -0.323472 0.469388 -0.918367 -0.322031 0.510204 -0.918367 -0.320603 
+0.55102 -0.918367 -0.319187 0.591837 -0.918367 -0.317784 0.632653 -0.918367 -0.316394 
+0.673469 -0.918367 -0.315015 0.714286 -0.918367 -0.313648 0.755102 -0.918367 -0.312293 
+0.795918 -0.918367 -0.31095 0.836735 -0.918367 -0.309619 0.877551 -0.918367 -0.308298 
+0.918367 -0.918367 -0.306989 0.0468187 -0.877551 -0.346939 0.0612245 -0.875052 -0.346939 
+0.0612245 -0.877551 -0.346368 0.102041 -0.867972 -0.346939 0.102041 -0.877551 -0.344761 
+0.142857 -0.860891 -0.346939 0.142857 -0.877551 -0.343168 0.183673 -0.853811 -0.346939 
+0.183673 -0.877551 -0.34159 0.22449 -0.846731 -0.346939 0.22449 -0.877551 -0.340027 
+0.265306 -0.83965 -0.346939 0.265306 -0.877551 -0.338478 0.306122 -0.877551 -0.336943 
+0.346939 -0.877551 -0.335422 0.387755 -0.877551 -0.333914 0.428571 -0.877551 -0.33242 
+0.469388 -0.877551 -0.33094 0.510204 -0.877551 -0.329472 0.55102 -0.877551 -0.328017 
+0.591837 -0.877551 -0.326575 0.632653 -0.877551 -0.325146 0.673469 -0.877551 -0.323729 
+0.714286 -0.877551 -0.322325 0.755102 -0.877551 -0.320933 0.795918 -0.877551 -0.319552 
+0.836735 -0.877551 -0.318184 0.877551 -0.877551 -0.316827 0.918367 -0.877551 -0.315482 
+0.959184 -0.877551 -0.314148 1 -0.877551 -0.312825 0.282113 -0.836735 -0.346939 
+0.306122 -0.83257 -0.346939 0.306122 -0.836735 -0.346013 0.346939 -0.825489 -0.346939 
+0.346939 -0.836735 -0.344451 0.387755 -0.818409 -0.346939 0.387755 -0.836735 -0.342903 
+0.428571 -0.811329 -0.346939 0.428571 -0.836735 -0.341369 0.469388 -0.804248 -0.346939 
+0.469388 -0.836735 -0.339848 0.510204 -0.797168 -0.346939 0.510204 -0.836735 -0.338341 
+0.55102 -0.836735 -0.336847 0.591837 -0.836735 -0.335367 0.632653 -0.836735 -0.333899 
+0.673469 -0.836735 -0.332444 0.714286 -0.836735 -0.331002 0.755102 -0.836735 -0.329572 
+0.795918 -0.836735 -0.328154 0.836735 -0.836735 -0.326749 0.877551 -0.836735 -0.325356 
+0.918367 -0.836735 -0.323974 0.959184 -0.836735 -0.322604 1 -0.836735 -0.321246 
+0.517407 -0.795918 -0.346939 0.55102 -0.790087 -0.346939 0.55102 -0.795918 -0.345677 
+0.591837 -0.783007 -0.346939 0.591837 -0.795918 -0.344158 0.632653 -0.775927 -0.346939 
+0.632653 -0.795918 -0.342652 0.673469 -0.768846 -0.346939 0.673469 -0.795918 -0.341159 
+0.714286 -0.761766 -0.346939 0.714286 -0.795918 -0.339679 0.755102 -0.795918 -0.338211 
+0.795918 -0.795918 -0.336757 0.836735 -0.795918 -0.335314 0.877551 -0.795918 -0.333885 
+0.918367 -0.795918 -0.332467 0.959184 -0.795918 -0.331061 1 -0.795918 -0.329667 
+0.752701 -0.755102 -0.346939 0.755102 -0.754686 -0.346939 0.755102 -0.755102 -0.346851 
+0.795918 -0.747605 -0.346939 0.795918 -0.755102 -0.345359 0.836735 -0.740525 -0.346939 
+0.836735 -0.755102 -0.34388 0.877551 -0.733444 -0.346939 0.877551 -0.755102 -0.342413 
+0.918367 -0.726364 -0.346939 0.918367 -0.755102 -0.340959 0.959184 -0.719284 -0.346939 
+0.959184 -0.755102 -0.339518 1 -0.755102 -0.338088 0.987995 -0.714286 -0.346939 
+1 -0.712203 -0.346939 1 -0.714286 -0.346509 0.412245 -1 -0.306122 
+0.428571 -0.997501 -0.306122 0.428571 -1 -0.305584 0.469388 -0.991254 -0.306122 
+0.469388 -1 -0.304247 0.510204 -0.985006 -0.306122 0.510204 -1 -0.302921 
+0.55102 -0.978759 -0.306122 0.55102 -1 -0.301607 0.591837 -0.972511 -0.306122 
+0.591837 -1 -0.300304 0.632653 -0.966264 -0.306122 0.632653 -1 -0.299013 
+0.673469 -0.960017 -0.306122 0.673469 -1 -0.297732 0.714286 -1 -0.296462 
+0.755102 -1 -0.295203 0.795918 -1 -0.293955 0.836735 -1 -0.292718 
+0.877551 -1 -0.29149 0.918367 -1 -0.290273 0.959184 -1 -0.289066 
+1 -1 -0.287869 0.678912 -0.959184 -0.306122 0.714286 -0.953769 -0.306122 
+0.714286 -0.959184 -0.304991 0.755102 -0.947522 -0.306122 0.755102 -0.959184 -0.303696 
+0.795918 -0.941274 -0.306122 0.795918 -0.959184 -0.302412 0.836735 -0.935027 -0.306122 
+0.836735 -0.959184 -0.301139 0.877551 -0.92878 -0.306122 0.877551 -0.959184 -0.299876 
+0.918367 -0.922532 -0.306122 0.918367 -0.959184 -0.298624 0.959184 -0.959184 -0.297382 
+1 -0.959184 -0.296151 0.945578 -0.918367 -0.306122 0.959184 -0.916285 -0.306122 
+0.959184 -0.918367 -0.305698 1 -0.910037 -0.306122 1 -0.918367 -0.304432 
+
+POLYGONS 6406 25624
+3 0 1 18 
+3 16 0 18 
+3 18 1 23 
+3 1 0 4 
+3 4 0 3 
+3 24 23 1 
+3 24 1 5 
+3 5 1 4 
+3 5 6 26 
+3 24 5 26 
+3 26 6 31 
+3 2 7 3 
+3 7 4 3 
+3 5 4 8 
+3 8 4 7 
+3 6 5 9 
+3 9 5 8 
+3 32 31 6 
+3 32 6 10 
+3 10 6 9 
+3 10 11 34 
+3 32 10 34 
+3 34 11 40 
+3 49 12 55 
+3 56 55 12 
+3 56 12 14 
+3 14 12 13 
+3 14 15 58 
+3 56 14 58 
+3 58 15 64 
+3 14 13 19 
+3 19 13 17 
+3 15 14 20 
+3 20 14 19 
+3 65 64 15 
+3 65 15 21 
+3 21 15 20 
+3 21 22 67 
+3 65 21 67 
+3 67 22 73 
+3 18 17 16 
+3 19 17 18 
+3 23 19 18 
+3 23 25 19 
+3 25 20 19 
+3 21 20 27 
+3 27 20 25 
+3 22 21 28 
+3 28 21 27 
+3 74 73 22 
+3 74 22 29 
+3 29 22 28 
+3 29 30 76 
+3 74 29 76 
+3 76 30 83 
+3 23 24 25 
+3 26 25 24 
+3 27 25 26 
+3 31 27 26 
+3 31 33 27 
+3 33 28 27 
+3 29 28 35 
+3 35 28 33 
+3 30 29 36 
+3 36 29 35 
+3 84 83 30 
+3 84 30 37 
+3 37 30 36 
+3 37 38 86 
+3 84 37 86 
+3 38 39 88 
+3 86 38 88 
+3 88 39 94 
+3 31 32 33 
+3 34 33 32 
+3 35 33 34 
+3 40 35 34 
+3 40 41 35 
+3 41 36 35 
+3 37 36 42 
+3 42 36 41 
+3 38 37 43 
+3 43 37 42 
+3 39 38 44 
+3 44 38 43 
+3 95 94 39 
+3 95 39 45 
+3 45 39 44 
+3 45 46 97 
+3 95 45 97 
+3 97 46 103 
+3 47 48 118 
+3 116 47 118 
+3 118 48 125 
+3 48 47 51 
+3 51 47 50 
+3 126 125 48 
+3 126 48 52 
+3 52 48 51 
+3 52 53 128 
+3 126 52 128 
+3 53 54 130 
+3 128 53 130 
+3 130 54 136 
+3 55 50 49 
+3 55 57 50 
+3 57 51 50 
+3 52 51 59 
+3 59 51 57 
+3 53 52 60 
+3 60 52 59 
+3 54 53 61 
+3 61 53 60 
+3 137 136 54 
+3 137 54 62 
+3 62 54 61 
+3 62 63 139 
+3 137 62 139 
+3 139 63 146 
+3 55 56 57 
+3 58 57 56 
+3 59 57 58 
+3 64 59 58 
+3 64 66 59 
+3 66 60 59 
+3 61 60 68 
+3 68 60 66 
+3 62 61 69 
+3 69 61 68 
+3 63 62 70 
+3 70 62 69 
+3 147 146 63 
+3 147 63 71 
+3 71 63 70 
+3 71 72 149 
+3 147 71 149 
+3 149 72 156 
+3 64 65 66 
+3 67 66 65 
+3 68 66 67 
+3 73 68 67 
+3 73 75 68 
+3 75 69 68 
+3 70 69 77 
+3 77 69 75 
+3 71 70 78 
+3 78 70 77 
+3 72 71 79 
+3 79 71 78 
+3 157 156 72 
+3 157 72 80 
+3 80 72 79 
+3 80 81 159 
+3 157 80 159 
+3 81 82 161 
+3 159 81 161 
+3 161 82 167 
+3 73 74 75 
+3 76 75 74 
+3 77 75 76 
+3 83 77 76 
+3 83 85 77 
+3 85 78 77 
+3 79 78 87 
+3 87 78 85 
+3 80 79 89 
+3 89 79 87 
+3 81 80 90 
+3 90 80 89 
+3 82 81 91 
+3 91 81 90 
+3 168 167 82 
+3 168 82 92 
+3 92 82 91 
+3 92 93 170 
+3 168 92 170 
+3 170 93 177 
+3 83 84 85 
+3 86 85 84 
+3 87 85 86 
+3 88 87 86 
+3 89 87 88 
+3 94 89 88 
+3 94 96 89 
+3 96 90 89 
+3 91 90 98 
+3 98 90 96 
+3 92 91 99 
+3 99 91 98 
+3 93 92 100 
+3 100 92 99 
+3 178 177 93 
+3 178 93 101 
+3 101 93 100 
+3 101 102 180 
+3 178 101 180 
+3 180 102 187 
+3 94 95 96 
+3 97 96 95 
+3 98 96 97 
+3 103 98 97 
+3 103 104 98 
+3 104 99 98 
+3 100 99 105 
+3 105 99 104 
+3 101 100 106 
+3 106 100 105 
+3 102 101 107 
+3 107 101 106 
+3 188 187 102 
+3 188 102 108 
+3 108 102 107 
+3 108 109 190 
+3 188 108 190 
+3 190 109 198 
+3 110 111 215 
+3 213 110 215 
+3 215 111 222 
+3 111 110 113 
+3 113 110 112 
+3 223 222 111 
+3 223 111 114 
+3 114 111 113 
+3 114 115 225 
+3 223 114 225 
+3 225 115 232 
+3 113 112 119 
+3 119 112 117 
+3 114 113 120 
+3 120 113 119 
+3 115 114 121 
+3 121 114 120 
+3 233 232 115 
+3 233 115 122 
+3 122 115 121 
+3 122 123 235 
+3 233 122 235 
+3 123 124 237 
+3 235 123 237 
+3 237 124 244 
+3 118 117 116 
+3 119 117 118 
+3 125 119 118 
+3 125 127 119 
+3 127 120 119 
+3 121 120 129 
+3 129 120 127 
+3 122 121 131 
+3 131 121 129 
+3 123 122 132 
+3 132 122 131 
+3 124 123 133 
+3 133 123 132 
+3 245 244 124 
+3 245 124 134 
+3 134 124 133 
+3 134 135 247 
+3 245 134 247 
+3 247 135 254 
+3 125 126 127 
+3 128 127 126 
+3 129 127 128 
+3 130 129 128 
+3 131 129 130 
+3 136 131 130 
+3 136 138 131 
+3 138 132 131 
+3 133 132 140 
+3 140 132 138 
+3 134 133 141 
+3 141 133 140 
+3 135 134 142 
+3 142 134 141 
+3 255 254 135 
+3 255 135 143 
+3 143 135 142 
+3 143 144 257 
+3 255 143 257 
+3 144 145 259 
+3 257 144 259 
+3 259 145 266 
+3 136 137 138 
+3 139 138 137 
+3 140 138 139 
+3 146 140 139 
+3 146 148 140 
+3 148 141 140 
+3 142 141 150 
+3 150 141 148 
+3 143 142 151 
+3 151 142 150 
+3 144 143 152 
+3 152 143 151 
+3 145 144 153 
+3 153 144 152 
+3 267 266 145 
+3 267 145 154 
+3 154 145 153 
+3 154 155 269 
+3 267 154 269 
+3 269 155 276 
+3 146 147 148 
+3 149 148 147 
+3 150 148 149 
+3 156 150 149 
+3 156 158 150 
+3 158 151 150 
+3 152 151 160 
+3 160 151 158 
+3 153 152 162 
+3 162 152 160 
+3 154 153 163 
+3 163 153 162 
+3 155 154 164 
+3 164 154 163 
+3 277 276 155 
+3 277 155 165 
+3 165 155 164 
+3 165 166 279 
+3 277 165 279 
+3 279 166 287 
+3 156 157 158 
+3 159 158 157 
+3 160 158 159 
+3 161 160 159 
+3 162 160 161 
+3 167 162 161 
+3 167 169 162 
+3 169 163 162 
+3 164 163 171 
+3 171 163 169 
+3 165 164 172 
+3 172 164 171 
+3 166 165 173 
+3 173 165 172 
+3 288 287 166 
+3 288 166 174 
+3 174 166 173 
+3 174 175 290 
+3 288 174 290 
+3 175 176 292 
+3 290 175 292 
+3 292 176 299 
+3 167 168 169 
+3 170 169 168 
+3 171 169 170 
+3 177 171 170 
+3 177 179 171 
+3 179 172 171 
+3 173 172 181 
+3 181 172 179 
+3 174 173 182 
+3 182 173 181 
+3 175 174 183 
+3 183 174 182 
+3 176 175 184 
+3 184 175 183 
+3 300 299 176 
+3 300 176 185 
+3 185 176 184 
+3 185 186 302 
+3 300 185 302 
+3 302 186 310 
+3 177 178 179 
+3 180 179 178 
+3 181 179 180 
+3 187 181 180 
+3 187 189 181 
+3 189 182 181 
+3 183 182 191 
+3 191 182 189 
+3 184 183 192 
+3 192 183 191 
+3 185 184 193 
+3 193 184 192 
+3 186 185 194 
+3 194 185 193 
+3 311 310 186 
+3 311 186 195 
+3 195 186 194 
+3 195 196 313 
+3 311 195 313 
+3 196 197 315 
+3 313 196 315 
+3 315 197 322 
+3 187 188 189 
+3 190 189 188 
+3 191 189 190 
+3 198 191 190 
+3 198 199 191 
+3 199 192 191 
+3 193 192 200 
+3 200 192 199 
+3 194 193 201 
+3 201 193 200 
+3 195 194 202 
+3 202 194 201 
+3 196 195 203 
+3 203 195 202 
+3 197 196 204 
+3 204 196 203 
+3 323 322 197 
+3 323 197 205 
+3 205 197 204 
+3 205 206 325 
+3 323 205 325 
+3 325 206 333 
+3 207 208 350 
+3 348 207 350 
+3 350 208 357 
+3 208 207 210 
+3 210 207 209 
+3 358 357 208 
+3 358 208 211 
+3 211 208 210 
+3 211 212 360 
+3 358 211 360 
+3 360 212 368 
+3 210 209 216 
+3 216 209 214 
+3 211 210 217 
+3 217 210 216 
+3 212 211 218 
+3 218 211 217 
+3 369 368 212 
+3 369 212 219 
+3 219 212 218 
+3 219 220 371 
+3 369 219 371 
+3 220 221 373 
+3 371 220 373 
+3 373 221 380 
+3 215 214 213 
+3 216 214 215 
+3 222 216 215 
+3 222 224 216 
+3 224 217 216 
+3 218 217 226 
+3 226 217 224 
+3 219 218 227 
+3 227 218 226 
+3 220 219 228 
+3 228 219 227 
+3 221 220 229 
+3 229 220 228 
+3 381 380 221 
+3 381 221 230 
+3 230 221 229 
+3 230 231 383 
+3 381 230 383 
+3 383 231 391 
+3 222 223 224 
+3 225 224 223 
+3 226 224 225 
+3 232 226 225 
+3 232 234 226 
+3 234 227 226 
+3 228 227 236 
+3 236 227 234 
+3 229 228 238 
+3 238 228 236 
+3 230 229 239 
+3 239 229 238 
+3 231 230 240 
+3 240 230 239 
+3 392 391 231 
+3 392 231 241 
+3 241 231 240 
+3 241 242 394 
+3 392 241 394 
+3 242 243 396 
+3 394 242 396 
+3 396 243 404 
+3 232 233 234 
+3 235 234 233 
+3 236 234 235 
+3 237 236 235 
+3 238 236 237 
+3 244 238 237 
+3 244 246 238 
+3 246 239 238 
+3 240 239 248 
+3 248 239 246 
+3 241 240 249 
+3 249 240 248 
+3 242 241 250 
+3 250 241 249 
+3 243 242 251 
+3 251 242 250 
+3 405 404 243 
+3 405 243 252 
+3 252 243 251 
+3 252 253 407 
+3 405 252 407 
+3 407 253 415 
+3 244 245 246 
+3 247 246 245 
+3 248 246 247 
+3 254 248 247 
+3 254 256 248 
+3 256 249 248 
+3 250 249 258 
+3 258 249 256 
+3 251 250 260 
+3 260 250 258 
+3 252 251 261 
+3 261 251 260 
+3 253 252 262 
+3 262 252 261 
+3 416 415 253 
+3 416 253 263 
+3 263 253 262 
+3 263 264 418 
+3 416 263 418 
+3 264 265 420 
+3 418 264 420 
+3 420 265 428 
+3 254 255 256 
+3 257 256 255 
+3 258 256 257 
+3 259 258 257 
+3 260 258 259 
+3 266 260 259 
+3 266 268 260 
+3 268 261 260 
+3 262 261 270 
+3 270 261 268 
+3 263 262 271 
+3 271 262 270 
+3 264 263 272 
+3 272 263 271 
+3 265 264 273 
+3 273 264 272 
+3 429 428 265 
+3 429 265 274 
+3 274 265 273 
+3 274 275 431 
+3 429 274 431 
+3 431 275 440 
+3 266 267 268 
+3 269 268 267 
+3 270 268 269 
+3 276 270 269 
+3 276 278 270 
+3 278 271 270 
+3 272 271 280 
+3 280 271 278 
+3 273 272 281 
+3 281 272 280 
+3 274 273 282 
+3 282 273 281 
+3 275 274 283 
+3 283 274 282 
+3 441 440 275 
+3 441 275 284 
+3 284 275 283 
+3 284 285 443 
+3 441 284 443 
+3 285 286 445 
+3 443 285 445 
+3 445 286 453 
+3 276 277 278 
+3 279 278 277 
+3 280 278 279 
+3 287 280 279 
+3 287 289 280 
+3 289 281 280 
+3 282 281 291 
+3 291 281 289 
+3 283 282 293 
+3 293 282 291 
+3 284 283 294 
+3 294 283 293 
+3 285 284 295 
+3 295 284 294 
+3 286 285 296 
+3 296 285 295 
+3 454 453 286 
+3 454 286 297 
+3 297 286 296 
+3 297 298 456 
+3 454 297 456 
+3 456 298 465 
+3 287 288 289 
+3 290 289 288 
+3 291 289 290 
+3 292 291 290 
+3 293 291 292 
+3 299 293 292 
+3 299 301 293 
+3 301 294 293 
+3 295 294 303 
+3 303 294 301 
+3 296 295 304 
+3 304 295 303 
+3 297 296 305 
+3 305 296 304 
+3 298 297 306 
+3 306 297 305 
+3 466 465 298 
+3 466 298 307 
+3 307 298 306 
+3 307 308 468 
+3 466 307 468 
+3 308 309 470 
+3 468 308 470 
+3 470 309 479 
+3 299 300 301 
+3 302 301 300 
+3 303 301 302 
+3 310 303 302 
+3 310 312 303 
+3 312 304 303 
+3 305 304 314 
+3 314 304 312 
+3 306 305 316 
+3 316 305 314 
+3 307 306 317 
+3 317 306 316 
+3 308 307 318 
+3 318 307 317 
+3 309 308 319 
+3 319 308 318 
+3 480 479 309 
+3 480 309 320 
+3 320 309 319 
+3 320 321 482 
+3 480 320 482 
+3 482 321 491 
+3 310 311 312 
+3 313 312 311 
+3 314 312 313 
+3 315 314 313 
+3 316 314 315 
+3 322 316 315 
+3 322 324 316 
+3 324 317 316 
+3 318 317 326 
+3 326 317 324 
+3 319 318 327 
+3 327 318 326 
+3 320 319 328 
+3 328 319 327 
+3 321 320 329 
+3 329 320 328 
+3 492 491 321 
+3 492 321 330 
+3 330 321 329 
+3 330 331 494 
+3 492 330 494 
+3 331 332 496 
+3 494 331 496 
+3 496 332 505 
+3 322 323 324 
+3 325 324 323 
+3 326 324 325 
+3 333 326 325 
+3 333 334 326 
+3 334 327 326 
+3 328 327 335 
+3 335 327 334 
+3 329 328 336 
+3 336 328 335 
+3 330 329 337 
+3 337 329 336 
+3 331 330 338 
+3 338 330 337 
+3 332 331 339 
+3 339 331 338 
+3 506 505 332 
+3 506 332 340 
+3 340 332 339 
+3 340 341 508 
+3 506 340 508 
+3 508 341 517 
+3 342 343 537 
+3 535 342 537 
+3 537 343 545 
+3 343 342 345 
+3 345 342 344 
+3 546 545 343 
+3 546 343 346 
+3 346 343 345 
+3 346 347 548 
+3 546 346 548 
+3 548 347 556 
+3 345 344 351 
+3 351 344 349 
+3 346 345 352 
+3 352 345 351 
+3 347 346 353 
+3 353 346 352 
+3 557 556 347 
+3 557 347 354 
+3 354 347 353 
+3 354 355 559 
+3 557 354 559 
+3 355 356 561 
+3 559 355 561 
+3 561 356 569 
+3 350 349 348 
+3 351 349 350 
+3 357 351 350 
+3 357 359 351 
+3 359 352 351 
+3 353 352 361 
+3 361 352 359 
+3 354 353 362 
+3 362 353 361 
+3 355 354 363 
+3 363 354 362 
+3 356 355 364 
+3 364 355 363 
+3 570 569 356 
+3 570 356 365 
+3 365 356 364 
+3 365 366 572 
+3 570 365 572 
+3 366 367 574 
+3 572 366 574 
+3 574 367 582 
+3 357 358 359 
+3 360 359 358 
+3 361 359 360 
+3 368 361 360 
+3 368 370 361 
+3 370 362 361 
+3 363 362 372 
+3 372 362 370 
+3 364 363 374 
+3 374 363 372 
+3 365 364 375 
+3 375 364 374 
+3 366 365 376 
+3 376 365 375 
+3 367 366 377 
+3 377 366 376 
+3 583 582 367 
+3 583 367 378 
+3 378 367 377 
+3 378 379 585 
+3 583 378 585 
+3 585 379 594 
+3 368 369 370 
+3 371 370 369 
+3 372 370 371 
+3 373 372 371 
+3 374 372 373 
+3 380 374 373 
+3 380 382 374 
+3 382 375 374 
+3 376 375 384 
+3 384 375 382 
+3 377 376 385 
+3 385 376 384 
+3 378 377 386 
+3 386 377 385 
+3 379 378 387 
+3 387 378 386 
+3 595 594 379 
+3 595 379 388 
+3 388 379 387 
+3 388 389 597 
+3 595 388 597 
+3 389 390 599 
+3 597 389 599 
+3 599 390 608 
+3 380 381 382 
+3 383 382 381 
+3 384 382 383 
+3 391 384 383 
+3 391 393 384 
+3 393 385 384 
+3 386 385 395 
+3 395 385 393 
+3 387 386 397 
+3 397 386 395 
+3 388 387 398 
+3 398 387 397 
+3 389 388 399 
+3 399 388 398 
+3 390 389 400 
+3 400 389 399 
+3 609 608 390 
+3 609 390 401 
+3 401 390 400 
+3 401 402 611 
+3 609 401 611 
+3 402 403 613 
+3 611 402 613 
+3 613 403 621 
+3 391 392 393 
+3 394 393 392 
+3 395 393 394 
+3 396 395 394 
+3 397 395 396 
+3 404 397 396 
+3 404 406 397 
+3 406 398 397 
+3 399 398 408 
+3 408 398 406 
+3 400 399 409 
+3 409 399 408 
+3 401 400 410 
+3 410 400 409 
+3 402 401 411 
+3 411 401 410 
+3 403 402 412 
+3 412 402 411 
+3 622 621 403 
+3 622 403 413 
+3 413 403 412 
+3 413 414 624 
+3 622 413 624 
+3 624 414 633 
+3 404 405 406 
+3 407 406 405 
+3 408 406 407 
+3 415 408 407 
+3 415 417 408 
+3 417 409 408 
+3 410 409 419 
+3 419 409 417 
+3 411 410 421 
+3 421 410 419 
+3 412 411 422 
+3 422 411 421 
+3 413 412 423 
+3 423 412 422 
+3 414 413 424 
+3 424 413 423 
+3 634 633 414 
+3 634 414 425 
+3 425 414 424 
+3 425 426 636 
+3 634 425 636 
+3 426 427 638 
+3 636 426 638 
+3 638 427 647 
+3 415 416 417 
+3 418 417 416 
+3 419 417 418 
+3 420 419 418 
+3 421 419 420 
+3 428 421 420 
+3 428 430 421 
+3 430 422 421 
+3 423 422 432 
+3 432 422 430 
+3 424 423 433 
+3 433 423 432 
+3 425 424 434 
+3 434 424 433 
+3 426 425 435 
+3 435 425 434 
+3 427 426 436 
+3 436 426 435 
+3 648 647 427 
+3 648 427 437 
+3 437 427 436 
+3 437 438 650 
+3 648 437 650 
+3 438 439 652 
+3 650 438 652 
+3 652 439 661 
+3 428 429 430 
+3 431 430 429 
+3 432 430 431 
+3 440 432 431 
+3 440 442 432 
+3 442 433 432 
+3 434 433 444 
+3 444 433 442 
+3 435 434 446 
+3 446 434 444 
+3 436 435 447 
+3 447 435 446 
+3 437 436 448 
+3 448 436 447 
+3 438 437 449 
+3 449 437 448 
+3 439 438 450 
+3 450 438 449 
+3 662 661 439 
+3 662 439 451 
+3 451 439 450 
+3 451 452 664 
+3 662 451 664 
+3 664 452 674 
+3 440 441 442 
+3 443 442 441 
+3 444 442 443 
+3 445 444 443 
+3 446 444 445 
+3 453 446 445 
+3 453 455 446 
+3 455 447 446 
+3 448 447 457 
+3 457 447 455 
+3 449 448 458 
+3 458 448 457 
+3 450 449 459 
+3 459 449 458 
+3 451 450 460 
+3 460 450 459 
+3 452 451 461 
+3 461 451 460 
+3 675 674 452 
+3 675 452 462 
+3 462 452 461 
+3 462 463 677 
+3 675 462 677 
+3 463 464 679 
+3 677 463 679 
+3 679 464 688 
+3 453 454 455 
+3 456 455 454 
+3 457 455 456 
+3 465 457 456 
+3 465 467 457 
+3 467 458 457 
+3 459 458 469 
+3 469 458 467 
+3 460 459 471 
+3 471 459 469 
+3 461 460 472 
+3 472 460 471 
+3 462 461 473 
+3 473 461 472 
+3 463 462 474 
+3 474 462 473 
+3 464 463 475 
+3 475 463 474 
+3 689 688 464 
+3 689 464 476 
+3 476 464 475 
+3 476 477 691 
+3 689 476 691 
+3 477 478 693 
+3 691 477 693 
+3 693 478 702 
+3 465 466 467 
+3 468 467 466 
+3 469 467 468 
+3 470 469 468 
+3 471 469 470 
+3 479 471 470 
+3 479 481 471 
+3 481 472 471 
+3 473 472 483 
+3 483 472 481 
+3 474 473 484 
+3 484 473 483 
+3 475 474 485 
+3 485 474 484 
+3 476 475 486 
+3 486 475 485 
+3 477 476 487 
+3 487 476 486 
+3 478 477 488 
+3 488 477 487 
+3 703 702 478 
+3 703 478 489 
+3 489 478 488 
+3 489 490 705 
+3 703 489 705 
+3 705 490 715 
+3 479 480 481 
+3 482 481 480 
+3 483 481 482 
+3 491 483 482 
+3 491 493 483 
+3 493 484 483 
+3 485 484 495 
+3 495 484 493 
+3 486 485 497 
+3 497 485 495 
+3 487 486 498 
+3 498 486 497 
+3 488 487 499 
+3 499 487 498 
+3 489 488 500 
+3 500 488 499 
+3 490 489 501 
+3 501 489 500 
+3 716 715 490 
+3 716 490 502 
+3 502 490 501 
+3 502 503 718 
+3 716 502 718 
+3 503 504 720 
+3 718 503 720 
+3 720 504 730 
+3 491 492 493 
+3 494 493 492 
+3 495 493 494 
+3 496 495 494 
+3 497 495 496 
+3 505 497 496 
+3 505 507 497 
+3 507 498 497 
+3 499 498 509 
+3 509 498 507 
+3 500 499 510 
+3 510 499 509 
+3 501 500 511 
+3 511 500 510 
+3 502 501 512 
+3 512 501 511 
+3 503 502 513 
+3 513 502 512 
+3 504 503 514 
+3 514 503 513 
+3 731 730 504 
+3 731 504 515 
+3 515 504 514 
+3 515 516 733 
+3 731 515 733 
+3 733 516 744 
+3 505 506 507 
+3 508 507 506 
+3 509 507 508 
+3 517 509 508 
+3 517 518 509 
+3 518 510 509 
+3 511 510 519 
+3 519 510 518 
+3 512 511 520 
+3 520 511 519 
+3 513 512 521 
+3 521 512 520 
+3 514 513 522 
+3 522 513 521 
+3 515 514 523 
+3 523 514 522 
+3 516 515 524 
+3 524 515 523 
+3 745 744 516 
+3 745 516 525 
+3 525 516 524 
+3 525 526 747 
+3 745 525 747 
+3 526 527 749 
+3 747 526 749 
+3 749 527 757 
+3 528 529 773 
+3 771 528 773 
+3 773 529 781 
+3 529 528 531 
+3 531 528 530 
+3 782 781 529 
+3 782 529 532 
+3 532 529 531 
+3 532 533 784 
+3 782 532 784 
+3 533 534 786 
+3 784 533 786 
+3 786 534 794 
+3 531 530 538 
+3 538 530 536 
+3 532 531 539 
+3 539 531 538 
+3 533 532 540 
+3 540 532 539 
+3 534 533 541 
+3 541 533 540 
+3 795 794 534 
+3 795 534 542 
+3 542 534 541 
+3 542 543 797 
+3 795 542 797 
+3 797 543 544 
+3 537 536 535 
+3 538 536 537 
+3 545 538 537 
+3 545 547 538 
+3 547 539 538 
+3 540 539 549 
+3 549 539 547 
+3 541 540 550 
+3 550 540 549 
+3 542 541 551 
+3 551 541 550 
+3 543 542 552 
+3 552 542 551 
+3 544 543 553 
+3 553 543 552 
+3 806 544 554 
+3 554 544 553 
+3 554 555 808 
+3 806 554 808 
+3 808 555 817 
+3 545 546 547 
+3 548 547 546 
+3 549 547 548 
+3 556 549 548 
+3 556 558 549 
+3 558 550 549 
+3 551 550 560 
+3 560 550 558 
+3 552 551 562 
+3 562 551 560 
+3 553 552 563 
+3 563 552 562 
+3 554 553 564 
+3 564 553 563 
+3 555 554 565 
+3 565 554 564 
+3 818 817 555 
+3 818 555 566 
+3 566 555 565 
+3 566 567 820 
+3 818 566 820 
+3 567 568 822 
+3 820 567 822 
+3 822 568 831 
+3 556 557 558 
+3 559 558 557 
+3 560 558 559 
+3 561 560 559 
+3 562 560 561 
+3 569 562 561 
+3 569 571 562 
+3 571 563 562 
+3 564 563 573 
+3 573 563 571 
+3 565 564 575 
+3 575 564 573 
+3 566 565 576 
+3 576 565 575 
+3 567 566 577 
+3 577 566 576 
+3 568 567 578 
+3 578 567 577 
+3 832 831 568 
+3 832 568 579 
+3 579 568 578 
+3 579 580 834 
+3 832 579 834 
+3 580 581 836 
+3 834 580 836 
+3 836 581 845 
+3 569 570 571 
+3 572 571 570 
+3 573 571 572 
+3 574 573 572 
+3 575 573 574 
+3 582 575 574 
+3 582 584 575 
+3 584 576 575 
+3 577 576 586 
+3 586 576 584 
+3 578 577 587 
+3 587 577 586 
+3 579 578 588 
+3 588 578 587 
+3 580 579 589 
+3 589 579 588 
+3 581 580 590 
+3 590 580 589 
+3 846 845 581 
+3 846 581 591 
+3 591 581 590 
+3 591 592 848 
+3 846 591 848 
+3 592 593 850 
+3 848 592 850 
+3 850 593 859 
+3 582 583 584 
+3 585 584 583 
+3 586 584 585 
+3 594 586 585 
+3 594 596 586 
+3 596 587 586 
+3 588 587 598 
+3 598 587 596 
+3 589 588 600 
+3 600 588 598 
+3 590 589 601 
+3 601 589 600 
+3 591 590 602 
+3 602 590 601 
+3 592 591 603 
+3 603 591 602 
+3 593 592 604 
+3 604 592 603 
+3 860 859 593 
+3 860 593 605 
+3 605 593 604 
+3 605 606 862 
+3 860 605 862 
+3 862 606 607 
+3 594 595 596 
+3 597 596 595 
+3 598 596 597 
+3 599 598 597 
+3 600 598 599 
+3 608 600 599 
+3 608 610 600 
+3 610 601 600 
+3 602 601 612 
+3 612 601 610 
+3 603 602 614 
+3 614 602 612 
+3 604 603 615 
+3 615 603 614 
+3 605 604 616 
+3 616 604 615 
+3 606 605 617 
+3 617 605 616 
+3 607 606 618 
+3 618 606 617 
+3 872 607 619 
+3 619 607 618 
+3 619 620 874 
+3 872 619 874 
+3 874 620 884 
+3 608 609 610 
+3 611 610 609 
+3 612 610 611 
+3 613 612 611 
+3 614 612 613 
+3 621 614 613 
+3 621 623 614 
+3 623 615 614 
+3 616 615 625 
+3 625 615 623 
+3 617 616 626 
+3 626 616 625 
+3 618 617 627 
+3 627 617 626 
+3 619 618 628 
+3 628 618 627 
+3 620 619 629 
+3 629 619 628 
+3 885 884 620 
+3 885 620 630 
+3 630 620 629 
+3 630 631 887 
+3 885 630 887 
+3 631 632 889 
+3 887 631 889 
+3 889 632 899 
+3 621 622 623 
+3 624 623 622 
+3 625 623 624 
+3 633 625 624 
+3 633 635 625 
+3 635 626 625 
+3 627 626 637 
+3 637 626 635 
+3 628 627 639 
+3 639 627 637 
+3 629 628 640 
+3 640 628 639 
+3 630 629 641 
+3 641 629 640 
+3 631 630 642 
+3 642 630 641 
+3 632 631 643 
+3 643 631 642 
+3 900 899 632 
+3 900 632 644 
+3 644 632 643 
+3 644 645 902 
+3 900 644 902 
+3 645 646 904 
+3 902 645 904 
+3 904 646 914 
+3 633 634 635 
+3 636 635 634 
+3 637 635 636 
+3 638 637 636 
+3 639 637 638 
+3 647 639 638 
+3 647 649 639 
+3 649 640 639 
+3 641 640 651 
+3 651 640 649 
+3 642 641 653 
+3 653 641 651 
+3 643 642 654 
+3 654 642 653 
+3 644 643 655 
+3 655 643 654 
+3 645 644 656 
+3 656 644 655 
+3 646 645 657 
+3 657 645 656 
+3 915 914 646 
+3 915 646 658 
+3 658 646 657 
+3 658 659 917 
+3 915 658 917 
+3 659 660 919 
+3 917 659 919 
+3 919 660 929 
+3 647 648 649 
+3 650 649 648 
+3 651 649 650 
+3 652 651 650 
+3 653 651 652 
+3 661 653 652 
+3 661 663 653 
+3 663 654 653 
+3 655 654 665 
+3 665 654 663 
+3 656 655 666 
+3 666 655 665 
+3 657 656 667 
+3 667 656 666 
+3 658 657 668 
+3 668 657 667 
+3 659 658 669 
+3 669 658 668 
+3 660 659 670 
+3 670 659 669 
+3 930 929 660 
+3 930 660 671 
+3 671 660 670 
+3 671 672 932 
+3 930 671 932 
+3 932 672 673 
+3 661 662 663 
+3 664 663 662 
+3 665 663 664 
+3 674 665 664 
+3 674 676 665 
+3 676 666 665 
+3 667 666 678 
+3 678 666 676 
+3 668 667 680 
+3 680 667 678 
+3 669 668 681 
+3 681 668 680 
+3 670 669 682 
+3 682 669 681 
+3 671 670 683 
+3 683 670 682 
+3 672 671 684 
+3 684 671 683 
+3 673 672 685 
+3 685 672 684 
+3 943 673 686 
+3 686 673 685 
+3 686 687 945 
+3 943 686 945 
+3 945 687 956 
+3 674 675 676 
+3 677 676 675 
+3 678 676 677 
+3 679 678 677 
+3 680 678 679 
+3 688 680 679 
+3 688 690 680 
+3 690 681 680 
+3 682 681 692 
+3 692 681 690 
+3 683 682 694 
+3 694 682 692 
+3 684 683 695 
+3 695 683 694 
+3 685 684 696 
+3 696 684 695 
+3 686 685 697 
+3 697 685 696 
+3 687 686 698 
+3 698 686 697 
+3 957 956 687 
+3 957 687 699 
+3 699 687 698 
+3 699 700 959 
+3 957 699 959 
+3 700 701 961 
+3 959 700 961 
+3 961 701 972 
+3 688 689 690 
+3 691 690 689 
+3 692 690 691 
+3 693 692 691 
+3 694 692 693 
+3 702 694 693 
+3 702 704 694 
+3 704 695 694 
+3 696 695 706 
+3 706 695 704 
+3 697 696 707 
+3 707 696 706 
+3 698 697 708 
+3 708 697 707 
+3 699 698 709 
+3 709 698 708 
+3 700 699 710 
+3 710 699 709 
+3 701 700 711 
+3 711 700 710 
+3 973 972 701 
+3 973 701 712 
+3 712 701 711 
+3 712 713 975 
+3 973 712 975 
+3 713 714 977 
+3 975 713 977 
+3 977 714 985 
+3 702 703 704 
+3 705 704 703 
+3 706 704 705 
+3 715 706 705 
+3 715 717 706 
+3 717 707 706 
+3 708 707 719 
+3 719 707 717 
+3 709 708 721 
+3 721 708 719 
+3 710 709 722 
+3 722 709 721 
+3 711 710 723 
+3 723 710 722 
+3 712 711 724 
+3 724 711 723 
+3 713 712 725 
+3 725 712 724 
+3 714 713 726 
+3 726 713 725 
+3 986 985 714 
+3 986 714 727 
+3 727 714 726 
+3 727 728 988 
+3 986 727 988 
+3 728 729 990 
+3 988 728 990 
+3 990 729 995 
+3 715 716 717 
+3 718 717 716 
+3 719 717 718 
+3 720 719 718 
+3 721 719 720 
+3 730 721 720 
+3 730 732 721 
+3 732 722 721 
+3 723 722 734 
+3 734 722 732 
+3 724 723 735 
+3 735 723 734 
+3 725 724 736 
+3 736 724 735 
+3 726 725 737 
+3 737 725 736 
+3 727 726 738 
+3 738 726 737 
+3 728 727 739 
+3 739 727 738 
+3 729 728 740 
+3 740 728 739 
+3 996 995 729 
+3 996 729 741 
+3 741 729 740 
+3 741 742 998 
+3 996 741 998 
+3 998 742 743 
+3 730 731 732 
+3 733 732 731 
+3 734 732 733 
+3 744 734 733 
+3 744 746 734 
+3 746 735 734 
+3 736 735 748 
+3 748 735 746 
+3 737 736 750 
+3 750 736 748 
+3 738 737 751 
+3 751 737 750 
+3 739 738 752 
+3 752 738 751 
+3 740 739 753 
+3 753 739 752 
+3 741 740 754 
+3 754 740 753 
+3 742 741 755 
+3 755 741 754 
+3 743 742 756 
+3 756 742 755 
+3 744 745 746 
+3 747 746 745 
+3 748 746 747 
+3 749 748 747 
+3 750 748 749 
+3 757 750 749 
+3 757 758 750 
+3 758 751 750 
+3 752 751 759 
+3 759 751 758 
+3 753 752 760 
+3 760 752 759 
+3 754 753 761 
+3 761 753 760 
+3 755 754 762 
+3 762 754 761 
+3 756 755 763 
+3 763 755 762 
+3 764 765 1012 
+3 1010 764 1012 
+3 1012 765 1021 
+3 765 764 767 
+3 767 764 766 
+3 1022 1021 765 
+3 1022 765 768 
+3 768 765 767 
+3 768 769 1024 
+3 1022 768 1024 
+3 769 770 1026 
+3 1024 769 1026 
+3 1026 770 1036 
+3 767 766 774 
+3 774 766 772 
+3 768 767 775 
+3 775 767 774 
+3 769 768 776 
+3 776 768 775 
+3 770 769 777 
+3 777 769 776 
+3 1037 1036 770 
+3 1037 770 778 
+3 778 770 777 
+3 778 779 1039 
+3 1037 778 1039 
+3 779 780 1041 
+3 1039 779 1041 
+3 1041 780 1051 
+3 773 772 771 
+3 774 772 773 
+3 781 774 773 
+3 781 783 774 
+3 783 775 774 
+3 776 775 785 
+3 785 775 783 
+3 777 776 787 
+3 787 776 785 
+3 778 777 788 
+3 788 777 787 
+3 779 778 789 
+3 789 778 788 
+3 780 779 790 
+3 790 779 789 
+3 1052 1051 780 
+3 1052 780 791 
+3 791 780 790 
+3 791 792 1054 
+3 1052 791 1054 
+3 792 793 1056 
+3 1054 792 1056 
+3 1056 793 1066 
+3 781 782 783 
+3 784 783 782 
+3 785 783 784 
+3 786 785 784 
+3 787 785 786 
+3 794 787 786 
+3 794 796 787 
+3 796 788 787 
+3 789 788 798 
+3 798 788 796 
+3 790 789 799 
+3 799 789 798 
+3 791 790 800 
+3 800 790 799 
+3 792 791 801 
+3 801 791 800 
+3 793 792 802 
+3 802 792 801 
+3 1067 1066 793 
+3 1067 793 803 
+3 803 793 802 
+3 803 804 1069 
+3 1067 803 1069 
+3 804 805 1071 
+3 1069 804 1071 
+3 1071 805 1081 
+3 794 795 796 
+3 797 796 795 
+3 798 796 797 
+3 544 798 797 
+3 799 798 544 
+3 544 807 799 
+3 807 800 799 
+3 801 800 809 
+3 809 800 807 
+3 802 801 810 
+3 810 801 809 
+3 803 802 811 
+3 811 802 810 
+3 804 803 812 
+3 812 803 811 
+3 805 804 813 
+3 813 804 812 
+3 1082 1081 805 
+3 1082 805 814 
+3 814 805 813 
+3 814 815 1084 
+3 1082 814 1084 
+3 815 816 1086 
+3 1084 815 1086 
+3 1086 816 1096 
+3 544 806 807 
+3 808 807 806 
+3 809 807 808 
+3 817 809 808 
+3 817 819 809 
+3 819 810 809 
+3 811 810 821 
+3 821 810 819 
+3 812 811 823 
+3 823 811 821 
+3 813 812 824 
+3 824 812 823 
+3 814 813 825 
+3 825 813 824 
+3 815 814 826 
+3 826 814 825 
+3 816 815 827 
+3 827 815 826 
+3 1097 1096 816 
+3 1097 816 828 
+3 828 816 827 
+3 828 829 1099 
+3 1097 828 1099 
+3 829 830 1101 
+3 1099 829 1101 
+3 1101 830 1111 
+3 817 818 819 
+3 820 819 818 
+3 821 819 820 
+3 822 821 820 
+3 823 821 822 
+3 831 823 822 
+3 831 833 823 
+3 833 824 823 
+3 825 824 835 
+3 835 824 833 
+3 826 825 837 
+3 837 825 835 
+3 827 826 838 
+3 838 826 837 
+3 828 827 839 
+3 839 827 838 
+3 829 828 840 
+3 840 828 839 
+3 830 829 841 
+3 841 829 840 
+3 1112 1111 830 
+3 1112 830 842 
+3 842 830 841 
+3 842 843 1114 
+3 1112 842 1114 
+3 843 844 1116 
+3 1114 843 1116 
+3 1116 844 1127 
+3 831 832 833 
+3 834 833 832 
+3 835 833 834 
+3 836 835 834 
+3 837 835 836 
+3 845 837 836 
+3 845 847 837 
+3 847 838 837 
+3 839 838 849 
+3 849 838 847 
+3 840 839 851 
+3 851 839 849 
+3 841 840 852 
+3 852 840 851 
+3 842 841 853 
+3 853 841 852 
+3 843 842 854 
+3 854 842 853 
+3 844 843 855 
+3 855 843 854 
+3 1128 1127 844 
+3 1128 844 856 
+3 856 844 855 
+3 856 857 1130 
+3 1128 856 1130 
+3 857 858 1132 
+3 1130 857 1132 
+3 1132 858 1143 
+3 845 846 847 
+3 848 847 846 
+3 849 847 848 
+3 850 849 848 
+3 851 849 850 
+3 859 851 850 
+3 859 861 851 
+3 861 852 851 
+3 853 852 863 
+3 863 852 861 
+3 854 853 864 
+3 864 853 863 
+3 855 854 865 
+3 865 854 864 
+3 856 855 866 
+3 866 855 865 
+3 857 856 867 
+3 867 856 866 
+3 858 857 868 
+3 868 857 867 
+3 1144 1143 858 
+3 1144 858 869 
+3 869 858 868 
+3 869 870 1146 
+3 1144 869 1146 
+3 870 871 1148 
+3 1146 870 1148 
+3 1148 871 1159 
+3 859 860 861 
+3 862 861 860 
+3 863 861 862 
+3 607 863 862 
+3 864 863 607 
+3 607 873 864 
+3 873 865 864 
+3 866 865 875 
+3 875 865 873 
+3 867 866 876 
+3 876 866 875 
+3 868 867 877 
+3 877 867 876 
+3 869 868 878 
+3 878 868 877 
+3 870 869 879 
+3 879 869 878 
+3 871 870 880 
+3 880 870 879 
+3 1160 1159 871 
+3 1160 871 881 
+3 881 871 880 
+3 881 882 1162 
+3 1160 881 1162 
+3 882 883 1164 
+3 1162 882 1164 
+3 1164 883 1175 
+3 607 872 873 
+3 874 873 872 
+3 875 873 874 
+3 884 875 874 
+3 884 886 875 
+3 886 876 875 
+3 877 876 888 
+3 888 876 886 
+3 878 877 890 
+3 890 877 888 
+3 879 878 891 
+3 891 878 890 
+3 880 879 892 
+3 892 879 891 
+3 881 880 893 
+3 893 880 892 
+3 882 881 894 
+3 894 881 893 
+3 883 882 895 
+3 895 882 894 
+3 1176 1175 883 
+3 1176 883 896 
+3 896 883 895 
+3 896 897 1178 
+3 1176 896 1178 
+3 897 898 1180 
+3 1178 897 1180 
+3 1180 898 1191 
+3 884 885 886 
+3 887 886 885 
+3 888 886 887 
+3 889 888 887 
+3 890 888 889 
+3 899 890 889 
+3 899 901 890 
+3 901 891 890 
+3 892 891 903 
+3 903 891 901 
+3 893 892 905 
+3 905 892 903 
+3 894 893 906 
+3 906 893 905 
+3 895 894 907 
+3 907 894 906 
+3 896 895 908 
+3 908 895 907 
+3 897 896 909 
+3 909 896 908 
+3 898 897 910 
+3 910 897 909 
+3 1192 1191 898 
+3 1192 898 911 
+3 911 898 910 
+3 911 912 1194 
+3 1192 911 1194 
+3 912 913 1196 
+3 1194 912 1196 
+3 1196 913 1207 
+3 899 900 901 
+3 902 901 900 
+3 903 901 902 
+3 904 903 902 
+3 905 903 904 
+3 914 905 904 
+3 914 916 905 
+3 916 906 905 
+3 907 906 918 
+3 918 906 916 
+3 908 907 920 
+3 920 907 918 
+3 909 908 921 
+3 921 908 920 
+3 910 909 922 
+3 922 909 921 
+3 911 910 923 
+3 923 910 922 
+3 912 911 924 
+3 924 911 923 
+3 913 912 925 
+3 925 912 924 
+3 1208 1207 913 
+3 1208 913 926 
+3 926 913 925 
+3 926 927 1210 
+3 1208 926 1210 
+3 927 928 1212 
+3 1210 927 1212 
+3 1212 928 1223 
+3 914 915 916 
+3 917 916 915 
+3 918 916 917 
+3 919 918 917 
+3 920 918 919 
+3 929 920 919 
+3 929 931 920 
+3 931 921 920 
+3 922 921 933 
+3 933 921 931 
+3 923 922 934 
+3 934 922 933 
+3 924 923 935 
+3 935 923 934 
+3 925 924 936 
+3 936 924 935 
+3 926 925 937 
+3 937 925 936 
+3 927 926 938 
+3 938 926 937 
+3 928 927 939 
+3 939 927 938 
+3 1224 1223 928 
+3 1224 928 940 
+3 940 928 939 
+3 940 941 1226 
+3 1224 940 1226 
+3 941 942 1228 
+3 1226 941 1228 
+3 1228 942 1236 
+3 929 930 931 
+3 932 931 930 
+3 933 931 932 
+3 673 933 932 
+3 934 933 673 
+3 673 944 934 
+3 944 935 934 
+3 936 935 946 
+3 946 935 944 
+3 937 936 947 
+3 947 936 946 
+3 938 937 948 
+3 948 937 947 
+3 939 938 949 
+3 949 938 948 
+3 940 939 950 
+3 950 939 949 
+3 941 940 951 
+3 951 940 950 
+3 942 941 952 
+3 952 941 951 
+3 1237 1236 942 
+3 1237 942 953 
+3 953 942 952 
+3 953 954 1239 
+3 1237 953 1239 
+3 954 955 1241 
+3 1239 954 1241 
+3 1241 955 1246 
+3 673 943 944 
+3 945 944 943 
+3 946 944 945 
+3 956 946 945 
+3 956 958 946 
+3 958 947 946 
+3 948 947 960 
+3 960 947 958 
+3 949 948 962 
+3 962 948 960 
+3 950 949 963 
+3 963 949 962 
+3 951 950 964 
+3 964 950 963 
+3 952 951 965 
+3 965 951 964 
+3 953 952 966 
+3 966 952 965 
+3 954 953 967 
+3 967 953 966 
+3 955 954 968 
+3 968 954 967 
+3 1247 1246 955 
+3 1247 955 969 
+3 969 955 968 
+3 969 970 1249 
+3 1247 969 1249 
+3 970 971 1251 
+3 1249 970 1251 
+3 956 957 958 
+3 959 958 957 
+3 960 958 959 
+3 961 960 959 
+3 962 960 961 
+3 972 962 961 
+3 972 974 962 
+3 974 963 962 
+3 964 963 976 
+3 976 963 974 
+3 965 964 978 
+3 978 964 976 
+3 966 965 979 
+3 979 965 978 
+3 967 966 980 
+3 980 966 979 
+3 968 967 981 
+3 981 967 980 
+3 969 968 982 
+3 982 968 981 
+3 970 969 983 
+3 983 969 982 
+3 971 970 984 
+3 984 970 983 
+3 972 973 974 
+3 975 974 973 
+3 976 974 975 
+3 977 976 975 
+3 978 976 977 
+3 985 978 977 
+3 985 987 978 
+3 987 979 978 
+3 980 979 989 
+3 989 979 987 
+3 981 980 991 
+3 991 980 989 
+3 982 981 992 
+3 992 981 991 
+3 983 982 993 
+3 993 982 992 
+3 984 983 994 
+3 994 983 993 
+3 985 986 987 
+3 988 987 986 
+3 989 987 988 
+3 990 989 988 
+3 991 989 990 
+3 995 991 990 
+3 995 997 991 
+3 997 992 991 
+3 993 992 999 
+3 999 992 997 
+3 994 993 1000 
+3 1000 993 999 
+3 995 996 997 
+3 998 997 996 
+3 999 997 998 
+3 743 999 998 
+3 1000 999 743 
+3 1001 1002 1268 
+3 1266 1001 1268 
+3 1002 1003 1270 
+3 1268 1002 1270 
+3 1270 1003 1280 
+3 1002 1001 1005 
+3 1005 1001 1004 
+3 1003 1002 1006 
+3 1006 1002 1005 
+3 1281 1280 1003 
+3 1281 1003 1007 
+3 1007 1003 1006 
+3 1007 1008 1283 
+3 1281 1007 1283 
+3 1008 1009 1285 
+3 1283 1008 1285 
+3 1285 1009 1295 
+3 1005 1004 1013 
+3 1013 1004 1011 
+3 1006 1005 1014 
+3 1014 1005 1013 
+3 1007 1006 1015 
+3 1015 1006 1014 
+3 1008 1007 1016 
+3 1016 1007 1015 
+3 1009 1008 1017 
+3 1017 1008 1016 
+3 1296 1295 1009 
+3 1296 1009 1018 
+3 1018 1009 1017 
+3 1018 1019 1298 
+3 1296 1018 1298 
+3 1019 1020 1300 
+3 1298 1019 1300 
+3 1300 1020 1311 
+3 1012 1011 1010 
+3 1013 1011 1012 
+3 1021 1013 1012 
+3 1021 1023 1013 
+3 1023 1014 1013 
+3 1015 1014 1025 
+3 1025 1014 1023 
+3 1016 1015 1027 
+3 1027 1015 1025 
+3 1017 1016 1028 
+3 1028 1016 1027 
+3 1018 1017 1029 
+3 1029 1017 1028 
+3 1019 1018 1030 
+3 1030 1018 1029 
+3 1020 1019 1031 
+3 1031 1019 1030 
+3 1312 1311 1020 
+3 1312 1020 1032 
+3 1032 1020 1031 
+3 1032 1033 1314 
+3 1312 1032 1314 
+3 1033 1034 1316 
+3 1314 1033 1316 
+3 1034 1035 1318 
+3 1316 1034 1318 
+3 1318 1035 1328 
+3 1021 1022 1023 
+3 1024 1023 1022 
+3 1025 1023 1024 
+3 1026 1025 1024 
+3 1027 1025 1026 
+3 1036 1027 1026 
+3 1036 1038 1027 
+3 1038 1028 1027 
+3 1029 1028 1040 
+3 1040 1028 1038 
+3 1030 1029 1042 
+3 1042 1029 1040 
+3 1031 1030 1043 
+3 1043 1030 1042 
+3 1032 1031 1044 
+3 1044 1031 1043 
+3 1033 1032 1045 
+3 1045 1032 1044 
+3 1034 1033 1046 
+3 1046 1033 1045 
+3 1035 1034 1047 
+3 1047 1034 1046 
+3 1329 1328 1035 
+3 1329 1035 1048 
+3 1048 1035 1047 
+3 1048 1049 1331 
+3 1329 1048 1331 
+3 1049 1050 1333 
+3 1331 1049 1333 
+3 1333 1050 1343 
+3 1036 1037 1038 
+3 1039 1038 1037 
+3 1040 1038 1039 
+3 1041 1040 1039 
+3 1042 1040 1041 
+3 1051 1042 1041 
+3 1051 1053 1042 
+3 1053 1043 1042 
+3 1044 1043 1055 
+3 1055 1043 1053 
+3 1045 1044 1057 
+3 1057 1044 1055 
+3 1046 1045 1058 
+3 1058 1045 1057 
+3 1047 1046 1059 
+3 1059 1046 1058 
+3 1048 1047 1060 
+3 1060 1047 1059 
+3 1049 1048 1061 
+3 1061 1048 1060 
+3 1050 1049 1062 
+3 1062 1049 1061 
+3 1344 1343 1050 
+3 1344 1050 1063 
+3 1063 1050 1062 
+3 1063 1064 1346 
+3 1344 1063 1346 
+3 1064 1065 1348 
+3 1346 1064 1348 
+3 1348 1065 1359 
+3 1051 1052 1053 
+3 1054 1053 1052 
+3 1055 1053 1054 
+3 1056 1055 1054 
+3 1057 1055 1056 
+3 1066 1057 1056 
+3 1066 1068 1057 
+3 1068 1058 1057 
+3 1059 1058 1070 
+3 1070 1058 1068 
+3 1060 1059 1072 
+3 1072 1059 1070 
+3 1061 1060 1073 
+3 1073 1060 1072 
+3 1062 1061 1074 
+3 1074 1061 1073 
+3 1063 1062 1075 
+3 1075 1062 1074 
+3 1064 1063 1076 
+3 1076 1063 1075 
+3 1065 1064 1077 
+3 1077 1064 1076 
+3 1360 1359 1065 
+3 1360 1065 1078 
+3 1078 1065 1077 
+3 1078 1079 1362 
+3 1360 1078 1362 
+3 1079 1080 1364 
+3 1362 1079 1364 
+3 1364 1080 1375 
+3 1066 1067 1068 
+3 1069 1068 1067 
+3 1070 1068 1069 
+3 1071 1070 1069 
+3 1072 1070 1071 
+3 1081 1072 1071 
+3 1081 1083 1072 
+3 1083 1073 1072 
+3 1074 1073 1085 
+3 1085 1073 1083 
+3 1075 1074 1087 
+3 1087 1074 1085 
+3 1076 1075 1088 
+3 1088 1075 1087 
+3 1077 1076 1089 
+3 1089 1076 1088 
+3 1078 1077 1090 
+3 1090 1077 1089 
+3 1079 1078 1091 
+3 1091 1078 1090 
+3 1080 1079 1092 
+3 1092 1079 1091 
+3 1376 1375 1080 
+3 1376 1080 1093 
+3 1093 1080 1092 
+3 1093 1094 1378 
+3 1376 1093 1378 
+3 1094 1095 1380 
+3 1378 1094 1380 
+3 1380 1095 1392 
+3 1081 1082 1083 
+3 1084 1083 1082 
+3 1085 1083 1084 
+3 1086 1085 1084 
+3 1087 1085 1086 
+3 1096 1087 1086 
+3 1096 1098 1087 
+3 1098 1088 1087 
+3 1089 1088 1100 
+3 1100 1088 1098 
+3 1090 1089 1102 
+3 1102 1089 1100 
+3 1091 1090 1103 
+3 1103 1090 1102 
+3 1092 1091 1104 
+3 1104 1091 1103 
+3 1093 1092 1105 
+3 1105 1092 1104 
+3 1094 1093 1106 
+3 1106 1093 1105 
+3 1095 1094 1107 
+3 1107 1094 1106 
+3 1393 1392 1095 
+3 1393 1095 1108 
+3 1108 1095 1107 
+3 1108 1109 1395 
+3 1393 1108 1395 
+3 1109 1110 1397 
+3 1395 1109 1397 
+3 1397 1110 1409 
+3 1096 1097 1098 
+3 1099 1098 1097 
+3 1100 1098 1099 
+3 1101 1100 1099 
+3 1102 1100 1101 
+3 1111 1102 1101 
+3 1111 1113 1102 
+3 1113 1103 1102 
+3 1104 1103 1115 
+3 1115 1103 1113 
+3 1105 1104 1117 
+3 1117 1104 1115 
+3 1106 1105 1118 
+3 1118 1105 1117 
+3 1107 1106 1119 
+3 1119 1106 1118 
+3 1108 1107 1120 
+3 1120 1107 1119 
+3 1109 1108 1121 
+3 1121 1108 1120 
+3 1110 1109 1122 
+3 1122 1109 1121 
+3 1410 1409 1110 
+3 1410 1110 1123 
+3 1123 1110 1122 
+3 1123 1124 1412 
+3 1410 1123 1412 
+3 1124 1125 1414 
+3 1412 1124 1414 
+3 1414 1125 1126 
+3 1111 1112 1113 
+3 1114 1113 1112 
+3 1115 1113 1114 
+3 1116 1115 1114 
+3 1117 1115 1116 
+3 1127 1117 1116 
+3 1127 1129 1117 
+3 1129 1118 1117 
+3 1119 1118 1131 
+3 1131 1118 1129 
+3 1120 1119 1133 
+3 1133 1119 1131 
+3 1121 1120 1134 
+3 1134 1120 1133 
+3 1122 1121 1135 
+3 1135 1121 1134 
+3 1123 1122 1136 
+3 1136 1122 1135 
+3 1124 1123 1137 
+3 1137 1123 1136 
+3 1125 1124 1138 
+3 1138 1124 1137 
+3 1126 1125 1139 
+3 1139 1125 1138 
+3 1426 1126 1140 
+3 1140 1126 1139 
+3 1140 1141 1428 
+3 1426 1140 1428 
+3 1141 1142 1430 
+3 1428 1141 1430 
+3 1430 1142 1442 
+3 1127 1128 1129 
+3 1130 1129 1128 
+3 1131 1129 1130 
+3 1132 1131 1130 
+3 1133 1131 1132 
+3 1143 1133 1132 
+3 1143 1145 1133 
+3 1145 1134 1133 
+3 1135 1134 1147 
+3 1147 1134 1145 
+3 1136 1135 1149 
+3 1149 1135 1147 
+3 1137 1136 1150 
+3 1150 1136 1149 
+3 1138 1137 1151 
+3 1151 1137 1150 
+3 1139 1138 1152 
+3 1152 1138 1151 
+3 1140 1139 1153 
+3 1153 1139 1152 
+3 1141 1140 1154 
+3 1154 1140 1153 
+3 1142 1141 1155 
+3 1155 1141 1154 
+3 1443 1442 1142 
+3 1443 1142 1156 
+3 1156 1142 1155 
+3 1156 1157 1445 
+3 1443 1156 1445 
+3 1157 1158 1447 
+3 1445 1157 1447 
+3 1447 1158 1459 
+3 1143 1144 1145 
+3 1146 1145 1144 
+3 1147 1145 1146 
+3 1148 1147 1146 
+3 1149 1147 1148 
+3 1159 1149 1148 
+3 1159 1161 1149 
+3 1161 1150 1149 
+3 1151 1150 1163 
+3 1163 1150 1161 
+3 1152 1151 1165 
+3 1165 1151 1163 
+3 1153 1152 1166 
+3 1166 1152 1165 
+3 1154 1153 1167 
+3 1167 1153 1166 
+3 1155 1154 1168 
+3 1168 1154 1167 
+3 1156 1155 1169 
+3 1169 1155 1168 
+3 1157 1156 1170 
+3 1170 1156 1169 
+3 1158 1157 1171 
+3 1171 1157 1170 
+3 1460 1459 1158 
+3 1460 1158 1172 
+3 1172 1158 1171 
+3 1172 1173 1462 
+3 1460 1172 1462 
+3 1173 1174 1464 
+3 1462 1173 1464 
+3 1464 1174 1475 
+3 1159 1160 1161 
+3 1162 1161 1160 
+3 1163 1161 1162 
+3 1164 1163 1162 
+3 1165 1163 1164 
+3 1175 1165 1164 
+3 1175 1177 1165 
+3 1177 1166 1165 
+3 1167 1166 1179 
+3 1179 1166 1177 
+3 1168 1167 1181 
+3 1181 1167 1179 
+3 1169 1168 1182 
+3 1182 1168 1181 
+3 1170 1169 1183 
+3 1183 1169 1182 
+3 1171 1170 1184 
+3 1184 1170 1183 
+3 1172 1171 1185 
+3 1185 1171 1184 
+3 1173 1172 1186 
+3 1186 1172 1185 
+3 1174 1173 1187 
+3 1187 1173 1186 
+3 1476 1475 1174 
+3 1476 1174 1188 
+3 1188 1174 1187 
+3 1188 1189 1478 
+3 1476 1188 1478 
+3 1189 1190 1480 
+3 1478 1189 1480 
+3 1480 1190 1488 
+3 1175 1176 1177 
+3 1178 1177 1176 
+3 1179 1177 1178 
+3 1180 1179 1178 
+3 1181 1179 1180 
+3 1191 1181 1180 
+3 1191 1193 1181 
+3 1193 1182 1181 
+3 1183 1182 1195 
+3 1195 1182 1193 
+3 1184 1183 1197 
+3 1197 1183 1195 
+3 1185 1184 1198 
+3 1198 1184 1197 
+3 1186 1185 1199 
+3 1199 1185 1198 
+3 1187 1186 1200 
+3 1200 1186 1199 
+3 1188 1187 1201 
+3 1201 1187 1200 
+3 1189 1188 1202 
+3 1202 1188 1201 
+3 1190 1189 1203 
+3 1203 1189 1202 
+3 1489 1488 1190 
+3 1489 1190 1204 
+3 1204 1190 1203 
+3 1204 1205 1491 
+3 1489 1204 1491 
+3 1205 1206 1493 
+3 1491 1205 1493 
+3 1493 1206 1498 
+3 1191 1192 1193 
+3 1194 1193 1192 
+3 1195 1193 1194 
+3 1196 1195 1194 
+3 1197 1195 1196 
+3 1207 1197 1196 
+3 1207 1209 1197 
+3 1209 1198 1197 
+3 1199 1198 1211 
+3 1211 1198 1209 
+3 1200 1199 1213 
+3 1213 1199 1211 
+3 1201 1200 1214 
+3 1214 1200 1213 
+3 1202 1201 1215 
+3 1215 1201 1214 
+3 1203 1202 1216 
+3 1216 1202 1215 
+3 1204 1203 1217 
+3 1217 1203 1216 
+3 1205 1204 1218 
+3 1218 1204 1217 
+3 1206 1205 1219 
+3 1219 1205 1218 
+3 1499 1498 1206 
+3 1499 1206 1220 
+3 1220 1206 1219 
+3 1220 1221 1501 
+3 1499 1220 1501 
+3 1221 1222 1503 
+3 1501 1221 1503 
+3 1207 1208 1209 
+3 1210 1209 1208 
+3 1211 1209 1210 
+3 1212 1211 1210 
+3 1213 1211 1212 
+3 1223 1213 1212 
+3 1223 1225 1213 
+3 1225 1214 1213 
+3 1215 1214 1227 
+3 1227 1214 1225 
+3 1216 1215 1229 
+3 1229 1215 1227 
+3 1217 1216 1230 
+3 1230 1216 1229 
+3 1218 1217 1231 
+3 1231 1217 1230 
+3 1219 1218 1232 
+3 1232 1218 1231 
+3 1220 1219 1233 
+3 1233 1219 1232 
+3 1221 1220 1234 
+3 1234 1220 1233 
+3 1222 1221 1235 
+3 1235 1221 1234 
+3 1223 1224 1225 
+3 1226 1225 1224 
+3 1227 1225 1226 
+3 1228 1227 1226 
+3 1229 1227 1228 
+3 1236 1229 1228 
+3 1236 1238 1229 
+3 1238 1230 1229 
+3 1231 1230 1240 
+3 1240 1230 1238 
+3 1232 1231 1242 
+3 1242 1231 1240 
+3 1233 1232 1243 
+3 1243 1232 1242 
+3 1234 1233 1244 
+3 1244 1233 1243 
+3 1235 1234 1245 
+3 1245 1234 1244 
+3 1236 1237 1238 
+3 1239 1238 1237 
+3 1240 1238 1239 
+3 1241 1240 1239 
+3 1242 1240 1241 
+3 1246 1242 1241 
+3 1246 1248 1242 
+3 1248 1243 1242 
+3 1244 1243 1250 
+3 1250 1243 1248 
+3 1245 1244 1252 
+3 1252 1244 1250 
+3 1246 1247 1248 
+3 1249 1248 1247 
+3 1250 1248 1249 
+3 1251 1250 1249 
+3 1252 1250 1251 
+3 1513 1253 1523 
+3 1524 1523 1253 
+3 1524 1253 1255 
+3 1255 1253 1254 
+3 1255 1256 1526 
+3 1524 1255 1526 
+3 1256 1257 1528 
+3 1526 1256 1528 
+3 1528 1257 1539 
+3 1255 1254 1259 
+3 1259 1254 1258 
+3 1256 1255 1260 
+3 1260 1255 1259 
+3 1257 1256 1261 
+3 1261 1256 1260 
+3 1540 1539 1257 
+3 1540 1257 1262 
+3 1262 1257 1261 
+3 1262 1263 1542 
+3 1540 1262 1542 
+3 1263 1264 1544 
+3 1542 1263 1544 
+3 1264 1265 1546 
+3 1544 1264 1546 
+3 1546 1265 1557 
+3 1259 1258 1269 
+3 1269 1258 1267 
+3 1260 1259 1271 
+3 1271 1259 1269 
+3 1261 1260 1272 
+3 1272 1260 1271 
+3 1262 1261 1273 
+3 1273 1261 1272 
+3 1263 1262 1274 
+3 1274 1262 1273 
+3 1264 1263 1275 
+3 1275 1263 1274 
+3 1265 1264 1276 
+3 1276 1264 1275 
+3 1558 1557 1265 
+3 1558 1265 1277 
+3 1277 1265 1276 
+3 1277 1278 1560 
+3 1558 1277 1560 
+3 1278 1279 1562 
+3 1560 1278 1562 
+3 1562 1279 1573 
+3 1268 1267 1266 
+3 1269 1267 1268 
+3 1270 1269 1268 
+3 1271 1269 1270 
+3 1280 1271 1270 
+3 1280 1282 1271 
+3 1282 1272 1271 
+3 1273 1272 1284 
+3 1284 1272 1282 
+3 1274 1273 1286 
+3 1286 1273 1284 
+3 1275 1274 1287 
+3 1287 1274 1286 
+3 1276 1275 1288 
+3 1288 1275 1287 
+3 1277 1276 1289 
+3 1289 1276 1288 
+3 1278 1277 1290 
+3 1290 1277 1289 
+3 1279 1278 1291 
+3 1291 1278 1290 
+3 1574 1573 1279 
+3 1574 1279 1292 
+3 1292 1279 1291 
+3 1292 1293 1576 
+3 1574 1292 1576 
+3 1293 1294 1578 
+3 1576 1293 1578 
+3 1578 1294 1590 
+3 1280 1281 1282 
+3 1283 1282 1281 
+3 1284 1282 1283 
+3 1285 1284 1283 
+3 1286 1284 1285 
+3 1295 1286 1285 
+3 1295 1297 1286 
+3 1297 1287 1286 
+3 1288 1287 1299 
+3 1299 1287 1297 
+3 1289 1288 1301 
+3 1301 1288 1299 
+3 1290 1289 1302 
+3 1302 1289 1301 
+3 1291 1290 1303 
+3 1303 1290 1302 
+3 1292 1291 1304 
+3 1304 1291 1303 
+3 1293 1292 1305 
+3 1305 1292 1304 
+3 1294 1293 1306 
+3 1306 1293 1305 
+3 1591 1590 1294 
+3 1591 1294 1307 
+3 1307 1294 1306 
+3 1307 1308 1593 
+3 1591 1307 1593 
+3 1308 1309 1595 
+3 1593 1308 1595 
+3 1309 1310 1597 
+3 1595 1309 1597 
+3 1597 1310 1609 
+3 1295 1296 1297 
+3 1298 1297 1296 
+3 1299 1297 1298 
+3 1300 1299 1298 
+3 1301 1299 1300 
+3 1311 1301 1300 
+3 1311 1313 1301 
+3 1313 1302 1301 
+3 1303 1302 1315 
+3 1315 1302 1313 
+3 1304 1303 1317 
+3 1317 1303 1315 
+3 1305 1304 1319 
+3 1319 1304 1317 
+3 1306 1305 1320 
+3 1320 1305 1319 
+3 1307 1306 1321 
+3 1321 1306 1320 
+3 1308 1307 1322 
+3 1322 1307 1321 
+3 1309 1308 1323 
+3 1323 1308 1322 
+3 1310 1309 1324 
+3 1324 1309 1323 
+3 1610 1609 1310 
+3 1610 1310 1325 
+3 1325 1310 1324 
+3 1325 1326 1612 
+3 1610 1325 1612 
+3 1326 1327 1614 
+3 1612 1326 1614 
+3 1614 1327 1626 
+3 1311 1312 1313 
+3 1314 1313 1312 
+3 1315 1313 1314 
+3 1316 1315 1314 
+3 1317 1315 1316 
+3 1318 1317 1316 
+3 1319 1317 1318 
+3 1328 1319 1318 
+3 1328 1330 1319 
+3 1330 1320 1319 
+3 1321 1320 1332 
+3 1332 1320 1330 
+3 1322 1321 1334 
+3 1334 1321 1332 
+3 1323 1322 1335 
+3 1335 1322 1334 
+3 1324 1323 1336 
+3 1336 1323 1335 
+3 1325 1324 1337 
+3 1337 1324 1336 
+3 1326 1325 1338 
+3 1338 1325 1337 
+3 1327 1326 1339 
+3 1339 1326 1338 
+3 1627 1626 1327 
+3 1627 1327 1340 
+3 1340 1327 1339 
+3 1340 1341 1629 
+3 1627 1340 1629 
+3 1341 1342 1631 
+3 1629 1341 1631 
+3 1631 1342 1644 
+3 1328 1329 1330 
+3 1331 1330 1329 
+3 1332 1330 1331 
+3 1333 1332 1331 
+3 1334 1332 1333 
+3 1343 1334 1333 
+3 1343 1345 1334 
+3 1345 1335 1334 
+3 1336 1335 1347 
+3 1347 1335 1345 
+3 1337 1336 1349 
+3 1349 1336 1347 
+3 1338 1337 1350 
+3 1350 1337 1349 
+3 1339 1338 1351 
+3 1351 1338 1350 
+3 1340 1339 1352 
+3 1352 1339 1351 
+3 1341 1340 1353 
+3 1353 1340 1352 
+3 1342 1341 1354 
+3 1354 1341 1353 
+3 1645 1644 1342 
+3 1645 1342 1355 
+3 1355 1342 1354 
+3 1355 1356 1647 
+3 1645 1355 1647 
+3 1356 1357 1649 
+3 1647 1356 1649 
+3 1357 1358 1651 
+3 1649 1357 1651 
+3 1651 1358 1663 
+3 1343 1344 1345 
+3 1346 1345 1344 
+3 1347 1345 1346 
+3 1348 1347 1346 
+3 1349 1347 1348 
+3 1359 1349 1348 
+3 1359 1361 1349 
+3 1361 1350 1349 
+3 1351 1350 1363 
+3 1363 1350 1361 
+3 1352 1351 1365 
+3 1365 1351 1363 
+3 1353 1352 1366 
+3 1366 1352 1365 
+3 1354 1353 1367 
+3 1367 1353 1366 
+3 1355 1354 1368 
+3 1368 1354 1367 
+3 1356 1355 1369 
+3 1369 1355 1368 
+3 1357 1356 1370 
+3 1370 1356 1369 
+3 1358 1357 1371 
+3 1371 1357 1370 
+3 1664 1663 1358 
+3 1664 1358 1372 
+3 1372 1358 1371 
+3 1372 1373 1666 
+3 1664 1372 1666 
+3 1373 1374 1668 
+3 1666 1373 1668 
+3 1668 1374 1681 
+3 1359 1360 1361 
+3 1362 1361 1360 
+3 1363 1361 1362 
+3 1364 1363 1362 
+3 1365 1363 1364 
+3 1375 1365 1364 
+3 1375 1377 1365 
+3 1377 1366 1365 
+3 1367 1366 1379 
+3 1379 1366 1377 
+3 1368 1367 1381 
+3 1381 1367 1379 
+3 1369 1368 1382 
+3 1382 1368 1381 
+3 1370 1369 1383 
+3 1383 1369 1382 
+3 1371 1370 1384 
+3 1384 1370 1383 
+3 1372 1371 1385 
+3 1385 1371 1384 
+3 1373 1372 1386 
+3 1386 1372 1385 
+3 1374 1373 1387 
+3 1387 1373 1386 
+3 1682 1681 1374 
+3 1682 1374 1388 
+3 1388 1374 1387 
+3 1388 1389 1684 
+3 1682 1388 1684 
+3 1389 1390 1686 
+3 1684 1389 1686 
+3 1390 1391 1688 
+3 1686 1390 1688 
+3 1688 1391 1701 
+3 1375 1376 1377 
+3 1378 1377 1376 
+3 1379 1377 1378 
+3 1380 1379 1378 
+3 1381 1379 1380 
+3 1392 1381 1380 
+3 1392 1394 1381 
+3 1394 1382 1381 
+3 1383 1382 1396 
+3 1396 1382 1394 
+3 1384 1383 1398 
+3 1398 1383 1396 
+3 1385 1384 1399 
+3 1399 1384 1398 
+3 1386 1385 1400 
+3 1400 1385 1399 
+3 1387 1386 1401 
+3 1401 1386 1400 
+3 1388 1387 1402 
+3 1402 1387 1401 
+3 1389 1388 1403 
+3 1403 1388 1402 
+3 1390 1389 1404 
+3 1404 1389 1403 
+3 1391 1390 1405 
+3 1405 1390 1404 
+3 1702 1701 1391 
+3 1702 1391 1406 
+3 1406 1391 1405 
+3 1406 1407 1704 
+3 1702 1406 1704 
+3 1407 1408 1706 
+3 1704 1407 1706 
+3 1706 1408 1719 
+3 1392 1393 1394 
+3 1395 1394 1393 
+3 1396 1394 1395 
+3 1397 1396 1395 
+3 1398 1396 1397 
+3 1409 1398 1397 
+3 1409 1411 1398 
+3 1411 1399 1398 
+3 1400 1399 1413 
+3 1413 1399 1411 
+3 1401 1400 1415 
+3 1415 1400 1413 
+3 1402 1401 1416 
+3 1416 1401 1415 
+3 1403 1402 1417 
+3 1417 1402 1416 
+3 1404 1403 1418 
+3 1418 1403 1417 
+3 1405 1404 1419 
+3 1419 1404 1418 
+3 1406 1405 1420 
+3 1420 1405 1419 
+3 1407 1406 1421 
+3 1421 1406 1420 
+3 1408 1407 1422 
+3 1422 1407 1421 
+3 1720 1719 1408 
+3 1720 1408 1423 
+3 1423 1408 1422 
+3 1423 1424 1722 
+3 1720 1423 1722 
+3 1424 1425 1724 
+3 1722 1424 1724 
+3 1724 1425 1735 
+3 1409 1410 1411 
+3 1412 1411 1410 
+3 1413 1411 1412 
+3 1414 1413 1412 
+3 1415 1413 1414 
+3 1126 1415 1414 
+3 1416 1415 1126 
+3 1126 1427 1416 
+3 1427 1417 1416 
+3 1418 1417 1429 
+3 1429 1417 1427 
+3 1419 1418 1431 
+3 1431 1418 1429 
+3 1420 1419 1432 
+3 1432 1419 1431 
+3 1421 1420 1433 
+3 1433 1420 1432 
+3 1422 1421 1434 
+3 1434 1421 1433 
+3 1423 1422 1435 
+3 1435 1422 1434 
+3 1424 1423 1436 
+3 1436 1423 1435 
+3 1425 1424 1437 
+3 1437 1424 1436 
+3 1736 1735 1425 
+3 1736 1425 1438 
+3 1438 1425 1437 
+3 1438 1439 1738 
+3 1736 1438 1738 
+3 1439 1440 1740 
+3 1738 1439 1740 
+3 1440 1441 1742 
+3 1740 1440 1742 
+3 1742 1441 1749 
+3 1126 1426 1427 
+3 1428 1427 1426 
+3 1429 1427 1428 
+3 1430 1429 1428 
+3 1431 1429 1430 
+3 1442 1431 1430 
+3 1442 1444 1431 
+3 1444 1432 1431 
+3 1433 1432 1446 
+3 1446 1432 1444 
+3 1434 1433 1448 
+3 1448 1433 1446 
+3 1435 1434 1449 
+3 1449 1434 1448 
+3 1436 1435 1450 
+3 1450 1435 1449 
+3 1437 1436 1451 
+3 1451 1436 1450 
+3 1438 1437 1452 
+3 1452 1437 1451 
+3 1439 1438 1453 
+3 1453 1438 1452 
+3 1440 1439 1454 
+3 1454 1439 1453 
+3 1441 1440 1455 
+3 1455 1440 1454 
+3 1750 1749 1441 
+3 1750 1441 1456 
+3 1456 1441 1455 
+3 1456 1457 1752 
+3 1750 1456 1752 
+3 1457 1458 1754 
+3 1752 1457 1754 
+3 1754 1458 1758 
+3 1442 1443 1444 
+3 1445 1444 1443 
+3 1446 1444 1445 
+3 1447 1446 1445 
+3 1448 1446 1447 
+3 1459 1448 1447 
+3 1459 1461 1448 
+3 1461 1449 1448 
+3 1450 1449 1463 
+3 1463 1449 1461 
+3 1451 1450 1465 
+3 1465 1450 1463 
+3 1452 1451 1466 
+3 1466 1451 1465 
+3 1453 1452 1467 
+3 1467 1452 1466 
+3 1454 1453 1468 
+3 1468 1453 1467 
+3 1455 1454 1469 
+3 1469 1454 1468 
+3 1456 1455 1470 
+3 1470 1455 1469 
+3 1457 1456 1471 
+3 1471 1456 1470 
+3 1458 1457 1472 
+3 1472 1457 1471 
+3 1759 1758 1458 
+3 1759 1458 1473 
+3 1473 1458 1472 
+3 1473 1474 1761 
+3 1759 1473 1761 
+3 1459 1460 1461 
+3 1462 1461 1460 
+3 1463 1461 1462 
+3 1464 1463 1462 
+3 1465 1463 1464 
+3 1475 1465 1464 
+3 1475 1477 1465 
+3 1477 1466 1465 
+3 1467 1466 1479 
+3 1479 1466 1477 
+3 1468 1467 1481 
+3 1481 1467 1479 
+3 1469 1468 1482 
+3 1482 1468 1481 
+3 1470 1469 1483 
+3 1483 1469 1482 
+3 1471 1470 1484 
+3 1484 1470 1483 
+3 1472 1471 1485 
+3 1485 1471 1484 
+3 1473 1472 1486 
+3 1486 1472 1485 
+3 1474 1473 1487 
+3 1487 1473 1486 
+3 1475 1476 1477 
+3 1478 1477 1476 
+3 1479 1477 1478 
+3 1480 1479 1478 
+3 1481 1479 1480 
+3 1488 1481 1480 
+3 1488 1490 1481 
+3 1490 1482 1481 
+3 1483 1482 1492 
+3 1492 1482 1490 
+3 1484 1483 1494 
+3 1494 1483 1492 
+3 1485 1484 1495 
+3 1495 1484 1494 
+3 1486 1485 1496 
+3 1496 1485 1495 
+3 1487 1486 1497 
+3 1497 1486 1496 
+3 1488 1489 1490 
+3 1491 1490 1489 
+3 1492 1490 1491 
+3 1493 1492 1491 
+3 1494 1492 1493 
+3 1498 1494 1493 
+3 1498 1500 1494 
+3 1500 1495 1494 
+3 1496 1495 1502 
+3 1502 1495 1500 
+3 1497 1496 1504 
+3 1504 1496 1502 
+3 1498 1499 1500 
+3 1501 1500 1499 
+3 1502 1500 1501 
+3 1503 1502 1501 
+3 1504 1502 1503 
+3 1505 1506 1777 
+3 1775 1505 1777 
+3 1777 1506 1789 
+3 1506 1505 1508 
+3 1508 1505 1507 
+3 1790 1789 1506 
+3 1790 1506 1509 
+3 1509 1506 1508 
+3 1509 1510 1792 
+3 1790 1509 1792 
+3 1510 1511 1794 
+3 1792 1510 1794 
+3 1511 1512 1796 
+3 1794 1511 1796 
+3 1796 1512 1808 
+3 1508 1507 1515 
+3 1515 1507 1514 
+3 1509 1508 1516 
+3 1516 1508 1515 
+3 1510 1509 1517 
+3 1517 1509 1516 
+3 1511 1510 1518 
+3 1518 1510 1517 
+3 1512 1511 1519 
+3 1519 1511 1518 
+3 1809 1808 1512 
+3 1809 1512 1520 
+3 1520 1512 1519 
+3 1520 1521 1811 
+3 1809 1520 1811 
+3 1521 1522 1813 
+3 1811 1521 1813 
+3 1813 1522 1826 
+3 1523 1514 1513 
+3 1523 1525 1514 
+3 1525 1515 1514 
+3 1516 1515 1527 
+3 1527 1515 1525 
+3 1517 1516 1529 
+3 1529 1516 1527 
+3 1518 1517 1530 
+3 1530 1517 1529 
+3 1519 1518 1531 
+3 1531 1518 1530 
+3 1520 1519 1532 
+3 1532 1519 1531 
+3 1521 1520 1533 
+3 1533 1520 1532 
+3 1522 1521 1534 
+3 1534 1521 1533 
+3 1827 1826 1522 
+3 1827 1522 1535 
+3 1535 1522 1534 
+3 1535 1536 1829 
+3 1827 1535 1829 
+3 1536 1537 1831 
+3 1829 1536 1831 
+3 1537 1538 1833 
+3 1831 1537 1833 
+3 1833 1538 1846 
+3 1523 1524 1525 
+3 1526 1525 1524 
+3 1527 1525 1526 
+3 1528 1527 1526 
+3 1529 1527 1528 
+3 1539 1529 1528 
+3 1539 1541 1529 
+3 1541 1530 1529 
+3 1531 1530 1543 
+3 1543 1530 1541 
+3 1532 1531 1545 
+3 1545 1531 1543 
+3 1533 1532 1547 
+3 1547 1532 1545 
+3 1534 1533 1548 
+3 1548 1533 1547 
+3 1535 1534 1549 
+3 1549 1534 1548 
+3 1536 1535 1550 
+3 1550 1535 1549 
+3 1537 1536 1551 
+3 1551 1536 1550 
+3 1538 1537 1552 
+3 1552 1537 1551 
+3 1847 1846 1538 
+3 1847 1538 1553 
+3 1553 1538 1552 
+3 1553 1554 1849 
+3 1847 1553 1849 
+3 1554 1555 1851 
+3 1849 1554 1851 
+3 1555 1556 1853 
+3 1851 1555 1853 
+3 1853 1556 1865 
+3 1539 1540 1541 
+3 1542 1541 1540 
+3 1543 1541 1542 
+3 1544 1543 1542 
+3 1545 1543 1544 
+3 1546 1545 1544 
+3 1547 1545 1546 
+3 1557 1547 1546 
+3 1557 1559 1547 
+3 1559 1548 1547 
+3 1549 1548 1561 
+3 1561 1548 1559 
+3 1550 1549 1563 
+3 1563 1549 1561 
+3 1551 1550 1564 
+3 1564 1550 1563 
+3 1552 1551 1565 
+3 1565 1551 1564 
+3 1553 1552 1566 
+3 1566 1552 1565 
+3 1554 1553 1567 
+3 1567 1553 1566 
+3 1555 1554 1568 
+3 1568 1554 1567 
+3 1556 1555 1569 
+3 1569 1555 1568 
+3 1866 1865 1556 
+3 1866 1556 1570 
+3 1570 1556 1569 
+3 1570 1571 1868 
+3 1866 1570 1868 
+3 1571 1572 1870 
+3 1868 1571 1870 
+3 1870 1572 1883 
+3 1557 1558 1559 
+3 1560 1559 1558 
+3 1561 1559 1560 
+3 1562 1561 1560 
+3 1563 1561 1562 
+3 1573 1563 1562 
+3 1573 1575 1563 
+3 1575 1564 1563 
+3 1565 1564 1577 
+3 1577 1564 1575 
+3 1566 1565 1579 
+3 1579 1565 1577 
+3 1567 1566 1580 
+3 1580 1566 1579 
+3 1568 1567 1581 
+3 1581 1567 1580 
+3 1569 1568 1582 
+3 1582 1568 1581 
+3 1570 1569 1583 
+3 1583 1569 1582 
+3 1571 1570 1584 
+3 1584 1570 1583 
+3 1572 1571 1585 
+3 1585 1571 1584 
+3 1884 1883 1572 
+3 1884 1572 1586 
+3 1586 1572 1585 
+3 1586 1587 1886 
+3 1884 1586 1886 
+3 1587 1588 1888 
+3 1886 1587 1888 
+3 1588 1589 1890 
+3 1888 1588 1890 
+3 1890 1589 1903 
+3 1573 1574 1575 
+3 1576 1575 1574 
+3 1577 1575 1576 
+3 1578 1577 1576 
+3 1579 1577 1578 
+3 1590 1579 1578 
+3 1590 1592 1579 
+3 1592 1580 1579 
+3 1581 1580 1594 
+3 1594 1580 1592 
+3 1582 1581 1596 
+3 1596 1581 1594 
+3 1583 1582 1598 
+3 1598 1582 1596 
+3 1584 1583 1599 
+3 1599 1583 1598 
+3 1585 1584 1600 
+3 1600 1584 1599 
+3 1586 1585 1601 
+3 1601 1585 1600 
+3 1587 1586 1602 
+3 1602 1586 1601 
+3 1588 1587 1603 
+3 1603 1587 1602 
+3 1589 1588 1604 
+3 1604 1588 1603 
+3 1904 1903 1589 
+3 1904 1589 1605 
+3 1605 1589 1604 
+3 1605 1606 1906 
+3 1904 1605 1906 
+3 1606 1607 1908 
+3 1906 1606 1908 
+3 1908 1607 1608 
+3 1590 1591 1592 
+3 1593 1592 1591 
+3 1594 1592 1593 
+3 1595 1594 1593 
+3 1596 1594 1595 
+3 1597 1596 1595 
+3 1598 1596 1597 
+3 1609 1598 1597 
+3 1609 1611 1598 
+3 1611 1599 1598 
+3 1600 1599 1613 
+3 1613 1599 1611 
+3 1601 1600 1615 
+3 1615 1600 1613 
+3 1602 1601 1616 
+3 1616 1601 1615 
+3 1603 1602 1617 
+3 1617 1602 1616 
+3 1604 1603 1618 
+3 1618 1603 1617 
+3 1605 1604 1619 
+3 1619 1604 1618 
+3 1606 1605 1620 
+3 1620 1605 1619 
+3 1607 1606 1621 
+3 1621 1606 1620 
+3 1608 1607 1622 
+3 1622 1607 1621 
+3 1922 1608 1623 
+3 1623 1608 1622 
+3 1623 1624 1924 
+3 1922 1623 1924 
+3 1624 1625 1926 
+3 1924 1624 1926 
+3 1926 1625 1940 
+3 1609 1610 1611 
+3 1612 1611 1610 
+3 1613 1611 1612 
+3 1614 1613 1612 
+3 1615 1613 1614 
+3 1626 1615 1614 
+3 1626 1628 1615 
+3 1628 1616 1615 
+3 1617 1616 1630 
+3 1630 1616 1628 
+3 1618 1617 1632 
+3 1632 1617 1630 
+3 1619 1618 1633 
+3 1633 1618 1632 
+3 1620 1619 1634 
+3 1634 1619 1633 
+3 1621 1620 1635 
+3 1635 1620 1634 
+3 1622 1621 1636 
+3 1636 1621 1635 
+3 1623 1622 1637 
+3 1637 1622 1636 
+3 1624 1623 1638 
+3 1638 1623 1637 
+3 1625 1624 1639 
+3 1639 1624 1638 
+3 1941 1940 1625 
+3 1941 1625 1640 
+3 1640 1625 1639 
+3 1640 1641 1943 
+3 1941 1640 1943 
+3 1641 1642 1945 
+3 1943 1641 1945 
+3 1642 1643 1947 
+3 1945 1642 1947 
+3 1947 1643 1961 
+3 1626 1627 1628 
+3 1629 1628 1627 
+3 1630 1628 1629 
+3 1631 1630 1629 
+3 1632 1630 1631 
+3 1644 1632 1631 
+3 1644 1646 1632 
+3 1646 1633 1632 
+3 1634 1633 1648 
+3 1648 1633 1646 
+3 1635 1634 1650 
+3 1650 1634 1648 
+3 1636 1635 1652 
+3 1652 1635 1650 
+3 1637 1636 1653 
+3 1653 1636 1652 
+3 1638 1637 1654 
+3 1654 1637 1653 
+3 1639 1638 1655 
+3 1655 1638 1654 
+3 1640 1639 1656 
+3 1656 1639 1655 
+3 1641 1640 1657 
+3 1657 1640 1656 
+3 1642 1641 1658 
+3 1658 1641 1657 
+3 1643 1642 1659 
+3 1659 1642 1658 
+3 1962 1961 1643 
+3 1962 1643 1660 
+3 1660 1643 1659 
+3 1660 1661 1964 
+3 1962 1660 1964 
+3 1661 1662 1966 
+3 1964 1661 1966 
+3 1966 1662 1980 
+3 1644 1645 1646 
+3 1647 1646 1645 
+3 1648 1646 1647 
+3 1649 1648 1647 
+3 1650 1648 1649 
+3 1651 1650 1649 
+3 1652 1650 1651 
+3 1663 1652 1651 
+3 1663 1665 1652 
+3 1665 1653 1652 
+3 1654 1653 1667 
+3 1667 1653 1665 
+3 1655 1654 1669 
+3 1669 1654 1667 
+3 1656 1655 1670 
+3 1670 1655 1669 
+3 1657 1656 1671 
+3 1671 1656 1670 
+3 1658 1657 1672 
+3 1672 1657 1671 
+3 1659 1658 1673 
+3 1673 1658 1672 
+3 1660 1659 1674 
+3 1674 1659 1673 
+3 1661 1660 1675 
+3 1675 1660 1674 
+3 1662 1661 1676 
+3 1676 1661 1675 
+3 1981 1980 1662 
+3 1981 1662 1677 
+3 1677 1662 1676 
+3 1677 1678 1983 
+3 1981 1677 1983 
+3 1678 1679 1985 
+3 1983 1678 1985 
+3 1679 1680 1987 
+3 1985 1679 1987 
+3 1987 1680 1997 
+3 1663 1664 1665 
+3 1666 1665 1664 
+3 1667 1665 1666 
+3 1668 1667 1666 
+3 1669 1667 1668 
+3 1681 1669 1668 
+3 1681 1683 1669 
+3 1683 1670 1669 
+3 1671 1670 1685 
+3 1685 1670 1683 
+3 1672 1671 1687 
+3 1687 1671 1685 
+3 1673 1672 1689 
+3 1689 1672 1687 
+3 1674 1673 1690 
+3 1690 1673 1689 
+3 1675 1674 1691 
+3 1691 1674 1690 
+3 1676 1675 1692 
+3 1692 1675 1691 
+3 1677 1676 1693 
+3 1693 1676 1692 
+3 1678 1677 1694 
+3 1694 1677 1693 
+3 1679 1678 1695 
+3 1695 1678 1694 
+3 1680 1679 1696 
+3 1696 1679 1695 
+3 1998 1997 1680 
+3 1998 1680 1697 
+3 1697 1680 1696 
+3 1697 1698 2000 
+3 1998 1697 2000 
+3 1698 1699 2002 
+3 2000 1698 2002 
+3 1699 1700 2004 
+3 2002 1699 2004 
+3 2004 1700 2010 
+3 1681 1682 1683 
+3 1684 1683 1682 
+3 1685 1683 1684 
+3 1686 1685 1684 
+3 1687 1685 1686 
+3 1688 1687 1686 
+3 1689 1687 1688 
+3 1701 1689 1688 
+3 1701 1703 1689 
+3 1703 1690 1689 
+3 1691 1690 1705 
+3 1705 1690 1703 
+3 1692 1691 1707 
+3 1707 1691 1705 
+3 1693 1692 1708 
+3 1708 1692 1707 
+3 1694 1693 1709 
+3 1709 1693 1708 
+3 1695 1694 1710 
+3 1710 1694 1709 
+3 1696 1695 1711 
+3 1711 1695 1710 
+3 1697 1696 1712 
+3 1712 1696 1711 
+3 1698 1697 1713 
+3 1713 1697 1712 
+3 1699 1698 1714 
+3 1714 1698 1713 
+3 1700 1699 1715 
+3 1715 1699 1714 
+3 2011 2010 1700 
+3 2011 1700 1716 
+3 1716 1700 1715 
+3 1716 1717 2013 
+3 2011 1716 2013 
+3 1717 1718 2015 
+3 2013 1717 2015 
+3 2015 1718 2018 
+3 1701 1702 1703 
+3 1704 1703 1702 
+3 1705 1703 1704 
+3 1706 1705 1704 
+3 1707 1705 1706 
+3 1719 1707 1706 
+3 1719 1721 1707 
+3 1721 1708 1707 
+3 1709 1708 1723 
+3 1723 1708 1721 
+3 1710 1709 1725 
+3 1725 1709 1723 
+3 1711 1710 1726 
+3 1726 1710 1725 
+3 1712 1711 1727 
+3 1727 1711 1726 
+3 1713 1712 1728 
+3 1728 1712 1727 
+3 1714 1713 1729 
+3 1729 1713 1728 
+3 1715 1714 1730 
+3 1730 1714 1729 
+3 1716 1715 1731 
+3 1731 1715 1730 
+3 1717 1716 1732 
+3 1732 1716 1731 
+3 1718 1717 1733 
+3 1733 1717 1732 
+3 2019 2018 1718 
+3 2019 1718 1734 
+3 1734 1718 1733 
+3 1719 1720 1721 
+3 1722 1721 1720 
+3 1723 1721 1722 
+3 1724 1723 1722 
+3 1725 1723 1724 
+3 1735 1725 1724 
+3 1735 1737 1725 
+3 1737 1726 1725 
+3 1727 1726 1739 
+3 1739 1726 1737 
+3 1728 1727 1741 
+3 1741 1727 1739 
+3 1729 1728 1743 
+3 1743 1728 1741 
+3 1730 1729 1744 
+3 1744 1729 1743 
+3 1731 1730 1745 
+3 1745 1730 1744 
+3 1732 1731 1746 
+3 1746 1731 1745 
+3 1733 1732 1747 
+3 1747 1732 1746 
+3 1734 1733 1748 
+3 1748 1733 1747 
+3 1735 1736 1737 
+3 1738 1737 1736 
+3 1739 1737 1738 
+3 1740 1739 1738 
+3 1741 1739 1740 
+3 1742 1741 1740 
+3 1743 1741 1742 
+3 1749 1743 1742 
+3 1749 1751 1743 
+3 1751 1744 1743 
+3 1745 1744 1753 
+3 1753 1744 1751 
+3 1746 1745 1755 
+3 1755 1745 1753 
+3 1747 1746 1756 
+3 1756 1746 1755 
+3 1748 1747 1757 
+3 1757 1747 1756 
+3 1749 1750 1751 
+3 1752 1751 1750 
+3 1753 1751 1752 
+3 1754 1753 1752 
+3 1755 1753 1754 
+3 1758 1755 1754 
+3 1758 1760 1755 
+3 1760 1756 1755 
+3 1757 1756 1762 
+3 1762 1756 1760 
+3 1758 1759 1760 
+3 1761 1760 1759 
+3 1762 1760 1761 
+3 1763 1764 2042 
+3 2040 1763 2042 
+3 1764 1765 2044 
+3 2042 1764 2044 
+3 1765 1766 2046 
+3 2044 1765 2046 
+3 2046 1766 2059 
+3 1764 1763 1768 
+3 1768 1763 1767 
+3 1765 1764 1769 
+3 1769 1764 1768 
+3 1766 1765 1770 
+3 1770 1765 1769 
+3 2060 2059 1766 
+3 2060 1766 1771 
+3 1771 1766 1770 
+3 1771 1772 2062 
+3 2060 1771 2062 
+3 1772 1773 2064 
+3 2062 1772 2064 
+3 1773 1774 2066 
+3 2064 1773 2066 
+3 2066 1774 2079 
+3 1768 1767 1778 
+3 1778 1767 1776 
+3 1769 1768 1779 
+3 1779 1768 1778 
+3 1770 1769 1780 
+3 1780 1769 1779 
+3 1771 1770 1781 
+3 1781 1770 1780 
+3 1772 1771 1782 
+3 1782 1771 1781 
+3 1773 1772 1783 
+3 1783 1772 1782 
+3 1774 1773 1784 
+3 1784 1773 1783 
+3 2080 2079 1774 
+3 2080 1774 1785 
+3 1785 1774 1784 
+3 1785 1786 2082 
+3 2080 1785 2082 
+3 1786 1787 2084 
+3 2082 1786 2084 
+3 1787 1788 2086 
+3 2084 1787 2086 
+3 2086 1788 2099 
+3 1777 1776 1775 
+3 1778 1776 1777 
+3 1789 1778 1777 
+3 1789 1791 1778 
+3 1791 1779 1778 
+3 1780 1779 1793 
+3 1793 1779 1791 
+3 1781 1780 1795 
+3 1795 1780 1793 
+3 1782 1781 1797 
+3 1797 1781 1795 
+3 1783 1782 1798 
+3 1798 1782 1797 
+3 1784 1783 1799 
+3 1799 1783 1798 
+3 1785 1784 1800 
+3 1800 1784 1799 
+3 1786 1785 1801 
+3 1801 1785 1800 
+3 1787 1786 1802 
+3 1802 1786 1801 
+3 1788 1787 1803 
+3 1803 1787 1802 
+3 2100 2099 1788 
+3 2100 1788 1804 
+3 1804 1788 1803 
+3 1804 1805 2102 
+3 2100 1804 2102 
+3 1805 1806 2104 
+3 2102 1805 2104 
+3 1806 1807 2106 
+3 2104 1806 2106 
+3 2106 1807 2120 
+3 1789 1790 1791 
+3 1792 1791 1790 
+3 1793 1791 1792 
+3 1794 1793 1792 
+3 1795 1793 1794 
+3 1796 1795 1794 
+3 1797 1795 1796 
+3 1808 1797 1796 
+3 1808 1810 1797 
+3 1810 1798 1797 
+3 1799 1798 1812 
+3 1812 1798 1810 
+3 1800 1799 1814 
+3 1814 1799 1812 
+3 1801 1800 1815 
+3 1815 1800 1814 
+3 1802 1801 1816 
+3 1816 1801 1815 
+3 1803 1802 1817 
+3 1817 1802 1816 
+3 1804 1803 1818 
+3 1818 1803 1817 
+3 1805 1804 1819 
+3 1819 1804 1818 
+3 1806 1805 1820 
+3 1820 1805 1819 
+3 1807 1806 1821 
+3 1821 1806 1820 
+3 2121 2120 1807 
+3 2121 1807 1822 
+3 1822 1807 1821 
+3 1822 1823 2123 
+3 2121 1822 2123 
+3 1823 1824 2125 
+3 2123 1823 2125 
+3 1824 1825 2127 
+3 2125 1824 2127 
+3 2127 1825 2141 
+3 1808 1809 1810 
+3 1811 1810 1809 
+3 1812 1810 1811 
+3 1813 1812 1811 
+3 1814 1812 1813 
+3 1826 1814 1813 
+3 1826 1828 1814 
+3 1828 1815 1814 
+3 1816 1815 1830 
+3 1830 1815 1828 
+3 1817 1816 1832 
+3 1832 1816 1830 
+3 1818 1817 1834 
+3 1834 1817 1832 
+3 1819 1818 1835 
+3 1835 1818 1834 
+3 1820 1819 1836 
+3 1836 1819 1835 
+3 1821 1820 1837 
+3 1837 1820 1836 
+3 1822 1821 1838 
+3 1838 1821 1837 
+3 1823 1822 1839 
+3 1839 1822 1838 
+3 1824 1823 1840 
+3 1840 1823 1839 
+3 1825 1824 1841 
+3 1841 1824 1840 
+3 2142 2141 1825 
+3 2142 1825 1842 
+3 1842 1825 1841 
+3 1842 1843 2144 
+3 2142 1842 2144 
+3 1843 1844 2146 
+3 2144 1843 2146 
+3 1844 1845 2148 
+3 2146 1844 2148 
+3 2148 1845 2162 
+3 1826 1827 1828 
+3 1829 1828 1827 
+3 1830 1828 1829 
+3 1831 1830 1829 
+3 1832 1830 1831 
+3 1833 1832 1831 
+3 1834 1832 1833 
+3 1846 1834 1833 
+3 1846 1848 1834 
+3 1848 1835 1834 
+3 1836 1835 1850 
+3 1850 1835 1848 
+3 1837 1836 1852 
+3 1852 1836 1850 
+3 1838 1837 1854 
+3 1854 1837 1852 
+3 1839 1838 1855 
+3 1855 1838 1854 
+3 1840 1839 1856 
+3 1856 1839 1855 
+3 1841 1840 1857 
+3 1857 1840 1856 
+3 1842 1841 1858 
+3 1858 1841 1857 
+3 1843 1842 1859 
+3 1859 1842 1858 
+3 1844 1843 1860 
+3 1860 1843 1859 
+3 1845 1844 1861 
+3 1861 1844 1860 
+3 2163 2162 1845 
+3 2163 1845 1862 
+3 1862 1845 1861 
+3 1862 1863 2165 
+3 2163 1862 2165 
+3 1863 1864 2167 
+3 2165 1863 2167 
+3 2167 1864 2183 
+3 1846 1847 1848 
+3 1849 1848 1847 
+3 1850 1848 1849 
+3 1851 1850 1849 
+3 1852 1850 1851 
+3 1853 1852 1851 
+3 1854 1852 1853 
+3 1865 1854 1853 
+3 1865 1867 1854 
+3 1867 1855 1854 
+3 1856 1855 1869 
+3 1869 1855 1867 
+3 1857 1856 1871 
+3 1871 1856 1869 
+3 1858 1857 1872 
+3 1872 1857 1871 
+3 1859 1858 1873 
+3 1873 1858 1872 
+3 1860 1859 1874 
+3 1874 1859 1873 
+3 1861 1860 1875 
+3 1875 1860 1874 
+3 1862 1861 1876 
+3 1876 1861 1875 
+3 1863 1862 1877 
+3 1877 1862 1876 
+3 1864 1863 1878 
+3 1878 1863 1877 
+3 2184 2183 1864 
+3 2184 1864 1879 
+3 1879 1864 1878 
+3 1879 1880 2186 
+3 2184 1879 2186 
+3 1880 1881 2188 
+3 2186 1880 2188 
+3 1881 1882 2190 
+3 2188 1881 2190 
+3 2190 1882 2206 
+3 1865 1866 1867 
+3 1868 1867 1866 
+3 1869 1867 1868 
+3 1870 1869 1868 
+3 1871 1869 1870 
+3 1883 1871 1870 
+3 1883 1885 1871 
+3 1885 1872 1871 
+3 1873 1872 1887 
+3 1887 1872 1885 
+3 1874 1873 1889 
+3 1889 1873 1887 
+3 1875 1874 1891 
+3 1891 1874 1889 
+3 1876 1875 1892 
+3 1892 1875 1891 
+3 1877 1876 1893 
+3 1893 1876 1892 
+3 1878 1877 1894 
+3 1894 1877 1893 
+3 1879 1878 1895 
+3 1895 1878 1894 
+3 1880 1879 1896 
+3 1896 1879 1895 
+3 1881 1880 1897 
+3 1897 1880 1896 
+3 1882 1881 1898 
+3 1898 1881 1897 
+3 2207 2206 1882 
+3 2207 1882 1899 
+3 1899 1882 1898 
+3 1899 1900 2209 
+3 2207 1899 2209 
+3 1900 1901 2211 
+3 2209 1900 2211 
+3 1901 1902 2213 
+3 2211 1901 2213 
+3 2213 1902 2229 
+3 1883 1884 1885 
+3 1886 1885 1884 
+3 1887 1885 1886 
+3 1888 1887 1886 
+3 1889 1887 1888 
+3 1890 1889 1888 
+3 1891 1889 1890 
+3 1903 1891 1890 
+3 1903 1905 1891 
+3 1905 1892 1891 
+3 1893 1892 1907 
+3 1907 1892 1905 
+3 1894 1893 1909 
+3 1909 1893 1907 
+3 1895 1894 1910 
+3 1910 1894 1909 
+3 1896 1895 1911 
+3 1911 1895 1910 
+3 1897 1896 1912 
+3 1912 1896 1911 
+3 1898 1897 1913 
+3 1913 1897 1912 
+3 1899 1898 1914 
+3 1914 1898 1913 
+3 1900 1899 1915 
+3 1915 1899 1914 
+3 1901 1900 1916 
+3 1916 1900 1915 
+3 1902 1901 1917 
+3 1917 1901 1916 
+3 2230 2229 1902 
+3 2230 1902 1918 
+3 1918 1902 1917 
+3 1918 1919 2232 
+3 2230 1918 2232 
+3 1919 1920 2234 
+3 2232 1919 2234 
+3 1920 1921 2236 
+3 2234 1920 2236 
+3 2236 1921 2249 
+3 1903 1904 1905 
+3 1906 1905 1904 
+3 1907 1905 1906 
+3 1908 1907 1906 
+3 1909 1907 1908 
+3 1608 1909 1908 
+3 1910 1909 1608 
+3 1608 1923 1910 
+3 1923 1911 1910 
+3 1912 1911 1925 
+3 1925 1911 1923 
+3 1913 1912 1927 
+3 1927 1912 1925 
+3 1914 1913 1928 
+3 1928 1913 1927 
+3 1915 1914 1929 
+3 1929 1914 1928 
+3 1916 1915 1930 
+3 1930 1915 1929 
+3 1917 1916 1931 
+3 1931 1916 1930 
+3 1918 1917 1932 
+3 1932 1917 1931 
+3 1919 1918 1933 
+3 1933 1918 1932 
+3 1920 1919 1934 
+3 1934 1919 1933 
+3 1921 1920 1935 
+3 1935 1920 1934 
+3 2250 2249 1921 
+3 2250 1921 1936 
+3 1936 1921 1935 
+3 1936 1937 2252 
+3 2250 1936 2252 
+3 1937 1938 2254 
+3 2252 1937 2254 
+3 1938 1939 2256 
+3 2254 1938 2256 
+3 2256 1939 2265 
+3 1608 1922 1923 
+3 1924 1923 1922 
+3 1925 1923 1924 
+3 1926 1925 1924 
+3 1927 1925 1926 
+3 1940 1927 1926 
+3 1940 1942 1927 
+3 1942 1928 1927 
+3 1929 1928 1944 
+3 1944 1928 1942 
+3 1930 1929 1946 
+3 1946 1929 1944 
+3 1931 1930 1948 
+3 1948 1930 1946 
+3 1932 1931 1949 
+3 1949 1931 1948 
+3 1933 1932 1950 
+3 1950 1932 1949 
+3 1934 1933 1951 
+3 1951 1933 1950 
+3 1935 1934 1952 
+3 1952 1934 1951 
+3 1936 1935 1953 
+3 1953 1935 1952 
+3 1937 1936 1954 
+3 1954 1936 1953 
+3 1938 1937 1955 
+3 1955 1937 1954 
+3 1939 1938 1956 
+3 1956 1938 1955 
+3 2266 2265 1939 
+3 2266 1939 1957 
+3 1957 1939 1956 
+3 1957 1958 2268 
+3 2266 1957 2268 
+3 1958 1959 2270 
+3 2268 1958 2270 
+3 1959 1960 2272 
+3 2270 1959 2272 
+3 2272 1960 2277 
+3 1940 1941 1942 
+3 1943 1942 1941 
+3 1944 1942 1943 
+3 1945 1944 1943 
+3 1946 1944 1945 
+3 1947 1946 1945 
+3 1948 1946 1947 
+3 1961 1948 1947 
+3 1961 1963 1948 
+3 1963 1949 1948 
+3 1950 1949 1965 
+3 1965 1949 1963 
+3 1951 1950 1967 
+3 1967 1950 1965 
+3 1952 1951 1968 
+3 1968 1951 1967 
+3 1953 1952 1969 
+3 1969 1952 1968 
+3 1954 1953 1970 
+3 1970 1953 1969 
+3 1955 1954 1971 
+3 1971 1954 1970 
+3 1956 1955 1972 
+3 1972 1955 1971 
+3 1957 1956 1973 
+3 1973 1956 1972 
+3 1958 1957 1974 
+3 1974 1957 1973 
+3 1959 1958 1975 
+3 1975 1958 1974 
+3 1960 1959 1976 
+3 1976 1959 1975 
+3 2278 2277 1960 
+3 2278 1960 1977 
+3 1977 1960 1976 
+3 1977 1978 2280 
+3 2278 1977 2280 
+3 1978 1979 2282 
+3 2280 1978 2282 
+3 1961 1962 1963 
+3 1964 1963 1962 
+3 1965 1963 1964 
+3 1966 1965 1964 
+3 1967 1965 1966 
+3 1980 1967 1966 
+3 1980 1982 1967 
+3 1982 1968 1967 
+3 1969 1968 1984 
+3 1984 1968 1982 
+3 1970 1969 1986 
+3 1986 1969 1984 
+3 1971 1970 1988 
+3 1988 1970 1986 
+3 1972 1971 1989 
+3 1989 1971 1988 
+3 1973 1972 1990 
+3 1990 1972 1989 
+3 1974 1973 1991 
+3 1991 1973 1990 
+3 1975 1974 1992 
+3 1992 1974 1991 
+3 1976 1975 1993 
+3 1993 1975 1992 
+3 1977 1976 1994 
+3 1994 1976 1993 
+3 1978 1977 1995 
+3 1995 1977 1994 
+3 1979 1978 1996 
+3 1996 1978 1995 
+3 1980 1981 1982 
+3 1983 1982 1981 
+3 1984 1982 1983 
+3 1985 1984 1983 
+3 1986 1984 1985 
+3 1987 1986 1985 
+3 1988 1986 1987 
+3 1997 1988 1987 
+3 1997 1999 1988 
+3 1999 1989 1988 
+3 1990 1989 2001 
+3 2001 1989 1999 
+3 1991 1990 2003 
+3 2003 1990 2001 
+3 1992 1991 2005 
+3 2005 1991 2003 
+3 1993 1992 2006 
+3 2006 1992 2005 
+3 1994 1993 2007 
+3 2007 1993 2006 
+3 1995 1994 2008 
+3 2008 1994 2007 
+3 1996 1995 2009 
+3 2009 1995 2008 
+3 1997 1998 1999 
+3 2000 1999 1998 
+3 2001 1999 2000 
+3 2002 2001 2000 
+3 2003 2001 2002 
+3 2004 2003 2002 
+3 2005 2003 2004 
+3 2010 2005 2004 
+3 2010 2012 2005 
+3 2012 2006 2005 
+3 2007 2006 2014 
+3 2014 2006 2012 
+3 2008 2007 2016 
+3 2016 2007 2014 
+3 2009 2008 2017 
+3 2017 2008 2016 
+3 2010 2011 2012 
+3 2013 2012 2011 
+3 2014 2012 2013 
+3 2015 2014 2013 
+3 2016 2014 2015 
+3 2018 2016 2015 
+3 2018 2020 2016 
+3 2020 2017 2016 
+3 2018 2019 2020 
+3 2021 2022 2302 
+3 2300 2021 2302 
+3 2302 2022 2317 
+3 2022 2021 2024 
+3 2024 2021 2023 
+3 2318 2317 2022 
+3 2318 2022 2025 
+3 2025 2022 2024 
+3 2025 2026 2320 
+3 2318 2025 2320 
+3 2026 2027 2322 
+3 2320 2026 2322 
+3 2027 2028 2324 
+3 2322 2027 2324 
+3 2324 2028 2339 
+3 2024 2023 2030 
+3 2030 2023 2029 
+3 2025 2024 2031 
+3 2031 2024 2030 
+3 2026 2025 2032 
+3 2032 2025 2031 
+3 2027 2026 2033 
+3 2033 2026 2032 
+3 2028 2027 2034 
+3 2034 2027 2033 
+3 2340 2339 2028 
+3 2340 2028 2035 
+3 2035 2028 2034 
+3 2035 2036 2342 
+3 2340 2035 2342 
+3 2036 2037 2344 
+3 2342 2036 2344 
+3 2037 2038 2346 
+3 2344 2037 2346 
+3 2038 2039 2348 
+3 2346 2038 2348 
+3 2348 2039 2363 
+3 2030 2029 2043 
+3 2043 2029 2041 
+3 2031 2030 2045 
+3 2045 2030 2043 
+3 2032 2031 2047 
+3 2047 2031 2045 
+3 2033 2032 2048 
+3 2048 2032 2047 
+3 2034 2033 2049 
+3 2049 2033 2048 
+3 2035 2034 2050 
+3 2050 2034 2049 
+3 2036 2035 2051 
+3 2051 2035 2050 
+3 2037 2036 2052 
+3 2052 2036 2051 
+3 2038 2037 2053 
+3 2053 2037 2052 
+3 2039 2038 2054 
+3 2054 2038 2053 
+3 2364 2363 2039 
+3 2364 2039 2055 
+3 2055 2039 2054 
+3 2055 2056 2366 
+3 2364 2055 2366 
+3 2056 2057 2368 
+3 2366 2056 2368 
+3 2057 2058 2370 
+3 2368 2057 2370 
+3 2370 2058 2386 
+3 2042 2041 2040 
+3 2043 2041 2042 
+3 2044 2043 2042 
+3 2045 2043 2044 
+3 2046 2045 2044 
+3 2047 2045 2046 
+3 2059 2047 2046 
+3 2059 2061 2047 
+3 2061 2048 2047 
+3 2049 2048 2063 
+3 2063 2048 2061 
+3 2050 2049 2065 
+3 2065 2049 2063 
+3 2051 2050 2067 
+3 2067 2050 2065 
+3 2052 2051 2068 
+3 2068 2051 2067 
+3 2053 2052 2069 
+3 2069 2052 2068 
+3 2054 2053 2070 
+3 2070 2053 2069 
+3 2055 2054 2071 
+3 2071 2054 2070 
+3 2056 2055 2072 
+3 2072 2055 2071 
+3 2057 2056 2073 
+3 2073 2056 2072 
+3 2058 2057 2074 
+3 2074 2057 2073 
+3 2387 2386 2058 
+3 2387 2058 2075 
+3 2075 2058 2074 
+3 2075 2076 2389 
+3 2387 2075 2389 
+3 2076 2077 2391 
+3 2389 2076 2391 
+3 2077 2078 2393 
+3 2391 2077 2393 
+3 2393 2078 2409 
+3 2059 2060 2061 
+3 2062 2061 2060 
+3 2063 2061 2062 
+3 2064 2063 2062 
+3 2065 2063 2064 
+3 2066 2065 2064 
+3 2067 2065 2066 
+3 2079 2067 2066 
+3 2079 2081 2067 
+3 2081 2068 2067 
+3 2069 2068 2083 
+3 2083 2068 2081 
+3 2070 2069 2085 
+3 2085 2069 2083 
+3 2071 2070 2087 
+3 2087 2070 2085 
+3 2072 2071 2088 
+3 2088 2071 2087 
+3 2073 2072 2089 
+3 2089 2072 2088 
+3 2074 2073 2090 
+3 2090 2073 2089 
+3 2075 2074 2091 
+3 2091 2074 2090 
+3 2076 2075 2092 
+3 2092 2075 2091 
+3 2077 2076 2093 
+3 2093 2076 2092 
+3 2078 2077 2094 
+3 2094 2077 2093 
+3 2410 2409 2078 
+3 2410 2078 2095 
+3 2095 2078 2094 
+3 2095 2096 2412 
+3 2410 2095 2412 
+3 2096 2097 2414 
+3 2412 2096 2414 
+3 2097 2098 2416 
+3 2414 2097 2416 
+3 2416 2098 2433 
+3 2079 2080 2081 
+3 2082 2081 2080 
+3 2083 2081 2082 
+3 2084 2083 2082 
+3 2085 2083 2084 
+3 2086 2085 2084 
+3 2087 2085 2086 
+3 2099 2087 2086 
+3 2099 2101 2087 
+3 2101 2088 2087 
+3 2089 2088 2103 
+3 2103 2088 2101 
+3 2090 2089 2105 
+3 2105 2089 2103 
+3 2091 2090 2107 
+3 2107 2090 2105 
+3 2092 2091 2108 
+3 2108 2091 2107 
+3 2093 2092 2109 
+3 2109 2092 2108 
+3 2094 2093 2110 
+3 2110 2093 2109 
+3 2095 2094 2111 
+3 2111 2094 2110 
+3 2096 2095 2112 
+3 2112 2095 2111 
+3 2097 2096 2113 
+3 2113 2096 2112 
+3 2098 2097 2114 
+3 2114 2097 2113 
+3 2434 2433 2098 
+3 2434 2098 2115 
+3 2115 2098 2114 
+3 2115 2116 2436 
+3 2434 2115 2436 
+3 2116 2117 2438 
+3 2436 2116 2438 
+3 2117 2118 2440 
+3 2438 2117 2440 
+3 2118 2119 2442 
+3 2440 2118 2442 
+3 2442 2119 2459 
+3 2099 2100 2101 
+3 2102 2101 2100 
+3 2103 2101 2102 
+3 2104 2103 2102 
+3 2105 2103 2104 
+3 2106 2105 2104 
+3 2107 2105 2106 
+3 2120 2107 2106 
+3 2120 2122 2107 
+3 2122 2108 2107 
+3 2109 2108 2124 
+3 2124 2108 2122 
+3 2110 2109 2126 
+3 2126 2109 2124 
+3 2111 2110 2128 
+3 2128 2110 2126 
+3 2112 2111 2129 
+3 2129 2111 2128 
+3 2113 2112 2130 
+3 2130 2112 2129 
+3 2114 2113 2131 
+3 2131 2113 2130 
+3 2115 2114 2132 
+3 2132 2114 2131 
+3 2116 2115 2133 
+3 2133 2115 2132 
+3 2117 2116 2134 
+3 2134 2116 2133 
+3 2118 2117 2135 
+3 2135 2117 2134 
+3 2119 2118 2136 
+3 2136 2118 2135 
+3 2460 2459 2119 
+3 2460 2119 2137 
+3 2137 2119 2136 
+3 2137 2138 2462 
+3 2460 2137 2462 
+3 2138 2139 2464 
+3 2462 2138 2464 
+3 2139 2140 2466 
+3 2464 2139 2466 
+3 2466 2140 2483 
+3 2120 2121 2122 
+3 2123 2122 2121 
+3 2124 2122 2123 
+3 2125 2124 2123 
+3 2126 2124 2125 
+3 2127 2126 2125 
+3 2128 2126 2127 
+3 2141 2128 2127 
+3 2141 2143 2128 
+3 2143 2129 2128 
+3 2130 2129 2145 
+3 2145 2129 2143 
+3 2131 2130 2147 
+3 2147 2130 2145 
+3 2132 2131 2149 
+3 2149 2131 2147 
+3 2133 2132 2150 
+3 2150 2132 2149 
+3 2134 2133 2151 
+3 2151 2133 2150 
+3 2135 2134 2152 
+3 2152 2134 2151 
+3 2136 2135 2153 
+3 2153 2135 2152 
+3 2137 2136 2154 
+3 2154 2136 2153 
+3 2138 2137 2155 
+3 2155 2137 2154 
+3 2139 2138 2156 
+3 2156 2138 2155 
+3 2140 2139 2157 
+3 2157 2139 2156 
+3 2484 2483 2140 
+3 2484 2140 2158 
+3 2158 2140 2157 
+3 2158 2159 2486 
+3 2484 2158 2486 
+3 2159 2160 2488 
+3 2486 2159 2488 
+3 2160 2161 2490 
+3 2488 2160 2490 
+3 2490 2161 2506 
+3 2141 2142 2143 
+3 2144 2143 2142 
+3 2145 2143 2144 
+3 2146 2145 2144 
+3 2147 2145 2146 
+3 2148 2147 2146 
+3 2149 2147 2148 
+3 2162 2149 2148 
+3 2162 2164 2149 
+3 2164 2150 2149 
+3 2151 2150 2166 
+3 2166 2150 2164 
+3 2152 2151 2168 
+3 2168 2151 2166 
+3 2153 2152 2169 
+3 2169 2152 2168 
+3 2154 2153 2170 
+3 2170 2153 2169 
+3 2155 2154 2171 
+3 2171 2154 2170 
+3 2156 2155 2172 
+3 2172 2155 2171 
+3 2157 2156 2173 
+3 2173 2156 2172 
+3 2158 2157 2174 
+3 2174 2157 2173 
+3 2159 2158 2175 
+3 2175 2158 2174 
+3 2160 2159 2176 
+3 2176 2159 2175 
+3 2161 2160 2177 
+3 2177 2160 2176 
+3 2507 2506 2161 
+3 2507 2161 2178 
+3 2178 2161 2177 
+3 2178 2179 2509 
+3 2507 2178 2509 
+3 2179 2180 2511 
+3 2509 2179 2511 
+3 2180 2181 2513 
+3 2511 2180 2513 
+3 2181 2182 2515 
+3 2513 2181 2515 
+3 2515 2182 2526 
+3 2162 2163 2164 
+3 2165 2164 2163 
+3 2166 2164 2165 
+3 2167 2166 2165 
+3 2168 2166 2167 
+3 2183 2168 2167 
+3 2183 2185 2168 
+3 2185 2169 2168 
+3 2170 2169 2187 
+3 2187 2169 2185 
+3 2171 2170 2189 
+3 2189 2170 2187 
+3 2172 2171 2191 
+3 2191 2171 2189 
+3 2173 2172 2192 
+3 2192 2172 2191 
+3 2174 2173 2193 
+3 2193 2173 2192 
+3 2175 2174 2194 
+3 2194 2174 2193 
+3 2176 2175 2195 
+3 2195 2175 2194 
+3 2177 2176 2196 
+3 2196 2176 2195 
+3 2178 2177 2197 
+3 2197 2177 2196 
+3 2179 2178 2198 
+3 2198 2178 2197 
+3 2180 2179 2199 
+3 2199 2179 2198 
+3 2181 2180 2200 
+3 2200 2180 2199 
+3 2182 2181 2201 
+3 2201 2181 2200 
+3 2527 2526 2182 
+3 2527 2182 2202 
+3 2202 2182 2201 
+3 2202 2203 2529 
+3 2527 2202 2529 
+3 2203 2204 2531 
+3 2529 2203 2531 
+3 2204 2205 2533 
+3 2531 2204 2533 
+3 2533 2205 2540 
+3 2183 2184 2185 
+3 2186 2185 2184 
+3 2187 2185 2186 
+3 2188 2187 2186 
+3 2189 2187 2188 
+3 2190 2189 2188 
+3 2191 2189 2190 
+3 2206 2191 2190 
+3 2206 2208 2191 
+3 2208 2192 2191 
+3 2193 2192 2210 
+3 2210 2192 2208 
+3 2194 2193 2212 
+3 2212 2193 2210 
+3 2195 2194 2214 
+3 2214 2194 2212 
+3 2196 2195 2215 
+3 2215 2195 2214 
+3 2197 2196 2216 
+3 2216 2196 2215 
+3 2198 2197 2217 
+3 2217 2197 2216 
+3 2199 2198 2218 
+3 2218 2198 2217 
+3 2200 2199 2219 
+3 2219 2199 2218 
+3 2201 2200 2220 
+3 2220 2200 2219 
+3 2202 2201 2221 
+3 2221 2201 2220 
+3 2203 2202 2222 
+3 2222 2202 2221 
+3 2204 2203 2223 
+3 2223 2203 2222 
+3 2205 2204 2224 
+3 2224 2204 2223 
+3 2541 2540 2205 
+3 2541 2205 2225 
+3 2225 2205 2224 
+3 2225 2226 2543 
+3 2541 2225 2543 
+3 2226 2227 2545 
+3 2543 2226 2545 
+3 2227 2228 2547 
+3 2545 2227 2547 
+3 2547 2228 2550 
+3 2206 2207 2208 
+3 2209 2208 2207 
+3 2210 2208 2209 
+3 2211 2210 2209 
+3 2212 2210 2211 
+3 2213 2212 2211 
+3 2214 2212 2213 
+3 2229 2214 2213 
+3 2229 2231 2214 
+3 2231 2215 2214 
+3 2216 2215 2233 
+3 2233 2215 2231 
+3 2217 2216 2235 
+3 2235 2216 2233 
+3 2218 2217 2237 
+3 2237 2217 2235 
+3 2219 2218 2238 
+3 2238 2218 2237 
+3 2220 2219 2239 
+3 2239 2219 2238 
+3 2221 2220 2240 
+3 2240 2220 2239 
+3 2222 2221 2241 
+3 2241 2221 2240 
+3 2223 2222 2242 
+3 2242 2222 2241 
+3 2224 2223 2243 
+3 2243 2223 2242 
+3 2225 2224 2244 
+3 2244 2224 2243 
+3 2226 2225 2245 
+3 2245 2225 2244 
+3 2227 2226 2246 
+3 2246 2226 2245 
+3 2228 2227 2247 
+3 2247 2227 2246 
+3 2551 2550 2228 
+3 2551 2228 2248 
+3 2248 2228 2247 
+3 2229 2230 2231 
+3 2232 2231 2230 
+3 2233 2231 2232 
+3 2234 2233 2232 
+3 2235 2233 2234 
+3 2236 2235 2234 
+3 2237 2235 2236 
+3 2249 2237 2236 
+3 2249 2251 2237 
+3 2251 2238 2237 
+3 2239 2238 2253 
+3 2253 2238 2251 
+3 2240 2239 2255 
+3 2255 2239 2253 
+3 2241 2240 2257 
+3 2257 2240 2255 
+3 2242 2241 2258 
+3 2258 2241 2257 
+3 2243 2242 2259 
+3 2259 2242 2258 
+3 2244 2243 2260 
+3 2260 2243 2259 
+3 2245 2244 2261 
+3 2261 2244 2260 
+3 2246 2245 2262 
+3 2262 2245 2261 
+3 2247 2246 2263 
+3 2263 2246 2262 
+3 2248 2247 2264 
+3 2264 2247 2263 
+3 2249 2250 2251 
+3 2252 2251 2250 
+3 2253 2251 2252 
+3 2254 2253 2252 
+3 2255 2253 2254 
+3 2256 2255 2254 
+3 2257 2255 2256 
+3 2265 2257 2256 
+3 2265 2267 2257 
+3 2267 2258 2257 
+3 2259 2258 2269 
+3 2269 2258 2267 
+3 2260 2259 2271 
+3 2271 2259 2269 
+3 2261 2260 2273 
+3 2273 2260 2271 
+3 2262 2261 2274 
+3 2274 2261 2273 
+3 2263 2262 2275 
+3 2275 2262 2274 
+3 2264 2263 2276 
+3 2276 2263 2275 
+3 2265 2266 2267 
+3 2268 2267 2266 
+3 2269 2267 2268 
+3 2270 2269 2268 
+3 2271 2269 2270 
+3 2272 2271 2270 
+3 2273 2271 2272 
+3 2277 2273 2272 
+3 2277 2279 2273 
+3 2279 2274 2273 
+3 2275 2274 2281 
+3 2281 2274 2279 
+3 2276 2275 2283 
+3 2283 2275 2281 
+3 2277 2278 2279 
+3 2280 2279 2278 
+3 2281 2279 2280 
+3 2282 2281 2280 
+3 2283 2281 2282 
+3 2580 2284 2286 
+3 2286 2284 2285 
+3 2286 2287 2582 
+3 2580 2286 2582 
+3 2287 2288 2584 
+3 2582 2287 2584 
+3 2288 2289 2586 
+3 2584 2288 2586 
+3 2586 2289 2602 
+3 2286 2285 2291 
+3 2291 2285 2290 
+3 2287 2286 2292 
+3 2292 2286 2291 
+3 2288 2287 2293 
+3 2293 2287 2292 
+3 2289 2288 2294 
+3 2294 2288 2293 
+3 2603 2602 2289 
+3 2603 2289 2295 
+3 2295 2289 2294 
+3 2295 2296 2605 
+3 2603 2295 2605 
+3 2296 2297 2607 
+3 2605 2296 2607 
+3 2297 2298 2609 
+3 2607 2297 2609 
+3 2298 2299 2611 
+3 2609 2298 2611 
+3 2611 2299 2628 
+3 2291 2290 2303 
+3 2303 2290 2301 
+3 2292 2291 2304 
+3 2304 2291 2303 
+3 2293 2292 2305 
+3 2305 2292 2304 
+3 2294 2293 2306 
+3 2306 2293 2305 
+3 2295 2294 2307 
+3 2307 2294 2306 
+3 2296 2295 2308 
+3 2308 2295 2307 
+3 2297 2296 2309 
+3 2309 2296 2308 
+3 2298 2297 2310 
+3 2310 2297 2309 
+3 2299 2298 2311 
+3 2311 2298 2310 
+3 2629 2628 2299 
+3 2629 2299 2312 
+3 2312 2299 2311 
+3 2312 2313 2631 
+3 2629 2312 2631 
+3 2313 2314 2633 
+3 2631 2313 2633 
+3 2314 2315 2635 
+3 2633 2314 2635 
+3 2635 2315 2316 
+3 2302 2301 2300 
+3 2303 2301 2302 
+3 2317 2303 2302 
+3 2317 2319 2303 
+3 2319 2304 2303 
+3 2305 2304 2321 
+3 2321 2304 2319 
+3 2306 2305 2323 
+3 2323 2305 2321 
+3 2307 2306 2325 
+3 2325 2306 2323 
+3 2308 2307 2326 
+3 2326 2307 2325 
+3 2309 2308 2327 
+3 2327 2308 2326 
+3 2310 2309 2328 
+3 2328 2309 2327 
+3 2311 2310 2329 
+3 2329 2310 2328 
+3 2312 2311 2330 
+3 2330 2311 2329 
+3 2313 2312 2331 
+3 2331 2312 2330 
+3 2314 2313 2332 
+3 2332 2313 2331 
+3 2315 2314 2333 
+3 2333 2314 2332 
+3 2316 2315 2334 
+3 2334 2315 2333 
+3 2653 2316 2335 
+3 2335 2316 2334 
+3 2335 2336 2655 
+3 2653 2335 2655 
+3 2336 2337 2657 
+3 2655 2336 2657 
+3 2337 2338 2659 
+3 2657 2337 2659 
+3 2659 2338 2677 
+3 2317 2318 2319 
+3 2320 2319 2318 
+3 2321 2319 2320 
+3 2322 2321 2320 
+3 2323 2321 2322 
+3 2324 2323 2322 
+3 2325 2323 2324 
+3 2339 2325 2324 
+3 2339 2341 2325 
+3 2341 2326 2325 
+3 2327 2326 2343 
+3 2343 2326 2341 
+3 2328 2327 2345 
+3 2345 2327 2343 
+3 2329 2328 2347 
+3 2347 2328 2345 
+3 2330 2329 2349 
+3 2349 2329 2347 
+3 2331 2330 2350 
+3 2350 2330 2349 
+3 2332 2331 2351 
+3 2351 2331 2350 
+3 2333 2332 2352 
+3 2352 2332 2351 
+3 2334 2333 2353 
+3 2353 2333 2352 
+3 2335 2334 2354 
+3 2354 2334 2353 
+3 2336 2335 2355 
+3 2355 2335 2354 
+3 2337 2336 2356 
+3 2356 2336 2355 
+3 2338 2337 2357 
+3 2357 2337 2356 
+3 2678 2677 2338 
+3 2678 2338 2358 
+3 2358 2338 2357 
+3 2358 2359 2680 
+3 2678 2358 2680 
+3 2359 2360 2682 
+3 2680 2359 2682 
+3 2360 2361 2684 
+3 2682 2360 2684 
+3 2361 2362 2686 
+3 2684 2361 2686 
+3 2686 2362 2704 
+3 2339 2340 2341 
+3 2342 2341 2340 
+3 2343 2341 2342 
+3 2344 2343 2342 
+3 2345 2343 2344 
+3 2346 2345 2344 
+3 2347 2345 2346 
+3 2348 2347 2346 
+3 2349 2347 2348 
+3 2363 2349 2348 
+3 2363 2365 2349 
+3 2365 2350 2349 
+3 2351 2350 2367 
+3 2367 2350 2365 
+3 2352 2351 2369 
+3 2369 2351 2367 
+3 2353 2352 2371 
+3 2371 2352 2369 
+3 2354 2353 2372 
+3 2372 2353 2371 
+3 2355 2354 2373 
+3 2373 2354 2372 
+3 2356 2355 2374 
+3 2374 2355 2373 
+3 2357 2356 2375 
+3 2375 2356 2374 
+3 2358 2357 2376 
+3 2376 2357 2375 
+3 2359 2358 2377 
+3 2377 2358 2376 
+3 2360 2359 2378 
+3 2378 2359 2377 
+3 2361 2360 2379 
+3 2379 2360 2378 
+3 2362 2361 2380 
+3 2380 2361 2379 
+3 2705 2704 2362 
+3 2705 2362 2381 
+3 2381 2362 2380 
+3 2381 2382 2707 
+3 2705 2381 2707 
+3 2382 2383 2709 
+3 2707 2382 2709 
+3 2383 2384 2711 
+3 2709 2383 2711 
+3 2711 2384 2385 
+3 2363 2364 2365 
+3 2366 2365 2364 
+3 2367 2365 2366 
+3 2368 2367 2366 
+3 2369 2367 2368 
+3 2370 2369 2368 
+3 2371 2369 2370 
+3 2386 2371 2370 
+3 2386 2388 2371 
+3 2388 2372 2371 
+3 2373 2372 2390 
+3 2390 2372 2388 
+3 2374 2373 2392 
+3 2392 2373 2390 
+3 2375 2374 2394 
+3 2394 2374 2392 
+3 2376 2375 2395 
+3 2395 2375 2394 
+3 2377 2376 2396 
+3 2396 2376 2395 
+3 2378 2377 2397 
+3 2397 2377 2396 
+3 2379 2378 2398 
+3 2398 2378 2397 
+3 2380 2379 2399 
+3 2399 2379 2398 
+3 2381 2380 2400 
+3 2400 2380 2399 
+3 2382 2381 2401 
+3 2401 2381 2400 
+3 2383 2382 2402 
+3 2402 2382 2401 
+3 2384 2383 2403 
+3 2403 2383 2402 
+3 2385 2384 2404 
+3 2404 2384 2403 
+3 2730 2385 2405 
+3 2405 2385 2404 
+3 2405 2406 2732 
+3 2730 2405 2732 
+3 2406 2407 2734 
+3 2732 2406 2734 
+3 2407 2408 2736 
+3 2734 2407 2736 
+3 2736 2408 2755 
+3 2386 2387 2388 
+3 2389 2388 2387 
+3 2390 2388 2389 
+3 2391 2390 2389 
+3 2392 2390 2391 
+3 2393 2392 2391 
+3 2394 2392 2393 
+3 2409 2394 2393 
+3 2409 2411 2394 
+3 2411 2395 2394 
+3 2396 2395 2413 
+3 2413 2395 2411 
+3 2397 2396 2415 
+3 2415 2396 2413 
+3 2398 2397 2417 
+3 2417 2397 2415 
+3 2399 2398 2418 
+3 2418 2398 2417 
+3 2400 2399 2419 
+3 2419 2399 2418 
+3 2401 2400 2420 
+3 2420 2400 2419 
+3 2402 2401 2421 
+3 2421 2401 2420 
+3 2403 2402 2422 
+3 2422 2402 2421 
+3 2404 2403 2423 
+3 2423 2403 2422 
+3 2405 2404 2424 
+3 2424 2404 2423 
+3 2406 2405 2425 
+3 2425 2405 2424 
+3 2407 2406 2426 
+3 2426 2406 2425 
+3 2408 2407 2427 
+3 2427 2407 2426 
+3 2756 2755 2408 
+3 2756 2408 2428 
+3 2428 2408 2427 
+3 2428 2429 2758 
+3 2756 2428 2758 
+3 2429 2430 2760 
+3 2758 2429 2760 
+3 2430 2431 2762 
+3 2760 2430 2762 
+3 2431 2432 2764 
+3 2762 2431 2764 
+3 2764 2432 2778 
+3 2409 2410 2411 
+3 2412 2411 2410 
+3 2413 2411 2412 
+3 2414 2413 2412 
+3 2415 2413 2414 
+3 2416 2415 2414 
+3 2417 2415 2416 
+3 2433 2417 2416 
+3 2433 2435 2417 
+3 2435 2418 2417 
+3 2419 2418 2437 
+3 2437 2418 2435 
+3 2420 2419 2439 
+3 2439 2419 2437 
+3 2421 2420 2441 
+3 2441 2420 2439 
+3 2422 2421 2443 
+3 2443 2421 2441 
+3 2423 2422 2444 
+3 2444 2422 2443 
+3 2424 2423 2445 
+3 2445 2423 2444 
+3 2425 2424 2446 
+3 2446 2424 2445 
+3 2426 2425 2447 
+3 2447 2425 2446 
+3 2427 2426 2448 
+3 2448 2426 2447 
+3 2428 2427 2449 
+3 2449 2427 2448 
+3 2429 2428 2450 
+3 2450 2428 2449 
+3 2430 2429 2451 
+3 2451 2429 2450 
+3 2431 2430 2452 
+3 2452 2430 2451 
+3 2432 2431 2453 
+3 2453 2431 2452 
+3 2779 2778 2432 
+3 2779 2432 2454 
+3 2454 2432 2453 
+3 2454 2455 2781 
+3 2779 2454 2781 
+3 2455 2456 2783 
+3 2781 2455 2783 
+3 2456 2457 2785 
+3 2783 2456 2785 
+3 2785 2457 2458 
+3 2433 2434 2435 
+3 2436 2435 2434 
+3 2437 2435 2436 
+3 2438 2437 2436 
+3 2439 2437 2438 
+3 2440 2439 2438 
+3 2441 2439 2440 
+3 2442 2441 2440 
+3 2443 2441 2442 
+3 2459 2443 2442 
+3 2459 2461 2443 
+3 2461 2444 2443 
+3 2445 2444 2463 
+3 2463 2444 2461 
+3 2446 2445 2465 
+3 2465 2445 2463 
+3 2447 2446 2467 
+3 2467 2446 2465 
+3 2448 2447 2468 
+3 2468 2447 2467 
+3 2449 2448 2469 
+3 2469 2448 2468 
+3 2450 2449 2470 
+3 2470 2449 2469 
+3 2451 2450 2471 
+3 2471 2450 2470 
+3 2452 2451 2472 
+3 2472 2451 2471 
+3 2453 2452 2473 
+3 2473 2452 2472 
+3 2454 2453 2474 
+3 2474 2453 2473 
+3 2455 2454 2475 
+3 2475 2454 2474 
+3 2456 2455 2476 
+3 2476 2455 2475 
+3 2457 2456 2477 
+3 2477 2456 2476 
+3 2458 2457 2478 
+3 2478 2457 2477 
+3 2795 2458 2479 
+3 2479 2458 2478 
+3 2479 2480 2797 
+3 2795 2479 2797 
+3 2480 2481 2799 
+3 2797 2480 2799 
+3 2481 2482 2801 
+3 2799 2481 2801 
+3 2801 2482 2806 
+3 2459 2460 2461 
+3 2462 2461 2460 
+3 2463 2461 2462 
+3 2464 2463 2462 
+3 2465 2463 2464 
+3 2466 2465 2464 
+3 2467 2465 2466 
+3 2483 2467 2466 
+3 2483 2485 2467 
+3 2485 2468 2467 
+3 2469 2468 2487 
+3 2487 2468 2485 
+3 2470 2469 2489 
+3 2489 2469 2487 
+3 2471 2470 2491 
+3 2491 2470 2489 
+3 2472 2471 2492 
+3 2492 2471 2491 
+3 2473 2472 2493 
+3 2493 2472 2492 
+3 2474 2473 2494 
+3 2494 2473 2493 
+3 2475 2474 2495 
+3 2495 2474 2494 
+3 2476 2475 2496 
+3 2496 2475 2495 
+3 2477 2476 2497 
+3 2497 2476 2496 
+3 2478 2477 2498 
+3 2498 2477 2497 
+3 2479 2478 2499 
+3 2499 2478 2498 
+3 2480 2479 2500 
+3 2500 2479 2499 
+3 2481 2480 2501 
+3 2501 2480 2500 
+3 2482 2481 2502 
+3 2502 2481 2501 
+3 2807 2806 2482 
+3 2807 2482 2503 
+3 2503 2482 2502 
+3 2503 2504 2809 
+3 2807 2503 2809 
+3 2504 2505 2811 
+3 2809 2504 2811 
+3 2483 2484 2485 
+3 2486 2485 2484 
+3 2487 2485 2486 
+3 2488 2487 2486 
+3 2489 2487 2488 
+3 2490 2489 2488 
+3 2491 2489 2490 
+3 2506 2491 2490 
+3 2506 2508 2491 
+3 2508 2492 2491 
+3 2493 2492 2510 
+3 2510 2492 2508 
+3 2494 2493 2512 
+3 2512 2493 2510 
+3 2495 2494 2514 
+3 2514 2494 2512 
+3 2496 2495 2516 
+3 2516 2495 2514 
+3 2497 2496 2517 
+3 2517 2496 2516 
+3 2498 2497 2518 
+3 2518 2497 2517 
+3 2499 2498 2519 
+3 2519 2498 2518 
+3 2500 2499 2520 
+3 2520 2499 2519 
+3 2501 2500 2521 
+3 2521 2500 2520 
+3 2502 2501 2522 
+3 2522 2501 2521 
+3 2503 2502 2523 
+3 2523 2502 2522 
+3 2504 2503 2524 
+3 2524 2503 2523 
+3 2505 2504 2525 
+3 2525 2504 2524 
+3 2506 2507 2508 
+3 2509 2508 2507 
+3 2510 2508 2509 
+3 2511 2510 2509 
+3 2512 2510 2511 
+3 2513 2512 2511 
+3 2514 2512 2513 
+3 2515 2514 2513 
+3 2516 2514 2515 
+3 2526 2516 2515 
+3 2526 2528 2516 
+3 2528 2517 2516 
+3 2518 2517 2530 
+3 2530 2517 2528 
+3 2519 2518 2532 
+3 2532 2518 2530 
+3 2520 2519 2534 
+3 2534 2519 2532 
+3 2521 2520 2535 
+3 2535 2520 2534 
+3 2522 2521 2536 
+3 2536 2521 2535 
+3 2523 2522 2537 
+3 2537 2522 2536 
+3 2524 2523 2538 
+3 2538 2523 2537 
+3 2525 2524 2539 
+3 2539 2524 2538 
+3 2526 2527 2528 
+3 2529 2528 2527 
+3 2530 2528 2529 
+3 2531 2530 2529 
+3 2532 2530 2531 
+3 2533 2532 2531 
+3 2534 2532 2533 
+3 2540 2534 2533 
+3 2540 2542 2534 
+3 2542 2535 2534 
+3 2536 2535 2544 
+3 2544 2535 2542 
+3 2537 2536 2546 
+3 2546 2536 2544 
+3 2538 2537 2548 
+3 2548 2537 2546 
+3 2539 2538 2549 
+3 2549 2538 2548 
+3 2540 2541 2542 
+3 2543 2542 2541 
+3 2544 2542 2543 
+3 2545 2544 2543 
+3 2546 2544 2545 
+3 2547 2546 2545 
+3 2548 2546 2547 
+3 2550 2548 2547 
+3 2550 2552 2548 
+3 2552 2549 2548 
+3 2550 2551 2552 
+3 2553 2554 2839 
+3 2837 2553 2839 
+3 2554 2555 2841 
+3 2839 2554 2841 
+3 2555 2556 2843 
+3 2841 2555 2843 
+3 2843 2556 2861 
+3 2554 2553 2558 
+3 2558 2553 2557 
+3 2555 2554 2559 
+3 2559 2554 2558 
+3 2556 2555 2560 
+3 2560 2555 2559 
+3 2862 2861 2556 
+3 2862 2556 2561 
+3 2561 2556 2560 
+3 2561 2562 2864 
+3 2862 2561 2864 
+3 2562 2563 2866 
+3 2864 2562 2866 
+3 2563 2564 2868 
+3 2866 2563 2868 
+3 2564 2565 2870 
+3 2868 2564 2870 
+3 2870 2565 2889 
+3 2558 2557 2567 
+3 2567 2557 2566 
+3 2559 2558 2568 
+3 2568 2558 2567 
+3 2560 2559 2569 
+3 2569 2559 2568 
+3 2561 2560 2570 
+3 2570 2560 2569 
+3 2562 2561 2571 
+3 2571 2561 2570 
+3 2563 2562 2572 
+3 2572 2562 2571 
+3 2564 2563 2573 
+3 2573 2563 2572 
+3 2565 2564 2574 
+3 2574 2564 2573 
+3 2890 2889 2565 
+3 2890 2565 2575 
+3 2575 2565 2574 
+3 2575 2576 2892 
+3 2890 2575 2892 
+3 2576 2577 2894 
+3 2892 2576 2894 
+3 2577 2578 2896 
+3 2894 2577 2896 
+3 2578 2579 2898 
+3 2896 2578 2898 
+3 2898 2579 2918 
+3 2284 2581 2566 
+3 2581 2567 2566 
+3 2568 2567 2583 
+3 2583 2567 2581 
+3 2569 2568 2585 
+3 2585 2568 2583 
+3 2570 2569 2587 
+3 2587 2569 2585 
+3 2571 2570 2588 
+3 2588 2570 2587 
+3 2572 2571 2589 
+3 2589 2571 2588 
+3 2573 2572 2590 
+3 2590 2572 2589 
+3 2574 2573 2591 
+3 2591 2573 2590 
+3 2575 2574 2592 
+3 2592 2574 2591 
+3 2576 2575 2593 
+3 2593 2575 2592 
+3 2577 2576 2594 
+3 2594 2576 2593 
+3 2578 2577 2595 
+3 2595 2577 2594 
+3 2579 2578 2596 
+3 2596 2578 2595 
+3 2919 2918 2579 
+3 2919 2579 2597 
+3 2597 2579 2596 
+3 2597 2598 2921 
+3 2919 2597 2921 
+3 2598 2599 2923 
+3 2921 2598 2923 
+3 2599 2600 2925 
+3 2923 2599 2925 
+3 2600 2601 2927 
+3 2925 2600 2927 
+3 2927 2601 2948 
+3 2284 2580 2581 
+3 2582 2581 2580 
+3 2583 2581 2582 
+3 2584 2583 2582 
+3 2585 2583 2584 
+3 2586 2585 2584 
+3 2587 2585 2586 
+3 2602 2587 2586 
+3 2602 2604 2587 
+3 2604 2588 2587 
+3 2589 2588 2606 
+3 2606 2588 2604 
+3 2590 2589 2608 
+3 2608 2589 2606 
+3 2591 2590 2610 
+3 2610 2590 2608 
+3 2592 2591 2612 
+3 2612 2591 2610 
+3 2593 2592 2613 
+3 2613 2592 2612 
+3 2594 2593 2614 
+3 2614 2593 2613 
+3 2595 2594 2615 
+3 2615 2594 2614 
+3 2596 2595 2616 
+3 2616 2595 2615 
+3 2597 2596 2617 
+3 2617 2596 2616 
+3 2598 2597 2618 
+3 2618 2597 2617 
+3 2599 2598 2619 
+3 2619 2598 2618 
+3 2600 2599 2620 
+3 2620 2599 2619 
+3 2601 2600 2621 
+3 2621 2600 2620 
+3 2949 2948 2601 
+3 2949 2601 2622 
+3 2622 2601 2621 
+3 2622 2623 2951 
+3 2949 2622 2951 
+3 2623 2624 2953 
+3 2951 2623 2953 
+3 2624 2625 2955 
+3 2953 2624 2955 
+3 2625 2626 2957 
+3 2955 2625 2957 
+3 2626 2627 2959 
+3 2957 2626 2959 
+3 2959 2627 2979 
+3 2602 2603 2604 
+3 2605 2604 2603 
+3 2606 2604 2605 
+3 2607 2606 2605 
+3 2608 2606 2607 
+3 2609 2608 2607 
+3 2610 2608 2609 
+3 2611 2610 2609 
+3 2612 2610 2611 
+3 2628 2612 2611 
+3 2628 2630 2612 
+3 2630 2613 2612 
+3 2614 2613 2632 
+3 2632 2613 2630 
+3 2615 2614 2634 
+3 2634 2614 2632 
+3 2616 2615 2636 
+3 2636 2615 2634 
+3 2617 2616 2637 
+3 2637 2616 2636 
+3 2618 2617 2638 
+3 2638 2617 2637 
+3 2619 2618 2639 
+3 2639 2618 2638 
+3 2620 2619 2640 
+3 2640 2619 2639 
+3 2621 2620 2641 
+3 2641 2620 2640 
+3 2622 2621 2642 
+3 2642 2621 2641 
+3 2623 2622 2643 
+3 2643 2622 2642 
+3 2624 2623 2644 
+3 2644 2623 2643 
+3 2625 2624 2645 
+3 2645 2624 2644 
+3 2626 2625 2646 
+3 2646 2625 2645 
+3 2627 2626 2647 
+3 2647 2626 2646 
+3 2980 2979 2627 
+3 2980 2627 2648 
+3 2648 2627 2647 
+3 2648 2649 2982 
+3 2980 2648 2982 
+3 2649 2650 2984 
+3 2982 2649 2984 
+3 2650 2651 2986 
+3 2984 2650 2986 
+3 2651 2652 2988 
+3 2986 2651 2988 
+3 2988 2652 3009 
+3 2628 2629 2630 
+3 2631 2630 2629 
+3 2632 2630 2631 
+3 2633 2632 2631 
+3 2634 2632 2633 
+3 2635 2634 2633 
+3 2636 2634 2635 
+3 2316 2636 2635 
+3 2637 2636 2316 
+3 2316 2654 2637 
+3 2654 2638 2637 
+3 2639 2638 2656 
+3 2656 2638 2654 
+3 2640 2639 2658 
+3 2658 2639 2656 
+3 2641 2640 2660 
+3 2660 2640 2658 
+3 2642 2641 2661 
+3 2661 2641 2660 
+3 2643 2642 2662 
+3 2662 2642 2661 
+3 2644 2643 2663 
+3 2663 2643 2662 
+3 2645 2644 2664 
+3 2664 2644 2663 
+3 2646 2645 2665 
+3 2665 2645 2664 
+3 2647 2646 2666 
+3 2666 2646 2665 
+3 2648 2647 2667 
+3 2667 2647 2666 
+3 2649 2648 2668 
+3 2668 2648 2667 
+3 2650 2649 2669 
+3 2669 2649 2668 
+3 2651 2650 2670 
+3 2670 2650 2669 
+3 2652 2651 2671 
+3 2671 2651 2670 
+3 3010 3009 2652 
+3 3010 2652 2672 
+3 2672 2652 2671 
+3 2672 2673 3012 
+3 3010 2672 3012 
+3 2673 2674 3014 
+3 3012 2673 3014 
+3 2674 2675 3016 
+3 3014 2674 3016 
+3 2675 2676 3018 
+3 3016 2675 3018 
+3 3018 2676 3035 
+3 2316 2653 2654 
+3 2655 2654 2653 
+3 2656 2654 2655 
+3 2657 2656 2655 
+3 2658 2656 2657 
+3 2659 2658 2657 
+3 2660 2658 2659 
+3 2677 2660 2659 
+3 2677 2679 2660 
+3 2679 2661 2660 
+3 2662 2661 2681 
+3 2681 2661 2679 
+3 2663 2662 2683 
+3 2683 2662 2681 
+3 2664 2663 2685 
+3 2685 2663 2683 
+3 2665 2664 2687 
+3 2687 2664 2685 
+3 2666 2665 2688 
+3 2688 2665 2687 
+3 2667 2666 2689 
+3 2689 2666 2688 
+3 2668 2667 2690 
+3 2690 2667 2689 
+3 2669 2668 2691 
+3 2691 2668 2690 
+3 2670 2669 2692 
+3 2692 2669 2691 
+3 2671 2670 2693 
+3 2693 2670 2692 
+3 2672 2671 2694 
+3 2694 2671 2693 
+3 2673 2672 2695 
+3 2695 2672 2694 
+3 2674 2673 2696 
+3 2696 2673 2695 
+3 2675 2674 2697 
+3 2697 2674 2696 
+3 2676 2675 2698 
+3 2698 2675 2697 
+3 3036 3035 2676 
+3 3036 2676 2699 
+3 2699 2676 2698 
+3 2699 2700 3038 
+3 3036 2699 3038 
+3 2700 2701 3040 
+3 3038 2700 3040 
+3 2701 2702 3042 
+3 3040 2701 3042 
+3 2702 2703 3044 
+3 3042 2702 3044 
+3 3044 2703 3056 
+3 2677 2678 2679 
+3 2680 2679 2678 
+3 2681 2679 2680 
+3 2682 2681 2680 
+3 2683 2681 2682 
+3 2684 2683 2682 
+3 2685 2683 2684 
+3 2686 2685 2684 
+3 2687 2685 2686 
+3 2704 2687 2686 
+3 2704 2706 2687 
+3 2706 2688 2687 
+3 2689 2688 2708 
+3 2708 2688 2706 
+3 2690 2689 2710 
+3 2710 2689 2708 
+3 2691 2690 2712 
+3 2712 2690 2710 
+3 2692 2691 2713 
+3 2713 2691 2712 
+3 2693 2692 2714 
+3 2714 2692 2713 
+3 2694 2693 2715 
+3 2715 2693 2714 
+3 2695 2694 2716 
+3 2716 2694 2715 
+3 2696 2695 2717 
+3 2717 2695 2716 
+3 2697 2696 2718 
+3 2718 2696 2717 
+3 2698 2697 2719 
+3 2719 2697 2718 
+3 2699 2698 2720 
+3 2720 2698 2719 
+3 2700 2699 2721 
+3 2721 2699 2720 
+3 2701 2700 2722 
+3 2722 2700 2721 
+3 2702 2701 2723 
+3 2723 2701 2722 
+3 2703 2702 2724 
+3 2724 2702 2723 
+3 3057 3056 2703 
+3 3057 2703 2725 
+3 2725 2703 2724 
+3 2725 2726 3059 
+3 3057 2725 3059 
+3 2726 2727 3061 
+3 3059 2726 3061 
+3 2727 2728 3063 
+3 3061 2727 3063 
+3 2728 2729 3065 
+3 3063 2728 3065 
+3 3065 2729 3072 
+3 2704 2705 2706 
+3 2707 2706 2705 
+3 2708 2706 2707 
+3 2709 2708 2707 
+3 2710 2708 2709 
+3 2711 2710 2709 
+3 2712 2710 2711 
+3 2385 2712 2711 
+3 2713 2712 2385 
+3 2385 2731 2713 
+3 2731 2714 2713 
+3 2715 2714 2733 
+3 2733 2714 2731 
+3 2716 2715 2735 
+3 2735 2715 2733 
+3 2717 2716 2737 
+3 2737 2716 2735 
+3 2718 2717 2738 
+3 2738 2717 2737 
+3 2719 2718 2739 
+3 2739 2718 2738 
+3 2720 2719 2740 
+3 2740 2719 2739 
+3 2721 2720 2741 
+3 2741 2720 2740 
+3 2722 2721 2742 
+3 2742 2721 2741 
+3 2723 2722 2743 
+3 2743 2722 2742 
+3 2724 2723 2744 
+3 2744 2723 2743 
+3 2725 2724 2745 
+3 2745 2724 2744 
+3 2726 2725 2746 
+3 2746 2725 2745 
+3 2727 2726 2747 
+3 2747 2726 2746 
+3 2728 2727 2748 
+3 2748 2727 2747 
+3 2729 2728 2749 
+3 2749 2728 2748 
+3 3073 3072 2729 
+3 3073 2729 2750 
+3 2750 2729 2749 
+3 2750 2751 3075 
+3 3073 2750 3075 
+3 2751 2752 3077 
+3 3075 2751 3077 
+3 2752 2753 3079 
+3 3077 2752 3079 
+3 2753 2754 3081 
+3 3079 2753 3081 
+3 2385 2730 2731 
+3 2732 2731 2730 
+3 2733 2731 2732 
+3 2734 2733 2732 
+3 2735 2733 2734 
+3 2736 2735 2734 
+3 2737 2735 2736 
+3 2755 2737 2736 
+3 2755 2757 2737 
+3 2757 2738 2737 
+3 2739 2738 2759 
+3 2759 2738 2757 
+3 2740 2739 2761 
+3 2761 2739 2759 
+3 2741 2740 2763 
+3 2763 2740 2761 
+3 2742 2741 2765 
+3 2765 2741 2763 
+3 2743 2742 2766 
+3 2766 2742 2765 
+3 2744 2743 2767 
+3 2767 2743 2766 
+3 2745 2744 2768 
+3 2768 2744 2767 
+3 2746 2745 2769 
+3 2769 2745 2768 
+3 2747 2746 2770 
+3 2770 2746 2769 
+3 2748 2747 2771 
+3 2771 2747 2770 
+3 2749 2748 2772 
+3 2772 2748 2771 
+3 2750 2749 2773 
+3 2773 2749 2772 
+3 2751 2750 2774 
+3 2774 2750 2773 
+3 2752 2751 2775 
+3 2775 2751 2774 
+3 2753 2752 2776 
+3 2776 2752 2775 
+3 2754 2753 2777 
+3 2777 2753 2776 
+3 2755 2756 2757 
+3 2758 2757 2756 
+3 2759 2757 2758 
+3 2760 2759 2758 
+3 2761 2759 2760 
+3 2762 2761 2760 
+3 2763 2761 2762 
+3 2764 2763 2762 
+3 2765 2763 2764 
+3 2778 2765 2764 
+3 2778 2780 2765 
+3 2780 2766 2765 
+3 2767 2766 2782 
+3 2782 2766 2780 
+3 2768 2767 2784 
+3 2784 2767 2782 
+3 2769 2768 2786 
+3 2786 2768 2784 
+3 2770 2769 2787 
+3 2787 2769 2786 
+3 2771 2770 2788 
+3 2788 2770 2787 
+3 2772 2771 2789 
+3 2789 2771 2788 
+3 2773 2772 2790 
+3 2790 2772 2789 
+3 2774 2773 2791 
+3 2791 2773 2790 
+3 2775 2774 2792 
+3 2792 2774 2791 
+3 2776 2775 2793 
+3 2793 2775 2792 
+3 2777 2776 2794 
+3 2794 2776 2793 
+3 2778 2779 2780 
+3 2781 2780 2779 
+3 2782 2780 2781 
+3 2783 2782 2781 
+3 2784 2782 2783 
+3 2785 2784 2783 
+3 2786 2784 2785 
+3 2458 2786 2785 
+3 2787 2786 2458 
+3 2458 2796 2787 
+3 2796 2788 2787 
+3 2789 2788 2798 
+3 2798 2788 2796 
+3 2790 2789 2800 
+3 2800 2789 2798 
+3 2791 2790 2802 
+3 2802 2790 2800 
+3 2792 2791 2803 
+3 2803 2791 2802 
+3 2793 2792 2804 
+3 2804 2792 2803 
+3 2794 2793 2805 
+3 2805 2793 2804 
+3 2458 2795 2796 
+3 2797 2796 2795 
+3 2798 2796 2797 
+3 2799 2798 2797 
+3 2800 2798 2799 
+3 2801 2800 2799 
+3 2802 2800 2801 
+3 2806 2802 2801 
+3 2806 2808 2802 
+3 2808 2803 2802 
+3 2804 2803 2810 
+3 2810 2803 2808 
+3 2805 2804 2812 
+3 2812 2804 2810 
+3 2806 2807 2808 
+3 2809 2808 2807 
+3 2810 2808 2809 
+3 2811 2810 2809 
+3 2812 2810 2811 
+3 2814 2813 2823 
+3 2823 2813 2822 
+3 2815 2814 2824 
+3 2824 2814 2823 
+3 2816 2815 2825 
+3 2825 2815 2824 
+3 2817 2816 2826 
+3 2826 2816 2825 
+3 2818 2817 2827 
+3 2827 2817 2826 
+3 2819 2818 2828 
+3 2828 2818 2827 
+3 2820 2819 2829 
+3 2829 2819 2828 
+3 2821 2820 2830 
+3 2830 2820 2829 
+3 3084 3083 2821 
+3 3084 2821 2831 
+3 2831 2821 2830 
+3 2831 2832 3086 
+3 3084 2831 3086 
+3 2832 2833 3088 
+3 3086 2832 3088 
+3 2833 2834 3090 
+3 3088 2833 3090 
+3 2834 2835 3092 
+3 3090 2834 3092 
+3 2835 2836 3094 
+3 3092 2835 3094 
+3 3094 2836 3116 
+3 2823 2822 2840 
+3 2840 2822 2838 
+3 2824 2823 2842 
+3 2842 2823 2840 
+3 2825 2824 2844 
+3 2844 2824 2842 
+3 2826 2825 2845 
+3 2845 2825 2844 
+3 2827 2826 2846 
+3 2846 2826 2845 
+3 2828 2827 2847 
+3 2847 2827 2846 
+3 2829 2828 2848 
+3 2848 2828 2847 
+3 2830 2829 2849 
+3 2849 2829 2848 
+3 2831 2830 2850 
+3 2850 2830 2849 
+3 2832 2831 2851 
+3 2851 2831 2850 
+3 2833 2832 2852 
+3 2852 2832 2851 
+3 2834 2833 2853 
+3 2853 2833 2852 
+3 2835 2834 2854 
+3 2854 2834 2853 
+3 2836 2835 2855 
+3 2855 2835 2854 
+3 3117 3116 2836 
+3 3117 2836 2856 
+3 2856 2836 2855 
+3 2856 2857 3119 
+3 3117 2856 3119 
+3 2857 2858 3121 
+3 3119 2857 3121 
+3 2858 2859 3123 
+3 3121 2858 3123 
+3 2859 2860 3125 
+3 3123 2859 3125 
+3 3125 2860 3149 
+3 2839 2838 2837 
+3 2840 2838 2839 
+3 2841 2840 2839 
+3 2842 2840 2841 
+3 2843 2842 2841 
+3 2844 2842 2843 
+3 2861 2844 2843 
+3 2861 2863 2844 
+3 2863 2845 2844 
+3 2846 2845 2865 
+3 2865 2845 2863 
+3 2847 2846 2867 
+3 2867 2846 2865 
+3 2848 2847 2869 
+3 2869 2847 2867 
+3 2849 2848 2871 
+3 2871 2848 2869 
+3 2850 2849 2872 
+3 2872 2849 2871 
+3 2851 2850 2873 
+3 2873 2850 2872 
+3 2852 2851 2874 
+3 2874 2851 2873 
+3 2853 2852 2875 
+3 2875 2852 2874 
+3 2854 2853 2876 
+3 2876 2853 2875 
+3 2855 2854 2877 
+3 2877 2854 2876 
+3 2856 2855 2878 
+3 2878 2855 2877 
+3 2857 2856 2879 
+3 2879 2856 2878 
+3 2858 2857 2880 
+3 2880 2857 2879 
+3 2859 2858 2881 
+3 2881 2858 2880 
+3 2860 2859 2882 
+3 2882 2859 2881 
+3 3150 3149 2860 
+3 3150 2860 2883 
+3 2883 2860 2882 
+3 2883 2884 3152 
+3 3150 2883 3152 
+3 2884 2885 3154 
+3 3152 2884 3154 
+3 2885 2886 3156 
+3 3154 2885 3156 
+3 2886 2887 3158 
+3 3156 2886 3158 
+3 2887 2888 3160 
+3 3158 2887 3160 
+3 3160 2888 3184 
+3 2861 2862 2863 
+3 2864 2863 2862 
+3 2865 2863 2864 
+3 2866 2865 2864 
+3 2867 2865 2866 
+3 2868 2867 2866 
+3 2869 2867 2868 
+3 2870 2869 2868 
+3 2871 2869 2870 
+3 2889 2871 2870 
+3 2889 2891 2871 
+3 2891 2872 2871 
+3 2873 2872 2893 
+3 2893 2872 2891 
+3 2874 2873 2895 
+3 2895 2873 2893 
+3 2875 2874 2897 
+3 2897 2874 2895 
+3 2876 2875 2899 
+3 2899 2875 2897 
+3 2877 2876 2900 
+3 2900 2876 2899 
+3 2878 2877 2901 
+3 2901 2877 2900 
+3 2879 2878 2902 
+3 2902 2878 2901 
+3 2880 2879 2903 
+3 2903 2879 2902 
+3 2881 2880 2904 
+3 2904 2880 2903 
+3 2882 2881 2905 
+3 2905 2881 2904 
+3 2883 2882 2906 
+3 2906 2882 2905 
+3 2884 2883 2907 
+3 2907 2883 2906 
+3 2885 2884 2908 
+3 2908 2884 2907 
+3 2886 2885 2909 
+3 2909 2885 2908 
+3 2887 2886 2910 
+3 2910 2886 2909 
+3 2888 2887 2911 
+3 2911 2887 2910 
+3 3185 3184 2888 
+3 3185 2888 2912 
+3 2912 2888 2911 
+3 2912 2913 3187 
+3 3185 2912 3187 
+3 2913 2914 3189 
+3 3187 2913 3189 
+3 2914 2915 3191 
+3 3189 2914 3191 
+3 2915 2916 3193 
+3 3191 2915 3193 
+3 2916 2917 3195 
+3 3193 2916 3195 
+3 3195 2917 3215 
+3 2889 2890 2891 
+3 2892 2891 2890 
+3 2893 2891 2892 
+3 2894 2893 2892 
+3 2895 2893 2894 
+3 2896 2895 2894 
+3 2897 2895 2896 
+3 2898 2897 2896 
+3 2899 2897 2898 
+3 2918 2899 2898 
+3 2918 2920 2899 
+3 2920 2900 2899 
+3 2901 2900 2922 
+3 2922 2900 2920 
+3 2902 2901 2924 
+3 2924 2901 2922 
+3 2903 2902 2926 
+3 2926 2902 2924 
+3 2904 2903 2928 
+3 2928 2903 2926 
+3 2905 2904 2929 
+3 2929 2904 2928 
+3 2906 2905 2930 
+3 2930 2905 2929 
+3 2907 2906 2931 
+3 2931 2906 2930 
+3 2908 2907 2932 
+3 2932 2907 2931 
+3 2909 2908 2933 
+3 2933 2908 2932 
+3 2910 2909 2934 
+3 2934 2909 2933 
+3 2911 2910 2935 
+3 2935 2910 2934 
+3 2912 2911 2936 
+3 2936 2911 2935 
+3 2913 2912 2937 
+3 2937 2912 2936 
+3 2914 2913 2938 
+3 2938 2913 2937 
+3 2915 2914 2939 
+3 2939 2914 2938 
+3 2916 2915 2940 
+3 2940 2915 2939 
+3 2917 2916 2941 
+3 2941 2916 2940 
+3 3216 3215 2917 
+3 3216 2917 2942 
+3 2942 2917 2941 
+3 2942 2943 3218 
+3 3216 2942 3218 
+3 2943 2944 3220 
+3 3218 2943 3220 
+3 2944 2945 3222 
+3 3220 2944 3222 
+3 2945 2946 3224 
+3 3222 2945 3224 
+3 2946 2947 3226 
+3 3224 2946 3226 
+3 3226 2947 3240 
+3 2918 2919 2920 
+3 2921 2920 2919 
+3 2922 2920 2921 
+3 2923 2922 2921 
+3 2924 2922 2923 
+3 2925 2924 2923 
+3 2926 2924 2925 
+3 2927 2926 2925 
+3 2928 2926 2927 
+3 2948 2928 2927 
+3 2948 2950 2928 
+3 2950 2929 2928 
+3 2930 2929 2952 
+3 2952 2929 2950 
+3 2931 2930 2954 
+3 2954 2930 2952 
+3 2932 2931 2956 
+3 2956 2931 2954 
+3 2933 2932 2958 
+3 2958 2932 2956 
+3 2934 2933 2960 
+3 2960 2933 2958 
+3 2935 2934 2961 
+3 2961 2934 2960 
+3 2936 2935 2962 
+3 2962 2935 2961 
+3 2937 2936 2963 
+3 2963 2936 2962 
+3 2938 2937 2964 
+3 2964 2937 2963 
+3 2939 2938 2965 
+3 2965 2938 2964 
+3 2940 2939 2966 
+3 2966 2939 2965 
+3 2941 2940 2967 
+3 2967 2940 2966 
+3 2942 2941 2968 
+3 2968 2941 2967 
+3 2943 2942 2969 
+3 2969 2942 2968 
+3 2944 2943 2970 
+3 2970 2943 2969 
+3 2945 2944 2971 
+3 2971 2944 2970 
+3 2946 2945 2972 
+3 2972 2945 2971 
+3 2947 2946 2973 
+3 2973 2946 2972 
+3 3241 3240 2947 
+3 3241 2947 2974 
+3 2974 2947 2973 
+3 2974 2975 3243 
+3 3241 2974 3243 
+3 2975 2976 3245 
+3 3243 2975 3245 
+3 2976 2977 3247 
+3 3245 2976 3247 
+3 2977 2978 3249 
+3 3247 2977 3249 
+3 3249 2978 3258 
+3 2948 2949 2950 
+3 2951 2950 2949 
+3 2952 2950 2951 
+3 2953 2952 2951 
+3 2954 2952 2953 
+3 2955 2954 2953 
+3 2956 2954 2955 
+3 2957 2956 2955 
+3 2958 2956 2957 
+3 2959 2958 2957 
+3 2960 2958 2959 
+3 2979 2960 2959 
+3 2979 2981 2960 
+3 2981 2961 2960 
+3 2962 2961 2983 
+3 2983 2961 2981 
+3 2963 2962 2985 
+3 2985 2962 2983 
+3 2964 2963 2987 
+3 2987 2963 2985 
+3 2965 2964 2989 
+3 2989 2964 2987 
+3 2966 2965 2990 
+3 2990 2965 2989 
+3 2967 2966 2991 
+3 2991 2966 2990 
+3 2968 2967 2992 
+3 2992 2967 2991 
+3 2969 2968 2993 
+3 2993 2968 2992 
+3 2970 2969 2994 
+3 2994 2969 2993 
+3 2971 2970 2995 
+3 2995 2970 2994 
+3 2972 2971 2996 
+3 2996 2971 2995 
+3 2973 2972 2997 
+3 2997 2972 2996 
+3 2974 2973 2998 
+3 2998 2973 2997 
+3 2975 2974 2999 
+3 2999 2974 2998 
+3 2976 2975 3000 
+3 3000 2975 2999 
+3 2977 2976 3001 
+3 3001 2976 3000 
+3 2978 2977 3002 
+3 3002 2977 3001 
+3 3259 3258 2978 
+3 3259 2978 3003 
+3 3003 2978 3002 
+3 3003 3004 3261 
+3 3259 3003 3261 
+3 3004 3005 3263 
+3 3261 3004 3263 
+3 3005 3006 3265 
+3 3263 3005 3265 
+3 3006 3007 3267 
+3 3265 3006 3267 
+3 3007 3008 3269 
+3 3267 3007 3269 
+3 3269 3008 3272 
+3 2979 2980 2981 
+3 2982 2981 2980 
+3 2983 2981 2982 
+3 2984 2983 2982 
+3 2985 2983 2984 
+3 2986 2985 2984 
+3 2987 2985 2986 
+3 2988 2987 2986 
+3 2989 2987 2988 
+3 3009 2989 2988 
+3 3009 3011 2989 
+3 3011 2990 2989 
+3 2991 2990 3013 
+3 3013 2990 3011 
+3 2992 2991 3015 
+3 3015 2991 3013 
+3 2993 2992 3017 
+3 3017 2992 3015 
+3 2994 2993 3019 
+3 3019 2993 3017 
+3 2995 2994 3020 
+3 3020 2994 3019 
+3 2996 2995 3021 
+3 3021 2995 3020 
+3 2997 2996 3022 
+3 3022 2996 3021 
+3 2998 2997 3023 
+3 3023 2997 3022 
+3 2999 2998 3024 
+3 3024 2998 3023 
+3 3000 2999 3025 
+3 3025 2999 3024 
+3 3001 3000 3026 
+3 3026 3000 3025 
+3 3002 3001 3027 
+3 3027 3001 3026 
+3 3003 3002 3028 
+3 3028 3002 3027 
+3 3004 3003 3029 
+3 3029 3003 3028 
+3 3005 3004 3030 
+3 3030 3004 3029 
+3 3006 3005 3031 
+3 3031 3005 3030 
+3 3007 3006 3032 
+3 3032 3006 3031 
+3 3008 3007 3033 
+3 3033 3007 3032 
+3 3273 3272 3008 
+3 3273 3008 3034 
+3 3034 3008 3033 
+3 3009 3010 3011 
+3 3012 3011 3010 
+3 3013 3011 3012 
+3 3014 3013 3012 
+3 3015 3013 3014 
+3 3016 3015 3014 
+3 3017 3015 3016 
+3 3018 3017 3016 
+3 3019 3017 3018 
+3 3035 3019 3018 
+3 3035 3037 3019 
+3 3037 3020 3019 
+3 3021 3020 3039 
+3 3039 3020 3037 
+3 3022 3021 3041 
+3 3041 3021 3039 
+3 3023 3022 3043 
+3 3043 3022 3041 
+3 3024 3023 3045 
+3 3045 3023 3043 
+3 3025 3024 3046 
+3 3046 3024 3045 
+3 3026 3025 3047 
+3 3047 3025 3046 
+3 3027 3026 3048 
+3 3048 3026 3047 
+3 3028 3027 3049 
+3 3049 3027 3048 
+3 3029 3028 3050 
+3 3050 3028 3049 
+3 3030 3029 3051 
+3 3051 3029 3050 
+3 3031 3030 3052 
+3 3052 3030 3051 
+3 3032 3031 3053 
+3 3053 3031 3052 
+3 3033 3032 3054 
+3 3054 3032 3053 
+3 3034 3033 3055 
+3 3055 3033 3054 
+3 3035 3036 3037 
+3 3038 3037 3036 
+3 3039 3037 3038 
+3 3040 3039 3038 
+3 3041 3039 3040 
+3 3042 3041 3040 
+3 3043 3041 3042 
+3 3044 3043 3042 
+3 3045 3043 3044 
+3 3056 3045 3044 
+3 3056 3058 3045 
+3 3058 3046 3045 
+3 3047 3046 3060 
+3 3060 3046 3058 
+3 3048 3047 3062 
+3 3062 3047 3060 
+3 3049 3048 3064 
+3 3064 3048 3062 
+3 3050 3049 3066 
+3 3066 3049 3064 
+3 3051 3050 3067 
+3 3067 3050 3066 
+3 3052 3051 3068 
+3 3068 3051 3067 
+3 3053 3052 3069 
+3 3069 3052 3068 
+3 3054 3053 3070 
+3 3070 3053 3069 
+3 3055 3054 3071 
+3 3071 3054 3070 
+3 3056 3057 3058 
+3 3059 3058 3057 
+3 3060 3058 3059 
+3 3061 3060 3059 
+3 3062 3060 3061 
+3 3063 3062 3061 
+3 3064 3062 3063 
+3 3065 3064 3063 
+3 3066 3064 3065 
+3 3072 3066 3065 
+3 3072 3074 3066 
+3 3074 3067 3066 
+3 3068 3067 3076 
+3 3076 3067 3074 
+3 3069 3068 3078 
+3 3078 3068 3076 
+3 3070 3069 3080 
+3 3080 3069 3078 
+3 3071 3070 3082 
+3 3082 3070 3080 
+3 3072 3073 3074 
+3 3075 3074 3073 
+3 3076 3074 3075 
+3 3077 3076 3075 
+3 3078 3076 3077 
+3 3079 3078 3077 
+3 3080 3078 3079 
+3 3081 3080 3079 
+3 3082 3080 3081 
+3 3083 3084 3085 
+3 3086 3085 3084 
+3 3087 3085 3086 
+3 3088 3087 3086 
+3 3089 3087 3088 
+3 3090 3089 3088 
+3 3091 3089 3090 
+3 3092 3091 3090 
+3 3093 3091 3092 
+3 3094 3093 3092 
+3 3095 3093 3094 
+3 3116 3095 3094 
+3 3116 3118 3095 
+3 3118 3096 3095 
+3 3097 3096 3120 
+3 3120 3096 3118 
+3 3098 3097 3122 
+3 3122 3097 3120 
+3 3099 3098 3124 
+3 3124 3098 3122 
+3 3100 3099 3126 
+3 3126 3099 3124 
+3 3101 3100 3127 
+3 3127 3100 3126 
+3 3102 3101 3128 
+3 3128 3101 3127 
+3 3103 3102 3129 
+3 3129 3102 3128 
+3 3104 3103 3130 
+3 3130 3103 3129 
+3 3105 3104 3131 
+3 3131 3104 3130 
+3 3106 3105 3132 
+3 3132 3105 3131 
+3 3107 3106 3133 
+3 3133 3106 3132 
+3 3108 3107 3134 
+3 3134 3107 3133 
+3 3109 3108 3135 
+3 3135 3108 3134 
+3 3110 3109 3136 
+3 3136 3109 3135 
+3 3111 3110 3137 
+3 3137 3110 3136 
+3 3112 3111 3138 
+3 3138 3111 3137 
+3 3113 3112 3139 
+3 3139 3112 3138 
+3 3114 3113 3140 
+3 3140 3113 3139 
+3 3115 3114 3141 
+3 3141 3114 3140 
+3 3276 3275 3115 
+3 3276 3115 3142 
+3 3142 3115 3141 
+3 3142 3143 3278 
+3 3276 3142 3278 
+3 3143 3144 3280 
+3 3278 3143 3280 
+3 3144 3145 3282 
+3 3280 3144 3282 
+3 3145 3146 3284 
+3 3282 3145 3284 
+3 3146 3147 3286 
+3 3284 3146 3286 
+3 3147 3148 3288 
+3 3286 3147 3288 
+3 3288 3148 3298 
+3 3116 3117 3118 
+3 3119 3118 3117 
+3 3120 3118 3119 
+3 3121 3120 3119 
+3 3122 3120 3121 
+3 3123 3122 3121 
+3 3124 3122 3123 
+3 3125 3124 3123 
+3 3126 3124 3125 
+3 3149 3126 3125 
+3 3149 3151 3126 
+3 3151 3127 3126 
+3 3128 3127 3153 
+3 3153 3127 3151 
+3 3129 3128 3155 
+3 3155 3128 3153 
+3 3130 3129 3157 
+3 3157 3129 3155 
+3 3131 3130 3159 
+3 3159 3130 3157 
+3 3132 3131 3161 
+3 3161 3131 3159 
+3 3133 3132 3162 
+3 3162 3132 3161 
+3 3134 3133 3163 
+3 3163 3133 3162 
+3 3135 3134 3164 
+3 3164 3134 3163 
+3 3136 3135 3165 
+3 3165 3135 3164 
+3 3137 3136 3166 
+3 3166 3136 3165 
+3 3138 3137 3167 
+3 3167 3137 3166 
+3 3139 3138 3168 
+3 3168 3138 3167 
+3 3140 3139 3169 
+3 3169 3139 3168 
+3 3141 3140 3170 
+3 3170 3140 3169 
+3 3142 3141 3171 
+3 3171 3141 3170 
+3 3143 3142 3172 
+3 3172 3142 3171 
+3 3144 3143 3173 
+3 3173 3143 3172 
+3 3145 3144 3174 
+3 3174 3144 3173 
+3 3146 3145 3175 
+3 3175 3145 3174 
+3 3147 3146 3176 
+3 3176 3146 3175 
+3 3148 3147 3177 
+3 3177 3147 3176 
+3 3299 3298 3148 
+3 3299 3148 3178 
+3 3178 3148 3177 
+3 3178 3179 3301 
+3 3299 3178 3301 
+3 3179 3180 3303 
+3 3301 3179 3303 
+3 3180 3181 3305 
+3 3303 3180 3305 
+3 3181 3182 3307 
+3 3305 3181 3307 
+3 3182 3183 3309 
+3 3307 3182 3309 
+3 3309 3183 3313 
+3 3149 3150 3151 
+3 3152 3151 3150 
+3 3153 3151 3152 
+3 3154 3153 3152 
+3 3155 3153 3154 
+3 3156 3155 3154 
+3 3157 3155 3156 
+3 3158 3157 3156 
+3 3159 3157 3158 
+3 3160 3159 3158 
+3 3161 3159 3160 
+3 3184 3161 3160 
+3 3184 3186 3161 
+3 3186 3162 3161 
+3 3163 3162 3188 
+3 3188 3162 3186 
+3 3164 3163 3190 
+3 3190 3163 3188 
+3 3165 3164 3192 
+3 3192 3164 3190 
+3 3166 3165 3194 
+3 3194 3165 3192 
+3 3167 3166 3196 
+3 3196 3166 3194 
+3 3168 3167 3197 
+3 3197 3167 3196 
+3 3169 3168 3198 
+3 3198 3168 3197 
+3 3170 3169 3199 
+3 3199 3169 3198 
+3 3171 3170 3200 
+3 3200 3170 3199 
+3 3172 3171 3201 
+3 3201 3171 3200 
+3 3173 3172 3202 
+3 3202 3172 3201 
+3 3174 3173 3203 
+3 3203 3173 3202 
+3 3175 3174 3204 
+3 3204 3174 3203 
+3 3176 3175 3205 
+3 3205 3175 3204 
+3 3177 3176 3206 
+3 3206 3176 3205 
+3 3178 3177 3207 
+3 3207 3177 3206 
+3 3179 3178 3208 
+3 3208 3178 3207 
+3 3180 3179 3209 
+3 3209 3179 3208 
+3 3181 3180 3210 
+3 3210 3180 3209 
+3 3182 3181 3211 
+3 3211 3181 3210 
+3 3183 3182 3212 
+3 3212 3182 3211 
+3 3314 3313 3183 
+3 3314 3183 3213 
+3 3213 3183 3212 
+3 3213 3214 3316 
+3 3314 3213 3316 
+3 3184 3185 3186 
+3 3187 3186 3185 
+3 3188 3186 3187 
+3 3189 3188 3187 
+3 3190 3188 3189 
+3 3191 3190 3189 
+3 3192 3190 3191 
+3 3193 3192 3191 
+3 3194 3192 3193 
+3 3195 3194 3193 
+3 3196 3194 3195 
+3 3215 3196 3195 
+3 3215 3217 3196 
+3 3217 3197 3196 
+3 3198 3197 3219 
+3 3219 3197 3217 
+3 3199 3198 3221 
+3 3221 3198 3219 
+3 3200 3199 3223 
+3 3223 3199 3221 
+3 3201 3200 3225 
+3 3225 3200 3223 
+3 3202 3201 3227 
+3 3227 3201 3225 
+3 3203 3202 3228 
+3 3228 3202 3227 
+3 3204 3203 3229 
+3 3229 3203 3228 
+3 3205 3204 3230 
+3 3230 3204 3229 
+3 3206 3205 3231 
+3 3231 3205 3230 
+3 3207 3206 3232 
+3 3232 3206 3231 
+3 3208 3207 3233 
+3 3233 3207 3232 
+3 3209 3208 3234 
+3 3234 3208 3233 
+3 3210 3209 3235 
+3 3235 3209 3234 
+3 3211 3210 3236 
+3 3236 3210 3235 
+3 3212 3211 3237 
+3 3237 3211 3236 
+3 3213 3212 3238 
+3 3238 3212 3237 
+3 3214 3213 3239 
+3 3239 3213 3238 
+3 3215 3216 3217 
+3 3218 3217 3216 
+3 3219 3217 3218 
+3 3220 3219 3218 
+3 3221 3219 3220 
+3 3222 3221 3220 
+3 3223 3221 3222 
+3 3224 3223 3222 
+3 3225 3223 3224 
+3 3226 3225 3224 
+3 3227 3225 3226 
+3 3240 3227 3226 
+3 3240 3242 3227 
+3 3242 3228 3227 
+3 3229 3228 3244 
+3 3244 3228 3242 
+3 3230 3229 3246 
+3 3246 3229 3244 
+3 3231 3230 3248 
+3 3248 3230 3246 
+3 3232 3231 3250 
+3 3250 3231 3248 
+3 3233 3232 3251 
+3 3251 3232 3250 
+3 3234 3233 3252 
+3 3252 3233 3251 
+3 3235 3234 3253 
+3 3253 3234 3252 
+3 3236 3235 3254 
+3 3254 3235 3253 
+3 3237 3236 3255 
+3 3255 3236 3254 
+3 3238 3237 3256 
+3 3256 3237 3255 
+3 3239 3238 3257 
+3 3257 3238 3256 
+3 3240 3241 3242 
+3 3243 3242 3241 
+3 3244 3242 3243 
+3 3245 3244 3243 
+3 3246 3244 3245 
+3 3247 3246 3245 
+3 3248 3246 3247 
+3 3249 3248 3247 
+3 3250 3248 3249 
+3 3258 3250 3249 
+3 3258 3260 3250 
+3 3260 3251 3250 
+3 3252 3251 3262 
+3 3262 3251 3260 
+3 3253 3252 3264 
+3 3264 3252 3262 
+3 3254 3253 3266 
+3 3266 3253 3264 
+3 3255 3254 3268 
+3 3268 3254 3266 
+3 3256 3255 3270 
+3 3270 3255 3268 
+3 3257 3256 3271 
+3 3271 3256 3270 
+3 3258 3259 3260 
+3 3261 3260 3259 
+3 3262 3260 3261 
+3 3263 3262 3261 
+3 3264 3262 3263 
+3 3265 3264 3263 
+3 3266 3264 3265 
+3 3267 3266 3265 
+3 3268 3266 3267 
+3 3269 3268 3267 
+3 3270 3268 3269 
+3 3272 3270 3269 
+3 3272 3274 3270 
+3 3274 3271 3270 
+3 3272 3273 3274 
+3 3275 3276 3277 
+3 3278 3277 3276 
+3 3279 3277 3278 
+3 3280 3279 3278 
+3 3281 3279 3280 
+3 3282 3281 3280 
+3 3283 3281 3282 
+3 3284 3283 3282 
+3 3285 3283 3284 
+3 3286 3285 3284 
+3 3287 3285 3286 
+3 3288 3287 3286 
+3 3289 3287 3288 
+3 3298 3289 3288 
+3 3298 3300 3289 
+3 3300 3290 3289 
+3 3291 3290 3302 
+3 3302 3290 3300 
+3 3292 3291 3304 
+3 3304 3291 3302 
+3 3293 3292 3306 
+3 3306 3292 3304 
+3 3294 3293 3308 
+3 3308 3293 3306 
+3 3295 3294 3310 
+3 3310 3294 3308 
+3 3296 3295 3311 
+3 3311 3295 3310 
+3 3297 3296 3312 
+3 3312 3296 3311 
+3 3298 3299 3300 
+3 3301 3300 3299 
+3 3302 3300 3301 
+3 3303 3302 3301 
+3 3304 3302 3303 
+3 3305 3304 3303 
+3 3306 3304 3305 
+3 3307 3306 3305 
+3 3308 3306 3307 
+3 3309 3308 3307 
+3 3310 3308 3309 
+3 3313 3310 3309 
+3 3313 3315 3310 
+3 3315 3311 3310 
+3 3312 3311 3317 
+3 3317 3311 3315 
+3 3313 3314 3315 
+3 3316 3315 3314 
+3 3317 3315 3316 
+
+CELL_DATA 6406
+POINT_DATA 3318
+SCALARS scalars float
+LOOKUP_TABLE default
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 
+NORMALS Normals float
+0.172677 -0.356819 -0.918076 0.169776 -0.353641 -0.919844 0.18012 -0.360241 -0.915305 
+0.176383 -0.358525 -0.916705 0.173408 -0.35531 -0.918523 0.170511 -0.352158 -0.920278 
+0.167689 -0.349066 -0.921973 0.177072 -0.356988 -0.917172 0.174103 -0.3538 -0.918974 
+0.171211 -0.350672 -0.920715 0.168392 -0.347605 -0.922396 0.165645 -0.344595 -0.924021 
+0.160039 -0.347567 -0.923897 0.164312 -0.350917 -0.921878 0.161255 -0.347069 -0.923872 
+0.158291 -0.343319 -0.925784 0.170687 -0.3559 -0.918804 0.168663 -0.35432 -0.919788 
+0.169555 -0.35354 -0.919924 0.1655 -0.350382 -0.921869 0.162434 -0.346545 -0.923863 
+0.159458 -0.342804 -0.925774 0.156571 -0.339157 -0.927609 0.169411 -0.35324 -0.920066 
+0.168436 -0.351207 -0.921023 0.16665 -0.349821 -0.921875 0.167331 -0.348902 -0.922099 
+0.163574 -0.345995 -0.923867 0.160589 -0.342266 -0.925778 0.157693 -0.338629 -0.927612 
+0.154881 -0.335081 -0.929372 0.167097 -0.348416 -0.922326 0.166239 -0.346625 -0.923155 
+0.164677 -0.345421 -0.923886 0.16516 -0.344375 -0.924191 0.161684 -0.341703 -0.925795 
+0.158779 -0.338077 -0.927628 0.155958 -0.33454 -0.929387 0.153218 -0.331088 -0.931077 
+0.150556 -0.327718 -0.932702 0.164841 -0.34371 -0.924495 0.162743 -0.341118 -0.925826 
+0.15983 -0.337503 -0.927656 0.157002 -0.333976 -0.929414 0.154254 -0.330535 -0.931103 
+0.151584 -0.327176 -0.932726 0.148988 -0.323895 -0.934288 0.151944 -0.341201 -0.927629 
+0.149236 -0.337649 -0.929366 0.159348 -0.347025 -0.92422 0.155946 -0.344352 -0.925798 
+0.153145 -0.340719 -0.927608 0.150425 -0.337175 -0.929347 0.147783 -0.333715 -0.931018 
+0.145216 -0.330338 -0.932625 0.158978 -0.346219 -0.924585 0.158311 -0.344767 -0.925242 
+0.157122 -0.343836 -0.925791 0.157287 -0.342536 -0.926245 0.15431 -0.340212 -0.927601 
+0.151579 -0.336676 -0.92934 0.148926 -0.333225 -0.931011 0.146349 -0.329856 -0.932618 
+0.143843 -0.326566 -0.934165 0.156745 -0.341357 -0.926772 0.156274 -0.340331 -0.927229 
+0.155439 -0.339681 -0.927607 0.155274 -0.338152 -0.928193 0.152698 -0.336155 -0.929345 
+0.150036 -0.332713 -0.931016 0.147448 -0.329352 -0.932623 0.144932 -0.32607 -0.93417 
+0.142486 -0.322864 -0.935658 0.15457 -0.336618 -0.928868 0.154285 -0.335999 -0.92914 
+0.153783 -0.335611 -0.929363 0.153308 -0.333871 -0.930068 0.151112 -0.332179 -0.931033 
+0.148515 -0.328827 -0.932639 0.14599 -0.325554 -0.934185 0.143534 -0.322356 -0.935673 
+0.141145 -0.319231 -0.937107 0.13882 -0.316176 -0.938489 0.152449 -0.332 -0.930879 
+0.152342 -0.331767 -0.930979 0.152155 -0.331623 -0.931061 0.151387 -0.329688 -0.931873 
+0.149549 -0.328282 -0.932666 0.150444 -0.327633 -0.93275 0.147016 -0.325017 -0.934211 
+0.144552 -0.321828 -0.935698 0.142154 -0.318711 -0.937131 0.139821 -0.315665 -0.938513 
+0.13755 -0.312686 -0.939844 0.150381 -0.327497 -0.932808 0.149511 -0.325601 -0.933612 
+0.148012 -0.324461 -0.934247 0.148589 -0.323593 -0.934457 0.14554 -0.321282 -0.935733 
+0.143134 -0.318174 -0.937165 0.140793 -0.315136 -0.938545 0.138514 -0.312165 -0.939876 
+0.136294 -0.309259 -0.94116 0.148365 -0.323105 -0.934661 0.146498 -0.320717 -0.935777 
+0.144086 -0.317619 -0.937207 0.141737 -0.314589 -0.938586 0.139451 -0.311627 -0.939916 
+0.137224 -0.30873 -0.941199 0.135054 -0.305895 -0.942437 0.140579 -0.332218 -0.932667 
+0.138174 -0.328928 -0.934192 0.144271 -0.335143 -0.931056 0.141785 -0.33178 -0.932641 
+0.139368 -0.328496 -0.934167 0.137017 -0.325287 -0.935636 0.148529 -0.338507 -0.929167 
+0.148026 -0.33811 -0.929392 0.147581 -0.336347 -0.930102 0.145456 -0.334674 -0.93104 
+0.142958 -0.331319 -0.932626 0.140529 -0.328041 -0.934152 0.138166 -0.324838 -0.935623 
+0.135868 -0.321708 -0.93704 0.133631 -0.318647 -0.938406 0.146666 -0.334262 -0.930999 
+0.146644 -0.334212 -0.93102 0.146607 -0.334183 -0.931036 0.145718 -0.332102 -0.93192 
+0.144097 -0.330835 -0.932622 0.144803 -0.330017 -0.932803 0.141657 -0.327564 -0.934149 
+0.139284 -0.324368 -0.93562 0.136975 -0.321244 -0.937038 0.134727 -0.31819 -0.938405 
+0.132539 -0.315204 -0.939723 0.144571 -0.329487 -0.933026 0.143899 -0.327956 -0.933669 
+0.142754 -0.327066 -0.934157 0.143005 -0.325918 -0.93452 0.14037 -0.323878 -0.935628 
+0.138051 -0.320761 -0.937046 0.135793 -0.317714 -0.938413 0.133595 -0.314734 -0.939731 
+0.131454 -0.311818 -0.941004 0.129368 -0.308966 -0.942234 0.142531 -0.324838 -0.934968 
+0.142121 -0.323904 -0.935354 0.141426 -0.323367 -0.935645 0.141247 -0.321912 -0.936174 
+0.139097 -0.320258 -0.937063 0.13683 -0.317218 -0.93843 0.134622 -0.314245 -0.939748 
+0.132472 -0.311337 -0.941021 0.130377 -0.308491 -0.94225 0.128335 -0.305705 -0.943438 
+0.140543 -0.320308 -0.93683 0.140384 -0.319944 -0.936978 0.140113 -0.319737 -0.937089 
+0.13953 -0.317998 -0.937768 0.137837 -0.316705 -0.938456 0.138685 -0.316073 -0.938544 
+0.135621 -0.313739 -0.939774 0.133462 -0.310838 -0.941046 0.131358 -0.307999 -0.942275 
+0.129308 -0.30522 -0.943462 0.12731 -0.302499 -0.944609 0.138607 -0.315895 -0.938615 
+0.13785 -0.31417 -0.939305 0.136592 -0.313215 -0.939808 0.137025 -0.312289 -0.940053 
+0.134425 -0.310322 -0.941079 0.132313 -0.30749 -0.942307 0.130255 -0.304718 -0.943494 
+0.128248 -0.302004 -0.944641 0.126292 -0.299347 -0.945749 0.124383 -0.296744 -0.946822 
+0.13672 -0.311594 -0.940328 0.136208 -0.310428 -0.940788 0.135361 -0.30979 -0.941121 
+0.135401 -0.308588 -0.941509 0.133242 -0.306966 -0.942347 0.131176 -0.304201 -0.943533 
+0.129162 -0.301495 -0.944679 0.127198 -0.298844 -0.945787 0.125282 -0.296248 -0.946859 
+0.123412 -0.293704 -0.947896 0.13488 -0.307401 -0.941972 0.134603 -0.306769 -0.942218 
+0.134145 -0.306426 -0.942395 0.133813 -0.304969 -0.942915 0.132072 -0.303669 -0.943579 
+0.130051 -0.30097 -0.944724 0.12808 -0.298327 -0.945831 0.126157 -0.295738 -0.946902 
+0.12428 -0.2932 -0.947939 0.122449 -0.290714 -0.948942 0.120661 -0.288277 -0.949915 
+0.133086 -0.303313 -0.943552 0.132943 -0.303123 -0.943633 0.130915 -0.300432 -0.944776 
+0.128938 -0.297796 -0.945882 0.127008 -0.295214 -0.946952 0.125125 -0.292684 -0.947987 
+0.123287 -0.290205 -0.94899 0.121493 -0.287774 -0.949961 0.119741 -0.28539 -0.950902 
+0.130092 -0.323884 -0.93711 0.127954 -0.320827 -0.938455 0.13351 -0.326605 -0.935684 
+0.131299 -0.323483 -0.93708 0.129147 -0.320431 -0.938427 0.127052 -0.317445 -0.939727 
+0.1382 -0.330332 -0.933693 0.136982 -0.329365 -0.934213 0.137335 -0.328264 -0.934549 
+0.134698 -0.326177 -0.935663 0.132474 -0.323061 -0.937061 0.13031 -0.320013 -0.938409 
+0.128203 -0.317031 -0.93971 0.12615 -0.314114 -0.940967 0.124151 -0.31126 -0.94218 
+0.136854 -0.327115 -0.935022 0.13648 -0.326221 -0.935389 0.135854 -0.325727 -0.935652 
+0.135635 -0.324201 -0.936214 0.133619 -0.322616 -0.937051 0.131443 -0.319574 -0.9384 
+0.129324 -0.316598 -0.939703 0.12726 -0.313686 -0.94096 0.125248 -0.310836 -0.942175 
+0.123288 -0.308047 -0.943349 0.13484 -0.322301 -0.936984 0.1348 -0.322205 -0.937024 
+0.134732 -0.322152 -0.937052 0.133974 -0.320231 -0.937818 0.132545 -0.319115 -0.938401 
+0.133158 -0.318279 -0.938599 0.130415 -0.316145 -0.939704 0.12834 -0.313239 -0.940962 
+0.126318 -0.310394 -0.942178 0.124348 -0.30761 -0.943352 0.122427 -0.304883 -0.944488 
+0.120553 -0.302212 -0.945587 0.132881 -0.317618 -0.938862 0.13235 -0.31635 -0.939365 
+0.131478 -0.315673 -0.939715 0.131552 -0.314442 -0.940117 0.129393 -0.312773 -0.940973 
+0.127361 -0.309934 -0.942189 0.12538 -0.307155 -0.943364 0.123449 -0.304434 -0.9445 
+0.121566 -0.301769 -0.945599 0.119729 -0.299157 -0.946662 0.130974 -0.31306 -0.940659 
+0.130763 -0.312556 -0.940856 0.130417 -0.312289 -0.940992 0.129983 -0.31069 -0.941582 
+0.128376 -0.309457 -0.942208 0.129211 -0.308846 -0.942294 0.126386 -0.306684 -0.943383 
+0.124445 -0.303968 -0.944519 0.122553 -0.301309 -0.945618 0.120706 -0.298703 -0.946682 
+0.118905 -0.29615 -0.947712 0.117147 -0.293647 -0.948709 0.129117 -0.308622 -0.942381 
+0.128448 -0.307022 -0.942995 0.127365 -0.306196 -0.94341 0.127693 -0.305217 -0.943683 
+0.125416 -0.303487 -0.944546 0.123514 -0.300833 -0.945645 0.121659 -0.298233 -0.946708 
+0.119849 -0.295685 -0.947737 0.118083 -0.293188 -0.948735 0.116358 -0.29074 -0.949701 
+0.12731 -0.304301 -0.94403 0.126947 -0.303433 -0.944358 0.126361 -0.30299 -0.944579 
+0.126208 -0.301668 -0.945023 0.124451 -0.300342 -0.945678 0.122588 -0.297749 -0.946741 
+0.12077 -0.295207 -0.94777 0.118995 -0.292715 -0.948767 0.117262 -0.290273 -0.949732 
+0.11557 -0.287877 -0.950668 0.113917 -0.285528 -0.951576 0.125549 -0.300092 -0.945612 
+0.125478 -0.299923 -0.945675 0.125364 -0.299837 -0.945718 0.124756 -0.298196 -0.946317 
+0.123493 -0.29725 -0.94678 0.124041 -0.296488 -0.946947 0.121667 -0.294714 -0.947808 
+0.119885 -0.292229 -0.948804 0.118144 -0.289792 -0.94977 0.116445 -0.287402 -0.950705 
+0.114784 -0.285059 -0.951612 0.113162 -0.282759 -0.952492 0.123833 -0.295992 -0.947129 
+0.123334 -0.294799 -0.947567 0.122541 -0.294208 -0.947853 0.122635 -0.293127 -0.948176 
+0.120752 -0.291729 -0.948848 0.119004 -0.289299 -0.949813 0.117297 -0.286915 -0.950748 
+0.11563 -0.284577 -0.951654 0.114001 -0.282283 -0.952533 0.112408 -0.280033 -0.953387 
+0.110852 -0.277824 -0.954215 0.122161 -0.291996 -0.948586 0.121943 -0.291473 -0.948775 
+0.121596 -0.291217 -0.948898 0.121258 -0.289837 -0.949363 0.119842 -0.288793 -0.949861 
+0.120581 -0.288218 -0.949942 0.118129 -0.286416 -0.950795 0.116455 -0.284084 -0.951701 
+0.114819 -0.281796 -0.952579 0.11322 -0.279551 -0.953432 0.111657 -0.277347 -0.954259 
+0.110129 -0.275184 -0.955063 0.120532 -0.2881 -0.949984 0.119911 -0.286616 -0.950512 
+0.118939 -0.285904 -0.950848 0.119248 -0.285031 -0.951072 0.117259 -0.283579 -0.951753 
+0.115617 -0.281297 -0.95263 0.114012 -0.279058 -0.953482 0.112443 -0.276861 -0.954309 
+0.110908 -0.274703 -0.955111 0.109408 -0.272585 -0.955891 0.10794 -0.270505 -0.956648 
+0.118943 -0.284302 -0.951328 0.118043 -0.283063 -0.951809 0.116395 -0.280788 -0.952686 
+0.114784 -0.278555 -0.953536 0.113209 -0.276364 -0.954362 0.111669 -0.274212 -0.955164 
+0.110163 -0.2721 -0.955943 0.108689 -0.270025 -0.956699 0.107247 -0.267987 -0.957435 
+0.120381 -0.316127 -0.941048 0.118476 -0.313279 -0.942242 0.123553 -0.318665 -0.939781 
+0.121584 -0.315758 -0.941018 0.119666 -0.312912 -0.942213 0.117796 -0.310126 -0.943369 
+0.128335 -0.322484 -0.937835 0.126773 -0.321237 -0.938475 0.127548 -0.320505 -0.938621 
+0.124739 -0.318271 -0.939757 0.122758 -0.315368 -0.940996 0.120827 -0.312526 -0.942193 
+0.118945 -0.309743 -0.943351 0.117109 -0.307018 -0.944471 0.11532 -0.304348 -0.945555 
+0.127307 -0.3199 -0.938859 0.126769 -0.318548 -0.939392 0.125896 -0.317856 -0.939743 
+0.125999 -0.316614 -0.940149 0.123902 -0.314958 -0.940983 0.121959 -0.31212 -0.942182 
+0.120065 -0.309341 -0.943341 0.118218 -0.306619 -0.944462 0.116416 -0.303953 -0.945547 
+0.114659 -0.301341 -0.946598 0.112944 -0.298781 -0.947615 0.125374 -0.315043 -0.94076 
+0.125238 -0.314701 -0.940892 0.125018 -0.314528 -0.94098 0.124486 -0.31281 -0.941623 
+0.123063 -0.311695 -0.942179 0.123742 -0.31094 -0.94234 0.121157 -0.30892 -0.943339 
+0.119299 -0.306203 -0.944461 0.117486 -0.303541 -0.945547 0.115718 -0.300933 -0.946599 
+0.113992 -0.298376 -0.947617 0.112308 -0.29587 -0.948603 0.123495 -0.310322 -0.942576 
+0.123006 -0.309091 -0.943044 0.122223 -0.308482 -0.943345 0.122278 -0.307263 -0.943736 
+0.120354 -0.305769 -0.944468 0.118531 -0.303112 -0.945555 0.116752 -0.300508 -0.946607 
+0.115016 -0.297956 -0.947625 0.113321 -0.295453 -0.948612 0.111667 -0.293 -0.949569 
+0.110051 -0.290594 -0.950497 0.121669 -0.305731 -0.944312 0.121558 -0.305455 -0.944416 
+0.121383 -0.305319 -0.944482 0.120847 -0.303666 -0.945084 0.119549 -0.302666 -0.945569 
+0.120143 -0.301897 -0.94574 0.11776 -0.300067 -0.946622 0.116014 -0.297519 -0.947641 
+0.11431 -0.295022 -0.948628 0.112646 -0.292573 -0.949585 0.111021 -0.290171 -0.950513 
+0.109433 -0.287815 -0.951413 0.107882 -0.285503 -0.952286 0.119892 -0.301267 -0.945973 
+0.119447 -0.300148 -0.946385 0.118744 -0.29961 -0.946643 0.118758 -0.298417 -0.947018 
+0.116989 -0.297068 -0.947663 0.115276 -0.294575 -0.94865 0.113602 -0.292131 -0.949607 
+0.111968 -0.289733 -0.950535 0.110372 -0.287382 -0.951436 0.108812 -0.285074 -0.952309 
+0.107287 -0.28281 -0.953157 0.118164 -0.296924 -0.947562 0.118077 -0.296706 -0.947641 
+0.11794 -0.296602 -0.947691 0.117403 -0.295012 -0.948253 0.116217 -0.294114 -0.948678 
+0.116736 -0.293337 -0.948855 0.114536 -0.291675 -0.949635 0.112893 -0.289282 -0.950563 
+0.111288 -0.286935 -0.951464 0.109719 -0.284633 -0.952337 0.108186 -0.282373 -0.953185 
+0.106688 -0.280154 -0.954008 0.105223 -0.277976 -0.954808 0.116482 -0.292697 -0.949084 
+0.116077 -0.29168 -0.949447 0.115446 -0.291205 -0.949669 0.115424 -0.29004 -0.950029 
+0.113795 -0.288818 -0.950597 0.112182 -0.286476 -0.951497 0.110606 -0.284178 -0.95237 
+0.109065 -0.281923 -0.953218 0.107559 -0.279709 -0.954041 0.106086 -0.277536 -0.95484 
+0.104645 -0.275402 -0.955617 0.103236 -0.273305 -0.956371 0.114844 -0.288583 -0.950542 
+0.114778 -0.288417 -0.950601 0.114676 -0.288341 -0.950636 0.11414 -0.286812 -0.951163 
+0.113055 -0.286004 -0.951536 0.113507 -0.285224 -0.951716 0.111471 -0.283712 -0.952408 
+0.109923 -0.281462 -0.953256 0.108409 -0.279253 -0.954078 0.106929 -0.277084 -0.954877 
+0.105481 -0.274955 -0.955654 0.104065 -0.272863 -0.956408 0.102679 -0.270808 -0.957142 
+0.11325 -0.284577 -0.95194 0.112882 -0.283652 -0.95226 0.112316 -0.283233 -0.952452 
+0.112263 -0.282096 -0.952795 0.110761 -0.280989 -0.953298 0.10924 -0.278785 -0.95412 
+0.107753 -0.276621 -0.954919 0.106298 -0.274497 -0.955695 0.104875 -0.27241 -0.956449 
+0.103482 -0.27036 -0.957182 0.102119 -0.268345 -0.957895 0.100785 -0.266366 -0.958588 
+0.111697 -0.280675 -0.953281 0.11165 -0.280557 -0.953322 0.111578 -0.280504 -0.953346 
+0.111044 -0.279034 -0.953839 0.110051 -0.278306 -0.954167 0.110444 -0.277526 -0.954349 
+0.108557 -0.276148 -0.954965 0.107096 -0.274028 -0.95574 0.105666 -0.271946 -0.956494 
+0.104267 -0.269901 -0.957226 0.102897 -0.267892 -0.957939 0.101557 -0.265917 -0.958632 
+0.100244 -0.263976 -0.959306 0.0989589 -0.262067 -0.959962 0.110184 -0.276873 -0.954568 
+0.10985 -0.276033 -0.95485 0.109342 -0.275664 -0.955015 0.109262 -0.274556 -0.955343 
+0.107875 -0.27355 -0.95579 0.106439 -0.271473 -0.956542 0.105033 -0.269433 -0.957274 
+0.103658 -0.267428 -0.957986 0.102311 -0.265458 -0.958678 0.100993 -0.263522 -0.959352 
+0.0997016 -0.261618 -0.960008 0.0984368 -0.259747 -0.960647 0.10871 -0.273169 -0.955804 
+0.10868 -0.273094 -0.955829 0.108635 -0.273061 -0.955843 0.108104 -0.271646 -0.956306 
+0.107193 -0.27099 -0.956595 0.107534 -0.270214 -0.956776 0.105782 -0.268955 -0.957326 
+0.104401 -0.266956 -0.958037 0.103049 -0.264991 -0.958729 0.101725 -0.26306 -0.959402 
+0.100428 -0.261161 -0.960057 0.0991573 -0.259294 -0.960695 0.0979127 -0.257458 -0.961316 
+0.0966931 -0.255652 -0.961921 0.107273 -0.269557 -0.956991 0.106969 -0.268795 -0.957239 
+0.106514 -0.268469 -0.957381 0.106411 -0.267391 -0.957695 0.105127 -0.266475 -0.958092 
+0.103769 -0.264515 -0.958782 0.10244 -0.262589 -0.959455 0.101137 -0.260695 -0.960109 
+0.0998617 -0.258833 -0.960746 0.0986118 -0.257002 -0.961367 0.0973871 -0.2552 -0.961971 
+0.0961866 -0.253428 -0.96256 0.105871 -0.266036 -0.958132 0.105836 -0.265985 -0.95815 
+0.104473 -0.264031 -0.958839 0.103138 -0.26211 -0.959511 0.101831 -0.260221 -0.960164 
+0.10055 -0.258364 -0.960801 0.0992954 -0.256538 -0.96142 0.0980657 -0.254741 -0.962024 
+0.0968603 -0.252974 -0.962612 0.0956787 -0.251235 -0.963186 0.0945202 -0.249524 -0.963745 
+0.111356 -0.308885 -0.944558 0.109658 -0.306224 -0.945623 0.114307 -0.311257 -0.943426 
+0.112552 -0.308542 -0.944528 0.110841 -0.305883 -0.945595 0.109171 -0.303276 -0.946628 
+0.107541 -0.300721 -0.947629 0.118909 -0.314948 -0.941631 0.117302 -0.31366 -0.942262 
+0.118193 -0.313053 -0.942353 0.115489 -0.310892 -0.943403 0.113721 -0.30818 -0.944506 
+0.111996 -0.305523 -0.945575 0.110314 -0.302919 -0.94661 0.108671 -0.300366 -0.947613 
+0.107068 -0.297863 -0.948585 0.105503 -0.295409 -0.949528 0.118021 -0.312595 -0.942526 
+0.117486 -0.311179 -0.943062 0.116643 -0.310508 -0.943387 0.116786 -0.309325 -0.943758 
+0.114862 -0.307799 -0.944493 0.113125 -0.305145 -0.945563 0.11143 -0.302544 -0.946599 
+0.109776 -0.299994 -0.947604 0.108161 -0.297494 -0.948577 0.106584 -0.295042 -0.949521 
+0.105044 -0.292636 -0.950437 0.116169 -0.30769 -0.944368 0.116094 -0.307493 -0.944442 
+0.115977 -0.3074 -0.944486 0.11541 -0.30568 -0.945114 0.114228 -0.304749 -0.945558 
+0.114733 -0.303888 -0.945774 0.112521 -0.302152 -0.946596 0.110855 -0.299605 -0.947601 
+0.109229 -0.297107 -0.948576 0.10764 -0.294658 -0.949521 0.106089 -0.292256 -0.950438 
+0.104574 -0.289898 -0.951327 0.103093 -0.287585 -0.95219 0.114371 -0.302927 -0.946126 
+0.114064 -0.302115 -0.946423 0.113586 -0.301742 -0.946599 0.113402 -0.300362 -0.94706 
+0.111909 -0.299199 -0.947606 0.112747 -0.298628 -0.947686 0.110272 -0.296705 -0.948581 
+0.108673 -0.294259 -0.949527 0.107111 -0.29186 -0.950445 0.105585 -0.289506 -0.951335 
+0.104094 -0.287196 -0.952199 0.102637 -0.284928 -0.953038 0.101212 -0.282702 -0.953853 
+0.112624 -0.298302 -0.947804 0.1121 -0.296912 -0.948302 0.111291 -0.296287 -0.948593 
+0.111459 -0.295216 -0.948907 0.109682 -0.293845 -0.949539 0.10811 -0.291449 -0.950458 
+0.106574 -0.289099 -0.951348 0.105073 -0.286792 -0.952213 0.103606 -0.284528 -0.953053 
+0.102172 -0.282305 -0.953868 0.100769 -0.280123 -0.954661 0.0993975 -0.277979 -0.955431 
+0.110927 -0.293808 -0.949406 0.110825 -0.293537 -0.949502 0.110667 -0.293416 -0.949558 
+0.110198 -0.291876 -0.950087 0.109086 -0.291024 -0.950476 0.109578 -0.290233 -0.950662 
+0.10754 -0.288678 -0.951368 0.10603 -0.286375 -0.952233 0.104554 -0.284114 -0.953073 
+0.10311 -0.281895 -0.953889 0.101699 -0.279716 -0.954681 0.100318 -0.277576 -0.955452 
+0.0989674 -0.275474 -0.956201 0.0976458 -0.273408 -0.956929 0.109278 -0.28944 -0.950938 
+0.108964 -0.288608 -0.951227 0.108485 -0.288243 -0.951392 0.108357 -0.286999 -0.951783 
+0.106965 -0.285944 -0.952258 0.107756 -0.285408 -0.952329 0.10548 -0.283688 -0.953098 
+0.104028 -0.281473 -0.953914 0.102608 -0.279297 -0.954707 0.101218 -0.277161 -0.955477 
+0.0998593 -0.275062 -0.956226 0.0985294 -0.273 -0.956955 0.0972279 -0.270974 -0.957664 
+0.107675 -0.285194 -0.952403 0.107161 -0.283833 -0.952867 0.106385 -0.283249 -0.953128 
+0.106573 -0.282274 -0.953396 0.104925 -0.281037 -0.953944 0.103496 -0.278866 -0.954737 
+0.102099 -0.276734 -0.955507 0.100732 -0.274639 -0.956257 0.0993939 -0.272581 -0.956985 
+0.0980845 -0.270559 -0.957694 0.0968027 -0.268571 -0.958384 0.0955477 -0.266617 -0.959055 
+0.106116 -0.281064 -0.953804 0.105991 -0.280732 -0.953916 0.105801 -0.28059 -0.953979 
+0.105414 -0.279206 -0.954428 0.104365 -0.278424 -0.954771 0.104844 -0.277695 -0.954931 
+0.10296 -0.276295 -0.955542 0.101585 -0.274205 -0.956291 0.100239 -0.272151 -0.957019 
+0.0989225 -0.270132 -0.957728 0.0976332 -0.268148 -0.958418 0.0963709 -0.266198 -0.959089 
+0.0951346 -0.264281 -0.959742 0.0939238 -0.262395 -0.960379 0.104599 -0.277047 -0.955146 
+0.10428 -0.2762 -0.955426 0.103801 -0.275846 -0.955581 0.103721 -0.27472 -0.955914 
+0.102419 -0.27376 -0.956329 0.103168 -0.273255 -0.956393 0.101066 -0.27171 -0.957058 
+0.0997422 -0.269696 -0.957766 0.0984458 -0.267716 -0.958455 0.0971764 -0.26577 -0.959126 
+0.0959332 -0.263856 -0.95978 0.0947155 -0.261974 -0.960416 0.0935224 -0.260124 -0.961035 
+0.0923534 -0.258303 -0.961639 0.103123 -0.273137 -0.956432 0.10262 -0.271805 -0.956865 
+0.101875 -0.271259 -0.9571 0.102078 -0.27037 -0.95733 0.100544 -0.269249 -0.957808 
+0.0992406 -0.267274 -0.958497 0.0979645 -0.265332 -0.959167 0.0967146 -0.263422 -0.95982 
+0.0954903 -0.261545 -0.960456 0.0942907 -0.259698 -0.961076 0.0931153 -0.257881 -0.961679 
+0.0919633 -0.256094 -0.962267 0.0908341 -0.254335 -0.962841 0.101686 -0.269331 -0.957664 
+0.101542 -0.268949 -0.957787 0.101328 -0.268793 -0.957853 0.101011 -0.267542 -0.958237 
+0.100018 -0.266822 -0.958542 0.100485 -0.266149 -0.95868 0.0987354 -0.264884 -0.959212 
+0.0974792 -0.262979 -0.959864 0.0962485 -0.261106 -0.9605 0.0950427 -0.259263 -0.961119 
+0.0938611 -0.257451 -0.961722 0.092703 -0.255667 -0.96231 0.0915677 -0.253912 -0.962883 
+0.0904547 -0.252186 -0.963442 0.100287 -0.265626 -0.958846 0.0999642 -0.26477 -0.959116 
+0.0994893 -0.264428 -0.95926 0.0994487 -0.263405 -0.959546 0.098227 -0.262527 -0.959912 
+0.0989383 -0.262053 -0.959969 0.0969904 -0.260658 -0.960547 0.0957786 -0.25882 -0.961165 
+0.0945911 -0.257012 -0.961768 0.0934271 -0.255232 -0.962355 0.0922861 -0.253482 -0.962928 
+0.0911673 -0.251759 -0.963486 0.0900702 -0.250063 -0.964031 0.0889942 -0.248393 -0.964563 
+0.0989245 -0.262016 -0.95998 0.0984328 -0.260714 -0.960385 0.097716 -0.260203 -0.960597 
+0.0979323 -0.259388 -0.960795 0.0964986 -0.258369 -0.961215 0.0953055 -0.256565 -0.961817 
+0.0941359 -0.25479 -0.962404 0.0929893 -0.253043 -0.962976 0.0918651 -0.251324 -0.963534 
+0.0907626 -0.249633 -0.964078 0.0896812 -0.247967 -0.964609 0.0886204 -0.246327 -0.965127 
+0.0875797 -0.244712 -0.965632 0.0975968 -0.2585 -0.961069 0.0974366 -0.258075 -0.961199 
+0.0972029 -0.25791 -0.961267 0.0969457 -0.256775 -0.961597 0.0960044 -0.25611 -0.961868 
+0.0964595 -0.255487 -0.961988 0.0948295 -0.25434 -0.962454 0.0936776 -0.252598 -0.963026 
+0.0925482 -0.250883 -0.963583 0.0914404 -0.249195 -0.964127 0.0903539 -0.247534 -0.964657 
+0.0892881 -0.245898 -0.965175 0.0882423 -0.244287 -0.96568 0.0872161 -0.2427 -0.966173 
+0.0862089 -0.241137 -0.966655 0.0963029 -0.255072 -0.962114 0.095978 -0.254212 -0.962374 
+0.0955082 -0.253882 -0.962508 0.0955011 -0.252949 -0.962755 0.0943512 -0.252145 -0.963079 
+0.0932168 -0.250434 -0.963635 0.0921041 -0.248751 -0.964178 0.0910127 -0.247094 -0.964708 
+0.0899419 -0.245462 -0.965225 0.0888913 -0.243855 -0.965729 0.0878603 -0.242272 -0.966222 
+0.0868484 -0.240713 -0.966703 0.0858551 -0.239177 -0.967173 0.08488 -0.237664 -0.967632 
+0.0950415 -0.251731 -0.963119 0.0950287 -0.251698 -0.963129 0.0950104 -0.251685 -0.963134 
+0.0945608 -0.250458 -0.963498 0.0938711 -0.249979 -0.96369 0.0940973 -0.249231 -0.963862 
+0.0927537 -0.2483 -0.964232 0.0916576 -0.246647 -0.964761 0.0905822 -0.24502 -0.965277 
+0.0895269 -0.243417 -0.965781 0.0884914 -0.241838 -0.966273 0.0874749 -0.240283 -0.966753 
+0.0864771 -0.238751 -0.967223 0.0938114 -0.248473 -0.964085 0.0933894 -0.247843 -0.964288 
+0.0922888 -0.246194 -0.964817 0.091209 -0.244571 -0.965332 0.0901493 -0.242973 -0.965835 
+0.0891094 -0.241398 -0.966326 0.0880886 -0.239847 -0.966806 0.102942 -0.302104 -0.947701 
+0.101427 -0.299611 -0.948655 0.105694 -0.304325 -0.946686 0.104129 -0.301784 -0.947673 
+0.102601 -0.299292 -0.948629 0.101108 -0.296848 -0.949557 0.0996505 -0.29445 -0.950457 
+0.109897 -0.307711 -0.945112 0.108486 -0.306575 -0.945644 0.109248 -0.305895 -0.945777 
+0.106869 -0.303986 -0.946663 0.10529 -0.301446 -0.947652 0.103749 -0.298956 -0.94861 
+0.102244 -0.296513 -0.94954 0.100773 -0.294116 -0.950442 0.0993365 -0.291764 -0.951318 
+0.0979325 -0.289455 -0.952169 0.108991 -0.305174 -0.946039 0.108607 -0.304099 -0.946429 
+0.108017 -0.303628 -0.946648 0.107972 -0.302322 -0.947071 0.106426 -0.301091 -0.947638 
+0.107345 -0.300565 -0.947701 0.104872 -0.298602 -0.948598 0.103354 -0.296161 -0.94953 
+0.101872 -0.293766 -0.950433 0.100423 -0.291416 -0.951311 0.0990073 -0.289109 -0.952163 
+0.0976234 -0.286844 -0.95299 0.0962704 -0.28462 -0.953794 0.10722 -0.300216 -0.947826 
+0.106724 -0.298828 -0.948321 0.10597 -0.298232 -0.948593 0.10611 -0.297109 -0.948929 
+0.104441 -0.295793 -0.949525 0.102946 -0.2934 -0.950431 0.101486 -0.291052 -0.951309 
+0.100059 -0.288747 -0.952162 0.0986641 -0.286485 -0.952991 0.0973001 -0.284263 -0.953796 
+0.0959662 -0.282081 -0.954579 0.0946615 -0.279937 -0.95534 0.104902 -0.293727 -0.950116 
+0.103998 -0.293019 -0.950434 0.104308 -0.292063 -0.950694 0.102526 -0.290673 -0.951313 
+0.101088 -0.288371 -0.952168 0.0996826 -0.286111 -0.952997 0.098308 -0.283891 -0.953804 
+0.0969638 -0.281712 -0.954587 0.0956488 -0.27957 -0.955349 0.0943624 -0.277467 -0.95609 
+0.0931035 -0.2754 -0.956811 0.103837 -0.290744 -0.95115 0.10372 -0.290417 -0.951262 
+0.103544 -0.290279 -0.951324 0.103139 -0.288788 -0.951821 0.102095 -0.28798 -0.952179 
+0.102563 -0.287176 -0.952371 0.100679 -0.285723 -0.953009 0.0992945 -0.283506 -0.953816 
+0.0979402 -0.281329 -0.9546 0.0966154 -0.279191 -0.955363 0.0953193 -0.27709 -0.956104 
+0.0940509 -0.275025 -0.956826 0.0928095 -0.272996 -0.957528 0.0915941 -0.271001 -0.958211 
+0.102221 -0.286218 -0.952696 0.101994 -0.285582 -0.952911 0.101654 -0.285321 -0.953026 
+0.10143 -0.284004 -0.953443 0.10026 -0.283108 -0.953833 0.100873 -0.282443 -0.953966 
+0.0988958 -0.280934 -0.954618 0.0975616 -0.278798 -0.955381 0.0962562 -0.2767 -0.956123 
+0.0949786 -0.274638 -0.956845 0.0937281 -0.272612 -0.957548 0.0925038 -0.27062 -0.958232 
+0.0913051 -0.268662 -0.958897 0.0901312 -0.266736 -0.959546 0.100651 -0.281823 -0.954172 
+0.100321 -0.280898 -0.95448 0.0998309 -0.280525 -0.954641 0.0997746 -0.279369 -0.954986 
+0.0984876 -0.278393 -0.955404 0.0992342 -0.277856 -0.955483 0.0971732 -0.276298 -0.956147 
+0.0958868 -0.27424 -0.956869 0.0946276 -0.272216 -0.957572 0.0933948 -0.270227 -0.958256 
+0.0921876 -0.268272 -0.958922 0.0910053 -0.266349 -0.959571 0.0898472 -0.264458 -0.960203 
+0.0887127 -0.262598 -0.960819 0.0991268 -0.277555 -0.955582 0.0986993 -0.276358 -0.955973 
+0.0980707 -0.275885 -0.956175 0.0981699 -0.274876 -0.956455 0.0967758 -0.27383 -0.956897 
+0.0955082 -0.27181 -0.9576 0.0942672 -0.269824 -0.958284 0.0930519 -0.267872 -0.958951 
+0.0918616 -0.265952 -0.959599 0.0906956 -0.264064 -0.960232 0.0895532 -0.262207 -0.960847 
+0.0884337 -0.26038 -0.961448 0.0873366 -0.258582 -0.962033 0.0971271 -0.271956 -0.957396 
+0.0963702 -0.271392 -0.957632 0.0966136 -0.270518 -0.957855 0.0951213 -0.26941 -0.958316 
+0.0938981 -0.267461 -0.958983 0.0927001 -0.265545 -0.959632 0.0915265 -0.26366 -0.960264 
+0.0903766 -0.261806 -0.96088 0.0892498 -0.259982 -0.96148 0.0881454 -0.258187 -0.962065 
+0.0870627 -0.256421 -0.962636 0.0860013 -0.254683 -0.963193 0.0962065 -0.269378 -0.958217 
+0.0961053 -0.269095 -0.958307 0.0959573 -0.268985 -0.958352 0.095602 -0.267686 -0.958752 
+0.0947267 -0.26704 -0.959018 0.0951038 -0.266291 -0.95919 0.0935213 -0.265127 -0.959667 
+0.0923404 -0.263246 -0.960299 0.0911832 -0.261395 -0.960915 0.0900493 -0.259575 -0.961515 
+0.0889378 -0.257783 -0.962101 0.0878482 -0.25602 -0.962671 0.0867799 -0.254285 -0.963228 
+0.0857323 -0.252577 -0.963771 0.0847049 -0.250896 -0.964301 0.0948072 -0.26546 -0.959449 
+0.0946105 -0.264909 -0.959621 0.0943252 -0.2647 -0.959706 0.0941221 -0.263542 -0.960045 
+0.0931373 -0.262823 -0.960338 0.0936385 -0.262188 -0.960463 0.0919732 -0.260976 -0.960954 
+0.0908324 -0.259159 -0.961554 0.0897142 -0.257371 -0.962139 0.0886179 -0.255611 -0.96271 
+0.087543 -0.25388 -0.963266 0.0864889 -0.252175 -0.963809 0.085455 -0.250496 -0.964339 
+0.0844408 -0.248843 -0.964856 0.0834458 -0.247216 -0.965361 0.0934464 -0.26165 -0.960629 
+0.0931596 -0.260847 -0.960875 0.0927468 -0.260548 -0.960996 0.0926854 -0.259519 -0.96128 
+0.0915994 -0.258734 -0.961596 0.0922158 -0.258204 -0.961679 0.0904746 -0.25695 -0.96218 
+0.0893719 -0.255194 -0.962751 0.0882907 -0.253466 -0.963307 0.0872303 -0.251764 -0.963849 
+0.0861902 -0.250089 -0.964379 0.0851699 -0.24844 -0.964896 0.0841689 -0.246815 -0.9654 
+0.0831866 -0.245215 -0.965893 0.0822225 -0.243639 -0.966374 0.0921224 -0.257943 -0.961758 
+0.0917508 -0.256902 -0.962072 0.0912195 -0.256521 -0.962225 0.0912902 -0.255613 -0.96246 
+0.0901106 -0.254769 -0.962794 0.0890233 -0.253044 -0.96335 0.0879568 -0.251346 -0.963893 
+0.0869108 -0.249674 -0.964422 0.0858846 -0.248028 -0.964938 0.0848777 -0.246407 -0.965442 
+0.0838897 -0.244811 -0.965935 0.0829199 -0.243238 -0.966416 0.0819681 -0.241688 -0.966886 
+0.0810336 -0.240161 -0.967345 0.0903823 -0.25307 -0.963217 0.0897409 -0.252615 -0.963396 
+0.0899348 -0.251817 -0.963587 0.0886687 -0.250921 -0.963938 0.0876169 -0.249253 -0.964467 
+0.0865851 -0.24761 -0.964983 0.0855726 -0.245993 -0.965487 0.084579 -0.244399 -0.965979 
+0.0836038 -0.24283 -0.96646 0.0826465 -0.241284 -0.966929 0.0817066 -0.23976 -0.967388 
+0.0807838 -0.238258 -0.967836 0.0798776 -0.236778 -0.968275 0.0895798 -0.250824 -0.963879 
+0.0894915 -0.250576 -0.963952 0.089366 -0.250488 -0.963986 0.0890525 -0.249347 -0.964311 
+0.0883087 -0.248824 -0.964515 0.0886175 -0.248129 -0.964665 0.0872714 -0.247185 -0.96503 
+0.0862536 -0.245571 -0.965534 0.0852546 -0.243982 -0.966025 0.0842742 -0.242416 -0.966505 
+0.0833117 -0.240873 -0.966974 0.0823667 -0.239352 -0.967433 0.0814388 -0.237854 -0.967881 
+0.0805275 -0.236378 -0.968319 0.0796324 -0.234922 -0.968747 0.0787532 -0.233487 -0.969166 
+0.0883585 -0.247404 -0.964875 0.0881867 -0.246923 -0.965014 0.0879439 -0.246753 -0.96508 
+0.0877598 -0.245728 -0.965358 0.0869209 -0.245143 -0.965583 0.0873369 -0.244543 -0.965697 
+0.0859169 -0.243557 -0.966074 0.0849313 -0.241995 -0.966553 0.0839638 -0.240456 -0.967022 
+0.0830139 -0.238939 -0.96748 0.082081 -0.237444 -0.967927 0.0811649 -0.235971 -0.968365 
+0.0802651 -0.234519 -0.968792 0.0871689 -0.244073 -0.965831 0.086918 -0.24337 -0.966031 
+0.0865658 -0.243127 -0.966124 0.0865029 -0.242208 -0.96636 0.0855754 -0.241568 -0.966603 
+0.0860915 -0.241056 -0.966685 0.0846031 -0.240033 -0.967071 0.0836484 -0.23852 -0.967528 
+0.0827108 -0.237028 -0.967975 0.08179 -0.235559 -0.968412 0.0860097 -0.240827 -0.966749 
+0.085684 -0.239915 -0.967005 0.0852296 -0.239604 -0.967122 0.0852802 -0.238784 -0.967321 
+0.0842704 -0.238094 -0.967579 0.0833283 -0.236607 -0.968026 0.0950729 -0.295737 -0.950526 
+0.0937215 -0.293396 -0.951386 0.0924007 -0.291098 -0.952221 0.097646 -0.297822 -0.949614 
+0.0962493 -0.295438 -0.950501 0.0948844 -0.293097 -0.951363 0.0935503 -0.290799 -0.9522 
+0.092246 -0.288543 -0.953013 0.0909707 -0.286327 -0.953804 0.101276 -0.300758 -0.948308 
+0.100255 -0.299932 -0.948678 0.100689 -0.299017 -0.948921 0.0988114 -0.297504 -0.949593 
+0.0974013 -0.29512 -0.950482 0.0960234 -0.292781 -0.951346 0.0946764 -0.290484 -0.952185 
+0.0933596 -0.288228 -0.953 0.0920719 -0.286013 -0.953792 0.0908125 -0.283837 -0.954563 
+0.0895804 -0.281698 -0.955312 0.100214 -0.297606 -0.949414 0.100109 -0.297295 -0.949523 
+0.0999522 -0.297169 -0.949579 0.0995359 -0.295591 -0.950115 0.0985293 -0.294786 -0.95047 
+0.0989684 -0.293906 -0.950697 0.0971387 -0.292448 -0.951335 0.0957794 -0.290152 -0.952175 
+0.0944504 -0.287898 -0.952992 0.0931508 -0.285684 -0.953786 0.0918796 -0.283509 -0.954558 
+0.0906361 -0.281372 -0.955309 0.0894193 -0.279272 -0.956039 0.0882285 -0.277208 -0.956751 
+0.087063 -0.275179 -0.957443 0.0985257 -0.292591 -0.951148 0.0984071 -0.292239 -0.951269 
+0.0982308 -0.292099 -0.95133 0.0978518 -0.29059 -0.951831 0.0968596 -0.289805 -0.952172 
+0.0973024 -0.288959 -0.952384 0.0955188 -0.287553 -0.95299 0.0942077 -0.28534 -0.953785 
+0.0929252 -0.283166 -0.954558 0.0916705 -0.281031 -0.955311 0.0904427 -0.278932 -0.956042 
+0.0892412 -0.27687 -0.956754 0.088065 -0.274842 -0.957448 0.0869135 -0.272849 -0.958123 
+0.085786 -0.270889 -0.958781 0.09689 -0.287734 -0.952797 0.0967588 -0.287344 -0.952928 
+0.0965651 -0.287192 -0.952993 0.096221 -0.285747 -0.953462 0.0952428 -0.284982 -0.953789 
+0.0956888 -0.284167 -0.953988 0.0939493 -0.28281 -0.954564 0.0926839 -0.280676 -0.955317 
+0.0914456 -0.27858 -0.95605 0.0902336 -0.276519 -0.956763 0.0890472 -0.274493 -0.957457 
+0.0878857 -0.272502 -0.958133 0.0867482 -0.270543 -0.958792 0.0856342 -0.268617 -0.959433 
+0.0845429 -0.266722 -0.960058 0.0953052 -0.283028 -0.954365 0.0951621 -0.282603 -0.954505 
+0.0949524 -0.28244 -0.954574 0.094641 -0.281055 -0.955014 0.0936766 -0.280308 -0.955328 
+0.0941253 -0.279523 -0.955514 0.0924281 -0.278214 -0.956062 0.0912061 -0.276155 -0.956776 
+0.0900098 -0.274132 -0.957471 0.0888385 -0.272142 -0.958147 0.0876915 -0.270186 -0.958807 
+0.086568 -0.268261 -0.959449 0.0854675 -0.266369 -0.960075 0.0843892 -0.264507 -0.960685 
+0.0833325 -0.262674 -0.961279 0.093769 -0.278465 -0.955858 0.0936149 -0.278008 -0.956006 
+0.0933905 -0.277835 -0.956078 0.0931097 -0.276508 -0.956491 0.0921588 -0.275779 -0.956793 
+0.0926097 -0.275023 -0.956967 0.090953 -0.273758 -0.957488 0.0897724 -0.271771 -0.958166 
+0.0886161 -0.269816 -0.958825 0.0874835 -0.267894 -0.959468 0.086374 -0.266004 -0.960095 
+0.0852868 -0.264144 -0.960705 0.0842215 -0.262314 -0.9613 0.0831772 -0.260513 -0.961881 
+0.0821536 -0.25874 -0.962447 0.0922792 -0.274041 -0.95728 0.0921148 -0.273553 -0.957436 
+0.0918771 -0.273372 -0.95751 0.091625 -0.272098 -0.957897 0.0906873 -0.271388 -0.958188 
+0.0911401 -0.270658 -0.958351 0.0895222 -0.269436 -0.958848 0.0883808 -0.267516 -0.959491 
+0.0872626 -0.265628 -0.960118 0.086167 -0.263771 -0.960729 0.0850932 -0.261943 -0.961325 
+0.0840407 -0.260145 -0.961905 0.0830089 -0.258374 -0.962472 0.0819973 -0.256632 -0.963025 
+0.0810052 -0.254916 -0.963564 0.090834 -0.26975 -0.958637 0.09066 -0.269233 -0.958798 
+0.09041 -0.269045 -0.958875 0.0901848 -0.267822 -0.959238 0.0892602 -0.267128 -0.959518 
+0.0897143 -0.266424 -0.959671 0.0881337 -0.265243 -0.960145 0.0870298 -0.263388 -0.960756 
+0.0859479 -0.261563 -0.961352 0.0848874 -0.259766 -0.961933 0.0838477 -0.257999 -0.9625 
+0.0828283 -0.256258 -0.963053 0.0818286 -0.254545 -0.963593 0.0808481 -0.252858 -0.964119 
+0.0798862 -0.251197 -0.964634 0.0789425 -0.24956 -0.965136 0.0894315 -0.265584 -0.959931 
+0.0892485 -0.265041 -0.960098 0.0889873 -0.264847 -0.960176 0.0887873 -0.263672 -0.960518 
+0.0878755 -0.262994 -0.960787 0.0883307 -0.262315 -0.960931 0.0867858 -0.261172 -0.961383 
+0.0857176 -0.259379 -0.961964 0.0846703 -0.257614 -0.962531 0.0836434 -0.255876 -0.963084 
+0.0826363 -0.254165 -0.963624 0.0816485 -0.252481 -0.964151 0.0806794 -0.250822 -0.964665 
+0.0797286 -0.249188 -0.965168 0.0787956 -0.247579 -0.965658 0.07788 -0.245993 -0.966138 
+0.0880698 -0.261541 -0.961166 0.0878785 -0.260973 -0.961338 0.087607 -0.260772 -0.961417 
+0.0874308 -0.259643 -0.961739 0.0865314 -0.258982 -0.961998 0.0869874 -0.258326 -0.962133 
+0.0854768 -0.25722 -0.962565 0.0844426 -0.255485 -0.963118 0.0834284 -0.253777 -0.963658 
+0.0824335 -0.252096 -0.964185 0.0814575 -0.250439 -0.964699 0.0804999 -0.248808 -0.965202 
+0.0795602 -0.247201 -0.965692 0.0786379 -0.245618 -0.966172 0.0777325 -0.244058 -0.96664 
+0.0768437 -0.242521 -0.967098 0.0867474 -0.257613 -0.962346 0.0865483 -0.257022 -0.962522 
+0.0862674 -0.256817 -0.962602 0.0861135 -0.255731 -0.962905 0.0852263 -0.255086 -0.963155 
+0.0856828 -0.254452 -0.963282 0.0842051 -0.253381 -0.963695 0.0832035 -0.251702 -0.964222 
+0.0822208 -0.250049 -0.964736 0.0812565 -0.24842 -0.965238 0.0803103 -0.246816 -0.965729 
+0.0793815 -0.245236 -0.966208 0.0784698 -0.243679 -0.966676 0.0775748 -0.242144 -0.967134 
+0.0766959 -0.240632 -0.967582 0.0758329 -0.239141 -0.968019 0.0854625 -0.253798 -0.963474 
+0.0852562 -0.253185 -0.963654 0.0849667 -0.252976 -0.963734 0.0848337 -0.251931 -0.96402 
+0.0839585 -0.2513 -0.964261 0.0844153 -0.250688 -0.964381 0.0829693 -0.24965 -0.964775 
+0.0819987 -0.248025 -0.965277 0.0810461 -0.246424 -0.965768 0.0801111 -0.244846 -0.966247 
+0.0791933 -0.243292 -0.966715 0.0782922 -0.24176 -0.967172 0.0774073 -0.24025 -0.96762 
+0.0765384 -0.238762 -0.968057 0.0756849 -0.237295 -0.968485 0.0748465 -0.235849 -0.968903 
+0.0842138 -0.250089 -0.964553 0.0840007 -0.249457 -0.964736 0.0837034 -0.249244 -0.964817 
+0.0835901 -0.248237 -0.965086 0.0827266 -0.247622 -0.965318 0.0831833 -0.247029 -0.965431 
+0.0817679 -0.246024 -0.965809 0.0808269 -0.244449 -0.966287 0.0799032 -0.242898 -0.966755 
+0.0789962 -0.241369 -0.967213 0.0781055 -0.239862 -0.96766 0.0772309 -0.238377 -0.968097 
+0.0763717 -0.236913 -0.968524 0.0755278 -0.235469 -0.968943 0.0746986 -0.234046 -0.969352 
+0.0738839 -0.232642 -0.969752 0.0829997 -0.246484 -0.965586 0.0827804 -0.245833 -0.965771 
+0.0824758 -0.245617 -0.965852 0.0823812 -0.244647 -0.966106 0.0815291 -0.244046 -0.966331 
+0.0819856 -0.243472 -0.966437 0.0805996 -0.242498 -0.966798 0.0796869 -0.240972 -0.967255 
+0.0787907 -0.239468 -0.967702 0.0779105 -0.237986 -0.968139 0.0770459 -0.236525 -0.968566 
+0.0761966 -0.235084 -0.968984 0.0753621 -0.233663 -0.969393 0.0745421 -0.232262 -0.969793 
+0.0737363 -0.23088 -0.970184 0.0729443 -0.229517 -0.970567 0.0818189 -0.242977 -0.966575 
+0.0815937 -0.242309 -0.966762 0.0812827 -0.242091 -0.966843 0.0812054 -0.241156 -0.967083 
+0.0803646 -0.240568 -0.9673 0.0808207 -0.240013 -0.967399 0.079463 -0.239068 -0.967746 
+0.0785774 -0.237588 -0.968183 0.0777076 -0.23613 -0.968609 0.076853 -0.234692 -0.969027 
+0.0760134 -0.233275 -0.969435 0.0751883 -0.231876 -0.969835 0.0743775 -0.230497 -0.970226 
+0.0806701 -0.239566 -0.967523 0.0804395 -0.238881 -0.967711 0.0801225 -0.238661 -0.967792 
+0.0800617 -0.237759 -0.968019 0.0792318 -0.237185 -0.968228 0.0796874 -0.236647 -0.968322 
+0.0783569 -0.23573 -0.968655 0.0774973 -0.234295 -0.969072 0.0766527 -0.232881 -0.96948 
+0.0758227 -0.231485 -0.969879 0.0795521 -0.236246 -0.968431 0.0793164 -0.235546 -0.968621 
+0.078994 -0.235324 -0.968701 0.0789487 -0.234454 -0.968916 0.0781296 -0.233893 -0.969118 
+0.0785844 -0.233372 -0.969207 0.0772802 -0.232481 -0.969526 0.0853141 -0.287808 -0.95388 
+0.0876935 -0.289745 -0.953078 0.0864878 -0.287542 -0.953855 0.0853085 -0.285377 -0.954611 
+0.0841547 -0.28325 -0.955347 0.0901041 -0.291705 -0.952255 0.0888578 -0.289462 -0.953056 
+0.0876388 -0.287259 -0.953835 0.0864464 -0.285094 -0.954593 0.0852797 -0.282967 -0.955331 
+0.084138 -0.280876 -0.956049 0.0830205 -0.27882 -0.956748 0.0819266 -0.276798 -0.957429 
+0.0930239 -0.294076 -0.951244 0.0925466 -0.293688 -0.951411 0.0924957 -0.292406 -0.951811 
+0.0912587 -0.291405 -0.952237 0.0919731 -0.290754 -0.952367 0.0899992 -0.289163 -0.95304 
+0.0887673 -0.28696 -0.953821 0.0875622 -0.284796 -0.954581 0.0863831 -0.282669 -0.95532 
+0.0852291 -0.280578 -0.95604 0.0840997 -0.278522 -0.956741 0.0829939 -0.276501 -0.957423 
+0.0819112 -0.274514 -0.958088 0.080851 -0.272559 -0.958736 0.091689 -0.289855 -0.952668 
+0.0914562 -0.28912 -0.952914 0.0911179 -0.288848 -0.953029 0.0909447 -0.287503 -0.953452 
+0.0898735 -0.286646 -0.953812 0.0904386 -0.285903 -0.953981 0.0886562 -0.284482 -0.954573 
+0.087465 -0.282356 -0.955314 0.0862992 -0.280265 -0.956035 0.0851581 -0.278211 -0.956738 
+0.0840409 -0.27619 -0.957422 0.082947 -0.274204 -0.958088 0.0818757 -0.272249 -0.958737 
+0.0808263 -0.270327 -0.95937 0.0797983 -0.268436 -0.959987 0.0900827 -0.284778 -0.954352 
+0.0899379 -0.28432 -0.954502 0.0897286 -0.284154 -0.954571 0.0894423 -0.282753 -0.955013 
+0.0885257 -0.282028 -0.955313 0.088952 -0.281203 -0.955517 0.0873485 -0.279939 -0.956036 
+0.0861961 -0.277885 -0.956739 0.0850679 -0.275866 -0.957424 0.0839631 -0.27388 -0.958092 
+0.0828811 -0.271927 -0.958742 0.0818212 -0.270006 -0.959376 0.0807827 -0.268116 -0.959994 
+0.0797652 -0.266256 -0.960596 0.078768 -0.264425 -0.961184 0.0777906 -0.262623 -0.961758 
+0.0885291 -0.279866 -0.955948 0.0884668 -0.279669 -0.956012 0.0883772 -0.279599 -0.956041 
+0.0879866 -0.278151 -0.956499 0.0872139 -0.277546 -0.956745 0.0875113 -0.276649 -0.956978 
+0.086075 -0.275528 -0.957432 0.0870409 -0.275162 -0.95745 0.0849597 -0.273544 -0.9581 
+0.0838673 -0.271592 -0.958751 0.0827972 -0.269672 -0.959386 0.0817487 -0.267783 -0.960005 
+0.0807214 -0.265925 -0.960608 0.0797145 -0.264095 -0.961197 0.0787275 -0.262295 -0.961771 
+0.0777599 -0.260523 -0.962331 0.0768111 -0.258778 -0.962878 0.0870258 -0.275114 -0.957465 
+0.0865753 -0.27369 -0.957914 0.0859369 -0.273195 -0.958112 0.0861144 -0.272233 -0.95837 
+0.0848345 -0.271245 -0.958764 0.0856582 -0.270791 -0.95882 0.0837546 -0.269327 -0.9594 
+0.0826965 -0.26744 -0.960019 0.0816595 -0.265582 -0.960624 0.0806432 -0.263755 -0.961213 
+0.079647 -0.261956 -0.961788 0.0786703 -0.260185 -0.962349 0.0777126 -0.258441 -0.962896 
+0.0767733 -0.256724 -0.963431 0.075852 -0.255034 -0.963952 0.0855705 -0.270513 -0.958906 
+0.0852066 -0.269363 -0.959262 0.0846936 -0.26897 -0.959418 0.0847596 -0.26795 -0.959697 
+0.0836261 -0.267084 -0.960038 0.084317 -0.26655 -0.960126 0.0825799 -0.265229 -0.960643 
+0.0815545 -0.263403 -0.961232 0.0805493 -0.261606 -0.961808 0.0795638 -0.259837 -0.962369 
+0.0785974 -0.258095 -0.962917 0.0776496 -0.25638 -0.963452 0.0767199 -0.254691 -0.963974 
+0.0758078 -0.253027 -0.964485 0.0749129 -0.251388 -0.964983 0.0740348 -0.249773 -0.96547 
+0.084161 -0.266057 -0.960276 0.0838788 -0.265165 -0.960548 0.0834827 -0.264865 -0.960665 
+0.083445 -0.263794 -0.960963 0.0824485 -0.263041 -0.961255 0.0830154 -0.262436 -0.961372 
+0.0814347 -0.261246 -0.961831 0.0804406 -0.259479 -0.962393 0.0794658 -0.257739 -0.962941 
+0.0785097 -0.256026 -0.963477 0.0775718 -0.254338 -0.963999 0.0766518 -0.252676 -0.96451 
+0.075749 -0.251039 -0.965008 0.074863 -0.249426 -0.965496 0.0739935 -0.247837 -0.965972 
+0.0731399 -0.246271 -0.966437 0.0827953 -0.26174 -0.961581 0.0825901 -0.261091 -0.961775 
+0.0823032 -0.260876 -0.961857 0.0821689 -0.25976 -0.962171 0.0813009 -0.259111 -0.96242 
+0.0817518 -0.258441 -0.962562 0.0803179 -0.257373 -0.962968 0.0793538 -0.255662 -0.963504 
+0.0784081 -0.253977 -0.964027 0.0774802 -0.252317 -0.964538 0.0765697 -0.250682 -0.965037 
+0.0756762 -0.249071 -0.965524 0.0747992 -0.247484 -0.966 0.0739383 -0.245919 -0.966466 
+0.0730931 -0.244378 -0.966921 0.0722632 -0.242858 -0.967367 0.0714482 -0.24136 -0.967802 
+0.0814716 -0.257555 -0.962823 0.0813388 -0.257135 -0.962946 0.081154 -0.256998 -0.962998 
+0.0809297 -0.255842 -0.963325 0.0801822 -0.25529 -0.963534 0.0805246 -0.254562 -0.963698 
+0.0792288 -0.253607 -0.964057 0.0782934 -0.251949 -0.964568 0.0773755 -0.250316 -0.965067 
+0.0764747 -0.248707 -0.965555 0.0755904 -0.247122 -0.966031 0.0747224 -0.24556 -0.966497 
+0.0738702 -0.244021 -0.966953 0.0730334 -0.242503 -0.967398 0.0722115 -0.241007 -0.967833 
+0.0714043 -0.239532 -0.968259 0.0706114 -0.238078 -0.968676 0.0801879 -0.253497 -0.964007 
+0.0801234 -0.253293 -0.964066 0.0800341 -0.253228 -0.96409 0.079726 -0.252037 -0.964428 
+0.0790914 -0.251573 -0.964601 0.0793324 -0.250793 -0.964785 0.0781664 -0.249942 -0.9651 
+0.0772584 -0.248336 -0.965588 0.0763672 -0.246753 -0.966065 0.0754923 -0.245193 -0.966531 
+0.0746333 -0.243656 -0.966986 0.0737897 -0.242141 -0.967431 0.0729613 -0.240647 -0.967867 
+0.0721476 -0.239174 -0.968293 0.0713482 -0.237722 -0.968709 0.0705629 -0.236289 -0.969117 
+0.0697912 -0.234877 -0.969516 0.0785563 -0.248339 -0.965483 0.0780277 -0.247956 -0.965624 
+0.0781737 -0.24713 -0.965824 0.0771298 -0.246376 -0.9661 0.0777947 -0.245932 -0.96616 
+0.0762482 -0.244819 -0.966566 0.0753826 -0.243284 -0.967021 0.0745325 -0.241771 -0.967467 
+0.0736977 -0.240279 -0.967902 0.0728776 -0.238809 -0.968328 0.0720721 -0.237359 -0.968745 
+0.0712806 -0.235929 -0.969153 0.0705028 -0.234518 -0.969552 0.0697385 -0.233127 -0.969942 
+0.0689873 -0.231755 -0.970325 0.0682489 -0.230401 -0.970699 0.0777339 -0.245739 -0.966214 
+0.0774192 -0.244745 -0.966492 0.0769902 -0.244437 -0.966604 0.0770472 -0.243569 -0.966819 
+0.0761182 -0.242905 -0.967059 0.0766787 -0.242404 -0.967141 0.0752619 -0.241394 -0.967504 
+0.0744208 -0.239905 -0.96794 0.0735947 -0.238437 -0.968365 0.072783 -0.23699 -0.968782 
+0.0719856 -0.235562 -0.96919 0.0712019 -0.234154 -0.969589 0.0704318 -0.232765 -0.969979 
+0.0696748 -0.231395 -0.970362 0.0689307 -0.230043 -0.970736 0.0681992 -0.22871 -0.971103 
+0.06748 -0.227393 -0.971462 0.0765605 -0.24203 -0.967243 0.0763135 -0.241249 -0.967458 
+0.075978 -0.241011 -0.967544 0.0759517 -0.240105 -0.967771 0.0751309 -0.239525 -0.967979 
+0.0755931 -0.238972 -0.96808 0.0742988 -0.238059 -0.968405 0.0734813 -0.236614 -0.968821 
+0.0726781 -0.235189 -0.969229 0.0718887 -0.233783 -0.969627 0.071113 -0.232397 -0.970018 
+0.0703504 -0.231029 -0.9704 0.0696009 -0.22968 -0.970774 0.0688639 -0.228349 -0.971141 
+0.0681393 -0.227035 -0.9715 0.0674267 -0.225738 -0.971852 0.0754208 -0.238427 -0.968227 
+0.0752378 -0.237849 -0.968384 0.0749902 -0.237675 -0.968446 0.0748858 -0.236736 -0.968684 
+0.0741671 -0.236232 -0.968862 0.0745369 -0.235633 -0.96898 0.0733582 -0.23481 -0.969269 
+0.0725634 -0.233407 -0.969668 0.0717821 -0.232023 -0.970058 0.0710142 -0.230658 -0.97044 
+0.0702593 -0.229311 -0.970814 0.0695171 -0.227982 -0.97118 0.0687873 -0.226671 -0.971539 
+0.0743135 -0.234926 -0.969168 0.0741911 -0.23454 -0.969271 0.0740262 -0.234425 -0.969312 
+0.0738485 -0.233456 -0.969559 0.0732259 -0.233025 -0.96971 0.0735089 -0.232383 -0.969843 
+0.0724394 -0.231644 -0.9701 0.0716663 -0.230281 -0.970482 0.0709062 -0.228937 -0.970855 
+0.0701589 -0.22761 -0.971222 0.0732372 -0.231524 -0.970069 0.0731722 -0.231319 -0.970122 
+0.073085 -0.231259 -0.970143 0.0728386 -0.230264 -0.970398 0.0723068 -0.229899 -0.970525 
+0.0725079 -0.229219 -0.970671 0.0715417 -0.228557 -0.970898 0.0785201 -0.282266 -0.956117 
+0.077481 -0.280224 -0.956803 0.0807547 -0.284091 -0.955391 0.0796797 -0.282013 -0.956096 
+0.0786274 -0.27997 -0.956783 0.077597 -0.277961 -0.957453 0.076588 -0.275984 -0.958106 
+0.0755997 -0.27404 -0.958742 0.0851213 -0.287651 -0.953945 0.0830177 -0.285937 -0.954646 
+0.081906 -0.283823 -0.955372 0.080818 -0.281745 -0.95608 0.0797528 -0.279701 -0.956769 
+0.0787098 -0.277691 -0.95744 0.0776883 -0.275714 -0.958095 0.0766878 -0.273769 -0.958733 
+0.0757077 -0.271856 -0.959355 0.0747474 -0.269972 -0.959962 0.0849899 -0.287207 -0.95409 
+0.0846471 -0.286049 -0.954469 0.0841603 -0.285654 -0.95463 0.0841779 -0.284463 -0.954984 
+0.0830358 -0.28354 -0.955359 0.0837137 -0.282895 -0.955491 0.081935 -0.281461 -0.956068 
+0.0808573 -0.279417 -0.956759 0.079802 -0.277407 -0.957432 0.0787686 -0.27543 -0.958089 
+0.0777563 -0.273485 -0.958728 0.0767645 -0.271572 -0.959352 0.0757928 -0.269688 -0.95996 
+0.0748405 -0.267835 -0.960554 0.0739071 -0.26601 -0.961133 0.0729921 -0.264214 -0.961698 
+0.0834122 -0.281876 -0.955818 0.0832543 -0.281342 -0.955989 0.083031 -0.281163 -0.956061 
+0.0827997 -0.279806 -0.956479 0.0819412 -0.279119 -0.956754 0.0823498 -0.278286 -0.956962 
+0.0808741 -0.27711 -0.957429 0.0819046 -0.276781 -0.957436 0.0798289 -0.275133 -0.958086 
+0.0788051 -0.273188 -0.958727 0.0778021 -0.271274 -0.959352 0.0768193 -0.269391 -0.959962 
+0.0758561 -0.267538 -0.960557 0.074912 -0.265714 -0.961137 0.0739865 -0.263918 -0.961703 
+0.0730791 -0.262149 -0.962256 0.0721892 -0.260408 -0.962796 0.0713164 -0.258693 -0.963323 
+0.0818893 -0.276729 -0.957452 0.0814639 -0.275292 -0.957903 0.0808696 -0.274822 -0.958088 
+0.0810277 -0.273818 -0.958362 0.0798347 -0.272878 -0.958731 0.080596 -0.272359 -0.958814 
+0.0788208 -0.270965 -0.959357 0.0778272 -0.269082 -0.959968 0.0768534 -0.26723 -0.960563 
+0.0758989 -0.265406 -0.961145 0.0749632 -0.263611 -0.961712 0.0740456 -0.261843 -0.962266 
+0.0731459 -0.260102 -0.962807 0.0722634 -0.258387 -0.963335 0.0713977 -0.256699 -0.963851 
+0.0705484 -0.255035 -0.964355 0.0804186 -0.271759 -0.958999 0.0801686 -0.270915 -0.959259 
+0.0798206 -0.270642 -0.959365 0.0797456 -0.269485 -0.959697 0.0788165 -0.268761 -0.959977 
+0.0793268 -0.26807 -0.960128 0.0778325 -0.266909 -0.960574 0.0768679 -0.265086 -0.961156 
+0.0759222 -0.263292 -0.961724 0.074995 -0.261525 -0.962279 0.0740856 -0.259785 -0.96282 
+0.0731936 -0.258072 -0.963349 0.0723186 -0.256384 -0.963866 0.0714602 -0.254721 -0.964371 
+0.0706178 -0.253082 -0.964864 0.0697911 -0.251468 -0.965346 0.0689797 -0.249877 -0.965817 
+0.0789977 -0.266958 -0.960465 0.0789122 -0.266669 -0.960552 0.0787936 -0.266577 -0.960587 
+0.0785018 -0.265282 -0.96097 0.0778193 -0.264756 -0.96117 0.0780954 -0.263909 -0.961381 
+0.0768639 -0.262962 -0.961739 0.077693 -0.262549 -0.961786 0.0759272 -0.261197 -0.962295 
+0.0750085 -0.259458 -0.962837 0.0741073 -0.257745 -0.963367 0.0732233 -0.256059 -0.963884 
+0.072356 -0.254397 -0.964389 0.0715048 -0.25276 -0.964883 0.0706695 -0.251146 -0.965366 
+0.0698496 -0.249557 -0.965838 0.0690447 -0.24799 -0.966299 0.0682545 -0.246445 -0.96675 
+0.0674785 -0.244922 -0.967192 0.077624 -0.262316 -0.961855 0.0772946 -0.261202 -0.962184 
+0.0768425 -0.260858 -0.962314 0.0769001 -0.259869 -0.962577 0.0759147 -0.25912 -0.962857 
+0.0765094 -0.258549 -0.962963 0.0750047 -0.257409 -0.963387 0.0741119 -0.255724 -0.963905 
+0.0732359 -0.254063 -0.964411 0.0723763 -0.252428 -0.964905 0.0715326 -0.250816 -0.965388 
+0.0707045 -0.249227 -0.965861 0.0698915 -0.247661 -0.966322 0.0690932 -0.246118 -0.966774 
+0.0683094 -0.244596 -0.967216 0.0675395 -0.243096 -0.967648 0.0667834 -0.241617 -0.968071 
+0.0762955 -0.257826 -0.963174 0.0761226 -0.257242 -0.963344 0.0758859 -0.257063 -0.963411 
+0.0757394 -0.255947 -0.963719 0.0749846 -0.255379 -0.963929 0.07536 -0.254665 -0.964088 
+0.0741002 -0.253721 -0.964435 0.0732323 -0.252086 -0.96493 0.0723805 -0.250476 -0.965413 
+0.0715444 -0.248889 -0.965886 0.0707235 -0.247325 -0.966348 0.0699175 -0.245783 -0.9668 
+0.069126 -0.244263 -0.967242 0.0683486 -0.242764 -0.967675 0.0675851 -0.241286 -0.968098 
+0.0668349 -0.239829 -0.968512 0.066098 -0.238391 -0.968917 0.0653738 -0.236973 -0.969314 
+0.07501 -0.253482 -0.964427 0.0749842 -0.253395 -0.964452 0.074949 -0.253369 -0.964462 
+0.074612 -0.252137 -0.964811 0.0740731 -0.251736 -0.964957 0.0742434 -0.250891 -0.965164 
+0.0732135 -0.250128 -0.965441 0.0738782 -0.249657 -0.965512 0.0723695 -0.248542 -0.965914 
+0.071541 -0.24698 -0.966376 0.0707274 -0.24544 -0.966828 0.0699285 -0.243921 -0.967271 
+0.0691438 -0.242424 -0.967703 0.068373 -0.240948 -0.968127 0.0676158 -0.239492 -0.968541 
+0.0668718 -0.238056 -0.968947 0.0661407 -0.23664 -0.969344 0.0654222 -0.235242 -0.969732 
+0.0647161 -0.233864 -0.970113 0.0737656 -0.249277 -0.965619 0.0735165 -0.248435 -0.965855 
+0.0731801 -0.248187 -0.965944 0.0731582 -0.247224 -0.966193 0.0723441 -0.246627 -0.966407 
+0.0728032 -0.246025 -0.966525 0.0715232 -0.245088 -0.966859 0.0707171 -0.243572 -0.967301 
+0.0699253 -0.242077 -0.967734 0.0691475 -0.240602 -0.968158 0.0683833 -0.239148 -0.968572 
+0.0676325 -0.237714 -0.968978 0.0668947 -0.236299 -0.969375 0.0661696 -0.234904 -0.969764 
+0.0654569 -0.233527 -0.970145 0.0647563 -0.232168 -0.970518 0.0640675 -0.230827 -0.970883 
+0.0633903 -0.229504 -0.971241 0.0725603 -0.245204 -0.966752 0.0724516 -0.244836 -0.966854 
+0.072305 -0.24473 -0.966892 0.0721032 -0.243659 -0.967177 0.0714918 -0.243215 -0.967334 
+0.071758 -0.242493 -0.967496 0.0706931 -0.241722 -0.967767 0.071416 -0.241337 -0.96781 
+0.0699085 -0.240249 -0.968191 0.0691377 -0.238797 -0.968605 0.0683802 -0.237365 -0.969011 
+0.0676359 -0.235952 -0.969408 0.0669044 -0.234558 -0.969797 0.0661853 -0.233183 -0.970178 
+0.0654784 -0.231826 -0.970551 0.0647835 -0.230487 -0.970916 0.0641001 -0.229166 -0.971274 
+0.0634281 -0.227862 -0.971625 0.0627673 -0.226574 -0.971969 0.0621172 -0.225303 -0.972306 
+0.0713925 -0.241258 -0.967832 0.0710772 -0.240192 -0.96812 0.0706563 -0.239889 -0.968226 
+0.0707414 -0.239057 -0.968425 0.069879 -0.238439 -0.96864 0.0704087 -0.237933 -0.968726 
+0.0691151 -0.237009 -0.969046 0.0683644 -0.235598 -0.969443 0.0676266 -0.234206 -0.969832 
+0.0669014 -0.232833 -0.970213 0.0661884 -0.231479 -0.970586 0.0654875 -0.230142 -0.970951 
+0.0647982 -0.228822 -0.971309 0.0641204 -0.22752 -0.97166 0.0634537 -0.226234 -0.972004 
+0.062798 -0.224965 -0.972341 0.0621529 -0.223712 -0.972672 0.0615183 -0.222474 -0.972996 
+0.0702605 -0.237432 -0.96886 0.070079 -0.236819 -0.969023 0.0698373 -0.236647 -0.969083 
+0.0697523 -0.235715 -0.969316 0.0690805 -0.235238 -0.96948 0.0694285 -0.23462 -0.969605 
+0.0683366 -0.233848 -0.969869 0.0676054 -0.232478 -0.970249 0.0668865 -0.231125 -0.970622 
+0.0661797 -0.22979 -0.970988 0.0654847 -0.228472 -0.971346 0.0648011 -0.227172 -0.971696 
+0.0641289 -0.225888 -0.97204 0.0634676 -0.224621 -0.972377 0.0628171 -0.22337 -0.972708 
+0.0621771 -0.222135 -0.973031 0.0691627 -0.233722 -0.96984 0.0691076 -0.233536 -0.969889 
+0.0690344 -0.233484 -0.969907 0.0687896 -0.232461 -0.97017 0.0682973 -0.232116 -0.970288 
+0.0684744 -0.231396 -0.970447 0.0675727 -0.230765 -0.97066 0.0681619 -0.23034 -0.97072 
+0.0668602 -0.229432 -0.971026 0.0661596 -0.228117 -0.971383 0.0654706 -0.226819 -0.971734 
+0.0647928 -0.225537 -0.972078 0.0641262 -0.224272 -0.972414 0.0634703 -0.223023 -0.972745 
+0.0680976 -0.230123 -0.970776 0.0678523 -0.229294 -0.970989 0.0675292 -0.229069 -0.971065 
+0.0675453 -0.228257 -0.971255 0.0668231 -0.227756 -0.971423 0.0672411 -0.227228 -0.971517 
+0.0661287 -0.22646 -0.971773 0.0654457 -0.225181 -0.972116 0.0647738 -0.223918 -0.972453 
+0.0670639 -0.22663 -0.971669 0.0669394 -0.226209 -0.971776 0.0667758 -0.226097 -0.971813 
+0.0666404 -0.225199 -0.972031 0.0660877 -0.22482 -0.972157 0.0721117 -0.277022 -0.958154 
+0.0711866 -0.275091 -0.958779 0.0702802 -0.273191 -0.959389 0.0693919 -0.27132 -0.959984 
+0.0742143 -0.278745 -0.957493 0.0732568 -0.276781 -0.958137 0.0723187 -0.274849 -0.958764 
+0.0713996 -0.272947 -0.959376 0.0704989 -0.271076 -0.959973 0.069616 -0.269233 -0.960556 
+0.0687506 -0.267418 -0.961125 0.0679021 -0.265631 -0.96168 0.0775484 -0.281472 -0.956431 
+0.0763426 -0.280486 -0.956817 0.0771246 -0.279934 -0.956916 0.075352 -0.27849 -0.957479 
+0.0743816 -0.276525 -0.958124 0.073431 -0.274592 -0.958753 0.0724995 -0.27269 -0.959367 
+0.0715867 -0.270817 -0.959965 0.0706919 -0.268974 -0.96055 0.0698148 -0.267159 -0.96112 
+0.0689548 -0.265371 -0.961677 0.0681115 -0.263611 -0.962221 0.0672844 -0.261877 -0.962753 
+0.0664731 -0.260169 -0.963272 0.0768755 -0.27903 -0.9572 0.0767052 -0.278411 -0.957394 
+0.0764693 -0.27822 -0.957469 0.0762901 -0.276905 -0.957864 0.0754865 -0.276255 -0.958115 
+0.0758792 -0.275413 -0.958327 0.0745236 -0.274322 -0.958746 0.0754726 -0.273938 -0.958782 
+0.0735801 -0.272419 -0.959361 0.0726554 -0.270546 -0.959962 0.0717491 -0.268702 -0.960547 
+0.0708606 -0.266886 -0.961119 0.0699894 -0.265099 -0.961678 0.0691351 -0.263338 -0.962223 
+0.0682972 -0.261604 -0.962756 0.0674753 -0.259895 -0.963276 0.0666689 -0.258212 -0.963785 
+0.0658777 -0.256554 -0.964282 0.0651013 -0.254919 -0.964768 0.0753828 -0.273612 -0.958882 
+0.0750701 -0.272477 -0.959229 0.0746416 -0.272134 -0.95936 0.0746717 -0.271031 -0.95967 
+0.0737054 -0.270261 -0.959962 0.0742774 -0.269599 -0.960104 0.0727878 -0.268417 -0.960549 
+0.0718882 -0.266602 -0.961122 0.0710061 -0.264814 -0.961682 0.0701411 -0.263053 -0.962228 
+0.0692926 -0.261319 -0.962762 0.0684604 -0.259611 -0.963284 0.0676439 -0.257928 -0.963793 
+0.0668427 -0.256269 -0.964291 0.0660564 -0.254635 -0.964778 0.0652847 -0.253024 -0.965255 
+0.0645272 -0.251437 -0.96572 0.0637835 -0.249871 -0.966176 0.0739446 -0.268391 -0.960468 
+0.073887 -0.268182 -0.960531 0.0738081 -0.26812 -0.960554 0.0735005 -0.26678 -0.960951 
+0.0728978 -0.266305 -0.961128 0.0731179 -0.265391 -0.961364 0.0720051 -0.264517 -0.961689 
+0.072739 -0.264016 -0.961772 0.0711296 -0.262757 -0.962237 0.0702709 -0.261023 -0.962771 
+0.0694286 -0.259315 -0.963294 0.0686022 -0.257632 -0.963805 0.0677913 -0.255974 -0.964304 
+0.0669954 -0.254341 -0.964791 0.0662143 -0.25273 -0.965268 0.0654475 -0.251143 -0.965735 
+0.0646947 -0.249578 -0.966191 0.0639555 -0.248035 -0.966638 0.0632295 -0.246514 -0.967074 
+0.0625166 -0.245014 -0.967502 0.072558 -0.263359 -0.961966 0.072364 -0.262654 -0.962173 
+0.0721009 -0.262449 -0.962248 0.0719926 -0.261306 -0.962567 0.0712323 -0.260716 -0.962784 
+0.0716248 -0.259972 -0.962956 0.0703802 -0.259009 -0.963307 0.0712607 -0.25865 -0.963339 
+0.0695441 -0.257327 -0.963819 0.0687237 -0.255669 -0.964319 0.0679185 -0.254036 -0.964807 
+0.0671282 -0.252426 -0.965285 0.0663524 -0.25084 -0.965752 0.0655907 -0.249275 -0.966209 
+0.0648427 -0.247733 -0.966656 0.0641082 -0.246213 -0.967093 0.0633867 -0.244713 -0.967521 
+0.062678 -0.243234 -0.96794 0.0619818 -0.241775 -0.968351 0.0712205 -0.258504 -0.963381 
+0.0709001 -0.257341 -0.963716 0.0704697 -0.257011 -0.963836 0.070543 -0.256045 -0.964087 
+0.0696401 -0.255354 -0.964336 0.0701893 -0.254761 -0.964453 0.0688259 -0.253722 -0.964826 
+0.0680266 -0.252113 -0.965304 0.067242 -0.250527 -0.965772 0.0664716 -0.248964 -0.966229 
+0.0657152 -0.247422 -0.966677 0.0649722 -0.245903 -0.967115 0.0642425 -0.244404 -0.967543 
+0.0635257 -0.242926 -0.967963 0.0628215 -0.241468 -0.968373 0.0621295 -0.24003 -0.968775 
+0.0614495 -0.238611 -0.969169 0.0607812 -0.237211 -0.969555 0.0699295 -0.253818 -0.964721 
+0.0698391 -0.25349 -0.964814 0.0697176 -0.253398 -0.964847 0.0694921 -0.252231 -0.965169 
+0.0689097 -0.25179 -0.965325 0.0691485 -0.250984 -0.965518 0.0681165 -0.250205 -0.965794 
+0.0688082 -0.249748 -0.965863 0.0673377 -0.248643 -0.966252 0.066573 -0.247103 -0.9667 
+0.0658219 -0.245584 -0.967138 0.0650841 -0.244086 -0.967567 0.0643594 -0.242609 -0.967987 
+0.0636474 -0.241152 -0.968398 0.0629477 -0.239715 -0.9688 0.0622602 -0.238297 -0.969194 
+0.0615844 -0.236899 -0.969581 0.0609202 -0.235518 -0.969959 0.0602672 -0.234156 -0.970329 
+0.0596253 -0.232811 -0.970692 0.0686829 -0.249294 -0.965989 0.068471 -0.248525 -0.966202 
+0.0681891 -0.248313 -0.966277 0.0681371 -0.247312 -0.966537 0.0674163 -0.246774 -0.966725 
+0.0678062 -0.246112 -0.966867 0.0666572 -0.245257 -0.967164 0.0659117 -0.243761 -0.967593 
+0.0651792 -0.242285 -0.968013 0.0644596 -0.240829 -0.968425 0.0637525 -0.239393 -0.968827 
+0.0630576 -0.237977 -0.969222 0.0623746 -0.236579 -0.969608 0.0617032 -0.2352 -0.969986 
+0.0610432 -0.233839 -0.970357 0.0603942 -0.232495 -0.970721 0.0597562 -0.231169 -0.971077 
+0.0591287 -0.229861 -0.971426 0.0585115 -0.228568 -0.971768 0.0671538 -0.243743 -0.967512 
+0.0667253 -0.243427 -0.967621 0.0668321 -0.242576 -0.967828 0.0659854 -0.241953 -0.968042 
+0.0665134 -0.241419 -0.968139 0.0652584 -0.240498 -0.968453 0.064544 -0.239064 -0.968856 
+0.0638419 -0.237649 -0.969251 0.0631518 -0.236252 -0.969637 0.0624734 -0.234875 -0.970016 
+0.0618066 -0.233515 -0.970387 0.0611509 -0.232173 -0.97075 0.0605061 -0.230848 -0.971107 
+0.059872 -0.229541 -0.971456 0.0592484 -0.22825 -0.971798 0.058635 -0.226975 -0.972134 
+0.0580315 -0.225716 -0.972463 0.0574378 -0.224474 -0.972786 0.0663142 -0.240696 -0.968333 
+0.0661976 -0.240273 -0.968446 0.0660437 -0.24016 -0.968484 0.0658846 -0.239137 -0.968748 
+0.0653223 -0.238727 -0.968887 0.0655746 -0.238011 -0.969046 0.0646132 -0.237314 -0.969282 
+0.0652673 -0.236896 -0.96934 0.0639162 -0.235919 -0.969669 0.0632311 -0.234543 -0.970047 
+0.0625575 -0.233184 -0.970418 0.0618952 -0.231844 -0.970782 0.061244 -0.230521 -0.971138 
+0.0606035 -0.229215 -0.971487 0.0599735 -0.227925 -0.97183 0.0593539 -0.226652 -0.972166 
+0.0587442 -0.225395 -0.972495 0.0581445 -0.224153 -0.972818 0.0575543 -0.222927 -0.973135 
+0.0569735 -0.221716 -0.973445 0.0564019 -0.22052 -0.97375 0.0651881 -0.236609 -0.969416 
+0.0649628 -0.235791 -0.96963 0.064668 -0.235578 -0.969701 0.0646611 -0.234696 -0.969916 
+0.0639763 -0.234204 -0.97008 0.064362 -0.23361 -0.970198 0.0632962 -0.232847 -0.970451 
+0.0626275 -0.231508 -0.970815 0.0619699 -0.230187 -0.971171 0.0613232 -0.228882 -0.971521 
+0.0606871 -0.227594 -0.971863 0.0600613 -0.226323 -0.972199 0.0594457 -0.225067 -0.972528 
+0.05884 -0.223827 -0.972851 0.058244 -0.222603 -0.973168 0.0576575 -0.221393 -0.973479 
+0.0570802 -0.220199 -0.973784 0.056512 -0.219018 -0.974083 0.0559527 -0.217852 -0.974377 
+0.0640984 -0.232654 -0.970445 0.0640656 -0.232535 -0.970476 0.0640227 -0.232504 -0.970486 
+0.0637719 -0.231468 -0.97075 0.0633478 -0.231167 -0.97085 0.0634808 -0.230412 -0.97102 
+0.062684 -0.229847 -0.971206 0.0631922 -0.229364 -0.971287 0.0620312 -0.228544 -0.971555 
+0.0613891 -0.227258 -0.971898 0.0607574 -0.225988 -0.972233 0.060136 -0.224734 -0.972563 
+0.0595245 -0.223496 -0.972886 0.0589228 -0.222273 -0.973202 0.0583307 -0.221065 -0.973513 
+0.0577479 -0.219872 -0.973818 0.0571743 -0.218693 -0.974117 0.0630435 -0.228825 -0.971424 
+0.0629061 -0.228326 -0.97155 0.0627277 -0.2282 -0.971591 0.0626226 -0.227297 -0.97181 
+0.0620798 -0.226916 -0.971934 0.0623415 -0.226277 -0.972066 0.0614424 -0.225648 -0.972269 
+0.0620629 -0.225265 -0.972319 0.0608152 -0.224396 -0.972599 0.0601982 -0.223159 -0.972921 
+0.0595909 -0.221938 -0.973238 0.0589933 -0.220732 -0.973549 0.0584052 -0.219541 -0.973854 
+0.0620218 -0.225116 -0.972356 0.0617867 -0.224263 -0.972568 0.0614835 -0.224052 -0.972636 
+0.0615128 -0.223269 -0.972814 0.060861 -0.222818 -0.972959 0.0612413 -0.222283 -0.973057 
+0.0602484 -0.221598 -0.973275 0.0596455 -0.220394 -0.973586 0.0610318 -0.221523 -0.973243 
+0.0609722 -0.221306 -0.973296 0.0608953 -0.221254 -0.973313 0.0640945 -0.27044 -0.960601 
+0.0633009 -0.26864 -0.961158 0.0660533 -0.27205 -0.960013 0.065231 -0.270221 -0.960586 
+0.0644248 -0.26842 -0.961145 0.0636342 -0.266645 -0.961692 0.0628589 -0.264897 -0.962226 
+0.0620983 -0.263175 -0.962748 0.0680351 -0.273678 -0.959412 0.0671835 -0.271819 -0.96 
+0.0663486 -0.269989 -0.960575 0.06553 -0.268186 -0.961136 0.0647273 -0.26641 -0.961684 
+0.06394 -0.264661 -0.962219 0.0631678 -0.262937 -0.962743 0.0624101 -0.261239 -0.963255 
+0.0616667 -0.259565 -0.963755 0.0609372 -0.257916 -0.964244 0.0602213 -0.25629 -0.964722 
+0.0702874 -0.275527 -0.95872 0.0700403 -0.275324 -0.958797 0.0699105 -0.274049 -0.959171 
+0.0691587 -0.273435 -0.959401 0.0695373 -0.272586 -0.959615 0.0682946 -0.271574 -0.959991 
+0.069168 -0.271139 -0.960052 0.0674474 -0.269743 -0.960567 0.0666168 -0.267939 -0.96113 
+0.0658022 -0.266162 -0.96168 0.0650033 -0.264412 -0.962217 0.0642196 -0.262687 -0.962741 
+0.0634507 -0.260988 -0.963254 0.0626963 -0.259314 -0.963756 0.0619559 -0.257663 -0.964246 
+0.0612293 -0.256037 -0.964726 0.060516 -0.254433 -0.965195 0.0598157 -0.252852 -0.965654 
+0.0591281 -0.251293 -0.966103 0.0690067 -0.270506 -0.960242 0.0688024 -0.269705 -0.960482 
+0.0685277 -0.269484 -0.960564 0.0684405 -0.268287 -0.960905 0.0676853 -0.267679 -0.961128 
+0.0680822 -0.266882 -0.961321 0.0668592 -0.265901 -0.961679 0.0677276 -0.265492 -0.961731 
+0.0660489 -0.26415 -0.962217 0.065254 -0.262425 -0.962743 0.0644742 -0.260726 -0.963258 
+0.063709 -0.259051 -0.96376 0.062958 -0.2574 -0.964252 0.062221 -0.255773 -0.964732 
+0.0614974 -0.254169 -0.965203 0.0607871 -0.252587 -0.965663 0.0600896 -0.251028 -0.966113 
+0.0594047 -0.24949 -0.966554 0.058732 -0.247974 -0.966985 0.0580712 -0.246478 -0.967407 
+0.0676007 -0.264995 -0.961877 0.0673764 -0.264115 -0.962135 0.0670769 -0.263877 -0.962221 
+0.0670287 -0.262753 -0.962532 0.0662712 -0.262152 -0.962748 0.0666845 -0.261403 -0.962923 
+0.0654806 -0.260452 -0.963264 0.0663436 -0.260067 -0.963309 0.0647049 -0.258777 -0.963768 
+0.0639437 -0.257126 -0.96426 0.0631964 -0.255498 -0.964742 0.0624629 -0.253894 -0.965213 
+0.0617428 -0.252313 -0.965674 0.0610356 -0.250753 -0.966125 0.0603412 -0.249215 -0.966566 
+0.0596592 -0.247699 -0.966999 0.0589892 -0.246203 -0.967422 0.058331 -0.244727 -0.967836 
+0.0576844 -0.243271 -0.968242 0.0570489 -0.241835 -0.968639 0.0662487 -0.259695 -0.963416 
+0.066006 -0.258744 -0.963688 0.0656843 -0.258491 -0.963778 0.0656718 -0.257433 -0.964062 
+0.064913 -0.25684 -0.964271 0.0653408 -0.256136 -0.96443 0.0641559 -0.255213 -0.964754 
+0.065013 -0.254851 -0.964792 0.0634126 -0.253609 -0.965226 0.0626829 -0.252028 -0.965688 
+0.0619663 -0.250468 -0.96614 0.0612626 -0.248931 -0.966582 0.0605715 -0.247414 -0.967015 
+0.0598925 -0.245919 -0.967438 0.0592255 -0.244443 -0.967853 0.0585702 -0.242988 -0.96826 
+0.0579262 -0.241551 -0.968658 0.0572933 -0.240134 -0.969047 0.0566712 -0.238736 -0.96943 
+0.0560597 -0.237355 -0.969804 0.0554585 -0.235993 -0.970171 0.0649478 -0.254595 -0.964864 
+0.0646883 -0.253578 -0.96515 0.0643467 -0.253314 -0.965242 0.0643668 -0.252318 -0.965501 
+0.0636076 -0.251733 -0.965704 0.0640483 -0.251069 -0.965848 0.0628819 -0.250174 -0.966157 
+0.0637328 -0.249833 -0.966189 0.0621692 -0.248637 -0.9666 0.0614691 -0.247121 -0.967033 
+0.0607814 -0.245626 -0.967457 0.0601058 -0.244151 -0.967873 0.0594419 -0.242695 -0.96828 
+0.0587896 -0.24126 -0.968678 0.0581485 -0.239843 -0.969069 0.0575183 -0.238445 -0.969451 
+0.0568988 -0.237065 -0.969826 0.0562898 -0.235703 -0.970194 0.055691 -0.234359 -0.970554 
+0.0551021 -0.233032 -0.970907 0.054523 -0.231721 -0.971253 0.0636951 -0.249685 -0.96623 
+0.0634203 -0.248608 -0.966526 0.0630609 -0.248334 -0.96662 0.0631108 -0.247394 -0.966857 
+0.0623521 -0.246818 -0.967054 0.0628042 -0.246192 -0.967184 0.0616559 -0.245324 -0.967479 
+0.0625004 -0.245002 -0.967506 0.0609719 -0.243849 -0.967895 0.0602998 -0.242395 -0.968302 
+0.0596393 -0.24096 -0.968701 0.0589901 -0.239544 -0.969092 0.058352 -0.238147 -0.969475 
+0.0577248 -0.236767 -0.96985 0.0571081 -0.235406 -0.970218 0.0565017 -0.234063 -0.970578 
+0.0559054 -0.232736 -0.970932 0.055319 -0.231426 -0.971278 0.0547422 -0.230133 -0.971618 
+0.0541748 -0.228856 -0.971952 0.0536166 -0.227595 -0.972279 0.0624883 -0.244954 -0.967519 
+0.0621994 -0.243822 -0.967823 0.061824 -0.24354 -0.967918 0.0619013 -0.242653 -0.968136 
+0.0611438 -0.242086 -0.968326 0.0616059 -0.241495 -0.968445 0.0604754 -0.240652 -0.968726 
+0.0598184 -0.239237 -0.969117 0.0591726 -0.23784 -0.9695 0.0585378 -0.236462 -0.969876 
+0.0579136 -0.235102 -0.970244 0.0572999 -0.233759 -0.970605 0.0566963 -0.232433 -0.970958 
+0.0561027 -0.231125 -0.971305 0.0555189 -0.229832 -0.971645 0.0549445 -0.228556 -0.971979 
+0.0543795 -0.227296 -0.972306 0.0538235 -0.226051 -0.972627 0.0532765 -0.224822 -0.972942 
+0.0527381 -0.223607 -0.973252 0.0522082 -0.222407 -0.973555 0.0613249 -0.240393 -0.968736 
+0.0613132 -0.240348 -0.968749 0.061298 -0.240336 -0.968752 0.0610232 -0.239211 -0.969048 
+0.0606334 -0.238922 -0.969144 0.0607358 -0.238084 -0.969344 0.0599801 -0.237527 -0.969527 
+0.0604511 -0.236968 -0.969635 0.0593379 -0.23615 -0.969903 0.0587064 -0.23479 -0.970272 
+0.0580855 -0.233449 -0.970633 0.0574749 -0.232124 -0.970987 0.0568743 -0.230816 -0.971334 
+0.0562835 -0.229525 -0.971674 0.0557024 -0.22825 -0.972008 0.0551307 -0.22699 -0.972335 
+0.0545681 -0.225747 -0.972657 0.0540146 -0.224518 -0.972972 0.0534698 -0.223305 -0.973281 
+0.0529336 -0.222106 -0.973585 0.0524058 -0.220921 -0.973883 0.0518863 -0.219751 -0.974175 
+0.0513748 -0.218594 -0.974463 0.0602026 -0.235994 -0.969888 0.0601689 -0.235862 -0.969922 
+0.0601252 -0.23583 -0.969933 0.0598892 -0.234766 -0.970205 0.0594867 -0.234472 -0.970301 
+0.0596121 -0.233679 -0.970485 0.0588587 -0.233131 -0.970662 0.0593374 -0.232603 -0.97076 
+0.0582412 -0.231808 -0.971017 0.0576338 -0.230501 -0.971364 0.0570363 -0.229211 -0.971704 
+0.0564486 -0.227937 -0.972038 0.0558703 -0.226679 -0.972366 0.0553014 -0.225436 -0.972687 
+0.0547414 -0.224209 -0.973002 0.0541904 -0.222997 -0.973312 0.0536481 -0.221799 -0.973616 
+0.0531142 -0.220615 -0.973914 0.0525887 -0.219446 -0.974206 0.0520712 -0.218291 -0.974494 
+0.0515618 -0.217149 -0.974776 0.0510601 -0.21602 -0.975053 0.0505661 -0.214905 -0.975325 
+0.0591194 -0.231748 -0.970978 0.0590652 -0.231536 -0.971032 0.0589954 -0.231485 -0.971048 
+0.0587954 -0.230478 -0.9713 0.0583814 -0.23018 -0.971395 0.058528 -0.22943 -0.971564 
+0.0577774 -0.228891 -0.971736 0.0582629 -0.22839 -0.971825 0.0571832 -0.227618 -0.97207 
+0.0565986 -0.226361 -0.972398 0.0560233 -0.22512 -0.972719 0.0554572 -0.223894 -0.973034 
+0.0549001 -0.222683 -0.973344 0.0543517 -0.221486 -0.973648 0.0538119 -0.220304 -0.973946 
+0.0532805 -0.219136 -0.974238 0.0527573 -0.217982 -0.974526 0.0522421 -0.216841 -0.974808 
+0.0517348 -0.215714 -0.975085 0.0512352 -0.2146 -0.975357 0.0580735 -0.227648 -0.97201 
+0.0580001 -0.22736 -0.972082 0.0579063 -0.227294 -0.972103 0.0577396 -0.226339 -0.972336 
+0.0573155 -0.226038 -0.972431 0.0574814 -0.225327 -0.972586 0.0567341 -0.224798 -0.972752 
+0.0572255 -0.224324 -0.972833 0.0561619 -0.223574 -0.973068 0.0555988 -0.222364 -0.973377 
+0.0550446 -0.221169 -0.973681 0.054499 -0.219988 -0.973979 0.0539619 -0.218821 -0.974272 
+0.053433 -0.217668 -0.974559 0.0529123 -0.216529 -0.974841 0.0523995 -0.215403 -0.975118 
+0.0570628 -0.223686 -0.972989 0.0569717 -0.223329 -0.973077 0.0568558 -0.223248 -0.973102 
+0.0567201 -0.222343 -0.973317 0.0562869 -0.222039 -0.973412 0.0564707 -0.221365 -0.973555 
+0.0557269 -0.220846 -0.973715 0.0562234 -0.220396 -0.973789 0.0551756 -0.219666 -0.974014 
+0.0546329 -0.218501 -0.974306 0.0540985 -0.21735 -0.974593 0.0535724 -0.216212 -0.974876 
+0.0560858 -0.219856 -0.973919 0.0559782 -0.219434 -0.97402 0.0558419 -0.21934 -0.974049 
+0.055735 -0.218481 -0.974248 0.0552937 -0.218176 -0.974342 0.0554939 -0.217536 -0.974473 
+0.054754 -0.217026 -0.974629 0.056634 -0.264292 -0.962778 0.0584634 -0.265802 -0.962253 
+0.0577604 -0.264093 -0.962766 0.0570705 -0.262409 -0.963268 0.0563935 -0.260748 -0.963758 
+0.055729 -0.259112 -0.964238 0.0603135 -0.267327 -0.961717 0.0595843 -0.265591 -0.962243 
+0.0588689 -0.26388 -0.962757 0.0581669 -0.262195 -0.96326 0.057478 -0.260533 -0.963753 
+0.0568018 -0.258894 -0.964234 0.0561381 -0.257279 -0.964705 0.0554865 -0.255686 -0.965166 
+0.0548467 -0.254115 -0.965618 0.0542184 -0.252565 -0.96606 0.0633212 -0.269804 -0.960831 
+0.0621846 -0.268868 -0.961168 0.0629879 -0.268383 -0.961251 0.0614287 -0.267105 -0.961708 
+0.0606873 -0.265367 -0.962236 0.0599598 -0.263655 -0.962752 0.059246 -0.261968 -0.963256 
+0.0585455 -0.260304 -0.96375 0.0578579 -0.258665 -0.964233 0.0571829 -0.257048 -0.964705 
+0.0565203 -0.255454 -0.965168 0.0558696 -0.253882 -0.96562 0.0552306 -0.252331 -0.966063 
+0.0546031 -0.250802 -0.966497 0.0539867 -0.249293 -0.966922 0.0533811 -0.247804 -0.967338 
+0.0527861 -0.246335 -0.967746 0.062758 -0.267404 -0.961539 0.062658 -0.266977 -0.961664 
+0.0625259 -0.26687 -0.961702 0.0623313 -0.265586 -0.96207 0.0617724 -0.265131 -0.962232 
+0.0620079 -0.264208 -0.96247 0.0610332 -0.263417 -0.962749 0.0616877 -0.262843 -0.962865 
+0.0603078 -0.261729 -0.963255 0.059596 -0.260064 -0.96375 0.0588972 -0.258424 -0.964235 
+0.0582113 -0.256806 -0.964708 0.0575379 -0.255211 -0.965172 0.0568766 -0.253638 -0.965626 
+0.0562272 -0.252086 -0.96607 0.0555894 -0.250556 -0.966505 0.0549629 -0.249046 -0.966931 
+0.0543475 -0.247557 -0.967348 0.0537428 -0.246088 -0.967756 0.0531485 -0.244638 -0.968157 
+0.0525646 -0.243207 -0.968549 0.0519906 -0.241794 -0.968934 0.0613844 -0.261551 -0.963236 
+0.0613707 -0.261492 -0.963252 0.0613526 -0.261478 -0.963258 0.0610567 -0.260155 -0.963635 
+0.0606297 -0.259813 -0.963754 0.0607459 -0.25883 -0.964011 0.05992 -0.258171 -0.964239 
+0.0604381 -0.257519 -0.964381 0.0592234 -0.256552 -0.964714 0.0601332 -0.25622 -0.964746 
+0.0585394 -0.254957 -0.965179 0.0578678 -0.253383 -0.965634 0.0572083 -0.251831 -0.966079 
+0.0565605 -0.2503 -0.966515 0.0559241 -0.24879 -0.966942 0.055299 -0.2473 -0.96736 
+0.0546847 -0.24583 -0.967769 0.0540811 -0.24438 -0.96817 0.053488 -0.242949 -0.968563 
+0.0529049 -0.241536 -0.968949 0.0523318 -0.240141 -0.969326 0.0517684 -0.238765 -0.969697 
+0.0512144 -0.237406 -0.97006 0.0506697 -0.236064 -0.970416 0.0600674 -0.255939 -0.964825 
+0.0598314 -0.254934 -0.965106 0.0595251 -0.254692 -0.965189 0.0595324 -0.25366 -0.96546 
+0.0588434 -0.253118 -0.965644 0.0592363 -0.252398 -0.965809 0.0581739 -0.251565 -0.96609 
+0.058943 -0.251148 -0.966152 0.0575163 -0.250034 -0.966527 0.0568703 -0.248524 -0.966955 
+0.0562357 -0.247034 -0.967374 0.0556122 -0.245564 -0.967784 0.0549994 -0.244113 -0.968186 
+0.0543972 -0.242682 -0.96858 0.0538053 -0.241269 -0.968966 0.0532235 -0.239874 -0.969344 
+0.0526514 -0.238498 -0.969715 0.052089 -0.237139 -0.970078 0.051536 -0.235797 -0.970435 
+0.0509921 -0.234472 -0.970785 0.0504571 -0.233164 -0.971128 0.0499309 -0.231872 -0.971464 
+0.0494133 -0.230595 -0.971794 0.0588037 -0.250555 -0.966315 0.0586525 -0.249911 -0.966491 
+0.0584571 -0.249759 -0.966542 0.0583647 -0.248685 -0.966824 0.0578018 -0.248248 -0.96697 
+0.0580797 -0.24747 -0.967153 0.0571579 -0.246758 -0.96739 0.0577973 -0.246267 -0.967477 
+0.0565252 -0.245288 -0.967801 0.0559035 -0.243837 -0.968204 0.0552925 -0.242406 -0.968598 
+0.054692 -0.240993 -0.968985 0.0541016 -0.239599 -0.969363 0.0535211 -0.238222 -0.969735 
+0.0529504 -0.236864 -0.970099 0.0523892 -0.235522 -0.970456 0.0518373 -0.234197 -0.970806 
+0.0512944 -0.232889 -0.97115 0.0507605 -0.231597 -0.971487 0.0502352 -0.230321 -0.971817 
+0.0497183 -0.229061 -0.972142 0.0492098 -0.227816 -0.97246 0.0487093 -0.226586 -0.972772 
+0.0575903 -0.245385 -0.967714 0.0575176 -0.245075 -0.967796 0.0574241 -0.245003 -0.96782 
+0.0572405 -0.243894 -0.968111 0.0567936 -0.243553 -0.968223 0.056966 -0.242725 -0.968421 
+0.056174 -0.242122 -0.968618 0.0566939 -0.241565 -0.968727 0.055565 -0.240709 -0.969005 
+0.0549662 -0.239315 -0.969385 0.0543776 -0.237939 -0.969757 0.0537988 -0.23658 -0.970121 
+0.0532296 -0.235239 -0.970479 0.0526698 -0.233915 -0.970829 0.0521193 -0.232607 -0.971173 
+0.0515777 -0.231316 -0.971511 0.0510449 -0.23004 -0.971842 0.0505206 -0.22878 -0.972166 
+0.0500048 -0.227535 -0.972485 0.0494972 -0.226306 -0.972798 0.0489976 -0.225091 -0.973105 
+0.0485059 -0.223891 -0.973406 0.0480218 -0.222704 -0.973703 0.0475453 -0.221532 -0.973993 
+0.0564244 -0.240417 -0.969028 0.0564244 -0.240417 -0.969028 0.0564244 -0.240417 -0.969028 
+0.0561574 -0.239279 -0.969325 0.0558176 -0.239023 -0.969408 0.0558928 -0.238152 -0.969618 
+0.0552209 -0.237648 -0.96978 0.0556306 -0.237035 -0.969907 0.0546342 -0.23629 -0.970145 
+0.0553708 -0.235928 -0.970192 0.0540572 -0.234949 -0.970503 0.0534898 -0.233625 -0.970854 
+0.0529317 -0.232318 -0.971199 0.0523826 -0.231027 -0.971536 0.0518425 -0.229752 -0.971867 
+0.051311 -0.228493 -0.972193 0.0507881 -0.227249 -0.972512 0.0502735 -0.22602 -0.972825 
+0.049767 -0.224805 -0.973132 0.0492684 -0.223606 -0.973434 0.0487777 -0.22242 -0.97373 
+0.0482945 -0.221249 -0.974021 0.0478188 -0.220091 -0.974307 0.0473504 -0.218946 -0.974587 
+0.0468892 -0.217815 -0.974863 0.046435 -0.216696 -0.975134 0.0553034 -0.23564 -0.970266 
+0.0551133 -0.23483 -0.970473 0.0548722 -0.234652 -0.97053 0.0548581 -0.233743 -0.97075 
+0.0542973 -0.233328 -0.970881 0.0546052 -0.232666 -0.971023 0.0537318 -0.232022 -0.971225 
+0.0543545 -0.231598 -0.971292 0.0531755 -0.230732 -0.971563 0.0526282 -0.229457 -0.971895 
+0.0520897 -0.228199 -0.97222 0.0515598 -0.226955 -0.972539 0.0510383 -0.225727 -0.972853 
+0.050525 -0.224514 -0.97316 0.0500198 -0.223315 -0.973462 0.0495225 -0.22213 -0.973759 
+0.0490328 -0.220959 -0.97405 0.0485508 -0.219802 -0.974336 0.0480761 -0.218658 -0.974616 
+0.0476086 -0.217528 -0.974892 0.0471483 -0.21641 -0.975163 0.0466948 -0.215305 -0.97543 
+0.0462482 -0.214213 -0.975691 0.0458082 -0.213133 -0.975949 0.0542247 -0.231044 -0.971431 
+0.0541061 -0.230539 -0.971558 0.0539563 -0.23043 -0.971592 0.0538599 -0.22949 -0.97182 
+0.053402 -0.229156 -0.971924 0.0536158 -0.22845 -0.972078 0.0528566 -0.227898 -0.972249 
+0.0533739 -0.227419 -0.972333 0.0523199 -0.226656 -0.972569 0.0517917 -0.225428 -0.972882 
+0.0512718 -0.224216 -0.97319 0.0507601 -0.223018 -0.973492 0.0502564 -0.221834 -0.973788 
+0.0497604 -0.220664 -0.97408 0.0492721 -0.219508 -0.974366 0.0487912 -0.218365 -0.974647 
+0.0483177 -0.217235 -0.974923 0.0478513 -0.216119 -0.975194 0.047392 -0.215015 -0.97546 
+0.0469395 -0.213923 -0.975722 0.0464937 -0.212844 -0.975979 0.0460546 -0.211777 -0.976232 
+0.0456218 -0.210722 -0.976481 0.053186 -0.226619 -0.97253 0.0531341 -0.226397 -0.972585 
+0.0530687 -0.22635 -0.972599 0.0528964 -0.225384 -0.972833 0.0525339 -0.225124 -0.972913 
+0.0526607 -0.22438 -0.973078 0.0520076 -0.223912 -0.973221 0.052427 -0.223385 -0.973319 
+0.0514895 -0.222715 -0.973523 0.0521954 -0.222398 -0.973558 0.0509794 -0.221532 -0.97382 
+0.0504773 -0.220363 -0.974111 0.0499829 -0.219208 -0.974397 0.049496 -0.218066 -0.974678 
+0.0490165 -0.216938 -0.974954 0.0485443 -0.215822 -0.975225 0.0480791 -0.214719 -0.975492 
+0.0476209 -0.213629 -0.975754 0.0471695 -0.21255 -0.976011 0.0467248 -0.211484 -0.976264 
+0.0521854 -0.222355 -0.973568 0.0519658 -0.221419 -0.973793 0.0516918 -0.221225 -0.973852 
+0.0517381 -0.220449 -0.974025 0.0511836 -0.220057 -0.974143 0.0515123 -0.219487 -0.974254 
+0.0506832 -0.218903 -0.974429 0.0512885 -0.218533 -0.974481 0.0501904 -0.217762 -0.97471 
+0.0497052 -0.216635 -0.974987 0.0492272 -0.21552 -0.975258 0.0487564 -0.214418 -0.975524 
+0.0482926 -0.213329 -0.975786 0.0478357 -0.212252 -0.976043 0.0512207 -0.218245 -0.974549 
+0.0510665 -0.217588 -0.974704 0.0508747 -0.217453 -0.974744 0.0508464 -0.21665 -0.974924 
+0.0503837 -0.216327 -0.97502 0.0506281 -0.21572 -0.975142 0.0499002 -0.215214 -0.975291 
+0.0504117 -0.214798 -0.975357 0.0494238 -0.214113 -0.975558 0.0489546 -0.213025 -0.97582 
+0.0502902 -0.21428 -0.975477 0.050197 -0.213883 -0.975569 0.0500816 -0.213803 -0.975592 
+0.0513836 -0.259953 -0.964253 0.0507859 -0.258352 -0.964715 0.050199 -0.256774 -0.965167 
+0.0496227 -0.255217 -0.96561 0.0531148 -0.261385 -0.963772 0.0524938 -0.25976 -0.964245 
+0.0518841 -0.258157 -0.964709 0.0512854 -0.256577 -0.965162 0.0506974 -0.255017 -0.965607 
+0.05012 -0.253479 -0.966042 0.0495527 -0.251961 -0.966468 0.0489955 -0.250464 -0.966885 
+0.048448 -0.248986 -0.967295 0.0548648 -0.262831 -0.963281 0.05422 -0.261181 -0.963766 
+0.0535871 -0.259554 -0.964241 0.0529656 -0.25795 -0.964705 0.0523553 -0.256368 -0.96516 
+0.0517561 -0.254807 -0.965606 0.0511674 -0.253267 -0.966042 0.0505892 -0.251747 -0.96647 
+0.0500212 -0.250248 -0.966889 0.0494631 -0.248769 -0.967299 0.0489146 -0.247309 -0.967701 
+0.0483756 -0.245867 -0.968096 0.0478459 -0.244445 -0.968482 0.0473251 -0.24304 -0.968861 
+0.0563414 -0.262926 -0.963169 0.055965 -0.262617 -0.963276 0.0560516 -0.261574 -0.963554 
+0.0553083 -0.260965 -0.963762 0.0557647 -0.260235 -0.963933 0.0546636 -0.259337 -0.964239 
+0.0554807 -0.25891 -0.964307 0.0540307 -0.257731 -0.964705 0.0534091 -0.256147 -0.965161 
+0.0527987 -0.254584 -0.965608 0.0521992 -0.253043 -0.966046 0.0516102 -0.251522 -0.966474 
+0.0510316 -0.250022 -0.966894 0.0504631 -0.248541 -0.967306 0.0499044 -0.24708 -0.967709 
+0.0493554 -0.245638 -0.968104 0.0488158 -0.244214 -0.968492 0.0482853 -0.242809 -0.968872 
+0.0477638 -0.241421 -0.969244 0.0472511 -0.240051 -0.96961 0.0467469 -0.238698 -0.969968 
+0.046251 -0.237362 -0.97032 0.0552928 -0.258033 -0.964553 0.0551994 -0.257597 -0.964674 
+0.0550794 -0.2575 -0.964707 0.0549208 -0.256297 -0.965037 0.0544468 -0.255915 -0.965165 
+0.0546449 -0.25501 -0.965393 0.0538255 -0.254351 -0.965613 0.0543717 -0.253734 -0.965745 
+0.0532153 -0.252808 -0.966052 0.0541011 -0.252472 -0.966091 0.0526158 -0.251287 -0.966482 
+0.0520269 -0.249785 -0.966903 0.0514482 -0.248304 -0.967315 0.0508796 -0.246841 -0.967719 
+0.0503207 -0.245398 -0.968115 0.0497714 -0.243974 -0.968504 0.0492314 -0.242568 -0.968885 
+0.0487005 -0.241179 -0.969258 0.0481786 -0.239809 -0.969624 0.0476653 -0.238455 -0.969983 
+0.0471605 -0.237119 -0.970335 0.0466641 -0.235798 -0.970681 0.0461757 -0.234495 -0.97102 
+0.0456953 -0.233207 -0.971353 0.0452227 -0.231934 -0.97168 0.0447576 -0.230677 -0.972 
+0.0540115 -0.252053 -0.966205 0.0538331 -0.251221 -0.966432 0.0536062 -0.251041 -0.966491 
+0.0535676 -0.249982 -0.966768 0.0530071 -0.249538 -0.966913 0.0533046 -0.248755 -0.967099 
+0.0524185 -0.248056 -0.967326 0.0530442 -0.247539 -0.967425 0.0518401 -0.246593 -0.967732 
+0.0512716 -0.245149 -0.968129 0.0507128 -0.243724 -0.968518 0.0501635 -0.242318 -0.968899 
+0.0496235 -0.240929 -0.969273 0.0490925 -0.239558 -0.96964 0.0485704 -0.238204 -0.97 
+0.0480568 -0.236867 -0.970353 0.0475518 -0.235546 -0.970699 0.047055 -0.234242 -0.971039 
+0.0465662 -0.232954 -0.971372 0.0460853 -0.231681 -0.9717 0.0456122 -0.230424 -0.972021 
+0.0451466 -0.229181 -0.972336 0.0446884 -0.227954 -0.972646 0.0442374 -0.226741 -0.97295 
+0.0437934 -0.225542 -0.973249 0.0525305 -0.245143 -0.968063 0.0522083 -0.244891 -0.968144 
+0.0522773 -0.243961 -0.968375 0.0516402 -0.243466 -0.968534 0.0520264 -0.24279 -0.968683 
+0.0510818 -0.242059 -0.968916 0.0517779 -0.24163 -0.968986 0.0505328 -0.24067 -0.969291 
+0.049993 -0.239298 -0.969658 0.0494621 -0.237944 -0.970019 0.0489401 -0.236607 -0.970372 
+0.0484266 -0.235286 -0.970719 0.0479215 -0.233982 -0.971059 0.0474245 -0.232693 -0.971393 
+0.0469356 -0.23142 -0.971721 0.0464546 -0.230163 -0.972043 0.0459811 -0.228921 -0.972359 
+0.0455152 -0.227693 -0.972669 0.0450566 -0.22648 -0.972973 0.0446052 -0.225281 -0.973272 
+0.0441609 -0.224096 -0.973566 0.0437233 -0.222925 -0.973854 0.0432925 -0.221768 -0.974138 
+0.0428683 -0.220623 -0.974417 0.0516134 -0.240863 -0.969186 0.0515316 -0.240481 -0.969285 
+0.0514286 -0.240402 -0.96931 0.0512876 -0.239342 -0.96958 0.0508801 -0.23903 -0.969678 
+0.0510458 -0.238214 -0.96987 0.0503408 -0.237676 -0.970039 0.0508062 -0.237096 -0.970157 
+0.0498103 -0.236339 -0.970393 0.0505688 -0.235988 -0.970439 0.0492886 -0.235018 -0.970741 
+0.0487753 -0.233714 -0.971081 0.0482704 -0.232425 -0.971416 0.0477736 -0.231152 -0.971744 
+0.0472848 -0.229895 -0.972066 0.0468038 -0.228653 -0.972382 0.0463303 -0.227426 -0.972693 
+0.0458643 -0.226213 -0.972998 0.0454056 -0.225014 -0.973297 0.044954 -0.223829 -0.973591 
+0.0445094 -0.222659 -0.97388 0.0440716 -0.221501 -0.974164 0.0436405 -0.220357 -0.974443 
+0.0432159 -0.219226 -0.974717 0.0427978 -0.218107 -0.974986 0.0423859 -0.217002 -0.975251 
+0.0419802 -0.215908 -0.975511 0.0504901 -0.235621 -0.970533 0.0503335 -0.23489 -0.970718 
+0.0501379 -0.234742 -0.970764 0.0501004 -0.233802 -0.970993 0.0496167 -0.233438 -0.971105 
+0.0498693 -0.232723 -0.971264 0.049104 -0.23215 -0.97144 0.0496403 -0.231655 -0.971531 
+0.0485995 -0.230877 -0.971768 0.0481031 -0.22962 -0.972091 0.0476145 -0.228378 -0.972407 
+0.0471337 -0.227151 -0.972718 0.0466604 -0.225939 -0.973023 0.0461945 -0.22474 -0.973323 
+0.0457359 -0.223556 -0.973617 0.0452843 -0.222386 -0.973907 0.0448397 -0.221229 -0.974191 
+0.0444018 -0.220085 -0.97447 0.0439706 -0.218954 -0.974744 0.0435459 -0.217836 -0.975013 
+0.0431275 -0.216731 -0.975278 0.0427154 -0.215638 -0.975539 0.0423094 -0.214557 -0.975795 
+0.0419094 -0.213488 -0.976046 0.0415152 -0.21243 -0.976294 0.0411268 -0.211384 -0.976537 
+0.0491883 -0.229545 -0.972054 0.0489094 -0.229339 -0.972117 0.0489653 -0.228505 -0.972311 
+0.0484135 -0.228097 -0.972434 0.0487442 -0.227473 -0.972564 0.0479255 -0.22687 -0.972745 
+0.0485251 -0.226451 -0.972813 0.0474451 -0.225658 -0.973051 0.0469722 -0.22446 -0.97335 
+0.0465067 -0.223277 -0.973645 0.0460483 -0.222107 -0.973934 0.0455969 -0.22095 -0.974219 
+0.0451525 -0.219807 -0.974498 0.0447147 -0.218677 -0.974772 0.0442835 -0.217559 -0.975042 
+0.0438588 -0.216454 -0.975307 0.0434405 -0.215362 -0.975568 0.0430283 -0.214282 -0.975824 
+0.0426222 -0.213213 -0.976076 0.042222 -0.212156 -0.976323 0.0418277 -0.211111 -0.976567 
+0.0414391 -0.210077 -0.976806 0.041056 -0.209054 -0.977042 0.0406785 -0.208042 -0.977274 
+0.0403064 -0.207041 -0.977502 0.0483801 -0.225774 -0.972978 0.0483079 -0.225437 -0.973059 
+0.0482185 -0.225372 -0.973079 0.0480926 -0.224432 -0.973302 0.0477388 -0.224174 -0.973379 
+0.0478791 -0.223436 -0.973542 0.0472664 -0.222991 -0.973674 0.0476675 -0.222448 -0.973778 
+0.0468014 -0.221822 -0.973963 0.0474577 -0.221469 -0.974012 0.0463435 -0.220666 -0.974248 
+0.0458925 -0.219523 -0.974527 0.0454483 -0.218394 -0.974802 0.0450109 -0.217277 -0.975072 
+0.04458 -0.216173 -0.975337 0.0441555 -0.215081 -0.975598 0.0437372 -0.214001 -0.975854 
+0.0433252 -0.212933 -0.976106 0.0429191 -0.211877 -0.976353 0.042519 -0.210833 -0.976597 
+0.0421246 -0.2098 -0.976837 0.0417359 -0.208778 -0.977072 0.0413528 -0.207766 -0.977304 
+0.0473881 -0.221145 -0.974089 0.0472496 -0.220498 -0.974242 0.0470793 -0.220376 -0.974278 
+0.0470434 -0.219536 -0.97447 0.046622 -0.219234 -0.974558 0.0468388 -0.218581 -0.974694 
+0.0461716 -0.218105 -0.974832 0.046636 -0.217635 -0.974915 0.045728 -0.216989 -0.975102 
+0.045291 -0.215886 -0.975368 0.0448605 -0.214795 -0.975628 0.0444363 -0.213716 -0.975885 
+0.0440184 -0.212649 -0.976137 0.0436066 -0.211594 -0.976384 0.0432008 -0.21055 -0.976628 
+0.0428008 -0.209518 -0.976868 0.0424066 -0.208496 -0.977103 0.0462355 -0.215766 -0.97535 
+0.045992 -0.215594 -0.975399 0.0460378 -0.214843 -0.975563 0.0455556 -0.214504 -0.97566 
+0.0458417 -0.213928 -0.975773 0.0451257 -0.213426 -0.975917 0.0456472 -0.21302 -0.975981 
+0.044702 -0.21236 -0.976169 0.0442846 -0.211305 -0.976416 0.0438732 -0.210262 -0.97666 
+0.0434677 -0.209231 -0.9769 0.0455185 -0.212419 -0.976118 0.0454543 -0.21212 -0.976186 
+0.0453761 -0.212066 -0.976201 0.045263 -0.211228 -0.976388 0.0449531 -0.211012 -0.976449 
+0.0450733 -0.210342 -0.976588 0.0445362 -0.209971 -0.976693 0.0463845 -0.255811 -0.965613 
+0.0458594 -0.254286 -0.966041 0.0453436 -0.252782 -0.96646 0.0448367 -0.251296 -0.966871 
+0.0443386 -0.24983 -0.967274 0.0438491 -0.248382 -0.967669 0.0433679 -0.246953 -0.968056 
+0.0428949 -0.245542 -0.968436 0.0424299 -0.244148 -0.968809 0.048025 -0.257171 -0.965172 
+0.0474786 -0.255624 -0.96561 0.0469419 -0.254097 -0.966039 0.0464146 -0.25259 -0.96646 
+0.0458965 -0.251102 -0.966872 0.0453874 -0.249634 -0.967276 0.044887 -0.248185 -0.967672 
+0.0443951 -0.246754 -0.968061 0.0439116 -0.245341 -0.968442 0.0434363 -0.243945 -0.968816 
+0.0429689 -0.242568 -0.969182 0.0425093 -0.241207 -0.969542 0.0420573 -0.239863 -0.969895 
+0.0416127 -0.238535 -0.970242 0.0411754 -0.237223 -0.970582 0.0502108 -0.258982 -0.964576 
+0.0496828 -0.258545 -0.964721 0.0499561 -0.257668 -0.964941 0.0491147 -0.256974 -0.965169 
+0.0497038 -0.256367 -0.965301 0.0485568 -0.255425 -0.965609 0.049454 -0.255079 -0.965655 
+0.0480087 -0.253895 -0.966039 0.0474702 -0.252386 -0.966461 0.0469411 -0.250897 -0.966875 
+0.0464211 -0.249427 -0.96728 0.04591 -0.247976 -0.967678 0.0454077 -0.246544 -0.968067 
+0.0449138 -0.245129 -0.96845 0.0444283 -0.243733 -0.968824 0.043951 -0.242353 -0.969192 
+0.0434815 -0.240991 -0.969553 0.0430199 -0.239646 -0.969907 0.0425658 -0.238317 -0.970254 
+0.0421191 -0.237004 -0.970595 0.0416797 -0.235707 -0.97093 0.0412474 -0.234426 -0.971259 
+0.0408221 -0.23316 -0.971581 0.0404035 -0.231909 -0.971898 0.0493235 -0.254405 -0.965839 
+0.0492066 -0.253803 -0.966004 0.0490598 -0.253683 -0.966043 0.0489616 -0.252539 -0.966347 
+0.0485103 -0.252172 -0.966466 0.0487189 -0.251287 -0.966686 0.0479704 -0.250681 -0.96688 
+0.0484785 -0.250047 -0.967019 0.0474398 -0.24921 -0.967287 0.0482404 -0.248819 -0.967348 
+0.0469183 -0.247757 -0.967685 0.0464057 -0.246323 -0.968076 0.0459017 -0.244908 -0.968459 
+0.0454063 -0.24351 -0.968835 0.0449191 -0.24213 -0.969204 0.0444401 -0.240766 -0.969565 
+0.043969 -0.23942 -0.96992 0.0435056 -0.23809 -0.970268 0.0430497 -0.236776 -0.97061 
+0.0426013 -0.235479 -0.970945 0.0421601 -0.234196 -0.971275 0.0417259 -0.232929 -0.971598 
+0.0412987 -0.231677 -0.971916 0.0408783 -0.23044 -0.972228 0.0404644 -0.229217 -0.972534 
+0.0400571 -0.228009 -0.972835 0.0396561 -0.226814 -0.97313 0.0392613 -0.225633 -0.973421 
+0.0480788 -0.247986 -0.96757 0.0480046 -0.247603 -0.967672 0.0479119 -0.247529 -0.967695 
+0.047771 -0.246398 -0.967991 0.0473892 -0.246093 -0.968087 0.0475395 -0.245204 -0.968305 
+0.0468754 -0.244677 -0.968471 0.0473103 -0.244021 -0.968615 0.0463702 -0.243278 -0.968848 
+0.0470831 -0.24285 -0.968921 0.0458735 -0.241897 -0.969217 0.045385 -0.240532 -0.969579 
+0.0449046 -0.239185 -0.969935 0.044432 -0.237855 -0.970284 0.0439672 -0.23654 -0.970626 
+0.0435099 -0.235242 -0.970963 0.04306 -0.233959 -0.971293 0.0426173 -0.232691 -0.971617 
+0.0421816 -0.231438 -0.971935 0.0417528 -0.230201 -0.972247 0.0413308 -0.228977 -0.972554 
+0.0409153 -0.227768 -0.972855 0.0405064 -0.226573 -0.973152 0.0401037 -0.225392 -0.973443 
+0.0397073 -0.224224 -0.973728 0.0393169 -0.223069 -0.97401 0.0389324 -0.221927 -0.974286 
+0.0385537 -0.220798 -0.974557 0.0381808 -0.219681 -0.974824 0.0468934 -0.241871 -0.969175 
+0.046858 -0.241689 -0.969222 0.0468141 -0.241654 -0.969232 0.0466351 -0.240539 -0.969519 
+0.0463164 -0.24029 -0.969596 0.0464141 -0.239399 -0.969811 0.0458268 -0.238942 -0.969952 
+0.0461952 -0.23827 -0.9701 0.0453454 -0.23761 -0.970302 0.0459783 -0.237151 -0.970384 
+0.0448717 -0.236295 -0.970645 0.0444057 -0.234996 -0.970981 0.0439473 -0.233713 -0.971312 
+0.0434961 -0.232445 -0.971636 0.0430522 -0.231192 -0.971955 0.0426152 -0.229954 -0.972268 
+0.0421851 -0.22873 -0.972575 0.0417618 -0.227521 -0.972877 0.041345 -0.226325 -0.973174 
+0.0409347 -0.225143 -0.973465 0.0405306 -0.223975 -0.973752 0.0401328 -0.22282 -0.974033 
+0.0397409 -0.221678 -0.97431 0.039355 -0.220549 -0.974582 0.0389749 -0.219432 -0.974849 
+0.0386005 -0.218328 -0.975112 0.0382316 -0.217236 -0.97537 0.0378682 -0.216156 -0.975624 
+0.0375101 -0.215087 -0.975874 0.0371572 -0.21403 -0.97612 0.0457633 -0.236042 -0.970665 
+0.0457633 -0.236042 -0.970665 0.0457633 -0.236042 -0.970665 0.0455503 -0.234944 -0.970941 
+0.0452889 -0.234743 -0.971002 0.0453392 -0.233855 -0.971214 0.044822 -0.233459 -0.971333 
+0.04513 -0.232776 -0.971483 0.0443626 -0.232191 -0.971658 0.0449227 -0.231706 -0.971748 
+0.0439105 -0.230938 -0.971977 0.0447171 -0.230646 -0.97201 0.0434656 -0.229699 -0.972291 
+0.0430276 -0.228476 -0.972598 0.0425965 -0.227266 -0.972901 0.0421721 -0.22607 -0.973198 
+0.0417542 -0.224889 -0.973489 0.0413428 -0.22372 -0.973776 0.0409376 -0.222565 -0.974058 
+0.0405385 -0.221423 -0.974335 0.0401455 -0.220294 -0.974607 0.0397584 -0.219177 -0.974875 
+0.039377 -0.218073 -0.975138 0.0390013 -0.216981 -0.975396 0.0386312 -0.215901 -0.975651 
+0.0382665 -0.214833 -0.975901 0.0379071 -0.213776 -0.976147 0.0375529 -0.21273 -0.976389 
+0.0372038 -0.211696 -0.976627 0.0368597 -0.210672 -0.976862 0.0365206 -0.209659 -0.977092 
+0.0446849 -0.23048 -0.972051 0.0445135 -0.229596 -0.972268 0.0443041 -0.229438 -0.972314 
+0.0443116 -0.228554 -0.972522 0.0438584 -0.228214 -0.972623 0.0441114 -0.227522 -0.972773 
+0.0434196 -0.227004 -0.972925 0.0439131 -0.226499 -0.973021 0.0429877 -0.225809 -0.973223 
+0.0437164 -0.225485 -0.973265 0.0425625 -0.224627 -0.973515 0.0421437 -0.223459 -0.973802 
+0.0417313 -0.222304 -0.974084 0.0413252 -0.221162 -0.974361 0.0409252 -0.220033 -0.974634 
+0.0405312 -0.218917 -0.974901 0.0401431 -0.217813 -0.975165 0.0397607 -0.216721 -0.975424 
+0.039384 -0.215641 -0.975678 0.0390127 -0.214573 -0.975929 0.0386469 -0.213516 -0.976175 
+0.0382864 -0.212471 -0.976417 0.0379311 -0.211436 -0.976655 0.0375809 -0.210413 -0.97689 
+0.0372357 -0.209401 -0.977121 0.0368954 -0.208399 -0.977348 0.0365598 -0.207408 -0.977571 
+0.036229 -0.206426 -0.977791 0.0359029 -0.205455 -0.978008 0.0355812 -0.204494 -0.978221 
+0.0436547 -0.225166 -0.973342 0.0435215 -0.224479 -0.973507 0.0433595 -0.224359 -0.973541 
+0.0433282 -0.223482 -0.973744 0.0429336 -0.223191 -0.973829 0.0431366 -0.222494 -0.973979 
+0.0425142 -0.222037 -0.974111 0.0429467 -0.221514 -0.974211 0.0421011 -0.220895 -0.974388 
+0.0427583 -0.220543 -0.97444 0.0416943 -0.219766 -0.974661 0.0412936 -0.21865 -0.974929 
+0.0408988 -0.217546 -0.975193 0.0405098 -0.216455 -0.975452 0.0401266 -0.215375 -0.975707 
+0.039749 -0.214307 -0.975957 0.0393769 -0.213251 -0.976204 0.0390102 -0.212206 -0.976446 
+0.0386488 -0.211172 -0.976685 0.0382925 -0.210149 -0.976919 0.0379414 -0.209137 -0.97715 
+0.0375952 -0.208136 -0.977377 0.0372538 -0.207145 -0.977601 0.0369173 -0.206165 -0.977821 
+0.0365855 -0.205194 -0.978037 0.0362583 -0.204233 -0.978251 0.0426697 -0.220086 -0.974547 
+0.0425716 -0.21958 -0.974665 0.0424528 -0.219493 -0.97469 0.0423864 -0.218625 -0.974888 
+0.0420454 -0.218378 -0.974958 0.0422028 -0.217678 -0.975108 0.0416442 -0.217274 -0.975222 
+0.0420208 -0.216739 -0.975325 0.0412488 -0.216183 -0.975481 0.0418403 -0.215808 -0.975539 
+0.0408592 -0.215104 -0.975736 0.0404754 -0.214037 -0.975987 0.0400971 -0.212981 -0.976233 
+0.0397243 -0.211936 -0.976476 0.0393569 -0.210903 -0.976714 0.0389947 -0.209881 -0.976949 
+0.0386377 -0.208869 -0.97718 0.0382858 -0.207869 -0.977407 0.0379388 -0.206878 -0.977631 
+0.0375966 -0.205898 -0.977851 0.0372592 -0.204928 -0.978068 0.041727 -0.215224 -0.975673 
+0.0416613 -0.214884 -0.975751 0.0415819 -0.214828 -0.975766 0.0414837 -0.213969 -0.975959 
+0.0411919 -0.213761 -0.976017 0.0413077 -0.213061 -0.976165 0.0408076 -0.212706 -0.976264 
+0.0411331 -0.21216 -0.976369 0.0404289 -0.211662 -0.976506 0.0409599 -0.211267 -0.97657 
+0.0400556 -0.210629 -0.976745 0.0396876 -0.209607 -0.97698 0.0393248 -0.208597 -0.977211 
+0.0389672 -0.207596 -0.977438 0.0386146 -0.206607 -0.977662 0.038267 -0.205627 -0.977882 
+0.0408242 -0.210567 -0.976727 0.0407881 -0.210381 -0.976768 0.0407448 -0.21035 -0.976777 
+0.0406178 -0.209502 -0.976964 0.0403711 -0.209329 -0.977011 0.0404488 -0.208631 -0.977158 
+0.0400028 -0.208319 -0.977242 0.0402812 -0.207766 -0.977349 0.0396396 -0.20732 -0.97747 
+0.0401149 -0.206909 -0.977538 0.0392816 -0.206331 -0.977693 0.0422677 -0.243661 -0.968939 
+0.0421363 -0.242903 -0.969135 0.041976 -0.242775 -0.969174 0.0419348 -0.241742 -0.969434 
+0.0415314 -0.24142 -0.969532 0.0417352 -0.240591 -0.969729 0.0410941 -0.240081 -0.969883 
+0.0415374 -0.239451 -0.97002 0.0406638 -0.238758 -0.970227 0.0413414 -0.238321 -0.970306 
+0.0402406 -0.237451 -0.970566 0.0411472 -0.237201 -0.970589 0.0398241 -0.23616 -0.970898 
+0.0394143 -0.234884 -0.971224 0.039011 -0.233623 -0.971544 0.038614 -0.232377 -0.971859 
+0.0382233 -0.231145 -0.972168 0.0378387 -0.229927 -0.972472 0.0374601 -0.228723 -0.972771 
+0.0370873 -0.227533 -0.973064 0.0367202 -0.226356 -0.973352 0.0363588 -0.225193 -0.973636 
+0.0360028 -0.224042 -0.973914 0.0356521 -0.222904 -0.974188 0.0353068 -0.221779 -0.974458 
+0.0349666 -0.220666 -0.974722 0.0346314 -0.219565 -0.974983 0.0343012 -0.218476 -0.975239 
+0.0339758 -0.217399 -0.975491 0.0336552 -0.216333 -0.975739 0.0333392 -0.215278 -0.975984 
+0.0330278 -0.214234 -0.976224 0.0327209 -0.213202 -0.97646 0.0411244 -0.23707 -0.970622 
+0.0409547 -0.236092 -0.970867 0.0407493 -0.235931 -0.970915 0.040764 -0.234992 -0.971142 
+0.0403306 -0.234654 -0.971242 0.040575 -0.233903 -0.971413 0.0399185 -0.233392 -0.971563 
+0.0403877 -0.232823 -0.97168 0.0395129 -0.232145 -0.971878 0.040202 -0.231753 -0.971944 
+0.0391137 -0.230912 -0.972188 0.0387207 -0.229694 -0.972492 0.0383338 -0.228489 -0.972791 
+0.0379529 -0.227299 -0.973085 0.0375778 -0.226121 -0.973374 0.0372084 -0.224957 -0.973658 
+0.0368447 -0.223806 -0.973937 0.0364864 -0.222668 -0.974211 0.0361335 -0.221542 -0.974481 
+0.0357858 -0.220429 -0.974746 0.0354433 -0.219328 -0.975007 0.0351059 -0.218238 -0.975264 
+0.0347733 -0.217161 -0.975516 0.0344457 -0.216094 -0.975765 0.0341228 -0.215039 -0.976009 
+0.0338046 -0.213996 -0.97625 0.0334909 -0.212963 -0.976486 0.0331817 -0.211941 -0.976719 
+0.0328769 -0.210929 -0.976948 0.0325764 -0.209928 -0.977174 0.0322801 -0.208938 -0.977396 
+0.031988 -0.207957 -0.977615 0.0317 -0.206986 -0.97783 0.0400396 -0.230817 -0.972173 
+0.0400181 -0.230692 -0.972203 0.039992 -0.230672 -0.972209 0.0398357 -0.229641 -0.97246 
+0.0395908 -0.229453 -0.972514 0.039655 -0.228599 -0.972713 0.0391958 -0.228248 -0.972814 
+0.0394758 -0.227566 -0.972962 0.0388069 -0.227057 -0.973108 0.0392982 -0.226543 -0.973208 
+0.0384239 -0.22588 -0.973397 0.0391221 -0.225528 -0.973451 0.0380468 -0.224715 -0.973681 
+0.0376754 -0.223564 -0.973961 0.0373096 -0.222425 -0.974236 0.0369492 -0.221299 -0.974506 
+0.0365943 -0.220185 -0.974771 0.0362446 -0.219084 -0.975033 0.0359 -0.217994 -0.97529 
+0.0355605 -0.216917 -0.975542 0.0352259 -0.21585 -0.975791 0.0348962 -0.214795 -0.976035 
+0.0345713 -0.213751 -0.976276 0.034251 -0.212719 -0.976513 0.0339353 -0.211697 -0.976746 
+0.033624 -0.210685 -0.976976 0.0333172 -0.209684 -0.977201 0.0330146 -0.208693 -0.977424 
+0.0327163 -0.207713 -0.977643 0.0324221 -0.206742 -0.977858 0.032132 -0.205781 -0.97807 
+0.0318459 -0.20483 -0.978279 0.0315638 -0.203888 -0.978485 0.0312854 -0.202956 -0.978688 
+0.0310108 -0.202032 -0.978888 0.039009 -0.224876 -0.973606 0.0389476 -0.224522 -0.97369 
+0.0388739 -0.224466 -0.973706 0.0387746 -0.223524 -0.973927 0.038495 -0.223315 -0.973986 
+0.0386031 -0.222535 -0.97416 0.0381218 -0.222176 -0.974261 0.038433 -0.221555 -0.97439 
+0.0377542 -0.22105 -0.974532 0.0382644 -0.220583 -0.974617 0.0373921 -0.219936 -0.974797 
+0.0380973 -0.219619 -0.974841 0.0370353 -0.218834 -0.975059 0.0366837 -0.217745 -0.975316 
+0.0363374 -0.216667 -0.975569 0.035996 -0.2156 -0.975818 0.0356596 -0.214545 -0.976063 
+0.0353281 -0.213502 -0.976304 0.0350013 -0.212469 -0.976541 0.0346791 -0.211447 -0.976774 
+0.0343616 -0.210436 -0.977004 0.0340485 -0.209435 -0.97723 0.0337398 -0.208444 -0.977452 
+0.0334354 -0.207464 -0.977671 0.0331352 -0.206493 -0.977887 0.0328392 -0.205532 -0.978099 
+0.0325472 -0.204581 -0.978308 0.0322593 -0.20364 -0.978514 0.0319753 -0.202708 -0.978717 
+0.0316951 -0.201785 -0.978917 0.0314187 -0.200871 -0.979114 0.0380288 -0.219225 -0.974933 
+0.0379315 -0.218664 -0.975063 0.0378155 -0.218579 -0.975086 0.0377671 -0.217717 -0.975281 
+0.0374572 -0.217489 -0.975344 0.0376042 -0.216777 -0.975497 0.037104 -0.216411 -0.975597 
+0.0374426 -0.215845 -0.975709 0.036756 -0.215345 -0.975846 0.0372823 -0.214922 -0.975919 
+0.0364131 -0.21429 -0.976091 0.0371234 -0.214005 -0.976127 0.036075 -0.213247 -0.976332 
+0.0357418 -0.212214 -0.976569 0.0354134 -0.211192 -0.976803 0.0350896 -0.210181 -0.977033 
+0.0347704 -0.20918 -0.977259 0.0344556 -0.20819 -0.977481 0.0341453 -0.20721 -0.9777 
+0.0338392 -0.20624 -0.977916 0.0335374 -0.205279 -0.978129 0.0332397 -0.204328 -0.978338 
+0.0329461 -0.203387 -0.978544 0.0326565 -0.202455 -0.978747 0.0323708 -0.201533 -0.978947 
+0.0370955 -0.213845 -0.976163 0.0369658 -0.213097 -0.976332 0.0368122 -0.212986 -0.976362 
+0.0368095 -0.212196 -0.976534 0.0364728 -0.211954 -0.976599 0.0366544 -0.211302 -0.976733 
+0.0361382 -0.210932 -0.976832 0.0365007 -0.210416 -0.97693 0.0358083 -0.209922 -0.977062 
+0.0363482 -0.209537 -0.977125 0.035483 -0.208921 -0.977289 0.0351623 -0.207931 -0.977511 
+0.0348461 -0.206951 -0.97773 0.0345343 -0.205982 -0.977946 0.0342267 -0.205021 -0.978159 
+0.0339234 -0.204071 -0.978368 0.0336243 -0.20313 -0.978574 0.0333292 -0.202199 -0.978777 
+0.0362058 -0.208716 -0.977306 0.0361969 -0.208665 -0.977317 0.0361864 -0.208657 -0.977319 
+0.0360469 -0.2078 -0.977507 0.0358599 -0.207668 -0.977542 0.0358981 -0.206942 -0.977694 
+0.035538 -0.206688 -0.977761 0.0357504 -0.206091 -0.97788 0.0352204 -0.205719 -0.977977 
+0.035604 -0.205247 -0.978063 0.0349073 -0.204759 -0.97819 0.0354587 -0.204409 -0.978243 
+0.0345985 -0.203809 -0.978399 0.0342938 -0.202869 -0.978605 0.0353568 -0.203822 -0.978369 
+0.0353146 -0.203578 -0.978422 0.0352649 -0.203544 -0.978431 0.0325389 -0.212587 -0.9766 
+0.0324838 -0.212228 -0.97668 0.0324195 -0.212181 -0.976693 0.032347 -0.211334 -0.976879 
+0.0321241 -0.211171 -0.976921 0.0322112 -0.210447 -0.977075 0.0318328 -0.210172 -0.977146 
+0.0320766 -0.209567 -0.977268 0.0315456 -0.209184 -0.977367 0.0319431 -0.208695 -0.977459 
+0.0312624 -0.208205 -0.977586 0.0318107 -0.20783 -0.977648 0.030983 -0.207236 -0.9778 
+0.0316793 -0.206971 -0.977834 0.0307075 -0.206276 -0.978012 0.0304358 -0.205326 -0.97822 
+0.0301677 -0.204386 -0.978425 0.0299033 -0.203455 -0.978628 0.0296424 -0.202533 -0.978827 
+0.0293851 -0.20162 -0.979023 0.0291311 -0.200715 -0.979216 0.0288805 -0.199819 -0.979407 
+0.0286332 -0.198932 -0.979595 0.0316618 -0.206857 -0.977859 0.031549 -0.20612 -0.978018 
+0.0314182 -0.206027 -0.978042 0.0314197 -0.205275 -0.9782 0.0311405 -0.205077 -0.97825 
+0.0312915 -0.204437 -0.978379 0.0308667 -0.204137 -0.978456 0.0311642 -0.203606 -0.978557 
+0.0305966 -0.203206 -0.978658 0.031038 -0.202782 -0.978732 0.0303301 -0.202284 -0.978857 
+0.0309128 -0.201964 -0.978905 0.0300671 -0.201371 -0.979053 0.0298077 -0.200467 -0.979247 
+0.0295516 -0.199572 -0.979438 0.0308299 -0.201422 -0.979019 0.0307886 -0.201152 -0.979076 
+0.0307408 -0.201119 -0.979084 0.0306653 -0.200347 -0.979245 0.0304759 -0.200215 -0.979278 
+
diff --git a/vistrails/tests/run_on_mac.sh b/vistrails/tests/run_on_mac.sh
new file mode 100755
index 0000000..de4deda
--- /dev/null
+++ b/vistrails/tests/run_on_mac.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+if [ -z "$1" ]
+then
+    echo "usage: $0 <app_path>"
+    exit 65
+fi
+
+THIS_DIR=`dirname $0`
+PYTHON_EXEC_PATH="Contents/MacOS/python"
+RESOURCES_PATH="Contents/Resources"
+
+if [ ! -e "$1/$RESOURCES_PATH" ]
+then
+    echo "$1/$RESOURCES_PATH does not exist"
+    exit 66
+fi
+
+if [ ! -e "$1/$PYTHON_EXEC_PATH" ]
+then
+    echo "$1/$PYTHON_EXEC_PATH does not exist"
+    exit 67
+fi
+
+PYTHONHOME="$1/$RESOURCES_PATH" ${1}/${PYTHON_EXEC_PATH} ${THIS_DIR}/runtestsuite.py
diff --git a/vistrails/tests/runtestsuite.py b/vistrails/tests/runtestsuite.py
new file mode 100755
index 0000000..8c9f055
--- /dev/null
+++ b/vistrails/tests/runtestsuite.py
@@ -0,0 +1,484 @@
+#!/usr/bin/env python
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+
+"""Runs all tests available in VisTrails modules by importing all of
+them, stealing the classes that look like unit tests, and running
+all of them.
+
+runtestsuite.py also reports all VisTrails modules that don't export
+any unit tests, as a crude measure of code coverage.
+
+"""
+
+# First, import unittest, replacing it with unittest2 if necessary
+import sys
+try:
+    import unittest2
+except ImportError:
+    pass
+else:
+    sys.modules['unittest'] = unittest2
+import unittest
+
+import atexit
+from distutils.version import LooseVersion
+#import doctest
+import os
+import traceback
+import os.path
+import optparse
+from optparse import OptionParser
+import platform
+import shutil
+import tempfile
+
+# Makes sure we can import modules as if we were running VisTrails
+# from the root directory
+_this_dir = os.path.dirname(os.path.realpath(__file__))
+root_directory = os.path.realpath(os.path.join(_this_dir,  '..'))
+sys.path.insert(0, os.path.realpath(os.path.join(root_directory, '..')))
+
+# Use a different temporary directory
+test_temp_dir = tempfile.mkdtemp(prefix='vt_testsuite_')
+tempfile.tempdir = test_temp_dir
+ at atexit.register
+def clean_tempdir():
+    nb_dirs = 0
+    nb_files = 0
+    for f in os.listdir(test_temp_dir):
+        if os.path.isdir(f):
+            nb_dirs += 1
+        else:
+            nb_files += 1
+    if nb_dirs > 0 or nb_files > 0:
+        sys.stdout.write("Warning: %d dirs and %d files were left behind in "
+                         "tempdir, cleaning up\n" % (nb_dirs, nb_files))
+    shutil.rmtree(test_temp_dir, ignore_errors=True)
+
+def setNewPyQtAPI():
+    try:
+        import sip
+        # We now use the new PyQt API - IPython needs it
+        sip.setapi('QString', 2)
+        sip.setapi('QVariant', 2)
+    except:
+        print "Could not set PyQt API, is PyQt4 installed?"
+setNewPyQtAPI()
+
+import vistrails.tests
+import vistrails.core
+import vistrails.core.db.io
+import vistrails.core.db.locator
+import vistrails.gui.application
+from vistrails.core.system import vistrails_root_directory, \
+                                  vistrails_examples_directory
+
+###############################################################################
+# Testing Examples
+
+EXAMPLES_PATH = vistrails_examples_directory()
+#dictionary of examples that will be run with the workflows that will be ignored
+VT_EXAMPLES = { 'EMBOSS_webservices.vt': ["ProphetOutput"],
+                'KEGGPathway.vt': [],
+                'KEGG_SearchEntities_webservice.vt': [],
+                'KEGG_webservices.vt': [],
+                'brain_vistrail.vt': [],
+                'chebi_webservice.vt': [],
+                'head.vt': [],
+                'infovis.vt': [],
+                'noaa_webservices.vt': [],
+                'offscreen.vt': [],
+                'plot.vt': [],
+                'spx.vt': [],
+                'structure_or_id_webservice.vt': [],
+                'terminator.vt': ["Isosurface Script"],
+                'triangle_area.vt': [],
+                'vtk.vt': [],
+                'vtk_book_3rd_p189.vt': ["quadric", "SmapleFunction",
+                                         "Almost there"],
+                'vtk_book_3rd_p193.vt': ["modules", "connections",
+                                         "lookup table"],
+                'vtk_http.vt': [],
+    }
+
+
+###############################################################################
+# Utility
+
+def sub_print(s, overline=False):
+    """Prints line with underline (and optionally overline) ASCII dashes."""
+    if overline:
+        print "-" * len(s)
+    print s
+    print "-" * len(s)
+
+###############################################################################
+
+usage = "Usage: %prog [options] [module1 module2 ...]"
+parser = OptionParser(usage=usage)
+parser.add_option("-V", "--verbose", action="store", type="int",
+                  default=0, dest="verbose",
+                  help="set verboseness level(0--2, default=0, "
+                  "higher means more verbose)")
+parser.add_option("-e", "--examples", action="store_true",
+                  default=False,
+                  help="run vistrails examples")
+parser.add_option("-i", "--images", action="store_true",
+                  default=False,
+                  help="perform image comparisons")
+parser.add_option("--installbundles", action='store_true',
+                  default=False,
+                  help=("Attempt to install missing Python packages "
+                        "automatically"))
+parser.add_option("-S", "--startup", action="store", type="str", default=None,
+                  dest="dotVistrails",
+                  help="Set startup file (default is temporary directory)")
+
+(options, args) = parser.parse_args()
+# remove empty strings
+args = filter(len, args)
+verbose = options.verbose
+test_examples = options.examples
+test_images = options.images
+installbundles = options.installbundles
+dotVistrails = options.dotVistrails
+test_modules = None
+if len(args) > 0:
+    test_modules = args
+else:
+    test_images = True
+
+def module_filter(name):
+    if test_modules is None:
+        return True
+    for mod in test_modules:
+        if name.startswith(mod):
+            return True
+    return False
+
+###############################################################################
+# reinitializing arguments and options so VisTrails does not try parsing them
+sys.argv = sys.argv[:1]
+
+# creates the app so that testing can happen
+
+# We need the windows so we can test events, etc.
+optionsDict = {
+        'interactiveMode': True,
+        'nologger': True,
+        'singleInstance': False,
+        'fixedSpreadsheetCells': True,
+        'installBundles': installbundles,
+        'enablePackagesSilently': True,
+        'handlerDontAsk': True,
+    }
+if dotVistrails:
+    optionsDict['dotVistrails'] = dotVistrails
+else:
+    optionsDict['spawned'] = True
+v = vistrails.gui.application.start_application(optionsDict)
+if v != 0:
+    app = vistrails.gui.application.get_vistrails_application()
+    if app:
+        app.finishSession()
+    sys.exit(v)
+
+# disable first vistrail
+app = vistrails.gui.application.get_vistrails_application()
+app.builderWindow.auto_view = False
+app.builderWindow.close_all_vistrails(True)
+
+print "Test Suite for VisTrails"
+print "Running on %s" % ', '.join(platform.uname())
+print "Python is %s" % sys.version
+try:
+    from PyQt4 import QtCore
+    print "Using PyQt4 %s with Qt %s" % (QtCore.PYQT_VERSION_STR, QtCore.qVersion())
+except ImportError:
+    print "PyQt4 not available"
+for pkg in ('numpy', 'scipy', 'matplotlib'):
+    try:
+        ipkg = __import__(pkg, globals(), locals(), [], -1)
+        print "Using %s %s" % (pkg, ipkg.__version__)
+    except ImportError:
+        print "%s not available" % pkg
+try:
+    import vtk
+    print "Using vtk %s" % vtk.vtkVersion().GetVTKVersion()
+except ImportError:
+    print "vtk not available"
+
+
+print ""
+
+tests_passed = True
+
+main_test_suite = unittest.TestSuite()
+test_loader = unittest.TestLoader()
+
+if test_modules:
+    sub_print("Trying to import some of the modules")
+else:
+    sub_print("Trying to import all modules")
+
+for (p, subdirs, files) in os.walk(root_directory):
+    # skip subversion subdirectories
+    if p.find('.svn') != -1 or p.find('.git') != -1 :
+        continue
+    for filename in files:
+        # skip files that don't look like VisTrails python modules
+        if not filename.endswith('.py'):
+            continue
+        module = os.path.join("vistrails", p[len(root_directory)+1:],
+                              filename[:-3])
+        if (module.startswith(os.sep) or
+            ('#' in module)):
+            continue
+
+        # use qualified import names with periods instead of
+        # slashes to avoid duplicates in sys.modules
+        module = module.replace('/','.')
+        module = module.replace('\\','.')
+        if module.endswith('__init__'):
+            module = module[:-9]
+
+        if not module_filter(module):
+            continue
+        if module.startswith('vistrails.tests.run'):
+            continue
+        if module.startswith('vistrails.tests.resources'):
+            continue
+        if ('.system.' in module and not
+            module.endswith('__init__')):
+            continue
+
+        msg = ("%s %s |" % (" " * (40 - len(module)), module))
+
+        m = None
+        try:
+            if '.' in module:
+                m = __import__(module, globals(), locals(), ['foo'])
+            else:
+                m = __import__(module)
+        except vistrails.tests.NotModule:
+            if verbose >= 1:
+                print "Skipping %s, not an importable module" % filename
+            continue
+        except:
+            print msg, "ERROR: Could not import module!"
+            if verbose >= 1:
+                traceback.print_exc(file=sys.stdout)
+            continue
+
+        # Load the unittest TestCases
+        suite = test_loader.loadTestsFromModule(m)
+
+        # Load the doctests
+        #try:
+        #    suite.addTests(doctest.DocTestSuite(m))
+        #except ValueError:
+        #    pass # No doctest is fine, we check that some tests exist later
+        # The doctests are currently opt-in; a load_tests method can be
+        # defined to build a DocTestSuite
+        # This is because some modules have interpreter-formatted examples that
+        # are NOT doctests, and because mining the codebase for doctests is
+        # painfully slow
+
+        main_test_suite.addTests(suite)
+
+        if suite.countTestCases() == 0 and verbose >= 1:
+            print msg, "WARNING: %s has no tests!" % filename
+        elif verbose >= 2:
+            print msg, "Ok: %d test cases." % suite.countTestCases()
+
+sub_print("Imported modules. Running %d tests%s..." % (
+          main_test_suite.countTestCases(),
+          ", and thumbnails comparison" if test_images else ''),
+          overline=True)
+
+############## TEST VISTRAIL IMAGES ####################
+# Compares thumbnails with the generated images to detect broken visualizations
+
+image_tests = [("terminator.vt", [("terminator_isosurface", "Isosurface"),
+                                  ("terminator_VRSW", "Volume Rendering SW"),
+                                  ("terminator_CPSW", "Clipping Plane SW"),
+                                  ("terminator_CRSW", "Combined Rendering SW"),
+                                  ("terminator_ISSW", "Image Slices SW")])
+               ]
+compare_use_vtk = False
+try:
+    import vtk
+    if LooseVersion(vtk.vtkVersion().GetVTKVersion()) >= LooseVersion('5.8.0'):
+        compare_use_vtk = True
+except ImportError:
+    pass
+if compare_use_vtk:
+    def compare_thumbnails(prev, next):
+        #vtkImageDifference assumes RGB, so strip alpha
+        def removeAlpha(file):
+            freader = vtk.vtkPNGReader()
+            freader.SetFileName(file)
+            removealpha = vtk.vtkImageExtractComponents()
+            removealpha.SetComponents(0,1,2)
+            removealpha.SetInputConnection(freader.GetOutputPort())
+            removealpha.Update()
+            return removealpha.GetOutput()
+        #do the image comparison
+        a = removeAlpha(prev)
+        b = removeAlpha(next)
+        idiff = vtk.vtkImageDifference()
+        idiff.SetInput(a)
+        idiff.SetImage(b)
+        idiff.Update()
+        return idiff.GetThresholdedError()
+else:
+    try:
+        from scipy.misc import imread
+    except ImportError:
+        imread = None
+    if test_images:
+        print "Warning: old VTK version detected, NOT comparing thumbnails"
+    if imread is not None:
+        def compare_thumbnails(prev, next):
+            prev_img = imread(prev)
+            next_img = imread(next)
+            assert len(prev_img.shape) == 3
+            assert len(next_img.shape) == 3
+            if prev_img.shape[:2] == next_img.shape[:2]:
+                return 0
+            else:
+                return float('Inf')
+    else:
+        def compare_thumbnails(prev, next):
+            if os.path.isfile(prev) and os.path.isfile(next):
+                return 0
+            else:
+                return float('Inf')
+
+def image_test_generator(vtfile, version):
+    from vistrails.core.db.locator import FileLocator
+    from vistrails.core.db.io import load_vistrail
+    import vistrails.core.console_mode
+    def test(self):
+        try:
+            errs = []
+            filename = os.path.join(EXAMPLES_PATH, vtfile)
+            locator = FileLocator(os.path.abspath(filename))
+            (v, abstractions, thumbnails, mashups) = load_vistrail(locator)
+            errs = vistrails.core.console_mode.run(
+                    [(locator, version)],
+                    update_vistrail=False,
+                    extra_info={'compare_thumbnails': compare_thumbnails})
+            if len(errs) > 0:
+                for err in errs:
+                    print("   *** Error in %s:%s:%s -- %s" % err)
+                    self.fail(str(err))
+        except Exception, e:
+            self.fail(str(e))
+    return test
+
+class TestVistrailImages(unittest.TestCase):
+    pass
+
+if test_images:
+    for vt, t in image_tests:
+        for name, version in t:
+            test_name = 'test_%s' % name
+            test = image_test_generator(vt, version)
+            setattr(TestVistrailImages, test_name, test)
+            main_test_suite.addTest(TestVistrailImages(test_name))
+
+############## RUN TEST SUITE ####################
+
+result = unittest.TextTestRunner(verbosity=max(verbose, 1)).run(main_test_suite)
+
+if not result.wasSuccessful():
+    tests_passed = False
+
+sub_print("Tests finished.", overline=True)
+
+if test_examples:
+    import vistrails.core.console_mode
+    sub_print("Testing examples:")
+    summary = {}
+    nworkflows = 0
+    nvtfiles = 0
+    for vtfile in VT_EXAMPLES.keys():
+        try:
+            errs = []
+            filename = os.path.join(EXAMPLES_PATH,
+                                    vtfile)
+            print filename
+            locator = vistrails.core.db.locator.FileLocator(os.path.abspath(filename))
+            (v, abstractions, thumbnails, mashups) = vistrails.core.db.io.load_vistrail(locator)
+            w_list = []
+            for version,tag in v.get_tagMap().iteritems():
+                if tag not in VT_EXAMPLES[vtfile]:
+                    w_list.append((locator,version))
+                    nworkflows += 1
+            if len(w_list) > 0:
+                errs = vistrails.core.console_mode.run(w_list, update_vistrail=False)
+                summary[vtfile] = errs
+        except Exception, e:
+            errs.append((vtfile,"None", "None", str(e)))
+            summary[vtfile] = errs
+        nvtfiles += 1
+
+    print "-" * 79
+    print "Summary of Examples: %s workflows in %s vistrail files" % (
+              nworkflows, nvtfiles)
+    print ""
+    errors = False
+    for vtfile, errs in summary.iteritems():
+        print vtfile
+        if len(errs) > 0:
+            for err in errs:
+                print("   *** Error in %s:%s:%s -- %s" % err)
+            errors = True
+        else:
+            print "  Ok."
+    print "-" * 79
+    if errors:
+        tests_passed = False
+        sub_print("There were errors. See summary for more information")
+    else:
+        sub_print("Examples ran successfully.")
+
+vistrails.gui.application.get_vistrails_application().finishSession()
+vistrails.gui.application.stop_application()
+
+# Test Runners can use the return value to know if the tests passed
+sys.exit(0 if tests_passed else 1)
diff --git a/vistrails/tests/utils.py b/vistrails/tests/utils.py
new file mode 100644
index 0000000..dfbaa55
--- /dev/null
+++ b/vistrails/tests/utils.py
@@ -0,0 +1,212 @@
+import contextlib
+
+from vistrails.core.modules.vistrails_module import Module
+
+
+def execute(modules, connections=[], add_port_specs=[], enable_pkg=True):
+    """Build a pipeline and execute it.
+
+    This is useful to simply build a pipeline in a test case, and run it. When
+    doing that, intercept_result() can be used to check the results of each
+    module.
+
+    modules is a list of module tuples describing the modules to be created,
+    with the following format:
+        [('ModuleName', 'package.identifier', [
+            # Functions
+            ('port_name', [
+                # Function parameters
+                ('Signature', 'value-as-string'),
+            ]),
+        ])]
+
+    connections is a list of tuples describing the connections to make, with
+    the following format:
+        [
+            (source_module_index, 'source_port_name',
+             dest_module_index, 'dest_module_name'),
+         ]
+
+    add_port_specs is a list of specs to add to modules, with the following
+    format:
+        [
+            (mod_id, 'input'/'output', 'portname',
+             '(port_sig)'),
+        ]
+    It is useful to test modules that can have custom ports through a
+    configuration widget.
+
+    The function returns the 'errors' dict it gets from the interpreter, so you
+    should use a construct like self.assertFalse(execute(...)) if the execution
+    is not supposed to fail.
+
+
+    For example, this creates (and runs) an Integer module with its value set
+    to 44, connected to a PythonCalc module, connected to a StandardOutput:
+
+    self.assertFalse(execute([
+            ('Float', 'org.vistrails.vistrails.basic', [
+                ('value', [('Float', '44.0')]),
+            ]),
+            ('PythonCalc', 'org.vistrails.vistrails.pythoncalc', [
+                ('value2', [('Float', '2.0')]),
+                ('op', [('String', '-')]),
+            ]),
+            ('StandardOutput', 'org.vistrails.vistrails.basic', []),
+        ],
+        [
+            (0, 'value', 1, 'value1'),
+            (1, 'value', 2, 'value'),
+        ]))
+    """
+    from vistrails.core.db.locator import XMLFileLocator
+    from vistrails.core.modules.module_registry import MissingPackage
+    from vistrails.core.packagemanager import get_package_manager
+    from vistrails.core.utils import DummyView
+    from vistrails.core.vistrail.connection import Connection
+    from vistrails.core.vistrail.module import Module
+    from vistrails.core.vistrail.module_function import ModuleFunction
+    from vistrails.core.vistrail.module_param import ModuleParam
+    from vistrails.core.vistrail.pipeline import Pipeline
+    from vistrails.core.vistrail.port import Port
+    from vistrails.core.vistrail.port_spec import PortSpec
+    from vistrails.core.interpreter.noncached import Interpreter
+
+    pm = get_package_manager()
+
+    port_spec_per_module = {} # mod_id -> [portspec: PortSpec]
+    j = 0
+    for i, (mod_id, inout, name, sig) in enumerate(add_port_specs):
+        mod_specs = port_spec_per_module.setdefault(mod_id, [])
+        ps = PortSpec(id=i,
+                      name=name,
+                      type=inout,
+                      sigstring=sig,
+                      sort_key=-1)
+        for psi in ps.port_spec_items:
+            psi.id = j
+            j += 1
+        mod_specs.append(ps)
+
+    pipeline = Pipeline()
+    module_list = []
+    for i, (name, identifier, functions) in enumerate(modules):
+        function_list = []
+        try:
+            pkg = pm.get_package(identifier)
+        except MissingPackage:
+            if not enable_pkg:
+                raise
+            pkg = pm.identifier_is_available(identifier)
+            if pkg:
+                pm.late_enable_package(pkg.codepath)
+                pkg = pm.get_package(identifier)
+
+        for func_name, params in functions:
+            param_list = []
+            for param_type, param_val in params:
+                param_list.append(ModuleParam(type=param_type,
+                                              val=param_val))
+            function_list.append(ModuleFunction(name=func_name,
+                                                parameters=param_list))
+        name = name.rsplit('|', 1)
+        if len(name) == 2:
+            namespace, name = name
+        else:
+            namespace = None
+            name, = name
+        module = Module(name=name,
+                        namespace=namespace,
+                        package=identifier,
+                        version=pkg.version,
+                        id=i,
+                        functions=function_list)
+        for port_spec in port_spec_per_module.get(i, []):
+            module.add_port_spec(port_spec)
+        pipeline.add_module(module)
+        module_list.append(module)
+
+    for i, (sid, sport, did, dport) in enumerate(connections):
+        s_sig = module_list[sid].get_port_spec(sport, 'output').sigstring
+        d_sig = module_list[did].get_port_spec(dport, 'input').sigstring
+        pipeline.add_connection(Connection(
+                id=i,
+                ports=[
+                    Port(id=i*2,
+                         type='source',
+                         moduleId=sid,
+                         name=sport,
+                         signature=s_sig),
+                    Port(id=i*2+1,
+                         type='destination',
+                         moduleId=did,
+                         name=dport,
+                         signature=d_sig),
+                ]))
+
+    interpreter = Interpreter.get()
+    result = interpreter.execute(
+            pipeline,
+            locator=XMLFileLocator('foo.xml'),
+            current_version=1,
+            view=DummyView())
+    return result.errors
+
+
+ at contextlib.contextmanager
+def intercept_result(module, output_name):
+    """This temporarily hooks a module to intercept its results.
+
+    It is used as a context manager, for instance:
+    class MyModule(Module):
+        def compute(self):
+            self.setResult('res', 42)
+        ...
+    with intercept_result(MyModule, 'res') as results:
+        self.assertFalse(execute(...))
+    self.assertEqual(results, [42])
+    """
+    actual_setResult = module.setResult
+    old_setResult = module.__dict__.get('setResult', None)
+    results = []
+    modules_index = {}  # Maps a Module to an index in the list, so a module
+            # can change its result
+    def new_setResult(self, name, value):
+        if name == output_name:
+            if self in modules_index:
+                results[modules_index[self]] = value
+            else:
+                modules_index[self] = len(results)
+                results.append(value)
+        actual_setResult(self, name, value)
+    module.setResult = new_setResult
+    try:
+        yield results
+    finally:
+        if old_setResult is not None:
+            module.setResult = old_setResult
+        else:
+            del module.setResult
+
+
+def intercept_results(*args):
+    """This calls intercept_result() several times.
+
+    You can pass it multiple modules and port names and it will nest the
+    managers, for instance:
+    with intercept_results(ModOne, 'one1', 'one2', ModTwo, 'two1', 'two2') as (
+            one1, one2, two1, two2):
+        self.assertFalse(execute(...))
+    """
+    ctx = []
+    current_module = None
+    for arg in args:
+        if isinstance(arg, type) and issubclass(arg, Module):
+            current_module = arg
+        elif isinstance(arg, basestring):
+            if current_module is None:
+                raise ValueError
+            ctx.append(intercept_result(current_module, arg))
+        else:
+            raise TypeError
+    return contextlib.nested(*ctx)
diff --git a/vistrails/vistrails_server.py b/vistrails/vistrails_server.py
new file mode 100644
index 0000000..b285641
--- /dev/null
+++ b/vistrails/vistrails_server.py
@@ -0,0 +1,77 @@
+###############################################################################
+##
+## Copyright (C) 2011-2014, NYU-Poly.
+## Copyright (C) 2006-2011, University of Utah. 
+## All rights reserved.
+## Contact: contact at vistrails.org
+##
+## This file is part of VisTrails.
+##
+## "Redistribution and use in source and binary forms, with or without 
+## modification, are permitted provided that the following conditions are met:
+##
+##  - Redistributions of source code must retain the above copyright notice, 
+##    this list of conditions and the following disclaimer.
+##  - Redistributions in binary form must reproduce the above copyright 
+##    notice, this list of conditions and the following disclaimer in the 
+##    documentation and/or other materials provided with the distribution.
+##  - Neither the name of the University of Utah 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 COPYRIGHT HOLDER 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."
+##
+###############################################################################
+"""Main file for running VisTrails in server mode"""
+import os
+import sys
+if __name__ == '__main__':
+    # Fix import path: add parent directory(so that we can
+    # import vistrails.[gui|...] and remove other paths below it (we might have
+    # been started from a subdir)
+
+    # DAK: the deletes screw things up in the binary (definitely for
+    #   Mac) and since subdir is unlikely, I'm commenting them out. A
+    #   better solution is probably to move run.py up a
+    #   directory in the repo
+    vistrails_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
+    # i = 0
+    # print "vistrails_dir:", vistrails_dir
+    # while i < len(sys.path):
+    #     rpath = os.path.realpath(sys.path[i])
+    #     if rpath.startswith(vistrails_dir):
+    #         print " deleting", rpath, sys.path[i]
+    #         del sys.path[i]
+    #     else:
+    #         i += 1
+    sys.path.insert(0, vistrails_dir)
+
+    import vistrails.gui.requirements
+    vistrails.gui.requirements.require_pyqt4_api2()
+
+    import vistrails.gui.application_server
+    try:
+        v = vistrails.gui.application_server.start_server()
+        app = vistrails.gui.application_server.VistrailsServer()
+    except SystemExit, e:
+        print str(e)
+        sys.exit(e)
+    except Exception, e:
+        print "Uncaught exception on initialization: %s" % e
+        import traceback
+        traceback.print_exc()
+        sys.exit(255)
+     
+    v = app.run_server()
+    vistrails.gui.application_server.stop_server()
+    sys.exit(v)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/vistrails.git



More information about the debian-science-commits mailing list